ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTAxLmMgYi9kcml2ZXJzL25ldC8zYzUwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZDUxY2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC8zYzUwMS5jCkBAIC0wLDAgKzEsOTQwIEBACisvKiAzYzUwMS5jOiBBIDNDb20gM2M1MDEgRXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4gKi8KKy8qCisgICAgV3JpdHRlbiAxOTkyLDE5OTMsMTk5NCAgRG9uYWxkIEJlY2tlcgorCisgICAgQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICAgIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZAorICAgIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisgICAgVGhpcyBpcyBhIGRldmljZSBkcml2ZXIgZm9yIHRoZSAzQ29tIEV0aGVybGluayAzYzUwMS4KKyAgICBEbyBub3QgcHVyY2hhc2UgdGhpcyBjYXJkLCBldmVuIGFzIGEgam9rZS4gIEl0J3MgcGVyZm9ybWFuY2UgaXMgaG9ycmlibGUsCisgICAgYW5kIGl0IGJyZWFrcyBpbiBtYW55IHdheXMuCisKKyAgICBUaGUgb3JpZ2luYWwgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKyAgICBGaXhlZCAoYWdhaW4hKSB0aGUgbWlzc2luZyBpbnRlcnJ1cHQgbG9ja2luZyBvbiBUWC9SWCBzaGlmdGluZy4KKyAgICAJCUFsYW4gQ294IDxBbGFuLkNveEBsaW51eC5vcmc+CisKKyAgICBSZW1vdmVkIGNhbGxzIHRvIGluaXRfZXRoZXJkZXYgc2luY2UgdGhleSBhcmUgbm8gbG9uZ2VyIG5lZWRlZCwgYW5kCisgICAgY2xlYW5lZCB1cCBtb2R1bGFyaXphdGlvbiBqdXN0IGEgYml0LiBUaGUgZHJpdmVyIHN0aWxsIGFsbG93cyBvbmx5CisgICAgdGhlIGRlZmF1bHQgYWRkcmVzcyBmb3IgY2FyZHMgd2hlbiBsb2FkZWQgYXMgYSBtb2R1bGUsIGJ1dCB0aGF0J3MKKyAgICByZWFsbHkgbGVzcyBicmFpbmRlYWQgdGhhbiBhbnlvbmUgdXNpbmcgYSAzYzUwMSBib2FyZC4gOikKKwkJICAgIDE5OTUwMjA4IChpbnZpZEBtc2VuLmNvbSkKKworICAgIEFkZGVkIHRyYXBzIGZvciBpbnRlcnJ1cHRzIGhpdHRpbmcgdGhlIHdpbmRvdyBhcyB3ZSBjbGVhciBhbmQgVFggbG9hZAorICAgIHRoZSBib2FyZC4gTm93IGdldHRpbmcgMTUwSy9zZWNvbmQgRlRQIHdpdGggYSAzYzUwMSBjYXJkLiBTdGlsbCBwbGF5aW5nCisgICAgd2l0aCBhIFRYLVRYIG9wdGltaXNhdGlvbiB0byBzZWUgaWYgd2UgY2FuIHRvdWNoIDE4MC0yMDBLL3NlY29uZCBhcyBzZWVtcworICAgIHRoZW9yZXRpY2FsbHkgbWF4aW11bS4KKyAgICAJCTE5OTUwNDAyIEFsYW4gQ294IDxBbGFuLkNveEBsaW51eC5vcmc+CisgICAgCQkKKyAgICBDbGVhbmVkIHVwIGZvciAyLjMueCBiZWNhdXNlIHdlIGJyb2tlIFNNUCBub3cuIAorICAgIAkJMjAwMDAyMDggQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKworICAgIENoZWNrIHVwIHBhc3MgZm9yIDIuNS4gTm90aGluZyBzaWduaWZpY2FudCBjaGFuZ2VkCisgICAgCQkyMDAyMTAwOSBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorCisgICAgRml4ZWQgemVybyBmaWxsIGNvcm5lciBjYXNlIAorICAgIAkJMjAwMzAxMDQgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAgICAJCQorICAgIAkJCisgICBGb3IgdGhlIGF2b2lkYW5jZSBvZiBkb3VidCB0aGUgInByZWZlcnJlZCBmb3JtIiBvZiB0aGlzIGNvZGUgaXMgb25lIHdoaWNoCisgICBpcyBpbiBhbiBvcGVuIG5vbiBwYXRlbnQgZW5jdW1iZXJlZCBmb3JtYXQuIFdoZXJlIGNyeXB0b2dyYXBoaWMga2V5IHNpZ25pbmcKKyAgIGZvcm1zIHBhcnQgb2YgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gZXhlY3V0YWJsZSB0aGUgaW5mb3JtYXRpb24KKyAgIGluY2x1ZGluZyBrZXlzIG5lZWRlZCB0byBnZW5lcmF0ZSBhbiBlcXVpdmFsZW50bHkgZnVuY3Rpb25hbCBleGVjdXRhYmxlCisgICBhcmUgZGVlbWVkIHRvIGJlIHBhcnQgb2YgdGhlIHNvdXJjZSBjb2RlLgorCisqLworCisKKy8qKgorICogRE9DOiAzYzUwMSBDYXJkIE5vdGVzCisgKgorICogIFNvbWUgbm90ZXMgb24gdGhpcyB0aGluZyBpZiB5b3UgaGF2ZSB0byBoYWNrIGl0LiAgW0FsYW5dCisgKgorICogIFNvbWUgZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgZnJvbSAzQ29tLiBEdWUgdG8gdGhlIGJvYXJkcyBhZ2UKKyAqICBzdGFuZGFyZCByZXNwb25zZXMgd2hlbiB5b3UgYXNrIGZvciB0aGlzIHdpbGwgcmFuZ2UgZnJvbSAnYmUgc2VyaW91cycKKyAqICB0byAnZ2l2ZSBpdCB0byBhIG11c2V1bScuIFRoZSBkb2N1bWVudGF0aW9uIGlzIGluY29tcGxldGUgYW5kIG1vc3RseQorICogIG9mIGhpc3RvcmljYWwgaW50ZXJlc3QgYW55d2F5LiAKKyAqCisgKiAgVGhlIGJhc2ljIHN5c3RlbSBpcyBhIHNpbmdsZSBidWZmZXIgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVjZWl2ZSBvcgorICogIHRyYW5zbWl0IGEgcGFja2V0LiBBIHRoaXJkIGNvbW1hbmQgbW9kZSBleGlzdHMgd2hlbiB5b3UgYXJlIHNldHRpbmcKKyAqICB0aGluZ3MgdXAuCisgKgorICogIElmIGl0J3MgdHJhbnNtaXR0aW5nIGl0J3Mgbm90IHJlY2VpdmluZyBhbmQgdmljZSB2ZXJzYS4gSW4gZmFjdCB0aGUKKyAqICB0aW1lIHRvIGdldCB0aGUgYm9hcmQgYmFjayBpbnRvIHVzZWZ1bCBzdGF0ZSBhZnRlciBhbiBvcGVyYXRpb24gaXMKKyAqICBxdWl0ZSBsYXJnZS4KKyAqCisgKiAgVGhlIGRyaXZlciB3b3JrcyBieSBrZWVwaW5nIHRoZSBib2FyZCBpbiByZWNlaXZlIG1vZGUgd2FpdGluZyBmb3IgYQorICogIHBhY2tldCB0byBhcnJpdmUuIFdoZW4gb25lIGFycml2ZXMgaXQgaXMgY29waWVkIG91dCBvZiB0aGUgYnVmZmVyCisgKiAgYW5kIGRlbGl2ZXJlZCB0byB0aGUga2VybmVsLiBUaGUgY2FyZCBpcyByZWxvYWRlZCBhbmQgb2ZmIHdlIGdvLgorICoKKyAqICBXaGVuIHRyYW5zbWl0dGluZyBscC0+dHhpbmcgaXMgc2V0IGFuZCB0aGUgY2FyZCBpcyByZXNldCAoZnJvbQorICogIHJlY2VpdmUgbW9kZSkgW3Bvc3NpYmx5IGxvc2luZyBhIHBhY2tldCBqdXN0IHJlY2VpdmVkXSB0byBjb21tYW5kCisgKiAgbW9kZS4gQSBwYWNrZXQgaXMgbG9hZGVkIGFuZCB0cmFuc21pdCBtb2RlIHRyaWdnZXJlZC4gVGhlIGludGVycnVwdAorICogIGhhbmRsZXIgcnVucyBkaWZmZXJlbnQgY29kZSBmb3IgdHJhbnNtaXQgaW50ZXJydXB0cyBhbmQgY2FuIGhhbmRsZQorICogIHJldHVybmluZyB0byByZWNlaXZlIG1vZGUgb3IgcmV0cmFuc21pc3Npb25zICh5ZXMgeW91IGhhdmUgdG8gaGVscAorICogIG91dCB3aXRoIHRob3NlIHRvbykuCisgKgorICogRE9DOiBQcm9ibGVtcworICogIAorICogIFRoZXJlIGFyZSBhIHdpZGUgdmFyaWV0eSBvZiB1bmRvY3VtZW50ZWQgZXJyb3IgcmV0dXJucyBmcm9tIHRoZSBjYXJkCisgKiAgYW5kIHlvdSBiYXNpY2FsbHkgaGF2ZSB0byBraWNrIHRoZSBib2FyZCBhbmQgcHJheSBpZiB0aGV5IHR1cm4gdXAuIE1vc3QKKyAqICBvbmx5IG9jY3VyIHVuZGVyIGV4dHJlbWUgbG9hZCBvciBpZiB5b3UgZG8gc29tZXRoaW5nIHRoZSBib2FyZCBkb2Vzbid0CisgKiAgbGlrZSAoZWcgdG91Y2hpbmcgYSByZWdpc3RlciBhdCB0aGUgd3JvbmcgdGltZSkuCisgKgorICogIFRoZSBkcml2ZXIgaXMgbGVzcyBlZmZpY2llbnQgdGhhbiBpdCBjb3VsZCBiZS4gSXQgc3dpdGNoZXMgdGhyb3VnaAorICogIHJlY2VpdmUgbW9kZSBldmVuIGlmIG1vcmUgdHJhbnNtaXRzIGFyZSBxdWV1ZWQuIElmIHRoaXMgd29ycmllcyB5b3UgYnV5CisgKiAgYSByZWFsIEV0aGVybmV0IGNhcmQuCisgKgorICogIFRoZSBjb21iaW5hdGlvbiBvZiBzbG93IHJlY2VpdmUgcmVzdGFydCBhbmQgbm8gcmVhbCBtdWx0aWNhc3QKKyAqICBmaWx0ZXIgbWFrZXMgdGhlIGJvYXJkIHVudXNhYmxlIHdpdGggYSBrZXJuZWwgY29tcGlsZWQgZm9yIElQCisgKiAgbXVsdGljYXN0aW5nIGluIGEgcmVhbCBtdWx0aWNhc3QgZW52aXJvbm1lbnQuIFRoYXQncyBkb3duIHRvIHRoZSBib2FyZCwKKyAqICBidXQgZXZlbiB3aXRoIG5vIG11bHRpY2FzdCBwcm9ncmFtcyBydW5uaW5nIGEgbXVsdGljYXN0IElQIGtlcm5lbCBpcworICogIGluIGdyb3VwIDIyNC4wLjAuMSBhbmQgeW91IHdpbGwgdGhlcmVmb3JlIGJlIGxpc3RlbmluZyB0byBhbGwgbXVsdGljYXN0cy4KKyAqICBPbmUgbnYgY29uZmVyZW5jZSBydW5uaW5nIG92ZXIgdGhhdCBFdGhlcm5ldCBhbmQgeW91IGNhbiBnaXZlIHVwLgorICoKKyAqLworCisjZGVmaW5lIERSVl9OQU1FCSIzYzUwMSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjIwMDIvMTAvMDkiCisKKworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0KKwlEUlZfTkFNRSAiLmM6ICIgRFJWX1ZFUlNJT04gIiBBbGFuIENveCAoYWxhbkByZWRoYXQuY29tKS5cbiI7CisKKy8qCisgKglCcmFpbmRhbWFnZSByZW1haW5pbmc6CisgKglUaGUgM2M1MDEgYm9hcmQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4JLyogZm9yIENPTkZJR19JUF9NVUxUSUNBU1QgKi8KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSAiM2M1MDEuaCIKKworLyoKKyAqCVRoZSBib2lsZXJwbGF0ZSBwcm9iZSBjb2RlLgorICovCisKK3N0YXRpYyBpbnQgaW89MHgyODA7CitzdGF0aWMgaW50IGlycT01Oworc3RhdGljIGludCBtZW1fc3RhcnQ7CisKKy8qKgorICogZWwxX3Byb2JlOgkJLQlwcm9iZSBmb3IgYSAzYzUwMQorICogQGRldjogVGhlIGRldmljZSBzdHJ1Y3R1cmUgcGFzc2VkIGluIHRvIHByb2JlLiAKKyAqCisgKiBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbSB0d28gcGxhY2VzLiBUaGUgbmV0d29yayBsYXllciB3aWxsIHByb2JlIHVzaW5nCisgKiBhIGRldmljZSBzdHJ1Y3R1cmUgcGFzc2VkIGluIHdpdGggdGhlIHByb2JlIGluZm9ybWF0aW9uIGNvbXBsZXRlZC4gRm9yIGEKKyAqIG1vZHVsYXIgZHJpdmVyIHdlIHVzZSAjaW5pdF9tb2R1bGUgdG8gZmlsbCBpbiBvdXIgb3duIHN0cnVjdHVyZSBhbmQgcHJvYmUKKyAqIGZvciBpdC4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gRU5YSU8gaWYgYXNrZWQgbm90IHRvIHByb2JlIGFuZCBFTk9ERVYgaWYgYXNrZWQgdG8KKyAqIHByb2JlIGFuZCBmYWlsaW5nIHRvIGZpbmQgYW55dGhpbmcuCisgKi8KKyAKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGVsMV9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwlzdGF0aWMgdW5zaWduZWQgcG9ydHNbXSA9IHsgMHgyODAsIDB4MzAwLCAwfTsKKwl1bnNpZ25lZCAqcG9ydDsKKwlpbnQgZXJyID0gMDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCQlpbyA9IGRldi0+YmFzZV9hZGRyOworCQlpcnEgPSBkZXYtPmlycTsKKwkJbWVtX3N0YXJ0ID0gZGV2LT5tZW1fc3RhcnQgJiA3OworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWlmIChpbyA+IDB4MWZmKSB7CS8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KKwkJZXJyID0gZWwxX3Byb2JlMShkZXYsIGlvKTsKKwl9IGVsc2UgaWYgKGlvICE9IDApIHsKKwkJZXJyID0gLUVOWElPOwkJLyogRG9uJ3QgcHJvYmUgYXQgYWxsLiAqLworCX0gZWxzZSB7CisJCWZvciAocG9ydCA9IHBvcnRzOyAqcG9ydCAmJiBlbDFfcHJvYmUxKGRldiwgKnBvcnQpOyBwb3J0KyspCisJCQk7CisJCWlmICghKnBvcnQpCisJCQllcnIgPSAtRU5PREVWOworCX0KKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVMMV9JT19FWFRFTlQpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyoqCisgKgllbDFfcHJvYmUxOiAKKyAqCUBkZXY6IFRoZSBkZXZpY2Ugc3RydWN0dXJlIHRvIHVzZQorICoJQGlvYWRkcjogQW4gSS9PIGFkZHJlc3MgdG8gcHJvYmUgYXQuCisgKgorICoJVGhlIGFjdHVhbCBwcm9iZS4gVGhpcyBpcyBpdGVyYXRlZCBvdmVyIGJ5ICNlbDFfcHJvYmUgaW4gb3JkZXIgdG8KKyAqCWNoZWNrIGFsbCB0aGUgYXBwbGljYWJsZSBkZXZpY2UgbG9jYXRpb25zLgorICoKKyAqCVJldHVybnMgMCBmb3IgYSBzdWNjZXNzLCBpbiB3aGljaCBjYXNlIHRoZSBkZXZpY2UgaXMgYWN0aXZhdGVkLAorICoJRUFHQUlOIGlmIHRoZSBJUlEgaXMgaW4gdXNlIGJ5IGFub3RoZXIgZHJpdmVyLCBhbmQgRU5PREVWIGlmIHRoZQorICoJYm9hcmQgY2Fubm90IGJlIGZvdW5kLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGVsMV9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscDsKKwljb25zdCBjaGFyICptbmFtZTsJCS8qIFZlbmRvciBuYW1lICovCisJdW5zaWduZWQgY2hhciBzdGF0aW9uX2FkZHJbNl07CisJaW50IGF1dG9pcnEgPSAwOworCWludCBpOworCisJLyoKKwkgKglSZXNlcnZlIEkvTyByZXNvdXJjZSBmb3IgZXhjbHVzaXZlIHVzZSBieSB0aGlzIGRyaXZlcgorCSAqLworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIEVMMV9JT19FWFRFTlQsIERSVl9OQU1FKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCSAqCVJlYWQgdGhlIHN0YXRpb24gYWRkcmVzcyBQUk9NIGRhdGEgZnJvbSB0aGUgc3BlY2lhbCBwb3J0LgorCSAqLworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwl7CisJCW91dHcoaSwgaW9hZGRyICsgRUwxX0RBVEFQVFIpOworCQlzdGF0aW9uX2FkZHJbaV0gPSBpbmIoaW9hZGRyICsgRUwxX1NBUFJPTSk7CisJfQorCS8qCisJICoJQ2hlY2sgdGhlIGZpcnN0IHRocmVlIG9jdGV0cyBvZiB0aGUgUy5BLiBmb3IgM0NvbSdzIHByZWZpeCwgb3IKKwkgKglmb3IgdGhlIFNhZ2VyIE5QOTQzIHByZWZpeC4KKwkgKi8KKworCWlmIChzdGF0aW9uX2FkZHJbMF0gPT0gMHgwMiAgJiYgIHN0YXRpb25fYWRkclsxXSA9PSAweDYwCisJCSYmIHN0YXRpb25fYWRkclsyXSA9PSAweDhjKQorCXsKKwkJbW5hbWUgPSAiM2M1MDEiOworCX0gZWxzZSBpZiAoc3RhdGlvbl9hZGRyWzBdID09IDB4MDAgICYmICBzdGF0aW9uX2FkZHJbMV0gPT0gMHg4MAorCSYmIHN0YXRpb25fYWRkclsyXSA9PSAweEM4KQorCXsKKwkJbW5hbWUgPSAiTlA5NDMiOworICAgIAl9CisgICAgCWVsc2UgeworCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEVMMV9JT19FWFRFTlQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKgorCSAqCVdlIGF1dG8tSVJRIGJ5IHNodXR0aW5nIG9mZiB0aGUgaW50ZXJydXB0IGxpbmUgYW5kIGxldHRpbmcgaXQgZmxvYXQKKwkgKgloaWdoLgorCSAqLworCisJZGV2LT5pcnEgPSBpcnE7CisKKwlpZiAoZGV2LT5pcnEgPCAyKQorCXsKKwkJdW5zaWduZWQgbG9uZyBpcnFfbWFzazsKKworCQlpcnFfbWFzayA9IHByb2JlX2lycV9vbigpOworCQlpbmIoUlhfU1RBVFVTKTsJCS8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KKwkJaW5iKFRYX1NUQVRVUyk7CisJCW91dGIoQVhfTE9PUCArIDEsIEFYX0NNRCk7CisKKwkJb3V0YigweDAwLCBBWF9DTUQpOworCisJCW1kZWxheSgyMCk7CisJCWF1dG9pcnEgPSBwcm9iZV9pcnFfb2ZmKGlycV9tYXNrKTsKKworCQlpZiAoYXV0b2lycSA9PSAwKQorCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyBwcm9iZSBhdCAlI3ggZmFpbGVkIHRvIGRldGVjdCBJUlEgbGluZS5cbiIsCisJCQkJbW5hbWUsIGlvYWRkcik7CisJCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEVMMV9JT19FWFRFTlQpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9CisKKwlvdXRiKEFYX1JFU0VUK0FYX0xPT1AsIEFYX0NNRCk7CQkJLyogTG9vcGJhY2sgbW9kZS4gKi8KKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgc3RhdGlvbl9hZGRyLCBFVEhfQUxFTik7CisKKwlpZiAobWVtX3N0YXJ0ICYgMHhmKQorCQllbF9kZWJ1ZyA9IG1lbV9zdGFydCAmIDB4NzsKKwlpZiAoYXV0b2lycSkKKwkJZGV2LT5pcnEgPSBhdXRvaXJxOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIEV0aGVyTGluayBhdCAlI2x4LCB1c2luZyAlc0lSUSAlZC5cbiIsIGRldi0+bmFtZSwgbW5hbWUsIGRldi0+YmFzZV9hZGRyLAorCQkJYXV0b2lycSA/ICJhdXRvIjoiYXNzaWduZWQgIiwgZGV2LT5pcnEpOworCisjaWZkZWYgQ09ORklHX0lQX01VTFRJQ0FTVAorCXByaW50ayhLRVJOX1dBUk5JTkcgIldBUk5JTkc6IFVzZSBvZiB0aGUgM2M1MDEgaW4gYSBtdWx0aWNhc3Qga2VybmVsIGlzIE5PVCByZWNvbW1lbmRlZC5cbiIpOworI2VuZGlmCisKKwlpZiAoZWxfZGVidWcpCisJCXByaW50ayhLRVJOX0RFQlVHICIlcyIsIHZlcnNpb24pOworCisJbWVtc2V0KGRldi0+cHJpdiwgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKwkKKwkvKgorCSAqCVRoZSBFTDEtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KKwkgKi8KKworCWRldi0+b3BlbiA9ICZlbF9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmVsX3N0YXJ0X3htaXQ7CisJZGV2LT50eF90aW1lb3V0ID0gJmVsX3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IEhaOworCWRldi0+c3RvcCA9ICZlbDFfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSAmZWwxX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT5ldGh0b29sX29wcyA9ICZuZXRkZXZfZXRodG9vbF9vcHM7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJZWwxX29wZW46CisgKglAZGV2OiBkZXZpY2UgdGhhdCBpcyBiZWluZyBvcGVuZWQKKyAqCisgKglXaGVuIGFuIGlmY29uZmlnIGlzIGlzc3VlZCB3aGljaCBjaGFuZ2VzIHRoZSBkZXZpY2UgZmxhZ3MgdG8gaW5jbHVkZQorICoJSUZGX1VQIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiBJdCBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZSBjaGFuZ2UgCisgKglvY2N1cnMsIG5vdCB3aGVuIHRoZSBpbnRlcmZhY2UgcmVtYWlucyB1cC4gI2VsMV9jbG9zZSB3aWxsIGJlIGNhbGxlZAorICoJd2hlbiBpdCBnb2VzIGRvd24uCisgKgorICoJUmV0dXJucyAwIGZvciBhIHN1Y2Nlc3NmdWwgb3Blbiwgb3IgLUVBR0FJTiBpZiBzb21lb25lIGhhcyBydW4gb2ZmCisgKgl3aXRoIG91ciBpbnRlcnJ1cHQgbGluZS4KKyAqLworCitzdGF0aWMgaW50IGVsX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0dmFsOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChlbF9kZWJ1ZyA+IDIpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRG9pbmcgZWxfb3BlbigpLi4uIiwgZGV2LT5uYW1lKTsKKworCWlmICgocmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZlbF9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSkpCisJCXJldHVybiByZXR2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwllbF9yZXNldChkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlscC0+dHhpbmcgPSAwOwkJLyogQm9hcmQgaW4gUlggbW9kZSAqLworCW91dGIoQVhfUlgsIEFYX0NNRCk7CS8qIEF1eCBjb250cm9sLCBpcnEgYW5kIHJlY2VpdmUgZW5hYmxlZCAqLworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZWxfdGltZW91dDoKKyAqIEBkZXY6IFRoZSAzYzUwMSBjYXJkIHRoYXQgaGFzIHRpbWVkIG91dAorICoKKyAqIEF0dGVtcHQgdG8gcmVzdGFydCB0aGUgYm9hcmQuIFRoaXMgaXMgYmFzaWNhbGx5IGEgbWl4dHVyZSBvZiBleHRyZW1lCisgKiB2aW9sZW5jZSBhbmQgcHJheWVyCisgKgorICovCisgCitzdGF0aWMgdm9pZCBlbF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAKKwlpZiAoZWxfZGVidWcpCisJCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgdHhzciAlIzJ4IGF4c3I9JTAyeCByeHNyPSUwMnguXG4iLAorCQkJZGV2LT5uYW1lLCBpbmIoVFhfU1RBVFVTKSwgaW5iKEFYX1NUQVRVUyksIGluYihSWF9TVEFUVVMpKTsKKwlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJb3V0YihUWF9OT1JNLCBUWF9DTUQpOworCW91dGIoUlhfTk9STSwgUlhfQ01EKTsKKwlvdXRiKEFYX09GRiwgQVhfQ01EKTsJLyogSnVzdCB0cmlnZ2VyIGEgZmFsc2UgaW50ZXJydXB0LiAqLworCW91dGIoQVhfUlgsIEFYX0NNRCk7CS8qIEF1eCBjb250cm9sLCBpcnEgYW5kIHJlY2VpdmUgZW5hYmxlZCAqLworCWxwLT50eGluZyA9IDA7CQkvKiBSaXBwZWQgYmFjayBpbiB0byBSWCAqLworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworIAorLyoqCisgKiBlbF9zdGFydF94bWl0OgorICogQHNrYjogVGhlIHBhY2tldCB0aGF0IGlzIHF1ZXVlZCB0byBiZSBzZW50CisgKiBAZGV2OiBUaGUgM2M1MDEgY2FyZCB3ZSB3YW50IHRvIHRocm93IGl0IGRvd24KKyAqCisgKiBBdHRlbXB0IHRvIHNlbmQgYSBwYWNrZXQgdG8gYSAzYzUwMSBjYXJkLiBUaGVyZSBhcmUgc29tZSBpbnRlcmVzdGluZworICogY2F0Y2hlcyBoZXJlIGJlY2F1c2UgdGhlIDNjNTAxIGlzIGFuIGV4dHJlbWVseSBvbGQgYW5kIHRoZXJlZm9yZQorICogc3R1cGlkIHBpZWNlIG9mIHRlY2hub2xvZ3kuCisgKgorICogSWYgd2UgYXJlIGhhbmRsaW5nIGFuIGludGVycnVwdCBvbiB0aGUgb3RoZXIgQ1BVIHdlIGNhbm5vdCBsb2FkIGEgcGFja2V0CisgKiBhcyB3ZSBtYXkgc3RpbGwgYmUgYXR0ZW1wdGluZyB0byByZXRyaWV2ZSB0aGUgbGFzdCBSWCBwYWNrZXQgYnVmZmVyLgorICoKKyAqIFdoZW4gYSB0cmFuc21pdCB0aW1lcyBvdXQgd2UgZHVtcCB0aGUgY2FyZCBpbnRvIGNvbnRyb2wgbW9kZSBhbmQganVzdAorICogc3RhcnQgYWdhaW4uIEl0IGhhcHBlbnMgZW5vdWdoIHRoYXQgaXQgaXNudCB3b3J0aCBsb2dnaW5nLgorICoKKyAqIFdlIGF2b2lkIGhvbGRpbmcgdGhlIHNwaW4gbG9ja3Mgd2hlbiBkb2luZyB0aGUgcGFja2V0IGxvYWQgdG8gdGhlIGJvYXJkLgorICogVGhlIGRldmljZSBpcyB2ZXJ5IHNsb3csIGFuZCBpdHMgRE1BIG1vZGUgaXMgZXZlbiBzbG93ZXIuIElmIHdlIGhlbGQgdGhlCisgKiBsb2NrIHdoaWxlIGxvYWRpbmcgMTUwMCBieXRlcyBvbnRvIHRoZSBjb250cm9sbGVyIHdlIHdvdWxkIGRyb3AgYSBsb3Qgb2YKKyAqIHNlcmlhbCBwb3J0IGNoYXJhY3RlcnMuIFRoaXMgcmVxdWlyZXMgd2UgZG8gZXh0cmEgbG9ja2luZywgYnV0IHdlIGhhdmUKKyAqIG5vIHJlYWwgY2hvaWNlLgorICovCisKK3N0YXRpYyBpbnQgZWxfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICoJQXZvaWQgaW5jb21pbmcgaW50ZXJydXB0cyBiZXR3ZWVuIHVzIGZsaXBwaW5nIHR4aW5nIGFuZCBmbGlwcGluZworCSAqCW1vZGUgYXMgdGhlIGRyaXZlciBhc3N1bWVzIHR4aW5nIGlzIGEgZmFpdGhmdWwgaW5kaWNhdG9yIG9mIGNhcmQKKwkgKglzdGF0ZQorCSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJCisJLyoKKwkgKglBdm9pZCB0aW1lci1iYXNlZCByZXRyYW5zbWlzc2lvbiBjb25mbGljdHMuCisJICovCisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlkbworCXsKKwkJaW50IGxlbiA9IHNrYi0+bGVuOworCQlpbnQgcGFkID0gMDsKKwkJaW50IGdwX3N0YXJ0OworCQl1bnNpZ25lZCBjaGFyICpidWYgPSBza2ItPmRhdGE7CisJCQorCQlpZiAobGVuIDwgRVRIX1pMRU4pCisJCQlwYWQgPSBFVEhfWkxFTiAtIGxlbjsKKwkJCQorCQlncF9zdGFydCA9IDB4ODAwIC0gKCBsZW4gKyBwYWQgKTsKKworCQlscC0+dHhfcGt0X3N0YXJ0ID0gZ3Bfc3RhcnQ7CisgICAgCQlscC0+Y29sbGlzaW9ucyA9IDA7CisKKyAgICAJCWxwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCQkvKgorCQkgKglDb21tYW5kIG1vZGUgd2l0aCBzdGF0dXMgY2xlYXJlZCBzaG91bGQgW2luIHRoZW9yeV0KKwkJICoJbWVhbiBubyBtb3JlIGludGVycnVwdHMgY2FuIGJlIHBlbmRpbmcgb24gdGhlIGNhcmQuCisJCSAqLworCisJCW91dGJfcChBWF9TWVMsIEFYX0NNRCk7CisJCWluYl9wKFJYX1NUQVRVUyk7CisJCWluYl9wKFRYX1NUQVRVUyk7CisKKwkJbHAtPmxvYWRpbmcgPSAxOworCQlscC0+dHhpbmcgPSAxOworCisJCS8qCisJCSAqCVR1cm4gaW50ZXJydXB0cyBiYWNrIG9uIHdoaWxlIHdlIHNwZW5kIGEgcGxlYXNhbnQgYWZ0ZXJub29uCisJCSAqCWxvYWRpbmcgYnl0ZXMgaW50byB0aGUgYm9hcmQKKwkJICovCisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwkJCisJCW91dHcoMHgwMCwgUlhfQlVGX0NMUik7CQkvKiBTZXQgcnggcGFja2V0IGFyZWEgdG8gMC4gKi8KKwkJb3V0dyhncF9zdGFydCwgR1BfTE9XKTsJCS8qIGFpbSAtIHBhY2tldCB3aWxsIGJlIGxvYWRlZCBpbnRvIGJ1ZmZlciBzdGFydCAqLworCQlvdXRzYihEQVRBUE9SVCxidWYsbGVuKTsJLyogbG9hZCBidWZmZXIgKHVzdWFsIHRoaW5nIGVhY2ggYnl0ZSBpbmNyZW1lbnRzIHRoZSBwb2ludGVyKSAqLworCQlpZiAocGFkKSB7CisJCQl3aGlsZShwYWQtLSkJCS8qIFplcm8gZmlsbCBidWZmZXIgdGFpbCAqLworCQkJCW91dGIoMCwgREFUQVBPUlQpOworCQl9CisJCW91dHcoZ3Bfc3RhcnQsIEdQX0xPVyk7CQkvKiB0aGUgYm9hcmQgcmV1c2VzIHRoZSBzYW1lIHJlZ2lzdGVyICovCisJCisJCWlmKGxwLT5sb2FkaW5nICE9IDIpCisJCXsKKwkJCW91dGIoQVhfWE1JVCwgQVhfQ01EKTsJCS8qIGZpcmUgLi4uIFRyaWdnZXIgeG1pdC4gICovCisJCQlscC0+bG9hZGluZz0wOworCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQlpZiAoZWxfZGVidWcgPiAyKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIgcXVldWVkIHhtaXQuXG4iKTsKKwkJCWRldl9rZnJlZV9za2IgKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBBIHJlY2VpdmUgdXBzZXQgb3VyIGxvYWQsIGRlc3BpdGUgb3VyIGJlc3QgZWZmb3J0cyAqLworCQlpZihlbF9kZWJ1Zz4yKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBidXJwZWQgZHVyaW5nIHR4IGxvYWQuXG4iLCBkZXYtPm5hbWUpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwl9CisJd2hpbGUoMSk7CisKK30KKworLyoqCisgKiBlbF9pbnRlcnJ1cHQ6CisgKiBAaXJxOiBJbnRlcnJ1cHQgbnVtYmVyCisgKiBAZGV2X2lkOiBUaGUgM2M1MDEgdGhhdCBidXJwZWQKKyAqIEByZWdzOiBSZWdpc3RlciBkYXRhIChzdXJwbHVzIHRvIG91ciByZXF1aXJlbWVudHMpCisgKgorICogSGFuZGxlIHRoZSBldGhlciBpbnRlcmZhY2UgaW50ZXJydXB0cy4gVGhlIDNjNTAxIG5lZWRzIGEgbG90IG1vcmUgCisgKiBoYW5kIGhvbGRpbmcgdGhhbiBtb3N0IGNhcmRzLiBJbiBwYXJ0aWN1bGFyIHdlIGdldCBhIHRyYW5zbWl0IGludGVycnVwdAorICogd2l0aCBhIGNvbGxpc2lvbiBlcnJvciBiZWNhdXNlIHRoZSBib2FyZCBmaXJtd2FyZSBpc250IGNhcGFibGUgb2YgcmV3aW5kaW5nCisgKiBpdHMgb3duIHRyYW5zbWl0IGJ1ZmZlciBwb2ludGVycy4gSXQgY2FuIGhvd2V2ZXIgY291bnQgdG8gMTYgZm9yIHVzLgorICoKKyAqIE9uIHRoZSByZWNlaXZlIHNpZGUgdGhlIGNhcmQgaXMgYWxzbyB2ZXJ5IGR1bWIuIEl0IGhhcyBubyBidWZmZXJpbmcgdG8KKyAqIHNwZWFrIG9mLiBXZSBzaW1wbHkgcHVsbCB0aGUgcGFja2V0IG91dCBvZiBpdHMgUElPIGJ1ZmZlciAod2hpY2ggaXMgc2xvdykKKyAqIGFuZCBxdWV1ZSBpdCBmb3IgdGhlIGtlcm5lbC4gVGhlbiB3ZSByZXNldCB0aGUgY2FyZCBmb3IgdGhlIG5leHQgcGFja2V0LgorICoKKyAqIFdlIHNvbWV0aW1lcyBnZXQgc3VwcmlzZSBpbnRlcnJ1cHRzIGxhdGUgYm90aCBiZWNhdXNlIHRoZSBTTVAgSVJRIGRlbGl2ZXJ5CisgKiBpcyBtZXNzYWdlIHBhc3NpbmcgYW5kIGJlY2F1c2UgdGhlIGNhcmQgc29tZXRpbWVzIHNlZW1zIHRvIGRlbGl2ZXIgbGF0ZS4gSQorICogdGhpbmsgaWYgaXQgaXMgcGFydCB3YXkgdGhyb3VnaCBhIHJlY2VpdmUgYW5kIHRoZSBtb2RlIGlzIGNoYW5nZWQgaXQgY2FycmllcworICogb24gcmVjZWl2aW5nIGFuZCBzZW5kcyB1cyBhbiBpbnRlcnJ1cHQuIFdlIGhhdmUgdG8gYmFuZCBhaWQgYWxsIHRoZXNlIGNhc2VzCisgKiB0byBnZXQgYSBzZW5zaWJsZSAxNTBrYnl0ZXMvc2Vjb25kIHBlcmZvcm1hbmNlLiBFdmVuIHRoZW4geW91IHdhbnQgYSBzbWFsbAorICogVENQIHdpbmRvdy4KKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgZWxfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscDsKKwlpbnQgaW9hZGRyOworCWludCBheHNyOwkJCS8qIEF1eC4gc3RhdHVzIHJlZy4gKi8KKworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9jaygmbHAtPmxvY2spOworCQorCS8qCisJICoJV2hhdCBoYXBwZW5lZCA/CisJICovCisKKwlheHNyID0gaW5iKEFYX1NUQVRVUyk7CisKKwkvKgorCSAqCUxvZyBpdAorCSAqLworCisJaWYgKGVsX2RlYnVnID4gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlbF9pbnRlcnJ1cHQoKSBhdXg9JSMwMngiLCBkZXYtPm5hbWUsIGF4c3IpOworCisgICAgICAgIGlmKGxwLT5sb2FkaW5nPT0xICYmICFscC0+dHhpbmcpCisgICAgICAgIAlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSW5jb25zaXN0ZW50IHN0YXRlIGxvYWRpbmcgd2hpbGUgbm90IGluIHR4XG4iLAorICAgICAgICAJCWRldi0+bmFtZSk7CisKKwlpZiAobHAtPnR4aW5nKQorCXsKKworICAgIAkJLyoKKyAgICAJCSAqCUJvYXJkIGluIHRyYW5zbWl0IG1vZGUuIE1heSBiZSBsb2FkaW5nLiBJZiB3ZSBhcmUKKyAgICAJCSAqCWxvYWRpbmcgd2Ugc2hvdWxkbid0IGhhdmUgZ290IHRoaXMuCisgICAgCQkgKi8KKworCQlpbnQgdHhzciA9IGluYihUWF9TVEFUVVMpOworCisJCWlmKGxwLT5sb2FkaW5nPT0xKQorCQl7CisJCQlpZihlbF9kZWJ1ZyA+IDIpCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJbnRlcnJ1cHQgd2hpbGUgbG9hZGluZyBbIiwgZGV2LT5uYW1lKTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiIHR4c3I9JTAyeCBncD0lMDR4IHJwPSUwNHhdXG4iLCB0eHNyLCBpbncoR1BfTE9XKSxpbncoUlhfTE9XKSk7CisJCQl9CisJCQlscC0+bG9hZGluZz0yOwkJLyogRm9yY2UgYSByZWxvYWQgKi8KKwkJCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChlbF9kZWJ1ZyA+IDYpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiIHR4c3I9JTAyeCBncD0lMDR4IHJwPSUwNHgiLCB0eHNyLCBpbncoR1BfTE9XKSxpbncoUlhfTE9XKSk7CisKKwkJaWYgKChheHNyICYgMHg4MCkgJiYgKHR4c3IgJiBUWF9SRUFEWSkgPT0gMCkKKwkJeworCQkJLyoKKwkJCSAqCUZJWE1FOiBpcyB0aGVyZSBhIGxvZ2ljIHRvIHdoZXRoZXIgdG8ga2VlcCBvbiB0cnlpbmcgb3IKKwkJCSAqCXJlc2V0IGltbWVkaWF0ZWx5ID8KKwkJCSAqLworCQkJaWYoZWxfZGVidWc+MSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFVudXN1YWwgaW50ZXJydXB0IGR1cmluZyBUeCwgdHhzcj0lMDJ4IGF4c3I9JTAyeCIKKwkJCSAgCQkiIGdwPSUwM3ggcnA9JTAzeC5cbiIsIGRldi0+bmFtZSwgdHhzciwgYXhzciwKKwkJCWludyhpb2FkZHIgKyBFTDFfREFUQVBUUiksIGludyhpb2FkZHIgKyBFTDFfUlhQVFIpKTsKKwkJCWxwLT50eGluZyA9IDA7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0KKwkJZWxzZSBpZiAodHhzciAmIFRYXzE2Q09MTElTSU9OUykKKwkJeworCQkJLyoKKwkJCSAqCVRpbWVkIG91dAorCQkJICovCisJCQlpZiAoZWxfZGVidWcpCisJCQkJcHJpbnRrIChLRVJOX0RFQlVHICIlczogVHJhbnNtaXQgZmFpbGVkIDE2IHRpbWVzLCBFdGhlcm5ldCBqYW1tZWQ/XG4iLGRldi0+bmFtZSk7CisJCQlvdXRiKEFYX1NZUywgQVhfQ01EKTsKKwkJCWxwLT50eGluZyA9IDA7CisJCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfQorCQllbHNlIGlmICh0eHNyICYgVFhfQ09MTElTSU9OKQorCQl7CisJCQkvKgorCQkJICoJUmV0cmlnZ2VyIHhtaXQuCisJCQkgKi8KKworCQkJaWYgKGVsX2RlYnVnID4gNikKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiIHJldHJhbnNtaXR0aW5nIGFmdGVyIGEgY29sbGlzaW9uLlxuIik7CisJCQkvKgorCQkJICoJUG9vciBsaXR0bGUgY2hpcCBjYW4ndCByZXNldCBpdHMgb3duIHN0YXJ0IHBvaW50ZXIKKwkJCSAqLworCisJCQlvdXRiKEFYX1NZUywgQVhfQ01EKTsKKwkJCW91dHcobHAtPnR4X3BrdF9zdGFydCwgR1BfTE9XKTsKKwkJCW91dGIoQVhfWE1JVCwgQVhfQ01EKTsKKwkJCWxwLT5zdGF0cy5jb2xsaXNpb25zKys7CisJCQlzcGluX3VubG9jaygmbHAtPmxvY2spOworCQkJZ290byBvdXQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKgorCQkJICoJSXQgd29ya2VkLi4gd2Ugd2lsbCBub3cgZmFsbCB0aHJvdWdoIGFuZCByZWNlaXZlCisJCQkgKi8KKwkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlpZiAoZWxfZGVidWcgPiA2KQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIgVHggc3VjY2VlZGVkICVzXG4iLAorCQkgICAgICAgCQkJKHR4c3IgJiBUWF9SRFkpID8gIi4iIDogImJ1dCB0eCBpcyBidXN5ISIpOworCQkJLyoKKwkJCSAqCVRoaXMgaXMgc2FmZSB0aGUgaW50ZXJydXB0IGlzIGF0b21pYyBXUlQgaXRzZWxmLgorCQkJICovCisKKwkJCWxwLT50eGluZyA9IDA7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CS8qIEluIGNhc2UgbW9yZSB0byB0cmFuc21pdCAqLworCQl9CisJfQorCWVsc2UKKwl7CisgICAgCQkvKgorICAgIAkJICoJSW4gcmVjZWl2ZSBtb2RlLgorICAgIAkJICovCisKKwkJaW50IHJ4c3IgPSBpbmIoUlhfU1RBVFVTKTsKKwkJaWYgKGVsX2RlYnVnID4gNSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgcnhzcj0lMDJ4IHR4c3I9JTAyeCBycD0lMDR4IiwgcnhzciwgaW5iKFRYX1NUQVRVUyksaW53KFJYX0xPVykpOworCQkvKgorCQkgKglKdXN0IHJlYWRpbmcgcnhfc3RhdHVzIGZpeGVzIG1vc3QgZXJyb3JzLgorCQkgKi8KKwkJaWYgKHJ4c3IgJiBSWF9NSVNTRUQpCisJCQlscC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycysrOworCQllbHNlIGlmIChyeHNyICYgUlhfUlVOVCkKKwkJewkvKiBIYW5kbGVkIHRvIGF2b2lkIGJvYXJkIGxvY2stdXAuICovCisJCQlscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaWYgKGVsX2RlYnVnID4gNSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiIHJ1bnQuXG4iKTsKKwkJfQorCQllbHNlIGlmIChyeHNyICYgUlhfR09PRCkKKwkJeworCQkJLyoKKwkJCSAqCVJlY2VpdmUgd29ya2VkLgorCQkJICovCisJCQllbF9yZWNlaXZlKGRldik7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKgorCQkJICoJTm90aGluZz8gIFNvbWV0aGluZyBpcyBicm9rZW4hCisJCQkgKi8KKwkJCWlmIChlbF9kZWJ1ZyA+IDIpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBObyBwYWNrZXQgc2Vlbiwgcnhzcj0lMDJ4ICoqcmVzZXR0aW5nIDNjNTAxKioqXG4iLAorCQkJCQlkZXYtPm5hbWUsIHJ4c3IpOworCQkJZWxfcmVzZXQoZGV2KTsKKwkJfQorCQlpZiAoZWxfZGVidWcgPiAzKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIi5cbiIpOworCX0KKworCS8qCisJICoJTW92ZSBpbnRvIHJlY2VpdmUgbW9kZQorCSAqLworCisJb3V0YihBWF9SWCwgQVhfQ01EKTsKKwlvdXR3KDB4MDAsIFJYX0JVRl9DTFIpOworCWluYihSWF9TVEFUVVMpOwkJLyogQmUgY2VydGFpbiB0aGF0IGludGVycnVwdHMgYXJlIGNsZWFyZWQuICovCisJaW5iKFRYX1NUQVRVUyk7CisJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKK291dDoKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworLyoqCisgKiBlbF9yZWNlaXZlOgorICogQGRldjogRGV2aWNlIHRvIHB1bGwgdGhlIHBhY2tldHMgZnJvbQorICoKKyAqIFdlIGhhdmUgYSBnb29kIHBhY2tldC4gV2VsbCwgbm90IHJlYWxseSAiZ29vZCIsIGp1c3QgbW9zdGx5IG5vdCBicm9rZW4uCisgKiBXZSBtdXN0IGNoZWNrIGV2ZXJ5dGhpbmcgdG8gc2VlIGlmIGl0IGlzIGdvb2QuIEluIHBhcnRpY3VsYXIgd2Ugb2NjYXNpb25hbGx5CisgKiBnZXQgd2lsZCBwYWNrZXQgc2l6ZXMgZnJvbSB0aGUgY2FyZC4gSWYgdGhlIHBhY2tldCBzZWVtcyBzYW5lIHdlIFBJTyBpdAorICogb2ZmIHRoZSBjYXJkIGFuZCBxdWV1ZSBpdCBmb3IgdGhlIHByb3RvY29sIGxheWVycy4KKyAqLworCitzdGF0aWMgdm9pZCBlbF9yZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgcGt0X2xlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJcGt0X2xlbiA9IGludyhSWF9MT1cpOworCisJaWYgKGVsX2RlYnVnID4gNCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiBlbF9yZWNlaXZlICVkLlxuIiwgcGt0X2xlbik7CisKKwlpZiAoKHBrdF9sZW4gPCA2MCkgIHx8ICAocGt0X2xlbiA+IDE1MzYpKQorCXsKKwkJaWYgKGVsX2RlYnVnKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBib2d1cyBwYWNrZXQsIGxlbmd0aD0lZFxuIiwgZGV2LT5uYW1lLCBwa3RfbGVuKTsKKwkJbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqCUNvbW1hbmQgbW9kZSBzbyB3ZSBjYW4gZW1wdHkgdGhlIGJ1ZmZlcgorCSAqLworCisJb3V0YihBWF9TWVMsIEFYX0NNRCk7CisJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKzIpOworCisJLyoKKwkgKglTdGFydCBvZiBmcmFtZQorCSAqLworCisJb3V0dygweDAwLCBHUF9MT1cpOworCWlmIChza2IgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKwllbHNlCisJeworICAgIAkJc2tiX3Jlc2VydmUoc2tiLDIpOwkvKiBGb3JjZSAxNiBieXRlIGFsaWdubWVudCAqLworCQlza2ItPmRldiA9IGRldjsKKwkJLyoKKwkJICoJVGhlIHJlYWQgaW5jcmVtZW50cyB0aHJvdWdoIHRoZSBieXRlcy4gVGhlIGludGVycnVwdAorCQkgKgloYW5kbGVyIHdpbGwgZml4IHRoZSBwb2ludGVyIHdoZW4gaXQgcmV0dXJucyB0bworCQkgKglyZWNlaXZlIG1vZGUuCisJCSAqLworCQlpbnNiKERBVEFQT1JULCBza2JfcHV0KHNrYixwa3RfbGVuKSwgcGt0X2xlbik7CisJCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJCW5ldGlmX3J4KHNrYik7CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCWxwLT5zdGF0cy5yeF9ieXRlcys9cGt0X2xlbjsKKwl9CisJcmV0dXJuOworfQorCisvKioKKyAqIGVsX3Jlc2V0OiBSZXNldCBhIDNjNTAxIGNhcmQKKyAqIEBkZXY6IFRoZSAzYzUwMSBjYXJkIGFib3V0IHRvIGdldCB6YXBwZWQKKyAqCisgKiBFdmVuIHJlc2V0dGluZyBhIDNjNTAxIGlzbnQgc2ltcGxlLiBXaGVuIHlvdSBhY3RpdmF0ZSByZXNldCBpdCBsb3NlcyBhbGwKKyAqIGl0cyBjb25maWd1cmF0aW9uLiBZb3UgbXVzdCBob2xkIHRoZSBsb2NrIHdoZW4gZG9pbmcgdGhpcy4gVGhlIGZ1bmN0aW9uCisgKiBjYW5ub3QgdGFrZSB0aGUgbG9jayBpdHNlbGYgYXMgaXQgaXMgY2FsbGFibGUgZnJvbSB0aGUgaXJxIGhhbmRsZXIuCisgKi8KKworc3RhdGljIHZvaWQgIGVsX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWlmIChlbF9kZWJ1Zz4gMikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiM2M1MDEgcmVzZXQuLi4iKTsKKwlvdXRiKEFYX1JFU0VULCBBWF9DTUQpOwkJLyogUmVzZXQgdGhlIGNoaXAgKi8KKwlvdXRiKEFYX0xPT1AsIEFYX0NNRCk7CQkvKiBBdXggY29udHJvbCwgaXJxIGFuZCBsb29wYmFjayBlbmFibGVkICovCisJeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykJLyogU2V0IHRoZSBzdGF0aW9uIGFkZHJlc3MuICovCisJCQlvdXRiKGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIGkpOworCX0KKworCW91dHcoMCwgUlhfQlVGX0NMUik7CQkvKiBTZXQgcnggcGFja2V0IGFyZWEgdG8gMC4gKi8KKwlvdXRiKFRYX05PUk0sIFRYX0NNRCk7CQkvKiB0eCBpcnEgb24gZG9uZSwgY29sbGlzaW9uICovCisJb3V0YihSWF9OT1JNLCBSWF9DTUQpOwkJLyogU2V0IFJ4IGNvbW1hbmRzLiAqLworCWluYihSWF9TVEFUVVMpOwkJCS8qIENsZWFyIHN0YXR1cy4gKi8KKwlpbmIoVFhfU1RBVFVTKTsKKwlscC0+dHhpbmcgPSAwOworfQorCisvKioKKyAqIGVsMV9jbG9zZToKKyAqIEBkZXY6IDNjNTAxIGNhcmQgdG8gc2h1dCBkb3duCisgKgorICogQ2xvc2UgYSAzYzUwMSBjYXJkLiBUaGUgSUZGX1VQIGZsYWcgaGFzIGJlZW4gY2xlYXJlZCBieSB0aGUgdXNlciB2aWEKKyAqIHRoZSBTSU9DU0lGRkxBR1MgaW9jdGwuIFdlIHN0b3AgYW55IGZ1cnRoZXIgdHJhbnNtaXNzaW9ucyBiZWluZyBxdWV1ZWQsCisgKiBhbmQgdGhlbiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHRzLiBGaW5hbGx5IHdlIHJlc2V0IHRoZSBjaGlwLiBUaGUgZWZmZWN0cworICogb2YgdGhlIHJlc3Qgd2lsbCBiZSBjbGVhbmVkIHVwIGJ5ICNlbDFfb3Blbi4gQWx3YXlzIHJldHVybnMgMCBpbmRpY2F0aW5nCisgKiBhIHN1Y2Nlc3MuCisgKi8KKyAKK3N0YXRpYyBpbnQgZWwxX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKGVsX2RlYnVnID4gMikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNodXR0aW5nIGRvd24gRXRoZXJuZXQgY2FyZCBhdCAlI3guXG4iLCBkZXYtPm5hbWUsIGlvYWRkcik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJLyoKKwkgKglGcmVlIGFuZCBkaXNhYmxlIHRoZSBJUlEuCisJICovCisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlvdXRiKEFYX1JFU0VULCBBWF9DTUQpOwkJLyogUmVzZXQgdGhlIGNoaXAgKi8KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGVsMV9nZXRfc3RhdHM6CisgKiBAZGV2OiBUaGUgY2FyZCB0byBnZXQgdGhlIHN0YXRpc3RpY3MgZm9yCisgKgorICogSW4gc21hcnRlciBkZXZpY2VzIHRoaXMgZnVuY3Rpb24gaXMgbmVlZGVkIHRvIHB1bGwgc3RhdGlzdGljcyBvZmYgdGhlCisgKiBib2FyZCBpdHNlbGYuIFRoZSAzYzUwMSBoYXMgbm8gaGFyZHdhcmUgc3RhdGlzdGljcy4gV2UgbWFpbnRhaW4gdGhlbSBhbGwKKyAqIHNvIHRoZXkgYXJlIGJ5IGRlZmluaXRpb24gYWx3YXlzIHVwIHRvIGRhdGUuCisgKgorICogUmV0dXJucyB0aGUgc3RhdGlzdGljcyBmb3IgdGhlIGNhcmQgZnJvbSB0aGUgY2FyZCBwcml2YXRlIGRhdGEKKyAqLworIAorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICplbDFfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiAmbHAtPnN0YXRzOworfQorCisvKioKKyAqIHNldF9tdWx0aWNhc3RfbGlzdDoKKyAqIEBkZXY6IFRoZSBkZXZpY2UgdG8gYWRqdXN0CisgKgorICogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IgdG8gdXNlIHRoZSBiZXN0LWVmZm9ydCAKKyAqIGZpbHRlcmluZyBzdXBwb3J0ZWQuIFRoZSAzYzUwMSBzdXBwb3J0cyBvbmx5IHRocmVlIG1vZGVzIG9mIGZpbHRlcmluZy4KKyAqIEl0IGFsd2F5cyByZWNlaXZlcyBicm9hZGNhc3RzIGFuZCBwYWNrZXRzIGZvciBpdHNlbGYuIFlvdSBjYW4gY2hvb3NlIHRvCisgKiBvcHRpb25hbGx5IHJlY2VpdmUgYWxsIHBhY2tldHMsIG9yIGFsbCBtdWx0aWNhc3QgcGFja2V0cyBvbiB0b3Agb2YgdGhpcy4KKyAqLworCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpZihkZXYtPmZsYWdzJklGRl9QUk9NSVNDKQorCXsKKwkJb3V0YihSWF9QUk9NLCBSWF9DTUQpOworCQlpbmIoUlhfU1RBVFVTKTsKKwl9CisJZWxzZSBpZiAoZGV2LT5tY19saXN0IHx8IGRldi0+ZmxhZ3MmSUZGX0FMTE1VTFRJKQorCXsKKwkJb3V0YihSWF9NVUxULCBSWF9DTUQpOwkvKiBNdWx0aWNhc3Qgb3IgYWxsIG11bHRpY2FzdCBpcyB0aGUgc2FtZSAqLworCQlpbmIoUlhfU1RBVFVTKTsJCS8qIENsZWFyIHN0YXR1cy4gKi8KKwl9CisJZWxzZQorCXsKKwkJb3V0YihSWF9OT1JNLCBSWF9DTUQpOworCQlpbmIoUlhfU1RBVFVTKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgbmV0ZGV2X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzcHJpbnRmKGluZm8tPmJ1c19pbmZvLCAiSVNBIDB4JWx4IiwgZGV2LT5iYXNlX2FkZHIpOworfQorCitzdGF0aWMgdTMyIG5ldGRldl9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGVidWc7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGxldmVsKQoreworCWRlYnVnID0gbGV2ZWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBuZXRkZXZfZ2V0X2RydmluZm8sCisJLmdldF9tc2dsZXZlbAkJPSBuZXRkZXZfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gbmV0ZGV2X3NldF9tc2dsZXZlbCwKK307CisKKyNpZmRlZiBNT0RVTEUKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfM2M1MDE7CisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiRXRoZXJMaW5rIEkvTyBiYXNlIGFkZHJlc3MiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiRXRoZXJMaW5rIElSUSBudW1iZXIiKTsKKworLyoqCisgKiBpbml0X21vZHVsZToKKyAqCisgKiBXaGVuIHRoZSBkcml2ZXIgaXMgbG9hZGVkIGFzIGEgbW9kdWxlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiBXZSBmYWtlIHVwCisgKiBhIGRldmljZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgYmFzZSBJL08gYW5kIGludGVycnVwdCBzZXQgYXMgaWYgaXQgd2VyZSBiZWluZworICogY2FsbGVkIGZyb20gU3BhY2UuYy4gVGhpcyBtaW5pbWlzZXMgdGhlIGV4dHJhIGNvZGUgdGhhdCB3b3VsZCBvdGhlcndpc2UKKyAqIGJlIHJlcXVpcmVkLgorICoKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBvciAtRUlPIGlmIGEgY2FyZCBpcyBub3QgZm91bmQuIFJldHVybmluZyBhbiBlcnJvcgorICogaGVyZSBhbHNvIGNhdXNlcyB0aGUgbW9kdWxlIHRvIGJlIHVubG9hZGVkCisgKi8KKyAKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWRldl8zYzUwMSA9IGVsMV9wcm9iZSgtMSk7CisJaWYgKElTX0VSUihkZXZfM2M1MDEpKQorCQlyZXR1cm4gUFRSX0VSUihkZXZfM2M1MDEpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGNsZWFudXBfbW9kdWxlOgorICogCisgKiBUaGUgbW9kdWxlIGlzIGJlaW5nIHVubG9hZGVkLiBXZSB1bmhvb2sgb3VyIG5ldHdvcmsgZGV2aWNlIGZyb20gdGhlIHN5c3RlbQorICogYW5kIHRoZW4gZnJlZSB1cCB0aGUgcmVzb3VyY2VzIHdlIHRvb2sgd2hlbiB0aGUgY2FyZCB3YXMgZm91bmQuCisgKi8KKyAKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2XzNjNTAxOworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVMMV9JT19FWFRFTlQpOworCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworTU9EVUxFX0FVVEhPUigiRG9uYWxkIEJlY2tlciwgQWxhbiBDb3giKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VwcG9ydCBmb3IgdGhlIGFuY2llbnQgM0NvbSAzYzUwMSBldGhlcm5ldCBjYXJkIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTAxLmggYi9kcml2ZXJzL25ldC8zYzUwMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYjA1ODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC8zYzUwMS5oCkBAIC0wLDAgKzEsOTMgQEAKKworLyoKKyAqCUluZGV4IHRvIGZ1bmN0aW9ucy4KKyAqLworCitzdGF0aWMgaW50ICBlbDFfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpOworc3RhdGljIGludCAgZWxfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGVsX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICBlbF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGVsX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIGVsX3JlY2VpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlbF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIGVsMV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZWwxX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOworCisjZGVmaW5lIEVMMV9JT19FWFRFTlQJMTYKKworI2lmbmRlZiBFTF9ERUJVRworI2RlZmluZSBFTF9ERUJVRyAgMAkvKiB1c2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgZGV2ZWwuLCA+MiBmb3IgZGVidWcgKi8KKyNlbmRpZgkJCS8qIEFueXRoaW5nIGFib3ZlIDUgaXMgd29yZHkgZGVhdGghICovCisjZGVmaW5lIGRlYnVnIGVsX2RlYnVnCitzdGF0aWMgaW50IGVsX2RlYnVnID0gRUxfREVCVUc7CisKKy8qCisgKglCb2FyZC1zcGVjaWZpYyBpbmZvIGluIGRldi0+cHJpdi4KKyAqLworCitzdHJ1Y3QgbmV0X2xvY2FsCit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJaW50CQl0eF9wa3Rfc3RhcnQ7CS8qIFRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgVHggcGFja2V0LiAqLworCWludAkJY29sbGlzaW9uczsJLyogVHggY29sbGlzaW9ucyB0aGlzIHBhY2tldCAqLworCWludAkJbG9hZGluZzsJLyogU3BvdCBidWZmZXIgbG9hZCBjb2xsaXNpb25zICovCisJaW50CQl0eGluZzsJCS8qIFRydWUgaWYgY2FyZCBpcyBpbiBUWCBtb2RlICovCisJc3BpbmxvY2tfdAlsb2NrOwkJLyogU2VyaWFsaXppbmcgbG9jayAqLworfTsKKworDAorI2RlZmluZSBSWF9TVEFUVVMgKGlvYWRkciArIDB4MDYpCisjZGVmaW5lIFJYX0NNRAkgIFJYX1NUQVRVUworI2RlZmluZSBUWF9TVEFUVVMgKGlvYWRkciArIDB4MDcpCisjZGVmaW5lIFRYX0NNRAkgIFRYX1NUQVRVUworI2RlZmluZSBHUF9MT1cgCSAgKGlvYWRkciArIDB4MDgpCisjZGVmaW5lIEdQX0hJR0ggICAoaW9hZGRyICsgMHgwOSkKKyNkZWZpbmUgUlhfQlVGX0NMUiAoaW9hZGRyICsgMHgwQSkKKyNkZWZpbmUgUlhfTE9XCSAgKGlvYWRkciArIDB4MEEpCisjZGVmaW5lIFJYX0hJR0ggICAoaW9hZGRyICsgMHgwQikKKyNkZWZpbmUgU0FQUk9NCSAgKGlvYWRkciArIDB4MEMpCisjZGVmaW5lIEFYX1NUQVRVUyAoaW9hZGRyICsgMHgwRSkKKyNkZWZpbmUgQVhfQ01ECSAgQVhfU1RBVFVTCisjZGVmaW5lIERBVEFQT1JUICAoaW9hZGRyICsgMHgwRikKKyNkZWZpbmUgVFhfUkRZIDB4MDgJCS8qIEluIFRYX1NUQVRVUyAqLworCisjZGVmaW5lIEVMMV9EQVRBUFRSCTB4MDgKKyNkZWZpbmUgRUwxX1JYUFRSCTB4MEEKKyNkZWZpbmUgRUwxX1NBUFJPTQkweDBDCisjZGVmaW5lIEVMMV9EQVRBUE9SVCAJMHgwZgorCisvKgorICoJV3JpdGVzIHRvIHRoZSBheCBjb21tYW5kIHJlZ2lzdGVyLgorICovCisKKyNkZWZpbmUgQVhfT0ZGCTB4MDAJCQkvKiBJcnEgb2ZmLCBidWZmZXIgYWNjZXNzIG9uICovCisjZGVmaW5lIEFYX1NZUyAgMHg0MAkJCS8qIExvYWQgdGhlIGJ1ZmZlciAqLworI2RlZmluZSBBWF9YTUlUIDB4NDQJCQkvKiBUcmFuc21pdCBhIHBhY2tldCAqLworI2RlZmluZSBBWF9SWAkweDQ4CQkJLyogUmVjZWl2ZSBhIHBhY2tldCAqLworI2RlZmluZSBBWF9MT09QCTB4MEMJCQkvKiBMb29wYmFjayBtb2RlICovCisjZGVmaW5lIEFYX1JFU0VUIDB4ODAKKworLyoKKyAqCU5vcm1hbCByZWNlaXZlIG1vZGUgd3JpdHRlbiB0byBSWF9TVEFUVVMuICBXZSBtdXN0IGludHIgb24gc2hvcnQgcGFja2V0cworICoJdG8gYXZvaWQgYm9ndXMgcnggbG9ja3Vwcy4KKyAqLworCisjZGVmaW5lIFJYX05PUk0gMHhBOAkJLyogMHg2OCA9PSBhbGwgYWRkcnMsIDB4QTggb25seSB0byBtZS4gKi8KKyNkZWZpbmUgUlhfUFJPTSAweDY4CQkvKiBTZW5pb3IgUHJvbSwgdWhtbSBwcm9taXNjdW91cyBtb2RlLiAqLworI2RlZmluZSBSWF9NVUxUIDB4RTgJCS8qIEFjY2VwdCBtdWx0aWNhc3QgcGFja2V0cy4gKi8KKyNkZWZpbmUgVFhfTk9STSAweDBBCQkvKiBJbnRlcnJ1cHQgb24gZXZlcnl0aGluZyB0aGF0IG1pZ2h0IGhhbmcgdGhlIGNoaXAgKi8KKworLyoKKyAqCVRYX1NUQVRVUyByZWdpc3Rlci4KKyAqLworCisjZGVmaW5lIFRYX0NPTExJU0lPTiAweDAyCisjZGVmaW5lIFRYXzE2Q09MTElTSU9OUyAweDA0CisjZGVmaW5lIFRYX1JFQURZIDB4MDgKKworI2RlZmluZSBSWF9SVU5UIDB4MDgKKyNkZWZpbmUgUlhfTUlTU0VEIDB4MDEJCS8qIE1pc3NlZCBhIHBhY2tldCBkdWUgdG8gM2M1MDEgYnJhaW5kYW1hZ2UuICovCisjZGVmaW5lIFJYX0dPT0QJMHgzMAkJLyogR29vZCBwYWNrZXQgMHgyMCwgb3Igc2ltcGxlIG92ZXJmbG93IDB4MTAuICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTAzLmMgYi9kcml2ZXJzL25ldC8zYzUwMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZGZkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC8zYzUwMy5jCkBAIC0wLDAgKzEsNzQ3IEBACisvKiAzYzUwMy5jOiBBIHNoYXJlZC1tZW1vcnkgTlM4MzkwIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguICovCisvKgorICAgIFdyaXR0ZW4gMTk5Mi05NCBieSBEb25hbGQgQmVja2VyLgorCisgICAgQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICAgIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZAorICAgIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisgICAgVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisKKyAgICBUaGlzIGRyaXZlciBzaG91bGQgd29yayB3aXRoIHRoZSAzYzUwMyBhbmQgM2M1MDMvMTYuICBJdCBzaG91bGQgYmUgdXNlZAorICAgIGluIHNoYXJlZCBtZW1vcnkgbW9kZSBmb3IgYmVzdCBwZXJmb3JtYW5jZSwgYWx0aG91Z2ggaXQgbWF5IGFsc28gd29yaworICAgIGluIHByb2dyYW1tZWQtSS9PIG1vZGUuCisKKyAgICBTb3VyY2VzOgorICAgIEV0aGVyTGluayBJSSBUZWNobmljYWwgUmVmZXJlbmNlIE1hbnVhbCwKKyAgICBFdGhlckxpbmsgSUkvMTYgVGVjaG5pY2FsIFJlZmVyZW5jZSBNYW51YWwgU3VwcGxlbWVudCwKKyAgICAzQ29tIENvcnBvcmF0aW9uLCA1NDAwIEJheWZyb250IFBsYXphLCBTYW50YSBDbGFyYSBDQSA5NTA1Mi04MTQ1CisKKyAgICBUaGUgQ3J5bndyIDNjNTAzIHBhY2tldCBkcml2ZXIuCisKKyAgICBDaGFuZ2Vsb2c6CisKKyAgICBQYXVsIEdvcnRtYWtlcgk6IGFkZCBzdXBwb3J0IGZvciB0aGUgMm5kIDhrQiBvZiBSQU0gb24gMTYgYml0IGNhcmRzLgorICAgIFBhdWwgR29ydG1ha2VyCTogbXVsdGlwbGUgY2FyZCBzdXBwb3J0IGZvciBtb2R1bGUgdXNlcnMuCisgICAgcmpvaG5zb25AYW5hbG9naWMuY29tIDogRml4IHVwIFBJTyBpbnRlcmZhY2UgZm9yIGVmZmljaWVudCBvcGVyYXRpb24uCisgICAgSmVmZiBHYXJ6aWsJCTogZXRodG9vbCBzdXBwb3J0CisKKyovCisKKyNkZWZpbmUgRFJWX05BTUUJIjNjNTAzIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4xMGEiCisjZGVmaW5lIERSVl9SRUxEQVRFCSIxMS8xNy8yMDAxIgorCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9CisgICAgRFJWX05BTUUgIi5jOnYiIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURSAiICBEb25hbGQgQmVja2VyIChiZWNrZXJAc2N5bGQuY29tKVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlICI4MzkwLmgiCisjaW5jbHVkZSAiM2M1MDMuaCIKKyNkZWZpbmUgV1JEX0NPVU5UIDQKKworc3RhdGljIGludCBlbDJfcGlvX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBlbDJfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpOworCisvKiBBIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIEkvTyBhZGRyZXNzZXMgdG8gYmUgcHJvYmVkIGluIFBJTyBtb2RlLiAqLworc3RhdGljIHVuc2lnbmVkIGludCBuZXRjYXJkX3BvcnRsaXN0W10gX19pbml0ZGF0YSA9CisJeyAweDMwMCwweDMxMCwweDMzMCwweDM1MCwweDI1MCwweDI4MCwweDJhMCwweDJlMCwwfTsKKworI2RlZmluZSBFTDJfSU9fRVhURU5UCTE2CisKK3N0YXRpYyBpbnQgZWwyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGVsMl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGVsMl9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWwyX2luaXRfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGVsMl9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydF9wYWdlKTsKK3N0YXRpYyB2b2lkIGVsMl9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQgZWwyX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLAorCQkJIGludCByaW5nX3BhZ2UpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CisKKwwKKy8qIFRoaXMgcm91dGluZSBwcm9iZXMgZm9yIGEgbWVtb3J5LW1hcHBlZCAzYzUwMyBib2FyZCBieSBsb29raW5nIGZvcgorICAgdGhlICJsb2NhdGlvbiByZWdpc3RlciIgYXQgdGhlIGVuZCBvZiB0aGUganVtcGVyZWQgYm9vdCBQUk9NIHNwYWNlLgorICAgVGhpcyB3b3JrcyBldmVuIGlmIGEgUFJPTSBpc24ndCB0aGVyZS4KKworICAgSWYgdGhlIGV0aGVyY2FyZCBpc24ndCBmb3VuZCB0aGVyZSBpcyBhbiBvcHRpb25hbCBwcm9iZSBmb3IKKyAgIGV0aGVyY2FyZCBqdW1wZXJlZCB0byBwcm9ncmFtbWVkLUkvTyBtb2RlLgorICAgKi8KK3N0YXRpYyBpbnQgX19pbml0IGRvX2VsMl9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGludCAqYWRkciwgYWRkcnNbXSA9IHsgMHhkZGZmZSwgMHhkOWZmZSwgMHhjZGZmZSwgMHhjOWZmZSwgMH07CisgICAgaW50IGJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBpcnEgPSBkZXYtPmlycTsKKworICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgICAKKyAgICBpZiAoYmFzZV9hZGRyID4gMHgxZmYpCS8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KKwlyZXR1cm4gZWwyX3Byb2JlMShkZXYsIGJhc2VfYWRkcik7CisgICAgZWxzZSBpZiAoYmFzZV9hZGRyICE9IDApCQkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJcmV0dXJuIC1FTlhJTzsKKworICAgIGZvciAoYWRkciA9IGFkZHJzOyAqYWRkcjsgYWRkcisrKSB7CisJdm9pZCBfX2lvbWVtICpwID0gaW9yZW1hcCgqYWRkciwgMSk7CisJdW5zaWduZWQgYmFzZV9iaXRzOworCWludCBpOworCisJaWYgKCFwKQorCQljb250aW51ZTsKKwliYXNlX2JpdHMgPSByZWFkYihwKTsKKwlpb3VubWFwKHApOworCWkgPSBmZnMoYmFzZV9iaXRzKSAtIDE7CisJaWYgKGkgPT0gLTEgfHwgYmFzZV9iaXRzICE9ICgxIDw8IGkpKQorCSAgICBjb250aW51ZTsKKwlpZiAoZWwyX3Byb2JlMShkZXYsIG5ldGNhcmRfcG9ydGxpc3RbaV0pID09IDApCisJICAgIHJldHVybiAwOworCWRldi0+aXJxID0gaXJxOworICAgIH0KKyNpZiAhIGRlZmluZWQobm9fcHJvYmVfbm9uc2hhcmVkX21lbW9yeSkKKyAgICByZXR1cm4gZWwyX3Bpb19wcm9iZShkZXYpOworI2Vsc2UKKyAgICByZXR1cm4gLUVOT0RFVjsKKyNlbmRpZgorfQorCisvKiAgVHJ5IGFsbCBvZiB0aGUgbG9jYXRpb25zIHRoYXQgYXJlbid0IG9idmlvdXNseSBlbXB0eS4gIFRoaXMgdG91Y2hlcworICAgIGEgbG90IG9mIGxvY2F0aW9ucywgYW5kIGlzIG11Y2ggcmlza2llciB0aGFuIHRoZSBjb2RlIGFib3ZlLiAqLworc3RhdGljIGludCBfX2luaXQgCitlbDJfcGlvX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgaW50IGk7CisgICAgaW50IGJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBpcnEgPSBkZXYtPmlycTsKKworICAgIGlmIChiYXNlX2FkZHIgPiAweDFmZikJLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLworCXJldHVybiBlbDJfcHJvYmUxKGRldiwgYmFzZV9hZGRyKTsKKyAgICBlbHNlIGlmIChiYXNlX2FkZHIgIT0gMCkJLyogRG9uJ3QgcHJvYmUgYXQgYWxsLiAqLworCXJldHVybiAtRU5YSU87CisKKyAgICBmb3IgKGkgPSAwOyBuZXRjYXJkX3BvcnRsaXN0W2ldOyBpKyspIHsKKwlpZiAoZWwyX3Byb2JlMShkZXYsIG5ldGNhcmRfcG9ydGxpc3RbaV0pID09IDApCisJICAgIHJldHVybiAwOworCWRldi0+aXJxID0gaXJxOworICAgIH0KKworICAgIHJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBOQjogZWwyX2Nsb3NlKCkgaGFuZGxlcyBmcmVlX2lycSAqLworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBFTDJfSU9fRVhURU5UKTsKKwlpZiAoZWlfc3RhdHVzLm1lbSkKKwkJaW91bm1hcChlaV9zdGF0dXMubWVtKTsKK30KKworI2lmbmRlZiBNT0RVTEUKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGVsMl9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCisJZXJyID0gZG9fZWwyX3Byb2JlKGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCWNsZWFudXBfY2FyZChkZXYpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKyNlbmRpZgorCisvKiBQcm9iZSBmb3IgdGhlIEV0aGVybGluayBJSSBjYXJkIGF0IEkvTyBwb3J0IGJhc2UgSU9BRERSLAorICAgcmV0dXJuaW5nIG5vbi16ZXJvIG9uIHN1Y2Nlc3MuICBJZiBmb3VuZCwgc2V0IHRoZSBzdGF0aW9uCisgICBhZGRyZXNzIGFuZCBtZW1vcnkgcGFyYW1ldGVycyBpbiBERVZJQ0UuICovCitzdGF0aWMgaW50IF9faW5pdCAKK2VsMl9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKyAgICBpbnQgaSwgaW9iYXNlX3JlZywgbWVtYmFzZV9yZWcsIHNhdmVkXzQwNiwgd29yZGxlbmd0aCwgcmV0dmFsOworICAgIHN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7CisgICAgdW5zaWduZWQgbG9uZyB2ZW5kb3JfaWQ7CisKKyAgICBpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgRUwyX0lPX0VYVEVOVCwgRFJWX05BTUUpKQorCXJldHVybiAtRUJVU1k7CisKKyAgICBpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciArIDB4NDAwLCA4LCBEUlZfTkFNRSkpIHsKKwlyZXR2YWwgPSAtRUJVU1k7CisJZ290byBvdXQ7CisgICAgfQorCisgICAgLyogUmVzZXQgYW5kL29yIGF2b2lkIGFueSBsdXJraW5nIE5FMjAwMCAqLworICAgIGlmIChpbmIoaW9hZGRyICsgMHg0MDgpID09IDB4ZmYpIHsKKyAgICAJbWRlbGF5KDEpOworCXJldHZhbCA9IC1FTk9ERVY7CisJZ290byBvdXQxOworICAgIH0KKworICAgIC8qIFdlIHZlcmlmeSB0aGF0IGl0J3MgYSAzQzUwMyBib2FyZCBieSBjaGVja2luZyB0aGUgZmlyc3QgdGhyZWUgb2N0ZXRzCisgICAgICAgb2YgaXRzIGV0aGVybmV0IGFkZHJlc3MuICovCisgICAgaW9iYXNlX3JlZyA9IGluYihpb2FkZHIrMHg0MDMpOworICAgIG1lbWJhc2VfcmVnID0gaW5iKGlvYWRkcisweDQwNCk7CisgICAgLyogQVNJQyBsb2NhdGlvbiByZWdpc3RlcnMgc2hvdWxkIGJlIDAgb3IgaGF2ZSBvbmx5IGEgc2luZ2xlIGJpdCBzZXQuICovCisgICAgaWYgKCAgIChpb2Jhc2VfcmVnICAmIChpb2Jhc2VfcmVnIC0gMSkpCisJfHwgKG1lbWJhc2VfcmVnICYgKG1lbWJhc2VfcmVnIC0gMSkpKSB7CisJcmV0dmFsID0gLUVOT0RFVjsKKwlnb3RvIG91dDE7CisgICAgfQorICAgIHNhdmVkXzQwNiA9IGluYl9wKGlvYWRkciArIDB4NDA2KTsKKyAgICBvdXRiX3AoRUNOVFJMX1JFU0VUfEVDTlRSTF9USElOLCBpb2FkZHIgKyAweDQwNik7IC8qIFJlc2V0IGl0Li4uICovCisgICAgb3V0Yl9wKEVDTlRSTF9USElOLCBpb2FkZHIgKyAweDQwNik7CisgICAgLyogTWFwIHRoZSBzdGF0aW9uIGFkZHIgUFJPTSBpbnRvIHRoZSBsb3dlciBJL08gcG9ydHMuIFdlIG5vdyBjaGVjaworICAgICAgIGZvciBib3RoIHRoZSBvbGQgYW5kIG5ldyAzQ29tIHByZWZpeCAqLworICAgIG91dGIoRUNOVFJMX1NBUFJPTXxFQ05UUkxfVEhJTiwgaW9hZGRyICsgMHg0MDYpOworICAgIHZlbmRvcl9pZCA9IGluYihpb2FkZHIpKjB4MTAwMDAgKyBpbmIoaW9hZGRyICsgMSkqMHgxMDAgKyBpbmIoaW9hZGRyICsgMik7CisgICAgaWYgKCh2ZW5kb3JfaWQgIT0gT0xEXzNDT01fSUQpICYmICh2ZW5kb3JfaWQgIT0gTkVXXzNDT01fSUQpKSB7CisJLyogUmVzdG9yZSB0aGUgcmVnaXN0ZXIgd2UgZnJvYmJlZC4gKi8KKwlvdXRiKHNhdmVkXzQwNiwgaW9hZGRyICsgMHg0MDYpOworCXJldHZhbCA9IC1FTk9ERVY7CisJZ290byBvdXQxOworICAgIH0KKworICAgIGlmIChlaV9kZWJ1ZyAgJiYgIHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJcHJpbnRrKHZlcnNpb24pOworCisgICAgZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisKKyAgICBwcmludGsoIiVzOiAzYzUwMyBhdCBpL28gYmFzZSAlIzN4LCBub2RlICIsIGRldi0+bmFtZSwgaW9hZGRyKTsKKworICAgIC8qIFJldHJpZXZlIGFuZCBwcmludCB0aGUgZXRoZXJuZXQgYWRkcmVzcy4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXByaW50aygiICUyLjJ4IiwgZGV2LT5kZXZfYWRkcltpXSA9IGluYihpb2FkZHIgKyBpKSk7CisKKyAgICAvKiBNYXAgdGhlIDgzOTAgYmFjayBpbnRvIHRoZSB3aW5kb3cuICovCisgICAgb3V0YihFQ05UUkxfVEhJTiwgaW9hZGRyICsgMHg0MDYpOworCisgICAgLyogQ2hlY2sgZm9yIEVMMi8xNiBhcyBkZXNjcmliZWQgaW4gdGVjaC4gbWFuLiAqLworICAgIG91dGJfcChFODM5MF9QQUdFMCwgaW9hZGRyICsgRTgzOTBfQ01EKTsKKyAgICBvdXRiX3AoMCwgaW9hZGRyICsgRU4wX0RDRkcpOworICAgIG91dGJfcChFODM5MF9QQUdFMiwgaW9hZGRyICsgRTgzOTBfQ01EKTsKKyAgICB3b3JkbGVuZ3RoID0gaW5iX3AoaW9hZGRyICsgRU4wX0RDRkcpICYgRU5EQ0ZHX1dUUzsKKyAgICBvdXRiX3AoRTgzOTBfUEFHRTAsIGlvYWRkciArIEU4MzkwX0NNRCk7CisKKyAgICAvKiBQcm9iZSBmb3IsIHR1cm4gb24gYW5kIGNsZWFyIHRoZSBib2FyZCdzIHNoYXJlZCBtZW1vcnkuICovCisgICAgaWYgKGVpX2RlYnVnID4gMikgcHJpbnRrKCIgbWVtb3J5IGp1bXBlcnMgJTIuMnggIiwgbWVtYmFzZV9yZWcpOworICAgIG91dGIoRUdBQ0ZSX05PUk0sIGlvYWRkciArIDB4NDA1KTsJLyogRW5hYmxlIFJBTSAqLworCisgICAgLyogVGhpcyBzaG91bGQgYmUgcHJvYmVkIGZvciAob3Igc2V0IHZpYSBhbiBpb2N0bCgpKSBhdCBydW4tdGltZS4KKyAgICAgICBSaWdodCBub3cgd2UgdXNlIGEgc2xlYXp5IGhhY2sgdG8gcGFzcyBpbiB0aGUgaW50ZXJmYWNlIG51bWJlcgorICAgICAgIGF0IGJvb3QtdGltZSB2aWEgdGhlIGxvdyBiaXRzIG9mIHRoZSBtZW1fZW5kIGZpZWxkLiAgVGhhdCB2YWx1ZSBpcworICAgICAgIHVudXNlZCwgYW5kIHRoZSBsb3cgYml0cyB3b3VsZCBiZSBkaXNjYXJkZWQgZXZlbiBpZiBpdCB3YXMgdXNlZC4gKi8KKyNpZiBkZWZpbmVkKEVJODM5MF9USElDSykgfHwgZGVmaW5lZChFTDJfQVVJKQorICAgIGVpX3N0YXR1cy5pbnRlcmZhY2VfbnVtID0gMTsKKyNlbHNlCisgICAgZWlfc3RhdHVzLmludGVyZmFjZV9udW0gPSBkZXYtPm1lbV9lbmQgJiAweGY7CisjZW5kaWYKKyAgICBwcmludGsoIiwgdXNpbmcgJXN0ZXJuYWwgeGN2ci5cbiIsIGVpX3N0YXR1cy5pbnRlcmZhY2VfbnVtID09IDAgPyAiaW4iIDogImV4Iik7CisKKyAgICBpZiAoKG1lbWJhc2VfcmVnICYgMHhmMCkgPT0gMCkgeworCWRldi0+bWVtX3N0YXJ0ID0gMDsKKwllaV9zdGF0dXMubmFtZSA9ICIzYzUwMy1QSU8iOworCWVpX3N0YXR1cy5tZW0gPSBOVUxMOworICAgIH0gZWxzZSB7CisJZGV2LT5tZW1fc3RhcnQgPSAoKG1lbWJhc2VfcmVnICYgMHhjMCkgPyAweEQ4MDAwIDogMHhDODAwMCkgKworCSAgICAoKG1lbWJhc2VfcmVnICYgMHhBMCkgPyAweDQwMDAgOiAwKTsKKyNkZWZpbmUgRUwyX01FTVNJWkUgKEVMMl9NQjFfU1RPUF9QRyAtIEVMMl9NQjFfU1RBUlRfUEcpKjI1NgorCWVpX3N0YXR1cy5tZW0gPSBpb3JlbWFwKGRldi0+bWVtX3N0YXJ0LCBFTDJfTUVNU0laRSk7CisKKyNpZmRlZiBFTDJNRU1URVNUCisJLyogVGhpcyBoYXMgbmV2ZXIgZm91bmQgYW4gZXJyb3IsIGJ1dCBzb21lb25lIG1pZ2h0IGNhcmUuCisJICAgTm90ZSB0aGF0IGl0IG9ubHkgdGVzdHMgdGhlIDJuZCA4a0Igb24gMTZrQiAzYzUwMy8xNgorCSAgIGNhcmRzIGJldHdlZW4gY2FyZCBhZGRyLiAweDIwMDAgYW5kIDB4M2ZmZi4gKi8KKwl7CQkJLyogQ2hlY2sgdGhlIGNhcmQncyBtZW1vcnkuICovCisJICAgIHZvaWQgX19pb21lbSAqbWVtX2Jhc2UgPSBlaV9zdGF0dXMubWVtOworCSAgICB1bnNpZ25lZCBpbnQgdGVzdF92YWwgPSAweGJiYWRmMDBkOworCSAgICB3cml0ZWwoMHhiYTVlYmE1ZSwgbWVtX2Jhc2UpOworCSAgICBmb3IgKGkgPSBzaXplb2YodGVzdF92YWwpOyBpIDwgRUwyX01FTVNJWkU7IGkrPXNpemVvZih0ZXN0X3ZhbCkpIHsKKwkJd3JpdGVsKHRlc3RfdmFsLCBtZW1fYmFzZSArIGkpOworCQlpZiAocmVhZGwobWVtX2Jhc2UpICE9IDB4YmE1ZWJhNWUKKwkJICAgIHx8IHJlYWRsKG1lbV9iYXNlICsgaSkgIT0gdGVzdF92YWwpIHsKKwkJICAgIHByaW50aygiM2M1MDM6IG1lbW9yeSBmYWlsdXJlIG9yIG1lbW9yeSBhZGRyZXNzIGNvbmZsaWN0LlxuIik7CisJCSAgICBkZXYtPm1lbV9zdGFydCA9IDA7CisJCSAgICBlaV9zdGF0dXMubmFtZSA9ICIzYzUwMy1QSU8iOworCQkgICAgaW91bm1hcChtZW1fYmFzZSk7CisJCSAgICBlaV9zdGF0dXMubWVtID0gTlVMTDsKKwkJICAgIGJyZWFrOworCQl9CisJCXRlc3RfdmFsICs9IDB4NTU1NTU1NTU7CisJCXdyaXRlbCgwLCBtZW1fYmFzZSArIGkpOworCSAgICB9CisJfQorI2VuZGlmICAvKiBFTDJNRU1URVNUICovCisKKwlpZiAoZGV2LT5tZW1fc3RhcnQpCisJCWRldi0+bWVtX2VuZCA9IGRldi0+bWVtX3N0YXJ0ICsgRUwyX01FTVNJWkU7CisKKwlpZiAod29yZGxlbmd0aCkgewkvKiBObyBUeCBwYWdlcyB0byBza2lwIG92ZXIgdG8gZ2V0IHRvIFJ4ICovCisJCWVpX3N0YXR1cy5wcml2ID0gMDsKKwkJZWlfc3RhdHVzLm5hbWUgPSAiM2M1MDMvMTYiOworCX0gZWxzZSB7CisJCWVpX3N0YXR1cy5wcml2ID0gVFhfUEFHRVMgKiAyNTY7CisJCWVpX3N0YXR1cy5uYW1lID0gIjNjNTAzIjsKKwl9CisgICAgfQorCisgICAgLyoKKwlEaXZpZGUgdXAgdGhlIG1lbW9yeSBvbiB0aGUgY2FyZC4gVGhpcyBpcyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mCisJd2hldGhlciBzaGFyZWQtbWVtIG9yIFBJTyBpcyB1c2VkLiBGb3IgMTYgYml0IGNhcmRzICgxNmtCIFJBTSksCisJd2UgdXNlIHRoZSBlbnRpcmUgOGsgb2YgYmFuazEgZm9yIGFuIFJ4IHJpbmcuIFdlIG9ubHkgdXNlIDNrCisJb2YgdGhlIGJhbmswIGZvciAyIGZ1bGwgc2l6ZSBUeCBwYWNrZXQgc2xvdHMuIEZvciA4IGJpdCBjYXJkcywKKwkoOGtCIFJBTSkgd2UgdXNlIDNrQiBvZiBiYW5rMSBmb3IgdHdvIFR4IHNsb3RzLCBhbmQgdGhlIHJlbWFpbmluZworCTVrQiBmb3IgYW4gUnggcmluZy4gICovCisKKyAgICBpZiAod29yZGxlbmd0aCkgeworCWVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gRUwyX01CMF9TVEFSVF9QRzsKKwllaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IEVMMl9NQjFfU1RBUlRfUEc7CisgICAgfSBlbHNlIHsKKwllaV9zdGF0dXMudHhfc3RhcnRfcGFnZSA9IEVMMl9NQjFfU1RBUlRfUEc7CisJZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPSBFTDJfTUIxX1NUQVJUX1BHICsgVFhfUEFHRVM7CisgICAgfQorCisgICAgLyogRmluaXNoIHNldHRpbmcgdGhlIGJvYXJkJ3MgcGFyYW1ldGVycy4gKi8KKyAgICBlaV9zdGF0dXMuc3RvcF9wYWdlID0gRUwyX01CMV9TVE9QX1BHOworICAgIGVpX3N0YXR1cy53b3JkMTYgPSB3b3JkbGVuZ3RoOworICAgIGVpX3N0YXR1cy5yZXNldF84MzkwID0gJmVsMl9yZXNldF84MzkwOworICAgIGVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmZWwyX2dldF84MzkwX2hkcjsKKyAgICBlaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmZWwyX2Jsb2NrX2lucHV0OworICAgIGVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmZWwyX2Jsb2NrX291dHB1dDsKKworICAgIGlmIChkZXYtPmlycSA9PSAyKQorCWRldi0+aXJxID0gOTsKKyAgICBlbHNlIGlmIChkZXYtPmlycSA+IDUgJiYgZGV2LT5pcnEgIT0gOSkgeworCXByaW50aygiM2M1MDM6IGNvbmZpZ3VyZWQgaW50ZXJydXB0ICVkIGludmFsaWQsIHdpbGwgdXNlIGF1dG9JUlEuXG4iLAorCSAgICAgICBkZXYtPmlycSk7CisJZGV2LT5pcnEgPSAwOworICAgIH0KKworICAgIGVpX3N0YXR1cy5zYXZlZF9pcnEgPSBkZXYtPmlycTsKKworICAgIGRldi0+b3BlbiA9ICZlbDJfb3BlbjsKKyAgICBkZXYtPnN0b3AgPSAmZWwyX2Nsb3NlOworICAgIGRldi0+ZXRodG9vbF9vcHMgPSAmbmV0ZGV2X2V0aHRvb2xfb3BzOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisgICAgZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlaV9wb2xsOworI2VuZGlmCisKKyAgICBpZiAoZGV2LT5tZW1fc3RhcnQpCisJcHJpbnRrKCIlczogJXMgLSAlZGtCIFJBTSwgOGtCIHNoYXJlZCBtZW0gd2luZG93IGF0ICUjNmx4LSUjNmx4LlxuIiwKKwkJZGV2LT5uYW1lLCBlaV9zdGF0dXMubmFtZSwgKHdvcmRsZW5ndGgrMSk8PDMsCisJCWRldi0+bWVtX3N0YXJ0LCBkZXYtPm1lbV9lbmQtMSk7CisKKyAgICBlbHNlCisgICAgeworCWVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gRUwyX01CMV9TVEFSVF9QRzsKKwllaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IEVMMl9NQjFfU1RBUlRfUEcgKyBUWF9QQUdFUzsKKwlwcmludGsoIlxuJXM6ICVzLCAlZGtCIFJBTSwgdXNpbmcgcHJvZ3JhbW1lZCBJL08gKFJFSlVNUEVSIGZvciBTSEFSRUQgTUVNT1JZKS5cbiIsCisJICAgICAgIGRldi0+bmFtZSwgZWlfc3RhdHVzLm5hbWUsICh3b3JkbGVuZ3RoKzEpPDwzKTsKKyAgICB9CisgICAgcmVsZWFzZV9yZWdpb24oaW9hZGRyICsgMHg0MDAsIDgpOworICAgIHJldHVybiAwOworb3V0MToKKyAgICByZWxlYXNlX3JlZ2lvbihpb2FkZHIgKyAweDQwMCwgOCk7CitvdXQ6CisgICAgcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBFTDJfSU9fRVhURU5UKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorDAorc3RhdGljIGludAorZWwyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBpbnQgcmV0dmFsID0gLUVBR0FJTjsKKworICAgIGlmIChkZXYtPmlycSA8IDIpIHsKKwlpbnQgaXJxbGlzdFtdID0gezUsIDksIDMsIDQsIDB9OworCWludCAqaXJxcCA9IGlycWxpc3Q7CisKKwlvdXRiKEVHQUNGUl9OT1JNLCBFMzNHX0dBQ0ZSKTsJLyogRW5hYmxlIFJBTSBhbmQgaW50ZXJydXB0cy4gKi8KKwlkbyB7CisJICAgIGlmIChyZXF1ZXN0X2lycSAoKmlycXAsIE5VTEwsIDAsICJib2d1cyIsIGRldikgIT0gLUVCVVNZKSB7CisJCS8qIFR3aW5rbGUgdGhlIGludGVycnVwdCwgYW5kIGNoZWNrIGlmIGl0J3Mgc2Vlbi4gKi8KKwkJdW5zaWduZWQgbG9uZyBjb29raWUgPSBwcm9iZV9pcnFfb24oKTsKKwkJb3V0Yl9wKDB4MDQgPDwgKCgqaXJxcCA9PSA5KSA/IDIgOiAqaXJxcCksIEUzM0dfSURDRlIpOworCQlvdXRiX3AoMHgwMCwgRTMzR19JRENGUik7CisJCWlmICgqaXJxcCA9PSBwcm9iZV9pcnFfb2ZmKGNvb2tpZSkJLyogSXQncyBhIGdvb2QgSVJRIGxpbmUhICovCisJCSAgICAmJiAoKHJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxID0gKmlycXAsIAorCQkgICAgZWlfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldikpID09IDApKQorCQkgICAgYnJlYWs7CisJICAgIH0KKwl9IHdoaWxlICgqKytpcnFwKTsKKwlpZiAoKmlycXAgPT0gMCkgeworCSAgICBvdXRiKEVHQUNGUl9JUlFPRkYsIEUzM0dfR0FDRlIpOwkvKiBkaXNhYmxlIGludGVycnVwdHMuICovCisJICAgIHJldHVybiByZXR2YWw7CisJfQorICAgIH0gZWxzZSB7CisJaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgZWlfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldikpKSB7CisJICAgIHJldHVybiByZXR2YWw7CisJfQorICAgIH0KKworICAgIGVsMl9pbml0X2NhcmQoZGV2KTsKKyAgICBlaV9vcGVuKGRldik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2VsMl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworICAgIGRldi0+aXJxID0gZWlfc3RhdHVzLnNhdmVkX2lycTsKKyAgICBvdXRiKEVHQUNGUl9JUlFPRkYsIEUzM0dfR0FDRlIpOwkvKiBkaXNhYmxlIGludGVycnVwdHMuICovCisKKyAgICBlaV9jbG9zZShkZXYpOworICAgIHJldHVybiAwOworfQorCisvKiBUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciB3ZSBoYXZlIGEgdW5yZWNvdmVyYWJsZSBmYWlsdXJlOgorICAgICAgIHRyYW5zbWl0IHRpbWVvdXQKKyAgICAgICBCYWQgcmluZyBidWZmZXIgcGFja2V0IGhlYWRlcgorICovCitzdGF0aWMgdm9pZAorZWwyX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBpZiAoZWlfZGVidWcgPiAxKSB7CisJcHJpbnRrKCIlczogUmVzZXR0aW5nIHRoZSAzYzUwMyBib2FyZC4uLiIsIGRldi0+bmFtZSk7CisJcHJpbnRrKCIlI2x4PSUjMDJ4ICUjbHg9JSMwMnggJSNseD0lIzAyeC4uLiIsIEUzM0dfSURDRlIsIGluYihFMzNHX0lEQ0ZSKSwKKwkgICAgICAgRTMzR19DTlRSTCwgaW5iKEUzM0dfQ05UUkwpLCBFMzNHX0dBQ0ZSLCBpbmIoRTMzR19HQUNGUikpOworICAgIH0KKyAgICBvdXRiX3AoRUNOVFJMX1JFU0VUfEVDTlRSTF9USElOLCBFMzNHX0NOVFJMKTsKKyAgICBlaV9zdGF0dXMudHhpbmcgPSAwOworICAgIG91dGJfcChlaV9zdGF0dXMuaW50ZXJmYWNlX251bT09MCA/IEVDTlRSTF9USElOIDogRUNOVFJMX0FVSSwgRTMzR19DTlRSTCk7CisgICAgZWwyX2luaXRfY2FyZChkZXYpOworICAgIGlmIChlaV9kZWJ1ZyA+IDEpIHByaW50aygiZG9uZVxuIik7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIDNjNTAzIEdBIHJlZ2lzdGVycyBhZnRlciBhIHJlc2V0LiAqLworc3RhdGljIHZvaWQKK2VsMl9pbml0X2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAvKiBVbm1hcCB0aGUgc3RhdGlvbiBQUk9NIGFuZCBzZWxlY3QgdGhlIERJWCBvciBCTkMgY29ubmVjdG9yLiAqLworICAgIG91dGJfcChlaV9zdGF0dXMuaW50ZXJmYWNlX251bT09MCA/IEVDTlRSTF9USElOIDogRUNOVFJMX0FVSSwgRTMzR19DTlRSTCk7CisKKyAgICAvKiBTZXQgQVNJQyBjb3B5IG9mIHJ4J3MgZmlyc3QgYW5kIGxhc3QrMSBidWZmZXIgcGFnZXMgKi8KKyAgICAvKiBUaGVzZSBtdXN0IGJlIHRoZSBzYW1lIGFzIGluIHRoZSA4MzkwLiAqLworICAgIG91dGIoZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UsIEUzM0dfU1RBUlRQRyk7CisgICAgb3V0YihlaV9zdGF0dXMuc3RvcF9wYWdlLCAgRTMzR19TVE9QUEcpOworCisgICAgLyogUG9pbnQgdGhlIHZlY3RvciBwb2ludGVyIHJlZ2lzdGVycyBzb21ld2hlcmUgP2hhcm1sZXNzPy4gKi8KKyAgICBvdXRiKDB4ZmYsIEUzM0dfVlAyKTsJLyogUG9pbnQgYXQgdGhlIFJPTSByZXN0YXJ0IGxvY2F0aW9uIDB4ZmZmZjAgKi8KKyAgICBvdXRiKDB4ZmYsIEUzM0dfVlAxKTsKKyAgICBvdXRiKDB4MDAsIEUzM0dfVlAwKTsKKyAgICAvKiBUdXJuIG9mZiBhbGwgaW50ZXJydXB0cyB1bnRpbCB3ZSdyZSBvcGVuZWQuICovCisgICAgb3V0Yl9wKDB4MDAsICBkZXYtPmJhc2VfYWRkciArIEVOMF9JTVIpOworICAgIC8qIEVuYWJsZSBJUlFzIGlmZiBzdGFydGVkLiAqLworICAgIG91dGIoRUdBQ0ZSX05PUk0sIEUzM0dfR0FDRlIpOworCisgICAgLyogU2V0IHRoZSBpbnRlcnJ1cHQgbGluZS4gKi8KKyAgICBvdXRiX3AoKDB4MDQgPDwgKGRldi0+aXJxID09IDkgPyAyIDogZGV2LT5pcnEpKSwgRTMzR19JRENGUik7CisgICAgb3V0Yl9wKChXUkRfQ09VTlQgPDwgMSksIEUzM0dfRFJRQ05UKTsJLyogU2V0IGJ1cnN0IHNpemUgdG8gOCAqLworICAgIG91dGJfcCgweDIwLCBFMzNHX0RNQUFIKTsJLyogUHV0IGEgdmFsaWQgYWRkciBpbiB0aGUgR0EgRE1BICovCisgICAgb3V0Yl9wKDB4MDAsIEUzM0dfRE1BQUwpOworICAgIHJldHVybjsJCQkvKiBXZSBhbHdheXMgc3VjY2VlZCAqLworfQorCisvKgorICogRWl0aGVyIHVzZSB0aGUgc2hhcmVkIG1lbW9yeSAoaWYgZW5hYmxlZCBvbiB0aGUgYm9hcmQpIG9yIHB1dCB0aGUgcGFja2V0CisgKiBvdXQgdGhyb3VnaCB0aGUgQVNJQyBGSUZPLgorICovCitzdGF0aWMgdm9pZAorZWwyX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydF9wYWdlKQoreworICAgIHVuc2lnbmVkIHNob3J0IGludCAqd3JkOworICAgIGludCBib2d1c2NvdW50OwkJLyogdGltZW91dCBjb3VudGVyICovCisgICAgdW5zaWduZWQgc2hvcnQgd29yZDsJLyogdGVtcG9yYXJ5IGZvciBiZXR0ZXIgbWFjaGluZSBjb2RlICovCisgICAgdm9pZCBfX2lvbWVtICpiYXNlID0gZWlfc3RhdHVzLm1lbTsKKworICAgIGlmIChlaV9zdGF0dXMud29yZDE2KSAgICAgIC8qIFR4IHBhY2tldHMgZ28gaW50byBiYW5rIDAgb24gRUwyLzE2IGNhcmQgKi8KKwlvdXRiKEVHQUNGUl9SU0VMfEVHQUNGUl9UQ00sIEUzM0dfR0FDRlIpOworICAgIGVsc2UKKwlvdXRiKEVHQUNGUl9OT1JNLCBFMzNHX0dBQ0ZSKTsKKworICAgIGlmIChiYXNlKSB7CS8qIFNoYXJlZCBtZW1vcnkgdHJhbnNmZXIgKi8KKwltZW1jcHlfdG9pbyhiYXNlICsgKChzdGFydF9wYWdlIC0gZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UpIDw8IDgpLAorCQkJYnVmLCBjb3VudCk7CisJb3V0YihFR0FDRlJfTk9STSwgRTMzR19HQUNGUik7CS8qIEJhY2sgdG8gYmFuazEgaW4gY2FzZSBvbiBiYW5rMCAqLworCXJldHVybjsKKyAgICB9CisKKy8qCisgKiAgTm8gc2hhcmVkIG1lbW9yeSwgcHV0IHRoZSBwYWNrZXQgb3V0IHRoZSBvdGhlciB3YXkuCisgKiAgU2V0IHVwIHRoZW4gc3RhcnQgdGhlIGludGVybmFsIG1lbW9yeSB0cmFuc2ZlciB0byBUeCBTdGFydCBQYWdlCisgKi8KKworICAgIHdvcmQgPSAodW5zaWduZWQgc2hvcnQpc3RhcnRfcGFnZTsKKyAgICBvdXRiKHdvcmQmMHhGRiwgRTMzR19ETUFBSCk7CisgICAgb3V0Yih3b3JkPj44LCBFMzNHX0RNQUFMKTsKKworICAgIG91dGJfcCgoZWlfc3RhdHVzLmludGVyZmFjZV9udW0gPyBFQ05UUkxfQVVJIDogRUNOVFJMX1RISU4gKSB8IEVDTlRSTF9PVVRQVVQKKwkgICB8IEVDTlRSTF9TVEFSVCwgRTMzR19DTlRSTCk7CisKKy8qCisgKiAgSGVyZSBJIGFtIGdvaW5nIHRvIHdyaXRlIGRhdGEgdG8gdGhlIEZJRk8gYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4KKyAqICBOb3RlIHRoYXQgRTMzR19GSUZPSCBpcyBkZWZpbmVkIGluY29ycmVjdGx5LiBJdCBpcyByZWFsbHkKKyAqICBFMzNHX0ZJRk9MLCB0aGUgbG93ZXN0IHBvcnQgYWRkcmVzcyBmb3IgYm90aCB0aGUgYnl0ZSBhbmQKKyAqICB3b3JkIHdyaXRlLiBWYXJpYWJsZSAnY291bnQnIGlzIE5PVCBjaGVja2VkLiBDYWxsZXIgbXVzdCBzdXBwbHkgYQorICogIHZhbGlkIGNvdW50LiBOb3RlIHRoYXQgSSBtYXkgd3JpdGUgYSBoYXJtbGVzcyBleHRyYSBieXRlIHRvIHRoZQorICogIDgzOTAgaWYgdGhlIGJ5dGUtY291bnQgd2FzIG5vdCBldmVuLgorICovCisgICAgd3JkID0gKHVuc2lnbmVkIHNob3J0IGludCAqKSBidWY7CisgICAgY291bnQgID0gKGNvdW50ICsgMSkgPj4gMTsKKyAgICBmb3IoOzspCisgICAgeworICAgICAgICBib2d1c2NvdW50ID0gMHgxMDAwOworICAgICAgICB3aGlsZSAoKGluYihFMzNHX1NUQVRVUykgJiBFU1RBVF9EUFJEWSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIWJvZ3VzY291bnQtLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIiVzOiBGSUZPIGJsb2NrZWQgaW4gZWwyX2Jsb2NrX291dHB1dC5cbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgZWwyX3Jlc2V0XzgzOTAoZGV2KTsKKyAgICAgICAgICAgICAgICBnb3RvIGJsb2NrZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoY291bnQgPiBXUkRfQ09VTlQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHN3KEUzM0dfRklGT0gsIHdyZCwgV1JEX0NPVU5UKTsKKyAgICAgICAgICAgIHdyZCAgICs9IFdSRF9DT1VOVDsKKyAgICAgICAgICAgIGNvdW50IC09IFdSRF9DT1VOVDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHN3KEUzM0dfRklGT0gsIHdyZCwgY291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgYmxvY2tlZDo7CisgICAgb3V0Yl9wKGVpX3N0YXR1cy5pbnRlcmZhY2VfbnVtPT0wID8gRUNOVFJMX1RISU4gOiBFQ05UUkxfQVVJLCBFMzNHX0NOVFJMKTsKKyAgICByZXR1cm47Cit9CisKKy8qIFJlYWQgdGhlIDQgYnl0ZSwgcGFnZSBhbGlnbmVkIDgzOTAgc3BlY2lmaWMgaGVhZGVyLiAqLworc3RhdGljIHZvaWQKK2VsMl9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSkKK3sKKyAgICBpbnQgYm9ndXNjb3VudDsKKyAgICB2b2lkIF9faW9tZW0gKmJhc2UgPSBlaV9zdGF0dXMubWVtOworICAgIHVuc2lnbmVkIHNob3J0IHdvcmQ7CisKKyAgICBpZiAoYmFzZSkgeyAgICAgICAvKiBVc2UgdGhlIHNoYXJlZCBtZW1vcnkuICovCisJdm9pZCBfX2lvbWVtICpoZHJfc3RhcnQgPSBiYXNlICsgKChyaW5nX3BhZ2UgLSBFTDJfTUIxX1NUQVJUX1BHKTw8OCk7CisJbWVtY3B5X2Zyb21pbyhoZHIsIGhkcl9zdGFydCwgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSk7CisJaGRyLT5jb3VudCA9IGxlMTZfdG9fY3B1KGhkci0+Y291bnQpOworCXJldHVybjsKKyAgICB9CisKKy8qCisgKiAgTm8gc2hhcmVkIG1lbW9yeSwgdXNlIHByb2dyYW1tZWQgSS9PLgorICovCisKKyAgICB3b3JkID0gKHVuc2lnbmVkIHNob3J0KXJpbmdfcGFnZTsKKyAgICBvdXRiKHdvcmQmMHhGRiwgRTMzR19ETUFBSCk7CisgICAgb3V0Yih3b3JkPj44LCBFMzNHX0RNQUFMKTsKKworICAgIG91dGJfcCgoZWlfc3RhdHVzLmludGVyZmFjZV9udW0gPT0gMCA/IEVDTlRSTF9USElOIDogRUNOVFJMX0FVSSkgfCBFQ05UUkxfSU5QVVQKKwkgICB8IEVDTlRSTF9TVEFSVCwgRTMzR19DTlRSTCk7CisgICAgYm9ndXNjb3VudCA9IDB4MTAwMDsKKyAgICB3aGlsZSAoKGluYihFMzNHX1NUQVRVUykgJiBFU1RBVF9EUFJEWSkgPT0gMCkKKyAgICB7CisgICAgICAgIGlmKCFib2d1c2NvdW50LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiJXM6IEZJRk8gYmxvY2tlZCBpbiBlbDJfZ2V0XzgzOTBfaGRyLlxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgIG1lbXNldChoZHIsIDB4MDAsIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcikpOworICAgICAgICAgICAgZWwyX3Jlc2V0XzgzOTAoZGV2KTsKKyAgICAgICAgICAgIGdvdG8gYmxvY2tlZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpbnN3KEUzM0dfRklGT0gsIGhkciwgKHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcikpPj4gMSk7CisgICAgYmxvY2tlZDo7CisgICAgb3V0Yl9wKGVpX3N0YXR1cy5pbnRlcmZhY2VfbnVtID09IDAgPyBFQ05UUkxfVEhJTiA6IEVDTlRSTF9BVUksIEUzM0dfQ05UUkwpOworfQorCisKK3N0YXRpYyB2b2lkCitlbDJfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpCit7CisgICAgaW50IGJvZ3VzY291bnQgPSAwOworICAgIHZvaWQgX19pb21lbSAqYmFzZSA9IGVpX3N0YXR1cy5tZW07CisgICAgdW5zaWduZWQgc2hvcnQgaW50ICpidWY7CisgICAgdW5zaWduZWQgc2hvcnQgd29yZDsKKworICAgIC8qIE1heWJlIGVuYWJsZSBzaGFyZWQgbWVtb3J5IGp1c3QgYmUgdG8gYmUgc2FmZS4uLiBuYWhoLiovCisgICAgaWYgKGJhc2UpIHsJLyogVXNlIHRoZSBzaGFyZWQgbWVtb3J5LiAqLworCXJpbmdfb2Zmc2V0IC09IChFTDJfTUIxX1NUQVJUX1BHPDw4KTsKKwlpZiAocmluZ19vZmZzZXQgKyBjb3VudCA+IEVMMl9NRU1TSVpFKSB7CisJICAgIC8qIFdlIG11c3Qgd3JhcCB0aGUgaW5wdXQgbW92ZS4gKi8KKwkgICAgaW50IHNlbWlfY291bnQgPSBFTDJfTUVNU0laRSAtIHJpbmdfb2Zmc2V0OworCSAgICBtZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgYmFzZSArIHJpbmdfb2Zmc2V0LCBzZW1pX2NvdW50KTsKKwkgICAgY291bnQgLT0gc2VtaV9jb3VudDsKKwkgICAgbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEgKyBzZW1pX2NvdW50LCBiYXNlICsgZWlfc3RhdHVzLnByaXYsIGNvdW50KTsKKwl9IGVsc2UgeworCQkvKiBQYWNrZXQgaXMgaW4gb25lIGNodW5rIC0tIHdlIGNhbiBjb3B5ICsgY2tzdW0uICovCisJCWV0aF9pb19jb3B5X2FuZF9zdW0oc2tiLCBiYXNlICsgcmluZ19vZmZzZXQsIGNvdW50LCAwKTsKKwl9CisJcmV0dXJuOworICAgIH0KKworLyoKKyAqICBObyBzaGFyZWQgbWVtb3J5LCB1c2UgcHJvZ3JhbW1lZCBJL08uCisgKi8KKyAgICB3b3JkID0gKHVuc2lnbmVkIHNob3J0KSByaW5nX29mZnNldDsKKyAgICBvdXRiKHdvcmQ+PjgsIEUzM0dfRE1BQUgpOworICAgIG91dGIod29yZCYweEZGLCBFMzNHX0RNQUFMKTsKKworICAgIG91dGJfcCgoZWlfc3RhdHVzLmludGVyZmFjZV9udW0gPT0gMCA/IEVDTlRSTF9USElOIDogRUNOVFJMX0FVSSkgfCBFQ05UUkxfSU5QVVQKKwkgICB8IEVDTlRSTF9TVEFSVCwgRTMzR19DTlRSTCk7CisKKy8qCisgKiAgSGVyZSBJIGFsc28gdHJ5IHRvIGdldCBkYXRhIGFzIGZhc3QgYXMgcG9zc2libGUuIEkgYW0gYmV0dGluZyB0aGF0IEkKKyAqICBjYW4gcmVhZCBvbmUgZXh0cmEgYnl0ZSB3aXRob3V0IGNsb2JiZXJpbmcgYW55dGhpbmcgaW4gdGhlIGtlcm5lbCBiZWNhdXNlCisgKiAgdGhpcyB3b3VsZCBvbmx5IG9jY3VyIG9uIGFuIG9kZCBieXRlLWNvdW50IGFuZCBhbGxvY2F0aW9uIG9mIHNrYi0+ZGF0YQorICogIGlzIHdvcmQtYWxpZ25lZC4gVmFyaWFibGUgJ2NvdW50JyBpcyBOT1QgY2hlY2tlZC4gQ2FsbGVyIG11c3QgY2hlY2sKKyAqICBmb3IgYSB2YWxpZCBjb3VudC4KKyAqICBbVGhpcyBpcyBjdXJyZW50bHkgcXVpdGUgc2FmZS4uLi4gYnV0IGlmIG9uZSBkYXkgdGhlIDNjNTAzIGV4cGxvZGVzCisgKiAgIHlvdSBrbm93IHdoZXJlIHRvIGNvbWUgbG9va2luZyA7KV0KKyAqLworCisgICAgYnVmID0gICh1bnNpZ25lZCBzaG9ydCBpbnQgKikgc2tiLT5kYXRhOworICAgIGNvdW50ID0gIChjb3VudCArIDEpID4+IDE7CisgICAgZm9yKDs7KQorICAgIHsKKyAgICAgICAgYm9ndXNjb3VudCA9IDB4MTAwMDsKKyAgICAgICAgd2hpbGUgKChpbmIoRTMzR19TVEFUVVMpICYgRVNUQVRfRFBSRFkpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCFib2d1c2NvdW50LS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCIlczogRklGTyBibG9ja2VkIGluIGVsMl9ibG9ja19pbnB1dC5cbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgZWwyX3Jlc2V0XzgzOTAoZGV2KTsKKyAgICAgICAgICAgICAgICBnb3RvIGJsb2NrZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoY291bnQgPiBXUkRfQ09VTlQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluc3coRTMzR19GSUZPSCwgYnVmLCBXUkRfQ09VTlQpOworICAgICAgICAgICAgYnVmICAgKz0gV1JEX0NPVU5UOworICAgICAgICAgICAgY291bnQgLT0gV1JEX0NPVU5UOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW5zdyhFMzNHX0ZJRk9ILCBidWYsIGNvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGJsb2NrZWQ6OworICAgIG91dGJfcChlaV9zdGF0dXMuaW50ZXJmYWNlX251bSA9PSAwID8gRUNOVFJMX1RISU4gOiBFQ05UUkxfQVVJLCBFMzNHX0NOVFJMKTsKKyAgICByZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQgbmV0ZGV2X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzcHJpbnRmKGluZm8tPmJ1c19pbmZvLCAiSVNBIDB4JWx4IiwgZGV2LT5iYXNlX2FkZHIpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorfTsKKworI2lmZGVmIE1PRFVMRQorI2RlZmluZSBNQVhfRUwyX0NBUkRTCTQJLyogTWF4IG51bWJlciBvZiBFTDIgY2FyZHMgcGVyIG1vZHVsZSAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9lbDJbTUFYX0VMMl9DQVJEU107CitzdGF0aWMgaW50IGlvW01BWF9FTDJfQ0FSRFNdOworc3RhdGljIGludCBpcnFbTUFYX0VMMl9DQVJEU107CitzdGF0aWMgaW50IHhjdnJbTUFYX0VMMl9DQVJEU107CS8qIGNob29zZSBpbnQuIG9yIGV4dC4geGN2ciAqLworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheSh4Y3ZyLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBiYXNlIGFkZHJlc3MoZXMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSBudW1iZXIocykgKGFzc2lnbmVkKSIpOworTU9EVUxFX1BBUk1fREVTQyh4Y3ZyLCAidHJhbnNjZWl2ZXIocykgKDA9aW50ZXJuYWwsIDE9ZXh0ZXJuYWwpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIjNDb20gSVNBIEV0aGVyTGluayBJSSwgSUkvMTYgKDNjNTAzLCAzYzUwMy8xNikgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIFRoaXMgaXMgc2V0IHVwIHNvIHRoYXQgb25seSBhIHNpbmdsZSBhdXRvcHJvYmUgdGFrZXMgcGxhY2UgcGVyIGNhbGwuCitJU0EgZGV2aWNlIGF1dG9wcm9iZXMgb24gYSBydW5uaW5nIG1hY2hpbmUgYXJlIG5vdCByZWNvbW1lbmRlZC4gKi8KK2ludAoraW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCB0aGlzX2RldiwgZm91bmQgPSAwOworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX0VMMl9DQVJEUzsgdGhpc19kZXYrKykgeworCQlpZiAoaW9bdGhpc19kZXZdID09IDApICB7CisJCQlpZiAodGhpc19kZXYgIT0gMCkgYnJlYWs7IC8qIG9ubHkgYXV0b3Byb2JlIDFzdCBvbmUgKi8KKwkJCXByaW50ayhLRVJOX05PVElDRSAiM2M1MDMuYzogUHJlc2VudGx5IGF1dG9wcm9iaW5nIChub3QgcmVjb21tZW5kZWQpIGZvciBhIHNpbmdsZSBjYXJkLlxuIik7CisJCX0KKwkJZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisJCWRldi0+aXJxID0gaXJxW3RoaXNfZGV2XTsKKwkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07CisJCWRldi0+bWVtX2VuZCA9IHhjdnJbdGhpc19kZXZdOwkvKiBsb3cgNGJpdHMgPSB4Y3ZyIHNlbC4gKi8KKwkJaWYgKGRvX2VsMl9wcm9iZShkZXYpID09IDApIHsKKwkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7CisJCQkJZGV2X2VsMltmb3VuZCsrXSA9IGRldjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQl9CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjNjNTAzLmM6IE5vIDNjNTAzIGNhcmQgZm91bmQgKGkvbyA9IDB4JXgpLlxuIiwgaW9bdGhpc19kZXZdKTsKKwkJYnJlYWs7CisJfQorCWlmIChmb3VuZCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FTlhJTzsKK30KKwordm9pZAorY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgdGhpc19kZXY7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfRUwyX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZWwyW3RoaXNfZGV2XTsKKwkJaWYgKGRldikgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJfQorCX0KK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTAzLmggYi9kcml2ZXJzL25ldC8zYzUwMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZjhhNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC8zYzUwMy5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qIERlZmluaXRpb25zIGZvciB0aGUgM0NvbSAzYzUwMyBFdGhlcmxpbmsgMi4gKi8KKy8qIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR1BMLgorICAgTWFueSBvZiB0aGVzZSBuYW1lcyBhbmQgY29tbWVudHMgYXJlIGRpcmVjdGx5IGZyb20gdGhlIENyeW53ciBwYWNrZXQKKyAgIGRyaXZlcnMsIHdoaWNoIGFyZSByZWxlYXNlZCB1bmRlciB0aGUgR1BMLiAqLworCisjZGVmaW5lIEVMMkggKGRldi0+YmFzZV9hZGRyICsgMHg0MDApCisjZGVmaW5lIEVMMkwgKGRldi0+YmFzZV9hZGRyKQorCisvKiBWZW5kb3IgdW5pcXVlIGhhcmR3YXJlIGFkZHIuIHByZWZpeC4gM0NvbSBoYXMgMiBiZWNhdXNlIHRoZXkgcmFuCisgICBvdXQgb2YgYXZhaWxhYmxlIGFkZHJlc3NlcyBvbiB0aGUgZmlyc3Qgb25lLi4uICovCisKKyNkZWZpbmUgT0xEXzNDT01fSUQJMHgwMjYwOGMKKyNkZWZpbmUgTkVXXzNDT01fSUQJMHgwMDIwYWYKKworLyogU2hhcmVkIG1lbW9yeSBtYW5hZ2VtZW50IHBhcmFtZXRlcnMuIE5COiBUaGUgOCBiaXQgY2FyZHMgaGF2ZSBvbmx5CisgICBvbmUgYmFuayAoTUIxKSB3aGljaCBzZXJ2ZXMgYm90aCBUeCBhbmQgUnggcGFja2V0IHNwYWNlLiBUaGUgMTZiaXQKKyAgIGNhcmRzIGhhdmUgMiBiYW5rcywgTUIwIGZvciBUeCBwYWNrZXRzLCBhbmQgTUIxIGZvciBSeCBwYWNrZXRzLiAKKyAgIFlvdSBjaG9vc2Ugd2hpY2ggYmFuayBhcHBlYXJzIGluIHRoZSBzaC4gbWVtIHdpbmRvdyB3aXRoIEVHQUNGUl9NQlNuICovCisKKyNkZWZpbmUgRUwyX01CMF9TVEFSVF9QRwkoMHgwMCkJLyogRUwyLzE2IFR4IHBhY2tldHMgZ28gaW4gYmFuayAwICovCisjZGVmaW5lIEVMMl9NQjFfU1RBUlRfUEcJKDB4MjApCS8qIEZpcnN0IHBhZ2Ugb2YgYmFuayAxICovCisjZGVmaW5lIEVMMl9NQjFfU1RPUF9QRwkJKDB4NDApCS8qIExhc3QgcGFnZSArMSBvZiBiYW5rIDEgKi8KKworLyogM0NvbSAzYzUwMyBBU0lDIHJlZ2lzdGVycyAqLworI2RlZmluZSBFMzNHX1NUQVJUUEcJKEVMMkgrMCkJLyogU3RhcnQgcGFnZSwgbWF0Y2hpbmcgRU4wX1NUQVJUUEcgKi8KKyNkZWZpbmUgRTMzR19TVE9QUEcJKEVMMkgrMSkJLyogU3RvcCBwYWdlLCBtdXN0IG1hdGNoIEVOMF9TVE9QUEcgKi8KKyNkZWZpbmUgRTMzR19EUlFDTlQJKEVMMkgrMikJLyogRE1BIGJ1cnN0IGNvdW50ICovCisjZGVmaW5lIEUzM0dfSU9CQVNFCShFTDJIKzMpCS8qIFJlYWQgb2YgSS9PIGJhc2UganVtcGVycy4gKi8KKwkvKiAobm9uLXVzZWZ1bCwgYnV0IGl0IGFsc28gYXBwZWFycyBhdCB0aGUgZW5kIG9mIEVQUk9NIHNwYWNlKSAqLworI2RlZmluZSBFMzNHX1JPTUJBU0UJKEVMMkgrNCkJLyogUmVhZCBvZiBtZW1vcnkgYmFzZSBqdW1wZXJzLiAqLworI2RlZmluZSBFMzNHX0dBQ0ZSCShFTDJIKzUpCS8qIENvbmZpZy9zZXR1cCBiaXRzIGZvciB0aGUgQVNJQyBHQSAqLworI2RlZmluZSBFMzNHX0NOVFJMCShFTDJIKzYpCS8qIEJvYXJkJ3MgbWFpbiBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIEUzM0dfU1RBVFVTCShFTDJIKzcpCS8qIFN0YXR1cyBvbiBjb21wbGV0aW9ucy4gKi8KKyNkZWZpbmUgRTMzR19JRENGUgkoRUwySCs4KQkvKiBJbnRlcnJ1cHQvRE1BIGNvbmZpZyByZWdpc3RlciAqLworCQkJCS8qIChXaGljaCBJUlEgdG8gYXNzZXJ0LCBETUEgY2hhbiB0byB1c2UpICovCisjZGVmaW5lIEUzM0dfRE1BQUgJKEVMMkgrOSkJLyogSGlnaCBieXRlIG9mIERNQSBhZGRyZXNzIHJlZyAqLworI2RlZmluZSBFMzNHX0RNQUFMCShFTDJIKzEwKQkvKiBMb3cgYnl0ZSBvZiBETUEgYWRkcmVzcyByZWcgKi8KKy8qICJWZWN0b3IgcG9pbnRlciIgLSBpZiB0aGlzIGFkZHJlc3MgbWF0Y2hlcyBhIHJlYWQsIHRoZSBFUFJPTSAocmF0aGVyIHRoYW4KKyAgIHNoYXJlZCBSQU0pIGlzIG1hcHBlZCBpbnRvIG1lbW9yeSBzcGFjZS4gKi8KKyNkZWZpbmUgRTMzR19WUDIJKEVMMkgrMTEpCisjZGVmaW5lIEUzM0dfVlAxCShFTDJIKzEyKQorI2RlZmluZSBFMzNHX1ZQMAkoRUwySCsxMykKKyNkZWZpbmUgRTMzR19GSUZPSAkoRUwySCsxNCkJLyogRklGTyBmb3IgcHJvZ3JhbW1lZCBJL08gbW92ZXMgKi8KKyNkZWZpbmUgRTMzR19GSUZPTAkoRUwySCsxNSkJLyogLi4uIGxvdyBieXRlIG9mIGFib3ZlLiAqLworCisvKiBCaXRzIGluIEUzM0dfQ05UUkwgcmVnaXN0ZXI6ICovCisKKyNkZWZpbmUgRUNOVFJMX1JFU0VUCSgweDAxKQkvKiBTb2Z0d2FyZSByZXNldCBvZiB0aGUgQVNJQyBhbmQgODM5MCAqLworI2RlZmluZSBFQ05UUkxfVEhJTgkoMHgwMikJLyogT25ib2FyZCB4Y3ZyIGVuYWJsZSwgQVVJIGRpc2FibGUgKi8KKyNkZWZpbmUgRUNOVFJMX0FVSQkoMHgwMCkJLyogT25ib2FyZCB4Y3ZyIGRpc2FibGUsIEFVSSBlbmFibGUgKi8KKyNkZWZpbmUgRUNOVFJMX1NBUFJPTQkoMHgwNCkJLyogTWFwIHRoZSBzdGF0aW9uIGFkZHJlc3MgcHJvbSAqLworI2RlZmluZSBFQ05UUkxfREJMQkZSCSgweDIwKQkvKiBGSUZPIGNvbmZpZ3VyYXRpb24gYml0ICovCisjZGVmaW5lIEVDTlRSTF9PVVRQVVQJKDB4NDApCS8qIFBDLXRvLTNDNTAzIGRpcmVjdGlvbiBpZiAxICovCisjZGVmaW5lIEVDTlRSTF9JTlBVVAkoMHgwMCkJLyogM0M1MDMtdG8tUEMgZGlyZWN0aW9uIGlmIDAgKi8KKyNkZWZpbmUgRUNOVFJMX1NUQVJUCSgweDgwKQkvKiBTdGFydCB0aGUgRE1BIGxvZ2ljICovCisKKy8qIEJpdHMgaW4gRTMzR19TVEFUVVMgcmVnaXN0ZXI6ICovCisKKyNkZWZpbmUgRVNUQVRfRFBSRFkJKDB4ODApCS8qIERhdGEgcG9ydCAob2YgRklGTykgcmVhZHkgKi8KKyNkZWZpbmUgRVNUQVRfVUZMVwkoMHg0MCkJLyogVHJpZWQgdG8gcmVhZCBGSUZPIHdoZW4gaXQgd2FzIGVtcHR5ICovCisjZGVmaW5lIEVTVEFUX09GTFcJKDB4MjApCS8qIFRyaWVkIHRvIHdyaXRlIEZJRk8gd2hlbiBpdCB3YXMgZnVsbCAqLworI2RlZmluZSBFU1RBVF9EVEMJKDB4MTApCS8qIFRlcm1pbmFsIENvdW50IGZyb20gUEMgYnVzIERNQSBsb2dpYyAqLworI2RlZmluZSBFU1RBVF9ESVAJKDB4MDgpCS8qIERNQSBJbiBQcm9ncmVzcyAqLworCisvKiBCaXRzIGluIEUzM0dfR0FDRlIgcmVnaXN0ZXI6ICovCisKKyNkZWZpbmUgRUdBQ0ZSX05JTQkoMHg4MCkJLyogTklDIGludGVycnVwdCBtYXNrICovCisjZGVmaW5lIEVHQUNGUl9UQ00JKDB4NDApCS8qIERNQSB0ZXJtLiBjb3VudCBpbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSBFR0FDRlJfUlNFTAkoMHgwOCkJLyogTWFwIGEgYmFuayBvZiBjYXJkIG1lbSBpbnRvIHN5c3RlbSBtZW0gKi8KKyNkZWZpbmUgRUdBQ0ZSX01CUzIJKDB4MDQpCS8qIE1lbW9yeSBiYW5rIHNlbGVjdCwgYml0IDIuICovCisjZGVmaW5lIEVHQUNGUl9NQlMxCSgweDAyKQkvKiBNZW1vcnkgYmFuayBzZWxlY3QsIGJpdCAxLiAqLworI2RlZmluZSBFR0FDRlJfTUJTMAkoMHgwMSkJLyogTWVtb3J5IGJhbmsgc2VsZWN0LCBiaXQgMC4gKi8KKworI2RlZmluZSBFR0FDRlJfTk9STQkoMHg0OSkJLyogVENNIHwgUlNFTCB8IE1CUzAgKi8KKyNkZWZpbmUgRUdBQ0ZSX0lSUU9GRgkoMHhjOSkJLyogVENNIHwgUlNFTCB8IE1CUzAgfCBOSU0gKi8KKworLyoKKwlNQlMyCU1CUzEJTUJTMAlTaC4gbWVtIHdpbmRvd3MgY2FyZCBtZW0gYXQ6CisJLS0tLQktLS0tCS0tLS0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkwCTAJMAkweDAwMDAgLS0gYmFuayAwCisJMAkwCTEJMHgyMDAwIC0tIGJhbmsgMSAob25seSBjaG9pY2UgZm9yIDhiaXQgY2FyZCkKKwkwCTEJMAkweDQwMDAgLS0gYmFuayAyLCBub3QgdXNlZAorCTAJMQkxCTB4NjAwMCAtLSBiYW5rIDMsIG5vdCB1c2VkCisKK1RoZXJlIHdhcyBnb2luZyB0byBiZSBhIDMyayBjYXJkIHRoYXQgdXNlZCBiYW5rIDIgYW5kIDMsIGJ1dCBpdCAKK25ldmVyIGdvdCBwcm9kdWNlZC4KKworKi8KKworCisvKiBFbmQgb2YgM0M1MDMgcGFyYW1ldGVyIGRlZmluaXRpb25zICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUwNS5jIGIvZHJpdmVycy9uZXQvM2M1MDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmZhOGNjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvM2M1MDUuYwpAQCAtMCwwICsxLDE2OTAgQEAKKy8qCisgKiBMaW51eCBFdGhlcm5ldCBkZXZpY2UgZHJpdmVyIGZvciB0aGUgM0NvbSBFdGhlcmxpbmsgUGx1cyAoM0M1MDUpCisgKiAgICAgIEJ5IENyYWlnIFNvdXRoZXJlbiwgSnVoYSBMYWlobyBhbmQgUGhpbGlwIEJsdW5kZWxsCisgKgorICogM2M1MDUuYyAgICAgIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgYW4gaW50ZXJmYWNlIHRvIHRoZSAzQ29tCisgKiAgICAgICAgICAgICAgRXRoZXJsaW5rIFBsdXMgKDNjNTA1KSBFdGhlcm5ldCBjYXJkLiBMaW51eCBkZXZpY2UKKyAqICAgICAgICAgICAgICBkcml2ZXIgaW50ZXJmYWNlIHJldmVyc2UgZW5naW5lZXJlZCBmcm9tIHRoZSBMaW51eCAzQzUwOQorICogICAgICAgICAgICAgIGRldmljZSBkcml2ZXJzLiBTb21lIDNDNTA1IGluZm9ybWF0aW9uIGdsZWFuZWQgZnJvbQorICogICAgICAgICAgICAgIHRoZSBDcnlud3IgcGFja2V0IGRyaXZlci4gU3RpbGwgdGhpcyBkcml2ZXIgd291bGQgbm90CisgKiAgICAgICAgICAgICAgYmUgaGVyZSB3aXRob3V0IDNDNTA1IHRlY2huaWNhbCByZWZlcmVuY2UgcHJvdmlkZWQgYnkKKyAqICAgICAgICAgICAgICAzQ29tLgorICoKKyAqICRJZDogM2M1MDUuYyx2IDEuMTAgMTk5Ni8wNC8xNiAxMzowNjoyNyBwaGlsIEV4cCAkCisgKgorICogQXV0aG9yczogICAgIExpbnV4IDNjNTA1IGRldmljZSBkcml2ZXIgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgIENyYWlnIFNvdXRoZXJlbiwgPGNyYWlnc0BpbmVsdWtpLmFwYW5hLm9yZy5hdT4KKyAqICAgICAgICAgICAgICBGaW5hbCBkZWJ1Z2dpbmcgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgIEFuZHJldyBUcmlkZ2VsbCwgPHRyaWRnZUBuaW1idXMuYW51LmVkdS5hdT4KKyAqICAgICAgICAgICAgICBBdXRvIGlycS9hZGRyZXNzLCB0dW5pbmcsIGNsZWFudXAgYW5kIHYxLjEuNCsga2VybmVsIG1vZHMgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgIEp1aGEgTGFpaG8sIDxqbGFpaG9AaWNoYW9zLm51bGxuZXQuZmk+CisgKiAgICAgICAgICAgICAgTGludXggM0M1MDkgZHJpdmVyIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICBEb25hbGQgQmVja2VyLCA8YmVja2VyQHN1cGVyLm9yZz4KKyAqCQkJKE5vdyBhdCA8YmVja2VyQHNjeWxkLmNvbT4pCisgKiAgICAgICAgICAgICAgQ3J5bndyIHBhY2tldCBkcml2ZXIgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgIEtyaXNobmFuIEdvcGFsYW4gYW5kIEdyZWdnIFN0ZWZhbmNpaywKKyAqICAgICAgICAgICAgICAgICAgICAgIENsZW1zb24gVW5pdmVyc2l0eSBFbmdpbmVlcmluZyBDb21wdXRlciBPcGVyYXRpb25zLgorICogICAgICAgICAgICAgICAgICAgICAgUG9ydGlvbnMgb2YgdGhlIGNvZGUgaGF2ZSBiZWVuIGFkYXB0ZWQgZnJvbSB0aGUgM2M1MDUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlciBmb3IgTkNTQSBUZWxuZXQgYnkgQnJ1Y2UgT3JjaGFyZCBhbmQgbGF0ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkIGJ5IFdhcnJlbiBWYW4gSG91dGVuIGFuZCBrcnVzQGRpa3UuZGsuCisgKiAgICAgICAgICAgICAgM0M1MDUgdGVjaG5pY2FsIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICBUZXJyeSBNdXJwaHksIG9mIDNDb20gTmV0d29yayBBZGFwdGVyIERpdmlzaW9uCisgKiAgICAgICAgICAgICAgTGludXggMS4zLjAgY2hhbmdlcyBieQorICogICAgICAgICAgICAgICAgICAgICAgQWxhbiBDb3ggPEFsYW4uQ294QGxpbnV4Lm9yZz4KKyAqICAgICAgICAgICAgICBNb3JlIGRlYnVnZ2luZywgRE1BIHN1cHBvcnQsIGN1cnJlbnRseSBtYWludGFpbmVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+CisgKiAgICAgICAgICAgICAgTXVsdGljYXJkL3NvZnQgY29uZmlndXJhYmxlIGRtYSBjaGFubmVsL3JldiAyIGhhcmR3YXJlIHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgICAgIGJ5IENocmlzdG9waGVyIENvbGxpbnMgPGNjb2xsaW5zQHBjdWcub3JnLmF1PgorICoJCUV0aHRvb2wgc3VwcG9ydCAoamdhcnppayksIDExLzE3LzIwMDEKKyAqLworCisjZGVmaW5lIERSVl9OQU1FCSIzYzUwNSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMTBhIgorCisKKy8qIFRoZW9yeSBvZiBvcGVyYXRpb246CisgKgorICogVGhlIDNjNTA1IGlzIHF1aXRlIGFuIGludGVsbGlnZW50IGJvYXJkLiAgQWxsIGNvbW11bmljYXRpb24gd2l0aCBpdCBpcyBkb25lCisgKiBieSBtZWFucyBvZiBQcmltYXJ5IENvbW1hbmQgQmxvY2tzIChQQ0JzKTsgdGhlc2UgYXJlIHRyYW5zZmVycmVkIHVzaW5nIFBJTworICogdGhyb3VnaCB0aGUgY29tbWFuZCByZWdpc3Rlci4gIFRoZSBjYXJkIGhhcyAyNTZrIG9mIG9uLWJvYXJkIFJBTSwgd2hpY2ggaXMKKyAqIHVzZWQgdG8gYnVmZmVyIHJlY2VpdmVkIHBhY2tldHMuICBJdCBtaWdodCBzZWVtIGF0IGZpcnN0IHRoYXQgbW9yZSBidWZmZXJzCisgKiBhcmUgYmV0dGVyLCBidXQgaW4gZmFjdCB0aGlzIGlzbid0IHRydWUuICBGcm9tIG15IHRlc3RzLCBpdCBzZWVtcyB0aGF0CisgKiBtb3JlIHRoYW4gYWJvdXQgMTAgYnVmZmVycyBhcmUgdW5uZWNlc3NhcnksIGFuZCB0aGVyZSBpcyBhIG5vdGljZWFibGUKKyAqIHBlcmZvcm1hbmNlIGhpdCBpbiBoYXZpbmcgbW9yZSBhY3RpdmUgb24gdGhlIGNhcmQuICBTbyB0aGUgbWFqb3JpdHkgb2YgdGhlCisgKiBjYXJkJ3MgbWVtb3J5IGlzbid0LCBpbiBmYWN0LCB1c2VkLiAgU2FkbHksIHRoZSBjYXJkIG9ubHkgaGFzIG9uZSB0cmFuc21pdAorICogYnVmZmVyIGFuZCwgc2hvcnQgb2YgbG9hZGluZyBvdXIgb3duIGZpcm13YXJlIGludG8gaXQgKHdoaWNoIGlzIHdoYXQgc29tZQorICogZHJpdmVycyByZXNvcnQgdG8pIHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhpcy4KKyAqCisgKiBXZSBrZWVwIHVwIHRvIDQgInJlY2VpdmUgcGFja2V0IiBjb21tYW5kcyBhY3RpdmUgb24gdGhlIGJvYXJkIGF0IGEgdGltZS4KKyAqIFdoZW4gYSBwYWNrZXQgY29tZXMgaW4sIHNvIGxvbmcgYXMgdGhlcmUgaXMgYSByZWNlaXZlIGNvbW1hbmQgYWN0aXZlLCB0aGUKKyAqIGJvYXJkIHdpbGwgc2VuZCB1cyBhICJwYWNrZXQgcmVjZWl2ZWQiIFBDQiBhbmQgdGhlbiBhZGQgdGhlIGRhdGEgZm9yIHRoYXQKKyAqIHBhY2tldCB0byB0aGUgRE1BIHF1ZXVlLiAgSWYgYSBETUEgdHJhbnNmZXIgaXMgbm90IGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlCisgKiBzZXQgb25lIHVwIHRvIHN0YXJ0IHVwbG9hZGluZyB0aGUgZGF0YS4gIFdlIGhhdmUgdG8gbWFpbnRhaW4gYSBsaXN0IG9mCisgKiBiYWNrbG9nZ2VkIHJlY2VpdmUgcGFja2V0cywgYmVjYXVzZSB0aGUgY2FyZCBtYXkgZGVjaWRlIHRvIHRlbGwgdXMgYWJvdXQKKyAqIGEgbmV3bHktYXJyaXZlZCBwYWNrZXQgYXQgYW55IHRpbWUsIGFuZCB3ZSBtYXkgbm90IGJlIGFibGUgdG8gc3RhcnQgYSBETUEKKyAqIHRyYW5zZmVyIGltbWVkaWF0ZWx5IChpZSBvbmUgbWF5IGFscmVhZHkgYmUgZ29pbmcgb24pLiAgV2UgY2FuJ3QgTkFLIHRoZQorICogUENCLCBiZWNhdXNlIHRoZW4gaXQgd291bGQgdGhyb3cgdGhlIHBhY2tldCBhd2F5LgorICoKKyAqIFRyeWluZyB0byBzZW5kIGEgUENCIHRvIHRoZSBjYXJkIGF0IHRoZSB3cm9uZyBtb21lbnQgc2VlbXMgdG8gaGF2ZSBiYWQKKyAqIGVmZmVjdHMuICBJZiB3ZSBzZW5kIGl0IGEgdHJhbnNtaXQgUENCIHdoaWxlIGEgcmVjZWl2ZSBETUEgaXMgaGFwcGVuaW5nLAorICogaXQgd2lsbCBqdXN0IE5BSyB0aGUgUENCIGFuZCBzbyB3ZSB3aWxsIGhhdmUgd2FzdGVkIG91ciB0aW1lLiAgV29yc2UsIGl0CisgKiBzb21ldGltZXMgc2VlbXMgdG8gaW50ZXJydXB0IHRoZSB0cmFuc2Zlci4gIFRoZSBtYWpvcml0eSBvZiB0aGUgbG93LWxldmVsCisgKiBjb2RlIGlzIHByb3RlY3RlZCBieSBvbmUgaHVnZSBzZW1hcGhvcmUgLS0gImJ1c3kiIC0tIHdoaWNoIGlzIHNldCB3aGVuZXZlcgorICogaXQgcHJvYmFibHkgaXNuJ3Qgc2FmZSB0byBkbyBhbnl0aGluZyB0byB0aGUgY2FyZC4gIFRoZSByZWNlaXZlIHJvdXRpbmUKKyAqIG11c3QgZ2FpbiBhIGxvY2sgb24gImJ1c3kiIGJlZm9yZSBpdCBjYW4gc3RhcnQgYSBETUEgdHJhbnNmZXIsIGFuZCB0aGUKKyAqIHRyYW5zbWl0IHJvdXRpbmUgbXVzdCBnYWluIGEgbG9jayBiZWZvcmUgaXQgc2VuZHMgdGhlIGZpcnN0IFBDQiB0byB0aGUgY2FyZC4KKyAqIFRoZSBzZW5kX3BjYigpIHJvdXRpbmUgYWxzbyBoYXMgYW4gaW50ZXJuYWwgc2VtYXBob3JlIHRvIHByb3RlY3QgaXQgYWdhaW5zdAorICogYmVpbmcgcmUtZW50ZXJlZCAod2hpY2ggd291bGQgYmUgZGlzYXN0cm91cykgLS0gdGhpcyBpcyBuZWVkZWQgYmVjYXVzZQorICogc2V2ZXJhbCB0aGluZ3MgY2FuIGhhcHBlbiBhc3luY2hyb25vdXNseSAocmUtcHJpbWluZyB0aGUgcmVjZWl2ZXIgYW5kCisgKiBhc2tpbmcgdGhlIGNhcmQgZm9yIHN0YXRpc3RpY3MsIGZvciBleGFtcGxlKS4gIHNlbmRfcGNiKCkgd2lsbCBhbHNvIHJlZnVzZQorICogdG8gdGFsayB0byB0aGUgY2FyZCBhdCBhbGwgaWYgYSBETUEgdXBsb2FkIGlzIGhhcHBlbmluZy4gIFRoZSBoaWdoZXItbGV2ZWwKKyAqIG5ldHdvcmtpbmcgY29kZSB3aWxsIHJlc2NoZWR1bGUgYSBsYXRlciByZXRyeSBpZiBzb21lIHBhcnQgb2YgdGhlIGRyaXZlcgorICogaXMgYmxvY2tlZC4gIEluIHByYWN0aWNlLCB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBoYXBwZW4gdmVyeSBvZnRlbi4KKyAqLworCisvKiBUaGlzIGRyaXZlciBtYXkgbm93IHdvcmsgd2l0aCByZXZpc2lvbiAyLnggaGFyZHdhcmUsIHNpbmNlIGFsbCB0aGUgcmVhZAorICogb3BlcmF0aW9ucyBvbiB0aGUgSENSIGhhdmUgYmVlbiByZW1vdmVkICh3ZSBub3cga2VlcCBvdXIgb3duIHNvZnRjb3B5KS4KKyAqIEJ1dCBJIGRvbid0IGhhdmUgYW4gb2xkIGNhcmQgdG8gdGVzdCBpdCBvbi4KKyAqCisgKiBUaGlzIGhhcyBoYWQgdGhlIGJhZCBlZmZlY3QgdGhhdCB0aGUgYXV0b3Byb2JlIHJvdXRpbmUgaXMgbm93IGEgYml0CisgKiBsZXNzIGZyaWVuZGx5IHRvIG90aGVyIGRldmljZXMuICBIb3dldmVyLCBpdCB3YXMgbmV2ZXIgdmVyeSBnb29kLgorICogYmVmb3JlLCBzbyBJIGRvdWJ0IGl0IHdpbGwgaHVydCBhbnlib2R5LgorICovCisKKy8qIFRoZSBkcml2ZXIgaXMgYSBtZXNzLiAgSSB0b29rIENyYWlnJ3MgYW5kIEp1aGEncyBjb2RlLCBhbmQgaGFja2VkIGl0IGZpcnN0bHkKKyAqIHRvIG1ha2UgaXQgbW9yZSByZWxpYWJsZSwgYW5kIHNlY29uZGx5IHRvIGFkZCBETUEgbW9kZS4gIE1hbnkgdGhpbmdzIGNvdWxkCisgKiBwcm9iYWJseSBiZSBkb25lIGJldHRlcjsgdGhlIGNvbmN1cnJlbmN5IHByb3RlY3Rpb24gaXMgcGFydGljdWxhcmx5IGF3ZnVsLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSAiM2M1MDUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBkZWZpbmUgZGVidWcgbWVzc2FnZXMgaGVyZSBhcyBjb21tb24gc3RyaW5ncyB0byByZWR1Y2Ugc3BhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY29uc3QgY2hhciBmaWxlbmFtZVtdID0gX19GSUxFX187CisKK3N0YXRpYyBjb25zdCBjaGFyIHRpbWVvdXRfbXNnW10gPSAiKioqIHRpbWVvdXQgYXQgJXM6JXMgKGxpbmUgJWQpICoqKlxuIjsKKyNkZWZpbmUgVElNRU9VVF9NU0cobGluZW5vKSBcCisJcHJpbnRrKHRpbWVvdXRfbXNnLCBmaWxlbmFtZSxfX0ZVTkNUSU9OX18sKGxpbmVubykpCisKK3N0YXRpYyBjb25zdCBjaGFyIGludmFsaWRfcGNiX21zZ1tdID0KKyIqKiogaW52YWxpZCBwY2IgbGVuZ3RoICVkIGF0ICVzOiVzIChsaW5lICVkKSAqKipcbiI7CisjZGVmaW5lIElOVkFMSURfUENCX01TRyhsZW4pIFwKKwlwcmludGsoaW52YWxpZF9wY2JfbXNnLCAobGVuKSxmaWxlbmFtZSxfX0ZVTkNUSU9OX18sX19MSU5FX18pCisKK3N0YXRpYyBjaGFyIHNlYXJjaF9tc2dbXSBfX2luaXRkYXRhID0gS0VSTl9JTkZPICIlczogTG9va2luZyBmb3IgM2M1MDUgYWRhcHRlciBhdCBhZGRyZXNzICUjeC4uLiI7CisKK3N0YXRpYyBjaGFyIHN0aWxsbG9va2luZ19tc2dbXSBfX2luaXRkYXRhID0gInN0aWxsIGxvb2tpbmcuLi4iOworCitzdGF0aWMgY2hhciBmb3VuZF9tc2dbXSBfX2luaXRkYXRhID0gImZvdW5kLlxuIjsKKworc3RhdGljIGNoYXIgbm90Zm91bmRfbXNnW10gX19pbml0ZGF0YSA9ICJub3QgZm91bmQgKHJlYXNvbiA9ICVkKVxuIjsKKworc3RhdGljIGNoYXIgY291bGRub3RfbXNnW10gX19pbml0ZGF0YSA9IEtFUk5fSU5GTyAiJXM6IDNjNTA1IG5vdCBmb3VuZFxuIjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICB2YXJpb3VzIG90aGVyIGRlYnVnIHN0dWZmCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIEVMUF9ERUJVRworc3RhdGljIGludCBlbHBfZGVidWcgPSBFTFBfREVCVUc7CisjZWxzZQorc3RhdGljIGludCBlbHBfZGVidWc7CisjZW5kaWYKKyNkZWZpbmUgZGVidWcgZWxwX2RlYnVnCisKKy8qCisgKiAgMCA9IG5vIG1lc3NhZ2VzICh3ZWxsLCBzb21lKQorICogIDEgPSBtZXNzYWdlcyB3aGVuIGhpZ2ggbGV2ZWwgY29tbWFuZHMgcGVyZm9ybWVkCisgKiAgMiA9IG1lc3NhZ2VzIHdoZW4gbG93IGxldmVsIGNvbW1hbmRzIHBlcmZvcm1lZAorICogIDMgPSBtZXNzYWdlcyB3aGVuIGludGVycnVwdHMgcmVjZWl2ZWQKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB1c2VmdWwgbWFjcm9zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCVRSVUUKKyNkZWZpbmUJVFJVRQkxCisjZW5kaWYKKworI2lmbmRlZglGQUxTRQorI2RlZmluZQlGQUxTRQkwCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBMaXN0IG9mIEkvTy1hZGRyZXNzZXMgd2UgdHJ5IHRvIGF1dG8tc2Vuc2UKKyAqIExhc3QgZWxlbWVudCBNVVNUIEJFIDAhCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgYWRkcl9saXN0W10gX19pbml0ZGF0YSA9IHsweDMwMCwgMHgyODAsIDB4MzEwLCAwfTsKKworLyogRG1hIE1lbW9yeSByZWxhdGVkIHN0dWZmICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRtYV9tZW1fYWxsb2MoaW50IHNpemUpCit7CisJaW50IG9yZGVyID0gZ2V0X29yZGVyKHNpemUpOworCXJldHVybiBfX2dldF9kbWFfcGFnZXMoR0ZQX0tFUk5FTCwgb3JkZXIpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZ1bmN0aW9ucyBmb3IgSS9PIChub3RlIHRoZSBpbmxpbmUgISkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBpbmJfc3RhdHVzKHVuc2lnbmVkIGludCBiYXNlX2FkZHIpCit7CisJcmV0dXJuIGluYihiYXNlX2FkZHIgKyBQT1JUX1NUQVRVUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGluYl9jb21tYW5kKHVuc2lnbmVkIGludCBiYXNlX2FkZHIpCit7CisJcmV0dXJuIGluYihiYXNlX2FkZHIgKyBQT1JUX0NPTU1BTkQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb3V0Yl9jb250cm9sKHVuc2lnbmVkIGNoYXIgdmFsLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW91dGIodmFsLCBkZXYtPmJhc2VfYWRkciArIFBPUlRfQ09OVFJPTCk7CisJKChlbHBfZGV2aWNlICopKGRldi0+cHJpdikpLT5oY3JfdmFsID0gdmFsOworfQorCisjZGVmaW5lIEhDUl9WQUwoeCkgICAoKChlbHBfZGV2aWNlICopKCh4KS0+cHJpdikpLT5oY3JfdmFsKQorCitzdGF0aWMgaW5saW5lIHZvaWQgb3V0Yl9jb21tYW5kKHVuc2lnbmVkIGNoYXIgdmFsLCB1bnNpZ25lZCBpbnQgYmFzZV9hZGRyKQoreworCW91dGIodmFsLCBiYXNlX2FkZHIgKyBQT1JUX0NPTU1BTkQpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBiYWNrbG9nX25leHQodW5zaWduZWQgaW50IG4pCit7CisJcmV0dXJuIChuICsgMSkgJSBCQUNLTE9HX1NJWkU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICB1c2VmdWwgZnVuY3Rpb25zIGZvciBhY2Nlc3NpbmcgdGhlIGFkYXB0ZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiB1c2UgdGhpcyByb3V0aW5lIHdoZW4gYWNjZXNzaW5nIHRoZSBBU0YgYml0cyBhcyB0aGV5IGFyZQorICogY2hhbmdlZCBhc3luY2hyb25vdXNseSBieSB0aGUgYWRhcHRlcgorICovCisKKy8qIGdldCBhZGFwdGVyIFBDQiBzdGF0dXMgKi8KKyNkZWZpbmUJR0VUX0FTRihhZGRyKSBcCisJKGdldF9zdGF0dXMoYWRkcikmQVNGX1BDQl9NQVNLKQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfc3RhdHVzKHVuc2lnbmVkIGludCBiYXNlX2FkZHIpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIDEwKkhaLzEwMDsKKwlyZWdpc3RlciBpbnQgc3RhdDE7CisJZG8geworCQlzdGF0MSA9IGluYl9zdGF0dXMoYmFzZV9hZGRyKTsKKwl9IHdoaWxlIChzdGF0MSAhPSBpbmJfc3RhdHVzKGJhc2VfYWRkcikgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpOworCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQpKQorCQlUSU1FT1VUX01TRyhfX0xJTkVfXyk7CisJcmV0dXJuIHN0YXQxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2hzZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaHNmKQoreworCWVscF9kZXZpY2UgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisJb3V0Yl9jb250cm9sKChIQ1JfVkFMKGRldikgJiB+SFNGX1BDQl9NQVNLKSB8IGhzZiwgZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgc3RhcnRfcmVjZWl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqLCBwY2Jfc3RydWN0ICopOworCitpbmxpbmUgc3RhdGljIHZvaWQgYWRhcHRlcl9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwllbHBfZGV2aWNlICphZGFwdGVyID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGNoYXIgb3JpZ19oY3IgPSBhZGFwdGVyLT5oY3JfdmFsOworCisJb3V0Yl9jb250cm9sKDAsIGRldik7CisKKwlpZiAoaW5iX3N0YXR1cyhkZXYtPmJhc2VfYWRkcikgJiBBQ1JGKSB7CisJCWRvIHsKKwkJCWluYl9jb21tYW5kKGRldi0+YmFzZV9hZGRyKTsKKwkJCXRpbWVvdXQgPSBqaWZmaWVzICsgMipIWi8xMDA7CisJCQl3aGlsZSAodGltZV9iZWZvcmVfZXEoamlmZmllcywgdGltZW91dCkgJiYgIShpbmJfc3RhdHVzKGRldi0+YmFzZV9hZGRyKSAmIEFDUkYpKTsKKwkJfSB3aGlsZSAoaW5iX3N0YXR1cyhkZXYtPmJhc2VfYWRkcikgJiBBQ1JGKTsKKwkJc2V0X2hzZihkZXYsIEhTRl9QQ0JfTkFLKTsKKwl9CisJb3V0Yl9jb250cm9sKGFkYXB0ZXItPmhjcl92YWwgfCBBVFROIHwgRElSLCBkZXYpOworCW1kZWxheSgxMCk7CisJb3V0Yl9jb250cm9sKGFkYXB0ZXItPmhjcl92YWwgJiB+QVRUTiwgZGV2KTsKKwltZGVsYXkoMTApOworCW91dGJfY29udHJvbChhZGFwdGVyLT5oY3JfdmFsIHwgRkxTSCwgZGV2KTsKKwltZGVsYXkoMTApOworCW91dGJfY29udHJvbChhZGFwdGVyLT5oY3JfdmFsICYgfkZMU0gsIGRldik7CisJbWRlbGF5KDEwKTsKKworCW91dGJfY29udHJvbChvcmlnX2hjciwgZGV2KTsKKwlpZiAoIXN0YXJ0X3JlY2VpdmUoZGV2LCAmYWRhcHRlci0+dHhfcGNiKSkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogc3RhcnQgcmVjZWl2ZSBjb21tYW5kIGZhaWxlZCBcbiIsIGRldi0+bmFtZSk7Cit9CisKKy8qIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IGEgRE1BIHRyYW5zZmVyIGhhc24ndCB0aW1lZCBvdXQuICBUaGlzIHNob3VsZAorICogbmV2ZXIgaGFwcGVuIGluIHRoZW9yeSwgYnV0IHNlZW1zIHRvIG9jY3VyIG9jY2FzaW9uYWxseSBpZiB0aGUgY2FyZCBnZXRzCisgKiBwcm9kZGVkIGF0IHRoZSB3cm9uZyB0aW1lLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfM2M1MDVfZG1hKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZWxwX2RldmljZSAqYWRhcHRlciA9IGRldi0+cHJpdjsKKwlpZiAoYWRhcHRlci0+ZG1haW5nICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgYWRhcHRlci0+Y3VycmVudF9kbWEuc3RhcnRfdGltZSArIDEwKSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzLCBmOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBETUEgJXMgdGltZWQgb3V0LCAlZCBieXRlcyBsZWZ0XG4iLCBkZXYtPm5hbWUsIGFkYXB0ZXItPmN1cnJlbnRfZG1hLmRpcmVjdGlvbiA/ICJkb3dubG9hZCIgOiAidXBsb2FkIiwgZ2V0X2RtYV9yZXNpZHVlKGRldi0+ZG1hKSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisJCWFkYXB0ZXItPmRtYWluZyA9IDA7CisJCWFkYXB0ZXItPmJ1c3kgPSAwOworCQkKKwkJZj1jbGFpbV9kbWFfbG9jaygpOworCQlkaXNhYmxlX2RtYShkZXYtPmRtYSk7CisJCXJlbGVhc2VfZG1hX2xvY2soZik7CisJCQorCQlpZiAoYWRhcHRlci0+cnhfYWN0aXZlKQorCQkJYWRhcHRlci0+cnhfYWN0aXZlLS07CisJCW91dGJfY29udHJvbChhZGFwdGVyLT5oY3JfdmFsICYgfihETUFFIHwgVENFTiB8IERJUiksIGRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwl9Cit9CisKKy8qIFByaW1pdGl2ZSBmdW5jdGlvbnMgdXNlZCBieSBzZW5kX3BjYigpICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzZW5kX3BjYl9zbG93KHVuc2lnbmVkIGludCBiYXNlX2FkZHIsIHVuc2lnbmVkIGNoYXIgYnl0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJb3V0Yl9jb21tYW5kKGJ5dGUsIGJhc2VfYWRkcik7CisJZm9yICh0aW1lb3V0ID0gamlmZmllcyArIDUqSFovMTAwOyB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KTspIHsKKwkJaWYgKGluYl9zdGF0dXMoYmFzZV9hZGRyKSAmIEhDUkUpCisJCQlyZXR1cm4gRkFMU0U7CisJfQorCXByaW50ayhLRVJOX1dBUk5JTkcgIjNjNTA1OiBzZW5kX3BjYl9zbG93IHRpbWVkIG91dFxuIik7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNlbmRfcGNiX2Zhc3QodW5zaWduZWQgaW50IGJhc2VfYWRkciwgdW5zaWduZWQgY2hhciBieXRlKQoreworCXVuc2lnbmVkIGludCB0aW1lb3V0OworCW91dGJfY29tbWFuZChieXRlLCBiYXNlX2FkZHIpOworCWZvciAodGltZW91dCA9IDA7IHRpbWVvdXQgPCA0MDAwMDsgdGltZW91dCsrKSB7CisJCWlmIChpbmJfc3RhdHVzKGJhc2VfYWRkcikgJiBIQ1JFKQorCQkJcmV0dXJuIEZBTFNFOworCX0KKwlwcmludGsoS0VSTl9XQVJOSU5HICIzYzUwNTogc2VuZF9wY2JfZmFzdCB0aW1lZCBvdXRcbiIpOworCXJldHVybiBUUlVFOworfQorCisvKiBDaGVjayB0byBzZWUgaWYgdGhlIHJlY2VpdmVyIG5lZWRzIHJlc3RhcnRpbmcsIGFuZCBraWNrIGl0IGlmIHNvICovCitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbWVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllbHBfZGV2aWNlICphZGFwdGVyID0gZGV2LT5wcml2OworCXdoaWxlIChhZGFwdGVyLT5yeF9hY3RpdmUgPCBFTFBfUlhfUENCUyAmJiBuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJaWYgKCFzdGFydF9yZWNlaXZlKGRldiwgJmFkYXB0ZXItPml0eF9wY2IpKQorCQkJYnJlYWs7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBzZW5kX3BjYgorICogICBTZW5kIGEgUENCIHRvIHRoZSBhZGFwdGVyLgorICoKKyAqCW91dHB1dCBieXRlIHRvIGNvbW1hbmQgcmVnICAtLTwtLSsKKyAqCXdhaXQgdW50aWwgSENSRSBpcyBub24gemVybyAgICAgIHwKKyAqCWxvb3AgdW50aWwgYWxsIGJ5dGVzIHNlbnQgICAtLT4tLSsKKyAqCXNldCBIU0YxIGFuZCBIU0YyIHRvIDEKKyAqCW91dHB1dCBwY2IgbGVuZ3RoCisgKgl3YWl0IHVudGlsIEFTRiBnaXZlIEFDSyBvciBOQUsKKyAqCXNldCBIU0YxIGFuZCBIU0YyIHRvIDAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgY2FuIGJlIHF1aXRlIHNsb3cgLS0gdGhlIGFkYXB0ZXIgaXMgYWxsb3dlZCB0byB0YWtlIHVwIHRvIDQwbXMKKyAqIHRvIHJlc3BvbmQgdG8gdGhlIGluaXRpYWwgaW50ZXJydXB0LgorICoKKyAqIFdlIHJ1biBpbml0aWFsbHkgd2l0aCBpbnRlcnJ1cHRzIHR1cm5lZCBvbiwgYnV0IHdpdGggYSBzZW1hcGhvcmUgc2V0CisgKiBzbyB0aGF0IG5vYm9keSB0cmllcyB0byByZS1lbnRlciB0aGlzIGNvZGUuICBPbmNlIHRoZSBmaXJzdCBieXRlIGhhcworICogZ29uZSB0aHJvdWdoLCB3ZSB0dXJuIGludGVycnVwdHMgb2ZmIGFuZCB0aGVuIHNlbmQgdGhlIG90aGVycyAodGhlCisgKiB0aW1lb3V0IGlzIHJlZHVjZWQgdG8gNTAwdXMpLgorICovCisKK3N0YXRpYyBpbnQgc2VuZF9wY2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgcGNiX3N0cnVjdCAqIHBjYikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJZWxwX2RldmljZSAqYWRhcHRlciA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY2hlY2tfM2M1MDVfZG1hKGRldik7CisKKwlpZiAoYWRhcHRlci0+ZG1haW5nICYmIGFkYXB0ZXItPmN1cnJlbnRfZG1hLmRpcmVjdGlvbiA9PSAwKQorCQlyZXR1cm4gRkFMU0U7CisKKwkvKiBBdm9pZCBjb250ZW50aW9uICovCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMSwgJmFkYXB0ZXItPnNlbmRfcGNiX3NlbWFwaG9yZSkpIHsKKwkJaWYgKGVscF9kZWJ1ZyA+PSAzKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNlbmRfcGNiIGVudGVyZWQgd2hpbGUgdGhyZWFkZWRcbiIsIGRldi0+bmFtZSk7CisJCX0KKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKgorCSAqIGxvYWQgZWFjaCBieXRlIGludG8gdGhlIGNvbW1hbmQgcmVnaXN0ZXIgYW5kCisJICogd2FpdCBmb3IgdGhlIEhDUkUgYml0IHRvIGluZGljYXRlIHRoZSBhZGFwdGVyCisJICogaGFkIHJlYWQgdGhlIGJ5dGUKKwkgKi8KKwlzZXRfaHNmKGRldiwgMCk7CisKKwlpZiAoc2VuZF9wY2Jfc2xvdyhkZXYtPmJhc2VfYWRkciwgcGNiLT5jb21tYW5kKSkKKwkJZ290byBhYm9ydDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoc2VuZF9wY2JfZmFzdChkZXYtPmJhc2VfYWRkciwgcGNiLT5sZW5ndGgpKQorCQlnb3RvIHN0aV9hYm9ydDsKKworCWZvciAoaSA9IDA7IGkgPCBwY2ItPmxlbmd0aDsgaSsrKSB7CisJCWlmIChzZW5kX3BjYl9mYXN0KGRldi0+YmFzZV9hZGRyLCBwY2ItPmRhdGEucmF3W2ldKSkKKwkJCWdvdG8gc3RpX2Fib3J0OworCX0KKworCW91dGJfY29udHJvbChhZGFwdGVyLT5oY3JfdmFsIHwgMywgZGV2KTsJLyogc2lnbmFsIGVuZCBvZiBQQ0IgKi8KKwlvdXRiX2NvbW1hbmQoMiArIHBjYi0+bGVuZ3RoLCBkZXYtPmJhc2VfYWRkcik7CisKKwkvKiBub3cgd2FpdCBmb3IgdGhlIGFja25vd2xlZGdlbWVudCAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKworCWZvciAodGltZW91dCA9IGppZmZpZXMgKyA1KkhaLzEwMDsgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCk7KSB7CisJCXN3aXRjaCAoR0VUX0FTRihkZXYtPmJhc2VfYWRkcikpIHsKKwkJY2FzZSBBU0ZfUENCX0FDSzoKKwkJCWFkYXB0ZXItPnNlbmRfcGNiX3NlbWFwaG9yZSA9IDA7CisJCQlyZXR1cm4gVFJVRTsKKworCQljYXNlIEFTRl9QQ0JfTkFLOgorI2lmZGVmIEVMUF9ERUJVRworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzZW5kX3BjYiBnb3QgTkFLXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJCQlnb3RvIGFib3J0OworCQl9CisJfQorCisJaWYgKGVscF9kZWJ1ZyA+PSAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IgUENCIGFja25vd2xlZGdlIChzdGF0dXMgJTAyeClcbiIsIGRldi0+bmFtZSwgaW5iX3N0YXR1cyhkZXYtPmJhc2VfYWRkcikpOworCWdvdG8gYWJvcnQ7CisKKyAgICAgIHN0aV9hYm9ydDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisgICAgICBhYm9ydDoKKwlhZGFwdGVyLT5zZW5kX3BjYl9zZW1hcGhvcmUgPSAwOworCXJldHVybiBGQUxTRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiByZWNlaXZlX3BjYgorICogICBSZWFkIGEgUENCIGZyb20gdGhlIGFkYXB0ZXIKKyAqCisgKgl3YWl0IGZvciBBQ1JGIHRvIGJlIG5vbi16ZXJvICAgICAgICAtLS08LS0tKworICoJaW5wdXQgYSBieXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqCWlmIEFTRjEgYW5kIEFTRjIgd2VyZSBub3QgYm90aCBvbmUgICAgICAgICB8CisgKgkJYmVmb3JlIGJ5dGUgd2FzIHJlYWQsIGxvb3AgICAgICAtLS0+LS0tKworICoJc2V0IEhTRjEgYW5kIEhTRjIgZm9yIGFjaworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCByZWNlaXZlX3BjYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBwY2Jfc3RydWN0ICogcGNiKQoreworCWludCBpLCBqOworCWludCB0b3RhbF9sZW5ndGg7CisJaW50IHN0YXQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwllbHBfZGV2aWNlICphZGFwdGVyID0gZGV2LT5wcml2OworCisJc2V0X2hzZihkZXYsIDApOworCisJLyogZ2V0IHRoZSBjb21tYW5kIGNvZGUgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIDIqSFovMTAwOworCXdoaWxlICgoKHN0YXQgPSBnZXRfc3RhdHVzKGRldi0+YmFzZV9hZGRyKSkgJiBBQ1JGKSA9PSAwICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKTsKKwlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlUSU1FT1VUX01TRyhfX0xJTkVfXyk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJcGNiLT5jb21tYW5kID0gaW5iX2NvbW1hbmQoZGV2LT5iYXNlX2FkZHIpOworCisJLyogcmVhZCB0aGUgZGF0YSBsZW5ndGggKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIDMqSFovMTAwOworCXdoaWxlICgoKHN0YXQgPSBnZXRfc3RhdHVzKGRldi0+YmFzZV9hZGRyKSkgJiBBQ1JGKSA9PSAwICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKTsKKwlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlUSU1FT1VUX01TRyhfX0xJTkVfXyk7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBzdGF0dXMgJTAyeFxuIiwgZGV2LT5uYW1lLCBzdGF0KTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlwY2ItPmxlbmd0aCA9IGluYl9jb21tYW5kKGRldi0+YmFzZV9hZGRyKTsKKworCWlmIChwY2ItPmxlbmd0aCA+IE1BWF9QQ0JfREFUQSkgeworCQlJTlZBTElEX1BDQl9NU0cocGNiLT5sZW5ndGgpOworCQlhZGFwdGVyX3Jlc2V0KGRldik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyogcmVhZCB0aGUgZGF0YSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisJaSA9IDA7CisJZG8geworCQlqID0gMDsKKwkJd2hpbGUgKCgoc3RhdCA9IGdldF9zdGF0dXMoZGV2LT5iYXNlX2FkZHIpKSAmIEFDUkYpID09IDAgJiYgaisrIDwgMjAwMDApOworCQlwY2ItPmRhdGEucmF3W2krK10gPSBpbmJfY29tbWFuZChkZXYtPmJhc2VfYWRkcik7CisJCWlmIChpID4gTUFYX1BDQl9EQVRBKQorCQkJSU5WQUxJRF9QQ0JfTVNHKGkpOworCX0gd2hpbGUgKChzdGF0ICYgQVNGX1BDQl9NQVNLKSAhPSBBU0ZfUENCX0VORCAmJiBqIDwgMjAwMDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwlpZiAoaiA+PSAyMDAwMCkgeworCQlUSU1FT1VUX01TRyhfX0xJTkVfXyk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyogd29vcHMsIHRoZSBsYXN0ICJkYXRhIiBieXRlIHdhcyByZWFsbHkgdGhlIGxlbmd0aCEgKi8KKwl0b3RhbF9sZW5ndGggPSBwY2ItPmRhdGEucmF3Wy0taV07CisKKwkvKiBzYWZldHkgY2hlY2sgdG90YWwgbGVuZ3RoIHZzIGRhdGEgbGVuZ3RoICovCisJaWYgKHRvdGFsX2xlbmd0aCAhPSAocGNiLT5sZW5ndGggKyAyKSkgeworCQlpZiAoZWxwX2RlYnVnID49IDIpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbWFuZ2xlZCBQQ0IgcmVjZWl2ZWRcbiIsIGRldi0+bmFtZSk7CisJCXNldF9oc2YoZGV2LCBIU0ZfUENCX05BSyk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAocGNiLT5jb21tYW5kID09IENNRF9SRUNFSVZFX1BBQ0tFVF9DT01QTEVURSkgeworCQlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAodm9pZCAqKSAmYWRhcHRlci0+YnVzeSkpIHsKKwkJCWlmIChiYWNrbG9nX25leHQoYWRhcHRlci0+cnhfYmFja2xvZy5pbikgPT0gYWRhcHRlci0+cnhfYmFja2xvZy5vdXQpIHsKKwkJCQlzZXRfaHNmKGRldiwgSFNGX1BDQl9OQUspOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQQ0IgcmVqZWN0ZWQsIHRyYW5zZmVyIGluIHByb2dyZXNzIGFuZCBiYWNrbG9nIGZ1bGxcbiIsIGRldi0+bmFtZSk7CisJCQkJcGNiLT5jb21tYW5kID0gMDsKKwkJCQlyZXR1cm4gVFJVRTsKKwkJCX0gZWxzZSB7CisJCQkJcGNiLT5jb21tYW5kID0gMHhmZjsKKwkJCX0KKwkJfQorCX0KKwlzZXRfaHNmKGRldiwgSFNGX1BDQl9BQ0spOworCXJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIHF1ZXVlIGEgcmVjZWl2ZSBjb21tYW5kIG9uIHRoZSBhZGFwdGVyIHNvIHdlIHdpbGwgZ2V0IGFuCisgKiAgaW50ZXJydXB0IHdoZW4gYSBwYWNrZXQgaXMgcmVjZWl2ZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBzdGFydF9yZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHBjYl9zdHJ1Y3QgKiB0eF9wY2IpCit7CisJaW50IHN0YXR1czsKKwllbHBfZGV2aWNlICphZGFwdGVyID0gZGV2LT5wcml2OworCisJaWYgKGVscF9kZWJ1ZyA+PSAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlc3RhcnRpbmcgcmVjZWl2ZXJcbiIsIGRldi0+bmFtZSk7CisJdHhfcGNiLT5jb21tYW5kID0gQ01EX1JFQ0VJVkVfUEFDS0VUOworCXR4X3BjYi0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBSY3ZfcGt0KTsKKwl0eF9wY2ItPmRhdGEucmN2X3BrdC5idWZfc2VnCisJICAgID0gdHhfcGNiLT5kYXRhLnJjdl9wa3QuYnVmX29mcyA9IDA7CQkvKiBVbnVzZWQgKi8KKwl0eF9wY2ItPmRhdGEucmN2X3BrdC5idWZfbGVuID0gMTYwMDsKKwl0eF9wY2ItPmRhdGEucmN2X3BrdC50aW1lb3V0ID0gMDsJLyogc2V0IHRpbWVvdXQgdG8gemVybyAqLworCXN0YXR1cyA9IHNlbmRfcGNiKGRldiwgdHhfcGNiKTsKKwlpZiAoc3RhdHVzKQorCQlhZGFwdGVyLT5yeF9hY3RpdmUrKzsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZXh0cmFjdCBhIHBhY2tldCBmcm9tIHRoZSBhZGFwdGVyCisgKiB0aGlzIHJvdXRpbmUgaXMgb25seSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIGludGVycnVwdAorICogc2VydmljZSByb3V0aW5lLCBzbyBubyBjbGkvc3RpIGNhbGxzIGFyZSBuZWVkZWQKKyAqIG5vdGUgdGhhdCB0aGUgbGVuZ3RoIGlzIGFsd2F5cyBhc3N1bWVkIHRvIGJlIGV2ZW4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCByZWNlaXZlX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbGVuKQoreworCWludCBybGVuOworCWVscF9kZXZpY2UgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJdm9pZCAqdGFyZ2V0OworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJsZW4gPSAobGVuICsgMSkgJiB+MTsKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHJsZW4gKyAyKTsKKworCWlmICghc2tiKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBtZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0XG4iLCBkZXYtPm5hbWUpOworCQl0YXJnZXQgPSBhZGFwdGVyLT5kbWFfYnVmZmVyOworCQlhZGFwdGVyLT5jdXJyZW50X2RtYS50YXJnZXQgPSBOVUxMOworCQkvKiBGSVhNRTogc3RhdHMgKi8KKwkJcmV0dXJuOworCX0KKworCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJdGFyZ2V0ID0gc2tiX3B1dChza2IsIHJsZW4pOworCWlmICgodW5zaWduZWQgbG9uZykodGFyZ2V0ICsgcmxlbikgPj0gTUFYX0RNQV9BRERSRVNTKSB7CisJCWFkYXB0ZXItPmN1cnJlbnRfZG1hLnRhcmdldCA9IHRhcmdldDsKKwkJdGFyZ2V0ID0gYWRhcHRlci0+ZG1hX2J1ZmZlcjsKKwl9IGVsc2UgeworCQlhZGFwdGVyLT5jdXJyZW50X2RtYS50YXJnZXQgPSBOVUxMOworCX0KKworCS8qIGlmIHRoaXMgaGFwcGVucywgd2UgZGllICovCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgKHZvaWQgKikgJmFkYXB0ZXItPmRtYWluZykpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJ4IGJsb2NrZWQsIERNQSBpbiBwcm9ncmVzcywgZGlyICVkXG4iLCBkZXYtPm5hbWUsIGFkYXB0ZXItPmN1cnJlbnRfZG1hLmRpcmVjdGlvbik7CisKKwlza2ItPmRldiA9IGRldjsKKwlhZGFwdGVyLT5jdXJyZW50X2RtYS5kaXJlY3Rpb24gPSAwOworCWFkYXB0ZXItPmN1cnJlbnRfZG1hLmxlbmd0aCA9IHJsZW47CisJYWRhcHRlci0+Y3VycmVudF9kbWEuc2tiID0gc2tiOworCWFkYXB0ZXItPmN1cnJlbnRfZG1hLnN0YXJ0X3RpbWUgPSBqaWZmaWVzOworCisJb3V0Yl9jb250cm9sKGFkYXB0ZXItPmhjcl92YWwgfCBESVIgfCBUQ0VOIHwgRE1BRSwgZGV2KTsKKworCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJZGlzYWJsZV9kbWEoZGV2LT5kbWEpOworCWNsZWFyX2RtYV9mZihkZXYtPmRtYSk7CisJc2V0X2RtYV9tb2RlKGRldi0+ZG1hLCAweDA0KTsJLyogZG1hIHJlYWQgKi8KKwlzZXRfZG1hX2FkZHIoZGV2LT5kbWEsIGlzYV92aXJ0X3RvX2J1cyh0YXJnZXQpKTsKKwlzZXRfZG1hX2NvdW50KGRldi0+ZG1hLCBybGVuKTsKKwllbmFibGVfZG1hKGRldi0+ZG1hKTsKKwlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKworCWlmIChlbHBfZGVidWcgPj0gMykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJ4IERNQSB0cmFuc2ZlciBzdGFydGVkXG4iLCBkZXYtPm5hbWUpOworCX0KKworCWlmIChhZGFwdGVyLT5yeF9hY3RpdmUpCisJCWFkYXB0ZXItPnJ4X2FjdGl2ZS0tOworCisJaWYgKCFhZGFwdGVyLT5idXN5KQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcmVjZWl2ZV9wYWNrZXQgY2FsbGVkLCBidXN5IG5vdCBzZXQuXG4iLCBkZXYtPm5hbWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogaW50ZXJydXB0IGhhbmRsZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgZWxwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdfcHRyKQoreworCWludCBsZW47CisJaW50IGRsZW47CisJaW50IGljb3VudCA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwllbHBfZGV2aWNlICphZGFwdGVyOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCWRldiA9IGRldl9pZDsKKwlhZGFwdGVyID0gKGVscF9kZXZpY2UgKikgZGV2LT5wcml2OworCQorCXNwaW5fbG9jaygmYWRhcHRlci0+bG9jayk7CisKKwlkbyB7CisJCS8qCisJCSAqIGhhcyBhIERNQSB0cmFuc2ZlciBmaW5pc2hlZD8KKwkJICovCisJCWlmIChpbmJfc3RhdHVzKGRldi0+YmFzZV9hZGRyKSAmIERPTkUpIHsKKwkJCWlmICghYWRhcHRlci0+ZG1haW5nKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHBoYW50b20gRE1BIGNvbXBsZXRlZFxuIiwgZGV2LT5uYW1lKTsKKwkJCX0KKwkJCWlmIChlbHBfZGVidWcgPj0gMykgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXMgRE1BIGNvbXBsZXRlLCBzdGF0dXMgJTAyeFxuIiwgZGV2LT5uYW1lLCBhZGFwdGVyLT5jdXJyZW50X2RtYS5kaXJlY3Rpb24gPyAidHgiIDogInJ4IiwgaW5iX3N0YXR1cyhkZXYtPmJhc2VfYWRkcikpOworCQkJfQorCisJCQlvdXRiX2NvbnRyb2woYWRhcHRlci0+aGNyX3ZhbCAmIH4oRE1BRSB8IFRDRU4gfCBESVIpLCBkZXYpOworCQkJaWYgKGFkYXB0ZXItPmN1cnJlbnRfZG1hLmRpcmVjdGlvbikgeworCQkJCWRldl9rZnJlZV9za2JfaXJxKGFkYXB0ZXItPmN1cnJlbnRfZG1hLnNrYik7CisJCQl9IGVsc2UgeworCQkJCXN0cnVjdCBza19idWZmICpza2IgPSBhZGFwdGVyLT5jdXJyZW50X2RtYS5za2I7CisJCQkJaWYgKHNrYikgeworCQkJCQlpZiAoYWRhcHRlci0+Y3VycmVudF9kbWEudGFyZ2V0KSB7CisJCQkJICAJLyogaGF2ZSBhbHJlYWR5IGRvbmUgdGhlIHNrYl9wdXQoKSAqLworCQkJCSAgCW1lbWNweShhZGFwdGVyLT5jdXJyZW50X2RtYS50YXJnZXQsIGFkYXB0ZXItPmRtYV9idWZmZXIsIGFkYXB0ZXItPmN1cnJlbnRfZG1hLmxlbmd0aCk7CisJCQkJCX0KKwkJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCQkJCQlhZGFwdGVyLT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQl9CisJCQl9CisJCQlhZGFwdGVyLT5kbWFpbmcgPSAwOworCQkJaWYgKGFkYXB0ZXItPnJ4X2JhY2tsb2cuaW4gIT0gYWRhcHRlci0+cnhfYmFja2xvZy5vdXQpIHsKKwkJCQlpbnQgdCA9IGFkYXB0ZXItPnJ4X2JhY2tsb2cubGVuZ3RoW2FkYXB0ZXItPnJ4X2JhY2tsb2cub3V0XTsKKwkJCQlhZGFwdGVyLT5yeF9iYWNrbG9nLm91dCA9IGJhY2tsb2dfbmV4dChhZGFwdGVyLT5yeF9iYWNrbG9nLm91dCk7CisJCQkJaWYgKGVscF9kZWJ1ZyA+PSAyKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlY2VpdmluZyBiYWNrbG9nZ2VkIHBhY2tldCAoJWQpXG4iLCBkZXYtPm5hbWUsIHQpOworCQkJCXJlY2VpdmVfcGFja2V0KGRldiwgdCk7CisJCQl9IGVsc2UgeworCQkJCWFkYXB0ZXItPmJ1c3kgPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogaGFzIG9uZSB0aW1lZCBvdXQ/ICovCisJCQljaGVja18zYzUwNV9kbWEoZGV2KTsKKwkJfQorCisJCS8qCisJCSAqIHJlY2VpdmUgYSBQQ0IgZnJvbSB0aGUgYWRhcHRlcgorCQkgKi8KKwkJdGltZW91dCA9IGppZmZpZXMgKyAzKkhaLzEwMDsKKwkJd2hpbGUgKChpbmJfc3RhdHVzKGRldi0+YmFzZV9hZGRyKSAmIEFDUkYpICE9IDAgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJCWlmIChyZWNlaXZlX3BjYihkZXYsICZhZGFwdGVyLT5pcnhfcGNiKSkgeworCQkJCXN3aXRjaCAoYWRhcHRlci0+aXJ4X3BjYi5jb21tYW5kKSAKKwkJCQl7CisJCQkJY2FzZSAwOgorCQkJCQlicmVhazsKKwkJCQkJLyoKKwkJCQkJICogcmVjZWl2ZWQgYSBwYWNrZXQgLSB0aGlzIG11c3QgYmUgaGFuZGxlZCBmYXN0CisJCQkJCSAqLworCQkJCWNhc2UgMHhmZjoKKwkJCQljYXNlIENNRF9SRUNFSVZFX1BBQ0tFVF9DT01QTEVURToKKwkJCQkJLyogaWYgdGhlIGRldmljZSBpc24ndCBvcGVuLCBkb24ndCBwYXNzIHBhY2tldHMgdXAgdGhlIHN0YWNrICovCisJCQkJCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQkJCQkJYnJlYWs7CisJCQkJCWxlbiA9IGFkYXB0ZXItPmlyeF9wY2IuZGF0YS5yY3ZfcmVzcC5wa3RfbGVuOworCQkJCQlkbGVuID0gYWRhcHRlci0+aXJ4X3BjYi5kYXRhLnJjdl9yZXNwLmJ1Zl9sZW47CisJCQkJCWlmIChhZGFwdGVyLT5pcnhfcGNiLmRhdGEucmN2X3Jlc3AudGltZW91dCAhPSAwKSB7CisJCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbnRlcnJ1cHQgLSBwYWNrZXQgbm90IHJlY2VpdmVkIGNvcnJlY3RseVxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChlbHBfZGVidWcgPj0gMykgeworCQkJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogaW50ZXJydXB0IC0gcGFja2V0IHJlY2VpdmVkIG9mIGxlbmd0aCAlaSAoJWkpXG4iLCBkZXYtPm5hbWUsIGxlbiwgZGxlbik7CisJCQkJCQl9CisJCQkJCQlpZiAoYWRhcHRlci0+aXJ4X3BjYi5jb21tYW5kID09IDB4ZmYpIHsKKwkJCQkJCQlpZiAoZWxwX2RlYnVnID49IDIpCisJCQkJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYWRkaW5nIHBhY2tldCB0byBiYWNrbG9nIChsZW4gPSAlZClcbiIsIGRldi0+bmFtZSwgZGxlbik7CisJCQkJCQkJYWRhcHRlci0+cnhfYmFja2xvZy5sZW5ndGhbYWRhcHRlci0+cnhfYmFja2xvZy5pbl0gPSBkbGVuOworCQkJCQkJCWFkYXB0ZXItPnJ4X2JhY2tsb2cuaW4gPSBiYWNrbG9nX25leHQoYWRhcHRlci0+cnhfYmFja2xvZy5pbik7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXJlY2VpdmVfcGFja2V0KGRldiwgZGxlbik7CisJCQkJCQl9CisJCQkJCQlpZiAoZWxwX2RlYnVnID49IDMpCisJCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBwYWNrZXQgcmVjZWl2ZWRcbiIsIGRldi0+bmFtZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQkJLyoKKwkJCQkJICogODI1ODYgY29uZmlndXJlZCBjb3JyZWN0bHkKKwkJCQkJICovCisJCQkJY2FzZSBDTURfQ09ORklHVVJFXzgyNTg2X1JFU1BPTlNFOgorCQkJCQlhZGFwdGVyLT5nb3RbQ01EX0NPTkZJR1VSRV84MjU4Nl0gPSAxOworCQkJCQlpZiAoZWxwX2RlYnVnID49IDMpCisJCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludGVycnVwdCAtIGNvbmZpZ3VyZSByZXNwb25zZSByZWNlaXZlZFxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJYnJlYWs7CisKKwkJCQkJLyoKKwkJCQkJICogQWRhcHRlciBtZW1vcnkgY29uZmlndXJhdGlvbgorCQkJCQkgKi8KKwkJCQljYXNlIENNRF9DT05GSUdVUkVfQURBUFRFUl9SRVNQT05TRToKKwkJCQkJYWRhcHRlci0+Z290W0NNRF9DT05GSUdVUkVfQURBUFRFUl9NRU1PUlldID0gMTsKKwkJCQkJaWYgKGVscF9kZWJ1ZyA+PSAzKQorCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBBZGFwdGVyIG1lbW9yeSBjb25maWd1cmF0aW9uICVzLlxuIiwgZGV2LT5uYW1lLAorCQkJCQkJICAgICAgIGFkYXB0ZXItPmlyeF9wY2IuZGF0YS5mYWlsZWQgPyAiZmFpbGVkIiA6ICJzdWNjZWVkZWQiKTsKKwkJCQkJYnJlYWs7CisKKwkJCQkJLyoKKwkJCQkJICogTXVsdGljYXN0IGxpc3QgbG9hZGluZworCQkJCQkgKi8KKwkJCQljYXNlIENNRF9MT0FEX01VTFRJQ0FTVF9SRVNQT05TRToKKwkJCQkJYWRhcHRlci0+Z290W0NNRF9MT0FEX01VTFRJQ0FTVF9MSVNUXSA9IDE7CisJCQkJCWlmIChlbHBfZGVidWcgPj0gMykKKwkJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTXVsdGljYXN0IGFkZHJlc3MgbGlzdCBsb2FkaW5nICVzLlxuIiwgZGV2LT5uYW1lLAorCQkJCQkJICAgICAgIGFkYXB0ZXItPmlyeF9wY2IuZGF0YS5mYWlsZWQgPyAiZmFpbGVkIiA6ICJzdWNjZWVkZWQiKTsKKwkJCQkJYnJlYWs7CisKKwkJCQkJLyoKKwkJCQkJICogU3RhdGlvbiBhZGRyZXNzIHNldHRpbmcKKwkJCQkJICovCisJCQkJY2FzZSBDTURfU0VUX0FERFJFU1NfUkVTUE9OU0U6CisJCQkJCWFkYXB0ZXItPmdvdFtDTURfU0VUX1NUQVRJT05fQUREUkVTU10gPSAxOworCQkJCQlpZiAoZWxwX2RlYnVnID49IDMpCisJCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEV0aGVybmV0IGFkZHJlc3Mgc2V0dGluZyAlcy5cbiIsIGRldi0+bmFtZSwKKwkJCQkJCSAgICAgICBhZGFwdGVyLT5pcnhfcGNiLmRhdGEuZmFpbGVkID8gImZhaWxlZCIgOiAic3VjY2VlZGVkIik7CisJCQkJCWJyZWFrOworCisKKwkJCQkJLyoKKwkJCQkJICogcmVjZWl2ZWQgYm9hcmQgc3RhdGlzdGljcworCQkJCQkgKi8KKwkJCQljYXNlIENNRF9ORVRXT1JLX1NUQVRJU1RJQ1NfUkVTUE9OU0U6CisJCQkJCWFkYXB0ZXItPnN0YXRzLnJ4X3BhY2tldHMgKz0gYWRhcHRlci0+aXJ4X3BjYi5kYXRhLm5ldHN0YXQudG90X3JlY3Y7CisJCQkJCWFkYXB0ZXItPnN0YXRzLnR4X3BhY2tldHMgKz0gYWRhcHRlci0+aXJ4X3BjYi5kYXRhLm5ldHN0YXQudG90X3htaXQ7CisJCQkJCWFkYXB0ZXItPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gYWRhcHRlci0+aXJ4X3BjYi5kYXRhLm5ldHN0YXQuZXJyX0NSQzsKKwkJCQkJYWRhcHRlci0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICs9IGFkYXB0ZXItPmlyeF9wY2IuZGF0YS5uZXRzdGF0LmVycl9hbGlnbjsKKwkJCQkJYWRhcHRlci0+c3RhdHMucnhfZmlmb19lcnJvcnMgKz0gYWRhcHRlci0+aXJ4X3BjYi5kYXRhLm5ldHN0YXQuZXJyX292cnJ1bjsKKwkJCQkJYWRhcHRlci0+c3RhdHMucnhfb3Zlcl9lcnJvcnMgKz0gYWRhcHRlci0+aXJ4X3BjYi5kYXRhLm5ldHN0YXQuZXJyX3JlczsKKwkJCQkJYWRhcHRlci0+Z290W0NNRF9ORVRXT1JLX1NUQVRJU1RJQ1NdID0gMTsKKwkJCQkJaWYgKGVscF9kZWJ1ZyA+PSAzKQorCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcnJ1cHQgLSBzdGF0aXN0aWNzIHJlc3BvbnNlIHJlY2VpdmVkXG4iLCBkZXYtPm5hbWUpOworCQkJCQlicmVhazsKKworCQkJCQkvKgorCQkJCQkgKiBzZW50IGEgcGFja2V0CisJCQkJCSAqLworCQkJCWNhc2UgQ01EX1RSQU5TTUlUX1BBQ0tFVF9DT01QTEVURToKKwkJCQkJaWYgKGVscF9kZWJ1ZyA+PSAzKQorCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcnJ1cHQgLSBwYWNrZXQgc2VudFxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCQkJCQlicmVhazsKKwkJCQkJc3dpdGNoIChhZGFwdGVyLT5pcnhfcGNiLmRhdGEueG1pdF9yZXNwLmNfc3RhdCkgeworCQkJCQljYXNlIDB4ZmZmZjoKKwkJCQkJCWFkYXB0ZXItPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBuZXR3b3JrIGNhYmxlIHByb2JsZW0/XG4iLCBkZXYtPm5hbWUpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMHhmZmZlOgorCQkJCQkJYWRhcHRlci0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIEZJRk8gdW5kZXJydW5cbiIsIGRldi0+bmFtZSk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQkJCWJyZWFrOworCisJCQkJCS8qCisJCQkJCSAqIHNvbWUgdW5rbm93biBQQ0IKKwkJCQkJICovCisJCQkJZGVmYXVsdDoKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB1bmtub3duIFBDQiByZWNlaXZlZCAtICUyLjJ4XG4iLCBkZXYtPm5hbWUsIGFkYXB0ZXItPmlyeF9wY2IuY29tbWFuZCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZhaWxlZCB0byByZWFkIFBDQiBvbiBpbnRlcnJ1cHRcbiIsIGRldi0+bmFtZSk7CisJCQkJYWRhcHRlcl9yZXNldChkZXYpOworCQkJfQorCQl9CisKKwl9IHdoaWxlIChpY291bnQrKyA8IDUgJiYgKGluYl9zdGF0dXMoZGV2LT5iYXNlX2FkZHIpICYgKEFDUkYgfCBET05FKSkpOworCisJcHJpbWVfcngoZGV2KTsKKworCS8qCisJICogaW5kaWNhdGUgbm8gbG9uZ2VyIGluIGludGVycnVwdCByb3V0aW5lCisJICovCisJc3Bpbl91bmxvY2soJmFkYXB0ZXItPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogb3BlbiB0aGUgYm9hcmQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGVscF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZWxwX2RldmljZSAqYWRhcHRlcjsKKwlpbnQgcmV0dmFsOworCisJYWRhcHRlciA9IGRldi0+cHJpdjsKKworCWlmIChlbHBfZGVidWcgPj0gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZXF1ZXN0IHRvIG9wZW4gZGV2aWNlXG4iLCBkZXYtPm5hbWUpOworCisJLyoKKwkgKiBtYWtlIHN1cmUgd2UgYWN0dWFsbHkgZm91bmQgdGhlIGRldmljZQorCSAqLworCWlmIChhZGFwdGVyID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogT3BlbmluZyBhIG5vbi1leGlzdGVudCBwaHlzaWNhbCBkZXZpY2VcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwkvKgorCSAqIGRpc2FibGUgaW50ZXJydXB0cyBvbiB0aGUgYm9hcmQKKwkgKi8KKwlvdXRiX2NvbnRyb2woMCwgZGV2KTsKKworCS8qCisJICogY2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0cworCSAqLworCWluYl9jb21tYW5kKGRldi0+YmFzZV9hZGRyKTsKKwlhZGFwdGVyX3Jlc2V0KGRldik7CisKKwkvKgorCSAqIG5vIHJlY2VpdmUgUENCcyBhY3RpdmUKKwkgKi8KKwlhZGFwdGVyLT5yeF9hY3RpdmUgPSAwOworCisJYWRhcHRlci0+YnVzeSA9IDA7CisJYWRhcHRlci0+c2VuZF9wY2Jfc2VtYXBob3JlID0gMDsKKwlhZGFwdGVyLT5yeF9iYWNrbG9nLmluID0gMDsKKwlhZGFwdGVyLT5yeF9iYWNrbG9nLm91dCA9IDA7CisJCisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmxvY2spOworCisJLyoKKwkgKiBpbnN0YWxsIG91ciBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lCisJICovCisJaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJmVscF9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGQgbm90IGFsbG9jYXRlIElSUSVkXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJaWYgKChyZXR2YWwgPSByZXF1ZXN0X2RtYShkZXYtPmRtYSwgZGV2LT5uYW1lKSkpIHsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBETUElZCBjaGFubmVsXG4iLCBkZXYtPm5hbWUsIGRldi0+ZG1hKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJYWRhcHRlci0+ZG1hX2J1ZmZlciA9ICh2b2lkICopIGRtYV9tZW1fYWxsb2MoRE1BX0JVRkZFUl9TSVpFKTsKKwlpZiAoIWFkYXB0ZXItPmRtYV9idWZmZXIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGQgbm90IGFsbG9jYXRlIERNQSBidWZmZXJcbiIsIGRldi0+bmFtZSk7CisJCWZyZWVfZG1hKGRldi0+ZG1hKTsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlhZGFwdGVyLT5kbWFpbmcgPSAwOworCisJLyoKKwkgKiBlbmFibGUgaW50ZXJydXB0cyBvbiB0aGUgYm9hcmQKKwkgKi8KKwlvdXRiX2NvbnRyb2woQ01ERSwgZGV2KTsKKworCS8qCisJICogY29uZmlndXJlIGFkYXB0ZXIgbWVtb3J5OiB3ZSBuZWVkIDEwIG11bHRpY2FzdCBhZGRyZXNzZXMsIGRlZmF1bHQ9PTAKKwkgKi8KKwlpZiAoZWxwX2RlYnVnID49IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogc2VuZGluZyAzYzUwNSBtZW1vcnkgY29uZmlndXJhdGlvbiBjb21tYW5kXG4iLCBkZXYtPm5hbWUpOworCWFkYXB0ZXItPnR4X3BjYi5jb21tYW5kID0gQ01EX0NPTkZJR1VSRV9BREFQVEVSX01FTU9SWTsKKwlhZGFwdGVyLT50eF9wY2IuZGF0YS5tZW1jb25mLmNtZF9xID0gMTA7CisJYWRhcHRlci0+dHhfcGNiLmRhdGEubWVtY29uZi5yY3ZfcSA9IDIwOworCWFkYXB0ZXItPnR4X3BjYi5kYXRhLm1lbWNvbmYubWNhc3QgPSAxMDsKKwlhZGFwdGVyLT50eF9wY2IuZGF0YS5tZW1jb25mLmZyYW1lID0gMjA7CisJYWRhcHRlci0+dHhfcGNiLmRhdGEubWVtY29uZi5yY3ZfYiA9IDIwOworCWFkYXB0ZXItPnR4X3BjYi5kYXRhLm1lbWNvbmYucHJvZ3MgPSAwOworCWFkYXB0ZXItPnR4X3BjYi5sZW5ndGggPSBzaXplb2Yoc3RydWN0IE1lbWNvbmYpOworCWFkYXB0ZXItPmdvdFtDTURfQ09ORklHVVJFX0FEQVBURVJfTUVNT1JZXSA9IDA7CisJaWYgKCFzZW5kX3BjYihkZXYsICZhZGFwdGVyLT50eF9wY2IpKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZG4ndCBzZW5kIG1lbW9yeSBjb25maWd1cmF0aW9uIGNvbW1hbmRcbiIsIGRldi0+bmFtZSk7CisJZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBUSU1FT1VUOworCQl3aGlsZSAoYWRhcHRlci0+Z290W0NNRF9DT05GSUdVUkVfQURBUFRFUl9NRU1PUlldID09IDAgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpOworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCVRJTUVPVVRfTVNHKF9fTElORV9fKTsKKwl9CisKKworCS8qCisJICogY29uZmlndXJlIGFkYXB0ZXIgdG8gcmVjZWl2ZSBicm9hZGNhc3QgbWVzc2FnZXMgYW5kIHdhaXQgZm9yIHJlc3BvbnNlCisJICovCisJaWYgKGVscF9kZWJ1ZyA+PSAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNlbmRpbmcgODI1ODYgY29uZmlndXJlIGNvbW1hbmRcbiIsIGRldi0+bmFtZSk7CisJYWRhcHRlci0+dHhfcGNiLmNvbW1hbmQgPSBDTURfQ09ORklHVVJFXzgyNTg2OworCWFkYXB0ZXItPnR4X3BjYi5kYXRhLmNvbmZpZ3VyZSA9IE5PX0xPT1BCQUNLIHwgUkVDVl9CUk9BRDsKKwlhZGFwdGVyLT50eF9wY2IubGVuZ3RoID0gMjsKKwlhZGFwdGVyLT5nb3RbQ01EX0NPTkZJR1VSRV84MjU4Nl0gPSAwOworCWlmICghc2VuZF9wY2IoZGV2LCAmYWRhcHRlci0+dHhfcGNiKSkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGRuJ3Qgc2VuZCA4MjU4NiBjb25maWd1cmUgY29tbWFuZFxuIiwgZGV2LT5uYW1lKTsKKwllbHNlIHsKKwkJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIFRJTUVPVVQ7CisJCXdoaWxlIChhZGFwdGVyLT5nb3RbQ01EX0NPTkZJR1VSRV84MjU4Nl0gPT0gMCAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSk7CisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJVElNRU9VVF9NU0coX19MSU5FX18pOworCX0KKworCS8qIGVuYWJsZSBidXJzdC1tb2RlIERNQSAqLworCS8qIG91dGIoMHgxLCBkZXYtPmJhc2VfYWRkciArIFBPUlRfQVVYRE1BKTsgKi8KKworCS8qCisJICogcXVldWUgcmVjZWl2ZSBjb21tYW5kcyB0byBwcm92aWRlIGJ1ZmZlcmluZworCSAqLworCXByaW1lX3J4KGRldik7CisJaWYgKGVscF9kZWJ1ZyA+PSAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVkIHJlY2VpdmUgUENCcyBhY3RpdmVcbiIsIGRldi0+bmFtZSwgYWRhcHRlci0+cnhfYWN0aXZlKTsKKworCS8qCisJICogZGV2aWNlIGlzIG5vdyBvZmZpY2lhbGx5IG9wZW4hCisJICovCisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBzZW5kIGEgcGFja2V0IHRvIHRoZSBhZGFwdGVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBzZW5kX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWVscF9kZXZpY2UgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyB0YXJnZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogbWFrZSBzdXJlIHRoZSBsZW5ndGggaXMgZXZlbiBhbmQgbm8gc2hvcnRlciB0aGFuIDYwIGJ5dGVzCisJICovCisJdW5zaWduZWQgaW50IG5sZW4gPSAoKChza2ItPmxlbiA8IDYwKSA/IDYwIDogc2tiLT5sZW4pICsgMSkgJiAofjEpOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgKHZvaWQgKikgJmFkYXB0ZXItPmJ1c3kpKSB7CisJCWlmIChlbHBfZGVidWcgPj0gMikKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHJhbnNtaXQgYmxvY2tlZFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWFkYXB0ZXItPnN0YXRzLnR4X2J5dGVzICs9IG5sZW47CisJCisJLyoKKwkgKiBzZW5kIHRoZSBhZGFwdGVyIGEgdHJhbnNtaXQgcGFja2V0IGNvbW1hbmQuIElnbm9yZSBzZWdtZW50IGFuZCBvZmZzZXQKKwkgKiBhbmQgbWFrZSBzdXJlIHRoZSBsZW5ndGggaXMgZXZlbgorCSAqLworCWFkYXB0ZXItPnR4X3BjYi5jb21tYW5kID0gQ01EX1RSQU5TTUlUX1BBQ0tFVDsKKwlhZGFwdGVyLT50eF9wY2IubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBYbWl0X3BrdCk7CisJYWRhcHRlci0+dHhfcGNiLmRhdGEueG1pdF9wa3QuYnVmX29mcworCSAgICA9IGFkYXB0ZXItPnR4X3BjYi5kYXRhLnhtaXRfcGt0LmJ1Zl9zZWcgPSAwOwkvKiBVbnVzZWQgKi8KKwlhZGFwdGVyLT50eF9wY2IuZGF0YS54bWl0X3BrdC5wa3RfbGVuID0gbmxlbjsKKworCWlmICghc2VuZF9wY2IoZGV2LCAmYWRhcHRlci0+dHhfcGNiKSkgeworCQlhZGFwdGVyLT5idXN5ID0gMDsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKiBpZiB0aGlzIGhhcHBlbnMsIHdlIGRpZSAqLworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICh2b2lkICopICZhZGFwdGVyLT5kbWFpbmcpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR4OiBETUEgJWQgaW4gcHJvZ3Jlc3NcbiIsIGRldi0+bmFtZSwgYWRhcHRlci0+Y3VycmVudF9kbWEuZGlyZWN0aW9uKTsKKworCWFkYXB0ZXItPmN1cnJlbnRfZG1hLmRpcmVjdGlvbiA9IDE7CisJYWRhcHRlci0+Y3VycmVudF9kbWEuc3RhcnRfdGltZSA9IGppZmZpZXM7CisKKwlpZiAoKHVuc2lnbmVkIGxvbmcpKHNrYi0+ZGF0YSArIG5sZW4pID49IE1BWF9ETUFfQUREUkVTUyB8fCBubGVuICE9IHNrYi0+bGVuKSB7CisJCW1lbWNweShhZGFwdGVyLT5kbWFfYnVmZmVyLCBza2ItPmRhdGEsIG5sZW4pOworCQltZW1zZXQoYWRhcHRlci0+ZG1hX2J1ZmZlcitza2ItPmxlbiwgMCwgbmxlbi1za2ItPmxlbik7CisJCXRhcmdldCA9IGlzYV92aXJ0X3RvX2J1cyhhZGFwdGVyLT5kbWFfYnVmZmVyKTsKKwl9CisJZWxzZSB7CisJCXRhcmdldCA9IGlzYV92aXJ0X3RvX2J1cyhza2ItPmRhdGEpOworCX0KKwlhZGFwdGVyLT5jdXJyZW50X2RtYS5za2IgPSBza2I7CisKKwlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCWRpc2FibGVfZG1hKGRldi0+ZG1hKTsKKwljbGVhcl9kbWFfZmYoZGV2LT5kbWEpOworCXNldF9kbWFfbW9kZShkZXYtPmRtYSwgMHg0OCk7CS8qIGRtYSBtZW1vcnkgLT4gaW8gKi8KKwlzZXRfZG1hX2FkZHIoZGV2LT5kbWEsIHRhcmdldCk7CisJc2V0X2RtYV9jb3VudChkZXYtPmRtYSwgbmxlbik7CisJb3V0Yl9jb250cm9sKGFkYXB0ZXItPmhjcl92YWwgfCBETUFFIHwgVENFTiwgZGV2KTsKKwllbmFibGVfZG1hKGRldi0+ZG1hKTsKKwlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwkKKwlpZiAoZWxwX2RlYnVnID49IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRE1BIHRyYW5zZmVyIHN0YXJ0ZWRcbiIsIGRldi0+bmFtZSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoKKyAqCVRoZSB1cHBlciBsYXllciB0aGlua3Mgd2UgdGltZWQgb3V0CisgKi8KKyAKK3N0YXRpYyB2b2lkIGVscF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZWxwX2RldmljZSAqYWRhcHRlciA9IGRldi0+cHJpdjsKKwlpbnQgc3RhdDsKKworCXN0YXQgPSBpbmJfc3RhdHVzKGRldi0+YmFzZV9hZGRyKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBsb3N0ICVzP1xuIiwgZGV2LT5uYW1lLCAoc3RhdCAmIEFDUkYpID8gImludGVycnVwdCIgOiAiY29tbWFuZCIpOworCWlmIChlbHBfZGVidWcgPj0gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzdGF0dXMgJSMwMnhcbiIsIGRldi0+bmFtZSwgc3RhdCk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJYWRhcHRlci0+c3RhdHMudHhfZHJvcHBlZCsrOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHN0YXJ0IHRoZSB0cmFuc21pdHRlcgorICogICAgcmV0dXJuIDAgaWYgc2VudCBPSywgZWxzZSByZXR1cm4gMQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgZWxwX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWVscF9kZXZpY2UgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwljaGVja18zYzUwNV9kbWEoZGV2KTsKKworCWlmIChlbHBfZGVidWcgPj0gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZXF1ZXN0IHRvIHNlbmQgcGFja2V0IG9mIGxlbmd0aCAlZFxuIiwgZGV2LT5uYW1lLCAoaW50KSBza2ItPmxlbik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJLyoKKwkgKiBzZW5kIHRoZSBwYWNrZXQgYXQgc2tiLT5kYXRhIGZvciBza2ItPmxlbgorCSAqLworCWlmICghc2VuZF9wYWNrZXQoZGV2LCBza2IpKSB7CisJCWlmIChlbHBfZGVidWcgPj0gMikgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmYWlsZWQgdG8gdHJhbnNtaXQgcGFja2V0XG4iLCBkZXYtPm5hbWUpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChlbHBfZGVidWcgPj0gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBwYWNrZXQgb2YgbGVuZ3RoICVkIHNlbnRcbiIsIGRldi0+bmFtZSwgKGludCkgc2tiLT5sZW4pOworCisJLyoKKwkgKiBzdGFydCB0aGUgdHJhbnNtaXQgdGltZW91dAorCSAqLworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJcHJpbWVfcngoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHJldHVybiBzdGF0aXN0aWNzIG9uIHRoZSBib2FyZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZWxwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWVscF9kZXZpY2UgKmFkYXB0ZXIgPSAoZWxwX2RldmljZSAqKSBkZXYtPnByaXY7CisKKwlpZiAoZWxwX2RlYnVnID49IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVxdWVzdCBmb3Igc3RhdHNcbiIsIGRldi0+bmFtZSk7CisKKwkvKiBJZiB0aGUgZGV2aWNlIGlzIGNsb3NlZCwganVzdCByZXR1cm4gdGhlIGxhdGVzdCBzdGF0cyB3ZSBoYXZlLAorCSAgIC0gd2UgY2Fubm90IGFzayBmcm9tIHRoZSBhZGFwdGVyIHdpdGhvdXQgaW50ZXJydXB0cyAqLworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gJmFkYXB0ZXItPnN0YXRzOworCisJLyogc2VuZCBhIGdldCBzdGF0aXN0aWNzIGNvbW1hbmQgdG8gdGhlIGJvYXJkICovCisJYWRhcHRlci0+dHhfcGNiLmNvbW1hbmQgPSBDTURfTkVUV09SS19TVEFUSVNUSUNTOworCWFkYXB0ZXItPnR4X3BjYi5sZW5ndGggPSAwOworCWFkYXB0ZXItPmdvdFtDTURfTkVUV09SS19TVEFUSVNUSUNTXSA9IDA7CisJaWYgKCFzZW5kX3BjYihkZXYsICZhZGFwdGVyLT50eF9wY2IpKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZG4ndCBzZW5kIGdldCBzdGF0aXN0aWNzIGNvbW1hbmRcbiIsIGRldi0+bmFtZSk7CisJZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBUSU1FT1VUOworCQl3aGlsZSAoYWRhcHRlci0+Z290W0NNRF9ORVRXT1JLX1NUQVRJU1RJQ1NdID09IDAgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpOworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJVElNRU9VVF9NU0coX19MSU5FX18pOworCQkJcmV0dXJuICZhZGFwdGVyLT5zdGF0czsKKwkJfQorCX0KKworCS8qIHN0YXRpc3RpY3MgYXJlIG5vdyB1cCB0byBkYXRlICovCisJcmV0dXJuICZhZGFwdGVyLT5zdGF0czsKK30KKworCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXNwcmludGYoaW5mby0+YnVzX2luZm8sICJJU0EgMHglbHgiLCBkZXYtPmJhc2VfYWRkcik7Cit9CisKK3N0YXRpYyB1MzIgbmV0ZGV2X2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBkZWJ1ZzsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgbGV2ZWwpCit7CisJZGVidWcgPSBsZXZlbDsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKKwkuZ2V0X21zZ2xldmVsCQk9IG5ldGRldl9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSBuZXRkZXZfc2V0X21zZ2xldmVsLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGNsb3NlIHRoZSBib2FyZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgZWxwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZWxwX2RldmljZSAqYWRhcHRlcjsKKworCWFkYXB0ZXIgPSBkZXYtPnByaXY7CisKKwlpZiAoZWxwX2RlYnVnID49IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVxdWVzdCB0byBjbG9zZSBkZXZpY2VcbiIsIGRldi0+bmFtZSk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBTb21lb25lIG1heSByZXF1ZXN0IHRoZSBkZXZpY2Ugc3RhdGlzdGljIGluZm9ybWF0aW9uIGV2ZW4gd2hlbgorCSAqIHRoZSBpbnRlcmZhY2UgaXMgY2xvc2VkLiBUaGUgZm9sbG93aW5nIHdpbGwgdXBkYXRlIHRoZSBzdGF0aXN0aWNzCisJICogc3RydWN0dXJlIGluIHRoZSBkcml2ZXIsIHNvIHdlJ2xsIGJlIGFibGUgdG8gZ2l2ZSBjdXJyZW50IHN0YXRpc3RpY3MuCisJICovCisJKHZvaWQpIGVscF9nZXRfc3RhdHMoZGV2KTsKKworCS8qCisJICogZGlzYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBib2FyZAorCSAqLworCW91dGJfY29udHJvbCgwLCBkZXYpOworCisJLyoKKwkgKiByZWxlYXNlIHRoZSBJUlEKKwkgKi8KKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCWZyZWVfZG1hKGRldi0+ZG1hKTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSBhZGFwdGVyLT5kbWFfYnVmZmVyLCBnZXRfb3JkZXIoRE1BX0JVRkZFUl9TSVpFKSk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2V0IG11bHRpY2FzdCBsaXN0CisgKiBudW1fYWRkcnM9PTA6IGNsZWFyIG1jX2xpc3QKKyAqIG51bV9hZGRycz09LTE6IHNldCBwcm9taXNjdW91cyBtb2RlCisgKiBudW1fYWRkcnM+MDogc2V0IG1jX2xpc3QKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBlbHBfc2V0X21jX2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllbHBfZGV2aWNlICphZGFwdGVyID0gKGVscF9kZXZpY2UgKikgZGV2LT5wcml2OworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pID0gZGV2LT5tY19saXN0OworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZWxwX2RlYnVnID49IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVxdWVzdCB0byBzZXQgbXVsdGljYXN0IGxpc3RcbiIsIGRldi0+bmFtZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCQorCWlmICghKGRldi0+ZmxhZ3MgJiAoSUZGX1BST01JU0MgfCBJRkZfQUxMTVVMVEkpKSkgeworCQkvKiBzZW5kIGEgImxvYWQgbXVsdGljYXN0IGxpc3QiIGNvbW1hbmQgdG8gdGhlIGJvYXJkLCBtYXggMTAgYWRkcnMvY21kICovCisJCS8qIGlmIG51bV9hZGRycz09MCB0aGUgbGlzdCB3aWxsIGJlIGNsZWFyZWQgKi8KKwkJYWRhcHRlci0+dHhfcGNiLmNvbW1hbmQgPSBDTURfTE9BRF9NVUxUSUNBU1RfTElTVDsKKwkJYWRhcHRlci0+dHhfcGNiLmxlbmd0aCA9IDYgKiBkZXYtPm1jX2NvdW50OworCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrKSB7CisJCQltZW1jcHkoYWRhcHRlci0+dHhfcGNiLmRhdGEubXVsdGljYXN0W2ldLCBkbWktPmRtaV9hZGRyLCA2KTsKKwkJCWRtaSA9IGRtaS0+bmV4dDsKKwkJfQorCQlhZGFwdGVyLT5nb3RbQ01EX0xPQURfTVVMVElDQVNUX0xJU1RdID0gMDsKKwkJaWYgKCFzZW5kX3BjYihkZXYsICZhZGFwdGVyLT50eF9wY2IpKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGRuJ3Qgc2VuZCBzZXRfbXVsdGljYXN0IGNvbW1hbmRcbiIsIGRldi0+bmFtZSk7CisJCWVsc2UgeworCQkJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIFRJTUVPVVQ7CisJCQl3aGlsZSAoYWRhcHRlci0+Z290W0NNRF9MT0FEX01VTFRJQ0FTVF9MSVNUXSA9PSAwICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKTsKKwkJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQkJVElNRU9VVF9NU0coX19MSU5FX18pOworCQkJfQorCQl9CisJCWlmIChkZXYtPm1jX2NvdW50KQorCQkJYWRhcHRlci0+dHhfcGNiLmRhdGEuY29uZmlndXJlID0gTk9fTE9PUEJBQ0sgfCBSRUNWX0JST0FEIHwgUkVDVl9NVUxUSTsKKwkJZWxzZQkJLyogbnVtX2FkZHJzID09IDAgKi8KKwkJCWFkYXB0ZXItPnR4X3BjYi5kYXRhLmNvbmZpZ3VyZSA9IE5PX0xPT1BCQUNLIHwgUkVDVl9CUk9BRDsKKwl9IGVsc2UKKwkJYWRhcHRlci0+dHhfcGNiLmRhdGEuY29uZmlndXJlID0gTk9fTE9PUEJBQ0sgfCBSRUNWX1BST01JU0M7CisJLyoKKwkgKiBjb25maWd1cmUgYWRhcHRlciB0byByZWNlaXZlIG1lc3NhZ2VzIChhcyBzcGVjaWZpZWQgYWJvdmUpCisJICogYW5kIHdhaXQgZm9yIHJlc3BvbnNlCisJICovCisJaWYgKGVscF9kZWJ1ZyA+PSAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNlbmRpbmcgODI1ODYgY29uZmlndXJlIGNvbW1hbmRcbiIsIGRldi0+bmFtZSk7CisJYWRhcHRlci0+dHhfcGNiLmNvbW1hbmQgPSBDTURfQ09ORklHVVJFXzgyNTg2OworCWFkYXB0ZXItPnR4X3BjYi5sZW5ndGggPSAyOworCWFkYXB0ZXItPmdvdFtDTURfQ09ORklHVVJFXzgyNTg2XSA9IDA7CisJaWYgKCFzZW5kX3BjYihkZXYsICZhZGFwdGVyLT50eF9wY2IpKQorCXsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZG4ndCBzZW5kIDgyNTg2IGNvbmZpZ3VyZSBjb21tYW5kXG4iLCBkZXYtPm5hbWUpOworCX0KKwllbHNlIHsKKwkJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIFRJTUVPVVQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwkJd2hpbGUgKGFkYXB0ZXItPmdvdFtDTURfQ09ORklHVVJFXzgyNTg2XSA9PSAwICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKTsKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdGltZW91dCkpCisJCQlUSU1FT1VUX01TRyhfX0xJTkVfXyk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQSBjb3VwbGUgb2YgdGVzdHMgdG8gc2VlIGlmIHRoZXJlJ3MgM0M1MDUgb3Igbm90CisgKiBDYWxsZWQgb25seSBieSBlbHBfYXV0b2RldGVjdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBfX2luaXQgZWxwX3NlbnNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGFkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwljb25zdCBjaGFyICpuYW1lID0gZGV2LT5uYW1lOworCWJ5dGUgb3JpZ19IU1I7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGFkZHIsIEVMUF9JT19FWFRFTlQsICIzYzUwNSIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW9yaWdfSFNSID0gaW5iX3N0YXR1cyhhZGRyKTsKKworCWlmIChlbHBfZGVidWcgPiAwKQorCQlwcmludGsoc2VhcmNoX21zZywgbmFtZSwgYWRkcik7CisKKwlpZiAob3JpZ19IU1IgPT0gMHhmZikgeworCQlpZiAoZWxwX2RlYnVnID4gMCkKKwkJCXByaW50ayhub3Rmb3VuZF9tc2csIDEpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBXYWl0IGZvciBhIHdoaWxlOyB0aGUgYWRhcHRlciBtYXkgc3RpbGwgYmUgYm9vdGluZyB1cCAqLworCWlmIChlbHBfZGVidWcgPiAwKQorCQlwcmludGsoc3RpbGxsb29raW5nX21zZyk7CisKKwlpZiAob3JpZ19IU1IgJiBESVIpIHsKKwkJLyogSWYgSENSLkRJUiBpcyB1cCwgd2UgcHVsbCBpdCBkb3duLiBIU1IuRElSIHNob3VsZCBmb2xsb3cuICovCisJCW91dGIoMCwgZGV2LT5iYXNlX2FkZHIgKyBQT1JUX0NPTlRST0wpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMzAqSFovMTAwKTsKKwkJaWYgKGluYl9zdGF0dXMoYWRkcikgJiBESVIpIHsKKwkJCWlmIChlbHBfZGVidWcgPiAwKQorCQkJCXByaW50ayhub3Rmb3VuZF9tc2csIDIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgeworCQkvKiBJZiBIQ1IuRElSIGlzIGRvd24sIHdlIHB1bGwgaXQgdXAuIEhTUi5ESVIgc2hvdWxkIGZvbGxvdy4gKi8KKwkJb3V0YihESVIsIGRldi0+YmFzZV9hZGRyICsgUE9SVF9DT05UUk9MKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDMwKkhaLzEwMCk7CisJCWlmICghKGluYl9zdGF0dXMoYWRkcikgJiBESVIpKSB7CisJCQlpZiAoZWxwX2RlYnVnID4gMCkKKwkJCQlwcmludGsobm90Zm91bmRfbXNnLCAzKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCS8qCisJICogSXQgY2VydGFpbmx5IGxvb2tzIGxpa2UgYSAzYzUwNS4KKwkgKi8KKwlpZiAoZWxwX2RlYnVnID4gMCkKKwkJcHJpbnRrKGZvdW5kX21zZyk7CisKKwlyZXR1cm4gMDsKK291dDoKKwlyZWxlYXNlX3JlZ2lvbihhZGRyLCBFTFBfSU9fRVhURU5UKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTZWFyY2ggdGhyb3VnaCBhZGRyX2xpc3RbXSBhbmQgdHJ5IHRvIGZpbmQgYSAzQzUwNQorICogQ2FsbGVkIG9ubHkgYnkgZXBsdXNfcHJvYmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9faW5pdCBlbHBfYXV0b2RldGVjdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpZHggPSAwOworCisJLyogaWYgYmFzZSBhZGRyZXNzIHNldCwgdGhlbiBvbmx5IGNoZWNrIHRoYXQgYWRkcmVzcworCSAgIG90aGVyd2lzZSwgcnVuIHRocm91Z2ggdGhlIHRhYmxlICovCisJaWYgKGRldi0+YmFzZV9hZGRyICE9IDApIHsJLyogZGV2LT5iYXNlX2FkZHIgPT0gMCA9PT4gcGxhaW4gYXV0b2RldGVjdCAqLworCQlpZiAoZWxwX3NlbnNlKGRldikgPT0gMCkKKwkJCXJldHVybiBkZXYtPmJhc2VfYWRkcjsKKwl9IGVsc2UKKwkJd2hpbGUgKChkZXYtPmJhc2VfYWRkciA9IGFkZHJfbGlzdFtpZHgrK10pKSB7CisJCQlpZiAoZWxwX3NlbnNlKGRldikgPT0gMCkKKwkJCQlyZXR1cm4gZGV2LT5iYXNlX2FkZHI7CisJCX0KKworCS8qIGNvdWxkIG5vdCBmaW5kIGFuIGFkYXB0ZXIgKi8KKwlpZiAoZWxwX2RlYnVnID4gMCkKKwkJcHJpbnRrKGNvdWxkbm90X21zZywgZGV2LT5uYW1lKTsKKworCXJldHVybiAwOwkJLyogQmVjYXVzZSBvZiB0aGlzLCB0aGUgbGF5ZXIgYWJvdmUgd2lsbCByZXR1cm4gLUVOT0RFViAqLworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwcm9iZSBmb3IgYW4gRXRoZXJsaW5rIFBsdXMgYm9hcmQgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlcmUgYXJlIHRocmVlIHNpdHVhdGlvbnMgd2UgbmVlZCB0byBiZSBhYmxlIHRvIGRldGVjdCBoZXJlOgorCisgKiAgYSkgdGhlIGNhcmQgaXMgaWRsZQorICogIGIpIHRoZSBjYXJkIGlzIHN0aWxsIGJvb3RpbmcgdXAKKyAqICBjKSB0aGUgY2FyZCBpcyBzdHVjayBpbiBhIHN0cmFuZ2Ugc3RhdGUgKHNvbWUgRE9TIGRyaXZlcnMgZG8gdGhpcykKKyAqCisgKiBJbiBjYXNlIChhKSwgYWxsIGlzIHdlbGwuICBJbiBjYXNlIChiKSwgd2Ugd2FpdCAxMCBzZWNvbmRzIHRvIHNlZSBpZiB0aGUKKyAqIGNhcmQgZmluaXNoZXMgYm9vdGluZywgYW5kIGNhcnJ5IG9uIGlmIHNvLiAgSW4gY2FzZSAoYyksIHdlIGRvIGEgaGFyZCByZXNldCwKKyAqIGxvb3Agcm91bmQsIGFuZCBob3BlIGZvciB0aGUgYmVzdC4KKyAqCisgKiBUaGlzIGlzIGFsbCB2ZXJ5IHVucGxlYXNhbnQsIGJ1dCBob3BlZnVsbHkgYXZvaWRzIHRoZSBwcm9ibGVtcyB3aXRoIHRoZSBvbGQKKyAqIHByb2JlIGNvZGUgKHdoaWNoIGhhZCBhIDE1LXNlY29uZCBkZWxheSBpZiB0aGUgY2FyZCB3YXMgaWRsZSwgYW5kIGRpZG4ndAorICogd29yayBhdCBhbGwgaWYgaXQgd2FzIGluIGEgd2VpcmQgc3RhdGUpLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGVscGx1c19zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWVscF9kZXZpY2UgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJaW50IGksIHRyaWVzLCB0cmllczEsIG9rYXk7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgY29va2llID0gMDsKKwlpbnQgZXJyID0gLUVOT0RFVjsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCS8qCisJICogIHNldHVwIGFkYXB0ZXIgc3RydWN0dXJlCisJICovCisKKwlkZXYtPmJhc2VfYWRkciA9IGVscF9hdXRvZGV0ZWN0KGRldik7CisJaWYgKCFkZXYtPmJhc2VfYWRkcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlhZGFwdGVyLT5zZW5kX3BjYl9zZW1hcGhvcmUgPSAwOworCisJZm9yICh0cmllczEgPSAwOyB0cmllczEgPCAzOyB0cmllczErKykgeworCQlvdXRiX2NvbnRyb2woKGFkYXB0ZXItPmhjcl92YWwgfCBDTURFKSAmIH5ESVIsIGRldik7CisJCS8qIEZpcnN0IHRyeSB0byB3cml0ZSBqdXN0IG9uZSBieXRlLCB0byBzZWUgaWYgdGhlIGNhcmQgaXMKKwkJICogcmVzcG9uZGluZyBhdCBhbGwgbm9ybWFsbHkuCisJCSAqLworCQl0aW1lb3V0ID0gamlmZmllcyArIDUqSFovMTAwOworCQlva2F5ID0gMDsKKwkJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpICYmICEoaW5iX3N0YXR1cyhkZXYtPmJhc2VfYWRkcikgJiBIQ1JFKSk7CisJCWlmICgoaW5iX3N0YXR1cyhkZXYtPmJhc2VfYWRkcikgJiBIQ1JFKSkgeworCQkJb3V0Yl9jb21tYW5kKDAsIGRldi0+YmFzZV9hZGRyKTsJLyogc2VuZCBhIHNwdXJpb3VzIGJ5dGUgKi8KKwkJCXRpbWVvdXQgPSBqaWZmaWVzICsgNSpIWi8xMDA7CisJCQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkgJiYgIShpbmJfc3RhdHVzKGRldi0+YmFzZV9hZGRyKSAmIEhDUkUpKTsKKwkJCWlmIChpbmJfc3RhdHVzKGRldi0+YmFzZV9hZGRyKSAmIEhDUkUpCisJCQkJb2theSA9IDE7CisJCX0KKwkJaWYgKCFva2F5KSB7CisJCQkvKiBOb3BlLCBpdCdzIGlnbm9yaW5nIHRoZSBjb21tYW5kIHJlZ2lzdGVyLiAgVGhpcyBtZWFucyB0aGF0CisJCQkgKiBlaXRoZXIgaXQncyBzdGlsbCBib290aW5nIHVwLCBvciBpdCdzIGRpZWQuCisJCQkgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvbW1hbmQgcmVnaXN0ZXIgd291bGRuJ3QgZHJhaW4sICIsIGRldi0+bmFtZSk7CisJCQlpZiAoKGluYl9zdGF0dXMoZGV2LT5iYXNlX2FkZHIpICYgNykgPT0gMykgeworCQkJCS8qIElmIHRoZSBhZGFwdGVyIHN0YXR1cyBpcyAzLCBpdCAqY291bGQqIHN0aWxsIGJlIGJvb3RpbmcuCisJCQkJICogR2l2ZSBpdCB0aGUgYmVuZWZpdCBvZiB0aGUgZG91YnQgZm9yIDEwIHNlY29uZHMuCisJCQkJICovCisJCQkJcHJpbnRrKCJhc3N1bWluZyAzYzUwNSBzdGlsbCBzdGFydGluZ1xuIik7CisJCQkJdGltZW91dCA9IGppZmZpZXMgKyAxMCpIWjsKKwkJCQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkgJiYgKGluYl9zdGF0dXMoZGV2LT5iYXNlX2FkZHIpICYgNykpOworCQkJCWlmIChpbmJfc3RhdHVzKGRldi0+YmFzZV9hZGRyKSAmIDcpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogM2M1MDUgZmFpbGVkIHRvIHN0YXJ0XG4iLCBkZXYtPm5hbWUpOworCQkJCX0gZWxzZSB7CisJCQkJCW9rYXkgPSAxOyAgLyogSXQgc3RhcnRlZCAqLworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogT3RoZXJ3aXNlLCBpdCBtdXN0IGp1c3QgYmUgaW4gYSBzdHJhbmdlCisJCQkJICogc3RhdGUuICBXZSBwcm9iYWJseSBuZWVkIHRvIGtpY2sgaXQuCisJCQkJICovCisJCQkJcHJpbnRrKCIzYzUwNSBpcyBzdWxraW5nXG4iKTsKKwkJCX0KKwkJfQorCQlmb3IgKHRyaWVzID0gMDsgdHJpZXMgPCA1ICYmIG9rYXk7IHRyaWVzKyspIHsKKworCQkJLyoKKwkJCSAqIFRyeSB0byBzZXQgdGhlIEV0aGVybmV0IGFkZHJlc3MsIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBib2FyZAorCQkJICogaXMgd29ya2luZy4KKwkJCSAqLworCQkJYWRhcHRlci0+dHhfcGNiLmNvbW1hbmQgPSBDTURfU1RBVElPTl9BRERSRVNTOworCQkJYWRhcHRlci0+dHhfcGNiLmxlbmd0aCA9IDA7CisJCQljb29raWUgPSBwcm9iZV9pcnFfb24oKTsKKwkJCWlmICghc2VuZF9wY2IoZGV2LCAmYWRhcHRlci0+dHhfcGNiKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBzZW5kIGZpcnN0IFBDQlxuIiwgZGV2LT5uYW1lKTsKKwkJCQlwcm9iZV9pcnFfb2ZmKGNvb2tpZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXJlY2VpdmVfcGNiKGRldiwgJmFkYXB0ZXItPnJ4X3BjYikpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZCBub3QgcmVhZCBmaXJzdCBQQ0JcbiIsIGRldi0+bmFtZSk7CisJCQkJcHJvYmVfaXJxX29mZihjb29raWUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKChhZGFwdGVyLT5yeF9wY2IuY29tbWFuZCAhPSBDTURfQUREUkVTU19SRVNQT05TRSkgfHwKKwkJCSAgICAoYWRhcHRlci0+cnhfcGNiLmxlbmd0aCAhPSA2KSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZpcnN0IFBDQiB3cm9uZyAoJWQsICVkKVxuIiwgZGV2LT5uYW1lLCBhZGFwdGVyLT5yeF9wY2IuY29tbWFuZCwgYWRhcHRlci0+cnhfcGNiLmxlbmd0aCk7CisJCQkJcHJvYmVfaXJxX29mZihjb29raWUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZ290byBva2F5OworCQl9CisJCS8qIEl0J3MgYnJva2VuLiAgRG8gYSBoYXJkIHJlc2V0IHRvIHJlLWluaXRpYWxpc2UgdGhlIGJvYXJkLAorCQkgKiBhbmQgdHJ5IGFnYWluLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlc2V0dGluZyBhZGFwdGVyXG4iLCBkZXYtPm5hbWUpOworCQlvdXRiX2NvbnRyb2woYWRhcHRlci0+aGNyX3ZhbCB8IEZMU0ggfCBBVFROLCBkZXYpOworCQlvdXRiX2NvbnRyb2woYWRhcHRlci0+aGNyX3ZhbCAmIH4oRkxTSCB8IEFUVE4pLCBkZXYpOworCX0KKwlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gaW5pdGlhbGlzZSAzYzUwNVxuIiwgZGV2LT5uYW1lKTsKKwlnb3RvIG91dDsKKworICAgICAgb2theToKKwlpZiAoZGV2LT5pcnEpIHsJCS8qIElzIHRoZXJlIGEgcHJlc2V0IElSUT8gKi8KKwkJaW50IHJwdCA9IHByb2JlX2lycV9vZmYoY29va2llKTsKKwkJaWYgKGRldi0+aXJxICE9IHJwdCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHdhcm5pbmcsIGlycSAlZCBjb25maWd1cmVkIGJ1dCAlZCBkZXRlY3RlZFxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSwgcnB0KTsKKwkJfQorCQkvKiBpZiBkZXYtPmlycSA9PSBwcm9iZV9pcnFfb2ZmKGNvb2tpZSksIGFsbCBpcyB3ZWxsICovCisJfSBlbHNlCQkgICAgICAgLyogTm8gcHJlc2V0IElSUTsganVzdCB1c2Ugd2hhdCB3ZSBjYW4gZGV0ZWN0ICovCisJCWRldi0+aXJxID0gcHJvYmVfaXJxX29mZihjb29raWUpOworCXN3aXRjaCAoZGV2LT5pcnEpIHsgICAgLyogTGVnYWwsIHNhbmU/ICovCisJY2FzZSAwOgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJUlEgcHJvYmUgZmFpbGVkOiBjaGVjayAzYzUwNSBqdW1wZXJzLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCWNhc2UgMToKKwljYXNlIDY6CisJY2FzZSA4OgorCWNhc2UgMTM6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEltcG9zc2libGUgSVJRICVkIHJlcG9ydGVkIGJ5IHByb2JlX2lycV9vZmYoKS5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJICAgICAgIGdvdG8gb3V0OworCX0KKwkvKgorCSAqICBOb3cgd2UgaGF2ZSB0aGUgSVJRIG51bWJlciBzbyB3ZSBjYW4gZGlzYWJsZSB0aGUgaW50ZXJydXB0cyBmcm9tCisJICogIHRoZSBib2FyZCB1bnRpbCB0aGUgYm9hcmQgaXMgb3BlbmVkLgorCSAqLworCW91dGJfY29udHJvbChhZGFwdGVyLT5oY3JfdmFsICYgfkNNREUsIGRldik7CisKKwkvKgorCSAqIGNvcHkgRXRoZXJuZXQgYWRkcmVzcyBpbnRvIHN0cnVjdHVyZQorCSAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSBhZGFwdGVyLT5yeF9wY2IuZGF0YS5ldGhfYWRkcltpXTsKKworCS8qIGZpbmQgYSBETUEgY2hhbm5lbCAqLworCWlmICghZGV2LT5kbWEpIHsKKwkJaWYgKGRldi0+bWVtX3N0YXJ0KSB7CisJCQlkZXYtPmRtYSA9IGRldi0+bWVtX3N0YXJ0ICYgNzsKKwkJfQorCQllbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB3YXJuaW5nLCBETUEgY2hhbm5lbCBub3Qgc3BlY2lmaWVkLCB1c2luZyBkZWZhdWx0XG4iLCBkZXYtPm5hbWUpOworCQkJZGV2LT5kbWEgPSBFTFBfRE1BOworCQl9CisJfQorCisJLyoKKwkgKiBwcmludCByZW1haW5kZXIgb2Ygc3RhcnR1cCBtZXNzYWdlCisJICovCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IDNjNTA1IGF0ICUjbHgsIGlycSAlZCwgZG1hICVkLCAiLAorCSAgICAgICBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwgZGV2LT5kbWEpOworCXByaW50aygiYWRkciAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCwgIiwKKwkgICAgICAgZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKKwkgICAgICAgZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7CisKKwkvKgorCSAqIHJlYWQgbW9yZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBhZGFwdGVyCisJICovCisKKwlhZGFwdGVyLT50eF9wY2IuY29tbWFuZCA9IENNRF9BREFQVEVSX0lORk87CisJYWRhcHRlci0+dHhfcGNiLmxlbmd0aCA9IDA7CisJaWYgKCFzZW5kX3BjYihkZXYsICZhZGFwdGVyLT50eF9wY2IpIHx8CisJICAgICFyZWNlaXZlX3BjYihkZXYsICZhZGFwdGVyLT5yeF9wY2IpIHx8CisJICAgIChhZGFwdGVyLT5yeF9wY2IuY29tbWFuZCAhPSBDTURfQURBUFRFUl9JTkZPX1JFU1BPTlNFKSB8fAorCSAgICAoYWRhcHRlci0+cnhfcGNiLmxlbmd0aCAhPSAxMCkpIHsKKwkJcHJpbnRrKCJub3QgcmVzcG9uZGluZyB0byBzZWNvbmQgUENCXG4iKTsKKwl9CisJcHJpbnRrKCJyZXYgJWQuJWQsICVka1xuIiwgYWRhcHRlci0+cnhfcGNiLmRhdGEuaW5mby5tYWpvcl92ZXJzLCBhZGFwdGVyLT5yeF9wY2IuZGF0YS5pbmZvLm1pbm9yX3ZlcnMsIGFkYXB0ZXItPnJ4X3BjYi5kYXRhLmluZm8uUkFNX3N6KTsKKworCS8qCisJICogcmVjb25maWd1cmUgdGhlIGFkYXB0ZXIgbWVtb3J5IHRvIGJldHRlciBzdWl0IG91ciBwdXJwb3NlcworCSAqLworCWFkYXB0ZXItPnR4X3BjYi5jb21tYW5kID0gQ01EX0NPTkZJR1VSRV9BREFQVEVSX01FTU9SWTsKKwlhZGFwdGVyLT50eF9wY2IubGVuZ3RoID0gMTI7CisJYWRhcHRlci0+dHhfcGNiLmRhdGEubWVtY29uZi5jbWRfcSA9IDg7CisJYWRhcHRlci0+dHhfcGNiLmRhdGEubWVtY29uZi5yY3ZfcSA9IDg7CisJYWRhcHRlci0+dHhfcGNiLmRhdGEubWVtY29uZi5tY2FzdCA9IDEwOworCWFkYXB0ZXItPnR4X3BjYi5kYXRhLm1lbWNvbmYuZnJhbWUgPSAxMDsKKwlhZGFwdGVyLT50eF9wY2IuZGF0YS5tZW1jb25mLnJjdl9iID0gMTA7CisJYWRhcHRlci0+dHhfcGNiLmRhdGEubWVtY29uZi5wcm9ncyA9IDA7CisJaWYgKCFzZW5kX3BjYihkZXYsICZhZGFwdGVyLT50eF9wY2IpIHx8CisJICAgICFyZWNlaXZlX3BjYihkZXYsICZhZGFwdGVyLT5yeF9wY2IpIHx8CisJICAgIChhZGFwdGVyLT5yeF9wY2IuY29tbWFuZCAhPSBDTURfQ09ORklHVVJFX0FEQVBURVJfUkVTUE9OU0UpIHx8CisJICAgIChhZGFwdGVyLT5yeF9wY2IubGVuZ3RoICE9IDIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBjb25maWd1cmUgYWRhcHRlciBtZW1vcnlcbiIsIGRldi0+bmFtZSk7CisJfQorCWlmIChhZGFwdGVyLT5yeF9wY2IuZGF0YS5jb25maWd1cmUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYWRhcHRlciBjb25maWd1cmF0aW9uIGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKKwl9CisKKwlkZXYtPm9wZW4gPSBlbHBfb3BlbjsJCQkJLyogbG9jYWwgKi8KKwlkZXYtPnN0b3AgPSBlbHBfY2xvc2U7CQkJCS8qIGxvY2FsICovCisJZGV2LT5nZXRfc3RhdHMgPSBlbHBfZ2V0X3N0YXRzOwkJCS8qIGxvY2FsICovCisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBlbHBfc3RhcnRfeG1pdDsJCS8qIGxvY2FsICovCisJZGV2LT50eF90aW1lb3V0ID0gZWxwX3RpbWVvdXQ7CQkJLyogbG9jYWwgKi8KKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gMTAqSFo7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBlbHBfc2V0X21jX2xpc3Q7CS8qIGxvY2FsICovCisJZGV2LT5ldGh0b29sX29wcyA9ICZuZXRkZXZfZXRodG9vbF9vcHM7CQkvKiBsb2NhbCAqLworCisJbWVtc2V0KCYoYWRhcHRlci0+c3RhdHMpLCAwLCBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKKwlkZXYtPm1lbV9zdGFydCA9IGRldi0+bWVtX2VuZCA9IDA7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXJldHVybiAwOworb3V0OgorCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBFTFBfSU9fRVhURU5UKTsKKwlyZXR1cm4gZXJyOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgZWxwbHVzX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoZWxwX2RldmljZSkpOworCWludCBlcnI7CisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisKKwllcnIgPSBlbHBsdXNfc2V0dXAoZGV2KTsKKwlpZiAoZXJyKSB7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCXJldHVybiBkZXY7Cit9CisKKyNlbHNlCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl8zYzUwNVtFTFBfTUFYX0NBUkRTXTsKK3N0YXRpYyBpbnQgaW9bRUxQX01BWF9DQVJEU107CitzdGF0aWMgaW50IGlycVtFTFBfTUFYX0NBUkRTXTsKK3N0YXRpYyBpbnQgZG1hW0VMUF9NQVhfQ0FSRFNdOworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShkbWEsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiRXRoZXJMaW5rIFBsdXMgSS9PIGJhc2UgYWRkcmVzcyhlcykiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiRXRoZXJMaW5rIFBsdXMgSVJRIG51bWJlcihzKSAoYXNzaWduZWQpIik7CitNT0RVTEVfUEFSTV9ERVNDKGRtYSwgIkV0aGVyTGluayBQbHVzIERNQSBjaGFubmVsKHMpIik7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWludCB0aGlzX2RldiwgZm91bmQgPSAwOworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgRUxQX01BWF9DQVJEUzsgdGhpc19kZXYrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKGVscF9kZXZpY2UpKTsKKwkJaWYgKCFkZXYpCisJCQlicmVhazsKKworCQlkZXYtPmlycSA9IGlycVt0aGlzX2Rldl07CisJCWRldi0+YmFzZV9hZGRyID0gaW9bdGhpc19kZXZdOworCQlpZiAoZG1hW3RoaXNfZGV2XSkgeworCQkJZGV2LT5kbWEgPSBkbWFbdGhpc19kZXZdOworCQl9IGVsc2UgeworCQkJZGV2LT5kbWEgPSBFTFBfRE1BOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM2M1MDUuYzogd2FybmluZywgdXNpbmcgZGVmYXVsdCBETUEgY2hhbm5lbCxcbiIpOworCQl9CisJCWlmIChpb1t0aGlzX2Rldl0gPT0gMCkgeworCQkJaWYgKHRoaXNfZGV2KSB7CisJCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXByaW50ayhLRVJOX05PVElDRSAiM2M1MDUuYzogbW9kdWxlIGF1dG9wcm9iZSBub3QgcmVjb21tZW5kZWQsIGdpdmUgaW89eHguXG4iKTsKKwkJfQorCQlpZiAoZWxwbHVzX3NldHVwKGRldikgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiM2M1MDUuYzogRmFpbGVkIHRvIHJlZ2lzdGVyIGNhcmQgYXQgMHgleC5cbiIsIGlvW3RoaXNfZGV2XSk7CisJCQlmcmVlX25ldGRldihkZXYpOworCQkJYnJlYWs7CisJCX0KKwkJZGV2XzNjNTA1W3RoaXNfZGV2XSA9IGRldjsKKwkJZm91bmQrKzsKKwl9CisJaWYgKCFmb3VuZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgdGhpc19kZXY7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBFTFBfTUFYX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfM2M1MDVbdGhpc19kZXZdOworCQlpZiAoZGV2KSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVMUF9JT19FWFRFTlQpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJfQorCX0KK30KKworI2VuZGlmCQkJCS8qIE1PRFVMRSAqLworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MDUuaCBiL2RyaXZlcnMvbmV0LzNjNTA1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkZmVlZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0LzNjNTA1LmgKQEAgLTAsMCArMSwyOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBkZWZpbmVzIGZvciAzQ29tIEV0aGVybGluayBQbHVzIGFkYXB0ZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRUxQX0RNQSAgICAgICA2CisjZGVmaW5lIEVMUF9SWF9QQ0JTICAgNAorI2RlZmluZSBFTFBfTUFYX0NBUkRTIDQKKworLyoKKyAqIEkvTyByZWdpc3RlciBvZmZzZXRzCisgKi8KKyNkZWZpbmUJUE9SVF9DT01NQU5ECTB4MDAJLyogcmVhZC93cml0ZSwgOC1iaXQgKi8KKyNkZWZpbmUJUE9SVF9TVEFUVVMJMHgwMgkvKiByZWFkIG9ubHksIDgtYml0ICovCisjZGVmaW5lCVBPUlRfQVVYRE1BCTB4MDIJLyogd3JpdGUgb25seSwgOC1iaXQgKi8KKyNkZWZpbmUJUE9SVF9EQVRBCTB4MDQJLyogcmVhZC93cml0ZSwgMTYtYml0ICovCisjZGVmaW5lCVBPUlRfQ09OVFJPTAkweDA2CS8qIHJlYWQvd3JpdGUsIDgtYml0ICovCisKKyNkZWZpbmUgRUxQX0lPX0VYVEVOVAkweDEwCS8qIHNpemUgb2YgdXNlZCBJTyByZWdpc3RlcnMgKi8KKworLyoKKyAqIGhvc3QgY29udHJvbCByZWdpc3RlcnMgYml0cworICovCisjZGVmaW5lCUFUVE4JMHg4MAkvKiBhdHRlbnRpb24gKi8KKyNkZWZpbmUJRkxTSAkweDQwCS8qIGZsdXNoIGRhdGEgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BRQkweDIwCS8qIERNQSBlbmFibGUgKi8KKyNkZWZpbmUgRElSCTB4MTAJLyogZGlyZWN0aW9uICovCisjZGVmaW5lCVRDRU4JMHgwOAkvKiB0ZXJtaW5hbCBjb3VudCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lCUNNREUJMHgwNAkvKiBjb21tYW5kIHJlZ2lzdGVyIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUJSFNGMgkweDAyCS8qIGhvc3Qgc3RhdHVzIGZsYWcgMiAqLworI2RlZmluZQlIU0YxCTB4MDEJLyogaG9zdCBzdGF0dXMgZmxhZyAxICovCisKKy8qCisgKiBjb21iaW5hdGlvbnMgb2YgSFNGIGZsYWdzIHVzZWQgZm9yIFBDQiB0cmFuc21pc3Npb24KKyAqLworI2RlZmluZQlIU0ZfUENCX0FDSwlIU0YxCisjZGVmaW5lCUhTRl9QQ0JfTkFLCUhTRjIKKyNkZWZpbmUJSFNGX1BDQl9FTkQJKEhTRjJ8SFNGMSkKKyNkZWZpbmUJSFNGX1BDQl9NQVNLCShIU0YyfEhTRjEpCisKKy8qCisgKiBob3N0IHN0YXR1cyByZWdpc3RlciBiaXRzCisgKi8KKyNkZWZpbmUJSFJEWQkweDgwCS8qIGRhdGEgcmVnaXN0ZXIgcmVhZHkgKi8KKyNkZWZpbmUJSENSRQkweDQwCS8qIGNvbW1hbmQgcmVnaXN0ZXIgZW1wdHkgKi8KKyNkZWZpbmUJQUNSRgkweDIwCS8qIGFkYXB0ZXIgY29tbWFuZCByZWdpc3RlciBmdWxsICovCisvKiAjZGVmaW5lIERJUiAJMHgxMAlkaXJlY3Rpb24gLSBzYW1lIGFzIGluIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJRE9ORQkweDA4CS8qIERNQSBkb25lICovCisjZGVmaW5lCUFTRjMJMHgwNAkvKiBhZGFwdGVyIHN0YXR1cyBmbGFnIDMgKi8KKyNkZWZpbmUJQVNGMgkweDAyCS8qIGFkYXB0ZXIgc3RhdHVzIGZsYWcgMiAqLworI2RlZmluZQlBU0YxCTB4MDEJLyogYWRhcHRlciBzdGF0dXMgZmxhZyAxICovCisKKy8qCisgKiBjb21iaW5hdGlvbnMgb2YgQVNGIGZsYWdzIHVzZWQgZm9yIFBDQiByZWNlcHRpb24KKyAqLworI2RlZmluZQlBU0ZfUENCX0FDSwlBU0YxCisjZGVmaW5lCUFTRl9QQ0JfTkFLCUFTRjIKKyNkZWZpbmUJQVNGX1BDQl9FTkQJKEFTRjJ8QVNGMSkKKyNkZWZpbmUJQVNGX1BDQl9NQVNLCShBU0YyfEFTRjEpCisKKy8qCisgKiBob3N0IGF1eCBETUEgcmVnaXN0ZXIgYml0cworICovCisjZGVmaW5lCURNQV9CUlNUCTB4MDEJLyogRE1BIGJ1cnN0ICovCisKKy8qCisgKiBtYXhpbXVtIGFtb3VudCBvZiBkYXRhIGFsbG93ZWQgaW4gYSBQQ0IKKyAqLworI2RlZmluZQlNQVhfUENCX0RBVEEJNjIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIHRpbWVvdXQgdmFsdWUKKyAqCXRoaXMgaXMgYSByb3VnaCB2YWx1ZSB1c2VkIGZvciBsb29wcyB0byBzdG9wIHRoZW0gZnJvbSAKKyAqCWxvY2tpbmcgdXAgdGhlIHdob2xlIG1hY2hpbmUgaW4gdGhlIGNhc2Ugb2YgZmFpbHVyZSBvcgorICoJZXJyb3IgY29uZGl0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZQlUSU1FT1VUCTMwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBQQ0IgY29tbWFuZHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2VudW0geworICAvKgorICAgKiBob3N0IFBDQiBjb21tYW5kcworICAgKi8KKyAgQ01EX0NPTkZJR1VSRV9BREFQVEVSX01FTU9SWQk9IDB4MDEsCisgIENNRF9DT05GSUdVUkVfODI1ODYJCT0gMHgwMiwKKyAgQ01EX1NUQVRJT05fQUREUkVTUwkJPSAweDAzLAorICBDTURfRE1BX0RPV05MT0FECQk9IDB4MDQsCisgIENNRF9ETUFfVVBMT0FECQk9IDB4MDUsCisgIENNRF9QSU9fRE9XTkxPQUQJCT0gMHgwNiwKKyAgQ01EX1BJT19VUExPQUQJCT0gMHgwNywKKyAgQ01EX1JFQ0VJVkVfUEFDS0VUCQk9IDB4MDgsCisgIENNRF9UUkFOU01JVF9QQUNLRVQJCT0gMHgwOSwKKyAgQ01EX05FVFdPUktfU1RBVElTVElDUwk9IDB4MGEsCisgIENNRF9MT0FEX01VTFRJQ0FTVF9MSVNUCT0gMHgwYiwKKyAgQ01EX0NMRUFSX1BST0dSQU0JCT0gMHgwYywKKyAgQ01EX0RPV05MT0FEX1BST0dSQU0JCT0gMHgwZCwKKyAgQ01EX0VYRUNVVEVfUFJPR1JBTQkJPSAweDBlLAorICBDTURfU0VMRl9URVNUCQkJPSAweDBmLAorICBDTURfU0VUX1NUQVRJT05fQUREUkVTUwk9IDB4MTAsCisgIENNRF9BREFQVEVSX0lORk8JCT0gMHgxMSwKKyAgTlVNX1RSQU5TTUlUX0NNRFMsCisKKyAgLyoKKyAgICogYWRhcHRlciBQQ0IgY29tbWFuZHMKKyAgICovCisgIENNRF9DT05GSUdVUkVfQURBUFRFUl9SRVNQT05TRQk9IDB4MzEsCisgIENNRF9DT05GSUdVUkVfODI1ODZfUkVTUE9OU0UJCT0gMHgzMiwKKyAgQ01EX0FERFJFU1NfUkVTUE9OU0UJCQk9IDB4MzMsCisgIENNRF9ET1dOTE9BRF9EQVRBX1JFUVVFU1QJCT0gMHgzNCwKKyAgQ01EX1VQTE9BRF9EQVRBX1JFUVVFU1QJCT0gMHgzNSwKKyAgQ01EX1JFQ0VJVkVfUEFDS0VUX0NPTVBMRVRFCQk9IDB4MzgsCisgIENNRF9UUkFOU01JVF9QQUNLRVRfQ09NUExFVEUJCT0gMHgzOSwKKyAgQ01EX05FVFdPUktfU1RBVElTVElDU19SRVNQT05TRQk9IDB4M2EsCisgIENNRF9MT0FEX01VTFRJQ0FTVF9SRVNQT05TRQkJPSAweDNiLAorICBDTURfQ0xFQVJfUFJPR1JBTV9SRVNQT05TRQkJPSAweDNjLAorICBDTURfRE9XTkxPQURfUFJPR1JBTV9SRVNQT05TRQkJPSAweDNkLAorICBDTURfRVhFQ1VURV9SRVNQT05TRQkJCT0gMHgzZSwKKyAgQ01EX1NFTEZfVEVTVF9SRVNQT05TRQkJPSAweDNmLAorICBDTURfU0VUX0FERFJFU1NfUkVTUE9OU0UJCT0gMHg0MCwKKyAgQ01EX0FEQVBURVJfSU5GT19SRVNQT05TRQkJPSAweDQxCit9OworCisvKiBEZWZpbml0aW9ucyBmb3IgdGhlIFBDQiBkYXRhIHN0cnVjdHVyZSAqLworCisvKiBEYXRhIHVuaXRzICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgICBieXRlOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgICAgd29yZDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgICAgIGR3b3JkOworCisvKiBEYXRhIHN0cnVjdHVyZXMgKi8KK3N0cnVjdCBNZW1jb25mIHsKKwl3b3JkCWNtZF9xLAorCQlyY3ZfcSwKKwkJbWNhc3QsCisJCWZyYW1lLAorCQlyY3ZfYiwKKwkJcHJvZ3M7Cit9OworCitzdHJ1Y3QgUmN2X3BrdCB7CisJd29yZAlidWZfb2ZzLAorCQlidWZfc2VnLAorCQlidWZfbGVuLAorCQl0aW1lb3V0OworfTsKKworc3RydWN0IFhtaXRfcGt0IHsKKwl3b3JkCWJ1Zl9vZnMsCisJCWJ1Zl9zZWcsCisJCXBrdF9sZW47Cit9OworCitzdHJ1Y3QgUmN2X3Jlc3AgeworCXdvcmQJYnVmX29mcywKKwkJYnVmX3NlZywKKwkJYnVmX2xlbiwKKwkJcGt0X2xlbiwKKwkJdGltZW91dCwKKwkJc3RhdHVzOworCWR3b3JkCXRpbWV0YWc7Cit9OworCitzdHJ1Y3QgWG1pdF9yZXNwIHsKKwl3b3JkCWJ1Zl9vZnMsCisJCWJ1Zl9zZWcsCisJCWNfc3RhdCwKKwkJc3RhdHVzOworfTsKKworCitzdHJ1Y3QgTmV0c3RhdCB7CisJZHdvcmQJdG90X3JlY3YsCisJCXRvdF94bWl0OworCXdvcmQJZXJyX0NSQywKKwkJZXJyX2FsaWduLAorCQllcnJfcmVzLAorCQllcnJfb3ZycnVuOworfTsKKworCitzdHJ1Y3QgU2VsZnRlc3QgeworCXdvcmQJZXJyb3I7CisJdW5pb24geworCQl3b3JkIFJPTV9ja3N1bTsKKwkJc3RydWN0IHsKKwkJCXdvcmQgb2ZzLCBzZWc7CisJCX0gUkFNOworCQl3b3JkIGk4MjU4NjsKKwl9IGZhaWx1cmU7Cit9OworCitzdHJ1Y3QgSW5mbyB7CisJYnl0ZQltaW5vcl92ZXJzLAorCQltYWpvcl92ZXJzOworCXdvcmQJUk9NX2Nrc3VtLAorCQlSQU1fc3osCisJCWZyZWVfb2ZzLAorCQlmcmVlX3NlZzsKK307CisKK3N0cnVjdCBNZW1kdW1wIHsKKyAgICAgICB3b3JkIHNpemUsCisgICAgICAgICAgICBvZmYsCisgICAgICAgICAgICBzZWc7Cit9OworCisvKgorUHJpbWFyeSBDb21tYW5kIEJsb2NrLiBUaGUgbW9zdCBpbXBvcnRhbnQgZGF0YSBzdHJ1Y3R1cmUuIEFsbCBjb21tdW5pY2F0aW9uCitiZXR3ZWVuIHRoZSBob3N0IGFuZCB0aGUgYWRhcHRlciBpcyBkb25lIHdpdGggdGhlc2UuIChFeGNlcHQgZm9yIHRoZSBhY3R1YWwKK0V0aGVybmV0IGRhdGEsIHdoaWNoIGhhcyBkaWZmZXJlbnQgcGFja2FnaW5nLikKKyovCit0eXBlZGVmIHN0cnVjdCB7CisJYnl0ZQljb21tYW5kOworCWJ5dGUJbGVuZ3RoOworCXVuaW9uCXsKKwkJc3RydWN0IE1lbWNvbmYJCW1lbWNvbmY7CisJCXdvcmQJCQljb25maWd1cmU7CisJCXN0cnVjdCBSY3ZfcGt0CQlyY3ZfcGt0OworCQlzdHJ1Y3QgWG1pdF9wa3QJCXhtaXRfcGt0OworCQlieXRlCQkJbXVsdGljYXN0WzEwXVs2XTsKKwkJYnl0ZQkJCWV0aF9hZGRyWzZdOworCQlieXRlCQkJZmFpbGVkOworCQlzdHJ1Y3QgUmN2X3Jlc3AJCXJjdl9yZXNwOworCQlzdHJ1Y3QgWG1pdF9yZXNwCXhtaXRfcmVzcDsKKwkJc3RydWN0IE5ldHN0YXQJCW5ldHN0YXQ7CisJCXN0cnVjdCBTZWxmdGVzdAkJc2VsZnRlc3Q7CisJCXN0cnVjdCBJbmZvCQlpbmZvOworCQlzdHJ1Y3QgTWVtZHVtcCAgICAJbWVtZHVtcDsKKwkJYnl0ZQkJCXJhd1s2Ml07CisJfSBkYXRhOworfSBwY2Jfc3RydWN0OworCisvKiBUaGVzZSBkZWZpbmVzIGZvciAnY29uZmlndXJlJyAqLworI2RlZmluZSBSRUNWX1NUQVRJT04JMHgwMAorI2RlZmluZSBSRUNWX0JST0FECTB4MDEKKyNkZWZpbmUgUkVDVl9NVUxUSQkweDAyCisjZGVmaW5lIFJFQ1ZfUFJPTUlTQwkweDA0CisjZGVmaW5lIE5PX0xPT1BCQUNLCTB4MDAKKyNkZWZpbmUgSU5UX0xPT1BCQUNLCTB4MDgKKyNkZWZpbmUgRVhUX0xPT1BCQUNLCTB4MTAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIHN0cnVjdHVyZSB0byBob2xkIGNvbnRleHQgaW5mb3JtYXRpb24gZm9yIGFkYXB0ZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRE1BX0JVRkZFUl9TSVpFICAxNjAwCisjZGVmaW5lIEJBQ0tMT0dfU0laRSAgICAgIDQKKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIHNob3J0IGdvdFtOVU1fVFJBTlNNSVRfQ01EU107CS8qIGZsYWdzIGZvcgorCQkJCQkJICAgY29tbWFuZCBjb21wbGV0aW9uICovCisJcGNiX3N0cnVjdCB0eF9wY2I7CS8qIFBDQiBmb3IgZm9yZWdyb3VuZCBzZW5kaW5nICovCisJcGNiX3N0cnVjdCByeF9wY2I7CS8qIFBDQiBmb3IgZm9yZWdyb3VuZCByZWNlaXZpbmcgKi8KKwlwY2Jfc3RydWN0IGl0eF9wY2I7CS8qIFBDQiBmb3IgYmFja2dyb3VuZCBzZW5kaW5nICovCisJcGNiX3N0cnVjdCBpcnhfcGNiOwkvKiBQQ0IgZm9yIGJhY2tncm91bmQgcmVjZWl2aW5nICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisKKwl2b2lkICpkbWFfYnVmZmVyOworCisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IGxlbmd0aFtCQUNLTE9HX1NJWkVdOworCQl1bnNpZ25lZCBpbnQgaW47CisJCXVuc2lnbmVkIGludCBvdXQ7CisJfSByeF9iYWNrbG9nOworCisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IGRpcmVjdGlvbjsKKwkJdW5zaWduZWQgaW50IGxlbmd0aDsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkgICAgICAgIHZvaWQgKnRhcmdldDsKKwkJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lOworCX0gY3VycmVudF9kbWE7CisKKwkvKiBmbGFncyAqLworCXVuc2lnbmVkIGxvbmcgc2VuZF9wY2Jfc2VtYXBob3JlOworCXVuc2lnbmVkIGxvbmcgZG1haW5nOworCXVuc2lnbmVkIGxvbmcgYnVzeTsKKworCXVuc2lnbmVkIGludCByeF9hY3RpdmU7ICAvKiBudW1iZXIgb2YgcmVjZWl2ZSBQQ0JzICovCisgICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgaGNyX3ZhbDsgIC8qIHdoYXQgd2UgdGhpbmsgdGhlIEhDUiBjb250YWlucyAqLworICAgICAgICBzcGlubG9ja190IGxvY2s7CS8qIEludGVycnVwdCB2IHR4IGxvY2sgKi8KK30gZWxwX2RldmljZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTA3LmMgYi9kcml2ZXJzL25ldC8zYzUwNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYjgyODkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC8zYzUwNy5jCkBAIC0wLDAgKzEsOTY1IEBACisvKiAzYzUwNy5jOiBBbiBFdGhlckxpbmsxNiBkZXZpY2UgZHJpdmVyIGZvciBMaW51eC4gKi8KKy8qCisJV3JpdHRlbiAxOTkzLDE5OTQgYnkgRG9uYWxkIEJlY2tlci4KKworCUNvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKwlEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKworCVRoYW5rcyBnbyB0byBqZW5uaW5nc0BNb250cm91Z2UuU01SLnNsYi5jb20gKCBQYXRyaWNrIEplbm5pbmdzKQorCWFuZCBqcnNAd29ybGQuc3RkLmNvbSAoUmljayBTbGFka2V5KSBmb3IgdGVzdGluZyBhbmQgYnVnZml4ZXMuCisJTWFyayBTYWxhemFyIDxsZXNsaWVAYWNjZXNzLmRpZ2V4Lm5ldD4gbWFkZSB0aGUgY2hhbmdlcyBmb3IgY2FyZHMgd2l0aAorCW9ubHkgMTZLIHBhY2tldCBidWZmZXJzLgorCisJVGhpbmdzIHJlbWFpbmluZyB0byBkbzoKKwlWZXJpZnkgdGhhdCB0aGUgdHggYW5kIHJ4IGJ1ZmZlcnMgZG9uJ3QgaGF2ZSBmZW5jZXBvc3QgZXJyb3JzLgorCU1vdmUgdGhlIHRoZW9yeSBvZiBvcGVyYXRpb24gYW5kIG1lbW9yeSBtYXAgZG9jdW1lbnRhdGlvbi4KKwlUaGUgc3RhdGlzdGljcyBuZWVkIHRvIGJlIHVwZGF0ZWQgY29ycmVjdGx5LgorKi8KKworI2RlZmluZSBEUlZfTkFNRQkJIjNjNTA3IgorI2RlZmluZSBEUlZfVkVSU0lPTgkJIjEuMTBhIgorI2RlZmluZSBEUlZfUkVMREFURQkJIjExLzE3LzIwMDEiCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9CisJRFJWX05BTUUgIi5jOnYiIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURSAiIERvbmFsZCBCZWNrZXIgKGJlY2tlckBzY3lsZC5jb20pXG4iOworCisvKgorICBTb3VyY2VzOgorCVRoaXMgZHJpdmVyIHdvdWxkbid0IGhhdmUgYmVlbiB3cml0dGVuIHdpdGggdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUKKwlDcnlud3IgZHJpdmVyIHNvdXJjZSBjb2RlLglJdCBwcm92aWRlZCBhIGtub3duLXdvcmtpbmcgaW1wbGVtZW50YXRpb24KKwl0aGF0IGZpbGxlZCBpbiB0aGUgZ2FwaW5nIGhvbGVzIG9mIHRoZSBJbnRlbCBkb2N1bWVudGF0aW9uLiAgVGhyZWUgY2hlZXJzCisJZm9yIFJ1c3MgTmVsc29uLgorCisJSW50ZWwgTWljcm9jb21tdW5pY2F0aW9ucyBEYXRhYm9vaywgVm9sLiAxLCAxOTkwLiAgSXQgcHJvdmlkZXMganVzdCBlbm91Z2gKKwlpbmZvIHRoYXQgdGhlIGNhc3VhbCByZWFkZXIgbWlnaHQgdGhpbmsgdGhhdCBpdCBkb2N1bWVudHMgdGhlIGk4MjU4NiA6LTwuCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qIHVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sIDIuLjcgZm9yIGRlYnVnICovCisjaWZuZGVmIE5FVF9ERUJVRworI2RlZmluZSBORVRfREVCVUcgMQorI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgaW50IG5ldF9kZWJ1ZyA9IE5FVF9ERUJVRzsKKyNkZWZpbmUgZGVidWcgbmV0X2RlYnVnCisKKworLyoKKyAgCQkJRGV0YWlscyBvZiB0aGUgaTgyNTg2LgorCisgICBZb3UnbGwgcmVhbGx5IG5lZWQgdGhlIGRhdGFib29rIHRvIHVuZGVyc3RhbmQgdGhlIGRldGFpbHMgb2YgdGhpcyBwYXJ0LAorICAgYnV0IHRoZSBvdXRsaW5lIGlzIHRoYXQgdGhlIGk4MjU4NiBoYXMgdHdvIHNlcGFyYXRlIHByb2Nlc3NpbmcgdW5pdHMuCisgICBCb3RoIGFyZSBzdGFydGVkIGZyb20gYSBsaXN0IG9mIHRocmVlIGNvbmZpZ3VyYXRpb24gdGFibGVzLCBvZiB3aGljaCBvbmx5CisgICB0aGUgbGFzdCwgdGhlIFN5c3RlbSBDb250cm9sIEJsb2NrIChTQ0IpLCBpcyB1c2VkIGFmdGVyIHJlc2V0LXRpbWUuICBUaGUgU0NCCisgICBoYXMgdGhlIGZvbGxvd2luZyBmaWVsZHM6CisJCVN0YXR1cyB3b3JkCisJCUNvbW1hbmQgd29yZAorCQlUeC9Db21tYW5kIGJsb2NrIGFkZHIuCisJCVJ4IGJsb2NrIGFkZHIuCisgICBUaGUgY29tbWFuZCB3b3JkIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBjb250cm9scyBmb3IgdGhlIFR4IGFuZCBSeCB1bml0czoKKyAgKi8KKworI2RlZmluZQkgQ1VDX1NUQVJUCSAweDAxMDAKKyNkZWZpbmUJIENVQ19SRVNVTUUJIDB4MDIwMAorI2RlZmluZQkgQ1VDX1NVU1BFTkQgMHgwMzAwCisjZGVmaW5lCSBSWF9TVEFSVAkgMHgwMDEwCisjZGVmaW5lCSBSWF9SRVNVTUUJIDB4MDAyMAorI2RlZmluZQkgUlhfU1VTUEVORAkgMHgwMDMwCisKKy8qIFRoZSBSeCB1bml0IHVzZXMgYSBsaXN0IG9mIGZyYW1lIGRlc2NyaXB0b3JzIGFuZCBhIGxpc3Qgb2YgZGF0YSBidWZmZXIKKyAgIGRlc2NyaXB0b3JzLiAgV2UgdXNlIGZ1bGwtc2l6ZWQgKDE1MTggYnl0ZSkgZGF0YSBidWZmZXJzLCBzbyB0aGVyZSBpcworICAgYSBvbmUtdG8tb25lIHBhaXJpbmcgb2YgZnJhbWUgZGVzY3JpcHRvcnMgdG8gYnVmZmVyIGRlc2NyaXB0b3JzLgorCisgICBUaGUgVHggKCJjb21tYW5kIikgdW5pdCBleGVjdXRlcyBhIGxpc3Qgb2YgY29tbWFuZHMgdGhhdCBsb29rIGxpa2U6CisJCVN0YXR1cyB3b3JkCQlXcml0dGVuIGJ5IHRoZSA4MjU4NiB3aGVuIHRoZSBjb21tYW5kIGlzIGRvbmUuCisJCUNvbW1hbmQgd29yZAlDb21tYW5kIGluIGxvd2VyIDMgYml0cywgcG9zdC1jb21tYW5kIGFjdGlvbiBpbiB1cHBlciAzCisJCUxpbmsgd29yZAkJVGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQgY29tbWFuZC4KKwkJUGFyYW1ldGVycwkJKGFzIG5lZWRlZCkuCisKKwlTb21lIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gdGhlIENvbW1hbmQgV29yZCBhcmU6CisgKi8KKyNkZWZpbmUgQ01EX0VPTAkJMHg4MDAwCQkJLyogVGhlIGxhc3QgY29tbWFuZCBvZiB0aGUgbGlzdCwgc3RvcC4gKi8KKyNkZWZpbmUgQ01EX1NVU1AJMHg0MDAwCQkJLyogU3VzcGVuZCBhZnRlciBkb2luZyBjbWQuICovCisjZGVmaW5lIENNRF9JTlRSCTB4MjAwMAkJCS8qIEludGVycnVwdCBhZnRlciBkb2luZyBjbWQuICovCisKK2VudW0gY29tbWFuZHMgeworCUNtZE5PcCA9IDAsIENtZFNBU2V0dXAgPSAxLCBDbWRDb25maWd1cmUgPSAyLCBDbWRNdWx0aWNhc3RMaXN0ID0gMywKKwlDbWRUeCA9IDQsIENtZFREUiA9IDUsIENtZER1bXAgPSA2LCBDbWREaWFnbm9zZSA9IDd9OworCisvKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4gKi8KK3N0cnVjdCBuZXRfbG9jYWwgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCWludCBsYXN0X3Jlc3RhcnQ7CisJdXNob3J0IHJ4X2hlYWQ7CisJdXNob3J0IHJ4X3RhaWw7CisJdXNob3J0IHR4X2hlYWQ7CisJdXNob3J0IHR4X2NtZF9saW5rOworCXVzaG9ydCB0eF9yZWFwOworCXVzaG9ydCB0eF9wa3RzX2luX3Jpbmc7CisJc3BpbmxvY2tfdCBsb2NrOworCXZvaWQgX19pb21lbSAqYmFzZTsKK307CisKKy8qCisgIAkJRGV0YWlscyBvZiB0aGUgRXRoZXJMaW5rMTYgSW1wbGVtZW50YXRpb24KKyAgVGhlIDNjNTA3IGlzIGEgZ2VuZXJpYyBzaGFyZWQtbWVtb3J5IGk4MjU4NiBpbXBsZW1lbnRhdGlvbi4KKyAgVGhlIGhvc3QgY2FuIG1hcCAxNkssIDMySywgNDhLLCBvciA2NEsgb2YgdGhlIDY0SyBtZW1vcnkgaW50bworICAweDBbQ0RdWzA4XTAwMDAsIG9yIGFsbCA2NEsgaW50byAweEZbMDI0NjhdMDAwMC4KKyAgKi8KKworLyogT2Zmc2V0cyBmcm9tIHRoZSBiYXNlIEkvTyBhZGRyZXNzLiAqLworI2RlZmluZQlTQV9EQVRBCQkwCS8qIFN0YXRpb24gYWRkcmVzcyBkYXRhLCBvciAzQ29tIHNpZ25hdHVyZS4gKi8KKyNkZWZpbmUgTUlTQ19DVFJMCTYJLyogU3dpdGNoIHRoZSBTQV9EQVRBIGJhbmtzLCBhbmQgYnVzIGNvbmZpZyBiaXRzLiAqLworI2RlZmluZSBSRVNFVF9JUlEJMTAJLyogUmVzZXQgdGhlIGxhdGNoZWQgSVJRIGxpbmUuICovCisjZGVmaW5lIFNJR05BTF9DQQkxMQkvKiBGcm9iIHRoZSA4MjU4NiBDaGFubmVsIEF0dGVudGlvbiBsaW5lLiAqLworI2RlZmluZSBST01fQ09ORklHCTEzCisjZGVmaW5lIE1FTV9DT05GSUcJMTQKKyNkZWZpbmUgSVJRX0NPTkZJRwkxNQorI2RlZmluZSBFTDE2X0lPX0VYVEVOVCAxNgorCisvKiBUaGUgSUQgcG9ydCBpcyB1c2VkIGF0IGJvb3QtdGltZSB0byBsb2NhdGUgdGhlIGV0aGVyY2FyZC4gKi8KKyNkZWZpbmUgSURfUE9SVAkJMHgxMDAKKworLyogT2Zmc2V0cyB0byByZWdpc3RlcnMgaW4gdGhlIG1haWxib3ggKFNDQikuICovCisjZGVmaW5lIGlTQ0JfU1RBVFVTCTB4OAorI2RlZmluZSBpU0NCX0NNRAkJMHhBCisjZGVmaW5lIGlTQ0JfQ0JMCQkweEMJLyogQ29tbWFuZCBCTG9jayBvZmZzZXQuICovCisjZGVmaW5lIGlTQ0JfUkZBCQkweEUJLyogUnggRnJhbWUgQXJlYSBvZmZzZXQuICovCisKKy8qICBTaW5jZSB0aGUgM2M1MDcgbWFwcyB0aGUgc2hhcmVkIG1lbW9yeSB3aW5kb3cgc28gdGhhdCB0aGUgbGFzdCBieXRlIGlzCisJYXQgODI1ODYgYWRkcmVzcyBGRkZGLCB0aGUgZmlyc3QgYnl0ZSBpcyBhdCA4MjU4NiBhZGRyZXNzIDAsIDE2SywgMzJLLCBvcgorCTQ4SyBjb3JyZXNwb25kaW5nIHRvIHdpbmRvdyBzaXplcyBvZiA2NEssIDQ4SywgMzJLIGFuZCAxNksgcmVzcGVjdGl2ZWx5LgorCVdlIGNhbiBhY2NvdW50IGZvciB0aGlzIGJlIHNldHRpbmcgdGhlICdTQkMgQmFzZScgZW50cnkgaW4gdGhlIElTQ1AgdGFibGUKKwliZWxvdyBmb3IgYWxsIHRoZSAxNiBiaXQgb2Zmc2V0IGFkZHJlc3NlcywgYW5kIGFsc28gYWRkaW5nIHRoZSAnU0NCIEJhc2UnCisJdmFsdWUgdG8gYWxsIDI0IGJpdCBwaHlzaWNhbCBhZGRyZXNzZXMgKGluIHRoZSBTQ1AgdGFibGUgYW5kIHRoZSBUWCBhbmQgUlgKKwlCdWZmZXIgRGVzY3JpcHRvcnMpLgorCQkJCQktTWFyaworCSovCisjZGVmaW5lIFNDQl9CQVNFCQkoKHVuc2lnbmVkKTY0KjEwMjQgLSAoZGV2LT5tZW1fZW5kIC0gZGV2LT5tZW1fc3RhcnQpKQorCisvKgorICBXaGF0IGZvbGxvd3MgaW4gJ2luaXRfd29yZHNbXScgaXMgdGhlICJwcm9ncmFtIiB0aGF0IGlzIGRvd25sb2FkZWQgdG8gdGhlCisgIDgyNTg2IG1lbW9yeS4JIEl0J3MgbW9zdGx5IHRhYmxlcyBhbmQgY29tbWFuZCBibG9ja3MsIGFuZCBzdGFydHMgYXQgdGhlCisgIHJlc2V0IGFkZHJlc3MgMHhmZmZmZjYuICBUaGlzIGlzIGRlc2lnbmVkIHRvIGJlIHNpbWlsYXIgdG8gdGhlIEV0aGVyRXhwcmVzcywKKyAgdGh1cyB0aGUgdW51c3VhbCBsb2NhdGlvbiBvZiB0aGUgU0NCIGF0IDB4MDAwOC4KKworICBFdmVuIHdpdGggdGhlIGFkZGl0aW9uYWwgImRvbid0IGNhcmUiIHZhbHVlcywgZG9pbmcgaXQgdGhpcyB3YXkgdGFrZXMgbGVzcworICBwcm9ncmFtIHNwYWNlIHRoYW4gaW5pdGlhbGl6aW5nIHRoZSBpbmRpdmlkdWFsIHRhYmxlcywgYW5kIEkgZmVlbCBpdCdzIG11Y2gKKyAgY2xlYW5lci4KKworICBUaGUgZGF0YWJvb2sgaXMgcGFydGljdWxhcmx5IHVzZWxlc3MgZm9yIHRoZSBmaXJzdCB0d28gc3RydWN0dXJlcywgSSBoYWQKKyAgdG8gdXNlIHRoZSBDcnlud3IgZHJpdmVyIGFzIGFuIGV4YW1wbGUuCisKKyAgIFRoZSBtZW1vcnkgc2V0dXAgaXMgYXMgZm9sbG93czoKKyAgICovCisKKyNkZWZpbmUgQ09ORklHX0NNRAkweDAwMTgKKyNkZWZpbmUgU0VUX1NBX0NNRAkweDAwMjQKKyNkZWZpbmUgU0FfT0ZGU0VUCTB4MDAyQQorI2RlZmluZSBJRExFTE9PUAkweDMwCisjZGVmaW5lIFREUl9DTUQJCTB4MzgKKyNkZWZpbmUgVERSX1RJTUUJMHgzQworI2RlZmluZSBEVU1QX0NNRAkweDQwCisjZGVmaW5lIERJQUdfQ01ECTB4NDgKKyNkZWZpbmUgU0VUX01DX0NNRAkweDRFCisjZGVmaW5lIERVTVBfREFUQQkweDU2CS8qIEEgMTcwIGJ5dGUgYnVmZmVyIGZvciBkdW1wIGFuZCBTZXQtTUMgaW50by4gKi8KKworI2RlZmluZSBUWF9CVUZfU1RBUlQJMHgwMTAwCisjZGVmaW5lIE5VTV9UWF9CVUZTIAk1CisjZGVmaW5lIFRYX0JVRl9TSVpFIAkoMTUxOCsxNCsyMCsxNikgLyogcGFja2V0K2hlYWRlcitUQkQgKi8KKworI2RlZmluZSBSWF9CVUZfU1RBUlQJMHgyMDAwCisjZGVmaW5lIFJYX0JVRl9TSVpFIAkoMTUxOCsxNCsxOCkJLyogcGFja2V0K2hlYWRlcitSQkQgKi8KKyNkZWZpbmUgUlhfQlVGX0VORAkJKGRldi0+bWVtX2VuZCAtIGRldi0+bWVtX3N0YXJ0KQorCisjZGVmaW5lIFRYX1RJTUVPVVQgNQorCisvKgorICBUaGF0J3MgaXQ6IG9ubHkgODYgYnl0ZXMgdG8gc2V0IHVwIHRoZSBiZWFzdCwgaW5jbHVkaW5nIGV2ZXJ5IGV4dHJhCisgIGNvbW1hbmQgYXZhaWxhYmxlLiAgVGhlIDE3MCBieXRlIGJ1ZmZlciBhdCBEVU1QX0RBVEEgaXMgc2hhcmVkIGJldHdlZW4gdGhlCisgIER1bXAgY29tbWFuZCAoY2FsbGVkIG9ubHkgYnkgdGhlIGRpYWdub3N0aWMgcHJvZ3JhbSkgYW5kIHRoZSBTZXRNdWx0aWNhc3RMaXN0CisgIGNvbW1hbmQuCisKKyAgVG8gY29tcGxldGUgdGhlIG1lbW9yeSBzZXR1cCB5b3Ugb25seSBoYXZlIHRvIHdyaXRlIHRoZSBzdGF0aW9uIGFkZHJlc3MgYXQKKyAgU0FfT0ZGU0VUIGFuZCBjcmVhdGUgdGhlIFR4ICYgUnggYnVmZmVyIGxpc3RzLgorCisgIFRoZSBUeCBjb21tYW5kIGNoYWluIGFuZCBidWZmZXIgbGlzdCBpcyBzZXR1cCBhcyBmb2xsb3dzOgorICBBIFR4IGNvbW1hbmQgdGFibGUsIHdpdGggdGhlIGRhdGEgYnVmZmVyIHBvaW50aW5nIHRvLi4uCisgIEEgVHggZGF0YSBidWZmZXIgZGVzY3JpcHRvci4gIFRoZSBwYWNrZXQgaXMgaW4gYSBzaW5nbGUgYnVmZmVyLCByYXRoZXIgdGhhbgorCWNoYWluaW5nIHRvZ2V0aGVyIHNldmVyYWwgc21hbGxlciBidWZmZXJzLgorICBBIE5vT3AgY29tbWFuZCwgd2hpY2ggaW5pdGlhbGx5IHBvaW50cyB0byBpdHNlbGYsCisgIEFuZCB0aGUgcGFja2V0IGRhdGEuCisKKyAgQSB0cmFuc21pdCBpcyBkb25lIGJ5IGZpbGxpbmcgaW4gdGhlIFR4IGNvbW1hbmQgdGFibGUgYW5kIGRhdGEgYnVmZmVyLAorICByZS13cml0aW5nIHRoZSBOb09wIGNvbW1hbmQsIGFuZCBmaW5hbGx5IGNoYW5naW5nIHRoZSBvZmZzZXQgb2YgdGhlIGxhc3QKKyAgY29tbWFuZCB0byBwb2ludCB0byB0aGUgY3VycmVudCBUeCBjb21tYW5kLiAgV2hlbiB0aGUgVHggY29tbWFuZCBpcyBmaW5pc2hlZCwKKyAgaXQganVtcHMgdG8gdGhlIE5vT3AsIHdoZW4gaXQgbG9vcHMgdW50aWwgdGhlIG5leHQgVHggY29tbWFuZCBjaGFuZ2VzIHRoZQorICAibGluayBvZmZzZXQiIGluIHRoZSBOb09wLiAgVGhpcyB3YXkgdGhlIDgyNTg2IG5ldmVyIGhhcyB0byBnbyB0aHJvdWdoIHRoZQorICBzbG93IHJlc3RhcnQgc2VxdWVuY2UuCisKKyAgVGhlIFJ4IGJ1ZmZlciBsaXN0IGlzIHNldCB1cCBpbiB0aGUgb2J2aW91cyByaW5nIHN0cnVjdHVyZS4gIFdlIGhhdmUgZW5vdWdoCisgIG1lbW9yeSAoYW5kIGxvdyBlbm91Z2ggaW50ZXJydXB0IGxhdGVuY3kpIHRoYXQgd2UgY2FuIGF2b2lkIHRoZSBjb21wbGljYXRlZAorICBSeCBidWZmZXIgbGlua2VkIGxpc3RzIGJ5IGFsd2F5IGFzc29jaWF0aW5nIGEgZnVsbC1zaXplIFJ4IGRhdGEgYnVmZmVyIHdpdGgKKyAgZWFjaCBSeCBkYXRhIGZyYW1lLgorCisgIEkgY3VycmVudCB1c2UgZm91ciB0cmFuc21pdCBidWZmZXJzIHN0YXJ0aW5nIGF0IFRYX0JVRl9TVEFSVCAoMHgwMTAwKSwgYW5kCisgIHVzZSB0aGUgcmVzdCBvZiBtZW1vcnksIGZyb20gUlhfQlVGX1NUQVJUIHRvIFJYX0JVRl9FTkQsIGZvciBSeCBidWZmZXJzLgorCisgICovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpbml0X3dvcmRzW10gPSB7CisJLyoJU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciAoU0NQKS4gKi8KKwkweDAwMDAsCQkJCQkvKiBTZXQgYnVzIHNpemUgdG8gMTYgYml0cy4gKi8KKwkwLDAsCQkJCQkvKiBwYWQgd29yZHMuICovCisJMHgwMDAwLDB4MDAwMCwJCQkvKiBJU0NQIHBoeXMgYWRkciwgc2V0IGluIGluaXRfODI1ODZfbWVtKCkuICovCisKKwkvKglJbnRlcm1lZGlhdGUgU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciAoSVNDUCkuICovCisJMHgwMDAxLAkJCQkJLyogU3RhdHVzIHdvcmQgdGhhdCdzIGNsZWFyZWQgd2hlbiBpbml0IGlzIGRvbmUuICovCisJMHgwMDA4LDAsMCwJCQkJLyogU0NCIG9mZnNldCwgKHNraXAsIHNraXApICovCisKKwkvKiBTeXN0ZW0gQ29udHJvbCBCbG9jayAoU0NCKS4gKi8KKwkwLDB4ZjAwMHxSWF9TVEFSVHxDVUNfU1RBUlQsCS8qIFNDQiBzdGF0dXMgYW5kIGNtZC4gKi8KKwlDT05GSUdfQ01ELAkJCQkvKiBDb21tYW5kIGxpc3QgcG9pbnRlciwgcG9pbnRzIHRvIENvbmZpZ3VyZS4gKi8KKwlSWF9CVUZfU1RBUlQsCQkJCS8qIFJ4IGJsb2NrIGxpc3QuICovCisJMCwwLDAsMCwJCQkJLyogRXJyb3IgY291bnQ6IENSQywgYWxpZ24sIGJ1ZmZlciwgb3ZlcnJ1bi4gKi8KKworCS8qIDB4MDAxODogQ29uZmlndXJlIGNvbW1hbmQuICBDaGFuZ2UgdG8gcHV0IE1BQyBkYXRhIHdpdGggcGFja2V0LiAqLworCTAsIENtZENvbmZpZ3VyZSwJCS8qIFN0YXR1cywgY29tbWFuZC4JCSovCisJU0VUX1NBX0NNRCwJCQkJLyogTmV4dCBjb21tYW5kIGlzIFNldCBTdGF0aW9uIEFkZHIuICovCisJMHgwODA0LAkJCQkJLyogIjQiIGJ5dGVzIG9mIGNvbmZpZyBkYXRhLCA4IGJ5dGUgRklGTy4gKi8KKwkweDJlNDAsCQkJCQkvKiBNYWdpYyB2YWx1ZXMsIGluY2x1ZGluZyBNQUMgZGF0YSBsb2NhdGlvbi4gKi8KKwkwLAkJCQkJCS8qIFVudXNlZCBwYWQgd29yZC4gKi8KKworCS8qIDB4MDAyNDogU2V0dXAgc3RhdGlvbiBhZGRyZXNzIGNvbW1hbmQuICovCisJMCwgQ21kU0FTZXR1cCwKKwlTRVRfTUNfQ01ELAkJCQkvKiBOZXh0IGNvbW1hbmQuICovCisJMHhhYTAwLDB4YjAwMCwweDBiYWQsCS8qIFN0YXRpb24gYWRkcmVzcyAodG8gYmUgZmlsbGVkIGluKSAqLworCisJLyogMHgwMDMwOiBOT1AsIGxvb3BpbmcgYmFjayB0byBpdHNlbGYuCSBQb2ludCB0byBmaXJzdCBUeCBidWZmZXIgdG8gVHguICovCisJMCwgQ21kTk9wLCBJRExFTE9PUCwgMCAvKiBwYWQgKi8sCisKKwkvKiAweDAwMzg6IEEgdW51c2VkIFRpbWUtRG9tYWluIFJlZmxlY3RvbWV0ZXIgY29tbWFuZC4gKi8KKwkwLCBDbWRURFIsIElETEVMT09QLCAwLAorCisJLyogMHgwMDQwOiBBbiB1bnVzZWQgRHVtcCBTdGF0ZSBjb21tYW5kLiAqLworCTAsIENtZER1bXAsIElETEVMT09QLCBEVU1QX0RBVEEsCisKKwkvKiAweDAwNDg6IEFuIHVudXNlZCBEaWFnbm9zZSBjb21tYW5kLiAqLworCTAsIENtZERpYWdub3NlLCBJRExFTE9PUCwKKworCS8qIDB4MDA0RTogQW4gZW1wdHkgc2V0LW11bHRpY2FzdC1saXN0IGNvbW1hbmQuICovCisJMCwgQ21kTXVsdGljYXN0TGlzdCwgSURMRUxPT1AsIDAsCit9OworCisvKiBJbmRleCB0byBmdW5jdGlvbnMsIGFzIGZ1bmN0aW9uIHByb3RvdHlwZXMuICovCisKK3N0YXRpYyBpbnQJZWwxNl9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcik7CitzdGF0aWMgaW50CWVsMTZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJZWwxNl9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBlbDE2X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIGVsMTZfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CWVsMTZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVsMTZfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWwxNl90eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHZvaWQgaGFyZHdhcmVfc2VuZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYnVmLCBzaG9ydCBsZW5ndGgsIHNob3J0IHBhZCk7CitzdGF0aWMgdm9pZCBpbml0XzgyNTg2X21lbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOworc3RhdGljIHZvaWQgaW5pdF9yeF9idWZzKHN0cnVjdCBuZXRfZGV2aWNlICopOworCitzdGF0aWMgaW50IGlvID0gMHgzMDA7CitzdGF0aWMgaW50IGlycTsKK3N0YXRpYyBpbnQgbWVtX3N0YXJ0OworCisMCisvKiBDaGVjayBmb3IgYSBuZXR3b3JrIGFkYXB0b3Igb2YgdGhpcyB0eXBlLCBhbmQgcmV0dXJuICcwJyBpZmYgb25lIGV4aXN0cy4KKwlJZiBkZXYtPmJhc2VfYWRkciA9PSAwLCBwcm9iZSBhbGwgbGlrZWx5IGxvY2F0aW9ucy4KKwlJZiBkZXYtPmJhc2VfYWRkciA9PSAxLCBhbHdheXMgcmV0dXJuIGZhaWx1cmUuCisJSWYgZGV2LT5iYXNlX2FkZHIgPT0gMiwgKGRldGFjaGFibGUgZGV2aWNlcyBvbmx5KSBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlCisJZGV2aWNlIGFuZCByZXR1cm4gc3VjY2Vzcy4KKwkqLworCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBlbDE2X3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCXN0YXRpYyB1bnNpZ25lZCBwb3J0c1tdID0geyAweDMwMCwgMHgzMjAsIDB4MzQwLCAweDI4MCwgMH07CisJdW5zaWduZWQgKnBvcnQ7CisJaW50IGVyciA9IC1FTk9ERVY7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwkJaW8gPSBkZXYtPmJhc2VfYWRkcjsKKwkJaXJxID0gZGV2LT5pcnE7CisJCW1lbV9zdGFydCA9IGRldi0+bWVtX3N0YXJ0ICYgMTU7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaWYgKGlvID4gMHgxZmYpIAkvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCWVyciA9IGVsMTZfcHJvYmUxKGRldiwgaW8pOworCWVsc2UgaWYgKGlvICE9IDApCisJCWVyciA9IC1FTlhJTzsJCS8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKwllbHNlIHsKKwkJZm9yIChwb3J0ID0gcG9ydHM7ICpwb3J0OyBwb3J0KyspIHsKKwkJCWVyciA9IGVsMTZfcHJvYmUxKGRldiwgKnBvcnQpOworCQkJaWYgKCFlcnIpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJaW91bm1hcCgoKHN0cnVjdCBuZXRfbG9jYWwgKiluZXRkZXZfcHJpdihkZXYpKS0+YmFzZSk7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVMMTZfSU9fRVhURU5UKTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGVsMTZfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpCit7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgaW5pdF9JRF9kb25lLCB2ZXJzaW9uX3ByaW50ZWQ7CisJaW50IGksIGlycSwgaXJxdmFsLCByZXR2YWw7CisJc3RydWN0IG5ldF9sb2NhbCAqbHA7CisKKwlpZiAoaW5pdF9JRF9kb25lID09IDApIHsKKwkJdXNob3J0IGxyc19zdGF0ZSA9IDB4ZmY7CisJCS8qIFNlbmQgdGhlIElEIHNlcXVlbmNlIHRvIHRoZSBJRF9QT1JUIHRvIGVuYWJsZSB0aGUgYm9hcmQocykuICovCisJCW91dGIoMHgwMCwgSURfUE9SVCk7CisJCWZvcihpID0gMDsgaSA8IDI1NTsgaSsrKSB7CisJCQlvdXRiKGxyc19zdGF0ZSwgSURfUE9SVCk7CisJCQlscnNfc3RhdGUgPDw9IDE7CisJCQlpZiAobHJzX3N0YXRlICYgMHgxMDApCisJCQkJbHJzX3N0YXRlIF49IDB4ZTc7CisJCX0KKwkJb3V0YigweDAwLCBJRF9QT1JUKTsKKwkJaW5pdF9JRF9kb25lID0gMTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgRUwxNl9JT19FWFRFTlQsIERSVl9OQU1FKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoKGluYihpb2FkZHIpICE9ICcqJykgfHwgKGluYihpb2FkZHIgKyAxKSAhPSAnMycpIHx8IAorCSAgICAoaW5iKGlvYWRkciArIDIpICE9ICdDJykgfHwgKGluYihpb2FkZHIgKyAzKSAhPSAnTycpKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChuZXRfZGVidWcgICYmICB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsodmVyc2lvbik7CisKKwlwcmludGsoIiVzOiAzYzUwNyBhdCAlI3gsIiwgZGV2LT5uYW1lLCBpb2FkZHIpOworCisJLyogV2Ugc2hvdWxkIG1ha2UgYSBmZXcgbW9yZSBjaGVja3MgaGVyZSwgbGlrZSB0aGUgZmlyc3QgdGhyZWUgb2N0ZXRzIG9mCisJICAgdGhlIFMuQS4gZm9yIHRoZSBtYW51ZmFjdHVyZXIncyBjb2RlLiAqLworCisJaXJxID0gaW5iKGlvYWRkciArIElSUV9DT05GSUcpICYgMHgwZjsKKworCWlycXZhbCA9IHJlcXVlc3RfaXJxKGlycSwgJmVsMTZfaW50ZXJydXB0LCAwLCBEUlZfTkFNRSwgZGV2KTsKKwlpZiAoaXJxdmFsKSB7CisJCXByaW50ayhLRVJOX0VSUiAiM2M1MDc6IHVuYWJsZSB0byBnZXQgSVJRICVkIChpcnF2YWw9JWQpLlxuIiwgaXJxLCBpcnF2YWwpOworCQlyZXR2YWwgPSAtRUFHQUlOOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBXZSd2ZSBjb21taXR0ZWQgdG8gdXNpbmcgdGhlIGJvYXJkLCBhbmQgY2FuIHN0YXJ0IGZpbGxpbmcgaW4gKmRldi4gKi8KKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKworCW91dGIoMHgwMSwgaW9hZGRyICsgTUlTQ19DVFJMKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWRldi0+ZGV2X2FkZHJbaV0gPSBpbmIoaW9hZGRyICsgaSk7CisJCXByaW50aygiICUwMngiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwl9CisKKwlpZiAobWVtX3N0YXJ0KQorCQluZXRfZGVidWcgPSBtZW1fc3RhcnQgJiA3OworCisjaWZkZWYgTUVNX0JBU0UKKwlkZXYtPm1lbV9zdGFydCA9IE1FTV9CQVNFOworCWRldi0+bWVtX2VuZCA9IGRldi0+bWVtX3N0YXJ0ICsgMHgxMDAwMDsKKyNlbHNlCisJeworCQlpbnQgYmFzZTsKKwkJaW50IHNpemU7CisJCWNoYXIgbWVtX2NvbmZpZyA9IGluYihpb2FkZHIgKyBNRU1fQ09ORklHKTsKKwkJaWYgKG1lbV9jb25maWcgJiAweDIwKSB7CisJCQlzaXplID0gNjQqMTAyNDsKKwkJCWJhc2UgPSAweGYwMDAwMCArIChtZW1fY29uZmlnICYgMHgwOCA/IDB4MDgwMDAwCisJCQkJCQkJICAgOiAoKG1lbV9jb25maWcgJiAzKSA8PCAxNykpOworCQl9IGVsc2UgeworCQkJc2l6ZSA9ICgobWVtX2NvbmZpZyAmIDMpICsgMSkgPDwgMTQ7CisJCQliYXNlID0gMHgwYzAwMDAgKyAoIChtZW1fY29uZmlnICYgMHgxOCkgPDwgMTIpOworCQl9CisJCWRldi0+bWVtX3N0YXJ0ID0gYmFzZTsKKwkJZGV2LT5tZW1fZW5kID0gYmFzZSArIHNpemU7CisJfQorI2VuZGlmCisKKwlkZXYtPmlmX3BvcnQgPSAoaW5iKGlvYWRkciArIFJPTV9DT05GSUcpICYgMHg4MCkgPyAxIDogMDsKKwlkZXYtPmlycSA9IGluYihpb2FkZHIgKyBJUlFfQ09ORklHKSAmIDB4MGY7CisKKwlwcmludGsoIiwgSVJRICVkLCAlc3Rlcm5hbCB4Y3ZyLCBtZW1vcnkgJSNseC0lI2x4LlxuIiwgZGV2LT5pcnEsCisJCSAgIGRldi0+aWZfcG9ydCA/ICJleCIgOiAiaW4iLCBkZXYtPm1lbV9zdGFydCwgZGV2LT5tZW1fZW5kLTEpOworCisJaWYgKG5ldF9kZWJ1ZykKKwkJcHJpbnRrKHZlcnNpb24pOworCisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworIAltZW1zZXQobHAsIDAsIHNpemVvZigqbHApKTsKKwlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCWxwLT5iYXNlID0gaW9yZW1hcChkZXYtPm1lbV9zdGFydCwgUlhfQlVGX0VORCk7CisJaWYgKCFscC0+YmFzZSkgeworCQlwcmludGsoS0VSTl9FUlIgIjNjNTA3OiB1bmFibGUgdG8gcmVtYXAgbWVtb3J5XG4iKTsKKwkJcmV0dmFsID0gLUVBR0FJTjsKKwkJZ290byBvdXQxOworCX0KKworIAlkZXYtPm9wZW4gPSBlbDE2X29wZW47CisgCWRldi0+c3RvcCA9IGVsMTZfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBlbDE2X3NlbmRfcGFja2V0OworCWRldi0+Z2V0X3N0YXRzCT0gZWwxNl9nZXRfc3RhdHM7CisJZGV2LT50eF90aW1lb3V0ID0gZWwxNl90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCWRldi0+ZXRodG9vbF9vcHMgPSAmbmV0ZGV2X2V0aHRvb2xfb3BzOworIAlkZXYtPmZsYWdzICY9IH5JRkZfTVVMVElDQVNUOwkvKiBNdWx0aWNhc3QgZG9lc24ndCB3b3JrICovCisJcmV0dXJuIDA7CitvdXQxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgRUwxNl9JT19FWFRFTlQpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZWwxNl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogSW5pdGlhbGl6ZSB0aGUgODI1ODYgbWVtb3J5IGFuZCBzdGFydCBpdC4gKi8KKwlpbml0XzgyNTg2X21lbShkZXYpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBlbDE2X3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl2b2lkIF9faW9tZW0gKnNobWVtID0gbHAtPmJhc2U7CisKKwlpZiAobmV0X2RlYnVnID4gMSkKKwkJcHJpbnRrICgiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgJXM/ICAiLCBkZXYtPm5hbWUsCisJCQlyZWFkdyhzaG1lbSArIGlTQ0JfU1RBVFVTKSAmIDB4ODAwMCA/ICJJUlEgY29uZmxpY3QiIDoKKwkJCSJuZXR3b3JrIGNhYmxlIHByb2JsZW0iKTsKKwkvKiBUcnkgdG8gcmVzdGFydCB0aGUgYWRhcHRvci4gKi8KKwlpZiAobHAtPmxhc3RfcmVzdGFydCA9PSBscC0+c3RhdHMudHhfcGFja2V0cykgeworCQlpZiAobmV0X2RlYnVnID4gMSkKKwkJCXByaW50ayAoIlJlc2V0dGluZyBib2FyZC5cbiIpOworCQkvKiBDb21wbGV0ZWx5IHJlc2V0IHRoZSBhZGFwdG9yLiAqLworCQlpbml0XzgyNTg2X21lbSAoZGV2KTsKKwkJbHAtPnR4X3BrdHNfaW5fcmluZyA9IDA7CisJfSBlbHNlIHsKKwkJLyogSXNzdWUgdGhlIGNoYW5uZWwgYXR0ZW50aW9uIHNpZ25hbCBhbmQgaG9wZSBpdCAiZ2V0cyBiZXR0ZXIiLiAqLworCQlpZiAobmV0X2RlYnVnID4gMSkKKwkJCXByaW50ayAoIktpY2tpbmcgYm9hcmQuXG4iKTsKKwkJd3JpdGV3KDB4ZjAwMCB8IENVQ19TVEFSVCB8IFJYX1NUQVJULCBzaG1lbSArIGlTQ0JfQ01EKTsKKwkJb3V0YiAoMCwgaW9hZGRyICsgU0lHTkFMX0NBKTsJLyogSXNzdWUgY2hhbm5lbC1hdHRuLiAqLworCQlscC0+bGFzdF9yZXN0YXJ0ID0gbHAtPnN0YXRzLnR4X3BhY2tldHM7CisJfQorCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3dha2VfcXVldWUgKGRldik7Cit9CisKKworc3RhdGljIGludCBlbDE2X3NlbmRfcGFja2V0IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaG9ydCBsZW5ndGggPSBFVEhfWkxFTiA8IHNrYi0+bGVuID8gc2tiLT5sZW4gOiBFVEhfWkxFTjsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSBza2ItPmRhdGE7CisKKwluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUgKCZscC0+bG9jaywgZmxhZ3MpOworCisJbHAtPnN0YXRzLnR4X2J5dGVzICs9IGxlbmd0aDsKKwkvKiBEaXNhYmxlIHRoZSA4MjU4NidzIGlucHV0IHRvIHRoZSBpbnRlcnJ1cHQgbGluZS4gKi8KKwlvdXRiICgweDgwLCBpb2FkZHIgKyBNSVNDX0NUUkwpOworCisJaGFyZHdhcmVfc2VuZF9wYWNrZXQgKGRldiwgYnVmLCBza2ItPmxlbiwgbGVuZ3RoIC0gc2tiLT5sZW4pOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJLyogRW5hYmxlIHRoZSA4MjU4NiBpbnRlcnJ1cHQgaW5wdXQuICovCisJb3V0YiAoMHg4NCwgaW9hZGRyICsgTUlTQ19DVFJMKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZscC0+bG9jaywgZmxhZ3MpOworCisJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKworCS8qIFlvdSBtaWdodCBuZWVkIHRvIGNsZWFuIHVwIGFuZCByZWNvcmQgVHggc3RhdGlzdGljcyBoZXJlLiAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qCVRoZSB0eXBpY2FsIHdvcmtsb2FkIG9mIHRoZSBkcml2ZXI6CisJSGFuZGxlIHRoZSBuZXR3b3JrIGludGVyZmFjZSBpbnRlcnJ1cHRzLiAqLworc3RhdGljIGlycXJldHVybl90IGVsMTZfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscDsKKwlpbnQgaW9hZGRyLCBzdGF0dXMsIGJvZ3VzY291bnQgPSAwOworCXVzaG9ydCBhY2tfY21kID0gMDsKKwl2b2lkIF9faW9tZW0gKnNobWVtOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayAoIm5ldF9pbnRlcnJ1cHQoKTogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisJc2htZW0gPSBscC0+YmFzZTsKKworCXNwaW5fbG9jaygmbHAtPmxvY2spOworCisJc3RhdHVzID0gcmVhZHcoc2htZW0raVNDQl9TVEFUVVMpOworCisJaWYgKG5ldF9kZWJ1ZyA+IDQpIHsKKwkJcHJpbnRrKCIlczogM2M1MDcgaW50ZXJydXB0LCBzdGF0dXMgJTQuNHguXG4iLCBkZXYtPm5hbWUsIHN0YXR1cyk7CisJfQorCisJLyogRGlzYWJsZSB0aGUgODI1ODYncyBpbnB1dCB0byB0aGUgaW50ZXJydXB0IGxpbmUuICovCisJb3V0YigweDgwLCBpb2FkZHIgKyBNSVNDX0NUUkwpOworCisJLyogUmVhcCB0aGUgVHggcGFja2V0IGJ1ZmZlcnMuICovCisJd2hpbGUgKGxwLT50eF9wa3RzX2luX3JpbmcpIHsKKwkgIHVuc2lnbmVkIHNob3J0IHR4X3N0YXR1cyA9IHJlYWR3KHNobWVtK2xwLT50eF9yZWFwKTsKKwkgIGlmICghKHR4X3N0YXR1cyAmIDB4ODAwMCkpIHsKKwkJaWYgKG5ldF9kZWJ1ZyA+IDUpIAorCQkJcHJpbnRrKCJUeCBjb21tYW5kIGluY29tcGxldGUgKCUjeCkuXG4iLCBscC0+dHhfcmVhcCk7CisJCWJyZWFrOworCSAgfQorCSAgLyogVHggdW5zdWNjZXNzZnVsIG9yIHNvbWUgaW50ZXJlc3Rpbmcgc3RhdHVzIGJpdCBzZXQuICovCisJICBpZiAoISh0eF9zdGF0dXMgJiAweDIwMDApIHx8ICh0eF9zdGF0dXMgJiAweDBmM2YpKSB7CisJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJaWYgKHR4X3N0YXR1cyAmIDB4MDYwMCkgIGxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQlpZiAodHhfc3RhdHVzICYgMHgwMTAwKSAgbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCWlmICghKHR4X3N0YXR1cyAmIDB4MDA0MCkpICBscC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycysrOworCQlpZiAodHhfc3RhdHVzICYgMHgwMDIwKSAgbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCWxwLT5zdGF0cy5jb2xsaXNpb25zICs9IHR4X3N0YXR1cyAmIDB4ZjsKKwkgIH0KKwkgIGxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJICBpZiAobmV0X2RlYnVnID4gNSkKKwkJICBwcmludGsoIlJlYXBlZCAleCwgVHggc3RhdHVzICUwNHguXG4iICwgbHAtPnR4X3JlYXAsIHR4X3N0YXR1cyk7CisJICBscC0+dHhfcmVhcCArPSBUWF9CVUZfU0laRTsKKwkgIGlmIChscC0+dHhfcmVhcCA+IFJYX0JVRl9TVEFSVCAtIFRYX0JVRl9TSVpFKQorCQlscC0+dHhfcmVhcCA9IFRYX0JVRl9TVEFSVDsKKworCSAgbHAtPnR4X3BrdHNfaW5fcmluZy0tOworCSAgLyogVGhlcmUgaXMgYWx3YXlzIG1vcmUgc3BhY2UgaW4gdGhlIFR4IHJpbmcgYnVmZmVyIG5vdy4gKi8KKwkgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCSAgaWYgKCsrYm9ndXNjb3VudCA+IDEwKQorCQlicmVhazsKKwl9CisKKwlpZiAoc3RhdHVzICYgMHg0MDAwKSB7IC8qIFBhY2tldCByZWNlaXZlZC4gKi8KKwkJaWYgKG5ldF9kZWJ1ZyA+IDUpCisJCQlwcmludGsoIlJlY2VpdmVkIHBhY2tldCwgcnhfaGVhZCAlMDR4LlxuIiwgbHAtPnJ4X2hlYWQpOworCQllbDE2X3J4KGRldik7CisJfQorCisJLyogQWNrbm93bGVkZ2UgdGhlIGludGVycnVwdCBzb3VyY2VzLiAqLworCWFja19jbWQgPSBzdGF0dXMgJiAweGYwMDA7CisKKwlpZiAoKHN0YXR1cyAmIDB4MDcwMCkgIT0gMHgwMjAwICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlpZiAobmV0X2RlYnVnKQorCQkJcHJpbnRrKCIlczogQ29tbWFuZCB1bml0IHN0b3BwZWQsIHN0YXR1cyAlMDR4LCByZXN0YXJ0aW5nLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCS8qIElmIHRoaXMgZXZlciBvY2N1cnMgd2Ugc2hvdWxkIHJlYWxseSByZS13cml0ZSB0aGUgaWRsZSBsb29wLCByZXNldAorCQkgICB0aGUgVHggbGlzdCwgYW5kIGRvIGEgY29tcGxldGUgcmVzdGFydCBvZiB0aGUgY29tbWFuZCB1bml0LgorCQkgICBGb3Igbm93IHdlIHJlbHkgb24gdGhlIFR4IHRpbWVvdXQgaWYgdGhlIHJlc3VtZSBkb2Vzbid0IHdvcmsuICovCisJCWFja19jbWQgfD0gQ1VDX1JFU1VNRTsKKwl9CisKKwlpZiAoKHN0YXR1cyAmIDB4MDA3MCkgIT0gMHgwMDQwICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkvKiBUaGUgUnggdW5pdCBpcyBub3QgcmVhZHksIGl0IG11c3QgYmUgaHVuZy4gIFJlc3RhcnQgdGhlIHJlY2VpdmVyIGJ5CisJCSAgIGluaXRpYWxpemluZyB0aGUgcnggYnVmZmVycywgYW5kIGlzc3VpbmcgYW4gUnggc3RhcnQgY29tbWFuZC4gKi8KKwkJaWYgKG5ldF9kZWJ1ZykKKwkJCXByaW50aygiJXM6IFJ4IHVuaXQgc3RvcHBlZCwgc3RhdHVzICUwNHgsIHJlc3RhcnRpbmcuXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJaW5pdF9yeF9idWZzKGRldik7CisJCXdyaXRldyhSWF9CVUZfU1RBUlQsc2htZW0raVNDQl9SRkEpOworCQlhY2tfY21kIHw9IFJYX1NUQVJUOworCX0KKworCXdyaXRldyhhY2tfY21kLHNobWVtK2lTQ0JfQ01EKTsKKwlvdXRiKDAsIGlvYWRkciArIFNJR05BTF9DQSk7CQkJLyogSXNzdWUgY2hhbm5lbC1hdHRuLiAqLworCisJLyogQ2xlYXIgdGhlIGxhdGNoZWQgaW50ZXJydXB0LiAqLworCW91dGIoMCwgaW9hZGRyICsgUkVTRVRfSVJRKTsKKworCS8qIEVuYWJsZSB0aGUgODI1ODYncyBpbnRlcnJ1cHQgaW5wdXQuICovCisJb3V0YigweDg0LCBpb2FkZHIgKyBNSVNDX0NUUkwpOworCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGVsMTZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXZvaWQgX19pb21lbSAqc2htZW0gPSBscC0+YmFzZTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIEZsdXNoIHRoZSBUeCBhbmQgZGlzYWJsZSBSeC4gKi8KKwl3cml0ZXcoUlhfU1VTUEVORCB8IENVQ19TVVNQRU5ELHNobWVtK2lTQ0JfQ01EKTsKKwlvdXRiKDAsIGlvYWRkciArIFNJR05BTF9DQSk7CisKKwkvKiBEaXNhYmxlIHRoZSA4MjU4NidzIGlucHV0IHRvIHRoZSBpbnRlcnJ1cHQgbGluZS4gKi8KKwlvdXRiKDB4ODAsIGlvYWRkciArIE1JU0NfQ1RSTCk7CisKKwkvKiBXZSBhbHdheXMgcGh5c2ljYWxseSB1c2UgdGhlIElSUSBsaW5lLCBzbyB3ZSBkb24ndCBkbyBmcmVlX2lycSgpLiAqLworCisJLyogVXBkYXRlIHRoZSBzdGF0aXN0aWNzIGhlcmUuICovCisKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCVRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IKKyAgIGNsb3NlZC4gKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZWwxNl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBUb0RvOiBkZWNpZGUgaWYgdGhlcmUgYXJlIGFueSB1c2VmdWwgc3RhdGlzdGljcyBmcm9tIHRoZSBTQ0IuICovCisKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgUngtYmxvY2sgbGlzdC4gKi8KK3N0YXRpYyB2b2lkIGluaXRfcnhfYnVmcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKndyaXRlX3B0cjsKKwl1bnNpZ25lZCBzaG9ydCBTQ0JfYmFzZSA9IFNDQl9CQVNFOworCisJaW50IGN1cl9yeGJ1ZiA9IGxwLT5yeF9oZWFkID0gUlhfQlVGX1NUQVJUOworCisJLyogSW5pdGlhbGl6ZSBlYWNoIFJ4IGZyYW1lICsgZGF0YSBidWZmZXIuICovCisJZG8gewkvKiBXaGlsZSB0aGVyZSBpcyByb29tIGZvciBvbmUgbW9yZS4gKi8KKworCQl3cml0ZV9wdHIgPSBscC0+YmFzZSArIGN1cl9yeGJ1ZjsKKworCQl3cml0ZXcoMHgwMDAwLHdyaXRlX3B0cik7CQkJLyogU3RhdHVzICovCisJCXdyaXRldygweDAwMDAsd3JpdGVfcHRyKz0yKTsJCQkvKiBDb21tYW5kICovCisJCXdyaXRldyhjdXJfcnhidWYgKyBSWF9CVUZfU0laRSx3cml0ZV9wdHIrPTIpOwkvKiBMaW5rICovCisJCXdyaXRldyhjdXJfcnhidWYgKyAyMix3cml0ZV9wdHIrPTIpOwkJLyogQnVmZmVyIG9mZnNldCAqLworCQl3cml0ZXcoMHgwMDAwLHdyaXRlX3B0cis9Mik7CQkJLyogUGFkIGZvciBkZXN0IGFkZHIuICovCisJCXdyaXRldygweDAwMDAsd3JpdGVfcHRyKz0yKTsKKwkJd3JpdGV3KDB4MDAwMCx3cml0ZV9wdHIrPTIpOworCQl3cml0ZXcoMHgwMDAwLHdyaXRlX3B0cis9Mik7CQkJLyogUGFkIGZvciBzb3VyY2UgYWRkci4gKi8KKwkJd3JpdGV3KDB4MDAwMCx3cml0ZV9wdHIrPTIpOworCQl3cml0ZXcoMHgwMDAwLHdyaXRlX3B0cis9Mik7CisJCXdyaXRldygweDAwMDAsd3JpdGVfcHRyKz0yKTsJCQkvKiBQYWQgZm9yIHByb3RvY29sLiAqLworCisJCXdyaXRldygweDAwMDAsd3JpdGVfcHRyKz0yKTsJCQkvKiBCdWZmZXI6IEFjdHVhbCBjb3VudCAqLworCQl3cml0ZXcoLTEsd3JpdGVfcHRyKz0yKTsJCQkvKiBCdWZmZXI6IE5leHQgKG5vbmUpLiAqLworCQl3cml0ZXcoY3VyX3J4YnVmICsgMHgyMCArIFNDQl9iYXNlLHdyaXRlX3B0cis9Mik7LyogQnVmZmVyOiBBZGRyZXNzIGxvdyAqLworCQl3cml0ZXcoMHgwMDAwLHdyaXRlX3B0cis9Mik7CisJCS8qIEZpbmFsbHksIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlci4gKi8KKwkJd3JpdGV3KDB4ODAwMCArIFJYX0JVRl9TSVpFLTB4MjAsd3JpdGVfcHRyKz0yKTsKKworCQlscC0+cnhfdGFpbCA9IGN1cl9yeGJ1ZjsKKwkJY3VyX3J4YnVmICs9IFJYX0JVRl9TSVpFOworCX0gd2hpbGUgKGN1cl9yeGJ1ZiA8PSBSWF9CVUZfRU5EIC0gUlhfQlVGX1NJWkUpOworCisJLyogVGVybWluYXRlIHRoZSBsaXN0IGJ5IHNldHRpbmcgdGhlIEVPTCBiaXQsIGFuZCB3cmFwIHRoZSBwb2ludGVyIHRvIG1ha2UKKwkgICB0aGUgbGlzdCBhIHJpbmcuICovCisJd3JpdGVfcHRyID0gbHAtPmJhc2UgKyBscC0+cnhfdGFpbCArIDI7CisJd3JpdGV3KDB4QzAwMCx3cml0ZV9wdHIpOwkJCQkvKiBDb21tYW5kLCBtYXJrIGFzIGxhc3QuICovCisJd3JpdGV3KGxwLT5yeF9oZWFkLHdyaXRlX3B0cisyKTsJCQkvKiBMaW5rICovCit9CisKK3N0YXRpYyB2b2lkIGluaXRfODI1ODZfbWVtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXZvaWQgX19pb21lbSAqc2htZW0gPSBscC0+YmFzZTsKKworCS8qIEVuYWJsZSBsb29wYmFjayB0byBwcm90ZWN0IHRoZSB3aXJlIHdoaWxlIHN0YXJ0aW5nIHVwLAorCSAgIGFuZCBob2xkIHRoZSA1ODYgaW4gcmVzZXQgZHVyaW5nIHRoZSBtZW1vcnkgaW5pdGlhbGl6YXRpb24uICovCisJb3V0YigweDIwLCBpb2FkZHIgKyBNSVNDX0NUUkwpOworCisJLyogRml4IHRoZSBJU0NQIGFkZHJlc3MgYW5kIGJhc2UuICovCisJaW5pdF93b3Jkc1szXSA9IFNDQl9CQVNFOworCWluaXRfd29yZHNbN10gPSBTQ0JfQkFTRTsKKworCS8qIFdyaXRlIHRoZSB3b3JkcyBhdCAweGZmZjYgKGFkZHJlc3MtYWxpYXNlZCB0byAweGZmZmZmNikuICovCisJbWVtY3B5X3RvaW8obHAtPmJhc2UgKyBSWF9CVUZfRU5EIC0gMTAsIGluaXRfd29yZHMsIDEwKTsKKworCS8qIFdyaXRlIHRoZSB3b3JkcyBhdCAweDAwMDAuICovCisJbWVtY3B5X3RvaW8obHAtPmJhc2UsIGluaXRfd29yZHMgKyA1LCBzaXplb2YoaW5pdF93b3JkcykgLSAxMCk7CisKKwkvKiBGaWxsIGluIHRoZSBzdGF0aW9uIGFkZHJlc3MuICovCisJbWVtY3B5X3RvaW8obHAtPmJhc2UrU0FfT0ZGU0VULCBkZXYtPmRldl9hZGRyLAorCQkgICBzaXplb2YoZGV2LT5kZXZfYWRkcikpOworCisJLyogVGhlIFR4LWJsb2NrIGxpc3QgaXMgd3JpdHRlbiBhcyBuZWVkZWQuICBXZSBqdXN0IHNldCB1cCB0aGUgdmFsdWVzLiAqLworCWxwLT50eF9jbWRfbGluayA9IElETEVMT09QICsgNDsKKwlscC0+dHhfaGVhZCA9IGxwLT50eF9yZWFwID0gVFhfQlVGX1NUQVJUOworCisJaW5pdF9yeF9idWZzKGRldik7CisKKwkvKiBTdGFydCB0aGUgNTg2IGJ5IHJlbGVhc2luZyB0aGUgcmVzZXQgbGluZSwgYnV0IGxlYXZlIGxvb3BiYWNrLiAqLworCW91dGIoMHhBMCwgaW9hZGRyICsgTUlTQ19DVFJMKTsKKworCS8qIFRoaXMgd2FzIHRpbWUgY29uc3VtaW5nIHRvIHRyYWNrIGRvd246IHlvdSBuZWVkIHRvIGdpdmUgdHdvIGNoYW5uZWwKKwkgICBhdHRlbnRpb24gc2lnbmFscyB0byByZWxpYWJseSBzdGFydCB1cCB0aGUgaTgyNTg2LiAqLworCW91dGIoMCwgaW9hZGRyICsgU0lHTkFMX0NBKTsKKworCXsKKwkJaW50IGJvZ3VzY250ID0gNTA7CisJCXdoaWxlIChyZWFkdyhzaG1lbStpU0NCX1NUQVRVUykgPT0gMCkKKwkJCWlmICgtLWJvZ3VzY250ID09IDApIHsKKwkJCQlwcmludGsoIiVzOiBpODI1ODYgaW5pdGlhbGl6YXRpb24gdGltZWQgb3V0IHdpdGggc3RhdHVzICUwNHgsIgorCQkJCQkgICAiY21kICUwNHguXG4iLCBkZXYtPm5hbWUsCisJCQkJCSAgIHJlYWR3KHNobWVtK2lTQ0JfU1RBVFVTKSwgcmVhZHcoc2htZW0raVNDQl9DTUQpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJLyogSXNzdWUgY2hhbm5lbC1hdHRuIC0tIHRoZSA4MjU4NiB3b24ndCBzdGFydC4gKi8KKwkJb3V0YigwLCBpb2FkZHIgKyBTSUdOQUxfQ0EpOworCX0KKworCS8qIERpc2FibGUgbG9vcGJhY2sgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzLiAqLworCW91dGIoMHg4NCwgaW9hZGRyICsgTUlTQ19DVFJMKTsKKwlpZiAobmV0X2RlYnVnID4gNCkKKwkJcHJpbnRrKCIlczogSW5pdGlhbGl6ZWQgODI1ODYsIHN0YXR1cyAlMDR4LlxuIiwgZGV2LT5uYW1lLAorCQkJICAgcmVhZHcoc2htZW0raVNDQl9TVEFUVVMpKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGhhcmR3YXJlX3NlbmRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmJ1Ziwgc2hvcnQgbGVuZ3RoLCBzaG9ydCBwYWQpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVzaG9ydCB0eF9ibG9jayA9IGxwLT50eF9oZWFkOworCXZvaWQgX19pb21lbSAqd3JpdGVfcHRyID0gbHAtPmJhc2UgKyB0eF9ibG9jazsKKwlzdGF0aWMgY2hhciBwYWRkaW5nW0VUSF9aTEVOXTsKKworCS8qIFNldCB0aGUgd3JpdGUgcG9pbnRlciB0byB0aGUgVHggYmxvY2ssIGFuZCBwdXQgb3V0IHRoZSBoZWFkZXIuICovCisJd3JpdGV3KDB4MDAwMCx3cml0ZV9wdHIpOwkJCS8qIFR4IHN0YXR1cyAqLworCXdyaXRldyhDTURfSU5UUnxDbWRUeCx3cml0ZV9wdHIrPTIpOwkJLyogVHggY29tbWFuZCAqLworCXdyaXRldyh0eF9ibG9jaysxNix3cml0ZV9wdHIrPTIpOwkJLyogTmV4dCBjb21tYW5kIGlzIGEgTm9PcC4gKi8KKwl3cml0ZXcodHhfYmxvY2srOCx3cml0ZV9wdHIrPTIpOwkJCS8qIERhdGEgQnVmZmVyIG9mZnNldC4gKi8KKworCS8qIE91dHB1dCB0aGUgZGF0YSBidWZmZXIgZGVzY3JpcHRvci4gKi8KKwl3cml0ZXcoKHBhZCArIGxlbmd0aCkgfCAweDgwMDAsd3JpdGVfcHRyKz0yKTsJCS8qIEJ5dGUgY291bnQgcGFyYW1ldGVyLiAqLworCXdyaXRldygtMSx3cml0ZV9wdHIrPTIpOwkJCS8qIE5vIG5leHQgZGF0YSBidWZmZXIuICovCisJd3JpdGV3KHR4X2Jsb2NrKzIyK1NDQl9CQVNFLHdyaXRlX3B0cis9Mik7CS8qIEJ1ZmZlciBmb2xsb3dzIHRoZSBOb09wIGNvbW1hbmQuICovCisJd3JpdGV3KDB4MDAwMCx3cml0ZV9wdHIrPTIpOwkJCS8qIEJ1ZmZlciBhZGRyZXNzIGhpZ2ggYml0cyAoYWx3YXlzIHplcm8pLiAqLworCisJLyogT3V0cHV0IHRoZSBMb29wLWJhY2sgTm9PcCBjb21tYW5kLiAqLworCXdyaXRldygweDAwMDAsd3JpdGVfcHRyKz0yKTsJCQkvKiBUeCBzdGF0dXMgKi8KKwl3cml0ZXcoQ21kTk9wLHdyaXRlX3B0cis9Mik7CQkJLyogVHggY29tbWFuZCAqLworCXdyaXRldyh0eF9ibG9jaysxNix3cml0ZV9wdHIrPTIpOwkJLyogTmV4dCBpcyBteXNlbGYuICovCisKKwkvKiBPdXRwdXQgdGhlIHBhY2tldCBhdCB0aGUgd3JpdGUgcG9pbnRlci4gKi8KKwltZW1jcHlfdG9pbyh3cml0ZV9wdHIrMiwgYnVmLCBsZW5ndGgpOworCWlmIChwYWQpCisJCW1lbWNweV90b2lvKHdyaXRlX3B0citsZW5ndGgrMiwgcGFkZGluZywgcGFkKTsKKworCS8qIFNldCB0aGUgb2xkIGNvbW1hbmQgbGluayBwb2ludGluZyB0byB0aGlzIHNlbmQgcGFja2V0LiAqLworCXdyaXRldyh0eF9ibG9jayxscC0+YmFzZSArIGxwLT50eF9jbWRfbGluayk7CisJbHAtPnR4X2NtZF9saW5rID0gdHhfYmxvY2sgKyAyMDsKKworCS8qIFNldCB0aGUgbmV4dCBmcmVlIHR4IHJlZ2lvbi4gKi8KKwlscC0+dHhfaGVhZCA9IHR4X2Jsb2NrICsgVFhfQlVGX1NJWkU7CisJaWYgKGxwLT50eF9oZWFkID4gUlhfQlVGX1NUQVJUIC0gVFhfQlVGX1NJWkUpCisJCWxwLT50eF9oZWFkID0gVFhfQlVGX1NUQVJUOworCisJaWYgKG5ldF9kZWJ1ZyA+IDQpIHsKKwkJcHJpbnRrKCIlczogM2M1MDcgQCV4IHNlbmQgbGVuZ3RoID0gJWQsIHR4X2Jsb2NrICUzeCwgbmV4dCAlM3guXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpb2FkZHIsIGxlbmd0aCwgdHhfYmxvY2ssIGxwLT50eF9oZWFkKTsKKwl9CisKKwkvKiBHcmltbHkgYmxvY2sgZnVydGhlciBwYWNrZXRzIGlmIHRoZXJlIGhhcyBiZWVuIGluc3VmZmljaWVudCByZWFwaW5nLiAqLworCWlmICgrK2xwLT50eF9wa3RzX2luX3JpbmcgPCBOVU1fVFhfQlVGUykgCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIHZvaWQgZWwxNl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKnNobWVtID0gbHAtPmJhc2U7CisJdXNob3J0IHJ4X2hlYWQgPSBscC0+cnhfaGVhZDsKKwl1c2hvcnQgcnhfdGFpbCA9IGxwLT5yeF90YWlsOworCXVzaG9ydCBib2d1c2NvdW50ID0gMTA7CisJc2hvcnQgZnJhbWVfc3RhdHVzOworCisJd2hpbGUgKChmcmFtZV9zdGF0dXMgPSByZWFkdyhzaG1lbStyeF9oZWFkKSkgPCAwKSB7ICAgLyogQ29tbWFuZCBjb21wbGV0ZSAqLworCQl2b2lkIF9faW9tZW0gKnJlYWRfZnJhbWUgPSBscC0+YmFzZSArIHJ4X2hlYWQ7CisJCXVzaG9ydCByZmRfY21kID0gcmVhZHcocmVhZF9mcmFtZSsyKTsKKwkJdXNob3J0IG5leHRfcnhfZnJhbWUgPSByZWFkdyhyZWFkX2ZyYW1lKzQpOworCQl1c2hvcnQgZGF0YV9idWZmZXJfYWRkciA9IHJlYWR3KHJlYWRfZnJhbWUrNik7CisJCXZvaWQgX19pb21lbSAqZGF0YV9mcmFtZSA9IGxwLT5iYXNlICsgZGF0YV9idWZmZXJfYWRkcjsKKwkJdXNob3J0IHBrdF9sZW4gPSByZWFkdyhkYXRhX2ZyYW1lKTsKKworCQlpZiAocmZkX2NtZCAhPSAwIHx8IGRhdGFfYnVmZmVyX2FkZHIgIT0gcnhfaGVhZCArIDIyCisJCQl8fCAocGt0X2xlbiAmIDB4QzAwMCkgIT0gMHhDMDAwKSB7CisJCQlwcmludGsoIiVzOiBSeCBmcmFtZSBhdCAlI3ggY29ycnVwdGVkLCBzdGF0dXMgJTA0eCBjbWQgJTA0eCIKKwkJCQkgICAibmV4dCAlMDR4IGRhdGEtYnVmIEAlMDR4ICUwNHguXG4iLCBkZXYtPm5hbWUsIHJ4X2hlYWQsCisJCQkJICAgZnJhbWVfc3RhdHVzLCByZmRfY21kLCBuZXh0X3J4X2ZyYW1lLCBkYXRhX2J1ZmZlcl9hZGRyLAorCQkJCSAgIHBrdF9sZW4pOworCQl9IGVsc2UgaWYgKChmcmFtZV9zdGF0dXMgJiAweDIwMDApID09IDApIHsKKwkJCS8qIEZyYW1lIFJ4ZWQsIGJ1dCB3aXRoIGVycm9yLiAqLworCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDgwMCkgbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChmcmFtZV9zdGF0dXMgJiAweDA0MDApIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChmcmFtZV9zdGF0dXMgJiAweDAyMDApIGxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDEwMCkgbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAoZnJhbWVfc3RhdHVzICYgMHgwMDgwKSBscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuICovCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlwa3RfbGVuICY9IDB4M2ZmZjsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbisyKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCXByaW50aygiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXNrYl9yZXNlcnZlKHNrYiwyKTsKKwkJCXNrYi0+ZGV2ID0gZGV2OworCisJCQkvKiAnc2tiLT5kYXRhJyBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHNrX2J1ZmYgZGF0YSBhcmVhLiAqLworCQkJbWVtY3B5X2Zyb21pbyhza2JfcHV0KHNrYixwa3RfbGVuKSwgZGF0YV9mcmFtZSArIDEwLCBwa3RfbGVuKTsKKworCQkJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQl9CisKKwkJLyogQ2xlYXIgdGhlIHN0YXR1cyB3b3JkIGFuZCBzZXQgRW5kLW9mLUxpc3Qgb24gdGhlIHJ4IGZyYW1lLiAqLworCQl3cml0ZXcoMCxyZWFkX2ZyYW1lKTsKKwkJd3JpdGV3KDB4QzAwMCxyZWFkX2ZyYW1lKzIpOworCQkvKiBDbGVhciB0aGUgZW5kLW9mLWxpc3Qgb24gdGhlIHByZXYuIFJGRC4gKi8KKwkJd3JpdGV3KDB4MDAwMCxscC0+YmFzZSArIHJ4X3RhaWwgKyAyKTsKKworCQlyeF90YWlsID0gcnhfaGVhZDsKKwkJcnhfaGVhZCA9IG5leHRfcnhfZnJhbWU7CisJCWlmICgtLWJvZ3VzY291bnQgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWxwLT5yeF9oZWFkID0gcnhfaGVhZDsKKwlscC0+cnhfdGFpbCA9IHJ4X3RhaWw7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIklTQSAweCVseCIsIGRldi0+YmFzZV9hZGRyKTsKK30KKworc3RhdGljIHUzMiBuZXRkZXZfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRlYnVnOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBsZXZlbCkKK3sKKwlkZWJ1ZyA9IGxldmVsOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorCS5nZXRfbXNnbGV2ZWwJCT0gbmV0ZGV2X2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCQk9IG5ldGRldl9zZXRfbXNnbGV2ZWwsCit9OworCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl8zYzUwNzsKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiRXRoZXJMaW5rMTYgSS9PIGJhc2UgYWRkcmVzcyIpOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICIoaWdub3JlZCkiKTsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJaWYgKGlvID09IDApCisJCXByaW50aygiM2M1MDc6IFlvdSBzaG91bGQgbm90IHVzZSBhdXRvLXByb2Jpbmcgd2l0aCBpbnNtb2QhXG4iKTsKKwlkZXZfM2M1MDcgPSBlbDE2X3Byb2JlKC0xKTsKKwlyZXR1cm4gSVNfRVJSKGRldl8zYzUwNykgPyBQVFJfRVJSKGRldl8zYzUwNykgOiAwOworfQorCit2b2lkCitjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfM2M1MDc7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlpb3VubWFwKCgoc3RydWN0IG5ldF9sb2NhbCAqKW5ldGRldl9wcml2KGRldikpLT5iYXNlKTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRUwxNl9JT19FWFRFTlQpOworCWZyZWVfbmV0ZGV2KGRldik7Cit9CisjZW5kaWYgLyogTU9EVUxFICovCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1EX19LRVJORUxfXyAtSS91c3Ivc3JjL2xpbnV4L25ldC9pbmV0IC1JL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLW00ODYgLWMgM2M1MDcuYyIKKyAqICB2ZXJzaW9uLWNvbnRyb2w6IHQKKyAqICBrZXB0LW5ldy12ZXJzaW9uczogNQorICogIHRhYi13aWR0aDogNAorICogIGMtaW5kZW50LWxldmVsOiA0CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTA5LmMgYi9kcml2ZXJzL25ldC8zYzUwOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NDMxMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC8zYzUwOS5jCkBAIC0wLDAgKzEsMTYyMiBAQAorLyogM2M1MDkuYzogQSAzYzUwOSBFdGhlckxpbmszIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguICovCisvKgorCVdyaXR0ZW4gMTk5My0yMDAwIGJ5IERvbmFsZCBCZWNrZXIuCisKKwlDb3B5cmlnaHQgMTk5NC0yMDAwIGJ5IERvbmFsZCBCZWNrZXIuCisJQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorCURpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCSBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZAorCWRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorCWluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSAzQ29tIEV0aGVyTGlua0lJSSBzZXJpZXMuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKwlLbm93biBsaW1pdGF0aW9uczoKKwlCZWNhdXNlIG9mIHRoZSB3YXkgM2M1MDkgSVNBIGRldGVjdGlvbiB3b3JrcyBpdCdzIGRpZmZpY3VsdCB0byBwcmVkaWN0CisJYSBwcmlvcmkgd2hpY2ggb2Ygc2V2ZXJhbCBJU0EtbW9kZSBjYXJkcyB3aWxsIGJlIGRldGVjdGVkIGZpcnN0LgorCisJVGhpcyBkcml2ZXIgZG9lcyBub3QgdXNlIHByZWRpY3RpdmUgaW50ZXJydXB0IG1vZGUsIHJlc3VsdGluZyBpbiBoaWdoZXIKKwlwYWNrZXQgbGF0ZW5jeSBidXQgbG93ZXIgb3ZlcmhlYWQuICBJZiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBmb3IgYW4KKwl1bnVzdWFsbHkgbG9uZyB0aW1lIGl0IGNvdWxkIGFsc28gcmVzdWx0IGluIG1pc3NlZCBwYWNrZXRzLCBidXQgaW4KKwlwcmFjdGljZSB0aGlzIHJhcmVseSBoYXBwZW5zLgorCisKKwlGSVhFUzoKKwkJQWxhbiBDb3g6ICAgICAgIFJlbW92ZWQgdGhlICdVbmV4cGVjdGVkIGludGVycnVwdCcgYnVnLgorCQlNaWNoYWVsIE1lc2tlczoJVXBncmFkZWQgdG8gRG9uYWxkIEJlY2tlcidzIHZlcnNpb24gMS4wNy4KKwkJQWxhbiBDb3g6CUluY3JlYXNlZCB0aGUgZWVwcm9tIGRlbGF5LiBSZWdhcmRsZXNzIG9mIAorCQkJCXdoYXQgdGhlIGRvY3Mgc2F5IHNvbWUgcGVvcGxlIGRlZmluaXRlbHkKKwkJCQlnZXQgcHJvYmxlbXMgd2l0aCBsb3dlciAoYnV0IGluIGNhcmQgc3BlYykKKwkJCQlkZWxheXMKKwkJdjEuMTAgNC8yMS85NyBGaXhlZCBtb2R1bGUgY29kZSBzbyB0aGF0IG11bHRpcGxlIGNhcmRzIG1heSBiZSBkZXRlY3RlZCwKKwkJCQlvdGhlciBjbGVhbnVwcy4gIC1kamIKKwkJQW5kcmVhIEFyY2FuZ2VsaToJVXBncmFkZWQgdG8gRG9uYWxkIEJlY2tlcidzIHZlcnNpb24gMS4xMi4KKwkJUmljayBQYXluZToJRml4ZWQgU01QIHJhY2UgY29uZGl0aW9uCisJCXYxLjEzIDkvOC85NyBNYWRlICdtYXhfaW50ZXJydXB0X3dvcmsnIGFuIGluc21vZC1zZXR0YWJsZSB2YXJpYWJsZSAtZGpiCisJCXYxLjE0IDEwLzE1Lzk3IEF2b2lkZWQgd2FpdGluZy4uZGlzY2FyZCBtZXNzYWdlIGZvciBmYXN0IG1hY2hpbmVzIC1kamIKKwkJdjEuMTUgMS8zMS85OCBGYXN0ZXIgcmVjb3ZlcnkgZm9yIFR4IGVycm9ycy4gLWRqYgorCQl2MS4xNiAyLzMvOTggRGlmZmVyZW50IElEIHBvcnQgaGFuZGxpbmcgdG8gYXZvaWQgc291bmQgY2FyZHMuIC1kamIKKwkJdjEuMTggMTJNYXIyMDAxIEFuZHJldyBNb3J0b24gPGFuZHJld21AdW93LmVkdS5hdT4KKwkJCS0gQXZvaWQgYm9ndXMgZGV0ZWN0IG9mIDNjNTkwJ3MgKEFuZHJ6ZWogS3J6eXN6dG9mb3dpY3opCisJCQktIFJldmlld2VkIGFnYWluc3QgMS4xOCBmcm9tIHNjeWxkLmNvbQorCQl2MS4xOGEgMTdOb3YyMDAxIEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKwkJCS0gZXRodG9vbCBzdXBwb3J0CisJCXYxLjE4YiAxTWFyMjAwMiBad2FuZSBNd2Fpa2FtYm8gPHp3YW5lQGNvbW1maXJlc2VydmljZXMuY29tPgorCQkJLSBQb3dlciBNYW5hZ2VtZW50IHN1cHBvcnQKKwkJdjEuMThjIDFNYXIyMDAyIERhdmlkIFJ1Z2dpZXJvIDxqZHJAZmFyZmFsbGUuY29tPgorCQkJLSBGdWxsIGR1cGxleCBzdXBwb3J0CisJCXYxLjE5ICAxNk9jdDIwMDIgWndhbmUgTXdhaWthbWJvIDx6d2FuZUBsaW51eHBvd2VyLmNhPgorCQkJLSBBZGRpdGlvbmFsIGV0aHRvb2wgZmVhdHVyZXMKKwkJdjEuMTlhIDI4T2N0MjAwMiBEYXZ1ZCBSdWdnaWVybyA8amRyQGZhcmZhbGxlLmNvbT4KKwkJCS0gSW5jcmVhc2UgKnJlYWRfZWVwcm9tIHVkZWxheSB0byB3b3JrYXJvdW5kIG9vcHMgd2l0aCAyIGNhcmRzLgorCQl2MS4xOWIgMDhOb3YyMDAyIE1hcmMgWnluZ2llciA8bWF6QHdpbGQtd2luZC5mci5ldS5vcmc+CisJCSAgICAtIEludHJvZHVjZSBkcml2ZXIgbW9kZWwgZm9yIEVJU0EgY2FyZHMuCisqLworCisjZGVmaW5lIERSVl9OQU1FCSIzYzUwOSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMTliIgorI2RlZmluZSBEUlZfUkVMREFURQkiMDhOb3YyMDAyIgorCisvKiBBIGZldyB2YWx1ZXMgdGhhdCBtYXkgYmUgdHdlYWtlZC4gKi8KKworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAoNDAwKkhaLzEwMDApCisvKiBNYXhpbXVtIGV2ZW50cyAoUnggcGFja2V0cywgZXRjLikgdG8gaGFuZGxlIGF0IGVhY2ggaW50ZXJydXB0LiAqLworc3RhdGljIGludCBtYXhfaW50ZXJydXB0X3dvcmsgPSAxMDsKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2lmZGVmIENPTkZJR19NQ0EKKyNpbmNsdWRlIDxsaW51eC9tY2EuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2lzYXBucC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiBmb3IgdWRlbGF5KCkgKi8KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9laXNhLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworc3RhdGljIGNoYXIgdmVyc2lvbkFbXSBfX2luaXRkYXRhID0gRFJWX05BTUUgIi5jOiIgRFJWX1ZFUlNJT04gIiAiIERSVl9SRUxEQVRFICIgYmVja2VyQHNjeWxkLmNvbVxuIjsKK3N0YXRpYyBjaGFyIHZlcnNpb25CW10gX19pbml0ZGF0YSA9ICJodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrLzNjNTA5Lmh0bWxcbiI7CisKKyNpZmRlZiBFTDNfREVCVUcKK3N0YXRpYyBpbnQgZWwzX2RlYnVnID0gRUwzX0RFQlVHOworI2Vsc2UKK3N0YXRpYyBpbnQgZWwzX2RlYnVnID0gMjsKKyNlbmRpZgorCisvKiBVc2VkIHRvIGRvIGEgZ2xvYmFsIGNvdW50IG9mIGFsbCB0aGUgY2FyZHMgaW4gdGhlIHN5c3RlbS4gIE11c3QgYmUKKyAqIGEgZ2xvYmFsIHZhcmlhYmxlIHNvIHRoYXQgdGhlIG1jYS9laXNhIHByb2JlIHJvdXRpbmVzIGNhbiBpbmNyZW1lbnQKKyAqIGl0ICovCitzdGF0aWMgaW50IGVsM19jYXJkcyA9IDA7CisKKy8qIFRvIG1pbmltaXplIHRoZSBzaXplIG9mIHRoZSBkcml2ZXIgc291cmNlIEkgb25seSBkZWZpbmUgb3BlcmF0aW5nCisgICBjb25zdGFudHMgaWYgdGhleSBhcmUgdXNlZCBzZXZlcmFsIHRpbWVzLiAgWW91J2xsIG5lZWQgdGhlIG1hbnVhbAorICAgYW55d2F5IGlmIHlvdSB3YW50IHRvIHVuZGVyc3RhbmQgZHJpdmVyIGRldGFpbHMuICovCisvKiBPZmZzZXRzIGZyb20gYmFzZSBJL08gYWRkcmVzcy4gKi8KKyNkZWZpbmUgRUwzX0RBVEEgMHgwMAorI2RlZmluZSBFTDNfQ01EIDB4MGUKKyNkZWZpbmUgRUwzX1NUQVRVUyAweDBlCisjZGVmaW5lCSBFRVBST01fUkVBRCAweDgwCisKKyNkZWZpbmUgRUwzX0lPX0VYVEVOVAkxNgorCisjZGVmaW5lIEVMM1dJTkRPVyh3aW5fbnVtKSBvdXR3KFNlbGVjdFdpbmRvdyArICh3aW5fbnVtKSwgaW9hZGRyICsgRUwzX0NNRCkKKworCisvKiBUaGUgdG9wIGZpdmUgYml0cyB3cml0dGVuIHRvIEVMM19DTUQgYXJlIGEgY29tbWFuZCwgdGhlIGxvd2VyCisgICAxMSBiaXRzIGFyZSB0aGUgcGFyYW1ldGVyLCBpZiBhcHBsaWNhYmxlLiAqLworZW51bSBjNTA5Y21kIHsKKwlUb3RhbFJlc2V0ID0gMDw8MTEsIFNlbGVjdFdpbmRvdyA9IDE8PDExLCBTdGFydENvYXggPSAyPDwxMSwKKwlSeERpc2FibGUgPSAzPDwxMSwgUnhFbmFibGUgPSA0PDwxMSwgUnhSZXNldCA9IDU8PDExLCBSeERpc2NhcmQgPSA4PDwxMSwKKwlUeEVuYWJsZSA9IDk8PDExLCBUeERpc2FibGUgPSAxMDw8MTEsIFR4UmVzZXQgPSAxMTw8MTEsCisJRmFrZUludHIgPSAxMjw8MTEsIEFja0ludHIgPSAxMzw8MTEsIFNldEludHJFbmIgPSAxNDw8MTEsCisJU2V0U3RhdHVzRW5iID0gMTU8PDExLCBTZXRSeEZpbHRlciA9IDE2PDwxMSwgU2V0UnhUaHJlc2hvbGQgPSAxNzw8MTEsCisJU2V0VHhUaHJlc2hvbGQgPSAxODw8MTEsIFNldFR4U3RhcnQgPSAxOTw8MTEsIFN0YXRzRW5hYmxlID0gMjE8PDExLAorCVN0YXRzRGlzYWJsZSA9IDIyPDwxMSwgU3RvcENvYXggPSAyMzw8MTEsIFBvd2VyVXAgPSAyNzw8MTEsCisJUG93ZXJEb3duID0gMjg8PDExLCBQb3dlckF1dG8gPSAyOTw8MTF9OworCitlbnVtIGM1MDlzdGF0dXMgeworCUludExhdGNoID0gMHgwMDAxLCBBZGFwdGVyRmFpbHVyZSA9IDB4MDAwMiwgVHhDb21wbGV0ZSA9IDB4MDAwNCwKKwlUeEF2YWlsYWJsZSA9IDB4MDAwOCwgUnhDb21wbGV0ZSA9IDB4MDAxMCwgUnhFYXJseSA9IDB4MDAyMCwKKwlJbnRSZXEgPSAweDAwNDAsIFN0YXRzRnVsbCA9IDB4MDA4MCwgQ21kQnVzeSA9IDB4MTAwMCwgfTsKKworLyogVGhlIFNldFJ4RmlsdGVyIGNvbW1hbmQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGNsYXNzZXM6ICovCitlbnVtIFJ4RmlsdGVyIHsKKwlSeFN0YXRpb24gPSAxLCBSeE11bHRpY2FzdCA9IDIsIFJ4QnJvYWRjYXN0ID0gNCwgUnhQcm9tID0gOCB9OworCisvKiBSZWdpc3RlciB3aW5kb3cgMSBvZmZzZXRzLCB0aGUgd2luZG93IHVzZWQgaW4gbm9ybWFsIG9wZXJhdGlvbi4gKi8KKyNkZWZpbmUgVFhfRklGTwkJMHgwMAorI2RlZmluZSBSWF9GSUZPCQkweDAwCisjZGVmaW5lIFJYX1NUQVRVUyAJMHgwOAorI2RlZmluZSBUWF9TVEFUVVMgCTB4MEIKKyNkZWZpbmUgVFhfRlJFRQkJMHgwQwkJLyogUmVtYWluaW5nIGZyZWUgYnl0ZXMgaW4gVHggYnVmZmVyLiAqLworCisjZGVmaW5lIFdOMF9DT05GX0NUUkwJMHgwNAkJLyogV2luZG93IDA6IENvbmZpZ3VyYXRpb24gY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBXTjBfQUREUl9DT05GCTB4MDYJCS8qIFdpbmRvdyAwOiBBZGRyZXNzIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgV04wX0lSUQkJMHgwOAkJLyogV2luZG93IDA6IFNldCBJUlEgbGluZSBpbiBiaXRzIDEyLTE1LiAqLworI2RlZmluZSBXTjRfTUVESUEJMHgwQQkJLyogV2luZG93IDQ6IFZhcmlvdXMgdHJhbnNjdnIvbWVkaWEgYml0cy4gKi8KKyNkZWZpbmUJTUVESUFfVFAJMHgwMEMwCQkvKiBFbmFibGUgbGluayBiZWF0IGFuZCBqYWJiZXIgZm9yIDEwYmFzZVQuICovCisjZGVmaW5lIFdONF9ORVRESUFHCTB4MDYJCS8qIFdpbmRvdyA0OiBOZXQgZGlhZ25vc3RpYyAqLworI2RlZmluZSBGRF9FTkFCTEUJMHg4MDAwCQkvKiBFbmFibGUgZnVsbC1kdXBsZXggKCJleHRlcm5hbCBsb29wYmFjayIpICovICAKKworLyoKKyAqIE11c3QgYmUgYSBwb3dlciBvZiB0d28gKHdlIHVzZSBhIGJpbmFyeSBhbmQgaW4gdGhlCisgKiBjaXJjdWxhciBxdWV1ZSkKKyAqLworI2RlZmluZSBTS0JfUVVFVUVfU0laRQk2NAorCitzdHJ1Y3QgZWwzX3ByaXZhdGUgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXh0X2RldjsKKwlzcGlubG9ja190IGxvY2s7CisJLyogc2tiIHNlbmQtcXVldWUgKi8KKwlpbnQgaGVhZCwgc2l6ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcXVldWVbU0tCX1FVRVVFX1NJWkVdOworI2lmZGVmIENPTkZJR19QTQorCXN0cnVjdCBwbV9kZXYgKnBtZGV2OworI2VuZGlmCisJZW51bSB7CisJCUVMM19NQ0EsCisJCUVMM19QTlAsCisJCUVMM19FSVNBLAorCX0gdHlwZTsJCQkJCQkvKiB0eXBlIG9mIGRldmljZSAqLworCXN0cnVjdCBkZXZpY2UgKmRldjsKK307CitzdGF0aWMgaW50IGlkX3BvcnQgX19pbml0ZGF0YSA9IDB4MTEwOwkvKiBTdGFydCB3aXRoIDB4MTEwIHRvIGF2b2lkIG5ldyBzb3VuZCBjYXJkcy4qLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICplbDNfcm9vdF9kZXY7CisKK3N0YXRpYyB1c2hvcnQgaWRfcmVhZF9lZXByb20oaW50IGluZGV4KTsKK3N0YXRpYyB1c2hvcnQgcmVhZF9lZXByb20oaW50IGlvYWRkciwgaW50IGluZGV4KTsKK3N0YXRpYyBpbnQgZWwzX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGVsM19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGVsM19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCB1cGRhdGVfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVsM19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGVsM19yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZWwzX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWwzX3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWwzX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlbDNfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzOworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBlbDNfc3VzcGVuZChzdHJ1Y3QgcG1fZGV2ICpwZGV2KTsKK3N0YXRpYyBpbnQgZWwzX3Jlc3VtZShzdHJ1Y3QgcG1fZGV2ICpwZGV2KTsKK3N0YXRpYyBpbnQgZWwzX3BtX2NhbGxiYWNrKHN0cnVjdCBwbV9kZXYgKnBkZXYsIHBtX3JlcXVlc3RfdCBycXN0LCB2b2lkICpkYXRhKTsKKyNlbmRpZgorLyogZ2VuZXJpYyBkZXZpY2UgcmVtb3ZlIGZvciBhbGwgZGV2aWNlIHR5cGVzICovCisjaWYgZGVmaW5lZChDT05GSUdfRUlTQSkgfHwgZGVmaW5lZChDT05GSUdfTUNBKQorc3RhdGljIGludCBlbDNfZGV2aWNlX3JlbW92ZSAoc3RydWN0IGRldmljZSAqZGV2aWNlKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBlbDNfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRUlTQQorc3RhdGljIHN0cnVjdCBlaXNhX2RldmljZV9pZCBlbDNfZWlzYV9pZHNbXSA9IHsKKwkJeyAiVENNNTA5MiIgfSwKKwkJeyAiVENNNTA5MyIgfSwKKwkJeyAiIiB9Cit9OworCitzdGF0aWMgaW50IGVsM19laXNhX3Byb2JlIChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOworCitzdGF0aWMgc3RydWN0IGVpc2FfZHJpdmVyIGVsM19laXNhX2RyaXZlciA9IHsKKwkJLmlkX3RhYmxlID0gZWwzX2Vpc2FfaWRzLAorCQkuZHJpdmVyICAgPSB7CisJCQkJLm5hbWUgICAgPSAiM2M1MDkiLAorCQkJCS5wcm9iZSAgID0gZWwzX2Vpc2FfcHJvYmUsCisJCQkJLnJlbW92ZSAgPSBfX2RldmV4aXRfcCAoZWwzX2RldmljZV9yZW1vdmUpCisJCX0KK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NQ0EKK3N0YXRpYyBpbnQgZWwzX21jYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCitzdGF0aWMgc2hvcnQgZWwzX21jYV9hZGFwdGVyX2lkc1tdIF9faW5pdGRhdGEgPSB7CisJCTB4NjI3YywKKwkJMHg2MjdkLAorCQkweDYyZGIsCisJCTB4NjJmNiwKKwkJMHg2MmY3LAorCQkweDAwMDAKK307CisKK3N0YXRpYyBjaGFyICplbDNfbWNhX2FkYXB0ZXJfbmFtZXNbXSBfX2luaXRkYXRhID0geworCQkiM0NvbSAzYzUyOSBFdGhlckxpbmsgSUlJICgxMGJhc2UyKSIsCisJCSIzQ29tIDNjNTI5IEV0aGVyTGluayBJSUkgKDEwYmFzZVQpIiwKKwkJIjNDb20gM2M1MjkgRXRoZXJMaW5rIElJSSAodGVzdCBtb2RlKSIsCisJCSIzQ29tIDNjNTI5IEV0aGVyTGluayBJSUkgKFRQIG9yIGNvYXgpIiwKKwkJIjNDb20gM2M1MjkgRXRoZXJMaW5rIElJSSAoVFApIiwKKwkJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBtY2FfZHJpdmVyIGVsM19tY2FfZHJpdmVyID0geworCQkuaWRfdGFibGUgPSBlbDNfbWNhX2FkYXB0ZXJfaWRzLAorCQkuZHJpdmVyID0geworCQkJCS5uYW1lID0gIjNjNTI5IiwKKwkJCQkuYnVzID0gJm1jYV9idXNfdHlwZSwKKwkJCQkucHJvYmUgPSBlbDNfbWNhX3Byb2JlLAorCQkJCS5yZW1vdmUgPSBfX2RldmV4aXRfcChlbDNfZGV2aWNlX3JlbW92ZSksCisJCX0sCit9OworI2VuZGlmIC8qIENPTkZJR19NQ0EgKi8KKworI2lmIGRlZmluZWQoX19JU0FQTlBfXykKK3N0YXRpYyBzdHJ1Y3QgaXNhcG5wX2RldmljZV9pZCBlbDNfaXNhcG5wX2FkYXB0ZXJzW10gX19pbml0ZGF0YSA9IHsKKwl7CUlTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCisJCUlTQVBOUF9WRU5ET1IoJ1QnLCAnQycsICdNJyksIElTQVBOUF9GVU5DVElPTigweDUwOTApLAorCQkobG9uZykgIjNDb20gRXRoZXJsaW5rIElJSSAoVFApIiB9LAorCXsJSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkJSVNBUE5QX1ZFTkRPUignVCcsICdDJywgJ00nKSwgSVNBUE5QX0ZVTkNUSU9OKDB4NTA5MSksCisJCShsb25nKSAiM0NvbSBFdGhlcmxpbmsgSUlJIiB9LAorCXsJSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkJSVNBUE5QX1ZFTkRPUignVCcsICdDJywgJ00nKSwgSVNBUE5QX0ZVTkNUSU9OKDB4NTA5NCksCisJCShsb25nKSAiM0NvbSBFdGhlcmxpbmsgSUlJIChjb21ibykiIH0sCisJewlJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lELAorCQlJU0FQTlBfVkVORE9SKCdUJywgJ0MnLCAnTScpLCBJU0FQTlBfRlVOQ1RJT04oMHg1MDk1KSwKKwkJKGxvbmcpICIzQ29tIEV0aGVybGluayBJSUkgKFRQTykiIH0sCisJewlJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lELAorCQlJU0FQTlBfVkVORE9SKCdUJywgJ0MnLCAnTScpLCBJU0FQTlBfRlVOQ1RJT04oMHg1MDk4KSwKKwkJKGxvbmcpICIzQ29tIEV0aGVybGluayBJSUkgKFRQQykiIH0sCisJewlJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lELAorCQlJU0FQTlBfVkVORE9SKCdQJywgJ04nLCAnUCcpLCBJU0FQTlBfRlVOQ1RJT04oMHg4MGY3KSwKKwkJKGxvbmcpICIzQ29tIEV0aGVybGluayBJSUkgY29tcGF0aWJsZSIgfSwKKwl7CUlTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCisJCUlTQVBOUF9WRU5ET1IoJ1AnLCAnTicsICdQJyksIElTQVBOUF9GVU5DVElPTigweDgwZjgpLAorCQkobG9uZykgIjNDb20gRXRoZXJsaW5rIElJSSBjb21wYXRpYmxlIiB9LAorCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLworfTsKKworc3RhdGljIHUxNiBlbDNfaXNhcG5wX3BoeXNfYWRkcls4XVszXTsKK3N0YXRpYyBpbnQgbm9wbnA7CisjZW5kaWYgLyogX19JU0FQTlBfXyAqLworCisvKiBXaXRoIHRoZSBkcml2ZXIgbW9kZWwgaW50cm9kdWN0aW9uIGZvciBFSVNBIGRldmljZXMsIGJvdGggaW5pdAorICogYW5kIGNsZWFudXAgaGF2ZSBiZWVuIHNwbGl0IDoKKyAqIC0gRUlTQSBkZXZpY2VzIHByb2JlL3JlbW92ZSBzdGFydHMgaW4gZWwzX2Vpc2FfcHJvYmUvZWwzX2RldmljZV9yZW1vdmUKKyAqIC0gTUNBL0lTQSBzdGlsbCB1c2UgZWwzX3Byb2JlCisgKgorICogQm90aCBjYWxsIGVsM19jb21tb25faW5pdC9lbDNfY29tbW9uX3JlbW92ZS4gKi8KKworc3RhdGljIGludCBfX2luaXQgZWwzX2NvbW1vbl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc2hvcnQgaTsKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKworCWlmIChkZXYtPm1lbV9zdGFydCAmIDB4MDUpIHsgLyogeGN2ciBjb2RlcyAxLzMvNC8xMiAqLworCQlkZXYtPmlmX3BvcnQgPSAoZGV2LT5tZW1fc3RhcnQgJiAweDBmKTsKKwl9IGVsc2UgeyAvKiB4Y3ZyIGNvZGVzIDAvOCAqLworCQkvKiB1c2UgZWVwcm9tIHZhbHVlLCBidXQgc2F2ZSB1c2VyJ3MgZnVsbC1kdXBsZXggc2VsZWN0aW9uICovCisJCWRldi0+aWZfcG9ydCB8PSAoZGV2LT5tZW1fc3RhcnQgJiAweDA4KTsKKwl9CisKKwkvKiBUaGUgRUwzLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5vcGVuID0gJmVsM19vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmVsM19zdGFydF94bWl0OworCWRldi0+c3RvcCA9ICZlbDNfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSAmZWwzX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT50eF90aW1lb3V0ID0gZWwzX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVsM19wb2xsX2NvbnRyb2xsZXI7CisjZW5kaWYKKwlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmZXRodG9vbF9vcHMpOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciAzYzV4OSBhdCAlIzMuM2x4LCBJUlEgJWQuXG4iLAorCQkJZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVMM19JT19FWFRFTlQpOworCQlyZXR1cm4gZXJyOworCX0KKworCXsKKwkJY29uc3QgY2hhciAqaWZfbmFtZXNbXSA9IHsiMTBiYXNlVCIsICJBVUkiLCAidW5kZWZpbmVkIiwgIkJOQyJ9OworCQlwcmludGsoIiVzOiAzYzV4OSBmb3VuZCBhdCAlIzMuM2x4LCAlcyBwb3J0LCBhZGRyZXNzICIsCisJCQlkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCAKKwkJCWlmX25hbWVzWyhkZXYtPmlmX3BvcnQgJiAweDAzKV0pOworCX0KKworCS8qIFJlYWQgaW4gdGhlIHN0YXRpb24gYWRkcmVzcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiAlMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiLCBJUlEgJWQuXG4iLCBkZXYtPmlycSk7CisKKwlpZiAoZWwzX2RlYnVnID4gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiIEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uQSwgdmVyc2lvbkIpOworCXJldHVybiAwOworCit9CisKK3N0YXRpYyB2b2lkIGVsM19jb21tb25fcmVtb3ZlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJKHZvaWQpIGxwOwkJCQkvKiBLZWVwIGdjYyBxdWlldC4uLiAqLworI2lmZGVmIENPTkZJR19QTQorCWlmIChscC0+cG1kZXYpCisJCXBtX3VucmVnaXN0ZXIobHAtPnBtZGV2KTsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19JU0FQTlBfXykKKwlpZiAobHAtPnR5cGUgPT0gRUwzX1BOUCkKKwkJcG5wX2RldmljZV9kZXRhY2godG9fcG5wX2RldihscC0+ZGV2KSk7CisjZW5kaWYKKworCXVucmVnaXN0ZXJfbmV0ZGV2IChkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBFTDNfSU9fRVhURU5UKTsKKwlmcmVlX25ldGRldiAoZGV2KTsKK30KKworc3RhdGljIGludCBfX2luaXQgZWwzX3Byb2JlKGludCBjYXJkX2lkeCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHA7CisJc2hvcnQgbHJzX3N0YXRlID0gMHhmZiwgaTsKKwlpbnQgaW9hZGRyLCBpcnEsIGlmX3BvcnQ7CisJdTE2IHBoeXNfYWRkclszXTsKKwlzdGF0aWMgaW50IGN1cnJlbnRfdGFnOworCWludCBlcnIgPSAtRU5PREVWOworI2lmIGRlZmluZWQoX19JU0FQTlBfXykKKwlzdGF0aWMgaW50IHBucF9jYXJkczsKKwlzdHJ1Y3QgcG5wX2RldiAqaWRldiA9IE5VTEw7CisKKwlpZiAobm9wbnAgPT0gMSkKKwkJZ290byBub19wbnA7CisKKwlmb3IgKGk9MDsgZWwzX2lzYXBucF9hZGFwdGVyc1tpXS52ZW5kb3IgIT0gMDsgaSsrKSB7CisJCWludCBqOworCQl3aGlsZSAoKGlkZXYgPSBwbnBfZmluZF9kZXYoTlVMTCwKKwkJCQkJICAgIGVsM19pc2FwbnBfYWRhcHRlcnNbaV0udmVuZG9yLAorCQkJCQkgICAgZWwzX2lzYXBucF9hZGFwdGVyc1tpXS5mdW5jdGlvbiwKKwkJCQkJICAgIGlkZXYpKSkgeworCQkJaWYgKHBucF9kZXZpY2VfYXR0YWNoKGlkZXYpIDwgMCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChwbnBfYWN0aXZhdGVfZGV2KGlkZXYpIDwgMCkgeworX19hZ2FpbjoKKwkJCQlwbnBfZGV2aWNlX2RldGFjaChpZGV2KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcG5wX3BvcnRfdmFsaWQoaWRldiwgMCkgfHwgIXBucF9pcnFfdmFsaWQoaWRldiwgMCkpCisJCQkJZ290byBfX2FnYWluOworCQkJaW9hZGRyID0gcG5wX3BvcnRfc3RhcnQoaWRldiwgMCk7CisJCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgRUwzX0lPX0VYVEVOVCwgIjNjNTA5IFBuUCIpKSB7CisJCQkJcG5wX2RldmljZV9kZXRhY2goaWRldik7CisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJCWlycSA9IHBucF9pcnEoaWRldiwgMCk7CisJCQlpZiAoZWwzX2RlYnVnID4gMykKKwkJCQlwcmludGsgKCJJU0FQblAgcmVwb3J0cyAlcyBhdCBpL28gMHgleCwgaXJxICVkXG4iLAorCQkJCQkoY2hhciopIGVsM19pc2FwbnBfYWRhcHRlcnNbaV0uZHJpdmVyX2RhdGEsIGlvYWRkciwgaXJxKTsKKwkJCUVMM1dJTkRPVygwKTsKKwkJCWZvciAoaiA9IDA7IGogPCAzOyBqKyspCisJCQkJZWwzX2lzYXBucF9waHlzX2FkZHJbcG5wX2NhcmRzXVtqXSA9CisJCQkJCXBoeXNfYWRkcltqXSA9CisJCQkJCQlodG9ucyhyZWFkX2VlcHJvbShpb2FkZHIsIGopKTsKKwkJCWlmX3BvcnQgPSByZWFkX2VlcHJvbShpb2FkZHIsIDgpID4+IDE0OworCQkJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mIChzdHJ1Y3QgZWwzX3ByaXZhdGUpKTsKKwkJCWlmICghZGV2KSB7CisJCQkJCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgRUwzX0lPX0VYVEVOVCk7CisJCQkJCXBucF9kZXZpY2VfZGV0YWNoKGlkZXYpOworCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKworCQkJU0VUX01PRFVMRV9PV05FUihkZXYpOworCQkJU0VUX05FVERFVl9ERVYoZGV2LCAmaWRldi0+ZGV2KTsKKwkJCXBucF9jYXJkcysrOworCisJCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KK25vX3BucDoKKyNlbmRpZiAvKiBfX0lTQVBOUF9fICovCisKKwkvKiBTZWxlY3QgYW4gb3BlbiBJL08gbG9jYXRpb24gYXQgMHgxKjAgdG8gZG8gY29udGVudGlvbiBzZWxlY3QuICovCisJZm9yICggOyBpZF9wb3J0IDwgMHgyMDA7IGlkX3BvcnQgKz0gMHgxMCkgeworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGlkX3BvcnQsIDEsICIzYzUwOSIpKQorCQkJY29udGludWU7CisJCW91dGIoMHgwMCwgaWRfcG9ydCk7CisJCW91dGIoMHhmZiwgaWRfcG9ydCk7CisJCWlmIChpbmIoaWRfcG9ydCkgJiAweDAxKXsKKwkJCXJlbGVhc2VfcmVnaW9uKGlkX3BvcnQsIDEpOworCQkJYnJlYWs7CisJCX0gZWxzZQorCQkJcmVsZWFzZV9yZWdpb24oaWRfcG9ydCwgMSk7CisJfQorCWlmIChpZF9wb3J0ID49IDB4MjAwKSB7CisJCS8qIFJhcmUgLS0gZG8gd2UgcmVhbGx5IG5lZWQgYSB3YXJuaW5nPyAqLworCQlwcmludGsoIiBXQVJOSU5HOiBObyBJL08gcG9ydCBhdmFpbGFibGUgZm9yIDNjNTA5IGFjdGl2YXRpb24uXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogTmV4dCBjaGVjayBmb3IgYWxsIElTQSBidXMgYm9hcmRzIGJ5IHNlbmRpbmcgdGhlIElEIHNlcXVlbmNlIHRvIHRoZQorCSAgIElEX1BPUlQuICBXZSBmaW5kIGNhcmRzIHBhc3QgdGhlIGZpcnN0IGJ5IHNldHRpbmcgdGhlICdjdXJyZW50X3RhZycKKwkgICBvbiBjYXJkcyBhcyB0aGV5IGFyZSBmb3VuZC4gIENhcmRzIHdpdGggdGhlaXIgdGFnIHNldCB3aWxsIG5vdAorCSAgIHJlc3BvbmQgdG8gc3Vic2VxdWVudCBJRCBzZXF1ZW5jZXMuICovCisKKwlvdXRiKDB4MDAsIGlkX3BvcnQpOworCW91dGIoMHgwMCwgaWRfcG9ydCk7CisJZm9yKGkgPSAwOyBpIDwgMjU1OyBpKyspIHsKKwkJb3V0YihscnNfc3RhdGUsIGlkX3BvcnQpOworCQlscnNfc3RhdGUgPDw9IDE7CisJCWxyc19zdGF0ZSA9IGxyc19zdGF0ZSAmIDB4MTAwID8gbHJzX3N0YXRlIF4gMHhjZiA6IGxyc19zdGF0ZTsKKwl9CisKKwkvKiBGb3IgdGhlIGZpcnN0IHByb2JlLCBjbGVhciBhbGwgYm9hcmQncyB0YWcgcmVnaXN0ZXJzLiAqLworCWlmIChjdXJyZW50X3RhZyA9PSAwKQorCQlvdXRiKDB4ZDAsIGlkX3BvcnQpOworCWVsc2UJCQkJLyogT3RoZXJ3aXNlIGtpbGwgb2ZmIGFscmVhZHktZm91bmQgYm9hcmRzLiAqLworCQlvdXRiKDB4ZDgsIGlkX3BvcnQpOworCisJaWYgKGlkX3JlYWRfZWVwcm9tKDcpICE9IDB4NmQ1MCkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBSZWFkIGluIEVFUFJPTSBkYXRhLCB3aGljaCBkb2VzIGNvbnRlbnRpb24tc2VsZWN0LgorCSAgIE9ubHkgdGhlIGxvd2VzdCBhZGRyZXNzIGJvYXJkIHdpbGwgc3RheSAib24tbGluZSIuCisJICAgM0NvbSBnb3QgdGhlIGJ5dGUgb3JkZXIgYmFja3dhcmRzLiAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJcGh5c19hZGRyW2ldID0gaHRvbnMoaWRfcmVhZF9lZXByb20oaSkpOworCX0KKworI2lmIGRlZmluZWQoX19JU0FQTlBfXykKKwlpZiAobm9wbnAgPT0gMCkgeworCQkvKiBUaGUgSVNBIFBuUCAzYzUwOSBjYXJkcyByZXNwb25kIHRvIHRoZSBJRCBzZXF1ZW5jZS4KKwkJICAgVGhpcyBjaGVjayBpcyBuZWVkZWQgaW4gb3JkZXIgbm90IHRvIHJlZ2lzdGVyIHRoZW0gdHdpY2UuICovCisJCWZvciAoaSA9IDA7IGkgPCBwbnBfY2FyZHM7IGkrKykgeworCQkJaWYgKHBoeXNfYWRkclswXSA9PSBlbDNfaXNhcG5wX3BoeXNfYWRkcltpXVswXSAmJgorCQkJICAgIHBoeXNfYWRkclsxXSA9PSBlbDNfaXNhcG5wX3BoeXNfYWRkcltpXVsxXSAmJgorCQkJICAgIHBoeXNfYWRkclsyXSA9PSBlbDNfaXNhcG5wX3BoeXNfYWRkcltpXVsyXSkKKwkJCXsKKwkJCQlpZiAoZWwzX2RlYnVnID4gMykKKwkJCQkJcHJpbnRrKCIzYzUwOSB3aXRoIGFkZHJlc3MgJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggd2FzIGZvdW5kIGJ5IElTQVBuUFxuIiwKKwkJCQkJCXBoeXNfYWRkclswXSAmIDB4ZmYsIHBoeXNfYWRkclswXSA+PiA4LAorCQkJCQkJcGh5c19hZGRyWzFdICYgMHhmZiwgcGh5c19hZGRyWzFdID4+IDgsCisJCQkJCQlwaHlzX2FkZHJbMl0gJiAweGZmLCBwaHlzX2FkZHJbMl0gPj4gOCk7CisJCQkJLyogU2V0IHRoZSBhZGFwdG9yIHRhZyBzbyB0aGF0IHRoZSBuZXh0IGNhcmQgY2FuIGJlIGZvdW5kLiAqLworCQkJCW91dGIoMHhkMCArICsrY3VycmVudF90YWcsIGlkX3BvcnQpOworCQkJCWdvdG8gbm9fcG5wOworCQkJfQorCQl9CisJfQorI2VuZGlmIC8qIF9fSVNBUE5QX18gKi8KKworCXsKKwkJdW5zaWduZWQgaW50IGlvYmFzZSA9IGlkX3JlYWRfZWVwcm9tKDgpOworCQlpZl9wb3J0ID0gaW9iYXNlID4+IDE0OworCQlpb2FkZHIgPSAweDIwMCArICgoaW9iYXNlICYgMHgxZikgPDwgNCk7CisJfQorCWlycSA9IGlkX3JlYWRfZWVwcm9tKDkpID4+IDEyOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mIChzdHJ1Y3QgZWwzX3ByaXZhdGUpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCQorCS8qIFNldCBwYXNzZWQtaW4gSVJRIG9yIEkvTyBBZGRyLiAqLworCWlmIChkZXYtPmlycSA+IDEgICYmICBkZXYtPmlycSA8IDE2KQorCQkJaXJxID0gZGV2LT5pcnE7CisKKwlpZiAoZGV2LT5iYXNlX2FkZHIpIHsKKwkJaWYgKGRldi0+bWVtX2VuZCA9PSAweDNjNTA5IAkvKiBNYWdpYyBrZXkgKi8KKwkJICAgICYmIGRldi0+YmFzZV9hZGRyID49IDB4MjAwICAmJiAgZGV2LT5iYXNlX2FkZHIgPD0gMHgzZTApCisJCQlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciAmIDB4M2YwOworCQllbHNlIGlmIChkZXYtPmJhc2VfYWRkciAhPSBpb2FkZHIpCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgRUwzX0lPX0VYVEVOVCwgIjNjNTA5IikpIHsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTZXQgdGhlIGFkYXB0b3IgdGFnIHNvIHRoYXQgdGhlIG5leHQgY2FyZCBjYW4gYmUgZm91bmQuICovCisJb3V0YigweGQwICsgKytjdXJyZW50X3RhZywgaWRfcG9ydCk7CisKKwkvKiBBY3RpdmF0ZSB0aGUgYWRhcHRvciBhdCB0aGUgRUVQUk9NIGxvY2F0aW9uLiAqLworCW91dGIoKGlvYWRkciA+PiA0KSB8IDB4ZTAsIGlkX3BvcnQpOworCisJRUwzV0lORE9XKDApOworCWlmIChpbncoaW9hZGRyKSAhPSAweDZkNTApCisJCWdvdG8gb3V0MTsKKworCS8qIEZyZWUgdGhlIGludGVycnVwdCBzbyB0aGF0IHNvbWUgb3RoZXIgY2FyZCBjYW4gdXNlIGl0LiAqLworCW91dHcoMHgwZjAwLCBpb2FkZHIgKyBXTjBfSVJRKTsKKworI2lmIGRlZmluZWQoX19JU0FQTlBfXykKKyBmb3VuZDoJCQkJCQkJLyogUE5QIGp1bXBzIGhlcmUuLi4gKi8KKyNlbmRpZiAvKiBfX0lTQVBOUF9fICovCisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgcGh5c19hZGRyLCBzaXplb2YocGh5c19hZGRyKSk7CisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJZGV2LT5pcnEgPSBpcnE7CisJZGV2LT5pZl9wb3J0ID0gaWZfcG9ydDsKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisjaWYgZGVmaW5lZChfX0lTQVBOUF9fKQorCWxwLT5kZXYgPSAmaWRldi0+ZGV2OworI2VuZGlmCisJZXJyID0gZWwzX2NvbW1vbl9pbml0KGRldik7CisKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisKKyNpZmRlZiBDT05GSUdfUE0KKwkvKiByZWdpc3RlciBwb3dlciBtYW5hZ2VtZW50ICovCisJbHAtPnBtZGV2ID0gcG1fcmVnaXN0ZXIoUE1fSVNBX0RFViwgY2FyZF9pZHgsIGVsM19wbV9jYWxsYmFjayk7CisJaWYgKGxwLT5wbWRldikgeworCQlzdHJ1Y3QgcG1fZGV2ICpwOworCQlwID0gbHAtPnBtZGV2OworCQlwLT5kYXRhID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2OworCX0KKyNlbmRpZgorCisJZWwzX2NhcmRzKys7CisJbHAtPm5leHRfZGV2ID0gZWwzX3Jvb3RfZGV2OworCWVsM19yb290X2RldiA9IGRldjsKKwlyZXR1cm4gMDsKKworb3V0MToKKyNpZiBkZWZpbmVkKF9fSVNBUE5QX18pCisJaWYgKGlkZXYpCisJCXBucF9kZXZpY2VfZGV0YWNoKGlkZXYpOworI2VuZGlmCitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCisjaWZkZWYgQ09ORklHX01DQQorc3RhdGljIGludCBfX2luaXQgZWwzX21jYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJLyogQmFzZWQgb24gRXJpayBOeWdyZW4ncyAobnlncmVuQG1pdC5lZHUpIDNjNTI5IHBhdGNoLAorCSAqIGhlYXZpbHkgbW9kaWZpZWQgYnkgQ2hyaXMgQmVhdXJlZ2FyZAorCSAqIChjcGJlYXVyZUBjc2NsdWIudXdhdGVybG9vLmNhKSB0byBzdXBwb3J0IHN0YW5kYXJkIE1DQQorCSAqIHByb2JpbmcuCisJICoKKwkgKiByZWRvbmUgZm9yIG11bHRpLWNhcmQgZGV0ZWN0aW9uIGJ5IFpQIEd1ICh6cGdAY2FzdGxlLm5ldCkKKwkgKiBub3cgd29ya3MgYXMgYSBtb2R1bGUgKi8KKworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHA7CisJc2hvcnQgaTsKKwlpbnQgaW9hZGRyLCBpcnEsIGlmX3BvcnQ7CisJdTE2IHBoeXNfYWRkclszXTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwl1X2NoYXIgcG9zNCwgcG9zNTsKKwlzdHJ1Y3QgbWNhX2RldmljZSAqbWRldiA9IHRvX21jYV9kZXZpY2UoZGV2aWNlKTsKKwlpbnQgc2xvdCA9IG1kZXYtPnNsb3Q7CisJaW50IGVycjsKKworCXBvczQgPSBtY2FfZGV2aWNlX3JlYWRfc3RvcmVkX3BvcyhtZGV2LCA0KTsKKwlwb3M1ID0gbWNhX2RldmljZV9yZWFkX3N0b3JlZF9wb3MobWRldiwgNSk7CisKKwlpb2FkZHIgPSAoKHNob3J0KSgocG9zNCYweGZjKXwweDAyKSkgPDwgODsKKwlpcnEgPSBwb3M1ICYgMHgwZjsKKworCisJcHJpbnRrKCIzYzUyOTogZm91bmQgJXMgYXQgc2xvdCAlZFxuIiwKKwkJICAgZWwzX21jYV9hZGFwdGVyX25hbWVzW21kZXYtPmluZGV4XSwgc2xvdCArIDEpOworCisJLyogY2xhaW0gdGhlIHNsb3QgKi8KKwlzdHJuY3B5KG1kZXYtPm5hbWUsIGVsM19tY2FfYWRhcHRlcl9uYW1lc1ttZGV2LT5pbmRleF0sCisJCQlzaXplb2YobWRldi0+bmFtZSkpOworCW1jYV9kZXZpY2Vfc2V0X2NsYWltKG1kZXYsIDEpOworCisJaWZfcG9ydCA9IHBvczQgJiAweDAzOworCisJaXJxID0gbWNhX2RldmljZV90cmFuc2Zvcm1faXJxKG1kZXYsIGlycSk7CisJaW9hZGRyID0gbWNhX2RldmljZV90cmFuc2Zvcm1faW9wb3J0KG1kZXYsIGlvYWRkcik7IAorCWlmIChlbDNfZGVidWcgPiAyKSB7CisJCQlwcmludGsoIjNjNTI5OiBpcnEgJWQgIGlvYWRkciAweCV4ICBpZnBvcnQgJWRcbiIsIGlycSwgaW9hZGRyLCBpZl9wb3J0KTsKKwl9CisJRUwzV0lORE9XKDApOworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCXBoeXNfYWRkcltpXSA9IGh0b25zKHJlYWRfZWVwcm9tKGlvYWRkciwgaSkpOworCX0KKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZiAoc3RydWN0IGVsM19wcml2YXRlKSk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEVMM19JT19FWFRFTlQpOworCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgcGh5c19hZGRyLCBzaXplb2YocGh5c19hZGRyKSk7CisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJZGV2LT5pcnEgPSBpcnE7CisJZGV2LT5pZl9wb3J0ID0gaWZfcG9ydDsKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisJbHAtPmRldiA9IGRldmljZTsKKwlscC0+dHlwZSA9IEVMM19NQ0E7CisJZGV2aWNlLT5kcml2ZXJfZGF0YSA9IGRldjsKKwllcnIgPSBlbDNfY29tbW9uX2luaXQoZGV2KTsKKworCWlmIChlcnIpIHsKKwkJZGV2aWNlLT5kcml2ZXJfZGF0YSA9IE5VTEw7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWVsM19jYXJkcysrOworCXJldHVybiAwOworfQorCQkKKyNlbmRpZiAvKiBDT05GSUdfTUNBICovCisKKyNpZmRlZiBDT05GSUdfRUlTQQorc3RhdGljIGludCBfX2luaXQgZWwzX2Vpc2FfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwOworCXNob3J0IGk7CisJaW50IGlvYWRkciwgaXJxLCBpZl9wb3J0OworCXUxNiBwaHlzX2FkZHJbM107CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IGVpc2FfZGV2aWNlICplZGV2OworCWludCBlcnI7CisKKwkvKiBZZWVwZWUsIFRoZSBkcml2ZXIgZnJhbWV3b3JrIGlzIGNhbGxpbmcgdXMgISAqLworCWVkZXYgPSB0b19laXNhX2RldmljZSAoZGV2aWNlKTsKKwlpb2FkZHIgPSBlZGV2LT5iYXNlX2FkZHI7CisJCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIEVMM19JT19FWFRFTlQsICIzYzUwOSIpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogQ2hhbmdlIHRoZSByZWdpc3RlciBzZXQgdG8gdGhlIGNvbmZpZ3VyYXRpb24gd2luZG93IDAuICovCisJb3V0dyhTZWxlY3RXaW5kb3cgfCAwLCBpb2FkZHIgKyAweEM4MCArIEVMM19DTUQpOworCisJaXJxID0gaW53KGlvYWRkciArIFdOMF9JUlEpID4+IDEyOworCWlmX3BvcnQgPSBpbncoaW9hZGRyICsgNik+PjE0OworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCXBoeXNfYWRkcltpXSA9IGh0b25zKHJlYWRfZWVwcm9tKGlvYWRkciwgaSkpOworCisJLyogUmVzdG9yZSB0aGUgIlByb2R1Y3QgSUQiIHRvIHRoZSBFRVBST00gcmVhZCByZWdpc3Rlci4gKi8KKwlyZWFkX2VlcHJvbShpb2FkZHIsIDMpOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mIChzdHJ1Y3QgZWwzX3ByaXZhdGUpKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBFTDNfSU9fRVhURU5UKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKworCW1lbWNweShkZXYtPmRldl9hZGRyLCBwaHlzX2FkZHIsIHNpemVvZihwaHlzX2FkZHIpKTsKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwlkZXYtPmlycSA9IGlycTsKKwlkZXYtPmlmX3BvcnQgPSBpZl9wb3J0OworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlscC0+ZGV2ID0gZGV2aWNlOworCWxwLT50eXBlID0gRUwzX0VJU0E7CisJZWlzYV9zZXRfZHJ2ZGF0YSAoZWRldiwgZGV2KTsKKwllcnIgPSBlbDNfY29tbW9uX2luaXQoZGV2KTsKKworCWlmIChlcnIpIHsKKwkJZWlzYV9zZXRfZHJ2ZGF0YSAoZWRldiwgTlVMTCk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBlcnI7CisJfQorCisJZWwzX2NhcmRzKys7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0VJU0EpIHx8IGRlZmluZWQoQ09ORklHX01DQSkKKy8qIFRoaXMgcmVtb3ZlIHdvcmtzIGZvciBhbGwgZGV2aWNlIHR5cGVzLgorICoKKyAqIFRoZSBuZXQgZGV2IG11c3QgYmUgc3RvcmVkIGluIHRoZSBkcml2ZXJfZGF0YSBmaWVsZCAqLworc3RhdGljIGludCBfX2RldmV4aXQgZWwzX2RldmljZV9yZW1vdmUgKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJZGV2ICA9IGRldmljZS0+ZHJpdmVyX2RhdGE7CisKKwllbDNfY29tbW9uX3JlbW92ZSAoZGV2KTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBSZWFkIGEgd29yZCBmcm9tIHRoZSBFRVBST00gdXNpbmcgdGhlIHJlZ3VsYXIgRUVQUk9NIGFjY2VzcyByZWdpc3Rlci4KKyAgIEFzc3VtZSB0aGF0IHdlIGFyZSBpbiByZWdpc3RlciB3aW5kb3cgemVyby4KKyAqLworc3RhdGljIHVzaG9ydCByZWFkX2VlcHJvbShpbnQgaW9hZGRyLCBpbnQgaW5kZXgpCit7CisJb3V0dyhFRVBST01fUkVBRCArIGluZGV4LCBpb2FkZHIgKyAxMCk7CisJLyogUGF1c2UgZm9yIGF0IGxlYXN0IDE2MiB1cy4gZm9yIHRoZSByZWFkIHRvIHRha2UgcGxhY2UuIAorCSAgIFNvbWUgY2hpcHMgc2VlbSB0byByZXF1aXJlIG11Y2ggbG9uZ2VyICovCisJbWRlbGF5KDIpOworCXJldHVybiBpbncoaW9hZGRyICsgMTIpOworfQorCisvKiBSZWFkIGEgd29yZCBmcm9tIHRoZSBFRVBST00gd2hlbiBpbiB0aGUgSVNBIElEIHByb2JlIHN0YXRlLiAqLworc3RhdGljIHVzaG9ydCBfX2luaXQgaWRfcmVhZF9lZXByb20oaW50IGluZGV4KQoreworCWludCBiaXQsIHdvcmQgPSAwOworCisJLyogSXNzdWUgcmVhZCBjb21tYW5kLCBhbmQgcGF1c2UgZm9yIGF0IGxlYXN0IDE2MiB1cy4gZm9yIGl0IHRvIGNvbXBsZXRlLgorCSAgIEFzc3VtZSBleHRyYS1mYXN0IDE2TWh6IGJ1cy4gKi8KKwlvdXRiKEVFUFJPTV9SRUFEICsgaW5kZXgsIGlkX3BvcnQpOworCisJLyogUGF1c2UgZm9yIGF0IGxlYXN0IDE2MiB1cy4gZm9yIHRoZSByZWFkIHRvIHRha2UgcGxhY2UuICovCisJLyogU29tZSBjaGlwcyBzZWVtIHRvIHJlcXVpcmUgbXVjaCBsb25nZXIgKi8KKwltZGVsYXkoNCk7CisJCisJZm9yIChiaXQgPSAxNTsgYml0ID49IDA7IGJpdC0tKQorCQl3b3JkID0gKHdvcmQgPDwgMSkgKyAoaW5iKGlkX3BvcnQpICYgMHgwMSk7CisKKwlpZiAoZWwzX2RlYnVnID4gMykKKwkJcHJpbnRrKCIgIDNjNTA5IEVFUFJPTSB3b3JkICVkICUjNC40eC5cbiIsIGluZGV4LCB3b3JkKTsKKworCXJldHVybiB3b3JkOworfQorCisKK3N0YXRpYyBpbnQKK2VsM19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpOworCisJb3V0dyhUeFJlc2V0LCBpb2FkZHIgKyBFTDNfQ01EKTsKKwlvdXR3KFJ4UmVzZXQsIGlvYWRkciArIEVMM19DTUQpOworCW91dHcoU2V0U3RhdHVzRW5iIHwgMHgwMCwgaW9hZGRyICsgRUwzX0NNRCk7CisKKwlpID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZlbDNfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKGkpCisJCXJldHVybiBpOworCisJRUwzV0lORE9XKDApOworCWlmIChlbDNfZGVidWcgPiAzKQorCQlwcmludGsoIiVzOiBPcGVuaW5nLCBJUlEgJWQJIHN0YXR1c0AleCAlNC40eC5cbiIsIGRldi0+bmFtZSwKKwkJCSAgIGRldi0+aXJxLCBpb2FkZHIgKyBFTDNfU1RBVFVTLCBpbncoaW9hZGRyICsgRUwzX1NUQVRVUykpOworCisJZWwzX3VwKGRldik7CisKKwlpZiAoZWwzX2RlYnVnID4gMykKKwkJcHJpbnRrKCIlczogT3BlbmVkIDNjNTA5ICBJUlEgJWQgIHN0YXR1cyAlNC40eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGRldi0+aXJxLCBpbncoaW9hZGRyICsgRUwzX1NUQVRVUykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitlbDNfdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwkvKiBUcmFuc21pdHRlciB0aW1lb3V0LCBzZXJpb3VzIHByb2JsZW1zLiAqLworCXByaW50aygiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgVHhfc3RhdHVzICUyLjJ4IHN0YXR1cyAlNC40eCAiCisJCSAgICJUeCBGSUZPIHJvb20gJWQuXG4iLAorCQkgICBkZXYtPm5hbWUsIGluYihpb2FkZHIgKyBUWF9TVEFUVVMpLCBpbncoaW9hZGRyICsgRUwzX1NUQVRVUyksCisJCSAgIGludyhpb2FkZHIgKyBUWF9GUkVFKSk7CisJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCS8qIElzc3VlIFRYX1JFU0VUIGFuZCBUWF9TVEFSVCBjb21tYW5kcy4gKi8KKwlvdXR3KFR4UmVzZXQsIGlvYWRkciArIEVMM19DTUQpOworCW91dHcoVHhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworCitzdGF0aWMgaW50CitlbDNfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworCWxwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkKKwlpZiAoZWwzX2RlYnVnID4gNCkgeworCQlwcmludGsoIiVzOiBlbDNfc3RhcnRfeG1pdChsZW5ndGggPSAldSkgY2FsbGVkLCBzdGF0dXMgJTQuNHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBza2ItPmxlbiwgaW53KGlvYWRkciArIEVMM19TVEFUVVMpKTsKKwl9CisjaWYgMAorI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJewkvKiBFcnJvci1jaGVja2luZyBjb2RlLCBkZWxldGUgc29tZWRheS4gKi8KKwkJdXNob3J0IHN0YXR1cyA9IGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKTsKKwkJaWYgKHN0YXR1cyAmIDB4MDAwMSAJCS8qIElSUSBsaW5lIGFjdGl2ZSwgbWlzc2VkIG9uZS4gKi8KKwkJCSYmIGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSAmIDEpIHsgCQkJLyogTWFrZSBzdXJlLiAqLworCQkJcHJpbnRrKCIlczogTWlzc2VkIGludGVycnVwdCwgc3RhdHVzIHRoZW4gJTA0eCBub3cgJTA0eCIKKwkJCQkgICAiICBUeCAlMi4yeCBSeCAlNC40eC5cbiIsIGRldi0+bmFtZSwgc3RhdHVzLAorCQkJCSAgIGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSwgaW5iKGlvYWRkciArIFRYX1NUQVRVUyksCisJCQkJICAgaW53KGlvYWRkciArIFJYX1NUQVRVUykpOworCQkJLyogRmFrZSBpbnRlcnJ1cHQgdHJpZ2dlciBieSBtYXNraW5nLCBhY2tub3dsZWRnZSBpbnRlcnJ1cHRzLiAqLworCQkJb3V0dyhTZXRTdGF0dXNFbmIgfCAweDAwLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCW91dHcoQWNrSW50ciB8IEludExhdGNoIHwgVHhBdmFpbGFibGUgfCBSeEVhcmx5IHwgSW50UmVxLAorCQkJCSBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCW91dHcoU2V0U3RhdHVzRW5iIHwgMHhmZiwgaW9hZGRyICsgRUwzX0NNRCk7CisJCX0KKwl9CisjZW5kaWYKKyNlbmRpZgorCS8qCisJICoJV2UgbG9jayB0aGUgZHJpdmVyIGFnYWluc3Qgb3RoZXIgcHJvY2Vzc29ycy4gTm90ZQorCSAqCXdlIGRvbid0IG5lZWQgdG8gbG9jayB2ZXJzdXMgdGhlIElSUSBhcyB3ZSBzdXNwZW5kZWQKKwkgKgl0aGF0LiBUaGlzIG1lYW5zIHRoYXQgd2UgbG9zZSB0aGUgYWJpbGl0eSB0byB0YWtlCisJICoJYW4gUlggZHVyaW5nIGEgVFggdXBsb2FkLiBUaGF0IHN1Y2tzIGEgYml0IHdpdGggU01QCisJICoJb24gYW4gb3JpZ2luYWwgM2M1MDkgKDJLIGJ1ZmZlcikKKwkgKgorCSAqCVVzaW5nIGRpc2FibGVfaXJxIHN0b3BzIHVzIGNyYXBwaW5nIG9uIG90aGVyCisJICoJdGltZSBzZW5zaXRpdmUgZGV2aWNlcy4KKwkgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJLyogUHV0IG91dCB0aGUgZG91Ymxld29yZCBoZWFkZXIuLi4gKi8KKwlvdXR3KHNrYi0+bGVuLCBpb2FkZHIgKyBUWF9GSUZPKTsKKwlvdXR3KDB4MDAsIGlvYWRkciArIFRYX0ZJRk8pOworCS8qIC4uLiBhbmQgdGhlIHBhY2tldCByb3VuZGVkIHRvIGEgZG91Ymxld29yZC4gKi8KKyNpZmRlZiAgX19wb3dlcnBjX18KKwlvdXRzbF9ucyhpb2FkZHIgKyBUWF9GSUZPLCBza2ItPmRhdGEsIChza2ItPmxlbiArIDMpID4+IDIpOworI2Vsc2UKKwlvdXRzbChpb2FkZHIgKyBUWF9GSUZPLCBza2ItPmRhdGEsIChza2ItPmxlbiArIDMpID4+IDIpOworI2VuZGlmCisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlpZiAoaW53KGlvYWRkciArIFRYX0ZSRUUpID4gMTUzNikKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwllbHNlCisJCS8qIEludGVycnVwdCB1cyB3aGVuIHRoZSBGSUZPIGhhcyByb29tIGZvciBtYXgtc2l6ZWQgcGFja2V0LiAqLworCQlvdXR3KFNldFR4VGhyZXNob2xkICsgMTUzNiwgaW9hZGRyICsgRUwzX0NNRCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKworCS8qIENsZWFyIHRoZSBUeCBzdGF0dXMgc3RhY2suICovCisJeworCQlzaG9ydCB0eF9zdGF0dXM7CisJCWludCBpID0gNDsKKworCQl3aGlsZSAoLS1pID4gMAkmJgkodHhfc3RhdHVzID0gaW5iKGlvYWRkciArIFRYX1NUQVRVUykpID4gMCkgeworCQkJaWYgKHR4X3N0YXR1cyAmIDB4MzgpIGxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJaWYgKHR4X3N0YXR1cyAmIDB4MzApIG91dHcoVHhSZXNldCwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQlpZiAodHhfc3RhdHVzICYgMHgzQykgb3V0dyhUeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQlvdXRiKDB4MDAsIGlvYWRkciArIFRYX1NUQVRVUyk7IC8qIFBvcCB0aGUgc3RhdHVzIHN0YWNrLiAqLworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBUaGUgRUwzIGludGVycnVwdCBoYW5kbGVyLiAqLworc3RhdGljIGlycXJldHVybl90CitlbDNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwOworCWludCBpb2FkZHIsIHN0YXR1czsKKwlpbnQgaSA9IG1heF9pbnRlcnJ1cHRfd29yazsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsgKCJlbDNfaW50ZXJydXB0KCk6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNwaW5fbG9jaygmbHAtPmxvY2spOworCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoZWwzX2RlYnVnID4gNCkgeworCQlzdGF0dXMgPSBpbncoaW9hZGRyICsgRUwzX1NUQVRVUyk7CisJCXByaW50aygiJXM6IGludGVycnVwdCwgc3RhdHVzICU0LjR4LlxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpOworCX0KKworCXdoaWxlICgoc3RhdHVzID0gaW53KGlvYWRkciArIEVMM19TVEFUVVMpKSAmCisJCSAgIChJbnRMYXRjaCB8IFJ4Q29tcGxldGUgfCBTdGF0c0Z1bGwpKSB7CisKKwkJaWYgKHN0YXR1cyAmIFJ4Q29tcGxldGUpCisJCQllbDNfcngoZGV2KTsKKworCQlpZiAoc3RhdHVzICYgVHhBdmFpbGFibGUpIHsKKwkJCWlmIChlbDNfZGVidWcgPiA1KQorCQkJCXByaW50aygiCVRYIHJvb20gYml0IHdhcyBoYW5kbGVkLlxuIik7CisJCQkvKiBUaGVyZSdzIHJvb20gaW4gdGhlIEZJRk8gZm9yIGEgZnVsbC1zaXplZCBwYWNrZXQuICovCisJCQlvdXR3KEFja0ludHIgfCBUeEF2YWlsYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCQl9CisJCWlmIChzdGF0dXMgJiAoQWRhcHRlckZhaWx1cmUgfCBSeEVhcmx5IHwgU3RhdHNGdWxsIHwgVHhDb21wbGV0ZSkpIHsKKwkJCS8qIEhhbmRsZSBhbGwgdW5jb21tb24gaW50ZXJydXB0cy4gKi8KKwkJCWlmIChzdGF0dXMgJiBTdGF0c0Z1bGwpCQkJCS8qIEVtcHR5IHN0YXRpc3RpY3MuICovCisJCQkJdXBkYXRlX3N0YXRzKGRldik7CisJCQlpZiAoc3RhdHVzICYgUnhFYXJseSkgewkJCQkvKiBSeCBlYXJseSBpcyB1bnVzZWQuICovCisJCQkJZWwzX3J4KGRldik7CisJCQkJb3V0dyhBY2tJbnRyIHwgUnhFYXJseSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQl9CisJCQlpZiAoc3RhdHVzICYgVHhDb21wbGV0ZSkgewkJCS8qIFJlYWxseSBUeCBlcnJvci4gKi8KKwkJCQlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJCQlzaG9ydCB0eF9zdGF0dXM7CisJCQkJaW50IGkgPSA0OworCisJCQkJd2hpbGUgKC0taT4wICYmICh0eF9zdGF0dXMgPSBpbmIoaW9hZGRyICsgVFhfU1RBVFVTKSkgPiAwKSB7CisJCQkJCWlmICh0eF9zdGF0dXMgJiAweDM4KSBscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQkJaWYgKHR4X3N0YXR1cyAmIDB4MzApIG91dHcoVHhSZXNldCwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQkJCWlmICh0eF9zdGF0dXMgJiAweDNDKSBvdXR3KFR4RW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCQkJb3V0YigweDAwLCBpb2FkZHIgKyBUWF9TVEFUVVMpOyAvKiBQb3AgdGhlIHN0YXR1cyBzdGFjay4gKi8KKwkJCQl9CisJCQl9CisJCQlpZiAoc3RhdHVzICYgQWRhcHRlckZhaWx1cmUpIHsKKwkJCQkvKiBBZGFwdGVyIGZhaWx1cmUgcmVxdWlyZXMgUnggcmVzZXQgYW5kIHJlaW5pdC4gKi8KKwkJCQlvdXR3KFJ4UmVzZXQsIGlvYWRkciArIEVMM19DTUQpOworCQkJCS8qIFNldCB0aGUgUnggZmlsdGVyIHRvIHRoZSBjdXJyZW50IHN0YXRlLiAqLworCQkJCW91dHcoU2V0UnhGaWx0ZXIgfCBSeFN0YXRpb24gfCBSeEJyb2FkY2FzdAorCQkJCQkgfCAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSA/IFJ4TXVsdGljYXN0IDogMCkKKwkJCQkJIHwgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyA/IFJ4UHJvbSA6IDApLAorCQkJCQkgaW9hZGRyICsgRUwzX0NNRCk7CisJCQkJb3V0dyhSeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7IC8qIFJlLWVuYWJsZSB0aGUgcmVjZWl2ZXIuICovCisJCQkJb3V0dyhBY2tJbnRyIHwgQWRhcHRlckZhaWx1cmUsIGlvYWRkciArIEVMM19DTUQpOworCQkJfQorCQl9CisKKwkJaWYgKC0taSA8IDApIHsKKwkJCXByaW50aygiJXM6IEluZmluaXRlIGxvb3AgaW4gaW50ZXJydXB0LCBzdGF0dXMgJTQuNHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCS8qIENsZWFyIGFsbCBpbnRlcnJ1cHRzLiAqLworCQkJb3V0dyhBY2tJbnRyIHwgMHhGRiwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQlicmVhazsKKwkJfQorCQkvKiBBY2tub3dsZWRnZSB0aGUgSVJRLiAqLworCQlvdXR3KEFja0ludHIgfCBJbnRSZXEgfCBJbnRMYXRjaCwgaW9hZGRyICsgRUwzX0NNRCk7IC8qIEFjayBJUlEgKi8KKwl9CisKKwlpZiAoZWwzX2RlYnVnID4gNCkgeworCQlwcmludGsoIiVzOiBleGl0aW5nIGludGVycnVwdCwgc3RhdHVzICU0LjR4LlxuIiwgZGV2LT5uYW1lLAorCQkJICAgaW53KGlvYWRkciArIEVMM19TVEFUVVMpKTsKKwl9CisJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisvKgorICogUG9sbGluZyByZWNlaXZlIC0gdXNlZCBieSBuZXRjb25zb2xlIGFuZCBvdGhlciBkaWFnbm9zdGljIHRvb2xzCisgKiB0byBhbGxvdyBuZXR3b3JrIGkvbyB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyB2b2lkIGVsM19wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJZWwzX2ludGVycnVwdChkZXYtPmlycSwgZGV2LCBOVUxMKTsKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgorZWwzX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqCVRoaXMgaXMgZmFzdCBlbm91Z2ggbm90IHRvIGJvdGhlciB3aXRoIGRpc2FibGUgSVJRCisJICoJc3R1ZmYuCisJICovCisJIAorCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCXVwZGF0ZV9zdGF0cyhkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qICBVcGRhdGUgc3RhdGlzdGljcy4gIFdlIGNoYW5nZSB0byByZWdpc3RlciB3aW5kb3cgNiwgc28gdGhpcyBzaG91bGQgYmUgcnVuCisJc2luZ2xlLXRocmVhZGVkIGlmIHRoZSBkZXZpY2UgaXMgYWN0aXZlLiBUaGlzIGlzIGV4cGVjdGVkIHRvIGJlIGEgcmFyZQorCW9wZXJhdGlvbiwgYW5kIGl0J3Mgc2ltcGxlciBmb3IgdGhlIHJlc3Qgb2YgdGhlIGRyaXZlciB0byBhc3N1bWUgdGhhdAorCXdpbmRvdyAxIGlzIGFsd2F5cyB2YWxpZCByYXRoZXIgdGhhbiB1c2UgYSBzcGVjaWFsIHdpbmRvdy1zdGF0ZSB2YXJpYWJsZS4KKwkqLworc3RhdGljIHZvaWQgdXBkYXRlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKGVsM19kZWJ1ZyA+IDUpCisJCXByaW50aygiICAgVXBkYXRpbmcgdGhlIHN0YXRpc3RpY3MuXG4iKTsKKwkvKiBUdXJuIG9mZiBzdGF0aXN0aWNzIHVwZGF0ZXMgd2hpbGUgcmVhZGluZy4gKi8KKwlvdXR3KFN0YXRzRGlzYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJLyogU3dpdGNoIHRvIHRoZSBzdGF0cyB3aW5kb3csIGFuZCByZWFkIGV2ZXJ5dGhpbmcuICovCisJRUwzV0lORE9XKDYpOworCWxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyAJKz0gaW5iKGlvYWRkciArIDApOworCWxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzCSs9IGluYihpb2FkZHIgKyAxKTsKKwkvKiBNdWx0aXBsZSBjb2xsaXNpb25zLiAqLwkgICBpbmIoaW9hZGRyICsgMik7CisJbHAtPnN0YXRzLmNvbGxpc2lvbnMJCSs9IGluYihpb2FkZHIgKyAzKTsKKwlscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycwkrPSBpbmIoaW9hZGRyICsgNCk7CisJbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzCSs9IGluYihpb2FkZHIgKyA1KTsKKwlscC0+c3RhdHMudHhfcGFja2V0cwkJKz0gaW5iKGlvYWRkciArIDYpOworCS8qIFJ4IHBhY2tldHMJKi8JCSAgIGluYihpb2FkZHIgKyA3KTsKKwkvKiBUeCBkZWZlcnJhbHMgKi8JCSAgIGluYihpb2FkZHIgKyA4KTsKKwlpbncoaW9hZGRyICsgMTApOwkvKiBUb3RhbCBSeCBhbmQgVHggb2N0ZXRzLiAqLworCWludyhpb2FkZHIgKyAxMik7CisKKwkvKiBCYWNrIHRvIHdpbmRvdyAxLCBhbmQgdHVybiBzdGF0aXN0aWNzIGJhY2sgb24uICovCisJRUwzV0lORE9XKDEpOworCW91dHcoU3RhdHNFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCXJldHVybjsKK30KKworc3RhdGljIGludAorZWwzX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXNob3J0IHJ4X3N0YXR1czsKKworCWlmIChlbDNfZGVidWcgPiA1KQorCQlwcmludGsoIiAgIEluIHJ4X3BhY2tldCgpLCBzdGF0dXMgJTQuNHgsIHJ4X3N0YXR1cyAlNC40eC5cbiIsCisJCQkgICBpbncoaW9hZGRyK0VMM19TVEFUVVMpLCBpbncoaW9hZGRyK1JYX1NUQVRVUykpOworCXdoaWxlICgocnhfc3RhdHVzID0gaW53KGlvYWRkciArIFJYX1NUQVRVUykpID4gMCkgeworCQlpZiAocnhfc3RhdHVzICYgMHg0MDAwKSB7IC8qIEVycm9yLCB1cGRhdGUgc3RhdHMuICovCisJCQlzaG9ydCBlcnJvciA9IHJ4X3N0YXR1cyAmIDB4MzgwMDsKKworCQkJb3V0dyhSeERpc2NhcmQsIGlvYWRkciArIEVMM19DTUQpOworCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJc3dpdGNoIChlcnJvcikgeworCQkJY2FzZSAweDAwMDA6CQlscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsgYnJlYWs7CisJCQljYXNlIDB4MDgwMDoJCWxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7IGJyZWFrOworCQkJY2FzZSAweDEwMDA6CQlscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7IGJyZWFrOworCQkJY2FzZSAweDE4MDA6CQlscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOyBicmVhazsKKwkJCWNhc2UgMHgyMDAwOgkJbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOyBicmVhazsKKwkJCWNhc2UgMHgyODAwOgkJbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsgYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzaG9ydCBwa3RfbGVuID0gcnhfc3RhdHVzICYgMHg3ZmY7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4rNSk7CisJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJCWlmIChlbDNfZGVidWcgPiA0KQorCQkJCXByaW50aygiUmVjZWl2aW5nIHBhY2tldCBzaXplICVkIHN0YXR1cyAlNC40eC5cbiIsCisJCQkJCSAgIHBrdF9sZW4sIHJ4X3N0YXR1cyk7CisJCQlpZiAoc2tiICE9IE5VTEwpIHsKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOyAgICAgLyogQWxpZ24gSVAgb24gMTYgYnl0ZSAqLworCisJCQkJLyogJ3NrYi0+ZGF0YScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4gKi8KKyNpZmRlZiAgX19wb3dlcnBjX18KKwkJCQlpbnNsX25zKGlvYWRkcitSWF9GSUZPLCBza2JfcHV0KHNrYixwa3RfbGVuKSwKKwkJCQkJCQkgICAocGt0X2xlbiArIDMpID4+IDIpOworI2Vsc2UKKwkJCQlpbnNsKGlvYWRkciArIFJYX0ZJRk8sIHNrYl9wdXQoc2tiLHBrdF9sZW4pLAorCQkJCQkgKHBrdF9sZW4gKyAzKSA+PiAyKTsKKyNlbmRpZgorCisJCQkJb3V0dyhSeERpc2NhcmQsIGlvYWRkciArIEVMM19DTUQpOyAvKiBQb3AgdG9wIFJ4IHBhY2tldC4gKi8KKwkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlvdXR3KFJ4RGlzY2FyZCwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJaWYgKGVsM19kZWJ1ZykKKwkJCQlwcmludGsoIiVzOiBDb3VsZG4ndCBhbGxvY2F0ZSBhIHNrX2J1ZmYgb2Ygc2l6ZSAlZC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCX0KKwkJaW53KGlvYWRkciArIEVMM19TVEFUVVMpOyAJCQkJLyogRGVsYXkuICovCisJCXdoaWxlIChpbncoaW9hZGRyICsgRUwzX1NUQVRVUykgJiAweDEwMDApCisJCQlwcmludGsoS0VSTl9ERUJVRyAiCVdhaXRpbmcgZm9yIDNjNTA5IHRvIGRpc2NhcmQgcGFja2V0LCBzdGF0dXMgJXguXG4iLAorCQkJCSAgIGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSApOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogICAgIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICovCitzdGF0aWMgdm9pZAorc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoZWwzX2RlYnVnID4gMSkgeworCQlzdGF0aWMgaW50IG9sZDsKKwkJaWYgKG9sZCAhPSBkZXYtPm1jX2NvdW50KSB7CisJCQlvbGQgPSBkZXYtPm1jX2NvdW50OworCQkJcHJpbnRrKCIlczogU2V0dGluZyBSeCBtb2RlIHRvICVkIGFkZHJlc3Nlcy5cbiIsIGRldi0+bmFtZSwgZGV2LT5tY19jb3VudCk7CisJCX0KKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJaWYgKGRldi0+ZmxhZ3MmSUZGX1BST01JU0MpIHsKKwkJb3V0dyhTZXRSeEZpbHRlciB8IFJ4U3RhdGlvbiB8IFJ4TXVsdGljYXN0IHwgUnhCcm9hZGNhc3QgfCBSeFByb20sCisJCQkgaW9hZGRyICsgRUwzX0NNRCk7CisJfQorCWVsc2UgaWYgKGRldi0+bWNfY291bnQgfHwgKGRldi0+ZmxhZ3MmSUZGX0FMTE1VTFRJKSkgeworCQlvdXR3KFNldFJ4RmlsdGVyIHwgUnhTdGF0aW9uIHwgUnhNdWx0aWNhc3QgfCBSeEJyb2FkY2FzdCwgaW9hZGRyICsgRUwzX0NNRCk7CisJfQorCWVsc2UKKwkJb3V0dyhTZXRSeEZpbHRlciB8IFJ4U3RhdGlvbiB8IFJ4QnJvYWRjYXN0LCBpb2FkZHIgKyBFTDNfQ01EKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50CitlbDNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJCisJaWYgKGVsM19kZWJ1ZyA+IDIpCisJCXByaW50aygiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKKworCWVsM19kb3duKGRldik7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkvKiBTd2l0Y2hpbmcgYmFjayB0byB3aW5kb3cgMCBkaXNhYmxlcyB0aGUgSVJRLiAqLworCUVMM1dJTkRPVygwKTsKKwlpZiAobHAtPnR5cGUgIT0gRUwzX0VJU0EpIHsKKwkJLyogQnV0IHdlIGV4cGxpY2l0bHkgemVybyB0aGUgSVJRIGxpbmUgc2VsZWN0IGFueXdheS4gRG9uJ3QgZG8KKwkJICogaXQgb24gRUlTQSBjYXJkcywgaXQgcHJldmVudHMgdGhlIG1vZHVsZSBmcm9tIGdldHRpbmcgYW4KKwkJICogSVJRIGFmdGVyIHVubG9hZCtyZWxvYWQuLi4gKi8KKwkJb3V0dygweDBmMDAsIGlvYWRkciArIFdOMF9JUlEpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IAorZWwzX2xpbmtfb2soc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdTE2IHRtcDsKKworCUVMM1dJTkRPVyg0KTsKKwl0bXAgPSBpbncoaW9hZGRyICsgV040X01FRElBKTsKKwlFTDNXSU5ET1coMSk7CisJcmV0dXJuIHRtcCAmICgxPDwxMSk7Cit9CisKK3N0YXRpYyBpbnQKK2VsM19uZXRkZXZfZ2V0X2VjbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXUxNiB0bXA7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCQorCUVMM1dJTkRPVygwKTsKKwkvKiBvYnRhaW4gY3VycmVudCB0cmFuc2NlaXZlciB2aWEgV040X01FRElBPyAqLwkKKwl0bXAgPSBpbncoaW9hZGRyICsgV04wX0FERFJfQ09ORik7CisJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCXN3aXRjaCAodG1wID4+IDE0KSB7CisJY2FzZSAwOgorCQllY21kLT5wb3J0ID0gUE9SVF9UUDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQllY21kLT5wb3J0ID0gUE9SVF9BVUk7CisJCWVjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9FWFRFUk5BTDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQllY21kLT5wb3J0ID0gUE9SVF9CTkM7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJZWNtZC0+c3VwcG9ydGVkID0gMDsKKwl0bXAgPSBpbncoaW9hZGRyICsgV04wX0NPTkZfQ1RSTCk7CisJaWYgKHRtcCAmICgxPDwxMykpCisJCWVjbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfQVVJOworCWlmICh0bXAgJiAoMTw8MTIpKQorCQllY21kLT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX0JOQzsKKwlpZiAodG1wICYgKDE8PDkpKSB7CisJCWVjbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfVFAgfCBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkJCQlTVVBQT1JURURfMTBiYXNlVF9GdWxsOwkvKiBobW0uLi4gKi8KKwkJRUwzV0lORE9XKDQpOworCQl0bXAgPSBpbncoaW9hZGRyICsgV040X05FVERJQUcpOworCQlpZiAodG1wICYgRkRfRU5BQkxFKQorCQkJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJfQorCisJZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDsKKwlFTDNXSU5ET1coMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2VsM19uZXRkZXZfc2V0X2VjbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXUxNiB0bXA7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKGVjbWQtPnNwZWVkICE9IFNQRUVEXzEwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoKGVjbWQtPmR1cGxleCAhPSBEVVBMRVhfSEFMRikgJiYgKGVjbWQtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgoZWNtZC0+dHJhbnNjZWl2ZXIgIT0gWENWUl9JTlRFUk5BTCkgJiYgKGVjbWQtPnRyYW5zY2VpdmVyICE9IFhDVlJfRVhURVJOQUwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGNoYW5nZSBYQ1ZSIHR5cGUgKi8KKwlFTDNXSU5ET1coMCk7CisJdG1wID0gaW53KGlvYWRkciArIFdOMF9BRERSX0NPTkYpOworCXN3aXRjaCAoZWNtZC0+cG9ydCkgeworCWNhc2UgUE9SVF9UUDoKKwkJdG1wICY9IH4oMzw8MTQpOworCQlkZXYtPmlmX3BvcnQgPSAwOworCQlicmVhazsKKwljYXNlIFBPUlRfQVVJOgorCQl0bXAgfD0gKDE8PDE0KTsKKwkJZGV2LT5pZl9wb3J0ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBQT1JUX0JOQzoKKwkJdG1wIHw9ICgzPDwxNCk7CisJCWRldi0+aWZfcG9ydCA9IDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW91dHcodG1wLCBpb2FkZHIgKyBXTjBfQUREUl9DT05GKTsKKwlpZiAoZGV2LT5pZl9wb3J0ID09IDMpIHsKKwkJLyogZmlyZSB1cCB0aGUgREMtREMgY29udmVydG9yIGlmIEJOQyBnZXRzIGVuYWJsZWQgKi8KKwkJdG1wID0gaW53KGlvYWRkciArIFdOMF9BRERSX0NPTkYpOworCQlpZiAodG1wICYgKDMgPDwgMTQpKSB7CisJCQlvdXR3KFN0YXJ0Q29heCwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQl1ZGVsYXkoODAwKTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlFTDNXSU5ET1coNCk7CisJdG1wID0gaW53KGlvYWRkciArIFdONF9ORVRESUFHKTsKKwlpZiAoZWNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQl0bXAgfD0gRkRfRU5BQkxFOworCWVsc2UKKwkJdG1wICY9IH5GRF9FTkFCTEU7CisJb3V0dyh0bXAsIGlvYWRkciArIFdONF9ORVRESUFHKTsKKwlFTDNXSU5ET1coMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZWwzX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7Cit9CisKK3N0YXRpYyBpbnQgZWwzX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsKKwlyZXQgPSBlbDNfbmV0ZGV2X2dldF9lY21kKGRldiwgZWNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlbDNfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCXJldCA9IGVsM19uZXRkZXZfc2V0X2VjbWQoZGV2LCBlY21kKTsKKwlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTMyIGVsM19nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiByZXQ7CisKKwlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CisJcmV0ID0gZWwzX2xpbmtfb2soZGV2KTsKKwlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTMyIGVsM19nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZWwzX2RlYnVnOworfQorCitzdGF0aWMgdm9pZCBlbDNfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2KQoreworCWVsM19kZWJ1ZyA9IHY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvID0gZWwzX2dldF9kcnZpbmZvLAorCS5nZXRfc2V0dGluZ3MgPSBlbDNfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgPSBlbDNfc2V0X3NldHRpbmdzLAorCS5nZXRfbGluayA9IGVsM19nZXRfbGluaywKKwkuZ2V0X21zZ2xldmVsID0gZWwzX2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsID0gZWwzX3NldF9tc2dsZXZlbCwKK307CisKK3N0YXRpYyB2b2lkCitlbDNfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIFR1cm4gb2ZmIHN0YXRpc3RpY3MgQVNBUC4gIFdlIHVwZGF0ZSBscC0+c3RhdHMgYmVsb3cuICovCisJb3V0dyhTdGF0c0Rpc2FibGUsIGlvYWRkciArIEVMM19DTUQpOworCisJLyogRGlzYWJsZSB0aGUgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyLiAqLworCW91dHcoUnhEaXNhYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwlvdXR3KFR4RGlzYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisKKwlpZiAoZGV2LT5pZl9wb3J0ID09IDMpCisJCS8qIFR1cm4gb2ZmIHRoaW5uZXQgcG93ZXIuICBHcmVlbiEgKi8KKwkJb3V0dyhTdG9wQ29heCwgaW9hZGRyICsgRUwzX0NNRCk7CisJZWxzZSBpZiAoZGV2LT5pZl9wb3J0ID09IDApIHsKKwkJLyogRGlzYWJsZSBsaW5rIGJlYXQgYW5kIGphYmJlciwgaWZfcG9ydCBtYXkgY2hhbmdlIGhlcmUgbmV4dCBvcGVuKCkuICovCisJCUVMM1dJTkRPVyg0KTsKKwkJb3V0dyhpbncoaW9hZGRyICsgV040X01FRElBKSAmIH5NRURJQV9UUCwgaW9hZGRyICsgV040X01FRElBKTsKKwl9CisKKwlvdXR3KFNldEludHJFbmIgfCAweDAwMDAsIGlvYWRkciArIEVMM19DTUQpOworCisJdXBkYXRlX3N0YXRzKGRldik7Cit9CisKK3N0YXRpYyB2b2lkCitlbDNfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaSwgc3dfaW5mbywgbmV0X2RpYWc7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCQorCS8qIEFjdGl2YXRpbmcgdGhlIGJvYXJkIHJlcXVpcmVkIGFuZCBkb2VzIG5vIGhhcm0gb3RoZXJ3aXNlICovCisJb3V0dygweDAwMDEsIGlvYWRkciArIDQpOworCisJLyogU2V0IHRoZSBJUlEgbGluZS4gKi8KKwlvdXR3KChkZXYtPmlycSA8PCAxMikgfCAweDBmMDAsIGlvYWRkciArIFdOMF9JUlEpOworCisJLyogU2V0IHRoZSBzdGF0aW9uIGFkZHJlc3MgaW4gd2luZG93IDIgZWFjaCB0aW1lIG9wZW5lZC4gKi8KKwlFTDNXSU5ET1coMik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlvdXRiKGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIGkpOworCisJaWYgKChkZXYtPmlmX3BvcnQgJiAweDAzKSA9PSAzKSAvKiBCTkMgaW50ZXJmYWNlICovCisJCS8qIFN0YXJ0IHRoZSB0aGlubmV0IHRyYW5zY2VpdmVyLiBXZSBzaG91bGQgcmVhbGx5IHdhaXQgNTBtcy4uLiovCisJCW91dHcoU3RhcnRDb2F4LCBpb2FkZHIgKyBFTDNfQ01EKTsKKwllbHNlIGlmICgoZGV2LT5pZl9wb3J0ICYgMHgwMykgPT0gMCkgeyAvKiAxMGJhc2VUIGludGVyZmFjZSAqLworCQkvKiBDb21iaW5lIHNlY29uZGFyeSBzd19pbmZvIHdvcmQgKHRoZSBhZGFwdGVyIGxldmVsKSBhbmQgcHJpbWFyeQorCQkJc3dfaW5mbyB3b3JkIChkdXBsZXggc2V0dGluZyBwbHVzIG90aGVyIHVzZWxlc3MgYml0cykgKi8KKwkJRUwzV0lORE9XKDApOworCQlzd19pbmZvID0gKHJlYWRfZWVwcm9tKGlvYWRkciwgMHgxNCkgJiAweDQwMGYpIHwgCisJCQkocmVhZF9lZXByb20oaW9hZGRyLCAweDBkKSAmIDB4QmZmMCk7CisKKwkJRUwzV0lORE9XKDQpOworCQluZXRfZGlhZyA9IGludyhpb2FkZHIgKyBXTjRfTkVURElBRyk7CisJCW5ldF9kaWFnID0gKG5ldF9kaWFnIHwgRkRfRU5BQkxFKTsgLyogdGVtcG9yYXJpbHkgYXNzdW1lIGZ1bGwtZHVwbGV4IHdpbGwgYmUgc2V0ICovCisJCXByaW50aygiJXM6ICIsIGRldi0+bmFtZSk7CisJCXN3aXRjaCAoZGV2LT5pZl9wb3J0ICYgMHgwYykgeworCQkJY2FzZSAxMjoKKwkJCQkvKiBmb3JjZSBmdWxsLWR1cGxleCBtb2RlIGlmIDNjNXg5YiAqLworCQkJCWlmIChzd19pbmZvICYgMHgwMDBmKSB7CisJCQkJCXByaW50aygiRm9yY2luZyAzYzV4OWIgZnVsbC1kdXBsZXggbW9kZSIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQljYXNlIDg6CisJCQkJLyogc2V0IGZ1bGwtZHVwbGV4IG1vZGUgYmFzZWQgb24gZWVwcm9tIGNvbmZpZyBzZXR0aW5nICovCisJCQkJaWYgKChzd19pbmZvICYgMHgwMDBmKSAmJiAoc3dfaW5mbyAmIDB4ODAwMCkpIHsKKwkJCQkJcHJpbnRrKCJTZXR0aW5nIDNjNXg5YiBmdWxsLWR1cGxleCBtb2RlIChmcm9tIEVFUFJPTSBjb25maWd1cmF0aW9uIGJpdCkiKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJZGVmYXVsdDoKKwkJCQkvKiB4Y3ZyPSgwIHx8IDQpIE9SIHVzZXIgaGFzIGFuIG9sZCAzYzV4OSBub24gIkIiIG1vZGVsICovCisJCQkJcHJpbnRrKCJTZXR0aW5nIDNjNXg5LzNjNXg5QiBoYWxmLWR1cGxleCBtb2RlIik7CisJCQkJbmV0X2RpYWcgPSAobmV0X2RpYWcgJiB+RkRfRU5BQkxFKTsgLyogZGlzYWJsZSBmdWxsIGR1cGxleCAqLworCQl9CisKKwkJb3V0dyhuZXRfZGlhZywgaW9hZGRyICsgV040X05FVERJQUcpOworCQlwcmludGsoIiBpZl9wb3J0OiAlZCwgc3dfaW5mbzogJTQuNHhcbiIsIGRldi0+aWZfcG9ydCwgc3dfaW5mbyk7CisJCWlmIChlbDNfZGVidWcgPiAzKQorCQkJcHJpbnRrKCIlczogM2M1eDkgbmV0IGRpYWcgd29yZCBpcyBub3c6ICU0LjR4LlxuIiwgZGV2LT5uYW1lLCBuZXRfZGlhZyk7CisJCS8qIEVuYWJsZSBsaW5rIGJlYXQgYW5kIGphYmJlciBjaGVjay4gKi8KKwkJb3V0dyhpbncoaW9hZGRyICsgV040X01FRElBKSB8IE1FRElBX1RQLCBpb2FkZHIgKyBXTjRfTUVESUEpOworCX0KKworCS8qIFN3aXRjaCB0byB0aGUgc3RhdHMgd2luZG93LCBhbmQgY2xlYXIgYWxsIHN0YXRzIGJ5IHJlYWRpbmcuICovCisJb3V0dyhTdGF0c0Rpc2FibGUsIGlvYWRkciArIEVMM19DTUQpOworCUVMM1dJTkRPVyg2KTsKKwlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorCQlpbmIoaW9hZGRyICsgaSk7CisJaW53KGlvYWRkciArIDEwKTsKKwlpbncoaW9hZGRyICsgMTIpOworCisJLyogU3dpdGNoIHRvIHJlZ2lzdGVyIHNldCAxIGZvciBub3JtYWwgdXNlLiAqLworCUVMM1dJTkRPVygxKTsKKworCS8qIEFjY2VwdCBiLWNhc2UgYW5kIHBoeXMgYWRkciBvbmx5LiAqLworCW91dHcoU2V0UnhGaWx0ZXIgfCBSeFN0YXRpb24gfCBSeEJyb2FkY2FzdCwgaW9hZGRyICsgRUwzX0NNRCk7CisJb3V0dyhTdGF0c0VuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7IC8qIFR1cm4gb24gc3RhdGlzdGljcy4gKi8KKworCW91dHcoUnhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOyAvKiBFbmFibGUgdGhlIHJlY2VpdmVyLiAqLworCW91dHcoVHhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOyAvKiBFbmFibGUgdHJhbnNtaXR0ZXIuICovCisJLyogQWxsb3cgc3RhdHVzIGJpdHMgdG8gYmUgc2Vlbi4gKi8KKwlvdXR3KFNldFN0YXR1c0VuYiB8IDB4ZmYsIGlvYWRkciArIEVMM19DTUQpOworCS8qIEFjayBhbGwgcGVuZGluZyBldmVudHMsIGFuZCBzZXQgYWN0aXZlIGluZGljYXRvciBtYXNrLiAqLworCW91dHcoQWNrSW50ciB8IEludExhdGNoIHwgVHhBdmFpbGFibGUgfCBSeEVhcmx5IHwgSW50UmVxLAorCQkgaW9hZGRyICsgRUwzX0NNRCk7CisJb3V0dyhTZXRJbnRyRW5iIHwgSW50TGF0Y2h8VHhBdmFpbGFibGV8VHhDb21wbGV0ZXxSeENvbXBsZXRlfFN0YXRzRnVsbCwKKwkJIGlvYWRkciArIEVMM19DTUQpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKK30KKworLyogUG93ZXIgTWFuYWdlbWVudCBzdXBwb3J0IGZ1bmN0aW9ucyAqLworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50CitlbDNfc3VzcGVuZChzdHJ1Y3QgcG1fZGV2ICpwZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwOworCWludCBpb2FkZHI7CisJCisJaWYgKCFwZGV2ICYmICFwZGV2LT5kYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXBkZXYtPmRhdGE7CisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKwllbDNfZG93bihkZXYpOworCW91dHcoUG93ZXJEb3duLCBpb2FkZHIgKyBFTDNfQ01EKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2VsM19yZXN1bWUoc3RydWN0IHBtX2RldiAqcGRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGVsM19wcml2YXRlICpscDsKKwlpbnQgaW9hZGRyOworCQorCWlmICghcGRldiAmJiAhcGRldi0+ZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilwZGV2LT5kYXRhOworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJb3V0dyhQb3dlclVwLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwllbDNfdXAoZGV2KTsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwkJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZWwzX3BtX2NhbGxiYWNrKHN0cnVjdCBwbV9kZXYgKnBkZXYsIHBtX3JlcXVlc3RfdCBycXN0LCB2b2lkICpkYXRhKQoreworCXN3aXRjaCAocnFzdCkgeworCQljYXNlIFBNX1NVU1BFTkQ6CisJCQlyZXR1cm4gZWwzX3N1c3BlbmQocGRldik7CisKKwkJY2FzZSBQTV9SRVNVTUU6CisJCQlyZXR1cm4gZWwzX3Jlc3VtZShwZGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworLyogUGFyYW1ldGVycyB0aGF0IG1heSBiZSBwYXNzZWQgaW50byB0aGUgbW9kdWxlLiAqLworc3RhdGljIGludCBkZWJ1ZyA9IC0xOworc3RhdGljIGludCBpcnFbXSA9IHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9Oworc3RhdGljIGludCB4Y3ZyW10gPSB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CisKK21vZHVsZV9wYXJhbShkZWJ1ZyxpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheSh4Y3ZyLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBsZXZlbCAoMC02KSIpOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJJUlEgbnVtYmVyKHMpIChhc3NpZ25lZCkiKTsKK01PRFVMRV9QQVJNX0RFU0MoeGN2ciwidHJhbnNjZWl2ZXIocykgKDA9aW50ZXJuYWwsIDE9ZXh0ZXJuYWwpIik7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9pbnRlcnJ1cHRfd29yaywgIm1heGltdW0gZXZlbnRzIGhhbmRsZWQgcGVyIGludGVycnVwdCIpOworI2lmIGRlZmluZWQoX19JU0FQTlBfXykKK21vZHVsZV9wYXJhbShub3BucCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm9wbnAsICJkaXNhYmxlIElTQSBQblAgc3VwcG9ydCAoMC0xKSIpOworTU9EVUxFX0RFVklDRV9UQUJMRShpc2FwbnAsIGVsM19pc2FwbnBfYWRhcHRlcnMpOworI2VuZGlmCS8qIF9fSVNBUE5QX18gKi8KK01PRFVMRV9ERVNDUklQVElPTigiM0NvbSBFdGhlcmxpbmsgSUlJICgzYzUwOSwgM2M1MDlCKSBJU0EvUG5QIGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IF9faW5pdCBlbDNfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwllbDNfY2FyZHMgPSAwOworCisJaWYgKGRlYnVnID49IDApCisJCWVsM19kZWJ1ZyA9IGRlYnVnOworCisJZWwzX3Jvb3RfZGV2ID0gTlVMTDsKKwl3aGlsZSAoZWwzX3Byb2JlKGVsM19jYXJkcykgPT0gMCkgeworCQlpZiAoaXJxW2VsM19jYXJkc10gPiAxKQorCQkJZWwzX3Jvb3RfZGV2LT5pcnEgPSBpcnFbZWwzX2NhcmRzXTsKKwkJaWYgKHhjdnJbZWwzX2NhcmRzXSA+PSAwKQorCQkJZWwzX3Jvb3RfZGV2LT5pZl9wb3J0ID0geGN2cltlbDNfY2FyZHNdOworCQllbDNfY2FyZHMrKzsKKwl9CisKKyNpZmRlZiBDT05GSUdfRUlTQQorCWlmIChlaXNhX2RyaXZlcl9yZWdpc3RlciAoJmVsM19laXNhX2RyaXZlcikgPCAwKSB7CisJCWVpc2FfZHJpdmVyX3VucmVnaXN0ZXIgKCZlbDNfZWlzYV9kcml2ZXIpOworCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19NQ0EKKwltY2FfcmVnaXN0ZXJfZHJpdmVyKCZlbDNfbWNhX2RyaXZlcik7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGVsM19jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXh0X2RldjsKKworCXdoaWxlIChlbDNfcm9vdF9kZXYpIHsKKwkJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGVsM19yb290X2Rldik7CisKKwkJbmV4dF9kZXYgPSBscC0+bmV4dF9kZXY7CisJCWVsM19jb21tb25fcmVtb3ZlIChlbDNfcm9vdF9kZXYpOworCQllbDNfcm9vdF9kZXYgPSBuZXh0X2RldjsKKwl9CisKKyNpZmRlZiBDT05GSUdfRUlTQQorCWVpc2FfZHJpdmVyX3VucmVnaXN0ZXIgKCZlbDNfZWlzYV9kcml2ZXIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX01DQQorCW1jYV91bnJlZ2lzdGVyX2RyaXZlcigmZWwzX21jYV9kcml2ZXIpOworI2VuZGlmCit9CisKK21vZHVsZV9pbml0IChlbDNfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQgKGVsM19jbGVhbnVwX21vZHVsZSk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTE1LmMgYi9kcml2ZXJzL25ldC8zYzUxNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0Y2Y0ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC8zYzUxNS5jCkBAIC0wLDAgKzEsMTU5NCBAQAorLyoKKwlXcml0dGVuIDE5OTctMTk5OCBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlUaGlzIGRyaXZlciBpcyBmb3IgdGhlIDNDb20gSVNBIEV0aGVyTGluayBYTCAiQ29ya3NjcmV3IiAzYzUxNSBldGhlcmNhcmQuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKworCTIwMDAvMi8yLSBBZGRlZCBzdXBwb3J0IGZvciBrZXJuZWwtbGV2ZWwgSVNBUG5QIAorCQlieSBTdGVwaGVuIEZyb3N0IDxzZnJvc3RAc25vd21hbi5uZXQ+IGFuZCBBbGVzc2FuZHJvIFp1bW1vCisJQ2xlYW5lZCB1cCBmb3IgMi4zLngvc29mdG5ldCBieSBKZWZmIEdhcnppayBhbmQgQWxhbiBDb3guCisJCisJMjAwMS8xMS8xNyAtIEFkZGVkIGV0aHRvb2wgc3VwcG9ydCAoamdhcnppaykKKwkKKwkyMDAyLzEwLzI4IC0gTG9ja2luZyB1cGRhdGVzIGZvciAyLjUgKGFsYW5AcmVkaGF0LmNvbSkKKworKi8KKworI2RlZmluZSBEUlZfTkFNRQkJIjNjNTE1IgorI2RlZmluZSBEUlZfVkVSU0lPTgkJIjAuOTl0LWFjIgorI2RlZmluZSBEUlZfUkVMREFURQkJIjI4LU9jdC0yMDAyIgorCitzdGF0aWMgY2hhciAqdmVyc2lvbiA9CitEUlZfTkFNRSAiLmM6diIgRFJWX1ZFUlNJT04gIiAiIERSVl9SRUxEQVRFICIgYmVja2VyQHNjeWxkLmNvbSBhbmQgb3RoZXJzXG4iOworCisjZGVmaW5lIENPUktTQ1JFVyAxCisKKy8qICJLbm9icyIgdGhhdCBhZGp1c3QgZmVhdHVyZXMgYW5kIHBhcmFtZXRlcnMuICovCisvKiBTZXQgdGhlIGNvcHkgYnJlYWtwb2ludCBmb3IgdGhlIGNvcHktb25seS10aW55LWZyYW1lcyBzY2hlbWUuCisgICBTZXR0aW5nIHRvID4gMTUxMiBlZmZlY3RpdmVseSBkaXNhYmxlcyB0aGlzIGZlYXR1cmUuICovCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhayA9IDIwMDsKKworLyogQWxsb3cgc2V0dGluZyBNVFUgdG8gYSBsYXJnZXIgc2l6ZSwgYnlwYXNzaW5nIHRoZSBub3JtYWwgZXRoZXJuZXQgc2V0dXAuICovCitzdGF0aWMgY29uc3QgaW50IG10dSA9IDE1MDA7CisKKy8qIE1heGltdW0gZXZlbnRzIChSeCBwYWNrZXRzLCBldGMuKSB0byBoYW5kbGUgYXQgZWFjaCBpbnRlcnJ1cHQuICovCitzdGF0aWMgaW50IG1heF9pbnRlcnJ1cHRfd29yayA9IDIwOworCisvKiBFbmFibGUgdGhlIGF1dG9tYXRpYyBtZWRpYSBzZWxlY3Rpb24gY29kZSAtLSB1c3VhbGx5IHNldC4gKi8KKyNkZWZpbmUgQVVUT01FRElBIDEKKworLyogQWxsb3cgdGhlIHVzZSBvZiBmcmFnbWVudCBidXMgbWFzdGVyIHRyYW5zZmVycyBpbnN0ZWFkIG9mIG9ubHkKKyAgIHByb2dyYW1tZWQtSS9PIGZvciBWb3J0ZXggY2FyZHMuICBGdWxsLWJ1cy1tYXN0ZXIgdHJhbnNmZXJzIGFyZSBhbHdheXMKKyAgIGVuYWJsZWQgYnkgZGVmYXVsdCBvbiBCb29tZXJhbmcgY2FyZHMuICBJZiBWT1JURVhfQlVTX01BU1RFUiBpcyBkZWZpbmVkLAorICAgdGhlIGZlYXR1cmUgbWF5IGJlIHR1cm5lZCBvbiB1c2luZyAnb3B0aW9ucycuICovCisjZGVmaW5lIFZPUlRFWF9CVVNfTUFTVEVSCisKKy8qIEEgZmV3IHZhbHVlcyB0aGF0IG1heSBiZSB0d2Vha2VkLiAqLworLyogS2VlcCB0aGUgcmluZyBzaXplcyBhIHBvd2VyIG9mIHR3byBmb3IgZWZmaWNpZW5jeS4gKi8KKyNkZWZpbmUgVFhfUklOR19TSVpFCTE2CisjZGVmaW5lIFJYX1JJTkdfU0laRQkxNgorI2RlZmluZSBQS1RfQlVGX1NaCQkxNTM2CS8qIFNpemUgb2YgZWFjaCB0ZW1wb3JhcnkgUnggYnVmZmVyLiAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaXNhcG5wLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNkZWZpbmUgTkVXX01VTFRJQ0FTVAorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNkZWZpbmUgTUFYX1VOSVRTIDgKKworTU9EVUxFX0FVVEhPUigiRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiM0NvbSAzYzUxNSBDb3Jrc2NyZXcgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKKy8qICJLbm9icyIgZm9yIGFkanVzdGluZyBpbnRlcm5hbCBwYXJhbWV0ZXJzLiAqLworLyogUHV0IG91dCBzb21ld2hhdCBtb3JlIGRlYnVnZ2luZyBtZXNzYWdlcy4gKDAgLSBubyBtc2csIDEgbWluaW1hbCBtc2dzKS4gKi8KKyNkZWZpbmUgRFJJVkVSX0RFQlVHIDEKKy8qIFNvbWUgdmFsdWVzIGhlcmUgb25seSBmb3IgcGVyZm9ybWFuY2UgZXZhbHVhdGlvbiBhbmQgcGF0aC1jb3ZlcmFnZQorICAgZGVidWdnaW5nLiAqLworc3RhdGljIGludCByeF9ub2NvcHksIHJ4X2NvcHksIHF1ZXVlZF9wYWNrZXQ7CisKKy8qIE51bWJlciBvZiB0aW1lcyB0byBjaGVjayB0byBzZWUgaWYgdGhlIFR4IEZJRk8gaGFzIHNwYWNlLCB1c2VkIGluIHNvbWUKKyAgIGxpbWl0ZWQgY2FzZXMuICovCisjZGVmaW5lIFdBSVRfVFhfQVZBSUwgMjAwCisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlciB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworI2RlZmluZSBUWF9USU1FT1VUICA0MAkJLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIFR4IGh1bmcgKi8KKworLyogVGhlIHNpemUgaGVyZSBpcyBzb21ld2hhdCBtaXNsZWFkaW5nOiB0aGUgQ29ya3NjcmV3IGFsc28gdXNlcyB0aGUgSVNBCisgICBhbGlhc2VkIHJlZ2lzdGVycyBhdCA8YmFzZT4rMHg0MDAuCisgICAqLworI2RlZmluZSBDT1JLU0NSRVdfVE9UQUxfU0laRSAweDIwCisKKyNpZmRlZiBEUklWRVJfREVCVUcKK3N0YXRpYyBpbnQgY29ya3NjcmV3X2RlYnVnID0gRFJJVkVSX0RFQlVHOworI2Vsc2UKK3N0YXRpYyBpbnQgY29ya3NjcmV3X2RlYnVnID0gMTsKKyNlbmRpZgorCisjZGVmaW5lIENPUktTQ1JFV19JRCAxMAorCisvKgorCQkJCVRoZW9yeSBvZiBPcGVyYXRpb24KKworSS4gQm9hcmQgQ29tcGF0aWJpbGl0eQorCitUaGlzIGRldmljZSBkcml2ZXIgaXMgZGVzaWduZWQgZm9yIHRoZSAzQ29tIDNjNTE1IElTQSBGYXN0IEV0aGVyTGluayBYTCwKKzNDb20ncyBJU0EgYnVzIGFkYXB0ZXIgZm9yIEZhc3QgRXRoZXJuZXQuICBEdWUgdG8gdGhlIHVuaXF1ZSBJL08gcG9ydCBsYXlvdXQsCitpdCdzIG5vdCBwcmFjdGljYWwgdG8gaW50ZWdyYXRlIHRoaXMgZHJpdmVyIHdpdGggdGhlIG90aGVyIEV0aGVyTGluayBkcml2ZXJzLgorCitJSS4gQm9hcmQtc3BlY2lmaWMgc2V0dGluZ3MKKworVGhlIENvcmtzY3JldyBoYXMgYW4gRUVQUk9NIGZvciBjb25maWd1cmF0aW9uLCBidXQgbm8gc3BlY2lhbCBzZXR0aW5ncyBhcmUKK25lZWRlZCBmb3IgTGludXguCisKK0lJSS4gRHJpdmVyIG9wZXJhdGlvbgorCitUaGUgM2M1MTUgc2VyaWVzIHVzZSBhbiBpbnRlcmZhY2UgdGhhdCdzIHZlcnkgc2ltaWxhciB0byB0aGUgM2M5MDAgIkJvb21lcmFuZyIKK1BDSSBjYXJkcywgd2l0aCB0aGUgYnVzIG1hc3RlciBpbnRlcmZhY2UgZXh0ZW5zaXZlbHkgbW9kaWZpZWQgdG8gd29yayB3aXRoCit0aGUgSVNBIGJ1cy4KKworVGhlIGNhcmQgaXMgY2FwYWJsZSBvZiBmdWxsLWJ1cy1tYXN0ZXIgdHJhbnNmZXJzIHdpdGggc2VwYXJhdGUKK2xpc3RzIG9mIHRyYW5zbWl0IGFuZCByZWNlaXZlIGRlc2NyaXB0b3JzLCBzaW1pbGFyIHRvIHRoZSBBTUQgTEFOQ0UvUENuZXQsCitERUMgVHVsaXAgYW5kIEludGVsIFNwZWVkbzMuCisKK1RoaXMgZHJpdmVyIHVzZXMgYSAiUlhfQ09QWUJSRUFLIiBzY2hlbWUgcmF0aGVyIHRoYW4gYSBmaXhlZCBpbnRlcm1lZGlhdGUKK3JlY2VpdmUgYnVmZmVyLiAgVGhpcyBzY2hlbWUgYWxsb2NhdGVzIGZ1bGwtc2l6ZWQgc2tidWZmcyBhcyByZWNlaXZlCitidWZmZXJzLiAgVGhlIHZhbHVlIFJYX0NPUFlCUkVBSyBpcyB1c2VkIGFzIHRoZSBjb3B5aW5nIGJyZWFrcG9pbnQ6IGl0IGlzCitjaG9zZW4gdG8gdHJhZGUtb2ZmIHRoZSBtZW1vcnkgd2FzdGVkIGJ5IHBhc3NpbmcgdGhlIGZ1bGwtc2l6ZWQgc2tidWZmIHRvCit0aGUgcXVldWUgbGF5ZXIgZm9yIGFsbCBmcmFtZXMgdnMuIHRoZSBjb3B5aW5nIGNvc3Qgb2YgY29weWluZyBhIGZyYW1lIHRvIGEKK2NvcnJlY3RseS1zaXplZCBza2J1ZmYuCisKKworSUlJQy4gU3luY2hyb25pemF0aW9uCitUaGUgZHJpdmVyIHJ1bnMgYXMgdHdvIGluZGVwZW5kZW50LCBzaW5nbGUtdGhyZWFkZWQgZmxvd3Mgb2YgY29udHJvbC4gIE9uZQoraXMgdGhlIHNlbmQtcGFja2V0IHJvdXRpbmUsIHdoaWNoIGVuZm9yY2VzIHNpbmdsZS10aHJlYWRlZCB1c2UgYnkgdGhlIG5ldGlmCitsYXllci4gIFRoZSBvdGhlciB0aHJlYWQgaXMgdGhlIGludGVycnVwdCBoYW5kbGVyLCB3aGljaCBpcyBzaW5nbGUKK3RocmVhZGVkIGJ5IHRoZSBoYXJkd2FyZSBhbmQgb3RoZXIgc29mdHdhcmUuCisKK0lWLiBOb3RlcworCitUaGFua3MgdG8gVGVycnkgTXVycGh5IG9mIDNDb20gZm9yIHByb3ZpZGluZyBkb2N1bWVudGF0aW9uIGFuZCBhIGRldmVsb3BtZW50Citib2FyZC4KKworVGhlIG5hbWVzICJWb3J0ZXgiLCAiQm9vbWVyYW5nIiBhbmQgIkNvcmtzY3JldyIgYXJlIHRoZSBpbnRlcm5hbCAzQ29tCitwcm9qZWN0IG5hbWVzLiAgSSB1c2UgdGhlc2UgbmFtZXMgdG8gZWxpbWluYXRlIGNvbmZ1c2lvbiAtLSAzQ29tIHByb2R1Y3QKK251bWJlcnMgYW5kIG5hbWVzIGFyZSB2ZXJ5IHNpbWlsYXIgYW5kIG9mdGVuIGNvbmZ1c2VkLgorCitUaGUgbmV3IGNoaXBzIHN1cHBvcnQgYm90aCBldGhlcm5ldCAoMS41SykgYW5kIEZEREkgKDQuNUspIGZyYW1lIHNpemVzIQorVGhpcyBkcml2ZXIgb25seSBzdXBwb3J0cyBldGhlcm5ldCBmcmFtZXMgYmVjYXVzZSBvZiB0aGUgcmVjZW50IE1UVSBsaW1pdAorb2YgMS41SywgYnV0IHRoZSBjaGFuZ2VzIHRvIHN1cHBvcnQgNC41SyBhcmUgbWluaW1hbC4KKyovCisKKy8qIE9wZXJhdGlvbmFsIGRlZmluaXRpb25zLgorICAgVGhlc2UgYXJlIG5vdCB1c2VkIGJ5IG90aGVyIGNvbXBpbGF0aW9uIHVuaXRzIGFuZCB0aHVzIGFyZSBub3QKKyAgIGV4cG9ydGVkIGluIGEgIi5oIiBmaWxlLgorCisgICBGaXJzdCB0aGUgd2luZG93cy4gIFRoZXJlIGFyZSBlaWdodCByZWdpc3RlciB3aW5kb3dzLCB3aXRoIHRoZSBjb21tYW5kCisgICBhbmQgc3RhdHVzIHJlZ2lzdGVycyBhdmFpbGFibGUgaW4gZWFjaC4KKyAgICovCisjZGVmaW5lIEVMM1dJTkRPVyh3aW5fbnVtKSBvdXR3KFNlbGVjdFdpbmRvdyArICh3aW5fbnVtKSwgaW9hZGRyICsgRUwzX0NNRCkKKyNkZWZpbmUgRUwzX0NNRCAweDBlCisjZGVmaW5lIEVMM19TVEFUVVMgMHgwZQorCisvKiBUaGUgdG9wIGZpdmUgYml0cyB3cml0dGVuIHRvIEVMM19DTUQgYXJlIGEgY29tbWFuZCwgdGhlIGxvd2VyCisgICAxMSBiaXRzIGFyZSB0aGUgcGFyYW1ldGVyLCBpZiBhcHBsaWNhYmxlLgorICAgTm90ZSB0aGF0IDExIHBhcmFtZXRlcnMgYml0cyB3YXMgZmluZSBmb3IgZXRoZXJuZXQsIGJ1dCB0aGUgbmV3IGNoaXBzCisgICBjYW4gaGFuZGxlIEZEREkgbGVuZ3RoIGZyYW1lcyAofjQ1MDAgb2N0ZXRzKSBhbmQgbm93IHBhcmFtZXRlcnMgY291bnQKKyAgIDMyLWJpdCAnRHdvcmRzJyByYXRoZXIgdGhhbiBvY3RldHMuICovCisKK2VudW0gY29ya3NjcmV3X2NtZCB7CisJVG90YWxSZXNldCA9IDAgPDwgMTEsIFNlbGVjdFdpbmRvdyA9IDEgPDwgMTEsIFN0YXJ0Q29heCA9IDIgPDwgMTEsCisJUnhEaXNhYmxlID0gMyA8PCAxMSwgUnhFbmFibGUgPSA0IDw8IDExLCBSeFJlc2V0ID0gNSA8PCAxMSwKKwlVcFN0YWxsID0gNiA8PCAxMSwgVXBVbnN0YWxsID0gKDYgPDwgMTEpICsgMSwgRG93blN0YWxsID0gKDYgPDwgMTEpICsgMiwKKwlEb3duVW5zdGFsbCA9ICg2IDw8IDExKSArIDMsIFJ4RGlzY2FyZCA9IDggPDwgMTEsIFR4RW5hYmxlID0gOSA8PCAxMSwgCisJVHhEaXNhYmxlID0gMTAgPDwgMTEsIFR4UmVzZXQgPSAxMSA8PCAxMSwgRmFrZUludHIgPSAxMiA8PCAxMSwgCisJQWNrSW50ciA9IDEzIDw8IDExLCBTZXRJbnRyRW5iID0gMTQgPDwgMTEsIFNldFN0YXR1c0VuYiA9IDE1IDw8IDExLCAKKwlTZXRSeEZpbHRlciA9IDE2IDw8IDExLCBTZXRSeFRocmVzaG9sZCA9IDE3IDw8IDExLAorCVNldFR4VGhyZXNob2xkID0gMTggPDwgMTEsIFNldFR4U3RhcnQgPSAxOSA8PCAxMSwgU3RhcnRETUFVcCA9IDIwIDw8IDExLAorCVN0YXJ0RE1BRG93biA9ICgyMCA8PCAxMSkgKyAxLCBTdGF0c0VuYWJsZSA9IDIxIDw8IDExLAorCVN0YXRzRGlzYWJsZSA9IDIyIDw8IDExLCBTdG9wQ29heCA9IDIzIDw8IDExLAorfTsKKworLyogVGhlIFNldFJ4RmlsdGVyIGNvbW1hbmQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGNsYXNzZXM6ICovCitlbnVtIFJ4RmlsdGVyIHsKKwlSeFN0YXRpb24gPSAxLCBSeE11bHRpY2FzdCA9IDIsIFJ4QnJvYWRjYXN0ID0gNCwgUnhQcm9tID0gOAorfTsKKworLyogQml0cyBpbiB0aGUgZ2VuZXJhbCBzdGF0dXMgcmVnaXN0ZXIuICovCitlbnVtIGNvcmtzY3Jld19zdGF0dXMgeworCUludExhdGNoID0gMHgwMDAxLCBBZGFwdGVyRmFpbHVyZSA9IDB4MDAwMiwgVHhDb21wbGV0ZSA9IDB4MDAwNCwKKwlUeEF2YWlsYWJsZSA9IDB4MDAwOCwgUnhDb21wbGV0ZSA9IDB4MDAxMCwgUnhFYXJseSA9IDB4MDAyMCwKKwlJbnRSZXEgPSAweDAwNDAsIFN0YXRzRnVsbCA9IDB4MDA4MCwKKwlETUFEb25lID0gMSA8PCA4LCBEb3duQ29tcGxldGUgPSAxIDw8IDksIFVwQ29tcGxldGUgPSAxIDw8IDEwLAorCURNQUluUHJvZ3Jlc3MgPSAxIDw8IDExLAkvKiBETUEgY29udHJvbGxlciBpcyBzdGlsbCBidXN5LiAqLworCUNtZEluUHJvZ3Jlc3MgPSAxIDw8IDEyLAkvKiBFTDNfQ01EIGlzIHN0aWxsIGJ1c3kuICovCit9OworCisvKiBSZWdpc3RlciB3aW5kb3cgMSBvZmZzZXRzLCB0aGUgd2luZG93IHVzZWQgaW4gbm9ybWFsIG9wZXJhdGlvbi4KKyAgIE9uIHRoZSBDb3Jrc2NyZXcgdGhpcyB3aW5kb3cgaXMgYWx3YXlzIG1hcHBlZCBhdCBvZmZzZXRzIDB4MTAtMHgxZi4gKi8KK2VudW0gV2luZG93MSB7CisJVFhfRklGTyA9IDB4MTAsIFJYX0ZJRk8gPSAweDEwLCBSeEVycm9ycyA9IDB4MTQsCisJUnhTdGF0dXMgPSAweDE4LCBUaW1lciA9IDB4MUEsIFR4U3RhdHVzID0gMHgxQiwKKwlUeEZyZWUgPSAweDFDLAkJLyogUmVtYWluaW5nIGZyZWUgYnl0ZXMgaW4gVHggYnVmZmVyLiAqLworfTsKK2VudW0gV2luZG93MCB7CisJV24wSVJRID0gMHgwOCwKKyNpZiBkZWZpbmVkKENPUktTQ1JFVykKKwlXbjBFZXByb21DbWQgPSAweDIwMEEsCS8qIENvcmtzY3JldyBFRVBST00gY29tbWFuZCByZWdpc3Rlci4gKi8KKwlXbjBFZXByb21EYXRhID0gMHgyMDBDLAkvKiBDb3Jrc2NyZXcgRUVQUk9NIHJlc3VsdHMgcmVnaXN0ZXIuICovCisjZWxzZQorCVduMEVlcHJvbUNtZCA9IDEwLAkvKiBXaW5kb3cgMDogRUVQUk9NIGNvbW1hbmQgcmVnaXN0ZXIuICovCisJV24wRWVwcm9tRGF0YSA9IDEyLAkvKiBXaW5kb3cgMDogRUVQUk9NIHJlc3VsdHMgcmVnaXN0ZXIuICovCisjZW5kaWYKK307CitlbnVtIFdpbjBfRUVQUk9NX2JpdHMgeworCUVFUFJPTV9SZWFkID0gMHg4MCwgRUVQUk9NX1dSSVRFID0gMHg0MCwgRUVQUk9NX0VSQVNFID0gMHhDMCwKKwlFRVBST01fRVdFTkIgPSAweDMwLAkvKiBFbmFibGUgZXJhc2luZy93cml0aW5nIGZvciAxMCBtc2VjLiAqLworCUVFUFJPTV9FV0RJUyA9IDB4MDAsCS8qIERpc2FibGUgRVdFTkIgYmVmb3JlIDEwIG1zZWMgdGltZW91dC4gKi8KK307CisKKy8qIEVFUFJPTSBsb2NhdGlvbnMuICovCitlbnVtIGVlcHJvbV9vZmZzZXQgeworCVBoeXNBZGRyMDEgPSAwLCBQaHlzQWRkcjIzID0gMSwgUGh5c0FkZHI0NSA9IDIsIE1vZGVsSUQgPSAzLAorCUV0aGVyTGluazNJRCA9IDcsCit9OworCitlbnVtIFdpbmRvdzMgewkJCS8qIFdpbmRvdyAzOiBNQUMvY29uZmlnIGJpdHMuICovCisJV24zX0NvbmZpZyA9IDAsIFduM19NQUNfQ3RybCA9IDYsIFduM19PcHRpb25zID0gOCwKK307Cit1bmlvbiB3bjNfY29uZmlnIHsKKwlpbnQgaTsKKwlzdHJ1Y3QgdzNfY29uZmlnX2ZpZWxkcyB7CisJCXVuc2lnbmVkIGludCByYW1fc2l6ZTozLCByYW1fd2lkdGg6MSwgcmFtX3NwZWVkOjIsIHJvbV9zaXplOjI7CisJCWludCBwYWQ4Ojg7CisJCXVuc2lnbmVkIGludCByYW1fc3BsaXQ6MiwgcGFkMTg6MiwgeGN2cjozLCBwYWQyMToxLCBhdXRvc2VsZWN0OjE7CisJCWludCBwYWQyNDo3OworCX0gdTsKK307CisKK2VudW0gV2luZG93NCB7CisJV240X05ldERpYWcgPSA2LCBXbjRfTWVkaWEgPSAxMCwJLyogV2luZG93IDQ6IFhjdnIvbWVkaWEgYml0cy4gKi8KK307CitlbnVtIFdpbjRfTWVkaWFfYml0cyB7CisJTWVkaWFfU1FFID0gMHgwMDA4LAkvKiBFbmFibGUgU1FFIGVycm9yIGNvdW50aW5nIGZvciBBVUkuICovCisJTWVkaWFfMTBUUCA9IDB4MDBDMCwJLyogRW5hYmxlIGxpbmsgYmVhdCBhbmQgamFiYmVyIGZvciAxMGJhc2VULiAqLworCU1lZGlhX0xuayA9IDB4MDA4MCwJLyogRW5hYmxlIGp1c3QgbGluayBiZWF0IGZvciAxMDBUWC8xMDBGWC4gKi8KKwlNZWRpYV9MbmtCZWF0ID0gMHgwODAwLAorfTsKK2VudW0gV2luZG93NyB7CQkJLyogV2luZG93IDc6IEJ1cyBNYXN0ZXIgY29udHJvbC4gKi8KKwlXbjdfTWFzdGVyQWRkciA9IDAsIFduN19NYXN0ZXJMZW4gPSA2LCBXbjdfTWFzdGVyU3RhdHVzID0gMTIsCit9OworCisvKiBCb29tZXJhbmctc3R5bGUgYnVzIG1hc3RlciBjb250cm9sIHJlZ2lzdGVycy4gIE5vdGUgSVNBIGFsaWFzZXMhICovCitlbnVtIE1hc3RlckN0cmwgeworCVBrdFN0YXR1cyA9IDB4NDAwLCBEb3duTGlzdFB0ciA9IDB4NDA0LCBGcmFnQWRkciA9IDB4NDA4LCBGcmFnTGVuID0KKwkgICAgMHg0MGMsCisJVHhGcmVlVGhyZXNob2xkID0gMHg0MGYsIFVwUGt0U3RhdHVzID0gMHg0MTAsIFVwTGlzdFB0ciA9IDB4NDE4LAorfTsKKworLyogVGhlIFJ4IGFuZCBUeCBkZXNjcmlwdG9yIGxpc3RzLgorICAgQ2F1dGlvbiBBbHBoYSBoYWNrZXJzOiB0aGVzZSB0eXBlcyBhcmUgMzIgYml0cyEgIE5vdGUgYWxzbyB0aGUgOCBieXRlCisgICBhbGlnbm1lbnQgY29udHJhaW50IG9uIHR4X3JpbmdbXSBhbmQgcnhfcmluZ1tdLiAqLworc3RydWN0IGJvb21fcnhfZGVzYyB7CisJdTMyIG5leHQ7CisJczMyIHN0YXR1czsKKwl1MzIgYWRkcjsKKwlzMzIgbGVuZ3RoOworfTsKKworLyogVmFsdWVzIGZvciB0aGUgUnggc3RhdHVzIGVudHJ5LiAqLworZW51bSByeF9kZXNjX3N0YXR1cyB7CisJUnhEQ29tcGxldGUgPSAweDAwMDA4MDAwLCBSeERFcnJvciA9IDB4NDAwMCwKKwkvKiBTZWUgYm9vbWVyYW5nX3J4KCkgZm9yIGFjdHVhbCBlcnJvciBiaXRzICovCit9OworCitzdHJ1Y3QgYm9vbV90eF9kZXNjIHsKKwl1MzIgbmV4dDsKKwlzMzIgc3RhdHVzOworCXUzMiBhZGRyOworCXMzMiBsZW5ndGg7Cit9OworCitzdHJ1Y3QgY29ya3NjcmV3X3ByaXZhdGUgeworCWNvbnN0IGNoYXIgKnByb2R1Y3RfbmFtZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IG5ldF9kZXZpY2UgKm91cl9kZXY7CisJLyogVGhlIFJ4IGFuZCBUeCByaW5ncyBhcmUgaGVyZSB0byBrZWVwIHRoZW0gcXVhZC13b3JkLWFsaWduZWQuICovCisJc3RydWN0IGJvb21fcnhfZGVzYyByeF9yaW5nW1JYX1JJTkdfU0laRV07CisJc3RydWN0IGJvb21fdHhfZGVzYyB0eF9yaW5nW1RYX1JJTkdfU0laRV07CisJLyogVGhlIGFkZHJlc3NlcyBvZiB0cmFuc21pdC0gYW5kIHJlY2VpdmUtaW4tcGxhY2Ugc2tidWZmcy4gKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tidWZmW1JYX1JJTkdfU0laRV07CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYnVmZltUWF9SSU5HX1NJWkVdOworCXVuc2lnbmVkIGludCBjdXJfcngsIGN1cl90eDsJLyogVGhlIG5leHQgZnJlZSByaW5nIGVudHJ5ICovCisJdW5zaWduZWQgaW50IGRpcnR5X3J4LCBkaXJ0eV90eDsvKiBUaGUgcmluZyBlbnRyaWVzIHRvIGJlIGZyZWUoKWVkLiAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBza19idWZmICp0eF9za2I7CS8qIFBhY2tldCBiZWluZyBlYXRlbiBieSBidXMgbWFzdGVyIGN0cmwuICAqLworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkvKiBNZWRpYSBzZWxlY3Rpb24gdGltZXIuICovCisJaW50IGNhcGFiaWxpdGllcwk7CS8qIEFkYXB0ZXIgY2FwYWJpbGl0aWVzIHdvcmQuICovCisJaW50IG9wdGlvbnM7CQkJLyogVXNlci1zZXR0YWJsZSBtaXNjLiBkcml2ZXIgb3B0aW9ucy4gKi8KKwlpbnQgbGFzdF9yeF9wYWNrZXRzOwkJLyogRm9yIG1lZGlhIGF1dG9zZWxlY3Rpb24uICovCisJdW5zaWduZWQgaW50IGF2YWlsYWJsZV9tZWRpYTo4LAkvKiBGcm9tIFduM19PcHRpb25zICovCisJCW1lZGlhX292ZXJyaWRlOjMsCS8qIFBhc3NlZC1pbiBtZWRpYSB0eXBlLiAqLworCQlkZWZhdWx0X21lZGlhOjMsCS8qIFJlYWQgZnJvbSB0aGUgRUVQUk9NLiAqLworCQlmdWxsX2R1cGxleDoxLCBhdXRvc2VsZWN0OjEsIGJ1c19tYXN0ZXI6MSwJLyogVm9ydGV4IGNhbiBvbmx5IGRvIGEgZnJhZ21lbnQgYnVzLW0uICovCisJCWZ1bGxfYnVzX21hc3Rlcl90eDoxLCBmdWxsX2J1c19tYXN0ZXJfcng6MSwJLyogQm9vbWVyYW5nICAqLworCQl0eF9mdWxsOjE7CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBkZXZpY2UgKmRldjsKK307CisKKy8qIFRoZSBhY3Rpb24gdG8gdGFrZSB3aXRoIGEgbWVkaWEgc2VsZWN0aW9uIHRpbWVyIHRpY2suCisgICBOb3RlIHRoYXQgd2UgZGV2aWF0ZSBmcm9tIHRoZSAzQ29tIG9yZGVyIGJ5IGNoZWNraW5nIDEwYmFzZTIgYmVmb3JlIEFVSS4KKyAqLworZW51bSB4Y3ZyX3R5cGVzIHsKKwlYQ1ZSXzEwYmFzZVQgPSAwLCBYQ1ZSX0FVSSwgWENWUl8xMGJhc2VUT25seSwgWENWUl8xMGJhc2UyLCBYQ1ZSXzEwMGJhc2VUeCwKKwlYQ1ZSXzEwMGJhc2VGeCwgWENWUl9NSUkgPSA2LCBYQ1ZSX0RlZmF1bHQgPSA4LAorfTsKKworc3RhdGljIHN0cnVjdCBtZWRpYV90YWJsZSB7CisJY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBpbnQgbWVkaWFfYml0czoxNiwJLyogQml0cyB0byBzZXQgaW4gV240X01lZGlhIHJlZ2lzdGVyLiAqLworCQltYXNrOjgsCQkJLyogVGhlIHRyYW5zY2VpdmVyLXByZXNlbnQgYml0IGluIFduM19Db25maWcuICovCisJCW5leHQ6ODsJCQkvKiBUaGUgbWVkaWEgdHlwZSB0byB0cnkgbmV4dC4gKi8KKwlzaG9ydCB3YWl0OwkJCS8qIFRpbWUgYmVmb3JlIHdlIGNoZWNrIG1lZGlhIHN0YXR1cy4gKi8KK30gbWVkaWFfdGJsW10gPSB7CQorCXsgIjEwYmFzZVQiLCBNZWRpYV8xMFRQLCAweDA4LCBYQ1ZSXzEwYmFzZTIsICgxNCAqIEhaKSAvIDEwIH0sIAorCXsgIjEwTWJzIEFVSSIsIE1lZGlhX1NRRSwgMHgyMCwgWENWUl9EZWZhdWx0LCAoMSAqIEhaKSAvIDEwfSwgCisJeyAidW5kZWZpbmVkIiwgMCwgMHg4MCwgWENWUl8xMGJhc2VULCAxMDAwMH0sIAorCXsgIjEwYmFzZTIiLCAwLCAweDEwLCBYQ1ZSX0FVSSwgKDEgKiBIWikgLyAxMH0sIAorCXsgIjEwMGJhc2VUWCIsIE1lZGlhX0xuaywgMHgwMiwgWENWUl8xMDBiYXNlRngsICgxNCAqIEhaKSAvIDEwfSwgCisJeyAiMTAwYmFzZUZYIiwgTWVkaWFfTG5rLCAweDA0LCBYQ1ZSX01JSSwgKDE0ICogSFopIC8gMTB9LCAKKwl7ICJNSUkiLCAwLCAweDQwLCBYQ1ZSXzEwYmFzZVQsIDMgKiBIWn0sIAorCXsgInVuZGVmaW5lZCIsIDAsIDB4MDEsIFhDVlJfMTBiYXNlVCwgMTAwMDB9LCAKKwl7ICJEZWZhdWx0IiwgMCwgMHhGRiwgWENWUl8xMGJhc2VULCAxMDAwMH0sCit9OworCisjaWZkZWYgX19JU0FQTlBfXworc3RhdGljIHN0cnVjdCBpc2FwbnBfZGV2aWNlX2lkIGNvcmtzY3Jld19pc2FwbnBfYWRhcHRlcnNbXSA9IHsKKwl7CUlTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCisJCUlTQVBOUF9WRU5ET1IoJ1QnLCAnQycsICdNJyksIElTQVBOUF9GVU5DVElPTigweDUwNTEpLAorCQkobG9uZykgIjNDb20gRmFzdCBFdGhlckxpbmsgSVNBIiB9LAorCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpc2FwbnAsIGNvcmtzY3Jld19pc2FwbnBfYWRhcHRlcnMpOworCitzdGF0aWMgaW50IG5vcG5wOworI2VuZGlmIC8qIF9fSVNBUE5QX18gKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpjb3Jrc2NyZXdfc2NhbihpbnQgdW5pdCk7CitzdGF0aWMgdm9pZCBjb3Jrc2NyZXdfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkciwKKwkJCSAgICBzdHJ1Y3QgcG5wX2RldiAqaWRldiwgaW50IGNhcmRfbnVtYmVyKTsKK3N0YXRpYyBpbnQgY29ya3NjcmV3X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBjb3Jrc2NyZXdfdGltZXIodW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCBjb3Jrc2NyZXdfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBjb3Jrc2NyZXdfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBjb3Jrc2NyZXdfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYm9vbWVyYW5nX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGNvcmtzY3Jld19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IGNvcmtzY3Jld19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0cyhpbnQgYWRkciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmNvcmtzY3Jld19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOworDAorCisvKiAKKyAgIFVuZm9ydHVuYXRlbHkgbWF4aW1pemluZyB0aGUgc2hhcmVkIGNvZGUgYmV0d2VlbiB0aGUgaW50ZWdyYXRlZCBhbmQKKyAgIG1vZHVsZSB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgcmVzdWx0cyBpbiBhIGNvbXBsaWNhdGVkIHNldCBvZiBpbml0aWFsaXphdGlvbgorICAgcHJvY2VkdXJlcy4KKyAgIGluaXRfbW9kdWxlKCkgLS0gbW9kdWxlcyAvICB0YzU5eF9pbml0KCkgIC0tIGJ1aWx0LWluCisJCVRoZSB3cmFwcGVycyBmb3IgY29ya3NjcmV3X3NjYW4oKQorICAgY29ya3NjcmV3X3NjYW4oKSAgCQkgVGhlIGNvbW1vbiByb3V0aW5lIHRoYXQgc2NhbnMgZm9yIFBDSSBhbmQgRUlTQSBjYXJkcworICAgY29ya3NjcmV3X2ZvdW5kX2RldmljZSgpIEFsbG9jYXRlIGEgZGV2aWNlIHN0cnVjdHVyZSB3aGVuIHdlIGZpbmQgYSBjYXJkLgorCQkJCQlEaWZmZXJlbnQgdmVyc2lvbnMgZXhpc3QgZm9yIG1vZHVsZXMgYW5kIGJ1aWx0LWluLgorICAgY29ya3NjcmV3X3Byb2JlMSgpCQlGaWxsIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlIC0tIHRoaXMgaXMgc2VwYXJhdGVkCisJCQkJCXNvIHRoYXQgdGhlIG1vZHVsZXMgY29kZSBjYW4gcHV0IGl0IGluIGRldi0+aW5pdC4KKyovCisvKiBUaGlzIGRyaXZlciB1c2VzICdvcHRpb25zJyB0byBwYXNzIHRoZSBtZWRpYSB0eXBlLCBmdWxsLWR1cGxleCBmbGFnLCBldGMuICovCisvKiBOb3RlOiB0aGlzIGlzIHRoZSBvbmx5IGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgY2FyZHMgc3VwcG9ydGVkISEgKi8KK3N0YXRpYyBpbnQgb3B0aW9uc1tNQVhfVU5JVFNdID0geyAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIH07CisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgZGVidWcgPSAtMTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG9wdGlvbnMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0ocnhfY29weWJyZWFrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICIzYzUxNSBkZWJ1ZyBsZXZlbCAoMC02KSIpOworTU9EVUxFX1BBUk1fREVTQyhvcHRpb25zLCAiM2M1MTU6IEJpdHMgMC0yOiBtZWRpYSB0eXBlLCBiaXQgMzogZnVsbCBkdXBsZXgsIGJpdCA0OiBidXMgbWFzdGVyaW5nIik7CitNT0RVTEVfUEFSTV9ERVNDKHJ4X2NvcHlicmVhaywgIjNjNTE1IGNvcHkgYnJlYWtwb2ludCBmb3IgY29weS1vbmx5LXRpbnktZnJhbWVzIik7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9pbnRlcnJ1cHRfd29yaywgIjNjNTE1IG1heGltdW0gZXZlbnRzIGhhbmRsZWQgcGVyIGludGVycnVwdCIpOworCisvKiBBIGxpc3Qgb2YgYWxsIGluc3RhbGxlZCBWb3J0ZXggZGV2aWNlcywgZm9yIHJlbW92aW5nIHRoZSBkcml2ZXIgbW9kdWxlLiAqLworLyogd2Ugd2lsbCBuZWVkIGxvY2tpbmcgKGFuZCByZWZjb3VudGluZykgaWYgd2UgZXZlciB1c2UgaXQgZm9yIG1vcmUgKi8KK3N0YXRpYyBMSVNUX0hFQUQocm9vdF9jb3Jrc2NyZXdfZGV2KTsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IGZvdW5kID0gMDsKKwlpZiAoZGVidWcgPj0gMCkKKwkJY29ya3NjcmV3X2RlYnVnID0gZGVidWc7CisJaWYgKGNvcmtzY3Jld19kZWJ1ZykKKwkJcHJpbnRrKHZlcnNpb24pOworCXdoaWxlIChjb3Jrc2NyZXdfc2NhbigtMSkpCisJCWZvdW5kKys7CisJcmV0dXJuIGZvdW5kID8gMCA6IC1FTk9ERVY7Cit9CisKKyNlbHNlCitzdHJ1Y3QgbmV0X2RldmljZSAqdGM1MTVfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGNvcmtzY3Jld19zY2FuKHVuaXQpOworCXN0YXRpYyBpbnQgcHJpbnRlZDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCWlmIChjb3Jrc2NyZXdfZGVidWcgPiAwICYmICFwcmludGVkKSB7CisJCXByaW50ZWQgPSAxOworCQlwcmludGsodmVyc2lvbik7CisJfQorCisJcmV0dXJuIGRldjsKK30KKyNlbmRpZgkJCQkvKiBub3QgTU9EVUxFICovCisKK3N0YXRpYyBpbnQgY2hlY2tfZGV2aWNlKHVuc2lnbmVkIGlvYWRkcikKK3sKKwlpbnQgdGltZXI7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgQ09SS1NDUkVXX1RPVEFMX1NJWkUsICIzYzUxNSIpKQorCQlyZXR1cm4gMDsKKwkvKiBDaGVjayB0aGUgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBmb3IgYSBtYXRjaGluZyBpb2FkZHIuICovCisJaWYgKChpbncoaW9hZGRyICsgMHgyMDAyKSAmIDB4MWYwKSAhPSAoaW9hZGRyICYgMHgxZjApKSB7CisJCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgQ09SS1NDUkVXX1RPVEFMX1NJWkUpOworCQlyZXR1cm4gMDsKKwl9CisJLyogVmVyaWZ5IGJ5IHJlYWRpbmcgdGhlIGRldmljZSBJRCBmcm9tIHRoZSBFRVBST00uICovCisJb3V0dyhFRVBST01fUmVhZCArIDcsIGlvYWRkciArIFduMEVlcHJvbUNtZCk7CisJLyogUGF1c2UgZm9yIGF0IGxlYXN0IDE2MiB1cy4gZm9yIHRoZSByZWFkIHRvIHRha2UgcGxhY2UuICovCisJZm9yICh0aW1lciA9IDQ7IHRpbWVyID49IDA7IHRpbWVyLS0pIHsKKwkJdWRlbGF5KDE2Mik7CisJCWlmICgoaW53KGlvYWRkciArIFduMEVlcHJvbUNtZCkgJiAweDAyMDApID09IDApCisJCQlicmVhazsKKwl9CisJaWYgKGludyhpb2FkZHIgKyBXbjBFZXByb21EYXRhKSAhPSAweDZkNTApIHsKKwkJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBDT1JLU0NSRVdfVE9UQUxfU0laRSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNvcmtzY3Jld19wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJbGlzdF9kZWxfaW5pdCgmdnAtPmxpc3QpOworCWlmIChkZXYtPmRtYSkKKwkJZnJlZV9kbWEoZGV2LT5kbWEpOworCW91dHcoVG90YWxSZXNldCwgZGV2LT5iYXNlX2FkZHIgKyBFTDNfQ01EKTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgQ09SS1NDUkVXX1RPVEFMX1NJWkUpOworCWlmICh2cC0+ZGV2KQorCQlwbnBfZGV2aWNlX2RldGFjaCh0b19wbnBfZGV2KHZwLT5kZXYpKTsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpjb3Jrc2NyZXdfc2NhbihpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0YXRpYyBpbnQgY2FyZHNfZm91bmQgPSAwOworCXN0YXRpYyBpbnQgaW9hZGRyOworCWludCBlcnI7CisjaWZkZWYgX19JU0FQTlBfXworCXNob3J0IGk7CisJc3RhdGljIGludCBwbnBfY2FyZHM7CisjZW5kaWYKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgY29ya3NjcmV3X3ByaXZhdGUpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwl9CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKyNpZmRlZiBfX0lTQVBOUF9fCisJaWYobm9wbnAgPT0gMSkKKwkJZ290byBub19wbnA7CisJZm9yKGk9MDsgY29ya3NjcmV3X2lzYXBucF9hZGFwdGVyc1tpXS52ZW5kb3IgIT0gMDsgaSsrKSB7CisJCXN0cnVjdCBwbnBfZGV2ICppZGV2ID0gTlVMTDsKKwkJaW50IGlycTsKKwkJd2hpbGUoKGlkZXYgPSBwbnBfZmluZF9kZXYoTlVMTCwKKwkJCQkJICAgY29ya3NjcmV3X2lzYXBucF9hZGFwdGVyc1tpXS52ZW5kb3IsCisJCQkJCSAgIGNvcmtzY3Jld19pc2FwbnBfYWRhcHRlcnNbaV0uZnVuY3Rpb24sCisJCQkJCSAgIGlkZXYpKSkgeworCisJCQlpZiAocG5wX2RldmljZV9hdHRhY2goaWRldikgPCAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHBucF9hY3RpdmF0ZV9kZXYoaWRldikgPCAwKSB7CisJCQkJcHJpbnRrKCJwbnAgYWN0aXZhdGUgZmFpbGVkIChvdXQgb2YgcmVzb3VyY2VzPylcbiIpOworCQkJCXBucF9kZXZpY2VfZGV0YWNoKGlkZXYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwbnBfcG9ydF92YWxpZChpZGV2LCAwKSB8fCAhcG5wX2lycV92YWxpZChpZGV2LCAwKSkgeworCQkJCXBucF9kZXZpY2VfZGV0YWNoKGlkZXYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaW9hZGRyID0gcG5wX3BvcnRfc3RhcnQoaWRldiwgMCk7CisJCQlpcnEgPSBwbnBfaXJxKGlkZXYsIDApOworCQkJaWYgKCFjaGVja19kZXZpY2UoaW9hZGRyKSkgeworCQkJCXBucF9kZXZpY2VfZGV0YWNoKGlkZXYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYoY29ya3NjcmV3X2RlYnVnKQorCQkJCXByaW50ayAoIklTQVBOUCByZXBvcnRzICVzIGF0IGkvbyAweCV4LCBpcnEgJWRcbiIsCisJCQkJCShjaGFyKikgY29ya3NjcmV3X2lzYXBucF9hZGFwdGVyc1tpXS5kcml2ZXJfZGF0YSwgaW9hZGRyLCBpcnEpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiM2M1MTUgUmVzb3VyY2UgY29uZmlndXJhdGlvbiByZWdpc3RlciAlIzQuNHgsIERDUiAlNC40eC5cbiIsCisJCSAgICAgCQlpbmwoaW9hZGRyICsgMHgyMDAyKSwgaW53KGlvYWRkciArIDB4MjAwMCkpOworCQkJLyogaXJxID0gaW53KGlvYWRkciArIDB4MjAwMikgJiAxNTsgKi8gLyogVXNlIHRoZSBpcnEgZnJvbSBpc2FwbnAgKi8KKwkJCWNvcmtzY3Jld19zZXR1cChkZXYsIGlvYWRkciwgaWRldiwgY2FyZHNfZm91bmQrKyk7CisJCQlTRVRfTkVUREVWX0RFVihkZXYsICZpZGV2LT5kZXYpOworCQkJcG5wX2NhcmRzKys7CisJCQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWlmICghZXJyKQorCQkJCXJldHVybiBkZXY7CisJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJfQorCX0KK25vX3BucDoKKyNlbmRpZiAvKiBfX0lTQVBOUF9fICovCisKKwkvKiBDaGVjayBhbGwgbG9jYXRpb25zIG9uIHRoZSBJU0EgYnVzIC0tIGV2aWwhICovCisJZm9yIChpb2FkZHIgPSAweDEwMDsgaW9hZGRyIDwgMHg0MDA7IGlvYWRkciArPSAweDIwKSB7CisJCWlmICghY2hlY2tfZGV2aWNlKGlvYWRkcikpCisJCQljb250aW51ZTsKKworCQlwcmludGsoS0VSTl9JTkZPICIzYzUxNSBSZXNvdXJjZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICUjNC40eCwgRENSICU0LjR4LlxuIiwKKwkJICAgICBpbmwoaW9hZGRyICsgMHgyMDAyKSwgaW53KGlvYWRkciArIDB4MjAwMCkpOworCQljb3Jrc2NyZXdfc2V0dXAoZGV2LCBpb2FkZHIsIE5VTEwsIGNhcmRzX2ZvdW5kKyspOworCQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJaWYgKCFlcnIpCisJCQlyZXR1cm4gZGV2OworCQljbGVhbnVwX2NhcmQoZGV2KTsKKwl9CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgY29ya3NjcmV3X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIsCisJCQkgICAgc3RydWN0IHBucF9kZXYgKmlkZXYsIGludCBjYXJkX251bWJlcikKK3sKKwlzdHJ1Y3QgY29ya3NjcmV3X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgZWVwcm9tWzB4NDBdLCBjaGVja3N1bSA9IDA7CS8qIEVFUFJPTSBjb250ZW50cyAqLworCWludCBpOworCWludCBpcnE7CisKKwlpZiAoaWRldikgeworCQlpcnEgPSBwbnBfaXJxKGlkZXYsIDApOworCQl2cC0+ZGV2ID0gJmlkZXYtPmRldjsKKwl9IGVsc2UgeworCQlpcnEgPSBpbncoaW9hZGRyICsgMHgyMDAyKSAmIDE1OworCX0KKworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCWRldi0+aXJxID0gaXJxOworCWRldi0+ZG1hID0gaW53KGlvYWRkciArIDB4MjAwMCkgJiA3OworCXZwLT5wcm9kdWN0X25hbWUgPSAiM2M1MTUiOworCXZwLT5vcHRpb25zID0gZGV2LT5tZW1fc3RhcnQ7CisJdnAtPm91cl9kZXYgPSBkZXY7CisKKwlpZiAoIXZwLT5vcHRpb25zKSB7CisJCSBpZiAoY2FyZF9udW1iZXIgPj0gTUFYX1VOSVRTKQorCQkJdnAtPm9wdGlvbnMgPSAtMTsKKwkJZWxzZQorCQkJdnAtPm9wdGlvbnMgPSBvcHRpb25zW2NhcmRfbnVtYmVyXTsKKwl9CisKKwlpZiAodnAtPm9wdGlvbnMgPj0gMCkgeworCQl2cC0+bWVkaWFfb3ZlcnJpZGUgPSB2cC0+b3B0aW9ucyAmIDc7CisJCWlmICh2cC0+bWVkaWFfb3ZlcnJpZGUgPT0gMikKKwkJCXZwLT5tZWRpYV9vdmVycmlkZSA9IDA7CisJCXZwLT5mdWxsX2R1cGxleCA9ICh2cC0+b3B0aW9ucyAmIDgpID8gMSA6IDA7CisJCXZwLT5idXNfbWFzdGVyID0gKHZwLT5vcHRpb25zICYgMTYpID8gMSA6IDA7CisJfSBlbHNlIHsKKwkJdnAtPm1lZGlhX292ZXJyaWRlID0gNzsKKwkJdnAtPmZ1bGxfZHVwbGV4ID0gMDsKKwkJdnAtPmJ1c19tYXN0ZXIgPSAwOworCX0KKyNpZmRlZiBNT0RVTEUKKwlsaXN0X2FkZCgmdnAtPmxpc3QsICZyb290X2NvcmtzY3Jld19kZXYpOworI2VuZGlmCisKKwlwcmludGsoS0VSTl9JTkZPICIlczogM0NvbSAlcyBhdCAlIzN4LCIsIGRldi0+bmFtZSwgdnAtPnByb2R1Y3RfbmFtZSwgaW9hZGRyKTsKKworCXNwaW5fbG9ja19pbml0KCZ2cC0+bG9jayk7CisJCisJLyogUmVhZCB0aGUgc3RhdGlvbiBhZGRyZXNzIGZyb20gdGhlIEVFUFJPTS4gKi8KKwlFTDNXSU5ET1coMCk7CisJZm9yIChpID0gMDsgaSA8IDB4MTg7IGkrKykgeworCQlzaG9ydCAqcGh5c19hZGRyID0gKHNob3J0ICopIGRldi0+ZGV2X2FkZHI7CisJCWludCB0aW1lcjsKKwkJb3V0dyhFRVBST01fUmVhZCArIGksIGlvYWRkciArIFduMEVlcHJvbUNtZCk7CisJCS8qIFBhdXNlIGZvciBhdCBsZWFzdCAxNjIgdXMuIGZvciB0aGUgcmVhZCB0byB0YWtlIHBsYWNlLiAqLworCQlmb3IgKHRpbWVyID0gNDsgdGltZXIgPj0gMDsgdGltZXItLSkgeworCQkJdWRlbGF5KDE2Mik7CisJCQlpZiAoKGludyhpb2FkZHIgKyBXbjBFZXByb21DbWQpICYgMHgwMjAwKSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisJCWVlcHJvbVtpXSA9IGludyhpb2FkZHIgKyBXbjBFZXByb21EYXRhKTsKKwkJY2hlY2tzdW0gXj0gZWVwcm9tW2ldOworCQlpZiAoaSA8IDMpCisJCQlwaHlzX2FkZHJbaV0gPSBodG9ucyhlZXByb21baV0pOworCX0KKwljaGVja3N1bSA9IChjaGVja3N1bSBeIChjaGVja3N1bSA+PiA4KSkgJiAweGZmOworCWlmIChjaGVja3N1bSAhPSAweDAwKQorCQlwcmludGsoIiAqKipJTlZBTElEIENIRUNLU1VNICU0LjR4KioqICIsIGNoZWNrc3VtKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiVjJTIuMngiLCBpID8gJzonIDogJyAnLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlpZiAoZWVwcm9tWzE2XSA9PSAweDExYzcpIHsJLyogQ29ya3NjcmV3ICovCisJCWlmIChyZXF1ZXN0X2RtYShkZXYtPmRtYSwgIjNjNTE1IikpIHsKKwkJCXByaW50aygiLCBETUEgJWQgYWxsb2NhdGlvbiBmYWlsZWQiLCBkZXYtPmRtYSk7CisJCQlkZXYtPmRtYSA9IDA7CisJCX0gZWxzZQorCQkJcHJpbnRrKCIsIERNQSAlZCIsIGRldi0+ZG1hKTsKKwl9CisJcHJpbnRrKCIsIElSUSAlZFxuIiwgZGV2LT5pcnEpOworCS8qIFRlbGwgdGhlbSBhYm91dCBhbiBpbnZhbGlkIElSUS4gKi8KKwlpZiAoY29ya3NjcmV3X2RlYnVnICYmIChkZXYtPmlycSA8PSAwIHx8IGRldi0+aXJxID4gMTUpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIgKioqIFdhcm5pbmc6IHRoaXMgSVJRIGlzIHVubGlrZWx5IHRvIHdvcmshICoqKlxuIik7CisKKwl7CisJCWNoYXIgKnJhbV9zcGxpdFtdID0geyAiNTozIiwgIjM6MSIsICIxOjEiLCAiMzo1IiB9OworCQl1bmlvbiB3bjNfY29uZmlnIGNvbmZpZzsKKwkJRUwzV0lORE9XKDMpOworCQl2cC0+YXZhaWxhYmxlX21lZGlhID0gaW53KGlvYWRkciArIFduM19PcHRpb25zKTsKKwkJY29uZmlnLmkgPSBpbmwoaW9hZGRyICsgV24zX0NvbmZpZyk7CisJCWlmIChjb3Jrc2NyZXdfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiICBJbnRlcm5hbCBjb25maWcgcmVnaXN0ZXIgaXMgJTQuNHgsIHRyYW5zY2VpdmVycyAlI3guXG4iLAorCQkJCWNvbmZpZy5pLCBpbncoaW9hZGRyICsgV24zX09wdGlvbnMpKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICAlZEsgJXMtd2lkZSBSQU0gJXMgUng6VHggc3BsaXQsICVzJXMgaW50ZXJmYWNlLlxuIiwKKwkJCTggPDwgY29uZmlnLnUucmFtX3NpemUsCisJCQljb25maWcudS5yYW1fd2lkdGggPyAid29yZCIgOiAiYnl0ZSIsCisJCQlyYW1fc3BsaXRbY29uZmlnLnUucmFtX3NwbGl0XSwKKwkJCWNvbmZpZy51LmF1dG9zZWxlY3QgPyAiYXV0b3NlbGVjdC8iIDogIiIsCisJCQltZWRpYV90YmxbY29uZmlnLnUueGN2cl0ubmFtZSk7CisJCWRldi0+aWZfcG9ydCA9IGNvbmZpZy51LnhjdnI7CisJCXZwLT5kZWZhdWx0X21lZGlhID0gY29uZmlnLnUueGN2cjsKKwkJdnAtPmF1dG9zZWxlY3QgPSBjb25maWcudS5hdXRvc2VsZWN0OworCX0KKwlpZiAodnAtPm1lZGlhX292ZXJyaWRlICE9IDcpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICBNZWRpYSBvdmVycmlkZSB0byB0cmFuc2NlaXZlciB0eXBlICVkICglcykuXG4iLAorCQkgICAgICAgdnAtPm1lZGlhX292ZXJyaWRlLAorCQkgICAgICAgbWVkaWFfdGJsW3ZwLT5tZWRpYV9vdmVycmlkZV0ubmFtZSk7CisJCWRldi0+aWZfcG9ydCA9IHZwLT5tZWRpYV9vdmVycmlkZTsKKwl9CisKKwl2cC0+Y2FwYWJpbGl0aWVzID0gZWVwcm9tWzE2XTsKKwl2cC0+ZnVsbF9idXNfbWFzdGVyX3R4ID0gKHZwLT5jYXBhYmlsaXRpZXMgJiAweDIwKSA/IDEgOiAwOworCS8qIFJ4IGlzIGJyb2tlbiBhdCAxMG1icHMsIHNvIHdlIGFsd2F5cyBkaXNhYmxlIGl0LiAqLworCS8qIHZwLT5mdWxsX2J1c19tYXN0ZXJfcnggPSAwOyAqLworCXZwLT5mdWxsX2J1c19tYXN0ZXJfcnggPSAodnAtPmNhcGFiaWxpdGllcyAmIDB4MjApID8gMSA6IDA7CisKKwkvKiBUaGUgM2M1MXgtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSAmY29ya3NjcmV3X29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmY29ya3NjcmV3X3N0YXJ0X3htaXQ7CisJZGV2LT50eF90aW1lb3V0ID0gJmNvcmtzY3Jld190aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSAoNDAwICogSFopIC8gMTAwMDsKKwlkZXYtPnN0b3AgPSAmY29ya3NjcmV3X2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gJmNvcmtzY3Jld19nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGU7CisJZGV2LT5ldGh0b29sX29wcyA9ICZuZXRkZXZfZXRodG9vbF9vcHM7Cit9CisMCisKK3N0YXRpYyBpbnQgY29ya3NjcmV3X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGNvcmtzY3Jld19wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5pb24gd24zX2NvbmZpZyBjb25maWc7CisJaW50IGk7CisKKwkvKiBCZWZvcmUgaW5pdGlhbGl6aW5nIHNlbGVjdCB0aGUgYWN0aXZlIG1lZGlhIHBvcnQuICovCisJRUwzV0lORE9XKDMpOworCWlmICh2cC0+ZnVsbF9kdXBsZXgpCisJCW91dGIoMHgyMCwgaW9hZGRyICsgV24zX01BQ19DdHJsKTsJLyogU2V0IHRoZSBmdWxsLWR1cGxleCBiaXQuICovCisJY29uZmlnLmkgPSBpbmwoaW9hZGRyICsgV24zX0NvbmZpZyk7CisKKwlpZiAodnAtPm1lZGlhX292ZXJyaWRlICE9IDcpIHsKKwkJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDEpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogTWVkaWEgb3ZlcnJpZGUgdG8gdHJhbnNjZWl2ZXIgJWQgKCVzKS5cbiIsCisJCQkJZGV2LT5uYW1lLCB2cC0+bWVkaWFfb3ZlcnJpZGUsCisJCQkJbWVkaWFfdGJsW3ZwLT5tZWRpYV9vdmVycmlkZV0ubmFtZSk7CisJCWRldi0+aWZfcG9ydCA9IHZwLT5tZWRpYV9vdmVycmlkZTsKKwl9IGVsc2UgaWYgKHZwLT5hdXRvc2VsZWN0KSB7CisJCS8qIEZpbmQgZmlyc3QgYXZhaWxhYmxlIG1lZGlhIHR5cGUsIHN0YXJ0aW5nIHdpdGggMTAwYmFzZVR4LiAqLworCQlkZXYtPmlmX3BvcnQgPSA0OworCQl3aGlsZSAoISh2cC0+YXZhaWxhYmxlX21lZGlhICYgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubWFzaykpIAorCQkJZGV2LT5pZl9wb3J0ID0gbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmV4dDsKKworCQlpZiAoY29ya3NjcmV3X2RlYnVnID4gMSkKKwkJCXByaW50aygiJXM6IEluaXRpYWwgbWVkaWEgdHlwZSAlcy5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBtZWRpYV90YmxbZGV2LT5pZl9wb3J0XS5uYW1lKTsKKworCQlpbml0X3RpbWVyKCZ2cC0+dGltZXIpOworCQl2cC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtZWRpYV90YmxbZGV2LT5pZl9wb3J0XS53YWl0OworCQl2cC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisJCXZwLT50aW1lci5mdW5jdGlvbiA9ICZjb3Jrc2NyZXdfdGltZXI7CS8qIHRpbWVyIGhhbmRsZXIgKi8KKwkJYWRkX3RpbWVyKCZ2cC0+dGltZXIpOworCX0gZWxzZQorCQlkZXYtPmlmX3BvcnQgPSB2cC0+ZGVmYXVsdF9tZWRpYTsKKworCWNvbmZpZy51LnhjdnIgPSBkZXYtPmlmX3BvcnQ7CisJb3V0bChjb25maWcuaSwgaW9hZGRyICsgV24zX0NvbmZpZyk7CisKKwlpZiAoY29ya3NjcmV3X2RlYnVnID4gMSkgeworCQlwcmludGsoIiVzOiBjb3Jrc2NyZXdfb3BlbigpIEludGVybmFsQ29uZmlnICU4Ljh4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgY29uZmlnLmkpOworCX0KKworCW91dHcoVHhSZXNldCwgaW9hZGRyICsgRUwzX0NNRCk7CisJZm9yIChpID0gMjA7IGkgPj0gMDsgaS0tKQorCQlpZiAoIShpbncoaW9hZGRyICsgRUwzX1NUQVRVUykgJiBDbWRJblByb2dyZXNzKSkKKwkJCWJyZWFrOworCisJb3V0dyhSeFJlc2V0LCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkvKiBXYWl0IGEgZmV3IHRpY2tzIGZvciB0aGUgUnhSZXNldCBjb21tYW5kIHRvIGNvbXBsZXRlLiAqLworCWZvciAoaSA9IDIwOyBpID49IDA7IGktLSkKKwkJaWYgKCEoaW53KGlvYWRkciArIEVMM19TVEFUVVMpICYgQ21kSW5Qcm9ncmVzcykpCisJCQlicmVhazsKKworCW91dHcoU2V0U3RhdHVzRW5iIHwgMHgwMCwgaW9hZGRyICsgRUwzX0NNRCk7CisKKwkvKiBVc2UgdGhlIG5vdy1zdGFuZGFyZCBzaGFyZWQgSVJRIGltcGxlbWVudGF0aW9uLiAqLworCWlmICh2cC0+Y2FwYWJpbGl0aWVzID09IDB4MTFjNykgeworCQkvKiBDb3Jrc2NyZXc6IENhbm5vdCBzaGFyZSBJU0EgcmVzb3VyY2VzLiAqLworCQlpZiAoZGV2LT5pcnEgPT0gMAorCQkgICAgfHwgZGV2LT5kbWEgPT0gMAorCQkgICAgfHwgcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZjb3Jrc2NyZXdfaW50ZXJydXB0LCAwLAorCQkJCSAgIHZwLT5wcm9kdWN0X25hbWUsIGRldikpIHJldHVybiAtRUFHQUlOOworCQllbmFibGVfZG1hKGRldi0+ZG1hKTsKKwkJc2V0X2RtYV9tb2RlKGRldi0+ZG1hLCBETUFfTU9ERV9DQVNDQURFKTsKKwl9IGVsc2UgaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmY29ya3NjcmV3X2ludGVycnVwdCwgU0FfU0hJUlEsCisJCQkgICAgICAgdnAtPnByb2R1Y3RfbmFtZSwgZGV2KSkgeworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlpZiAoY29ya3NjcmV3X2RlYnVnID4gMSkgeworCQlFTDNXSU5ET1coNCk7CisJCXByaW50aygiJXM6IGNvcmtzY3Jld19vcGVuKCkgaXJxICVkIG1lZGlhIHN0YXR1cyAlNC40eC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGRldi0+aXJxLCBpbncoaW9hZGRyICsgV240X01lZGlhKSk7CisJfQorCisJLyogU2V0IHRoZSBzdGF0aW9uIGFkZHJlc3MgYW5kIG1hc2sgaW4gd2luZG93IDIgZWFjaCB0aW1lIG9wZW5lZC4gKi8KKwlFTDNXSU5ET1coMik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJb3V0YihkZXYtPmRldl9hZGRyW2ldLCBpb2FkZHIgKyBpKTsKKwlmb3IgKDsgaSA8IDEyOyBpICs9IDIpCisJCW91dHcoMCwgaW9hZGRyICsgaSk7CisKKwlpZiAoZGV2LT5pZl9wb3J0ID09IDMpCisJCS8qIFN0YXJ0IHRoZSB0aGlubmV0IHRyYW5zY2VpdmVyLiBXZSBzaG91bGQgcmVhbGx5IHdhaXQgNTBtcy4uLiAqLworCQlvdXR3KFN0YXJ0Q29heCwgaW9hZGRyICsgRUwzX0NNRCk7CisJRUwzV0lORE9XKDQpOworCW91dHcoKGludyhpb2FkZHIgKyBXbjRfTWVkaWEpICYgfihNZWRpYV8xMFRQIHwgTWVkaWFfU1FFKSkgfAorCSAgICAgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubWVkaWFfYml0cywgaW9hZGRyICsgV240X01lZGlhKTsKKworCS8qIFN3aXRjaCB0byB0aGUgc3RhdHMgd2luZG93LCBhbmQgY2xlYXIgYWxsIHN0YXRzIGJ5IHJlYWRpbmcuICovCisJb3V0dyhTdGF0c0Rpc2FibGUsIGlvYWRkciArIEVMM19DTUQpOworCUVMM1dJTkRPVyg2KTsKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKwkJaW5iKGlvYWRkciArIGkpOworCWludyhpb2FkZHIgKyAxMCk7CisJaW53KGlvYWRkciArIDEyKTsKKwkvKiBOZXc6IE9uIHRoZSBWb3J0ZXggd2UgbXVzdCBhbHNvIGNsZWFyIHRoZSBCYWRTU0QgY291bnRlci4gKi8KKwlFTDNXSU5ET1coNCk7CisJaW5iKGlvYWRkciArIDEyKTsKKwkvKiAuLmFuZCBvbiB0aGUgQm9vbWVyYW5nIHdlIGVuYWJsZSB0aGUgZXh0cmEgc3RhdGlzdGljcyBiaXRzLiAqLworCW91dHcoMHgwMDQwLCBpb2FkZHIgKyBXbjRfTmV0RGlhZyk7CisKKwkvKiBTd2l0Y2ggdG8gcmVnaXN0ZXIgc2V0IDcgZm9yIG5vcm1hbCB1c2UuICovCisJRUwzV0lORE9XKDcpOworCisJaWYgKHZwLT5mdWxsX2J1c19tYXN0ZXJfcngpIHsJLyogQm9vbWVyYW5nIGJ1cyBtYXN0ZXIuICovCisJCXZwLT5jdXJfcnggPSB2cC0+ZGlydHlfcnggPSAwOworCQlpZiAoY29ya3NjcmV3X2RlYnVnID4gMikKKwkJCXByaW50aygiJXM6ICBGaWxsaW5nIGluIHRoZSBSeCByaW5nLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisJCQlpZiAoaSA8IChSWF9SSU5HX1NJWkUgLSAxKSkKKwkJCQl2cC0+cnhfcmluZ1tpXS5uZXh0ID0KKwkJCQkgICAgaXNhX3ZpcnRfdG9fYnVzKCZ2cC0+cnhfcmluZ1tpICsgMV0pOworCQkJZWxzZQorCQkJCXZwLT5yeF9yaW5nW2ldLm5leHQgPSAwOworCQkJdnAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gMDsJLyogQ2xlYXIgY29tcGxldGUgYml0LiAqLworCQkJdnAtPnJ4X3JpbmdbaV0ubGVuZ3RoID0gUEtUX0JVRl9TWiB8IDB4ODAwMDAwMDA7CisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKFBLVF9CVUZfU1opOworCQkJdnAtPnJ4X3NrYnVmZltpXSA9IHNrYjsKKwkJCWlmIChza2IgPT0gTlVMTCkKKwkJCQlicmVhazsJLyogQmFkIG5ld3MhICAqLworCQkJc2tiLT5kZXYgPSBkZXY7CS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKwkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLworCQkJdnAtPnJ4X3JpbmdbaV0uYWRkciA9IGlzYV92aXJ0X3RvX2J1cyhza2ItPnRhaWwpOworCQl9CisJCXZwLT5yeF9yaW5nW2kgLSAxXS5uZXh0ID0gaXNhX3ZpcnRfdG9fYnVzKCZ2cC0+cnhfcmluZ1swXSk7CS8qIFdyYXAgdGhlIHJpbmcuICovCisJCW91dGwoaXNhX3ZpcnRfdG9fYnVzKCZ2cC0+cnhfcmluZ1swXSksIGlvYWRkciArIFVwTGlzdFB0cik7CisJfQorCWlmICh2cC0+ZnVsbF9idXNfbWFzdGVyX3R4KSB7CS8qIEJvb21lcmFuZyBidXMgbWFzdGVyIFR4LiAqLworCQl2cC0+Y3VyX3R4ID0gdnAtPmRpcnR5X3R4ID0gMDsKKwkJb3V0YihQS1RfQlVGX1NaID4+IDgsIGlvYWRkciArIFR4RnJlZVRocmVzaG9sZCk7CS8qIFJvb20gZm9yIGEgcGFja2V0LiAqLworCQkvKiBDbGVhciB0aGUgVHggcmluZy4gKi8KKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCQkJdnAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCW91dGwoMCwgaW9hZGRyICsgRG93bkxpc3RQdHIpOworCX0KKwkvKiBTZXQgcmVjZWl2ZXIgbW9kZTogcHJlc3VtYWJseSBhY2NlcHQgYi1jYXNlIGFuZCBwaHlzIGFkZHIgb25seS4gKi8KKwlzZXRfcnhfbW9kZShkZXYpOworCW91dHcoU3RhdHNFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOwkvKiBUdXJuIG9uIHN0YXRpc3RpY3MuICovCisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJb3V0dyhSeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CS8qIEVuYWJsZSB0aGUgcmVjZWl2ZXIuICovCisJb3V0dyhUeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CS8qIEVuYWJsZSB0cmFuc21pdHRlci4gKi8KKwkvKiBBbGxvdyBzdGF0dXMgYml0cyB0byBiZSBzZWVuLiAqLworCW91dHcoU2V0U3RhdHVzRW5iIHwgQWRhcHRlckZhaWx1cmUgfCBJbnRSZXEgfCBTdGF0c0Z1bGwgfAorCSAgICAgKHZwLT5mdWxsX2J1c19tYXN0ZXJfdHggPyBEb3duQ29tcGxldGUgOiBUeEF2YWlsYWJsZSkgfAorCSAgICAgKHZwLT5mdWxsX2J1c19tYXN0ZXJfcnggPyBVcENvbXBsZXRlIDogUnhDb21wbGV0ZSkgfAorCSAgICAgKHZwLT5idXNfbWFzdGVyID8gRE1BRG9uZSA6IDApLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkvKiBBY2sgYWxsIHBlbmRpbmcgZXZlbnRzLCBhbmQgc2V0IGFjdGl2ZSBpbmRpY2F0b3IgbWFzay4gKi8KKwlvdXR3KEFja0ludHIgfCBJbnRMYXRjaCB8IFR4QXZhaWxhYmxlIHwgUnhFYXJseSB8IEludFJlcSwKKwkgICAgIGlvYWRkciArIEVMM19DTUQpOworCW91dHcoU2V0SW50ckVuYiB8IEludExhdGNoIHwgVHhBdmFpbGFibGUgfCBSeENvbXBsZXRlIHwgU3RhdHNGdWxsCisJICAgICB8ICh2cC0+YnVzX21hc3RlciA/IERNQURvbmUgOiAwKSB8IFVwQ29tcGxldGUgfCBEb3duQ29tcGxldGUsCisJICAgICBpb2FkZHIgKyBFTDNfQ01EKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjb3Jrc2NyZXdfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworI2lmZGVmIEFVVE9NRURJQQorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKKwlzdHJ1Y3QgY29ya3NjcmV3X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgb2sgPSAwOworCisJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDEpCisJCXByaW50aygiJXM6IE1lZGlhIHNlbGVjdGlvbiB0aW1lciB0aWNrIGhhcHBlbmVkLCAlcy5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm5hbWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZwLT5sb2NrLCBmbGFncyk7CisJCisJeworCQlpbnQgb2xkX3dpbmRvdyA9IGludyhpb2FkZHIgKyBFTDNfQ01EKSA+PiAxMzsKKwkJaW50IG1lZGlhX3N0YXR1czsKKwkJRUwzV0lORE9XKDQpOworCQltZWRpYV9zdGF0dXMgPSBpbncoaW9hZGRyICsgV240X01lZGlhKTsKKwkJc3dpdGNoIChkZXYtPmlmX3BvcnQpIHsKKwkJY2FzZSAwOgorCQljYXNlIDQ6CisJCWNhc2UgNToJLyogMTBiYXNlVCwgMTAwYmFzZVRYLCAxMDBiYXNlRlggICovCisJCQlpZiAobWVkaWFfc3RhdHVzICYgTWVkaWFfTG5rQmVhdCkgeworCQkJCW9rID0gMTsKKwkJCQlpZiAoY29ya3NjcmV3X2RlYnVnID4gMSkKKwkJCQkJcHJpbnRrKCIlczogTWVkaWEgJXMgaGFzIGxpbmsgYmVhdCwgJXguXG4iLAorCQkJCQkJZGV2LT5uYW1lLAorCQkJCQkJbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmFtZSwKKwkJCQkJCW1lZGlhX3N0YXR1cyk7CisJCQl9IGVsc2UgaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKCIlczogTWVkaWEgJXMgaXMgaGFzIG5vIGxpbmsgYmVhdCwgJXguXG4iLAorCQkJCQlkZXYtPm5hbWUsCisJCQkJCW1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm5hbWUsCisJCQkJCW1lZGlhX3N0YXR1cyk7CisKKwkJCWJyZWFrOworCQlkZWZhdWx0OgkvKiBPdGhlciBtZWRpYSB0eXBlcyBoYW5kbGVkIGJ5IFR4IHRpbWVvdXRzLiAqLworCQkJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKCIlczogTWVkaWEgJXMgaXMgaGFzIG5vIGluZGljYXRpb24sICV4LlxuIiwKKwkJCQkJZGV2LT5uYW1lLAorCQkJCQltZWRpYV90YmxbZGV2LT5pZl9wb3J0XS5uYW1lLAorCQkJCQltZWRpYV9zdGF0dXMpOworCQkJb2sgPSAxOworCQl9CisJCWlmICghb2spIHsKKwkJCXVuaW9uIHduM19jb25maWcgY29uZmlnOworCisJCQlkbyB7CisJCQkJZGV2LT5pZl9wb3J0ID0KKwkJCQkgICAgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmV4dDsKKwkJCX0KKwkJCXdoaWxlICghKHZwLT5hdmFpbGFibGVfbWVkaWEgJiBtZWRpYV90YmxbZGV2LT5pZl9wb3J0XS5tYXNrKSk7CisJCQkKKwkJCWlmIChkZXYtPmlmX3BvcnQgPT0gOCkgewkvKiBHbyBiYWNrIHRvIGRlZmF1bHQuICovCisJCQkJZGV2LT5pZl9wb3J0ID0gdnAtPmRlZmF1bHRfbWVkaWE7CisJCQkJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDEpCisJCQkJCXByaW50aygiJXM6IE1lZGlhIHNlbGVjdGlvbiBmYWlsaW5nLCB1c2luZyBkZWZhdWx0ICVzIHBvcnQuXG4iLAorCQkJCQkJZGV2LT5uYW1lLAorCQkJCQkJbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmFtZSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChjb3Jrc2NyZXdfZGVidWcgPiAxKQorCQkJCQlwcmludGsoIiVzOiBNZWRpYSBzZWxlY3Rpb24gZmFpbGVkLCBub3cgdHJ5aW5nICVzIHBvcnQuXG4iLAorCQkJCQkJZGV2LT5uYW1lLAorCQkJCQkJbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmFtZSk7CisJCQkJdnAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ud2FpdDsKKwkJCQlhZGRfdGltZXIoJnZwLT50aW1lcik7CisJCQl9CisJCQlvdXR3KChtZWRpYV9zdGF0dXMgJiB+KE1lZGlhXzEwVFAgfCBNZWRpYV9TUUUpKSB8CisJCQkgICAgIG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm1lZGlhX2JpdHMsCisJCQkgICAgIGlvYWRkciArIFduNF9NZWRpYSk7CisKKwkJCUVMM1dJTkRPVygzKTsKKwkJCWNvbmZpZy5pID0gaW5sKGlvYWRkciArIFduM19Db25maWcpOworCQkJY29uZmlnLnUueGN2ciA9IGRldi0+aWZfcG9ydDsKKwkJCW91dGwoY29uZmlnLmksIGlvYWRkciArIFduM19Db25maWcpOworCisJCQlvdXR3KGRldi0+aWZfcG9ydCA9PSAzID8gU3RhcnRDb2F4IDogU3RvcENvYXgsCisJCQkgICAgIGlvYWRkciArIEVMM19DTUQpOworCQl9CisJCUVMM1dJTkRPVyhvbGRfd2luZG93KTsKKwl9CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnAtPmxvY2ssIGZsYWdzKTsKKwlpZiAoY29ya3NjcmV3X2RlYnVnID4gMSkKKwkJcHJpbnRrKCIlczogTWVkaWEgc2VsZWN0aW9uIHRpbWVyIGZpbmlzaGVkLCAlcy5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm5hbWUpOworCisjZW5kaWYJCQkJLyogQVVUT01FRElBICovCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjb3Jrc2NyZXdfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCXN0cnVjdCBjb3Jrc2NyZXdfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCXByaW50ayhLRVJOX1dBUk5JTkcKKwkgICAgICAgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHR4X3N0YXR1cyAlMi4yeCBzdGF0dXMgJTQuNHguXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGluYihpb2FkZHIgKyBUeFN0YXR1cyksCisJICAgICAgIGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSk7CisJLyogU2xpZ2h0IGNvZGUgYmxvYXQgdG8gYmUgdXNlciBmcmllbmRseS4gKi8KKwlpZiAoKGluYihpb2FkZHIgKyBUeFN0YXR1cykgJiAweDg4KSA9PSAweDg4KQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IFRyYW5zbWl0dGVyIGVuY291bnRlcmVkIDE2IGNvbGxpc2lvbnMgLS0gbmV0d29yayIKKwkJICAgICAgICIgbmV0d29yayBjYWJsZSBwcm9ibGVtP1xuIiwgZGV2LT5uYW1lKTsKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCXByaW50aygiICBGbGFnczsgYnVzLW1hc3RlciAlZCwgZnVsbCAlZDsgZGlydHkgJWQgY3VycmVudCAlZC5cbiIsCisJICAgICAgIHZwLT5mdWxsX2J1c19tYXN0ZXJfdHgsIHZwLT50eF9mdWxsLCB2cC0+ZGlydHlfdHgsCisJICAgICAgIHZwLT5jdXJfdHgpOworCXByaW50aygiICBEb3duIGxpc3QgJTguOHggdnMuICVwLlxuIiwgaW5sKGlvYWRkciArIERvd25MaXN0UHRyKSwKKwkgICAgICAgJnZwLT50eF9yaW5nWzBdKTsKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJcHJpbnRrKCIgICVkOiAlcCAgbGVuZ3RoICU4Ljh4IHN0YXR1cyAlOC44eFxuIiwgaSwKKwkJICAgICAgICZ2cC0+dHhfcmluZ1tpXSwKKwkJICAgICAgIHZwLT50eF9yaW5nW2ldLmxlbmd0aCwgdnAtPnR4X3JpbmdbaV0uc3RhdHVzKTsKKwl9CisjZW5kaWYKKwkvKiBJc3N1ZSBUWF9SRVNFVCBhbmQgVFhfU1RBUlQgY29tbWFuZHMuICovCisJb3V0dyhUeFJlc2V0LCBpb2FkZHIgKyBFTDNfQ01EKTsKKwlmb3IgKGkgPSAyMDsgaSA+PSAwOyBpLS0pCisJCWlmICghKGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSAmIENtZEluUHJvZ3Jlc3MpKQorCQkJYnJlYWs7CisJb3V0dyhUeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJdnAtPnN0YXRzLnR4X2Vycm9ycysrOworCXZwLT5zdGF0cy50eF9kcm9wcGVkKys7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IGNvcmtzY3Jld19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY29ya3NjcmV3X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwkvKiBCbG9jayBhIHRpbWVyLWJhc2VkIHRyYW5zbWl0IGZyb20gb3ZlcmxhcHBpbmcuICovCisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAodnAtPmZ1bGxfYnVzX21hc3Rlcl90eCkgewkvKiBCT09NRVJBTkcgYnVzLW1hc3RlciAqLworCQkvKiBDYWxjdWxhdGUgdGhlIG5leHQgVHggZGVzY3JpcHRvciBlbnRyeS4gKi8KKwkJaW50IGVudHJ5ID0gdnAtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKKwkJc3RydWN0IGJvb21fdHhfZGVzYyAqcHJldl9lbnRyeTsKKwkJdW5zaWduZWQgbG9uZyBmbGFncywgaTsKKworCQlpZiAodnAtPnR4X2Z1bGwpCS8qIE5vIHJvb20gdG8gdHJhbnNtaXQgd2l0aCAqLworCQkJcmV0dXJuIDE7CisJCWlmICh2cC0+Y3VyX3R4ICE9IDApCisJCQlwcmV2X2VudHJ5ID0gJnZwLT50eF9yaW5nWyh2cC0+Y3VyX3R4IC0gMSkgJSBUWF9SSU5HX1NJWkVdOworCQllbHNlCisJCQlwcmV2X2VudHJ5ID0gTlVMTDsKKwkJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDMpCisJCQlwcmludGsoIiVzOiBUcnlpbmcgdG8gc2VuZCBhIHBhY2tldCwgVHggaW5kZXggJWQuXG4iLAorCQkJCWRldi0+bmFtZSwgdnAtPmN1cl90eCk7CisJCS8qIHZwLT50eF9mdWxsID0gMTsgKi8KKwkJdnAtPnR4X3NrYnVmZltlbnRyeV0gPSBza2I7CisJCXZwLT50eF9yaW5nW2VudHJ5XS5uZXh0ID0gMDsKKwkJdnAtPnR4X3JpbmdbZW50cnldLmFkZHIgPSBpc2FfdmlydF90b19idXMoc2tiLT5kYXRhKTsKKwkJdnAtPnR4X3JpbmdbZW50cnldLmxlbmd0aCA9IHNrYi0+bGVuIHwgMHg4MDAwMDAwMDsKKwkJdnAtPnR4X3JpbmdbZW50cnldLnN0YXR1cyA9IHNrYi0+bGVuIHwgMHg4MDAwMDAwMDsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdnAtPmxvY2ssIGZsYWdzKTsKKwkJb3V0dyhEb3duU3RhbGwsIGlvYWRkciArIEVMM19DTUQpOworCQkvKiBXYWl0IGZvciB0aGUgc3RhbGwgdG8gY29tcGxldGUuICovCisJCWZvciAoaSA9IDIwOyBpID49IDA7IGktLSkKKwkJCWlmICgoaW53KGlvYWRkciArIEVMM19TVEFUVVMpICYgQ21kSW5Qcm9ncmVzcykgPT0gMCkgCisJCQkJYnJlYWs7CisJCWlmIChwcmV2X2VudHJ5KQorCQkJcHJldl9lbnRyeS0+bmV4dCA9IGlzYV92aXJ0X3RvX2J1cygmdnAtPnR4X3JpbmdbZW50cnldKTsKKwkJaWYgKGlubChpb2FkZHIgKyBEb3duTGlzdFB0cikgPT0gMCkgeworCQkJb3V0bChpc2FfdmlydF90b19idXMoJnZwLT50eF9yaW5nW2VudHJ5XSksCisJCQkgICAgIGlvYWRkciArIERvd25MaXN0UHRyKTsKKwkJCXF1ZXVlZF9wYWNrZXQrKzsKKwkJfQorCQlvdXR3KERvd25VbnN0YWxsLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnAtPmxvY2ssIGZsYWdzKTsKKworCQl2cC0+Y3VyX3R4Kys7CisJCWlmICh2cC0+Y3VyX3R4IC0gdnAtPmRpcnR5X3R4ID4gVFhfUklOR19TSVpFIC0gMSkKKwkJCXZwLT50eF9mdWxsID0gMTsKKwkJZWxzZSB7CQkvKiBDbGVhciBwcmV2aW91cyBpbnRlcnJ1cHQgZW5hYmxlLiAqLworCQkJaWYgKHByZXZfZW50cnkpCisJCQkJcHJldl9lbnRyeS0+c3RhdHVzICY9IH4weDgwMDAwMDAwOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQl9CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlyZXR1cm4gMDsKKwl9CisJLyogUHV0IG91dCB0aGUgZG91Ymxld29yZCBoZWFkZXIuLi4gKi8KKwlvdXRsKHNrYi0+bGVuLCBpb2FkZHIgKyBUWF9GSUZPKTsKKwl2cC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisjaWZkZWYgVk9SVEVYX0JVU19NQVNURVIKKwlpZiAodnAtPmJ1c19tYXN0ZXIpIHsKKwkJLyogU2V0IHRoZSBidXMtbWFzdGVyIGNvbnRyb2xsZXIgdG8gdHJhbnNmZXIgdGhlIHBhY2tldC4gKi8KKwkJb3V0bCgoaW50KSAoc2tiLT5kYXRhKSwgaW9hZGRyICsgV243X01hc3RlckFkZHIpOworCQlvdXR3KChza2ItPmxlbiArIDMpICYgfjMsIGlvYWRkciArIFduN19NYXN0ZXJMZW4pOworCQl2cC0+dHhfc2tiID0gc2tiOworCQlvdXR3KFN0YXJ0RE1BRG93biwgaW9hZGRyICsgRUwzX0NNRCk7CisJCS8qIHF1ZXVlIHdpbGwgYmUgd29rZW4gYXQgdGhlIERNQURvbmUgaW50ZXJydXB0LiAqLworCX0gZWxzZSB7CisJCS8qIC4uLiBhbmQgdGhlIHBhY2tldCByb3VuZGVkIHRvIGEgZG91Ymxld29yZC4gKi8KKwkJb3V0c2woaW9hZGRyICsgVFhfRklGTywgc2tiLT5kYXRhLCAoc2tiLT5sZW4gKyAzKSA+PiAyKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlpZiAoaW53KGlvYWRkciArIFR4RnJlZSkgPiAxNTM2KSB7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0gZWxzZQorCQkJLyogSW50ZXJydXB0IHVzIHdoZW4gdGhlIEZJRk8gaGFzIHJvb20gZm9yIG1heC1zaXplZCBwYWNrZXQuICovCisJCQlvdXR3KFNldFR4VGhyZXNob2xkICsgKDE1MzYgPj4gMiksCisJCQkgICAgIGlvYWRkciArIEVMM19DTUQpOworCX0KKyNlbHNlCisJLyogLi4uIGFuZCB0aGUgcGFja2V0IHJvdW5kZWQgdG8gYSBkb3VibGV3b3JkLiAqLworCW91dHNsKGlvYWRkciArIFRYX0ZJRk8sIHNrYi0+ZGF0YSwgKHNrYi0+bGVuICsgMykgPj4gMik7CisJZGV2X2tmcmVlX3NrYihza2IpOworCWlmIChpbncoaW9hZGRyICsgVHhGcmVlKSA+IDE1MzYpIHsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0gZWxzZQorCQkvKiBJbnRlcnJ1cHQgdXMgd2hlbiB0aGUgRklGTyBoYXMgcm9vbSBmb3IgbWF4LXNpemVkIHBhY2tldC4gKi8KKwkJb3V0dyhTZXRUeFRocmVzaG9sZCArICgxNTM2ID4+IDIpLCBpb2FkZHIgKyBFTDNfQ01EKTsKKyNlbmRpZgkJCQkvKiBidXMgbWFzdGVyICovCisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIENsZWFyIHRoZSBUeCBzdGF0dXMgc3RhY2suICovCisJeworCQlzaG9ydCB0eF9zdGF0dXM7CisJCWludCBpID0gNDsKKworCQl3aGlsZSAoLS1pID4gMCAmJiAodHhfc3RhdHVzID0gaW5iKGlvYWRkciArIFR4U3RhdHVzKSkgPiAwKSB7CisJCQlpZiAodHhfc3RhdHVzICYgMHgzQykgewkvKiBBIFR4LWRpc2FibGluZyBlcnJvciBvY2N1cnJlZC4gICovCisJCQkJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDIpCisJCQkJCXByaW50aygiJXM6IFR4IGVycm9yLCBzdGF0dXMgJTIuMnguXG4iLAorCQkJCQkJZGV2LT5uYW1lLCB0eF9zdGF0dXMpOworCQkJCWlmICh0eF9zdGF0dXMgJiAweDA0KQorCQkJCQl2cC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQlpZiAodHhfc3RhdHVzICYgMHgzOCkKKwkJCQkJdnAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQkJaWYgKHR4X3N0YXR1cyAmIDB4MzApIHsKKwkJCQkJaW50IGo7CisJCQkJCW91dHcoVHhSZXNldCwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQkJCWZvciAoaiA9IDIwOyBqID49IDA7IGotLSkKKwkJCQkJCWlmICghKGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSAmIENtZEluUHJvZ3Jlc3MpKSAKKwkJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJb3V0dyhUeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQl9CisJCQlvdXRiKDB4MDAsIGlvYWRkciArIFR4U3RhdHVzKTsJLyogUG9wIHRoZSBzdGF0dXMgc3RhY2suICovCisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBkb2VzIGFsbCBvZiB0aGUgUnggdGhyZWFkIHdvcmsgYW5kIGNsZWFucyB1cAorICAgYWZ0ZXIgdGhlIFR4IHRocmVhZC4gKi8KKworc3RhdGljIGlycXJldHVybl90IGNvcmtzY3Jld19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkvKiBVc2UgdGhlIG5vdy1zdGFuZGFyZCBzaGFyZWQgSVJRIGltcGxlbWVudGF0aW9uLiAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IGNvcmtzY3Jld19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciwgc3RhdHVzOworCWludCBsYXRlbmN5OworCWludCBpID0gbWF4X2ludGVycnVwdF93b3JrOworCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbGF0ZW5jeSA9IGluYihpb2FkZHIgKyBUaW1lcik7CisKKwlzcGluX2xvY2soJmxwLT5sb2NrKTsKKwkKKwlzdGF0dXMgPSBpbncoaW9hZGRyICsgRUwzX1NUQVRVUyk7CisKKwlpZiAoY29ya3NjcmV3X2RlYnVnID4gNCkKKwkJcHJpbnRrKCIlczogaW50ZXJydXB0LCBzdGF0dXMgJTQuNHgsIHRpbWVyICVkLlxuIiwKKwkJCWRldi0+bmFtZSwgc3RhdHVzLCBsYXRlbmN5KTsKKwlpZiAoKHN0YXR1cyAmIDB4RTAwMCkgIT0gMHhFMDAwKSB7CisJCXN0YXRpYyBpbnQgZG9uZWRpZHRoaXM7CisJCS8qIFNvbWUgaW50ZXJydXB0IGNvbnRyb2xsZXJzIHN0b3JlIGEgYm9ndXMgaW50ZXJydXB0IGZyb20gYm9vdC10aW1lLgorCQkgICBJZ25vcmUgYSBzaW5nbGUgZWFybHkgaW50ZXJydXB0LCBidXQgZG9uJ3QgaGFuZyB0aGUgbWFjaGluZSBmb3IKKwkJICAgb3RoZXIgaW50ZXJydXB0IHByb2JsZW1zLiAqLworCQlpZiAoZG9uZWRpZHRoaXMrKyA+IDEwMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQm9ndXMgaW50ZXJydXB0LCBiYWlsaW5nLiBTdGF0dXMgJTQuNHgsIHN0YXJ0PSVkLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIHN0YXR1cywgbmV0aWZfcnVubmluZyhkZXYpKTsKKwkJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQkJZGV2LT5pcnEgPSAtMTsKKwkJfQorCX0KKworCWRvIHsKKwkJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDUpCisJCQlwcmludGsoIiVzOiBJbiBpbnRlcnJ1cHQgbG9vcCwgc3RhdHVzICU0LjR4LlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCWlmIChzdGF0dXMgJiBSeENvbXBsZXRlKQorCQkJY29ya3NjcmV3X3J4KGRldik7CisKKwkJaWYgKHN0YXR1cyAmIFR4QXZhaWxhYmxlKSB7CisJCQlpZiAoY29ya3NjcmV3X2RlYnVnID4gNSkKKwkJCQlwcmludGsoIglUWCByb29tIGJpdCB3YXMgaGFuZGxlZC5cbiIpOworCQkJLyogVGhlcmUncyByb29tIGluIHRoZSBGSUZPIGZvciBhIGZ1bGwtc2l6ZWQgcGFja2V0LiAqLworCQkJb3V0dyhBY2tJbnRyIHwgVHhBdmFpbGFibGUsIGlvYWRkciArIEVMM19DTUQpOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQl9CisJCWlmIChzdGF0dXMgJiBEb3duQ29tcGxldGUpIHsKKwkJCXVuc2lnbmVkIGludCBkaXJ0eV90eCA9IGxwLT5kaXJ0eV90eDsKKworCQkJd2hpbGUgKGxwLT5jdXJfdHggLSBkaXJ0eV90eCA+IDApIHsKKwkJCQlpbnQgZW50cnkgPSBkaXJ0eV90eCAlIFRYX1JJTkdfU0laRTsKKwkJCQlpZiAoaW5sKGlvYWRkciArIERvd25MaXN0UHRyKSA9PSBpc2FfdmlydF90b19idXMoJmxwLT50eF9yaW5nW2VudHJ5XSkpCisJCQkJCWJyZWFrOwkvKiBJdCBzdGlsbCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQuICovCisJCQkJaWYgKGxwLT50eF9za2J1ZmZbZW50cnldKSB7CisJCQkJCWRldl9rZnJlZV9za2JfaXJxKGxwLT50eF9za2J1ZmZbZW50cnldKTsKKwkJCQkJbHAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJCX0KKwkJCQlkaXJ0eV90eCsrOworCQkJfQorCQkJbHAtPmRpcnR5X3R4ID0gZGlydHlfdHg7CisJCQlvdXR3KEFja0ludHIgfCBEb3duQ29tcGxldGUsIGlvYWRkciArIEVMM19DTUQpOworCQkJaWYgKGxwLT50eF9mdWxsICYmIChscC0+Y3VyX3R4IC0gZGlydHlfdHggPD0gVFhfUklOR19TSVpFIC0gMSkpIHsKKwkJCQlscC0+dHhfZnVsbCA9IDA7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJfQorCQl9CisjaWZkZWYgVk9SVEVYX0JVU19NQVNURVIKKwkJaWYgKHN0YXR1cyAmIERNQURvbmUpIHsKKwkJCW91dHcoMHgxMDAwLCBpb2FkZHIgKyBXbjdfTWFzdGVyU3RhdHVzKTsJLyogQWNrIHRoZSBldmVudC4gKi8KKwkJCWRldl9rZnJlZV9za2JfaXJxKGxwLT50eF9za2IpOwkvKiBSZWxlYXNlIHRoZSB0cmFuc2ZlcnJlZCBidWZmZXIgKi8KKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfQorI2VuZGlmCisJCWlmIChzdGF0dXMgJiBVcENvbXBsZXRlKSB7CisJCQlib29tZXJhbmdfcngoZGV2KTsKKwkJCW91dHcoQWNrSW50ciB8IFVwQ29tcGxldGUsIGlvYWRkciArIEVMM19DTUQpOworCQl9CisJCWlmIChzdGF0dXMgJiAoQWRhcHRlckZhaWx1cmUgfCBSeEVhcmx5IHwgU3RhdHNGdWxsKSkgeworCQkJLyogSGFuZGxlIGFsbCB1bmNvbW1vbiBpbnRlcnJ1cHRzIGF0IG9uY2UuICovCisJCQlpZiAoc3RhdHVzICYgUnhFYXJseSkgewkvKiBSeCBlYXJseSBpcyB1bnVzZWQuICovCisJCQkJY29ya3NjcmV3X3J4KGRldik7CisJCQkJb3V0dyhBY2tJbnRyIHwgUnhFYXJseSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQl9CisJCQlpZiAoc3RhdHVzICYgU3RhdHNGdWxsKSB7CS8qIEVtcHR5IHN0YXRpc3RpY3MuICovCisJCQkJc3RhdGljIGludCBEb25lRGlkVGhhdDsKKwkJCQlpZiAoY29ya3NjcmV3X2RlYnVnID4gNCkKKwkJCQkJcHJpbnRrKCIlczogVXBkYXRpbmcgc3RhdHMuXG4iLCBkZXYtPm5hbWUpOworCQkJCXVwZGF0ZV9zdGF0cyhpb2FkZHIsIGRldik7CisJCQkJLyogREVCVUcgSEFDSzogRGlzYWJsZSBzdGF0aXN0aWNzIGFzIGFuIGludGVycnVwdCBzb3VyY2UuICovCisJCQkJLyogVGhpcyBvY2N1cnMgd2hlbiB3ZSBoYXZlIHRoZSB3cm9uZyBtZWRpYSB0eXBlISAqLworCQkJCWlmIChEb25lRGlkVGhhdCA9PSAwICYmIGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSAmIFN0YXRzRnVsbCkgeworCQkJCQlpbnQgd2luLCByZWc7CisJCQkJCXByaW50aygiJXM6IFVwZGF0aW5nIHN0YXRzIGZhaWxlZCwgZGlzYWJsaW5nIHN0YXRzIGFzIGFuIgorCQkJCQkgICAgICIgaW50ZXJydXB0IHNvdXJjZS5cbiIsIGRldi0+bmFtZSk7CisJCQkJCWZvciAod2luID0gMDsgd2luIDwgODsgd2luKyspIHsKKwkJCQkJCUVMM1dJTkRPVyh3aW4pOworCQkJCQkJcHJpbnRrKCJcbiBWb3J0ZXggd2luZG93ICVkOiIsIHdpbik7CisJCQkJCQlmb3IgKHJlZyA9IDA7IHJlZyA8IDE2OyByZWcrKykKKwkJCQkJCQlwcmludGsoIiAlMi4yeCIsIGluYihpb2FkZHIgKyByZWcpKTsKKwkJCQkJfQorCQkJCQlFTDNXSU5ET1coNyk7CisJCQkJCW91dHcoU2V0SW50ckVuYiB8IFR4QXZhaWxhYmxlIHwKKwkJCQkJICAgICBSeENvbXBsZXRlIHwgQWRhcHRlckZhaWx1cmUgfAorCQkJCQkgICAgIFVwQ29tcGxldGUgfCBEb3duQ29tcGxldGUgfAorCQkJCQkgICAgIFR4Q29tcGxldGUsIGlvYWRkciArIEVMM19DTUQpOworCQkJCQlEb25lRGlkVGhhdCsrOworCQkJCX0KKwkJCX0KKwkJCWlmIChzdGF0dXMgJiBBZGFwdGVyRmFpbHVyZSkgeworCQkJCS8qIEFkYXB0ZXIgZmFpbHVyZSByZXF1aXJlcyBSeCByZXNldCBhbmQgcmVpbml0LiAqLworCQkJCW91dHcoUnhSZXNldCwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQkJLyogU2V0IHRoZSBSeCBmaWx0ZXIgdG8gdGhlIGN1cnJlbnQgc3RhdGUuICovCisJCQkJc2V0X3J4X21vZGUoZGV2KTsKKwkJCQlvdXR3KFJ4RW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsJLyogUmUtZW5hYmxlIHRoZSByZWNlaXZlci4gKi8KKwkJCQlvdXR3KEFja0ludHIgfCBBZGFwdGVyRmFpbHVyZSwKKwkJCQkgICAgIGlvYWRkciArIEVMM19DTUQpOworCQkJfQorCQl9CisKKwkJaWYgKC0taSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRvbyBtdWNoIHdvcmsgaW4gaW50ZXJydXB0LCBzdGF0dXMgJTQuNHguICAiCisJCQkgICAgICJEaXNhYmxpbmcgZnVuY3Rpb25zICglNC40eCkuXG4iLCBkZXYtPm5hbWUsCisJCQkgICAgIHN0YXR1cywgU2V0U3RhdHVzRW5iIHwgKCh+c3RhdHVzKSAmIDB4N0ZFKSk7CisJCQkvKiBEaXNhYmxlIGFsbCBwZW5kaW5nIGludGVycnVwdHMuICovCisJCQlvdXR3KFNldFN0YXR1c0VuYiB8ICgofnN0YXR1cykgJiAweDdGRSksIGlvYWRkciArIEVMM19DTUQpOworCQkJb3V0dyhBY2tJbnRyIHwgMHg3RkYsIGlvYWRkciArIEVMM19DTUQpOworCQkJYnJlYWs7CisJCX0KKwkJLyogQWNrbm93bGVkZ2UgdGhlIElSUS4gKi8KKwkJb3V0dyhBY2tJbnRyIHwgSW50UmVxIHwgSW50TGF0Y2gsIGlvYWRkciArIEVMM19DTUQpOworCisJfSB3aGlsZSAoKHN0YXR1cyA9IGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSkgJiAoSW50TGF0Y2ggfCBSeENvbXBsZXRlKSk7CisJCisJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKKworCWlmIChjb3Jrc2NyZXdfZGVidWcgPiA0KQorCQlwcmludGsoIiVzOiBleGl0aW5nIGludGVycnVwdCwgc3RhdHVzICU0LjR4LlxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBjb3Jrc2NyZXdfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY29ya3NjcmV3X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGk7CisJc2hvcnQgcnhfc3RhdHVzOworCisJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDUpCisJCXByaW50aygiICAgSW4gcnhfcGFja2V0KCksIHN0YXR1cyAlNC40eCwgcnhfc3RhdHVzICU0LjR4LlxuIiwKKwkJICAgICBpbncoaW9hZGRyICsgRUwzX1NUQVRVUyksIGludyhpb2FkZHIgKyBSeFN0YXR1cykpOworCXdoaWxlICgocnhfc3RhdHVzID0gaW53KGlvYWRkciArIFJ4U3RhdHVzKSkgPiAwKSB7CisJCWlmIChyeF9zdGF0dXMgJiAweDQwMDApIHsJLyogRXJyb3IsIHVwZGF0ZSBzdGF0cy4gKi8KKwkJCXVuc2lnbmVkIGNoYXIgcnhfZXJyb3IgPSBpbmIoaW9hZGRyICsgUnhFcnJvcnMpOworCQkJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDIpCisJCQkJcHJpbnRrKCIgUnggZXJyb3I6IHN0YXR1cyAlMi4yeC5cbiIsCisJCQkJICAgICAgIHJ4X2Vycm9yKTsKKwkJCXZwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChyeF9lcnJvciAmIDB4MDEpCisJCQkJdnAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAocnhfZXJyb3IgJiAweDAyKQorCQkJCXZwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpZiAocnhfZXJyb3IgJiAweDA0KQorCQkJCXZwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChyeF9lcnJvciAmIDB4MDgpCisJCQkJdnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChyeF9lcnJvciAmIDB4MTApCisJCQkJdnAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJfSBlbHNlIHsKKwkJCS8qIFRoZSBwYWNrZXQgbGVuZ3RoOiB1cCB0byA0LjVLIS4gKi8KKwkJCXNob3J0IHBrdF9sZW4gPSByeF9zdGF0dXMgJiAweDFmZmY7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyA1ICsgMik7CisJCQlpZiAoY29ya3NjcmV3X2RlYnVnID4gNCkKKwkJCQlwcmludGsoIlJlY2VpdmluZyBwYWNrZXQgc2l6ZSAlZCBzdGF0dXMgJTQuNHguXG4iLAorCQkJCSAgICAgcGt0X2xlbiwgcnhfc3RhdHVzKTsKKwkJCWlmIChza2IgIT0gTlVMTCkgeworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLworCQkJCS8qICdza2JfcHV0KCknIHBvaW50cyB0byB0aGUgc3RhcnQgb2Ygc2tfYnVmZiBkYXRhIGFyZWEuICovCisJCQkJaW5zbChpb2FkZHIgKyBSWF9GSUZPLAorCQkJCSAgICAgc2tiX3B1dChza2IsIHBrdF9sZW4pLAorCQkJCSAgICAgKHBrdF9sZW4gKyAzKSA+PiAyKTsKKwkJCQlvdXR3KFJ4RGlzY2FyZCwgaW9hZGRyICsgRUwzX0NNRCk7CS8qIFBvcCB0b3AgUnggcGFja2V0LiAqLworCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCXZwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJdnAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCQkJLyogV2FpdCBhIGxpbWl0ZWQgdGltZSB0byBnbyB0byBuZXh0IHBhY2tldC4gKi8KKwkJCQlmb3IgKGkgPSAyMDA7IGkgPj0gMDsgaS0tKQorCQkJCQlpZiAoISAoaW53KGlvYWRkciArIEVMM19TVEFUVVMpICYgQ21kSW5Qcm9ncmVzcykpIAorCQkJCQkJYnJlYWs7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKGNvcmtzY3Jld19kZWJ1ZykKKwkJCQlwcmludGsoIiVzOiBDb3VsZG4ndCBhbGxvY2F0ZSBhIHNrX2J1ZmYgb2Ygc2l6ZSAlZC5cbiIsIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCX0KKwkJb3V0dyhSeERpc2NhcmQsIGlvYWRkciArIEVMM19DTUQpOworCQl2cC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkvKiBXYWl0IGEgbGltaXRlZCB0aW1lIHRvIHNraXAgdGhpcyBwYWNrZXQuICovCisJCWZvciAoaSA9IDIwMDsgaSA+PSAwOyBpLS0pCisJCQlpZiAoIShpbncoaW9hZGRyICsgRUwzX1NUQVRVUykgJiBDbWRJblByb2dyZXNzKSkKKwkJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYm9vbWVyYW5nX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNvcmtzY3Jld19wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5ID0gdnAtPmN1cl9yeCAlIFJYX1JJTkdfU0laRTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IHJ4X3N0YXR1czsKKworCWlmIChjb3Jrc2NyZXdfZGVidWcgPiA1KQorCQlwcmludGsoIiAgIEluIGJvb21lcmFuZ19yeCgpLCBzdGF0dXMgJTQuNHgsIHJ4X3N0YXR1cyAlNC40eC5cbiIsCisJCQlpbncoaW9hZGRyICsgRUwzX1NUQVRVUyksIGludyhpb2FkZHIgKyBSeFN0YXR1cykpOworCXdoaWxlICgocnhfc3RhdHVzID0gdnAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cykgJiBSeERDb21wbGV0ZSkgeworCQlpZiAocnhfc3RhdHVzICYgUnhERXJyb3IpIHsJLyogRXJyb3IsIHVwZGF0ZSBzdGF0cy4gKi8KKwkJCXVuc2lnbmVkIGNoYXIgcnhfZXJyb3IgPSByeF9zdGF0dXMgPj4gMTY7CisJCQlpZiAoY29ya3NjcmV3X2RlYnVnID4gMikKKwkJCQlwcmludGsoIiBSeCBlcnJvcjogc3RhdHVzICUyLjJ4LlxuIiwKKwkJCQkgICAgICAgcnhfZXJyb3IpOworCQkJdnAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKHJ4X2Vycm9yICYgMHgwMSkKKwkJCQl2cC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCWlmIChyeF9lcnJvciAmIDB4MDIpCisJCQkJdnAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCWlmIChyeF9lcnJvciAmIDB4MDQpCisJCQkJdnAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKHJ4X2Vycm9yICYgMHgwOCkKKwkJCQl2cC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJaWYgKHJ4X2Vycm9yICYgMHgxMCkKKwkJCQl2cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJLyogVGhlIHBhY2tldCBsZW5ndGg6IHVwIHRvIDQuNUshLiAqLworCQkJc2hvcnQgcGt0X2xlbiA9IHJ4X3N0YXR1cyAmIDB4MWZmZjsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCXZwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQkJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDQpCisJCQkJcHJpbnRrKCJSZWNlaXZpbmcgcGFja2V0IHNpemUgJWQgc3RhdHVzICU0LjR4LlxuIiwKKwkJCQkgICAgIHBrdF9sZW4sIHJ4X3N0YXR1cyk7CisKKwkJCS8qIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgbG9uZyBlbm91Z2ggdG8ganVzdCBhY2NlcHQgd2l0aG91dAorCQkJICAgY29weWluZyB0byBhIHByb3Blcmx5IHNpemVkIHNrYnVmZi4gKi8KKwkJCWlmIChwa3RfbGVuIDwgcnhfY29weWJyZWFrCisJCQkgICAgJiYgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDQpKSAhPSAwKSB7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCisJCQkJLyogJ3NrYl9wdXQoKScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4gKi8KKwkJCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdF9sZW4pLAorCQkJCSAgICAgICBpc2FfYnVzX3RvX3ZpcnQodnAtPnJ4X3JpbmdbZW50cnldLgorCQkJCQkJICAgYWRkciksIHBrdF9sZW4pOworCQkJCXJ4X2NvcHkrKzsKKwkJCX0gZWxzZSB7CisJCQkJdm9pZCAqdGVtcDsKKwkJCQkvKiBQYXNzIHVwIHRoZSBza2J1ZmYgYWxyZWFkeSBvbiB0aGUgUnggcmluZy4gKi8KKwkJCQlza2IgPSB2cC0+cnhfc2tidWZmW2VudHJ5XTsKKwkJCQl2cC0+cnhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCQkJdGVtcCA9IHNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKwkJCQkvKiBSZW1vdmUgdGhpcyBjaGVja2luZyBjb2RlIGZvciBmaW5hbCByZWxlYXNlLiAqLworCQkJCWlmIChpc2FfYnVzX3RvX3ZpcnQodnAtPnJ4X3JpbmdbZW50cnldLmFkZHIpICE9IHRlbXApCisJCQkJCSAgICBwcmludGsoIiVzOiBXYXJuaW5nIC0tIHRoZSBza2J1ZmYgYWRkcmVzc2VzIGRvIG5vdCBtYXRjaCIKKwkJCQkJICAgICAiIGluIGJvb21lcmFuZ19yeDogJXAgdnMuICVwIC8gJXAuXG4iLAorCQkJCQkgICAgIGRldi0+bmFtZSwKKwkJCQkJICAgICBpc2FfYnVzX3RvX3ZpcnQodnAtPgorCQkJCQkJCSByeF9yaW5nW2VudHJ5XS4KKwkJCQkJCQkgYWRkciksIHNrYi0+aGVhZCwKKwkJCQkJICAgICB0ZW1wKTsKKwkJCQlyeF9ub2NvcHkrKzsKKwkJCX0KKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCXZwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCX0KKwkJZW50cnkgPSAoKyt2cC0+Y3VyX3J4KSAlIFJYX1JJTkdfU0laRTsKKwl9CisJLyogUmVmaWxsIHRoZSBSeCByaW5nIGJ1ZmZlcnMuICovCisJZm9yICg7IHZwLT5jdXJfcnggLSB2cC0+ZGlydHlfcnggPiAwOyB2cC0+ZGlydHlfcngrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQllbnRyeSA9IHZwLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRTsKKwkJaWYgKHZwLT5yeF9za2J1ZmZbZW50cnldID09IE5VTEwpIHsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IoUEtUX0JVRl9TWik7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJYnJlYWs7CS8qIEJhZCBuZXdzISAgKi8KKwkJCXNrYi0+ZGV2ID0gZGV2OwkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBBbGlnbiBJUCBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KKwkJCXZwLT5yeF9yaW5nW2VudHJ5XS5hZGRyID0gaXNhX3ZpcnRfdG9fYnVzKHNrYi0+dGFpbCk7CisJCQl2cC0+cnhfc2tidWZmW2VudHJ5XSA9IHNrYjsKKwkJfQorCQl2cC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzID0gMDsJLyogQ2xlYXIgY29tcGxldGUgYml0LiAqLworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb3Jrc2NyZXdfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY29ya3NjcmV3X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAoY29ya3NjcmV3X2RlYnVnID4gMSkgeworCQlwcmludGsoIiVzOiBjb3Jrc2NyZXdfY2xvc2UoKSBzdGF0dXMgJTQuNHgsIFR4IHN0YXR1cyAlMi4yeC5cbiIsCisJCSAgICAgZGV2LT5uYW1lLCBpbncoaW9hZGRyICsgRUwzX1NUQVRVUyksCisJCSAgICAgaW5iKGlvYWRkciArIFR4U3RhdHVzKSk7CisJCXByaW50aygiJXM6IGNvcmtzY3JldyBjbG9zZSBzdGF0czogcnhfbm9jb3B5ICVkIHJ4X2NvcHkgJWQiCisJCSAgICAgICAiIHR4X3F1ZXVlZCAlZC5cbiIsIGRldi0+bmFtZSwgcnhfbm9jb3B5LCByeF9jb3B5LAorCQkgICAgICAgcXVldWVkX3BhY2tldCk7CisJfQorCisJZGVsX3RpbWVyKCZ2cC0+dGltZXIpOworCisJLyogVHVybiBvZmYgc3RhdGlzdGljcyBBU0FQLiAgV2UgdXBkYXRlIGxwLT5zdGF0cyBiZWxvdy4gKi8KKwlvdXR3KFN0YXRzRGlzYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisKKwkvKiBEaXNhYmxlIHRoZSByZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXIuICovCisJb3V0dyhSeERpc2FibGUsIGlvYWRkciArIEVMM19DTUQpOworCW91dHcoVHhEaXNhYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKworCWlmIChkZXYtPmlmX3BvcnQgPT0gWENWUl8xMGJhc2UyKQorCQkvKiBUdXJuIG9mZiB0aGlubmV0IHBvd2VyLiAgR3JlZW4hICovCisJCW91dHcoU3RvcENvYXgsIGlvYWRkciArIEVMM19DTUQpOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlvdXR3KFNldEludHJFbmIgfCAweDAwMDAsIGlvYWRkciArIEVMM19DTUQpOworCisJdXBkYXRlX3N0YXRzKGlvYWRkciwgZGV2KTsKKwlpZiAodnAtPmZ1bGxfYnVzX21hc3Rlcl9yeCkgewkvKiBGcmVlIEJvb21lcmFuZyBidXMgbWFzdGVyIFJ4IGJ1ZmZlcnMuICovCisJCW91dGwoMCwgaW9hZGRyICsgVXBMaXN0UHRyKTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQorCQkJaWYgKHZwLT5yeF9za2J1ZmZbaV0pIHsKKwkJCQlkZXZfa2ZyZWVfc2tiKHZwLT5yeF9za2J1ZmZbaV0pOworCQkJCXZwLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCQkJfQorCX0KKwlpZiAodnAtPmZ1bGxfYnVzX21hc3Rlcl90eCkgewkvKiBGcmVlIEJvb21lcmFuZyBidXMgbWFzdGVyIFR4IGJ1ZmZlcnMuICovCisJCW91dGwoMCwgaW9hZGRyICsgRG93bkxpc3RQdHIpOworCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCisJCQlpZiAodnAtPnR4X3NrYnVmZltpXSkgeworCQkJCWRldl9rZnJlZV9za2IodnAtPnR4X3NrYnVmZltpXSk7CisJCQkJdnAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqY29ya3NjcmV3X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjb3Jrc2NyZXdfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2cC0+bG9jaywgZmxhZ3MpOworCQl1cGRhdGVfc3RhdHMoZGV2LT5iYXNlX2FkZHIsIGRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwLT5sb2NrLCBmbGFncyk7CisJfQorCXJldHVybiAmdnAtPnN0YXRzOworfQorCisvKiAgVXBkYXRlIHN0YXRpc3RpY3MuCisJVW5saWtlIHdpdGggdGhlIEVMMyB3ZSBuZWVkIG5vdCB3b3JyeSBhYm91dCBpbnRlcnJ1cHRzIGNoYW5naW5nCisJdGhlIHdpbmRvdyBzZXR0aW5nIGZyb20gdW5kZXJuZWF0aCB1cywgYnV0IHdlIG11c3Qgc3RpbGwgZ3VhcmQKKwlhZ2FpbnN0IGEgcmFjZSBjb25kaXRpb24gd2l0aCBhIFN0YXRzVXBkYXRlIGludGVycnVwdCB1cGRhdGluZyB0aGUKKwl0YWJsZS4gIFRoaXMgaXMgZG9uZSBieSBjaGVja2luZyB0aGF0IHRoZSBBU00gKCEpIGNvZGUgZ2VuZXJhdGVkIHVzZXMKKwlhdG9taWMgdXBkYXRlcyB3aXRoICcrPScuCisJKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0cyhpbnQgaW9hZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjb3Jrc2NyZXdfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogVW5saWtlIHRoZSAzYzV4OSB3ZSBuZWVkIG5vdCB0dXJuIG9mZiBzdGF0cyB1cGRhdGVzIHdoaWxlIHJlYWRpbmcuICovCisJLyogU3dpdGNoIHRvIHRoZSBzdGF0cyB3aW5kb3csIGFuZCByZWFkIGV2ZXJ5dGhpbmcuICovCisJRUwzV0lORE9XKDYpOworCXZwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyArPSBpbmIoaW9hZGRyICsgMCk7CisJdnAtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMgKz0gaW5iKGlvYWRkciArIDEpOworCS8qIE11bHRpcGxlIGNvbGxpc2lvbnMuICovIGluYihpb2FkZHIgKyAyKTsKKwl2cC0+c3RhdHMuY29sbGlzaW9ucyArPSBpbmIoaW9hZGRyICsgMyk7CisJdnAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMgKz0gaW5iKGlvYWRkciArIDQpOworCXZwLT5zdGF0cy5yeF9maWZvX2Vycm9ycyArPSBpbmIoaW9hZGRyICsgNSk7CisJdnAtPnN0YXRzLnR4X3BhY2tldHMgKz0gaW5iKGlvYWRkciArIDYpOworCXZwLT5zdGF0cy50eF9wYWNrZXRzICs9IChpbmIoaW9hZGRyICsgOSkgJiAweDMwKSA8PCA0OworCQkJCQkJLyogUnggcGFja2V0cyAgICovIGluYihpb2FkZHIgKyA3KTsKKwkJCQkJCS8qIE11c3QgcmVhZCB0byBjbGVhciAqLworCS8qIFR4IGRlZmVycmFscyAqLyBpbmIoaW9hZGRyICsgOCk7CisJLyogRG9uJ3QgYm90aGVyIHdpdGggcmVnaXN0ZXIgOSwgYW4gZXh0ZW5zaW9uIG9mIHJlZ2lzdGVycyA2JjcuCisJICAgSWYgd2UgZG8gdXNlIHRoZSA2JjcgdmFsdWVzIHRoZSBhdG9taWMgdXBkYXRlIGFzc3VtcHRpb24gYWJvdmUKKwkgICBpcyBpbnZhbGlkLiAqLworCWludyhpb2FkZHIgKyAxMCk7CS8qIFRvdGFsIFJ4IGFuZCBUeCBvY3RldHMuICovCisJaW53KGlvYWRkciArIDEyKTsKKwkvKiBOZXc6IE9uIHRoZSBWb3J0ZXggd2UgbXVzdCBhbHNvIGNsZWFyIHRoZSBCYWRTU0QgY291bnRlci4gKi8KKwlFTDNXSU5ET1coNCk7CisJaW5iKGlvYWRkciArIDEyKTsKKworCS8qIFdlIGNoYW5nZSBiYWNrIHRvIHdpbmRvdyA3IChub3QgMSkgd2l0aCB0aGUgVm9ydGV4LiAqLworCUVMM1dJTkRPVyg3KTsKKwlyZXR1cm47Cit9CisKKy8qIFRoaXMgbmV3IHZlcnNpb24gb2Ygc2V0X3J4X21vZGUoKSBzdXBwb3J0cyB2MS40IGtlcm5lbHMuCisgICBUaGUgVm9ydGV4IGNoaXAgaGFzIG5vIGRvY3VtZW50ZWQgbXVsdGljYXN0IGZpbHRlciwgc28gdGhlIG9ubHkKKyAgIG11bHRpY2FzdCBzZXR0aW5nIGlzIHRvIHJlY2VpdmUgYWxsIG11bHRpY2FzdCBmcmFtZXMuICBBdCBsZWFzdAorICAgdGhlIGNoaXAgaGFzIGEgdmVyeSBjbGVhbiB3YXkgdG8gc2V0IHRoZSBtb2RlLCB1bmxpa2UgbWFueSBvdGhlcnMuICovCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzaG9ydCBuZXdfbW9kZTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJaWYgKGNvcmtzY3Jld19kZWJ1ZyA+IDMpCisJCQlwcmludGsoIiVzOiBTZXR0aW5nIHByb21pc2N1b3VzIG1vZGUuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCW5ld19tb2RlID0gU2V0UnhGaWx0ZXIgfCBSeFN0YXRpb24gfCBSeE11bHRpY2FzdCB8IFJ4QnJvYWRjYXN0IHwgUnhQcm9tOworCX0gZWxzZSBpZiAoKGRldi0+bWNfbGlzdCkgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCW5ld19tb2RlID0gU2V0UnhGaWx0ZXIgfCBSeFN0YXRpb24gfCBSeE11bHRpY2FzdCB8IFJ4QnJvYWRjYXN0OworCX0gZWxzZQorCQluZXdfbW9kZSA9IFNldFJ4RmlsdGVyIHwgUnhTdGF0aW9uIHwgUnhCcm9hZGNhc3Q7CisKKwlvdXR3KG5ld19tb2RlLCBpb2FkZHIgKyBFTDNfQ01EKTsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzcHJpbnRmKGluZm8tPmJ1c19pbmZvLCAiSVNBIDB4JWx4IiwgZGV2LT5iYXNlX2FkZHIpOworfQorCitzdGF0aWMgdTMyIG5ldGRldl9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gY29ya3NjcmV3X2RlYnVnOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBsZXZlbCkKK3sKKwljb3Jrc2NyZXdfZGVidWcgPSBsZXZlbDsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKKwkuZ2V0X21zZ2xldmVsCQk9IG5ldGRldl9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSBuZXRkZXZfc2V0X21zZ2xldmVsLAorfTsKKworDAorI2lmZGVmIE1PRFVMRQordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXdoaWxlICghbGlzdF9lbXB0eSgmcm9vdF9jb3Jrc2NyZXdfZGV2KSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCQlzdHJ1Y3QgY29ya3NjcmV3X3ByaXZhdGUgKnZwOworCisJCXZwID0gbGlzdF9lbnRyeShyb290X2NvcmtzY3Jld19kZXYubmV4dCwKKwkJCQlzdHJ1Y3QgY29ya3NjcmV3X3ByaXZhdGUsIGxpc3QpOworCQlkZXYgPSB2cC0+b3VyX2RldjsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJY2xlYW51cF9jYXJkKGRldik7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJfQorfQorI2VuZGlmCQkJCS8qIE1PRFVMRSAqLworDAorLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1jIDNjNTE1LmMiCisgKiAgYy1pbmRlbnQtbGV2ZWw6IDQKKyAqICB0YWItd2lkdGg6IDQKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MjMuYyBiL2RyaXZlcnMvbmV0LzNjNTIzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY2YjJmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0LzNjNTIzLmMKQEAgLTAsMCArMSwxMzIzIEBACisvKgorICAgbmV0LTMtZHJpdmVyIGZvciB0aGUgM2M1MjMgRXRoZXJsaW5rL01DIGNhcmQgKGk4MjU4NiBFdGhlcm5ldCBjaGlwKQorCisKKyAgIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBMaW51eCBvcGVyYXRpbmcgc3lzdGVtLCBhbmQgaXMgY292ZXJlZCBieSB0aGUKKyAgIHNhbWUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdGhhdCBjb3ZlcnMgdGhhdCB3b3JrLgorCisgICBDb3B5cmlnaHQgMTk5NSwgMTk5NiBieSBDaHJpcyBCZWF1cmVnYXJkIChjcGJlYXVyZUB1bmRlcmdyYWQubWF0aC51d2F0ZXJsb28uY2EpCisKKyAgIFRoaXMgaXMgYmFzaWNhbGx5IE1pY2hhZWwgSGlwcCdzIG5pNTIgZHJpdmVyLCB3aXRoIGEgbmV3IHByb2JpbmcKKyAgIGFsZ29yaXRobSBhbmQgc29tZSBtaW5vciBjaGFuZ2VzIHRvIHRoZSA4MjU4NiBDQSBhbmQgcmVzZXQgcm91dGluZXMuCisgICBUaGFua3MgYSBsb3QgTWljaGFlbCBmb3IgYSByZWFsbHkgY2xlYW4gaTgyNTg2IGltcGxlbWVudGF0aW9uISAgVW5sZXNzCisgICBvdGhlcndpc2UgZG9jdW1lbnRlZCBpbiBuaTUyLmMsIGFueSBidWdzIGFyZSBtaW5lLgorCisgICBDb250cmFyeSB0byB0aGUgRXRoZXJuZXQtSE9XVE8sIHRoaXMgaXNuJ3QgYmFzZWQgb24gdGhlIDNjNTA3IGRyaXZlciBpbgorICAgYW55IHdheS4gIFRoZSBuaTUyIGlzIGEgbG90IGVhc2llciB0byBtb2RpZnkuCisKKyAgIHNvdXJjZXM6CisgICBuaTUyLmMKKworICAgQ3J5bndyIHBhY2tldCBkcml2ZXIgY29sbGVjdGlvbiB3YXMgYSBncmVhdCByZWZlcmVuY2UgZm9yIG15IGZpcnN0CisgICBhdHRlbXB0IGF0IHRoaXMgc3Vja2VyLiAgVGhlIDNjNTA3IGRyaXZlciBhbHNvIGhlbHBlZCwgdW50aWwgSSBub3RpY2VkCisgICB0aGF0IG5pNTIuYyB3YXMgYSBsb3QgbmljZXIuCisKKyAgIEV0aGVyTGluay9NQzogTWljcm8gQ2hhbm5lbCBFdGhlcm5ldCBBZGFwdGVyIFRlY2huaWNhbCBSZWZlcmVuY2UKKyAgIE1hbnVhbCwgY291cnRlc3kgb2YgM0NvbSBDYXJkRmFjdHMsIGRvY3VtZW50cyB0aGUgM2M1MjMtc3BlY2lmaWMKKyAgIHN0dWZmLiAgSW5mb3JtYXRpb24gb24gQ2FyZEZhY3RzIGlzIGZvdW5kIGluIHRoZSBFdGhlcm5ldCBIT1dUTy4KKyAgIEFsc28gc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cuM2NvbS5jb20vIj4KKworICAgTWljcm9wcm9jZXNzb3IgQ29tbXVuaWNhdGlvbnMgU3VwcG9ydCBDaGlwcywgVC5KLiBCeWVycywgSVNCTgorICAgMC00NDQtMDEyMjQtOSwgaGFzIGEgc2VjdGlvbiBvbiB0aGUgaTgyNTg2LiAgSXQgdGVsbHMgeW91IGp1c3QgZW5vdWdoCisgICB0byBrbm93IHRoYXQgeW91IHJlYWxseSBkb24ndCB3YW50IHRvIGxlYXJuIGhvdyB0byBwcm9ncmFtIHRoZSBjaGlwLgorCisgICBUaGUgb3JpZ2luYWwgZGV2aWNlIHByb2JlIGNvZGUgd2FzIHN0b2xlbiBmcm9tIHBzMmVzZGkuYworCisgICBLbm93biBQcm9ibGVtczoKKyAgIFNpbmNlIG1vc3Qgb2YgdGhlIGNvZGUgd2FzIHN0b2xlbiBmcm9tIG5pNTIuYywgeW91J2xsIHJ1biBhY3Jvc3MgdGhlCisgICBzYW1lIGJ1Z3MgaW4gdGhlIDAuNjIgdmVyc2lvbiBvZiBuaTUyLmMsIHBsdXMgbWF5YmUgYSBmZXcgYmVjYXVzZSBvZgorICAgdGhlIDNjNTIzIGlkaW9zeW5jaGFjaWVzLiAgVGhlIDNjNTIzIGhhcyAxNksgb2YgUkFNIHRob3VnaCwgc28gdGhlcmUKKyAgIHNob3VsZG4ndCBiZSB0aGUgb3ZlcnJ1biBwcm9ibGVtIHRoYXQgdGhlIDhLIG5pNTIgaGFzLgorCisgICBUaGlzIGRyaXZlciBpcyBmb3IgYSAxNksgYWRhcHRlci4gIEl0IHNob3VsZCB3b3JrIGZpbmUgb24gdGhlIDY0SworICAgYWRhcHRlcnMsIGJ1dCBpdCB3aWxsIG9ubHkgdXNlIG9uZSBvZiB0aGUgNCBiYW5rcyBvZiBSQU0uICBNb2RpZnlpbmcKKyAgIHRoaXMgZm9yIHRoZSA2NEsgdmVyc2lvbiB3b3VsZCByZXF1aXJlIGEgbG90IG9mIGhlaW5vdXMgYmFuaworICAgc3dpdGNoaW5nLCB3aGljaCBJJ20gc3VyZSBub3QgaW50ZXJlc3RlZCBpbiBkb2luZy4gIElmIHlvdSB0cnkgdG8KKyAgIGltcGxlbWVudCBhIGJhbmsgc3dpdGNoaW5nIHZlcnNpb24sIHlvdSdsbCBiYXNpY2FsbHkgaGF2ZSB0byByZW1lbWJlcgorICAgd2hhdCBiYW5rIGlzIGVuYWJsZWQgYW5kIGRvIGEgc3dpdGNoIGV2ZXJ5dGltZSB5b3UgYWNjZXNzIGEgbWVtb3J5CisgICBsb2NhdGlvbiB0aGF0J3Mgbm90IGN1cnJlbnQuICBZb3UnbGwgYWxzbyBoYXZlIHRvIHJlbWFwIHBvaW50ZXJzIG9uCisgICB0aGUgZHJpdmVyIHNpZGUsIGJlY2F1c2UgaXQgb25seSBrbm93cyBhYm91dCAxNksgb2YgdGhlIG1lbW9yeS4KKyAgIEFueW9uZSBkZXNwZXJhdGUgb3IgbWFzb2NoaXN0aWMgZW5vdWdoIHRvIHRyeT8KKworICAgSXQgc2VlbXMgdG8gYmUgc3RhYmxlIG5vdyB3aGVuIG11bHRpcGxlIHRyYW5zbWl0IGJ1ZmZlcnMgYXJlIHVzZWQuICBJCisgICBjYW4ndCBzZWUgYW55IHBlcmZvcm1hbmNlIGRpZmZlcmVuY2UsIGJ1dCB0aGVuIEknbSB3b3JraW5nIG9uIGEgMzg2U1guCisKKyAgIE11bHRpY2FzdCBkb2Vzbid0IHdvcmsuICBJdCBkb2Vzbid0IGV2ZW4gcHJldGVuZCB0byB3b3JrLiAgRG9uJ3QgdXNlCisgICBpdC4gIERvbid0IGNvbXBpbGUgeW91ciBrZXJuZWwgd2l0aCBtdWx0aWNhc3Qgc3VwcG9ydC4gIEkgZG9uJ3Qga25vdworICAgd2h5LgorCisgICBGZWF0dXJlczoKKyAgIFRoaXMgZHJpdmVyIGlzIHVzZWFibGUgYXMgYSBsb2FkYWJsZSBtb2R1bGUuICBJZiB5b3UgdHJ5IHRvIHNwZWNpZnkgYW4KKyAgIElSUSBvciBhIElPIGFkZHJlc3MgKHZpYSBpbnNtb2QgM2M1MjMubyBpcnE9eHggaW89MHh5eXkpLCBpdCB3aWxsCisgICBzZWFyY2ggdGhlIE1DQSBzbG90cyB1bnRpbCBpdCBmaW5kcyBhIDNjNTIzIHdpdGggdGhlIHNwZWNpZmllZAorICAgcGFyYW1ldGVycy4KKworICAgVGhpcyBkcml2ZXIgZG9lcyBzdXBwb3J0IG11bHRpcGxlIGV0aGVybmV0IGNhcmRzIHdoZW4gdXNlZCBhcyBhIG1vZHVsZQorICAgKHVwIHRvIE1BWF8zQzUyM19DQVJEUywgdGhlIGRlZmF1bHQgYmVpbmcgNCkKKworICAgVGhpcyBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBib3RoIEJOQyBhbmQgVFAgdmVyc2lvbnMsIGludGVybmFsIGFuZAorICAgZXh0ZXJuYWwgdHJhbnNjZWl2ZXJzLiAgSGF2ZW4ndCB0ZXN0ZWQgd2l0aCB0aGUgNjRLIHZlcnNpb24gKHRoYXQgSQorICAga25vdyBvZikuCisKKyAgIEhpc3Rvcnk6CisgICBKYW4gMXN0LCAxOTk2CisgICBmaXJzdCBwdWJsaWMgcmVsZWFzZQorICAgRmViIDR0aCwgMTk5NgorICAgdXBkYXRlIHRvIDEuMy41OSwgaW5jb3Jwb3JhdGVkIG11bHRpY2FzdCBkaWZmcyBmcm9tIG5pNTIuYworICAgRmViIDE1dGgsIDE5OTYKKyAgIGFkZGVkIHNoYXJlZCBpcnEgc3VwcG9ydAorICAgQXByIDE5OTkKKyAgIGFkZGVkIHN1cHBvcnQgZm9yIG11bHRpcGxlIGNhcmRzIHdoZW4gdXNlZCBhcyBhIG1vZHVsZQorICAgYWRkZWQgb3B0aW9uIHRvIGRpc2FibGUgbXVsdGljYXN0IGFzIGlzIGNhdXNlcyBwcm9ibGVtcworICAgICAgIEdhbmVzaCBTaXR0YW1wYWxhbSA8Z2FuZXNoLnNpdHRhbXBhbGFtQG1hZ2RhbGVuLm94Zm9yZC5hYy51az4KKyAgICAgICBTdHVhcnQgQWRhbXNvbiA8c3R1YXJ0LmFkYW1zb25AY29tcHNvYy5uZXQ+CisgICBOb3YgMjAwMQorICAgYWRkZWQgc3VwcG9ydCBmb3IgZXRodG9vbCAoamdhcnppaykKKwkKKyAgICRIZWFkZXI6IC9mc3lzMi9ob21lL2NocmlzYi9saW51eC0xLjMuNTktTUNBL2RyaXZlcnMvbmV0L1JDUy8zYzUyMy5jLHYgMS4xIDE5OTYvMDIvMDUgMDE6NTM6NDYgY2hyaXNiIEV4cCBjaHJpc2IgJAorICovCisKKyNkZWZpbmUgRFJWX05BTUUJCSIzYzUyMyIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JCSIxNy1Ob3YtMjAwMSIKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbWNhLWxlZ2FjeS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAiM2M1MjMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIERFQlVHCQkJLyogZGVidWcgb24gKi8KKyNkZWZpbmUgU1lTQlVTVkFMIDAJCS8qIDEgPSA4IEJpdCwgMCA9IDE2IGJpdCAtIDNjNTIzIG9ubHkgZG9lcyAxNiBiaXQgKi8KKyN1bmRlZiBFTE1DX01VTFRJQ0FTVAkJLyogRGlzYWJsZSBtdWx0aWNhc3Qgc3VwcG9ydCBhcyBpdCBpcyBzb21ld2hhdCBzZXJpb3VzbHkgYnJva2VuIGF0IHRoZSBtb21lbnQgKi8KKworI2RlZmluZSBtYWtlMzIocHRyMTYpIChwLT5tZW10b3AgKyAoc2hvcnQpIChwdHIxNikgKQorI2RlZmluZSBtYWtlMjQocHRyMzIpICgoY2hhciAqKSAocHRyMzIpIC0gcC0+YmFzZSkKKyNkZWZpbmUgbWFrZTE2KHB0cjMyKSAoKHVuc2lnbmVkIHNob3J0KSAoKHVuc2lnbmVkIGxvbmcpIChwdHIzMikgLSAodW5zaWduZWQgbG9uZykgcC0+bWVtdG9wICkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAgIFRhYmxlcyB0byB3aGljaCB3ZSBjYW4gbWFwIHZhbHVlcyBpbiB0aGUgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCisgKi8KK3N0YXRpYyBpbnQgaXJxX3RhYmxlW10gX19pbml0ZGF0YSA9IHsKKwkxMiwgNywgMywgOQorfTsKKworc3RhdGljIGludCBjc3JfdGFibGVbXSBfX2luaXRkYXRhID0geworCTB4MzAwLCAweDEzMDAsIDB4MjMwMCwgMHgzMzAwCit9OworCitzdGF0aWMgaW50IHNobV90YWJsZVtdIF9faW5pdGRhdGEgPSB7CisJMHgwYzAwMDAsIDB4MGM4MDAwLCAweDBkMDAwMCwgMHgwZDgwMDAKK307CisKKy8qKioqKioqKioqKioqKioqKioqIGhvdyB0byBjYWxjdWxhdGUgdGhlIGJ1ZmZlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCisgICogSU1QT1JUQU5UIE5PVEU6IGlmIHlvdSBjb25maWd1cmUgb25seSBvbmUgTlVNX1hNSVRfQlVGRlMsIHRoZSBkcml2ZXIgd29ya3MKKyAgKiAtLS0tLS0tLS0tLS0tLS0gaW4gYSBkaWZmZXJlbnQgKG1vcmUgc3RhYmxlPykgbW9kZS4gT25seSBpbiB0aGlzIG1vZGUgaXQncworICAqICAgICAgICAgICAgICAgICBwb3NzaWJsZSB0byBjb25maWd1cmUgdGhlIGRyaXZlciB3aXRoICdOT19OT1BDT01NQU5EUycKKworc2l6ZW9mKHNjcCk9MTI7IHNpemVvZihzY2IpPTE2OyBzaXplb2YoaXNjcCk9ODsKK3NpemVvZihzY3ApK3NpemVvZihpc2NwKStzaXplb2Yoc2NiKSA9IDM2ID0gSU5JVAorc2l6ZW9mKHJmZCkgPSAyNDsgc2l6ZW9mKHJiZCkgPSAxMjsKK3NpemVvZih0YmQpID0gODsgc2l6ZW9mKHRyYW5zbWl0X2NtZCkgPSAxNjsKK3NpemVvZihub3BfY21kKSA9IDg7CisKKyAgKiBpZiB5b3UgZG9uJ3Qga25vdyB0aGUgZHJpdmVyLCBiZXR0ZXIgZG8gbm90IGNoYW5nZSB0aGlzIHZhbHVlczogKi8KKworI2RlZmluZSBSRUNWX0JVRkZfU0laRSAxNTI0CS8qIHNsaWdodGx5IG92ZXJzaXplZCAqLworI2RlZmluZSBYTUlUX0JVRkZfU0laRSAxNTI0CS8qIHNsaWdodGx5IG92ZXJzaXplZCAqLworI2RlZmluZSBOVU1fWE1JVF9CVUZGUyAxCS8qIGNvbmZpZyBmb3IgYm90aCwgOEsgYW5kIDE2SyBzaG1lbSAqLworI2RlZmluZSBOVU1fUkVDVl9CVUZGU184ICA0CS8qIGNvbmZpZyBmb3IgOEsgc2hhcmVkIG1lbSAqLworI2RlZmluZSBOVU1fUkVDVl9CVUZGU18xNiA5CS8qIGNvbmZpZyBmb3IgMTZLIHNoYXJlZCBtZW0gKi8KKworI2lmIChOVU1fWE1JVF9CVUZGUyA9PSAxKQorI2RlZmluZSBOT19OT1BDT01NQU5EUwkJLyogb25seSBwb3NzaWJsZSB3aXRoIE5VTV9YTUlUX0JVRkZTPTEgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgREVMQVkoeCkgeyBtZGVsYXkoMzIgKiB4KTsgfQorCisvKiBhIG11Y2ggc2hvcnRlciBkZWxheTogKi8KKyNkZWZpbmUgREVMQVlfMTYoKTsgeyB1ZGVsYXkoMTYpIDsgfQorCisvKiB3YWl0IGZvciBjb21tYW5kIHdpdGggdGltZW91dDogKi8KKyNkZWZpbmUgV0FJVF80X1NDQl9DTUQoKSB7IGludCBpOyBcCisgIGZvcihpPTA7aTwxMDI0O2krKykgeyBcCisgICAgaWYoIXAtPnNjYi0+Y21kKSBicmVhazsgXAorICAgIERFTEFZXzE2KCk7IFwKKyAgICBpZihpID09IDEwMjMpIHsgXAorICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6JWQ6IHNjYl9jbWQgdGltZWQgb3V0IC4uIHJlc2V0dGluZyBpODI1ODZcbiIsXAorICAgICAgCWRldi0+bmFtZSxfX0xJTkVfXyk7IFwKKyAgICAgIGVsbWNfaWRfcmVzZXQ1ODYoKTsgfSB9IH0KKworc3RhdGljIGlycXJldHVybl90IGVsbWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ19wdHIpOworc3RhdGljIGludCBlbG1jX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGVsbWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGVsbWNfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVsbWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWxtY190aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2lmZGVmIEVMTUNfTVVMVElDQVNUCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOworCisvKiBoZWxwZXItZnVuY3Rpb25zICovCitzdGF0aWMgaW50IGluaXQ1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGNoZWNrNTg2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgd2hlcmUsIHVuc2lnbmVkIHNpemUpOworc3RhdGljIHZvaWQgYWxsb2M1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzdGFydHJlY3Y1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAqYWxsb2NfcmZhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnB0cik7CitzdGF0aWMgdm9pZCBlbG1jX3Jjdl9pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlbG1jX3htdF9pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlbG1jX3Jucl9pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0cnVjdCBwcml2IHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisJY2hhciAqbWVtdG9wOworCXVuc2lnbmVkIGxvbmcgbWFwcGVkX3N0YXJ0OwkJLyogU3RhcnQgb2YgaW9yZW1hcCAqLworCXZvbGF0aWxlIHN0cnVjdCByZmRfc3RydWN0ICpyZmRfbGFzdCwgKnJmZF90b3AsICpyZmRfZmlyc3Q7CisJdm9sYXRpbGUgc3RydWN0IHNjcF9zdHJ1Y3QgKnNjcDsJLyogdm9sYXRpbGUgaXMgaW1wb3J0YW50ICovCisJdm9sYXRpbGUgc3RydWN0IGlzY3Bfc3RydWN0ICppc2NwOwkvKiB2b2xhdGlsZSBpcyBpbXBvcnRhbnQgKi8KKwl2b2xhdGlsZSBzdHJ1Y3Qgc2NiX3N0cnVjdCAqc2NiOwkvKiB2b2xhdGlsZSBpcyBpbXBvcnRhbnQgKi8KKwl2b2xhdGlsZSBzdHJ1Y3QgdGJkX3N0cnVjdCAqeG1pdF9idWZmc1tOVU1fWE1JVF9CVUZGU107CisjaWYgKE5VTV9YTUlUX0JVRkZTID09IDEpCisJdm9sYXRpbGUgc3RydWN0IHRyYW5zbWl0X2NtZF9zdHJ1Y3QgKnhtaXRfY21kc1syXTsKKwl2b2xhdGlsZSBzdHJ1Y3Qgbm9wX2NtZF9zdHJ1Y3QgKm5vcF9jbWRzWzJdOworI2Vsc2UKKwl2b2xhdGlsZSBzdHJ1Y3QgdHJhbnNtaXRfY21kX3N0cnVjdCAqeG1pdF9jbWRzW05VTV9YTUlUX0JVRkZTXTsKKwl2b2xhdGlsZSBzdHJ1Y3Qgbm9wX2NtZF9zdHJ1Y3QgKm5vcF9jbWRzW05VTV9YTUlUX0JVRkZTXTsKKyNlbmRpZgorCXZvbGF0aWxlIGludCBub3BfcG9pbnQsIG51bV9yZWN2X2J1ZmZzOworCXZvbGF0aWxlIGNoYXIgKnhtaXRfY2J1ZmZzW05VTV9YTUlUX0JVRkZTXTsKKwl2b2xhdGlsZSBpbnQgeG1pdF9jb3VudCwgeG1pdF9sYXN0OworCXZvbGF0aWxlIGludCBzbG90OworfTsKKworI2RlZmluZSBlbG1jX2F0dG41ODYoKSAge2VsbWNfZG9fYXR0bjU4NihkZXYtPmJhc2VfYWRkcixFTE1DX0NUUkxfSU5URSk7fQorI2RlZmluZSBlbG1jX3Jlc2V0NTg2KCkge2VsbWNfZG9fcmVzZXQ1ODYoZGV2LT5iYXNlX2FkZHIsRUxNQ19DVFJMX0lOVEUpO30KKworLyogd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIC0gdGhpcyB3aWxsIGNsZWFyIHRoZSBpbnRlcnJ1cHQgYml0IGluIHRoZQorICAgM2M1MjMgY29udHJvbCByZWdpc3RlciwgYW5kIHdvbid0IHB1dCBpdCBiYWNrLiAgVGhpcyBlZmZlY3RpdmVseQorICAgZGlzYWJsZXMgaW50ZXJydXB0cyBvbiB0aGUgY2FyZC4gKi8KKyNkZWZpbmUgZWxtY19pZF9hdHRuNTg2KCkgIHtlbG1jX2RvX2F0dG41ODYoZGV2LT5iYXNlX2FkZHIsMCk7fQorI2RlZmluZSBlbG1jX2lkX3Jlc2V0NTg2KCkge2VsbWNfZG9fcmVzZXQ1ODYoZGV2LT5iYXNlX2FkZHIsMCk7fQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgICBEbyBhIENoYW5uZWwgQXR0ZW50aW9uIG9uIHRoZSAzYzUyMy4gIFRoaXMgaXMgZXh0cmVtZWx5IGJvYXJkIGRlcGVuZGVudC4KKyAqLworc3RhdGljIHZvaWQgZWxtY19kb19hdHRuNTg2KGludCBpb2FkZHIsIGludCBpbnRzKQoreworCS8qIHRoZSAzYzUyMyByZXF1aXJlcyBhIG1pbmltdW0gb2YgNTAwIG5zLiAgVGhlIGRlbGF5cyBoZXJlIG1pZ2h0IGJlCisJICAgYSBsaXR0bGUgdG9vIGxhcmdlLCBhbmQgaGVuY2UgdGhleSBtYXkgY3V0IHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUKKwkgICBjYXJkIHNsaWdodGx5LiAgSWYgc29tZW9uZSB3aG8ga25vd3MgYSBsaXR0bGUgbW9yZSBhYm91dCBMaW51eAorCSAgIHRpbWluZyB3b3VsZCBjYXJlIHRvIHBsYXkgd2l0aCB0aGVzZSwgSSdkIGFwcHJlY2lhdGUgaXQuICovCisKKwkvKiB0aGlzIGJpdCBtYXNraW5nIHN0dWZmIGlzIGNyYXAuICBJJ2QgcmF0aGVyIGhhdmUgc2VwYXJhdGUKKwkgICByZWdpc3RlcnMgd2l0aCBzdHJvYmUgdHJpZ2dlcnMgZm9yIGVhY2ggb2YgdGhlc2UgZnVuY3Rpb25zLiAgPHNpZ2g+CisJICAgWWEgdGFrZSB3aGF0IHlhIGdvdC4gKi8KKworCW91dGIoRUxNQ19DVFJMX1JTVCB8IDB4MyB8IEVMTUNfQ1RSTF9DQSB8IGludHMsIGlvYWRkciArIEVMTUNfQ1RSTCk7CisJREVMQVlfMTYoKTsJCS8qID4gNTAwIG5zICovCisJb3V0YihFTE1DX0NUUkxfUlNUIHwgMHgzIHwgaW50cywgaW9hZGRyICsgRUxNQ19DVFJMKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICAgUmVzZXQgdGhlIDgyNTg2IG9uIHRoZSAzYzUyMy4gIEFsc28gdmVyeSBib2FyZCBkZXBlbmRlbnQuCisgKi8KK3N0YXRpYyB2b2lkIGVsbWNfZG9fcmVzZXQ1ODYoaW50IGlvYWRkciwgaW50IGludHMpCit7CisJLyogdG9nZ2xlIHRoZSBSU1QgYml0IGxvdyB0aGVuIGhpZ2ggKi8KKwlvdXRiKDB4MyB8IEVMTUNfQ1RSTF9MQkssIGlvYWRkciArIEVMTUNfQ1RSTCk7CisJREVMQVlfMTYoKTsJCS8qID4gNTAwIG5zICovCisJb3V0YihFTE1DX0NUUkxfUlNUIHwgRUxNQ19DVFJMX0xCSyB8IDB4MywgaW9hZGRyICsgRUxNQ19DVFJMKTsKKworCWVsbWNfZG9fYXR0bjU4Nihpb2FkZHIsIGludHMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2xvc2UgZGV2aWNlCisgKi8KKworc3RhdGljIGludCBlbG1jX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCWVsbWNfaWRfcmVzZXQ1ODYoKTsJLyogdGhlIGhhcmQgd2F5IHRvIHN0b3AgdGhlIHJlY2VpdmVyICovCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBvcGVuIGRldmljZQorICovCisKK3N0YXRpYyBpbnQgZWxtY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKworCWVsbWNfaWRfYXR0bjU4NigpOwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKworCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmZWxtY19pbnRlcnJ1cHQsIFNBX1NISVJRIHwgU0FfU0FNUExFX1JBTkRPTSwKKwkJCSAgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGRuJ3QgZ2V0IGlycSAlZFxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCWVsbWNfaWRfcmVzZXQ1ODYoKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJYWxsb2M1ODYoZGV2KTsKKwlpbml0NTg2KGRldik7CisJc3RhcnRyZWN2NTg2KGRldik7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsJCS8qIG1vc3QgZG9uZSBieSBpbml0ICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDaGVjayB0byBzZWUgaWYgdGhlcmUncyBhbiA4MjU4NiBvdXQgdGhlcmUuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgY2hlY2s1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyB3aGVyZSwgdW5zaWduZWQgc2l6ZSkKK3sKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisJY2hhciAqaXNjcF9hZGRyc1syXTsKKwlpbnQgaSA9IDA7CisKKwlwLT5iYXNlID0gKHVuc2lnbmVkIGxvbmcpIGlzYV9idXNfdG9fdmlydCgodW5zaWduZWQgbG9uZyl3aGVyZSkgKyBzaXplIC0gMHgwMTAwMDAwMDsKKwlwLT5tZW10b3AgPSBpc2FfYnVzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpd2hlcmUpICsgc2l6ZTsKKwlwLT5zY3AgPSAoc3RydWN0IHNjcF9zdHJ1Y3QgKikocC0+YmFzZSArIFNDUF9ERUZBVUxUX0FERFJFU1MpOworCW1lbXNldCgoY2hhciAqKSBwLT5zY3AsIDAsIHNpemVvZihzdHJ1Y3Qgc2NwX3N0cnVjdCkpOworCXAtPnNjcC0+c3lzYnVzID0gU1lTQlVTVkFMOwkvKiAxID0gOEJpdC1CdXMsIDAgPSAxNiBCaXQgKi8KKworCWlzY3BfYWRkcnNbMF0gPSBpc2FfYnVzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpd2hlcmUpOworCWlzY3BfYWRkcnNbMV0gPSAoY2hhciAqKSBwLT5zY3AgLSBzaXplb2Yoc3RydWN0IGlzY3Bfc3RydWN0KTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJcC0+aXNjcCA9IChzdHJ1Y3QgaXNjcF9zdHJ1Y3QgKikgaXNjcF9hZGRyc1tpXTsKKwkJbWVtc2V0KChjaGFyICopIHAtPmlzY3AsIDAsIHNpemVvZihzdHJ1Y3QgaXNjcF9zdHJ1Y3QpKTsKKworCQlwLT5zY3AtPmlzY3AgPSBtYWtlMjQocC0+aXNjcCk7CisJCXAtPmlzY3AtPmJ1c3kgPSAxOworCisJCWVsbWNfaWRfcmVzZXQ1ODYoKTsKKworCQkvKiByZXNldDU4NiBkb2VzIGFuIGltcGxpY2l0IENBICovCisKKwkJLyogYXBwYXJlbnRseSwgeW91IHNvbWV0aW1lcyBoYXZlIHRvIGtpY2sgdGhlIDgyNTg2IHR3aWNlLi4uICovCisJCWVsbWNfaWRfYXR0bjU4NigpOworCQlERUxBWSgxKTsKKworCQlpZiAocC0+aXNjcC0+YnVzeSkgewkvKiBpODI1ODYgY2xlYXJzICdidXN5JyBhZnRlciBzdWNjZXNzZnVsIGluaXQgKi8KKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzZXQgaXNjcCBhdCB0aGUgcmlnaHQgcGxhY2UsIGNhbGxlZCBieSBlbG1jX3Byb2JlIGFuZCBvcGVuNTg2LgorICovCisKK3ZvaWQgYWxsb2M1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwllbG1jX2lkX3Jlc2V0NTg2KCk7CisJREVMQVkoMik7CisKKwlwLT5zY3AgPSAoc3RydWN0IHNjcF9zdHJ1Y3QgKikgKHAtPmJhc2UgKyBTQ1BfREVGQVVMVF9BRERSRVNTKTsKKwlwLT5zY2IgPSAoc3RydWN0IHNjYl9zdHJ1Y3QgKikgaXNhX2J1c190b192aXJ0KGRldi0+bWVtX3N0YXJ0KTsKKwlwLT5pc2NwID0gKHN0cnVjdCBpc2NwX3N0cnVjdCAqKSAoKGNoYXIgKikgcC0+c2NwIC0gc2l6ZW9mKHN0cnVjdCBpc2NwX3N0cnVjdCkpOworCisJbWVtc2V0KChjaGFyICopIHAtPmlzY3AsIDAsIHNpemVvZihzdHJ1Y3QgaXNjcF9zdHJ1Y3QpKTsKKwltZW1zZXQoKGNoYXIgKikgcC0+c2NwLCAwLCBzaXplb2Yoc3RydWN0IHNjcF9zdHJ1Y3QpKTsKKworCXAtPnNjcC0+aXNjcCA9IG1ha2UyNChwLT5pc2NwKTsKKwlwLT5zY3AtPnN5c2J1cyA9IFNZU0JVU1ZBTDsKKwlwLT5pc2NwLT5zY2Jfb2Zmc2V0ID0gbWFrZTE2KHAtPnNjYik7CisKKwlwLT5pc2NwLT5idXN5ID0gMTsKKwllbG1jX2lkX3Jlc2V0NTg2KCk7CisJZWxtY19pZF9hdHRuNTg2KCk7CisKKwlERUxBWSgyKTsKKworCWlmIChwLT5pc2NwLT5idXN5KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEluaXQtUHJvYmxlbXMgKGFsbG9jKS5cbiIsIGRldi0+bmFtZSk7CisJfQorCW1lbXNldCgoY2hhciAqKSBwLT5zY2IsIDAsIHNpemVvZihzdHJ1Y3Qgc2NiX3N0cnVjdCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgZWxtY19nZXRpbmZvKGNoYXIgKmJ1ZiwgaW50IHNsb3QsIHZvaWQgKmQpCit7CisJaW50IGxlbiA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkOworCWludCBpOworCisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gbGVuOworCisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiUmV2aXNpb246IDB4JXhcbiIsCisJCSAgICAgICBpbmIoZGV2LT5iYXNlX2FkZHIgKyBFTE1DX1JFVklTSU9OKSAmIDB4Zik7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiSVJROiAlZFxuIiwgZGV2LT5pcnEpOworCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIklPIEFkZHJlc3M6ICUjbHgtJSNseFxuIiwgZGV2LT5iYXNlX2FkZHIsCisJCSAgICAgICBkZXYtPmJhc2VfYWRkciArIEVMTUNfSU9fRVhURU5UKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJNZW1vcnk6ICUjbHgtJSNseFxuIiwgZGV2LT5tZW1fc3RhcnQsCisJCSAgICAgICBkZXYtPm1lbV9lbmQgLSAxKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJUcmFuc2NlaXZlcjogJXNcbiIsIGRldi0+aWZfcG9ydCA/CisJCSAgICAgICAiRXh0ZXJuYWwiIDogIkludGVybmFsIik7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiRGV2aWNlOiAlc1xuIiwgZGV2LT5uYW1lKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJIYXJkd2FyZSBBZGRyZXNzOiIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiICUwMngiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwl9CisJYnVmW2xlbisrXSA9ICdcbic7CisJYnVmW2xlbl0gPSAwOworCisJcmV0dXJuIGxlbjsKK30JCQkJLyogZWxtY19nZXRpbmZvKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9faW5pdCBkb19lbG1jX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RhdGljIGludCBzbG90OworCWludCBiYXNlX2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaXJxID0gZGV2LT5pcnE7CisJdV9jaGFyIHN0YXR1cyA9IDA7CisJdV9jaGFyIHJldmlzaW9uID0gMDsKKwlpbnQgaSA9IDA7CisJdW5zaWduZWQgaW50IHNpemUgPSAwOworCWludCByZXR2YWw7CisJc3RydWN0IHByaXYgKnByID0gZGV2LT5wcml2OworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWlmIChNQ0FfYnVzID09IDApIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qIHNlYXJjaCB0aHJvdWdoIHRoZSBzbG90cyBmb3IgdGhlIDNjNTIzLiAqLworCXNsb3QgPSBtY2FfZmluZF9hZGFwdGVyKEVMTUNfTUNBX0lELCAwKTsKKwl3aGlsZSAoc2xvdCAhPSAtMSkgeworCQlzdGF0dXMgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDIpOworCisJCWRldi0+aXJxPWlycV90YWJsZVsoc3RhdHVzICYgRUxNQ19TVEFUVVNfSVJRX1NFTEVDVCkgPj4gNl07CisJCWRldi0+YmFzZV9hZGRyPWNzcl90YWJsZVsoc3RhdHVzICYgRUxNQ19TVEFUVVNfQ1NSX1NFTEVDVCkgPj4gMV07CisJCQorCQkvKgorCQkgICBJZiB3ZSdyZSB0cnlpbmcgdG8gbWF0Y2ggYSBzcGVjaWZpZWQgaXJxIG9yIElPIGFkZHJlc3MsCisJCSAgIHdlJ2xsIHJlamVjdCBhIG1hdGNoIHVubGVzcyBpdCdzIHdoYXQgd2UncmUgbG9va2luZyBmb3IuCisJCSAgIEFsc28gcmVqZWN0IGl0IGlmIHRoZSBjYXJkIGlzIGFscmVhZHkgaW4gdXNlLgorCQkgKi8KKworCQlpZiAoKGlycSAmJiBpcnEgIT0gZGV2LT5pcnEpIHx8IAorCQkgICAgKGJhc2VfYWRkciAmJiBiYXNlX2FkZHIgIT0gZGV2LT5iYXNlX2FkZHIpKSB7CisJCQlzbG90ID0gbWNhX2ZpbmRfYWRhcHRlcihFTE1DX01DQV9JRCwgc2xvdCArIDEpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRUxNQ19JT19FWFRFTlQsIERSVl9OQU1FKSkgeworCQkJc2xvdCA9IG1jYV9maW5kX2FkYXB0ZXIoRUxNQ19NQ0FfSUQsIHNsb3QgKyAxKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogZm91bmQgd2hhdCB3ZSdyZSBsb29raW5nIGZvci4uLiAqLworCQlicmVhazsKKwl9CisKKwkvKiB3ZSBkaWRuJ3QgZmluZCBhbnkgM2M1MjMgaW4gdGhlIHNsb3RzIHdlIGNoZWNrZWQgZm9yICovCisJaWYgKHNsb3QgPT0gTUNBX05PVEZPVU5EKQorCQlyZXR1cm4gKChiYXNlX2FkZHIgfHwgaXJxKSA/IC1FTlhJTyA6IC1FTk9ERVYpOworCisJbWNhX3NldF9hZGFwdGVyX25hbWUoc2xvdCwgIjNDb20gM2M1MjMgRXRoZXJsaW5rL01DIik7CisJbWNhX3NldF9hZGFwdGVyX3Byb2NmbihzbG90LCAoTUNBX1Byb2NGbikgZWxtY19nZXRpbmZvLCBkZXYpOworCisJLyogaWYgd2UgZ2V0IHRoaXMgZmFyLCBhZGFwdGVyIGhhcyBiZWVuIGZvdW5kIC0gY2Fycnkgb24gKi8KKwlwcmludGsoS0VSTl9JTkZPICIlczogM2M1MjMgYWRhcHRlciBmb3VuZCBpbiBzbG90ICVkXG4iLCBkZXYtPm5hbWUsIHNsb3QgKyAxKTsKKworCS8qIE5vdyB3ZSBleHRyYWN0IGNvbmZpZ3VyYXRpb24gaW5mbyBmcm9tIHRoZSBjYXJkLgorCSAgIFRoZSAzYzUyMyBwcm92aWRlcyBpbmZvcm1hdGlvbiBpbiB0d28gb2YgdGhlIFBPUyByZWdpc3RlcnMsIGJ1dAorCSAgIHRoZSBzZWNvbmQgb25lIGlzIG9ubHkgbmVlZGVkIGlmIHdlIHdhbnQgdG8gdGVsbCB0aGUgY2FyZCB3aGF0IElSUQorCSAgIHRvIHVzZS4gIEkgc3VzcGVjdCB0aGF0IHdob2V2ZXIgc2V0cyB0aGUgdGhpbmcgdXAgaW5pdGlhbGx5IHdvdWxkCisJICAgcHJlZmVyIHdlIGRvbid0IHNjcmV3IHdpdGggdGhvc2UgdGhpbmdzLgorCisJICAgTm90ZSB0aGF0IHdlIHJlYWQgdGhlIHN0YXR1cyBpbmZvIHdoZW4gd2UgZm91bmQgdGhlIGNhcmQuLi4KKworCSAgIFNlZSAzYzUyMy5oIGZvciBtb3JlIGRldGFpbHMuCisJICovCisKKwkvKiByZXZpc2lvbiBpcyBzdG9yZWQgaW4gdGhlIGZpcnN0IDQgYml0cyBvZiB0aGUgcmV2aXNpb24gcmVnaXN0ZXIgKi8KKwlyZXZpc2lvbiA9IGluYihkZXYtPmJhc2VfYWRkciArIEVMTUNfUkVWSVNJT04pICYgMHhmOworCisJLyogYWNjb3JkaW5nIHRvIGRvY3MsIHdlIHJlYWQgdGhlIGludGVycnVwdCBhbmQgd3JpdGUgaXQgYmFjayB0bworCSAgIHRoZSBJUlEgc2VsZWN0IHJlZ2lzdGVyLCBzaW5jZSB0aGUgUE9TVCBtaWdodCBub3QgY29uZmlndXJlIHRoZSBJUlEKKwkgICBwcm9wZXJseS4gKi8KKwlzd2l0Y2ggKGRldi0+aXJxKSB7CisJY2FzZSAzOgorCQltY2Ffd3JpdGVfcG9zKHNsb3QsIDMsIDB4MDQpOworCQlicmVhazsKKwljYXNlIDc6CisJCW1jYV93cml0ZV9wb3Moc2xvdCwgMywgMHgwMik7CisJCWJyZWFrOworCWNhc2UgOToKKwkJbWNhX3dyaXRlX3BvcyhzbG90LCAzLCAweDA4KTsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJbWNhX3dyaXRlX3BvcyhzbG90LCAzLCAweDAxKTsKKwkJYnJlYWs7CisJfQorCisJbWVtc2V0KHByLCAwLCBzaXplb2Yoc3RydWN0IHByaXYpKTsKKwlwci0+c2xvdCA9IHNsb3Q7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogM0NvbSAzYzUyMyBSZXYgMHgleCBhdCAlI2x4XG4iLCBkZXYtPm5hbWUsIChpbnQpIHJldmlzaW9uLAorCSAgICAgICBkZXYtPmJhc2VfYWRkcik7CisKKwkvKiBEZXRlcm1pbmUgaWYgd2UncmUgdXNpbmcgdGhlIG9uLWJvYXJkIHRyYW5zY2VpdmVyIChpLmUuIGNvYXgpIG9yCisJICAgYW4gZXh0ZXJuYWwgb25lLiAgVGhlIGluZm9ybWF0aW9uIGlzIHByZXR0eSBtdWNoIHVzZWxlc3MsIGJ1dCBJCisJICAgZ3Vlc3MgaXQncyB3b3J0aCBicm93bmllIHBvaW50cy4gKi8KKwlkZXYtPmlmX3BvcnQgPSAoc3RhdHVzICYgRUxNQ19TVEFUVVNfRElTQUJMRV9USElOKTsKKworCS8qIFRoZSAzYzUyMyBoYXMgYSAyNEsgY2h1bmsgb2YgbWVtb3J5LiAgVGhlIGZpcnN0IDE2SyBpcyB0aGUKKwkgICBzaGFyZWQgbWVtb3J5LCB3aGlsZSB0aGUgbGFzdCA4SyBpcyBmb3IgdGhlIEV0aGVyU3RhcnQgQklPUyBST00uCisJICAgV2hpY2ggd2UgZG9uJ3QgY2FyZSBtdWNoIGFib3V0IGhlcmUuICBXZSdsbCBqdXN0IHRlbGwgTGludXggdGhhdAorCSAgIHdlJ3JlIHVzaW5nIDE2Sy4gIE1DQSB3b24ndCBwZXJtaXQgYWRkcmVzcyBzcGFjZSBjb25mbGljdHMgY2F1c2VkCisJICAgYnkgbm90IG1hcHBpbmcgdGhlIG90aGVyIDhLLiAqLworCWRldi0+bWVtX3N0YXJ0ID0gc2htX3RhYmxlWyhzdGF0dXMgJiBFTE1DX1NUQVRVU19NRU1PUllfU0VMRUNUKSA+PiAzXTsKKworCS8qIFdlJ3JlIHVzaW5nIE1DQSwgc28gaXQncyBhIGdpdmVuIHRoYXQgdGhlIGluZm9ybWF0aW9uIGFib3V0IG1lbW9yeQorCSAgIHNpemUgaXMgY29ycmVjdC4gIFRoZSBDcnlud3IgZHJpdmVycyBkbyBzb21ldGhpbmcgbGlrZSB0aGlzLiAqLworCisJZWxtY19pZF9yZXNldDU4NigpOwkvKiBzZWVtcyBsaWtlIGEgZ29vZCBpZGVhIGJlZm9yZSBjaGVja2luZyBpdC4uLiAqLworCisJc2l6ZSA9IDB4NDAwMDsJCS8qIGNoZWNrIGZvciAxNksgbWVtICovCisJaWYgKCFjaGVjazU4NihkZXYsIGRldi0+bWVtX3N0YXJ0LCBzaXplKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtZW1wcm9iZSwgQ2FuJ3QgZmluZCBtZW1vcnkgYXQgMHglbHghXG4iLCBkZXYtPm5hbWUsCisJCSAgICAgICBkZXYtPm1lbV9zdGFydCk7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyBzaXplOwkvKiBzZXQgbWVtX2VuZCBzaG93ZWQgYnkgJ2lmY29uZmlnJyAqLworCisJcHItPm1lbXRvcCA9IGlzYV9idXNfdG9fdmlydChkZXYtPm1lbV9zdGFydCkgKyBzaXplOworCXByLT5iYXNlID0gKHVuc2lnbmVkIGxvbmcpIGlzYV9idXNfdG9fdmlydChkZXYtPm1lbV9zdGFydCkgKyBzaXplIC0gMHgwMTAwMDAwMDsKKwlhbGxvYzU4NihkZXYpOworCisJZWxtY19pZF9yZXNldDU4NigpOwkvKiBtYWtlIHN1cmUgaXQgZG9lc24ndCBnZW5lcmF0ZSBzcHVyaW91cyBpbnRzICovCisKKwkvKiBzZXQgbnVtYmVyIG9mIHJlY2VpdmUtYnVmZnMgYWNjb3JkaW5nIHRvIG1lbXNpemUgKi8KKwlwci0+bnVtX3JlY3ZfYnVmZnMgPSBOVU1fUkVDVl9CVUZGU18xNjsKKworCS8qIGR1bXAgYWxsIHRoZSBhc3NvcnRlZCBpbmZvcm1hdGlvbiAqLworCXByaW50ayhLRVJOX0lORk8gIiVzOiBJUlEgJWQsICVzdGVybmFsIHhjdnIsIG1lbW9yeSAlI2x4LSUjbHguXG4iLCBkZXYtPm5hbWUsCisJICAgICAgIGRldi0+aXJxLCBkZXYtPmlmX3BvcnQgPyAiZXgiIDogImluIiwgCisJICAgICAgIGRldi0+bWVtX3N0YXJ0LCBkZXYtPm1lbV9lbmQgLSAxKTsKKworCS8qIFRoZSBoYXJkd2FyZSBhZGRyZXNzIGZvciB0aGUgM2M1MjMgaXMgc3RvcmVkIGluIHRoZSBmaXJzdCBzaXgKKwkgICBieXRlcyBvZiB0aGUgSU8gYWRkcmVzcy4gKi8KKwlwcmludGsoS0VSTl9JTkZPICIlczogaGFyZHdhcmUgYWRkcmVzcyAiLCBkZXYtPm5hbWUpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJZGV2LT5kZXZfYWRkcltpXSA9IGluYihkZXYtPmJhc2VfYWRkciArIGkpOworCQlwcmludGsoIiAlMDJ4IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJfQorCXByaW50aygiXG4iKTsKKworCWRldi0+b3BlbiA9ICZlbG1jX29wZW47CisJZGV2LT5zdG9wID0gJmVsbWNfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSAmZWxtY19nZXRfc3RhdHM7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmZWxtY19zZW5kX3BhY2tldDsKKwlkZXYtPnR4X3RpbWVvdXQgPSAmZWxtY190aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBIWjsKKyNpZmRlZiBFTE1DX01VTFRJQ0FTVAorCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9tdWx0aWNhc3RfbGlzdDsKKyNlbHNlCisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBOVUxMOworI2VuZGlmCisJZGV2LT5ldGh0b29sX29wcyA9ICZuZXRkZXZfZXRodG9vbF9vcHM7CisJCisJLyogbm90ZSB0aGF0IHdlIGhhdmVuJ3QgYWN0dWFsbHkgcmVxdWVzdGVkIHRoZSBJUlEgZnJvbSB0aGUga2VybmVsLgorCSAgIFRoYXQgZ2V0cyBkb25lIGluIGVsbWNfb3BlbigpLiAgSSdtIG5vdCBzdXJlIHRoYXQncyBzdWNoIGEgZ29vZCBpZGVhLAorCSAgIGJ1dCBpdCB3b3Jrcywgc28gSSdsbCBnbyB3aXRoIGl0LiAqLworCisjaWZuZGVmIEVMTUNfTVVMVElDQVNUCisgICAgICAgIGRldi0+ZmxhZ3MmPX5JRkZfTVVMVElDQVNUOyAgICAgLyogTXVsdGljYXN0IGRvZXNuJ3Qgd29yayAqLworI2VuZGlmCisKKwlyZXR1cm4gMDsKK2Vycl9vdXQ6CisJbWNhX3NldF9hZGFwdGVyX3Byb2NmbihzbG90LCBOVUxMLCBOVUxMKTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRUxNQ19JT19FWFRFTlQpOworCXJldHVybiByZXR2YWw7Cit9CisgCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwltY2Ffc2V0X2FkYXB0ZXJfcHJvY2ZuKCgoc3RydWN0IHByaXYgKikgKGRldi0+cHJpdikpLT5zbG90LCBOVUxMLCBOVUxMKTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRUxNQ19JT19FWFRFTlQpOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgZWxtY19wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBwcml2KSk7CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCisJZXJyID0gZG9fZWxtY19wcm9iZShkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlyZXR1cm4gZGV2Oworb3V0MToKKwljbGVhbnVwX2NhcmQoZGV2KTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGluaXQgdGhlIGNoaXAgKGVsbWMtaW50ZXJydXB0IHNob3VsZCBiZSBkaXNhYmxlZD8hKQorICogbmVlZHMgYSBjb3JyZWN0ICdhbGxvY2F0ZWQnIG1lbW9yeQorICovCisKK3N0YXRpYyBpbnQgaW5pdDU4NihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXZvaWQgKnB0cjsKKwl1bnNpZ25lZCBsb25nIHM7CisJaW50IGksIHJlc3VsdCA9IDA7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCXZvbGF0aWxlIHN0cnVjdCBjb25maWd1cmVfY21kX3N0cnVjdCAqY2ZnX2NtZDsKKwl2b2xhdGlsZSBzdHJ1Y3QgaWFzZXR1cF9jbWRfc3RydWN0ICppYXNfY21kOworCXZvbGF0aWxlIHN0cnVjdCB0ZHJfY21kX3N0cnVjdCAqdGRyX2NtZDsKKwl2b2xhdGlsZSBzdHJ1Y3QgbWNzZXR1cF9jbWRfc3RydWN0ICptY19jbWQ7CisJc3RydWN0IGRldl9tY19saXN0ICpkbWkgPSBkZXYtPm1jX2xpc3Q7CisJaW50IG51bV9hZGRycyA9IGRldi0+bWNfY291bnQ7CisKKwlwdHIgPSAodm9pZCAqKSAoKGNoYXIgKikgcC0+c2NiICsgc2l6ZW9mKHN0cnVjdCBzY2Jfc3RydWN0KSk7CisKKwljZmdfY21kID0gKHN0cnVjdCBjb25maWd1cmVfY21kX3N0cnVjdCAqKSBwdHI7CS8qIGNvbmZpZ3VyZS1jb21tYW5kICovCisJY2ZnX2NtZC0+Y21kX3N0YXR1cyA9IDA7CisJY2ZnX2NtZC0+Y21kX2NtZCA9IENNRF9DT05GSUdVUkUgfCBDTURfTEFTVDsKKwljZmdfY21kLT5jbWRfbGluayA9IDB4ZmZmZjsKKworCWNmZ19jbWQtPmJ5dGVfY250ID0gMHgwYTsJLyogbnVtYmVyIG9mIGNmZyBieXRlcyAqLworCWNmZ19jbWQtPmZpZm8gPSAweDA4OwkvKiBmaWZvLWxpbWl0ICg4PXR4OjMyL3J4OjY0KSAqLworCWNmZ19jbWQtPnNhdl9iZiA9IDB4NDA7CS8qIGhvbGQgb3IgZGlzY2FyZCBiYWQgcmVjdiBmcmFtZXMgKGJpdCA3KSAqLworCWNmZ19jbWQtPmFkcl9sZW4gPSAweDJlOwkvKiBhZGRyX2xlbiB8IXNyY19pbnNlcnQgfHByZS1sZW4gfGxvb3BiYWNrICovCisJY2ZnX2NtZC0+cHJpb3JpdHkgPSAweDAwOworCWNmZ19jbWQtPmlmcyA9IDB4NjA7CisJY2ZnX2NtZC0+dGltZV9sb3cgPSAweDAwOworCWNmZ19jbWQtPnRpbWVfaGlnaCA9IDB4ZjI7CisJY2ZnX2NtZC0+cHJvbWlzYyA9IDA7CisJaWYgKGRldi0+ZmxhZ3MgJiAoSUZGX0FMTE1VTFRJIHwgSUZGX1BST01JU0MpKSB7CisJCWNmZ19jbWQtPnByb21pc2MgPSAxOworCQlkZXYtPmZsYWdzIHw9IElGRl9QUk9NSVNDOworCX0KKwljZmdfY21kLT5jYXJyX2NvbGwgPSAweDAwOworCisJcC0+c2NiLT5jYmxfb2Zmc2V0ID0gbWFrZTE2KGNmZ19jbWQpOworCisJcC0+c2NiLT5jbWQgPSBDVUNfU1RBUlQ7CS8qIGNtZC4tdW5pdCBzdGFydCAqLworCWVsbWNfaWRfYXR0bjU4NigpOworCisJcyA9IGppZmZpZXM7CQkvKiB3YXJuaW5nOiBvbmx5IGFjdGl2ZSB3aXRoIGludGVycnVwdHMgb24gISEgKi8KKwl3aGlsZSAoIShjZmdfY21kLT5jbWRfc3RhdHVzICYgU1RBVF9DT01QTCkpIHsKKwkJaWYgKGppZmZpZXMgLSBzID4gMzAqSFovMTAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKChjZmdfY21kLT5jbWRfc3RhdHVzICYgKFNUQVRfT0sgfCBTVEFUX0NPTVBMKSkgIT0gKFNUQVRfQ09NUEwgfCBTVEFUX09LKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyAoZWxtYyk6IGNvbmZpZ3VyZSBjb21tYW5kIGZhaWxlZDogJXhcbiIsIGRldi0+bmFtZSwgY2ZnX2NtZC0+Y21kX3N0YXR1cyk7CisJCXJldHVybiAxOworCX0KKwkvKgorCSAqIGluZGl2aWR1YWwgYWRkcmVzcyBzZXR1cAorCSAqLworCWlhc19jbWQgPSAoc3RydWN0IGlhc2V0dXBfY21kX3N0cnVjdCAqKSBwdHI7CisKKwlpYXNfY21kLT5jbWRfc3RhdHVzID0gMDsKKwlpYXNfY21kLT5jbWRfY21kID0gQ01EX0lBU0VUVVAgfCBDTURfTEFTVDsKKwlpYXNfY21kLT5jbWRfbGluayA9IDB4ZmZmZjsKKworCW1lbWNweSgoY2hhciAqKSAmaWFzX2NtZC0+aWFkZHIsIChjaGFyICopIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKworCXAtPnNjYi0+Y2JsX29mZnNldCA9IG1ha2UxNihpYXNfY21kKTsKKworCXAtPnNjYi0+Y21kID0gQ1VDX1NUQVJUOwkvKiBjbWQuLXVuaXQgc3RhcnQgKi8KKwllbG1jX2lkX2F0dG41ODYoKTsKKworCXMgPSBqaWZmaWVzOworCXdoaWxlICghKGlhc19jbWQtPmNtZF9zdGF0dXMgJiBTVEFUX0NPTVBMKSkgeworCQlpZiAoamlmZmllcyAtIHMgPiAzMCpIWi8xMDApCisJCQlicmVhazsKKwl9CisKKwlpZiAoKGlhc19jbWQtPmNtZF9zdGF0dXMgJiAoU1RBVF9PSyB8IFNUQVRfQ09NUEwpKSAhPSAoU1RBVF9PSyB8IFNUQVRfQ09NUEwpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIChlbG1jKTogaW5kaXZpZHVhbCBhZGRyZXNzIHNldHVwIGNvbW1hbmQgZmFpbGVkOiAlMDR4XG4iLCBkZXYtPm5hbWUsIGlhc19jbWQtPmNtZF9zdGF0dXMpOworCQlyZXR1cm4gMTsKKwl9CisJLyoKKwkgKiBURFIsIHdpcmUgY2hlY2sgLi4gZS5nLiBubyByZXNpc3RvciBlLnQuYworCSAqLworCXRkcl9jbWQgPSAoc3RydWN0IHRkcl9jbWRfc3RydWN0ICopIHB0cjsKKworCXRkcl9jbWQtPmNtZF9zdGF0dXMgPSAwOworCXRkcl9jbWQtPmNtZF9jbWQgPSBDTURfVERSIHwgQ01EX0xBU1Q7CisJdGRyX2NtZC0+Y21kX2xpbmsgPSAweGZmZmY7CisJdGRyX2NtZC0+c3RhdHVzID0gMDsKKworCXAtPnNjYi0+Y2JsX29mZnNldCA9IG1ha2UxNih0ZHJfY21kKTsKKworCXAtPnNjYi0+Y21kID0gQ1VDX1NUQVJUOwkvKiBjbWQuLXVuaXQgc3RhcnQgKi8KKwllbG1jX2F0dG41ODYoKTsKKworCXMgPSBqaWZmaWVzOworCXdoaWxlICghKHRkcl9jbWQtPmNtZF9zdGF0dXMgJiBTVEFUX0NPTVBMKSkgeworCQlpZiAoamlmZmllcyAtIHMgPiAzMCpIWi8xMDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAlZCBQcm9ibGVtcyB3aGlsZSBydW5uaW5nIHRoZSBURFIuXG4iLCBkZXYtPm5hbWUsIF9fTElORV9fKTsKKwkJCXJlc3VsdCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghcmVzdWx0KSB7CisJCURFTEFZKDIpOwkvKiB3YWl0IGZvciByZXN1bHQgKi8KKwkJcmVzdWx0ID0gdGRyX2NtZC0+c3RhdHVzOworCisJCXAtPnNjYi0+Y21kID0gcC0+c2NiLT5zdGF0dXMgJiBTVEFUX01BU0s7CisJCWVsbWNfaWRfYXR0bjU4NigpOwkvKiBhY2sgdGhlIGludGVycnVwdHMgKi8KKworCQlpZiAocmVzdWx0ICYgVERSX0xOS19PSykgeworCQkJLyogZW1wdHkgKi8KKwkJfSBlbHNlIGlmIChyZXN1bHQgJiBURFJfWENWUl9QUkIpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBURFI6IFRyYW5zY2VpdmVyIHByb2JsZW0hXG4iLCBkZXYtPm5hbWUpOworCQl9IGVsc2UgaWYgKHJlc3VsdCAmIFREUl9FVF9PUE4pIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBURFI6IE5vIGNvcnJlY3QgdGVybWluYXRpb24gJWQgY2xvY2tzIGF3YXkuXG4iLCBkZXYtPm5hbWUsIHJlc3VsdCAmIFREUl9USU1FTUFTSyk7CisJCX0gZWxzZSBpZiAocmVzdWx0ICYgVERSX0VUX1NSVCkgeworCQkJaWYgKHJlc3VsdCAmIFREUl9USU1FTUFTSykJLyogdGltZSA9PSAwIC0+IHN0cmFuZ2UgOi0pICovCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFREUjogRGV0ZWN0ZWQgYSBzaG9ydCBjaXJjdWl0ICVkIGNsb2NrcyBhd2F5LlxuIiwgZGV2LT5uYW1lLCByZXN1bHQgJiBURFJfVElNRU1BU0spOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFREUjogVW5rbm93biBzdGF0dXMgJTA0eFxuIiwgZGV2LT5uYW1lLCByZXN1bHQpOworCQl9CisJfQorCS8qCisJICogYWNrIGludGVycnVwdHMKKwkgKi8KKwlwLT5zY2ItPmNtZCA9IHAtPnNjYi0+c3RhdHVzICYgU1RBVF9NQVNLOworCWVsbWNfaWRfYXR0bjU4NigpOworCisJLyoKKwkgKiBhbGxvYyBub3AveG1pdC1jbWRzCisJICovCisjaWYgKE5VTV9YTUlUX0JVRkZTID09IDEpCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlwLT5ub3BfY21kc1tpXSA9IChzdHJ1Y3Qgbm9wX2NtZF9zdHJ1Y3QgKikgcHRyOworCQlwLT5ub3BfY21kc1tpXS0+Y21kX2NtZCA9IENNRF9OT1A7CisJCXAtPm5vcF9jbWRzW2ldLT5jbWRfc3RhdHVzID0gMDsKKwkJcC0+bm9wX2NtZHNbaV0tPmNtZF9saW5rID0gbWFrZTE2KChwLT5ub3BfY21kc1tpXSkpOworCQlwdHIgPSAoY2hhciAqKSBwdHIgKyBzaXplb2Yoc3RydWN0IG5vcF9jbWRfc3RydWN0KTsKKwl9CisJcC0+eG1pdF9jbWRzWzBdID0gKHN0cnVjdCB0cmFuc21pdF9jbWRfc3RydWN0ICopIHB0cjsJLyogdHJhbnNtaXQgY21kL2J1ZmYgMCAqLworCXB0ciA9IChjaGFyICopIHB0ciArIHNpemVvZihzdHJ1Y3QgdHJhbnNtaXRfY21kX3N0cnVjdCk7CisjZWxzZQorCWZvciAoaSA9IDA7IGkgPCBOVU1fWE1JVF9CVUZGUzsgaSsrKSB7CisJCXAtPm5vcF9jbWRzW2ldID0gKHN0cnVjdCBub3BfY21kX3N0cnVjdCAqKSBwdHI7CisJCXAtPm5vcF9jbWRzW2ldLT5jbWRfY21kID0gQ01EX05PUDsKKwkJcC0+bm9wX2NtZHNbaV0tPmNtZF9zdGF0dXMgPSAwOworCQlwLT5ub3BfY21kc1tpXS0+Y21kX2xpbmsgPSBtYWtlMTYoKHAtPm5vcF9jbWRzW2ldKSk7CisJCXB0ciA9IChjaGFyICopIHB0ciArIHNpemVvZihzdHJ1Y3Qgbm9wX2NtZF9zdHJ1Y3QpOworCQlwLT54bWl0X2NtZHNbaV0gPSAoc3RydWN0IHRyYW5zbWl0X2NtZF9zdHJ1Y3QgKikgcHRyOwkvKnRyYW5zbWl0IGNtZC9idWZmIDAgKi8KKwkJcHRyID0gKGNoYXIgKikgcHRyICsgc2l6ZW9mKHN0cnVjdCB0cmFuc21pdF9jbWRfc3RydWN0KTsKKwl9CisjZW5kaWYKKworCXB0ciA9IGFsbG9jX3JmYShkZXYsICh2b2lkICopIHB0cik7CS8qIGluaXQgcmVjZWl2ZS1mcmFtZS1hcmVhICovCisKKwkvKgorCSAqIE11bHRpY2FzdCBzZXR1cAorCSAqLworCisJaWYgKGRldi0+bWNfY291bnQpIHsKKwkJLyogSSBkb24ndCB1bmRlcnN0YW5kIHRoaXM6IGRvIHdlIHJlYWxseSBuZWVkIG1lbW9yeSBhZnRlciB0aGUgaW5pdD8gKi8KKwkJaW50IGxlbiA9ICgoY2hhciAqKSBwLT5pc2NwIC0gKGNoYXIgKikgcHRyIC0gOCkgLyA2OworCQlpZiAobGVuIDw9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE9vb29vcHMsIG5vIG1lbW9yeSBmb3IgTUMtU2V0dXAhXG4iLCBkZXYtPm5hbWUpOworCQl9IGVsc2UgeworCQkJaWYgKGxlbiA8IG51bV9hZGRycykgeworCQkJCW51bV9hZGRycyA9IGxlbjsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogU29ycnksIGNhbiBvbmx5IGFwcGx5ICVkIE1DLUFkZHJlc3MoZXMpLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBudW1fYWRkcnMpOworCQkJfQorCQkJbWNfY21kID0gKHN0cnVjdCBtY3NldHVwX2NtZF9zdHJ1Y3QgKikgcHRyOworCQkJbWNfY21kLT5jbWRfc3RhdHVzID0gMDsKKwkJCW1jX2NtZC0+Y21kX2NtZCA9IENNRF9NQ1NFVFVQIHwgQ01EX0xBU1Q7CisJCQltY19jbWQtPmNtZF9saW5rID0gMHhmZmZmOworCQkJbWNfY21kLT5tY19jbnQgPSBudW1fYWRkcnMgKiA2OworCQkJZm9yIChpID0gMDsgaSA8IG51bV9hZGRyczsgaSsrKSB7CisJCQkJbWVtY3B5KChjaGFyICopIG1jX2NtZC0+bWNfbGlzdFtpXSwgZG1pLT5kbWlfYWRkciwgNik7CisJCQkJZG1pID0gZG1pLT5uZXh0OworCQkJfQorCQkJcC0+c2NiLT5jYmxfb2Zmc2V0ID0gbWFrZTE2KG1jX2NtZCk7CisJCQlwLT5zY2ItPmNtZCA9IENVQ19TVEFSVDsKKwkJCWVsbWNfaWRfYXR0bjU4NigpOworCQkJcyA9IGppZmZpZXM7CisJCQl3aGlsZSAoIShtY19jbWQtPmNtZF9zdGF0dXMgJiBTVEFUX0NPTVBMKSkgeworCQkJCWlmIChqaWZmaWVzIC0gcyA+IDMwKkhaLzEwMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIShtY19jbWQtPmNtZF9zdGF0dXMgJiBTVEFUX0NPTVBMKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW4ndCBhcHBseSBtdWx0aWNhc3QtYWRkcmVzcy1saXN0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqIGFsbG9jIHhtaXQtYnVmZnMgLyBpbml0IHhtaXRfY21kcworCSAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fWE1JVF9CVUZGUzsgaSsrKSB7CisJCXAtPnhtaXRfY2J1ZmZzW2ldID0gKGNoYXIgKikgcHRyOwkvKiBjaGFyLWJ1ZmZzICovCisJCXB0ciA9IChjaGFyICopIHB0ciArIFhNSVRfQlVGRl9TSVpFOworCQlwLT54bWl0X2J1ZmZzW2ldID0gKHN0cnVjdCB0YmRfc3RydWN0ICopIHB0cjsJLyogVEJEICovCisJCXB0ciA9IChjaGFyICopIHB0ciArIHNpemVvZihzdHJ1Y3QgdGJkX3N0cnVjdCk7CisJCWlmICgodm9pZCAqKSBwdHIgPiAodm9pZCAqKSBwLT5pc2NwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBub3QgZW5vdWdoIHNoYXJlZC1tZW0gZm9yIHlvdXIgY29uZmlndXJhdGlvbiFcbiIsIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQltZW1zZXQoKGNoYXIgKikgKHAtPnhtaXRfY21kc1tpXSksIDAsIHNpemVvZihzdHJ1Y3QgdHJhbnNtaXRfY21kX3N0cnVjdCkpOworCQltZW1zZXQoKGNoYXIgKikgKHAtPnhtaXRfYnVmZnNbaV0pLCAwLCBzaXplb2Yoc3RydWN0IHRiZF9zdHJ1Y3QpKTsKKwkJcC0+eG1pdF9jbWRzW2ldLT5jbWRfc3RhdHVzID0gU1RBVF9DT01QTDsKKwkJcC0+eG1pdF9jbWRzW2ldLT5jbWRfY21kID0gQ01EX1hNSVQgfCBDTURfSU5UOworCQlwLT54bWl0X2NtZHNbaV0tPnRiZF9vZmZzZXQgPSBtYWtlMTYoKHAtPnhtaXRfYnVmZnNbaV0pKTsKKwkJcC0+eG1pdF9idWZmc1tpXS0+bmV4dCA9IDB4ZmZmZjsKKwkJcC0+eG1pdF9idWZmc1tpXS0+YnVmZmVyID0gbWFrZTI0KChwLT54bWl0X2NidWZmc1tpXSkpOworCX0KKworCXAtPnhtaXRfY291bnQgPSAwOworCXAtPnhtaXRfbGFzdCA9IDA7CisjaWZuZGVmIE5PX05PUENPTU1BTkRTCisJcC0+bm9wX3BvaW50ID0gMDsKKyNlbmRpZgorCisJLyoKKwkgKiAnc3RhcnQgdHJhbnNtaXR0ZXInIChub3AtbG9vcCkKKwkgKi8KKyNpZm5kZWYgTk9fTk9QQ09NTUFORFMKKwlwLT5zY2ItPmNibF9vZmZzZXQgPSBtYWtlMTYocC0+bm9wX2NtZHNbMF0pOworCXAtPnNjYi0+Y21kID0gQ1VDX1NUQVJUOworCWVsbWNfaWRfYXR0bjU4NigpOworCVdBSVRfNF9TQ0JfQ01EKCk7CisjZWxzZQorCXAtPnhtaXRfY21kc1swXS0+Y21kX2xpbmsgPSAweGZmZmY7CisJcC0+eG1pdF9jbWRzWzBdLT5jbWRfY21kID0gQ01EX1hNSVQgfCBDTURfTEFTVCB8IENNRF9JTlQ7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUaGlzIGlzIGEgaGVscGVyIHJvdXRpbmUgZm9yIGVsbWNfcm5yX2ludCgpIGFuZCBpbml0NTg2KCkuCisgKiBJdCBzZXRzIHVwIHRoZSBSZWNlaXZlIEZyYW1lIEFyZWEgKFJGQSkuCisgKi8KKworc3RhdGljIHZvaWQgKmFsbG9jX3JmYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwdHIpCit7CisJdm9sYXRpbGUgc3RydWN0IHJmZF9zdHJ1Y3QgKnJmZCA9IChzdHJ1Y3QgcmZkX3N0cnVjdCAqKSBwdHI7CisJdm9sYXRpbGUgc3RydWN0IHJiZF9zdHJ1Y3QgKnJiZDsKKwlpbnQgaTsKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwltZW1zZXQoKGNoYXIgKikgcmZkLCAwLCBzaXplb2Yoc3RydWN0IHJmZF9zdHJ1Y3QpICogcC0+bnVtX3JlY3ZfYnVmZnMpOworCXAtPnJmZF9maXJzdCA9IHJmZDsKKworCWZvciAoaSA9IDA7IGkgPCBwLT5udW1fcmVjdl9idWZmczsgaSsrKSB7CisJCXJmZFtpXS5uZXh0ID0gbWFrZTE2KHJmZCArIChpICsgMSkgJSBwLT5udW1fcmVjdl9idWZmcyk7CisJfQorCXJmZFtwLT5udW1fcmVjdl9idWZmcyAtIDFdLmxhc3QgPSBSRkRfU1VTUDsJLyogUlUgc3VzcGVuZCAqLworCisJcHRyID0gKHZvaWQgKikgKHJmZCArIHAtPm51bV9yZWN2X2J1ZmZzKTsKKworCXJiZCA9IChzdHJ1Y3QgcmJkX3N0cnVjdCAqKSBwdHI7CisJcHRyID0gKHZvaWQgKikgKHJiZCArIHAtPm51bV9yZWN2X2J1ZmZzKTsKKworCS8qIGNsciBkZXNjcmlwdG9ycyAqLworCW1lbXNldCgoY2hhciAqKSByYmQsIDAsIHNpemVvZihzdHJ1Y3QgcmJkX3N0cnVjdCkgKiBwLT5udW1fcmVjdl9idWZmcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcC0+bnVtX3JlY3ZfYnVmZnM7IGkrKykgeworCQlyYmRbaV0ubmV4dCA9IG1ha2UxNigocmJkICsgKGkgKyAxKSAlIHAtPm51bV9yZWN2X2J1ZmZzKSk7CisJCXJiZFtpXS5zaXplID0gUkVDVl9CVUZGX1NJWkU7CisJCXJiZFtpXS5idWZmZXIgPSBtYWtlMjQocHRyKTsKKwkJcHRyID0gKGNoYXIgKikgcHRyICsgUkVDVl9CVUZGX1NJWkU7CisJfQorCisJcC0+cmZkX3RvcCA9IHAtPnJmZF9maXJzdDsKKwlwLT5yZmRfbGFzdCA9IHAtPnJmZF9maXJzdCArIHAtPm51bV9yZWN2X2J1ZmZzIC0gMTsKKworCXAtPnNjYi0+cmZhX29mZnNldCA9IG1ha2UxNihwLT5yZmRfZmlyc3QpOworCXAtPnJmZF9maXJzdC0+cmJkX29mZnNldCA9IG1ha2UxNihyYmQpOworCisJcmV0dXJuIHB0cjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEludGVycnVwdCBIYW5kbGVyIC4uLgorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdAorZWxtY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVnX3B0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0OworCXN0cnVjdCBwcml2ICpwOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZWxtYy1pbnRlcnJ1cHQ6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCAoaW50KSAtKCgoc3RydWN0IHB0X3JlZ3MgKikgcmVnX3B0ciktPm9yaWdfZWF4ICsgMikpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfSBlbHNlIGlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCS8qIFRoZSAzYzUyMyBoYXMgdGhpcyBoYWJpdCBvZiBnZW5lcmF0aW5nIGludGVycnVwdHMgZHVyaW5nIHRoZQorCQkgICByZXNldC4gIEknbSBub3Qgc3VyZSBpZiB0aGUgbmk1MiBoYXMgdGhpcyBzYW1lIHByb2JsZW0sIGJ1dCBpdCdzCisJCSAgIHJlYWxseSBhbm5veWluZyBpZiB3ZSBoYXZlbid0IGZpbmlzaGVkIGluaXRpYWxpemluZyBpdC4gIEkgd2FzCisJCSAgIGhvcGluZyBhbGwgdGhlIGVsbWNfaWRfKiBjb21tYW5kcyB3b3VsZCBkaXNhYmxlIHRoaXMsIGJ1dCBJCisJCSAgIG1pZ2h0IGhhdmUgbWlzc2VkIGEgZmV3LiAqLworCisJCWVsbWNfaWRfYXR0bjU4NigpOwkvKiBhY2sgaW50ZXIuIGFuZCBkaXNhYmxlIGFueSBtb3JlICovCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9IGVsc2UgaWYgKCEoRUxNQ19DVFJMX0lOVCAmIGluYihkZXYtPmJhc2VfYWRkciArIEVMTUNfQ1RSTCkpKSB7CisJCS8qIHdhc24ndCB0aGlzIGRldmljZSAqLworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCS8qIHJlYWRpbmcgRUxNQ19DVFJMIGFsc28gY2xlYXJzIHRoZSBJTlQgYml0LiAqLworCisJcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwl3aGlsZSAoKHN0YXQgPSBwLT5zY2ItPnN0YXR1cyAmIFNUQVRfTUFTSykpIAorCXsKKwkJcC0+c2NiLT5jbWQgPSBzdGF0OworCQllbG1jX2F0dG41ODYoKTsJLyogYWNrIGludGVyLiAqLworCisJCWlmIChzdGF0ICYgU1RBVF9DWCkgeworCQkJLyogY29tbWFuZCB3aXRoIEktYml0IHNldCBjb21wbGV0ZSAqLworCQkJZWxtY194bXRfaW50KGRldik7CisJCX0KKwkJaWYgKHN0YXQgJiBTVEFUX0ZSKSB7CisJCQkvKiByZWNlaXZlZCBhIGZyYW1lICovCisJCQllbG1jX3Jjdl9pbnQoZGV2KTsKKwkJfQorI2lmbmRlZiBOT19OT1BDT01NQU5EUworCQlpZiAoc3RhdCAmIFNUQVRfQ05BKSB7CisJCQkvKiBDVSB3ZW50ICdub3QgcmVhZHknICovCisJCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG9vcHMhIENVIGhhcyBsZWZ0IGFjdGl2ZSBzdGF0ZS4gc3RhdDogJTA0eC8lMDR4LlxuIiwgZGV2LT5uYW1lLCAoaW50KSBzdGF0LCAoaW50KSBwLT5zY2ItPnN0YXR1cyk7CisJCQl9CisJCX0KKyNlbmRpZgorCisJCWlmIChzdGF0ICYgU1RBVF9STlIpIHsKKwkJCS8qIFJVIHdlbnQgJ25vdCByZWFkeScgKi8KKworCQkJaWYgKHAtPnNjYi0+c3RhdHVzICYgUlVfU1VTUEVORCkgeworCQkJCS8qIHNwZWNpYWwgY2FzZTogUlVfU1VTUEVORCAqLworCisJCQkJV0FJVF80X1NDQl9DTUQoKTsKKwkJCQlwLT5zY2ItPmNtZCA9IFJVQ19SRVNVTUU7CisJCQkJZWxtY19hdHRuNTg2KCk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZWNlaXZlci1Vbml0IHdlbnQgJ05PVCBSRUFEWSc6ICUwNHgvJTA0eC5cbiIsIGRldi0+bmFtZSwgKGludCkgc3RhdCwgKGludCkgcC0+c2NiLT5zdGF0dXMpOworCQkJCWVsbWNfcm5yX2ludChkZXYpOworCQkJfQorCQl9CisJCVdBSVRfNF9TQ0JfQ01EKCk7CS8qIHdhaXQgZm9yIGFjay4gKGVsbWNfeG10X2ludCBjYW4gYmUgZmFzdGVyIHRoYW4gYWNrISEpICovCisJCWlmIChwLT5zY2ItPmNtZCkgewkvKiB0aW1lZCBvdXQ/ICovCisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiByZWNlaXZlLWludGVycnVwdAorICovCisKK3N0YXRpYyB2b2lkIGVsbWNfcmN2X2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgdG90bGVuOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHJiZF9zdHJ1Y3QgKnJiZDsKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwlmb3IgKDsgKHN0YXR1cyA9IHAtPnJmZF90b3AtPnN0YXR1cykgJiBTVEFUX0NPTVBMOykgeworCQlyYmQgPSAoc3RydWN0IHJiZF9zdHJ1Y3QgKikgbWFrZTMyKHAtPnJmZF90b3AtPnJiZF9vZmZzZXQpOworCisJCWlmIChzdGF0dXMgJiBTVEFUX09LKSB7CQkvKiBmcmFtZSByZWNlaXZlZCB3aXRob3V0IGVycm9yPyAqLworCQkJaWYgKCh0b3RsZW4gPSByYmQtPnN0YXR1cykgJiBSQkRfTEFTVCkgewkvKiB0aGUgZmlyc3QgYW5kIHRoZSBsYXN0IGJ1ZmZlcj8gKi8KKwkJCQl0b3RsZW4gJj0gUkJEX01BU0s7CS8qIGxlbmd0aCBvZiB0aGlzIGZyYW1lICovCisJCQkJcmJkLT5zdGF0dXMgPSAwOworCQkJCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSBkZXZfYWxsb2Nfc2tiKHRvdGxlbiArIDIpOworCQkJCWlmIChza2IgIT0gTlVMTCkgeworCQkJCQlza2ItPmRldiA9IGRldjsKKwkJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbm1lbnQgKi8KKwkJCQkJc2tiX3B1dChza2IsdG90bGVuKTsKKwkJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIChjaGFyICopIHAtPmJhc2UrKHVuc2lnbmVkIGxvbmcpIHJiZC0+YnVmZmVyLHRvdGxlbiwwKTsKKwkJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQkJcC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCQlwLT5zdGF0cy5yeF9ieXRlcyArPSB0b3RsZW47CisJCQkJfSBlbHNlIHsKKwkJCQkJcC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlY2VpdmVkIG92ZXJzaXplZCBmcmFtZS5cbiIsIGRldi0+bmFtZSk7CisJCQkJcC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJfQorCQl9IGVsc2UgewkvKiBmcmFtZSAhKG9rKSwgb25seSB3aXRoICdzYXZlLWJhZC1mcmFtZXMnICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogb29wcyEgcmZkLWVycm9yLXN0YXR1czogJTA0eFxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJcC0+c3RhdHMucnhfZXJyb3JzKys7CisJCX0KKwkJcC0+cmZkX3RvcC0+c3RhdHVzID0gMDsKKwkJcC0+cmZkX3RvcC0+bGFzdCA9IFJGRF9TVVNQOworCQlwLT5yZmRfbGFzdC0+bGFzdCA9IDA7CS8qIGRlbGV0ZSBSVV9TVVNQICAqLworCQlwLT5yZmRfbGFzdCA9IHAtPnJmZF90b3A7CisJCXAtPnJmZF90b3AgPSAoc3RydWN0IHJmZF9zdHJ1Y3QgKikgbWFrZTMyKHAtPnJmZF90b3AtPm5leHQpOwkvKiBzdGVwIHRvIG5leHQgUkZEICovCisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaGFuZGxlICdSZWNlaXZlciB3ZW50IG5vdCByZWFkeScuCisgKi8KKworc3RhdGljIHZvaWQgZWxtY19ybnJfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCisJcC0+c3RhdHMucnhfZXJyb3JzKys7CisKKwlXQUlUXzRfU0NCX0NNRCgpOwkvKiB3YWl0IGZvciB0aGUgbGFzdCBjbWQgKi8KKwlwLT5zY2ItPmNtZCA9IFJVQ19BQk9SVDsJLyogdXN1YWxseSB0aGUgUlUgaXMgaW4gdGhlICdubyByZXNvdXJjZSctc3RhdGUgLi4gYWJvcnQgaXQgbm93LiAqLworCWVsbWNfYXR0bjU4NigpOworCVdBSVRfNF9TQ0JfQ01EKCk7CS8qIHdhaXQgZm9yIGFjY2VwdCBjbWQuICovCisKKwlhbGxvY19yZmEoZGV2LCAoY2hhciAqKSBwLT5yZmRfZmlyc3QpOworCXN0YXJ0cmVjdjU4NihkZXYpOwkvKiByZXN0YXJ0IFJVICovCisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZS1Vbml0IHJlc3RhcnRlZC4gU3RhdHVzOiAlMDR4XG4iLCBkZXYtPm5hbWUsIHAtPnNjYi0+c3RhdHVzKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaGFuZGxlIHhtaXQgLSBpbnRlcnJ1cHQKKyAqLworCitzdGF0aWMgdm9pZCBlbG1jX3htdF9pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKworCXN0YXR1cyA9IHAtPnhtaXRfY21kc1twLT54bWl0X2xhc3RdLT5jbWRfc3RhdHVzOworCWlmICghKHN0YXR1cyAmIFNUQVRfQ09NUEwpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBzdHJhbmdlIC4uIHhtaXQtaW50IHdpdGhvdXQgYSAnQ09NUExFVEUnXG4iLCBkZXYtPm5hbWUpOworCX0KKwlpZiAoc3RhdHVzICYgU1RBVF9PSykgeworCQlwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKHN0YXR1cyAmIFRDTURfTUFYQ09MTE1BU0spOworCX0gZWxzZSB7CisJCXAtPnN0YXRzLnR4X2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgVENNRF9MQVRFQ09MTCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGxhdGUgY29sbGlzaW9uIGRldGVjdGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJCXAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJfSBlbHNlIGlmIChzdGF0dXMgJiBUQ01EX05PQ0FSUklFUikgeworCQkJcC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBubyBjYXJyaWVyIGRldGVjdGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJfSBlbHNlIGlmIChzdGF0dXMgJiBUQ01EX0xPU1RDVFMpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBsb3NzIG9mIENUUyBkZXRlY3RlZC5cbiIsIGRldi0+bmFtZSk7CisJCX0gZWxzZSBpZiAoc3RhdHVzICYgVENNRF9VTkRFUlJVTikgeworCQkJcC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBETUEgdW5kZXJydW4gZGV0ZWN0ZWQuXG4iLCBkZXYtPm5hbWUpOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIFRDTURfTUFYQ09MTCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1heC4gY29sbGlzaW9ucyBleGNlZWRlZC5cbiIsIGRldi0+bmFtZSk7CisJCQlwLT5zdGF0cy5jb2xsaXNpb25zICs9IDE2OworCQl9CisJfQorCisjaWYgKE5VTV9YTUlUX0JVRkZTICE9IDEpCisJaWYgKCgrK3AtPnhtaXRfbGFzdCkgPT0gTlVNX1hNSVRfQlVGRlMpIHsKKwkJcC0+eG1pdF9sYXN0ID0gMDsKKwl9CisjZW5kaWYKKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAocmUpc3RhcnQgdGhlIHJlY2VpdmVyCisgKi8KKworc3RhdGljIHZvaWQgc3RhcnRyZWN2NTg2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCisJcC0+c2NiLT5yZmFfb2Zmc2V0ID0gbWFrZTE2KHAtPnJmZF9maXJzdCk7CisJcC0+c2NiLT5jbWQgPSBSVUNfU1RBUlQ7CisJZWxtY19hdHRuNTg2KCk7CQkvKiBzdGFydCBjbWQuICovCisJV0FJVF80X1NDQl9DTUQoKTsJLyogd2FpdCBmb3IgYWNjZXB0IGNtZC4gKG5vIHRpbWVvdXQhISkgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogdGltZW91dAorICovCisgCitzdGF0aWMgdm9pZCBlbG1jX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisJLyogQ09NTUFORC1VTklUIGFjdGl2ZT8gKi8KKwlpZiAocC0+c2NiLT5zdGF0dXMgJiBDVV9BQ1RJVkUpIHsKKyNpZmRlZiBERUJVRworCQlwcmludGsoIiVzOiBzdHJhbmdlIC4uLiB0aW1lb3V0IHdpdGggQ1UgYWN0aXZlPyE/XG4iLCBkZXYtPm5hbWUpOworCQlwcmludGsoIiVzOiBYMDogJTA0eCBOMDogJTA0eCBOMTogJTA0eCAlZFxuIiwgZGV2LT5uYW1lLCAoaW50KSBwLT54bWl0X2NtZHNbMF0tPmNtZF9zdGF0dXMsIChpbnQpIHAtPm5vcF9jbWRzWzBdLT5jbWRfc3RhdHVzLCAoaW50KSBwLT5ub3BfY21kc1sxXS0+Y21kX3N0YXR1cywgKGludCkgcC0+bm9wX3BvaW50KTsKKyNlbmRpZgorCQlwLT5zY2ItPmNtZCA9IENVQ19BQk9SVDsKKwkJZWxtY19hdHRuNTg2KCk7CisJCVdBSVRfNF9TQ0JfQ01EKCk7CisJCXAtPnNjYi0+Y2JsX29mZnNldCA9IG1ha2UxNihwLT5ub3BfY21kc1twLT5ub3BfcG9pbnRdKTsKKwkJcC0+c2NiLT5jbWQgPSBDVUNfU1RBUlQ7CisJCWVsbWNfYXR0bjU4NigpOworCQlXQUlUXzRfU0NCX0NNRCgpOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfSBlbHNlIHsKKyNpZmRlZiBERUJVRworCQlwcmludGsoIiVzOiB4bWl0dGVyIHRpbWVkIG91dCwgdHJ5IHRvIHJlc3RhcnQhIHN0YXQ6ICUwNHhcbiIsIGRldi0+bmFtZSwgcC0+c2NiLT5zdGF0dXMpOworCQlwcmludGsoIiVzOiBjb21tYW5kLXN0YXRzOiAlMDR4ICUwNHhcbiIsIGRldi0+bmFtZSwgcC0+eG1pdF9jbWRzWzBdLT5jbWRfc3RhdHVzLCBwLT54bWl0X2NtZHNbMV0tPmNtZF9zdGF0dXMpOworI2VuZGlmCisJCWVsbWNfY2xvc2UoZGV2KTsKKwkJZWxtY19vcGVuKGRldik7CisJfQorfQorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc2VuZCBmcmFtZQorICovCisKK3N0YXRpYyBpbnQgZWxtY19zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBsZW47CisJaW50IGk7CisjaWZuZGVmIE5PX05PUENPTU1BTkRTCisJaW50IG5leHRfbm9wOworI2VuZGlmCisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJbGVuID0gKEVUSF9aTEVOIDwgc2tiLT5sZW4pID8gc2tiLT5sZW4gOiBFVEhfWkxFTjsKKwkKKwlpZiAobGVuICE9IHNrYi0+bGVuKQorCQltZW1zZXQoKGNoYXIgKikgcC0+eG1pdF9jYnVmZnNbcC0+eG1pdF9jb3VudF0sIDAsIEVUSF9aTEVOKTsKKwltZW1jcHkoKGNoYXIgKikgcC0+eG1pdF9jYnVmZnNbcC0+eG1pdF9jb3VudF0sIChjaGFyICopIChza2ItPmRhdGEpLCBza2ItPmxlbik7CisKKyNpZiAoTlVNX1hNSVRfQlVGRlMgPT0gMSkKKyNpZmRlZiBOT19OT1BDT01NQU5EUworCXAtPnhtaXRfYnVmZnNbMF0tPnNpemUgPSBUQkRfTEFTVCB8IGxlbjsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlwLT5zY2ItPmNibF9vZmZzZXQgPSBtYWtlMTYocC0+eG1pdF9jbWRzWzBdKTsKKwkJcC0+c2NiLT5jbWQgPSBDVUNfU1RBUlQ7CisJCXAtPnhtaXRfY21kc1swXS0+Y21kX3N0YXR1cyA9IDA7CisJCQllbG1jX2F0dG41ODYoKTsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCWlmICghaSkgeworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQl9CisJCVdBSVRfNF9TQ0JfQ01EKCk7CisJCWlmICgocC0+c2NiLT5zdGF0dXMgJiBDVV9BQ1RJVkUpKSB7CS8qIHRlc3QgaXQsIGJlY2F1c2UgQ1Ugc29tZXRpbWVzIGRvZXNuJ3Qgc3RhcnQgaW1tZWRpYXRlbHkgKi8KKwkJCWJyZWFrOworCQl9CisJCWlmIChwLT54bWl0X2NtZHNbMF0tPmNtZF9zdGF0dXMpIHsKKwkJCWJyZWFrOworCQl9CisJCWlmIChpID09IDE1KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2FuJ3Qgc3RhcnQgdHJhbnNtaXQtY29tbWFuZC5cbiIsIGRldi0+bmFtZSk7CisJCX0KKwl9CisjZWxzZQorCW5leHRfbm9wID0gKHAtPm5vcF9wb2ludCArIDEpICYgMHgxOworCXAtPnhtaXRfYnVmZnNbMF0tPnNpemUgPSBUQkRfTEFTVCB8IGxlbjsKKwkKKwlwLT54bWl0X2NtZHNbMF0tPmNtZF9saW5rID0gcC0+bm9wX2NtZHNbbmV4dF9ub3BdLT5jbWRfbGluaworCSAgICA9IG1ha2UxNigocC0+bm9wX2NtZHNbbmV4dF9ub3BdKSk7CisJcC0+eG1pdF9jbWRzWzBdLT5jbWRfc3RhdHVzID0gcC0+bm9wX2NtZHNbbmV4dF9ub3BdLT5jbWRfc3RhdHVzID0gMDsKKworCXAtPm5vcF9jbWRzW3AtPm5vcF9wb2ludF0tPmNtZF9saW5rID0gbWFrZTE2KChwLT54bWl0X2NtZHNbMF0pKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlwLT5ub3BfcG9pbnQgPSBuZXh0X25vcDsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisjZW5kaWYKKyNlbHNlCisJcC0+eG1pdF9idWZmc1twLT54bWl0X2NvdW50XS0+c2l6ZSA9IFRCRF9MQVNUIHwgbGVuOworCWlmICgobmV4dF9ub3AgPSBwLT54bWl0X2NvdW50ICsgMSkgPT0gTlVNX1hNSVRfQlVGRlMpIHsKKwkJbmV4dF9ub3AgPSAwOworCX0KKwlwLT54bWl0X2NtZHNbcC0+eG1pdF9jb3VudF0tPmNtZF9zdGF0dXMgPSAwOworCXAtPnhtaXRfY21kc1twLT54bWl0X2NvdW50XS0+Y21kX2xpbmsgPSBwLT5ub3BfY21kc1tuZXh0X25vcF0tPmNtZF9saW5rCisJICAgID0gbWFrZTE2KChwLT5ub3BfY21kc1tuZXh0X25vcF0pKTsKKwlwLT5ub3BfY21kc1tuZXh0X25vcF0tPmNtZF9zdGF0dXMgPSAwOworCQlwLT5ub3BfY21kc1twLT54bWl0X2NvdW50XS0+Y21kX2xpbmsgPSBtYWtlMTYoKHAtPnhtaXRfY21kc1twLT54bWl0X2NvdW50XSkpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXAtPnhtaXRfY291bnQgPSBuZXh0X25vcDsKKwlpZiAocC0+eG1pdF9jb3VudCAhPSBwLT54bWl0X2xhc3QpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNvbWVvbmUgd2FubmEgaGF2ZSB0aGUgc3RhdGlzdGljcworICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZWxtY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgc2hvcnQgY3JjLCBhbG4sIHJzYywgb3ZybjsKKworCWNyYyA9IHAtPnNjYi0+Y3JjX2VycnM7CS8qIGdldCBlcnJvci1zdGF0aXN0aWMgZnJvbSB0aGUgbmk4MjU4NiAqLworCXAtPnNjYi0+Y3JjX2VycnMgLT0gY3JjOworCWFsbiA9IHAtPnNjYi0+YWxuX2VycnM7CisJcC0+c2NiLT5hbG5fZXJycyAtPSBhbG47CisJcnNjID0gcC0+c2NiLT5yc2NfZXJyczsKKwlwLT5zY2ItPnJzY19lcnJzIC09IHJzYzsKKwlvdnJuID0gcC0+c2NiLT5vdnJuX2VycnM7CisJcC0+c2NiLT5vdnJuX2VycnMgLT0gb3ZybjsKKworCXAtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gY3JjOworCXAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzICs9IG92cm47CisJcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICs9IGFsbjsKKwlwLT5zdGF0cy5yeF9kcm9wcGVkICs9IHJzYzsKKworCXJldHVybiAmcC0+c3RhdHM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2V0IE1DIGxpc3QgLi4KKyAqLworCisjaWZkZWYgRUxNQ19NVUxUSUNBU1QKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmICghZGV2LT5zdGFydCkgeworCQkvKiB3aXRob3V0IGEgcnVubmluZyBpbnRlcmZhY2UsIHByb21pc2N1b3VzIGRvZXNuJ3Qgd29yayAqLworCQlyZXR1cm47CisJfQorCWRldi0+c3RhcnQgPSAwOworCWFsbG9jNTg2KGRldik7CisJaW5pdDU4NihkZXYpOworCXN0YXJ0cmVjdjU4NihkZXYpOworCWRldi0+c3RhcnQgPSAxOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIG5ldGRldl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIk1DQSAweCVseCIsIGRldi0+YmFzZV9hZGRyKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKK307CisKKyNpZmRlZiBNT0RVTEUKKworLyogSW5jcmVhc2UgaWYgbmVlZGVkIDspICovCisjZGVmaW5lIE1BWF8zQzUyM19DQVJEUyA0CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X2VsbWNbTUFYXzNDNTIzX0NBUkRTXTsKK3N0YXRpYyBpbnQgaXJxW01BWF8zQzUyM19DQVJEU107CitzdGF0aWMgaW50IGlvW01BWF8zQzUyM19DQVJEU107Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkV0aGVyTGluay9NQyBJL08gYmFzZSBhZGRyZXNzKGVzKSIpOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJFdGhlckxpbmsvTUMgSVJRIG51bWJlcihzKSIpOworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgdGhpc19kZXYsZm91bmQgPSAwOworCisJLyogTG9vcCB1bnRpbCB3ZSBlaXRoZXIgY2FuJ3QgZmluZCBhbnkgbW9yZSBjYXJkcywgb3Igd2UgaGF2ZSBNQVhfM0M1MjNfQ0FSRFMgKi8JCisJZm9yKHRoaXNfZGV2PTA7IHRoaXNfZGV2PE1BWF8zQzUyM19DQVJEUzsgdGhpc19kZXYrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBwcml2KSk7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisJCWRldi0+aXJxPWlycVt0aGlzX2Rldl07CisJCWRldi0+YmFzZV9hZGRyPWlvW3RoaXNfZGV2XTsKKwkJaWYgKGRvX2VsbWNfcHJvYmUoZGV2KSA9PSAwKSB7CisJCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgeworCQkJCWRldl9lbG1jW3RoaXNfZGV2XSA9IGRldjsKKwkJCQlmb3VuZCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJY2xlYW51cF9jYXJkKGRldik7CisJCX0KKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJaWYgKGlvW3RoaXNfZGV2XT09MCkKKwkJCWJyZWFrOworCQlwcmludGsoS0VSTl9XQVJOSU5HICIzYzUyMy5jOiBObyAzYzUyMyBjYXJkIGZvdW5kIGF0IGlvPSUjeFxuIixpb1t0aGlzX2Rldl0pOworCX0KKworCWlmKGZvdW5kPT0wKSB7CisJCWlmKGlvWzBdPT0wKSBwcmludGsoS0VSTl9OT1RJQ0UgIjNjNTIzLmM6IE5vIDNjNTIzIGNhcmRzIGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9IGVsc2UgcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgdGhpc19kZXY7CisJZm9yICh0aGlzX2Rldj0wOyB0aGlzX2RldjxNQVhfM0M1MjNfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9lbG1jW3RoaXNfZGV2XTsKKwkJaWYgKGRldikgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJfQorCX0KK30KKworI2VuZGlmCQkJCS8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MjMuaCBiL2RyaXZlcnMvbmV0LzNjNTIzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5MmY4OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0LzNjNTIzLmgKQEAgLTAsMCArMSwzNTUgQEAKKyNpZm5kZWYgXzNjNTIzX0lOQ0xVREVfCisjZGVmaW5lIF8zYzUyM19JTkNMVURFXworLyoKKwlUaGlzIGlzIGJhc2ljYWxseSBhIGhhY2tlZCB2ZXJzaW9uIG9mIG5pNTIuaCwgZm9yIHRoZSAzYzUyMworCUV0aGVybGluay9NQy4KKyovCisKKy8qCisgKiBJbnRlbCBpODI1ODYgRXRoZXJuZXQgZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiB0byB0aGUgTGludXggb3BlcmF0aW5nIHN5c3RlbSwgYW5kIGlzIGNvdmVyZWQgYnkgdGhlCisgKiBzYW1lIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoYXQgY292ZXJzIHRoYXQgd29yay4KKyAqCisgKiBDb3B5cmlnaHQgMTk5NSBieSBDaHJpcyBCZWF1cmVnYXJkIChjcGJlYXVyZUB1bmRlcmdyYWQubWF0aC51d2F0ZXJsb28uY2EpCisgKgorICogU2VlIDNjNTIzLmMgZm9yIGRldGFpbHMuCisgKgorICogJEhlYWRlcjogL2hvbWUvY2hyaXNiL2xpbnV4LTEuMi4xMy0zYzUyMy9kcml2ZXJzL25ldC9SQ1MvM2M1MjMuaCx2IDEuNiAxOTk2LzAxLzIwIDA1OjA5OjAwIGNocmlzYiBFeHAgY2hyaXNiICQKKyAqLworCisvKgorICogd2hlcmUgdG8gZmluZCB0aGUgU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciAoU0NQKQorICovCisjZGVmaW5lIFNDUF9ERUZBVUxUX0FERFJFU1MgMHhmZmZmZjQKKworCisvKgorICogU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciBTdHJ1Y3QKKyAqLworCitzdHJ1Y3Qgc2NwX3N0cnVjdAoreworICB1bnNpZ25lZCBzaG9ydCB6ZXJvX2R1bTA7CS8qIGhhcyB0byBiZSB6ZXJvICovCisgIHVuc2lnbmVkIGNoYXIgIHN5c2J1czsJLyogMD0xNkJpdCwxPThCaXQgKi8KKyAgdW5zaWduZWQgY2hhciAgemVyb19kdW0xOwkvKiBoYXMgdG8gYmUgemVybyBmb3IgNTg2ICovCisgIHVuc2lnbmVkIHNob3J0IHplcm9fZHVtMjsKKyAgdW5zaWduZWQgc2hvcnQgemVyb19kdW0zOworICBjaGFyICAgICAgICAgICppc2NwOwkJLyogcG9pbnRlciB0byB0aGUgaXNjcC1ibG9jayAqLworfTsKKworCisvKgorICogSW50ZXJtZWRpYXRlIFN5c3RlbSBDb25maWd1cmF0aW9uIFBvaW50ZXIgKElTQ1ApCisgKi8KK3N0cnVjdCBpc2NwX3N0cnVjdAoreworICB1bnNpZ25lZCBjaGFyICBidXN5OyAgICAgICAgICAvKiA1ODYgY2xlYXJzIGFmdGVyIHN1Y2Nlc3NmdWwgaW5pdCAqLworICB1bnNpZ25lZCBjaGFyICB6ZXJvX2R1bW15OyAgICAvKiBoYXN0IHRvIGJlIHplcm8gKi8KKyAgdW5zaWduZWQgc2hvcnQgc2NiX29mZnNldDsgICAgLyogcG9pbnRlcm9mZnNldCB0byB0aGUgc2NiX2Jhc2UgKi8KKyAgY2hhciAgICAgICAgICAqc2NiX2Jhc2U7ICAgICAgLyogYmFzZS1hZGRyZXNzIG9mIGFsbCAxNi1iaXQgb2Zmc2V0cyAqLworfTsKKworLyoKKyAqIFN5c3RlbSBDb250cm9sIEJsb2NrIChTQ0IpCisgKi8KK3N0cnVjdCBzY2Jfc3RydWN0Cit7CisgIHVuc2lnbmVkIHNob3J0IHN0YXR1czsgICAgICAgIC8qIHN0YXR1cyB3b3JkICovCisgIHVuc2lnbmVkIHNob3J0IGNtZDsgICAgICAgICAgIC8qIGNvbW1hbmQgd29yZCAqLworICB1bnNpZ25lZCBzaG9ydCBjYmxfb2Zmc2V0OyAgICAvKiBwb2ludGVyb2Zmc2V0LCBjb21tYW5kIGJsb2NrIGxpc3QgKi8KKyAgdW5zaWduZWQgc2hvcnQgcmZhX29mZnNldDsgICAgLyogcG9pbnRlcm9mZnNldCwgcmVjZWl2ZSBmcmFtZSBhcmVhICovCisgIHVuc2lnbmVkIHNob3J0IGNyY19lcnJzOyAgICAgIC8qIENSQy1FcnJvciBjb3VudGVyICovCisgIHVuc2lnbmVkIHNob3J0IGFsbl9lcnJzOyAgICAgIC8qIGFsaWdubWVudGVycm9yIGNvdW50ZXIgKi8KKyAgdW5zaWduZWQgc2hvcnQgcnNjX2VycnM7ICAgICAgLyogUmVzb3VyY2VlcnJvciBjb3VudGVyICovCisgIHVuc2lnbmVkIHNob3J0IG92cm5fZXJyczsgICAgIC8qIE9WZXJydW5lcnJvciBjb3VudGVyICovCit9OworCisvKgorICogcG9zc2libGUgY29tbWFuZCB2YWx1ZXMgZm9yIHRoZSBjb21tYW5kIHdvcmQKKyAqLworI2RlZmluZSBSVUNfTUFTSwkweDAwNzAJLyogbWFzayBmb3IgUlUgY29tbWFuZHMgKi8KKyNkZWZpbmUgUlVDX05PUAkJMHgwMDAwCS8qIE5PUC1jb21tYW5kICovCisjZGVmaW5lIFJVQ19TVEFSVAkweDAwMTAJLyogc3RhcnQgUlUgKi8KKyNkZWZpbmUgUlVDX1JFU1VNRQkweDAwMjAJLyogcmVzdW1lIFJVIGFmdGVyIHN1c3BlbmQgKi8KKyNkZWZpbmUgUlVDX1NVU1BFTkQJMHgwMDMwCS8qIHN1c3BlbmQgUlUgKi8KKyNkZWZpbmUgUlVDX0FCT1JUCTB4MDA0MAkvKiBhYm9ydCByZWNlaXZlciBvcGVyYXRpb24gaW1tZWRpYXRlbHkgKi8KKworI2RlZmluZSBDVUNfTUFTSwkweDA3MDAJLyogbWFzayBmb3IgQ1UgY29tbWFuZCAqLworI2RlZmluZSBDVUNfTk9QCQkweDAwMDAJLyogTk9QLWNvbW1hbmQgKi8KKyNkZWZpbmUgQ1VDX1NUQVJUCTB4MDEwMAkvKiBzdGFydCBleGVjdXRpb24gb2YgMS4gY21kIG9uIHRoZSBDQkwgKi8KKyNkZWZpbmUgQ1VDX1JFU1VNRQkweDAyMDAJLyogcmVzdW1lIGFmdGVyIHN1c3BlbmQgKi8KKyNkZWZpbmUgQ1VDX1NVU1BFTkQJMHgwMzAwCS8qIFN1c3BlbmQgQ1UgKi8KKyNkZWZpbmUgQ1VDX0FCT1JUCTB4MDQwMAkvKiBhYm9ydCBjb21tYW5kIG9wZXJhdGlvbiBpbW1lZGlhdGVseSAqLworCisjZGVmaW5lIEFDS19NQVNLCTB4ZjAwMAkvKiBtYXNrIGZvciBBQ0sgY29tbWFuZCAqLworI2RlZmluZSBBQ0tfQ1gJCTB4ODAwMAkvKiBhY2tub3dsZWRnZXMgU1RBVF9DWCAqLworI2RlZmluZSBBQ0tfRlIJCTB4NDAwMAkvKiBhY2suIFNUQVRfRlIgKi8KKyNkZWZpbmUgQUNLX0NOQQkJMHgyMDAwCS8qIGFjay4gU1RBVF9DTkEgKi8KKyNkZWZpbmUgQUNLX1JOUgkJMHgxMDAwCS8qIGFjay4gU1RBVF9STlIgKi8KKworLyoKKyAqIHBvc3NpYmxlIHN0YXR1cyB2YWx1ZXMgZm9yIHRoZSBzdGF0dXMgd29yZAorICovCisjZGVmaW5lIFNUQVRfTUFTSwkweGYwMDAJLyogbWFzayBmb3IgY2F1c2Ugb2YgaW50ZXJydXB0ICovCisjZGVmaW5lIFNUQVRfQ1gJCTB4ODAwMAkvKiBDVSBmaW5pc2hlZCBjbWQgd2l0aCBpdHMgSSBiaXQgc2V0ICovCisjZGVmaW5lIFNUQVRfRlIJCTB4NDAwMAkvKiBSVSBmaW5pc2hlZCByZWNlaXZpbmcgYSBmcmFtZSAqLworI2RlZmluZSBTVEFUX0NOQQkweDIwMDAJLyogQ1UgbGVmdCBhY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgU1RBVF9STlIJMHgxMDAwCS8qIFJVIGxlZnQgcmVhZHkgc3RhdGUgKi8KKworI2RlZmluZSBDVV9TVEFUVVMJMHg3MDAJLyogQ1Ugc3RhdHVzLCAwPWlkbGUgKi8KKyNkZWZpbmUgQ1VfU1VTUEVORAkweDEwMAkvKiBDVSBpcyBzdXNwZW5kZWQgKi8KKyNkZWZpbmUgQ1VfQUNUSVZFCTB4MjAwCS8qIENVIGlzIGFjdGl2ZSAqLworCisjZGVmaW5lIFJVX1NUQVRVUwkweDcwCS8qIFJVIHN0YXR1cywgMD1pZGxlICovCisjZGVmaW5lIFJVX1NVU1BFTkQJMHgxMAkvKiBSVSBzdXNwZW5kZWQgKi8KKyNkZWZpbmUgUlVfTk9TUEFDRQkweDIwCS8qIFJVIG5vIHJlc291cmNlcyAqLworI2RlZmluZSBSVV9SRUFEWQkweDQwCS8qIFJVIGlzIHJlYWR5ICovCisKKy8qCisgKiBSZWNlaXZlIEZyYW1lIERlc2NyaXB0b3IgKFJGRCkKKyAqLworc3RydWN0IHJmZF9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgc2hvcnQgc3RhdHVzOwkvKiBzdGF0dXMgd29yZCAqLworICB1bnNpZ25lZCBzaG9ydCBsYXN0OwkJLyogQml0MTUsTGFzdCBGcmFtZSBvbiBMaXN0IC8gQml0MTQsc3VzcGVuZCAqLworICB1bnNpZ25lZCBzaG9ydCBuZXh0OwkJLyogbGlua29mZnNldCB0byBuZXh0IFJGRCAqLworICB1bnNpZ25lZCBzaG9ydCByYmRfb2Zmc2V0OwkvKiBwb2ludGVyb2Zmc2V0IHRvIFJCRC1idWZmZXIgKi8KKyAgdW5zaWduZWQgY2hhciAgZGVzdFs2XTsJLyogZXRoZXJuZXQtYWRkcmVzcywgZGVzdGluYXRpb24gKi8KKyAgdW5zaWduZWQgY2hhciAgc291cmNlWzZdOwkvKiBldGhlcm5ldC1hZGRyZXNzLCBzb3VyY2UgKi8KKyAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOwkvKiA4MDIuMyBmcmFtZS1sZW5ndGggKi8KKyAgdW5zaWduZWQgc2hvcnQgemVyb19kdW1teTsJLyogZHVtbXkgKi8KK307CisKKyNkZWZpbmUgUkZEX0xBU1QgICAgIDB4ODAwMAkvKiBsYXN0OiBsYXN0IHJmZCBpbiB0aGUgbGlzdCAqLworI2RlZmluZSBSRkRfU1VTUCAgICAgMHg0MDAwCS8qIGxhc3Q6IHN1c3BlbmQgUlUgYWZ0ZXIgICovCisjZGVmaW5lIFJGRF9FUlJNQVNLICAweDBmZTEgICAgIC8qIHN0YXR1czogZXJyb3JtYXNrICovCisjZGVmaW5lIFJGRF9NQVRDSEFERCAweDAwMDIgICAgIC8qIHN0YXR1czogRGVzdGluYXRpb25hZGRyZXNzICFtYXRjaGVzIElBICovCisjZGVmaW5lIFJGRF9STlIgICAgICAweDAyMDAJLyogc3RhdHVzOiByZWNlaXZlciBvdXQgb2YgcmVzb3VyY2VzICovCisKKy8qCisgKiBSZWNlaXZlIEJ1ZmZlciBEZXNjcmlwdG9yIChSQkQpCisgKi8KK3N0cnVjdCByYmRfc3RydWN0IAoreworICB1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CS8qIHN0YXR1cyB3b3JkLG51bWJlciBvZiB1c2VkIGJ5dGVzIGluIGJ1ZmYgKi8KKyAgdW5zaWduZWQgc2hvcnQgbmV4dDsJCS8qIHBvaW50ZXJvZmZzZXQgdG8gbmV4dCBSQkQgKi8KKyAgY2hhciAgICAgICAgICAqYnVmZmVyOwkvKiByZWNlaXZlIGJ1ZmZlciBhZGRyZXNzIHBvaW50ZXIgKi8KKyAgdW5zaWduZWQgc2hvcnQgc2l6ZTsJCS8qIHNpemUgb2YgdGhpcyBidWZmZXIgKi8KKyAgdW5zaWduZWQgc2hvcnQgemVyb19kdW1teTsgICAgLyogZHVtbXkgKi8KK307CisKKyNkZWZpbmUgUkJEX0xBU1QJMHg4MDAwCS8qIGxhc3QgYnVmZmVyICovCisjZGVmaW5lIFJCRF9VU0VECTB4NDAwMAkvKiB0aGlzIGJ1ZmZlciBoYXMgZGF0YSAqLworI2RlZmluZSBSQkRfTUFTSwkweDNmZmYJLyogc2l6ZS1tYXNrIGZvciBsZW5ndGggKi8KKworLyoKKyAqIFN0YXR1c3ZhbHVlcyBmb3IgQ29tbWFuZHMvUkZECisgKi8KKyNkZWZpbmUgU1RBVF9DT01QTCAgIDB4ODAwMAkvKiBzdGF0dXM6IGZyYW1lL2NvbW1hbmQgaXMgY29tcGxldGUgKi8KKyNkZWZpbmUgU1RBVF9CVVNZICAgIDB4NDAwMAkvKiBzdGF0dXM6IGZyYW1lL2NvbW1hbmQgaXMgYnVzeSAqLworI2RlZmluZSBTVEFUX09LICAgICAgMHgyMDAwCS8qIHN0YXR1czogZnJhbWUvY29tbWFuZCBpcyBvayAqLworCisvKgorICogQWN0aW9uLUNvbW1hbmRzCisgKi8KKyNkZWZpbmUgQ01EX05PUAkJMHgwMDAwCS8qIE5PUCAqLworI2RlZmluZSBDTURfSUFTRVRVUAkweDAwMDEJLyogaW5pdGlhbCBhZGRyZXNzIHNldHVwIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ01EX0NPTkZJR1VSRQkweDAwMDIJLyogY29uZmlndXJlIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ01EX01DU0VUVVAJMHgwMDAzCS8qIE1DIHNldHVwIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ01EX1hNSVQJMHgwMDA0CS8qIHRyYW5zbWl0IGNvbW1hbmQgKi8KKyNkZWZpbmUgQ01EX1REUgkJMHgwMDA1CS8qIHRpbWUgZG9tYWluIHJlZmxlY3RvbWV0ZXIgKFREUikgY29tbWFuZCAqLworI2RlZmluZSBDTURfRFVNUAkweDAwMDYJLyogZHVtcCBjb21tYW5kICovCisjZGVmaW5lIENNRF9ESUFHTk9TRQkweDAwMDcJLyogZGlhZ25vc2UgY29tbWFuZCAqLworCisvKgorICogQWN0aW9uIGNvbW1hbmQgYml0cworICovCisjZGVmaW5lIENNRF9MQVNUCTB4ODAwMAkvKiBpbmRpY2F0ZXMgbGFzdCBjb21tYW5kIGluIHRoZSBDQkwgKi8KKyNkZWZpbmUgQ01EX1NVU1BFTkQJMHg0MDAwCS8qIHN1c3BlbmQgQ1UgYWZ0ZXIgdGhpcyBDQiAqLworI2RlZmluZSBDTURfSU5UCQkweDIwMDAJLyogZ2VuZXJhdGUgaW50ZXJydXB0IGFmdGVyIGV4ZWN1dGlvbiAqLworCisvKgorICogTk9QIC0gY29tbWFuZAorICovCitzdHJ1Y3Qgbm9wX2NtZF9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgc2hvcnQgY21kX3N0YXR1czsJLyogc3RhdHVzIG9mIHRoaXMgY29tbWFuZCAqLworICB1bnNpZ25lZCBzaG9ydCBjbWRfY21kOyAgICAgICAvKiB0aGUgY29tbWFuZCBpdHNlbGYgKCtiaXRzKSAqLworICB1bnNpZ25lZCBzaG9ydCBjbWRfbGluazsgICAgICAvKiBvZmZzZXRwb2ludGVyIHRvIG5leHQgY29tbWFuZCAqLworfTsKKworLyoKKyAqIElBIFNldHVwIGNvbW1hbmQKKyAqLworc3RydWN0IGlhc2V0dXBfY21kX3N0cnVjdCAKK3sKKyAgdW5zaWduZWQgc2hvcnQgY21kX3N0YXR1czsKKyAgdW5zaWduZWQgc2hvcnQgY21kX2NtZDsKKyAgdW5zaWduZWQgc2hvcnQgY21kX2xpbms7CisgIHVuc2lnbmVkIGNoYXIgIGlhZGRyWzZdOworfTsKKworLyoKKyAqIENvbmZpZ3VyZSBjb21tYW5kIAorICovCitzdHJ1Y3QgY29uZmlndXJlX2NtZF9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgc2hvcnQgY21kX3N0YXR1czsKKyAgdW5zaWduZWQgc2hvcnQgY21kX2NtZDsKKyAgdW5zaWduZWQgc2hvcnQgY21kX2xpbms7CisgIHVuc2lnbmVkIGNoYXIgIGJ5dGVfY250OyAgIC8qIHNpemUgb2YgdGhlIGNvbmZpZy1jbWQgKi8KKyAgdW5zaWduZWQgY2hhciAgZmlmbzsgICAgICAgLyogZmlmby9yZWN2IG1vbml0b3IgKi8KKyAgdW5zaWduZWQgY2hhciAgc2F2X2JmOyAgICAgLyogc2F2ZSBiYWQgZnJhbWVzIChiaXQ3PTEpKi8KKyAgdW5zaWduZWQgY2hhciAgYWRyX2xlbjsgICAgLyogYWRyX2xlbigwLTIpLGFsX2xvYygzKSxwcmVhbSg0LTUpLGxvb3BiYWsoNi03KSovCisgIHVuc2lnbmVkIGNoYXIgIHByaW9yaXR5OyAgIC8qIGxpbl9wcmlvKDAtMiksZXhwX3ByaW8oNC02KSxib2ZfbWV0ZCg3KSAqLworICB1bnNpZ25lZCBjaGFyICBpZnM7ICAgICAgICAvKiBpbnRlciBmcmFtZSBzcGFjaW5nICovCisgIHVuc2lnbmVkIGNoYXIgIHRpbWVfbG93OyAgIC8qIHNsb3QgdGltZSBsb3cgKi8KKyAgdW5zaWduZWQgY2hhciAgdGltZV9oaWdoOyAgLyogc2xvdCB0aW1lIGhpZ2goMC0yKSBhbmQgbWF4LiByZXRyaWVzKDQtNykgKi8KKyAgdW5zaWduZWQgY2hhciAgcHJvbWlzYzsgICAgLyogcHJvbWlzYy1tb2RlKDApICwgZXQgYWwgKDEtNykgKi8KKyAgdW5zaWduZWQgY2hhciAgY2Fycl9jb2xsOyAgLyogY2FycmllcigwLTMpL2NvbGxpc2lvbig0LTcpIHN0dWZmICovCisgIHVuc2lnbmVkIGNoYXIgIGZyYW1fbGVuOyAgIC8qIG1pbmltYWwgZnJhbWUgbGVuICovCisgIHVuc2lnbmVkIGNoYXIgIGR1bW15OwkgICAgIC8qIGR1bW15ICovCit9OworCisvKgorICogTXVsdGljYXN0IFNldHVwIGNvbW1hbmQgCisgKi8KK3N0cnVjdCBtY3NldHVwX2NtZF9zdHJ1Y3QgCit7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9zdGF0dXM7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9jbWQ7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9saW5rOworICB1bnNpZ25lZCBzaG9ydCBtY19jbnQ7CQkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIE1DLUxpc3QgKi8KKyAgdW5zaWduZWQgY2hhciAgbWNfbGlzdFswXVs2XTsgIAkvKiBwb2ludGVyIHRvIDYgYnl0ZXMgZW50cmllcyAqLworfTsKKworLyoKKyAqIHRyYW5zbWl0IGNvbW1hbmQgCisgKi8KK3N0cnVjdCB0cmFuc21pdF9jbWRfc3RydWN0IAoreworICB1bnNpZ25lZCBzaG9ydCBjbWRfc3RhdHVzOworICB1bnNpZ25lZCBzaG9ydCBjbWRfY21kOworICB1bnNpZ25lZCBzaG9ydCBjbWRfbGluazsKKyAgdW5zaWduZWQgc2hvcnQgdGJkX29mZnNldDsJLyogcG9pbnRlcm9mZnNldCB0byBUQkQgKi8KKyAgdW5zaWduZWQgY2hhciAgZGVzdFs2XTsgICAgICAgLyogZGVzdGluYXRpb24gYWRkcmVzcyBvZiB0aGUgZnJhbWUgKi8KKyAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOwkvKiB1c2VyIGRlZmluZWQ6IDgwMi4zIGxlbmd0aCAvIEV0aGVyIHR5cGUgKi8KK307CisKKyNkZWZpbmUgVENNRF9FUlJNQVNLICAgICAweDBmYTAKKyNkZWZpbmUgVENNRF9NQVhDT0xMTUFTSyAweDAwMGYKKyNkZWZpbmUgVENNRF9NQVhDT0xMICAgICAweDAwMjAKKyNkZWZpbmUgVENNRF9IRUFSVEJFQVQgICAweDAwNDAKKyNkZWZpbmUgVENNRF9ERUZFUlJFRCAgICAweDAwODAKKyNkZWZpbmUgVENNRF9VTkRFUlJVTiAgICAweDAxMDAKKyNkZWZpbmUgVENNRF9MT1NUQ1RTICAgICAweDAyMDAKKyNkZWZpbmUgVENNRF9OT0NBUlJJRVIgICAweDA0MDAKKyNkZWZpbmUgVENNRF9MQVRFQ09MTCAgICAweDA4MDAKKworc3RydWN0IHRkcl9jbWRfc3RydWN0Cit7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9zdGF0dXM7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9jbWQ7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9saW5rOworICB1bnNpZ25lZCBzaG9ydCBzdGF0dXM7Cit9OworCisjZGVmaW5lIFREUl9MTktfT0sJMHg4MDAwCS8qIE5vIGxpbmsgcHJvYmxlbSBpZGVudGlmaWVkICovCisjZGVmaW5lIFREUl9YQ1ZSX1BSQgkweDQwMDAJLyogaW5kaWNhdGVzIGEgdHJhbnNjZWl2ZXIgcHJvYmxlbSAqLworI2RlZmluZSBURFJfRVRfT1BOCTB4MjAwMAkvKiBvcGVuLCBubyBjb3JyZWN0IHRlcm1pbmF0aW9uICovCisjZGVmaW5lIFREUl9FVF9TUlQJMHgxMDAwCS8qIFREUiBkZXRlY3RlZCBhIHNob3J0IGNpcmN1aXQgKi8KKyNkZWZpbmUgVERSX1RJTUVNQVNLCTB4MDdmZgkvKiBtYXNrIGZvciB0aGUgdGltZSBmaWVsZCAqLworCisvKgorICogVHJhbnNtaXQgQnVmZmVyIERlc2NyaXB0b3IgKFRCRCkKKyAqLworc3RydWN0IHRiZF9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgc2hvcnQgc2l6ZTsJCS8qIHNpemUgKyBFT0YtRmxhZygxNSkgKi8KKyAgdW5zaWduZWQgc2hvcnQgbmV4dDsgICAgICAgICAgLyogcG9pbnRlcm9mZnNldCB0byBuZXh0IFRCRCAqLworICBjaGFyICAgICAgICAgICpidWZmZXI7ICAgICAgICAvKiBwb2ludGVyIHRvIGJ1ZmZlciAqLworfTsKKworI2RlZmluZSBUQkRfTEFTVCAweDgwMDAgICAgICAgICAvKiBFT0YtRmxhZywgaW5kaWNhdGVzIGxhc3QgYnVmZmVyIGluIGxpc3QgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorVmVyYmF0aW0gZnJvbSB0aGUgQ3J5bnd5ciBzdHVmZjoKKworICAgIFRoZSAzYzUyMyByZXNwb25kcyB3aXRoIGFkYXB0ZXIgY29kZSAweDYwNDIgYXQgc2xvdAorcmVnaXN0ZXJzIHh4eDAgYW5kIHh4eDEuICBUaGUgc2V0dXAgcmVnaXN0ZXIgaXMgYXQgeHh4MiBhbmQKK2NvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYml0czoKKworMDogY2FyZCBlbmFibGUKKzIsMTogY3NyIGFkZHJlc3Mgc2VsZWN0CisgICAgMDAgPSAwMzAwCisgICAgMDEgPSAxMzAwCisgICAgMTAgPSAyMzAwCisgICAgMTEgPSAzMzAwCis0LDM6IHNoYXJlZCBtZW1vcnkgYWRkcmVzcyBzZWxlY3QKKyAgICAwMCA9IDBjMDAwMAorICAgIDAxID0gMGM4MDAwCisgICAgMTAgPSAwZDAwMDAKKyAgICAxMSA9IDBkODAwMAorNTogc2V0IHRvIGRpc2FibGUgb24tYm9hcmQgdGhpbm5ldAorNyw2OiAocmVhZC1vbmx5KSBzaG93cyBzZWxlY3RlZCBpcnEKKyAgICAwMCA9IDEyCisgICAgMDEgPSA3CisgICAgMTAgPSAzCisgICAgMTEgPSA5CisKK1RoZSBpbnRlcnJ1cHQtc2VsZWN0IHJlZ2lzdGVyIGlzIGF0IHh4eDMgYW5kIHVzZXMgb25lIGJpdCBwZXIgaXJxLgorCiswOiBpbnQgMTIKKzE6IGludCA3CisyOiBpbnQgMworMzogaW50IDkKKworICAgIEFnYWluLCB0aGUgZG9jdW1lbnRhdGlvbiBzdHJlc3NlcyB0aGF0IHRoZSBzZXR1cCByZWdpc3Rlcgorc2hvdWxkIG5ldmVyIGJlIHdyaXR0ZW4uICBUaGUgaW50ZXJydXB0LXNlbGVjdCByZWdpc3RlciBtYXkgYmUKK3dyaXR0ZW4gd2l0aCB0aGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byBiaXRzIDcuNiBpbgordGhlIHNldHVwIHJlZ2lzdGVyIHRvIGluc3VyZSBjb3JyZXQgc2V0dXAuCisqLworCisvKiBPZmZzZXRzIGZyb20gdGhlIGJhc2UgSS9PIGFkZHJlc3MuICovCisjZGVmaW5lCUVMTUNfU0EJCTAJLyogZmlyc3QgNiBieXRlcyBhcmUgSUVFRSBuZXR3b3JrIGFkZHJlc3MgKi8KKyNkZWZpbmUgRUxNQ19DVFJMCTYJLyogY29udHJvbCAmIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBFTE1DX1JFVklTSU9OCTcJLyogcmV2aXNpb24gcmVnaXN0ZXIsIGZpcnN0IDQgYml0cyBvbmx5ICovCisjZGVmaW5lIEVMTUNfSU9fRVhURU5UICA4CisKKy8qIHRoZXNlIGFyZSB0aGUgYml0IHNlbGVjdHMgZm9yIHRoZSBwb3J0IHJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgRUxNQ19TVEFUVVNfRU5BQkxFRAkweDAxCisjZGVmaW5lIEVMTUNfU1RBVFVTX0NTUl9TRUxFQ1QJMHgwNgorI2RlZmluZSBFTE1DX1NUQVRVU19NRU1PUllfU0VMRUNUCTB4MTgKKyNkZWZpbmUgRUxNQ19TVEFUVVNfRElTQUJMRV9USElOCTB4MjAKKyNkZWZpbmUgRUxNQ19TVEFUVVNfSVJRX1NFTEVDVAkweGMwCisKKy8qIHRoaXMgaXMgdGhlIGNhcmQgaWQgdXNlZCBpbiB0aGUgZGV0ZWN0aW9uIGNvZGUuICBZb3UgbWlnaHQgcmVjb2duaXplCitpdCBmcm9tIEA2MDQyLmFkZiAqLworI2RlZmluZSBFTE1DX01DQV9JRCAweDYwNDIKKworLyoKKyAgIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBiaXRzIGZvciB0aGUgY29udHJvbCAmIHN0YXR1cyByZWdpc3RlcgorCisgICBUaGUgYmFuayBzZWxlY3QgcmVnaXN0ZXJzIGNhbiBiZSB1c2VkIGlmIG1vcmUgdGhhbiAxNksgb2YgbWVtb3J5IGlzCisgICBvbiB0aGUgY2FyZC4gIEZvciBzb21lIHN0dXBpZCByZWFzb24sIGJhbmsgMyBpcyB0aGUgb25lIGZvciB0aGUKKyAgIGJvdHRvbSAxNkssIGFuZCB0aGUgY2FyZCBkZWZhdWx0cyB0byBiYW5rIDAuICBTbyB3ZSBoYXZlIHRvIHNldCB0aGUKKyAgIGJhbmsgdG8gMyBiZWZvcmUgdGhlIGNhcmQgd2lsbCBldmVuIHRoaW5rIG9mIG9wZXJhdGluZy4gIFRvIGdldCBiYW5rCisgICAzLCBzZXQgQlMwIGFuZCBCUzEgdG8gaGlnaCAob2YgY291cnNlLi4uKQorKi8KKyNkZWZpbmUgRUxNQ19DVFJMX0JTMAkweDAxCS8qIFJXIGJhbmsgc2VsZWN0ICovCisjZGVmaW5lIEVMTUNfQ1RSTF9CUzEJMHgwMgkvKiBSVyBiYW5rIHNlbGVjdCAqLworI2RlZmluZSBFTE1DX0NUUkxfSU5URQkweDA0CS8qIFJXIGludGVycnVwdCBlbmFibGUsIGFzc2VydCBoaWdoICovCisjZGVmaW5lIEVMTUNfQ1RSTF9JTlQJMHgwOAkvKiBSIGludGVycnVwdCBhY3RpdmUsIGFzc2VydCBoaWdoICovCisvKiNkZWZpbmUgRUxNQ19DVFJMXyoJMHgxMCovCS8qIHJlc2VydmVkICovCisjZGVmaW5lIEVMTUNfQ1RSTF9MQksJMHgyMAkvKiBSVyBsb29wYmFjayBlbmFibGUsIGFzc2VydCBoaWdoICovCisjZGVmaW5lIEVMTUNfQ1RSTF9DQQkweDQwCS8qIFJXIGNoYW5uZWwgYXR0ZW50aW9uLCBhc3NlcnQgaGlnaCAqLworI2RlZmluZSBFTE1DX0NUUkxfUlNUCTB4ODAJLyogUlcgODI1ODYgcmVzZXQsIGFzc2VydCBsb3cgKi8KKworLyogc29tZSBoYW5keSBjb21wb3VuZCBiaXRzICovCisKKy8qIG5vcm1hbCBvcGVyYXRpb24gc2hvdWxkIGhhdmUgYmFuayAzIGFuZCBSU1QgaGlnaCwgaW50cyBlbmFibGVkICovCisjZGVmaW5lIEVMTUNfTk9STUFMIChFTE1DX0NUUkxfSU5URXxFTE1DX0NUUkxfUlNUfDB4MykKKworI2VuZGlmIC8qIF8zYzUyM19JTkNMVURFXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MjcuYyBiL2RyaXZlcnMvbmV0LzNjNTI3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRiMzMwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0LzNjNTI3LmMKQEAgLTAsMCArMSwxNjc1IEBACisvKiAzYzUyNy5jOiAzQ29tIEV0aGVybGluay9NQzMyIGRyaXZlciBmb3IgTGludXggMi40IGFuZCAyLjYuCisgKgorICoJKGMpIENvcHlyaWdodCAxOTk4IFJlZCBIYXQgU29mdHdhcmUgSW5jCisgKglXcml0dGVuIGJ5IEFsYW4gQ294LiAKKyAqCUZ1cnRoZXIgZGVidWdnaW5nIGJ5IENhcmwgRHJvdWdnZS4KKyAqICAgICAgSW5pdGlhbCBTTVAgc3VwcG9ydCBieSBGZWxpcGUgVyBEYW1hc2lvIDxmZWxpcGV3ZEB0ZXJyYS5jb20uYnI+CisgKiAgICAgIEhlYXZpbHkgbW9kaWZpZWQgYnkgUmljaGFyZCBQcm9jdGVyIDxybnBAcGFyYWRpc2UubmV0Lm56PgorICoKKyAqCUJhc2VkIG9uIHNrZWxldG9uLmMgd3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIgYW5kIG5lMi5jCisgKgkoZm9yIHRoZSBNQ0Egc3R1ZmYpIHdyaXR0ZW4gYnkgV2ltIER1bW9uLgorICoKKyAqCVRoYW5rcyB0byAzQ29tIGZvciBtYWtpbmcgdGhpcyBwb3NzaWJsZSBieSBwcm92aWRpbmcgbWUgd2l0aCB0aGUKKyAqCWRvY3VtZW50YXRpb24uCisgKgorICoJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICoJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKi8KKworI2RlZmluZSBEUlZfTkFNRQkJIjNjNTI3IgorI2RlZmluZSBEUlZfVkVSU0lPTgkJIjAuNy1TTVAiCisjZGVmaW5lIERSVl9SRUxEQVRFCQkiMjAwMy8wOS8yMSIKKworc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb24gPQorRFJWX05BTUUgIi5jOnYiIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURSAiIFJpY2hhcmQgUHJvY3RlciA8cm5wQHBhcmFkaXNlLm5ldC5uej5cbiI7CisKKy8qKgorICogRE9DOiBUcmFwcyBmb3IgdGhlIHVud2FyeQorICoKKyAqCVRoZSBkaWFncmFtIChGaWd1cmUgMS0xKSBhbmQgdGhlIFBPUyBzdW1tYXJ5IGRpc2FncmVlIHdpdGggdGhlCisgKgkiSW50ZXJydXB0IExldmVsIiBzZWN0aW9uIGluIHRoZSBtYW51YWwuCisgKgorICoJVGhlIG1hbnVhbCBjb250cmFkaWN0cyBpdHNlbGYgd2hlbiBkZXNjcmliaW5nIHRoZSBtaW5pbXVtIG51bWJlciAKKyAqCWJ1ZmZlcnMgaW4gdGhlICdjb25maWd1cmUgbGlzdHMnIGNvbW1hbmQuIAorICoJTXkgY2FyZCBhY2NlcHRzIGEgYnVmZmVyIGNvbmZpZyBvZiA0LzQuIAorICoKKyAqCVNldHRpbmcgdGhlIFNBViBCUCBiaXQgZG9lcyBub3Qgc2F2ZSBiYWQgcGFja2V0cywgYnV0CisgKglvbmx5IGVuYWJsZXMgUlggb24tY2FyZCBzdGF0cyBjb2xsZWN0aW9uLiAKKyAqCisgKglUaGUgZG9jdW1lbnRhdGlvbiBpbiBwbGFjZXMgc2VlbXMgdG8gbWlzcyB0aGluZ3MuIEluIGFjdHVhbCBmYWN0CisgKglJJ3ZlIGFsd2F5cyBldmVudHVhbGx5IGZvdW5kIGV2ZXJ5dGhpbmcgaXMgZG9jdW1lbnRlZCwgaXQganVzdAorICoJcmVxdWlyZXMgY2FyZWZ1bCBzdHVkeS4KKyAqCisgKiBET0M6IFRoZW9yeSBPZiBPcGVyYXRpb24KKyAqCisgKglUaGUgM2NvbSAzYzUyNyBpcyBhIDMyYml0IE1DQSBidXMgbWFzdGVyaW5nIGFkYXB0ZXIgd2l0aCBhIGxhcmdlCisgKglhbW91bnQgb2Ygb24gYm9hcmQgaW50ZWxsaWdlbmNlIHRoYXQgaG91c2VrZWVwcyBhIHNvbWV3aGF0IGR1bWJlcgorICoJSW50ZWwgTklDLiBGb3IgcGVyZm9ybWFuY2Ugd2Ugd2FudCB0byBrZWVwIHRoZSB0cmFuc21pdCBxdWV1ZSBkZWVwCisgKglhcyB0aGUgY2FyZCBjYW4gdHJhbnNtaXQgcGFja2V0cyB3aGlsZSBmZXRjaGluZyBvdGhlcnMgZnJvbSBtYWluCisgKgltZW1vcnkgYnkgYnVzIG1hc3RlciBETUEuIFRyYW5zbWlzc2lvbiBhbmQgcmVjZXB0aW9uIGFyZSBkcml2ZW4gYnkKKyAqCWNpcmN1bGFyIGJ1ZmZlciBxdWV1ZXMuCisgKgorICoJVGhlIG1haWxib3hlcyBjYW4gYmUgdXNlZCBmb3IgY29udHJvbGxpbmcgaG93IHRoZSBjYXJkIHRyYXZlcnNlcworICoJaXRzIGJ1ZmZlciByaW5ncywgYnV0IGFyZSB1c2VkIG9ubHkgZm9yIGluaXRhbCBzZXR1cCBpbiB0aGlzCisgKglpbXBsZW1lbnRhdGlvbi4gIFRoZSBleGVjIG1haWxib3ggYWxsb3dzIGEgdmFyaWV0eSBvZiBjb21tYW5kcyB0bworICoJYmUgZXhlY3V0ZWQuIEVhY2ggY29tbWFuZCBtdXN0IGNvbXBsZXRlIGJlZm9yZSB0aGUgbmV4dCBpcworICoJZXhlY3V0ZWQuIFByaW1hcmlseSB3ZSB1c2UgdGhlIGV4ZWMgbWFpbGJveCBmb3IgY29udHJvbGxpbmcgdGhlCisgKgltdWx0aWNhc3QgbGlzdHMuICBXZSBoYXZlIHRvIGRvIGEgY2VydGFpbiBhbW91bnQgb2YgaW50ZXJlc3RpbmcKKyAqCWhvb3AganVtcGluZyBhcyB0aGUgbXVsdGljYXN0IGxpc3QgY2hhbmdlcyBjYW4gb2NjdXIgaW4gaW50ZXJydXB0CisgKglzdGF0ZSB3aGVuIHRoZSBjYXJkIGhhcyBhbiBleGVjIGNvbW1hbmQgcGVuZGluZy4gV2UgZGVmZXIgc3VjaAorICoJZXZlbnRzIHVudGlsIHRoZSBjb21tYW5kIGNvbXBsZXRpb24gaW50ZXJydXB0LgorICoKKyAqCUEgY29weSBicmVhayBzY2hlbWUgKHRha2VuIGZyb20gM2M1OXguYykgaXMgZW1wbG95ZWQgd2hlcmVieQorICoJcmVjZWl2ZWQgZnJhbWVzIGV4Y2VlZGluZyBhIGNvbmZpZ3VyYWJsZSBsZW5ndGggYXJlIHBhc3NlZAorICoJZGlyZWN0bHkgdG8gdGhlIGhpZ2hlciBuZXR3b3JraW5nIGxheWVycyB3aXRob3V0IGluY3VyaW5nIGEgY29weSwKKyAqCWluIHdoYXQgYW1vdW50cyB0byBhIHRpbWUvc3BhY2UgdHJhZGUtb2ZmLgorICoJIAorICoJVGhlIGNhcmQgYWxzbyBrZWVwcyBhIGxhcmdlIGFtb3VudCBvZiBzdGF0aXN0aWNhbCBpbmZvcm1hdGlvbgorICoJb24tYm9hcmQuIEluIGEgcGVyZmVjdCB3b3JsZCwgdGhlc2UgY291bGQgYmUgdXNlZCBzYWZlbHkgYXQgbm8KKyAqCWNvc3QuIEhvd2V2ZXIsIGxhY2tpbmcgaW5mb3JtYXRpb24gdG8gdGhlIGNvbnRyYXJ5LCBwcm9jZXNzaW5nCisgKgl0aGVtIHdpdGhvdXQgcmFjZXMgd291bGQgaW52b2x2ZSBzbyBtdWNoIGV4dHJhIGNvbXBsZXhpdHkgYXMgdG8KKyAqCW1ha2UgaXQgdW53b3J0aHdoaWxlIHRvIGRvIHNvLiBJbiB0aGUgZW5kLCBhIGh5YnJpZCBTVy9IVworICoJaW1wbGVtZW50YXRpb24gd2FzIG1hZGUgbmVjZXNzYXJ5IC0tLSBzZWUgbWMzMl91cGRhdGVfc3RhdHMoKS4gIAorICoKKyAqIERPQzogTm90ZXMKKyAqCQorICoJSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHVzZSB0d28gb3IgbW9yZSBjYXJkcywgYnV0IGF0IHRoaXMgc3RhZ2UKKyAqCW9ubHkgYnkgbG9hZGluZyB0d28gY29waWVzIG9mIHRoZSBzYW1lIG1vZHVsZS4KKyAqCisgKglUaGUgb24tYm9hcmQgODI1ODYgTklDIGhhcyB0cm91YmxlIHJlY2VpdmluZyBtdWx0aXBsZQorICoJYmFjay10by1iYWNrIGZyYW1lcyBhbmQgc28gaXMgbGlrZWx5IHRvIGRyb3AgcGFja2V0cyBmcm9tIGZhc3QKKyAqCXNlbmRlcnMuCisqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2EtbGVnYWN5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisjaW5jbHVkZSAiM2M1MjcuaCIKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogVGhlIG5hbWUgb2YgdGhlIGNhcmQuIElzIHVzZWQgZm9yIG1lc3NhZ2VzIGFuZCBpbiB0aGUgcmVxdWVzdHMgZm9yCisgKiBpbyByZWdpb25zLCBpcnFzIGFuZCBkbWEgY2hhbm5lbHMKKyAqLworc3RhdGljIGNvbnN0IGNoYXIqIGNhcmRuYW1lID0gRFJWX05BTUU7CisKKy8qIHVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sID4yIGZvciBkZWJ1ZyAqLworI2lmbmRlZiBORVRfREVCVUcKKyNkZWZpbmUgTkVUX0RFQlVHIDIKKyNlbmRpZgorCisjdW5kZWYgREVCVUdfSVJRCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWMzMl9kZWJ1ZyA9IE5FVF9ERUJVRzsKKworLyogVGhlIG51bWJlciBvZiBsb3cgSS9PIHBvcnRzIHVzZWQgYnkgdGhlIGV0aGVyY2FyZC4gKi8KKyNkZWZpbmUgTUMzMl9JT19FWFRFTlQJOAorCisvKiBBcyBpbXBsZW1lbnRlZCwgdmFsdWVzIG11c3QgYmUgYSBwb3dlci1vZi0yIC0tIDQvOC8xNi8zMiAqLyAKKyNkZWZpbmUgVFhfUklOR19MRU4gICAgIDMyICAgICAgIC8qIFR5cGljYWxseSB0aGUgY2FyZCBzdXBwb3J0cyAzNyAgKi8KKyNkZWZpbmUgUlhfUklOR19MRU4gICAgIDggICAgICAgIC8qICAgICAiICAgICAgICIgICAgICAgICIgICAgICAgICAgKi8KKworLyogQ29weSBicmVhayBwb2ludCwgc2VlIGFib3ZlIGZvciBkZXRhaWxzLiAKKyAqIFNldHRpbmcgdG8gPiAxNTEyIGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoaXMgZmVhdHVyZS4JKi8JICAgIAorI2RlZmluZSBSWF9DT1BZQlJFQUsgICAgMjAwICAgICAgLyogVmFsdWUgZnJvbSAzYzU5eC5jICovCisKKy8qIElzc3VlIHRoZSA4MjU4NiB3b3JrYXJvdW5kIGNvbW1hbmQgLSB0aGlzIGlzIGZvciAiYnVzeSBsYW5zIiwgYnV0CisgKiBiYXNpY2FsbHkgbWVhbnMgZm9yIGFsbCBsYW5zIG5vdyBkYXlzIC0gaGFzIGEgcGVyZm9ybWFuY2UgKGxhdGVuY3kpIAorICogY29zdCwgYnV0IGJlc3Qgc2V0LiAqLyAKK3N0YXRpYyBjb25zdCBpbnQgV09SS0FST1VORF84MjU4Nj0xOworCisvKiBQb2ludGVycyB0byBidWZmZXJzIGFuZCB0aGVpciBvbi1jYXJkIHJlY29yZHMgKi8KK3N0cnVjdCBtYzMyX3JpbmdfZGVzYyAKK3sKKwl2b2xhdGlsZSBzdHJ1Y3Qgc2tiX2hlYWRlciAqcDsgICAgICAgICAgICAgICAgICAgIAorCXN0cnVjdCBza19idWZmICpza2I7ICAgICAgICAgIAorfTsKKworLyogSW5mb3JtYXRpb24gdGhhdCBuZWVkcyB0byBiZSBrZXB0IGZvciBlYWNoIGJvYXJkLiAqLworc3RydWN0IG1jMzJfbG9jYWwgCit7CisJaW50IHNsb3Q7CisKKwl1MzIgYmFzZTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBuZXRfc3RhdHM7CisJdm9sYXRpbGUgc3RydWN0IG1jMzJfbWFpbGJveCAqcnhfYm94OworCXZvbGF0aWxlIHN0cnVjdCBtYzMyX21haWxib3ggKnR4X2JveDsKKwl2b2xhdGlsZSBzdHJ1Y3QgbWMzMl9tYWlsYm94ICpleGVjX2JveDsKKyAgICAgICAgdm9sYXRpbGUgc3RydWN0IG1jMzJfc3RhdHMgKnN0YXRzOyAgICAvKiBTdGFydCBvZiBvbi1jYXJkIHN0YXRpc3RpY3MgKi8KKyAgICAgICAgdTE2IHR4X2NoYWluOyAgICAgICAgICAgLyogVHJhbnNtaXQgbGlzdCBzdGFydCBvZmZzZXQgKi8KKwl1MTYgcnhfY2hhaW47ICAgICAgICAgICAvKiBSZWNlaXZlIGxpc3Qgc3RhcnQgb2Zmc2V0ICovCisgICAgICAgIHUxNiB0eF9sZW47ICAgICAgICAgICAgIC8qIFRyYW5zbWl0IGxpc3QgY291bnQgKi8gCisgICAgICAgIHUxNiByeF9sZW47ICAgICAgICAgICAgIC8qIFJlY2VpdmUgbGlzdCBjb3VudCAqLworCisJdTE2IHhjZWl2ZXJfZGVzaXJlZF9zdGF0ZTsgLyogSEFMVEVEIG9yIFJVTk5JTkcgKi8KKwl1MTYgY21kX25vbmJsb2NraW5nOyAgICAvKiBUaHJlYWQgaXMgdW5pbnRlcmVzdGVkIGluIGNvbW1hbmQgcmVzdWx0ICovCisJdTE2IG1jX3JlbG9hZF93YWl0OwkvKiBBIG11bHRpY2FzdCBsb2FkIHJlcXVlc3QgaXMgcGVuZGluZyAqLworCXUzMiBtY19saXN0X3ZhbGlkOwkvKiBUcnVlIHdoZW4gdGhlIG1jbGlzdCBpcyBzZXQgKi8KKworCXN0cnVjdCBtYzMyX3JpbmdfZGVzYyB0eF9yaW5nW1RYX1JJTkdfTEVOXTsJLyogSG9zdCBUcmFuc21pdCByaW5nICovCisJc3RydWN0IG1jMzJfcmluZ19kZXNjIHJ4X3JpbmdbUlhfUklOR19MRU5dOwkvKiBIb3N0IFJlY2VpdmUgcmluZyAqLworCisJYXRvbWljX3QgdHhfY291bnQ7CS8qIGJ1ZmZlcnMgbGVmdCAqLworCWF0b21pY190IHR4X3JpbmdfaGVhZDsgIC8qIGluZGV4IHRvIHR4IGVuLXF1ZXVlIGVuZCAqLworCXUxNiB0eF9yaW5nX3RhaWw7ICAgICAgIC8qIGluZGV4IHRvIHR4IGRlLXF1ZXVlIGVuZCAqLworCisJdTE2IHJ4X3JpbmdfdGFpbDsgICAgICAgLyogaW5kZXggdG8gcnggZGUtcXVldWUgZW5kICovIAorCisJc3RydWN0IHNlbWFwaG9yZSBjbWRfbXV0ZXg7ICAgIC8qIFNlcmlhbGlzZXMgaXNzdWluZyBvZiBleGVjdXRlIGNvbW1hbmRzICovCisgICAgICAgIHN0cnVjdCBjb21wbGV0aW9uIGV4ZWN1dGlvbl9jbWQ7IC8qIENhcmQgaGFzIGNvbXBsZXRlZCBhbiBleGVjdXRlIGNvbW1hbmQgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiB4Y2VpdmVyX2NtZDsgICAvKiBDYXJkIGhhcyBjb21wbGV0ZWQgYSB0eCBvciByeCBjb21tYW5kICovCit9OworCisvKiBUaGUgc3RhdGlvbiAoZXRoZXJuZXQpIGFkZHJlc3MgcHJlZml4LCB1c2VkIGZvciBhIHNhbml0eSBjaGVjay4gKi8KKyNkZWZpbmUgU0FfQUREUjAgMHgwMgorI2RlZmluZSBTQV9BRERSMSAweDYwCisjZGVmaW5lIFNBX0FERFIyIDB4QUMKKworc3RydWN0IG1jYV9hZGFwdGVyc190IHsKKwl1bnNpZ25lZCBpbnQJaWQ7CisJY2hhcgkJKm5hbWU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1jYV9hZGFwdGVyc190IG1jMzJfYWRhcHRlcnNbXSA9IHsKKwl7IDB4MDA0MSwgIjNDT00gRXRoZXJMaW5rIE1DLzMyIiB9LAorCXsgMHg4RUY1LCAiSUJNIEhpZ2ggUGVyZm9ybWFuY2UgTGFuIEFkYXB0ZXIiIH0sCisJeyAweDAwMDAsIE5VTEwgfQorfTsKKworCisvKiBNYWNyb3MgZm9yIHJpbmcgaW5kZXggbWFuaXB1bGF0aW9ucyAqLyAKK3N0YXRpYyBpbmxpbmUgdTE2IG5leHRfcngodTE2IHJ4KSB7IHJldHVybiAocngrMSkmKFJYX1JJTkdfTEVOLTEpOyB9Oworc3RhdGljIGlubGluZSB1MTYgcHJldl9yeCh1MTYgcngpIHsgcmV0dXJuIChyeC0xKSYoUlhfUklOR19MRU4tMSk7IH07CisKK3N0YXRpYyBpbmxpbmUgdTE2IG5leHRfdHgodTE2IHR4KSB7IHJldHVybiAodHgrMSkmKFRYX1JJTkdfTEVOLTEpOyB9OworCisKKy8qIEluZGV4IHRvIGZ1bmN0aW9ucywgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4gKi8KK3N0YXRpYyBpbnQJbWMzMl9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcik7CitzdGF0aWMgaW50ICAgICAgbWMzMl9jb21tYW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBjbWQsIHZvaWQgKmRhdGEsIGludCBsZW4pOworc3RhdGljIGludAltYzMyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAltYzMyX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CW1jMzJfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgbWMzMl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50CW1jMzJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0CW5ldF9kZXZpY2Vfc3RhdHMgKm1jMzJfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQJbWMzMl9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAltYzMyX3Jlc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtYzMyX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgc2xvdCA9IGxwLT5zbG90OworCW1jYV9tYXJrX2FzX3VudXNlZChzbG90KTsKKwltY2Ffc2V0X2FkYXB0ZXJfbmFtZShzbG90LCBOVUxMKTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTUMzMl9JT19FWFRFTlQpOworfQorCisvKioKKyAqIG1jMzJfcHJvYmUgCS0JU2VhcmNoIGZvciBzdXBwb3J0ZWQgYm9hcmRzCisgKiBAdW5pdDogaW50ZXJmYWNlIG51bWJlciB0byB1c2UKKyAqCisgKiBCZWNhdXNlIE1DQSBidXMgaXMgYSByZWFsIGJ1cyBhbmQgd2UgY2FuIHNjYW4gZm9yIGNhcmRzIHdlIGNvdWxkIGRvIGEKKyAqIHNpbmdsZSBzY2FuIGZvciBhbGwgYm9hcmRzIGhlcmUuIFJpZ2h0IG5vdyB3ZSB1c2UgdGhlIHBhc3NlZCBpbiBkZXZpY2UKKyAqIHN0cnVjdHVyZSBhbmQgc2NhbiBmb3Igb25seSBvbmUgYm9hcmQuIFRoaXMgbmVlZHMgZml4aW5nIGZvciBtb2R1bGVzCisgKiBpbiBwYXJ0aWN1bGFyLgorICovCisKK3N0cnVjdCBuZXRfZGV2aWNlICpfX2luaXQgbWMzMl9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBtYzMyX2xvY2FsKSk7CisJc3RhdGljIGludCBjdXJyZW50X21jYV9zbG90ID0gLTE7CisJaW50IGk7CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmICh1bml0ID49IDApCisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCS8qIERvIG5vdCBjaGVjayBhbnkgc3VwcGxpZWQgaS9vIGxvY2F0aW9ucy4gCisJICAgUE9TIHJlZ2lzdGVycyB1c3VhbGx5IGRvbid0IGZhaWwgOikgKi8KKworCS8qIE1DQSBjYXJkcyBoYXZlIFBPUyByZWdpc3RlcnMuICAKKwkgICBBdXRvZGV0ZWN0aW5nIE1DQSBjYXJkcyBpcyBleHRyZW1lbHkgc2ltcGxlLiAKKwkgICBKdXN0IHNlYXJjaCBmb3IgdGhlIGNhcmQuICovCisKKwlmb3IoaSA9IDA7IChtYzMyX2FkYXB0ZXJzW2ldLm5hbWUgIT0gTlVMTCk7IGkrKykgeworCQljdXJyZW50X21jYV9zbG90ID0gCisJCQltY2FfZmluZF91bnVzZWRfYWRhcHRlcihtYzMyX2FkYXB0ZXJzW2ldLmlkLCAwKTsKKworCQlpZihjdXJyZW50X21jYV9zbG90ICE9IE1DQV9OT1RGT1VORCkgeworCQkJaWYoIW1jMzJfcHJvYmUxKGRldiwgY3VycmVudF9tY2Ffc2xvdCkpCisJCQl7CisJCQkJbWNhX3NldF9hZGFwdGVyX25hbWUoY3VycmVudF9tY2Ffc2xvdCwgCisJCQkJCQltYzMyX2FkYXB0ZXJzW2ldLm5hbWUpOworCQkJCW1jYV9tYXJrX2FzX3VzZWQoY3VycmVudF9tY2Ffc2xvdCk7CisJCQkJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQkJaWYgKGVycikgeworCQkJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCQkJZGV2ID0gRVJSX1BUUihlcnIpOworCQkJCX0KKwkJCQlyZXR1cm4gZGV2OworCQkJfQorCQkJCisJCX0KKwl9CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKK30KKworLyoqCisgKiBtYzMyX3Byb2JlMQktCUNoZWNrIGEgZ2l2ZW4gc2xvdCBmb3IgYSBib2FyZCBhbmQgdGVzdCB0aGUgY2FyZAorICogQGRldjogIERldmljZSBzdHJ1Y3R1cmUgdG8gZmlsbCBpbgorICogQHNsb3Q6IFRoZSBNQ0EgYnVzIHNsb3QgYmVpbmcgdXNlZCBieSB0aGlzIGNhcmQKKyAqCisgKiBEZWNvZGUgdGhlIHNsb3QgZGF0YSBhbmQgY29uZmlndXJlIHRoZSBjYXJkIHN0cnVjdHVyZXMuIEhhdmluZyBkb25lIHRoaXMgd2UKKyAqIGNhbiByZXNldCB0aGUgY2FyZCBhbmQgY29uZmlndXJlIGl0LiBUaGUgY2FyZCBkb2VzIGEgZnVsbCBzZWxmIHRlc3QgY3ljbGUKKyAqIGluIGZpcm13YXJlIHNvIHdlIGhhdmUgdG8gd2FpdCBmb3IgaXQgdG8gcmV0dXJuIGFuZCBwb3N0IHVzIGVpdGhlciBhIAorICogZmFpbHVyZSBjYXNlIG9yIHNvbWUgYWRkcmVzc2VzIHdlIHVzZSB0byBmaW5kIHRoZSBib2FyZCBpbnRlcm5hbHMuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgbWMzMl9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNsb3QpCit7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKwlpbnQgaSwgZXJyOworCXU4IFBPUzsKKwl1MzIgYmFzZTsKKwlzdHJ1Y3QgbWMzMl9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0YXRpYyB1MTYgbWNhX2lvX2Jhc2VzW109eworCQkweDcyODAsMHg3MjkwLAorCQkweDc2ODAsMHg3NjkwLAorCQkweDdBODAsMHg3QTkwLAorCQkweDdFODAsMHg3RTkwCisJfTsKKwlzdGF0aWMgdTMyIG1jYV9tZW1fYmFzZXNbXT17CisJCTB4MDBDMDAwMCwKKwkJMHgwMEM0MDAwLAorCQkweDAwQzgwMDAsCisJCTB4MDBDQzAwMCwKKwkJMHgwMEQwMDAwLAorCQkweDAwRDQwMDAsCisJCTB4MDBEODAwMCwKKwkJMHgwMERDMDAwCisJfTsKKwlzdGF0aWMgY2hhciAqZmFpbHVyZXNbXT17CisJCSJQcm9jZXNzb3IgaW5zdHJ1Y3Rpb24iLAorCQkiUHJvY2Vzc29yIGRhdGEgYnVzIiwKKwkJIlByb2Nlc3NvciBkYXRhIGJ1cyIsCisJCSJQcm9jZXNzb3IgZGF0YSBidXMiLAorCQkiQWRhcHRlciBidXMiLAorCQkiUk9NIGNoZWNrc3VtIiwKKwkJIkJhc2UgUkFNIiwKKwkJIkV4dGVuZGVkIFJBTSIsCisJCSI4MjU4NiBpbnRlcm5hbCBsb29wYmFjayIsCisJCSI4MjU4NiBpbml0aWFsaXNhdGlvbiBmYWlsdXJlIiwKKwkJIkFkYXB0ZXIgbGlzdCBjb25maWd1cmF0aW9uIGVycm9yIgorCX07CisKKwkvKiBUaW1lIHRvIHBsYXkgTUNBIGdhbWVzICovCisKKwlpZiAobWMzMl9kZWJ1ZyAgJiYgIHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayhLRVJOX0RFQlVHICIlcyIsIHZlcnNpb24pOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGZvdW5kIGluIHNsb3QgJWQ6IiwgZGV2LT5uYW1lLCBjYXJkbmFtZSwgc2xvdCk7CisKKwlQT1MgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDIpOworCQorCWlmKCEoUE9TJjEpKQorCXsKKwkJcHJpbnRrKCIgZGlzYWJsZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogRmlsbCBpbiB0aGUgJ2RldicgZmllbGRzLiAqLworCWRldi0+YmFzZV9hZGRyID0gbWNhX2lvX2Jhc2VzWyhQT1M+PjEpJjddOworCWRldi0+bWVtX3N0YXJ0ID0gbWNhX21lbV9iYXNlc1soUE9TPj40KSY3XTsKKwkKKwlQT1MgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDQpOworCWlmKCEoUE9TJjEpKQorCXsKKwkJcHJpbnRrKCJtZW1vcnkgd2luZG93IGRpc2FibGVkLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCVBPUyA9IG1jYV9yZWFkX3N0b3JlZF9wb3Moc2xvdCwgNSk7CisJCisJaT0oUE9TPj40KSYzOworCWlmKGk9PTMpCisJeworCQlwcmludGsoImludmFsaWQgbWVtb3J5IHdpbmRvdy5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJCisJaSo9MTYzODQ7CisJaSs9MTYzODQ7CisJCisJZGV2LT5tZW1fZW5kPWRldi0+bWVtX3N0YXJ0ICsgaTsKKwkKKwlkZXYtPmlycSA9ICgoUE9TPj4yKSYzKSs5OworCQorCWlmKCFyZXF1ZXN0X3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTUMzMl9JT19FWFRFTlQsIGNhcmRuYW1lKSkKKwl7CisJCXByaW50aygiaW8gMHglM2xYLCB3aGljaCBpcyBidXN5LlxuIiwgZGV2LT5iYXNlX2FkZHIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXByaW50aygiaW8gMHglM2xYIGlycSAlZCBtZW0gMHglbFggKCVkSylcbiIsCisJCWRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwgZGV2LT5tZW1fc3RhcnQsIGkvMTAyNCk7CisJCisJCisJLyogV2Ugb3VnaHQgdG8gc2V0IHRoZSBjYWNoZSBsaW5lIHNpemUgaGVyZS4uICovCisJCisJCisJLyoKKwkgKglHbyBQUk9NIGJyb3dzaW5nCisJICovCisJIAorCXByaW50aygiJXM6IEFkZHJlc3MgIiwgZGV2LT5uYW1lKTsKKwkgCisJLyogUmV0cmlldmUgYW5kIHByaW50IHRoZSBldGhlcm5ldCBhZGRyZXNzLiAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJeworCQltY2Ffd3JpdGVfcG9zKHNsb3QsIDYsIGkrMTIpOworCQltY2Ffd3JpdGVfcG9zKHNsb3QsIDcsIDApOworCQorCQlwcmludGsoIiAlMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0gPSBtY2FfcmVhZF9wb3Moc2xvdCwzKSk7CisJfQorCisJbWNhX3dyaXRlX3BvcyhzbG90LCA2LCAwKTsKKwltY2Ffd3JpdGVfcG9zKHNsb3QsIDcsIDApOworCisJUE9TID0gbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCA0KTsKKwkKKwlpZihQT1MmMikKKwkJcHJpbnRrKCIgOiBCTkMgcG9ydCBzZWxlY3RlZC5cbiIpOworCWVsc2UgCisJCXByaW50aygiIDogQVVJIHBvcnQgc2VsZWN0ZWQuXG4iKTsKKwkJCisJUE9TPWluYihkZXYtPmJhc2VfYWRkcitIT1NUX0NUUkwpOworCVBPU3w9SE9TVF9DVFJMX0FUVE58SE9TVF9DVFJMX1JFU0VUOworCVBPUyY9fkhPU1RfQ1RSTF9JTlRFOworCW91dGIoUE9TLCBkZXYtPmJhc2VfYWRkcitIT1NUX0NUUkwpOworCS8qIFJlc2V0IGFkYXB0ZXIgKi8KKwl1ZGVsYXkoMTAwKTsKKwkvKiBSZXNldCBvZmYgKi8KKwlQT1MmPX4oSE9TVF9DVFJMX0FUVE58SE9TVF9DVFJMX1JFU0VUKTsKKwlvdXRiKFBPUywgZGV2LT5iYXNlX2FkZHIrSE9TVF9DVFJMKTsKKwkKKwl1ZGVsYXkoMzAwKTsKKwkKKwkvKgorCSAqCUdyYWIgdGhlIElSUQorCSAqLworCisJZXJyID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZtYzMyX2ludGVycnVwdCwgU0FfU0hJUlEgfCBTQV9TQU1QTEVfUkFORE9NLCBEUlZfTkFNRSwgZGV2KTsKKwlpZiAoZXJyKSB7CisJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBNQzMyX0lPX0VYVEVOVCk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkLlxuIiwgRFJWX05BTUUsIGRldi0+aXJxKTsKKwkJZ290byBlcnJfZXhpdF9wb3J0czsKKwl9CisKKwltZW1zZXQobHAsIDAsIHNpemVvZihzdHJ1Y3QgbWMzMl9sb2NhbCkpOworCWxwLT5zbG90ID0gc2xvdDsKKworCWk9MDsKKworCWJhc2UgPSBpbmIoZGV2LT5iYXNlX2FkZHIpOworCQorCXdoaWxlKGJhc2UgPT0gMHhGRikKKwl7CisJCWkrKzsKKwkJaWYoaSA9PSAxMDAwKQorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gYm9vdCBhZGFwdGVyLlxuIiwgZGV2LT5uYW1lKTsKKwkJCWVyciA9IC1FTk9ERVY7IAorCQkJZ290byBlcnJfZXhpdF9pcnE7CisJCX0KKwkJdWRlbGF5KDEwMDApOworCQlpZihpbmIoZGV2LT5iYXNlX2FkZHIrMikmKDE8PDUpKQorCQkJYmFzZSA9IGluYihkZXYtPmJhc2VfYWRkcik7CisJfQorCisJaWYoYmFzZT4wKQorCXsKKwkJaWYoYmFzZSA8IDB4MEMpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyVzLlxuIiwgZGV2LT5uYW1lLCBmYWlsdXJlc1tiYXNlLTFdLAorCQkJCWJhc2U8MHgwQT8iIHRlc3QgZmFpbHVyZSI6IiIpOworCQllbHNlCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmtub3duIGZhaWx1cmUgJWQuXG4iLCBkZXYtPm5hbWUsIGJhc2UpOworCQllcnIgPSAtRU5PREVWOyAKKwkJZ290byBlcnJfZXhpdF9pcnE7CisJfQorCQorCWJhc2U9MDsKKwlmb3IoaT0wO2k8NDtpKyspCisJeworCQlpbnQgbj0wOworCQorCQl3aGlsZSghKGluYihkZXYtPmJhc2VfYWRkcisyKSYoMTw8NSkpKQorCQl7CisJCQluKys7CisJCQl1ZGVsYXkoNTApOworCQkJaWYobj4xMDApCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbWFpbGJveCByZWFkIGZhaWwgKCVkKS5cbiIsIGRldi0+bmFtZSwgaSk7CisJCQkJZXJyID0gLUVOT0RFVjsKKwkJCQlnb3RvIGVycl9leGl0X2lycTsKKwkJCX0KKwkJfQorCisJCWJhc2V8PShpbmIoZGV2LT5iYXNlX2FkZHIpPDwoOCppKSk7CisJfQorCQorCWxwLT5leGVjX2JveD1pc2FfYnVzX3RvX3ZpcnQoZGV2LT5tZW1fc3RhcnQrYmFzZSk7CisJCisJYmFzZT1scC0+ZXhlY19ib3gtPmRhdGFbMV08PDE2fGxwLT5leGVjX2JveC0+ZGF0YVswXTsgIAorCQorCWxwLT5iYXNlID0gZGV2LT5tZW1fc3RhcnQrYmFzZTsKKwkKKwlscC0+cnhfYm94PWlzYV9idXNfdG9fdmlydChscC0+YmFzZSArIGxwLT5leGVjX2JveC0+ZGF0YVsyXSk7IAorCWxwLT50eF9ib3g9aXNhX2J1c190b192aXJ0KGxwLT5iYXNlICsgbHAtPmV4ZWNfYm94LT5kYXRhWzNdKTsKKwkKKwlscC0+c3RhdHMgPSBpc2FfYnVzX3RvX3ZpcnQobHAtPmJhc2UgKyBscC0+ZXhlY19ib3gtPmRhdGFbNV0pOworCisJLyoKKwkgKglEZXNjcmlwdG9yIGNoYWlucyAoY2FyZCByZWxhdGl2ZSkKKwkgKi8KKwkgCisJbHAtPnR4X2NoYWluIAkJPSBscC0+ZXhlY19ib3gtPmRhdGFbOF07ICAgLyogVHJhbnNtaXQgbGlzdCBzdGFydCBvZmZzZXQgKi8KKwlscC0+cnhfY2hhaW4gCQk9IGxwLT5leGVjX2JveC0+ZGF0YVsxMF07ICAvKiBSZWNlaXZlIGxpc3Qgc3RhcnQgb2Zmc2V0ICovCisJbHAtPnR4X2xlbiAJCT0gbHAtPmV4ZWNfYm94LT5kYXRhWzldOyAgIC8qIFRyYW5zbWl0IGxpc3QgY291bnQgKi8gCisJbHAtPnJ4X2xlbiAJCT0gbHAtPmV4ZWNfYm94LT5kYXRhWzExXTsgIC8qIFJlY2VpdmUgbGlzdCBjb3VudCAqLworCisJaW5pdF9NVVRFWF9MT0NLRUQoJmxwLT5jbWRfbXV0ZXgpOworCWluaXRfY29tcGxldGlvbigmbHAtPmV4ZWN1dGlvbl9jbWQpOworCWluaXRfY29tcGxldGlvbigmbHAtPnhjZWl2ZXJfY21kKTsKKwkKKwlwcmludGsoIiVzOiBGaXJtd2FyZSBSZXYgJWQuICVkIFJYIGJ1ZmZlcnMsICVkIFRYIGJ1ZmZlcnMuIEJhc2Ugb2YgMHglMDhYLlxuIiwKKwkJZGV2LT5uYW1lLCBscC0+ZXhlY19ib3gtPmRhdGFbMTJdLCBscC0+cnhfbGVuLCBscC0+dHhfbGVuLCBscC0+YmFzZSk7CisKKwlkZXYtPm9wZW4JCT0gbWMzMl9vcGVuOworCWRldi0+c3RvcAkJPSBtYzMyX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gbWMzMl9zZW5kX3BhY2tldDsKKwlkZXYtPmdldF9zdGF0cwkJPSBtYzMyX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IG1jMzJfc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+dHhfdGltZW91dAkJPSBtYzMyX3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwk9IEhaKjU7CS8qIEJvYXJkIGRvZXMgYWxsIHRoZSB3b3JrICovCisJZGV2LT5ldGh0b29sX29wcwk9ICZuZXRkZXZfZXRodG9vbF9vcHM7CisKKwlyZXR1cm4gMDsKKworZXJyX2V4aXRfaXJxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworZXJyX2V4aXRfcG9ydHM6CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIE1DMzJfSU9fRVhURU5UKTsKKwlyZXR1cm4gZXJyOworfQorCisKKy8qKgorICoJbWMzMl9yZWFkeV9wb2xsCQktCXdhaXQgdW50aWwgd2UgY2FuIGZlZWQgaXQgYSBjb21tYW5kCisgKglAZGV2OglUaGUgZGV2aWNlIHRvIHdhaXQgZm9yCisgKgkKKyAqCVdhaXQgdW50aWwgdGhlIGNhcmQgYmVjb21lcyByZWFkeSB0byBhY2NlcHQgYSBjb21tYW5kIHZpYSB0aGUKKyAqCWNvbW1hbmQgcmVnaXN0ZXIuIFRoaXMgdGVsbHMgdXMgbm90aGluZyBhYm91dCB0aGUgY29tcGxldGlvbgorICoJc3RhdHVzIG9mIGFueSBwZW5kaW5nIGNvbW1hbmRzIGFuZCB0YWtlcyB2ZXJ5IGxpdHRsZSB0aW1lIGF0IGFsbC4KKyAqLworIAorc3RhdGljIGlubGluZSB2b2lkIG1jMzJfcmVhZHlfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl3aGlsZSghKGluYihpb2FkZHIrSE9TVF9TVEFUVVMpJkhPU1RfU1RBVFVTX0NSUikpOworfQorCisKKy8qKgorICoJbWMzMl9jb21tYW5kX25vd2FpdAktCXNlbmQgYSBjb21tYW5kIG5vbiBibG9ja2luZworICoJQGRldjogVGhlIDNjNTI3IHRvIGlzc3VlIHRoZSBjb21tYW5kIHRvCisgKglAY21kOiBUaGUgY29tbWFuZCB3b3JkIHRvIHdyaXRlIHRvIHRoZSBtYWlsYm94CisgKglAZGF0YTogQSBkYXRhIGJsb2NrIGlmIHRoZSBjb21tYW5kIGV4cGVjdHMgb25lCisgKglAbGVuOiBMZW5ndGggb2YgdGhlIGRhdGEgYmxvY2sKKyAqCisgKglTZW5kIGEgY29tbWFuZCBmcm9tIGludGVycnVwdCBzdGF0ZS4gSWYgdGhlcmUgaXMgYSBjb21tYW5kCisgKgljdXJyZW50bHkgYmVpbmcgZXhlY3V0ZWQgdGhlbiB3ZSByZXR1cm4gYW4gZXJyb3Igb2YgLTEuIEl0CisgKglzaW1wbHkgaXNuJ3QgdmlhYmxlIHRvIHdhaXQgYXJvdW5kIGFzIGNvbW1hbmRzIG1heSBiZQorICoJc2xvdy4gVGhpcyBjYW4gdGhlb3JldGljYWxseSBiZSBzdGFydmVkIG9uIFNNUCwgYnV0IGl0J3MgaGFyZAorICoJdG8gc2VlIGEgcmVhbGlzdGljIHNpdHVhdGlvbi4gIFdlIGRvIG5vdCB3YWl0IGZvciB0aGUgY29tbWFuZAorICoJdG8gY29tcGxldGUgLS0tIHdlIHJlbHkgb24gdGhlIGludGVycnVwdCBoYW5kbGVyIHRvIHRpZHkgdXAKKyAqCWFmdGVyIHVzLgorICovCisKK3N0YXRpYyBpbnQgbWMzMl9jb21tYW5kX25vd2FpdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgY21kLCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBtYzMyX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCByZXQgPSAtMTsKKworCWlmIChkb3duX3RyeWxvY2soJmxwLT5jbWRfbXV0ZXgpID09IDApCisJeworCQlscC0+Y21kX25vbmJsb2NraW5nPTE7CisJCWxwLT5leGVjX2JveC0+bWJveD0wOworCQlscC0+ZXhlY19ib3gtPm1ib3g9Y21kOworCQltZW1jcHkoKHZvaWQgKilscC0+ZXhlY19ib3gtPmRhdGEsIGRhdGEsIGxlbik7CisJCWJhcnJpZXIoKTsJLyogdGhlIG1lbWNweSBmb3Jnb3QgdGhlIHZvbGF0aWxlIHNvIGJlIHN1cmUgKi8KKworCQkvKiBTZW5kIHRoZSBjb21tYW5kICovCisJCW1jMzJfcmVhZHlfcG9sbChkZXYpOworCQlvdXRiKDE8PDYsIGlvYWRkcitIT1NUX0NNRCk7CisKKwkJcmV0ID0gMDsKKworCQkvKiBJbnRlcnJ1cHQgaGFuZGxlciB3aWxsIHNpZ25hbCBtdXRleCBvbiBjb21wbGV0aW9uICovCisJfQorCisJcmV0dXJuIHJldDsKK30KKworCisvKioKKyAqCW1jMzJfY29tbWFuZAktCXNlbmQgYSBjb21tYW5kIGFuZCBzbGVlcCB1bnRpbCBjb21wbGV0aW9uCisgKglAZGV2OiBUaGUgM2M1MjcgY2FyZCB0byBpc3N1ZSB0aGUgY29tbWFuZCB0bworICoJQGNtZDogVGhlIGNvbW1hbmQgd29yZCB0byB3cml0ZSB0byB0aGUgbWFpbGJveAorICoJQGRhdGE6IEEgZGF0YSBibG9jayBpZiB0aGUgY29tbWFuZCBleHBlY3RzIG9uZQorICoJQGxlbjogTGVuZ3RoIG9mIHRoZSBkYXRhIGJsb2NrCisgKgorICoJU2VuZHMgZXhlYyBjb21tYW5kcyBpbiBhIHVzZXIgY29udGV4dC4gVGhpcyBwZXJtaXRzIHVzIHRvIHdhaXQgYXJvdW5kCisgKglmb3IgdGhlIHJlcGxpZXMgYW5kIGFsc28gdG8gd2FpdCBmb3IgdGhlIGNvbW1hbmQgYnVmZmVyIHRvIGNvbXBsZXRlCisgKglmcm9tIGEgcHJldmlvdXMgY29tbWFuZCBiZWZvcmUgd2UgZXhlY3V0ZSBvdXIgY29tbWFuZC4gQWZ0ZXIgb3VyIAorICoJY29tbWFuZCBjb21wbGV0ZXMgd2Ugd2lsbCBhdHRlbXB0IGFueSBwZW5kaW5nIG11bHRpY2FzdCByZWxvYWQKKyAqCXdlIGJsb2NrZWQgb2ZmIGJ5IGhvZ2dpbmcgdGhlIGV4ZWMgYnVmZmVyLgorICoKKyAqCVlvdSBmZWVkIHRoZSBjYXJkIGEgY29tbWFuZCwgeW91IHdhaXQsIGl0IGludGVycnVwdHMgeW91IGdldCBhIAorICoJcmVwbHkuIEFsbCB3ZWxsIGFuZCBnb29kLiBUaGUgY29tcGxpY2F0aW9uIGFyaXNlcyBiZWNhdXNlIHlvdSB1c2UKKyAqCWNvbW1hbmRzIGZvciBmaWx0ZXIgbGlzdCBjaGFuZ2VzIHdoaWNoIGNvbWUgaW4gYXQgYmggbGV2ZWwgZnJvbSB0aGluZ3MKKyAqCWxpa2UgSVBWNiBncm91cCBzdHVmZi4KKyAqLworICAKK3N0YXRpYyBpbnQgbWMzMl9jb21tYW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBjbWQsIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IG1jMzJfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IHJldCA9IDA7CisJCisJZG93bigmbHAtPmNtZF9tdXRleCk7CisKKwkvKgorCSAqICAgICBNeSBUdXJuCisJICovCisKKwlscC0+Y21kX25vbmJsb2NraW5nPTA7CisJbHAtPmV4ZWNfYm94LT5tYm94PTA7CisJbHAtPmV4ZWNfYm94LT5tYm94PWNtZDsKKwltZW1jcHkoKHZvaWQgKilscC0+ZXhlY19ib3gtPmRhdGEsIGRhdGEsIGxlbik7CisJYmFycmllcigpOwkvKiB0aGUgbWVtY3B5IGZvcmdvdCB0aGUgdm9sYXRpbGUgc28gYmUgc3VyZSAqLworCisJbWMzMl9yZWFkeV9wb2xsKGRldik7CisJb3V0YigxPDw2LCBpb2FkZHIrSE9TVF9DTUQpOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmbHAtPmV4ZWN1dGlvbl9jbWQpOworCQorCWlmKGxwLT5leGVjX2JveC0+bWJveCYoMTw8MTMpKQorCQlyZXQgPSAtMTsKKworCXVwKCZscC0+Y21kX211dGV4KTsKKworCS8qCisJICoJQSBtdWx0aWNhc3Qgc2V0IGdvdCBibG9ja2VkIC0gdHJ5IGl0IG5vdworICAgICAgICAgKi8KKworCWlmKGxwLT5tY19yZWxvYWRfd2FpdCkKKwl7CisJCW1jMzJfcmVzZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICoJbWMzMl9zdGFydF90cmFuc2NlaXZlcgktCXRlbGwgYm9hcmQgdG8gcmVzdGFydCB0eC9yeAorICoJQGRldjogVGhlIDNjNTI3IGNhcmQgdG8gaXNzdWUgdGhlIGNvbW1hbmQgdG8KKyAqCisgKglUaGlzIG1heSBiZSBjYWxsZWQgZnJvbSB0aGUgaW50ZXJydXB0IHN0YXRlLCB3aGVyZSBpdCBpcyB1c2VkCisgKgl0byByZXN0YXJ0IHRoZSByeCByaW5nIGlmIHRoZSBjYXJkIHJ1bnMgb3V0IG9mIHJ4IGJ1ZmZlcnMuIAorICoJCisgKiAJV2UgbXVzdCBmaXJzdCBjaGVjayBpZiBpdCdzIG9rIHRvIChyZSlzdGFydCB0aGUgdHJhbnNjZWl2ZXIuIFNlZQorICogICAgICBtYzMyX2Nsb3NlIGZvciBkZXRhaWxzLgorICovCisKK3N0YXRpYyB2b2lkIG1jMzJfc3RhcnRfdHJhbnNjZWl2ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCisJc3RydWN0IG1jMzJfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwkvKiBJZ25vcmUgUlggb3ZlcmZsb3cgb24gZGV2aWNlIGNsb3N1cmUgKi8gCisJaWYgKGxwLT54Y2VpdmVyX2Rlc2lyZWRfc3RhdGU9PUhBTFRFRCkKKwkJcmV0dXJuOyAKKworCS8qIEdpdmUgdGhlIGNhcmQgdGhlIG9mZnNldCB0byB0aGUgcG9zdC1FT0wtYml0IFJYIGRlc2NyaXB0b3IgKi8KKwltYzMyX3JlYWR5X3BvbGwoZGV2KTsgCisJbHAtPnJ4X2JveC0+bWJveD0wOworCWxwLT5yeF9ib3gtPmRhdGFbMF09bHAtPnJ4X3JpbmdbcHJldl9yeChscC0+cnhfcmluZ190YWlsKV0ucC0+bmV4dDsgCisJb3V0YihIT1NUX0NNRF9TVEFSVF9SWCwgaW9hZGRyK0hPU1RfQ01EKTsgICAgICAKKworCW1jMzJfcmVhZHlfcG9sbChkZXYpOyAKKwlscC0+dHhfYm94LT5tYm94PTA7CisJb3V0YihIT1NUX0NNRF9SRVNUUlRfVFgsIGlvYWRkcitIT1NUX0NNRCk7ICAgLyogY2FyZCBpZ25vcmVzIHRoaXMgb24gUlggcmVzdGFydCAqLyAKKwkKKwkvKiBXZSBhcmUgbm90IGludGVycnVwdGVkIG9uIHN0YXJ0IGNvbXBsZXRpb24gKi8gCit9CisKKworLyoqCisgKgltYzMyX2hhbHRfdHJhbnNjZWl2ZXIJLQl0ZWxsIGJvYXJkIHRvIHN0b3AgdHgvcngKKyAqCUBkZXY6IFRoZSAzYzUyNyBjYXJkIHRvIGlzc3VlIHRoZSBjb21tYW5kIHRvCisgKgorICoJV2UgaXNzdWUgdGhlIGNvbW1hbmRzIHRvIGhhbHQgdGhlIGNhcmQncyB0cmFuc2NlaXZlci4gSW4gZmFjdCwKKyAqCWFmdGVyIHNvbWUgZXhwZXJpbWVudGluZyB3ZSBub3cgc2ltcGx5IHRlbGwgdGhlIGNhcmQgdG8KKyAqCXN1c3BlbmQuIFdoZW4gaXNzdWluZyBhYm9ydHMgb2NjYXNpb25hbGx5IG9kZCB0aGluZ3MgaGFwcGVuZWQuCisgKgorICoJV2UgdGhlbiBzbGVlcCB1bnRpbCB0aGUgY2FyZCBoYXMgbm90aWZpZWQgdXMgdGhhdCBib3RoIHJ4IGFuZAorICoJdHggaGF2ZSBiZWVuIHN1c3BlbmRlZC4KKyAqLyAKKworc3RhdGljIHZvaWQgbWMzMl9oYWx0X3RyYW5zY2VpdmVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreworCXN0cnVjdCBtYzMyX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJbWMzMl9yZWFkeV9wb2xsKGRldik7CQorCWxwLT5yeF9ib3gtPm1ib3g9MDsKKwlvdXRiKEhPU1RfQ01EX1NVU1BORF9SWCwgaW9hZGRyK0hPU1RfQ01EKTsJCQkKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZscC0+eGNlaXZlcl9jbWQpOworCisJbWMzMl9yZWFkeV9wb2xsKGRldik7IAorCWxwLT50eF9ib3gtPm1ib3g9MDsKKwlvdXRiKEhPU1RfQ01EX1NVU1BORF9UWCwgaW9hZGRyK0hPU1RfQ01EKTsJCisJd2FpdF9mb3JfY29tcGxldGlvbigmbHAtPnhjZWl2ZXJfY21kKTsKK30KKworCisvKioKKyAqCW1jMzJfbG9hZF9yeF9yaW5nCS0JbG9hZCB0aGUgcmluZyBvZiByZWNlaXZlIGJ1ZmZlcnMKKyAqCUBkZXY6IDNjNTI3IHRvIGJ1aWxkIHRoZSByaW5nIGZvcgorICoKKyAqCVRoaXMgaW5pdGFsaXNlcyB0aGUgb24tY2FyZCBhbmQgZHJpdmVyIGRhdGFzdHJ1Y3R1cmVzIHRvCisgKgl0aGUgcG9pbnQgd2hlcmUgbWMzMl9zdGFydF90cmFuc2NlaXZlcigpIGNhbiBiZSBjYWxsZWQuCisgKgorICoJVGhlIGNhcmQgc2V0cyB1cCB0aGUgcmVjZWl2ZSByaW5nIGZvciB1cy4gV2UgYXJlIHJlcXVpcmVkIHRvIHVzZSB0aGUKKyAqCXJpbmcgaXQgcHJvdmlkZXMsIGFsdGhvdWdoIHRoZSBzaXplIG9mIHRoZSByaW5nIGlzIGNvbmZpZ3VyYWJsZS4KKyAqCisgKiAJV2UgYWxsb2NhdGUgYW4gc2tfYnVmZiBmb3IgZWFjaCByaW5nIGVudHJ5IGluIHR1cm4gYW5kCisgKiAJaW5pdGFsaXNlIGl0cyBob3VzZS1rZWVwaW5nIGluZm8uIEF0IHRoZSBzYW1lIHRpbWUsIHdlIHJlYWQKKyAqIAllYWNoICduZXh0JyBwb2ludGVyIGluIG91ciByeF9yaW5nIGFycmF5LiBUaGlzIHJlZHVjZXMgc2xvdworICogCXNoYXJlZC1tZW1vcnkgcmVhZHMgYW5kIG1ha2VzIGl0IGVhc3kgdG8gYWNjZXNzIHByZWRlY2Vzc29yCisgKiAJZGVzY3JpcHRvcnMuCisgKgorICoJV2UgdGhlbiBzZXQgdGhlIGVuZC1vZi1saXN0IGJpdCBmb3IgdGhlIGxhc3QgZW50cnkgc28gdGhhdCB0aGUKKyAqIAljYXJkIHdpbGwga25vdyB3aGVuIGl0IGhhcyBydW4gb3V0IG9mIGJ1ZmZlcnMuCisgKi8KKwkgCitzdGF0aWMgaW50IG1jMzJfbG9hZF9yeF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1jMzJfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwl1MTYgcnhfYmFzZTsKKwl2b2xhdGlsZSBzdHJ1Y3Qgc2tiX2hlYWRlciAqcDsKKwkKKwlyeF9iYXNlPWxwLT5yeF9jaGFpbjsKKworCWZvcihpPTA7IGk8UlhfUklOR19MRU47IGkrKykgeworCQlscC0+cnhfcmluZ1tpXS5za2I9YWxsb2Nfc2tiKDE1MzIsIEdGUF9LRVJORUwpOworCQlpZiAobHAtPnJ4X3JpbmdbaV0uc2tiPT1OVUxMKSB7CisJCQlmb3IgKDtpPj0wO2ktLSkKKwkJCQlrZnJlZV9za2IobHAtPnJ4X3JpbmdbaV0uc2tiKTsKKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCQlza2JfcmVzZXJ2ZShscC0+cnhfcmluZ1tpXS5za2IsIDE4KTsKKworCQlwPWlzYV9idXNfdG9fdmlydChscC0+YmFzZStyeF9iYXNlKTsKKwkJCQkKKwkJcC0+Y29udHJvbD0wOworCQlwLT5kYXRhPWlzYV92aXJ0X3RvX2J1cyhscC0+cnhfcmluZ1tpXS5za2ItPmRhdGEpOworCQlwLT5zdGF0dXM9MDsKKwkJcC0+bGVuZ3RoPTE1MzI7CisJCisJCWxwLT5yeF9yaW5nW2ldLnA9cDsgCisJCXJ4X2Jhc2U9cC0+bmV4dDsgCisJfQorCisJbHAtPnJ4X3JpbmdbaS0xXS5wLT5jb250cm9sIHw9IENPTlRST0xfRU9MOworCisJbHAtPnJ4X3JpbmdfdGFpbD0wOworCisJcmV0dXJuIDA7Cit9CQorCisKKy8qKgorICoJbWMzMl9mbHVzaF9yeF9yaW5nCS0JZnJlZSB0aGUgcmluZyBvZiByZWNlaXZlIGJ1ZmZlcnMKKyAqCUBscDogTG9jYWwgZGF0YSBvZiAzYzUyNyB0byBmbHVzaCB0aGUgcnggcmluZyBvZgorICoKKyAqCUZyZWUgdGhlIGJ1ZmZlciBmb3IgZWFjaCByaW5nIHNsb3QuIFRoaXMgbWF5IGJlIGNhbGxlZCAKKyAqICAgICAgYmVmb3JlIG1jMzJfbG9hZF9yeF9yaW5nKCksIGVnLiBvbiBlcnJvciBpbiBtYzMyX29wZW4oKS4KKyAqICAgICAgUmVxdWlyZXMgcnggc2tiIHBvaW50ZXJzIHRvIHBvaW50IHRvIGEgdmFsaWQgc2tiLCBvciBOVUxMLgorICovCisKK3N0YXRpYyB2b2lkIG1jMzJfZmx1c2hfcnhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtYzMyX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7IAorCisJZm9yKGk9MDsgaSA8IFJYX1JJTkdfTEVOOyBpKyspIAorCXsgCisJCWlmIChscC0+cnhfcmluZ1tpXS5za2IpIHsKKwkJCWRldl9rZnJlZV9za2IobHAtPnJ4X3JpbmdbaV0uc2tiKTsKKwkJCWxwLT5yeF9yaW5nW2ldLnNrYiA9IE5VTEw7CisJCX0KKwkJbHAtPnJ4X3JpbmdbaV0ucD1OVUxMOyAKKwl9IAorfQorCisKKy8qKgorICoJbWMzMl9sb2FkX3R4X3JpbmcJLQlsb2FkIHRyYW5zbWl0IHJpbmcKKyAqCUBkZXY6IFRoZSAzYzUyNyBjYXJkIHRvIGlzc3VlIHRoZSBjb21tYW5kIHRvCisgKgorICoJVGhpcyBzZXRzIHVwIHRoZSBob3N0IHRyYW5zbWl0IGRhdGEtc3RydWN0dXJlcy4gCisgKgorICoJRmlyc3QsIHdlIG9idGFpbiBmcm9tIHRoZSBjYXJkIGl0J3MgY3VycmVudCBwb3N0aW9uIGluIHRoZSB0eAorICoJcmluZywgc28gdGhhdCB3ZSB3aWxsIGtub3cgd2hlcmUgdG8gYmVnaW4gdHJhbnNtaXR0aW5nCisgKglwYWNrZXRzLgorICogCQorICogCVRoZW4sIHdlIHJlYWQgdGhlICduZXh0JyBwb2ludGVycyBmcm9tIHRoZSBvbi1jYXJkIHR4IHJpbmcgaW50bworICogIAlvdXIgdHhfcmluZyBhcnJheSB0byByZWR1Y2Ugc2xvdyBzaGFyZWQtbWVtIHJlYWRzLiBGaW5hbGx5LCB3ZQorICogCWludGl0YWxpc2UgdGhlIHR4IGhvdXNlIGtlZXBpbmcgdmFyaWFibGVzLgorICogCisgKi8gCisKK3N0YXRpYyB2b2lkIG1jMzJfbG9hZF90eF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7IAorCXN0cnVjdCBtYzMyX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IHNrYl9oZWFkZXIgKnA7CisJaW50IGk7IAorCXUxNiB0eF9iYXNlOworCisJdHhfYmFzZT1scC0+dHhfYm94LT5kYXRhWzBdOyAKKworCWZvcihpPTAgOyBpPFRYX1JJTkdfTEVOIDsgaSsrKQorCXsKKwkJcD1pc2FfYnVzX3RvX3ZpcnQobHAtPmJhc2UrdHhfYmFzZSk7CisJCWxwLT50eF9yaW5nW2ldLnA9cDsgCisJCWxwLT50eF9yaW5nW2ldLnNrYj1OVUxMOworCisJCXR4X2Jhc2U9cC0+bmV4dDsKKwl9CisKKwkvKiAtMSBzbyB0aGF0IHR4X3JpbmdfaGVhZCBjYW5ub3QgImxhcCIgdHhfcmluZ190YWlsICovCisJLyogc2VlIG1jMzJfdHhfcmluZyAqLworCisJYXRvbWljX3NldCgmbHAtPnR4X2NvdW50LCBUWF9SSU5HX0xFTi0xKTsgCisJYXRvbWljX3NldCgmbHAtPnR4X3JpbmdfaGVhZCwgMCk7IAorCWxwLT50eF9yaW5nX3RhaWw9MDsgCit9IAorCisKKy8qKgorICoJbWMzMl9mbHVzaF90eF9yaW5nIAktCWZyZWUgdHJhbnNtaXQgcmluZworICoJQGxwOiBMb2NhbCBkYXRhIG9mIDNjNTI3IHRvIGZsdXNoIHRoZSB0eCByaW5nIG9mCisgKgorICogICAgICBJZiB0aGUgcmluZyBpcyBub24tZW1wdHksIHppcCBvdmVyIHRoZSBpdCwgZnJlZWluZyBhbnkKKyAqICAgICAgYWxsb2NhdGVkIHNrYl9idWZmcy4gIFRoZSB0eCByaW5nIGhvdXNlLWtlZXBpbmcgdmFyaWFibGVzIGFyZQorICogICAgICB0aGVuIHJlc2V0LiBSZXF1aXJlcyByeCBza2IgcG9pbnRlcnMgdG8gcG9pbnQgdG8gYSB2YWxpZCBza2IsCisgKiAgICAgIG9yIE5VTEwuCisgKi8KKworc3RhdGljIHZvaWQgbWMzMl9mbHVzaF90eF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1jMzJfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpIDwgVFhfUklOR19MRU47IGkrKykKKwl7CisJCWlmIChscC0+dHhfcmluZ1tpXS5za2IpCisJCXsKKwkJCWRldl9rZnJlZV9za2IobHAtPnR4X3JpbmdbaV0uc2tiKTsKKwkJCWxwLT50eF9yaW5nW2ldLnNrYiA9IE5VTEw7CisJCX0KKwl9CisKKwlhdG9taWNfc2V0KCZscC0+dHhfY291bnQsIDApOyAKKwlhdG9taWNfc2V0KCZscC0+dHhfcmluZ19oZWFkLCAwKTsgCisJbHAtPnR4X3JpbmdfdGFpbD0wOworfQorIAkKKworLyoqCisgKgltYzMyX29wZW4JLQloYW5kbGUgJ3VwJyBvZiBjYXJkCisgKglAZGV2OiBkZXZpY2UgdG8gb3BlbgorICoKKyAqCVRoZSB1c2VyIGlzIHRyeWluZyB0byBicmluZyB0aGUgY2FyZCBpbnRvIHJlYWR5IHN0YXRlLiBUaGlzIHJlcXVpcmVzCisgKglhIGJyaWVmIGRpYWxvZ3VlIHdpdGggdGhlIGNhcmQuIEZpcnN0bHkgd2UgZW5hYmxlIGludGVycnVwdHMgYW5kIHRoZW4KKyAqCSdpbmRpY2F0aW9ucycuIFdpdGhvdXQgdGhlc2UgZW5hYmxlZCB0aGUgY2FyZCBkb2Vzbid0IGJvdGhlciB0ZWxsaW5nCisgKgl1cyB3aGF0IGl0IGhhcyBkb25lLiBUaGlzIGhhZCBtZSBwdXp6bGVkIGZvciBhIHdlZWsuCisgKgorICoJV2UgY29uZmlndXJlIHRoZSBudW1iZXIgb2YgY2FyZCBkZXNjcmlwdG9ycywgdGhlbiBsb2FkIHRoZSBuZXR3b3JrCisgKglhZGRyZXNzIGFuZCBtdWx0aWNhc3QgZmlsdGVycy4gVHVybiBvbiB0aGUgd29ya2Fyb3VuZCBtb2RlLiBUaGlzCisgKgl3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIDgyNTg2IC0gaXQgYXNrcyB0aGUgZmlybXdhcmUgdG8gZG8KKyAqCXNvLiBJdCBoYXMgYSBwZXJmb3JtYW5jZSAobGF0ZW5jeSkgaGl0IGJ1dCBpcyBuZWVkZWQgb24gYnVzeQorICoJW3JlYWQgbW9zdF0gbGFucy4gV2UgbG9hZCB0aGUgcmluZyB3aXRoIGJ1ZmZlcnMgdGhlbiB3ZSBraWNrIGl0CisgKglhbGwgb2ZmLgorICovCisKK3N0YXRpYyBpbnQgbWMzMl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBtYzMyX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdTggb25lPTE7CisJdTggcmVnczsKKwl1MTYgZGVzY251bWJ1ZmZzWzJdID0ge1RYX1JJTkdfTEVOLCBSWF9SSU5HX0xFTn07CisKKwkvKgorCSAqCUludGVycnVwdHMgZW5hYmxlZAorCSAqLworCisJcmVncz1pbmIoaW9hZGRyK0hPU1RfQ1RSTCk7CisJcmVnc3w9SE9TVF9DVFJMX0lOVEU7CisJb3V0YihyZWdzLCBpb2FkZHIrSE9TVF9DVFJMKTsKKwkKKwkvKgorCSAqICAgICAgQWxsb3cgb3Vyc2VsdmVzIHRvIGlzc3VlIGNvbW1hbmRzCisJICovCisKKwl1cCgmbHAtPmNtZF9tdXRleCk7CisKKworCS8qCisJICoJU2VuZCB0aGUgaW5kaWNhdGlvbnMgb24gY29tbWFuZAorCSAqLworCisJbWMzMl9jb21tYW5kKGRldiwgNCwgJm9uZSwgMik7CisKKwkvKgorCSAqCVBva2UgaXQgdG8gbWFrZSBzdXJlIGl0J3MgcmVhbGx5IGRlYWQuIAorCSAqLworCisJbWMzMl9oYWx0X3RyYW5zY2VpdmVyKGRldik7IAorCW1jMzJfZmx1c2hfdHhfcmluZyhkZXYpOyAKKworCS8qIAorCSAqCUFzayBjYXJkIHRvIHNldCB1cCBvbi1jYXJkIGRlc2NyaXB0b3JzIHRvIG91ciBzcGVjIAorCSAqLyAKKworCWlmKG1jMzJfY29tbWFuZChkZXYsIDgsIGRlc2NudW1idWZmcywgNCkpIHsgCisJCXByaW50aygiJXM6ICVzIHJlamVjdGVkIG91ciBidWZmZXIgY29uZmlndXJhdGlvbiFcbiIsCisJIAkgICAgICAgZGV2LT5uYW1lLCBjYXJkbmFtZSk7CisJCW1jMzJfY2xvc2UoZGV2KTsgCisJCXJldHVybiAtRU5PQlVGUzsgCisJfQorCQorCS8qIFJlcG9ydCBuZXcgY29uZmlndXJhdGlvbiAqLyAKKwltYzMyX2NvbW1hbmQoZGV2LCA2LCBOVUxMLCAwKTsgCisKKwlscC0+dHhfY2hhaW4gCQk9IGxwLT5leGVjX2JveC0+ZGF0YVs4XTsgICAvKiBUcmFuc21pdCBsaXN0IHN0YXJ0IG9mZnNldCAqLworCWxwLT5yeF9jaGFpbiAJCT0gbHAtPmV4ZWNfYm94LT5kYXRhWzEwXTsgIC8qIFJlY2VpdmUgbGlzdCBzdGFydCBvZmZzZXQgKi8KKwlscC0+dHhfbGVuIAkJPSBscC0+ZXhlY19ib3gtPmRhdGFbOV07ICAgLyogVHJhbnNtaXQgbGlzdCBjb3VudCAqLyAKKwlscC0+cnhfbGVuIAkJPSBscC0+ZXhlY19ib3gtPmRhdGFbMTFdOyAgLyogUmVjZWl2ZSBsaXN0IGNvdW50ICovCisgCisJLyogU2V0IE5ldHdvcmsgQWRkcmVzcyAqLworCW1jMzJfY29tbWFuZChkZXYsIDEsIGRldi0+ZGV2X2FkZHIsIDYpOworCQorCS8qIFNldCB0aGUgZmlsdGVycyAqLworCW1jMzJfc2V0X211bHRpY2FzdF9saXN0KGRldik7CisJCSAgIAorCWlmIChXT1JLQVJPVU5EXzgyNTg2KSB7IAorCQl1MTYgemVyb193b3JkPTA7CisJCW1jMzJfY29tbWFuZChkZXYsIDB4MEQsICZ6ZXJvX3dvcmQsIDIpOyAgIC8qIDgyNTg2IGJ1ZyB3b3JrYXJvdW5kIG9uICAqLworCX0KKworCW1jMzJfbG9hZF90eF9yaW5nKGRldik7CisJCisJaWYobWMzMl9sb2FkX3J4X3JpbmcoZGV2KSkgCisJeworCQltYzMyX2Nsb3NlKGRldik7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisKKwlscC0+eGNlaXZlcl9kZXNpcmVkX3N0YXRlID0gUlVOTklORzsKKwkKKwkvKiBBbmQgZmluYWxseSwgc2V0IHRoZSBiYWxsIHJvbGxpbmcuLi4gKi8KKwltYzMyX3N0YXJ0X3RyYW5zY2VpdmVyKGRldik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKgltYzMyX3RpbWVvdXQJLQloYW5kbGUgYSB0aW1lb3V0IGZyb20gdGhlIG5ldHdvcmsgbGF5ZXIKKyAqCUBkZXY6IDNjNTI3IHRoYXQgdGltZWQgb3V0CisgKgorICoJSGFuZGxlIGEgdGltZW91dCBvbiB0cmFuc21pdCBmcm9tIHRoZSAzYzUyNy4gVGhpcyBub3JtYWxseSBtZWFucworICoJYmFkIHRoaW5ncyBhcyB0aGUgaGFyZHdhcmUgaGFuZGxlcyBjYWJsZSB0aW1lb3V0cyBhbmQgbWVzcyBmb3IKKyAqCXVzLgorICoKKyAqLworCitzdGF0aWMgdm9pZCBtYzMyX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0P1xuIiwgZGV2LT5uYW1lKTsKKwkvKiBUcnkgdG8gcmVzdGFydCB0aGUgYWRhcHRvci4gKi8KKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKworLyoqCisgKgltYzMyX3NlbmRfcGFja2V0CS0JcXVldWUgYSBmcmFtZSBmb3IgdHJhbnNtaXQKKyAqCUBza2I6IGJ1ZmZlciB0byB0cmFuc21pdAorICoJQGRldjogM2M1MjcgdG8gc2VuZCBpdCBvdXQgb2YKKyAqCisgKglUcmFuc21pdCBhIGJ1ZmZlci4gVGhpcyBub3JtYWxseSBtZWFucyB0aHJvd2luZyB0aGUgYnVmZmVyIG9udG8KKyAqCXRoZSB0cmFuc21pdCBxdWV1ZSBhcyB0aGUgcXVldWUgaXMgcXVpdGUgbGFyZ2UuIElmIHRoZSBxdWV1ZSBpcworICoJZnVsbCB0aGVuIHdlIHNldCB0eF9idXN5IGFuZCByZXR1cm4uIE9uY2UgdGhlIGludGVycnVwdCBoYW5kbGVyCisgKglnZXRzIG1lc3NhZ2VzIHRlbGxpbmcgaXQgdG8gcmVjbGFpbSB0cmFuc21pdCBxdWV1ZSBlbnRyaWVzLCB3ZSB3aWxsCisgKgljbGVhciB0eF9idXN5IGFuZCB0aGUga2VybmVsIHdpbGwgc3RhcnQgY2FsbGluZyB0aGlzIGFnYWluLgorICoKKyAqICAgICAgV2UgZG8gbm90IGRpc2FibGUgaW50ZXJydXB0cyBvciBhY3F1aXJlIGFueSBsb2NrczsgdGhpcyBjYW4KKyAqICAgICAgcnVuIGNvbmN1cnJlbnRseSB3aXRoIG1jMzJfdHhfcmluZygpLCBhbmQgdGhlIGZ1bmN0aW9uIGl0c2VsZgorICogICAgICBpcyBzZXJpYWxpc2VkIGF0IGEgaGlnaGVyIGxheWVyLiBIb3dldmVyLCBzaW1pbGFybHkgZm9yIHRoZQorICogICAgICBjYXJkIGl0c2VsZiwgd2UgbXVzdCBlbnN1cmUgdGhhdCB3ZSB1cGRhdGUgdHhfcmluZ19oZWFkIG9ubHkKKyAqICAgICAgYWZ0ZXIgd2UndmUgZXN0YWJsaXNoZWQgYSB2YWxpZCBwYWNrZXQgb24gdGhlIHR4IHJpbmcgKGFuZAorICogICAgICBiZWZvcmUgd2UgbGV0IHRoZSBjYXJkICJzZWUiIGl0LCB0byBwcmV2ZW50IGl0IHJhY2luZyB3aXRoIHRoZQorICogICAgICBpcnEgaGFuZGxlcikuCisgKiAKKyAqLworCitzdGF0aWMgaW50IG1jMzJfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWMzMl9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBoZWFkID0gYXRvbWljX3JlYWQoJmxwLT50eF9yaW5nX2hlYWQpOworCQorCXZvbGF0aWxlIHN0cnVjdCBza2JfaGVhZGVyICpwLCAqbnA7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZihhdG9taWNfcmVhZCgmbHAtPnR4X2NvdW50KT09MCkgeworCQlyZXR1cm4gMTsKKwl9CisKKwlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJYXRvbWljX2RlYygmbHAtPnR4X2NvdW50KTsgCisKKwkvKiBQIGlzIHRoZSBsYXN0IHNlbmRpbmcvc2VudCBidWZmZXIgYXMgYSBwb2ludGVyICovCisJcD1scC0+dHhfcmluZ1toZWFkXS5wOworCQkKKwloZWFkID0gbmV4dF90eChoZWFkKTsKKworCS8qIE5QIGlzIHRoZSBidWZmZXIgd2Ugd2lsbCBiZSBsb2FkaW5nICovCisJbnA9bHAtPnR4X3JpbmdbaGVhZF0ucDsgCisJCisJLyogV2Ugd2lsbCBuZWVkIHRoaXMgdG8gZmx1c2ggdGhlIGJ1ZmZlciBvdXQgKi8KKwlscC0+dHhfcmluZ1toZWFkXS5za2I9c2tiOworCisJbnAtPmxlbmd0aCAgICAgID0gdW5saWtlbHkoc2tiLT5sZW4gPCBFVEhfWkxFTikgPyBFVEhfWkxFTiA6IHNrYi0+bGVuOwkJCQorCW5wLT5kYXRhCT0gaXNhX3ZpcnRfdG9fYnVzKHNrYi0+ZGF0YSk7CisJbnAtPnN0YXR1cwk9IDA7CisJbnAtPmNvbnRyb2wgICAgID0gQ09OVFJPTF9FT1AgfCBDT05UUk9MX0VPTDsgICAgIAorCXdtYigpOworCQkKKwkvKgorCSAqIFRoZSBuZXcgZnJhbWUgaGFzIGJlZW4gc2V0dXA7IHdlIGNhbiBub3cKKwkgKiBsZXQgdGhlIGludGVycnVwdCBoYW5kbGVyIGFuZCBjYXJkICJzZWUiIGl0CisJICovCisKKwlhdG9taWNfc2V0KCZscC0+dHhfcmluZ19oZWFkLCBoZWFkKTsgCisJcC0+Y29udHJvbCAgICAgJj0gfkNPTlRST0xfRU9MOworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCisKKy8qKgorICoJbWMzMl91cGRhdGVfc3RhdHMJLQlwdWxsIG9mZiB0aGUgb24gYm9hcmQgc3RhdGlzdGljcworICoJQGRldjogM2M1MjcgdG8gc2VydmljZQorICoKKyAqIAorICoJUXVlcnkgYW5kIHJlc2V0IHRoZSBvbi1jYXJkIHN0YXRzLiBUaGVyZSdzIHRoZSBzbWFsbCBwb3NzaWJpbGl0eQorICoJb2YgYSByYWNlIGhlcmUsIHdoaWNoIHdvdWxkIHJlc3VsdCBpbiBhbiB1bmRlcmVzdGltYXRpb24gb2YKKyAqCWFjdHVhbCBlcnJvcnMuIEFzIHN1Y2gsIHdlJ2QgcHJlZmVyIHRvIGtlZXAgYWxsIG91ciBzdGF0cworICoJY29sbGVjdGlvbiBpbiBzb2Z0d2FyZS4gQXMgYSBydWxlLCB3ZSBkby4gSG93ZXZlciBpdCBjYW4ndCBiZQorICoJdXNlZCBmb3IgcnggZXJyb3JzIGFuZCBjb2xsaXNpb25zIGFzLCBieSBkZWZhdWx0LCB0aGUgY2FyZCBkaXNjYXJkcworICoJYmFkIHJ4IHBhY2tldHMuIAorICoKKyAqCVNldHRpbmcgdGhlIFNBViBCUCBpbiB0aGUgcnggZmlsdGVyIGNvbW1hbmQgc3VwcG9zZWRseQorICoJc3RvcHMgdGhpcyBiZWhhdmlvdXIuIEhvd2V2ZXIsIHRlc3Rpbmcgc2hvd3MgdGhhdCBpdCBvbmx5IHNlZW1zIHRvCisgKgllbmFibGUgdGhlIGNvbGxhdGlvbiBvZiBvbi1jYXJkIHJ4IHN0YXRpc3RpY3MgLS0tIHRoZSBkcml2ZXIKKyAqCW5ldmVyIHNlZXMgYW4gUlggZGVzY3JpcHRvciB3aXRoIGFuIGVycm9yIHN0YXR1cyBzZXQuCisgKgorICovCisKK3N0YXRpYyB2b2lkIG1jMzJfdXBkYXRlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1jMzJfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgbWMzMl9zdGF0cyAqc3QgPSBscC0+c3RhdHM7IAorCisJdTMyIHJ4X2Vycm9ycz0wOyAKKyAgICAgIAorCXJ4X2Vycm9ycys9bHAtPm5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzICAgKz1zdC0+cnhfY3JjX2Vycm9yczsgICAgICAgICAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnJ4X2NyY19lcnJvcnM9MDsKKwlyeF9lcnJvcnMrPWxwLT5uZXRfc3RhdHMucnhfZmlmb19lcnJvcnMgICs9c3QtPnJ4X292ZXJydW5fZXJyb3JzOyAgIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+cnhfb3ZlcnJ1bl9lcnJvcnM9MDsgCisJcnhfZXJyb3JzKz1scC0+bmV0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycyArPXN0LT5yeF9hbGlnbm1lbnRfZXJyb3JzOyAKKyAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5yeF9hbGlnbm1lbnRfZXJyb3JzPTA7CisJcnhfZXJyb3JzKz1scC0+bmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrPXN0LT5yeF90b29zaG9ydF9lcnJvcnM7IAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+cnhfdG9vc2hvcnRfZXJyb3JzPTA7CisJcnhfZXJyb3JzKz1scC0+bmV0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnMrPXN0LT5yeF9vdXRvZnJlc291cmNlX2Vycm9yczsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnJ4X291dG9mcmVzb3VyY2VfZXJyb3JzPTA7IAorICAgICAgICBscC0+bmV0X3N0YXRzLnJ4X2Vycm9ycz1yeF9lcnJvcnM7IAorCQkJCQkJICAgCisJLyogTnVtYmVyIG9mIHBhY2tldHMgd2hpY2ggc2F3IG9uZSBjb2xsaXNpb24gKi8KKwlscC0+bmV0X3N0YXRzLmNvbGxpc2lvbnMrPXN0LT5kYXRhQ1sxMF07CisJc3QtPmRhdGFDWzEwXT0wOyAKKworCS8qIE51bWJlciBvZiBwYWNrZXRzIHdoaWNoIHNhdyAyLS0xNSBjb2xsaXNpb25zICovIAorCWxwLT5uZXRfc3RhdHMuY29sbGlzaW9ucys9c3QtPmRhdGFDWzExXTsgCisJc3QtPmRhdGFDWzExXT0wOyAKK30JCisKKworLyoqCisgKgltYzMyX3J4X3JpbmcJLQlwcm9jZXNzIHRoZSByZWNlaXZlIHJpbmcKKyAqCUBkZXY6IDNjNTI3IHRoYXQgbmVlZHMgaXRzIHJlY2VpdmUgcmluZyBwcm9jZXNzaW5nCisgKgorICoKKyAqCVdlIGhhdmUgcmVjZWl2ZWQgb25lIG9yIG1vcmUgaW5kaWNhdGlvbnMgZnJvbSB0aGUgY2FyZCB0aGF0IGEKKyAqCXJlY2VpdmUgaGFzIGNvbXBsZXRlZC4gVGhlIGJ1ZmZlciByaW5nIHRodXMgY29udGFpbnMgZGlydHkKKyAqCWVudHJpZXMuIFdlIHdhbGsgdGhlIHJpbmcgYnkgaXRlcmF0aW5nIG92ZXIgdGhlIGNpcmN1bGFyIHJ4X3JpbmcKKyAqCWFycmF5LCBzdGFydGluZyBhdCB0aGUgbmV4dCBkaXJ0eSBidWZmZXIgKHdoaWNoIGhhcHBlbnMgdG8gYmUgdGhlCisgKglvbmUgd2UgZmluaXNoZWQgdXAgYXQgbGFzdCB0aW1lIGFyb3VuZCkuCisgKgorICoJRm9yIGVhY2ggY29tcGxldGVkIHBhY2tldCwgd2Ugd2lsbCBlaXRoZXIgY29weSBpdCBhbmQgcGFzcyBpdCB1cAorICogCXRoZSBzdGFjayBvciwgaWYgdGhlIHBhY2tldCBpcyBuZWFyIE1UVSBzaXplZCwgd2UgYWxsb2NhdGUKKyAqCWFub3RoZXIgYnVmZmVyIGFuZCBmbGlwIHRoZSBvbGQgb25lIHVwIHRoZSBzdGFjay4KKyAqIAorICoJV2UgbXVzdCBzdWNjZWVkIGluIGtlZXBpbmcgYSBidWZmZXIgb24gdGhlIHJpbmcuIElmIG5lY2Vzc2FyeSB3ZQorICoJd2lsbCB0b3NzIGEgcmVjZWl2ZWQgcGFja2V0IHJhdGhlciB0aGFuIGxvc2UgYSByaW5nIGVudHJ5LiBPbmNlCisgKgl0aGUgZmlyc3QgdW5jb21wbGV0ZWQgZGVzY3JpcHRvciBpcyBmb3VuZCwgd2UgbW92ZSB0aGUKKyAqCUVuZC1PZi1MaXN0IGJpdCB0byBpbmNsdWRlIHRoZSBidWZmZXJzIGp1c3QgcHJvY2Vzc2VkLgorICoKKyAqLworCitzdGF0aWMgdm9pZCBtYzMyX3J4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWMzMl9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBza2JfaGVhZGVyICpwOworCXUxNiByeF9yaW5nX3RhaWw7CisJdTE2IHJ4X29sZF90YWlsOworCWludCB4PTA7CisKKwlyeF9vbGRfdGFpbCA9IHJ4X3JpbmdfdGFpbCA9IGxwLT5yeF9yaW5nX3RhaWw7CisJCisJZG8KKwl7IAorCQlwPWxwLT5yeF9yaW5nW3J4X3JpbmdfdGFpbF0ucDsgCisKKwkJaWYoIShwLT5zdGF0dXMgJiAoMTw8NykpKSB7IC8qIE5vdCBDT01QTEVURUQgKi8gCisJCQlicmVhazsKKwkJfSAKKwkJaWYocC0+c3RhdHVzICYgKDE8PDYpKSAvKiBDT01QTEVURURfT0sgKi8KKwkJewkJICAgICAgICAKKworCQkJdTE2IGxlbmd0aD1wLT5sZW5ndGg7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOyAKKwkJCXN0cnVjdCBza19idWZmICpuZXdza2I7IAorCisJCQkvKiBUcnkgdG8gc2F2ZSB0aW1lIGJ5IGF2b2lkaW5nIGEgY29weSBvbiBiaWcgZnJhbWVzICovCisKKwkJCWlmICgobGVuZ3RoID4gUlhfQ09QWUJSRUFLKSAKKwkJCSAgICAmJiAoKG5ld3NrYj1kZXZfYWxsb2Nfc2tiKDE1MzIpKSAhPSBOVUxMKSkgCisJCQl7IAorCQkJCXNrYj1scC0+cnhfcmluZ1tyeF9yaW5nX3RhaWxdLnNrYjsKKwkJCQlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKKwkJCQkKKwkJCQlza2JfcmVzZXJ2ZShuZXdza2IsMTgpOyAKKwkJCQlscC0+cnhfcmluZ1tyeF9yaW5nX3RhaWxdLnNrYj1uZXdza2I7ICAKKwkJCQlwLT5kYXRhPWlzYV92aXJ0X3RvX2J1cyhuZXdza2ItPmRhdGEpOyAgCisJCQl9IAorCQkJZWxzZSAKKwkJCXsKKwkJCQlza2I9ZGV2X2FsbG9jX3NrYihsZW5ndGgrMik7ICAKKworCQkJCWlmKHNrYj09TlVMTCkgeworCQkJCQlscC0+bmV0X3N0YXRzLnJ4X2Ryb3BwZWQrKzsgCisJCQkJCWdvdG8gZHJvcHBlZDsgCisJCQkJfQorCisJCQkJc2tiX3Jlc2VydmUoc2tiLDIpOworCQkJCW1lbWNweShza2JfcHV0KHNrYiwgbGVuZ3RoKSwKKwkJCQkgICAgICAgbHAtPnJ4X3JpbmdbcnhfcmluZ190YWlsXS5za2ItPmRhdGEsIGxlbmd0aCk7CisJCQl9CisJCQkKKwkJCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7IAorCQkJc2tiLT5kZXY9ZGV2OyAKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisgCQkJbHAtPm5ldF9zdGF0cy5yeF9wYWNrZXRzKys7IAorIAkJCWxwLT5uZXRfc3RhdHMucnhfYnl0ZXMgKz0gbGVuZ3RoOyAKKwkJCW5ldGlmX3J4KHNrYik7CisJCX0KKworCWRyb3BwZWQ6CisJCXAtPmxlbmd0aCA9IDE1MzI7IAorCQlwLT5zdGF0dXMgPSAwOworCQkKKwkJcnhfcmluZ190YWlsPW5leHRfcngocnhfcmluZ190YWlsKTsgCisJfQorICAgICAgICB3aGlsZSh4Kys8NDgpOyAgCisKKwkvKiBJZiB0aGVyZSB3YXMgYWN0dWFsbHkgYSBmcmFtZSB0byBiZSBwcm9jZXNzZWQsIHBsYWNlIHRoZSBFT0wgYml0ICovIAorCS8qIGF0IHRoZSBkZXNjcmlwdG9yIHByaW9yIHRvIHRoZSBvbmUgdG8gYmUgZmlsbGVkIG5leHQgKi8gCisKKwlpZiAocnhfcmluZ190YWlsICE9IHJ4X29sZF90YWlsKSAKKwl7IAorCQlscC0+cnhfcmluZ1twcmV2X3J4KHJ4X3JpbmdfdGFpbCldLnAtPmNvbnRyb2wgfD0gIENPTlRST0xfRU9MOyAKKwkJbHAtPnJ4X3JpbmdbcHJldl9yeChyeF9vbGRfdGFpbCldLnAtPmNvbnRyb2wgICY9IH5DT05UUk9MX0VPTDsgCisKKwkJbHAtPnJ4X3JpbmdfdGFpbD1yeF9yaW5nX3RhaWw7IAorCX0KK30KKworCisvKioKKyAqCW1jMzJfdHhfcmluZwktCXByb2Nlc3MgY29tcGxldGVkIHRyYW5zbWl0cworICoJQGRldjogM2M1MjcgdGhhdCBuZWVkcyBpdHMgdHJhbnNtaXQgcmluZyBwcm9jZXNzaW5nCisgKgorICoKKyAqCVRoaXMgb3BlcmF0ZXMgaW4gYSBzaW1pbGFyIGZhc2hpb24gdG8gbWMzMl9yeF9yaW5nLiBXZSBpdGVyYXRlCisgKglvdmVyIHRoZSB0cmFuc21pdCByaW5nLiBGb3IgZWFjaCBkZXNjcmlwdG9yIHdoaWNoIGhhcyBiZWVuCisgKglwcm9jZXNzZWQgYnkgdGhlIGNhcmQsIHdlIGZyZWUgaXRzIGFzc29jaWF0ZWQgYnVmZmVyIGFuZCBub3RlCisgKglhbnkgZXJyb3JzLiBUaGlzIGNvbnRpbnVlcyB1bnRpbCB0aGUgdHJhbnNtaXQgcmluZyBpcyBlbXB0aWVkCisgKglvciB3ZSByZWFjaCBhIGRlc2NyaXB0b3IgdGhhdCBoYXNuJ3QgeWV0IGJlZW4gcHJvY2Vzc2VkIGJ5IHRoZQorICoJY2FyZC4KKyAqIAorICovCisKK3N0YXRpYyB2b2lkIG1jMzJfdHhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3QgbWMzMl9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBza2JfaGVhZGVyICpucDsKKworCS8qCisJICogV2UgcmVseSBvbiBoZWFkPT10YWlsIHRvIG1lYW4gJ3F1ZXVlIGVtcHR5Jy4KKwkgKiBUaGlzIGlzIHdoeSBscC0+dHhfY291bnQ9VFhfUklOR19MRU4tMTogaW4gb3JkZXIgdG8gcHJldmVudAorCSAqIHR4X3JpbmdfaGVhZCB3cmFwcGluZyB0byB0YWlsIGFuZCBjb25mdXNpbmcgYSAncXVldWUgZW1wdHknCisJICogY29uZGl0aW9uIHdpdGggJ3F1ZXVlIGZ1bGwnCisJICovCisKKwl3aGlsZSAobHAtPnR4X3JpbmdfdGFpbCAhPSBhdG9taWNfcmVhZCgmbHAtPnR4X3JpbmdfaGVhZCkpICAKKwl7ICAgCisJCXUxNiB0OyAKKworCQl0PW5leHRfdHgobHAtPnR4X3JpbmdfdGFpbCk7IAorCQlucD1scC0+dHhfcmluZ1t0XS5wOyAKKworCQlpZighKG5wLT5zdGF0dXMgJiAoMTw8NykpKSAKKwkJeworCQkJLyogTm90IENPTVBMRVRFRCAqLyAKKwkJCWJyZWFrOyAKKwkJfSAKKwkJbHAtPm5ldF9zdGF0cy50eF9wYWNrZXRzKys7CisJCWlmKCEobnAtPnN0YXR1cyAmICgxPDw2KSkpIC8qIE5vdCBDT01QTEVURURfT0sgKi8KKwkJeworCQkJbHAtPm5ldF9zdGF0cy50eF9lcnJvcnMrKzsgICAKKworCQkJc3dpdGNoKG5wLT5zdGF0dXMmMHgwRikKKwkJCXsKKwkJCQljYXNlIDE6CisJCQkJCWxwLT5uZXRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQkJYnJlYWs7IC8qIE1heCBjb2xsaXNpb25zICovIAorCQkJCWNhc2UgMjoKKwkJCQkJbHAtPm5ldF9zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJCQlicmVhazsKKwkJCQljYXNlIDM6CisJCQkJCWxwLT5uZXRfc3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA0OgorCQkJCQlscC0+bmV0X3N0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJCQkJYnJlYWs7ICAvKiBDVFMgTG9zdCAqLyAKKwkJCQljYXNlIDU6CisJCQkJCWxwLT5uZXRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQkJYnJlYWs7IC8qIFRyYW5zbWl0IHRpbWVvdXQgKi8gCisJCQl9CisJCX0KKwkJLyogUGFja2V0cyBhcmUgc2VudCBpbiBvcmRlciAtIHRoaXMgaXMKKwkJICAgIGJhc2ljYWxseSBhIEZJRk8gcXVldWUgb2YgYnVmZmVycyBtYXRjaGluZworCQkgICAgdGhlIGNhcmQgcmluZyAqLworCQlscC0+bmV0X3N0YXRzLnR4X2J5dGVzKz1scC0+dHhfcmluZ1t0XS5za2ItPmxlbjsKKwkJZGV2X2tmcmVlX3NrYl9pcnEobHAtPnR4X3JpbmdbdF0uc2tiKTsKKwkJbHAtPnR4X3JpbmdbdF0uc2tiPU5VTEw7CisJCWF0b21pY19pbmMoJmxwLT50eF9jb3VudCk7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCQlscC0+dHhfcmluZ190YWlsPXQ7IAorCX0KKworfSAKKworCisvKioKKyAqCW1jMzJfaW50ZXJydXB0CQktCWhhbmRsZSBhbiBpbnRlcnJ1cHQgZnJvbSBhIDNjNTI3CisgKglAaXJxOiBJbnRlcnJ1cHQgbnVtYmVyCisgKglAZGV2X2lkOiAzYzUyNyB0aGF0IHJlcXVpcmVzIHNlcnZpY2luZworICoJQHJlZ3M6IFJlZ2lzdGVycyAodW51c2VkKQorICoKKyAqCisgKglBbiBpbnRlcnJ1cHQgaXMgcmFpc2VkIHdoZW5ldmVyIHRoZSAzYzUyNyB3cml0ZXMgdG8gdGhlIGNvbW1hbmQKKyAqCXJlZ2lzdGVyLiBUaGlzIHJlZ2lzdGVyIGNvbnRhaW5zIHRoZSBtZXNzYWdlIGl0IHdpc2hlcyB0byBzZW5kIHVzCisgKglwYWNrZWQgaW50byBhIHNpbmdsZSBieXRlIGZpZWxkLiBXZSBrZWVwIHJlYWRpbmcgc3RhdHVzIGVudHJpZXMKKyAqCXVudGlsIHdlIGhhdmUgcHJvY2Vzc2VkIGFsbCB0aGUgY29udHJvbCBpdGVtcywgYnV0IHNpbXBseSBjb3VudAorICoJdHJhbnNtaXQgYW5kIHJlY2VpdmUgcmVwb3J0cy4gV2hlbiBhbGwgcmVwb3J0cyBhcmUgaW4gd2UgZW1wdHkgdGhlCisgKgl0cmFuc2NlaXZlciByaW5ncyBhcyBhcHByb3ByaWF0ZS4gVGhpcyBzYXZlcyB0aGUgb3ZlcmhlYWQgb2YKKyAqCW11bHRpcGxlIGNvbW1hbmQgcmVxdWVzdHMuCisgKgorICoJQmVjYXVzZSBNQ0EgaXMgbGV2ZWwtdHJpZ2dlcmVkLCB3ZSBzaG91bGRuJ3QgbWlzcyBpbmRpY2F0aW9ucy4KKyAqCVRoZXJlZm9yZSwgd2UgbmVlZG4ndCBhc2sgdGhlIGNhcmQgdG8gc3VzcGVuZCBpbnRlcnJ1cHRzIHdpdGhpbgorICoJdGhpcyBoYW5kbGVyLiBUaGUgY2FyZCByZWNlaXZlcyBhbiBpbXBsaWNpdCBhY2tub3dsZWRnbWVudCBvZiB0aGUKKyAqCWN1cnJlbnQgaW50ZXJydXB0IHdoZW4gd2UgcmVhZCB0aGUgY29tbWFuZCByZWdpc3Rlci4KKyAqCisgKi8KKworc3RhdGljIGlycXJldHVybl90IG1jMzJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IG1jMzJfbG9jYWwgKmxwOworCWludCBpb2FkZHIsIHN0YXR1cywgYm9ndXNjb3VudCA9IDA7CisJaW50IHJ4X2V2ZW50ID0gMDsKKwlpbnQgdHhfZXZlbnQgPSAwOyAKKwkKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBjYXJkbmFtZSwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKyAKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBTZWUgd2hhdHMgY29va2luZyAqLworCisJd2hpbGUoKGluYihpb2FkZHIrSE9TVF9TVEFUVVMpJkhPU1RfU1RBVFVTX0NXUikgJiYgYm9ndXNjb3VudCsrPDIwMDApCisJeworCQlzdGF0dXM9aW5iKGlvYWRkcitIT1NUX0NNRCk7CisKKyNpZmRlZiBERUJVR19JUlEJCQorCQlwcmludGsoIlN0YXR1cyBUWCVkIFJYJWQgRVglZCBPViVkIEJDJWRcbiIsCisJCQkoc3RhdHVzJjcpLCAoc3RhdHVzPj4zKSY3LCAoc3RhdHVzPj42KSYxLAorCQkJKHN0YXR1cz4+NykmMSwgYm9ndXNjb3VudCk7CisjZW5kaWYKKwkJCQorCQlzd2l0Y2goc3RhdHVzJjcpCisJCXsKKwkJCWNhc2UgMDoKKwkJCQlicmVhazsKKwkJCWNhc2UgNjogLyogVFggZmFpbCAqLworCQkJY2FzZSAyOgkvKiBUWCBvayAqLworCQkJCXR4X2V2ZW50ID0gMTsgCisJCQkJYnJlYWs7CisJCQljYXNlIDM6IC8qIEhhbHQgKi8KKwkJCWNhc2UgNDogLyogQWJvcnQgKi8KKwkJCQljb21wbGV0ZSgmbHAtPnhjZWl2ZXJfY21kKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKCIlczogc3RyYW5nZSB0eCBhY2sgJWRcbiIsIGRldi0+bmFtZSwgc3RhdHVzJjcpOworCQl9CisJCXN0YXR1cz4+PTM7CisJCXN3aXRjaChzdGF0dXMmNykKKwkJeworCQkJY2FzZSAwOgorCQkJCWJyZWFrOworCQkJY2FzZSAyOgkvKiBSWCAqLworCQkJCXJ4X2V2ZW50PTE7IAorCQkJCWJyZWFrOworCQkJY2FzZSAzOiAvKiBIYWx0ICovCisJCQljYXNlIDQ6IC8qIEFib3J0ICovCisJCQkJY29tcGxldGUoJmxwLT54Y2VpdmVyX2NtZCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDY6CisJCQkJLyogT3V0IG9mIFJYIGJ1ZmZlcnMgc3RhdCAqLworCQkJCS8qIE11c3QgcmVzdGFydCByeCAqLworCQkJCWxwLT5uZXRfc3RhdHMucnhfZHJvcHBlZCsrOworCQkJCW1jMzJfcnhfcmluZyhkZXYpOyAKKwkJCQltYzMyX3N0YXJ0X3RyYW5zY2VpdmVyKGRldik7IAorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoIiVzOiBzdHJhbmdlIHJ4IGFjayAlZFxuIiwgCisJCQkJCWRldi0+bmFtZSwgc3RhdHVzJjcpOwkJCQorCQl9CisJCXN0YXR1cz4+PTM7CisJCWlmKHN0YXR1cyYxKQorCQl7CisJCQkvKgorCQkJICogTm8gdGhyZWFkIGlzIHdhaXRpbmc6IHdlIG5lZWQgdG8gdGlkeQorCQkJICogdXAgb3Vyc2VsZi4KKwkJCSAqLworCQkJCSAgIAorCQkJaWYgKGxwLT5jbWRfbm9uYmxvY2tpbmcpIHsKKwkJCQl1cCgmbHAtPmNtZF9tdXRleCk7CisJCQkJaWYgKGxwLT5tY19yZWxvYWRfd2FpdCkgCisJCQkJCW1jMzJfcmVzZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsKKwkJCX0KKwkJCWVsc2UgY29tcGxldGUoJmxwLT5leGVjdXRpb25fY21kKTsKKwkJfQorCQlpZihzdGF0dXMmMikKKwkJeworCQkJLyoKKwkJCSAqCVdlIGdldCBpbnRlcnJ1cHRlZCBvbmNlIHBlcgorCQkJICoJY291bnRlciB0aGF0IGlzIGFib3V0IHRvIG92ZXJmbG93LiAKKwkJCSAqLworCisJCQltYzMyX3VwZGF0ZV9zdGF0cyhkZXYpOwkJCQorCQl9CisJfQorCisKKwkvKgorCSAqCVByb2Nlc3MgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHJpbmdzIAorICAgICAgICAgKi8KKworCWlmKHR4X2V2ZW50KSAKKwkJbWMzMl90eF9yaW5nKGRldik7CisJIAorCWlmKHJ4X2V2ZW50KSAKKwkJbWMzMl9yeF9yaW5nKGRldik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworLyoqCisgKgltYzMyX2Nsb3NlCS0JdXNlciBjb25maWd1cmluZyB0aGUgM2M1MjcgZG93bgorICoJQGRldjogM2M1MjcgY2FyZCB0byBzaHV0IGRvd24KKyAqCisgKglUaGUgM2M1MjcgaXMgYSBidXMgbWFzdGVyaW5nIGRldmljZS4gV2UgbXVzdCBiZSBjYXJlZnVsIGhvdyB3ZQorICoJc2h1dCBpdCBkb3duLiBJdCBtYXkgYWxzbyBiZSBydW5uaW5nIHNoYXJlZCBpbnRlcnJ1cHQgc28gd2UgaGF2ZQorICoJdG8gYmUgc3VyZSB0byBzaWxlbmNlIGl0IHByb3Blcmx5CisgKgorICoJV2UgaW5kaWNhdGUgdGhhdCB0aGUgY2FyZCBpcyBjbG9zaW5nIHRvIHRoZSByZXN0IG9mIHRoZQorICoJZHJpdmVyLiAgT3RoZXJ3aXNlLCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBjYXJkIG1heSBydW4gb3V0CisgKglvZiByZWNlaXZlIGJ1ZmZlcnMgYW5kIHJlc3RhcnQgdGhlIHRyYW5zY2VpdmVyIHdoaWxlIHdlJ3JlCisgKgl0cnlpbmcgdG8gY2xvc2UgaXQuCisgKiAKKyAqCVdlIGFib3J0IGFueSByZWNlaXZlIGFuZCB0cmFuc21pdHMgZ29pbmcgb24gYW5kIHRoZW4gd2FpdCB1bnRpbAorICoJYW55IHBlbmRpbmcgZXhlYyBjb21tYW5kcyBoYXZlIGNvbXBsZXRlZCBpbiBvdGhlciBjb2RlIHRocmVhZHMuCisgKglJbiB0aGVvcnkgd2UgY2FuJ3QgZ2V0IGhlcmUgd2hpbGUgdGhhdCBpcyB0cnVlLCBpbiBwcmFjdGljZSBJIGFtCisgKglwYXJhbm9pZAorICoKKyAqCVdlIHR1cm4gb2ZmIHRoZSBpbnRlcnJ1cHQgZW5hYmxlIGZvciB0aGUgYm9hcmQgdG8gYmUgc3VyZSBpdCBjYW4ndAorICoJaW50ZWZlcmUgd2l0aCBvdGhlciBkZXZpY2VzLgorICovCisKK3N0YXRpYyBpbnQgbWMzMl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtYzMyX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJdTggcmVnczsKKwl1MTYgb25lPTE7CisJCisJbHAtPnhjZWl2ZXJfZGVzaXJlZF9zdGF0ZSA9IEhBTFRFRDsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKgorCSAqCVNlbmQgdGhlIGluZGljYXRpb25zIG9uIGNvbW1hbmQgKGhhbmR5IGRlYnVnIGNoZWNrKQorCSAqLworCisJbWMzMl9jb21tYW5kKGRldiwgNCwgJm9uZSwgMik7CisKKwkvKiBTaHV0IGRvd24gdGhlIHRyYW5zY2VpdmVyICovCisKKwltYzMyX2hhbHRfdHJhbnNjZWl2ZXIoZGV2KTsgCisJCisJLyogRW5zdXJlIHdlIGlzc3VlIG5vIG1vcmUgY29tbWFuZHMgYmV5b25kIHRoaXMgcG9pbnQgKi8KKworCWRvd24oJmxwLT5jbWRfbXV0ZXgpOworCQorCS8qIE9rIHRoZSBjYXJkIGlzIG5vdyBzdG9wcGluZyAqLwkKKwkKKwlyZWdzPWluYihpb2FkZHIrSE9TVF9DVFJMKTsKKwlyZWdzJj1+SE9TVF9DVFJMX0lOVEU7CisJb3V0YihyZWdzLCBpb2FkZHIrSE9TVF9DVFJMKTsKKworCW1jMzJfZmx1c2hfcnhfcmluZyhkZXYpOworCW1jMzJfZmx1c2hfdHhfcmluZyhkZXYpOworCQkKKwltYzMyX3VwZGF0ZV9zdGF0cyhkZXYpOyAKKworCXJldHVybiAwOworfQorCisKKy8qKgorICoJbWMzMl9nZXRfc3RhdHMJCS0JaGFuZCBiYWNrIHN0YXRzIHRvIG5ldHdvcmsgbGF5ZXIKKyAqCUBkZXY6IFRoZSAzYzUyNyBjYXJkIHRvIGhhbmRsZQorICoKKyAqCVdlJ3ZlIGNvbGxlY3RlZCBhbGwgdGhlIHN0YXRzIHdlIGNhbiBpbiBzb2Z0d2FyZSBhbHJlYWR5LiBOb3cKKyAqCWl0J3MgdGltZSB0byB1cGRhdGUgdGhvc2Uga2VwdCBvbi1jYXJkIGFuZCByZXR1cm4gdGhlIGxvdC4gCisgKiAKKyAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm1jMzJfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1jMzJfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwltYzMyX3VwZGF0ZV9zdGF0cyhkZXYpOyAKKwlyZXR1cm4gJmxwLT5uZXRfc3RhdHM7Cit9CisKKworLyoqCisgKglkb19tYzMyX3NldF9tdWx0aWNhc3RfbGlzdAktCWF0dGVtcHQgdG8gdXBkYXRlIG11bHRpY2FzdHMKKyAqCUBkZXY6IDNjNTI3IGRldmljZSB0byBsb2FkIHRoZSBsaXN0IG9uCisgKglAcmV0cnk6IGluZGljYXRlcyB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgY2FsbC4gCisgKgorICoKKyAqIAlBY3R1YWxseSBzZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4gVGhlCisgKglsb2NraW5nIGlzc3VlcyBhcmUgaGFuZGxlZCBieSB0aGlzIHJvdXRpbmUuIFdlIGhhdmUgdG8gdHJhY2sKKyAqCXN0YXRlIGFzIGl0IG1heSB0YWtlIG11bHRpcGxlIGNhbGxzIHRvIGdldCB0aGUgY29tbWFuZCBzZXF1ZW5jZQorICoJY29tcGxldGVkLiBXZSBqdXN0IGtlZXAgdHJ5aW5nIHRvIHNjaGVkdWxlIHRoZSBsb2FkcyB1bnRpbCB3ZQorICoJbWFuYWdlIHRvIHByb2Nlc3MgdGhlbSBhbGwuCisgKiAKKyAqCW51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisgKiAKKyAqCW51bV9hZGRycyA9PSAwCU5vcm1hbCBtb2RlLCBjbGVhciBtdWx0aWNhc3QgbGlzdAorICogCisgKgludW1fYWRkcnMgPiAwCU11bHRpY2FzdCBtb2RlLCByZWNlaXZlIG5vcm1hbCBhbmQgTUMgcGFja2V0cywgCisgKgkJCWFuZCBkbyBiZXN0LWVmZm9ydCBmaWx0ZXJpbmcuIAorICoKKyAqCVNlZSBtYzMyX3VwZGF0ZV9zdGF0cygpIHJlZ2FyZHMgc2V0dGluZyB0aGUgU0FWIEJQIGJpdC4gCisgKgorICovCisKK3N0YXRpYyB2b2lkIGRvX21jMzJfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZXRyeSkKK3sKKwlzdHJ1Y3QgbWMzMl9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNiBmaWx0ID0gKDE8PDIpOyAvKiBTYXZlIEJhZCBQYWNrZXRzLCBmb3Igc3RhdHMgcHVycG9zZXMgKi8gCisKKwlpZiAoZGV2LT5mbGFncyZJRkZfUFJPTUlTQykKKwkJLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKwkJZmlsdCB8PSAxOworCWVsc2UgaWYoKGRldi0+ZmxhZ3MmSUZGX0FMTE1VTFRJKSB8fCBkZXYtPm1jX2NvdW50ID4gMTApCisJeworCQlkZXYtPmZsYWdzfD1JRkZfUFJPTUlTQzsKKwkJZmlsdCB8PSAxOworCX0KKwllbHNlIGlmKGRldi0+bWNfY291bnQpCisJeworCQl1bnNpZ25lZCBjaGFyIGJsb2NrWzYyXTsKKwkJdW5zaWduZWQgY2hhciAqYnA7CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1jPWRldi0+bWNfbGlzdDsKKwkJCisJCWludCBpOworCSAgICAgICAKKwkJaWYocmV0cnk9PTApCisJCQlscC0+bWNfbGlzdF92YWxpZCA9IDA7CisJCWlmKCFscC0+bWNfbGlzdF92YWxpZCkKKwkJeworCQkJYmxvY2tbMV09MDsKKwkJCWJsb2NrWzBdPWRldi0+bWNfY291bnQ7CisJCQlicD1ibG9jaysyOworCQkKKwkJCWZvcihpPTA7aTxkZXYtPm1jX2NvdW50O2krKykKKwkJCXsKKwkJCQltZW1jcHkoYnAsIGRtYy0+ZG1pX2FkZHIsIDYpOworCQkJCWJwKz02OworCQkJCWRtYz1kbWMtPm5leHQ7CisJCQl9CisJCQlpZihtYzMyX2NvbW1hbmRfbm93YWl0KGRldiwgMiwgYmxvY2ssIDIrNipkZXYtPm1jX2NvdW50KT09LTEpCisJCQl7CisJCQkJbHAtPm1jX3JlbG9hZF93YWl0ID0gMTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlscC0+bWNfbGlzdF92YWxpZD0xOworCQl9CisJfQorCQorCWlmKG1jMzJfY29tbWFuZF9ub3dhaXQoZGV2LCAwLCAmZmlsdCwgMik9PS0xKSAKKwl7CisJCWxwLT5tY19yZWxvYWRfd2FpdCA9IDE7CisJfSAKKwllbHNlIHsgCisJCWxwLT5tY19yZWxvYWRfd2FpdCA9IDA7CisJfQorfQorCisKKy8qKgorICoJbWMzMl9zZXRfbXVsdGljYXN0X2xpc3QJLQlxdWV1ZSBtdWx0aWNhc3QgbGlzdCB1cGRhdGUKKyAqCUBkZXY6IFRoZSAzYzUyNyB0byB1c2UKKyAqCisgKglDb21tZW5jZSBsb2FkaW5nIHRoZSBtdWx0aWNhc3QgbGlzdC4gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUga2VybmVsCisgKgljaGFuZ2VzIHRoZSBsaXN0cy4gSXQgd2lsbCBvdmVycmlkZSBhbnkgcGVuZGluZyBsaXN0IHdlIGFyZSB0cnlpbmcgdG8KKyAqCWxvYWQuCisgKi8KKworc3RhdGljIHZvaWQgbWMzMl9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkb19tYzMyX3NldF9tdWx0aWNhc3RfbGlzdChkZXYsMCk7Cit9CisKKworLyoqCisgKgltYzMyX3Jlc2V0X211bHRpY2FzdF9saXN0CS0JcmVzZXQgbXVsdGljYXN0IGxpc3QKKyAqCUBkZXY6IFRoZSAzYzUyNyB0byB1c2UKKyAqCisgKglBdHRlbXB0IHRoZSBuZXh0IHN0ZXAgaW4gbG9hZGluZyB0aGUgbXVsdGljYXN0IGxpc3RzLiBJZiB0aGlzIGF0dGVtcHQKKyAqCWZhaWxzIHRvIGNvbXBsZXRlIHRoZW4gaXQgd2lsbCBiZSBzY2hlZHVsZWQgYW5kIHRoaXMgZnVuY3Rpb24gY2FsbGVkCisgKglhZ2FpbiBsYXRlciBmcm9tIGVsc2V3aGVyZS4KKyAqLworCitzdGF0aWMgdm9pZCBtYzMyX3Jlc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZG9fbWMzMl9zZXRfbXVsdGljYXN0X2xpc3QoZGV2LDEpOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXNwcmludGYoaW5mby0+YnVzX2luZm8sICJNQ0EgMHglbHgiLCBkZXYtPmJhc2VfYWRkcik7Cit9CisKK3N0YXRpYyB1MzIgbmV0ZGV2X2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBtYzMyX2RlYnVnOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBsZXZlbCkKK3sKKwltYzMyX2RlYnVnID0gbGV2ZWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBuZXRkZXZfZ2V0X2RydmluZm8sCisJLmdldF9tc2dsZXZlbAkJPSBuZXRkZXZfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gbmV0ZGV2X3NldF9tc2dsZXZlbCwKK307CisKKyNpZmRlZiBNT0RVTEUKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICp0aGlzX2RldmljZTsKKworLyoqCisgKglpbml0X21vZHVsZQkJLQllbnRyeSBwb2ludAorICoKKyAqCVByb2JlIGFuZCBsb2NhdGUgYSAzYzUyNyBjYXJkLiBUaGlzIHJlYWxseSBzaG91bGQgcHJvYmUgYW5kIGxvY2F0ZQorICoJYWxsIHRoZSAzYzUyNyBjYXJkcyBpbiB0aGUgbWFjaGluZSBub3QganVzdCBvbmUgb2YgdGhlbS4gWWVzIHlvdSBjYW4KKyAqCWluc21vZCBtdWx0aXBsZSBtb2R1bGVzIGZvciBub3cgYnV0IGl0J3MgYSBoYWNrLgorICovCisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCXRoaXNfZGV2aWNlID0gbWMzMl9wcm9iZSgtMSk7CisJaWYgKElTX0VSUih0aGlzX2RldmljZSkpCisJCXJldHVybiBQVFJfRVJSKHRoaXNfZGV2aWNlKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgljbGVhbnVwX21vZHVsZQktCWZyZWUgcmVzb3VyY2VzIGZvciBhbiB1bmxvYWQKKyAqCisgKglVbmxvYWRpbmcgdGltZS4gV2UgcmVsZWFzZSB0aGUgTUNBIGJ1cyByZXNvdXJjZXMgYW5kIHRoZSBpbnRlcnJ1cHQKKyAqCWF0IHdoaWNoIHBvaW50IGV2ZXJ5dGhpbmcgaXMgcmVhZHkgdG8gdW5sb2FkLiBUaGUgY2FyZCBtdXN0IGJlIHN0b3BwZWQKKyAqCWF0IHRoaXMgcG9pbnQgb3Igd2Ugd291bGQgbm90IGhhdmUgYmVlbiBjYWxsZWQuIFdoZW4gd2UgdW5sb2FkIHdlCisgKglsZWF2ZSB0aGUgY2FyZCBzdG9wcGVkIGJ1dCBub3QgdG90YWxseSBzaHV0IGRvd24uIFdoZW4gdGhlIGNhcmQgaXMKKyAqCWluaXRpYWxpemVkIGl0IG11c3QgYmUgcmVib290ZWQgb3IgdGhlIHJpbmdzIHJlbG9hZGVkIGJlZm9yZSBhbnkKKyAqCXRyYW5zbWl0IG9wZXJhdGlvbnMgYXJlIGFsbG93ZWQgdG8gc3RhcnQgc2NyaWJibGluZyBpbnRvIG1lbW9yeS4KKyAqLworCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYodGhpc19kZXZpY2UpOworCWNsZWFudXBfY2FyZCh0aGlzX2RldmljZSk7CisJZnJlZV9uZXRkZXYodGhpc19kZXZpY2UpOworfQorCisjZW5kaWYgLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUyNy5oIGIvZHJpdmVycy9uZXQvM2M1MjcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTBmMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvM2M1MjcuaApAQCAtMCwwICsxLDgxIEBACisvKgorICoJM0NPTSAiRXRoZXJMaW5rIE1DLzMyIiBEZXNjcmlwdGlvbnMKKyAqLworCisvKgorICoJUmVnaXN0ZXJzCisgKi8KKyAgCisjZGVmaW5lIEhPU1RfQ01ECQkwCisjZGVmaW5lICAgICAgICAgSE9TVF9DTURfU1RBUlRfUlggICAoMTw8MykKKyNkZWZpbmUgICAgICAgICBIT1NUX0NNRF9TVVNQTkRfUlggICgzPDwzKQorI2RlZmluZSAgICAgICAgIEhPU1RfQ01EX1JFU1RSVF9SWCAgKDU8PDMpCisKKyNkZWZpbmUgICAgICAgICBIT1NUX0NNRF9TVVNQTkRfVFggIDMKKyNkZWZpbmUgICAgICAgICBIT1NUX0NNRF9SRVNUUlRfVFggIDUKKworCisjZGVmaW5lIEhPU1RfU1RBVFVTCQkyCisjZGVmaW5lCQlIT1NUX1NUQVRVU19DUlIJKDE8PDYpCisjZGVmaW5lCQlIT1NUX1NUQVRVU19DV1IJKDE8PDUpCisKKworI2RlZmluZSBIT1NUX0NUUkwJCTYKKyNkZWZpbmUJCUhPU1RfQ1RSTF9BVFROCSgxPDw3KQorI2RlZmluZSAJSE9TVF9DVFJMX1JFU0VUCSgxPDw2KQorI2RlZmluZSAJSE9TVF9DVFJMX0lOVEUJKDE8PDIpCisKKyNkZWZpbmUgSE9TVF9SQU1QQUdFCQk4CisKKyNkZWZpbmUgSEFMVEVEIDAKKyNkZWZpbmUgUlVOTklORyAxCisKK3N0cnVjdCBtYzMyX21haWxib3gKK3sKKwl1MTYJbWJveCBfX2F0dHJpYnV0ZSgocGFja2VkKSk7CisJdTE2CWRhdGFbMV0gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworfTsKKworc3RydWN0IHNrYl9oZWFkZXIKK3sKKwl1OAlzdGF0dXMgX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworCXU4CWNvbnRyb2wgX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworCXUxNgluZXh0IF9fYXR0cmlidXRlKChwYWNrZWQpKTsJLyogRG8gbm90IGNoYW5nZSEgKi8KKwl1MTYJbGVuZ3RoIF9fYXR0cmlidXRlKChwYWNrZWQpKTsKKwl1MzIJZGF0YSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7Cit9OworCitzdHJ1Y3QgbWMzMl9zdGF0cworeworCS8qIFJYIEVycm9ycyAqLworCXUzMiAgICAgcnhfY3JjX2Vycm9ycyAgICAgICBfX2F0dHJpYnV0ZSgocGFja2VkKSk7IAkKKwl1MzIgICAgIHJ4X2FsaWdubWVudF9lcnJvcnMgIF9fYXR0cmlidXRlKChwYWNrZWQpKTsgCQorCXUzMiAgICAgcnhfb3ZlcnJ1bl9lcnJvcnMgICAgX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworCXUzMiAgICAgcnhfdG9vc2hvcnRfZXJyb3JzICBfX2F0dHJpYnV0ZSgocGFja2VkKSk7CisJdTMyICAgICByeF90b29sb25nX2Vycm9ycyAgIF9fYXR0cmlidXRlKChwYWNrZWQpKTsKKwl1MzIgICAgIHJ4X291dG9mcmVzb3VyY2VfZXJyb3JzICBfX2F0dHJpYnV0ZSgocGFja2VkKSk7IAorCisJdTMyICAgICByeF9kaXNjYXJkZWQgICBfX2F0dHJpYnV0ZSgocGFja2VkKSk7ICAvKiB2aWEgY2FyZCBwYXR0ZXJuIG1hdGNoIGZpbHRlciAqLyAKKworCS8qIFRYIEVycm9ycyAqLworCXUzMiAgICAgdHhfbWF4X2NvbGxpc2lvbnMgX19hdHRyaWJ1dGUoKHBhY2tlZCkpOyAKKwl1MzIgICAgIHR4X2NhcnJpZXJfZXJyb3JzIF9fYXR0cmlidXRlKChwYWNrZWQpKTsgCisJdTMyICAgICB0eF91bmRlcnJ1bl9lcnJvcnMgX19hdHRyaWJ1dGUoKHBhY2tlZCkpOyAKKwl1MzIgICAgIHR4X2N0c19lcnJvcnMgICAgIF9fYXR0cmlidXRlKChwYWNrZWQpKTsgCisJdTMyICAgICB0eF90aW1lb3V0X2Vycm9ycyBfX2F0dHJpYnV0ZSgocGFja2VkKSkgOworCQorCS8qIHZhcmlvdXMgY3J1ZnQgKi8KKwl1MzIgICAgIGRhdGFBWzZdIF9fYXR0cmlidXRlKChwYWNrZWQpKTsgICAKKyAgICAgICAgdTE2CWRhdGFCWzVdIF9fYXR0cmlidXRlKChwYWNrZWQpKTsgICAKKyAgCXUzMiAgICAgZGF0YUNbMTRdIF9fYXR0cmlidXRlKChwYWNrZWQpKTsgCQorfTsKKworI2RlZmluZSBTVEFUVVNfTUFTSwkweDBGCisjZGVmaW5lIENPTVBMRVRFRAkoMTw8NykKKyNkZWZpbmUgQ09NUExFVEVEX09LCSgxPDw2KQorI2RlZmluZSBCVUZGRVJfQlVTWQkoMTw8NSkKKworI2RlZmluZSBDT05UUk9MX0VPUAkoMTw8NykJLyogRW5kIE9mIFBhY2tldCAqLworI2RlZmluZSBDT05UUk9MX0VPTAkoMTw8NikJLyogRW5kIG9mIExpc3QgKi8KKworI2RlZmluZSBNQ0FfTUMzMl9JRAkweDAwNDEJLyogT3VyIE1DQSBpZGVudCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1OXguYyBiL2RyaXZlcnMvbmV0LzNjNTl4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNlMmFjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0LzNjNTl4LmMKQEAgLTAsMCArMSwzMzY1IEBACisvKiBFdGhlckxpbmtYTC5jOiBBIDNDb20gRXRoZXJMaW5rIFBDSSBJSUkvWEwgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eC4gKi8KKy8qCisJV3JpdHRlbiAxOTk2LTE5OTkgYnkgRG9uYWxkIEJlY2tlci4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSAzQ29tICJWb3J0ZXgiIGFuZCAiQm9vbWVyYW5nIiBzZXJpZXMgZXRoZXJjYXJkcy4KKwlNZW1iZXJzIG9mIHRoZSBzZXJpZXMgaW5jbHVkZSBGYXN0IEV0aGVyTGluayAzYzU5MC8zYzU5Mi8zYzU5NS8zYzU5NworCWFuZCB0aGUgRXRoZXJMaW5rIFhMIDNjOTAwIGFuZCAzYzkwNSBjYXJkcy4KKworCVByb2JsZW0gcmVwb3J0cyBhbmQgcXVlc3Rpb25zIHNob3VsZCBiZSBkaXJlY3RlZCB0bworCXZvcnRleEBzY3lsZC5jb20KKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisJNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKwlBbm5hcG9saXMgTUQgMjE0MDMKKworCUxpbnV4IEtlcm5lbCBBZGRpdGlvbnM6CisJCisgCTAuOTlIK2xrMC45IC0gRGF2aWQgUy4gTWlsbGVyIC0gc29mdG5ldCwgUENJIERNQSB1cGRhdGVzCisgCTAuOTlIK2xrMS4wIC0gSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorCQlSZW1vdmUgY29tcGF0aWJpbGl0eSBkZWZpbmVzIGZvciBrZXJuZWwgdmVyc2lvbnMgPCAyLjIueC4KKwkJVXBkYXRlIGZvciBuZXcgMi4zLnggbW9kdWxlIGludGVyZmFjZQorCUxLMS4xLjIgKE1hcmNoIDE5LCAyMDAwKQorCSogTmV3IFBDSSBpbnRlcmZhY2UgKGpnYXJ6aWspCisKKyAgICBMSzEuMS4zIDI1IEFwcmlsIDIwMDAsIEFuZHJldyBNb3J0b24gPGFuZHJld21AdW93LmVkdS5hdT4KKyAgICAtIE1lcmdlZCB3aXRoIDNjNTc1X2NiLmMKKyAgICAtIERvbid0IHNldCBSeENvbXBsZXRlIGluIGJvb21lcmFuZyBpbnRlcnJ1cHQgZW5hYmxlIHJlZworICAgIC0gc3BpbmxvY2sgaW4gdm9ydGV4X3RpbWVyIHRvIHByb3RlY3QgbWRpbyBmdW5jdGlvbnMKKyAgICAtIGRpc2FibGUgbG9jYWwgaW50ZXJydXB0cyBhcm91bmQgY2FsbCB0byB2b3J0ZXhfaW50ZXJydXB0IGluCisgICAgICB2b3J0ZXhfdHhfdGltZW91dCgpIChTbyB2b3J0ZXhfaW50ZXJydXB0IGNhbiB1c2Ugc3Bpbl9sb2NrKCkpCisgICAgLSBTZWxlY3Qgd2luZG93IDMgaW4gdm9ydGV4X3RpbWVyKCkncyB3cml0ZSB0byBXbjNfTUFDX0N0cmwKKyAgICAtIEluIHZvcnRleF9zdGFydF94bWl0KCksIG1vdmUgdGhlIGxvY2sgdG8gX2FmdGVyXyB3ZSd2ZSBhbHRlcmVkCisgICAgICB2cC0+Y3VyX3R4IGFuZCB2cC0+dHhfZnVsbC4gIFRoaXMgZGVmZWF0cyB0aGUgcmFjZSBiZXR3ZWVuCisgICAgICB2b3J0ZXhfc3RhcnRfeG1pdCgpIGFuZCB2b3J0ZXhfaW50ZXJydXB0IHdoaWNoIHdhcyBpZGVudGlmaWVkCisgICAgICBieSBCb2dkYW4gQ29zdGVzY3UuCisgICAgLSBNZXJnZWQgYmFjayBzdXBwb3J0IGZvciBzaXggbmV3IGNhcmRzIGZyb20gdmFyaW91cyBzb3VyY2VzCisgICAgLSBTZXQgdm9ydGV4X2hhdmVfcGNpIGlmIHBjaV9tb2R1bGVfaW5pdCByZXR1cm5zIHplcm8gKGZpeGVzIGNhcmRidXMKKyAgICAgIGluc2VydGlvbiBvb3BzKQorICAgIC0gVGVsbCBpdCB0aGF0IDNjOTA1QyBoYXMgTldBWSBmb3IgMTAwYlQgYXV0b25lZworICAgIC0gRml4IGhhbmRsaW5nIG9mIFNldFN0YXR1c0VuZCBpbiAnVG9vIG11Y2ggd29yay4uJyBjb2RlLCBhcworICAgICAgcGVyIDIuMy45OSdzIDNjNTc1X2NiIChEYXZlIEhpbmRzKS4KKyAgICAtIFNwbGl0IElTUiBpbnRvIHR3byBmb3Igdm9ydGV4ICYgYm9vbWVyYW5nCisgICAgLSBGaXggTU9EX0lOQy9ERUMgcmFjZXMKKyAgICAtIEhhbmRsZSByZXNvdXJjZSBhbGxvY2F0aW9uIGZhaWx1cmVzLgorICAgIC0gRml4IDNDQ0ZFNTc1Q1QgTEVEIHBvbGFyaXR5CisgICAgLSBNYWtlIHR4X2ludGVycnVwdF9taXRpZ2F0aW9uIHRoZSBkZWZhdWx0CisKKyAgICBMSzEuMS40IDI1IEFwcmlsIDIwMDAsIEFuZHJldyBNb3J0b24gPGFuZHJld21AdW93LmVkdS5hdT4gICAgCisgICAgLSBBZGQgZXh0cmEgVHhSZXNldCB0byB2b3J0ZXhfdXAoKSB0byBmaXggNTc1X2NiIGhvdHBsdWcgaW5pdGlhbGlzYXRpb24gcHJvYnMuCisgICAgLSBQdXQgdm9ydGV4X2luZm9fdGJsIGludG8gX19kZXZpbml0ZGF0YQorICAgIC0gSW4gdGhlIHZvcnRleF9lcnJvciBTdGF0c0Z1bGwgSEFDSywgZGlzYWJsZSBzdGF0cyBpbiB2cC0+aW50cl9lbmFibGUgYXMgd2VsbAorICAgICAgYXMgaW4gdGhlIGhhcmR3YXJlLgorICAgIC0gSW5jcmVhc2VkIHRoZSBsb29wIGNvdW50ZXIgaW4gaXNzdWVfYW5kX3dhaXQgZnJvbSAyLDAwMCB0byA0LDAwMC4KKworICAgIExLMS4xLjUgMjggQXByaWwgMjAwMCwgYW5kcmV3bQorICAgIC0gQWRkZWQgcG93ZXJwYyBkZWZpbmVzIChKb2huIERhbmllbCA8amRhbmllbEBldHJlc29mdC5jb20+IHNhaWQgdGhlc2Ugd29yay4uLikKKyAgICAtIFNvbWUgZXh0cmEgZGlhZ25vc3RpY3MKKyAgICAtIEluIHZvcnRleF9lcnJvcigpLCByZXNldCB0aGUgVHggb24gbWF4Q29sbGlzaW9ucy4gIE90aGVyd2lzZSBtb3N0CisgICAgICBjaGlwcyB1c3VhbGx5IGdldCBhIFR4IHRpbWVvdXQuCisgICAgLSBBZGRlZCBleHRyYV9yZXNldCBtb2R1bGUgcGFybQorICAgIC0gUmVwbGFjZWQgc29tZSBpbmxpbmUgdGltZXIgbWFuaXAgd2l0aCBtb2RfdGltZXIKKyAgICAgIChGcmFub2lzIHJvbWlldSA8RnJhbmNvaXMuUm9taWV1QG5pYy5mcj4pCisgICAgLSBJbiB2b3J0ZXhfdXAoKSwgZG9uJ3QgbWFrZSBXbjNfY29uZmlnIGluaXRpYWxpc2F0aW9uIGRlcGVuZGVudCB1cG9uIGhhc19ud2F5CisgICAgICAodGhpcyBjYW1lIGFjcm9zcyBmcm9tIDNjNTc1X2NiKS4KKworICAgIExLMS4xLjYgMDYgSnVuIDIwMDAsIGFuZHJld20KKyAgICAtIEJhY2tlZCBvdXQgdGhlIFBQQyBkZWZpbmVzLgorICAgIC0gVXNlIGRlbF90aW1lcl9zeW5jKCksIG1vZF90aW1lcigpLgorICAgIC0gRml4IHdyYXBwZWQgdWxvbmcgY29tcGFyaXNvbiBpbiBib29tZXJhbmdfcngoKQorICAgIC0gQWRkIElTX1RPUk5BRE8sIHVzZSBpdCB0byBzdXBwcmVzcyAzYzkwNUMgY2hlY2tzdW0gZXJyb3IgbXNnCisgICAgICAoRG9uYWxkIEJlY2tlciwgSSBMZWUgSGV0aGVyaW5ndG9uIDxpbGhAc2xzLmxjcy5taXQuZWR1PikKKyAgICAtIFJlcGxhY2UgdW5pb24gd24zX2NvbmZpZyB3aXRoIEJGSU5TL0JGRVhUIG1hbmlwdWxhdGlvbiBmb3IKKyAgICAgIHNwYXJjNjQgKFBldGUgWmFpdGNldiwgUGV0ZXIgSm9uZXMpCisgICAgLSBJbiB2b3J0ZXhfZXJyb3IsIGRvX3R4X3Jlc2V0IGFuZCB2b3J0ZXhfdHhfdGltZW91dChWb3J0ZXgpOgorICAgICAgZG8gYSBuZXRpZl93YWtlX3F1ZXVlKCkgdG8gYmV0dGVyIHJlY292ZXIgZnJvbSBlcnJvcnMuIChBbmRlcnMgUGVkZXJzZW4sCisgICAgICBEb25hbGQgQmVja2VyKQorICAgIC0gUHJpbnQgYSB3YXJuaW5nIG9uIG91dC1vZi1tZW1vcnkgKHJhdGUgbGltaXRlZCB0byAxIHBlciAxMCBzZWNzKQorICAgIC0gQWRkZWQgdHdvIG1vcmUgQ2FyZGJ1cyA1NzUgTklDczogNWI1NyBhbmQgNjU2NCAoUGF1bCBXYWdsYW5kKQorCisgICAgTEsxLjEuNyAyIEp1bCAyMDAwIGFuZHJld20KKyAgICAtIEJldHRlciBoYW5kbGluZyBvZiBzaGFyZWQgSVJRcworICAgIC0gUmVzZXQgdGhlIHRyYW5zbWl0dGVyIG9uIGEgVHggcmVjbGFpbSBlcnJvcgorICAgIC0gRml4ZWQgY3Jhc2ggdW5kZXIgT09NIGR1cmluZyB2b3J0ZXhfb3BlbigpIChNYXJrIEhlbW1lbnQpCisgICAgLSBGaXggUnggY2Vzc2F0aW9uIHByb2JsZW0gZHVyaW5nIE9PTSAoaGVscCBmcm9tIE1hcmsgSGVtbWVudCkKKyAgICAtIFRoZSBzcGlubG9ja3MgYXJvdW5kIHRoZSBtZGlvIGFjY2VzcyB3ZXJlIGJsb2NraW5nIGludGVycnVwdHMgZm9yIDMwMHVTLgorICAgICAgRml4IGFsbCB0aGlzIHRvIHVzZSBzcGluX2xvY2tfYmgoKSB3aXRoaW4gbWRpb19yZWFkL3dyaXRlCisgICAgLSBPbmx5IHdyaXRlIHRvIFR4RnJlZVRocmVzaG9sZCBpZiBpdCdzIGEgYm9vbWVyYW5nIC0gb3RoZXIgTklDcyBkb24ndAorICAgICAgaGF2ZSBvbmUuCisgICAgLSBBZGRlZCA4MDIuM3ggTUFDLWxheWVyIGZsb3cgY29udHJvbCBzdXBwb3J0CisKKyAgIExLMS4xLjggMTMgQXVnIDIwMDAgYW5kcmV3bQorICAgIC0gSWdub3JlIHJlcXVlc3RfcmVnaW9uKCkgcmV0dXJuIHZhbHVlIC0gYWxyZWFkeSByZXNlcnZlZCBpZiBDYXJkYnVzLgorICAgIC0gTWVyZ2VkIHNvbWUgYWRkaXRpb25hbCBDYXJkYnVzIGZsYWdzIGZyb20gRG9uJ3MgMC45OVFrCisgICAgLSBTb21lIGZpeGVzIGZvciAzYzU1NiAoRnJlZCBNYWNpZWwpCisgICAgLSBGaXggZm9yIEVJU0EgaW5pdGlhbGlzYXRpb24gKEphbiBSZWtvcmFqc2tpKQorICAgIC0gUmVuYW1lZCBNSUlfWENWUl9QV1IgYW5kIEVFUFJPTV8yMzAgdG8gYWxpZ24gd2l0aCAzYzU3NV9jYiBhbmQgRC4gQmVja2VyJ3MgZHJpdmVycworICAgIC0gRml4ZWQgTUlJX1hDVlJfUFdSIGZvciAzQ0NGRTU3NUNUCisgICAgLSBBZGRlZCBJTlZFUlRfTEVEX1BXUiwgdXNlZCBpdC4KKyAgICAtIEJhY2tlZCBvdXQgdGhlIGV4dHJhX3Jlc2V0IHN0dWZmCisKKyAgIExLMS4xLjkgMTIgU2VwIDIwMDAgYW5kcmV3bQorICAgIC0gQmFja2VkIG91dCB0aGUgdHhfcmVzZXRfcmVzdW1lIGZsYWdzLiAgSXQgd2FzIGEgbm8tb3AuCisgICAgLSBJbiB2b3J0ZXhfZXJyb3IsIGRvbid0IHJlc2V0IHRoZSBUeCBvbiB0eFJlY2xhaW0gZXJyb3JzCisgICAgLSBJbiB2b3J0ZXhfZXJyb3IsIGRvbid0IHJlc2V0IHRoZSBUeCBvbiBtYXhDb2xsaXNpb25zIGVycm9ycy4KKyAgICAgIEhlbmNlIGJhY2tlZCBvdXQgYWxsIHRoZSBEb3duTGlzdFB0ciBsb2dpYyBoZXJlLgorICAgIC0gSW4gdm9ydGV4X2Vycm9yLCBnaXZlIFRvcm5hZG8gY2FyZHMgYSBwYXJ0aWFsIFR4UmVzZXQgb24KKyAgICAgIG1heENvbGxpc2lvbnMgKERhdmlkIEhpbmRzKS4gIERlZmluZWQgTUFYX0NPTExJU0lPTl9SRVNFVCBmb3IgdGhpcy4KKyAgICAtIFJlZGlkIHNvbWUgZHJpdmVyIGZsYWdzIGFuZCBkZXZpY2UgbmFtZXMgYmFzZWQgb24gcGNtY2lhX2NzLTMuMS4yMC4KKyAgICAtIEZpeGVkIGEgYnVnIHdoZXJlLCBpZiB2cC0+dHhfZnVsbCBpcyBzZXQgd2hlbiB0aGUgaW50ZXJmYWNlCisgICAgICBpcyBkb3duZWQsIGl0IHJlbWFpbnMgc2V0IHdoZW4gdGhlIGludGVyZmFjZSBpcyB1cHBlZC4gIEJhZAorICAgICAgdGhpbmdzIGhhcHBlbi4KKworICAgTEsxLjEuMTAgMTcgU2VwIDIwMDAgYW5kcmV3bQorICAgIC0gQWRkZWQgRUVQUk9NXzhCSVQgZm9yIDNjNTU1IChGcmVkIE1hY2llbCkKKyAgICAtIEFkZGVkIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciB0aGUgM2M1NTZCIExhcHRvcCBIdXJyaWNhbmUgKExvdWlzIEdlcmJhcmcpCisgICAgLSBBZGQgSEFTX05XQVkgdG8gIjNjOTAwIEN5Y2xvbmUgMTBNYnBzIFRQTyIKKworICAgTEsxLjEuMTEgMTMgTm92IDIwMDAgYW5kcmV3bQorICAgIC0gRHVtcCBNT0RfSU5DL0RFQ19VU0VfQ09VTlQsIHVzZSBTRVRfTU9EVUxFX09XTkVSCisKKyAgIExLMS4xLjEyIDEgSmFuIDIwMDEgYW5kcmV3bSAoMi40LjAtcHJlMSkKKyAgICAtIENhbGwgcGNpX2VuYWJsZV9kZXZpY2UgYmVmb3JlIHdlIHJlcXVlc3Qgb3VyIElSUSAoVG9iaWFzIFJpbmdzdHJvbSkKKyAgICAtIEFkZCAzYzU5MCBQQ0kgbGF0ZW5jeSB0aW1lciBoYWNrIHRvIHZvcnRleF9wcm9iZTEgKGZyb20gMC45OVJhKQorICAgIC0gQWRkZWQgZXh0ZW5kZWQgaXNzdWVfYW5kX3dhaXQgZm9yIHRoZSAzYzkwNUNYLgorICAgIC0gTG9vayBmb3IgYW4gTUlJIG9uIFBIWSBpbmRleCAyNCBmaXJzdCAoM2M5MDVDWCBvZGRpdHkpLgorICAgIC0gQWRkIEhBU19OV0FZIHRvIDNjU09ITzEwMC1UWCAoQnJldHQgRnJhbmtlbmJlcmdlcikKKyAgICAtIERvbid0IGZyZWUgc2ticyB3ZSBkb24ndCBvd24gb24gb29tIHBhdGggaW4gdm9ydGV4X29wZW4oKS4KKworICAgTEsxLjEuMTMgMjcgSmFuIDIwMDEKKyAgICAtIEFkZGVkIGV4cGxpY2l0IGBtZWRpYWxvY2snIGZsYWcgc28gd2UgY2FuIHRydWx5CisgICAgICBsb2NrIHRoZSBtZWRpYSB0eXBlIGRvd24gd2l0aCBgb3B0aW9ucycuCisgICAgLSAiY2hlY2sgaW9yZW1hcCByZXR1cm4gYW5kIHNvbWUgdGlkYml0cyIgKEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPikKKyAgICAtIEFkZGVkIGFuZCB1c2VkIEVFUFJPTV9OT1JFU0VUIGZvciAzYzU1NkIgUE0gcmVzdW1lcy4KKyAgICAtIEZpeGVkIGxlYWthZ2Ugb2YgdnAtPnJ4X3JpbmcuCisgICAgLSBCcmVhayBvdXQgc2VwYXJhdGUgSEFTX0hXQ0tTTSBkZXZpY2UgY2FwYWJpbGl0eSBmbGFnLgorICAgIC0gS2lsbCB2cC0+dHhfZnVsbCAoQU5LKQorICAgIC0gTWVyZ2UgemVyb2NvcHkgZnJhZ21lbnQgaGFuZGxpbmcgKEFOSz8pCisKKyAgIExLMS4xLjE0IDE1IEZlYiAyMDAxCisgICAgLSBFbmFibGUgV09MLiAgQ2FuIGJlIHR1cm5lZCBvbiB3aXRoIGBlbmFibGVfd29sJyBtb2R1bGUgb3B0aW9uLgorICAgIC0gRUlTQSBhbmQgUENJIGluaXRpYWxpc2F0aW9uIGZpeGVzIChqZ2FyemlrLCBNYW5mcmVkIFNwcmF1bCkKKyAgICAtIElmIGEgZGV2aWNlJ3MgaW50ZXJuYWxjb25maWcgcmVnaXN0ZXIgcmVwb3J0cyBpdCBoYXMgTldBWSwKKyAgICAgIHVzZSBpdCwgZXZlbiBpZiBhdXRvc2VsZWN0IGlzIGVuYWJsZWQuCisKKyAgIExLMS4xLjE1IDYgSnVuZSAyMDAxIGFrcG0KKyAgICAtIFByZXZlbnQgZG91YmxlIGNvdW50aW5nIG9mIHJlY2VpdmVkIGJ5dGVzIChMYXJzIENocmlzdGVuc2VuKQorICAgIC0gQWRkIGV0aHRvb2wgc3VwcG9ydCAoamdhcnppaykKKyAgICAtIEFkZCBtb2R1bGUgcGFybSBkZXNjcmlwdGlvbnMgKEFuZHJ6ZWogTS4gS3J6eXN6dG9mb3dpY3opCisgICAgLSBJbXBsZW1lbnRlZCBhbGxvY19ldGhlcmRldigpIEFQSQorICAgIC0gU3BlY2lhbC1jYXNlIHRoZSAnVHggZXJyb3IgODInIG1lc3NhZ2UuCisKKyAgIExLMS4xLjE2IDE4IEp1bHkgMjAwMSBha3BtCisgICAgLSBNYWtlIE5FVElGX0ZfU0cgZGVwZW5kZW50IHVwb24gbnJfZnJlZV9oaWdocGFnZXMoKSwgbm90IG9uIENPTkZJR19ISUdITUVNCisgICAgLSBMZXNzZW4gdmVyYm9zaXR5IG9mIGJvb3R1cCBtZXNzYWdlcworICAgIC0gRml4IFdPTCAtIHVzZSBuZXcgUE0gQVBJIGZ1bmN0aW9ucy4KKyAgICAtIFVzZSBuZXRpZl9ydW5uaW5nKCkgaW5zdGVhZCBvZiB2cC0+b3BlbiBpbiBzdXNwZW5kL3Jlc3VtZS4KKyAgICAtIERvbid0IHJlc2V0IHRoZSBpbnRlcmZhY2UgbG9naWMgb24gb3Blbi9jbG9zZS9ybW1vZC4gIEl0IHVwc2V0cworICAgICAgYXV0b25lZ290aWF0aW9uLCBhbmQgaGVuY2UgREhDUCAoZnJvbSAwLjk5VCkuCisgICAgLSBCYWNrIG91dCBFRVBST01fTk9SRVNFVCBmbGFnIGJlY2F1c2Ugb2YgdGhlIGFib3ZlICh3ZSBkbyBpdCBmb3IgYWxsCisgICAgICBOSUNzKS4KKyAgICAtIENvcnJlY3QgM2M5ODIgaWRlbnRpZmljYXRpb24gc3RyaW5nCisgICAgLSBSZW5hbWUgd2FpdF9mb3JfY29tcGxldGlvbigpIHRvIGlzc3VlX2FuZF93YWl0KCkgdG8gYXZvaWQgY29tcGxldGlvbi5oCisgICAgICBjbGFzaC4KKworICAgTEsxLjEuMTcgMThEZWMwMSBha3BtCisgICAgLSBQQ0kgSUQgOTgwNSBpcyBhIFB5dGhvbi1ULCBub3QgYSBkdWFsLXBvcnQgQ3ljbG9uZS4gIEFwcGFyZW50bHkuCisgICAgICBBbmQgaXQgaGFzIE5XQVkuCisgICAgLSBNYXNrIG91ciBhZHZlcnRpc2VkIG1vZGVzICh2cC0+YWR2ZXJ0aXNpbmcpIHdpdGggb3VyIGNhcGFiaWxpdGllcworCSAgKE1JSSByZWc1KSB3aGVuIGRlY2lkaW5nIHdoaWNoIGR1cGxleCBtb2RlIHRvIHVzZS4KKyAgICAtIEFkZCBgZ2xvYmFsX29wdGlvbnMnIGFzIGRlZmF1bHQgZm9yIG9wdGlvbnNbXS4gIERpdHRvIGdsb2JhbF9lbmFibGVfd29sLAorICAgICAgZ2xvYmFsX2Z1bGxfZHVwbGV4LgorCisgICBMSzEuMS4xOCAwMUp1bDAyIGFrcG0KKyAgICAtIEZpeCBmb3IgdW5kb2N1bWVudGVkIHRyYW5zY2VpdmVyIHBvd2VyLXVwIGJpdCBvbiBzb21lIDNjNTY2QidzCisgICAgICAoRG9uYWxkIEJlY2tlciwgUmFodWwgS2FybmlrKQorCisgICAgLSBTZWUgaHR0cDovL3d3dy56aXAuY29tLmF1L35ha3BtL2xpbnV4LyMzYzU5eC0yLjMgZm9yIG1vcmUgZGV0YWlscy4KKyAgICAtIEFsc28gc2VlIERvY3VtZW50YXRpb24vbmV0d29ya2luZy92b3J0ZXgudHh0CisKKyAgIExLMS4xLjE5IDEwTm92MDIgTWFyYyBaeW5naWVyIDxtYXpAd2lsZC13aW5kLmZyLmV1Lm9yZz4KKyAgICAtIEVJU0Egc3lzZnMgaW50ZWdyYXRpb24uCisqLworCisvKgorICogRklYTUU6IFRoaXMgZHJpdmVyIF9jb3VsZF8gc3VwcG9ydCBNVFUgY2hhbmdpbmcsIGJ1dCBkb2Vzbid0LiAgU2VlIERvbidzIGhhbWFjaGkuYyBpbXBsZW1lbnRhdGlvbgorICogYXMgd2VsbCBhcyBvdGhlciBkcml2ZXJzCisgKgorICogTk9URTogSWYgeW91IG1ha2UgJ3ZvcnRleF9kZWJ1ZycgYSBjb25zdGFudCAoI2RlZmluZSB2b3J0ZXhfZGVidWcgMCkgdGhlIGRyaXZlciBzaHJpbmtzIGJ5IDJrCisgKiBkdWUgdG8gZGVhZCBjb2RlIGVsaW1pbmF0aW9uLiAgVGhlcmUgd2lsbCBiZSBzb21lIHBlcmZvcm1hbmNlIGJlbmVmaXRzIGZyb20gdGhpcyBkdWUgdG8KKyAqIGVsaW1pbmF0aW9uIG9mIGFsbCB0aGUgdGVzdHMgYW5kIHJlZHVjZWQgY2FjaGUgZm9vdHByaW50LgorICovCisKKworI2RlZmluZSBEUlZfTkFNRQkiM2M1OXgiCisjZGVmaW5lIERSVl9WRVJTSU9OCSJMSzEuMS4xOSIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIjEwIE5vdiAyMDAyIgorCisKKworLyogQSBmZXcgdmFsdWVzIHRoYXQgbWF5IGJlIHR3ZWFrZWQuICovCisvKiBLZWVwIHRoZSByaW5nIHNpemVzIGEgcG93ZXIgb2YgdHdvIGZvciBlZmZpY2llbmN5LiAqLworI2RlZmluZSBUWF9SSU5HX1NJWkUJMTYKKyNkZWZpbmUgUlhfUklOR19TSVpFCTMyCisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1MzYJCQkvKiBTaXplIG9mIGVhY2ggdGVtcG9yYXJ5IFJ4IGJ1ZmZlci4qLworCisvKiAiS25vYnMiIHRoYXQgYWRqdXN0IGZlYXR1cmVzIGFuZCBwYXJhbWV0ZXJzLiAqLworLyogU2V0IHRoZSBjb3B5IGJyZWFrcG9pbnQgZm9yIHRoZSBjb3B5LW9ubHktdGlueS1mcmFtZXMgc2NoZW1lLgorICAgU2V0dGluZyB0byA+IDE1MTIgZWZmZWN0aXZlbHkgZGlzYWJsZXMgdGhpcyBmZWF0dXJlLiAqLworI2lmbmRlZiBfX2FybV9fCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhayA9IDIwMDsKKyNlbHNlCisvKiBBUk0gc3lzdGVtcyBwZXJmb3JtIGJldHRlciBieSBkaXNyZWdhcmRpbmcgdGhlIGJ1cy1tYXN0ZXIKKyAgIHRyYW5zZmVyIGNhcGFiaWxpdHkgb2YgdGhlc2UgY2FyZHMuIC0tIHJtayAqLworc3RhdGljIGludCByeF9jb3B5YnJlYWsgPSAxNTEzOworI2VuZGlmCisvKiBBbGxvdyBzZXR0aW5nIE1UVSB0byBhIGxhcmdlciBzaXplLCBieXBhc3NpbmcgdGhlIG5vcm1hbCBldGhlcm5ldCBzZXR1cC4gKi8KK3N0YXRpYyBjb25zdCBpbnQgbXR1ID0gMTUwMDsKKy8qIE1heGltdW0gZXZlbnRzIChSeCBwYWNrZXRzLCBldGMuKSB0byBoYW5kbGUgYXQgZWFjaCBpbnRlcnJ1cHQuICovCitzdGF0aWMgaW50IG1heF9pbnRlcnJ1cHRfd29yayA9IDMyOworLyogVHggdGltZW91dCBpbnRlcnZhbCAobWlsbGlzZWNzKSAqLworc3RhdGljIGludCB3YXRjaGRvZyA9IDUwMDA7CisKKy8qIEFsbG93IGFnZ3JlZ2F0aW9uIG9mIFR4IGludGVycnVwdHMuICBTYXZlcyBDUFUgbG9hZCBhdCB0aGUgY29zdAorICogb2YgcG9zc2libGUgVHggc3RhbGxzIGlmIHRoZSBzeXN0ZW0gaXMgYmxvY2tpbmcgaW50ZXJydXB0cworICogc29tZXdoZXJlIGVsc2UuICBVbmRlZmluZSB0aGlzIHRvIGRpc2FibGUuCisgKi8KKyNkZWZpbmUgdHhfaW50ZXJydXB0X21pdGlnYXRpb24gMQorCisvKiBQdXQgb3V0IHNvbWV3aGF0IG1vcmUgZGVidWdnaW5nIG1lc3NhZ2VzLiAoMDogbm8gbXNnLCAxIG1pbmltYWwgLi4gNikuICovCisjZGVmaW5lIHZvcnRleF9kZWJ1ZyBkZWJ1ZworI2lmZGVmIFZPUlRFWF9ERUJVRworc3RhdGljIGludCB2b3J0ZXhfZGVidWcgPSBWT1JURVhfREVCVUc7CisjZWxzZQorc3RhdGljIGludCB2b3J0ZXhfZGVidWcgPSAxOworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9laXNhLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgkJCS8qIEZvciBOUl9JUlFTIG9ubHkuICovCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyogS2VybmVsIGNvbXBhdGliaWxpdHkgZGVmaW5lcywgc29tZSBjb21tb24gdG8gRGF2aWQgSGluZHMnIFBDTUNJQSBwYWNrYWdlLgorICAgVGhpcyBpcyBvbmx5IGluIHRoZSBzdXBwb3J0LWFsbC1rZXJuZWxzIHNvdXJjZSBjb2RlLiAqLworCisjZGVmaW5lIFJVTl9BVCh4KSAoamlmZmllcyArICh4KSkKKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorRFJWX05BTUUgIjogRG9uYWxkIEJlY2tlciBhbmQgb3RoZXJzLiB3d3cuc2N5bGQuY29tL25ldHdvcmsvdm9ydGV4Lmh0bWxcbiI7CisKK01PRFVMRV9BVVRIT1IoIkRvbmFsZCBCZWNrZXIgPGJlY2tlckBzY3lsZC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIjNDb20gM2M1OXgvM2M5eHggZXRoZXJuZXQgZHJpdmVyICIKKwkJCQkJRFJWX1ZFUlNJT04gIiAiIERSVl9SRUxEQVRFKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKworCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXIgdGhhdCB1c3VhbGx5IGFyZSBub3QgY2hhbmdlZC4gKi8KKworLyogVGhlIFZvcnRleCBzaXplIGlzIHR3aWNlIHRoYXQgb2YgdGhlIG9yaWdpbmFsIEV0aGVyTGlua0lJSSBzZXJpZXM6IHRoZQorICAgcnVudGltZSByZWdpc3RlciB3aW5kb3csIHdpbmRvdyAxLCBpcyBub3cgYWx3YXlzIG1hcHBlZCBpbi4KKyAgIFRoZSBCb29tZXJhbmcgc2l6ZSBpcyB0d2ljZSBhcyBsYXJnZSBhcyB0aGUgVm9ydGV4IC0tIGl0IGhhcyBhZGRpdGlvbmFsCisgICBidXMgbWFzdGVyIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBWT1JURVhfVE9UQUxfU0laRSAweDIwCisjZGVmaW5lIEJPT01FUkFOR19UT1RBTF9TSVpFIDB4NDAKKworLyogU2V0IGlmZiBhIE1JSSB0cmFuc2NlaXZlciBvbiBhbnkgaW50ZXJmYWNlIHJlcXVpcmVzIG1kaW8gcHJlYW1ibGUuCisgICBUaGlzIG9ubHkgc2V0IHdpdGggdGhlIG9yaWdpbmFsIERQODM4NDAgb24gb2xkZXIgM2M5MDUgYm9hcmRzLCBzbyB0aGUgZXh0cmEKKyAgIGNvZGUgc2l6ZSBvZiBhIHBlci1pbnRlcmZhY2UgZmxhZyBpcyBub3Qgd29ydGh3aGlsZS4gKi8KK3N0YXRpYyBjaGFyIG1paV9wcmVhbWJsZV9yZXF1aXJlZDsKKworI2RlZmluZSBQRlggRFJWX05BTUUgIjogIgorCisKKworLyoKKwkJCQlUaGVvcnkgb2YgT3BlcmF0aW9uCisKK0kuIEJvYXJkIENvbXBhdGliaWxpdHkKKworVGhpcyBkZXZpY2UgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciB0aGUgM0NvbSBGYXN0RXRoZXJMaW5rIGFuZCBGYXN0RXRoZXJMaW5rCitYTCwgM0NvbSdzIFBDSSB0byAxMC8xMDBiYXNlVCBhZGFwdGVycy4gIEl0IGFsc28gd29ya3Mgd2l0aCB0aGUgMTBNYnMKK3ZlcnNpb25zIG9mIHRoZSBGYXN0RXRoZXJMaW5rIGNhcmRzLiAgVGhlIHN1cHBvcnRlZCBwcm9kdWN0IElEcyBhcmUKKyAgM2M1OTAsIDNjNTkyLCAzYzU5NSwgM2M1OTcsIDNjOTAwLCAzYzkwNQorCitUaGUgcmVsYXRlZCBJU0EgM2M1MTUgaXMgc3VwcG9ydGVkIHdpdGggYSBzZXBhcmF0ZSBkcml2ZXIsIDNjNTE1LmMsIGluY2x1ZGVkCit3aXRoIHRoZSBrZXJuZWwgc291cmNlIG9yIGF2YWlsYWJsZSBmcm9tCisgICAgY2VzZGlzLmdzZmMubmFzYS5nb3Y6L3B1Yi9saW51eC9kcml2ZXJzLzNjNTE1Lmh0bWwKKworSUkuIEJvYXJkLXNwZWNpZmljIHNldHRpbmdzCisKK1BDSSBidXMgZGV2aWNlcyBhcmUgY29uZmlndXJlZCBieSB0aGUgc3lzdGVtIGF0IGJvb3QgdGltZSwgc28gbm8ganVtcGVycworbmVlZCB0byBiZSBzZXQgb24gdGhlIGJvYXJkLiAgVGhlIHN5c3RlbSBCSU9TIHNob3VsZCBiZSBzZXQgdG8gYXNzaWduIHRoZQorUENJIElOVEEgc2lnbmFsIHRvIGFuIG90aGVyd2lzZSB1bnVzZWQgc3lzdGVtIElSUSBsaW5lLgorCitUaGUgRUVQUk9NIHNldHRpbmdzIGZvciBtZWRpYSB0eXBlIGFuZCBmb3JjZWQtZnVsbC1kdXBsZXggYXJlIG9ic2VydmVkLgorVGhlIEVFUFJPTSBtZWRpYSB0eXBlIHNob3VsZCBiZSBsZWZ0IGF0IHRoZSBkZWZhdWx0ICJhdXRvc2VsZWN0IiB1bmxlc3MgdXNpbmcKKzEwYmFzZTIgb3IgQVVJIGNvbm5lY3Rpb25zIHdoaWNoIGNhbm5vdCBiZSByZWxpYWJseSBkZXRlY3RlZC4KKworSUlJLiBEcml2ZXIgb3BlcmF0aW9uCisKK1RoZSAzYzU5eCBzZXJpZXMgdXNlIGFuIGludGVyZmFjZSB0aGF0J3MgdmVyeSBzaW1pbGFyIHRvIHRoZSBwcmV2aW91cyAzYzV4OQorc2VyaWVzLiAgVGhlIHByaW1hcnkgaW50ZXJmYWNlIGlzIHR3byBwcm9ncmFtbWVkLUkvTyBGSUZPcywgd2l0aCBhbgorYWx0ZXJuYXRlIHNpbmdsZS1jb250aWd1b3VzLXJlZ2lvbiBidXMtbWFzdGVyIHRyYW5zZmVyIChzZWUgbmV4dCkuCisKK1RoZSAzYzkwMCAiQm9vbWVyYW5nIiBzZXJpZXMgdXNlcyBhIGZ1bGwtYnVzLW1hc3RlciBpbnRlcmZhY2Ugd2l0aCBzZXBhcmF0ZQorbGlzdHMgb2YgdHJhbnNtaXQgYW5kIHJlY2VpdmUgZGVzY3JpcHRvcnMsIHNpbWlsYXIgdG8gdGhlIEFNRCBMQU5DRS9QQ25ldCwKK0RFQyBUdWxpcCBhbmQgSW50ZWwgU3BlZWRvMy4gIFRoZSBmaXJzdCBjaGlwIHZlcnNpb24gcmV0YWlucyBhIGNvbXBhdGlibGUKK3Byb2dyYW1tZWQtSS9PIGludGVyZmFjZSB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgaW4gJ0InIGFuZCBzdWJzZXF1ZW50IGJvYXJkCityZXZpc2lvbnMuCisKK09uZSBleHRlbnNpb24gdGhhdCBpcyBhZHZlcnRpc2VkIGluIGEgdmVyeSBsYXJnZSBmb250IGlzIHRoYXQgdGhlIGFkYXB0ZXJzCithcmUgY2FwYWJsZSBvZiBiZWluZyBidXMgbWFzdGVycy4gIE9uIHRoZSBWb3J0ZXggY2hpcCB0aGlzIGNhcGFiaWxpdHkgd2FzCitvbmx5IGZvciBhIHNpbmdsZSBjb250aWd1b3VzIHJlZ2lvbiBtYWtpbmcgaXQgZmFyIGxlc3MgdXNlZnVsIHRoYW4gdGhlIGZ1bGwKK2J1cyBtYXN0ZXIgY2FwYWJpbGl0eS4gIFRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wYWN0IG9mIHRha2luZworYW4gZXh0cmEgaW50ZXJydXB0IG9yIHBvbGxpbmcgZm9yIHRoZSBjb21wbGV0aW9uIG9mIGVhY2ggdHJhbnNmZXIsIGFzIHdlbGwKK2FzIGRpZmZpY3VsdHkgc2hhcmluZyB0aGUgc2luZ2xlIHRyYW5zZmVyIGVuZ2luZSBiZXR3ZWVuIHRoZSB0cmFuc21pdCBhbmQKK3JlY2VpdmUgdGhyZWFkcy4gIFVzaW5nIERNQSB0cmFuc2ZlcnMgaXMgYSB3aW4gb25seSB3aXRoIGxhcmdlIGJsb2NrcyBvcgord2l0aCB0aGUgZmxhd2VkIHZlcnNpb25zIG9mIHRoZSBJbnRlbCBPcmlvbiBtb3RoZXJib2FyZCBQQ0kgY29udHJvbGxlci4KKworVGhlIEJvb21lcmFuZyBjaGlwJ3MgZnVsbC1idXMtbWFzdGVyIGludGVyZmFjZSBpcyB1c2VmdWwsIGFuZCBoYXMgdGhlCitjdXJyZW50bHktdW51c2VkIGFkdmFudGFnZXMgb3ZlciBvdGhlciBzaW1pbGFyIGNoaXBzIHRoYXQgcXVldWVkIHRyYW5zbWl0CitwYWNrZXRzIG1heSBiZSByZW9yZGVyZWQgYW5kIHJlY2VpdmUgYnVmZmVyIGdyb3VwcyBhcmUgYXNzb2NpYXRlZCB3aXRoIGEKK3NpbmdsZSBmcmFtZS4KKworV2l0aCBmdWxsLWJ1cy1tYXN0ZXIgc3VwcG9ydCwgdGhpcyBkcml2ZXIgdXNlcyBhICJSWF9DT1BZQlJFQUsiIHNjaGVtZS4KK1JhdGhlciB0aGFuIGEgZml4ZWQgaW50ZXJtZWRpYXRlIHJlY2VpdmUgYnVmZmVyLCB0aGlzIHNjaGVtZSBhbGxvY2F0ZXMKK2Z1bGwtc2l6ZWQgc2tidWZmcyBhcyByZWNlaXZlIGJ1ZmZlcnMuICBUaGUgdmFsdWUgUlhfQ09QWUJSRUFLIGlzIHVzZWQgYXMKK3RoZSBjb3B5aW5nIGJyZWFrcG9pbnQ6IGl0IGlzIGNob3NlbiB0byB0cmFkZS1vZmYgdGhlIG1lbW9yeSB3YXN0ZWQgYnkKK3Bhc3NpbmcgdGhlIGZ1bGwtc2l6ZWQgc2tidWZmIHRvIHRoZSBxdWV1ZSBsYXllciBmb3IgYWxsIGZyYW1lcyB2cy4gdGhlCitjb3B5aW5nIGNvc3Qgb2YgY29weWluZyBhIGZyYW1lIHRvIGEgY29ycmVjdGx5LXNpemVkIHNrYnVmZi4KKworSUlJQy4gU3luY2hyb25pemF0aW9uCitUaGUgZHJpdmVyIHJ1bnMgYXMgdHdvIGluZGVwZW5kZW50LCBzaW5nbGUtdGhyZWFkZWQgZmxvd3Mgb2YgY29udHJvbC4gIE9uZQoraXMgdGhlIHNlbmQtcGFja2V0IHJvdXRpbmUsIHdoaWNoIGVuZm9yY2VzIHNpbmdsZS10aHJlYWRlZCB1c2UgYnkgdGhlCitkZXYtPnRidXN5IGZsYWcuICBUaGUgb3RoZXIgdGhyZWFkIGlzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgd2hpY2ggaXMgc2luZ2xlCit0aHJlYWRlZCBieSB0aGUgaGFyZHdhcmUgYW5kIG90aGVyIHNvZnR3YXJlLgorCitJVi4gTm90ZXMKKworVGhhbmtzIHRvIENhbWVyb24gU3BpdHplciBhbmQgVGVycnkgTXVycGh5IG9mIDNDb20gZm9yIHByb3ZpZGluZyBkZXZlbG9wbWVudAorM2M1OTAsIDNjNTk1LCBhbmQgM2M5MDAgYm9hcmRzLgorVGhlIG5hbWUgIlZvcnRleCIgaXMgdGhlIGludGVybmFsIDNDb20gcHJvamVjdCBuYW1lIGZvciB0aGUgUENJIEFTSUMsIGFuZAordGhlIEVJU0EgdmVyc2lvbiBpcyBjYWxsZWQgIkRlbW9uIi4gIEFjY29yZGluZyB0byBUZXJyeSB0aGVzZSBuYW1lcyBjb21lCitmcm9tIHJpZGVzIGF0IHRoZSBsb2NhbCBhbXVzZW1lbnQgcGFyay4KKworVGhlIG5ldyBjaGlwcyBzdXBwb3J0IGJvdGggZXRoZXJuZXQgKDEuNUspIGFuZCBGRERJICg0LjVLKSBwYWNrZXQgc2l6ZXMhCitUaGlzIGRyaXZlciBvbmx5IHN1cHBvcnRzIGV0aGVybmV0IHBhY2tldHMgYmVjYXVzZSBvZiB0aGUgc2tidWZmIGFsbG9jYXRpb24KK2xpbWl0IG9mIDRLLgorKi8KKworLyogVGhpcyB0YWJsZSBkcml2ZXMgdGhlIFBDSSBwcm9iZSByb3V0aW5lcy4gIEl0J3MgbW9zdGx5IGJvaWxlcnBsYXRlIGluIGFsbAorICAgb2YgdGhlIGRyaXZlcnMsIGFuZCB3aWxsIGxpa2VseSBiZSBwcm92aWRlZCBieSBzb21lIGZ1dHVyZSBrZXJuZWwuCisqLworZW51bSBwY2lfZmxhZ3NfYml0IHsKKwlQQ0lfVVNFU19JTz0xLCBQQ0lfVVNFU19NRU09MiwgUENJX1VTRVNfTUFTVEVSPTQsCisJUENJX0FERFIwPTB4MTA8PDAsIFBDSV9BRERSMT0weDEwPDwxLCBQQ0lfQUREUjI9MHgxMDw8MiwgUENJX0FERFIzPTB4MTA8PDMsCit9OworCitlbnVtIHsJSVNfVk9SVEVYPTEsIElTX0JPT01FUkFORz0yLCBJU19DWUNMT05FPTQsIElTX1RPUk5BRE89OCwKKwlFRVBST01fOEJJVD0weDEwLAkvKiBBS1BNOiBVc2VzIDB4MjMwIGFzIHRoZSBiYXNlIGJpdG1hcHMgZm9yIEVFUFJPTSByZWFkcyAqLworCUhBU19QV1JfQ1RSTD0weDIwLCBIQVNfTUlJPTB4NDAsIEhBU19OV0FZPTB4ODAsIEhBU19DQl9GTlM9MHgxMDAsCisJSU5WRVJUX01JSV9QV1I9MHgyMDAsIElOVkVSVF9MRURfUFdSPTB4NDAwLCBNQVhfQ09MTElTSU9OX1JFU0VUPTB4ODAwLAorCUVFUFJPTV9PRkZTRVQ9MHgxMDAwLCBIQVNfSFdDS1NNPTB4MjAwMCwgV05PX1hDVlJfUFdSPTB4NDAwMCwKKwlFWFRSQV9QUkVBTUJMRT0weDgwMDAsIEVFUFJPTV9SRVNFVD0weDEwMDAwLCB9OworCitlbnVtIHZvcnRleF9jaGlwcyB7CisJQ0hfM0M1OTAgPSAwLAorCUNIXzNDNTkyLAorCUNIXzNDNTk3LAorCUNIXzNDNTk1XzEsCisJQ0hfM0M1OTVfMiwKKworCUNIXzNDNTk1XzMsCisJQ0hfM0M5MDBfMSwKKwlDSF8zQzkwMF8yLAorCUNIXzNDOTAwXzMsCisJQ0hfM0M5MDBfNCwKKworCUNIXzNDOTAwXzUsCisJQ0hfM0M5MDBCX0ZMLAorCUNIXzNDOTA1XzEsCisJQ0hfM0M5MDVfMiwKKwlDSF8zQzkwNUJfMSwKKworCUNIXzNDOTA1Ql8yLAorCUNIXzNDOTA1Ql9GWCwKKwlDSF8zQzkwNUMsCisJQ0hfM0M5MjAyLAorCUNIXzNDOTgwLAorCUNIXzNDOTgwNSwKKworCUNIXzNDU09ITzEwMF9UWCwKKwlDSF8zQzU1NSwKKwlDSF8zQzU1NiwKKwlDSF8zQzU1NkIsCisJQ0hfM0M1NzUsCisKKwlDSF8zQzU3NV8xLAorCUNIXzNDQ0ZFNTc1LAorCUNIXzNDQ0ZFNTc1Q1QsCisJQ0hfM0NDRkU2NTYsCisJQ0hfM0NDRkVNNjU2LAorCisJQ0hfM0NDRkVNNjU2XzEsCisJQ0hfM0M0NTAsCisJQ0hfM0M5MjAsCisJQ0hfM0M5ODJBLAorCUNIXzNDOTgyQiwKKworCUNIXzkwNUJUNCwKKwlDSF85MjBCX0VNQl9XTk0sCit9OworCisKKy8qIG5vdGU6IHRoaXMgYXJyYXkgZGlyZWN0bHkgaW5kZXhlZCBieSBhYm92ZSBlbnVtcywgYW5kIE1VU1QKKyAqIGJlIGtlcHQgaW4gc3luYyB3aXRoIGJvdGggdGhlIGVudW1zIGFib3ZlLCBhbmQgdGhlIFBDSSBkZXZpY2UKKyAqIHRhYmxlIGJlbG93CisgKi8KK3N0YXRpYyBzdHJ1Y3Qgdm9ydGV4X2NoaXBfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgZmxhZ3M7CisJaW50IGRydl9mbGFnczsKKwlpbnQgaW9fc2l6ZTsKK30gdm9ydGV4X2luZm9fdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IjNjNTkwIFZvcnRleCAxME1icHMiLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX1ZPUlRFWCwgMzIsIH0sCisJeyIzYzU5MiBFSVNBIDEwTWJwcyBEZW1vbi9Wb3J0ZXgiLAkJCQkJLyogQUtQTTogZnJvbSBEb24ncyAzYzU5eF9jYi5jIDAuNDlIICovCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfVk9SVEVYLCAzMiwgfSwKKwl7IjNjNTk3IEVJU0EgRmFzdCBEZW1vbi9Wb3J0ZXgiLAkJCQkJLyogQUtQTTogZnJvbSBEb24ncyAzYzU5eF9jYi5jIDAuNDlIICovCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfVk9SVEVYLCAzMiwgfSwKKwl7IjNjNTk1IFZvcnRleCAxMDBiYXNlVHgiLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX1ZPUlRFWCwgMzIsIH0sCisJeyIzYzU5NSBWb3J0ZXggMTAwYmFzZVQ0IiwKKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19WT1JURVgsIDMyLCB9LAorCisJeyIzYzU5NSBWb3J0ZXggMTAwYmFzZS1NSUkiLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX1ZPUlRFWCwgMzIsIH0sCisJeyIzYzkwMCBCb29tZXJhbmcgMTBiYXNlVCIsCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfQk9PTUVSQU5HfEVFUFJPTV9SRVNFVCwgNjQsIH0sCisJeyIzYzkwMCBCb29tZXJhbmcgMTBNYnBzIENvbWJvIiwKKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19CT09NRVJBTkd8RUVQUk9NX1JFU0VULCA2NCwgfSwKKwl7IjNjOTAwIEN5Y2xvbmUgMTBNYnBzIFRQTyIsCQkJCQkJLyogQUtQTTogZnJvbSBEb24ncyAwLjk5TSAqLworCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX0NZQ0xPTkV8SEFTX0hXQ0tTTSwgMTI4LCB9LAorCXsiM2M5MDAgQ3ljbG9uZSAxME1icHMgQ29tYm8iLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX0NZQ0xPTkV8SEFTX0hXQ0tTTSwgMTI4LCB9LAorCisJeyIzYzkwMCBDeWNsb25lIDEwTWJwcyBUUEMiLAkJCQkJCS8qIEFLUE06IGZyb20gRG9uJ3MgMC45OU0gKi8KKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19DWUNMT05FfEhBU19IV0NLU00sIDEyOCwgfSwKKwl7IjNjOTAwQi1GTCBDeWNsb25lIDEwYmFzZS1GTCIsCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfQ1lDTE9ORXxIQVNfSFdDS1NNLCAxMjgsIH0sCisJeyIzYzkwNSBCb29tZXJhbmcgMTAwYmFzZVR4IiwKKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19CT09NRVJBTkd8SEFTX01JSXxFRVBST01fUkVTRVQsIDY0LCB9LAorCXsiM2M5MDUgQm9vbWVyYW5nIDEwMGJhc2VUNCIsCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfQk9PTUVSQU5HfEhBU19NSUl8RUVQUk9NX1JFU0VULCA2NCwgfSwKKwl7IjNjOTA1QiBDeWNsb25lIDEwMGJhc2VUeCIsCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfQ1lDTE9ORXxIQVNfTldBWXxIQVNfSFdDS1NNfEVYVFJBX1BSRUFNQkxFLCAxMjgsIH0sCisKKwl7IjNjOTA1QiBDeWNsb25lIDEwLzEwMC9CTkMiLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX0NZQ0xPTkV8SEFTX05XQVl8SEFTX0hXQ0tTTSwgMTI4LCB9LAorCXsiM2M5MDVCLUZYIEN5Y2xvbmUgMTAwYmFzZUZ4IiwKKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19DWUNMT05FfEhBU19IV0NLU00sIDEyOCwgfSwKKwl7IjNjOTA1QyBUb3JuYWRvIiwKKwlQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX1RPUk5BRE98SEFTX05XQVl8SEFTX0hXQ0tTTXxFWFRSQV9QUkVBTUJMRSwgMTI4LCB9LAorCXsiM2M5MjBCLUVNQi1XTk0gKEFUSSBSYWRlb24gOTEwMCBJR1ApIiwKKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19UT1JOQURPfEhBU19NSUl8SEFTX0hXQ0tTTSwgMTI4LCB9LAorCXsiM2M5ODAgQ3ljbG9uZSIsCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfQ1lDTE9ORXxIQVNfSFdDS1NNLCAxMjgsIH0sCisKKwl7IjNjOTgwQyBQeXRob24tVCIsCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfQ1lDTE9ORXxIQVNfTldBWXxIQVNfSFdDS1NNLCAxMjgsIH0sCisJeyIzY1NPSE8xMDAtVFggSHVycmljYW5lIiwKKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19DWUNMT05FfEhBU19OV0FZfEhBU19IV0NLU00sIDEyOCwgfSwKKwl7IjNjNTU1IExhcHRvcCBIdXJyaWNhbmUiLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX0NZQ0xPTkV8RUVQUk9NXzhCSVR8SEFTX0hXQ0tTTSwgMTI4LCB9LAorCXsiM2M1NTYgTGFwdG9wIFRvcm5hZG8iLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX1RPUk5BRE98SEFTX05XQVl8RUVQUk9NXzhCSVR8SEFTX0NCX0ZOU3xJTlZFUlRfTUlJX1BXUnwKKwkJCQkJCQkJCUhBU19IV0NLU00sIDEyOCwgfSwKKwl7IjNjNTU2QiBMYXB0b3AgSHVycmljYW5lIiwKKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19UT1JOQURPfEhBU19OV0FZfEVFUFJPTV9PRkZTRVR8SEFTX0NCX0ZOU3xJTlZFUlRfTUlJX1BXUnwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdOT19YQ1ZSX1BXUnxIQVNfSFdDS1NNLCAxMjgsIH0sCisKKwl7IjNjNTc1IFtNZWdhaGVydHpdIDEwLzEwMCBMQU4gCUNhcmRCdXMiLAorCVBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfQk9PTUVSQU5HfEhBU19NSUl8RUVQUk9NXzhCSVQsIDEyOCwgfSwKKwl7IjNjNTc1IEJvb21lcmFuZyBDYXJkQnVzIiwKKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19CT09NRVJBTkd8SEFTX01JSXxFRVBST01fOEJJVCwgMTI4LCB9LAorCXsiM0NDRkU1NzVCVCBDeWNsb25lIENhcmRCdXMiLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX0NZQ0xPTkV8SEFTX05XQVl8SEFTX0NCX0ZOU3xFRVBST01fOEJJVHwKKwkJCQkJCQkJCUlOVkVSVF9MRURfUFdSfEhBU19IV0NLU00sIDEyOCwgfSwKKwl7IjNDQ0ZFNTc1Q1QgVG9ybmFkbyBDYXJkQnVzIiwKKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19UT1JOQURPfEhBU19OV0FZfEhBU19DQl9GTlN8RUVQUk9NXzhCSVR8SU5WRVJUX01JSV9QV1J8CisJCQkJCQkJCQlNQVhfQ09MTElTSU9OX1JFU0VUfEhBU19IV0NLU00sIDEyOCwgfSwKKwl7IjNDQ0ZFNjU2IEN5Y2xvbmUgQ2FyZEJ1cyIsCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfQ1lDTE9ORXxIQVNfTldBWXxIQVNfQ0JfRk5TfEVFUFJPTV84QklUfElOVkVSVF9NSUlfUFdSfAorCQkJCQkJCQkJSU5WRVJUX0xFRF9QV1J8SEFTX0hXQ0tTTSwgMTI4LCB9LAorCisJeyIzQ0NGRU02NTZCIEN5Y2xvbmUrV2lubW9kZW0gQ2FyZEJ1cyIsCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfQ1lDTE9ORXxIQVNfTldBWXxIQVNfQ0JfRk5TfEVFUFJPTV84QklUfElOVkVSVF9NSUlfUFdSfAorCQkJCQkJCQkJSU5WRVJUX0xFRF9QV1J8SEFTX0hXQ0tTTSwgMTI4LCB9LAorCXsiM0NYRkVNNjU2QyBUb3JuYWRvK1dpbm1vZGVtIENhcmRCdXMiLAkJCS8qIEZyb20gcGNtY2lhLWNzLTMuMS41ICovCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfVE9STkFET3xIQVNfTldBWXxIQVNfQ0JfRk5TfEVFUFJPTV84QklUfElOVkVSVF9NSUlfUFdSfAorCQkJCQkJCQkJTUFYX0NPTExJU0lPTl9SRVNFVHxIQVNfSFdDS1NNLCAxMjgsIH0sCisJeyIzYzQ1MCBIb21lUE5BIFRvcm5hZG8iLAkJCQkJCS8qIEFLUE06IGZyb20gRG9uJ3MgMC45OVEgKi8KKwkgUENJX1VTRVNfSU98UENJX1VTRVNfTUFTVEVSLCBJU19UT1JOQURPfEhBU19OV0FZfEhBU19IV0NLU00sIDEyOCwgfSwKKwl7IjNjOTIwIFRvcm5hZG8iLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX1RPUk5BRE98SEFTX05XQVl8SEFTX0hXQ0tTTSwgMTI4LCB9LAorCXsiM2M5ODIgSHlkcmEgRHVhbCBQb3J0IEEiLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX1RPUk5BRE98SEFTX0hXQ0tTTXxIQVNfTldBWSwgMTI4LCB9LAorCisJeyIzYzk4MiBIeWRyYSBEdWFsIFBvcnQgQiIsCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfVE9STkFET3xIQVNfSFdDS1NNfEhBU19OV0FZLCAxMjgsIH0sCisJeyIzYzkwNUItVDQiLAorCSBQQ0lfVVNFU19JT3xQQ0lfVVNFU19NQVNURVIsIElTX0NZQ0xPTkV8SEFTX05XQVl8SEFTX0hXQ0tTTXxFWFRSQV9QUkVBTUJMRSwgMTI4LCB9LAorCXsiM2M5MjBCLUVNQi1XTk0gVG9ybmFkbyIsCisJIFBDSV9VU0VTX0lPfFBDSV9VU0VTX01BU1RFUiwgSVNfVE9STkFET3xIQVNfTldBWXxIQVNfSFdDS1NNLCAxMjgsIH0sCisKKwl7TlVMTCx9LCAvKiBOVUxMIHRlcm1pbmF0ZWQgbGlzdC4gKi8KK307CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZvcnRleF9wY2lfdGJsW10gPSB7CisJeyAweDEwQjcsIDB4NTkwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0M1OTAgfSwKKwl7IDB4MTBCNywgMHg1OTIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzU5MiB9LAorCXsgMHgxMEI3LCAweDU5NzAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDNTk3IH0sCisJeyAweDEwQjcsIDB4NTk1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0M1OTVfMSB9LAorCXsgMHgxMEI3LCAweDU5NTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDNTk1XzIgfSwKKworCXsgMHgxMEI3LCAweDU5NTIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDNTk1XzMgfSwKKwl7IDB4MTBCNywgMHg5MDAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzkwMF8xIH0sCisJeyAweDEwQjcsIDB4OTAwMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0M5MDBfMiB9LAorCXsgMHgxMEI3LCAweDkwMDQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDOTAwXzMgfSwKKwl7IDB4MTBCNywgMHg5MDA1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzkwMF80IH0sCisKKwl7IDB4MTBCNywgMHg5MDA2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzkwMF81IH0sCisJeyAweDEwQjcsIDB4OTAwQSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0M5MDBCX0ZMIH0sCisJeyAweDEwQjcsIDB4OTA1MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0M5MDVfMSB9LAorCXsgMHgxMEI3LCAweDkwNTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDOTA1XzIgfSwKKwl7IDB4MTBCNywgMHg5MDU1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzkwNUJfMSB9LAorCisJeyAweDEwQjcsIDB4OTA1OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0M5MDVCXzIgfSwKKwl7IDB4MTBCNywgMHg5MDVBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzkwNUJfRlggfSwKKwl7IDB4MTBCNywgMHg5MjAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzkwNUMgfSwKKwl7IDB4MTBCNywgMHg5MjAyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzkyMDIgfSwKKwl7IDB4MTBCNywgMHg5ODAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzk4MCB9LAorCXsgMHgxMEI3LCAweDk4MDUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDOTgwNSB9LAorCisJeyAweDEwQjcsIDB4NzY0NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0NTT0hPMTAwX1RYIH0sCisJeyAweDEwQjcsIDB4NTA1NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0M1NTUgfSwKKwl7IDB4MTBCNywgMHg2MDU1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzU1NiB9LAorCXsgMHgxMEI3LCAweDYwNTYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDNTU2QiB9LAorCXsgMHgxMEI3LCAweDViNTcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDNTc1IH0sCisKKwl7IDB4MTBCNywgMHg1MDU3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzU3NV8xIH0sCisJeyAweDEwQjcsIDB4NTE1NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0NDRkU1NzUgfSwKKwl7IDB4MTBCNywgMHg1MjU3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQ0NGRTU3NUNUIH0sCisJeyAweDEwQjcsIDB4NjU2MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0NDRkU2NTYgfSwKKwl7IDB4MTBCNywgMHg2NTYyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQ0NGRU02NTYgfSwKKworCXsgMHgxMEI3LCAweDY1NjQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDQ0ZFTTY1Nl8xIH0sCisJeyAweDEwQjcsIDB4NDUwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfM0M0NTAgfSwKKwl7IDB4MTBCNywgMHg5MjAxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF8zQzkyMCB9LAorCXsgMHgxMEI3LCAweDEyMDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDOTgyQSB9LAorCXsgMHgxMEI3LCAweDEyMDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIXzNDOTgyQiB9LAorCisJeyAweDEwQjcsIDB4OTA1NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfOTA1QlQ0IH0sCisJeyAweDEwQjcsIDB4OTIxMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfOTIwQl9FTUJfV05NIH0sCisKKwl7MCx9CQkJCQkJLyogMCB0ZXJtaW5hdGVkIGxpc3QuICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHZvcnRleF9wY2lfdGJsKTsKKworCisvKiBPcGVyYXRpb25hbCBkZWZpbml0aW9ucy4KKyAgIFRoZXNlIGFyZSBub3QgdXNlZCBieSBvdGhlciBjb21waWxhdGlvbiB1bml0cyBhbmQgdGh1cyBhcmUgbm90CisgICBleHBvcnRlZCBpbiBhICIuaCIgZmlsZS4KKworICAgRmlyc3QgdGhlIHdpbmRvd3MuICBUaGVyZSBhcmUgZWlnaHQgcmVnaXN0ZXIgd2luZG93cywgd2l0aCB0aGUgY29tbWFuZAorICAgYW5kIHN0YXR1cyByZWdpc3RlcnMgYXZhaWxhYmxlIGluIGVhY2guCisgICAqLworI2RlZmluZSBFTDNXSU5ET1cod2luX251bSkgb3V0dyhTZWxlY3RXaW5kb3cgKyAod2luX251bSksIGlvYWRkciArIEVMM19DTUQpCisjZGVmaW5lIEVMM19DTUQgMHgwZQorI2RlZmluZSBFTDNfU1RBVFVTIDB4MGUKKworLyogVGhlIHRvcCBmaXZlIGJpdHMgd3JpdHRlbiB0byBFTDNfQ01EIGFyZSBhIGNvbW1hbmQsIHRoZSBsb3dlcgorICAgMTEgYml0cyBhcmUgdGhlIHBhcmFtZXRlciwgaWYgYXBwbGljYWJsZS4KKyAgIE5vdGUgdGhhdCAxMSBwYXJhbWV0ZXJzIGJpdHMgd2FzIGZpbmUgZm9yIGV0aGVybmV0LCBidXQgdGhlIG5ldyBjaGlwCisgICBjYW4gaGFuZGxlIEZEREkgbGVuZ3RoIGZyYW1lcyAofjQ1MDAgb2N0ZXRzKSBhbmQgbm93IHBhcmFtZXRlcnMgY291bnQKKyAgIDMyLWJpdCAnRHdvcmRzJyByYXRoZXIgdGhhbiBvY3RldHMuICovCisKK2VudW0gdm9ydGV4X2NtZCB7CisJVG90YWxSZXNldCA9IDA8PDExLCBTZWxlY3RXaW5kb3cgPSAxPDwxMSwgU3RhcnRDb2F4ID0gMjw8MTEsCisJUnhEaXNhYmxlID0gMzw8MTEsIFJ4RW5hYmxlID0gNDw8MTEsIFJ4UmVzZXQgPSA1PDwxMSwKKwlVcFN0YWxsID0gNjw8MTEsIFVwVW5zdGFsbCA9ICg2PDwxMSkrMSwKKwlEb3duU3RhbGwgPSAoNjw8MTEpKzIsIERvd25VbnN0YWxsID0gKDY8PDExKSszLAorCVJ4RGlzY2FyZCA9IDg8PDExLCBUeEVuYWJsZSA9IDk8PDExLCBUeERpc2FibGUgPSAxMDw8MTEsIFR4UmVzZXQgPSAxMTw8MTEsCisJRmFrZUludHIgPSAxMjw8MTEsIEFja0ludHIgPSAxMzw8MTEsIFNldEludHJFbmIgPSAxNDw8MTEsCisJU2V0U3RhdHVzRW5iID0gMTU8PDExLCBTZXRSeEZpbHRlciA9IDE2PDwxMSwgU2V0UnhUaHJlc2hvbGQgPSAxNzw8MTEsCisJU2V0VHhUaHJlc2hvbGQgPSAxODw8MTEsIFNldFR4U3RhcnQgPSAxOTw8MTEsCisJU3RhcnRETUFVcCA9IDIwPDwxMSwgU3RhcnRETUFEb3duID0gKDIwPDwxMSkrMSwgU3RhdHNFbmFibGUgPSAyMTw8MTEsCisJU3RhdHNEaXNhYmxlID0gMjI8PDExLCBTdG9wQ29heCA9IDIzPDwxMSwgU2V0RmlsdGVyQml0ID0gMjU8PDExLH07CisKKy8qIFRoZSBTZXRSeEZpbHRlciBjb21tYW5kIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBjbGFzc2VzOiAqLworZW51bSBSeEZpbHRlciB7CisJUnhTdGF0aW9uID0gMSwgUnhNdWx0aWNhc3QgPSAyLCBSeEJyb2FkY2FzdCA9IDQsIFJ4UHJvbSA9IDggfTsKKworLyogQml0cyBpbiB0aGUgZ2VuZXJhbCBzdGF0dXMgcmVnaXN0ZXIuICovCitlbnVtIHZvcnRleF9zdGF0dXMgeworCUludExhdGNoID0gMHgwMDAxLCBIb3N0RXJyb3IgPSAweDAwMDIsIFR4Q29tcGxldGUgPSAweDAwMDQsCisJVHhBdmFpbGFibGUgPSAweDAwMDgsIFJ4Q29tcGxldGUgPSAweDAwMTAsIFJ4RWFybHkgPSAweDAwMjAsCisJSW50UmVxID0gMHgwMDQwLCBTdGF0c0Z1bGwgPSAweDAwODAsCisJRE1BRG9uZSA9IDE8PDgsIERvd25Db21wbGV0ZSA9IDE8PDksIFVwQ29tcGxldGUgPSAxPDwxMCwKKwlETUFJblByb2dyZXNzID0gMTw8MTEsCQkJLyogRE1BIGNvbnRyb2xsZXIgaXMgc3RpbGwgYnVzeS4qLworCUNtZEluUHJvZ3Jlc3MgPSAxPDwxMiwJCQkvKiBFTDNfQ01EIGlzIHN0aWxsIGJ1c3kuKi8KK307CisKKy8qIFJlZ2lzdGVyIHdpbmRvdyAxIG9mZnNldHMsIHRoZSB3aW5kb3cgdXNlZCBpbiBub3JtYWwgb3BlcmF0aW9uLgorICAgT24gdGhlIFZvcnRleCB0aGlzIHdpbmRvdyBpcyBhbHdheXMgbWFwcGVkIGF0IG9mZnNldHMgMHgxMC0weDFmLiAqLworZW51bSBXaW5kb3cxIHsKKwlUWF9GSUZPID0gMHgxMCwgIFJYX0ZJRk8gPSAweDEwLCAgUnhFcnJvcnMgPSAweDE0LAorCVJ4U3RhdHVzID0gMHgxOCwgIFRpbWVyPTB4MUEsIFR4U3RhdHVzID0gMHgxQiwKKwlUeEZyZWUgPSAweDFDLCAvKiBSZW1haW5pbmcgZnJlZSBieXRlcyBpbiBUeCBidWZmZXIuICovCit9OworZW51bSBXaW5kb3cwIHsKKwlXbjBFZXByb21DbWQgPSAxMCwJCS8qIFdpbmRvdyAwOiBFRVBST00gY29tbWFuZCByZWdpc3Rlci4gKi8KKwlXbjBFZXByb21EYXRhID0gMTIsCQkvKiBXaW5kb3cgMDogRUVQUk9NIHJlc3VsdHMgcmVnaXN0ZXIuICovCisJSW50clN0YXR1cz0weDBFLAkJLyogVmFsaWQgaW4gYWxsIHdpbmRvd3MuICovCit9OworZW51bSBXaW4wX0VFUFJPTV9iaXRzIHsKKwlFRVBST01fUmVhZCA9IDB4ODAsIEVFUFJPTV9XUklURSA9IDB4NDAsIEVFUFJPTV9FUkFTRSA9IDB4QzAsCisJRUVQUk9NX0VXRU5CID0gMHgzMCwJCS8qIEVuYWJsZSBlcmFzaW5nL3dyaXRpbmcgZm9yIDEwIG1zZWMuICovCisJRUVQUk9NX0VXRElTID0gMHgwMCwJCS8qIERpc2FibGUgRVdFTkIgYmVmb3JlIDEwIG1zZWMgdGltZW91dC4gKi8KK307CisvKiBFRVBST00gbG9jYXRpb25zLiAqLworZW51bSBlZXByb21fb2Zmc2V0IHsKKwlQaHlzQWRkcjAxPTAsIFBoeXNBZGRyMjM9MSwgUGh5c0FkZHI0NT0yLCBNb2RlbElEPTMsCisJRXRoZXJMaW5rM0lEPTcsIElGWGN2cklPPTgsIElSUUxpbmU9OSwKKwlOb2RlQWRkcjAxPTEwLCBOb2RlQWRkcjIzPTExLCBOb2RlQWRkcjQ1PTEyLAorCURyaXZlclR1bmU9MTMsIENoZWNrc3VtPTE1fTsKKworZW51bSBXaW5kb3cyIHsJCQkvKiBXaW5kb3cgMi4gKi8KKwlXbjJfUmVzZXRPcHRpb25zPTEyLAorfTsKK2VudW0gV2luZG93MyB7CQkJLyogV2luZG93IDM6IE1BQy9jb25maWcgYml0cy4gKi8KKwlXbjNfQ29uZmlnPTAsIFduM19NYXhQa3RTaXplPTQsIFduM19NQUNfQ3RybD02LCBXbjNfT3B0aW9ucz04LAorfTsKKworI2RlZmluZSBCRkVYVCh2YWx1ZSwgb2Zmc2V0LCBiaXRjb3VudCkgIFwKKyAgICAoKCgodW5zaWduZWQgbG9uZykodmFsdWUpKSA+PiAob2Zmc2V0KSkgJiAoKDEgPDwgKGJpdGNvdW50KSkgLSAxKSkKKworI2RlZmluZSBCRklOUyhsaHMsIHJocywgb2Zmc2V0LCBiaXRjb3VudCkJCQkJCVwKKwkoKChsaHMpICYgfigoKCgxIDw8IChiaXRjb3VudCkpIC0gMSkpIDw8IChvZmZzZXQpKSkgfAlcCisJKCgocmhzKSAmICgoMSA8PCAoYml0Y291bnQpKSAtIDEpKSA8PCAob2Zmc2V0KSkpCisKKyNkZWZpbmUgUkFNX1NJWkUodikJCUJGRVhUKHYsIDAsIDMpCisjZGVmaW5lIFJBTV9XSURUSCh2KQlCRkVYVCh2LCAzLCAxKQorI2RlZmluZSBSQU1fU1BFRUQodikJQkZFWFQodiwgNCwgMikKKyNkZWZpbmUgUk9NX1NJWkUodikJCUJGRVhUKHYsIDYsIDIpCisjZGVmaW5lIFJBTV9TUExJVCh2KQlCRkVYVCh2LCAxNiwgMikKKyNkZWZpbmUgWENWUih2KQkJCUJGRVhUKHYsIDIwLCA0KQorI2RlZmluZSBBVVRPU0VMRUNUKHYpCUJGRVhUKHYsIDI0LCAxKQorCitlbnVtIFdpbmRvdzQgewkJLyogV2luZG93IDQ6IFhjdnIvbWVkaWEgYml0cy4gKi8KKwlXbjRfRklGT0RpYWcgPSA0LCBXbjRfTmV0RGlhZyA9IDYsIFduNF9QaHlzaWNhbE1nbXQ9OCwgV240X01lZGlhID0gMTAsCit9OworZW51bSBXaW40X01lZGlhX2JpdHMgeworCU1lZGlhX1NRRSA9IDB4MDAwOCwJCS8qIEVuYWJsZSBTUUUgZXJyb3IgY291bnRpbmcgZm9yIEFVSS4gKi8KKwlNZWRpYV8xMFRQID0gMHgwMEMwLAkvKiBFbmFibGUgbGluayBiZWF0IGFuZCBqYWJiZXIgZm9yIDEwYmFzZVQuICovCisJTWVkaWFfTG5rID0gMHgwMDgwLAkJLyogRW5hYmxlIGp1c3QgbGluayBiZWF0IGZvciAxMDBUWC8xMDBGWC4gKi8KKwlNZWRpYV9MbmtCZWF0ID0gMHgwODAwLAorfTsKK2VudW0gV2luZG93NyB7CQkJCQkvKiBXaW5kb3cgNzogQnVzIE1hc3RlciBjb250cm9sLiAqLworCVduN19NYXN0ZXJBZGRyID0gMCwgV243X1ZsYW5FdGhlclR5cGU9NCwgV243X01hc3RlckxlbiA9IDYsCisJV243X01hc3RlclN0YXR1cyA9IDEyLAorfTsKKy8qIEJvb21lcmFuZyBidXMgbWFzdGVyIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworZW51bSBNYXN0ZXJDdHJsIHsKKwlQa3RTdGF0dXMgPSAweDIwLCBEb3duTGlzdFB0ciA9IDB4MjQsIEZyYWdBZGRyID0gMHgyOCwgRnJhZ0xlbiA9IDB4MmMsCisJVHhGcmVlVGhyZXNob2xkID0gMHgyZiwgVXBQa3RTdGF0dXMgPSAweDMwLCBVcExpc3RQdHIgPSAweDM4LAorfTsKKworLyogVGhlIFJ4IGFuZCBUeCBkZXNjcmlwdG9yIGxpc3RzLgorICAgQ2F1dGlvbiBBbHBoYSBoYWNrZXJzOiB0aGVzZSB0eXBlcyBhcmUgMzIgYml0cyEgIE5vdGUgYWxzbyB0aGUgOCBieXRlCisgICBhbGlnbm1lbnQgY29udHJhaW50IG9uIHR4X3JpbmdbXSBhbmQgcnhfcmluZ1tdLiAqLworI2RlZmluZSBMQVNUX0ZSQUcgCTB4ODAwMDAwMDAJCQkvKiBMYXN0IEFkZHIvTGVuIHBhaXIgaW4gZGVzY3JpcHRvci4gKi8KKyNkZWZpbmUgRE5fQ09NUExFVEUJMHgwMDAxMDAwMAkJCS8qIFRoaXMgcGFja2V0IGhhcyBiZWVuIGRvd25sb2FkZWQgKi8KK3N0cnVjdCBib29tX3J4X2Rlc2MgeworCXUzMiBuZXh0OwkJCQkJLyogTGFzdCBlbnRyeSBwb2ludHMgdG8gMC4gICAqLworCXMzMiBzdGF0dXM7CisJdTMyIGFkZHI7CQkJCQkvKiBVcCB0byA2MyBhZGRyL2xlbiBwYWlycyBwb3NzaWJsZS4gKi8KKwlzMzIgbGVuZ3RoOwkJCQkJLyogU2V0IExBU1RfRlJBRyB0byBpbmRpY2F0ZSBsYXN0IHBhaXIuICovCit9OworLyogVmFsdWVzIGZvciB0aGUgUnggc3RhdHVzIGVudHJ5LiAqLworZW51bSByeF9kZXNjX3N0YXR1cyB7CisJUnhEQ29tcGxldGU9MHgwMDAwODAwMCwgUnhERXJyb3I9MHg0MDAwLAorCS8qIFNlZSBib29tZXJhbmdfcngoKSBmb3IgYWN0dWFsIGVycm9yIGJpdHMgKi8KKwlJUENoa3N1bUVycj0xPDwyNSwgVENQQ2hrc3VtRXJyPTE8PDI2LCBVRFBDaGtzdW1FcnI9MTw8MjcsCisJSVBDaGtzdW1WYWxpZD0xPDwyOSwgVENQQ2hrc3VtVmFsaWQ9MTw8MzAsIFVEUENoa3N1bVZhbGlkPTE8PDMxLAorfTsKKworI2lmZGVmIE1BWF9TS0JfRlJBR1MKKyNkZWZpbmUgRE9fWkVST0NPUFkgMQorI2Vsc2UKKyNkZWZpbmUgRE9fWkVST0NPUFkgMAorI2VuZGlmCisKK3N0cnVjdCBib29tX3R4X2Rlc2MgeworCXUzMiBuZXh0OwkJCQkJLyogTGFzdCBlbnRyeSBwb2ludHMgdG8gMC4gICAqLworCXMzMiBzdGF0dXM7CQkJCQkvKiBiaXRzIDA6MTIgbGVuZ3RoLCBvdGhlcnMgc2VlIGJlbG93LiAgKi8KKyNpZiBET19aRVJPQ09QWQorCXN0cnVjdCB7CisJCXUzMiBhZGRyOworCQlzMzIgbGVuZ3RoOworCX0gZnJhZ1sxK01BWF9TS0JfRlJBR1NdOworI2Vsc2UKKwkJdTMyIGFkZHI7CisJCXMzMiBsZW5ndGg7CisjZW5kaWYKK307CisKKy8qIFZhbHVlcyBmb3IgdGhlIFR4IHN0YXR1cyBlbnRyeS4gKi8KK2VudW0gdHhfZGVzY19zdGF0dXMgeworCUNSQ0Rpc2FibGU9MHgyMDAwLCBUeERDb21wbGV0ZT0weDgwMDAsCisJQWRkSVBDaGtzdW09MHgwMjAwMDAwMCwgQWRkVENQQ2hrc3VtPTB4MDQwMDAwMDAsIEFkZFVEUENoa3N1bT0weDA4MDAwMDAwLAorCVR4SW50clVwbG9hZGVkPTB4ODAwMDAwMDAsCQkvKiBJUlEgd2hlbiBpbiBGSUZPLCBidXQgbWF5YmUgbm90IHNlbnQuICovCit9OworCisvKiBDaGlwIGZlYXR1cmVzIHdlIGNhcmUgYWJvdXQgaW4gdnAtPmNhcGFiaWxpdGllcywgcmVhZCBmcm9tIHRoZSBFRVBST00uICovCitlbnVtIENoaXBDYXBzIHsgQ2FwQnVzTWFzdGVyPTB4MjAsIENhcFB3ck1nbXQ9MHgyMDAwIH07CisKK3N0cnVjdCB2b3J0ZXhfZXh0cmFfc3RhdHMgeworICAgICAgICB1bnNpZ25lZCBsb25nIHR4X2RlZmVycmVkOworICAgICAgICB1bnNpZ25lZCBsb25nIHR4X211bHRpcGxlX2NvbGxpc2lvbnM7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgcnhfYmFkX3NzZDsKK307CisKK3N0cnVjdCB2b3J0ZXhfcHJpdmF0ZSB7CisJLyogVGhlIFJ4IGFuZCBUeCByaW5ncyBzaG91bGQgYmUgcXVhZC13b3JkLWFsaWduZWQuICovCisJc3RydWN0IGJvb21fcnhfZGVzYyogcnhfcmluZzsKKwlzdHJ1Y3QgYm9vbV90eF9kZXNjKiB0eF9yaW5nOworCWRtYV9hZGRyX3QgcnhfcmluZ19kbWE7CisJZG1hX2FkZHJfdCB0eF9yaW5nX2RtYTsKKwkvKiBUaGUgYWRkcmVzc2VzIG9mIHRyYW5zbWl0LSBhbmQgcmVjZWl2ZS1pbi1wbGFjZSBza2J1ZmZzLiAqLworCXN0cnVjdCBza19idWZmKiByeF9za2J1ZmZbUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3Qgc2tfYnVmZiogdHhfc2tidWZmW1RYX1JJTkdfU0laRV07CisJdW5zaWduZWQgaW50IGN1cl9yeCwgY3VyX3R4OwkJLyogVGhlIG5leHQgZnJlZSByaW5nIGVudHJ5ICovCisJdW5zaWduZWQgaW50IGRpcnR5X3J4LCBkaXJ0eV90eDsJLyogVGhlIHJpbmcgZW50cmllcyB0byBiZSBmcmVlKCllZC4gKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJCS8qIEdlbmVyaWMgc3RhdHMgKi8KKwlzdHJ1Y3Qgdm9ydGV4X2V4dHJhX3N0YXRzIHhzdGF0czsJLyogTklDLXNwZWNpZmljIGV4dHJhIHN0YXRzICovCisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsJCQkJLyogUGFja2V0IGJlaW5nIGVhdGVuIGJ5IGJ1cyBtYXN0ZXIgY3RybC4gICovCisJZG1hX2FkZHJfdCB0eF9za2JfZG1hOwkJCQkvKiBBbGxvY2F0ZWQgRE1BIGFkZHJlc3MgZm9yIGJ1cyBtYXN0ZXIgY3RybCBETUEuICAgKi8KKworCS8qIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIGluZm9ybWF0aW9uLiAqLworCXN0cnVjdCBkZXZpY2UgKmdlbmRldjsKKwljaGFyIF9faW9tZW0gKmNiX2ZuX2Jhc2U7CQkvKiBDYXJkQnVzIGZ1bmN0aW9uIHN0YXR1cyBhZGRyIHNwYWNlLiAqLworCisJLyogU29tZSB2YWx1ZXMgaGVyZSBvbmx5IGZvciBwZXJmb3JtYW5jZSBldmFsdWF0aW9uIGFuZCBwYXRoLWNvdmVyYWdlICovCisJaW50IHJ4X25vY29weSwgcnhfY29weSwgcXVldWVkX3BhY2tldCwgcnhfY3N1bWhpdHM7CisJaW50IGNhcmRfaWR4OworCisJLyogVGhlIHJlbWFpbmRlciBhcmUgcmVsYXRlZCB0byBjaGlwIHN0YXRlLCBtb3N0bHkgbWVkaWEgc2VsZWN0aW9uLiAqLworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkJCS8qIE1lZGlhIHNlbGVjdGlvbiB0aW1lci4gKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCByeF9vb21fdGltZXI7CQkvKiBSeCBza2IgYWxsb2NhdGlvbiByZXRyeSB0aW1lciAqLworCWludCBvcHRpb25zOwkJCQkJCS8qIFVzZXItc2V0dGFibGUgbWlzYy4gZHJpdmVyIG9wdGlvbnMuICovCisJdW5zaWduZWQgaW50IG1lZGlhX292ZXJyaWRlOjQsIAkJLyogUGFzc2VkLWluIG1lZGlhIHR5cGUuICovCisJCWRlZmF1bHRfbWVkaWE6NCwJCQkJLyogUmVhZCBmcm9tIHRoZSBFRVBST00vV24zX0NvbmZpZy4gKi8KKwkJZnVsbF9kdXBsZXg6MSwgZm9yY2VfZmQ6MSwgYXV0b3NlbGVjdDoxLAorCQlidXNfbWFzdGVyOjEsCQkJCQkvKiBWb3J0ZXggY2FuIG9ubHkgZG8gYSBmcmFnbWVudCBidXMtbS4gKi8KKwkJZnVsbF9idXNfbWFzdGVyX3R4OjEsIGZ1bGxfYnVzX21hc3Rlcl9yeDoyLCAvKiBCb29tZXJhbmcgICovCisJCWZsb3dfY3RybDoxLAkJCQkJLyogVXNlIDgwMi4zeCBmbG93IGNvbnRyb2wgKFBBVVNFIG9ubHkpICovCisJCXBhcnRuZXJfZmxvd19jdHJsOjEsCQkJLyogUGFydG5lciBzdXBwb3J0cyBmbG93IGNvbnRyb2wgKi8KKwkJaGFzX253YXk6MSwKKwkJZW5hYmxlX3dvbDoxLAkJCQkJLyogV2FrZS1vbi1MQU4gaXMgZW5hYmxlZCAqLworCQlwbV9zdGF0ZV92YWxpZDoxLAkJCQkvKiBwY2lfZGV2LT5zYXZlZF9jb25maWdfc3BhY2UgaGFzIHNhbmUgY29udGVudHMgKi8KKwkJb3BlbjoxLAorCQltZWRpYWxvY2s6MSwKKwkJbXVzdF9mcmVlX3JlZ2lvbjoxLAkJCQkvKiBGbGFnOiBpZiB6ZXJvLCBDYXJkYnVzIG93bnMgdGhlIEkvTyByZWdpb24gKi8KKwkJbGFyZ2VfZnJhbWVzOjE7CQkJLyogYWNjZXB0IGxhcmdlIGZyYW1lcyAqLworCWludCBkcnZfZmxhZ3M7CisJdTE2IHN0YXR1c19lbmFibGU7CisJdTE2IGludHJfZW5hYmxlOworCXUxNiBhdmFpbGFibGVfbWVkaWE7CQkJCS8qIEZyb20gV24zX09wdGlvbnMuICovCisJdTE2IGNhcGFiaWxpdGllcywgaW5mbzEsIGluZm8yOwkJLyogVmFyaW91cywgZnJvbSBFRVBST00uICovCisJdTE2IGFkdmVydGlzaW5nOwkJCQkJLyogTldheSBtZWRpYSBhZHZlcnRpc2VtZW50ICovCisJdW5zaWduZWQgY2hhciBwaHlzWzJdOwkJCQkvKiBNSUkgZGV2aWNlIGFkZHJlc3Nlcy4gKi8KKwl1MTYgZGVmZXJyZWQ7CQkJCQkJLyogUmVzZW5kIHRoZXNlIGludGVycnVwdHMgd2hlbiB3ZQorCQkJCQkJCQkJCSAqIGJhbGUgZnJvbSB0aGUgSVNSICovCisJdTE2IGlvX3NpemU7CQkJCQkJLyogU2l6ZSBvZiBQQ0kgcmVnaW9uIChmb3IgcmVsZWFzZV9yZWdpb24pICovCisJc3BpbmxvY2tfdCBsb2NrOwkJCQkJLyogU2VyaWFsaXNlIGFjY2VzcyB0byBkZXZpY2UgJiBpdHMgdm9ydGV4X3ByaXZhdGUgKi8KKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpOwkJCQkvKiBNSUkgbGliIGhvb2tzL2luZm8gKi8KK307CisKKyNpZmRlZiBDT05GSUdfUENJCisjZGVmaW5lIERFVklDRV9QQ0koZGV2KSAoKChkZXYpLT5idXMgPT0gJnBjaV9idXNfdHlwZSkgPyB0b19wY2lfZGV2KChkZXYpKSA6IE5VTEwpCisjZWxzZQorI2RlZmluZSBERVZJQ0VfUENJKGRldikgTlVMTAorI2VuZGlmCisKKyNkZWZpbmUgVk9SVEVYX1BDSSh2cCkgKCgodnApLT5nZW5kZXYpID8gREVWSUNFX1BDSSgodnApLT5nZW5kZXYpIDogTlVMTCkKKworI2lmZGVmIENPTkZJR19FSVNBCisjZGVmaW5lIERFVklDRV9FSVNBKGRldikgKCgoZGV2KS0+YnVzID09ICZlaXNhX2J1c190eXBlKSA/IHRvX2Vpc2FfZGV2aWNlKChkZXYpKSA6IE5VTEwpCisjZWxzZQorI2RlZmluZSBERVZJQ0VfRUlTQShkZXYpIE5VTEwKKyNlbmRpZgorCisjZGVmaW5lIFZPUlRFWF9FSVNBKHZwKSAoKCh2cCktPmdlbmRldikgPyBERVZJQ0VfRUlTQSgodnApLT5nZW5kZXYpIDogTlVMTCkKKworLyogVGhlIGFjdGlvbiB0byB0YWtlIHdpdGggYSBtZWRpYSBzZWxlY3Rpb24gdGltZXIgdGljay4KKyAgIE5vdGUgdGhhdCB3ZSBkZXZpYXRlIGZyb20gdGhlIDNDb20gb3JkZXIgYnkgY2hlY2tpbmcgMTBiYXNlMiBiZWZvcmUgQVVJLgorICovCitlbnVtIHhjdnJfdHlwZXMgeworCVhDVlJfMTBiYXNlVD0wLCBYQ1ZSX0FVSSwgWENWUl8xMGJhc2VUT25seSwgWENWUl8xMGJhc2UyLCBYQ1ZSXzEwMGJhc2VUeCwKKwlYQ1ZSXzEwMGJhc2VGeCwgWENWUl9NSUk9NiwgWENWUl9OV0FZPTgsIFhDVlJfRXh0TUlJPTksIFhDVlJfRGVmYXVsdD0xMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWVkaWFfdGFibGUgeworCWNoYXIgKm5hbWU7CisJdW5zaWduZWQgaW50IG1lZGlhX2JpdHM6MTYsCQkvKiBCaXRzIHRvIHNldCBpbiBXbjRfTWVkaWEgcmVnaXN0ZXIuICovCisJCW1hc2s6OCwJCQkJCQkvKiBUaGUgdHJhbnNjZWl2ZXItcHJlc2VudCBiaXQgaW4gV24zX0NvbmZpZy4qLworCQluZXh0Ojg7CQkJCQkJLyogVGhlIG1lZGlhIHR5cGUgdG8gdHJ5IG5leHQuICovCisJaW50IHdhaXQ7CQkJCQkJLyogVGltZSBiZWZvcmUgd2UgY2hlY2sgbWVkaWEgc3RhdHVzLiAqLworfSBtZWRpYV90YmxbXSA9IHsKKyAgewkiMTBiYXNlVCIsICAgTWVkaWFfMTBUUCwweDA4LCBYQ1ZSXzEwYmFzZTIsICgxNCpIWikvMTB9LAorICB7ICIxME1icyBBVUkiLCBNZWRpYV9TUUUsIDB4MjAsIFhDVlJfRGVmYXVsdCwgKDEqSFopLzEwfSwKKyAgeyAidW5kZWZpbmVkIiwgMCwJCQkweDgwLCBYQ1ZSXzEwYmFzZVQsIDEwMDAwfSwKKyAgeyAiMTBiYXNlMiIsICAgMCwJCQkweDEwLCBYQ1ZSX0FVSSwJCSgxKkhaKS8xMH0sCisgIHsgIjEwMGJhc2VUWCIsIE1lZGlhX0xuaywgMHgwMiwgWENWUl8xMDBiYXNlRngsICgxNCpIWikvMTB9LAorICB7ICIxMDBiYXNlRlgiLCBNZWRpYV9MbmssIDB4MDQsIFhDVlJfTUlJLAkJKDE0KkhaKS8xMH0sCisgIHsgIk1JSSIsCQkgMCwJCQkweDQxLCBYQ1ZSXzEwYmFzZVQsIDMqSFogfSwKKyAgeyAidW5kZWZpbmVkIiwgMCwJCQkweDAxLCBYQ1ZSXzEwYmFzZVQsIDEwMDAwfSwKKyAgeyAiQXV0b25lZ290aWF0ZSIsIDAsCQkweDQxLCBYQ1ZSXzEwYmFzZVQsIDMqSFp9LAorICB7ICJNSUktRXh0ZXJuYWwiLAkgMCwJCTB4NDEsIFhDVlJfMTBiYXNlVCwgMypIWiB9LAorICB7ICJEZWZhdWx0IiwJIDAsCQkJMHhGRiwgWENWUl8xMGJhc2VULCAxMDAwMH0sCit9OworCitzdGF0aWMgc3RydWN0IHsKKwljb25zdCBjaGFyIHN0cltFVEhfR1NUUklOR19MRU5dOworfSBldGh0b29sX3N0YXRzX2tleXNbXSA9IHsKKwl7ICJ0eF9kZWZlcnJlZCIgfSwKKwl7ICJ0eF9tdWx0aXBsZV9jb2xsaXNpb25zIiB9LAorCXsgInJ4X2JhZF9zc2QiIH0sCit9OworCisvKiBudW1iZXIgb2YgRVRIVE9PTF9HU1RBVFMgdTY0J3MgKi8KKyNkZWZpbmUgVk9SVEVYX05VTV9TVEFUUyAgICAgMworCitzdGF0aWMgaW50IHZvcnRleF9wcm9iZTEoc3RydWN0IGRldmljZSAqZ2VuZGV2LCBsb25nIGlvYWRkciwgaW50IGlycSwKKwkJCQkgICBpbnQgY2hpcF9pZHgsIGludCBjYXJkX2lkeCk7CitzdGF0aWMgdm9pZCB2b3J0ZXhfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB2b3J0ZXhfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZmluYWwpOworc3RhdGljIGludCB2b3J0ZXhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG1kaW9fc3luYyhsb25nIGlvYWRkciwgaW50IGJpdHMpOworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKnZwLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSk7CitzdGF0aWMgdm9pZCB2b3J0ZXhfdGltZXIodW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQgcnhfb29tX3RpbWVyKHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgdm9ydGV4X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGJvb21lcmFuZ19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCB2b3J0ZXhfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGJvb21lcmFuZ19yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCB2b3J0ZXhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGlycXJldHVybl90IGJvb21lcmFuZ19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IHZvcnRleF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGR1bXBfdHhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0cyhsb25nIGlvYWRkciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnZvcnRleF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW50IHZvcnRleF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgdm9ydGV4X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBhY3BpX3NldF9XT0woc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHZvcnRleF9ldGh0b29sX29wczsKK3N0YXRpYyB2b2lkIHNldF84MDIxcV9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBlbmFibGUpOworCisMCisvKiBUaGlzIGRyaXZlciB1c2VzICdvcHRpb25zJyB0byBwYXNzIHRoZSBtZWRpYSB0eXBlLCBmdWxsLWR1cGxleCBmbGFnLCBldGMuICovCisvKiBPcHRpb24gY291bnQgbGltaXQgb25seSAtLSB1bmxpbWl0ZWQgaW50ZXJmYWNlcyBhcmUgc3VwcG9ydGVkLiAqLworI2RlZmluZSBNQVhfVU5JVFMgOAorc3RhdGljIGludCBvcHRpb25zW01BWF9VTklUU10gPSB7IC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSx9Oworc3RhdGljIGludCBmdWxsX2R1cGxleFtNQVhfVU5JVFNdID0gey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CitzdGF0aWMgaW50IGh3X2NoZWNrc3Vtc1tNQVhfVU5JVFNdID0gey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CitzdGF0aWMgaW50IGZsb3dfY3RybFtNQVhfVU5JVFNdID0gey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CitzdGF0aWMgaW50IGVuYWJsZV93b2xbTUFYX1VOSVRTXSA9IHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9Oworc3RhdGljIGludCBnbG9iYWxfb3B0aW9ucyA9IC0xOworc3RhdGljIGludCBnbG9iYWxfZnVsbF9kdXBsZXggPSAtMTsKK3N0YXRpYyBpbnQgZ2xvYmFsX2VuYWJsZV93b2wgPSAtMTsKKworLyogI2RlZmluZSBkZXZfYWxsb2Nfc2tiIGRldl9hbGxvY19za2JfZGVidWcgKi8KKworLyogVmFyaWFibGVzIHRvIHdvcmstYXJvdW5kIHRoZSBDb21wYXEgUENJIEJJT1MzMiBwcm9ibGVtLiAqLworc3RhdGljIGludCBjb21wYXFfaW9hZGRyLCBjb21wYXFfaXJxLCBjb21wYXFfZGV2aWNlX2lkID0gMHg1OTAwOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpjb21wYXFfbmV0X2RldmljZTsKKworc3RhdGljIGludCB2b3J0ZXhfY2FyZHNfZm91bmQ7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShnbG9iYWxfb3B0aW9ucywgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShvcHRpb25zLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKGdsb2JhbF9mdWxsX2R1cGxleCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShmdWxsX2R1cGxleCwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShod19jaGVja3N1bXMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZmxvd19jdHJsLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKGdsb2JhbF9lbmFibGVfd29sLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGVuYWJsZV93b2wsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0ocnhfY29weWJyZWFrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjb21wYXFfaW9hZGRyLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGNvbXBhcV9pcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY29tcGFxX2RldmljZV9pZCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh3YXRjaGRvZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICIzYzU5eCBkZWJ1ZyBsZXZlbCAoMC02KSIpOworTU9EVUxFX1BBUk1fREVTQyhvcHRpb25zLCAiM2M1OXg6IEJpdHMgMC0zOiBtZWRpYSB0eXBlLCBiaXQgNDogYnVzIG1hc3RlcmluZywgYml0IDk6IGZ1bGwgZHVwbGV4Iik7CitNT0RVTEVfUEFSTV9ERVNDKGdsb2JhbF9vcHRpb25zLCAiM2M1OXg6IHNhbWUgYXMgb3B0aW9ucywgYnV0IGFwcGxpZXMgdG8gYWxsIE5JQ3MgaWYgb3B0aW9ucyBpcyB1bnNldCIpOworTU9EVUxFX1BBUk1fREVTQyhmdWxsX2R1cGxleCwgIjNjNTl4IGZ1bGwgZHVwbGV4IHNldHRpbmcocykgKDEpIik7CitNT0RVTEVfUEFSTV9ERVNDKGdsb2JhbF9mdWxsX2R1cGxleCwgIjNjNTl4OiBzYW1lIGFzIGZ1bGxfZHVwbGV4LCBidXQgYXBwbGllcyB0byBhbGwgTklDcyBpZiBvcHRpb25zIGlzIHVuc2V0Iik7CitNT0RVTEVfUEFSTV9ERVNDKGh3X2NoZWNrc3VtcywgIjNjNTl4IEhhcmR3YXJlIGNoZWNrc3VtIGNoZWNraW5nIGJ5IGFkYXB0ZXIocykgKDAtMSkiKTsKK01PRFVMRV9QQVJNX0RFU0MoZmxvd19jdHJsLCAiM2M1OXggODAyLjN4IGZsb3cgY29udHJvbCB1c2FnZSAoUEFVU0Ugb25seSkgKDAtMSkiKTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX3dvbCwgIjNjNTl4OiBUdXJuIG9uIFdha2Utb24tTEFOIGZvciBhZGFwdGVyKHMpICgwLTEpIik7CitNT0RVTEVfUEFSTV9ERVNDKGdsb2JhbF9lbmFibGVfd29sLCAiM2M1OXg6IHNhbWUgYXMgZW5hYmxlX3dvbCwgYnV0IGFwcGxpZXMgdG8gYWxsIE5JQ3MgaWYgb3B0aW9ucyBpcyB1bnNldCIpOworTU9EVUxFX1BBUk1fREVTQyhyeF9jb3B5YnJlYWssICIzYzU5eCBjb3B5IGJyZWFrcG9pbnQgZm9yIGNvcHktb25seS10aW55LWZyYW1lcyIpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfaW50ZXJydXB0X3dvcmssICIzYzU5eCBtYXhpbXVtIGV2ZW50cyBoYW5kbGVkIHBlciBpbnRlcnJ1cHQiKTsKK01PRFVMRV9QQVJNX0RFU0MoY29tcGFxX2lvYWRkciwgIjNjNTl4IFBDSSBJL08gYmFzZSBhZGRyZXNzIChDb21wYXEgQklPUyBwcm9ibGVtIHdvcmthcm91bmQpIik7CitNT0RVTEVfUEFSTV9ERVNDKGNvbXBhcV9pcnEsICIzYzU5eCBQQ0kgSVJRIG51bWJlciAoQ29tcGFxIEJJT1MgcHJvYmxlbSB3b3JrYXJvdW5kKSIpOworTU9EVUxFX1BBUk1fREVTQyhjb21wYXFfZGV2aWNlX2lkLCAiM2M1OXggUENJIGRldmljZSBJRCAoQ29tcGFxIEJJT1MgcHJvYmxlbSB3b3JrYXJvdW5kKSIpOworTU9EVUxFX1BBUk1fREVTQyh3YXRjaGRvZywgIjNjNTl4IHRyYW5zbWl0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIik7CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgcG9sbF92b3J0ZXgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJKHZwLT5mdWxsX2J1c19tYXN0ZXJfcnggPyBib29tZXJhbmdfaW50ZXJydXB0OnZvcnRleF9pbnRlcnJ1cHQpKGRldi0+aXJxLGRldixOVUxMKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9IAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIGludCB2b3J0ZXhfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGRldiAmJiBkZXYtPnByaXYpIHsKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQkJdm9ydGV4X2Rvd24oZGV2LCAxKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2b3J0ZXhfcmVzdW1lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGRldiAmJiBkZXYtPnByaXYpIHsKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkJdm9ydGV4X3VwKGRldik7CisJCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworI2lmZGVmIENPTkZJR19FSVNBCitzdGF0aWMgc3RydWN0IGVpc2FfZGV2aWNlX2lkIHZvcnRleF9laXNhX2lkc1tdID0geworCXsgIlRDTTU5MjAiLCBDSF8zQzU5MiB9LAorCXsgIlRDTTU5NzAiLCBDSF8zQzU5NyB9LAorCXsgIiIgfQorfTsKKworc3RhdGljIGludCB2b3J0ZXhfZWlzYV9wcm9iZSAoc3RydWN0IGRldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbnQgdm9ydGV4X2Vpc2FfcmVtb3ZlIChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOworCitzdGF0aWMgc3RydWN0IGVpc2FfZHJpdmVyIHZvcnRleF9laXNhX2RyaXZlciA9IHsKKwkuaWRfdGFibGUgPSB2b3J0ZXhfZWlzYV9pZHMsCisJLmRyaXZlciAgID0geworCQkubmFtZSAgICA9ICIzYzU5eCIsCisJCS5wcm9iZSAgID0gdm9ydGV4X2Vpc2FfcHJvYmUsCisJCS5yZW1vdmUgID0gdm9ydGV4X2Vpc2FfcmVtb3ZlCisJfQorfTsKKworc3RhdGljIGludCB2b3J0ZXhfZWlzYV9wcm9iZSAoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCWxvbmcgaW9hZGRyOworCXN0cnVjdCBlaXNhX2RldmljZSAqZWRldjsKKworCWVkZXYgPSB0b19laXNhX2RldmljZSAoZGV2aWNlKTsKKwlpb2FkZHIgPSBlZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgVk9SVEVYX1RPVEFMX1NJWkUsIERSVl9OQU1FKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICh2b3J0ZXhfcHJvYmUxKGRldmljZSwgaW9hZGRyLCBpbncoaW9hZGRyICsgMHhDODgpID4+IDEyLAorCQkJCQkgIGVkZXYtPmlkLmRyaXZlcl9kYXRhLCB2b3J0ZXhfY2FyZHNfZm91bmQpKSB7CisJCXJlbGVhc2VfcmVnaW9uIChpb2FkZHIsIFZPUlRFWF9UT1RBTF9TSVpFKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJdm9ydGV4X2NhcmRzX2ZvdW5kKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2b3J0ZXhfZWlzYV9yZW1vdmUgKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwOworCWxvbmcgaW9hZGRyOworCisJZWRldiA9IHRvX2Vpc2FfZGV2aWNlIChkZXZpY2UpOworCWRldiA9IGVpc2FfZ2V0X2RydmRhdGEgKGVkZXYpOworCisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKCJ2b3J0ZXhfZWlzYV9yZW1vdmUgY2FsbGVkIGZvciBDb21wYXEgZGV2aWNlIVxuIik7CisJCUJVRygpOworCX0KKworCXZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwkKKwl1bnJlZ2lzdGVyX25ldGRldiAoZGV2KTsKKwlvdXR3IChUb3RhbFJlc2V0fDB4MTQsIGlvYWRkciArIEVMM19DTUQpOworCXJlbGVhc2VfcmVnaW9uIChpb2FkZHIsIFZPUlRFWF9UT1RBTF9TSVpFKTsKKworCWZyZWVfbmV0ZGV2IChkZXYpOworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qIHJldHVybnMgY291bnQgZm91bmQgKD49IDApLCBvciBuZWdhdGl2ZSBvbiBlcnJvciAqLworc3RhdGljIGludCBfX2luaXQgdm9ydGV4X2Vpc2FfaW5pdCAodm9pZCkKK3sKKwlpbnQgZWlzYV9mb3VuZCA9IDA7CisJaW50IG9yaWdfY2FyZHNfZm91bmQgPSB2b3J0ZXhfY2FyZHNfZm91bmQ7CisKKyNpZmRlZiBDT05GSUdfRUlTQQorCWlmIChlaXNhX2RyaXZlcl9yZWdpc3RlciAoJnZvcnRleF9laXNhX2RyaXZlcikgPj0gMCkgeworCQkJLyogQmVjYXVzZSBvZiB0aGUgd2F5IEVJU0EgYnVzIGlzIHByb2JlZCwgd2UgY2Fubm90IGFzc3VtZQorCQkJICogYW55IGRldmljZSBoYXZlIGJlZW4gZm91bmQgd2hlbiB3ZSBleGl0IGZyb20KKwkJCSAqIGVpc2FfZHJpdmVyX3JlZ2lzdGVyICh0aGUgYnVzIHJvb3QgZHJpdmVyIG1heSBub3QgYmUKKwkJCSAqIGluaXRpYWxpemVkIHlldCkuIFNvIHdlIGJsaW5kbHkgYXNzdW1lIHNvbWV0aGluZyB3YXMKKwkJCSAqIGZvdW5kLCBhbmQgbGV0IHRoZSBzeXNmcyBtYWdpYyBoYXBwZW5kLi4uICovCisJCQkKKwkJCWVpc2FfZm91bmQgPSAxOworCX0KKyNlbmRpZgorCQorCS8qIFNwZWNpYWwgY29kZSB0byB3b3JrLWFyb3VuZCB0aGUgQ29tcGFxIFBDSSBCSU9TMzIgcHJvYmxlbS4gKi8KKwlpZiAoY29tcGFxX2lvYWRkcikgeworCQl2b3J0ZXhfcHJvYmUxKE5VTEwsIGNvbXBhcV9pb2FkZHIsIGNvbXBhcV9pcnEsCisJCQkJCSAgY29tcGFxX2RldmljZV9pZCwgdm9ydGV4X2NhcmRzX2ZvdW5kKyspOworCX0KKworCXJldHVybiB2b3J0ZXhfY2FyZHNfZm91bmQgLSBvcmlnX2NhcmRzX2ZvdW5kICsgZWlzYV9mb3VuZDsKK30KKworLyogcmV0dXJucyBjb3VudCAoPj0gMCksIG9yIG5lZ2F0aXZlIG9uIGVycm9yICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2b3J0ZXhfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJaW50IHJjOworCisJLyogd2FrZSB1cCBhbmQgZW5hYmxlIGRldmljZSAqLwkJCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZSAocGRldik7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXQ7CisKKwlyYyA9IHZvcnRleF9wcm9iZTEgKCZwZGV2LT5kZXYsIHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMCksCisJCQkJCQlwZGV2LT5pcnEsIGVudC0+ZHJpdmVyX2RhdGEsIHZvcnRleF9jYXJkc19mb3VuZCk7CisJaWYgKHJjIDwgMCkgeworCQlwY2lfZGlzYWJsZV9kZXZpY2UgKHBkZXYpOworCQlnb3RvIG91dDsKKwl9CisKKwl2b3J0ZXhfY2FyZHNfZm91bmQrKzsKKworb3V0OgorCXJldHVybiByYzsKK30KKworLyoKKyAqIFN0YXJ0IHVwIHRoZSBQQ0kvRUlTQSBkZXZpY2Ugd2hpY2ggaXMgZGVzY3JpYmVkIGJ5ICpnZW5kZXYuCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLgorICoKKyAqIE5PVEU6IHBkZXYgY2FuIGJlIE5VTEwsIGZvciB0aGUgY2FzZSBvZiBhIENvbXBhcSBkZXZpY2UKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgdm9ydGV4X3Byb2JlMShzdHJ1Y3QgZGV2aWNlICpnZW5kZXYsCisJCQkJICAgbG9uZyBpb2FkZHIsIGludCBpcnEsCisJCQkJICAgaW50IGNoaXBfaWR4LCBpbnQgY2FyZF9pZHgpCit7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cDsKKwlpbnQgb3B0aW9uOworCXVuc2lnbmVkIGludCBlZXByb21bMHg0MF0sIGNoZWNrc3VtID0gMDsJCS8qIEVFUFJPTSBjb250ZW50cyAqLworCWludCBpLCBzdGVwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CisJaW50IHJldHZhbCwgcHJpbnRfaW5mbzsKKwlzdHJ1Y3Qgdm9ydGV4X2NoaXBfaW5mbyAqIGNvbnN0IHZjaSA9ICZ2b3J0ZXhfaW5mb190YmxbY2hpcF9pZHhdOworCWNoYXIgKnByaW50X25hbWUgPSAiM2M1OXgiOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVkZXYgPSBOVUxMOworCisJaWYgKCFwcmludGVkX3ZlcnNpb24pIHsKKwkJcHJpbnRrICh2ZXJzaW9uKTsKKwkJcHJpbnRlZF92ZXJzaW9uID0gMTsKKwl9CisKKwlpZiAoZ2VuZGV2KSB7CisJCWlmICgocGRldiA9IERFVklDRV9QQ0koZ2VuZGV2KSkpIHsKKwkJCXByaW50X25hbWUgPSBwY2lfbmFtZShwZGV2KTsKKwkJfQorCisJCWlmICgoZWRldiA9IERFVklDRV9FSVNBKGdlbmRldikpKSB7CisJCQlwcmludF9uYW1lID0gZWRldi0+ZGV2LmJ1c19pZDsKKwkJfQorCX0KKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqdnApKTsKKwlyZXR2YWwgPSAtRU5PTUVNOworCWlmICghZGV2KSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gYWxsb2NhdGUgZXRoZXJkZXYsIGFib3J0aW5nXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsIGdlbmRldik7CisJdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJb3B0aW9uID0gZ2xvYmFsX29wdGlvbnM7CisKKwkvKiBUaGUgbG93ZXIgZm91ciBiaXRzIGFyZSB0aGUgbWVkaWEgdHlwZS4gKi8KKwlpZiAoZGV2LT5tZW1fc3RhcnQpIHsKKwkJLyoKKwkJICogVGhlICdvcHRpb25zJyBwYXJhbSBpcyBwYXNzZWQgaW4gYXMgdGhlIHRoaXJkIGFyZyB0byB0aGUKKwkJICogTElMTyAnZXRoZXI9JyBhcmd1bWVudCBmb3Igbm9uLW1vZHVsYXIgdXNlCisJCSAqLworCQlvcHRpb24gPSBkZXYtPm1lbV9zdGFydDsKKwl9CisJZWxzZSBpZiAoY2FyZF9pZHggPCBNQVhfVU5JVFMpIHsKKwkJaWYgKG9wdGlvbnNbY2FyZF9pZHhdID49IDApCisJCQlvcHRpb24gPSBvcHRpb25zW2NhcmRfaWR4XTsKKwl9CisKKwlpZiAob3B0aW9uID4gMCkgeworCQlpZiAob3B0aW9uICYgMHg4MDAwKQorCQkJdm9ydGV4X2RlYnVnID0gNzsKKwkJaWYgKG9wdGlvbiAmIDB4NDAwMCkKKwkJCXZvcnRleF9kZWJ1ZyA9IDI7CisJCWlmIChvcHRpb24gJiAweDA0MDApCisJCQl2cC0+ZW5hYmxlX3dvbCA9IDE7CisJfQorCisJcHJpbnRfaW5mbyA9ICh2b3J0ZXhfZGVidWcgPiAxKTsKKwlpZiAocHJpbnRfaW5mbykKKwkJcHJpbnRrIChLRVJOX0lORk8gIlNlZSBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvdm9ydGV4LnR4dFxuIik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogM0NvbSAlcyAlcyBhdCAweCVseC4gVmVycyAiIERSVl9WRVJTSU9OICJcbiIsCisJICAgICAgIHByaW50X25hbWUsCisJICAgICAgIHBkZXYgPyAiUENJIiA6ICJFSVNBIiwKKwkgICAgICAgdmNpLT5uYW1lLAorCSAgICAgICBpb2FkZHIpOworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJZGV2LT5pcnEgPSBpcnE7CisJZGV2LT5tdHUgPSBtdHU7CisJdnAtPmxhcmdlX2ZyYW1lcyA9IG10dSA+IDE1MDA7CisJdnAtPmRydl9mbGFncyA9IHZjaS0+ZHJ2X2ZsYWdzOworCXZwLT5oYXNfbndheSA9ICh2Y2ktPmRydl9mbGFncyAmIEhBU19OV0FZKSA/IDEgOiAwOworCXZwLT5pb19zaXplID0gdmNpLT5pb19zaXplOworCXZwLT5jYXJkX2lkeCA9IGNhcmRfaWR4OworCisJLyogbW9kdWxlIGxpc3Qgb25seSBmb3IgQ29tcGFxIGRldmljZSAqLworCWlmIChnZW5kZXYgPT0gTlVMTCkgeworCQljb21wYXFfbmV0X2RldmljZSA9IGRldjsKKwl9CisKKwkvKiBQQ0ktb25seSBzdGFydHVwIGxvZ2ljICovCisJaWYgKHBkZXYpIHsKKwkJLyogRUlTQSByZXNvdXJjZXMgYWxyZWFkeSBtYXJrZWQsIHNvIG9ubHkgUENJIG5lZWRzIHRvIGRvIHRoaXMgaGVyZSAqLworCQkvKiBJZ25vcmUgcmV0dXJuIHZhbHVlLCBiZWNhdXNlIENhcmRidXMgZHJpdmVycyBhbHJlYWR5IGFsbG9jYXRlIGZvciB1cyAqLworCQlpZiAocmVxdWVzdF9yZWdpb24oaW9hZGRyLCB2Y2ktPmlvX3NpemUsIHByaW50X25hbWUpICE9IE5VTEwpCisJCQl2cC0+bXVzdF9mcmVlX3JlZ2lvbiA9IDE7CisKKwkJLyogZW5hYmxlIGJ1cy1tYXN0ZXJpbmcgaWYgbmVjZXNzYXJ5ICovCQkKKwkJaWYgKHZjaS0+ZmxhZ3MgJiBQQ0lfVVNFU19NQVNURVIpCisJCQlwY2lfc2V0X21hc3RlciAocGRldik7CisKKwkJaWYgKHZjaS0+ZHJ2X2ZsYWdzICYgSVNfVk9SVEVYKSB7CisJCQl1OCBwY2lfbGF0ZW5jeTsKKwkJCXU4IG5ld19sYXRlbmN5ID0gMjQ4OworCisJCQkvKiBDaGVjayB0aGUgUENJIGxhdGVuY3kgdmFsdWUuICBPbiB0aGUgM2M1OTAgc2VyaWVzIHRoZSBsYXRlbmN5IHRpbWVyCisJCQkgICBtdXN0IGJlIHNldCB0byB0aGUgbWF4aW11bSB2YWx1ZSB0byBhdm9pZCBkYXRhIGNvcnJ1cHRpb24gdGhhdCBvY2N1cnMKKwkJCSAgIHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMgZHVyaW5nIGEgdHJhbnNmZXIuICBUaGlzIGJ1ZyBleGlzdHMgdGhlIFZvcnRleAorCQkJICAgY2hpcCBvbmx5LiAqLworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsICZwY2lfbGF0ZW5jeSk7CisJCQlpZiAocGNpX2xhdGVuY3kgPCBuZXdfbGF0ZW5jeSkgeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBPdmVycmlkaW5nIFBDSSBsYXRlbmN5IgorCQkJCQkiIHRpbWVyIChDRkxUKSBzZXR0aW5nIG9mICVkLCBuZXcgdmFsdWUgaXMgJWQuXG4iLAorCQkJCQlwcmludF9uYW1lLCBwY2lfbGF0ZW5jeSwgbmV3X2xhdGVuY3kpOworCQkJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIG5ld19sYXRlbmN5KTsKKwkJCX0KKwkJfQorCX0KKworCXNwaW5fbG9ja19pbml0KCZ2cC0+bG9jayk7CisJdnAtPmdlbmRldiA9IGdlbmRldjsKKwl2cC0+bWlpLmRldiA9IGRldjsKKwl2cC0+bWlpLm1kaW9fcmVhZCA9IG1kaW9fcmVhZDsKKwl2cC0+bWlpLm1kaW9fd3JpdGUgPSBtZGlvX3dyaXRlOworCXZwLT5taWkucGh5X2lkX21hc2sgPSAweDFmOworCXZwLT5taWkucmVnX251bV9tYXNrID0gMHgxZjsKKworCS8qIE1ha2VzIHN1cmUgcmluZ3MgYXJlIGF0IGxlYXN0IDE2IGJ5dGUgYWxpZ25lZC4gKi8KKwl2cC0+cnhfcmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHNpemVvZihzdHJ1Y3QgYm9vbV9yeF9kZXNjKSAqIFJYX1JJTkdfU0laRQorCQkJCQkgICArIHNpemVvZihzdHJ1Y3QgYm9vbV90eF9kZXNjKSAqIFRYX1JJTkdfU0laRSwKKwkJCQkJICAgJnZwLT5yeF9yaW5nX2RtYSk7CisJcmV0dmFsID0gLUVOT01FTTsKKwlpZiAodnAtPnJ4X3JpbmcgPT0gMCkKKwkJZ290byBmcmVlX3JlZ2lvbjsKKworCXZwLT50eF9yaW5nID0gKHN0cnVjdCBib29tX3R4X2Rlc2MgKikodnAtPnJ4X3JpbmcgKyBSWF9SSU5HX1NJWkUpOworCXZwLT50eF9yaW5nX2RtYSA9IHZwLT5yeF9yaW5nX2RtYSArIHNpemVvZihzdHJ1Y3QgYm9vbV9yeF9kZXNjKSAqIFJYX1JJTkdfU0laRTsKKworCS8qIGlmIHdlIGFyZSBhIFBDSSBkcml2ZXIsIHdlIHN0b3JlIGluZm8gaW4gcGRldi0+ZHJpdmVyX2RhdGEKKwkgKiBpbnN0ZWFkIG9mIGEgbW9kdWxlIGxpc3QgKi8JCisJaWYgKHBkZXYpCisJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCWlmIChlZGV2KQorCQllaXNhX3NldF9kcnZkYXRhIChlZGV2LCBkZXYpOworCisJdnAtPm1lZGlhX292ZXJyaWRlID0gNzsKKwlpZiAob3B0aW9uID49IDApIHsKKwkJdnAtPm1lZGlhX292ZXJyaWRlID0gKChvcHRpb24gJiA3KSA9PSAyKSAgPyAgMCAgOiAgb3B0aW9uICYgMTU7CisJCWlmICh2cC0+bWVkaWFfb3ZlcnJpZGUgIT0gNykKKwkJCXZwLT5tZWRpYWxvY2sgPSAxOworCQl2cC0+ZnVsbF9kdXBsZXggPSAob3B0aW9uICYgMHgyMDApID8gMSA6IDA7CisJCXZwLT5idXNfbWFzdGVyID0gKG9wdGlvbiAmIDE2KSA/IDEgOiAwOworCX0KKworCWlmIChnbG9iYWxfZnVsbF9kdXBsZXggPiAwKQorCQl2cC0+ZnVsbF9kdXBsZXggPSAxOworCWlmIChnbG9iYWxfZW5hYmxlX3dvbCA+IDApCisJCXZwLT5lbmFibGVfd29sID0gMTsKKworCWlmIChjYXJkX2lkeCA8IE1BWF9VTklUUykgeworCQlpZiAoZnVsbF9kdXBsZXhbY2FyZF9pZHhdID4gMCkKKwkJCXZwLT5mdWxsX2R1cGxleCA9IDE7CisJCWlmIChmbG93X2N0cmxbY2FyZF9pZHhdID4gMCkKKwkJCXZwLT5mbG93X2N0cmwgPSAxOworCQlpZiAoZW5hYmxlX3dvbFtjYXJkX2lkeF0gPiAwKQorCQkJdnAtPmVuYWJsZV93b2wgPSAxOworCX0KKworCXZwLT5mb3JjZV9mZCA9IHZwLT5mdWxsX2R1cGxleDsKKwl2cC0+b3B0aW9ucyA9IG9wdGlvbjsKKwkvKiBSZWFkIHRoZSBzdGF0aW9uIGFkZHJlc3MgZnJvbSB0aGUgRUVQUk9NLiAqLworCUVMM1dJTkRPVygwKTsKKwl7CisJCWludCBiYXNlOworCisJCWlmICh2Y2ktPmRydl9mbGFncyAmIEVFUFJPTV84QklUKQorCQkJYmFzZSA9IDB4MjMwOworCQllbHNlIGlmICh2Y2ktPmRydl9mbGFncyAmIEVFUFJPTV9PRkZTRVQpCisJCQliYXNlID0gRUVQUk9NX1JlYWQgKyAweDMwOworCQllbHNlCisJCQliYXNlID0gRUVQUk9NX1JlYWQ7CisKKwkJZm9yIChpID0gMDsgaSA8IDB4NDA7IGkrKykgeworCQkJaW50IHRpbWVyOworCQkJb3V0dyhiYXNlICsgaSwgaW9hZGRyICsgV24wRWVwcm9tQ21kKTsKKwkJCS8qIFBhdXNlIGZvciBhdCBsZWFzdCAxNjIgdXMuIGZvciB0aGUgcmVhZCB0byB0YWtlIHBsYWNlLiAqLworCQkJZm9yICh0aW1lciA9IDEwOyB0aW1lciA+PSAwOyB0aW1lci0tKSB7CisJCQkJdWRlbGF5KDE2Mik7CisJCQkJaWYgKChpbncoaW9hZGRyICsgV24wRWVwcm9tQ21kKSAmIDB4ODAwMCkgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQllZXByb21baV0gPSBpbncoaW9hZGRyICsgV24wRWVwcm9tRGF0YSk7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IDB4MTg7IGkrKykKKwkJY2hlY2tzdW0gXj0gZWVwcm9tW2ldOworCWNoZWNrc3VtID0gKGNoZWNrc3VtIF4gKGNoZWNrc3VtID4+IDgpKSAmIDB4ZmY7CisJaWYgKGNoZWNrc3VtICE9IDB4MDApIHsJCS8qIEdycnIsIG5lZWRsZXNzIGluY29tcGF0aWJsZSBjaGFuZ2UgM0NvbS4gKi8KKwkJd2hpbGUgKGkgPCAweDIxKQorCQkJY2hlY2tzdW0gXj0gZWVwcm9tW2krK107CisJCWNoZWNrc3VtID0gKGNoZWNrc3VtIF4gKGNoZWNrc3VtID4+IDgpKSAmIDB4ZmY7CisJfQorCWlmICgoY2hlY2tzdW0gIT0gMHgwMCkgJiYgISh2Y2ktPmRydl9mbGFncyAmIElTX1RPUk5BRE8pKQorCQlwcmludGsoIiAqKipJTlZBTElEIENIRUNLU1VNICU0LjR4KioqICIsIGNoZWNrc3VtKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkoKHUxNiAqKWRldi0+ZGV2X2FkZHIpW2ldID0gaHRvbnMoZWVwcm9tW2kgKyAxMF0pOworCWlmIChwcmludF9pbmZvKSB7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlwcmludGsoIiVjJTIuMngiLCBpID8gJzonIDogJyAnLCBkZXYtPmRldl9hZGRyW2ldKTsKKwl9CisJLyogVW5mb3J0dW5hdGVseSBhbiBhbGwgemVybyBlZXByb20gcGFzc2VzIHRoZSBjaGVja3N1bSBhbmQgdGhpcworCSAgIGdldHMgZm91bmQgaW4gdGhlIHdpbGQgaW4gZmFpbHVyZSBjYXNlcy4gQ3J5cHRvIGlzIGhhcmQgOCkgKi8KKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcikpIHsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJcHJpbnRrKEtFUk5fRVJSICIqKiogRUVQUk9NIE1BQyBhZGRyZXNzIGlzIGludmFsaWQuXG4iKTsKKwkJZ290byBmcmVlX3Jpbmc7CS8qIFdpdGggZXZlcnkgcGFjayAqLworCX0KKwlFTDNXSU5ET1coMik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJb3V0YihkZXYtPmRldl9hZGRyW2ldLCBpb2FkZHIgKyBpKTsKKworI2lmZGVmIF9fc3BhcmNfXworCWlmIChwcmludF9pbmZvKQorCQlwcmludGsoIiwgSVJRICVzXG4iLCBfX2lycV9pdG9hKGRldi0+aXJxKSk7CisjZWxzZQorCWlmIChwcmludF9pbmZvKQorCQlwcmludGsoIiwgSVJRICVkXG4iLCBkZXYtPmlycSk7CisJLyogVGVsbCB0aGVtIGFib3V0IGFuIGludmFsaWQgSVJRLiAqLworCWlmIChkZXYtPmlycSA8PSAwIHx8IGRldi0+aXJxID49IE5SX0lSUVMpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiAqKiogV2FybmluZzogSVJRICVkIGlzIHVubGlrZWx5IHRvIHdvcmshICoqKlxuIiwKKwkJCSAgIGRldi0+aXJxKTsKKyNlbmRpZgorCisJRUwzV0lORE9XKDQpOworCXN0ZXAgPSAoaW5iKGlvYWRkciArIFduNF9OZXREaWFnKSAmIDB4MWUpID4+IDE7CisJaWYgKHByaW50X2luZm8pIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICBwcm9kdWN0IGNvZGUgJTAyeCUwMnggcmV2ICUwMnguJWQgZGF0ZSAlMDJkLSIKKwkJCSIlMDJkLSUwMmRcbiIsIGVlcHJvbVs2XSYweGZmLCBlZXByb21bNl0+PjgsIGVlcHJvbVsweDE0XSwKKwkJCXN0ZXAsIChlZXByb21bNF0+PjUpICYgMTUsIGVlcHJvbVs0XSAmIDMxLCBlZXByb21bNF0+PjkpOworCX0KKworCisJaWYgKHBkZXYgJiYgdmNpLT5kcnZfZmxhZ3MgJiBIQVNfQ0JfRk5TKSB7CisJCXVuc2lnbmVkIGxvbmcgZm5fc3RfYWRkcjsJCQkvKiBDYXJkYnVzIGZ1bmN0aW9uIHN0YXR1cyBzcGFjZSAqLworCQl1bnNpZ25lZCBzaG9ydCBuOworCisJCWZuX3N0X2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDIpOworCQlpZiAoZm5fc3RfYWRkcikgeworCQkJdnAtPmNiX2ZuX2Jhc2UgPSBpb3JlbWFwKGZuX3N0X2FkZHIsIDEyOCk7CisJCQlyZXR2YWwgPSAtRU5PTUVNOworCQkJaWYgKCF2cC0+Y2JfZm5fYmFzZSkKKwkJCQlnb3RvIGZyZWVfcmluZzsKKwkJfQorCQlpZiAocHJpbnRfaW5mbykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENhcmRCdXMgZnVuY3Rpb25zIG1hcHBlZCAlOC44bHgtPiVwXG4iLAorCQkJCXByaW50X25hbWUsIGZuX3N0X2FkZHIsIHZwLT5jYl9mbl9iYXNlKTsKKwkJfQorCQlFTDNXSU5ET1coMik7CisKKwkJbiA9IGludyhpb2FkZHIgKyBXbjJfUmVzZXRPcHRpb25zKSAmIH4weDQwMTA7CisJCWlmICh2cC0+ZHJ2X2ZsYWdzICYgSU5WRVJUX0xFRF9QV1IpCisJCQluIHw9IDB4MTA7CisJCWlmICh2cC0+ZHJ2X2ZsYWdzICYgSU5WRVJUX01JSV9QV1IpCisJCQluIHw9IDB4NDAwMDsKKwkJb3V0dyhuLCBpb2FkZHIgKyBXbjJfUmVzZXRPcHRpb25zKTsKKwkJaWYgKHZwLT5kcnZfZmxhZ3MgJiBXTk9fWENWUl9QV1IpIHsKKwkJCUVMM1dJTkRPVygwKTsKKwkJCW91dHcoMHgwODAwLCBpb2FkZHIpOworCQl9CisJfQorCisJLyogRXh0cmFjdCBvdXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgRUVQUk9NIGRhdGEuICovCisJdnAtPmluZm8xID0gZWVwcm9tWzEzXTsKKwl2cC0+aW5mbzIgPSBlZXByb21bMTVdOworCXZwLT5jYXBhYmlsaXRpZXMgPSBlZXByb21bMTZdOworCisJaWYgKHZwLT5pbmZvMSAmIDB4ODAwMCkgeworCQl2cC0+ZnVsbF9kdXBsZXggPSAxOworCQlpZiAocHJpbnRfaW5mbykKKwkJCXByaW50ayhLRVJOX0lORk8gIkZ1bGwgZHVwbGV4IGNhcGFibGVcbiIpOworCX0KKworCXsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKiByYW1fc3BsaXRbXSA9IHsiNTozIiwgIjM6MSIsICIxOjEiLCAiMzo1In07CisJCXVuc2lnbmVkIGludCBjb25maWc7CisJCUVMM1dJTkRPVygzKTsKKwkJdnAtPmF2YWlsYWJsZV9tZWRpYSA9IGludyhpb2FkZHIgKyBXbjNfT3B0aW9ucyk7CisJCWlmICgodnAtPmF2YWlsYWJsZV9tZWRpYSAmIDB4ZmYpID09IDApCQkvKiBCcm9rZW4gM2M5MTYgKi8KKwkJCXZwLT5hdmFpbGFibGVfbWVkaWEgPSAweDQwOworCQljb25maWcgPSBpbmwoaW9hZGRyICsgV24zX0NvbmZpZyk7CisJCWlmIChwcmludF9pbmZvKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiICBJbnRlcm5hbCBjb25maWcgcmVnaXN0ZXIgaXMgJTQuNHgsICIKKwkJCQkgICAidHJhbnNjZWl2ZXJzICUjeC5cbiIsIGNvbmZpZywgaW53KGlvYWRkciArIFduM19PcHRpb25zKSk7CisJCQlwcmludGsoS0VSTl9JTkZPICIgICVkSyAlcy13aWRlIFJBTSAlcyBSeDpUeCBzcGxpdCwgJXMlcyBpbnRlcmZhY2UuXG4iLAorCQkJCSAgIDggPDwgUkFNX1NJWkUoY29uZmlnKSwKKwkJCQkgICBSQU1fV0lEVEgoY29uZmlnKSA/ICJ3b3JkIiA6ICJieXRlIiwKKwkJCQkgICByYW1fc3BsaXRbUkFNX1NQTElUKGNvbmZpZyldLAorCQkJCSAgIEFVVE9TRUxFQ1QoY29uZmlnKSA/ICJhdXRvc2VsZWN0LyIgOiAiIiwKKwkJCQkgICBYQ1ZSKGNvbmZpZykgPiBYQ1ZSX0V4dE1JSSA/ICI8aW52YWxpZCB0cmFuc2NlaXZlcj4iIDoKKwkJCQkgICBtZWRpYV90YmxbWENWUihjb25maWcpXS5uYW1lKTsKKwkJfQorCQl2cC0+ZGVmYXVsdF9tZWRpYSA9IFhDVlIoY29uZmlnKTsKKwkJaWYgKHZwLT5kZWZhdWx0X21lZGlhID09IFhDVlJfTldBWSkKKwkJCXZwLT5oYXNfbndheSA9IDE7CisJCXZwLT5hdXRvc2VsZWN0ID0gQVVUT1NFTEVDVChjb25maWcpOworCX0KKworCWlmICh2cC0+bWVkaWFfb3ZlcnJpZGUgIT0gNykgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogIE1lZGlhIG92ZXJyaWRlIHRvIHRyYW5zY2VpdmVyIHR5cGUgJWQgKCVzKS5cbiIsCisJCQkJcHJpbnRfbmFtZSwgdnAtPm1lZGlhX292ZXJyaWRlLAorCQkJCW1lZGlhX3RibFt2cC0+bWVkaWFfb3ZlcnJpZGVdLm5hbWUpOworCQlkZXYtPmlmX3BvcnQgPSB2cC0+bWVkaWFfb3ZlcnJpZGU7CisJfSBlbHNlCisJCWRldi0+aWZfcG9ydCA9IHZwLT5kZWZhdWx0X21lZGlhOworCisJaWYgKCh2cC0+YXZhaWxhYmxlX21lZGlhICYgMHg0MCkgfHwgKHZjaS0+ZHJ2X2ZsYWdzICYgSEFTX05XQVkpIHx8CisJCWRldi0+aWZfcG9ydCA9PSBYQ1ZSX01JSSB8fCBkZXYtPmlmX3BvcnQgPT0gWENWUl9OV0FZKSB7CisJCWludCBwaHksIHBoeV9pZHggPSAwOworCQlFTDNXSU5ET1coNCk7CisJCW1paV9wcmVhbWJsZV9yZXF1aXJlZCsrOworCQlpZiAodnAtPmRydl9mbGFncyAmIEVYVFJBX1BSRUFNQkxFKQorCQkJbWlpX3ByZWFtYmxlX3JlcXVpcmVkKys7CisJCW1kaW9fc3luYyhpb2FkZHIsIDMyKTsKKwkJbWRpb19yZWFkKGRldiwgMjQsIDEpOworCQlmb3IgKHBoeSA9IDA7IHBoeSA8IDMyICYmIHBoeV9pZHggPCAxOyBwaHkrKykgeworCQkJaW50IG1paV9zdGF0dXMsIHBoeXg7CisKKwkJCS8qCisJCQkgKiBGb3IgdGhlIDNjOTA1Q1ggd2UgbG9vayBhdCBpbmRleCAyNCBmaXJzdCwgYmVjYXVzZSBpdCBib2d1c2x5CisJCQkgKiByZXBvcnRzIGFuIGV4dGVybmFsIFBIWSBhdCBhbGwgaW5kaWNlcworCQkJICovCisJCQlpZiAocGh5ID09IDApCisJCQkJcGh5eCA9IDI0OworCQkJZWxzZSBpZiAocGh5IDw9IDI0KQorCQkJCXBoeXggPSBwaHkgLSAxOworCQkJZWxzZQorCQkJCXBoeXggPSBwaHk7CisJCQltaWlfc3RhdHVzID0gbWRpb19yZWFkKGRldiwgcGh5eCwgMSk7CisJCQlpZiAobWlpX3N0YXR1cyAgJiYgIG1paV9zdGF0dXMgIT0gMHhmZmZmKSB7CisJCQkJdnAtPnBoeXNbcGh5X2lkeCsrXSA9IHBoeXg7CisJCQkJaWYgKHByaW50X2luZm8pIHsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiICBNSUkgdHJhbnNjZWl2ZXIgZm91bmQgYXQgYWRkcmVzcyAlZCwiCisJCQkJCQkiIHN0YXR1cyAlNHguXG4iLCBwaHl4LCBtaWlfc3RhdHVzKTsKKwkJCQl9CisJCQkJaWYgKChtaWlfc3RhdHVzICYgMHgwMDQwKSA9PSAwKQorCQkJCQltaWlfcHJlYW1ibGVfcmVxdWlyZWQrKzsKKwkJCX0KKwkJfQorCQltaWlfcHJlYW1ibGVfcmVxdWlyZWQtLTsKKwkJaWYgKHBoeV9pZHggPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyIgICoqKldBUk5JTkcqKiogTm8gTUlJIHRyYW5zY2VpdmVycyBmb3VuZCFcbiIpOworCQkJdnAtPnBoeXNbMF0gPSAyNDsKKwkJfSBlbHNlIHsKKwkJCXZwLT5hZHZlcnRpc2luZyA9IG1kaW9fcmVhZChkZXYsIHZwLT5waHlzWzBdLCA0KTsKKwkJCWlmICh2cC0+ZnVsbF9kdXBsZXgpIHsKKwkJCQkvKiBPbmx5IGFkdmVydGlzZSB0aGUgRkQgbWVkaWEgdHlwZXMuICovCisJCQkJdnAtPmFkdmVydGlzaW5nICY9IH4weDAyQTA7CisJCQkJbWRpb193cml0ZShkZXYsIHZwLT5waHlzWzBdLCA0LCB2cC0+YWR2ZXJ0aXNpbmcpOworCQkJfQorCQl9CisJCXZwLT5taWkucGh5X2lkID0gdnAtPnBoeXNbMF07CisJfQorCisJaWYgKHZwLT5jYXBhYmlsaXRpZXMgJiBDYXBCdXNNYXN0ZXIpIHsKKwkJdnAtPmZ1bGxfYnVzX21hc3Rlcl90eCA9IDE7CisJCWlmIChwcmludF9pbmZvKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIgIEVuYWJsaW5nIGJ1cy1tYXN0ZXIgdHJhbnNtaXRzIGFuZCAlcyByZWNlaXZlcy5cbiIsCisJCQkodnAtPmluZm8yICYgMSkgPyAiZWFybHkiIDogIndob2xlLWZyYW1lIiApOworCQl9CisJCXZwLT5mdWxsX2J1c19tYXN0ZXJfcnggPSAodnAtPmluZm8yICYgMSkgPyAxIDogMjsKKwkJdnAtPmJ1c19tYXN0ZXIgPSAwOwkJLyogQUtQTTogdm9ydGV4IG9ubHkgKi8KKwl9CisKKwkvKiBUaGUgM2M1OXgtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSB2b3J0ZXhfb3BlbjsKKwlpZiAodnAtPmZ1bGxfYnVzX21hc3Rlcl90eCkgeworCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGJvb21lcmFuZ19zdGFydF94bWl0OworCQkvKiBBY3R1YWxseSwgaXQgc3RpbGwgc2hvdWxkIHdvcmsgd2l0aCBpb21tdS4gKi8KKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHOworCQlpZiAoKChod19jaGVja3N1bXNbY2FyZF9pZHhdID09IC0xKSAmJiAodnAtPmRydl9mbGFncyAmIEhBU19IV0NLU00pKSB8fAorCQkJCQkoaHdfY2hlY2tzdW1zW2NhcmRfaWR4XSA9PSAxKSkgeworCQkJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNOworCQl9CisJfSBlbHNlIHsKKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB2b3J0ZXhfc3RhcnRfeG1pdDsKKwl9CisKKwlpZiAocHJpbnRfaW5mbykgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogc2NhdHRlci9nYXRoZXIgJXNhYmxlZC4gaC93IGNoZWNrc3VtcyAlc2FibGVkXG4iLAorCQkJCXByaW50X25hbWUsCisJCQkJKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1NHKSA/ICJlbiI6ImRpcyIsCisJCQkJKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0lQX0NTVU0pID8gImVuIjoiZGlzIik7CisJfQorCisJZGV2LT5zdG9wID0gdm9ydGV4X2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gdm9ydGV4X2dldF9zdGF0czsKKyNpZmRlZiBDT05GSUdfUENJCisJZGV2LT5kb19pb2N0bCA9IHZvcnRleF9pb2N0bDsKKyNlbmRpZgorCWRldi0+ZXRodG9vbF9vcHMgPSAmdm9ydGV4X2V0aHRvb2xfb3BzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gc2V0X3J4X21vZGU7CisJZGV2LT50eF90aW1lb3V0ID0gdm9ydGV4X3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9ICh3YXRjaGRvZyAqIEhaKSAvIDEwMDA7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IHBvbGxfdm9ydGV4OyAKKyNlbmRpZgorCWlmIChwZGV2KSB7CisJCXZwLT5wbV9zdGF0ZV92YWxpZCA9IDE7CisgCQlwY2lfc2F2ZV9zdGF0ZShWT1JURVhfUENJKHZwKSk7CisgCQlhY3BpX3NldF9XT0woZGV2KTsKKwl9CisJcmV0dmFsID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldHZhbCA9PSAwKQorCQlyZXR1cm4gMDsKKworZnJlZV9yaW5nOgorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgYm9vbV9yeF9kZXNjKSAqIFJYX1JJTkdfU0laRQorCQkJCQkJCSsgc2l6ZW9mKHN0cnVjdCBib29tX3R4X2Rlc2MpICogVFhfUklOR19TSVpFLAorCQkJCQkJdnAtPnJ4X3JpbmcsCisJCQkJCQl2cC0+cnhfcmluZ19kbWEpOworZnJlZV9yZWdpb246CisJaWYgKHZwLT5tdXN0X2ZyZWVfcmVnaW9uKQorCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIHZjaS0+aW9fc2l6ZSk7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJ2b3J0ZXhfcHJvYmUxIGZhaWxzLiAgUmV0dXJucyAlZFxuIiwgcmV0dmFsKTsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZAoraXNzdWVfYW5kX3dhaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNtZCkKK3sKKwlpbnQgaTsKKworCW91dHcoY21kLCBkZXYtPmJhc2VfYWRkciArIEVMM19DTUQpOworCWZvciAoaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKKwkJaWYgKCEoaW53KGRldi0+YmFzZV9hZGRyICsgRUwzX1NUQVRVUykgJiBDbWRJblByb2dyZXNzKSkKKwkJCXJldHVybjsKKwl9CisKKwkvKiBPSywgdGhhdCBkaWRuJ3Qgd29yay4gIERvIGl0IHRoZSBzbG93IHdheS4gIE9uZSBzZWNvbmQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDAwOyBpKyspIHsKKwkJaWYgKCEoaW53KGRldi0+YmFzZV9hZGRyICsgRUwzX1NUQVRVUykgJiBDbWRJblByb2dyZXNzKSkgeworCQkJaWYgKHZvcnRleF9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbW1hbmQgMHglMDR4IHRvb2sgJWQgdXNlY3NcbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgY21kLCBpICogMTApOworCQkJcmV0dXJuOworCQl9CisJCXVkZWxheSgxMCk7CisJfQorCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvbW1hbmQgMHglMDR4IGRpZCBub3QgY29tcGxldGUhIFN0YXR1cz0weCV4XG4iLAorCQkJICAgZGV2LT5uYW1lLCBjbWQsIGludyhkZXYtPmJhc2VfYWRkciArIEVMM19TVEFUVVMpKTsKK30KKworc3RhdGljIHZvaWQKK3ZvcnRleF91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IGNvbmZpZzsKKwlpbnQgaTsKKworCWlmIChWT1JURVhfUENJKHZwKSkgeworCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKFZPUlRFWF9QQ0kodnApLCBQQ0lfRDApOwkvKiBHbyBhY3RpdmUgKi8KKwkJcGNpX3Jlc3RvcmVfc3RhdGUoVk9SVEVYX1BDSSh2cCkpOworCQlwY2lfZW5hYmxlX2RldmljZShWT1JURVhfUENJKHZwKSk7CisJfQorCisJLyogQmVmb3JlIGluaXRpYWxpemluZyBzZWxlY3QgdGhlIGFjdGl2ZSBtZWRpYSBwb3J0LiAqLworCUVMM1dJTkRPVygzKTsKKwljb25maWcgPSBpbmwoaW9hZGRyICsgV24zX0NvbmZpZyk7CisKKwlpZiAodnAtPm1lZGlhX292ZXJyaWRlICE9IDcpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1lZGlhIG92ZXJyaWRlIHRvIHRyYW5zY2VpdmVyICVkICglcykuXG4iLAorCQkJICAgZGV2LT5uYW1lLCB2cC0+bWVkaWFfb3ZlcnJpZGUsCisJCQkgICBtZWRpYV90YmxbdnAtPm1lZGlhX292ZXJyaWRlXS5uYW1lKTsKKwkJZGV2LT5pZl9wb3J0ID0gdnAtPm1lZGlhX292ZXJyaWRlOworCX0gZWxzZSBpZiAodnAtPmF1dG9zZWxlY3QpIHsKKwkJaWYgKHZwLT5oYXNfbndheSkgeworCQkJaWYgKHZvcnRleF9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHVzaW5nIE5XQVkgZGV2aWNlIHRhYmxlLCBub3QgJWRcbiIsCisJCQkJCQkJCWRldi0+bmFtZSwgZGV2LT5pZl9wb3J0KTsKKwkJCWRldi0+aWZfcG9ydCA9IFhDVlJfTldBWTsKKwkJfSBlbHNlIHsKKwkJCS8qIEZpbmQgZmlyc3QgYXZhaWxhYmxlIG1lZGlhIHR5cGUsIHN0YXJ0aW5nIHdpdGggMTAwYmFzZVR4LiAqLworCQkJZGV2LT5pZl9wb3J0ID0gWENWUl8xMDBiYXNlVHg7CisJCQl3aGlsZSAoISAodnAtPmF2YWlsYWJsZV9tZWRpYSAmIG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm1hc2spKQorCQkJCWRldi0+aWZfcG9ydCA9IG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm5leHQ7CisJCQlpZiAodm9ydGV4X2RlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogZmlyc3QgYXZhaWxhYmxlIG1lZGlhIHR5cGU6ICVzXG4iLAorCQkJCQlkZXYtPm5hbWUsIG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm5hbWUpOworCQl9CisJfSBlbHNlIHsKKwkJZGV2LT5pZl9wb3J0ID0gdnAtPmRlZmF1bHRfbWVkaWE7CisJCWlmICh2b3J0ZXhfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHVzaW5nIGRlZmF1bHQgbWVkaWEgJXNcbiIsCisJCQkJZGV2LT5uYW1lLCBtZWRpYV90YmxbZGV2LT5pZl9wb3J0XS5uYW1lKTsKKwl9CisKKwlpbml0X3RpbWVyKCZ2cC0+dGltZXIpOworCXZwLT50aW1lci5leHBpcmVzID0gUlVOX0FUKG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLndhaXQpOworCXZwLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCXZwLT50aW1lci5mdW5jdGlvbiA9IHZvcnRleF90aW1lcjsJCS8qIHRpbWVyIGhhbmRsZXIgKi8KKwlhZGRfdGltZXIoJnZwLT50aW1lcik7CisKKwlpbml0X3RpbWVyKCZ2cC0+cnhfb29tX3RpbWVyKTsKKwl2cC0+cnhfb29tX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJdnAtPnJ4X29vbV90aW1lci5mdW5jdGlvbiA9IHJ4X29vbV90aW1lcjsKKworCWlmICh2b3J0ZXhfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEluaXRpYWwgbWVkaWEgdHlwZSAlcy5cbiIsCisJCQkgICBkZXYtPm5hbWUsIG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm5hbWUpOworCisJdnAtPmZ1bGxfZHVwbGV4ID0gdnAtPmZvcmNlX2ZkOworCWNvbmZpZyA9IEJGSU5TKGNvbmZpZywgZGV2LT5pZl9wb3J0LCAyMCwgNCk7CisJaWYgKHZvcnRleF9kZWJ1ZyA+IDYpCisJCXByaW50ayhLRVJOX0RFQlVHICJ2b3J0ZXhfdXAoKTogd3JpdGluZyAweCV4IHRvIEludGVybmFsQ29uZmlnXG4iLCBjb25maWcpOworCW91dGwoY29uZmlnLCBpb2FkZHIgKyBXbjNfQ29uZmlnKTsKKworCWlmIChkZXYtPmlmX3BvcnQgPT0gWENWUl9NSUkgfHwgZGV2LT5pZl9wb3J0ID09IFhDVlJfTldBWSkgeworCQlpbnQgbWlpX3JlZzEsIG1paV9yZWc1OworCQlFTDNXSU5ET1coNCk7CisJCS8qIFJlYWQgQk1TUiAocmVnMSkgb25seSB0byBjbGVhciBvbGQgc3RhdHVzLiAqLworCQltaWlfcmVnMSA9IG1kaW9fcmVhZChkZXYsIHZwLT5waHlzWzBdLCAxKTsKKwkJbWlpX3JlZzUgPSBtZGlvX3JlYWQoZGV2LCB2cC0+cGh5c1swXSwgNSk7CisJCWlmIChtaWlfcmVnNSA9PSAweGZmZmYgIHx8ICBtaWlfcmVnNSA9PSAweDAwMDApIHsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7IC8qIE5vIE1JSSBkZXZpY2Ugb3Igbm8gbGluayBwYXJ0bmVyIHJlcG9ydCAqLworCQl9IGVsc2UgeworCQkJbWlpX3JlZzUgJj0gdnAtPmFkdmVydGlzaW5nOworCQkJaWYgKChtaWlfcmVnNSAmIDB4MDEwMCkgIT0gMAkvKiAxMDBiYXNlVHgtRkQgKi8KKwkJCQkgfHwgKG1paV9yZWc1ICYgMHgwMEMwKSA9PSAweDAwNDApIC8qIDEwVC1GRCwgYnV0IG5vdCAxMDAtSEQgKi8KKwkJCXZwLT5mdWxsX2R1cGxleCA9IDE7CisJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCX0KKwkJdnAtPnBhcnRuZXJfZmxvd19jdHJsID0gKChtaWlfcmVnNSAmIDB4MDQwMCkgIT0gMCk7CisJCWlmICh2b3J0ZXhfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1JSSAjJWQgc3RhdHVzICU0LjR4LCBsaW5rIHBhcnRuZXIgY2FwYWJpbGl0eSAlNC40eCwiCisJCQkJICAgIiBpbmZvMSAlMDR4LCBzZXR0aW5nICVzLWR1cGxleC5cbiIsCisJCQkJCWRldi0+bmFtZSwgdnAtPnBoeXNbMF0sCisJCQkJCW1paV9yZWcxLCBtaWlfcmVnNSwKKwkJCQkJdnAtPmluZm8xLCAoKHZwLT5pbmZvMSAmIDB4ODAwMCkgfHwgdnAtPmZ1bGxfZHVwbGV4KSA/ICJmdWxsIiA6ICJoYWxmIik7CisJCUVMM1dJTkRPVygzKTsKKwl9CisKKwkvKiBTZXQgdGhlIGZ1bGwtZHVwbGV4IGJpdC4gKi8KKwlvdXR3KAkoKHZwLT5pbmZvMSAmIDB4ODAwMCkgfHwgdnAtPmZ1bGxfZHVwbGV4ID8gMHgyMCA6IDApIHwKKwkJIAkodnAtPmxhcmdlX2ZyYW1lcyA/IDB4NDAgOiAwKSB8CisJCQkoKHZwLT5mdWxsX2R1cGxleCAmJiB2cC0+Zmxvd19jdHJsICYmIHZwLT5wYXJ0bmVyX2Zsb3dfY3RybCkgPyAweDEwMCA6IDApLAorCQkJaW9hZGRyICsgV24zX01BQ19DdHJsKTsKKworCWlmICh2b3J0ZXhfZGVidWcgPiAxKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdm9ydGV4X3VwKCkgSW50ZXJuYWxDb25maWcgJTguOHguXG4iLAorCQkJZGV2LT5uYW1lLCBjb25maWcpOworCX0KKworCWlzc3VlX2FuZF93YWl0KGRldiwgVHhSZXNldCk7CisJLyoKKwkgKiBEb24ndCByZXNldCB0aGUgUEhZIC0gdGhhdCB1cHNldHMgYXV0b25lZ290aWF0aW9uIGR1cmluZyBESENQIG9wZXJhdGlvbnMuCisJICovCisJaXNzdWVfYW5kX3dhaXQoZGV2LCBSeFJlc2V0fDB4MDQpOworCisJb3V0dyhTZXRTdGF0dXNFbmIgfCAweDAwLCBpb2FkZHIgKyBFTDNfQ01EKTsKKworCWlmICh2b3J0ZXhfZGVidWcgPiAxKSB7CisJCUVMM1dJTkRPVyg0KTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB2b3J0ZXhfdXAoKSBpcnEgJWQgbWVkaWEgc3RhdHVzICU0LjR4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgZGV2LT5pcnEsIGludyhpb2FkZHIgKyBXbjRfTWVkaWEpKTsKKwl9CisKKwkvKiBTZXQgdGhlIHN0YXRpb24gYWRkcmVzcyBhbmQgbWFzayBpbiB3aW5kb3cgMiBlYWNoIHRpbWUgb3BlbmVkLiAqLworCUVMM1dJTkRPVygyKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlvdXRiKGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIGkpOworCWZvciAoOyBpIDwgMTI7IGkrPTIpCisJCW91dHcoMCwgaW9hZGRyICsgaSk7CisKKwlpZiAodnAtPmNiX2ZuX2Jhc2UpIHsKKwkJdW5zaWduZWQgc2hvcnQgbiA9IGludyhpb2FkZHIgKyBXbjJfUmVzZXRPcHRpb25zKSAmIH4weDQwMTA7CisJCWlmICh2cC0+ZHJ2X2ZsYWdzICYgSU5WRVJUX0xFRF9QV1IpCisJCQluIHw9IDB4MTA7CisJCWlmICh2cC0+ZHJ2X2ZsYWdzICYgSU5WRVJUX01JSV9QV1IpCisJCQluIHw9IDB4NDAwMDsKKwkJb3V0dyhuLCBpb2FkZHIgKyBXbjJfUmVzZXRPcHRpb25zKTsKKwl9CisKKwlpZiAoZGV2LT5pZl9wb3J0ID09IFhDVlJfMTBiYXNlMikKKwkJLyogU3RhcnQgdGhlIHRoaW5uZXQgdHJhbnNjZWl2ZXIuIFdlIHNob3VsZCByZWFsbHkgd2FpdCA1MG1zLi4uKi8KKwkJb3V0dyhTdGFydENvYXgsIGlvYWRkciArIEVMM19DTUQpOworCWlmIChkZXYtPmlmX3BvcnQgIT0gWENWUl9OV0FZKSB7CisJCUVMM1dJTkRPVyg0KTsKKwkJb3V0dygoaW53KGlvYWRkciArIFduNF9NZWRpYSkgJiB+KE1lZGlhXzEwVFB8TWVkaWFfU1FFKSkgfAorCQkJIG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm1lZGlhX2JpdHMsIGlvYWRkciArIFduNF9NZWRpYSk7CisJfQorCisJLyogU3dpdGNoIHRvIHRoZSBzdGF0cyB3aW5kb3csIGFuZCBjbGVhciBhbGwgc3RhdHMgYnkgcmVhZGluZy4gKi8KKwlvdXR3KFN0YXRzRGlzYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJRUwzV0lORE9XKDYpOworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorCQlpbmIoaW9hZGRyICsgaSk7CisJaW53KGlvYWRkciArIDEwKTsKKwlpbncoaW9hZGRyICsgMTIpOworCS8qIE5ldzogT24gdGhlIFZvcnRleCB3ZSBtdXN0IGFsc28gY2xlYXIgdGhlIEJhZFNTRCBjb3VudGVyLiAqLworCUVMM1dJTkRPVyg0KTsKKwlpbmIoaW9hZGRyICsgMTIpOworCS8qIC4uYW5kIG9uIHRoZSBCb29tZXJhbmcgd2UgZW5hYmxlIHRoZSBleHRyYSBzdGF0aXN0aWNzIGJpdHMuICovCisJb3V0dygweDAwNDAsIGlvYWRkciArIFduNF9OZXREaWFnKTsKKworCS8qIFN3aXRjaCB0byByZWdpc3RlciBzZXQgNyBmb3Igbm9ybWFsIHVzZS4gKi8KKwlFTDNXSU5ET1coNyk7CisKKwlpZiAodnAtPmZ1bGxfYnVzX21hc3Rlcl9yeCkgeyAvKiBCb29tZXJhbmcgYnVzIG1hc3Rlci4gKi8KKwkJdnAtPmN1cl9yeCA9IHZwLT5kaXJ0eV9yeCA9IDA7CisJCS8qIEluaXRpYWxpemUgdGhlIFJ4RWFybHkgcmVnaXN0ZXIgYXMgcmVjb21tZW5kZWQuICovCisJCW91dHcoU2V0UnhUaHJlc2hvbGQgKyAoMTUzNj4+MiksIGlvYWRkciArIEVMM19DTUQpOworCQlvdXRsKDB4MDAyMCwgaW9hZGRyICsgUGt0U3RhdHVzKTsKKwkJb3V0bCh2cC0+cnhfcmluZ19kbWEsIGlvYWRkciArIFVwTGlzdFB0cik7CisJfQorCWlmICh2cC0+ZnVsbF9idXNfbWFzdGVyX3R4KSB7IAkJLyogQm9vbWVyYW5nIGJ1cyBtYXN0ZXIgVHguICovCisJCXZwLT5jdXJfdHggPSB2cC0+ZGlydHlfdHggPSAwOworCQlpZiAodnAtPmRydl9mbGFncyAmIElTX0JPT01FUkFORykKKwkJCW91dGIoUEtUX0JVRl9TWj4+OCwgaW9hZGRyICsgVHhGcmVlVGhyZXNob2xkKTsgLyogUm9vbSBmb3IgYSBwYWNrZXQuICovCisJCS8qIENsZWFyIHRoZSBSeCwgVHggcmluZ3MuICovCisJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykJLyogQUtQTTogdGhpcyBpcyBkb25lIGluIHZvcnRleF9vcGVuLCB0b28gKi8KKwkJCXZwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykKKwkJCXZwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQlvdXRsKDAsIGlvYWRkciArIERvd25MaXN0UHRyKTsKKwl9CisJLyogU2V0IHJlY2VpdmVyIG1vZGU6IHByZXN1bWFibHkgYWNjZXB0IGItY2FzZSBhbmQgcGh5cyBhZGRyIG9ubHkuICovCisJc2V0X3J4X21vZGUoZGV2KTsKKwkvKiBlbmFibGUgODAyLjFxIHRhZ2dlZCBmcmFtZXMgKi8KKwlzZXRfODAyMXFfbW9kZShkZXYsIDEpOworCW91dHcoU3RhdHNFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOyAvKiBUdXJuIG9uIHN0YXRpc3RpY3MuICovCisKKy8vCWlzc3VlX2FuZF93YWl0KGRldiwgU2V0VHhTdGFydHwweDA3ZmYpOworCW91dHcoUnhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOyAvKiBFbmFibGUgdGhlIHJlY2VpdmVyLiAqLworCW91dHcoVHhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOyAvKiBFbmFibGUgdHJhbnNtaXR0ZXIuICovCisJLyogQWxsb3cgc3RhdHVzIGJpdHMgdG8gYmUgc2Vlbi4gKi8KKwl2cC0+c3RhdHVzX2VuYWJsZSA9IFNldFN0YXR1c0VuYiB8IEhvc3RFcnJvcnxJbnRSZXF8U3RhdHNGdWxsfFR4Q29tcGxldGV8CisJCSh2cC0+ZnVsbF9idXNfbWFzdGVyX3R4ID8gRG93bkNvbXBsZXRlIDogVHhBdmFpbGFibGUpIHwKKwkJKHZwLT5mdWxsX2J1c19tYXN0ZXJfcnggPyBVcENvbXBsZXRlIDogUnhDb21wbGV0ZSkgfAorCQkodnAtPmJ1c19tYXN0ZXIgPyBETUFEb25lIDogMCk7CisJdnAtPmludHJfZW5hYmxlID0gU2V0SW50ckVuYiB8IEludExhdGNoIHwgVHhBdmFpbGFibGUgfAorCQkodnAtPmZ1bGxfYnVzX21hc3Rlcl9yeCA/IDAgOiBSeENvbXBsZXRlKSB8CisJCVN0YXRzRnVsbCB8IEhvc3RFcnJvciB8IFR4Q29tcGxldGUgfCBJbnRSZXEKKwkJfCAodnAtPmJ1c19tYXN0ZXIgPyBETUFEb25lIDogMCkgfCBVcENvbXBsZXRlIHwgRG93bkNvbXBsZXRlOworCW91dHcodnAtPnN0YXR1c19lbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCS8qIEFjayBhbGwgcGVuZGluZyBldmVudHMsIGFuZCBzZXQgYWN0aXZlIGluZGljYXRvciBtYXNrLiAqLworCW91dHcoQWNrSW50ciB8IEludExhdGNoIHwgVHhBdmFpbGFibGUgfCBSeEVhcmx5IHwgSW50UmVxLAorCQkgaW9hZGRyICsgRUwzX0NNRCk7CisJb3V0dyh2cC0+aW50cl9lbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCWlmICh2cC0+Y2JfZm5fYmFzZSkJCQkvKiBUaGUgUENNQ0lBIHBlb3BsZSBhcmUgaWRpb3RzLiAgKi8KKwkJd3JpdGVsKDB4ODAwMCwgdnAtPmNiX2ZuX2Jhc2UgKyA0KTsKKwluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKK30KKworc3RhdGljIGludAordm9ydGV4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwlpbnQgcmV0dmFsOworCisJLyogVXNlIHRoZSBub3ctc3RhbmRhcmQgc2hhcmVkIElSUSBpbXBsZW1lbnRhdGlvbi4gKi8KKwlpZiAoKHJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCB2cC0+ZnVsbF9idXNfbWFzdGVyX3J4ID8KKwkJCQkmYm9vbWVyYW5nX2ludGVycnVwdCA6ICZ2b3J0ZXhfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgcmVzZXJ2ZSBJUlEgJWRcbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAodnAtPmZ1bGxfYnVzX21hc3Rlcl9yeCkgeyAvKiBCb29tZXJhbmcgYnVzIG1hc3Rlci4gKi8KKwkJaWYgKHZvcnRleF9kZWJ1ZyA+IDIpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICBGaWxsaW5nIGluIHRoZSBSeCByaW5nLlxuIiwgZGV2LT5uYW1lKTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJdnAtPnJ4X3JpbmdbaV0ubmV4dCA9IGNwdV90b19sZTMyKHZwLT5yeF9yaW5nX2RtYSArIHNpemVvZihzdHJ1Y3QgYm9vbV9yeF9kZXNjKSAqIChpKzEpKTsKKwkJCXZwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CS8qIENsZWFyIGNvbXBsZXRlIGJpdC4gKi8KKwkJCXZwLT5yeF9yaW5nW2ldLmxlbmd0aCA9IGNwdV90b19sZTMyKFBLVF9CVUZfU1ogfCBMQVNUX0ZSQUcpOworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihQS1RfQlVGX1NaKTsKKwkJCXZwLT5yeF9za2J1ZmZbaV0gPSBza2I7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJYnJlYWs7CQkJLyogQmFkIG5ld3MhICAqLworCQkJc2tiLT5kZXYgPSBkZXY7CQkJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLworCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCisJCQl2cC0+cnhfcmluZ1tpXS5hZGRyID0gY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoVk9SVEVYX1BDSSh2cCksIHNrYi0+dGFpbCwgUEtUX0JVRl9TWiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCX0KKwkJaWYgKGkgIT0gUlhfUklOR19TSVpFKSB7CisJCQlpbnQgajsKKwkJCXByaW50ayhLRVJOX0VNRVJHICIlczogbm8gbWVtb3J5IGZvciByeCByaW5nXG4iLCBkZXYtPm5hbWUpOworCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykgeworCQkJCWlmICh2cC0+cnhfc2tidWZmW2pdKSB7CisJCQkJCWRldl9rZnJlZV9za2IodnAtPnJ4X3NrYnVmZltqXSk7CisJCQkJCXZwLT5yeF9za2J1ZmZbal0gPSBOVUxMOworCQkJCX0KKwkJCX0KKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9mcmVlX2lycTsKKwkJfQorCQkvKiBXcmFwIHRoZSByaW5nLiAqLworCQl2cC0+cnhfcmluZ1tpLTFdLm5leHQgPSBjcHVfdG9fbGUzMih2cC0+cnhfcmluZ19kbWEpOworCX0KKworCXZvcnRleF91cChkZXYpOworCXJldHVybiAwOworCitvdXRfZnJlZV9pcnE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CitvdXQ6CisJaWYgKHZvcnRleF9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHZvcnRleF9vcGVuKCkgZmFpbHM6IHJldHVybmluZyAlZFxuIiwgZGV2LT5uYW1lLCByZXR2YWwpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkCit2b3J0ZXhfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IG5leHRfdGljayA9IDYwKkhaOworCWludCBvayA9IDA7CisJaW50IG1lZGlhX3N0YXR1cywgbWlpX3N0YXR1cywgb2xkX3dpbmRvdzsKKworCWlmICh2b3J0ZXhfZGVidWcgPiAyKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogTWVkaWEgc2VsZWN0aW9uIHRpbWVyIHRpY2sgaGFwcGVuZWQsICVzLlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmFtZSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJkZXYtPndhdGNoZG9nX3RpbWVvPSVkXG4iLCBkZXYtPndhdGNoZG9nX3RpbWVvKTsKKwl9CisKKwlpZiAodnAtPm1lZGlhbG9jaykKKwkJZ290byBsZWF2ZV9tZWRpYV9hbG9uZTsKKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJb2xkX3dpbmRvdyA9IGludyhpb2FkZHIgKyBFTDNfQ01EKSA+PiAxMzsKKwlFTDNXSU5ET1coNCk7CisJbWVkaWFfc3RhdHVzID0gaW53KGlvYWRkciArIFduNF9NZWRpYSk7CisJc3dpdGNoIChkZXYtPmlmX3BvcnQpIHsKKwljYXNlIFhDVlJfMTBiYXNlVDogIGNhc2UgWENWUl8xMDBiYXNlVHg6ICBjYXNlIFhDVlJfMTAwYmFzZUZ4OgorCQlpZiAobWVkaWFfc3RhdHVzICYgTWVkaWFfTG5rQmVhdCkgeworCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQkJb2sgPSAxOworCQkJaWYgKHZvcnRleF9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNZWRpYSAlcyBoYXMgbGluayBiZWF0LCAleC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmFtZSwgbWVkaWFfc3RhdHVzKTsKKwkJfSBlbHNlIHsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCQlpZiAodm9ydGV4X2RlYnVnID4gMSkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTWVkaWEgJXMgaGFzIG5vIGxpbmsgYmVhdCwgJXguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm5hbWUsIG1lZGlhX3N0YXR1cyk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBYQ1ZSX01JSTogY2FzZSBYQ1ZSX05XQVk6CisJCXsKKwkJCXNwaW5fbG9ja19iaCgmdnAtPmxvY2spOworCQkJbWlpX3N0YXR1cyA9IG1kaW9fcmVhZChkZXYsIHZwLT5waHlzWzBdLCAxKTsKKwkJCW9rID0gMTsKKwkJCWlmICh2b3J0ZXhfZGVidWcgPiAyKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTUlJIHRyYW5zY2VpdmVyIGhhcyBzdGF0dXMgJTQuNHguXG4iLAorCQkJCQlkZXYtPm5hbWUsIG1paV9zdGF0dXMpOworCQkJaWYgKG1paV9zdGF0dXMgJiBCTVNSX0xTVEFUVVMpIHsKKwkJCQlpbnQgbWlpX3JlZzUgPSBtZGlvX3JlYWQoZGV2LCB2cC0+cGh5c1swXSwgNSk7CisJCQkJaWYgKCEgdnAtPmZvcmNlX2ZkICAmJiAgbWlpX3JlZzUgIT0gMHhmZmZmKSB7CisJCQkJCWludCBkdXBsZXg7CisKKwkJCQkJbWlpX3JlZzUgJj0gdnAtPmFkdmVydGlzaW5nOworCQkJCQlkdXBsZXggPSAobWlpX3JlZzUmMHgwMTAwKSB8fCAobWlpX3JlZzUgJiAweDAxQzApID09IDB4MDA0MDsKKwkJCQkJaWYgKHZwLT5mdWxsX2R1cGxleCAhPSBkdXBsZXgpIHsKKwkJCQkJCXZwLT5mdWxsX2R1cGxleCA9IGR1cGxleDsKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTZXR0aW5nICVzLWR1cGxleCBiYXNlZCBvbiBNSUkgIgorCQkJCQkJCSIjJWQgbGluayBwYXJ0bmVyIGNhcGFiaWxpdHkgb2YgJTQuNHguXG4iLAorCQkJCQkJCWRldi0+bmFtZSwgdnAtPmZ1bGxfZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiLAorCQkJCQkJCXZwLT5waHlzWzBdLCBtaWlfcmVnNSk7CisJCQkJCQkvKiBTZXQgdGhlIGZ1bGwtZHVwbGV4IGJpdC4gKi8KKwkJCQkJCUVMM1dJTkRPVygzKTsKKwkJCQkJCW91dHcoCSh2cC0+ZnVsbF9kdXBsZXggPyAweDIwIDogMCkgfAorCQkJCQkJCQkodnAtPmxhcmdlX2ZyYW1lcyA/IDB4NDAgOiAwKSB8CisJCQkJCQkJCSgodnAtPmZ1bGxfZHVwbGV4ICYmIHZwLT5mbG93X2N0cmwgJiYgdnAtPnBhcnRuZXJfZmxvd19jdHJsKSA/IDB4MTAwIDogMCksCisJCQkJCQkJCWlvYWRkciArIFduM19NQUNfQ3RybCk7CisJCQkJCQlpZiAodm9ydGV4X2RlYnVnID4gMSkKKwkJCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiU2V0dGluZyBkdXBsZXggaW4gV24zX01BQ19DdHJsXG4iKTsKKwkJCQkJCS8qIEFLUE06IGJ1Zzogc2hvdWxkIHJlc2V0IFR4IGFuZCBSeCBhZnRlciBzZXR0aW5nIER1cGxleC4gIFBhZ2UgMTgwICovCisJCQkJCX0KKwkJCQl9CisJCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQkJfSBlbHNlIHsKKwkJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQkJfQorCQkJc3Bpbl91bmxvY2tfYmgoJnZwLT5sb2NrKTsKKwkJfQorCQlicmVhazsKKwkgIGRlZmF1bHQ6CQkJCQkvKiBPdGhlciBtZWRpYSB0eXBlcyBoYW5kbGVkIGJ5IFR4IHRpbWVvdXRzLiAqLworCQlpZiAodm9ydGV4X2RlYnVnID4gMSkKKwkJICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1lZGlhICVzIGhhcyBubyBpbmRpY2F0aW9uLCAleC5cbiIsCisJCQkJIGRldi0+bmFtZSwgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmFtZSwgbWVkaWFfc3RhdHVzKTsKKwkJb2sgPSAxOworCX0KKwlpZiAoICEgb2spIHsKKwkJdW5zaWduZWQgaW50IGNvbmZpZzsKKworCQlkbyB7CisJCQlkZXYtPmlmX3BvcnQgPSBtZWRpYV90YmxbZGV2LT5pZl9wb3J0XS5uZXh0OworCQl9IHdoaWxlICggISAodnAtPmF2YWlsYWJsZV9tZWRpYSAmIG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm1hc2spKTsKKwkJaWYgKGRldi0+aWZfcG9ydCA9PSBYQ1ZSX0RlZmF1bHQpIHsgLyogR28gYmFjayB0byBkZWZhdWx0LiAqLworCQkgIGRldi0+aWZfcG9ydCA9IHZwLT5kZWZhdWx0X21lZGlhOworCQkgIGlmICh2b3J0ZXhfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNZWRpYSBzZWxlY3Rpb24gZmFpbGluZywgdXNpbmcgZGVmYXVsdCAiCisJCQkJICAgIiVzIHBvcnQuXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmFtZSk7CisJCX0gZWxzZSB7CisJCQlpZiAodm9ydGV4X2RlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1lZGlhIHNlbGVjdGlvbiBmYWlsZWQsIG5vdyB0cnlpbmcgIgorCQkJCQkgICAiJXMgcG9ydC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubmFtZSk7CisJCQluZXh0X3RpY2sgPSBtZWRpYV90YmxbZGV2LT5pZl9wb3J0XS53YWl0OworCQl9CisJCW91dHcoKG1lZGlhX3N0YXR1cyAmIH4oTWVkaWFfMTBUUHxNZWRpYV9TUUUpKSB8CisJCQkgbWVkaWFfdGJsW2Rldi0+aWZfcG9ydF0ubWVkaWFfYml0cywgaW9hZGRyICsgV240X01lZGlhKTsKKworCQlFTDNXSU5ET1coMyk7CisJCWNvbmZpZyA9IGlubChpb2FkZHIgKyBXbjNfQ29uZmlnKTsKKwkJY29uZmlnID0gQkZJTlMoY29uZmlnLCBkZXYtPmlmX3BvcnQsIDIwLCA0KTsKKwkJb3V0bChjb25maWcsIGlvYWRkciArIFduM19Db25maWcpOworCisJCW91dHcoZGV2LT5pZl9wb3J0ID09IFhDVlJfMTBiYXNlMiA/IFN0YXJ0Q29heCA6IFN0b3BDb2F4LAorCQkJIGlvYWRkciArIEVMM19DTUQpOworCQlpZiAodm9ydGV4X2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICJ3cm90ZSAweCUwOHggdG8gV24zX0NvbmZpZ1xuIiwgY29uZmlnKTsKKwkJLyogQUtQTTogRklYTUU6IFNob3VsZCByZXNldCBSeCAmIFR4IGhlcmUuICBQNjAgb2YgM2M5MHhjLnBkZiAqLworCX0KKwlFTDNXSU5ET1cob2xkX3dpbmRvdyk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7CisKK2xlYXZlX21lZGlhX2Fsb25lOgorCWlmICh2b3J0ZXhfZGVidWcgPiAyKQorCSAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNZWRpYSBzZWxlY3Rpb24gdGltZXIgZmluaXNoZWQsICVzLlxuIiwKKwkJCSBkZXYtPm5hbWUsIG1lZGlhX3RibFtkZXYtPmlmX3BvcnRdLm5hbWUpOworCisJbW9kX3RpbWVyKCZ2cC0+dGltZXIsIFJVTl9BVChuZXh0X3RpY2spKTsKKwlpZiAodnAtPmRlZmVycmVkKQorCQlvdXR3KEZha2VJbnRyLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgdHhfc3RhdHVzICUyLjJ4IHN0YXR1cyAlNC40eC5cbiIsCisJCSAgIGRldi0+bmFtZSwgaW5iKGlvYWRkciArIFR4U3RhdHVzKSwKKwkJICAgaW53KGlvYWRkciArIEVMM19TVEFUVVMpKTsKKwlFTDNXSU5ET1coNCk7CisJcHJpbnRrKEtFUk5fRVJSICIgIGRpYWdub3N0aWNzOiBuZXQgJTA0eCBtZWRpYSAlMDR4IGRtYSAlMDh4IGZpZm8gJTA0eFxuIiwKKwkJCWludyhpb2FkZHIgKyBXbjRfTmV0RGlhZyksCisJCQlpbncoaW9hZGRyICsgV240X01lZGlhKSwKKwkJCWlubChpb2FkZHIgKyBQa3RTdGF0dXMpLAorCQkJaW53KGlvYWRkciArIFduNF9GSUZPRGlhZykpOworCS8qIFNsaWdodCBjb2RlIGJsb2F0IHRvIGJlIHVzZXIgZnJpZW5kbHkuICovCisJaWYgKChpbmIoaW9hZGRyICsgVHhTdGF0dXMpICYgMHg4OCkgPT0gMHg4OCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVHJhbnNtaXR0ZXIgZW5jb3VudGVyZWQgMTYgY29sbGlzaW9ucyAtLSIKKwkJCSAgICIgbmV0d29yayBjYWJsZSBwcm9ibGVtP1xuIiwgZGV2LT5uYW1lKTsKKwlpZiAoaW53KGlvYWRkciArIEVMM19TVEFUVVMpICYgSW50TGF0Y2gpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW50ZXJydXB0IHBvc3RlZCBidXQgbm90IGRlbGl2ZXJlZCAtLSIKKwkJCSAgICIgSVJRIGJsb2NrZWQgYnkgYW5vdGhlciBkZXZpY2U/XG4iLCBkZXYtPm5hbWUpOworCQkvKiBCYWQgaWRlYSBoZXJlLi4gYnV0IHdlIG1pZ2h0IGFzIHdlbGwgaGFuZGxlIGEgZmV3IGV2ZW50cy4gKi8KKwkJeworCQkJLyoKKwkJCSAqIEJsb2NrIGludGVycnVwdHMgYmVjYXVzZSB2b3J0ZXhfaW50ZXJydXB0IGRvZXMgYSBiYXJlIHNwaW5fbG9jaygpCisJCQkgKi8KKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQlpZiAodnAtPmZ1bGxfYnVzX21hc3Rlcl90eCkKKwkJCQlib29tZXJhbmdfaW50ZXJydXB0KGRldi0+aXJxLCBkZXYsIE5VTEwpOworCQkJZWxzZQorCQkJCXZvcnRleF9pbnRlcnJ1cHQoZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCX0KKwl9CisKKwlpZiAodm9ydGV4X2RlYnVnID4gMCkKKwkJZHVtcF90eF9yaW5nKGRldik7CisKKwlpc3N1ZV9hbmRfd2FpdChkZXYsIFR4UmVzZXQpOworCisJdnAtPnN0YXRzLnR4X2Vycm9ycysrOworCWlmICh2cC0+ZnVsbF9idXNfbWFzdGVyX3R4KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUmVzZXR0aW5nIHRoZSBUeCByaW5nIHBvaW50ZXIuXG4iLCBkZXYtPm5hbWUpOworCQlpZiAodnAtPmN1cl90eCAtIHZwLT5kaXJ0eV90eCA+IDAgICYmICBpbmwoaW9hZGRyICsgRG93bkxpc3RQdHIpID09IDApCisJCQlvdXRsKHZwLT50eF9yaW5nX2RtYSArICh2cC0+ZGlydHlfdHggJSBUWF9SSU5HX1NJWkUpICogc2l6ZW9mKHN0cnVjdCBib29tX3R4X2Rlc2MpLAorCQkJCSBpb2FkZHIgKyBEb3duTGlzdFB0cik7CisJCWlmICh2cC0+Y3VyX3R4IC0gdnAtPmRpcnR5X3R4IDwgVFhfUklOR19TSVpFKQorCQkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwkJaWYgKHZwLT5kcnZfZmxhZ3MgJiBJU19CT09NRVJBTkcpCisJCQlvdXRiKFBLVF9CVUZfU1o+PjgsIGlvYWRkciArIFR4RnJlZVRocmVzaG9sZCk7CisJCW91dHcoRG93blVuc3RhbGwsIGlvYWRkciArIEVMM19DTUQpOworCX0gZWxzZSB7CisJCXZwLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisJCisJLyogSXNzdWUgVHggRW5hYmxlICovCisJb3V0dyhUeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCisJLyogU3dpdGNoIHRvIHJlZ2lzdGVyIHNldCA3IGZvciBub3JtYWwgdXNlLiAqLworCUVMM1dJTkRPVyg3KTsKK30KKworLyoKKyAqIEhhbmRsZSB1bmNvbW1vbiBpbnRlcnJ1cHQgc291cmNlcy4gIFRoaXMgaXMgYSBzZXBhcmF0ZSByb3V0aW5lIHRvIG1pbmltaXplCisgKiB0aGUgY2FjaGUgaW1wYWN0LgorICovCitzdGF0aWMgdm9pZAordm9ydGV4X2Vycm9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdGF0dXMpCit7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgZG9fdHhfcmVzZXQgPSAwLCByZXNldF9tYXNrID0gMDsKKwl1bnNpZ25lZCBjaGFyIHR4X3N0YXR1cyA9IDA7CisKKwlpZiAodm9ydGV4X2RlYnVnID4gMikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB2b3J0ZXhfZXJyb3IoKSwgc3RhdHVzPTB4JXhcbiIsIGRldi0+bmFtZSwgc3RhdHVzKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgVHhDb21wbGV0ZSkgewkJCS8qIFJlYWxseSAiVHhFcnJvciIgZm9yIHVzLiAqLworCQl0eF9zdGF0dXMgPSBpbmIoaW9hZGRyICsgVHhTdGF0dXMpOworCQkvKiBQcmVzdW1hYmx5IGEgdHgtdGltZW91dC4gV2UgbXVzdCBtZXJlbHkgcmUtZW5hYmxlLiAqLworCQlpZiAodm9ydGV4X2RlYnVnID4gMgorCQkJfHwgKHR4X3N0YXR1cyAhPSAweDg4ICYmIHZvcnRleF9kZWJ1ZyA+IDApKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUcmFuc21pdCBlcnJvciwgVHggc3RhdHVzIHJlZ2lzdGVyICUyLjJ4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIHR4X3N0YXR1cyk7CisJCQlpZiAodHhfc3RhdHVzID09IDB4ODIpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIlByb2JhYmx5IGEgZHVwbGV4IG1pc21hdGNoLiAgU2VlICIKKwkJCQkJCSJEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvdm9ydGV4LnR4dFxuIik7CisJCQl9CisJCQlkdW1wX3R4X3JpbmcoZGV2KTsKKwkJfQorCQlpZiAodHhfc3RhdHVzICYgMHgxNCkgIHZwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQlpZiAodHhfc3RhdHVzICYgMHgzOCkgIHZwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQlvdXRiKDAsIGlvYWRkciArIFR4U3RhdHVzKTsKKwkJaWYgKHR4X3N0YXR1cyAmIDB4MzApIHsJCQkvKiB0eEphYmJlciBvciB0eFVuZGVycnVuICovCisJCQlkb190eF9yZXNldCA9IDE7CisJCX0gZWxzZSBpZiAoKHR4X3N0YXR1cyAmIDB4MDgpICYmICh2cC0+ZHJ2X2ZsYWdzICYgTUFYX0NPTExJU0lPTl9SRVNFVCkpIHsJLyogbWF4Q29sbGlzaW9ucyAqLworCQkJZG9fdHhfcmVzZXQgPSAxOworCQkJcmVzZXRfbWFzayA9IDB4MDEwODsJCS8qIFJlc2V0IGludGVyZmFjZSBsb2dpYywgYnV0IG5vdCBkb3dubG9hZCBsb2dpYyAqLworCQl9IGVsc2UgewkJCQkJCS8qIE1lcmVseSByZS1lbmFibGUgdGhlIHRyYW5zbWl0dGVyLiAqLworCQkJb3V0dyhUeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCX0KKwl9CisKKwlpZiAoc3RhdHVzICYgUnhFYXJseSkgewkJCQkvKiBSeCBlYXJseSBpcyB1bnVzZWQuICovCisJCXZvcnRleF9yeChkZXYpOworCQlvdXR3KEFja0ludHIgfCBSeEVhcmx5LCBpb2FkZHIgKyBFTDNfQ01EKTsKKwl9CisJaWYgKHN0YXR1cyAmIFN0YXRzRnVsbCkgewkJCS8qIEVtcHR5IHN0YXRpc3RpY3MuICovCisJCXN0YXRpYyBpbnQgRG9uZURpZFRoYXQ7CisJCWlmICh2b3J0ZXhfZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBVcGRhdGluZyBzdGF0cy5cbiIsIGRldi0+bmFtZSk7CisJCXVwZGF0ZV9zdGF0cyhpb2FkZHIsIGRldik7CisJCS8qIEhBQ0s6IERpc2FibGUgc3RhdGlzdGljcyBhcyBhbiBpbnRlcnJ1cHQgc291cmNlLiAqLworCQkvKiBUaGlzIG9jY3VycyB3aGVuIHdlIGhhdmUgdGhlIHdyb25nIG1lZGlhIHR5cGUhICovCisJCWlmIChEb25lRGlkVGhhdCA9PSAwICAmJgorCQkJaW53KGlvYWRkciArIEVMM19TVEFUVVMpICYgU3RhdHNGdWxsKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVXBkYXRpbmcgc3RhdGlzdGljcyBmYWlsZWQsIGRpc2FibGluZyAiCisJCQkJICAgInN0YXRzIGFzIGFuIGludGVycnVwdCBzb3VyY2UuXG4iLCBkZXYtPm5hbWUpOworCQkJRUwzV0lORE9XKDUpOworCQkJb3V0dyhTZXRJbnRyRW5iIHwgKGludyhpb2FkZHIgKyAxMCkgJiB+U3RhdHNGdWxsKSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQl2cC0+aW50cl9lbmFibGUgJj0gflN0YXRzRnVsbDsKKwkJCUVMM1dJTkRPVyg3KTsKKwkJCURvbmVEaWRUaGF0Kys7CisJCX0KKwl9CisJaWYgKHN0YXR1cyAmIEludFJlcSkgewkJLyogUmVzdG9yZSBhbGwgaW50ZXJydXB0IHNvdXJjZXMuICAqLworCQlvdXR3KHZwLT5zdGF0dXNfZW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJb3V0dyh2cC0+aW50cl9lbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCX0KKwlpZiAoc3RhdHVzICYgSG9zdEVycm9yKSB7CisJCXUxNiBmaWZvX2RpYWc7CisJCUVMM1dJTkRPVyg0KTsKKwkJZmlmb19kaWFnID0gaW53KGlvYWRkciArIFduNF9GSUZPRGlhZyk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEhvc3QgZXJyb3IsIEZJRk8gZGlhZ25vc3RpYyByZWdpc3RlciAlNC40eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGZpZm9fZGlhZyk7CisJCS8qIEFkYXB0ZXIgZmFpbHVyZSByZXF1aXJlcyBUeC9SeCByZXNldCBhbmQgcmVpbml0LiAqLworCQlpZiAodnAtPmZ1bGxfYnVzX21hc3Rlcl90eCkgeworCQkJaW50IGJ1c19zdGF0dXMgPSBpbmwoaW9hZGRyICsgUGt0U3RhdHVzKTsKKwkJCS8qIDB4ODAwMDAwMDAgUENJIG1hc3RlciBhYm9ydC4gKi8KKwkJCS8qIDB4NDAwMDAwMDAgUENJIHRhcmdldCBhYm9ydC4gKi8KKwkJCWlmICh2b3J0ZXhfZGVidWcpCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUENJIGJ1cyBlcnJvciwgYnVzIHN0YXR1cyAlOC44eFxuIiwgZGV2LT5uYW1lLCBidXNfc3RhdHVzKTsKKworCQkJLyogSW4gdGhpcyBjYXNlLCBibG93IHRoZSBjYXJkIGF3YXkgKi8KKwkJCS8qIE11c3Qgbm90IGVudGVyIEQzIG9yIHdlIGNhbid0IGxlZ2FsbHkgaXNzdWUgdGhlIHJlc2V0ISAqLworCQkJdm9ydGV4X2Rvd24oZGV2LCAwKTsKKwkJCWlzc3VlX2FuZF93YWl0KGRldiwgVG90YWxSZXNldCB8IDB4ZmYpOworCQkJdm9ydGV4X3VwKGRldik7CQkvKiBBS1BNOiBidWcuICB2b3J0ZXhfdXAoKSBhc3N1bWVzIHRoYXQgdGhlIHJ4IHJpbmcgaXMgZnVsbC4gSXQgbWF5IG5vdCBiZS4gKi8KKwkJfSBlbHNlIGlmIChmaWZvX2RpYWcgJiAweDA0MDApCisJCQlkb190eF9yZXNldCA9IDE7CisJCWlmIChmaWZvX2RpYWcgJiAweDMwMDApIHsKKwkJCS8qIFJlc2V0IFJ4IGZpZm8gYW5kIHVwbG9hZCBsb2dpYyAqLworCQkJaXNzdWVfYW5kX3dhaXQoZGV2LCBSeFJlc2V0fDB4MDcpOworCQkJLyogU2V0IHRoZSBSeCBmaWx0ZXIgdG8gdGhlIGN1cnJlbnQgc3RhdGUuICovCisJCQlzZXRfcnhfbW9kZShkZXYpOworCQkJLyogZW5hYmxlIDgwMi4xcSBWTEFOIHRhZ2dlZCBmcmFtZXMgKi8KKwkJCXNldF84MDIxcV9tb2RlKGRldiwgMSk7CisJCQlvdXR3KFJ4RW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsgLyogUmUtZW5hYmxlIHRoZSByZWNlaXZlci4gKi8KKwkJCW91dHcoQWNrSW50ciB8IEhvc3RFcnJvciwgaW9hZGRyICsgRUwzX0NNRCk7CisJCX0KKwl9CisKKwlpZiAoZG9fdHhfcmVzZXQpIHsKKwkJaXNzdWVfYW5kX3dhaXQoZGV2LCBUeFJlc2V0fHJlc2V0X21hc2spOworCQlvdXR3KFR4RW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJaWYgKCF2cC0+ZnVsbF9idXNfbWFzdGVyX3R4KQorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KK30KKworc3RhdGljIGludAordm9ydGV4X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJLyogUHV0IG91dCB0aGUgZG91Ymxld29yZCBoZWFkZXIuLi4gKi8KKwlvdXRsKHNrYi0+bGVuLCBpb2FkZHIgKyBUWF9GSUZPKTsKKwlpZiAodnAtPmJ1c19tYXN0ZXIpIHsKKwkJLyogU2V0IHRoZSBidXMtbWFzdGVyIGNvbnRyb2xsZXIgdG8gdHJhbnNmZXIgdGhlIHBhY2tldC4gKi8KKwkJaW50IGxlbiA9IChza2ItPmxlbiArIDMpICYgfjM7CisJCW91dGwoCXZwLT50eF9za2JfZG1hID0gcGNpX21hcF9zaW5nbGUoVk9SVEVYX1BDSSh2cCksIHNrYi0+ZGF0YSwgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKSwKKwkJCQlpb2FkZHIgKyBXbjdfTWFzdGVyQWRkcik7CisJCW91dHcobGVuLCBpb2FkZHIgKyBXbjdfTWFzdGVyTGVuKTsKKwkJdnAtPnR4X3NrYiA9IHNrYjsKKwkJb3V0dyhTdGFydERNQURvd24sIGlvYWRkciArIEVMM19DTUQpOworCQkvKiBuZXRpZl93YWtlX3F1ZXVlKCkgd2lsbCBiZSBjYWxsZWQgYXQgdGhlIERNQURvbmUgaW50ZXJydXB0LiAqLworCX0gZWxzZSB7CisJCS8qIC4uLiBhbmQgdGhlIHBhY2tldCByb3VuZGVkIHRvIGEgZG91Ymxld29yZC4gKi8KKwkJb3V0c2woaW9hZGRyICsgVFhfRklGTywgc2tiLT5kYXRhLCAoc2tiLT5sZW4gKyAzKSA+PiAyKTsKKwkJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKwkJaWYgKGludyhpb2FkZHIgKyBUeEZyZWUpID4gMTUzNikgeworCQkJbmV0aWZfc3RhcnRfcXVldWUgKGRldik7CS8qIEFLUE06IHJlZHVuZGFudD8gKi8KKwkJfSBlbHNlIHsKKwkJCS8qIEludGVycnVwdCB1cyB3aGVuIHRoZSBGSUZPIGhhcyByb29tIGZvciBtYXgtc2l6ZWQgcGFja2V0LiAqLworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJb3V0dyhTZXRUeFRocmVzaG9sZCArICgxNTM2Pj4yKSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCX0KKwl9CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIENsZWFyIHRoZSBUeCBzdGF0dXMgc3RhY2suICovCisJeworCQlpbnQgdHhfc3RhdHVzOworCQlpbnQgaSA9IDMyOworCisJCXdoaWxlICgtLWkgPiAwCSYmCSh0eF9zdGF0dXMgPSBpbmIoaW9hZGRyICsgVHhTdGF0dXMpKSA+IDApIHsKKwkJCWlmICh0eF9zdGF0dXMgJiAweDNDKSB7CQkvKiBBIFR4LWRpc2FibGluZyBlcnJvciBvY2N1cnJlZC4gICovCisJCQkJaWYgKHZvcnRleF9kZWJ1ZyA+IDIpCisJCQkJICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IFR4IGVycm9yLCBzdGF0dXMgJTIuMnguXG4iLAorCQkJCQkJIGRldi0+bmFtZSwgdHhfc3RhdHVzKTsKKwkJCQlpZiAodHhfc3RhdHVzICYgMHgwNCkgdnAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkJaWYgKHR4X3N0YXR1cyAmIDB4MzgpIHZwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJCWlmICh0eF9zdGF0dXMgJiAweDMwKSB7CisJCQkJCWlzc3VlX2FuZF93YWl0KGRldiwgVHhSZXNldCk7CisJCQkJfQorCQkJCW91dHcoVHhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCQkJfQorCQkJb3V0YigweDAwLCBpb2FkZHIgKyBUeFN0YXR1cyk7IC8qIFBvcCB0aGUgc3RhdHVzIHN0YWNrLiAqLworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citib29tZXJhbmdfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJLyogQ2FsY3VsYXRlIHRoZSBuZXh0IFR4IGRlc2NyaXB0b3IgZW50cnkuICovCisJaW50IGVudHJ5ID0gdnAtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKKwlzdHJ1Y3QgYm9vbV90eF9kZXNjICpwcmV2X2VudHJ5ID0gJnZwLT50eF9yaW5nWyh2cC0+Y3VyX3R4LTEpICUgVFhfUklOR19TSVpFXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHZvcnRleF9kZWJ1ZyA+IDYpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImJvb21lcmFuZ19zdGFydF94bWl0KClcbiIpOworCQlpZiAodm9ydGV4X2RlYnVnID4gMykKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHJ5aW5nIHRvIHNlbmQgYSBwYWNrZXQsIFR4IGluZGV4ICVkLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIHZwLT5jdXJfdHgpOworCX0KKworCWlmICh2cC0+Y3VyX3R4IC0gdnAtPmRpcnR5X3R4ID49IFRYX1JJTkdfU0laRSkgeworCQlpZiAodm9ydGV4X2RlYnVnID4gMCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBCVUchIFR4IFJpbmcgZnVsbCwgcmVmdXNpbmcgdG8gc2VuZCBidWZmZXIuXG4iLAorCQkJCSAgIGRldi0+bmFtZSk7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJcmV0dXJuIDE7CisJfQorCisJdnAtPnR4X3NrYnVmZltlbnRyeV0gPSBza2I7CisKKwl2cC0+dHhfcmluZ1tlbnRyeV0ubmV4dCA9IDA7CisjaWYgRE9fWkVST0NPUFkKKwlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fSFcpCisJCQl2cC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzID0gY3B1X3RvX2xlMzIoc2tiLT5sZW4gfCBUeEludHJVcGxvYWRlZCk7CisJZWxzZQorCQkJdnAtPnR4X3JpbmdbZW50cnldLnN0YXR1cyA9IGNwdV90b19sZTMyKHNrYi0+bGVuIHwgVHhJbnRyVXBsb2FkZWQgfCBBZGRUQ1BDaGtzdW0gfCBBZGRVRFBDaGtzdW0pOworCisJaWYgKCFza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKSB7CisJCXZwLT50eF9yaW5nW2VudHJ5XS5mcmFnWzBdLmFkZHIgPSBjcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShWT1JURVhfUENJKHZwKSwgc2tiLT5kYXRhLAorCQkJCQkJCQkJCXNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKSk7CisJCXZwLT50eF9yaW5nW2VudHJ5XS5mcmFnWzBdLmxlbmd0aCA9IGNwdV90b19sZTMyKHNrYi0+bGVuIHwgTEFTVF9GUkFHKTsKKwl9IGVsc2UgeworCQlpbnQgaTsKKworCQl2cC0+dHhfcmluZ1tlbnRyeV0uZnJhZ1swXS5hZGRyID0gY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoVk9SVEVYX1BDSSh2cCksIHNrYi0+ZGF0YSwKKwkJCQkJCQkJCQlza2ItPmxlbi1za2ItPmRhdGFfbGVuLCBQQ0lfRE1BX1RPREVWSUNFKSk7CisJCXZwLT50eF9yaW5nW2VudHJ5XS5mcmFnWzBdLmxlbmd0aCA9IGNwdV90b19sZTMyKHNrYi0+bGVuLXNrYi0+ZGF0YV9sZW4pOworCisJCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspIHsKKwkJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKworCQkJdnAtPnR4X3JpbmdbZW50cnldLmZyYWdbaSsxXS5hZGRyID0KKwkJCQkJY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoVk9SVEVYX1BDSSh2cCksCisJCQkJCQkJCQkJCSAgICh2b2lkKilwYWdlX2FkZHJlc3MoZnJhZy0+cGFnZSkgKyBmcmFnLT5wYWdlX29mZnNldCwKKwkJCQkJCQkJCQkJICAgZnJhZy0+c2l6ZSwgUENJX0RNQV9UT0RFVklDRSkpOworCisJCQlpZiAoaSA9PSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzLTEpCisJCQkJCXZwLT50eF9yaW5nW2VudHJ5XS5mcmFnW2krMV0ubGVuZ3RoID0gY3B1X3RvX2xlMzIoZnJhZy0+c2l6ZXxMQVNUX0ZSQUcpOworCQkJZWxzZQorCQkJCQl2cC0+dHhfcmluZ1tlbnRyeV0uZnJhZ1tpKzFdLmxlbmd0aCA9IGNwdV90b19sZTMyKGZyYWctPnNpemUpOworCQl9CisJfQorI2Vsc2UKKwl2cC0+dHhfcmluZ1tlbnRyeV0uYWRkciA9IGNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKFZPUlRFWF9QQ0kodnApLCBza2ItPmRhdGEsIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKSk7CisJdnAtPnR4X3JpbmdbZW50cnldLmxlbmd0aCA9IGNwdV90b19sZTMyKHNrYi0+bGVuIHwgTEFTVF9GUkFHKTsKKwl2cC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzID0gY3B1X3RvX2xlMzIoc2tiLT5sZW4gfCBUeEludHJVcGxvYWRlZCk7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2cC0+bG9jaywgZmxhZ3MpOworCS8qIFdhaXQgZm9yIHRoZSBzdGFsbCB0byBjb21wbGV0ZS4gKi8KKwlpc3N1ZV9hbmRfd2FpdChkZXYsIERvd25TdGFsbCk7CisJcHJldl9lbnRyeS0+bmV4dCA9IGNwdV90b19sZTMyKHZwLT50eF9yaW5nX2RtYSArIGVudHJ5ICogc2l6ZW9mKHN0cnVjdCBib29tX3R4X2Rlc2MpKTsKKwlpZiAoaW5sKGlvYWRkciArIERvd25MaXN0UHRyKSA9PSAwKSB7CisJCW91dGwodnAtPnR4X3JpbmdfZG1hICsgZW50cnkgKiBzaXplb2Yoc3RydWN0IGJvb21fdHhfZGVzYyksIGlvYWRkciArIERvd25MaXN0UHRyKTsKKwkJdnAtPnF1ZXVlZF9wYWNrZXQrKzsKKwl9CisKKwl2cC0+Y3VyX3R4Kys7CisJaWYgKHZwLT5jdXJfdHggLSB2cC0+ZGlydHlfdHggPiBUWF9SSU5HX1NJWkUgLSAxKSB7CisJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisJfSBlbHNlIHsJCQkJCS8qIENsZWFyIHByZXZpb3VzIGludGVycnVwdCBlbmFibGUuICovCisjaWYgZGVmaW5lZCh0eF9pbnRlcnJ1cHRfbWl0aWdhdGlvbikKKwkJLyogRHViaW91cy4gSWYgaW4gYm9vbWVhbmdfaW50ZXJydXB0ICJmYXN0ZXIiIGN5Y2xvbmUgaWZkZWYKKwkJICogd2VyZSBzZWxlY3RlZCwgdGhpcyB3b3VsZCBjb3JydXB0IEROX0NPTVBMRVRFLiBObz8KKwkJICovCisJCXByZXZfZW50cnktPnN0YXR1cyAmPSBjcHVfdG9fbGUzMih+VHhJbnRyVXBsb2FkZWQpOworI2VuZGlmCisJfQorCW91dHcoRG93blVuc3RhbGwsIGlvYWRkciArIEVMM19DTUQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwLT5sb2NrLCBmbGFncyk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBkb2VzIGFsbCBvZiB0aGUgUnggdGhyZWFkIHdvcmsgYW5kIGNsZWFucyB1cAorICAgYWZ0ZXIgdGhlIFR4IHRocmVhZC4gKi8KKworLyoKKyAqIFRoaXMgaXMgdGhlIElTUiBmb3IgdGhlIHZvcnRleCBzZXJpZXMgY2hpcHMuCisgKiBmdWxsX2J1c19tYXN0ZXJfdHggPT0gMCAmJiBmdWxsX2J1c19tYXN0ZXJfcnggPT0gMAorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdAordm9ydGV4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHI7CisJaW50IHN0YXR1czsKKwlpbnQgd29ya19kb25lID0gbWF4X2ludGVycnVwdF93b3JrOworCWludCBoYW5kbGVkID0gMDsKKworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXNwaW5fbG9jaygmdnAtPmxvY2spOworCisJc3RhdHVzID0gaW53KGlvYWRkciArIEVMM19TVEFUVVMpOworCisJaWYgKHZvcnRleF9kZWJ1ZyA+IDYpCisJCXByaW50aygidm9ydGV4X2ludGVycnVwdCgpLiBzdGF0dXM9MHglNHhcbiIsIHN0YXR1cyk7CisKKwlpZiAoKHN0YXR1cyAmIEludExhdGNoKSA9PSAwKQorCQlnb3RvIGhhbmRsZXJfZXhpdDsJCS8qIE5vIGludGVycnVwdDogc2hhcmVkIElSUXMgY2F1c2UgdGhpcyAqLworCWhhbmRsZWQgPSAxOworCisJaWYgKHN0YXR1cyAmIEludFJlcSkgeworCQlzdGF0dXMgfD0gdnAtPmRlZmVycmVkOworCQl2cC0+ZGVmZXJyZWQgPSAwOworCX0KKworCWlmIChzdGF0dXMgPT0gMHhmZmZmKQkJLyogaC93IG5vIGxvbmdlciBwcmVzZW50IChob3RwbHVnKT8gKi8KKwkJZ290byBoYW5kbGVyX2V4aXQ7CisKKwlpZiAodm9ydGV4X2RlYnVnID4gNCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcnJ1cHQsIHN0YXR1cyAlNC40eCwgbGF0ZW5jeSAlZCB0aWNrcy5cbiIsCisJCQkgICBkZXYtPm5hbWUsIHN0YXR1cywgaW5iKGlvYWRkciArIFRpbWVyKSk7CisKKwlkbyB7CisJCWlmICh2b3J0ZXhfZGVidWcgPiA1KQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogSW4gaW50ZXJydXB0IGxvb3AsIHN0YXR1cyAlNC40eC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJaWYgKHN0YXR1cyAmIFJ4Q29tcGxldGUpCisJCQl2b3J0ZXhfcngoZGV2KTsKKworCQlpZiAoc3RhdHVzICYgVHhBdmFpbGFibGUpIHsKKwkJCWlmICh2b3J0ZXhfZGVidWcgPiA1KQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIJVFggcm9vbSBiaXQgd2FzIGhhbmRsZWQuXG4iKTsKKwkJCS8qIFRoZXJlJ3Mgcm9vbSBpbiB0aGUgRklGTyBmb3IgYSBmdWxsLXNpemVkIHBhY2tldC4gKi8KKwkJCW91dHcoQWNrSW50ciB8IFR4QXZhaWxhYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJCX0KKworCQlpZiAoc3RhdHVzICYgRE1BRG9uZSkgeworCQkJaWYgKGludyhpb2FkZHIgKyBXbjdfTWFzdGVyU3RhdHVzKSAmIDB4MTAwMCkgeworCQkJCW91dHcoMHgxMDAwLCBpb2FkZHIgKyBXbjdfTWFzdGVyU3RhdHVzKTsgLyogQWNrIHRoZSBldmVudC4gKi8KKwkJCQlwY2lfdW5tYXBfc2luZ2xlKFZPUlRFWF9QQ0kodnApLCB2cC0+dHhfc2tiX2RtYSwgKHZwLT50eF9za2ItPmxlbiArIDMpICYgfjMsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCWRldl9rZnJlZV9za2JfaXJxKHZwLT50eF9za2IpOyAvKiBSZWxlYXNlIHRoZSB0cmFuc2ZlcnJlZCBidWZmZXIgKi8KKwkJCQlpZiAoaW53KGlvYWRkciArIFR4RnJlZSkgPiAxNTM2KSB7CisJCQkJCS8qCisJCQkJCSAqIEFLUE06IEZJWE1FOiBJIGRvbid0IHRoaW5rIHdlIG5lZWQgdGhpcy4gIElmIHRoZSBxdWV1ZSB3YXMgc3RvcHBlZCBkdWUgdG8KKwkJCQkJICogaW5zdWZmaWNpZW50IEZJRk8gcm9vbSwgdGhlIFR4QXZhaWxhYmxlIHRlc3Qgd2lsbCBzdWNjZWVkIGFuZCBjYWxsCisJCQkJCSAqIG5ldGlmX3dha2VfcXVldWUoKQorCQkJCQkgKi8KKwkJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJCX0gZWxzZSB7IC8qIEludGVycnVwdCB3aGVuIEZJRk8gaGFzIHJvb20gZm9yIG1heC1zaXplZCBwYWNrZXQuICovCisJCQkJCW91dHcoU2V0VHhUaHJlc2hvbGQgKyAoMTUzNj4+MiksIGlvYWRkciArIEVMM19DTUQpOworCQkJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQkJfQorCQkJfQorCQl9CisJCS8qIENoZWNrIGZvciBhbGwgdW5jb21tb24gaW50ZXJydXB0cyBhdCBvbmNlLiAqLworCQlpZiAoc3RhdHVzICYgKEhvc3RFcnJvciB8IFJ4RWFybHkgfCBTdGF0c0Z1bGwgfCBUeENvbXBsZXRlIHwgSW50UmVxKSkgeworCQkJaWYgKHN0YXR1cyA9PSAweGZmZmYpCisJCQkJYnJlYWs7CisJCQl2b3J0ZXhfZXJyb3IoZGV2LCBzdGF0dXMpOworCQl9CisKKwkJaWYgKC0td29ya19kb25lIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRvbyBtdWNoIHdvcmsgaW4gaW50ZXJydXB0LCBzdGF0dXMgIgorCQkJCSAgICIlNC40eC5cbiIsIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCS8qIERpc2FibGUgYWxsIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KKwkJCWRvIHsKKwkJCQl2cC0+ZGVmZXJyZWQgfD0gc3RhdHVzOworCQkJCW91dHcoU2V0U3RhdHVzRW5iIHwgKH52cC0+ZGVmZXJyZWQgJiB2cC0+c3RhdHVzX2VuYWJsZSksCisJCQkJCSBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCQlvdXR3KEFja0ludHIgfCAodnAtPmRlZmVycmVkICYgMHg3ZmYpLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCX0gd2hpbGUgKChzdGF0dXMgPSBpbncoaW9hZGRyICsgRUwzX0NNRCkpICYgSW50TGF0Y2gpOworCQkJLyogVGhlIHRpbWVyIHdpbGwgcmVlbmFibGUgaW50ZXJydXB0cy4gKi8KKwkJCW1vZF90aW1lcigmdnAtPnRpbWVyLCBqaWZmaWVzICsgMSpIWik7CisJCQlicmVhazsKKwkJfQorCQkvKiBBY2tub3dsZWRnZSB0aGUgSVJRLiAqLworCQlvdXR3KEFja0ludHIgfCBJbnRSZXEgfCBJbnRMYXRjaCwgaW9hZGRyICsgRUwzX0NNRCk7CisJfSB3aGlsZSAoKHN0YXR1cyA9IGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSkgJiAoSW50TGF0Y2ggfCBSeENvbXBsZXRlKSk7CisKKwlpZiAodm9ydGV4X2RlYnVnID4gNCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleGl0aW5nIGludGVycnVwdCwgc3RhdHVzICU0LjR4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgc3RhdHVzKTsKK2hhbmRsZXJfZXhpdDoKKwlzcGluX3VubG9jaygmdnAtPmxvY2spOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKgorICogVGhpcyBpcyB0aGUgSVNSIGZvciB0aGUgYm9vbWVyYW5nIHNlcmllcyBjaGlwcy4KKyAqIGZ1bGxfYnVzX21hc3Rlcl90eCA9PSAxICYmIGZ1bGxfYnVzX21hc3Rlcl9yeCA9PSAxCisgKi8KKworc3RhdGljIGlycXJldHVybl90Citib29tZXJhbmdfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb25nIGlvYWRkcjsKKwlpbnQgc3RhdHVzOworCWludCB3b3JrX2RvbmUgPSBtYXhfaW50ZXJydXB0X3dvcms7CisKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCS8qCisJICogSXQgc2VlbXMgZG9wZXkgdG8gcHV0IHRoZSBzcGlubG9jayB0aGlzIGVhcmx5LCBidXQgd2UgY291bGQgcmFjZSBhZ2FpbnN0IHZvcnRleF90eF90aW1lb3V0CisJICogYW5kIGJvb21lcmFuZ19zdGFydF94bWl0CisJICovCisJc3Bpbl9sb2NrKCZ2cC0+bG9jayk7CisKKwlzdGF0dXMgPSBpbncoaW9hZGRyICsgRUwzX1NUQVRVUyk7CisKKwlpZiAodm9ydGV4X2RlYnVnID4gNikKKwkJcHJpbnRrKEtFUk5fREVCVUcgImJvb21lcmFuZ19pbnRlcnJ1cHQuIHN0YXR1cz0weCU0eFxuIiwgc3RhdHVzKTsKKworCWlmICgoc3RhdHVzICYgSW50TGF0Y2gpID09IDApCisJCWdvdG8gaGFuZGxlcl9leGl0OwkJLyogTm8gaW50ZXJydXB0OiBzaGFyZWQgSVJRcyBjYW4gY2F1c2UgdGhpcyAqLworCisJaWYgKHN0YXR1cyA9PSAweGZmZmYpIHsJCS8qIGgvdyBubyBsb25nZXIgcHJlc2VudCAoaG90cGx1Zyk/ICovCisJCWlmICh2b3J0ZXhfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImJvb21lcmFuZ19pbnRlcnJ1cHQoMSk6IHN0YXR1cyA9IDB4ZmZmZlxuIik7CisJCWdvdG8gaGFuZGxlcl9leGl0OworCX0KKworCWlmIChzdGF0dXMgJiBJbnRSZXEpIHsKKwkJc3RhdHVzIHw9IHZwLT5kZWZlcnJlZDsKKwkJdnAtPmRlZmVycmVkID0gMDsKKwl9CisKKwlpZiAodm9ydGV4X2RlYnVnID4gNCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcnJ1cHQsIHN0YXR1cyAlNC40eCwgbGF0ZW5jeSAlZCB0aWNrcy5cbiIsCisJCQkgICBkZXYtPm5hbWUsIHN0YXR1cywgaW5iKGlvYWRkciArIFRpbWVyKSk7CisJZG8geworCQlpZiAodm9ydGV4X2RlYnVnID4gNSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEluIGludGVycnVwdCBsb29wLCBzdGF0dXMgJTQuNHguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCWlmIChzdGF0dXMgJiBVcENvbXBsZXRlKSB7CisJCQlvdXR3KEFja0ludHIgfCBVcENvbXBsZXRlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCWlmICh2b3J0ZXhfZGVidWcgPiA1KQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJib29tZXJhbmdfaW50ZXJydXB0LT5ib29tZXJhbmdfcnhcbiIpOworCQkJYm9vbWVyYW5nX3J4KGRldik7CisJCX0KKworCQlpZiAoc3RhdHVzICYgRG93bkNvbXBsZXRlKSB7CisJCQl1bnNpZ25lZCBpbnQgZGlydHlfdHggPSB2cC0+ZGlydHlfdHg7CisKKwkJCW91dHcoQWNrSW50ciB8IERvd25Db21wbGV0ZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQl3aGlsZSAodnAtPmN1cl90eCAtIGRpcnR5X3R4ID4gMCkgeworCQkJCWludCBlbnRyeSA9IGRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworI2lmIDEJLyogQUtQTTogdGhlIGxhdHRlciBpcyBmYXN0ZXIsIGJ1dCBjeWNsb25lLW9ubHkgKi8KKwkJCQlpZiAoaW5sKGlvYWRkciArIERvd25MaXN0UHRyKSA9PQorCQkJCQl2cC0+dHhfcmluZ19kbWEgKyBlbnRyeSAqIHNpemVvZihzdHJ1Y3QgYm9vbV90eF9kZXNjKSkKKwkJCQkJYnJlYWs7CQkJLyogSXQgc3RpbGwgaGFzbid0IGJlZW4gcHJvY2Vzc2VkLiAqLworI2Vsc2UKKwkJCQlpZiAoKHZwLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMgJiBETl9DT01QTEVURSkgPT0gMCkKKwkJCQkJYnJlYWs7CQkJLyogSXQgc3RpbGwgaGFzbid0IGJlZW4gcHJvY2Vzc2VkLiAqLworI2VuZGlmCisJCQkJCQorCQkJCWlmICh2cC0+dHhfc2tidWZmW2VudHJ5XSkgeworCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdnAtPnR4X3NrYnVmZltlbnRyeV07CisjaWYgRE9fWkVST0NPUFkJCQkJCQorCQkJCQlpbnQgaTsKKwkJCQkJZm9yIChpPTA7IGk8PXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykKKwkJCQkJCQlwY2lfdW5tYXBfc2luZ2xlKFZPUlRFWF9QQ0kodnApLAorCQkJCQkJCQkJCQkgbGUzMl90b19jcHUodnAtPnR4X3JpbmdbZW50cnldLmZyYWdbaV0uYWRkciksCisJCQkJCQkJCQkJCSBsZTMyX3RvX2NwdSh2cC0+dHhfcmluZ1tlbnRyeV0uZnJhZ1tpXS5sZW5ndGgpJjB4RkZGLAorCQkJCQkJCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisjZWxzZQorCQkJCQlwY2lfdW5tYXBfc2luZ2xlKFZPUlRFWF9QQ0kodnApLAorCQkJCQkJbGUzMl90b19jcHUodnAtPnR4X3JpbmdbZW50cnldLmFkZHIpLCBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisjZW5kaWYKKwkJCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCQkJdnAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50ayhLRVJOX0RFQlVHICJib29tZXJhbmdfaW50ZXJydXB0OiBubyBza2IhXG4iKTsKKwkJCQl9CisJCQkJLyogdnAtPnN0YXRzLnR4X3BhY2tldHMrKzsgIENvdW50ZWQgYmVsb3cuICovCisJCQkJZGlydHlfdHgrKzsKKwkJCX0KKwkJCXZwLT5kaXJ0eV90eCA9IGRpcnR5X3R4OworCQkJaWYgKHZwLT5jdXJfdHggLSBkaXJ0eV90eCA8PSBUWF9SSU5HX1NJWkUgLSAxKSB7CisJCQkJaWYgKHZvcnRleF9kZWJ1ZyA+IDYpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICJib29tZXJhbmdfaW50ZXJydXB0OiB3YWtlIHF1ZXVlXG4iKTsKKwkJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCQkJfQorCQl9CisKKwkJLyogQ2hlY2sgZm9yIGFsbCB1bmNvbW1vbiBpbnRlcnJ1cHRzIGF0IG9uY2UuICovCisJCWlmIChzdGF0dXMgJiAoSG9zdEVycm9yIHwgUnhFYXJseSB8IFN0YXRzRnVsbCB8IFR4Q29tcGxldGUgfCBJbnRSZXEpKQorCQkJdm9ydGV4X2Vycm9yKGRldiwgc3RhdHVzKTsKKworCQlpZiAoLS13b3JrX2RvbmUgPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVG9vIG11Y2ggd29yayBpbiBpbnRlcnJ1cHQsIHN0YXR1cyAiCisJCQkJICAgIiU0LjR4LlxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJLyogRGlzYWJsZSBhbGwgcGVuZGluZyBpbnRlcnJ1cHRzLiAqLworCQkJZG8geworCQkJCXZwLT5kZWZlcnJlZCB8PSBzdGF0dXM7CisJCQkJb3V0dyhTZXRTdGF0dXNFbmIgfCAofnZwLT5kZWZlcnJlZCAmIHZwLT5zdGF0dXNfZW5hYmxlKSwKKwkJCQkJIGlvYWRkciArIEVMM19DTUQpOworCQkJCW91dHcoQWNrSW50ciB8ICh2cC0+ZGVmZXJyZWQgJiAweDdmZiksIGlvYWRkciArIEVMM19DTUQpOworCQkJfSB3aGlsZSAoKHN0YXR1cyA9IGludyhpb2FkZHIgKyBFTDNfQ01EKSkgJiBJbnRMYXRjaCk7CisJCQkvKiBUaGUgdGltZXIgd2lsbCByZWVuYWJsZSBpbnRlcnJ1cHRzLiAqLworCQkJbW9kX3RpbWVyKCZ2cC0+dGltZXIsIGppZmZpZXMgKyAxKkhaKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIEFja25vd2xlZGdlIHRoZSBJUlEuICovCisJCW91dHcoQWNrSW50ciB8IEludFJlcSB8IEludExhdGNoLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJaWYgKHZwLT5jYl9mbl9iYXNlKQkJCS8qIFRoZSBQQ01DSUEgcGVvcGxlIGFyZSBpZGlvdHMuICAqLworCQkJd3JpdGVsKDB4ODAwMCwgdnAtPmNiX2ZuX2Jhc2UgKyA0KTsKKworCX0gd2hpbGUgKChzdGF0dXMgPSBpbncoaW9hZGRyICsgRUwzX1NUQVRVUykpICYgSW50TGF0Y2gpOworCisJaWYgKHZvcnRleF9kZWJ1ZyA+IDQpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBpbnRlcnJ1cHQsIHN0YXR1cyAlNC40eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIHN0YXR1cyk7CitoYW5kbGVyX2V4aXQ6CisJc3Bpbl91bmxvY2soJnZwLT5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgdm9ydGV4X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaTsKKwlzaG9ydCByeF9zdGF0dXM7CisKKwlpZiAodm9ydGV4X2RlYnVnID4gNSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgInZvcnRleF9yeCgpOiBzdGF0dXMgJTQuNHgsIHJ4X3N0YXR1cyAlNC40eC5cbiIsCisJCQkgICBpbncoaW9hZGRyK0VMM19TVEFUVVMpLCBpbncoaW9hZGRyK1J4U3RhdHVzKSk7CisJd2hpbGUgKChyeF9zdGF0dXMgPSBpbncoaW9hZGRyICsgUnhTdGF0dXMpKSA+IDApIHsKKwkJaWYgKHJ4X3N0YXR1cyAmIDB4NDAwMCkgeyAvKiBFcnJvciwgdXBkYXRlIHN0YXRzLiAqLworCQkJdW5zaWduZWQgY2hhciByeF9lcnJvciA9IGluYihpb2FkZHIgKyBSeEVycm9ycyk7CisJCQlpZiAodm9ydGV4X2RlYnVnID4gMikKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiIFJ4IGVycm9yOiBzdGF0dXMgJTIuMnguXG4iLCByeF9lcnJvcik7CisJCQl2cC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAocnhfZXJyb3IgJiAweDAxKSAgdnAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAocnhfZXJyb3IgJiAweDAyKSAgdnAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCWlmIChyeF9lcnJvciAmIDB4MDQpICB2cC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAocnhfZXJyb3IgJiAweDA4KSAgdnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChyeF9lcnJvciAmIDB4MTApICB2cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJLyogVGhlIHBhY2tldCBsZW5ndGg6IHVwIHRvIDQuNUshLiAqLworCQkJaW50IHBrdF9sZW4gPSByeF9zdGF0dXMgJiAweDFmZmY7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyA1KTsKKwkJCWlmICh2b3J0ZXhfZGVidWcgPiA0KQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJSZWNlaXZpbmcgcGFja2V0IHNpemUgJWQgc3RhdHVzICU0LjR4LlxuIiwKKwkJCQkJICAgcGt0X2xlbiwgcnhfc3RhdHVzKTsKKwkJCWlmIChza2IgIT0gTlVMTCkgeworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLworCQkJCS8qICdza2JfcHV0KCknIHBvaW50cyB0byB0aGUgc3RhcnQgb2Ygc2tfYnVmZiBkYXRhIGFyZWEuICovCisJCQkJaWYgKHZwLT5idXNfbWFzdGVyICYmCisJCQkJCSEgKGludyhpb2FkZHIgKyBXbjdfTWFzdGVyU3RhdHVzKSAmIDB4ODAwMCkpIHsKKwkJCQkJZG1hX2FkZHJfdCBkbWEgPSBwY2lfbWFwX3NpbmdsZShWT1JURVhfUENJKHZwKSwgc2tiX3B1dChza2IsIHBrdF9sZW4pLAorCQkJCQkJCQkJICAgcGt0X2xlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQkJb3V0bChkbWEsIGlvYWRkciArIFduN19NYXN0ZXJBZGRyKTsKKwkJCQkJb3V0dygoc2tiLT5sZW4gKyAzKSAmIH4zLCBpb2FkZHIgKyBXbjdfTWFzdGVyTGVuKTsKKwkJCQkJb3V0dyhTdGFydERNQVVwLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCQkJd2hpbGUgKGludyhpb2FkZHIgKyBXbjdfTWFzdGVyU3RhdHVzKSAmIDB4ODAwMCkKKwkJCQkJCTsKKwkJCQkJcGNpX3VubWFwX3NpbmdsZShWT1JURVhfUENJKHZwKSwgZG1hLCBwa3RfbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCX0gZWxzZSB7CisJCQkJCWluc2woaW9hZGRyICsgUlhfRklGTywgc2tiX3B1dChza2IsIHBrdF9sZW4pLAorCQkJCQkJIChwa3RfbGVuICsgMykgPj4gMik7CisJCQkJfQorCQkJCW91dHcoUnhEaXNjYXJkLCBpb2FkZHIgKyBFTDNfQ01EKTsgLyogUG9wIHRvcCBSeCBwYWNrZXQuICovCisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCQluZXRpZl9yeChza2IpOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJdnAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQkvKiBXYWl0IGEgbGltaXRlZCB0aW1lIHRvIGdvIHRvIG5leHQgcGFja2V0LiAqLworCQkJCWZvciAoaSA9IDIwMDsgaSA+PSAwOyBpLS0pCisJCQkJCWlmICggISAoaW53KGlvYWRkciArIEVMM19TVEFUVVMpICYgQ21kSW5Qcm9ncmVzcykpCisJCQkJCQlicmVhazsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAodm9ydGV4X2RlYnVnID4gMCkKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBObyBtZW1vcnkgdG8gYWxsb2NhdGUgYSBza19idWZmIG9mICIKKwkJCQkJICAgInNpemUgJWQuXG4iLCBkZXYtPm5hbWUsIHBrdF9sZW4pOworCQl9CisJCXZwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCWlzc3VlX2FuZF93YWl0KGRldiwgUnhEaXNjYXJkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYm9vbWVyYW5nX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5ID0gdnAtPmN1cl9yeCAlIFJYX1JJTkdfU0laRTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCByeF9zdGF0dXM7CisJaW50IHJ4X3dvcmtfbGltaXQgPSB2cC0+ZGlydHlfcnggKyBSWF9SSU5HX1NJWkUgLSB2cC0+Y3VyX3J4OworCisJaWYgKHZvcnRleF9kZWJ1ZyA+IDUpCisJCXByaW50ayhLRVJOX0RFQlVHICJib29tZXJhbmdfcngoKTogc3RhdHVzICU0LjR4XG4iLCBpbncoaW9hZGRyK0VMM19TVEFUVVMpKTsKKworCXdoaWxlICgocnhfc3RhdHVzID0gbGUzMl90b19jcHUodnAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cykpICYgUnhEQ29tcGxldGUpeworCQlpZiAoLS1yeF93b3JrX2xpbWl0IDwgMCkKKwkJCWJyZWFrOworCQlpZiAocnhfc3RhdHVzICYgUnhERXJyb3IpIHsgLyogRXJyb3IsIHVwZGF0ZSBzdGF0cy4gKi8KKwkJCXVuc2lnbmVkIGNoYXIgcnhfZXJyb3IgPSByeF9zdGF0dXMgPj4gMTY7CisJCQlpZiAodm9ydGV4X2RlYnVnID4gMikKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiIFJ4IGVycm9yOiBzdGF0dXMgJTIuMnguXG4iLCByeF9lcnJvcik7CisJCQl2cC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAocnhfZXJyb3IgJiAweDAxKSAgdnAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAocnhfZXJyb3IgJiAweDAyKSAgdnAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCWlmIChyeF9lcnJvciAmIDB4MDQpICB2cC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAocnhfZXJyb3IgJiAweDA4KSAgdnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChyeF9lcnJvciAmIDB4MTApICB2cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJLyogVGhlIHBhY2tldCBsZW5ndGg6IHVwIHRvIDQuNUshLiAqLworCQkJaW50IHBrdF9sZW4gPSByeF9zdGF0dXMgJiAweDFmZmY7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJZG1hX2FkZHJfdCBkbWEgPSBsZTMyX3RvX2NwdSh2cC0+cnhfcmluZ1tlbnRyeV0uYWRkcik7CisKKwkJCWlmICh2b3J0ZXhfZGVidWcgPiA0KQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJSZWNlaXZpbmcgcGFja2V0IHNpemUgJWQgc3RhdHVzICU0LjR4LlxuIiwKKwkJCQkJICAgcGt0X2xlbiwgcnhfc3RhdHVzKTsKKworCQkJLyogQ2hlY2sgaWYgdGhlIHBhY2tldCBpcyBsb25nIGVub3VnaCB0byBqdXN0IGFjY2VwdCB3aXRob3V0CisJCQkgICBjb3B5aW5nIHRvIGEgcHJvcGVybHkgc2l6ZWQgc2tidWZmLiAqLworCQkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsgJiYgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSAwKSB7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KFZPUlRFWF9QQ0kodnApLCBkbWEsIFBLVF9CVUZfU1osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJLyogJ3NrYl9wdXQoKScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4gKi8KKwkJCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdF9sZW4pLAorCQkJCQkgICB2cC0+cnhfc2tidWZmW2VudHJ5XS0+dGFpbCwKKwkJCQkJICAgcGt0X2xlbik7CisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKFZPUlRFWF9QQ0kodnApLCBkbWEsIFBLVF9CVUZfU1osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJdnAtPnJ4X2NvcHkrKzsKKwkJCX0gZWxzZSB7CisJCQkJLyogUGFzcyB1cCB0aGUgc2tidWZmIGFscmVhZHkgb24gdGhlIFJ4IHJpbmcuICovCisJCQkJc2tiID0gdnAtPnJ4X3NrYnVmZltlbnRyeV07CisJCQkJdnAtPnJ4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKFZPUlRFWF9QQ0kodnApLCBkbWEsIFBLVF9CVUZfU1osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJdnAtPnJ4X25vY29weSsrOworCQkJfQorCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCXsJCQkJCS8qIFVzZSBoYXJkd2FyZSBjaGVja3N1bSBpbmZvLiAqLworCQkJCWludCBjc3VtX2JpdHMgPSByeF9zdGF0dXMgJiAweGVlMDAwMDAwOworCQkJCWlmIChjc3VtX2JpdHMgJiYKKwkJCQkJKGNzdW1fYml0cyA9PSAoSVBDaGtzdW1WYWxpZCB8IFRDUENoa3N1bVZhbGlkKSB8fAorCQkJCQkgY3N1bV9iaXRzID09IChJUENoa3N1bVZhbGlkIHwgVURQQ2hrc3VtVmFsaWQpKSkgeworCQkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCQkJCQl2cC0+cnhfY3N1bWhpdHMrKzsKKwkJCQl9CisJCQl9CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCXZwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCX0KKwkJZW50cnkgPSAoKyt2cC0+Y3VyX3J4KSAlIFJYX1JJTkdfU0laRTsKKwl9CisJLyogUmVmaWxsIHRoZSBSeCByaW5nIGJ1ZmZlcnMuICovCisJZm9yICg7IHZwLT5jdXJfcnggLSB2cC0+ZGlydHlfcnggPiAwOyB2cC0+ZGlydHlfcngrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQllbnRyeSA9IHZwLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRTsKKwkJaWYgKHZwLT5yeF9za2J1ZmZbZW50cnldID09IE5VTEwpIHsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IoUEtUX0JVRl9TWik7CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQlzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X2ppZjsKKwkJCQlpZiAoKGppZmZpZXMgLSBsYXN0X2ppZikgPiAxMCAqIEhaKSB7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBtZW1vcnkgc2hvcnRhZ2VcbiIsIGRldi0+bmFtZSk7CisJCQkJCWxhc3RfamlmID0gamlmZmllczsKKwkJCQl9CisJCQkJaWYgKCh2cC0+Y3VyX3J4IC0gdnAtPmRpcnR5X3J4KSA9PSBSWF9SSU5HX1NJWkUpCisJCQkJCW1vZF90aW1lcigmdnAtPnJ4X29vbV90aW1lciwgUlVOX0FUKEhaICogMSkpOworCQkJCWJyZWFrOwkJCS8qIEJhZCBuZXdzISAgKi8KKwkJCX0KKwkJCXNrYi0+ZGV2ID0gZGV2OwkJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKwkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLworCQkJdnAtPnJ4X3JpbmdbZW50cnldLmFkZHIgPSBjcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShWT1JURVhfUENJKHZwKSwgc2tiLT50YWlsLCBQS1RfQlVGX1NaLCBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKKwkJCXZwLT5yeF9za2J1ZmZbZW50cnldID0gc2tiOworCQl9CisJCXZwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMgPSAwOwkvKiBDbGVhciBjb21wbGV0ZSBiaXQuICovCisJCW91dHcoVXBVbnN0YWxsLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJZiB3ZSd2ZSBoaXQgYSB0b3RhbCBPT00gcmVmaWxsaW5nIHRoZSBSeCByaW5nIHdlIHBvbGwgb25jZSBhIHNlY29uZAorICogZm9yIHNvbWUgbWVtb3J5LiAgT3RoZXJ3aXNlIHRoZXJlIGlzIG5vIHdheSB0byByZXN0YXJ0IHRoZSByeCBwcm9jZXNzLgorICovCitzdGF0aWMgdm9pZAorcnhfb29tX3RpbWVyKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilhcmc7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2tfaXJxKCZ2cC0+bG9jayk7CisJaWYgKCh2cC0+Y3VyX3J4IC0gdnAtPmRpcnR5X3J4KSA9PSBSWF9SSU5HX1NJWkUpCS8qIFRoaXMgdGVzdCBpcyByZWR1bmRhbnQsIGJ1dCBtYWtlcyBtZSBmZWVsIGdvb2QgKi8KKwkJYm9vbWVyYW5nX3J4KGRldik7CisJaWYgKHZvcnRleF9kZWJ1ZyA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByeF9vb21fdGltZXIgJXNcbiIsIGRldi0+bmFtZSwKKwkJCSgodnAtPmN1cl9yeCAtIHZwLT5kaXJ0eV9yeCkgIT0gUlhfUklOR19TSVpFKSA/ICJzdWNjZWVkZWQiIDogInJldHJ5aW5nIik7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmdnAtPmxvY2spOworfQorCitzdGF0aWMgdm9pZAordm9ydGV4X2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZpbmFsX2Rvd24pCit7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisKKwlkZWxfdGltZXJfc3luYygmdnAtPnJ4X29vbV90aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJnZwLT50aW1lcik7CisKKwkvKiBUdXJuIG9mZiBzdGF0aXN0aWNzIEFTQVAuICBXZSB1cGRhdGUgdnAtPnN0YXRzIGJlbG93LiAqLworCW91dHcoU3RhdHNEaXNhYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKworCS8qIERpc2FibGUgdGhlIHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlci4gKi8KKwlvdXR3KFJ4RGlzYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJb3V0dyhUeERpc2FibGUsIGlvYWRkciArIEVMM19DTUQpOworCisJLyogRGlzYWJsZSByZWNlaXZpbmcgODAyLjFxIHRhZ2dlZCBmcmFtZXMgKi8KKwlzZXRfODAyMXFfbW9kZShkZXYsIDApOworCisJaWYgKGRldi0+aWZfcG9ydCA9PSBYQ1ZSXzEwYmFzZTIpCisJCS8qIFR1cm4gb2ZmIHRoaW5uZXQgcG93ZXIuICBHcmVlbiEgKi8KKwkJb3V0dyhTdG9wQ29heCwgaW9hZGRyICsgRUwzX0NNRCk7CisKKwlvdXR3KFNldEludHJFbmIgfCAweDAwMDAsIGlvYWRkciArIEVMM19DTUQpOworCisJdXBkYXRlX3N0YXRzKGlvYWRkciwgZGV2KTsKKwlpZiAodnAtPmZ1bGxfYnVzX21hc3Rlcl9yeCkKKwkJb3V0bCgwLCBpb2FkZHIgKyBVcExpc3RQdHIpOworCWlmICh2cC0+ZnVsbF9idXNfbWFzdGVyX3R4KQorCQlvdXRsKDAsIGlvYWRkciArIERvd25MaXN0UHRyKTsKKworCWlmIChmaW5hbF9kb3duICYmIFZPUlRFWF9QQ0kodnApKSB7CisJCXBjaV9zYXZlX3N0YXRlKFZPUlRFWF9QQ0kodnApKTsKKwkJYWNwaV9zZXRfV09MKGRldik7CisJfQorfQorCitzdGF0aWMgaW50Cit2b3J0ZXhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpOworCisJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCXZvcnRleF9kb3duKGRldiwgMSk7CisKKwlpZiAodm9ydGV4X2RlYnVnID4gMSkgeworCQlwcmludGsoS0VSTl9ERUJVRyIlczogdm9ydGV4X2Nsb3NlKCkgc3RhdHVzICU0LjR4LCBUeCBzdGF0dXMgJTIuMnguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpbncoaW9hZGRyICsgRUwzX1NUQVRVUyksIGluYihpb2FkZHIgKyBUeFN0YXR1cykpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHZvcnRleCBjbG9zZSBzdGF0czogcnhfbm9jb3B5ICVkIHJ4X2NvcHkgJWQiCisJCQkgICAiIHR4X3F1ZXVlZCAlZCBSeCBwcmUtY2hlY2tzdW1tZWQgJWQuXG4iLAorCQkJICAgZGV2LT5uYW1lLCB2cC0+cnhfbm9jb3B5LCB2cC0+cnhfY29weSwgdnAtPnF1ZXVlZF9wYWNrZXQsIHZwLT5yeF9jc3VtaGl0cyk7CisJfQorCisjaWYgRE9fWkVST0NPUFkKKwlpZiAoCXZwLT5yeF9jc3VtaGl0cyAmJgorCQkJKCh2cC0+ZHJ2X2ZsYWdzICYgSEFTX0hXQ0tTTSkgPT0gMCkgJiYKKwkJCShod19jaGVja3N1bXNbdnAtPmNhcmRfaWR4XSA9PSAtMSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgc3VwcG9ydHMgaGFyZHdhcmUgY2hlY2tzdW1zLCBhbmQgd2UncmUgbm90IHVzaW5nIHRoZW0hXG4iLCBkZXYtPm5hbWUpOworCX0KKyNlbmRpZgorCQkKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCWlmICh2cC0+ZnVsbF9idXNfbWFzdGVyX3J4KSB7IC8qIEZyZWUgQm9vbWVyYW5nIGJ1cyBtYXN0ZXIgUnggYnVmZmVycy4gKi8KKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQorCQkJaWYgKHZwLT5yeF9za2J1ZmZbaV0pIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKAlWT1JURVhfUENJKHZwKSwgbGUzMl90b19jcHUodnAtPnJ4X3JpbmdbaV0uYWRkciksCisJCQkJCQkJCQlQS1RfQlVGX1NaLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCWRldl9rZnJlZV9za2IodnAtPnJ4X3NrYnVmZltpXSk7CisJCQkJdnAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJCQl9CisJfQorCWlmICh2cC0+ZnVsbF9idXNfbWFzdGVyX3R4KSB7IC8qIEZyZWUgQm9vbWVyYW5nIGJ1cyBtYXN0ZXIgVHggYnVmZmVycy4gKi8KKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCQlpZiAodnAtPnR4X3NrYnVmZltpXSkgeworCQkJCXN0cnVjdCBza19idWZmICpza2IgPSB2cC0+dHhfc2tidWZmW2ldOworI2lmIERPX1pFUk9DT1BZCisJCQkJaW50IGs7CisKKwkJCQlmb3IgKGs9MDsgazw9c2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaysrKQorCQkJCQkJcGNpX3VubWFwX3NpbmdsZShWT1JURVhfUENJKHZwKSwKKwkJCQkJCQkJCQkgbGUzMl90b19jcHUodnAtPnR4X3JpbmdbaV0uZnJhZ1trXS5hZGRyKSwKKwkJCQkJCQkJCQkgbGUzMl90b19jcHUodnAtPnR4X3JpbmdbaV0uZnJhZ1trXS5sZW5ndGgpJjB4RkZGLAorCQkJCQkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKyNlbHNlCisJCQkJcGNpX3VubWFwX3NpbmdsZShWT1JURVhfUENJKHZwKSwgbGUzMl90b19jcHUodnAtPnR4X3JpbmdbaV0uYWRkciksIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKyNlbmRpZgorCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCQl2cC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZHVtcF90eF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKHZvcnRleF9kZWJ1ZyA+IDApIHsKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwkJCisJCWlmICh2cC0+ZnVsbF9idXNfbWFzdGVyX3R4KSB7CisJCQlpbnQgaTsKKwkJCWludCBzdGFsbGVkID0gaW5sKGlvYWRkciArIFBrdFN0YXR1cykgJiAweDA0OwkvKiBQb3NzaWJsZSByYWN5LiBCdXQgaXQncyBvbmx5IGRlYnVnIHN0dWZmICovCisKKwkJCXByaW50ayhLRVJOX0VSUiAiICBGbGFnczsgYnVzLW1hc3RlciAlZCwgZGlydHkgJWQoJWQpIGN1cnJlbnQgJWQoJWQpXG4iLAorCQkJCQl2cC0+ZnVsbF9idXNfbWFzdGVyX3R4LAorCQkJCQl2cC0+ZGlydHlfdHgsIHZwLT5kaXJ0eV90eCAlIFRYX1JJTkdfU0laRSwKKwkJCQkJdnAtPmN1cl90eCwgdnAtPmN1cl90eCAlIFRYX1JJTkdfU0laRSk7CisJCQlwcmludGsoS0VSTl9FUlIgIiAgVHJhbnNtaXQgbGlzdCAlOC44eCB2cy4gJXAuXG4iLAorCQkJCSAgIGlubChpb2FkZHIgKyBEb3duTGlzdFB0ciksCisJCQkJICAgJnZwLT50eF9yaW5nW3ZwLT5kaXJ0eV90eCAlIFRYX1JJTkdfU0laRV0pOworCQkJaXNzdWVfYW5kX3dhaXQoZGV2LCBEb3duU3RhbGwpOworCQkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIgICVkOiBAJXAgIGxlbmd0aCAlOC44eCBzdGF0dXMgJTguOHhcbiIsIGksCisJCQkJCSAgICZ2cC0+dHhfcmluZ1tpXSwKKyNpZiBET19aRVJPQ09QWQorCQkJCQkgICBsZTMyX3RvX2NwdSh2cC0+dHhfcmluZ1tpXS5mcmFnWzBdLmxlbmd0aCksCisjZWxzZQorCQkJCQkgICBsZTMyX3RvX2NwdSh2cC0+dHhfcmluZ1tpXS5sZW5ndGgpLAorI2VuZGlmCisJCQkJCSAgIGxlMzJfdG9fY3B1KHZwLT50eF9yaW5nW2ldLnN0YXR1cykpOworCQkJfQorCQkJaWYgKCFzdGFsbGVkKQorCQkJCW91dHcoRG93blVuc3RhbGwsIGlvYWRkciArIEVMM19DTUQpOworCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnZvcnRleF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpIHsJLyogQUtQTTogVXNlZCB0byBiZSBuZXRpZl9ydW5uaW5nICovCisJCXNwaW5fbG9ja19pcnFzYXZlICgmdnAtPmxvY2ssIGZsYWdzKTsKKwkJdXBkYXRlX3N0YXRzKGRldi0+YmFzZV9hZGRyLCBkZXYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmdnAtPmxvY2ssIGZsYWdzKTsKKwl9CisJcmV0dXJuICZ2cC0+c3RhdHM7Cit9CisKKy8qICBVcGRhdGUgc3RhdGlzdGljcy4KKwlVbmxpa2Ugd2l0aCB0aGUgRUwzIHdlIG5lZWQgbm90IHdvcnJ5IGFib3V0IGludGVycnVwdHMgY2hhbmdpbmcKKwl0aGUgd2luZG93IHNldHRpbmcgZnJvbSB1bmRlcm5lYXRoIHVzLCBidXQgd2UgbXVzdCBzdGlsbCBndWFyZAorCWFnYWluc3QgYSByYWNlIGNvbmRpdGlvbiB3aXRoIGEgU3RhdHNVcGRhdGUgaW50ZXJydXB0IHVwZGF0aW5nIHRoZQorCXRhYmxlLiAgVGhpcyBpcyBkb25lIGJ5IGNoZWNraW5nIHRoYXQgdGhlIEFTTSAoISkgY29kZSBnZW5lcmF0ZWQgdXNlcworCWF0b21pYyB1cGRhdGVzIHdpdGggJys9Jy4KKwkqLworc3RhdGljIHZvaWQgdXBkYXRlX3N0YXRzKGxvbmcgaW9hZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBvbGRfd2luZG93ID0gaW53KGlvYWRkciArIEVMM19DTUQpOworCisJaWYgKG9sZF93aW5kb3cgPT0gMHhmZmZmKQkvKiBDaGlwIHN1c3BlbmRlZCBvciBlamVjdGVkLiAqLworCQlyZXR1cm47CisJLyogVW5saWtlIHRoZSAzYzV4OSB3ZSBuZWVkIG5vdCB0dXJuIG9mZiBzdGF0cyB1cGRhdGVzIHdoaWxlIHJlYWRpbmcuICovCisJLyogU3dpdGNoIHRvIHRoZSBzdGF0cyB3aW5kb3csIGFuZCByZWFkIGV2ZXJ5dGhpbmcuICovCisJRUwzV0lORE9XKDYpOworCXZwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycwkJKz0gaW5iKGlvYWRkciArIDApOworCXZwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzCQkrPSBpbmIoaW9hZGRyICsgMSk7CisJdnAtPnN0YXRzLmNvbGxpc2lvbnMJCQkrPSBpbmIoaW9hZGRyICsgMyk7CisJdnAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMJCSs9IGluYihpb2FkZHIgKyA0KTsKKwl2cC0+c3RhdHMucnhfZmlmb19lcnJvcnMJCSs9IGluYihpb2FkZHIgKyA1KTsKKwl2cC0+c3RhdHMudHhfcGFja2V0cwkJCSs9IGluYihpb2FkZHIgKyA2KTsKKwl2cC0+c3RhdHMudHhfcGFja2V0cwkJCSs9IChpbmIoaW9hZGRyICsgOSkmMHgzMCkgPDwgNDsKKwkvKiBSeCBwYWNrZXRzCSovCQkJaW5iKGlvYWRkciArIDcpOyAgIC8qIE11c3QgcmVhZCB0byBjbGVhciAqLworCS8qIERvbid0IGJvdGhlciB3aXRoIHJlZ2lzdGVyIDksIGFuIGV4dGVuc2lvbiBvZiByZWdpc3RlcnMgNiY3LgorCSAgIElmIHdlIGRvIHVzZSB0aGUgNiY3IHZhbHVlcyB0aGUgYXRvbWljIHVwZGF0ZSBhc3N1bXB0aW9uIGFib3ZlCisJICAgaXMgaW52YWxpZC4gKi8KKwl2cC0+c3RhdHMucnhfYnl0ZXMgCQkJKz0gaW53KGlvYWRkciArIDEwKTsKKwl2cC0+c3RhdHMudHhfYnl0ZXMgCQkJKz0gaW53KGlvYWRkciArIDEyKTsKKwkvKiBFeHRyYSBzdGF0cyBmb3IgZ2V0X2V0aHRvb2xfc3RhdHMoKSAqLworCXZwLT54c3RhdHMudHhfbXVsdGlwbGVfY29sbGlzaW9ucwkrPSBpbmIoaW9hZGRyICsgMik7CisJdnAtPnhzdGF0cy50eF9kZWZlcnJlZAkJCSs9IGluYihpb2FkZHIgKyA4KTsKKwlFTDNXSU5ET1coNCk7CisJdnAtPnhzdGF0cy5yeF9iYWRfc3NkCQkJKz0gaW5iKGlvYWRkciArIDEyKTsKKworCXsKKwkJdTggdXAgPSBpbmIoaW9hZGRyICsgMTMpOworCQl2cC0+c3RhdHMucnhfYnl0ZXMgKz0gKHVwICYgMHgwZikgPDwgMTY7CisJCXZwLT5zdGF0cy50eF9ieXRlcyArPSAodXAgJiAweGYwKSA8PCAxMjsKKwl9CisKKwlFTDNXSU5ET1cob2xkX3dpbmRvdyA+PiAxMyk7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHZvcnRleF9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2cC0+bG9jaywgZmxhZ3MpOworCUVMM1dJTkRPVyg0KTsKKwlyYyA9IG1paV9ud2F5X3Jlc3RhcnQoJnZwLT5taWkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdTMyIHZvcnRleF9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdnAtPmxvY2ssIGZsYWdzKTsKKwlFTDNXSU5ET1coNCk7CisJcmMgPSBtaWlfbGlua19vaygmdnAtPm1paSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnAtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdm9ydGV4X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZwLT5sb2NrLCBmbGFncyk7CisJRUwzV0lORE9XKDQpOworCXJjID0gbWlpX2V0aHRvb2xfZ3NldCgmdnAtPm1paSwgY21kKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB2b3J0ZXhfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdnAtPmxvY2ssIGZsYWdzKTsKKwlFTDNXSU5ET1coNCk7CisJcmMgPSBtaWlfZXRodG9vbF9zc2V0KCZ2cC0+bWlpLCBjbWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdTMyIHZvcnRleF9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gdm9ydGV4X2RlYnVnOworfQorCitzdGF0aWMgdm9pZCB2b3J0ZXhfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYmcpCit7CisJdm9ydGV4X2RlYnVnID0gZGJnOworfQorCitzdGF0aWMgaW50IHZvcnRleF9nZXRfc3RhdHNfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gVk9SVEVYX05VTV9TVEFUUzsKK30KKworc3RhdGljIHZvaWQgdm9ydGV4X2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1NjQgKmRhdGEpCit7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2cC0+bG9jaywgZmxhZ3MpOworCXVwZGF0ZV9zdGF0cyhkZXYtPmJhc2VfYWRkciwgZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cC0+bG9jaywgZmxhZ3MpOworCisJZGF0YVswXSA9IHZwLT54c3RhdHMudHhfZGVmZXJyZWQ7CisJZGF0YVsxXSA9IHZwLT54c3RhdHMudHhfbXVsdGlwbGVfY29sbGlzaW9uczsKKwlkYXRhWzJdID0gdnAtPnhzdGF0cy5yeF9iYWRfc3NkOworfQorCisKK3N0YXRpYyB2b2lkIHZvcnRleF9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqZGF0YSkKK3sKKwlzd2l0Y2ggKHN0cmluZ3NldCkgeworCWNhc2UgRVRIX1NTX1NUQVRTOgorCQltZW1jcHkoZGF0YSwgJmV0aHRvb2xfc3RhdHNfa2V5cywgc2l6ZW9mKGV0aHRvb2xfc3RhdHNfa2V5cykpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOX09OKDEpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZvcnRleF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJaWYgKFZPUlRFWF9QQ0kodnApKSB7CisJCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoVk9SVEVYX1BDSSh2cCkpKTsKKwl9IGVsc2UgeworCQlpZiAoVk9SVEVYX0VJU0EodnApKQorCQkJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgdnAtPmdlbmRldi0+YnVzX2lkKTsKKwkJZWxzZQorCQkJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIkVJU0EgMHglbHggJWQiLAorCQkJCQlkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB2b3J0ZXhfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IHZvcnRleF9nZXRfZHJ2aW5mbywKKwkuZ2V0X3N0cmluZ3MgICAgICAgICAgICA9IHZvcnRleF9nZXRfc3RyaW5ncywKKwkuZ2V0X21zZ2xldmVsICAgICAgICAgICA9IHZvcnRleF9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbCAgICAgICAgICAgPSB2b3J0ZXhfc2V0X21zZ2xldmVsLAorCS5nZXRfZXRodG9vbF9zdGF0cyAgICAgID0gdm9ydGV4X2dldF9ldGh0b29sX3N0YXRzLAorCS5nZXRfc3RhdHNfY291bnQgICAgICAgID0gdm9ydGV4X2dldF9zdGF0c19jb3VudCwKKwkuZ2V0X3NldHRpbmdzICAgICAgICAgICA9IHZvcnRleF9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncyAgICAgICAgICAgPSB2b3J0ZXhfc2V0X3NldHRpbmdzLAorCS5nZXRfbGluayAgICAgICAgICAgICAgID0gdm9ydGV4X2dldF9saW5rLAorCS5ud2F5X3Jlc2V0ICAgICAgICAgICAgID0gdm9ydGV4X253YXlfcmVzZXQsCit9OworCisjaWZkZWYgQ09ORklHX1BDSQorLyoKKyAqCU11c3QgcG93ZXIgdGhlIGRldmljZSB1cCB0byBkbyBNRElPIG9wZXJhdGlvbnMKKyAqLworc3RhdGljIGludCB2b3J0ZXhfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc3RhdGUgPSAwOworCisJaWYoVk9SVEVYX1BDSSh2cCkpCisJCXN0YXRlID0gVk9SVEVYX1BDSSh2cCktPmN1cnJlbnRfc3RhdGU7CisKKwkvKiBUaGUga2VybmVsIGNvcmUgcmVhbGx5IHNob3VsZCBoYXZlIHBjaV9nZXRfcG93ZXJfc3RhdGUoKSAqLworCisJaWYoc3RhdGUgIT0gMCkKKwkJcGNpX3NldF9wb3dlcl9zdGF0ZShWT1JURVhfUENJKHZwKSwgUENJX0QwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdnAtPmxvY2ssIGZsYWdzKTsKKwlFTDNXSU5ET1coNCk7CisJZXJyID0gZ2VuZXJpY19taWlfaW9jdGwoJnZwLT5taWksIGlmX21paShycSksIGNtZCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnAtPmxvY2ssIGZsYWdzKTsKKwlpZihzdGF0ZSAhPSAwKQorCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKFZPUlRFWF9QQ0kodnApLCBzdGF0ZSk7CisKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKKworLyogUHJlLUN5Y2xvbmUgY2hpcHMgaGF2ZSBubyBkb2N1bWVudGVkIG11bHRpY2FzdCBmaWx0ZXIsIHNvIHRoZSBvbmx5CisgICBtdWx0aWNhc3Qgc2V0dGluZyBpcyB0byByZWNlaXZlIGFsbCBtdWx0aWNhc3QgZnJhbWVzLiAgQXQgbGVhc3QKKyAgIHRoZSBjaGlwIGhhcyBhIHZlcnkgY2xlYW4gd2F5IHRvIHNldCB0aGUgbW9kZSwgdW5saWtlIG1hbnkgb3RoZXJzLiAqLworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBuZXdfbW9kZTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJaWYgKHZvcnRleF9kZWJ1ZyA+IDApCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBTZXR0aW5nIHByb21pc2N1b3VzIG1vZGUuXG4iLCBkZXYtPm5hbWUpOworCQluZXdfbW9kZSA9IFNldFJ4RmlsdGVyfFJ4U3RhdGlvbnxSeE11bHRpY2FzdHxSeEJyb2FkY2FzdHxSeFByb207CisJfSBlbHNlCWlmICgoZGV2LT5tY19saXN0KSAgfHwgIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQluZXdfbW9kZSA9IFNldFJ4RmlsdGVyfFJ4U3RhdGlvbnxSeE11bHRpY2FzdHxSeEJyb2FkY2FzdDsKKwl9IGVsc2UKKwkJbmV3X21vZGUgPSBTZXRSeEZpbHRlciB8IFJ4U3RhdGlvbiB8IFJ4QnJvYWRjYXN0OworCisJb3V0dyhuZXdfbW9kZSwgaW9hZGRyICsgRUwzX0NNRCk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKKy8qIFNldHVwIHRoZSBjYXJkIHNvIHRoYXQgaXQgY2FuIHJlY2VpdmUgZnJhbWVzIHdpdGggYW4gODAyLjFxIFZMQU4gdGFnLgorICAgTm90ZSB0aGF0IHRoaXMgbXVzdCBiZSBkb25lIGFmdGVyIGVhY2ggUnhSZXNldCBkdWUgdG8gc29tZSBiYWNrd2FyZHMKKyAgIGNvbXBhdGliaWxpdHkgbG9naWMgaW4gdGhlIEN5Y2xvbmUgYW5kIFRvcm5hZG8gQVNJQ3MgKi8KKworLyogVGhlIEV0aGVybmV0IFR5cGUgdXNlZCBmb3IgODAyLjFxIHRhZ2dlZCBmcmFtZXMgKi8KKyNkZWZpbmUgVkxBTl9FVEhFUl9UWVBFIDB4ODEwMAorCitzdGF0aWMgdm9pZCBzZXRfODAyMXFfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IG9sZF93aW5kb3cgPSBpbncoaW9hZGRyICsgRUwzX0NNRCk7CisJaW50IG1hY19jdHJsOworCisJaWYgKCh2cC0+ZHJ2X2ZsYWdzJklTX0NZQ0xPTkUpIHx8ICh2cC0+ZHJ2X2ZsYWdzJklTX1RPUk5BRE8pKSB7CisJCS8qIGN5Y2xvbmUgYW5kIHRvcm5hZG8gY2hpcHNldHMgY2FuIHJlY29nbml6ZSA4MDIuMXEKKwkJICogdGFnZ2VkIGZyYW1lcyBhbmQgdHJlYXQgdGhlbSBjb3JyZWN0bHkgKi8KKworCQlpbnQgbWF4X3BrdF9zaXplID0gZGV2LT5tdHUrMTQ7CS8qIE1UVStFdGhlcm5ldCBoZWFkZXIgKi8KKwkJaWYgKGVuYWJsZSkKKwkJCW1heF9wa3Rfc2l6ZSArPSA0OwkvKiA4MDIuMVEgVkxBTiB0YWcgKi8KKworCQlFTDNXSU5ET1coMyk7CisJCW91dHcobWF4X3BrdF9zaXplLCBpb2FkZHIrV24zX01heFBrdFNpemUpOworCisJCS8qIHNldCBWbGFuRXRoZXJUeXBlIHRvIGxldCB0aGUgaGFyZHdhcmUgY2hlY2tzdW1taW5nCisJCSAgIHRyZWF0IHRhZ2dlZCBmcmFtZXMgY29ycmVjdGx5ICovCisJCUVMM1dJTkRPVyg3KTsKKwkJb3V0dyhWTEFOX0VUSEVSX1RZUEUsIGlvYWRkcitXbjdfVmxhbkV0aGVyVHlwZSk7CisJfSBlbHNlIHsKKwkJLyogb24gb2xkZXIgY2FyZHMgd2UgaGF2ZSB0byBlbmFibGUgbGFyZ2UgZnJhbWVzICovCisKKwkJdnAtPmxhcmdlX2ZyYW1lcyA9IGRldi0+bXR1ID4gMTUwMCB8fCBlbmFibGU7CisKKwkJRUwzV0lORE9XKDMpOworCQltYWNfY3RybCA9IGludyhpb2FkZHIrV24zX01BQ19DdHJsKTsKKwkJaWYgKHZwLT5sYXJnZV9mcmFtZXMpCisJCQltYWNfY3RybCB8PSAweDQwOworCQllbHNlCisJCQltYWNfY3RybCAmPSB+MHg0MDsKKwkJb3V0dyhtYWNfY3RybCwgaW9hZGRyK1duM19NQUNfQ3RybCk7CisJfQorCisJRUwzV0lORE9XKG9sZF93aW5kb3cpOworfQorI2Vsc2UKKworc3RhdGljIHZvaWQgc2V0XzgwMjFxX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGVuYWJsZSkKK3sKK30KKworCisjZW5kaWYKKworLyogTUlJIHRyYW5zY2VpdmVyIGNvbnRyb2wgc2VjdGlvbi4KKyAgIFJlYWQgYW5kIHdyaXRlIHRoZSBNSUkgcmVnaXN0ZXJzIHVzaW5nIHNvZnR3YXJlLWdlbmVyYXRlZCBzZXJpYWwKKyAgIE1ESU8gcHJvdG9jb2wuICBTZWUgdGhlIE1JSSBzcGVjaWZpY2F0aW9ucyBvciBEUDgzODQwQSBkYXRhIHNoZWV0CisgICBmb3IgZGV0YWlscy4gKi8KKworLyogVGhlIG1heGltdW0gZGF0YSBjbG9jayByYXRlIGlzIDIuNSBNaHouICBUaGUgbWluaW11bSB0aW1pbmcgaXMgdXN1YWxseQorICAgbWV0IGJ5IGJhY2stdG8tYmFjayBQQ0kgSS9PIGN5Y2xlcywgYnV0IHdlIGluc2VydCBhIGRlbGF5IHRvIGF2b2lkCisgICAib3ZlcmNsb2NraW5nIiBpc3N1ZXMuICovCisjZGVmaW5lIG1kaW9fZGVsYXkoKSBpbmwobWRpb19hZGRyKQorCisjZGVmaW5lIE1ESU9fU0hJRlRfQ0xLCTB4MDEKKyNkZWZpbmUgTURJT19ESVJfV1JJVEUJMHgwNAorI2RlZmluZSBNRElPX0RBVEFfV1JJVEUwICgweDAwIHwgTURJT19ESVJfV1JJVEUpCisjZGVmaW5lIE1ESU9fREFUQV9XUklURTEgKDB4MDIgfCBNRElPX0RJUl9XUklURSkKKyNkZWZpbmUgTURJT19EQVRBX1JFQUQJMHgwMgorI2RlZmluZSBNRElPX0VOQl9JTgkJMHgwMAorCisvKiBHZW5lcmF0ZSB0aGUgcHJlYW1ibGUgcmVxdWlyZWQgZm9yIGluaXRpYWwgc3luY2hyb25pemF0aW9uIGFuZAorICAgYSBmZXcgb2xkZXIgdHJhbnNjZWl2ZXJzLiAqLworc3RhdGljIHZvaWQgbWRpb19zeW5jKGxvbmcgaW9hZGRyLCBpbnQgYml0cykKK3sKKwlsb25nIG1kaW9fYWRkciA9IGlvYWRkciArIFduNF9QaHlzaWNhbE1nbXQ7CisKKwkvKiBFc3RhYmxpc2ggc3luYyBieSBzZW5kaW5nIGF0IGxlYXN0IDMyIGxvZ2ljIG9uZXMuICovCisJd2hpbGUgKC0tIGJpdHMgPj0gMCkgeworCQlvdXR3KE1ESU9fREFUQV9XUklURTEsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJb3V0dyhNRElPX0RBVEFfV1JJVEUxIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKK3sKKwlpbnQgaTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCByZWFkX2NtZCA9ICgweGY2IDw8IDEwKSB8IChwaHlfaWQgPDwgNSkgfCBsb2NhdGlvbjsKKwl1bnNpZ25lZCBpbnQgcmV0dmFsID0gMDsKKwlsb25nIG1kaW9fYWRkciA9IGlvYWRkciArIFduNF9QaHlzaWNhbE1nbXQ7CisKKwlpZiAobWlpX3ByZWFtYmxlX3JlcXVpcmVkKQorCQltZGlvX3N5bmMoaW9hZGRyLCAzMik7CisKKwkvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDE0OyBpID49IDA7IGktLSkgeworCQlpbnQgZGF0YXZhbCA9IChyZWFkX2NtZCYoMTw8aSkpID8gTURJT19EQVRBX1dSSVRFMSA6IE1ESU9fREFUQV9XUklURTA7CisJCW91dHcoZGF0YXZhbCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlvdXR3KGRhdGF2YWwgfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwkvKiBSZWFkIHRoZSB0d28gdHJhbnNpdGlvbiwgMTYgZGF0YSwgYW5kIHdpcmUtaWRsZSBiaXRzLiAqLworCWZvciAoaSA9IDE5OyBpID4gMDsgaS0tKSB7CisJCW91dHcoTURJT19FTkJfSU4sIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW53KG1kaW9fYWRkcikgJiBNRElPX0RBVEFfUkVBRCkgPyAxIDogMCk7CisJCW91dHcoTURJT19FTkJfSU4gfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwlyZXR1cm4gcmV0dmFsICYgMHgyMDAwMCA/IDB4ZmZmZiA6IHJldHZhbD4+MSAmIDB4ZmZmZjsKK30KKworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKK3sKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCB3cml0ZV9jbWQgPSAweDUwMDIwMDAwIHwgKHBoeV9pZCA8PCAyMykgfCAobG9jYXRpb24gPDwgMTgpIHwgdmFsdWU7CisJbG9uZyBtZGlvX2FkZHIgPSBpb2FkZHIgKyBXbjRfUGh5c2ljYWxNZ210OworCWludCBpOworCisJaWYgKG1paV9wcmVhbWJsZV9yZXF1aXJlZCkKKwkJbWRpb19zeW5jKGlvYWRkciwgMzIpOworCisJLyogU2hpZnQgdGhlIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisJCWludCBkYXRhdmFsID0gKHdyaXRlX2NtZCYoMTw8aSkpID8gTURJT19EQVRBX1dSSVRFMSA6IE1ESU9fREFUQV9XUklURTA7CisJCW91dHcoZGF0YXZhbCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlvdXR3KGRhdGF2YWwgfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwkvKiBMZWF2ZSB0aGUgaW50ZXJmYWNlIGlkbGUuICovCisJZm9yIChpID0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJb3V0dyhNRElPX0VOQl9JTiwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlvdXR3KE1ESU9fRU5CX0lOIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJcmV0dXJuOworfQorDAorLyogQUNQSTogQWR2YW5jZWQgQ29uZmlndXJhdGlvbiBhbmQgUG93ZXIgSW50ZXJmYWNlLiAqLworLyogU2V0IFdha2UtT24tTEFOIG1vZGUgYW5kIHB1dCB0aGUgYm9hcmQgaW50byBEMyAocG93ZXItZG93bikgc3RhdGUuICovCitzdGF0aWMgdm9pZCBhY3BpX3NldF9XT0woc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKHZwLT5lbmFibGVfd29sKSB7CisJCS8qIFBvd2VyIHVwIG9uOiAxPT1Eb3dubG9hZGVkIEZpbHRlciwgMj09TWFnaWMgUGFja2V0cywgND09TGluayBTdGF0dXMuICovCisJCUVMM1dJTkRPVyg3KTsKKwkJb3V0dygyLCBpb2FkZHIgKyAweDBjKTsKKwkJLyogVGhlIFJ4RmlsdGVyIG11c3QgYWNjZXB0IHRoZSBXT0wgZnJhbWVzLiAqLworCQlvdXR3KFNldFJ4RmlsdGVyfFJ4U3RhdGlvbnxSeE11bHRpY2FzdHxSeEJyb2FkY2FzdCwgaW9hZGRyICsgRUwzX0NNRCk7CisJCW91dHcoUnhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCisJCXBjaV9lbmFibGVfd2FrZShWT1JURVhfUENJKHZwKSwgMCwgMSk7CisJfQorCS8qIENoYW5nZSB0aGUgcG93ZXIgc3RhdGUgdG8gRDM7IFJ4RW5hYmxlIGRvZXNuJ3QgdGFrZSBlZmZlY3QuICovCisJcGNpX3NldF9wb3dlcl9zdGF0ZShWT1JURVhfUENJKHZwKSwgUENJX0QzaG90KTsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgdm9ydGV4X3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cDsKKworCWlmICghZGV2KSB7CisJCXByaW50aygidm9ydGV4X3JlbW92ZV9vbmUgY2FsbGVkIGZvciBDb21wYXEgZGV2aWNlIVxuIik7CisJCUJVRygpOworCX0KKworCXZwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIEFLUE06IEZJWE1FOiB3ZSBzaG91bGQgaGF2ZQorCSAqCWlmICh2cC0+Y2JfZm5fYmFzZSkgaW91bm1hcCh2cC0+Y2JfZm5fYmFzZSk7CisJICogaGVyZQorCSAqLworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwlpZiAoVk9SVEVYX1BDSSh2cCkpIHsKKwkJcGNpX3NldF9wb3dlcl9zdGF0ZShWT1JURVhfUENJKHZwKSwgUENJX0QwKTsJLyogR28gYWN0aXZlICovCisJCWlmICh2cC0+cG1fc3RhdGVfdmFsaWQpCisJCQlwY2lfcmVzdG9yZV9zdGF0ZShWT1JURVhfUENJKHZwKSk7CisJCXBjaV9kaXNhYmxlX2RldmljZShWT1JURVhfUENJKHZwKSk7CisJfQorCS8qIFNob3VsZCByZWFsbHkgdXNlIGlzc3VlX2FuZF93YWl0KCkgaGVyZSAqLworCW91dHcoVG90YWxSZXNldCB8ICgodnAtPmRydl9mbGFncyAmIEVFUFJPTV9SRVNFVCkgPyAweDA0IDogMHgxNCksCisJICAgICBkZXYtPmJhc2VfYWRkciArIEVMM19DTUQpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBib29tX3J4X2Rlc2MpICogUlhfUklOR19TSVpFCisJCQkJCQkJKyBzaXplb2Yoc3RydWN0IGJvb21fdHhfZGVzYykgKiBUWF9SSU5HX1NJWkUsCisJCQkJCQl2cC0+cnhfcmluZywKKwkJCQkJCXZwLT5yeF9yaW5nX2RtYSk7CisJaWYgKHZwLT5tdXN0X2ZyZWVfcmVnaW9uKQorCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgdnAtPmlvX3NpemUpOworCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHZvcnRleF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIjNjNTl4IiwKKwkucHJvYmUJCT0gdm9ydGV4X2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aodm9ydGV4X3JlbW92ZV9vbmUpLAorCS5pZF90YWJsZQk9IHZvcnRleF9wY2lfdGJsLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gdm9ydGV4X3N1c3BlbmQsCisJLnJlc3VtZQkJPSB2b3J0ZXhfcmVzdW1lLAorI2VuZGlmCit9OworCisKK3N0YXRpYyBpbnQgdm9ydGV4X2hhdmVfcGNpOworc3RhdGljIGludCB2b3J0ZXhfaGF2ZV9laXNhOworCisKK3N0YXRpYyBpbnQgX19pbml0IHZvcnRleF9pbml0ICh2b2lkKQoreworCWludCBwY2lfcmMsIGVpc2FfcmM7CisKKwlwY2lfcmMgPSBwY2lfbW9kdWxlX2luaXQoJnZvcnRleF9kcml2ZXIpOworCWVpc2FfcmMgPSB2b3J0ZXhfZWlzYV9pbml0KCk7CisKKwlpZiAocGNpX3JjID09IDApCisJCXZvcnRleF9oYXZlX3BjaSA9IDE7CisJaWYgKGVpc2FfcmMgPiAwKQorCQl2b3J0ZXhfaGF2ZV9laXNhID0gMTsKKworCXJldHVybiAodm9ydGV4X2hhdmVfcGNpICsgdm9ydGV4X2hhdmVfZWlzYSkgPyAwIDogLUVOT0RFVjsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgdm9ydGV4X2Vpc2FfY2xlYW51cCAodm9pZCkKK3sKKwlzdHJ1Y3Qgdm9ydGV4X3ByaXZhdGUgKnZwOworCWxvbmcgaW9hZGRyOworCisjaWZkZWYgQ09ORklHX0VJU0EKKwkvKiBUYWtlIGNhcmUgb2YgdGhlIEVJU0EgZGV2aWNlcyAqLworCWVpc2FfZHJpdmVyX3VucmVnaXN0ZXIgKCZ2b3J0ZXhfZWlzYV9kcml2ZXIpOworI2VuZGlmCisJCisJaWYgKGNvbXBhcV9uZXRfZGV2aWNlKSB7CisJCXZwID0gY29tcGFxX25ldF9kZXZpY2UtPnByaXY7CisJCWlvYWRkciA9IGNvbXBhcV9uZXRfZGV2aWNlLT5iYXNlX2FkZHI7CisKKwkJdW5yZWdpc3Rlcl9uZXRkZXYgKGNvbXBhcV9uZXRfZGV2aWNlKTsKKwkJb3V0dyAoVG90YWxSZXNldCwgaW9hZGRyICsgRUwzX0NNRCk7CisJCXJlbGVhc2VfcmVnaW9uIChpb2FkZHIsIFZPUlRFWF9UT1RBTF9TSVpFKTsKKworCQlmcmVlX25ldGRldiAoY29tcGFxX25ldF9kZXZpY2UpOworCX0KK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgdm9ydGV4X2NsZWFudXAgKHZvaWQpCit7CisJaWYgKHZvcnRleF9oYXZlX3BjaSkKKwkJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmdm9ydGV4X2RyaXZlcik7CisJaWYgKHZvcnRleF9oYXZlX2Vpc2EpCisJCXZvcnRleF9laXNhX2NsZWFudXAgKCk7Cit9CisKKworbW9kdWxlX2luaXQodm9ydGV4X2luaXQpOworbW9kdWxlX2V4aXQodm9ydGV4X2NsZWFudXApOworCisMCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtaW5kZW50LWxldmVsOiA0CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDQKKyAqICB0YWItd2lkdGg6IDQKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvNzk5MC5jIGIvZHJpdmVycy9uZXQvNzk5MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YjAyN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC83OTkwLmMKQEAgLTAsMCArMSw2ODEgQEAKKy8qIAorICogNzk5MC5jIC0tIExBTkNFIGV0aGVybmV0IElDIGdlbmVyaWMgcm91dGluZXMuIAorICogVGhpcyBpcyBhbiBhdHRlbXB0IHRvIHNlcGFyYXRlIG91dCB0aGUgYml0cyBvZiB2YXJpb3VzIGV0aGVybmV0CisgKiBkcml2ZXJzIHRoYXQgYXJlIGNvbW1vbiBiZWNhdXNlIHRoZXkgYWxsIHVzZSB0aGUgQU1EIDc5OTAgTEFOQ0UgCisgKiAoTG9jYWwgQXJlYSBOZXR3b3JrIENvbnRyb2xsZXIgZm9yIEV0aGVybmV0KSBjaGlwLgorICoKKyAqIENvcHlyaWdodCAoQykgMDUvMTk5OCBQZXRlciBNYXlkZWxsIDxwbWF5ZGVsbEBjaGlhcmsuZ3JlZW5lbmQub3JnLnVrPgorICoKKyAqIE1vc3Qgb2YgdGhpcyBzdHVmZiB3YXMgb2J0YWluZWQgYnkgbG9va2luZyBhdCBvdGhlciBMQU5DRSBkcml2ZXJzLAorICogaW4gcGFydGljdWxhciBhMjA2NS5bY2hdLiBUaGUgQU1EIEMtTEFOQ0UgZGF0YXNoZWV0IHdhcyBhbHNvIGhlbHBmdWwuCisgKiBOQjogdGhpcyB3YXMgbWFkZSBlYXN5IGJ5IHRoZSBmYWN0IHRoYXQgSmVzIFNvcmVuc2VuIGhhZCBjbGVhbmVkIHVwCisgKiBtb3N0IG9mIGEyMDI1IGFuZCBzdW5sYW5jZSB3aXRoIHRoZSBhaW0gb2YgbWVyZ2luZyB0aGVtLCBzbyB0aGUgCisgKiBjb21tb24gY29kZSB3YXMgcHJldHR5IG9idmlvdXMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKy8qIFVzZWQgZm9yIHRoZSB0ZW1wb3JhbCBpbmV0IGVudHJpZXMgYW5kIHJvdXRpbmcgKi8KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpZmRlZiBDT05GSUdfSFAzMDAKKyNpbmNsdWRlIDxhc20vYmxpbmtlbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICI3OTkwLmgiCisKKyNkZWZpbmUgV1JJVEVSQVAobHAseCkgb3V0X2JlMTYobHAtPmJhc2UgKyBMQU5DRV9SQVAsICh4KSkKKyNkZWZpbmUgV1JJVEVSRFAobHAseCkgb3V0X2JlMTYobHAtPmJhc2UgKyBMQU5DRV9SRFAsICh4KSkKKyNkZWZpbmUgUkVBRFJEUChscCkgaW5fYmUxNihscC0+YmFzZSArIExBTkNFX1JEUCkKKworI2lmIGRlZmluZWQoQ09ORklHX0hQTEFOQ0UpIHx8IGRlZmluZWQoQ09ORklHX0hQTEFOQ0VfTU9EVUxFKQorI2luY2x1ZGUgImhwbGFuY2UuaCIKKworI3VuZGVmIFdSSVRFUkFQCisjdW5kZWYgV1JJVEVSRFAKKyN1bmRlZiBSRUFEUkRQCisKKyNpZiBkZWZpbmVkKENPTkZJR19NVk1FMTQ3X05FVCkgfHwgZGVmaW5lZChDT05GSUdfTVZNRTE0N19ORVRfTU9EVUxFKQorCisvKiBMb3NzYWdlIEZhY3RvciBOaW5lLCBNciBTdWx1LiAqLworI2RlZmluZSBXUklURVJBUChscCx4KSAobHAtPndyaXRlcmFwKGxwLHgpKQorI2RlZmluZSBXUklURVJEUChscCx4KSAobHAtPndyaXRlcmRwKGxwLHgpKQorI2RlZmluZSBSRUFEUkRQKGxwKSAobHAtPnJlYWRyZHAobHApKQorCisjZWxzZQorCisvKiBUaGVzZSBpbmxpbmVzIGNhbiBiZSB1c2VkIGlmIG9ubHkgQ09ORklHX0hQTEFOQ0UgaXMgZGVmaW5lZCAqLworc3RhdGljIGlubGluZSB2b2lkIFdSSVRFUkFQKHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCwgX191MTYgdmFsdWUpCit7CisJZG8geworCQlvdXRfYmUxNihscC0+YmFzZSArIEhQTEFOQ0VfUkVHT0ZGICsgTEFOQ0VfUkFQLCB2YWx1ZSk7CisJfSB3aGlsZSAoKGluXzgobHAtPmJhc2UgKyBIUExBTkNFX1NUQVRVUykgJiBMRV9BQ0spID09IDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgV1JJVEVSRFAoc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwLCBfX3UxNiB2YWx1ZSkKK3sKKwlkbyB7CisJCW91dF9iZTE2KGxwLT5iYXNlICsgSFBMQU5DRV9SRUdPRkYgKyBMQU5DRV9SRFAsIHZhbHVlKTsKKwl9IHdoaWxlICgoaW5fOChscC0+YmFzZSArIEhQTEFOQ0VfU1RBVFVTKSAmIExFX0FDSykgPT0gMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191MTYgUkVBRFJEUChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHApCit7CisJX191MTYgdmFsdWU7CisJZG8geworCQl2YWx1ZSA9IGluX2JlMTYobHAtPmJhc2UgKyBIUExBTkNFX1JFR09GRiArIExBTkNFX1JEUCk7CisJfSB3aGlsZSAoKGluXzgobHAtPmJhc2UgKyBIUExBTkNFX1NUQVRVUykgJiBMRV9BQ0spID09IDApOworCXJldHVybiB2YWx1ZTsKK30KKworI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX0hQTEFOQ0UgfHwgQ09ORklHX0hQTEFOQ0VfTU9EVUxFICovCisKKy8qIGRlYnVnZ2luZyBvdXRwdXQgbWFjcm9zLCB2YXJpb3VzIGZsYXZvdXJzICovCisvKiAjZGVmaW5lIFRFU1RfSElUUyAqLworI2lmZGVmIFVOREVGCisjZGVmaW5lIFBSSU5UX1JJTkdTKCkgXAorZG8geyBcCisgICAgICAgIGludCB0OyBcCisgICAgICAgIGZvciAodD0wOyB0IDwgUlhfUklOR19TSVpFOyB0KyspIHsgXAorICAgICAgICAgICAgICAgIHByaW50aygiUiVkOiBAKCUwMlggJTA0WCkgbGVuICUwNFgsIG1ibGVuICUwNFgsIGJpdHMgJTAyWFxuIixcCisgICAgICAgICAgICAgICAgICAgICAgIHQsIGliLT5icnhfcmluZ1t0XS5ybWQxX2hhZHIsIGliLT5icnhfcmluZ1t0XS5ybWQwLFwKKyAgICAgICAgICAgICAgICAgICAgICAgaWItPmJyeF9yaW5nW3RdLmxlbmd0aCxcCisgICAgICAgICAgICAgICAgICAgICAgIGliLT5icnhfcmluZ1t0XS5tYmxlbmd0aCwgaWItPmJyeF9yaW5nW3RdLnJtZDFfYml0cyk7XAorICAgICAgICB9XAorICAgICAgICBmb3IgKHQ9MDsgdCA8IFRYX1JJTkdfU0laRTsgdCsrKSB7IFwKKyAgICAgICAgICAgICAgICBwcmludGsoIlQlZDogQCglMDJYICUwNFgpIGxlbiAlMDRYLCBtaXNjICUwNFgsIGJpdHMgJTAyWFxuIixcCisgICAgICAgICAgICAgICAgICAgICAgIHQsIGliLT5idHhfcmluZ1t0XS50bWQxX2hhZHIsIGliLT5idHhfcmluZ1t0XS50bWQwLFwKKyAgICAgICAgICAgICAgICAgICAgICAgaWItPmJ0eF9yaW5nW3RdLmxlbmd0aCxcCisgICAgICAgICAgICAgICAgICAgICAgIGliLT5idHhfcmluZ1t0XS5taXNjLCBpYi0+YnR4X3JpbmdbdF0udG1kMV9iaXRzKTtcCisgICAgICAgIH1cCit9IHdoaWxlICgwKSAKKyNlbHNlCisjZGVmaW5lIFBSSU5UX1JJTkdTKCkKKyNlbmRpZiAgICAgICAgCisKKy8qIExvYWQgdGhlIENTUiByZWdpc3RlcnMuIFRoZSBMQU5DRSBoYXMgdG8gYmUgU1RPUHBlZCB3aGVuIHdlIGRvIHRoaXMhICovCitzdGF0aWMgdm9pZCBsb2FkX2NzcnMgKHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCkKK3sKKyAgICAgICAgdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmFpYiA9IGxwLT5sYW5jZV9pbml0X2Jsb2NrOworICAgICAgICBpbnQgbGVwdHI7CisKKyAgICAgICAgbGVwdHIgPSBMQU5DRV9BRERSIChhaWIpOworCisgICAgICAgIFdSSVRFUkFQKGxwLCBMRV9DU1IxKTsgICAgICAgICAgICAgICAgICAgIC8qIGxvYWQgYWRkcmVzcyBvZiBpbml0IGJsb2NrICovCisgICAgICAgIFdSSVRFUkRQKGxwLCBsZXB0ciAmIDB4RkZGRik7CisgICAgICAgIFdSSVRFUkFQKGxwLCBMRV9DU1IyKTsKKyAgICAgICAgV1JJVEVSRFAobHAsIGxlcHRyID4+IDE2KTsKKyAgICAgICAgV1JJVEVSQVAobHAsIExFX0NTUjMpOworICAgICAgICBXUklURVJEUChscCwgbHAtPmJ1c21hc3Rlcl9yZWd2YWwpOyAgICAgICAvKiBzZXQgYnl0ZXN3YXAvQUxFY3RybC9ieXRlIGN0cmwgKi8KKworICAgICAgICAvKiBQb2ludCBiYWNrIHRvIGNzcjAgKi8KKyAgICAgICAgV1JJVEVSQVAobHAsIExFX0NTUjApOworfQorCisvKiAjZGVmaW5lIHRvIDAgb3IgMSBhcHByb3ByaWF0ZWx5ICovCisjZGVmaW5lIERFQlVHX0lSSU5HIDAKKy8qIFNldCB1cCB0aGUgTGFuY2UgUnggYW5kIFR4IHJpbmdzIGFuZCB0aGUgaW5pdCBibG9jayAqLworc3RhdGljIHZvaWQgbGFuY2VfaW5pdF9yaW5nIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICB2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWIgPSBscC0+aW5pdF9ibG9jazsKKyAgICAgICAgdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmFpYjsgLyogZm9yIExBTkNFX0FERFIgY29tcHV0YXRpb25zICovCisgICAgICAgIGludCBsZXB0cjsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgYWliID0gbHAtPmxhbmNlX2luaXRfYmxvY2s7CisKKyAgICAgICAgbHAtPnJ4X25ldyA9IGxwLT50eF9uZXcgPSAwOworICAgICAgICBscC0+cnhfb2xkID0gbHAtPnR4X29sZCA9IDA7CisKKyAgICAgICAgaWItPm1vZGUgPSBMRV9NT19QUk9NOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm9ybWFsLCBlbmFibGUgVHggJiBSeCAqLworCisgICAgICAgIC8qIENvcHkgdGhlIGV0aGVybmV0IGFkZHJlc3MgdG8gdGhlIGxhbmNlIGluaXQgYmxvY2sKKyAgICAgICAgICogTm90aWNlIHRoYXQgd2UgZG8gYSBieXRlc3dhcCBpZiB3ZSdyZSBiaWcgZW5kaWFuLgorICAgICAgICAgKiBbSSB0aGluayB0aGlzIGlzIHRoZSByaWdodCBjcml0ZXJpb247IGF0IGxlYXN0LCBzdW5sYW5jZSwKKyAgICAgICAgICogYTIwNjUgYW5kIGF0YXJpbGFuY2UgZG8gdGhlIGJ5dGVzd2FwIGFuZCBsYW5jZS5jIChQQykgZG9lc24ndC4KKyAgICAgICAgICogSG93ZXZlciwgdGhlIGRhdGFzaGVldCBzYXlzIHRoYXQgdGhlIEJTV0FQIGJpdCBkb2Vzbid0IGFmZmVjdAorICAgICAgICAgKiB0aGUgaW5pdCBibG9jaywgc28gc3VyZWx5IGl0IHNob3VsZCBiZSBsb3cgYnl0ZSBmaXJzdCBmb3IKKyAgICAgICAgICogZXZlcnlib2R5PyBVbS5dIAorICAgICAgICAgKiBXZSBjb3VsZCBkZWZpbmUgdGhlIGliLT5waHlzYWRkciBhcyB0aHJlZSAxNmJpdCB2YWx1ZXMgYW5kCisgICAgICAgICAqIHVzZSAoYWRkclsxXSA8PCA4KSB8IGFkZHJbMF0gJiBjbywgYnV0IHRoaXMgaXMgbW9yZSBlZmZpY2llbnQuCisgICAgICAgICAqLworI2lmZGVmIF9fQklHX0VORElBTgorICAgICAgICBpYi0+cGh5c19hZGRyIFswXSA9IGRldi0+ZGV2X2FkZHIgWzFdOworICAgICAgICBpYi0+cGh5c19hZGRyIFsxXSA9IGRldi0+ZGV2X2FkZHIgWzBdOworICAgICAgICBpYi0+cGh5c19hZGRyIFsyXSA9IGRldi0+ZGV2X2FkZHIgWzNdOworICAgICAgICBpYi0+cGh5c19hZGRyIFszXSA9IGRldi0+ZGV2X2FkZHIgWzJdOworICAgICAgICBpYi0+cGh5c19hZGRyIFs0XSA9IGRldi0+ZGV2X2FkZHIgWzVdOworICAgICAgICBpYi0+cGh5c19hZGRyIFs1XSA9IGRldi0+ZGV2X2FkZHIgWzRdOworI2Vsc2UKKyAgICAgICAgZm9yIChpPTA7IGk8NjsgaSsrKQorICAgICAgICAgICBpYi0+cGh5c19hZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKyNlbmRpZiAgICAgICAgCisKKyAgICAgICAgaWYgKERFQlVHX0lSSU5HKQorICAgICAgICAgICAgICAgIHByaW50ayAoIlRYIHJpbmdzOlxuIik7CisgICAgCisJbHAtPnR4X2Z1bGwgPSAwOworICAgICAgICAvKiBTZXR1cCB0aGUgVHggcmluZyBlbnRyaWVzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoMTw8bHAtPmxhbmNlX2xvZ190eF9idWZzKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbGVwdHIgPSBMQU5DRV9BRERSKCZhaWItPnR4X2J1ZltpXVswXSk7CisgICAgICAgICAgICAgICAgaWItPmJ0eF9yaW5nIFtpXS50bWQwICAgICAgPSBsZXB0cjsKKyAgICAgICAgICAgICAgICBpYi0+YnR4X3JpbmcgW2ldLnRtZDFfaGFkciA9IGxlcHRyID4+IDE2OworICAgICAgICAgICAgICAgIGliLT5idHhfcmluZyBbaV0udG1kMV9iaXRzID0gMDsKKyAgICAgICAgICAgICAgICBpYi0+YnR4X3JpbmcgW2ldLmxlbmd0aCAgICA9IDB4ZjAwMDsgLyogVGhlIG9uZXMgcmVxdWlyZWQgYnkgdG1kMiAqLworICAgICAgICAgICAgICAgIGliLT5idHhfcmluZyBbaV0ubWlzYyAgICAgID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUdfSVJJTkcpIAorICAgICAgICAgICAgICAgICAgIHByaW50ayAoIiVkOiAweCU4Ljh4XG4iLCBpLCBsZXB0cik7CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXR1cCB0aGUgUnggcmluZyBlbnRyaWVzICovCisgICAgICAgIGlmIChERUJVR19JUklORykKKyAgICAgICAgICAgICAgICBwcmludGsgKCJSWCByaW5nczpcbiIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKDE8PGxwLT5sYW5jZV9sb2dfcnhfYnVmcyk7IGkrKykgeworICAgICAgICAgICAgICAgIGxlcHRyID0gTEFOQ0VfQUREUigmYWliLT5yeF9idWZbaV1bMF0pOworCisgICAgICAgICAgICAgICAgaWItPmJyeF9yaW5nIFtpXS5ybWQwICAgICAgPSBsZXB0cjsKKyAgICAgICAgICAgICAgICBpYi0+YnJ4X3JpbmcgW2ldLnJtZDFfaGFkciA9IGxlcHRyID4+IDE2OworICAgICAgICAgICAgICAgIGliLT5icnhfcmluZyBbaV0ucm1kMV9iaXRzID0gTEVfUjFfT1dOOworICAgICAgICAgICAgICAgIC8qIDB4ZjAwMCA9PSBiaXRzIHRoYXQgbXVzdCBiZSBvbmUgKHJlc2VydmVkLCBwcmVzdW1hYmx5KSAqLworICAgICAgICAgICAgICAgIGliLT5icnhfcmluZyBbaV0ubGVuZ3RoICAgID0gLVJYX0JVRkZfU0laRSB8IDB4ZjAwMDsKKyAgICAgICAgICAgICAgICBpYi0+YnJ4X3JpbmcgW2ldLm1ibGVuZ3RoICA9IDA7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHX0lSSU5HKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrICgiJWQ6IDB4JTguOHhcbiIsIGksIGxlcHRyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNldHVwIHRoZSBpbml0aWFsaXphdGlvbiBibG9jayAqLworICAgIAorICAgICAgICAvKiBTZXR1cCByeCBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KKyAgICAgICAgbGVwdHIgPSBMQU5DRV9BRERSKCZhaWItPmJyeF9yaW5nKTsKKyAgICAgICAgaWItPnJ4X2xlbiA9IChscC0+bGFuY2VfbG9nX3J4X2J1ZnMgPDwgMTMpIHwgKGxlcHRyID4+IDE2KTsKKyAgICAgICAgaWItPnJ4X3B0ciA9IGxlcHRyOworICAgICAgICBpZiAoREVCVUdfSVJJTkcpCisgICAgICAgICAgICAgICAgcHJpbnRrICgiUlggcHRyOiAlOC44eFxuIiwgbGVwdHIpOworICAgIAorICAgICAgICAvKiBTZXR1cCB0eCBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KKyAgICAgICAgbGVwdHIgPSBMQU5DRV9BRERSKCZhaWItPmJ0eF9yaW5nKTsKKyAgICAgICAgaWItPnR4X2xlbiA9IChscC0+bGFuY2VfbG9nX3R4X2J1ZnMgPDwgMTMpIHwgKGxlcHRyID4+IDE2KTsKKyAgICAgICAgaWItPnR4X3B0ciA9IGxlcHRyOworICAgICAgICBpZiAoREVCVUdfSVJJTkcpCisgICAgICAgICAgICAgICAgcHJpbnRrICgiVFggcHRyOiAlOC44eFxuIiwgbGVwdHIpOworCisgICAgICAgIC8qIENsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyICovCisgICAgICAgIGliLT5maWx0ZXIgWzBdID0gMDsKKyAgICAgICAgaWItPmZpbHRlciBbMV0gPSAwOworICAgICAgICBQUklOVF9SSU5HUygpOworfQorCisvKiBMQU5DRSBtdXN0IGJlIFNUT1BwZWQgYmVmb3JlIHdlIGRvIHRoaXMsIHRvby4uLiAqLworc3RhdGljIGludCBpbml0X3Jlc3RhcnRfbGFuY2UgKHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCkKK3sKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgV1JJVEVSQVAobHAsIExFX0NTUjApOworICAgICAgICBXUklURVJEUChscCwgTEVfQzBfSU5JVCk7CisKKyAgICAgICAgLyogTmVlZCBhIGhvb2sgaGVyZSBmb3Igc3VubGFuY2UgbGVkbWEgc3R1ZmYgKi8KKworICAgICAgICAvKiBXYWl0IGZvciB0aGUgbGFuY2UgdG8gY29tcGxldGUgaW5pdGlhbGl6YXRpb24gKi8KKyAgICAgICAgZm9yIChpID0gMDsgKGkgPCAxMDApICYmICEoUkVBRFJEUChscCkgJiAoTEVfQzBfRVJSIHwgTEVfQzBfSURPTikpOyBpKyspCisgICAgICAgICAgICAgICAgYmFycmllcigpOworICAgICAgICBpZiAoKGkgPT0gMTAwKSB8fCAoUkVBRFJEUChscCkgJiBMRV9DMF9FUlIpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrICgiTEFOQ0UgdW5vcGVuZWQgYWZ0ZXIgJWQgdGlja3MsIGNzcjA9JTQuNHguXG4iLCBpLCBSRUFEUkRQKGxwKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2xlYXIgSURPTiBieSB3cml0aW5nIGEgIjEiLCBlbmFibGUgaW50ZXJydXB0cyBhbmQgc3RhcnQgbGFuY2UgKi8KKyAgICAgICAgV1JJVEVSRFAobHAsIExFX0MwX0lET04pOworICAgICAgICBXUklURVJEUChscCwgTEVfQzBfSU5FQSB8IExFX0MwX1NUUlQpOworCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhbmNlX3Jlc2V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgc3RhdHVzOworICAgIAorICAgICAgICAvKiBTdG9wIHRoZSBsYW5jZSAqLworICAgICAgICBXUklURVJBUChscCwgTEVfQ1NSMCk7CisgICAgICAgIFdSSVRFUkRQKGxwLCBMRV9DMF9TVE9QKTsKKworICAgICAgICBsb2FkX2NzcnMgKGxwKTsKKyAgICAgICAgbGFuY2VfaW5pdF9yaW5nIChkZXYpOworICAgICAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICAgICAgc3RhdHVzID0gaW5pdF9yZXN0YXJ0X2xhbmNlIChscCk7CisjaWZkZWYgREVCVUdfRFJJVkVSCisgICAgICAgIHByaW50ayAoIkxhbmNlIHJlc3RhcnQ9JWRcbiIsIHN0YXR1cyk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBsYW5jZV9yeCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2s7CisgICAgICAgIHZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yeF9kZXNjICpyZDsKKyAgICAgICAgdW5zaWduZWQgY2hhciBiaXRzOworICAgICAgICBpbnQgbGVuID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIFhYWCBzaHV0IHVwIGdjYyB3YXJuaW5ncyAqLworICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gMDsgICAgICAgIC8qIFhYWCBzaHV0IHVwIGdjYyB3YXJuaW5ncyAqLworI2lmZGVmIFRFU1RfSElUUworICAgICAgICBpbnQgaTsKKyNlbmRpZgorCisjaWZkZWYgVEVTVF9ISVRTCisgICAgICAgIHByaW50ayAoIlsiKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gbHAtPnJ4X25ldykKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoIiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWItPmJyeF9yaW5nIFtpXS5ybWQxX2JpdHMgJiBMRV9SMV9PV04gPyAiXyIgOiAiWCIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoIiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWItPmJyeF9yaW5nIFtpXS5ybWQxX2JpdHMgJiBMRV9SMV9PV04gPyAiLiIgOiAiMSIpOworICAgICAgICB9CisgICAgICAgIHByaW50ayAoIl0iKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19IUDMwMAorCWJsaW5rZW5fbGVkcygweDQwLCAwKTsKKyNlbmRpZiAgICAKKyAgICAgICAgV1JJVEVSRFAobHAsIExFX0MwX1JJTlQgfCBMRV9DMF9JTkVBKTsgICAgIC8qIGFjayBSeCBpbnQsIHJlZW5hYmxlIGludHMgKi8KKyAgICAgICAgZm9yIChyZCA9ICZpYi0+YnJ4X3JpbmcgW2xwLT5yeF9uZXddOyAgICAgLyogRm9yIGVhY2ggUnggcmluZyB3ZSBvd24uLi4gKi8KKyAgICAgICAgICAgICAhKChiaXRzID0gcmQtPnJtZDFfYml0cykgJiBMRV9SMV9PV04pOworICAgICAgICAgICAgIHJkID0gJmliLT5icnhfcmluZyBbbHAtPnJ4X25ld10pIHsKKworICAgICAgICAgICAgICAgIC8qIFdlIGdvdCBhbiBpbmNvbXBsZXRlIGZyYW1lPyAqLworICAgICAgICAgICAgICAgIGlmICgoYml0cyAmIExFX1IxX1BPSykgIT0gTEVfUjFfUE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYml0cyAmIExFX1IxX0VSUikgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogQ291bnQgb25seSB0aGUgZW5kIGZyYW1lIGFzIGEgcnggZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBub3QgdGhlIGJlZ2lubmluZworICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYml0cyAmIExFX1IxX0JVRikgbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYml0cyAmIExFX1IxX0NSQykgbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRzICYgTEVfUjFfT0ZMKSBscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaXRzICYgTEVfUjFfRlJBKSBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYml0cyAmIExFX1IxX0VPUCkgbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAocmQtPm1ibGVuZ3RoICYgMHhmZmYpIC0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrYiA9IGRldl9hbGxvY19za2IgKGxlbisyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNrYiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZGVmZXJyaW5nIHBhY2tldC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmQtPm1ibGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmQtPnJtZDFfYml0cyA9IExFX1IxX09XTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnJ4X25ldyA9IChscC0+cnhfbmV3ICsgMSkgJiBscC0+cnhfcmluZ19tb2RfbWFzazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gZGV2OworICAgICAgICAgICAgICAgICAgICAgICAgc2tiX3Jlc2VydmUgKHNrYiwgMik7ICAgICAgICAgICAvKiAxNiBieXRlIGFsaWduICovCisgICAgICAgICAgICAgICAgICAgICAgICBza2JfcHV0IChza2IsIGxlbik7ICAgICAgICAgICAgIC8qIG1ha2Ugcm9vbSAqLworICAgICAgICAgICAgICAgICAgICAgICAgZXRoX2NvcHlfYW5kX3N1bShza2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopJihpYi0+cnhfYnVmIFtscC0+cnhfbmV3XVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMgKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3J4IChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIFJldHVybiB0aGUgcGFja2V0IHRvIHRoZSBwb29sICovCisgICAgICAgICAgICAgICAgcmQtPm1ibGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICByZC0+cm1kMV9iaXRzID0gTEVfUjFfT1dOOworICAgICAgICAgICAgICAgIGxwLT5yeF9uZXcgPSAobHAtPnJ4X25ldyArIDEpICYgbHAtPnJ4X3JpbmdfbW9kX21hc2s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFuY2VfdHggKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYiA9IGxwLT5pbml0X2Jsb2NrOworICAgICAgICB2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfdHhfZGVzYyAqdGQ7CisgICAgICAgIGludCBpLCBqOworICAgICAgICBpbnQgc3RhdHVzOworCisjaWZkZWYgQ09ORklHX0hQMzAwCisJYmxpbmtlbl9sZWRzKDB4ODAsIDApOworI2VuZGlmCisgICAgICAgIC8qIGNzcjAgaXMgMmYzICovCisgICAgICAgIFdSSVRFUkRQKGxwLCBMRV9DMF9USU5UIHwgTEVfQzBfSU5FQSk7CisgICAgICAgIC8qIGNzcjAgaXMgNzMgKi8KKworICAgICAgICBqID0gbHAtPnR4X29sZDsKKyAgICAgICAgZm9yIChpID0gajsgaSAhPSBscC0+dHhfbmV3OyBpID0gaikgeworICAgICAgICAgICAgICAgIHRkID0gJmliLT5idHhfcmluZyBbaV07CisKKyAgICAgICAgICAgICAgICAvKiBJZiB3ZSBoaXQgYSBwYWNrZXQgbm90IG93bmVkIGJ5IHVzLCBzdG9wICovCisgICAgICAgICAgICAgICAgaWYgKHRkLT50bWQxX2JpdHMgJiBMRV9UMV9PV04pCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAodGQtPnRtZDFfYml0cyAmIExFX1QxX0VSUikgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdGQtPm1pc2M7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgJiBMRV9UM19SVFkpICBscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgJiBMRV9UM19MQ09MKSBscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICYgTEVfVDNfQ0xPUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxwLT5hdXRvX3NlbGVjdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT50cGUgPSAxIC0gbHAtPnRwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIiVzOiBDYXJyaWVyIExvc3QsIHRyeWluZyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBscC0+dHBlPyJUUEUiOiJBVUkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdG9wIHRoZSBsYW5jZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFUkFQKGxwLCBMRV9DU1IwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURVJEUChscCwgTEVfQzBfU1RPUCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuY2VfaW5pdF9yaW5nIChkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfY3NycyAobHApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVzdGFydF9sYW5jZSAobHApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJ1ZmZlciBlcnJvcnMgYW5kIHVuZGVyZmxvd3MgdHVybiBvZmYgdGhlIHRyYW5zbWl0dGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXN0YXJ0IHRoZSBhZGFwdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICYgKExFX1QzX0JVRnxMRV9UM19VRkwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoIiVzOiBUeDogRVJSX0JVRnxFUlJfVUZMLCByZXN0YXJ0aW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0b3AgdGhlIGxhbmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFUkFQKGxwLCBMRV9DU1IwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEVSRFAobHAsIExFX0MwX1NUT1ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5jZV9pbml0X3JpbmcgKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfY3NycyAobHApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X3Jlc3RhcnRfbGFuY2UgKGxwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGQtPnRtZDFfYml0cyAmIExFX1QxX1BPSykgPT0gTEVfVDFfUE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICogU28gd2UgZG9uJ3QgY291bnQgdGhlIHBhY2tldCBtb3JlIHRoYW4gb25jZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgdGQtPnRtZDFfYml0cyAmPSB+KExFX1QxX1BPSyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9uZSBjb2xsaXNpb24gYmVmb3JlIHBhY2tldCB3YXMgc2VudC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZC0+dG1kMV9iaXRzICYgTEVfVDFfRU9ORSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9yZSB0aGFuIG9uZSBjb2xsaXNpb24sIGJlIG9wdGltaXN0aWMuICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGQtPnRtZDFfYml0cyAmIExFX1QxX0VNT1JFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMuY29sbGlzaW9ucyArPSAyOworCisgICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMudHhfcGFja2V0cysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICAgICAgaiA9IChqICsgMSkgJiBscC0+dHhfcmluZ19tb2RfbWFzazsKKyAgICAgICAgfQorICAgICAgICBscC0+dHhfb2xkID0gajsKKyAgICAgICAgV1JJVEVSRFAobHAsIExFX0MwX1RJTlQgfCBMRV9DMF9JTkVBKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorbGFuY2VfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworICAgICAgICBzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgY3NyMDsKKworCXNwaW5fbG9jayAoJmxwLT5kZXZsb2NrKTsKKworICAgICAgICBXUklURVJBUChscCwgTEVfQ1NSMCk7ICAgICAgICAgICAgICAvKiBMQU5DRSBDb250cm9sbGVyIFN0YXR1cyAqLworICAgICAgICBjc3IwID0gUkVBRFJEUChscCk7CisKKyAgICAgICAgUFJJTlRfUklOR1MoKTsKKyAgICAgICAgCisgICAgICAgIGlmICghKGNzcjAgJiBMRV9DMF9JTlRSKSkgeyAgICAgLyogQ2hlY2sgaWYgYW55IGludGVycnVwdCBoYXMgKi8KKwkJc3Bpbl91bmxvY2sgKCZscC0+ZGV2bG9jayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElSUV9OT05FOyAgICAgICAgLyogYmVlbiBnZW5lcmF0ZWQgYnkgdGhlIExhbmNlLiAqLworCX0KKworICAgICAgICAvKiBBY2tub3dsZWRnZSBhbGwgdGhlIGludGVycnVwdCBzb3VyY2VzIEFTQVAgKi8KKyAgICAgICAgV1JJVEVSRFAobHAsIGNzcjAgJiB+KExFX0MwX0lORUF8TEVfQzBfVERNRHxMRV9DMF9TVE9QfExFX0MwX1NUUlR8TEVfQzBfSU5JVCkpOworCisgICAgICAgIGlmICgoY3NyMCAmIExFX0MwX0VSUikpIHsKKyAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgZXJyb3IgY29uZGl0aW9uICovCisgICAgICAgICAgICAgICAgV1JJVEVSRFAobHAsIExFX0MwX0JBQkx8TEVfQzBfRVJSfExFX0MwX01JU1N8TEVfQzBfSU5FQSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3NyMCAmIExFX0MwX1JJTlQpCisgICAgICAgICAgICAgICAgbGFuY2VfcnggKGRldik7CisKKyAgICAgICAgaWYgKGNzcjAgJiBMRV9DMF9USU5UKQorICAgICAgICAgICAgICAgIGxhbmNlX3R4IChkZXYpOworCisgICAgICAgIC8qIExvZyBtaXNjIGVycm9ycy4gKi8KKyAgICAgICAgaWYgKGNzcjAgJiBMRV9DMF9CQUJMKQorICAgICAgICAgICAgICAgIGxwLT5zdGF0cy50eF9lcnJvcnMrKzsgICAgICAgLyogVHggYmFiYmxlLiAqLworICAgICAgICBpZiAoY3NyMCAmIExFX0MwX01JU1MpCisgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2Vycm9ycysrOyAgICAgICAvKiBNaXNzZWQgYSBSeCBmcmFtZS4gKi8KKyAgICAgICAgaWYgKGNzcjAgJiBMRV9DMF9NRVJSKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCIlczogQnVzIG1hc3RlciBhcmJpdHJhdGlvbiBmYWlsdXJlLCBzdGF0dXMgJTQuNHguXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBjc3IwKTsKKyAgICAgICAgICAgICAgICAvKiBSZXN0YXJ0IHRoZSBjaGlwLiAqLworICAgICAgICAgICAgICAgIFdSSVRFUkRQKGxwLCBMRV9DMF9TVFJUKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChscC0+dHhfZnVsbCAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYgKFRYX0JVRkZTX0FWQUlMID49IDApKSB7CisJCWxwLT50eF9mdWxsID0gMDsKKwkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgV1JJVEVSQVAobHAsIExFX0NTUjApOworICAgICAgICBXUklURVJEUChscCwgTEVfQzBfQkFCTHxMRV9DMF9DRVJSfExFX0MwX01JU1N8TEVfQzBfTUVSUnxMRV9DMF9JRE9OfExFX0MwX0lORUEpOworCisJc3Bpbl91bmxvY2sgKCZscC0+ZGV2bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpbnQgbGFuY2Vfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmVzOworICAgICAgICAKKyAgICAgICAgLyogSW5zdGFsbCB0aGUgSW50ZXJydXB0IGhhbmRsZXIuIE9yIHdlIGNvdWxkIHNodW50IHRoaXMgb3V0IHRvIHNwZWNpZmljIGRyaXZlcnM/ICovCisgICAgICAgIGlmIChyZXF1ZXN0X2lycShscC0+aXJxLCBsYW5jZV9pbnRlcnJ1cHQsIDAsIGxwLT5uYW1lLCBkZXYpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOworCisgICAgICAgIHJlcyA9IGxhbmNlX3Jlc2V0KGRldik7CisJc3Bpbl9sb2NrX2luaXQoJmxwLT5kZXZsb2NrKTsKKwluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKworCXJldHVybiByZXM7Cit9CisKK2ludCBsYW5jZV9jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgCisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworICAgICAgICAvKiBTdG9wIHRoZSBMQU5DRSAqLworICAgICAgICBXUklURVJBUChscCwgTEVfQ1NSMCk7CisgICAgICAgIFdSSVRFUkRQKGxwLCBMRV9DMF9TVE9QKTsKKworICAgICAgICBmcmVlX2lycShscC0+aXJxLCBkZXYpOworCisgICAgICAgIHJldHVybiAwOworfQorCit2b2lkIGxhbmNlX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwcmludGsoImxhbmNlX3R4X3RpbWVvdXRcbiIpOworCWxhbmNlX3Jlc2V0KGRldik7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKK30KKworCitpbnQgbGFuY2Vfc3RhcnRfeG1pdCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2s7CisgICAgICAgIGludCBlbnRyeSwgc2tibGVuLCBsZW47CisgICAgICAgIHN0YXRpYyBpbnQgb3V0czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgICAgIGlmICghVFhfQlVGRlNfQVZBSUwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworICAgICAgICBza2JsZW4gPSBza2ItPmxlbjsKKworI2lmZGVmIERFQlVHX0RSSVZFUgorICAgICAgICAvKiBkdW1wIHRoZSBwYWNrZXQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpICUgMTYpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsgKCIlMi4yeCAiLCBza2ItPmRhdGEgW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBsZW4gPSAoc2tibGVuIDw9IEVUSF9aTEVOKSA/IEVUSF9aTEVOIDogc2tibGVuOworICAgICAgICBlbnRyeSA9IGxwLT50eF9uZXcgJiBscC0+dHhfcmluZ19tb2RfbWFzazsKKyAgICAgICAgaWItPmJ0eF9yaW5nIFtlbnRyeV0ubGVuZ3RoID0gKC1sZW4pIHwgMHhmMDAwOworICAgICAgICBpYi0+YnR4X3JpbmcgW2VudHJ5XS5taXNjID0gMDsKKyAgICAKKyAgICAJaWYgKHNrYi0+bGVuIDwgRVRIX1pMRU4pCisgICAgCQltZW1zZXQoKGNoYXIgKikmaWItPnR4X2J1ZltlbnRyeV1bMF0sIDAsIEVUSF9aTEVOKTsKKyAgICAgICAgbWVtY3B5ICgoY2hhciAqKSZpYi0+dHhfYnVmIFtlbnRyeV1bMF0sIHNrYi0+ZGF0YSwgc2tibGVuKTsKKyAgICAKKyAgICAgICAgLyogTm93LCBnaXZlIHRoZSBwYWNrZXQgdG8gdGhlIGxhbmNlICovCisgICAgICAgIGliLT5idHhfcmluZyBbZW50cnldLnRtZDFfYml0cyA9IChMRV9UMV9QT0t8TEVfVDFfT1dOKTsKKyAgICAgICAgbHAtPnR4X25ldyA9IChscC0+dHhfbmV3KzEpICYgbHAtPnR4X3JpbmdfbW9kX21hc2s7CisKKyAgICAgICAgb3V0cysrOworICAgICAgICAvKiBLaWNrIHRoZSBsYW5jZTogdHJhbnNtaXQgbm93ICovCisgICAgICAgIFdSSVRFUkRQKGxwLCBMRV9DMF9JTkVBIHwgTEVfQzBfVERNRCk7CisgICAgICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworICAgICAgICBkZXZfa2ZyZWVfc2tiIChza2IpOworICAgIAorCXNwaW5fbG9ja19pcnFzYXZlICgmbHAtPmRldmxvY2ssIGZsYWdzKTsKKyAgICAgICAgaWYgKFRYX0JVRkZTX0FWQUlMKQorCQluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKwllbHNlCisJCWxwLT50eF9mdWxsID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmbHAtPmRldmxvY2ssIGZsYWdzKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmxhbmNlX2dldF9zdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICByZXR1cm4gJmxwLT5zdGF0czsKK30KKworLyogdGFrZW4gZnJvbSB0aGUgZGVwY2EgZHJpdmVyIHZpYSBhMjA2NS5jICovCitzdGF0aWMgdm9pZCBsYW5jZV9sb2FkX211bHRpY2FzdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2s7CisgICAgICAgIHZvbGF0aWxlIHUxNiAqbWNhc3RfdGFibGUgPSAodTE2ICopJmliLT5maWx0ZXI7CisgICAgICAgIHN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pPWRldi0+bWNfbGlzdDsKKyAgICAgICAgY2hhciAqYWRkcnM7CisgICAgICAgIGludCBpOworICAgICAgICB1MzIgY3JjOworICAgICAgICAKKyAgICAgICAgLyogc2V0IGFsbCBtdWx0aWNhc3QgYml0cyAqLworICAgICAgICBpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSl7IAorICAgICAgICAgICAgICAgIGliLT5maWx0ZXIgWzBdID0gMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICAgICBpYi0+ZmlsdGVyIFsxXSA9IDB4ZmZmZmZmZmY7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8qIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyICovCisgICAgICAgIGliLT5maWx0ZXIgWzBdID0gMDsKKyAgICAgICAgaWItPmZpbHRlciBbMV0gPSAwOworCisgICAgICAgIC8qIEFkZCBhZGRyZXNzZXMgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKyl7CisgICAgICAgICAgICAgICAgYWRkcnMgPSBkbWktPmRtaV9hZGRyOworICAgICAgICAgICAgICAgIGRtaSAgID0gZG1pLT5uZXh0OworCisgICAgICAgICAgICAgICAgLyogbXVsdGljYXN0IGFkZHJlc3M/ICovCisgICAgICAgICAgICAgICAgaWYgKCEoKmFkZHJzICYgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAKKwkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGFkZHJzKTsKKyAgICAgICAgICAgICAgICBjcmMgPSBjcmMgPj4gMjY7CisgICAgICAgICAgICAgICAgbWNhc3RfdGFibGUgW2NyYyA+PiA0XSB8PSAxIDw8IChjcmMgJiAweGYpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKK30KKworCit2b2lkIGxhbmNlX3NldF9tdWx0aWNhc3QgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYiA9IGxwLT5pbml0X2Jsb2NrOworCWludCBzdG9wcGVkOworCisJc3RvcHBlZCA9IG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KTsKKwlpZiAoIXN0b3BwZWQpCisJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisKKyAgICAgICAgd2hpbGUgKGxwLT50eF9vbGQgIT0gbHAtPnR4X25ldykKKyAgICAgICAgICAgICAgICBzY2hlZHVsZSgpOworCisgICAgICAgIFdSSVRFUkFQKGxwLCBMRV9DU1IwKTsKKyAgICAgICAgV1JJVEVSRFAobHAsIExFX0MwX1NUT1ApOworICAgICAgICBsYW5jZV9pbml0X3JpbmcgKGRldik7CisKKyAgICAgICAgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworICAgICAgICAgICAgICAgIGliLT5tb2RlIHw9IExFX01PX1BST007CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWItPm1vZGUgJj0gfkxFX01PX1BST007CisgICAgICAgICAgICAgICAgbGFuY2VfbG9hZF9tdWx0aWNhc3QgKGRldik7CisgICAgICAgIH0KKyAgICAgICAgbG9hZF9jc3JzIChscCk7CisgICAgICAgIGluaXRfcmVzdGFydF9sYW5jZSAobHApOworCisJaWYgKCFzdG9wcGVkKQorCQluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCit2b2lkIGxhbmNlX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrICgmbHAtPmRldmxvY2spOworCVdSSVRFUkFQKGxwLCBMRV9DU1IwKTsKKwlXUklURVJEUChscCwgTEVfQzBfU1RSVCk7CisJc3Bpbl91bmxvY2sgKCZscC0+ZGV2bG9jayk7CisJbGFuY2VfaW50ZXJydXB0KGRldi0+aXJxLCBkZXYsIE5VTEwpOworfQorI2VuZGlmCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0Lzc5OTAuaCBiL2RyaXZlcnMvbmV0Lzc5OTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWFlNTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvNzk5MC5oCkBAIC0wLDAgKzEsMjU2IEBACisvKiAKKyAqIDc5OTAuaCAtLSBMQU5DRSBldGhlcm5ldCBJQyBnZW5lcmljIHJvdXRpbmVzLgorICogVGhpcyBpcyBhbiBhdHRlbXB0IHRvIHNlcGFyYXRlIG91dCB0aGUgYml0cyBvZiB2YXJpb3VzIGV0aGVybmV0CisgKiBkcml2ZXJzIHRoYXQgYXJlIGNvbW1vbiBiZWNhdXNlIHRoZXkgYWxsIHVzZSB0aGUgQU1EIDc5OTAgTEFOQ0UKKyAqIChMb2NhbCBBcmVhIE5ldHdvcmsgQ29udHJvbGxlciBmb3IgRXRoZXJuZXQpIGNoaXAuCisgKiAKKyAqIENvcHlyaWdodCAoQykgMDUvMTk5OCBQZXRlciBNYXlkZWxsIDxwbWF5ZGVsbEBjaGlhcmsuZ3JlZW5lbmQub3JnLnVrPgorICoKKyAqIE1vc3Qgb2YgdGhpcyBzdHVmZiB3YXMgb2J0YWluZWQgYnkgbG9va2luZyBhdCBvdGhlciBMQU5DRSBkcml2ZXJzLAorICogaW4gcGFydGljdWxhciBhMjA2NS5bY2hdLiBUaGUgQU1EIEMtTEFOQ0UgZGF0YXNoZWV0IHdhcyBhbHNvIGhlbHBmdWwuCisgKi8KKworI2lmbmRlZiBfNzk5MF9ICisjZGVmaW5lIF83OTkwX0gKKworLyogVGhlIGxhbmNlIG9ubHkgaGFzIHR3byByZWdpc3RlciBsb2NhdGlvbnMuIFdlIGNvbW11bmljYXRlIG1vc3RseSB2aWEgbWVtb3J5LiAqLworI2RlZmluZSBMQU5DRV9SRFAJMAkvKiBSZWdpc3RlciBEYXRhIFBvcnQgKi8KKyNkZWZpbmUgTEFOQ0VfUkFQCTIJLyogUmVnaXN0ZXIgQWRkcmVzcyBQb3J0ICovCisKKy8qIFRyYW5zbWl0L3JlY2VpdmUgcmluZyBkZWZpbml0aW9ucy4KKyAqIFdlIGFsbG93IHRoZSBzcGVjaWZpYyBkcml2ZXJzIHRvIG92ZXJyaWRlIHRoZXNlIGRlZmF1bHRzIGlmIHRoZXkgd2FudCB0by4KKyAqIE5COiBhY2NvcmRpbmcgdG8gbGFuY2UuYywgaW5jcmVhc2luZyB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgaXMgYSB3YXN0ZQorICogb2Ygc3BhY2UgYW5kIHJlZHVjZXMgdGhlIGNoYW5jZSB0aGF0IGFuIHVwcGVyIGxheWVyIHdpbGwgYmUgYWJsZSB0bworICogcmVvcmRlciBxdWV1ZWQgVHggcGFja2V0cyBiYXNlZCBvbiBwcmlvcml0eS4gW0NsZWFybHkgdGhlcmUgaXMgYSBtaW5pbXVtCisgKiBsaW1pdCB0b286IHRvbyBzbWFsbCBhbmQgd2UgZHJvcCByeCBwYWNrZXRzIGFuZCBjYW4ndCB0eCBhdCBmdWxsIHNwZWVkLl0KKyAqIDQrNCBzZWVtcyB0byBiZSB0aGUgdXN1YWwgc2V0dGluZzsgdGhlIGF0YXJpbGFuY2UgZHJpdmVyIHVzZXMgMyBhbmQgNS4KKyAqLworCisvKiBCbGFzdCEgVGhpcyB3b24ndCB3b3JrLiBUaGUgcHJvYmxlbSBpcyB0aGF0IHdlIGNhbid0IHNwZWNpZnkgYSBkZWZhdWx0CisgKiBzZXR0aW5nIGJlY2F1c2UgdGhhdCB3b3VsZCBjYXVzZSB0aGUgbGFuY2VfaW5pdF9ibG9jayBzdHJ1Y3QgdG8gYmUKKyAqIHRvbyBsb25nIChhbmQgb3ZlcmZsb3cgdGhlIFJBTSBvbiBzaGFyZWQtbWVtb3J5IGNhcmRzIGxpa2UgdGhlIEhQIExBTkNFLgorICovCisjaWZuZGVmIExBTkNFX0xPR19UWF9CVUZGRVJTCisjZGVmaW5lIExBTkNFX0xPR19UWF9CVUZGRVJTIDEKKyNkZWZpbmUgTEFOQ0VfTE9HX1JYX0JVRkZFUlMgMworI2VuZGlmCisKKyNkZWZpbmUgVFhfUklOR19TSVpFICgxPDxMQU5DRV9MT0dfVFhfQlVGRkVSUykKKyNkZWZpbmUgUlhfUklOR19TSVpFICgxPDxMQU5DRV9MT0dfUlhfQlVGRkVSUykKKyNkZWZpbmUgVFhfUklOR19NT0RfTUFTSyAoVFhfUklOR19TSVpFIC0gMSkKKyNkZWZpbmUgUlhfUklOR19NT0RfTUFTSyAoUlhfUklOR19TSVpFIC0gMSkKKyNkZWZpbmUgVFhfUklOR19MRU5fQklUUyAoKExBTkNFX0xPR19UWF9CVUZGRVJTKSA8PCAyOSkKKyNkZWZpbmUgUlhfUklOR19MRU5fQklUUyAoKExBTkNFX0xPR19SWF9CVUZGRVJTKSA8PCAyOSkKKyNkZWZpbmUgUEtUX0JVRkZfU0laRSAoMTU0NCkKKyNkZWZpbmUgUlhfQlVGRl9TSVpFIFBLVF9CVUZGX1NJWkUKKyNkZWZpbmUgVFhfQlVGRl9TSVpFIFBLVF9CVUZGX1NJWkUKKworLyogRWFjaCByZWNlaXZlIGJ1ZmZlciBpcyBkZXNjcmliZWQgYnkgYSByZWNlaXZlIG1lc3NhZ2UgZGVzY3JpcHRvciAoUk1EKSAqLworc3RydWN0IGxhbmNlX3J4X2Rlc2MgeworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IHJtZDA7ICAgICAgICAvKiBsb3cgYWRkcmVzcyBvZiBwYWNrZXQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICBybWQxX2JpdHM7ICAgLyogZGVzY3JpcHRvciBiaXRzICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgcm1kMV9oYWRyOyAgIC8qIGhpZ2ggYWRkcmVzcyBvZiBwYWNrZXQgKi8KKwl2b2xhdGlsZSBzaG9ydCAgICBsZW5ndGg7ICAgIAkgICAgLyogVGhpcyBsZW5ndGggaXMgMnMgY29tcGxlbWVudCAobmVnYXRpdmUpIQorCQkJCSAgICAgKiBCdWZmZXIgbGVuZ3RoCisJCQkJICAgICAqLworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IG1ibGVuZ3RoOyAgICAvKiBBY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkICovCit9OworIAorLyogRGl0dG8gZm9yIFRNRDogKi8KK3N0cnVjdCBsYW5jZV90eF9kZXNjIHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCB0bWQwOyAgICAgICAgLyogbG93IGFkZHJlc3Mgb2YgcGFja2V0ICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgdG1kMV9iaXRzOyAgIC8qIGRlc2NyaXB0b3IgYml0cyAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgIHRtZDFfaGFkcjsgICAvKiBoaWdoIGFkZHJlc3Mgb2YgcGFja2V0ICovCisJdm9sYXRpbGUgc2hvcnQgICAgbGVuZ3RoOyAgICAgICAJICAgIC8qIExlbmd0aCBpcyAycyBjb21wbGVtZW50IChuZWdhdGl2ZSkhICovCisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgbWlzYzsKK307CisKKy8qIFRoZXJlIGFyZSB0aHJlZSBtZW1vcnkgc3RydWN0dXJlcyBhY2Nlc3NlZCBieSB0aGUgTEFOQ0U6CisgKiB0aGUgaW5pdGlhbGl6YXRpb24gYmxvY2ssIHRoZSByZWNlaXZlIGFuZCB0cmFuc21pdCBkZXNjcmlwdG9yIHJpbmdzLAorICogYW5kIHRoZSBkYXRhIGJ1ZmZlcnMgdGhlbXNlbHZlcy4gSW4gZmFjdCB3ZSBtaWdodCBhcyB3ZWxsIHB1dCB0aGUKKyAqIGluaXQgYmxvY2ssdGhlIFR4IGFuZCBSeCByaW5ncyBhbmQgdGhlIGJ1ZmZlcnMgdG9nZXRoZXIgaW4gbWVtb3J5OgorICovCitzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayB7CisgICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IG1vZGU7ICAgICAgICAgICAgLyogUHJlLXNldCBtb2RlIChyZWcuIDE1KSAqLworICAgICAgICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHBoeXNfYWRkcls2XTsgICAgIC8qIFBoeXNpY2FsIGV0aGVybmV0IGFkZHJlc3MgKi8KKyAgICAgICAgdm9sYXRpbGUgdW5zaWduZWQgZmlsdGVyWzJdOyAgICAgICAgICAgICAvKiBNdWx0aWNhc3QgZmlsdGVyICg2NCBiaXRzKSAqLworCisgICAgICAgIC8qIFJlY2VpdmUgYW5kIHRyYW5zbWl0IHJpbmcgYmFzZSwgYWxvbmcgd2l0aCBleHRyYSBiaXRzLiAqLworICAgICAgICB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCByeF9wdHI7ICAgICAgICAgIC8qIHJlY2VpdmUgZGVzY3JpcHRvciBhZGRyICovCisgICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IHJ4X2xlbjsgICAgICAgICAgLyogcmVjZWl2ZSBsZW4gYW5kIGhpZ2ggYWRkciAqLworICAgICAgICB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCB0eF9wdHI7ICAgICAgICAgIC8qIHRyYW5zbWl0IGRlc2NyaXB0b3IgYWRkciAqLworICAgICAgICB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCB0eF9sZW47ICAgICAgICAgIC8qIHRyYW5zbWl0IGxlbiBhbmQgaGlnaCBhZGRyICovCisgICAgCisgICAgICAgIC8qIFRoZSBUeCBhbmQgUnggcmluZyBlbnRyaWVzIG11c3QgYmUgYWxpZ25lZCBvbiA4LWJ5dGUgYm91bmRhcmllcy4gCisgICAgICAgICAqIFRoaXMgd2lsbCBiZSB0cnVlIGlmIHRoaXMgd2hvbGUgc3RydWN0IGlzIDgtYnl0ZSBhbGlnbmVkLgorICAgICAgICAgKi8KKyAgICAgICAgdm9sYXRpbGUgc3RydWN0IGxhbmNlX3R4X2Rlc2MgYnR4X3JpbmdbVFhfUklOR19TSVpFXTsKKyAgICAgICAgdm9sYXRpbGUgc3RydWN0IGxhbmNlX3J4X2Rlc2MgYnJ4X3JpbmdbUlhfUklOR19TSVpFXTsKKworICAgICAgICB2b2xhdGlsZSBjaGFyICAgdHhfYnVmIFtUWF9SSU5HX1NJWkVdW1RYX0JVRkZfU0laRV07CisgICAgICAgIHZvbGF0aWxlIGNoYXIgICByeF9idWYgW1JYX1JJTkdfU0laRV1bUlhfQlVGRl9TSVpFXTsKKyAgICAgICAgLyogd2UgdXNlIHRoaXMganVzdCB0byBtYWtlIHRoZSBzdHJ1Y3QgYmlnIGVub3VnaCB0aGF0IHdlIGNhbiBtb3ZlIGl0cyBzdGFydGFkZHIKKyAgICAgICAgICogaW4gb3JkZXIgdG8gZm9yY2UgYWxpZ25tZW50IHRvIGFuIGVpZ2h0IGJ5dGUgYm91bmRhcnkuCisgICAgICAgICAqLworfTsKKworLyogVGhpcyBpcyB3aGVyZSB3ZSBrZWVwIGFsbCB0aGUgc3R1ZmYgdGhlIGRyaXZlciBuZWVkcyB0byBrbm93IGFib3V0LgorICogSSdtIGRlZmluaXRlbHkgdW5oYXBweSBhYm91dCB0aGUgbWVjaGFuaXNtIGZvciBhbGxvd2luZyBzcGVjaWZpYworICogZHJpdmVycyB0byBhZGQgdGhpbmdzLi4uCisgKi8KK3N0cnVjdCBsYW5jZV9wcml2YXRlCit7CisgICAgICAgIGNoYXIgKm5hbWU7CisJdW5zaWduZWQgbG9uZyBiYXNlOworICAgICAgICB2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaW5pdF9ibG9jazsgLyogQ1BVIGFkZHJlc3Mgb2YgUkFNICovCisgICAgICAgIHZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICpsYW5jZV9pbml0X2Jsb2NrOyAvKiBMQU5DRSBhZGRyZXNzIG9mIFJBTSAqLworICAgICAgICAKKyAgICAgICAgaW50IHJ4X25ldywgdHhfbmV3OworICAgICAgICBpbnQgcnhfb2xkLCB0eF9vbGQ7CisgICAgICAgIAorICAgICAgICBpbnQgbGFuY2VfbG9nX3J4X2J1ZnMsIGxhbmNlX2xvZ190eF9idWZzOworICAgICAgICBpbnQgcnhfcmluZ19tb2RfbWFzaywgdHhfcmluZ19tb2RfbWFzazsKKyAgICAgICAgCisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworICAgICAgICBpbnQgdHBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUUEUgaXMgc2VsZWN0ZWQgKi8KKyAgICAgICAgaW50IGF1dG9fc2VsZWN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FibGUtc2VsZWN0aW9uIGlzIGJ5IGNhcnJpZXIgKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgYnVzbWFzdGVyX3JlZ3ZhbDsKKworICAgICAgICB1bnNpZ25lZCBpbnQgaXJxOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJUlEgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgCisgICAgICAgIC8qIFRoaXMgaXMgYmVjYXVzZSB0aGUgSFAgTEFOQ0UgaXMgZGlzZ3VzdGluZyBhbmQgeW91IGhhdmUgdG8gY2hlY2sgCisgICAgICAgICAqIGEgRElPLXNwZWNpZmljIHJlZ2lzdGVyIGV2ZXJ5IHRpbWUgeW91IHJlYWQvd3JpdGUgdGhlIExBTkNFIHJlZ3MgOi08CisgICAgICAgICAqIFtjb3VsZCB3ZSBnZXQgYXdheSB3aXRoIG1ha2luZyB0aGVzZSBzb21lIHNvcnQgb2YgbWFjcm8/XQorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCAoKndyaXRlcmFwKSh2b2lkICosIHVuc2lnbmVkIHNob3J0KTsKKyAgICAgICAgdm9pZCAoKndyaXRlcmRwKSh2b2lkICosIHVuc2lnbmVkIHNob3J0KTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgKCpyZWFkcmRwKSh2b2lkICopOworCXNwaW5sb2NrX3QgZGV2bG9jazsKKwljaGFyIHR4X2Z1bGw7Cit9OworCisvKgorICogICAgICAgICAgICAgIEFtNzk5MCBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgTEVfQ1NSMCAgICAgICAgIDB4MDAwMCAgICAgICAgICAvKiBMQU5DRSBDb250cm9sbGVyIFN0YXR1cyAqLworI2RlZmluZSBMRV9DU1IxICAgICAgICAgMHgwMDAxICAgICAgICAgIC8qIElBRFJbMTU6MF0gKGJpdDA9PTAgaWUgd29yZCBhbGlnbmVkKSAqLworI2RlZmluZSBMRV9DU1IyICAgICAgICAgMHgwMDAyICAgICAgICAgIC8qIElBRFJbMjM6MTZdIChoaWdoIGJpdHMgcmVzZXJ2ZWQpICovCisjZGVmaW5lIExFX0NTUjMgICAgICAgICAweDAwMDMgICAgICAgICAgLyogTWlzYyAqLworCisvKgorICoJCUJpdCBkZWZpbml0aW9ucyBmb3IgQ1NSMCAoTEFOQ0UgQ29udHJvbGxlciBTdGF0dXMpCisgKi8KKyNkZWZpbmUgTEVfQzBfRVJSCTB4ODAwMAkJLyogRXJyb3IgPSBCQUJMIHwgQ0VSUiB8IE1JU1MgfCBNRVJSICovCisjZGVmaW5lIExFX0MwX0JBQkwJMHg0MDAwCQkvKiBCYWJibGU6IFRyYW5zbWl0dGVkIHRvbyBtYW55IGJpdHMgKi8KKyNkZWZpbmUgTEVfQzBfQ0VSUgkweDIwMDAJCS8qIE5vIEhlYXJ0YmVhdCAoMTBCQVNFLVQpICovCisjZGVmaW5lIExFX0MwX01JU1MJMHgxMDAwCQkvKiBNaXNzZWQgRnJhbWUgKG5vIHJ4IGJ1ZmZlciB0byBwdXQgaXQgaW4pICovCisjZGVmaW5lIExFX0MwX01FUlIJMHgwODAwCQkvKiBNZW1vcnkgRXJyb3IgKi8KKyNkZWZpbmUgTEVfQzBfUklOVAkweDA0MDAJCS8qIFJlY2VpdmUgSW50ZXJydXB0ICovCisjZGVmaW5lIExFX0MwX1RJTlQJMHgwMjAwCQkvKiBUcmFuc21pdCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgTEVfQzBfSURPTgkweDAxMDAJCS8qIEluaXRpYWxpemF0aW9uIERvbmUgKi8KKyNkZWZpbmUgTEVfQzBfSU5UUgkweDAwODAJCS8qIEludGVycnVwdCBGbGFnIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEJBQkwgfCBNSVNTIHwgTUVSUiB8IFJJTlQgfCBUSU5UIHwgSURPTiAqLworI2RlZmluZSBMRV9DMF9JTkVBCTB4MDA0MAkJLyogSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBMRV9DMF9SWE9OCTB4MDAyMAkJLyogUmVjZWl2ZSBPbiAqLworI2RlZmluZSBMRV9DMF9UWE9OCTB4MDAxMAkJLyogVHJhbnNtaXQgT24gKi8KKyNkZWZpbmUgTEVfQzBfVERNRAkweDAwMDgJCS8qIFRyYW5zbWl0IERlbWFuZCAqLworI2RlZmluZSBMRV9DMF9TVE9QCTB4MDAwNAkJLyogU3RvcCAqLworI2RlZmluZSBMRV9DMF9TVFJUCTB4MDAwMgkJLyogU3RhcnQgKi8KKyNkZWZpbmUgTEVfQzBfSU5JVAkweDAwMDEJCS8qIEluaXRpYWxpemUgKi8KKworCisvKgorICoJCUJpdCBkZWZpbml0aW9ucyBmb3IgQ1NSMworICovCisjZGVmaW5lIExFX0MzX0JTV1AJMHgwMDA0CQkvKiBCeXRlIFN3YXAKKwkJCQkJICAgKG9uIGZvciBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIpICovCisjZGVmaW5lIExFX0MzX0FDT04JMHgwMDAyCQkvKiBBTEUgQ29udHJvbAorCQkJCQkgICAob24gZm9yIGFjdGl2ZSBsb3cgQUxFKSAqLworI2RlZmluZSBMRV9DM19CQ09OCTB4MDAwMQkJLyogQnl0ZSBDb250cm9sICovCisKKworLyoKKyAqCQlNb2RlIEZsYWdzCisgKi8KKyNkZWZpbmUgTEVfTU9fUFJPTQkweDgwMDAJCS8qIFByb21pc2N1b3VzIE1vZGUgKi8KKy8qIHRoZXNlIG5leHQgb25lcyAweDQwMDAgLS0gMHgwMDgwIGFyZSBub3QgYXZhaWxhYmxlIG9uIHRoZSBMQU5DRSA3OTkwLAorICogYnV0IHRoZXkgYXJlIGluIE5ldEJTRCdzIGFtNzk5MC5oLCBwcmVzdW1hYmx5IGZvciBiYWNrd2FyZHMtY29tcGF0aWJsZSBjaGlwcworICovCisjZGVmaW5lIExFX01PX0RSQ1ZCQyAgMHg0MDAwICAgICAgICAgIC8qIGRpc2FibGUgcmVjZWl2ZSBicm9hZGNhc3QgKi8KKyNkZWZpbmUgTEVfTU9fRFJDVlBBICAweDIwMDAgICAgICAgICAgLyogZGlzYWJsZSBwaHlzaWNhbCBhZGRyZXNzIGRldGVjdGlvbiAqLworI2RlZmluZSBMRV9NT19ETE5LVFNUIDB4MTAwMCAgICAgICAgICAvKiBkaXNhYmxlIGxpbmsgc3RhdHVzICovCisjZGVmaW5lIExFX01PX0RBUEMgICAgMHgwODAwICAgICAgICAgIC8qIGRpc2FibGUgYXV0b21hdGljIHBvbGFyaXR5IGNvcnJlY3Rpb24gKi8KKyNkZWZpbmUgTEVfTU9fTUVOREVDTCAweDA0MDAgICAgICAgICAgLyogTUVOREVDIGxvb3BiYWNrIG1vZGUgKi8KKyNkZWZpbmUgTEVfTU9fTFJUVFNFTCAweDAyMDAgICAgICAgICAgLyogbG93ZXIgUlggdGhyZXNob2xkIC8gVFggbW9kZSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgTEVfTU9fUFNFTDEgICAweDAxMDAgICAgICAgICAgLyogcG9ydCBzZWxlY3Rpb24gYml0MSAqLworI2RlZmluZSBMRV9NT19QU0VMMCAgIDB4MDA4MCAgICAgICAgICAvKiBwb3J0IHNlbGVjdGlvbiBiaXQwICovCisvKiBhbmQgdGhpcyBvbmUgaXMgZnJvbSB0aGUgQy1MQU5DRSBkYXRhIHNoZWV0Li4uICovCisjZGVmaW5lIExFX01PX0VNQkEgICAgICAweDAwODAgICAgICAgICAgLyogRW5hYmxlIE1vZGlmaWVkIEJhY2tvZmYgQWxnb3JpdGhtIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDLUxBTkNFLCBub3Qgb3JpZ2luYWwgTEFOQ0UpICovCisjZGVmaW5lIExFX01PX0lOVEwJMHgwMDQwCQkvKiBJbnRlcm5hbCBMb29wYmFjayAqLworI2RlZmluZSBMRV9NT19EUlRZCTB4MDAyMAkJLyogRGlzYWJsZSBSZXRyeSAqLworI2RlZmluZSBMRV9NT19GQ09MTAkweDAwMTAJCS8qIEZvcmNlIENvbGxpc2lvbiAqLworI2RlZmluZSBMRV9NT19EWE1URkNTCTB4MDAwOAkJLyogRGlzYWJsZSBUcmFuc21pdCBDUkMgKi8KKyNkZWZpbmUgTEVfTU9fTE9PUAkweDAwMDQJCS8qIExvb3BiYWNrIEVuYWJsZSAqLworI2RlZmluZSBMRV9NT19EVFgJMHgwMDAyCQkvKiBEaXNhYmxlIFRyYW5zbWl0dGVyICovCisjZGVmaW5lIExFX01PX0RSWAkweDAwMDEJCS8qIERpc2FibGUgUmVjZWl2ZXIgKi8KKworCisvKgorICoJCVJlY2VpdmUgRmxhZ3MKKyAqLworI2RlZmluZSBMRV9SMV9PV04JMHg4MAkJLyogTEFOQ0Ugb3ducyB0aGUgZGVzY3JpcHRvciAqLworI2RlZmluZSBMRV9SMV9FUlIJMHg0MAkJLyogRXJyb3IgKi8KKyNkZWZpbmUgTEVfUjFfRlJBCTB4MjAJCS8qIEZyYW1pbmcgRXJyb3IgKi8KKyNkZWZpbmUgTEVfUjFfT0ZMCTB4MTAJCS8qIE92ZXJmbG93IEVycm9yICovCisjZGVmaW5lIExFX1IxX0NSQwkweDA4CQkvKiBDUkMgRXJyb3IgKi8KKyNkZWZpbmUgTEVfUjFfQlVGCTB4MDQJCS8qIEJ1ZmZlciBFcnJvciAqLworI2RlZmluZSBMRV9SMV9TT1AJMHgwMgkJLyogU3RhcnQgb2YgUGFja2V0ICovCisjZGVmaW5lIExFX1IxX0VPUAkweDAxCQkvKiBFbmQgb2YgUGFja2V0ICovCisjZGVmaW5lIExFX1IxX1BPSyAgICAgICAweDAzCQkvKiBQYWNrZXQgaXMgY29tcGxldGU6IFNPUCArIEVPUCAqLworCisKKy8qCisgKgkJVHJhbnNtaXQgRmxhZ3MKKyAqLworI2RlZmluZSBMRV9UMV9PV04JMHg4MAkJLyogTEFOQ0Ugb3ducyB0aGUgZGVzY3JpcHRvciAqLworI2RlZmluZSBMRV9UMV9FUlIJMHg0MAkJLyogRXJyb3IgKi8KKyNkZWZpbmUgTEVfVDFfUkVTCTB4MjAJCS8qIFJlc2VydmVkLCBMQU5DRSB3cml0ZXMgdGhpcyB3aXRoIGEgemVybyAqLworI2RlZmluZSBMRV9UMV9FTU9SRQkweDEwCQkvKiBNb3JlIHRoYW4gb25lIHJldHJ5IG5lZWRlZCAqLworI2RlZmluZSBMRV9UMV9FT05FCTB4MDgJCS8qIE9uZSByZXRyeSBuZWVkZWQgKi8KKyNkZWZpbmUgTEVfVDFfRURFRgkweDA0CQkvKiBEZWZlcnJlZCAqLworI2RlZmluZSBMRV9UMV9TT1AJMHgwMgkJLyogU3RhcnQgb2YgUGFja2V0ICovCisjZGVmaW5lIExFX1QxX0VPUAkweDAxCQkvKiBFbmQgb2YgUGFja2V0ICovCisjZGVmaW5lIExFX1QxX1BPSwkweDAzCQkvKiBQYWNrZXQgaXMgY29tcGxldGU6IFNPUCArIEVPUCAqLworCisvKgorICoJCUVycm9yIEZsYWdzCisgKi8KKyNkZWZpbmUgTEVfVDNfQlVGIAkweDgwMDAJCS8qIEJ1ZmZlciBFcnJvciAqLworI2RlZmluZSBMRV9UM19VRkwgCTB4NDAwMAkJLyogVW5kZXJmbG93IEVycm9yICovCisjZGVmaW5lIExFX1QzX0xDT0wgCTB4MTAwMAkJLyogTGF0ZSBDb2xsaXNpb24gKi8KKyNkZWZpbmUgTEVfVDNfQ0xPUyAJMHgwODAwCQkvKiBMb3NzIG9mIENhcnJpZXIgKi8KKyNkZWZpbmUgTEVfVDNfUlRZIAkweDA0MDAJCS8qIFJldHJ5IEVycm9yICovCisjZGVmaW5lIExFX1QzX1REUgkweDAzZmYJCS8qIFRpbWUgRG9tYWluIFJlZmxlY3RvbWV0cnkgKi8KKworLyogTWlzY2VsbGFuZW91cyB1c2VmdWwgbWFjcm9zICovCisKKyNkZWZpbmUgVFhfQlVGRlNfQVZBSUwgKChscC0+dHhfb2xkPD1scC0+dHhfbmV3KT9cCisgICAgICAgICAgICAgICAgICAgICAgICBscC0+dHhfb2xkK2xwLT50eF9yaW5nX21vZF9tYXNrLWxwLT50eF9uZXc6XAorICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnR4X29sZCAtIGxwLT50eF9uZXctMSkKKworLyogVGhlIExBTkNFIG9ubHkgdXNlcyAyNCBiaXQgYWRkcmVzc2VzLiBUaGlzIGRvZXMgdGhlIG9idmlvdXMgdGhpbmcuICovCisjZGVmaW5lIExBTkNFX0FERFIoeCkgKChpbnQpKHgpICYgfjB4ZmYwMDAwMDApCisKKy8qIE5vdyB0aGUgcHJvdG90eXBlcyB3ZSBleHBvcnQgKi8KK2V4dGVybiBpbnQgbGFuY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgbGFuY2VfY2xvc2UgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBsYW5jZV9zdGFydF94bWl0IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbGFuY2VfZ2V0X3N0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGxhbmNlX3NldF9tdWx0aWNhc3QgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgbGFuY2VfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorZXh0ZXJuIHZvaWQgbGFuY2VfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorCisjZW5kaWYgLyogbmRlZiBfNzk5MF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC84MTM5Y3AuYyBiL2RyaXZlcnMvbmV0LzgxMzljcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YzZhODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC84MTM5Y3AuYwpAQCAtMCwwICsxLDE5MDQgQEAKKy8qIDgxMzljcC5jOiBBIExpbnV4IFBDSSBFdGhlcm5ldCBkcml2ZXIgZm9yIHRoZSBSZWFsVGVrIDgxMzlDKyBjaGlwcy4gKi8KKy8qCisJQ29weXJpZ2h0IDIwMDEtMjAwNCBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisKKwlDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKSBbdGczLmNdCisJQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkgW3N1bmdlbS5jXQorCUNvcHlyaWdodCAyMDAxIE1hbmZyZWQgU3ByYXVsCQkJCSAgICBbbmF0c2VtaS5jXQorCUNvcHlyaWdodCAxOTk5LTIwMDEgYnkgRG9uYWxkIEJlY2tlci4JCQkgICAgW25hdHNlbWkuY10KKyAgICAgICAJV3JpdHRlbiAxOTk3LTIwMDEgYnkgRG9uYWxkIEJlY2tlci4JCQkgICAgWzgxMzl0b28uY10KKwlDb3B5cmlnaHQgMTk5OC0yMDAxIGJ5IEplcyBTb3JlbnNlbiwgPGplc0B0cmFpbmVkLW1vbmtleS5vcmc+LiBbYWNlbmljLmNdCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisJdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKwlEcml2ZXJzIGJhc2VkIG9uIG9yIGRlcml2ZWQgZnJvbSB0aGlzIGNvZGUgZmFsbCB1bmRlciB0aGUgR1BMIGFuZCBtdXN0CisJcmV0YWluIHRoZSBhdXRob3JzaGlwLCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlLiAgVGhpcyBmaWxlIGlzIG5vdAorCWEgY29tcGxldGUgcHJvZ3JhbSBhbmQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nCisJc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuCisKKwlTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCUNvbnRyaWJ1dG9yczoKKwkKKwkJV2FrZS1vbi1MQU4gc3VwcG9ydCAtIEZlbGlwZSBEYW1hc2lvIDxmZWxpcGV3ZEB0ZXJyYS5jb20uYnI+CisJCVBDSSBzdXNwZW5kL3Jlc3VtZSAgLSBGZWxpcGUgRGFtYXNpbyA8ZmVsaXBld2RAdGVycmEuY29tLmJyPgorCQlMaW5rQ2hnIGludGVycnVwdCAgIC0gRmVsaXBlIERhbWFzaW8gPGZlbGlwZXdkQHRlcnJhLmNvbS5icj4KKwkJCQorCVRPRE86CisJKiBUZXN0IFR4IGNoZWNrc3VtbWluZyB0aG9yb3VnaGx5CisJKiBJbXBsZW1lbnQgZGV2LT50eF90aW1lb3V0CisKKwlMb3cgcHJpb3JpdHkgVE9ETzoKKwkqIENvbXBsZXRlIHJlc2V0IG9uIFBjaUVycgorCSogQ29uc2lkZXIgUnggaW50ZXJydXB0IG1pdGlnYXRpb24gdXNpbmcgVGltZXJJbnRyCisJKiBJbnZlc3RpZ2F0ZSB1c2luZyBza2ItPnByaW9yaXR5IHdpdGggaC93IFZMQU4gcHJpb3JpdHkKKwkqIEludmVzdGlnYXRlIHVzaW5nIEhpZ2ggUHJpb3JpdHkgVHggUXVldWUgd2l0aCBza2ItPnByaW9yaXR5CisJKiBBZGp1c3QgUnggRklGTyB0aHJlc2hvbGQgYW5kIE1heCBSeCBETUEgYnVyc3Qgb24gUnggRklGTyBlcnJvcgorCSogQWRqdXN0IFR4IEZJRk8gdGhyZXNob2xkIGFuZCBNYXggVHggRE1BIGJ1cnN0IG9uIFR4IEZJRk8gZXJyb3IKKwkqIEltcGxlbWVudCBUeCBzb2Z0d2FyZSBpbnRlcnJ1cHQgbWl0aWdhdGlvbiB2aWEKKwkgIFR4IGRlc2NyaXB0b3IgYml0CisJKiBUaGUgcmVhbCBtaW5pbXVtIG9mIENQX01JTl9NVFUgaXMgNCBieXRlcy4gIEhvd2V2ZXIsCisJICBmb3IgdGhpcyB0byBiZSBzdXBwb3J0ZWQsIG9uZSBtdXN0KD8pIHR1cm4gb24gcGFja2V0IHBhZGRpbmcuCisJKiBTdXBwb3J0IGV4dGVybmFsIE1JSSB0cmFuc2NlaXZlcnMgKHBhdGNoIGF2YWlsYWJsZSkKKworCU5PVEVTOgorCSogVFggY2hlY2tzdW1taW5nIGlzIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsLiAgSXQgaXMgb2ZmIGJ5CisJICBkZWZhdWx0LCB1c2UgZXRodG9vbCB0byB0dXJuIGl0IG9uLgorCisgKi8KKworI2RlZmluZSBEUlZfTkFNRQkJIjgxMzljcCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JCSIxLjIiCisjZGVmaW5lIERSVl9SRUxEQVRFCQkiTWFyIDIyLCAyMDA0IgorCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKiBWTEFOIHRhZ2dpbmcgZmVhdHVyZSBlbmFibGUvZGlzYWJsZSAqLworI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQorI2RlZmluZSBDUF9WTEFOX1RBR19VU0VEIDEKKyNkZWZpbmUgQ1BfVkxBTl9UWF9UQUcodHhfZGVzYyx2bGFuX3RhZ192YWx1ZSkgXAorCWRvIHsgKHR4X2Rlc2MpLT5vcHRzMiA9ICh2bGFuX3RhZ192YWx1ZSk7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBDUF9WTEFOX1RBR19VU0VEIDAKKyNkZWZpbmUgQ1BfVkxBTl9UWF9UQUcodHhfZGVzYyx2bGFuX3RhZ192YWx1ZSkgXAorCWRvIHsgKHR4X2Rlc2MpLT5vcHRzMiA9IDA7IH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogVGhlc2UgaWRlbnRpZnkgdGhlIGRyaXZlciBiYXNlIHZlcnNpb24gYW5kIG1heSBub3QgYmUgcmVtb3ZlZC4gKi8KK3N0YXRpYyBjaGFyIHZlcnNpb25bXSA9CitLRVJOX0lORk8gRFJWX05BTUUgIjogMTAvMTAwIFBDSSBFdGhlcm5ldCBkcml2ZXIgdiIgRFJWX1ZFUlNJT04gIiAoIiBEUlZfUkVMREFURSAiKVxuIjsKKworTU9EVUxFX0FVVEhPUigiSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSZWFsVGVrIFJUTC04MTM5Qysgc2VyaWVzIDEwLzEwMCBQQ0kgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgZGVidWcgPSAtMTsKK01PRFVMRV9QQVJNIChkZWJ1ZywgImkiKTsKK01PRFVMRV9QQVJNX0RFU0MgKGRlYnVnLCAiODEzOWNwOiBiaXRtYXBwZWQgbWVzc2FnZSBlbmFibGUgbnVtYmVyIik7CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIG11bHRpY2FzdCBhZGRyZXNzZXMgdG8gZmlsdGVyICh2cy4gUngtYWxsLW11bHRpY2FzdCkuCisgICBUaGUgUlRMIGNoaXBzIHVzZSBhIDY0IGVsZW1lbnQgaGFzaCB0YWJsZSBiYXNlZCBvbiB0aGUgRXRoZXJuZXQgQ1JDLiAgKi8KK3N0YXRpYyBpbnQgbXVsdGljYXN0X2ZpbHRlcl9saW1pdCA9IDMyOworTU9EVUxFX1BBUk0gKG11bHRpY2FzdF9maWx0ZXJfbGltaXQsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDIChtdWx0aWNhc3RfZmlsdGVyX2xpbWl0LCAiODEzOWNwOiBtYXhpbXVtIG51bWJlciBvZiBmaWx0ZXJlZCBtdWx0aWNhc3QgYWRkcmVzc2VzIik7CisKKyNkZWZpbmUgUEZYCQkJRFJWX05BTUUgIjogIgorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgRkFMU0UgMAorI2RlZmluZSBUUlVFICghRkFMU0UpCisjZW5kaWYKKworI2RlZmluZSBDUF9ERUZfTVNHX0VOQUJMRQkoTkVUSUZfTVNHX0RSVgkJfCBcCisJCQkJIE5FVElGX01TR19QUk9CRSAJfCBcCisJCQkJIE5FVElGX01TR19MSU5LKQorI2RlZmluZSBDUF9OVU1fU1RBVFMJCTE0CS8qIHN0cnVjdCBjcF9kbWFfc3RhdHMsIHBsdXMgb25lICovCisjZGVmaW5lIENQX1NUQVRTX1NJWkUJCTY0CS8qIHNpemUgaW4gYnl0ZXMgb2YgRE1BIHN0YXRzIGJsb2NrICovCisjZGVmaW5lIENQX1JFR1NfU0laRQkJKDB4ZmYgKyAxKQorI2RlZmluZSBDUF9SRUdTX1ZFUgkJMQkJLyogdmVyc2lvbiAxICovCisjZGVmaW5lIENQX1JYX1JJTkdfU0laRQkJNjQKKyNkZWZpbmUgQ1BfVFhfUklOR19TSVpFCQk2NAorI2RlZmluZSBDUF9SSU5HX0JZVEVTCQlcCisJCSgoc2l6ZW9mKHN0cnVjdCBjcF9kZXNjKSAqIENQX1JYX1JJTkdfU0laRSkgKwlcCisJCSAoc2l6ZW9mKHN0cnVjdCBjcF9kZXNjKSAqIENQX1RYX1JJTkdfU0laRSkgKwlcCisJCSBDUF9TVEFUU19TSVpFKQorI2RlZmluZSBORVhUX1RYKE4pCQkoKChOKSArIDEpICYgKENQX1RYX1JJTkdfU0laRSAtIDEpKQorI2RlZmluZSBORVhUX1JYKE4pCQkoKChOKSArIDEpICYgKENQX1JYX1JJTkdfU0laRSAtIDEpKQorI2RlZmluZSBUWF9CVUZGU19BVkFJTChDUCkJCQkJCVwKKwkoKChDUCktPnR4X3RhaWwgPD0gKENQKS0+dHhfaGVhZCkgPwkJCVwKKwkgIChDUCktPnR4X3RhaWwgKyAoQ1BfVFhfUklOR19TSVpFIC0gMSkgLSAoQ1ApLT50eF9oZWFkIDoJXAorCSAgKENQKS0+dHhfdGFpbCAtIChDUCktPnR4X2hlYWQgLSAxKQorCisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1MzYJLyogU2l6ZSBvZiBlYWNoIHRlbXBvcmFyeSBSeCBidWZmZXIuKi8KKyNkZWZpbmUgUlhfT0ZGU0VUCQkyCisjZGVmaW5lIENQX0lOVEVSTkFMX1BIWQkJMzIKKworLyogVGhlIGZvbGxvd2luZyBzZXR0aW5ncyBhcmUgbG9nXzIoYnl0ZXMpLTQ6ICAwID09IDE2IGJ5dGVzIC4uIDY9PTEwMjQsIDc9PWVuZCBvZiBwYWNrZXQuICovCisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNICQk1CS8qIFJ4IGJ1ZmZlciBsZXZlbCBiZWZvcmUgZmlyc3QgUENJIHhmZXIuICAqLworI2RlZmluZSBSWF9ETUFfQlVSU1QJCTQJLyogTWF4aW11bSBQQ0kgYnVyc3QsICc0JyBpcyAyNTYgKi8KKyNkZWZpbmUgVFhfRE1BX0JVUlNUCQk2CS8qIE1heGltdW0gUENJIGJ1cnN0LCAnNicgaXMgMTAyNCAqLworI2RlZmluZSBUWF9FQVJMWV9USFJFU0gJCTI1NgkvKiBFYXJseSBUeCB0aHJlc2hvbGQsIGluIGJ5dGVzICovCisKKy8qIFRpbWUgaW4gamlmZmllcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZy4gKi8KKyNkZWZpbmUgVFhfVElNRU9VVAkJKDYqSFopCisKKy8qIGhhcmR3YXJlIG1pbmltdW0gYW5kIG1heGltdW0gZm9yIGEgc2luZ2xlIGZyYW1lJ3MgZGF0YSBwYXlsb2FkICovCisjZGVmaW5lIENQX01JTl9NVFUJCTYwCS8qIFRPRE86IGFsbG93IGxvd2VyLCBidXQgcGFkICovCisjZGVmaW5lIENQX01BWF9NVFUJCTQwOTYKKworZW51bSB7CisJLyogTklDIHJlZ2lzdGVyIG9mZnNldHMgKi8KKwlNQUMwCQk9IDB4MDAsCS8qIEV0aGVybmV0IGhhcmR3YXJlIGFkZHJlc3MuICovCisJTUFSMAkJPSAweDA4LAkvKiBNdWx0aWNhc3QgZmlsdGVyLiAqLworCVN0YXRzQWRkcgk9IDB4MTAsCS8qIDY0LWJpdCBzdGFydCBhZGRyIG9mIDY0LWJ5dGUgRE1BIHN0YXRzIGJsayAqLworCVR4UmluZ0FkZHIJPSAweDIwLCAvKiA2NC1iaXQgc3RhcnQgYWRkciBvZiBUeCByaW5nICovCisJSGlUeFJpbmdBZGRyCT0gMHgyOCwgLyogNjQtYml0IHN0YXJ0IGFkZHIgb2YgaGlnaCBwcmlvcml0eSBUeCByaW5nICovCisJQ21kCQk9IDB4MzcsIC8qIENvbW1hbmQgcmVnaXN0ZXIgKi8KKwlJbnRyTWFzawk9IDB4M0MsIC8qIEludGVycnVwdCBtYXNrICovCisJSW50clN0YXR1cwk9IDB4M0UsIC8qIEludGVycnVwdCBzdGF0dXMgKi8KKwlUeENvbmZpZwk9IDB4NDAsIC8qIFR4IGNvbmZpZ3VyYXRpb24gKi8KKwlDaGlwVmVyc2lvbgk9IDB4NDMsIC8qIDgtYml0IGNoaXAgdmVyc2lvbiwgaW5zaWRlIFR4Q29uZmlnICovCisJUnhDb25maWcJPSAweDQ0LCAvKiBSeCBjb25maWd1cmF0aW9uICovCisJUnhNaXNzZWQJPSAweDRDLAkvKiAyNCBiaXRzIHZhbGlkLCB3cml0ZSBjbGVhcnMgKi8KKwlDZmc5MzQ2CQk9IDB4NTAsIC8qIEVFUFJPTSBzZWxlY3QvY29udHJvbDsgQ2ZnIHJlZyBbdW5dbG9jayAqLworCUNvbmZpZzEJCT0gMHg1MiwgLyogQ29uZmlnMSAqLworCUNvbmZpZzMJCT0gMHg1OSwgLyogQ29uZmlnMyAqLworCUNvbmZpZzQJCT0gMHg1QSwgLyogQ29uZmlnNCAqLworCU11bHRpSW50cgk9IDB4NUMsIC8qIE11bHRpcGxlIGludGVycnVwdCBzZWxlY3QgKi8KKwlCYXNpY01vZGVDdHJsCT0gMHg2MiwJLyogTUlJIEJNQ1IgKi8KKwlCYXNpY01vZGVTdGF0dXMJPSAweDY0LCAvKiBNSUkgQk1TUiAqLworCU5XYXlBZHZlcnQJPSAweDY2LCAvKiBNSUkgQURWRVJUSVNFICovCisJTldheUxQQVIJPSAweDY4LCAvKiBNSUkgTFBBICovCisJTldheUV4cGFuc2lvbgk9IDB4NkEsIC8qIE1JSSBFeHBhbnNpb24gKi8KKwlDb25maWc1CQk9IDB4RDgsCS8qIENvbmZpZzUgKi8KKwlUeFBvbGwJCT0gMHhEOSwJLyogVGVsbCBjaGlwIHRvIGNoZWNrIFR4IGRlc2NyaXB0b3JzIGZvciB3b3JrICovCisJUnhNYXhTaXplCT0gMHhEQSwgLyogTWF4IHNpemUgb2YgYW4gUnggcGFja2V0ICg4MTY5IG9ubHkpICovCisJQ3BDbWQJCT0gMHhFMCwgLyogQysgQ29tbWFuZCByZWdpc3RlciAoQysgbW9kZSBvbmx5KSAqLworCUludHJNaXRpZ2F0ZQk9IDB4RTIsCS8qIHJ4L3R4IGludGVycnVwdCBtaXRpZ2F0aW9uIGNvbnRyb2wgKi8KKwlSeFJpbmdBZGRyCT0gMHhFNCwgLyogNjQtYml0IHN0YXJ0IGFkZHIgb2YgUnggcmluZyAqLworCVR4VGhyZXNoCT0gMHhFQywgLyogRWFybHkgVHggdGhyZXNob2xkICovCisJT2xkUnhCdWZBZGRyCT0gMHgzMCwgLyogRE1BIGFkZHJlc3Mgb2YgUnggcmluZyBidWZmZXIgKEMgbW9kZSkgKi8KKwlPbGRUU0QwCQk9IDB4MTAsIC8qIERNQSBhZGRyZXNzIG9mIGZpcnN0IFR4IGRlc2MgKEMgbW9kZSkgKi8KKworCS8qIFR4IGFuZCBSeCBzdGF0dXMgZGVzY3JpcHRvcnMgKi8KKwlEZXNjT3duCQk9ICgxIDw8IDMxKSwgLyogRGVzY3JpcHRvciBpcyBvd25lZCBieSBOSUMgKi8KKwlSaW5nRW5kCQk9ICgxIDw8IDMwKSwgLyogRW5kIG9mIGRlc2NyaXB0b3IgcmluZyAqLworCUZpcnN0RnJhZwk9ICgxIDw8IDI5KSwgLyogRmlyc3Qgc2VnbWVudCBvZiBhIHBhY2tldCAqLworCUxhc3RGcmFnCT0gKDEgPDwgMjgpLCAvKiBGaW5hbCBzZWdtZW50IG9mIGEgcGFja2V0ICovCisJVHhFcnJvcgkJPSAoMSA8PCAyMyksIC8qIFR4IGVycm9yIHN1bW1hcnkgKi8KKwlSeEVycm9yCQk9ICgxIDw8IDIwKSwgLyogUnggZXJyb3Igc3VtbWFyeSAqLworCUlQQ1MJCT0gKDEgPDwgMTgpLCAvKiBDYWxjdWxhdGUgSVAgY2hlY2tzdW0gKi8KKwlVRFBDUwkJPSAoMSA8PCAxNyksIC8qIENhbGN1bGF0ZSBVRFAvSVAgY2hlY2tzdW0gKi8KKwlUQ1BDUwkJPSAoMSA8PCAxNiksIC8qIENhbGN1bGF0ZSBUQ1AvSVAgY2hlY2tzdW0gKi8KKwlUeFZsYW5UYWcJPSAoMSA8PCAxNyksIC8qIEFkZCBWTEFOIHRhZyAqLworCVJ4VmxhblRhZ2dlZAk9ICgxIDw8IDE2KSwgLyogUnggVkxBTiB0YWcgYXZhaWxhYmxlICovCisJSVBGYWlsCQk9ICgxIDw8IDE1KSwgLyogSVAgY2hlY2tzdW0gZmFpbGVkICovCisJVURQRmFpbAkJPSAoMSA8PCAxNCksIC8qIFVEUC9JUCBjaGVja3N1bSBmYWlsZWQgKi8KKwlUQ1BGYWlsCQk9ICgxIDw8IDEzKSwgLyogVENQL0lQIGNoZWNrc3VtIGZhaWxlZCAqLworCU5vcm1hbFR4UG9sbAk9ICgxIDw8IDYpLCAgLyogT25lIG9yIG1vcmUgbm9ybWFsIFR4IHBhY2tldHMgdG8gc2VuZCAqLworCVBJRDEJCT0gKDEgPDwgMTcpLCAvKiAyIHByb3RvY29sIGlkIGJpdHM6ICAwPT1ub24tSVAsICovCisJUElEMAkJPSAoMSA8PCAxNiksIC8qIDE9PVVEUC9JUCwgMj09VENQL0lQLCAzPT1JUCAqLworCVJ4UHJvdG9UQ1AJPSAxLAorCVJ4UHJvdG9VRFAJPSAyLAorCVJ4UHJvdG9JUAk9IDMsCisJVHhGSUZPVW5kZXIJPSAoMSA8PCAyNSksIC8qIFR4IEZJRk8gdW5kZXJydW4gKi8KKwlUeE9XQwkJPSAoMSA8PCAyMiksIC8qIFR4IE91dC1vZi13aW5kb3cgY29sbGlzaW9uICovCisJVHhMaW5rRmFpbAk9ICgxIDw8IDIxKSwgLyogTGluayBmYWlsZWQgZHVyaW5nIFR4IG9mIHBhY2tldCAqLworCVR4TWF4Q29sCT0gKDEgPDwgMjApLCAvKiBUeCBhYm9ydGVkIGR1ZSB0byBleGNlc3NpdmUgY29sbGlzaW9ucyAqLworCVR4Q29sQ250U2hpZnQJPSAxNiwJICAgICAvKiBTaGlmdCwgdG8gZ2V0IDQtYml0IFR4IGNvbGxpc2lvbiBjbnQgKi8KKwlUeENvbENudE1hc2sJPSAweDAxIHwgMHgwMiB8IDB4MDQgfCAweDA4LCAvKiA0LWJpdCBjb2xsaXNpb24gY291bnQgKi8KKwlSeEVyckZyYW1lCT0gKDEgPDwgMjcpLCAvKiBSeCBmcmFtZSBhbGlnbm1lbnQgZXJyb3IgKi8KKwlSeE1jYXN0CQk9ICgxIDw8IDI2KSwgLyogUnggbXVsdGljYXN0IHBhY2tldCByY3YnZCAqLworCVJ4RXJyQ1JDCT0gKDEgPDwgMTgpLCAvKiBSeCBDUkMgZXJyb3IgKi8KKwlSeEVyclJ1bnQJPSAoMSA8PCAxOSksIC8qIFJ4IGVycm9yLCBwYWNrZXQgPCA2NCBieXRlcyAqLworCVJ4RXJyTG9uZwk9ICgxIDw8IDIxKSwgLyogUnggZXJyb3IsIHBhY2tldCA+IDQwOTYgYnl0ZXMgKi8KKwlSeEVyckZJRk8JPSAoMSA8PCAyMiksIC8qIFJ4IGVycm9yLCBGSUZPIG92ZXJmbG93ZWQsIHBrdCBiYWQgKi8KKworCS8qIFN0YXRzQWRkciByZWdpc3RlciAqLworCUR1bXBTdGF0cwk9ICgxIDw8IDMpLCAgLyogQmVnaW4gc3RhdHMgZHVtcCAqLworCisJLyogUnhDb25maWcgcmVnaXN0ZXIgKi8KKwlSeENmZ0ZJRk9TaGlmdAk9IDEzLAkgICAgIC8qIFNoaWZ0LCB0byBnZXQgUnggRklGTyB0aHJlc2ggdmFsdWUgKi8KKwlSeENmZ0RNQVNoaWZ0CT0gOCwJICAgICAvKiBTaGlmdCwgdG8gZ2V0IFJ4IE1heCBETUEgdmFsdWUgKi8KKwlBY2NlcHRFcnIJPSAweDIwLAkgICAgIC8qIEFjY2VwdCBwYWNrZXRzIHdpdGggQ1JDIGVycm9ycyAqLworCUFjY2VwdFJ1bnQJPSAweDEwLAkgICAgIC8qIEFjY2VwdCBydW50ICg8NjQgYnl0ZXMpIHBhY2tldHMgKi8KKwlBY2NlcHRCcm9hZGNhc3QJPSAweDA4LAkgICAgIC8qIEFjY2VwdCBicm9hZGNhc3QgcGFja2V0cyAqLworCUFjY2VwdE11bHRpY2FzdAk9IDB4MDQsCSAgICAgLyogQWNjZXB0IG11bHRpY2FzdCBwYWNrZXRzICovCisJQWNjZXB0TXlQaHlzCT0gMHgwMiwJICAgICAvKiBBY2NlcHQgcGt0cyB3aXRoIG91ciBNQUMgYXMgZGVzdCAqLworCUFjY2VwdEFsbFBoeXMJPSAweDAxLAkgICAgIC8qIEFjY2VwdCBhbGwgcGt0cyB3LyBwaHlzaWNhbCBkZXN0ICovCisKKwkvKiBJbnRyTWFzayAvIEludHJTdGF0dXMgcmVnaXN0ZXJzICovCisJUGNpRXJyCQk9ICgxIDw8IDE1KSwgLyogU3lzdGVtIGVycm9yIG9uIHRoZSBQQ0kgYnVzICovCisJVGltZXJJbnRyCT0gKDEgPDwgMTQpLCAvKiBBc3NlcnRlZCB3aGVuIFRDVFIgcmVhY2hlcyBUaW1lckludCB2YWx1ZSAqLworCUxlbkNoZwkJPSAoMSA8PCAxMyksIC8qIENhYmxlIGxlbmd0aCBjaGFuZ2UgKi8KKwlTV0ludAkJPSAoMSA8PCA4KSwgIC8qIFNvZnR3YXJlLXJlcXVlc3RlZCBpbnRlcnJ1cHQgKi8KKwlUeEVtcHR5CQk9ICgxIDw8IDcpLCAgLyogTm8gVHggZGVzY3JpcHRvcnMgYXZhaWxhYmxlICovCisJUnhGSUZPT3ZyCT0gKDEgPDwgNiksICAvKiBSeCBGSUZPIE92ZXJmbG93ICovCisJTGlua0NoZwkJPSAoMSA8PCA1KSwgIC8qIFBhY2tldCB1bmRlcnJ1biwgb3IgbGluayBjaGFuZ2UgKi8KKwlSeEVtcHR5CQk9ICgxIDw8IDQpLCAgLyogTm8gUnggZGVzY3JpcHRvcnMgYXZhaWxhYmxlICovCisJVHhFcnIJCT0gKDEgPDwgMyksICAvKiBUeCBlcnJvciAqLworCVR4T0sJCT0gKDEgPDwgMiksICAvKiBUeCBwYWNrZXQgc2VudCAqLworCVJ4RXJyCQk9ICgxIDw8IDEpLCAgLyogUnggZXJyb3IgKi8KKwlSeE9LCQk9ICgxIDw8IDApLCAgLyogUnggcGFja2V0IHJlY2VpdmVkICovCisJSW50clJlc3ZkCT0gKDEgPDwgMTApLCAvKiByZXNlcnZlZCwgYWNjb3JkaW5nIHRvIFJlYWxUZWsgZW5naW5lZXJzLAorCQkJCQlidXQgaGFyZHdhcmUgbGlrZXMgdG8gcmFpc2UgaXQgKi8KKworCUludHJBbGwJCT0gUGNpRXJyIHwgVGltZXJJbnRyIHwgTGVuQ2hnIHwgU1dJbnQgfCBUeEVtcHR5IHwKKwkJCSAgUnhGSUZPT3ZyIHwgTGlua0NoZyB8IFJ4RW1wdHkgfCBUeEVyciB8IFR4T0sgfAorCQkJICBSeEVyciB8IFJ4T0sgfCBJbnRyUmVzdmQsCisKKwkvKiBDIG1vZGUgY29tbWFuZCByZWdpc3RlciAqLworCUNtZFJlc2V0CT0gKDEgPDwgNCksICAvKiBFbmFibGUgdG8gcmVzZXQ7IHNlbGYtY2xlYXJpbmcgKi8KKwlSeE9uCQk9ICgxIDw8IDMpLCAgLyogUnggbW9kZSBlbmFibGUgKi8KKwlUeE9uCQk9ICgxIDw8IDIpLCAgLyogVHggbW9kZSBlbmFibGUgKi8KKworCS8qIEMrIG1vZGUgY29tbWFuZCByZWdpc3RlciAqLworCVJ4Vmxhbk9uCT0gKDEgPDwgNiksICAvKiBSeCBWTEFOIGRlLXRhZ2dpbmcgZW5hYmxlICovCisJUnhDaGtTdW0JPSAoMSA8PCA1KSwgIC8qIFJ4IGNoZWNrc3VtIG9mZmxvYWQgZW5hYmxlICovCisJUENJREFDCQk9ICgxIDw8IDQpLCAgLyogUENJIER1YWwgQWRkcmVzcyBDeWNsZSAoNjQtYml0IFBDSSkgKi8KKwlQQ0lNdWxSVwk9ICgxIDw8IDMpLCAgLyogRW5hYmxlIFBDSSByZWFkL3dyaXRlIG11bHRpcGxlICovCisJQ3BSeE9uCQk9ICgxIDw8IDEpLCAgLyogUnggbW9kZSBlbmFibGUgKi8KKwlDcFR4T24JCT0gKDEgPDwgMCksICAvKiBUeCBtb2RlIGVuYWJsZSAqLworCisJLyogQ2ZnOTQzNiBFRVBST00gY29udHJvbCByZWdpc3RlciAqLworCUNmZzkzNDZfTG9jawk9IDB4MDAsCSAgICAgLyogTG9jayBDb25maWdYL01JSSByZWdpc3RlciBhY2Nlc3MgKi8KKwlDZmc5MzQ2X1VubG9jawk9IDB4QzAsCSAgICAgLyogVW5sb2NrIENvbmZpZ1gvTUlJIHJlZ2lzdGVyIGFjY2VzcyAqLworCisJLyogVHhDb25maWcgcmVnaXN0ZXIgKi8KKwlJRkcJCT0gKDEgPDwgMjUpIHwgKDEgPDwgMjQpLCAvKiBzdGFuZGFyZCBJRUVFIGludGVyZnJhbWUgZ2FwICovCisJVHhETUFTaGlmdAk9IDgsCSAgICAgLyogRE1BIGJ1cnN0IHZhbHVlICgwLTcpIGlzIHNoaWZ0IHRoaXMgbWFueSBiaXRzICovCisKKwkvKiBFYXJseSBUeCBUaHJlc2hvbGQgcmVnaXN0ZXIgKi8KKwlUeFRocmVzaE1hc2sJPSAweDNmLAkgICAgIC8qIE1hc2sgYml0cyA1LTAgKi8KKwlUeFRocmVzaE1heAk9IDIwNDgsCSAgICAgLyogTWF4IGVhcmx5IFR4IHRocmVzaG9sZCAqLworCisJLyogQ29uZmlnMSByZWdpc3RlciAqLworCURyaXZlckxvYWRlZAk9ICgxIDw8IDUpLCAgLyogU29mdHdhcmUgbWFya2VyLCBkcml2ZXIgaXMgbG9hZGVkICovCisJTFdBQ1QgICAgICAgICAgID0gKDEgPDwgNCksICAvKiBMV0FLRSBhY3RpdmUgbW9kZSAqLworCVBNRW5hYmxlCT0gKDEgPDwgMCksICAvKiBFbmFibGUgdmFyaW91cyBQTSBmZWF0dXJlcyBvZiBjaGlwICovCisKKwkvKiBDb25maWczIHJlZ2lzdGVyICovCisJUEFSTUVuYWJsZQk9ICgxIDw8IDYpLCAgLyogRW5hYmxlIGF1dG8tbG9hZGluZyBvZiBQSFkgcGFybXMgKi8KKwlNYWdpY1BhY2tldCAgICAgPSAoMSA8PCA1KSwgIC8qIFdha2UgdXAgd2hlbiByZWNlaXZlcyBhIE1hZ2ljIFBhY2tldCAqLworCUxpbmtVcCAgICAgICAgICA9ICgxIDw8IDQpLCAgLyogV2FrZSB1cCB3aGVuIHRoZSBjYWJsZSBjb25uZWN0aW9uIGlzIHJlLWVzdGFibGlzaGVkICovCisKKwkvKiBDb25maWc0IHJlZ2lzdGVyICovCisJTFdQVE4gICAgICAgICAgID0gKDEgPDwgMSksICAvKiBMV0FLRSBQYXR0ZXJuICovCisJTFdQTUUgICAgICAgICAgID0gKDEgPDwgNCksICAvKiBMQU5XQUtFIHZzIFBNRUIgKi8KKworCS8qIENvbmZpZzUgcmVnaXN0ZXIgKi8KKwlCV0YgICAgICAgICAgICAgPSAoMSA8PCA2KSwgIC8qIEFjY2VwdCBCcm9hZGNhc3Qgd2FrZXVwIGZyYW1lICovCisJTVdGICAgICAgICAgICAgID0gKDEgPDwgNSksICAvKiBBY2NlcHQgTXVsdGljYXN0IHdha2V1cCBmcmFtZSAqLworCVVXRiAgICAgICAgICAgICA9ICgxIDw8IDQpLCAgLyogQWNjZXB0IFVuaWNhc3Qgd2FrZXVwIGZyYW1lICovCisJTEFOV2FrZSAgICAgICAgID0gKDEgPDwgMSksICAvKiBFbmFibGUgTEFOV2FrZSBzaWduYWwgKi8KKwlQTUVTdGF0dXMJPSAoMSA8PCAwKSwgIC8qIFBNRSBzdGF0dXMgY2FuIGJlIHJlc2V0IGJ5IFBDSSBSU1QjICovCisKKwljcF9ub3J4X2ludHJfbWFzayA9IFBjaUVyciB8IExpbmtDaGcgfCBUeE9LIHwgVHhFcnIgfCBUeEVtcHR5LAorCWNwX3J4X2ludHJfbWFzayA9IFJ4T0sgfCBSeEVyciB8IFJ4RW1wdHkgfCBSeEZJRk9PdnIsCisJY3BfaW50cl9tYXNrID0gY3BfcnhfaW50cl9tYXNrIHwgY3Bfbm9yeF9pbnRyX21hc2ssCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNwX3J4X2NvbmZpZyA9CisJICAoUlhfRklGT19USFJFU0ggPDwgUnhDZmdGSUZPU2hpZnQpIHwKKwkgIChSWF9ETUFfQlVSU1QgPDwgUnhDZmdETUFTaGlmdCk7CisKK3N0cnVjdCBjcF9kZXNjIHsKKwl1MzIJCW9wdHMxOworCXUzMgkJb3B0czI7CisJdTY0CQlhZGRyOworfTsKKworc3RydWN0IHJpbmdfaW5mbyB7CisJc3RydWN0IHNrX2J1ZmYJCSpza2I7CisJZG1hX2FkZHJfdAkJbWFwcGluZzsKKwl1bnNpZ25lZAkJZnJhZzsKK307CisKK3N0cnVjdCBjcF9kbWFfc3RhdHMgeworCXU2NAkJCXR4X29rOworCXU2NAkJCXJ4X29rOworCXU2NAkJCXR4X2VycjsKKwl1MzIJCQlyeF9lcnI7CisJdTE2CQkJcnhfZmlmbzsKKwl1MTYJCQlmcmFtZV9hbGlnbjsKKwl1MzIJCQl0eF9va18xY29sOworCXUzMgkJCXR4X29rX21jb2w7CisJdTY0CQkJcnhfb2tfcGh5czsKKwl1NjQJCQlyeF9va19iY2FzdDsKKwl1MzIJCQlyeF9va19tY2FzdDsKKwl1MTYJCQl0eF9hYm9ydDsKKwl1MTYJCQl0eF91bmRlcnJ1bjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBjcF9leHRyYV9zdGF0cyB7CisJdW5zaWduZWQgbG9uZwkJcnhfZnJhZ3M7Cit9OworCitzdHJ1Y3QgY3BfcHJpdmF0ZSB7CisJdm9pZAkJCV9faW9tZW0gKnJlZ3M7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKKwlzcGlubG9ja190CQlsb2NrOworCXUzMgkJCW1zZ19lbmFibGU7CisKKwlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7CisJdTMyCQkJcnhfY29uZmlnOworCXUxNgkJCWNwY21kOworCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgbmV0X3N0YXRzOworCXN0cnVjdCBjcF9leHRyYV9zdGF0cwljcF9zdGF0czsKKwlzdHJ1Y3QgY3BfZG1hX3N0YXRzCSpuaWNfc3RhdHM7CisJZG1hX2FkZHJfdAkJbmljX3N0YXRzX2RtYTsKKworCXVuc2lnbmVkCQlyeF90YWlsCQlfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisJc3RydWN0IGNwX2Rlc2MJCSpyeF9yaW5nOworCXN0cnVjdCByaW5nX2luZm8Jcnhfc2tiW0NQX1JYX1JJTkdfU0laRV07CisJdW5zaWduZWQJCXJ4X2J1Zl9zejsKKworCXVuc2lnbmVkCQl0eF9oZWFkCQlfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisJdW5zaWduZWQJCXR4X3RhaWw7CisKKwlzdHJ1Y3QgY3BfZGVzYwkJKnR4X3Jpbmc7CisJc3RydWN0IHJpbmdfaW5mbwl0eF9za2JbQ1BfVFhfUklOR19TSVpFXTsKKwlkbWFfYWRkcl90CQlyaW5nX2RtYTsKKworI2lmIENQX1ZMQU5fVEFHX1VTRUQKKwlzdHJ1Y3Qgdmxhbl9ncm91cAkqdmxncnA7CisjZW5kaWYKKworCXVuc2lnbmVkIGludAkJd29sX2VuYWJsZWQgOiAxOyAvKiBJcyBXYWtlLW9uLUxBTiBlbmFibGVkPyAqLworCisJc3RydWN0IG1paV9pZl9pbmZvCW1paV9pZjsKK307CisKKyNkZWZpbmUgY3ByOChyZWcpCXJlYWRiKGNwLT5yZWdzICsgKHJlZykpCisjZGVmaW5lIGNwcjE2KHJlZykJcmVhZHcoY3AtPnJlZ3MgKyAocmVnKSkKKyNkZWZpbmUgY3ByMzIocmVnKQlyZWFkbChjcC0+cmVncyArIChyZWcpKQorI2RlZmluZSBjcHc4KHJlZyx2YWwpCXdyaXRlYigodmFsKSwgY3AtPnJlZ3MgKyAocmVnKSkKKyNkZWZpbmUgY3B3MTYocmVnLHZhbCkJd3JpdGV3KCh2YWwpLCBjcC0+cmVncyArIChyZWcpKQorI2RlZmluZSBjcHczMihyZWcsdmFsKQl3cml0ZWwoKHZhbCksIGNwLT5yZWdzICsgKHJlZykpCisjZGVmaW5lIGNwdzhfZihyZWcsdmFsKSBkbyB7CQkJXAorCXdyaXRlYigodmFsKSwgY3AtPnJlZ3MgKyAocmVnKSk7CVwKKwlyZWFkYihjcC0+cmVncyArIChyZWcpKTsJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBjcHcxNl9mKHJlZyx2YWwpIGRvIHsJCQlcCisJd3JpdGV3KCh2YWwpLCBjcC0+cmVncyArIChyZWcpKTsJXAorCXJlYWR3KGNwLT5yZWdzICsgKHJlZykpOwkJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIGNwdzMyX2YocmVnLHZhbCkgZG8gewkJCVwKKwl3cml0ZWwoKHZhbCksIGNwLT5yZWdzICsgKHJlZykpOwlcCisJcmVhZGwoY3AtPnJlZ3MgKyAocmVnKSk7CQlcCisJfSB3aGlsZSAoMCkKKworCitzdGF0aWMgdm9pZCBfX2NwX3NldF9yeF9tb2RlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGNwX3R4IChzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3ApOworc3RhdGljIHZvaWQgY3BfY2xlYW5fcmluZ3MgKHN0cnVjdCBjcF9wcml2YXRlICpjcCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjcF9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX1JFQUxURUssIFBDSV9ERVZJQ0VfSURfUkVBTFRFS184MTM5LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfVFRURUNILCBQQ0lfREVWSUNFX0lEX1RUVEVDSF9NQzMyMiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjcF9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCB7CisJY29uc3QgY2hhciBzdHJbRVRIX0dTVFJJTkdfTEVOXTsKK30gZXRodG9vbF9zdGF0c19rZXlzW10gPSB7CisJeyAidHhfb2siIH0sCisJeyAicnhfb2siIH0sCisJeyAidHhfZXJyIiB9LAorCXsgInJ4X2VyciIgfSwKKwl7ICJyeF9maWZvIiB9LAorCXsgImZyYW1lX2FsaWduIiB9LAorCXsgInR4X29rXzFjb2wiIH0sCisJeyAidHhfb2tfbWNvbCIgfSwKKwl7ICJyeF9va19waHlzIiB9LAorCXsgInJ4X29rX2JjYXN0IiB9LAorCXsgInJ4X29rX21jYXN0IiB9LAorCXsgInR4X2Fib3J0IiB9LAorCXsgInR4X3VuZGVycnVuIiB9LAorCXsgInJ4X2ZyYWdzIiB9LAorfTsKKworCisjaWYgQ1BfVkxBTl9UQUdfVVNFRAorc3RhdGljIHZvaWQgY3Bfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQoreworCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjcC0+bG9jaywgZmxhZ3MpOworCWNwLT52bGdycCA9IGdycDsKKwljcC0+Y3BjbWQgfD0gUnhWbGFuT247CisJY3B3MTYoQ3BDbWQsIGNwLT5jcGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3AtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgY3Bfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCit7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNwLT5sb2NrLCBmbGFncyk7CisJY3AtPmNwY21kICY9IH5SeFZsYW5PbjsKKwljcHcxNihDcENtZCwgY3AtPmNwY21kKTsKKwlpZiAoY3AtPnZsZ3JwKQorCQljcC0+dmxncnAtPnZsYW5fZGV2aWNlc1t2aWRdID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcC0+bG9jaywgZmxhZ3MpOworfQorI2VuZGlmIC8qIENQX1ZMQU5fVEFHX1VTRUQgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGNwX3NldF9yeGJ1ZnNpemUgKHN0cnVjdCBjcF9wcml2YXRlICpjcCkKK3sKKwl1bnNpZ25lZCBpbnQgbXR1ID0gY3AtPmRldi0+bXR1OworCQorCWlmIChtdHUgPiBFVEhfREFUQV9MRU4pCisJCS8qIE1UVSArIGV0aGVybmV0IGhlYWRlciArIEZDUyArIG9wdGlvbmFsIFZMQU4gdGFnICovCisJCWNwLT5yeF9idWZfc3ogPSBtdHUgKyBFVEhfSExFTiArIDg7CisJZWxzZQorCQljcC0+cnhfYnVmX3N6ID0gUEtUX0JVRl9TWjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNwX3J4X3NrYiAoc3RydWN0IGNwX3ByaXZhdGUgKmNwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgc3RydWN0IGNwX2Rlc2MgKmRlc2MpCit7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zIChza2IsIGNwLT5kZXYpOworCisJY3AtPm5ldF9zdGF0cy5yeF9wYWNrZXRzKys7CisJY3AtPm5ldF9zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwljcC0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworI2lmIENQX1ZMQU5fVEFHX1VTRUQKKwlpZiAoY3AtPnZsZ3JwICYmIChkZXNjLT5vcHRzMiAmIFJ4VmxhblRhZ2dlZCkpIHsKKwkJdmxhbl9od2FjY2VsX3JlY2VpdmVfc2tiKHNrYiwgY3AtPnZsZ3JwLAorCQkJCQkgYmUxNl90b19jcHUoZGVzYy0+b3B0czIgJiAweGZmZmYpKTsKKwl9IGVsc2UKKyNlbmRpZgorCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworfQorCitzdGF0aWMgdm9pZCBjcF9yeF9lcnJfYWNjdCAoc3RydWN0IGNwX3ByaXZhdGUgKmNwLCB1bnNpZ25lZCByeF90YWlsLAorCQkJICAgIHUzMiBzdGF0dXMsIHUzMiBsZW4pCit7CisJaWYgKG5ldGlmX21zZ19yeF9lcnIgKGNwKSkKKwkJcHJpbnRrIChLRVJOX0RFQlVHCisJCQkiJXM6IHJ4IGVyciwgc2xvdCAlZCBzdGF0dXMgMHgleCBsZW4gJWRcbiIsCisJCQljcC0+ZGV2LT5uYW1lLCByeF90YWlsLCBzdGF0dXMsIGxlbik7CisJY3AtPm5ldF9zdGF0cy5yeF9lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgUnhFcnJGcmFtZSkKKwkJY3AtPm5ldF9zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgUnhFcnJDUkMpCisJCWNwLT5uZXRfc3RhdHMucnhfY3JjX2Vycm9ycysrOworCWlmICgoc3RhdHVzICYgUnhFcnJSdW50KSB8fCAoc3RhdHVzICYgUnhFcnJMb25nKSkKKwkJY3AtPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJaWYgKChzdGF0dXMgJiAoRmlyc3RGcmFnIHwgTGFzdEZyYWcpKSAhPSAoRmlyc3RGcmFnIHwgTGFzdEZyYWcpKQorCQljcC0+bmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgUnhFcnJGSUZPKQorCQljcC0+bmV0X3N0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNwX3J4X2NzdW1fb2sgKHUzMiBzdGF0dXMpCit7CisJdW5zaWduZWQgaW50IHByb3RvY29sID0gKHN0YXR1cyA+PiAxNikgJiAweDM7CisJCisJaWYgKGxpa2VseSgocHJvdG9jb2wgPT0gUnhQcm90b1RDUCkgJiYgKCEoc3RhdHVzICYgVENQRmFpbCkpKSkKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAoKHByb3RvY29sID09IFJ4UHJvdG9VRFApICYmICghKHN0YXR1cyAmIFVEUEZhaWwpKSkKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAoKHByb3RvY29sID09IFJ4UHJvdG9JUCkgJiYgKCEoc3RhdHVzICYgSVBGYWlsKSkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNwX3J4X3BvbGwgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQoreworCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgcnhfdGFpbCA9IGNwLT5yeF90YWlsOworCXVuc2lnbmVkIHJ4X3dvcmsgPSBkZXYtPnF1b3RhOworCXVuc2lnbmVkIHJ4OworCityeF9zdGF0dXNfbG9vcDoKKwlyeCA9IDA7CisJY3B3MTYoSW50clN0YXR1cywgY3BfcnhfaW50cl9tYXNrKTsKKworCXdoaWxlICgxKSB7CisJCXUzMiBzdGF0dXMsIGxlbjsKKwkJZG1hX2FkZHJfdCBtYXBwaW5nOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqbmV3X3NrYjsKKwkJc3RydWN0IGNwX2Rlc2MgKmRlc2M7CisJCXVuc2lnbmVkIGJ1ZmxlbjsKKworCQlza2IgPSBjcC0+cnhfc2tiW3J4X3RhaWxdLnNrYjsKKwkJaWYgKCFza2IpCisJCQlCVUcoKTsKKworCQlkZXNjID0gJmNwLT5yeF9yaW5nW3J4X3RhaWxdOworCQlzdGF0dXMgPSBsZTMyX3RvX2NwdShkZXNjLT5vcHRzMSk7CisJCWlmIChzdGF0dXMgJiBEZXNjT3duKQorCQkJYnJlYWs7CisKKwkJbGVuID0gKHN0YXR1cyAmIDB4MWZmZikgLSA0OworCQltYXBwaW5nID0gY3AtPnJ4X3NrYltyeF90YWlsXS5tYXBwaW5nOworCisJCWlmICgoc3RhdHVzICYgKEZpcnN0RnJhZyB8IExhc3RGcmFnKSkgIT0gKEZpcnN0RnJhZyB8IExhc3RGcmFnKSkgeworCQkJLyogd2UgZG9uJ3Qgc3VwcG9ydCBpbmNvbWluZyBmcmFnbWVudGVkIGZyYW1lcy4KKwkJCSAqIGluc3RlYWQsIHdlIGF0dGVtcHQgdG8gZW5zdXJlIHRoYXQgdGhlCisJCQkgKiBwcmUtYWxsb2NhdGVkIFJYIHNrYnMgYXJlIHByb3Blcmx5IHNpemVkIHN1Y2gKKwkJCSAqIHRoYXQgUlggZnJhZ21lbnRzIGFyZSBuZXZlciBlbmNvdW50ZXJlZAorCQkJICovCisJCQljcF9yeF9lcnJfYWNjdChjcCwgcnhfdGFpbCwgc3RhdHVzLCBsZW4pOworCQkJY3AtPm5ldF9zdGF0cy5yeF9kcm9wcGVkKys7CisJCQljcC0+Y3Bfc3RhdHMucnhfZnJhZ3MrKzsKKwkJCWdvdG8gcnhfbmV4dDsKKwkJfQorCisJCWlmIChzdGF0dXMgJiAoUnhFcnJvciB8IFJ4RXJyRklGTykpIHsKKwkJCWNwX3J4X2Vycl9hY2N0KGNwLCByeF90YWlsLCBzdGF0dXMsIGxlbik7CisJCQlnb3RvIHJ4X25leHQ7CisJCX0KKworCQlpZiAobmV0aWZfbXNnX3J4X3N0YXR1cyhjcCkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJ4IHNsb3QgJWQgc3RhdHVzIDB4JXggbGVuICVkXG4iLAorCQkJICAgICAgIGNwLT5kZXYtPm5hbWUsIHJ4X3RhaWwsIHN0YXR1cywgbGVuKTsKKworCQlidWZsZW4gPSBjcC0+cnhfYnVmX3N6ICsgUlhfT0ZGU0VUOworCQluZXdfc2tiID0gZGV2X2FsbG9jX3NrYiAoYnVmbGVuKTsKKwkJaWYgKCFuZXdfc2tiKSB7CisJCQljcC0+bmV0X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWdvdG8gcnhfbmV4dDsKKwkJfQorCisJCXNrYl9yZXNlcnZlKG5ld19za2IsIFJYX09GRlNFVCk7CisJCW5ld19za2ItPmRldiA9IGNwLT5kZXY7CisKKwkJcGNpX3VubWFwX3NpbmdsZShjcC0+cGRldiwgbWFwcGluZywKKwkJCQkgYnVmbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCS8qIEhhbmRsZSBjaGVja3N1bSBvZmZsb2FkaW5nIGZvciBpbmNvbWluZyBwYWNrZXRzLiAqLworCQlpZiAoY3BfcnhfY3N1bV9vayhzdGF0dXMpKQorCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJZWxzZQorCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCisJCXNrYl9wdXQoc2tiLCBsZW4pOworCisJCW1hcHBpbmcgPQorCQljcC0+cnhfc2tiW3J4X3RhaWxdLm1hcHBpbmcgPQorCQkJcGNpX21hcF9zaW5nbGUoY3AtPnBkZXYsIG5ld19za2ItPnRhaWwsCisJCQkJICAgICAgIGJ1ZmxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJY3AtPnJ4X3NrYltyeF90YWlsXS5za2IgPSBuZXdfc2tiOworCisJCWNwX3J4X3NrYihjcCwgc2tiLCBkZXNjKTsKKwkJcngrKzsKKworcnhfbmV4dDoKKwkJY3AtPnJ4X3JpbmdbcnhfdGFpbF0ub3B0czIgPSAwOworCQljcC0+cnhfcmluZ1tyeF90YWlsXS5hZGRyID0gY3B1X3RvX2xlNjQobWFwcGluZyk7CisJCWlmIChyeF90YWlsID09IChDUF9SWF9SSU5HX1NJWkUgLSAxKSkKKwkJCWRlc2MtPm9wdHMxID0gY3B1X3RvX2xlMzIoRGVzY093biB8IFJpbmdFbmQgfAorCQkJCQkJICBjcC0+cnhfYnVmX3N6KTsKKwkJZWxzZQorCQkJZGVzYy0+b3B0czEgPSBjcHVfdG9fbGUzMihEZXNjT3duIHwgY3AtPnJ4X2J1Zl9zeik7CisJCXJ4X3RhaWwgPSBORVhUX1JYKHJ4X3RhaWwpOworCisJCWlmICghcnhfd29yay0tKQorCQkJYnJlYWs7CisJfQorCisJY3AtPnJ4X3RhaWwgPSByeF90YWlsOworCisJZGV2LT5xdW90YSAtPSByeDsKKwkqYnVkZ2V0IC09IHJ4OworCisJLyogaWYgd2UgZGlkIG5vdCByZWFjaCB3b3JrIGxpbWl0LCB0aGVuIHdlJ3JlIGRvbmUgd2l0aAorCSAqIHRoaXMgcm91bmQgb2YgcG9sbGluZworCSAqLworCWlmIChyeF93b3JrKSB7CisJCWlmIChjcHIxNihJbnRyU3RhdHVzKSAmIGNwX3J4X2ludHJfbWFzaykKKwkJCWdvdG8gcnhfc3RhdHVzX2xvb3A7CisKKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJY3B3MTZfZihJbnRyTWFzaywgY3BfaW50cl9tYXNrKTsKKwkJX19uZXRpZl9yeF9jb21wbGV0ZShkZXYpOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwkJcmV0dXJuIDA7CS8qIGRvbmUgKi8KKwl9CisKKwlyZXR1cm4gMTsJCS8qIG5vdCBkb25lICovCit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorY3BfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwOworCXUxNiBzdGF0dXM7CisKKwlpZiAodW5saWtlbHkoZGV2ID09IE5VTEwpKQorCQlyZXR1cm4gSVJRX05PTkU7CisJY3AgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RhdHVzID0gY3ByMTYoSW50clN0YXR1cyk7CisJaWYgKCFzdGF0dXMgfHwgKHN0YXR1cyA9PSAweEZGRkYpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlpZiAobmV0aWZfbXNnX2ludHIoY3ApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludHIsIHN0YXR1cyAlMDR4IGNtZCAlMDJ4IGNwY21kICUwNHhcbiIsCisJCSAgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMsIGNwcjgoQ21kKSwgY3ByMTYoQ3BDbWQpKTsKKworCWNwdzE2KEludHJTdGF0dXMsIHN0YXR1cyAmIH5jcF9yeF9pbnRyX21hc2spOworCisJc3Bpbl9sb2NrKCZjcC0+bG9jayk7CisKKwkvKiBjbG9zZSBwb3NzaWJsZSByYWNlJ3Mgd2l0aCBkZXZfY2xvc2UgKi8KKwlpZiAodW5saWtlbHkoIW5ldGlmX3J1bm5pbmcoZGV2KSkpIHsKKwkJY3B3MTYoSW50ck1hc2ssIDApOworCQlzcGluX3VubG9jaygmY3AtPmxvY2spOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKHN0YXR1cyAmIChSeE9LIHwgUnhFcnIgfCBSeEVtcHR5IHwgUnhGSUZPT3ZyKSkKKwkJaWYgKG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAoZGV2KSkgeworCQkJY3B3MTZfZihJbnRyTWFzaywgY3Bfbm9yeF9pbnRyX21hc2spOworCQkJX19uZXRpZl9yeF9zY2hlZHVsZShkZXYpOworCQl9CisKKwlpZiAoc3RhdHVzICYgKFR4T0sgfCBUeEVyciB8IFR4RW1wdHkgfCBTV0ludCkpCisJCWNwX3R4KGNwKTsKKwlpZiAoc3RhdHVzICYgTGlua0NoZykKKwkJbWlpX2NoZWNrX21lZGlhKCZjcC0+bWlpX2lmLCBuZXRpZl9tc2dfbGluayhjcCksIEZBTFNFKTsKKworCXNwaW5fdW5sb2NrKCZjcC0+bG9jayk7CisKKwlpZiAoc3RhdHVzICYgUGNpRXJyKSB7CisJCXUxNiBwY2lfc3RhdHVzOworCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGNwLT5wZGV2LCBQQ0lfU1RBVFVTLCAmcGNpX3N0YXR1cyk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChjcC0+cGRldiwgUENJX1NUQVRVUywgcGNpX3N0YXR1cyk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSBidXMgZXJyb3IsIHN0YXR1cz0lMDR4LCBQQ0kgc3RhdHVzPSUwNHhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cywgcGNpX3N0YXR1cyk7CisKKwkJLyogVE9ETzogcmVzZXQgaGFyZHdhcmUgKi8KKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGNwX3R4IChzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3ApCit7CisJdW5zaWduZWQgdHhfaGVhZCA9IGNwLT50eF9oZWFkOworCXVuc2lnbmVkIHR4X3RhaWwgPSBjcC0+dHhfdGFpbDsKKworCXdoaWxlICh0eF90YWlsICE9IHR4X2hlYWQpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdTMyIHN0YXR1czsKKworCQlybWIoKTsKKwkJc3RhdHVzID0gbGUzMl90b19jcHUoY3AtPnR4X3JpbmdbdHhfdGFpbF0ub3B0czEpOworCQlpZiAoc3RhdHVzICYgRGVzY093bikKKwkJCWJyZWFrOworCisJCXNrYiA9IGNwLT50eF9za2JbdHhfdGFpbF0uc2tiOworCQlpZiAoIXNrYikKKwkJCUJVRygpOworCisJCXBjaV91bm1hcF9zaW5nbGUoY3AtPnBkZXYsIGNwLT50eF9za2JbdHhfdGFpbF0ubWFwcGluZywKKwkJCQkJc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCWlmIChzdGF0dXMgJiBMYXN0RnJhZykgeworCQkJaWYgKHN0YXR1cyAmIChUeEVycm9yIHwgVHhGSUZPVW5kZXIpKSB7CisJCQkJaWYgKG5ldGlmX21zZ190eF9lcnIoY3ApKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR4IGVyciwgc3RhdHVzIDB4JXhcbiIsCisJCQkJCSAgICAgICBjcC0+ZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJCWNwLT5uZXRfc3RhdHMudHhfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIFR4T1dDKQorCQkJCQljcC0+bmV0X3N0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgVHhNYXhDb2wpCisJCQkJCWNwLT5uZXRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgVHhMaW5rRmFpbCkKKwkJCQkJY3AtPm5ldF9zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiBUeEZJRk9VbmRlcikKKwkJCQkJY3AtPm5ldF9zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJfSBlbHNlIHsKKwkJCQljcC0+bmV0X3N0YXRzLmNvbGxpc2lvbnMgKz0KKwkJCQkJKChzdGF0dXMgPj4gVHhDb2xDbnRTaGlmdCkgJiBUeENvbENudE1hc2spOworCQkJCWNwLT5uZXRfc3RhdHMudHhfcGFja2V0cysrOworCQkJCWNwLT5uZXRfc3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQkJaWYgKG5ldGlmX21zZ190eF9kb25lKGNwKSkKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0eCBkb25lLCBzbG90ICVkXG4iLCBjcC0+ZGV2LT5uYW1lLCB0eF90YWlsKTsKKwkJCX0KKwkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCX0KKworCQljcC0+dHhfc2tiW3R4X3RhaWxdLnNrYiA9IE5VTEw7CisKKwkJdHhfdGFpbCA9IE5FWFRfVFgodHhfdGFpbCk7CisJfQorCisJY3AtPnR4X3RhaWwgPSB0eF90YWlsOworCisJaWYgKFRYX0JVRkZTX0FWQUlMKGNwKSA+IChNQVhfU0tCX0ZSQUdTICsgMSkpCisJCW5ldGlmX3dha2VfcXVldWUoY3AtPmRldik7Cit9CisKK3N0YXRpYyBpbnQgY3Bfc3RhcnRfeG1pdCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGVudHJ5OworCXUzMiBlb3I7CisjaWYgQ1BfVkxBTl9UQUdfVVNFRAorCXUzMiB2bGFuX3RhZyA9IDA7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnEoJmNwLT5sb2NrKTsKKworCS8qIFRoaXMgaXMgYSBoYXJkIGVycm9yLCBsb2cgaXQuICovCisJaWYgKFRYX0JVRkZTX0FWQUlMKGNwKSA8PSAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDEpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjcC0+bG9jayk7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBCVUchIFR4IFJpbmcgZnVsbCB3aGVuIHF1ZXVlIGF3YWtlIVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworI2lmIENQX1ZMQU5fVEFHX1VTRUQKKwlpZiAoY3AtPnZsZ3JwICYmIHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkKKwkJdmxhbl90YWcgPSBUeFZsYW5UYWcgfCBjcHVfdG9fYmUxNih2bGFuX3R4X3RhZ19nZXQoc2tiKSk7CisjZW5kaWYKKworCWVudHJ5ID0gY3AtPnR4X2hlYWQ7CisJZW9yID0gKGVudHJ5ID09IChDUF9UWF9SSU5HX1NJWkUgLSAxKSkgPyBSaW5nRW5kIDogMDsKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9PSAwKSB7CisJCXN0cnVjdCBjcF9kZXNjICp0eGQgPSAmY3AtPnR4X3JpbmdbZW50cnldOworCQl1MzIgbGVuOworCQlkbWFfYWRkcl90IG1hcHBpbmc7CisKKwkJbGVuID0gc2tiLT5sZW47CisJCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShjcC0+cGRldiwgc2tiLT5kYXRhLCBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlDUF9WTEFOX1RYX1RBRyh0eGQsIHZsYW5fdGFnKTsKKwkJdHhkLT5hZGRyID0gY3B1X3RvX2xlNjQobWFwcGluZyk7CisJCXdtYigpOworCisJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQkJY29uc3Qgc3RydWN0IGlwaGRyICppcCA9IHNrYi0+bmguaXBoOworCQkJaWYgKGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKKwkJCQl0eGQtPm9wdHMxID0gY3B1X3RvX2xlMzIoZW9yIHwgbGVuIHwgRGVzY093biB8CisJCQkJCQkJIEZpcnN0RnJhZyB8IExhc3RGcmFnIHwKKwkJCQkJCQkgSVBDUyB8IFRDUENTKTsKKwkJCWVsc2UgaWYgKGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkKKwkJCQl0eGQtPm9wdHMxID0gY3B1X3RvX2xlMzIoZW9yIHwgbGVuIHwgRGVzY093biB8CisJCQkJCQkJIEZpcnN0RnJhZyB8IExhc3RGcmFnIHwKKwkJCQkJCQkgSVBDUyB8IFVEUENTKTsKKwkJCWVsc2UKKwkJCQlCVUcoKTsKKwkJfSBlbHNlCisJCQl0eGQtPm9wdHMxID0gY3B1X3RvX2xlMzIoZW9yIHwgbGVuIHwgRGVzY093biB8CisJCQkJCQkgRmlyc3RGcmFnIHwgTGFzdEZyYWcpOworCQl3bWIoKTsKKworCQljcC0+dHhfc2tiW2VudHJ5XS5za2IgPSBza2I7CisJCWNwLT50eF9za2JbZW50cnldLm1hcHBpbmcgPSBtYXBwaW5nOworCQljcC0+dHhfc2tiW2VudHJ5XS5mcmFnID0gMDsKKwkJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgY3BfZGVzYyAqdHhkOworCQl1MzIgZmlyc3RfbGVuLCBmaXJzdF9lb3I7CisJCWRtYV9hZGRyX3QgZmlyc3RfbWFwcGluZzsKKwkJaW50IGZyYWcsIGZpcnN0X2VudHJ5ID0gZW50cnk7CisJCWNvbnN0IHN0cnVjdCBpcGhkciAqaXAgPSBza2ItPm5oLmlwaDsKKworCQkvKiBXZSBtdXN0IGdpdmUgdGhpcyBpbml0aWFsIGNodW5rIHRvIHRoZSBkZXZpY2UgbGFzdC4KKwkJICogT3RoZXJ3aXNlIHdlIGNvdWxkIHJhY2Ugd2l0aCB0aGUgZGV2aWNlLgorCQkgKi8KKwkJZmlyc3RfZW9yID0gZW9yOworCQlmaXJzdF9sZW4gPSBza2JfaGVhZGxlbihza2IpOworCQlmaXJzdF9tYXBwaW5nID0gcGNpX21hcF9zaW5nbGUoY3AtPnBkZXYsIHNrYi0+ZGF0YSwKKwkJCQkJICAgICAgIGZpcnN0X2xlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCWNwLT50eF9za2JbZW50cnldLnNrYiA9IHNrYjsKKwkJY3AtPnR4X3NrYltlbnRyeV0ubWFwcGluZyA9IGZpcnN0X21hcHBpbmc7CisJCWNwLT50eF9za2JbZW50cnldLmZyYWcgPSAxOworCQllbnRyeSA9IE5FWFRfVFgoZW50cnkpOworCisJCWZvciAoZnJhZyA9IDA7IGZyYWcgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBmcmFnKyspIHsKKwkJCXNrYl9mcmFnX3QgKnRoaXNfZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ZyYWddOworCQkJdTMyIGxlbjsKKwkJCXUzMiBjdHJsOworCQkJZG1hX2FkZHJfdCBtYXBwaW5nOworCisJCQlsZW4gPSB0aGlzX2ZyYWctPnNpemU7CisJCQltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUoY3AtPnBkZXYsCisJCQkJCQkgKCh2b2lkICopIHBhZ2VfYWRkcmVzcyh0aGlzX2ZyYWctPnBhZ2UpICsKKwkJCQkJCSAgdGhpc19mcmFnLT5wYWdlX29mZnNldCksCisJCQkJCQkgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWVvciA9IChlbnRyeSA9PSAoQ1BfVFhfUklOR19TSVpFIC0gMSkpID8gUmluZ0VuZCA6IDA7CisKKwkJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQkJCWN0cmwgPSBlb3IgfCBsZW4gfCBEZXNjT3duIHwgSVBDUzsKKwkJCQlpZiAoaXAtPnByb3RvY29sID09IElQUFJPVE9fVENQKQorCQkJCQljdHJsIHw9IFRDUENTOworCQkJCWVsc2UgaWYgKGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkKKwkJCQkJY3RybCB8PSBVRFBDUzsKKwkJCQllbHNlCisJCQkJCUJVRygpOworCQkJfSBlbHNlCisJCQkJY3RybCA9IGVvciB8IGxlbiB8IERlc2NPd247CisKKwkJCWlmIChmcmFnID09IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgLSAxKQorCQkJCWN0cmwgfD0gTGFzdEZyYWc7CisKKwkJCXR4ZCA9ICZjcC0+dHhfcmluZ1tlbnRyeV07CisJCQlDUF9WTEFOX1RYX1RBRyh0eGQsIHZsYW5fdGFnKTsKKwkJCXR4ZC0+YWRkciA9IGNwdV90b19sZTY0KG1hcHBpbmcpOworCQkJd21iKCk7CisKKwkJCXR4ZC0+b3B0czEgPSBjcHVfdG9fbGUzMihjdHJsKTsKKwkJCXdtYigpOworCisJCQljcC0+dHhfc2tiW2VudHJ5XS5za2IgPSBza2I7CisJCQljcC0+dHhfc2tiW2VudHJ5XS5tYXBwaW5nID0gbWFwcGluZzsKKwkJCWNwLT50eF9za2JbZW50cnldLmZyYWcgPSBmcmFnICsgMjsKKwkJCWVudHJ5ID0gTkVYVF9UWChlbnRyeSk7CisJCX0KKworCQl0eGQgPSAmY3AtPnR4X3JpbmdbZmlyc3RfZW50cnldOworCQlDUF9WTEFOX1RYX1RBRyh0eGQsIHZsYW5fdGFnKTsKKwkJdHhkLT5hZGRyID0gY3B1X3RvX2xlNjQoZmlyc3RfbWFwcGluZyk7CisJCXdtYigpOworCisJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQkJaWYgKGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKKwkJCQl0eGQtPm9wdHMxID0gY3B1X3RvX2xlMzIoZmlyc3RfZW9yIHwgZmlyc3RfbGVuIHwKKwkJCQkJCQkgRmlyc3RGcmFnIHwgRGVzY093biB8CisJCQkJCQkJIElQQ1MgfCBUQ1BDUyk7CisJCQllbHNlIGlmIChpcC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApCisJCQkJdHhkLT5vcHRzMSA9IGNwdV90b19sZTMyKGZpcnN0X2VvciB8IGZpcnN0X2xlbiB8CisJCQkJCQkJIEZpcnN0RnJhZyB8IERlc2NPd24gfAorCQkJCQkJCSBJUENTIHwgVURQQ1MpOworCQkJZWxzZQorCQkJCUJVRygpOworCQl9IGVsc2UKKwkJCXR4ZC0+b3B0czEgPSBjcHVfdG9fbGUzMihmaXJzdF9lb3IgfCBmaXJzdF9sZW4gfAorCQkJCQkJIEZpcnN0RnJhZyB8IERlc2NPd24pOworCQl3bWIoKTsKKwl9CisJY3AtPnR4X2hlYWQgPSBlbnRyeTsKKwlpZiAobmV0aWZfbXNnX3R4X3F1ZXVlZChjcCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHggcXVldWVkLCBzbG90ICVkLCBza2JsZW4gJWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVudHJ5LCBza2ItPmxlbik7CisJaWYgKFRYX0JVRkZTX0FWQUlMKGNwKSA8PSAoTUFYX1NLQl9GUkFHUyArIDEpKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlzcGluX3VubG9ja19pcnEoJmNwLT5sb2NrKTsKKworCWNwdzgoVHhQb2xsLCBOb3JtYWxUeFBvbGwpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICAgVGhpcyByb3V0aW5lIGlzIG5vdCBzdGF0ZSBzZW5zaXRpdmUgYW5kIG5lZWQgbm90IGJlIFNNUCBsb2NrZWQuICovCisKK3N0YXRpYyB2b2lkIF9fY3Bfc2V0X3J4X21vZGUgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgbWNfZmlsdGVyWzJdOwkvKiBNdWx0aWNhc3QgaGFzaCBmaWx0ZXIgKi8KKwlpbnQgaSwgcnhfbW9kZTsKKwl1MzIgdG1wOworCisJLyogTm90ZTogZG8gbm90IHJlb3JkZXIsIEdDQyBpcyBjbGV2ZXIgYWJvdXQgY29tbW9uIHN0YXRlbWVudHMuICovCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQkvKiBVbmNvbmRpdGlvbmFsbHkgbG9nIG5ldCB0YXBzLiAqLworCQlwcmludGsgKEtFUk5fTk9USUNFICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwKKwkJCWRldi0+bmFtZSk7CisJCXJ4X21vZGUgPQorCQkgICAgQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXVsdGljYXN0IHwgQWNjZXB0TXlQaHlzIHwKKwkJICAgIEFjY2VwdEFsbFBoeXM7CisJCW1jX2ZpbHRlclsxXSA9IG1jX2ZpbHRlclswXSA9IDB4ZmZmZmZmZmY7CisJfSBlbHNlIGlmICgoZGV2LT5tY19jb3VudCA+IG11bHRpY2FzdF9maWx0ZXJfbGltaXQpCisJCSAgIHx8IChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQkvKiBUb28gbWFueSB0byBmaWx0ZXIgcGVyZmVjdGx5IC0tIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KKwkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdE15UGh5czsKKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMHhmZmZmZmZmZjsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE15UGh5czsKKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMDsKKwkJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7CisJCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCWludCBiaXRfbnIgPSBldGhlcl9jcmMoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpID4+IDI2OworCisJCQltY19maWx0ZXJbYml0X25yID4+IDVdIHw9IDEgPDwgKGJpdF9uciAmIDMxKTsKKwkJCXJ4X21vZGUgfD0gQWNjZXB0TXVsdGljYXN0OworCQl9CisJfQorCisJLyogV2UgY2FuIHNhZmVseSB1cGRhdGUgd2l0aG91dCBzdG9wcGluZyB0aGUgY2hpcC4gKi8KKwl0bXAgPSBjcF9yeF9jb25maWcgfCByeF9tb2RlOworCWlmIChjcC0+cnhfY29uZmlnICE9IHRtcCkgeworCQljcHczMl9mIChSeENvbmZpZywgdG1wKTsKKwkJY3AtPnJ4X2NvbmZpZyA9IHRtcDsKKwl9CisJY3B3MzJfZiAoTUFSMCArIDAsIG1jX2ZpbHRlclswXSk7CisJY3B3MzJfZiAoTUFSMCArIDQsIG1jX2ZpbHRlclsxXSk7Cit9CisKK3N0YXRpYyB2b2lkIGNwX3NldF9yeF9tb2RlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmY3AtPmxvY2ssIGZsYWdzKTsKKwlfX2NwX3NldF9yeF9tb2RlKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmNwLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fY3BfZ2V0X3N0YXRzKHN0cnVjdCBjcF9wcml2YXRlICpjcCkKK3sKKwkvKiBvbmx5IGxvd2VyIDI0IGJpdHMgdmFsaWQ7IHdyaXRlIGFueSB2YWx1ZSB0byBjbGVhciAqLworCWNwLT5uZXRfc3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSAoY3ByMzIgKFJ4TWlzc2VkKSAmIDB4ZmZmZmZmKTsKKwljcHczMiAoUnhNaXNzZWQsIDApOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmNwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFRoZSBjaGlwIG9ubHkgbmVlZCByZXBvcnQgZnJhbWUgc2lsZW50bHkgZHJvcHBlZC4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3AtPmxvY2ssIGZsYWdzKTsKKyAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSAmJiBuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorIAkJX19jcF9nZXRfc3RhdHMoY3ApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gJmNwLT5uZXRfc3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIGNwX3N0b3BfaHcgKHN0cnVjdCBjcF9wcml2YXRlICpjcCkKK3sKKwljcHcxNihJbnRyU3RhdHVzLCB+KGNwcjE2KEludHJTdGF0dXMpKSk7CisJY3B3MTZfZihJbnRyTWFzaywgMCk7CisJY3B3OChDbWQsIDApOworCWNwdzE2X2YoQ3BDbWQsIDApOworCWNwdzE2X2YoSW50clN0YXR1cywgfihjcHIxNihJbnRyU3RhdHVzKSkpOworCisJY3AtPnJ4X3RhaWwgPSAwOworCWNwLT50eF9oZWFkID0gY3AtPnR4X3RhaWwgPSAwOworfQorCitzdGF0aWMgdm9pZCBjcF9yZXNldF9odyAoc3RydWN0IGNwX3ByaXZhdGUgKmNwKQoreworCXVuc2lnbmVkIHdvcmsgPSAxMDAwOworCisJY3B3OChDbWQsIENtZFJlc2V0KTsKKworCXdoaWxlICh3b3JrLS0pIHsKKwkJaWYgKCEoY3ByOChDbWQpICYgQ21kUmVzZXQpKQorCQkJcmV0dXJuOworCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxMCk7CisJfQorCisJcHJpbnRrKEtFUk5fRVJSICIlczogaGFyZHdhcmUgcmVzZXQgdGltZW91dFxuIiwgY3AtPmRldi0+bmFtZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcF9zdGFydF9odyAoc3RydWN0IGNwX3ByaXZhdGUgKmNwKQoreworCWNwdzE2KENwQ21kLCBjcC0+Y3BjbWQpOworCWNwdzgoQ21kLCBSeE9uIHwgVHhPbik7Cit9CisKK3N0YXRpYyB2b2lkIGNwX2luaXRfaHcgKHN0cnVjdCBjcF9wcml2YXRlICpjcCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY3AtPmRldjsKKwlkbWFfYWRkcl90IHJpbmdfZG1hOworCisJY3BfcmVzZXRfaHcoY3ApOworCisJY3B3OF9mIChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisKKwkvKiBSZXN0b3JlIG91ciBpZGVhIG9mIHRoZSBNQUMgYWRkcmVzcy4gKi8KKwljcHczMl9mIChNQUMwICsgMCwgY3B1X3RvX2xlMzIgKCoodTMyICopIChkZXYtPmRldl9hZGRyICsgMCkpKTsKKwljcHczMl9mIChNQUMwICsgNCwgY3B1X3RvX2xlMzIgKCoodTMyICopIChkZXYtPmRldl9hZGRyICsgNCkpKTsKKworCWNwX3N0YXJ0X2h3KGNwKTsKKwljcHc4KFR4VGhyZXNoLCAweDA2KTsgLyogWFhYIGNvbnZlcnQgbWFnaWMgbnVtIHRvIGEgY29uc3RhbnQgKi8KKworCV9fY3Bfc2V0X3J4X21vZGUoZGV2KTsKKwljcHczMl9mIChUeENvbmZpZywgSUZHIHwgKFRYX0RNQV9CVVJTVCA8PCBUeERNQVNoaWZ0KSk7CisKKwljcHc4KENvbmZpZzEsIGNwcjgoQ29uZmlnMSkgfCBEcml2ZXJMb2FkZWQgfCBQTUVuYWJsZSk7CisJLyogRGlzYWJsZSBXYWtlLW9uLUxBTi4gQ2FuIGJlIHR1cm5lZCBvbiB3aXRoIEVUSFRPT0xfU1dPTCAqLworCWNwdzgoQ29uZmlnMywgUEFSTUVuYWJsZSk7CisJY3AtPndvbF9lbmFibGVkID0gMDsKKworCWNwdzgoQ29uZmlnNSwgY3ByOChDb25maWc1KSAmIFBNRVN0YXR1cyk7IAorCisJY3B3MzJfZihIaVR4UmluZ0FkZHIsIDApOworCWNwdzMyX2YoSGlUeFJpbmdBZGRyICsgNCwgMCk7CisKKwlyaW5nX2RtYSA9IGNwLT5yaW5nX2RtYTsKKwljcHczMl9mKFJ4UmluZ0FkZHIsIHJpbmdfZG1hICYgMHhmZmZmZmZmZik7CisJY3B3MzJfZihSeFJpbmdBZGRyICsgNCwgKHJpbmdfZG1hID4+IDE2KSA+PiAxNik7CisKKwlyaW5nX2RtYSArPSBzaXplb2Yoc3RydWN0IGNwX2Rlc2MpICogQ1BfUlhfUklOR19TSVpFOworCWNwdzMyX2YoVHhSaW5nQWRkciwgcmluZ19kbWEgJiAweGZmZmZmZmZmKTsKKwljcHczMl9mKFR4UmluZ0FkZHIgKyA0LCAocmluZ19kbWEgPj4gMTYpID4+IDE2KTsKKworCWNwdzE2KE11bHRpSW50ciwgMCk7CisKKwljcHcxNl9mKEludHJNYXNrLCBjcF9pbnRyX21hc2spOworCisJY3B3OF9mKENmZzkzNDYsIENmZzkzNDZfTG9jayk7Cit9CisKK3N0YXRpYyBpbnQgY3BfcmVmaWxsX3J4IChzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3ApCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBDUF9SWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCXNrYiA9IGRldl9hbGxvY19za2IoY3AtPnJ4X2J1Zl9zeiArIFJYX09GRlNFVCk7CisJCWlmICghc2tiKQorCQkJZ290byBlcnJfb3V0OworCisJCXNrYi0+ZGV2ID0gY3AtPmRldjsKKwkJc2tiX3Jlc2VydmUoc2tiLCBSWF9PRkZTRVQpOworCisJCWNwLT5yeF9za2JbaV0ubWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKGNwLT5wZGV2LAorCQkJc2tiLT50YWlsLCBjcC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQljcC0+cnhfc2tiW2ldLnNrYiA9IHNrYjsKKwkJY3AtPnJ4X3NrYltpXS5mcmFnID0gMDsKKworCQljcC0+cnhfcmluZ1tpXS5vcHRzMiA9IDA7CisJCWNwLT5yeF9yaW5nW2ldLmFkZHIgPSBjcHVfdG9fbGU2NChjcC0+cnhfc2tiW2ldLm1hcHBpbmcpOworCQlpZiAoaSA9PSAoQ1BfUlhfUklOR19TSVpFIC0gMSkpCisJCQljcC0+cnhfcmluZ1tpXS5vcHRzMSA9CisJCQkJY3B1X3RvX2xlMzIoRGVzY093biB8IFJpbmdFbmQgfCBjcC0+cnhfYnVmX3N6KTsKKwkJZWxzZQorCQkJY3AtPnJ4X3JpbmdbaV0ub3B0czEgPQorCQkJCWNwdV90b19sZTMyKERlc2NPd24gfCBjcC0+cnhfYnVmX3N6KTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwljcF9jbGVhbl9yaW5ncyhjcCk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBpbnQgY3BfaW5pdF9yaW5ncyAoc3RydWN0IGNwX3ByaXZhdGUgKmNwKQoreworCW1lbXNldChjcC0+dHhfcmluZywgMCwgc2l6ZW9mKHN0cnVjdCBjcF9kZXNjKSAqIENQX1RYX1JJTkdfU0laRSk7CisJY3AtPnR4X3JpbmdbQ1BfVFhfUklOR19TSVpFIC0gMV0ub3B0czEgPSBjcHVfdG9fbGUzMihSaW5nRW5kKTsKKworCWNwLT5yeF90YWlsID0gMDsKKwljcC0+dHhfaGVhZCA9IGNwLT50eF90YWlsID0gMDsKKworCXJldHVybiBjcF9yZWZpbGxfcnggKGNwKTsKK30KKworc3RhdGljIGludCBjcF9hbGxvY19yaW5ncyAoc3RydWN0IGNwX3ByaXZhdGUgKmNwKQoreworCXZvaWQgKm1lbTsKKworCW1lbSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGNwLT5wZGV2LCBDUF9SSU5HX0JZVEVTLCAmY3AtPnJpbmdfZG1hKTsKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljcC0+cnhfcmluZyA9IG1lbTsKKwljcC0+dHhfcmluZyA9ICZjcC0+cnhfcmluZ1tDUF9SWF9SSU5HX1NJWkVdOworCisJbWVtICs9IChDUF9SSU5HX0JZVEVTIC0gQ1BfU1RBVFNfU0laRSk7CisJY3AtPm5pY19zdGF0cyA9IG1lbTsKKwljcC0+bmljX3N0YXRzX2RtYSA9IGNwLT5yaW5nX2RtYSArIChDUF9SSU5HX0JZVEVTIC0gQ1BfU1RBVFNfU0laRSk7CisKKwlyZXR1cm4gY3BfaW5pdF9yaW5ncyhjcCk7Cit9CisKK3N0YXRpYyB2b2lkIGNwX2NsZWFuX3JpbmdzIChzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3ApCit7CisJdW5zaWduZWQgaTsKKworCW1lbXNldChjcC0+cnhfcmluZywgMCwgc2l6ZW9mKHN0cnVjdCBjcF9kZXNjKSAqIENQX1JYX1JJTkdfU0laRSk7CisJbWVtc2V0KGNwLT50eF9yaW5nLCAwLCBzaXplb2Yoc3RydWN0IGNwX2Rlc2MpICogQ1BfVFhfUklOR19TSVpFKTsKKworCWZvciAoaSA9IDA7IGkgPCBDUF9SWF9SSU5HX1NJWkU7IGkrKykgeworCQlpZiAoY3AtPnJ4X3NrYltpXS5za2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoY3AtPnBkZXYsIGNwLT5yeF9za2JbaV0ubWFwcGluZywKKwkJCQkJIGNwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKGNwLT5yeF9za2JbaV0uc2tiKTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBDUF9UWF9SSU5HX1NJWkU7IGkrKykgeworCQlpZiAoY3AtPnR4X3NrYltpXS5za2IpIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSBjcC0+dHhfc2tiW2ldLnNrYjsKKwkJCXBjaV91bm1hcF9zaW5nbGUoY3AtPnBkZXYsIGNwLT50eF9za2JbaV0ubWFwcGluZywKKwkJCQkJIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCWNwLT5uZXRfc3RhdHMudHhfZHJvcHBlZCsrOworCQl9CisJfQorCisJbWVtc2V0KCZjcC0+cnhfc2tiLCAwLCBzaXplb2Yoc3RydWN0IHJpbmdfaW5mbykgKiBDUF9SWF9SSU5HX1NJWkUpOworCW1lbXNldCgmY3AtPnR4X3NrYiwgMCwgc2l6ZW9mKHN0cnVjdCByaW5nX2luZm8pICogQ1BfVFhfUklOR19TSVpFKTsKK30KKworc3RhdGljIHZvaWQgY3BfZnJlZV9yaW5ncyAoc3RydWN0IGNwX3ByaXZhdGUgKmNwKQoreworCWNwX2NsZWFuX3JpbmdzKGNwKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGNwLT5wZGV2LCBDUF9SSU5HX0JZVEVTLCBjcC0+cnhfcmluZywgY3AtPnJpbmdfZG1hKTsKKwljcC0+cnhfcmluZyA9IE5VTEw7CisJY3AtPnR4X3JpbmcgPSBOVUxMOworCWNwLT5uaWNfc3RhdHMgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGNwX29wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmM7CisKKwlpZiAobmV0aWZfbXNnX2lmdXAoY3ApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVuYWJsaW5nIGludGVyZmFjZVxuIiwgZGV2LT5uYW1lKTsKKworCXJjID0gY3BfYWxsb2NfcmluZ3MoY3ApOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJY3BfaW5pdF9odyhjcCk7CisKKwlyYyA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBjcF9pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfaHc7CisKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCW1paV9jaGVja19tZWRpYSgmY3AtPm1paV9pZiwgbmV0aWZfbXNnX2xpbmsoY3ApLCBUUlVFKTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfaHc6CisJY3Bfc3RvcF9odyhjcCk7CisJY3BfZnJlZV9yaW5ncyhjcCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGNwX2Nsb3NlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChuZXRpZl9tc2dfaWZkb3duKGNwKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkaXNhYmxpbmcgaW50ZXJmYWNlXG4iLCBkZXYtPm5hbWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNwLT5sb2NrLCBmbGFncyk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworCWNwX3N0b3BfaHcoY3ApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3AtPmxvY2ssIGZsYWdzKTsKKworCXN5bmNocm9uaXplX2lycShkZXYtPmlycSk7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwljcF9mcmVlX3JpbmdzKGNwKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIEJST0tFTgorc3RhdGljIGludCBjcF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBjaGVjayBmb3IgaW52YWxpZCBNVFUsIGFjY29yZGluZyB0byBoYXJkd2FyZSBsaW1pdHMgKi8KKwlpZiAobmV3X210dSA8IENQX01JTl9NVFUgfHwgbmV3X210dSA+IENQX01BWF9NVFUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogaWYgbmV0d29yayBpbnRlcmZhY2Ugbm90IHVwLCBubyBuZWVkIGZvciBjb21wbGV4aXR5ICovCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJZGV2LT5tdHUgPSBuZXdfbXR1OworCQljcF9zZXRfcnhidWZzaXplKGNwKTsJLyogc2V0IG5ldyByeCBidWYgc2l6ZSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3AtPmxvY2ssIGZsYWdzKTsKKworCWNwX3N0b3BfaHcoY3ApOwkJCS8qIHN0b3AgaC93IGFuZCBmcmVlIHJpbmdzICovCisJY3BfY2xlYW5fcmluZ3MoY3ApOworCisJZGV2LT5tdHUgPSBuZXdfbXR1OworCWNwX3NldF9yeGJ1ZnNpemUoY3ApOwkJLyogc2V0IG5ldyByeCBidWYgc2l6ZSAqLworCisJcmMgPSBjcF9pbml0X3JpbmdzKGNwKTsJCS8qIHJlYWxsb2MgYW5kIHJlc3RhcnQgaC93ICovCisJY3Bfc3RhcnRfaHcoY3ApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3AtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByYzsKK30KKyNlbmRpZiAvKiBCUk9LRU4gKi8KKworc3RhdGljIGNoYXIgbWlpXzJfODEzOV9tYXBbOF0gPSB7CisJQmFzaWNNb2RlQ3RybCwKKwlCYXNpY01vZGVTdGF0dXMsCisJMCwKKwkwLAorCU5XYXlBZHZlcnQsCisJTldheUxQQVIsCisJTldheUV4cGFuc2lvbiwKKwkwCit9OworCitzdGF0aWMgaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pCit7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiBsb2NhdGlvbiA8IDggJiYgbWlpXzJfODEzOV9tYXBbbG9jYXRpb25dID8KKwkgICAgICAgcmVhZHcoY3AtPnJlZ3MgKyBtaWlfMl84MTM5X21hcFtsb2NhdGlvbl0pIDogMDsKK30KKworCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwKKwkJICAgICAgIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3AgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKGxvY2F0aW9uID09IDApIHsKKwkJY3B3OChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisJCWNwdzE2KEJhc2ljTW9kZUN0cmwsIHZhbHVlKTsKKwkJY3B3OChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOworCX0gZWxzZSBpZiAobG9jYXRpb24gPCA4ICYmIG1paV8yXzgxMzlfbWFwW2xvY2F0aW9uXSkKKwkJY3B3MTYobWlpXzJfODEzOV9tYXBbbG9jYXRpb25dLCB2YWx1ZSk7Cit9CisKKy8qIFNldCB0aGUgZXRodG9vbCBXYWtlLW9uLUxBTiBzZXR0aW5ncyAqLworc3RhdGljIGludCBuZXRkZXZfc2V0X3dvbCAoc3RydWN0IGNwX3ByaXZhdGUgKmNwLAorCQkJICAgY29uc3Qgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXU4IG9wdGlvbnM7CisKKwlvcHRpb25zID0gY3ByOCAoQ29uZmlnMykgJiB+KExpbmtVcCB8IE1hZ2ljUGFja2V0KTsKKwkvKiBJZiBXT0wgaXMgYmVpbmcgZGlzYWJsZWQsIG5vIG5lZWQgZm9yIGNvbXBsZXhpdHkgKi8KKwlpZiAod29sLT53b2xvcHRzKSB7CisJCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX1BIWSkJb3B0aW9ucyB8PSBMaW5rVXA7CisJCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX01BR0lDKQlvcHRpb25zIHw9IE1hZ2ljUGFja2V0OworCX0KKworCWNwdzggKENmZzkzNDYsIENmZzkzNDZfVW5sb2NrKTsKKwljcHc4IChDb25maWczLCBvcHRpb25zKTsKKwljcHc4IChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOworCisJb3B0aW9ucyA9IDA7IC8qIFBhcmFub2lhIHNldHRpbmcgKi8KKwlvcHRpb25zID0gY3ByOCAoQ29uZmlnNSkgJiB+KFVXRiB8IE1XRiB8IEJXRik7CisJLyogSWYgV09MIGlzIGJlaW5nIGRpc2FibGVkLCBubyBuZWVkIGZvciBjb21wbGV4aXR5ICovCisJaWYgKHdvbC0+d29sb3B0cykgeworCQlpZiAod29sLT53b2xvcHRzICYgV0FLRV9VQ0FTVCkgIG9wdGlvbnMgfD0gVVdGOworCQlpZiAod29sLT53b2xvcHRzICYgV0FLRV9CQ0FTVCkJb3B0aW9ucyB8PSBCV0Y7CisJCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX01DQVNUKQlvcHRpb25zIHw9IE1XRjsKKwl9CisKKwljcHc4IChDb25maWc1LCBvcHRpb25zKTsKKworCWNwLT53b2xfZW5hYmxlZCA9ICh3b2wtPndvbG9wdHMpID8gMSA6IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IHRoZSBldGh0b29sIFdha2Utb24tTEFOIHNldHRpbmdzICovCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X3dvbCAoc3RydWN0IGNwX3ByaXZhdGUgKmNwLAorCSAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJdTggb3B0aW9uczsKKworCXdvbC0+d29sb3B0cyAgID0gMDsgLyogU3RhcnQgZnJvbSBzY3JhdGNoICovCisJd29sLT5zdXBwb3J0ZWQgPSBXQUtFX1BIWSAgIHwgV0FLRV9CQ0FTVCB8IFdBS0VfTUFHSUMgfAorCQkgICAgICAgICBXQUtFX01DQVNUIHwgV0FLRV9VQ0FTVDsKKwkvKiBXZSBkb24ndCBuZWVkIHRvIGdvIG9uIGlmIFdPTCBpcyBkaXNhYmxlZCAqLworCWlmICghY3AtPndvbF9lbmFibGVkKSByZXR1cm47CisJCisJb3B0aW9ucyAgICAgICAgPSBjcHI4IChDb25maWczKTsKKwlpZiAob3B0aW9ucyAmIExpbmtVcCkgICAgICAgIHdvbC0+d29sb3B0cyB8PSBXQUtFX1BIWTsKKwlpZiAob3B0aW9ucyAmIE1hZ2ljUGFja2V0KSAgIHdvbC0+d29sb3B0cyB8PSBXQUtFX01BR0lDOworCisJb3B0aW9ucyAgICAgICAgPSAwOyAvKiBQYXJhbm9pYSBzZXR0aW5nICovCisJb3B0aW9ucyAgICAgICAgPSBjcHI4IChDb25maWc1KTsKKwlpZiAob3B0aW9ucyAmIFVXRikgICAgICAgICAgIHdvbC0+d29sb3B0cyB8PSBXQUtFX1VDQVNUOworCWlmIChvcHRpb25zICYgQldGKSAgICAgICAgICAgd29sLT53b2xvcHRzIHw9IFdBS0VfQkNBU1Q7CisJaWYgKG9wdGlvbnMgJiBNV0YpICAgICAgICAgICB3b2wtPndvbG9wdHMgfD0gV0FLRV9NQ0FTVDsKK30KKworc3RhdGljIHZvaWQgY3BfZ2V0X2RydmluZm8gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXN0cmNweSAoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5IChpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RyY3B5IChpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoY3AtPnBkZXYpKTsKK30KKworc3RhdGljIGludCBjcF9nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gQ1BfUkVHU19TSVpFOworfQorCitzdGF0aWMgaW50IGNwX2dldF9zdGF0c19jb3VudCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gQ1BfTlVNX1NUQVRTOworfQorCitzdGF0aWMgaW50IGNwX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3AgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNwLT5sb2NrLCBmbGFncyk7CisJcmMgPSBtaWlfZXRodG9vbF9nc2V0KCZjcC0+bWlpX2lmLCBjbWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgY3Bfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3AtPmxvY2ssIGZsYWdzKTsKKwlyYyA9IG1paV9ldGh0b29sX3NzZXQoJmNwLT5taWlfaWYsIGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3AtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBjcF9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbWlpX253YXlfcmVzdGFydCgmY3AtPm1paV9pZik7Cit9CisKK3N0YXRpYyB1MzIgY3BfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gY3AtPm1zZ19lbmFibGU7Cit9CisKK3N0YXRpYyB2b2lkIGNwX3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdmFsdWUpCit7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljcC0+bXNnX2VuYWJsZSA9IHZhbHVlOworfQorCitzdGF0aWMgdTMyIGNwX2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gKGNwcjE2KENwQ21kKSAmIFJ4Q2hrU3VtKSA/IDEgOiAwOworfQorCitzdGF0aWMgaW50IGNwX3NldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQoreworCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7CisJdTE2IGNtZCA9IGNwLT5jcGNtZCwgbmV3Y21kOworCisJbmV3Y21kID0gY21kOworCisJaWYgKGRhdGEpCisJCW5ld2NtZCB8PSBSeENoa1N1bTsKKwllbHNlCisJCW5ld2NtZCAmPSB+UnhDaGtTdW07CisKKwlpZiAobmV3Y21kICE9IGNtZCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjcC0+bG9jaywgZmxhZ3MpOworCQljcC0+Y3BjbWQgPSBuZXdjbWQ7CisJCWNwdzE2X2YoQ3BDbWQsIG5ld2NtZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwLT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNwX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsCisJCSAgICAgICAgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocmVncy0+bGVuIDwgQ1BfUkVHU19TSVpFKQorCQlyZXR1cm4gLyogLUVJTlZBTCAqLzsKKworCXJlZ3MtPnZlcnNpb24gPSBDUF9SRUdTX1ZFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjcC0+bG9jaywgZmxhZ3MpOworCW1lbWNweV9mcm9taW8ocCwgY3AtPnJlZ3MsIENQX1JFR1NfU0laRSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3AtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgY3BfZ2V0X3dvbCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmY3AtPmxvY2ssIGZsYWdzKTsKKwluZXRkZXZfZ2V0X3dvbCAoY3AsIHdvbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmNwLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgY3Bfc2V0X3dvbCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJmNwLT5sb2NrLCBmbGFncyk7CisJcmMgPSBuZXRkZXZfc2V0X3dvbCAoY3AsIHdvbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmNwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGNwX2dldF9zdHJpbmdzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqYnVmKQoreworCXN3aXRjaCAoc3RyaW5nc2V0KSB7CisJY2FzZSBFVEhfU1NfU1RBVFM6CisJCW1lbWNweShidWYsICZldGh0b29sX3N0YXRzX2tleXMsIHNpemVvZihldGh0b29sX3N0YXRzX2tleXMpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgY3BfZ2V0X2V0aHRvb2xfc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqZXN0YXRzLCB1NjQgKnRtcF9zdGF0cykKK3sKKwlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCB3b3JrID0gMTAwOworCWludCBpOworCisJLyogYmVnaW4gTklDIHN0YXRpc3RpY3MgZHVtcCAqLworCWNwdzMyKFN0YXRzQWRkciArIDQsIChjcC0+bmljX3N0YXRzX2RtYSA+PiAxNikgPj4gMTYpOworCWNwdzMyKFN0YXRzQWRkciwgKGNwLT5uaWNfc3RhdHNfZG1hICYgMHhmZmZmZmZmZikgfCBEdW1wU3RhdHMpOworCWNwcjMyKFN0YXRzQWRkcik7CisKKwl3aGlsZSAod29yay0tID4gMCkgeworCQlpZiAoKGNwcjMyKFN0YXRzQWRkcikgJiBEdW1wU3RhdHMpID09IDApCisJCQlicmVhazsKKwkJY3B1X3JlbGF4KCk7CisJfQorCisJaWYgKGNwcjMyKFN0YXRzQWRkcikgJiBEdW1wU3RhdHMpCisJCXJldHVybiAvKiAtRUlPICovOworCisJaSA9IDA7CisJdG1wX3N0YXRzW2krK10gPSBsZTY0X3RvX2NwdShjcC0+bmljX3N0YXRzLT50eF9vayk7CisJdG1wX3N0YXRzW2krK10gPSBsZTY0X3RvX2NwdShjcC0+bmljX3N0YXRzLT5yeF9vayk7CisJdG1wX3N0YXRzW2krK10gPSBsZTY0X3RvX2NwdShjcC0+bmljX3N0YXRzLT50eF9lcnIpOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoY3AtPm5pY19zdGF0cy0+cnhfZXJyKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMTZfdG9fY3B1KGNwLT5uaWNfc3RhdHMtPnJ4X2ZpZm8pOworCXRtcF9zdGF0c1tpKytdID0gbGUxNl90b19jcHUoY3AtPm5pY19zdGF0cy0+ZnJhbWVfYWxpZ24pOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoY3AtPm5pY19zdGF0cy0+dHhfb2tfMWNvbCk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShjcC0+bmljX3N0YXRzLT50eF9va19tY29sKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlNjRfdG9fY3B1KGNwLT5uaWNfc3RhdHMtPnJ4X29rX3BoeXMpOworCXRtcF9zdGF0c1tpKytdID0gbGU2NF90b19jcHUoY3AtPm5pY19zdGF0cy0+cnhfb2tfYmNhc3QpOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoY3AtPm5pY19zdGF0cy0+cnhfb2tfbWNhc3QpOworCXRtcF9zdGF0c1tpKytdID0gbGUxNl90b19jcHUoY3AtPm5pY19zdGF0cy0+dHhfYWJvcnQpOworCXRtcF9zdGF0c1tpKytdID0gbGUxNl90b19jcHUoY3AtPm5pY19zdGF0cy0+dHhfdW5kZXJydW4pOworCXRtcF9zdGF0c1tpKytdID0gY3AtPmNwX3N0YXRzLnJ4X2ZyYWdzOworCWlmIChpICE9IENQX05VTV9TVEFUUykKKwkJQlVHKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgY3BfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IGNwX2dldF9kcnZpbmZvLAorCS5nZXRfcmVnc19sZW4JCT0gY3BfZ2V0X3JlZ3NfbGVuLAorCS5nZXRfc3RhdHNfY291bnQJPSBjcF9nZXRfc3RhdHNfY291bnQsCisJLmdldF9zZXR0aW5ncwkJPSBjcF9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSBjcF9zZXRfc2V0dGluZ3MsCisJLm53YXlfcmVzZXQJCT0gY3BfbndheV9yZXNldCwKKwkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X21zZ2xldmVsCQk9IGNwX2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCQk9IGNwX3NldF9tc2dsZXZlbCwKKwkuZ2V0X3J4X2NzdW0JCT0gY3BfZ2V0X3J4X2NzdW0sCisJLnNldF9yeF9jc3VtCQk9IGNwX3NldF9yeF9jc3VtLAorCS5nZXRfdHhfY3N1bQkJPSBldGh0b29sX29wX2dldF90eF9jc3VtLAorCS5zZXRfdHhfY3N1bQkJPSBldGh0b29sX29wX3NldF90eF9jc3VtLCAvKiBsb2NhbCEgKi8KKwkuZ2V0X3NnCQkJPSBldGh0b29sX29wX2dldF9zZywKKwkuc2V0X3NnCQkJPSBldGh0b29sX29wX3NldF9zZywKKwkuZ2V0X3JlZ3MJCT0gY3BfZ2V0X3JlZ3MsCisJLmdldF93b2wJCT0gY3BfZ2V0X3dvbCwKKwkuc2V0X3dvbAkJPSBjcF9zZXRfd29sLAorCS5nZXRfc3RyaW5ncwkJPSBjcF9nZXRfc3RyaW5ncywKKwkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBjcF9nZXRfZXRodG9vbF9zdGF0cywKK307CisKK3N0YXRpYyBpbnQgY3BfaW9jdGwgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjcC0+bG9jaywgZmxhZ3MpOworCXJjID0gZ2VuZXJpY19taWlfaW9jdGwoJmNwLT5taWlfaWYsIGlmX21paShycSksIGNtZCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3AtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFNlcmlhbCBFRVBST00gc2VjdGlvbi4gKi8KKworLyogIEVFUFJPTV9DdHJsIGJpdHMuICovCisjZGVmaW5lIEVFX1NISUZUX0NMSwkweDA0CS8qIEVFUFJPTSBzaGlmdCBjbG9jay4gKi8KKyNkZWZpbmUgRUVfQ1MJCQkweDA4CS8qIEVFUFJPTSBjaGlwIHNlbGVjdC4gKi8KKyNkZWZpbmUgRUVfREFUQV9XUklURQkweDAyCS8qIEVFUFJPTSBjaGlwIGRhdGEgaW4uICovCisjZGVmaW5lIEVFX1dSSVRFXzAJCTB4MDAKKyNkZWZpbmUgRUVfV1JJVEVfMQkJMHgwMgorI2RlZmluZSBFRV9EQVRBX1JFQUQJMHgwMQkvKiBFRVBST00gY2hpcCBkYXRhIG91dC4gKi8KKyNkZWZpbmUgRUVfRU5CCQkJKDB4ODAgfCBFRV9DUykKKworLyogRGVsYXkgYmV0d2VlbiBFRVBST00gY2xvY2sgdHJhbnNpdGlvbnMuCisgICBObyBleHRyYSBkZWxheSBpcyBuZWVkZWQgd2l0aCAzM01oeiBQQ0ksIGJ1dCA2Nk1oeiBtYXkgY2hhbmdlIHRoaXMuCisgKi8KKworI2RlZmluZSBlZXByb21fZGVsYXkoKQlyZWFkbChlZV9hZGRyKQorCisvKiBUaGUgRUVQUk9NIGNvbW1hbmRzIGluY2x1ZGUgdGhlIGFsd2F5LXNldCBsZWFkaW5nIGJpdC4gKi8KKyNkZWZpbmUgRUVfV1JJVEVfQ01ECSg1KQorI2RlZmluZSBFRV9SRUFEX0NNRAkJKDYpCisjZGVmaW5lIEVFX0VSQVNFX0NNRAkoNykKKworc3RhdGljIGludCByZWFkX2VlcHJvbSAodm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBsb2NhdGlvbiwgaW50IGFkZHJfbGVuKQoreworCWludCBpOworCXVuc2lnbmVkIHJldHZhbCA9IDA7CisJdm9pZCBfX2lvbWVtICplZV9hZGRyID0gaW9hZGRyICsgQ2ZnOTM0NjsKKwlpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IChFRV9SRUFEX0NNRCA8PCBhZGRyX2xlbik7CisKKwl3cml0ZWIgKEVFX0VOQiAmIH5FRV9DUywgZWVfYWRkcik7CisJd3JpdGViIChFRV9FTkIsIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheSAoKTsKKworCS8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gNCArIGFkZHJfbGVuOyBpID49IDA7IGktLSkgeworCQlpbnQgZGF0YXZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IEVFX0RBVEFfV1JJVEUgOiAwOworCQl3cml0ZWIgKEVFX0VOQiB8IGRhdGF2YWwsIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkgKCk7CisJCXdyaXRlYiAoRUVfRU5CIHwgZGF0YXZhbCB8IEVFX1NISUZUX0NMSywgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheSAoKTsKKwl9CisJd3JpdGViIChFRV9FTkIsIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheSAoKTsKKworCWZvciAoaSA9IDE2OyBpID4gMDsgaS0tKSB7CisJCXdyaXRlYiAoRUVfRU5CIHwgRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5ICgpOworCQlyZXR2YWwgPQorCQkgICAgKHJldHZhbCA8PCAxKSB8ICgocmVhZGIgKGVlX2FkZHIpICYgRUVfREFUQV9SRUFEKSA/IDEgOgorCQkJCSAgICAgMCk7CisJCXdyaXRlYiAoRUVfRU5CLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5ICgpOworCX0KKworCS8qIFRlcm1pbmF0ZSB0aGUgRUVQUk9NIGFjY2Vzcy4gKi8KKwl3cml0ZWIgKH5FRV9DUywgZWVfYWRkcik7CisJZWVwcm9tX2RlbGF5ICgpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogUHV0IHRoZSBib2FyZCBpbnRvIEQzY29sZCBzdGF0ZSBhbmQgd2FpdCBmb3IgV2FrZVVwIHNpZ25hbCAqLworc3RhdGljIHZvaWQgY3Bfc2V0X2QzX3N0YXRlIChzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3ApCit7CisJcGNpX2VuYWJsZV93YWtlIChjcC0+cGRldiwgMCwgMSk7IC8qIEVuYWJsZSBQTUUjIGdlbmVyYXRpb24gKi8KKwlwY2lfc2V0X3Bvd2VyX3N0YXRlIChjcC0+cGRldiwgUENJX0QzaG90KTsKK30KKworc3RhdGljIGludCBjcF9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3A7CisJaW50IHJjOworCXZvaWQgX19pb21lbSAqcmVnczsKKwlsb25nIHBjaWFkZHI7CisJdW5zaWduZWQgaW50IGFkZHJfbGVuLCBpLCBwY2lfdXNpbmdfZGFjOworCXU4IHBjaV9yZXY7CisKKyNpZm5kZWYgTU9EVUxFCisJc3RhdGljIGludCB2ZXJzaW9uX3ByaW50ZWQ7CisJaWYgKHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50aygiJXMiLCB2ZXJzaW9uKTsKKyNlbmRpZgorCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmcGNpX3Jldik7CisKKwlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfUkVBTFRFSyAmJgorCSAgICBwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9SRUFMVEVLXzgxMzkgJiYgcGNpX3JldiA8IDB4MjApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicGNpIGRldiAlcyAoaWQgJTA0eDolMDR4IHJldiAlMDJ4KSBpcyBub3QgYW4gODEzOUMrIGNvbXBhdGlibGUgY2hpcFxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpLCBwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwgcGNpX3Jldik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlRyeSB0aGUgXCI4MTM5dG9vXCIgZHJpdmVyIGluc3RlYWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBjcF9wcml2YXRlKSk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJY3AgPSBuZXRkZXZfcHJpdihkZXYpOworCWNwLT5wZGV2ID0gcGRldjsKKwljcC0+ZGV2ID0gZGV2OworCWNwLT5tc2dfZW5hYmxlID0gKGRlYnVnIDwgMCA/IENQX0RFRl9NU0dfRU5BQkxFIDogZGVidWcpOworCXNwaW5fbG9ja19pbml0ICgmY3AtPmxvY2spOworCWNwLT5taWlfaWYuZGV2ID0gZGV2OworCWNwLT5taWlfaWYubWRpb19yZWFkID0gbWRpb19yZWFkOworCWNwLT5taWlfaWYubWRpb193cml0ZSA9IG1kaW9fd3JpdGU7CisJY3AtPm1paV9pZi5waHlfaWQgPSBDUF9JTlRFUk5BTF9QSFk7CisJY3AtPm1paV9pZi5waHlfaWRfbWFzayA9IDB4MWY7CisJY3AtPm1paV9pZi5yZWdfbnVtX21hc2sgPSAweDFmOworCWNwX3NldF9yeGJ1ZnNpemUoY3ApOworCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9mcmVlOworCisJcmMgPSBwY2lfc2V0X213aShwZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9td2k7CisKKwlwY2lhZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOworCWlmICghcGNpYWRkcikgeworCQlyYyA9IC1FSU87CisJCXByaW50ayhLRVJOX0VSUiBQRlggIm5vIE1NSU8gcmVzb3VyY2UgZm9yIHBjaSBkZXYgJXNcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gZXJyX291dF9yZXM7CisJfQorCWlmIChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpIDwgQ1BfUkVHU19TSVpFKSB7CisJCXJjID0gLUVJTzsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTU1JTyByZXNvdXJjZSAoJWx4KSB0b28gc21hbGwgb24gcGNpIGRldiAlc1xuIiwKKwkJICAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSksIHBjaV9uYW1lKHBkZXYpKTsKKwkJZ290byBlcnJfb3V0X3JlczsKKwl9CisKKwkvKiBDb25maWd1cmUgRE1BIGF0dHJpYnV0ZXMuICovCisJaWYgKChzaXplb2YoZG1hX2FkZHJfdCkgPiA0KSAmJgorCSAgICAhcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCkgJiYKKwkgICAgIXBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSkgeworCQlwY2lfdXNpbmdfZGFjID0gMTsKKwl9IGVsc2UgeworCQlwY2lfdXNpbmdfZGFjID0gMDsKKworCQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZlVMTCk7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uLCAiCisJCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCQlnb3RvIGVycl9vdXRfcmVzOworCQl9CisJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZVTEwpOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIk5vIHVzYWJsZSBjb25zaXN0ZW50IERNQSBjb25maWd1cmF0aW9uLCAiCisJCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCQlnb3RvIGVycl9vdXRfcmVzOworCQl9CisJfQorCisJY3AtPmNwY21kID0gKHBjaV91c2luZ19kYWMgPyBQQ0lEQUMgOiAwKSB8CisJCSAgICBQQ0lNdWxSVyB8IFJ4Q2hrU3VtIHwgQ3BSeE9uIHwgQ3BUeE9uOworCisJcmVncyA9IGlvcmVtYXAocGNpYWRkciwgQ1BfUkVHU19TSVpFKTsKKwlpZiAoIXJlZ3MpIHsKKwkJcmMgPSAtRUlPOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgbWFwIFBDSSBNTUlPICglbHhAJWx4KSBvbiBwY2kgZGV2ICVzXG4iLAorCQkgICAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSwgcGNpYWRkciwgcGNpX25hbWUocGRldikpOworCQlnb3RvIGVycl9vdXRfcmVzOworCX0KKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKSByZWdzOworCWNwLT5yZWdzID0gcmVnczsKKworCWNwX3N0b3BfaHcoY3ApOworCisJLyogcmVhZCBNQUMgYWRkcmVzcyBmcm9tIEVFUFJPTSAqLworCWFkZHJfbGVuID0gcmVhZF9lZXByb20gKHJlZ3MsIDAsIDgpID09IDB4ODEyOSA/IDggOiA2OworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCSgodTE2ICopIChkZXYtPmRldl9hZGRyKSlbaV0gPQorCQkgICAgbGUxNl90b19jcHUgKHJlYWRfZWVwcm9tIChyZWdzLCBpICsgNywgYWRkcl9sZW4pKTsKKworCWRldi0+b3BlbiA9IGNwX29wZW47CisJZGV2LT5zdG9wID0gY3BfY2xvc2U7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBjcF9zZXRfcnhfbW9kZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGNwX3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgPSBjcF9nZXRfc3RhdHM7CisJZGV2LT5kb19pb2N0bCA9IGNwX2lvY3RsOworCWRldi0+cG9sbCA9IGNwX3J4X3BvbGw7CisJZGV2LT53ZWlnaHQgPSAxNjsJLyogYXJiaXRyYXJ5PyBmcm9tIE5BUElfSE9XVE8udHh0LiAqLworI2lmZGVmIEJST0tFTgorCWRldi0+Y2hhbmdlX210dSA9IGNwX2NoYW5nZV9tdHU7CisjZW5kaWYKKwlkZXYtPmV0aHRvb2xfb3BzID0gJmNwX2V0aHRvb2xfb3BzOworI2lmIDAKKwlkZXYtPnR4X3RpbWVvdXQgPSBjcF90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworI2VuZGlmCisKKyNpZiBDUF9WTEFOX1RBR19VU0VECisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlg7CisJZGV2LT52bGFuX3J4X3JlZ2lzdGVyID0gY3Bfdmxhbl9yeF9yZWdpc3RlcjsKKwlkZXYtPnZsYW5fcnhfa2lsbF92aWQgPSBjcF92bGFuX3J4X2tpbGxfdmlkOworI2VuZGlmCisKKwlpZiAocGNpX3VzaW5nX2RhYykKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CisKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKworCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfaW9tYXA7CisKKwlwcmludGsgKEtFUk5fSU5GTyAiJXM6IFJUTC04MTM5QysgYXQgMHglbHgsICIKKwkJIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LCAiCisJCSJJUlEgJWRcbiIsCisJCWRldi0+bmFtZSwKKwkJZGV2LT5iYXNlX2FkZHIsCisJCWRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sCisJCWRldi0+ZGV2X2FkZHJbMl0sIGRldi0+ZGV2X2FkZHJbM10sCisJCWRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0sCisJCWRldi0+aXJxKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJLyogZW5hYmxlIGJ1c21hc3RlcmluZyBhbmQgbWVtb3J5LXdyaXRlLWludmFsaWRhdGUgKi8KKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlmIChjcC0+d29sX2VuYWJsZWQpIGNwX3NldF9kM19zdGF0ZSAoY3ApOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfaW9tYXA6CisJaW91bm1hcChyZWdzKTsKK2Vycl9vdXRfcmVzOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfb3V0X213aToKKwlwY2lfY2xlYXJfbXdpKHBkZXYpOworZXJyX291dF9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK2Vycl9vdXRfZnJlZToKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgY3BfcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3AgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCFkZXYpCisJCUJVRygpOworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaW91bm1hcChjcC0+cmVncyk7CisJaWYgKGNwLT53b2xfZW5hYmxlZCkgcGNpX3NldF9wb3dlcl9zdGF0ZSAocGRldiwgUENJX0QwKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9jbGVhcl9td2kocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX25ldGRldihkZXYpOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGNwX3N1c3BlbmQgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3A7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRldiA9IHBjaV9nZXRfZHJ2ZGF0YSAocGRldik7CisJY3AgID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghZGV2IHx8ICFuZXRpZl9ydW5uaW5nIChkZXYpKSByZXR1cm4gMDsKKworCW5ldGlmX2RldmljZV9kZXRhY2ggKGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmY3AtPmxvY2ssIGZsYWdzKTsKKworCS8qIERpc2FibGUgUnggYW5kIFR4ICovCisJY3B3MTYgKEludHJNYXNrLCAwKTsKKwljcHc4ICAoQ21kLCBjcHI4IChDbWQpICYgKH5SeE9uIHwgflR4T24pKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZjcC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGNwLT5wZGV2ICYmIGNwLT53b2xfZW5hYmxlZCkgeworCQlwY2lfc2F2ZV9zdGF0ZSAoY3AtPnBkZXYpOworCQljcF9zZXRfZDNfc3RhdGUgKGNwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcF9yZXN1bWUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGNwX3ByaXZhdGUgKmNwOworCisJZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKwljcCAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJbmV0aWZfZGV2aWNlX2F0dGFjaCAoZGV2KTsKKwkKKwlpZiAoY3AtPnBkZXYgJiYgY3AtPndvbF9lbmFibGVkKSB7CisJCXBjaV9zZXRfcG93ZXJfc3RhdGUgKGNwLT5wZGV2LCBQQ0lfRDApOworCQlwY2lfcmVzdG9yZV9zdGF0ZSAoY3AtPnBkZXYpOworCX0KKwkKKwljcF9pbml0X2h3IChjcCk7CisJbmV0aWZfc3RhcnRfcXVldWUgKGRldik7CisJCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjcF9kcml2ZXIgPSB7CisJLm5hbWUgICAgICAgICA9IERSVl9OQU1FLAorCS5pZF90YWJsZSAgICAgPSBjcF9wY2lfdGJsLAorCS5wcm9iZSAgICAgICAgPQljcF9pbml0X29uZSwKKwkucmVtb3ZlICAgICAgID0gY3BfcmVtb3ZlX29uZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkucmVzdW1lICAgICAgID0gY3BfcmVzdW1lLAorCS5zdXNwZW5kICAgICAgPSBjcF9zdXNwZW5kLAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjcF9pbml0ICh2b2lkKQoreworI2lmZGVmIE1PRFVMRQorCXByaW50aygiJXMiLCB2ZXJzaW9uKTsKKyNlbmRpZgorCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZjcF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY3BfZXhpdCAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZjcF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChjcF9pbml0KTsKK21vZHVsZV9leGl0KGNwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvODEzOXRvby5jIGIvZHJpdmVycy9uZXQvODEzOXRvby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YmQyMGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC84MTM5dG9vLmMKQEAgLTAsMCArMSwyNjY2IEBACisvKgorCisJODEzOXRvby5jOiBBIFJlYWxUZWsgUlRMLTgxMzkgRmFzdCBFdGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LgorCisJTWFpbnRhaW5lZCBieSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisJQ29weXJpZ2h0IDIwMDAtMjAwMiBKZWZmIEdhcnppaworCisJTXVjaCBjb2RlIGNvbWVzIGZyb20gRG9uYWxkIEJlY2tlcidzIHJ0bDgxMzkuYyBkcml2ZXIsCisJdmVyc2lvbnMgMS4xMyBhbmQgb2xkZXIuICBUaGlzIGRyaXZlciB3YXMgb3JpZ2luYWxseSBiYXNlZAorCW9uIHJ0bDgxMzkuYyB2ZXJzaW9uIDEuMDcuICBIZWFkZXIgb2YgcnRsODEzOS5jIHZlcnNpb24gMS4xMzoKKworCS0tLS0tPHNuaXA+LS0tLS0KKworICAgICAgICAJV3JpdHRlbiAxOTk3LTIwMDEgYnkgRG9uYWxkIEJlY2tlci4KKwkJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZQorCQl0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZAorCQloZXJlaW4gYnkgcmVmZXJlbmNlLiAgRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcworCQljb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdCByZXRhaW4gdGhlIGF1dGhvcnNoaXAsCisJCWNvcHlyaWdodCBhbmQgbGljZW5zZSBub3RpY2UuICBUaGlzIGZpbGUgaXMgbm90IGEgY29tcGxldGUKKwkJcHJvZ3JhbSBhbmQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nCisJCXN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorCisJCVRoaXMgZHJpdmVyIGlzIGZvciBib2FyZHMgYmFzZWQgb24gdGhlIFJUTDgxMjkgYW5kIFJUTDgxMzkKKwkJUENJIGV0aGVybmV0IGNoaXBzLgorCisJCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PIFNjeWxkCisJCUNvbXB1dGluZyBDb3Jwb3JhdGlvbiA0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMCBBbm5hcG9saXMKKwkJTUQgMjE0MDMKKworCQlTdXBwb3J0IGFuZCB1cGRhdGVzIGF2YWlsYWJsZSBhdAorCQlodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL3J0bDgxMzkuaHRtbAorCisJCVR3aXN0ZXItdHVuaW5nIHRhYmxlIHByb3ZpZGVkIGJ5IEtpbnN0b24KKwkJPHNoYW5naEByZWFsdGVrLmNvbS50dz4uCisKKwktLS0tLTxzbmlwPi0tLS0tCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCUNvbnRyaWJ1dG9yczoKKworCQlEb25hbGQgQmVja2VyIC0gaGUgd3JvdGUgdGhlIG9yaWdpbmFsIGRyaXZlciwga3Vkb3MgdG8gaGltIQorCQkoYnV0IHBsZWFzZSBkb24ndCBlLW1haWwgaGltIGZvciBzdXBwb3J0LCB0aGlzIGlzbid0IGhpcyBkcml2ZXIpCisKKwkJVGlncmFuIEFpdmF6aWFuIC0gYnVnIGZpeGVzLCBza2J1ZmYgZnJlZSBjbGVhbnVwCisKKwkJTWFydGluIE1hcmVzIC0gc3VnZ2VzdGlvbnMgZm9yIFBDSSBjbGVhbnVwCisKKwkJRGF2aWQgUy4gTWlsbGVyIC0gUENJIERNQSBhbmQgc29mdG5ldCB1cGRhdGVzCisKKwkJRXJuc3QgR2lsbCAtIGZpeGVzIHBvcnRlZCBmcm9tIEJTRCBkcml2ZXIKKworCQlEYW5pZWwgS29icmFzIC0gaWRlbnRpZmllZCBzcGVjaWZpYyBsb2NhdGlvbnMgb2YKKwkJCXBvc3RlZCBNTUlPIHdyaXRlIGJ1Z2dpbmVzcworCisJCUdlcmFyZCBTaGFycCAtIGJ1ZyBmaXgsIHRlc3RpbmcgYW5kIGZlZWRiYWNrCisKKwkJRGF2aWQgRm9yZCAtIFJ4IHJpbmcgd3JhcCBmaXgKKworCQlEYW4gRGVNYWdnaW8gLSBzd2FwcGVkIFJUTDgxMzkgY2FyZHMgd2l0aCBtZSwgYW5kIGFsbG93ZWQgbWUKKwkJdG8gZmluZCBhbmQgZml4IGEgY3J1Y2lhbCBidWcgb24gb2xkZXIgY2hpcHNldHMuCisKKwkJRG9uYWxkIEJlY2tlci9DaHJpcyBCdXR0ZXJ3b3J0aC9NYXJjdXMgV2VzdGVyZ3JlbiAtCisJCU5vdGljZWQgdmFyaW91cyBSeCBwYWNrZXQgc2l6ZS1yZWxhdGVkIGJ1Z2xldHMuCisKKwkJU2FudGlhZ28gR2FyY2lhIE1hbnRpbmFuIC0gdGVzdGluZyBhbmQgZmVlZGJhY2sKKworCQlKZW5zIERhdmlkIC0gMi4yLngga2VybmVsIGJhY2twb3J0cworCisJCU1hcnRpbiBEZW5uZXR0IC0gaW5jcmVkaWJseSBoZWxwZnVsIGluc2lnaHQgb24gdW5kb2N1bWVudGVkCisJCWZlYXR1cmVzIG9mIHRoZSA4MTM5IGNoaXBzCisKKwkJSmVhbi1KYWNxdWVzIE1pY2hlbCAtIGJ1ZyBmaXgKKworCQlUb2JpYXMgUmluZ3N0cvZtIC0gUnggaW50ZXJydXB0IHN0YXR1cyBjaGVja2luZyBzdWdnZXN0aW9uCisKKwkJQW5kcmV3IE1vcnRvbiAtIENsZWFyIGJsb2NrZWQgc2lnbmFscywgYXZvaWQKKwkJYnVmZmVyIG92ZXJydW4gc2V0dGluZyBjdXJyZW50LT5jb21tLgorCisJCUthbGxlIE9sYXZpIE5pZW1pdGFsbyAtIFdha2Utb24tTEFOIGlvY3RscworCisJCVJvYmVydCBLdWViZWwgLSBTYXZlIGtlcm5lbCB0aHJlYWQgZnJvbSBkeWluZyBvbiBhbnkgc2lnbmFsLgorCisJU3VibWl0dGluZyBidWcgcmVwb3J0czoKKworCQkicnRsODEzOS1kaWFnIC1tbW1hYWF2dnZlZWZOIiBvdXRwdXQKKwkJZW5hYmxlIFJUTDgxMzlfREVCVUcgYmVsb3csIGFuZCBsb29rIGF0ICdkbWVzZycgb3Iga2VybmVsIGxvZworCisqLworCisjZGVmaW5lIERSVl9OQU1FCSI4MTM5dG9vIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC45LjI3IgorCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjZGVmaW5lIFJUTDgxMzlfRFJJVkVSX05BTUUgICBEUlZfTkFNRSAiIEZhc3QgRXRoZXJuZXQgZHJpdmVyICIgRFJWX1ZFUlNJT04KKyNkZWZpbmUgUEZYIERSVl9OQU1FICI6ICIKKworLyogRGVmYXVsdCBNZXNzYWdlIGxldmVsICovCisjZGVmaW5lIFJUTDgxMzlfREVGX01TR19FTkFCTEUgICAoTkVUSUZfTVNHX0RSViAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUSUZfTVNHX1BST0JFICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVElGX01TR19MSU5LKQorCisKKy8qIGVuYWJsZSBQSU8gaW5zdGVhZCBvZiBNTUlPLCBpZiBDT05GSUdfODEzOVRPT19QSU8gaXMgc2VsZWN0ZWQgKi8KKyNpZmRlZiBDT05GSUdfODEzOVRPT19QSU8KKyNkZWZpbmUgVVNFX0lPX09QUyAxCisjZW5kaWYKKworLyogZGVmaW5lIHRvIDEgdG8gZW5hYmxlIGNvcGlvdXMgZGVidWdnaW5nIGluZm8gKi8KKyN1bmRlZiBSVEw4MTM5X0RFQlVHCisKKy8qIGRlZmluZSB0byAxIHRvIGRpc2FibGUgbGlnaHR3ZWlnaHQgcnVudGltZSBkZWJ1Z2dpbmcgY2hlY2tzICovCisjdW5kZWYgUlRMODEzOV9OREVCVUcKKworCisjaWZkZWYgUlRMODEzOV9ERUJVRworLyogbm90ZTogcHJpbnRzIGZ1bmN0aW9uIG5hbWUgZm9yIHlvdSAqLworIyAgZGVmaW5lIERQUklOVEsoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKQorI2Vsc2UKKyMgIGRlZmluZSBEUFJJTlRLKGZtdCwgYXJncy4uLikKKyNlbmRpZgorCisjaWZkZWYgUlRMODEzOV9OREVCVUcKKyMgIGRlZmluZSBhc3NlcnQoZXhwcikgZG8ge30gd2hpbGUgKDApCisjZWxzZQorIyAgZGVmaW5lIGFzc2VydChleHByKSBcCisgICAgICAgIGlmKHVubGlrZWx5KCEoZXhwcikpKSB7CQkJCSAgICAgICAgXAorICAgICAgICBwcmludGsoS0VSTl9FUlIgIkFzc2VydGlvbiBmYWlsZWQhICVzLCVzLCVzLGxpbmU9JWRcbiIsCVwKKyAgICAgICAgI2V4cHIsX19GSUxFX18sX19GVU5DVElPTl9fLF9fTElORV9fKTsJCSAgICAgICAgXAorICAgICAgICB9CisjZW5kaWYKKworCisvKiBBIGZldyB1c2VyLWNvbmZpZ3VyYWJsZSB2YWx1ZXMuICovCisvKiBtZWRpYSBvcHRpb25zICovCisjZGVmaW5lIE1BWF9VTklUUyA4CitzdGF0aWMgaW50IG1lZGlhW01BWF9VTklUU10gPSB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKK3N0YXRpYyBpbnQgZnVsbF9kdXBsZXhbTUFYX1VOSVRTXSA9IHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9OworCisvKiBNYXhpbXVtIG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIGZpbHRlciAodnMuIFJ4LWFsbC1tdWx0aWNhc3QpLgorICAgVGhlIFJUTCBjaGlwcyB1c2UgYSA2NCBlbGVtZW50IGhhc2ggdGFibGUgYmFzZWQgb24gdGhlIEV0aGVybmV0IENSQy4gICovCitzdGF0aWMgaW50IG11bHRpY2FzdF9maWx0ZXJfbGltaXQgPSAzMjsKKworLyogYml0bWFwcGVkIG1lc3NhZ2UgZW5hYmxlIG51bWJlciAqLworc3RhdGljIGludCBkZWJ1ZyA9IC0xOworCisvKgorICogUmVjZWl2ZSByaW5nIHNpemUgCisgKiBXYXJuaW5nOiA2NEsgcmluZyBoYXMgaGFyZHdhcmUgaXNzdWVzIGFuZCBtYXkgbG9jayB1cC4KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX1NIX0RSRUFNQ0FTVCkKKyNkZWZpbmUgUlhfQlVGX0lEWAkxCS8qIDE2SyByaW5nICovCisjZWxzZQorI2RlZmluZSBSWF9CVUZfSURYCTIJLyogMzJLIHJpbmcgKi8KKyNlbmRpZgorI2RlZmluZSBSWF9CVUZfTEVOCSg4MTkyIDw8IFJYX0JVRl9JRFgpCisjZGVmaW5lIFJYX0JVRl9QQUQJMTYKKyNkZWZpbmUgUlhfQlVGX1dSQVBfUEFEIDIwNDggLyogc3BhcmUgcGFkZGluZyB0byBoYW5kbGUgbGFjayBvZiBwYWNrZXQgd3JhcCAqLworCisjaWYgUlhfQlVGX0xFTiA9PSA2NTUzNgorI2RlZmluZSBSWF9CVUZfVE9UX0xFTglSWF9CVUZfTEVOCisjZWxzZQorI2RlZmluZSBSWF9CVUZfVE9UX0xFTgkoUlhfQlVGX0xFTiArIFJYX0JVRl9QQUQgKyBSWF9CVUZfV1JBUF9QQUQpCisjZW5kaWYKKworLyogTnVtYmVyIG9mIFR4IGRlc2NyaXB0b3IgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBOVU1fVFhfREVTQwk0CisKKy8qIG1heCBzdXBwb3J0ZWQgZXRoZXJuZXQgZnJhbWUgc2l6ZSAtLSBtdXN0IGJlIGF0IGxlYXN0IChkZXYtPm10dSsxNCs0KS4qLworI2RlZmluZSBNQVhfRVRIX0ZSQU1FX1NJWkUJMTUzNgorCisvKiBTaXplIG9mIHRoZSBUeCBib3VuY2UgYnVmZmVycyAtLSBtdXN0IGJlIGF0IGxlYXN0IChkZXYtPm10dSsxNCs0KS4gKi8KKyNkZWZpbmUgVFhfQlVGX1NJWkUJTUFYX0VUSF9GUkFNRV9TSVpFCisjZGVmaW5lIFRYX0JVRl9UT1RfTEVOCShUWF9CVUZfU0laRSAqIE5VTV9UWF9ERVNDKQorCisvKiBQQ0kgVHVuaW5nIFBhcmFtZXRlcnMKKyAgIFRocmVzaG9sZCBpcyBieXRlcyB0cmFuc2ZlcnJlZCB0byBjaGlwIGJlZm9yZSB0cmFuc21pc3Npb24gc3RhcnRzLiAqLworI2RlZmluZSBUWF9GSUZPX1RIUkVTSCAyNTYJLyogSW4gYnl0ZXMsIHJvdW5kZWQgZG93biB0byAzMiBieXRlIHVuaXRzLiAqLworCisvKiBUaGUgZm9sbG93aW5nIHNldHRpbmdzIGFyZSBsb2dfMihieXRlcyktNDogIDAgPT0gMTYgYnl0ZXMgLi4gNj09MTAyNCwgNz09ZW5kIG9mIHBhY2tldC4gKi8KKyNkZWZpbmUgUlhfRklGT19USFJFU0gJNwkvKiBSeCBidWZmZXIgbGV2ZWwgYmVmb3JlIGZpcnN0IFBDSSB4ZmVyLiAgKi8KKyNkZWZpbmUgUlhfRE1BX0JVUlNUCTcJLyogTWF4aW11bSBQQ0kgYnVyc3QsICc2JyBpcyAxMDI0ICovCisjZGVmaW5lIFRYX0RNQV9CVVJTVAk2CS8qIE1heGltdW0gUENJIGJ1cnN0LCAnNicgaXMgMTAyNCAqLworI2RlZmluZSBUWF9SRVRSWQk4CS8qIDAtMTUuICByZXRyaWVzID0gMTYgKyAoVFhfUkVUUlkgKiAxNikgKi8KKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAoNipIWikKKworCitlbnVtIHsKKwlIQVNfTUlJX1hDVlIgPSAweDAxMDAwMCwKKwlIQVNfQ0hJUF9YQ1ZSID0gMHgwMjAwMDAsCisJSEFTX0xOS19DSE5HID0gMHgwNDAwMDAsCit9OworCisjZGVmaW5lIFJUTF9OVU1fU1RBVFMgNAkJLyogbnVtYmVyIG9mIEVUSFRPT0xfR1NUQVRTIHU2NCdzICovCisjZGVmaW5lIFJUTF9SRUdTX1ZFUiAxCQkvKiB2ZXJzaW9uIG9mIHJlZy4gZGF0YSBpbiBFVEhUT09MX0dSRUdTICovCisjZGVmaW5lIFJUTF9NSU5fSU9fU0laRSAweDgwCisjZGVmaW5lIFJUTDgxMzlCX0lPX1NJWkUgMjU2CisKKyNkZWZpbmUgUlRMODEyOV9DQVBTCUhBU19NSUlfWENWUgorI2RlZmluZSBSVEw4MTM5X0NBUFMJSEFTX0NISVBfWENWUnxIQVNfTE5LX0NITkcKKwordHlwZWRlZiBlbnVtIHsKKwlSVEw4MTM5ID0gMCwKKwlSVEw4MTI5LAorfSBib2FyZF90OworCisKKy8qIGluZGV4ZWQgYnkgYm9hcmRfdCwgYWJvdmUgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdTMyIGh3X2ZsYWdzOworfSBib2FyZF9pbmZvW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7ICJSZWFsVGVrIFJUTDgxMzkiLCBSVEw4MTM5X0NBUFMgfSwKKwl7ICJSZWFsVGVrIFJUTDgxMjkiLCBSVEw4MTI5X0NBUFMgfSwKK307CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJ0bDgxMzlfcGNpX3RibFtdID0geworCXsweDEwZWMsIDB4ODEzOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDEwZWMsIDB4ODEzOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDExMTMsIDB4MTIxMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDE1MDAsIDB4MTM2MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDQwMzMsIDB4MTM2MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDExODYsIDB4MTMwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDExODYsIDB4MTM0MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDEzZDEsIDB4YWIwNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDEyNTksIDB4YTExNywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDEyNTksIDB4YTExZSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDE0ZWEsIDB4YWIwNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDE0ZWEsIDB4YWIwNywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDExZGIsIDB4MTIzNCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDE0MzIsIDB4OTEzMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDAyYWMsIDB4MTAxMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDAxOGEsIDB4MDEwNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDEyNmMsIDB4MTIxMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDE3NDMsIDB4ODEzOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDAyMWIsIDB4ODEzOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LCAKKworI2lmZGVmIENPTkZJR19TSF9TRUNVUkVFREdFNTQxMAorCS8qIEJvZ3VzIDgxMzkgc2lsaWNvbiByZXBvcnRzIDgxMjkgd2l0aG91dCBleHRlcm5hbCBQUk9NIDotKCAqLworCXsweDEwZWMsIDB4ODEyOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHXzgxMzlUT09fODEyOQorCXsweDEwZWMsIDB4ODEyOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEyOSB9LAorI2VuZGlmCisKKwkvKiBzb21lIGNyYXp5IGNhcmRzIHJlcG9ydCBpbnZhbGlkIHZlbmRvciBpZHMgbGlrZQorCSAqIDB4MDAwMSBoZXJlLiAgVGhlIG90aGVyIGlkcyBhcmUgdmFsaWQgYW5kIGNvbnN0YW50LAorCSAqIHNvIHdlIHNpbXBseSBkb24ndCBtYXRjaCBvbiB0aGUgbWFpbiB2ZW5kb3IgaWQuCisJICovCisJe1BDSV9BTllfSUQsIDB4ODEzOSwgMHgxMGVjLCAweDgxMzksIDAsIDAsIFJUTDgxMzkgfSwKKwl7UENJX0FOWV9JRCwgMHg4MTM5LCAweDExODYsIDB4MTMwMCwgMCwgMCwgUlRMODEzOSB9LAorCXtQQ0lfQU5ZX0lELCAweDgxMzksIDB4MTNkMSwgMHhhYjA2LCAwLCAwLCBSVEw4MTM5IH0sCisKKwl7MCx9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCBydGw4MTM5X3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHsKKwljb25zdCBjaGFyIHN0cltFVEhfR1NUUklOR19MRU5dOworfSBldGh0b29sX3N0YXRzX2tleXNbXSA9IHsKKwl7ICJlYXJseV9yeCIgfSwKKwl7ICJ0eF9idWZfbWFwcGVkIiB9LAorCXsgInR4X3RpbWVvdXRzIiB9LAorCXsgInJ4X2xvc3RfaW5fcmluZyIgfSwKK307CisKKy8qIFRoZSByZXN0IG9mIHRoZXNlIHZhbHVlcyBzaG91bGQgbmV2ZXIgY2hhbmdlLiAqLworCisvKiBTeW1ib2xpYyBvZmZzZXRzIHRvIHJlZ2lzdGVycy4gKi8KK2VudW0gUlRMODEzOV9yZWdpc3RlcnMgeworCU1BQzAgPSAwLAkJLyogRXRoZXJuZXQgaGFyZHdhcmUgYWRkcmVzcy4gKi8KKwlNQVIwID0gOCwJCS8qIE11bHRpY2FzdCBmaWx0ZXIuICovCisJVHhTdGF0dXMwID0gMHgxMCwJLyogVHJhbnNtaXQgc3RhdHVzIChGb3VyIDMyYml0IHJlZ2lzdGVycykuICovCisJVHhBZGRyMCA9IDB4MjAsCQkvKiBUeCBkZXNjcmlwdG9ycyAoYWxzbyBmb3VyIDMyYml0KS4gKi8KKwlSeEJ1ZiA9IDB4MzAsCisJQ2hpcENtZCA9IDB4MzcsCisJUnhCdWZQdHIgPSAweDM4LAorCVJ4QnVmQWRkciA9IDB4M0EsCisJSW50ck1hc2sgPSAweDNDLAorCUludHJTdGF0dXMgPSAweDNFLAorCVR4Q29uZmlnID0gMHg0MCwKKwlSeENvbmZpZyA9IDB4NDQsCisJVGltZXIgPSAweDQ4LAkJLyogQSBnZW5lcmFsLXB1cnBvc2UgY291bnRlci4gKi8KKwlSeE1pc3NlZCA9IDB4NEMsCS8qIDI0IGJpdHMgdmFsaWQsIHdyaXRlIGNsZWFycy4gKi8KKwlDZmc5MzQ2ID0gMHg1MCwKKwlDb25maWcwID0gMHg1MSwKKwlDb25maWcxID0gMHg1MiwKKwlGbGFzaFJlZyA9IDB4NTQsCisJTWVkaWFTdGF0dXMgPSAweDU4LAorCUNvbmZpZzMgPSAweDU5LAorCUNvbmZpZzQgPSAweDVBLAkJLyogYWJzZW50IG9uIFJUTC04MTM5QSAqLworCUhsdENsayA9IDB4NUIsCisJTXVsdGlJbnRyID0gMHg1QywKKwlUeFN1bW1hcnkgPSAweDYwLAorCUJhc2ljTW9kZUN0cmwgPSAweDYyLAorCUJhc2ljTW9kZVN0YXR1cyA9IDB4NjQsCisJTldheUFkdmVydCA9IDB4NjYsCisJTldheUxQQVIgPSAweDY4LAorCU5XYXlFeHBhbnNpb24gPSAweDZBLAorCS8qIFVuZG9jdW1lbnRlZCByZWdpc3RlcnMsIGJ1dCByZXF1aXJlZCBmb3IgcHJvcGVyIG9wZXJhdGlvbi4gKi8KKwlGSUZPVE1TID0gMHg3MCwJCS8qIEZJRk8gQ29udHJvbCBhbmQgdGVzdC4gKi8KKwlDU0NSID0gMHg3NCwJCS8qIENoaXAgU3RhdHVzIGFuZCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLiAqLworCVBBUkE3OCA9IDB4NzgsCisJUEFSQTdjID0gMHg3YywJCS8qIE1hZ2ljIHRyYW5zY2VpdmVyIHBhcmFtZXRlciByZWdpc3Rlci4gKi8KKwlDb25maWc1ID0gMHhEOCwJCS8qIGFic2VudCBvbiBSVEwtODEzOUEgKi8KK307CisKK2VudW0gQ2xlYXJCaXRNYXNrcyB7CisJTXVsdGlJbnRyQ2xlYXIgPSAweEYwMDAsCisJQ2hpcENtZENsZWFyID0gMHhFMiwKKwlDb25maWcxQ2xlYXIgPSAoMTw8Nyl8KDE8PDYpfCgxPDwzKXwoMTw8Mil8KDE8PDEpLAorfTsKKworZW51bSBDaGlwQ21kQml0cyB7CisJQ21kUmVzZXQgPSAweDEwLAorCUNtZFJ4RW5iID0gMHgwOCwKKwlDbWRUeEVuYiA9IDB4MDQsCisJUnhCdWZFbXB0eSA9IDB4MDEsCit9OworCisvKiBJbnRlcnJ1cHQgcmVnaXN0ZXIgYml0cywgdXNpbmcgbXkgb3duIG1lYW5pbmdmdWwgbmFtZXMuICovCitlbnVtIEludHJTdGF0dXNCaXRzIHsKKwlQQ0lFcnIgPSAweDgwMDAsCisJUENTVGltZW91dCA9IDB4NDAwMCwKKwlSeEZJRk9PdmVyID0gMHg0MCwKKwlSeFVuZGVycnVuID0gMHgyMCwKKwlSeE92ZXJmbG93ID0gMHgxMCwKKwlUeEVyciA9IDB4MDgsCisJVHhPSyA9IDB4MDQsCisJUnhFcnIgPSAweDAyLAorCVJ4T0sgPSAweDAxLAorCisJUnhBY2tCaXRzID0gUnhGSUZPT3ZlciB8IFJ4T3ZlcmZsb3cgfCBSeE9LLAorfTsKKworZW51bSBUeFN0YXR1c0JpdHMgeworCVR4SG9zdE93bnMgPSAweDIwMDAsCisJVHhVbmRlcnJ1biA9IDB4NDAwMCwKKwlUeFN0YXRPSyA9IDB4ODAwMCwKKwlUeE91dE9mV2luZG93ID0gMHgyMDAwMDAwMCwKKwlUeEFib3J0ZWQgPSAweDQwMDAwMDAwLAorCVR4Q2Fycmllckxvc3QgPSAweDgwMDAwMDAwLAorfTsKK2VudW0gUnhTdGF0dXNCaXRzIHsKKwlSeE11bHRpY2FzdCA9IDB4ODAwMCwKKwlSeFBoeXNpY2FsID0gMHg0MDAwLAorCVJ4QnJvYWRjYXN0ID0gMHgyMDAwLAorCVJ4QmFkU3ltYm9sID0gMHgwMDIwLAorCVJ4UnVudCA9IDB4MDAxMCwKKwlSeFRvb0xvbmcgPSAweDAwMDgsCisJUnhDUkNFcnIgPSAweDAwMDQsCisJUnhCYWRBbGlnbiA9IDB4MDAwMiwKKwlSeFN0YXR1c09LID0gMHgwMDAxLAorfTsKKworLyogQml0cyBpbiBSeENvbmZpZy4gKi8KK2VudW0gcnhfbW9kZV9iaXRzIHsKKwlBY2NlcHRFcnIgPSAweDIwLAorCUFjY2VwdFJ1bnQgPSAweDEwLAorCUFjY2VwdEJyb2FkY2FzdCA9IDB4MDgsCisJQWNjZXB0TXVsdGljYXN0ID0gMHgwNCwKKwlBY2NlcHRNeVBoeXMgPSAweDAyLAorCUFjY2VwdEFsbFBoeXMgPSAweDAxLAorfTsKKworLyogQml0cyBpbiBUeENvbmZpZy4gKi8KK2VudW0gdHhfY29uZmlnX2JpdHMgeworCisgICAgICAgIC8qIEludGVyZnJhbWUgR2FwIFRpbWUuIE9ubHkgVHhJRkc5NiBkb2Vzbid0IHZpb2xhdGUgSUVFRSA4MDIuMyAqLworICAgICAgICBUeElGR1NoaWZ0ID0gMjQsCisgICAgICAgIFR4SUZHODQgPSAoMCA8PCBUeElGR1NoaWZ0KSwgICAgLyogOC40dXMgLyA4NDBucyAoMTAgLyAxMDBNYnBzKSAqLworICAgICAgICBUeElGRzg4ID0gKDEgPDwgVHhJRkdTaGlmdCksICAgIC8qIDguOHVzIC8gODgwbnMgKDEwIC8gMTAwTWJwcykgKi8KKyAgICAgICAgVHhJRkc5MiA9ICgyIDw8IFR4SUZHU2hpZnQpLCAgICAvKiA5LjJ1cyAvIDkyMG5zICgxMCAvIDEwME1icHMpICovCisgICAgICAgIFR4SUZHOTYgPSAoMyA8PCBUeElGR1NoaWZ0KSwgICAgLyogOS42dXMgLyA5NjBucyAoMTAgLyAxMDBNYnBzKSAqLworCisJVHhMb29wQmFjayA9ICgxIDw8IDE4KSB8ICgxIDw8IDE3KSwgLyogZW5hYmxlIGxvb3BiYWNrIHRlc3QgbW9kZSAqLworCVR4Q1JDID0gKDEgPDwgMTYpLAkvKiBESVNBQkxFIGFwcGVuZGluZyBDUkMgdG8gZW5kIG9mIFR4IHBhY2tldHMgKi8KKwlUeENsZWFyQWJ0ID0gKDEgPDwgMCksCS8qIENsZWFyIGFib3J0IChXTykgKi8KKwlUeERNQVNoaWZ0ID0gOCwJCS8qIERNQSBidXJzdCB2YWx1ZSAoMC03KSBpcyBzaGlmdGVkIHRoaXMgbWFueSBiaXRzICovCisJVHhSZXRyeVNoaWZ0ID0gNCwJLyogVFhSUiB2YWx1ZSAoMC0xNSkgaXMgc2hpZnRlZCB0aGlzIG1hbnkgYml0cyAqLworCisJVHhWZXJzaW9uTWFzayA9IDB4N0M4MDAwMDAsIC8qIG1hc2sgb3V0IHZlcnNpb24gYml0cyAzMC0yNiwgMjMgKi8KK307CisKKy8qIEJpdHMgaW4gQ29uZmlnMSAqLworZW51bSBDb25maWcxQml0cyB7CisJQ2ZnMV9QTV9FbmFibGUgPSAweDAxLAorCUNmZzFfVlBEX0VuYWJsZSA9IDB4MDIsCisJQ2ZnMV9QSU8gPSAweDA0LAorCUNmZzFfTU1JTyA9IDB4MDgsCisJTFdBS0UgPSAweDEwLAkJLyogbm90IG9uIDgxMzksIDgxMzlBICovCisJQ2ZnMV9Ecml2ZXJfTG9hZCA9IDB4MjAsCisJQ2ZnMV9MRUQwID0gMHg0MCwKKwlDZmcxX0xFRDEgPSAweDgwLAorCVNMRUVQID0gKDEgPDwgMSksCS8qIG9ubHkgb24gODEzOSwgODEzOUEgKi8KKwlQV1JETiA9ICgxIDw8IDApLAkvKiBvbmx5IG9uIDgxMzksIDgxMzlBICovCit9OworCisvKiBCaXRzIGluIENvbmZpZzMgKi8KK2VudW0gQ29uZmlnM0JpdHMgeworCUNmZzNfRkJ0QkVuICAgID0gKDEgPDwgMCksIC8qIDEgPSBGYXN0IEJhY2sgdG8gQmFjayAqLworCUNmZzNfRnVuY1JlZ0VuID0gKDEgPDwgMSksIC8qIDEgPSBlbmFibGUgQ2FyZEJ1cyBGdW5jdGlvbiByZWdpc3RlcnMgKi8KKwlDZmczX0NMS1JVTl9FbiA9ICgxIDw8IDIpLCAvKiAxID0gZW5hYmxlIENMS1JVTiAqLworCUNmZzNfQ2FyZEJfRW4gID0gKDEgPDwgMyksIC8qIDEgPSBlbmFibGUgQ2FyZEJ1cyByZWdpc3RlcnMgKi8KKwlDZmczX0xpbmtVcCAgICA9ICgxIDw8IDQpLCAvKiAxID0gd2FrZSB1cCBvbiBsaW5rIHVwICovCisJQ2ZnM19NYWdpYyAgICAgPSAoMSA8PCA1KSwgLyogMSA9IHdha2UgdXAgb24gTWFnaWMgUGFja2V0ICh0bSkgKi8KKwlDZmczX1BBUk1fRW4gICA9ICgxIDw8IDYpLCAvKiAwID0gc29mdHdhcmUgY2FuIHNldCB0d2lzdGVyIHBhcmFtZXRlcnMgKi8KKwlDZmczX0dOVFNlbCAgICA9ICgxIDw8IDcpLCAvKiAxID0gZGVsYXkgMSBjbG9jayBmcm9tIFBDSSBHTlQgc2lnbmFsICovCit9OworCisvKiBCaXRzIGluIENvbmZpZzQgKi8KK2VudW0gQ29uZmlnNEJpdHMgeworCUxXUFROID0gKDEgPDwgMiksCS8qIG5vdCBvbiA4MTM5LCA4MTM5QSAqLworfTsKKworLyogQml0cyBpbiBDb25maWc1ICovCitlbnVtIENvbmZpZzVCaXRzIHsKKwlDZmc1X1BNRV9TVFMgICAgID0gKDEgPDwgMCksIC8qIDEgPSBQQ0kgcmVzZXQgcmVzZXRzIFBNRV9TdGF0dXMgKi8KKwlDZmc1X0xBTldha2UgICAgID0gKDEgPDwgMSksIC8qIDEgPSBlbmFibGUgTEFOV2FrZSBzaWduYWwgKi8KKwlDZmc1X0xEUFMgICAgICAgID0gKDEgPDwgMiksIC8qIDAgPSBzYXZlIHBvd2VyIHdoZW4gbGluayBpcyBkb3duICovCisJQ2ZnNV9GSUZPQWRkclB0ciA9ICgxIDw8IDMpLCAvKiBSZWFsdGVrIGludGVybmFsIFNSQU0gdGVzdGluZyAqLworCUNmZzVfVVdGICAgICAgICAgPSAoMSA8PCA0KSwgLyogMSA9IGFjY2VwdCB1bmljYXN0IHdha2V1cCBmcmFtZSAqLworCUNmZzVfTVdGICAgICAgICAgPSAoMSA8PCA1KSwgLyogMSA9IGFjY2VwdCBtdWx0aWNhc3Qgd2FrZXVwIGZyYW1lICovCisJQ2ZnNV9CV0YgICAgICAgICA9ICgxIDw8IDYpLCAvKiAxID0gYWNjZXB0IGJyb2FkY2FzdCB3YWtldXAgZnJhbWUgKi8KK307CisKK2VudW0gUnhDb25maWdCaXRzIHsKKwkvKiByeCBmaWZvIHRocmVzaG9sZCAqLworCVJ4Q2ZnRklGT1NoaWZ0ID0gMTMsCisJUnhDZmdGSUZPTm9uZSA9ICg3IDw8IFJ4Q2ZnRklGT1NoaWZ0KSwKKworCS8qIE1heCBETUEgYnVyc3QgKi8KKwlSeENmZ0RNQVNoaWZ0ID0gOCwKKwlSeENmZ0RNQVVubGltaXRlZCA9ICg3IDw8IFJ4Q2ZnRE1BU2hpZnQpLAorCisJLyogcnggcmluZyBidWZmZXIgbGVuZ3RoICovCisJUnhDZmdSY3Y4SyA9IDAsCisJUnhDZmdSY3YxNksgPSAoMSA8PCAxMSksCisJUnhDZmdSY3YzMksgPSAoMSA8PCAxMiksCisJUnhDZmdSY3Y2NEsgPSAoMSA8PCAxMSkgfCAoMSA8PCAxMiksCisKKwkvKiBEaXNhYmxlIHBhY2tldCB3cmFwIGF0IGVuZCBvZiBSeCBidWZmZXIuIChub3QgcG9zc2libGUgd2l0aCA2NGspICovCisJUnhOb1dyYXAgPSAoMSA8PCA3KSwKK307CisKKy8qIFR3aXN0ZXIgdHVuaW5nIHBhcmFtZXRlcnMgZnJvbSBSZWFsVGVrLgorICAgQ29tcGxldGVseSB1bmRvY3VtZW50ZWQsIGJ1dCByZXF1aXJlZCB0byB0dW5lIGJhZCBsaW5rcyBvbiBzb21lIGJvYXJkcy4gKi8KK2VudW0gQ1NDUkJpdHMgeworCUNTQ1JfTGlua09LQml0ID0gMHgwNDAwLAorCUNTQ1JfTGlua0NoYW5nZUJpdCA9IDB4MDgwMCwKKwlDU0NSX0xpbmtTdGF0dXNCaXRzID0gMHgwZjAwMCwKKwlDU0NSX0xpbmtEb3duT2ZmQ21kID0gMHgwMDNjMCwKKwlDU0NSX0xpbmtEb3duQ21kID0gMHgwZjNjMCwKK307CisKK2VudW0gQ2ZnOTM0NkJpdHMgeworCUNmZzkzNDZfTG9jayA9IDB4MDAsCisJQ2ZnOTM0Nl9VbmxvY2sgPSAweEMwLAorfTsKKwordHlwZWRlZiBlbnVtIHsKKwlDSF84MTM5ID0gMCwKKwlDSF84MTM5X0ssCisJQ0hfODEzOUEsCisJQ0hfODEzOUFfRywKKwlDSF84MTM5QiwKKwlDSF84MTMwLAorCUNIXzgxMzlDLAorCUNIXzgxMDAsCisJQ0hfODEwMEJfODEzOUQsCisJQ0hfODEwMSwKK30gY2hpcF90OworCitlbnVtIGNoaXBfZmxhZ3MgeworCUhhc0hsdENsayA9ICgxIDw8IDApLAorCUhhc0xXYWtlID0gKDEgPDwgMSksCit9OworCisjZGVmaW5lIEhXX1JFVklEKGIzMCwgYjI5LCBiMjgsIGIyNywgYjI2LCBiMjMsIGIyMikgXAorCShiMzA8PDMwIHwgYjI5PDwyOSB8IGIyODw8MjggfCBiMjc8PDI3IHwgYjI2PDwyNiB8IGIyMzw8MjMgfCBiMjI8PDIyKQorI2RlZmluZSBIV19SRVZJRF9NQVNLCUhXX1JFVklEKDEsIDEsIDEsIDEsIDEsIDEsIDEpCisKKy8qIGRpcmVjdGx5IGluZGV4ZWQgYnkgY2hpcF90LCBhYm92ZSAqLworY29uc3Qgc3RhdGljIHN0cnVjdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1MzIgdmVyc2lvbjsgLyogZnJvbSBSVEw4MTM5Qy9SVEw4MTM5RCBkb2NzICovCisJdTMyIGZsYWdzOworfSBydGxfY2hpcF9pbmZvW10gPSB7CisJeyAiUlRMLTgxMzkiLAorCSAgSFdfUkVWSUQoMSwgMCwgMCwgMCwgMCwgMCwgMCksCisJICBIYXNIbHRDbGssCisJfSwKKworCXsgIlJUTC04MTM5IHJldiBLIiwKKwkgIEhXX1JFVklEKDEsIDEsIDAsIDAsIDAsIDAsIDApLAorCSAgSGFzSGx0Q2xrLAorCX0sCisKKwl7ICJSVEwtODEzOUEiLAorCSAgSFdfUkVWSUQoMSwgMSwgMSwgMCwgMCwgMCwgMCksCisJICBIYXNIbHRDbGssIC8qIFhYWCB1bmRvY3VtZW50ZWQ/ICovCisJfSwKKworCXsgIlJUTC04MTM5QSByZXYgRyIsCisJICBIV19SRVZJRCgxLCAxLCAxLCAwLCAwLCAxLCAwKSwKKwkgIEhhc0hsdENsaywgLyogWFhYIHVuZG9jdW1lbnRlZD8gKi8KKwl9LAorCisJeyAiUlRMLTgxMzlCIiwKKwkgIEhXX1JFVklEKDEsIDEsIDEsIDEsIDAsIDAsIDApLAorCSAgSGFzTFdha2UsCisJfSwKKworCXsgIlJUTC04MTMwIiwKKwkgIEhXX1JFVklEKDEsIDEsIDEsIDEsIDEsIDAsIDApLAorCSAgSGFzTFdha2UsCisJfSwKKworCXsgIlJUTC04MTM5QyIsCisJICBIV19SRVZJRCgxLCAxLCAxLCAwLCAxLCAwLCAwKSwKKwkgIEhhc0xXYWtlLAorCX0sCisKKwl7ICJSVEwtODEwMCIsCisJICBIV19SRVZJRCgxLCAxLCAxLCAxLCAwLCAxLCAwKSwKKyAJICBIYXNMV2FrZSwKKyAJfSwKKworCXsgIlJUTC04MTAwQi84MTM5RCIsCisJICBIV19SRVZJRCgxLCAxLCAxLCAwLCAxLCAwLCAxKSwKKwkgIEhhc0xXYWtlLAorCX0sCisKKwl7ICJSVEwtODEwMSIsCisJICBIV19SRVZJRCgxLCAxLCAxLCAwLCAxLCAxLCAxKSwKKwkgIEhhc0xXYWtlLAorCX0sCit9OworCitzdHJ1Y3QgcnRsX2V4dHJhX3N0YXRzIHsKKwl1bnNpZ25lZCBsb25nIGVhcmx5X3J4OworCXVuc2lnbmVkIGxvbmcgdHhfYnVmX21hcHBlZDsKKwl1bnNpZ25lZCBsb25nIHR4X3RpbWVvdXRzOworCXVuc2lnbmVkIGxvbmcgcnhfbG9zdF9pbl9yaW5nOworfTsKKworc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSB7CisJdm9pZCAqbW1pb19hZGRyOworCWludCBkcnZfZmxhZ3M7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisJdTMyIG1zZ19lbmFibGU7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJdW5zaWduZWQgY2hhciAqcnhfcmluZzsKKwl1bnNpZ25lZCBpbnQgY3VyX3J4OwkvKiBJbmRleCBpbnRvIHRoZSBSeCBidWZmZXIgb2YgbmV4dCBSeCBwa3QuICovCisJdW5zaWduZWQgaW50IHR4X2ZsYWc7CisJdW5zaWduZWQgbG9uZyBjdXJfdHg7CisJdW5zaWduZWQgbG9uZyBkaXJ0eV90eDsKKwl1bnNpZ25lZCBjaGFyICp0eF9idWZbTlVNX1RYX0RFU0NdOwkvKiBUeCBib3VuY2UgYnVmZmVycyAqLworCXVuc2lnbmVkIGNoYXIgKnR4X2J1ZnM7CS8qIFR4IGJvdW5jZSBidWZmZXIgcmVnaW9uLiAqLworCWRtYV9hZGRyX3QgcnhfcmluZ19kbWE7CisJZG1hX2FkZHJfdCB0eF9idWZzX2RtYTsKKwlzaWduZWQgY2hhciBwaHlzWzRdOwkJLyogTUlJIGRldmljZSBhZGRyZXNzZXMuICovCisJY2hhciB0d2lzdGllLCB0d2lzdF9yb3csIHR3aXN0X2NvbDsJLyogVHdpc3RlciB0dW5lIHN0YXRlLiAqLworCXVuc2lnbmVkIGludCBkZWZhdWx0X3BvcnQ6NDsJLyogTGFzdCBkZXYtPmlmX3BvcnQgdmFsdWUuICovCisJc3BpbmxvY2tfdCBsb2NrOworCXNwaW5sb2NrX3QgcnhfbG9jazsKKwljaGlwX3QgY2hpcHNldDsKKwlwaWRfdCB0aHJfcGlkOworCXdhaXRfcXVldWVfaGVhZF90IHRocl93YWl0OworCXN0cnVjdCBjb21wbGV0aW9uIHRocl9leGl0ZWQ7CisJdTMyIHJ4X2NvbmZpZzsKKwlzdHJ1Y3QgcnRsX2V4dHJhX3N0YXRzIHhzdGF0czsKKwlpbnQgdGltZV90b19kaWU7CisJc3RydWN0IG1paV9pZl9pbmZvIG1paTsKKwl1bnNpZ25lZCBpbnQgcmVnc19sZW47CisJdW5zaWduZWQgbG9uZyBmaWZvX2NvcHlfdGltZW91dDsKK307CisKK01PRFVMRV9BVVRIT1IgKCJKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJSZWFsVGVrIFJUTC04MTM5IEZhc3QgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK21vZHVsZV9wYXJhbShtdWx0aWNhc3RfZmlsdGVyX2xpbWl0LCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG1lZGlhLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGZ1bGxfZHVwbGV4LCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyAoZGVidWcsICI4MTM5dG9vIGJpdG1hcHBlZCBtZXNzYWdlIGVuYWJsZSBudW1iZXIiKTsKK01PRFVMRV9QQVJNX0RFU0MgKG11bHRpY2FzdF9maWx0ZXJfbGltaXQsICI4MTM5dG9vIG1heGltdW0gbnVtYmVyIG9mIGZpbHRlcmVkIG11bHRpY2FzdCBhZGRyZXNzZXMiKTsKK01PRFVMRV9QQVJNX0RFU0MgKG1lZGlhLCAiODEzOXRvbzogQml0cyA0Kzk6IGZvcmNlIGZ1bGwgZHVwbGV4LCBiaXQgNTogMTAwTWJwcyIpOworTU9EVUxFX1BBUk1fREVTQyAoZnVsbF9kdXBsZXgsICI4MTM5dG9vOiBGb3JjZSBmdWxsIGR1cGxleCBmb3IgYm9hcmQocykgKDEpIik7CisKK3N0YXRpYyBpbnQgcmVhZF9lZXByb20gKHZvaWQgKmlvYWRkciwgaW50IGxvY2F0aW9uLCBpbnQgYWRkcl9sZW4pOworc3RhdGljIGludCBydGw4MTM5X29wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBtZGlvX3JlYWQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbik7CitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sCisJCQlpbnQgdmFsKTsKK3N0YXRpYyB2b2lkIHJ0bDgxMzlfc3RhcnRfdGhyZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcnRsODEzOV90eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJ0bDgxMzlfaW5pdF9yaW5nIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcnRsODEzOV9zdGFydF94bWl0IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBydGw4MTM5X3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBydGw4MTM5X3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorc3RhdGljIGlycXJldHVybl90IHJ0bDgxMzlfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsCisJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCBydGw4MTM5X2Nsb3NlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbmV0ZGV2X2lvY3RsIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcnRsODEzOV9nZXRfc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcnRsODEzOV9zZXRfcnhfbW9kZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBfX3NldF9yeF9tb2RlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJ0bDgxMzlfaHdfc3RhcnQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBydGw4MTM5X2V0aHRvb2xfb3BzOworCisjaWZkZWYgVVNFX0lPX09QUworCisjZGVmaW5lIFJUTF9SOChyZWcpCQlpbmIgKCgodW5zaWduZWQgbG9uZylpb2FkZHIpICsgKHJlZykpCisjZGVmaW5lIFJUTF9SMTYocmVnKQkJaW53ICgoKHVuc2lnbmVkIGxvbmcpaW9hZGRyKSArIChyZWcpKQorI2RlZmluZSBSVExfUjMyKHJlZykJCSgodW5zaWduZWQgbG9uZykgaW5sICgoKHVuc2lnbmVkIGxvbmcpaW9hZGRyKSArIChyZWcpKSkKKyNkZWZpbmUgUlRMX1c4KHJlZywgdmFsOCkJb3V0YiAoKHZhbDgpLCAoKHVuc2lnbmVkIGxvbmcpaW9hZGRyKSArIChyZWcpKQorI2RlZmluZSBSVExfVzE2KHJlZywgdmFsMTYpCW91dHcgKCh2YWwxNiksICgodW5zaWduZWQgbG9uZylpb2FkZHIpICsgKHJlZykpCisjZGVmaW5lIFJUTF9XMzIocmVnLCB2YWwzMikJb3V0bCAoKHZhbDMyKSwgKCh1bnNpZ25lZCBsb25nKWlvYWRkcikgKyAocmVnKSkKKyNkZWZpbmUgUlRMX1c4X0YJCVJUTF9XOAorI2RlZmluZSBSVExfVzE2X0YJCVJUTF9XMTYKKyNkZWZpbmUgUlRMX1czMl9GCQlSVExfVzMyCisjdW5kZWYgcmVhZGIKKyN1bmRlZiByZWFkdworI3VuZGVmIHJlYWRsCisjdW5kZWYgd3JpdGViCisjdW5kZWYgd3JpdGV3CisjdW5kZWYgd3JpdGVsCisjZGVmaW5lIHJlYWRiKGFkZHIpIGluYigodW5zaWduZWQgbG9uZykoYWRkcikpCisjZGVmaW5lIHJlYWR3KGFkZHIpIGludygodW5zaWduZWQgbG9uZykoYWRkcikpCisjZGVmaW5lIHJlYWRsKGFkZHIpIGlubCgodW5zaWduZWQgbG9uZykoYWRkcikpCisjZGVmaW5lIHdyaXRlYih2YWwsYWRkcikgb3V0YigodmFsKSwodW5zaWduZWQgbG9uZykoYWRkcikpCisjZGVmaW5lIHdyaXRldyh2YWwsYWRkcikgb3V0dygodmFsKSwodW5zaWduZWQgbG9uZykoYWRkcikpCisjZGVmaW5lIHdyaXRlbCh2YWwsYWRkcikgb3V0bCgodmFsKSwodW5zaWduZWQgbG9uZykoYWRkcikpCisKKyNlbHNlCisKKy8qIHdyaXRlIE1NSU8gcmVnaXN0ZXIsIHdpdGggZmx1c2ggKi8KKy8qIEZsdXNoIGF2b2lkcyBydGw4MTM5IGJ1ZyB3LyBwb3N0ZWQgTU1JTyB3cml0ZXMgKi8KKyNkZWZpbmUgUlRMX1c4X0YocmVnLCB2YWw4KQlkbyB7IHdyaXRlYiAoKHZhbDgpLCBpb2FkZHIgKyAocmVnKSk7IHJlYWRiIChpb2FkZHIgKyAocmVnKSk7IH0gd2hpbGUgKDApCisjZGVmaW5lIFJUTF9XMTZfRihyZWcsIHZhbDE2KQlkbyB7IHdyaXRldyAoKHZhbDE2KSwgaW9hZGRyICsgKHJlZykpOyByZWFkdyAoaW9hZGRyICsgKHJlZykpOyB9IHdoaWxlICgwKQorI2RlZmluZSBSVExfVzMyX0YocmVnLCB2YWwzMikJZG8geyB3cml0ZWwgKCh2YWwzMiksIGlvYWRkciArIChyZWcpKTsgcmVhZGwgKGlvYWRkciArIChyZWcpKTsgfSB3aGlsZSAoMCkKKworCisjZGVmaW5lIE1NSU9fRkxVU0hfQVVESVRfQ09NUExFVEUgMQorI2lmIE1NSU9fRkxVU0hfQVVESVRfQ09NUExFVEUKKworLyogd3JpdGUgTU1JTyByZWdpc3RlciAqLworI2RlZmluZSBSVExfVzgocmVnLCB2YWw4KQl3cml0ZWIgKCh2YWw4KSwgaW9hZGRyICsgKHJlZykpCisjZGVmaW5lIFJUTF9XMTYocmVnLCB2YWwxNikJd3JpdGV3ICgodmFsMTYpLCBpb2FkZHIgKyAocmVnKSkKKyNkZWZpbmUgUlRMX1czMihyZWcsIHZhbDMyKQl3cml0ZWwgKCh2YWwzMiksIGlvYWRkciArIChyZWcpKQorCisjZWxzZQorCisvKiB3cml0ZSBNTUlPIHJlZ2lzdGVyLCB0aGVuIGZsdXNoICovCisjZGVmaW5lIFJUTF9XOAkJUlRMX1c4X0YKKyNkZWZpbmUgUlRMX1cxNgkJUlRMX1cxNl9GCisjZGVmaW5lIFJUTF9XMzIJCVJUTF9XMzJfRgorCisjZW5kaWYgLyogTU1JT19GTFVTSF9BVURJVF9DT01QTEVURSAqLworCisvKiByZWFkIE1NSU8gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlRMX1I4KHJlZykJCXJlYWRiIChpb2FkZHIgKyAocmVnKSkKKyNkZWZpbmUgUlRMX1IxNihyZWcpCQlyZWFkdyAoaW9hZGRyICsgKHJlZykpCisjZGVmaW5lIFJUTF9SMzIocmVnKQkJKCh1bnNpZ25lZCBsb25nKSByZWFkbCAoaW9hZGRyICsgKHJlZykpKQorCisjZW5kaWYgLyogVVNFX0lPX09QUyAqLworCisKK3N0YXRpYyBjb25zdCB1MTYgcnRsODEzOV9pbnRyX21hc2sgPQorCVBDSUVyciB8IFBDU1RpbWVvdXQgfCBSeFVuZGVycnVuIHwgUnhPdmVyZmxvdyB8IFJ4RklGT092ZXIgfAorCVR4RXJyIHwgVHhPSyB8IFJ4RXJyIHwgUnhPSzsKKworc3RhdGljIGNvbnN0IHUxNiBydGw4MTM5X25vcnhfaW50cl9tYXNrID0KKwlQQ0lFcnIgfCBQQ1NUaW1lb3V0IHwgUnhVbmRlcnJ1biB8CisJVHhFcnIgfCBUeE9LIHwgUnhFcnIgOworCisjaWYgUlhfQlVGX0lEWCA9PSAwCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJ0bDgxMzlfcnhfY29uZmlnID0KKwlSeENmZ1JjdjhLIHwgUnhOb1dyYXAgfAorCShSWF9GSUZPX1RIUkVTSCA8PCBSeENmZ0ZJRk9TaGlmdCkgfAorCShSWF9ETUFfQlVSU1QgPDwgUnhDZmdETUFTaGlmdCk7CisjZWxpZiBSWF9CVUZfSURYID09IDEKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcnRsODEzOV9yeF9jb25maWcgPQorCVJ4Q2ZnUmN2MTZLIHwgUnhOb1dyYXAgfAorCShSWF9GSUZPX1RIUkVTSCA8PCBSeENmZ0ZJRk9TaGlmdCkgfAorCShSWF9ETUFfQlVSU1QgPDwgUnhDZmdETUFTaGlmdCk7CisjZWxpZiBSWF9CVUZfSURYID09IDIKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcnRsODEzOV9yeF9jb25maWcgPQorCVJ4Q2ZnUmN2MzJLIHwgUnhOb1dyYXAgfAorCShSWF9GSUZPX1RIUkVTSCA8PCBSeENmZ0ZJRk9TaGlmdCkgfAorCShSWF9ETUFfQlVSU1QgPDwgUnhDZmdETUFTaGlmdCk7CisjZWxpZiBSWF9CVUZfSURYID09IDMKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcnRsODEzOV9yeF9jb25maWcgPQorCVJ4Q2ZnUmN2NjRLIHwKKwkoUlhfRklGT19USFJFU0ggPDwgUnhDZmdGSUZPU2hpZnQpIHwKKwkoUlhfRE1BX0JVUlNUIDw8IFJ4Q2ZnRE1BU2hpZnQpOworI2Vsc2UKKyNlcnJvciAiSW52YWxpZCBjb25maWd1cmF0aW9uIGZvciA4MTM5X1JYQlVGX0lEWCIKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJ0bDgxMzlfdHhfY29uZmlnID0KKwlUeElGRzk2IHwgKFRYX0RNQV9CVVJTVCA8PCBUeERNQVNoaWZ0KSB8IChUWF9SRVRSWSA8PCBUeFJldHJ5U2hpZnQpOworCitzdGF0aWMgdm9pZCBfX3J0bDgxMzlfY2xlYW51cF9kZXYgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJYXNzZXJ0IChkZXYgIT0gTlVMTCk7CisJYXNzZXJ0ICh0cC0+cGNpX2RldiAhPSBOVUxMKTsKKwlwZGV2ID0gdHAtPnBjaV9kZXY7CisKKyNpZm5kZWYgVVNFX0lPX09QUworCWlmICh0cC0+bW1pb19hZGRyKQorCQlpb3VubWFwICh0cC0+bW1pb19hZGRyKTsKKyNlbmRpZiAvKiAhVVNFX0lPX09QUyAqLworCisJLyogaXQncyBvayB0byBjYWxsIHRoaXMgZXZlbiBpZiB3ZSBoYXZlIG5vIHJlZ2lvbnMgdG8gZnJlZSAqLworCXBjaV9yZWxlYXNlX3JlZ2lvbnMgKHBkZXYpOworCisJZnJlZV9uZXRkZXYoZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEgKHBkZXYsIE5VTEwpOworfQorCisKK3N0YXRpYyB2b2lkIHJ0bDgxMzlfY2hpcF9yZXNldCAodm9pZCAqaW9hZGRyKQoreworCWludCBpOworCisJLyogU29mdCByZXNldCB0aGUgY2hpcC4gKi8KKwlSVExfVzggKENoaXBDbWQsIENtZFJlc2V0KTsKKworCS8qIENoZWNrIHRoYXQgdGhlIGNoaXAgaGFzIGZpbmlzaGVkIHRoZSByZXNldC4gKi8KKwlmb3IgKGkgPSAxMDAwOyBpID4gMDsgaS0tKSB7CisJCWJhcnJpZXIoKTsKKwkJaWYgKChSVExfUjggKENoaXBDbWQpICYgQ21kUmVzZXQpID09IDApCisJCQlicmVhazsKKwkJdWRlbGF5ICgxMCk7CisJfQorfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJ0bDgxMzlfaW5pdF9ib2FyZCAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqKmRldl9vdXQpCit7CisJdm9pZCAqaW9hZGRyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHA7CisJdTggdG1wODsKKwlpbnQgcmMsIGRpc2FibGVfZGV2X29uX2VyciA9IDA7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgbG9uZyBwaW9fc3RhcnQsIHBpb19lbmQsIHBpb19mbGFncywgcGlvX2xlbjsKKwl1bnNpZ25lZCBsb25nIG1taW9fc3RhcnQsIG1taW9fZW5kLCBtbWlvX2ZsYWdzLCBtbWlvX2xlbjsKKwl1MzIgdmVyc2lvbjsKKworCWFzc2VydCAocGRldiAhPSBOVUxMKTsKKworCSpkZXZfb3V0ID0gTlVMTDsKKworCS8qIGRldiBhbmQgcHJpdiB6ZXJvZWQgaW4gYWxsb2NfZXRoZXJkZXYgKi8KKwlkZXYgPSBhbGxvY19ldGhlcmRldiAoc2l6ZW9mICgqdHApKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIiVzOiBVbmFibGUgdG8gYWxsb2MgbmV3IG5ldCBkZXZpY2VcbiIsIHBjaV9uYW1lKHBkZXYpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXRwLT5wY2lfZGV2ID0gcGRldjsKKworCS8qIGVuYWJsZSBkZXZpY2UgKGluY2wuIFBDSSBQTSB3YWtldXAgYW5kIGhvdHBsdWcgc2V0dXApICovCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZSAocGRldik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXQ7CisKKwlwaW9fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDApOworCXBpb19lbmQgPSBwY2lfcmVzb3VyY2VfZW5kIChwZGV2LCAwKTsKKwlwaW9fZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MgKHBkZXYsIDApOworCXBpb19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuIChwZGV2LCAwKTsKKworCW1taW9fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDEpOworCW1taW9fZW5kID0gcGNpX3Jlc291cmNlX2VuZCAocGRldiwgMSk7CisJbW1pb19mbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFncyAocGRldiwgMSk7CisJbW1pb19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuIChwZGV2LCAxKTsKKworCS8qIHNldCB0aGlzIGltbWVkaWF0ZWx5LCB3ZSBuZWVkIHRvIGtub3cgYmVmb3JlCisJICogd2UgdGFsayB0byB0aGUgY2hpcCBkaXJlY3RseSAqLworCURQUklOVEsoIlBJTyByZWdpb24gc2l6ZSA9PSAweCUwMlhcbiIsIHBpb19sZW4pOworCURQUklOVEsoIk1NSU8gcmVnaW9uIHNpemUgPT0gMHglMDJsWFxuIiwgbW1pb19sZW4pOworCisjaWZkZWYgVVNFX0lPX09QUworCS8qIG1ha2Ugc3VyZSBQQ0kgYmFzZSBhZGRyIDAgaXMgUElPICovCisJaWYgKCEocGlvX2ZsYWdzICYgSU9SRVNPVVJDRV9JTykpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIiVzOiByZWdpb24gIzAgbm90IGEgUElPIHJlc291cmNlLCBhYm9ydGluZ1xuIiwgcGNpX25hbWUocGRldikpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogY2hlY2sgZm9yIHdlaXJkL2Jyb2tlbiBQQ0kgcmVnaW9uIHJlcG9ydGluZyAqLworCWlmIChwaW9fbGVuIDwgUlRMX01JTl9JT19TSVpFKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICIlczogSW52YWxpZCBQQ0kgSS9PIHJlZ2lvbiBzaXplKHMpLCBhYm9ydGluZ1xuIiwgcGNpX25hbWUocGRldikpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisjZWxzZQorCS8qIG1ha2Ugc3VyZSBQQ0kgYmFzZSBhZGRyIDEgaXMgTU1JTyAqLworCWlmICghKG1taW9fZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIiVzOiByZWdpb24gIzEgbm90IGFuIE1NSU8gcmVzb3VyY2UsIGFib3J0aW5nXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKwlpZiAobW1pb19sZW4gPCBSVExfTUlOX0lPX1NJWkUpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIiVzOiBJbnZhbGlkIFBDSSBtZW0gcmVnaW9uIHNpemUocyksIGFib3J0aW5nXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKyNlbmRpZgorCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zIChwZGV2LCAiODEzOXRvbyIpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0OworCWRpc2FibGVfZGV2X29uX2VyciA9IDE7CisKKwkvKiBlbmFibGUgUENJIGJ1cy1tYXN0ZXJpbmcgKi8KKwlwY2lfc2V0X21hc3RlciAocGRldik7CisKKyNpZmRlZiBVU0VfSU9fT1BTCisJaW9hZGRyID0gKHZvaWQgKikgcGlvX3N0YXJ0OworCWRldi0+YmFzZV9hZGRyID0gcGlvX3N0YXJ0OworCXRwLT5tbWlvX2FkZHIgPSBpb2FkZHI7CisJdHAtPnJlZ3NfbGVuID0gcGlvX2xlbjsKKyNlbHNlCisJLyogaW9yZW1hcCBNTUlPIHJlZ2lvbiAqLworCWlvYWRkciA9IGlvcmVtYXAgKG1taW9fc3RhcnQsIG1taW9fbGVuKTsKKwlpZiAoaW9hZGRyID09IE5VTEwpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIiVzOiBjYW5ub3QgcmVtYXAgTU1JTywgYWJvcnRpbmdcbiIsIHBjaV9uYW1lKHBkZXYpKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWRldi0+YmFzZV9hZGRyID0gKGxvbmcpIGlvYWRkcjsKKwl0cC0+bW1pb19hZGRyID0gaW9hZGRyOworCXRwLT5yZWdzX2xlbiA9IG1taW9fbGVuOworI2VuZGlmIC8qIFVTRV9JT19PUFMgKi8KKworCS8qIEJyaW5nIG9sZCBjaGlwcyBvdXQgb2YgbG93LXBvd2VyIG1vZGUuICovCisJUlRMX1c4IChIbHRDbGssICdSJyk7CisKKwkvKiBjaGVjayBmb3IgbWlzc2luZy9icm9rZW4gaGFyZHdhcmUgKi8KKwlpZiAoUlRMX1IzMiAoVHhDb25maWcpID09IDB4RkZGRkZGRkYpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIiVzOiBDaGlwIG5vdCByZXNwb25kaW5nLCBpZ25vcmluZyBib2FyZFxuIiwKKwkJCXBjaV9uYW1lKHBkZXYpKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogaWRlbnRpZnkgY2hpcCBhdHRhY2hlZCB0byBib2FyZCAqLworCXZlcnNpb24gPSBSVExfUjMyIChUeENvbmZpZykgJiBIV19SRVZJRF9NQVNLOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFIChydGxfY2hpcF9pbmZvKTsgaSsrKQorCQlpZiAodmVyc2lvbiA9PSBydGxfY2hpcF9pbmZvW2ldLnZlcnNpb24pIHsKKwkJCXRwLT5jaGlwc2V0ID0gaTsKKwkJCWdvdG8gbWF0Y2g7CisJCX0KKworCS8qIGlmIHVua25vd24gY2hpcCwgYXNzdW1lIGFycmF5IGVsZW1lbnQgIzAsIG9yaWdpbmFsIFJUTC04MTM5IGluIHRoaXMgY2FzZSAqLworCXByaW50ayAoS0VSTl9ERUJVRyBQRlggIiVzOiB1bmtub3duIGNoaXAgdmVyc2lvbiwgYXNzdW1pbmcgUlRMLTgxMzlcbiIsCisJCXBjaV9uYW1lKHBkZXYpKTsKKwlwcmludGsgKEtFUk5fREVCVUcgUEZYICIlczogVHhDb25maWcgPSAweCVseFxuIiwgcGNpX25hbWUocGRldiksIFJUTF9SMzIgKFR4Q29uZmlnKSk7CisJdHAtPmNoaXBzZXQgPSAwOworCittYXRjaDoKKwlEUFJJTlRLICgiY2hpcHNldCBpZCAoJWQpID09IGluZGV4ICVkLCAnJXMnXG4iLAorCQkgdmVyc2lvbiwgaSwgcnRsX2NoaXBfaW5mb1tpXS5uYW1lKTsKKworCWlmICh0cC0+Y2hpcHNldCA+PSBDSF84MTM5QikgeworCQl1OCBuZXdfdG1wOCA9IHRtcDggPSBSVExfUjggKENvbmZpZzEpOworCQlEUFJJTlRLKCJQQ0kgUE0gd2FrZXVwXG4iKTsKKwkJaWYgKChydGxfY2hpcF9pbmZvW3RwLT5jaGlwc2V0XS5mbGFncyAmIEhhc0xXYWtlKSAmJgorCQkgICAgKHRtcDggJiBMV0FLRSkpCisJCQluZXdfdG1wOCAmPSB+TFdBS0U7CisJCW5ld190bXA4IHw9IENmZzFfUE1fRW5hYmxlOworCQlpZiAobmV3X3RtcDggIT0gdG1wOCkgeworCQkJUlRMX1c4IChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisJCQlSVExfVzggKENvbmZpZzEsIHRtcDgpOworCQkJUlRMX1c4IChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOworCQl9CisJCWlmIChydGxfY2hpcF9pbmZvW3RwLT5jaGlwc2V0XS5mbGFncyAmIEhhc0xXYWtlKSB7CisJCQl0bXA4ID0gUlRMX1I4IChDb25maWc0KTsKKwkJCWlmICh0bXA4ICYgTFdQVE4pIHsKKwkJCQlSVExfVzggKENmZzkzNDYsIENmZzkzNDZfVW5sb2NrKTsKKwkJCQlSVExfVzggKENvbmZpZzQsIHRtcDggJiB+TFdQVE4pOworCQkJCVJUTF9XOCAoQ2ZnOTM0NiwgQ2ZnOTM0Nl9Mb2NrKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCURQUklOVEsoIk9sZCBjaGlwIHdha2V1cFxuIik7CisJCXRtcDggPSBSVExfUjggKENvbmZpZzEpOworCQl0bXA4ICY9IH4oU0xFRVAgfCBQV1JETik7CisJCVJUTF9XOCAoQ29uZmlnMSwgdG1wOCk7CisJfQorCisJcnRsODEzOV9jaGlwX3Jlc2V0IChpb2FkZHIpOworCisJKmRldl9vdXQgPSBkZXY7CisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJX19ydGw4MTM5X2NsZWFudXBfZGV2IChkZXYpOworCWlmIChkaXNhYmxlX2Rldl9vbl9lcnIpCisJCXBjaV9kaXNhYmxlX2RldmljZSAocGRldik7CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJ0bDgxMzlfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKnRwOworCWludCBpLCBhZGRyX2xlbiwgb3B0aW9uOworCXZvaWQgKmlvYWRkcjsKKwlzdGF0aWMgaW50IGJvYXJkX2lkeCA9IC0xOworCXU4IHBjaV9yZXY7CisKKwlhc3NlcnQgKHBkZXYgIT0gTlVMTCk7CisJYXNzZXJ0IChlbnQgIT0gTlVMTCk7CisKKwlib2FyZF9pZHgrKzsKKworCS8qIHdoZW4gd2UncmUgYnVpbHQgaW50byB0aGUga2VybmVsLCB0aGUgZHJpdmVyIHZlcnNpb24gbWVzc2FnZQorCSAqIGlzIG9ubHkgcHJpbnRlZCBpZiBhdCBsZWFzdCBvbmUgODEzOSBib2FyZCBoYXMgYmVlbiBmb3VuZAorCSAqLworI2lmbmRlZiBNT0RVTEUKKwl7CisJCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCQlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQkJcHJpbnRrIChLRVJOX0lORk8gUlRMODEzOV9EUklWRVJfTkFNRSAiXG4iKTsKKwl9CisjZW5kaWYKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnBjaV9yZXYpOworCisJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1JFQUxURUsgJiYKKwkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUkVBTFRFS184MTM5ICYmIHBjaV9yZXYgPj0gMHgyMCkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAicGNpIGRldiAlcyAoaWQgJTA0eDolMDR4IHJldiAlMDJ4KSBpcyBhbiBlbmhhbmNlZCA4MTM5QysgY2hpcFxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpLCBwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwgcGNpX3Jldik7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJVc2UgdGhlIFwiODEzOWNwXCIgZHJpdmVyIGZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZSBhbmQgc3RhYmlsaXR5LlxuIik7CisJfQorCisJaSA9IHJ0bDgxMzlfaW5pdF9ib2FyZCAocGRldiwgJmRldik7CisJaWYgKGkgPCAwKQorCQlyZXR1cm4gaTsKKworCWFzc2VydCAoZGV2ICE9IE5VTEwpOworCXRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJYXNzZXJ0IChpb2FkZHIgIT0gTlVMTCk7CisKKwlhZGRyX2xlbiA9IHJlYWRfZWVwcm9tIChpb2FkZHIsIDAsIDgpID09IDB4ODEyOSA/IDggOiA2OworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCSgodTE2ICopIChkZXYtPmRldl9hZGRyKSlbaV0gPQorCQkgICAgbGUxNl90b19jcHUgKHJlYWRfZWVwcm9tIChpb2FkZHIsIGkgKyA3LCBhZGRyX2xlbikpOworCisJLyogVGhlIFJ0bDgxMzktc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSBydGw4MTM5X29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBydGw4MTM5X3N0YXJ0X3htaXQ7CisJZGV2LT5wb2xsID0gcnRsODEzOV9wb2xsOworCWRldi0+d2VpZ2h0ID0gNjQ7CisJZGV2LT5zdG9wID0gcnRsODEzOV9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9IHJ0bDgxMzlfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gcnRsODEzOV9zZXRfcnhfbW9kZTsKKwlkZXYtPmRvX2lvY3RsID0gbmV0ZGV2X2lvY3RsOworCWRldi0+ZXRodG9vbF9vcHMgPSAmcnRsODEzOV9ldGh0b29sX29wczsKKwlkZXYtPnR4X3RpbWVvdXQgPSBydGw4MTM5X3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IHJ0bDgxMzlfcG9sbF9jb250cm9sbGVyOworI2VuZGlmCisKKwkvKiBub3RlOiB0aGUgaGFyZHdhcmUgaXMgbm90IGNhcGFibGUgb2Ygc2cvY3N1bS9oaWdoZG1hLCBob3dldmVyCisJICogdGhyb3VnaCB0aGUgdXNlIG9mIHNrYl9jb3B5X2FuZF9jc3VtX2RldiB3ZSBlbmFibGUgdGhlc2UKKwkgKiBmZWF0dXJlcworCSAqLworCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSFdfQ1NVTSB8IE5FVElGX0ZfSElHSERNQTsKKworCWRldi0+aXJxID0gcGRldi0+aXJxOworCisJLyogdHAgemVyb2VkIGFuZCBhbGlnbmVkIGluIGFsbG9jX2V0aGVyZGV2ICovCisJdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogbm90ZTogdHAtPmNoaXBzZXQgc2V0IGluIHJ0bDgxMzlfaW5pdF9ib2FyZCAqLworCXRwLT5kcnZfZmxhZ3MgPSBib2FyZF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdLmh3X2ZsYWdzOworCXRwLT5tbWlvX2FkZHIgPSBpb2FkZHI7CisJdHAtPm1zZ19lbmFibGUgPQorCQkoZGVidWcgPCAwID8gUlRMODEzOV9ERUZfTVNHX0VOQUJMRSA6ICgoMSA8PCBkZWJ1ZykgLSAxKSk7CisJc3Bpbl9sb2NrX2luaXQgKCZ0cC0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQgKCZ0cC0+cnhfbG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCAoJnRwLT50aHJfd2FpdCk7CisJaW5pdF9jb21wbGV0aW9uICgmdHAtPnRocl9leGl0ZWQpOworCXRwLT5taWkuZGV2ID0gZGV2OworCXRwLT5taWkubWRpb19yZWFkID0gbWRpb19yZWFkOworCXRwLT5taWkubWRpb193cml0ZSA9IG1kaW9fd3JpdGU7CisJdHAtPm1paS5waHlfaWRfbWFzayA9IDB4M2Y7CisJdHAtPm1paS5yZWdfbnVtX21hc2sgPSAweDFmOworCisJLyogZGV2IGlzIGZ1bGx5IHNldCB1cCBhbmQgcmVhZHkgdG8gdXNlIG5vdyAqLworCURQUklOVEsoImFib3V0IHRvIHJlZ2lzdGVyIGRldmljZSBuYW1lZCAlcyAoJXApLi4uXG4iLCBkZXYtPm5hbWUsIGRldik7CisJaSA9IHJlZ2lzdGVyX25ldGRldiAoZGV2KTsKKwlpZiAoaSkgZ290byBlcnJfb3V0OworCisJcGNpX3NldF9kcnZkYXRhIChwZGV2LCBkZXYpOworCisJcHJpbnRrIChLRVJOX0lORk8gIiVzOiAlcyBhdCAweCVseCwgIgorCQkiJTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMngsICIKKwkJIklSUSAlZFxuIiwKKwkJZGV2LT5uYW1lLAorCQlib2FyZF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdLm5hbWUsCisJCWRldi0+YmFzZV9hZGRyLAorCQlkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLAorCQlkZXYtPmRldl9hZGRyWzJdLCBkZXYtPmRldl9hZGRyWzNdLAorCQlkZXYtPmRldl9hZGRyWzRdLCBkZXYtPmRldl9hZGRyWzVdLAorCQlkZXYtPmlycSk7CisKKwlwcmludGsgKEtFUk5fREVCVUcgIiVzOiAgSWRlbnRpZmllZCA4MTM5IGNoaXAgdHlwZSAnJXMnXG4iLAorCQlkZXYtPm5hbWUsIHJ0bF9jaGlwX2luZm9bdHAtPmNoaXBzZXRdLm5hbWUpOworCisJLyogRmluZCB0aGUgY29ubmVjdGVkIE1JSSB4Y3Zycy4KKwkgICBEb2luZyB0aGlzIGluIG9wZW4oKSB3b3VsZCBhbGxvdyBkZXRlY3RpbmcgZXh0ZXJuYWwgeGN2cnMgbGF0ZXIsIGJ1dAorCSAgIHRha2VzIHRvbyBtdWNoIHRpbWUuICovCisjaWZkZWYgQ09ORklHXzgxMzlUT09fODEyOQorCWlmICh0cC0+ZHJ2X2ZsYWdzICYgSEFTX01JSV9YQ1ZSKSB7CisJCWludCBwaHksIHBoeV9pZHggPSAwOworCQlmb3IgKHBoeSA9IDA7IHBoeSA8IDMyICYmIHBoeV9pZHggPCBzaXplb2YodHAtPnBoeXMpOyBwaHkrKykgeworCQkJaW50IG1paV9zdGF0dXMgPSBtZGlvX3JlYWQoZGV2LCBwaHksIDEpOworCQkJaWYgKG1paV9zdGF0dXMgIT0gMHhmZmZmICAmJiAgbWlpX3N0YXR1cyAhPSAweDAwMDApIHsKKwkJCQl1MTYgYWR2ZXJ0aXNpbmcgPSBtZGlvX3JlYWQoZGV2LCBwaHksIDQpOworCQkJCXRwLT5waHlzW3BoeV9pZHgrK10gPSBwaHk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1JSSB0cmFuc2NlaXZlciAlZCBzdGF0dXMgMHglNC40eCAiCisJCQkJCSAgICJhZHZlcnRpc2luZyAlNC40eC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgcGh5LCBtaWlfc3RhdHVzLCBhZHZlcnRpc2luZyk7CisJCQl9CisJCX0KKwkJaWYgKHBoeV9pZHggPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vIE1JSSB0cmFuc2NlaXZlcnMgZm91bmQhICBBc3N1bWluZyBTWU0gIgorCQkJCSAgICJ0cmFuc2NlaXZlci5cbiIsCisJCQkJICAgZGV2LT5uYW1lKTsKKwkJCXRwLT5waHlzWzBdID0gMzI7CisJCX0KKwl9IGVsc2UKKyNlbmRpZgorCQl0cC0+cGh5c1swXSA9IDMyOworCXRwLT5taWkucGh5X2lkID0gdHAtPnBoeXNbMF07CisKKwkvKiBUaGUgbG93ZXIgZm91ciBiaXRzIGFyZSB0aGUgbWVkaWEgdHlwZS4gKi8KKwlvcHRpb24gPSAoYm9hcmRfaWR4ID49IE1BWF9VTklUUykgPyAwIDogbWVkaWFbYm9hcmRfaWR4XTsKKwlpZiAob3B0aW9uID4gMCkgeworCQl0cC0+bWlpLmZ1bGxfZHVwbGV4ID0gKG9wdGlvbiAmIDB4MjEwKSA/IDEgOiAwOworCQl0cC0+ZGVmYXVsdF9wb3J0ID0gb3B0aW9uICYgMHhGRjsKKwkJaWYgKHRwLT5kZWZhdWx0X3BvcnQpCisJCQl0cC0+bWlpLmZvcmNlX21lZGlhID0gMTsKKwl9CisJaWYgKGJvYXJkX2lkeCA8IE1BWF9VTklUUyAgJiYgIGZ1bGxfZHVwbGV4W2JvYXJkX2lkeF0gPiAwKQorCQl0cC0+bWlpLmZ1bGxfZHVwbGV4ID0gZnVsbF9kdXBsZXhbYm9hcmRfaWR4XTsKKwlpZiAodHAtPm1paS5mdWxsX2R1cGxleCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogTWVkaWEgdHlwZSBmb3JjZWQgdG8gRnVsbCBEdXBsZXguXG4iLCBkZXYtPm5hbWUpOworCQkvKiBDaGFuZ2luZyB0aGUgTUlJLWFkdmVydGlzZWQgbWVkaWEgYmVjYXVzZSBtaWdodCBwcmV2ZW50CisJCSAgIHJlLWNvbm5lY3Rpb24uICovCisJCXRwLT5taWkuZm9yY2VfbWVkaWEgPSAxOworCX0KKwlpZiAodHAtPmRlZmF1bHRfcG9ydCkgeworCQlwcmludGsoS0VSTl9JTkZPICIgIEZvcmNpbmcgJWRNYnBzICVzLWR1cGxleCBvcGVyYXRpb24uXG4iLAorCQkJICAgKG9wdGlvbiAmIDB4MjAgPyAxMDAgOiAxMCksCisJCQkgICAob3B0aW9uICYgMHgxMCA/ICJmdWxsIiA6ICJoYWxmIikpOworCQltZGlvX3dyaXRlKGRldiwgdHAtPnBoeXNbMF0sIDAsCisJCQkJICAgKChvcHRpb24gJiAweDIwKSA/IDB4MjAwMCA6IDApIHwgCS8qIDEwME1icHM/ICovCisJCQkJICAgKChvcHRpb24gJiAweDEwKSA/IDB4MDEwMCA6IDApKTsgLyogRnVsbCBkdXBsZXg/ICovCisJfQorCisJLyogUHV0IHRoZSBjaGlwIGludG8gbG93LXBvd2VyIG1vZGUuICovCisJaWYgKHJ0bF9jaGlwX2luZm9bdHAtPmNoaXBzZXRdLmZsYWdzICYgSGFzSGx0Q2xrKQorCQlSVExfVzggKEhsdENsaywgJ0gnKTsJLyogJ1InIHdvdWxkIGxlYXZlIHRoZSBjbG9jayBydW5uaW5nLiAqLworCisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJX19ydGw4MTM5X2NsZWFudXBfZGV2IChkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZSAocGRldik7CisJcmV0dXJuIGk7Cit9CisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IHJ0bDgxMzlfcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YSAocGRldik7CisKKwlhc3NlcnQgKGRldiAhPSBOVUxMKTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2IChkZXYpOworCisJX19ydGw4MTM5X2NsZWFudXBfZGV2IChkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZSAocGRldik7Cit9CisKKworLyogU2VyaWFsIEVFUFJPTSBzZWN0aW9uLiAqLworCisvKiAgRUVQUk9NX0N0cmwgYml0cy4gKi8KKyNkZWZpbmUgRUVfU0hJRlRfQ0xLCTB4MDQJLyogRUVQUk9NIHNoaWZ0IGNsb2NrLiAqLworI2RlZmluZSBFRV9DUwkJCTB4MDgJLyogRUVQUk9NIGNoaXAgc2VsZWN0LiAqLworI2RlZmluZSBFRV9EQVRBX1dSSVRFCTB4MDIJLyogRUVQUk9NIGNoaXAgZGF0YSBpbi4gKi8KKyNkZWZpbmUgRUVfV1JJVEVfMAkJMHgwMAorI2RlZmluZSBFRV9XUklURV8xCQkweDAyCisjZGVmaW5lIEVFX0RBVEFfUkVBRAkweDAxCS8qIEVFUFJPTSBjaGlwIGRhdGEgb3V0LiAqLworI2RlZmluZSBFRV9FTkIJCQkoMHg4MCB8IEVFX0NTKQorCisvKiBEZWxheSBiZXR3ZWVuIEVFUFJPTSBjbG9jayB0cmFuc2l0aW9ucy4KKyAgIE5vIGV4dHJhIGRlbGF5IGlzIG5lZWRlZCB3aXRoIDMzTWh6IFBDSSwgYnV0IDY2TWh6IG1heSBjaGFuZ2UgdGhpcy4KKyAqLworCisjZGVmaW5lIGVlcHJvbV9kZWxheSgpCXJlYWRsKGVlX2FkZHIpCisKKy8qIFRoZSBFRVBST00gY29tbWFuZHMgaW5jbHVkZSB0aGUgYWx3YXktc2V0IGxlYWRpbmcgYml0LiAqLworI2RlZmluZSBFRV9XUklURV9DTUQJKDUpCisjZGVmaW5lIEVFX1JFQURfQ01ECQkoNikKKyNkZWZpbmUgRUVfRVJBU0VfQ01ECSg3KQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCByZWFkX2VlcHJvbSAodm9pZCAqaW9hZGRyLCBpbnQgbG9jYXRpb24sIGludCBhZGRyX2xlbikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCByZXR2YWwgPSAwOworCXZvaWQgKmVlX2FkZHIgPSBpb2FkZHIgKyBDZmc5MzQ2OworCWludCByZWFkX2NtZCA9IGxvY2F0aW9uIHwgKEVFX1JFQURfQ01EIDw8IGFkZHJfbGVuKTsKKworCXdyaXRlYiAoRUVfRU5CICYgfkVFX0NTLCBlZV9hZGRyKTsKKwl3cml0ZWIgKEVFX0VOQiwgZWVfYWRkcik7CisJZWVwcm9tX2RlbGF5ICgpOworCisJLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSA0ICsgYWRkcl9sZW47IGkgPj0gMDsgaS0tKSB7CisJCWludCBkYXRhdmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gRUVfREFUQV9XUklURSA6IDA7CisJCXdyaXRlYiAoRUVfRU5CIHwgZGF0YXZhbCwgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheSAoKTsKKwkJd3JpdGViIChFRV9FTkIgfCBkYXRhdmFsIHwgRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5ICgpOworCX0KKwl3cml0ZWIgKEVFX0VOQiwgZWVfYWRkcik7CisJZWVwcm9tX2RlbGF5ICgpOworCisJZm9yIChpID0gMTY7IGkgPiAwOyBpLS0pIHsKKwkJd3JpdGViIChFRV9FTkIgfCBFRV9TSElGVF9DTEssIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkgKCk7CisJCXJldHZhbCA9CisJCSAgICAocmV0dmFsIDw8IDEpIHwgKChyZWFkYiAoZWVfYWRkcikgJiBFRV9EQVRBX1JFQUQpID8gMSA6CisJCQkJICAgICAwKTsKKwkJd3JpdGViIChFRV9FTkIsIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkgKCk7CisJfQorCisJLyogVGVybWluYXRlIHRoZSBFRVBST00gYWNjZXNzLiAqLworCXdyaXRlYiAofkVFX0NTLCBlZV9hZGRyKTsKKwllZXByb21fZGVsYXkgKCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBNSUkgc2VyaWFsIG1hbmFnZW1lbnQ6IG1vc3RseSBib2d1cyBmb3Igbm93LiAqLworLyogUmVhZCBhbmQgd3JpdGUgdGhlIE1JSSBtYW5hZ2VtZW50IHJlZ2lzdGVycyB1c2luZyBzb2Z0d2FyZS1nZW5lcmF0ZWQKKyAgIHNlcmlhbCBNRElPIHByb3RvY29sLgorICAgVGhlIG1heGltdW0gZGF0YSBjbG9jayByYXRlIGlzIDIuNSBNaHouICBUaGUgbWluaW11bSB0aW1pbmcgaXMgdXN1YWxseQorICAgbWV0IGJ5IGJhY2stdG8tYmFjayBQQ0kgSS9PIGN5Y2xlcywgYnV0IHdlIGluc2VydCBhIGRlbGF5IHRvIGF2b2lkCisgICAib3ZlcmNsb2NraW5nIiBpc3N1ZXMuICovCisjZGVmaW5lIE1ESU9fRElSCQkweDgwCisjZGVmaW5lIE1ESU9fREFUQV9PVVQJMHgwNAorI2RlZmluZSBNRElPX0RBVEFfSU4JMHgwMgorI2RlZmluZSBNRElPX0NMSwkJMHgwMQorI2RlZmluZSBNRElPX1dSSVRFMCAoTURJT19ESVIpCisjZGVmaW5lIE1ESU9fV1JJVEUxIChNRElPX0RJUiB8IE1ESU9fREFUQV9PVVQpCisKKyNkZWZpbmUgbWRpb19kZWxheShtZGlvX2FkZHIpCXJlYWRiKG1kaW9fYWRkcikKKworCitzdGF0aWMgY2hhciBtaWlfMl84MTM5X21hcFs4XSA9IHsKKwlCYXNpY01vZGVDdHJsLAorCUJhc2ljTW9kZVN0YXR1cywKKwkwLAorCTAsCisJTldheUFkdmVydCwKKwlOV2F5TFBBUiwKKwlOV2F5RXhwYW5zaW9uLAorCTAKK307CisKKworI2lmZGVmIENPTkZJR184MTM5VE9PXzgxMjkKKy8qIFN5bmNyb25pemUgdGhlIE1JSSBtYW5hZ2VtZW50IGludGVyZmFjZSBieSBzaGlmdGluZyAzMiBvbmUgYml0cyBvdXQuICovCitzdGF0aWMgdm9pZCBtZGlvX3N5bmMgKHZvaWQgKm1kaW9fYWRkcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDMyOyBpID49IDA7IGktLSkgeworCQl3cml0ZWIgKE1ESU9fV1JJVEUxLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5IChtZGlvX2FkZHIpOworCQl3cml0ZWIgKE1ESU9fV1JJVEUxIHwgTURJT19DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkgKG1kaW9fYWRkcik7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgbWRpb19yZWFkIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pCit7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXR2YWwgPSAwOworI2lmZGVmIENPTkZJR184MTM5VE9PXzgxMjkKKwl2b2lkICptZGlvX2FkZHIgPSB0cC0+bW1pb19hZGRyICsgQ29uZmlnNDsKKwlpbnQgbWlpX2NtZCA9ICgweGY2IDw8IDEwKSB8IChwaHlfaWQgPDwgNSkgfCBsb2NhdGlvbjsKKwlpbnQgaTsKKyNlbmRpZgorCisJaWYgKHBoeV9pZCA+IDMxKSB7CS8qIFJlYWxseSBhIDgxMzkuICBVc2UgaW50ZXJuYWwgcmVnaXN0ZXJzLiAqLworCQlyZXR1cm4gbG9jYXRpb24gPCA4ICYmIG1paV8yXzgxMzlfbWFwW2xvY2F0aW9uXSA/CisJCSAgICByZWFkdyAodHAtPm1taW9fYWRkciArIG1paV8yXzgxMzlfbWFwW2xvY2F0aW9uXSkgOiAwOworCX0KKworI2lmZGVmIENPTkZJR184MTM5VE9PXzgxMjkKKwltZGlvX3N5bmMgKG1kaW9fYWRkcik7CisJLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGRhdGF2YWwgPSAobWlpX2NtZCAmICgxIDw8IGkpKSA/IE1ESU9fREFUQV9PVVQgOiAwOworCisJCXdyaXRlYiAoTURJT19ESVIgfCBkYXRhdmFsLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5IChtZGlvX2FkZHIpOworCQl3cml0ZWIgKE1ESU9fRElSIHwgZGF0YXZhbCB8IE1ESU9fQ0xLLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5IChtZGlvX2FkZHIpOworCX0KKworCS8qIFJlYWQgdGhlIHR3byB0cmFuc2l0aW9uLCAxNiBkYXRhLCBhbmQgd2lyZS1pZGxlIGJpdHMuICovCisJZm9yIChpID0gMTk7IGkgPiAwOyBpLS0pIHsKKwkJd3JpdGViICgwLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5IChtZGlvX2FkZHIpOworCQlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChyZWFkYiAobWRpb19hZGRyKSAmIE1ESU9fREFUQV9JTikgPyAxIDogMCk7CisJCXdyaXRlYiAoTURJT19DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkgKG1kaW9fYWRkcik7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gKHJldHZhbCA+PiAxKSAmIDB4ZmZmZjsKK30KKworCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sCisJCQlpbnQgdmFsdWUpCit7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworI2lmZGVmIENPTkZJR184MTM5VE9PXzgxMjkKKwl2b2lkICptZGlvX2FkZHIgPSB0cC0+bW1pb19hZGRyICsgQ29uZmlnNDsKKwlpbnQgbWlpX2NtZCA9ICgweDUwMDIgPDwgMTYpIHwgKHBoeV9pZCA8PCAyMykgfCAobG9jYXRpb24gPDwgMTgpIHwgdmFsdWU7CisJaW50IGk7CisjZW5kaWYKKworCWlmIChwaHlfaWQgPiAzMSkgewkvKiBSZWFsbHkgYSA4MTM5LiAgVXNlIGludGVybmFsIHJlZ2lzdGVycy4gKi8KKwkJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwkJaWYgKGxvY2F0aW9uID09IDApIHsKKwkJCVJUTF9XOCAoQ2ZnOTM0NiwgQ2ZnOTM0Nl9VbmxvY2spOworCQkJUlRMX1cxNiAoQmFzaWNNb2RlQ3RybCwgdmFsdWUpOworCQkJUlRMX1c4IChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOworCQl9IGVsc2UgaWYgKGxvY2F0aW9uIDwgOCAmJiBtaWlfMl84MTM5X21hcFtsb2NhdGlvbl0pCisJCQlSVExfVzE2IChtaWlfMl84MTM5X21hcFtsb2NhdGlvbl0sIHZhbHVlKTsKKwkJcmV0dXJuOworCX0KKworI2lmZGVmIENPTkZJR184MTM5VE9PXzgxMjkKKwltZGlvX3N5bmMgKG1kaW9fYWRkcik7CisKKwkvKiBTaGlmdCB0aGUgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGRhdGF2YWwgPQorCQkgICAgKG1paV9jbWQgJiAoMSA8PCBpKSkgPyBNRElPX1dSSVRFMSA6IE1ESU9fV1JJVEUwOworCQl3cml0ZWIgKGRhdGF2YWwsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkgKG1kaW9fYWRkcik7CisJCXdyaXRlYiAoZGF0YXZhbCB8IE1ESU9fQ0xLLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5IChtZGlvX2FkZHIpOworCX0KKwkvKiBDbGVhciBvdXQgZXh0cmEgYml0cy4gKi8KKwlmb3IgKGkgPSAyOyBpID4gMDsgaS0tKSB7CisJCXdyaXRlYiAoMCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSAobWRpb19hZGRyKTsKKwkJd3JpdGViIChNRElPX0NMSywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSAobWRpb19hZGRyKTsKKwl9CisjZW5kaWYKK30KKworCitzdGF0aWMgaW50IHJ0bDgxMzlfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJldHZhbDsKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCisJcmV0dmFsID0gcmVxdWVzdF9pcnEgKGRldi0+aXJxLCBydGw4MTM5X2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJdHAtPnR4X2J1ZnMgPSBwY2lfYWxsb2NfY29uc2lzdGVudCh0cC0+cGNpX2RldiwgVFhfQlVGX1RPVF9MRU4sCisJCQkJCSAgICZ0cC0+dHhfYnVmc19kbWEpOworCXRwLT5yeF9yaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQodHAtPnBjaV9kZXYsIFJYX0JVRl9UT1RfTEVOLAorCQkJCQkgICAmdHAtPnJ4X3JpbmdfZG1hKTsKKwlpZiAodHAtPnR4X2J1ZnMgPT0gTlVMTCB8fCB0cC0+cnhfcmluZyA9PSBOVUxMKSB7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJCWlmICh0cC0+dHhfYnVmcykKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQodHAtPnBjaV9kZXYsIFRYX0JVRl9UT1RfTEVOLAorCQkJCQkgICAgdHAtPnR4X2J1ZnMsIHRwLT50eF9idWZzX2RtYSk7CisJCWlmICh0cC0+cnhfcmluZykKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQodHAtPnBjaV9kZXYsIFJYX0JVRl9UT1RfTEVOLAorCQkJCQkgICAgdHAtPnJ4X3JpbmcsIHRwLT5yeF9yaW5nX2RtYSk7CisKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl9CisKKwl0cC0+bWlpLmZ1bGxfZHVwbGV4ID0gdHAtPm1paS5mb3JjZV9tZWRpYTsKKwl0cC0+dHhfZmxhZyA9IChUWF9GSUZPX1RIUkVTSCA8PCAxMSkgJiAweDAwM2YwMDAwOworCisJcnRsODEzOV9pbml0X3JpbmcgKGRldik7CisJcnRsODEzOV9od19zdGFydCAoZGV2KTsKKwluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKworCWlmIChuZXRpZl9tc2dfaWZ1cCh0cCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcnRsODEzOV9vcGVuKCkgaW9hZGRyICUjbHggSVJRICVkIgorCQkJIiBHUCBQaW5zICUyLjJ4ICVzLWR1cGxleC5cbiIsCisJCQlkZXYtPm5hbWUsIHBjaV9yZXNvdXJjZV9zdGFydCAodHAtPnBjaV9kZXYsIDEpLAorCQkJZGV2LT5pcnEsIFJUTF9SOCAoTWVkaWFTdGF0dXMpLAorCQkJdHAtPm1paS5mdWxsX2R1cGxleCA/ICJmdWxsIiA6ICJoYWxmIik7CisKKwlydGw4MTM5X3N0YXJ0X3RocmVhZChkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgcnRsX2NoZWNrX21lZGlhIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaW5pdF9tZWRpYSkKK3sKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAodHAtPnBoeXNbMF0gPj0gMCkgeworCQltaWlfY2hlY2tfbWVkaWEoJnRwLT5taWksIG5ldGlmX21zZ19saW5rKHRwKSwgaW5pdF9tZWRpYSk7CisJfQorfQorCisvKiBTdGFydCB0aGUgaGFyZHdhcmUgYXQgb3BlbiBvciByZXN1bWUuICovCitzdGF0aWMgdm9pZCBydGw4MTM5X2h3X3N0YXJ0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXUzMiBpOworCXU4IHRtcDsKKworCS8qIEJyaW5nIG9sZCBjaGlwcyBvdXQgb2YgbG93LXBvd2VyIG1vZGUuICovCisJaWYgKHJ0bF9jaGlwX2luZm9bdHAtPmNoaXBzZXRdLmZsYWdzICYgSGFzSGx0Q2xrKQorCQlSVExfVzggKEhsdENsaywgJ1InKTsKKworCXJ0bDgxMzlfY2hpcF9yZXNldCAoaW9hZGRyKTsKKworCS8qIHVubG9jayBDb25maWdbMDEyMzRdIGFuZCBCTUNSIHJlZ2lzdGVyIHdyaXRlcyAqLworCVJUTF9XOF9GIChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisJLyogUmVzdG9yZSBvdXIgaWRlYSBvZiB0aGUgTUFDIGFkZHJlc3MuICovCisJUlRMX1czMl9GIChNQUMwICsgMCwgY3B1X3RvX2xlMzIgKCoodTMyICopIChkZXYtPmRldl9hZGRyICsgMCkpKTsKKwlSVExfVzMyX0YgKE1BQzAgKyA0LCBjcHVfdG9fbGUzMiAoKih1MzIgKikgKGRldi0+ZGV2X2FkZHIgKyA0KSkpOworCisJLyogTXVzdCBlbmFibGUgVHgvUnggYmVmb3JlIHNldHRpbmcgdHJhbnNmZXIgdGhyZXNob2xkcyEgKi8KKwlSVExfVzggKENoaXBDbWQsIENtZFJ4RW5iIHwgQ21kVHhFbmIpOworCisJdHAtPnJ4X2NvbmZpZyA9IHJ0bDgxMzlfcnhfY29uZmlnIHwgQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXlQaHlzOworCVJUTF9XMzIgKFJ4Q29uZmlnLCB0cC0+cnhfY29uZmlnKTsKKwlSVExfVzMyIChUeENvbmZpZywgcnRsODEzOV90eF9jb25maWcpOworCisJdHAtPmN1cl9yeCA9IDA7CisKKwlydGxfY2hlY2tfbWVkaWEgKGRldiwgMSk7CisKKwlpZiAodHAtPmNoaXBzZXQgPj0gQ0hfODEzOUIpIHsKKwkJLyogRGlzYWJsZSBtYWdpYyBwYWNrZXQgc2Nhbm5pbmcsIHdoaWNoIGlzIGVuYWJsZWQKKwkJICogd2hlbiBQTSBpcyBlbmFibGVkIGluIENvbmZpZzEuICBJdCBjYW4gYmUgcmVlbmFibGVkCisJCSAqIHZpYSBFVEhUT09MX1NXT0wgaWYgZGVzaXJlZC4gICovCisJCVJUTF9XOCAoQ29uZmlnMywgUlRMX1I4IChDb25maWczKSAmIH5DZmczX01hZ2ljKTsKKwl9CisKKwlEUFJJTlRLKCJpbml0IGJ1ZmZlciBhZGRyZXNzZXNcbiIpOworCisJLyogTG9jayBDb25maWdbMDEyMzRdIGFuZCBCTUNSIHJlZ2lzdGVyIHdyaXRlcyAqLworCVJUTF9XOCAoQ2ZnOTM0NiwgQ2ZnOTM0Nl9Mb2NrKTsKKworCS8qIGluaXQgUnggcmluZyBidWZmZXIgRE1BIGFkZHJlc3MgKi8KKwlSVExfVzMyX0YgKFJ4QnVmLCB0cC0+cnhfcmluZ19kbWEpOworCisJLyogaW5pdCBUeCBidWZmZXIgRE1BIGFkZHJlc3NlcyAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfREVTQzsgaSsrKQorCQlSVExfVzMyX0YgKFR4QWRkcjAgKyAoaSAqIDQpLCB0cC0+dHhfYnVmc19kbWEgKyAodHAtPnR4X2J1ZltpXSAtIHRwLT50eF9idWZzKSk7CisKKwlSVExfVzMyIChSeE1pc3NlZCwgMCk7CisKKwlydGw4MTM5X3NldF9yeF9tb2RlIChkZXYpOworCisJLyogbm8gZWFybHktcnggaW50ZXJydXB0cyAqLworCVJUTF9XMTYgKE11bHRpSW50ciwgUlRMX1IxNiAoTXVsdGlJbnRyKSAmIE11bHRpSW50ckNsZWFyKTsKKworCS8qIG1ha2Ugc3VyZSBSeFR4IGhhcyBzdGFydGVkICovCisJdG1wID0gUlRMX1I4IChDaGlwQ21kKTsKKwlpZiAoKCEodG1wICYgQ21kUnhFbmIpKSB8fCAoISh0bXAgJiBDbWRUeEVuYikpKQorCQlSVExfVzggKENoaXBDbWQsIENtZFJ4RW5iIHwgQ21kVHhFbmIpOworCisJLyogRW5hYmxlIGFsbCBrbm93biBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCVJUTF9XMTYgKEludHJNYXNrLCBydGw4MTM5X2ludHJfbWFzayk7Cit9CisKKworLyogSW5pdGlhbGl6ZSB0aGUgUnggYW5kIFR4IHJpbmdzLCBhbG9uZyB3aXRoIHZhcmlvdXMgJ2RldicgYml0cy4gKi8KK3N0YXRpYyB2b2lkIHJ0bDgxMzlfaW5pdF9yaW5nIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCXRwLT5jdXJfcnggPSAwOworCXRwLT5jdXJfdHggPSAwOworCXRwLT5kaXJ0eV90eCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKykKKwkJdHAtPnR4X2J1ZltpXSA9ICZ0cC0+dHhfYnVmc1tpICogVFhfQlVGX1NJWkVdOworfQorCisKKy8qIFRoaXMgbXVzdCBiZSBnbG9iYWwgZm9yIENPTkZJR184MTM5VE9PX1RVTkVfVFdJU1RFUiBjYXNlICovCitzdGF0aWMgaW50IG5leHRfdGljayA9IDMgKiBIWjsKKworI2lmbmRlZiBDT05GSUdfODEzOVRPT19UVU5FX1RXSVNURVIKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGw4MTM5X3R1bmVfdHdpc3RlciAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKnRwKSB7fQorI2Vsc2UKK2VudW0gVHdpc3RlclBhcmFtVmFscyB7CisJUEFSQTc4X2RlZmF1bHQJPSAweDc4ZmE4Mzg4LAorCVBBUkE3Y19kZWZhdWx0CT0gMHhjYjM4ZGU0MywJLyogcGFyYW1bMF1bM10gKi8KKwlQQVJBN2NfeHh4CT0gMHhjYjM4ZGU0MywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHBhcmFtWzRdWzRdID0geworCXsweGNiMzlkZTQzLCAweGNiMzljZTQzLCAweGZiMzhkZTAzLCAweGNiMzhkZTQzfSwKKwl7MHhjYjM5ZGU0MywgMHhjYjM5Y2U0MywgMHhjYjM5Y2U4MywgMHhjYjM5Y2U4M30sCisJezB4Y2IzOWRlNDMsIDB4Y2IzOWNlNDMsIDB4Y2IzOWNlODMsIDB4Y2IzOWNlODN9LAorCXsweGJiMzlkZTQzLCAweGJiMzljZTQzLCAweGJiMzljZTgzLCAweGJiMzljZTgzfQorfTsKKworc3RhdGljIHZvaWQgcnRsODEzOV90dW5lX3R3aXN0ZXIgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCkKK3sKKwlpbnQgbGlua2Nhc2U7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKworCS8qIFRoaXMgaXMgYSBjb21wbGljYXRlZCBzdGF0ZSBtYWNoaW5lIHRvIGNvbmZpZ3VyZSB0aGUgInR3aXN0ZXIiIGZvcgorCSAgIGltcGVkYW5jZS9lY2hvcyBiYXNlZCBvbiB0aGUgY2FibGUgbGVuZ3RoLgorCSAgIEFsbCBvZiB0aGlzIGlzIG1hZ2ljIGFuZCB1bmRvY3VtZW50ZWQuCisJICovCisJc3dpdGNoICh0cC0+dHdpc3RpZSkgeworCWNhc2UgMToKKwkJaWYgKFJUTF9SMTYgKENTQ1IpICYgQ1NDUl9MaW5rT0tCaXQpIHsKKwkJCS8qIFdlIGhhdmUgbGluayBiZWF0LCBsZXQgdXMgdHVuZSB0aGUgdHdpc3Rlci4gKi8KKwkJCVJUTF9XMTYgKENTQ1IsIENTQ1JfTGlua0Rvd25PZmZDbWQpOworCQkJdHAtPnR3aXN0aWUgPSAyOwkvKiBDaGFuZ2UgdG8gc3RhdGUgMi4gKi8KKwkJCW5leHRfdGljayA9IEhaIC8gMTA7CisJCX0gZWxzZSB7CisJCQkvKiBKdXN0IHB1dCBpbiBzb21lIHJlYXNvbmFibGUgZGVmYXVsdHMgZm9yIHdoZW4gYmVhdCByZXR1cm5zLiAqLworCQkJUlRMX1cxNiAoQ1NDUiwgQ1NDUl9MaW5rRG93bkNtZCk7CisJCQlSVExfVzMyIChGSUZPVE1TLCAweDIwKTsJLyogVHVybiBvbiBjYWJsZSB0ZXN0IG1vZGUuICovCisJCQlSVExfVzMyIChQQVJBNzgsIFBBUkE3OF9kZWZhdWx0KTsKKwkJCVJUTF9XMzIgKFBBUkE3YywgUEFSQTdjX2RlZmF1bHQpOworCQkJdHAtPnR3aXN0aWUgPSAwOwkvKiBCYWlsIGZyb20gZnV0dXJlIGFjdGlvbnMuICovCisJCX0KKwkJYnJlYWs7CisJY2FzZSAyOgorCQkvKiBSZWFkIGhvdyBsb25nIGl0IHRvb2sgdG8gaGVhciB0aGUgZWNoby4gKi8KKwkJbGlua2Nhc2UgPSBSVExfUjE2IChDU0NSKSAmIENTQ1JfTGlua1N0YXR1c0JpdHM7CisJCWlmIChsaW5rY2FzZSA9PSAweDcwMDApCisJCQl0cC0+dHdpc3Rfcm93ID0gMzsKKwkJZWxzZSBpZiAobGlua2Nhc2UgPT0gMHgzMDAwKQorCQkJdHAtPnR3aXN0X3JvdyA9IDI7CisJCWVsc2UgaWYgKGxpbmtjYXNlID09IDB4MTAwMCkKKwkJCXRwLT50d2lzdF9yb3cgPSAxOworCQllbHNlCisJCQl0cC0+dHdpc3Rfcm93ID0gMDsKKwkJdHAtPnR3aXN0X2NvbCA9IDA7CisJCXRwLT50d2lzdGllID0gMzsJLyogQ2hhbmdlIHRvIHN0YXRlIDIuICovCisJCW5leHRfdGljayA9IEhaIC8gMTA7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJLyogUHV0IG91dCBmb3VyIHR1bmluZyBwYXJhbWV0ZXJzLCBvbmUgcGVyIDEwMG1zZWMuICovCisJCWlmICh0cC0+dHdpc3RfY29sID09IDApCisJCQlSVExfVzE2IChGSUZPVE1TLCAwKTsKKwkJUlRMX1czMiAoUEFSQTdjLCBwYXJhbVsoaW50KSB0cC0+dHdpc3Rfcm93XQorCQkJIFsoaW50KSB0cC0+dHdpc3RfY29sXSk7CisJCW5leHRfdGljayA9IEhaIC8gMTA7CisJCWlmICgrK3RwLT50d2lzdF9jb2wgPj0gNCkgeworCQkJLyogRm9yIHNob3J0IGNhYmxlcyB3ZSBhcmUgZG9uZS4KKwkJCSAgIEZvciBsb25nIGNhYmxlcyAocm93ID09IDMpIGNoZWNrIGZvciBtaXN0dW5lLiAqLworCQkJdHAtPnR3aXN0aWUgPQorCQkJICAgICh0cC0+dHdpc3Rfcm93ID09IDMpID8gNCA6IDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSA0OgorCQkvKiBTcGVjaWFsIGNhc2UgZm9yIGxvbmcgY2FibGVzOiBjaGVjayBmb3IgbWlzdHVuZS4gKi8KKwkJaWYgKChSVExfUjE2IChDU0NSKSAmCisJCSAgICAgQ1NDUl9MaW5rU3RhdHVzQml0cykgPT0gMHg3MDAwKSB7CisJCQl0cC0+dHdpc3RpZSA9IDA7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCVJUTF9XMzIgKFBBUkE3YywgMHhmYjM4ZGUwMyk7CisJCQl0cC0+dHdpc3RpZSA9IDU7CisJCQluZXh0X3RpY2sgPSBIWiAvIDEwOworCQl9CisJCWJyZWFrOworCWNhc2UgNToKKwkJLyogUmV0dW5lIGZvciBzaG9ydGVyIGNhYmxlIChjb2x1bW4gMikuICovCisJCVJUTF9XMzIgKEZJRk9UTVMsIDB4MjApOworCQlSVExfVzMyIChQQVJBNzgsIFBBUkE3OF9kZWZhdWx0KTsKKwkJUlRMX1czMiAoUEFSQTdjLCBQQVJBN2NfZGVmYXVsdCk7CisJCVJUTF9XMzIgKEZJRk9UTVMsIDB4MDApOworCQl0cC0+dHdpc3Rfcm93ID0gMjsKKwkJdHAtPnR3aXN0X2NvbCA9IDA7CisJCXRwLT50d2lzdGllID0gMzsKKwkJbmV4dF90aWNrID0gSFogLyAxMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBkbyBub3RoaW5nICovCisJCWJyZWFrOworCX0KK30KKyNlbmRpZiAvKiBDT05GSUdfODEzOVRPT19UVU5FX1RXSVNURVIgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHJ0bDgxMzlfdGhyZWFkX2l0ZXIgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKnRwLAorCQkJCSB2b2lkICppb2FkZHIpCit7CisJaW50IG1paV9scGE7CisKKwltaWlfbHBhID0gbWRpb19yZWFkIChkZXYsIHRwLT5waHlzWzBdLCBNSUlfTFBBKTsKKworCWlmICghdHAtPm1paS5mb3JjZV9tZWRpYSAmJiBtaWlfbHBhICE9IDB4ZmZmZikgeworCQlpbnQgZHVwbGV4ID0gKG1paV9scGEgJiBMUEFfMTAwRlVMTCkKKwkJICAgIHx8IChtaWlfbHBhICYgMHgwMUMwKSA9PSAweDAwNDA7CisJCWlmICh0cC0+bWlpLmZ1bGxfZHVwbGV4ICE9IGR1cGxleCkgeworCQkJdHAtPm1paS5mdWxsX2R1cGxleCA9IGR1cGxleDsKKworCQkJaWYgKG1paV9scGEpIHsKKwkJCQlwcmludGsgKEtFUk5fSU5GTworCQkJCQkiJXM6IFNldHRpbmcgJXMtZHVwbGV4IGJhc2VkIG9uIE1JSSAjJWQgbGluayIKKwkJCQkJIiBwYXJ0bmVyIGFiaWxpdHkgb2YgJTQuNHguXG4iLAorCQkJCQlkZXYtPm5hbWUsCisJCQkJCXRwLT5taWkuZnVsbF9kdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIsCisJCQkJCXRwLT5waHlzWzBdLCBtaWlfbHBhKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyIlczogbWVkaWEgaXMgdW5jb25uZWN0ZWQsIGxpbmsgZG93biwgb3IgaW5jb21wYXRpYmxlIGNvbm5lY3Rpb25cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQl9CisjaWYgMAorCQkJUlRMX1c4IChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisJCQlSVExfVzggKENvbmZpZzEsIHRwLT5taWkuZnVsbF9kdXBsZXggPyAweDYwIDogMHgyMCk7CisJCQlSVExfVzggKENmZzkzNDYsIENmZzkzNDZfTG9jayk7CisjZW5kaWYKKwkJfQorCX0KKworCW5leHRfdGljayA9IEhaICogNjA7CisKKwlydGw4MTM5X3R1bmVfdHdpc3RlciAoZGV2LCB0cCk7CisKKwlEUFJJTlRLICgiJXM6IE1lZGlhIHNlbGVjdGlvbiB0aWNrLCBMaW5rIHBhcnRuZXIgJTQuNHguXG4iLAorCQkgZGV2LT5uYW1lLCBSVExfUjE2IChOV2F5TFBBUikpOworCURQUklOVEsgKCIlczogIE90aGVyIHJlZ2lzdGVycyBhcmUgSW50TWFzayAlNC40eCBJbnRTdGF0dXMgJTQuNHhcbiIsCisJCSBkZXYtPm5hbWUsIFJUTF9SMTYgKEludHJNYXNrKSwgUlRMX1IxNiAoSW50clN0YXR1cykpOworCURQUklOVEsgKCIlczogIENoaXAgY29uZmlnICUyLjJ4ICUyLjJ4LlxuIiwKKwkJIGRldi0+bmFtZSwgUlRMX1I4IChDb25maWcwKSwKKwkJIFJUTF9SOCAoQ29uZmlnMSkpOworfQorCitzdGF0aWMgaW50IHJ0bDgxMzlfdGhyZWFkICh2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlkYWVtb25pemUoIiVzIiwgZGV2LT5uYW1lKTsKKwlhbGxvd19zaWduYWwoU0lHVEVSTSk7CisKKwl3aGlsZSAoMSkgeworCQl0aW1lb3V0ID0gbmV4dF90aWNrOworCQlkbyB7CisJCQl0aW1lb3V0ID0gaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0ICgmdHAtPnRocl93YWl0LCB0aW1lb3V0KTsKKwkJCS8qIG1ha2Ugc3dzdXNwIGhhcHB5IHdpdGggb3VyIHRocmVhZCAqLworCQkJdHJ5X3RvX2ZyZWV6ZShQRl9GUkVFWkUpOworCQl9IHdoaWxlICghc2lnbmFsX3BlbmRpbmcgKGN1cnJlbnQpICYmICh0aW1lb3V0ID4gMCkpOworCisJCWlmIChzaWduYWxfcGVuZGluZyAoY3VycmVudCkpIHsKKwkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CisJCX0KKworCQlpZiAodHAtPnRpbWVfdG9fZGllKQorCQkJYnJlYWs7CisKKwkJaWYgKHJ0bmxfbG9ja19pbnRlcnJ1cHRpYmxlICgpKQorCQkJYnJlYWs7CisJCXJ0bDgxMzlfdGhyZWFkX2l0ZXIgKGRldiwgdHAsIHRwLT5tbWlvX2FkZHIpOworCQlydG5sX3VubG9jayAoKTsKKwl9CisKKwljb21wbGV0ZV9hbmRfZXhpdCAoJnRwLT50aHJfZXhpdGVkLCAwKTsKK30KKworc3RhdGljIHZvaWQgcnRsODEzOV9zdGFydF90aHJlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwl0cC0+dGhyX3BpZCA9IC0xOworCXRwLT50d2lzdGllID0gMDsKKwl0cC0+dGltZV90b19kaWUgPSAwOworCWlmICh0cC0+Y2hpcHNldCA9PSBDSF84MTM5X0spCisJCXRwLT50d2lzdGllID0gMTsKKwllbHNlIGlmICh0cC0+ZHJ2X2ZsYWdzICYgSEFTX0xOS19DSE5HKQorCQlyZXR1cm47CisKKwl0cC0+dGhyX3BpZCA9IGtlcm5lbF90aHJlYWQocnRsODEzOV90aHJlYWQsIGRldiwgQ0xPTkVfRlN8Q0xPTkVfRklMRVMpOworCWlmICh0cC0+dGhyX3BpZCA8IDApIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gc3RhcnQga2VybmVsIHRocmVhZFxuIiwKKwkJCWRldi0+bmFtZSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRsODEzOV90eF9jbGVhciAoc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHApCit7CisJdHAtPmN1cl90eCA9IDA7CisJdHAtPmRpcnR5X3R4ID0gMDsKKworCS8qIFhYWCBhY2NvdW50IGZvciB1bnNlbnQgVHggcGFja2V0cyBpbiB0cC0+c3RhdHMudHhfZHJvcHBlZCAqLworfQorCisKK3N0YXRpYyB2b2lkIHJ0bDgxMzlfdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwlpbnQgaTsKKwl1OCB0bXA4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcmludGsgKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdCB0aW1lb3V0LCBzdGF0dXMgJTIuMnggJTQuNHggJTQuNHggIgorCQkibWVkaWEgJTIuMnguXG4iLCBkZXYtPm5hbWUsIFJUTF9SOCAoQ2hpcENtZCksCisJCVJUTF9SMTYoSW50clN0YXR1cyksIFJUTF9SMTYoSW50ck1hc2spLCBSVExfUjgoTWVkaWFTdGF0dXMpKTsKKwkvKiBFbWl0IGluZm8gdG8gZmlndXJlIG91dCB3aGF0IHdlbnQgd3JvbmcuICovCisJcHJpbnRrIChLRVJOX0RFQlVHICIlczogVHggcXVldWUgc3RhcnQgZW50cnkgJWxkICBkaXJ0eSBlbnRyeSAlbGQuXG4iLAorCQlkZXYtPm5hbWUsIHRwLT5jdXJfdHgsIHRwLT5kaXJ0eV90eCk7CisJZm9yIChpID0gMDsgaSA8IE5VTV9UWF9ERVNDOyBpKyspCisJCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6ICBUeCBkZXNjcmlwdG9yICVkIGlzICU4LjhseC4lc1xuIiwKKwkJCWRldi0+bmFtZSwgaSwgUlRMX1IzMiAoVHhTdGF0dXMwICsgKGkgKiA0KSksCisJCQlpID09IHRwLT5kaXJ0eV90eCAlIE5VTV9UWF9ERVNDID8KKwkJCQkiIChxdWV1ZSBoZWFkKSIgOiAiIik7CisKKwl0cC0+eHN0YXRzLnR4X3RpbWVvdXRzKys7CisKKwkvKiBkaXNhYmxlIFR4IEFTQVAsIGlmIG5vdCBhbHJlYWR5ICovCisJdG1wOCA9IFJUTF9SOCAoQ2hpcENtZCk7CisJaWYgKHRtcDggJiBDbWRUeEVuYikKKwkJUlRMX1c4IChDaGlwQ21kLCBDbWRSeEVuYik7CisKKwlzcGluX2xvY2soJnRwLT5yeF9sb2NrKTsKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYnkgY2xlYXJpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCVJUTF9XMTYgKEludHJNYXNrLCAweDAwMDApOworCisJLyogU3RvcCBhIHNoYXJlZCBpbnRlcnJ1cHQgZnJvbSBzY2F2ZW5naW5nIHdoaWxlIHdlIGFyZS4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSAoJnRwLT5sb2NrLCBmbGFncyk7CisJcnRsODEzOV90eF9jbGVhciAodHApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJLyogLi4uYW5kIGZpbmFsbHksIHJlc2V0IGV2ZXJ5dGhpbmcgKi8KKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXJ0bDgxMzlfaHdfc3RhcnQgKGRldik7CisJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJfQorCXNwaW5fdW5sb2NrKCZ0cC0+cnhfbG9jayk7Cit9CisKKworc3RhdGljIGludCBydGw4MTM5X3N0YXJ0X3htaXQgKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdW5zaWduZWQgaW50IGVudHJ5OworCXVuc2lnbmVkIGludCBsZW4gPSBza2ItPmxlbjsKKworCS8qIENhbGN1bGF0ZSB0aGUgbmV4dCBUeCBkZXNjcmlwdG9yIGVudHJ5LiAqLworCWVudHJ5ID0gdHAtPmN1cl90eCAlIE5VTV9UWF9ERVNDOworCisJLyogTm90ZTogdGhlIGNoaXAgZG9lc24ndCBoYXZlIGF1dG8tcGFkISAqLworCWlmIChsaWtlbHkobGVuIDwgVFhfQlVGX1NJWkUpKSB7CisJCWlmIChsZW4gPCBFVEhfWkxFTikKKwkJCW1lbXNldCh0cC0+dHhfYnVmW2VudHJ5XSwgMCwgRVRIX1pMRU4pOworCQlza2JfY29weV9hbmRfY3N1bV9kZXYoc2tiLCB0cC0+dHhfYnVmW2VudHJ5XSk7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9IGVsc2UgeworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXRwLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCXJldHVybiAwOworCX0KKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlSVExfVzMyX0YgKFR4U3RhdHVzMCArIChlbnRyeSAqIHNpemVvZiAodTMyKSksCisJCSAgIHRwLT50eF9mbGFnIHwgbWF4KGxlbiwgKHVuc2lnbmVkIGludClFVEhfWkxFTikpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwl0cC0+Y3VyX3R4Kys7CisJd21iKCk7CisKKwlpZiAoKHRwLT5jdXJfdHggLSBOVU1fVFhfREVTQykgPT0gdHAtPmRpcnR5X3R4KQorCQluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCisJaWYgKG5ldGlmX21zZ190eF9xdWV1ZWQodHApKQorCQlwcmludGsgKEtFUk5fREVCVUcgIiVzOiBRdWV1ZWQgVHggcGFja2V0IHNpemUgJXUgdG8gc2xvdCAlZC5cbiIsCisJCQlkZXYtPm5hbWUsIGxlbiwgZW50cnkpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgcnRsODEzOV90eF9pbnRlcnJ1cHQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCwKKwkJCQkgIHZvaWQgKmlvYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGRpcnR5X3R4LCB0eF9sZWZ0OworCisJYXNzZXJ0IChkZXYgIT0gTlVMTCk7CisJYXNzZXJ0IChpb2FkZHIgIT0gTlVMTCk7CisKKwlkaXJ0eV90eCA9IHRwLT5kaXJ0eV90eDsKKwl0eF9sZWZ0ID0gdHAtPmN1cl90eCAtIGRpcnR5X3R4OworCXdoaWxlICh0eF9sZWZ0ID4gMCkgeworCQlpbnQgZW50cnkgPSBkaXJ0eV90eCAlIE5VTV9UWF9ERVNDOworCQlpbnQgdHhzdGF0dXM7CisKKwkJdHhzdGF0dXMgPSBSVExfUjMyIChUeFN0YXR1czAgKyAoZW50cnkgKiBzaXplb2YgKHUzMikpKTsKKworCQlpZiAoISh0eHN0YXR1cyAmIChUeFN0YXRPSyB8IFR4VW5kZXJydW4gfCBUeEFib3J0ZWQpKSkKKwkJCWJyZWFrOwkvKiBJdCBzdGlsbCBoYXNuJ3QgYmVlbiBUeGVkICovCisKKwkJLyogTm90ZTogVHhDYXJyaWVyTG9zdCBpcyBhbHdheXMgYXNzZXJ0ZWQgYXQgMTAwbWJwcy4gKi8KKwkJaWYgKHR4c3RhdHVzICYgKFR4T3V0T2ZXaW5kb3cgfCBUeEFib3J0ZWQpKSB7CisJCQkvKiBUaGVyZSB3YXMgYW4gbWFqb3IgZXJyb3IsIGxvZyBpdC4gKi8KKwkJCWlmIChuZXRpZl9tc2dfdHhfZXJyKHRwKSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRyYW5zbWl0IGVycm9yLCBUeCBzdGF0dXMgJTguOHguXG4iLAorCQkJCQlkZXYtPm5hbWUsIHR4c3RhdHVzKTsKKwkJCXRwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmICh0eHN0YXR1cyAmIFR4QWJvcnRlZCkgeworCQkJCXRwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJCVJUTF9XMzIgKFR4Q29uZmlnLCBUeENsZWFyQWJ0KTsKKwkJCQlSVExfVzE2IChJbnRyU3RhdHVzLCBUeEVycik7CisJCQkJd21iKCk7CisJCQl9CisJCQlpZiAodHhzdGF0dXMgJiBUeENhcnJpZXJMb3N0KQorCQkJCXRwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJaWYgKHR4c3RhdHVzICYgVHhPdXRPZldpbmRvdykKKwkJCQl0cC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJaWYgKHR4c3RhdHVzICYgVHhVbmRlcnJ1bikgeworCQkJCS8qIEFkZCA2NCB0byB0aGUgVHggRklGTyB0aHJlc2hvbGQuICovCisJCQkJaWYgKHRwLT50eF9mbGFnIDwgMHgwMDMwMDAwMCkKKwkJCQkJdHAtPnR4X2ZsYWcgKz0gMHgwMDAyMDAwMDsKKwkJCQl0cC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCX0KKwkJCXRwLT5zdGF0cy5jb2xsaXNpb25zICs9ICh0eHN0YXR1cyA+PiAyNCkgJiAxNTsKKwkJCXRwLT5zdGF0cy50eF9ieXRlcyArPSB0eHN0YXR1cyAmIDB4N2ZmOworCQkJdHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJfQorCisJCWRpcnR5X3R4Kys7CisJCXR4X2xlZnQtLTsKKwl9CisKKyNpZm5kZWYgUlRMODEzOV9OREVCVUcKKwlpZiAodHAtPmN1cl90eCAtIGRpcnR5X3R4ID4gTlVNX1RYX0RFU0MpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IE91dC1vZi1zeW5jIGRpcnR5IHBvaW50ZXIsICVsZCB2cy4gJWxkLlxuIiwKKwkJICAgICAgICBkZXYtPm5hbWUsIGRpcnR5X3R4LCB0cC0+Y3VyX3R4KTsKKwkJZGlydHlfdHggKz0gTlVNX1RYX0RFU0M7CisJfQorI2VuZGlmIC8qIFJUTDgxMzlfTkRFQlVHICovCisKKwkvKiBvbmx5IHdha2UgdGhlIHF1ZXVlIGlmIHdlIGRpZCB3b3JrLCBhbmQgdGhlIHF1ZXVlIGlzIHN0b3BwZWQgKi8KKwlpZiAodHAtPmRpcnR5X3R4ICE9IGRpcnR5X3R4KSB7CisJCXRwLT5kaXJ0eV90eCA9IGRpcnR5X3R4OworCQltYigpOworCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCX0KK30KKworCisvKiBUT0RPOiBjbGVhbiB0aGlzIHVwISAgUnggcmVzZXQgbmVlZCBub3QgYmUgdGhpcyBpbnRlbnNpdmUgKi8KK3N0YXRpYyB2b2lkIHJ0bDgxMzlfcnhfZXJyICh1MzIgcnhfc3RhdHVzLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKnRwLCB2b2lkICppb2FkZHIpCit7CisJdTggdG1wODsKKyNpZmRlZiBDT05GSUdfODEzOV9PTERfUlhfUkVTRVQKKwlpbnQgdG1wX3dvcms7CisjZW5kaWYKKworCWlmIChuZXRpZl9tc2dfcnhfZXJyICh0cCkpIAorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEV0aGVybmV0IGZyYW1lIGhhZCBlcnJvcnMsIHN0YXR1cyAlOC44eC5cbiIsCisJCQlkZXYtPm5hbWUsIHJ4X3N0YXR1cyk7CisJdHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCWlmICghKHJ4X3N0YXR1cyAmIFJ4U3RhdHVzT0spKSB7CisJCWlmIChyeF9zdGF0dXMgJiBSeFRvb0xvbmcpIHsKKwkJCURQUklOVEsgKCIlczogT3ZlcnNpemVkIEV0aGVybmV0IGZyYW1lLCBzdGF0dXMgJTQuNHghXG4iLAorCQkJIAlkZXYtPm5hbWUsIHJ4X3N0YXR1cyk7CisJCQkvKiBBLkMuOiBUaGUgY2hpcCBoYW5ncyBoZXJlLiAqLworCQl9CisJCWlmIChyeF9zdGF0dXMgJiAoUnhCYWRTeW1ib2wgfCBSeEJhZEFsaWduKSkKKwkJCXRwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJaWYgKHJ4X3N0YXR1cyAmIChSeFJ1bnQgfCBSeFRvb0xvbmcpKQorCQkJdHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJaWYgKHJ4X3N0YXR1cyAmIFJ4Q1JDRXJyKQorCQkJdHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwl9IGVsc2UgeworCQl0cC0+eHN0YXRzLnJ4X2xvc3RfaW5fcmluZysrOworCX0KKworI2lmbmRlZiBDT05GSUdfODEzOV9PTERfUlhfUkVTRVQKKwl0bXA4ID0gUlRMX1I4IChDaGlwQ21kKTsKKwlSVExfVzggKENoaXBDbWQsIHRtcDggJiB+Q21kUnhFbmIpOworCVJUTF9XOCAoQ2hpcENtZCwgdG1wOCk7CisJUlRMX1czMiAoUnhDb25maWcsIHRwLT5yeF9jb25maWcpOworCXRwLT5jdXJfcnggPSAwOworI2Vsc2UKKwkvKiBSZXNldCB0aGUgcmVjZWl2ZXIsIGJhc2VkIG9uIFJlYWxUZWsgcmVjb21tZW5kYXRpb24uIChCdWc/KSAqLworCisJLyogZGlzYWJsZSByZWNlaXZlICovCisJUlRMX1c4X0YgKENoaXBDbWQsIENtZFR4RW5iKTsKKwl0bXBfd29yayA9IDIwMDsKKwl3aGlsZSAoLS10bXBfd29yayA+IDApIHsKKwkJdWRlbGF5KDEpOworCQl0bXA4ID0gUlRMX1I4IChDaGlwQ21kKTsKKwkJaWYgKCEodG1wOCAmIENtZFJ4RW5iKSkKKwkJCWJyZWFrOworCX0KKwlpZiAodG1wX3dvcmsgPD0gMCkKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgUEZYICJyeCBzdG9wIHdhaXQgdG9vIGxvbmdcbiIpOworCS8qIHJlc3RhcnQgcmVjZWl2ZSAqLworCXRtcF93b3JrID0gMjAwOworCXdoaWxlICgtLXRtcF93b3JrID4gMCkgeworCQlSVExfVzhfRiAoQ2hpcENtZCwgQ21kUnhFbmIgfCBDbWRUeEVuYik7CisJCXVkZWxheSgxKTsKKwkJdG1wOCA9IFJUTF9SOCAoQ2hpcENtZCk7CisJCWlmICgodG1wOCAmIENtZFJ4RW5iKSAmJiAodG1wOCAmIENtZFR4RW5iKSkKKwkJCWJyZWFrOworCX0KKwlpZiAodG1wX3dvcmsgPD0gMCkKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgUEZYICJ0eC9yeCBlbmFibGUgd2FpdCB0b28gbG9uZ1xuIik7CisKKwkvKiBhbmQgcmVpbml0aWFsaXplIGFsbCByeCByZWxhdGVkIHJlZ2lzdGVycyAqLworCVJUTF9XOF9GIChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisJLyogTXVzdCBlbmFibGUgVHgvUnggYmVmb3JlIHNldHRpbmcgdHJhbnNmZXIgdGhyZXNob2xkcyEgKi8KKwlSVExfVzggKENoaXBDbWQsIENtZFJ4RW5iIHwgQ21kVHhFbmIpOworCisJdHAtPnJ4X2NvbmZpZyA9IHJ0bDgxMzlfcnhfY29uZmlnIHwgQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXlQaHlzOworCVJUTF9XMzIgKFJ4Q29uZmlnLCB0cC0+cnhfY29uZmlnKTsKKwl0cC0+Y3VyX3J4ID0gMDsKKworCURQUklOVEsoImluaXQgYnVmZmVyIGFkZHJlc3Nlc1xuIik7CisKKwkvKiBMb2NrIENvbmZpZ1swMTIzNF0gYW5kIEJNQ1IgcmVnaXN0ZXIgd3JpdGVzICovCisJUlRMX1c4IChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOworCisJLyogaW5pdCBSeCByaW5nIGJ1ZmZlciBETUEgYWRkcmVzcyAqLworCVJUTF9XMzJfRiAoUnhCdWYsIHRwLT5yeF9yaW5nX2RtYSk7CisKKwkvKiBBLkMuOiBSZXNldCB0aGUgbXVsdGljYXN0IGxpc3QuICovCisJX19zZXRfcnhfbW9kZSAoZGV2KTsKKyNlbmRpZgorfQorCisjaWYgUlhfQlVGX0lEWCA9PSAzCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHdyYXBfY29weShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCB1bnNpZ25lZCBjaGFyICpyaW5nLAorCQkJCSB1MzIgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwl1MzIgbGVmdCA9IFJYX0JVRl9MRU4gLSBvZmZzZXQ7CisKKwlpZiAoc2l6ZSA+IGxlZnQpIHsKKwkJbWVtY3B5KHNrYi0+ZGF0YSwgcmluZyArIG9mZnNldCwgbGVmdCk7CisJCW1lbWNweShza2ItPmRhdGErbGVmdCwgcmluZywgc2l6ZSAtIGxlZnQpOworCX0gZWxzZQorCQltZW1jcHkoc2tiLT5kYXRhLCByaW5nICsgb2Zmc2V0LCBzaXplKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBydGw4MTM5X2lzcl9hY2soc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHApCit7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1MTYgc3RhdHVzOworCisJc3RhdHVzID0gUlRMX1IxNiAoSW50clN0YXR1cykgJiBSeEFja0JpdHM7CisKKwkvKiBDbGVhciBvdXQgZXJyb3JzIGFuZCByZWNlaXZlIGludGVycnVwdHMgKi8KKwlpZiAobGlrZWx5KHN0YXR1cyAhPSAwKSkgeworCQlpZiAodW5saWtlbHkoc3RhdHVzICYgKFJ4RklGT092ZXIgfCBSeE92ZXJmbG93KSkpIHsKKwkJCXRwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBSeEZJRk9PdmVyKQorCQkJCXRwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQl9CisJCVJUTF9XMTZfRiAoSW50clN0YXR1cywgUnhBY2tCaXRzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcnRsODEzOV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCwKKwkJICAgICAgaW50IGJ1ZGdldCkKK3sKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCWludCByZWNlaXZlZCA9IDA7CisJdW5zaWduZWQgY2hhciAqcnhfcmluZyA9IHRwLT5yeF9yaW5nOworCXVuc2lnbmVkIGludCBjdXJfcnggPSB0cC0+Y3VyX3J4OworCXVuc2lnbmVkIGludCByeF9zaXplID0gMDsKKworCURQUklOVEsgKCIlczogSW4gcnRsODEzOV9yeCgpLCBjdXJyZW50ICU0LjR4IEJ1ZkFkZHIgJTQuNHgsIgorCQkgIiBmcmVlIHRvICU0LjR4LCBDbWQgJTIuMnguXG4iLCBkZXYtPm5hbWUsICh1MTYpY3VyX3J4LAorCQkgUlRMX1IxNiAoUnhCdWZBZGRyKSwKKwkJIFJUTF9SMTYgKFJ4QnVmUHRyKSwgUlRMX1I4IChDaGlwQ21kKSk7CisKKwl3aGlsZSAobmV0aWZfcnVubmluZyhkZXYpICYmIHJlY2VpdmVkIDwgYnVkZ2V0IAorCSAgICAgICAmJiAoUlRMX1I4IChDaGlwQ21kKSAmIFJ4QnVmRW1wdHkpID09IDApIHsKKwkJdTMyIHJpbmdfb2Zmc2V0ID0gY3VyX3J4ICUgUlhfQlVGX0xFTjsKKwkJdTMyIHJ4X3N0YXR1czsKKwkJdW5zaWduZWQgaW50IHBrdF9zaXplOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCXJtYigpOworCisJCS8qIHJlYWQgc2l6ZStzdGF0dXMgb2YgbmV4dCBmcmFtZSBmcm9tIERNQSByaW5nIGJ1ZmZlciAqLworCQlyeF9zdGF0dXMgPSBsZTMyX3RvX2NwdSAoKih1MzIgKikgKHJ4X3JpbmcgKyByaW5nX29mZnNldCkpOworCQlyeF9zaXplID0gcnhfc3RhdHVzID4+IDE2OworCQlwa3Rfc2l6ZSA9IHJ4X3NpemUgLSA0OworCisJCWlmIChuZXRpZl9tc2dfcnhfc3RhdHVzKHRwKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogIHJ0bDgxMzlfcngoKSBzdGF0dXMgJTQuNHgsIHNpemUgJTQuNHgsIgorCQkJCSIgY3VyICU0LjR4LlxuIiwgZGV2LT5uYW1lLCByeF9zdGF0dXMsCisJCQkgcnhfc2l6ZSwgY3VyX3J4KTsKKyNpZiBSVEw4MTM5X0RFQlVHID4gMgorCQl7CisJCQlpbnQgaTsKKwkJCURQUklOVEsgKCIlczogRnJhbWUgY29udGVudHMgIiwgZGV2LT5uYW1lKTsKKwkJCWZvciAoaSA9IDA7IGkgPCA3MDsgaSsrKQorCQkJCXByaW50ayAoIiAlMi4yeCIsCisJCQkJCXJ4X3JpbmdbcmluZ19vZmZzZXQgKyBpXSk7CisJCQlwcmludGsgKCIuXG4iKTsKKwkJfQorI2VuZGlmCisKKwkJLyogUGFja2V0IGNvcHkgZnJvbSBGSUZPIHN0aWxsIGluIHByb2dyZXNzLgorCQkgKiBUaGVvcmV0aWNhbGx5LCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJICogc2luY2UgRWFybHlSeCBpcyBkaXNhYmxlZC4KKwkJICovCisJCWlmICh1bmxpa2VseShyeF9zaXplID09IDB4ZmZmMCkpIHsKKwkJCWlmICghdHAtPmZpZm9fY29weV90aW1lb3V0KQorCQkJCXRwLT5maWZvX2NvcHlfdGltZW91dCA9IGppZmZpZXMgKyAyOworCQkJZWxzZSBpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0cC0+Zmlmb19jb3B5X3RpbWVvdXQpKSB7CisJCQkJRFBSSU5USyAoIiVzOiBodW5nIEZJRk8uIFJlc2V0LiIsIGRldi0+bmFtZSk7CisJCQkJcnhfc2l6ZSA9IDA7CisJCQkJZ290byBub19lYXJseV9yeDsKKwkJCX0KKwkJCWlmIChuZXRpZl9tc2dfaW50cih0cCkpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGZpZm8gY29weSBpbiBwcm9ncmVzcy4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJfQorCQkJdHAtPnhzdGF0cy5lYXJseV9yeCsrOworCQkJYnJlYWs7CisJCX0KKworbm9fZWFybHlfcng6CisJCXRwLT5maWZvX2NvcHlfdGltZW91dCA9IDA7CisKKwkJLyogSWYgUnggZXJyIG9yIGludmFsaWQgcnhfc2l6ZS9yeF9zdGF0dXMgcmVjZWl2ZWQKKwkJICogKHdoaWNoIGhhcHBlbnMgaWYgd2UgZ2V0IGxvc3QgaW4gdGhlIHJpbmcpLAorCQkgKiBSeCBwcm9jZXNzIGdldHMgcmVzZXQsIHNvIHdlIGFib3J0IGFueSBmdXJ0aGVyCisJCSAqIFJ4IHByb2Nlc3NpbmcuCisJCSAqLworCQlpZiAodW5saWtlbHkoKHJ4X3NpemUgPiAoTUFYX0VUSF9GUkFNRV9TSVpFKzQpKSB8fAorCQkJICAgICAocnhfc2l6ZSA8IDgpIHx8CisJCQkgICAgICghKHJ4X3N0YXR1cyAmIFJ4U3RhdHVzT0spKSkpIHsKKwkJCXJ0bDgxMzlfcnhfZXJyIChyeF9zdGF0dXMsIGRldiwgdHAsIGlvYWRkcik7CisJCQlyZWNlaXZlZCA9IC0xOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlciwgY29tcGF0aWJsZSB3aXRoIG5ldC0yZS4gKi8KKwkJLyogT21pdCB0aGUgZm91ciBvY3RldCBDUkMgZnJvbSB0aGUgbGVuZ3RoLiAqLworCisJCXNrYiA9IGRldl9hbGxvY19za2IgKHBrdF9zaXplICsgMik7CisJCWlmIChsaWtlbHkoc2tiKSkgeworCQkJc2tiLT5kZXYgPSBkZXY7CisJCQlza2JfcmVzZXJ2ZSAoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgZmllbGRzLiAqLworI2lmIFJYX0JVRl9JRFggPT0gMworCQkJd3JhcF9jb3B5KHNrYiwgcnhfcmluZywgcmluZ19vZmZzZXQrNCwgcGt0X3NpemUpOworI2Vsc2UKKwkJCWV0aF9jb3B5X2FuZF9zdW0gKHNrYiwgJnJ4X3JpbmdbcmluZ19vZmZzZXQgKyA0XSwgcGt0X3NpemUsIDApOworI2VuZGlmCisJCQlza2JfcHV0IChza2IsIHBrdF9zaXplKTsKKworCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zIChza2IsIGRldik7CisKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQl0cC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X3NpemU7CisJCQl0cC0+c3RhdHMucnhfcGFja2V0cysrOworCisJCQluZXRpZl9yZWNlaXZlX3NrYiAoc2tiKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIAorCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HCisJCQkJCSIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsCisJCQkJCWRldi0+bmFtZSk7CisJCQl0cC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQl9CisJCXJlY2VpdmVkKys7CisKKwkJY3VyX3J4ID0gKGN1cl9yeCArIHJ4X3NpemUgKyA0ICsgMykgJiB+MzsKKwkJUlRMX1cxNiAoUnhCdWZQdHIsICh1MTYpIChjdXJfcnggLSAxNikpOworCisJCXJ0bDgxMzlfaXNyX2Fjayh0cCk7CisJfQorCisJaWYgKHVubGlrZWx5KCFyZWNlaXZlZCB8fCByeF9zaXplID09IDB4ZmZmMCkpCisJCXJ0bDgxMzlfaXNyX2Fjayh0cCk7CisKKyNpZiBSVEw4MTM5X0RFQlVHID4gMQorCURQUklOVEsgKCIlczogRG9uZSBydGw4MTM5X3J4KCksIGN1cnJlbnQgJTQuNHggQnVmQWRkciAlNC40eCwiCisJCSAiIGZyZWUgdG8gJTQuNHgsIENtZCAlMi4yeC5cbiIsIGRldi0+bmFtZSwgY3VyX3J4LAorCQkgUlRMX1IxNiAoUnhCdWZBZGRyKSwKKwkJIFJUTF9SMTYgKFJ4QnVmUHRyKSwgUlRMX1I4IChDaGlwQ21kKSk7CisjZW5kaWYKKworCXRwLT5jdXJfcnggPSBjdXJfcng7CisKKwkvKgorCSAqIFRoZSByZWNlaXZlIGJ1ZmZlciBzaG91bGQgYmUgbW9zdGx5IGVtcHR5LgorCSAqIFRlbGwgTkFQSSB0byByZWVuYWJsZSB0aGUgUnggaXJxLgorCSAqLworCWlmICh0cC0+Zmlmb19jb3B5X3RpbWVvdXQpCisJCXJlY2VpdmVkID0gYnVkZ2V0OworCitvdXQ6CisJcmV0dXJuIHJlY2VpdmVkOworfQorCisKK3N0YXRpYyB2b2lkIHJ0bDgxMzlfd2VpcmRfaW50ZXJydXB0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHAsCisJCQkJICAgICB2b2lkICppb2FkZHIsCisJCQkJICAgICBpbnQgc3RhdHVzLCBpbnQgbGlua19jaGFuZ2VkKQoreworCURQUklOVEsgKCIlczogQWJub3JtYWwgaW50ZXJydXB0LCBzdGF0dXMgJTguOHguXG4iLAorCQkgZGV2LT5uYW1lLCBzdGF0dXMpOworCisJYXNzZXJ0IChkZXYgIT0gTlVMTCk7CisJYXNzZXJ0ICh0cCAhPSBOVUxMKTsKKwlhc3NlcnQgKGlvYWRkciAhPSBOVUxMKTsKKworCS8qIFVwZGF0ZSB0aGUgZXJyb3IgY291bnQuICovCisJdHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gUlRMX1IzMiAoUnhNaXNzZWQpOworCVJUTF9XMzIgKFJ4TWlzc2VkLCAwKTsKKworCWlmICgoc3RhdHVzICYgUnhVbmRlcnJ1bikgJiYgbGlua19jaGFuZ2VkICYmCisJICAgICh0cC0+ZHJ2X2ZsYWdzICYgSEFTX0xOS19DSE5HKSkgeworCQlydGxfY2hlY2tfbWVkaWEoZGV2LCAwKTsKKwkJc3RhdHVzICY9IH5SeFVuZGVycnVuOworCX0KKworCWlmIChzdGF0dXMgJiAoUnhVbmRlcnJ1biB8IFJ4RXJyKSkKKwkJdHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCisJaWYgKHN0YXR1cyAmIFBDU1RpbWVvdXQpCisJCXRwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIFJ4VW5kZXJydW4pCisJCXRwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCWlmIChzdGF0dXMgJiBQQ0lFcnIpIHsKKwkJdTE2IHBjaV9jbWRfc3RhdHVzOworCQlwY2lfcmVhZF9jb25maWdfd29yZCAodHAtPnBjaV9kZXYsIFBDSV9TVEFUVVMsICZwY2lfY21kX3N0YXR1cyk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZCAodHAtPnBjaV9kZXYsIFBDSV9TVEFUVVMsIHBjaV9jbWRfc3RhdHVzKTsKKworCQlwcmludGsgKEtFUk5fRVJSICIlczogUENJIEJ1cyBlcnJvciAlNC40eC5cbiIsCisJCQlkZXYtPm5hbWUsIHBjaV9jbWRfc3RhdHVzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcnRsODEzOV9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQoreworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCWludCBvcmlnX2J1ZGdldCA9IG1pbigqYnVkZ2V0LCBkZXYtPnF1b3RhKTsKKwlpbnQgZG9uZSA9IDE7CisKKwlzcGluX2xvY2soJnRwLT5yeF9sb2NrKTsKKwlpZiAobGlrZWx5KFJUTF9SMTYoSW50clN0YXR1cykgJiBSeEFja0JpdHMpKSB7CisJCWludCB3b3JrX2RvbmU7CisKKwkJd29ya19kb25lID0gcnRsODEzOV9yeChkZXYsIHRwLCBvcmlnX2J1ZGdldCk7CisJCWlmIChsaWtlbHkod29ya19kb25lID4gMCkpIHsKKwkJCSpidWRnZXQgLT0gd29ya19kb25lOworCQkJZGV2LT5xdW90YSAtPSB3b3JrX2RvbmU7CisJCQlkb25lID0gKHdvcmtfZG9uZSA8IG9yaWdfYnVkZ2V0KTsKKwkJfQorCX0KKworCWlmIChkb25lKSB7CisJCS8qCisJCSAqIE9yZGVyIGlzIGltcG9ydGFudCBzaW5jZSBkYXRhIGNhbiBnZXQgaW50ZXJydXB0ZWQKKwkJICogYWdhaW4gd2hlbiB3ZSB0aGluayB3ZSBhcmUgZG9uZS4KKwkJICovCisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCVJUTF9XMTZfRihJbnRyTWFzaywgcnRsODEzOV9pbnRyX21hc2spOworCQlfX25ldGlmX3J4X2NvbXBsZXRlKGRldik7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwl9CisJc3Bpbl91bmxvY2soJnRwLT5yeF9sb2NrKTsKKworCXJldHVybiAhZG9uZTsKK30KKworLyogVGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXMgYWxsIG9mIHRoZSBSeCB0aHJlYWQgd29yayBhbmQgY2xlYW5zIHVwCisgICBhZnRlciB0aGUgVHggdGhyZWFkLiAqLworc3RhdGljIGlycXJldHVybl90IHJ0bDgxMzlfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsCisJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdTE2IHN0YXR1cywgYWNrc3RhdDsKKwlpbnQgbGlua19jaGFuZ2VkID0gMDsgLyogYXZvaWQgYm9ndXMgInVuaW5pdCIgd2FybmluZyAqLworCWludCBoYW5kbGVkID0gMDsKKworCXNwaW5fbG9jayAoJnRwLT5sb2NrKTsKKwlzdGF0dXMgPSBSVExfUjE2IChJbnRyU3RhdHVzKTsKKworCS8qIHNoYXJlZCBpcnE/ICovCisJaWYgKHVubGlrZWx5KChzdGF0dXMgJiBydGw4MTM5X2ludHJfbWFzaykgPT0gMCkpIAorCQlnb3RvIG91dDsKKworCWhhbmRsZWQgPSAxOworCisJLyogaC93IG5vIGxvbmdlciBwcmVzZW50IChob3RwbHVnPykgb3IgbWFqb3IgZXJyb3IsIGJhaWwgKi8KKwlpZiAodW5saWtlbHkoc3RhdHVzID09IDB4RkZGRikpIAorCQlnb3RvIG91dDsKKworCS8qIGNsb3NlIHBvc3NpYmxlIHJhY2UncyB3aXRoIGRldl9jbG9zZSAqLworCWlmICh1bmxpa2VseSghbmV0aWZfcnVubmluZyhkZXYpKSkgeworCQlSVExfVzE2IChJbnRyTWFzaywgMCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEFja25vd2xlZGdlIGFsbCBvZiB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc291cmNlcyBBU0FQLCBidXQKKwkgICBhbiBmaXJzdCBnZXQgYW4gYWRkaXRpb25hbCBzdGF0dXMgYml0IGZyb20gQ1NDUi4gKi8KKwlpZiAodW5saWtlbHkoc3RhdHVzICYgUnhVbmRlcnJ1bikpCisJCWxpbmtfY2hhbmdlZCA9IFJUTF9SMTYgKENTQ1IpICYgQ1NDUl9MaW5rQ2hhbmdlQml0OworCisJYWNrc3RhdCA9IHN0YXR1cyAmIH4oUnhBY2tCaXRzIHwgVHhFcnIpOworCWlmIChhY2tzdGF0KQorCQlSVExfVzE2IChJbnRyU3RhdHVzLCBhY2tzdGF0KTsKKworCS8qIFJlY2VpdmUgcGFja2V0cyBhcmUgcHJvY2Vzc2VkIGJ5IHBvbGwgcm91dGluZS4KKwkgICBJZiBub3QgcnVubmluZyBzdGFydCBpdCBub3cuICovCisJaWYgKHN0YXR1cyAmIFJ4QWNrQml0cyl7CisJCWlmIChuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKGRldikpIHsKKwkJCVJUTF9XMTZfRiAoSW50ck1hc2ssIHJ0bDgxMzlfbm9yeF9pbnRyX21hc2spOworCQkJX19uZXRpZl9yeF9zY2hlZHVsZSAoZGV2KTsKKwkJfQorCX0KKworCS8qIENoZWNrIHVuY29tbW9uIGV2ZW50cyB3aXRoIG9uZSB0ZXN0LiAqLworCWlmICh1bmxpa2VseShzdGF0dXMgJiAoUENJRXJyIHwgUENTVGltZW91dCB8IFJ4VW5kZXJydW4gfCBSeEVycikpKQorCQlydGw4MTM5X3dlaXJkX2ludGVycnVwdCAoZGV2LCB0cCwgaW9hZGRyLAorCQkJCQkgc3RhdHVzLCBsaW5rX2NoYW5nZWQpOworCisJaWYgKHN0YXR1cyAmIChUeE9LIHwgVHhFcnIpKSB7CisJCXJ0bDgxMzlfdHhfaW50ZXJydXB0IChkZXYsIHRwLCBpb2FkZHIpOworCQlpZiAoc3RhdHVzICYgVHhFcnIpCisJCQlSVExfVzE2IChJbnRyU3RhdHVzLCBUeEVycik7CisJfQorIG91dDoKKwlzcGluX3VubG9jayAoJnRwLT5sb2NrKTsKKworCURQUklOVEsgKCIlczogZXhpdGluZyBpbnRlcnJ1cHQsIGludHJfc3RhdHVzPSUjNC40eC5cbiIsCisJCSBkZXYtPm5hbWUsIFJUTF9SMTYgKEludHJTdGF0dXMpKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisvKgorICogUG9sbGluZyByZWNlaXZlIC0gdXNlZCBieSBuZXRjb25zb2xlIGFuZCBvdGhlciBkaWFnbm9zdGljIHRvb2xzCisgKiB0byBhbGxvdyBuZXR3b3JrIGkvbyB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyB2b2lkIHJ0bDgxMzlfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCXJ0bDgxMzlfaW50ZXJydXB0KGRldi0+aXJxLCBkZXYsIE5VTEwpOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcnRsODEzOV9jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworCWlmICh0cC0+dGhyX3BpZCA+PSAwKSB7CisJCXRwLT50aW1lX3RvX2RpZSA9IDE7CisJCXdtYigpOworCQlyZXQgPSBraWxsX3Byb2MgKHRwLT50aHJfcGlkLCBTSUdURVJNLCAxKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBzaWduYWwgdGhyZWFkXG4iLCBkZXYtPm5hbWUpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uICgmdHAtPnRocl9leGl0ZWQpOworCX0KKwkKKwlpZiAobmV0aWZfbXNnX2lmZG93bih0cCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQsIHN0YXR1cyB3YXMgMHglNC40eC5cbiIsCisJCQlkZXYtPm5hbWUsIFJUTF9SMTYgKEludHJTdGF0dXMpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmdHAtPmxvY2ssIGZsYWdzKTsKKworCS8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggRE1BIHByb2Nlc3Nlcy4gKi8KKwlSVExfVzggKENoaXBDbWQsIDApOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGJ5IGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlSVExfVzE2IChJbnRyTWFzaywgMCk7CisKKwkvKiBVcGRhdGUgdGhlIGVycm9yIGNvdW50cy4gKi8KKwl0cC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBSVExfUjMyIChSeE1pc3NlZCk7CisJUlRMX1czMiAoUnhNaXNzZWQsIDApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnRwLT5sb2NrLCBmbGFncyk7CisKKwlzeW5jaHJvbml6ZV9pcnEgKGRldi0+aXJxKTsJLyogcmFjeSwgYnV0IHRoYXQncyBvayBoZXJlICovCisJZnJlZV9pcnEgKGRldi0+aXJxLCBkZXYpOworCisJcnRsODEzOV90eF9jbGVhciAodHApOworCisJcGNpX2ZyZWVfY29uc2lzdGVudCh0cC0+cGNpX2RldiwgUlhfQlVGX1RPVF9MRU4sCisJCQkgICAgdHAtPnJ4X3JpbmcsIHRwLT5yeF9yaW5nX2RtYSk7CisJcGNpX2ZyZWVfY29uc2lzdGVudCh0cC0+cGNpX2RldiwgVFhfQlVGX1RPVF9MRU4sCisJCQkgICAgdHAtPnR4X2J1ZnMsIHRwLT50eF9idWZzX2RtYSk7CisJdHAtPnJ4X3JpbmcgPSBOVUxMOworCXRwLT50eF9idWZzID0gTlVMTDsKKworCS8qIEdyZWVuISBQdXQgdGhlIGNoaXAgaW4gbG93LXBvd2VyIG1vZGUuICovCisJUlRMX1c4IChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisKKwlpZiAocnRsX2NoaXBfaW5mb1t0cC0+Y2hpcHNldF0uZmxhZ3MgJiBIYXNIbHRDbGspCisJCVJUTF9XOCAoSGx0Q2xrLCAnSCcpOwkvKiAnUicgd291bGQgbGVhdmUgdGhlIGNsb2NrIHJ1bm5pbmcuICovCisKKwlyZXR1cm4gMDsKK30KKworCisvKiBHZXQgdGhlIGV0aHRvb2wgV2FrZS1vbi1MQU4gc2V0dGluZ3MuICBBc3N1bWVzIHRoYXQgd29sIHBvaW50cyB0bworICAga2VybmVsIG1lbW9yeSwgKndvbCBoYXMgYmVlbiBpbml0aWFsaXplZCBhcyB7RVRIVE9PTF9HV09MfSwgYW5kCisgICBvdGhlciB0aHJlYWRzIG9yIGludGVycnVwdHMgYXJlbid0IG1lc3Npbmcgd2l0aCB0aGUgODEzOS4gICovCitzdGF0aWMgdm9pZCBydGw4MTM5X2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkICppb2FkZHIgPSBucC0+bW1pb19hZGRyOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCWlmIChydGxfY2hpcF9pbmZvW25wLT5jaGlwc2V0XS5mbGFncyAmIEhhc0xXYWtlKSB7CisJCXU4IGNmZzMgPSBSVExfUjggKENvbmZpZzMpOworCQl1OCBjZmc1ID0gUlRMX1I4IChDb25maWc1KTsKKworCQl3b2wtPnN1cHBvcnRlZCA9IFdBS0VfUEhZIHwgV0FLRV9NQUdJQworCQkJfCBXQUtFX1VDQVNUIHwgV0FLRV9NQ0FTVCB8IFdBS0VfQkNBU1Q7CisKKwkJd29sLT53b2xvcHRzID0gMDsKKwkJaWYgKGNmZzMgJiBDZmczX0xpbmtVcCkKKwkJCXdvbC0+d29sb3B0cyB8PSBXQUtFX1BIWTsKKwkJaWYgKGNmZzMgJiBDZmczX01hZ2ljKQorCQkJd29sLT53b2xvcHRzIHw9IFdBS0VfTUFHSUM7CisJCS8qIChLT04pRklYTUU6IFNlZSBob3cgbmV0ZGV2X3NldF93b2woKSBoYW5kbGVzIHRoZQorCQkgICBmb2xsb3dpbmcgY29uc3RhbnRzLiAgKi8KKwkJaWYgKGNmZzUgJiBDZmc1X1VXRikKKwkJCXdvbC0+d29sb3B0cyB8PSBXQUtFX1VDQVNUOworCQlpZiAoY2ZnNSAmIENmZzVfTVdGKQorCQkJd29sLT53b2xvcHRzIHw9IFdBS0VfTUNBU1Q7CisJCWlmIChjZmc1ICYgQ2ZnNV9CV0YpCisJCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9CQ0FTVDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7Cit9CisKKworLyogU2V0IHRoZSBldGh0b29sIFdha2Utb24tTEFOIHNldHRpbmdzLiAgUmV0dXJuIDAgb3IgLWVycm5vLiAgQXNzdW1lcworICAgdGhhdCB3b2wgcG9pbnRzIHRvIGtlcm5lbCBtZW1vcnkgYW5kIG90aGVyIHRocmVhZHMgb3IgaW50ZXJydXB0cworICAgYXJlbid0IG1lc3Npbmcgd2l0aCB0aGUgODEzOS4gICovCitzdGF0aWMgaW50IHJ0bDgxMzlfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgKmlvYWRkciA9IG5wLT5tbWlvX2FkZHI7CisJdTMyIHN1cHBvcnQ7CisJdTggY2ZnMywgY2ZnNTsKKworCXN1cHBvcnQgPSAoKHJ0bF9jaGlwX2luZm9bbnAtPmNoaXBzZXRdLmZsYWdzICYgSGFzTFdha2UpCisJCSAgID8gKFdBS0VfUEhZIHwgV0FLRV9NQUdJQworCQkgICAgICB8IFdBS0VfVUNBU1QgfCBXQUtFX01DQVNUIHwgV0FLRV9CQ0FTVCkKKwkJICAgOiAwKTsKKwlpZiAod29sLT53b2xvcHRzICYgfnN1cHBvcnQpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCWNmZzMgPSBSVExfUjggKENvbmZpZzMpICYgfihDZmczX0xpbmtVcCB8IENmZzNfTWFnaWMpOworCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX1BIWSkKKwkJY2ZnMyB8PSBDZmczX0xpbmtVcDsKKwlpZiAod29sLT53b2xvcHRzICYgV0FLRV9NQUdJQykKKwkJY2ZnMyB8PSBDZmczX01hZ2ljOworCVJUTF9XOCAoQ2ZnOTM0NiwgQ2ZnOTM0Nl9VbmxvY2spOworCVJUTF9XOCAoQ29uZmlnMywgY2ZnMyk7CisJUlRMX1c4IChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOworCisJY2ZnNSA9IFJUTF9SOCAoQ29uZmlnNSkgJiB+KENmZzVfVVdGIHwgQ2ZnNV9NV0YgfCBDZmc1X0JXRik7CisJLyogKEtPTilGSVhNRTogVGhlc2UgYXJlIHVudGVzdGVkLiAgV2UgbWF5IGhhdmUgdG8gc2V0IHRoZQorCSAgIENSQzAsIFdha2V1cDAgYW5kIExTQkNSQzAgcmVnaXN0ZXJzIHRvbywgYnV0IEkgaGF2ZSBubworCSAgIGRvY3VtZW50YXRpb24uICAqLworCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX1VDQVNUKQorCQljZmc1IHw9IENmZzVfVVdGOworCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX01DQVNUKQorCQljZmc1IHw9IENmZzVfTVdGOworCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX0JDQVNUKQorCQljZmc1IHw9IENmZzVfQldGOworCVJUTF9XOCAoQ29uZmlnNSwgY2ZnNSk7CS8qIG5lZWQgbm90IHVubG9jayB2aWEgQ2ZnOTM0NiAqLworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxMzlfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCWluZm8tPnJlZ2R1bXBfbGVuID0gbnAtPnJlZ3NfbGVuOworfQorCitzdGF0aWMgaW50IHJ0bDgxMzlfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJbWlpX2V0aHRvb2xfZ3NldCgmbnAtPm1paSwgY21kKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGw4MTM5X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyYyA9IG1paV9ldGh0b29sX3NzZXQoJm5wLT5taWksIGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHJ0bDgxMzlfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbWlpX253YXlfcmVzdGFydCgmbnAtPm1paSk7Cit9CisKK3N0YXRpYyB1MzIgcnRsODEzOV9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbWlpX2xpbmtfb2soJm5wLT5taWkpOworfQorCitzdGF0aWMgdTMyIHJ0bDgxMzlfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiBucC0+bXNnX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQgcnRsODEzOV9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdHVtKQoreworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlucC0+bXNnX2VuYWJsZSA9IGRhdHVtOworfQorCisvKiBUT0RPOiB3ZSBhcmUgdG9vIHNsYWNrIHRvIGRvIHJlZyBkdW1waW5nIGZvciBwaW8sIGZvciBub3cgKi8KKyNpZmRlZiBDT05GSUdfODEzOVRPT19QSU8KKyNkZWZpbmUgcnRsODEzOV9nZXRfcmVnc19sZW4JTlVMTAorI2RlZmluZSBydGw4MTM5X2dldF9yZWdzCU5VTEwKKyNlbHNlCitzdGF0aWMgaW50IHJ0bDgxMzlfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiBucC0+cmVnc19sZW47Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxMzlfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqcmVnYnVmKQoreworCXN0cnVjdCBydGw4MTM5X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJlZ3MtPnZlcnNpb24gPSBSVExfUkVHU19WRVI7CisKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJbWVtY3B5X2Zyb21pbyhyZWdidWYsIG5wLT5tbWlvX2FkZHIsIHJlZ3MtPmxlbik7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7Cit9CisjZW5kaWYgLyogQ09ORklHXzgxMzlUT09fTU1JTyAqLworCitzdGF0aWMgaW50IHJ0bDgxMzlfZ2V0X3N0YXRzX2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIFJUTF9OVU1fU1RBVFM7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxMzlfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1NjQgKmRhdGEpCit7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZGF0YVswXSA9IG5wLT54c3RhdHMuZWFybHlfcng7CisJZGF0YVsxXSA9IG5wLT54c3RhdHMudHhfYnVmX21hcHBlZDsKKwlkYXRhWzJdID0gbnAtPnhzdGF0cy50eF90aW1lb3V0czsKKwlkYXRhWzNdID0gbnAtPnhzdGF0cy5yeF9sb3N0X2luX3Jpbmc7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxMzlfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHN0cmluZ3NldCwgdTggKmRhdGEpCit7CisJbWVtY3B5KGRhdGEsIGV0aHRvb2xfc3RhdHNfa2V5cywgc2l6ZW9mKGV0aHRvb2xfc3RhdHNfa2V5cykpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHJ0bDgxMzlfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IHJ0bDgxMzlfZ2V0X2RydmluZm8sCisJLmdldF9zZXR0aW5ncwkJPSBydGw4MTM5X2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCQk9IHJ0bDgxMzlfc2V0X3NldHRpbmdzLAorCS5nZXRfcmVnc19sZW4JCT0gcnRsODEzOV9nZXRfcmVnc19sZW4sCisJLmdldF9yZWdzCQk9IHJ0bDgxMzlfZ2V0X3JlZ3MsCisJLm53YXlfcmVzZXQJCT0gcnRsODEzOV9ud2F5X3Jlc2V0LAorCS5nZXRfbGluawkJPSBydGw4MTM5X2dldF9saW5rLAorCS5nZXRfbXNnbGV2ZWwJCT0gcnRsODEzOV9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSBydGw4MTM5X3NldF9tc2dsZXZlbCwKKwkuZ2V0X3dvbAkJPSBydGw4MTM5X2dldF93b2wsCisJLnNldF93b2wJCT0gcnRsODEzOV9zZXRfd29sLAorCS5nZXRfc3RyaW5ncwkJPSBydGw4MTM5X2dldF9zdHJpbmdzLAorCS5nZXRfc3RhdHNfY291bnQJPSBydGw4MTM5X2dldF9zdGF0c19jb3VudCwKKwkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBydGw4MTM5X2dldF9ldGh0b29sX3N0YXRzLAorfTsKKworc3RhdGljIGludCBuZXRkZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCXJjID0gZ2VuZXJpY19taWlfaW9jdGwoJm5wLT5taWksIGlmX21paShycSksIGNtZCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpydGw4MTM5X2dldF9zdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSAoJnRwLT5sb2NrLCBmbGFncyk7CisJCXRwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IFJUTF9SMzIgKFJ4TWlzc2VkKTsKKwkJUlRMX1czMiAoUnhNaXNzZWQsIDApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmdHAtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gJnRwLT5zdGF0czsKK30KKworLyogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgICBUaGlzIHJvdXRpbmUgaXMgbm90IHN0YXRlIHNlbnNpdGl2ZSBhbmQgbmVlZCBub3QgYmUgU01QIGxvY2tlZC4gKi8KKworc3RhdGljIHZvaWQgX19zZXRfcnhfbW9kZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1MzIgbWNfZmlsdGVyWzJdOwkvKiBNdWx0aWNhc3QgaGFzaCBmaWx0ZXIgKi8KKwlpbnQgaSwgcnhfbW9kZTsKKwl1MzIgdG1wOworCisJRFBSSU5USyAoIiVzOiAgIHJ0bDgxMzlfc2V0X3J4X21vZGUoJTQuNHgpIGRvbmUgLS0gUnggY29uZmlnICU4LjhseC5cbiIsCisJCQlkZXYtPm5hbWUsIGRldi0+ZmxhZ3MsIFJUTF9SMzIgKFJ4Q29uZmlnKSk7CisKKwkvKiBOb3RlOiBkbyBub3QgcmVvcmRlciwgR0NDIGlzIGNsZXZlciBhYm91dCBjb21tb24gc3RhdGVtZW50cy4gKi8KKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICovCisJCXByaW50ayAoS0VSTl9OT1RJQ0UgIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLAorCQkJZGV2LT5uYW1lKTsKKwkJcnhfbW9kZSA9CisJCSAgICBBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRNdWx0aWNhc3QgfCBBY2NlcHRNeVBoeXMgfAorCQkgICAgQWNjZXB0QWxsUGh5czsKKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMHhmZmZmZmZmZjsKKwl9IGVsc2UgaWYgKChkZXYtPm1jX2NvdW50ID4gbXVsdGljYXN0X2ZpbHRlcl9saW1pdCkKKwkJICAgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCS8qIFRvbyBtYW55IHRvIGZpbHRlciBwZXJmZWN0bHkgLS0gYWNjZXB0IGFsbCBtdWx0aWNhc3RzLiAqLworCQlyeF9tb2RlID0gQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXVsdGljYXN0IHwgQWNjZXB0TXlQaHlzOworCQltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSAweGZmZmZmZmZmOworCX0gZWxzZSB7CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCQlyeF9tb2RlID0gQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXlQaHlzOworCQltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSAwOworCQlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IG1jbGlzdCAmJiBpIDwgZGV2LT5tY19jb3VudDsKKwkJICAgICBpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQkJaW50IGJpdF9uciA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgbWNsaXN0LT5kbWlfYWRkcikgPj4gMjY7CisKKwkJCW1jX2ZpbHRlcltiaXRfbnIgPj4gNV0gfD0gMSA8PCAoYml0X25yICYgMzEpOworCQkJcnhfbW9kZSB8PSBBY2NlcHRNdWx0aWNhc3Q7CisJCX0KKwl9CisKKwkvKiBXZSBjYW4gc2FmZWx5IHVwZGF0ZSB3aXRob3V0IHN0b3BwaW5nIHRoZSBjaGlwLiAqLworCXRtcCA9IHJ0bDgxMzlfcnhfY29uZmlnIHwgcnhfbW9kZTsKKwlpZiAodHAtPnJ4X2NvbmZpZyAhPSB0bXApIHsKKwkJUlRMX1czMl9GIChSeENvbmZpZywgdG1wKTsKKwkJdHAtPnJ4X2NvbmZpZyA9IHRtcDsKKwl9CisJUlRMX1czMl9GIChNQVIwICsgMCwgbWNfZmlsdGVyWzBdKTsKKwlSVExfVzMyX0YgKE1BUjAgKyA0LCBtY19maWx0ZXJbMV0pOworfQorCitzdGF0aWMgdm9pZCBydGw4MTM5X3NldF9yeF9tb2RlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUgKCZ0cC0+bG9jaywgZmxhZ3MpOworCV9fc2V0X3J4X21vZGUoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmdHAtPmxvY2ssIGZsYWdzKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IHJ0bDgxMzlfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKwlzdHJ1Y3QgcnRsODEzOV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcGNpX3NhdmVfc3RhdGUgKHBkZXYpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nIChkZXYpKQorCQlyZXR1cm4gMDsKKworCW5ldGlmX2RldmljZV9kZXRhY2ggKGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJnRwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMsIHN0b3AgVHggYW5kIFJ4LiAqLworCVJUTF9XMTYgKEludHJNYXNrLCAwKTsKKwlSVExfVzggKENoaXBDbWQsIDApOworCisJLyogVXBkYXRlIHRoZSBlcnJvciBjb3VudHMuICovCisJdHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gUlRMX1IzMiAoUnhNaXNzZWQpOworCVJUTF9XMzIgKFJ4TWlzc2VkLCAwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZSAocGRldiwgUENJX0QzaG90KTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcnRsODEzOV9yZXN1bWUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOworCisJcGNpX3Jlc3RvcmVfc3RhdGUgKHBkZXYpOworCWlmICghbmV0aWZfcnVubmluZyAoZGV2KSkKKwkJcmV0dXJuIDA7CisJcGNpX3NldF9wb3dlcl9zdGF0ZSAocGRldiwgUENJX0QwKTsKKwlydGw4MTM5X2luaXRfcmluZyAoZGV2KTsKKwlydGw4MTM5X2h3X3N0YXJ0IChkZXYpOworCW5ldGlmX2RldmljZV9hdHRhY2ggKGRldik7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcnRsODEzOV9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQk9IHJ0bDgxMzlfcGNpX3RibCwKKwkucHJvYmUJCT0gcnRsODEzOV9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHJ0bDgxMzlfcmVtb3ZlX29uZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBydGw4MTM5X3N1c3BlbmQsCisJLnJlc3VtZQkJPSBydGw4MTM5X3Jlc3VtZSwKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KK307CisKKworc3RhdGljIGludCBfX2luaXQgcnRsODEzOV9pbml0X21vZHVsZSAodm9pZCkKK3sKKwkvKiB3aGVuIHdlJ3JlIGEgbW9kdWxlLCB3ZSBhbHdheXMgcHJpbnQgYSB2ZXJzaW9uIG1lc3NhZ2UsCisJICogZXZlbiBpZiBubyA4MTM5IGJvYXJkIGlzIGZvdW5kLgorCSAqLworI2lmZGVmIE1PRFVMRQorCXByaW50ayAoS0VSTl9JTkZPIFJUTDgxMzlfRFJJVkVSX05BTUUgIlxuIik7CisjZW5kaWYKKworCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZydGw4MTM5X3BjaV9kcml2ZXIpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBydGw4MTM5X2NsZWFudXBfbW9kdWxlICh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJnJ0bDgxMzlfcGNpX2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQocnRsODEzOV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChydGw4MTM5X2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzgyNTk2LmMgYi9kcml2ZXJzL25ldC84MjU5Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1Zjk3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC84MjU5Ni5jCkBAIC0wLDAgKzEsMTYxOCBAQAorLyogODI1OTYuYzogQSBnZW5lcmljIDgyNTk2IGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguICovCisvKgorICAgQmFzZWQgb24gQXByaWNvdC5jCisgICBXcml0dGVuIDE5OTQgYnkgTWFyayBFdmFucy4KKyAgIFRoaXMgZHJpdmVyIGlzIGZvciB0aGUgQXByaWNvdCA4MjU5NiBidXMtbWFzdGVyIGludGVyZmFjZQorCisgICBNb2R1bGFyaXNlZCAxMi85NCBNYXJrIEV2YW5zCisKKworICAgTW9kaWZpZWQgdG8gc3VwcG9ydCB0aGUgODI1OTYgZXRoZXJuZXQgY2hpcHMgb24gNjgweDAgVk1FIGJvYXJkcy4KKyAgIGJ5IFJpY2hhcmQgSGlyc3QgPHJpY2hhcmRAc2xlZXBpZS5kZW1vbi5jby51az4KKyAgIFJlbmFtZWQgdG8gYmUgODI1OTYuYworCisgICA5ODA4MjU6ICBDaGFuZ2VkIHRvIHJlY2VpdmUgZGlyZWN0bHkgaW4gdG8gc2tfYnVmZnMgd2hpY2ggYXJlCisgICBhbGxvY2F0ZWQgYXQgb3BlbigpIHRpbWUuICBFbGltaW5hdGVzIGNvcHkgb24gaW5jb21pbmcgZnJhbWVzCisgICAoc21hbGwgb25lcyBhcmUgc3RpbGwgY29waWVkKS4gIFNoYXJlZCBkYXRhIG5vdyBoZWxkIGluIGEKKyAgIG5vbi1jYWNoZWQgcGFnZSwgc28gd2UgY2FuIHJ1biBvbiA2ODA2MCBpbiBjb3B5YmFjayBtb2RlLgorCisgICBUQkQ6CisgICAqIGxvb2sgYXQgZGVmZXJyaW5nIHJ4IGZyYW1lcyByYXRoZXIgdGhhbiBkaXNjYXJkaW5nIChhcyBwZXIgdHVsaXApCisgICAqIGhhbmRsZSB0eCByaW5nIGZ1bGwgYXMgcGVyIHR1bGlwCisgICAqIHBlcmZvcm1hY2UgdGVzdCB0byB0dW5lIHJ4X2NvcHlicmVhaworCisgICBNb3N0IG9mIG15IG1vZGlmaWNhdGlvbnMgcmVsYXRlIHRvIHRoZSBicmFpbmRlYWQgYmlnLWVuZGlhbgorICAgaW1wbGVtZW50YXRpb24gYnkgSW50ZWwuICBXaGVuIHRoZSBpNTk2IGlzIG9wZXJhdGluZyBpbgorICAgJ2JpZy1lbmRpYW4nIG1vZGUsIGl0IHRoaW5rcyBhIDMyIGJpdCB2YWx1ZSBvZiAweDEyMzQ1Njc4CisgICBzaG91bGQgYmUgc3RvcmVkIGFzIDB4NTY3ODEyMzQuICBUaGlzIGlzIGEgcmVhbCBwYWluLCB3aGVuCisgICB5b3UgaGF2ZSBsaW5rZWQgbGlzdHMgd2hpY2ggYXJlIHNoYXJlZCBieSB0aGUgNjgweDAgYW5kIHRoZQorICAgaTU5Ni4KKworICAgRHJpdmVyIHNrZWxldG9uCisgICBXcml0dGVuIDE5OTMgYnkgRG9uYWxkIEJlY2tlci4KKyAgIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUgRGlyZWN0b3IsCisgICBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuIFRoaXMgc29mdHdhcmUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQKKyAgIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIG1vZGlmaWVkIGJ5IFNSQywKKyAgIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisgICBUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworICAgU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uLCA0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMCwgQW5uYXBvbGlzIE1EIDIxNDAzCisKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9CisJIjgyNTk2LmMgJFJldmlzaW9uOiAxLjUgJFxuIjsKKworI2RlZmluZSBEUlZfTkFNRQkiODI1OTYiCisKKy8qIERFQlVHIGZsYWdzCisgKi8KKworI2RlZmluZSBERUJfSU5JVAkweDAwMDEKKyNkZWZpbmUgREVCX1BST0JFCTB4MDAwMgorI2RlZmluZSBERUJfU0VSSU9VUwkweDAwMDQKKyNkZWZpbmUgREVCX0VSUk9SUwkweDAwMDgKKyNkZWZpbmUgREVCX01VTFRJCTB4MDAxMAorI2RlZmluZSBERUJfVERSCQkweDAwMjAKKyNkZWZpbmUgREVCX09QRU4JMHgwMDQwCisjZGVmaW5lIERFQl9SRVNFVAkweDAwODAKKyNkZWZpbmUgREVCX0FERENNRAkweDAxMDAKKyNkZWZpbmUgREVCX1NUQVRVUwkweDAyMDAKKyNkZWZpbmUgREVCX1NUQVJUVFgJMHgwNDAwCisjZGVmaW5lIERFQl9SWEFERFIJMHgwODAwCisjZGVmaW5lIERFQl9UWEFERFIJMHgxMDAwCisjZGVmaW5lIERFQl9SWEZSQU1FCTB4MjAwMAorI2RlZmluZSBERUJfSU5UUwkweDQwMDAKKyNkZWZpbmUgREVCX1NUUlVDVAkweDgwMDAKKyNkZWZpbmUgREVCX0FOWQkJMHhmZmZmCisKKworI2RlZmluZSBERUIoeCx5KQlpZiAoaTU5Nl9kZWJ1ZyAmICh4KSkgeQorCisKKyNpZiBkZWZpbmVkKENPTkZJR19NVk1FMTZ4X05FVCkgfHwgZGVmaW5lZChDT05GSUdfTVZNRTE2eF9ORVRfTU9EVUxFKQorI2RlZmluZSBFTkFCTEVfTVZNRTE2eF9ORVQKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0JWTUU2MDAwX05FVCkgfHwgZGVmaW5lZChDT05GSUdfQlZNRTYwMDBfTkVUX01PRFVMRSkKKyNkZWZpbmUgRU5BQkxFX0JWTUU2MDAwX05FVAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQVBSSUNPVCkgfHwgZGVmaW5lZChDT05GSUdfQVBSSUNPVF9NT0RVTEUpCisjZGVmaW5lIEVOQUJMRV9BUFJJQ09UCisjZW5kaWYKKworI2lmZGVmIEVOQUJMRV9NVk1FMTZ4X05FVAorI2luY2x1ZGUgPGFzbS9tdm1lMTZ4aHcuaD4KKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9CVk1FNjAwMF9ORVQKKyNpbmNsdWRlIDxhc20vYnZtZTYwMDBody5oPgorI2VuZGlmCisKKy8qCisgKiBEZWZpbmUgdmFyaW91cyBtYWNyb3MgZm9yIENoYW5uZWwgQXR0ZW50aW9uLCB3b3JkIHN3YXBwaW5nIGV0Yy4sIGRlcGVuZGVudAorICogb24gYXJjaGl0ZWN0dXJlLiAgTVZNRSBhbmQgQlZNRSBhcmUgNjgweDAgYmFzZWQsIG90aGVyd2lzZSBpdCBpcyBJbnRlbC4KKyAqLworCisjaWZkZWYgX19tYzY4MDAwX18KKyNkZWZpbmUgV1NXQVByZmQoeCkgICgoc3RydWN0IGk1OTZfcmZkICopICgoKHUzMikoeCk8PDE2KSB8ICgoKCh1MzIpKHgpKSk+PjE2KSkpCisjZGVmaW5lIFdTV0FQcmJkKHgpICAoKHN0cnVjdCBpNTk2X3JiZCAqKSAoKCh1MzIpKHgpPDwxNikgfCAoKCgodTMyKSh4KSkpPj4xNikpKQorI2RlZmluZSBXU1dBUGlzY3AoeCkgKChzdHJ1Y3QgaTU5Nl9pc2NwICopKCgodTMyKSh4KTw8MTYpIHwgKCgoKHUzMikoeCkpKT4+MTYpKSkKKyNkZWZpbmUgV1NXQVBzY2IoeCkgICgoc3RydWN0IGk1OTZfc2NiICopICgoKHUzMikoeCk8PDE2KSB8ICgoKCh1MzIpKHgpKSk+PjE2KSkpCisjZGVmaW5lIFdTV0FQY21kKHgpICAoKHN0cnVjdCBpNTk2X2NtZCAqKSAoKCh1MzIpKHgpPDwxNikgfCAoKCgodTMyKSh4KSkpPj4xNikpKQorI2RlZmluZSBXU1dBUHRiZCh4KSAgKChzdHJ1Y3QgaTU5Nl90YmQgKikgKCgodTMyKSh4KTw8MTYpIHwgKCgoKHUzMikoeCkpKT4+MTYpKSkKKyNkZWZpbmUgV1NXQVBjaGFyKHgpICgoY2hhciAqKSAgICAgICAgICAgICgoKHUzMikoeCk8PDE2KSB8ICgoKCh1MzIpKHgpKSk+PjE2KSkpCisjZGVmaW5lIElTQ1BfQlVTWQkweDAwMDEwMDAwCisjZGVmaW5lIE1BQ0hfSVNfQVBSSUNPVAkwCisjZWxzZQorI2RlZmluZSBXU1dBUHJmZCh4KSAgICAgKChzdHJ1Y3QgaTU5Nl9yZmQgKikoeCkpCisjZGVmaW5lIFdTV0FQcmJkKHgpICAgICAoKHN0cnVjdCBpNTk2X3JiZCAqKSh4KSkKKyNkZWZpbmUgV1NXQVBpc2NwKHgpICAgICgoc3RydWN0IGk1OTZfaXNjcCAqKSh4KSkKKyNkZWZpbmUgV1NXQVBzY2IoeCkgICAgICgoc3RydWN0IGk1OTZfc2NiICopKHgpKQorI2RlZmluZSBXU1dBUGNtZCh4KSAgICAgKChzdHJ1Y3QgaTU5Nl9jbWQgKikoeCkpCisjZGVmaW5lIFdTV0FQdGJkKHgpICAgICAoKHN0cnVjdCBpNTk2X3RiZCAqKSh4KSkKKyNkZWZpbmUgV1NXQVBjaGFyKHgpICAgICgoY2hhciAqKSh4KSkKKyNkZWZpbmUgSVNDUF9CVVNZCTB4MDAwMQorI2RlZmluZSBNQUNIX0lTX0FQUklDT1QJMQorI2VuZGlmCisKKy8qCisgKiBUaGUgTVBVX1BPUlQgY29tbWFuZCBhbGxvd3MgZGlyZWN0IGFjY2VzcyB0byB0aGUgODI1OTYuIFdpdGggUE9SVCBhY2Nlc3MKKyAqIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGF2YWlsYWJsZSAocDUtMTgpLiBUaGUgMzItYml0IHBvcnQgY29tbWFuZAorICogbXVzdCBiZSB3b3JkLXN3YXBwZWQgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudCB3b3JkIHdyaXR0ZW4gZmlyc3QuCisgKiBUaGlzIG9ubHkgYXBwbGllcyB0byBWTUUgYm9hcmRzLgorICovCisjZGVmaW5lIFBPUlRfUkVTRVQJCTB4MDAJLyogcmVzZXQgODI1OTYgKi8KKyNkZWZpbmUgUE9SVF9TRUxGVEVTVAkJMHgwMQkvKiBzZWxmdGVzdCAqLworI2RlZmluZSBQT1JUX0FMVFNDUAkJMHgwMgkvKiBhbHRlcm5hdGUgU0NCIGFkZHJlc3MgKi8KKyNkZWZpbmUgUE9SVF9BTFREVU1QCQkweDAzCS8qIEFsdGVybmF0ZSBEVU1QIGFkZHJlc3MgKi8KKworc3RhdGljIGludCBpNTk2X2RlYnVnID0gKERFQl9TRVJJT1VTfERFQl9QUk9CRSk7CisKK01PRFVMRV9BVVRIT1IoIlJpY2hhcmQgSGlyc3QiKTsKK01PRFVMRV9ERVNDUklQVElPTigiaTgyNTk2IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0oaTU5Nl9kZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaTU5Nl9kZWJ1ZywgImk4MjU5NiBkZWJ1ZyBtYXNrIik7CisKKworLyogQ29weSBmcmFtZXMgc2hvcnRlciB0aGFuIHJ4X2NvcHlicmVhaywgb3RoZXJ3aXNlIHBhc3Mgb24gdXAgaW4KKyAqIGEgZnVsbCBzaXplZCBza19idWZmLiAgVmFsdWUgb2YgMTAwIHN0b2xlbiBmcm9tIHR1bGlwLmMgKCFhbHBoYSkuCisgKi8KK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrID0gMTAwOworCisjZGVmaW5lIFBLVF9CVUZfU1oJMTUzNgorI2RlZmluZSBNQVhfTUNfQ05UCTY0CisKKyNkZWZpbmUgSTU5Nl9UT1RBTF9TSVpFIDE3CisKKyNkZWZpbmUgSTU5Nl9OVUxMICgodm9pZCAqKTB4ZmZmZmZmZmYpCisKKyNkZWZpbmUgQ01EX0VPTAkJMHg4MDAwCS8qIFRoZSBsYXN0IGNvbW1hbmQgb2YgdGhlIGxpc3QsIHN0b3AuICovCisjZGVmaW5lIENNRF9TVVNQCTB4NDAwMAkvKiBTdXNwZW5kIGFmdGVyIGRvaW5nIGNtZC4gKi8KKyNkZWZpbmUgQ01EX0lOVFIJMHgyMDAwCS8qIEludGVycnVwdCBhZnRlciBkb2luZyBjbWQuICovCisKKyNkZWZpbmUgQ01EX0ZMRVgJMHgwMDA4CS8qIEVuYWJsZSBmbGV4aWJsZSBtZW1vcnkgbW9kZWwgKi8KKworZW51bSBjb21tYW5kcyB7CisJQ21kTk9wID0gMCwgQ21kU0FTZXR1cCA9IDEsIENtZENvbmZpZ3VyZSA9IDIsIENtZE11bHRpY2FzdExpc3QgPSAzLAorCUNtZFR4ID0gNCwgQ21kVERSID0gNSwgQ21kRHVtcCA9IDYsIENtZERpYWdub3NlID0gNworfTsKKworI2RlZmluZSBTVEFUX0MJCTB4ODAwMAkvKiBTZXQgdG8gMCBhZnRlciBleGVjdXRpb24gKi8KKyNkZWZpbmUgU1RBVF9CCQkweDQwMDAJLyogQ29tbWFuZCBiZWluZyBleGVjdXRlZCAqLworI2RlZmluZSBTVEFUX09LCQkweDIwMDAJLyogQ29tbWFuZCBleGVjdXRlZCBvayAqLworI2RlZmluZSBTVEFUX0EJCTB4MTAwMAkvKiBDb21tYW5kIGFib3J0ZWQgKi8KKworI2RlZmluZQkgQ1VDX1NUQVJUCTB4MDEwMAorI2RlZmluZQkgQ1VDX1JFU1VNRQkweDAyMDAKKyNkZWZpbmUJIENVQ19TVVNQRU5EICAgIDB4MDMwMAorI2RlZmluZQkgQ1VDX0FCT1JUCTB4MDQwMAorI2RlZmluZQkgUlhfU1RBUlQJMHgwMDEwCisjZGVmaW5lCSBSWF9SRVNVTUUJMHgwMDIwCisjZGVmaW5lCSBSWF9TVVNQRU5ECTB4MDAzMAorI2RlZmluZQkgUlhfQUJPUlQJMHgwMDQwCisKKyNkZWZpbmUgVFhfVElNRU9VVAk1CisKKworc3RydWN0IGk1OTZfcmVnIHsKKwl1bnNpZ25lZCBzaG9ydCBwb3J0aGk7CisJdW5zaWduZWQgc2hvcnQgcG9ydGxvOworCXVuc2lnbmVkIGxvbmcgY2E7Cit9OworCisjZGVmaW5lIEVPRgkJMHg4MDAwCisjZGVmaW5lIFNJWkVfTUFTSwkweDNmZmYKKworc3RydWN0IGk1OTZfdGJkIHsKKwl1bnNpZ25lZCBzaG9ydCBzaXplOworCXVuc2lnbmVkIHNob3J0IHBhZDsKKwlzdHJ1Y3QgaTU5Nl90YmQgKm5leHQ7CisJY2hhciAqZGF0YTsKK307CisKKy8qIFRoZSBjb21tYW5kIHN0cnVjdHVyZSBoYXMgdHdvICduZXh0JyBwb2ludGVyczsgdl9uZXh0IGlzIHRoZSBhZGRyZXNzIG9mCisgKiB0aGUgbmV4dCBjb21tYW5kIGFzIHNlZW4gYnkgdGhlIENQVSwgYl9uZXh0IGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0CisgKiBjb21tYW5kIGFzIHNlZW4gYnkgdGhlIDgyNTk2LiAgVGhlIGJfbmV4dCBwb2ludGVyLCBhcyB1c2VkIGJ5IHRoZSA4MjU5NgorICogYWx3YXlzIHJlZmVyZW5jZXMgdGhlIHN0YXR1cyBmaWVsZCBvZiB0aGUgbmV4dCBjb21tYW5kLCByYXRoZXIgdGhhbiB0aGUKKyAqIHZfbmV4dCBmaWVsZCwgYmVjYXVzZSB0aGUgODI1OTYgaXMgdW5hd2FyZSBvZiB2X25leHQuICBJdCBtYXkgc2VlbSBtb3JlCisgKiBsb2dpY2FsIHRvIHB1dCB2X25leHQgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0dXJlLCBidXQgd2UgY2Fubm90IGRvIHRoYXQKKyAqIGJlY2F1c2UgdGhlIDgyNTk2IGV4cGVjdHMgb3RoZXIgZmllbGRzIHRvIGJlIHRoZXJlLCBkZXBlbmRpbmcgb24gY29tbWFuZAorICogdHlwZS4KKyAqLworCitzdHJ1Y3QgaTU5Nl9jbWQgeworCXN0cnVjdCBpNTk2X2NtZCAqdl9uZXh0OwkvKiBBZGRyZXNzIGZyb20gQ1BVcyB2aWV3cG9pbnQgKi8KKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgY29tbWFuZDsKKwlzdHJ1Y3QgaTU5Nl9jbWQgKmJfbmV4dDsJLyogQWRkcmVzcyBmcm9tIGk1OTYgdmlld3BvaW50ICovCit9OworCitzdHJ1Y3QgdHhfY21kIHsKKwlzdHJ1Y3QgaTU5Nl9jbWQgY21kOworCXN0cnVjdCBpNTk2X3RiZCAqdGJkOworCXVuc2lnbmVkIHNob3J0IHNpemU7CisJdW5zaWduZWQgc2hvcnQgcGFkOworCXN0cnVjdCBza19idWZmICpza2I7CS8qIFNvIHdlIGNhbiBmcmVlIGl0IGFmdGVyIHR4ICovCit9OworCitzdHJ1Y3QgdGRyX2NtZCB7CisJc3RydWN0IGk1OTZfY21kIGNtZDsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgcGFkOworfTsKKworc3RydWN0IG1jX2NtZCB7CisJc3RydWN0IGk1OTZfY21kIGNtZDsKKwlzaG9ydCBtY19jbnQ7CisJY2hhciBtY19hZGRyc1tNQVhfTUNfQ05UKjZdOworfTsKKworc3RydWN0IHNhX2NtZCB7CisJc3RydWN0IGk1OTZfY21kIGNtZDsKKwljaGFyIGV0aF9hZGRyWzhdOworfTsKKworc3RydWN0IGNmX2NtZCB7CisJc3RydWN0IGk1OTZfY21kIGNtZDsKKwljaGFyIGk1OTZfY29uZmlnWzE2XTsKK307CisKK3N0cnVjdCBpNTk2X3JmZCB7CisJdW5zaWduZWQgc2hvcnQgc3RhdDsKKwl1bnNpZ25lZCBzaG9ydCBjbWQ7CisJc3RydWN0IGk1OTZfcmZkICpiX25leHQ7CS8qIEFkZHJlc3MgZnJvbSBpNTk2IHZpZXdwb2ludCAqLworCXN0cnVjdCBpNTk2X3JiZCAqcmJkOworCXVuc2lnbmVkIHNob3J0IGNvdW50OworCXVuc2lnbmVkIHNob3J0IHNpemU7CisJc3RydWN0IGk1OTZfcmZkICp2X25leHQ7CS8qIEFkZHJlc3MgZnJvbSBDUFVzIHZpZXdwb2ludCAqLworCXN0cnVjdCBpNTk2X3JmZCAqdl9wcmV2OworfTsKKworc3RydWN0IGk1OTZfcmJkIHsKKyAgICB1bnNpZ25lZCBzaG9ydCBjb3VudDsKKyAgICB1bnNpZ25lZCBzaG9ydCB6ZXJvMTsKKyAgICBzdHJ1Y3QgaTU5Nl9yYmQgKmJfbmV4dDsKKyAgICB1bnNpZ25lZCBjaGFyICpiX2RhdGE7CQkvKiBBZGRyZXNzIGZyb20gaTU5NiB2aWV3cG9pbnQgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBzaXplOworICAgIHVuc2lnbmVkIHNob3J0IHplcm8yOworICAgIHN0cnVjdCBza19idWZmICpza2I7CisgICAgc3RydWN0IGk1OTZfcmJkICp2X25leHQ7CisgICAgc3RydWN0IGk1OTZfcmJkICpiX2FkZHI7CQkvKiBUaGlzIHJiZCBhZGRyIGZyb20gaTU5NiB2aWV3ICovCisgICAgdW5zaWduZWQgY2hhciAqdl9kYXRhOwkJLyogQWRkcmVzcyBmcm9tIENQVXMgdmlld3BvaW50ICovCit9OworCisjZGVmaW5lIFRYX1JJTkdfU0laRSA2NAorI2RlZmluZSBSWF9SSU5HX1NJWkUgMTYKKworc3RydWN0IGk1OTZfc2NiIHsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgY29tbWFuZDsKKwlzdHJ1Y3QgaTU5Nl9jbWQgKmNtZDsKKwlzdHJ1Y3QgaTU5Nl9yZmQgKnJmZDsKKwl1bnNpZ25lZCBsb25nIGNyY19lcnI7CisJdW5zaWduZWQgbG9uZyBhbGlnbl9lcnI7CisJdW5zaWduZWQgbG9uZyByZXNvdXJjZV9lcnI7CisJdW5zaWduZWQgbG9uZyBvdmVyX2VycjsKKwl1bnNpZ25lZCBsb25nIHJjdmR0X2VycjsKKwl1bnNpZ25lZCBsb25nIHNob3J0X2VycjsKKwl1bnNpZ25lZCBzaG9ydCB0X29uOworCXVuc2lnbmVkIHNob3J0IHRfb2ZmOworfTsKKworc3RydWN0IGk1OTZfaXNjcCB7CisJdW5zaWduZWQgbG9uZyBzdGF0OworCXN0cnVjdCBpNTk2X3NjYiAqc2NiOworfTsKKworc3RydWN0IGk1OTZfc2NwIHsKKwl1bnNpZ25lZCBsb25nIHN5c2J1czsKKwl1bnNpZ25lZCBsb25nIHBhZDsKKwlzdHJ1Y3QgaTU5Nl9pc2NwICppc2NwOworfTsKKworc3RydWN0IGk1OTZfcHJpdmF0ZSB7CisJdm9sYXRpbGUgc3RydWN0IGk1OTZfc2NwIHNjcDsKKwl2b2xhdGlsZSBzdHJ1Y3QgaTU5Nl9pc2NwIGlzY3A7CisJdm9sYXRpbGUgc3RydWN0IGk1OTZfc2NiIHNjYjsKKwlzdHJ1Y3Qgc2FfY21kIHNhX2NtZDsKKwlzdHJ1Y3QgY2ZfY21kIGNmX2NtZDsKKwlzdHJ1Y3QgdGRyX2NtZCB0ZHJfY21kOworCXN0cnVjdCBtY19jbWQgbWNfY21kOworCXVuc2lnbmVkIGxvbmcgc3RhdDsKKwlpbnQgbGFzdF9yZXN0YXJ0IF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKTsKKwlzdHJ1Y3QgaTU5Nl9yZmQgKnJmZF9oZWFkOworCXN0cnVjdCBpNTk2X3JiZCAqcmJkX2hlYWQ7CisJc3RydWN0IGk1OTZfY21kICpjbWRfdGFpbDsKKwlzdHJ1Y3QgaTU5Nl9jbWQgKmNtZF9oZWFkOworCWludCBjbWRfYmFja2xvZzsKKwl1bnNpZ25lZCBsb25nIGxhc3RfY21kOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBpNTk2X3JmZCByZmRzW1JYX1JJTkdfU0laRV07CisJc3RydWN0IGk1OTZfcmJkIHJiZHNbUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3QgdHhfY21kIHR4X2NtZHNbVFhfUklOR19TSVpFXTsKKwlzdHJ1Y3QgaTU5Nl90YmQgdGJkc1tUWF9SSU5HX1NJWkVdOworCWludCBuZXh0X3R4X2NtZDsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCitzdGF0aWMgY2hhciBpbml0X3NldHVwW10gPQoreworCTB4OEUsCQkJLyogbGVuZ3RoLCBwcmVmZXRjaCBvbiAqLworCTB4QzgsCQkJLyogZmlmbyB0byA4LCBtb25pdG9yIG9mZiAqLworI2lmZGVmIENPTkZJR19WTUUKKwkweGMwLAkJCS8qIGRvbid0IHNhdmUgYmFkIGZyYW1lcyAqLworI2Vsc2UKKwkweDgwLAkJCS8qIGRvbid0IHNhdmUgYmFkIGZyYW1lcyAqLworI2VuZGlmCisJMHgyRSwJCQkvKiBObyBzb3VyY2UgYWRkcmVzcyBpbnNlcnRpb24sIDggYnl0ZSBwcmVhbWJsZSAqLworCTB4MDAsCQkJLyogcHJpb3JpdHkgYW5kIGJhY2tvZmYgZGVmYXVsdHMgKi8KKwkweDYwLAkJCS8qIGludGVyZnJhbWUgc3BhY2luZyAqLworCTB4MDAsCQkJLyogc2xvdCB0aW1lIExTQiAqLworCTB4ZjIsCQkJLyogc2xvdCB0aW1lIGFuZCByZXRyaWVzICovCisJMHgwMCwJCQkvKiBwcm9taXNjdW91cyBtb2RlICovCisJMHgwMCwJCQkvKiBjb2xsaXNpb24gZGV0ZWN0ICovCisJMHg0MCwJCQkvKiBtaW5pbXVtIGZyYW1lIGxlbmd0aCAqLworCTB4ZmYsCisJMHgwMCwKKwkweDdmIC8qICAqbXVsdGkgSUEgKi8gfTsKKworc3RhdGljIGludCBpNTk2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGk1OTZfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBpNTk2X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgaTU5Nl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaTU5Nl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBpNTk2X2FkZF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGk1OTZfY21kICpjbWQpOworc3RhdGljIHZvaWQgaTU5Nl90eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHByaW50X2V0aCh1bnNpZ25lZCBjaGFyICpidWYsIGNoYXIgKnN0cik7CitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBpbnQgcnhfcmluZ19zaXplID0gUlhfUklOR19TSVpFOworc3RhdGljIGludCB0aWNrc19saW1pdCA9IDI1Oworc3RhdGljIGludCBtYXhfY21kX2JhY2tsb2cgPSBUWF9SSU5HX1NJWkUtMTsKKworCitzdGF0aWMgaW5saW5lIHZvaWQgQ0Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZmRlZiBFTkFCTEVfTVZNRTE2eF9ORVQKKwlpZiAoTUFDSF9JU19NVk1FMTZ4KSB7CisJCSgoc3RydWN0IGk1OTZfcmVnICopIGRldi0+YmFzZV9hZGRyKS0+Y2EgPSAxOworCX0KKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9CVk1FNjAwMF9ORVQKKwlpZiAoTUFDSF9JU19CVk1FNjAwMCkgeworCQl2b2xhdGlsZSB1MzIgaTsKKworCQlpID0gKih2b2xhdGlsZSB1MzIgKikgKGRldi0+YmFzZV9hZGRyKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfQVBSSUNPVAorCWlmIChNQUNIX0lTX0FQUklDT1QpIHsKKwkJb3V0dygwLCAoc2hvcnQpIChkZXYtPmJhc2VfYWRkcikgKyA0KTsKKwl9CisjZW5kaWYKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgTVBVX1BPUlQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGMsIHZvbGF0aWxlIHZvaWQgKngpCit7CisjaWZkZWYgRU5BQkxFX01WTUUxNnhfTkVUCisJaWYgKE1BQ0hfSVNfTVZNRTE2eCkgeworCQlzdHJ1Y3QgaTU5Nl9yZWcgKnAgPSAoc3RydWN0IGk1OTZfcmVnICopIChkZXYtPmJhc2VfYWRkcik7CisJCXAtPnBvcnRoaSA9ICgoYykgfCAodTMyKSAoeCkpICYgMHhmZmZmOworCQlwLT5wb3J0bG8gPSAoKGMpIHwgKHUzMikgKHgpKSA+PiAxNjsKKwl9CisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfQlZNRTYwMDBfTkVUCisJaWYgKE1BQ0hfSVNfQlZNRTYwMDApIHsKKwkJdTMyIHYgPSAodTMyKSAoYykgfCAodTMyKSAoeCk7CisJCXYgPSAoKHUzMikgKHYpIDw8IDE2KSB8ICgodTMyKSAodikgPj4gMTYpOworCQkqKHZvbGF0aWxlIHUzMiAqKSBkZXYtPmJhc2VfYWRkciA9IHY7CisJCXVkZWxheSgxKTsKKwkJKih2b2xhdGlsZSB1MzIgKikgZGV2LT5iYXNlX2FkZHIgPSB2OworCX0KKyNlbmRpZgorfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IHdhaXRfaXN0YXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAsIGludCBkZWxjbnQsIGNoYXIgKnN0cikKK3sKKwl3aGlsZSAoLS1kZWxjbnQgJiYgbHAtPmlzY3Auc3RhdCkKKwkJdWRlbGF5KDEwKTsKKwlpZiAoIWRlbGNudCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcywgc3RhdHVzICU0LjR4LCBjbWQgJTQuNHguXG4iLAorCQkgICAgIGRldi0+bmFtZSwgc3RyLCBscC0+c2NiLnN0YXR1cywgbHAtPnNjYi5jb21tYW5kKTsKKwkJcmV0dXJuIC0xOworCX0KKwllbHNlCisJCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IHdhaXRfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwLCBpbnQgZGVsY250LCBjaGFyICpzdHIpCit7CisJd2hpbGUgKC0tZGVsY250ICYmIGxwLT5zY2IuY29tbWFuZCkKKwkJdWRlbGF5KDEwKTsKKwlpZiAoIWRlbGNudCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcywgc3RhdHVzICU0LjR4LCBjbWQgJTQuNHguXG4iLAorCQkgICAgIGRldi0+bmFtZSwgc3RyLCBscC0+c2NiLnN0YXR1cywgbHAtPnNjYi5jb21tYW5kKTsKKwkJcmV0dXJuIC0xOworCX0KKwllbHNlCisJCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IHdhaXRfY2ZnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpNTk2X2NtZCAqY21kLCBpbnQgZGVsY250LCBjaGFyICpzdHIpCit7CisJdm9sYXRpbGUgc3RydWN0IGk1OTZfY21kICpjID0gY21kOworCQorCXdoaWxlICgtLWRlbGNudCAmJiBjLT5jb21tYW5kKQorCQl1ZGVsYXkoMTApOworCWlmICghZGVsY250KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzLlxuIiwgZGV2LT5uYW1lLCBzdHIpOworCQlyZXR1cm4gLTE7CisJfQorCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKyAKK3N0YXRpYyB2b2lkIGk1OTZfZGlzcGxheV9kYXRhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IGk1OTZfY21kICpjbWQ7CisJc3RydWN0IGk1OTZfcmZkICpyZmQ7CisJc3RydWN0IGk1OTZfcmJkICpyYmQ7CisKKwlwcmludGsoS0VSTl9FUlIgImxwIGFuZCBzY3AgYXQgJXAsIC5zeXNidXMgPSAlMDhseCwgLmlzY3AgPSAlcFxuIiwKKwkgICAgICAgJmxwLT5zY3AsIGxwLT5zY3Auc3lzYnVzLCBscC0+c2NwLmlzY3ApOworCXByaW50ayhLRVJOX0VSUiAiaXNjcCBhdCAlcCwgaXNjcC5zdGF0ID0gJTA4bHgsIC5zY2IgPSAlcFxuIiwKKwkgICAgICAgJmxwLT5pc2NwLCBscC0+aXNjcC5zdGF0LCBscC0+aXNjcC5zY2IpOworCXByaW50ayhLRVJOX0VSUiAic2NiIGF0ICVwLCBzY2Iuc3RhdHVzID0gJTA0eCwgLmNvbW1hbmQgPSAlMDR4LCIKKwkJIiAuY21kID0gJXAsIC5yZmQgPSAlcFxuIiwKKwkgICAgICAgJmxwLT5zY2IsIGxwLT5zY2Iuc3RhdHVzLCBscC0+c2NiLmNvbW1hbmQsCisJCWxwLT5zY2IuY21kLCBscC0+c2NiLnJmZCk7CisJcHJpbnRrKEtFUk5fRVJSICIgICBlcnJvcnM6IGNyYyAlbHgsIGFsaWduICVseCwgcmVzb3VyY2UgJWx4LCIKKyAgICAgICAgICAgICAgICIgb3ZlciAlbHgsIHJjdmR0ICVseCwgc2hvcnQgJWx4XG4iLAorCQlscC0+c2NiLmNyY19lcnIsIGxwLT5zY2IuYWxpZ25fZXJyLCBscC0+c2NiLnJlc291cmNlX2VyciwKKwkJbHAtPnNjYi5vdmVyX2VyciwgbHAtPnNjYi5yY3ZkdF9lcnIsIGxwLT5zY2Iuc2hvcnRfZXJyKTsKKwljbWQgPSBscC0+Y21kX2hlYWQ7CisJd2hpbGUgKGNtZCAhPSBJNTk2X05VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjbWQgYXQgJXAsIC5zdGF0dXMgPSAlMDR4LCAuY29tbWFuZCA9ICUwNHgsIC5iX25leHQgPSAlcFxuIiwKKwkJICBjbWQsIGNtZC0+c3RhdHVzLCBjbWQtPmNvbW1hbmQsIGNtZC0+Yl9uZXh0KTsKKwkJY21kID0gY21kLT52X25leHQ7CisJfQorCXJmZCA9IGxwLT5yZmRfaGVhZDsKKwlwcmludGsoS0VSTl9FUlIgInJmZF9oZWFkID0gJXBcbiIsIHJmZCk7CisJZG8geworCQlwcmludGsoS0VSTl9FUlIgIiAgICVwIC5zdGF0ICUwNHgsIC5jbWQgJTA0eCwgYl9uZXh0ICVwLCByYmQgJXAsIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBjb3VudCAlMDR4XG4iLAorCQkJcmZkLCByZmQtPnN0YXQsIHJmZC0+Y21kLCByZmQtPmJfbmV4dCwgcmZkLT5yYmQsCisJCQlyZmQtPmNvdW50KTsKKwkJcmZkID0gcmZkLT52X25leHQ7CisJfSB3aGlsZSAocmZkICE9IGxwLT5yZmRfaGVhZCk7CisJcmJkID0gbHAtPnJiZF9oZWFkOworCXByaW50ayhLRVJOX0VSUiAicmJkX2hlYWQgPSAlcFxuIiwgcmJkKTsKKwlkbyB7CisJCXByaW50ayhLRVJOX0VSUiAiICAgJXAgLmNvdW50ICUwNHgsIGJfbmV4dCAlcCwgYl9kYXRhICVwLCBzaXplICUwNHhcbiIsCisJCQlyYmQsIHJiZC0+Y291bnQsIHJiZC0+Yl9uZXh0LCByYmQtPmJfZGF0YSwgcmJkLT5zaXplKTsKKwkJcmJkID0gcmJkLT52X25leHQ7CisJfSB3aGlsZSAocmJkICE9IGxwLT5yYmRfaGVhZCk7Cit9CisKKworI2lmIGRlZmluZWQoRU5BQkxFX01WTUUxNnhfTkVUKSB8fCBkZWZpbmVkKEVOQUJMRV9CVk1FNjAwMF9ORVQpCitzdGF0aWMgaXJxcmV0dXJuX3QgaTU5Nl9lcnJvcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisjaWZkZWYgRU5BQkxFX01WTUUxNnhfTkVUCisJaWYgKE1BQ0hfSVNfTVZNRTE2eCkgeworCQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpwY2MyID0gKHVuc2lnbmVkIGNoYXIgKikgMHhmZmY0MjAwMDsKKworCQlwY2MyWzB4MjhdID0gMTsKKwkJcGNjMlsweDJiXSA9IDB4MWQ7CisJfQorI2VuZGlmCisjaWZkZWYgRU5BQkxFX0JWTUU2MDAwX05FVAorCWlmIChNQUNIX0lTX0JWTUU2MDAwKSB7CisJCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmV0aGlycSA9ICh1bnNpZ25lZCBjaGFyICopIEJWTUVfRVRISVJRX1JFRzsKKworCQkqZXRoaXJxID0gMTsKKwkJKmV0aGlycSA9IDM7CisJfQorI2VuZGlmCisJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgaW50ZXJydXB0XG4iLCBkZXYtPm5hbWUpOworCWk1OTZfZGlzcGxheV9kYXRhKGRldik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X3J4X2J1ZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKwlzdHJ1Y3QgaTU5Nl9yZmQgKnJmZDsKKwlzdHJ1Y3QgaTU5Nl9yYmQgKnJiZDsKKworCS8qIEZpcnN0IGJ1aWxkIHRoZSBSZWNlaXZlIEJ1ZmZlciBEZXNjcmlwdG9yIExpc3QgKi8KKworCWZvciAoaSA9IDAsIHJiZCA9IGxwLT5yYmRzOyBpIDwgcnhfcmluZ19zaXplOyBpKyssIHJiZCsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKFBLVF9CVUZfU1opOworCisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXBhbmljKCI4MjU5NjogYWxsb2Nfc2tiKCkgZmFpbGVkIik7CisJCXNrYi0+ZGV2ID0gZGV2OworCQlyYmQtPnZfbmV4dCA9IHJiZCsxOworCQlyYmQtPmJfbmV4dCA9IFdTV0FQcmJkKHZpcnRfdG9fYnVzKHJiZCsxKSk7CisJCXJiZC0+Yl9hZGRyID0gV1NXQVByYmQodmlydF90b19idXMocmJkKSk7CisJCXJiZC0+c2tiID0gc2tiOworCQlyYmQtPnZfZGF0YSA9IHNrYi0+dGFpbDsKKwkJcmJkLT5iX2RhdGEgPSBXU1dBUGNoYXIodmlydF90b19idXMoc2tiLT50YWlsKSk7CisJCXJiZC0+c2l6ZSA9IFBLVF9CVUZfU1o7CisjaWZkZWYgX19tYzY4MDAwX18KKwkJY2FjaGVfY2xlYXIodmlydF90b19waHlzKHNrYi0+dGFpbCksIFBLVF9CVUZfU1opOworI2VuZGlmCisJfQorCWxwLT5yYmRfaGVhZCA9IGxwLT5yYmRzOworCXJiZCA9IGxwLT5yYmRzICsgcnhfcmluZ19zaXplIC0gMTsKKwlyYmQtPnZfbmV4dCA9IGxwLT5yYmRzOworCXJiZC0+Yl9uZXh0ID0gV1NXQVByYmQodmlydF90b19idXMobHAtPnJiZHMpKTsKKworCS8qIE5vdyBidWlsZCB0aGUgUmVjZWl2ZSBGcmFtZSBEZXNjcmlwdG9yIExpc3QgKi8KKworCWZvciAoaSA9IDAsIHJmZCA9IGxwLT5yZmRzOyBpIDwgcnhfcmluZ19zaXplOyBpKyssIHJmZCsrKSB7CisJCXJmZC0+cmJkID0gSTU5Nl9OVUxMOworCQlyZmQtPnZfbmV4dCA9IHJmZCsxOworCQlyZmQtPnZfcHJldiA9IHJmZC0xOworCQlyZmQtPmJfbmV4dCA9IFdTV0FQcmZkKHZpcnRfdG9fYnVzKHJmZCsxKSk7CisJCXJmZC0+Y21kID0gQ01EX0ZMRVg7CisJfQorCWxwLT5yZmRfaGVhZCA9IGxwLT5yZmRzOworCWxwLT5zY2IucmZkID0gV1NXQVByZmQodmlydF90b19idXMobHAtPnJmZHMpKTsKKwlyZmQgPSBscC0+cmZkczsKKwlyZmQtPnJiZCA9IGxwLT5yYmRfaGVhZDsKKwlyZmQtPnZfcHJldiA9IGxwLT5yZmRzICsgcnhfcmluZ19zaXplIC0gMTsKKwlyZmQgPSBscC0+cmZkcyArIHJ4X3Jpbmdfc2l6ZSAtIDE7CisJcmZkLT52X25leHQgPSBscC0+cmZkczsKKwlyZmQtPmJfbmV4dCA9IFdTV0FQcmZkKHZpcnRfdG9fYnVzKGxwLT5yZmRzKSk7CisJcmZkLT5jbWQgPSBDTURfRU9MfENNRF9GTEVYOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVtb3ZlX3J4X2J1ZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgaTU5Nl9yYmQgKnJiZDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDAsIHJiZCA9IGxwLT5yYmRzOyBpIDwgcnhfcmluZ19zaXplOyBpKyssIHJiZCsrKSB7CisJCWlmIChyYmQtPnNrYiA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWRldl9rZnJlZV9za2IocmJkLT5za2IpOworCX0KK30KKworCitzdGF0aWMgdm9pZCByZWJ1aWxkX3J4X2J1ZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKworCS8qIEVuc3VyZSByeCBmcmFtZS9idWZmZXIgZGVzY3JpcHRvcnMgYXJlIHRpZHkgKi8KKworCWZvciAoaSA9IDA7IGkgPCByeF9yaW5nX3NpemU7IGkrKykgeworCQlscC0+cmZkc1tpXS5yYmQgPSBJNTk2X05VTEw7CisJCWxwLT5yZmRzW2ldLmNtZCA9IENNRF9GTEVYOworCX0KKwlscC0+cmZkc1tyeF9yaW5nX3NpemUtMV0uY21kID0gQ01EX0VPTHxDTURfRkxFWDsKKwlscC0+cmZkX2hlYWQgPSBscC0+cmZkczsKKwlscC0+c2NiLnJmZCA9IFdTV0FQcmZkKHZpcnRfdG9fYnVzKGxwLT5yZmRzKSk7CisJbHAtPnJiZF9oZWFkID0gbHAtPnJiZHM7CisJbHAtPnJmZHNbMF0ucmJkID0gV1NXQVByYmQodmlydF90b19idXMobHAtPnJiZHMpKTsKK30KKworCitzdGF0aWMgaW50IGluaXRfaTU5Nl9tZW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyNpZiAhZGVmaW5lZChFTkFCTEVfTVZNRTE2eF9ORVQpICYmICFkZWZpbmVkKEVOQUJMRV9CVk1FNjAwMF9ORVQpCisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJTVBVX1BPUlQoZGV2LCBQT1JUX1JFU0VULCBOVUxMKTsKKworCXVkZWxheSgxMDApOwkJLyogV2FpdCAxMDB1cyAtIHNlZW1zIHRvIGhlbHAgKi8KKworI2lmIGRlZmluZWQoRU5BQkxFX01WTUUxNnhfTkVUKSB8fCBkZWZpbmVkKEVOQUJMRV9CVk1FNjAwMF9ORVQpCisjaWZkZWYgRU5BQkxFX01WTUUxNnhfTkVUCisJaWYgKE1BQ0hfSVNfTVZNRTE2eCkgeworCQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpwY2MyID0gKHVuc2lnbmVkIGNoYXIgKikgMHhmZmY0MjAwMDsKKworCQkvKiBEaXNhYmxlIGFsbCBpbnRzIGZvciBub3cgKi8KKwkJcGNjMlsweDI4XSA9IDE7CisJCXBjYzJbMHgyYV0gPSAweDQ4OworCQkvKiBGb2xsb3dpbmcgZGlzYWJsZXMgc25vb3BpbmcuICBTbm9vcGluZyBpcyBub3QgcmVxdWlyZWQKKwkJICogYXMgd2UgbWFrZSBhcHByb3ByaWF0ZSB1c2Ugb2Ygbm9uLWNhY2hlZCBwYWdlcyBmb3IKKwkJICogc2hhcmVkIGRhdGEsIGFuZCBjYWNoZV9wdXNoL2NhY2hlX2NsZWFyLgorCQkgKi8KKwkJcGNjMlsweDJiXSA9IDB4MDg7CisJfQorI2VuZGlmCisjaWZkZWYgRU5BQkxFX0JWTUU2MDAwX05FVAorCWlmIChNQUNIX0lTX0JWTUU2MDAwKSB7CisJCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmV0aGlycSA9ICh1bnNpZ25lZCBjaGFyICopIEJWTUVfRVRISVJRX1JFRzsKKworCQkqZXRoaXJxID0gMTsKKwl9CisjZW5kaWYKKworCS8qIGNoYW5nZSB0aGUgc2NwIGFkZHJlc3MgKi8KKworCU1QVV9QT1JUKGRldiwgUE9SVF9BTFRTQ1AsICh2b2lkICopdmlydF90b19idXMoKHZvaWQgKikmbHAtPnNjcCkpOworCisjZWxpZiBkZWZpbmVkKEVOQUJMRV9BUFJJQ09UKQorCisJeworCQl1MzIgc2NwID0gdmlydF90b19idXMoJmxwLT5zY3ApOworCisJCS8qIGNoYW5nZSB0aGUgc2NwIGFkZHJlc3MgKi8KKwkJb3V0dygwLCBpb2FkZHIpOworCQlvdXR3KDAsIGlvYWRkcik7CisJCW91dGIoNCwgaW9hZGRyICsgMHhmKTsKKwkJb3V0dyhzY3AgfCAyLCBpb2FkZHIpOworCQlvdXR3KHNjcCA+PiAxNiwgaW9hZGRyKTsKKwl9CisjZW5kaWYKKworCWxwLT5sYXN0X2NtZCA9IGppZmZpZXM7CisKKyNpZmRlZiBFTkFCTEVfTVZNRTE2eF9ORVQKKwlpZiAoTUFDSF9JU19NVk1FMTZ4KQorCQlscC0+c2NwLnN5c2J1cyA9IDB4MDAwMDAwNTQ7CisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfQlZNRTYwMDBfTkVUCisJaWYgKE1BQ0hfSVNfQlZNRTYwMDApCisJCWxwLT5zY3Auc3lzYnVzID0gMHgwMDAwMDA0YzsKKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9BUFJJQ09UCisJaWYgKE1BQ0hfSVNfQVBSSUNPVCkKKwkJbHAtPnNjcC5zeXNidXMgPSAweDAwNDQwMDAwOworI2VuZGlmCisKKwlscC0+c2NwLmlzY3AgPSBXU1dBUGlzY3AodmlydF90b19idXMoKHZvaWQgKikmbHAtPmlzY3ApKTsKKwlscC0+aXNjcC5zY2IgPSBXU1dBUHNjYih2aXJ0X3RvX2J1cygodm9pZCAqKSZscC0+c2NiKSk7CisJbHAtPmlzY3Auc3RhdCA9IElTQ1BfQlVTWTsKKwlscC0+Y21kX2JhY2tsb2cgPSAwOworCisJbHAtPmNtZF9oZWFkID0gbHAtPnNjYi5jbWQgPSBJNTk2X05VTEw7CisKKyNpZmRlZiBFTkFCTEVfQlZNRTYwMDBfTkVUCisJaWYgKE1BQ0hfSVNfQlZNRTYwMDApIHsKKwkJbHAtPnNjYi50X29uICA9IDcgKiAyNTsKKwkJbHAtPnNjYi50X29mZiA9IDEgKiAyNTsKKwl9CisjZW5kaWYKKworCURFQihERUJfSU5JVCxwcmludGsoS0VSTl9ERUJVRyAiJXM6IHN0YXJ0aW5nIGk4MjU5Ni5cbiIsIGRldi0+bmFtZSkpOworCisjaWYgZGVmaW5lZChFTkFCTEVfQVBSSUNPVCkKKwkodm9pZCkgaW5iKGlvYWRkciArIDB4MTApOworCW91dGIoNCwgaW9hZGRyICsgMHhmKTsKKyNlbmRpZgorCUNBKGRldik7CisKKwlpZiAod2FpdF9pc3RhdChkZXYsbHAsMTAwMCwiaW5pdGlhbGl6YXRpb24gdGltZWQgb3V0IikpCisJCWdvdG8gZmFpbGVkOworCURFQihERUJfSU5JVCxwcmludGsoS0VSTl9ERUJVRyAiJXM6IGk4MjU5NiBpbml0aWFsaXphdGlvbiBzdWNjZXNzZnVsXG4iLCBkZXYtPm5hbWUpKTsKKworCS8qIEVuc3VyZSByeCBmcmFtZS9idWZmZXIgZGVzY3JpcHRvcnMgYXJlIHRpZHkgKi8KKwlyZWJ1aWxkX3J4X2J1ZnMoZGV2KTsKKwlscC0+c2NiLmNvbW1hbmQgPSAwOworCisjaWZkZWYgRU5BQkxFX01WTUUxNnhfTkVUCisJaWYgKE1BQ0hfSVNfTVZNRTE2eCkgeworCQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpwY2MyID0gKHVuc2lnbmVkIGNoYXIgKikgMHhmZmY0MjAwMDsKKworCQkvKiBFbmFibGUgaW50cywgZXRjLiBub3cgKi8KKwkJcGNjMlsweDJhXSA9IDB4NTU7CS8qIEVkZ2Ugc2Vuc2l0aXZlICovCisJCXBjYzJbMHgyYl0gPSAweDE1OworCX0KKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9CVk1FNjAwMF9ORVQKKwlpZiAoTUFDSF9JU19CVk1FNjAwMCkgeworCQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpldGhpcnEgPSAodW5zaWduZWQgY2hhciAqKSBCVk1FX0VUSElSUV9SRUc7CisKKwkJKmV0aGlycSA9IDM7CisJfQorI2VuZGlmCisKKworCURFQihERUJfSU5JVCxwcmludGsoS0VSTl9ERUJVRyAiJXM6IHF1ZXVpbmcgQ21kQ29uZmlndXJlXG4iLCBkZXYtPm5hbWUpKTsKKwltZW1jcHkobHAtPmNmX2NtZC5pNTk2X2NvbmZpZywgaW5pdF9zZXR1cCwgMTQpOworCWxwLT5jZl9jbWQuY21kLmNvbW1hbmQgPSBDbWRDb25maWd1cmU7CisJaTU5Nl9hZGRfY21kKGRldiwgJmxwLT5jZl9jbWQuY21kKTsKKworCURFQihERUJfSU5JVCxwcmludGsoS0VSTl9ERUJVRyAiJXM6IHF1ZXVpbmcgQ21kU0FTZXR1cFxuIiwgZGV2LT5uYW1lKSk7CisJbWVtY3B5KGxwLT5zYV9jbWQuZXRoX2FkZHIsIGRldi0+ZGV2X2FkZHIsIDYpOworCWxwLT5zYV9jbWQuY21kLmNvbW1hbmQgPSBDbWRTQVNldHVwOworCWk1OTZfYWRkX2NtZChkZXYsICZscC0+c2FfY21kLmNtZCk7CisKKwlERUIoREVCX0lOSVQscHJpbnRrKEtFUk5fREVCVUcgIiVzOiBxdWV1aW5nIENtZFREUlxuIiwgZGV2LT5uYW1lKSk7CisJbHAtPnRkcl9jbWQuY21kLmNvbW1hbmQgPSBDbWRURFI7CisJaTU5Nl9hZGRfY21kKGRldiwgJmxwLT50ZHJfY21kLmNtZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAod2FpdF9jbWQoZGV2LGxwLDEwMDAsInRpbWVkIG91dCB3YWl0aW5nIHRvIGlzc3VlIFJYX1NUQVJUIikpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmxwLT5sb2NrLCBmbGFncyk7CisJCWdvdG8gZmFpbGVkOworCX0KKwlERUIoREVCX0lOSVQscHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJc3N1aW5nIFJYX1NUQVJUXG4iLCBkZXYtPm5hbWUpKTsKKwlscC0+c2NiLmNvbW1hbmQgPSBSWF9TVEFSVDsKKwlDQShkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAod2FpdF9jbWQoZGV2LGxwLDEwMDAsIlJYX1NUQVJUIG5vdCBwcm9jZXNzZWQiKSkKKwkJZ290byBmYWlsZWQ7CisJREVCKERFQl9JTklULHByaW50ayhLRVJOX0RFQlVHICIlczogUmVjZWl2ZSB1bml0IHN0YXJ0ZWQgT0tcbiIsIGRldi0+bmFtZSkpOworCXJldHVybiAwOworCitmYWlsZWQ6CisJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IEZhaWxlZCB0byBpbml0aWFsaXNlIDgyNTk2XG4iLCBkZXYtPm5hbWUpOworCU1QVV9QT1JUKGRldiwgUE9SVF9SRVNFVCwgTlVMTCk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIGludCBpNTk2X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IGk1OTZfcmZkICpyZmQ7CisJc3RydWN0IGk1OTZfcmJkICpyYmQ7CisJaW50IGZyYW1lcyA9IDA7CisKKwlERUIoREVCX1JYRlJBTUUscHJpbnRrKEtFUk5fREVCVUcgImk1OTZfcngoKSwgcmZkX2hlYWQgJXAsIHJiZF9oZWFkICVwXG4iLAorCQkJbHAtPnJmZF9oZWFkLCBscC0+cmJkX2hlYWQpKTsKKworCXJmZCA9IGxwLT5yZmRfaGVhZDsJCS8qIFJlZiBuZXh0IGZyYW1lIHRvIGNoZWNrICovCisKKwl3aGlsZSAoKHJmZC0+c3RhdCkgJiBTVEFUX0MpIHsJLyogTG9vcCB3aGlsZSBjb21wbGV0ZSBmcmFtZXMgKi8KKwkJaWYgKHJmZC0+cmJkID09IEk1OTZfTlVMTCkKKwkJCXJiZCA9IEk1OTZfTlVMTDsKKwkJZWxzZSBpZiAocmZkLT5yYmQgPT0gbHAtPnJiZF9oZWFkLT5iX2FkZHIpCisJCQlyYmQgPSBscC0+cmJkX2hlYWQ7CisJCWVsc2UgeworCQkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IHJiZCBjaGFpbiBicm9rZW4hXG4iLCBkZXYtPm5hbWUpOworCQkJLyogWFhYIE5vdyB3aGF0PyAqLworCQkJcmJkID0gSTU5Nl9OVUxMOworCQl9CisJCURFQihERUJfUlhGUkFNRSwgcHJpbnRrKEtFUk5fREVCVUcgIiAgcmZkICVwLCByZmQucmJkICVwLCByZmQuc3RhdCAlMDR4XG4iLAorCQkJcmZkLCByZmQtPnJiZCwgcmZkLT5zdGF0KSk7CisJCQorCQlpZiAocmJkICE9IEk1OTZfTlVMTCAmJiAoKHJmZC0+c3RhdCkgJiBTVEFUX09LKSkgeworCQkJLyogYSBnb29kIGZyYW1lICovCisJCQlpbnQgcGt0X2xlbiA9IHJiZC0+Y291bnQgJiAweDNmZmY7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcmJkLT5za2I7CisJCQlpbnQgcnhfaW5fcGxhY2UgPSAwOworCisJCQlERUIoREVCX1JYQUREUixwcmludF9ldGgocmJkLT52X2RhdGEsICJyZWNlaXZlZCIpKTsKKwkJCWZyYW1lcysrOworCisJCQkvKiBDaGVjayBpZiB0aGUgcGFja2V0IGlzIGxvbmcgZW5vdWdoIHRvIGp1c3QgYWNjZXB0CisJCQkgKiB3aXRob3V0IGNvcHlpbmcgdG8gYSBwcm9wZXJseSBzaXplZCBza2J1ZmYuCisJCQkgKi8KKworCQkJaWYgKHBrdF9sZW4gPiByeF9jb3B5YnJlYWspIHsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiOworCisJCQkJLyogR2V0IGZyZXNoIHNrYnVmZiB0byByZXBsYWNlIGZpbGxlZCBvbmUuICovCisJCQkJbmV3c2tiID0gZGV2X2FsbG9jX3NrYihQS1RfQlVGX1NaKTsKKwkJCQlpZiAobmV3c2tiID09IE5VTEwpIHsKKwkJCQkJc2tiID0gTlVMTDsJLyogZHJvcCBwa3QgKi8KKwkJCQkJZ290byBtZW1vcnlfc3F1ZWV6ZTsKKwkJCQl9CisJCQkJLyogUGFzcyB1cCB0aGUgc2tiIGFscmVhZHkgb24gdGhlIFJ4IHJpbmcuICovCisJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJCXJ4X2luX3BsYWNlID0gMTsKKwkJCQlyYmQtPnNrYiA9IG5ld3NrYjsKKwkJCQluZXdza2ItPmRldiA9IGRldjsKKwkJCQlyYmQtPnZfZGF0YSA9IG5ld3NrYi0+dGFpbDsKKwkJCQlyYmQtPmJfZGF0YSA9IFdTV0FQY2hhcih2aXJ0X3RvX2J1cyhuZXdza2ItPnRhaWwpKTsKKyNpZmRlZiBfX21jNjgwMDBfXworCQkJCWNhY2hlX2NsZWFyKHZpcnRfdG9fcGh5cyhuZXdza2ItPnRhaWwpLCBQS1RfQlVGX1NaKTsKKyNlbmRpZgorCQkJfQorCQkJZWxzZQorCQkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpOworbWVtb3J5X3NxdWVlemU6CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQkvKiBYWFggdHVsaXAuYyBjYW4gZGVmZXIgcGFja2V0cyBoZXJlISEgKi8KKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaTU5Nl9yeCBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJfQorCQkJZWxzZSB7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJaWYgKCFyeF9pbl9wbGFjZSkgeworCQkJCQkvKiAxNiBieXRlIGFsaWduIHRoZSBkYXRhIGZpZWxkcyAqLworCQkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOworCQkJCQltZW1jcHkoc2tiX3B1dChza2IscGt0X2xlbiksIHJiZC0+dl9kYXRhLCBwa3RfbGVuKTsKKwkJCQl9CisJCQkJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJCQlza2ItPmxlbiA9IHBrdF9sZW47CisjaWZkZWYgX19tYzY4MDAwX18KKwkJCQljYWNoZV9jbGVhcih2aXJ0X3RvX3BoeXMocmJkLT5za2ItPnRhaWwpLAorCQkJCQkJcGt0X2xlbik7CisjZW5kaWYKKwkJCQluZXRpZl9yeChza2IpOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlscC0+c3RhdHMucnhfYnl0ZXMrPXBrdF9sZW47CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlERUIoREVCX0VSUk9SUywgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBFcnJvciwgcmZkLnN0YXQgPSAweCUwNHhcbiIsCisJCQkJCWRldi0+bmFtZSwgcmZkLT5zdGF0KSk7CisJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAoKHJmZC0+c3RhdCkgJiAweDAwMDEpCisJCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJCWlmICgocmZkLT5zdGF0KSAmIDB4MDA4MCkKKwkJCQlscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaWYgKChyZmQtPnN0YXQpICYgMHgwMTAwKQorCQkJCWxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJaWYgKChyZmQtPnN0YXQpICYgMHgwMjAwKQorCQkJCWxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJaWYgKChyZmQtPnN0YXQpICYgMHgwNDAwKQorCQkJCWxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmICgocmZkLT5zdGF0KSAmIDB4MDgwMCkKKwkJCQlscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJaWYgKChyZmQtPnN0YXQpICYgMHgxMDAwKQorCQkJCWxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCX0KKworCQkvKiBDbGVhciB0aGUgYnVmZmVyIGRlc2NyaXB0b3IgY291bnQgYW5kIEVPRiArIEYgZmxhZ3MgKi8KKworCQlpZiAocmJkICE9IEk1OTZfTlVMTCAmJiAocmJkLT5jb3VudCAmIDB4NDAwMCkpIHsKKwkJCXJiZC0+Y291bnQgPSAwOworCQkJbHAtPnJiZF9oZWFkID0gcmJkLT52X25leHQ7CisJCX0KKworCQkvKiBUaWR5IHRoZSBmcmFtZSBkZXNjcmlwdG9yLCBtYXJraW5nIGl0IGFzIGVuZCBvZiBsaXN0ICovCisKKwkJcmZkLT5yYmQgPSBJNTk2X05VTEw7CisJCXJmZC0+c3RhdCA9IDA7CisJCXJmZC0+Y21kID0gQ01EX0VPTHxDTURfRkxFWDsKKwkJcmZkLT5jb3VudCA9IDA7CisKKwkJLyogUmVtb3ZlIGVuZC1vZi1saXN0IGZyb20gb2xkIGVuZCBkZXNjcmlwdG9yICovCisKKwkJcmZkLT52X3ByZXYtPmNtZCA9IENNRF9GTEVYOworCisJCS8qIFVwZGF0ZSByZWNvcmQgb2YgbmV4dCBmcmFtZSBkZXNjcmlwdG9yIHRvIHByb2Nlc3MgKi8KKworCQlscC0+c2NiLnJmZCA9IHJmZC0+Yl9uZXh0OworCQlscC0+cmZkX2hlYWQgPSByZmQtPnZfbmV4dDsKKwkJcmZkID0gbHAtPnJmZF9oZWFkOworCX0KKworCURFQihERUJfUlhGUkFNRSxwcmludGsoS0VSTl9ERUJVRyAiZnJhbWVzICVkXG4iLCBmcmFtZXMpKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpNTk2X2NsZWFudXBfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwKQoreworCXN0cnVjdCBpNTk2X2NtZCAqcHRyOworCisJd2hpbGUgKGxwLT5jbWRfaGVhZCAhPSBJNTk2X05VTEwpIHsKKwkJcHRyID0gbHAtPmNtZF9oZWFkOworCQlscC0+Y21kX2hlYWQgPSBwdHItPnZfbmV4dDsKKwkJbHAtPmNtZF9iYWNrbG9nLS07CisKKwkJc3dpdGNoICgocHRyLT5jb21tYW5kKSAmIDB4NykgeworCQljYXNlIENtZFR4OgorCQkJeworCQkJCXN0cnVjdCB0eF9jbWQgKnR4X2NtZCA9IChzdHJ1Y3QgdHhfY21kICopIHB0cjsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHhfY21kLT5za2I7CisKKwkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwkJCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisKKwkJCQlwdHItPnZfbmV4dCA9IHB0ci0+Yl9uZXh0ID0gSTU5Nl9OVUxMOworCQkJCXR4X2NtZC0+Y21kLmNvbW1hbmQgPSAwOyAgLyogTWFyayBhcyBmcmVlICovCisJCQkJYnJlYWs7CisJCQl9CisJCWRlZmF1bHQ6CisJCQlwdHItPnZfbmV4dCA9IHB0ci0+Yl9uZXh0ID0gSTU5Nl9OVUxMOworCQl9CisJfQorCisJd2FpdF9jbWQoZGV2LGxwLDEwMCwiaTU5Nl9jbGVhbnVwX2NtZCB0aW1lZCBvdXQiKTsKKwlscC0+c2NiLmNtZCA9IEk1OTZfTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGk1OTZfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAsIGludCBpb2FkZHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURFQihERUJfUkVTRVQscHJpbnRrKEtFUk5fREVCVUcgImk1OTZfcmVzZXRcbiIpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXdhaXRfY21kKGRldixscCwxMDAsImk1OTZfcmVzZXQgdGltZWQgb3V0Iik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlscC0+c2NiLmNvbW1hbmQgPSBDVUNfQUJPUlQgfCBSWF9BQk9SVDsKKwlDQShkZXYpOworCisJLyogd2FpdCBmb3Igc2h1dGRvd24gKi8KKwl3YWl0X2NtZChkZXYsbHAsMTAwMCwiaTU5Nl9yZXNldCAyIHRpbWVkIG91dCIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZscC0+bG9jaywgZmxhZ3MpOworCisJaTU5Nl9jbGVhbnVwX2NtZChkZXYsbHApOworCWk1OTZfcngoZGV2KTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJaW5pdF9pNTk2X21lbShkZXYpOworfQorCitzdGF0aWMgdm9pZCBpNTk2X2FkZF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGk1OTZfY21kICpjbWQpCit7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlERUIoREVCX0FERENNRCxwcmludGsoS0VSTl9ERUJVRyAiaTU5Nl9hZGRfY21kXG4iKSk7CisKKwljbWQtPnN0YXR1cyA9IDA7CisJY21kLT5jb21tYW5kIHw9IChDTURfRU9MIHwgQ01EX0lOVFIpOworCWNtZC0+dl9uZXh0ID0gY21kLT5iX25leHQgPSBJNTk2X05VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAobHAtPmNtZF9oZWFkICE9IEk1OTZfTlVMTCkgeworCQlscC0+Y21kX3RhaWwtPnZfbmV4dCA9IGNtZDsKKwkJbHAtPmNtZF90YWlsLT5iX25leHQgPSBXU1dBUGNtZCh2aXJ0X3RvX2J1cygmY21kLT5zdGF0dXMpKTsKKwl9IGVsc2UgeworCQlscC0+Y21kX2hlYWQgPSBjbWQ7CisJCXdhaXRfY21kKGRldixscCwxMDAsImk1OTZfYWRkX2NtZCB0aW1lZCBvdXQiKTsKKwkJbHAtPnNjYi5jbWQgPSBXU1dBUGNtZCh2aXJ0X3RvX2J1cygmY21kLT5zdGF0dXMpKTsKKwkJbHAtPnNjYi5jb21tYW5kID0gQ1VDX1NUQVJUOworCQlDQShkZXYpOworCX0KKwlscC0+Y21kX3RhaWwgPSBjbWQ7CisJbHAtPmNtZF9iYWNrbG9nKys7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmbHAtPmxvY2ssIGZsYWdzKTsKKworCWlmIChscC0+Y21kX2JhY2tsb2cgPiBtYXhfY21kX2JhY2tsb2cpIHsKKwkJdW5zaWduZWQgbG9uZyB0aWNrc3NvZmFyID0gamlmZmllcyAtIGxwLT5sYXN0X2NtZDsKKworCQlpZiAodGlja3Nzb2ZhciA8IHRpY2tzX2xpbWl0KQorCQkJcmV0dXJuOworCisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGNvbW1hbmQgdW5pdCB0aW1lZCBvdXQsIHN0YXR1cyByZXNldHRpbmcuXG4iLCBkZXYtPm5hbWUpOworCisJCWk1OTZfcmVzZXQoZGV2LCBscCwgaW9hZGRyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaTU5Nl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJlcyA9IDA7CisKKwlERUIoREVCX09QRU4scHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpNTk2X29wZW4oKSBpcnEgJWQuXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKSk7CisKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGk1OTZfaW50ZXJydXB0LCAwLCAiaTgyNTk2IiwgZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJUlEgJWQgbm90IGZyZWVcbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisjaWZkZWYgRU5BQkxFX01WTUUxNnhfTkVUCisJaWYgKE1BQ0hfSVNfTVZNRTE2eCkgeworCQlpZiAocmVxdWVzdF9pcnEoMHg1NiwgaTU5Nl9lcnJvciwgMCwgImk4MjU5Nl9lcnJvciIsIGRldikpCisJCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisjZW5kaWYKKwlpbml0X3J4X2J1ZnMoZGV2KTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwkvKiBJbml0aWFsaXplIHRoZSA4MjU5NiBtZW1vcnkgKi8KKwlpZiAoaW5pdF9pNTk2X21lbShkZXYpKSB7CisJCXJlcyA9IC1FQUdBSU47CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCX0KKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIGk1OTZfdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwkvKiBUcmFuc21pdHRlciB0aW1lb3V0LCBzZXJpb3VzIHByb2JsZW1zLiAqLworCURFQihERUJfRVJST1JTLHByaW50ayhLRVJOX0VSUiAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzIHJlc2V0dGluZy5cbiIsCisJCQlkZXYtPm5hbWUpKTsKKworCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKworCS8qIFRyeSB0byByZXN0YXJ0IHRoZSBhZGFwdG9yICovCisJaWYgKGxwLT5sYXN0X3Jlc3RhcnQgPT0gbHAtPnN0YXRzLnR4X3BhY2tldHMpIHsKKwkJREVCKERFQl9FUlJPUlMscHJpbnRrKEtFUk5fRVJSICJSZXNldHRpbmcgYm9hcmQuXG4iKSk7CisJCS8qIFNodXRkb3duIGFuZCByZXN0YXJ0ICovCisJCWk1OTZfcmVzZXQgKGRldiwgbHAsIGlvYWRkcik7CisJfSBlbHNlIHsKKwkJLyogSXNzdWUgYSBjaGFubmVsIGF0dGVudGlvbiBzaWduYWwgKi8KKwkJREVCKERFQl9FUlJPUlMscHJpbnRrKEtFUk5fRVJSICJLaWNraW5nIGJvYXJkLlxuIikpOworCQlscC0+c2NiLmNvbW1hbmQgPSBDVUNfU1RBUlQgfCBSWF9TVEFSVDsKKwkJQ0EgKGRldik7CisJCWxwLT5sYXN0X3Jlc3RhcnQgPSBscC0+c3RhdHMudHhfcGFja2V0czsKKwl9CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworfQorCisKK3N0YXRpYyBpbnQgaTU5Nl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IHR4X2NtZCAqdHhfY21kOworCXN0cnVjdCBpNTk2X3RiZCAqdGJkOworCXNob3J0IGxlbmd0aCA9IHNrYi0+bGVuOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJREVCKERFQl9TVEFSVFRYLHByaW50ayhLRVJOX0RFQlVHICIlczogaTU5Nl9zdGFydF94bWl0KCV4LCV4KSBjYWxsZWRcbiIsIGRldi0+bmFtZSwKKwkJCQlza2ItPmxlbiwgKHVuc2lnbmVkIGludClza2ItPmRhdGEpKTsKKworCWlmIChza2ItPmxlbiA8IEVUSF9aTEVOKSB7CisJCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCWxlbmd0aCA9IEVUSF9aTEVOOworCX0KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwl0eF9jbWQgPSBscC0+dHhfY21kcyArIGxwLT5uZXh0X3R4X2NtZDsKKwl0YmQgPSBscC0+dGJkcyArIGxwLT5uZXh0X3R4X2NtZDsKKworCWlmICh0eF9jbWQtPmNtZC5jb21tYW5kKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHhtaXQgcmluZyBmdWxsLCBkcm9wcGluZyBwYWNrZXQuXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCWxwLT5zdGF0cy50eF9kcm9wcGVkKys7CisKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0gZWxzZSB7CisJCWlmICgrK2xwLT5uZXh0X3R4X2NtZCA9PSBUWF9SSU5HX1NJWkUpCisJCQlscC0+bmV4dF90eF9jbWQgPSAwOworCQl0eF9jbWQtPnRiZCA9IFdTV0FQdGJkKHZpcnRfdG9fYnVzKHRiZCkpOworCQl0YmQtPm5leHQgPSBJNTk2X05VTEw7CisKKwkJdHhfY21kLT5jbWQuY29tbWFuZCA9IENNRF9GTEVYIHwgQ21kVHg7CisJCXR4X2NtZC0+c2tiID0gc2tiOworCisJCXR4X2NtZC0+cGFkID0gMDsKKwkJdHhfY21kLT5zaXplID0gMDsKKwkJdGJkLT5wYWQgPSAwOworCQl0YmQtPnNpemUgPSBFT0YgfCBsZW5ndGg7CisKKwkJdGJkLT5kYXRhID0gV1NXQVBjaGFyKHZpcnRfdG9fYnVzKHNrYi0+ZGF0YSkpOworCisjaWZkZWYgX19tYzY4MDAwX18KKwkJY2FjaGVfcHVzaCh2aXJ0X3RvX3BoeXMoc2tiLT5kYXRhKSwgbGVuZ3RoKTsKKyNlbmRpZgorCQlERUIoREVCX1RYQUREUixwcmludF9ldGgoc2tiLT5kYXRhLCAidHgtcXVldWVkIikpOworCQlpNTk2X2FkZF9jbWQoZGV2LCAmdHhfY21kLT5jbWQpOworCisJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCWxwLT5zdGF0cy50eF9ieXRlcyArPSBsZW5ndGg7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcmludF9ldGgodW5zaWduZWQgY2hhciAqYWRkLCBjaGFyICpzdHIpCit7CisJaW50IGk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiaTU5NiAweCVwLCAiLCBhZGQpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiICUwMlgiLCBhZGRbaSArIDZdKTsKKwlwcmludGsoIiAtLT4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiAlMDJYIiwgYWRkW2ldKTsKKwlwcmludGsoIiAlMDJYJTAyWCwgJXNcbiIsIGFkZFsxMl0sIGFkZFsxM10sIHN0cik7Cit9CisKK3N0YXRpYyBpbnQgaW8gPSAweDMwMDsKK3N0YXRpYyBpbnQgaXJxID0gMTA7CisKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGk4MjU5Nl9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpOworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwOworCWNoYXIgZXRoX2FkZHJbOF07CisJc3RhdGljIGludCBwcm9iZWQ7CisJaW50IGVycjsKKworCWlmIChwcm9iZWQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCXByb2JlZCsrOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoMCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWYgKHVuaXQgPj0gMCkgeworCQlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisJfSBlbHNlIHsKKwkJZGV2LT5iYXNlX2FkZHIgPSBpbzsKKwkJZGV2LT5pcnEgPSBpcnE7CisJfQorCisjaWZkZWYgRU5BQkxFX01WTUUxNnhfTkVUCisJaWYgKE1BQ0hfSVNfTVZNRTE2eCkgeworCQlpZiAobXZtZTE2eF9jb25maWcgJiBNVk1FMTZ4X0NPTkZJR19OT19FVEhFUk5FVCkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJFdGhlcm5ldCBwcm9iZSBkaXNhYmxlZCAtIGNoaXAgbm90IHByZXNlbnRcbiIpOworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0OworCQl9CisJCW1lbWNweShldGhfYWRkciwgKHZvaWQgKikgMHhmZmZjMWYyYywgNik7CS8qIFlVQ0shIEdldCBhZGRyIGZyb20gTk9WUkFNICovCisJCWRldi0+YmFzZV9hZGRyID0gTVZNRV9JNTk2X0JBU0U7CisJCWRldi0+aXJxID0gKHVuc2lnbmVkKSBNVk1FMTZ4X0lSUV9JNTk2OworCX0KKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9CVk1FNjAwMF9ORVQKKwlpZiAoTUFDSF9JU19CVk1FNjAwMCkgeworCQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpydGMgPSAodW5zaWduZWQgY2hhciAqKSBCVk1FX1JUQ19CQVNFOworCQl1bnNpZ25lZCBjaGFyIG1zciA9IHJ0Y1szXTsKKwkJaW50IGk7CisKKwkJcnRjWzNdIHw9IDB4ODA7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlldGhfYWRkcltpXSA9IHJ0Y1tpICogNCArIDddOwkvKiBTdG9yZWQgaW4gUlRDIFJBTSBhdCBvZmZzZXQgMSAqLworCQlydGNbM10gPSBtc3I7CisJCWRldi0+YmFzZV9hZGRyID0gQlZNRV9JNTk2X0JBU0U7CisJCWRldi0+aXJxID0gKHVuc2lnbmVkKSBCVk1FX0lSUV9JNTk2OworCX0KKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9BUFJJQ09UCisJeworCQlpbnQgY2hlY2tzdW0gPSAwOworCQlpbnQgaW9hZGRyID0gMHgzMDA7CisKKwkJLyogdGhpcyBpcyBlYXN5IHRoZSBldGhlcm5ldCBpbnRlcmZhY2UgY2FuIG9ubHkgYmUgYXQgMHgzMDAgKi8KKwkJLyogZmlyc3QgY2hlY2sgbm90aGluZyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgaGVyZSAqLworCisJCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBJNTk2X1RPVEFMX1NJWkUsIERSVl9OQU1FKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICI4MjU5NjogSU8gYWRkcmVzcyAweCUwNHggaW4gdXNlXG4iLCBpb2FkZHIpOworCQkJZXJyID0gLUVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlldGhfYWRkcltpXSA9IGluYihpb2FkZHIgKyA4ICsgaSk7CisJCQljaGVja3N1bSArPSBldGhfYWRkcltpXTsKKwkJfQorCisJCS8qIGNoZWNrc3VtIGlzIGEgbXVsdGlwbGUgb2YgMHgxMDAsIGdvdCB0aGlzIHdyb25nIGZpcnN0IHRpbWUKKwkJICAgc29tZSBtYWNoaW5lcyBoYXZlIDB4MTAwLCBzb21lIDB4MjAwLiBUaGUgRE9TIGRyaXZlciBkb2Vzbid0CisJCSAgIGV2ZW4gYm90aGVyIHdpdGggdGhlIGNoZWNrc3VtLgorCQkgICBTb21lIG90aGVyIGJvYXJkcyB0cmlwIHRoZSBjaGVja3N1bS4uIGJ1dCB0aGVuIGFwcGVhciBhcworCQkgICBldGhlciBhZGRyZXNzIDAuIFRyYXAgdGhlc2UgLSBBQyAqLworCisJCWlmICgoY2hlY2tzdW0gJSAweDEwMCkgfHwgCisJCSAgICAobWVtY21wKGV0aF9hZGRyLCAiXHgwMFx4MDBceDQ5IiwgMykgIT0gMCkpIHsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIG91dDE7CisJCX0KKworCQlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwkJZGV2LT5pcnEgPSAxMDsKKwl9CisjZW5kaWYKKwlkZXYtPm1lbV9zdGFydCA9IChpbnQpX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlDLCAwKTsKKwlpZiAoIWRldi0+bWVtX3N0YXJ0KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0MTsKKwl9CisKKwlERUIoREVCX1BST0JFLHByaW50ayhLRVJOX0lORk8gIiVzOiA4MjU5NiBhdCAlIzNseCwiLCBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlERUIoREVCX1BST0JFLHByaW50aygiICUyLjJYIiwgZGV2LT5kZXZfYWRkcltpXSA9IGV0aF9hZGRyW2ldKSk7CisKKwlERUIoREVCX1BST0JFLHByaW50aygiIElSUSAlZC5cbiIsIGRldi0+aXJxKSk7CisKKwlERUIoREVCX1BST0JFLHByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbikpOworCisJLyogVGhlIDgyNTk2LXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWRldi0+b3BlbiA9IGk1OTZfb3BlbjsKKwlkZXYtPnN0b3AgPSBpNTk2X2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaTU5Nl9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gaTU5Nl9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT50eF90aW1lb3V0ID0gaTU5Nl90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCisJZGV2LT5wcml2ID0gKHZvaWQgKikoZGV2LT5tZW1fc3RhcnQpOworCisJbHAgPSBkZXYtPnByaXY7CisJREVCKERFQl9JTklULHByaW50ayhLRVJOX0RFQlVHICIlczogbHAgYXQgMHglMDhseCAoJWQgYnl0ZXMpLCBscC0+c2NiIGF0IDB4JTA4bHhcbiIsCisJCQlkZXYtPm5hbWUsICh1bnNpZ25lZCBsb25nKWxwLAorCQkJc2l6ZW9mKHN0cnVjdCBpNTk2X3ByaXZhdGUpLCAodW5zaWduZWQgbG9uZykmbHAtPnNjYikpOworCW1lbXNldCgodm9pZCAqKSBscCwgMCwgc2l6ZW9mKHN0cnVjdCBpNTk2X3ByaXZhdGUpKTsKKworI2lmZGVmIF9fbWM2ODAwMF9fCisJY2FjaGVfcHVzaCh2aXJ0X3RvX3BoeXMoKHZvaWQgKikoZGV2LT5tZW1fc3RhcnQpKSwgNDA5Nik7CisJY2FjaGVfY2xlYXIodmlydF90b19waHlzKCh2b2lkICopKGRldi0+bWVtX3N0YXJ0KSksIDQwOTYpOworCWtlcm5lbF9zZXRfY2FjaGVtb2RlKCh2b2lkICopKGRldi0+bWVtX3N0YXJ0KSwgNDA5NiwgSU9NQVBfTk9DQUNIRV9TRVIpOworI2VuZGlmCisJbHAtPnNjYi5jb21tYW5kID0gMDsKKwlscC0+c2NiLmNtZCA9IEk1OTZfTlVMTDsKKwlscC0+c2NiLnJmZCA9IEk1OTZfTlVMTDsKKwlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQyOworCXJldHVybiBkZXY7CitvdXQyOgorI2lmZGVmIF9fbWM2ODAwMF9fCisJLyogWFhYIFRoaXMgYXNzdW1lcyBkZWZhdWx0IGNhY2hlIG1vZGUgdG8gYmUgSU9NQVBfRlVMTF9DQUNISU5HLAorCSAqIFhYWCB3aGljaCBtYXkgYmUgaW52YWxpZCAoQ09ORklHXzA2MF9XUklURVRIUk9VR0gpCisJICovCisJa2VybmVsX3NldF9jYWNoZW1vZGUoKHZvaWQgKikoZGV2LT5tZW1fc3RhcnQpLCA0MDk2LAorCQkJSU9NQVBfRlVMTF9DQUNISU5HKTsKKyNlbmRpZgorCWZyZWVfcGFnZSAoKHUzMikoZGV2LT5tZW1fc3RhcnQpKTsKK291dDE6CisjaWZkZWYgRU5BQkxFX0FQUklDT1QKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgSTU5Nl9UT1RBTF9TSVpFKTsKKyNlbmRpZgorb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGk1OTZfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscDsKKwlzaG9ydCBpb2FkZHI7CisJdW5zaWduZWQgc2hvcnQgc3RhdHVzLCBhY2tfY21kID0gMDsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKyNpZmRlZiBFTkFCTEVfQlZNRTYwMDBfTkVUCisJaWYgKE1BQ0hfSVNfQlZNRTYwMDApIHsKKwkJaWYgKCooY2hhciAqKSBCVk1FX0xPQ0FMX0lSUV9TVEFUICYgQlZNRV9FVEhFUlIpIHsKKwkJCWk1OTZfZXJyb3IoaXJxLCBkZXZfaWQsIHJlZ3MpOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisJfQorI2VuZGlmCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaTU5Nl9pbnRlcnJ1cHQoKTogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlscCA9IGRldi0+cHJpdjsKKworCXNwaW5fbG9jayAoJmxwLT5sb2NrKTsKKworCXdhaXRfY21kKGRldixscCwxMDAsImk1OTYgaW50ZXJydXB0LCB0aW1lb3V0Iik7CisJc3RhdHVzID0gbHAtPnNjYi5zdGF0dXM7CisKKwlERUIoREVCX0lOVFMscHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpNTk2IGludGVycnVwdCwgSVJRICVkLCBzdGF0dXMgJTQuNHguXG4iLAorCQkJZGV2LT5uYW1lLCBpcnEsIHN0YXR1cykpOworCisJYWNrX2NtZCA9IHN0YXR1cyAmIDB4ZjAwMDsKKworCWlmICgoc3RhdHVzICYgMHg4MDAwKSB8fCAoc3RhdHVzICYgMHgyMDAwKSkgeworCQlzdHJ1Y3QgaTU5Nl9jbWQgKnB0cjsKKworCQloYW5kbGVkID0gMTsKKwkJaWYgKChzdGF0dXMgJiAweDgwMDApKQorCQkJREVCKERFQl9JTlRTLHByaW50ayhLRVJOX0RFQlVHICIlczogaTU5NiBpbnRlcnJ1cHQgY29tcGxldGVkIGNvbW1hbmQuXG4iLCBkZXYtPm5hbWUpKTsKKwkJaWYgKChzdGF0dXMgJiAweDIwMDApKQorCQkJREVCKERFQl9JTlRTLHByaW50ayhLRVJOX0RFQlVHICIlczogaTU5NiBpbnRlcnJ1cHQgY29tbWFuZCB1bml0IGluYWN0aXZlICV4LlxuIiwgZGV2LT5uYW1lLCBzdGF0dXMgJiAweDA3MDApKTsKKworCQl3aGlsZSAoKGxwLT5jbWRfaGVhZCAhPSBJNTk2X05VTEwpICYmIChscC0+Y21kX2hlYWQtPnN0YXR1cyAmIFNUQVRfQykpIHsKKwkJCXB0ciA9IGxwLT5jbWRfaGVhZDsKKworCQkJREVCKERFQl9TVEFUVVMscHJpbnRrKEtFUk5fREVCVUcgImNtZF9oZWFkLT5zdGF0dXMgPSAlMDR4LCAtPmNvbW1hbmQgPSAlMDR4XG4iLAorCQkJCSAgICAgICBscC0+Y21kX2hlYWQtPnN0YXR1cywgbHAtPmNtZF9oZWFkLT5jb21tYW5kKSk7CisJCQlscC0+Y21kX2hlYWQgPSBwdHItPnZfbmV4dDsKKwkJCWxwLT5jbWRfYmFja2xvZy0tOworCisJCQlzd2l0Y2ggKChwdHItPmNvbW1hbmQpICYgMHg3KSB7CisJCQljYXNlIENtZFR4OgorCQkJICAgIHsKKwkJCQlzdHJ1Y3QgdHhfY21kICp0eF9jbWQgPSAoc3RydWN0IHR4X2NtZCAqKSBwdHI7CisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4X2NtZC0+c2tiOworCisJCQkJaWYgKChwdHItPnN0YXR1cykgJiBTVEFUX09LKSB7CisJCQkJCURFQihERUJfVFhBRERSLHByaW50X2V0aChza2ItPmRhdGEsICJ0eC1kb25lIikpOworCQkJCX0gZWxzZSB7CisJCQkJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQkJaWYgKChwdHItPnN0YXR1cykgJiAweDAwMjApCisJCQkJCQlscC0+c3RhdHMuY29sbGlzaW9ucysrOworCQkJCQlpZiAoISgocHRyLT5zdGF0dXMpICYgMHgwMDQwKSkKKwkJCQkJCWxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCQkJCWlmICgocHRyLT5zdGF0dXMpICYgMHgwNDAwKQorCQkJCQkJbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJCWlmICgocHRyLT5zdGF0dXMpICYgMHgwODAwKQorCQkJCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJCQkJaWYgKChwdHItPnN0YXR1cykgJiAweDEwMDApCisJCQkJCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQl9CisKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCisJCQkJdHhfY21kLT5jbWQuY29tbWFuZCA9IDA7IC8qIE1hcmsgZnJlZSAqLworCQkJCWJyZWFrOworCQkJICAgIH0KKwkJCWNhc2UgQ21kVERSOgorCQkJICAgIHsKKwkJCQl1bnNpZ25lZCBzaG9ydCBzdGF0dXMgPSAoKHN0cnVjdCB0ZHJfY21kICopcHRyKS0+c3RhdHVzOworCisJCQkJaWYgKHN0YXR1cyAmIDB4ODAwMCkgeworCQkJCQlERUIoREVCX1REUixwcmludGsoS0VSTl9JTkZPICIlczogbGluayBvay5cbiIsIGRldi0+bmFtZSkpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChzdGF0dXMgJiAweDQwMDApCisJCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUcmFuc2NlaXZlciBwcm9ibGVtLlxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJaWYgKHN0YXR1cyAmIDB4MjAwMCkKKwkJCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRlcm1pbmF0aW9uIHByb2JsZW0uXG4iLCBkZXYtPm5hbWUpOworCQkJCQlpZiAoc3RhdHVzICYgMHgxMDAwKQorCQkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogU2hvcnQgY2lyY3VpdC5cbiIsIGRldi0+bmFtZSk7CisKKwkJCQkJREVCKERFQl9URFIscHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRpbWUgJWQuXG4iLCBkZXYtPm5hbWUsIHN0YXR1cyAmIDB4MDdmZikpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCSAgICB9CisJCQljYXNlIENtZENvbmZpZ3VyZToKKwkJCWNhc2UgQ21kTXVsdGljYXN0TGlzdDoKKwkJCQkvKiBaYXAgY29tbWFuZCBzbyBzZXRfbXVsdGljYXN0X2xpc3QoKSBrbm93cyBpdCBpcyBmcmVlICovCisJCQkJcHRyLT5jb21tYW5kID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXB0ci0+dl9uZXh0ID0gcHRyLT5iX25leHQgPSBJNTk2X05VTEw7CisJCQlscC0+bGFzdF9jbWQgPSBqaWZmaWVzOworCQl9CisKKwkJcHRyID0gbHAtPmNtZF9oZWFkOworCQl3aGlsZSAoKHB0ciAhPSBJNTk2X05VTEwpICYmIChwdHIgIT0gbHAtPmNtZF90YWlsKSkgeworCQkJcHRyLT5jb21tYW5kICY9IDB4MWZmZjsKKwkJCXB0ciA9IHB0ci0+dl9uZXh0OworCQl9CisKKwkJaWYgKChscC0+Y21kX2hlYWQgIT0gSTU5Nl9OVUxMKSkKKwkJCWFja19jbWQgfD0gQ1VDX1NUQVJUOworCQlscC0+c2NiLmNtZCA9IFdTV0FQY21kKHZpcnRfdG9fYnVzKCZscC0+Y21kX2hlYWQtPnN0YXR1cykpOworCX0KKwlpZiAoKHN0YXR1cyAmIDB4MTAwMCkgfHwgKHN0YXR1cyAmIDB4NDAwMCkpIHsKKwkJaWYgKChzdGF0dXMgJiAweDQwMDApKQorCQkJREVCKERFQl9JTlRTLHByaW50ayhLRVJOX0RFQlVHICIlczogaTU5NiBpbnRlcnJ1cHQgcmVjZWl2ZWQgYSBmcmFtZS5cbiIsIGRldi0+bmFtZSkpOworCQlpNTk2X3J4KGRldik7CisJCS8qIE9ubHkgUlhfU1RBUlQgaWYgc3RvcHBlZCAtIFJHSCAwNy0wNy05NiAqLworCQlpZiAoc3RhdHVzICYgMHgxMDAwKSB7CisJCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCQkJREVCKERFQl9FUlJPUlMscHJpbnRrKEtFUk5fRVJSICIlczogaTU5NiBpbnRlcnJ1cHQgcmVjZWl2ZSB1bml0IGluYWN0aXZlLCBzdGF0dXMgMHgleFxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpKTsKKwkJCQlhY2tfY21kIHw9IFJYX1NUQVJUOworCQkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCQlyZWJ1aWxkX3J4X2J1ZnMoZGV2KTsKKwkJCX0KKwkJfQorCX0KKwl3YWl0X2NtZChkZXYsbHAsMTAwLCJpNTk2IGludGVycnVwdCwgdGltZW91dCIpOworCWxwLT5zY2IuY29tbWFuZCA9IGFja19jbWQ7CisKKyNpZmRlZiBFTkFCTEVfTVZNRTE2eF9ORVQKKwlpZiAoTUFDSF9JU19NVk1FMTZ4KSB7CisJCS8qIEFjayB0aGUgaW50ZXJydXB0ICovCisKKwkJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqcGNjMiA9ICh1bnNpZ25lZCBjaGFyICopIDB4ZmZmNDIwMDA7CisKKwkJcGNjMlsweDJhXSB8PSAweDA4OworCX0KKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9CVk1FNjAwMF9ORVQKKwlpZiAoTUFDSF9JU19CVk1FNjAwMCkgeworCQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpldGhpcnEgPSAodW5zaWduZWQgY2hhciAqKSBCVk1FX0VUSElSUV9SRUc7CisKKwkJKmV0aGlycSA9IDE7CisJCSpldGhpcnEgPSAzOworCX0KKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9BUFJJQ09UCisJKHZvaWQpIGluYihpb2FkZHIgKyAweDEwKTsKKwlvdXRiKDQsIGlvYWRkciArIDB4Zik7CisjZW5kaWYKKwlDQShkZXYpOworCisJREVCKERFQl9JTlRTLHByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBpbnRlcnJ1cHQuXG4iLCBkZXYtPm5hbWUpKTsKKworCXNwaW5fdW5sb2NrICgmbHAtPmxvY2spOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgaW50IGk1OTZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJREVCKERFQl9JTklULHByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQsIHN0YXR1cyB3YXMgJTQuNHguXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBscC0+c2NiLnN0YXR1cykpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwl3YWl0X2NtZChkZXYsbHAsMTAwLCJjbG9zZTEgdGltZWQgb3V0Iik7CisJbHAtPnNjYi5jb21tYW5kID0gQ1VDX0FCT1JUIHwgUlhfQUJPUlQ7CisJQ0EoZGV2KTsKKworCXdhaXRfY21kKGRldixscCwxMDAsImNsb3NlMiB0aW1lZCBvdXQiKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisJREVCKERFQl9TVFJVQ1QsaTU5Nl9kaXNwbGF5X2RhdGEoZGV2KSk7CisJaTU5Nl9jbGVhbnVwX2NtZChkZXYsbHApOworCisjaWZkZWYgRU5BQkxFX01WTUUxNnhfTkVUCisJaWYgKE1BQ0hfSVNfTVZNRTE2eCkgeworCQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpwY2MyID0gKHVuc2lnbmVkIGNoYXIgKikgMHhmZmY0MjAwMDsKKworCQkvKiBEaXNhYmxlIGFsbCBpbnRzICovCisJCXBjYzJbMHgyOF0gPSAxOworCQlwY2MyWzB4MmFdID0gMHg0MDsKKwkJcGNjMlsweDJiXSA9IDB4NDA7CS8qIFNldCBzbm9vcGluZyBiaXRzIG5vdyEgKi8KKwl9CisjZW5kaWYKKyNpZmRlZiBFTkFCTEVfQlZNRTYwMDBfTkVUCisJaWYgKE1BQ0hfSVNfQlZNRTYwMDApIHsKKwkJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqZXRoaXJxID0gKHVuc2lnbmVkIGNoYXIgKikgQlZNRV9FVEhJUlFfUkVHOworCisJCSpldGhpcnEgPSAxOworCX0KKyNlbmRpZgorCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmVtb3ZlX3J4X2J1ZnMoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgorIGk1OTZfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworLyoKKyAqICAgIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICovCisKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCWludCBjb25maWcgPSAwLCBjbnQ7CisKKwlERUIoREVCX01VTFRJLHByaW50ayhLRVJOX0RFQlVHICIlczogc2V0IG11bHRpY2FzdCBsaXN0LCAlZCBlbnRyaWVzLCBwcm9taXNjICVzLCBhbGxtdWx0aSAlc1xuIiwKKwkJZGV2LT5uYW1lLCBkZXYtPm1jX2NvdW50LAorCQlkZXYtPmZsYWdzICYgSUZGX1BST01JU0MgID8gIk9OIiA6ICJPRkYiLAorCQlkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJID8gIk9OIiA6ICJPRkYiKSk7CisKKwlpZiAod2FpdF9jZmcoZGV2LCAmbHAtPmNmX2NtZC5jbWQsIDEwMDAsICJjb25maWcgY2hhbmdlIHJlcXVlc3QgdGltZWQgb3V0IikpCisJCXJldHVybjsKKworCWlmICgoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSAmJiAhKGxwLT5jZl9jbWQuaTU5Nl9jb25maWdbOF0gJiAweDAxKSkgeworCQlscC0+Y2ZfY21kLmk1OTZfY29uZmlnWzhdIHw9IDB4MDE7CisJCWNvbmZpZyA9IDE7CisJfQorCWlmICghKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgJiYgKGxwLT5jZl9jbWQuaTU5Nl9jb25maWdbOF0gJiAweDAxKSkgeworCQlscC0+Y2ZfY21kLmk1OTZfY29uZmlnWzhdICY9IH4weDAxOworCQljb25maWcgPSAxOworCX0KKwlpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpICYmIChscC0+Y2ZfY21kLmk1OTZfY29uZmlnWzExXSAmIDB4MjApKSB7CisJCWxwLT5jZl9jbWQuaTU5Nl9jb25maWdbMTFdICY9IH4weDIwOworCQljb25maWcgPSAxOworCX0KKwlpZiAoIShkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSAmJiAhKGxwLT5jZl9jbWQuaTU5Nl9jb25maWdbMTFdICYgMHgyMCkpIHsKKwkJbHAtPmNmX2NtZC5pNTk2X2NvbmZpZ1sxMV0gfD0gMHgyMDsKKwkJY29uZmlnID0gMTsKKwl9CisJaWYgKGNvbmZpZykgeworCQlscC0+Y2ZfY21kLmNtZC5jb21tYW5kID0gQ21kQ29uZmlndXJlOworCQlpNTk2X2FkZF9jbWQoZGV2LCAmbHAtPmNmX2NtZC5jbWQpOworCX0KKworCWNudCA9IGRldi0+bWNfY291bnQ7CisJaWYgKGNudCA+IE1BWF9NQ19DTlQpCisJeworCQljbnQgPSBNQVhfTUNfQ05UOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPbmx5ICVkIG11bHRpY2FzdCBhZGRyZXNzZXMgc3VwcG9ydGVkIiwKKwkJCWRldi0+bmFtZSwgY250KTsKKwl9CisJCisJaWYgKGRldi0+bWNfY291bnQgPiAwKSB7CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pOworCQl1bnNpZ25lZCBjaGFyICpjcDsKKwkJc3RydWN0IG1jX2NtZCAqY21kOworCisJCWlmICh3YWl0X2NmZyhkZXYsICZscC0+bWNfY21kLmNtZCwgMTAwMCwgIm11bHRpY2FzdCBsaXN0IGNoYW5nZSByZXF1ZXN0IHRpbWVkIG91dCIpKQorCQkJcmV0dXJuOworCQljbWQgPSAmbHAtPm1jX2NtZDsKKwkJY21kLT5jbWQuY29tbWFuZCA9IENtZE11bHRpY2FzdExpc3Q7CisJCWNtZC0+bWNfY250ID0gZGV2LT5tY19jb3VudCAqIDY7CisJCWNwID0gY21kLT5tY19hZGRyczsKKwkJZm9yIChkbWkgPSBkZXYtPm1jX2xpc3Q7IGNudCAmJiBkbWkgIT0gTlVMTDsgZG1pID0gZG1pLT5uZXh0LCBjbnQtLSwgY3AgKz0gNikgeworCQkJbWVtY3B5KGNwLCBkbWktPmRtaV9hZGRyLCA2KTsKKwkJCWlmIChpNTk2X2RlYnVnID4gMSkKKwkJCQlERUIoREVCX01VTFRJLHByaW50ayhLRVJOX0lORk8gIiVzOiBBZGRpbmcgYWRkcmVzcyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkJCWRldi0+bmFtZSwgY3BbMF0sY3BbMV0sY3BbMl0sY3BbM10sY3BbNF0sY3BbNV0pKTsKKwkJfQorCQlpNTk2X2FkZF9jbWQoZGV2LCAmY21kLT5jbWQpOworCX0KK30KKworI2lmZGVmIE1PRFVMRQorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfODI1OTY7CisKKyNpZmRlZiBFTkFCTEVfQVBSSUNPVAorbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiQXByaWNvdCBJUlEgbnVtYmVyIik7CisjZW5kaWYKKworc3RhdGljIGludCBkZWJ1ZyA9IC0xOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImk4MjU5NiBkZWJ1ZyBtYXNrIik7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWlmIChkZWJ1ZyA+PSAwKQorCQlpNTk2X2RlYnVnID0gZGVidWc7CisJZGV2XzgyNTk2ID0gaTgyNTk2X3Byb2JlKC0xKTsKKwlpZiAoSVNfRVJSKGRldl84MjU5NikpCisJCXJldHVybiBQVFJfRVJSKGRldl84MjU5Nik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihkZXZfODI1OTYpOworI2lmZGVmIF9fbWM2ODAwMF9fCisJLyogWFhYIFRoaXMgYXNzdW1lcyBkZWZhdWx0IGNhY2hlIG1vZGUgdG8gYmUgSU9NQVBfRlVMTF9DQUNISU5HLAorCSAqIFhYWCB3aGljaCBtYXkgYmUgaW52YWxpZCAoQ09ORklHXzA2MF9XUklURVRIUk9VR0gpCisJICovCisKKwlrZXJuZWxfc2V0X2NhY2hlbW9kZSgodm9pZCAqKShkZXZfODI1OTYtPm1lbV9zdGFydCksIDQwOTYsCisJCQlJT01BUF9GVUxMX0NBQ0hJTkcpOworI2VuZGlmCisJZnJlZV9wYWdlICgodTMyKShkZXZfODI1OTYtPm1lbV9zdGFydCkpOworI2lmZGVmIEVOQUJMRV9BUFJJQ09UCisJLyogSWYgd2UgZG9uJ3QgZG8gdGhpcywgd2UgY2FuJ3QgcmUtaW5zbW9kIGl0IGxhdGVyLiAqLworCXJlbGVhc2VfcmVnaW9uKGRldl84MjU5Ni0+YmFzZV9hZGRyLCBJNTk2X1RPVEFMX1NJWkUpOworI2VuZGlmCisJZnJlZV9uZXRkZXYoZGV2XzgyNTk2KTsKK30KKworI2VuZGlmCQkJCS8qIE1PRFVMRSAqLworDAorLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURfX0tFUk5FTF9fIC1JL3Vzci9zcmMvbGludXgvbmV0L2luZXQgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLW00ODYgLWMgODI1OTYuYyIKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvODM5MC5jIGIvZHJpdmVycy9uZXQvODM5MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYjE2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC84MzkwLmMKQEAgLTAsMCArMSwxMTMwIEBACisvKiA4MzkwLmM6IEEgZ2VuZXJhbCBOUzgzOTAgZXRoZXJuZXQgZHJpdmVyIGNvcmUgZm9yIGxpbnV4LiAqLworLyoKKwlXcml0dGVuIDE5OTItOTQgYnkgRG9uYWxkIEJlY2tlci4KKyAgCisJQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorCURpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisJNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKwlBbm5hcG9saXMgTUQgMjE0MDMKKworICAKKyAgVGhpcyBpcyB0aGUgY2hpcC1zcGVjaWZpYyBjb2RlIGZvciBtYW55IDgzOTAtYmFzZWQgZXRoZXJuZXQgYWRhcHRvcnMuCisgIFRoaXMgaXMgbm90IGEgY29tcGxldGUgZHJpdmVyLCBpdCBtdXN0IGJlIGNvbWJpbmVkIHdpdGggYm9hcmQtc3BlY2lmaWMKKyAgY29kZSBzdWNoIGFzIG5lLmMsIHdkLmMsIDNjNTAzLmMsIGV0Yy4KKworICBTZWVpbmcgaG93IGF0IGxlYXN0IGVpZ2h0IGRyaXZlcnMgdXNlIHRoaXMgY29kZSwgKG5vdCBjb3VudGluZyB0aGUKKyAgUENNQ0lBIG9uZXMgZWl0aGVyKSBpdCBpcyBlYXN5IHRvIGJyZWFrIHNvbWUgY2FyZCBieSB3aGF0IHNlZW1zIGxpa2UKKyAgYSBzaW1wbGUgaW5ub2NlbnQgY2hhbmdlLiBQbGVhc2UgY29udGFjdCBtZSBvciBEb25hbGQgaWYgeW91IHRoaW5rCisgIHlvdSBoYXZlIGZvdW5kIHNvbWV0aGluZyB0aGF0IG5lZWRzIGNoYW5naW5nLiAtLSBQRworCisKKyAgQ2hhbmdlbG9nOgorCisgIFBhdWwgR29ydG1ha2VyCTogcmVtb3ZlIHNldF9iaXQgbG9jaywgb3RoZXIgY2xlYW51cHMuCisgIFBhdWwgR29ydG1ha2VyCTogYWRkIGVpX2dldF84MzkwX2hkcigpIHNvIHdlIGNhbiBwYXNzIHNrYidzIHRvIAorCQkJICBlaV9ibG9ja19pbnB1dCgpIGZvciBldGhfaW9fY29weV9hbmRfc3VtKCkuCisgIFBhdWwgR29ydG1ha2VyCTogZXhjaGFuZ2Ugc3RhdGljIGludCBlaV9waW5ncG9uZyBmb3IgYSAjZGVmaW5lLAorCQkJICBhbHNvIGFkZCBiZXR0ZXIgVHggZXJyb3IgaGFuZGxpbmcuCisgIFBhdWwgR29ydG1ha2VyCTogcmV3cml0ZSBSeCBvdmVycnVuIGhhbmRsaW5nIGFzIHBlciBOUyBzcGVjcy4KKyAgQWxleGV5IEt1em5ldHNvdgk6IHVzZSB0aGUgODM5MCdzIHNpeCBiaXQgaGFzaCBtdWx0aWNhc3QgZmlsdGVyLgorICBQYXVsIEdvcnRtYWtlcgk6IHR3ZWFrIEFOSydzIGFib3ZlIG11bHRpY2FzdCBjaGFuZ2VzIGEgYml0LgorICBQYXVsIEdvcnRtYWtlcgk6IHVwZGF0ZSBwYWNrZXQgc3RhdGlzdGljcyBmb3IgdjIuMS54CisgIEFsYW4gQ294CQk6IHN1cHBvcnQgYXJiaXRhcnkgc3R1cGlkIHBvcnQgbWFwcGluZ3Mgb24gdGhlCisgIAkJCSAgNjhLIE1hY2ludG9zaC4gU3VwcG9ydCA+MTZiaXQgSS9PIHNwYWNlcworICBQYXVsIEdvcnRtYWtlcgk6IGFkZCBrbW9kIHN1cHBvcnQgZm9yIGF1dG8tbG9hZGluZyBvZiB0aGUgODM5MAorCQkJICBtb2R1bGUgYnkgYWxsIGRyaXZlcnMgdGhhdCByZXF1aXJlIGl0LgorICBBbGFuIENveAkJOiBTcGlubG9ja2luZyB3b3JrLCBhZGRlZCAnQlVHXzgzQzY5MCcKKyAgUGF1bCBHb3J0bWFrZXIJOiBTZXBhcmF0ZSBvdXQgVHggdGltZW91dCBjb2RlIGZyb20gVHggcGF0aC4KKyAgUGF1bCBHb3J0bWFrZXIJOiBSZW1vdmUgb2xkIHVudXNlZCBzaW5nbGUgVHggYnVmZmVyIGNvZGUuCisgIEhheWF0byBGdWppd2FyYQk6IEFkZCBtMzJyIHN1cHBvcnQuCisgIFBhdWwgR29ydG1ha2VyCTogdXNlIHNrYl9wYWR0bygpIGluc3RlYWQgb2Ygc3RhY2sgc2NyYXRjaCBhcmVhCisKKyAgU291cmNlczoKKyAgVGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTEFOIERhdGFib29rLCBhbmQgdGhlIDNDb20gM2M1MDMgZGF0YWJvb2suCisKKyAgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0KKyAgICAiODM5MC5jOnYxLjEwY3ZzIDkvMjMvOTQgRG9uYWxkIEJlY2tlciAoYmVja2VyQGNlc2Rpcy5nc2ZjLm5hc2EuZ292KVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorCisjZGVmaW5lIE5TODM5MF9DT1JFCisjaW5jbHVkZSAiODM5MC5oIgorCisjZGVmaW5lIEJVR184M0M2OTAKKworLyogVGhlc2UgYXJlIHRoZSBvcGVyYXRpb25hbCBmdW5jdGlvbiBpbnRlcmZhY2VzIHRvIGJvYXJkLXNwZWNpZmljCisgICByb3V0aW5lcy4KKwl2b2lkIHJlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKwkJUmVzZXRzIHRoZSBib2FyZCBhc3NvY2lhdGVkIHdpdGggREVWLCBpbmNsdWRpbmcgYSBoYXJkd2FyZSByZXNldCBvZgorCQl0aGUgODM5MC4gIFRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhIHRyYW5zbWl0IHRpbWVvdXQsIGFuZAorCQlpdCBpcyBhbHdheXMgZm9sbG93ZWQgYnkgODM5MF9pbml0KCkuCisJdm9pZCBibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkJCSAgaW50IHN0YXJ0X3BhZ2UpCisJCVdyaXRlIHRoZSBDT1VOVCBieXRlcyBvZiBCVUYgdG8gdGhlIHBhY2tldCBidWZmZXIgYXQgU1RBUlRfUEFHRS4gIFRoZQorCQkicGFnZSIgdmFsdWUgdXNlcyB0aGUgODM5MCdzIDI1Ni1ieXRlIHBhZ2VzLgorCXZvaWQgZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSkKKwkJUmVhZCB0aGUgNCBieXRlLCBwYWdlIGFsaWduZWQgODM5MCBoZWFkZXIuICpJZiogdGhlcmUgaXMgYQorCQlzdWJzZXF1ZW50IHJlYWQsIGl0IHdpbGwgYmUgb2YgdGhlIHJlc3Qgb2YgdGhlIHBhY2tldC4KKwl2b2lkIGJsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KQorCQlSZWFkIENPVU5UIGJ5dGVzIGZyb20gdGhlIHBhY2tldCBidWZmZXIgaW50byB0aGUgc2tiIGRhdGEgYXJlYS4gU3RhcnQgCisJCXJlYWRpbmcgZnJvbSBSSU5HX09GRlNFVCwgdGhlIGFkZHJlc3MgYXMgdGhlIDgzOTAgc2VlcyBpdC4gIFRoaXMgd2lsbCBhbHdheXMKKwkJZm9sbG93IHRoZSByZWFkIG9mIHRoZSA4MzkwIGhlYWRlci4gCisqLworI2RlZmluZSBlaV9yZXNldF84MzkwIChlaV9sb2NhbC0+cmVzZXRfODM5MCkKKyNkZWZpbmUgZWlfYmxvY2tfb3V0cHV0IChlaV9sb2NhbC0+YmxvY2tfb3V0cHV0KQorI2RlZmluZSBlaV9ibG9ja19pbnB1dCAoZWlfbG9jYWwtPmJsb2NrX2lucHV0KQorI2RlZmluZSBlaV9nZXRfODM5MF9oZHIgKGVpX2xvY2FsLT5nZXRfODM5MF9oZHIpCisKKy8qIHVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sID4yIGZvciBkZWJ1ZyAqLworI2lmbmRlZiBlaV9kZWJ1ZworaW50IGVpX2RlYnVnID0gMTsKKyNlbmRpZgorCisvKiBJbmRleCB0byBmdW5jdGlvbnMuICovCitzdGF0aWMgdm9pZCBlaV90eF9pbnRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWlfdHhfZXJyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWlfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGVpX3JlY2VpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlaV9yeF9vdmVycnVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBSb3V0aW5lcyBnZW5lcmljIHRvIE5TODM5MC1iYXNlZCBib2FyZHMuICovCitzdGF0aWMgdm9pZCBOUzgzOTBfdHJpZ2dlcl9zZW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBsZW5ndGgsCisJCQkJCQkJCWludCBzdGFydF9wYWdlKTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGRvX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoKKyAqCVNNUCBhbmQgdGhlIDgzOTAgc2V0dXAuCisgKgorICoJVGhlIDgzOTAgaXNudCBleGFjdGx5IGRlc2lnbmVkIHRvIGJlIG11bHRpdGhyZWFkZWQgb24gUlgvVFguIFRoZXJlIGlzCisgKglhIHBhZ2UgcmVnaXN0ZXIgdGhhdCBjb250cm9scyBiYW5rIGFuZCBwYWNrZXQgYnVmZmVyIGFjY2Vzcy4gV2UgZ3VhcmQKKyAqCXRoaXMgd2l0aCBlaV9sb2NhbC0+cGFnZV9sb2NrLiBOb2JvZHkgc2hvdWxkIGFzc3VtZSBvciBzZXQgdGhlIHBhZ2Ugb3RoZXIKKyAqCXRoYW4gemVybyB3aGVuIHRoZSBsb2NrIGlzIG5vdCBoZWxkLiBMb2NrIGhvbGRlcnMgbXVzdCByZXN0b3JlIHBhZ2UgMAorICoJYmVmb3JlIHVubG9ja2luZy4gRXZlbiBwdXJlIHJlYWRlcnMgbXVzdCB0YWtlIHRoZSBsb2NrIHRvIHByb3RlY3QgaW4gCisgKglwYWdlIDAuCisgKgorICoJVG8gbWFrZSBsaWZlIGRpZmZpY3VsdCB0aGUgY2hpcCBjYW4gYWxzbyBiZSB2ZXJ5IHNsb3cuIFdlIHRoZXJlZm9yZSBjYW4ndAorICoJanVzdCB1c2Ugc3BpbmxvY2tzLiBGb3IgdGhlIGxvbmdlciBsb2NrdXBzIHdlIGRpc2FibGUgdGhlIGlycSB0aGUgZGV2aWNlCisgKglzaXRzIG9uIGFuZCBob2xkIHRoZSBsb2NrLiBXZSBtdXN0IGhvbGQgdGhlIGxvY2sgYmVjYXVzZSB0aGVyZSBpcyBhIGR1YWwKKyAqCXByb2Nlc3NvciBjYXNlIG90aGVyIHRoYW4gaW50ZXJydXB0cyAoZ2V0IHN0YXRzL3NldCBtdWx0aWNhc3QgbGlzdCBpbgorICoJcGFyYWxsZWwgd2l0aCBlYWNoIG90aGVyIGFuZCB0cmFuc21pdCkuCisgKgorICoJTm90ZTogaW4gdGhlb3J5IHdlIGNhbiBqdXN0IGRpc2FibGUgdGhlIGlycSBvbiB0aGUgY2FyZCBfYnV0XyB0aGVyZSBpcworICoJYSBsYXRlbmN5IG9uIFNNUCBpcnEgZGVsaXZlcnkuIFNvIHdlIGNhbiBlYXNpbHkgZ28gImRpc2FibGUgaXJxIiAic3luYyBpcnFzIgorICoJZW50ZXIgbG9jaywgdGFrZSB0aGUgcXVldWVkIGlycS4gU28gd2Ugd2FkZGxlIGluc3RlYWQgb2YgZmx5aW5nLgorICoKKyAqCUZpbmFsbHkgYnkgc3BlY2lhbCBhcnJhbmdlbWVudCBmb3IgdGhlIHB1cnBvc2Ugb2YgYmVpbmcgZ2VuZXJhbGx5IAorICoJYW5ub3lpbmcgdGhlIHRyYW5zbWl0IGZ1bmN0aW9uIGlzIGNhbGxlZCBiaCBhdG9taWMuIFRoYXQgcGxhY2VzCisgKglyZXN0cmljdGlvbnMgb24gdGhlIHVzZXIgY29udGV4dCBjYWxsZXJzIGFzIGRpc2FibGVfaXJxIHdvbid0IHNhdmUKKyAqCXRoZW0uCisgKi8KKyAKKworDAorLyoqCisgKiBlaV9vcGVuIC0gT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4KKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHRvIGluaXRpYWxpemUKKyAqCisgKiBUaGlzIHJvdXRpbmUgZ29lcyBhbGwtb3V0LCBzZXR0aW5nIGV2ZXJ5dGhpbmcKKyAqIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuIHRob3VnaCBtYW55IG9mIHRoZXNlIHJlZ2lzdGVycyBzaG91bGQgb25seQorICogbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LgorICovCitpbnQgZWlfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogVGhlIGNhcmQgSS9PIHBhcnQgb2YgdGhlIGRyaXZlciAoZS5nLiAzYzUwMykgY2FuIGhvb2sgYSBUeCB0aW1lb3V0CisJICAgIHdyYXBwZXIgdGhhdCBkb2VzIGUuZy4gbWVkaWEgY2hlY2sgJiB0aGVuIGNhbGxzIGVpX3R4X3RpbWVvdXQuICovCisJaWYgKGRldi0+dHhfdGltZW91dCA9PSBOVUxMKQorCQkgZGV2LT50eF90aW1lb3V0ID0gZWlfdHhfdGltZW91dDsKKwlpZiAoZGV2LT53YXRjaGRvZ190aW1lbyA8PSAwKQorCQkgZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisgICAgCisJLyoKKwkgKglHcmFiIHRoZSBwYWdlIGxvY2sgc28gd2Ugb3duIHRoZSByZWdpc3RlciBzZXQsIHRoZW4gY2FsbAorCSAqCXRoZSBpbml0IGZ1bmN0aW9uLgorCSAqLworICAgICAgCisgICAgICAJc3Bpbl9sb2NrX2lycXNhdmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwlOUzgzOTBfaW5pdChkZXYsIDEpOworCS8qIFNldCB0aGUgZmxhZyBiZWZvcmUgd2UgZHJvcCB0aGUgbG9jaywgVGhhdCB3YXkgdGhlIElSUSBhcnJpdmVzCisJICAgYWZ0ZXIgaXRzIHNldCBhbmQgd2UgZ2V0IG5vIHNpbGx5IHdhcm5pbmdzICovCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyAgICAgIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7CisJZWlfbG9jYWwtPmlycWxvY2sgPSAwOworCXJldHVybiAwOworfQorCisvKioKKyAqIGVpX2Nsb3NlIC0gc2h1dCBkb3duIG5ldHdvcmsgZGV2aWNlCisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSB0byBjbG9zZQorICoKKyAqIE9wcG9zaXRlIG9mIGVpX29wZW4oKS4gT25seSB1c2VkIHdoZW4gImlmY29uZmlnIDxkZXZuYW1lPiBkb3duIiBpcyBkb25lLgorICovCitpbnQgZWlfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICoJSG9sZCB0aGUgcGFnZSBsb2NrIGR1cmluZyBjbG9zZQorCSAqLworCSAJCisgICAgICAJc3Bpbl9sb2NrX2lycXNhdmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwlOUzgzOTBfaW5pdChkZXYsIDApOworICAgICAgCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZWlfdHhfdGltZW91dCAtIGhhbmRsZSB0cmFuc21pdCB0aW1lIG91dCBjb25kaXRpb24KKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHdoaWNoIGhhcyBhcHBhcmVudGx5IGZhbGxlbiBhc2xlZXAKKyAqCisgKiBDYWxsZWQgYnkga2VybmVsIHdoZW4gZGV2aWNlIG5ldmVyIGFja25vd2xlZGdlcyBhIHRyYW5zbWl0IGhhcworICogY29tcGxldGVkIChvciBmYWlsZWQpIC0gaS5lLiBuZXZlciBwb3N0ZWQgYSBUeCByZWxhdGVkIGludGVycnVwdC4KKyAqLworCit2b2lkIGVpX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJaW50IHR4c3IsIGlzciwgdGlja3Nzb2ZhciA9IGppZmZpZXMgLSBkZXYtPnRyYW5zX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZiBkZWZpbmVkKENPTkZJR19NMzJSKSAmJiBkZWZpbmVkKENPTkZJR19TTVApCisJdW5zaWduZWQgbG9uZyBpY3VjcjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpY3VjciA9IGlubChJQ1VDUjEpOworCWljdWNyIHw9IE0zMlJfSUNVQ1JfSVNNT0QxMTsKKwlvdXRsKGljdWNyLCBJQ1VDUjEpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyNlbmRpZgorCWVpX2xvY2FsLT5zdGF0LnR4X2Vycm9ycysrOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwl0eHNyID0gaW5iKGU4MzkwX2Jhc2UrRU4wX1RTUik7CisJaXNyID0gaW5iKGU4MzkwX2Jhc2UrRU4wX0lTUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUeCB0aW1lZCBvdXQsICVzIFRTUj0lIzJ4LCBJU1I9JSMyeCwgdD0lZC5cbiIsCisJCWRldi0+bmFtZSwgKHR4c3IgJiBFTlRTUl9BQlQpID8gImV4Y2VzcyBjb2xsaXNpb25zLiIgOgorCQkoaXNyKSA/ICJsb3N0IGludGVycnVwdD8iIDogImNhYmxlIHByb2JsZW0/IiwgdHhzciwgaXNyLCB0aWNrc3NvZmFyKTsKKworCWlmICghaXNyICYmICFlaV9sb2NhbC0+c3RhdC50eF9wYWNrZXRzKSAKKwl7CisJCS8qIFRoZSA4MzkwIHByb2JhYmx5IGhhc24ndCBnb3R0ZW4gb24gdGhlIGNhYmxlIHlldC4gKi8KKwkJZWlfbG9jYWwtPmludGVyZmFjZV9udW0gXj0gMTsgICAvKiBUcnkgYSBkaWZmZXJlbnQgeGN2ci4gICovCisJfQorCisJLyogVWdseSBidXQgYSByZXNldCBjYW4gYmUgc2xvdywgeWV0IG11c3QgYmUgcHJvdGVjdGVkICovCisJCQorCWRpc2FibGVfaXJxX25vc3luYyhkZXYtPmlycSk7CisJc3Bpbl9sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKKwkJCisJLyogVHJ5IHRvIHJlc3RhcnQgdGhlIGNhcmQuICBQZXJoYXBzIHRoZSB1c2VyIGhhcyBmaXhlZCBzb21ldGhpbmcuICovCisJZWlfcmVzZXRfODM5MChkZXYpOworCU5TODM5MF9pbml0KGRldiwgMSk7CisJCQorCXNwaW5fdW5sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisgICAgCisvKioKKyAqIGVpX3N0YXJ0X3htaXQgLSBiZWdpbiBwYWNrZXQgdHJhbnNtaXNzaW9uCisgKiBAc2tiOiBwYWNrZXQgdG8gYmUgc2VudAorICogQGRldjogbmV0d29yayBkZXZpY2UgdG8gd2hpY2ggcGFja2V0IGlzIHNlbnQKKyAqCisgKiBTZW5kcyBhIHBhY2tldCB0byBhbiA4MzkwIG5ldHdvcmsgZGV2aWNlLgorICovCisgCitzdGF0aWMgaW50IGVpX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJaW50IHNlbmRfbGVuZ3RoID0gc2tiLT5sZW4sIG91dHB1dF9wYWdlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikgeworCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQlzZW5kX2xlbmd0aCA9IEVUSF9aTEVOOworCX0KKworCS8qIE1hc2sgaW50ZXJydXB0cyBmcm9tIHRoZSBldGhlcmNhcmQuIAorCSAgIFNNUDogV2UgaGF2ZSB0byBncmFiIHRoZSBsb2NrIGhlcmUgb3RoZXJ3aXNlIHRoZSBJUlEgaGFuZGxlcgorCSAgIG9uIGFub3RoZXIgQ1BVIGNhbiBmbGlwIHdpbmRvdyBhbmQgcmFjZSB0aGUgSVJRIG1hc2sgc2V0LiBXZSBlbmQKKwkgICB1cCB0cmFzaGluZyB0aGUgbWNhc3QgZmlsdGVyIG5vdCBkaXNhYmxpbmcgaXJxcyBpZiB3ZSBkb24ndCBsb2NrICovCisJICAgCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwlvdXRiX3AoMHgwMCwgZTgzOTBfYmFzZSArIEVOMF9JTVIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwkKKwkKKwkvKgorCSAqCVNsb3cgcGhhc2Ugd2l0aCBsb2NrIGhlbGQuCisJICovCisJIAorCWRpc2FibGVfaXJxX25vc3luYyhkZXYtPmlycSk7CisJCisJc3Bpbl9sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKKwkKKwllaV9sb2NhbC0+aXJxbG9jayA9IDE7CisKKwkvKgorCSAqIFdlIGhhdmUgdHdvIFR4IHNsb3RzIGF2YWlsYWJsZSBmb3IgdXNlLiBGaW5kIHRoZSBmaXJzdCBmcmVlCisJICogc2xvdCwgYW5kIHRoZW4gcGVyZm9ybSBzb21lIHNhbml0eSBjaGVja3MuIFdpdGggdHdvIFR4IGJ1ZnMsCisJICogeW91IGdldCB2ZXJ5IGNsb3NlIHRvIHRyYW5zbWl0dGluZyBiYWNrLXRvLWJhY2sgcGFja2V0cy4gV2l0aAorCSAqIG9ubHkgb25lIFR4IGJ1ZiwgdGhlIHRyYW5zbWl0dGVyIHNpdHMgaWRsZSB3aGlsZSB5b3UgcmVsb2FkIHRoZQorCSAqIGNhcmQsIGxlYXZpbmcgYSBzdWJzdGFudGlhbCBnYXAgYmV0d2VlbiBlYWNoIHRyYW5zbWl0dGVkIHBhY2tldC4KKwkgKi8KKworCWlmIChlaV9sb2NhbC0+dHgxID09IDApIAorCXsKKwkJb3V0cHV0X3BhZ2UgPSBlaV9sb2NhbC0+dHhfc3RhcnRfcGFnZTsKKwkJZWlfbG9jYWwtPnR4MSA9IHNlbmRfbGVuZ3RoOworCQlpZiAoZWlfZGVidWcgICYmICBlaV9sb2NhbC0+dHgyID4gMCkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogaWRsZSB0cmFuc21pdHRlciB0eDI9JWQsIGxhc3R0eD0lZCwgdHhpbmc9JWQuXG4iLAorCQkJCWRldi0+bmFtZSwgZWlfbG9jYWwtPnR4MiwgZWlfbG9jYWwtPmxhc3R0eCwgZWlfbG9jYWwtPnR4aW5nKTsKKwl9CisJZWxzZSBpZiAoZWlfbG9jYWwtPnR4MiA9PSAwKSAKKwl7CisJCW91dHB1dF9wYWdlID0gZWlfbG9jYWwtPnR4X3N0YXJ0X3BhZ2UgKyBUWF9QQUdFUy8yOworCQllaV9sb2NhbC0+dHgyID0gc2VuZF9sZW5ndGg7CisJCWlmIChlaV9kZWJ1ZyAgJiYgIGVpX2xvY2FsLT50eDEgPiAwKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpZGxlIHRyYW5zbWl0dGVyLCB0eDE9JWQsIGxhc3R0eD0lZCwgdHhpbmc9JWQuXG4iLAorCQkJCWRldi0+bmFtZSwgZWlfbG9jYWwtPnR4MSwgZWlfbG9jYWwtPmxhc3R0eCwgZWlfbG9jYWwtPnR4aW5nKTsKKwl9CisJZWxzZQorCXsJLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLiAqLworCQlpZiAoZWlfZGVidWcpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE5vIFR4IGJ1ZmZlcnMgZnJlZSEgdHgxPSVkIHR4Mj0lZCBsYXN0PSVkXG4iLAorCQkJCWRldi0+bmFtZSwgZWlfbG9jYWwtPnR4MSwgZWlfbG9jYWwtPnR4MiwgZWlfbG9jYWwtPmxhc3R0eCk7CisJCWVpX2xvY2FsLT5pcnFsb2NrID0gMDsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlvdXRiX3AoRU5JU1JfQUxMLCBlODM5MF9iYXNlICsgRU4wX0lNUik7CisJCXNwaW5fdW5sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKKwkJZW5hYmxlX2lycShkZXYtPmlycSk7CisJCWVpX2xvY2FsLT5zdGF0LnR4X2Vycm9ycysrOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIE9rYXksIG5vdyB1cGxvYWQgdGhlIHBhY2tldCBhbmQgdHJpZ2dlciBhIHNlbmQgaWYgdGhlIHRyYW5zbWl0dGVyCisJICogaXNuJ3QgYWxyZWFkeSBzZW5kaW5nLiBJZiBpdCBpcyBidXN5LCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2lsbAorCSAqIHRyaWdnZXIgdGhlIHNlbmQgbGF0ZXIsIHVwb24gcmVjZWl2aW5nIGEgVHggZG9uZSBpbnRlcnJ1cHQuCisJICovCisJIAorCWVpX2Jsb2NrX291dHB1dChkZXYsIHNlbmRfbGVuZ3RoLCBza2ItPmRhdGEsIG91dHB1dF9wYWdlKTsKKwkJCisJaWYgKCEgZWlfbG9jYWwtPnR4aW5nKSAKKwl7CisJCWVpX2xvY2FsLT50eGluZyA9IDE7CisJCU5TODM5MF90cmlnZ2VyX3NlbmQoZGV2LCBzZW5kX2xlbmd0aCwgb3V0cHV0X3BhZ2UpOworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJaWYgKG91dHB1dF9wYWdlID09IGVpX2xvY2FsLT50eF9zdGFydF9wYWdlKSAKKwkJeworCQkJZWlfbG9jYWwtPnR4MSA9IC0xOworCQkJZWlfbG9jYWwtPmxhc3R0eCA9IC0xOworCQl9CisJCWVsc2UgCisJCXsKKwkJCWVpX2xvY2FsLT50eDIgPSAtMTsKKwkJCWVpX2xvY2FsLT5sYXN0dHggPSAtMjsKKwkJfQorCX0KKwllbHNlIGVpX2xvY2FsLT50eHF1ZXVlKys7CisKKwlpZiAoZWlfbG9jYWwtPnR4MSAgJiYgIGVpX2xvY2FsLT50eDIpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwllbHNlCisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwkvKiBUdXJuIDgzOTAgaW50ZXJydXB0cyBiYWNrIG9uLiAqLworCWVpX2xvY2FsLT5pcnFsb2NrID0gMDsKKwlvdXRiX3AoRU5JU1JfQUxMLCBlODM5MF9iYXNlICsgRU4wX0lNUik7CisJCisJc3Bpbl91bmxvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCisJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKwllaV9sb2NhbC0+c3RhdC50eF9ieXRlcyArPSBzZW5kX2xlbmd0aDsKKyAgICAKKwlyZXR1cm4gMDsKK30KKwwKKy8qKgorICogZWlfaW50ZXJydXB0IC0gaGFuZGxlIHRoZSBpbnRlcnJ1cHRzIGZyb20gYW4gODM5MAorICogQGlycTogaW50ZXJydXB0IG51bWJlcgorICogQGRldl9pZDogYSBwb2ludGVyIHRvIHRoZSBuZXRfZGV2aWNlCisgKiBAcmVnczogdW51c2VkCisgKgorICogSGFuZGxlIHRoZSBldGhlciBpbnRlcmZhY2UgaW50ZXJydXB0cy4gV2UgcHVsbCBwYWNrZXRzIGZyb20KKyAqIHRoZSA4MzkwIHZpYSB0aGUgY2FyZCBzcGVjaWZpYyBmdW5jdGlvbnMgYW5kIGZpcmUgdGhlbSBhdCB0aGUgbmV0d29ya2luZworICogc3RhY2suIFdlIGFsc28gaGFuZGxlIHRyYW5zbWl0IGNvbXBsZXRpb25zIGFuZCB3YWtlIHRoZSB0cmFuc21pdCBwYXRoIGlmCisgKiBuZWNlc3NhcnkuIFdlIGFsc28gdXBkYXRlIHRoZSBjb3VudGVycyBhbmQgZG8gb3RoZXIgaG91c2VrZWVwaW5nIGFzCisgKiBuZWVkZWQuCisgKi8KKworaXJxcmV0dXJuX3QgZWlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJbG9uZyBlODM5MF9iYXNlOworCWludCBpbnRlcnJ1cHRzLCBucl9zZXJ2aWNlZCA9IDA7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWw7CisgICAgCisJaWYgKGRldiA9PSBOVUxMKSAKKwl7CisJCXByaW50ayAoIm5ldF9pbnRlcnJ1cHQoKTogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisgICAgCisJZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCWVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qCisJICoJUHJvdGVjdCB0aGUgaXJxIHRlc3QgdG9vLgorCSAqLworCSAKKwlzcGluX2xvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOworCisJaWYgKGVpX2xvY2FsLT5pcnFsb2NrKSAKKwl7CisjaWYgMSAvKiBUaGlzIG1pZ2h0IGp1c3QgYmUgYW4gaW50ZXJydXB0IGZvciBhIFBDSSBkZXZpY2Ugc2hhcmluZyB0aGlzIGxpbmUgKi8KKwkJLyogVGhlICJpcnFsb2NrIiBjaGVjayBpcyBvbmx5IGZvciB0ZXN0aW5nLiAqLworCQlwcmludGsoZWlfbG9jYWwtPmlycWxvY2sKKwkJCSAgID8gIiVzOiBJbnRlcnJ1cHRlZCB3aGlsZSBpbnRlcnJ1cHRzIGFyZSBtYXNrZWQhIGlzcj0lIzJ4IGltcj0lIzJ4LlxuIgorCQkJICAgOiAiJXM6IFJlZW50ZXJpbmcgdGhlIGludGVycnVwdCBoYW5kbGVyISBpc3I9JSMyeCBpbXI9JSMyeC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGluYl9wKGU4MzkwX2Jhc2UgKyBFTjBfSVNSKSwKKwkJCSAgIGluYl9wKGU4MzkwX2Jhc2UgKyBFTjBfSU1SKSk7CisjZW5kaWYKKwkJc3Bpbl91bmxvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorICAgIAorCS8qIENoYW5nZSB0byBwYWdlIDAgYW5kIHJlYWQgdGhlIGludHIgc3RhdHVzIHJlZy4gKi8KKwlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTAsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOworCWlmIChlaV9kZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaW50ZXJydXB0KGlzcj0lIzIuMngpLlxuIiwgZGV2LT5uYW1lLAorCQkJICAgaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9JU1IpKTsKKyAgICAKKwkvKiAhIUFzc3VtcHRpb24hISAtLSB3ZSBzdGF5IGluIHBhZ2UgMC4JIERvbid0IGJyZWFrIHRoaXMuICovCisJd2hpbGUgKChpbnRlcnJ1cHRzID0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9JU1IpKSAhPSAwCisJCSAgICYmICsrbnJfc2VydmljZWQgPCBNQVhfU0VSVklDRSkgCisJeworCQlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGludGVycnVwdCBmcm9tIHN0b3BwZWQgY2FyZFxuIiwgZGV2LT5uYW1lKTsKKwkJCS8qIHJtayAtIGFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHRzICovCisJCQlvdXRiX3AoaW50ZXJydXB0cywgZTgzOTBfYmFzZSArIEVOMF9JU1IpOworCQkJaW50ZXJydXB0cyA9IDA7CisJCQlicmVhazsKKwkJfQorCQlpZiAoaW50ZXJydXB0cyAmIEVOSVNSX09WRVIpIAorCQkJZWlfcnhfb3ZlcnJ1bihkZXYpOworCQllbHNlIGlmIChpbnRlcnJ1cHRzICYgKEVOSVNSX1JYK0VOSVNSX1JYX0VSUikpIAorCQl7CisJCQkvKiBHb3QgYSBnb29kICg/KSBwYWNrZXQuICovCisJCQllaV9yZWNlaXZlKGRldik7CisJCX0KKwkJLyogUHVzaCB0aGUgbmV4dCB0by10cmFuc21pdCBwYWNrZXQgdGhyb3VnaC4gKi8KKwkJaWYgKGludGVycnVwdHMgJiBFTklTUl9UWCkKKwkJCWVpX3R4X2ludHIoZGV2KTsKKwkJZWxzZSBpZiAoaW50ZXJydXB0cyAmIEVOSVNSX1RYX0VSUikKKwkJCWVpX3R4X2VycihkZXYpOworCisJCWlmIChpbnRlcnJ1cHRzICYgRU5JU1JfQ09VTlRFUlMpIAorCQl7CisJCQllaV9sb2NhbC0+c3RhdC5yeF9mcmFtZV9lcnJvcnMgKz0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9DT1VOVEVSMCk7CisJCQllaV9sb2NhbC0+c3RhdC5yeF9jcmNfZXJyb3JzICAgKz0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9DT1VOVEVSMSk7CisJCQllaV9sb2NhbC0+c3RhdC5yeF9taXNzZWRfZXJyb3JzKz0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9DT1VOVEVSMik7CisJCQlvdXRiX3AoRU5JU1JfQ09VTlRFUlMsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsgLyogQWNrIGludHIuICovCisJCX0KKwkJCisJCS8qIElnbm9yZSBhbnkgUkRDIGludGVycnVwdHMgdGhhdCBtYWtlIGl0IGJhY2sgdG8gaGVyZS4gKi8KKwkJaWYgKGludGVycnVwdHMgJiBFTklTUl9SREMpIAorCQl7CisJCQlvdXRiX3AoRU5JU1JfUkRDLCBlODM5MF9iYXNlICsgRU4wX0lTUik7CisJCX0KKworCQlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOworCX0KKyAgICAKKwlpZiAoaW50ZXJydXB0cyAmJiBlaV9kZWJ1ZykgCisJeworCQlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOworCQlpZiAobnJfc2VydmljZWQgPj0gTUFYX1NFUlZJQ0UpIAorCQl7CisJCQkvKiAweEZGIGlzIHZhbGlkIGZvciBhIGNhcmQgcmVtb3ZhbCAqLworCQkJaWYoaW50ZXJydXB0cyE9MHhGRikKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVG9vIG11Y2ggd29yayBhdCBpbnRlcnJ1cHQsIHN0YXR1cyAlIzIuMnhcbiIsCisJCQkJICAgZGV2LT5uYW1lLCBpbnRlcnJ1cHRzKTsKKwkJCW91dGJfcChFTklTUl9BTEwsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsgLyogQWNrLiBtb3N0IGludHJzLiAqLworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVua25vd24gaW50ZXJydXB0ICUjMnhcbiIsIGRldi0+bmFtZSwgaW50ZXJydXB0cyk7CisJCQlvdXRiX3AoMHhmZiwgZTgzOTBfYmFzZSArIEVOMF9JU1IpOyAvKiBBY2suIGFsbCBpbnRycy4gKi8KKwkJfQorCX0KKwlzcGluX3VubG9jaygmZWlfbG9jYWwtPnBhZ2VfbG9jayk7CisJcmV0dXJuIElSUV9SRVRWQUwobnJfc2VydmljZWQgPiAwKTsKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCit2b2lkIGVpX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJZWlfaW50ZXJydXB0KGRldi0+aXJxLCBkZXYsIE5VTEwpOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworfQorI2VuZGlmCisKKy8qKgorICogZWlfdHhfZXJyIC0gaGFuZGxlIHRyYW5zbWl0dGVyIGVycm9yCisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSB3aGljaCB0aHJldyB0aGUgZXhjZXB0aW9uCisgKgorICogQSB0cmFuc21pdHRlciBlcnJvciBoYXMgaGFwcGVuZWQuIE1vc3QgbGlrZWx5IGV4Y2VzcyBjb2xsaXNpb25zICh3aGljaAorICogaXMgYSBmYWlybHkgbm9ybWFsIGNvbmRpdGlvbikuIElmIHRoZSBlcnJvciBpcyBvbmUgd2hlcmUgdGhlIFR4IHdpbGwKKyAqIGhhdmUgYmVlbiBhYm9ydGVkLCB3ZSB0cnkgYW5kIHNlbmQgYW5vdGhlciBvbmUgcmlnaHQgYXdheSwgaW5zdGVhZCBvZgorICogbGV0dGluZyB0aGUgZmFpbGVkIHBhY2tldCBzaXQgYW5kIGNvbGxlY3QgZHVzdCBpbiB0aGUgVHggYnVmZmVyLiBUaGlzCisgKiBpcyBhIG11Y2ggYmV0dGVyIHNvbHV0aW9uIGFzIGl0IGF2b2lkcyBrZXJuZWwgYmFzZWQgVHggdGltZW91dHMsIGFuZAorICogYW4gdW5uZWNlc3NhcnkgY2FyZCByZXNldC4KKyAqCisgKiBDYWxsZWQgd2l0aCBsb2NrIGhlbGQuCisgKi8KKworc3RhdGljIHZvaWQgZWlfdHhfZXJyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGNoYXIgdHhzciA9IGluYl9wKGU4MzkwX2Jhc2UrRU4wX1RTUik7CisJdW5zaWduZWQgY2hhciB0eF93YXNfYWJvcnRlZCA9IHR4c3IgJiAoRU5UU1JfQUJUK0VOVFNSX0ZVKTsKKworI2lmZGVmIFZFUkJPU0VfRVJST1JfRFVNUAorCXByaW50ayhLRVJOX0RFQlVHICIlczogdHJhbnNtaXR0ZXIgZXJyb3IgKCUjMngpOiAiLCBkZXYtPm5hbWUsIHR4c3IpOworCWlmICh0eHNyICYgRU5UU1JfQUJUKQorCQlwcmludGsoImV4Y2Vzcy1jb2xsaXNpb25zICIpOworCWlmICh0eHNyICYgRU5UU1JfTkQpCisJCXByaW50aygibm9uLWRlZmVycmFsICIpOworCWlmICh0eHNyICYgRU5UU1JfQ1JTKQorCQlwcmludGsoImxvc3QtY2FycmllciAiKTsKKwlpZiAodHhzciAmIEVOVFNSX0ZVKQorCQlwcmludGsoIkZJRk8tdW5kZXJydW4gIik7CisJaWYgKHR4c3IgJiBFTlRTUl9DREgpCisJCXByaW50aygibG9zdC1oZWFydGJlYXQgIik7CisJcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKwlvdXRiX3AoRU5JU1JfVFhfRVJSLCBlODM5MF9iYXNlICsgRU4wX0lTUik7IC8qIEFjayBpbnRyLiAqLworCisJaWYgKHR4X3dhc19hYm9ydGVkKQorCQllaV90eF9pbnRyKGRldik7CisJZWxzZSAKKwl7CisJCWVpX2xvY2FsLT5zdGF0LnR4X2Vycm9ycysrOworCQlpZiAodHhzciAmIEVOVFNSX0NSUykgZWlfbG9jYWwtPnN0YXQudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJaWYgKHR4c3IgJiBFTlRTUl9DREgpIGVpX2xvY2FsLT5zdGF0LnR4X2hlYXJ0YmVhdF9lcnJvcnMrKzsKKwkJaWYgKHR4c3IgJiBFTlRTUl9PV0MpIGVpX2xvY2FsLT5zdGF0LnR4X3dpbmRvd19lcnJvcnMrKzsKKwl9Cit9CisKKy8qKgorICogZWlfdHhfaW50ciAtIHRyYW5zbWl0IGludGVycnVwdCBoYW5kbGVyCisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSBmb3Igd2hpY2ggdHggaW50ciBpcyBoYW5kbGVkCisgKgorICogV2UgaGF2ZSBmaW5pc2hlZCBhIHRyYW5zbWl0OiBjaGVjayBmb3IgZXJyb3JzIGFuZCB0aGVuIHRyaWdnZXIgdGhlIG5leHQKKyAqIHBhY2tldCB0byBiZSBzZW50LiBDYWxsZWQgd2l0aCBsb2NrIGhlbGQuCisgKi8KKworc3RhdGljIHZvaWQgZWlfdHhfaW50cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgc3RhdHVzID0gaW5iKGU4MzkwX2Jhc2UgKyBFTjBfVFNSKTsKKyAgICAKKwlvdXRiX3AoRU5JU1JfVFgsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsgLyogQWNrIGludHIuICovCisKKwkvKgorCSAqIFRoZXJlIGFyZSB0d28gVHggYnVmZmVycywgc2VlIHdoaWNoIG9uZSBmaW5pc2hlZCwgYW5kIHRyaWdnZXIKKwkgKiB0aGUgc2VuZCBvZiBhbm90aGVyIG9uZSBpZiBpdCBleGlzdHMuCisJICovCisJZWlfbG9jYWwtPnR4cXVldWUtLTsKKworCWlmIChlaV9sb2NhbC0+dHgxIDwgMCkgCisJeworCQlpZiAoZWlfbG9jYWwtPmxhc3R0eCAhPSAxICYmIGVpX2xvY2FsLT5sYXN0dHggIT0gLTEpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBib2d1cyBsYXN0X3R4X2J1ZmZlciAlZCwgdHgxPSVkLlxuIiwKKwkJCQllaV9sb2NhbC0+bmFtZSwgZWlfbG9jYWwtPmxhc3R0eCwgZWlfbG9jYWwtPnR4MSk7CisJCWVpX2xvY2FsLT50eDEgPSAwOworCQlpZiAoZWlfbG9jYWwtPnR4MiA+IDApIAorCQl7CisJCQllaV9sb2NhbC0+dHhpbmcgPSAxOworCQkJTlM4MzkwX3RyaWdnZXJfc2VuZChkZXYsIGVpX2xvY2FsLT50eDIsIGVpX2xvY2FsLT50eF9zdGFydF9wYWdlICsgNik7CisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCWVpX2xvY2FsLT50eDIgPSAtMSwKKwkJCWVpX2xvY2FsLT5sYXN0dHggPSAyOworCQl9CisJCWVsc2UgZWlfbG9jYWwtPmxhc3R0eCA9IDIwLCBlaV9sb2NhbC0+dHhpbmcgPSAwOwkKKwl9CisJZWxzZSBpZiAoZWlfbG9jYWwtPnR4MiA8IDApIAorCXsKKwkJaWYgKGVpX2xvY2FsLT5sYXN0dHggIT0gMiAgJiYgIGVpX2xvY2FsLT5sYXN0dHggIT0gLTIpCisJCQlwcmludGsoIiVzOiBib2d1cyBsYXN0X3R4X2J1ZmZlciAlZCwgdHgyPSVkLlxuIiwKKwkJCQllaV9sb2NhbC0+bmFtZSwgZWlfbG9jYWwtPmxhc3R0eCwgZWlfbG9jYWwtPnR4Mik7CisJCWVpX2xvY2FsLT50eDIgPSAwOworCQlpZiAoZWlfbG9jYWwtPnR4MSA+IDApIAorCQl7CisJCQllaV9sb2NhbC0+dHhpbmcgPSAxOworCQkJTlM4MzkwX3RyaWdnZXJfc2VuZChkZXYsIGVpX2xvY2FsLT50eDEsIGVpX2xvY2FsLT50eF9zdGFydF9wYWdlKTsKKwkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJZWlfbG9jYWwtPnR4MSA9IC0xOworCQkJZWlfbG9jYWwtPmxhc3R0eCA9IDE7CisJCX0KKwkJZWxzZQorCQkJZWlfbG9jYWwtPmxhc3R0eCA9IDEwLCBlaV9sb2NhbC0+dHhpbmcgPSAwOworCX0KKy8vCWVsc2UgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVuZXhwZWN0ZWQgVFgtZG9uZSBpbnRlcnJ1cHQsIGxhc3R0eD0lZC5cbiIsCisvLwkJCWRldi0+bmFtZSwgZWlfbG9jYWwtPmxhc3R0eCk7CisKKwkvKiBNaW5pbWl6ZSBUeCBsYXRlbmN5OiB1cGRhdGUgdGhlIHN0YXRpc3RpY3MgYWZ0ZXIgd2UgcmVzdGFydCBUWGluZy4gKi8KKwlpZiAoc3RhdHVzICYgRU5UU1JfQ09MKQorCQllaV9sb2NhbC0+c3RhdC5jb2xsaXNpb25zKys7CisJaWYgKHN0YXR1cyAmIEVOVFNSX1BUWCkKKwkJZWlfbG9jYWwtPnN0YXQudHhfcGFja2V0cysrOworCWVsc2UgCisJeworCQllaV9sb2NhbC0+c3RhdC50eF9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIEVOVFNSX0FCVCkgCisJCXsKKwkJCWVpX2xvY2FsLT5zdGF0LnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQllaV9sb2NhbC0+c3RhdC5jb2xsaXNpb25zICs9IDE2OworCQl9CisJCWlmIChzdGF0dXMgJiBFTlRTUl9DUlMpIAorCQkJZWlfbG9jYWwtPnN0YXQudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIEVOVFNSX0ZVKSAKKwkJCWVpX2xvY2FsLT5zdGF0LnR4X2ZpZm9fZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBFTlRTUl9DREgpCisJCQllaV9sb2NhbC0+c3RhdC50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBFTlRTUl9PV0MpCisJCQllaV9sb2NhbC0+c3RhdC50eF93aW5kb3dfZXJyb3JzKys7CisJfQorCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyoqCisgKiBlaV9yZWNlaXZlIC0gcmVjZWl2ZSBzb21lIHBhY2tldHMKKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHdpdGggd2hpY2ggcmVjZWl2ZSB3aWxsIGJlIHJ1bgorICoKKyAqIFdlIGhhdmUgYSBnb29kIHBhY2tldChzKSwgZ2V0IGl0L3RoZW0gb3V0IG9mIHRoZSBidWZmZXJzLiAKKyAqIENhbGxlZCB3aXRoIGxvY2sgaGVsZC4KKyAqLworCitzdGF0aWMgdm9pZCBlaV9yZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGNoYXIgcnhpbmdfcGFnZSwgdGhpc19mcmFtZSwgbmV4dF9mcmFtZTsKKwl1bnNpZ25lZCBzaG9ydCBjdXJyZW50X29mZnNldDsKKwlpbnQgcnhfcGt0X2NvdW50ID0gMDsKKwlzdHJ1Y3QgZTgzOTBfcGt0X2hkciByeF9mcmFtZTsKKwlpbnQgbnVtX3J4X3BhZ2VzID0gZWlfbG9jYWwtPnN0b3BfcGFnZS1laV9sb2NhbC0+cnhfc3RhcnRfcGFnZTsKKyAgICAKKwl3aGlsZSAoKytyeF9wa3RfY291bnQgPCAxMCkgCisJeworCQlpbnQgcGt0X2xlbiwgcGt0X3N0YXQ7CisJCQorCQkvKiBHZXQgdGhlIHJ4IHBhZ2UgKGluY29taW5nIHBhY2tldCBwb2ludGVyKS4gKi8KKwkJb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UxLCBlODM5MF9iYXNlICsgRTgzOTBfQ01EKTsKKwkJcnhpbmdfcGFnZSA9IGluYl9wKGU4MzkwX2Jhc2UgKyBFTjFfQ1VSUEFHKTsKKwkJb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwLCBlODM5MF9iYXNlICsgRTgzOTBfQ01EKTsKKwkJCisJCS8qIFJlbW92ZSBvbmUgZnJhbWUgZnJvbSB0aGUgcmluZy4gIEJvdW5kYXJ5IGlzIGFsd2F5cyBhIHBhZ2UgYmVoaW5kLiAqLworCQl0aGlzX2ZyYW1lID0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9CT1VOREFSWSkgKyAxOworCQlpZiAodGhpc19mcmFtZSA+PSBlaV9sb2NhbC0+c3RvcF9wYWdlKQorCQkJdGhpc19mcmFtZSA9IGVpX2xvY2FsLT5yeF9zdGFydF9wYWdlOworCQkKKwkJLyogU29tZWRheSB3ZSdsbCBvbWl0IHRoZSBwcmV2aW91cywgaWZmIHdlIG5ldmVyIGdldCB0aGlzIG1lc3NhZ2UuCisJCSAgIChUaGVyZSBpcyBhdCBsZWFzdCBvbmUgY2xvbmUgY2xhaW1lZCB0byBoYXZlIGEgcHJvYmxlbS4pICAKKwkJICAgCisJCSAgIEtlZXAgcXVpZXQgaWYgaXQgbG9va3MgbGlrZSBhIGNhcmQgcmVtb3ZhbC4gT25lIHByb2JsZW0gaGVyZQorCQkgICBpcyB0aGF0IHNvbWUgY2xvbmVzIGNyYXNoIGluIHJvdWdobHkgdGhlIHNhbWUgd2F5LgorCQkgKi8KKwkJaWYgKGVpX2RlYnVnID4gMCAgJiYgIHRoaXNfZnJhbWUgIT0gZWlfbG9jYWwtPmN1cnJlbnRfcGFnZSAmJiAodGhpc19mcmFtZSE9MHgwIHx8IHJ4aW5nX3BhZ2UhPTB4RkYpKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbWlzbWF0Y2hlZCByZWFkIHBhZ2UgcG9pbnRlcnMgJTJ4IHZzICUyeC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCB0aGlzX2ZyYW1lLCBlaV9sb2NhbC0+Y3VycmVudF9wYWdlKTsKKwkJCisJCWlmICh0aGlzX2ZyYW1lID09IHJ4aW5nX3BhZ2UpCS8qIFJlYWQgYWxsIHRoZSBmcmFtZXM/ICovCisJCQlicmVhazsJCQkJLyogRG9uZSBmb3Igbm93ICovCisJCQorCQljdXJyZW50X29mZnNldCA9IHRoaXNfZnJhbWUgPDwgODsKKwkJZWlfZ2V0XzgzOTBfaGRyKGRldiwgJnJ4X2ZyYW1lLCB0aGlzX2ZyYW1lKTsKKwkJCisJCXBrdF9sZW4gPSByeF9mcmFtZS5jb3VudCAtIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcik7CisJCXBrdF9zdGF0ID0gcnhfZnJhbWUuc3RhdHVzOworCQkKKwkJbmV4dF9mcmFtZSA9IHRoaXNfZnJhbWUgKyAxICsgKChwa3RfbGVuKzQpPj44KTsKKwkJCisJCS8qIENoZWNrIGZvciBib2dvc2l0eSB3YXJuZWQgYnkgM2M1MDMgYm9vazogdGhlIHN0YXR1cyBieXRlIGlzIG5ldmVyCisJCSAgIHdyaXR0ZW4uICBUaGlzIGhhcHBlbmVkIGEgbG90IGR1cmluZyB0ZXN0aW5nISBUaGlzIGNvZGUgc2hvdWxkIGJlCisJCSAgIGNsZWFuZWQgdXAgc29tZWRheS4gKi8KKwkJaWYgKHJ4X2ZyYW1lLm5leHQgIT0gbmV4dF9mcmFtZQorCQkJJiYgcnhfZnJhbWUubmV4dCAhPSBuZXh0X2ZyYW1lICsgMQorCQkJJiYgcnhfZnJhbWUubmV4dCAhPSBuZXh0X2ZyYW1lIC0gbnVtX3J4X3BhZ2VzCisJCQkmJiByeF9mcmFtZS5uZXh0ICE9IG5leHRfZnJhbWUgKyAxIC0gbnVtX3J4X3BhZ2VzKSB7CisJCQllaV9sb2NhbC0+Y3VycmVudF9wYWdlID0gcnhpbmdfcGFnZTsKKwkJCW91dGIoZWlfbG9jYWwtPmN1cnJlbnRfcGFnZS0xLCBlODM5MF9iYXNlK0VOMF9CT1VOREFSWSk7CisJCQllaV9sb2NhbC0+c3RhdC5yeF9lcnJvcnMrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHBrdF9sZW4gPCA2MCAgfHwgIHBrdF9sZW4gPiAxNTE4KSAKKwkJeworCQkJaWYgKGVpX2RlYnVnKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYm9ndXMgcGFja2V0IHNpemU6ICVkLCBzdGF0dXM9JSMyeCBueHBnPSUjMnguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHJ4X2ZyYW1lLmNvdW50LCByeF9mcmFtZS5zdGF0dXMsCisJCQkJCSAgIHJ4X2ZyYW1lLm5leHQpOworCQkJZWlfbG9jYWwtPnN0YXQucnhfZXJyb3JzKys7CisJCQllaV9sb2NhbC0+c3RhdC5yeF9sZW5ndGhfZXJyb3JzKys7CisJCX0KKwkJIGVsc2UgaWYgKChwa3Rfc3RhdCAmIDB4MEYpID09IEVOUlNSX1JYT0spIAorCQl7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4rMik7CisJCQlpZiAoc2tiID09IE5VTEwpIAorCQkJeworCQkJCWlmIChlaV9kZWJ1ZyA+IDEpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogQ291bGRuJ3QgYWxsb2NhdGUgYSBza19idWZmIG9mIHNpemUgJWQuXG4iLAorCQkJCQkJICAgZGV2LT5uYW1lLCBwa3RfbGVuKTsKKwkJCQllaV9sb2NhbC0+c3RhdC5yeF9kcm9wcGVkKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc2tiX3Jlc2VydmUoc2tiLDIpOwkvKiBJUCBoZWFkZXJzIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsJLyogTWFrZSByb29tICovCisJCQkJZWlfYmxvY2tfaW5wdXQoZGV2LCBwa3RfbGVuLCBza2IsIGN1cnJlbnRfb2Zmc2V0ICsgc2l6ZW9mKHJ4X2ZyYW1lKSk7CisJCQkJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJCQluZXRpZl9yeChza2IpOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJZWlfbG9jYWwtPnN0YXQucnhfcGFja2V0cysrOworCQkJCWVpX2xvY2FsLT5zdGF0LnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCQkJaWYgKHBrdF9zdGF0ICYgRU5SU1JfUEhZKQorCQkJCQllaV9sb2NhbC0+c3RhdC5tdWx0aWNhc3QrKzsKKwkJCX0KKwkJfSAKKwkJZWxzZSAKKwkJeworCQkJaWYgKGVpX2RlYnVnKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYm9ndXMgcGFja2V0OiBzdGF0dXM9JSMyeCBueHBnPSUjMnggc2l6ZT0lZFxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCByeF9mcmFtZS5zdGF0dXMsIHJ4X2ZyYW1lLm5leHQsCisJCQkJCSAgIHJ4X2ZyYW1lLmNvdW50KTsKKwkJCWVpX2xvY2FsLT5zdGF0LnJ4X2Vycm9ycysrOworCQkJLyogTkI6IFRoZSBOSUMgY291bnRzIENSQywgZnJhbWUgYW5kIG1pc3NlZCBlcnJvcnMuICovCisJCQlpZiAocGt0X3N0YXQgJiBFTlJTUl9GTykKKwkJCQllaV9sb2NhbC0+c3RhdC5yeF9maWZvX2Vycm9ycysrOworCQl9CisJCW5leHRfZnJhbWUgPSByeF9mcmFtZS5uZXh0OworCQkKKwkJLyogVGhpcyBfc2hvdWxkXyBuZXZlciBoYXBwZW46IGl0J3MgaGVyZSBmb3IgYXZvaWRpbmcgYmFkIGNsb25lcy4gKi8KKwkJaWYgKG5leHRfZnJhbWUgPj0gZWlfbG9jYWwtPnN0b3BfcGFnZSkgeworCQkJcHJpbnRrKCIlczogbmV4dCBmcmFtZSBpbmNvbnNpc3RlbmN5LCAlIzJ4XG4iLCBkZXYtPm5hbWUsCisJCQkJICAgbmV4dF9mcmFtZSk7CisJCQluZXh0X2ZyYW1lID0gZWlfbG9jYWwtPnJ4X3N0YXJ0X3BhZ2U7CisJCX0KKwkJZWlfbG9jYWwtPmN1cnJlbnRfcGFnZSA9IG5leHRfZnJhbWU7CisJCW91dGJfcChuZXh0X2ZyYW1lLTEsIGU4MzkwX2Jhc2UrRU4wX0JPVU5EQVJZKTsKKwl9CisKKwkvKiBXZSB1c2VkIHRvIGFsc28gYWNrIEVOSVNSX09WRVIgaGVyZSwgYnV0IHRoYXQgd291bGQgc29tZXRpbWVzIG1hc2sKKwkgICBhIHJlYWwgb3ZlcnJ1biwgbGVhdmluZyB0aGUgODM5MCBpbiBhIHN0b3BwZWQgc3RhdGUgd2l0aCByZWMndnIgb2ZmLiAqLworCW91dGJfcChFTklTUl9SWCtFTklTUl9SWF9FUlIsIGU4MzkwX2Jhc2UrRU4wX0lTUik7CisJcmV0dXJuOworfQorCisvKioKKyAqIGVpX3J4X292ZXJydW4gLSBoYW5kbGUgcmVjZWl2ZXIgb3ZlcnJ1bgorICogQGRldjogbmV0d29yayBkZXZpY2Ugd2hpY2ggdGhyZXcgZXhjZXB0aW9uCisgKgorICogV2UgaGF2ZSBhIHJlY2VpdmVyIG92ZXJydW46IHdlIGhhdmUgdG8ga2ljayB0aGUgODM5MCB0byBnZXQgaXQgc3RhcnRlZAorICogYWdhaW4uIFByb2JsZW0gaXMgdGhhdCB5b3UgaGF2ZSB0byBraWNrIGl0IGV4YWN0bHkgYXMgTlMgcHJlc2NyaWJlcyBpbgorICogdGhlIHVwZGF0ZWQgZGF0YXNoZWV0cywgb3IgInRoZSBOSUMgbWF5IGFjdCBpbiBhbiB1bnByZWRpY3RhYmxlIG1hbm5lci4iCisgKiBUaGlzIGluY2x1ZGVzIGNhdXNpbmcgInRoZSBOSUMgdG8gZGVmZXIgaW5kZWZpbml0ZWx5IHdoZW4gaXQgaXMgc3RvcHBlZAorICogb24gYSBidXN5IG5ldHdvcmsuIiAgVWdoLgorICogQ2FsbGVkIHdpdGggbG9jayBoZWxkLiBEb24ndCBjYWxsIHRoaXMgd2l0aCB0aGUgaW50ZXJydXB0cyBvZmYgb3IgeW91cgorICogY29tcHV0ZXIgd2lsbCBoYXRlIHlvdSAtIGl0IHRha2VzIDEwbXMgb3Igc28uIAorICovCisKK3N0YXRpYyB2b2lkIGVpX3J4X292ZXJydW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBjaGFyIHdhc190eGluZywgbXVzdF9yZXNlbmQgPSAwOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAKKwkvKgorCSAqIFJlY29yZCB3aGV0aGVyIGEgVHggd2FzIGluIHByb2dyZXNzIGFuZCB0aGVuIGlzc3VlIHRoZQorCSAqIHN0b3AgY29tbWFuZC4KKwkgKi8KKwl3YXNfdHhpbmcgPSBpbmJfcChlODM5MF9iYXNlK0U4MzkwX0NNRCkgJiBFODM5MF9UUkFOUzsKKwlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgZTgzOTBfYmFzZStFODM5MF9DTUQpOworICAgIAorCWlmIChlaV9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUmVjZWl2ZXIgb3ZlcnJ1bi5cbiIsIGRldi0+bmFtZSk7CisJZWlfbG9jYWwtPnN0YXQucnhfb3Zlcl9lcnJvcnMrKzsKKyAgICAKKwkvKiAKKwkgKiBXYWl0IGEgZnVsbCBUeCB0aW1lICgxLjJtcykgKyBzb21lIGd1YXJkIHRpbWUsIE5TIHNheXMgMS42bXMgdG90YWwuCisJICogRWFybHkgZGF0YXNoZWV0cyBzYWlkIHRvIHBvbGwgdGhlIHJlc2V0IGJpdCwgYnV0IG5vdyB0aGV5IHNheSB0aGF0CisJICogaXQgImlzIG5vdCBhIHJlbGlhYmxlIGluZGljYXRvciBhbmQgc3Vic2VxdWVudGx5IHNob3VsZCBiZSBpZ25vcmVkLiIKKwkgKiBXZSB3YWl0IGF0IGxlYXN0IDEwbXMuCisJICovCisKKwltZGVsYXkoMTApOworCisJLyoKKwkgKiBSZXNldCBSQkNSWzAxXSBiYWNrIHRvIHplcm8gYXMgcGVyIG1hZ2ljIGluY2FudGF0aW9uLgorCSAqLworCW91dGJfcCgweDAwLCBlODM5MF9iYXNlK0VOMF9SQ05UTE8pOworCW91dGJfcCgweDAwLCBlODM5MF9iYXNlK0VOMF9SQ05USEkpOworCisJLyoKKwkgKiBTZWUgaWYgYW55IFR4IHdhcyBpbnRlcnJ1cHRlZCBvciBub3QuIEFjY29yZGluZyB0byBOUywgdGhpcworCSAqIHN0ZXAgaXMgdml0YWwsIGFuZCBza2lwcGluZyBpdCB3aWxsIGNhdXNlIG5vIGVuZCBvZiBoYXZvYy4KKwkgKi8KKworCWlmICh3YXNfdHhpbmcpCisJeyAKKwkJdW5zaWduZWQgY2hhciB0eF9jb21wbGV0ZWQgPSBpbmJfcChlODM5MF9iYXNlK0VOMF9JU1IpICYgKEVOSVNSX1RYK0VOSVNSX1RYX0VSUik7CisJCWlmICghdHhfY29tcGxldGVkKQorCQkJbXVzdF9yZXNlbmQgPSAxOworCX0KKworCS8qCisJICogSGF2ZSB0byBlbnRlciBsb29wYmFjayBtb2RlIGFuZCB0aGVuIHJlc3RhcnQgdGhlIE5JQyBiZWZvcmUKKwkgKiB5b3UgYXJlIGFsbG93ZWQgdG8gc2x1cnAgcGFja2V0cyB1cCBvZmYgdGhlIHJpbmcuCisJICovCisJb3V0Yl9wKEU4MzkwX1RYT0ZGLCBlODM5MF9iYXNlICsgRU4wX1RYQ1IpOworCW91dGJfcChFODM5MF9OT0RNQSArIEU4MzkwX1BBR0UwICsgRTgzOTBfU1RBUlQsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOworCisJLyoKKwkgKiBDbGVhciB0aGUgUnggcmluZyBvZiBhbGwgdGhlIGRlYnJpcywgYW5kIGFjayB0aGUgaW50ZXJydXB0LgorCSAqLworCWVpX3JlY2VpdmUoZGV2KTsKKwlvdXRiX3AoRU5JU1JfT1ZFUiwgZTgzOTBfYmFzZStFTjBfSVNSKTsKKworCS8qCisJICogTGVhdmUgbG9vcGJhY2sgbW9kZSwgYW5kIHJlc2VuZCBhbnkgcGFja2V0IHRoYXQgZ290IHN0b3BwZWQuCisJICovCisJb3V0Yl9wKEU4MzkwX1RYQ09ORklHLCBlODM5MF9iYXNlICsgRU4wX1RYQ1IpOyAKKwlpZiAobXVzdF9yZXNlbmQpCisgICAgCQlvdXRiX3AoRTgzOTBfTk9ETUEgKyBFODM5MF9QQUdFMCArIEU4MzkwX1NUQVJUICsgRTgzOTBfVFJBTlMsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOworfQorCisvKgorICoJQ29sbGVjdCB0aGUgc3RhdHMuIFRoaXMgaXMgY2FsbGVkIHVubG9ja2VkIGFuZCBmcm9tIHNldmVyYWwgY29udGV4dHMuCisgKi8KKyAKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAKKwkvKiBJZiB0aGUgY2FyZCBpcyBzdG9wcGVkLCBqdXN0IHJldHVybiB0aGUgcHJlc2VudCBzdGF0cy4gKi8KKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuICZlaV9sb2NhbC0+c3RhdDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLGZsYWdzKTsKKwkvKiBSZWFkIHRoZSBjb3VudGVyIHJlZ2lzdGVycywgYXNzdW1pbmcgd2UgYXJlIGluIHBhZ2UgMC4gKi8KKwllaV9sb2NhbC0+c3RhdC5yeF9mcmFtZV9lcnJvcnMgKz0gaW5iX3AoaW9hZGRyICsgRU4wX0NPVU5URVIwKTsKKwllaV9sb2NhbC0+c3RhdC5yeF9jcmNfZXJyb3JzICAgKz0gaW5iX3AoaW9hZGRyICsgRU4wX0NPVU5URVIxKTsKKwllaV9sb2NhbC0+c3RhdC5yeF9taXNzZWRfZXJyb3JzKz0gaW5iX3AoaW9hZGRyICsgRU4wX0NPVU5URVIyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7CisgICAgCisJcmV0dXJuICZlaV9sb2NhbC0+c3RhdDsKK30KKworLyoKKyAqIEZvcm0gdGhlIDY0IGJpdCA4MzkwIG11bHRpY2FzdCB0YWJsZSBmcm9tIHRoZSBsaW5rZWQgbGlzdCBvZiBhZGRyZXNzZXMKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRldiBzdHJ1Y3R1cmUuCisgKi8KKyAKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYWtlX21jX2JpdHModTggKmJpdHMsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldl9tY19saXN0ICpkbWk7CisKKwlmb3IgKGRtaT1kZXYtPm1jX2xpc3Q7IGRtaTsgZG1pPWRtaS0+bmV4dCkgCisJeworCQl1MzIgY3JjOworCQlpZiAoZG1pLT5kbWlfYWRkcmxlbiAhPSBFVEhfQUxFTikgCisJCXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnZhbGlkIG11bHRpY2FzdCBhZGRyZXNzIGxlbmd0aCBnaXZlbi5cbiIsIGRldi0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQljcmMgPSBldGhlcl9jcmMoRVRIX0FMRU4sIGRtaS0+ZG1pX2FkZHIpOworCQkvKiAKKwkJICogVGhlIDgzOTAgdXNlcyB0aGUgNiBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlCisJCSAqIENSQyB0byBpbmRleCB0aGUgbXVsdGljYXN0IHRhYmxlLgorCQkgKi8KKwkJYml0c1tjcmM+PjI5XSB8PSAoMTw8KChjcmM+PjI2KSY3KSk7CisJfQorfQorCisvKioKKyAqIGRvX3NldF9tdWx0aWNhc3RfbGlzdCAtIHNldC9jbGVhciBtdWx0aWNhc3QgZmlsdGVyCisgKiBAZGV2OiBuZXQgZGV2aWNlIGZvciB3aGljaCBtdWx0aWNhc3QgZmlsdGVyIGlzIGFkanVzdGVkCisgKgorICoJU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuIE1heSBiZSBjYWxsZWQKKyAqCWZyb20gYSBCSCBpbiAyLjEueC4gTXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NrIGhlbGQuIAorICovCisgCitzdGF0aWMgdm9pZCBkb19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaTsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlKiluZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCEoZGV2LT5mbGFncyYoSUZGX1BST01JU0N8SUZGX0FMTE1VTFRJKSkpIAorCXsKKwkJbWVtc2V0KGVpX2xvY2FsLT5tY2ZpbHRlciwgMCwgOCk7CisJCWlmIChkZXYtPm1jX2xpc3QpCisJCQltYWtlX21jX2JpdHMoZWlfbG9jYWwtPm1jZmlsdGVyLCBkZXYpOworCX0KKwllbHNlCisJCW1lbXNldChlaV9sb2NhbC0+bWNmaWx0ZXIsIDB4RkYsIDgpOwkvKiBtY2FzdCBzZXQgdG8gYWNjZXB0LWFsbCAqLworCisJLyogCisJICogRFA4MzkwIG1hbnVhbHMgZG9uJ3Qgc3BlY2lmeSBhbnkgbWFnaWMgc2VxdWVuY2UgZm9yIGFsdGVyaW5nCisJICogdGhlIG11bHRpY2FzdCByZWdzIG9uIGFuIGFscmVhZHkgcnVubmluZyBjYXJkLiBUbyBiZSBzYWZlLCB3ZQorCSAqIGVuc3VyZSBtdWx0aWNhc3QgbW9kZSBpcyBvZmYgcHJpb3IgdG8gbG9hZGluZyB1cCB0aGUgbmV3IGhhc2gKKwkgKiB0YWJsZS4gSWYgdGhpcyBwcm92ZXMgdG8gYmUgbm90IGVub3VnaCwgd2UgY2FuIGFsd2F5cyByZXNvcnQKKwkgKiB0byBzdG9wcGluZyB0aGUgTklDLCBsb2FkaW5nIHRoZSB0YWJsZSBhbmQgdGhlbiByZXN0YXJ0aW5nLgorCSAqCisJICogQnVnIEFsZXJ0ISAgVGhlIE1DIHJlZ3Mgb24gdGhlIFNNQyA4M0M2OTAgKFNNQyBFbGl0ZSBhbmQgU01DIAorCSAqIEVsaXRlMTYpIGFwcGVhciB0byBiZSB3cml0ZS1vbmx5LiBUaGUgTlMgODM5MCBkYXRhIHNoZWV0IGxpc3RzCisJICogdGhlbSBhcyByL3cgc28gdGhpcyBpcyBhIGJ1Zy4gIFRoZSBTTUMgODNDNzkwIChTTUMgVWx0cmEgYW5kCisJICogVWx0cmEzMiBFSVNBKSBhcHBlYXJzIHRvIGhhdmUgdGhpcyBidWcgZml4ZWQuCisJICovCisJIAorCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCW91dGJfcChFODM5MF9SWENPTkZJRywgZTgzOTBfYmFzZSArIEVOMF9SWENSKTsKKwlvdXRiX3AoRTgzOTBfTk9ETUEgKyBFODM5MF9QQUdFMSwgZTgzOTBfYmFzZSArIEU4MzkwX0NNRCk7CisJZm9yKGkgPSAwOyBpIDwgODsgaSsrKSAKKwl7CisJCW91dGJfcChlaV9sb2NhbC0+bWNmaWx0ZXJbaV0sIGU4MzkwX2Jhc2UgKyBFTjFfTVVMVF9TSElGVChpKSk7CisjaWZuZGVmIEJVR184M0M2OTAKKwkJaWYoaW5iX3AoZTgzOTBfYmFzZSArIEVOMV9NVUxUX1NISUZUKGkpKSE9ZWlfbG9jYWwtPm1jZmlsdGVyW2ldKQorCQkJcHJpbnRrKEtFUk5fRVJSICJNdWx0aWNhc3QgZmlsdGVyIHJlYWQvd3JpdGUgbWlzbWFwICVkXG4iLGkpOworI2VuZGlmCisJfQorCW91dGJfcChFODM5MF9OT0RNQSArIEU4MzkwX1BBR0UwLCBlODM5MF9iYXNlICsgRTgzOTBfQ01EKTsKKworICAJaWYoZGV2LT5mbGFncyZJRkZfUFJPTUlTQykKKyAgCQlvdXRiX3AoRTgzOTBfUlhDT05GSUcgfCAweDE4LCBlODM5MF9iYXNlICsgRU4wX1JYQ1IpOworCWVsc2UgaWYoZGV2LT5mbGFncyZJRkZfQUxMTVVMVEkgfHwgZGV2LT5tY19saXN0KQorICAJCW91dGJfcChFODM5MF9SWENPTkZJRyB8IDB4MDgsIGU4MzkwX2Jhc2UgKyBFTjBfUlhDUik7CisgIAllbHNlCisgIAkJb3V0Yl9wKEU4MzkwX1JYQ09ORklHLCBlODM5MF9iYXNlICsgRU4wX1JYQ1IpOworIH0KKworLyoKKyAqCUNhbGxlZCB3aXRob3V0IGxvY2sgaGVsZC4gVGhpcyBpcyBpbnZva2VkIGZyb20gdXNlciBjb250ZXh0IGFuZCBtYXkKKyAqCWJlIHBhcmFsbGVsIHRvIGp1c3QgYWJvdXQgZXZlcnl0aGluZyBlbHNlLiBJdHMgYWxzbyBmYWlybHkgcXVpY2sgYW5kCisgKglub3QgY2FsbGVkIHRvbyBvZnRlbi4gTXVzdCBwcm90ZWN0IGFnYWluc3QgYm90aCBiaCBhbmQgaXJxIHVzZXJzCisgKi8KKyAKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSopbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOworCWRvX3NldF9tdWx0aWNhc3RfbGlzdChkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKK30JCisKKy8qKgorICogZXRoZGV2X3NldHVwIC0gaW5pdCByZXN0IG9mIDgzOTAgZGV2aWNlIHN0cnVjdAorICogQGRldjogbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlIHRvIGluaXQKKyAqCisgKiBJbml0aWFsaXplIHRoZSByZXN0IG9mIHRoZSA4MzkwIGRldmljZSBzdHJ1Y3R1cmUuICBEbyBOT1QgX19pbml0CisgKiB0aGlzLCBhcyBpdCBpcyB1c2VkIGJ5IDgzOTAgYmFzZWQgbW9kdWxhciBkcml2ZXJzIHRvby4KKyAqLworCitzdGF0aWMgdm9pZCBldGhkZXZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJaWYgKGVpX2RlYnVnID4gMSkKKwkJcHJpbnRrKHZlcnNpb24pOworICAgIAorCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmVpX3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMJPSBnZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OworCisJZXRoZXJfc2V0dXAoZGV2KTsKKworCXNwaW5fbG9ja19pbml0KCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKK30KKworLyoqCisgKiBhbGxvY19laV9uZXRkZXYgLSBhbGxvY19ldGhlcmRldiBjb3VudGVycGFydCBmb3IgODM5MAorICogQHNpemU6IGV4dHJhIGJ5dGVzIHRvIGFsbG9jYXRlCisgKgorICogQWxsb2NhdGUgODM5MC1zcGVjaWZpYyBuZXRfZGV2aWNlLgorICovCitzdHJ1Y3QgbmV0X2RldmljZSAqX19hbGxvY19laV9uZXRkZXYoaW50IHNpemUpCit7CisJcmV0dXJuIGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IGVpX2RldmljZSkgKyBzaXplLCAiZXRoJWQiLAorCQkJCWV0aGRldl9zZXR1cCk7Cit9CisKKwwKKworCisvKiBUaGlzIHBhZ2Ugb2YgZnVuY3Rpb25zIHNob3VsZCBiZSA4MzkwIGdlbmVyaWMgKi8KKy8qIEZvbGxvdyBOYXRpb25hbCBTZW1pJ3MgcmVjb21tZW5kYXRpb25zIGZvciBpbml0aWFsaXppbmcgdGhlICJOSUMiLiAqLworCisvKioKKyAqIE5TODM5MF9pbml0IC0gaW5pdGlhbGl6ZSA4MzkwIGhhcmR3YXJlCisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSB0byBpbml0aWFsaXplCisgKiBAc3RhcnRwOiBib29sZWFuLiAgbm9uLXplcm8gdmFsdWUgdG8gaW5pdGlhdGUgY2hpcCBwcm9jZXNzaW5nCisgKgorICoJTXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NrIGhlbGQuCisgKi8KKwordm9pZCBOUzgzOTBfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhcnRwKQoreworCWxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwlpbnQgZW5kY2ZnID0gZWlfbG9jYWwtPndvcmQxNgorCSAgICA/ICgweDQ4IHwgRU5EQ0ZHX1dUUyB8IChlaV9sb2NhbC0+YmlnZW5kaWFuID8gRU5EQ0ZHX0JPUyA6IDApKQorCSAgICA6IDB4NDg7CisgICAgCisJaWYoc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSE9NCkKKyAgICAJCXBhbmljKCI4MzkwLmM6IGhlYWRlciBzdHJ1Y3QgbWlzcGFja2VkXG4iKTsgICAgCisJLyogRm9sbG93IE5hdGlvbmFsIFNlbWkncyByZWNvbW1lbmRhdGlvbnMgZm9yIGluaXRpbmcgdGhlIERQODM5MDIuICovCisJb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsgLyogMHgyMSAqLworCW91dGJfcChlbmRjZmcsIGU4MzkwX2Jhc2UgKyBFTjBfRENGRyk7CS8qIDB4NDggb3IgMHg0OSAqLworCS8qIENsZWFyIHRoZSByZW1vdGUgYnl0ZSBjb3VudCByZWdpc3RlcnMuICovCisJb3V0Yl9wKDB4MDAsICBlODM5MF9iYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKDB4MDAsICBlODM5MF9iYXNlICsgRU4wX1JDTlRISSk7CisJLyogU2V0IHRvIG1vbml0b3IgYW5kIGxvb3BiYWNrIG1vZGUgLS0gdGhpcyBpcyB2aXRhbCEuICovCisJb3V0Yl9wKEU4MzkwX1JYT0ZGLCBlODM5MF9iYXNlICsgRU4wX1JYQ1IpOyAvKiAweDIwICovCisJb3V0Yl9wKEU4MzkwX1RYT0ZGLCBlODM5MF9iYXNlICsgRU4wX1RYQ1IpOyAvKiAweDAyICovCisJLyogU2V0IHRoZSB0cmFuc21pdCBwYWdlIGFuZCByZWNlaXZlIHJpbmcuICovCisJb3V0Yl9wKGVpX2xvY2FsLT50eF9zdGFydF9wYWdlLCBlODM5MF9iYXNlICsgRU4wX1RQU1IpOworCWVpX2xvY2FsLT50eDEgPSBlaV9sb2NhbC0+dHgyID0gMDsKKwlvdXRiX3AoZWlfbG9jYWwtPnJ4X3N0YXJ0X3BhZ2UsIGU4MzkwX2Jhc2UgKyBFTjBfU1RBUlRQRyk7CisJb3V0Yl9wKGVpX2xvY2FsLT5zdG9wX3BhZ2UtMSwgZTgzOTBfYmFzZSArIEVOMF9CT1VOREFSWSk7CS8qIDNjNTAzIHNheXMgMHgzZixOUzB4MjYqLworCWVpX2xvY2FsLT5jdXJyZW50X3BhZ2UgPSBlaV9sb2NhbC0+cnhfc3RhcnRfcGFnZTsJCS8qIGFzc2VydCBib3VuZGFyeSsxICovCisJb3V0Yl9wKGVpX2xvY2FsLT5zdG9wX3BhZ2UsIGU4MzkwX2Jhc2UgKyBFTjBfU1RPUFBHKTsKKwkvKiBDbGVhciB0aGUgcGVuZGluZyBpbnRlcnJ1cHRzIGFuZCBtYXNrLiAqLworCW91dGJfcCgweEZGLCBlODM5MF9iYXNlICsgRU4wX0lTUik7CisJb3V0Yl9wKDB4MDAsICBlODM5MF9iYXNlICsgRU4wX0lNUik7CisgICAgCisJLyogQ29weSB0aGUgc3RhdGlvbiBhZGRyZXNzIGludG8gdGhlIERTODM5MCByZWdpc3RlcnMuICovCisKKwlvdXRiX3AoRTgzOTBfTk9ETUEgKyBFODM5MF9QQUdFMSArIEU4MzkwX1NUT1AsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsgLyogMHg2MSAqLworCWZvcihpID0gMDsgaSA8IDY7IGkrKykgCisJeworCQlvdXRiX3AoZGV2LT5kZXZfYWRkcltpXSwgZTgzOTBfYmFzZSArIEVOMV9QSFlTX1NISUZUKGkpKTsKKwkJaWYgKGVpX2RlYnVnID4gMSAmJiBpbmJfcChlODM5MF9iYXNlICsgRU4xX1BIWVNfU0hJRlQoaSkpIT1kZXYtPmRldl9hZGRyW2ldKQorCQkJcHJpbnRrKEtFUk5fRVJSICJIdy4gYWRkcmVzcyByZWFkL3dyaXRlIG1pc21hcCAlZFxuIixpKTsKKwl9CisKKwlvdXRiX3AoZWlfbG9jYWwtPnJ4X3N0YXJ0X3BhZ2UsIGU4MzkwX2Jhc2UgKyBFTjFfQ1VSUEFHKTsKKwlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgZTgzOTBfYmFzZStFODM5MF9DTUQpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwllaV9sb2NhbC0+dHgxID0gZWlfbG9jYWwtPnR4MiA9IDA7CisJZWlfbG9jYWwtPnR4aW5nID0gMDsKKworCWlmIChzdGFydHApIAorCXsKKwkJb3V0Yl9wKDB4ZmYsICBlODM5MF9iYXNlICsgRU4wX0lTUik7CisJCW91dGJfcChFTklTUl9BTEwsICBlODM5MF9iYXNlICsgRU4wX0lNUik7CisJCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgZTgzOTBfYmFzZStFODM5MF9DTUQpOworCQlvdXRiX3AoRTgzOTBfVFhDT05GSUcsIGU4MzkwX2Jhc2UgKyBFTjBfVFhDUik7IC8qIHhtaXQgb24uICovCisJCS8qIDNjNTAzIFRlY2hNYW4gc2F5cyByeGNvbmZpZyBvbmx5IGFmdGVyIHRoZSBOSUMgaXMgc3RhcnRlZC4gKi8KKwkJb3V0Yl9wKEU4MzkwX1JYQ09ORklHLCBlODM5MF9iYXNlICsgRU4wX1JYQ1IpOyAvKiByeCBvbiwgICovCisJCWRvX3NldF9tdWx0aWNhc3RfbGlzdChkZXYpOwkvKiAocmUpbG9hZCB0aGUgbWNhc3QgdGFibGUgKi8KKwl9Cit9CisKKy8qIFRyaWdnZXIgYSB0cmFuc21pdCBzdGFydCwgYXNzdW1pbmcgdGhlIGxlbmd0aCBpcyB2YWxpZC4gCisgICBBbHdheXMgY2FsbGVkIHdpdGggdGhlIHBhZ2UgbG9jayBoZWxkICovCisgICAKK3N0YXRpYyB2b2lkIE5TODM5MF90cmlnZ2VyX3NlbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGxlbmd0aCwKKwkJCQkJCQkJaW50IHN0YXJ0X3BhZ2UpCit7CisJbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsIF9fYXR0cmlidXRlKCh1bnVzZWQpKSA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisgICAKKwlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTAsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsKKyAgICAKKwlpZiAoaW5iX3AoZTgzOTBfYmFzZSkgJiBFODM5MF9UUkFOUykgCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJpZ2dlcl9zZW5kKCkgY2FsbGVkIHdpdGggdGhlIHRyYW5zbWl0dGVyIGJ1c3kuXG4iLAorCQkJZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwlvdXRiX3AobGVuZ3RoICYgMHhmZiwgZTgzOTBfYmFzZSArIEVOMF9UQ05UTE8pOworCW91dGJfcChsZW5ndGggPj4gOCwgZTgzOTBfYmFzZSArIEVOMF9UQ05USEkpOworCW91dGJfcChzdGFydF9wYWdlLCBlODM5MF9iYXNlICsgRU4wX1RQU1IpOworCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9UUkFOUytFODM5MF9TVEFSVCwgZTgzOTBfYmFzZStFODM5MF9DTUQpOworfQorCitFWFBPUlRfU1lNQk9MKGVpX29wZW4pOworRVhQT1JUX1NZTUJPTChlaV9jbG9zZSk7CitFWFBPUlRfU1lNQk9MKGVpX2ludGVycnVwdCk7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK0VYUE9SVF9TWU1CT0woZWlfcG9sbCk7CisjZW5kaWYKK0VYUE9SVF9TWU1CT0woTlM4MzkwX2luaXQpOworRVhQT1JUX1NZTUJPTChfX2FsbG9jX2VpX25ldGRldik7CisKKyNpZiBkZWZpbmVkKE1PRFVMRSkKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKK30KKworI2VuZGlmIC8qIE1PRFVMRSAqLworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvODM5MC5oIGIvZHJpdmVycy9uZXQvODM5MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OWI2OGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC84MzkwLmgKQEAgLTAsMCArMSwyMTQgQEAKKy8qIEdlbmVyaWMgTlM4MzkwIHJlZ2lzdGVyIGRlZmluaXRpb25zLiAqLworLyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRG9uYWxkIEJlY2tlcidzIDgzOTAgZHJpdmVycywgYW5kIGlzIGRpc3RyaWJ1dGVkCisgICB1bmRlciB0aGUgc2FtZSBsaWNlbnNlLiBBdXRvLWxvYWRpbmcgb2YgODM5MC5vIG9ubHkgaW4gdjIuMiAtIFBhdWwgRy4KKyAgIFNvbWUgb2YgdGhlc2UgbmFtZXMgYW5kIGNvbW1lbnRzIG9yaWdpbmF0ZWQgZnJvbSB0aGUgQ3J5bndyCisgICBwYWNrZXQgZHJpdmVycywgd2hpY2ggYXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHUEwuICovCisKKyNpZm5kZWYgXzgzOTBfaAorI2RlZmluZSBfODM5MF9oCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjZGVmaW5lIFRYX1BBR0VTIDEyCS8qIFR3byBUeCBzbG90cyAqLworCisjZGVmaW5lIEVUSEVSX0FERFJfTEVOIDYKKworLyogVGhlIDgzOTAgc3BlY2lmaWMgcGVyLXBhY2tldC1oZWFkZXIgZm9ybWF0LiAqLworc3RydWN0IGU4MzkwX3BrdF9oZHIgeworICB1bnNpZ25lZCBjaGFyIHN0YXR1czsgLyogc3RhdHVzICovCisgIHVuc2lnbmVkIGNoYXIgbmV4dDsgICAvKiBwb2ludGVyIHRvIG5leHQgcGFja2V0LiAqLworICB1bnNpZ25lZCBzaG9ydCBjb3VudDsgLyogaGVhZGVyICsgcGFja2V0IGxlbmd0aCBpbiBieXRlcyAqLworfTsKKworI2lmZGVmIG5vdGRlZgorZXh0ZXJuIGludCBlaV9kZWJ1ZzsKKyNlbHNlCisjZGVmaW5lIGVpX2RlYnVnIDEKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK2V4dGVybiB2b2lkIGVpX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgTlM4MzkwX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXJ0cCk7CitleHRlcm4gaW50IGVpX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IGVpX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGlycXJldHVybl90IGVpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqX19hbGxvY19laV9uZXRkZXYoaW50IHNpemUpOworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfZWlfbmV0ZGV2KHZvaWQpCit7CisJcmV0dXJuIF9fYWxsb2NfZWlfbmV0ZGV2KDApOworfQorCisvKiBZb3UgaGF2ZSBvbmUgb2YgdGhlc2UgcGVyLWJvYXJkICovCitzdHJ1Y3QgZWlfZGV2aWNlIHsKKwljb25zdCBjaGFyICpuYW1lOworCXZvaWQgKCpyZXNldF84MzkwKShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKwl2b2lkICgqZ2V0XzgzOTBfaGRyKShzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqLCBpbnQpOworCXZvaWQgKCpibG9ja19vdXRwdXQpKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgY29uc3QgdW5zaWduZWQgY2hhciAqLCBpbnQpOworCXZvaWQgKCpibG9ja19pbnB1dCkoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50LCBzdHJ1Y3Qgc2tfYnVmZiAqLCBpbnQpOworCXVuc2lnbmVkIGxvbmcgcm1lbV9zdGFydDsKKwl1bnNpZ25lZCBsb25nIHJtZW1fZW5kOworCXZvaWQgX19pb21lbSAqbWVtOworCXVuc2lnbmVkIGNoYXIgbWNmaWx0ZXJbOF07CisJdW5zaWduZWQgb3BlbjoxOworCXVuc2lnbmVkIHdvcmQxNjoxOyAgCQkvKiBXZSBoYXZlIHRoZSAxNi1iaXQgKHZzIDgtYml0KSB2ZXJzaW9uIG9mIHRoZSBjYXJkLiAqLworCXVuc2lnbmVkIGJpZ2VuZGlhbjoxOwkJLyogMTYtYml0IGJpZyBlbmRpYW4gbW9kZS4gRG8gTk9UICovCisJCQkJCS8qIHNldCB0aGlzIG9uIHJhbmRvbSA4MzkwIGNsb25lcyEgKi8KKwl1bnNpZ25lZCB0eGluZzoxOwkJLyogVHJhbnNtaXQgQWN0aXZlICovCisJdW5zaWduZWQgaXJxbG9jazoxOwkJLyogODM5MCdzIGludHJzIGRpc2FibGVkIHdoZW4gJzEnLiAqLworCXVuc2lnbmVkIGRtYWluZzoxOwkJLyogUmVtb3RlIERNQSBBY3RpdmUgKi8KKwl1bnNpZ25lZCBjaGFyIHR4X3N0YXJ0X3BhZ2UsIHJ4X3N0YXJ0X3BhZ2UsIHN0b3BfcGFnZTsKKwl1bnNpZ25lZCBjaGFyIGN1cnJlbnRfcGFnZTsJLyogUmVhZCBwb2ludGVyIGluIGJ1ZmZlciAgKi8KKwl1bnNpZ25lZCBjaGFyIGludGVyZmFjZV9udW07CS8qIE5ldCBwb3J0IChBVUksIDEwYlQuKSB0byB1c2UuICovCisJdW5zaWduZWQgY2hhciB0eHF1ZXVlOwkJLyogVHggUGFja2V0IGJ1ZmZlciBxdWV1ZSBsZW5ndGguICovCisJc2hvcnQgdHgxLCB0eDI7CQkJLyogUGFja2V0IGxlbmd0aHMgZm9yIHBpbmctcG9uZyB0eC4gKi8KKwlzaG9ydCBsYXN0dHg7CQkJLyogQWxwaGEgdmVyc2lvbiBjb25zaXN0ZW5jeSBjaGVjay4gKi8KKwl1bnNpZ25lZCBjaGFyIHJlZzA7CQkvKiBSZWdpc3RlciAnMCcgaW4gYSBXRDgwMTMgKi8KKwl1bnNpZ25lZCBjaGFyIHJlZzU7CQkvKiBSZWdpc3RlciAnNScgaW4gYSBXRDgwMTMgKi8KKwl1bnNpZ25lZCBjaGFyIHNhdmVkX2lycTsJLyogT3JpZ2luYWwgZGV2LT5pcnEgdmFsdWUuICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdDsJLyogVGhlIG5ldyBzdGF0aXN0aWNzIHRhYmxlLiAqLworCXUzMiAqcmVnX29mZnNldDsJCS8qIFJlZ2lzdGVyIG1hcHBpbmcgdGFibGUgKi8KKwlzcGlubG9ja190IHBhZ2VfbG9jazsJCS8qIFBhZ2UgcmVnaXN0ZXIgbG9ja3MgKi8KKwl1bnNpZ25lZCBsb25nIHByaXY7CQkvKiBQcml2YXRlIGZpZWxkIHRvIHN0b3JlIGJ1cyBJRHMgZXRjLiAqLworfTsKKworLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIDgzOTAgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZXMgY2FsbGVkIHBlciBJUlEuICovCisjZGVmaW5lIE1BWF9TRVJWSUNFIDEyCisKKy8qIFRoZSBtYXhpbXVtIHRpbWUgd2FpdGVkIChpbiBqaWZmaWVzKSBiZWZvcmUgYXNzdW1pbmcgYSBUeCBmYWlsZWQuICgyMG1zKSAqLworI2RlZmluZSBUWF9USU1FT1VUICgyMCpIWi8xMDApCisKKyNkZWZpbmUgZWlfc3RhdHVzICgqKHN0cnVjdCBlaV9kZXZpY2UgKiluZXRkZXZfcHJpdihkZXYpKQorCisvKiBTb21lIGdlbmVyaWMgZXRoZXJuZXQgcmVnaXN0ZXIgY29uZmlndXJhdGlvbnMuICovCisjZGVmaW5lIEU4MzkwX1RYX0lSUV9NQVNLCTB4YQkvKiBGb3IgcmVnaXN0ZXIgRU4wX0lTUiAqLworI2RlZmluZSBFODM5MF9SWF9JUlFfTUFTSwkweDUKKyNkZWZpbmUgRTgzOTBfUlhDT05GSUcJCTB4NAkvKiBFTjBfUlhDUjogYnJvYWRjYXN0cywgbm8gbXVsdGljYXN0LGVycm9ycyAqLworI2RlZmluZSBFODM5MF9SWE9GRgkJMHgyMAkvKiBFTjBfUlhDUjogQWNjZXB0IG5vIHBhY2tldHMgKi8KKyNkZWZpbmUgRTgzOTBfVFhDT05GSUcJCTB4MDAJLyogRU4wX1RYQ1I6IE5vcm1hbCB0cmFuc21pdCBtb2RlICovCisjZGVmaW5lIEU4MzkwX1RYT0ZGCQkweDAyCS8qIEVOMF9UWENSOiBUcmFuc21pdHRlciBvZmYgKi8KKworLyogIFJlZ2lzdGVyIGFjY2Vzc2VkIGF0IEVOX0NNRCwgdGhlIDgzOTAgYmFzZSBhZGRyLiAgKi8KKyNkZWZpbmUgRTgzOTBfU1RPUAkweDAxCS8qIFN0b3AgYW5kIHJlc2V0IHRoZSBjaGlwICovCisjZGVmaW5lIEU4MzkwX1NUQVJUCTB4MDIJLyogU3RhcnQgdGhlIGNoaXAsIGNsZWFyIHJlc2V0ICovCisjZGVmaW5lIEU4MzkwX1RSQU5TCTB4MDQJLyogVHJhbnNtaXQgYSBmcmFtZSAqLworI2RlZmluZSBFODM5MF9SUkVBRAkweDA4CS8qIFJlbW90ZSByZWFkICovCisjZGVmaW5lIEU4MzkwX1JXUklURQkweDEwCS8qIFJlbW90ZSB3cml0ZSAgKi8KKyNkZWZpbmUgRTgzOTBfTk9ETUEJMHgyMAkvKiBSZW1vdGUgRE1BICovCisjZGVmaW5lIEU4MzkwX1BBR0UwCTB4MDAJLyogU2VsZWN0IHBhZ2UgY2hpcCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRTgzOTBfUEFHRTEJMHg0MAkvKiB1c2luZyB0aGUgdHdvIGhpZ2gtb3JkZXIgYml0cyAqLworI2RlZmluZSBFODM5MF9QQUdFMgkweDgwCS8qIFBhZ2UgMyBpcyBpbnZhbGlkLiAqLworCisvKgorICoJT25seSBnZW5lcmF0ZSBpbmRpcmVjdCBsb2FkcyBnaXZlbiBhIG1hY2hpbmUgdGhhdCBuZWVkcyB0aGVtLgorICogICAgICAtIHJlbW92ZWQgQU1JR0FfUENNQ0lBIGZyb20gdGhpcyBsaXN0LCBoYW5kbGVkIGFzIElTQSBpbyBub3cKKyAqLworIAorI2lmIGRlZmluZWQoQ09ORklHX01BQykgfHwgIFwKKyAgICBkZWZpbmVkKENPTkZJR19aT1JSTzgzOTApIHx8IGRlZmluZWQoQ09ORklHX1pPUlJPODM5MF9NT0RVTEUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19IWURSQSkgfHwgZGVmaW5lZChDT05GSUdfSFlEUkFfTU9EVUxFKQorI2RlZmluZSBFSV9TSElGVCh4KQkoZWlfbG9jYWwtPnJlZ19vZmZzZXRbeF0pCisjdW5kZWYgaW5iCisjdW5kZWYgaW5iX3AKKyN1bmRlZiBvdXRiCisjdW5kZWYgb3V0Yl9wCisKKyNkZWZpbmUgaW5iKHBvcnQpICAgaW5fOChwb3J0KQorI2RlZmluZSBvdXRiKHZhbCxwb3J0KSAgb3V0XzgocG9ydCx2YWwpCisjZGVmaW5lIGluYl9wKHBvcnQpICAgaW5fOChwb3J0KQorI2RlZmluZSBvdXRiX3AodmFsLHBvcnQpICBvdXRfOChwb3J0LHZhbCkKKworI2VsaWYgZGVmaW5lZChDT05GSUdfQVJNX0VUSEVSSCkgfHwgZGVmaW5lZChDT05GSUdfQVJNX0VUSEVSSF9NT0RVTEUpCisjZGVmaW5lIEVJX1NISUZUKHgpCShlaV9sb2NhbC0+cmVnX29mZnNldFt4XSkKKyN1bmRlZiBpbmIKKyN1bmRlZiBpbmJfcAorI3VuZGVmIG91dGIKKyN1bmRlZiBvdXRiX3AKKworI2RlZmluZSBpbmIoX3ApCQlyZWFkYihfcCkKKyNkZWZpbmUgb3V0YihfdixfcCkJd3JpdGViKF92LF9wKQorI2RlZmluZSBpbmJfcChfcCkJaW5iKF9wKQorI2RlZmluZSBvdXRiX3AoX3YsX3ApCW91dGIoX3YsX3ApCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX05FVF9DQlVTKSB8fCBkZWZpbmVkKENPTkZJR19ORV9IODMwMCkgfHwgZGVmaW5lZChDT05GSUdfTkVfSDgzMDBfTU9EVUxFKQorI2RlZmluZSBFSV9TSElGVCh4KQkoZWlfbG9jYWwtPnJlZ19vZmZzZXRbeF0pCisjZWxzZQorI2RlZmluZSBFSV9TSElGVCh4KQkoeCkKKyNlbmRpZgorCisjZGVmaW5lIEU4MzkwX0NNRAlFSV9TSElGVCgweDAwKSAgLyogVGhlIGNvbW1hbmQgcmVnaXN0ZXIgKGZvciBhbGwgcGFnZXMpICovCisvKiBQYWdlIDAgcmVnaXN0ZXIgb2Zmc2V0cy4gKi8KKyNkZWZpbmUgRU4wX0NMREFMTwlFSV9TSElGVCgweDAxKQkvKiBMb3cgYnl0ZSBvZiBjdXJyZW50IGxvY2FsIGRtYSBhZGRyICBSRCAqLworI2RlZmluZSBFTjBfU1RBUlRQRwlFSV9TSElGVCgweDAxKQkvKiBTdGFydGluZyBwYWdlIG9mIHJpbmcgYmZyIFdSICovCisjZGVmaW5lIEVOMF9DTERBSEkJRUlfU0hJRlQoMHgwMikJLyogSGlnaCBieXRlIG9mIGN1cnJlbnQgbG9jYWwgZG1hIGFkZHIgIFJEICovCisjZGVmaW5lIEVOMF9TVE9QUEcJRUlfU0hJRlQoMHgwMikJLyogRW5kaW5nIHBhZ2UgKzEgb2YgcmluZyBiZnIgV1IgKi8KKyNkZWZpbmUgRU4wX0JPVU5EQVJZCUVJX1NISUZUKDB4MDMpCS8qIEJvdW5kYXJ5IHBhZ2Ugb2YgcmluZyBiZnIgUkQgV1IgKi8KKyNkZWZpbmUgRU4wX1RTUgkJRUlfU0hJRlQoMHgwNCkJLyogVHJhbnNtaXQgc3RhdHVzIHJlZyBSRCAqLworI2RlZmluZSBFTjBfVFBTUglFSV9TSElGVCgweDA0KQkvKiBUcmFuc21pdCBzdGFydGluZyBwYWdlIFdSICovCisjZGVmaW5lIEVOMF9OQ1IJCUVJX1NISUZUKDB4MDUpCS8qIE51bWJlciBvZiBjb2xsaXNpb24gcmVnIFJEICovCisjZGVmaW5lIEVOMF9UQ05UTE8JRUlfU0hJRlQoMHgwNSkJLyogTG93ICBieXRlIG9mIHR4IGJ5dGUgY291bnQgV1IgKi8KKyNkZWZpbmUgRU4wX0ZJRk8JRUlfU0hJRlQoMHgwNikJLyogRklGTyBSRCAqLworI2RlZmluZSBFTjBfVENOVEhJCUVJX1NISUZUKDB4MDYpCS8qIEhpZ2ggYnl0ZSBvZiB0eCBieXRlIGNvdW50IFdSICovCisjZGVmaW5lIEVOMF9JU1IJCUVJX1NISUZUKDB4MDcpCS8qIEludGVycnVwdCBzdGF0dXMgcmVnIFJEIFdSICovCisjZGVmaW5lIEVOMF9DUkRBTE8JRUlfU0hJRlQoMHgwOCkJLyogbG93IGJ5dGUgb2YgY3VycmVudCByZW1vdGUgZG1hIGFkZHJlc3MgUkQgKi8KKyNkZWZpbmUgRU4wX1JTQVJMTwlFSV9TSElGVCgweDA4KQkvKiBSZW1vdGUgc3RhcnQgYWRkcmVzcyByZWcgMCAqLworI2RlZmluZSBFTjBfQ1JEQUhJCUVJX1NISUZUKDB4MDkpCS8qIGhpZ2ggYnl0ZSwgY3VycmVudCByZW1vdGUgZG1hIGFkZHJlc3MgUkQgKi8KKyNkZWZpbmUgRU4wX1JTQVJISQlFSV9TSElGVCgweDA5KQkvKiBSZW1vdGUgc3RhcnQgYWRkcmVzcyByZWcgMSAqLworI2RlZmluZSBFTjBfUkNOVExPCUVJX1NISUZUKDB4MGEpCS8qIFJlbW90ZSBieXRlIGNvdW50IHJlZyBXUiAqLworI2RlZmluZSBFTjBfUkNOVEhJCUVJX1NISUZUKDB4MGIpCS8qIFJlbW90ZSBieXRlIGNvdW50IHJlZyBXUiAqLworI2RlZmluZSBFTjBfUlNSCQlFSV9TSElGVCgweDBjKQkvKiByeCBzdGF0dXMgcmVnIFJEICovCisjZGVmaW5lIEVOMF9SWENSCUVJX1NISUZUKDB4MGMpCS8qIFJYIGNvbmZpZ3VyYXRpb24gcmVnIFdSICovCisjZGVmaW5lIEVOMF9UWENSCUVJX1NISUZUKDB4MGQpCS8qIFRYIGNvbmZpZ3VyYXRpb24gcmVnIFdSICovCisjZGVmaW5lIEVOMF9DT1VOVEVSMAlFSV9TSElGVCgweDBkKQkvKiBSY3YgYWxpZ25tZW50IGVycm9yIGNvdW50ZXIgUkQgKi8KKyNkZWZpbmUgRU4wX0RDRkcJRUlfU0hJRlQoMHgwZSkJLyogRGF0YSBjb25maWd1cmF0aW9uIHJlZyBXUiAqLworI2RlZmluZSBFTjBfQ09VTlRFUjEJRUlfU0hJRlQoMHgwZSkJLyogUmN2IENSQyBlcnJvciBjb3VudGVyIFJEICovCisjZGVmaW5lIEVOMF9JTVIJCUVJX1NISUZUKDB4MGYpCS8qIEludGVycnVwdCBtYXNrIHJlZyBXUiAqLworI2RlZmluZSBFTjBfQ09VTlRFUjIJRUlfU0hJRlQoMHgwZikJLyogUmN2IG1pc3NlZCBmcmFtZSBlcnJvciBjb3VudGVyIFJEICovCisKKy8qIEJpdHMgaW4gRU4wX0lTUiAtIEludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU5JU1JfUlgJMHgwMQkvKiBSZWNlaXZlciwgbm8gZXJyb3IgKi8KKyNkZWZpbmUgRU5JU1JfVFgJMHgwMgkvKiBUcmFuc21pdHRlciwgbm8gZXJyb3IgKi8KKyNkZWZpbmUgRU5JU1JfUlhfRVJSCTB4MDQJLyogUmVjZWl2ZXIsIHdpdGggZXJyb3IgKi8KKyNkZWZpbmUgRU5JU1JfVFhfRVJSCTB4MDgJLyogVHJhbnNtaXR0ZXIsIHdpdGggZXJyb3IgKi8KKyNkZWZpbmUgRU5JU1JfT1ZFUgkweDEwCS8qIFJlY2VpdmVyIG92ZXJ3cm90ZSB0aGUgcmluZyAqLworI2RlZmluZSBFTklTUl9DT1VOVEVSUwkweDIwCS8qIENvdW50ZXJzIG5lZWQgZW1wdHlpbmcgKi8KKyNkZWZpbmUgRU5JU1JfUkRDCTB4NDAJLyogcmVtb3RlIGRtYSBjb21wbGV0ZSAqLworI2RlZmluZSBFTklTUl9SRVNFVAkweDgwCS8qIFJlc2V0IGNvbXBsZXRlZCAqLworI2RlZmluZSBFTklTUl9BTEwJMHgzZgkvKiBJbnRlcnJ1cHRzIHdlIHdpbGwgZW5hYmxlICovCisKKy8qIEJpdHMgaW4gRU4wX0RDRkcgLSBEYXRhIGNvbmZpZyByZWdpc3RlciAqLworI2RlZmluZSBFTkRDRkdfV1RTCTB4MDEJLyogd29yZCB0cmFuc2ZlciBtb2RlIHNlbGVjdGlvbiAqLworI2RlZmluZSBFTkRDRkdfQk9TCTB4MDIJLyogYnl0ZSBvcmRlciBzZWxlY3Rpb24gKi8KKworLyogUGFnZSAxIHJlZ2lzdGVyIG9mZnNldHMuICovCisjZGVmaW5lIEVOMV9QSFlTICAgRUlfU0hJRlQoMHgwMSkJLyogVGhpcyBib2FyZCdzIHBoeXNpY2FsIGVuZXQgYWRkciBSRCBXUiAqLworI2RlZmluZSBFTjFfUEhZU19TSElGVChpKSAgRUlfU0hJRlQoaSsxKSAvKiBHZXQgYW5kIHNldCBtYWMgYWRkcmVzcyAqLworI2RlZmluZSBFTjFfQ1VSUEFHIEVJX1NISUZUKDB4MDcpCS8qIEN1cnJlbnQgbWVtb3J5IHBhZ2UgUkQgV1IgKi8KKyNkZWZpbmUgRU4xX01VTFQgICBFSV9TSElGVCgweDA4KQkvKiBNdWx0aWNhc3QgZmlsdGVyIG1hc2sgYXJyYXkgKDggYnl0ZXMpIFJEIFdSICovCisjZGVmaW5lIEVOMV9NVUxUX1NISUZUKGkpICBFSV9TSElGVCg4K2kpIC8qIEdldCBhbmQgc2V0IG11bHRpY2FzdCBmaWx0ZXIgKi8KKworLyogQml0cyBpbiByZWNlaXZlZCBwYWNrZXQgc3RhdHVzIGJ5dGUgYW5kIEVOMF9SU1IqLworI2RlZmluZSBFTlJTUl9SWE9LCTB4MDEJLyogUmVjZWl2ZWQgYSBnb29kIHBhY2tldCAqLworI2RlZmluZSBFTlJTUl9DUkMJMHgwMgkvKiBDUkMgZXJyb3IgKi8KKyNkZWZpbmUgRU5SU1JfRkFFCTB4MDQJLyogZnJhbWUgYWxpZ25tZW50IGVycm9yICovCisjZGVmaW5lIEVOUlNSX0ZPCTB4MDgJLyogRklGTyBvdmVycnVuICovCisjZGVmaW5lIEVOUlNSX01QQQkweDEwCS8qIG1pc3NlZCBwa3QgKi8KKyNkZWZpbmUgRU5SU1JfUEhZCTB4MjAJLyogcGh5c2ljYWwvbXVsdGljYXN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgRU5SU1JfRElTCTB4NDAJLyogcmVjZWl2ZXIgZGlzYWJsZS4gc2V0IGluIG1vbml0b3IgbW9kZSAqLworI2RlZmluZSBFTlJTUl9ERUYJMHg4MAkvKiBkZWZlcnJpbmcgKi8KKworLyogVHJhbnNtaXR0ZWQgcGFja2V0IHN0YXR1cywgRU4wX1RTUi4gKi8KKyNkZWZpbmUgRU5UU1JfUFRYIDB4MDEJLyogUGFja2V0IHRyYW5zbWl0dGVkIHdpdGhvdXQgZXJyb3IgKi8KKyNkZWZpbmUgRU5UU1JfTkQgIDB4MDIJLyogVGhlIHRyYW5zbWl0IHdhc24ndCBkZWZlcnJlZC4gKi8KKyNkZWZpbmUgRU5UU1JfQ09MIDB4MDQJLyogVGhlIHRyYW5zbWl0IGNvbGxpZGVkIGF0IGxlYXN0IG9uY2UuICovCisjZGVmaW5lIEVOVFNSX0FCVCAweDA4ICAvKiBUaGUgdHJhbnNtaXQgY29sbGlkZWQgMTYgdGltZXMsIGFuZCB3YXMgZGVmZXJyZWQuICovCisjZGVmaW5lIEVOVFNSX0NSUyAweDEwCS8qIFRoZSBjYXJyaWVyIHNlbnNlIHdhcyBsb3N0LiAqLworI2RlZmluZSBFTlRTUl9GVSAgMHgyMCAgLyogQSAiRklGTyB1bmRlcnJ1biIgb2NjdXJyZWQgZHVyaW5nIHRyYW5zbWl0LiAqLworI2RlZmluZSBFTlRTUl9DREggMHg0MAkvKiBUaGUgY29sbGlzaW9uIGRldGVjdCAiaGVhcnRiZWF0IiBzaWduYWwgd2FzIGxvc3QuICovCisjZGVmaW5lIEVOVFNSX09XQyAweDgwICAvKiBUaGVyZSB3YXMgYW4gb3V0LW9mLXdpbmRvdyBjb2xsaXNpb24uICovCisKKyNlbmRpZiAvKiBfODM5MF9oICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9LY29uZmlnIGIvZHJpdmVycy9uZXQvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGQ1Nzg2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvS2NvbmZpZwpAQCAtMCwwICsxLDI1MzggQEAKKworIworIyBOZXR3b3JrIGRldmljZSBjb25maWd1cmF0aW9uCisjCisKK2NvbmZpZyBORVRERVZJQ0VTCisJZGVwZW5kcyBvbiBORVQKKwlib29sICJOZXR3b3JrIGRldmljZSBzdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIFlvdSBjYW4gc2F5IE4gaGVyZSBpZiB5b3UgZG9uJ3QgaW50ZW5kIHRvIGNvbm5lY3QgeW91ciBMaW51eCBib3ggdG8KKwkgIGFueSBvdGhlciBjb21wdXRlciBhdCBhbGwuCisKKwkgIFlvdSdsbCBoYXZlIHRvIHNheSBZIGlmIHlvdXIgY29tcHV0ZXIgY29udGFpbnMgYSBuZXR3b3JrIGNhcmQgdGhhdAorCSAgeW91IHdhbnQgdG8gdXNlIHVuZGVyIExpbnV4LiBJZiB5b3UgYXJlIGdvaW5nIHRvIHJ1biBTTElQIG9yIFBQUCBvdmVyCisJICB0ZWxlcGhvbmUgbGluZSBvciBudWxsIG1vZGVtIGNhYmxlIHlvdSBuZWVkIHNheSBZIGhlcmUuIENvbm5lY3RpbmcKKwkgIHR3byBtYWNoaW5lcyB3aXRoIHBhcmFsbGVsIHBvcnRzIHVzaW5nIFBMSVAgbmVlZHMgdGhpcywgYXMgd2VsbCBhcworCSAgQVguMjUvS0lTUyBmb3Igc2VuZGluZyBJbnRlcm5ldCB0cmFmZmljIG92ZXIgYW1hdGV1ciByYWRpbyBsaW5rcy4KKworCSAgU2VlIGFsc28gIlRoZSBMaW51eCBOZXR3b3JrIEFkbWluaXN0cmF0b3IncyBHdWlkZSIgYnkgT2xhZiBLaXJjaCBhbmQKKwkgIFRlcnJ5IERhd3Nvbi4gQXZhaWxhYmxlIGF0IDxodHRwOi8vd3d3LnRsZHAub3JnL2d1aWRlcy5odG1sPi4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIERVTU1ZCisJdHJpc3RhdGUgIkR1bW15IG5ldCBkcml2ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGVzc2VudGlhbGx5IGEgYml0LWJ1Y2tldCBkZXZpY2UgKGkuZS4gdHJhZmZpYyB5b3Ugc2VuZCB0bworCSAgdGhpcyBkZXZpY2UgaXMgY29uc2lnbmVkIGludG8gb2JsaXZpb24pIHdpdGggYSBjb25maWd1cmFibGUgSVAKKwkgIGFkZHJlc3MuIEl0IGlzIG1vc3QgY29tbW9ubHkgdXNlZCBpbiBvcmRlciB0byBtYWtlIHlvdXIgY3VycmVudGx5CisJICBpbmFjdGl2ZSBTTElQIGFkZHJlc3Mgc2VlbSBsaWtlIGEgcmVhbCBhZGRyZXNzIGZvciBsb2NhbCBwcm9ncmFtcy4KKwkgIElmIHlvdSB1c2UgU0xJUCBvciBQUFAsIHlvdSBtaWdodCB3YW50IHRvIHNheSBZIGhlcmUuIFNpbmNlIHRoaXMKKwkgIHRoaW5nIG9mdGVuIGNvbWVzIGluIGhhbmR5LCB0aGUgZGVmYXVsdCBpcyBZLiBJdCB3b24ndCBlbmxhcmdlIHlvdXIKKwkgIGtlcm5lbCBlaXRoZXIuIFdoYXQgYSBkZWFsLiBSZWFkIGFib3V0IGl0IGluIHRoZSBOZXR3b3JrCisJICBBZG1pbmlzdHJhdG9yJ3MgR3VpZGUsIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjZ3VpZGU+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBkdW1teS4gIElmIHlvdSB3YW50IHRvIHVzZSBtb3JlIHRoYW4gb25lIGR1bW15CisJICBkZXZpY2UgYXQgYSB0aW1lLCB5b3UgbmVlZCB0byBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLgorCSAgSW5zdGVhZCBvZiAnZHVtbXknLCB0aGUgZGV2aWNlcyB3aWxsIHRoZW4gYmUgY2FsbGVkICdkdW1teTAnLAorCSAgJ2R1bW15MScgZXRjLgorCitjb25maWcgQk9ORElORworCXRyaXN0YXRlICJCb25kaW5nIGRyaXZlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUREVWSUNFUworCWRlcGVuZHMgb24gSU5FVAorCS0tLWhlbHAtLS0KKwkgIFNheSAnWScgb3IgJ00nIGlmIHlvdSB3aXNoIHRvIGJlIGFibGUgdG8gJ2JvbmQnIG11bHRpcGxlIEV0aGVybmV0CisJICBDaGFubmVscyB0b2dldGhlci4gVGhpcyBpcyBjYWxsZWQgJ0V0aGVyY2hhbm5lbCcgYnkgQ2lzY28sCisJICAnVHJ1bmtpbmcnIGJ5IFN1biwgODAyLjNhZCBieSB0aGUgSUVFRSwgYW5kICdCb25kaW5nJyBpbiBMaW51eC4KKworCSAgVGhlIGRyaXZlciBzdXBwb3J0cyBtdWx0aXBsZSBib25kaW5nIG1vZGVzIHRvIGFsbG93IGZvciBib3RoIGhpZ2gKKwkgIHBlcmZvbWFuY2UgYW5kIGhpZ2ggYXZhaWxhYmlsaXR5IG9wZXJhdGlvbi4KKworCSAgUmVmZXIgdG8gPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JvbmRpbmcudHh0PiBmb3IgbW9yZQorCSAgaW5mb3JtYXRpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGJvbmRpbmcuCisKK2NvbmZpZyBFUVVBTElaRVIKKwl0cmlzdGF0ZSAiRVFMIChzZXJpYWwgbGluZSBsb2FkIGJhbGFuY2luZykgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMKKwktLS1oZWxwLS0tCisJICBJZiB5b3UgaGF2ZSB0d28gc2VyaWFsIGNvbm5lY3Rpb25zIHRvIHNvbWUgb3RoZXIgY29tcHV0ZXIgKHRoaXMKKwkgIHVzdWFsbHkgcmVxdWlyZXMgdHdvIG1vZGVtcyBhbmQgdHdvIHRlbGVwaG9uZSBsaW5lcykgYW5kIHlvdSB1c2UKKwkgIFNMSVAgKHRoZSBwcm90b2NvbCBmb3Igc2VuZGluZyBJbnRlcm5ldCB0cmFmZmljIG92ZXIgdGVsZXBob25lCisJICBsaW5lcykgb3IgUFBQIChhIGJldHRlciBTTElQKSBvbiB0aGVtLCB5b3UgY2FuIG1ha2UgdGhlbSBiZWhhdmUgbGlrZQorCSAgb25lIGRvdWJsZSBzcGVlZCBjb25uZWN0aW9uIHVzaW5nIHRoaXMgZHJpdmVyLiAgTmF0dXJhbGx5LCB0aGlzIGhhcworCSAgdG8gYmUgc3VwcG9ydGVkIGF0IHRoZSBvdGhlciBlbmQgYXMgd2VsbCwgZWl0aGVyIHdpdGggYSBzaW1pbGFyIEVRTAorCSAgTGludXggZHJpdmVyIG9yIHdpdGggYSBMaXZpbmdzdG9uIFBvcnRtYXN0ZXIgMmUuCisKKwkgIFNheSBZIGlmIHlvdSB3YW50IHRoaXMgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9lcWwudHh0Pi4gIFlvdSBtYXkgYWxzbyB3YW50IHRvIHJlYWQKKwkgIHNlY3Rpb24gNi4yIG9mIHRoZSBORVQtMy1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGVxbC4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBUVU4KKwl0cmlzdGF0ZSAiVW5pdmVyc2FsIFRVTi9UQVAgZGV2aWNlIGRyaXZlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUREVWSUNFUworCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFRVTi9UQVAgcHJvdmlkZXMgcGFja2V0IHJlY2VwdGlvbiBhbmQgdHJhbnNtaXNzaW9uIGZvciB1c2VyIHNwYWNlCisJICBwcm9ncmFtcy4gIEl0IGNhbiBiZSB2aWV3ZWQgYXMgYSBzaW1wbGUgUG9pbnQtdG8tUG9pbnQgb3IgRXRoZXJuZXQKKwkgIGRldmljZSwgd2hpY2ggaW5zdGVhZCBvZiByZWNlaXZpbmcgcGFja2V0cyBmcm9tIGEgcGh5c2ljYWwgbWVkaWEsCisJICByZWNlaXZlcyB0aGVtIGZyb20gdXNlciBzcGFjZSBwcm9ncmFtIGFuZCBpbnN0ZWFkIG9mIHNlbmRpbmcgcGFja2V0cworCSAgdmlhIHBoeXNpY2FsIG1lZGlhIHdyaXRlcyB0aGVtIHRvIHRoZSB1c2VyIHNwYWNlIHByb2dyYW0uCisKKwkgIFdoZW4gYSBwcm9ncmFtIG9wZW5zIC9kZXYvbmV0L3R1biwgZHJpdmVyIGNyZWF0ZXMgYW5kIHJlZ2lzdGVycworCSAgY29ycmVzcG9uZGluZyBuZXQgZGV2aWNlIHR1blggb3IgdGFwWC4gIEFmdGVyIGEgcHJvZ3JhbSBjbG9zZWQgYWJvdmUKKwkgIGRldmljZXMsIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGVsZXRlIHR1blhYIG9yIHRhcFhYIGRldmljZSBhbmQKKwkgIGFsbCByb3V0ZXMgY29ycmVzcG9uZGluZyB0byBpdC4KKworCSAgUGxlYXNlIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3R1bnRhcC50eHQ+IGZvciBtb3JlCisJICBpbmZvcm1hdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgdHVuLgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIHVzZSB0aGlzIGZvciwgeW91IGRvbid0IG5lZWQgaXQuCisKK2NvbmZpZyBORVRfU0IxMDAwCisJdHJpc3RhdGUgIkdlbmVyYWwgSW5zdHJ1bWVudHMgU3VyZmJvYXJkIDEwMDAiCisJZGVwZW5kcyBvbiBORVRERVZJQ0VTICYmIFBOUAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBHZW5lcmFsIEluc3RydW1lbnQgKGFsc28ga25vd24gYXMKKwkgIE5leHRMZXZlbCkgU1VSRmJvYXJkIDEwMDAgaW50ZXJuYWwKKwkgIGNhYmxlIG1vZGVtLiBUaGlzIGlzIGFuIElTQSBjYXJkIHdoaWNoIGlzIHVzZWQgYnkgYSBudW1iZXIgb2YgY2FibGUKKwkgIFRWIGNvbXBhbmllcyB0byBwcm92aWRlIGNhYmxlIG1vZGVtIGFjY2Vzcy4gSXQncyBhIG9uZS13YXkKKwkgIGRvd25zdHJlYW0tb25seSBjYWJsZSBtb2RlbSwgbWVhbmluZyB0aGF0IHlvdXIgdXBzdHJlYW0gbmV0IGxpbmsgaXMKKwkgIHByb3ZpZGVkIGJ5IHlvdXIgcmVndWxhciBwaG9uZSBtb2RlbS4KKworCSAgQXQgcHJlc2VudCB0aGlzIGRyaXZlciBvbmx5IGNvbXBpbGVzIGFzIGEgbW9kdWxlLCBzbyBzYXkgTSBoZXJlIGlmCisJICB5b3UgaGF2ZSB0aGlzIGNhcmQuIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2IxMDAwLiBUaGVuIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9SRUFETUUuc2IxMDAwPiBmb3IgaW5mb3JtYXRpb24gb24gaG93CisJICB0byB1c2UgdGhpcyBtb2R1bGUsIGFzIGl0IG5lZWRzIHNwZWNpYWwgcHBwIHNjcmlwdHMgZm9yIGVzdGFibGlzaGluZworCSAgYSBjb25uZWN0aW9uLiBGdXJ0aGVyIGRvY3VtZW50YXRpb24gYW5kIHRoZSBuZWNlc3Nhcnkgc2NyaXB0cyBjYW4gYmUKKwkgIGZvdW5kIGF0OgorCisJICA8aHR0cDovL3d3dy5qYWNrc29udmlsbGUubmV0L35mdmVudHVyaS8+CisJICA8aHR0cDovL2hvbWUuYWRlbHBoaWEubmV0L35zaWdsZXJjbS9zYjEwMDAuaHRtbD4KKwkgIDxodHRwOi8vbGludXhwb3dlci5jeC9+Y2FibGUvPgorCisJICBJZiB5b3UgZG9uJ3QgaGF2ZSB0aGlzIGNhcmQsIG9mIGNvdXJzZSBzYXkgTi4KKworaWYgTkVUREVWSUNFUworCXNvdXJjZSAiZHJpdmVycy9uZXQvYXJjbmV0L0tjb25maWciCitlbmRpZgorCisjCisjCUV0aGVybmV0CisjCisKK21lbnUgIkV0aGVybmV0ICgxMCBvciAxMDBNYml0KSIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMgJiYgIVVNTAorCitjb25maWcgTkVUX0VUSEVSTkVUCisJYm9vbCAiRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpIgorCS0tLWhlbHAtLS0KKwkgIEV0aGVybmV0IChhbHNvIGNhbGxlZCBJRUVFIDgwMi4zIG9yIElTTyA4ODAyLTIpIGlzIHRoZSBtb3N0IGNvbW1vbgorCSAgdHlwZSBvZiBMb2NhbCBBcmVhIE5ldHdvcmsgKExBTikgaW4gdW5pdmVyc2l0aWVzIGFuZCBjb21wYW5pZXMuCisKKwkgIENvbW1vbiB2YXJpZXRpZXMgb2YgRXRoZXJuZXQgYXJlOiAxMEJBU0UtMiBvciBUaGlubmV0ICgxMCBNYnBzIG92ZXIKKwkgIGNvYXhpYWwgY2FibGUsIGxpbmtpbmcgY29tcHV0ZXJzIGluIGEgY2hhaW4pLCAxMEJBU0UtVCBvciB0d2lzdGVkCisJICBwYWlyICgxMCBNYnBzIG92ZXIgdHdpc3RlZCBwYWlyIGNhYmxlLCBsaW5raW5nIGNvbXB1dGVycyB0byBjZW50cmFsCisJICBodWJzKSwgMTBCQVNFLUYgKDEwIE1icHMgb3ZlciBvcHRpY2FsIGZpYmVyIGxpbmtzLCB1c2luZyBodWJzKSwKKwkgIDEwMEJBU0UtVFggKDEwMCBNYnBzIG92ZXIgdHdvIHR3aXN0ZWQgcGFpciBjYWJsZXMsIHVzaW5nIGh1YnMpLAorCSAgMTAwQkFTRS1UNCAoMTAwIE1icHMgb3ZlciA0IHN0YW5kYXJkIHZvaWNlLWdyYWRlIHR3aXN0ZWQgcGFpcgorCSAgY2FibGVzLCB1c2luZyBodWJzKSwgMTAwQkFTRS1GWCAoMTAwIE1icHMgb3ZlciBvcHRpY2FsIGZpYmVyIGxpbmtzKQorCSAgW3RoZSAxMDBCQVNFIHZhcmlldGllcyBhcmUgYWxzbyBrbm93biBhcyBGYXN0IEV0aGVybmV0XSwgYW5kIEdpZ2FiaXQKKwkgIEV0aGVybmV0ICgxIEdicHMgb3ZlciBvcHRpY2FsIGZpYmVyIG9yIHNob3J0IGNvcHBlciBsaW5rcykuCisKKwkgIElmIHlvdXIgTGludXggbWFjaGluZSB3aWxsIGJlIGNvbm5lY3RlZCB0byBhbiBFdGhlcm5ldCBhbmQgeW91IGhhdmUKKwkgIGFuIEV0aGVybmV0IG5ldHdvcmsgaW50ZXJmYWNlIGNhcmQgKE5JQykgaW5zdGFsbGVkIGluIHlvdXIgY29tcHV0ZXIsCisJICBzYXkgWSBoZXJlIGFuZCByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uIFlvdSB3aWxsIHRoZW4gYWxzbyBoYXZlCisJICB0byBzYXkgWSB0byB0aGUgZHJpdmVyIGZvciB5b3VyIHBhcnRpY3VsYXIgTklDLgorCisJICBOb3RlIHRoYXQgdGhlIGFuc3dlciB0byB0aGlzIHF1ZXN0aW9uIHdvbid0IGRpcmVjdGx5IGFmZmVjdCB0aGUKKwkgIGtlcm5lbDogc2F5aW5nIE4gd2lsbCBqdXN0IGNhdXNlIHRoZSBjb25maWd1cmF0b3IgdG8gc2tpcCBhbGwKKwkgIHRoZSBxdWVzdGlvbnMgYWJvdXQgRXRoZXJuZXQgbmV0d29yayBjYXJkcy4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE1JSQorCXRyaXN0YXRlICJHZW5lcmljIE1lZGlhIEluZGVwZW5kZW50IEludGVyZmFjZSBkZXZpY2Ugc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVAorCWhlbHAKKwkgIE1vc3QgZXRoZXJuZXQgY29udHJvbGxlcnMgaGF2ZSBNSUkgdHJhbnNjZWl2ZXIgZWl0aGVyIGFzIGFuIGV4dGVybmFsCisJICBvciBpbnRlcm5hbCBkZXZpY2UuICBJdCBpcyBzYWZlIHRvIHNheSBZIG9yIE0gaGVyZSBldmVuIGlmIHlvdXIKKwkgIGV0aGVybmV0IGNhcmQgbGFjayBNSUkuCisKK3NvdXJjZSAiZHJpdmVycy9uZXQvYXJtL0tjb25maWciCisKK2NvbmZpZyBNQUNFCisJdHJpc3RhdGUgIk1BQ0UgKFBvd2VyIE1hYyBldGhlcm5ldCkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBQUENfUE1BQyAmJiBQUEMzMgorCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIFBvd2VyIE1hY2ludG9zaGVzIGFuZCBjbG9uZXMgd2l0aCBFdGhlcm5ldCBidWlsdC1pbiBvbiB0aGUKKwkgIG1vdGhlcmJvYXJkIHdpbGwgdXN1YWxseSB1c2UgYSBNQUNFIChNZWRpdW0gQWNjZXNzIENvbnRyb2wgZm9yCisJICBFdGhlcm5ldCkgaW50ZXJmYWNlLiBTYXkgWSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBNQUNFIGNoaXAuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1hY2UuCisKK2NvbmZpZyBNQUNFX0FBVUlfUE9SVAorCWJvb2wgIlVzZSBBQVVJIHBvcnQgaW5zdGVhZCBvZiBUUCBieSBkZWZhdWx0IgorCWRlcGVuZHMgb24gTUFDRQorCWhlbHAKKwkgIFNvbWUgQXBwbGUgbWFjaGluZXMgKG5vdGFibHkgdGhlIEFwcGxlIE5ldHdvcmsgU2VydmVyKSB3aGljaCB1c2UgdGhlCisJICBNQUNFIGV0aGVybmV0IGNoaXAgaGF2ZSBhbiBBcHBsZSBBVUkgcG9ydCAoc21hbGwgMTUtcGluIGNvbm5lY3RvciksCisJICBpbnN0ZWFkIG9mIGFuIDgtcGluIFJKNDUgY29ubmVjdG9yIGZvciB0d2lzdGVkLXBhaXIgZXRoZXJuZXQuICBTYXkKKwkgIFkgaGVyZSBpZiB5b3UgaGF2ZSBzdWNoIGEgbWFjaGluZS4gIElmIHVuc3VyZSwgc2F5IE4uCisJICBUaGUgZHJpdmVyIHdpbGwgZGVmYXVsdCB0byBBQVVJIG9uIEFOUyBhbnl3YXksIGFuZCBpZiB5b3UgdXNlIGl0IGFzCisJICBhIG1vZHVsZSwgeW91IGNhbiBwcm92aWRlIHRoZSBwb3J0X2FhdWk9MHwxIHRvIGZvcmNlIHRoZSBkcml2ZXIuCisKK2NvbmZpZyBCTUFDCisJdHJpc3RhdGUgIkJNQUMgKEczIGV0aGVybmV0KSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFBQQ19QTUFDICYmIFBQQzMyCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgU2F5IFkgZm9yIHN1cHBvcnQgb2YgQk1BQyBFdGhlcm5ldCBpbnRlcmZhY2VzLiBUaGVzZSBhcmUgdXNlZCBvbiBHMworCSAgY29tcHV0ZXJzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBibWFjLgorCitjb25maWcgT0FLTkVUCisJdHJpc3RhdGUgIk5hdGlvbmFsIERQODM5MDJBViAoT2FrIGV0aGVybmV0KSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFBQQyAmJiBCUk9LRU4KKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBTYXkgWSBpZiB5b3VyIG1hY2hpbmUgaGFzIHRoaXMgdHlwZSBvZiBFdGhlcm5ldCBuZXR3b3JrIGNhcmQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG9ha25ldC4KKworY29uZmlnIEFSSUFETkUKKwl0cmlzdGF0ZSAiQXJpYWRuZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFpPUlJPCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBWaWxsYWdlIFRyb25pYyBBcmlhZG5lIEV0aGVybmV0IGFkYXB0ZXIsIHNheSBZLgorCSAgT3RoZXJ3aXNlLCBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYXJpYWRuZS4KKworY29uZmlnIEEyMDY1CisJdHJpc3RhdGUgIkEyMDY1IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgWk9SUk8KKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIENvbW1vZG9yZSBBMjA2NSBFdGhlcm5ldCBhZGFwdGVyLCBzYXkgWS4gT3RoZXJ3aXNlLAorCSAgc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGEyMDY1LgorCitjb25maWcgSFlEUkEKKwl0cmlzdGF0ZSAiSHlkcmEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBaT1JSTworCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgSHlkcmEgRXRoZXJuZXQgYWRhcHRlciwgc2F5IFkuIE90aGVyd2lzZSwgc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGh5ZHJhLgorCitjb25maWcgWk9SUk84MzkwCisJdHJpc3RhdGUgIlpvcnJvIE5TODM5MC1iYXNlZCBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFpPUlJPCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgVGhpcyBkcml2ZXIgaXMgZm9yIFpvcnJvIEV0aGVybmV0IGNhcmRzIHVzaW5nIGFuIE5TODM5MC1jb21wYXRpYmxlCisJICBjaGlwc2V0LCBsaWtlIHRoZSBWaWxsYWdlIFRyb25pYyBBcmlhZG5lIElJIGFuZCB0aGUgSW5kaXZpZHVhbAorCSAgQ29tcHV0ZXJzIFgtU3VyZiBFdGhlcm5ldCBjYXJkcy4gSWYgeW91IGhhdmUgc3VjaCBhIGNhcmQsIHNheSBZLgorCSAgT3RoZXJ3aXNlLCBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgem9ycm84MzkwLgorCitjb25maWcgQVBORQorCXRyaXN0YXRlICJQQ01DSUEgTkUyMDAwIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgQU1JR0FfUENNQ0lBCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBQQ01DSUEgTkUyMDAwIGNvbXBhdGlibGUgYWRhcHRlciwgc2F5IFkuICBPdGhlcndpc2UsCisJICBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYXBuZS4KKworY29uZmlnIEFQT0xMT19FTFBMVVMKKwl0cmlzdGF0ZSAiQXBvbGxvIDNjNTA1IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgQVBPTExPCisJaGVscAorCSAgU2F5IFkgb3IgTSBoZXJlIGlmIHlvdXIgQXBvbGxvIGhhcyBhIDNDb20gM2M1MDUgSVNBIEV0aGVybmV0IGNhcmQuCisJICBJZiB5b3UgZG9uJ3QgaGF2ZSBvbmUgbWFkZSBmb3IgQXBvbGxvcywgeW91IGNhbiB1c2Ugb25lIGZyb20gYSBQQywKKwkgIGV4Y2VwdCB0aGF0IHlvdXIgQXBvbGxvIHdvbid0IGJlIGFibGUgdG8gYm9vdCBmcm9tIGl0IChiZWNhdXNlIHRoZQorCSAgY29kZSBpbiB0aGUgUk9NIHdpbGwgYmUgZm9yIGEgUEMpLgorCitjb25maWcgTUFDODM5MAorCWJvb2wgIk1hY2ludG9zaCBOUyA4MzkwIGJhc2VkIGV0aGVybmV0IGNhcmRzIgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIE1BQworCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIElmIHlvdSB3YW50IHRvIGluY2x1ZGUgYSBkcml2ZXIgdG8gc3VwcG9ydCBOdWJ1cyBvciBMQy1QRFMKKwkgIEV0aGVybmV0IGNhcmRzIHVzaW5nIGFuIE5TODM5MCBjaGlwc2V0IG9yIGl0cyBlcXVpdmFsZW50LCBzYXkgWQorCSAgYW5kIHJlYWQgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworY29uZmlnIE1BQzg5eDAKKwl0cmlzdGF0ZSAiTWFjaW50b3NoIENTODl4MCBiYXNlZCBldGhlcm5ldCBjYXJkcyIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBNQUMgJiYgQlJPS0VOCisJLS0taGVscC0tLQorCSAgU3VwcG9ydCBmb3IgQ1M4OXgwIGNoaXBzZXQgYmFzZWQgRXRoZXJuZXQgY2FyZHMuICBJZiB5b3UgaGF2ZSBhCisJICBOdWJ1cyBvciBMQy1QRFMgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQKKwkgIHJlYWQgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uICBUaGlzIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbWFjODl4MC4KKworY29uZmlnIE1BQ1NPTklDCisJdHJpc3RhdGUgIk1hY2ludG9zaCBTT05JQyBiYXNlZCBldGhlcm5ldCAob25ib2FyZCwgTnVCdXMsIExDLCBDUykiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgTUFDCisJLS0taGVscC0tLQorCSAgU3VwcG9ydCBmb3IgTmF0U2VtaSBTT05JQyBiYXNlZCBFdGhlcm5ldCBkZXZpY2VzLiAgVGhpcyBpbmNsdWRlcworCSAgdGhlIG9uYm9hcmQgRXRoZXJuZXQgaW4gbWFueSBRdWFkcmFzIGFzIHdlbGwgYXMgc29tZSBMQy1QRFMsCisJICBhIGZldyBOdWJ1cyBhbmQgYWxsIGtub3duIENvbW0gU2xvdCBFdGhlcm5ldCBjYXJkcy4gIElmIHlvdSBoYXZlCisJICBvbmUgb2YgdGhlc2Ugc2F5IFkgYW5kIHJlYWQgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uICBUaGlzIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbWFjc29uaWMuCisKK2NvbmZpZyBNQUNNQUNFCisJYm9vbCAiTWFjaW50b3NoIChBVikgb25ib2FyZCBNQUNFIGV0aGVybmV0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIE1BQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgb25ib2FyZCBBTUQgNzlDOTQwIE1BQ0UgRXRoZXJuZXQgY29udHJvbGxlciB1c2VkIGluCisJICB0aGUgNjYwQVYgYW5kIDg0MEFWIE1hY2ludG9zaC4gIElmIHlvdSBoYXZlIG9uZSBvZiB0aGVzZSBNYWNpbnRvc2hlcworCSAgc2F5IFkgYW5kIHJlYWQgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworY29uZmlnIE1WTUUxNDdfTkVUCisJdHJpc3RhdGUgIk1WTUUxNDcgKExhbmNlKSBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIE1WTUUxNDcKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgb24tYm9hcmQgRXRoZXJuZXQgaW50ZXJmYWNlIG9uIHRoZSBNb3Rvcm9sYSBNVk1FMTQ3CisJICBzaW5nbGUtYm9hcmQgY29tcHV0ZXIuICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgdGhlCisJICBkcml2ZXIgZm9yIHRoaXMgY2hpcCBpbiB5b3VyIGtlcm5lbC4KKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuCisKK2NvbmZpZyBNVk1FMTZ4X05FVAorCXRyaXN0YXRlICJNVk1FMTZ4IEV0aGVybmV0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgTVZNRTE2eAorCWhlbHAKKwkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIEV0aGVybmV0IGludGVyZmFjZSBvbiB0aGUgTW90b3JvbGEKKwkgIE1WTUUxNjIsIDE2NiwgMTY3LCAxNzIgYW5kIDE3NyBib2FyZHMuICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgdGhlCisJICBkcml2ZXIgZm9yIHRoaXMgY2hpcCBpbiB5b3VyIGtlcm5lbC4KKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuCisKK2NvbmZpZyBCVk1FNjAwMF9ORVQKKwl0cmlzdGF0ZSAiQlZNRTYwMDAgRXRoZXJuZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBCVk1FNjAwMAorCWhlbHAKKwkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIEV0aGVybmV0IGludGVyZmFjZSBvbiBCVk1FNDAwMCBhbmQKKwkgIEJWTUU2MDAwIFZNRSBib2FyZHMuICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgdGhlIGRyaXZlciBmb3IgdGhpcyBjaGlwCisJICBpbiB5b3VyIGtlcm5lbC4KKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuCisKK2NvbmZpZyBBVEFSSUxBTkNFCisJdHJpc3RhdGUgIkF0YXJpIExhbmNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgQVRBUkkKKwloZWxwCisJICBTYXkgWSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHNldmVyYWwgQXRhcmkgRXRoZXJuZXQgYWRhcHRlcnMgYmFzZWQKKwkgIG9uIHRoZSBBTUQgTGFuY2UgY2hpcHNldDogUmllYmxDYXJkICh3aXRoIG9yIHdpdGhvdXQgYmF0dGVyeSksIG9yCisJICBQQU1DYXJkIFZNRSAoYWxzbyB0aGUgdmVyc2lvbiBieSBSaG90cm9uLCB3aXRoIGRpZmZlcmVudCBhZGRyZXNzZXMpLgorCitjb25maWcgQVRBUklfQklPTkVUCisJdHJpc3RhdGUgIkJpb05ldC0xMDAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBBVEFSSSAmJiBBVEFSSV9BQ1NJICYmIEJST0tFTgorCWhlbHAKKwkgIFNheSBZIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgQmlvRGF0YSdzIEJpb05ldC0xMDAgRXRoZXJuZXQgYWRhcHRlcgorCSAgZm9yIHRoZSBBQ1NJIHBvcnQuIFRoZSBkcml2ZXIgd29ya3MgKGhhcyB0byB3b3JrLi4uKSB3aXRoIGEgcG9sbGVkCisJICBJL08gc2NoZW1lLCBzbyBpdCdzIHJhdGhlciBzbG93IDotKAorCitjb25maWcgQVRBUklfUEFNU05FVAorCXRyaXN0YXRlICJQQU1zTmV0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgQVRBUkkgJiYgQVRBUklfQUNTSSAmJiBCUk9LRU4KKwloZWxwCisJICBTYXkgWSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBQQU1zTmV0IEV0aGVybmV0IGFkYXB0ZXIgZm9yIHRoZQorCSAgQUNTSSBwb3J0ICgiQUNTSSBub2RlIikuIFRoZSBkcml2ZXIgd29ya3MgKGhhcyB0byB3b3JrLi4uKSB3aXRoIGEKKwkgIHBvbGxlZCBJL08gc2NoZW1lLCBzbyBpdCdzIHJhdGhlciBzbG93IDotKAorCitjb25maWcgU1VOM0xBTkNFCisJdHJpc3RhdGUgIlN1bjMvU3VuM3ggb24tYm9hcmQgTEFOQ0Ugc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiAoU1VOMyB8fCBTVU4zWCkKKwloZWxwCisJICBNb3N0IFN1bjMgYW5kIFN1bjN4IG1vdGhlcmJvYXJkcyAoaW5jbHVkaW5nIHRoZSAzLzUwLCAzLzYwIGFuZCAzLzgwKQorCSAgZmVhdHVyZWQgYW4gQU1EIExhbmNlIDEwTWJpdCBFdGhlcm5ldCBjb250cm9sbGVyIG9uIGJvYXJkOyBzYXkgWQorCSAgaGVyZSB0byBjb21waWxlIGluIHRoZSBMaW51eCBkcml2ZXIgZm9yIHRoaXMgYW5kIGVuYWJsZSBFdGhlcm5ldC4KKwkgIEdlbmVyYWwgTGludXggaW5mb3JtYXRpb24gb24gdGhlIFN1biAzIGFuZCAzeCBzZXJpZXMgKG5vdworCSAgZGlzY29udGludWVkKSBpcyBhdAorCSAgPGh0dHA6Ly93d3cuYW5nZWxmaXJlLmNvbS9jYTIvdGVjaDY4ay9zdW4zLmh0bWw+LgorCisJICBJZiB5b3UncmUgbm90IGJ1aWxkaW5nIGEga2VybmVsIGZvciBhIFN1biAzLCBzYXkgTi4KKworY29uZmlnIFNVTjNfODI1ODYKKwl0cmlzdGF0ZSAiU3VuMyBvbi1ib2FyZCBJbnRlbCA4MjU4NiBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFNVTjMKKwloZWxwCisJICBUaGlzIGRyaXZlciBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBvbi1ib2FyZCBJbnRlbCA4MjU4NiBiYXNlZAorCSAgRXRoZXJuZXQgYWRhcHRlciBmb3VuZCBvbiBTdW4gMy8xeHggYW5kIDMvMnh4IG1vdGhlcmJvYXJkcy4gIE5vdGUKKwkgIHRoYXQgdGhpcyBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCA4MjU4Ni1iYXNlZCBhZGFwdGVycyBvbiBhZGRpdGlvbmFsCisJICBWTUUgYm9hcmRzLgorCitjb25maWcgSFBMQU5DRQorCWJvb2wgIkhQIG9uLWJvYXJkIExBTkNFIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgRElPCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBidWlsdGluICJMQU5DRSIgRXRoZXJuZXQgY29udHJvbGxlciBvbiBhbgorCSAgSFAzMDAgbWFjaGluZSwgc2F5IFkgaGVyZS4KKworY29uZmlnIExBU0lfODI1OTYKKwl0cmlzdGF0ZSAiTGFzaSBldGhlcm5ldCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBQQVJJU0MgJiYgR1NDX0xBU0kKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIG9uLWJvYXJkIEludGVsIDgyNTk2IGV0aGVybmV0IGNvbnRyb2xsZXIKKwkgIGJ1aWx0IGludG8gSGV3bGV0dC1QYWNrYXJkIFBBLVJJU0MgbWFjaGluZXMuCisKK2NvbmZpZyBNSVBTX0pBWlpfU09OSUMKKwl0cmlzdGF0ZSAiTUlQUyBKQVpaIG9uYm9hcmQgU09OSUMgRXRoZXJuZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBNQUNIX0pBWloKKwloZWxwCisJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBvbmJvYXJkIGNhcmQgb2YgTUlQUyBNYWdudW0gNDAwMCwKKwkgIEFjZXIgUElDQSwgT2xpdmV0dGkgTTcwMC0xMCBhbmQgYSBmZXcgb3RoZXIgaWRlbnRpY2FsIE9FTSBzeXN0ZW1zLgorCitjb25maWcgTUlQU19HVDk2MTAwRVRICisJYm9vbCAiTUlQUyBHVDk2MTAwIEV0aGVybmV0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgTUlQU19HVDk2MTAwCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBFdGhlcm5ldCBzdWJzeXN0ZW0gb24geW91ciBHVDk2MTAwIGNhcmQuCisKK2NvbmZpZyBNSVBTX0FVMVgwMF9FTkVUCisJYm9vbCAiTUlQUyBBVTEwMDAgRXRoZXJuZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBTT0NfQVUxWDAwCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgSWYgeW91IGhhdmUgYW4gQWxjaGVteSBTZW1pIEFVMVgwMCBiYXNlZCBzeXN0ZW0KKwkgIHNheSBZLiAgT3RoZXJ3aXNlLCBzYXkgTi4KKworY29uZmlnIE5FVF9TQjEyNTBfTUFDCisJdHJpc3RhdGUgIlNCMTI1MCBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFNJQllURV9TQjF4eHhfU09DCisKK2NvbmZpZyBTR0lfSU9DM19FVEgKKwlib29sICJTR0kgSU9DMyBFdGhlcm5ldCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBQQ0kgJiYgU0dJX0lQMjcKKwlzZWxlY3QgQ1JDMzIKKwlzZWxlY3QgTUlJCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCitjb25maWcgU0dJX0lPQzNfRVRIX0hXX1JYX0NTVU0KKwlib29sICJSZWNlaXZlIGhhcmR3YXJlIGNoZWNrc3VtcyIKKwlkZXBlbmRzIG9uIFNHSV9JT0MzX0VUSCAmJiBJTkVUCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIFNHSSBJT0MzIG5ldHdvcmsgYWRhcHRlciBzdXBwb3J0cyBUQ1AgYW5kIFVEUCBjaGVja3N1bXMgaW4KKwkgIGhhcmR3YXJlIHRvIG9mZmxvYWQgcHJvY2Vzc2luZyBvZiB0aGVzZSBjaGVja3N1bXMgZnJvbSB0aGUgQ1BVLiAgQXQKKwkgIHRoZSBtb21lbnQgb25seSBhY2NlbGVyYXRpb24gb2YgSVB2NCBpcyBzdXBwb3J0ZWQuICBUaGlzIG9wdGlvbgorCSAgZW5hYmxlcyBvZmZsb2FkaW5nIGZvciBjaGVja3N1bXMgb24gcmVjZWl2ZS4gIElmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBTR0lfSU9DM19FVEhfSFdfVFhfQ1NVTQorCWJvb2wgIlRyYW5zbWl0IGhhcmR3YXJlIGNoZWNrc3VtcyIKKwlkZXBlbmRzIG9uIFNHSV9JT0MzX0VUSCAmJiBJTkVUCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIFNHSSBJT0MzIG5ldHdvcmsgYWRhcHRlciBzdXBwb3J0cyBUQ1AgYW5kIFVEUCBjaGVja3N1bXMgaW4KKwkgIGhhcmR3YXJlIHRvIG9mZmxvYWQgcHJvY2Vzc2luZyBvZiB0aGVzZSBjaGVja3N1bXMgZnJvbSB0aGUgQ1BVLiAgQXQKKwkgIHRoZSBtb21lbnQgb25seSBhY2NlbGVyYXRpb24gb2YgSVB2NCBpcyBzdXBwb3J0ZWQuICBUaGlzIG9wdGlvbgorCSAgZW5hYmxlcyBvZmZsb2FkaW5nIGZvciBjaGVja3N1bXMgb24gdHJhbnNtaXQuICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgU0dJX08yTUFDRV9FVEgKKwl0cmlzdGF0ZSAiU0dJIE8yIE1BQ0UgRmFzdCBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFNHSV9JUDMyPXkKKworY29uZmlnIFNUTklDCisJdHJpc3RhdGUgIk5hdGlvbmFsIERQODM5MDJBViAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBTVVBFUkgKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBTdXBwb3J0IGZvciBjYXJkcyBiYXNlZCBvbiB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBEUDgzOTAyQVYKKwkgIFNULU5JQyBTZXJpYWwgTmV0d29yayBJbnRlcmZhY2UgQ29udHJvbGxlciBmb3IgVHdpc3RlZCBQYWlyLiAgVGhpcworCSAgaXMgYSAxME1iaXQvc2VjIEV0aGVybmV0IGNvbnRyb2xsZXIuICBQcm9kdWN0IG92ZXJ2aWV3IGFuZCBzcGVjcyBhdAorCSAgPGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0RQL0RQODM5MDJBLmh0bWw+LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgU1VOTEFOQ0UKKwl0cmlzdGF0ZSAiU3VuIExBTkNFIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgU0JVUworCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSAibGUiIGludGVyZmFjZSBwcmVzZW50IG9uIGFsbCAzMi1iaXQgU3BhcmMKKwkgIHN5c3RlbXMsIG9uIHNvbWUgb2xkZXIgVWx0cmEgc3lzdGVtcyBhbmQgYXMgYW4gU2J1cyBvcHRpb24uICBUaGVzZQorCSAgY2FyZHMgYXJlIGJhc2VkIG9uIHRoZSBBTUQgTGFuY2UgY2hpcHNldCwgd2hpY2ggaXMgYmV0dGVyIGtub3duCisJICB2aWEgdGhlIE5FMjEwMCBjYXJkcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc3VubGFuY2UuCisKK2NvbmZpZyBIQVBQWU1FQUwKKwl0cmlzdGF0ZSAiU3VuIEhhcHB5IE1lYWwgMTAvMTAwYmFzZVQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiAoU0JVUyB8fCBQQ0kpCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlICJobWUiIGludGVyZmFjZSBwcmVzZW50IG9uIG1vc3QgVWx0cmEKKwkgIHN5c3RlbXMgYW5kIGFzIGFuIG9wdGlvbiBvbiBvbGRlciBTYnVzIHN5c3RlbXMuIFRoaXMgZHJpdmVyIHN1cHBvcnRzCisJICBib3RoIFBDSSBhbmQgU2J1cyBkZXZpY2VzLiBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzIHRoZSAicWZlIiBxdWFkCisJICAxMDBiYXNlVCBkZXZpY2UgYXZhaWxhYmxlIGluIGJvdGggUENJIGFuZCBTYnVzIGNvbmZpZ3VyYXRpb25zLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzdW5obWUuCisKK2NvbmZpZyBTVU5CTUFDCisJdHJpc3RhdGUgIlN1biBCaWdNQUMgMTAvMTAwYmFzZVQgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBTQlVTICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSAiYmUiIGludGVyZmFjZSBhdmFpbGFibGUgYXMgYW4gU2J1cyBvcHRpb24uCisJICBUaGlzIGlzIFN1bidzIG9sZGVyIDEwMGJhc2VUIEV0aGVybmV0IGRldmljZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc3VuYm1hYy4KKworY29uZmlnIFNVTlFFCisJdHJpc3RhdGUgIlN1biBRdWFkRXRoZXJuZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBTQlVTCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlICJxZSIgMTBiYXNlVCBFdGhlcm5ldCBkZXZpY2UsIGF2YWlsYWJsZSBhcworCSAgYW4gU2J1cyBvcHRpb24uIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBRdWFkIEZhc3RFdGhlcm5ldAorCSAgInFmZSIgd2hpY2ggaXMgc3VwcG9ydGVkIGJ5IHRoZSBIYXBweSBNZWFsIGRyaXZlciBpbnN0ZWFkLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzdW5xZS4KKworY29uZmlnIFNVTkdFTQorCXRyaXN0YXRlICJTdW4gR0VNIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgUENJCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgU3VwcG9ydCBmb3IgdGhlIFN1biBHRU0gY2hpcCwgYWthIFN1biBHaWdhYml0RXRoZXJuZXQvUCAyLjAuICBTZWUgYWxzbworCSAgPGh0dHA6Ly93d3cuc3VuLmNvbS9wcm9kdWN0cy1uLXNvbHV0aW9ucy9oYXJkd2FyZS9kb2NzL3BkZi84MDYtMzk4NS0xMC5wZGY+LgorCitjb25maWcgTkVUX1ZFTkRPUl8zQ09NCisJYm9vbCAiM0NPTSBjYXJkcyIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiAoSVNBIHx8IEVJU0EgfHwgTUNBIHx8IFBDSSkKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIGJlbG9uZ2luZyB0byB0aGlzIGNsYXNzLCBzYXkgWQorCSAgYW5kIHJlYWQgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgTm90ZSB0aGF0IHRoZSBhbnN3ZXIgdG8gdGhpcyBxdWVzdGlvbiBkb2Vzbid0IGRpcmVjdGx5IGFmZmVjdCB0aGUKKwkgIGtlcm5lbDogc2F5aW5nIE4gd2lsbCBqdXN0IGNhdXNlIHRoZSBjb25maWd1cmF0b3IgdG8gc2tpcCBhbGwKKwkgIHRoZSBxdWVzdGlvbnMgYWJvdXQgM0NPTSBjYXJkcy4gSWYgeW91IHNheSBZLCB5b3Ugd2lsbCBiZSBhc2tlZCBmb3IKKwkgIHlvdXIgc3BlY2lmaWMgY2FyZCBpbiB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucy4KKworY29uZmlnIEVMMQorCXRyaXN0YXRlICIzYzUwMSBcIkV0aGVyTGlua1wiIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfVkVORE9SXzNDT00gJiYgSVNBCisJLS0taGVscC0tLQorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiAgQWxzbywgY29uc2lkZXIgYnV5aW5nIGEKKwkgIG5ldyBjYXJkLCBzaW5jZSB0aGUgM2M1MDEgaXMgc2xvdywgYnJva2VuLCBhbmQgb2Jzb2xldGU6IHlvdSB3aWxsCisJICBoYXZlIHByb2JsZW1zLiAgU29tZSBwZW9wbGUgc3VnZ2VzdCB0byBwaW5nICgibWFuIHBpbmciKSBhIG5lYXJieQorCSAgbWFjaGluZSBldmVyeSBtaW51dGUgKCJtYW4gY3JvbiIpIHdoZW4gdXNpbmcgdGhpcyBjYXJkLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgM2M1MDEuCisKK2NvbmZpZyBFTDIKKwl0cmlzdGF0ZSAiM2M1MDMgXCJFdGhlckxpbmsgSUlcIiBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1ZFTkRPUl8zQ09NICYmIElTQQorCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZAorCSAgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIDNjNTAzLgorCitjb25maWcgRUxQTFVTCisJdHJpc3RhdGUgIjNjNTA1IFwiRXRoZXJMaW5rIFBsdXNcIiBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1ZFTkRPUl8zQ09NICYmIElTQQorCS0tLWhlbHAtLS0KKwkgIEluZm9ybWF0aW9uIGFib3V0IHRoaXMgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgY2FuIGJlIGZvdW5kIGluCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvM2M1MDUudHh0Pi4gIElmIHlvdSBoYXZlIGEgY2FyZCBvZgorCSAgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgM2M1MDUuCisKK2NvbmZpZyBFTDE2CisJdHJpc3RhdGUgIjNjNTA3IFwiRXRoZXJMaW5rIDE2XCIgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVF9WRU5ET1JfM0NPTSAmJiBJU0EgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgM2M1MDcuCisKK2NvbmZpZyBFTDMKKwl0cmlzdGF0ZSAiM2M1MDkvM2M1MjkgKE1DQSkvM2M1NzkgXCJFdGhlckxpbmsgSUlJXCIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9WRU5ET1JfM0NPTSAmJiAoSVNBIHx8IEVJU0EgfHwgTUNBKQorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgYmVsb25naW5nIHRvIHRoZSAzQ29tCisJICBFdGhlckxpbmtJSUkgc2VyaWVzLCBzYXkgWSBhbmQgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZQorCSAgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBJZiB5b3VyIGNhcmQgaXMgbm90IHdvcmtpbmcgeW91IG1heSBuZWVkIHRvIHVzZSB0aGUgRE9TCisJICBzZXR1cCBkaXNrIHRvIGRpc2FibGUgUGx1ZyAmIFBsYXkgbW9kZSwgYW5kIHRvIHNlbGVjdCB0aGUgZGVmYXVsdAorCSAgbWVkaWEgdHlwZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIDNjNTA5LgorCitjb25maWcgM0M1MTUKKwl0cmlzdGF0ZSAiM2M1MTUgSVNBIFwiRmFzdCBFdGhlckxpbmtcIiIKKwlkZXBlbmRzIG9uIE5FVF9WRU5ET1JfM0NPTSAmJiAoSVNBIHx8IEVJU0EpCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSAzQ29tIElTQSBFdGhlckxpbmsgWEwgIkNvcmtzY3JldyIgM2M1MTUgRmFzdCBFdGhlcm5ldAorCSAgbmV0d29yayBjYXJkLCBzYXkgWSBhbmQgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgM2M1MTUuCisKK2NvbmZpZyBFTE1DCisJdHJpc3RhdGUgIjNjNTIzIFwiRXRoZXJMaW5rL01DXCIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9WRU5ET1JfM0NPTSAmJiBNQ0FfTEVHQUNZCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgM2M1MjMuCisKK2NvbmZpZyBFTE1DX0lJCisJdHJpc3RhdGUgIjNjNTI3IFwiRXRoZXJMaW5rL01DIDMyXCIgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVF9WRU5ET1JfM0NPTSAmJiBNQ0EgJiYgTUNBX0xFR0FDWQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZAorCSAgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIDNjNTI3LgorCitjb25maWcgVk9SVEVYCisJdHJpc3RhdGUgIjNjNTkwLzNjOTAwIHNlcmllcyAoNTkyLzU5NS81OTcpIFwiVm9ydGV4L0Jvb21lcmFuZ1wiIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfVkVORE9SXzNDT00gJiYgKFBDSSB8fCBFSVNBKQorCXNlbGVjdCBNSUkKKwktLS1oZWxwLS0tCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGRyaXZlciBzdXBwb3J0IGZvciBhIGxhcmdlIG51bWJlciBvZiAxMG1icHMgYW5kCisJICAxMC8xMDBtYnBzIEVJU0EsIFBDSSBhbmQgUENNQ0lBIDNDb20gbmV0d29yayBjYXJkczoKKworCSAgIlZvcnRleCIgICAgKEZhc3QgRXRoZXJMaW5rIDNjNTkwLzNjNTkyLzNjNTk1LzNjNTk3KSBFSVNBIGFuZCBQQ0kKKwkgICJCb29tZXJhbmciIChFdGhlckxpbmsgWEwgM2M5MDAgb3IgM2M5MDUpICAgICAgICAgICAgUENJCisJICAiQ3ljbG9uZSIgICAoM2M1NDAvM2M5MDAvM2M5MDUvM2M5ODAvM2M1NzUvM2M2NTYpICAgIFBDSSBhbmQgQ2FyZGJ1cworCSAgIlRvcm5hZG8iICAgKDNjOTA1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0kKKwkgICJIdXJyaWNhbmUiICgzYzU1NS8zY1NPSE8pICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJCisKKwkgIElmIHlvdSBoYXZlIHN1Y2ggYSBjYXJkLCBzYXkgWSBhbmQgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sCisJICBhdmFpbGFibGUgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiBNb3JlCisJICBzcGVjaWZpYyBpbmZvcm1hdGlvbiBpcyBpbgorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3ZvcnRleC50eHQ+IGFuZCBpbiB0aGUgY29tbWVudHMgYXQKKwkgIHRoZSBiZWdpbm5pbmcgb2YgPGZpbGU6ZHJpdmVycy9uZXQvM2M1OXguYz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4KKworY29uZmlnIFRZUEhPT04KKwl0cmlzdGF0ZSAiM2NyOTkwIHNlcmllcyBcIlR5cGhvb25cIiBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1ZFTkRPUl8zQ09NICYmIFBDSQorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgZHJpdmVyIHN1cHBvcnQgZm9yIHRoZSAzY3I5OTAgc2VyaWVzIG9mIGNhcmRzOgorCisJICAzQzk5MC1UWCwgM0NSOTkwLVRYLTk1LCAzQ1I5OTAtVFgtOTcsIDNDUjk5MC1GWC05NSwgM0NSOTkwLUZYLTk3LAorCSAgM0NSOTkwU1ZSLCAzQ1I5OTBTVlI5NSwgM0NSOTkwU1ZSOTcsIDNDUjk5MC1GWC05NSBTZXJ2ZXIsCisJICAzQ1I5OTAtRlgtOTcgU2VydmVyLCAzQzk5MEItVFgtTSwgM0M5OTBCU1ZSCisKKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZAorCSAgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHR5cGhvb24uCisKK2NvbmZpZyBMQU5DRQorCXRyaXN0YXRlICJBTUQgTEFOQ0UgYW5kIFBDbmV0IChBVDE1MDAgYW5kIE5FMjEwMCkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBJU0EKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uIFNvbWUgTGlua1N5cyBjYXJkcyBhcmUKKwkgIG9mIHRoaXMgdHlwZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbGFuY2UuICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitjb25maWcgTkVUX1ZFTkRPUl9TTUMKKwlib29sICJXZXN0ZXJuIERpZ2l0YWwvU01DIGNhcmRzIgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIChJU0EgfHwgTUNBIHx8IEVJU0EgfHwgTUFDKQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgYmVsb25naW5nIHRvIHRoaXMgY2xhc3MsIHNheSBZCisJICBhbmQgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBOb3RlIHRoYXQgdGhlIGFuc3dlciB0byB0aGlzIHF1ZXN0aW9uIGRvZXNuJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQorCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAorCSAgdGhlIHF1ZXN0aW9ucyBhYm91dCBXZXN0ZXJuIERpZ2l0YWwgY2FyZHMuIElmIHlvdSBzYXkgWSwgeW91IHdpbGwgYmUKKwkgIGFza2VkIGZvciB5b3VyIHNwZWNpZmljIGNhcmQgaW4gdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMuCisKK2NvbmZpZyBXRDgweDMKKwl0cmlzdGF0ZSAiV0Q4MCozIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfVkVORE9SX1NNQyAmJiBJU0EKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB3ZC4KKworY29uZmlnIFVMVFJBTUNBCisJdHJpc3RhdGUgIlNNQyBVbHRyYSBNQ0Egc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9WRU5ET1JfU01DICYmIE1DQQorCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlIGFuZCBhcmUgcnVubmluZworCSAgYW4gTUNBIGJhc2VkIHN5c3RlbSAoUFMvMiksIHNheSBZIGFuZCByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywKKwkgIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbWMtbWNhLgorCitjb25maWcgVUxUUkEKKwl0cmlzdGF0ZSAiU01DIFVsdHJhIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfVkVORE9SX1NNQyAmJiBJU0EKKwlzZWxlY3QgQ1JDMzIKKwktLS1oZWxwLS0tCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIEltcG9ydGFudDogVGhlcmUgaGF2ZSBiZWVuIG1hbnkgcmVwb3J0cyB0aGF0LCB3aXRoIHNvbWUgbW90aGVyYm9hcmRzCisJICBtaXhpbmcgYW4gU01DIFVsdHJhIGFuZCBhbiBBZGFwdGVjIEFIQTE1NHggU0NTSSBjYXJkIChvciBjb21wYXRpYmxlLAorCSAgc3VjaCBhcyBzb21lIEJ1c0xvZ2ljIG1vZGVscykgY2F1c2VzIGNvcnJ1cHRpb24gcHJvYmxlbXMgd2l0aCBtYW55CisJICBvcGVyYXRpbmcgc3lzdGVtcy4gVGhlIExpbnV4IHNtYy11bHRyYSBkcml2ZXIgaGFzIGEgd29yay1hcm91bmQgZm9yCisJICB0aGlzIGJ1dCBrZWVwIGl0IGluIG1pbmQgaWYgeW91IGhhdmUgc3VjaCBhIFNDU0kgY2FyZCBhbmQgaGF2ZQorCSAgcHJvYmxlbXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbWMtdWx0cmEuCisKK2NvbmZpZyBVTFRSQTMyCisJdHJpc3RhdGUgIlNNQyBVbHRyYTMyIEVJU0Egc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9WRU5ET1JfU01DICYmIEVJU0EKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbWMtdWx0cmEzMi4KKworY29uZmlnIFNNQzkxWAorCXRyaXN0YXRlICJTTUMgOTFDOXgvOTFDMXh4eCBzdXBwb3J0IgorCXNlbGVjdCBDUkMzMgorCXNlbGVjdCBNSUkKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiAoQVJNIHx8IFJFRFdPT0RfNSB8fCBSRURXT09EXzYgfHwgTTMyUiB8fCBTVVBFUkgpCisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgU01DJ3MgOTF4IHNlcmllcyBvZiBFdGhlcm5ldCBjaGlwc2V0cywKKwkgIGluY2x1ZGluZyB0aGUgU01DOTFDOTQgYW5kIHRoZSBTTUM5MUMxMTEuIFNheSBZIGlmIHlvdSB3YW50IGl0CisJICBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwsIGFuZCByZWFkIHRoZSBmaWxlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc21jOS50eHQ+ICBhbmQgdGhlIEV0aGVybmV0LUhPV1RPLAorCSAgYXZhaWxhYmxlIGZyb20gIDxodHRwOi8vd3d3LmxpbnV4ZG9jLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUaGlzIGRyaXZlciBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZSAoID0gY29kZSB3aGljaCBjYW4gYmUKKwkgIGluc2VydGVkIGluIGFuZCByZW1vdmVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdSB3YW50KS4KKwkgIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc21jOTF4LiAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhCisJICBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4gYXMgd2VsbAorCSAgYXMgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uCisKK2NvbmZpZyBTTUM5MTk0CisJdHJpc3RhdGUgIlNNQyA5MTk0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfVkVORE9SX1NNQyAmJiAoSVNBIHx8IE1BQyAmJiBCUk9LRU4pCisJc2VsZWN0IENSQzMyCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciB0aGUgU01DOXh4eCBiYXNlZCBFdGhlcm5ldCBjYXJkcy4gQ2hvb3NlIHRoaXMKKwkgIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIERFTEwgbGFwdG9wIHdpdGggdGhlIGRvY2tpbmcgc3RhdGlvbiwgb3IKKwkgIGFub3RoZXIgU01DOTE5Mi85MTk0IGJhc2VkIGNoaXBzZXQuICBTYXkgWSBpZiB5b3Ugd2FudCBpdCBjb21waWxlZAorCSAgaW50byB0aGUga2VybmVsLCBhbmQgcmVhZCB0aGUgZmlsZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3NtYzkudHh0PiBhbmQgdGhlIEV0aGVybmV0LUhPV1RPLAorCSAgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNtYzkxOTQuCisKK2NvbmZpZyBORVRfVkVORE9SX1JBQ0FMCisJYm9vbCAiUmFjYWwtSW50ZXJsYW4gKE1pY29tKSBOSSBjYXJkcyIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBJU0EKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIGJlbG9uZ2luZyB0byB0aGlzIGNsYXNzLCBzdWNoCisJICBhcyB0aGUgTkk1MDEwLCBOSTUyMTAgb3IgTkk2MjEwLCBzYXkgWSBhbmQgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sCisJICBhdmFpbGFibGUgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBOb3RlIHRoYXQgdGhlIGFuc3dlciB0byB0aGlzIHF1ZXN0aW9uIGRvZXNuJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQorCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAorCSAgdGhlIHF1ZXN0aW9ucyBhYm91dCBOSSBjYXJkcy4gSWYgeW91IHNheSBZLCB5b3Ugd2lsbCBiZSBhc2tlZCBmb3IKKwkgIHlvdXIgc3BlY2lmaWMgY2FyZCBpbiB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucy4KKworY29uZmlnIE5JNTAxMAorCXRyaXN0YXRlICJOSTUwMTAgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVF9WRU5ET1JfUkFDQUwgJiYgSVNBICYmIEVYUEVSSU1FTlRBTCAmJiBCUk9LRU5fT05fU01QCisJLS0taGVscC0tLQorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiBOb3RlIHRoYXQgdGhpcyBpcyBzdGlsbAorCSAgZXhwZXJpbWVudGFsIGNvZGUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBuaTUwMTAuCisKK2NvbmZpZyBOSTUyCisJdHJpc3RhdGUgIk5JNTIxMCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1ZFTkRPUl9SQUNBTCAmJiBJU0EKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBuaTUyLgorCitjb25maWcgTkk2NQorCXRyaXN0YXRlICJOSTY1MTAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9WRU5ET1JfUkFDQUwgJiYgSVNBCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbmk2NS4KKworc291cmNlICJkcml2ZXJzL25ldC90dWxpcC9LY29uZmlnIgorCitjb25maWcgQVQxNzAwCisJdHJpc3RhdGUgIkFUMTcwMC8xNzIwIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgKElTQSB8fCBNQ0FfTEVHQUNZKSAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgQ1JDMzIKKwktLS1oZWxwLS0tCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBhdDE3MDAuCisKK2NvbmZpZyBERVBDQQorCXRyaXN0YXRlICJERVBDQSwgREUxMHgsIERFMjAwLCBERTIwMSwgREUyMDIsIERFNDIyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgKElTQSB8fCBFSVNBIHx8IE1DQSkKKwlzZWxlY3QgQ1JDMzIKKwktLS1oZWxwLS0tCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4gYXMgd2VsbCBhcworCSAgPGZpbGU6ZHJpdmVycy9uZXQvZGVwY2EuYz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBkZXBjYS4KKworY29uZmlnIEhQMTAwCisJdHJpc3RhdGUgIkhQIDEwLzEwMFZHIFBDTEFOIChJU0EsIEVJU0EsIFBDSSkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiAoSVNBIHx8IEVJU0EgfHwgUENJKQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZAorCSAgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGhwMTAwLgorCitjb25maWcgTkVUX0lTQQorCWJvb2wgIk90aGVyIElTQSBjYXJkcyIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBJU0EKKwktLS1oZWxwLS0tCisJICBJZiB5b3VyIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIGhhc24ndCBiZWVuIG1lbnRpb25lZCB5ZXQgYW5kIGl0cworCSAgYnVzIHN5c3RlbSAodGhhdCdzIHRoZSB3YXkgdGhlIGNhcmRzIHRhbGtzIHRvIHRoZSBvdGhlciBjb21wb25lbnRzCisJICBvZiB5b3VyIGNvbXB1dGVyKSBpcyBJU0EgKGFzIG9wcG9zZWQgdG8gRUlTQSwgVkxCIG9yIFBDSSksIHNheSBZLgorCSAgTWFrZSBzdXJlIHlvdSBrbm93IHRoZSBuYW1lIG9mIHlvdXIgY2FyZC4gUmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sCisJICBhdmFpbGFibGUgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCisJICBOb3RlIHRoYXQgdGhlIGFuc3dlciB0byB0aGlzIHF1ZXN0aW9uIGRvZXNuJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQorCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAorCSAgdGhlIHJlbWFpbmluZyBJU0EgbmV0d29yayBjYXJkIHF1ZXN0aW9ucy4gSWYgeW91IHNheSBZLCB5b3Ugd2lsbCBiZQorCSAgYXNrZWQgZm9yIHlvdXIgc3BlY2lmaWMgY2FyZCBpbiB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucy4KKworY29uZmlnIEUyMTAwCisJdHJpc3RhdGUgIkNhYmxldHJvbiBFMjF4eCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0lTQQorCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZAorCSAgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGUyMTAwLgorCitjb25maWcgRVdSSzMKKwl0cmlzdGF0ZSAiRXRoZXJXT1JLUyAzIChERTIwMywgREUyMDQsIERFMjA1KSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0lTQQorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBERTIwMywgREUyMDQgYW5kIERFMjA1IG5ldHdvcmsgKEV0aGVybmV0KQorCSAgY2FyZHMuIElmIHRoaXMgaXMgZm9yIHlvdSwgc2F5IFkgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9ld3JrMy50eHQ+IGluIHRoZSBrZXJuZWwgc291cmNlIGFzCisJICB3ZWxsIGFzIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBld3JrMy4KKworY29uZmlnIEVFWFBSRVNTCisJdHJpc3RhdGUgIkV0aGVyRXhwcmVzcyAxNiBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0lTQQorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBoYXZlIGFuIEV0aGVyRXhwcmVzczE2IG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkLCBzYXkgWSBhbmQKKwkgIHJlYWQgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gIE5vdGUgdGhhdCB0aGUgSW50ZWwKKwkgIEV0aGVyRXhwcmVzczE2IGNhcmQgdXNlZCB0byBiZSByZWdhcmRlZCBhcyBhIHZlcnkgcG9vciBjaG9pY2UKKwkgIGJlY2F1c2UgdGhlIGRyaXZlciB3YXMgdmVyeSB1bnJlbGlhYmxlLiBXZSBub3cgaGF2ZSBhIG5ldyBkcml2ZXIKKwkgIHRoYXQgc2hvdWxkIGRvIGJldHRlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGVleHByZXNzLgorCitjb25maWcgRUVYUFJFU1NfUFJPCisJdHJpc3RhdGUgIkV0aGVyRXhwcmVzc1BybyBzdXBwb3J0L0V0aGVyRXhwcmVzcyAxMCAoaTgyNTk1KSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0lTQQorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWS4gVGhpcworCSAgZHJpdmVyIHN1cHBvcnRzIGludGVsIGk4MjU5NXtGWCxUWH0gYmFzZWQgYm9hcmRzLiBOb3RlIGhvd2V2ZXIKKwkgIHRoYXQgdGhlIEV0aGVyRXhwcmVzcyBQUk8vMTAwIEV0aGVybmV0IGNhcmQgaGFzIGl0cyBvd24gc2VwYXJhdGUKKwkgIGRyaXZlci4gIFBsZWFzZSByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBlZXByby4KKworY29uZmlnIEZNVjE4WAorCXRyaXN0YXRlICJGTVYtMTgxLzE4Mi8xODMvMTg0IHN1cHBvcnQgKE9CU09MRVRFKSIKKwlkZXBlbmRzIG9uIE5FVF9JU0EgJiYgT0JTT0xFVEUKKwktLS1oZWxwLS0tCisJICBJZiB5b3UgaGF2ZSBhIEZ1aml0c3UgRk1WLTE4MS8xODIvMTgzLzE4NCBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCwKKwkgIHNheSBZIGFuZCByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIElmIHlvdSB1c2UgYW4gRk1WLTE4MyBvciBGTVYtMTg0IGFuZCBpdCBpcyBub3Qgd29ya2luZywgeW91IG1heSBuZWVkCisJICB0byBkaXNhYmxlIFBsdWcgJiBQbGF5IG1vZGUgb2YgdGhlIGNhcmQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBmbXYxOHguCisKK2NvbmZpZyBIUExBTl9QTFVTCisJdHJpc3RhdGUgIkhQIFBDTEFOKyAoMjcyNDdCIGFuZCAyNzI1MkEpIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfSVNBCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaHAtcGx1cy4KKworY29uZmlnIEhQTEFOCisJdHJpc3RhdGUgIkhQIFBDTEFOICgyNzI0NSBhbmQgb3RoZXIgMjd4eHggc2VyaWVzKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0lTQQorCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZAorCSAgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGhwLgorCitjb25maWcgTFA0ODZFCisJdHJpc3RhdGUgIkxQNDg2RSBvbiBib2FyZCBFdGhlcm5ldCIKKwlkZXBlbmRzIG9uIE5FVF9JU0EKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIDgyNTk2LWJhc2VkIG9uLWJvYXJkIEV0aGVybmV0IGNvbnRyb2xsZXIKKwkgIGZvciB0aGUgUGFudGhlciBtb3RoZXJib2FyZCwgd2hpY2ggaXMgb25lIG9mIHRoZSB0d28gc2hpcHBlZCBpbiB0aGUKKwkgIEludGVsIFByb2Zlc3Npb25hbCBXb3Jrc3RhdGlvbi4KKworY29uZmlnIEVUSDE2SQorCXRyaXN0YXRlICJJQ0wgRXRoZXJUZWFtIDE2aS8zMiBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0lTQQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZAorCSAgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGV0aDE2aS4KKworY29uZmlnIE5FMjAwMAorCXRyaXN0YXRlICJORTIwMDAvTkUxMDAwIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfSVNBIHx8IChRNDAgJiYgbSkgfHwgTTMyUgorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZAorCSAgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gIE1hbnkgRXRoZXJuZXQgY2FyZHMKKwkgIHdpdGhvdXQgYSBzcGVjaWZpYyBkcml2ZXIgYXJlIGNvbXBhdGlibGUgd2l0aCBORTIwMDAuCisKKwkgIElmIHlvdSBoYXZlIGEgUENJIE5FMjAwMCBjYXJkIGhvd2V2ZXIsIHNheSBOIGhlcmUgYW5kIFkgdG8gIlBDSQorCSAgTkUyMDAwIHN1cHBvcnQiLCBhYm92ZS4gSWYgeW91IGhhdmUgYSBORTIwMDAgY2FyZCBhbmQgYXJlIHJ1bm5pbmcgb24KKwkgIGFuIE1DQSBzeXN0ZW0gKGEgYnVzIHN5c3RlbSB1c2VkIG9uIHNvbWUgSUJNIFBTLzIgY29tcHV0ZXJzIGFuZAorCSAgbGFwdG9wcyksIHNheSBOIGhlcmUgYW5kIFkgdG8gIk5FLzIgKG5lMjAwMCBNQ0EgdmVyc2lvbikgc3VwcG9ydCIsCisJICBiZWxvdy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG5lLgorCitjb25maWcgWk5FVAorCXRyaXN0YXRlICJaZW5pdGggWi1Ob3RlIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORVRfSVNBICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoZSBaZW5pdGggWi1Ob3RlIG5vdGVib29rIGNvbXB1dGVyIGhhcyBhIGJ1aWx0LWluIG5ldHdvcmsKKwkgIChFdGhlcm5ldCkgY2FyZCwgYW5kIHRoaXMgaXMgdGhlIExpbnV4IGRyaXZlciBmb3IgaXQuIE5vdGUgdGhhdCB0aGUKKwkgIElCTSBUaGlua3BhZCAzMDAgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBaLU5vdGUgYW5kIGlzIGFsc28gc3VwcG9ydGVkCisJICBieSB0aGlzIGRyaXZlci4gUmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCitjb25maWcgU0VFUTgwMDUKKwl0cmlzdGF0ZSAiU0VFUTgwMDUgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVF9JU0EgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFNFRVEgODAwNSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZC4gIElmIHRoaXMKKwkgIGlzIGZvciB5b3UsIHJlYWQgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNlZXE4MDA1LgorCitjb25maWcgU0tfRzE2CisJdHJpc3RhdGUgIlNLX0cxNiBzdXBwb3J0IChPQlNPTEVURSkiCisJZGVwZW5kcyBvbiBORVRfSVNBICYmIE9CU09MRVRFCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCitjb25maWcgU0tNQworCXRyaXN0YXRlICJTS25ldCBNQ0Egc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBNQ0EgJiYgQlJPS0VOCisJLS0taGVscC0tLQorCSAgVGhlc2UgYXJlIE1pY3JvIENoYW5uZWwgRXRoZXJuZXQgYWRhcHRlcnMuIFlvdSBuZWVkIHRvIHNheSBZIHRvICJNQ0EKKwkgIHN1cHBvcnQiIGluIG9yZGVyIHRvIHVzZSB0aGlzIGRyaXZlci4gIFN1cHBvcnRlZCBjYXJkcyBhcmUgdGhlIFNLbmV0CisJICBKdW5pb3IgTUMyIGFuZCB0aGUgU0tuZXQgTUMyKCspLiAgVGhlIGRyaXZlciBhdXRvbWF0aWNhbGx5CisJICBkaXN0aW5ndWlzaGVzIGJldHdlZW4gdGhlIHR3byBjYXJkcy4gTm90ZSB0aGF0IHVzaW5nIG11bHRpcGxlIGJvYXJkcworCSAgb2YgZGlmZmVyZW50IHR5cGUgaGFzbid0IGJlZW4gdGVzdGVkIHdpdGggdGhpcyBkcml2ZXIuICBTYXkgWSBpZiB5b3UKKwkgIGhhdmUgb25lIG9mIHRoZXNlIEV0aGVybmV0IGFkYXB0ZXJzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc2tfbWNhLgorCitjb25maWcgTkUyX01DQQorCXRyaXN0YXRlICJORS8yIChuZTIwMDAgTUNBIHZlcnNpb24pIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgTUNBX0xFR0FDWQorCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZAorCSAgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG5lMi4KKworY29uZmlnIElCTUxBTkEKKwl0cmlzdGF0ZSAiSUJNIExBTiBBZGFwdGVyL0Egc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBNQ0EgJiYgTUNBX0xFR0FDWQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBNaWNybyBDaGFubmVsIEV0aGVybmV0IGFkYXB0ZXIuICBZb3UgbmVlZCB0byBzZXQKKwkgIENPTkZJR19NQ0EgdG8gdXNlIHRoaXMgZHJpdmVyLiAgSXQgaXMgYm90aCBhdmFpbGFibGUgYXMgYW4gaW4ta2VybmVsCisJICBkcml2ZXIgYW5kIGFzIGEgbW9kdWxlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG9ubHkKKwkgIGN1cnJlbnRseSBzdXBwb3J0ZWQgY2FyZCBpcyB0aGUgSUJNIExBTiBBZGFwdGVyL0EgZm9yIEV0aGVybmV0LiAgSXQKKwkgIHdpbGwgYm90aCBzdXBwb3J0IDE2SyBhbmQgMzJLIG1lbW9yeSB3aW5kb3dzLCBob3dldmVyIGEgMzJLIHdpbmRvdworCSAgZ2l2ZXMgYSBiZXR0ZXIgc2VjdXJpdHkgYWdhaW5zdCBwYWNrZXQgbG9zc2VzLiAgVXNhZ2Ugb2YgbXVsdGlwbGUKKwkgIGJvYXJkcyB3aXRoIHRoaXMgZHJpdmVyIHNob3VsZCBiZSBwb3NzaWJsZSwgYnV0IGhhcyBub3QgYmVlbiB0ZXN0ZWQKKwkgIHVwIHRvIG5vdyBkdWUgdG8gbGFjayBvZiBoYXJkd2FyZS4KKworY29uZmlnIElCTVZFVEgKKwl0cmlzdGF0ZSAiSUJNIExBTiBWaXJ0dWFsIEV0aGVybmV0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRERVZJQ0VTICYmIE5FVF9FVEhFUk5FVCAmJiBQUENfUFNFUklFUworCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHZpcnR1YWwgZXRoZXJuZXQgYWRhcHRlcnMgb24gbmV3ZXIgSUJNIGlTZXJpZXMKKwkgIGFuZCBwU2VyaWVzIHN5c3RlbXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBpYm12ZXRoLgorCitjb25maWcgSUJNX0VNQUMKKwl0cmlzdGF0ZSAiSUJNIFBQQzR4eCBFTUFDIGRyaXZlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gNHh4CisJc2VsZWN0IENSQzMyCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIElCTSBQUEM0eHggRU1BQyBmYW1pbHkgb2Ygb24tY2hpcAorCSAgRXRoZXJuZXQgY29udHJvbGxlcnMuCisKK2NvbmZpZyBJQk1fRU1BQ19FUlJNU0cKKwlib29sICJWZXJib3NlIGVycm9yIG1lc3NhZ2VzIgorCWRlcGVuZHMgb24gSUJNX0VNQUMKKworY29uZmlnIElCTV9FTUFDX1JYQgorCWludCAiTnVtYmVyIG9mIHJlY2VpdmUgYnVmZmVycyIKKwlkZXBlbmRzIG9uIElCTV9FTUFDCisJZGVmYXVsdCAiMTI4IiBpZiBJQk1fRU1BQzQKKwlkZWZhdWx0ICI2NCIKKworY29uZmlnIElCTV9FTUFDX1RYQgorCWludCAiTnVtYmVyIG9mIHRyYW5zbWl0IGJ1ZmZlcnMiCisJZGVwZW5kcyBvbiBJQk1fRU1BQworCWRlZmF1bHQgIjEyOCIgaWYgSUJNX0VNQUM0CisJZGVmYXVsdCAiOCIKKworY29uZmlnIElCTV9FTUFDX0ZHQVAKKwlpbnQgIkZyYW1lIGdhcCIKKwlkZXBlbmRzIG9uIElCTV9FTUFDCisJZGVmYXVsdCAiOCIKKworY29uZmlnIElCTV9FTUFDX1NLQlJFUworCWludCAiU2tiIHJlc2VydmUgYW1vdW50IgorCWRlcGVuZHMgb24gSUJNX0VNQUMKKwlkZWZhdWx0ICIwIgorCitjb25maWcgTkVUX1BDSQorCWJvb2wgIkVJU0EsIFZMQiwgUENJIGFuZCBvbiBib2FyZCBjb250cm9sbGVycyIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiAoSVNBIHx8IEVJU0EgfHwgUENJKQorCWhlbHAKKwkgIFRoaXMgaXMgYW5vdGhlciBjbGFzcyBvZiBuZXR3b3JrIGNhcmRzIHdoaWNoIGF0dGFjaCBkaXJlY3RseSB0byB0aGUKKwkgIGJ1cy4gSWYgeW91IGhhdmUgb25lIG9mIHRob3NlLCBzYXkgWSBhbmQgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sCisJICBhdmFpbGFibGUgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBOb3RlIHRoYXQgdGhlIGFuc3dlciB0byB0aGlzIHF1ZXN0aW9uIGRvZXNuJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQorCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAorCSAgdGhlIHF1ZXN0aW9ucyBhYm91dCB0aGlzIGNsYXNzIG9mIG5ldHdvcmsgY2FyZHMuIElmIHlvdSBzYXkgWSwgeW91CisJICB3aWxsIGJlIGFza2VkIGZvciB5b3VyIHNwZWNpZmljIGNhcmQgaW4gdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMuIElmCisJICB5b3UgYXJlIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBQQ05FVDMyCisJdHJpc3RhdGUgIkFNRCBQQ25ldDMyIFBDSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDSSAmJiBQQ0kKKwlzZWxlY3QgQ1JDMzIKKwlzZWxlY3QgTUlJCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBQQ25ldDMyIG9yIFBDbmV0UENJIGJhc2VkIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkLAorCSAgYW5zd2VyIFkgaGVyZSBhbmQgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcGNuZXQzMi4KKworY29uZmlnIEFNRDgxMTFfRVRICisJdHJpc3RhdGUgIkFNRCA4MTExIChuZXcgUENJIGxhbmNlKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDSSAmJiBQQ0kKKwlzZWxlY3QgQ1JDMzIKKwlzZWxlY3QgTUlJCisJaGVscAorCSAgSWYgeW91IGhhdmUgYW4gQU1EIDgxMTEtYmFzZWQgUENJIGxhbmNlIGV0aGVybmV0IGNhcmQsCisJICBhbnN3ZXIgWSBoZXJlIGFuZCByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBhbWQ4MTExZS4KK2NvbmZpZyBBTUQ4MTExRV9OQVBJCisJYm9vbCAiRW5hYmxlIE5BUEkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFNRDgxMTFfRVRICisJaGVscAorCSAgTkFQSSBpcyBhIG5ldyBkcml2ZXIgQVBJIGRlc2lnbmVkIHRvIHJlZHVjZSBDUFUgYW5kIGludGVycnVwdCBsb2FkCisJICB3aGVuIHRoZSBkcml2ZXIgaXMgcmVjZWl2aW5nIGxvdHMgb2YgcGFja2V0cyBmcm9tIHRoZSBjYXJkLiBJdCBpcworCSAgc3RpbGwgc29tZXdoYXQgZXhwZXJpbWVudGFsIGFuZCB0aHVzIG5vdCB5ZXQgZW5hYmxlZCBieSBkZWZhdWx0LgorCisJICBJZiB5b3VyIGVzdGltYXRlZCBSeCBsb2FkIGlzIDEwa3BwcyBvciBtb3JlLCBvciBpZiB0aGUgY2FyZCB3aWxsIGJlCisJICBkZXBsb3llZCBvbiBwb3RlbnRpYWxseSB1bmZyaWVuZGx5IG5ldHdvcmtzIChlLmcuIGluIGEgZmlyZXdhbGwpLAorCSAgdGhlbiBzYXkgWSBoZXJlLgorCisJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL05BUElfSE9XVE8udHh0PiBmb3IgbW9yZQorCSAgaW5mb3JtYXRpb24uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIEFEQVBURUNfU1RBUkZJUkUKKwl0cmlzdGF0ZSAiQWRhcHRlYyBTdGFyZmlyZS9EdXJhTEFOIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIFBDSQorCXNlbGVjdCBDUkMzMgorCXNlbGVjdCBNSUkKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIEFkYXB0ZWMgU3RhcmZpcmUgKG9yIER1cmFMQU4pIFBDSSBuZXR3b3JrCisJICBhZGFwdGVyLiBUaGUgRHVyYUxBTiBjaGlwIGlzIHVzZWQgb24gdGhlIDY0IGJpdCBQQ0kgYm9hcmRzIGZyb20KKwkgIEFkYXB0ZWMgZS5nLiB0aGUgQU5BLTY5MjJBLiBUaGUgb2xkZXIgMzIgYml0IGJvYXJkcyB1c2UgdGhlIHR1bGlwCisJICBkcml2ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHN0YXJmaXJlLiAgVGhpcyBpcyByZWNvbW1lbmRlZC4KKworY29uZmlnIEFEQVBURUNfU1RBUkZJUkVfTkFQSQorCWJvb2wgIlVzZSBSeCBQb2xsaW5nIChOQVBJKSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEFEQVBURUNfU1RBUkZJUkUgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgTkFQSSBpcyBhIG5ldyBkcml2ZXIgQVBJIGRlc2lnbmVkIHRvIHJlZHVjZSBDUFUgYW5kIGludGVycnVwdCBsb2FkCisJICB3aGVuIHRoZSBkcml2ZXIgaXMgcmVjZWl2aW5nIGxvdHMgb2YgcGFja2V0cyBmcm9tIHRoZSBjYXJkLiBJdCBpcworCSAgc3RpbGwgc29tZXdoYXQgZXhwZXJpbWVudGFsIGFuZCB0aHVzIG5vdCB5ZXQgZW5hYmxlZCBieSBkZWZhdWx0LgorCisJICBJZiB5b3VyIGVzdGltYXRlZCBSeCBsb2FkIGlzIDEwa3BwcyBvciBtb3JlLCBvciBpZiB0aGUgY2FyZCB3aWxsIGJlCisJICBkZXBsb3llZCBvbiBwb3RlbnRpYWxseSB1bmZyaWVuZGx5IG5ldHdvcmtzIChlLmcuIGluIGEgZmlyZXdhbGwpLAorCSAgdGhlbiBzYXkgWSBoZXJlLgorCisJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL05BUElfSE9XVE8udHh0PiBmb3IgbW9yZQorCSAgaW5mb3JtYXRpb24uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIEFDMzIwMAorCXRyaXN0YXRlICJBbnNlbCBDb21tdW5pY2F0aW9ucyBFSVNBIDMyMDAgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgKElTQSB8fCBFSVNBKSAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBhYzMyMDAuCisKK2NvbmZpZyBBUFJJQ09UCisJdHJpc3RhdGUgIkFwcmljb3QgWGVuLUlJIG9uIGJvYXJkIEV0aGVybmV0IgorCWRlcGVuZHMgb24gTkVUX1BDSSAmJiBJU0EKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjb250cm9sbGVyIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kCisJICByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgYXByaWNvdC4KKworY29uZmlnIEI0NAorCXRyaXN0YXRlICJCcm9hZGNvbSA0NDAwIGV0aGVybmV0IHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgTUlJCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY29udHJvbGxlciBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZAorCSAgcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGI0NC4KKworY29uZmlnIEZPUkNFREVUSAorCXRyaXN0YXRlICJSZXZlcnNlIEVuZ2luZWVyZWQgbkZvcmNlIEV0aGVybmV0IHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjb250cm9sbGVyIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kCisJICByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgZm9yY2VkZXRoLgorCisKK2NvbmZpZyBDUzg5eDAKKwl0cmlzdGF0ZSAiQ1M4OXgwIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIChJU0EgfHwgQVJDSF9JWERQMlgwMSkKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciBDUzg5eDAgY2hpcHNldCBiYXNlZCBFdGhlcm5ldCBjYXJkcy4gSWYgeW91IGhhdmUgYQorCSAgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZCB0aGUKKwkgIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPiBhcyB3ZWxsIGFzCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY3M4OXgwLnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgY3M4OXguCisKK2NvbmZpZyBUQzM1ODE1CisJdHJpc3RhdGUgIlRPU0hJQkEgVEMzNTgxNSBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDSSAmJiBQQ0kgJiYgVE9TSElCQV9KTVIzOTI3CisKK2NvbmZpZyBER1JTCisJdHJpc3RhdGUgIkRpZ2kgSW50bC4gUmlnaHRTd2l0Y2ggU0UtWCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDSSAmJiAoUENJIHx8IEVJU0EpCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciB0aGUgRGlnaSBJbnRlcm5hdGlvbmFsIFJpZ2h0U3dpdGNoIHNlcmllcyBvZgorCSAgUENJL0VJU0EgRXRoZXJuZXQgc3dpdGNoIGNhcmRzLiBUaGVzZSBpbmNsdWRlIHRoZSBTRS00IGFuZCB0aGUgU0UtNgorCSAgbW9kZWxzLiAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZCB0aGUKKwkgIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gIE1vcmUgc3BlY2lmaWMKKwkgIGluZm9ybWF0aW9uIGlzIGNvbnRhaW5lZCBpbiA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGdycy50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGRncnMuCisKK2NvbmZpZyBFRVBSTzEwMAorCXRyaXN0YXRlICJFdGhlckV4cHJlc3NQcm8vMTAwIHN1cHBvcnQgKGVlcHJvMTAwLCBvcmlnaW5hbCBCZWNrZXIgZHJpdmVyKSIKKwlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgUENJCisJc2VsZWN0IE1JSQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGFuIEludGVsIEV0aGVyRXhwcmVzcyBQUk8vMTAwIFBDSSBuZXR3b3JrIChFdGhlcm5ldCkKKwkgIGNhcmQsIHNheSBZIGFuZCByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZWVwcm8xMDAuCisKKworY29uZmlnIEUxMDAKKwl0cmlzdGF0ZSAiSW50ZWwoUikgUFJPLzEwMCsgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgUENJCisJc2VsZWN0IE1JSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIEludGVsKFIpIFBSTy8xMDAgZmFtaWx5IG9mIGFkYXB0ZXJzLgorCSAgVG8gdmVyaWZ5IHRoYXQgeW91ciBhZGFwdGVyIGlzIHN1cHBvcnRlZCwgZmluZCB0aGUgYm9hcmQgSUQgbnVtYmVyIAorCSAgb24gdGhlIGFkYXB0ZXIuIExvb2sgZm9yIGEgbGFiZWwgdGhhdCBoYXMgYSBiYXJjb2RlIGFuZCBhIG51bWJlciAKKwkgIGluIHRoZSBmb3JtYXQgMTIzNDU2LTAwMSAoc2l4IGRpZ2l0cyBoeXBoZW4gdGhyZWUgZGlnaXRzKS4gCisKKwkgIFVzZSB0aGUgYWJvdmUgaW5mb3JtYXRpb24gYW5kIHRoZSBBZGFwdGVyICYgRHJpdmVyIElEIEd1aWRlIGF0OgorCisJICA8aHR0cDovL3N1cHBvcnQuaW50ZWwuY29tL3N1cHBvcnQvbmV0d29yay9hZGFwdGVyL3BybzEwMC8yMTM5Ny5odG0+CisKKyAgICAgICAgICB0byBpZGVudGlmeSB0aGUgYWRhcHRlci4KKworCSAgRm9yIHRoZSBsYXRlc3QgSW50ZWwgUFJPLzEwMCBuZXR3b3JrIGRyaXZlciBmb3IgTGludXgsIHNlZToKKworCSAgPGh0dHA6Ly9hcHBzci5pbnRlbC5jb20vc2NyaXB0cy1kZi9zdXBwb3J0X2ludGVsLmFzcD4KKworCSAgTW9yZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBvbiBjb25maWd1cmluZyB0aGUgZHJpdmVyIGlzIGluIAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2UxMDAudHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBlMTAwLgorCitjb25maWcgTE5FMzkwCisJdHJpc3RhdGUgIk15bGV4IEVJU0EgTE5FMzkwQS9CIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIEVJU0EgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBvZiB0aGlzIHR5cGUsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGxuZTM5MC4KKworY29uZmlnIEZFQUxOWAorCXRyaXN0YXRlICJNeXNvbiBNVEQtOHh4IFBDSSBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDSSAmJiBQQ0kKKwlzZWxlY3QgQ1JDMzIKKwlzZWxlY3QgTUlJCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBNeXNvbSBNVEQtODAwIGZhbWlseSBvZiBQQ0ktYmFzZWQgRXRoZXJuZXQKKwkgIGNhcmRzLiBTcGVjaWZpY2F0aW9ucyBhbmQgZGF0YSBhdAorCSAgPGh0dHA6Ly93d3cubXlzb24uY29tLmhrL210ZC9kYXRhc2hlZXQvPi4KKworY29uZmlnIE5BVFNFTUkKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBEUDgzODF4IHNlcmllcyBQQ0kgRXRoZXJuZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgUENJCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIERQODM4MTAgc2VyaWVzLAorCSAgd2hpY2ggaXMgdXNlZCBpbiBjYXJkcyBmcm9tIFB1cmVEYXRhLCBOZXRHZWFyLCBMaW5rc3lzCisJICBhbmQgb3RoZXJzLCBpbmNsdWRpbmcgdGhlIDgzODE1IGNoaXAuCisJICBNb3JlIHNwZWNpZmljIGluZm9ybWF0aW9uIGFuZCB1cGRhdGVzIGFyZSBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cuc2N5bGQuY29tL25ldHdvcmsvbmF0c2VtaS5odG1sPi4KKworY29uZmlnIE5FMktfUENJCisJdHJpc3RhdGUgIlBDSSBORTIwMDAgYW5kIGNsb25lcyBzdXBwb3J0IChzZWUgaGVscCkiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIFBDSQorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIGlzIGZvciBORTIwMDAgY29tcGF0aWJsZSBQQ0kgY2FyZHMuIEl0IHdpbGwgbm90IHdvcmsKKwkgIHdpdGggSVNBIE5FMjAwMCBjYXJkcyAodGhleSBoYXZlIHRoZWlyIG93biBkcml2ZXIsICJORTIwMDAvTkUxMDAwCisJICBzdXBwb3J0IiBiZWxvdykuIElmIHlvdSBoYXZlIGEgUENJIE5FMjAwMCBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCwKKwkgIHNheSBZIGFuZCByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRoaXMgZHJpdmVyIGFsc28gd29ya3MgZm9yIHRoZSBmb2xsb3dpbmcgTkUyMDAwIGNsb25lIGNhcmRzOgorCSAgUmVhbFRlayBSVEwtODAyOSAgV2luYm9uZCA4OUM5NDAgIENvbXBleCBSTDIwMDAgIEtUSSBFVDMyUDIKKwkgIE5ldFZpbiBOVjUwMDBTQyAgIFZpYSA4NkM5MjYgICAgICBTdXJlQ29tIE5FMzQgICBXaW5ib25kCisJICBIb2x0ZWsgSFQ4MDIzMiAgICBIb2x0ZWsgSFQ4MDIyOQorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG5lMmstcGNpLgorCitjb25maWcgTkUzMjEwCisJdHJpc3RhdGUgIk5vdmVsbC9FYWdsZS9NaWNyb2R5bmUgTkUzMjEwIEVJU0Egc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgRUlTQSAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgQ1JDMzIKKwktLS1oZWxwLS0tCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uICBOb3RlIHRoYXQgdGhpcyBkcml2ZXIKKwkgIHdpbGwgTk9UIFdPUksgZm9yIE5FMzIwMCBjYXJkcyBhcyB0aGV5IGFyZSBjb21wbGV0ZWx5IGRpZmZlcmVudC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBuZTMyMTAuCisKK2NvbmZpZyBFUzMyMTAKKwl0cmlzdGF0ZSAiUmFjYWwtSW50ZXJsYW4gRUlTQSBFUzMyMTAgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgRUlTQSAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZXMzMjEwLgorCitjb25maWcgODEzOUNQCisJdHJpc3RhdGUgIlJlYWxUZWsgUlRMLTgxMzkgQysgUENJIEZhc3QgRXRoZXJuZXQgQWRhcHRlciBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gTkVUX1BDSSAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IENSQzMyCisJc2VsZWN0IE1JSQorCWhlbHAKKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBGYXN0IEV0aGVybmV0IFBDSSBuZXR3b3JrIGNhcmRzIGJhc2VkIG9uCisJICB0aGUgUlRMODEzOUMrIGNoaXBzLiBJZiB5b3UgaGF2ZSBvbmUgb2YgdGhvc2UsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCA4MTM5Y3AuICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitjb25maWcgODEzOVRPTworCXRyaXN0YXRlICJSZWFsVGVrIFJUTC04MTM5IFBDSSBGYXN0IEV0aGVybmV0IEFkYXB0ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgUENJCisJc2VsZWN0IENSQzMyCisJc2VsZWN0IE1JSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBGYXN0IEV0aGVybmV0IFBDSSBuZXR3b3JrIGNhcmRzIGJhc2VkIG9uCisJICB0aGUgUlRMODEzOSBjaGlwcy4gSWYgeW91IGhhdmUgb25lIG9mIHRob3NlLCBzYXkgWSBhbmQgcmVhZAorCSAgdGhlIEV0aGVybmV0LUhPV1RPIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIDgxMzl0b28uICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitjb25maWcgODEzOVRPT19QSU8KKwlib29sICJVc2UgUElPIGluc3RlYWQgb2YgTU1JTyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIDgxMzlUT08KKwloZWxwCisJICBUaGlzIGluc3RydWN0cyB0aGUgZHJpdmVyIHRvIHVzZSBwcm9ncmFtbWVkIEkvTyBwb3J0cyAoUElPKSBpbnN0ZWFkCisJICBvZiBQQ0kgc2hhcmVkIG1lbW9yeSAoTU1JTykuICBUaGlzIGNhbiBwb3NzaWJseSBzb2x2ZSBzb21lIHByb2JsZW1zCisJICBpbiBjYXNlIHlvdXIgbWFpbmJvYXJkIGhhcyBtZW1vcnkgY29uc2lzdGVuY3kgaXNzdWVzLiAgSWYgdW5zdXJlLAorCSAgc2F5IE4uCisKK2NvbmZpZyA4MTM5VE9PX1RVTkVfVFdJU1RFUgorCWJvb2wgIlN1cHBvcnQgZm9yIHVuY29tbW9uIFJUTC04MTM5IHJldi4gSyAoYXV0b21hdGljIGNoYW5uZWwgZXF1YWxpemF0aW9uKSIKKwlkZXBlbmRzIG9uIDgxMzlUT08KKwloZWxwCisJICBUaGlzIGltcGxlbWVudHMgYSBmdW5jdGlvbiB3aGljaCBtaWdodCBjb21lIGluIGhhbmR5IGluIGNhc2UgeW91CisJICBhcmUgdXNpbmcgbG93IHF1YWxpdHkgb24gbG9uZyBjYWJsaW5nLiBJdCBpcyByZXF1aXJlZCBmb3IgUmVhbFRlaworCSAgUlRMLTgxMzkgcmV2aXNpb24gSyBib2FyZHMsIGFuZCB0b3RhbGx5IHVudXNlZCBvdGhlcndpc2UuICBJdCB0cmllcworCSAgdG8gbWF0Y2ggdGhlIHRyYW5zY2VpdmVyIHRvIHRoZSBjYWJsZSBjaGFyYWN0ZXJpc3RpY3MuIFRoaXMgaXMKKwkgIGV4cGVyaW1lbnRhbCBzaW5jZSBoYXJkbHkgZG9jdW1lbnRlZCBieSB0aGUgbWFudWZhY3R1cmVyLgorCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIDgxMzlUT09fODEyOQorCWJvb2wgIlN1cHBvcnQgZm9yIG9sZGVyIFJUTC04MTI5LzgxMzAgYm9hcmRzIgorCWRlcGVuZHMgb24gODEzOVRPTworCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgb2xkZXIgYW5kIHVuY29tbW9uIFJUTC04MTI5IGFuZAorCSAgUlRMLTgxMzAgY2hpcHMsIHdoaWNoIHN1cHBvcnQgTUlJIHZpYSBhbiBleHRlcm5hbCB0cmFuc2NlaXZlciwKKwkgIGluc3RlYWQgb2YgYW4gaW50ZXJuYWwgb25lLiAgRGlzYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgc2F2ZSBzb21lCisJICBtZW1vcnkgYnkgbWFraW5nIHRoZSBjb2RlIHNpemUgc21hbGxlci4gIElmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyA4MTM5X09MRF9SWF9SRVNFVAorCWJvb2wgIlVzZSBvbGRlciBSWC1yZXNldCBtZXRob2QiCisJZGVwZW5kcyBvbiA4MTM5VE9PCisJaGVscAorCSAgVGhlIDgxMzl0b28gZHJpdmVyIHdhcyByZWNlbnRseSB1cGRhdGVkIHRvIGNvbnRhaW4gYSBtb3JlIHJhcGlkCisJICByZXNldCBzZXF1ZW5jZSwgaW4gdGhlIGZhY2Ugb2Ygc2V2ZXJlIHJlY2VpdmUgZXJyb3JzLiAgVGhpcyAibmV3IgorCSAgUlgtcmVzZXQgbWV0aG9kIHNob3VsZCBiZSBhZGVxdWF0ZSBmb3IgYWxsIGJvYXJkcy4gIEJ1dCBpZiB5b3UKKwkgIGV4cGVyaWVuY2UgcHJvYmxlbXMsIHlvdSBjYW4gZW5hYmxlIHRoaXMgb3B0aW9uIHRvIHJlc3RvcmUgdGhlCisJICBvbGQgUlgtcmVzZXQgYmVoYXZpb3IuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgU0lTOTAwCisJdHJpc3RhdGUgIlNpUyA5MDAvNzAxNiBQQ0kgRmFzdCBFdGhlcm5ldCBBZGFwdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIFBDSQorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBGYXN0IEV0aGVybmV0IFBDSSBuZXR3b3JrIGNhcmRzIGJhc2VkIG9uCisJICB0aGUgU2lTIDkwMCBhbmQgU2lTIDcwMTYgY2hpcHMuIFRoZSBTaVMgOTAwIGNvcmUgaXMgYWxzbyBlbWJlZGRlZCBpbgorCSAgU2lTIDYzMCBhbmQgU2lTIDU0MCBjaGlwc2V0cy4gIElmIHlvdSBoYXZlIG9uZSBvZiB0aG9zZSwgc2F5IFkgYW5kCisJICByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGF0CisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiAgUGxlYXNlIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9zaXM5MDAudHh0PiBhbmQgY29tbWVudHMgYXQgdGhlCisJICBiZWdpbm5pbmcgb2YgPGZpbGU6ZHJpdmVycy9uZXQvc2lzOTAwLmM+IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisJICBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzIEFNRCA3OUM5MDEgSG9tZVBOQSBzbyB0aGF0IHlvdSBjYW4gdXNlCisJICB5b3VyIHBob25lIGxpbmUgYXMgYSBuZXR3b3JrIGNhYmxlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzaXM5MDAuICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitjb25maWcgRVBJQzEwMAorCXRyaXN0YXRlICJTTUMgRXRoZXJQb3dlciBJSSIKKwlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgUENJCisJc2VsZWN0IENSQzMyCisJc2VsZWN0IE1JSQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGlzIGZvciB0aGUgU01DIEV0aGVyUG93ZXIgSUkgOTQzMiBQQ0kgRXRoZXJuZXQgTklDLAorCSAgd2hpY2ggaXMgYmFzZWQgb24gdGhlIFNNQzgzYzE3eCAoRVBJQy8xMDApLgorCSAgTW9yZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhbmQgdXBkYXRlcyBhcmUgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL2VwaWMxMDAuaHRtbD4uCisKK2NvbmZpZyBTVU5EQU5DRQorCXRyaXN0YXRlICJTdW5kYW5jZSBBbHRhIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIFBDSQorCXNlbGVjdCBDUkMzMgorCXNlbGVjdCBNSUkKKwloZWxwCisJICBUaGlzIGRyaXZlciBpcyBmb3IgdGhlIFN1bmRhbmNlICJBbHRhIiBjaGlwLgorCSAgTW9yZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhbmQgdXBkYXRlcyBhcmUgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL3N1bmRhbmNlLmh0bWw+LgorCitjb25maWcgU1VOREFOQ0VfTU1JTworCWJvb2wgIlVzZSBNTUlPIGluc3RlYWQgb2YgUElPIgorCWRlcGVuZHMgb24gU1VOREFOQ0UKKwloZWxwCisJICBFbmFibGUgbWVtb3J5LW1hcHBlZCBJL08gZm9yIGludGVyYWN0aW9uIHdpdGggU3VuZGFuY2UgTklDIHJlZ2lzdGVycy4KKwkgIERvIE5PVCBlbmFibGUgdGhpcyBieSBkZWZhdWx0LCBQSU8gKGVuYWJsZWQgd2hlbiBNTUlPIGlzIGRpc2FibGVkKQorCSAgaXMga25vd24gdG8gc29sdmUgYnVncyBvbiBjZXJ0YWluIGNoaXBzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgVExBTgorCXRyaXN0YXRlICJUSSBUaHVuZGVyTEFOIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIChQQ0kgfHwgRUlTQSkgJiYgITY0QklUCisJLS0taGVscC0tLQorCSAgSWYgeW91IGhhdmUgYSBQQ0kgRXRoZXJuZXQgbmV0d29yayBjYXJkIGJhc2VkIG9uIHRoZSBUaHVuZGVyTEFOIGNoaXAKKwkgIHdoaWNoIGlzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciwgc2F5IFkgYW5kIHJlYWQgdGhlCisJICBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIERldmljZXMgY3VycmVudGx5IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciBhcmUgQ29tcGFxIE5ldGVsbGlnZW50LAorCSAgQ29tcGFxIE5ldEZsZXggYW5kIE9saWNvbSBjYXJkcy4gIFBsZWFzZSByZWFkIHRoZSBmaWxlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvdGxhbi50eHQ+IGZvciBtb3JlIGRldGFpbHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB0bGFuLgorCisJICBQbGVhc2UgZW1haWwgZmVlZGJhY2sgdG8gPHRvcmJlbi5tYXRoaWFzZW5AY29tcGFxLmNvbT4uCisKK2NvbmZpZyBWSUFfUkhJTkUKKwl0cmlzdGF0ZSAiVklBIFJoaW5lIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIFBDSQorCXNlbGVjdCBDUkMzMgorCXNlbGVjdCBNSUkKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIFZJQSAiUmhpbmUiIGJhc2VkIG5ldHdvcmsgY2FyZCAoUmhpbmUtSSAoVlQ4NkMxMDBBKSwKKwkgIFJoaW5lLUlJIChWVDYxMDIpLCBvciBSaGluZS1JSUkgKFZUNjEwNSkpLCBzYXkgWSBoZXJlLiBSaGluZS10eXBlCisJICBFdGhlcm5ldCBmdW5jdGlvbnMgY2FuIGFsc28gYmUgZm91bmQgaW50ZWdyYXRlZCBvbiBTb3V0aCBCcmlkZ2VzCisJICAoZS5nLiBWVDgyMzUpLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB2aWEtcmhpbmUuCisKK2NvbmZpZyBWSUFfUkhJTkVfTU1JTworCWJvb2wgIlVzZSBNTUlPIGluc3RlYWQgb2YgUElPIgorCWRlcGVuZHMgb24gVklBX1JISU5FCisJaGVscAorCSAgVGhpcyBpbnN0cnVjdHMgdGhlIGRyaXZlciB0byB1c2UgUENJIHNoYXJlZCBtZW1vcnkgKE1NSU8pIGluc3RlYWQgb2YKKwkgIHByb2dyYW1tZWQgSS9PIHBvcnRzIChQSU8pLiBFbmFibGluZyB0aGlzIGdpdmVzIGFuIGltcHJvdmVtZW50IGluCisJICBwcm9jZXNzaW5nIHRpbWUgaW4gcGFydHMgb2YgdGhlIGRyaXZlci4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIExBTl9TQUE5NzMwCisJYm9vbCAiUGhpbGlwcyBTQUE5NzMwIEV0aGVybmV0IHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIEVYUEVSSU1FTlRBTCAmJiBNSVBTCisJaGVscAorCSAgVGhlIFNBQTk3MzAgaXMgYSBjb21iaW5lZCBtdWx0aW1lZGlhIGFuZCBwZXJpcGhlcmFsIGNvbnRyb2xsZXIgdXNlZAorCSAgaW4gdGhpbiBjbGllbnRzLCBJbnRlcm5ldCBhY2Nlc3MgdGVybWluYWxzLCBhbmQgZGlza2xlc3MKKwkgIHdvcmtzdGF0aW9ucy4KKwkgIFNlZSA8aHR0cDovL3d3dy5zZW1pY29uZHVjdG9ycy5waGlsaXBzLmNvbS9waXAvU0FBOTczMF9mbHllcl8xPi4KKworY29uZmlnIE5FVF9QT0NLRVQKKwlib29sICJQb2NrZXQgYW5kIHBvcnRhYmxlIGFkYXB0ZXJzIgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIElTQQorCS0tLWhlbHAtLS0KKwkgIEN1dGUgbGl0dGxlIG5ldHdvcmsgKEV0aGVybmV0KSBkZXZpY2VzIHdoaWNoIGF0dGFjaCB0byB0aGUgcGFyYWxsZWwKKwkgIHBvcnQgKCJwb2NrZXQgYWRhcHRlcnMiKSwgY29tbW9ubHkgdXNlZCB3aXRoIGxhcHRvcHMuIElmIHlvdSBoYXZlCisJICBvbmUgb2YgdGhvc2UsIHNheSBZIGFuZCByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIElmIHlvdSB3YW50IHRvIHBsdWcgYSBuZXR3b3JrIChvciBzb21lIG90aGVyKSBjYXJkIGludG8gdGhlIFBDTUNJQQorCSAgKG9yIFBDLWNhcmQpIHNsb3Qgb2YgeW91ciBsYXB0b3AgaW5zdGVhZCAoUENNQ0lBIGlzIHRoZSBzdGFuZGFyZCBmb3IKKwkgIGNyZWRpdCBjYXJkIHNpemUgZXh0ZW5zaW9uIGNhcmRzIHVzZWQgYnkgYWxsIG1vZGVybiBsYXB0b3BzKSwgeW91CisJICBuZWVkIHRoZSBwY21jaWEtY3MgcGFja2FnZSAobG9jYXRpb24gY29udGFpbmVkIGluIHRoZSBmaWxlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL0NoYW5nZXM+KSBhbmQgeW91IGNhbiBzYXkgTiBoZXJlLgorCisJICBMYXB0b3AgdXNlcnMgc2hvdWxkIHJlYWQgdGhlIExpbnV4IExhcHRvcCBob21lIHBhZ2UgYXQKKwkgIDxodHRwOi8vd3d3LmxpbnV4LW9uLWxhcHRvcHMuY29tLz4gb3IKKwkgIFR1eG1vYmlsIC0gTGludXggb24gTW9iaWxlIENvbXB1dGVycyBhdCA8aHR0cDovL3d3dy50dXhtb2JpbC5vcmcvPi4KKworCSAgTm90ZSB0aGF0IHRoZSBhbnN3ZXIgdG8gdGhpcyBxdWVzdGlvbiBkb2Vzbid0IGRpcmVjdGx5IGFmZmVjdCB0aGUKKwkgIGtlcm5lbDogc2F5aW5nIE4gd2lsbCBqdXN0IGNhdXNlIHRoZSBjb25maWd1cmF0b3IgdG8gc2tpcCBhbGwKKwkgIHRoZSBxdWVzdGlvbnMgYWJvdXQgdGhpcyBjbGFzcyBvZiBuZXR3b3JrIGRldmljZXMuIElmIHlvdSBzYXkgWSwgeW91CisJICB3aWxsIGJlIGFza2VkIGZvciB5b3VyIHNwZWNpZmljIGRldmljZSBpbiB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucy4KKworY29uZmlnIEFUUAorCXRyaXN0YXRlICJBVC1MQU4tVEVDL1JlYWxUZWsgcG9ja2V0IGFkYXB0ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9QT0NLRVQgJiYgSVNBICYmIFg4NgorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBuZXR3b3JrIChFdGhlcm5ldCkgZGV2aWNlIHdoaWNoIGF0dGFjaGVzIHRvIHlvdXIgcGFyYWxsZWwKKwkgIHBvcnQuIFJlYWQgPGZpbGU6ZHJpdmVycy9uZXQvYXRwLmM+IGFzIHdlbGwgYXMgdGhlIEV0aGVybmV0LUhPV1RPLAorCSAgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPiwgaWYgeW91CisJICB3YW50IHRvIHVzZSB0aGlzLiAgSWYgeW91IGludGVuZCB0byB1c2UgdGhpcyBkcml2ZXIsIHlvdSBzaG91bGQgaGF2ZQorCSAgc2FpZCBOIHRvIHRoZSAiUGFyYWxsZWwgcHJpbnRlciBzdXBwb3J0IiwgYmVjYXVzZSB0aGUgdHdvIGRyaXZlcnMKKwkgIGRvbid0IGxpa2UgZWFjaCBvdGhlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYXRwLgorCitjb25maWcgREU2MDAKKwl0cmlzdGF0ZSAiRC1MaW5rIERFNjAwIHBvY2tldCBhZGFwdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUE9DS0VUICYmIElTQQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBuZXR3b3JrIChFdGhlcm5ldCkgZGV2aWNlIHdoaWNoIGF0dGFjaGVzIHRvIHlvdXIgcGFyYWxsZWwKKwkgIHBvcnQuIFJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL0RMSU5LLnR4dD4gYXMgd2VsbCBhcyB0aGUKKwkgIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPiwgaWYgeW91IHdhbnQgdG8gdXNlCisJICB0aGlzLiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIHNldmVyYWwgZGV2aWNlcyBzaGFyZSBhIHNpbmdsZSBwYXJhbGxlbAorCSAgcG9ydCBhbmQgaXQgaXMgc2FmZSB0byBjb21waWxlIHRoZSBjb3JyZXNwb25kaW5nIGRyaXZlcnMgaW50byB0aGUKKwkgIGtlcm5lbC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZGU2MDAuCisKK2NvbmZpZyBERTYyMAorCXRyaXN0YXRlICJELUxpbmsgREU2MjAgcG9ja2V0IGFkYXB0ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9QT0NLRVQgJiYgSVNBCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIG5ldHdvcmsgKEV0aGVybmV0KSBkZXZpY2Ugd2hpY2ggYXR0YWNoZXMgdG8geW91ciBwYXJhbGxlbAorCSAgcG9ydC4gUmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvRExJTksudHh0PiBhcyB3ZWxsIGFzIHRoZQorCSAgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LCBpZiB5b3Ugd2FudCB0byB1c2UKKwkgIHRoaXMuIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgc2V2ZXJhbCBkZXZpY2VzIHNoYXJlIGEgc2luZ2xlIHBhcmFsbGVsCisJICBwb3J0IGFuZCBpdCBpcyBzYWZlIHRvIGNvbXBpbGUgdGhlIGNvcnJlc3BvbmRpbmcgZHJpdmVycyBpbnRvIHRoZQorCSAga2VybmVsLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBkZTYyMC4KKworY29uZmlnIFNHSVNFRVEKKwl0cmlzdGF0ZSAiU0dJIFNlZXEgZXRoZXJuZXQgY29udHJvbGxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFNHSV9JUDIyCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBTZWVxIGJhc2VkIEV0aGVybmV0IG5ldHdvcmsgY2FyZC4gVGhpcyBpcworCSAgdXNlZCBpbiBtYW55IFNpbGljb24gR3JhcGhpY3MgbWFjaGluZXMuCisKK2NvbmZpZyBERUNMQU5DRQorCXRyaXN0YXRlICJERUMgTEFOQ0UgZXRoZXJuZXQgY29udHJvbGxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIE1BQ0hfREVDU1RBVElPTgorCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGlzIGZvciB0aGUgc2VyaWVzIG9mIEV0aGVybmV0IGNvbnRyb2xsZXJzIHByb2R1Y2VkIGJ5CisJICBERUMgKG5vdyBDb21wYXEpIGJhc2VkIG9uIHRoZSBBTUQgTGFuY2UgY2hpcHNldCwgaW5jbHVkaW5nIHRoZQorCSAgREVQQ0Egc2VyaWVzLiAgKFRoaXMgY2hpcHNldCBpcyBiZXR0ZXIga25vd24gdmlhIHRoZSBORTIxMDAgY2FyZHMuKQorCitjb25maWcgNjgzNjBfRU5FVAorCWJvb2wgIk1vdG9yb2xhIDY4MzYwIGV0aGVybmV0IGNvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBNNjgzNjAKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgYnVpbHQtaW4gZXRoZXJuZXQgY29udHJvbGxlciBvZgorCSAgdGhlIE1vdG9yb2xhIDY4MzYwIHByb2Nlc3Nvci4KKworY29uZmlnIEZFQworCWJvb2wgIkZFQyBldGhlcm5ldCBjb250cm9sbGVyIChvZiBDb2xkRmlyZSA1MjcyKSIKKwlkZXBlbmRzIG9uIE01MjcyIHx8IE01MjgyCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGJ1aWx0LWluIDEwLzEwMCBGYXN0IGV0aGVybmV0CisJICBjb250cm9sbGVyIG9uIHRoZSBNb3Rvcm9sYSBDb2xkRmlyZSA1MjcyIHByb2Nlc3Nvci4KKworY29uZmlnIE5FX0g4MzAwCisJdHJpc3RhdGUgIk5FMjAwMCBjb21wYXRpYmxlIHN1cHBvcnQgZm9yIEg4LzMwMCIKKwlkZXBlbmRzIG9uIEg4MzAwICYmIE5FVF9FVEhFUk5FVAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBORTIwMDAgY29tcGF0aWJsZQorCSAgY29udHJvbGxlciBvbiB0aGUgUmVuZXNhcyBIOC8zMDAgcHJvY2Vzc29yLgorCitzb3VyY2UgImRyaXZlcnMvbmV0L2ZlY184eHgvS2NvbmZpZyIKKworZW5kbWVudQorCisjCisjCUdpZ2FiaXQgRXRoZXJuZXQKKyMKKworbWVudSAiRXRoZXJuZXQgKDEwMDAgTWJpdCkiCisJZGVwZW5kcyBvbiBORVRERVZJQ0VTICYmICFVTUwKKworY29uZmlnIEFDRU5JQworCXRyaXN0YXRlICJBbHRlb24gQWNlTklDLzNDb20gM0M5ODUvTmV0R2VhciBHQTYyMCBHaWdhYml0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIEFsdGVvbiBBY2VOSUMsIDNDb20gM0M5ODUoQiksIE5ldEdlYXIKKwkgIEdBNjIwLCBTR0kgR2lnYWJpdCBvciBGYXJhbGxvbiBQTjkwMDAtU1ggUENJIEdpZ2FiaXQgRXRoZXJuZXQKKwkgIGFkYXB0ZXIuIFRoZSBkcml2ZXIgYWxsb3dzIGZvciB1c2luZyB0aGUgSnVtYm8gRnJhbWUgb3B0aW9uICg5MDAwCisJICBieXRlcy9mcmFtZSkgaG93ZXZlciBpdCByZXF1aXJlcyB0aGF0IHlvdXIgc3dpdGNoZXMgY2FuIGhhbmRsZSB0aGlzCisJICBhcyB3ZWxsLiBUbyBlbmFibGUgSnVtYm8gRnJhbWVzLCBhZGQgYG10dSA5MDAwJyB0byB5b3VyIGlmY29uZmlnCisJICBsaW5lLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhY2VuaWMuCisKK2NvbmZpZyBBQ0VOSUNfT01JVF9USUdPTl9JCisJYm9vbCAiT21pdCBzdXBwb3J0IGZvciBvbGQgVGlnb24gSSBiYXNlZCBBY2VOSUNzIgorCWRlcGVuZHMgb24gQUNFTklDCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugb25seSBoYXZlIFRpZ29uIElJIGJhc2VkIEFjZU5JQ3MgYW5kIHdhbnQgdG8gbGVhdmUKKwkgIG91dCBzdXBwb3J0IGZvciB0aGUgb2xkZXIgVGlnb24gSSBiYXNlZCBjYXJkcyB3aGljaCBhcmUgbm8gbG9uZ2VyCisJICBiZWluZyBzb2xkIChpZS4gdGhlIG9yaWdpbmFsIEFsdGVvbiBBY2VOSUMgYW5kIDNDb20gM0M5ODUgKG5vbiBCCisJICB2ZXJzaW9uKSkuICBUaGlzIHdpbGwgcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBkcml2ZXIgb2JqZWN0IGJ5CisJICBhcHAuIDEwMEtCLiAgSWYgeW91IGFyZSBub3Qgc3VyZSB3aGV0aGVyIHlvdXIgY2FyZCBpcyBhIFRpZ29uIEkgb3IgYQorCSAgVGlnb24gSUksIHNheSBOIGhlcmUuCisKKwkgIFRoZSBzYWZlIGFuZCBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGlzIE4uCisKK2NvbmZpZyBETDJLCisJdHJpc3RhdGUgIkQtTGluayBETDIwMDAtYmFzZWQgR2lnYWJpdCBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgRC1MaW5rIDIwMDAtYmFzZWQgZ2lnYWJpdCBldGhlcm5ldCBjYXJkcywgd2hpY2gKKwkgIGluY2x1ZGVzCisJICBELUxpbmsgREdFLTU1MFQgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyLgorCSAgRC1MaW5rIERMMjAwMC1iYXNlZCBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGRsMmsuCisKK2NvbmZpZyBFMTAwMAorCXRyaXN0YXRlICJJbnRlbChSKSBQUk8vMTAwMCBHaWdhYml0IEV0aGVybmV0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBJbnRlbChSKSBQUk8vMTAwMCBnaWdhYml0IGV0aGVybmV0IGZhbWlseSBvZgorCSAgYWRhcHRlcnMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gaWRlbnRpZnkgeW91ciBhZGFwdGVyLCBnbyAKKwkgIHRvIHRoZSBBZGFwdGVyICYgRHJpdmVyIElEIEd1aWRlIGF0OgorCisJICA8aHR0cDovL3N1cHBvcnQuaW50ZWwuY29tL3N1cHBvcnQvbmV0d29yay9hZGFwdGVyL3BybzEwMC8yMTM5Ny5odG0+CisKKwkgIEZvciBnZW5lcmFsIGluZm9ybWF0aW9uIGFuZCBzdXBwb3J0LCBnbyB0byB0aGUgSW50ZWwgc3VwcG9ydAorCSAgd2Vic2l0ZSBhdDoKKworCSAgPGh0dHA6Ly9zdXBwb3J0LmludGVsLmNvbT4KKworCSAgTW9yZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBvbiBjb25maWd1cmluZyB0aGUgZHJpdmVyIGlzIGluIAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2UxMDAwLnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZTEwMDAuCisKK2NvbmZpZyBFMTAwMF9OQVBJCisJYm9vbCAiVXNlIFJ4IFBvbGxpbmcgKE5BUEkpIgorCWRlcGVuZHMgb24gRTEwMDAKKwloZWxwCisJICBOQVBJIGlzIGEgbmV3IGRyaXZlciBBUEkgZGVzaWduZWQgdG8gcmVkdWNlIENQVSBhbmQgaW50ZXJydXB0IGxvYWQKKwkgIHdoZW4gdGhlIGRyaXZlciBpcyByZWNlaXZpbmcgbG90cyBvZiBwYWNrZXRzIGZyb20gdGhlIGNhcmQuIEl0IGlzCisJICBzdGlsbCBzb21ld2hhdCBleHBlcmltZW50YWwgYW5kIHRodXMgbm90IHlldCBlbmFibGVkIGJ5IGRlZmF1bHQuCisKKwkgIElmIHlvdXIgZXN0aW1hdGVkIFJ4IGxvYWQgaXMgMTBrcHBzIG9yIG1vcmUsIG9yIGlmIHRoZSBjYXJkIHdpbGwgYmUKKwkgIGRlcGxveWVkIG9uIHBvdGVudGlhbGx5IHVuZnJpZW5kbHkgbmV0d29ya3MgKGUuZy4gaW4gYSBmaXJld2FsbCksCisJICB0aGVuIHNheSBZIGhlcmUuCisKKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvTkFQSV9IT1dUTy50eHQ+IGZvciBtb3JlCisJICBpbmZvcm1hdGlvbi4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgTVlSSV9TQlVTCisJdHJpc3RhdGUgIk15cmlDT00gR2lnYWJpdCBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0JVUworCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE15cmlDT00gU2J1cyBnaWdhYml0IEV0aGVybmV0IGNhcmRzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBteXJpX3NidXMuICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitjb25maWcgTlM4MzgyMAorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdCBEUDgzODIwIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ0kKKwloZWxwCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBEUDgzODIwIHNlcmllcworCSAgb2YgZ2lnYWJpdCBldGhlcm5ldCBNQUNzLiAgQ2FyZHMgdXNpbmcgdGhpcyBjaGlwc2V0IGluY2x1ZGUKKwkgIHRoZSBELUxpbmsgREdFLTUwMFQsIFB1cmVEYXRhJ3MgUERQODAyM1otVEcsIFNNQydzIFNNQzk0NjJUWCwKKwkgIFNPSE8tR0EyMDAwVCwgU09ITy1HQTI1MDBULiAgVGhlIGRyaXZlciBzdXBwb3J0cyB0aGUgdXNlIG9mCisJICB6ZXJvIGNvcHkuCisKK2NvbmZpZyBIQU1BQ0hJCisJdHJpc3RhdGUgIlBhY2tldCBFbmdpbmVzIEhhbWFjaGkgR05JQy1JSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJCisJc2VsZWN0IE1JSQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgR2lnYWJpdCBFdGhlcm5ldCBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQKKwkgIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgaGFtYWNoaS4KKworY29uZmlnIFlFTExPV0ZJTgorCXRyaXN0YXRlICJQYWNrZXQgRW5naW5lcyBZZWxsb3dmaW4gR2lnYWJpdC1OSUMgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFBDSSAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgQ1JDMzIKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgUGFja2V0IEVuZ2luZXMgRy1OSUMgUENJIEdpZ2FiaXQgRXRoZXJuZXQKKwkgIGFkYXB0ZXIgb3IgdGhlIFNZTTUzQzg4NSBFdGhlcm5ldCBjb250cm9sbGVyLiBUaGUgR2lnYWJpdCBhZGFwdGVyIGlzCisJICB1c2VkIGJ5IHRoZSBCZW93dWxmIExpbnV4IGNsdXN0ZXIgcHJvamVjdC4gIFNlZQorCSAgPGh0dHA6Ly9jZXNkaXMuZ3NmYy5uYXNhLmdvdi9saW51eC9kcml2ZXJzL3llbGxvd2Zpbi5odG1sPiBmb3IgbW9yZQorCSAgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkcml2ZXIgaW4gcGFydGljdWxhciBhbmQgQmVvd3VsZiBpbiBnZW5lcmFsLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB5ZWxsb3dmaW4uICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitjb25maWcgUjgxNjkKKwl0cmlzdGF0ZSAiUmVhbHRlayA4MTY5IGdpZ2FiaXQgZXRoZXJuZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSQorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBSZWFsdGVrIDgxNjkgUENJIEdpZ2FiaXQgRXRoZXJuZXQgYWRhcHRlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcjgxNjkuICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitjb25maWcgUjgxNjlfTkFQSQorCWJvb2wgIlVzZSBSeCBhbmQgVHggUG9sbGluZyAoTkFQSSkgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBSODE2OSAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBOQVBJIGlzIGEgbmV3IGRyaXZlciBBUEkgZGVzaWduZWQgdG8gcmVkdWNlIENQVSBhbmQgaW50ZXJydXB0IGxvYWQKKwkgIHdoZW4gdGhlIGRyaXZlciBpcyByZWNlaXZpbmcgbG90cyBvZiBwYWNrZXRzIGZyb20gdGhlIGNhcmQuIEl0IGlzCisJICBzdGlsbCBzb21ld2hhdCBleHBlcmltZW50YWwgYW5kIHRodXMgbm90IHlldCBlbmFibGVkIGJ5IGRlZmF1bHQuCisKKwkgIElmIHlvdXIgZXN0aW1hdGVkIFJ4IGxvYWQgaXMgMTBrcHBzIG9yIG1vcmUsIG9yIGlmIHRoZSBjYXJkIHdpbGwgYmUKKwkgIGRlcGxveWVkIG9uIHBvdGVudGlhbGx5IHVuZnJpZW5kbHkgbmV0d29ya3MgKGUuZy4gaW4gYSBmaXJld2FsbCksCisJICB0aGVuIHNheSBZIGhlcmUuCisKKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvTkFQSV9IT1dUTy50eHQ+IGZvciBtb3JlCisJICBpbmZvcm1hdGlvbi4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgUjgxNjlfVkxBTgorCWJvb2wgIlZMQU4gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFI4MTY5ICYmIFZMQU5fODAyMVEKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGZvciB0aGUgcjgxNjkgZHJpdmVyIHRvIHN1cHBvcnQgdGhlIGZ1bmN0aW9ucyByZXF1aXJlZAorCSAgYnkgdGhlIGtlcm5lbCA4MDIuMVEgY29kZS4KKwkgIAorCSAgSWYgaW4gZG91YnQsIHNheSBZLgorCitjb25maWcgU0s5OExJTgorCXRyaXN0YXRlICJNYXJ2ZWxsIFl1a29uIENoaXBzZXQgLyBTeXNLb25uZWN0IFNLLTk4eHggU3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSQorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBNYXJ2ZWxsIFl1a29uIG9yIFN5c0tvbm5lY3QgU0stOTh4eC9TSy05NXh4CisJICBjb21wbGlhbnQgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyLiBUaGUgZm9sbG93aW5nIGFkYXB0ZXJzIGFyZSBzdXBwb3J0ZWQKKwkgIGJ5IHRoaXMgZHJpdmVyOgorCSAgICAtIDNDb20gM0M5NDAgR2lnYWJpdCBMT00gRXRoZXJuZXQgQWRhcHRlcgorCSAgICAtIDNDb20gM0M5NDEgR2lnYWJpdCBMT00gRXRoZXJuZXQgQWRhcHRlcgorCSAgICAtIEFsbGllZCBUZWxlc3luIEFULTI5NzBMWCBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKwkgICAgLSBBbGxpZWQgVGVsZXN5biBBVC0yOTcwTFgvMlNDIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgorCSAgICAtIEFsbGllZCBUZWxlc3luIEFULTI5NzBTWCBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKwkgICAgLSBBbGxpZWQgVGVsZXN5biBBVC0yOTcwU1gvMlNDIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgorCSAgICAtIEFsbGllZCBUZWxlc3luIEFULTI5NzBUWCBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKwkgICAgLSBBbGxpZWQgVGVsZXN5biBBVC0yOTcwVFgvMlRYIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgorCSAgICAtIEFsbGllZCBUZWxlc3luIEFULTI5NzFTWCBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKwkgICAgLSBBbGxpZWQgVGVsZXN5biBBVC0yOTcxVCBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKwkgICAgLSBCZWxraW4gR2lnYWJpdCBEZXNrdG9wIENhcmQgMTAvMTAwLzEwMDBCYXNlLVQgQWRhcHRlciwgQ29wcGVyIFJKLTQ1CisJICAgIC0gREdFLTUzMFQgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCisJICAgIC0gRUcxMDMyIHYyIEluc3RhbnQgR2lnYWJpdCBOZXR3b3JrIEFkYXB0ZXIKKwkgICAgLSBFRzEwNjQgdjIgSW5zdGFudCBHaWdhYml0IE5ldHdvcmsgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgODhFODAwMSBHaWdhYml0IExPTSBFdGhlcm5ldCBBZGFwdGVyIChBYml0KQorCSAgICAtIE1hcnZlbGwgODhFODAwMSBHaWdhYml0IExPTSBFdGhlcm5ldCBBZGFwdGVyIChBbGJhdHJvbikKKwkgICAgLSBNYXJ2ZWxsIDg4RTgwMDEgR2lnYWJpdCBMT00gRXRoZXJuZXQgQWRhcHRlciAoQXN1cykKKwkgICAgLSBNYXJ2ZWxsIDg4RTgwMDEgR2lnYWJpdCBMT00gRXRoZXJuZXQgQWRhcHRlciAoRUNTKQorCSAgICAtIE1hcnZlbGwgODhFODAwMSBHaWdhYml0IExPTSBFdGhlcm5ldCBBZGFwdGVyIChFcG94KQorCSAgICAtIE1hcnZlbGwgODhFODAwMSBHaWdhYml0IExPTSBFdGhlcm5ldCBBZGFwdGVyIChGb3hjb25uKQorCSAgICAtIE1hcnZlbGwgODhFODAwMSBHaWdhYml0IExPTSBFdGhlcm5ldCBBZGFwdGVyIChHaWdhYnl0ZSkKKwkgICAgLSBNYXJ2ZWxsIDg4RTgwMDEgR2lnYWJpdCBMT00gRXRoZXJuZXQgQWRhcHRlciAoSXdpbGwpCisJICAgIC0gTWFydmVsbCA4OEU4MDUwIEdpZ2FiaXQgTE9NIEV0aGVybmV0IEFkYXB0ZXIgKEludGVsKQorCSAgICAtIE1hcnZlbGwgUkRLLTgwMDEgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwMDIgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwMDMgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwMDQgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwMDYgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwMDcgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwMDggQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwMDkgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwMTAgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwMTEgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwMTIgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgUkRLLTgwNTIgQWRhcHRlcgorCSAgICAtIE1hcnZlbGwgWXVrb24gR2lnYWJpdCBFdGhlcm5ldCAxMC8xMDAvMTAwMEJhc2UtVCBBZGFwdGVyICgzMiBiaXQpCisJICAgIC0gTWFydmVsbCBZdWtvbiBHaWdhYml0IEV0aGVybmV0IDEwLzEwMC8xMDAwQmFzZS1UIEFkYXB0ZXIgKDY0IGJpdCkKKwkgICAgLSBOLVdheSBQQ0ktQnVzIEdpZ2EtQ2FyZCAxMDAwLzEwMC8xME1icHMoTCkKKwkgICAgLSBTSy05NTIxIDEwLzEwMC8xMDAwQmFzZS1UIEFkYXB0ZXIKKwkgICAgLSBTSy05NTIxIFYyLjAgMTAvMTAwLzEwMDBCYXNlLVQgQWRhcHRlcgorCSAgICAtIFNLLTk4MjEgR2lnYWJpdCBFdGhlcm5ldCBTZXJ2ZXIgQWRhcHRlciAoU0stTkVUIEdFLVQpCisJICAgIC0gU0stOTgyMSBWMi4wIEdpZ2FiaXQgRXRoZXJuZXQgMTAvMTAwLzEwMDBCYXNlLVQgQWRhcHRlcgorCSAgICAtIFNLLTk4MjIgR2lnYWJpdCBFdGhlcm5ldCBTZXJ2ZXIgQWRhcHRlciAoU0stTkVUIEdFLVQgZHVhbCBsaW5rKQorCSAgICAtIFNLLTk4NDEgR2lnYWJpdCBFdGhlcm5ldCBTZXJ2ZXIgQWRhcHRlciAoU0stTkVUIEdFLUxYKQorCSAgICAtIFNLLTk4NDEgVjIuMCBHaWdhYml0IEV0aGVybmV0IDEwMDBCYXNlLUxYIEFkYXB0ZXIKKwkgICAgLSBTSy05ODQyIEdpZ2FiaXQgRXRoZXJuZXQgU2VydmVyIEFkYXB0ZXIgKFNLLU5FVCBHRS1MWCBkdWFsIGxpbmspCisJICAgIC0gU0stOTg0MyBHaWdhYml0IEV0aGVybmV0IFNlcnZlciBBZGFwdGVyIChTSy1ORVQgR0UtU1gpCisJICAgIC0gU0stOTg0MyBWMi4wIEdpZ2FiaXQgRXRoZXJuZXQgMTAwMEJhc2UtU1ggQWRhcHRlcgorCSAgICAtIFNLLTk4NDQgR2lnYWJpdCBFdGhlcm5ldCBTZXJ2ZXIgQWRhcHRlciAoU0stTkVUIEdFLVNYIGR1YWwgbGluaykKKwkgICAgLSBTSy05ODUxIFYyLjAgR2lnYWJpdCBFdGhlcm5ldCAxMDAwQmFzZS1TWCBBZGFwdGVyCisJICAgIC0gU0stOTg2MSBHaWdhYml0IEV0aGVybmV0IFNlcnZlciBBZGFwdGVyIChTSy1ORVQgR0UtU1ggVm9saXRpb24pCisJICAgIC0gU0stOTg2MSBWMi4wIEdpZ2FiaXQgRXRoZXJuZXQgMTAwMEJhc2UtU1ggQWRhcHRlcgorCSAgICAtIFNLLTk4NjIgR2lnYWJpdCBFdGhlcm5ldCBTZXJ2ZXIgQWRhcHRlciAoU0stTkVUIEdFLVNYIFZvbGl0aW9uIGR1YWwgbGluaykKKwkgICAgLSBTSy05ODcxIEdpZ2FiaXQgRXRoZXJuZXQgU2VydmVyIEFkYXB0ZXIgKFNLLU5FVCBHRS1aWCkKKwkgICAgLSBTSy05ODcxIFYyLjAgR2lnYWJpdCBFdGhlcm5ldCAxMDAwQmFzZS1aWCBBZGFwdGVyCisJICAgIC0gU0stOTg3MiBHaWdhYml0IEV0aGVybmV0IFNlcnZlciBBZGFwdGVyIChTSy1ORVQgR0UtWlggZHVhbCBsaW5rKQorCSAgICAtIFNNQyBFWiBDYXJkIDEwMDAgKFNNQzk0NTJUWFYuMikKKwkgIAorCSAgVGhlIGFkYXB0ZXJzIHN1cHBvcnQgSnVtYm8gRnJhbWVzLgorCSAgVGhlIGR1YWwgbGluayBhZGFwdGVycyBzdXBwb3J0IGxpbmstZmFpbG92ZXIgYW5kIGR1YWwgcG9ydCBmZWF0dXJlcy4KKwkgIEJvdGggTWFydmVsbCBZdWtvbiBhbmQgU3lzS29ubmVjdCBTSy05OHh4L1NLLTk1eHggYWRhcHRlcnMgc3VwcG9ydCAKKwkgIHRoZSBzY2F0dGVyLWdhdGhlciBmdW5jdGlvbmFsaXR5IHdpdGggc2VuZGZpbGUoKS4gUGxlYXNlIHJlZmVyIHRvIAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3NrOThsaW4udHh0PiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dAorCSAgb3B0aW9uYWwgZHJpdmVyIHBhcmFtZXRlcnMuCisJICBRdWVzdGlvbnMgY29uY2VybmluZyB0aGlzIGRyaXZlciBtYXkgYmUgYWRkcmVzc2VkIHRvOgorCSAgICAgIDxsaW51eEBzeXNrb25uZWN0LmRlPgorCSAgCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZQorCSAgaW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91IHdhbnQpLAorCSAgc2F5IE0gaGVyZSBhbmQgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL2tidWlsZC9tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIHNrOThsaW4uIFRoaXMgaXMgcmVjb21tZW5kZWQuCisKK2NvbmZpZyBWSUFfVkVMT0NJVFkKKwl0cmlzdGF0ZSAiVklBIFZlbG9jaXR5IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIFBDSQorCXNlbGVjdCBDUkMzMgorCXNlbGVjdCBDUkNfQ0NJVFQKKwlzZWxlY3QgTUlJCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBWSUEgIlZlbG9jaXR5IiBiYXNlZCBuZXR3b3JrIGNhcmQgc2F5IFkgaGVyZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgdmlhLXZlbG9jaXR5LgorCitjb25maWcgVElHT04zCisJdHJpc3RhdGUgIkJyb2FkY29tIFRpZ29uMyBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgQnJvYWRjb20gVGlnb24zIGJhc2VkIGdpZ2FiaXQgRXRoZXJuZXQgY2FyZHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHRnMy4gIFRoaXMgaXMgcmVjb21tZW5kZWQuCisKK2NvbmZpZyBHSUFORkFSCisJdHJpc3RhdGUgIkdpYW5mYXIgRXRoZXJuZXQiCisJZGVwZW5kcyBvbiA4NXh4IHx8IDgzeHgKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgR2lnYWJpdCBUU0VDIG9uIHRoZSBNUEM4NXh4IAorCSAgZmFtaWx5IG9mIGNoaXBzLCBhbmQgdGhlIEZFQyBvbiB0aGUgODU0MAorCitjb25maWcgR0ZBUl9OQVBJCisJYm9vbCAiTkFQSSBTdXBwb3J0IgorCWRlcGVuZHMgb24gR0lBTkZBUgorCitjb25maWcgTVY2NDNYWF9FVEgKKwl0cmlzdGF0ZSAiTVYtNjQzWFggRXRoZXJuZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE1PTUVOQ09fT0NFTE9UX0MgfHwgTU9NRU5DT19KQUdVQVJfQVRYIHx8IE1WNjQzNjAgfHwgTU9NRU5DT19PQ0VMT1RfMworCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBnaWdhYml0IEV0aGVybmV0IG9uIHRoZSBNYXJ2ZWxsIE1WNjQzWFgKKwkgIGNoaXBzZXQgd2hpY2ggaXMgdXNlZCBpbiB0aGUgTW9tZW5jbyBPY2Vsb3QgQyBhbmQgSmFndWFyIEFUWCBhbmQKKwkgIFBlZ2Fzb3MgSUksIGFtb25nc3Qgb3RoZXIgUFBDIGFuZCBNSVBTIGJvYXJkcy4KKworY29uZmlnIE1WNjQzWFhfRVRIXzAKKwlib29sICJNVi02NDNYWCBQb3J0IDAiCisJZGVwZW5kcyBvbiBNVjY0M1hYX0VUSAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBQb3J0IDAgb2YgdGhlIE1hcnZlbGwgTVY2NDNYWCBHaWdhYml0CisJICBFdGhlcm5ldC4KKworY29uZmlnIE1WNjQzWFhfRVRIXzEKKwlib29sICJNVi02NDNYWCBQb3J0IDEiCisJZGVwZW5kcyBvbiBNVjY0M1hYX0VUSAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBQb3J0IDEgb2YgdGhlIE1hcnZlbGwgTVY2NDNYWCBHaWdhYml0CisJICBFdGhlcm5ldC4KKworY29uZmlnIE1WNjQzWFhfRVRIXzIKKwlib29sICJNVi02NDNYWCBQb3J0IDIiCisJZGVwZW5kcyBvbiBNVjY0M1hYX0VUSAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBQb3J0IDIgb2YgdGhlIE1hcnZlbGwgTVY2NDNYWCBHaWdhYml0CisJICBFdGhlcm5ldC4KKworZW5kbWVudQorCisjCisjCTEwIEdpZ2FiaXQgRXRoZXJuZXQKKyMKKworbWVudSAiRXRoZXJuZXQgKDEwMDAwIE1iaXQpIgorCWRlcGVuZHMgb24gTkVUREVWSUNFUyAmJiAhVU1MCisKK2NvbmZpZyBJWEdCCisJdHJpc3RhdGUgIkludGVsKFIpIFBSTy8xMEdiRSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgSW50ZWwoUikgUFJPLzEwR2JFIGZhbWlseSBvZgorCSAgYWRhcHRlcnMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gaWRlbnRpZnkgeW91ciBhZGFwdGVyLCBnbworCSAgdG8gdGhlIEFkYXB0ZXIgJiBEcml2ZXIgSUQgR3VpZGUgYXQ6CisKKwkgIDxodHRwOi8vc3VwcG9ydC5pbnRlbC5jb20vc3VwcG9ydC9uZXR3b3JrL2FkYXB0ZXIvcHJvMTAwLzIxMzk3Lmh0bT4KKworCSAgRm9yIGdlbmVyYWwgaW5mb3JtYXRpb24gYW5kIHN1cHBvcnQsIGdvIHRvIHRoZSBJbnRlbCBzdXBwb3J0CisJICB3ZWJzaXRlIGF0OgorCisJICA8aHR0cDovL3N1cHBvcnQuaW50ZWwuY29tPgorCisJICBNb3JlIHNwZWNpZmljIGluZm9ybWF0aW9uIG9uIGNvbmZpZ3VyaW5nIHRoZSBkcml2ZXIgaXMgaW4gCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXhnYi50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGl4Z2IuCisKK2NvbmZpZyBJWEdCX05BUEkKKwlib29sICJVc2UgUnggUG9sbGluZyAoTkFQSSkgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBJWEdCICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIE5BUEkgaXMgYSBuZXcgZHJpdmVyIEFQSSBkZXNpZ25lZCB0byByZWR1Y2UgQ1BVIGFuZCBpbnRlcnJ1cHQgbG9hZAorCSAgd2hlbiB0aGUgZHJpdmVyIGlzIHJlY2VpdmluZyBsb3RzIG9mIHBhY2tldHMgZnJvbSB0aGUgY2FyZC4gSXQgaXMKKwkgIHN0aWxsIHNvbWV3aGF0IGV4cGVyaW1lbnRhbCBhbmQgdGh1cyBub3QgeWV0IGVuYWJsZWQgYnkgZGVmYXVsdC4KKworCSAgSWYgeW91ciBlc3RpbWF0ZWQgUnggbG9hZCBpcyAxMGtwcHMgb3IgbW9yZSwgb3IgaWYgdGhlIGNhcmQgd2lsbCBiZQorCSAgZGVwbG95ZWQgb24gcG90ZW50aWFsbHkgdW5mcmllbmRseSBuZXR3b3JrcyAoZS5nLiBpbiBhIGZpcmV3YWxsKSwKKwkgIHRoZW4gc2F5IFkgaGVyZS4KKworCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9OQVBJX0hPV1RPLnR4dD4gZm9yIG1vcmUKKwkgIGluZm9ybWF0aW9uLgorCisJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBTMklPCisJdHJpc3RhdGUgIlMySU8gMTBHYmUgWEZyYW1lIE5JQyIKKwlkZXBlbmRzIG9uIFBDSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSAxMEdiZSBYRnJhbWUgTklDIG9mIFMySU8uIAorCSAgRm9yIGhlbHAgcmVnYXJkaW5nIGRyaXZlciBjb21waWxhdGlvbiwgaW5zdGFsbGF0aW9uIGFuZCAKKwkgIHR1bmluZyBwbGVhc2UgbG9vayBpbnRvIH4vZHJpdmVycy9uZXQvczJpby9SRUFETUUudHh0LgorCitjb25maWcgUzJJT19OQVBJCisJYm9vbCAiVXNlIFJ4IFBvbGxpbmcgKE5BUEkpIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gUzJJTyAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBOQVBJIGlzIGEgbmV3IGRyaXZlciBBUEkgZGVzaWduZWQgdG8gcmVkdWNlIENQVSBhbmQgaW50ZXJydXB0IGxvYWQKKwkgIHdoZW4gdGhlIGRyaXZlciBpcyByZWNlaXZpbmcgbG90cyBvZiBwYWNrZXRzIGZyb20gdGhlIGNhcmQuIEl0IGlzCisJICBzdGlsbCBzb21ld2hhdCBleHBlcmltZW50YWwgYW5kIHRodXMgbm90IHlldCBlbmFibGVkIGJ5IGRlZmF1bHQuCisKKwkgIElmIHlvdXIgZXN0aW1hdGVkIFJ4IGxvYWQgaXMgMTBrcHBzIG9yIG1vcmUsIG9yIGlmIHRoZSBjYXJkIHdpbGwgYmUKKwkgIGRlcGxveWVkIG9uIHBvdGVudGlhbGx5IHVuZnJpZW5kbHkgbmV0d29ya3MgKGUuZy4gaW4gYSBmaXJld2FsbCksCisJICB0aGVuIHNheSBZIGhlcmUuCisKKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvTkFQSV9IT1dUTy50eHQ+IGZvciBtb3JlCisJICBpbmZvcm1hdGlvbi4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCitjb25maWcgMkJVRkZfTU9ERQorCWJvb2wgIlVzZSAyIEJ1ZmZlciBNb2RlIG9uIFJ4IHNpZGUuIgorCWRlcGVuZHMgb24gUzJJTworCS0tLWhlbHAtLS0KKwlPbiBlbmFibGluZyB0aGUgMiBidWZmZXIgbW9kZSwgdGhlIHJlY2VpdmVkIGZyYW1lIHdpbGwgYmUKKwlzcGxpdCBpbnRvIDIgcGFydHMgYmVmb3JlIGJlaW5nIERNQSdlZCB0byB0aGUgaG9zdHMgbWVtb3J5LgorCVRoZSBwYXJ0cyBhcmUgdGhlIGV0aGVybmV0IGhlYWRlciBhbmQgZXRoZXJuZXQgcGF5bG9hZC4gCisJVGhpcyBpcyB1c2VmdWwgb24gc3lzdGVtcyB3aGVyZSBETUEnaW5nIHRvIHRvIHVuYWxpZ25lZCAKKwlwaHlzaWNhbCBtZW1vcnkgbG9hY3Rpb25zIGNvbWVzIHdpdGggYSBoZWF2eSBwcmljZS4KKwlJZiBub3Qgc3VyZSBwbGVhc2Ugc2F5IE4uCisKK2VuZG1lbnUKKworaWYgIVVNTAorc291cmNlICJkcml2ZXJzL25ldC90b2tlbnJpbmcvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvbmV0L3BjbWNpYS9LY29uZmlnIgorZW5kaWYKKworc291cmNlICJkcml2ZXJzL25ldC93YW4vS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL2F0bS9LY29uZmlnIgorCitzb3VyY2UgImRyaXZlcnMvczM5MC9uZXQvS2NvbmZpZyIKKworY29uZmlnIElTRVJJRVNfVkVUSAorCXRyaXN0YXRlICJpU2VyaWVzIFZpcnR1YWwgRXRoZXJuZXQgZHJpdmVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRERVZJQ0VTICYmIFBQQ19JU0VSSUVTCisKK2NvbmZpZyBGRERJCisJYm9vbCAiRkRESSBkcml2ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMgJiYgKFBDSSB8fCBFSVNBKQorCWhlbHAKKwkgIEZpYmVyIERpc3RyaWJ1dGVkIERhdGEgSW50ZXJmYWNlIGlzIGEgaGlnaCBzcGVlZCBsb2NhbCBhcmVhIG5ldHdvcmsKKwkgIGRlc2lnbjsgZXNzZW50aWFsbHkgYSByZXBsYWNlbWVudCBmb3IgaGlnaCBzcGVlZCBFdGhlcm5ldC4gRkRESSBjYW4KKwkgIHJ1biBvdmVyIGNvcHBlciBvciBmaWJlci4gSWYgeW91IGFyZSBjb25uZWN0ZWQgdG8gc3VjaCBhIG5ldHdvcmsgYW5kCisJICB3YW50IGEgZHJpdmVyIGZvciB0aGUgRkRESSBjYXJkIGluIHlvdXIgY29tcHV0ZXIsIHNheSBZIGhlcmUgKGFuZAorCSAgdGhlbiBhbHNvIFkgdG8gdGhlIGRyaXZlciBmb3IgeW91ciBGRERJIGNhcmQsIGJlbG93KS4gTW9zdCBwZW9wbGUKKwkgIHdpbGwgc2F5IE4uCisKK2NvbmZpZyBERUZYWAorCXRyaXN0YXRlICJEaWdpdGFsIERFRkVBIGFuZCBERUZQQSBhZGFwdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBGRERJICYmIChQQ0kgfHwgRUlTQSkKKwloZWxwCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSBESUdJVEFMIHNlcmllcyBvZiBFSVNBIChERUZFQSkgYW5kIFBDSQorCSAgKERFRlBBKSBjb250cm9sbGVycyB3aGljaCBjYW4gY29ubmVjdCB5b3UgdG8gYSBsb2NhbCBGRERJIG5ldHdvcmsuCisKK2NvbmZpZyBTS0ZQCisJdHJpc3RhdGUgIlN5c0tvbm5lY3QgRkRESSBQQ0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEZEREkgJiYgUENJCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFN5c0tvbm5lY3QgRkRESSBQQ0kgYWRhcHRlci4KKwkgIFRoZSBmb2xsb3dpbmcgYWRhcHRlcnMgYXJlIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlcjoKKwkgIC0gU0stNTUyMSAoU0stTkVUIEZEREktVVApCisJICAtIFNLLTU1MjIgKFNLLU5FVCBGRERJLVVQIERBUykKKwkgIC0gU0stNTU0MSAoU0stTkVUIEZEREktRlApCisJICAtIFNLLTU1NDMgKFNLLU5FVCBGRERJLUxQKQorCSAgLSBTSy01NTQ0IChTSy1ORVQgRkRESS1MUCBEQVMpCisJICAtIFNLLTU4MjEgKFNLLU5FVCBGRERJLVVQNjQpCisJICAtIFNLLTU4MjIgKFNLLU5FVCBGRERJLVVQNjQgREFTKQorCSAgLSBTSy01ODQxIChTSy1ORVQgRkRESS1GUDY0KQorCSAgLSBTSy01ODQzIChTSy1ORVQgRkRESS1MUDY0KQorCSAgLSBTSy01ODQ0IChTSy1ORVQgRkRESS1MUDY0IERBUykKKwkgIC0gTmV0ZWxsaWdlbnQgMTAwIEZEREkgREFTIEZpYnJlIFNDCisJICAtIE5ldGVsbGlnZW50IDEwMCBGRERJIFNBUyBGaWJyZSBTQworCSAgLSBOZXRlbGxpZ2VudCAxMDAgRkRESSBEQVMgVVRQCisJICAtIE5ldGVsbGlnZW50IDEwMCBGRERJIFNBUyBVVFAKKwkgIC0gTmV0ZWxsaWdlbnQgMTAwIEZEREkgU0FTIEZpYnJlIE1JQworCisJICBSZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9za2ZwLnR4dD4gZm9yIGluZm9ybWF0aW9uIGFib3V0CisJICB0aGUgZHJpdmVyLgorCisJICBRdWVzdGlvbnMgY29uY2VybmluZyB0aGlzIGRyaXZlciBjYW4gYmUgYWRkcmVzc2VkIHRvOgorCSAgPGxpbnV4QHN5c2tvbm5lY3QuZGU+CisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNrZnAuICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitjb25maWcgSElQUEkKKwlib29sICJISVBQSSBkcml2ZXIgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMgJiYgRVhQRVJJTUVOVEFMICYmIElORVQgJiYgUENJCisJaGVscAorCSAgSElnaCBQZXJmb3JtYW5jZSBQYXJhbGxlbCBJbnRlcmZhY2UgKEhJUFBJKSBpcyBhIDgwME1iaXQvc2VjIGFuZAorCSAgMTYwME1iaXQvc2VjIGR1YWwtc2ltcGxleCBzd2l0Y2hlZCBvciBwb2ludC10by1wb2ludCBuZXR3b3JrLiBISVBQSQorCSAgY2FuIHJ1biBvdmVyIGNvcHBlciAoMjVtKSBvciBmaWJlciAoMzAwbSBvbiBtdWx0aS1tb2RlIG9yIDEwa20gb24KKwkgIHNpbmdsZS1tb2RlKS4gSElQUEkgbmV0d29ya3MgYXJlIGNvbW1vbmx5IHVzZWQgZm9yIGNsdXN0ZXJzIGFuZCB0bworCSAgY29ubmVjdCB0byBzdXBlciBjb21wdXRlcnMuIElmIHlvdSBhcmUgY29ubmVjdGVkIHRvIGEgSElQUEkgbmV0d29yaworCSAgYW5kIGhhdmUgYSBISVBQSSBuZXR3b3JrIGNhcmQgaW4geW91ciBjb21wdXRlciB0aGF0IHlvdSB3YW50IHRvIHVzZQorCSAgdW5kZXIgTGludXgsIHNheSBZIGhlcmUgKHlvdSBtdXN0IGFsc28gcmVtZW1iZXIgdG8gZW5hYmxlIHRoZSBkcml2ZXIKKwkgIGZvciB5b3VyIEhJUFBJIGNhcmQgYmVsb3cpLiBNb3N0IHBlb3BsZSB3aWxsIHNheSBOIGhlcmUuCisKK2NvbmZpZyBST0FEUlVOTkVSCisJdHJpc3RhdGUgIkVzc2VudGlhbCBSb2FkUnVubmVyIEhJUFBJIFBDSSBhZGFwdGVyIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBISVBQSSAmJiBQQ0kKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHRoaXMgaXMgeW91ciBQQ0kgSElQUEkgbmV0d29yayBjYXJkLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBycnVubmVyLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFJPQURSVU5ORVJfTEFSR0VfUklOR1MKKwlib29sICJVc2UgbGFyZ2UgVFgvUlggcmluZ3MgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBST0FEUlVOTkVSCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBSb2FkUnVubmVyIGRyaXZlciB3aWxsIHByZWFsbG9jYXRlIHVwIHRvIDIgTUIKKwkgIG9mIGFkZGl0aW9uYWwgbWVtb3J5IHRvIGFsbG93IGZvciBmYXN0ZXN0IG9wZXJhdGlvbiwgYm90aCBmb3IKKwkgIHRyYW5zbWl0dGluZyBhbmQgcmVjZWl2aW5nLiBUaGlzIG1lbW9yeSBjYW5ub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIKKwkgIGtlcm5lbCBjb2RlIG9yIGJ5IHVzZXIgc3BhY2UgcHJvZ3JhbXMuIFNheSBZIGhlcmUgb25seSBpZiB5b3UgaGF2ZQorCSAgdGhlIG1lbW9yeS4KKworY29uZmlnIFBMSVAKKwl0cmlzdGF0ZSAiUExJUCAocGFyYWxsZWwgcG9ydCkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMgJiYgUEFSUE9SVAorCS0tLWhlbHAtLS0KKwkgIFBMSVAgKFBhcmFsbGVsIExpbmUgSW50ZXJuZXQgUHJvdG9jb2wpIGlzIHVzZWQgdG8gY3JlYXRlIGEKKwkgIHJlYXNvbmFibHkgZmFzdCBtaW5pIG5ldHdvcmsgY29uc2lzdGluZyBvZiB0d28gKG9yLCByYXJlbHksIG1vcmUpCisJICBsb2NhbCBtYWNoaW5lcy4gIEEgUExJUCBsaW5rIGZyb20gYSBMaW51eCBib3ggaXMgYSBwb3B1bGFyIG1lYW5zIHRvCisJICBpbnN0YWxsIGEgTGludXggZGlzdHJpYnV0aW9uIG9uIGEgbWFjaGluZSB3aGljaCBkb2Vzbid0IGhhdmUgYQorCSAgQ0QtUk9NIGRyaXZlIChhIG1pbmltYWwgc3lzdGVtIGhhcyB0byBiZSB0cmFuc2ZlcnJlZCB3aXRoIGZsb3BwaWVzCisJICBmaXJzdCkuIFRoZSBrZXJuZWxzIG9uIGJvdGggbWFjaGluZXMgbmVlZCB0byBoYXZlIHRoaXMgUExJUCBvcHRpb24KKwkgIGVuYWJsZWQgZm9yIHRoaXMgdG8gd29yay4KKworCSAgVGhlIFBMSVAgZHJpdmVyIGhhcyB0d28gbW9kZXMsIG1vZGUgMCBhbmQgbW9kZSAxLiAgVGhlIHBhcmFsbGVsCisJICBwb3J0cyAodGhlIGNvbm5lY3RvcnMgYXQgdGhlIGNvbXB1dGVycyB3aXRoIDI1IGhvbGVzKSBhcmUgY29ubmVjdGVkCisJICB3aXRoICJudWxsIHByaW50ZXIiIG9yICJUdXJibyBMYXBsaW5rIiBjYWJsZXMgd2hpY2ggY2FuIHRyYW5zbWl0IDQKKwkgIGJpdHMgYXQgYSB0aW1lIChtb2RlIDApIG9yIHdpdGggc3BlY2lhbCBQTElQIGNhYmxlcywgdG8gYmUgdXNlZCBvbgorCSAgYmlkaXJlY3Rpb25hbCBwYXJhbGxlbCBwb3J0cyBvbmx5LCB3aGljaCBjYW4gdHJhbnNtaXQgOCBiaXRzIGF0IGEKKwkgIHRpbWUgKG1vZGUgMSk7IHlvdSBjYW4gZmluZCB0aGUgd2lyaW5nIG9mIHRoZXNlIGNhYmxlcyBpbgorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL1BMSVAudHh0Pi4gIFRoZSBjYWJsZXMgY2FuIGJlIHVwIHRvCisJICAxNW0gbG9uZy4gIE1vZGUgMCB3b3JrcyBhbHNvIGlmIG9uZSBvZiB0aGUgbWFjaGluZXMgcnVucyBET1MvV2luZG93cworCSAgYW5kIGhhcyBzb21lIFBMSVAgc29mdHdhcmUgaW5zdGFsbGVkLCBlLmcuIHRoZSBDcnlud3IgUExJUCBwYWNrZXQKKwkgIGRyaXZlciAoPGh0dHA6Ly9vYWsub2FrbGFuZC5lZHUvc2ltdGVsLm5ldC9tc2Rvcy9wa3RkcnZyLXByZS5odG1sPikKKwkgIGFuZCB3aW5zb2NrIG9yIE5DU0EncyB0ZWxuZXQuCisKKwkgIElmIHlvdSB3YW50IHRvIHVzZSBQTElQLCBzYXkgWSBhbmQgcmVhZCB0aGUgUExJUCBtaW5pLUhPV1RPIGFzIHdlbGwKKwkgIGFzIHRoZSBORVQtMy1IT1dUTywgYm90aCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gIE5vdGUgdGhhdCB0aGUgUExJUAorCSAgcHJvdG9jb2wgaGFzIGJlZW4gY2hhbmdlZCBhbmQgdGhpcyBQTElQIGRyaXZlciB3b24ndCB3b3JrIHRvZ2V0aGVyCisJICB3aXRoIHRoZSBQTElQIHN1cHBvcnQgaW4gTGludXggdmVyc2lvbnMgMS4wLnguICBUaGlzIG9wdGlvbiBlbmxhcmdlcworCSAgeW91ciBrZXJuZWwgYnkgYWJvdXQgOCBLQi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBwbGlwLiAgSWYgdW5zdXJlLCBzYXkgWSBvciBNLCBpbiBjYXNlIHlvdSBidXkgYSBsYXB0b3AKKwkgIGxhdGVyLgorCitjb25maWcgUFBQCisJdHJpc3RhdGUgIlBQUCAocG9pbnQtdG8tcG9pbnQgcHJvdG9jb2wpIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRERVZJQ0VTCisJLS0taGVscC0tLQorCSAgUFBQIChQb2ludCB0byBQb2ludCBQcm90b2NvbCkgaXMgYSBuZXdlciBhbmQgYmV0dGVyIFNMSVAuICBJdCBzZXJ2ZXMKKwkgIHRoZSBzYW1lIHB1cnBvc2U6IHNlbmRpbmcgSW50ZXJuZXQgdHJhZmZpYyBvdmVyIHRlbGVwaG9uZSAoYW5kIG90aGVyCisJICBzZXJpYWwpIGxpbmVzLiAgQXNrIHlvdXIgYWNjZXNzIHByb3ZpZGVyIGlmIHRoZXkgc3VwcG9ydCBpdCwgYmVjYXVzZQorCSAgb3RoZXJ3aXNlIHlvdSBjYW4ndCB1c2UgaXQ7IG1vc3QgSW50ZXJuZXQgYWNjZXNzIHByb3ZpZGVycyB0aGVzZQorCSAgZGF5cyBzdXBwb3J0IFBQUCByYXRoZXIgdGhhbiBTTElQLgorCisJICBUbyB1c2UgUFBQLCB5b3UgbmVlZCBhbiBhZGRpdGlvbmFsIHByb2dyYW0gY2FsbGVkIHBwcGQgYXMgZGVzY3JpYmVkCisJICBpbiB0aGUgUFBQLUhPV1RPLCBhdmFpbGFibGUgYXQKKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uICBNYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZQorCSAgdGhlIHZlcnNpb24gb2YgcHBwZCByZWNvbW1lbmRlZCBpbiA8ZmlsZTpEb2N1bWVudGF0aW9uL0NoYW5nZXM+LgorCSAgVGhlIFBQUCBvcHRpb24gZW5sYXJnZXMgeW91ciBrZXJuZWwgYnkgYWJvdXQgMTYgS0IuCisKKwkgIFRoZXJlIGFyZSBhY3R1YWxseSB0d28gdmVyc2lvbnMgb2YgUFBQOiB0aGUgdHJhZGl0aW9uYWwgUFBQIGZvcgorCSAgYXN5bmNocm9ub3VzIGxpbmVzLCBzdWNoIGFzIHJlZ3VsYXIgYW5hbG9nIHBob25lIGxpbmVzLCBhbmQKKwkgIHN5bmNocm9ub3VzIFBQUCB3aGljaCBjYW4gYmUgdXNlZCBvdmVyIGRpZ2l0YWwgSVNETiBsaW5lcyBmb3IKKwkgIGV4YW1wbGUuICBJZiB5b3Ugd2FudCB0byB1c2UgUFBQIG92ZXIgcGhvbmUgbGluZXMgb3Igb3RoZXIKKwkgIGFzeW5jaHJvbm91cyBzZXJpYWwgbGluZXMsIHlvdSBuZWVkIHRvIHNheSBZIChvciBNKSBoZXJlIGFuZCBhbHNvIHRvCisJICB0aGUgbmV4dCBvcHRpb24sICJQUFAgc3VwcG9ydCBmb3IgYXN5bmMgc2VyaWFsIHBvcnRzIi4gIEZvciBQUFAgb3ZlcgorCSAgc3luY2hyb25vdXMgbGluZXMsIHlvdSBzaG91bGQgc2F5IFkgKG9yIE0pIGhlcmUgYW5kIHRvICJTdXBwb3J0CisJICBzeW5jaHJvbm91cyBQUFAiLCBiZWxvdy4KKworCSAgSWYgeW91IHNhaWQgWSB0byAiVmVyc2lvbiBpbmZvcm1hdGlvbiBvbiBhbGwgc3ltYm9scyIgYWJvdmUsIHRoZW4KKwkgIHlvdSBjYW5ub3QgY29tcGlsZSB0aGUgUFBQIGRyaXZlciBpbnRvIHRoZSBrZXJuZWw7IHlvdSBjYW4gdGhlbiBvbmx5CisJICBjb21waWxlIGl0IGFzIGEgbW9kdWxlLiBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTQorCSAgaGVyZSBhbmQgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4KKwkgIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcHBwX2dlbmVyaWMuCisKK2NvbmZpZyBQUFBfTVVMVElMSU5LCisJYm9vbCAiUFBQIG11bHRpbGluayBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gUFBQICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFBQUCBtdWx0aWxpbmsgaXMgYSBwcm90b2NvbCAoZGVmaW5lZCBpbiBSRkMgMTk5MCkgd2hpY2ggYWxsb3dzIHlvdQorCSAgdG8gY29tYmluZSBzZXZlcmFsIChsb2dpY2FsIG9yIHBoeXNpY2FsKSBsaW5lcyBpbnRvIG9uZSBsb2dpY2FsIFBQUAorCSAgY29ubmVjdGlvbiwgc28gdGhhdCB5b3UgY2FuIHV0aWxpemUgeW91ciBmdWxsIGJhbmR3aWR0aC4KKworCSAgVGhpcyBoYXMgdG8gYmUgc3VwcG9ydGVkIGF0IHRoZSBvdGhlciBlbmQgYXMgd2VsbCBhbmQgeW91IG5lZWQgYQorCSAgdmVyc2lvbiBvZiB0aGUgcHBwZCBkYWVtb24gd2hpY2ggdW5kZXJzdGFuZHMgdGhlIG11bHRpbGluayBwcm90b2NvbC4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFBQUF9GSUxURVIKKwlib29sICJQUFAgZmlsdGVyaW5nIgorCWRlcGVuZHMgb24gUFBQCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIGZpbHRlciB0aGUgcGFja2V0cyBwYXNzaW5nIG92ZXIKKwkgIFBQUCBpbnRlcmZhY2VzLiAgVGhpcyBhbGxvd3MgeW91IHRvIGNvbnRyb2wgd2hpY2ggcGFja2V0cyBjb3VudCBhcworCSAgYWN0aXZpdHkgKGkuZS4gd2hpY2ggcGFja2V0cyB3aWxsIHJlc2V0IHRoZSBpZGxlIHRpbWVyIG9yIGJyaW5nIHVwCisJICBhIGRlbWFuZC1kaWFsbGVkIGxpbmspIGFuZCB3aGljaCBwYWNrZXRzIGFyZSB0byBiZSBkcm9wcGVkIGVudGlyZWx5LgorCSAgWW91IG5lZWQgdG8gc2F5IFkgaGVyZSBpZiB5b3Ugd2lzaCB0byB1c2UgdGhlIHBhc3MtZmlsdGVyIGFuZAorCSAgYWN0aXZlLWZpbHRlciBvcHRpb25zIHRvIHBwcGQuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBQUFBfQVNZTkMKKwl0cmlzdGF0ZSAiUFBQIHN1cHBvcnQgZm9yIGFzeW5jIHNlcmlhbCBwb3J0cyIKKwlkZXBlbmRzIG9uIFBQUAorCXNlbGVjdCBDUkNfQ0NJVFQKKwktLS1oZWxwLS0tCisJICBTYXkgWSAob3IgTSkgaGVyZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHVzZSBQUFAgb3ZlciBzdGFuZGFyZAorCSAgYXN5bmNocm9ub3VzIHNlcmlhbCBwb3J0cywgc3VjaCBhcyBDT00xIG9yIENPTTIgb24gYSBQQy4gIElmIHlvdSB1c2UKKwkgIGEgbW9kZW0gKG5vdCBhIHN5bmNocm9ub3VzIG9yIElTRE4gbW9kZW0pIHRvIGNvbnRhY3QgeW91ciBJU1AsIHlvdQorCSAgbmVlZCB0aGlzIG9wdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIFBQUF9TWU5DX1RUWQorCXRyaXN0YXRlICJQUFAgc3VwcG9ydCBmb3Igc3luYyB0dHkgcG9ydHMiCisJZGVwZW5kcyBvbiBQUFAKKwloZWxwCisJICBTYXkgWSAob3IgTSkgaGVyZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHVzZSBQUFAgb3ZlciBzeW5jaHJvbm91cworCSAgKEhETEMpIHR0eSBkZXZpY2VzLCBzdWNoIGFzIHRoZSBTeW5jTGluayBhZGFwdGVyLiBUaGVzZSBkZXZpY2VzCisJICBhcmUgb2Z0ZW4gdXNlZCBmb3IgaGlnaC1zcGVlZCBsZWFzZWQgbGluZXMgbGlrZSBUMS9FMS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4KKworY29uZmlnIFBQUF9ERUZMQVRFCisJdHJpc3RhdGUgIlBQUCBEZWZsYXRlIGNvbXByZXNzaW9uIgorCWRlcGVuZHMgb24gUFBQCisJc2VsZWN0IFpMSUJfSU5GTEFURQorCXNlbGVjdCBaTElCX0RFRkxBVEUKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciB0aGUgRGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgZm9yIFBQUCwgd2hpY2ggdXNlcyB0aGUKKwkgIERlZmxhdGUgYWxnb3JpdGhtICh0aGUgc2FtZSBhbGdvcml0aG0gdGhhdCBnemlwIHVzZXMpIHRvIGNvbXByZXNzCisJICBlYWNoIFBQUCBwYWNrZXQgYmVmb3JlIGl0IGlzIHNlbnQgb3ZlciB0aGUgd2lyZS4gIFRoZSBtYWNoaW5lIGF0IHRoZQorCSAgb3RoZXIgZW5kIG9mIHRoZSBQUFAgbGluayAodXN1YWxseSB5b3VyIElTUCkgaGFzIHRvIHN1cHBvcnQgdGhlCisJICBEZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCBhcyB3ZWxsIGZvciB0aGlzIHRvIGJlIHVzZWZ1bC4gIEV2ZW4gaWYKKwkgIHRoZXkgZG9uJ3Qgc3VwcG9ydCBpdCwgaXQgaXMgc2FmZSB0byBzYXkgWSBoZXJlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLgorCitjb25maWcgUFBQX0JTRENPTVAKKwl0cmlzdGF0ZSAiUFBQIEJTRC1Db21wcmVzcyBjb21wcmVzc2lvbiIKKwlkZXBlbmRzIG9uIFBQUAorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIHRoZSBCU0QtQ29tcHJlc3MgY29tcHJlc3Npb24gbWV0aG9kIGZvciBQUFAsIHdoaWNoIHVzZXMKKwkgIHRoZSBMWlcgY29tcHJlc3Npb24gbWV0aG9kIHRvIGNvbXByZXNzIGVhY2ggUFBQIHBhY2tldCBiZWZvcmUgaXQgaXMKKwkgIHNlbnQgb3ZlciB0aGUgd2lyZS4gVGhlIG1hY2hpbmUgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgUFBQIGxpbmsKKwkgICh1c3VhbGx5IHlvdXIgSVNQKSBoYXMgdG8gc3VwcG9ydCB0aGUgQlNELUNvbXByZXNzIGNvbXByZXNzaW9uCisJICBtZXRob2QgYXMgd2VsbCBmb3IgdGhpcyB0byBiZSB1c2VmdWwuIEV2ZW4gaWYgdGhleSBkb24ndCBzdXBwb3J0IGl0LAorCSAgaXQgaXMgc2FmZSB0byBzYXkgWSBoZXJlLgorCisJICBUaGUgUFBQIERlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICgiUFBQIERlZmxhdGUgY29tcHJlc3Npb24iLAorCSAgYWJvdmUpIGlzIHByZWZlcmFibGUgdG8gQlNELUNvbXByZXNzLCBiZWNhdXNlIGl0IGNvbXByZXNzZXMgYmV0dGVyCisJICBhbmQgaXMgcGF0ZW50LWZyZWUuCisKKwkgIE5vdGUgdGhhdCB0aGUgQlNEIGNvbXByZXNzaW9uIGNvZGUgd2lsbCBhbHdheXMgYmUgY29tcGlsZWQgYXMgYQorCSAgbW9kdWxlOyBpdCBpcyBjYWxsZWQgYnNkX2NvbXAgYW5kIHdpbGwgc2hvdyB1cCBpbiB0aGUgZGlyZWN0b3J5CisJICBtb2R1bGVzIG9uY2UgeW91IGhhdmUgc2FpZCAibWFrZSBtb2R1bGVzIi4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFBQUE9FCisJdHJpc3RhdGUgIlBQUCBvdmVyIEV0aGVybmV0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIFBQUAorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIFBQUCBvdmVyIEV0aGVybmV0LgorCisJICBUaGlzIGRyaXZlciByZXF1aXJlcyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgcHBwZCBmcm9tIHRoZSBDVlMKKwkgIHJlcG9zaXRvcnkgYXQgY3ZzLnNhbWJhLm9yZy4gIEFsdGVybmF0aXZlbHksIHNlZSB0aGUgCisJICBSb2FyaW5nUGVuZ3VpbiBwYWNrYWdlICg8aHR0cDovL3d3dy5yb2FyaW5ncGVuZ3Vpbi5jb20vcHBwb2U+KQorCSAgd2hpY2ggY29udGFpbnMgaW5zdHJ1Y3Rpb24gb24gaG93IHRvIHVzZSB0aGlzIGRyaXZlciAodW5kZXIgCisJICB0aGUgaGVhZGluZyAiS2VybmVsIG1vZGUgUFBQb0UiKS4KKworY29uZmlnIFBQUE9BVE0KKwl0cmlzdGF0ZSAiUFBQIG92ZXIgQVRNIgorCWRlcGVuZHMgb24gQVRNICYmIFBQUAorCWhlbHAKKwkgIFN1cHBvcnQgUFBQIChQb2ludCB0byBQb2ludCBQcm90b2NvbCkgZW5jYXBzdWxhdGVkIGluIEFUTSBmcmFtZXMuCisJICBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHlldCBjb21wbHkgd2l0aCBzZWN0aW9uIDggb2YgUkZDMjM2NCwKKwkgIHdoaWNoIGNhbiBsZWFkIHRvIGJhZCByZXN1bHRzIGlmIHRoZSBBVE0gcGVlciBsb3NlcyBzdGF0ZSBhbmQKKwkgIGNoYW5nZXMgaXRzIGVuY2Fwc3VsYXRpb24gdW5pbGF0ZXJhbGx5LgorCitjb25maWcgU0xJUAorCXRyaXN0YXRlICJTTElQIChzZXJpYWwgbGluZSkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMKKwktLS1oZWxwLS0tCisJICBTYXkgWSBpZiB5b3UgaW50ZW5kIHRvIHVzZSBTTElQIG9yIENTTElQIChjb21wcmVzc2VkIFNMSVApIHRvCisJICBjb25uZWN0IHRvIHlvdXIgSW50ZXJuZXQgc2VydmljZSBwcm92aWRlciBvciB0byBjb25uZWN0IHRvIHNvbWUKKwkgIG90aGVyIGxvY2FsIFVuaXggYm94IG9yIGlmIHlvdSB3YW50IHRvIGNvbmZpZ3VyZSB5b3VyIExpbnV4IGJveCBhcyBhCisJICBTbGlwL0NTbGlwIHNlcnZlciBmb3Igb3RoZXIgcGVvcGxlIHRvIGRpYWwgaW4uIFNMSVAgKFNlcmlhbCBMaW5lCisJICBJbnRlcm5ldCBQcm90b2NvbCkgaXMgYSBwcm90b2NvbCB1c2VkIHRvIHNlbmQgSW50ZXJuZXQgdHJhZmZpYyBvdmVyCisJICBzZXJpYWwgY29ubmVjdGlvbnMgc3VjaCBhcyB0ZWxlcGhvbmUgbGluZXMgb3IgbnVsbCBtb2RlbSBjYWJsZXM7CisJICBub3dhZGF5cywgdGhlIHByb3RvY29sIFBQUCBpcyBtb3JlIGNvbW1vbmx5IHVzZWQgZm9yIHRoaXMgc2FtZQorCSAgcHVycG9zZS4KKworCSAgTm9ybWFsbHksIHlvdXIgYWNjZXNzIHByb3ZpZGVyIGhhcyB0byBzdXBwb3J0IFNMSVAgaW4gb3JkZXIgZm9yIHlvdQorCSAgdG8gYmUgYWJsZSB0byB1c2UgaXQsIGJ1dCB0aGVyZSBpcyBub3cgYSBTTElQIGVtdWxhdG9yIGNhbGxlZCBTTGlSUAorCSAgYXJvdW5kIChhdmFpbGFibGUgZnJvbQorCSAgPGZ0cDovL2liaWJsaW8ub3JnL3B1Yi9MaW51eC9zeXN0ZW0vbmV0d29yay9zZXJpYWwvPikgd2hpY2gKKwkgIGFsbG93cyB5b3UgdG8gdXNlIFNMSVAgb3ZlciBhIHJlZ3VsYXIgZGlhbCB1cCBzaGVsbCBjb25uZWN0aW9uLiBJZgorCSAgeW91IHBsYW4gdG8gdXNlIFNMaVJQLCBtYWtlIHN1cmUgdG8gc2F5IFkgdG8gQ1NMSVAsIGJlbG93LiBUaGUKKwkgIE5FVC0zLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPiwgZXhwbGFpbnMgaG93IHRvCisJICBjb25maWd1cmUgU0xJUC4gTm90ZSB0aGF0IHlvdSBkb24ndCBuZWVkIHRoaXMgb3B0aW9uIGlmIHlvdSBqdXN0CisJICB3YW50IHRvIHJ1biB0ZXJtICh0ZXJtIGlzIGEgcHJvZ3JhbSB3aGljaCBnaXZlcyB5b3UgYWxtb3N0IGZ1bGwKKwkgIEludGVybmV0IGNvbm5lY3Rpdml0eSBpZiB5b3UgaGF2ZSBhIHJlZ3VsYXIgZGlhbCB1cCBzaGVsbCBhY2NvdW50IG9uCisJICBzb21lIEludGVybmV0IGNvbm5lY3RlZCBVbml4IGNvbXB1dGVyLiBSZWFkCisJICA8aHR0cDovL3d3dy5iYXJ0Lm5sL35wYXRyaWNrci90ZXJtLWhvd3RvL1Rlcm0tSE9XVE8uaHRtbD4pLiBTTElQCisJICBzdXBwb3J0IHdpbGwgZW5sYXJnZSB5b3VyIGtlcm5lbCBieSBhYm91dCA0IEtCLiBJZiB1bnN1cmUsIHNheSBOLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgc2xpcC4KKworY29uZmlnIFNMSVBfQ09NUFJFU1NFRAorCWJvb2wgIkNTTElQIGNvbXByZXNzZWQgaGVhZGVycyIKKwlkZXBlbmRzIG9uIFNMSVAKKwktLS1oZWxwLS0tCisJICBUaGlzIHByb3RvY29sIGlzIGZhc3RlciB0aGFuIFNMSVAgYmVjYXVzZSBpdCB1c2VzIGNvbXByZXNzaW9uIG9uIHRoZQorCSAgVENQL0lQIGhlYWRlcnMgKG5vdCBvbiB0aGUgZGF0YSBpdHNlbGYpLCBidXQgaXQgaGFzIHRvIGJlIHN1cHBvcnRlZAorCSAgb24gYm90aCBlbmRzLiBBc2sgeW91ciBhY2Nlc3MgcHJvdmlkZXIgaWYgeW91IGFyZSBub3Qgc3VyZSBhbmQKKwkgIGFuc3dlciBZLCBqdXN0IGluIGNhc2UuIFlvdSB3aWxsIHN0aWxsIGJlIGFibGUgdG8gdXNlIHBsYWluIFNMSVAuIElmCisJICB5b3UgcGxhbiB0byB1c2UgU0xpUlAsIHRoZSBTTElQIGVtdWxhdG9yIChhdmFpbGFibGUgZnJvbQorCSAgPGZ0cDovL2liaWJsaW8ub3JnL3B1Yi9MaW51eC9zeXN0ZW0vbmV0d29yay9zZXJpYWwvPikgd2hpY2gKKwkgIGFsbG93cyB5b3UgdG8gdXNlIFNMSVAgb3ZlciBhIHJlZ3VsYXIgZGlhbCB1cCBzaGVsbCBjb25uZWN0aW9uLCB5b3UKKwkgIGRlZmluaXRlbHkgd2FudCB0byBzYXkgWSBoZXJlLiBUaGUgTkVULTMtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LCBleHBsYWlucyBob3cgdG8gY29uZmlndXJlCisJICBDU0xJUC4gVGhpcyB3b24ndCBlbmxhcmdlIHlvdXIga2VybmVsLgorCitjb25maWcgU0xJUF9TTUFSVAorCWJvb2wgIktlZXBhbGl2ZSBhbmQgbGluZWZpbGwiCisJZGVwZW5kcyBvbiBTTElQCisJaGVscAorCSAgQWRkcyBhZGRpdGlvbmFsIGNhcGFiaWxpdGllcyB0byB0aGUgU0xJUCBkcml2ZXIgdG8gc3VwcG9ydCB0aGUKKwkgIFJFTENPTSBsaW5lIGZpbGwgYW5kIGtlZXBhbGl2ZSBtb25pdG9yaW5nLiBJZGVhbCBvbiBwb29yIHF1YWxpdHkKKwkgIGFuYWxvZ3VlIGxpbmVzLgorCitjb25maWcgU0xJUF9NT0RFX1NMSVA2CisJYm9vbCAiU2l4IGJpdCBTTElQIGVuY2Fwc3VsYXRpb24iCisJZGVwZW5kcyBvbiBTTElQCisJaGVscAorCSAgSnVzdCBvY2Nhc2lvbmFsbHkgeW91IG1heSBuZWVkIHRvIHJ1biBJUCBvdmVyIGhvc3RpbGUgc2VyaWFsCisJICBuZXR3b3JrcyB0aGF0IGRvbid0IHBhc3MgYWxsIGNvbnRyb2wgY2hhcmFjdGVycyBvciBhcmUgb25seSBzZXZlbgorCSAgYml0LiBTYXlpbmcgWSBoZXJlIGFkZHMgYW4gZXh0cmEgbW9kZSB5b3UgY2FuIHVzZSB3aXRoIFNMSVA6CisJICAic2xpcDYiLiBJbiB0aGlzIG1vZGUsIFNMSVAgd2lsbCBvbmx5IHNlbmQgbm9ybWFsIEFTQ0lJIHN5bWJvbHMgb3ZlcgorCSAgdGhlIHNlcmlhbCBkZXZpY2UuIE5hdHVyYWxseSwgdGhpcyBoYXMgdG8gYmUgc3VwcG9ydGVkIGF0IHRoZSBvdGhlcgorCSAgZW5kIG9mIHRoZSBsaW5rIGFzIHdlbGwuIEl0J3MgZ29vZCBlbm91Z2gsIGZvciBleGFtcGxlLCB0byBydW4gSVAKKwkgIG92ZXIgdGhlIGFzeW5jIHBvcnRzIG9mIGEgQ2FtdGVjIEpOVCBQYWQuIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBORVRfRkMKKwlib29sICJGaWJyZSBDaGFubmVsIGRyaXZlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUREVWSUNFUyAmJiBTQ1NJICYmIFBDSQorCWhlbHAKKwkgIEZpYnJlIENoYW5uZWwgaXMgYSBoaWdoIHNwZWVkIHNlcmlhbCBwcm90b2NvbCBtYWlubHkgdXNlZCB0byBjb25uZWN0CisJICBsYXJnZSBzdG9yYWdlIGRldmljZXMgdG8gdGhlIGNvbXB1dGVyOyBpdCBpcyBjb21wYXRpYmxlIHdpdGggYW5kCisJICBpbnRlbmRlZCB0byByZXBsYWNlIFNDU0kuCisKKwkgIElmIHlvdSBpbnRlbmQgdG8gdXNlIEZpYnJlIENoYW5uZWwsIHlvdSBuZWVkIHRvIGhhdmUgYSBGaWJyZSBjaGFubmVsCisJICBhZGFwdG9yIGNhcmQgaW4geW91ciBjb21wdXRlcjsgc2F5IFkgaGVyZSBhbmQgdG8gdGhlIGRyaXZlciBmb3IgeW91cgorCSAgYWRhcHRvciBiZWxvdy4gWW91IGFsc28gc2hvdWxkIGhhdmUgc2FpZCBZIHRvICJTQ1NJIHN1cHBvcnQiIGFuZAorCSAgIlNDU0kgZ2VuZXJpYyBzdXBwb3J0Ii4KKworY29uZmlnIFNIQVBFUgorCXRyaXN0YXRlICJUcmFmZmljIFNoYXBlciAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMgJiYgRVhQRVJJTUVOVEFMCisJLS0taGVscC0tLQorCSAgVGhlIHRyYWZmaWMgc2hhcGVyIGlzIGEgdmlydHVhbCBuZXR3b3JrIGRldmljZSB0aGF0IGFsbG93cyB5b3UgdG8KKwkgIGxpbWl0IHRoZSByYXRlIG9mIG91dGdvaW5nIGRhdGEgZmxvdyBvdmVyIHNvbWUgb3RoZXIgbmV0d29yayBkZXZpY2UuCisJICBUaGUgdHJhZmZpYyB0aGF0IHlvdSB3YW50IHRvIHNsb3cgZG93biBjYW4gdGhlbiBiZSByb3V0ZWQgdGhyb3VnaAorCSAgdGhlc2UgdmlydHVhbCBkZXZpY2VzLiBTZWUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9zaGFwZXIudHh0PiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCSAgQW4gYWx0ZXJuYXRpdmUgdG8gdGhpcyB0cmFmZmljIHNoYXBlciBpcyB0aGUgZXhwZXJpbWVudGFsCisJICBDbGFzcy1CYXNlZCBRdWV1ZWluZyAoQ0JRKSBzY2hlZHVsaW5nIHN1cHBvcnQgd2hpY2ggeW91IGdldCBpZiB5b3UKKwkgIHNheSBZIHRvICJRb1MgYW5kL29yIGZhaXIgcXVldWVpbmciIGFib3ZlLgorCisJICBUbyBzZXQgdXAgYW5kIGNvbmZpZ3VyZSBzaGFwZXIgZGV2aWNlcywgeW91IG5lZWQgdGhlIHNoYXBlY2ZnCisJICBwcm9ncmFtLCBhdmFpbGFibGUgZnJvbSA8ZnRwOi8vc2hhZG93LmNhYmkubmV0L3B1Yi9MaW51eC8+IGluIHRoZQorCSAgc2hhcGVyIHBhY2thZ2UuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNoYXBlci4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBORVRDT05TT0xFCisJdHJpc3RhdGUgIk5ldHdvcmsgY29uc29sZSBsb2dnaW5nIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORVRERVZJQ0VTICYmIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwlJZiB5b3Ugd2FudCB0byBsb2cga2VybmVsIG1lc3NhZ2VzIG92ZXIgdGhlIG5ldHdvcmssIGVuYWJsZSB0aGlzLgorCVNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0Y29uc29sZS50eHQ+IGZvciBkZXRhaWxzLgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9MSUNFTlNFLlNSQyBiL2RyaXZlcnMvbmV0L0xJQ0VOU0UuU1JDCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYzQ0ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9MSUNFTlNFLlNSQwpAQCAtMCwwICsxLDE1IEBACitDb2RlIGluIHRoaXMgZGlyZWN0b3J5IHdyaXR0ZW4gYXQgdGhlIElEQSBTdXBlcmNvbXB1dGluZyBSZXNlYXJjaCBDZW50ZXIKK2NhcnJpZXMgdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UuCisKKyAgICBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgICAgRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4gIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQKKyAgICBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKyAgICBJbiBhZGRpdGlvbiB0byB0aGUgZGlzY2xhaW1lcnMgaW4gdGhlIEdQTCwgU1JDIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55CisgICAgYW5kIGFsbCB3YXJyYW50aWVzLCBleHByZXNzZWQgb3IgaW1wbGllZCwgY29uY2VybmluZyB0aGUgZW5jbG9zZWQgc29mdHdhcmUuCisgICAgVGhpcyBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkIGF0IFNSQyBmb3IgdXNlIGluIGludGVybmFsIHJlc2VhcmNoLCBhbmQgdGhlCisgICAgaW50ZW50IGluIHNoYXJpbmcgdGhpcyBzb2Z0d2FyZSBpcyB0byBwcm9tb3RlIHRoZSBwcm9kdWN0aXZlIGludGVyY2hhbmdlCisgICAgb2YgaWRlYXMgdGhyb3VnaG91dCB0aGUgcmVzZWFyY2ggY29tbXVuaXR5LiAgIEFsbCBzb2Z0d2FyZSBpcyBmdXJuaXNoZWQKKyAgICBvbiBhbiAiYXMtaXMiIGJhc2lzLiAgTm8gZnVydGhlciB1cGRhdGVzIHRvIHRoaXMgc29mdHdhcmUgc2hvdWxkIGJlCisgICAgZXhwZWN0ZWQuICBBbHRob3VnaCB1cGRhdGVzIG1heSBvY2N1ciwgbm8gY29tbWl0bWVudCBleGlzdHMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMDJiMTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9NYWtlZmlsZQpAQCAtMCwwICsxLDE5NiBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IG5ldHdvcmsgKGV0aGVyY2FyZCkgZGV2aWNlIGRyaXZlcnMuCisjCisKK2lmZXEgKCQoQ09ORklHX0lTRE5fUFBQKSx5KQorICBvYmotJChDT05GSUdfSVNETikgKz0gc2xoYy5vCitlbmRpZgorCitvYmotJChDT05GSUdfRTEwMDApICs9IGUxMDAwLworb2JqLSQoQ09ORklHX0lCTV9FTUFDKSArPSBpYm1fZW1hYy8KK29iai0kKENPTkZJR19JWEdCKSArPSBpeGdiLworb2JqLSQoQ09ORklHX0JPTkRJTkcpICs9IGJvbmRpbmcvCitvYmotJChDT05GSUdfR0lBTkZBUikgKz0gZ2lhbmZhcl9kcml2ZXIubworCitnaWFuZmFyX2RyaXZlci1vYmpzIDo9IGdpYW5mYXIubyBnaWFuZmFyX2V0aHRvb2wubyBnaWFuZmFyX3BoeS5vCisKKyMKKyMgbGluayBvcmRlciBpbXBvcnRhbnQgaGVyZQorIworb2JqLSQoQ09ORklHX1BMSVApICs9IHBsaXAubworCitvYmotJChDT05GSUdfUk9BRFJVTk5FUikgKz0gcnJ1bm5lci5vCisKK29iai0kKENPTkZJR19IQVBQWU1FQUwpICs9IHN1bmhtZS5vCitvYmotJChDT05GSUdfU1VOTEFOQ0UpICs9IHN1bmxhbmNlLm8KK29iai0kKENPTkZJR19TVU5RRSkgKz0gc3VucWUubworb2JqLSQoQ09ORklHX1NVTkJNQUMpICs9IHN1bmJtYWMubworb2JqLSQoQ09ORklHX01ZUklfU0JVUykgKz0gbXlyaV9zYnVzLm8KK29iai0kKENPTkZJR19TVU5HRU0pICs9IHN1bmdlbS5vIHN1bmdlbV9waHkubworCitvYmotJChDT05GSUdfTUFDRSkgKz0gbWFjZS5vCitvYmotJChDT05GSUdfQk1BQykgKz0gYm1hYy5vCisKK29iai0kKENPTkZJR19PQUtORVQpICs9IG9ha25ldC5vIDgzOTAubworCitvYmotJChDT05GSUdfREdSUykgKz0gZGdycy5vCitvYmotJChDT05GSUdfVk9SVEVYKSArPSAzYzU5eC5vCitvYmotJChDT05GSUdfVFlQSE9PTikgKz0gdHlwaG9vbi5vCitvYmotJChDT05GSUdfTkUyS19QQ0kpICs9IG5lMmstcGNpLm8gODM5MC5vCitvYmotJChDT05GSUdfUENORVQzMikgKz0gcGNuZXQzMi5vCitvYmotJChDT05GSUdfRUVQUk8xMDApICs9IGVlcHJvMTAwLm8KK29iai0kKENPTkZJR19FMTAwKSArPSBlMTAwLm8KK29iai0kKENPTkZJR19UTEFOKSArPSB0bGFuLm8KK29iai0kKENPTkZJR19FUElDMTAwKSArPSBlcGljMTAwLm8KK29iai0kKENPTkZJR19TSVM5MDApICs9IHNpczkwMC5vCitvYmotJChDT05GSUdfWUVMTE9XRklOKSArPSB5ZWxsb3dmaW4ubworb2JqLSQoQ09ORklHX0FDRU5JQykgKz0gYWNlbmljLm8KK29iai0kKENPTkZJR19JU0VSSUVTX1ZFVEgpICs9IGlzZXJpZXNfdmV0aC5vCitvYmotJChDT05GSUdfTkFUU0VNSSkgKz0gbmF0c2VtaS5vCitvYmotJChDT05GSUdfTlM4MzgyMCkgKz0gbnM4MzgyMC5vCitvYmotJChDT05GSUdfU1ROSUMpICs9IHN0bmljLm8gODM5MC5vCitvYmotJChDT05GSUdfRkVBTE5YKSArPSBmZWFsbngubworb2JqLSQoQ09ORklHX1RJR09OMykgKz0gdGczLm8KK29iai0kKENPTkZJR19UQzM1ODE1KSArPSB0YzM1ODE1Lm8KK29iai0kKENPTkZJR19TSzk4TElOKSArPSBzazk4bGluLworb2JqLSQoQ09ORklHX1NLRlApICs9IHNrZnAvCitvYmotJChDT05GSUdfVklBX1JISU5FKSArPSB2aWEtcmhpbmUubworb2JqLSQoQ09ORklHX1ZJQV9WRUxPQ0lUWSkgKz0gdmlhLXZlbG9jaXR5Lm8KK29iai0kKENPTkZJR19BREFQVEVDX1NUQVJGSVJFKSArPSBzdGFyZmlyZS5vCisKKyMKKyMgZW5kIGxpbmsgb3JkZXIgc2VjdGlvbgorIworCitvYmotJChDT05GSUdfTUlJKSArPSBtaWkubworCitvYmotJChDT05GSUdfU1VOREFOQ0UpICs9IHN1bmRhbmNlLm8KK29iai0kKENPTkZJR19IQU1BQ0hJKSArPSBoYW1hY2hpLm8KK29iai0kKENPTkZJR19ORVQpICs9IFNwYWNlLm8gbG9vcGJhY2subworb2JqLSQoQ09ORklHX1NFRVE4MDA1KSArPSBzZWVxODAwNS5vCitvYmotJChDT05GSUdfTkVUX1NCMTAwMCkgKz0gc2IxMDAwLm8KK29iai0kKENPTkZJR19NQUM4MzkwKSArPSBtYWM4MzkwLm8gODM5MC5vCitvYmotJChDT05GSUdfQVBORSkgKz0gYXBuZS5vIDgzOTAubworb2JqLSQoQ09ORklHX1BDTUNJQV9QQ05FVCkgKz0gODM5MC5vCitvYmotJChDT05GSUdfU0hBUEVSKSArPSBzaGFwZXIubworb2JqLSQoQ09ORklHX1NLX0cxNikgKz0gc2tfZzE2Lm8KK29iai0kKENPTkZJR19IUDEwMCkgKz0gaHAxMDAubworb2JqLSQoQ09ORklHX1NNQzkxOTQpICs9IHNtYzkxOTQubworb2JqLSQoQ09ORklHX0ZFQykgKz0gZmVjLm8KK29iai0kKENPTkZJR182ODM2MF9FTkVUKSArPSA2ODM2MGVuZXQubworb2JqLSQoQ09ORklHX0FSTV9FVEhFUkgpICs9IDgzOTAubworb2JqLSQoQ09ORklHX1dEODB4MykgKz0gd2QubyA4MzkwLm8KK29iai0kKENPTkZJR19FTDIpICs9IDNjNTAzLm8gODM5MC5vCitvYmotJChDT05GSUdfTkUyMDAwKSArPSBuZS5vIDgzOTAubworb2JqLSQoQ09ORklHX05FMl9NQ0EpICs9IG5lMi5vIDgzOTAubworb2JqLSQoQ09ORklHX0hQTEFOKSArPSBocC5vIDgzOTAubworb2JqLSQoQ09ORklHX0hQTEFOX1BMVVMpICs9IGhwLXBsdXMubyA4MzkwLm8KK29iai0kKENPTkZJR19VTFRSQSkgKz0gc21jLXVsdHJhLm8gODM5MC5vCitvYmotJChDT05GSUdfVUxUUkFNQ0EpICs9IHNtYy1tY2EubyA4MzkwLm8KK29iai0kKENPTkZJR19VTFRSQTMyKSArPSBzbWMtdWx0cmEzMi5vIDgzOTAubworb2JqLSQoQ09ORklHX0UyMTAwKSArPSBlMjEwMC5vIDgzOTAubworb2JqLSQoQ09ORklHX0VTMzIxMCkgKz0gZXMzMjEwLm8gODM5MC5vCitvYmotJChDT05GSUdfTE5FMzkwKSArPSBsbmUzOTAubyA4MzkwLm8KK29iai0kKENPTkZJR19ORTMyMTApICs9IG5lMzIxMC5vIDgzOTAubworb2JqLSQoQ09ORklHX05FVF9TQjEyNTBfTUFDKSArPSBzYjEyNTAtbWFjLm8KK29iai0kKENPTkZJR19CNDQpICs9IGI0NC5vCitvYmotJChDT05GSUdfRk9SQ0VERVRIKSArPSBmb3JjZWRldGgubworb2JqLSQoQ09ORklHX05FX0g4MzAwKSArPSBuZS1oODMwMC5vIDgzOTAubworCitvYmotJChDT05GSUdfTVY2NDNYWF9FVEgpICs9IG12NjQzeHhfZXRoLm8KKworb2JqLSQoQ09ORklHX1BQUCkgKz0gcHBwX2dlbmVyaWMubyBzbGhjLm8KK29iai0kKENPTkZJR19QUFBfQVNZTkMpICs9IHBwcF9hc3luYy5vCitvYmotJChDT05GSUdfUFBQX1NZTkNfVFRZKSArPSBwcHBfc3luY3R0eS5vCitvYmotJChDT05GSUdfUFBQX0RFRkxBVEUpICs9IHBwcF9kZWZsYXRlLm8KK29iai0kKENPTkZJR19QUFBfQlNEQ09NUCkgKz0gYnNkX2NvbXAubworb2JqLSQoQ09ORklHX1BQUE9FKSArPSBwcHBveC5vIHBwcG9lLm8KKworb2JqLSQoQ09ORklHX1NMSVApICs9IHNsaXAubworaWZlcSAoJChDT05GSUdfU0xJUF9DT01QUkVTU0VEKSx5KQorICBvYmotJChDT05GSUdfU0xJUCkgKz0gc2xoYy5vCitlbmRpZgorCitvYmotJChDT05GSUdfRFVNTVkpICs9IGR1bW15Lm8KK29iai0kKENPTkZJR19ERTYwMCkgKz0gZGU2MDAubworb2JqLSQoQ09ORklHX0RFNjIwKSArPSBkZTYyMC5vCitvYmotJChDT05GSUdfTEFOQ0UpICs9IGxhbmNlLm8KK29iai0kKENPTkZJR19TVU4zXzgyNTg2KSArPSBzdW4zXzgyNTg2Lm8KK29iai0kKENPTkZJR19TVU4zTEFOQ0UpICs9IHN1bjNsYW5jZS5vCitvYmotJChDT05GSUdfREVGWFgpICs9IGRlZnh4Lm8KK29iai0kKENPTkZJR19TR0lTRUVRKSArPSBzZ2lzZWVxLm8KK29iai0kKENPTkZJR19TR0lfTzJNQUNFX0VUSCkgKz0gbWV0aC5vCitvYmotJChDT05GSUdfQVQxNzAwKSArPSBhdDE3MDAubworb2JqLSQoQ09ORklHX0ZNVjE4WCkgKz0gZm12MTh4Lm8KK29iai0kKENPTkZJR19FTDEpICs9IDNjNTAxLm8KK29iai0kKENPTkZJR19FTDE2KSArPSAzYzUwNy5vCitvYmotJChDT05GSUdfRUxNQykgKz0gM2M1MjMubworb2JqLSQoQ09ORklHX1NLTUMpICs9IHNrX21jYS5vCitvYmotJChDT05GSUdfSUJNTEFOQSkgKz0gaWJtbGFuYS5vCitvYmotJChDT05GSUdfRUxNQ19JSSkgKz0gM2M1Mjcubworb2JqLSQoQ09ORklHX0VMMykgKz0gM2M1MDkubworb2JqLSQoQ09ORklHXzNDNTE1KSArPSAzYzUxNS5vCitvYmotJChDT05GSUdfRUVYUFJFU1MpICs9IGVleHByZXNzLm8KK29iai0kKENPTkZJR19FRVhQUkVTU19QUk8pICs9IGVlcHJvLm8KK29iai0kKENPTkZJR184MTM5Q1ApICs9IDgxMzljcC5vCitvYmotJChDT05GSUdfODEzOVRPTykgKz0gODEzOXRvby5vCitvYmotJChDT05GSUdfWk5FVCkgKz0gem5ldC5vCitvYmotJChDT05GSUdfTEFOX1NBQTk3MzApICs9IHNhYTk3MzAubworb2JqLSQoQ09ORklHX0RFUENBKSArPSBkZXBjYS5vCitvYmotJChDT05GSUdfRVdSSzMpICs9IGV3cmszLm8KK29iai0kKENPTkZJR19BVFApICs9IGF0cC5vCitvYmotJChDT05GSUdfTkk1MDEwKSArPSBuaTUwMTAubworb2JqLSQoQ09ORklHX05JNTIpICs9IG5pNTIubworb2JqLSQoQ09ORklHX05JNjUpICs9IG5pNjUubworb2JqLSQoQ09ORklHX0VMUExVUykgKz0gM2M1MDUubworb2JqLSQoQ09ORklHX0FDMzIwMCkgKz0gYWMzMjAwLm8gODM5MC5vCitvYmotJChDT05GSUdfQVBSSUNPVCkgKz0gODI1OTYubworb2JqLSQoQ09ORklHX0xBU0lfODI1OTYpICs9IGxhc2lfODI1OTYubworb2JqLSQoQ09ORklHX01WTUUxNnhfTkVUKSArPSA4MjU5Ni5vCitvYmotJChDT05GSUdfQlZNRTYwMDBfTkVUKSArPSA4MjU5Ni5vCisKKyMgVGhpcyBpcyBhbHNvIGEgODI1OTYgYW5kIHNob3VsZCBwcm9iYWJseSBiZSBtZXJnZWQKK29iai0kKENPTkZJR19MUDQ4NkUpICs9IGxwNDg2ZS5vCisKK29iai0kKENPTkZJR19FVEgxNkkpICs9IGV0aDE2aS5vCitvYmotJChDT05GSUdfWk9SUk84MzkwKSArPSB6b3JybzgzOTAubyA4MzkwLm8KK29iai0kKENPTkZJR19IUExBTkNFKSArPSBocGxhbmNlLm8gNzk5MC5vCitvYmotJChDT05GSUdfTVZNRTE0N19ORVQpICs9IG12bWUxNDcubyA3OTkwLm8KK29iai0kKENPTkZJR19FUVVBTElaRVIpICs9IGVxbC5vCitvYmotJChDT05GSUdfTUlQU19KQVpaX1NPTklDKSArPSBqYXp6c29uaWMubworb2JqLSQoQ09ORklHX01JUFNfR1Q5NjEwMEVUSCkgKz0gZ3Q5NjEwMGV0aC5vCitvYmotJChDT05GSUdfTUlQU19BVTFYMDBfRU5FVCkgKz0gYXUxMDAwX2V0aC5vCitvYmotJChDT05GSUdfU0dJX0lPQzNfRVRIKSArPSBpb2MzLWV0aC5vCitvYmotJChDT05GSUdfREVDTEFOQ0UpICs9IGRlY2xhbmNlLm8KK29iai0kKENPTkZJR19BVEFSSUxBTkNFKSArPSBhdGFyaWxhbmNlLm8KK29iai0kKENPTkZJR19BVEFSSV9CSU9ORVQpICs9IGF0YXJpX2Jpb25ldC5vCitvYmotJChDT05GSUdfQVRBUklfUEFNU05FVCkgKz0gYXRhcmlfcGFtc25ldC5vCitvYmotJChDT05GSUdfQTIwNjUpICs9IGEyMDY1Lm8KK29iai0kKENPTkZJR19IWURSQSkgKz0gaHlkcmEubyA4MzkwLm8KK29iai0kKENPTkZJR19BUklBRE5FKSArPSBhcmlhZG5lLm8KK29iai0kKENPTkZJR19DUzg5eDApICs9IGNzODl4MC5vCitvYmotJChDT05GSUdfTUFDU09OSUMpICs9IG1hY3NvbmljLm8KK29iai0kKENPTkZJR19NQUNNQUNFKSArPSBtYWNtYWNlLm8KK29iai0kKENPTkZJR19NQUM4OXgwKSArPSBtYWM4OXgwLm8KK29iai0kKENPTkZJR19UVU4pICs9IHR1bi5vCitvYmotJChDT05GSUdfREwySykgKz0gZGwyay5vCitvYmotJChDT05GSUdfUjgxNjkpICs9IHI4MTY5Lm8KK29iai0kKENPTkZJR19BTUQ4MTExX0VUSCkgKz0gYW1kODExMWUubworb2JqLSQoQ09ORklHX0lCTVZFVEgpICs9IGlibXZldGgubworb2JqLSQoQ09ORklHX1MySU8pICs9IHMyaW8ubworb2JqLSQoQ09ORklHX1NNQzkxWCkgKz0gc21jOTF4Lm8KK29iai0kKENPTkZJR19GRUNfOFhYKSArPSBmZWNfOHh4LworCitvYmotJChDT05GSUdfQVJNKSArPSBhcm0vCitvYmotJChDT05GSUdfREVWX0FQUExFVEFMSykgKz0gYXBwbGV0YWxrLworb2JqLSQoQ09ORklHX1RSKSArPSB0b2tlbnJpbmcvCitvYmotJChDT05GSUdfV0FOKSArPSB3YW4vCitvYmotJChDT05GSUdfQVJDTkVUKSArPSBhcmNuZXQvCitvYmotJChDT05GSUdfTkVUX1BDTUNJQSkgKz0gcGNtY2lhLworb2JqLSQoQ09ORklHX05FVF9XSVJFTEVTUykgKz0gd2lyZWxlc3MvCitvYmotJChDT05GSUdfTkVUX1RVTElQKSArPSB0dWxpcC8KK29iai0kKENPTkZJR19IQU1SQURJTykgKz0gaGFtcmFkaW8vCitvYmotJChDT05GSUdfSVJEQSkgKz0gaXJkYS8KK29iai0kKENPTkZJR19FVFJBWF9FVEhFUk5FVCkgKz0gY3Jpcy8KKworb2JqLSQoQ09ORklHX05FVENPTlNPTEUpICs9IG5ldGNvbnNvbGUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvU3BhY2UuYyBiL2RyaXZlcnMvbmV0L1NwYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1MTkzNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L1NwYWNlLmMKQEAgLTAsMCArMSw0MTIgQEAKKy8qCisgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKKyAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKKyAqCQlpbnRlcmZhY2UgYXMgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4KKyAqCisgKgkJSG9sZHMgaW5pdGlhbCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBkZXZpY2VzLgorICoKKyAqIFZlcnNpb246CUAoIylTcGFjZS5jCTEuMC43CTA4LzEyLzkzCisgKgorICogQXV0aG9yczoJUm9zcyBCaXJvLCA8YmlyN0BsZWxhbmQuU3RhbmZvcmQuRWR1PgorICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoJCURvbmFsZCBKLiBCZWNrZXIsIDxiZWNrZXJAc2N5bGQuY29tPgorICoKKyAqIENoYW5nZWxvZzoKKyAqCQlTdGVwaGVuIEhlbW1pbmdlciAoMDkvMjAwMykKKyAqCQktIGdldCByaWQgb2YgcHJlLWxpbmtlZCBkZXYgbGlzdCwgZHluYW1pYyBkZXZpY2UgYWxsb2NhdGlvbgorICoJCVBhdWwgR29ydG1ha2VyICgwMy8yMDAyKQorICoJCS0gc3RydWN0IGluaXQgY2xlYW51cCwgZW5hYmxlIG11bHRpcGxlIElTQSBhdXRvcHJvYmVzLgorICoJCUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPiAtIDA5LzE5OTkKKyAqCQktIGZpeCBzYm5pOiBzL2RldmljZS9uZXRfZGV2aWNlLworICoJCVBhdWwgR29ydG1ha2VyICgwNi85OCk6IAorICoJCSAtIHNvcnQgcHJvYmVzIGluIGEgc2FuZSB3YXksIG1ha2Ugc3VyZSBhbGwgKHNhZmUpIHByb2JlcworICoJCSAgIGdldCBydW4gb25jZSAmIGZhaWxlZCBhdXRvcHJvYmVzIGRvbid0IGF1dG9wcm9iZSBhZ2Fpbi4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdHJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvZGl2ZXJ0Lmg+CisKKy8qIEEgdW5pZmllZCBldGhlcm5ldCBkZXZpY2UgcHJvYmUuICBUaGlzIGlzIHRoZSBlYXNpZXN0IHdheSB0byBoYXZlIGV2ZXJ5CisgICBldGhlcm5ldCBhZGFwdG9yIGhhdmUgdGhlIG5hbWUgImV0aFswMTIzLi4uXSIuCisgICAqLworCitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKm5lMl9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmhwMTAwX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqdWx0cmFfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICp1bHRyYTMyX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqd2RfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICplbDJfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpuZV9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmhwX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqaHBfcGx1c19wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmV4cHJlc3NfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICplZXByb19wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmF0MTcwMF9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmZtdjE4eF9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmV0aDE2aV9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmk4MjU5Nl9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmV3cmszX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqZWwxX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqd2F2ZWxhbl9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmFybGFuX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqZWwxNl9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmVsbWNfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpza21jYV9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmVscGx1c19wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmFjMzIwMF9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmVzX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqbG5lMzkwX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqZTIxMDBfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpuaTUwMTBfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpuaTUyX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqbmk2NV9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKnNvbmljX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqU0tfaW5pdChpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKnNlZXE4MDA1X3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqc21jX2luaXQoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICphdGFyaWxhbmNlX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqc3VuM2xhbmNlX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqc3VuM184MjU4Nl9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmFwbmVfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpiaW9uZXRfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpwYW1zbmV0X3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqY3M4OXgwX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqaHBsYW5jZV9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmJhZ2V0bGFuY2VfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICptdm1lMTQ3bGFuY2VfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICp0YzUxNV9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmxhbmNlX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqbWFjZV9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKm1hY3NvbmljX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqbWFjODM5MF9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKm1hYzg5eDBfcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICptYzMyX3Byb2JlKGludCB1bml0KTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqY29wc19wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmx0cGNfcHJvYmUodm9pZCk7CisgIAorLyogRGV0YWNoYWJsZSBkZXZpY2VzICgicG9ja2V0IGFkYXB0b3JzIikgKi8KK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqZGU2MjBfcHJvYmUoaW50IHVuaXQpOworCisvKiBGaWJyZSBDaGFubmVsIGFkYXB0ZXJzICovCitleHRlcm4gaW50IGlwaDU1MjZfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIFNCTkkgYWRhcHRlcnMgKi8KK2V4dGVybiBpbnQgc2JuaV9wcm9iZShpbnQgdW5pdCk7CisKK3N0cnVjdCBkZXZwcm9iZTIgeworCXN0cnVjdCBuZXRfZGV2aWNlICooKnByb2JlKShpbnQgdW5pdCk7CisJaW50IHN0YXR1czsJLyogbm9uLXplcm8gaWYgYXV0b3Byb2JlIGhhcyBmYWlsZWQgKi8KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHByb2JlX2xpc3QyKGludCB1bml0LCBzdHJ1Y3QgZGV2cHJvYmUyICpwLCBpbnQgYXV0b3Byb2JlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJZm9yICg7IHAtPnByb2JlOyBwKyspIHsKKwkJaWYgKGF1dG9wcm9iZSAmJiBwLT5zdGF0dXMpCisJCQljb250aW51ZTsKKwkJZGV2ID0gcC0+cHJvYmUodW5pdCk7CisJCWlmICghSVNfRVJSKGRldikpCisJCQlyZXR1cm4gMDsKKwkJaWYgKGF1dG9wcm9iZSkKKwkJCXAtPnN0YXR1cyA9IFBUUl9FUlIoZGV2KTsKKwl9CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qCisgKiBUaGlzIGlzIGEgYml0IG9mIGFuIGFydGlmaWNpYWwgc2VwYXJhdGlvbiBhcyB0aGVyZSBhcmUgUENJIGRyaXZlcnMKKyAqIHRoYXQgYWxzbyBwcm9iZSBmb3IgRUlTQSBjYXJkcyAoaW4gdGhlIFBDSSBncm91cCkgYW5kIHRoZXJlIGFyZSBJU0EKKyAqIGRyaXZlcnMgdGhhdCBwcm9iZSBmb3IgRUlTQSBjYXJkcyAoaW4gdGhlIElTQSBncm91cCkuICBUaGVzZSBhcmUgdGhlCisgKiBsZWdhY3kgRUlTQSBvbmx5IGRyaXZlciBwcm9iZXMsIGFuZCBhbHNvIHRoZSBsZWdhY3kgUENJIHByb2JlcworICovCisKK3N0YXRpYyBzdHJ1Y3QgZGV2cHJvYmUyIGVpc2FfcHJvYmVzW10gX19pbml0ZGF0YSA9IHsKKyNpZmRlZiBDT05GSUdfVUxUUkEzMiAKKwl7dWx0cmEzMl9wcm9iZSwgMH0sCQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FDMzIwMAkKKwl7YWMzMjAwX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FUzMyMTAKKwl7ZXNfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0xORTM5MAorCXtsbmUzOTBfcHJvYmUsIDB9LAorI2VuZGlmCisJe05VTEwsIDB9LAorfTsKKworc3RhdGljIHN0cnVjdCBkZXZwcm9iZTIgbWNhX3Byb2Jlc1tdIF9faW5pdGRhdGEgPSB7CisjaWZkZWYgQ09ORklHX05FMl9NQ0EKKwl7bmUyX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FTE1DCQkvKiAzYzUyMyAqLworCXtlbG1jX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FTE1DX0lJCQkvKiAzYzUyNyAqLworCXttYzMyX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TS01DICAgICAgICAgICAgICAvKiBTS25ldCBNaWNyb2NoYW5uZWwgKi8KKyAgICAgICAge3NrbWNhX3Byb2JlLCAwfSwKKyNlbmRpZgorCXtOVUxMLCAwfSwKK307CisKKy8qCisgKiBJU0EgcHJvYmVzIHRoYXQgdG91Y2ggYWRkcmVzc2VzIDwgMHg0MDAgKGluY2x1ZGluZyB0aG9zZSB0aGF0IGFsc28KKyAqIGxvb2sgZm9yIEVJU0EvUENJL01DQSBjYXJkcyBpbiBhZGRpdGlvbiB0byBJU0EgY2FyZHMpLgorICovCitzdGF0aWMgc3RydWN0IGRldnByb2JlMiBpc2FfcHJvYmVzW10gX19pbml0ZGF0YSA9IHsKKyNpZmRlZiBDT05GSUdfSFAxMDAgCQkvKiBJU0EsIEVJU0EgJiBQQ0kgKi8KKwl7aHAxMDBfcHJvYmUsIDB9LAorI2VuZGlmCQorI2lmZGVmIENPTkZJR18zQzUxNQorCXt0YzUxNV9wcm9iZSwgMH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVUxUUkEgCisJe3VsdHJhX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19XRDgweDMgCisJe3dkX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FTDIgCQkvKiAzYzUwMyAqLworCXtlbDJfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0hQTEFOCisJe2hwX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19IUExBTl9QTFVTCisJe2hwX3BsdXNfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0UyMTAwCQkvKiBDYWJsZXRyb24gRTIxeHggc2VyaWVzLiAqLworCXtlMjEwMF9wcm9iZSwgMH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19ORTIwMDApIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19ORV9IODMwMCkgIC8qIElTQSAodXNlIG5lMmstcGNpIGZvciBQQ0kgY2FyZHMpICovCisJe25lX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19MQU5DRQkJLyogSVNBL1ZMQiAodXNlIHBjbmV0MzIgZm9yIFBDSSBjYXJkcykgKi8KKwl7bGFuY2VfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NNQzkxOTQKKwl7c21jX2luaXQsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NFRVE4MDA1IAorCXtzZWVxODAwNV9wcm9iZSwgMH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ1M4OXgwCisgCXtjczg5eDBfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FUMTcwMAorCXthdDE3MDBfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZNVjE4WAkJLyogRnVqaXRzdSBGTVYtMTgxLzE4MiAqLworCXtmbXYxOHhfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0VUSDE2SQorCXtldGgxNmlfcHJvYmUsIDB9LAkvKiBJQ0wgRXRoZXJUZWFtIDE2aS8zMiAqLworI2VuZGlmCisjaWZkZWYgQ09ORklHX0VFWFBSRVNTCQkvKiBJbnRlbCBFdGhlckV4cHJlc3MgKi8KKwl7ZXhwcmVzc19wcm9iZSwgMH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRUVYUFJFU1NfUFJPCS8qIEludGVsIEV0aGVyRXhwcmVzcyBQcm8vMTAgKi8KKwl7ZWVwcm9fcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0VXUkszICAgICAgICAgICAgIC8qIERFQyBFdGhlcldPUktTIDMgKi8KKyAgICAJe2V3cmszX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FQUklDT1QpIHx8IGRlZmluZWQoQ09ORklHX01WTUUxNnhfTkVUKSB8fCBkZWZpbmVkKENPTkZJR19CVk1FNjAwMF9ORVQpCS8qIEludGVsIEk4MjU5NiAqLworCXtpODI1OTZfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0VMMQkJLyogM2M1MDEgKi8KKwl7ZWwxX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19XQVZFTEFOCQkvKiBXYXZlTEFOICovCisJe3dhdmVsYW5fcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSTEFOCQkvKiBBaXJvbmV0ICovCisJe2FybGFuX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FTDE2CQkvKiAzYzUwNyAqLworCXtlbDE2X3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FTFBMVVMJCS8qIDNjNTA1ICovCisJe2VscGx1c19wcm9iZSwgMH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0tfRzE2CisJe1NLX2luaXQsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX05JNTAxMAorCXtuaTUwMTBfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX05JNTIKKwl7bmk1Ml9wcm9iZSwgMH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTkk2NQorCXtuaTY1X3Byb2JlLCAwfSwKKyNlbmRpZgorCXtOVUxMLCAwfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGV2cHJvYmUyIHBhcnBvcnRfcHJvYmVzW10gX19pbml0ZGF0YSA9IHsKKyNpZmRlZiBDT05GSUdfREU2MjAJCS8qIEQtTGluayBERS02MjAgYWRhcHRlciAqLworCXtkZTYyMF9wcm9iZSwgMH0sCisjZW5kaWYKKwl7TlVMTCwgMH0sCit9OworCitzdGF0aWMgc3RydWN0IGRldnByb2JlMiBtNjhrX3Byb2Jlc1tdIF9faW5pdGRhdGEgPSB7CisjaWZkZWYgQ09ORklHX0FUQVJJTEFOQ0UJLyogTGFuY2UtYmFzZWQgQXRhcmkgZXRoZXJuZXQgYm9hcmRzICovCisJe2F0YXJpbGFuY2VfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NVTjNMQU5DRSAgICAgICAgIC8qIHN1bjMgb25ib2FyZCBMYW5jZSBjaGlwICovCisJe3N1bjNsYW5jZV9wcm9iZSwgMH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1VOM184MjU4NiAgICAgICAgLyogc3VuMyBvbmJvYXJkIEludGVsIDgyNTg2IGNoaXAgKi8KKwl7c3VuM184MjU4Nl9wcm9iZSwgMH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVBORQkJLyogQTEyMDAgUENNQ0lBIE5FMjAwMCAqLworCXthcG5lX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BVEFSSV9CSU9ORVQJLyogQXRhcmkgQmlvbmV0IEV0aGVybmV0IGJvYXJkICovCisJe2Jpb25ldF9wcm9iZSwgMH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVRBUklfUEFNU05FVAkvKiBBdGFyaSBQQU1zTmV0IEV0aGVybmV0IGJvYXJkICovCisJe3BhbXNuZXRfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX01WTUUxNDdfTkVUCS8qIE1WTUUxNDcgaW50ZXJuYWwgRXRoZXJuZXQgKi8KKwl7bXZtZTE0N2xhbmNlX3Byb2JlLCAwfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NQUNNQUNFCQkvKiBNYWMgNjhrIFF1YWRyYSBBViBidWlsdGluIEV0aGVybmV0ICovCisJe21hY2VfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX01BQ1NPTklDCQkvKiBNYWMgU09OSUMtYmFzZWQgRXRoZXJuZXQgb2YgYWxsIHNvcnRzICovIAorCXttYWNzb25pY19wcm9iZSwgMH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTUFDODM5MCAgICAgICAgICAgLyogTnVCdXMgTlM4MzkwLWJhc2VkIGNhcmRzICovCisJe21hYzgzOTBfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX01BQzg5eDAKKyAJe21hYzg5eDBfcHJvYmUsIDB9LAorI2VuZGlmCisJe05VTEwsIDB9LAorfTsKKworLyoKKyAqIFVuaWZpZWQgZXRoZXJuZXQgZGV2aWNlIHByb2JlLCBzZWdtZW50ZWQgcGVyIGFyY2hpdGVjdHVyZSBhbmQKKyAqIHBlciBidXMgaW50ZXJmYWNlLiBUaGlzIGRyaXZlcyB0aGUgbGVnYWN5IGRldmljZXMgb25seSBmb3Igbm93LgorICovCisgCitzdGF0aWMgdm9pZCBfX2luaXQgZXRoaWZfcHJvYmUyKGludCB1bml0KQoreworCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyID0gbmV0ZGV2X2Jvb3RfYmFzZSgiZXRoIiwgdW5pdCk7CisKKwlpZiAoYmFzZV9hZGRyID09IDEpCisJCXJldHVybjsKKworCSh2b2lkKSgJcHJvYmVfbGlzdDIodW5pdCwgbTY4a19wcm9iZXMsIGJhc2VfYWRkciA9PSAwKSAmJgorCQlwcm9iZV9saXN0Mih1bml0LCBlaXNhX3Byb2JlcywgYmFzZV9hZGRyID09IDApICYmCisJCXByb2JlX2xpc3QyKHVuaXQsIG1jYV9wcm9iZXMsIGJhc2VfYWRkciA9PSAwKSAmJgorCQlwcm9iZV9saXN0Mih1bml0LCBpc2FfcHJvYmVzLCBiYXNlX2FkZHIgPT0gMCkgJiYKKwkJcHJvYmVfbGlzdDIodW5pdCwgcGFycG9ydF9wcm9iZXMsIGJhc2VfYWRkciA9PSAwKSk7Cit9CisKKyNpZmRlZiBDT05GSUdfVFIKKy8qIFRva2VuLXJpbmcgZGV2aWNlIHByb2JlICovCitleHRlcm4gaW50IGlibXRyX3Byb2JlX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKik7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKnNrX2lzYV9wcm9iZShpbnQgdW5pdCk7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKnByb3Rlb25fcHJvYmUoaW50IHVuaXQpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpzbWN0cl9wcm9iZShpbnQgdW5pdCk7CisKK3N0YXRpYyBzdHJ1Y3QgZGV2cHJvYmUyIHRyX3Byb2JlczJbXSBfX2luaXRkYXRhID0geworI2lmZGVmIENPTkZJR19TS0lTQQorCXtza19pc2FfcHJvYmUsIDB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1BST1RFT04KKwl7cHJvdGVvbl9wcm9iZSwgMH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU01DVFIKKwl7c21jdHJfcHJvYmUsIDB9LAorI2VuZGlmCisJe05VTEwsIDB9LAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgdHJpZl9wcm9iZShpbnQgdW5pdCkKK3sKKwlpbnQgZXJyID0gLUVOT0RFVjsKKyNpZmRlZiBDT05GSUdfSUJNVFIKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfdHJkZXYoMCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJc3ByaW50ZihkZXYtPm5hbWUsICJ0ciVkIiwgdW5pdCk7CisJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwllcnIgPSBpYm10cl9wcm9iZV9jYXJkKGRldik7CisJaWYgKGVycikKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKyNlbmRpZgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0cmlmX3Byb2JlMihpbnQgdW5pdCkKK3sKKwl1bnNpZ25lZCBsb25nIGJhc2VfYWRkciA9IG5ldGRldl9ib290X2Jhc2UoInRyIiwgdW5pdCk7CisKKwlpZiAoYmFzZV9hZGRyID09IDEpCisJCXJldHVybjsKKwlwcm9iZV9saXN0Mih1bml0LCB0cl9wcm9iZXMyLCBiYXNlX2FkZHIgPT0gMCk7Cit9CisjZW5kaWYKKworCQorLyoKKyAqCVRoZSBsb29wYmFjayBkZXZpY2UgaXMgZ2xvYmFsIHNvIGl0IGNhbiBiZSBkaXJlY3RseSByZWZlcmVuY2VkCisgKglieSB0aGUgbmV0d29yayBjb2RlLiBBbHNvLCBpdCBtdXN0IGJlIGZpcnN0IG9uIGRldmljZSBsaXN0LgorICovCitleHRlcm4gaW50IGxvb3BiYWNrX2luaXQodm9pZCk7CisKKy8qICBTdGF0aWNhbGx5IGNvbmZpZ3VyZWQgZHJpdmVycyAtLSBvcmRlciBtYXR0ZXJzIGhlcmUuICovCitzdGF0aWMgaW50IF9faW5pdCBuZXRfb2xkZGV2c19pbml0KHZvaWQpCit7CisJaW50IG51bTsKKworCWlmIChsb29wYmFja19pbml0KCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJOZXR3b3JrIGxvb3BiYWNrIGRldmljZSBzZXR1cCBmYWlsZWRcbiIpOworCX0KKworCQorI2lmZGVmIENPTkZJR19TQk5JCisJZm9yIChudW0gPSAwOyBudW0gPCA4OyArK251bSkKKwkJc2JuaV9wcm9iZShudW0pOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1RSCisJZm9yIChudW0gPSAwOyBudW0gPCA4OyArK251bSkKKwkJaWYgKCF0cmlmX3Byb2JlKG51bSkpCisJCQl0cmlmX3Byb2JlMihudW0pOworI2VuZGlmCisJZm9yIChudW0gPSAwOyBudW0gPCA4OyArK251bSkKKwkJZXRoaWZfcHJvYmUyKG51bSk7CisKKyNpZmRlZiBDT05GSUdfQ09QUworCWNvcHNfcHJvYmUoMCk7CisJY29wc19wcm9iZSgxKTsKKwljb3BzX3Byb2JlKDIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0xUUEMKKwlsdHBjX3Byb2JlKCk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitkZXZpY2VfaW5pdGNhbGwobmV0X29sZGRldnNfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hMjA2NS5jIGIvZHJpdmVycy9uZXQvYTIwNjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTUzOGE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYTIwNjUuYwpAQCAtMCwwICsxLDg0MyBAQAorLyoKKyAqIEFtaWdhIExpbnV4LzY4ayBBMjA2NSBFdGhlcm5ldCBEcml2ZXIKKyAqCisgKiAoQykgQ29weXJpZ2h0IDE5OTUtMjAwMyBieSBHZWVydCBVeXR0ZXJob2V2ZW4gPGdlZXJ0QGxpbnV4LW02OGsub3JnPgorICoKKyAqIEZpeGVzIGFuZCB0aXBzIGJ5OgorICoJLSBKYW5vcyBGYXJrYXMgKENIRVhVTUBzcGFydGEuYmFua2kuaHUpCisgKgktIEplcyBEZWduIFNvZXJlbnNlbiAoamRzQGtvbS5hdWMuZGspCisgKgktIE1hdHQgRG9tc2NoIChNYXR0X0RvbXNjaEBkZWxsLmNvbSkKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGJhc2VkIG9uCisgKgorICoJYXJpYWRuZS4/OglBbWlnYSBMaW51eC82OGsgQXJpYWRuZSBFdGhlcm5ldCBEcml2ZXIKKyAqCQkJKEMpIENvcHlyaWdodCAxOTk1IGJ5IEdlZXJ0IFV5dHRlcmhvZXZlbiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXRlciBEZSBTY2hyaWp2ZXIKKyAqCisgKglsYW5jZS5jOglBbiBBTUQgTEFOQ0UgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eC4KKyAqCQkJV3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisgKgorICoJQW03OUM5NjA6CVBDbmV0KHRtKS1JU0EgU2luZ2xlLUNoaXAgRXRoZXJuZXQgQ29udHJvbGxlcgorICoJCQlBZHZhbmNlZCBNaWNybyBEZXZpY2VzCisgKgkJCVB1YmxpY2F0aW9uICMxNjkwNywgUmV2LiBCLCBBbWVuZG1lbnQvMCwgTWF5IDE5OTQKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4CisgKiBkaXN0cmlidXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhlIEEyMDY1IGlzIGEgWm9ycm8tSUkgYm9hcmQgbWFkZSBieSBDb21tb2RvcmUvQW1lcmlzdGFyLiBJdCBjb250YWluczoKKyAqCisgKgktIGFuIEFtNzk5MCBMb2NhbCBBcmVhIE5ldHdvcmsgQ29udHJvbGxlciBmb3IgRXRoZXJuZXQgKExBTkNFKSB3aXRoCisgKgkgIGJvdGggMTBCQVNFLTIgKHRoaW4gY29heCkgYW5kIEFVSSAoREItMTUpIGNvbm5lY3RvcnMKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC96b3Jyby5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgorCisjaW5jbHVkZSAiYTIwNjUuaCIKKworCisJLyoKKwkgKgkJVHJhbnNtaXQvUmVjZWl2ZSBSaW5nIERlZmluaXRpb25zCisJICovCisKKyNkZWZpbmUgTEFOQ0VfTE9HX1RYX0JVRkZFUlMJKDIpCisjZGVmaW5lIExBTkNFX0xPR19SWF9CVUZGRVJTCSg0KQorCisjZGVmaW5lIFRYX1JJTkdfU0laRQkJKDE8PExBTkNFX0xPR19UWF9CVUZGRVJTKQorI2RlZmluZSBSWF9SSU5HX1NJWkUJCSgxPDxMQU5DRV9MT0dfUlhfQlVGRkVSUykKKworI2RlZmluZSBUWF9SSU5HX01PRF9NQVNLCShUWF9SSU5HX1NJWkUtMSkKKyNkZWZpbmUgUlhfUklOR19NT0RfTUFTSwkoUlhfUklOR19TSVpFLTEpCisKKyNkZWZpbmUgUEtUX0JVRl9TSVpFCQkoMTU0NCkKKyNkZWZpbmUgUlhfQlVGRl9TSVpFICAgICAgICAgICAgUEtUX0JVRl9TSVpFCisjZGVmaW5lIFRYX0JVRkZfU0laRSAgICAgICAgICAgIFBLVF9CVUZfU0laRQorCisKKwkvKgorCSAqCQlMYXlvdXQgb2YgdGhlIExhbmNlJ3MgUkFNIEJ1ZmZlcgorCSAqLworCisKK3N0cnVjdCBsYW5jZV9pbml0X2Jsb2NrIHsKKwl1bnNpZ25lZCBzaG9ydCBtb2RlOwkJLyogUHJlLXNldCBtb2RlIChyZWcuIDE1KSAqLworCXVuc2lnbmVkIGNoYXIgcGh5c19hZGRyWzZdOyAgICAgLyogUGh5c2ljYWwgZXRoZXJuZXQgYWRkcmVzcyAqLworCXVuc2lnbmVkIGZpbHRlclsyXTsJCS8qIE11bHRpY2FzdCBmaWx0ZXIuICovCisKKwkvKiBSZWNlaXZlIGFuZCB0cmFuc21pdCByaW5nIGJhc2UsIGFsb25nIHdpdGggZXh0cmEgYml0cy4gKi8KKwl1bnNpZ25lZCBzaG9ydCByeF9wdHI7CQkvKiByZWNlaXZlIGRlc2NyaXB0b3IgYWRkciAqLworCXVuc2lnbmVkIHNob3J0IHJ4X2xlbjsJCS8qIHJlY2VpdmUgbGVuIGFuZCBoaWdoIGFkZHIgKi8KKwl1bnNpZ25lZCBzaG9ydCB0eF9wdHI7CQkvKiB0cmFuc21pdCBkZXNjcmlwdG9yIGFkZHIgKi8KKwl1bnNpZ25lZCBzaG9ydCB0eF9sZW47CQkvKiB0cmFuc21pdCBsZW4gYW5kIGhpZ2ggYWRkciAqLworICAgIAorCS8qIFRoZSBUeCBhbmQgUnggcmluZyBlbnRyaWVzIG11c3QgYWxpZ25lZCBvbiA4LWJ5dGUgYm91bmRhcmllcy4gKi8KKwlzdHJ1Y3QgbGFuY2VfcnhfZGVzYyBicnhfcmluZ1tSWF9SSU5HX1NJWkVdOworCXN0cnVjdCBsYW5jZV90eF9kZXNjIGJ0eF9yaW5nW1RYX1JJTkdfU0laRV07CisKKwljaGFyICAgcnhfYnVmIFtSWF9SSU5HX1NJWkVdW1JYX0JVRkZfU0laRV07CisJY2hhciAgIHR4X2J1ZiBbVFhfUklOR19TSVpFXVtUWF9CVUZGX1NJWkVdOworfTsKKworCisJLyoKKwkgKgkJUHJpdmF0ZSBEZXZpY2UgRGF0YQorCSAqLworCitzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSB7CisJY2hhciAqbmFtZTsKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfcmVncyAqbGw7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmluaXRfYmxvY2s7CSAgICAvKiBIb3N0cyB2aWV3ICovCisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmxhbmNlX2luaXRfYmxvY2s7IC8qIExhbmNlIHZpZXcgKi8KKworCWludCByeF9uZXcsIHR4X25ldzsKKwlpbnQgcnhfb2xkLCB0eF9vbGQ7CisgICAgCisJaW50IGxhbmNlX2xvZ19yeF9idWZzLCBsYW5jZV9sb2dfdHhfYnVmczsKKwlpbnQgcnhfcmluZ19tb2RfbWFzaywgdHhfcmluZ19tb2RfbWFzazsKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCWludCB0cGU7CQkgICAgICAvKiBjYWJsZS1zZWxlY3Rpb24gaXMgVFBFICovCisJaW50IGF1dG9fc2VsZWN0OwkgICAgICAvKiBjYWJsZS1zZWxlY3Rpb24gYnkgY2FycmllciAqLworCXVuc2lnbmVkIHNob3J0IGJ1c21hc3Rlcl9yZWd2YWw7CisKKyNpZmRlZiBDT05GSUdfU1VOTEFOQ0UKKwlzdHJ1Y3QgTGludXhfU0J1c19ETUEgKmxlZG1hOyAvKiBpZiBzZXQgdGhpcyBwb2ludHMgdG8gbGVkbWEgYW5kIGFyY2g9NG0gKi8KKwlpbnQgYnVyc3Rfc2l6ZXM7CSAgICAgIC8qIGxlZG1hIFNCdXMgYnVyc3Qgc2l6ZXMgKi8KKyNlbmRpZgorCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgICAgbXVsdGljYXN0X3RpbWVyOworfTsKKworI2RlZmluZSBUWF9CVUZGU19BVkFJTCAoKGxwLT50eF9vbGQ8PWxwLT50eF9uZXcpP1wKKwkJCWxwLT50eF9vbGQrbHAtPnR4X3JpbmdfbW9kX21hc2stbHAtPnR4X25ldzpcCisJCQlscC0+dHhfb2xkIC0gbHAtPnR4X25ldy0xKQorCisKKyNkZWZpbmUgTEFOQ0VfQUREUih4KSAoKGludCkoeCkgJiB+MHhmZjAwMDAwMCkKKworLyogTG9hZCB0aGUgQ1NSIHJlZ2lzdGVycyAqLworc3RhdGljIHZvaWQgbG9hZF9jc3JzIChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHApCit7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsID0gbHAtPmxsOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICphaWIgPSBscC0+bGFuY2VfaW5pdF9ibG9jazsKKwlpbnQgbGVwdHI7CisKKwlsZXB0ciA9IExBTkNFX0FERFIgKGFpYik7CisKKwlsbC0+cmFwID0gTEVfQ1NSMTsKKwlsbC0+cmRwID0gKGxlcHRyICYgMHhGRkZGKTsKKwlsbC0+cmFwID0gTEVfQ1NSMjsKKwlsbC0+cmRwID0gbGVwdHIgPj4gMTY7CisJbGwtPnJhcCA9IExFX0NTUjM7CisJbGwtPnJkcCA9IGxwLT5idXNtYXN0ZXJfcmVndmFsOworCisJLyogUG9pbnQgYmFjayB0byBjc3IwICovCisJbGwtPnJhcCA9IExFX0NTUjA7Cit9CisKKyNkZWZpbmUgWkVSTyAwCisKKy8qIFNldHVwIHRoZSBMYW5jZSBSeCBhbmQgVHggcmluZ3MgKi8KK3N0YXRpYyB2b2lkIGxhbmNlX2luaXRfcmluZyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYiA9IGxwLT5pbml0X2Jsb2NrOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICphaWI7IC8qIGZvciBMQU5DRV9BRERSIGNvbXB1dGF0aW9ucyAqLworCWludCBsZXB0cjsKKwlpbnQgaTsKKworCWFpYiA9IGxwLT5sYW5jZV9pbml0X2Jsb2NrOworCisJLyogTG9jayBvdXQgb3RoZXIgcHJvY2Vzc2VzIHdoaWxlIHNldHRpbmcgdXAgaGFyZHdhcmUgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJbHAtPnJ4X25ldyA9IGxwLT50eF9uZXcgPSAwOworCWxwLT5yeF9vbGQgPSBscC0+dHhfb2xkID0gMDsKKworCWliLT5tb2RlID0gMDsKKworCS8qIENvcHkgdGhlIGV0aGVybmV0IGFkZHJlc3MgdG8gdGhlIGxhbmNlIGluaXQgYmxvY2sKKwkgKiBOb3RlIHRoYXQgb24gdGhlIHNwYXJjIHlvdSBuZWVkIHRvIHN3YXAgdGhlIGV0aGVybmV0IGFkZHJlc3MuCisJICovCisJaWItPnBoeXNfYWRkciBbMF0gPSBkZXYtPmRldl9hZGRyIFsxXTsKKwlpYi0+cGh5c19hZGRyIFsxXSA9IGRldi0+ZGV2X2FkZHIgWzBdOworCWliLT5waHlzX2FkZHIgWzJdID0gZGV2LT5kZXZfYWRkciBbM107CisJaWItPnBoeXNfYWRkciBbM10gPSBkZXYtPmRldl9hZGRyIFsyXTsKKwlpYi0+cGh5c19hZGRyIFs0XSA9IGRldi0+ZGV2X2FkZHIgWzVdOworCWliLT5waHlzX2FkZHIgWzVdID0gZGV2LT5kZXZfYWRkciBbNF07CisKKwlpZiAoWkVSTykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlRYIHJpbmdzOlxuIik7CisgICAgCisJLyogU2V0dXAgdGhlIFR4IHJpbmcgZW50cmllcyAqLworCWZvciAoaSA9IDA7IGkgPD0gKDE8PGxwLT5sYW5jZV9sb2dfdHhfYnVmcyk7IGkrKykgeworCQlsZXB0ciA9IExBTkNFX0FERFIoJmFpYi0+dHhfYnVmW2ldWzBdKTsKKwkJaWItPmJ0eF9yaW5nIFtpXS50bWQwICAgICAgPSBsZXB0cjsKKwkJaWItPmJ0eF9yaW5nIFtpXS50bWQxX2hhZHIgPSBsZXB0ciA+PiAxNjsKKwkJaWItPmJ0eF9yaW5nIFtpXS50bWQxX2JpdHMgPSAwOworCQlpYi0+YnR4X3JpbmcgW2ldLmxlbmd0aCAgICA9IDB4ZjAwMDsgLyogVGhlIG9uZXMgcmVxdWlyZWQgYnkgdG1kMiAqLworCQlpYi0+YnR4X3JpbmcgW2ldLm1pc2MgICAgICA9IDA7CisJCWlmIChpIDwgMyAmJiBaRVJPKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVkOiAweCU4Ljh4XG4iLCBpLCBsZXB0cik7CisJfQorCisJLyogU2V0dXAgdGhlIFJ4IHJpbmcgZW50cmllcyAqLworCWlmIChaRVJPKQorCQlwcmludGsoS0VSTl9ERUJVRyAiUlggcmluZ3M6XG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgKDE8PGxwLT5sYW5jZV9sb2dfcnhfYnVmcyk7IGkrKykgeworCQlsZXB0ciA9IExBTkNFX0FERFIoJmFpYi0+cnhfYnVmW2ldWzBdKTsKKworCQlpYi0+YnJ4X3JpbmcgW2ldLnJtZDAgICAgICA9IGxlcHRyOworCQlpYi0+YnJ4X3JpbmcgW2ldLnJtZDFfaGFkciA9IGxlcHRyID4+IDE2OworCQlpYi0+YnJ4X3JpbmcgW2ldLnJtZDFfYml0cyA9IExFX1IxX09XTjsKKwkJaWItPmJyeF9yaW5nIFtpXS5sZW5ndGggICAgPSAtUlhfQlVGRl9TSVpFIHwgMHhmMDAwOworCQlpYi0+YnJ4X3JpbmcgW2ldLm1ibGVuZ3RoICA9IDA7CisJCWlmIChpIDwgMyAmJiBaRVJPKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVkOiAweCU4Ljh4XG4iLCBpLCBsZXB0cik7CisJfQorCisJLyogU2V0dXAgdGhlIGluaXRpYWxpemF0aW9uIGJsb2NrICovCisgICAgCisJLyogU2V0dXAgcnggZGVzY3JpcHRvciBwb2ludGVyICovCisJbGVwdHIgPSBMQU5DRV9BRERSKCZhaWItPmJyeF9yaW5nKTsKKwlpYi0+cnhfbGVuID0gKGxwLT5sYW5jZV9sb2dfcnhfYnVmcyA8PCAxMykgfCAobGVwdHIgPj4gMTYpOworCWliLT5yeF9wdHIgPSBsZXB0cjsKKwlpZiAoWkVSTykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlJYIHB0cjogJTguOHhcbiIsIGxlcHRyKTsKKyAgICAKKwkvKiBTZXR1cCB0eCBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KKwlsZXB0ciA9IExBTkNFX0FERFIoJmFpYi0+YnR4X3JpbmcpOworCWliLT50eF9sZW4gPSAobHAtPmxhbmNlX2xvZ190eF9idWZzIDw8IDEzKSB8IChsZXB0ciA+PiAxNik7CisJaWItPnR4X3B0ciA9IGxlcHRyOworCWlmIChaRVJPKQorCQlwcmludGsoS0VSTl9ERUJVRyAiVFggcHRyOiAlOC44eFxuIiwgbGVwdHIpOworCisJLyogQ2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgKi8KKwlpYi0+ZmlsdGVyIFswXSA9IDA7CisJaWItPmZpbHRlciBbMV0gPSAwOworfQorCitzdGF0aWMgaW50IGluaXRfcmVzdGFydF9sYW5jZSAoc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwKQoreworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKKwlpbnQgaTsKKworCWxsLT5yYXAgPSBMRV9DU1IwOworCWxsLT5yZHAgPSBMRV9DMF9JTklUOworCisJLyogV2FpdCBmb3IgdGhlIGxhbmNlIHRvIGNvbXBsZXRlIGluaXRpYWxpemF0aW9uICovCisJZm9yIChpID0gMDsgKGkgPCAxMDApICYmICEobGwtPnJkcCAmIChMRV9DMF9FUlIgfCBMRV9DMF9JRE9OKSk7IGkrKykKKwkJYmFycmllcigpOworCWlmICgoaSA9PSAxMDApIHx8IChsbC0+cmRwICYgTEVfQzBfRVJSKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkxBTkNFIHVub3BlbmVkIGFmdGVyICVkIHRpY2tzLCBjc3IwPSU0LjR4LlxuIiwKKwkJICAgICAgIGksIGxsLT5yZHApOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBDbGVhciBJRE9OIGJ5IHdyaXRpbmcgYSAiMSIsIGVuYWJsZSBpbnRlcnJ1cHRzIGFuZCBzdGFydCBsYW5jZSAqLworCWxsLT5yZHAgPSBMRV9DMF9JRE9OOworCWxsLT5yZHAgPSBMRV9DMF9JTkVBIHwgTEVfQzBfU1RSVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhbmNlX3J4IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2s7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsID0gbHAtPmxsOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yeF9kZXNjICpyZDsKKwl1bnNpZ25lZCBjaGFyIGJpdHM7CisJaW50IGxlbiA9IDA7CQkJLyogWFhYIHNodXQgdXAgZ2NjIHdhcm5pbmdzICovCisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IDA7CS8qIFhYWCBzaHV0IHVwIGdjYyB3YXJuaW5ncyAqLworCisjaWZkZWYgVEVTVF9ISVRTCisJaW50IGk7CisJcHJpbnRrKEtFUk5fREVCVUcgIlsiKTsKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJaWYgKGkgPT0gbHAtPnJ4X25ldykKKwkJCXByaW50ayAoIiVzIiwKKwkJCQlpYi0+YnJ4X3JpbmcgW2ldLnJtZDFfYml0cyAmIExFX1IxX09XTiA/ICJfIiA6ICJYIik7CisJCWVsc2UKKwkJCXByaW50ayAoIiVzIiwKKwkJCQlpYi0+YnJ4X3JpbmcgW2ldLnJtZDFfYml0cyAmIExFX1IxX09XTiA/ICIuIiA6ICIxIik7CisJfQorCXByaW50ayAoIl1cbiIpOworI2VuZGlmCisgICAgCisJbGwtPnJkcCA9IExFX0MwX1JJTlR8TEVfQzBfSU5FQTsKKwlmb3IgKHJkID0gJmliLT5icnhfcmluZyBbbHAtPnJ4X25ld107CisJICAgICAhKChiaXRzID0gcmQtPnJtZDFfYml0cykgJiBMRV9SMV9PV04pOworCSAgICAgcmQgPSAmaWItPmJyeF9yaW5nIFtscC0+cnhfbmV3XSkgeworCisJCS8qIFdlIGdvdCBhbiBpbmNvbXBsZXRlIGZyYW1lPyAqLworCQlpZiAoKGJpdHMgJiBMRV9SMV9QT0spICE9IExFX1IxX1BPSykgeworCQkJbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChiaXRzICYgTEVfUjFfRVJSKSB7CisJCQkvKiBDb3VudCBvbmx5IHRoZSBlbmQgZnJhbWUgYXMgYSByeCBlcnJvciwKKwkJCSAqIG5vdCB0aGUgYmVnaW5uaW5nCisJCQkgKi8KKwkJCWlmIChiaXRzICYgTEVfUjFfQlVGKSBscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCWlmIChiaXRzICYgTEVfUjFfQ1JDKSBscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJaWYgKGJpdHMgJiBMRV9SMV9PRkwpIGxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJaWYgKGJpdHMgJiBMRV9SMV9GUkEpIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChiaXRzICYgTEVfUjFfRU9QKSBscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCX0gZWxzZSB7CisJCQlsZW4gPSAocmQtPm1ibGVuZ3RoICYgMHhmZmYpIC0gNDsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IgKGxlbisyKTsKKworCQkJaWYgKHNrYiA9PSAwKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1lbW9yeSBzcXVlZXplLCAiCisJCQkJICAgICAgICJkZWZlcnJpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCXJkLT5tYmxlbmd0aCA9IDA7CisJCQkJcmQtPnJtZDFfYml0cyA9IExFX1IxX09XTjsKKwkJCQlscC0+cnhfbmV3ID0gKGxwLT5yeF9uZXcgKyAxKSAmIGxwLT5yeF9yaW5nX21vZF9tYXNrOworCQkJCXJldHVybiAwOworCQkJfQorCSAgICAKKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJc2tiX3Jlc2VydmUgKHNrYiwgMik7CQkvKiAxNiBieXRlIGFsaWduICovCisJCQlza2JfcHV0IChza2IsIGxlbik7CQkvKiBtYWtlIHJvb20gKi8KKwkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLAorCQkJCQkgKHVuc2lnbmVkIGNoYXIgKikmKGliLT5yeF9idWYgW2xwLT5yeF9uZXddWzBdKSwKKwkJCQkJIGxlbiwgMCk7CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMgKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3J4IChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQl9CisKKwkJLyogUmV0dXJuIHRoZSBwYWNrZXQgdG8gdGhlIHBvb2wgKi8KKwkJcmQtPm1ibGVuZ3RoID0gMDsKKwkJcmQtPnJtZDFfYml0cyA9IExFX1IxX09XTjsKKwkJbHAtPnJ4X25ldyA9IChscC0+cnhfbmV3ICsgMSkgJiBscC0+cnhfcmluZ19tb2RfbWFzazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFuY2VfdHggKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWIgPSBscC0+aW5pdF9ibG9jazsKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfcmVncyAqbGwgPSBscC0+bGw7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3R4X2Rlc2MgKnRkOworCWludCBpLCBqOworCWludCBzdGF0dXM7CisKKwkvKiBjc3IwIGlzIDJmMyAqLworCWxsLT5yZHAgPSBMRV9DMF9USU5UIHwgTEVfQzBfSU5FQTsKKwkvKiBjc3IwIGlzIDczICovCisKKwlqID0gbHAtPnR4X29sZDsKKwlmb3IgKGkgPSBqOyBpICE9IGxwLT50eF9uZXc7IGkgPSBqKSB7CisJCXRkID0gJmliLT5idHhfcmluZyBbaV07CisKKwkJLyogSWYgd2UgaGl0IGEgcGFja2V0IG5vdCBvd25lZCBieSB1cywgc3RvcCAqLworCQlpZiAodGQtPnRtZDFfYml0cyAmIExFX1QxX09XTikKKwkJCWJyZWFrOworCQkKKwkJaWYgKHRkLT50bWQxX2JpdHMgJiBMRV9UMV9FUlIpIHsKKwkJCXN0YXR1cyA9IHRkLT5taXNjOworCSAgICAKKwkJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBMRV9UM19SVFkpICBscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBMRV9UM19MQ09MKSBscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCisJCQlpZiAoc3RhdHVzICYgTEVfVDNfQ0xPUykgeworCQkJCWxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCWlmIChscC0+YXV0b19zZWxlY3QpIHsKKwkJCQkJbHAtPnRwZSA9IDEgLSBscC0+dHBlOworCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYXJyaWVyIExvc3QsICIKKwkJCQkJICAgICAgICJ0cnlpbmcgJXNcbiIsIGRldi0+bmFtZSwKKwkJCQkJICAgICAgIGxwLT50cGU/IlRQRSI6IkFVSSIpOworCQkJCQkvKiBTdG9wIHRoZSBsYW5jZSAqLworCQkJCQlsbC0+cmFwID0gTEVfQ1NSMDsKKwkJCQkJbGwtPnJkcCA9IExFX0MwX1NUT1A7CisJCQkJCWxhbmNlX2luaXRfcmluZyAoZGV2KTsKKwkJCQkJbG9hZF9jc3JzIChscCk7CisJCQkJCWluaXRfcmVzdGFydF9sYW5jZSAobHApOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisKKwkJCS8qIGJ1ZmZlciBlcnJvcnMgYW5kIHVuZGVyZmxvd3MgdHVybiBvZmYgdGhlIHRyYW5zbWl0dGVyICovCisJCQkvKiBSZXN0YXJ0IHRoZSBhZGFwdGVyICovCisJCQlpZiAoc3RhdHVzICYgKExFX1QzX0JVRnxMRV9UM19VRkwpKSB7CisJCQkJbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUeDogRVJSX0JVRnxFUlJfVUZMLCAiCisJCQkJICAgICAgICJyZXN0YXJ0aW5nXG4iLCBkZXYtPm5hbWUpOworCQkJCS8qIFN0b3AgdGhlIGxhbmNlICovCisJCQkJbGwtPnJhcCA9IExFX0NTUjA7CisJCQkJbGwtPnJkcCA9IExFX0MwX1NUT1A7CisJCQkJbGFuY2VfaW5pdF9yaW5nIChkZXYpOworCQkJCWxvYWRfY3NycyAobHApOworCQkJCWluaXRfcmVzdGFydF9sYW5jZSAobHApOworCQkJCXJldHVybiAwOworCQkJfQorCQl9IGVsc2UgaWYgKCh0ZC0+dG1kMV9iaXRzICYgTEVfVDFfUE9LKSA9PSBMRV9UMV9QT0spIHsKKwkJCS8qCisJCQkgKiBTbyB3ZSBkb24ndCBjb3VudCB0aGUgcGFja2V0IG1vcmUgdGhhbiBvbmNlLgorCQkJICovCisJCQl0ZC0+dG1kMV9iaXRzICY9IH4oTEVfVDFfUE9LKTsKKworCQkJLyogT25lIGNvbGxpc2lvbiBiZWZvcmUgcGFja2V0IHdhcyBzZW50LiAqLworCQkJaWYgKHRkLT50bWQxX2JpdHMgJiBMRV9UMV9FT05FKQorCQkJCWxwLT5zdGF0cy5jb2xsaXNpb25zKys7CisKKwkJCS8qIE1vcmUgdGhhbiBvbmUgY29sbGlzaW9uLCBiZSBvcHRpbWlzdGljLiAqLworCQkJaWYgKHRkLT50bWQxX2JpdHMgJiBMRV9UMV9FTU9SRSkKKwkJCQlscC0+c3RhdHMuY29sbGlzaW9ucyArPSAyOworCisJCQlscC0+c3RhdHMudHhfcGFja2V0cysrOworCQl9CisJCisJCWogPSAoaiArIDEpICYgbHAtPnR4X3JpbmdfbW9kX21hc2s7CisJfQorCWxwLT50eF9vbGQgPSBqOworCWxsLT5yZHAgPSBMRV9DMF9USU5UIHwgTEVfQzBfSU5FQTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90CitsYW5jZV9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHA7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsOworCWludCBjc3IwOworCisJZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsbCA9IGxwLT5sbDsKKworCWxsLT5yYXAgPSBMRV9DU1IwOwkJLyogTEFOQ0UgQ29udHJvbGxlciBTdGF0dXMgKi8KKwljc3IwID0gbGwtPnJkcDsKKworCWlmICghKGNzcjAgJiBMRV9DMF9JTlRSKSkJLyogQ2hlY2sgaWYgYW55IGludGVycnVwdCBoYXMgKi8KKwkJcmV0dXJuIElSUV9OT05FOwkvKiBiZWVuIGdlbmVyYXRlZCBieSB0aGUgTGFuY2UuICovCisKKwkvKiBBY2tub3dsZWRnZSBhbGwgdGhlIGludGVycnVwdCBzb3VyY2VzIEFTQVAgKi8KKwlsbC0+cmRwID0gY3NyMCAmIH4oTEVfQzBfSU5FQXxMRV9DMF9URE1EfExFX0MwX1NUT1B8TEVfQzBfU1RSVHwKKwkJCSAgIExFX0MwX0lOSVQpOworCisJaWYgKChjc3IwICYgTEVfQzBfRVJSKSkgeworCQkvKiBDbGVhciB0aGUgZXJyb3IgY29uZGl0aW9uICovCisJCWxsLT5yZHAgPSBMRV9DMF9CQUJMfExFX0MwX0VSUnxMRV9DMF9NSVNTfExFX0MwX0lORUE7CisJfQorICAgIAorCWlmIChjc3IwICYgTEVfQzBfUklOVCkKKwkJbGFuY2VfcnggKGRldik7CisKKwlpZiAoY3NyMCAmIExFX0MwX1RJTlQpCisJCWxhbmNlX3R4IChkZXYpOworCisJLyogTG9nIG1pc2MgZXJyb3JzLiAqLworCWlmIChjc3IwICYgTEVfQzBfQkFCTCkKKwkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOyAgICAgICAvKiBUeCBiYWJibGUuICovCisJaWYgKGNzcjAgJiBMRV9DMF9NSVNTKQorCQlscC0+c3RhdHMucnhfZXJyb3JzKys7ICAgICAgIC8qIE1pc3NlZCBhIFJ4IGZyYW1lLiAqLworCWlmIChjc3IwICYgTEVfQzBfTUVSUikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBCdXMgbWFzdGVyIGFyYml0cmF0aW9uIGZhaWx1cmUsIHN0YXR1cyAiCisJCSAgICAgICAiJTQuNHguXG4iLCBkZXYtPm5hbWUsIGNzcjApOworCQkvKiBSZXN0YXJ0IHRoZSBjaGlwLiAqLworCQlsbC0+cmRwID0gTEVfQzBfU1RSVDsKKwl9CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmIFRYX0JVRkZTX0FWQUlMID4gMCkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJbGwtPnJhcCA9IExFX0NTUjA7CisJbGwtPnJkcCA9IExFX0MwX0JBQkx8TEVfQzBfQ0VSUnxMRV9DMF9NSVNTfExFX0MwX01FUlJ8CisJCQkJCUxFX0MwX0lET058TEVfQzBfSU5FQTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlICpsYXN0X2RldiA9IDA7CisKK3N0YXRpYyBpbnQgbGFuY2Vfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKKwlpbnQgcmV0OworCisJbGFzdF9kZXYgPSBkZXY7CisKKwkvKiBTdG9wIHRoZSBMYW5jZSAqLworCWxsLT5yYXAgPSBMRV9DU1IwOworCWxsLT5yZHAgPSBMRV9DMF9TVE9QOworCisJLyogSW5zdGFsbCB0aGUgSW50ZXJydXB0IGhhbmRsZXIgKi8KKwlyZXQgPSByZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGxhbmNlX2ludGVycnVwdCwgU0FfU0hJUlEsCisJCQkgIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocmV0KSByZXR1cm4gcmV0OworCisJbG9hZF9jc3JzIChscCk7CisJbGFuY2VfaW5pdF9yaW5nIChkZXYpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiBpbml0X3Jlc3RhcnRfbGFuY2UgKGxwKTsKK30KKworc3RhdGljIGludCBsYW5jZV9jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlkZWxfdGltZXJfc3luYygmbHAtPm11bHRpY2FzdF90aW1lcik7CisKKwkvKiBTdG9wIHRoZSBjYXJkICovCisJbGwtPnJhcCA9IExFX0NTUjA7CisJbGwtPnJkcCA9IExFX0MwX1NUT1A7CisKKwlmcmVlX2lycShJUlFfQU1JR0FfUE9SVFMsIGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxhbmNlX3Jlc2V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsID0gbHAtPmxsOworCWludCBzdGF0dXM7CisgICAgCisJLyogU3RvcCB0aGUgbGFuY2UgKi8KKwlsbC0+cmFwID0gTEVfQ1NSMDsKKwlsbC0+cmRwID0gTEVfQzBfU1RPUDsKKworCWxvYWRfY3NycyAobHApOworCisJbGFuY2VfaW5pdF9yaW5nIChkZXYpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlzdGF0dXMgPSBpbml0X3Jlc3RhcnRfbGFuY2UgKGxwKTsKKyNpZmRlZiBERUJVR19EUklWRVIKKwlwcmludGsoS0VSTl9ERUJVRyAiTGFuY2UgcmVzdGFydD0lZFxuIiwgc3RhdHVzKTsKKyNlbmRpZgorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIGxhbmNlX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICUwNHgsIHJlc2V0XG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGxsLT5yZHApOworCWxhbmNlX3Jlc2V0KGRldik7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IGxhbmNlX3N0YXJ0X3htaXQgKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfcmVncyAqbGwgPSBscC0+bGw7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2s7CisJaW50IGVudHJ5LCBza2JsZW4sIGxlbjsKKwlpbnQgc3RhdHVzID0gMDsKKwlzdGF0aWMgaW50IG91dHM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNrYmxlbiA9IHNrYi0+bGVuOworCWxlbiA9IHNrYmxlbjsKKwkKKwlpZiAobGVuIDwgRVRIX1pMRU4pIHsKKwkJbGVuID0gRVRIX1pMRU47CisJCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJfQorCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJaWYgKCFUWF9CVUZGU19BVkFJTCl7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuIC0xOworCX0KKworI2lmZGVmIERFQlVHX0RSSVZFUgorCS8qIGR1bXAgdGhlIHBhY2tldCAqLworCXsKKwkJaW50IGk7CisJCisJCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJCQlpZiAoKGkgJSAxNikgPT0gMCkKKwkJCQlwcmludGsoIlxuIiBLRVJOX0RFQlVHKTsKKwkJCXByaW50ayAoIiUyLjJ4ICIsIHNrYi0+ZGF0YSBbaV0pOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9CisjZW5kaWYKKwllbnRyeSA9IGxwLT50eF9uZXcgJiBscC0+dHhfcmluZ19tb2RfbWFzazsKKwlpYi0+YnR4X3JpbmcgW2VudHJ5XS5sZW5ndGggPSAoLWxlbikgfCAweGYwMDA7CisJaWItPmJ0eF9yaW5nIFtlbnRyeV0ubWlzYyA9IDA7CisgICAgCisJbWVtY3B5ICgoY2hhciAqKSZpYi0+dHhfYnVmIFtlbnRyeV1bMF0sIHNrYi0+ZGF0YSwgc2tibGVuKTsKKworCS8qIENsZWFyIHRoZSBzbGFjayBvZiB0aGUgcGFja2V0LCBkbyBJIG5lZWQgdGhpcz8gKi8KKwlpZiAobGVuICE9IHNrYmxlbikKKwkJbWVtc2V0ICgoY2hhciAqKSAmaWItPnR4X2J1ZiBbZW50cnldW3NrYmxlbl0sIDAsIGxlbiAtIHNrYmxlbik7CisgICAgCisJLyogTm93LCBnaXZlIHRoZSBwYWNrZXQgdG8gdGhlIGxhbmNlICovCisJaWItPmJ0eF9yaW5nIFtlbnRyeV0udG1kMV9iaXRzID0gKExFX1QxX1BPS3xMRV9UMV9PV04pOworCWxwLT50eF9uZXcgPSAobHAtPnR4X25ldysxKSAmIGxwLT50eF9yaW5nX21vZF9tYXNrOworCisJb3V0cysrOworCisJaWYgKFRYX0JVRkZTX0FWQUlMIDw9IDApCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIEtpY2sgdGhlIGxhbmNlOiB0cmFuc21pdCBub3cgKi8KKwlsbC0+cmRwID0gTEVfQzBfSU5FQSB8IExFX0MwX1RETUQ7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKyAgICAKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmxhbmNlX2dldF9zdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qIHRha2VuIGZyb20gdGhlIGRlcGNhIGRyaXZlciAqLworc3RhdGljIHZvaWQgbGFuY2VfbG9hZF9tdWx0aWNhc3QgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWIgPSBscC0+aW5pdF9ibG9jazsKKwl2b2xhdGlsZSB1MTYgKm1jYXN0X3RhYmxlID0gKHUxNiAqKSZpYi0+ZmlsdGVyOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pPWRldi0+bWNfbGlzdDsKKwljaGFyICphZGRyczsKKwlpbnQgaTsKKwl1MzIgY3JjOworCQorCS8qIHNldCBhbGwgbXVsdGljYXN0IGJpdHMgKi8KKwlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSl7IAorCQlpYi0+ZmlsdGVyIFswXSA9IDB4ZmZmZmZmZmY7CisJCWliLT5maWx0ZXIgWzFdID0gMHhmZmZmZmZmZjsKKwkJcmV0dXJuOworCX0KKwkvKiBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciAqLworCWliLT5maWx0ZXIgWzBdID0gMDsKKwlpYi0+ZmlsdGVyIFsxXSA9IDA7CisKKwkvKiBBZGQgYWRkcmVzc2VzICovCisJZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKyl7CisJCWFkZHJzID0gZG1pLT5kbWlfYWRkcjsKKwkJZG1pICAgPSBkbWktPm5leHQ7CisKKwkJLyogbXVsdGljYXN0IGFkZHJlc3M/ICovCisJCWlmICghKCphZGRycyAmIDEpKQorCQkJY29udGludWU7CisJCQorCQljcmMgPSBldGhlcl9jcmNfbGUoNiwgYWRkcnMpOworCQljcmMgPSBjcmMgPj4gMjY7CisJCW1jYXN0X3RhYmxlIFtjcmMgPj4gNF0gfD0gMSA8PCAoY3JjICYgMHhmKTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBsYW5jZV9zZXRfbXVsdGljYXN0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2s7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsID0gbHAtPmxsOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybjsKKworCWlmIChscC0+dHhfb2xkICE9IGxwLT50eF9uZXcpIHsKKwkJbW9kX3RpbWVyKCZscC0+bXVsdGljYXN0X3RpbWVyLCBqaWZmaWVzICsgNCk7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJcmV0dXJuOworCX0KKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWxsLT5yYXAgPSBMRV9DU1IwOworCWxsLT5yZHAgPSBMRV9DMF9TVE9QOworCWxhbmNlX2luaXRfcmluZyAoZGV2KTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJaWItPm1vZGUgfD0gTEVfTU9fUFJPTTsKKwl9IGVsc2UgeworCQlpYi0+bW9kZSAmPSB+TEVfTU9fUFJPTTsKKwkJbGFuY2VfbG9hZF9tdWx0aWNhc3QgKGRldik7CisJfQorCWxvYWRfY3NycyAobHApOworCWluaXRfcmVzdGFydF9sYW5jZSAobHApOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYTIwNjVfaW5pdF9vbmUoc3RydWN0IHpvcnJvX2RldiAqeiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHpvcnJvX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhMjA2NV9yZW1vdmVfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnopOworCisKK3N0YXRpYyBzdHJ1Y3Qgem9ycm9fZGV2aWNlX2lkIGEyMDY1X3pvcnJvX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyBaT1JST19QUk9EX0NCTV9BMjA2NV8xIH0sCisJeyBaT1JST19QUk9EX0NCTV9BMjA2NV8yIH0sCisJeyBaT1JST19QUk9EX0FNRVJJU1RBUl9BMjA2NSB9LAorCXsgMCB9Cit9OworCitzdGF0aWMgc3RydWN0IHpvcnJvX2RyaXZlciBhMjA2NV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImEyMDY1IiwKKwkuaWRfdGFibGUJPSBhMjA2NV96b3Jyb190YmwsCisJLnByb2JlCQk9IGEyMDY1X2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYTIwNjVfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhMjA2NV9pbml0X29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6LAorCQkJCSAgICBjb25zdCBzdHJ1Y3Qgem9ycm9fZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqcHJpdjsKKwl1bnNpZ25lZCBsb25nIGJvYXJkLCBiYXNlX2FkZHIsIG1lbV9zdGFydDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnIxLCAqcjI7CisJaW50IGVycjsKKworCWJvYXJkID0gei0+cmVzb3VyY2Uuc3RhcnQ7CisJYmFzZV9hZGRyID0gYm9hcmQrQTIwNjVfTEFOQ0U7CisJbWVtX3N0YXJ0ID0gYm9hcmQrQTIwNjVfUkFNOworCisJcjEgPSByZXF1ZXN0X21lbV9yZWdpb24oYmFzZV9hZGRyLCBzaXplb2Yoc3RydWN0IGxhbmNlX3JlZ3MpLAorCQkJCSJBbTc5OTAiKTsKKwlpZiAoIXIxKQorCQlyZXR1cm4gLUVCVVNZOworCXIyID0gcmVxdWVzdF9tZW1fcmVnaW9uKG1lbV9zdGFydCwgQTIwNjVfUkFNX1NJWkUsICJSQU0iKTsKKwlpZiAoIXIyKSB7CisJCXJlbGVhc2VfcmVzb3VyY2UocjEpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSkpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlyZWxlYXNlX3Jlc291cmNlKHIxKTsKKwkJcmVsZWFzZV9yZXNvdXJjZShyMik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXIxLT5uYW1lID0gZGV2LT5uYW1lOworCXIyLT5uYW1lID0gZGV2LT5uYW1lOworCisJZGV2LT5kZXZfYWRkclswXSA9IDB4MDA7CisJaWYgKHotPmlkICE9IFpPUlJPX1BST0RfQU1FUklTVEFSX0EyMDY1KSB7CS8qIENvbW1vZG9yZSAqLworCQlkZXYtPmRldl9hZGRyWzFdID0gMHg4MDsKKwkJZGV2LT5kZXZfYWRkclsyXSA9IDB4MTA7CisJfSBlbHNlIHsJCQkJCS8qIEFtZXJpc3RhciAqLworCQlkZXYtPmRldl9hZGRyWzFdID0gMHgwMDsKKwkJZGV2LT5kZXZfYWRkclsyXSA9IDB4OWY7CisJfQorCWRldi0+ZGV2X2FkZHJbM10gPSAoei0+cm9tLmVyX1NlcmlhbE51bWJlcj4+MTYpICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzRdID0gKHotPnJvbS5lcl9TZXJpYWxOdW1iZXI+PjgpICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzVdID0gei0+cm9tLmVyX1NlcmlhbE51bWJlciAmIDB4ZmY7CisJZGV2LT5iYXNlX2FkZHIgPSBaVFdPX1ZBRERSKGJhc2VfYWRkcik7CisJZGV2LT5tZW1fc3RhcnQgPSBaVFdPX1ZBRERSKG1lbV9zdGFydCk7CisJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQrQTIwNjVfUkFNX1NJWkU7CisKKwlwcml2LT5sbCA9ICh2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfcmVncyAqKWRldi0+YmFzZV9hZGRyOworCXByaXYtPmluaXRfYmxvY2sgPSAoc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKilkZXYtPm1lbV9zdGFydDsKKwlwcml2LT5sYW5jZV9pbml0X2Jsb2NrID0gKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICopQTIwNjVfUkFNOworCXByaXYtPmF1dG9fc2VsZWN0ID0gMDsKKwlwcml2LT5idXNtYXN0ZXJfcmVndmFsID0gTEVfQzNfQlNXUDsKKworCXByaXYtPmxhbmNlX2xvZ19yeF9idWZzID0gTEFOQ0VfTE9HX1JYX0JVRkZFUlM7CisJcHJpdi0+bGFuY2VfbG9nX3R4X2J1ZnMgPSBMQU5DRV9MT0dfVFhfQlVGRkVSUzsKKwlwcml2LT5yeF9yaW5nX21vZF9tYXNrID0gUlhfUklOR19NT0RfTUFTSzsKKwlwcml2LT50eF9yaW5nX21vZF9tYXNrID0gVFhfUklOR19NT0RfTUFTSzsKKworCWRldi0+b3BlbiA9ICZsYW5jZV9vcGVuOworCWRldi0+c3RvcCA9ICZsYW5jZV9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZsYW5jZV9zdGFydF94bWl0OworCWRldi0+dHhfdGltZW91dCA9ICZsYW5jZV90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSA1KkhaOworCWRldi0+Z2V0X3N0YXRzID0gJmxhbmNlX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZsYW5jZV9zZXRfbXVsdGljYXN0OworCWRldi0+ZG1hID0gMDsKKworCWluaXRfdGltZXIoJnByaXYtPm11bHRpY2FzdF90aW1lcik7CisJcHJpdi0+bXVsdGljYXN0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworCXByaXYtPm11bHRpY2FzdF90aW1lci5mdW5jdGlvbiA9CisJCSh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSkgJmxhbmNlX3NldF9tdWx0aWNhc3Q7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXJlbGVhc2VfcmVzb3VyY2UocjEpOworCQlyZWxlYXNlX3Jlc291cmNlKHIyKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisJem9ycm9fc2V0X2RydmRhdGEoeiwgZGV2KTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBBMjA2NSBhdCAweCUwOGx4LCBFdGhlcm5ldCBBZGRyZXNzICIKKwkgICAgICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBkZXYtPm5hbWUsIGJvYXJkLAorCSAgICAgICBkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLCBkZXYtPmRldl9hZGRyWzJdLAorCSAgICAgICBkZXYtPmRldl9hZGRyWzNdLCBkZXYtPmRldl9hZGRyWzRdLCBkZXYtPmRldl9hZGRyWzVdKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhMjA2NV9yZW1vdmVfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnopCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHpvcnJvX2dldF9kcnZkYXRhKHopOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlyZWxlYXNlX21lbV9yZWdpb24oWlRXT19QQUREUihkZXYtPmJhc2VfYWRkciksCisJCQkgICBzaXplb2Yoc3RydWN0IGxhbmNlX3JlZ3MpKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oWlRXT19QQUREUihkZXYtPm1lbV9zdGFydCksIEEyMDY1X1JBTV9TSVpFKTsKKwlmcmVlX25ldGRldihkZXYpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhMjA2NV9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiB6b3Jyb19tb2R1bGVfaW5pdCgmYTIwNjVfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGEyMDY1X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJem9ycm9fdW5yZWdpc3Rlcl9kcml2ZXIoJmEyMDY1X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGEyMDY1X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGEyMDY1X2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYTIwNjUuaCBiL2RyaXZlcnMvbmV0L2EyMDY1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0YWQ1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2EyMDY1LmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBBbWlnYSBMaW51eC82OGsgQTIwNjUgRXRoZXJuZXQgRHJpdmVyCisgKgorICogKEMpIENvcHlyaWdodCAxOTk1IGJ5IEdlZXJ0IFV5dHRlcmhvZXZlbiA8Z2VlcnRAbGludXgtbTY4ay5vcmc+CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGJhc2VkIG9uCisgKgorICoJYXJpYWRuZS4/OglBbWlnYSBMaW51eC82OGsgQXJpYWRuZSBFdGhlcm5ldCBEcml2ZXIKKyAqCQkJKEMpIENvcHlyaWdodCAxOTk1IGJ5IEdlZXJ0IFV5dHRlcmhvZXZlbiwKKyAqCQkJUGV0ZXIgRGUgU2NocmlqdmVyCisgKgorICoJbGFuY2UuYzoJQW4gQU1EIExBTkNFIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguCisgKgkJCVdyaXR0ZW4gMTk5My05NCBieSBEb25hbGQgQmVja2VyLgorICoKKyAqCUFtNzlDOTYwOglQQ25ldCh0bSktSVNBIFNpbmdsZS1DaGlwIEV0aGVybmV0IENvbnRyb2xsZXIKKyAqCQkJQWR2YW5jZWQgTWljcm8gRGV2aWNlcworICoJCQlQdWJsaWNhdGlvbiAjMTY5MDcsIFJldi4gQiwgQW1lbmRtZW50LzAsIE1heSAxOTk0CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4CisgKiBkaXN0cmlidXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGUgQTIwNjUgaXMgYSBab3Jyby1JSSBib2FyZCBtYWRlIGJ5IENvbW1vZG9yZS9BbWVyaXN0YXIuIEl0IGNvbnRhaW5zOgorICoKKyAqCS0gYW4gQW03OTkwIExvY2FsIEFyZWEgTmV0d29yayBDb250cm9sbGVyIGZvciBFdGhlcm5ldCAoTEFOQ0UpIHdpdGgKKyAqCSAgYm90aCAxMEJBU0UtMiAodGhpbiBjb2F4KSBhbmQgQVVJIChEQi0xNSkgY29ubmVjdG9ycworICovCisKKworLyoKKyAqCQlBbTc5OTAgTG9jYWwgQXJlYSBOZXR3b3JrIENvbnRyb2xsZXIgZm9yIEV0aGVybmV0IChMQU5DRSkKKyAqLworCitzdHJ1Y3QgbGFuY2VfcmVncyB7CisJdW5zaWduZWQgc2hvcnQgcmRwOwkJLyogUmVnaXN0ZXIgRGF0YSBQb3J0ICovCisJdW5zaWduZWQgc2hvcnQgcmFwOwkJLyogUmVnaXN0ZXIgQWRkcmVzcyBQb3J0ICovCit9OworCisKKy8qCisgKgkJQW03OTkwIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlcnMKKyAqLworCisjZGVmaW5lIExFX0NTUjAJCTB4MDAwMAkJLyogTEFOQ0UgQ29udHJvbGxlciBTdGF0dXMgKi8KKyNkZWZpbmUgTEVfQ1NSMQkJMHgwMDAxCQkvKiBJQURSWzE1OjBdICovCisjZGVmaW5lIExFX0NTUjIJCTB4MDAwMgkJLyogSUFEUlsyMzoxNl0gKi8KKyNkZWZpbmUgTEVfQ1NSMwkJMHgwMDAzCQkvKiBNaXNjICovCisKKworLyoKKyAqCQlCaXQgZGVmaW5pdGlvbnMgZm9yIENTUjAgKExBTkNFIENvbnRyb2xsZXIgU3RhdHVzKQorICovCisKKyNkZWZpbmUgTEVfQzBfRVJSCTB4ODAwMAkJLyogRXJyb3IgKi8KKyNkZWZpbmUgTEVfQzBfQkFCTAkweDQwMDAJCS8qIEJhYmJsZTogVHJhbnNtaXR0ZWQgdG9vIG1hbnkgYml0cyAqLworI2RlZmluZSBMRV9DMF9DRVJSCTB4MjAwMAkJLyogTm8gSGVhcnRiZWF0ICgxMEJBU0UtVCkgKi8KKyNkZWZpbmUgTEVfQzBfTUlTUwkweDEwMDAJCS8qIE1pc3NlZCBGcmFtZSAqLworI2RlZmluZSBMRV9DMF9NRVJSCTB4MDgwMAkJLyogTWVtb3J5IEVycm9yICovCisjZGVmaW5lIExFX0MwX1JJTlQJMHgwNDAwCQkvKiBSZWNlaXZlIEludGVycnVwdCAqLworI2RlZmluZSBMRV9DMF9USU5UCTB4MDIwMAkJLyogVHJhbnNtaXQgSW50ZXJydXB0ICovCisjZGVmaW5lIExFX0MwX0lET04JMHgwMTAwCQkvKiBJbml0aWFsaXphdGlvbiBEb25lICovCisjZGVmaW5lIExFX0MwX0lOVFIJMHgwMDgwCQkvKiBJbnRlcnJ1cHQgRmxhZyAqLworI2RlZmluZSBMRV9DMF9JTkVBCTB4MDA0MAkJLyogSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBMRV9DMF9SWE9OCTB4MDAyMAkJLyogUmVjZWl2ZSBPbiAqLworI2RlZmluZSBMRV9DMF9UWE9OCTB4MDAxMAkJLyogVHJhbnNtaXQgT24gKi8KKyNkZWZpbmUgTEVfQzBfVERNRAkweDAwMDgJCS8qIFRyYW5zbWl0IERlbWFuZCAqLworI2RlZmluZSBMRV9DMF9TVE9QCTB4MDAwNAkJLyogU3RvcCAqLworI2RlZmluZSBMRV9DMF9TVFJUCTB4MDAwMgkJLyogU3RhcnQgKi8KKyNkZWZpbmUgTEVfQzBfSU5JVAkweDAwMDEJCS8qIEluaXRpYWxpemUgKi8KKworCisvKgorICoJCUJpdCBkZWZpbml0aW9ucyBmb3IgQ1NSMworICovCisKKyNkZWZpbmUgTEVfQzNfQlNXUAkweDAwMDQJCS8qIEJ5dGUgU3dhcAorCQkJCQkgICAob24gZm9yIGJpZyBlbmRpYW4gYnl0ZSBvcmRlcikgKi8KKyNkZWZpbmUgTEVfQzNfQUNPTgkweDAwMDIJCS8qIEFMRSBDb250cm9sCisJCQkJCSAgIChvbiBmb3IgYWN0aXZlIGxvdyBBTEUpICovCisjZGVmaW5lIExFX0MzX0JDT04JMHgwMDAxCQkvKiBCeXRlIENvbnRyb2wgKi8KKworCisvKgorICoJCU1vZGUgRmxhZ3MKKyAqLworCisjZGVmaW5lIExFX01PX1BST00JMHg4MDAwCQkvKiBQcm9taXNjdW91cyBNb2RlICovCisjZGVmaW5lIExFX01PX0lOVEwJMHgwMDQwCQkvKiBJbnRlcm5hbCBMb29wYmFjayAqLworI2RlZmluZSBMRV9NT19EUlRZCTB4MDAyMAkJLyogRGlzYWJsZSBSZXRyeSAqLworI2RlZmluZSBMRV9NT19GQ09MTAkweDAwMTAJCS8qIEZvcmNlIENvbGxpc2lvbiAqLworI2RlZmluZSBMRV9NT19EWE1URkNTCTB4MDAwOAkJLyogRGlzYWJsZSBUcmFuc21pdCBDUkMgKi8KKyNkZWZpbmUgTEVfTU9fTE9PUAkweDAwMDQJCS8qIExvb3BiYWNrIEVuYWJsZSAqLworI2RlZmluZSBMRV9NT19EVFgJMHgwMDAyCQkvKiBEaXNhYmxlIFRyYW5zbWl0dGVyICovCisjZGVmaW5lIExFX01PX0RSWAkweDAwMDEJCS8qIERpc2FibGUgUmVjZWl2ZXIgKi8KKworCitzdHJ1Y3QgbGFuY2VfcnhfZGVzYyB7CisJdW5zaWduZWQgc2hvcnQgcm1kMDsgICAgICAgIC8qIGxvdyBhZGRyZXNzIG9mIHBhY2tldCAqLworCXVuc2lnbmVkIGNoYXIgIHJtZDFfYml0czsgICAvKiBkZXNjcmlwdG9yIGJpdHMgKi8KKwl1bnNpZ25lZCBjaGFyICBybWQxX2hhZHI7ICAgLyogaGlnaCBhZGRyZXNzIG9mIHBhY2tldCAqLworCXNob3J0ICAgIGxlbmd0aDsgICAgCSAgICAvKiBUaGlzIGxlbmd0aCBpcyAycyBjb21wbGVtZW50IChuZWdhdGl2ZSkhCisJCQkJICAgICAqIEJ1ZmZlciBsZW5ndGgKKwkJCQkgICAgICovCisJdW5zaWduZWQgc2hvcnQgbWJsZW5ndGg7ICAgIC8qIEFhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkICovCit9OworIAorc3RydWN0IGxhbmNlX3R4X2Rlc2MgeworCXVuc2lnbmVkIHNob3J0IHRtZDA7ICAgICAgICAvKiBsb3cgYWRkcmVzcyBvZiBwYWNrZXQgKi8KKwl1bnNpZ25lZCBjaGFyICB0bWQxX2JpdHM7ICAgLyogZGVzY3JpcHRvciBiaXRzICovCisJdW5zaWduZWQgY2hhciAgdG1kMV9oYWRyOyAgIC8qIGhpZ2ggYWRkcmVzcyBvZiBwYWNrZXQgKi8KKwlzaG9ydCAgICBsZW5ndGg7ICAgICAgIAkgICAgLyogTGVuZ3RoIGlzIDJzIGNvbXBsZW1lbnQgKG5lZ2F0aXZlKSEgKi8KKwl1bnNpZ25lZCBzaG9ydCBtaXNjOworfTsKKwkJCisKKy8qCisgKgkJUmVjZWl2ZSBGbGFncworICovCisKKyNkZWZpbmUgTEVfUjFfT1dOCTB4ODAJCS8qIExBTkNFIG93bnMgdGhlIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgTEVfUjFfRVJSCTB4NDAJCS8qIEVycm9yICovCisjZGVmaW5lIExFX1IxX0ZSQQkweDIwCQkvKiBGcmFtaW5nIEVycm9yICovCisjZGVmaW5lIExFX1IxX09GTAkweDEwCQkvKiBPdmVyZmxvdyBFcnJvciAqLworI2RlZmluZSBMRV9SMV9DUkMJMHgwOAkJLyogQ1JDIEVycm9yICovCisjZGVmaW5lIExFX1IxX0JVRgkweDA0CQkvKiBCdWZmZXIgRXJyb3IgKi8KKyNkZWZpbmUgTEVfUjFfU09QCTB4MDIJCS8qIFN0YXJ0IG9mIFBhY2tldCAqLworI2RlZmluZSBMRV9SMV9FT1AJMHgwMQkJLyogRW5kIG9mIFBhY2tldCAqLworI2RlZmluZSBMRV9SMV9QT0sgICAgICAgMHgwMwkJLyogUGFja2V0IGlzIGNvbXBsZXRlOiBTT1AgKyBFT1AgKi8KKworCisvKgorICoJCVRyYW5zbWl0IEZsYWdzCisgKi8KKworI2RlZmluZSBMRV9UMV9PV04JMHg4MAkJLyogTEFOQ0Ugb3ducyB0aGUgZGVzY3JpcHRvciAqLworI2RlZmluZSBMRV9UMV9FUlIJMHg0MAkJLyogRXJyb3IgKi8KKyNkZWZpbmUgTEVfVDFfUkVTCTB4MjAJCS8qIFJlc2VydmVkLAorCQkJCQkgICBMQU5DRSB3cml0ZXMgdGhpcyB3aXRoIGEgemVybyAqLworI2RlZmluZSBMRV9UMV9FTU9SRQkweDEwCQkvKiBNb3JlIHRoYW4gb25lIHJldHJ5IG5lZWRlZCAqLworI2RlZmluZSBMRV9UMV9FT05FCTB4MDgJCS8qIE9uZSByZXRyeSBuZWVkZWQgKi8KKyNkZWZpbmUgTEVfVDFfRURFRgkweDA0CQkvKiBEZWZlcnJlZCAqLworI2RlZmluZSBMRV9UMV9TT1AJMHgwMgkJLyogU3RhcnQgb2YgUGFja2V0ICovCisjZGVmaW5lIExFX1QxX0VPUAkweDAxCQkvKiBFbmQgb2YgUGFja2V0ICovCisjZGVmaW5lIExFX1QxX1BPSwkweDAzCQkvKiBQYWNrZXQgaXMgY29tcGxldGU6IFNPUCArIEVPUCAqLworCisKKy8qCisgKgkJRXJyb3IgRmxhZ3MKKyAqLworCisjZGVmaW5lIExFX1QzX0JVRiAJMHg4MDAwCQkvKiBCdWZmZXIgRXJyb3IgKi8KKyNkZWZpbmUgTEVfVDNfVUZMIAkweDQwMDAJCS8qIFVuZGVyZmxvdyBFcnJvciAqLworI2RlZmluZSBMRV9UM19MQ09MIAkweDEwMDAJCS8qIExhdGUgQ29sbGlzaW9uICovCisjZGVmaW5lIExFX1QzX0NMT1MgCTB4MDgwMAkJLyogTG9zcyBvZiBDYXJyaWVyICovCisjZGVmaW5lIExFX1QzX1JUWSAJMHgwNDAwCQkvKiBSZXRyeSBFcnJvciAqLworI2RlZmluZSBMRV9UM19URFIJMHgwM2ZmCQkvKiBUaW1lIERvbWFpbiBSZWZsZWN0b21ldHJ5ICovCisKKworLyoKKyAqCQlBMjA2NSBFeHBhbnNpb24gQm9hcmQgU3RydWN0dXJlCisgKi8KKworI2RlZmluZSBBMjA2NV9MQU5DRQkJMHg0MDAwCisKKyNkZWZpbmUgQTIwNjVfUkFNCQkweDgwMDAKKyNkZWZpbmUgQTIwNjVfUkFNX1NJWkUJCTB4ODAwMAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hYzMyMDAuYyBiL2RyaXZlcnMvbmV0L2FjMzIwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZmJhMzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hYzMyMDAuYwpAQCAtMCwwICsxLDQyNCBAQAorLyogYWMzMjAwLmM6IEEgZHJpdmVyIGZvciB0aGUgQW5zZWwgQ29tbXVuaWNhdGlvbnMgRUlTQSBldGhlcm5ldCBhZGFwdG9yLiAqLworLyoKKwlXcml0dGVuIDE5OTMsIDE5OTQgYnkgRG9uYWxkIEJlY2tlci4KKwlDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlIERpcmVjdG9yLAorCU5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4gIFRoaXMgc29mdHdhcmUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQKKwlhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBtb2RpZmllZCBieSBTUkMsCisJaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKwlUaGlzIGlzIGRyaXZlciBmb3IgdGhlIEFuc2VsIENvbW11bmljYXRpb25zIE1vZGVsIDMyMDAgRUlTQSBFdGhlcm5ldCBMQU4KKwlBZGFwdGVyLiAgVGhlIHByb2dyYW1taW5nIGluZm9ybWF0aW9uIGlzIGZyb20gdGhlIHVzZXJzIG1hbnVhbCwgYXMgcmVsYXRlZAorCWJ5IGdsZWVAYXJkbmFzc2FrLm1hdGguY2xlbXNvbi5lZHUuCisKKwlDaGFuZ2Vsb2c6CisKKwlQYXVsIEdvcnRtYWtlciAwNS85OAk6IGFkZCBzdXBwb3J0IGZvciBzaGFyZWQgbWVtIGFib3ZlIDFNQi4KKworICAqLworCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPQorCSJhYzMyMDAuYzp2MS4wMSA3LzEvOTQgRG9uYWxkIEJlY2tlciAoYmVja2VyQGNlc2Rpcy5nc2ZjLm5hc2EuZ292KVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vpc2EuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgIjgzOTAuaCIKKworI2RlZmluZSBEUlZfTkFNRQkiYWMzMjAwIgorCisvKiBPZmZzZXRzIGZyb20gdGhlIGJhc2UgYWRkcmVzcy4gKi8KKyNkZWZpbmUgQUNfTklDX0JBU0UJMHgwMAorI2RlZmluZSBBQ19TQV9QUk9NCTB4MTYJCQkvKiBUaGUgc3RhdGlvbiBhZGRyZXNzIFBST00uICovCisjZGVmaW5lIEFDX0FERFIwCTB4MDAJCQkvKiBQcmVmaXggc3RhdGlvbiBhZGRyZXNzIHZhbHVlcy4gKi8KKyNkZWZpbmUgQUNfQUREUjEJMHg0MAkJCQorI2RlZmluZSBBQ19BRERSMgkweDkwCisjZGVmaW5lIEFDX0lEX1BPUlQJMHhDODAKKyNkZWZpbmUgQUNfRUlTQV9JRAkweDAxMTBkMzA1CisjZGVmaW5lIEFDX1JFU0VUX1BPUlQJMHhDODQKKyNkZWZpbmUgQUNfUkVTRVQJMHgwMAorI2RlZmluZSBBQ19FTkFCTEUJMHgwMQorI2RlZmluZSBBQ19DT05GSUcJMHhDOTAJLyogVGhlIGNvbmZpZ3VyYXRpb24gcG9ydC4gKi8KKworI2RlZmluZSBBQ19JT19FWFRFTlQgMHgyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBY3R1YWxseSBhY2Nlc3NlZCBpczoKKwkJCQkJCQkJICogQUNfTklDX0JBU0UgKDAtMTUpCisJCQkJCQkJCSAqIEFDX1NBX1BST00gKDAtNSkKKwkJCQkJCQkJICogQUNfSURfUE9SVCAoMC0zKQorCQkJCQkJCQkgKiBBQ19SRVNFVF9QT1JUCisJCQkJCQkJCSAqIEFDX0NPTkZJRworCQkJCQkJCQkgKi8KKworLyogRGVjb2Rpbmcgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBjb25maWcyaXJxbWFwWzhdIF9faW5pdGRhdGEgPSB7MTUsIDEyLCAxMSwgMTAsIDksIDcsIDUsIDN9Oworc3RhdGljIGludCBhZGRybWFwWzhdID0KK3sweEZGMDAwMCwgMHhGRTAwMDAsIDB4RkQwMDAwLCAweEZGRjAwMDAsIDB4RkZFMDAwMCwgMHhGRkMwMDAwLCAgMHhEMDAwMCwgMCB9Oworc3RhdGljIGNvbnN0IGNoYXIgKnBvcnRfbmFtZVs0XSA9IHsgIjEwYmFzZVQiLCAiaW52YWxpZCIsICJBVUkiLCAiMTBiYXNlMiJ9OworCisjZGVmaW5lIGNvbmZpZzJpcnEoY29uZmlndmFsKQljb25maWcyaXJxbWFwWygoY29uZmlndmFsKSA+PiAzKSAmIDddCisjZGVmaW5lIGNvbmZpZzJtZW0oY29uZmlndmFsKQlhZGRybWFwWyhjb25maWd2YWwpICYgN10KKyNkZWZpbmUgY29uZmlnMm5hbWUoY29uZmlndmFsKQlwb3J0X25hbWVbKChjb25maWd2YWwpID4+IDYpICYgM10KKworLyogRmlyc3QgYW5kIGxhc3QgODM5MCBwYWdlcy4gKi8KKyNkZWZpbmUgQUNfU1RBUlRfUEcJCTB4MDAJLyogRmlyc3QgcGFnZSBvZiA4MzkwIFRYIGJ1ZmZlciAqLworI2RlZmluZSBBQ19TVE9QX1BHCQkweDgwCS8qIExhc3QgcGFnZSArMSBvZiB0aGUgODM5MCBSWCByaW5nICovCisKK3N0YXRpYyBpbnQgYWNfcHJvYmUxKGludCBpb2FkZHIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgaW50IGFjX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBhY19yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYWNfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQgYWNfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IGludCBjb3VudCwKKwkJCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGNvbnN0IGludCBzdGFydF9wYWdlKTsKK3N0YXRpYyB2b2lkIGFjX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLAorCQkJCQlpbnQgcmluZ19wYWdlKTsKKworc3RhdGljIGludCBhY19jbG9zZV9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworDAorCisvKglQcm9iZSBmb3IgdGhlIEFDMzIwMC4KKworCVRoZSBBQzMyMDAgY2FuIGJlIGlkZW50aWZpZWQgYnkgZWl0aGVyIHRoZSBFSVNBIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLAorCW9yIHRoZSB1bmlxdWUgdmFsdWUgaW4gdGhlIHN0YXRpb24gYWRkcmVzcyBQUk9NLgorCSovCisKK3N0YXRpYyBpbnQgX19pbml0IGRvX2FjMzIwMF9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIHNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpcnEgPSBkZXYtPmlycTsKKwlpbnQgbWVtX3N0YXJ0ID0gZGV2LT5tZW1fc3RhcnQ7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZiAoaW9hZGRyID4gMHgxZmYpCQkvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCXJldHVybiBhY19wcm9iZTEoaW9hZGRyLCBkZXYpOworCWVsc2UgaWYgKGlvYWRkciA+IDApCQkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCXJldHVybiAtRU5YSU87CisKKwlpZiAoICEgRUlTQV9idXMpCisJCXJldHVybiAtRU5YSU87CisKKwlmb3IgKGlvYWRkciA9IDB4MTAwMDsgaW9hZGRyIDwgMHg5MDAwOyBpb2FkZHIgKz0gMHgxMDAwKSB7CisJCWlmIChhY19wcm9iZTEoaW9hZGRyLCBkZXYpID09IDApCisJCQlyZXR1cm4gMDsKKwkJZGV2LT5pcnEgPSBpcnE7CisJCWRldi0+bWVtX3N0YXJ0ID0gbWVtX3N0YXJ0OworCX0KKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBTb21lZGF5IGZyZWVfaXJxIG1heSBiZSBpbiBhY19jbG9zZV9jYXJkKCkgKi8KKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgQUNfSU9fRVhURU5UKTsKKwlpb3VubWFwKGVpX3N0YXR1cy5tZW0pOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgYWMzMjAwX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKwlpbnQgZXJyOworCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisKKwllcnIgPSBkb19hYzMyMDBfcHJvYmUoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJY2xlYW51cF9jYXJkKGRldik7CitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGFjX3Byb2JlMShpbnQgaW9hZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpLCByZXR2YWw7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgQUNfSU9fRVhURU5ULCBEUlZfTkFNRSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoaW5iX3AoaW9hZGRyICsgQUNfSURfUE9SVCkgPT0gMHhmZikgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaW5sKGlvYWRkciArIEFDX0lEX1BPUlQpICE9IEFDX0VJU0FfSUQpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwlwcmludGsoS0VSTl9ERUJVRyAiQUMzMjAwIGV0aGVyY2FyZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGlzICUjMDJ4LCIKKwkJICAgIiBFSVNBIElEICUwMnggJTAyeCAlMDJ4ICUwMnguXG4iLCBpbmIoaW9hZGRyICsgQUNfQ09ORklHKSwKKwkJICAgaW5iKGlvYWRkciArIEFDX0lEX1BPUlQgKyAwKSwgaW5iKGlvYWRkciArIEFDX0lEX1BPUlQgKyAxKSwKKwkJICAgaW5iKGlvYWRkciArIEFDX0lEX1BPUlQgKyAyKSwgaW5iKGlvYWRkciArIEFDX0lEX1BPUlQgKyAzKSk7CisjZW5kaWYKKworCXByaW50aygiQUMzMjAwIGluIEVJU0Egc2xvdCAlZCwgbm9kZSIsIGlvYWRkci8weDEwMDApOworCWZvcihpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIgJTAyeCIsIGRldi0+ZGV2X2FkZHJbaV0gPSBpbmIoaW9hZGRyICsgQUNfU0FfUFJPTSArIGkpKTsKKworI2lmIDAKKwkvKiBDaGVjayB0aGUgdmVuZG9yIElEL3ByZWZpeC4gUmVkdW5kYW50IGFmdGVyIGNoZWNraW5nIHRoZSBFSVNBIElEICovCisJaWYgKGluYihpb2FkZHIgKyBBQ19TQV9QUk9NICsgMCkgIT0gQUNfQUREUjAKKwkJfHwgaW5iKGlvYWRkciArIEFDX1NBX1BST00gKyAxKSAhPSBBQ19BRERSMQorCQl8fCBpbmIoaW9hZGRyICsgQUNfU0FfUFJPTSArIDIpICE9IEFDX0FERFIyICkgeworCQlwcmludGsoIiwgbm90IGZvdW5kIChpbnZhbGlkIHByZWZpeCkuXG4iKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorI2VuZGlmCisKKwkvKiBBc3NpZ24gYW5kIGFsbG9jYXRlIHRoZSBpbnRlcnJ1cHQgbm93LiAqLworCWlmIChkZXYtPmlycSA9PSAwKSB7CisJCWRldi0+aXJxID0gY29uZmlnMmlycShpbmIoaW9hZGRyICsgQUNfQ09ORklHKSk7CisJCXByaW50aygiLCB1c2luZyIpOworCX0gZWxzZSB7CisJCWRldi0+aXJxID0gaXJxX2Nhbm9uaWNhbGl6ZShkZXYtPmlycSk7CisJCXByaW50aygiLCBhc3NpZ25pbmciKTsKKwl9CisKKwlyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgZWlfaW50ZXJydXB0LCAwLCBEUlZfTkFNRSwgZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayAoIiBub3RoaW5nISBVbmFibGUgdG8gZ2V0IElSUSAlZC5cbiIsIGRldi0+aXJxKTsKKwkJZ290byBvdXQxOworCX0KKworCXByaW50aygiIElSUSAlZCwgJXMgcG9ydFxuIiwgZGV2LT5pcnEsIHBvcnRfbmFtZVtkZXYtPmlmX3BvcnRdKTsKKworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCisjaWZkZWYgbm90eWV0CisJaWYgKGRldi0+bWVtX3N0YXJ0KQl7CQkvKiBPdmVycmlkZSB0aGUgdmFsdWUgZnJvbSB0aGUgYm9hcmQuICovCisJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCisJCQlpZiAoYWRkcm1hcFtpXSA9PSBkZXYtPm1lbV9zdGFydCkKKwkJCQlicmVhazsKKwkJaWYgKGkgPj0gNykKKwkJCWkgPSAwOworCQlvdXRiKChpbmIoaW9hZGRyICsgQUNfQ09ORklHKSAmIH43KSB8IGksIGlvYWRkciArIEFDX0NPTkZJRyk7CisJfQorI2VuZGlmCisKKwlkZXYtPmlmX3BvcnQgPSBpbmIoaW9hZGRyICsgQUNfQ09ORklHKSA+PiA2OworCWRldi0+bWVtX3N0YXJ0ID0gY29uZmlnMm1lbShpbmIoaW9hZGRyICsgQUNfQ09ORklHKSk7CisKKwlwcmludGsoIiVzOiBBQzMyMDAgYXQgJSMzeCB3aXRoICVka0IgbWVtb3J5IGF0IHBoeXNpY2FsIGFkZHJlc3MgJSNseC5cbiIsIAorCQkJZGV2LT5uYW1lLCBpb2FkZHIsIEFDX1NUT1BfUEcvNCwgZGV2LT5tZW1fc3RhcnQpOworCisJLyoKKwkgKiAgQkVXQVJFISEgU29tZSBkYWluLWJyYW1hZ2VkIEVJU0EgU0NVcyB3aWxsIGFsbG93IHlvdSB0byBwdXQKKwkgKiAgdGhlIGNhcmQgbWVtIHdpdGhpbiB0aGUgcmVnaW9uIGNvdmVyZWQgYnkgYG5vcm1hbCcgUkFNICAhISEKKwkgKgorCSAqICBpb3JlbWFwKCkgd2lsbCBmYWlsIGluIHRoYXQgY2FzZS4KKwkgKi8KKwllaV9zdGF0dXMubWVtID0gaW9yZW1hcChkZXYtPm1lbV9zdGFydCwgQUNfU1RPUF9QRyoweDEwMCk7CisJaWYgKCFlaV9zdGF0dXMubWVtKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWMzMjAwLmM6IFVuYWJsZSB0byByZW1hcCBjYXJkIG1lbW9yeSBhYm92ZSAxTUIgISFcbiIpOworCQlwcmludGsoS0VSTl9FUlIgImFjMzIwMC5jOiBUcnkgdXNpbmcgRUlTQSBTQ1UgdG8gc2V0IG1lbW9yeSBiZWxvdyAxTUIuXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJhYzMyMDAuYzogRHJpdmVyIE5PVCBpbnN0YWxsZWQuXG4iKTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBvdXQxOworCX0KKwlwcmludGsoImFjMzIwMC5jOiByZW1hcHBlZCAlZGtCIGNhcmQgbWVtb3J5IHRvIHZpcnR1YWwgYWRkcmVzcyAlcFxuIiwKKwkJCUFDX1NUT1BfUEcvNCwgZWlfc3RhdHVzLm1lbSk7CisKKwlkZXYtPm1lbV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKWVpX3N0YXR1cy5tZW07CisJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyAoQUNfU1RPUF9QRyAtIEFDX1NUQVJUX1BHKSoyNTY7CisKKwllaV9zdGF0dXMubmFtZSA9ICJBQzMyMDAiOworCWVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gQUNfU1RBUlRfUEc7CisJZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPSBBQ19TVEFSVF9QRyArIFRYX1BBR0VTOworCWVpX3N0YXR1cy5zdG9wX3BhZ2UgPSBBQ19TVE9QX1BHOworCWVpX3N0YXR1cy53b3JkMTYgPSAxOworCisJaWYgKGVpX2RlYnVnID4gMCkKKwkJcHJpbnRrKHZlcnNpb24pOworCisJZWlfc3RhdHVzLnJlc2V0XzgzOTAgPSAmYWNfcmVzZXRfODM5MDsKKwllaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmYWNfYmxvY2tfaW5wdXQ7CisJZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZhY19ibG9ja19vdXRwdXQ7CisJZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZhY19nZXRfODM5MF9oZHI7CisKKwlkZXYtPm9wZW4gPSAmYWNfb3BlbjsKKwlkZXYtPnN0b3AgPSAmYWNfY2xvc2VfY2FyZDsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKKyNlbmRpZgorCU5TODM5MF9pbml0KGRldiwgMCk7CisJcmV0dXJuIDA7CitvdXQxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgQUNfSU9fRVhURU5UKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGFjX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZmRlZiBub3R5ZXQKKwkvKiBTb21lZGF5IHdlIG1heSBlbmFibGUgdGhlIElSUSBhbmQgc2hhcmVkIG1lbW9yeSBoZXJlLiAqLworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyNlbmRpZgorCisJZWlfb3BlbihkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhY19yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJb3V0YihBQ19SRVNFVCwgaW9hZGRyICsgQUNfUkVTRVRfUE9SVCk7CisJaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCJyZXNldHRpbmcgQUMzMjAwLCB0PSVsZC4uLiIsIGppZmZpZXMpOworCisJZWlfc3RhdHVzLnR4aW5nID0gMDsKKwlvdXRiKEFDX0VOQUJMRSwgaW9hZGRyICsgQUNfUkVTRVRfUE9SVCk7CisJaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCJyZXNldCBkb25lXG4iKTsKKworCXJldHVybjsKK30KKworLyogR3JhYiB0aGUgODM5MCBzcGVjaWZpYyBoZWFkZXIuIFNpbWlsYXIgdG8gdGhlIGJsb2NrX2lucHV0IHJvdXRpbmUsIGJ1dAorICAgd2UgZG9uJ3QgbmVlZCB0byBiZSBjb25jZXJuZWQgd2l0aCByaW5nIHdyYXAgYXMgdGhlIGhlYWRlciB3aWxsIGJlIGF0CisgICB0aGUgc3RhcnQgb2YgYSBwYWdlLCBzbyB3ZSBvcHRpbWl6ZSBhY2NvcmRpbmdseS4gKi8KKworc3RhdGljIHZvaWQKK2FjX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQoreworCXZvaWQgX19pb21lbSAqaGRyX3N0YXJ0ID0gZWlfc3RhdHVzLm1lbSArICgocmluZ19wYWdlIC0gQUNfU1RBUlRfUEcpPDw4KTsKKwltZW1jcHlfZnJvbWlvKGhkciwgaGRyX3N0YXJ0LCBzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpKTsKK30KKworLyogIEJsb2NrIGlucHV0IGFuZCBvdXRwdXQgYXJlIGVhc3kgb24gc2hhcmVkIG1lbW9yeSBldGhlcmNhcmRzLCB0aGUgb25seQorCWNvbXBsaWNhdGlvbiBpcyB3aGVuIHRoZSByaW5nIGJ1ZmZlciB3cmFwcy4gKi8KKworc3RhdGljIHZvaWQgYWNfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkJICBpbnQgcmluZ19vZmZzZXQpCit7CisJdm9pZCBfX2lvbWVtICpzdGFydCA9IGVpX3N0YXR1cy5tZW0gKyByaW5nX29mZnNldCAtIEFDX1NUQVJUX1BHKjI1NjsKKworCWlmIChyaW5nX29mZnNldCArIGNvdW50ID4gQUNfU1RPUF9QRyoyNTYpIHsKKwkJLyogV2UgbXVzdCB3cmFwIHRoZSBpbnB1dCBtb3ZlLiAqLworCQlpbnQgc2VtaV9jb3VudCA9IEFDX1NUT1BfUEcqMjU2IC0gcmluZ19vZmZzZXQ7CisJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhLCBzdGFydCwgc2VtaV9jb3VudCk7CisJCWNvdW50IC09IHNlbWlfY291bnQ7CisJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhICsgc2VtaV9jb3VudCwKKwkJCQllaV9zdGF0dXMubWVtICsgVFhfUEFHRVMqMjU2LCBjb3VudCk7CisJfSBlbHNlIHsKKwkJLyogUGFja2V0IGlzIGluIG9uZSBjaHVuayAtLSB3ZSBjYW4gY29weSArIGNrc3VtLiAqLworCQlldGhfaW9fY29weV9hbmRfc3VtKHNrYiwgc3RhcnQsIGNvdW50LCAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFjX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RhcnRfcGFnZSkKK3sKKwl2b2lkIF9faW9tZW0gKnNobWVtID0gZWlfc3RhdHVzLm1lbSArICgoc3RhcnRfcGFnZSAtIEFDX1NUQVJUX1BHKTw8OCk7CisKKwltZW1jcHlfdG9pbyhzaG1lbSwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgYWNfY2xvc2VfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmIChlaV9kZWJ1ZyA+IDEpCisJCXByaW50aygiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKKworI2lmZGVmIG5vdHlldAorCS8qIFdlIHNob3VsZCBzb21lZGF5IGRpc2FibGUgc2hhcmVkIG1lbW9yeSBhbmQgaW50ZXJydXB0cy4gKi8KKwlvdXRiKDB4MDAsIGlvYWRkciArIDYpOwkvKiBEaXNhYmxlIGludGVycnVwdHMuICovCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisjZW5kaWYKKworCWVpX2Nsb3NlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBNT0RVTEUKKyNkZWZpbmUgTUFYX0FDMzJfQ0FSRFMJNAkvKiBNYXggbnVtYmVyIG9mIEFDMzIgY2FyZHMgcGVyIG1vZHVsZSAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfYWMzMltNQVhfQUMzMl9DQVJEU107CitzdGF0aWMgaW50IGlvW01BWF9BQzMyX0NBUkRTXTsKK3N0YXRpYyBpbnQgaXJxW01BWF9BQzMyX0NBUkRTXTsKK3N0YXRpYyBpbnQgbWVtW01BWF9BQzMyX0NBUkRTXTsKK21vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkobWVtLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBiYXNlIGFkZHJlc3MoZXMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSBudW1iZXIocykiKTsKK01PRFVMRV9QQVJNX0RFU0MobWVtLCAiTWVtb3J5IGJhc2UgYWRkcmVzcyhlcykiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5zZWwgQUMzMjAwIEVJU0EgZXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK2ludAoraW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCB0aGlzX2RldiwgZm91bmQgPSAwOworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX0FDMzJfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJaWYgKGlvW3RoaXNfZGV2XSA9PSAwICYmIHRoaXNfZGV2ICE9IDApCisJCQlicmVhazsKKwkJZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisJCWRldi0+aXJxID0gaXJxW3RoaXNfZGV2XTsKKwkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07CisJCWRldi0+bWVtX3N0YXJ0ID0gbWVtW3RoaXNfZGV2XTsJCS8qIEN1cnJlbnRseSBpZ25vcmVkIGJ5IGRyaXZlciAqLworCQlpZiAoZG9fYWMzMjAwX3Byb2JlKGRldikgPT0gMCkgeworCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKKwkJCQlkZXZfYWMzMltmb3VuZCsrXSA9IGRldjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQl9CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImFjMzIwMC5jOiBObyBhYzMyMDAgY2FyZCBmb3VuZCAoaS9vID0gMHgleCkuXG4iLCBpb1t0aGlzX2Rldl0pOworCQlicmVhazsKKwl9CisJaWYgKGZvdW5kKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVOWElPOworfQorCit2b2lkCitjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWludCB0aGlzX2RldjsKKworCWZvciAodGhpc19kZXYgPSAwOyB0aGlzX2RldiA8IE1BWF9BQzMyX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfYWMzMlt0aGlzX2Rldl07CisJCWlmIChkZXYpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hY2VuaWMuYyBiL2RyaXZlcnMvbmV0L2FjZW5pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZWEzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hY2VuaWMuYwpAQCAtMCwwICsxLDMyNzEgQEAKKy8qCisgKiBhY2VuaWMuYzogTGludXggZHJpdmVyIGZvciB0aGUgQWx0ZW9uIEFjZU5JQyBHaWdhYml0IEV0aGVybmV0IGNhcmQKKyAqICAgICAgICAgICBhbmQgb3RoZXIgVGlnb24gYmFzZWQgY2FyZHMuCisgKgorICogQ29weXJpZ2h0IDE5OTgtMjAwMiBieSBKZXMgU29yZW5zZW4sIDxqZXNAdHJhaW5lZC1tb25rZXkub3JnPi4KKyAqCisgKiBUaGFua3MgdG8gQWx0ZW9uIGFuZCAzQ29tIGZvciBwcm92aWRpbmcgaGFyZHdhcmUgYW5kIGRvY3VtZW50YXRpb24KKyAqIGVuYWJsaW5nIG1lIHRvIHdyaXRlIHRoaXMgZHJpdmVyLgorICoKKyAqIEEgbWFpbGluZyBsaXN0IGZvciBkaXNjdXNzaW5nIHRoZSB1c2Ugb2YgdGhpcyBkcml2ZXIgaGFzIGJlZW4KKyAqIHNldHVwLCBwbGVhc2Ugc3Vic2NyaWJlIHRvIHRoZSBsaXN0cyBpZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zCisgKiBhYm91dCB0aGUgZHJpdmVyLiBTZW5kIG1haWwgdG8gbGludXgtYWNlbmljLWhlbHBAc3Vuc2l0ZS5hdWMuZGsgdG8KKyAqIHNlZSBob3cgdG8gc3Vic2NyaWJlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQWRkaXRpb25hbCBjcmVkaXRzOgorICogICBQZXRlIFd5Y2tvZmYgPHd5Y2tvZmZAY2Euc2FuZGlhLmdvdj46IEluaXRpYWwgTGludXgvQWxwaGEgYW5kIHRyYWNlCisgKiAgICAgICBkdW1wIHN1cHBvcnQuIFRoZSB0cmFjZSBkdW1wIHN1cHBvcnQgaGFzIG5vdCBiZWVuCisgKiAgICAgICBpbnRlZ3JhdGVkIHlldCBob3dldmVyLgorICogICBUcm95IEJlbmplZ2VyZGVzOiBCaWcgRW5kaWFuIChQUEMpIHBhdGNoZXMuCisgKiAgIE5hdGUgU3RhaGw6IEJldHRlciBvdXQgb2YgbWVtb3J5IGhhbmRsaW5nIGFuZCBzdGF0cyBzdXBwb3J0LgorICogICBBbWFuIFNpbmdsYTogTmFzdHkgcmFjZSBiZXR3ZWVuIGludGVycnVwdCBoYW5kbGVyIGFuZCB0eCBjb2RlIGRlYWxpbmcKKyAqICAgICAgICAgICAgICAgIHdpdGggJ3Rlc3RpbmcgdGhlIHR4X3JldF9jc20gYW5kIHNldHRpbmcgdHhfZnVsbCcKKyAqICAgRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUByZWRoYXQuY29tPjogY29udmVyc2lvbiB0byBuZXcgUENJIGRtYSBtYXBwaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZnJhc3RydWN0dXJlIGFuZCBTcGFyYyBzdXBwb3J0CisgKiAgIFBpZXJyaWNrIFBpbmFzc2VhdSAoQ0VSTik6IEZvciBsZW5kaW5nIG1lIGFuIFVsdHJhIDUgdG8gdGVzdCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyIHVuZGVyIExpbnV4L1NwYXJjNjQKKyAqICAgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPjogRGV0ZWN0IEFsdGVvbiAxMDAwYmFzZVQgY2FyZHMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVRIVE9PTF9HRFJWSU5GTyBzdXBwb3J0CisgKiAgIENoaXAgU2FsemVuYmVyZyA8Y2hpcEB2YWxpbnV4LmNvbT46IEZpeCByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIHR4CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgYW5kIGNsb3NlKCkgY2xlYW51cC4KKyAqICAgS2VuIEFha2VyIDxrZGFha2VyQHJjaGxhbmQudm5ldC5pYm0uY29tPjogQ29ycmVjdCBjaGVjayBmb3Igd2hldGhlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgbWFwcGVkIElPIGlzIGVuYWJsZWQgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZSB0aGUgZHJpdmVyIHdvcmsgb24gUlMvNjAwMC4KKyAqICAgVGFrYXlvc2hpIEtvdWNoaSA8a291Y2hpQGhwYy5iczEuZmMubmVjLmNvLmpwPjogSWRlbnRpZnlpbmcgcHJvYmxlbQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB0aGUgZHJpdmVyIHdvdWxkIGRpc2FibGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzIG1hc3RlciBtb2RlIGlmIGl0IGhhZCB0byBkaXNhYmxlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIGFuZCBpbnZhbGlkYXRlLgorICogICBTdGVwaGVuIEhhY2sgPHN0ZXBoZW5faGFja0BocC5jb20+OiBGaXhlZCBhY2Vfc2V0X21hY19hZGRyIGZvciBsaXR0bGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kaWFuIHN5c3RlbXMuCisgKiAgIFZhbCBIZW5zb24gPHZoZW5zb25AZXNzY29tLmNvbT46ICAgIFJlc2V0IEp1bWJvIHNrYiBwcm9kdWNlciBhbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnggcHJvZHVjZXIgaW5kZXggd2hlbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaGluZyB0aGUgSnVtYm8gcmluZy4KKyAqICAgSGFucyBHcm9ibGVyIDxncm9iaEBzdW4uYWMuemE+OiAgICAgTWVtb3J5IGxlYWsgZml4ZXMgaW4gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlciBpbml0IHBhdGguCisgKiAgIEdyYW50IEdydW5kbGVyIDxncnVuZGxlckBjdXAuaHAuY29tPjogUENJIHdyaXRlIHBvc3RpbmcgZml4ZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNlbmRpZgorCisjaWZkZWYgU0lPQ0VUSFRPT0wKKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisKKyNkZWZpbmUgRFJWX05BTUUgImFjZW5pYyIKKworI3VuZGVmIElOREVYX0RFQlVHCisKKyNpZmRlZiBDT05GSUdfQUNFTklDX09NSVRfVElHT05fSQorI2RlZmluZSBBQ0VfSVNfVElHT05fSShhcCkJMAorI2RlZmluZSBBQ0VfVFhfUklOR19FTlRSSUVTKGFwKQlNQVhfVFhfUklOR19FTlRSSUVTCisjZWxzZQorI2RlZmluZSBBQ0VfSVNfVElHT05fSShhcCkJKGFwLT52ZXJzaW9uID09IDEpCisjZGVmaW5lIEFDRV9UWF9SSU5HX0VOVFJJRVMoYXApCWFwLT50eF9yaW5nX2VudHJpZXMKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfQUxURU9OCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQUxURU9OCQkweDEyYWUJCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9BTFRFT05fQUNFTklDX0ZJQlJFCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxURU9OX0FDRU5JQ19GSUJSRSAgMHgwMDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxURU9OX0FDRU5JQ19DT1BQRVIgMHgwMDAyCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF8zQ09NXzNDOTg1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzk4NQkweDAwMDEKKyNlbmRpZgorI2lmbmRlZiBQQ0lfVkVORE9SX0lEX05FVEdFQVIKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ORVRHRUFSCQkweDEzODUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ORVRHRUFSX0dBNjIwCTB4NjIwYQorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfTkVUR0VBUl9HQTYyMFQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ORVRHRUFSX0dBNjIwVAkweDYzMGEKKyNlbmRpZgorCisKKy8qCisgKiBGYXJhbGxvbiB1c2VkIHRoZSBERUMgdmVuZG9yIElEIGJ5IG1pc3Rha2UgYW5kIHRoZXkgc2VlbSBub3QKKyAqIHRvIGNhcmUgLSBzdGlua3khCisgKi8KKyNpZm5kZWYgUENJX0RFVklDRV9JRF9GQVJBTExPTl9QTjkwMDBTWAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0ZBUkFMTE9OX1BOOTAwMFNYCTB4MWEKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0ZBUkFMTE9OX1BOOTEwMFQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9GQVJBTExPTl9QTjkxMDBUICAweGZhCisjZW5kaWYKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9TR0kKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TR0kJCTB4MTBhOQorI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfU0dJX0FDRU5JQworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NHSV9BQ0VOSUMJMHgwMDA5CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFjZW5pY19wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0FMVEVPTiwgUENJX0RFVklDRV9JRF9BTFRFT05fQUNFTklDX0ZJQlJFLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX05FVFdPUktfRVRIRVJORVQgPDwgOCwgMHhmZmZmMDAsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FMVEVPTiwgUENJX0RFVklDRV9JRF9BTFRFT05fQUNFTklDX0NPUFBFUiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9DTEFTU19ORVRXT1JLX0VUSEVSTkVUIDw8IDgsIDB4ZmZmZjAwLCB9LAorCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCBQQ0lfREVWSUNFX0lEXzNDT01fM0M5ODUsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQ0xBU1NfTkVUV09SS19FVEhFUk5FVCA8PCA4LCAweGZmZmYwMCwgfSwKKwl7IFBDSV9WRU5ET1JfSURfTkVUR0VBUiwgUENJX0RFVklDRV9JRF9ORVRHRUFSX0dBNjIwLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX05FVFdPUktfRVRIRVJORVQgPDwgOCwgMHhmZmZmMDAsIH0sCisJeyBQQ0lfVkVORE9SX0lEX05FVEdFQVIsIFBDSV9ERVZJQ0VfSURfTkVUR0VBUl9HQTYyMFQsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQ0xBU1NfTkVUV09SS19FVEhFUk5FVCA8PCA4LCAweGZmZmYwMCwgfSwKKwkvKgorCSAqIEZhcmFsbG9uIHVzZWQgdGhlIERFQyB2ZW5kb3IgSUQgb24gdGhlaXIgY2FyZHMgaW5jb3JyZWN0bHksCisJICogdGhlbiBsYXRlciBBbHRlb24ncyBJRC4KKwkgKi8KKwl7IFBDSV9WRU5ET1JfSURfREVDLCBQQ0lfREVWSUNFX0lEX0ZBUkFMTE9OX1BOOTAwMFNYLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX05FVFdPUktfRVRIRVJORVQgPDwgOCwgMHhmZmZmMDAsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FMVEVPTiwgUENJX0RFVklDRV9JRF9GQVJBTExPTl9QTjkxMDBULAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX05FVFdPUktfRVRIRVJORVQgPDwgOCwgMHhmZmZmMDAsIH0sCisJeyBQQ0lfVkVORE9SX0lEX1NHSSwgUENJX0RFVklDRV9JRF9TR0lfQUNFTklDLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX05FVFdPUktfRVRIRVJORVQgPDwgOCwgMHhmZmZmMDAsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFjZW5pY19wY2lfdGJsKTsKKworI2lmbmRlZiBTRVRfTkVUREVWX0RFVgorI2RlZmluZSBTRVRfTkVUREVWX0RFVihuZXQsIHBkZXYpCWRve30gd2hpbGUoMCkKKyNlbmRpZgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IDB4MjA1MWMKKyNkZWZpbmUgYWNlX3N5bmNfaXJxKGlycSkJc3luY2hyb25pemVfaXJxKGlycSkKKyNlbHNlCisjZGVmaW5lIGFjZV9zeW5jX2lycShpcnEpCXN5bmNocm9uaXplX2lycSgpCisjZW5kaWYKKworI2lmbmRlZiBvZmZzZXRfaW5fcGFnZQorI2RlZmluZSBvZmZzZXRfaW5fcGFnZShwdHIpCSgodW5zaWduZWQgbG9uZykocHRyKSAmIH5QQUdFX01BU0spCisjZW5kaWYKKworI2RlZmluZSBBQ0VfTUFYX01PRF9QQVJNUwk4CisjZGVmaW5lIEJPQVJEX0lEWF9TVEFUSUMJMAorI2RlZmluZSBCT0FSRF9JRFhfT1ZFUkZMT1cJLTEKKworI2lmIChkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkpICYmIFwKKwlkZWZpbmVkKE5FVElGX0ZfSFdfVkxBTl9SWCkKKyNkZWZpbmUgQUNFTklDX0RPX1ZMQU4JCTEKKyNkZWZpbmUgQUNFX1JDQl9WTEFOX0ZMQUcJUkNCX0ZMR19WTEFOX0FTU0lTVAorI2Vsc2UKKyNkZWZpbmUgQUNFTklDX0RPX1ZMQU4JCTAKKyNkZWZpbmUgQUNFX1JDQl9WTEFOX0ZMQUcJMAorI2VuZGlmCisKKyNpbmNsdWRlICJhY2VuaWMuaCIKKworLyoKKyAqIFRoZXNlIG11c3QgYmUgZGVmaW5lZCBiZWZvcmUgdGhlIGZpcm13YXJlIGlzIGluY2x1ZGVkLgorICovCisjZGVmaW5lIE1BWF9URVhUX0xFTgk5NioxMDI0CisjZGVmaW5lIE1BWF9ST0RBVEFfTEVOCTgqMTAyNAorI2RlZmluZSBNQVhfREFUQV9MRU4JMioxMDI0CisKKyNpbmNsdWRlICJhY2VuaWNfZmlybXdhcmUuaCIKKworI2lmbmRlZiB0aWdvbjJGd1JlbGVhc2VMb2NhbAorI2RlZmluZSB0aWdvbjJGd1JlbGVhc2VMb2NhbCAwCisjZW5kaWYKKworLyoKKyAqIFRoaXMgZHJpdmVyIGN1cnJlbnRseSBzdXBwb3J0cyBUaWdvbiBJIGFuZCBUaWdvbiBJSSBiYXNlZCBjYXJkcworICogaW5jbHVkaW5nIHRoZSBBbHRlb24gQWNlTklDLCB0aGUgM0NvbSAzQzk4NVtCXSBhbmQgTmV0R2VhcgorICogR0E2MjAuIFRoZSBkcml2ZXIgc2hvdWxkIGFsc28gd29yayBvbiB0aGUgU0dJLCBERUMgYW5kIEZhcmFsbG9uCisgKiB2ZXJzaW9ucyBvZiB0aGUgY2FyZCwgaG93ZXZlciBJIGhhdmUgbm90IGJlZW4gYWJsZSB0byB0ZXN0IHRoYXQKKyAqIG15c2VsZi4KKyAqCisgKiBUaGlzIGNhcmQgaXMgcmVhbGx5IG5lYXQsIGl0IHN1cHBvcnRzIHJlY2VpdmUgaGFyZHdhcmUgY2hlY2tzdW1taW5nCisgKiBhbmQganVtYm8gZnJhbWVzICh1cCB0byA5MDAwIGJ5dGVzKSBhbmQgZG9lcyBhIGxvdCBvZiB3b3JrIGluIHRoZQorICogZmlybXdhcmUuIEFsc28gdGhlIHByb2dyYW1taW5nIGludGVyZmFjZSBpcyBxdWl0ZSBuZWF0LCBleGNlcHQgZm9yCisgKiB0aGUgcGFydHMgZGVhbGluZyB3aXRoIHRoZSBpMmMgZWVwcm9tIG9uIHRoZSBjYXJkIDstKQorICoKKyAqIFVzaW5nIGp1bWJvIGZyYW1lczoKKyAqCisgKiBUbyBlbmFibGUganVtYm8gZnJhbWVzLCBzaW1wbHkgc3BlY2lmeSBhbiBtdHUgYmV0d2VlbiAxNTAwIGFuZCA5MDAwCisgKiBieXRlcyB0byBpZmNvbmZpZy4gSnVtYm8gZnJhbWVzIGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkIGF0IGFueSB0aW1lCisgKiBieSBydW5uaW5nIGBpZmNvbmZpZyBldGg8WD4gbXR1IDxNVFU+JyB3aXRoIDxYPiBiZWluZyB0aGUgRXRoZXJuZXQKKyAqIGludGVyZmFjZSBudW1iZXIgYW5kIDxNVFU+IGJlaW5nIHRoZSBNVFUgdmFsdWUuCisgKgorICogTW9kdWxlIHBhcmFtZXRlcnM6CisgKgorICogV2hlbiBjb21waWxlZCBhcyBhIGxvYWRhYmxlIG1vZHVsZSwgdGhlIGRyaXZlciBhbGxvd3MgZm9yIGEgbnVtYmVyCisgKiBvZiBtb2R1bGUgcGFyYW1ldGVycyB0byBiZSBzcGVjaWZpZWQuIFRoZSBkcml2ZXIgc3VwcG9ydHMgdGhlCisgKiBmb2xsb3dpbmcgbW9kdWxlIHBhcmFtZXRlcnM6CisgKgorICogIHRyYWNlPTx2YWw+IC0gRmlybXdhcmUgdHJhY2UgbGV2ZWwuIFRoaXMgcmVxdWlyZXMgc3BlY2lhbCB0cmFjZWQKKyAqICAgICAgICAgICAgICAgIGZpcm13YXJlIHRvIHJlcGxhY2UgdGhlIGZpcm13YXJlIHN1cHBsaWVkIHdpdGgKKyAqICAgICAgICAgICAgICAgIHRoZSBkcml2ZXIgLSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHkuCisgKgorICogIGxpbms9PHZhbD4gIC0gTGluayBzdGF0ZS4gTm9ybWFsbHkgeW91IHdhbnQgdG8gdXNlIHRoZSBkZWZhdWx0IGxpbmsKKyAqICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgc2V0IGJ5IHRoZSBkcml2ZXIuIFRoaXMgY2FuIGJlIHVzZWQgdG8KKyAqICAgICAgICAgICAgICAgIG92ZXJyaWRlIHRoZXNlIGluIGNhc2UgeW91ciBzd2l0Y2ggZG9lc24ndCBuZWdvdGlhdGUKKyAqICAgICAgICAgICAgICAgIHRoZSBsaW5rIHByb3Blcmx5LiBWYWxpZCB2YWx1ZXMgYXJlOgorICogICAgICAgICAweDAwMDEgLSBGb3JjZSBoYWxmIGR1cGxleCBsaW5rLgorICogICAgICAgICAweDAwMDIgLSBEbyBub3QgbmVnb3RpYXRlIGxpbmUgc3BlZWQgd2l0aCB0aGUgb3RoZXIgZW5kLgorICogICAgICAgICAweDAwMTAgLSAxME1iaXQvc2VjIGxpbmsuCisgKiAgICAgICAgIDB4MDAyMCAtIDEwME1iaXQvc2VjIGxpbmsuCisgKiAgICAgICAgIDB4MDA0MCAtIDEwMDBNYml0L3NlYyBsaW5rLgorICogICAgICAgICAweDAxMDAgLSBEbyBub3QgbmVnb3RpYXRlIGZsb3cgY29udHJvbC4KKyAqICAgICAgICAgMHgwMjAwIC0gRW5hYmxlIFJYIGZsb3cgY29udHJvbCBZCisgKiAgICAgICAgIDB4MDQwMCAtIEVuYWJsZSBUWCBmbG93IGNvbnRyb2wgWSAoVGlnb24gSUkgTklDcyBvbmx5KS4KKyAqICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWUgaXMgMHgwMjcwLCBpZS4gZW5hYmxlIGxpbmsrZmxvdworICogICAgICAgICAgICAgICAgY29udHJvbCBuZWdvdGlhdGlvbi4gTmVnb3RpYXRpbmcgdGhlIGhpZ2hlc3QKKyAqICAgICAgICAgICAgICAgIHBvc3NpYmxlIGxpbmsgc3BlZWQgd2l0aCBSWCBmbG93IGNvbnRyb2wgZW5hYmxlZC4KKyAqCisgKiAgICAgICAgICAgICAgICBXaGVuIGRpc2FibGluZyBsaW5rIHNwZWVkIG5lZ290aWF0aW9uLCBvbmx5IG9uZSBsaW5rCisgKiAgICAgICAgICAgICAgICBzcGVlZCBpcyBhbGxvd2VkIHRvIGJlIHNwZWNpZmllZCEKKyAqCisgKiAgdHhfY29hbF90aWNrPTx2YWw+IC0gbnVtYmVyIG9mIGNvYWxlc2NpbmcgY2xvY2sgdGlja3MgKHVzKSBhbGxvd2VkCisgKiAgICAgICAgICAgICAgICB0byB3YWl0IGZvciBtb3JlIHBhY2tldHMgdG8gYXJpdmUgYmVmb3JlCisgKiAgICAgICAgICAgICAgICBpbnRlcnJ1cHRpbmcgdGhlIGhvc3QsIGZyb20gdGhlIHRpbWUgdGhlIGZpcnN0CisgKiAgICAgICAgICAgICAgICBwYWNrZXQgYXJyaXZlcy4KKyAqCisgKiAgcnhfY29hbF90aWNrPTx2YWw+IC0gbnVtYmVyIG9mIGNvYWxlc2NpbmcgY2xvY2sgdGlja3MgKHVzKSBhbGxvd2VkCisgKiAgICAgICAgICAgICAgICB0byB3YWl0IGZvciBtb3JlIHBhY2tldHMgdG8gYXJpdmUgaW4gdGhlIHRyYW5zbWl0IHJpbmcsCisgKiAgICAgICAgICAgICAgICBiZWZvcmUgaW50ZXJydXB0aW5nIHRoZSBob3N0LCBhZnRlciB0cmFuc21pdHRpbmcgdGhlCisgKiAgICAgICAgICAgICAgICBmaXJzdCBwYWNrZXQgaW4gdGhlIHJpbmcuCisgKgorICogIG1heF90eF9kZXNjPTx2YWw+IC0gbWF4aW11bSBudW1iZXIgb2YgdHJhbnNtaXQgZGVzY3JpcHRvcnMKKyAqICAgICAgICAgICAgICAgIChwYWNrZXRzKSB0cmFuc21pdHRlZCBiZWZvcmUgaW50ZXJydXB0aW5nIHRoZSBob3N0LgorICoKKyAqICBtYXhfcnhfZGVzYz08dmFsPiAtIG1heGltdW0gbnVtYmVyIG9mIHJlY2VpdmUgZGVzY3JpcHRvcnMKKyAqICAgICAgICAgICAgICAgIChwYWNrZXRzKSByZWNlaXZlZCBiZWZvcmUgaW50ZXJydXB0aW5nIHRoZSBob3N0LgorICoKKyAqICB0eF9yYXRpbz08dmFsPiAtIDcgYml0IHZhbHVlICgwIC0gNjMpIHNwZWNpZnlpbmcgdGhlIHNwbGl0IGluIDY0dGgKKyAqICAgICAgICAgICAgICAgIGluY3JlbWVudHMgb2YgdGhlIE5JQydzIG9uIGJvYXJkIG1lbW9yeSB0byBiZSB1c2VkIGZvcgorICogICAgICAgICAgICAgICAgdHJhbnNtaXQgYW5kIHJlY2VpdmUgYnVmZmVycy4gRm9yIHRoZSAxTUIgTklDIGFwcC4gODAwS0IKKyAqICAgICAgICAgICAgICAgIGlzIGF2YWlsYWJsZSwgb24gdGhlIDEvMk1CIE5JQyBhcHAuIDMwMEtCIGlzIGF2YWlsYWJsZS4KKyAqICAgICAgICAgICAgICAgIDY4S0Igd2lsbCBhbHdheXMgYmUgYXZhaWxhYmxlIGFzIGEgbWluaW11bSBmb3IgYm90aAorICogICAgICAgICAgICAgICAgZGlyZWN0aW9ucy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYSA1MC81MCBzcGxpdC4KKyAqICBkaXNfcGNpX21lbV9pbnZhbD08dmFsPiAtIGRpc2FibGUgUENJIG1lbW9yeSB3cml0ZSBhbmQgaW52YWxpZGF0ZQorICogICAgICAgICAgICAgICAgb3BlcmF0aW9ucywgZGVmYXVsdCAoMSkgaXMgdG8gYWx3YXlzIGRpc2FibGUgdGhpcyBhcworICogICAgICAgICAgICAgICAgdGhhdCBpcyB3aGF0IEFsdGVvbiBkb2VzIG9uIE5ULiBJIGhhdmUgbm90IGJlZW4gYWJsZQorICogICAgICAgICAgICAgICAgdG8gbWVhc3VyZSBhbnkgcmVhbCBwZXJmb3JtYW5jZSBkaWZmZXJlbmNlcyB3aXRoCisgKiAgICAgICAgICAgICAgICB0aGlzIG9uIG15IHN5c3RlbXMuIFNldCA8dmFsPj0wIGlmIHlvdSB3YW50IHRvCisgKiAgICAgICAgICAgICAgICBlbmFibGUgdGhlc2Ugb3BlcmF0aW9ucy4KKyAqCisgKiBJZiB5b3UgdXNlIG1vcmUgdGhhbiBvbmUgTklDLCBzcGVjaWZ5IHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUKKyAqIGluZGl2aWR1YWwgTklDcyB3aXRoIGEgY29tbWEsIGllLiB0cmFjZT0wLDB4MDAwMDFmZmYsMCB5b3Ugd2FudCB0bworICogcnVuIHRyYWNpbmcgb24gTklDICMyIGJ1dCBub3Qgb24gTklDICMxIGFuZCAjMy4KKyAqCisgKiBUT0RPOgorICoKKyAqIC0gUHJvcGVyIG11bHRpY2FzdCBzdXBwb3J0LgorICogLSBOSUMgZHVtcCBzdXBwb3J0LgorICogLSBNb3JlIHR1bmluZyBwYXJhbWV0ZXJzLgorICoKKyAqIFRoZSBtaW5pIHJpbmcgaXMgbm90IHVzZWQgdW5kZXIgTGludXggYW5kIEkgYW0gbm90IHN1cmUgaXQgbWFrZXMgc2Vuc2UKKyAqIHRvIGFjdHVhbGx5IHVzZSBpdC4KKyAqCisgKiBOZXcgaW50ZXJydXB0IGhhbmRsZXIgc3RyYXRlZ3k6CisgKgorICogVGhlIG9sZCBpbnRlcnJ1cHQgaGFuZGxlciB3b3JrZWQgdXNpbmcgdGhlIHRyYWRpdGlvbmFsIG1ldGhvZCBvZgorICogcmVwbGFjaW5nIGFuIHNrYnVmZiB3aXRoIGEgbmV3IG9uZSB3aGVuIGEgcGFja2V0IGFycml2ZXMuIEhvd2V2ZXIKKyAqIHRoZSByeCByaW5ncyBkbyBub3QgbmVlZCB0byBjb250YWluIGEgc3RhdGljIG51bWJlciBvZiBidWZmZXIKKyAqIGRlc2NyaXB0b3JzLCB0aHVzIGl0IG1ha2VzIHNlbnNlIHRvIG1vdmUgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIG91dAorICogb2YgdGhlIG1haW4gaW50ZXJydXB0IGhhbmRsZXIgYW5kIGRvIGl0IGluIGEgYm90dG9tIGhhbGYgaGFuZGxlcgorICogYW5kIG9ubHkgYWxsb2NhdGUgbmV3IGJ1ZmZlcnMgd2hlbiB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgaW4gdGhlCisgKiByaW5nIGlzIGJlbG93IGEgY2VydGFpbiB0aHJlc2hvbGQuIEluIG9yZGVyIHRvIGF2b2lkIHN0YXJ2aW5nIHRoZQorICogTklDIHVuZGVyIGhlYXZ5IGxvYWQgaXQgaXMgaG93ZXZlciBuZWNlc3NhcnkgdG8gZm9yY2UgYWxsb2NhdGlvbgorICogd2hlbiBoaXR0aW5nIGEgbWluaW11bSB0aHJlc2hvbGQuIFRoZSBzdHJhdGVneSBmb3IgYWxsb2N0aW9uIGlzIGFzCisgKiBmb2xsb3dzOgorICoKKyAqICAgICBSWF9MT1dfQlVGX1RIUkVTICAgIC0gYWxsb2NhdGUgYnVmZmVycyBpbiB0aGUgYm90dG9tIGhhbGYKKyAqICAgICBSWF9QQU5JQ19MT1dfVEhSRVMgIC0gd2UgYXJlIHZlcnkgbG93IG9uIGJ1ZmZlcnMsIGFsbG9jYXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBidWZmZXJzIGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgorICogICAgIFJYX1JJTkdfVEhSRVMgICAgICAgLSBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIGluIHRoZSByeCByaW5nCisgKiAgICAgUlhfTUlOSV9USFJFUyAgICAgICAtIG1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgaW4gdGhlIG1pbmkgcmluZworICogICAgIFJYX0pVTUJPX1RIUkVTICAgICAgLSBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIGluIHRoZSBqdW1ibyByaW5nCisgKgorICogT25lIGFkdmFudGFnb3VzIHNpZGUgZWZmZWN0IG9mIHRoaXMgYWxsb2NhdGlvbiBhcHByb2FjaCBpcyB0aGF0IHRoZQorICogZW50aXJlIHJ4IHByb2Nlc3NpbmcgY2FuIGJlIGRvbmUgd2l0aG91dCBob2xkaW5nIGFueSBzcGluIGxvY2sKKyAqIHNpbmNlIHRoZSByeCByaW5ncyBhbmQgcmVnaXN0ZXJzIGFyZSB0b3RhbGx5IGluZGVwZW5kZW50IG9mIHRoZSB0eAorICogcmluZyBhbmQgaXRzIHJlZ2lzdGVycy4gIFRoaXMgb2YgY291cnNlIGluY2x1ZGVzIHRoZSBrbWFsbG9jJ3Mgb2YKKyAqIG5ldyBza2Incy4gVGh1cyBzdGFydF94bWl0IGNhbiBydW4gaW4gcGFyYWxsZWwgd2l0aCByeCBwcm9jZXNzaW5nCisgKiBhbmQgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIG9uIFNNUCBzeXN0ZW1zLgorICoKKyAqIE5vdGUgdGhhdCBydW5uaW5nIHRoZSBza2IgcmVhbGxvY2F0aW9uIGluIGEgYm90dG9tIGhhbGYgb3BlbnMgdXAKKyAqIGFub3RoZXIgY2FuIG9mIHJhY2VzIHdoaWNoIG5lZWRzIHRvIGJlIGhhbmRsZWQgcHJvcGVybHkuIEluCisgKiBwYXJ0aWN1bGFyIGl0IGNhbiBoYXBwZW4gdGhhdCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgdHJpZXMgdG8gcnVuCisgKiB0aGUgcmVhbGxvY2F0aW9uIHdoaWxlIHRoZSBib3R0b20gaGFsZiBpcyBlaXRoZXIgcnVubmluZyBvbiBhbm90aGVyCisgKiBDUFUgb3Igd2FzIGludGVycnVwdGVkIG9uIHRoZSBzYW1lIENQVS4gVG8gZ2V0IGFyb3VuZCB0aGlzIHRoZQorICogZHJpdmVyIHVzZXMgYml0b3BzIHRvIHByZXZlbnQgdGhlIHJlYWxsb2NhdGlvbiByb3V0aW5lcyBmcm9tIGJlaW5nCisgKiByZWVudGVyZWQuCisgKgorICogVFggaGFuZGxpbmcgY2FuIGFsc28gYmUgZG9uZSB3aXRob3V0IGhvbGRpbmcgYW55IHNwaW4gbG9jaywgd2hlZWUKKyAqIHRoaXMgaXMgZnVuISBzaW5jZSB0eF9yZXRfY3NtIGlzIG9ubHkgd3JpdHRlbiB0byBieSB0aGUgaW50ZXJydXB0CisgKiBoYW5kbGVyLiBUaGUgY2FzZSB0byBiZSBhd2FyZSBvZiBpcyB3aGVuIHNodXR0aW5nIGRvd24gdGhlIGRldmljZQorICogYW5kIGNsZWFuaW5nIHVwIHdoZXJlIGl0IGlzIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgdGhhdAorICogc3RhcnRfeG1pdCgpIGlzIG5vdCBydW5uaW5nIHdoaWxlIHRoaXMgaXMgaGFwcGVuaW5nLiBXZWxsIERhdmVNCisgKiBpbmZvcm1zIG1lIHRoYXQgdGhpcyBjYXNlIGlzIGFscmVhZHkgcHJvdGVjdGVkIGFnYWluc3QgLi4uIGJ5ZSBieWUKKyAqIE1yLiBTcGluIExvY2ssIGl0IHdhcyBuaWNlIHRvIGtub3cgeW91LgorICoKKyAqIFRYIGludGVycnVwdHMgYXJlIG5vdyBwYXJ0bHkgZGlzYWJsZWQgc28gdGhlIE5JQyB3aWxsIG9ubHkgZ2VuZXJhdGUKKyAqIFRYIGludGVycnVwdHMgZm9yIHRoZSBudW1iZXIgb2YgY29hbCB0aWNrcywgbm90IGZvciB0aGUgbnVtYmVyIG9mCisgKiBUWCBwYWNrZXRzIGluIHRoZSBxdWV1ZS4gVGhpcyBzaG91bGQgcmVkdWNlIHRoZSBudW1iZXIgb2YgVFggb25seSwKKyAqIGllLiB3aGVuIG5vIFJYIHByb2Nlc3NpbmcgaXMgZG9uZSwgaW50ZXJydXB0cyBzZWVuLgorICovCisKKy8qCisgKiBUaHJlc2hvbGQgdmFsdWVzIGZvciBSWCBidWZmZXIgYWxsb2NhdGlvbiAtIHRoZSBsb3cgd2F0ZXIgbWFya3MgZm9yCisgKiB3aGVuIHRvIHN0YXJ0IHJlZmlsbGluZyB0aGUgcmluZ3MgYXJlIHNldCB0byA3NSUgb2YgdGhlIHJpbmcKKyAqIHNpemVzLiBJdCBzZWVtcyB0byBtYWtlIHNlbnNlIHRvIHJlZmlsbCB0aGUgcmluZ3MgZW50aXJlbHkgZnJvbSB0aGUKKyAqIGludHJydXB0IGhhbmRsZXIgb25jZSBpdCBnZXRzIGJlbG93IHRoZSBwYW5pYyB0aHJlc2hvbGQsIHRoYXQgd2F5CisgKiB3ZSBkb24ndCByaXNrIHRoYXQgdGhlIHJlZmlsbGluZyBpcyBtb3ZlZCB0byBhbm90aGVyIENQVSB3aGVuIHRoZQorICogb25lIHJ1bm5pbmcgdGhlIGludGVycnVwdCBoYW5kbGVyIGp1c3QgZ290IHRoZSBzbGFiIGNvZGUgaG90IGluIGl0cworICogY2FjaGUuCisgKi8KKyNkZWZpbmUgUlhfUklOR19TSVpFCQk3MgorI2RlZmluZSBSWF9NSU5JX1NJWkUJCTY0CisjZGVmaW5lIFJYX0pVTUJPX1NJWkUJCTQ4CisKKyNkZWZpbmUgUlhfUEFOSUNfU1REX1RIUkVTCTE2CisjZGVmaW5lIFJYX1BBTklDX1NURF9SRUZJTEwJKDMqUlhfUEFOSUNfU1REX1RIUkVTKS8yCisjZGVmaW5lIFJYX0xPV19TVERfVEhSRVMJKDMqUlhfUklOR19TSVpFKS80CisjZGVmaW5lIFJYX1BBTklDX01JTklfVEhSRVMJMTIKKyNkZWZpbmUgUlhfUEFOSUNfTUlOSV9SRUZJTEwJKDMqUlhfUEFOSUNfTUlOSV9USFJFUykvMgorI2RlZmluZSBSWF9MT1dfTUlOSV9USFJFUwkoMypSWF9NSU5JX1NJWkUpLzQKKyNkZWZpbmUgUlhfUEFOSUNfSlVNQk9fVEhSRVMJNgorI2RlZmluZSBSWF9QQU5JQ19KVU1CT19SRUZJTEwJKDMqUlhfUEFOSUNfSlVNQk9fVEhSRVMpLzIKKyNkZWZpbmUgUlhfTE9XX0pVTUJPX1RIUkVTCSgzKlJYX0pVTUJPX1NJWkUpLzQKKworCisvKgorICogU2l6ZSBvZiB0aGUgbWluaSByaW5nIGVudHJpZXMsIGJhc2ljYWxseSB0aGVzZSBqdXN0IHNob3VsZCBiZSBiaWcKKyAqIGVub3VnaCB0byB0YWtlIFRDUCBBQ0tzCisgKi8KKyNkZWZpbmUgQUNFX01JTklfU0laRQkJMTAwCisKKyNkZWZpbmUgQUNFX01JTklfQlVGU0laRQlBQ0VfTUlOSV9TSVpFCisjZGVmaW5lIEFDRV9TVERfQlVGU0laRQkJKEFDRV9TVERfTVRVICsgRVRIX0hMRU4gKyA0KQorI2RlZmluZSBBQ0VfSlVNQk9fQlVGU0laRQkoQUNFX0pVTUJPX01UVSArIEVUSF9ITEVOICsgNCkKKworLyoKKyAqIFRoZXJlIHNlZW1zIHRvIGJlIGEgbWFnaWMgZGlmZmVyZW5jZSBpbiB0aGUgZWZmZWN0IGJldHdlZW4gOTk1IGFuZCA5OTYKKyAqIGJ1dCBsaXR0bGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDkwMCBhbmQgOTk1IC4uLiBubyBpZGVhIHdoeS4KKyAqCisgKiBUaGVyZSBpcyBub3cgYSBkZWZhdWx0IHNldCBvZiB0dW5pbmcgcGFyYW1ldGVycyB3aGljaCBpcyBzZXQsIGRlcGVuZGluZworICogb24gd2hldGhlciBvciBub3QgdGhlIHVzZXIgZW5hYmxlcyBKdW1ibyBmcmFtZXMuIEl0J3MgYXNzdW1lZCB0aGF0IGlmCisgKiBKdW1ibyBmcmFtZXMgYXJlIGVuYWJsZWQsIHRoZSB1c2VyIHdhbnRzIG9wdGltYWwgdHVuaW5nIGZvciB0aGF0IGNhc2UuCisgKi8KKyNkZWZpbmUgREVGX1RYX0NPQUwJCTQwMCAvKiA5OTYgKi8KKyNkZWZpbmUgREVGX1RYX01BWF9ERVNDCQk2MCAgLyogd2FzIDQwICovCisjZGVmaW5lIERFRl9SWF9DT0FMCQkxMjAgLyogMTAwMCAqLworI2RlZmluZSBERUZfUlhfTUFYX0RFU0MJCTI1CisjZGVmaW5lIERFRl9UWF9SQVRJTwkJMjEgLyogMjQgKi8KKworI2RlZmluZSBERUZfSlVNQk9fVFhfQ09BTAkyMAorI2RlZmluZSBERUZfSlVNQk9fVFhfTUFYX0RFU0MJNjAKKyNkZWZpbmUgREVGX0pVTUJPX1JYX0NPQUwJMzAKKyNkZWZpbmUgREVGX0pVTUJPX1JYX01BWF9ERVNDCTYKKyNkZWZpbmUgREVGX0pVTUJPX1RYX1JBVElPCTIxCisKKyNpZiB0aWdvbjJGd1JlbGVhc2VMb2NhbCA8IDIwMDAxMTE4CisvKgorICogU3RhbmRhcmQgZmlybXdhcmUgYW5kIGVhcmx5IG1vZGlmaWNhdGlvbnMgZHVwbGljYXRlCisgKiBJUlEgbG9hZCB3aXRob3V0IHRoaXMgZmxhZyAoY29hbCB0aW1lciBpcyBuZXZlciByZXNldCkuCisgKiBOb3RlIHRoYXQgd2l0aCB0aGlzIGZsYWcgdHhfY29hbCBzaG91bGQgYmUgbGVzcyB0aGFuCisgKiB0aW1lIHRvIHhtaXQgZnVsbCB0eCByaW5nLgorICogNDAwdXNlYyBpcyBub3Qgc28gYmFkIGZvciB0eCByaW5nIHNpemUgb2YgMTI4LgorICovCisjZGVmaW5lIFRYX0NPQUxfSU5UU19PTkxZCTEJLyogd29ydGggaXQgKi8KKyNlbHNlCisvKgorICogV2l0aCBtb2RpZmllZCBmaXJtd2FyZSwgdGhpcyBpcyBub3QgbmVjZXNzYXJ5LCBidXQgc3RpbGwgdXNlZnVsLgorICovCisjZGVmaW5lIFRYX0NPQUxfSU5UU19PTkxZCTEKKyNlbmRpZgorCisjZGVmaW5lIERFRl9UUkFDRQkJMAorI2RlZmluZSBERUZfU1RBVAkJKDIgKiBUSUNLU19QRVJfU0VDKQorCisKK3N0YXRpYyBpbnQgbGlua1tBQ0VfTUFYX01PRF9QQVJNU107CitzdGF0aWMgaW50IHRyYWNlW0FDRV9NQVhfTU9EX1BBUk1TXTsKK3N0YXRpYyBpbnQgdHhfY29hbF90aWNrW0FDRV9NQVhfTU9EX1BBUk1TXTsKK3N0YXRpYyBpbnQgcnhfY29hbF90aWNrW0FDRV9NQVhfTU9EX1BBUk1TXTsKK3N0YXRpYyBpbnQgbWF4X3R4X2Rlc2NbQUNFX01BWF9NT0RfUEFSTVNdOworc3RhdGljIGludCBtYXhfcnhfZGVzY1tBQ0VfTUFYX01PRF9QQVJNU107CitzdGF0aWMgaW50IHR4X3JhdGlvW0FDRV9NQVhfTU9EX1BBUk1TXTsKK3N0YXRpYyBpbnQgZGlzX3BjaV9tZW1faW52YWxbQUNFX01BWF9NT0RfUEFSTVNdID0gezEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9OworCitNT0RVTEVfQVVUSE9SKCJKZXMgU29yZW5zZW4gPGplc0B0cmFpbmVkLW1vbmtleS5vcmc+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFjZU5JQy8zQzk4NS9HQTYyMCBHaWdhYml0IEV0aGVybmV0IGRyaXZlciIpOworCittb2R1bGVfcGFyYW1fYXJyYXkobGluaywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheSh0cmFjZSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheSh0eF9jb2FsX3RpY2ssIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkobWF4X3R4X2Rlc2MsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkocnhfY29hbF90aWNrLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG1heF9yeF9kZXNjLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KHR4X3JhdGlvLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhsaW5rLCAiQWNlTklDLzNDOTg1L05ldEdlYXIgbGluayBzdGF0ZSIpOworTU9EVUxFX1BBUk1fREVTQyh0cmFjZSwgIkFjZU5JQy8zQzk4NS9OZXRHZWFyIGZpcm13YXJlIHRyYWNlIGxldmVsIik7CitNT0RVTEVfUEFSTV9ERVNDKHR4X2NvYWxfdGljaywgIkFjZU5JQy8zQzk4NS9HQTYyMCBtYXggY2xvY2sgdGlja3MgdG8gd2FpdCBmcm9tIGZpcnN0IHR4IGRlc2NyaXB0b3IgYXJyaXZlcyIpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfdHhfZGVzYywgIkFjZU5JQy8zQzk4NS9HQTYyMCBtYXggbnVtYmVyIG9mIHRyYW5zbWl0IGRlc2NyaXB0b3JzIHRvIHdhaXQiKTsKK01PRFVMRV9QQVJNX0RFU0MocnhfY29hbF90aWNrLCAiQWNlTklDLzNDOTg1L0dBNjIwIG1heCBjbG9jayB0aWNrcyB0byB3YWl0IGZyb20gZmlyc3QgcnggZGVzY3JpcHRvciBhcnJpdmVzIik7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9yeF9kZXNjLCAiQWNlTklDLzNDOTg1L0dBNjIwIG1heCBudW1iZXIgb2YgcmVjZWl2ZSBkZXNjcmlwdG9ycyB0byB3YWl0Iik7CitNT0RVTEVfUEFSTV9ERVNDKHR4X3JhdGlvLCAiQWNlTklDLzNDOTg1L0dBNjIwIHJhdGlvIG9mIE5JQyBtZW1vcnkgdXNlZCBmb3IgVFgvUlggZGVzY3JpcHRvcnMgKHJhbmdlIDAtNjMpIik7CisKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPSAKKyAgImFjZW5pYy5jOiB2MC45MiAwOC8wNS8yMDAyICBKZXMgU29yZW5zZW4sIGxpbnV4LWFjZW5pY0BTdW5TSVRFLmRrXG4iCisgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL2hvbWUuY2Vybi5jaC9+amVzL2dpZ2UvYWNlbmljLmh0bWxcbiI7CisKK3N0YXRpYyBpbnQgYWNlX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgZXRodG9vbF9jbWQgKik7CitzdGF0aWMgaW50IGFjZV9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGV0aHRvb2xfY21kICopOworc3RhdGljIHZvaWQgYWNlX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBldGh0b29sX2RydmluZm8gKik7CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgYWNlX2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MgPSBhY2VfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgPSBhY2Vfc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbyA9IGFjZV9nZXRfZHJ2aW5mbywKK307CisKK3N0YXRpYyB2b2lkIGFjZV93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWNlbmljX3Byb2JlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGFjZV9wcml2YXRlICphcDsKKwlzdGF0aWMgaW50IGJvYXJkc19mb3VuZDsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgYWNlX3ByaXZhdGUpKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhY2VuaWM6IFVuYWJsZSB0byBhbGxvY2F0ZSAiCisJCSAgICAgICAibmV0X2RldmljZSBzdHJ1Y3R1cmUhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlhcCA9IGRldi0+cHJpdjsKKwlhcC0+cGRldiA9IHBkZXY7CisJYXAtPm5hbWUgPSBwY2lfbmFtZShwZGV2KTsKKworCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSVBfQ1NVTTsKKyNpZiBBQ0VOSUNfRE9fVkxBTgorCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYOworCWRldi0+dmxhbl9yeF9yZWdpc3RlciA9IGFjZV92bGFuX3J4X3JlZ2lzdGVyOworCWRldi0+dmxhbl9yeF9raWxsX3ZpZCA9IGFjZV92bGFuX3J4X2tpbGxfdmlkOworI2VuZGlmCisJaWYgKDEpIHsKKwkJZGV2LT50eF90aW1lb3V0ID0gJmFjZV93YXRjaGRvZzsKKwkJZGV2LT53YXRjaGRvZ190aW1lbyA9IDUqSFo7CisJfQorCisJZGV2LT5vcGVuID0gJmFjZV9vcGVuOworCWRldi0+c3RvcCA9ICZhY2VfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmYWNlX3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgPSAmYWNlX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZhY2Vfc2V0X211bHRpY2FzdF9saXN0OworCVNFVF9FVEhUT09MX09QUyhkZXYsICZhY2VfZXRodG9vbF9vcHMpOworCWRldi0+c2V0X21hY19hZGRyZXNzID0gJmFjZV9zZXRfbWFjX2FkZHI7CisJZGV2LT5jaGFuZ2VfbXR1ID0gJmFjZV9jaGFuZ2VfbXR1OworCisJLyogd2Ugb25seSBkaXNwbGF5IHRoaXMgc3RyaW5nIE9OQ0UgKi8KKwlpZiAoIWJvYXJkc19mb3VuZCkKKwkJcHJpbnRrKHZlcnNpb24pOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlnb3RvIGZhaWxfZnJlZV9uZXRkZXY7CisKKwkvKgorCSAqIEVuYWJsZSBtYXN0ZXIgbW9kZSBiZWZvcmUgd2Ugc3RhcnQgcGxheWluZyB3aXRoIHRoZQorCSAqIHBjaV9jb21tYW5kIHdvcmQgc2luY2UgcGNpX3NldF9tYXN0ZXIoKSB3aWxsIG1vZGlmeQorCSAqIGl0LgorCSAqLworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZhcC0+cGNpX2NvbW1hbmQpOworCisJLyogT3BlbkZpcm13YXJlIG9uIE1hYydzIGRvZXMgbm90IHNldCB0aGlzIC0gRE9ILi4gKi8gCisJaWYgKCEoYXAtPnBjaV9jb21tYW5kICYgUENJX0NPTU1BTkRfTUVNT1JZKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRW5hYmxpbmcgUENJIE1lbW9yeSBNYXBwZWQgIgorCQkgICAgICAgImFjY2VzcyAtIHdhcyBub3QgZW5hYmxlZCBieSBCSU9TL0Zpcm13YXJlXG4iLAorCQkgICAgICAgYXAtPm5hbWUpOworCQlhcC0+cGNpX2NvbW1hbmQgPSBhcC0+cGNpX2NvbW1hbmQgfCBQQ0lfQ09NTUFORF9NRU1PUlk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChhcC0+cGRldiwgUENJX0NPTU1BTkQsCisJCQkJICAgICAgYXAtPnBjaV9jb21tYW5kKTsKKwkJd21iKCk7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsICZhcC0+cGNpX2xhdGVuY3kpOworCWlmIChhcC0+cGNpX2xhdGVuY3kgPD0gMHg0MCkgeworCQlhcC0+cGNpX2xhdGVuY3kgPSAweDQwOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIGFwLT5wY2lfbGF0ZW5jeSk7CisJfQorCisJLyoKKwkgKiBSZW1hcCB0aGUgcmVncyBpbnRvIGtlcm5lbCBzcGFjZSAtIHRoaXMgaXMgYWJ1c2Ugb2YKKwkgKiBkZXYtPmJhc2VfYWRkciBzaW5jZSBpdCB3YXMgbWVhbnMgZm9yIEkvTyBwb3J0CisJICogYWRkcmVzc2VzIGJ1dCB3aG8gZ2l2ZXMgYSBkYW1uLgorCSAqLworCWRldi0+YmFzZV9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWFwLT5yZWdzID0gaW9yZW1hcChkZXYtPmJhc2VfYWRkciwgMHg0MDAwKTsKKwlpZiAoIWFwLT5yZWdzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6ICBVbmFibGUgdG8gbWFwIEkvTyByZWdpc3RlciwgIgorCQkgICAgICAgIkFjZU5JQyAlaSB3aWxsIGJlIGRpc2FibGVkLlxuIiwKKwkJICAgICAgIGFwLT5uYW1lLCBib2FyZHNfZm91bmQpOworCQlnb3RvIGZhaWxfZnJlZV9uZXRkZXY7CisJfQorCisJc3dpdGNoKHBkZXYtPnZlbmRvcikgeworCWNhc2UgUENJX1ZFTkRPUl9JRF9BTFRFT046CisJCWlmIChwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9GQVJBTExPTl9QTjkxMDBUKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRmFyYWxsb24gUE45MTAwLVQgIiwKKwkJCSAgICAgICBhcC0+bmFtZSk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQWx0ZW9uIEFjZU5JQyAiLAorCQkJICAgICAgIGFwLT5uYW1lKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFBDSV9WRU5ET1JfSURfM0NPTToKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IDNDb20gM0M5ODUgIiwgYXAtPm5hbWUpOworCQlicmVhazsKKwljYXNlIFBDSV9WRU5ET1JfSURfTkVUR0VBUjoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5ldEdlYXIgR0E2MjAgIiwgYXAtPm5hbWUpOworCQlicmVhazsKKwljYXNlIFBDSV9WRU5ET1JfSURfREVDOgorCQlpZiAocGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfRkFSQUxMT05fUE45MDAwU1gpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGYXJhbGxvbiBQTjkwMDAtU1ggIiwKKwkJCSAgICAgICBhcC0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgUENJX1ZFTkRPUl9JRF9TR0k6CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTR0kgQWNlTklDICIsIGFwLT5uYW1lKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVua25vd24gQWNlTklDICIsIGFwLT5uYW1lKTsKKwkJYnJlYWs7CisJfQorCisJcHJpbnRrKCJHaWdhYml0IEV0aGVybmV0IGF0IDB4JTA4bHgsICIsIGRldi0+YmFzZV9hZGRyKTsKKyNpZmRlZiBfX3NwYXJjX18KKwlwcmludGsoImlycSAlc1xuIiwgX19pcnFfaXRvYShwZGV2LT5pcnEpKTsKKyNlbHNlCisJcHJpbnRrKCJpcnEgJWlcbiIsIHBkZXYtPmlycSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BQ0VOSUNfT01JVF9USUdPTl9JCisJaWYgKChyZWFkbCgmYXAtPnJlZ3MtPkhvc3RDdHJsKSA+PiAyOCkgPT0gNCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBEcml2ZXIgY29tcGlsZWQgd2l0aG91dCBUaWdvbiBJIgorCQkgICAgICAgIiBzdXBwb3J0IC0gTklDIGRpc2FibGVkXG4iLCBkZXYtPm5hbWUpOworCQlnb3RvIGZhaWxfdW5pbml0OworCX0KKyNlbmRpZgorCisJaWYgKGFjZV9hbGxvY2F0ZV9kZXNjcmlwdG9ycyhkZXYpKQorCQlnb3RvIGZhaWxfZnJlZV9uZXRkZXY7CisKKyNpZmRlZiBNT0RVTEUKKwlpZiAoYm9hcmRzX2ZvdW5kID49IEFDRV9NQVhfTU9EX1BBUk1TKQorCQlhcC0+Ym9hcmRfaWR4ID0gQk9BUkRfSURYX09WRVJGTE9XOworCWVsc2UKKwkJYXAtPmJvYXJkX2lkeCA9IGJvYXJkc19mb3VuZDsKKyNlbHNlCisJYXAtPmJvYXJkX2lkeCA9IEJPQVJEX0lEWF9TVEFUSUM7CisjZW5kaWYKKworCWlmIChhY2VfaW5pdChkZXYpKQorCQlnb3RvIGZhaWxfZnJlZV9uZXRkZXY7CisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhY2VuaWM6IGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsX3VuaW5pdDsKKwl9CisJYXAtPm5hbWUgPSBkZXYtPm5hbWU7CisKKwlpZiAoYXAtPnBjaV91c2luZ19kYWMpCisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlib2FyZHNfZm91bmQrKzsKKwlyZXR1cm4gMDsKKworIGZhaWxfdW5pbml0OgorCWFjZV9pbml0X2NsZWFudXAoZGV2KTsKKyBmYWlsX2ZyZWVfbmV0ZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhY2VuaWNfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBhY2VfcHJpdmF0ZSAqYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhY2VfcmVncyBfX2lvbWVtICpyZWdzID0gYXAtPnJlZ3M7CisJc2hvcnQgaTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwl3cml0ZWwocmVhZGwoJnJlZ3MtPkNwdUN0cmwpIHwgQ1BVX0hBTFQsICZyZWdzLT5DcHVDdHJsKTsKKwlpZiAoYXAtPnZlcnNpb24gPj0gMikKKwkJd3JpdGVsKHJlYWRsKCZyZWdzLT5DcHVCQ3RybCkgfCBDUFVfSEFMVCwgJnJlZ3MtPkNwdUJDdHJsKTsKKwkKKwkvKgorCSAqIFRoaXMgY2xlYXJzIGFueSBwZW5kaW5nIGludGVycnVwdHMKKwkgKi8KKwl3cml0ZWwoMSwgJnJlZ3MtPk1iMExvKTsKKwlyZWFkbCgmcmVncy0+Q3B1Q3RybCk7CS8qIGZsdXNoICovCisKKwkvKgorCSAqIE1ha2Ugc3VyZSBubyBvdGhlciBDUFVzIGFyZSBwcm9jZXNzaW5nIGludGVycnVwdHMKKwkgKiBvbiB0aGUgY2FyZCBiZWZvcmUgdGhlIGJ1ZmZlcnMgYXJlIGJlaW5nIHJlbGVhc2VkLgorCSAqIE90aGVyd2lzZSBvbmUgbWlnaHQgZXhwZXJpZW5jZSBzb21lIGBpbnRlcmVzdGluZycKKwkgKiBlZmZlY3RzLgorCSAqCisJICogVGhlbiByZWxlYXNlIHRoZSBSWCBidWZmZXJzIC0ganVtYm8gYnVmZmVycyB3ZXJlCisJICogYWxyZWFkeSByZWxlYXNlZCBpbiBhY2VfY2xvc2UoKS4KKwkgKi8KKwlhY2Vfc3luY19pcnEoZGV2LT5pcnEpOworCisJZm9yIChpID0gMDsgaSA8IFJYX1NURF9SSU5HX0VOVFJJRVM7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYXAtPnNrYi0+cnhfc3RkX3NrYnVmZltpXS5za2I7CisKKwkJaWYgKHNrYikgeworCQkJc3RydWN0IHJpbmdfaW5mbyAqcmluZ3A7CisJCQlkbWFfYWRkcl90IG1hcHBpbmc7CisKKwkJCXJpbmdwID0gJmFwLT5za2ItPnJ4X3N0ZF9za2J1ZmZbaV07CisJCQltYXBwaW5nID0gcGNpX3VubWFwX2FkZHIocmluZ3AsIG1hcHBpbmcpOworCQkJcGNpX3VubWFwX3BhZ2UoYXAtPnBkZXYsIG1hcHBpbmcsCisJCQkJICAgICAgIEFDRV9TVERfQlVGU0laRSwKKwkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJYXAtPnJ4X3N0ZF9yaW5nW2ldLnNpemUgPSAwOworCQkJYXAtPnNrYi0+cnhfc3RkX3NrYnVmZltpXS5za2IgPSBOVUxMOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQl9CisJfQorCisJaWYgKGFwLT52ZXJzaW9uID49IDIpIHsKKwkJZm9yIChpID0gMDsgaSA8IFJYX01JTklfUklOR19FTlRSSUVTOyBpKyspIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSBhcC0+c2tiLT5yeF9taW5pX3NrYnVmZltpXS5za2I7CisKKwkJCWlmIChza2IpIHsKKwkJCQlzdHJ1Y3QgcmluZ19pbmZvICpyaW5ncDsKKwkJCQlkbWFfYWRkcl90IG1hcHBpbmc7CisKKwkJCQlyaW5ncCA9ICZhcC0+c2tiLT5yeF9taW5pX3NrYnVmZltpXTsKKwkJCQltYXBwaW5nID0gcGNpX3VubWFwX2FkZHIocmluZ3AsbWFwcGluZyk7CisJCQkJcGNpX3VubWFwX3BhZ2UoYXAtPnBkZXYsIG1hcHBpbmcsCisJCQkJCSAgICAgICBBQ0VfTUlOSV9CVUZTSVpFLAorCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJCWFwLT5yeF9taW5pX3JpbmdbaV0uc2l6ZSA9IDA7CisJCQkJYXAtPnNrYi0+cnhfbWluaV9za2J1ZmZbaV0uc2tiID0gTlVMTDsKKwkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQl9CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfSlVNQk9fUklOR19FTlRSSUVTOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFwLT5za2ItPnJ4X2p1bWJvX3NrYnVmZltpXS5za2I7CisJCWlmIChza2IpIHsKKwkJCXN0cnVjdCByaW5nX2luZm8gKnJpbmdwOworCQkJZG1hX2FkZHJfdCBtYXBwaW5nOworCisJCQlyaW5ncCA9ICZhcC0+c2tiLT5yeF9qdW1ib19za2J1ZmZbaV07CisJCQltYXBwaW5nID0gcGNpX3VubWFwX2FkZHIocmluZ3AsIG1hcHBpbmcpOworCQkJcGNpX3VubWFwX3BhZ2UoYXAtPnBkZXYsIG1hcHBpbmcsCisJCQkJICAgICAgIEFDRV9KVU1CT19CVUZTSVpFLAorCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQlhcC0+cnhfanVtYm9fcmluZ1tpXS5zaXplID0gMDsKKwkJCWFwLT5za2ItPnJ4X2p1bWJvX3NrYnVmZltpXS5za2IgPSBOVUxMOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQl9CisJfQorCisJYWNlX2luaXRfY2xlYW51cChkZXYpOworCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhY2VuaWNfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiYWNlbmljIiwKKwkuaWRfdGFibGUJPSBhY2VuaWNfcGNpX3RibCwKKwkucHJvYmUJCT0gYWNlbmljX3Byb2JlX29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFjZW5pY19yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFjZW5pY19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmYWNlbmljX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWNlbmljX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFjZW5pY19wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWNlbmljX2luaXQpOworbW9kdWxlX2V4aXQoYWNlbmljX2V4aXQpOworCitzdGF0aWMgdm9pZCBhY2VfZnJlZV9kZXNjcmlwdG9ycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhY2VfcHJpdmF0ZSAqYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBzaXplOworCisJaWYgKGFwLT5yeF9zdGRfcmluZyAhPSBOVUxMKSB7CisJCXNpemUgPSAoc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSAqCisJCQkoUlhfU1REX1JJTkdfRU5UUklFUyArCisJCQkgUlhfSlVNQk9fUklOR19FTlRSSUVTICsKKwkJCSBSWF9NSU5JX1JJTkdfRU5UUklFUyArCisJCQkgUlhfUkVUVVJOX1JJTkdfRU5UUklFUykpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFwLT5wZGV2LCBzaXplLCBhcC0+cnhfc3RkX3JpbmcsCisJCQkJICAgIGFwLT5yeF9yaW5nX2Jhc2VfZG1hKTsKKwkJYXAtPnJ4X3N0ZF9yaW5nID0gTlVMTDsKKwkJYXAtPnJ4X2p1bWJvX3JpbmcgPSBOVUxMOworCQlhcC0+cnhfbWluaV9yaW5nID0gTlVMTDsKKwkJYXAtPnJ4X3JldHVybl9yaW5nID0gTlVMTDsKKwl9CisJaWYgKGFwLT5ldnRfcmluZyAhPSBOVUxMKSB7CisJCXNpemUgPSAoc2l6ZW9mKHN0cnVjdCBldmVudCkgKiBFVlRfUklOR19FTlRSSUVTKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhcC0+cGRldiwgc2l6ZSwgYXAtPmV2dF9yaW5nLAorCQkJCSAgICBhcC0+ZXZ0X3JpbmdfZG1hKTsKKwkJYXAtPmV2dF9yaW5nID0gTlVMTDsKKwl9CisJaWYgKGFwLT50eF9yaW5nICE9IE5VTEwgJiYgIUFDRV9JU19USUdPTl9JKGFwKSkgeworCQlzaXplID0gKHNpemVvZihzdHJ1Y3QgdHhfZGVzYykgKiBNQVhfVFhfUklOR19FTlRSSUVTKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhcC0+cGRldiwgc2l6ZSwgYXAtPnR4X3JpbmcsCisJCQkJICAgIGFwLT50eF9yaW5nX2RtYSk7CisJfQorCWFwLT50eF9yaW5nID0gTlVMTDsKKworCWlmIChhcC0+ZXZ0X3ByZCAhPSBOVUxMKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYXAtPnBkZXYsIHNpemVvZih1MzIpLAorCQkJCSAgICAodm9pZCAqKWFwLT5ldnRfcHJkLCBhcC0+ZXZ0X3ByZF9kbWEpOworCQlhcC0+ZXZ0X3ByZCA9IE5VTEw7CisJfQorCWlmIChhcC0+cnhfcmV0X3ByZCAhPSBOVUxMKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYXAtPnBkZXYsIHNpemVvZih1MzIpLAorCQkJCSAgICAodm9pZCAqKWFwLT5yeF9yZXRfcHJkLAorCQkJCSAgICBhcC0+cnhfcmV0X3ByZF9kbWEpOworCQlhcC0+cnhfcmV0X3ByZCA9IE5VTEw7CisJfQorCWlmIChhcC0+dHhfY3NtICE9IE5VTEwpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhcC0+cGRldiwgc2l6ZW9mKHUzMiksCisJCQkJICAgICh2b2lkICopYXAtPnR4X2NzbSwgYXAtPnR4X2NzbV9kbWEpOworCQlhcC0+dHhfY3NtID0gTlVMTDsKKwl9Cit9CisKKworc3RhdGljIGludCBhY2VfYWxsb2NhdGVfZGVzY3JpcHRvcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgc2l6ZTsKKworCXNpemUgPSAoc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSAqCisJCShSWF9TVERfUklOR19FTlRSSUVTICsKKwkJIFJYX0pVTUJPX1JJTkdfRU5UUklFUyArCisJCSBSWF9NSU5JX1JJTkdfRU5UUklFUyArCisJCSBSWF9SRVRVUk5fUklOR19FTlRSSUVTKSk7CisKKwlhcC0+cnhfc3RkX3JpbmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhcC0+cGRldiwgc2l6ZSwKKwkJCQkJICAgICAgICZhcC0+cnhfcmluZ19iYXNlX2RtYSk7CisJaWYgKGFwLT5yeF9zdGRfcmluZyA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisKKwlhcC0+cnhfanVtYm9fcmluZyA9IGFwLT5yeF9zdGRfcmluZyArIFJYX1NURF9SSU5HX0VOVFJJRVM7CisJYXAtPnJ4X21pbmlfcmluZyA9IGFwLT5yeF9qdW1ib19yaW5nICsgUlhfSlVNQk9fUklOR19FTlRSSUVTOworCWFwLT5yeF9yZXR1cm5fcmluZyA9IGFwLT5yeF9taW5pX3JpbmcgKyBSWF9NSU5JX1JJTkdfRU5UUklFUzsKKworCXNpemUgPSAoc2l6ZW9mKHN0cnVjdCBldmVudCkgKiBFVlRfUklOR19FTlRSSUVTKTsKKworCWFwLT5ldnRfcmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFwLT5wZGV2LCBzaXplLCAmYXAtPmV2dF9yaW5nX2RtYSk7CisKKwlpZiAoYXAtPmV2dF9yaW5nID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKworCS8qCisJICogT25seSBhbGxvY2F0ZSBhIGhvc3QgVFggcmluZyBmb3IgdGhlIFRpZ29uIElJLCB0aGUgVGlnb24gSQorCSAqIGhhcyB0byB1c2UgUENJIHJlZ2lzdGVycyBmb3IgdGhpcyA7LSgKKwkgKi8KKwlpZiAoIUFDRV9JU19USUdPTl9JKGFwKSkgeworCQlzaXplID0gKHNpemVvZihzdHJ1Y3QgdHhfZGVzYykgKiBNQVhfVFhfUklOR19FTlRSSUVTKTsKKworCQlhcC0+dHhfcmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFwLT5wZGV2LCBzaXplLAorCQkJCQkJICAgJmFwLT50eF9yaW5nX2RtYSk7CisKKwkJaWYgKGFwLT50eF9yaW5nID09IE5VTEwpCisJCQlnb3RvIGZhaWw7CisJfQorCisJYXAtPmV2dF9wcmQgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhcC0+cGRldiwgc2l6ZW9mKHUzMiksCisJCQkJCSAgICZhcC0+ZXZ0X3ByZF9kbWEpOworCWlmIChhcC0+ZXZ0X3ByZCA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisKKwlhcC0+cnhfcmV0X3ByZCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFwLT5wZGV2LCBzaXplb2YodTMyKSwKKwkJCQkJICAgICAgJmFwLT5yeF9yZXRfcHJkX2RtYSk7CisJaWYgKGFwLT5yeF9yZXRfcHJkID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKworCWFwLT50eF9jc20gPSBwY2lfYWxsb2NfY29uc2lzdGVudChhcC0+cGRldiwgc2l6ZW9mKHUzMiksCisJCQkJCSAgJmFwLT50eF9jc21fZG1hKTsKKwlpZiAoYXAtPnR4X2NzbSA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwkvKiBDbGVhbiB1cC4gKi8KKwlhY2VfaW5pdF9jbGVhbnVwKGRldik7CisJcmV0dXJuIDE7Cit9CisKKworLyoKKyAqIEdlbmVyaWMgY2xlYW51cCBoYW5kbGluZyBkYXRhIGFsbG9jYXRlZCBkdXJpbmcgaW5pdC4gVXNlZCB3aGVuIHRoZQorICogbW9kdWxlIGlzIHVubG9hZGVkIG9yIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgaW5pdGlhbGl6YXRpb24KKyAqLworc3RhdGljIHZvaWQgYWNlX2luaXRfY2xlYW51cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhY2VfcHJpdmF0ZSAqYXA7CisKKwlhcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlhY2VfZnJlZV9kZXNjcmlwdG9ycyhkZXYpOworCisJaWYgKGFwLT5pbmZvKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFwLT5wZGV2LCBzaXplb2Yoc3RydWN0IGFjZV9pbmZvKSwKKwkJCQkgICAgYXAtPmluZm8sIGFwLT5pbmZvX2RtYSk7CisJaWYgKGFwLT5za2IpCisJCWtmcmVlKGFwLT5za2IpOworCWlmIChhcC0+dHJhY2VfYnVmKQorCQlrZnJlZShhcC0+dHJhY2VfYnVmKTsKKworCWlmIChkZXYtPmlycSkKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlpb3VubWFwKGFwLT5yZWdzKTsKK30KKworCisvKgorICogQ29tbWFuZHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgc2xvdy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGFjZV9pc3N1ZV9jbWQoc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MsIHN0cnVjdCBjbWQgKmNtZCkKK3sKKwl1MzIgaWR4OworCisJaWR4ID0gcmVhZGwoJnJlZ3MtPkNtZFByZCk7CisKKwl3cml0ZWwoKih1MzIgKikoY21kKSwgJnJlZ3MtPkNtZFJuZ1tpZHhdKTsKKwlpZHggPSAoaWR4ICsgMSkgJSBDTURfUklOR19FTlRSSUVTOworCisJd3JpdGVsKGlkeCwgJnJlZ3MtPkNtZFByZCk7Cit9CisKKworc3RhdGljIGludCBfX2RldmluaXQgYWNlX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwOworCXN0cnVjdCBhY2VfcmVncyBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBhY2VfaW5mbyAqaW5mbyA9IE5VTEw7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJdW5zaWduZWQgbG9uZyBteWppZjsKKwl1NjQgdG1wX3B0cjsKKwl1MzIgdGlnX3ZlciwgbWFjMSwgbWFjMiwgdG1wLCBwY2lfc3RhdGU7CisJaW50IGJvYXJkX2lkeCwgZWNvZGUgPSAwOworCXNob3J0IGk7CisJdW5zaWduZWQgY2hhciBjYWNoZV9zaXplOworCisJYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJlZ3MgPSBhcC0+cmVnczsKKworCWJvYXJkX2lkeCA9IGFwLT5ib2FyZF9pZHg7CisKKwkvKgorCSAqIGFtYW5Ac2dpLmNvbSAtIGl0cyB1c2VmdWwgdG8gZG8gYSBOSUMgcmVzZXQgaGVyZSB0bworCSAqIGFkZHJlc3MgdGhlIGBGaXJtd2FyZSBub3QgcnVubmluZycgcHJvYmxlbSBzdWJzZXF1ZW50CisJICogdG8gYW55IGNyYXNoZXMgaW52b2x2aW5nIHRoZSBOSUMKKwkgKi8KKwl3cml0ZWwoSFdfUkVTRVQgfCAoSFdfUkVTRVQgPDwgMjQpLCAmcmVncy0+SG9zdEN0cmwpOworCXJlYWRsKCZyZWdzLT5Ib3N0Q3RybCk7CQkvKiBQQ0kgd3JpdGUgcG9zdGluZyAqLworCXVkZWxheSg1KTsKKworCS8qCisJICogRG9uJ3QgYWNjZXNzIGFueSBvdGhlciByZWdpc3RlcnMgYmVmb3JlIHRoaXMgcG9pbnQhCisJICovCisjaWZkZWYgX19CSUdfRU5ESUFOCisJLyoKKwkgKiBUaGlzIHdpbGwgbW9zdCBsaWtlbHkgbmVlZCBCWVRFX1NXQVAgb25jZSB3ZSBzd2l0Y2gKKwkgKiB0byB1c2luZyBfX3Jhd193cml0ZWwoKQorCSAqLworCXdyaXRlbCgoV09SRF9TV0FQIHwgQ0xSX0lOVCB8ICgoV09SRF9TV0FQIHwgQ0xSX0lOVCkgPDwgMjQpKSwKKwkgICAgICAgJnJlZ3MtPkhvc3RDdHJsKTsKKyNlbHNlCisJd3JpdGVsKChDTFJfSU5UIHwgV09SRF9TV0FQIHwgKChDTFJfSU5UIHwgV09SRF9TV0FQKSA8PCAyNCkpLAorCSAgICAgICAmcmVncy0+SG9zdEN0cmwpOworI2VuZGlmCisJcmVhZGwoJnJlZ3MtPkhvc3RDdHJsKTsJCS8qIFBDSSB3cml0ZSBwb3N0aW5nICovCisKKwkvKgorCSAqIFN0b3AgdGhlIE5JQyBDUFUgYW5kIGNsZWFyIHBlbmRpbmcgaW50ZXJydXB0cworCSAqLworCXdyaXRlbChyZWFkbCgmcmVncy0+Q3B1Q3RybCkgfCBDUFVfSEFMVCwgJnJlZ3MtPkNwdUN0cmwpOworCXJlYWRsKCZyZWdzLT5DcHVDdHJsKTsJCS8qIFBDSSB3cml0ZSBwb3N0aW5nICovCisJd3JpdGVsKDAsICZyZWdzLT5NYjBMbyk7CisKKwl0aWdfdmVyID0gcmVhZGwoJnJlZ3MtPkhvc3RDdHJsKSA+PiAyODsKKworCXN3aXRjaCh0aWdfdmVyKXsKKyNpZm5kZWYgQ09ORklHX0FDRU5JQ19PTUlUX1RJR09OX0kKKwljYXNlIDQ6CisJY2FzZSA1OgorCQlwcmludGsoS0VSTl9JTkZPICIgIFRpZ29uIEkgIChSZXYuICVpKSwgRmlybXdhcmU6ICVpLiVpLiVpLCAiLAorCQkgICAgICAgdGlnX3ZlciwgdGlnb25Gd1JlbGVhc2VNYWpvciwgdGlnb25Gd1JlbGVhc2VNaW5vciwKKwkJICAgICAgIHRpZ29uRndSZWxlYXNlRml4KTsKKwkJd3JpdGVsKDAsICZyZWdzLT5Mb2NhbEN0cmwpOworCQlhcC0+dmVyc2lvbiA9IDE7CisJCWFwLT50eF9yaW5nX2VudHJpZXMgPSBUSUdPTl9JX1RYX1JJTkdfRU5UUklFUzsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIDY6CisJCXByaW50ayhLRVJOX0lORk8gIiAgVGlnb24gSUkgKFJldi4gJWkpLCBGaXJtd2FyZTogJWkuJWkuJWksICIsCisJCSAgICAgICB0aWdfdmVyLCB0aWdvbjJGd1JlbGVhc2VNYWpvciwgdGlnb24yRndSZWxlYXNlTWlub3IsCisJCSAgICAgICB0aWdvbjJGd1JlbGVhc2VGaXgpOworCQl3cml0ZWwocmVhZGwoJnJlZ3MtPkNwdUJDdHJsKSB8IENQVV9IQUxULCAmcmVncy0+Q3B1QkN0cmwpOworCQlyZWFkbCgmcmVncy0+Q3B1QkN0cmwpOwkJLyogUENJIHdyaXRlIHBvc3RpbmcgKi8KKwkJLyoKKwkJICogVGhlIFNSQU0gYmFuayBzaXplIGRvZXMgX25vdF8gaW5kaWNhdGUgdGhlIGFtb3VudAorCQkgKiBvZiBtZW1vcnkgb24gdGhlIGNhcmQsIGl0IGNvbnRyb2xzIHRoZSBfYmFua18gc2l6ZSEKKwkJICogSWUuIGEgMU1CIEFjZU5JQyB3aWxsIGhhdmUgdHdvIGJhbmtzIG9mIDUxMktCLgorCQkgKi8KKwkJd3JpdGVsKFNSQU1fQkFOS181MTJLLCAmcmVncy0+TG9jYWxDdHJsKTsKKwkJd3JpdGVsKFNZTkNfU1JBTV9USU1JTkcsICZyZWdzLT5NaXNjQ2ZnKTsKKwkJYXAtPnZlcnNpb24gPSAyOworCQlhcC0+dHhfcmluZ19lbnRyaWVzID0gTUFYX1RYX1JJTkdfRU5UUklFUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiICBVbnN1cHBvcnRlZCBUaWdvbiB2ZXJzaW9uIGRldGVjdGVkICIKKwkJICAgICAgICIoJWkpXG4iLCB0aWdfdmVyKTsKKwkJZWNvZGUgPSAtRU5PREVWOworCQlnb3RvIGluaXRfZXJyb3I7CisJfQorCisJLyoKKwkgKiBNb2RlU3RhdCBfbXVzdF8gYmUgc2V0IGFmdGVyIHRoZSBTUkFNIHNldHRpbmdzIGFzIHRoaXMgY2hhbmdlCisJICogc2VlbXMgdG8gY29ycnVwdCB0aGUgTW9kZVN0YXQgYW5kIHBvc3NpYmxlIG90aGVyIHJlZ2lzdGVycy4KKwkgKiBUaGUgU1JBTSBzZXR0aW5ncyBzdXJ2aXZlIHJlc2V0cyBhbmQgc2V0dGluZyBpdCB0byB0aGUgc2FtZQorCSAqIHZhbHVlIGEgc2Vjb25kIHRpbWUgd29ya3MgYXMgd2VsbC4gVGhpcyBpcyB3aGF0IGNhdXNlZCB0aGUKKwkgKiBgRmlybXdhcmUgbm90IHJ1bm5pbmcnIHByb2JsZW0gb24gdGhlIFRpZ29uIElJLgorCSAqLworI2lmZGVmIF9fQklHX0VORElBTgorCXdyaXRlbChBQ0VfQllURV9TV0FQX0RNQSB8IEFDRV9XQVJOIHwgQUNFX0ZBVEFMIHwgQUNFX0JZVEVfU1dBUF9CRCB8CisJICAgICAgIEFDRV9XT1JEX1NXQVBfQkQgfCBBQ0VfTk9fSlVNQk9fRlJBRywgJnJlZ3MtPk1vZGVTdGF0KTsKKyNlbHNlCisJd3JpdGVsKEFDRV9CWVRFX1NXQVBfRE1BIHwgQUNFX1dBUk4gfCBBQ0VfRkFUQUwgfAorCSAgICAgICBBQ0VfV09SRF9TV0FQX0JEIHwgQUNFX05PX0pVTUJPX0ZSQUcsICZyZWdzLT5Nb2RlU3RhdCk7CisjZW5kaWYKKwlyZWFkbCgmcmVncy0+TW9kZVN0YXQpOwkJLyogUENJIHdyaXRlIHBvc3RpbmcgKi8KKworCW1hYzEgPSAwOworCWZvcihpID0gMDsgaSA8IDQ7IGkrKykgeworCQltYWMxID0gbWFjMSA8PCA4OworCQl0bXAgPSByZWFkX2VlcHJvbV9ieXRlKGRldiwgMHg4YytpKTsKKwkJaWYgKHRtcCA8IDApIHsKKwkJCWVjb2RlID0gLUVJTzsKKwkJCWdvdG8gaW5pdF9lcnJvcjsKKwkJfSBlbHNlCisJCQltYWMxIHw9ICh0bXAgJiAweGZmKTsKKwl9CisJbWFjMiA9IDA7CisJZm9yKGkgPSA0OyBpIDwgODsgaSsrKSB7CisJCW1hYzIgPSBtYWMyIDw8IDg7CisJCXRtcCA9IHJlYWRfZWVwcm9tX2J5dGUoZGV2LCAweDhjK2kpOworCQlpZiAodG1wIDwgMCkgeworCQkJZWNvZGUgPSAtRUlPOworCQkJZ290byBpbml0X2Vycm9yOworCQl9IGVsc2UKKwkJCW1hYzIgfD0gKHRtcCAmIDB4ZmYpOworCX0KKworCXdyaXRlbChtYWMxLCAmcmVncy0+TWFjQWRkckhpKTsKKwl3cml0ZWwobWFjMiwgJnJlZ3MtPk1hY0FkZHJMbyk7CisKKwlwcmludGsoIk1BQzogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJICAgICAgIChtYWMxID4+IDgpICYgMHhmZiwgbWFjMSAmIDB4ZmYsIChtYWMyID4+IDI0KSAmMHhmZiwKKwkgICAgICAgKG1hYzIgPj4gMTYpICYgMHhmZiwgKG1hYzIgPj4gOCkgJiAweGZmLCBtYWMyICYgMHhmZik7CisKKwlkZXYtPmRldl9hZGRyWzBdID0gKG1hYzEgPj4gOCkgJiAweGZmOworCWRldi0+ZGV2X2FkZHJbMV0gPSBtYWMxICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzJdID0gKG1hYzIgPj4gMjQpICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzNdID0gKG1hYzIgPj4gMTYpICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzRdID0gKG1hYzIgPj4gOCkgJiAweGZmOworCWRldi0+ZGV2X2FkZHJbNV0gPSBtYWMyICYgMHhmZjsKKworCS8qCisJICogTG9va3MgbGlrZSB0aGlzIGlzIG5lY2Vzc2FyeSB0byBkZWFsIHdpdGggb24gYWxsIGFyY2hpdGVjdHVyZXMsCisJICogZXZlbiB0aGlzICUkIyUkIyBONDQwQlggSW50ZWwgYmFzZWQgdGhpbmcgZG9lc24ndCBnZXQgaXQgcmlnaHQuCisJICogSWUuIGhhdmluZyB0d28gTklDcyBpbiB0aGUgbWFjaGluZSwgb25lIHdpbGwgaGF2ZSB0aGUgY2FjaGUKKwkgKiBsaW5lIHNldCBhdCBib290IHRpbWUsIHRoZSBvdGhlciB3aWxsIG5vdC4KKwkgKi8KKwlwZGV2ID0gYXAtPnBkZXY7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgJmNhY2hlX3NpemUpOworCWNhY2hlX3NpemUgPDw9IDI7CisJaWYgKGNhY2hlX3NpemUgIT0gU01QX0NBQ0hFX0JZVEVTKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiAgUENJIGNhY2hlIGxpbmUgc2l6ZSBzZXQgaW5jb3JyZWN0bHkgIgorCQkgICAgICAgIiglaSBieXRlcykgYnkgQklPUy9GVywgIiwgY2FjaGVfc2l6ZSk7CisJCWlmIChjYWNoZV9zaXplID4gU01QX0NBQ0hFX0JZVEVTKQorCQkJcHJpbnRrKCJleHBlY3RpbmcgJWlcbiIsIFNNUF9DQUNIRV9CWVRFUyk7CisJCWVsc2UgeworCQkJcHJpbnRrKCJjb3JyZWN0aW5nIHRvICVpXG4iLCBTTVBfQ0FDSEVfQllURVMpOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsCisJCQkJCSAgICAgIFNNUF9DQUNIRV9CWVRFUyA+PiAyKTsKKwkJfQorCX0KKworCXBjaV9zdGF0ZSA9IHJlYWRsKCZyZWdzLT5QY2lTdGF0ZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiICBQQ0kgYnVzIHdpZHRoOiAlaSBiaXRzLCBzcGVlZDogJWlNSHosICIKKwkgICAgICAgImxhdGVuY3k6ICVpIGNsa3NcbiIsCisJICAgICAgIAkocGNpX3N0YXRlICYgUENJXzMyQklUKSA/IDMyIDogNjQsCisJCShwY2lfc3RhdGUgJiBQQ0lfNjZNSFopID8gNjYgOiAzMywgCisJCWFwLT5wY2lfbGF0ZW5jeSk7CisKKwkvKgorCSAqIFNldCB0aGUgbWF4IERNQSB0cmFuc2ZlciBzaXplLiBTZWVtcyB0aGF0IGZvciBtb3N0IHN5c3RlbXMKKwkgKiB0aGUgcGVyZm9ybWFuY2UgaXMgYmV0dGVyIHdoZW4gbm8gTUFYIHBhcmFtZXRlciBpcworCSAqIHNldC4gSG93ZXZlciBmb3Igc3lzdGVtcyBlbmFibGluZyBQQ0kgd3JpdGUgYW5kIGludmFsaWRhdGUsCisJICogRE1BIHdyaXRlcyBtdXN0IGJlIHNldCB0byB0aGUgTDEgY2FjaGUgbGluZSBzaXplIHRvIGdldAorCSAqIG9wdGltYWwgcGVyZm9ybWFuY2UuCisJICoKKwkgKiBUaGUgZGVmYXVsdCBpcyBub3cgdG8gdHVybiB0aGUgUENJIHdyaXRlIGFuZCBpbnZhbGlkYXRlIG9mZgorCSAqIC0gdGhhdCBpcyB3aGF0IEFsdGVvbiBkb2VzIGZvciBOVC4KKwkgKi8KKwl0bXAgPSBSRUFEX0NNRF9NRU0gfCBXUklURV9DTURfTUVNOworCWlmIChhcC0+dmVyc2lvbiA+PSAyKSB7CisJCXRtcCB8PSAoTUVNX1JFQURfTVVMVElQTEUgfCAocGNpX3N0YXRlICYgUENJXzY2TUhaKSk7CisJCS8qCisJCSAqIFR1bmluZyBwYXJhbWV0ZXJzIG9ubHkgc3VwcG9ydGVkIGZvciA4IGNhcmRzCisJCSAqLworCQlpZiAoYm9hcmRfaWR4ID09IEJPQVJEX0lEWF9PVkVSRkxPVyB8fAorCQkgICAgZGlzX3BjaV9tZW1faW52YWxbYm9hcmRfaWR4XSkgeworCQkJaWYgKGFwLT5wY2lfY29tbWFuZCAmIFBDSV9DT01NQU5EX0lOVkFMSURBVEUpIHsKKwkJCQlhcC0+cGNpX2NvbW1hbmQgJj0gflBDSV9DT01NQU5EX0lOVkFMSURBVEU7CisJCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELAorCQkJCQkJICAgICAgYXAtPnBjaV9jb21tYW5kKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIgIERpc2FibGluZyBQQ0kgbWVtb3J5ICIKKwkJCQkgICAgICAgIndyaXRlIGFuZCBpbnZhbGlkYXRlXG4iKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChhcC0+cGNpX2NvbW1hbmQgJiBQQ0lfQ09NTUFORF9JTlZBTElEQVRFKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIgIFBDSSBtZW1vcnkgd3JpdGUgJiBpbnZhbGlkYXRlICIKKwkJCSAgICAgICAiZW5hYmxlZCBieSBCSU9TLCBlbmFibGluZyBjb3VudGVyIG1lYXN1cmVzXG4iKTsKKworCQkJc3dpdGNoKFNNUF9DQUNIRV9CWVRFUykgeworCQkJY2FzZSAxNjoKKwkJCQl0bXAgfD0gRE1BX1dSSVRFX01BWF8xNjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzI6CisJCQkJdG1wIHw9IERNQV9XUklURV9NQVhfMzI7CisJCQkJYnJlYWs7CisJCQljYXNlIDY0OgorCQkJCXRtcCB8PSBETUFfV1JJVEVfTUFYXzY0OworCQkJCWJyZWFrOworCQkJY2FzZSAxMjg6CisJCQkJdG1wIHw9IERNQV9XUklURV9NQVhfMTI4OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9JTkZPICIgIENhY2hlIGxpbmUgc2l6ZSAlaSBub3QgIgorCQkJCSAgICAgICAic3VwcG9ydGVkLCBQQ0kgd3JpdGUgYW5kIGludmFsaWRhdGUgIgorCQkJCSAgICAgICAiZGlzYWJsZWRcbiIsIFNNUF9DQUNIRV9CWVRFUyk7CisJCQkJYXAtPnBjaV9jb21tYW5kICY9IH5QQ0lfQ09NTUFORF9JTlZBTElEQVRFOworCQkJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwKKwkJCQkJCSAgICAgIGFwLT5wY2lfY29tbWFuZCk7CisJCQl9CisJCX0KKwl9CisKKyNpZmRlZiBfX3NwYXJjX18KKwkvKgorCSAqIE9uIHRoaXMgcGxhdGZvcm0sIHdlIGtub3cgd2hhdCB0aGUgYmVzdCBkbWEgc2V0dGluZ3MKKwkgKiBhcmUuICBXZSB1c2UgNjQtYnl0ZSBtYXhpbXVtIGJ1cnN0cywgYmVjYXVzZSBpZiB3ZQorCSAqIGJ1cnN0IGxhcmdlciB0aGFuIHRoZSBjYWNoZSBsaW5lIHNpemUgKG9yIGV2ZW4gY3Jvc3MKKwkgKiBhIDY0Ynl0ZSBib3VuZGFyeSBpbiBhIHNpbmdsZSBidXJzdCkgdGhlIFVsdHJhU3BhcmMKKwkgKiBQQ0kgY29udHJvbGxlciB3aWxsIGRpc2Nvbm5lY3QgYXQgNjQtYnl0ZSBtdWx0aXBsZXMuCisJICoKKwkgKiBSZWFkLW11bHRpcGxlIHdpbGwgYmUgcHJvcGVybHkgZW5hYmxlZCBhYm92ZSwgYW5kIHdoZW4KKwkgKiBzZXQgd2lsbCBnaXZlIHRoZSBQQ0kgY29udHJvbGxlciBwcm9wZXIgaGludHMgYWJvdXQKKwkgKiBwcmVmZXRjaGluZy4KKwkgKi8KKwl0bXAgJj0gfkRNQV9SRUFEX1dSSVRFX01BU0s7CisJdG1wIHw9IERNQV9SRUFEX01BWF82NDsKKwl0bXAgfD0gRE1BX1dSSVRFX01BWF82NDsKKyNlbmRpZgorI2lmZGVmIF9fYWxwaGFfXworCXRtcCAmPSB+RE1BX1JFQURfV1JJVEVfTUFTSzsKKwl0bXAgfD0gRE1BX1JFQURfTUFYXzEyODsKKwkvKgorCSAqIEFsbCB0aGUgZG9jcyBzYXkgTVVTVCBOT1QuIFdlbGwsIEkgZGlkLgorCSAqIE5vdGhpbmcgdGVycmlibGUgaGFwcGVucywgaWYgd2UgbG9hZCB3cm9uZyBzaXplLgorCSAqIEJpdCB3Jmkgc3RpbGwgd29ya3MgYmV0dGVyIQorCSAqLworCXRtcCB8PSBETUFfV1JJVEVfTUFYXzEyODsKKyNlbmRpZgorCXdyaXRlbCh0bXAsICZyZWdzLT5QY2lTdGF0ZSk7CisKKyNpZiAwCisJLyoKKwkgKiBUaGUgSG9zdCBQQ0kgYnVzIGNvbnRyb2xsZXIgZHJpdmVyIGhhcyB0byBzZXQgRkJCLgorCSAqIElmIGFsbCBkZXZpY2VzIG9uIHRoYXQgUENJIGJ1cyBzdXBwb3J0IEZCQiwgdGhlbiB0aGUgY29udHJvbGxlcgorCSAqIGNhbiBlbmFibGUgRkJCIHN1cHBvcnQgaW4gdGhlIEhvc3QgUENJIEJ1cyBjb250cm9sbGVyIChvciBvbgorCSAqIHRoZSBQQ0ktUENJIGJyaWRnZSBpZiB0aGF0IGFwcGxpZXMpLgorCSAqIC1nZ2cKKwkgKi8KKwkvKgorCSAqIEkgaGF2ZSByZWNlaXZlZCByZXBvcnRzIGZyb20gcGVvcGxlIGhhdmluZyBwcm9ibGVtcyB3aGVuIHRoaXMKKwkgKiBiaXQgaXMgZW5hYmxlZC4KKwkgKi8KKwlpZiAoIShhcC0+cGNpX2NvbW1hbmQgJiBQQ0lfQ09NTUFORF9GQVNUX0JBQ0spKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiAgRW5hYmxpbmcgUENJIEZhc3QgQmFjayB0byBCYWNrXG4iKTsKKwkJYXAtPnBjaV9jb21tYW5kIHw9IFBDSV9DT01NQU5EX0ZBU1RfQkFDSzsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBhcC0+cGNpX2NvbW1hbmQpOworCX0KKyNlbmRpZgorCQkKKwkvKgorCSAqIENvbmZpZ3VyZSBETUEgYXR0cmlidXRlcy4KKwkgKi8KKwlpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSkgeworCQlhcC0+cGNpX3VzaW5nX2RhYyA9IDE7CisJfSBlbHNlIGlmICghcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmVUxMKSkgeworCQlhcC0+cGNpX3VzaW5nX2RhYyA9IDA7CisJfSBlbHNlIHsKKwkJZWNvZGUgPSAtRU5PREVWOworCQlnb3RvIGluaXRfZXJyb3I7CisJfQorCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBnZW5lcmljIGluZm8gYmxvY2sgYW5kIHRoZSBjb21tYW5kK2V2ZW50IHJpbmdzCisJICogYW5kIHRoZSBjb250cm9sIGJsb2NrcyBmb3IgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHJpbmdzCisJICogYXMgdGhleSBuZWVkIHRvIGJlIHNldHVwIG9uY2UgYW5kIGZvciBhbGwuCisJICovCisJaWYgKCEoaW5mbyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFwLT5wZGV2LCBzaXplb2Yoc3RydWN0IGFjZV9pbmZvKSwKKwkJCQkJICAmYXAtPmluZm9fZG1hKSkpIHsKKwkJZWNvZGUgPSAtRUFHQUlOOworCQlnb3RvIGluaXRfZXJyb3I7CisJfQorCWFwLT5pbmZvID0gaW5mbzsKKworCS8qCisJICogR2V0IHRoZSBtZW1vcnkgZm9yIHRoZSBza2IgcmluZ3MuCisJICovCisJaWYgKCEoYXAtPnNrYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY2Vfc2tiKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVjb2RlID0gLUVBR0FJTjsKKwkJZ290byBpbml0X2Vycm9yOworCX0KKworCWVjb2RlID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBhY2VfaW50ZXJydXB0LCBTQV9TSElSUSwKKwkJCSAgICBEUlZfTkFNRSwgZGV2KTsKKwlpZiAoZWNvZGUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlcXVlc3RlZCBJUlEgJWQgaXMgYnVzeVxuIiwKKwkJICAgICAgIERSVl9OQU1FLCBwZGV2LT5pcnEpOworCQlnb3RvIGluaXRfZXJyb3I7CisJfSBlbHNlCisJCWRldi0+aXJxID0gcGRldi0+aXJxOworCisjaWZkZWYgSU5ERVhfREVCVUcKKwlzcGluX2xvY2tfaW5pdCgmYXAtPmRlYnVnX2xvY2spOworCWFwLT5sYXN0X3R4ID0gQUNFX1RYX1JJTkdfRU5UUklFUyhhcCkgLSAxOworCWFwLT5sYXN0X3N0ZF9yeCA9IDA7CisJYXAtPmxhc3RfbWluaV9yeCA9IDA7CisjZW5kaWYKKworCW1lbXNldChhcC0+aW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBhY2VfaW5mbykpOworCW1lbXNldChhcC0+c2tiLCAwLCBzaXplb2Yoc3RydWN0IGFjZV9za2IpKTsKKworCWFjZV9sb2FkX2Zpcm13YXJlKGRldik7CisJYXAtPmZ3X3J1bm5pbmcgPSAwOworCisJdG1wX3B0ciA9IGFwLT5pbmZvX2RtYTsKKwl3cml0ZWwodG1wX3B0ciA+PiAzMiwgJnJlZ3MtPkluZm9QdHJIaSk7CisJd3JpdGVsKHRtcF9wdHIgJiAweGZmZmZmZmZmLCAmcmVncy0+SW5mb1B0ckxvKTsKKworCW1lbXNldChhcC0+ZXZ0X3JpbmcsIDAsIEVWVF9SSU5HX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IGV2ZW50KSk7CisKKwlzZXRfYWNlYWRkcigmaW5mby0+ZXZ0X2N0cmwucm5ncHRyLCBhcC0+ZXZ0X3JpbmdfZG1hKTsKKwlpbmZvLT5ldnRfY3RybC5mbGFncyA9IDA7CisKKwkqKGFwLT5ldnRfcHJkKSA9IDA7CisJd21iKCk7CisJc2V0X2FjZWFkZHIoJmluZm8tPmV2dF9wcmRfcHRyLCBhcC0+ZXZ0X3ByZF9kbWEpOworCXdyaXRlbCgwLCAmcmVncy0+RXZ0Q3NtKTsKKworCXNldF9hY2VhZGRyKCZpbmZvLT5jbWRfY3RybC5ybmdwdHIsIDB4MTAwKTsKKwlpbmZvLT5jbWRfY3RybC5mbGFncyA9IDA7CisJaW5mby0+Y21kX2N0cmwubWF4X2xlbiA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ01EX1JJTkdfRU5UUklFUzsgaSsrKQorCQl3cml0ZWwoMCwgJnJlZ3MtPkNtZFJuZ1tpXSk7CisKKwl3cml0ZWwoMCwgJnJlZ3MtPkNtZFByZCk7CisJd3JpdGVsKDAsICZyZWdzLT5DbWRDc20pOworCisJdG1wX3B0ciA9IGFwLT5pbmZvX2RtYTsKKwl0bXBfcHRyICs9ICh1bnNpZ25lZCBsb25nKSAmKCgoc3RydWN0IGFjZV9pbmZvICopMCktPnMuc3RhdHMpOworCXNldF9hY2VhZGRyKCZpbmZvLT5zdGF0czJfcHRyLCAoZG1hX2FkZHJfdCkgdG1wX3B0cik7CisKKwlzZXRfYWNlYWRkcigmaW5mby0+cnhfc3RkX2N0cmwucm5ncHRyLCBhcC0+cnhfcmluZ19iYXNlX2RtYSk7CisJaW5mby0+cnhfc3RkX2N0cmwubWF4X2xlbiA9IEFDRV9TVERfQlVGU0laRTsKKwlpbmZvLT5yeF9zdGRfY3RybC5mbGFncyA9CisJICBSQ0JfRkxHX1RDUF9VRFBfU1VNIHwgUkNCX0ZMR19OT19QU0VVRE9fSERSIHwgQUNFX1JDQl9WTEFOX0ZMQUc7CisKKwltZW1zZXQoYXAtPnJ4X3N0ZF9yaW5nLCAwLAorCSAgICAgICBSWF9TVERfUklOR19FTlRSSUVTICogc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfU1REX1JJTkdfRU5UUklFUzsgaSsrKQorCQlhcC0+cnhfc3RkX3JpbmdbaV0uZmxhZ3MgPSBCRF9GTEdfVENQX1VEUF9TVU07CisKKwlhcC0+cnhfc3RkX3NrYnByZCA9IDA7CisJYXRvbWljX3NldCgmYXAtPmN1cl9yeF9idWZzLCAwKTsKKworCXNldF9hY2VhZGRyKCZpbmZvLT5yeF9qdW1ib19jdHJsLnJuZ3B0ciwKKwkJICAgIChhcC0+cnhfcmluZ19iYXNlX2RtYSArCisJCSAgICAgKHNpemVvZihzdHJ1Y3QgcnhfZGVzYykgKiBSWF9TVERfUklOR19FTlRSSUVTKSkpOworCWluZm8tPnJ4X2p1bWJvX2N0cmwubWF4X2xlbiA9IDA7CisJaW5mby0+cnhfanVtYm9fY3RybC5mbGFncyA9CisJICBSQ0JfRkxHX1RDUF9VRFBfU1VNIHwgUkNCX0ZMR19OT19QU0VVRE9fSERSIHwgQUNFX1JDQl9WTEFOX0ZMQUc7CisKKwltZW1zZXQoYXAtPnJ4X2p1bWJvX3JpbmcsIDAsCisJICAgICAgIFJYX0pVTUJPX1JJTkdfRU5UUklFUyAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYykpOworCisJZm9yIChpID0gMDsgaSA8IFJYX0pVTUJPX1JJTkdfRU5UUklFUzsgaSsrKQorCQlhcC0+cnhfanVtYm9fcmluZ1tpXS5mbGFncyA9IEJEX0ZMR19UQ1BfVURQX1NVTSB8IEJEX0ZMR19KVU1CTzsKKworCWFwLT5yeF9qdW1ib19za2JwcmQgPSAwOworCWF0b21pY19zZXQoJmFwLT5jdXJfanVtYm9fYnVmcywgMCk7CisKKwltZW1zZXQoYXAtPnJ4X21pbmlfcmluZywgMCwKKwkgICAgICAgUlhfTUlOSV9SSU5HX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpKTsKKworCWlmIChhcC0+dmVyc2lvbiA+PSAyKSB7CisJCXNldF9hY2VhZGRyKCZpbmZvLT5yeF9taW5pX2N0cmwucm5ncHRyLAorCQkJICAgIChhcC0+cnhfcmluZ19iYXNlX2RtYSArCisJCQkgICAgIChzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpICoKKwkJCSAgICAgIChSWF9TVERfUklOR19FTlRSSUVTICsKKwkJCSAgICAgICBSWF9KVU1CT19SSU5HX0VOVFJJRVMpKSkpOworCQlpbmZvLT5yeF9taW5pX2N0cmwubWF4X2xlbiA9IEFDRV9NSU5JX1NJWkU7CisJCWluZm8tPnJ4X21pbmlfY3RybC5mbGFncyA9IAorCQkgIFJDQl9GTEdfVENQX1VEUF9TVU18UkNCX0ZMR19OT19QU0VVRE9fSERSfEFDRV9SQ0JfVkxBTl9GTEFHOworCisJCWZvciAoaSA9IDA7IGkgPCBSWF9NSU5JX1JJTkdfRU5UUklFUzsgaSsrKQorCQkJYXAtPnJ4X21pbmlfcmluZ1tpXS5mbGFncyA9CisJCQkJQkRfRkxHX1RDUF9VRFBfU1VNIHwgQkRfRkxHX01JTkk7CisJfSBlbHNlIHsKKwkJc2V0X2FjZWFkZHIoJmluZm8tPnJ4X21pbmlfY3RybC5ybmdwdHIsIDApOworCQlpbmZvLT5yeF9taW5pX2N0cmwuZmxhZ3MgPSBSQ0JfRkxHX1JOR19ESVNBQkxFOworCQlpbmZvLT5yeF9taW5pX2N0cmwubWF4X2xlbiA9IDA7CisJfQorCisJYXAtPnJ4X21pbmlfc2ticHJkID0gMDsKKwlhdG9taWNfc2V0KCZhcC0+Y3VyX21pbmlfYnVmcywgMCk7CisKKwlzZXRfYWNlYWRkcigmaW5mby0+cnhfcmV0dXJuX2N0cmwucm5ncHRyLAorCQkgICAgKGFwLT5yeF9yaW5nX2Jhc2VfZG1hICsKKwkJICAgICAoc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSAqCisJCSAgICAgIChSWF9TVERfUklOR19FTlRSSUVTICsKKwkJICAgICAgIFJYX0pVTUJPX1JJTkdfRU5UUklFUyArCisJCSAgICAgICBSWF9NSU5JX1JJTkdfRU5UUklFUykpKSk7CisJaW5mby0+cnhfcmV0dXJuX2N0cmwuZmxhZ3MgPSAwOworCWluZm8tPnJ4X3JldHVybl9jdHJsLm1heF9sZW4gPSBSWF9SRVRVUk5fUklOR19FTlRSSUVTOworCisJbWVtc2V0KGFwLT5yeF9yZXR1cm5fcmluZywgMCwKKwkgICAgICAgUlhfUkVUVVJOX1JJTkdfRU5UUklFUyAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYykpOworCisJc2V0X2FjZWFkZHIoJmluZm8tPnJ4X3JldF9wcmRfcHRyLCBhcC0+cnhfcmV0X3ByZF9kbWEpOworCSooYXAtPnJ4X3JldF9wcmQpID0gMDsKKworCXdyaXRlbChUWF9SSU5HX0JBU0UsICZyZWdzLT5XaW5CYXNlKTsKKworCWlmIChBQ0VfSVNfVElHT05fSShhcCkpIHsKKwkJYXAtPnR4X3JpbmcgPSAoc3RydWN0IHR4X2Rlc2MgKikgcmVncy0+V2luZG93OworCQlmb3IgKGkgPSAwOyBpIDwgKFRJR09OX0lfVFhfUklOR19FTlRSSUVTIAorCQkJCSAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYykpIC8gc2l6ZW9mKHUzMik7IGkrKykKKwkJCXdyaXRlbCgwLCAodm9pZCBfX2lvbWVtICopYXAtPnR4X3JpbmcgICsgaSAqIDQpOworCisJCXNldF9hY2VhZGRyKCZpbmZvLT50eF9jdHJsLnJuZ3B0ciwgVFhfUklOR19CQVNFKTsKKwl9IGVsc2UgeworCQltZW1zZXQoYXAtPnR4X3JpbmcsIDAsCisJCSAgICAgICBNQVhfVFhfUklOR19FTlRSSUVTICogc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSk7CisKKwkJc2V0X2FjZWFkZHIoJmluZm8tPnR4X2N0cmwucm5ncHRyLCBhcC0+dHhfcmluZ19kbWEpOworCX0KKworCWluZm8tPnR4X2N0cmwubWF4X2xlbiA9IEFDRV9UWF9SSU5HX0VOVFJJRVMoYXApOworCXRtcCA9IFJDQl9GTEdfVENQX1VEUF9TVU0gfCBSQ0JfRkxHX05PX1BTRVVET19IRFIgfCBBQ0VfUkNCX1ZMQU5fRkxBRzsKKworCS8qCisJICogVGhlIFRpZ29uIEkgZG9lcyBub3QgbGlrZSBoYXZpbmcgdGhlIFRYIHJpbmcgaW4gaG9zdCBtZW1vcnkgOy0oCisJICovCisJaWYgKCFBQ0VfSVNfVElHT05fSShhcCkpCisJCXRtcCB8PSBSQ0JfRkxHX1RYX0hPU1RfUklORzsKKyNpZiBUWF9DT0FMX0lOVFNfT05MWQorCXRtcCB8PSBSQ0JfRkxHX0NPQUxfSU5UX09OTFk7CisjZW5kaWYKKwlpbmZvLT50eF9jdHJsLmZsYWdzID0gdG1wOworCisJc2V0X2FjZWFkZHIoJmluZm8tPnR4X2NzbV9wdHIsIGFwLT50eF9jc21fZG1hKTsKKworCS8qCisJICogUG90ZW50aWFsIGl0ZW0gZm9yIHR1bmluZyBwYXJhbWV0ZXIKKwkgKi8KKyNpZiAwIC8qIE5PICovCisJd3JpdGVsKERNQV9USFJFU0hfMTZXLCAmcmVncy0+RG1hUmVhZENmZyk7CisJd3JpdGVsKERNQV9USFJFU0hfMTZXLCAmcmVncy0+RG1hV3JpdGVDZmcpOworI2Vsc2UKKwl3cml0ZWwoRE1BX1RIUkVTSF84VywgJnJlZ3MtPkRtYVJlYWRDZmcpOworCXdyaXRlbChETUFfVEhSRVNIXzhXLCAmcmVncy0+RG1hV3JpdGVDZmcpOworI2VuZGlmCisKKwl3cml0ZWwoMCwgJnJlZ3MtPk1hc2tJbnQpOworCXdyaXRlbCgxLCAmcmVncy0+SWZJZHgpOworI2lmIDAKKwkvKgorCSAqIE1jS2lubGV5IGJveGVzIGRvIG5vdCBsaWtlIHVzIGZpZGRsaW5nIHdpdGggQXNzaXN0U3RhdGUKKwkgKiB0aGlzIGVhcmx5CisJICovCisJd3JpdGVsKDEsICZyZWdzLT5Bc3Npc3RTdGF0ZSk7CisjZW5kaWYKKworCXdyaXRlbChERUZfU1RBVCwgJnJlZ3MtPlR1bmVTdGF0VGlja3MpOworCXdyaXRlbChERUZfVFJBQ0UsICZyZWdzLT5UdW5lVHJhY2UpOworCisJYWNlX3NldF9yeHR4X3Bhcm1zKGRldiwgMCk7CisKKwlpZiAoYm9hcmRfaWR4ID09IEJPQVJEX0lEWF9PVkVSRkxPVykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbW9yZSB0aGFuICVpIE5JQ3MgZGV0ZWN0ZWQsICIKKwkJICAgICAgICJpZ25vcmluZyBtb2R1bGUgcGFyYW1ldGVycyFcbiIsCisJCSAgICAgICBhcC0+bmFtZSwgQUNFX01BWF9NT0RfUEFSTVMpOworCX0gZWxzZSBpZiAoYm9hcmRfaWR4ID49IDApIHsKKwkJaWYgKHR4X2NvYWxfdGlja1tib2FyZF9pZHhdKQorCQkJd3JpdGVsKHR4X2NvYWxfdGlja1tib2FyZF9pZHhdLAorCQkJICAgICAgICZyZWdzLT5UdW5lVHhDb2FsVGlja3MpOworCQlpZiAobWF4X3R4X2Rlc2NbYm9hcmRfaWR4XSkKKwkJCXdyaXRlbChtYXhfdHhfZGVzY1tib2FyZF9pZHhdLCAmcmVncy0+VHVuZU1heFR4RGVzYyk7CisKKwkJaWYgKHJ4X2NvYWxfdGlja1tib2FyZF9pZHhdKQorCQkJd3JpdGVsKHJ4X2NvYWxfdGlja1tib2FyZF9pZHhdLAorCQkJICAgICAgICZyZWdzLT5UdW5lUnhDb2FsVGlja3MpOworCQlpZiAobWF4X3J4X2Rlc2NbYm9hcmRfaWR4XSkKKwkJCXdyaXRlbChtYXhfcnhfZGVzY1tib2FyZF9pZHhdLCAmcmVncy0+VHVuZU1heFJ4RGVzYyk7CisKKwkJaWYgKHRyYWNlW2JvYXJkX2lkeF0pCisJCQl3cml0ZWwodHJhY2VbYm9hcmRfaWR4XSwgJnJlZ3MtPlR1bmVUcmFjZSk7CisKKwkJaWYgKCh0eF9yYXRpb1tib2FyZF9pZHhdID4gMCkgJiYgKHR4X3JhdGlvW2JvYXJkX2lkeF0gPCA2NCkpCisJCQl3cml0ZWwodHhfcmF0aW9bYm9hcmRfaWR4XSwgJnJlZ3MtPlR4QnVmUmF0KTsKKwl9CisKKwkvKgorCSAqIERlZmF1bHQgbGluayBwYXJhbWV0ZXJzCisJICovCisJdG1wID0gTE5LX0VOQUJMRSB8IExOS19GVUxMX0RVUExFWCB8IExOS18xMDAwTUIgfCBMTktfMTAwTUIgfAorCQlMTktfMTBNQiB8IExOS19SWF9GTE9XX0NUTF9ZIHwgTE5LX05FR19GQ1RMIHwgTE5LX05FR09USUFURTsKKwlpZihhcC0+dmVyc2lvbiA+PSAyKQorCQl0bXAgfD0gTE5LX1RYX0ZMT1dfQ1RMX1k7CisKKwkvKgorCSAqIE92ZXJyaWRlIGxpbmsgZGVmYXVsdCBwYXJhbWV0ZXJzCisJICovCisJaWYgKChib2FyZF9pZHggPj0gMCkgJiYgbGlua1tib2FyZF9pZHhdKSB7CisJCWludCBvcHRpb24gPSBsaW5rW2JvYXJkX2lkeF07CisKKwkJdG1wID0gTE5LX0VOQUJMRTsKKworCQlpZiAob3B0aW9uICYgMHgwMSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNldHRpbmcgaGFsZiBkdXBsZXggbGlua1xuIiwKKwkJCSAgICAgICBhcC0+bmFtZSk7CisJCQl0bXAgJj0gfkxOS19GVUxMX0RVUExFWDsKKwkJfQorCQlpZiAob3B0aW9uICYgMHgwMikKKwkJCXRtcCAmPSB+TE5LX05FR09USUFURTsKKwkJaWYgKG9wdGlvbiAmIDB4MTApCisJCQl0bXAgfD0gTE5LXzEwTUI7CisJCWlmIChvcHRpb24gJiAweDIwKQorCQkJdG1wIHw9IExOS18xMDBNQjsKKwkJaWYgKG9wdGlvbiAmIDB4NDApCisJCQl0bXAgfD0gTE5LXzEwMDBNQjsKKwkJaWYgKChvcHRpb24gJiAweDcwKSA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8gbWVkaWEgc3BlZWQgc3BlY2lmaWVkLCAiCisJCQkgICAgICAgImZvcmNpbmcgYXV0byBuZWdvdGlhdGlvblxuIiwgYXAtPm5hbWUpOworCQkJdG1wIHw9IExOS19ORUdPVElBVEUgfCBMTktfMTAwME1CIHwKKwkJCQlMTktfMTAwTUIgfCBMTktfMTBNQjsKKwkJfQorCQlpZiAoKG9wdGlvbiAmIDB4MTAwKSA9PSAwKQorCQkJdG1wIHw9IExOS19ORUdfRkNUTDsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERpc2FibGluZyBmbG93IGNvbnRyb2wgIgorCQkJICAgICAgICJuZWdvdGlhdGlvblxuIiwgYXAtPm5hbWUpOworCQlpZiAob3B0aW9uICYgMHgyMDApCisJCQl0bXAgfD0gTE5LX1JYX0ZMT1dfQ1RMX1k7CisJCWlmICgob3B0aW9uICYgMHg0MDApICYmIChhcC0+dmVyc2lvbiA+PSAyKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVuYWJsaW5nIFRYIGZsb3cgY29udHJvbFxuIiwKKwkJCSAgICAgICBhcC0+bmFtZSk7CisJCQl0bXAgfD0gTE5LX1RYX0ZMT1dfQ1RMX1k7CisJCX0KKwl9CisKKwlhcC0+bGluayA9IHRtcDsKKwl3cml0ZWwodG1wLCAmcmVncy0+VHVuZUxpbmspOworCWlmIChhcC0+dmVyc2lvbiA+PSAyKQorCQl3cml0ZWwodG1wLCAmcmVncy0+VHVuZUZhc3RMaW5rKTsKKworCWlmIChBQ0VfSVNfVElHT05fSShhcCkpCisJCXdyaXRlbCh0aWdvbkZ3U3RhcnRBZGRyLCAmcmVncy0+UGMpOworCWlmIChhcC0+dmVyc2lvbiA9PSAyKQorCQl3cml0ZWwodGlnb24yRndTdGFydEFkZHIsICZyZWdzLT5QYyk7CisKKwl3cml0ZWwoMCwgJnJlZ3MtPk1iMExvKTsKKworCS8qCisJICogU2V0IHR4X2NzbSBiZWZvcmUgd2Ugc3RhcnQgcmVjZWl2aW5nIGludGVycnVwdHMsIG90aGVyd2lzZQorCSAqIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBtaWdodCB0aGluayBpdCBpcyBzdXBwb3NlZCB0byBwcm9jZXNzCisJICogdHggaW50cyBiZWZvcmUgd2UgYXJlIHVwIGFuZCBydW5uaW5nLCB3aGljaCBtYXkgY2F1c2UgYSBudWxsCisJICogcG9pbnRlciBhY2Nlc3MgaW4gdGhlIGludCBoYW5kbGVyLgorCSAqLworCWFwLT5jdXJfcnggPSAwOworCWFwLT50eF9wcmQgPSAqKGFwLT50eF9jc20pID0gYXAtPnR4X3JldF9jc20gPSAwOworCisJd21iKCk7CisJYWNlX3NldF90eHByZChyZWdzLCBhcCwgMCk7CisJd3JpdGVsKDAsICZyZWdzLT5SeFJldENzbSk7CisKKwkvKgorCSAqIFplcm8gdGhlIHN0YXRzIGJlZm9yZSBzdGFydGluZyB0aGUgaW50ZXJmYWNlCisJICovCisJbWVtc2V0KCZhcC0+c3RhdHMsIDAsIHNpemVvZihhcC0+c3RhdHMpKTsKKworICAgICAgIC8qCisJKiBFbmFibGUgRE1BIGVuZ2luZSBub3cuCisJKiBJZiB3ZSBkbyB0aGlzIHNvb25lciwgTWNraW5sZXkgYm94IHB1a2VzLgorCSogSSBhc3N1bWUgaXQncyBiZWNhdXNlIFRpZ29uIElJIERNQSBlbmdpbmUgd2FudHMgdG8gY2hlY2sKKwkqICpzb21ldGhpbmcqIGV2ZW4gYmVmb3JlIHRoZSBDUFUgaXMgc3RhcnRlZC4KKwkqLworICAgICAgIHdyaXRlbCgxLCAmcmVncy0+QXNzaXN0U3RhdGUpOyAgLyogZW5hYmxlIERNQSAqLworCisJLyoKKwkgKiBTdGFydCB0aGUgTklDIENQVQorCSAqLworCXdyaXRlbChyZWFkbCgmcmVncy0+Q3B1Q3RybCkgJiB+KENQVV9IQUxUfENQVV9UUkFDRSksICZyZWdzLT5DcHVDdHJsKTsKKwlyZWFkbCgmcmVncy0+Q3B1Q3RybCk7CisKKwkvKgorCSAqIFdhaXQgZm9yIHRoZSBmaXJtd2FyZSB0byBzcGluIHVwIC0gbWF4IDMgc2Vjb25kcy4KKwkgKi8KKwlteWppZiA9IGppZmZpZXMgKyAzICogSFo7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIG15amlmKSAmJiAhYXAtPmZ3X3J1bm5pbmcpCisJCWNwdV9yZWxheCgpOworCisJaWYgKCFhcC0+ZndfcnVubmluZykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGaXJtd2FyZSBOT1QgcnVubmluZyFcbiIsIGFwLT5uYW1lKTsKKworCQlhY2VfZHVtcF90cmFjZShhcCk7CisJCXdyaXRlbChyZWFkbCgmcmVncy0+Q3B1Q3RybCkgfCBDUFVfSEFMVCwgJnJlZ3MtPkNwdUN0cmwpOworCQlyZWFkbCgmcmVncy0+Q3B1Q3RybCk7CisKKwkJLyogYW1hbkBzZ2kuY29tIC0gYWNjb3VudCBmb3IgYmFkbHkgYmVoYXZpbmcgZmlybXdhcmUvTklDOgorCQkgKiAtIGhhdmUgb2JzZXJ2ZWQgdGhhdCB0aGUgTklDIG1heSBjb250aW51ZSB0byBnZW5lcmF0ZQorCQkgKiAgIGludGVycnVwdHMgZm9yIHNvbWUgcmVhc29uOyBhdHRlbXB0IHRvIHN0b3AgaXQgLSBoYWx0CisJCSAqICAgc2Vjb25kIENQVSBmb3IgVGlnb24gSUkgY2FyZHMsIGFuZCBhbHNvIGNsZWFyIE1iMAorCQkgKiAtIGlmIHdlJ3JlIGEgbW9kdWxlLCB3ZSdsbCBmYWlsIHRvIGxvYWQgaWYgdGhpcyB3YXMKKwkJICogICB0aGUgb25seSBHYkUgY2FyZCBpbiB0aGUgc3lzdGVtID0+IGlmIHRoZSBrZXJuZWwgZG9lcworCQkgKiAgIHNlZSBhbiBpbnRlcnJ1cHQgZnJvbSB0aGUgTklDLCBjb2RlIHRvIGhhbmRsZSBpdCBpcworCQkgKiAgIGdvbmUgYW5kIE9PcHMhIC0gc28gZnJlZV9pcnEgYWxzbworCQkgKi8KKwkJaWYgKGFwLT52ZXJzaW9uID49IDIpCisJCQl3cml0ZWwocmVhZGwoJnJlZ3MtPkNwdUJDdHJsKSB8IENQVV9IQUxULAorCQkJICAgICAgICZyZWdzLT5DcHVCQ3RybCk7CisJCXdyaXRlbCgwLCAmcmVncy0+TWIwTG8pOworCQlyZWFkbCgmcmVncy0+TWIwTG8pOworCisJCWVjb2RlID0gLUVCVVNZOworCQlnb3RvIGluaXRfZXJyb3I7CisJfQorCisJLyoKKwkgKiBXZSBsb2FkIHRoZSByaW5nIGhlcmUgYXMgdGhlcmUgc2VlbSB0byBiZSBubyB3YXkgdG8gdGVsbCB0aGUKKwkgKiBmaXJtd2FyZSB0byB3aXBlIHRoZSByaW5nIHdpdGhvdXQgcmUtaW5pdGlhbGl6aW5nIGl0LgorCSAqLworCWlmICghdGVzdF9hbmRfc2V0X2JpdCgwLCAmYXAtPnN0ZF9yZWZpbGxfYnVzeSkpCisJCWFjZV9sb2FkX3N0ZF9yeF9yaW5nKGFwLCBSWF9SSU5HX1NJWkUpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogU29tZW9uZSBpcyBidXN5IHJlZmlsbGluZyB0aGUgUlggcmluZ1xuIiwKKwkJICAgICAgIGFwLT5uYW1lKTsKKwlpZiAoYXAtPnZlcnNpb24gPj0gMikgeworCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoMCwgJmFwLT5taW5pX3JlZmlsbF9idXN5KSkKKwkJCWFjZV9sb2FkX21pbmlfcnhfcmluZyhhcCwgUlhfTUlOSV9TSVpFKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogU29tZW9uZSBpcyBidXN5IHJlZmlsbGluZyAiCisJCQkgICAgICAgInRoZSBSWCBtaW5pIHJpbmdcbiIsIGFwLT5uYW1lKTsKKwl9CisJcmV0dXJuIDA7CisKKyBpbml0X2Vycm9yOgorCWFjZV9pbml0X2NsZWFudXAoZGV2KTsKKwlyZXR1cm4gZWNvZGU7Cit9CisKKworc3RhdGljIHZvaWQgYWNlX3NldF9yeHR4X3Bhcm1zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBqdW1ibykKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWNlX3JlZ3MgX19pb21lbSAqcmVncyA9IGFwLT5yZWdzOworCWludCBib2FyZF9pZHggPSBhcC0+Ym9hcmRfaWR4OworCisJaWYgKGJvYXJkX2lkeCA+PSAwKSB7CisJCWlmICghanVtYm8pIHsKKwkJCWlmICghdHhfY29hbF90aWNrW2JvYXJkX2lkeF0pCisJCQkJd3JpdGVsKERFRl9UWF9DT0FMLCAmcmVncy0+VHVuZVR4Q29hbFRpY2tzKTsKKwkJCWlmICghbWF4X3R4X2Rlc2NbYm9hcmRfaWR4XSkKKwkJCQl3cml0ZWwoREVGX1RYX01BWF9ERVNDLCAmcmVncy0+VHVuZU1heFR4RGVzYyk7CisJCQlpZiAoIXJ4X2NvYWxfdGlja1tib2FyZF9pZHhdKQorCQkJCXdyaXRlbChERUZfUlhfQ09BTCwgJnJlZ3MtPlR1bmVSeENvYWxUaWNrcyk7CisJCQlpZiAoIW1heF9yeF9kZXNjW2JvYXJkX2lkeF0pCisJCQkJd3JpdGVsKERFRl9SWF9NQVhfREVTQywgJnJlZ3MtPlR1bmVNYXhSeERlc2MpOworCQkJaWYgKCF0eF9yYXRpb1tib2FyZF9pZHhdKQorCQkJCXdyaXRlbChERUZfVFhfUkFUSU8sICZyZWdzLT5UeEJ1ZlJhdCk7CisJCX0gZWxzZSB7CisJCQlpZiAoIXR4X2NvYWxfdGlja1tib2FyZF9pZHhdKQorCQkJCXdyaXRlbChERUZfSlVNQk9fVFhfQ09BTCwKKwkJCQkgICAgICAgJnJlZ3MtPlR1bmVUeENvYWxUaWNrcyk7CisJCQlpZiAoIW1heF90eF9kZXNjW2JvYXJkX2lkeF0pCisJCQkJd3JpdGVsKERFRl9KVU1CT19UWF9NQVhfREVTQywKKwkJCQkgICAgICAgJnJlZ3MtPlR1bmVNYXhUeERlc2MpOworCQkJaWYgKCFyeF9jb2FsX3RpY2tbYm9hcmRfaWR4XSkKKwkJCQl3cml0ZWwoREVGX0pVTUJPX1JYX0NPQUwsCisJCQkJICAgICAgICZyZWdzLT5UdW5lUnhDb2FsVGlja3MpOworCQkJaWYgKCFtYXhfcnhfZGVzY1tib2FyZF9pZHhdKQorCQkJCXdyaXRlbChERUZfSlVNQk9fUlhfTUFYX0RFU0MsCisJCQkJICAgICAgICZyZWdzLT5UdW5lTWF4UnhEZXNjKTsKKwkJCWlmICghdHhfcmF0aW9bYm9hcmRfaWR4XSkKKwkJCQl3cml0ZWwoREVGX0pVTUJPX1RYX1JBVElPLCAmcmVncy0+VHhCdWZSYXQpOworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGFjZV93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWNlX3JlZ3MgX19pb21lbSAqcmVncyA9IGFwLT5yZWdzOworCisJLyoKKwkgKiBXZSBoYXZlbid0IHJlY2VpdmVkIGEgc3RhdHMgdXBkYXRlIGV2ZW50IGZvciBtb3JlIHRoYW4gMi41CisJICogc2Vjb25kcyBhbmQgdGhlcmUgaXMgZGF0YSBpbiB0aGUgdHJhbnNtaXQgcXVldWUsIHRodXMgd2UKKwkgKiBhc3VtZSB0aGUgY2FyZCBpcyBzdHVjay4KKwkgKi8KKwlpZiAoKmFwLT50eF9jc20gIT0gYXAtPnR4X3JldF9jc20pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRyYW5zbWl0dGVyIGlzIHN0dWNrLCAlMDh4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCAodW5zaWduZWQgaW50KXJlYWRsKCZyZWdzLT5Ib3N0Q3RybCkpOworCQkvKiBUaGlzIGNhbiBoYXBwZW4gZHVlIHRvIGllZWUgZmxvdyBjb250cm9sLiAqLworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogQlVHLi4uIHRyYW5zbWl0dGVyIGRpZWQuIEtpY2tpbmcgaXQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNpZiAwCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKyNlbmRpZgorCX0KK30KKworCitzdGF0aWMgdm9pZCBhY2VfdGFza2xldCh1bnNpZ25lZCBsb25nIGRldikKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2KTsKKwlpbnQgY3VyX3NpemU7CisKKwljdXJfc2l6ZSA9IGF0b21pY19yZWFkKCZhcC0+Y3VyX3J4X2J1ZnMpOworCWlmICgoY3VyX3NpemUgPCBSWF9MT1dfU1REX1RIUkVTKSAmJgorCSAgICAhdGVzdF9hbmRfc2V0X2JpdCgwLCAmYXAtPnN0ZF9yZWZpbGxfYnVzeSkpIHsKKyNpZmRlZiBERUJVRworCQlwcmludGsoInJlZmlsbGluZyBidWZmZXJzIChjdXJyZW50ICVpKVxuIiwgY3VyX3NpemUpOworI2VuZGlmCisJCWFjZV9sb2FkX3N0ZF9yeF9yaW5nKGFwLCBSWF9SSU5HX1NJWkUgLSBjdXJfc2l6ZSk7CisJfQorCisJaWYgKGFwLT52ZXJzaW9uID49IDIpIHsKKwkJY3VyX3NpemUgPSBhdG9taWNfcmVhZCgmYXAtPmN1cl9taW5pX2J1ZnMpOworCQlpZiAoKGN1cl9zaXplIDwgUlhfTE9XX01JTklfVEhSRVMpICYmCisJCSAgICAhdGVzdF9hbmRfc2V0X2JpdCgwLCAmYXAtPm1pbmlfcmVmaWxsX2J1c3kpKSB7CisjaWZkZWYgREVCVUcKKwkJCXByaW50aygicmVmaWxsaW5nIG1pbmkgYnVmZmVycyAoY3VycmVudCAlaSlcbiIsCisJCQkgICAgICAgY3VyX3NpemUpOworI2VuZGlmCisJCQlhY2VfbG9hZF9taW5pX3J4X3JpbmcoYXAsIFJYX01JTklfU0laRSAtIGN1cl9zaXplKTsKKwkJfQorCX0KKworCWN1cl9zaXplID0gYXRvbWljX3JlYWQoJmFwLT5jdXJfanVtYm9fYnVmcyk7CisJaWYgKGFwLT5qdW1ibyAmJiAoY3VyX3NpemUgPCBSWF9MT1dfSlVNQk9fVEhSRVMpICYmCisJICAgICF0ZXN0X2FuZF9zZXRfYml0KDAsICZhcC0+anVtYm9fcmVmaWxsX2J1c3kpKSB7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJyZWZpbGxpbmcganVtYm8gYnVmZmVycyAoY3VycmVudCAlaSlcbiIsIGN1cl9zaXplKTsKKyNlbmRpZgorCQlhY2VfbG9hZF9qdW1ib19yeF9yaW5nKGFwLCBSWF9KVU1CT19TSVpFIC0gY3VyX3NpemUpOworCX0KKwlhcC0+dGFza2xldF9wZW5kaW5nID0gMDsKK30KKworCisvKgorICogQ29weSB0aGUgY29udGVudHMgb2YgdGhlIE5JQydzIHRyYWNlIGJ1ZmZlciB0byBrZXJuZWwgbWVtb3J5LgorICovCitzdGF0aWMgdm9pZCBhY2VfZHVtcF90cmFjZShzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwKQoreworI2lmIDAKKwlpZiAoIWFwLT50cmFjZV9idWYpCisJCWlmICghKGFwLT50cmFjZV9idWYgPSBrbWFsbG9jKEFDRV9UUkFDRV9TSVpFLCBHRlBfS0VSTkVMKSkpCisJCSAgICByZXR1cm47CisjZW5kaWYKK30KKworCisvKgorICogTG9hZCB0aGUgc3RhbmRhcmQgcnggcmluZy4KKyAqCisgKiBMb2FkaW5nIHJpbmdzIGlzIHNhZmUgd2l0aG91dCBob2xkaW5nIHRoZSBzcGluIGxvY2sgc2luY2UgdGhpcyBpcworICogZG9uZSBvbmx5IGJlZm9yZSB0aGUgZGV2aWNlIGlzIGVuYWJsZWQsIHRodXMgbm8gaW50ZXJydXB0cyBhcmUKKyAqIGdlbmVyYXRlZCBhbmQgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyL3Rhc2tsZXQgaGFuZGxlci4KKyAqLworc3RhdGljIHZvaWQgYWNlX2xvYWRfc3RkX3J4X3Jpbmcoc3RydWN0IGFjZV9wcml2YXRlICphcCwgaW50IG5yX2J1ZnMpCit7CisJc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MgPSBhcC0+cmVnczsKKwlzaG9ydCBpLCBpZHg7CisJCisKKwlwcmVmZXRjaHcoJmFwLT5jdXJfcnhfYnVmcyk7CisKKwlpZHggPSBhcC0+cnhfc3RkX3NrYnByZDsKKworCWZvciAoaSA9IDA7IGkgPCBucl9idWZzOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJc3RydWN0IHJ4X2Rlc2MgKnJkOworCQlkbWFfYWRkcl90IG1hcHBpbmc7CisKKwkJc2tiID0gYWxsb2Nfc2tiKEFDRV9TVERfQlVGU0laRSArIE5FVF9JUF9BTElHTiwgR0ZQX0FUT01JQyk7CisJCWlmICghc2tiKQorCQkJYnJlYWs7CisKKwkJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOworCQltYXBwaW5nID0gcGNpX21hcF9wYWdlKGFwLT5wZGV2LCB2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhKSwKKwkJCQkgICAgICAgb2Zmc2V0X2luX3BhZ2Uoc2tiLT5kYXRhKSwKKwkJCQkgICAgICAgQUNFX1NURF9CVUZTSVpFLAorCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlhcC0+c2tiLT5yeF9zdGRfc2tidWZmW2lkeF0uc2tiID0gc2tiOworCQlwY2lfdW5tYXBfYWRkcl9zZXQoJmFwLT5za2ItPnJ4X3N0ZF9za2J1ZmZbaWR4XSwKKwkJCQkgICBtYXBwaW5nLCBtYXBwaW5nKTsKKworCQlyZCA9ICZhcC0+cnhfc3RkX3JpbmdbaWR4XTsKKwkJc2V0X2FjZWFkZHIoJnJkLT5hZGRyLCBtYXBwaW5nKTsKKwkJcmQtPnNpemUgPSBBQ0VfU1REX0JVRlNJWkU7CisJCXJkLT5pZHggPSBpZHg7CisJCWlkeCA9IChpZHggKyAxKSAlIFJYX1NURF9SSU5HX0VOVFJJRVM7CisJfQorCisJaWYgKCFpKQorCQlnb3RvIGVycm9yX291dDsKKworCWF0b21pY19hZGQoaSwgJmFwLT5jdXJfcnhfYnVmcyk7CisJYXAtPnJ4X3N0ZF9za2JwcmQgPSBpZHg7CisKKwlpZiAoQUNFX0lTX1RJR09OX0koYXApKSB7CisJCXN0cnVjdCBjbWQgY21kOworCQljbWQuZXZ0ID0gQ19TRVRfUlhfUFJEX0lEWDsKKwkJY21kLmNvZGUgPSAwOworCQljbWQuaWR4ID0gYXAtPnJ4X3N0ZF9za2JwcmQ7CisJCWFjZV9pc3N1ZV9jbWQocmVncywgJmNtZCk7CisJfSBlbHNlIHsKKwkJd3JpdGVsKGlkeCwgJnJlZ3MtPlJ4U3RkUHJkKTsKKwkJd21iKCk7CisJfQorCisgb3V0OgorCWNsZWFyX2JpdCgwLCAmYXAtPnN0ZF9yZWZpbGxfYnVzeSk7CisJcmV0dXJuOworCisgZXJyb3Jfb3V0OgorCXByaW50ayhLRVJOX0lORk8gIk91dCBvZiBtZW1vcnkgd2hlbiBhbGxvY2F0aW5nICIKKwkgICAgICAgInN0YW5kYXJkIHJlY2VpdmUgYnVmZmVyc1xuIik7CisJZ290byBvdXQ7Cit9CisKKworc3RhdGljIHZvaWQgYWNlX2xvYWRfbWluaV9yeF9yaW5nKHN0cnVjdCBhY2VfcHJpdmF0ZSAqYXAsIGludCBucl9idWZzKQoreworCXN0cnVjdCBhY2VfcmVncyBfX2lvbWVtICpyZWdzID0gYXAtPnJlZ3M7CisJc2hvcnQgaSwgaWR4OworCisJcHJlZmV0Y2h3KCZhcC0+Y3VyX21pbmlfYnVmcyk7CisKKwlpZHggPSBhcC0+cnhfbWluaV9za2JwcmQ7CisJZm9yIChpID0gMDsgaSA8IG5yX2J1ZnM7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlzdHJ1Y3QgcnhfZGVzYyAqcmQ7CisJCWRtYV9hZGRyX3QgbWFwcGluZzsKKworCQlza2IgPSBhbGxvY19za2IoQUNFX01JTklfQlVGU0laRSArIE5FVF9JUF9BTElHTiwgR0ZQX0FUT01JQyk7CisJCWlmICghc2tiKQorCQkJYnJlYWs7CisKKwkJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOworCQltYXBwaW5nID0gcGNpX21hcF9wYWdlKGFwLT5wZGV2LCB2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhKSwKKwkJCQkgICAgICAgb2Zmc2V0X2luX3BhZ2Uoc2tiLT5kYXRhKSwKKwkJCQkgICAgICAgQUNFX01JTklfQlVGU0laRSwKKwkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJYXAtPnNrYi0+cnhfbWluaV9za2J1ZmZbaWR4XS5za2IgPSBza2I7CisJCXBjaV91bm1hcF9hZGRyX3NldCgmYXAtPnNrYi0+cnhfbWluaV9za2J1ZmZbaWR4XSwKKwkJCQkgICBtYXBwaW5nLCBtYXBwaW5nKTsKKworCQlyZCA9ICZhcC0+cnhfbWluaV9yaW5nW2lkeF07CisJCXNldF9hY2VhZGRyKCZyZC0+YWRkciwgbWFwcGluZyk7CisJCXJkLT5zaXplID0gQUNFX01JTklfQlVGU0laRTsKKwkJcmQtPmlkeCA9IGlkeDsKKwkJaWR4ID0gKGlkeCArIDEpICUgUlhfTUlOSV9SSU5HX0VOVFJJRVM7CisJfQorCisJaWYgKCFpKQorCQlnb3RvIGVycm9yX291dDsKKworCWF0b21pY19hZGQoaSwgJmFwLT5jdXJfbWluaV9idWZzKTsKKworCWFwLT5yeF9taW5pX3NrYnByZCA9IGlkeDsKKworCXdyaXRlbChpZHgsICZyZWdzLT5SeE1pbmlQcmQpOworCXdtYigpOworCisgb3V0OgorCWNsZWFyX2JpdCgwLCAmYXAtPm1pbmlfcmVmaWxsX2J1c3kpOworCXJldHVybjsKKyBlcnJvcl9vdXQ6CisJcHJpbnRrKEtFUk5fSU5GTyAiT3V0IG9mIG1lbW9yeSB3aGVuIGFsbG9jYXRpbmcgIgorCSAgICAgICAibWluaSByZWNlaXZlIGJ1ZmZlcnNcbiIpOworCWdvdG8gb3V0OworfQorCisKKy8qCisgKiBMb2FkIHRoZSBqdW1ibyByeCByaW5nLCB0aGlzIG1heSBoYXBwZW4gYXQgYW55IHRpbWUgaWYgdGhlIE1UVQorICogaXMgY2hhbmdlZCB0byBhIHZhbHVlID4gMTUwMC4KKyAqLworc3RhdGljIHZvaWQgYWNlX2xvYWRfanVtYm9fcnhfcmluZyhzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwLCBpbnQgbnJfYnVmcykKK3sKKwlzdHJ1Y3QgYWNlX3JlZ3MgX19pb21lbSAqcmVncyA9IGFwLT5yZWdzOworCXNob3J0IGksIGlkeDsKKworCWlkeCA9IGFwLT5yeF9qdW1ib19za2JwcmQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfYnVmczsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXN0cnVjdCByeF9kZXNjICpyZDsKKwkJZG1hX2FkZHJfdCBtYXBwaW5nOworCisJCXNrYiA9IGFsbG9jX3NrYihBQ0VfSlVNQk9fQlVGU0laRSArIE5FVF9JUF9BTElHTiwgR0ZQX0FUT01JQyk7CisJCWlmICghc2tiKQorCQkJYnJlYWs7CisKKwkJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOworCQltYXBwaW5nID0gcGNpX21hcF9wYWdlKGFwLT5wZGV2LCB2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhKSwKKwkJCQkgICAgICAgb2Zmc2V0X2luX3BhZ2Uoc2tiLT5kYXRhKSwKKwkJCQkgICAgICAgQUNFX0pVTUJPX0JVRlNJWkUsCisJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCWFwLT5za2ItPnJ4X2p1bWJvX3NrYnVmZltpZHhdLnNrYiA9IHNrYjsKKwkJcGNpX3VubWFwX2FkZHJfc2V0KCZhcC0+c2tiLT5yeF9qdW1ib19za2J1ZmZbaWR4XSwKKwkJCQkgICBtYXBwaW5nLCBtYXBwaW5nKTsKKworCQlyZCA9ICZhcC0+cnhfanVtYm9fcmluZ1tpZHhdOworCQlzZXRfYWNlYWRkcigmcmQtPmFkZHIsIG1hcHBpbmcpOworCQlyZC0+c2l6ZSA9IEFDRV9KVU1CT19CVUZTSVpFOworCQlyZC0+aWR4ID0gaWR4OworCQlpZHggPSAoaWR4ICsgMSkgJSBSWF9KVU1CT19SSU5HX0VOVFJJRVM7CisJfQorCisJaWYgKCFpKQorCQlnb3RvIGVycm9yX291dDsKKworCWF0b21pY19hZGQoaSwgJmFwLT5jdXJfanVtYm9fYnVmcyk7CisJYXAtPnJ4X2p1bWJvX3NrYnByZCA9IGlkeDsKKworCWlmIChBQ0VfSVNfVElHT05fSShhcCkpIHsKKwkJc3RydWN0IGNtZCBjbWQ7CisJCWNtZC5ldnQgPSBDX1NFVF9SWF9KVU1CT19QUkRfSURYOworCQljbWQuY29kZSA9IDA7CisJCWNtZC5pZHggPSBhcC0+cnhfanVtYm9fc2ticHJkOworCQlhY2VfaXNzdWVfY21kKHJlZ3MsICZjbWQpOworCX0gZWxzZSB7CisJCXdyaXRlbChpZHgsICZyZWdzLT5SeEp1bWJvUHJkKTsKKwkJd21iKCk7CisJfQorCisgb3V0OgorCWNsZWFyX2JpdCgwLCAmYXAtPmp1bWJvX3JlZmlsbF9idXN5KTsKKwlyZXR1cm47CisgZXJyb3Jfb3V0OgorCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCXByaW50ayhLRVJOX0lORk8gIk91dCBvZiBtZW1vcnkgd2hlbiBhbGxvY2F0aW5nICIKKwkJICAgICAgICJqdW1ibyByZWNlaXZlIGJ1ZmZlcnNcbiIpOworCWdvdG8gb3V0OworfQorCisKKy8qCisgKiBBbGwgZXZlbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIHNsb3cgKFJYL1RYIGludHMgZG8gbm90IGdlbmVyYXRlCisgKiBldmVudHMpIGFuZCBhcmUgaGFuZGxlZCBoZXJlLCBvdXRzaWRlIHRoZSBtYWluIGludGVycnVwdCBoYW5kbGVyLAorICogdG8gcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBoYW5kbGVyLgorICovCitzdGF0aWMgdTMyIGFjZV9oYW5kbGVfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGV2dGNzbSwgdTMyIGV2dHByZCkKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwOworCisJYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJd2hpbGUgKGV2dGNzbSAhPSBldnRwcmQpIHsKKwkJc3dpdGNoIChhcC0+ZXZ0X3JpbmdbZXZ0Y3NtXS5ldnQpIHsKKwkJY2FzZSBFX0ZXX1JVTk5JTkc6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRmlybXdhcmUgdXAgYW5kIHJ1bm5pbmdcbiIsCisJCQkgICAgICAgYXAtPm5hbWUpOworCQkJYXAtPmZ3X3J1bm5pbmcgPSAxOworCQkJd21iKCk7CisJCQlicmVhazsKKwkJY2FzZSBFX1NUQVRTX1VQREFURUQ6CisJCQlicmVhazsKKwkJY2FzZSBFX0xOS19TVEFURToKKwkJeworCQkJdTE2IGNvZGUgPSBhcC0+ZXZ0X3JpbmdbZXZ0Y3NtXS5jb2RlOworCQkJc3dpdGNoIChjb2RlKSB7CisJCQljYXNlIEVfQ19MSU5LX1VQOgorCQkJeworCQkJCXUzMiBzdGF0ZSA9IHJlYWRsKCZhcC0+cmVncy0+R2lnTG5rU3RhdGUpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPcHRpY2FsIGxpbmsgVVAgIgorCQkJCSAgICAgICAiKCVzIER1cGxleCwgRmxvdyBDb250cm9sOiAlcyVzKVxuIiwKKwkJCQkgICAgICAgYXAtPm5hbWUsCisJCQkJICAgICAgIHN0YXRlICYgTE5LX0ZVTExfRFVQTEVYID8gIkZ1bGwiOiJIYWxmIiwKKwkJCQkgICAgICAgc3RhdGUgJiBMTktfVFhfRkxPV19DVExfWSA/ICJUWCAiIDogIiIsCisJCQkJICAgICAgIHN0YXRlICYgTE5LX1JYX0ZMT1dfQ1RMX1kgPyAiUlgiIDogIiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBFX0NfTElOS19ET1dOOgorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPcHRpY2FsIGxpbmsgRE9XTlxuIiwKKwkJCQkgICAgICAgYXAtPm5hbWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBFX0NfTElOS18xMF8xMDA6CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IDEwLzEwMEJhc2VUIGxpbmsgIgorCQkJCSAgICAgICAiVVBcbiIsIGFwLT5uYW1lKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5rbm93biBvcHRpY2FsIGxpbmsgIgorCQkJCSAgICAgICAic3RhdGUgJTAyeFxuIiwgYXAtPm5hbWUsIGNvZGUpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBFX0VSUk9SOgorCQkJc3dpdGNoKGFwLT5ldnRfcmluZ1tldnRjc21dLmNvZGUpIHsKKwkJCWNhc2UgRV9DX0VSUl9JTlZBTF9DTUQ6CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogaW52YWxpZCBjb21tYW5kIGVycm9yXG4iLAorCQkJCSAgICAgICBhcC0+bmFtZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEVfQ19FUlJfVU5JTVBfQ01EOgorCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuaW1wbGVtZW50ZWQgY29tbWFuZCAiCisJCQkJICAgICAgICJlcnJvclxuIiwgYXAtPm5hbWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBFX0NfRVJSX0JBRF9DRkc6CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogYmFkIGNvbmZpZyBlcnJvclxuIiwKKwkJCQkgICAgICAgYXAtPm5hbWUpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmtub3duIGVycm9yICUwMnhcbiIsCisJCQkJICAgICAgIGFwLT5uYW1lLCBhcC0+ZXZ0X3JpbmdbZXZ0Y3NtXS5jb2RlKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEVfUkVTRVRfSlVNQk9fUk5HOgorCQl7CisJCQlpbnQgaTsKKwkJCWZvciAoaSA9IDA7IGkgPCBSWF9KVU1CT19SSU5HX0VOVFJJRVM7IGkrKykgeworCQkJCWlmIChhcC0+c2tiLT5yeF9qdW1ib19za2J1ZmZbaV0uc2tiKSB7CisJCQkJCWFwLT5yeF9qdW1ib19yaW5nW2ldLnNpemUgPSAwOworCQkJCQlzZXRfYWNlYWRkcigmYXAtPnJ4X2p1bWJvX3JpbmdbaV0uYWRkciwgMCk7CisJCQkJCWRldl9rZnJlZV9za2IoYXAtPnNrYi0+cnhfanVtYm9fc2tidWZmW2ldLnNrYik7CisJCQkJCWFwLT5za2ItPnJ4X2p1bWJvX3NrYnVmZltpXS5za2IgPSBOVUxMOworCQkJCX0KKwkJCX0KKworIAkJCWlmIChBQ0VfSVNfVElHT05fSShhcCkpIHsKKyAJCQkJc3RydWN0IGNtZCBjbWQ7CisgCQkJCWNtZC5ldnQgPSBDX1NFVF9SWF9KVU1CT19QUkRfSURYOworIAkJCQljbWQuY29kZSA9IDA7CisgCQkJCWNtZC5pZHggPSAwOworIAkJCQlhY2VfaXNzdWVfY21kKGFwLT5yZWdzLCAmY21kKTsKKyAJCQl9IGVsc2UgeworIAkJCQl3cml0ZWwoMCwgJigoYXAtPnJlZ3MpLT5SeEp1bWJvUHJkKSk7CisgCQkJCXdtYigpOworIAkJCX0KKworCQkJYXAtPmp1bWJvID0gMDsKKwkJCWFwLT5yeF9qdW1ib19za2JwcmQgPSAwOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEp1bWJvIHJpbmcgZmx1c2hlZFxuIiwKKwkJCSAgICAgICBhcC0+bmFtZSk7CisJCQljbGVhcl9iaXQoMCwgJmFwLT5qdW1ib19yZWZpbGxfYnVzeSk7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5oYW5kbGVkIGV2ZW50IDB4JTAyeFxuIiwKKwkJCSAgICAgICBhcC0+bmFtZSwgYXAtPmV2dF9yaW5nW2V2dGNzbV0uZXZ0KTsKKwkJfQorCQlldnRjc20gPSAoZXZ0Y3NtICsgMSkgJSBFVlRfUklOR19FTlRSSUVTOworCX0KKworCXJldHVybiBldnRjc207Cit9CisKKworc3RhdGljIHZvaWQgYWNlX3J4X2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgcnhyZXRwcmQsIHUzMiByeHJldGNzbSkKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgaWR4OworCWludCBtaW5pX2NvdW50ID0gMCwgc3RkX2NvdW50ID0gMDsKKworCWlkeCA9IHJ4cmV0Y3NtOworCisJcHJlZmV0Y2h3KCZhcC0+Y3VyX3J4X2J1ZnMpOworCXByZWZldGNodygmYXAtPmN1cl9taW5pX2J1ZnMpOworCQorCXdoaWxlIChpZHggIT0gcnhyZXRwcmQpIHsKKwkJc3RydWN0IHJpbmdfaW5mbyAqcmlwOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlzdHJ1Y3QgcnhfZGVzYyAqcnhkZXNjLCAqcmV0ZGVzYzsKKwkJdTMyIHNrYmlkeDsKKwkJaW50IGJkX2ZsYWdzLCBkZXNjX3R5cGUsIG1hcHNpemU7CisJCXUxNiBjc3VtOworCisKKwkJLyogbWFrZSBzdXJlIHRoZSByeCBkZXNjcmlwdG9yIGlzbid0IHJlYWQgYmVmb3JlIHJ4cmV0cHJkICovCisJCWlmIChpZHggPT0gcnhyZXRjc20pIAorCQkJcm1iKCk7CisKKwkJcmV0ZGVzYyA9ICZhcC0+cnhfcmV0dXJuX3JpbmdbaWR4XTsKKwkJc2tiaWR4ID0gcmV0ZGVzYy0+aWR4OworCQliZF9mbGFncyA9IHJldGRlc2MtPmZsYWdzOworCQlkZXNjX3R5cGUgPSBiZF9mbGFncyAmIChCRF9GTEdfSlVNQk8gfCBCRF9GTEdfTUlOSSk7CisKKwkJc3dpdGNoKGRlc2NfdHlwZSkgeworCQkJLyoKKwkJCSAqIE5vcm1hbCBmcmFtZXMgZG8gbm90IGhhdmUgYW55IGZsYWdzIHNldAorCQkJICoKKwkJCSAqIE1pbmkgYW5kIG5vcm1hbCBmcmFtZXMgYXJyaXZlIGZyZXF1ZW50bHksCisJCQkgKiBzbyB1c2UgYSBsb2NhbCBjb3VudGVyIHRvIGF2b2lkIGRvaW5nCisJCQkgKiBhdG9taWMgb3BlcmF0aW9ucyBmb3IgZWFjaCBwYWNrZXQgYXJyaXZpbmcuCisJCQkgKi8KKwkJY2FzZSAwOgorCQkJcmlwID0gJmFwLT5za2ItPnJ4X3N0ZF9za2J1ZmZbc2tiaWR4XTsKKwkJCW1hcHNpemUgPSBBQ0VfU1REX0JVRlNJWkU7CisJCQlyeGRlc2MgPSAmYXAtPnJ4X3N0ZF9yaW5nW3NrYmlkeF07CisJCQlzdGRfY291bnQrKzsKKwkJCWJyZWFrOworCQljYXNlIEJEX0ZMR19KVU1CTzoKKwkJCXJpcCA9ICZhcC0+c2tiLT5yeF9qdW1ib19za2J1ZmZbc2tiaWR4XTsKKwkJCW1hcHNpemUgPSBBQ0VfSlVNQk9fQlVGU0laRTsKKwkJCXJ4ZGVzYyA9ICZhcC0+cnhfanVtYm9fcmluZ1tza2JpZHhdOworCQkJYXRvbWljX2RlYygmYXAtPmN1cl9qdW1ib19idWZzKTsKKwkJCWJyZWFrOworCQljYXNlIEJEX0ZMR19NSU5JOgorCQkJcmlwID0gJmFwLT5za2ItPnJ4X21pbmlfc2tidWZmW3NrYmlkeF07CisJCQltYXBzaXplID0gQUNFX01JTklfQlVGU0laRTsKKwkJCXJ4ZGVzYyA9ICZhcC0+cnhfbWluaV9yaW5nW3NrYmlkeF07CisJCQltaW5pX2NvdW50Kys7IAorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogdW5rbm93biBmcmFtZSB0eXBlICgweCUwMngpICIKKwkJCSAgICAgICAicmV0dXJuZWQgYnkgTklDXG4iLCBkZXYtPm5hbWUsCisJCQkgICAgICAgcmV0ZGVzYy0+ZmxhZ3MpOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCXNrYiA9IHJpcC0+c2tiOworCQlyaXAtPnNrYiA9IE5VTEw7CisJCXBjaV91bm1hcF9wYWdlKGFwLT5wZGV2LAorCQkJICAgICAgIHBjaV91bm1hcF9hZGRyKHJpcCwgbWFwcGluZyksCisJCQkgICAgICAgbWFwc2l6ZSwKKwkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlza2JfcHV0KHNrYiwgcmV0ZGVzYy0+c2l6ZSk7CisKKwkJLyoKKwkJICogRmx5IGJhYnksIGZseSEKKwkJICovCisJCWNzdW0gPSByZXRkZXNjLT50Y3BfdWRwX2NzdW07CisKKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisKKwkJLyoKKwkJICogSW5zdGVhZCBvZiBmb3JjaW5nIHRoZSBwb29yIHRpZ29uIG1pcHMgY3B1IHRvIGNhbGN1bGF0ZQorCQkgKiBwc2V1ZG8gaGRyIGNoZWNrc3VtLCB3ZSBkbyB0aGlzIG91cnNlbHZlcy4KKwkJICovCisJCWlmIChiZF9mbGFncyAmIEJEX0ZMR19UQ1BfVURQX1NVTSkgeworCQkJc2tiLT5jc3VtID0gaHRvbnMoY3N1bSk7CisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0hXOworCQl9IGVsc2UgeworCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQl9CisKKwkJLyogc2VuZCBpdCB1cCAqLworI2lmIEFDRU5JQ19ET19WTEFOCisJCWlmIChhcC0+dmxncnAgJiYgKGJkX2ZsYWdzICYgQkRfRkxHX1ZMQU5fVEFHKSkgeworCQkJdmxhbl9od2FjY2VsX3J4KHNrYiwgYXAtPnZsZ3JwLCByZXRkZXNjLT52bGFuKTsKKwkJfSBlbHNlCisjZW5kaWYKKwkJCW5ldGlmX3J4KHNrYik7CisKKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJYXAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJYXAtPnN0YXRzLnJ4X2J5dGVzICs9IHJldGRlc2MtPnNpemU7CisKKwkJaWR4ID0gKGlkeCArIDEpICUgUlhfUkVUVVJOX1JJTkdfRU5UUklFUzsKKwl9CisKKwlhdG9taWNfc3ViKHN0ZF9jb3VudCwgJmFwLT5jdXJfcnhfYnVmcyk7CisJaWYgKCFBQ0VfSVNfVElHT05fSShhcCkpCisJCWF0b21pY19zdWIobWluaV9jb3VudCwgJmFwLT5jdXJfbWluaV9idWZzKTsKKworIG91dDoKKwkvKgorCSAqIEFjY29yZGluZyB0byB0aGUgZG9jdW1lbnRhdGlvbiBSeFJldENzbSBpcyBvYnNvbGV0ZSB3aXRoCisJICogdGhlIDEyLjMueCBGaXJtd2FyZSAtIG15IFRpZ29uIEkgTklDcyBzZWVtIHRvIGRpc2FncmVlIQorCSAqLworCWlmIChBQ0VfSVNfVElHT05fSShhcCkpIHsKKwkJd3JpdGVsKGlkeCwgJmFwLT5yZWdzLT5SeFJldENzbSk7CisJfQorCWFwLT5jdXJfcnggPSBpZHg7CisKKwlyZXR1cm47CisgZXJyb3I6CisJaWR4ID0gcnhyZXRwcmQ7CisJZ290byBvdXQ7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGFjZV90eF9pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHUzMiB0eGNzbSwgdTMyIGlkeCkKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWRvIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJZG1hX2FkZHJfdCBtYXBwaW5nOworCQlzdHJ1Y3QgdHhfcmluZ19pbmZvICppbmZvOworCisJCWluZm8gPSBhcC0+c2tiLT50eF9za2J1ZmYgKyBpZHg7CisJCXNrYiA9IGluZm8tPnNrYjsKKwkJbWFwcGluZyA9IHBjaV91bm1hcF9hZGRyKGluZm8sIG1hcHBpbmcpOworCisJCWlmIChtYXBwaW5nKSB7CisJCQlwY2lfdW5tYXBfcGFnZShhcC0+cGRldiwgbWFwcGluZywKKwkJCQkgICAgICAgcGNpX3VubWFwX2xlbihpbmZvLCBtYXBsZW4pLAorCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCXBjaV91bm1hcF9hZGRyX3NldChpbmZvLCBtYXBwaW5nLCAwKTsKKwkJfQorCisJCWlmIChza2IpIHsKKwkJCWFwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlhcC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQkJaW5mby0+c2tiID0gTlVMTDsKKwkJfQorCisJCWlkeCA9IChpZHggKyAxKSAlIEFDRV9UWF9SSU5HX0VOVFJJRVMoYXApOworCX0gd2hpbGUgKGlkeCAhPSB0eGNzbSk7CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwl3bWIoKTsKKwlhcC0+dHhfcmV0X2NzbSA9IHR4Y3NtOworCisJLyogU28uLi4gdHhfcmV0X2NzbSBpcyBhZHZhbmNlZCBfYWZ0ZXJfIGNoZWNrIGZvciBkZXZpY2Ugd2FrZXVwLgorCSAqCisJICogV2UgY291bGQgdHJ5IHRvIG1ha2UgaXQgYmVmb3JlLiBJbiB0aGlzIGNhc2Ugd2Ugd291bGQgZ2V0CisJICogdGhlIGZvbGxvd2luZyByYWNlIGNvbmRpdGlvbjogaGFyZF9zdGFydF94bWl0IG9uIG90aGVyIGNwdQorCSAqIGVudGVycyBhZnRlciB3ZSBhZHZhbmNlZCB0eF9yZXRfY3NtIGFuZCBmaWxscyBzcGFjZSwKKwkgKiB3aGljaCB3ZSBoYXZlIGp1c3QgZnJlZWQsIHNvIHRoYXQgd2UgbWFrZSBpbGxlZ2FsIGRldmljZSB3YWtldXAuCisJICogVGhlcmUgaXMgbm8gZ29vZCB3YXkgdG8gd29ya2Fyb3VuZCB0aGlzIChhdCBlbnRyeQorCSAqIHRvIGFjZV9zdGFydF94bWl0IGRldGVjdHMgdGhpcyBjb25kaXRpb24gYW5kIHByZXZlbnRzCisJICogcmluZyBjb3JydXB0aW9uLCBidXQgaXQgaXMgbm90IGEgZ29vZCB3b3JrYXJvdW5kLikKKwkgKgorCSAqIFdoZW4gdHhfcmV0X2NzbSBpcyBhZHZhbmNlZCBhZnRlciwgd2Ugd2FrZSB1cCBkZXZpY2UgX29ubHlfCisJICogaWYgd2UgcmVhbGx5IGhhdmUgc29tZSBzcGFjZSBpbiByaW5nICh0aG91Z2ggdGhlIGNvcmUgZG9pbmcKKwkgKiBoYXJkX3N0YXJ0X3htaXQgY2FuIHNlZSBmdWxsIHJpbmcgZm9yIHNvbWUgcGVyaW9kIGFuZCBoYXMgdG8KKwkgKiBzeW5jaHJvbml6ZS4pIFN1cGVyYi4KKwkgKiBCVVQhIFdlIGdldCBhbm90aGVyIHN1YnRsZSByYWNlIGNvbmRpdGlvbi4gaGFyZF9zdGFydF94bWl0CisJICogbWF5IHRoaW5rIHRoYXQgcmluZyBpcyBmdWxsIGJldHdlZW4gd2FrZXVwIGFuZCBhZHZhbmNpbmcKKwkgKiB0eF9yZXRfY3NtIGFuZCB3aWxsIHN0b3AgZGV2aWNlIGluc3RhbnRseSEgSXQgaXMgbm90IHNvIGJhZC4KKwkgKiBXZSBhcmUgZ3VhcmFudGVlZCB0aGF0IHRoZXJlIGlzIHNvbWV0aGluZyBpbiByaW5nLCBzbyB0aGF0CisJICogdGhlIG5leHQgaXJxIHdpbGwgcmVzdW1lIHRyYW5zbWlzc2lvbi4gVG8gc3BlZWR1cCB0aGlzIHdlIGNvdWxkCisJICogbWFyayBkZXNjcmlwdG9yLCB3aGljaCBjbG9zZXMgcmluZyB3aXRoIEJEX0ZMR19DT0FMX05PVworCSAqIChzZWUgYWNlX3N0YXJ0X3htaXQpLgorCSAqCisJICogV2VsbCwgdGhpcyBkaWxlbW1hIGV4aXN0cyBpbiBhbGwgbG9jay1mcmVlIGRldmljZXMuCisJICogV2UsIGZvbGxvd2luZyBzY2hlbWUgdXNlZCBpbiBkcml2ZXJzIGJ5IERvbmFsZCBCZWNrZXIsCisJICogc2VsZWN0IHRoZSBsZWFzdCBkYW5nZXJvdXMuCisJICoJCQkJCQkJLS1BTksKKwkgKi8KK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3QgYWNlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpwdHJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWNlX3JlZ3MgX19pb21lbSAqcmVncyA9IGFwLT5yZWdzOworCXUzMiBpZHg7CisJdTMyIHR4Y3NtLCByeHJldGNzbSwgcnhyZXRwcmQ7CisJdTMyIGV2dGNzbSwgZXZ0cHJkOworCisJLyoKKwkgKiBJbiBjYXNlIG9mIFBDSSBzaGFyZWQgaW50ZXJydXB0cyBvciBzcHVyaW91cyBpbnRlcnJ1cHRzLAorCSAqIHdlIHdhbnQgdG8gbWFrZSBzdXJlIGl0IGlzIGFjdHVhbGx5IG91ciBpbnRlcnJ1cHQgYmVmb3JlCisJICogc3BlbmRpbmcgYW55IHRpbWUgaW4gaGVyZS4KKwkgKi8KKwlpZiAoIShyZWFkbCgmcmVncy0+SG9zdEN0cmwpICYgSU5fSU5UKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJLyoKKwkgKiBBQ0sgaW50ciBub3cuIE90aGVyd2lzZSB3ZSB3aWxsIGxvc2UgdXBkYXRlcyB0byByeF9yZXRfcHJkLAorCSAqIHdoaWNoIGhhcHBlbmVkIF9hZnRlcl8gcnhyZXRwcmQgPSAqYXAtPnJ4X3JldF9wcmQ7IGJ1dCBiZWZvcmUKKwkgKiB3cml0ZWwoMCwgJnJlZ3MtPk1iMExvKS4KKwkgKgorCSAqICJJUlEgYXZvaWRhbmNlIiByZWNvbW1lbmRlZCBpbiBkb2NzIGFwcGxpZXMgdG8gSVJRcyBzZXJ2ZWQKKwkgKiB0aHJlYWRzIGFuZCBpdCBpcyB3cm9uZyBldmVuIGZvciB0aGF0IGNhc2UuCisJICovCisJd3JpdGVsKDAsICZyZWdzLT5NYjBMbyk7CisJcmVhZGwoJnJlZ3MtPk1iMExvKTsKKworCS8qCisJICogVGhlcmUgaXMgbm8gY29uZmxpY3QgYmV0d2VlbiB0cmFuc21pdCBoYW5kbGluZyBpbgorCSAqIHN0YXJ0X3htaXQgYW5kIHJlY2VpdmUgcHJvY2Vzc2luZywgdGh1cyB0aGVyZSBpcyBubyByZWFzb24KKwkgKiB0byB0YWtlIGEgc3BpbiBsb2NrIGZvciBSWCBoYW5kbGluZy4gV2FpdCB1bnRpbCB3ZSBzdGFydAorCSAqIHdvcmtpbmcgb24gdGhlIG90aGVyIHN0dWZmIC0gaGV5IHdlIGRvbid0IG5lZWQgYSBzcGluIGxvY2sKKwkgKiBhbnltb3JlLgorCSAqLworCXJ4cmV0cHJkID0gKmFwLT5yeF9yZXRfcHJkOworCXJ4cmV0Y3NtID0gYXAtPmN1cl9yeDsKKworCWlmIChyeHJldHByZCAhPSByeHJldGNzbSkKKwkJYWNlX3J4X2ludChkZXYsIHJ4cmV0cHJkLCByeHJldGNzbSk7CisKKwl0eGNzbSA9ICphcC0+dHhfY3NtOworCWlkeCA9IGFwLT50eF9yZXRfY3NtOworCisJaWYgKHR4Y3NtICE9IGlkeCkgeworCQkvKgorCQkgKiBJZiBlYWNoIHNrYiB0YWtlcyBvbmx5IG9uZSBkZXNjcmlwdG9yIHRoaXMgY2hlY2sgZGVnZW5lcmF0ZXMKKwkJICogdG8gaWRlbnRpdHksIGJlY2F1c2UgbmV3IHNwYWNlIGhhcyBqdXN0IGJlZW4gb3BlbmVkLgorCQkgKiBCdXQgaWYgc2ticyBhcmUgZnJhZ21lbnRlZCB3ZSBtdXN0IGNoZWNrIHRoYXQgdGhpcyBpbmRleAorCQkgKiB1cGRhdGUgcmVsZWFzZXMgZW5vdWdoIG9mIHNwYWNlLCBvdGhlcndpc2Ugd2UganVzdAorCQkgKiB3YWl0IGZvciBkZXZpY2UgdG8gbWFrZSBtb3JlIHdvcmsuCisJCSAqLworCQlpZiAoIXR4X3JpbmdfZnVsbChhcCwgdHhjc20sIGFwLT50eF9wcmQpKQorCQkJYWNlX3R4X2ludChkZXYsIHR4Y3NtLCBpZHgpOworCX0KKworCWV2dGNzbSA9IHJlYWRsKCZyZWdzLT5FdnRDc20pOworCWV2dHByZCA9ICphcC0+ZXZ0X3ByZDsKKworCWlmIChldnRjc20gIT0gZXZ0cHJkKSB7CisJCWV2dGNzbSA9IGFjZV9oYW5kbGVfZXZlbnQoZGV2LCBldnRjc20sIGV2dHByZCk7CisJCXdyaXRlbChldnRjc20sICZyZWdzLT5FdnRDc20pOworCX0KKworCS8qCisJICogVGhpcyBoYXMgdG8gZ28gbGFzdCBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgYW5kIHJ1biB3aXRoCisJICogdGhlIHNwaW4gbG9jayByZWxlYXNlZCAuLi4gd2hhdCBsb2NrPworCSAqLworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJaW50IGN1cl9zaXplOworCQlpbnQgcnVuX3Rhc2tsZXQgPSAwOworCisJCWN1cl9zaXplID0gYXRvbWljX3JlYWQoJmFwLT5jdXJfcnhfYnVmcyk7CisJCWlmIChjdXJfc2l6ZSA8IFJYX0xPV19TVERfVEhSRVMpIHsKKwkJCWlmICgoY3VyX3NpemUgPCBSWF9QQU5JQ19TVERfVEhSRVMpICYmCisJCQkgICAgIXRlc3RfYW5kX3NldF9iaXQoMCwgJmFwLT5zdGRfcmVmaWxsX2J1c3kpKSB7CisjaWZkZWYgREVCVUcKKwkJCQlwcmludGsoImxvdyBvbiBzdGQgYnVmZmVycyAlaVxuIiwgY3VyX3NpemUpOworI2VuZGlmCisJCQkJYWNlX2xvYWRfc3RkX3J4X3JpbmcoYXAsCisJCQkJCQkgICAgIFJYX1JJTkdfU0laRSAtIGN1cl9zaXplKTsKKwkJCX0gZWxzZQorCQkJCXJ1bl90YXNrbGV0ID0gMTsKKwkJfQorCisJCWlmICghQUNFX0lTX1RJR09OX0koYXApKSB7CisJCQljdXJfc2l6ZSA9IGF0b21pY19yZWFkKCZhcC0+Y3VyX21pbmlfYnVmcyk7CisJCQlpZiAoY3VyX3NpemUgPCBSWF9MT1dfTUlOSV9USFJFUykgeworCQkJCWlmICgoY3VyX3NpemUgPCBSWF9QQU5JQ19NSU5JX1RIUkVTKSAmJgorCQkJCSAgICAhdGVzdF9hbmRfc2V0X2JpdCgwLAorCQkJCQkJICAgICAgJmFwLT5taW5pX3JlZmlsbF9idXN5KSkgeworI2lmZGVmIERFQlVHCisJCQkJCXByaW50aygibG93IG9uIG1pbmkgYnVmZmVycyAlaVxuIiwKKwkJCQkJICAgICAgIGN1cl9zaXplKTsKKyNlbmRpZgorCQkJCQlhY2VfbG9hZF9taW5pX3J4X3JpbmcoYXAsIFJYX01JTklfU0laRSAtIGN1cl9zaXplKTsKKwkJCQl9IGVsc2UKKwkJCQkJcnVuX3Rhc2tsZXQgPSAxOworCQkJfQorCQl9CisKKwkJaWYgKGFwLT5qdW1ibykgeworCQkJY3VyX3NpemUgPSBhdG9taWNfcmVhZCgmYXAtPmN1cl9qdW1ib19idWZzKTsKKwkJCWlmIChjdXJfc2l6ZSA8IFJYX0xPV19KVU1CT19USFJFUykgeworCQkJCWlmICgoY3VyX3NpemUgPCBSWF9QQU5JQ19KVU1CT19USFJFUykgJiYKKwkJCQkgICAgIXRlc3RfYW5kX3NldF9iaXQoMCwKKwkJCQkJCSAgICAgICZhcC0+anVtYm9fcmVmaWxsX2J1c3kpKXsKKyNpZmRlZiBERUJVRworCQkJCQlwcmludGsoImxvdyBvbiBqdW1ibyBidWZmZXJzICVpXG4iLAorCQkJCQkgICAgICAgY3VyX3NpemUpOworI2VuZGlmCisJCQkJCWFjZV9sb2FkX2p1bWJvX3J4X3JpbmcoYXAsIFJYX0pVTUJPX1NJWkUgLSBjdXJfc2l6ZSk7CisJCQkJfSBlbHNlCisJCQkJCXJ1bl90YXNrbGV0ID0gMTsKKwkJCX0KKwkJfQorCQlpZiAocnVuX3Rhc2tsZXQgJiYgIWFwLT50YXNrbGV0X3BlbmRpbmcpIHsKKwkJCWFwLT50YXNrbGV0X3BlbmRpbmcgPSAxOworCQkJdGFza2xldF9zY2hlZHVsZSgmYXAtPmFjZV90YXNrbGV0KTsKKwkJfQorCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisjaWYgQUNFTklDX0RPX1ZMQU4KK3N0YXRpYyB2b2lkIGFjZV92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCit7CisJc3RydWN0IGFjZV9wcml2YXRlICphcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlhY2VfbWFza19pcnEoZGV2KTsKKworCWFwLT52bGdycCA9IGdycDsKKworCWFjZV91bm1hc2tfaXJxKGRldik7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisKK3N0YXRpYyB2b2lkIGFjZV92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWFjZV9tYXNrX2lycShkZXYpOworCisJaWYgKGFwLT52bGdycCkKKwkJYXAtPnZsZ3JwLT52bGFuX2RldmljZXNbdmlkXSA9IE5VTEw7CisKKwlhY2VfdW5tYXNrX2lycShkZXYpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKyNlbmRpZiAvKiBBQ0VOSUNfRE9fVkxBTiAqLworCisKK3N0YXRpYyBpbnQgYWNlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWNlX3JlZ3MgX19pb21lbSAqcmVncyA9IGFwLT5yZWdzOworCXN0cnVjdCBjbWQgY21kOworCisJaWYgKCEoYXAtPmZ3X3J1bm5pbmcpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGaXJtd2FyZSBub3QgcnVubmluZyFcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJd3JpdGVsKGRldi0+bXR1ICsgRVRIX0hMRU4gKyA0LCAmcmVncy0+SWZNdHUpOworCisJY21kLmV2dCA9IENfQ0xFQVJfU1RBVFM7CisJY21kLmNvZGUgPSAwOworCWNtZC5pZHggPSAwOworCWFjZV9pc3N1ZV9jbWQocmVncywgJmNtZCk7CisKKwljbWQuZXZ0ID0gQ19IT1NUX1NUQVRFOworCWNtZC5jb2RlID0gQ19DX1NUQUNLX1VQOworCWNtZC5pZHggPSAwOworCWFjZV9pc3N1ZV9jbWQocmVncywgJmNtZCk7CisKKwlpZiAoYXAtPmp1bWJvICYmCisJICAgICF0ZXN0X2FuZF9zZXRfYml0KDAsICZhcC0+anVtYm9fcmVmaWxsX2J1c3kpKQorCQlhY2VfbG9hZF9qdW1ib19yeF9yaW5nKGFwLCBSWF9KVU1CT19TSVpFKTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJY21kLmV2dCA9IENfU0VUX1BST01JU0NfTU9ERTsKKwkJY21kLmNvZGUgPSBDX0NfUFJPTUlTQ19FTkFCTEU7CisJCWNtZC5pZHggPSAwOworCQlhY2VfaXNzdWVfY21kKHJlZ3MsICZjbWQpOworCisJCWFwLT5wcm9taXNjID0gMTsKKwl9ZWxzZQorCQlhcC0+cHJvbWlzYyA9IDA7CisJYXAtPm1jYXN0X2FsbCA9IDA7CisKKyNpZiAwCisJY21kLmV2dCA9IENfTE5LX05FR09USUFUSU9OOworCWNtZC5jb2RlID0gMDsKKwljbWQuaWR4ID0gMDsKKwlhY2VfaXNzdWVfY21kKHJlZ3MsICZjbWQpOworI2VuZGlmCisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJLyoKKwkgKiBTZXR1cCB0aGUgYm90dG9tIGhhbGYgcnggcmluZyByZWZpbGwgaGFuZGxlcgorCSAqLworCXRhc2tsZXRfaW5pdCgmYXAtPmFjZV90YXNrbGV0LCBhY2VfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpZGV2KTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFjZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhY2VfcHJpdmF0ZSAqYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhY2VfcmVncyBfX2lvbWVtICpyZWdzID0gYXAtPnJlZ3M7CisJc3RydWN0IGNtZCBjbWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaG9ydCBpOworCisJLyoKKwkgKiBXaXRob3V0IChvciBiZWZvcmUpIHJlbGVhc2luZyBpcnEgYW5kIHN0b3BwaW5nIGhhcmR3YXJlLCB0aGlzCisJICogaXMgYW4gYWJzb2x1dGUgbm9uLXNlbnNlLCBieSB0aGUgd2F5LiBJdCB3aWxsIGJlIHJlc2V0IGluc3RhbnRseQorCSAqIGJ5IHRoZSBmaXJzdCBpcnEuCisJICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJCisJaWYgKGFwLT5wcm9taXNjKSB7CisJCWNtZC5ldnQgPSBDX1NFVF9QUk9NSVNDX01PREU7CisJCWNtZC5jb2RlID0gQ19DX1BST01JU0NfRElTQUJMRTsKKwkJY21kLmlkeCA9IDA7CisJCWFjZV9pc3N1ZV9jbWQocmVncywgJmNtZCk7CisJCWFwLT5wcm9taXNjID0gMDsKKwl9CisKKwljbWQuZXZ0ID0gQ19IT1NUX1NUQVRFOworCWNtZC5jb2RlID0gQ19DX1NUQUNLX0RPV047CisJY21kLmlkeCA9IDA7CisJYWNlX2lzc3VlX2NtZChyZWdzLCAmY21kKTsKKworCXRhc2tsZXRfa2lsbCgmYXAtPmFjZV90YXNrbGV0KTsKKworCS8qCisJICogTWFrZSBzdXJlIG9uZSBDUFUgaXMgbm90IHByb2Nlc3NpbmcgcGFja2V0cyB3aGlsZQorCSAqIGJ1ZmZlcnMgYXJlIGJlaW5nIHJlbGVhc2VkIGJ5IGFub3RoZXIuCisJICovCisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJYWNlX21hc2tfaXJxKGRldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUNFX1RYX1JJTkdfRU5UUklFUyhhcCk7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlkbWFfYWRkcl90IG1hcHBpbmc7CisJCXN0cnVjdCB0eF9yaW5nX2luZm8gKmluZm87CisKKwkJaW5mbyA9IGFwLT5za2ItPnR4X3NrYnVmZiArIGk7CisJCXNrYiA9IGluZm8tPnNrYjsKKwkJbWFwcGluZyA9IHBjaV91bm1hcF9hZGRyKGluZm8sIG1hcHBpbmcpOworCisJCWlmIChtYXBwaW5nKSB7CisJCQlpZiAoQUNFX0lTX1RJR09OX0koYXApKSB7CisJCQkJc3RydWN0IHR4X2Rlc2MgX19pb21lbSAqdHggCisJCQkJCT0gKHN0cnVjdCB0eF9kZXNjIF9faW9tZW0gKikgJmFwLT50eF9yaW5nW2ldOworCQkJCXdyaXRlbCgwLCAmdHgtPmFkZHIuYWRkcmhpKTsKKwkJCQl3cml0ZWwoMCwgJnR4LT5hZGRyLmFkZHJsbyk7CisJCQkJd3JpdGVsKDAsICZ0eC0+ZmxhZ3NpemUpOworCQkJfSBlbHNlCisJCQkJbWVtc2V0KGFwLT50eF9yaW5nICsgaSwgMCwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSk7CisJCQlwY2lfdW5tYXBfcGFnZShhcC0+cGRldiwgbWFwcGluZywKKwkJCQkgICAgICAgcGNpX3VubWFwX2xlbihpbmZvLCBtYXBsZW4pLAorCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCXBjaV91bm1hcF9hZGRyX3NldChpbmZvLCBtYXBwaW5nLCAwKTsKKwkJfQorCQlpZiAoc2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlpbmZvLT5za2IgPSBOVUxMOworCQl9CisJfQorCisJaWYgKGFwLT5qdW1ibykgeworCQljbWQuZXZ0ID0gQ19SRVNFVF9KVU1CT19STkc7CisJCWNtZC5jb2RlID0gMDsKKwkJY21kLmlkeCA9IDA7CisJCWFjZV9pc3N1ZV9jbWQocmVncywgJmNtZCk7CisJfQorCisJYWNlX3VubWFza19pcnEoZGV2KTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QKK2FjZV9tYXBfdHhfc2tiKHN0cnVjdCBhY2VfcHJpdmF0ZSAqYXAsIHN0cnVjdCBza19idWZmICpza2IsCisJICAgICAgIHN0cnVjdCBza19idWZmICp0YWlsLCB1MzIgaWR4KQoreworCWRtYV9hZGRyX3QgbWFwcGluZzsKKwlzdHJ1Y3QgdHhfcmluZ19pbmZvICppbmZvOworCisJbWFwcGluZyA9IHBjaV9tYXBfcGFnZShhcC0+cGRldiwgdmlydF90b19wYWdlKHNrYi0+ZGF0YSksCisJCQkgICAgICAgb2Zmc2V0X2luX3BhZ2Uoc2tiLT5kYXRhKSwKKwkJCSAgICAgICBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisKKwlpbmZvID0gYXAtPnNrYi0+dHhfc2tidWZmICsgaWR4OworCWluZm8tPnNrYiA9IHRhaWw7CisJcGNpX3VubWFwX2FkZHJfc2V0KGluZm8sIG1hcHBpbmcsIG1hcHBpbmcpOworCXBjaV91bm1hcF9sZW5fc2V0KGluZm8sIG1hcGxlbiwgc2tiLT5sZW4pOworCXJldHVybiBtYXBwaW5nOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYWNlX2xvYWRfdHhfYmQoc3RydWN0IGFjZV9wcml2YXRlICphcCwgc3RydWN0IHR4X2Rlc2MgKmRlc2MsIHU2NCBhZGRyLAorCSAgICAgICB1MzIgZmxhZ3NpemUsIHUzMiB2bGFuX3RhZykKK3sKKyNpZiAhVVNFX1RYX0NPQUxfTk9XCisJZmxhZ3NpemUgJj0gfkJEX0ZMR19DT0FMX05PVzsKKyNlbmRpZgorCisJaWYgKEFDRV9JU19USUdPTl9JKGFwKSkgeworCQlzdHJ1Y3QgdHhfZGVzYyBfX2lvbWVtICppbyA9IChzdHJ1Y3QgdHhfZGVzYyBfX2lvbWVtICopIGRlc2M7CisJCXdyaXRlbChhZGRyID4+IDMyLCAmaW8tPmFkZHIuYWRkcmhpKTsKKwkJd3JpdGVsKGFkZHIgJiAweGZmZmZmZmZmLCAmaW8tPmFkZHIuYWRkcmxvKTsKKwkJd3JpdGVsKGZsYWdzaXplLCAmaW8tPmZsYWdzaXplKTsKKyNpZiBBQ0VOSUNfRE9fVkxBTgorCQl3cml0ZWwodmxhbl90YWcsICZpby0+dmxhbnJlcyk7CisjZW5kaWYKKwl9IGVsc2UgeworCQlkZXNjLT5hZGRyLmFkZHJoaSA9IGFkZHIgPj4gMzI7CisJCWRlc2MtPmFkZHIuYWRkcmxvID0gYWRkcjsKKwkJZGVzYy0+ZmxhZ3NpemUgPSBmbGFnc2l6ZTsKKyNpZiBBQ0VOSUNfRE9fVkxBTgorCQlkZXNjLT52bGFucmVzID0gdmxhbl90YWc7CisjZW5kaWYKKwl9Cit9CisKKworc3RhdGljIGludCBhY2Vfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhY2VfcHJpdmF0ZSAqYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhY2VfcmVncyBfX2lvbWVtICpyZWdzID0gYXAtPnJlZ3M7CisJc3RydWN0IHR4X2Rlc2MgKmRlc2M7CisJdTMyIGlkeCwgZmxhZ3NpemU7CisJdW5zaWduZWQgbG9uZyBtYXhqaWZmID0gamlmZmllcyArIDMqSFo7CisKK3Jlc3RhcnQ6CisJaWR4ID0gYXAtPnR4X3ByZDsKKworCWlmICh0eF9yaW5nX2Z1bGwoYXAsIGFwLT50eF9yZXRfY3NtLCBpZHgpKQorCQlnb3RvIG92ZXJmbG93OworCisJaWYgKCFza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKQl7CisJCWRtYV9hZGRyX3QgbWFwcGluZzsKKwkJdTMyIHZsYW5fdGFnID0gMDsKKworCQltYXBwaW5nID0gYWNlX21hcF90eF9za2IoYXAsIHNrYiwgc2tiLCBpZHgpOworCQlmbGFnc2l6ZSA9IChza2ItPmxlbiA8PCAxNikgfCAoQkRfRkxHX0VORCk7CisJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykKKwkJCWZsYWdzaXplIHw9IEJEX0ZMR19UQ1BfVURQX1NVTTsKKyNpZiBBQ0VOSUNfRE9fVkxBTgorCQlpZiAodmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7CisJCQlmbGFnc2l6ZSB8PSBCRF9GTEdfVkxBTl9UQUc7CisJCQl2bGFuX3RhZyA9IHZsYW5fdHhfdGFnX2dldChza2IpOworCQl9CisjZW5kaWYKKwkJZGVzYyA9IGFwLT50eF9yaW5nICsgaWR4OworCQlpZHggPSAoaWR4ICsgMSkgJSBBQ0VfVFhfUklOR19FTlRSSUVTKGFwKTsKKworCQkvKiBMb29rIGF0IGFjZV90eF9pbnQgZm9yIGV4cGxhbmF0aW9ucy4gKi8KKwkJaWYgKHR4X3JpbmdfZnVsbChhcCwgYXAtPnR4X3JldF9jc20sIGlkeCkpCisJCQlmbGFnc2l6ZSB8PSBCRF9GTEdfQ09BTF9OT1c7CisKKwkJYWNlX2xvYWRfdHhfYmQoYXAsIGRlc2MsIG1hcHBpbmcsIGZsYWdzaXplLCB2bGFuX3RhZyk7CisJfSBlbHNlIHsKKwkJZG1hX2FkZHJfdCBtYXBwaW5nOworCQl1MzIgdmxhbl90YWcgPSAwOworCQlpbnQgaSwgbGVuID0gMDsKKworCQltYXBwaW5nID0gYWNlX21hcF90eF9za2IoYXAsIHNrYiwgTlVMTCwgaWR4KTsKKwkJZmxhZ3NpemUgPSAoc2tiX2hlYWRsZW4oc2tiKSA8PCAxNik7CisJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykKKwkJCWZsYWdzaXplIHw9IEJEX0ZMR19UQ1BfVURQX1NVTTsKKyNpZiBBQ0VOSUNfRE9fVkxBTgorCQlpZiAodmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7CisJCQlmbGFnc2l6ZSB8PSBCRF9GTEdfVkxBTl9UQUc7CisJCQl2bGFuX3RhZyA9IHZsYW5fdHhfdGFnX2dldChza2IpOworCQl9CisjZW5kaWYKKworCQlhY2VfbG9hZF90eF9iZChhcCwgYXAtPnR4X3JpbmcgKyBpZHgsIG1hcHBpbmcsIGZsYWdzaXplLCB2bGFuX3RhZyk7CisKKwkJaWR4ID0gKGlkeCArIDEpICUgQUNFX1RYX1JJTkdfRU5UUklFUyhhcCk7CisKKwkJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgeworCQkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCQkJc3RydWN0IHR4X3JpbmdfaW5mbyAqaW5mbzsKKworCQkJbGVuICs9IGZyYWctPnNpemU7CisJCQlpbmZvID0gYXAtPnNrYi0+dHhfc2tidWZmICsgaWR4OworCQkJZGVzYyA9IGFwLT50eF9yaW5nICsgaWR4OworCisJCQltYXBwaW5nID0gcGNpX21hcF9wYWdlKGFwLT5wZGV2LCBmcmFnLT5wYWdlLAorCQkJCQkgICAgICAgZnJhZy0+cGFnZV9vZmZzZXQsIGZyYWctPnNpemUsCisJCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKworCQkJZmxhZ3NpemUgPSAoZnJhZy0+c2l6ZSA8PCAxNik7CisJCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpCisJCQkJZmxhZ3NpemUgfD0gQkRfRkxHX1RDUF9VRFBfU1VNOworCQkJaWR4ID0gKGlkeCArIDEpICUgQUNFX1RYX1JJTkdfRU5UUklFUyhhcCk7CisKKwkJCWlmIChpID09IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgLSAxKSB7CisJCQkJZmxhZ3NpemUgfD0gQkRfRkxHX0VORDsKKwkJCQlpZiAodHhfcmluZ19mdWxsKGFwLCBhcC0+dHhfcmV0X2NzbSwgaWR4KSkKKwkJCQkJZmxhZ3NpemUgfD0gQkRfRkxHX0NPQUxfTk9XOworCisJCQkJLyoKKwkJCQkgKiBPbmx5IHRoZSBsYXN0IGZyYWdtZW50IGZyZWVzCisJCQkJICogdGhlIHNrYiEKKwkJCQkgKi8KKwkJCQlpbmZvLT5za2IgPSBza2I7CisJCQl9IGVsc2UgeworCQkJCWluZm8tPnNrYiA9IE5VTEw7CisJCQl9CisJCQlwY2lfdW5tYXBfYWRkcl9zZXQoaW5mbywgbWFwcGluZywgbWFwcGluZyk7CisJCQlwY2lfdW5tYXBfbGVuX3NldChpbmZvLCBtYXBsZW4sIGZyYWctPnNpemUpOworCQkJYWNlX2xvYWRfdHhfYmQoYXAsIGRlc2MsIG1hcHBpbmcsIGZsYWdzaXplLCB2bGFuX3RhZyk7CisJCX0KKwl9CisKKyAJd21iKCk7CisgCWFwLT50eF9wcmQgPSBpZHg7CisgCWFjZV9zZXRfdHhwcmQocmVncywgYXAsIGlkeCk7CisKKwlpZiAoZmxhZ3NpemUgJiBCRF9GTEdfQ09BTF9OT1cpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJCS8qCisJCSAqIEEgVFgtZGVzY3JpcHRvciBwcm9kdWNlciAoYW4gSVJRKSBtaWdodCBoYXZlIGdvdHRlbgorCQkgKiBpbmJldHdlZW4sIG1ha2luZyB0aGUgcmluZyBmcmVlIGFnYWluLiBTaW5jZSB4bWl0IGlzCisJCSAqIHNlcmlhbGl6ZWQsIHRoaXMgaXMgdGhlIG9ubHkgc2l0dWF0aW9uIHdlIGhhdmUgdG8KKwkJICogcmUtdGVzdC4KKwkJICovCisJCWlmICghdHhfcmluZ19mdWxsKGFwLCBhcC0+dHhfcmV0X2NzbSwgaWR4KSkKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlyZXR1cm4gTkVUREVWX1RYX09LOworCitvdmVyZmxvdzoKKwkvKgorCSAqIFRoaXMgcmFjZSBjb25kaXRpb24gaXMgdW5hdm9pZGFibGUgd2l0aCBsb2NrLWZyZWUgZHJpdmVycy4KKwkgKiBXZSB3YWtlIHVwIHRoZSBxdWV1ZSBfYmVmb3JlXyB0eF9wcmQgaXMgYWR2YW5jZWQsIHNvIHRoYXQgd2UgY2FuCisJICogZW50ZXIgaGFyZF9zdGFydF94bWl0IHRvbyBlYXJseSwgd2hpbGUgdHggcmluZyBzdGlsbCBsb29rcyBjbG9zZWQuCisJICogVGhpcyBoYXBwZW5zIH4xLTQgdGltZXMgcGVyIDEwMDAwMCBwYWNrZXRzLCBzbyB0aGF0IHdlIGNhbiBhbGxvdworCSAqIHRvIGxvb3Agc3luY2luZyB0byBvdGhlciBDUFUuIFByb2JhYmx5LCB3ZSBuZWVkIGFuIGFkZGl0aW9uYWwKKwkgKiB3bWIoKSBpbiBhY2VfdHhfaW50ciBhcyB3ZWxsLgorCSAqCisJICogTm90ZSB0aGF0IHRoaXMgcmFjZSBpcyByZWxpZXZlZCBieSByZXNlcnZpbmcgb25lIG1vcmUgZW50cnkKKwkgKiBpbiB0eCByaW5nIHRoYW4gaXQgaXMgbmVjZXNzYXJ5IChzZWUgb3JpZ2luYWwgbm9uLVNHIGRyaXZlcikuCisJICogSG93ZXZlciwgd2l0aCBTRyB3ZSBuZWVkIHRvIHJlc2VydmUgMipNQVhfU0tCX0ZSQUdTKzEsIHdoaWNoCisJICogaXMgYWxyZWFkeSBvdmVya2lsbC4KKwkgKgorCSAqIEFsdGVybmF0aXZlIGlzIHRvIHJldHVybiB3aXRoIDEgbm90IHRocm90dGxpbmcgcXVldWUuIEluIHRoaXMKKwkgKiBjYXNlIGxvb3AgYmVjb21lcyBsb25nZXIsIG5vIG1vcmUgdXNlZnVsIGVmZmVjdHMuCisJICovCisJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIG1heGppZmYpKSB7CisJCWJhcnJpZXIoKTsKKwkJY3B1X3JlbGF4KCk7CisJCWdvdG8gcmVzdGFydDsKKwl9CisJCisJLyogVGhlIHJpbmcgaXMgc3R1Y2sgZnVsbC4gKi8KKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHJhbnNtaXQgcmluZyBzdHVjayBmdWxsXG4iLCBkZXYtPm5hbWUpOworCXJldHVybiBORVRERVZfVFhfQlVTWTsKK30KKworCitzdGF0aWMgaW50IGFjZV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBhY2VfcHJpdmF0ZSAqYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhY2VfcmVncyBfX2lvbWVtICpyZWdzID0gYXAtPnJlZ3M7CisKKwlpZiAobmV3X210dSA+IEFDRV9KVU1CT19NVFUpCisJCXJldHVybiAtRUlOVkFMOworCisJd3JpdGVsKG5ld19tdHUgKyBFVEhfSExFTiArIDQsICZyZWdzLT5JZk10dSk7CisJZGV2LT5tdHUgPSBuZXdfbXR1OworCisJaWYgKG5ld19tdHUgPiBBQ0VfU1REX01UVSkgeworCQlpZiAoIShhcC0+anVtYm8pKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRW5hYmxpbmcgSnVtYm8gZnJhbWUgIgorCQkJICAgICAgICJzdXBwb3J0XG4iLCBkZXYtPm5hbWUpOworCQkJYXAtPmp1bWJvID0gMTsKKwkJCWlmICghdGVzdF9hbmRfc2V0X2JpdCgwLCAmYXAtPmp1bWJvX3JlZmlsbF9idXN5KSkKKwkJCQlhY2VfbG9hZF9qdW1ib19yeF9yaW5nKGFwLCBSWF9KVU1CT19TSVpFKTsKKwkJCWFjZV9zZXRfcnh0eF9wYXJtcyhkZXYsIDEpOworCQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmFwLT5qdW1ib19yZWZpbGxfYnVzeSkpOworCQlhY2Vfc3luY19pcnEoZGV2LT5pcnEpOworCQlhY2Vfc2V0X3J4dHhfcGFybXMoZGV2LCAwKTsKKwkJaWYgKGFwLT5qdW1ibykgeworCQkJc3RydWN0IGNtZCBjbWQ7CisKKwkJCWNtZC5ldnQgPSBDX1JFU0VUX0pVTUJPX1JORzsKKwkJCWNtZC5jb2RlID0gMDsKKwkJCWNtZC5pZHggPSAwOworCQkJYWNlX2lzc3VlX2NtZChyZWdzLCAmY21kKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjZV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBhY2VfcHJpdmF0ZSAqYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhY2VfcmVncyBfX2lvbWVtICpyZWdzID0gYXAtPnJlZ3M7CisJdTMyIGxpbms7CisKKwltZW1zZXQoZWNtZCwgMCwgc2l6ZW9mKHN0cnVjdCBldGh0b29sX2NtZCkpOworCWVjbWQtPnN1cHBvcnRlZCA9CisJCShTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CisJCSBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKKwkJIFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8CisJCSBTVVBQT1JURURfQXV0b25lZyB8IFNVUFBPUlRFRF9GSUJSRSk7CisKKwllY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKKwllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisKKwlsaW5rID0gcmVhZGwoJnJlZ3MtPkdpZ0xua1N0YXRlKTsKKwlpZiAobGluayAmIExOS18xMDAwTUIpCisJCWVjbWQtPnNwZWVkID0gU1BFRURfMTAwMDsKKwllbHNlIHsKKwkJbGluayA9IHJlYWRsKCZyZWdzLT5GYXN0TG5rU3RhdGUpOworCQlpZiAobGluayAmIExOS18xMDBNQikKKwkJCWVjbWQtPnNwZWVkID0gU1BFRURfMTAwOworCQllbHNlIGlmIChsaW5rICYgTE5LXzEwTUIpCisJCQllY21kLT5zcGVlZCA9IFNQRUVEXzEwOworCQllbHNlCisJCQllY21kLT5zcGVlZCA9IDA7CisJfQorCWlmIChsaW5rICYgTE5LX0ZVTExfRFVQTEVYKQorCQllY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwllbHNlCisJCWVjbWQtPmR1cGxleCA9IERVUExFWF9IQUxGOworCisJaWYgKGxpbmsgJiBMTktfTkVHT1RJQVRFKQorCQllY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJZWxzZQorCQllY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCisjaWYgMAorCS8qCisJICogQ3VycmVudCBzdHJ1Y3QgZXRodG9vbF9jbWQgaXMgaW5zdWZmaWNpZW50CisJICovCisJZWNtZC0+dHJhY2UgPSByZWFkbCgmcmVncy0+VHVuZVRyYWNlKTsKKworCWVjbWQtPnR4Y29hbCA9IHJlYWRsKCZyZWdzLT5UdW5lVHhDb2FsVGlja3MpOworCWVjbWQtPnJ4Y29hbCA9IHJlYWRsKCZyZWdzLT5UdW5lUnhDb2FsVGlja3MpOworI2VuZGlmCisJZWNtZC0+bWF4dHhwa3QgPSByZWFkbCgmcmVncy0+VHVuZU1heFR4RGVzYyk7CisJZWNtZC0+bWF4cnhwa3QgPSByZWFkbCgmcmVncy0+VHVuZU1heFJ4RGVzYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhY2Vfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWNlX3JlZ3MgX19pb21lbSAqcmVncyA9IGFwLT5yZWdzOworCXUzMiBsaW5rLCBzcGVlZDsKKworCWxpbmsgPSByZWFkbCgmcmVncy0+R2lnTG5rU3RhdGUpOworCWlmIChsaW5rICYgTE5LXzEwMDBNQikKKwkJc3BlZWQgPSBTUEVFRF8xMDAwOworCWVsc2UgeworCQlsaW5rID0gcmVhZGwoJnJlZ3MtPkZhc3RMbmtTdGF0ZSk7CisJCWlmIChsaW5rICYgTE5LXzEwME1CKQorCQkJc3BlZWQgPSBTUEVFRF8xMDA7CisJCWVsc2UgaWYgKGxpbmsgJiBMTktfMTBNQikKKwkJCXNwZWVkID0gU1BFRURfMTA7CisJCWVsc2UKKwkJCXNwZWVkID0gU1BFRURfMTAwOworCX0KKworCWxpbmsgPSBMTktfRU5BQkxFIHwgTE5LXzEwMDBNQiB8IExOS18xMDBNQiB8IExOS18xME1CIHwKKwkJTE5LX1JYX0ZMT1dfQ1RMX1kgfCBMTktfTkVHX0ZDVEw7CisJaWYgKCFBQ0VfSVNfVElHT05fSShhcCkpCisJCWxpbmsgfD0gTE5LX1RYX0ZMT1dfQ1RMX1k7CisJaWYgKGVjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpCisJCWxpbmsgfD0gTE5LX05FR09USUFURTsKKwlpZiAoZWNtZC0+c3BlZWQgIT0gc3BlZWQpIHsKKwkJbGluayAmPSB+KExOS18xMDAwTUIgfCBMTktfMTAwTUIgfCBMTktfMTBNQik7CisJCXN3aXRjaCAoc3BlZWQpIHsKKwkJY2FzZSBTUEVFRF8xMDAwOgorCQkJbGluayB8PSBMTktfMTAwME1COworCQkJYnJlYWs7CisJCWNhc2UgU1BFRURfMTAwOgorCQkJbGluayB8PSBMTktfMTAwTUI7CisJCQlicmVhazsKKwkJY2FzZSBTUEVFRF8xMDoKKwkJCWxpbmsgfD0gTE5LXzEwTUI7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChlY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCWxpbmsgfD0gTE5LX0ZVTExfRFVQTEVYOworCisJaWYgKGxpbmsgIT0gYXAtPmxpbmspIHsKKwkJc3RydWN0IGNtZCBjbWQ7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZW5lZ290aWF0aW5nIGxpbmsgc3RhdGVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCisJCWFwLT5saW5rID0gbGluazsKKwkJd3JpdGVsKGxpbmssICZyZWdzLT5UdW5lTGluayk7CisJCWlmICghQUNFX0lTX1RJR09OX0koYXApKQorCQkJd3JpdGVsKGxpbmssICZyZWdzLT5UdW5lRmFzdExpbmspOworCQl3bWIoKTsKKworCQljbWQuZXZ0ID0gQ19MTktfTkVHT1RJQVRJT047CisJCWNtZC5jb2RlID0gMDsKKwkJY21kLmlkeCA9IDA7CisJCWFjZV9pc3N1ZV9jbWQocmVncywgJmNtZCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhY2VfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCisJCQkgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCAiYWNlbmljIiwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXNucHJpbnRmKGluZm8tPnZlcnNpb24sIHNpemVvZihpbmZvLT52ZXJzaW9uKSwgIiVpLiVpLiVpIiwgCisJCXRpZ29uRndSZWxlYXNlTWFqb3IsIHRpZ29uRndSZWxlYXNlTWlub3IsCisJCXRpZ29uRndSZWxlYXNlRml4KTsKKworCWlmIChhcC0+cGRldikKKwkJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYXAtPnBkZXYpLCAKKwkJCXNpemVvZihpbmZvLT5idXNfaW5mbykpOworCit9CisKKy8qCisgKiBTZXQgdGhlIGhhcmR3YXJlIE1BQyBhZGRyZXNzLgorICovCitzdGF0aWMgaW50IGFjZV9zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWNlX3JlZ3MgX19pb21lbSAqcmVncyA9IGFwLT5yZWdzOworCXN0cnVjdCBzb2NrYWRkciAqYWRkcj1wOworCXU4ICpkYTsKKwlzdHJ1Y3QgY21kIGNtZDsKKworCWlmKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLGRldi0+YWRkcl9sZW4pOworCisJZGEgPSAodTggKilkZXYtPmRldl9hZGRyOworCisJd3JpdGVsKGRhWzBdIDw8IDggfCBkYVsxXSwgJnJlZ3MtPk1hY0FkZHJIaSk7CisJd3JpdGVsKChkYVsyXSA8PCAyNCkgfCAoZGFbM10gPDwgMTYpIHwgKGRhWzRdIDw8IDgpIHwgZGFbNV0sCisJICAgICAgICZyZWdzLT5NYWNBZGRyTG8pOworCisJY21kLmV2dCA9IENfU0VUX01BQ19BRERSOworCWNtZC5jb2RlID0gMDsKKwljbWQuaWR4ID0gMDsKKwlhY2VfaXNzdWVfY21kKHJlZ3MsICZjbWQpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgYWNlX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhY2VfcHJpdmF0ZSAqYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhY2VfcmVncyBfX2lvbWVtICpyZWdzID0gYXAtPnJlZ3M7CisJc3RydWN0IGNtZCBjbWQ7CisKKwlpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpICYmICEoYXAtPm1jYXN0X2FsbCkpIHsKKwkJY21kLmV2dCA9IENfU0VUX01VTFRJQ0FTVF9NT0RFOworCQljbWQuY29kZSA9IENfQ19NQ0FTVF9FTkFCTEU7CisJCWNtZC5pZHggPSAwOworCQlhY2VfaXNzdWVfY21kKHJlZ3MsICZjbWQpOworCQlhcC0+bWNhc3RfYWxsID0gMTsKKwl9IGVsc2UgaWYgKGFwLT5tY2FzdF9hbGwpIHsKKwkJY21kLmV2dCA9IENfU0VUX01VTFRJQ0FTVF9NT0RFOworCQljbWQuY29kZSA9IENfQ19NQ0FTVF9ESVNBQkxFOworCQljbWQuaWR4ID0gMDsKKwkJYWNlX2lzc3VlX2NtZChyZWdzLCAmY21kKTsKKwkJYXAtPm1jYXN0X2FsbCA9IDA7CisJfQorCisJaWYgKChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpICYmICEoYXAtPnByb21pc2MpKSB7CisJCWNtZC5ldnQgPSBDX1NFVF9QUk9NSVNDX01PREU7CisJCWNtZC5jb2RlID0gQ19DX1BST01JU0NfRU5BQkxFOworCQljbWQuaWR4ID0gMDsKKwkJYWNlX2lzc3VlX2NtZChyZWdzLCAmY21kKTsKKwkJYXAtPnByb21pc2MgPSAxOworCX1lbHNlIGlmICghKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgJiYgKGFwLT5wcm9taXNjKSkgeworCQljbWQuZXZ0ID0gQ19TRVRfUFJPTUlTQ19NT0RFOworCQljbWQuY29kZSA9IENfQ19QUk9NSVNDX0RJU0FCTEU7CisJCWNtZC5pZHggPSAwOworCQlhY2VfaXNzdWVfY21kKHJlZ3MsICZjbWQpOworCQlhcC0+cHJvbWlzYyA9IDA7CisJfQorCisJLyoKKwkgKiBGb3IgdGhlIHRpbWUgYmVpbmcgbXVsdGljYXN0IHJlbGllcyBvbiB0aGUgdXBwZXIgbGF5ZXJzCisJICogZmlsdGVyaW5nIGl0IHByb3Blcmx5LiBUaGUgRmlybXdhcmUgZG9lcyBub3QgYWxsb3cgb25lIHRvCisJICogc2V0IHRoZSBlbnRpcmUgbXVsdGljYXN0IGxpc3QgYXQgYSB0aW1lIGFuZCBrZWVwaW5nIHRyYWNrIG9mCisJICogaXQgaGVyZSBpcyBnb2luZyB0byBiZSBtZXNzeS4KKwkgKi8KKwlpZiAoKGRldi0+bWNfY291bnQpICYmICEoYXAtPm1jYXN0X2FsbCkpIHsKKwkJY21kLmV2dCA9IENfU0VUX01VTFRJQ0FTVF9NT0RFOworCQljbWQuY29kZSA9IENfQ19NQ0FTVF9FTkFCTEU7CisJCWNtZC5pZHggPSAwOworCQlhY2VfaXNzdWVfY21kKHJlZ3MsICZjbWQpOworCX1lbHNlIGlmICghYXAtPm1jYXN0X2FsbCkgeworCQljbWQuZXZ0ID0gQ19TRVRfTVVMVElDQVNUX01PREU7CisJCWNtZC5jb2RlID0gQ19DX01DQVNUX0RJU0FCTEU7CisJCWNtZC5pZHggPSAwOworCQlhY2VfaXNzdWVfY21kKHJlZ3MsICZjbWQpOworCX0KK30KKworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmFjZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWNlX21hY19zdGF0cyBfX2lvbWVtICptYWNfc3RhdHMgPQorCQkoc3RydWN0IGFjZV9tYWNfc3RhdHMgX19pb21lbSAqKWFwLT5yZWdzLT5TdGF0czsKKworCWFwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gcmVhZGwoJm1hY19zdGF0cy0+ZHJvcF9zcGFjZSk7CisJYXAtPnN0YXRzLm11bHRpY2FzdCA9IHJlYWRsKCZtYWNfc3RhdHMtPmtlcHRfbWMpOworCWFwLT5zdGF0cy5jb2xsaXNpb25zID0gcmVhZGwoJm1hY19zdGF0cy0+Y29sbCk7CisKKwlyZXR1cm4gJmFwLT5zdGF0czsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgYWNlX2NvcHkoc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MsIHZvaWQgKnNyYywKKwkJCSAgICB1MzIgZGVzdCwgaW50IHNpemUpCit7CisJdm9pZCBfX2lvbWVtICp0ZGVzdDsKKwl1MzIgKndzcmM7CisJc2hvcnQgdHNpemUsIGk7CisKKwlpZiAoc2l6ZSA8PSAwKQorCQlyZXR1cm47CisKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJdHNpemUgPSBtaW5fdCh1MzIsICgofmRlc3QgJiAoQUNFX1dJTkRPV19TSVpFIC0gMSkpICsgMSksCisJCQkgICAgbWluX3QodTMyLCBzaXplLCBBQ0VfV0lORE9XX1NJWkUpKTsKKwkJdGRlc3QgPSAodm9pZCBfX2lvbWVtICopICZyZWdzLT5XaW5kb3cgKyAKKwkJCShkZXN0ICYgKEFDRV9XSU5ET1dfU0laRSAtIDEpKTsKKwkJd3JpdGVsKGRlc3QgJiB+KEFDRV9XSU5ET1dfU0laRSAtIDEpLCAmcmVncy0+V2luQmFzZSk7CisJCS8qCisJCSAqIFRoaXMgcmVxdWlyZXMgYnl0ZSBzd2FwcGluZyBvbiBiaWcgZW5kaWFuLCBob3dldmVyCisJCSAqIHdyaXRlbCBkb2VzIHRoYXQgZm9yIHVzCisJCSAqLworCQl3c3JjID0gc3JjOworCQlmb3IgKGkgPSAwOyBpIDwgKHRzaXplIC8gNCk7IGkrKykgeworCQkJd3JpdGVsKHdzcmNbaV0sIHRkZXN0ICsgaSo0KTsKKwkJfQorCQlkZXN0ICs9IHRzaXplOworCQlzcmMgKz0gdHNpemU7CisJCXNpemUgLT0gdHNpemU7CisJfQorCisJcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBhY2VfY2xlYXIoc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MsIHUzMiBkZXN0LCBpbnQgc2l6ZSkKK3sKKwl2b2lkIF9faW9tZW0gKnRkZXN0OworCXNob3J0IHRzaXplID0gMCwgaTsKKworCWlmIChzaXplIDw9IDApCisJCXJldHVybjsKKworCXdoaWxlIChzaXplID4gMCkgeworCQl0c2l6ZSA9IG1pbl90KHUzMiwgKCh+ZGVzdCAmIChBQ0VfV0lORE9XX1NJWkUgLSAxKSkgKyAxKSwKKwkJCQltaW5fdCh1MzIsIHNpemUsIEFDRV9XSU5ET1dfU0laRSkpOworCQl0ZGVzdCA9ICh2b2lkIF9faW9tZW0gKikgJnJlZ3MtPldpbmRvdyArIAorCQkJKGRlc3QgJiAoQUNFX1dJTkRPV19TSVpFIC0gMSkpOworCQl3cml0ZWwoZGVzdCAmIH4oQUNFX1dJTkRPV19TSVpFIC0gMSksICZyZWdzLT5XaW5CYXNlKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgKHRzaXplIC8gNCk7IGkrKykgeworCQkJd3JpdGVsKDAsIHRkZXN0ICsgaSo0KTsKKwkJfQorCisJCWRlc3QgKz0gdHNpemU7CisJCXNpemUgLT0gdHNpemU7CisJfQorCisJcmV0dXJuOworfQorCisKKy8qCisgKiBEb3dubG9hZCB0aGUgZmlybXdhcmUgaW50byB0aGUgU1JBTSBvbiB0aGUgTklDCisgKgorICogVGhpcyBvcGVyYXRpb24gcmVxdWlyZXMgdGhlIE5JQyB0byBiZSBoYWx0ZWQgYW5kIGlzIHBlcmZvcm1lZCB3aXRoCisgKiBpbnRlcnJ1cHRzIGRpc2FibGVkIGFuZCB3aXRoIHRoZSBzcGlubG9jayBob2xkLgorICovCitpbnQgX19kZXZpbml0IGFjZV9sb2FkX2Zpcm13YXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFjZV9wcml2YXRlICphcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MgPSBhcC0+cmVnczsKKworCWlmICghKHJlYWRsKCZyZWdzLT5DcHVDdHJsKSAmIENQVV9IQUxURUQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyeWluZyB0byBkb3dubG9hZCBmaXJtd2FyZSB3aGlsZSB0aGUgIgorCQkgICAgICAgIkNQVSBpcyBydW5uaW5nIVxuIiwgYXAtPm5hbWUpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKgorCSAqIERvIG5vdCB0cnkgdG8gY2xlYXIgbW9yZSB0aGFuIDUxMktCIG9yIHdlIGVuZCB1cCBzZWVpbmcKKwkgKiBmdW5ueSB0aGluZ3Mgb24gTklDcyB3aXRoIG9ubHkgNTEyS0IgU1JBTQorCSAqLworCWFjZV9jbGVhcihyZWdzLCAweDIwMDAsIDB4ODAwMDAtMHgyMDAwKTsKKwlpZiAoQUNFX0lTX1RJR09OX0koYXApKSB7CisJCWFjZV9jb3B5KHJlZ3MsIHRpZ29uRndUZXh0LCB0aWdvbkZ3VGV4dEFkZHIsIHRpZ29uRndUZXh0TGVuKTsKKwkJYWNlX2NvcHkocmVncywgdGlnb25Gd0RhdGEsIHRpZ29uRndEYXRhQWRkciwgdGlnb25Gd0RhdGFMZW4pOworCQlhY2VfY29weShyZWdzLCB0aWdvbkZ3Um9kYXRhLCB0aWdvbkZ3Um9kYXRhQWRkciwKKwkJCSB0aWdvbkZ3Um9kYXRhTGVuKTsKKwkJYWNlX2NsZWFyKHJlZ3MsIHRpZ29uRndCc3NBZGRyLCB0aWdvbkZ3QnNzTGVuKTsKKwkJYWNlX2NsZWFyKHJlZ3MsIHRpZ29uRndTYnNzQWRkciwgdGlnb25Gd1Nic3NMZW4pOworCX1lbHNlIGlmIChhcC0+dmVyc2lvbiA9PSAyKSB7CisJCWFjZV9jbGVhcihyZWdzLCB0aWdvbjJGd0Jzc0FkZHIsIHRpZ29uMkZ3QnNzTGVuKTsKKwkJYWNlX2NsZWFyKHJlZ3MsIHRpZ29uMkZ3U2Jzc0FkZHIsIHRpZ29uMkZ3U2Jzc0xlbik7CisJCWFjZV9jb3B5KHJlZ3MsIHRpZ29uMkZ3VGV4dCwgdGlnb24yRndUZXh0QWRkcix0aWdvbjJGd1RleHRMZW4pOworCQlhY2VfY29weShyZWdzLCB0aWdvbjJGd1JvZGF0YSwgdGlnb24yRndSb2RhdGFBZGRyLAorCQkJIHRpZ29uMkZ3Um9kYXRhTGVuKTsKKwkJYWNlX2NvcHkocmVncywgdGlnb24yRndEYXRhLCB0aWdvbjJGd0RhdGFBZGRyLHRpZ29uMkZ3RGF0YUxlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFRoZSBlZXByb20gb24gdGhlIEFjZU5JQyBpcyBhbiBBdG1lbCBpMmMgRUVQUk9NLgorICoKKyAqIEFjY2Vzc2luZyB0aGUgRUVQUk9NIGlzIGBpbnRlcmVzdGluZycgdG8gc2F5IHRoZSBsZWFzdCAtIGRvbid0IHJlYWQKKyAqIHRoaXMgY29kZSByaWdodCBhZnRlciBkaW5uZXIuCisgKgorICogVGhpcyBpcyBhbGwgYWJvdXQgYmxhY2sgbWFnaWMgYW5kIGJpdC1iYW5naW5nIHRoZSBkZXZpY2UgLi4uLiBJCisgKiB3b25kZXIgaW4gd2hhdCBob3NwaXRhbCB0aGV5IGhhdmUgcHV0IHRoZSBndXkgd2hvIGRlc2lnbmVkIHRoZSBpMmMKKyAqIHNwZWNzLgorICoKKyAqIE9oIHllcywgdGhpcyBpcyBvbmx5IHRoZSBiZWdpbm5pbmchCisgKgorICogVGhhbmtzIHRvIFN0ZXZhcmlubyBXZWJpbnNraSBmb3IgaGVscGluZyB0cmFja2luZyBkb3duIHRoZSBidWdzIGluIHRoZQorICogY29kZSBpMmMgcmVhZG91dCBjb2RlIGJ5IGJldGEgdGVzdGluZyBhbGwgbXkgaGFja3MuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBlZXByb21fc3RhcnQoc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MpCit7CisJdTMyIGxvY2FsOworCisJcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJdWRlbGF5KEFDRV9TSE9SVF9ERUxBWSk7CisJbG9jYWwgPSByZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwlsb2NhbCB8PSBFRVBST01fREFUQV9PVVQgfCBFRVBST01fV1JJVEVfRU5BQkxFOworCXdyaXRlbChsb2NhbCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisJcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJbWIoKTsKKwl1ZGVsYXkoQUNFX1NIT1JUX0RFTEFZKTsKKwlsb2NhbCB8PSBFRVBST01fQ0xLX09VVDsKKwl3cml0ZWwobG9jYWwsICZyZWdzLT5Mb2NhbEN0cmwpOworCXJlYWRsKCZyZWdzLT5Mb2NhbEN0cmwpOworCW1iKCk7CisJdWRlbGF5KEFDRV9TSE9SVF9ERUxBWSk7CisJbG9jYWwgJj0gfkVFUFJPTV9EQVRBX09VVDsKKwl3cml0ZWwobG9jYWwsICZyZWdzLT5Mb2NhbEN0cmwpOworCXJlYWRsKCZyZWdzLT5Mb2NhbEN0cmwpOworCW1iKCk7CisJdWRlbGF5KEFDRV9TSE9SVF9ERUxBWSk7CisJbG9jYWwgJj0gfkVFUFJPTV9DTEtfT1VUOworCXdyaXRlbChsb2NhbCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisJcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJbWIoKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZWVwcm9tX3ByZXAoc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MsIHU4IG1hZ2ljKQoreworCXNob3J0IGk7CisJdTMyIGxvY2FsOworCisJdWRlbGF5KEFDRV9TSE9SVF9ERUxBWSk7CisJbG9jYWwgPSByZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwlsb2NhbCAmPSB+RUVQUk9NX0RBVEFfT1VUOworCWxvY2FsIHw9IEVFUFJPTV9XUklURV9FTkFCTEU7CisJd3JpdGVsKGxvY2FsLCAmcmVncy0+TG9jYWxDdHJsKTsKKwlyZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwltYigpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKywgbWFnaWMgPDw9IDEpIHsKKwkJdWRlbGF5KEFDRV9TSE9SVF9ERUxBWSk7CisJCWlmIChtYWdpYyAmIDB4ODApIAorCQkJbG9jYWwgfD0gRUVQUk9NX0RBVEFfT1VUOworCQllbHNlCisJCQlsb2NhbCAmPSB+RUVQUk9NX0RBVEFfT1VUOworCQl3cml0ZWwobG9jYWwsICZyZWdzLT5Mb2NhbEN0cmwpOworCQlyZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwkJbWIoKTsKKworCQl1ZGVsYXkoQUNFX1NIT1JUX0RFTEFZKTsKKwkJbG9jYWwgfD0gRUVQUk9NX0NMS19PVVQ7CisJCXdyaXRlbChsb2NhbCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisJCXJlYWRsKCZyZWdzLT5Mb2NhbEN0cmwpOworCQltYigpOworCQl1ZGVsYXkoQUNFX1NIT1JUX0RFTEFZKTsKKwkJbG9jYWwgJj0gfihFRVBST01fQ0xLX09VVCB8IEVFUFJPTV9EQVRBX09VVCk7CisJCXdyaXRlbChsb2NhbCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisJCXJlYWRsKCZyZWdzLT5Mb2NhbEN0cmwpOworCQltYigpOworCX0KK30KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlZXByb21fY2hlY2tfYWNrKHN0cnVjdCBhY2VfcmVncyBfX2lvbWVtICpyZWdzKQoreworCWludCBzdGF0ZTsKKwl1MzIgbG9jYWw7CisKKwlsb2NhbCA9IHJlYWRsKCZyZWdzLT5Mb2NhbEN0cmwpOworCWxvY2FsICY9IH5FRVBST01fV1JJVEVfRU5BQkxFOworCXdyaXRlbChsb2NhbCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisJcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJbWIoKTsKKwl1ZGVsYXkoQUNFX0xPTkdfREVMQVkpOworCWxvY2FsIHw9IEVFUFJPTV9DTEtfT1VUOworCXdyaXRlbChsb2NhbCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisJcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJbWIoKTsKKwl1ZGVsYXkoQUNFX1NIT1JUX0RFTEFZKTsKKwkvKiBzYW1wbGUgZGF0YSBpbiBtaWRkbGUgb2YgaGlnaCBjbGsgKi8KKwlzdGF0ZSA9IChyZWFkbCgmcmVncy0+TG9jYWxDdHJsKSAmIEVFUFJPTV9EQVRBX0lOKSAhPSAwOworCXVkZWxheShBQ0VfU0hPUlRfREVMQVkpOworCW1iKCk7CisJd3JpdGVsKHJlYWRsKCZyZWdzLT5Mb2NhbEN0cmwpICYgfkVFUFJPTV9DTEtfT1VULCAmcmVncy0+TG9jYWxDdHJsKTsKKwlyZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwltYigpOworCisJcmV0dXJuIHN0YXRlOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBlZXByb21fc3RvcChzdHJ1Y3QgYWNlX3JlZ3MgX19pb21lbSAqcmVncykKK3sKKwl1MzIgbG9jYWw7CisKKwl1ZGVsYXkoQUNFX1NIT1JUX0RFTEFZKTsKKwlsb2NhbCA9IHJlYWRsKCZyZWdzLT5Mb2NhbEN0cmwpOworCWxvY2FsIHw9IEVFUFJPTV9XUklURV9FTkFCTEU7CisJd3JpdGVsKGxvY2FsLCAmcmVncy0+TG9jYWxDdHJsKTsKKwlyZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwltYigpOworCXVkZWxheShBQ0VfU0hPUlRfREVMQVkpOworCWxvY2FsICY9IH5FRVBST01fREFUQV9PVVQ7CisJd3JpdGVsKGxvY2FsLCAmcmVncy0+TG9jYWxDdHJsKTsKKwlyZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwltYigpOworCXVkZWxheShBQ0VfU0hPUlRfREVMQVkpOworCWxvY2FsIHw9IEVFUFJPTV9DTEtfT1VUOworCXdyaXRlbChsb2NhbCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisJcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJbWIoKTsKKwl1ZGVsYXkoQUNFX1NIT1JUX0RFTEFZKTsKKwlsb2NhbCB8PSBFRVBST01fREFUQV9PVVQ7CisJd3JpdGVsKGxvY2FsLCAmcmVncy0+TG9jYWxDdHJsKTsKKwlyZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwltYigpOworCXVkZWxheShBQ0VfTE9OR19ERUxBWSk7CisJbG9jYWwgJj0gfkVFUFJPTV9DTEtfT1VUOworCXdyaXRlbChsb2NhbCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisJbWIoKTsKK30KKworCisvKgorICogUmVhZCBhIHdob2xlIGJ5dGUgZnJvbSB0aGUgRUVQUk9NLgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCByZWFkX2VlcHJvbV9ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJc3RydWN0IGFjZV9wcml2YXRlICphcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MgPSBhcC0+cmVnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBsb2NhbDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzaG9ydCBpOworCisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJObyBkZXZpY2UhXG4iKTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBEb24ndCB0YWtlIGludGVycnVwdHMgb24gdGhpcyBDUFUgd2lsbCBiaXQgYmFuZ2luZworCSAqIHRoZSAlIyUjQCQgSTJDIGRldmljZQorCSAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWVlcHJvbV9zdGFydChyZWdzKTsKKworCWVlcHJvbV9wcmVwKHJlZ3MsIEVFUFJPTV9XUklURV9TRUxFQ1QpOworCWlmIChlZXByb21fY2hlY2tfYWNrKHJlZ3MpKSB7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIHN5bmMgZWVwcm9tXG4iLCBhcC0+bmFtZSk7CisJCXJlc3VsdCA9IC1FSU87CisJCWdvdG8gZWVwcm9tX3JlYWRfZXJyb3I7CisJfQorCisJZWVwcm9tX3ByZXAocmVncywgKG9mZnNldCA+PiA4KSAmIDB4ZmYpOworCWlmIChlZXByb21fY2hlY2tfYWNrKHJlZ3MpKSB7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIHNldCBhZGRyZXNzIGJ5dGUgMFxuIiwKKwkJICAgICAgIGFwLT5uYW1lKTsKKwkJcmVzdWx0ID0gLUVJTzsKKwkJZ290byBlZXByb21fcmVhZF9lcnJvcjsKKwl9CisKKwllZXByb21fcHJlcChyZWdzLCBvZmZzZXQgJiAweGZmKTsKKwlpZiAoZWVwcm9tX2NoZWNrX2FjayhyZWdzKSkgeworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBzZXQgYWRkcmVzcyBieXRlIDFcbiIsCisJCSAgICAgICBhcC0+bmFtZSk7CisJCXJlc3VsdCA9IC1FSU87CisJCWdvdG8gZWVwcm9tX3JlYWRfZXJyb3I7CisJfQorCisJZWVwcm9tX3N0YXJ0KHJlZ3MpOworCWVlcHJvbV9wcmVwKHJlZ3MsIEVFUFJPTV9SRUFEX1NFTEVDVCk7CisJaWYgKGVlcHJvbV9jaGVja19hY2socmVncykpIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gc2V0IFJFQURfU0VMRUNUXG4iLAorCQkgICAgICAgYXAtPm5hbWUpOworCQlyZXN1bHQgPSAtRUlPOworCQlnb3RvIGVlcHJvbV9yZWFkX2Vycm9yOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJbG9jYWwgPSByZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwkJbG9jYWwgJj0gfkVFUFJPTV9XUklURV9FTkFCTEU7CisJCXdyaXRlbChsb2NhbCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisJCXJlYWRsKCZyZWdzLT5Mb2NhbEN0cmwpOworCQl1ZGVsYXkoQUNFX0xPTkdfREVMQVkpOworCQltYigpOworCQlsb2NhbCB8PSBFRVBST01fQ0xLX09VVDsKKwkJd3JpdGVsKGxvY2FsLCAmcmVncy0+TG9jYWxDdHJsKTsKKwkJcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJCW1iKCk7CisJCXVkZWxheShBQ0VfU0hPUlRfREVMQVkpOworCQkvKiBzYW1wbGUgZGF0YSBtaWQgaGlnaCBjbGsgKi8KKwkJcmVzdWx0ID0gKHJlc3VsdCA8PCAxKSB8CisJCQkoKHJlYWRsKCZyZWdzLT5Mb2NhbEN0cmwpICYgRUVQUk9NX0RBVEFfSU4pICE9IDApOworCQl1ZGVsYXkoQUNFX1NIT1JUX0RFTEFZKTsKKwkJbWIoKTsKKwkJbG9jYWwgPSByZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwkJbG9jYWwgJj0gfkVFUFJPTV9DTEtfT1VUOworCQl3cml0ZWwobG9jYWwsICZyZWdzLT5Mb2NhbEN0cmwpOworCQlyZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwkJdWRlbGF5KEFDRV9TSE9SVF9ERUxBWSk7CisJCW1iKCk7CisJCWlmIChpID09IDcpIHsKKwkJCWxvY2FsIHw9IEVFUFJPTV9XUklURV9FTkFCTEU7CisJCQl3cml0ZWwobG9jYWwsICZyZWdzLT5Mb2NhbEN0cmwpOworCQkJcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJCQltYigpOworCQkJdWRlbGF5KEFDRV9TSE9SVF9ERUxBWSk7CisJCX0KKwl9CisKKwlsb2NhbCB8PSBFRVBST01fREFUQV9PVVQ7CisJd3JpdGVsKGxvY2FsLCAmcmVncy0+TG9jYWxDdHJsKTsKKwlyZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwltYigpOworCXVkZWxheShBQ0VfU0hPUlRfREVMQVkpOworCXdyaXRlbChyZWFkbCgmcmVncy0+TG9jYWxDdHJsKSB8IEVFUFJPTV9DTEtfT1VULCAmcmVncy0+TG9jYWxDdHJsKTsKKwlyZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwl1ZGVsYXkoQUNFX0xPTkdfREVMQVkpOworCXdyaXRlbChyZWFkbCgmcmVncy0+TG9jYWxDdHJsKSAmIH5FRVBST01fQ0xLX09VVCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisJcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJbWIoKTsKKwl1ZGVsYXkoQUNFX1NIT1JUX0RFTEFZKTsKKwllZXByb21fc3RvcChyZWdzKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyBvdXQ6CisJcmV0dXJuIHJlc3VsdDsKKworIGVlcHJvbV9yZWFkX2Vycm9yOgorCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byByZWFkIGVlcHJvbSBieXRlIDB4JTAybHhcbiIsCisJICAgICAgIGFwLT5uYW1lLCBvZmZzZXQpOworCWdvdG8gb3V0OworfQorCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURfX1NNUF9fIC1EX19LRVJORUxfXyAtRE1PRFVMRSAtSS4uLy4uL2luY2x1ZGUgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLXBpcGUgLWZuby1zdHJlbmd0aC1yZWR1Y2UgLURNT0RWRVJTSU9OUyAtaW5jbHVkZSAuLi8uLi9pbmNsdWRlL2xpbnV4L21vZHZlcnNpb25zLmggICAtYyAtbyBhY2VuaWMubyBhY2VuaWMuYyIKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYWNlbmljLmggYi9kcml2ZXJzL25ldC9hY2VuaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTcxMDcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYWNlbmljLmgKQEAgLTAsMCArMSw3OTQgQEAKKyNpZm5kZWYgX0FDRU5JQ19IXworI2RlZmluZSBfQUNFTklDX0hfCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworLyoKKyAqIEdlbmVyYXRlIFRYIGluZGV4IHVwZGF0ZSBlYWNoIHRpbWUsIHdoZW4gVFggcmluZyBpcyBjbG9zZWQuCisgKiBOb3JtYWxseSwgdGhpcyBpcyBub3QgdXNlZnVsLCBiZWNhdXNlIHJlc3VsdHMgaW4gbW9yZSBkbWEgKGFuZCBpcnFzCisgKiB3aXRob3V0IFRYX0NPQUxfSU5UU19PTkxZKS4KKyAqLworI2RlZmluZSBVU0VfVFhfQ09BTF9OT1cJIDAKKworLyoKKyAqIEFkZHJlc3Npbmc6CisgKgorICogVGhlIFRpZ29uIHVzZXMgNjQtYml0IGhvc3QgYWRkcmVzc2VzLCByZWdhcmRsZXNzIG9mIHRoZWlyIGFjdHVhbAorICogbGVuZ3RoLCBhbmQgaXQgZXhwZWN0cyBhIGJpZy1lbmRpYW4gZm9ybWF0LiBGb3IgMzIgYml0IHN5c3RlbXMgdGhlCisgKiB1cHBlciAzMiBiaXRzIG9mIHRoZSBhZGRyZXNzIGFyZSBzaW1wbHkgaWdub3JlZCAoemVybyksIGhvd2V2ZXIgZm9yCisgKiBsaXR0bGUgZW5kaWFuIDY0IGJpdCBzeXN0ZW1zIChBbHBoYSkgdGhpcyBsb29rcyBzdHJhbmdlIHdpdGggdGhlCisgKiB0d28gcGFydHMgb2YgdGhlIGFkZHJlc3Mgd29yZCBiZWluZyBzd2FwcGVkLgorICoKKyAqIFRoZSBhZGRyZXNzZXMgYXJlIHNwbGl0IGluIHR3byAzMiBiaXQgd29yZHMgZm9yIGFsbCBhcmNoaXRlY3R1cmVzCisgKiBhcyBzb21lIG9mIHRoZW0gYXJlIGluIFBDSSBzaGFyZWQgbWVtb3J5IGFuZCBpdCBpcyBuZWNlc3NhcnkgdG8gdXNlCisgKiByZWFkbC93cml0ZWwgdG8gYWNjZXNzIHRoZW0uCisgKgorICogVGhlIGFkZHJlc3NpbmcgY29kZSBpcyBkZXJpdmVkIGZyb20gUGV0ZSBXeWNrb2ZmJ3Mgd29yaywgYnV0CisgKiBtb2RpZmllZCB0byBkZWFsIHByb3Blcmx5IHdpdGggcmVhZGwvd3JpdGVsIHVzYWdlLgorICovCisKK3N0cnVjdCBhY2VfcmVncyB7CisJdTMyCXBhZDBbMTZdOwkvKiBQQ0kgY29udHJvbCByZWdpc3RlcnMgKi8KKworCXUzMglIb3N0Q3RybDsJLyogMHg0MCAqLworCXUzMglMb2NhbEN0cmw7CisKKwl1MzIJcGFkMVsyXTsKKworCXUzMglNaXNjQ2ZnOwkvKiAweDUwICovCisKKwl1MzIJcGFkMlsyXTsKKworCXUzMglQY2lTdGF0ZTsKKworCXUzMglwYWQzWzJdOwkvKiAweDYwICovCisKKwl1MzIJV2luQmFzZTsKKwl1MzIJV2luRGF0YTsKKworCXUzMglwYWQ0WzEyXTsJLyogMHg3MCAqLworCisJdTMyCURtYVdyaXRlU3RhdGU7CS8qIDB4YTAgKi8KKwl1MzIJcGFkNVszXTsKKwl1MzIJRG1hUmVhZFN0YXRlOwkvKiAweGIwICovCisKKwl1MzIJcGFkNlsyNl07CisKKwl1MzIJQXNzaXN0U3RhdGU7CisKKwl1MzIJcGFkN1s4XTsJLyogMHgxMjAgKi8KKworCXUzMglDcHVDdHJsOwkvKiAweDE0MCAqLworCXUzMglQYzsKKworCXUzMglwYWQ4WzNdOworCisJdTMyCVNyYW1BZGRyOwkvKiAweDE1NCAqLworCXUzMglTcmFtRGF0YTsKKworCXUzMglwYWQ5WzQ5XTsKKworCXUzMglNYWNSeFN0YXRlOwkvKiAweDIyMCAqLworCisJdTMyCXBhZDEwWzddOworCisJdTMyCUNwdUJDdHJsOwkvKiAweDI0MCAqLworCXUzMglQY0I7CisKKwl1MzIJcGFkMTFbM107CisKKwl1MzIJU3JhbUJBZGRyOwkvKiAweDI1NCAqLworCXUzMglTcmFtQkRhdGE7CisKKwl1MzIJcGFkMTJbMTA1XTsKKworCXUzMglwYWQxM1szMl07CS8qIDB4NDAwICovCisJdTMyCVN0YXRzWzMyXTsKKworCXUzMglNYjBIaTsJCS8qIDB4NTAwICovCisJdTMyCU1iMExvOworCXUzMglNYjFIaTsKKwl1MzIJQ21kUHJkOworCXUzMglNYjJIaTsKKwl1MzIJVHhQcmQ7CisJdTMyCU1iM0hpOworCXUzMglSeFN0ZFByZDsKKwl1MzIJTWI0SGk7CisJdTMyCVJ4SnVtYm9QcmQ7CisJdTMyCU1iNUhpOworCXUzMglSeE1pbmlQcmQ7CisJdTMyCU1iNkhpOworCXUzMglNYjZMbzsKKwl1MzIJTWI3SGk7CisJdTMyCU1iN0xvOworCXUzMglNYjhIaTsKKwl1MzIJTWI4TG87CisJdTMyCU1iOUhpOworCXUzMglNYjlMbzsKKwl1MzIJTWJBSGk7CisJdTMyCU1iQUxvOworCXUzMglNYkJIaTsKKwl1MzIJTWJCTG87CisJdTMyCU1iQ0hpOworCXUzMglNYkNMbzsKKwl1MzIJTWJESGk7CisJdTMyCU1iRExvOworCXUzMglNYkVIaTsKKwl1MzIJTWJFTG87CisJdTMyCU1iRkhpOworCXUzMglNYkZMbzsKKworCXUzMglwYWQxNFszMl07CisKKwl1MzIJTWFjQWRkckhpOwkvKiAweDYwMCAqLworCXUzMglNYWNBZGRyTG87CisJdTMyCUluZm9QdHJIaTsKKwl1MzIJSW5mb1B0ckxvOworCXUzMglNdWx0aUNhc3RIaTsJLyogMHg2MTAgKi8KKwl1MzIJTXVsdGlDYXN0TG87CisJdTMyCU1vZGVTdGF0OworCXUzMglEbWFSZWFkQ2ZnOworCXUzMglEbWFXcml0ZUNmZzsJLyogMHg2MjAgKi8KKwl1MzIJVHhCdWZSYXQ7CisJdTMyCUV2dENzbTsKKwl1MzIJQ21kQ3NtOworCXUzMglUdW5lUnhDb2FsVGlja3M7LyogMHg2MzAgKi8KKwl1MzIJVHVuZVR4Q29hbFRpY2tzOworCXUzMglUdW5lU3RhdFRpY2tzOworCXUzMglUdW5lTWF4VHhEZXNjOworCXUzMglUdW5lTWF4UnhEZXNjOwkvKiAweDY0MCAqLworCXUzMglUdW5lVHJhY2U7CisJdTMyCVR1bmVMaW5rOworCXUzMglUdW5lRmFzdExpbms7CisJdTMyCVRyYWNlUHRyOwkvKiAweDY1MCAqLworCXUzMglUcmFjZVN0cnQ7CisJdTMyCVRyYWNlTGVuOworCXUzMglJZklkeDsKKwl1MzIJSWZNdHU7CQkvKiAweDY2MCAqLworCXUzMglNYXNrSW50OworCXUzMglHaWdMbmtTdGF0ZTsKKwl1MzIJRmFzdExua1N0YXRlOworCXUzMglwYWQxNls0XTsJLyogMHg2NzAgKi8KKwl1MzIJUnhSZXRDc207CS8qIDB4NjgwICovCisKKwl1MzIJcGFkMTdbMzFdOworCisJdTMyCUNtZFJuZ1s2NF07CS8qIDB4NzAwICovCisJdTMyCVdpbmRvd1sweDIwMF07Cit9OworCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgYWRkcmhpOworCXUzMiBhZGRybG87Cit9IGFjZWFkZHI7CisKKworI2RlZmluZSBBQ0VfV0lORE9XX1NJWkUJMHg4MDAKKworI2RlZmluZSBBQ0VfSlVNQk9fTVRVIDkwMDAKKyNkZWZpbmUgQUNFX1NURF9NVFUgMTUwMAorCisjZGVmaW5lIEFDRV9UUkFDRV9TSVpFIDB4ODAwMAorCisvKgorICogSG9zdCBjb250cm9sIHJlZ2lzdGVyIGJpdHMuCisgKi8KKwkKKyNkZWZpbmUgSU5fSU5UCQkweDAxCisjZGVmaW5lIENMUl9JTlQJCTB4MDIKKyNkZWZpbmUgSFdfUkVTRVQJMHgwOAorI2RlZmluZSBCWVRFX1NXQVAJMHgxMAorI2RlZmluZSBXT1JEX1NXQVAJMHgyMAorI2RlZmluZSBNQVNLX0lOVFMJMHg0MAorCisvKgorICogTG9jYWwgY29udHJvbCByZWdpc3RlciBiaXRzLgorICovCisKKyNkZWZpbmUgRUVQUk9NX0RBVEFfSU4JCTB4ODAwMDAwCisjZGVmaW5lIEVFUFJPTV9EQVRBX09VVAkJMHg0MDAwMDAKKyNkZWZpbmUgRUVQUk9NX1dSSVRFX0VOQUJMRQkweDIwMDAwMAorI2RlZmluZSBFRVBST01fQ0xLX09VVAkJMHgxMDAwMDAKKworI2RlZmluZSBFRVBST01fQkFTRQkJMHhhMDAwMDAwMAorCisjZGVmaW5lIEVFUFJPTV9XUklURV9TRUxFQ1QJMHhhMAorI2RlZmluZSBFRVBST01fUkVBRF9TRUxFQ1QJMHhhMQorCisjZGVmaW5lIFNSQU1fQkFOS181MTJLCQkweDIwMAorCisKKy8qCisgKiB1ZGVsYXkoKSB2YWx1ZXMgZm9yIHdoZW4gY2xvY2tpbmcgdGhlIGVlcHJvbQorICovCisjZGVmaW5lIEFDRV9TSE9SVF9ERUxBWQkJMgorI2RlZmluZSBBQ0VfTE9OR19ERUxBWQkJNAorCisKKy8qCisgKiBNaXNjIENvbmZpZyBiaXRzCisgKi8KKworI2RlZmluZSBTWU5DX1NSQU1fVElNSU5HCTB4MTAwMDAwCisKKworLyoKKyAqIENQVSBzdGF0ZSBiaXRzLgorICovCisKKyNkZWZpbmUgQ1BVX1JFU0VUCQkweDAxCisjZGVmaW5lIENQVV9UUkFDRQkJMHgwMgorI2RlZmluZSBDUFVfUFJPTV9GQUlMRUQJCTB4MTAKKyNkZWZpbmUgQ1BVX0hBTFQJCTB4MDAwMTAwMDAKKyNkZWZpbmUgQ1BVX0hBTFRFRAkJMHhmZmZmMDAwMAorCisKKy8qCisgKiBQQ0kgU3RhdGUgYml0cy4KKyAqLworCisjZGVmaW5lIERNQV9SRUFEX01BWF80CQkweDA0CisjZGVmaW5lIERNQV9SRUFEX01BWF8xNgkJMHgwOAorI2RlZmluZSBETUFfUkVBRF9NQVhfMzIJCTB4MGMKKyNkZWZpbmUgRE1BX1JFQURfTUFYXzY0CQkweDEwCisjZGVmaW5lIERNQV9SRUFEX01BWF8xMjgJMHgxNAorI2RlZmluZSBETUFfUkVBRF9NQVhfMjU2CTB4MTgKKyNkZWZpbmUgRE1BX1JFQURfTUFYXzFLCQkweDFjCisjZGVmaW5lIERNQV9XUklURV9NQVhfNAkJMHgyMAorI2RlZmluZSBETUFfV1JJVEVfTUFYXzE2CTB4NDAKKyNkZWZpbmUgRE1BX1dSSVRFX01BWF8zMgkweDYwCisjZGVmaW5lIERNQV9XUklURV9NQVhfNjQJMHg4MAorI2RlZmluZSBETUFfV1JJVEVfTUFYXzEyOAkweGEwCisjZGVmaW5lIERNQV9XUklURV9NQVhfMjU2CTB4YzAKKyNkZWZpbmUgRE1BX1dSSVRFX01BWF8xSwkweGUwCisjZGVmaW5lIERNQV9SRUFEX1dSSVRFX01BU0sJMHhmYworI2RlZmluZSBNRU1fUkVBRF9NVUxUSVBMRQkweDAwMDIwMDAwCisjZGVmaW5lIFBDSV82Nk1IWgkJMHgwMDA4MDAwMAorI2RlZmluZSBQQ0lfMzJCSVQJCTB4MDAxMDAwMDAKKyNkZWZpbmUgRE1BX1dSSVRFX0FMTF9BTElHTgkweDAwODAwMDAwCisjZGVmaW5lIFJFQURfQ01EX01FTQkJMHgwNjAwMDAwMAorI2RlZmluZSBXUklURV9DTURfTUVNCQkweDcwMDAwMDAwCisKKworLyoKKyAqIE1vZGUgc3RhdHVzCisgKi8KKworI2RlZmluZSBBQ0VfQllURV9TV0FQX0JECTB4MDIKKyNkZWZpbmUgQUNFX1dPUkRfU1dBUF9CRAkweDA0CQkvKiBub3QgYWN0dWFsbHkgdXNlZCAqLworI2RlZmluZSBBQ0VfV0FSTgkJMHgwOAorI2RlZmluZSBBQ0VfQllURV9TV0FQX0RNQQkweDEwCisjZGVmaW5lIEFDRV9OT19KVU1CT19GUkFHCTB4MjAwCisjZGVmaW5lIEFDRV9GQVRBTAkJMHg0MDAwMDAwMAorCisKKy8qCisgKiBETUEgY29uZmlnCisgKi8KKworI2RlZmluZSBETUFfVEhSRVNIXzFXCQkweDEwCisjZGVmaW5lIERNQV9USFJFU0hfMlcJCTB4MjAKKyNkZWZpbmUgRE1BX1RIUkVTSF80VwkJMHg0MAorI2RlZmluZSBETUFfVEhSRVNIXzhXCQkweDgwCisjZGVmaW5lIERNQV9USFJFU0hfMTZXCQkweDEwMAorI2RlZmluZSBETUFfVEhSRVNIXzMyVwkJMHgwCS8qIG5vdCBkZXNjcmliZWQgaW4gZG9jLCBidXQgZXhpc3RzLiAqLworCisKKy8qCisgKiBUdW5pbmcgcGFyYW1ldGVycworICovCisKKyNkZWZpbmUgVElDS1NfUEVSX1NFQwkJMTAwMDAwMAorCisKKy8qCisgKiBMaW5rIGJpdHMKKyAqLworCisjZGVmaW5lIExOS19QUkVGCQkweDAwMDA4MDAwCisjZGVmaW5lIExOS18xME1CCQkweDAwMDEwMDAwCisjZGVmaW5lIExOS18xMDBNQgkJMHgwMDAyMDAwMAorI2RlZmluZSBMTktfMTAwME1CCQkweDAwMDQwMDAwCisjZGVmaW5lIExOS19GVUxMX0RVUExFWAkJMHgwMDA4MDAwMAorI2RlZmluZSBMTktfSEFMRl9EVVBMRVgJCTB4MDAxMDAwMDAKKyNkZWZpbmUgTE5LX1RYX0ZMT1dfQ1RMX1kJMHgwMDIwMDAwMAorI2RlZmluZSBMTktfTkVHX0FEVkFOQ0VECTB4MDA0MDAwMDAKKyNkZWZpbmUgTE5LX1JYX0ZMT1dfQ1RMX1kJMHgwMDgwMDAwMAorI2RlZmluZSBMTktfTklDCQkJMHgwMTAwMDAwMAorI2RlZmluZSBMTktfSkFNCQkJMHgwMjAwMDAwMAorI2RlZmluZSBMTktfSlVNQk8JCTB4MDQwMDAwMDAKKyNkZWZpbmUgTE5LX0FMVEVPTgkJMHgwODAwMDAwMAorI2RlZmluZSBMTktfTkVHX0ZDVEwJCTB4MTAwMDAwMDAKKyNkZWZpbmUgTE5LX05FR09USUFURQkJMHgyMDAwMDAwMAorI2RlZmluZSBMTktfRU5BQkxFCQkweDQwMDAwMDAwCisjZGVmaW5lIExOS19VUAkJCTB4ODAwMDAwMDAKKworCisvKgorICogRXZlbnQgZGVmaW5pdGlvbnMKKyAqLworCisjZGVmaW5lIEVWVF9SSU5HX0VOVFJJRVMJMjU2CisjZGVmaW5lIEVWVF9SSU5HX1NJWkUJKEVWVF9SSU5HX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IGV2ZW50KSkKKworc3RydWN0IGV2ZW50IHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKKwl1MzIJaWR4OjEyOworCXUzMgljb2RlOjEyOworCXUzMglldnQ6ODsKKyNlbHNlCisJdTMyCWV2dDo4OworCXUzMgljb2RlOjEyOworCXUzMglpZHg6MTI7CisjZW5kaWYKKwl1MzIgICAgIHBhZDsKK307CisKKworLyoKKyAqIEV2ZW50cworICovCisKKyNkZWZpbmUgRV9GV19SVU5OSU5HCQkweDAxCisjZGVmaW5lIEVfU1RBVFNfVVBEQVRFRAkJMHgwNAorCisjZGVmaW5lIEVfU1RBVFNfVVBEQVRFCQkweDA0CisKKyNkZWZpbmUgRV9MTktfU1RBVEUJCTB4MDYKKyNkZWZpbmUgRV9DX0xJTktfVVAJCTB4MDEKKyNkZWZpbmUgRV9DX0xJTktfRE9XTgkJMHgwMgorI2RlZmluZSBFX0NfTElOS18xMF8xMDAJCTB4MDMKKworI2RlZmluZSBFX0VSUk9SCQkJMHgwNworI2RlZmluZSBFX0NfRVJSX0lOVkFMX0NNRAkweDAxCisjZGVmaW5lIEVfQ19FUlJfVU5JTVBfQ01ECTB4MDIKKyNkZWZpbmUgRV9DX0VSUl9CQURfQ0ZHCQkweDAzCisKKyNkZWZpbmUgRV9NQ0FTVF9MSVNUCQkweDA4CisjZGVmaW5lIEVfQ19NQ0FTVF9BRERSX0FERAkweDAxCisjZGVmaW5lIEVfQ19NQ0FTVF9BRERSX0RFTAkweDAyCisKKyNkZWZpbmUgRV9SRVNFVF9KVU1CT19STkcJMHgwOQorCisKKy8qCisgKiBDb21tYW5kcworICovCisKKyNkZWZpbmUgQ01EX1JJTkdfRU5UUklFUwk2NAorCitzdHJ1Y3QgY21kIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKKwl1MzIJaWR4OjEyOworCXUzMgljb2RlOjEyOworCXUzMglldnQ6ODsKKyNlbHNlCisJdTMyCWV2dDo4OworCXUzMgljb2RlOjEyOworCXUzMglpZHg6MTI7CisjZW5kaWYKK307CisKKworI2RlZmluZSBDX0hPU1RfU1RBVEUJCTB4MDEKKyNkZWZpbmUgQ19DX1NUQUNLX1VQCQkweDAxCisjZGVmaW5lIENfQ19TVEFDS19ET1dOCQkweDAyCisKKyNkZWZpbmUgQ19GRFJfRklMVEVSSU5HCQkweDAyCisjZGVmaW5lIENfQ19GRFJfRklMVF9FTkFCTEUJMHgwMQorI2RlZmluZSBDX0NfRkRSX0ZJTFRfRElTQUJMRQkweDAyCisKKyNkZWZpbmUgQ19TRVRfUlhfUFJEX0lEWAkweDAzCisjZGVmaW5lIENfVVBEQVRFX1NUQVRTCQkweDA0CisjZGVmaW5lIENfUkVTRVRfSlVNQk9fUk5HCTB4MDUKKyNkZWZpbmUgQ19BRERfTVVMVElDQVNUX0FERFIJMHgwOAorI2RlZmluZSBDX0RFTF9NVUxUSUNBU1RfQUREUgkweDA5CisKKyNkZWZpbmUgQ19TRVRfUFJPTUlTQ19NT0RFCTB4MGEKKyNkZWZpbmUgQ19DX1BST01JU0NfRU5BQkxFCTB4MDEKKyNkZWZpbmUgQ19DX1BST01JU0NfRElTQUJMRQkweDAyCisKKyNkZWZpbmUgQ19MTktfTkVHT1RJQVRJT04JMHgwYgorI2RlZmluZSBDX0NfTkVHT1RJQVRFX0JPVEgJMHgwMAorI2RlZmluZSBDX0NfTkVHT1RJQVRFX0dJRwkweDAxCisjZGVmaW5lIENfQ19ORUdPVElBVEVfMTBfMTAwCTB4MDIKKworI2RlZmluZSBDX1NFVF9NQUNfQUREUgkJMHgwYworI2RlZmluZSBDX0NMRUFSX1BST0ZJTEUJCTB4MGQKKworI2RlZmluZSBDX1NFVF9NVUxUSUNBU1RfTU9ERQkweDBlCisjZGVmaW5lIENfQ19NQ0FTVF9FTkFCTEUJMHgwMQorI2RlZmluZSBDX0NfTUNBU1RfRElTQUJMRQkweDAyCisKKyNkZWZpbmUgQ19DTEVBUl9TVEFUUwkJMHgwZgorI2RlZmluZSBDX1NFVF9SWF9KVU1CT19QUkRfSURYCTB4MTAKKyNkZWZpbmUgQ19SRUZSRVNIX1NUQVRTCQkweDExCisKKworLyoKKyAqIERlc2NyaXB0b3IgZmxhZ3MKKyAqLworI2RlZmluZSBCRF9GTEdfVENQX1VEUF9TVU0JMHgwMQorI2RlZmluZSBCRF9GTEdfSVBfU1VNCQkweDAyCisjZGVmaW5lIEJEX0ZMR19FTkQJCTB4MDQKKyNkZWZpbmUgQkRfRkxHX01PUkUJCTB4MDgKKyNkZWZpbmUgQkRfRkxHX0pVTUJPCQkweDEwCisjZGVmaW5lIEJEX0ZMR19VQ0FTVAkJMHgyMAorI2RlZmluZSBCRF9GTEdfTUNBU1QJCTB4NDAKKyNkZWZpbmUgQkRfRkxHX0JDQVNUCQkweDYwCisjZGVmaW5lIEJEX0ZMR19UWVBfTUFTSwkJMHg2MAorI2RlZmluZSBCRF9GTEdfSVBfRlJBRwkJMHg4MAorI2RlZmluZSBCRF9GTEdfSVBfRlJBR19FTkQJMHgxMDAKKyNkZWZpbmUgQkRfRkxHX1ZMQU5fVEFHCQkweDIwMAorI2RlZmluZSBCRF9GTEdfRlJBTUVfRVJST1IJMHg0MDAKKyNkZWZpbmUgQkRfRkxHX0NPQUxfTk9XCQkweDgwMAorI2RlZmluZSBCRF9GTEdfTUlOSQkJMHgxMDAwCisKKworLyoKKyAqIFJpbmcgQ29udHJvbCBibG9jayBmbGFncworICovCisjZGVmaW5lIFJDQl9GTEdfVENQX1VEUF9TVU0JMHgwMQorI2RlZmluZSBSQ0JfRkxHX0lQX1NVTQkJMHgwMgorI2RlZmluZSBSQ0JfRkxHX05PX1BTRVVET19IRFIJMHgwOAorI2RlZmluZSBSQ0JfRkxHX1ZMQU5fQVNTSVNUCTB4MTAKKyNkZWZpbmUgUkNCX0ZMR19DT0FMX0lOVF9PTkxZCTB4MjAKKyNkZWZpbmUgUkNCX0ZMR19UWF9IT1NUX1JJTkcJMHg0MAorI2RlZmluZSBSQ0JfRkxHX0lFRUVfU05BUF9TVU0JMHg4MAorI2RlZmluZSBSQ0JfRkxHX0VYVF9SWF9CRAkweDEwMAorI2RlZmluZSBSQ0JfRkxHX1JOR19ESVNBQkxFCTB4MjAwCisKKworLyoKKyAqIFRYIHJpbmcgLSBtYXhpbXVtIFRYIHJpbmcgZW50cmllcyBmb3IgVGlnb24gSSdzIGlzIDEyOAorICovCisjZGVmaW5lIE1BWF9UWF9SSU5HX0VOVFJJRVMJMjU2CisjZGVmaW5lIFRJR09OX0lfVFhfUklOR19FTlRSSUVTCTEyOAorI2RlZmluZSBUWF9SSU5HX1NJWkUJCShNQVhfVFhfUklOR19FTlRSSUVTICogc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSkKKyNkZWZpbmUgVFhfUklOR19CQVNFCQkweDM4MDAKKworc3RydWN0IHR4X2Rlc2N7CisgICAgICAgIGFjZWFkZHIJYWRkcjsKKwl1MzIJZmxhZ3NpemU7IAorI2lmIDAKKy8qCisgKiBUaGlzIGlzIGluIFBDSSBzaGFyZWQgbWVtIGFuZCBtdXN0IGJlIGFjY2Vzc2VkIHdpdGggcmVhZGwvd3JpdGVsCisgKiByZWFsIGxheW91dCBpczoKKyAqLworI2lmIF9fTElUVExFX0VORElBTgorCXUxNglmbGFnczsKKwl1MTYJc2l6ZTsKKwl1MTYJdmxhbjsKKwl1MTYJcmVzZXJ2ZWQ7CisjZWxzZQorCXUxNglzaXplOworCXUxNglmbGFnczsKKwl1MTYJcmVzZXJ2ZWQ7CisJdTE2CXZsYW47CisjZW5kaWYKKyNlbmRpZgorCXUzMgl2bGFucmVzOworfTsKKworCisjZGVmaW5lIFJYX1NURF9SSU5HX0VOVFJJRVMJNTEyCisjZGVmaW5lIFJYX1NURF9SSU5HX1NJWkUJKFJYX1NURF9SSU5HX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpKQorCisjZGVmaW5lIFJYX0pVTUJPX1JJTkdfRU5UUklFUwkyNTYKKyNkZWZpbmUgUlhfSlVNQk9fUklOR19TSVpFCShSWF9KVU1CT19SSU5HX0VOVFJJRVMgKnNpemVvZihzdHJ1Y3QgcnhfZGVzYykpCisKKyNkZWZpbmUgUlhfTUlOSV9SSU5HX0VOVFJJRVMJMTAyNAorI2RlZmluZSBSWF9NSU5JX1JJTkdfU0laRQkoUlhfTUlOSV9SSU5HX0VOVFJJRVMgKnNpemVvZihzdHJ1Y3QgcnhfZGVzYykpCisKKyNkZWZpbmUgUlhfUkVUVVJOX1JJTkdfRU5UUklFUwkyMDQ4CisjZGVmaW5lIFJYX1JFVFVSTl9SSU5HX1NJWkUJKFJYX01BWF9SRVRVUk5fUklOR19FTlRSSUVTICogXAorCQkJCSBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpKQorCitzdHJ1Y3QgcnhfZGVzY3sKKwlhY2VhZGRyCWFkZHI7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisJdTE2CXNpemU7CisJdTE2CWlkeDsKKyNlbHNlCisJdTE2CWlkeDsKKwl1MTYJc2l6ZTsKKyNlbmRpZgorI2lmZGVmIF9fTElUVExFX0VORElBTgorCXUxNglmbGFnczsKKwl1MTYJdHlwZTsKKyNlbHNlCisJdTE2CXR5cGU7CisJdTE2CWZsYWdzOworI2VuZGlmCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisJdTE2CXRjcF91ZHBfY3N1bTsKKwl1MTYJaXBfY3N1bTsKKyNlbHNlCisJdTE2CWlwX2NzdW07CisJdTE2CXRjcF91ZHBfY3N1bTsKKyNlbmRpZgorI2lmZGVmIF9fTElUVExFX0VORElBTgorCXUxNgl2bGFuOworCXUxNgllcnJfZmxhZ3M7CisjZWxzZQorCXUxNgllcnJfZmxhZ3M7CisJdTE2CXZsYW47CisjZW5kaWYKKwl1MzIJcmVzZXJ2ZWQ7CisJdTMyCW9wYWd1ZTsKK307CisKKworLyoKKyAqIFRoaXMgc3RydWN0IGlzIHNoYXJlZCB3aXRoIHRoZSBOSUMgZmlybXdhcmUuCisgKi8KK3N0cnVjdCByaW5nX2N0cmwgeworCWFjZWFkZHIJcm5ncHRyOworI2lmZGVmIF9fTElUVExFX0VORElBTgorCXUxNglmbGFnczsKKwl1MTYJbWF4X2xlbjsKKyNlbHNlCisJdTE2CW1heF9sZW47CisJdTE2CWZsYWdzOworI2VuZGlmCisJdTMyCXBhZDsKK307CisKKworc3RydWN0IGFjZV9tYWNfc3RhdHMgeworCXUzMiBleGNlc3NfY29sbHM7CisJdTMyIGNvbGxfMTsKKwl1MzIgY29sbF8yOworCXUzMiBjb2xsXzM7CisJdTMyIGNvbGxfNDsKKwl1MzIgY29sbF81OworCXUzMiBjb2xsXzY7CisJdTMyIGNvbGxfNzsKKwl1MzIgY29sbF84OworCXUzMiBjb2xsXzk7CisJdTMyIGNvbGxfMTA7CisJdTMyIGNvbGxfMTE7CisJdTMyIGNvbGxfMTI7CisJdTMyIGNvbGxfMTM7CisJdTMyIGNvbGxfMTQ7CisJdTMyIGNvbGxfMTU7CisJdTMyIGxhdGVfY29sbDsKKwl1MzIgZGVmZXJzOworCXUzMiBjcmNfZXJyOworCXUzMiB1bmRlcnJ1bjsKKwl1MzIgY3JzX2VycjsKKwl1MzIgcGFkWzNdOworCXUzMiBkcm9wX3VsYTsKKwl1MzIgZHJvcF9tYzsKKwl1MzIgZHJvcF9mYzsKKwl1MzIgZHJvcF9zcGFjZTsKKwl1MzIgY29sbDsKKwl1MzIga2VwdF9iYzsKKwl1MzIga2VwdF9tYzsKKwl1MzIga2VwdF91YzsKK307CisKKworc3RydWN0IGFjZV9pbmZvIHsKKwl1bmlvbiB7CisJCXUzMiBzdGF0c1syNTZdOworCX0gczsKKwlzdHJ1Y3QgcmluZ19jdHJsCWV2dF9jdHJsOworCXN0cnVjdCByaW5nX2N0cmwJY21kX2N0cmw7CisJc3RydWN0IHJpbmdfY3RybAl0eF9jdHJsOworCXN0cnVjdCByaW5nX2N0cmwJcnhfc3RkX2N0cmw7CisJc3RydWN0IHJpbmdfY3RybAlyeF9qdW1ib19jdHJsOworCXN0cnVjdCByaW5nX2N0cmwJcnhfbWluaV9jdHJsOworCXN0cnVjdCByaW5nX2N0cmwJcnhfcmV0dXJuX2N0cmw7CisJYWNlYWRkcglldnRfcHJkX3B0cjsKKwlhY2VhZGRyCXJ4X3JldF9wcmRfcHRyOworCWFjZWFkZHIJdHhfY3NtX3B0cjsKKwlhY2VhZGRyCXN0YXRzMl9wdHI7Cit9OworCisKK3N0cnVjdCByaW5nX2luZm8geworCXN0cnVjdCBza19idWZmCQkqc2tiOworCURFQ0xBUkVfUENJX1VOTUFQX0FERFIobWFwcGluZykKK307CisKKworLyoKKyAqIEZ1bm55Li4uIEFzIHNvb24gYXMgd2UgYWRkIG1hcGxlbiBvbiBhbHBoYSwgaXQgc3RhcnRzIHRvIHdvcmsKKyAqIG11Y2ggc2xvd2VyLiBIbW0uLi4gaXMgaXQgYmVjYXVzZSBzdHJ1Y3QgZG9lcyBub3QgZml0IHRvIG9uZSBjYWNoZWxpbmU/CisgKiBTbywgc3BsaXQgdHhfcmluZ19pbmZvLgorICovCitzdHJ1Y3QgdHhfcmluZ19pbmZvIHsKKwlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYjsKKwlERUNMQVJFX1BDSV9VTk1BUF9BRERSKG1hcHBpbmcpCisJREVDTEFSRV9QQ0lfVU5NQVBfTEVOKG1hcGxlbikKK307CisKKworLyoKKyAqIHN0cnVjdCBhY2Vfc2tiIGhvbGRpbmcgdGhlIHJpbmdzIG9mIHNrYidzLiBUaGlzIGlzIGFuIGF3ZnVsIGxvdCBvZgorICogcG9pbnRlcnMsIGJ1dCBJIGRvbid0IHNlZSBhbnkgb3RoZXIgc21hcnQgbW9kZSB0byBkbyB0aGlzIGluIGFuCisgKiBlZmZpY2llbnQgbWFubmVyIDstKAorICovCitzdHJ1Y3QgYWNlX3NrYgoreworCXN0cnVjdCB0eF9yaW5nX2luZm8JdHhfc2tidWZmW01BWF9UWF9SSU5HX0VOVFJJRVNdOworCXN0cnVjdCByaW5nX2luZm8Jcnhfc3RkX3NrYnVmZltSWF9TVERfUklOR19FTlRSSUVTXTsKKwlzdHJ1Y3QgcmluZ19pbmZvCXJ4X21pbmlfc2tidWZmW1JYX01JTklfUklOR19FTlRSSUVTXTsKKwlzdHJ1Y3QgcmluZ19pbmZvCXJ4X2p1bWJvX3NrYnVmZltSWF9KVU1CT19SSU5HX0VOVFJJRVNdOworfTsKKworCisvKgorICogU3RydWN0IHByaXZhdGUgZm9yIHRoZSBBY2VOSUMuCisgKgorICogRWxlbWVudHMgYXJlIGdyb3VwZWQgc28gdmFyaWFibGVzIHVzZWQgYnkgdGhlIHR4IGhhbmRsaW5nIGdvZXMKKyAqIHRvZ2V0aGVyLCBhbmQgd2lsbCBnbyBpbnRvIHRoZSBzYW1lIGNhY2hlIGxpbmVzIGV0Yy4gaW4gb3JkZXIgdG8KKyAqIGF2b2lkIGNhY2hlIGxpbmUgY29udGVudGlvbiBiZXR3ZWVuIHRoZSByeCBhbmQgdHggaGFuZGxpbmcgb24gU01QLgorICoKKyAqIEZyZXF1ZW50bHkgYWNjZXNzZWQgdmFyaWFibGVzIGFyZSBwdXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAqIHN0cnVjdCB0byBoZWxwIHRoZSBjb21waWxlciBnZW5lcmF0ZSBiZXR0ZXIvc2hvcnRlciBjb2RlLgorICovCitzdHJ1Y3QgYWNlX3ByaXZhdGUKK3sKKwlzdHJ1Y3QgYWNlX2luZm8JCSppbmZvOworCXN0cnVjdCBhY2VfcmVncwlfX2lvbWVtCSpyZWdzOwkJLyogcmVnaXN0ZXIgYmFzZSAqLworCXN0cnVjdCBhY2Vfc2tiCQkqc2tiOworCWRtYV9hZGRyX3QJCWluZm9fZG1hOwkvKiAzMi82NCBiaXQgKi8KKworCWludAkJCXZlcnNpb24sIGxpbms7CisJaW50CQkJcHJvbWlzYywgbWNhc3RfYWxsOworCisJLyoKKwkgKiBUWCBlbGVtZW50cworCSAqLworCXN0cnVjdCB0eF9kZXNjCQkqdHhfcmluZzsKKwl1MzIJCQl0eF9wcmQ7CisJdm9sYXRpbGUgdTMyCQl0eF9yZXRfY3NtOworCWludAkJCXR4X3JpbmdfZW50cmllczsKKworCS8qCisJICogUlggZWxlbWVudHMKKwkgKi8KKwl1bnNpZ25lZCBsb25nCQlzdGRfcmVmaWxsX2J1c3kKKwkJCQlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoU01QX0NBQ0hFX0JZVEVTKSkpOworCXVuc2lnbmVkIGxvbmcJCW1pbmlfcmVmaWxsX2J1c3ksIGp1bWJvX3JlZmlsbF9idXN5OworCWF0b21pY190CQljdXJfcnhfYnVmczsKKwlhdG9taWNfdAkJY3VyX21pbmlfYnVmczsKKwlhdG9taWNfdAkJY3VyX2p1bWJvX2J1ZnM7CisJdTMyCQkJcnhfc3RkX3NrYnByZCwgcnhfbWluaV9za2JwcmQsIHJ4X2p1bWJvX3NrYnByZDsKKwl1MzIJCQljdXJfcng7CisKKwlzdHJ1Y3QgcnhfZGVzYwkJKnJ4X3N0ZF9yaW5nOworCXN0cnVjdCByeF9kZXNjCQkqcnhfanVtYm9fcmluZzsKKwlzdHJ1Y3QgcnhfZGVzYwkJKnJ4X21pbmlfcmluZzsKKwlzdHJ1Y3QgcnhfZGVzYwkJKnJ4X3JldHVybl9yaW5nOworCisjaWYgQUNFTklDX0RPX1ZMQU4KKwlzdHJ1Y3Qgdmxhbl9ncm91cAkqdmxncnA7CisjZW5kaWYKKworCWludAkJCXRhc2tsZXRfcGVuZGluZywganVtYm87CisJc3RydWN0IHRhc2tsZXRfc3RydWN0CWFjZV90YXNrbGV0OworCisJc3RydWN0IGV2ZW50CQkqZXZ0X3Jpbmc7CisKKwl2b2xhdGlsZSB1MzIJCSpldnRfcHJkLCAqcnhfcmV0X3ByZCwgKnR4X2NzbTsKKworCWRtYV9hZGRyX3QJCXR4X3JpbmdfZG1hOwkvKiAzMi82NCBiaXQgKi8KKwlkbWFfYWRkcl90CQlyeF9yaW5nX2Jhc2VfZG1hOworCWRtYV9hZGRyX3QJCWV2dF9yaW5nX2RtYTsKKwlkbWFfYWRkcl90CQlldnRfcHJkX2RtYSwgcnhfcmV0X3ByZF9kbWEsIHR4X2NzbV9kbWE7CisKKwl1bnNpZ25lZCBjaGFyCQkqdHJhY2VfYnVmOworCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZQkqbmV4dDsKKwl2b2xhdGlsZSBpbnQJCWZ3X3J1bm5pbmc7CisJaW50CQkJYm9hcmRfaWR4OworCXUxNgkJCXBjaV9jb21tYW5kOworCXU4CQkJcGNpX2xhdGVuY3k7CisJY29uc3QgY2hhcgkJKm5hbWU7CisjaWZkZWYgSU5ERVhfREVCVUcKKwlzcGlubG9ja190CQlkZWJ1Z19sb2NrCisJCQkJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFNNUF9DQUNIRV9CWVRFUykpKTsKKwl1MzIJCQlsYXN0X3R4LCBsYXN0X3N0ZF9yeCwgbGFzdF9taW5pX3J4OworI2VuZGlmCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJaW50CQkJcGNpX3VzaW5nX2RhYzsKK307CisKKworI2RlZmluZSBUWF9SRVNFUlZFRAlNQVhfU0tCX0ZSQUdTCisKK3N0YXRpYyBpbmxpbmUgaW50IHR4X3NwYWNlIChzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwLCB1MzIgY3NtLCB1MzIgcHJkKQoreworCXJldHVybiAoY3NtIC0gcHJkIC0gMSkgJiAoQUNFX1RYX1JJTkdfRU5UUklFUyhhcCkgLSAxKTsKK30KKworI2RlZmluZSB0eF9mcmVlKGFwKSAJCXR4X3NwYWNlKChhcCktPnR4X3JldF9jc20sIChhcCktPnR4X3ByZCwgYXApCisjZGVmaW5lIHR4X3JpbmdfZnVsbChhcCwgY3NtLCBwcmQpCSh0eF9zcGFjZShhcCwgY3NtLCBwcmQpIDw9IFRYX1JFU0VSVkVEKQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2FjZWFkZHIoYWNlYWRkciAqYWEsIGRtYV9hZGRyX3QgYWRkcikKK3sKKwl1NjQgYmFkZHIgPSAodTY0KSBhZGRyOworCWFhLT5hZGRybG8gPSBiYWRkciAmIDB4ZmZmZmZmZmY7CisJYWEtPmFkZHJoaSA9IGJhZGRyID4+IDMyOworCXdtYigpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY2Vfc2V0X3R4cHJkKHN0cnVjdCBhY2VfcmVncyBfX2lvbWVtICpyZWdzLAorCQkJCSBzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwLCB1MzIgdmFsdWUpCit7CisjaWZkZWYgSU5ERVhfREVCVUcKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZhcC0+ZGVidWdfbG9jaywgZmxhZ3MpOworCXdyaXRlbCh2YWx1ZSwgJnJlZ3MtPlR4UHJkKTsKKwlpZiAodmFsdWUgPT0gYXAtPmxhc3RfdHgpCisJCXByaW50ayhLRVJOX0VSUiAiQWNlTklDIFJBQ0UgQUxFUlQhIHdyaXRpbmcgaWRlbnRpY2FsIHZhbHVlICIKKwkJICAgICAgICJ0byB0eCBwcm9kdWNlciAoJWkpXG4iLCB2YWx1ZSk7CisJYXAtPmxhc3RfdHggPSB2YWx1ZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcC0+ZGVidWdfbG9jaywgZmxhZ3MpOworI2Vsc2UKKwl3cml0ZWwodmFsdWUsICZyZWdzLT5UeFByZCk7CisjZW5kaWYKKwl3bWIoKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgYWNlX21hc2tfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFjZV9wcml2YXRlICphcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MgPSBhcC0+cmVnczsKKworCWlmIChBQ0VfSVNfVElHT05fSShhcCkpCisJCXdyaXRlbCgxLCAmcmVncy0+TWFza0ludCk7CisJZWxzZQorCQl3cml0ZWwocmVhZGwoJnJlZ3MtPkhvc3RDdHJsKSB8IE1BU0tfSU5UUywgJnJlZ3MtPkhvc3RDdHJsKTsKKworCWFjZV9zeW5jX2lycShkZXYtPmlycSk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGFjZV91bm1hc2tfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFjZV9wcml2YXRlICphcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFjZV9yZWdzIF9faW9tZW0gKnJlZ3MgPSBhcC0+cmVnczsKKyAKKwlpZiAoQUNFX0lTX1RJR09OX0koYXApKQorCQl3cml0ZWwoMCwgJnJlZ3MtPk1hc2tJbnQpOworCWVsc2UKKwkJd3JpdGVsKHJlYWRsKCZyZWdzLT5Ib3N0Q3RybCkgJiB+TUFTS19JTlRTLCAmcmVncy0+SG9zdEN0cmwpOworfQorCisKKy8qCisgKiBQcm90b3R5cGVzCisgKi8KK3N0YXRpYyBpbnQgYWNlX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBhY2VfbG9hZF9zdGRfcnhfcmluZyhzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwLCBpbnQgbnJfYnVmcyk7CitzdGF0aWMgdm9pZCBhY2VfbG9hZF9taW5pX3J4X3Jpbmcoc3RydWN0IGFjZV9wcml2YXRlICphcCwgaW50IG5yX2J1ZnMpOworc3RhdGljIHZvaWQgYWNlX2xvYWRfanVtYm9fcnhfcmluZyhzdHJ1Y3QgYWNlX3ByaXZhdGUgKmFwLCBpbnQgbnJfYnVmcyk7CitzdGF0aWMgaXJxcmV0dXJuX3QgYWNlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgYWNlX2xvYWRfZmlybXdhcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGFjZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBhY2Vfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYWNlX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYWNlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkZXYpOworc3RhdGljIHZvaWQgYWNlX2R1bXBfdHJhY2Uoc3RydWN0IGFjZV9wcml2YXRlICphcCk7CitzdGF0aWMgdm9pZCBhY2Vfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBhY2VfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSk7CitzdGF0aWMgaW50IGFjZV9zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCk7CitzdGF0aWMgdm9pZCBhY2Vfc2V0X3J4dHhfcGFybXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGp1bWJvKTsKK3N0YXRpYyBpbnQgYWNlX2FsbG9jYXRlX2Rlc2NyaXB0b3JzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYWNlX2ZyZWVfZGVzY3JpcHRvcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBhY2VfaW5pdF9jbGVhbnVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphY2VfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCByZWFkX2VlcHJvbV9ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKKyNpZiBBQ0VOSUNfRE9fVkxBTgorc3RhdGljIHZvaWQgYWNlX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCk7CitzdGF0aWMgdm9pZCBhY2Vfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpOworI2VuZGlmCisKKyNlbmRpZiAvKiBfQUNFTklDX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hY2VuaWNfZmlybXdhcmUuaCBiL2RyaXZlcnMvbmV0L2FjZW5pY19maXJtd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNjI1ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hY2VuaWNfZmlybXdhcmUuaApAQCAtMCwwICsxLDk0NTcgQEAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKy8qCisgKiBEZWNsYXJlIHRoZXNlIGhlcmUgZXZlbiBpZiBUaWdvbiBJIHN1cHBvcnQgaXMgZGlzYWJsZWQgdG8gYXZvaWQKKyAqIHRoZSBjb21waWxlciBjb21wbGFpbmluZyBhYm91dCB1bmRlZmluZWQgc3ltYm9scy4KKyAqLworI2RlZmluZSB0aWdvbkZ3UmVsZWFzZU1ham9yIDB4YworI2RlZmluZSB0aWdvbkZ3UmVsZWFzZU1pbm9yIDB4NAorI2RlZmluZSB0aWdvbkZ3UmVsZWFzZUZpeCAweGIKKyNkZWZpbmUgdGlnb25Gd1N0YXJ0QWRkciAweDAwMDA0MDAwCisjZGVmaW5lIHRpZ29uRndUZXh0QWRkciAweDAwMDA0MDAwCisjZGVmaW5lIHRpZ29uRndUZXh0TGVuIDB4MTExNDAKKyNkZWZpbmUgdGlnb25Gd1JvZGF0YUFkZHIgMHgwMDAxNTE0MAorI2RlZmluZSB0aWdvbkZ3Um9kYXRhTGVuIDB4YWMwCisjZGVmaW5lIHRpZ29uRndEYXRhQWRkciAweDAwMDE1YzIwCisjZGVmaW5lIHRpZ29uRndEYXRhTGVuIDB4MTcwCisjZGVmaW5lIHRpZ29uRndTYnNzQWRkciAweDAwMDE1ZDkwCisjZGVmaW5lIHRpZ29uRndTYnNzTGVuIDB4MzgKKyNkZWZpbmUgdGlnb25Gd0Jzc0FkZHIgMHgwMDAxNWRkMAorI2RlZmluZSB0aWdvbkZ3QnNzTGVuIDB4MjA4MAorI2lmZGVmIENPTkZJR19BQ0VOSUNfT01JVF9USUdPTl9JCisjZGVmaW5lIHRpZ29uRndUZXh0IE5VTEwKKyNkZWZpbmUgdGlnb25Gd0RhdGEgTlVMTAorI2RlZmluZSB0aWdvbkZ3Um9kYXRhIE5VTEwKKyNlbHNlCisvKiBHZW5lcmF0ZWQgYnkgZ2VuZncuYyAqLworc3RhdGljIHUzMiB0aWdvbkZ3VGV4dFsoTUFYX1RFWFRfTEVOLzQpICsgMV0gX19kZXZpbml0ZGF0YSA9IHsKKzB4MTAwMDAwMDMsIAorMHgwLCAweGQsIDB4ZCwgMHgzYzFkMDAwMSwgCisweDhmYmQ1YzU0LCAweDNhMGYwMjEsIDB4M2MxMDAwMDAsIDB4MjYxMDQwMDAsIAorMHhjMDAxMDBjLCAweDAsIDB4ZCwgMHgyN2JkZmZkOCwgCisweDNjMWNjMDAwLCAweDNjMWIwMDEzLCAweDM3N2JkODAwLCAweGQwMjEsIAorMHgzYzE3MDAxMywgMHgzNmY3NTQxOCwgMHgyZTAyMDIxLCAweDM0MDU4M2U4LCAKKzB4YWZiZjAwMjQsIDB4YzAwMjQ4OCwgMHhhZmIwMDAyMCwgMHhjMDAyM2U4LCAKKzB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTFhNCwgMHgyNDA1MDAwMSwgCisweDJlMDMwMjEsIDB4MzgyMSwgMHgzYzEwMDAwMSwgMHgyNjEwN2U1MCwgCisweGFmYjAwMDEwLCAweGMwMDI0MDMsIDB4YWZiYjAwMTQsIDB4M2MwMjAwMGYsIAorMHgzNDQyZmZmZiwgMHgyMDIxMDI0LCAweDM2MjEwMmIsIDB4MTA0MDAwMDksIAorMHgyNDA1MDAwMywgMHgzYzA0MDAwMSwgMHgyNDg0NTFiMCwgMHgyMDAzMDIxLCAKKzB4MzYwMzgyMSwgMHgzYzAyMDAxMCwgMHhhZmEyMDAxMCwgMHhjMDAyNDAzLCAKKzB4YWZhMDAwMTQsIDB4MjAyMSwgMHgzNDA1YzAwMCwgMHgzYzAxMDAwMSwgCisweDM3MDgyMSwgMHhhMDIwODNiMCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHhhMDIwODNiMiwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDgzYjMsIAorMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMDgzYjQsIDB4YTJlMDA0ZDgsIAorMHg0MThjMCwgMHgyNDg0MDAwMSwgMHg3NzEwMjEsIDB4YWM0MDcyN2MsIAorMHg3NzEwMjEsIDB4YWM0MDcyODAsIDB4MmUzMTAyMSwgMHhhNDQ1NzI3YywgCisweDJjODIwMDIwLCAweDE0NDBmZmY3LCAweDQxOGMwLCAweDIwMjEsIAorMHgzNDA1YzAwMCwgMHg0MThjMCwgMHgyNDg0MDAwMSwgMHg3NzEwMjEsIAorMHhhYzQwNzM3YywgMHg3NzEwMjEsIDB4YWM0MDczODAsIDB4MmUzMTAyMSwgCisweGE0NDU3MzdjLCAweDJjODIwMDgwLCAweDU0NDBmZmY3LCAweDQxOGMwLCAKKzB4YWY4MDAwNTQsIDB4YWY4MDAxMWMsIDB4OGY4MjAwNDQsIDB4MzQ0MjAwNDAsIAorMHhhZjgyMDA0NCwgMHg4ZjgyMDA0NCwgMHgzNDQyMDAyMCwgMHhhZjgyMDA0NCwgCisweDhmNDIwMjE4LCAweDMwNDIwMDAyLCAweDEwNDAwMDA5LCAweDAsIAorMHg4ZjQyMDIyMCwgMHgzYzAzMDAwMiwgMHgzNDYzMDAwNCwgMHg0MzEwMjUsIAorMHhhZWUyMDRjNCwgMHg4ZjQyMDIxYywgMHg4MDAxMDc0LCAweDM0NDIwMDA0LCAKKzB4OGY0MjAyMjAsIDB4M2MwMzAwMDIsIDB4MzQ2MzAwMDYsIDB4NDMxMDI1LCAKKzB4YWVlMjA0YzQsIDB4OGY0MjAyMWMsIDB4MzQ0MjAwMDYsIDB4YWVlMjA0Y2MsIAorMHg4ZjQyMDIxOCwgMHgzMDQyMDAxMCwgMHgxMDQwMDAwYSwgMHgwLCAKKzB4OGY0MjAyMWMsIDB4MzQ0MjAwMDQsIDB4YWVlMjA0YzgsIDB4OGY0MjAyMjAsIAorMHgzYzAzMDAwYSwgMHgzNDYzMDAwNCwgMHg0MzEwMjUsIDB4ODAwMTA4YSwgCisweGFlZTIwNGMwLCAweDhmNDIwMjIwLCAweDNjMDMwMDBhLCAweDM0NjMwMDA2LCAKKzB4NDMxMDI1LCAweGFlZTIwNGMwLCAweDhmNDIwMjFjLCAweDM0NDIwMDA2LCAKKzB4YWVlMjA0YzgsIDB4OGY0MjAyMTgsIDB4MzA0MjAyMDAsIDB4MTA0MDAwMDMsIAorMHgyNDAyMDAwMSwgMHg4MDAxMDkxLCAweGEyZTI3MjQ4LCAweGEyZTA3MjQ4LCAKKzB4MjQwMjAwMDEsIDB4YWY4MjAwYTAsIDB4YWY4MjAwYjAsIDB4OGY4MzAwNTQsIAorMHg4ZjgyMDA1NCwgMHg4MDAxMDk5LCAweDI0NjMwMDY0LCAweDhmODIwMDU0LCAKKzB4NjIxMDIzLCAweDJjNDIwMDY1LCAweDE0NDBmZmZjLCAweDAsIAorMHhhZjgwMDA0NCwgMHg4ZjQyMDIwOCwgMHg4ZjQzMDIwYywgMHhhZWUyMDAxMCwgCisweGFlZTMwMDE0LCAweDhlZTQwMDEwLCAweDhlZTUwMDE0LCAweDI2ZTIwMDMwLCAKKzB4YWVlMjAwMjgsIDB4MjQwMjA0OTAsIDB4YWVlMjAwMTgsIDB4YWY4NDAwOTAsIAorMHhhZjg1MDA5NCwgMHg4ZWUyMDAyOCwgMHhhZjgyMDBiNCwgMHg5NmUyMDAxYSwgCisweGFmODIwMDljLCAweDhmODIwMGIwLCAweDhlZTMwNGNjLCAweDQzMTAyNSwgCisweGFmODIwMGIwLCAweDhmODIwMGIwLCAweDMwNDIwMDA0LCAweDE0NDBmZmZkLCAKKzB4MCwgMHg4ZWUyMDQ1MCwgMHg4ZWUzMDQ1NCwgMHhhZWUzMDRmYywgCisweDhlZTIwNGZjLCAweDI0NDJlMDAwLCAweDJjNDIyMDAxLCAweDE0NDAwMDBkLCAKKzB4MjZlNDAwMzAsIDB4OGVlMjA0NTAsIDB4OGVlMzA0NTQsIDB4M2MwNDAwMDEsIAorMHgyNDg0NTFiYywgMHgzYzA1MDAwMSwgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgCisweDhlZTcwNGZjLCAweDM0YTVmMDAwLCAweGMwMDI0MDMsIDB4NjAzMDIxLCAKKzB4MjZlNDAwMzAsIDB4YzAwMjQ4OCwgMHgyNDA1MDQwMCwgMHgyNzQ0MDA4MCwgCisweGMwMDI0ODgsIDB4MjQwNTAwODAsIDB4MjZlNDc3N2MsIDB4YzAwMjQ4OCwgCisweDI0MDUwNDAwLCAweDhmNDIwMjVjLCAweDI2ZTQwMDk0LCAweGFlZTIwMDYwLCAKKzB4OGY0MjAyNjAsIDB4Mjc0NTAyMDAsIDB4MjQwNjAwMDgsIDB4YWVlMjAwNjgsIAorMHgyNDAyMDAwNiwgMHhjMDAyNDlhLCAweGFlZTIwMDY0LCAweDNjMDIzYjlhLCAKKzB4MzQ0MmNhMDAsIDB4MjAyMSwgMHgyNDAzMDAwMiwgMHhhZWUzMDA3NCwgCisweGFlZTMwMDcwLCAweGFlZTIwMDZjLCAweDI0MDIwM2U4LCAweGFlZTIwMTA0LCAKKzB4MjQwMjAwMDEsIDB4YWVlMzAxMDAsIDB4YWVlMjAxMGMsIDB4M2MwMzAwMDEsIAorMHg2NDE4MjEsIDB4OTA2MzVjMjAsIDB4MmU0MTAyMSwgMHgyNDg0MDAwMSwgCisweGEwNDMwMDljLCAweDJjODIwMDBmLCAweDE0NDBmZmY4LCAweDAsIAorMHg4ZjgyMDA0MCwgMHgyZTQxODIxLCAweDI0ODQwMDAxLCAweDIxNzAyLCAKKzB4MjQ0MjAwMzAsIDB4YTA2MjAwOWMsIDB4MmU0MTAyMSwgMHhhMDQwMDA5YywgCisweDk2ZTIwNDZhLCAweDMwNDIwMDAzLCAweDE0NDAwMDA5LCAweDAsIAorMHg5NmUyMDQ3YSwgMHgzMDQyMDAwMywgMHg1MDQwMDEzMSwgMHgzYzAzMDgwMCwgCisweDk2ZTIwNDZhLCAweDMwNDIwMDAzLCAweDEwNDAwMDJhLCAweDNjMDIwNzAwLCAKKzB4OTZlMjA0N2EsIDB4MzA0MjAwMDMsIDB4MTA0MDAwMjYsIDB4M2MwMjA3MDAsIAorMHg5NmUzMDQ3YSwgMHg5NmUyMDQ2YSwgMHgxNDYyMDAyMiwgMHgzYzAyMDcwMCwgCisweDhlZTIwNGMwLCAweDI0MDMwMDAxLCAweGEyZTM0ZTIwLCAweDM0NDIwZTAwLCAKKzB4YWVlMjA0YzAsIDB4OGY0MjAyMTgsIDB4MzA0MjAxMDAsIDB4MTA0MDAwMDUsIAorMHgwLCAweDNjMDIwMDAxLCAweDI0NDJlMTY4LCAweDgwMDExMWQsIAorMHgyMTEwMCwgMHgzYzAyMDAwMSwgMHgyNDQyZDM1YywgMHgyMTEwMCwgCisweDIxMTgyLCAweDNjMDMwODAwLCAweDQzMTAyNSwgMHgzYzAxMDAwMSwgCisweGFjMjIxMjM4LCAweDNjMDIwMDAxLCAweDI0NDJmNjgwLCAweDIxMTAwLCAKKzB4MjExODIsIDB4M2MwMzA4MDAsIDB4NDMxMDI1LCAweDNjMDEwMDAxLCAKKzB4YWMyMjEyNzgsIDB4OGVlMjAwMDAsIDB4MzQ0MjQwMDAsIDB4ODAwMTIzOCwgCisweGFlZTIwMDAwLCAweDM0NDIzMDAwLCAweGFmYTIwMDE4LCAweDhlZTIwNjA4LCAKKzB4OGY0MzAyMjgsIDB4MjQ0MjAwMDEsIDB4MzA0OTAwZmYsIDB4NTEyMzAwZTIsIAorMHhhZmEwMDAxMCwgMHg4ZWUyMDYwOCwgMHgyMTBjMCwgMHg1NzEwMjEsIAorMHg4ZmEzMDAxOCwgMHg4ZmE0MDAxYywgMHhhYzQzMDYwYywgMHhhYzQ0MDYxMCwgCisweDhmODcwMTIwLCAweDI3NjIzODAwLCAweDI0ZTgwMDIwLCAweDEwMjEwMmIsIAorMHg1MDQwMDAwMSwgMHgyNzY4MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMTAyMDAwNCwgCisweDAsIDB4OGY4MjAxMjQsIDB4MTUwMjAwMDcsIDB4MTAyMSwgCisweDhlZTIwMWE0LCAweDMwMjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIAorMHg4MDAxMWEwLCAweDhlZTIwMWE0LCAweDhlZTQwNjA4LCAweDQyMGMwLCAKKzB4ODAxODIxLCAweDhlZTQwNDMwLCAweDhlZTUwNDM0LCAweGEzMjgyMSwgCisweGEzMzAyYiwgMHg4MjIwMjEsIDB4ODYyMDIxLCAweGFjZTQwMDAwLCAKKzB4YWNlNTAwMDQsIDB4OGVlMzA2MDgsIDB4MjQwMjAwMDgsIDB4YTRlMjAwMGUsIAorMHgyNDAyMDAwZCwgMHhhY2UyMDAxOCwgMHhhY2U5MDAxYywgMHgzMThjMCwgCisweDI0NjMwNjBjLCAweDJlMzEwMjEsIDB4YWNlMjAwMDgsIDB4OGVlMjA0YzQsIAorMHhhY2UyMDAxMCwgMHhhZjg4MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgCisweDI0MDYwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAKKzB4MmUyMjAyMSwgMHg4YzgzMDAwMCwgMHgyNDAyMDAwNywgMHgxNDYyMDAxZiwgCisweDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIAorMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgCisweDhlZTI0ZTM0LCAweDhlZTU0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAKKzB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgCisweDAsIDB4ODAwMTE4YSwgMHgwLCAweDE0YTAwMDA1LCAKKzB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgCisweDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLCAKKzB4YWM4MDAwMDAsIDB4ODAwMTFhMCwgMHgwLCAweDhlZTI0ZTMwLCAKKzB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgCisweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAKKzB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAwNywgCisweGFjODIwMDAwLCAweDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDU0YzAwMDBjLCAKKzB4YWVlOTA2MDgsIDB4M2MwNDAwMDEsIDB4MjQ4NDUxYzgsIDB4YWZhMDAwMTAsIAorMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgCisweGMwMDI0MDMsIDB4MzRhNWYwMDAsIDB4ODAwMTIyMywgMHgwLCAKKzB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAKKzB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIAorMHgwLCAweDhmODIwMTI0LCAweDE0YzIwMDA3LCAweDAsIAorMHg4ZWUyMDFhNCwgMHgzMDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAKKzB4ODAwMTIwNywgMHg4ZWUyMDFhNCwgMHg4ZWUyMDYwOCwgMHhhYzYyMDAxYywgCisweDhlZTQwNGEwLCAweDhlZTUwNGE0LCAweDI0NjIwMDFjLCAweGFjNjIwMDA4LCAKKzB4MjQwMjAwMDgsIDB4YTQ2MjAwMGUsIDB4MjQwMjAwMTEsIDB4YWM2MjAwMTgsIAorMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwgCisweGFmODYwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDM3LCAweDI0MDYwMDAxLCAKKzB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgCisweDhjODMwMDAwLCAweDI0MDIwMDEyLCAweDE0NjIwMDFmLCAweDAsIAorMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgCisweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAKKzB4OGVlNTRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIDB4MCwgCisweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsIAorMHg4MDAxMWYxLCAweDAsIDB4MTRhMDAwMDUsIDB4MCwgCisweDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAKKzB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIAorMHg4MDAxMjA3LCAweDAsIDB4OGVlMjRlMzAsIDB4MjQwMzAwNDAsIAorMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIAorMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDEyLCAweGFjODIwMDAwLCAKKzB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4MTRjMDAwMWIsIDB4MCwgCisweDNjMDQwMDAxLCAweDI0ODQ1MWQwLCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAKKzB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgCisweDM0YTVmMDAxLCAweDhlZTIwMWIwLCAweDI0NDIwMDAxLCAweGFlZTIwMWIwLCAKKzB4ODAwMTIyMywgMHg4ZWUyMDFiMCwgMHgzYzA0MDAwMSwgMHgyNDg0NTFkYywgCisweGFmYTAwMDE0LCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LCAweDNjMDUwMDA5LCAKKzB4YzAwMjQwMywgMHgzNGE1ZjAwNSwgMHg4ZWUyMDFhYywgMHgyNDQyMDAwMSwgCisweGFlZTIwMWFjLCAweDhlZTIwMWFjLCAweDhlZTIwMTYwLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDUxZTgsIDB4MzQwNWYwMDEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxNjAsIAorMHg4ZWUyMDE2MCwgMHgzMDIxLCAweDM4MjEsIDB4YWZhMDAwMTAsIAorMHhjMDAyNDAzLCAweGFmYTAwMDE0LCAweDgwMDEyMzgsIDB4MCwgCisweDNjMDIwMDAxLCAweDI0NDJmNWE4LCAweDIxMTAwLCAweDIxMTgyLCAKKzB4NDMxMDI1LCAweDNjMDEwMDAxLCAweGFjMjIxMjc4LCAweDk2ZTIwNDVhLCAKKzB4MzA0MjAwMDMsIDB4MTA0MDAwMjUsIDB4M2MwNTBmZmYsIDB4OGVlMjA0YzgsIAorMHgzNGE1ZmZmZiwgMHgzNDQyMGEwMCwgMHhhZWUyMDRjOCwgMHg4ZWUzMDRjOCwgCisweDNjMDQwMDAxLCAweDI0ODQ1MWY0LCAweDI0MDIwMDAxLCAweGEyZTIwNGVjLCAKKzB4YTJlMjA0ZWQsIDB4M2MwMjAwMDIsIDB4NjIxODI1LCAweDNjMDIwMDAxLCAKKzB4MjQ0MmEzOTAsIDB4NDUxMDI0LCAweDIxMDgyLCAweGFlZTMwNGM4LCAKKzB4M2MwMzA4MDAsIDB4NDMxMDI1LCAweDNjMDEwMDAxLCAweGFjMjIxMjIwLCAKKzB4M2MwMjAwMDEsIDB4MjQ0MmFkZDQsIDB4NDUxMDI0LCAweDIxMDgyLCAKKzB4NDMxMDI1LCAweDNjMDEwMDAxLCAweGFjMjIxMjgwLCAweDk2ZTYwNDVhLCAKKzB4MzgyMSwgMHgyNDA1MDAxMSwgMHhhZmEwMDAxMCwgMHhjMDAyNDAzLCAKKzB4YWZhMDAwMTQsIDB4ODAwMTI2OCwgMHgwLCAweDNjMDIwMDAxLCAKKzB4MjQ0MmE5ZDQsIDB4MjExMDAsIDB4MjExODIsIDB4M2MwMzA4MDAsIAorMHg0MzEwMjUsIDB4M2MwMTAwMDEsIDB4YWMyMjEyODAsIDB4OTZlMjA0NmEsIAorMHgzMDQyMDAxMCwgMHgxNDQwMDAwOSwgMHgwLCAweDk2ZTIwNDdhLCAKKzB4MzA0MjAwMTAsIDB4MTA0MDAxMTIsIDB4MCwgMHg5NmUyMDQ2YSwgCisweDMwNDIwMDEwLCAweDEwNDAwMDA1LCAweDNjMDIwNzAwLCAweDk2ZTIwNDdhLCAKKzB4MzA0MjAwMTAsIDB4MTQ0MDAxMDIsIDB4M2MwMjA3MDAsIDB4MzQ0MjMwMDAsIAorMHhhZmEyMDAxOCwgMHg4ZWUyMDYwOCwgMHg4ZjQzMDIyOCwgMHgyNDQyMDAwMSwgCisweDMwNDkwMGZmLCAweDUxMjMwMGUyLCAweGFmYTAwMDEwLCAweDhlZTIwNjA4LCAKKzB4MjEwYzAsIDB4NTcxMDIxLCAweDhmYTMwMDE4LCAweDhmYTQwMDFjLCAKKzB4YWM0MzA2MGMsIDB4YWM0NDA2MTAsIDB4OGY4NzAxMjAsIDB4Mjc2MjM4MDAsIAorMHgyNGU4MDAyMCwgMHgxMDIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjgzMDAwLCAKKzB4OGY4MjAxMjgsIDB4MTEwMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwgCisweDE1MDIwMDA3LCAweDEwMjEsIDB4OGVlMjAxYTQsIDB4MzAyMSwgCisweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDEyZWEsIDB4OGVlMjAxYTQsIAorMHg4ZWU0MDYwOCwgMHg0MjBjMCwgMHg4MDE4MjEsIDB4OGVlNDA0MzAsIAorMHg4ZWU1MDQzNCwgMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwgCisweDg2MjAyMSwgMHhhY2U0MDAwMCwgMHhhY2U1MDAwNCwgMHg4ZWUzMDYwOCwgCisweDI0MDIwMDA4LCAweGE0ZTIwMDBlLCAweDI0MDIwMDBkLCAweGFjZTIwMDE4LCAKKzB4YWNlOTAwMWMsIDB4MzE4YzAsIDB4MjQ2MzA2MGMsIDB4MmUzMTAyMSwgCisweGFjZTIwMDA4LCAweDhlZTIwNGM0LCAweGFjZTIwMDEwLCAweGFmODgwMTIwLCAKKzB4OTJlMjRlMjAsIDB4MTQ0MDAwMzcsIDB4MjQwNjAwMDEsIDB4OGVlMjRlMzAsIAorMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLCAKKzB4MjQwMjAwMDcsIDB4MTQ2MjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwgCisweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LCAKKzB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlNTRlMzAsIAorMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTM0LCAKKzB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwgMHg4MDAxMmQ0LCAKKzB4MCwgMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTI4LCAKKzB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIAorMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAxMmVhLCAKKzB4MCwgMHg4ZWUyNGUzMCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgCisweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIAorMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgCisweDJlMjIwMjEsIDB4MjQwMjAwMDcsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIAorMHhhYzgyMDAwNCwgMHg1NGMwMDAwYywgMHhhZWU5MDYwOCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1MWM4LCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhlZTYwNjA4LCAKKzB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAwMCwgCisweDgwMDEzNmQsIDB4MCwgMHg4ZjgzMDEyMCwgMHgyNzYyMzgwMCwgCisweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY2MzAwMCwgCisweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsIDB4OGY4MjAxMjQsIAorMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LCAweDMwMjEsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxMzUxLCAweDhlZTIwMWE0LCAKKzB4OGVlMjA2MDgsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YTAsIDB4OGVlNTA0YTQsIAorMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHgyNDAyMDAwOCwgMHhhNDYyMDAwZSwgCisweDI0MDIwMDExLCAweGFjNjIwMDE4LCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LCAKKzB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIAorMHgxNDQwMDAzNywgMHgyNDA2MDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIDB4MjQwMjAwMTIsIAorMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAKKzB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIAorMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwgMHgyNDQyMDAwMSwgCisweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIAorMHgxMGEyMDAwNSwgMHgwLCAweDgwMDEzM2IsIDB4MCwgCisweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIAorMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgCisweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDEzNTEsIDB4MCwgCisweDhlZTI0ZTMwLCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLCAKKzB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgCisweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIAorMHgyNDAyMDAxMiwgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgCisweDE0YzAwMDFiLCAweDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUxZDAsIAorMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgCisweDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMDEsIDB4OGVlMjAxYjAsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFiMCwgMHg4MDAxMzZkLCAweDhlZTIwMWIwLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDUxZGMsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsIAorMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDA1LCAKKzB4OGVlMjAxYWMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYWMsIDB4OGVlMjAxYWMsIAorMHg4ZWUyMDE2MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTFlOCwgMHgzNDA1ZjAwMiwgCisweDI0NDIwMDAxLCAweGFlZTIwMTYwLCAweDhlZTIwMTYwLCAweDMwMjEsIAorMHgzODIxLCAweGFmYTAwMDEwLCAweGMwMDI0MDMsIDB4YWZhMDAwMTQsIAorMHg5NmU2MDQ3YSwgMHg5NmU3MDQ2YSwgMHgzYzA0MDAwMSwgMHgyNDg0NTIwMCwgCisweDI0MDUwMDEyLCAweGFmYTAwMDEwLCAweGMwMDI0MDMsIDB4YWZhMDAwMTQsIAorMHhjMDA0NTAwLCAweDAsIDB4YzAwMjMxOCwgMHgwLCAKKzB4M2MwNjAwMDEsIDB4MzRjNjM4MDAsIDB4YWVlMDA2MDgsIDB4YWY0MDAyMjgsIAorMHhhZjQwMDIyYywgMHg5NmUzMDQ1OCwgMHg4ZWU0MDAwMCwgMHgzYzA1MTJkOCwgCisweDM0YTVjMzU4LCAweDI3NjIzODAwLCAweGFlZTI3MjU4LCAweDI3NjIzODAwLCAKKzB4YWVlMjcyNjAsIDB4Mjc2MjM4MDAsIDB4YWVlMjcyNjQsIDB4MzY2MTAyMSwgCisweGFlZTI3MjcwLCAweDI0MDJmZmZmLCAweGFlZTAwNGQ0LCAweGFlZTAwNGUwLCAKKzB4YWVlMDA0ZTQsIDB4YWVlMDA0ZjAsIDB4YTJlMDA0ZjQsIDB4YWVlMDBlMGMsIAorMHhhZWUwMGUxOCwgMHhhZWUwMGUxMCwgMHhhZWUwMGUxNCwgMHhhZWUwMGUxYywgCisweGFlZTA3MjRjLCAweGFlZTA1MjQ0LCAweGFlZTA1MjQwLCAweGFlZTA1MjNjLCAKKzB4YWVlMDcyNTAsIDB4YWVlMDcyNTQsIDB4YWVlMDcyNWMsIDB4YWVlMDcyNjgsIAorMHhhZWUwMDRkMCwgMHgyNDYzZmZmZiwgMHg4NTIwMjUsIDB4YWVlMzA0ZjgsIAorMHhhZWU0MDAwMCwgMHhhZjgwMDA2MCwgMHhhZjgyMDA2NCwgMHgzYzAyMDEwMCwgCisweGFmYTIwMDE4LCAweDhlZTIwNjA4LCAweDhmNDMwMjI4LCAweDI0NDIwMDAxLCAKKzB4MzA0OTAwZmYsIDB4NTEyMzAwZTIsIDB4YWZhMDAwMTAsIDB4OGVlMjA2MDgsIAorMHgyMTBjMCwgMHg1NzEwMjEsIDB4OGZhMzAwMTgsIDB4OGZhNDAwMWMsIAorMHhhYzQzMDYwYywgMHhhYzQ0MDYxMCwgMHg4Zjg3MDEyMCwgMHgyNzYyMzgwMCwgCisweDI0ZTgwMDIwLCAweDEwMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2ODMwMDAsIAorMHg4ZjgyMDEyOCwgMHgxMTAyMDAwNCwgMHgwLCAweDhmODIwMTI0LCAKKzB4MTUwMjAwMDcsIDB4MTAyMSwgMHg4ZWUyMDFhNCwgMHgzMDIxLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMTQyMiwgMHg4ZWUyMDFhNCwgCisweDhlZTQwNjA4LCAweDQyMGMwLCAweDgwMTgyMSwgMHg4ZWU0MDQzMCwgCisweDhlZTUwNDM0LCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAKKzB4ODYyMDIxLCAweGFjZTQwMDAwLCAweGFjZTUwMDA0LCAweDhlZTMwNjA4LCAKKzB4MjQwMjAwMDgsIDB4YTRlMjAwMGUsIDB4MjQwMjAwMGQsIDB4YWNlMjAwMTgsIAorMHhhY2U5MDAxYywgMHgzMThjMCwgMHgyNDYzMDYwYywgMHgyZTMxMDIxLCAKKzB4YWNlMjAwMDgsIDB4OGVlMjA0YzQsIDB4YWNlMjAwMTAsIDB4YWY4ODAxMjAsIAorMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgMHgyNDA2MDAwMSwgMHg4ZWUyNGUzMCwgCisweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIAorMHgyNDAyMDAwNywgMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAKKzB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIAorMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwgCisweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMzQsIAorMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLCAweDgwMDE0MGMsIAorMHgwLCAweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIAorMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgCisweDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDE0MjIsIAorMHgwLCAweDhlZTI0ZTMwLCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAKKzB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgCisweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAKKzB4MmUyMjAyMSwgMHgyNDAyMDAwNywgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgCisweGFjODIwMDA0LCAweDU0YzAwMDBjLCAweGFlZTkwNjA4LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDUxYzgsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsIAorMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDAwLCAKKzB4ODAwMTRhNSwgMHgwLCAweDhmODMwMTIwLCAweDI3NjIzODAwLCAKKzB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjYzMDAwLCAKKzB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwgCisweDE0YzIwMDA3LCAweDAsIDB4OGVlMjAxYTQsIDB4MzAyMSwgCisweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDE0ODksIDB4OGVlMjAxYTQsIAorMHg4ZWUyMDYwOCwgMHhhYzYyMDAxYywgMHg4ZWU0MDRhMCwgMHg4ZWU1MDRhNCwgCisweDI0NjIwMDFjLCAweGFjNjIwMDA4LCAweDI0MDIwMDA4LCAweGE0NjIwMDBlLCAKKzB4MjQwMjAwMTEsIDB4YWM2MjAwMTgsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIAorMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwgCisweDE0NDAwMDM3LCAweDI0MDYwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAKKzB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgzMDAwMCwgMHgyNDAyMDAxMiwgCisweDE0NjIwMDFmLCAweDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIAorMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgCisweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTU0ZTMwLCAweDI0NDIwMDAxLCAKKzB4MTA0MzAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgCisweDEwYTIwMDA1LCAweDAsIDB4ODAwMTQ3MywgMHgwLCAKKzB4MTRhMDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgCisweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAKKzB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIDB4ODAwMTQ4OSwgMHgwLCAKKzB4OGVlMjRlMzAsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIAorMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAKKzB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgCisweDI0MDIwMDEyLCAweGFjODIwMDAwLCAweDI0MDIwMDAxLCAweGFjODIwMDA0LCAKKzB4MTRjMDAwMWIsIDB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTFkMCwgCisweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LCAKKzB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAwMSwgMHg4ZWUyMDFiMCwgCisweDI0NDIwMDAxLCAweGFlZTIwMWIwLCAweDgwMDE0YTUsIDB4OGVlMjAxYjAsIAorMHgzYzA0MDAwMSwgMHgyNDg0NTFkYywgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgCisweDhmNDcwMjI4LCAweDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMDUsIAorMHg4ZWUyMDFhYywgMHgyNDQyMDAwMSwgMHhhZWUyMDFhYywgMHg4ZWUyMDFhYywgCisweDhlZTIwMTU0LCAweDI0NDIwMDAxLCAweGFlZTIwMTU0LCAweGMwMDE0ZGMsIAorMHg4ZWUyMDE1NCwgMHg4ZjgyMDBhMCwgMHgzMDQyMDAwNCwgMHgxNDQwZmZmZCwgCisweDAsIDB4OGY4MjAwNDAsIDB4MzA0MjAwMDEsIDB4MTQ0MDAwMDgsIAorMHgwLCAweDhmNDMwMTA0LCAweDI0MDIwMDAxLCAweDEwNjIwMDA0LCAKKzB4MCwgMHg4ZjQyMDI2NCwgMHgxMDQwMDAwNiwgMHgwLCAKKzB4OGVlMjAxN2MsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxN2MsIDB4ODAwMTRjNSwgCisweDhlZTIwMTdjLCAweDhmODIwMDQ0LCAweDM0NDIwMDA0LCAweGFmODIwMDQ0LCAKKzB4OGVlMjAxNzgsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxNzgsIDB4OGVlMjAxNzgsIAorMHg4ZjgyMDBkOCwgMHg4ZjgzMDBkNCwgMHg0MzEwMjMsIDB4YWVlMjcyNmMsIAorMHg4ZWUyNzI2YywgMHgxYzQwMDAwMywgMHgzYzAzMDAwMSwgMHg0MzEwMjEsIAorMHhhZWUyNzI2YywgMHhjMDA0MDY0LCAweDAsIDB4YzAwNDQ0MCwgCisweGFmODAwMjI4LCAweDhmYmYwMDI0LCAweDhmYjAwMDIwLCAweDNlMDAwMDgsIAorMHgyN2JkMDAyOCwgMHgzZTAwMDA4LCAweDAsIDB4M2UwMDAwOCwgCisweDAsIDB4MCwgMHgwLCAweDI0MDIwMDJjLCAKKzB4YWY4MjAwNTAsIDB4YWVlMDcyNzQsIDB4OGY0MjAyMzgsIDB4YWVlMjcyNzgsIAorMHg4ZjgyMDA1NCwgMHgyNDQyMDA2NywgMHhhZjgyMDA1OCwgMHhhZWUwN2I4OCwgCisweGFlZTA3YjhjLCAweGFlZTA3Yjg0LCAweDNjMDEwMDAxLCAweDM3MDgyMSwgCisweGFjMjA4M2JjLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHgzZTAwMDA4LCAKKzB4YTAyMDgzYjksIDB4MjdiZGZmZDgsIDB4YWZiZjAwMjQsIDB4YWZiMDAwMjAsIAorMHg4ZjgyMDA1NCwgMHgzYzAzMDAwMSwgMHg4YzYzNWNkOCwgMHgyNDQyMDA2NywgCisweDEwNjAwMDBkLCAweGFmODIwMDU4LCAweDNjMDIwMDAxLCAweDU3MTAyMSwgCisweDkwNDI4M2I4LCAweDEwNDAwMDA1LCAweDNjMDMwMjAwLCAweDNjMDEwMDAxLCAKKzB4MzcwODIxLCAweDgwMDE1MDMsIDB4YTAyMDgzYjgsIDB4OGVlMjAwMDAsIAorMHg0MzEwMjUsIDB4YWVlMjAwMDAsIDB4OGY0MjAyMTgsIDB4MzA0MjAxMDAsIAorMHgxMDQwMDBjNiwgMHgwLCAweDhmODIwMGIwLCAweDMwNDIwMDA0LCAKKzB4MTA0MDAwYzIsIDB4MCwgMHgzYzAzMDAwMSwgMHg3NzE4MjEsIAorMHg4YzYzODNkMCwgMHg4ZjgyMDEwNCwgMHgxNDYyMDBiNCwgMHgwLCAKKzB4M2MwMzAwMDEsIDB4NzcxODIxLCAweDhjNjM4M2Q0LCAweDhmODIwMGI0LCAKKzB4MTQ2MjAwYWUsIDB4MCwgMHg4ZjgyMDBiMCwgMHgzYzAzMDA4MCwgCisweDQzMTAyNCwgMHgxMDQwMDAwZCwgMHgwLCAweDhmODIwMTFjLCAKKzB4MzQ0MjAwMDIsIDB4YWY4MjAxMWMsIDB4OGY4MjAwYjAsIDB4MjQwM2ZmZmIsIAorMHg0MzEwMjQsIDB4YWY4MjAwYjAsIDB4OGY4MjAxMWMsIDB4MjQwM2ZmZmQsIAorMHg0MzEwMjQsIDB4ODAwMTVjYywgMHhhZjgyMDExYywgMHgzYzAzMDAwMSwgCisweDc3MTgyMSwgMHg4YzYzODNkMCwgMHg4ZjgyMDEwNCwgMHgxNDYyMDA4MiwgCisweDAsIDB4M2MwMzAwMDEsIDB4NzcxODIxLCAweDhjNjM4M2Q0LCAKKzB4OGY4MjAwYjQsIDB4MTQ2MjAwN2MsIDB4MCwgMHgzYzA3MDAwMSwgCisweGY3MzgyMSwgMHg4Y2U3ODNkMCwgMHg4ZjgyMDBiMCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1MjcwLCAweGFmYTAwMDE0LCAweGFmYTIwMDEwLCAweDhmODYwMGIwLCAKKzB4M2MwNTAwMDUsIDB4YzAwMjQwMywgMHgzNGE1MDkwMCwgMHg4ZjgyMDExYywgCisweDM0NDIwMDAyLCAweGFmODIwMTFjLCAweDhmODMwMTA0LCAweDhmODIwMGIwLCAKKzB4MzQ0MjAwMDEsIDB4YWY4MjAwYjAsIDB4YWY4MzAxMDQsIDB4OGY4MzAxMjAsIAorMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsIAorMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLCAKKzB4OGY4MjAxMjQsIDB4MTRjMjAwMDYsIDB4MCwgMHg4ZWUyMDFhNCwgCisweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDE1YTAsIDB4OGVlMjAxYTQsIAorMHg4ZjQ0MDIwOCwgMHg4ZjQ1MDIwYywgMHgyNmUyMDAzMCwgMHhhYzYyMDAwOCwgCisweDI0MDIwNDAwLCAweGE0NjIwMDBlLCAweDI0MDIwMDBmLCAweGFjNjIwMDE4LCAKKzB4YWM2MDAwMWMsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIAorMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgCisweDAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIAorMHgyZTIyMDIxLCAweDhjODMwMDAwLCAweDI0MDIwMDA3LCAweDE0NjIwMDFmLCAKKzB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgCisweDI0MDMwMDQwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAKKzB4OGVlMjRlMzQsIDB4OGVlNTRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIAorMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwYTIwMDA1LCAKKzB4MCwgMHg4MDAxNThhLCAweDAsIDB4MTRhMDAwMDUsIAorMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAKKzB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIAorMHhhYzgwMDAwMCwgMHg4MDAxNWEwLCAweDAsIDB4OGVlMjRlMzAsIAorMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAKKzB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIAorMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDA3LCAKKzB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4OGY4MjAxMWMsIAorMHgyNDAzZmZmZCwgMHg0MzEwMjQsIDB4YWY4MjAxMWMsIDB4OGVlMjAxZTQsIAorMHgzYzA3MDAwMSwgMHhmNzM4MjEsIDB4OGNlNzgzZDAsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDFlNCwgMHg4ZWUyMDFlNCwgMHgzYzA0MDAwMSwgMHgyNDg0NTI3YywgCisweDgwMDE1YmQsIDB4YWZhMDAwMTAsIDB4OGY4MjAxMDQsIDB4M2MwMTAwMDEsIAorMHgzNzA4MjEsIDB4YWMyMjgzZDAsIDB4OGY4MjAwYjQsIDB4M2MwNzAwMDEsIAorMHhmNzM4MjEsIDB4OGNlNzgzZDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUyODQsIAorMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjgzZDQsIDB4YWZhMDAwMTAsIAorMHhhZmEwMDAxNCwgMHg4Zjg2MDBiMCwgMHgzYzA1MDAwNSwgMHhjMDAyNDAzLCAKKzB4MzRhNTA5MDAsIDB4ODAwMTVjYywgMHgwLCAweDhmODIwMTA0LCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI4M2QwLCAweDhmODIwMGI0LCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI4M2Q0LCAweDhlZTI3Mjc0LCAKKzB4OTJlMzA0ZjQsIDB4MjQ0MjAwNjcsIDB4MTQ2MDAwMDYsIDB4YWVlMjcyNzQsIAorMHg4ZWUyNzI3NCwgMHg4ZjQzMDIzNCwgMHg0MzEwMmIsIDB4MTQ0MDAwN2IsIAorMHgwLCAweDhlZTMwNGU0LCAweDhlZTIwNGY4LCAweDE0NjIwMDA0LCAKKzB4MCwgMHg5MmUyMDRmNCwgMHg1MDQwMDA3NCwgMHhhMmUwMDRmNCwgCisweDhmODMwMTIwLCAweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgCisweDUwNDAwMDAxLCAweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAKKzB4MCwgMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAKKzB4OGVlMjAxYTQsIDB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgCisweDgwMDE2MzcsIDB4OGVlMjAxYTQsIDB4OGVlMjA0ZTQsIDB4YWM2MjAwMWMsIAorMHg4ZWU0MDRiMCwgMHg4ZWU1MDRiNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgCisweDI0MDIwMDA4LCAweGE0NjIwMDBlLCAweDI0MDIwMDExLCAweGFjNjIwMDE4LCAKKzB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIAorMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgMHgyNDEwMDAwMSwgCisweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIAorMHg4YzgzMDAwMCwgMHgyNDAyMDAxMiwgMHgxNDYyMDAxZiwgMHgwLCAKKzB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIAorMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgCisweDhlZTU0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsIAorMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLCAKKzB4ODAwMTYyMSwgMHgwLCAweDE0YTAwMDA1LCAweDAsIAorMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgCisweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLCAKKzB4ODAwMTYzNywgMHgwLCAweDhlZTI0ZTMwLCAweDI0MDMwMDQwLCAKKzB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgCisweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAKKzB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAxMiwgMHhhYzgyMDAwMCwgCisweDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDU2MDAwMDBiLCAweDI0MTAwMDAxLCAKKzB4OGVlMjA0ZTQsIDB4M2MwNDAwMDEsIDB4MjQ4NDUyOGMsIDB4YWZhMDAwMTQsIAorMHhhZmEyMDAxMCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgCisweGMwMDI0MDMsIDB4MzRhNWYwMDYsIDB4MTYwMDAwMDMsIDB4MjQwMjAwMDEsIAorMHg4MDAxNjUwLCAweGEyZTIwNGY0LCAweDhlZTIwMTcwLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxNzAsIDB4OGVlMjAxNzAsIDB4OGVlMjA0ZTQsIDB4YTJlMDA0ZjQsIAorMHhhZWUwMDRmMCwgMHhhZWUwNzI3NCwgMHhhZWUyMDRmOCwgMHg4ZWUyMGUxYywgCisweDEwNDAwMDZkLCAweDAsIDB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsIAorMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsIAorMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLCAweDhmODIwMTI0LCAKKzB4MTRjMjAwMDcsIDB4MCwgMHg4ZWUyMDFhNCwgMHg4MDIxLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMTZhZCwgMHg4ZWUyMDFhNCwgCisweDhlZTI3MjRjLCAweGFjNjIwMDFjLCAweDhlZTQwNGE4LCAweDhlZTUwNGFjLCAKKzB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIDB4MjQwMjAwMDgsIDB4YTQ2MjAwMGUsIAorMHgyNDAyMDAxMSwgMHhhYzYyMDAxOCwgMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgCisweDhlZTIwNGM0LCAweGFjNjIwMDEwLCAweGFmODYwMTIwLCAweDkyZTI0ZTIwLCAKKzB4MTQ0MDAwMzcsIDB4MjQxMDAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIAorMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLCAweDI0MDIwMDEyLCAKKzB4MTQ2MjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgCisweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAKKzB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlNTRlMzAsIDB4MjQ0MjAwMDEsIAorMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAKKzB4MTBhMjAwMDUsIDB4MCwgMHg4MDAxNjk3LCAweDAsIAorMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLCAKKzB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIAorMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAxNmFkLCAweDAsIAorMHg4ZWUyNGUzMCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgCisweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIAorMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAKKzB4MjQwMjAwMTIsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIAorMHg1NjAwMDAwYiwgMHgyNDEwMDAwMSwgMHg4ZWUyNzI0YywgMHgzYzA0MDAwMSwgCisweDI0ODQ1Mjk4LCAweGFmYTAwMDE0LCAweGFmYTIwMDEwLCAweDhlZTY3MjRjLCAKKzB4OGY0NzAyODAsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAwOCwgCisweDU2MDAwMDAxLCAweGFlZTAwZTFjLCAweDhlZTIwMTc0LCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxNzQsIDB4OGVlMjAxNzQsIDB4OGVlMjRlMjQsIDB4MTA0MDAwMTksIAorMHgwLCAweGFlZTA0ZTI0LCAweDhmODIwMDQwLCAweDMwNDIwMDAxLCAKKzB4MTQ0MDAwMDgsIDB4MCwgMHg4ZjQzMDEwNCwgMHgyNDAyMDAwMSwgCisweDEwNjIwMDA0LCAweDAsIDB4OGY0MjAyNjQsIDB4MTA0MDAwMDYsIAorMHgwLCAweDhlZTIwMTdjLCAweDI0NDIwMDAxLCAweGFlZTIwMTdjLCAKKzB4ODAwMTZkYSwgMHg4ZWUyMDE3YywgMHg4ZjgyMDA0NCwgMHgzNDQyMDAwNCwgCisweGFmODIwMDQ0LCAweDhlZTIwMTc4LCAweDI0NDIwMDAxLCAweGFlZTIwMTc4LCAKKzB4OGVlMjAxNzgsIDB4OGVlMjcyNzgsIDB4MjQ0MmZmOTksIDB4YWVlMjcyNzgsIAorMHg4ZWUyNzI3OCwgMHgxYzQwMDJhZCwgMHgwLCAweDhmNDIwMjM4LCAKKzB4MTA0MDAyYWEsIDB4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIAorMHg5MDQyODNlMCwgMHgxNDQwMDJhNSwgMHgwLCAweDhmNDIwMDgwLCAKKzB4YWVlMjAwNGMsIDB4OGY0MjAwYzAsIDB4YWVlMjAwNDgsIDB4OGY0MjAwODQsIAorMHhhZWUyMDAzOCwgMHg4ZjQyMDA4NCwgMHhhZWUyMDI0NCwgMHg4ZjQyMDA4OCwgCisweGFlZTIwMjQ4LCAweDhmNDIwMDhjLCAweGFlZTIwMjRjLCAweDhmNDIwMDkwLCAKKzB4YWVlMjAyNTAsIDB4OGY0MjAwOTQsIDB4YWVlMjAyNTQsIDB4OGY0MjAwOTgsIAorMHhhZWUyMDI1OCwgMHg4ZjQyMDA5YywgMHhhZWUyMDI1YywgMHg4ZjQyMDBhMCwgCisweGFlZTIwMjYwLCAweDhmNDIwMGE0LCAweGFlZTIwMjY0LCAweDhmNDIwMGE4LCAKKzB4YWVlMjAyNjgsIDB4OGY0MjAwYWMsIDB4YWVlMjAyNmMsIDB4OGY0MjAwYjAsIAorMHhhZWUyMDI3MCwgMHg4ZjQyMDBiNCwgMHhhZWUyMDI3NCwgMHg4ZjQyMDBiOCwgCisweGFlZTIwMjc4LCAweDhmNDIwMGJjLCAweDI0MDQwMDAxLCAweGFlZTIwMjdjLCAKKzB4YWVlMDAwM2MsIDB4NDEwODAsIDB4NTcxMDIxLCAweDhlZTMwMDNjLCAKKzB4OGM0MjAyNDQsIDB4MjQ4NDAwMDEsIDB4NjIxODIxLCAweDJjODIwMDBmLCAKKzB4YWVlMzAwM2MsIDB4MTQ0MGZmZjgsIDB4NDEwODAsIDB4OGY0MjAwY2MsIAorMHhhZWUyMDA1MCwgMHg4ZjQyMDBkMCwgMHhhZWUyMDA1NCwgMHg4ZjgzMDEyMCwgCisweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgCisweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsIAorMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LCAKKzB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxNzc1LCAKKzB4OGVlMjAxYTQsIDB4OGY0NDAyMDgsIDB4OGY0NTAyMGMsIDB4MjZlMjAwMzAsIAorMHhhYzYyMDAwOCwgMHgyNDAyMDQwMCwgMHhhNDYyMDAwZSwgMHgyNDAyMDAwZiwgCisweGFjNjIwMDE4LCAweGFjNjAwMDFjLCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LCAKKzB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIAorMHgxNDQwMDAzNywgMHgyNDEwMDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIDB4MjQwMjAwMDcsIAorMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAKKzB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIAorMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwgMHgyNDQyMDAwMSwgCisweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIAorMHgxMGEyMDAwNSwgMHgwLCAweDgwMDE3NWYsIDB4MCwgCisweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIAorMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgCisweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDE3NzUsIDB4MCwgCisweDhlZTI0ZTMwLCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLCAKKzB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgCisweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIAorMHgyNDAyMDAwNywgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgCisweDEyMDAwMjEyLCAweDNjMDIwNDAwLCAweGFmYTIwMDE4LCAweDNjMDIwMDAxLCAKKzB4NTcxMDIxLCAweDkwNDI4M2IwLCAweDEwNDAwMTBiLCAweDAsIAorMHg4ZWUyMDYwOCwgMHg4ZjQzMDIyOCwgMHgyNDQyMDAwMSwgMHgzMDRhMDBmZiwgCisweDUxNDMwMGZkLCAweGFmYTAwMDEwLCAweDhlZTIwNjA4LCAweDIxMGMwLCAKKzB4NTcxMDIxLCAweDhmYTMwMDE4LCAweDhmYTQwMDFjLCAweGFjNDMwNjBjLCAKKzB4YWM0NDA2MTAsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ2OTAwMzIsIAorMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAweDEwNDAwMDZhLCAweDU4MjEsIAorMHgyNDE4MDAwOCwgMHgyNDBmMDAwZCwgMHgyNDBkMDAwNywgMHgyNDBjMDA0MCwgCisweDI0MGUwMDAxLCAweDhmODcwMTIwLCAweDI3NjIzODAwLCAweDI0ZTgwMDIwLCAKKzB4MTAyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY4MzAwMCwgMHg4ZjgyMDEyOCwgCisweDExMDIwMDA0LCAweDAsIDB4OGY4MjAxMjQsIDB4MTUwMjAwMDcsIAorMHgxMDIxLCAweDhlZTIwMWE0LCAweDgwMjEsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDFhNCwgMHg4MDAxN2YzLCAweDhlZTIwMWE0LCAweDhlZTQwNjA4LCAKKzB4NDIwYzAsIDB4ODAxODIxLCAweDhlZTQwNDMwLCAweDhlZTUwNDM0LCAKKzB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsIDB4ODYyMDIxLCAKKzB4YWNlNDAwMDAsIDB4YWNlNTAwMDQsIDB4OGVlMjA2MDgsIDB4YTRmODAwMGUsIAorMHhhY2VmMDAxOCwgMHhhY2VhMDAxYywgMHgyMTBjMCwgMHgyNDQyMDYwYywgCisweDJlMjEwMjEsIDB4YWNlMjAwMDgsIDB4OGVlMjA0YzQsIDB4YWNlMjAwMTAsIAorMHhhZjg4MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywgMHgyNDEwMDAwMSwgCisweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIAorMHg4YzgyMDAwMCwgMHgxNDRkMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAKKzB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MCwgMHg4YzgyMDAwNCwgCisweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLCAKKzB4MjQ0MjAwMDEsIDB4MTA0YzAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwgCisweDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsIDB4ODAwMTdlMCwgCisweDAsIDB4MTQ2MDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwgCisweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LCAKKzB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsIDB4ODAwMTdmMywgCisweDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4NTA0YzAwMDMsIAorMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAKKzB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgCisweGFjOGQwMDAwLCAweGFjOGUwMDA0LCAweDU2MDAwMDA2LCAweDI0MGIwMDAxLCAKKzB4OGY4MjAwNTQsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywgMHgxNDQwZmY5ZCwgCisweDAsIDB4MzE2MzAwZmYsIDB4MjQwMjAwMDEsIDB4MTQ2MjAwNzcsIAorMHgzYzA1MDAwOSwgMHhhZWVhMDYwOCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgCisweDI0NjkwMDMyLCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIDB4MTA0MDAwNjEsIAorMHg1ODIxLCAweDI0MGQwMDA4LCAweDI0MGMwMDExLCAweDI0MDgwMDEyLCAKKzB4MjQwNzAwNDAsIDB4MjQwYTAwMDEsIDB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsIAorMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsIAorMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLCAweDhmODIwMTI0LCAKKzB4MTRjMjAwMDcsIDB4MCwgMHg4ZWUyMDFhNCwgMHg4MDIxLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMTg1ZiwgMHg4ZWUyMDFhNCwgCisweDhlZTIwNjA4LCAweGFjNjIwMDFjLCAweDhlZTQwNGEwLCAweDhlZTUwNGE0LCAKKzB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIDB4YTQ2ZDAwMGUsIDB4YWM2YzAwMTgsIAorMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwgCisweGFmODYwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDMzLCAweDI0MTAwMDAxLCAKKzB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgCisweDhjODIwMDAwLCAweDE0NDgwMDFmLCAweDAsIDB4OGVlMzRlMzAsIAorMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLCAweDhjODIwMDA0LCAKKzB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsIAorMHgyNDQyMDAwMSwgMHgxMDQ3MDAwNywgMHgwLCAweDhlZTI0ZTM0LCAKKzB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwgMHg4MDAxODRjLCAKKzB4MCwgMHgxNDYwMDAwNSwgMHgwLCAweDhmODIwMTI4LCAKKzB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIAorMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwgMHg4MDAxODVmLCAKKzB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHg1MDQ3MDAwMywgCisweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIAorMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAKKzB4YWM4ODAwMDAsIDB4YWM4YTAwMDQsIDB4NTYwMDAwMDYsIDB4MjQwYjAwMDEsIAorMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAweDE0NDBmZmE2LCAKKzB4MCwgMHgzMTYzMDBmZiwgMHgyNDAyMDAwMSwgMHgxNDYyMDAwMywgCisweDNjMDUwMDA5LCAweDgwMDE5N2MsIDB4MjQxMDAwMDEsIDB4M2MwNDAwMDEsIAorMHgyNDg0NTJhNCwgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4Zjg2MDEyMCwgCisweDhmODcwMTI0LCAweDgwMDE4N2IsIDB4MzRhNWYwMTEsIDB4M2MwNDAwMDEsIAorMHgyNDg0NTJiMCwgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4Zjg2MDEyMCwgCisweDhmODcwMTI0LCAweDM0YTVmMDEwLCAweGMwMDI0MDMsIDB4ODAyMSwgCisweDgwMDE5N2MsIDB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTJiYywgCisweGFmYTAwMDE0LCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LCAweDNjMDUwMDA5LCAKKzB4ODAwMTk3NSwgMHgzNGE1ZjAwZiwgMHg4ZWUyMDYwOCwgMHg4ZjQzMDIyOCwgCisweDI0NDIwMDAxLCAweDMwNDkwMGZmLCAweDUxMjMwMGUyLCAweGFmYTAwMDEwLCAKKzB4OGVlMjA2MDgsIDB4MjEwYzAsIDB4NTcxMDIxLCAweDhmYTMwMDE4LCAKKzB4OGZhNDAwMWMsIDB4YWM0MzA2MGMsIDB4YWM0NDA2MTAsIDB4OGY4NzAxMjAsIAorMHgyNzYyMzgwMCwgMHgyNGU4MDAyMCwgMHgxMDIxMDJiLCAweDUwNDAwMDAxLCAKKzB4Mjc2ODMwMDAsIDB4OGY4MjAxMjgsIDB4MTEwMjAwMDQsIDB4MCwgCisweDhmODIwMTI0LCAweDE1MDIwMDA3LCAweDEwMjEsIDB4OGVlMjAxYTQsIAorMHg4MDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDE4ZjcsIAorMHg4ZWUyMDFhNCwgMHg4ZWU0MDYwOCwgMHg0MjBjMCwgMHg4MDE4MjEsIAorMHg4ZWU0MDQzMCwgMHg4ZWU1MDQzNCwgMHhhMzI4MjEsIDB4YTMzMDJiLCAKKzB4ODIyMDIxLCAweDg2MjAyMSwgMHhhY2U0MDAwMCwgMHhhY2U1MDAwNCwgCisweDhlZTMwNjA4LCAweDI0MDIwMDA4LCAweGE0ZTIwMDBlLCAweDI0MDIwMDBkLCAKKzB4YWNlMjAwMTgsIDB4YWNlOTAwMWMsIDB4MzE4YzAsIDB4MjQ2MzA2MGMsIAorMHgyZTMxMDIxLCAweGFjZTIwMDA4LCAweDhlZTIwNGM0LCAweGFjZTIwMDEwLCAKKzB4YWY4ODAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzcsIDB4MjQxMDAwMDEsIAorMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAKKzB4OGM4MzAwMDAsIDB4MjQwMjAwMDcsIDB4MTQ2MjAwMWYsIDB4MCwgCisweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAKKzB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIAorMHg4ZWU1NGUzMCwgMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLCAKKzB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwgCisweDgwMDE4ZTEsIDB4MCwgMHgxNGEwMDAwNSwgMHgwLCAKKzB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIAorMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgCisweDgwMDE4ZjcsIDB4MCwgMHg4ZWUyNGUzMCwgMHgyNDAzMDA0MCwgCisweDI0NDIwMDAxLCAweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIAorMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMDcsIDB4YWM4MjAwMDAsIAorMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgMHg1NjAwMDAwYywgMHhhZWU5MDYwOCwgCisweDNjMDQwMDAxLCAweDI0ODQ1MmM4LCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAKKzB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgCisweDM0YTVmMDAwLCAweDgwMDE5N2MsIDB4MCwgMHg4ZjgzMDEyMCwgCisweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgCisweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsIAorMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LCAKKzB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxOTVlLCAKKzB4OGVlMjAxYTQsIDB4OGVlMjA2MDgsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YTAsIAorMHg4ZWU1MDRhNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHgyNDAyMDAwOCwgCisweGE0NjIwMDBlLCAweDI0MDIwMDExLCAweGFjNjIwMDE4LCAweGFjNjQwMDAwLCAKKzB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIAorMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgMHgyNDEwMDAwMSwgMHg4ZWUyNGUzMCwgCisweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIAorMHgyNDAyMDAxMiwgMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAKKzB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIAorMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwgCisweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMzQsIAorMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLCAweDgwMDE5NDgsIAorMHgwLCAweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIAorMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgCisweDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDE5NWUsIAorMHgwLCAweDhlZTI0ZTMwLCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAKKzB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgCisweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAKKzB4MmUyMjAyMSwgMHgyNDAyMDAxMiwgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgCisweGFjODIwMDA0LCAweDU2MDAwMDFkLCAweDI0MTAwMDAxLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDUyZDAsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsIAorMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDAxLCAKKzB4OGVlMjAxYjAsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYjAsIDB4ODAwMTk3YywgCisweDhlZTIwMWIwLCAweDNjMDQwMDAxLCAweDI0ODQ1MmRjLCAweGFmYTAwMDE0LCAKKzB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4MzRhNWYwMDUsIAorMHhjMDAyNDAzLCAweDAsIDB4OGVlMjAxYWMsIDB4ODAyMSwgCisweDI0NDIwMDAxLCAweGFlZTIwMWFjLCAweDhlZTIwMWFjLCAweDEyMDAwMDBjLCAKKzB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA4M2IwLCAKKzB4OGY0MjAyMzgsIDB4OGVlMzAxNTgsIDB4MjQ2MzAwMDEsIDB4YWVlMzAxNTgsIAorMHg4ZWUzMDE1OCwgMHg4MDAxOThjLCAweGFlZTI3Mjc4LCAweDI0MDIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjI4M2IwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjVjZDgsIDB4MTA0MDAxODcsIDB4MCwgMHg4ZWUyN2I4NCwgCisweDI0NDMwMDAxLCAweDI4NDIwMGM5LCAweDE0NDAwMWE0LCAweGFlZTM3Yjg0LCAKKzB4OGVlMjA0ZDQsIDB4MzA0MjAwMDIsIDB4MTQ0MDAxMTksIDB4YWVlMDdiODQsIAorMHg4ZWUyMDRkNCwgMHgzYzAzMDYwMCwgMHgzNDYzMTAwMCwgMHgzNDQyMDAwMiwgCisweGFlZTIwNGQ0LCAweGFmYTMwMDE4LCAweDhlZTIwNjA4LCAweDhmNDMwMjI4LCAKKzB4MjQ0MjAwMDEsIDB4MzA0YTAwZmYsIDB4NTE0MzAwZmQsIDB4YWZhMDAwMTAsIAorMHg4ZWUyMDYwOCwgMHgyMTBjMCwgMHg1NzEwMjEsIDB4OGZhMzAwMTgsIAorMHg4ZmE0MDAxYywgMHhhYzQzMDYwYywgMHhhYzQ0MDYxMCwgMHg4ZjgzMDA1NCwgCisweDhmODIwMDU0LCAweDI0NjkwMDMyLCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIAorMHgxMDQwMDA2YSwgMHg1ODIxLCAweDI0MTgwMDA4LCAweDI0MGYwMDBkLCAKKzB4MjQwZDAwMDcsIDB4MjQwYzAwNDAsIDB4MjQwZTAwMDEsIDB4OGY4NzAxMjAsIAorMHgyNzYyMzgwMCwgMHgyNGU4MDAyMCwgMHgxMDIxMDJiLCAweDUwNDAwMDAxLCAKKzB4Mjc2ODMwMDAsIDB4OGY4MjAxMjgsIDB4MTEwMjAwMDQsIDB4MCwgCisweDhmODIwMTI0LCAweDE1MDIwMDA3LCAweDEwMjEsIDB4OGVlMjAxYTQsIAorMHg4MDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDFhMTUsIAorMHg4ZWUyMDFhNCwgMHg4ZWU0MDYwOCwgMHg0MjBjMCwgMHg4MDE4MjEsIAorMHg4ZWU0MDQzMCwgMHg4ZWU1MDQzNCwgMHhhMzI4MjEsIDB4YTMzMDJiLCAKKzB4ODIyMDIxLCAweDg2MjAyMSwgMHhhY2U0MDAwMCwgMHhhY2U1MDAwNCwgCisweDhlZTIwNjA4LCAweGE0ZjgwMDBlLCAweGFjZWYwMDE4LCAweGFjZWEwMDFjLCAKKzB4MjEwYzAsIDB4MjQ0MjA2MGMsIDB4MmUyMTAyMSwgMHhhY2UyMDAwOCwgCisweDhlZTIwNGM0LCAweGFjZTIwMDEwLCAweGFmODgwMTIwLCAweDkyZTI0ZTIwLCAKKzB4MTQ0MDAwMzMsIDB4MjQxMDAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIAorMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODIwMDAwLCAweDE0NGQwMDFmLCAKKzB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgCisweDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIAorMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDRjMDAwNywgCisweDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIAorMHgwLCAweDgwMDFhMDIsIDB4MCwgMHgxNDYwMDAwNSwgCisweDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIAorMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgCisweGFjODAwMDAwLCAweDgwMDFhMTUsIDB4MCwgMHg4ZWUyNGUzMCwgCisweDI0NDIwMDAxLCAweDUwNGMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIAorMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4YWM4ZDAwMDAsIDB4YWM4ZTAwMDQsIAorMHg1NjAwMDAwNiwgMHgyNDBiMDAwMSwgMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLCAKKzB4MmM0MjAwMzMsIDB4MTQ0MGZmOWQsIDB4MCwgMHgzMTYzMDBmZiwgCisweDI0MDIwMDAxLCAweDU0NjIwMDc4LCAweGFmYTAwMDEwLCAweGFlZWEwNjA4LCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ2OTAwMzIsIDB4MTIyMTAyMywgCisweDJjNDIwMDMzLCAweDEwNDAwMDYxLCAweDU4MjEsIDB4MjQwZDAwMDgsIAorMHgyNDBjMDAxMSwgMHgyNDA4MDAxMiwgMHgyNDA3MDA0MCwgMHgyNDBhMDAwMSwgCisweDhmODMwMTIwLCAweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgCisweDUwNDAwMDAxLCAweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAKKzB4MCwgMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAKKzB4OGVlMjAxYTQsIDB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgCisweDgwMDFhODEsIDB4OGVlMjAxYTQsIDB4OGVlMjA2MDgsIDB4YWM2MjAwMWMsIAorMHg4ZWU0MDRhMCwgMHg4ZWU1MDRhNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgCisweGE0NmQwMDBlLCAweGFjNmMwMDE4LCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LCAKKzB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIAorMHgxNDQwMDAzMywgMHgyNDEwMDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MjAwMDAsIDB4MTQ0ODAwMWYsIAorMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAKKzB4MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgCisweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDcwMDA3LCAKKzB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgCisweDAsIDB4ODAwMWE2ZSwgMHgwLCAweDE0NjAwMDA1LCAKKzB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgCisweDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEwLCAKKzB4YWM4MDAwMDAsIDB4ODAwMWE4MSwgMHgwLCAweDhlZTI0ZTMwLCAKKzB4MjQ0MjAwMDEsIDB4NTA0NzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgCisweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAKKzB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHhhYzg4MDAwMCwgMHhhYzhhMDAwNCwgCisweDU2MDAwMDA2LCAweDI0MGIwMDAxLCAweDhmODIwMDU0LCAweDEyMjEwMjMsIAorMHgyYzQyMDAzMywgMHgxNDQwZmZhNiwgMHgwLCAweDMxNjMwMGZmLCAKKzB4MjQwMjAwMDEsIDB4MTA2MjAwMjIsIDB4MCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1MmE0LCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMTIwLCAKKzB4OGY4NzAxMjQsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAxMSwgCisweDgwMDFhYWQsIDB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTJiMCwgCisweGFmYTAwMDE0LCAweDhmODYwMTIwLCAweDhmODcwMTI0LCAweDNjMDUwMDA5LCAKKzB4YzAwMjQwMywgMHgzNGE1ZjAxMCwgMHg4MDAxYWFkLCAweDAsIAorMHgzYzA0MDAwMSwgMHgyNDg0NTJiYywgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgCisweDhmNDcwMjI4LCAweDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMGYsIAorMHg4ZWUyMDFhYywgMHgyNDQyMDAwMSwgMHhhZWUyMDFhYywgMHg4ZWUyMDFhYywgCisweDhlZTIwMTVjLCAweDI0NDIwMDAxLCAweGFlZTIwMTVjLCAweDhlZTIwMTVjLCAKKzB4OGVlMjA0ZDQsIDB4MzA0MjAwMDEsIDB4MTA0MDAwNTUsIDB4MCwgCisweDhmNDIwMjE4LCAweDMwNDIwMDgwLCAweDEwNDAwMDI5LCAweDAsIAorMHg4ZjgyMDA0NCwgMHgzNDQyMDA0MCwgMHhhZjgyMDA0NCwgMHg4ZWUyN2I3YywgCisweDQwMjgyMSwgMHg4ZWUyMDBjMCwgMHg4ZWUzMDBjNCwgMHgyNDA2MDAwMCwgCisweDI0MDdmZmZmLCAweDIwMjEsIDB4NDYxMDI0LCAweDE0NDQwMDBkLCAKKzB4NjcxODI0LCAweDE0NjUwMDBiLCAweDAsIDB4OGVlMjdiODAsIAorMHg0MDI4MjEsIDB4OGVlMjAwZTAsIDB4OGVlMzAwZTQsIDB4MjAyMSwgCisweDQ2MTAyNCwgMHgxNDQ0MDAwMywgMHg2NzE4MjQsIDB4MTA2NTAwMGIsIAorMHgwLCAweDhlZTIwMGMwLCAweDhlZTMwMGM0LCAweDhlZTQwMGUwLCAKKzB4OGVlNTAwZTQsIDB4YWVlMzdiN2MsIDB4YWVlNTdiODAsIDB4OGY4MjAwNDQsIAorMHgzODQyMDAyMCwgMHg4MDAxYjM4LCAweGFmODIwMDQ0LCAweDhmODIwMDQ0LCAKKzB4MjQwM2ZmZGYsIDB4NDMxMDI0LCAweDgwMDFiMzgsIDB4YWY4MjAwNDQsIAorMHg4ZjgyMDA0NCwgMHgyNDAzZmZkZiwgMHg0MzEwMjQsIDB4YWY4MjAwNDQsIAorMHg4ZWUyN2I3YywgMHg0MDI4MjEsIDB4OGVlMjAwYzAsIDB4OGVlMzAwYzQsIAorMHgyNDA2MDAwMCwgMHgyNDA3ZmZmZiwgMHgyMDIxLCAweDQ2MTAyNCwgCisweDE0NDQwMDBkLCAweDY3MTgyNCwgMHgxNDY1MDAwYiwgMHgwLCAKKzB4OGVlMjdiODAsIDB4NDAyODIxLCAweDhlZTIwMGUwLCAweDhlZTMwMGU0LCAKKzB4MjAyMSwgMHg0NjEwMjQsIDB4MTQ0NDAwMDMsIDB4NjcxODI0LCAKKzB4MTA2NTAwMGIsIDB4MCwgMHg4ZWUyMDBjMCwgMHg4ZWUzMDBjNCwgCisweDhlZTQwMGUwLCAweDhlZTUwMGU0LCAweGFlZTM3YjdjLCAweGFlZTU3YjgwLCAKKzB4OGY4MjAwNDQsIDB4Mzg0MjAwNDAsIDB4ODAwMWIzOCwgMHhhZjgyMDA0NCwgCisweDhmODIwMDQ0LCAweDM0NDIwMDQwLCAweDgwMDFiMzgsIDB4YWY4MjAwNDQsIAorMHg4ZjgyMDA0NCwgMHgzNDQyMDA0MCwgMHhhZjgyMDA0NCwgMHg4ZWUyN2I4YywgCisweDI0NDMwMDAxLCAweDI4NDIwMDE1LCAweDE0NDAwMDI4LCAweGFlZTM3YjhjLCAKKzB4OGY4MjAwNDQsIDB4Mzg0MjAwMjAsIDB4YWY4MjAwNDQsIDB4ODAwMWIzOCwgCisweGFlZTA3YjhjLCAweDhlZTIwNGQ0LCAweDMwNDIwMDAxLCAweDEwNDAwMDExLCAKKzB4MCwgMHg4ZjQyMDIxOCwgMHgzMDQyMDA4MCwgMHgxMDQwMDAwOSwgCisweDAsIDB4OGY4MjAwNDQsIDB4MzQ0MjAwMjAsIDB4YWY4MjAwNDQsIAorMHg4ZjgyMDA0NCwgMHgyNDAzZmZiZiwgMHg0MzEwMjQsIDB4ODAwMWIzNiwgCisweGFmODIwMDQ0LCAweDhmODIwMDQ0LCAweDM0NDIwMDYwLCAweDgwMDFiMzYsIAorMHhhZjgyMDA0NCwgMHg4ZjgyMDA0NCwgMHgzNDQyMDA0MCwgMHhhZjgyMDA0NCwgCisweDhlZTI3Yjg4LCAweDI0NDMwMDAxLCAweDI4NDIxMzg5LCAweDE0NDAwMDA1LCAKKzB4YWVlMzdiODgsIDB4OGY4MjAwNDQsIDB4Mzg0MjAwMjAsIDB4YWY4MjAwNDQsIAorMHhhZWUwN2I4OCwgMHhjMDA0NjAzLCAweDAsIDB4OGZiZjAwMjQsIAorMHg4ZmIwMDAyMCwgMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDI3YmRmZmI4LCAKKzB4YWZiZjAwNDQsIDB4YWZiNjAwNDAsIDB4YWZiNTAwM2MsIDB4YWZiNDAwMzgsIAorMHhhZmIzMDAzNCwgMHhhZmIyMDAzMCwgMHhhZmIxMDAyYywgMHhhZmIwMDAyOCwgCisweDhmOTYwMDY0LCAweDMyYzIwMDA0LCAweDEwNDAwMDBjLCAweDI0MDIwMDA0LCAKKzB4YWY4MjAwNjQsIDB4OGY0MjAxMTQsIDB4YWVlMjA0ZTAsIDB4OGY4MjAwNjAsIAorMHgzNDQyMDAwOCwgMHhhZjgyMDA2MCwgMHg4ZWUyMDE2YywgMHgyNDQyMDAwMSwgCisweGFlZTIwMTZjLCAweDgwMDIyZjQsIDB4OGVlMjAxNmMsIDB4MzJjMjAwMDEsIAorMHgxMDQwMDAwNCwgMHgyNDAyMDAwMSwgMHhhZjgyMDA2NCwgMHg4MDAyMmY0LCAKKzB4MCwgMHgzMmMyMDAwMiwgMHgxNDQwMDAwYywgMHgzYzA1MDAwMywgCisweDNjMDQwMDAxLCAweDI0ODQ1MzU0LCAweDM0YTUwMDAxLCAweDJjMDMwMjEsIAorMHgzODIxLCAweGFmYTAwMDEwLCAweGMwMDI0MDMsIDB4YWZhMDAwMTQsIAorMHgyNDAyZmZmOCwgMHg4MDAyMmY0LCAweGFmODIwMDY0LCAweDhmNDMwMjJjLCAKKzB4OGY0MjAxMGMsIDB4NTA2MjAwMGMsIDB4YWZhMDAwMTAsIDB4OGY0MjAyMmMsIAorMHgyMTA4MCwgMHg1YTEwMjEsIDB4OGM0MjAzMDAsIDB4YWZhMjAwMjAsIAorMHg4ZjQyMDIyYywgMHgyNDA3MDAwMSwgMHgyNDQyMDAwMSwgMHgzMDQyMDAzZiwgCisweDgwMDFiODAsIDB4YWY0MjAyMmMsIDB4M2MwNDAwMDEsIDB4MjQ4NDUzNjAsIAorMHhhZmEwMDAxNCwgMHg4ZjQ2MDIyYywgMHg4ZjQ3MDEwYywgMHgzYzA1MDAwMywgCisweGMwMDI0MDMsIDB4MzRhNWYwMWYsIDB4MzgyMSwgMHgxNGUwMDAwMywgCisweDAsIDB4ODAwMjJlZCwgMHhhZjk2MDA2NCwgMHg5M2EyMDAyMCwgCisweDI0NDNmZmZmLCAweDJjNjIwMDExLCAweDEwNDAwNjU4LCAweDMxMDgwLCAKKzB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDhjMjI1NDE4LCAweDQwMDAwOCwgCisweDAsIDB4OGZhMjAwMjAsIDB4MzA0MjBmZmYsIDB4YWVlMjBlMGMsIAorMHg4ZjgyMDA2MCwgMHgzNDQyMDIwMCwgMHhhZjgyMDA2MCwgMHg4ZWUyMDExOCwgCisweDI0NDIwMDAxLCAweGFlZTIwMTE4LCAweDgwMDIyZTgsIDB4OGVlMjAxMTgsIAorMHg4ZmEyMDAyMCwgMHgyNDAzMDAwMSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHhhMDIzODNiMSwgMHgzMDQyMGZmZiwgMHhhZWUyNTIzOCwgMHg4ZjgyMDA2MCwgCisweDM0NDIwMTAwLCAweGFmODIwMDYwLCAweDhlZTIwMTQ0LCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxNDQsIDB4ODAwMjJlOCwgMHg4ZWUyMDE0NCwgMHg4ZmEyMDAyMCwgCisweDIxMjAwLCAweDIyNTAyLCAweDI0MDIwMDAxLCAweDEwODIwMDA1LCAKKzB4MjQwMjAwMDIsIDB4MTA4MjAwMDksIDB4MjQwMmZmZmUsIDB4ODAwMWJjOSwgCisweGFmYTAwMDEwLCAweDhlZTIwNGQ0LCAweGFlZTQwMDcwLCAweGFlZTQwMDc0LCAKKzB4MzQ0MjAwMDEsIDB4ODAwMWJiZCwgMHhhZWUyMDRkNCwgMHg4ZWUzMDRkNCwgCisweGFlZTQwMDcwLCAweGFlZTQwMDc0LCAweDYyMTgyNCwgMHhhZWUzMDRkNCwgCisweDhmODQwMDU0LCAweDQxNDQyLCAweDQxYzgyLCAweDQzMTAyMSwgCisweDQxY2MyLCAweDQzMTAyMywgMHg0MWQwMiwgMHg0MzEwMjEsIAorMHg0MWQ0MiwgMHg0MzEwMjMsIDB4ODAwMWJkMCwgMHhhZWUyMDA3OCwgCisweDNjMDQwMDAxLCAweDI0ODQ1MzZjLCAweGFmYTAwMDE0LCAweDhmYTYwMDIwLCAKKzB4M2MwNTAwMDMsIDB4YzAwMjQwMywgMHgzNGE1MDAwNCwgMHg4ZWUyMDExMCwgCisweDI0NDIwMDAxLCAweGFlZTIwMTEwLCAweDgwMDIyZTgsIDB4OGVlMjAxMTAsIAorMHgyNzQ0MDIxMiwgMHhjMDAyMmZlLCAweDI0MDUwMDA2LCAweDMwNDkwMDFmLCAKKzB4OTIwYzAsIDB4MmU0MTAyMSwgMHg5NDQyNzI3YywgMHgzMDQyNDAwMCwgCisweDEwNDAwMDBhLCAweDk3MTAyMSwgMHg5NzQzMDIxMiwgMHhhNDQzNzI3ZSwgCisweDhmNDMwMjE0LCAweDk3MTAyMSwgMHhhYzQzNzI4MCwgMHgyZTQxODIxLCAKKzB4MzQwMjgwMDAsIDB4ODAwMWM3OSwgMHhhNDYyNzI3YywgMHg5NDQzNzI3ZSwgCisweDk3NDIwMjEyLCAweDE0NjIwMDA2LCAweDJlNDEwMjEsIDB4OTcxMDIxLCAKKzB4OGM0MzcyODAsIDB4OGY0MjAyMTQsIDB4MTA2MjAwOWYsIDB4MmU0MTAyMSwgCisweDk0NDI3MjdjLCAweDMwNDI4MDAwLCAweDEwNDAwMDJhLCAweDI0MDZmZmZmLCAKKzB4MjAyMSwgMHg0MTBjMCwgMHgyZTIxMDIxLCAweDk0NDI3MzdjLCAKKzB4MzA0MjQwMDAsIDB4NTQ0MDAwMDUsIDB4ODAzMDIxLCAweDI0ODQwMDAxLCAKKzB4MmM4MjAwODAsIDB4MTQ0MGZmZjgsIDB4NDEwYzAsIDB4NGMxMDAxMCwgCisweDYxOGMwLCAweDYxMGMwLCAweDU3MTgyMSwgMHg4YzYzNzM3YywgCisweDU3MTAyMSwgMHhhZmEzMDAxMCwgMHg4YzQyNzM4MCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1Mzc4LCAweGFmYTIwMDE0LCAweDhmNDcwMjE0LCAweDNjMDUwMDAzLCAKKzB4YzAwMjQwMywgMHgzNGE1MDAxMywgMHg4MDAxYzkwLCAweDNjMDIwODAwLCAKKzB4OTc0NDAyMTIsIDB4NzcxMDIxLCAweGE0NDQ3MzdlLCAweDhmNDQwMjE0LCAKKzB4NzcxMDIxLCAweDJlMzE4MjEsIDB4YWM0NDczODAsIDB4MzQwMjgwMDAsIAorMHhhNDYyNzM3YywgMHg5MTBjMCwgMHgyZTIxMDIxLCAweDgwMDFjNzksIAorMHhhNDQ2NzI3YywgMHgyZTQxMDIxLCAweDk0NDU3MjdjLCAweDgwMDFjMmUsIAorMHg1MTBjMCwgMHg5NDQzNzM3ZSwgMHg5NzQyMDIxMiwgMHgxNDYyMDAwNiwgCisweDUxMGMwLCAweDk3MTAyMSwgMHg4YzQzNzM4MCwgMHg4ZjQyMDIxNCwgCisweDEwNjIwMDY1LCAweDUxMGMwLCAweDJlMjEwMjEsIDB4OTQ0NTczN2MsIAorMHg1MTBjMCwgMHgyZTIxMDIxLCAweDk0NDI3MzdjLCAweDMwNDI4MDAwLCAKKzB4MTA0MGZmZjAsIDB4OTcxMDIxLCAweDUyMGMwLCAweDk3MTAyMSwgCisweDk0NDM3MzdlLCAweDk3NDIwMjEyLCAweDE0NjIwMDA2LCAweDI0MDZmZmZmLCAKKzB4OTcxMDIxLCAweDhjNDM3MzgwLCAweDhmNDIwMjE0LCAweDEwNjIwMDUzLCAKKzB4M2MwMjA4MDAsIDB4MjAyMSwgMHg0MTBjMCwgMHgyZTIxMDIxLCAKKzB4OTQ0MjczN2MsIDB4MzA0MjQwMDAsIDB4NTQ0MDAwMDUsIDB4ODAzMDIxLCAKKzB4MjQ4NDAwMDEsIDB4MmM4MjAwODAsIDB4MTQ0MGZmZjgsIDB4NDEwYzAsIAorMHg0YzEwMDIzLCAweDYxOGMwLCAweDkxMGMwLCAweDU3MTgyMSwgCisweDhjNjM3MjdjLCAweDU3MTAyMSwgMHhhZmEzMDAxMCwgMHg4YzQyNzI4MCwgCisweDNjMDQwMDAxLCAweDI0ODQ1Mzg0LCAweGFmYTIwMDE0LCAweDhmNDcwMjE0LCAKKzB4M2MwNTAwMDMsIDB4YzAwMjQwMywgMHgzNGE1ZjAxNywgMHg4MDAxYzkwLCAKKzB4M2MwMjA4MDAsIDB4OGY0MzAyMTAsIDB4YjcxMDIxLCAweGFjNDM3NzdjLCAKKzB4OGY0MzAyMTQsIDB4YjcxMDIxLCAweGFjNDM3NzgwLCAweDNjMDIwMDAxLCAKKzB4NTcxMDIxLCAweDhjNDI4M2I0LCAweDI0NDIwMDAxLCAweDNjMDEwMDAxLCAKKzB4MzcwODIxLCAweGFjMjI4M2I0LCAweDNjMDMwMDAxLCAweDc3MTgyMSwgCisweDhjNjM4M2I0LCAweDJlNTEwMjEsIDB4ODAwMWM4MiwgMHhhNDQzNzc3YywgCisweDk3NDQwMjEyLCAweDc3MTAyMSwgMHhhNDQ0NzM3ZSwgMHg4ZjQ0MDIxNCwgCisweDc3MTAyMSwgMHgyZTMxODIxLCAweGFjNDQ3MzgwLCAweDM0MDI4MDAwLCAKKzB4YTQ2MjczN2MsIDB4NTEwYzAsIDB4MmUyMTAyMSwgMHhhNDQ2NzM3YywgCisweDIwMjEsIDB4NDI4YzAsIDB4MmU1MTAyMSwgMHg5NDQyNzc3YywgCisweDEwNDBmZmRjLCAweDI0ODQwMDAxLCAweDJjODIwMDgwLCAweDU0NDBmZmZhLCAKKzB4NDI4YzAsIDB4OTJlMjA0ZDgsIDB4MTA0MDAwMDYsIDB4MjQwMjAwMDEsIAorMHg4ZWUzMDRkYywgMHgxMjIxMDA0LCAweDYyMTgyNSwgMHg4MDAxYzhmLCAKKzB4YWVlMzA0ZGMsIDB4OGY4MzAyMjgsIDB4MjQwMjAwMDEsIDB4MTIyMTAwNCwgCisweDYyMTgyNSwgMHhhZjgzMDIyOCwgMHgzYzAyMDgwMCwgMHgzNDQyMTAwMCwgCisweGFmYTIwMDE4LCAweDhlZTIwNjA4LCAweDhmNDMwMjI4LCAweDI0NDIwMDAxLCAKKzB4MzA0YTAwZmYsIDB4NTE0MzAwZmQsIDB4YWZhMDAwMTAsIDB4OGVlMjA2MDgsIAorMHgyMTBjMCwgMHg1NzEwMjEsIDB4OGZhMzAwMTgsIDB4OGZhNDAwMWMsIAorMHhhYzQzMDYwYywgMHhhYzQ0MDYxMCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgCisweDI0NjkwMDMyLCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIDB4MTA0MDAwNmEsIAorMHg1ODIxLCAweDI0MTAwMDA4LCAweDI0MGYwMDBkLCAweDI0MGQwMDA3LCAKKzB4MjQwYzAwNDAsIDB4MjQwZTAwMDEsIDB4OGY4NzAxMjAsIDB4Mjc2MjM4MDAsIAorMHgyNGU4MDAyMCwgMHgxMDIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjgzMDAwLCAKKzB4OGY4MjAxMjgsIDB4MTEwMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwgCisweDE1MDIwMDA3LCAweDEwMjEsIDB4OGVlMjAxYTQsIDB4MzgyMSwgCisweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDFkMDgsIDB4OGVlMjAxYTQsIAorMHg4ZWU0MDYwOCwgMHg0MjBjMCwgMHg4MDE4MjEsIDB4OGVlNDA0MzAsIAorMHg4ZWU1MDQzNCwgMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwgCisweDg2MjAyMSwgMHhhY2U0MDAwMCwgMHhhY2U1MDAwNCwgMHg4ZWUyMDYwOCwgCisweGE0ZjAwMDBlLCAweGFjZWYwMDE4LCAweGFjZWEwMDFjLCAweDIxMGMwLCAKKzB4MjQ0MjA2MGMsIDB4MmUyMTAyMSwgMHhhY2UyMDAwOCwgMHg4ZWUyMDRjNCwgCisweGFjZTIwMDEwLCAweGFmODgwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDMzLCAKKzB4MjQwNzAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIAorMHgyZTIyMDIxLCAweDhjODIwMDAwLCAweDE0NGQwMDFmLCAweDAsIAorMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLCAKKzB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIAorMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDRjMDAwNywgMHgwLCAKKzB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwgCisweDgwMDFjZjUsIDB4MCwgMHgxNDYwMDAwNSwgMHgwLCAKKzB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIAorMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwgCisweDgwMDFkMDgsIDB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgCisweDUwNGMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIAorMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgCisweDJlMjIwMjEsIDB4YWM4ZDAwMDAsIDB4YWM4ZTAwMDQsIDB4NTRlMDAwMDYsIAorMHgyNDBiMDAwMSwgMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAKKzB4MTQ0MGZmOWQsIDB4MCwgMHgzMTYzMDBmZiwgMHgyNDAyMDAwMSwgCisweDU0NjIwMDc4LCAweGFmYTAwMDEwLCAweGFlZWEwNjA4LCAweDhmODMwMDU0LCAKKzB4OGY4MjAwNTQsIDB4MjQ2OTAwMzIsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywgCisweDEwNDAwMDYxLCAweDU4MjEsIDB4MjQwZTAwMDgsIDB4MjQwZDAwMTEsIAorMHgyNDBhMDAxMiwgMHgyNDA4MDA0MCwgMHgyNDBjMDAwMSwgMHg4ZjgzMDEyMCwgCisweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgCisweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsIAorMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LCAKKzB4MzgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAxZDc0LCAKKzB4OGVlMjAxYTQsIDB4OGVlMjA2MDgsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YTAsIAorMHg4ZWU1MDRhNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHhhNDZlMDAwZSwgCisweGFjNmQwMDE4LCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LCAweDhlZTIwNGM0LCAKKzB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzMsIAorMHgyNDA3MDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgCisweDJlMjIwMjEsIDB4OGM4MjAwMDAsIDB4MTQ0YTAwMWYsIDB4MCwgCisweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDAsIAorMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgCisweDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDgwMDA3LCAweDAsIAorMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLCAKKzB4ODAwMWQ2MSwgMHgwLCAweDE0NjAwMDA1LCAweDAsIAorMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgCisweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEwLCAweGFjODAwMDAwLCAKKzB4ODAwMWQ3NCwgMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAKKzB4NTA0ODAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgCisweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAKKzB4MmUyMjAyMSwgMHhhYzhhMDAwMCwgMHhhYzhjMDAwNCwgMHg1NGUwMDAwNiwgCisweDI0MGIwMDAxLCAweDhmODIwMDU0LCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIAorMHgxNDQwZmZhNiwgMHgwLCAweDMxNjMwMGZmLCAweDI0MDIwMDAxLCAKKzB4MTA2MjAwMjIsIDB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTM5MCwgCisweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMTIwLCAweDhmODcwMTI0LCAKKzB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAxMSwgMHg4MDAxZGEwLCAKKzB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTM5YywgMHhhZmEwMDAxNCwgCisweDhmODYwMTIwLCAweDhmODcwMTI0LCAweDNjMDUwMDA5LCAweGMwMDI0MDMsIAorMHgzNGE1ZjAxMCwgMHg4MDAxZGEwLCAweDAsIDB4M2MwNDAwMDEsIAorMHgyNDg0NTNhOCwgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgCisweDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMGYsIDB4OGVlMjAxYWMsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFhYywgMHg4ZWUyMDFhYywgMHg4ZWUyMDEyNCwgCisweDI0NDIwMDAxLCAweGFlZTIwMTI0LCAweDgwMDFmOTcsIDB4OGVlMjAxMjQsIAorMHgyNzQ0MDIxMiwgMHhjMDAyMmZlLCAweDI0MDUwMDA2LCAweDMwNDkwMDFmLCAKKzB4OTI4YzAsIDB4MmU1MTAyMSwgMHg5NDQyNzI3YywgMHgzMDQyODAwMCwgCisweDEwNDAwMDJmLCAweDJlNTEwMjEsIDB4OTQ0MjcyN2MsIDB4MzA0MjQwMDAsIAorMHgxNDQwMDAxYywgMHhiNzEwMjEsIDB4OTQ0MzcyN2UsIDB4OTc0MjAyMTIsIAorMHgxNDYyMDAxOCwgMHhiNzEwMjEsIDB4OGM0MzcyODAsIDB4OGY0MjAyMTQsIAorMHg1NDYyMDAxNiwgMHhhZmEyMDAxMCwgMHg5MmUyMDRkOCwgMHgxMDQwMDAwNywgCisweDI0MDIwMDAxLCAweDhlZTMwNGRjLCAweDEyMjEwMDQsIDB4MjEwMjcsIAorMHg2MjE4MjQsIDB4ODAwMWRjOSwgMHhhZWUzMDRkYywgMHg4ZjgzMDIyOCwgCisweDEyMjEwMDQsIDB4MjEwMjcsIDB4NjIxODI0LCAweGFmODMwMjI4LCAKKzB4OTEwYzAsIDB4MmUyMTgyMSwgMHgzNDAyYzAwMCwgMHg4MDAxZTRlLCAKKzB4YTQ2MjcyN2MsIDB4OGY0MjAyMTQsIDB4YWZhMjAwMTAsIDB4OTEwYzAsIAorMHg1NzEwMjEsIDB4OGM0MjcyN2MsIDB4M2MwNDAwMDEsIDB4MjQ4NDUzYjQsIAorMHgzYzA1MDAwMywgMHhhZmEyMDAxNCwgMHg4ZjQ3MDIxMCwgMHgzNGE1ZjAxYywgCisweGMwMDI0MDMsIDB4MTIwMzAyMSwgMHg4MDAxZTgzLCAweDNjMDIwODAwLCAKKzB4YjcxMDIxLCAweDk0NDM3MjdlLCAweDk3NDIwMjEyLCAweDE0NjIwMDE5LCAKKzB4OTE4YzAsIDB4YjcxMDIxLCAweDhjNDM3MjgwLCAweDhmNDIwMjE0LCAKKzB4MTQ2MjAwMTQsIDB4OTE4YzAsIDB4MmU1MTAyMSwgMHg5NDQ3NzI3YywgCisweDcyMGMwLCAweDk3MTAyMSwgMHg5NDQzNzM3ZSwgMHhiNzEwMjEsIAorMHhhNDQzNzI3ZSwgMHg5NzEwMjEsIDB4OGM0MzczODAsIDB4YjcxMDIxLCAKKzB4YWM0MzcyODAsIDB4MmU0MTAyMSwgMHg5NDQzNzM3YywgMHgyZTUxMDIxLCAKKzB4YTQ0MzcyN2MsIDB4MmU0MTgyMSwgMHgzNDAyYzAwMCwgMHg4MDAxZTRlLCAKKzB4YTQ2MjczN2MsIDB4MmUzMTAyMSwgMHg5NDQ3NzI3YywgMHgzMDIxLCAKKzB4NzIwYzAsIDB4MmU0MTAyMSwgMHg5NDQyNzM3YywgMHg0MDIxLCAKKzB4MzA0MjgwMDAsIDB4MTQ0MDAwMjUsIDB4ZTAyODIxLCAweDYwNTAyMSwgCisweDM0MGJjMDAwLCAweDk3MTAyMSwgMHg5NDQzNzM3ZSwgMHg5NzQyMDIxMiwgCisweDU0NjIwMDE1LCAweGUwMjgyMSwgMHg5NzEwMjEsIDB4OGM0MzczODAsIAorMHg4ZjQyMDIxNCwgMHg1NDYyMDAxMCwgMHhlMDI4MjEsIDB4MTEwMDAwMDYsIAorMHgyZTQxMDIxLCAweDk0NDM3MzdjLCAweDUxMGMwLCAweDJlMjEwMjEsIAorMHg4MDAxZTFhLCAweGE0NDM3MzdjLCAweDk0NDM3MzdjLCAweDJlYTEwMjEsIAorMHhhNDQzNzI3YywgMHg3MTBjMCwgMHgyZTIxMDIxLCAweGE0NGI3MzdjLCAKKzB4ODAwMWUyOCwgMHgyNDA2MDAwMSwgMHg1MTBjMCwgMHgyZTIxMDIxLCAKKzB4OTQ0NzczN2MsIDB4NzIwYzAsIDB4MmU0MTAyMSwgMHg5NDQyNzM3YywgCisweDMwNDI4MDAwLCAweDEwNDBmZmRmLCAweDI1MDgwMDAxLCAweDMwYzIwMGZmLCAKKzB4MTQ0MDAwMjUsIDB4MjAyMSwgMHg3MjBjMCwgMHg5NzEwMjEsIAorMHg5NDQzNzM3ZSwgMHg5NzQyMDIxMiwgMHgxNDYyMDAwZiwgMHg5MTBjMCwgCisweDk3MTAyMSwgMHg4YzQzNzM4MCwgMHg4ZjQyMDIxNCwgMHgxNDYyMDAwYSwgCisweDkxMGMwLCAweDJlNDE4MjEsIDB4MzQwMmMwMDAsIDB4MTUwMDAwMTUsIAorMHhhNDYyNzM3YywgMHg5MTBjMCwgMHgyZTIxODIxLCAweDM0MDI4MDAwLCAKKzB4ODAwMWU0ZSwgMHhhNDYyNzI3YywgMHg1NzEwMjEsIDB4OGM0MjcyN2MsIAorMHgzYzA0MDAwMSwgMHgyNDg0NTNjMCwgMHgzYzA1MDAwMywgMHhhZmEyMDAxMCwgCisweDcxMGMwLCAweDU3MTAyMSwgMHg4YzQyNzM3YywgMHgzNGE1MDAxZSwgCisweDEyMDMwMjEsIDB4YzAwMjQwMywgMHhhZmEyMDAxNCwgMHg4MDAxZTgzLCAKKzB4M2MwMjA4MDAsIDB4MjAyMSwgMHg0MjhjMCwgMHhiNzEwMjEsIAorMHg5NDQzNzc3ZSwgMHg5NzQyMDIxMiwgMHg1NDYyMDAyYiwgMHgyNDg0MDAwMSwgCisweGI3MTAyMSwgMHg4YzQzNzc4MCwgMHg4ZjQyMDIxNCwgMHg1NDYyMDAyNiwgCisweDI0ODQwMDAxLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwgCisweDI0NDJmZmZmLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyODNiNCwgCisweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwgMHg4MDkwMjEsIAorMHgyNDIxMDJiLCAweDEwNDAwMDBlLCAweDI0YjE3NzdjLCAweDI0YjA3Nzg0LCAKKzB4MmYwMjAyMSwgMHgyZjEyODIxLCAweGMwMDI0OTAsIDB4MjQwNjAwMDgsIAorMHgyNjMxMDAwOCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzYjQsIAorMHgyNjUyMDAwMSwgMHgyNDIxMDJiLCAweDE0NDBmZmY1LCAweDI2MTAwMDA4LCAKKzB4M2MwNDAwMDEsIDB4OTcyMDIxLCAweDhjODQ4M2I0LCAweDI0MDUwMDA4LCAKKzB4NDIwYzAsIDB4MjQ4NDc3N2MsIDB4YzAwMjQ4OCwgMHgyZTQyMDIxLCAKKzB4ODAwMWU4MywgMHgzYzAyMDgwMCwgMHgyYzgyMDA4MCwgMHgxNDQwZmZjZiwgCisweDQyOGMwLCAweDNjMDIwODAwLCAweDM0NDIyMDAwLCAweGFmYTIwMDE4LCAKKzB4OGVlMjA2MDgsIDB4OGY0MzAyMjgsIDB4MjQ0MjAwMDEsIDB4MzA0YTAwZmYsIAorMHg1MTQzMDBmZCwgMHhhZmEwMDAxMCwgMHg4ZWUyMDYwOCwgMHgyMTBjMCwgCisweDU3MTAyMSwgMHg4ZmEzMDAxOCwgMHg4ZmE0MDAxYywgMHhhYzQzMDYwYywgCisweGFjNDQwNjEwLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NjkwMDMyLCAKKzB4MTIyMTAyMywgMHgyYzQyMDAzMywgMHgxMDQwMDA2YSwgMHg1ODIxLCAKKzB4MjQxMDAwMDgsIDB4MjQwZjAwMGQsIDB4MjQwZDAwMDcsIDB4MjQwYzAwNDAsIAorMHgyNDBlMDAwMSwgMHg4Zjg3MDEyMCwgMHgyNzYyMzgwMCwgMHgyNGU4MDAyMCwgCisweDEwMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2ODMwMDAsIDB4OGY4MjAxMjgsIAorMHgxMTAyMDAwNCwgMHgwLCAweDhmODIwMTI0LCAweDE1MDIwMDA3LCAKKzB4MTAyMSwgMHg4ZWUyMDFhNCwgMHgzODIxLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxYTQsIDB4ODAwMWVmYiwgMHg4ZWUyMDFhNCwgMHg4ZWU0MDYwOCwgCisweDQyMGMwLCAweDgwMTgyMSwgMHg4ZWU0MDQzMCwgMHg4ZWU1MDQzNCwgCisweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAweDg2MjAyMSwgCisweGFjZTQwMDAwLCAweGFjZTUwMDA0LCAweDhlZTIwNjA4LCAweGE0ZjAwMDBlLCAKKzB4YWNlZjAwMTgsIDB4YWNlYTAwMWMsIDB4MjEwYzAsIDB4MjQ0MjA2MGMsIAorMHgyZTIxMDIxLCAweGFjZTIwMDA4LCAweDhlZTIwNGM0LCAweGFjZTIwMDEwLCAKKzB4YWY4ODAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzMsIDB4MjQwNzAwMDEsIAorMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAKKzB4OGM4MjAwMDAsIDB4MTQ0ZDAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwgCisweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDAsIDB4OGM4MjAwMDQsIAorMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwgCisweDI0NDIwMDAxLCAweDEwNGMwMDA3LCAweDAsIDB4OGVlMjRlMzQsIAorMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLCAweDgwMDFlZTgsIAorMHgwLCAweDE0NjAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIAorMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgCisweDJjNDIwMDExLCAweDUwNDAwMDEwLCAweGFjODAwMDAwLCAweDgwMDFlZmIsIAorMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweDUwNGMwMDAzLCAKKzB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgCisweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIAorMHhhYzhkMDAwMCwgMHhhYzhlMDAwNCwgMHg1NGUwMDAwNiwgMHgyNDBiMDAwMSwgCisweDhmODIwMDU0LCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIDB4MTQ0MGZmOWQsIAorMHgwLCAweDMxNjMwMGZmLCAweDI0MDIwMDAxLCAweDU0NjIwMDc4LCAKKzB4YWZhMDAwMTAsIDB4YWVlYTA2MDgsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIAorMHgyNDY5MDAzMiwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAweDEwNDAwMDYxLCAKKzB4NTgyMSwgMHgyNDBlMDAwOCwgMHgyNDBkMDAxMSwgMHgyNDBhMDAxMiwgCisweDI0MDgwMDQwLCAweDI0MGMwMDAxLCAweDhmODMwMTIwLCAweDI3NjIzODAwLCAKKzB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjYzMDAwLCAKKzB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwgCisweDE0YzIwMDA3LCAweDAsIDB4OGVlMjAxYTQsIDB4MzgyMSwgCisweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDFmNjcsIDB4OGVlMjAxYTQsIAorMHg4ZWUyMDYwOCwgMHhhYzYyMDAxYywgMHg4ZWU0MDRhMCwgMHg4ZWU1MDRhNCwgCisweDI0NjIwMDFjLCAweGFjNjIwMDA4LCAweGE0NmUwMDBlLCAweGFjNmQwMDE4LCAKKzB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIAorMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywgMHgyNDA3MDAwMSwgCisweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIAorMHg4YzgyMDAwMCwgMHgxNDRhMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAKKzB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MCwgMHg4YzgyMDAwNCwgCisweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLCAKKzB4MjQ0MjAwMDEsIDB4MTA0ODAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwgCisweDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsIDB4ODAwMWY1NCwgCisweDAsIDB4MTQ2MDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwgCisweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LCAKKzB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsIDB4ODAwMWY2NywgCisweDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4NTA0ODAwMDMsIAorMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAKKzB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgCisweGFjOGEwMDAwLCAweGFjOGMwMDA0LCAweDU0ZTAwMDA2LCAweDI0MGIwMDAxLCAKKzB4OGY4MjAwNTQsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywgMHgxNDQwZmZhNiwgCisweDAsIDB4MzE2MzAwZmYsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMjIsIAorMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ1MzkwLCAweGFmYTAwMDEwLCAKKzB4YWZhMDAwMTQsIDB4OGY4NjAxMjAsIDB4OGY4NzAxMjQsIDB4M2MwNTAwMDksIAorMHhjMDAyNDAzLCAweDM0YTVmMDExLCAweDgwMDFmOTMsIDB4MCwgCisweDNjMDQwMDAxLCAweDI0ODQ1MzljLCAweGFmYTAwMDE0LCAweDhmODYwMTIwLCAKKzB4OGY4NzAxMjQsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgMHgzNGE1ZjAxMCwgCisweDgwMDFmOTMsIDB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTNhOCwgCisweGFmYTAwMDE0LCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LCAweDNjMDUwMDA5LCAKKzB4YzAwMjQwMywgMHgzNGE1ZjAwZiwgMHg4ZWUyMDFhYywgMHgyNDQyMDAwMSwgCisweGFlZTIwMWFjLCAweDhlZTIwMWFjLCAweDhlZTIwMTI4LCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxMjgsIDB4OGVlMjAxMjgsIDB4OGVlMjAxNjQsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDE2NCwgMHg4MDAyMmU4LCAweDhlZTIwMTY0LCAweDhmYTIwMDIwLCAKKzB4MjEyMDAsIDB4MjFkMDIsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMDUsIAorMHgyNDAyMDAwMiwgMHgxMDYyMDAwZCwgMHgwLCAweDgwMDFmYjcsIAorMHhhZmEwMDAxMCwgMHg5MmUyMDRkOCwgMHgxNDQwMDAwNiwgMHgyNDAyMDAwMSwgCisweDhmODIwMjI4LCAweGFlZTIwNGRjLCAweDI0MDJmZmZmLCAweGFmODIwMjI4LCAKKzB4MjQwMjAwMDEsIDB4ODAwMWZiZSwgMHhhMmUyMDRkOCwgMHg5MmUyMDRkOCwgCisweDUwNDAwMDBjLCAweGEyZTAwNGQ4LCAweDhlZTIwNGRjLCAweGFmODIwMjI4LCAKKzB4ODAwMWZiZSwgMHhhMmUwMDRkOCwgMHgzYzA0MDAwMSwgMHgyNDg0NTNjOCwgCisweGFmYTAwMDE0LCAweDhmYTYwMDIwLCAweDNjMDUwMDAzLCAweGMwMDI0MDMsIAorMHgzNGE1ZjAwOSwgMHg4ZWUyMDEzYywgMHgyNDQyMDAwMSwgMHhhZWUyMDEzYywgCisweDgwMDIyZTgsIDB4OGVlMjAxM2MsIDB4OGZhMjAwMjAsIDB4MjEyMDAsIAorMHgyMjUwMiwgMHgyNDAyMDAwMSwgMHgxMDgyMDAwNSwgMHgyNDAyMDAwMiwgCisweDEwODIwMDBmLCAweDAsIDB4ODAwMWZlMywgMHhhZmEwMDAxMCwgCisweDhmODIwMjIwLCAweDNjMDMwOGZmLCAweDM0NjNmZmZmLCAweDQzMTAyNCwgCisweDM0NDIwMDA4LCAweGFmODIwMjIwLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAKKzB4MzcwODIxLCAweGEwMjI4M2IyLCAweDgwMDFmZWEsIDB4YWVlNDAxMDgsIAorMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgMHgzNDYzZmZmNywgMHg0MzEwMjQsIAorMHhhZjgyMDIyMCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDgzYjIsIAorMHg4MDAxZmVhLCAweGFlZTQwMTA4LCAweDNjMDQwMDAxLCAweDI0ODQ1M2Q0LCAKKzB4YWZhMDAwMTQsIDB4OGZhNjAwMjAsIDB4M2MwNTAwMDMsIDB4YzAwMjQwMywgCisweDM0YTVmMDBhLCAweDhlZTIwMTJjLCAweDI0NDIwMDAxLCAweGFlZTIwMTJjLCAKKzB4ODAwMjJlOCwgMHg4ZWUyMDEyYywgMHg4ZmEyMDAyMCwgMHgyMTIwMCwgCisweDIxZDAyLCAweDI0MDIwMDAxLCAweDEwNjIwMDA1LCAweDI0MDIwMDAyLCAKKzB4MTA2MjAwMGUsIDB4MCwgMHg4MDAyMDExLCAweGFmYTAwMDEwLCAKKzB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAKKzB4MzQ0MjAwMDgsIDB4YWY4MjAyMjAsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIAorMHgzNzA4MjEsIDB4ODAwMjAxOCwgMHhhMDIyODNiMywgMHgzYzAyMDAwMSwgCisweDU3MTAyMSwgMHg5MDQyODNiMiwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHgxNDQwMDAwZSwgMHhhMDIwODNiMywgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgCisweDM0NjNmZmY3LCAweDQzMTAyNCwgMHg4MDAyMDE4LCAweGFmODIwMjIwLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDUzZTAsIDB4YWZhMDAwMTQsIDB4OGZhNjAwMjAsIAorMHgzYzA1MDAwMywgMHhjMDAyNDAzLCAweDM0YTVmMDBiLCAweDhlZTIwMTE0LCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxMTQsIDB4ODAwMjJlOCwgMHg4ZWUyMDExNCwgCisweDI3ODQwMjA4LCAweDI3NDUwMjAwLCAweGMwMDI0OWEsIDB4MjQwNjAwMDgsIAorMHgyNmU0MDA5NCwgMHgyNzQ1MDIwMCwgMHhjMDAyNDlhLCAweDI0MDYwMDA4LCAKKzB4OGVlMjAxMzQsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxMzQsIDB4ODAwMjJlOCwgCisweDhlZTIwMTM0LCAweDhmNDYwMjQ4LCAweDIwMjEsIDB4YzAwNTEwOCwgCisweDI0MDUwMDA0LCAweDhlZTIwMTMwLCAweDI0NDIwMDAxLCAweGFlZTIwMTMwLCAKKzB4ODAwMjJlOCwgMHg4ZWUyMDEzMCwgMHg4ZWYzMDFjYywgMHg4ZWY0MDFkMCwgCisweDhlZjUwMWQ4LCAweDhlZTIwMTQwLCAweDI2ZTQwMDMwLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxNDAsIDB4OGVmMDAxNDAsIDB4OGVmMTAwNzQsIDB4OGVmMjAwNzAsIAorMHhjMDAyNDg4LCAweDI0MDUwNDAwLCAweGFlZjMwMWNjLCAweGFlZjQwMWQwLCAKKzB4YWVmNTAxZDgsIDB4YWVmMDAxNDAsIDB4YWVmMTAwNzQsIDB4YWVmMjAwNzAsIAorMHg4ZjQyMDI1YywgMHgyNmU0MDA5NCwgMHhhZWUyMDA2MCwgMHg4ZjQyMDI2MCwgCisweDI3NDUwMjAwLCAweDI0MDYwMDA4LCAweGFlZTIwMDY4LCAweDI0MDIwMDA2LCAKKzB4YzAwMjQ5YSwgMHhhZWUyMDA2NCwgMHgzYzAyM2I5YSwgMHgzNDQyY2EwMCwgCisweGFlZTIwMDZjLCAweDI0MDIwM2U4LCAweDI0MDQwMDAyLCAweDI0MDMwMDAxLCAKKzB4YWVlMjAxMDQsIDB4YWVlNDAxMDAsIDB4YWVlMzAxMGMsIDB4OGY4MjAyMjAsIAorMHgzMDQyMDAwOCwgMHgxMDQwMDAwNCwgMHgwLCAweGFlZTMwMTA4LCAKKzB4ODAwMjA2MSwgMHgyMDIxLCAweGFlZTQwMTA4LCAweDIwMjEsIAorMHgzYzAzMDAwMSwgMHg2NDE4MjEsIDB4OTA2MzVjMzAsIDB4MmU0MTAyMSwgCisweDI0ODQwMDAxLCAweGEwNDMwMDljLCAweDJjODIwMDBmLCAweDE0NDBmZmY4LCAKKzB4MCwgMHg4ZjgyMDA0MCwgMHgyZTQxODIxLCAweDI0ODQwMDAxLCAKKzB4MjE3MDIsIDB4MjQ0MjAwMzAsIDB4YTA2MjAwOWMsIDB4MmU0MTAyMSwgCisweDgwMDIyZTgsIDB4YTA0MDAwOWMsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIAorMHgzNzA4MjEsIDB4YTAyMjgzZTAsIDB4MjQwYjA0MDAsIDB4MjQwODAwMTQsIAorMHgyNDBhMDA0MCwgMHgyNDA5MDAwMSwgMHg4ZjgzMDEwMCwgMHgyNzYyMzAwMCwgCisweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY2MjgwMCwgCisweDhmODIwMTA4LCAweDEwYzIwMDA0LCAweDAsIDB4OGY4MjAxMDQsIAorMHgxNGMyMDAwNywgMHgyNmUyMDAzMCwgMHg4ZWUyMDFhOCwgMHgzODIxLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxYTgsIDB4ODAwMjBhOCwgMHg4ZWUyMDFhOCwgCisweDhlZTQwNGI4LCAweDhlZTUwNGJjLCAweGFjNjIwMDA4LCAweGE0NmIwMDBlLCAKKzB4YWM2ODAwMTgsIDB4YWM2MDAwMWMsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIAorMHg4ZWUyMDRjYywgMHhhYzYyMDAxMCwgMHhhZjg2MDEwMCwgMHg5MmUyMDRlYywgCisweDE0NDAwMDBlLCAweDI0MDcwMDAxLCAweDhlZTI0ZTI4LCAweDI0NDIwMDAxLCAKKzB4NTA0YTAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUyOCwgMHgyNDQyMDAwMSwgCisweGFlZTI0ZTI4LCAweDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LCAKKzB4MmUyMTAyMSwgMHhhYzQ4MDAwMCwgMHhhYzQ5MDAwNCwgMHgxMGUwZmZkMiwgCisweDAsIDB4ODAwMjJlOCwgMHgwLCAweDNjMDIwOTAwLCAKKzB4YWVlMDUyMzgsIDB4YWVlMDUyM2MsIDB4YWVlMDUyNDAsIDB4YWVlMDUyNDQsIAorMHhhZWUwMDFkMCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDgzYjEsIAorMHhhZmEyMDAxOCwgMHg4ZWUyMDYwOCwgMHg4ZjQzMDIyOCwgMHgyNDQyMDAwMSwgCisweDMwNGEwMGZmLCAweDUxNDMwMGZkLCAweGFmYTAwMDEwLCAweDhlZTIwNjA4LCAKKzB4MjEwYzAsIDB4NTcxMDIxLCAweDhmYTMwMDE4LCAweDhmYTQwMDFjLCAKKzB4YWM0MzA2MGMsIDB4YWM0NDA2MTAsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIAorMHgyNDY5MDAzMiwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAweDEwNDAwMDZhLCAKKzB4NTgyMSwgMHgyNDEwMDAwOCwgMHgyNDBmMDAwZCwgMHgyNDBkMDAwNywgCisweDI0MGMwMDQwLCAweDI0MGUwMDAxLCAweDhmODcwMTIwLCAweDI3NjIzODAwLCAKKzB4MjRlODAwMjAsIDB4MTAyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY4MzAwMCwgCisweDhmODIwMTI4LCAweDExMDIwMDA0LCAweDAsIDB4OGY4MjAxMjQsIAorMHgxNTAyMDAwNywgMHgxMDIxLCAweDhlZTIwMWE0LCAweDM4MjEsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAyMTJjLCAweDhlZTIwMWE0LCAKKzB4OGVlNDA2MDgsIDB4NDIwYzAsIDB4ODAxODIxLCAweDhlZTQwNDMwLCAKKzB4OGVlNTA0MzQsIDB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsIAorMHg4NjIwMjEsIDB4YWNlNDAwMDAsIDB4YWNlNTAwMDQsIDB4OGVlMjA2MDgsIAorMHhhNGYwMDAwZSwgMHhhY2VmMDAxOCwgMHhhY2VhMDAxYywgMHgyMTBjMCwgCisweDI0NDIwNjBjLCAweDJlMjEwMjEsIDB4YWNlMjAwMDgsIDB4OGVlMjA0YzQsIAorMHhhY2UyMDAxMCwgMHhhZjg4MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywgCisweDI0MDcwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAKKzB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgMHgxNDRkMDAxZiwgMHgwLCAKKzB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MCwgCisweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAKKzB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA0YzAwMDcsIDB4MCwgCisweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsIAorMHg4MDAyMTE5LCAweDAsIDB4MTQ2MDAwMDUsIDB4MCwgCisweDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAKKzB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsIAorMHg4MDAyMTJjLCAweDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIAorMHg1MDRjMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAKKzB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIAorMHgyZTIyMDIxLCAweGFjOGQwMDAwLCAweGFjOGUwMDA0LCAweDU0ZTAwMDA2LCAKKzB4MjQwYjAwMDEsIDB4OGY4MjAwNTQsIDB4MTIyMTAyMywgMHgyYzQyMDAzMywgCisweDE0NDBmZjlkLCAweDAsIDB4MzE2MzAwZmYsIDB4MjQwMjAwMDEsIAorMHg1NDYyMDA3OCwgMHhhZmEwMDAxMCwgMHhhZWVhMDYwOCwgMHg4ZjgzMDA1NCwgCisweDhmODIwMDU0LCAweDI0NjkwMDMyLCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIAorMHgxMDQwMDA2MSwgMHg1ODIxLCAweDI0MGUwMDA4LCAweDI0MGQwMDExLCAKKzB4MjQwYTAwMTIsIDB4MjQwODAwNDAsIDB4MjQwYzAwMDEsIDB4OGY4MzAxMjAsIAorMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsIAorMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLCAKKzB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsIDB4MCwgMHg4ZWUyMDFhNCwgCisweDM4MjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMjE5OCwgCisweDhlZTIwMWE0LCAweDhlZTIwNjA4LCAweGFjNjIwMDFjLCAweDhlZTQwNGEwLCAKKzB4OGVlNTA0YTQsIDB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIDB4YTQ2ZTAwMGUsIAorMHhhYzZkMDAxOCwgMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwgCisweGFjNjIwMDEwLCAweGFmODYwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDMzLCAKKzB4MjQwNzAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIAorMHgyZTIyMDIxLCAweDhjODIwMDAwLCAweDE0NGEwMDFmLCAweDAsIAorMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLCAKKzB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIAorMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDQ4MDAwNywgMHgwLCAKKzB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwgCisweDgwMDIxODUsIDB4MCwgMHgxNDYwMDAwNSwgMHgwLCAKKzB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIAorMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwgCisweDgwMDIxOTgsIDB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgCisweDUwNDgwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIAorMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgCisweDJlMjIwMjEsIDB4YWM4YTAwMDAsIDB4YWM4YzAwMDQsIDB4NTRlMDAwMDYsIAorMHgyNDBiMDAwMSwgMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLCAweDJjNDIwMDMzLCAKKzB4MTQ0MGZmYTYsIDB4MCwgMHgzMTYzMDBmZiwgMHgyNDAyMDAwMSwgCisweDEwNjIwMDIyLCAweDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUzOTAsIAorMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4Zjg2MDEyMCwgMHg4Zjg3MDEyNCwgCisweDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMTEsIDB4ODAwMjFjNCwgCisweDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDUzOWMsIDB4YWZhMDAwMTQsIAorMHg4Zjg2MDEyMCwgMHg4Zjg3MDEyNCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAKKzB4MzRhNWYwMTAsIDB4ODAwMjFjNCwgMHgwLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDUzYTgsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIAorMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDBmLCAweDhlZTIwMWFjLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxYWMsIDB4OGVlMjAxYWMsIDB4OGVlMjAxMjAsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDEyMCwgMHg4ZWUyMDEyMCwgMHg4ZWUyMDE2OCwgCisweDI0NDIwMDAxLCAweGFlZTIwMTY4LCAweDgwMDIyZTgsIDB4OGVlMjAxNjgsIAorMHg4ZjQyMDI1YywgMHgyNmU0MDA5NCwgMHhhZWUyMDA2MCwgMHg4ZjQyMDI2MCwgCisweDI3NDUwMjAwLCAweDI0MDYwMDA4LCAweGMwMDI0OWEsIDB4YWVlMjAwNjgsIAorMHg4ZjgyMDIyMCwgMHgzMDQyMDAwOCwgMHgxNDQwMDAwMiwgMHgyNDAyMDAwMSwgCisweDI0MDIwMDAyLCAweGFlZTIwMTA4LCAweDhlZTIwMTFjLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxMWMsIDB4ODAwMjJlOCwgMHg4ZWUyMDExYywgMHgzYzA0MDAwMSwgCisweDI0ODQ1M2VjLCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmYTYwMDIwLCAKKzB4M2MwNTAwMDMsIDB4YzAwMjQwMywgMHgzNGE1ZjAwZiwgMHg5M2EyMDAyMCwgCisweDNjMDMwNzAwLCAweDM0NjMxMDAwLCAweDQzMTAyNSwgMHhhZmEyMDAxOCwgCisweDhlZTIwNjA4LCAweDhmNDMwMjI4LCAweDI0NDIwMDAxLCAweDMwNDkwMGZmLCAKKzB4NTEyMzAwZTIsIDB4YWZhMDAwMTAsIDB4OGVlMjA2MDgsIDB4MjEwYzAsIAorMHg1NzEwMjEsIDB4OGZhMzAwMTgsIDB4OGZhNDAwMWMsIDB4YWM0MzA2MGMsIAorMHhhYzQ0MDYxMCwgMHg4Zjg3MDEyMCwgMHgyNzYyMzgwMCwgMHgyNGU4MDAyMCwgCisweDEwMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2ODMwMDAsIDB4OGY4MjAxMjgsIAorMHgxMTAyMDAwNCwgMHgwLCAweDhmODIwMTI0LCAweDE1MDIwMDA3LCAKKzB4MTAyMSwgMHg4ZWUyMDFhNCwgMHgzODIxLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxYTQsIDB4ODAwMjI1ZCwgMHg4ZWUyMDFhNCwgMHg4ZWU0MDYwOCwgCisweDQyMGMwLCAweDgwMTgyMSwgMHg4ZWU0MDQzMCwgMHg4ZWU1MDQzNCwgCisweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAweDg2MjAyMSwgCisweGFjZTQwMDAwLCAweGFjZTUwMDA0LCAweDhlZTMwNjA4LCAweDI0MDIwMDA4LCAKKzB4YTRlMjAwMGUsIDB4MjQwMjAwMGQsIDB4YWNlMjAwMTgsIDB4YWNlOTAwMWMsIAorMHgzMThjMCwgMHgyNDYzMDYwYywgMHgyZTMxMDIxLCAweGFjZTIwMDA4LCAKKzB4OGVlMjA0YzQsIDB4YWNlMjAwMTAsIDB4YWY4ODAxMjAsIDB4OTJlMjRlMjAsIAorMHgxNDQwMDAzNywgMHgyNDA3MDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIDB4MjQwMjAwMDcsIAorMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAKKzB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIAorMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWU1NGUzMCwgMHgyNDQyMDAwMSwgCisweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIAorMHgxMGEyMDAwNSwgMHgwLCAweDgwMDIyNDcsIDB4MCwgCisweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIAorMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgCisweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDIyNWQsIDB4MCwgCisweDhlZTI0ZTMwLCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLCAKKzB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgCisweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIAorMHgyNDAyMDAwNywgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgCisweDU0ZTAwMDBjLCAweGFlZTkwNjA4LCAweDNjMDQwMDAxLCAweDI0ODQ1M2Y0LCAKKzB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIAorMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDAwLCAweDgwMDIyZTAsIAorMHgwLCAweDhmODMwMTIwLCAweDI3NjIzODAwLCAweDI0NjYwMDIwLCAKKzB4YzIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjYzMDAwLCAweDhmODIwMTI4LCAKKzB4MTBjMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgCisweDAsIDB4OGVlMjAxYTQsIDB4MzgyMSwgMHgyNDQyMDAwMSwgCisweGFlZTIwMWE0LCAweDgwMDIyYzQsIDB4OGVlMjAxYTQsIDB4OGVlMjA2MDgsIAorMHhhYzYyMDAxYywgMHg4ZWU0MDRhMCwgMHg4ZWU1MDRhNCwgMHgyNDYyMDAxYywgCisweGFjNjIwMDA4LCAweDI0MDIwMDA4LCAweGE0NjIwMDBlLCAweDI0MDIwMDExLCAKKzB4YWM2MjAwMTgsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIAorMHhhYzYyMDAxMCwgMHhhZjg2MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgCisweDI0MDcwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAKKzB4MmUyMjAyMSwgMHg4YzgzMDAwMCwgMHgyNDAyMDAxMiwgMHgxNDYyMDAxZiwgCisweDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIAorMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgCisweDhlZTI0ZTM0LCAweDhlZTU0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAKKzB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgCisweDAsIDB4ODAwMjJhZSwgMHgwLCAweDE0YTAwMDA1LCAKKzB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgCisweDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLCAKKzB4YWM4MDAwMDAsIDB4ODAwMjJjNCwgMHgwLCAweDhlZTI0ZTMwLCAKKzB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgCisweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAKKzB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAxMiwgCisweGFjODIwMDAwLCAweDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDE0ZTAwMDFiLCAKKzB4MCwgMHgzYzA0MDAwMSwgMHgyNDg0NTNmYywgMHhhZmEwMDAxMCwgCisweGFmYTAwMDE0LCAweDhlZTYwNjA4LCAweDhmNDcwMjI4LCAweDNjMDUwMDA5LCAKKzB4YzAwMjQwMywgMHgzNGE1ZjAwMSwgMHg4ZWUyMDFiMCwgMHgyNDQyMDAwMSwgCisweGFlZTIwMWIwLCAweDgwMDIyZTAsIDB4OGVlMjAxYjAsIDB4M2MwNDAwMDEsIAorMHgyNDg0NTQwOCwgMHhhZmEwMDAxNCwgMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgCisweDNjMDUwMDA5LCAweGMwMDI0MDMsIDB4MzRhNWYwMDUsIDB4OGVlMjAxYWMsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFhYywgMHg4ZWUyMDFhYywgMHg4ZWUyMDE1MCwgCisweDI0NDIwMDAxLCAweGFlZTIwMTUwLCAweDhlZTIwMTUwLCAweDhlZTIwMTYwLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxNjAsIDB4OGVlMjAxNjAsIDB4OGY0MzAyMmMsIAorMHg4ZjQyMDEwYywgMHgxNDYyMDAwOSwgMHgyNDAyMDAwMiwgMHhhZjgyMDA2NCwgCisweDhmODIwMDY0LCAweDE0NDAwMDA1LCAweDAsIDB4OGY0MzAyMmMsIAorMHg4ZjQyMDEwYywgMHgxNDYyZjg3NSwgMHgwLCAweDhmYmYwMDQ0LCAKKzB4OGZiNjAwNDAsIDB4OGZiNTAwM2MsIDB4OGZiNDAwMzgsIDB4OGZiMzAwMzQsIAorMHg4ZmIyMDAzMCwgMHg4ZmIxMDAyYywgMHg4ZmIwMDAyOCwgMHgzZTAwMDA4LCAKKzB4MjdiZDAwNDgsIDB4MjdiZGZmZjgsIDB4MjQwOGZmZmYsIDB4MTBhMDAwMTQsIAorMHg0ODIxLCAweDNjMGFlZGI4LCAweDM1NGE4MzIwLCAweDkwODcwMDAwLCAKKzB4MjQ4NDAwMDEsIDB4MzAyMSwgMHgxMDcxMDI2LCAweDMwNDIwMDAxLCAKKzB4MTA0MDAwMDIsIDB4ODE4NDIsIDB4NmExODI2LCAweDYwNDAyMSwgCisweDI0YzYwMDAxLCAweDJjYzIwMDA4LCAweDE0NDBmZmY3LCAweDczODQyLCAKKzB4MjUyOTAwMDEsIDB4MTI1MTAyYiwgMHgxNDQwZmZmMCwgMHgwLCAKKzB4MTAwMTAyMSwgMHgzZTAwMDA4LCAweDI3YmQwMDA4LCAweDI3YmRmZmU4LCAKKzB4Mjc2NDI4MDAsIDB4YWZiZjAwMTAsIDB4YzAwMjQ4OCwgMHgyNDA1MTAwMCwgCisweDI0MDIwMDIxLCAweGFmODAwMTAwLCAweGFmODAwMTA0LCAweGFmODAwMTA4LCAKKzB4YWY4MDAxMTAsIDB4YWY4MDAxMTQsIDB4YWY4MDAxMTgsIDB4YWY4MDAxMjAsIAorMHhhZjgwMDEyNCwgMHhhZjgwMDEyOCwgMHhhZjgwMDEzMCwgMHhhZjgwMDEzNCwgCisweGFmODAwMTM4LCAweGFlZTA0ZTI4LCAweGFlZTA0ZTJjLCAweGFlZTA0ZTMwLCAKKzB4YWVlMDRlMzQsIDB4YWY4MjAxMWMsIDB4OGY0MjAyMTgsIDB4MzA0MjAwNDAsIAorMHgxMDQwMDAwNCwgMHgwLCAweDhmODIwMTFjLCAweDM0NDIwMDA0LCAKKzB4YWY4MjAxMWMsIDB4OGZiZjAwMTAsIDB4M2UwMDAwOCwgMHgyN2JkMDAxOCwgCisweDI3YmRmZmUwLCAweGFmYmYwMDE4LCAweDhmODIwMTA0LCAweGFmYTIwMDEwLCAKKzB4OGY4MjAxMDAsIDB4M2MwNTAwMDIsIDB4YWZhMjAwMTQsIDB4OGY4NjAwYjAsIAorMHg4Zjg3MDExYywgMHgzYzA0MDAwMSwgMHgyNDg0NTRjMCwgMHhjMDAyNDAzLCAKKzB4MzRhNWYwMDAsIDB4OGY4MzAwYjAsIDB4M2MwMjdmMDAsIDB4NjIxODI0LCAKKzB4M2MwMjA0MDAsIDB4MTA2MjAwMjksIDB4NDMxMDJiLCAweDE0NDAwMDA4LCAKKzB4M2MwMjIwMDAsIDB4M2MwMjAxMDAsIDB4MTA2MjAwMjQsIDB4M2MwMjAyMDAsIAorMHgxMDYyMDAxMSwgMHgwLCAweDgwMDIzNzQsIDB4MCwgCisweDEwNjIwMDA4LCAweDNjMDI0MDAwLCAweDE0NjIwMDFjLCAweDAsIAorMHg4ZWUyMDE5MCwgMHgyNDQyMDAwMSwgMHhhZWUyMDE5MCwgMHg4MDAyMzc0LCAKKzB4OGVlMjAxOTAsIDB4OGVlMjAxOGMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxOGMsIAorMHg4MDAyMzc0LCAweDhlZTIwMThjLCAweDhmODIwMTFjLCAweDM0NDIwMDAyLCAKKzB4YWY4MjAxMWMsIDB4OGY4MzAxMDQsIDB4OGY4MjAwYjAsIDB4MzQ0MjAwMDEsIAorMHhhZjgyMDBiMCwgMHhhZjgzMDEwNCwgMHg4ZjgyMDExYywgMHgyNDAzZmZmZCwgCisweDQzMTAyNCwgMHhhZjgyMDExYywgMHg4ZWUyMDFhMCwgMHgyNDQyMDAwMSwgCisweGFlZTIwMWEwLCAweDgwMDIzNzcsIDB4OGVlMjAxYTAsIDB4OGY4MjAwYjAsIAorMHgzNDQyMDAwMSwgMHhhZjgyMDBiMCwgMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LCAKKzB4MjdiZDAwMjAsIDB4MjdiZGZmZTAsIDB4YWZiZjAwMWMsIDB4YWZiMDAwMTgsIAorMHg4ZjgyMDEyMCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA1MDAwMSwgCisweGFmYTIwMDE0LCAweDhmODYwMGEwLCAweDhmODcwMTFjLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDU0Y2MsIDB4YzAwMjQwMywgMHgzNGE1ZjAwMCwgMHg4ZjgzMDBhMCwgCisweDNjMDI3ZjAwLCAweDYyMTgyNCwgMHgzYzAyMDQwMCwgMHgxMDYyMDA1MywgCisweDgwMjEsIDB4NDMxMDJiLCAweDE0NDAwMDA4LCAweDNjMDQyMDAwLCAKKzB4M2MwMjAxMDAsIDB4MTA2MjAwNGQsIDB4M2MwMjAyMDAsIDB4MTA2MjAwM2EsIAorMHgwLCAweDgwMDIzZTAsIDB4MCwgMHgxMDY0MDAwMywgCisweDNjMDI0MDAwLCAweDE0NjIwMDQ1LCAweDAsIDB4OGY4MjAwYTAsIAorMHg0NDEwMjQsIDB4MTA0MDAwMDYsIDB4MCwgMHg4ZWUyMDE5NCwgCisweDI0NDIwMDAxLCAweGFlZTIwMTk0LCAweDgwMDIzYTksIDB4OGVlMjAxOTQsIAorMHg4ZWUyMDE5OCwgMHgyNDQyMDAwMSwgMHhhZWUyMDE5OCwgMHg4ZWUyMDE5OCwgCisweDhmODIwMTFjLCAweDM0NDIwMDAyLCAweGFmODIwMTFjLCAweDhmODIwMTFjLCAKKzB4MzA0MjAyMDAsIDB4MTA0MDAwMWIsIDB4MCwgMHg4ZjgzMDBhMCwgCisweDhmODQwMTI0LCAweDhmODIwMGFjLCAweDE0NDAwMDA3LCAweDI0MDIwMDAxLCAKKzB4M2MwMjAwMDEsIDB4MzQ0MmYwMDAsIDB4NjIxMDI0LCAweDUwNDAwMDAxLCAKKzB4MjQxMDAwMDEsIDB4MjQwMjAwMDEsIDB4MTIwMDAwMGQsIDB4YWY4MjAwYTAsIAorMHg4ZjgyMDEyNCwgMHgyNDQyZmZlMCwgMHhhZjgyMDEyNCwgMHg4ZjgyMDEyNCwgCisweDhmODIwMTI0LCAweDI3NjMzMDAwLCAweDQzMTAyYiwgMHgxMDQwMDAwNSwgCisweDI3NjIzN2UwLCAweGFmODIwMTI0LCAweDgwMDIzY2EsIDB4MCwgCisweGFmODQwMTI0LCAweDhmODIwMTFjLCAweDI0MDNmZmZkLCAweDQzMTAyNCwgCisweDgwMDIzZTMsIDB4YWY4MjAxMWMsIDB4OGY4MjAxMWMsIDB4MzQ0MjAwMDIsIAorMHhhZjgyMDExYywgMHg4ZjgzMDEyNCwgMHg4ZjgyMDBhMCwgMHgzNDQyMDAwMSwgCisweGFmODIwMGEwLCAweGFmODMwMTI0LCAweDhmODIwMTFjLCAweDI0MDNmZmZkLCAKKzB4NDMxMDI0LCAweGFmODIwMTFjLCAweDhlZTIwMTljLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxOWMsIDB4ODAwMjNlMywgMHg4ZWUyMDE5YywgMHg4ZjgyMDBhMCwgCisweDM0NDIwMDAxLCAweGFmODIwMGEwLCAweDhmYmYwMDFjLCAweDhmYjAwMDE4LCAKKzB4M2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjVjNTgsIDB4MjdiZGZmZTgsIDB4YWZiZjAwMTQsIDB4MTQ0MDAwMTIsIAorMHhhZmIwMDAxMCwgMHgzYzEwMDAwMSwgMHgyNjEwNWRkMCwgMHgyMDAyMDIxLCAKKzB4YzAwMjQ4OCwgMHgyNDA1MjAwMCwgMHgyNjAyMWZlMCwgMHgzYzAxMDAwMSwgCisweGFjMjI1ZDk0LCAweDNjMDEwMDAxLCAweGFjMjI1ZDkwLCAweGFmNDIwMjUwLCAKKzB4MjQwMjIwMDAsIDB4YWY1MDAyNTQsIDB4YWY0MjAyNTgsIDB4MjQwMjAwMDEsIAorMHgzYzAxMDAwMSwgMHhhYzIyNWM1OCwgMHg4ZmJmMDAxNCwgMHg4ZmIwMDAxMCwgCisweDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4M2MwMzAwMDEsIDB4OGM2MzVkOTQsIAorMHg4YzgyMDAwMCwgMHg4ZmE4MDAxMCwgMHg4ZmE5MDAxNCwgMHhhYzYyMDAwMCwgCisweDNjMDIwMDAxLCAweDhjNDI1ZDk0LCAweDhjODMwMDA0LCAweGFjNDMwMDA0LCAKKzB4YWM0NTAwMDgsIDB4OGY4NDAwNTQsIDB4MjQ0M2ZmZTAsIDB4YWM0NjAwMTAsIAorMHhhYzQ3MDAxNCwgMHhhYzQ4MDAxOCwgMHhhYzQ5MDAxYywgMHgzYzAxMDAwMSwgCisweGFjMjM1ZDk0LCAweGFjNDQwMDBjLCAweDNjMDIwMDAxLCAweDI0NDI1ZGQwLCAKKzB4NjIxODJiLCAweDEwNjAwMDA1LCAweDAsIDB4M2MwMjAwMDEsIAorMHg4YzQyNWQ5MCwgMHgzYzAxMDAwMSwgMHhhYzIyNWQ5NCwgMHgzYzAzMDAwMSwgCisweDhjNjM1ZDk0LCAweDNjMDIwMDAxLCAweDhjNDI1YzQwLCAweGFjNjIwMDAwLCAKKzB4M2MwMzAwMDEsIDB4OGM2MzVkOTQsIDB4M2MwMjAwMDEsIDB4OGM0MjVjNDAsIAorMHhhYzYyMDAwNCwgMHgzZTAwMDA4LCAweGFmNDMwMjUwLCAweDNjMDMwMDAxLCAKKzB4OGM2MzVkOTQsIDB4M2MwMjAwMDEsIDB4OGM0MjVjNDAsIDB4MjdiZGZmZDAsIAorMHhhZmI0MDAyMCwgMHg4ZmI0MDA0MCwgMHhhZmIwMDAxMCwgMHg4MDgwMjEsIAorMHhhZmI1MDAyNCwgMHg4ZmI1MDA0NCwgMHg4ZmE0MDA0OCwgMHhhZmIxMDAxNCwgCisweGEwODgyMSwgMHhhZmJmMDAyOCwgMHhhZmIzMDAxYywgMHhhZmIyMDAxOCwgCisweGFjNjIwMDAwLCAweDNjMDUwMDAxLCAweDhjYTU1ZDk0LCAweDNjMDIwMDAxLCAKKzB4OGM0MjVjNDAsIDB4YzA5MDIxLCAweGUwOTgyMSwgMHgxMDgwMDAwNiwgCisweGFjYTIwMDA0LCAweDI0YTUwMDA4LCAweGMwMDI0OTAsIDB4MjQwNjAwMTgsIAorMHg4MDAyNDRlLCAweDAsIDB4MjRhNDAwMDgsIDB4YzAwMjQ4OCwgCisweDI0MDUwMDE4LCAweDNjMDIwMDAxLCAweDhjNDI1ZDk0LCAweDNjMDUwMDAxLCAKKzB4MjRhNTVkZDAsIDB4MjQ0MmZmZTAsIDB4M2MwMTAwMDEsIDB4YWMyMjVkOTQsIAorMHg0NTEwMmIsIDB4MTA0MDAwMDUsIDB4MCwgMHgzYzAyMDAwMSwgCisweDhjNDI1ZDkwLCAweDNjMDEwMDAxLCAweGFjMjI1ZDk0LCAweDNjMDMwMDAxLCAKKzB4OGM2MzVkOTQsIDB4OGUwMjAwMDAsIDB4YWM2MjAwMDAsIDB4M2MwMzAwMDEsIAorMHg4YzYzNWQ5NCwgMHg4ZTAyMDAwNCwgMHhhYzYyMDAwNCwgMHhhYzcxMDAwOCwgCisweDhmODQwMDU0LCAweDI0NjJmZmUwLCAweDNjMDEwMDAxLCAweGFjMjI1ZDk0LCAKKzB4NDUxMDJiLCAweGFjNzIwMDEwLCAweGFjNzMwMDE0LCAweGFjNzQwMDE4LCAKKzB4YWM3NTAwMWMsIDB4MTA0MDAwMDUsIDB4YWM2NDAwMGMsIDB4M2MwMjAwMDEsIAorMHg4YzQyNWQ5MCwgMHgzYzAxMDAwMSwgMHhhYzIyNWQ5NCwgMHgzYzAzMDAwMSwgCisweDhjNjM1ZDk0LCAweDNjMDIwMDAxLCAweDhjNDI1YzQwLCAweGFjNjIwMDAwLCAKKzB4M2MwMzAwMDEsIDB4OGM2MzVkOTQsIDB4M2MwMjAwMDEsIDB4OGM0MjVjNDAsIAorMHhhYzYyMDAwNCwgMHhhZjQzMDI1MCwgMHg4ZmJmMDAyOCwgMHg4ZmI1MDAyNCwgCisweDhmYjQwMDIwLCAweDhmYjMwMDFjLCAweDhmYjIwMDE4LCAweDhmYjEwMDE0LCAKKzB4OGZiMDAwMTAsIDB4M2UwMDAwOCwgMHgyN2JkMDAzMCwgMHgxMGEwMDAwNSwgCisweDAsIDB4YWM4MDAwMDAsIDB4MjRhNWZmZmMsIDB4MTRhMGZmZmQsIAorMHgyNDg0MDAwNCwgMHgzZTAwMDA4LCAweDAsIDB4MTBjMDAwMDcsIAorMHgwLCAweDhjODIwMDAwLCAweDI0ODQwMDA0LCAweDI0YzZmZmZjLCAKKzB4YWNhMjAwMDAsIDB4MTRjMGZmZmIsIDB4MjRhNTAwMDQsIDB4M2UwMDAwOCwgCisweDAsIDB4MTBjMDAwMDcsIDB4MCwgMHg4Y2EyMDAwMCwgCisweDI0YTUwMDA0LCAweDI0YzZmZmZjLCAweGFjODIwMDAwLCAweDE0YzBmZmZiLCAKKzB4MjQ4NDAwMDQsIDB4M2UwMDAwOCwgMHgwLCAweDNlMDAwMDgsIAorMHgwLCAweDI3YmRmZmQ4LCAweGFmYmYwMDIwLCAweDhlZTMwNGU0LCAKKzB4OGVlMjA0ZTAsIDB4MTA2MjA0MzYsIDB4MCwgMHg4ZWUyMDRlNCwgCisweDhlZTMwNGZjLCAweDIxMTAwLCAweDYyNjAyMSwgMHg5NTg3MDAwOCwgCisweDhkOGEwMDAwLCAweDhkOGIwMDA0LCAweDk1OGQwMDBhLCAweDhlZTI3MjVjLCAKKzB4OGVlMzcyNmMsIDB4MzBlNGZmZmYsIDB4NDQxMDIxLCAweDYyMTgyYiwgCisweDEwNjAwMDE1LCAweDMxYTIwMDA0LCAweDhmODIwMGQ4LCAweDhlZTM3MjU4LCAKKzB4NDMxMDIzLCAweGFlZTI3MjZjLCAweDhlZTI3MjZjLCAweDFjNDAwMDAzLCAKKzB4M2MwMzAwMDEsIDB4NDMxMDIxLCAweGFlZTI3MjZjLCAweDhlZTI3MjVjLCAKKzB4OGVlMzcyNmMsIDB4NDQxMDIxLCAweDYyMTgyYiwgMHgxMDYwMDAwNiwgCisweDMxYTIwMDA0LCAweDhlZTIwMWI4LCAweDI0NDIwMDAxLCAweGFlZTIwMWI4LCAKKzB4ODAwMjhlMSwgMHg4ZWUyMDFiOCwgMHgxMDQwMDI0MCwgMHgzMWEyMDIwMCwgCisweDEwNDAwMTRkLCAweDQ4MjEsIDB4OTZlMjA0NWEsIDB4MzA0MjAwMTAsIAorMHgxMDQwMDE0OSwgMHgwLCAweDhmODQwMTAwLCAweDI3NjIzMDAwLCAKKzB4MjQ4NTAwMjAsIDB4YTIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjUyODAwLCAKKzB4OGY4MjAxMDgsIDB4MTBhMjAwMDQsIDB4MCwgMHg4ZjgyMDEwNCwgCisweDE0YTIwMDA2LCAweDI0MDIwMDBjLCAweDhlZTIwMWE4LCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxYTgsIDB4ODAwMjUyYywgMHg4ZWUyMDFhOCwgMHhhYzhhMDAwMCwgCisweGFjOGIwMDA0LCAweDhlZTM3MjY0LCAweDI0MDYwMDA1LCAweGE0ODIwMDBlLCAKKzB4YWM4NjAwMTgsIDB4YWM4MzAwMDgsIDB4OGVlMjA0ZTQsIDB4YWM4MjAwMWMsIAorMHg4ZWUyMDRjOCwgMHhhYzgyMDAxMCwgMHhhZjg1MDEwMCwgMHg5MmUyMDRlYywgCisweDE0NDAwMDM2LCAweDI0MDkwMDAxLCAweDhlZTI0ZTI4LCAweDIxMGMwLCAKKzB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgMHgxNDQ2MDAxZiwgCisweDAsIDB4OGVlMzRlMjgsIDB4OGVlMjRlMmMsIDB4MTA2MjAwMWIsIAorMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgCisweDhlZTI0ZTJjLCAweDhlZTU0ZTI4LCAweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAKKzB4MCwgMHg4ZWUyNGUyYywgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgCisweDAsIDB4ODAwMjUxNiwgMHgwLCAweDE0YTAwMDA1LCAKKzB4MCwgMHg4ZjgyMDEwOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEwOCwgCisweDhmODIwMTA4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLCAKKzB4YWM4MDAwMDAsIDB4ODAwMjUyYywgMHgwLCAweDhlZTI0ZTI4LCAKKzB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgCisweDhlZTI0ZTI4LCAweDI0NDIwMDAxLCAweGFlZTI0ZTI4LCAweDhlZTI0ZTI4LCAKKzB4MjEwYzAsIDB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAwNSwgCisweGFjODIwMDAwLCAweDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDE1MjAwMDBhLCAKKzB4M2MwNDAwMDEsIDB4YWZhYjAwMTAsIDB4OGVlMjcyNjQsIDB4M2MwNDAwMDEsIAorMHgyNDg0NTczMCwgMHgzYzA1MDAwNCwgMHhhZmEyMDAxNCwgMHg4ZWU2MDRlNCwgCisweDgwMDI4YmUsIDB4MzRhNWYxMTQsIDB4OGVlMjcyNjQsIDB4MzQ4NDM4MDAsIAorMHgzNjQxODIxLCAweDI0NDIwMDEwLCAweDQzMTAyYiwgMHgxNDQwMDA3MywgCisweDAsIDB4OGVlMjcyNjQsIDB4MjQ0ODAwMTAsIDB4MzY0MTAyMSwgCisweDEwMjEwMmIsIDB4MTQ0MDAwMDIsIDB4M2MwMmZmZmYsIDB4MTAyNDAyMSwgCisweDhmODUwMTAwLCAweDI3NjIzMDAwLCAweDI0YTYwMDIwLCAweGMyMTAyYiwgCisweDUwNDAwMDAxLCAweDI3NjYyODAwLCAweDhmODIwMTA4LCAweDEwYzIwMDA0LCAKKzB4MCwgMHg4ZjgyMDEwNCwgMHgxNGMyMDAwNywgMHgyNTYzMDAwYywgCisweDhlZTIwMWE4LCAweDQ4MjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTgsIAorMHg4MDAyNWEwLCAweDhlZTIwMWE4LCAweDJjNjQwMDBjLCAweDE0NDEwMjEsIAorMHhhY2EyMDAwMCwgMHhhY2EzMDAwNCwgMHgyNGUyZmZmNCwgMHhhNGEyMDAwZSwgCisweDI0MDIwMDA2LCAweGFjYTgwMDA4LCAweGFjYTIwMDE4LCAweDhlZTIwNGU0LCAKKzB4YWNhMjAwMWMsIDB4OGVlMjA0YzgsIDB4M2MwMzAwMDIsIDB4NDMxMDI1LCAKKzB4YWNhMjAwMTAsIDB4YWY4NjAxMDAsIDB4OTJlMjA0ZWMsIDB4MTQ0MDAwMzcsIAorMHgyNDA5MDAwMSwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwgCisweDJlMjIwMjEsIDB4OGM4MzAwMDAsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwMWYsIAorMHgwLCAweDhlZTM0ZTI4LCAweDhlZTI0ZTJjLCAweDEwNjIwMDFiLCAKKzB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIAorMHg4ZWUyNGUyYywgMHg4ZWU1NGUyOCwgMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgCisweDAsIDB4OGVlMjRlMmMsIDB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIAorMHgwLCAweDgwMDI1OGEsIDB4MCwgMHgxNGEwMDAwNSwgCisweDAsIDB4OGY4MjAxMDgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMDgsIAorMHg4ZjgyMDEwOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgCisweGFjODAwMDAwLCAweDgwMDI1YTAsIDB4MCwgMHg4ZWUyNGUyOCwgCisweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLCAweDEwMjEsIAorMHg4ZWUyNGUyOCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUyOCwgMHg4ZWUyNGUyOCwgCisweDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMDUsIAorMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgMHgxNTIwMDAwYSwgCisweDI1MDhmZmZjLCAweGFmYWIwMDEwLCAweDhlZTI3MjY0LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDU3MzAsIDB4M2MwNTAwMDQsIDB4YWZhMjAwMTQsIDB4OGVlNjA0ZTQsIAorMHg4MDAyOGJlLCAweDM0YTVmMTI1LCAweDM0MDI4MTAwLCAweGE1MDIwMDAwLCAKKzB4OTU4MjAwMGUsIDB4ODAwMjYxZCwgMHhhNTAyMDAwMiwgMHg4Zjg1MDEwMCwgCisweDI3NjIzMDAwLCAweDI0YTYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgCisweDI3NjYyODAwLCAweDhmODIwMTA4LCAweDEwYzIwMDA0LCAweDAsIAorMHg4ZjgyMDEwNCwgMHgxNGMyMDAwNywgMHgyNTYzMDAwYywgMHg4ZWUyMDFhOCwgCisweDQ4MjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTgsIDB4ODAwMjYwZCwgCisweDhlZTIwMWE4LCAweDJjNjQwMDBjLCAweDE0NDEwMjEsIDB4YWNhMjAwMDAsIAorMHhhY2EzMDAwNCwgMHg4ZWUzNzI2NCwgMHgyNGUyZmZmNCwgMHhhNGEyMDAwZSwgCisweDI0MDIwMDA2LCAweGFjYTIwMDE4LCAweDI0NjMwMDEwLCAweGFjYTMwMDA4LCAKKzB4OGVlMjA0ZTQsIDB4YWNhMjAwMWMsIDB4OGVlMjA0YzgsIDB4M2MwMzAwMDIsIAorMHg0MzEwMjUsIDB4YWNhMjAwMTAsIDB4YWY4NjAxMDAsIDB4OTJlMjA0ZWMsIAorMHgxNDQwMDAzNywgMHgyNDA5MDAwMSwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwgCisweDI0NDI0ZTM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIDB4MjQwMjAwMDUsIAorMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTI4LCAweDhlZTI0ZTJjLCAKKzB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIAorMHhhYzgyMDAwNCwgMHg4ZWUyNGUyYywgMHg4ZWU1NGUyOCwgMHgyNDQyMDAwMSwgCisweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMmMsIDB4MjQ0MjAwMDEsIAorMHgxMGEyMDAwNSwgMHgwLCAweDgwMDI1ZjcsIDB4MCwgCisweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMDgsIDB4MjQ0MjAwMjAsIAorMHhhZjgyMDEwOCwgMHg4ZjgyMDEwOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgCisweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDI2MGQsIDB4MCwgCisweDhlZTI0ZTI4LCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLCAKKzB4MTAyMSwgMHg4ZWUyNGUyOCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUyOCwgCisweDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjIwMjEsIAorMHgyNDAyMDAwNSwgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgCisweDE1MjAwMDBhLCAweDM0MDI4MTAwLCAweGFmYWIwMDEwLCAweDhlZTI3MjY0LCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDU3MzAsIDB4M2MwNTAwMDQsIDB4YWZhMjAwMTQsIAorMHg4ZWU2MDRlNCwgMHg4MDAyOGJlLCAweDM0YTVmMDE1LCAweDhlZTM3MjY0LCAKKzB4YTQ2MjAwMGMsIDB4OGVlMzcyNjQsIDB4OTU4MjAwMGUsIDB4YTQ2MjAwMGUsIAorMHg4MDAyNjgxLCAweDI0ZTcwMDA0LCAweDhmODQwMTAwLCAweDI3NjIzMDAwLCAKKzB4MjQ4NTAwMjAsIDB4YTIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjUyODAwLCAKKzB4OGY4MjAxMDgsIDB4MTBhMjAwMDQsIDB4MCwgMHg4ZjgyMDEwNCwgCisweDE0YTIwMDA3LCAweDI0MDIwMDA2LCAweDhlZTIwMWE4LCAweDQ4MjEsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFhOCwgMHg4MDAyNjc3LCAweDhlZTIwMWE4LCAKKzB4YWM4YTAwMDAsIDB4YWM4YjAwMDQsIDB4OGVlMzcyNjQsIDB4YTQ4NzAwMGUsIAorMHhhYzgyMDAxOCwgMHhhYzgzMDAwOCwgMHg4ZWUyMDRlNCwgMHhhYzgyMDAxYywgCisweDhlZTIwNGM4LCAweDNjMDMwMDAyLCAweDQzMTAyNSwgMHhhYzgyMDAxMCwgCisweGFmODUwMTAwLCAweDkyZTIwNGVjLCAweDE0NDAwMDM3LCAweDI0MDkwMDAxLCAKKzB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgCisweDhjODMwMDAwLCAweDI0MDIwMDA1LCAweDE0NjIwMDFmLCAweDAsIAorMHg4ZWUzNGUyOCwgMHg4ZWUyNGUyYywgMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgCisweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTJjLCAKKzB4OGVlNTRlMjgsIDB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIDB4MCwgCisweDhlZTI0ZTJjLCAweDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsIAorMHg4MDAyNjYxLCAweDAsIDB4MTRhMDAwMDUsIDB4MCwgCisweDhmODIwMTA4LCAweDI0NDIwMDIwLCAweGFmODIwMTA4LCAweDhmODIwMTA4LCAKKzB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIAorMHg4MDAyNjc3LCAweDAsIDB4OGVlMjRlMjgsIDB4MjQwMzAwNDAsIAorMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTI4LCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjRlMjgsIDB4OGVlMjRlMjgsIDB4MjEwYzAsIAorMHgyNDQyNGUzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDA1LCAweGFjODIwMDAwLCAKKzB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4MTUyMDAwMDksIDB4M2MwNTAwMDQsIAorMHhhZmFiMDAxMCwgMHg4ZWUyNzI2NCwgMHgzYzA0MDAwMSwgMHgyNDg0NTczMCwgCisweGFmYTIwMDE0LCAweDhlZTYwNGU0LCAweDgwMDI4YmUsIDB4MzRhNWYwMDQsIAorMHg4ZWUyNzI1YywgMHgzMGU3ZmZmZiwgMHg0NzEwMjEsIDB4YWVlMjcyNWMsIAorMHg4ZWUyMDRlNCwgMHg4ZWUzMDRmYywgMHg4ZWU0NzI1OCwgMHgyMTEwMCwgCisweDQzMTAyMSwgMHhhYzQ0MDAwYywgMHg4ZWUyNzI1OCwgMHhhZmEyMDAxOCwgCisweDhlZTM3MjVjLCAweGFmYTMwMDFjLCAweDhlZTI3MjVjLCAweDJjNDIwMDNjLCAKKzB4MTA0MDAwMDQsIDB4MjQ2MjAwMDEsIDB4MjQwM2ZmZmUsIDB4NDMxMDI0LCAKKzB4YWZhMjAwMWMsIDB4OGVlMjcyNjQsIDB4M2MwNjAwMDEsIDB4MzRjNjM4MDAsIAorMHg4ZWUzNzI1YywgMHgyNDA1ZmZmOCwgMHg0NzEwMjEsIDB4MjQ0MjAwMDcsIAorMHg0NTEwMjQsIDB4MjQ2MzAwMDcsIDB4YWVlMjcyNTgsIDB4OGVlMjcyNmMsIAorMHg4ZWU0NzI1OCwgMHg2NTE4MjQsIDB4NDMxMDIzLCAweGFlZTI3MjZjLCAKKzB4MzY2MTAyMSwgMHg4MjIwMmIsIDB4MTQ4MDAwMDQsIDB4M2MwM2ZmZmYsIAorMHg4ZWUyNzI1OCwgMHg0MzEwMjEsIDB4YWVlMjcyNTgsIDB4OGVlMjcyNTgsIAorMHhhZWUyNzI2NCwgMHg4ZjgyMDBmMCwgMHgyNDQ3MDAwOCwgMHgyNzYyMTgwMCwgCisweGUyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY3MTAwMCwgMHg4ZjgyMDBmNCwgCisweDE0ZTIwMDA3LCAweDAsIDB4OGVlMjAxYjQsIDB4NDgyMSwgCisweDI0NDIwMDAxLCAweGFlZTIwMWI0LCAweDgwMDI2YzQsIDB4OGVlMjAxYjQsIAorMHg4ZjgyMDBmMCwgMHgyNDA5MDAwMSwgMHg4ZmEzMDAxOCwgMHg4ZmE0MDAxYywgCisweGFjNDMwMDAwLCAweGFjNDQwMDA0LCAweGFmODcwMGYwLCAweDE1MjAwMDEyLCAKKzB4ZDExNDIsIDB4OGY4MjAwZjAsIDB4YWZhMjAwMTAsIDB4OGY4MjAwZjQsIAorMHgzYzA0MDAwMSwgMHgyNDg0NTczYywgMHhhZmEyMDAxNCwgMHg4ZmE2MDAxOCwgCisweDhmYTcwMDFjLCAweDNjMDUwMDA0LCAweGMwMDI0MDMsIDB4MzRhNWYwMDUsIAorMHg4ZWUyMDA4OCwgMHgyNDQyMDAwMSwgMHhhZWUyMDA4OCwgMHg4ZWUyMDA4OCwgCisweDgwMDI4ZDMsIDB4YWVlMDcyNWMsIDB4MzA0MzAwMDMsIDB4MjQwMjAwMDIsIAorMHgxMDYyMDAxNiwgMHgyODYyMDAwMywgMHgxMDQwMDAwNSwgMHgyNDAyMDAwMSwgCisweDEwNjIwMDA4LCAweDAsIDB4ODAwMjcwMywgMHgwLCAKKzB4MjQwMjAwMDMsIDB4MTA2MjAwMTcsIDB4MCwgMHg4MDAyNzAzLCAKKzB4MCwgMHg4ZWUyMDBlOCwgMHg4ZWUzMDBlYywgMHgyNDYzMDAwMSwgCisweDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZWUyMDBlOCwgMHhhZWUzMDBlYywgCisweDhlZTIwMGU4LCAweDgwMDI3MDMsIDB4OGVlMzAwZWMsIDB4OGVlMjAwZjAsIAorMHg4ZWUzMDBmNCwgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsIAorMHhhZWUyMDBmMCwgMHhhZWUzMDBmNCwgMHg4ZWUyMDBmMCwgMHg4MDAyNzAzLCAKKzB4OGVlMzAwZjQsIDB4OGVlMjAwZjgsIDB4OGVlMzAwZmMsIDB4MjQ2MzAwMDEsIAorMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZjgsIDB4YWVlMzAwZmMsIAorMHg4ZWUyMDBmOCwgMHg4ZWUzMDBmYywgMHg4ZWUyNzI1YywgMHg4ZWU0MDBlMCwgCisweDhlZTUwMGU0LCAweDQwMTgyMSwgMHgxMDIxLCAweGEzMjgyMSwgCisweGEzMzAyYiwgMHg4MjIwMjEsIDB4ODYyMDIxLCAweGFlZTQwMGUwLCAKKzB4YWVlNTAwZTQsIDB4ODAwMjhkMywgMHhhZWUwNzI1YywgMHgzMGUyZmZmZiwgCisweDEwNDAwMWMxLCAweDMxYTIwMjAwLCAweDEwNDAwMTRkLCAweDQ4MjEsIAorMHg5NmUyMDQ1YSwgMHgzMDQyMDAxMCwgMHgxMDQwMDE0OSwgMHgwLCAKKzB4OGY4NDAxMDAsIDB4Mjc2MjMwMDAsIDB4MjQ4NTAwMjAsIDB4YTIxMDJiLCAKKzB4NTA0MDAwMDEsIDB4Mjc2NTI4MDAsIDB4OGY4MjAxMDgsIDB4MTBhMjAwMDQsIAorMHgwLCAweDhmODIwMTA0LCAweDE0YTIwMDA2LCAweDI0MDIwMDBjLCAKKzB4OGVlMjAxYTgsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTgsIDB4ODAwMjc2ZSwgCisweDhlZTIwMWE4LCAweGFjOGEwMDAwLCAweGFjOGIwMDA0LCAweDhlZTM3MjY0LCAKKzB4MjQwNjAwMDUsIDB4YTQ4MjAwMGUsIDB4YWM4NjAwMTgsIDB4YWM4MzAwMDgsIAorMHg4ZWUyMDRlNCwgMHhhYzgyMDAxYywgMHg4ZWUyMDRjOCwgMHhhYzgyMDAxMCwgCisweGFmODUwMTAwLCAweDkyZTIwNGVjLCAweDE0NDAwMDM2LCAweDI0MDkwMDAxLCAKKzB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgCisweDhjODIwMDAwLCAweDE0NDYwMDFmLCAweDAsIDB4OGVlMzRlMjgsIAorMHg4ZWUyNGUyYywgMHgxMDYyMDAxYiwgMHgyNDAzMDA0MCwgMHg4YzgyMDAwNCwgCisweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTJjLCAweDhlZTU0ZTI4LCAKKzB4MjQ0MjAwMDEsIDB4MTA0MzAwMDcsIDB4MCwgMHg4ZWUyNGUyYywgCisweDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsIDB4ODAwMjc1OCwgCisweDAsIDB4MTRhMDAwMDUsIDB4MCwgMHg4ZjgyMDEwOCwgCisweDI0NDIwMDIwLCAweGFmODIwMTA4LCAweDhmODIwMTA4LCAweDhjODIwMDA0LCAKKzB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIDB4ODAwMjc2ZSwgCisweDAsIDB4OGVlMjRlMjgsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIAorMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTI4LCAweDI0NDIwMDAxLCAKKzB4YWVlMjRlMjgsIDB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsIAorMHgyZTIyMDIxLCAweDI0MDIwMDA1LCAweGFjODIwMDAwLCAweDI0MDIwMDAxLCAKKzB4YWM4MjAwMDQsIDB4MTUyMDAwMGEsIDB4M2MwNDAwMDEsIDB4YWZhYjAwMTAsIAorMHg4ZWUyNzI2NCwgMHgzYzA0MDAwMSwgMHgyNDg0NTczMCwgMHgzYzA1MDAwNCwgCisweGFmYTIwMDE0LCAweDhlZTYwNGU0LCAweDgwMDI4YmUsIDB4MzRhNWYwMTQsIAorMHg4ZWUyNzI2NCwgMHgzNDg0MzgwMCwgMHgzNjQxODIxLCAweDI0NDIwMDEwLCAKKzB4NDMxMDJiLCAweDE0NDAwMDczLCAweDAsIDB4OGVlMjcyNjQsIAorMHgyNDQ4MDAxMCwgMHgzNjQxMDIxLCAweDEwMjEwMmIsIDB4MTQ0MDAwMDIsIAorMHgzYzAyZmZmZiwgMHgxMDI0MDIxLCAweDhmODUwMTAwLCAweDI3NjIzMDAwLCAKKzB4MjRhNjAwMjAsIDB4YzIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjYyODAwLCAKKzB4OGY4MjAxMDgsIDB4MTBjMjAwMDQsIDB4MCwgMHg4ZjgyMDEwNCwgCisweDE0YzIwMDA3LCAweDI1NjMwMDBjLCAweDhlZTIwMWE4LCAweDQ4MjEsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFhOCwgMHg4MDAyN2UyLCAweDhlZTIwMWE4LCAKKzB4MmM2NDAwMGMsIDB4MTQ0MTAyMSwgMHhhY2EyMDAwMCwgMHhhY2EzMDAwNCwgCisweDI0ZTJmZmY0LCAweGE0YTIwMDBlLCAweDI0MDIwMDA2LCAweGFjYTgwMDA4LCAKKzB4YWNhMjAwMTgsIDB4OGVlMjA0ZTQsIDB4YWNhMjAwMWMsIDB4OGVlMjA0YzgsIAorMHgzYzAzMDAwMiwgMHg0MzEwMjUsIDB4YWNhMjAwMTAsIDB4YWY4NjAxMDAsIAorMHg5MmUyMDRlYywgMHgxNDQwMDAzNywgMHgyNDA5MDAwMSwgMHg4ZWUyNGUyOCwgCisweDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIAorMHgyNDAyMDAwNSwgMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTI4LCAKKzB4OGVlMjRlMmMsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIDB4OGM4MjAwMDQsIAorMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUyYywgMHg4ZWU1NGUyOCwgCisweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsIDB4OGVlMjRlMmMsIAorMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLCAweDgwMDI3Y2MsIAorMHgwLCAweDE0YTAwMDA1LCAweDAsIDB4OGY4MjAxMDgsIAorMHgyNDQyMDAyMCwgMHhhZjgyMDEwOCwgMHg4ZjgyMDEwOCwgMHg4YzgyMDAwNCwgCisweDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDI3ZTIsIAorMHgwLCAweDhlZTI0ZTI4LCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAKKzB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUyOCwgMHgyNDQyMDAwMSwgCisweGFlZTI0ZTI4LCAweDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LCAKKzB4MmUyMjAyMSwgMHgyNDAyMDAwNSwgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgCisweGFjODIwMDA0LCAweDE1MjAwMDBhLCAweDI1MDhmZmZjLCAweGFmYWIwMDEwLCAKKzB4OGVlMjcyNjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDU3MzAsIDB4M2MwNTAwMDQsIAorMHhhZmEyMDAxNCwgMHg4ZWU2MDRlNCwgMHg4MDAyOGJlLCAweDM0YTVmMDE1LCAKKzB4MzQwMjgxMDAsIDB4YTUwMjAwMDAsIDB4OTU4MjAwMGUsIDB4ODAwMjg1ZiwgCisweGE1MDIwMDAyLCAweDhmODUwMTAwLCAweDI3NjIzMDAwLCAweDI0YTYwMDIwLCAKKzB4YzIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjYyODAwLCAweDhmODIwMTA4LCAKKzB4MTBjMjAwMDQsIDB4MCwgMHg4ZjgyMDEwNCwgMHgxNGMyMDAwNywgCisweDI1NjMwMDBjLCAweDhlZTIwMWE4LCAweDQ4MjEsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDFhOCwgMHg4MDAyODRmLCAweDhlZTIwMWE4LCAweDJjNjQwMDBjLCAKKzB4MTQ0MTAyMSwgMHhhY2EyMDAwMCwgMHhhY2EzMDAwNCwgMHg4ZWUzNzI2NCwgCisweDI0ZTJmZmY0LCAweGE0YTIwMDBlLCAweDI0MDIwMDA2LCAweGFjYTIwMDE4LCAKKzB4MjQ2MzAwMTAsIDB4YWNhMzAwMDgsIDB4OGVlMjA0ZTQsIDB4YWNhMjAwMWMsIAorMHg4ZWUyMDRjOCwgMHgzYzAzMDAwMiwgMHg0MzEwMjUsIDB4YWNhMjAwMTAsIAorMHhhZjg2MDEwMCwgMHg5MmUyMDRlYywgMHgxNDQwMDAzNywgMHgyNDA5MDAwMSwgCisweDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjIwMjEsIAorMHg4YzgzMDAwMCwgMHgyNDAyMDAwNSwgMHgxNDYyMDAxZiwgMHgwLCAKKzB4OGVlMzRlMjgsIDB4OGVlMjRlMmMsIDB4MTA2MjAwMWIsIDB4MjQwMzAwNDAsIAorMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUyYywgCisweDhlZTU0ZTI4LCAweDI0NDIwMDAxLCAweDEwNDMwMDA3LCAweDAsIAorMHg4ZWUyNGUyYywgMHgyNDQyMDAwMSwgMHgxMGEyMDAwNSwgMHgwLCAKKzB4ODAwMjgzOSwgMHgwLCAweDE0YTAwMDA1LCAweDAsIAorMHg4ZjgyMDEwOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEwOCwgMHg4ZjgyMDEwOCwgCisweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLCAKKzB4ODAwMjg0ZiwgMHgwLCAweDhlZTI0ZTI4LCAweDI0MDMwMDQwLCAKKzB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUyOCwgCisweDI0NDIwMDAxLCAweGFlZTI0ZTI4LCAweDhlZTI0ZTI4LCAweDIxMGMwLCAKKzB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAwNSwgMHhhYzgyMDAwMCwgCisweDI0MDIwMDAxLCAweGFjODIwMDA0LCAweDE1MjAwMDBhLCAweDM0MDI4MTAwLCAKKzB4YWZhYjAwMTAsIDB4OGVlMjcyNjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDU3MzAsIAorMHgzYzA1MDAwNCwgMHhhZmEyMDAxNCwgMHg4ZWU2MDRlNCwgMHg4MDAyOGJlLCAKKzB4MzRhNWYwMTYsIDB4OGVlMzcyNjQsIDB4YTQ2MjAwMGMsIDB4OGVlMzcyNjQsIAorMHg5NTgyMDAwZSwgMHhhNDYyMDAwZSwgMHg4MDAyOGMyLCAweDI0ZTcwMDA0LCAKKzB4OGY4MzAxMDAsIDB4Mjc2MjMwMDAsIDB4MjQ2NDAwMjAsIDB4ODIxMDJiLCAKKzB4NTA0MDAwMDEsIDB4Mjc2NDI4MDAsIDB4OGY4MjAxMDgsIDB4MTA4MjAwMDQsIAorMHgwLCAweDhmODIwMTA0LCAweDE0ODIwMDA3LCAweDI0MDUwMDA1LCAKKzB4OGVlMjAxYTgsIDB4NDgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhOCwgCisweDgwMDI4YjYsIDB4OGVlMjAxYTgsIDB4YWM2YTAwMDAsIDB4YWM2YjAwMDQsIAorMHg4ZWUyNzI2NCwgMHhhNDY3MDAwZSwgMHhhYzY1MDAxOCwgMHhhYzYyMDAwOCwgCisweDhlZTIwNGU0LCAweGFjNjIwMDFjLCAweDhlZTIwNGM4LCAweGFjNjIwMDEwLCAKKzB4YWY4NDAxMDAsIDB4OTJlMjA0ZWMsIDB4MTQ0MDAwMzYsIDB4MjQwOTAwMDEsIAorMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwgMHgyZTIyMDIxLCAKKzB4OGM4MjAwMDAsIDB4MTQ0NTAwMWYsIDB4MCwgMHg4ZWUzNGUyOCwgCisweDhlZTI0ZTJjLCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LCAKKzB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMmMsIDB4OGVlNTRlMjgsIAorMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTJjLCAKKzB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwgMHg4MDAyOGEwLCAKKzB4MCwgMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTA4LCAKKzB4MjQ0MjAwMjAsIDB4YWY4MjAxMDgsIDB4OGY4MjAxMDgsIDB4OGM4MjAwMDQsIAorMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAyOGI2LCAKKzB4MCwgMHg4ZWUyNGUyOCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgCisweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMjgsIDB4MjQ0MjAwMDEsIAorMHhhZWUyNGUyOCwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwgCisweDJlMjIwMjEsIDB4MjQwMjAwMDUsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIAorMHhhYzgyMDAwNCwgMHgxNTIwMDAwYiwgMHgzYzA1MDAwNCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1NzQ4LCAweGFmYWIwMDEwLCAweGFmYTAwMDE0LCAweDhlZTYwNGU0LCAKKzB4MzRhNWYwMTcsIDB4YzAwMjQwMywgMHgzMGU3ZmZmZiwgMHg4MDAyOGUxLCAKKzB4MCwgMHg4ZWUyNzI2NCwgMHgzYzA1MDAwMSwgMHgzMGU0ZmZmZiwgCisweDQ0MTAyMSwgMHhhZWUyNzI2NCwgMHg4ZWUyNzI1YywgMHg4ZWUzNzI2NCwgCisweDM0YTUzODAwLCAweDQ0MTAyMSwgMHhhZWUyNzI1YywgMHgzNjUxMDIxLCAKKzB4NjIxODJiLCAweDE0NjAwMDA0LCAweDNjMDNmZmZmLCAweDhlZTI3MjY0LCAKKzB4NDMxMDIxLCAweGFlZTI3MjY0LCAweDhlZTMwNGU0LCAweDk2ZTIwNDU4LCAKKzB4MjQ2MzAwMDEsIDB4MjQ0MmZmZmYsIDB4NjIxODI0LCAweGFlZTMwNGU0LCAKKzB4OGVlMzA0ZTQsIDB4OGVlMjA0ZTAsIDB4MTQ2MjAwMDUsIDB4MCwgCisweDhmODIwMDYwLCAweDI0MDNmZmY3LCAweDQzMTAyNCwgMHhhZjgyMDA2MCwgCisweDhmYmYwMDIwLCAweDNlMDAwMDgsIDB4MjdiZDAwMjgsIDB4MjdiZGZmZTAsIAorMHhhZmJmMDAxOCwgMHg4ZWUzMDRlOCwgMHg4ZWUyMDRlMCwgMHgxMDYyMDE4OSwgCisweDAsIDB4OGVlMjA0ZTgsIDB4OGVlMzA0ZmMsIDB4MjExMDAsIAorMHg2MjE4MjEsIDB4OTQ2NzAwMDgsIDB4OTJlMjA0ZWQsIDB4OGM2ODAwMDAsIAorMHg4YzY5MDAwNCwgMHgxMDQwMDAyMywgMHg5NDZhMDAwYSwgMHg4ZWUyMDRjOCwgCisweDM0NDYwNDAwLCAweDMxNDIwMjAwLCAweDEwNDAwMDFmLCAweDAsIAorMHg5NmUyMDQ1YSwgMHgzMDQyMDAxMCwgMHgxMDQwMDAxYiwgMHgzYzAyODAwMCwgCisweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyODNkOCwgMHg4ZWUyNzI2NCwgCisweDk0NjQwMDBlLCAweDNjMDUwMDAxLCAweDM0YTUzODAwLCAweDI0NDIwMDA0LCAKKzB4YWVlMjcyNjQsIDB4OGVlMzcyNjQsIDB4NDI0MDAsIDB4MzY1MTAyMSwgCisweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzI0ODNkYywgMHg2MjE4MmIsIAorMHgxNDYwMDAwNSwgMHgyNGU3MDAwNCwgMHg4ZWUyNzI2NCwgMHgzYzAzZmZmZiwgCisweDQzMTAyMSwgMHhhZWUyNzI2NCwgMHg4ZWUyNzI2NCwgMHg4MDAyOTE3LCAKKzB4YWVlMjcyNTgsIDB4OGVlNjA0YzgsIDB4OGVlMjcyNmMsIDB4MzBlNGZmZmYsIAorMHg0NDEwMmEsIDB4MTA0MDAwMTUsIDB4MCwgMHg4ZjgyMDBkOCwgCisweDhlZTM3MjU4LCAweDQzMTAyMywgMHhhZWUyNzI2YywgMHg4ZWUyNzI2YywgCisweDFjNDAwMDA3LCAweDQ0MTAyYSwgMHg4ZWUyNzI2YywgMHgzYzAzMDAwMSwgCisweDQzMTAyMSwgMHhhZWUyNzI2YywgMHg4ZWUyNzI2YywgMHg0NDEwMmEsIAorMHgxMDQwMDAwNiwgMHgwLCAweDhlZTIwMWI4LCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxYjgsIDB4ODAwMmE3MiwgMHg4ZWUyMDFiOCwgMHgzYzAyMDAwMSwgCisweDU3MTAyMSwgMHg4YzQyODNkOCwgMHg1NDQwMDAwMSwgMHgyNGU3ZmZmYywgCisweDMxNDIwMDA0LCAweDEwNDAwMGI5LCAweDMwZTJmZmZmLCAweDNjMDIwMDAxLCAKKzB4NTcxMDIxLCAweDhjNDI4M2Q4LCAweDEwNDAwMDJmLCAweDUwMjEsIAorMHg4Zjg0MDEwMCwgMHgyNzYyMzAwMCwgMHgyNDg1MDAyMCwgMHhhMjEwMmIsIAorMHg1MDQwMDAwMSwgMHgyNzY1MjgwMCwgMHg4ZjgyMDEwOCwgMHgxMGEyMDAzMiwgCisweDAsIDB4OGY4MjAxMDQsIDB4MTBhMjAwMmYsIDB4MjQwMjAwMTUsIAorMHhhYzg4MDAwMCwgMHhhYzg5MDAwNCwgMHg4ZWUzNzI2NCwgMHhhNDg3MDAwZSwgCisweGFjODIwMDE4LCAweGFjODMwMDA4LCAweDhlZTIwNGU4LCAweDNjMDMwMDAxLCAKKzB4NzcxODIxLCAweDhjNjM4M2RjLCAweGFjODYwMDEwLCAweDQzMTAyNSwgCisweGFjODIwMDFjLCAweGFmODUwMTAwLCAweDkyZTIwNGVjLCAweDE0NDAwMDY2LCAKKzB4MjQwYTAwMDEsIDB4OGVlMjRlMjgsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIAorMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTI4LCAweDI0NDIwMDAxLCAKKzB4YWVlMjRlMjgsIDB4OGVlMjRlMjgsIDB4MjEwYzAsIDB4MjQ0MjRlMzgsIAorMHgyZTIxODIxLCAweDI0MDIwMDE1LCAweGFjNjIwMDAwLCAweDI0MDIwMDAxLCAKKzB4ODAwMjliZiwgMHhhYzYyMDAwNCwgMHg4Zjg0MDEwMCwgMHgyNzYyMzAwMCwgCisweDI0ODUwMDIwLCAweGEyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY1MjgwMCwgCisweDhmODIwMTA4LCAweDEwYTIwMDA0LCAweDAsIDB4OGY4MjAxMDQsIAorMHgxNGEyMDAwNiwgMHgyNDAyMDAwNiwgMHg4ZWUyMDFhOCwgMHgyNDQyMDAwMSwgCisweGFlZTIwMWE4LCAweDgwMDI5YmYsIDB4OGVlMjAxYTgsIDB4YWM4ODAwMDAsIAorMHhhYzg5MDAwNCwgMHg4ZWUzNzI2NCwgMHhhNDg3MDAwZSwgMHhhYzgyMDAxOCwgCisweGFjODMwMDA4LCAweDhlZTIwNGU4LCAweGFjODYwMDEwLCAweGFjODIwMDFjLCAKKzB4YWY4NTAxMDAsIDB4OTJlMjA0ZWMsIDB4MTQ0MDAwMzcsIDB4MjQwYTAwMDEsIAorMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwgMHgyZTIyMDIxLCAKKzB4OGM4MzAwMDAsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwMWYsIDB4MCwgCisweDhlZTM0ZTI4LCAweDhlZTI0ZTJjLCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAKKzB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMmMsIAorMHg4ZWU1NGUyOCwgMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLCAKKzB4OGVlMjRlMmMsIDB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwgCisweDgwMDI5YTksIDB4MCwgMHgxNGEwMDAwNSwgMHgwLCAKKzB4OGY4MjAxMDgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMDgsIDB4OGY4MjAxMDgsIAorMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgCisweDgwMDI5YmYsIDB4MCwgMHg4ZWUyNGUyOCwgMHgyNDAzMDA0MCwgCisweDI0NDIwMDAxLCAweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMjgsIAorMHgyNDQyMDAwMSwgMHhhZWUyNGUyOCwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwgCisweDI0NDI0ZTM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMDUsIDB4YWM4MjAwMDAsIAorMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgMHgxNTQwMDAwYSwgMHgyNDAyMDAwMSwgCisweGFmYTkwMDEwLCAweDhlZTI3MjY0LCAweDNjMDQwMDAxLCAweDI0ODQ1NzMwLCAKKzB4M2MwNTAwMDQsIDB4YWZhMjAwMTQsIDB4OGVlNjA0ZTQsIDB4ODAwMmE0ZiwgCisweDM0YTVmMjA0LCAweGEyZTIwNGVkLCAweDhlZTIwNGU4LCAweDhlZTMwNGZjLCAKKzB4OGVlNDcyNTgsIDB4M2MwNjAwMDEsIDB4MzRjNjM4MDAsIDB4M2MwMTAwMDEsIAorMHgzNzA4MjEsIDB4YWMyMDgzZDgsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAKKzB4YWMyMDgzZGMsIDB4MjExMDAsIDB4NDMxMDIxLCAweGFjNDQwMDBjLCAKKzB4OGVlMjcyNjQsIDB4MjQwNWZmZjgsIDB4MzBlM2ZmZmYsIDB4NDMxMDIxLCAKKzB4MjQ0MjAwMDcsIDB4NDUxMDI0LCAweDI0NjMwMDA3LCAweGFlZTI3MjU4LCAKKzB4OGVlMjcyNmMsIDB4OGVlNDcyNTgsIDB4NjUxODI0LCAweDQzMTAyMywgCisweGFlZTI3MjZjLCAweDM2NjEwMjEsIDB4ODIyMDJiLCAweDE0ODAwMDA0LCAKKzB4M2MwM2ZmZmYsIDB4OGVlMjcyNTgsIDB4NDMxMDIxLCAweGFlZTI3MjU4LCAKKzB4OGVlMjcyNTgsIDB4ODAwMmE2NCwgMHhhZWUyNzI2NCwgMHgxMDQwMDA3MywgCisweDAsIDB4OGY4MzAxMDAsIDB4Mjc2MjMwMDAsIDB4MjQ2NDAwMjAsIAorMHg4MjEwMmIsIDB4MTQ0MDAwMDIsIDB4NTAyMSwgMHgyNzY0MjgwMCwgCisweDhmODIwMTA4LCAweDEwODIwMDA0LCAweDAsIDB4OGY4MjAxMDQsIAorMHgxNDgyMDAwNiwgMHgyNDA1MDAwNSwgMHg4ZWUyMDFhOCwgMHgyNDQyMDAwMSwgCisweGFlZTIwMWE4LCAweDgwMDJhNDYsIDB4OGVlMjAxYTgsIDB4YWM2ODAwMDAsIAorMHhhYzY5MDAwNCwgMHg4ZWUyNzI2NCwgMHhhNDY3MDAwZSwgMHhhYzY1MDAxOCwgCisweGFjNjIwMDA4LCAweDhlZTIwNGU4LCAweGFjNjYwMDEwLCAweGFjNjIwMDFjLCAKKzB4YWY4NDAxMDAsIDB4OTJlMjA0ZWMsIDB4MTQ0MDAwMzYsIDB4MjQwYTAwMDEsIAorMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwgMHgyZTIyMDIxLCAKKzB4OGM4MjAwMDAsIDB4MTQ0NTAwMWYsIDB4MCwgMHg4ZWUzNGUyOCwgCisweDhlZTI0ZTJjLCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LCAKKzB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMmMsIDB4OGVlNTRlMjgsIAorMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTJjLCAKKzB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwgMHg4MDAyYTMwLCAKKzB4MCwgMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTA4LCAKKzB4MjQ0MjAwMjAsIDB4YWY4MjAxMDgsIDB4OGY4MjAxMDgsIDB4OGM4MjAwMDQsIAorMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAyYTQ2LCAKKzB4MCwgMHg4ZWUyNGUyOCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgCisweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMjgsIDB4MjQ0MjAwMDEsIAorMHhhZWUyNGUyOCwgMHg4ZWUyNGUyOCwgMHgyMTBjMCwgMHgyNDQyNGUzOCwgCisweDJlMjIwMjEsIDB4MjQwMjAwMDUsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIAorMHhhYzgyMDAwNCwgMHgxNTQwMDAwYywgMHgzMGU1ZmZmZiwgMHgzYzA0MDAwMSwgCisweDI0ODQ1NzQ4LCAweDNjMDUwMDA0LCAweGFmYTkwMDEwLCAweGFmYTAwMDE0LCAKKzB4OGVlNjA0ZTQsIDB4MzRhNWYyMzcsIDB4YzAwMjQwMywgMHgzMGU3ZmZmZiwgCisweDgwMDJhNzIsIDB4MCwgMHg4ZWUyNzI2NCwgMHg0NTEwMjEsIAorMHhhZWUyNzI2NCwgMHg4ZWUyNzI2YywgMHg4ZWUzNzI2NCwgMHgzYzA0MDAwMSwgCisweDM0ODQzODAwLCAweGEyZTAwNGVkLCAweDQ1MTAyMywgMHhhZWUyNzI2YywgCisweDM2NDEwMjEsIDB4NjIxODJiLCAweDE0NjAwMDA0LCAweDNjMDNmZmZmLCAKKzB4OGVlMjcyNjQsIDB4NDMxMDIxLCAweGFlZTI3MjY0LCAweDhlZTMwNGU4LCAKKzB4OTZlMjA0NTgsIDB4MjQ2MzAwMDEsIDB4MjQ0MmZmZmYsIDB4NjIxODI0LCAKKzB4YWVlMzA0ZTgsIDB4OGVlMzA0ZTgsIDB4OGVlMjA0ZTAsIDB4MTQ2MjAwMDUsIAorMHgwLCAweDhmODIwMDYwLCAweDI0MDNmZmY3LCAweDQzMTAyNCwgCisweGFmODIwMDYwLCAweDhmYmYwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjAsIAorMHgyN2JkZmZlMCwgMHhhZmJmMDAxYywgMHhhZmIwMDAxOCwgMHg4ZjgyMDEwMCwgCisweDhlZTM0ZTJjLCAweDhmODIwMTA0LCAweDhmODUwMTA4LCAweDI0MDIwMDQwLCAKKzB4MjQ2MzAwMDEsIDB4NTA2MjAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUyYywgCisweDI0NDIwMDAxLCAweGFlZTI0ZTJjLCAweDhlZTI0ZTJjLCAweDhlZTM0ZTJjLCAKKzB4MjEwYzAsIDB4MjQ0MjRlMzgsIDB4MmUyMjAyMSwgMHg4ZWUyNGUyOCwgCisweDhjODcwMDA0LCAweDE0NjIwMDA3LCAweGEwMzAyMSwgMHg4ZjgyMDEwOCwgCisweDI0NDIwMDIwLCAweGFmODIwMTA4LCAweDhmODIwMTA4LCAweDgwMDJhYTIsIAorMHhhYzgwMDAwMCwgMHg4ZWUyNGUyYywgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgCisweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMmMsIDB4MjQ0MjAwMDEsIAorMHgyMTBjMCwgMHgyNDQyNGUzOCwgMHgyZTIyMDIxLCAweDhjODIwMDA0LCAKKzB4OGY4MzAxMDgsIDB4MjExNDAsIDB4NjIxODIxLCAweGFmODMwMTA4LCAKKzB4YWM4MDAwMDAsIDB4OGNjMjAwMTgsIDB4MjQ0M2ZmZmUsIDB4MmM2MjAwMTMsIAorMHgxMDQwMDBjMSwgMHgzMTA4MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIAorMHg4YzIyNTc3MCwgMHg0MDAwMDgsIDB4MCwgMHg4ZWUyMDRmMCwgCisweDQ3MTAyMSwgMHhhZWUyMDRmMCwgMHg4ZWUyMDRmMCwgMHg4ZjQzMDIzYywgCisweDQzMTAyYiwgMHgxNDQwMDBiZSwgMHgwLCAweDhlZTMwNGU0LCAKKzB4OGVlMjA0ZjgsIDB4NTA2MjAwYmEsIDB4YTJlMDA0ZjQsIDB4OGY4MzAxMjAsIAorMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsIDB4NTA0MDAwMDEsIAorMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgMHgwLCAKKzB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsIDB4MCwgMHg4ZWUyMDFhNCwgCisweDgwMjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMmIxMiwgCisweDhlZTIwMWE0LCAweDhlZTIwNGU0LCAweGFjNjIwMDFjLCAweDhlZTQwNGIwLCAKKzB4OGVlNTA0YjQsIDB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIDB4MjQwMjAwMDgsIAorMHhhNDYyMDAwZSwgMHgyNDAyMDAxMSwgMHhhYzYyMDAxOCwgMHhhYzY0MDAwMCwgCisweGFjNjUwMDA0LCAweDhlZTIwNGM0LCAweGFjNjIwMDEwLCAweGFmODYwMTIwLCAKKzB4OTJlMjRlMjAsIDB4MTQ0MDAwMzcsIDB4MjQxMDAwMDEsIDB4OGVlMjRlMzAsIAorMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLCAKKzB4MjQwMjAwMTIsIDB4MTQ2MjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwgCisweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDI0MDMwMDQwLCAweDhjODIwMDA0LCAKKzB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlNTRlMzAsIAorMHgyNDQyMDAwMSwgMHgxMDQzMDAwNywgMHgwLCAweDhlZTI0ZTM0LCAKKzB4MjQ0MjAwMDEsIDB4MTBhMjAwMDUsIDB4MCwgMHg4MDAyYWZjLCAKKzB4MCwgMHgxNGEwMDAwNSwgMHgwLCAweDhmODIwMTI4LCAKKzB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIAorMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgMHg4MDAyYjEyLCAKKzB4MCwgMHg4ZWUyNGUzMCwgMHgyNDAzMDA0MCwgMHgyNDQyMDAwMSwgCisweDUwNDMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIAorMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgCisweDJlMjIwMjEsIDB4MjQwMjAwMTIsIDB4YWM4MjAwMDAsIDB4MjQwMjAwMDEsIAorMHhhYzgyMDAwNCwgMHg1NjAwMDAwYiwgMHgyNDEwMDAwMSwgMHg4ZWUyMDRlNCwgCisweDNjMDQwMDAxLCAweDI0ODQ1NzU0LCAweGFmYTAwMDE0LCAweGFmYTIwMDEwLCAKKzB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgCisweDM0YTVmMDA2LCAweDE2MDAwMDAzLCAweDI0MDIwMDAxLCAweDgwMDJiNzEsIAorMHhhMmUyMDRmNCwgMHg4ZWUyMDE3MCwgMHgyNDQyMDAwMSwgMHhhZWUyMDE3MCwgCisweDhlZTIwMTcwLCAweDhlZTIwNGU0LCAweGEyZTAwNGY0LCAweGFlZTAwNGYwLCAKKzB4YWVlMjA0ZjgsIDB4OGY0MjAyM2MsIDB4NTA0MDAwNDUsIDB4YWVlMDcyNzQsIAorMHg4ZWUyMDE4NCwgMHgyNDQyMDAwMSwgMHhhZWUyMDE4NCwgMHg4ZWUyMDE4NCwgCisweDgwMDJiNzEsIDB4YWVlMDcyNzQsIDB4OGVlMjA1MDQsIDB4MjQwMzAwNDAsIAorMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTIwNTA0LCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjA1MDQsIDB4OGVlMjA1MDQsIDB4OGNjMzAwMTgsIAorMHgyMTA4MCwgMHg1NzEwMjEsIDB4OGM0NDA1MDgsIDB4MjQwMjAwMDMsIAorMHgxNDYyMDAwZiwgMHgwLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgCisweDkwNDI4M2IxLCAweDEwNDAwMDE0LCAweDAsIDB4OGVlMjAxZDAsIAorMHg4ZWUzNTI0MCwgMHg0NDEwMjEsIDB4YWVlMjAxZDAsIDB4OGVlMjAxZDgsIAorMHg2NDE4MjEsIDB4MzA2MzAwZmYsIDB4ODAwMmI1OSwgMHhhZWUzNTI0MCwgCisweDhlZTIwMWNjLCAweDhlZTMwZTEwLCAweDQ0MTAyMSwgMHhhZWUyMDFjYywgCisweDhlZTIwMWQ4LCAweDY0MTgyMSwgMHgzMDYzMDFmZiwgMHhhZWUzMGUxMCwgCisweDQ0MTAyMSwgMHhhZWUyMDFkOCwgMHg4ZWUyMDAwMCwgMHgzNDQyMDA0MCwgCisweDgwMDJiNzEsIDB4YWVlMjAwMDAsIDB4OGVlMjAxNGMsIDB4M2MwMTAwMDEsIAorMHgzNzA4MjEsIDB4YTAyMDgzZTAsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxNGMsIAorMHg4MDAyYjcxLCAweDhlZTIwMTRjLCAweDk0YzcwMDBlLCAweDhjYzIwMDFjLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDU3NjAsIDB4YWZhNjAwMTQsIDB4YWZhMjAwMTAsIAorMHg4Y2M2MDAxOCwgMHgzYzA1MDAwOCwgMHhjMDAyNDAzLCAweDM0YTUwOTEwLCAKKzB4OGZiZjAwMWMsIDB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyMCwgCisweDI3YmRmZjk4LCAweGFmYmYwMDYwLCAweGFmYmUwMDVjLCAweGFmYjYwMDU4LCAKKzB4YWZiNTAwNTQsIDB4YWZiNDAwNTAsIDB4YWZiMzAwNGMsIDB4YWZiMjAwNDgsIAorMHhhZmIxMDA0NCwgMHhhZmIwMDA0MCwgMHg4ZjgzMDEwOCwgMHg4ZjgyMDEwNCwgCisweGFmYTAwMDI0LCAweDEwNjIwM2U3LCAweGFmYTAwMDJjLCAweDNjMWUwMDAxLCAKKzB4MzdkZTM4MDAsIDB4M2MwYmZmZmYsIDB4OGY5MzAxMDgsIDB4OGU2MjAwMTgsIAorMHg4ZjgzMDEwNCwgMHgyNDQzZmZmZSwgMHgyYzYyMDAxNCwgMHgxMDQwMDNjZiwgCisweDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNTdjMCwgCisweDQwMDAwOCwgMHgwLCAweDk2NjMwMDBlLCAweDhlZTI3MjVjLCAKKzB4OGVlNDA0ZjAsIDB4NDMxMDIxLCAweGFlZTI3MjVjLCAweDhlNjMwMDFjLCAKKzB4OTZlMjA0NTgsIDB4MjQ4NDAwMDEsIDB4YWVlNDA0ZjAsIDB4MjQ2MzAwMDEsIAorMHgyNDQyZmZmZiwgMHg2MjE4MjQsIDB4YWVlMzA0ZTQsIDB4OGY0MjAyM2MsIAorMHg4MjIwMmIsIDB4MTQ4MDAzYjksIDB4MCwgMHg4ZjgzMDEyMCwgCisweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgCisweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsIAorMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LCAKKzB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAyYmZlLCAKKzB4OGVlMjAxYTQsIDB4OGVlMjA0ZTQsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YjAsIAorMHg4ZWU1MDRiNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHgyNDAyMDAwOCwgCisweGE0NjIwMDBlLCAweDI0MDIwMDExLCAweGFjNjIwMDE4LCAweGFjNjQwMDAwLCAKKzB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIAorMHg5MmUyNGUyMCwgMHgxNDQwMDAzNywgMHgyNDEwMDAwMSwgMHg4ZWUyNGUzMCwgCisweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIAorMHgyNDAyMDAxMiwgMHgxNDYyMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAKKzB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MjQwYzAwNDAsIDB4OGM4MjAwMDQsIAorMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwgCisweDI0NDIwMDAxLCAweDEwNGMwMDA3LCAweDAsIDB4OGVlMjRlMzQsIAorMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLCAweDgwMDJiZTgsIAorMHgwLCAweDE0NjAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIAorMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgCisweDJjNDIwMDExLCAweDUwNDAwMDEzLCAweGFjODAwMDAwLCAweDgwMDJiZmUsIAorMHgwLCAweDhlZTI0ZTMwLCAweDI0MGMwMDQwLCAweDI0NDIwMDAxLCAKKzB4NTA0YzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgCisweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAKKzB4MmUyMjAyMSwgMHgyNDAyMDAxMiwgMHgyNDBjMDAwMSwgMHhhYzgyMDAwMCwgCisweGFjOGMwMDA0LCAweDU2MDAwMDBkLCAweDI0MTAwMDAxLCAweDhlZTIwNGU0LCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDU3NTQsIDB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsIAorMHg4ZWU2MDYwOCwgMHg4ZjQ3MDIyOCwgMHgzYzA1MDAwOSwgMHgzNGE1ZjAwNiwgCisweGMwMDI0MDMsIDB4YWZhYjAwMzgsIDB4OGZhYjAwMzgsIDB4MTIwMDAzMGEsIAorMHgyNDBjMDAwMSwgMHg4MDAyZjE5LCAweDAsIDB4OTY2YzAwMWMsIAorMHhhZmFjMDAyYywgMHg5NjYyMDAxZSwgMHgzYzBjODAwMCwgMHhhZmFjMDAyNCwgCisweGFlNjIwMDFjLCAweDhlNzUwMDFjLCAweDhlZTIwNGZjLCAweDhlZTQwNGZjLCAKKzB4MTUxOTAwLCAweDYyMTAyMSwgMHg4YzUyMDAwYywgMHg5MmUyN2I5OCwgCisweDY0MTgyMSwgMHg5NDc2MDAwYSwgMHgxNDQwMDAwMywgMHgzMmMyMDAwMiwgCisweGFlZjI3YmE0LCAweGFlZjU3YjljLCAweDEwNDAwMDRiLCAweDgwMjEsIAorMHg5NmUyMDQ1YSwgMHgzMDQyMDAwMiwgMHgxMDQwMDA0NywgMHgwLCAKKzB4OGU2MzAwMWMsIDB4OGVlMjA0ZmMsIDB4MzIxMDAsIDB4ODIxMDIxLCAKKzB4OGM0MjAwMGMsIDB4MzdlMTgyMSwgMHgyNDQyMDAyMiwgMHg0MzEwMmIsIAorMHgxNDQwMDAwYSwgMHgyNDA1MDAxNCwgMHg4ZWUyMDRmYywgMHg4MjEwMjEsIAorMHg4YzQ0MDAwYywgMHhhZmFiMDAzOCwgMHhjMDAyZjc1LCAweDI0ODQwMDBlLCAKKzB4OGZhYjAwMzgsIDB4ODAwMmM1MiwgMHgzMDUwZmZmZiwgMHg4ZWUyMDRmYywgCisweDgyMTAyMSwgMHg4YzQyMDAwYywgMHg5NDUwMDAwZSwgMHg5NDQzMDAxMCwgCisweDk0NDQwMDEyLCAweDk0NDUwMDE0LCAweDIwMzgwMjEsIDB4MjA0ODAyMSwgCisweDIwNTgwMjEsIDB4OTQ0MzAwMTYsIDB4OTQ0NDAwMTgsIDB4OTQ0NTAwMWEsIAorMHgyMDM4MDIxLCAweDIwNDgwMjEsIDB4MjA1ODAyMSwgMHg5NDQzMDAxYywgCisweDk0NDQwMDFlLCAweDk0NDIwMDIwLCAweDIwMzgwMjEsIDB4MjA0ODAyMSwgCisweDIwMjgwMjEsIDB4MTAxYzAyLCAweDMyMDJmZmZmLCAweDYyODAyMSwgCisweDhlNjMwMDFjLCAweDhlZTIwNGZjLCAweDEwMjQwMiwgMHgzMjkwMCwgCisweGEyMTAyMSwgMHg4YzQzMDAwYywgMHgzMjAyZmZmZiwgMHg4MjgwMjEsIAorMHgzN2UxMDIxLCAweDI0NjMwMDE4LCAweDYyMTgyYiwgMHgxNDYwMDAwOSwgCisweDAsIDB4OGVlMjA0ZmMsIDB4YTIxMDIxLCAweDhjNDMwMDBjLCAKKzB4MTAxMDI3LCAweDNjMDFmZmZmLCAweDIzMDgyMSwgMHg4MDAyYzZmLCAKKzB4YTQyMjAwMTgsIDB4OGVlMjA0ZmMsIDB4YTIxMDIxLCAweDhjNDMwMDBjLCAKKzB4MTAxMDI3LCAweGE0NjIwMDE4LCAweDk2ZTIwNDVhLCAweDg4MjEsIAorMHgzMDQyMDAwOCwgMHgxNDQwMDA2MywgMHhhMDIxLCAweDhlNjMwMDFjLCAKKzB4OGVlMjA0ZmMsIDB4MzMxMDAsIDB4YzIxMDIxLCAweDhjNDIwMDBjLCAKKzB4MzdlMTgyMSwgMHgyNDQyMDAyMiwgMHg0MzEwMmIsIDB4MTQ0MDAwMzUsIAorMHgwLCAweDhlZTIwNGZjLCAweGMyMTAyMSwgMHg4YzQyMDAwYywgCisweDI0NDcwMDEwLCAweDM3ZTEwMjEsIDB4ZTIxMDJiLCAweDUwNDAwMDAxLCAKKzB4ZWIzODIxLCAweDhlZTIwNGZjLCAweDk0ZjEwMDAwLCAweGMyMTAyMSwgCisweDhjNDIwMDBjLCAweDI0NDcwMDE2LCAweDM3ZTEwMjEsIDB4ZTIxMDJiLCAKKzB4MTQ0MDAwMDIsIDB4MjYzNGZmZWMsIDB4ZWIzODIxLCAweDhlZTIwNGZjLCAKKzB4OTBlMzAwMDEsIDB4YzIxMDIxLCAweDhjNDIwMDBjLCAweDI0NDcwMDFhLCAKKzB4MzdlMTAyMSwgMHhlMjEwMmIsIDB4MTQ0MDAwMDIsIDB4MjgzODgyMSwgCisweGViMzgyMSwgMHg5NGUyMDAwMCwgMHgyNGU3MDAwMiwgMHgyMjI4ODIxLCAKKzB4MzdlMTAyMSwgMHhlMjEwMmIsIDB4NTA0MDAwMDEsIDB4ZWIzODIxLCAKKzB4OTRlMjAwMDAsIDB4MjRlNzAwMDIsIDB4MjIyODgyMSwgMHgzN2UxMDIxLCAKKzB4ZTIxMDJiLCAweDUwNDAwMDAxLCAweGViMzgyMSwgMHg5NGUyMDAwMCwgCisweDI0ZTcwMDAyLCAweDIyMjg4MjEsIDB4MzdlMTAyMSwgMHhlMjEwMmIsIAorMHg1MDQwMDAwMSwgMHhlYjM4MjEsIDB4OTRlMjAwMDAsIDB4ODAwMmNkMCwgCisweDIyMjg4MjEsIDB4OGVlMjA0ZmMsIDB4YzIxMDIxLCAweDhjNDMwMDBjLCAKKzB4OGVlMjA0ZmMsIDB4OTQ3MTAwMTAsIDB4OGVlMzA0ZmMsIDB4YzIxMDIxLCAKKzB4OGM0NDAwMGMsIDB4YzMxODIxLCAweDhjNjIwMDBjLCAweDI2MzRmZmVjLCAKKzB4OTA4NDAwMTcsIDB4OGVlMzA0ZmMsIDB4OTQ0MjAwMWEsIDB4Mjg0ODgyMSwgCisweGMzMTgyMSwgMHg4YzY1MDAwYywgMHg4ZWUzMDRmYywgMHgyMjI4ODIxLCAKKzB4OGVlMjA0ZmMsIDB4YzMxODIxLCAweGMyMTAyMSwgMHg4YzQ0MDAwYywgCisweDhjNjIwMDBjLCAweDk0YTMwMDFjLCAweDk0ODQwMDFlLCAweDk0NDIwMDIwLCAKKzB4MjIzODgyMSwgMHgyMjQ4ODIxLCAweDIyMjg4MjEsIDB4MTExYzAyLCAKKzB4MzIyMmZmZmYsIDB4NjI4ODIxLCAweDExMWMwMiwgMHgzMjIyZmZmZiwgCisweDYyODgyMSwgMHgzMmMyMDAwMSwgMHgxMDQwMDBiMiwgMHgwLCAKKzB4OTZlMjA0NWEsIDB4MzA0MjAwMDEsIDB4MTA0MDAwYWUsIDB4MzJjMjAwODAsIAorMHgxMDQwMDAwOCwgMHgwLCAweDkyZTI3Yjk4LCAweDE0NDAwMDA1LCAKKzB4MCwgMHgyNDBjMDAwMSwgMHhhMmVjN2I5OCwgMHhhZWY1N2I5YywgCisweGFlZjI3YmE0LCAweDhlZTMwNGZjLCAweDE1MTEwMCwgMHg0MzEwMjEsIAorMHg4YzQ3MDAwYywgMHgzN2UxODIxLCAweDI0ZTIwMDBlLCAweDQzMTAyYiwgCisweDE0NDAwMDA4LCAweGUwMjAyMSwgMHgyNDA1MDAwZSwgMHhjMDAyZjc1LCAKKzB4YWZhYjAwMzgsIDB4MzA0MmZmZmYsIDB4OGZhYjAwMzgsIDB4ODAwMmQwOSwgCisweDIwMjgwMjEsIDB4OTRlNjAwMDAsIDB4MjRlNzAwMDIsIDB4OTRlNTAwMDAsIAorMHgyNGU3MDAwMiwgMHg5NGUzMDAwMCwgMHgyNGU3MDAwMiwgMHg5NGUyMDAwMCwgCisweDI0ZTcwMDAyLCAweDk0ZTQwMDAwLCAweDI0ZTcwMDAyLCAweDIwNjgwMjEsIAorMHgyMDU4MDIxLCAweDIwMzgwMjEsIDB4MjAyODAyMSwgMHg5NGUyMDAwMCwgCisweDk0ZTMwMDAyLCAweDIwNDgwMjEsIDB4MjAyODAyMSwgMHgyMDM4MDIxLCAKKzB4MTAxYzAyLCAweDMyMDJmZmZmLCAweDYyODAyMSwgMHgxMDFjMDIsIAorMHgzMjAyZmZmZiwgMHg4ZWU0N2I5YywgMHg2MjgwMjEsIDB4MTQ5NTAwMDQsIAorMHgzMjA1ZmZmZiwgMHg5NjYyMDAxNiwgMHg4MDAyZDE3LCAweDUxMjAyMSwgCisweDk2NjIwMDE2LCAweDU0MjAyMSwgMHg0MTQwMiwgMHgzMDgzZmZmZiwgCisweDQzMjAyMSwgMHg4NTIwMjMsIDB4NDE0MDIsIDB4ODIyMDIxLCAKKzB4MzA4NGZmZmYsIDB4NTA4MDAwMDEsIDB4MzQwNGZmZmYsIDB4OGVlMjdiYTQsIAorMHgyNDQzMDAxNywgMHgzN2UxMDIxLCAweDYyMTAyYiwgMHg1MDQwMDAwMSwgCisweDZiMTgyMSwgMHg5MDYzMDAwMCwgMHgyNDAyMDAxMSwgMHgxNDYyMDAzMSwgCisweDI0MDIwMDA2LCAweDhlZTI3YmE0LCAweDM3ZTE4MjEsIDB4MjQ0MjAwMjgsIAorMHg0MzEwMmIsIDB4MTQ0MDAwMTgsIDB4MCwgMHg4ZWUyN2I5YywgCisweDEyYTIwMDBhLCAweDMyYzIwMTAwLCAweDhlZTI3YmE0LCAweDNjMDFmZmZmLCAKKzB4MjIwODIxLCAweDk0MjIwMDI4LCAweDgyMjAyMSwgMHg0MWMwMiwgCisweDMwODJmZmZmLCAweDYyMjAyMSwgMHgzMmMyMDEwMCwgMHgxNDQwMDAwNCwgCisweDQxMDI3LCAweDkyZTI3Yjk4LCAweDE0NDAwMDAyLCAweDQxMDI3LCAKKzB4MzA0NGZmZmYsIDB4OGVlMjdiYTQsIDB4M2MwMWZmZmYsIDB4MjIwODIxLCAKKzB4ODAwMmQ4YSwgMHhhNDI0MDAyOCwgMHg4ZWUyN2I5YywgMHgxMmEyMDAwOCwgCisweDMyYzIwMTAwLCAweDhlZTI3YmE0LCAweDk0NDIwMDI4LCAweDgyMjAyMSwgCisweDQxYzAyLCAweDMwODJmZmZmLCAweDYyMjAyMSwgMHgzMmMyMDEwMCwgCisweDE0NDAwMDA0LCAweDQxMDI3LCAweDkyZTI3Yjk4LCAweDE0NDAwMDAyLCAKKzB4NDEwMjcsIDB4MzA0NGZmZmYsIDB4OGVlMjdiYTQsIDB4ODAwMmQ4YSwgCisweGE0NDQwMDI4LCAweDE0NjIwMDJmLCAweDM3ZTE4MjEsIDB4OGVlMjdiYTQsIAorMHgyNDQyMDAzMiwgMHg0MzEwMmIsIDB4MTQ0MDAwMTgsIDB4MCwgCisweDhlZTI3YjljLCAweDEyYTIwMDBhLCAweDMyYzIwMTAwLCAweDhlZTI3YmE0LCAKKzB4M2MwMWZmZmYsIDB4MjIwODIxLCAweDk0MjIwMDMyLCAweDgyMjAyMSwgCisweDQxYzAyLCAweDMwODJmZmZmLCAweDYyMjAyMSwgMHgzMmMyMDEwMCwgCisweDE0NDAwMDA0LCAweDQxMDI3LCAweDkyZTI3Yjk4LCAweDE0NDAwMDAyLCAKKzB4NDEwMjcsIDB4MzA0NGZmZmYsIDB4OGVlMjdiYTQsIDB4M2MwMWZmZmYsIAorMHgyMjA4MjEsIDB4ODAwMmQ4YSwgMHhhNDI0MDAzMiwgMHg4ZWUyN2I5YywgCisweDEyYTIwMDA4LCAweDMyYzIwMTAwLCAweDhlZTI3YmE0LCAweDk0NDIwMDMyLCAKKzB4ODIyMDIxLCAweDQxYzAyLCAweDMwODJmZmZmLCAweDYyMjAyMSwgCisweDMyYzIwMTAwLCAweDE0NDAwMDA0LCAweDQxMDI3LCAweDkyZTI3Yjk4LCAKKzB4MTQ0MDAwMDIsIDB4NDEwMjcsIDB4MzA0NGZmZmYsIDB4OGVlMjdiYTQsIAorMHhhNDQ0MDAzMiwgMHg4ZmFjMDAyNCwgMHgxMTgwMDAyYywgMHgzN2UxODIxLCAKKzB4OGU0MjAwMDAsIDB4YWU0MmZmZmMsIDB4MjY0MjAwMGEsIDB4NDMxMDJiLCAKKzB4MTQ0MDAwMWIsIDB4MzQwMzgxMDAsIDB4MjY0MzAwMDQsIDB4MzdlMTAyMSwgCisweDYyMTAyYiwgMHgxNDQwMDAwMywgMHg2MDIwMjEsIDB4NmIxODIxLCAKKzB4NjAyMDIxLCAweDhjNjIwMDAwLCAweDI0NjMwMDA0LCAweGFlNDIwMDAwLCAKKzB4MzdlMTAyMSwgMHg2MjEwMmIsIDB4NTA0MDAwMDEsIDB4NmIxODIxLCAKKzB4OGM2MjAwMDAsIDB4YWM4MjAwMDAsIDB4MzQwMjgxMDAsIDB4YTQ2MjAwMDAsIAorMHgyNDYzMDAwMiwgMHgzN2UxMDIxLCAweDYyMTAyYiwgMHg1MDQwMDAwMSwgCisweDZiMTgyMSwgMHg5N2FjMDAyZSwgMHg4MDAyZGI0LCAweGE0NmMwMDAwLCAKKzB4OGU0MjAwMDQsIDB4OGU0NDAwMDgsIDB4YTY0MzAwMDgsIDB4OTdhYzAwMmUsIAorMHhhNjRjMDAwYSwgMHhhZTQyMDAwMCwgMHhhZTQ0MDAwNCwgMHg5NjYyMDAwZSwgCisweDI2NTJmZmZjLCAweDI0NDIwMDA0LCAweGE2NjIwMDBlLCAweDk2NjIwMDBlLCAKKzB4OGVlMzcyNWMsIDB4NjIxODIxLCAweGFlZTM3MjVjLCAweGFmYjIwMDE4LCAKKzB4OGVlMzcyNWMsIDB4YWZhMzAwMWMsIDB4OGVlMjcyNWMsIDB4MmM0MjAwM2MsIAorMHgxMDQwMDAwNCwgMHgyNDYyMDAwMSwgMHgyNDAzZmZmZSwgMHg0MzEwMjQsIAorMHhhZmEyMDAxYywgMHgzMmMyMDA4MCwgMHgxMDQwMDAwYywgMHgzMmMyMDEwMCwgCisweDhlZTI3YmE4LCAweDI0NDMwMDAxLCAweDIxMGMwLCAweDU3MTAyMSwgCisweGFlZTM3YmE4LCAweDhmYTMwMDE4LCAweDhmYTQwMDFjLCAweGFjNDM3YmFjLCAKKzB4YWM0NDdiYjAsIDB4ODAwMmVhMCwgMHhhZWUwNzI1YywgMHgxMDQwMDA3MiwgCisweDAsIDB4OGVlMjdiYTgsIDB4MjQ0MzAwMDEsIDB4MjEwYzAsIAorMHg1NzEwMjEsIDB4YWVlMzdiYTgsIDB4OGZhMzAwMTgsIDB4OGZhNDAwMWMsIAorMHhhYzQzN2JhYywgMHhhYzQ0N2JiMCwgMHg4ZWUyN2JhOCwgMHgxMDQwMDA2MywgCisweDQ4MjEsIDB4NTAyMSwgMHg4ZjgyMDBmMCwgMHgyNDQ4MDAwOCwgCisweDI3NjIxODAwLCAweDEwMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2ODEwMDAsIAorMHg4ZjgyMDBmNCwgMHgxNTAyMDAwNywgMHgwLCAweDhlZTIwMWI0LCAKKzB4ODAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFiNCwgMHg4MDAyZGZhLCAKKzB4OGVlMjAxYjQsIDB4OGY4MzAwZjAsIDB4MjQxMDAwMDEsIDB4MTU3MTAyMSwgCisweDhjNDQ3YmFjLCAweDhjNDU3YmIwLCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LCAKKzB4YWY4ODAwZjAsIDB4MTYwMDAwMDYsIDB4MmVhMTAyMSwgMHg4ZWUyMDA4OCwgCisweDI0NDIwMDAxLCAweGFlZTIwMDg4LCAweDgwMDJlM2YsIDB4OGVlMjAwODgsIAorMHg4YzQyN2JiMCwgMHg4ZWU0MDBlMCwgMHg4ZWU1MDBlNCwgMHg4ZWU2N2I5YywgCisweDQwMTgyMSwgMHgxMDIxLCAweGEzMjgyMSwgMHhhMzM4MmIsIAorMHg4MjIwMjEsIDB4ODcyMDIxLCAweDhlZTIwNGZjLCAweGM5MzAyMSwgCisweDYzMTAwLCAweGFlZTQwMGUwLCAweGFlZTUwMGU0LCAweGMyMzAyMSwgCisweDk0YzIwMDBhLCAweDI0MGMwMDAyLCAweDIxMTQyLCAweDMwNDMwMDAzLCAKKzB4MTA2YzAwMTYsIDB4Mjg2MjAwMDMsIDB4MTA0MDAwMDUsIDB4MjQwYzAwMDEsIAorMHgxMDZjMDAwOCwgMHgwLCAweDgwMDJlM2YsIDB4MCwgCisweDI0MGMwMDAzLCAweDEwNmMwMDE3LCAweDAsIDB4ODAwMmUzZiwgCisweDAsIDB4OGVlMjAwZTgsIDB4OGVlMzAwZWMsIDB4MjQ2MzAwMDEsIAorMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZTgsIDB4YWVlMzAwZWMsIAorMHg4ZWUyMDBlOCwgMHg4MDAyZTNmLCAweDhlZTMwMGVjLCAweDhlZTIwMGYwLCAKKzB4OGVlMzAwZjQsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIDB4NDQxMDIxLCAKKzB4YWVlMjAwZjAsIDB4YWVlMzAwZjQsIDB4OGVlMjAwZjAsIDB4ODAwMmUzZiwgCisweDhlZTMwMGY0LCAweDhlZTIwMGY4LCAweDhlZTMwMGZjLCAweDI0NjMwMDAxLCAKKzB4MmM2NDAwMDEsIDB4NDQxMDIxLCAweGFlZTIwMGY4LCAweGFlZTMwMGZjLCAKKzB4OGVlMjAwZjgsIDB4OGVlMzAwZmMsIDB4OGVlMjdiYTgsIDB4MjUyOTAwMDEsIAorMHgxMjIxMDJiLCAweDE0NDBmZmEwLCAweDI1NGEwMDA4LCAweGEyZTA3Yjk4LCAKKzB4ODAwMmU5ZiwgMHhhZWUwN2JhOCwgMHg4ZjgyMDBmMCwgMHgyNDQ3MDAwOCwgCisweDI3NjIxODAwLCAweGUyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY3MTAwMCwgCisweDhmODIwMGY0LCAweDE0ZTIwMDA3LCAweDAsIDB4OGVlMjAxYjQsIAorMHg4MDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWI0LCAweDgwMDJlNWQsIAorMHg4ZWUyMDFiNCwgMHg4ZjgyMDBmMCwgMHgyNDEwMDAwMSwgMHg4ZmEzMDAxOCwgCisweDhmYTQwMDFjLCAweGFjNDMwMDAwLCAweGFjNDQwMDA0LCAweGFmODcwMGYwLCAKKzB4MTYwMDAwMDcsIDB4MCwgMHg4ZWUyMDA4OCwgMHgyNDQyMDAwMSwgCisweGFlZTIwMDg4LCAweDhlZTIwMDg4LCAweDgwMDJlYTAsIDB4YWVlMDcyNWMsIAorMHg4ZWUyNzI1YywgMHg4ZWU0MDBlMCwgMHg4ZWU1MDBlNCwgMHgyNDBjMDAwMiwgCisweDQwMTgyMSwgMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsIAorMHg4MjIwMjEsIDB4ODYyMDIxLCAweDE2MTE0MiwgMHgzMDQzMDAwMywgCisweGFlZTQwMGUwLCAweGFlZTUwMGU0LCAweDEwNmMwMDE3LCAweDJjNjIwMDAzLCAKKzB4MTA0MDAwMDUsIDB4MjQwYzAwMDEsIDB4MTA2YzAwMDgsIDB4MCwgCisweDgwMDJlYTAsIDB4YWVlMDcyNWMsIDB4MjQwYzAwMDMsIDB4MTA2YzAwMTksIAorMHgwLCAweDgwMDJlYTAsIDB4YWVlMDcyNWMsIDB4OGVlMjAwZTgsIAorMHg4ZWUzMDBlYywgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsIAorMHhhZWUyMDBlOCwgMHhhZWUzMDBlYywgMHg4ZWUyMDBlOCwgMHg4ZWUzMDBlYywgCisweDgwMDJlYTAsIDB4YWVlMDcyNWMsIDB4OGVlMjAwZjAsIDB4OGVlMzAwZjQsIAorMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZjAsIAorMHhhZWUzMDBmNCwgMHg4ZWUyMDBmMCwgMHg4ZWUzMDBmNCwgMHg4MDAyZWEwLCAKKzB4YWVlMDcyNWMsIDB4OGVlMjAwZjgsIDB4OGVlMzAwZmMsIDB4MjQ2MzAwMDEsIAorMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZjgsIDB4YWVlMzAwZmMsIAorMHg4ZWUyMDBmOCwgMHg4ZWUzMDBmYywgMHhhZWUwNzI1YywgMHg4ZTYyMDAxYywgCisweDk2ZTMwNDU4LCAweDhlZTQwNGYwLCAweDI0NDIwMDAxLCAweDI0NjNmZmZmLCAKKzB4NDMxMDI0LCAweDI0ODQwMDAxLCAweGFlZTIwNGU0LCAweGFlZTQwNGYwLCAKKzB4OGY0MjAyM2MsIDB4ODIyMDJiLCAweDE0ODAwMGIwLCAweDAsIAorMHg4ZjgzMDEyMCwgMHgyNzYyMzgwMCwgMHgyNDY2MDAyMCwgMHhjMjEwMmIsIAorMHg1MDQwMDAwMSwgMHgyNzY2MzAwMCwgMHg4ZjgyMDEyOCwgMHgxMGMyMDAwNCwgCisweDAsIDB4OGY4MjAxMjQsIDB4MTRjMjAwMDcsIDB4MCwgCisweDhlZTIwMWE0LCAweDgwMjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIAorMHg4MDAyZjA3LCAweDhlZTIwMWE0LCAweDhlZTIwNGU0LCAweGFjNjIwMDFjLCAKKzB4OGVlNDA0YjAsIDB4OGVlNTA0YjQsIDB4MjQ2MjAwMWMsIDB4YWM2MjAwMDgsIAorMHgyNDAyMDAwOCwgMHhhNDYyMDAwZSwgMHgyNDAyMDAxMSwgMHhhYzYyMDAxOCwgCisweGFjNjQwMDAwLCAweGFjNjUwMDA0LCAweDhlZTIwNGM0LCAweGFjNjIwMDEwLCAKKzB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzcsIDB4MjQxMDAwMDEsIAorMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAKKzB4OGM4MzAwMDAsIDB4MjQwMjAwMTIsIDB4MTQ2MjAwMWYsIDB4MCwgCisweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDI0MGMwMDQwLCAKKzB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIAorMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDRjMDAwNywgMHgwLCAKKzB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwgCisweDgwMDJlZjEsIDB4MCwgMHgxNDYwMDAwNSwgMHgwLCAKKzB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIAorMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMywgMHhhYzgwMDAwMCwgCisweDgwMDJmMDcsIDB4MCwgMHg4ZWUyNGUzMCwgMHgyNDBjMDA0MCwgCisweDI0NDIwMDAxLCAweDUwNGMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIAorMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMTIsIDB4MjQwYzAwMDEsIAorMHhhYzgyMDAwMCwgMHhhYzhjMDAwNCwgMHg1NjAwMDAwZCwgMHgyNDEwMDAwMSwgCisweDhlZTIwNGU0LCAweDNjMDQwMDAxLCAweDI0ODQ1NzU0LCAweGFmYTAwMDE0LCAKKzB4YWZhMjAwMTAsIDB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIAorMHgzNGE1ZjAwNiwgMHhjMDAyNDAzLCAweGFmYWIwMDM4LCAweDhmYWIwMDM4LCAKKzB4MTYwMDAwMDMsIDB4MjQwYzAwMDEsIDB4ODAwMmY1YywgMHhhMmVjMDRmNCwgCisweDhlZTIwMTcwLCAweDI0NDIwMDAxLCAweGFlZTIwMTcwLCAweDhlZTIwMTcwLCAKKzB4OGVlMjA0ZTQsIDB4YTJlMDA0ZjQsIDB4YWVlMDA0ZjAsIDB4YWVlMDcyNzQsIAorMHhhZWUyMDRmOCwgMHg4ZjQyMDIzYywgMHgxMDQwMDAzOCwgMHgwLCAKKzB4OGVlMjAxODQsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxODQsIDB4ODAwMmY1YywgCisweDhlZTIwMTg0LCAweDhlZTIwNTA0LCAweDI0MGMwMDQwLCAweDI0NDIwMDAxLCAKKzB4NTA0YzAwMDMsIDB4MTAyMSwgMHg4ZWUyMDUwNCwgMHgyNDQyMDAwMSwgCisweGFlZTIwNTA0LCAweDhlZTIwNTA0LCAweDhlNjMwMDE4LCAweDI0MGMwMDAzLCAKKzB4MjEwODAsIDB4NTcxMDIxLCAweDE0NmMwMDBmLCAweDhjNDQwNTA4LCAKKzB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2IxLCAweDEwNDAwMDE0LCAKKzB4MCwgMHg4ZWUyMDFkMCwgMHg4ZWUzNTI0MCwgMHg0NDEwMjEsIAorMHhhZWUyMDFkMCwgMHg4ZWUyMDFkOCwgMHg2NDE4MjEsIDB4MzA2MzAwZmYsIAorMHg4MDAyZjRmLCAweGFlZTM1MjQwLCAweDhlZTIwMWNjLCAweDhlZTMwZTEwLCAKKzB4NDQxMDIxLCAweGFlZTIwMWNjLCAweDhlZTIwMWQ4LCAweDY0MTgyMSwgCisweDMwNjMwMWZmLCAweGFlZTMwZTEwLCAweDQ0MTAyMSwgMHhhZWUyMDFkOCwgCisweDhlZTIwMDAwLCAweDM0NDIwMDQwLCAweDgwMDJmNWMsIDB4YWVlMjAwMDAsIAorMHg4ZWUyMDE0YywgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMDgzZTAsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDE0YywgMHg4ZWUyMDE0YywgMHg4ZjgyMDEwOCwgCisweDI0NDIwMDIwLCAweGFmODIwMTA4LCAweDhmODIwMTA4LCAweDhmODIwMTA4LCAKKzB4Mjc2MzMwMDAsIDB4NDMxMDJiLCAweDE0NDAwMDAyLCAweDI3NjIyODAwLCAKKzB4YWY4MjAxMDgsIDB4OGY4MzAxMDgsIDB4OGY4MjAxMDQsIDB4MTQ2MmZjMWUsIAorMHgwLCAweDhmYmYwMDYwLCAweDhmYmUwMDVjLCAweDhmYjYwMDU4LCAKKzB4OGZiNTAwNTQsIDB4OGZiNDAwNTAsIDB4OGZiMzAwNGMsIDB4OGZiMjAwNDgsIAorMHg4ZmIxMDA0NCwgMHg4ZmIwMDA0MCwgMHgzZTAwMDA4LCAweDI3YmQwMDY4LCAKKzB4NTI4NDMsIDB4MTBhMDAwMGQsIDB4MzAyMSwgMHgzYzAzMDAwMSwgCisweDM0NjMzODAwLCAweDNjMDdmZmZmLCAweDM2MzEwMjEsIDB4ODIxMDJiLCAKKzB4NTA0MDAwMDEsIDB4ODcyMDIxLCAweDk0ODIwMDAwLCAweDI0ODQwMDAyLCAKKzB4MjRhNWZmZmYsIDB4MTRhMGZmZjgsIDB4YzIzMDIxLCAweDYxYzAyLCAKKzB4MzBjMmZmZmYsIDB4NjIzMDIxLCAweDYxYzAyLCAweDMwYzJmZmZmLCAKKzB4NjIzMDIxLCAweDNlMDAwMDgsIDB4MzBjMmZmZmYsIDB4MjdiZGZmODgsIAorMHgyNDBmMDAwMSwgMHhhZmJmMDA3MCwgMHhhZmJlMDA2YywgMHhhZmI2MDA2OCwgCisweGFmYjUwMDY0LCAweGFmYjQwMDYwLCAweGFmYjMwMDVjLCAweGFmYjIwMDU4LCAKKzB4YWZiMTAwNTQsIDB4YWZiMDAwNTAsIDB4YTNhMDAwMjcsIDB4YWZhZjAwMmMsIAorMHg4ZWUyMDRkNCwgMHg4MDIxLCAweDMwNDIwMDAxLCAweDE0NDAwMDJhLCAKKzB4YTNhMDAwMzcsIDB4OGY4NzAwZTAsIDB4OGY4ODAwYzQsIDB4OGY4MjAwZTgsIAorMHhlMjIwMjMsIDB4MmM4MjEwMDAsIDB4NTA0MDAwMDEsIDB4MjQ4NDEwMDAsIAorMHg0MjBjMiwgMHg4MDE4MjEsIDB4OGVlNDAwYzgsIDB4OGVlNTAwY2MsIAorMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAKKzB4ODYyMDIxLCAweGFlZTQwMGM4LCAweGFlZTUwMGNjLCAweDhmODMwMGM4LCAKKzB4M2MwMjAwMGEsIDB4MzQ0MmVmZmYsIDB4MTAzMjAyMywgMHg0NDEwMmIsIAorMHgxMDQwMDAwMywgMHgzYzAyMDAwYSwgMHgzNDQyZjAwMCwgMHg4MjIwMjEsIAorMHg4MDE4MjEsIDB4OGVlNDAwYzAsIDB4OGVlNTAwYzQsIDB4MTAyMSwgCisweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAweDg2MjAyMSwgCisweGFlZTQwMGMwLCAweGFlZTUwMGM0LCAweGFmODgwMGM4LCAweGFmODcwMGU0LCAKKzB4ODAwMzRjYywgMHhhZjg3MDBlOCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIAorMHg5MDQyODNjMCwgMHgxMDQwMDAwYiwgMHgwLCAweDNjMTQwMDAxLCAKKzB4Mjk3YTAyMSwgMHg4ZTk0ODNjNCwgMHgzYzEzMDAwMSwgMHgyNzc5ODIxLCAKKzB4OGU3MzgzYzgsIDB4M2MxMjAwMDEsIDB4MjU3OTAyMSwgMHg4MDAzMTkzLCAKKzB4OGU1MjgzY2MsIDB4OGY4MzAwZTAsIDB4OGY4MjAwZTQsIDB4MTA0MzAwMDcsIAorMHg4ODIxLCAweDhmODIwMGU0LCAweDI0MTEwMDAxLCAweDhjNDMwMDAwLCAKKzB4OGM0NDAwMDQsIDB4YWZhMzAwMTgsIDB4YWZhNDAwMWMsIDB4MTYyMDAwMGUsIAorMHgzYzAyZmZmZiwgMHg4ZjgyMDBjNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDBjOCwgCisweDNjMDQwMDAxLCAweDI0ODQ1ODcwLCAweGFmYTIwMDE0LCAweDhmODYwMGUwLCAKKzB4OGY4NzAwZTQsIDB4M2MwNTAwMDYsIDB4YzAwMjQwMywgMHgzNGE1ZjAwMCwgCisweDgwMDM0Y2MsIDB4MCwgMHg4ZmEzMDAxYywgMHg4ZmIyMDAxOCwgCisweDMwNzRmZmZmLCAweDI2OTRmZmZjLCAweDYyMTAyNCwgMHgxMDQwMDA1OCwgCisweDI0MDk4MjEsIDB4M2MwMjAwODAsIDB4NjIxMDI0LCAweDEwNDAwMDBhLCAKKzB4M2MwNDAwNDAsIDB4OGVlMjAwN2MsIDB4MjQ0MjAwMDEsIDB4YWVlMjAwN2MsIAorMHg4ZWUyMDA3YywgMHg4ZWUyMDFmYywgMHgyNDQyMDAwMSwgMHhhZWUyMDFmYywgCisweDgwMDM0YzYsIDB4OGVlMjAxZmMsIDB4M2MwNjAwMDQsIDB4M2MwYjAwMDEsIAorMHgzYzBhMDAwMiwgMHgzYzA1MDAxMCwgMHgzYzA5MDAwOCwgMHg4ZWUyMDA4MCwgCisweDNjMDgwMDIwLCAweDM0MDc4MDAwLCAweDI0NDIwMDAxLCAweGFlZTIwMDgwLCAKKzB4OGVlMjAwODAsIDB4OGZhMjAwMWMsIDB4NDQxODI0LCAweDEwNjYwMDIxLCAKKzB4YzMxMDJiLCAweDE0NDAwMDA3LCAweDAsIDB4MTA2YjAwMTEsIAorMHgwLCAweDEwNmEwMDE1LCAweDAsIDB4ODAwMzA0OSwgCisweDQyMDQyLCAweDEwNjUwMDIzLCAweGEzMTAyYiwgMHgxNDQwMDAwNSwgCisweDAsIDB4MTA2OTAwMTksIDB4MCwgMHg4MDAzMDQ5LCAKKzB4NDIwNDIsIDB4MTA2ODAwMjEsIDB4MCwgMHg4MDAzMDQ5LCAKKzB4NDIwNDIsIDB4OGVlMjAwMzQsIDB4MjQ0MjAwMDEsIDB4YWVlMjAwMzQsIAorMHg4ZWUyMDAzNCwgMHg4MDAzMDQ5LCAweDQyMDQyLCAweDhlZTIwMWVjLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxZWMsIDB4OGVlMjAxZWMsIDB4ODAwMzA0OSwgCisweDQyMDQyLCAweDhlZTIwMWYwLCAweDI0NDIwMDAxLCAweGFlZTIwMWYwLCAKKzB4OGVlMjAxZjAsIDB4ODAwMzA0OSwgMHg0MjA0MiwgMHg4ZWUyMDFmNCwgCisweDI0NDIwMDAxLCAweGFlZTIwMWY0LCAweDhlZTIwMWY0LCAweDgwMDMwNDksIAorMHg0MjA0MiwgMHg4ZWUyMDAzMCwgMHgyNDQyMDAwMSwgMHhhZWUyMDAzMCwgCisweDhlZTIwMDMwLCAweDgwMDMwNDksIDB4NDIwNDIsIDB4OGVlMjAxZjgsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFmOCwgMHg4ZWUyMDFmOCwgMHg0MjA0MiwgCisweDEwODcwNDdjLCAweDAsIDB4ODAwMzAwZSwgMHgwLCAKKzB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2IyLCAweDE0NDAwMDg0LCAKKzB4MjQwMjAwMDEsIDB4M2MwMzAwMDEsIDB4NzcxODIxLCAweDkwNjM4M2IzLCAKKzB4MTQ2MjAwN2YsIDB4M2MwMjAxMDAsIDB4OGU0MzAwMDAsIDB4NjIxMDI0LCAKKzB4MTA0MDAwNmYsIDB4MjQwMmZmZmYsIDB4MTQ2MjAwMDUsIDB4MjQxMDAwMDEsIAorMHg5NjQzMDAwNCwgMHgzNDAyZmZmZiwgMHgxMDYyMDA3NSwgMHgwLCAKKzB4OTJlMjA0ZDgsIDB4MTQ0MDAwNzIsIDB4MCwgMHgzYzAyMDAwMSwgCisweDU3MTAyMSwgMHg4YzQyODNiNCwgMHgyODQyMDAwNSwgMHgxMDQwMDAyMCwgCisweDM4MjEsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2I0LCAKKzB4MTg0MDAwMTYsIDB4MjgyMSwgMHg5NjY2MDAwMCwgMHg1MjBjMCwgCisweDk3MTAyMSwgMHg5NDQyNzc3ZSwgMHgxNDQ2MDAwOSwgMHg5NzEwMjEsIAorMHg5NDQzNzc4MCwgMHg5NjYyMDAwMiwgMHgxNDYyMDAwNSwgMHg5NzEwMjEsIAorMHg5NDQzNzc4MiwgMHg5NjYyMDAwNCwgMHg1MDYyMDAwOCwgMHgyNDA3MDAwMSwgCisweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwgMHgyNGE1MDAwMSwgCisweGEyMTAyYSwgMHg1NDQwZmZlZSwgMHg1MjBjMCwgMHgzMGUyMDBmZiwgCisweDEwNDAwNDQwLCAweDAsIDB4ODAwMzBkNSwgMHgwLCAKKzB4MjQwMjAyMSwgMHhjMDAyMmZlLCAweDI0MDUwMDA2LCAweDMwNDQwMDFmLCAKKzB4NDI4YzAsIDB4MmU1MTAyMSwgMHg5NDQyNzI3YywgMHgzMDQyNDAwMCwgCisweDE0NDAwNDM0LCAweGI3MTAyMSwgMHg5NDQzNzI3ZSwgMHg5NjYyMDAwMCwgCisweDE0NjIwMDBiLCAweDQxOGMwLCAweGI3MTAyMSwgMHg5NDQzNzI4MCwgCisweDk2NjIwMDAyLCAweDE0NjIwMDA2LCAweDQxOGMwLCAweGI3MTAyMSwgCisweDk0NDM3MjgyLCAweDk2NjIwMDA0LCAweDEwNjIwMDM1LCAweDQxOGMwLCAKKzB4MmUzMTAyMSwgMHg5NDQyNzI3YywgMHgzMDQyODAwMCwgMHgxNDQwMDQyMSwgCisweDJlMzEwMjEsIDB4OTQ0YjcyN2MsIDB4OTY2NzAwMDAsIDB4YjI4YzAsIAorMHhiNzEwMjEsIDB4OTQ0MjczN2UsIDB4ODAwMzBiNywgMHgzMDIxLCAKKzB4NDIwYzAsIDB4MmU0MTAyMSwgMHg5NDQzNzM3YywgMHgyZTQxMDIxLCAKKzB4OTQ0YjczN2MsIDB4MzA2MzgwMDAsIDB4MTQ2MDAwMTAsIDB4YjI4YzAsIAorMHhiNzEwMjEsIDB4OTQ0MjczN2UsIDB4MTQ0N2ZmZjUsIDB4MTYwMjAyMSwgCisweGI3MTAyMSwgMHg5NDQzNzM4MCwgMHg5NjYyMDAwMiwgMHg1NDYyZmZmMSwgCisweDQyMGMwLCAweGI3MTAyMSwgMHg5NDQzNzM4MiwgMHg5NjYyMDAwNCwgCisweDU0NjJmZmVjLCAweDQyMGMwLCAweDI0MDYwMDAxLCAweDMwYzIwMGZmLCAKKzB4MTA0MDA0MDAsIDB4MCwgMHg4MDAzMGQ1LCAweDAsIAorMHg5NzQzMDIwMiwgMHg5NjQyMDAwMCwgMHgxNDYyMDNmYSwgMHgwLCAKKzB4OTc0MzAyMDQsIDB4OTY0MjAwMDIsIDB4MTQ2MjAzZjYsIDB4MCwgCisweDk3NDMwMjA2LCAweDk2NDIwMDA0LCAweDE0NjIwM2YyLCAweDAsIAorMHg5MjQyMDAwMCwgMHgzYTAzMDAwMSwgMHgzMDQyMDAwMSwgMHg0MzEwMjQsIAorMHgxMDQwMDA3NCwgMHgyNDAyZmZmZiwgMHg4ZTYzMDAwMCwgMHgxNDYyMDAwNCwgCisweDM0MDJmZmZmLCAweDk2NjMwMDA0LCAweDEwNjIwMDZmLCAweDI0MGYwMDAyLCAKKzB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2IyLCAweDE0NDAwMDZhLCAKKzB4MjQwZjAwMDMsIDB4OTJlMjA0ZDgsIDB4NTQ0MDAwNjgsIDB4YWZhZjAwMmMsIAorMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzYjQsIDB4Mjg0MjAwMDUsIAorMHgxMDQwMDAyMCwgMHgzODIxLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgCisweDhjNDI4M2I0LCAweDE4NDAwMDE2LCAweDI4MjEsIDB4OTY2NjAwMDAsIAorMHg1MjBjMCwgMHg5NzEwMjEsIDB4OTQ0Mjc3N2UsIDB4MTQ0NjAwMDksIAorMHg5NzEwMjEsIDB4OTQ0Mzc3ODAsIDB4OTY2MjAwMDIsIDB4MTQ2MjAwMDUsIAorMHg5NzEwMjEsIDB4OTQ0Mzc3ODIsIDB4OTY2MjAwMDQsIDB4NTA2MjAwMDgsIAorMHgyNDA3MDAwMSwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzYjQsIAorMHgyNGE1MDAwMSwgMHhhMjEwMmEsIDB4NTQ0MGZmZWUsIDB4NTIwYzAsIAorMHgzMGUyMDBmZiwgMHgxNDQwMDA0NCwgMHgyNDBmMDAwMywgMHg4MDAzNGM2LCAKKzB4MCwgMHgyNDAyMDIxLCAweGMwMDIyZmUsIDB4MjQwNTAwMDYsIAorMHgzMDQ0MDAxZiwgMHg0MjhjMCwgMHgyZTUxMDIxLCAweDk0NDI3MjdjLCAKKzB4MzA0MjQwMDAsIDB4MTQ0MDAzYWYsIDB4YjcxMDIxLCAweDk0NDM3MjdlLCAKKzB4OTY2MjAwMDAsIDB4MTQ2MjAwMGIsIDB4NDE4YzAsIDB4YjcxMDIxLCAKKzB4OTQ0MzcyODAsIDB4OTY2MjAwMDIsIDB4MTQ2MjAwMDYsIDB4NDE4YzAsIAorMHhiNzEwMjEsIDB4OTQ0MzcyODIsIDB4OTY2MjAwMDQsIDB4MTA2MjAwMjcsIAorMHg0MThjMCwgMHgyZTMxMDIxLCAweDk0NDI3MjdjLCAweDMwNDI4MDAwLCAKKzB4MTQ0MDAzOWMsIDB4MmUzMTAyMSwgMHg5NDRiNzI3YywgMHg5NjY3MDAwMCwgCisweGIyOGMwLCAweGI3MTAyMSwgMHg5NDQyNzM3ZSwgMHg4MDAzMTNjLCAKKzB4MzAyMSwgMHg0MjBjMCwgMHgyZTQxMDIxLCAweDk0NDM3MzdjLCAKKzB4MmU0MTAyMSwgMHg5NDRiNzM3YywgMHgzMDYzODAwMCwgMHgxNDYwMDAxMCwgCisweGIyOGMwLCAweGI3MTAyMSwgMHg5NDQyNzM3ZSwgMHgxNDQ3ZmZmNSwgCisweDE2MDIwMjEsIDB4YjcxMDIxLCAweDk0NDM3MzgwLCAweDk2NjIwMDAyLCAKKzB4NTQ2MmZmZjEsIDB4NDIwYzAsIDB4YjcxMDIxLCAweDk0NDM3MzgyLCAKKzB4OTY2MjAwMDQsIDB4NTQ2MmZmZWMsIDB4NDIwYzAsIDB4MjQwNjAwMDEsIAorMHgzMGMyMDBmZiwgMHgxMDQwMDM3YiwgMHgwLCAweDgwMDMxNGYsIAorMHgyNDBmMDAwMywgMHgyNDBmMDAwMSwgMHhhZmFmMDAyYywgMHg4ZjQyMDI2MCwgCisweDU0MTAyYiwgMHgxMDQwMDAzYSwgMHgwLCAweDhmODMwMGU0LCAKKzB4OGY4MjAwZTAsIDB4MTA2MjAwMDMsIDB4MjQ2MzAwMDgsIDB4YWY4MzAwZTQsIAorMHhhZjgzMDBlOCwgMHg4ZWU0MDBjMCwgMHg4ZWU1MDBjNCwgMHgyODAxODIxLCAKKzB4MTAyMSwgMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwgCisweDg2MjAyMSwgMHhhZWU0MDBjMCwgMHhhZWU1MDBjNCwgMHg4ZWUyMDA1OCwgCisweDI0NDIwMDAxLCAweGFlZTIwMDU4LCAweDhlZTIwMDU4LCAweDhlZTIwMDdjLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAwN2MsIDB4OGVlMjAwN2MsIDB4OGY4MjAwZTAsIAorMHhhZmEyMDAxMCwgMHg4ZjgyMDBlNCwgMHgzYzA0MDAwMSwgMHgyNDg0NTg3OCwgCisweGFmYTIwMDE0LCAweDhmYTYwMDE4LCAweDhmYTcwMDFjLCAweDNjMDUwMDA2LCAKKzB4YzAwMjQwMywgMHgzNGE1ZjAwMywgMHg4MDAzNGNjLCAweDAsIAorMHg4ZWUyNTI0MCwgMHhhZmEyMDAxMCwgMHg4ZWUyNTI0NCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1ODg0LCAweGFmYTIwMDE0LCAweDhlZTYwZTEwLCAweDhlZTcwZTE4LCAKKzB4M2MwNTAwMDYsIDB4YzAwMjQwMywgMHgzNGE1ZjAwMiwgMHg4ZWUyMDFjMCwgCisweDI0NDIwMDAxLCAweGFlZTIwMWMwLCAweDhlZTIwMDAwLCAweDhlZTMwMWMwLCAKKzB4MjQwM2ZmYmYsIDB4NDMxMDI0LCAweDgwMDM0NzAsIDB4YWVlMjAwMDAsIAorMHg5NmUyMDQ2OCwgMHg1NDEwMmIsIDB4MTA0MDAwMDMsIDB4MCwgCisweDI0MGYwMDAxLCAweGEzYWYwMDI3LCAweDEyODAwMzAxLCAweDI0MTYwMDA3LCAKKzB4MjQxNTAwNDAsIDB4MjQxZTAwMDEsIDB4MjQwZTAwMTIsIDB4OGVlMjcyNGMsIAorMHg4ZjQzMDI4MCwgMHgyNDQyMDAwMSwgMHgzMDQyMDdmZiwgMHgxMDYyMDJkMywgCisweDAsIDB4OTNhMjAwMjcsIDB4MTA0MDAwMTQsIDB4MCwgCisweDhlZTM1MjQwLCAweDhlZTI1MjQ0LCAweDEwNjIwMDA5LCAweDI2ZWQ1MjQ0LCAKKzB4OGVlNjUyNDQsIDB4OGVlMzUyNDQsIDB4MjExNDAsIDB4MjQ0MjUyNDgsIAorMHgyZTI4MDIxLCAweDI0NjMwMDAxLCAweDgwMDMxYmYsIDB4MzA2YjAwZmYsIAorMHg5MmUyNzI0OCwgMHgxNDQwZmZjYSwgMHgwLCAweDhlZTIwMWUwLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxZTAsIDB4OGVlMjAxZTAsIDB4OGVlMzBlMTAsIAorMHg4ZWUyMGUxOCwgMHgxMDYyZmZjMiwgMHgyNmVkMGUxOCwgMHg4ZWU2MGUxOCwgCisweDhlZTMwZTE4LCAweDIxMTQwLCAweDI0NDIwZTIwLCAweDJlMjgwMjEsIAorMHgyNDYzMDAwMSwgMHgzMDZiMDFmZiwgMHg5NmUyMDQ2YSwgMHgzMDQyMDAxMCwgCisweDEwNDAwMDE5LCAweDAsIDB4OTY0MjAwMGMsIDB4MzQwZjgxMDAsIAorMHgxNDRmMDAxNSwgMHgwLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgCisweDkwNDI4M2MwLCAweDE0NDAwMDEwLCAweDAsIDB4OTY0MjAwMGUsIAorMHhhNjAyMDAxNiwgMHg4ZTQyMDAwOCwgMHg4ZTQzMDAwNCwgMHg4ZTQ0MDAwMCwgCisweDI2OTRmZmZjLCAweGFlNDIwMDBjLCAweGFlNDMwMDA4LCAweGFlNDQwMDA0LCAKKzB4OTYwMjAwMGUsIDB4MjY3MzAwMDQsIDB4MjQwZjAwMDEsIDB4YTNhZjAwMzcsIAorMHgzNDQyMDIwMCwgMHhhNjAyMDAwZSwgMHg4ZTAyMDAwMCwgMHg4ZTAzMDAwNCwgCisweDNjMDQwMDAxLCAweDM0ODQzODAwLCAweDMwNmEwMDA3LCAweDI2YTk4MjMsIAorMHgzNjQxMDIxLCAweDI2MjEwMmIsIDB4MTA0MDAwMDUsIDB4MjhhYTAyMSwgCisweDI2NDEwMjMsIDB4MzYyMTgyMywgMHgzYzAyMDAyMCwgMHg0Mzk4MjMsIAorMHgyNjgyMDAwNywgMHgyNDA0ZmZmOCwgMHg5NjAzMDAwYSwgMHg0NDYwMjQsIAorMHg2YTE4MjEsIDB4NmMxMDJiLCAweDEwNDAwMDAyLCAweDE4MDM4MjEsIAorMHg2MDM4MjEsIDB4YWUxMzAwMTgsIDB4OGY4ODAxMjAsIDB4MjRlMjAwMDcsIAorMHg0NDM4MjQsIDB4Mjc2MjM4MDAsIDB4MjUwOTAwMjAsIDB4MTIyMTAyYiwgCisweDUwNDAwMDAxLCAweDI3NjkzMDAwLCAweDhmODIwMTI4LCAweDExMjIwMDA0LCAKKzB4MCwgMHg4ZjgyMDEyNCwgMHgxNTIyMDAwNywgMHgxNDAxODIxLCAKKzB4OGVlMjAxYTQsIDB4ODgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgCisweDgwMDMyNGMsIDB4OGVlMjAxYTQsIDB4OGUwNDAwMDAsIDB4OGUwNTAwMDQsIAorMHgxMDIxLCAweGFkMTMwMDA4LCAweGE1MDcwMDBlLCAweGFkMTYwMDE4LCAKKzB4YWQwNjAwMWMsIDB4YTMzMDJiLCAweGEzMjgyMywgMHg4MjIwMjMsIAorMHg4NjIwMjMsIDB4YWQwNDAwMDAsIDB4YWQwNTAwMDQsIDB4OGVlMjA0YzAsIAorMHhhZDAyMDAxMCwgMHhhZjg5MDEyMCwgMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywgCisweDI0MTEwMDAxLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAKKzB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgMHgxNDU2MDAxZiwgMHgwLCAKKzB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIDB4MCwgCisweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAKKzB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA1NTAwMDcsIDB4MCwgCisweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwNjIwMDA1LCAweDAsIAorMHg4MDAzMjM5LCAweDAsIDB4MTQ2MDAwMDUsIDB4MCwgCisweDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAKKzB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsIAorMHg4MDAzMjRjLCAweDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIAorMHg1MDU1MDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAKKzB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIAorMHgyZTIyMDIxLCAweGFjOTYwMDAwLCAweGFjOWUwMDA0LCAweDE2MjAwMDE4LCAKKzB4M2MwNTAwMDYsIDB4OGUwMjAwMTgsIDB4M2MwNDAwMDEsIDB4MjQ4NDU4OTAsIAorMHhhZmEyMDAxMCwgMHg4ZTAyMDAwMCwgMHg4ZTAzMDAwNCwgMHgzNGE1ZjAwOSwgCisweDIwMDMwMjEsIDB4YzAwMjQwMywgMHhhZmEzMDAxNCwgMHg5M2EyMDAzNywgCisweDEwNDAwMjE2LCAweDM0MGY4MTAwLCAweDhlNDIwMDA0LCAweDhlNDMwMDA4LCAKKzB4OGU0NDAwMGMsIDB4YTY0ZjAwMGMsIDB4YWU0MjAwMDAsIDB4YWU0MzAwMDQsIAorMHhhZTQ0MDAwOCwgMHg5NjAyMDAxNiwgMHg4MDAzNDcwLCAweGE2NDIwMDBlLCAKKzB4MTRlYzAxNjgsIDB4MjhhMTgyMywgMHg5NjBjMDAwYSwgMHg5NjAzMDAwZSwgCisweDI4YTEwMjMsIDB4YTYwMjAwMGEsIDB4MzQ2MjAwMDQsIDB4YTYwMjAwMGUsIAorMHg4Zjg4MDEyMCwgMHgyNzYyMzgwMCwgMHgyNTA5MDAyMCwgMHgxMjIxMDJiLCAKKzB4MTQ0MDAwMDIsIDB4MzA2YWZmZmYsIDB4Mjc2OTMwMDAsIDB4OGY4MjAxMjgsIAorMHgxMTIyMDAwNCwgMHgwLCAweDhmODIwMTI0LCAweDE1MjIwMDA3LCAKKzB4MjQwNDAwMjAsIDB4OGVlMjAxYTQsIDB4ODgyMSwgMHgyNDQyMDAwMSwgCisweGFlZTIwMWE0LCAweDgwMDMyY2EsIDB4OGVlMjAxYTQsIDB4OGVlNTcyNGMsIAorMHg4ZWU2MDQ5MCwgMHg4ZWU3MDQ5NCwgMHhhNTA0MDAwZSwgMHgyNDA0MDAwNCwgCisweGFkMTAwMDA4LCAweGFkMDQwMDE4LCAweDUyOTQwLCAweGEwMTgyMSwgCisweDEwMjEsIDB4ZTMzODIxLCAweGUzMjAyYiwgMHhjMjMwMjEsIAorMHhjNDMwMjEsIDB4YWQwNjAwMDAsIDB4YWQwNzAwMDQsIDB4OGVlMjcyNGMsIAorMHhhZDAyMDAxYywgMHg4ZWUyMDRjNCwgMHhhZDAyMDAxMCwgMHhhZjg5MDEyMCwgCisweDkyZTI0ZTIwLCAweDE0NDAwMDMzLCAweDI0MTEwMDAxLCAweDhlZTI0ZTMwLCAKKzB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgCisweDE0NTYwMDFmLCAweDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIAorMHgxMDYyMDAxYiwgMHgwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAKKzB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIAorMHgxMDU1MDAwNywgMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAKKzB4MTA2MjAwMDUsIDB4MCwgMHg4MDAzMmI3LCAweDAsIAorMHgxNDYwMDAwNSwgMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLCAKKzB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIAorMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwgMHg4MDAzMmNhLCAweDAsIAorMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHg1MDU1MDAwMywgMHgxMDIxLCAKKzB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIAorMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweGFjOTYwMDAwLCAKKzB4YWM5ZTAwMDQsIDB4MTYyMDAwMGQsIDB4MCwgMHhhNjBjMDAwYSwgCisweGE2MGEwMDBlLCAweDhmODIwMTAwLCAweGFmYTIwMDEwLCAweDhmODIwMTA0LCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDU4OWMsIDB4M2MwNTAwMDYsIDB4YWZhMjAwMTQsIAorMHg4ZWU2NzI0YywgMHg4MDAzNDNiLCAweDM0YTVmMDBiLCAweDNjMDEwMDAxLCAKKzB4MzcwODIxLCAweGEwMjA4M2MwLCAweGFkYWIwMDAwLCAweDhlZTIwMWQ4LCAKKzB4OGVlMzcyNGMsIDB4MjQ0MmZmZmYsIDB4YWVlMjAxZDgsIDB4OGVlMjAxZDgsIAorMHgyNDYzMDAwMSwgMHgzMDYzMDdmZiwgMHgyNmUyNTI0NCwgMHgxNWEyMDAwNiwgCisweGFlZTM3MjRjLCAweDhlZTIwMWQwLCAweDI0NDJmZmZmLCAweGFlZTIwMWQwLCAKKzB4ODAwMzJlZiwgMHg4ZWUyMDFkMCwgMHg4ZWUyMDFjYywgMHgyNDQyZmZmZiwgCisweGFlZTIwMWNjLCAweDhlZTIwMWNjLCAweDhmNDIwMjQwLCAweDEwNDAwMDczLCAKKzB4MCwgMHg4ZWUyMGUxYywgMHgyNDQyMDAwMSwgMHhhZWUyMGUxYywgCisweDhmNDMwMjQwLCAweDQzMTAyYiwgMHgxNDQwMDE3NiwgMHhhMDIxLCAKKzB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAKKzB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIAorMHgwLCAweDhmODIwMTI0LCAweDE0YzIwMDA3LCAweDAsIAorMHg4ZWUyMDFhNCwgMHg4ODIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAKKzB4ODAwMzM0ZiwgMHg4ZWUyMDFhNCwgMHg4ZWUyNzI0YywgMHhhYzYyMDAxYywgCisweDhlZTQwNGE4LCAweDhlZTUwNGFjLCAweDI0NjIwMDFjLCAweGFjNjIwMDA4LCAKKzB4MjQwMjAwMDgsIDB4YTQ2MjAwMGUsIDB4MjQwMjAwMTEsIDB4YWM2MjAwMTgsIAorMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwgCisweGFmODYwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDMzLCAweDI0MTEwMDAxLCAKKzB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgCisweDhjODIwMDAwLCAweDE0NGUwMDFmLCAweDAsIDB4OGVlMzRlMzAsIAorMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLCAweDhjODIwMDA0LCAKKzB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsIAorMHgyNDQyMDAwMSwgMHgxMDU1MDAwNywgMHgwLCAweDhlZTI0ZTM0LCAKKzB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwgMHg4MDAzMzNjLCAKKzB4MCwgMHgxNDYwMDAwNSwgMHgwLCAweDhmODIwMTI4LCAKKzB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIAorMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgMHhhYzgwMDAwMCwgMHg4MDAzMzRmLCAKKzB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHg1MDU1MDAwMywgCisweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIAorMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAKKzB4YWM4ZTAwMDAsIDB4YWM5ZTAwMDQsIDB4NTYyMDAwMGQsIDB4MjQxMTAwMDEsIAorMHg4ZWUyNzI0YywgMHgzYzA0MDAwMSwgMHgyNDg0NThhOCwgMHhhZmEwMDAxNCwgCisweGFmYTIwMDEwLCAweDhlZTY3MjRjLCAweDhmNDcwMjgwLCAweDNjMDUwMDA5LCAKKzB4MzRhNWYwMDgsIDB4YzAwMjQwMywgMHhhZmFlMDA0OCwgMHg4ZmFlMDA0OCwgCisweDU2MjAwMDAxLCAweGFlZTAwZTFjLCAweDhlZTIwMTg4LCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxODgsIDB4ODAwMzNjOCwgMHg4ZWUyMDE4OCwgMHg4ZjgzMDEyMCwgCisweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgCisweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsIAorMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LCAKKzB4ODgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAzM2JhLCAKKzB4OGVlMjAxYTQsIDB4OGVlMjcyNGMsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YTgsIAorMHg4ZWU1MDRhYywgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHgyNDAyMDAwOCwgCisweGE0NjIwMDBlLCAweDI0MDIwMDExLCAweGFjNjIwMDE4LCAweGFjNjQwMDAwLCAKKzB4YWM2NTAwMDQsIDB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIAorMHg5MmUyNGUyMCwgMHgxNDQwMDAzMywgMHgyNDExMDAwMSwgMHg4ZWUyNGUzMCwgCisweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MjAwMDAsIAorMHgxNDRlMDAxZiwgMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAKKzB4MTA2MjAwMWIsIDB4MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgCisweGFjODIwMDA0LCAweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAKKzB4MTA1NTAwMDcsIDB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgCisweDEwNjIwMDA1LCAweDAsIDB4ODAwMzNhNywgMHgwLCAKKzB4MTQ2MDAwMDUsIDB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgCisweGFmODIwMTI4LCAweDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAKKzB4NTA0MDAwMTAsIDB4YWM4MDAwMDAsIDB4ODAwMzNiYSwgMHgwLCAKKzB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4NTA1NTAwMDMsIDB4MTAyMSwgCisweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAKKzB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHhhYzhlMDAwMCwgCisweGFjOWUwMDA0LCAweDE2MjAwMDBkLCAweDAsIDB4OGVlMjcyNGMsIAorMHgzYzA0MDAwMSwgMHgyNDg0NThhOCwgMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwgCisweDhlZTY3MjRjLCAweDhmNDcwMjgwLCAweDNjMDUwMDA5LCAweDM0YTVmMDA4LCAKKzB4YzAwMjQwMywgMHhhZmFlMDA0OCwgMHg4ZmFlMDA0OCwgMHg4ZWUyMDE3NCwgCisweDI0NDIwMDAxLCAweGFlZTIwMTc0LCAweDhlZTIwMTc0LCAweDgwMDM0NmUsIAorMHhhMDIxLCAweDk2MGMwMDBhLCAweDE4MzEwMmIsIDB4NTQ0MDAwMDEsIAorMHgxODAxODIxLCAweGE2MDMwMDBhLCAweDhmODgwMTIwLCAweDI3NjIzODAwLCAKKzB4MjUwOTAwMjAsIDB4MTIyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY5MzAwMCwgCisweDhmODIwMTI4LCAweDExMjIwMDA0LCAweDAsIDB4OGY4MjAxMjQsIAorMHgxNTIyMDAwNywgMHgyNDA0MDAyMCwgMHg4ZWUyMDFhNCwgMHg4ODIxLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxYTQsIDB4ODAwMzQyZiwgMHg4ZWUyMDFhNCwgCisweDhlZTU3MjRjLCAweDhlZTYwNDkwLCAweDhlZTcwNDk0LCAweGE1MDQwMDBlLCAKKzB4MjQwNDAwMDQsIDB4YWQxMDAwMDgsIDB4YWQwNDAwMTgsIDB4NTI5NDAsIAorMHhhMDE4MjEsIDB4MTAyMSwgMHhlMzM4MjEsIDB4ZTMyMDJiLCAKKzB4YzIzMDIxLCAweGM0MzAyMSwgMHhhZDA2MDAwMCwgMHhhZDA3MDAwNCwgCisweDhlZTI3MjRjLCAweGFkMDIwMDFjLCAweDhlZTIwNGM0LCAweGFkMDIwMDEwLCAKKzB4YWY4OTAxMjAsIDB4OTJlMjRlMjAsIDB4MTQ0MDAwMzMsIDB4MjQxMTAwMDEsIAorMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAKKzB4OGM4MjAwMDAsIDB4MTQ1NjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwgCisweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDAsIDB4OGM4MjAwMDQsIAorMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwgCisweDI0NDIwMDAxLCAweDEwNTUwMDA3LCAweDAsIDB4OGVlMjRlMzQsIAorMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLCAweDgwMDM0MWMsIAorMHgwLCAweDE0NjAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIAorMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgCisweDJjNDIwMDExLCAweDUwNDAwMDEwLCAweGFjODAwMDAwLCAweDgwMDM0MmYsIAorMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweDUwNTUwMDAzLCAKKzB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgCisweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIAorMHhhYzk2MDAwMCwgMHhhYzllMDAwNCwgMHgxNjIwMDAxZCwgMHgwLCAKKzB4YTYwYzAwMGEsIDB4OGY4MjAxMDAsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMDQsIAorMHgzYzA0MDAwMSwgMHgyNDg0NTg5YywgMHgzYzA1MDAwNiwgMHhhZmEyMDAxNCwgCisweDhlZTY3MjRjLCAweDM0YTVmMDBkLCAweGMwMDI0MDMsIDB4MjAwMzgyMSwgCisweDkzYTIwMDM3LCAweDEwNDAwMDMxLCAweDM0MGY4MTAwLCAweDhlNDIwMDA0LCAKKzB4OGU0MzAwMDgsIDB4OGU0NDAwMGMsIDB4YTY0ZjAwMGMsIDB4YWU0MjAwMDAsIAorMHhhZTQzMDAwNCwgMHhhZTQ0MDAwOCwgMHg5NjAyMDAxNiwgMHhhNjQyMDAwZSwgCisweDk2MDIwMDBlLCAweDMwNDJmZGZmLCAweDgwMDM0NzAsIDB4YTYwMjAwMGUsIAorMHg4ZWUyMDFkOCwgMHgyNDQyZmZmZiwgMHhhZWUyMDFkOCwgMHg4ZWUyMDFkOCwgCisweDhlZTIwMWNjLCAweDNjMDQwMDFmLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgCisweGEwM2U4M2MwLCAweDI0NDJmZmZmLCAweGFlZTIwMWNjLCAweDk2MDMwMDBhLCAKKzB4MzQ4NGZmZmYsIDB4OGVlMjAxY2MsIDB4NmExODIxLCAweDI2Mzk4MjEsIAorMHg5MzIwMmIsIDB4MTA4MDAwMDMsIDB4M2MwMmZmZjUsIDB4MzQ0MjEwMDAsIAorMHgyNjI5ODIxLCAweGFkYWIwMDAwLCAweDhlZTI3MjRjLCAweDI0NDIwMDAxLCAKKzB4MzA0MjA3ZmYsIDB4YWVlMjcyNGMsIDB4OGY0MjAyNDAsIDB4MTA0MDAwMDQsIAorMHgyODNhMDIzLCAweDhlZTIwZTFjLCAweDI0NDIwMDAxLCAweGFlZTIwZTFjLCAKKzB4YTNhMDAwMjcsIDB4MTY4MGZkMjksIDB4MCwgMHgxMjgwMDAyNCwgCisweDAsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMzQ4M2M0LCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMzM4M2M4LCAweDNjMDEwMDAxLCAKKzB4MzcwODIxLCAweGFjMzI4M2NjLCAweDkzYTIwMDM3LCAweDEwNDAwMDA4LCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjgzY2MsIAorMHgyNDQyMDAwNCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjgzY2MsIAorMHg4ZWUyNzI0YywgMHg4ZjQzMDI4MCwgMHgyNDQyMDAwMSwgMHgzMDQyMDdmZiwgCisweDE0NjIwMDA2LCAweDAsIDB4OGVlMjAxYzQsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDFjNCwgMHg4MDAzNGNjLCAweDhlZTIwMWM0LCAweDhlZTIwMWJjLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxYmMsIDB4ODAwMzRjYywgMHg4ZWUyMDFiYywgCisweDk3YTQwMDFlLCAweDI0ODRmZmZjLCAweDgwMTgyMSwgMHg4ZWU0MDBjMCwgCisweDhlZTUwMGM0LCAweDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwgCisweDgyMjAyMSwgMHg4NjIwMjEsIDB4YWVlNDAwYzAsIDB4YWVlNTAwYzQsIAorMHg4ZmFmMDAyYywgMHgyNDAyMDAwMiwgMHgxMWUyMDAwZiwgMHgyOWUyMDAwMywgCisweDE0NDAwMDE3LCAweDI0MDIwMDAzLCAweDE1ZTIwMDE1LCAweDAsIAorMHg4ZWUyMDBkMCwgMHg4ZWUzMDBkNCwgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgCisweDQ0MTAyMSwgMHhhZWUyMDBkMCwgMHhhZWUzMDBkNCwgMHg4ZWUyMDBkMCwgCisweDgwMDM0YzYsIDB4OGVlMzAwZDQsIDB4OGVlMjAwZDgsIDB4OGVlMzAwZGMsIAorMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZDgsIAorMHhhZWUzMDBkYywgMHg4ZWUyMDBkOCwgMHg4MDAzNGM2LCAweDhlZTMwMGRjLCAKKzB4OGVlMjAwYzgsIDB4OGVlMzAwY2MsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIAorMHg0NDEwMjEsIDB4YWVlMjAwYzgsIDB4YWVlMzAwY2MsIDB4OGVlMjAwYzgsIAorMHg4ZWUzMDBjYywgMHg4ZjgzMDBlNCwgMHg4ZjgyMDBlMCwgMHgxMDYyMDAwMywgCisweDI0NjMwMDA4LCAweGFmODMwMGU0LCAweGFmODMwMGU4LCAweDhmYmYwMDcwLCAKKzB4OGZiZTAwNmMsIDB4OGZiNjAwNjgsIDB4OGZiNTAwNjQsIDB4OGZiNDAwNjAsIAorMHg4ZmIzMDA1YywgMHg4ZmIyMDA1OCwgMHg4ZmIxMDA1NCwgMHg4ZmIwMDA1MCwgCisweDNlMDAwMDgsIDB4MjdiZDAwNzgsIDB4MjdiZGZmYjAsIDB4YWZiNTAwNDQsIAorMHhhODIxLCAweGFmYjAwMDMwLCAweDgwMjEsIDB4YWZiZjAwNGMsIAorMHhhZmI2MDA0OCwgMHhhZmI0MDA0MCwgMHhhZmIzMDAzYywgMHhhZmIyMDAzOCwgCisweGFmYjEwMDM0LCAweDhlZTIwNGQ0LCAweDI0MTQwMDAxLCAweDMwNDIwMDAxLCAKKzB4MTQ0MDAwMmEsIDB4YjAyMSwgMHg4Zjg3MDBlMCwgMHg4Zjg4MDBjNCwgCisweDhmODIwMGU4LCAweGUyMjAyMywgMHgyYzgyMTAwMCwgMHg1MDQwMDAwMSwgCisweDI0ODQxMDAwLCAweDQyMGMyLCAweDgwMTgyMSwgMHg4ZWU0MDBjOCwgCisweDhlZTUwMGNjLCAweDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwgCisweDgyMjAyMSwgMHg4NjIwMjEsIDB4YWVlNDAwYzgsIDB4YWVlNTAwY2MsIAorMHg4ZjgzMDBjOCwgMHgzYzAyMDAwYSwgMHgzNDQyZWZmZiwgMHgxMDMyMDIzLCAKKzB4NDQxMDJiLCAweDEwNDAwMDAzLCAweDNjMDIwMDBhLCAweDM0NDJmMDAwLCAKKzB4ODIyMDIxLCAweDgwMTgyMSwgMHg4ZWU0MDBjMCwgMHg4ZWU1MDBjNCwgCisweDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsIAorMHg4NjIwMjEsIDB4YWVlNDAwYzAsIDB4YWVlNTAwYzQsIDB4YWY4ODAwYzgsIAorMHhhZjg3MDBlNCwgMHg4MDAzODUwLCAweGFmODcwMGU4LCAweDNjMDIwMDAxLCAKKzB4NTcxMDIxLCAweDkwNDI4M2MwLCAweDEwNDAwMDBiLCAweDAsIAorMHgzYzEzMDAwMSwgMHgyNzc5ODIxLCAweDhlNzM4M2M0LCAweDNjMTEwMDAxLCAKKzB4MjM3ODgyMSwgMHg4ZTMxODNjOCwgMHgzYzEyMDAwMSwgMHgyNTc5MDIxLCAKKzB4ODAwMzZlOCwgMHg4ZTUyODNjYywgMHg4ZjgzMDBlMCwgMHg4ZjgyMDBlNCwgCisweDEwNDMwMDA3LCAweDQ4MjEsIDB4OGY4MjAwZTQsIDB4MjQwOTAwMDEsIAorMHg4YzQzMDAwMCwgMHg4YzQ0MDAwNCwgMHhhZmEzMDAxOCwgMHhhZmE0MDAxYywgCisweDE1MjAwMDBlLCAweDNjMDJmZmZmLCAweDhmODIwMGM0LCAweGFmYTIwMDEwLCAKKzB4OGY4MjAwYzgsIDB4M2MwNDAwMDEsIDB4MjQ4NDU4NzAsIDB4YWZhMjAwMTQsIAorMHg4Zjg2MDBlMCwgMHg4Zjg3MDBlNCwgMHgzYzA1MDAwNiwgMHhjMDAyNDAzLCAKKzB4MzRhNWYwMDAsIDB4ODAwMzg1MCwgMHgwLCAweDhmYTMwMDFjLCAKKzB4OGZiMjAwMTgsIDB4MzA3M2ZmZmYsIDB4MjY3M2ZmZmMsIDB4NjIxMDI0LCAKKzB4MTA0MDAwNTgsIDB4MjQwODgyMSwgMHgzYzAyMDA4MCwgMHg2MjEwMjQsIAorMHgxMDQwMDAwYSwgMHgzYzA0MDA0MCwgMHg4ZWUyMDA3YywgMHgyNDQyMDAwMSwgCisweGFlZTIwMDdjLCAweDhlZTIwMDdjLCAweDhlZTIwMWZjLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxZmMsIDB4ODAwMzg0YSwgMHg4ZWUyMDFmYywgMHgzYzA2MDAwNCwgCisweDNjMGIwMDAxLCAweDNjMGEwMDAyLCAweDNjMDUwMDEwLCAweDNjMDkwMDA4LCAKKzB4OGVlMjAwODAsIDB4M2MwODAwMjAsIDB4MzQwNzgwMDAsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDA4MCwgMHg4ZWUyMDA4MCwgMHg4ZmEyMDAxYywgMHg0NDE4MjQsIAorMHgxMDY2MDAyMSwgMHhjMzEwMmIsIDB4MTQ0MDAwMDcsIDB4MCwgCisweDEwNmIwMDExLCAweDAsIDB4MTA2YTAwMTUsIDB4MCwgCisweDgwMDM1OTIsIDB4NDIwNDIsIDB4MTA2NTAwMjMsIDB4YTMxMDJiLCAKKzB4MTQ0MDAwMDUsIDB4MCwgMHgxMDY5MDAxOSwgMHgwLCAKKzB4ODAwMzU5MiwgMHg0MjA0MiwgMHgxMDY4MDAyMSwgMHgwLCAKKzB4ODAwMzU5MiwgMHg0MjA0MiwgMHg4ZWUyMDAzNCwgMHgyNDQyMDAwMSwgCisweGFlZTIwMDM0LCAweDhlZTIwMDM0LCAweDgwMDM1OTIsIDB4NDIwNDIsIAorMHg4ZWUyMDFlYywgMHgyNDQyMDAwMSwgMHhhZWUyMDFlYywgMHg4ZWUyMDFlYywgCisweDgwMDM1OTIsIDB4NDIwNDIsIDB4OGVlMjAxZjAsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDFmMCwgMHg4ZWUyMDFmMCwgMHg4MDAzNTkyLCAweDQyMDQyLCAKKzB4OGVlMjAxZjQsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxZjQsIDB4OGVlMjAxZjQsIAorMHg4MDAzNTkyLCAweDQyMDQyLCAweDhlZTIwMDMwLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAwMzAsIDB4OGVlMjAwMzAsIDB4ODAwMzU5MiwgMHg0MjA0MiwgCisweDhlZTIwMWY4LCAweDI0NDIwMDAxLCAweGFlZTIwMWY4LCAweDhlZTIwMWY4LCAKKzB4NDIwNDIsIDB4MTA4NzAyYjcsIDB4MCwgMHg4MDAzNTU3LCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjgzYjIsIAorMHgxNDQwMDA4NCwgMHgyNDAyMDAwMSwgMHgzYzAzMDAwMSwgMHg3NzE4MjEsIAorMHg5MDYzODNiMywgMHgxNDYyMDA3ZiwgMHgzYzAyMDEwMCwgMHg4ZTQzMDAwMCwgCisweDYyMTAyNCwgMHgxMDQwMDA2ZiwgMHgyNDAyZmZmZiwgMHgxNDYyMDAwNSwgCisweDI0MTAwMDAxLCAweDk2NDMwMDA0LCAweDM0MDJmZmZmLCAweDEwNjIwMDc1LCAKKzB4MCwgMHg5MmUyMDRkOCwgMHgxNDQwMDA3MiwgMHgwLCAKKzB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2I0LCAweDI4NDIwMDA1LCAKKzB4MTA0MDAwMjAsIDB4MzgyMSwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIAorMHg4YzQyODNiNCwgMHgxODQwMDAxNiwgMHgyODIxLCAweDk2MjYwMDAwLCAKKzB4NTIwYzAsIDB4OTcxMDIxLCAweDk0NDI3NzdlLCAweDE0NDYwMDA5LCAKKzB4OTcxMDIxLCAweDk0NDM3NzgwLCAweDk2MjIwMDAyLCAweDE0NjIwMDA1LCAKKzB4OTcxMDIxLCAweDk0NDM3NzgyLCAweDk2MjIwMDA0LCAweDUwNjIwMDA4LCAKKzB4MjQwNzAwMDEsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2I0LCAKKzB4MjRhNTAwMDEsIDB4YTIxMDJhLCAweDU0NDBmZmVlLCAweDUyMGMwLCAKKzB4MzBlMjAwZmYsIDB4MTA0MDAyN2IsIDB4MCwgMHg4MDAzNjFlLCAKKzB4MCwgMHgyNDAyMDIxLCAweGMwMDIyZmUsIDB4MjQwNTAwMDYsIAorMHgzMDQ0MDAxZiwgMHg0MjhjMCwgMHgyZTUxMDIxLCAweDk0NDI3MjdjLCAKKzB4MzA0MjQwMDAsIDB4MTQ0MDAyNmYsIDB4YjcxMDIxLCAweDk0NDM3MjdlLCAKKzB4OTYyMjAwMDAsIDB4MTQ2MjAwMGIsIDB4NDE4YzAsIDB4YjcxMDIxLCAKKzB4OTQ0MzcyODAsIDB4OTYyMjAwMDIsIDB4MTQ2MjAwMDYsIDB4NDE4YzAsIAorMHhiNzEwMjEsIDB4OTQ0MzcyODIsIDB4OTYyMjAwMDQsIDB4MTA2MjAwMzUsIAorMHg0MThjMCwgMHgyZTMxMDIxLCAweDk0NDI3MjdjLCAweDMwNDI4MDAwLCAKKzB4MTQ0MDAyNWMsIDB4MmUzMTAyMSwgMHg5NDQ4NzI3YywgMHg5NjI3MDAwMCwgCisweDgyOGMwLCAweGI3MTAyMSwgMHg5NDQyNzM3ZSwgMHg4MDAzNjAwLCAKKzB4MzAyMSwgMHg0MjBjMCwgMHgyZTQxMDIxLCAweDk0NDM3MzdjLCAKKzB4MmU0MTAyMSwgMHg5NDQ4NzM3YywgMHgzMDYzODAwMCwgMHgxNDYwMDAxMCwgCisweDgyOGMwLCAweGI3MTAyMSwgMHg5NDQyNzM3ZSwgMHgxNDQ3ZmZmNSwgCisweDEwMDIwMjEsIDB4YjcxMDIxLCAweDk0NDM3MzgwLCAweDk2MjIwMDAyLCAKKzB4NTQ2MmZmZjEsIDB4NDIwYzAsIDB4YjcxMDIxLCAweDk0NDM3MzgyLCAKKzB4OTYyMjAwMDQsIDB4NTQ2MmZmZWMsIDB4NDIwYzAsIDB4MjQwNjAwMDEsIAorMHgzMGMyMDBmZiwgMHgxMDQwMDIzYiwgMHgwLCAweDgwMDM2MWUsIAorMHgwLCAweDk3NDMwMjAyLCAweDk2NDIwMDAwLCAweDE0NjIwMjM1LCAKKzB4MCwgMHg5NzQzMDIwNCwgMHg5NjQyMDAwMiwgMHgxNDYyMDIzMSwgCisweDAsIDB4OTc0MzAyMDYsIDB4OTY0MjAwMDQsIDB4MTQ2MjAyMmQsIAorMHgwLCAweDkyNDIwMDAwLCAweDNhMDMwMDAxLCAweDMwNDIwMDAxLCAKKzB4NDMxMDI0LCAweDEwNDAwMDc0LCAweDI0MDJmZmZmLCAweDhlMjMwMDAwLCAKKzB4MTQ2MjAwMDQsIDB4MzQwMmZmZmYsIDB4OTYyMzAwMDQsIDB4MTA2MjAwNmYsIAorMHgyNDE0MDAwMiwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjgzYjIsIAorMHgxNDQwMDA2YSwgMHgyNDE0MDAwMywgMHg5MmUyMDRkOCwgMHgxNDQwMDA2NywgCisweDAsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDhjNDI4M2I0LCAKKzB4Mjg0MjAwMDUsIDB4MTA0MDAwMjAsIDB4MzgyMSwgMHgzYzAyMDAwMSwgCisweDU3MTAyMSwgMHg4YzQyODNiNCwgMHgxODQwMDAxNiwgMHgyODIxLCAKKzB4OTYyNjAwMDAsIDB4NTIwYzAsIDB4OTcxMDIxLCAweDk0NDI3NzdlLCAKKzB4MTQ0NjAwMDksIDB4OTcxMDIxLCAweDk0NDM3NzgwLCAweDk2MjIwMDAyLCAKKzB4MTQ2MjAwMDUsIDB4OTcxMDIxLCAweDk0NDM3NzgyLCAweDk2MjIwMDA0LCAKKzB4NTA2MjAwMDgsIDB4MjQwNzAwMDEsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAKKzB4OGM0MjgzYjQsIDB4MjRhNTAwMDEsIDB4YTIxMDJhLCAweDU0NDBmZmVlLCAKKzB4NTIwYzAsIDB4MzBlMjAwZmYsIDB4MTQ0MDAwNDQsIDB4MjQxNDAwMDMsIAorMHg4MDAzODRhLCAweDAsIDB4MjQwMjAyMSwgMHhjMDAyMmZlLCAKKzB4MjQwNTAwMDYsIDB4MzA0NDAwMWYsIDB4NDI4YzAsIDB4MmU1MTAyMSwgCisweDk0NDI3MjdjLCAweDMwNDI0MDAwLCAweDE0NDAwMWVhLCAweGI3MTAyMSwgCisweDk0NDM3MjdlLCAweDk2MjIwMDAwLCAweDE0NjIwMDBiLCAweDQxOGMwLCAKKzB4YjcxMDIxLCAweDk0NDM3MjgwLCAweDk2MjIwMDAyLCAweDE0NjIwMDA2LCAKKzB4NDE4YzAsIDB4YjcxMDIxLCAweDk0NDM3MjgyLCAweDk2MjIwMDA0LCAKKzB4MTA2MjAwMjcsIDB4NDE4YzAsIDB4MmUzMTAyMSwgMHg5NDQyNzI3YywgCisweDMwNDI4MDAwLCAweDE0NDAwMWQ3LCAweDJlMzEwMjEsIDB4OTQ0ODcyN2MsIAorMHg5NjI3MDAwMCwgMHg4MjhjMCwgMHhiNzEwMjEsIDB4OTQ0MjczN2UsIAorMHg4MDAzNjg1LCAweDMwMjEsIDB4NDIwYzAsIDB4MmU0MTAyMSwgCisweDk0NDM3MzdjLCAweDJlNDEwMjEsIDB4OTQ0ODczN2MsIDB4MzA2MzgwMDAsIAorMHgxNDYwMDAxMCwgMHg4MjhjMCwgMHhiNzEwMjEsIDB4OTQ0MjczN2UsIAorMHgxNDQ3ZmZmNSwgMHgxMDAyMDIxLCAweGI3MTAyMSwgMHg5NDQzNzM4MCwgCisweDk2MjIwMDAyLCAweDU0NjJmZmYxLCAweDQyMGMwLCAweGI3MTAyMSwgCisweDk0NDM3MzgyLCAweDk2MjIwMDA0LCAweDU0NjJmZmVjLCAweDQyMGMwLCAKKzB4MjQwNjAwMDEsIDB4MzBjMjAwZmYsIDB4MTA0MDAxYjYsIDB4MCwgCisweDgwMDM2OTgsIDB4MjQxNDAwMDMsIDB4MjQxNDAwMDEsIDB4OGY0MjAyNjAsIAorMHg1MzEwMmIsIDB4MTA0MDAwNDksIDB4MCwgMHg4ZjgzMDBlNCwgCisweDhmODIwMGUwLCAweDEwNjIwMDAzLCAweDI0NjMwMDA4LCAweGFmODMwMGU0LCAKKzB4YWY4MzAwZTgsIDB4OGVlNDAwYzAsIDB4OGVlNTAwYzQsIDB4MjYwMTgyMSwgCisweDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsIAorMHg4NjIwMjEsIDB4YWVlNDAwYzAsIDB4YWVlNTAwYzQsIDB4OGVlMjAwNTgsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDA1OCwgMHg4ZWUyMDA1OCwgMHg4ZWUyMDA3YywgCisweDI0NDIwMDAxLCAweGFlZTIwMDdjLCAweDhlZTIwMDdjLCAweDhmODIwMGUwLCAKKzB4YWZhMjAwMTAsIDB4OGY4MjAwZTQsIDB4M2MwNDAwMDEsIDB4MjQ4NDU4NzgsIAorMHhhZmEyMDAxNCwgMHg4ZmE2MDAxOCwgMHg4ZmE3MDAxYywgMHgzYzA1MDAwNiwgCisweGMwMDI0MDMsIDB4MzRhNWYwMDMsIDB4ODAwMzg1MCwgMHgwLCAKKzB4OGVlMjUyNDAsIDB4YWZhMjAwMTAsIDB4OGVlMjUyNDQsIDB4M2MwNDAwMDEsIAorMHgyNDg0NTg4NCwgMHhhZmEyMDAxNCwgMHg4ZWU2MGUxMCwgMHg4ZWU3MGUxOCwgCisweGMwMDI0MDMsIDB4MzRhNWYwMDIsIDB4OGVlMjAxYzAsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDFjMCwgMHg4ZWUyMDAwMCwgMHg4ZWUzMDFjMCwgMHgyNDAzZmZiZiwgCisweDQzMTAyNCwgMHg4MDAzN2Y4LCAweGFlZTIwMDAwLCAweDhlZTI1MjQwLCAKKzB4YWZhMjAwMTAsIDB4OGVlMjUyNDQsIDB4M2MwNDAwMDEsIDB4MjQ4NDU4ODQsIAorMHhhZmEyMDAxNCwgMHg4ZWU2MGUxMCwgMHg4ZWU3MGUxOCwgMHgzYzA1MDAwNiwgCisweGMwMDI0MDMsIDB4MzRhNWYwMDIsIDB4OGVlMjAxYzAsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDFjMCwgMHg4MDAzN2Y4LCAweDhlZTIwMWMwLCAweDk2ZTIwNDY4LCAKKzB4NTMxMDJiLCAweDU0NDAwMDAxLCAweDNjMTU4MDAwLCAweDEyNjAwMTMxLCAKKzB4M2MwYzAwMWYsIDB4MzU4Y2ZmZmYsIDB4OGVlMjcyNGMsIDB4OGY0MzAyODAsIAorMHgyNDQyMDAwMSwgMHgzMDQyMDdmZiwgMHgxMDYyMDEwOCwgMHgwLCAKKzB4MTJhMDAwMTQsIDB4MCwgMHg4ZWUzNTI0MCwgMHg4ZWUyNTI0NCwgCisweDEwNjIwMDA5LCAweDI2ZWU1MjQ0LCAweDhlZWI1MjQ0LCAweDhlZTM1MjQ0LCAKKzB4MjExNDAsIDB4MjQ0MjUyNDgsIDB4MmUyODAyMSwgMHgyNDYzMDAwMSwgCisweDgwMDM3MTIsIDB4MzA2ODAwZmYsIDB4OTJlMjcyNDgsIDB4MTQ0MGZmYzAsIAorMHgzYzA1MDAwNiwgMHg4ZWUyMDFlMCwgMHgyNDQyMDAwMSwgMHhhZWUyMDFlMCwgCisweDhlZTIwMWUwLCAweDhlZTMwZTEwLCAweDhlZTIwZTE4LCAweDEwNjJmZmNiLCAKKzB4MjZlZTBlMTgsIDB4OGVlYjBlMTgsIDB4YTgyMSwgMHg4ZWUzMGUxOCwgCisweDIxMTQwLCAweDI0NDIwZTIwLCAweDJlMjgwMjEsIDB4MjQ2MzAwMDEsIAorMHgzMDY4MDFmZiwgMHg5NmUyMDQ2YSwgMHgzMDQyMDAxMCwgMHgxMDQwMDAxNywgCisweDM0MDI4MTAwLCAweDk2NDMwMDBjLCAweDE0NjIwMDE0LCAweDAsIAorMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjgzYzAsIDB4MTQ0MDAwMGYsIAorMHgwLCAweDk2NDIwMDBlLCAweGE2MDIwMDE2LCAweDhlNDIwMDA4LCAKKzB4OGU0MzAwMDQsIDB4OGU0NDAwMDAsIDB4MjY3M2ZmZmMsIDB4YWU0MjAwMGMsIAorMHhhZTQzMDAwOCwgMHhhZTQ0MDAwNCwgMHg5NjAyMDAwZSwgMHgyNjMxMDAwNCwgCisweDI0MTYwMDAxLCAweDM0NDIwMjAwLCAweGE2MDIwMDBlLCAweDk2MDMwMDBhLCAKKzB4MjYwNTAyMSwgMHg3MzEwMmIsIDB4MTA0MDAwMDIsIDB4MjYwNjgyMSwgCisweDYwNTAyMSwgMHgyZDQyMDAzZCwgMHgxMDQwMDAyYSwgMHgzODIxLCAKKzB4OTYyMzAwMGMsIDB4MjQwMjA4MDAsIDB4NTQ2MjAwMjcsIDB4YWUxMTAwMTgsIAorMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjgzYzAsIDB4NTQ0MDAwMjIsIAorMHhhZTExMDAxOCwgMHgyNjIyMDAxNywgMHgxODIxMDJiLCAweDEwNDAwMDEzLCAKKzB4MCwgMHgzYzAyZmZmNSwgMHg1MTEwMjEsIDB4OTA0MjEwMTcsIAorMHgzODQzMDAwNiwgMHgyYzYzMDAwMSwgMHgzODQyMDAxMSwgMHgyYzQyMDAwMSwgCisweDYyMTgyNSwgMHgxMDYwMDAxMywgMHgyNjIyMDAxMCwgMHgxODIxMDJiLCAKKzB4MTA0MDAwMGUsIDB4MCwgMHgzYzA3ZmZmNSwgMHhmMTM4MjEsIAorMHg5NGU3MTAxMCwgMHg4MDAzNzVlLCAweDI0ZTcwMDBlLCAweDkyMjIwMDE3LCAKKzB4Mzg0MzAwMDYsIDB4MmM2MzAwMDEsIDB4Mzg0MjAwMTEsIDB4MmM0MjAwMDEsIAorMHg2MjE4MjUsIDB4NTA2MDAwMDQsIDB4YWUxMTAwMTgsIDB4OTYyNzAwMTAsIAorMHgyNGU3MDAwZSwgMHhhZTExMDAxOCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIAorMHg5MDQyODNjMCwgMHgyMTAyYiwgMHgxNGUwMDAwMiwgMHgyNGVjMCwgCisweDE0MDM4MjEsIDB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIAorMHhjMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIAorMHgxMGMyMDAwNCwgMHgwLCAweDhmODIwMTI0LCAweDE0YzIwMDA3LCAKKzB4MjQwMjAwMGIsIDB4OGVlMjAxYTQsIDB4NDgyMSwgMHgyNDQyMDAwMSwgCisweGFlZTIwMWE0LCAweDgwMDM3YmYsIDB4OGVlMjAxYTQsIDB4OGUwNDAwMDAsIAorMHg4ZTA1MDAwNCwgMHhhYzYyMDAxOCwgMHgxNzUxMDI1LCAweDQ5MTAyNSwgCisweGFjNzEwMDA4LCAweGE0NjcwMDBlLCAweGFjNjIwMDFjLCAweGFjNjQwMDAwLCAKKzB4YWM2NTAwMDQsIDB4OGVlMjA0YzAsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIAorMHg5MmUyNGUyMCwgMHgxNDQwMDAzOCwgMHgyNDA5MDAwMSwgMHg4ZWUyNGUzMCwgCisweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MzAwMDAsIAorMHgyNDAyMDAwNywgMHgxNDYyMDAyMCwgMHgwLCAweDhlZTM0ZTMwLCAKKzB4OGVlMjRlMzQsIDB4MTA2MjAwMWMsIDB4MCwgMHg4YzgyMDAwNCwgCisweDI0NDIwMDAxLCAweGFjODIwMDA0LCAweDhlZTM0ZTM0LCAweDhlZTU0ZTMwLCAKKzB4MjQwMjAwNDAsIDB4MjQ2MzAwMDEsIDB4MTA2MjAwMDcsIDB4MCwgCisweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwYTIwMDA1LCAweDAsIAorMHg4MDAzN2E5LCAweDAsIDB4MTRhMDAwMDUsIDB4MCwgCisweDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAweDhmODIwMTI4LCAKKzB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTMsIDB4YWM4MDAwMDAsIAorMHg4MDAzN2JmLCAweDAsIDB4OGVlMjRlMzAsIDB4MjQwMzAwNDAsIAorMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIAorMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDA3LCAweGFjODIwMDAwLCAKKzB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4MTUyMDAwMTgsIDB4M2MwNTAwMDYsIAorMHg4ZTAyMDAxOCwgMHgzYzA0MDAwMSwgMHgyNDg0NTg5MCwgMHhhZmEyMDAxMCwgCisweDhlMDIwMDAwLCAweDhlMDMwMDA0LCAweDM0YTVmMDA5LCAweDIwMDMwMjEsIAorMHhjMDAyNDAzLCAweGFmYTMwMDE0LCAweDMyYzIwMGZmLCAweDEwNDAwMDJiLCAKKzB4MzQwMjgxMDAsIDB4OGU0MzAwMDQsIDB4OGU0NDAwMDgsIDB4OGU0NTAwMGMsIAorMHhhNjQyMDAwYywgMHhhZTQzMDAwMCwgMHhhZTQ0MDAwNCwgMHhhZTQ1MDAwOCwgCisweDk2MDIwMDE2LCAweDgwMDM3ZjgsIDB4YTY0MjAwMGUsIDB4MTU0ZDAwMGEsIAorMHgwLCAweDk2MDIwMDBlLCAweGE2MTMwMDBhLCAweDM0NDIwMDA0LCAKKzB4YTYwMjAwMGUsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA4M2MwLCAKKzB4ODAwMzdmNiwgMHg5ODIxLCAweDk2MDQwMDBhLCAweDkzMTAyYiwgCisweDEwNDAwMDAyLCAweDI2MDE4MjEsIDB4ODAxODIxLCAweDI0MDIwMDAxLCAKKzB4YTYwMzAwMGEsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjI4M2MwLCAKKzB4OTYwNDAwMGEsIDB4MjI0ODgyMSwgMHgxOTExMDJiLCAweDEwNDAwMDAzLCAKKzB4M2MwMmZmZjUsIDB4MzQ0MjEwMDAsIDB4MjIyODgyMSwgMHgyNjQ5ODIzLCAKKzB4YTgyMSwgMHgxNjYwZmVmNCwgMHhhZGM4MDAwMCwgMHgxMjYwMDAyMSwgCisweDMyYzIwMGZmLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzMzODNjNCwgCisweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzMxODNjOCwgMHgzYzAxMDAwMSwgCisweDM3MDgyMSwgMHgxMDQwMDAwOCwgMHhhYzMyODNjYywgMHgzYzAyMDAwMSwgCisweDU3MTAyMSwgMHg4YzQyODNjYywgMHgyNDQyMDAwNCwgMHgzYzAxMDAwMSwgCisweDM3MDgyMSwgMHhhYzIyODNjYywgMHg4ZWUyNzI0YywgMHg4ZjQzMDI4MCwgCisweDI0NDIwMDAxLCAweDE0NjIwMDA2LCAweDAsIDB4OGVlMjAxYzQsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFjNCwgMHg4MDAzODUwLCAweDhlZTIwMWM0LCAKKzB4OGVlMjAxYmMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxYmMsIDB4ODAwMzg1MCwgCisweDhlZTIwMWJjLCAweDk3YTQwMDFlLCAweDI0ODRmZmZjLCAweDgwMTgyMSwgCisweDhlZTQwMGMwLCAweDhlZTUwMGM0LCAweDEwMjEsIDB4YTMyODIxLCAKKzB4YTMzMDJiLCAweDgyMjAyMSwgMHg4NjIwMjEsIDB4MjQwMjAwMDIsIAorMHhhZWU0MDBjMCwgMHhhZWU1MDBjNCwgMHgxMjgyMDAwZiwgMHgyYTgyMDAwMywgCisweDE0NDAwMDE3LCAweDI0MDIwMDAzLCAweDE2ODIwMDE1LCAweDAsIAorMHg4ZWUyMDBkMCwgMHg4ZWUzMDBkNCwgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgCisweDQ0MTAyMSwgMHhhZWUyMDBkMCwgMHhhZWUzMDBkNCwgMHg4ZWUyMDBkMCwgCisweDgwMDM4NGEsIDB4OGVlMzAwZDQsIDB4OGVlMjAwZDgsIDB4OGVlMzAwZGMsIAorMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZDgsIAorMHhhZWUzMDBkYywgMHg4ZWUyMDBkOCwgMHg4MDAzODRhLCAweDhlZTMwMGRjLCAKKzB4OGVlMjAwYzgsIDB4OGVlMzAwY2MsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIAorMHg0NDEwMjEsIDB4YWVlMjAwYzgsIDB4YWVlMzAwY2MsIDB4OGVlMjAwYzgsIAorMHg4ZWUzMDBjYywgMHg4ZjgzMDBlNCwgMHg4ZjgyMDBlMCwgMHgxMDYyMDAwMywgCisweDI0NjMwMDA4LCAweGFmODMwMGU0LCAweGFmODMwMGU4LCAweDhmYmYwMDRjLCAKKzB4OGZiNjAwNDgsIDB4OGZiNTAwNDQsIDB4OGZiNDAwNDAsIDB4OGZiMzAwM2MsIAorMHg4ZmIyMDAzOCwgMHg4ZmIxMDAzNCwgMHg4ZmIwMDAzMCwgMHgzZTAwMDA4LCAKKzB4MjdiZDAwNTAsIDB4MjdiZGZmOTAsIDB4YWZiNjAwNjAsIDB4YjAyMSwgCisweGFmYmYwMDY4LCAweGFmYmUwMDY0LCAweGFmYjUwMDVjLCAweGFmYjQwMDU4LCAKKzB4YWZiMzAwNTQsIDB4YWZiMjAwNTAsIDB4YWZiMTAwNGMsIDB4YWZiMDAwNDgsIAorMHg4ZWUyMDRkNCwgMHg4ODIxLCAweDI0MTUwMDAxLCAweDMwNDIwMDAxLCAKKzB4MTQ0MDAwMmEsIDB4YTNhMDAwMmYsIDB4OGY4NzAwZTAsIDB4OGY4ODAwYzQsIAorMHg4ZjgyMDBlOCwgMHhlMjIwMjMsIDB4MmM4MjEwMDAsIDB4NTA0MDAwMDEsIAorMHgyNDg0MTAwMCwgMHg0MjBjMiwgMHg4MDE4MjEsIDB4OGVlNDAwYzgsIAorMHg4ZWU1MDBjYywgMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsIAorMHg4MjIwMjEsIDB4ODYyMDIxLCAweGFlZTQwMGM4LCAweGFlZTUwMGNjLCAKKzB4OGY4MzAwYzgsIDB4M2MwMjAwMGEsIDB4MzQ0MmVmZmYsIDB4MTAzMjAyMywgCisweDQ0MTAyYiwgMHgxMDQwMDAwMywgMHgzYzAyMDAwYSwgMHgzNDQyZjAwMCwgCisweDgyMjAyMSwgMHg4MDE4MjEsIDB4OGVlNDAwYzAsIDB4OGVlNTAwYzQsIAorMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAKKzB4ODYyMDIxLCAweGFlZTQwMGMwLCAweGFlZTUwMGM0LCAweGFmODgwMGM4LCAKKzB4YWY4NzAwZTQsIDB4ODAwM2M1YiwgMHhhZjg3MDBlOCwgMHgzYzAyMDAwMSwgCisweDU3MTAyMSwgMHg5MDQyODNjMCwgMHgxMDQwMDAwYiwgMHgwLCAKKzB4M2MxMzAwMDEsIDB4Mjc3OTgyMSwgMHg4ZTczODNjNCwgMHgzYzEwMDAwMSwgCisweDIxNzgwMjEsIDB4OGUxMDgzYzgsIDB4M2MxMjAwMDEsIDB4MjU3OTAyMSwgCisweDgwMDNhNTksIDB4OGU1MjgzY2MsIDB4OGY4MzAwZTAsIDB4OGY4MjAwZTQsIAorMHgxMDQzMDAwNywgMHgzODIxLCAweDhmODIwMGU0LCAweDI0MDcwMDAxLCAKKzB4OGM0MzAwMDAsIDB4OGM0NDAwMDQsIDB4YWZhMzAwMTgsIDB4YWZhNDAwMWMsIAorMHgxNGUwMDAwZSwgMHgzYzAyZmZmZiwgMHg4ZjgyMDBjNCwgMHhhZmEyMDAxMCwgCisweDhmODIwMGM4LCAweDNjMDQwMDAxLCAweDI0ODQ1OGI0LCAweGFmYTIwMDE0LCAKKzB4OGY4NjAwZTAsIDB4OGY4NzAwZTQsIDB4M2MwNTAwMDYsIDB4YzAwMjQwMywgCisweDM0YTVmMjAwLCAweDgwMDNjNWIsIDB4MCwgMHg4ZmEzMDAxYywgCisweDhmYjIwMDE4LCAweDMwNzNmZmZmLCAweDI2NzNmZmZjLCAweDYyMTAyNCwgCisweDEwNDAwMDU4LCAweDI0MDgwMjEsIDB4M2MwMjAwODAsIDB4NjIxMDI0LCAKKzB4MTA0MDAwMGEsIDB4M2MwNDAwNDAsIDB4OGVlMjAwN2MsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDA3YywgMHg4ZWUyMDA3YywgMHg4ZWUyMDFmYywgMHgyNDQyMDAwMSwgCisweGFlZTIwMWZjLCAweDgwMDNjNTUsIDB4OGVlMjAxZmMsIDB4M2MwNjAwMDQsIAorMHgzYzBiMDAwMSwgMHgzYzBhMDAwMiwgMHgzYzA1MDAxMCwgMHgzYzA5MDAwOCwgCisweDhlZTIwMDgwLCAweDNjMDgwMDIwLCAweDM0MDc4MDAwLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAwODAsIDB4OGVlMjAwODAsIDB4OGZhMjAwMWMsIDB4NDQxODI0LCAKKzB4MTA2NjAwMjEsIDB4YzMxMDJiLCAweDE0NDAwMDA3LCAweDAsIAorMHgxMDZiMDAxMSwgMHgwLCAweDEwNmEwMDE1LCAweDAsIAorMHg4MDAzOTE2LCAweDQyMDQyLCAweDEwNjUwMDIzLCAweGEzMTAyYiwgCisweDE0NDAwMDA1LCAweDAsIDB4MTA2OTAwMTksIDB4MCwgCisweDgwMDM5MTYsIDB4NDIwNDIsIDB4MTA2ODAwMjEsIDB4MCwgCisweDgwMDM5MTYsIDB4NDIwNDIsIDB4OGVlMjAwMzQsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDAzNCwgMHg4ZWUyMDAzNCwgMHg4MDAzOTE2LCAweDQyMDQyLCAKKzB4OGVlMjAxZWMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxZWMsIDB4OGVlMjAxZWMsIAorMHg4MDAzOTE2LCAweDQyMDQyLCAweDhlZTIwMWYwLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxZjAsIDB4OGVlMjAxZjAsIDB4ODAwMzkxNiwgMHg0MjA0MiwgCisweDhlZTIwMWY0LCAweDI0NDIwMDAxLCAweGFlZTIwMWY0LCAweDhlZTIwMWY0LCAKKzB4ODAwMzkxNiwgMHg0MjA0MiwgMHg4ZWUyMDAzMCwgMHgyNDQyMDAwMSwgCisweGFlZTIwMDMwLCAweDhlZTIwMDMwLCAweDgwMDM5MTYsIDB4NDIwNDIsIAorMHg4ZWUyMDFmOCwgMHgyNDQyMDAwMSwgMHhhZWUyMDFmOCwgMHg4ZWUyMDFmOCwgCisweDQyMDQyLCAweDEwODcwMzNlLCAweDAsIDB4ODAwMzhkYiwgCisweDAsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2IyLCAKKzB4MTQ0MDAwODQsIDB4MjQwMjAwMDEsIDB4M2MwMzAwMDEsIDB4NzcxODIxLCAKKzB4OTA2MzgzYjMsIDB4MTQ2MjAwN2YsIDB4M2MwMjAxMDAsIDB4OGU0MzAwMDAsIAorMHg2MjEwMjQsIDB4MTA0MDAwNmYsIDB4MjQwMmZmZmYsIDB4MTQ2MjAwMDUsIAorMHgyNDExMDAwMSwgMHg5NjQzMDAwNCwgMHgzNDAyZmZmZiwgMHgxMDYyMDA3NSwgCisweDAsIDB4OTJlMjA0ZDgsIDB4MTQ0MDAwNzIsIDB4MCwgCisweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwgMHgyODQyMDAwNSwgCisweDEwNDAwMDIwLCAweDM4MjEsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAKKzB4OGM0MjgzYjQsIDB4MTg0MDAwMTYsIDB4MjgyMSwgMHg5NjA2MDAwMCwgCisweDUyMGMwLCAweDk3MTAyMSwgMHg5NDQyNzc3ZSwgMHgxNDQ2MDAwOSwgCisweDk3MTAyMSwgMHg5NDQzNzc4MCwgMHg5NjAyMDAwMiwgMHgxNDYyMDAwNSwgCisweDk3MTAyMSwgMHg5NDQzNzc4MiwgMHg5NjAyMDAwNCwgMHg1MDYyMDAwOCwgCisweDI0MDcwMDAxLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwgCisweDI0YTUwMDAxLCAweGEyMTAyYSwgMHg1NDQwZmZlZSwgMHg1MjBjMCwgCisweDMwZTIwMGZmLCAweDEwNDAwMzAyLCAweDAsIDB4ODAwMzlhMiwgCisweDAsIDB4MjQwMjAyMSwgMHhjMDAyMmZlLCAweDI0MDUwMDA2LCAKKzB4MzA0NDAwMWYsIDB4NDI4YzAsIDB4MmU1MTAyMSwgMHg5NDQyNzI3YywgCisweDMwNDI0MDAwLCAweDE0NDAwMmY2LCAweGI3MTAyMSwgMHg5NDQzNzI3ZSwgCisweDk2MDIwMDAwLCAweDE0NjIwMDBiLCAweDQxOGMwLCAweGI3MTAyMSwgCisweDk0NDM3MjgwLCAweDk2MDIwMDAyLCAweDE0NjIwMDA2LCAweDQxOGMwLCAKKzB4YjcxMDIxLCAweDk0NDM3MjgyLCAweDk2MDIwMDA0LCAweDEwNjIwMDM1LCAKKzB4NDE4YzAsIDB4MmUzMTAyMSwgMHg5NDQyNzI3YywgMHgzMDQyODAwMCwgCisweDE0NDAwMmUzLCAweDJlMzEwMjEsIDB4OTQ0ZDcyN2MsIDB4OTYwNzAwMDAsIAorMHhkMjhjMCwgMHhiNzEwMjEsIDB4OTQ0MjczN2UsIDB4ODAwMzk4NCwgCisweDMwMjEsIDB4NDIwYzAsIDB4MmU0MTAyMSwgMHg5NDQzNzM3YywgCisweDJlNDEwMjEsIDB4OTQ0ZDczN2MsIDB4MzA2MzgwMDAsIDB4MTQ2MDAwMTAsIAorMHhkMjhjMCwgMHhiNzEwMjEsIDB4OTQ0MjczN2UsIDB4MTQ0N2ZmZjUsIAorMHgxYTAyMDIxLCAweGI3MTAyMSwgMHg5NDQzNzM4MCwgMHg5NjAyMDAwMiwgCisweDU0NjJmZmYxLCAweDQyMGMwLCAweGI3MTAyMSwgMHg5NDQzNzM4MiwgCisweDk2MDIwMDA0LCAweDU0NjJmZmVjLCAweDQyMGMwLCAweDI0MDYwMDAxLCAKKzB4MzBjMjAwZmYsIDB4MTA0MDAyYzIsIDB4MCwgMHg4MDAzOWEyLCAKKzB4MCwgMHg5NzQzMDIwMiwgMHg5NjQyMDAwMCwgMHgxNDYyMDJiYywgCisweDAsIDB4OTc0MzAyMDQsIDB4OTY0MjAwMDIsIDB4MTQ2MjAyYjgsIAorMHgwLCAweDk3NDMwMjA2LCAweDk2NDIwMDA0LCAweDE0NjIwMmI0LCAKKzB4MCwgMHg5MjQyMDAwMCwgMHgzYTIzMDAwMSwgMHgzMDQyMDAwMSwgCisweDQzMTAyNCwgMHgxMDQwMDA3NCwgMHgyNDAyZmZmZiwgMHg4ZTAzMDAwMCwgCisweDE0NjIwMDA0LCAweDM0MDJmZmZmLCAweDk2MDMwMDA0LCAweDEwNjIwMDZmLCAKKzB4MjQxNTAwMDIsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2IyLCAKKzB4MTQ0MDAwNmEsIDB4MjQxNTAwMDMsIDB4OTJlMjA0ZDgsIDB4MTQ0MDAwNjcsIAorMHgwLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNiNCwgCisweDI4NDIwMDA1LCAweDEwNDAwMDIwLCAweDM4MjEsIDB4M2MwMjAwMDEsIAorMHg1NzEwMjEsIDB4OGM0MjgzYjQsIDB4MTg0MDAwMTYsIDB4MjgyMSwgCisweDk2MDYwMDAwLCAweDUyMGMwLCAweDk3MTAyMSwgMHg5NDQyNzc3ZSwgCisweDE0NDYwMDA5LCAweDk3MTAyMSwgMHg5NDQzNzc4MCwgMHg5NjAyMDAwMiwgCisweDE0NjIwMDA1LCAweDk3MTAyMSwgMHg5NDQzNzc4MiwgMHg5NjAyMDAwNCwgCisweDUwNjIwMDA4LCAweDI0MDcwMDAxLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgCisweDhjNDI4M2I0LCAweDI0YTUwMDAxLCAweGEyMTAyYSwgMHg1NDQwZmZlZSwgCisweDUyMGMwLCAweDMwZTIwMGZmLCAweDE0NDAwMDQ0LCAweDI0MTUwMDAzLCAKKzB4ODAwM2M1NSwgMHgwLCAweDI0MDIwMjEsIDB4YzAwMjJmZSwgCisweDI0MDUwMDA2LCAweDMwNDQwMDFmLCAweDQyOGMwLCAweDJlNTEwMjEsIAorMHg5NDQyNzI3YywgMHgzMDQyNDAwMCwgMHgxNDQwMDI3MSwgMHhiNzEwMjEsIAorMHg5NDQzNzI3ZSwgMHg5NjAyMDAwMCwgMHgxNDYyMDAwYiwgMHg0MThjMCwgCisweGI3MTAyMSwgMHg5NDQzNzI4MCwgMHg5NjAyMDAwMiwgMHgxNDYyMDAwNiwgCisweDQxOGMwLCAweGI3MTAyMSwgMHg5NDQzNzI4MiwgMHg5NjAyMDAwNCwgCisweDEwNjIwMDI3LCAweDQxOGMwLCAweDJlMzEwMjEsIDB4OTQ0MjcyN2MsIAorMHgzMDQyODAwMCwgMHgxNDQwMDI1ZSwgMHgyZTMxMDIxLCAweDk0NGQ3MjdjLCAKKzB4OTYwNzAwMDAsIDB4ZDI4YzAsIDB4YjcxMDIxLCAweDk0NDI3MzdlLCAKKzB4ODAwM2EwOSwgMHgzMDIxLCAweDQyMGMwLCAweDJlNDEwMjEsIAorMHg5NDQzNzM3YywgMHgyZTQxMDIxLCAweDk0NGQ3MzdjLCAweDMwNjM4MDAwLCAKKzB4MTQ2MDAwMTAsIDB4ZDI4YzAsIDB4YjcxMDIxLCAweDk0NDI3MzdlLCAKKzB4MTQ0N2ZmZjUsIDB4MWEwMjAyMSwgMHhiNzEwMjEsIDB4OTQ0MzczODAsIAorMHg5NjAyMDAwMiwgMHg1NDYyZmZmMSwgMHg0MjBjMCwgMHhiNzEwMjEsIAorMHg5NDQzNzM4MiwgMHg5NjAyMDAwNCwgMHg1NDYyZmZlYywgMHg0MjBjMCwgCisweDI0MDYwMDAxLCAweDMwYzIwMGZmLCAweDEwNDAwMjNkLCAweDAsIAorMHg4MDAzYTFjLCAweDI0MTUwMDAzLCAweDI0MTUwMDAxLCAweDhmNDIwMjYwLCAKKzB4NTMxMDJiLCAweDEwNDAwMDM2LCAweDAsIDB4OGY4MzAwZTQsIAorMHg4ZjgyMDBlMCwgMHgxMDYyMDAwMywgMHgyNDYzMDAwOCwgMHhhZjgzMDBlNCwgCisweGFmODMwMGU4LCAweDhlZTQwMGMwLCAweDhlZTUwMGM0LCAweDI2MDE4MjEsIAorMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAKKzB4ODYyMDIxLCAweGFlZTQwMGMwLCAweGFlZTUwMGM0LCAweDhlZTIwMDU4LCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAwNTgsIDB4OGVlMjAwNTgsIDB4OGVlMjAwN2MsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDA3YywgMHg4ZWUyMDA3YywgMHg4ZjgyMDBlMCwgCisweGFmYTIwMDEwLCAweDhmODIwMGU0LCAweDNjMDQwMDAxLCAweDI0ODQ1OGMwLCAKKzB4YWZhMjAwMTQsIDB4OGZhNjAwMTgsIDB4OGZhNzAwMWMsIDB4M2MwNTAwMDYsIAorMHhjMDAyNDAzLCAweDM0YTVmMjAzLCAweDgwMDNjNWIsIDB4MCwgCisweDhlZTI1MjQwLCAweGFmYTIwMDEwLCAweDhlZTI1MjQ0LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDU4Y2MsIDB4YWZhMjAwMTQsIDB4OGVlNjBlMTAsIDB4OGVlNzBlMTgsIAorMHgzYzA1MDAwNiwgMHhjMDAyNDAzLCAweDM0YTVmMjAyLCAweDhlZTIwMWMwLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxYzAsIDB4ODAwM2MwMiwgMHg4ZWUyMDFjMCwgCisweDk2ZTIwNDY4LCAweDUzMTAyYiwgMHg1NDQwMDAwMSwgMHgzYzE2ODAwMCwgCisweDEyNjAwMWNiLCAweDNjMGUwMDFmLCAweDM1Y2VmZmZmLCAweDNjMGZmZmY1LCAKKzB4MzVlZjEwMDAsIDB4MjQxZTAwNDAsIDB4OGVlMjcyNGMsIDB4OGY0MzAyODAsIAorMHgyNDQyMDAwMSwgMHgzMDQyMDdmZiwgMHgxMDYyMDE5ZSwgMHgwLCAKKzB4MTJjMDAwMTIsIDB4MCwgMHg4ZWUzNTI0MCwgMHg4ZWUyNTI0NCwgCisweDEwNjIwMDBhLCAweDI2Zjg1MjQ0LCAweDhlZjQ1MjQ0LCAweGFmYjgwMDI0LCAKKzB4OGVlMzUyNDQsIDB4MjExNDAsIDB4MjQ0MjUyNDgsIDB4MmUyODgyMSwgCisweDI0NjMwMDAxLCAweDgwMDNhODUsIDB4MzA2ZDAwZmYsIDB4OGVlMjAxZTAsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFlMCwgMHg4ZWUyMDFlMCwgMHg4ZWUzMGUxMCwgCisweDhlZTIwZTE4LCAweDEwNjJmZmNhLCAweDI2ZjgwZTE4LCAweDhlZjQwZTE4LCAKKzB4YjAyMSwgMHhhZmI4MDAyNCwgMHg4ZWUzMGUxOCwgMHgyMTE0MCwgCisweDI0NDIwZTIwLCAweDJlMjg4MjEsIDB4MjQ2MzAwMDEsIDB4MzA2ZDAxZmYsIAorMHg5NmUyMDQ2YSwgMHgzMDQyMDAxMCwgMHgxMDQwMDAxOCwgMHgzNDAyODEwMCwgCisweDk2NDMwMDBjLCAweDE0NjIwMDE1LCAweDAsIDB4M2MwMjAwMDEsIAorMHg1NzEwMjEsIDB4OTA0MjgzYzAsIDB4MTQ0MDAwMTAsIDB4MCwgCisweDk2NDIwMDBlLCAweGE2MjIwMDE2LCAweDhlNDIwMDA4LCAweDhlNDMwMDA0LCAKKzB4OGU0NDAwMDAsIDB4MjY3M2ZmZmMsIDB4YWU0MjAwMGMsIDB4YWU0MzAwMDgsIAorMHhhZTQ0MDAwNCwgMHg5NjIyMDAwZSwgMHgyNjEwMDAwNCwgMHgyNDE4MDAwMSwgCisweGEzYjgwMDJmLCAweDM0NDIwMjAwLCAweGE2MjIwMDBlLCAweDhlMjIwMDAwLCAKKzB4OGUyMzAwMDQsIDB4M2MwNDAwMDEsIDB4MzQ4NDM4MDAsIDB4MjAwMzAyMSwgCisweDMwNmEwMDA3LCAweDIwYTgwMjMsIDB4MzY0MTAyMSwgMHgyMDIxMDJiLCAKKzB4MTA0MDAwMDUsIDB4MjZhOTgyMSwgMHgyMDQxMDIzLCAweDM2MjE4MjMsIAorMHgzYzAyMDAyMCwgMHg0MzgwMjMsIDB4MjY2MjAwMDcsIDB4OTYyMzAwMGEsIAorMHgyNDE4ZmZmOCwgMHg1OGM4MjQsIDB4NmExODIxLCAweDc5MTAyYiwgCisweDEwNDAwMDAyLCAweDMyMDYwMjEsIDB4NjA2MDIxLCAweDE4MDE4MjEsIAorMHgyNDYyMDAwNywgMHgyNDE4ZmZmOCwgMHg1ODYwMjQsIDB4MjZjMTAyYiwgCisweDE0NDAwMDA0LCAweDE5MzI4MjMsIDB4MTgzMjgyMywgMHg4MDAzYWMzLCAKKzB4YzMxMDIxLCAweGQzMTAyMSwgMHg0YTIwMjMsIDB4MWM0MTAyYiwgCisweDU0NDAwMDAxLCAweDhmMjAyMSwgMHgyNTQyMDA0MCwgMHg0YzEwMmIsIAorMHgxNDQwMDAzNSwgMHg1ODIxLCAweDk0YzMwMDBjLCAweDI0MDIwODAwLCAKKzB4NTQ2MjAwMzIsIDB4YWUyNjAwMTgsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAKKzB4OTA0MjgzYzAsIDB4NTQ0MDAwMmQsIDB4YWUyNjAwMTgsIDB4MjRjMjAwMTcsIAorMHgxYzIxMDJiLCAweDEwNDAwMDEzLCAweDAsIDB4M2MwMmZmZjUsIAorMHg0NjEwMjEsIDB4OTA0MjEwMTcsIDB4Mzg0MzAwMDYsIDB4MmM2MzAwMDEsIAorMHgzODQyMDAxMSwgMHgyYzQyMDAwMSwgMHg2MjE4MjUsIDB4MTA2MDAwMTQsIAorMHgyNGMyMDAxMCwgMHgxYzIxMDJiLCAweDEwNDAwMDBlLCAweDAsIAorMHgzYzBiZmZmNSwgMHgxNjY1ODIxLCAweDk1NmIxMDEwLCAweDgwMDNhZjQsIAorMHgyNTYyMDAwZSwgMHg5MGMyMDAxNywgMHgzODQzMDAwNiwgMHgyYzYzMDAwMSwgCisweDM4NDIwMDExLCAweDJjNDIwMDAxLCAweDYyMTgyNSwgMHgxMDYwMDAwNSwgCisweDE2MDE4MjEsIDB4OTRjYjAwMTAsIDB4MjU2MjAwMGUsIDB4NGE1ODIxLCAKKzB4MTYwMTgyMSwgMHgyNDYyMDAwNywgMHgyNDE4ZmZmOCwgMHg1ODU4MjQsIAorMHhjMzEwMjEsIDB4NGEyMDIzLCAweDFjNDEwMmIsIDB4MTA0MDAwMDIsIAorMHgxNjMyODIzLCAweDhmMjAyMSwgMHhhZTI2MDAxOCwgMHgzYzAyMDAwMSwgCisweDU3MTAyMSwgMHg5MDQyODNjMCwgMHgyMTAyYiwgMHgyMTZjMCwgCisweDE1NjAwMDAyLCAweGFmYTIwMDQ0LCAweDE4MDU4MjEsIDB4MzA4MjAwMDEsIAorMHgxMDQwMDAwNywgMHg0MDIxLCAweDkwODgwMDAwLCAweDI0ODQwMDAxLCAKKzB4MWM0MTAyYiwgMHgxMDQwMDAwMiwgMHgyNGE1ZmZmZiwgMHg4ZjIwMjEsIAorMHg1MGEwMDAxMiwgMHg4MWMwMiwgMHgyY2EyMDAwMiwgMHg1NDQwMDAwOSwgCisweDI0YTVmZmZmLCAweDk0ODIwMDAwLCAweDI0ODQwMDAyLCAweDEwMjQwMjEsIAorMHgxYzQxMDJiLCAweDEwNDAwMDA2LCAweDI0YTVmZmZlLCAweDgwMDNiMjEsIAorMHg4ZjIwMjEsIDB4OTA4MjAwMDAsIDB4MjEyMDAsIDB4MTAyNDAyMSwgCisweDE0YTBmZmYyLCAweDJjYTIwMDAyLCAweDgxYzAyLCAweDMxMDJmZmZmLCAKKzB4NjI0MDIxLCAweDMxMDhmZmZmLCAweDE0MDI4MjEsIDB4MTE0MDAwMTEsIAorMHgyMDAyMDIxLCAweDJjYTIwMDAyLCAweDU0NDAwMDA5LCAweDI0YTVmZmZmLCAKKzB4OTQ4MjAwMDAsIDB4MjQ4NDAwMDIsIDB4MTAyNDAyMSwgMHgxYzQxMDJiLCAKKzB4MTA0MDAwMDYsIDB4MjRhNWZmZmUsIDB4ODAwM2IzOCwgMHg4ZjIwMjEsIAorMHg5MDgyMDAwMCwgMHgyMTIwMCwgMHgxMDI0MDIxLCAweDE0YTBmZmYyLCAKKzB4MmNhMjAwMDIsIDB4ODFjMDIsIDB4MzEwMmZmZmYsIDB4NjI0MDIxLCAKKzB4ODFjMDIsIDB4MzEwMmZmZmYsIDB4OGY4OTAxMjAsIDB4NjI0MDIxLCAKKzB4Mjc2MjM4MDAsIDB4MjUyMzAwMjAsIDB4NjIxMDJiLCAweDE0NDAwMDAyLCAKKzB4MzEwOGZmZmYsIDB4Mjc2MzMwMDAsIDB4OGY4MjAxMjgsIDB4MTA2MjAwMDQsIAorMHgwLCAweDhmODIwMTI0LCAweDE0NjIwMDA3LCAweDE0MDI4MjEsIAorMHg4ZWUyMDFhNCwgMHgzODIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAKKzB4ODAwM2JjOSwgMHg4ZWUyMDFhNCwgMHg4ZTI2MDAwMCwgMHg4ZTI3MDAwNCwgCisweDgxNDAwLCAweDM0NDgwMDBiLCAweGFkMzAwMDA4LCAweGE1MmIwMDBlLCAKKzB4YWQyODAwMTgsIDB4OGZiODAwNDQsIDB4MjAyMSwgMHgyOTYxMDI1LCAKKzB4NTgxMDI1LCAweGFkMjIwMDFjLCAweGU1MTAyYiwgMHhlNTM4MjMsIAorMHhjNDMwMjMsIDB4YzIzMDIzLCAweGFkMjYwMDAwLCAweGFkMjcwMDA0LCAKKzB4OGVlMjA0YzAsIDB4YWQyMjAwMTAsIDB4YWY4MzAxMjAsIDB4OTJlMjRlMjAsIAorMHgxNDQwMDA1ZiwgMHgyNDA3MDAwMSwgMHgyNTAyZmZlZSwgMHgyYzQyMDAwMiwgCisweDE0NDAwMDAzLCAweDI0MDIwMDExLCAweDE1MDIwMDI0LCAweDAsIAorMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAKKzB4OGM4MzAwMDAsIDB4MjQwMjAwMTIsIDB4MTQ2MjAwMGYsIDB4MCwgCisweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDBiLCAweDAsIAorMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgCisweDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNWUwMDJhLCAweDAsIAorMHg4MDAzYmE4LCAweDAsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIAorMHg1MDVlMDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAKKzB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIAorMHgyZTIyMDIxLCAweDgwMDNiYzYsIDB4MjQwMjAwMTIsIDB4OGVlMjRlMzAsIAorMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODMwMDAwLCAKKzB4MjQwMjAwMDcsIDB4MTQ2MjAwMWYsIDB4MCwgMHg4ZWUzNGUzMCwgCisweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAweDAsIDB4OGM4MjAwMDQsIAorMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwgCisweDI0NDIwMDAxLCAweDEwNWUwMDA3LCAweDAsIDB4OGVlMjRlMzQsIAorMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgMHgwLCAweDgwMDNiYjQsIAorMHgwLCAweDE0NjAwMDA1LCAweDAsIDB4OGY4MjAxMjgsIAorMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgCisweDJjNDIwMDExLCAweDUwNDAwMDEyLCAweGFjODAwMDAwLCAweDgwMDNiYzksIAorMHgwLCAweDhlZTI0ZTMwLCAweDI0NDIwMDAxLCAweDUwNWUwMDAzLCAKKzB4MTAyMSwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgCisweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAweDJlMjIwMjEsIAorMHgyNDAyMDAwNywgMHhhYzgyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzgyMDAwNCwgCisweDE0ZTAwMDE5LCAweDNjMDUwMDA2LCAweDNjMDQwMDAxLCAweDI0ODQ1ODkwLCAKKzB4OGUyMjAwMTgsIDB4MzRhNWYyMDksIDB4YWZhMjAwMTAsIDB4OGUyMjAwMDAsIAorMHg4ZTIzMDAwNCwgMHgyMjAzMDIxLCAweDE2MDM4MjEsIDB4YzAwMjQwMywgCisweGFmYTMwMDE0LCAweDkzYTIwMDJmLCAweDEwNDAwMDJhLCAweDM0MDI4MTAwLCAKKzB4OGU0MzAwMDQsIDB4OGU0NDAwMDgsIDB4OGU0NTAwMGMsIDB4YTY0MjAwMGMsIAorMHhhZTQzMDAwMCwgMHhhZTQ0MDAwNCwgMHhhZTQ1MDAwOCwgMHg5NjIyMDAxNiwgCisweDgwMDNjMDIsIDB4YTY0MjAwMGUsIDB4MTU5OTAwMGEsIDB4MjZhMTgyMywgCisweDk2MjIwMDBlLCAweGE2MjMwMDBhLCAweDM0NDIwMDA0LCAweGE2MjIwMDBlLCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA4M2MwLCAweDgwMDNiZmYsIAorMHg5ODIxLCAweDk2MjQwMDBhLCAweDgzMTAyYiwgMHg1NDQwMDAwMSwgCisweDgwMTgyMSwgMHgyNDAyMDAwMSwgMHhhNjIzMDAwYSwgMHgzYzAxMDAwMSwgCisweDM3MDgyMSwgMHhhMDIyODNjMCwgMHg5NjIyMDAwYSwgMHg0YTE4MjEsIAorMHgyMDM4MDIxLCAweDFkMDEwMmIsIDB4NTQ0MDAwMDEsIDB4MjBmODAyMSwgCisweDI2Mzk4MjMsIDB4YjAyMSwgMHg4ZmI4MDAyNCwgMHgxNjYwZmU1ZSwgCisweGFmMGQwMDAwLCAweDEyNjAwMDIyLCAweDAsIDB4M2MwMTAwMDEsIAorMHgzNzA4MjEsIDB4YWMzMzgzYzQsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAKKzB4YWMzMDgzYzgsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMzI4M2NjLCAKKzB4OTNhMjAwMmYsIDB4MTA0MDAwMDgsIDB4MCwgMHgzYzAyMDAwMSwgCisweDU3MTAyMSwgMHg4YzQyODNjYywgMHgyNDQyMDAwNCwgMHgzYzAxMDAwMSwgCisweDM3MDgyMSwgMHhhYzIyODNjYywgMHg4ZjQzMDI4MCwgMHg4ZWUyNzI0YywgCisweDE0NjIwMDA2LCAweDAsIDB4OGVlMjAxYzQsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDFjNCwgMHg4MDAzYzViLCAweDhlZTIwMWM0LCAweDhlZTIwMWJjLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxYmMsIDB4ODAwM2M1YiwgMHg4ZWUyMDFiYywgCisweDk3YTQwMDFlLCAweDI0ODRmZmZjLCAweDgwMTgyMSwgMHg4ZWU0MDBjMCwgCisweDhlZTUwMGM0LCAweDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwgCisweDgyMjAyMSwgMHg4NjIwMjEsIDB4MjQwMjAwMDIsIDB4YWVlNDAwYzAsIAorMHhhZWU1MDBjNCwgMHgxMmEyMDAwZiwgMHgyYWEyMDAwMywgMHgxNDQwMDAxNywgCisweDI0MDIwMDAzLCAweDE2YTIwMDE1LCAweDAsIDB4OGVlMjAwZDAsIAorMHg4ZWUzMDBkNCwgMHgyNDYzMDAwMSwgMHgyYzY0MDAwMSwgMHg0NDEwMjEsIAorMHhhZWUyMDBkMCwgMHhhZWUzMDBkNCwgMHg4ZWUyMDBkMCwgMHg4MDAzYzU1LCAKKzB4OGVlMzAwZDQsIDB4OGVlMjAwZDgsIDB4OGVlMzAwZGMsIDB4MjQ2MzAwMDEsIAorMHgyYzY0MDAwMSwgMHg0NDEwMjEsIDB4YWVlMjAwZDgsIDB4YWVlMzAwZGMsIAorMHg4ZWUyMDBkOCwgMHg4MDAzYzU1LCAweDhlZTMwMGRjLCAweDhlZTIwMGM4LCAKKzB4OGVlMzAwY2MsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIDB4NDQxMDIxLCAKKzB4YWVlMjAwYzgsIDB4YWVlMzAwY2MsIDB4OGVlMjAwYzgsIDB4OGVlMzAwY2MsIAorMHg4ZjgzMDBlNCwgMHg4ZjgyMDBlMCwgMHgxMDYyMDAwMywgMHgyNDYzMDAwOCwgCisweGFmODMwMGU0LCAweGFmODMwMGU4LCAweDhmYmYwMDY4LCAweDhmYmUwMDY0LCAKKzB4OGZiNjAwNjAsIDB4OGZiNTAwNWMsIDB4OGZiNDAwNTgsIDB4OGZiMzAwNTQsIAorMHg4ZmIyMDA1MCwgMHg4ZmIxMDA0YywgMHg4ZmIwMDA0OCwgMHgzZTAwMDA4LCAKKzB4MjdiZDAwNzAsIDB4MjdiZGZmZTAsIDB4YWZiZjAwMTgsIDB4OGVlMzBlMTQsIAorMHg4ZWUyMGUwYywgMHgxMDYyMDA3NCwgMHgwLCAweDhlZTMwZTBjLCAKKzB4OGVlMjBlMTQsIDB4NjIyMDIzLCAweDQ4MjAwMDEsIDB4MjQ4NDAyMDAsIAorMHg4ZWUzMGUxOCwgMHg4ZWUyMGUxNCwgMHg0MzEwMmIsIDB4MTQ0MDAwMDQsIAorMHgyNDAyMDIwMCwgMHg4ZWUzMGUxNCwgMHg4MDAzYzdkLCAweDQzMTgyMywgCisweDhlZTIwZTE4LCAweDhlZTMwZTE0LCAweDQzMTAyMywgMHgyNDQzZmZmZiwgCisweDgwNDgyMSwgMHg2OTEwMmEsIDB4NTQ0MDAwMDEsIDB4NjA0ODIxLCAKKzB4OGY4NzAxMDAsIDB4Mjc2MjMwMDAsIDB4MjRlODAwMjAsIDB4MTAyMTAyYiwgCisweDUwNDAwMDAxLCAweDI3NjgyODAwLCAweDhmODIwMTA4LCAweDExMDIwMDA0LCAKKzB4MCwgMHg4ZjgyMDEwNCwgMHgxNTAyMDAwNywgMHgxMDIxLCAKKzB4OGVlMjAxYTgsIDB4MjAyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhOCwgCisweDgwMDNjYmYsIDB4OGVlMjAxYTgsIDB4OGVlNDBlMTQsIDB4NDIxNDAsIAorMHg4MDE4MjEsIDB4OGVlNDA0NjAsIDB4OGVlNTA0NjQsIDB4YTMyODIxLCAKKzB4YTMzMDJiLCAweDgyMjAyMSwgMHg4NjIwMjEsIDB4YWNlNDAwMDAsIAorMHhhY2U1MDAwNCwgMHg4ZWUzMGUxNCwgMHg5MTE0MCwgMHhhNGUyMDAwZSwgCisweDI0MDIwMDAyLCAweGFjZTIwMDE4LCAweDMxOTQwLCAweDI0NjMwZTIwLCAKKzB4MmUzMTAyMSwgMHhhY2UyMDAwOCwgMHg4ZWUyMGUxNCwgMHhhY2UyMDAxYywgCisweDhlZTIwNGNjLCAweGFjZTIwMDEwLCAweGFmODgwMTAwLCAweDkyZTIwNGVjLCAKKzB4MTQ0MDAwMTEsIDB4MjQwNDAwMDEsIDB4OGVlMjRlMjgsIDB4MjQwMzAwNDAsIAorMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTI4LCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjRlMjgsIDB4OGVlMjRlMjgsIDB4MjEwYzAsIAorMHgyNDQyNGUzOCwgMHgyZTIxODIxLCAweDI0MDIwMDAyLCAweGFjNjIwMDAwLCAKKzB4MjQwMjAwMDEsIDB4YWM2MjAwMDQsIDB4MTQ4MDAwMGUsIDB4MjQwMzAwNDAsIAorMHg4ZWUyMGUxNCwgMHhhZmEyMDAxMCwgMHg4ZWUyMGUxOCwgMHgzYzA1MDAwNywgCisweGFmYTIwMDE0LCAweDhlZTYwZTBjLCAweDhlZTcwZTEwLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDU4ZDQsIDB4YzAwMjQwMywgMHgzNGE1ZjAwMSwgMHg4MDAzY2RkLCAKKzB4MCwgMHg4ZWUyMDUwMCwgMHgyNDQyMDAwMSwgMHg1MDQzMDAwMywgCisweDEwMjEsIDB4OGVlMjA1MDAsIDB4MjQ0MjAwMDEsIDB4YWVlMjA1MDAsIAorMHg4ZWUyMDUwMCwgMHgyMTA4MCwgMHg1NzEwMjEsIDB4YWM0OTA1MDgsIAorMHg4ZWUyMGUxNCwgMHg0OTEwMjEsIDB4MzA0MjAxZmYsIDB4YWVlMjBlMTQsIAorMHg4ZWUzMGUxNCwgMHg4ZWUyMGUwYywgMHgxNDYyMDAwNSwgMHgwLCAKKzB4OGY4MjAwNjAsIDB4MjQwM2ZkZmYsIDB4NDMxMDI0LCAweGFmODIwMDYwLCAKKzB4OGZiZjAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgyN2JkZmZlMCwgCisweGFmYmYwMDE4LCAweDhlZTM1MjNjLCAweDhlZTI1MjM4LCAweDEwNjIwMDc0LCAKKzB4MCwgMHg4ZWUzNTIzOCwgMHg4ZWUyNTIzYywgMHg2MjIwMjMsIAorMHg0ODIwMDAxLCAweDI0ODQwMTAwLCAweDhlZTM1MjQ0LCAweDhlZTI1MjNjLCAKKzB4NDMxMDJiLCAweDE0NDAwMDA0LCAweDI0MDIwMTAwLCAweDhlZTM1MjNjLCAKKzB4ODAwM2NmZiwgMHg0MzE4MjMsIDB4OGVlMjUyNDQsIDB4OGVlMzUyM2MsIAorMHg0MzEwMjMsIDB4MjQ0M2ZmZmYsIDB4ODA0ODIxLCAweDY5MTAyYSwgCisweDU0NDAwMDAxLCAweDYwNDgyMSwgMHg4Zjg3MDEwMCwgMHgyNzYyMzAwMCwgCisweDI0ZTgwMDIwLCAweDEwMjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2ODI4MDAsIAorMHg4ZjgyMDEwOCwgMHgxMTAyMDAwNCwgMHgwLCAweDhmODIwMTA0LCAKKzB4MTUwMjAwMDcsIDB4MTAyMSwgMHg4ZWUyMDFhOCwgMHgyMDIxLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxYTgsIDB4ODAwM2Q0MSwgMHg4ZWUyMDFhOCwgCisweDhlZTQ1MjNjLCAweDQyMTQwLCAweDgwMTgyMSwgMHg4ZWU0MDQ3MCwgCisweDhlZTUwNDc0LCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAKKzB4ODYyMDIxLCAweGFjZTQwMDAwLCAweGFjZTUwMDA0LCAweDhlZTM1MjNjLCAKKzB4OTExNDAsIDB4YTRlMjAwMGUsIDB4MjQwMjAwMDMsIDB4YWNlMjAwMTgsIAorMHgzMTk0MCwgMHgyNDYzNTI0OCwgMHgyZTMxMDIxLCAweGFjZTIwMDA4LCAKKzB4OGVlMjUyM2MsIDB4YWNlMjAwMWMsIDB4OGVlMjA0Y2MsIDB4YWNlMjAwMTAsIAorMHhhZjg4MDEwMCwgMHg5MmUyMDRlYywgMHgxNDQwMDAxMSwgMHgyNDA0MDAwMSwgCisweDhlZTI0ZTI4LCAweDI0MDMwMDQwLCAweDI0NDIwMDAxLCAweDUwNDMwMDAzLCAKKzB4MTAyMSwgMHg4ZWUyNGUyOCwgMHgyNDQyMDAwMSwgMHhhZWUyNGUyOCwgCisweDhlZTI0ZTI4LCAweDIxMGMwLCAweDI0NDI0ZTM4LCAweDJlMjE4MjEsIAorMHgyNDAyMDAwMywgMHhhYzYyMDAwMCwgMHgyNDAyMDAwMSwgMHhhYzYyMDAwNCwgCisweDE0ODAwMDBlLCAweDI0MDMwMDQwLCAweDhlZTI1MjNjLCAweGFmYTIwMDEwLCAKKzB4OGVlMjUyNDQsIDB4M2MwNTAwMDcsIDB4YWZhMjAwMTQsIDB4OGVlNjUyMzgsIAorMHg4ZWU3NTI0MCwgMHgzYzA0MDAwMSwgMHgyNDg0NThlMCwgMHhjMDAyNDAzLCAKKzB4MzRhNWYwMTAsIDB4ODAwM2Q1ZiwgMHgwLCAweDhlZTIwNTAwLCAKKzB4MjQ0MjAwMDEsIDB4NTA0MzAwMDMsIDB4MTAyMSwgMHg4ZWUyMDUwMCwgCisweDI0NDIwMDAxLCAweGFlZTIwNTAwLCAweDhlZTIwNTAwLCAweDIxMDgwLCAKKzB4NTcxMDIxLCAweGFjNDkwNTA4LCAweDhlZTI1MjNjLCAweDQ5MTAyMSwgCisweDMwNDIwMGZmLCAweGFlZTI1MjNjLCAweDhlZTM1MjNjLCAweDhlZTI1MjM4LCAKKzB4MTQ2MjAwMDUsIDB4MCwgMHg4ZjgyMDA2MCwgMHgyNDAzZmVmZiwgCisweDQzMTAyNCwgMHhhZjgyMDA2MCwgMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LCAKKzB4MjdiZDAwMjAsIDB4OGY4MjAxMjAsIDB4OGVlMzRlMzQsIDB4OGY4MjAxMjQsIAorMHg4Zjg2MDEyOCwgMHgyNDAyMDA0MCwgMHgyNDYzMDAwMSwgMHg1MDYyMDAwMywgCisweDEwMjEsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzQsIAorMHg4ZWUyNGUzNCwgMHg4ZWU0NGUzNCwgMHg4ZWUzNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDE0ODMwMDA3LCAweDJlMjI4MjEsIDB4OGY4MjAxMjgsIAorMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgMHg4ZjgyMDEyOCwgMHg4MDAzZDkyLCAKKzB4YWNhMDAwMDAsIDB4OGVlMjRlMzQsIDB4MjQwMzAwNDAsIDB4MjQ0MjAwMDEsIAorMHg1MDQzMDAwMywgMHgxMDIxLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAKKzB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjgyMSwgMHg4Y2EyMDAwNCwgCisweDhmODMwMTI4LCAweDIxMTQwLCAweDYyMTgyMSwgMHhhZjgzMDEyOCwgCisweGFjYTAwMDAwLCAweDhjYzIwMDE4LCAweDI0NDNmZmZlLCAweDJjNjIwMDEyLCAKKzB4MTA0MDAwMDgsIDB4MzEwODAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAKKzB4OGMyMjU4ZjAsIDB4NDAwMDA4LCAweDAsIDB4MjQwMjAwMDEsIAorMHhhZWUyNGUyNCwgMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmYzgsIAorMHhhZmJmMDAzMCwgMHhhZmI1MDAyYywgMHhhZmI0MDAyOCwgMHhhZmIzMDAyNCwgCisweGFmYjIwMDIwLCAweGFmYjEwMDFjLCAweGFmYjAwMDE4LCAweDhmODMwMTI4LCAKKzB4OGY4MjAxMjQsIDB4MTA2MjAyYjAsIDB4OTgyMSwgMHgzYzExMDAxZiwgCisweDM2MzFmZmZmLCAweDNjMTJmZmY1LCAweDM2NTIxMDAwLCAweDI0MTUwMDEyLCAKKzB4MjQxNDAwNDAsIDB4OGY4YzAxMjgsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIAorMHhhZjgyMDEyOCwgMHg5MTgyMDAxYiwgMHg4ZjgzMDEyOCwgMHgyNDQzZmZmZSwgCisweDJjNjIwMDEyLCAweDEwNDAwMjljLCAweDMxMDgwLCAweDNjMDEwMDAxLCAKKzB4MjIwODIxLCAweDhjMjI1OTQ4LCAweDQwMDAwOCwgMHgwLCAKKzB4OGY0MjAyMTgsIDB4MzA0MjAxMDAsIDB4MTA0MDAwMDcsIDB4MCwgCisweDk1ODMwMDE2LCAweDk1ODIwMDE4LCAweDYyMTgyMywgMHgzMTQwMiwgCisweDQzMTAyMSwgMHhhNTgyMDAxNiwgMHg4ZDgyMDAxYywgMHgzYzAzODAwMCwgCisweDMwNDRmZmZmLCAweDQzNjgyNCwgMHgzYzAzMDgwMCwgMHg0MzE4MjQsIAorMHgxMWEwMDAwNCwgMHhhZDg0MDAxYywgMHg0MTE0MCwgMHg4MDAzZGQ4LCAKKzB4MjQ0MjUyNDgsIDB4NDExNDAsIDB4MjQ0MjBlMjAsIDB4MmUyNTgyMSwgCisweDk1NjIwMDBlLCAweDMwNDJmZmZjLCAweDEwNjAwMDA0LCAweGE1NjIwMDBlLCAKKzB4OTU4NDAwMTYsIDB4ODAwM2VjMCwgMHgwLCAweDhkNjkwMDE4LCAKKzB4NDAyMSwgMHg5NTJhMDAwMCwgMHgyNTI5MDAwMiwgMHg5NTI3MDAwMCwgCisweDI1MjkwMDAyLCAweDk1MjYwMDAwLCAweDI1MjkwMDAyLCAweDk1MjUwMDAwLCAKKzB4MjUyOTAwMDIsIDB4OTUyNDAwMDAsIDB4MjUyOTAwMDIsIDB4OTUyMzAwMDAsIAorMHgyNTI5MDAwMiwgMHg5NTIyMDAwMCwgMHgyNTI5MDAwMiwgMHgxNDc1MDIxLCAKKzB4MTQ2NTAyMSwgMHgxNDU1MDIxLCAweDE0NDUwMjEsIDB4MTQzNTAyMSwgCisweDE0MjUwMjEsIDB4YTFjMDIsIDB4MzE0MmZmZmYsIDB4NjI1MDIxLCAKKzB4YTFjMDIsIDB4MzE0MmZmZmYsIDB4NjI1MDIxLCAweDk2ZTIwNDZhLCAKKzB4MzE0ZWZmZmYsIDB4MzA0MjAwMDIsIDB4MTA0MDAwNDQsIDB4NTAyMSwgCisweDI1MjIwMDE0LCAweDIyMjEwMmIsIDB4MTA0MDAwMTQsIDB4MTIwMTgyMSwgCisweDI0MDUwMDBhLCAweDIwMjEsIDB4MjIzMTAyYiwgMHg1NDQwMDAwMSwgCisweDcyMTgyMSwgMHg5NDYyMDAwMCwgMHgyNDYzMDAwMiwgMHgyNGE1ZmZmZiwgCisweDE0YTBmZmY5LCAweDgyMjAyMSwgMHg0MWMwMiwgMHgzMDgyZmZmZiwgCisweDYyMjAyMSwgMHg0MTQwMiwgMHgzMDgzZmZmZiwgMHg0MzEwMjEsIAorMHgzMDQyZmZmZiwgMHg4MDAzZTMzLCAweDE0MjUwMjEsIDB4OTUyYTAwMDAsIAorMHgyNTI5MDAwMiwgMHg5NTI4MDAwMCwgMHgyNTI5MDAwMiwgMHg5NTI3MDAwMCwgCisweDI1MjkwMDAyLCAweDk1MjYwMDAwLCAweDI1MjkwMDAyLCAweDk1MjUwMDAwLCAKKzB4MjUyOTAwMDIsIDB4OTUyMzAwMDAsIDB4MjUyOTAwMDIsIDB4OTUyMjAwMDAsIAorMHgyNTI5MDAwMiwgMHg5NTI0MDAwMCwgMHgyNTI5MDAwMiwgMHgxNDg1MDIxLCAKKzB4MTQ3NTAyMSwgMHgxNDY1MDIxLCAweDE0NTUwMjEsIDB4MTQzNTAyMSwgCisweDE0MjUwMjEsIDB4OTUyMjAwMDAsIDB4OTUyMzAwMDIsIDB4MTQ0NTAyMSwgCisweDE0MjUwMjEsIDB4MTQzNTAyMSwgMHhhMWMwMiwgMHgzMTQyZmZmZiwgCisweDYyNTAyMSwgMHhhMWMwMiwgMHgzMTQyZmZmZiwgMHg2MjUwMjEsIAorMHgzMTQ4ZmZmZiwgMHg1MTAwMDAwMSwgMHgzNDA4ZmZmZiwgMHg4ZDYyMDAxOCwgCisweDk0NDMwMDBjLCAweDI0MDIwODAwLCAweDU0NjIwMDA1LCAweGE1NjgwMDEwLCAKKzB4OTU2MjAwMGUsIDB4MzQ0MjAwMDIsIDB4YTU2MjAwMGUsIDB4YTU2ODAwMTAsIAorMHg5NmUyMDQ2YSwgMHgyODIxLCAweDMwNDIwMDA4LCAweDE0NDAwMDU2LCAKKzB4MzAyMSwgMHg4ZDYzMDAxOCwgMHgyNDYyMDAyNCwgMHgyMjIxMDJiLCAKKzB4MTA0MDAwMzQsIDB4MjQ2OTAwMTAsIDB4MjI5MTAyYiwgMHg1NDQwMDAwMSwgCisweDEzMjQ4MjEsIDB4OTUyNTAwMDAsIDB4MjQ2OTAwMTQsIDB4MjI5MTAyYiwgCisweDEwNDAwMDAyLCAweDI0YTVmZmVjLCAweDEzMjQ4MjEsIDB4OTUyMjAwMDAsIAorMHgzMDQyMGZmZiwgMHgxNDQwMDAwMywgMHgyNTI5MDAwMiwgMHg4MDAzZTYwLCAKKzB4MjQxMzAwMDEsIDB4OTgyMSwgMHhhMDMwMjEsIDB4MjI5MTAyYiwgCisweDU0NDAwMDAxLCAweDEzMjQ4MjEsIDB4OTEyMjAwMDEsIDB4MjUyOTAwMDIsIAorMHhhMjI4MjEsIDB4MjI5MTAyYiwgMHg1NDQwMDAwMSwgMHgxMzI0ODIxLCAKKzB4MjUyOTAwMDIsIDB4MjI5MTAyYiwgMHg1NDQwMDAwMSwgMHgxMzI0ODIxLCAKKzB4OTUyMjAwMDAsIDB4MjUyOTAwMDIsIDB4YTIyODIxLCAweDIyOTEwMmIsIAorMHg1NDQwMDAwMSwgMHgxMzI0ODIxLCAweDk1MjIwMDAwLCAweDI1MjkwMDAyLCAKKzB4YTIyODIxLCAweDIyOTEwMmIsIDB4NTQ0MDAwMDEsIDB4MTMyNDgyMSwgCisweDk1MjIwMDAwLCAweDI1MjkwMDAyLCAweGEyMjgyMSwgMHgyMjkxMDJiLCAKKzB4NTQ0MDAwMDEsIDB4MTMyNDgyMSwgMHg5NTIyMDAwMCwgMHg4MDAzZTk5LCAKKzB4YTIyODIxLCAweDk0NjUwMDEwLCAweDk0NjIwMDE0LCAweDI0NjkwMDE2LCAKKzB4MzA0MjBmZmYsIDB4MTQ0MDAwMDMsIDB4MjRhNWZmZWMsIDB4ODAwM2U4YywgCisweDI0MTMwMDAxLCAweDk4MjEsIDB4YTAzMDIxLCAweDkxMjMwMDAxLCAKKzB4MjUyOTAwMDQsIDB4OTUyMjAwMDAsIDB4MjUyOTAwMDIsIDB4OTUyNDAwMDAsIAorMHgyNTI5MDAwMiwgMHhhMzI4MjEsIDB4YTIyODIxLCAweDk1MjIwMDAwLCAKKzB4OTUyMzAwMDIsIDB4YTQyODIxLCAweGEyMjgyMSwgMHhhMzI4MjEsIAorMHg1MWMwMiwgMHgzMGEyZmZmZiwgMHg2MjI4MjEsIDB4NTFjMDIsIAorMHgzMGEyZmZmZiwgMHg2MjI4MjEsIDB4OTZlMjA0NmEsIDB4MzA0MjAwMDEsIAorMHgxMDQwMDAxZSwgMHgyMDIxLCAweDk1ODIwMDE2LCAweDRlMjAyMywgCisweDQxNDAyLCAweDgyMjAyMSwgMHgzMjYyMDBmZiwgMHg1MDQwMDAwMiwgCisweDg2MjAyMSwgMHg4NTIwMjEsIDB4NDE0MDIsIDB4ODIyMDIxLCAKKzB4MzA4NGZmZmYsIDB4NTA4MDAwMDEsIDB4MzQwNGZmZmYsIDB4OGQ2MjAwMTgsIAorMHgyNDQzMDAxNywgMHgyMjMxMDJiLCAweDU0NDAwMDAxLCAweDcyMTgyMSwgCisweDkwNjIwMDAwLCAweDM4NDMwMDExLCAweDJjNjMwMDAxLCAweDM4NDIwMDA2LCAKKzB4MmM0MjAwMDEsIDB4NjIxODI1LCAweDEwNjAwMDA0LCAweDAsIAorMHg5NTYyMDAwZSwgMHgzNDQyMDAwMSwgMHhhNTYyMDAwZSwgMHg5NTYyMDAwZSwgCisweDI0MGEwMDAyLCAweDMwNDIwMDA0LCAweDEwNDAwMDAyLCAweGE1NjQwMDEyLCAKKzB4MjQwYTAwMDQsIDB4OGY4ODAxMjAsIDB4Mjc2MjM4MDAsIDB4MjUwOTAwMjAsIAorMHgxMjIxMDJiLCAweDUwNDAwMDAxLCAweDI3NjkzMDAwLCAweDhmODIwMTI4LCAKKzB4MTEyMjAwMDQsIDB4MCwgMHg4ZjgyMDEyNCwgMHgxNTIyMDAwNywgCisweDI0MDQwMDIwLCAweDhlZTIwMWE0LCAweDgwMjEsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDFhNCwgMHg4MDAzZjRmLCAweDhlZTIwMWE0LCAweDhlZTU3MjRjLCAKKzB4OGVlNjA0OTAsIDB4OGVlNzA0OTQsIDB4YWQwYjAwMDgsIDB4YTUwNDAwMGUsIAorMHhhZDBhMDAxOCwgMHg1Mjk0MCwgMHhhMDE4MjEsIDB4MTAyMSwgCisweGUzMzgyMSwgMHhlMzIwMmIsIDB4YzIzMDIxLCAweGM0MzAyMSwgCisweGFkMDYwMDAwLCAweGFkMDcwMDA0LCAweDhlZTI3MjRjLCAweDRkMTAyNSwgCisweGFkMDIwMDFjLCAweDhlZTIwNGM0LCAweGFkMDIwMDEwLCAweGFmODkwMTIwLCAKKzB4OTJlMjRlMjAsIDB4MTQ0MDAwNjAsIDB4MjQxMDAwMDEsIDB4MjU0M2ZmZWUsIAorMHgyYzYzMDAwMiwgMHgzOTQyMDAxMSwgMHgyYzQyMDAwMSwgMHg2MjE4MjUsIAorMHgxMDYwMDAyNCwgMHgwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAKKzB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHg4YzgyMDAwMCwgMHgxNDU1MDAwZiwgCisweDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMGIsIAorMHgwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAKKzB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA1NDAwMmIsIAorMHgwLCAweDgwMDNmMmUsIDB4MCwgMHg4ZWUyNGUzMCwgCisweDI0NDIwMDAxLCAweDUwNTQwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIAorMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4MjQwMjAwMDEsIDB4ODAwM2Y0ZSwgCisweGFjOTUwMDAwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAweDI0NDI1MDM4LCAKKzB4MmUyMjAyMSwgMHg4YzgzMDAwMCwgMHgyNDAyMDAwNywgMHgxNDYyMDAxZiwgCisweDAsIDB4OGVlMzRlMzAsIDB4OGVlMjRlMzQsIDB4MTA2MjAwMWIsIAorMHgwLCAweDhjODIwMDA0LCAweDI0NDIwMDAxLCAweGFjODIwMDA0LCAKKzB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsIDB4MjQ0MjAwMDEsIDB4MTA1NDAwMDcsIAorMHgwLCAweDhlZTI0ZTM0LCAweDI0NDIwMDAxLCAweDEwNjIwMDA1LCAKKzB4MCwgMHg4MDAzZjNhLCAweDAsIDB4MTQ2MDAwMDUsIAorMHgwLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLCAweGFmODIwMTI4LCAKKzB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIDB4MmM0MjAwMTEsIDB4NTA0MDAwMTIsIAorMHhhYzgwMDAwMCwgMHg4MDAzZjRmLCAweDAsIDB4OGVlMjRlMzAsIAorMHgyNDQyMDAwMSwgMHg1MDU0MDAwMywgMHgxMDIxLCAweDhlZTI0ZTMwLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIAorMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDI0MDIwMDA3LCAweGFjODIwMDAwLCAKKzB4MjQwMjAwMDEsIDB4YWM4MjAwMDQsIDB4MTYwMDAwMGQsIDB4MCwgCisweDhmODIwMTIwLCAweDNjMDQwMDAxLCAweDI0ODQ1OTM4LCAweGFmYTAwMDE0LCAKKzB4YWZhMjAwMTAsIDB4OGQ4NjAwMWMsIDB4OGY4NzAxMjQsIDB4M2MwNTAwMDgsIAorMHhjMDAyNDAzLCAweDM0YTUwMDAxLCAweDgwMDQwNTcsIDB4MCwgCisweDhlZTI3MjRjLCAweDI0NDIwMDAxLCAweDMwNDIwN2ZmLCAweDExYTAwMDA2LCAKKzB4YWVlMjcyNGMsIDB4OGVlMjAxZDAsIDB4MjQ0MmZmZmYsIDB4YWVlMjAxZDAsIAorMHg4MDAzZjZiLCAweDhlZTIwMWQwLCAweDhlZTIwMWNjLCAweDI0NDJmZmZmLCAKKzB4YWVlMjAxY2MsIDB4OGVlMjAxY2MsIDB4OGVlMjAxZDgsIDB4MjQ0MmZmZmYsIAorMHhhZWUyMDFkOCwgMHg4MDA0MDU3LCAweDhlZTIwMWQ4LCAweDhmNDIwMjQwLCAKKzB4MTA0MDAwZTUsIDB4MCwgMHg4ZWUyMGUxYywgMHgyNDQyMDAwMSwgCisweDgwMDQwNTcsIDB4YWVlMjBlMWMsIDB4OTU4MjAwMWUsIDB4YWQ4MjAwMWMsIAorMHg4ZjQyMDI0MCwgMHgxMDQwMDA3MiwgMHgwLCAweDhlZTIwZTFjLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjBlMWMsIDB4OGY0MzAyNDAsIDB4NDMxMDJiLCAKKzB4MTQ0MDAwZDUsIDB4MCwgMHg4ZjgzMDEyMCwgMHgyNzYyMzgwMCwgCisweDI0NjYwMDIwLCAweGMyMTAyYiwgMHg1MDQwMDAwMSwgMHgyNzY2MzAwMCwgCisweDhmODIwMTI4LCAweDEwYzIwMDA0LCAweDAsIDB4OGY4MjAxMjQsIAorMHgxNGMyMDAwNywgMHgwLCAweDhlZTIwMWE0LCAweDgwMjEsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgMHg4MDAzZmRhLCAweDhlZTIwMWE0LCAKKzB4OGVlMjcyNGMsIDB4YWM2MjAwMWMsIDB4OGVlNDA0YTgsIDB4OGVlNTA0YWMsIAorMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgMHgyNDAyMDAwOCwgMHhhNDYyMDAwZSwgCisweDI0MDIwMDExLCAweGFjNjIwMDE4LCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LCAKKzB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIAorMHgxNDQwMDAzNCwgMHgyNDEwMDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MjAwMDAsIDB4MTQ1NTAwMWYsIAorMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAKKzB4MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgCisweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNTQwMDA3LCAKKzB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgCisweDAsIDB4ODAwM2ZjNiwgMHgwLCAweDE0NjAwMDA1LCAKKzB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgCisweDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDExLCAKKzB4YWM4MDAwMDAsIDB4ODAwM2ZkYSwgMHgwLCAweDhlZTI0ZTMwLCAKKzB4MjQ0MjAwMDEsIDB4NTA1NDAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgCisweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAKKzB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHgyNDAyMDAwMSwgMHhhYzk1MDAwMCwgCisweGFjODIwMDA0LCAweDU2MDAwMDBiLCAweDI0MTAwMDAxLCAweDhlZTI3MjRjLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDU4YTgsIDB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsIAorMHg4ZWU2NzI0YywgMHg4ZjQ3MDI4MCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAKKzB4MzRhNWYwMDgsIDB4NTYwMDAwMDEsIDB4YWVlMDBlMWMsIDB4OGVlMjAxODgsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDE4OCwgMHg4MDA0MDUwLCAweDhlZTIwMTg4LCAKKzB4OGY4MzAxMjAsIDB4Mjc2MjM4MDAsIDB4MjQ2NjAwMjAsIDB4YzIxMDJiLCAKKzB4NTA0MDAwMDEsIDB4Mjc2NjMwMDAsIDB4OGY4MjAxMjgsIDB4MTBjMjAwMDQsIAorMHgwLCAweDhmODIwMTI0LCAweDE0YzIwMDA3LCAweDAsIAorMHg4ZWUyMDFhNCwgMHg4MDIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAKKzB4ODAwNDA0NCwgMHg4ZWUyMDFhNCwgMHg4ZWUyNzI0YywgMHhhYzYyMDAxYywgCisweDhlZTQwNGE4LCAweDhlZTUwNGFjLCAweDI0NjIwMDFjLCAweGFjNjIwMDA4LCAKKzB4MjQwMjAwMDgsIDB4YTQ2MjAwMGUsIDB4MjQwMjAwMTEsIDB4YWM2MjAwMTgsIAorMHhhYzY0MDAwMCwgMHhhYzY1MDAwNCwgMHg4ZWUyMDRjNCwgMHhhYzYyMDAxMCwgCisweGFmODYwMTIwLCAweDkyZTI0ZTIwLCAweDE0NDAwMDM0LCAweDI0MTAwMDAxLCAKKzB4OGVlMjRlMzAsIDB4MjEwYzAsIDB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgCisweDhjODIwMDAwLCAweDE0NTUwMDFmLCAweDAsIDB4OGVlMzRlMzAsIAorMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgMHgwLCAweDhjODIwMDA0LCAKKzB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIDB4OGVlMjRlMzQsIDB4OGVlMzRlMzAsIAorMHgyNDQyMDAwMSwgMHgxMDU0MDAwNywgMHgwLCAweDhlZTI0ZTM0LCAKKzB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIDB4MCwgMHg4MDA0MDMwLCAKKzB4MCwgMHgxNDYwMDAwNSwgMHgwLCAweDhmODIwMTI4LCAKKzB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4OGM4MjAwMDQsIAorMHgyYzQyMDAxMSwgMHg1MDQwMDAxMSwgMHhhYzgwMDAwMCwgMHg4MDA0MDQ0LCAKKzB4MCwgMHg4ZWUyNGUzMCwgMHgyNDQyMDAwMSwgMHg1MDU0MDAwMywgCisweDEwMjEsIDB4OGVlMjRlMzAsIDB4MjQ0MjAwMDEsIDB4YWVlMjRlMzAsIAorMHg4ZWUyNGUzMCwgMHgyMTBjMCwgMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAKKzB4MjQwMjAwMDEsIDB4YWM5NTAwMDAsIDB4YWM4MjAwMDQsIDB4MTYwMDAwMGIsIAorMHgwLCAweDhlZTI3MjRjLCAweDNjMDQwMDAxLCAweDI0ODQ1OGE4LCAKKzB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsIDB4OGVlNjcyNGMsIDB4OGY0NzAyODAsIAorMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDA4LCAweDhlZTIwMTc0LCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxNzQsIDB4ODAwNDA1NywgMHg4ZWUyMDE3NCwgCisweDI0MDIwMDAxLCAweGFlZTI0ZTI0LCAweDhmODMwMTI4LCAweDhmODIwMTI0LCAKKzB4MTQ2MmZkNTgsIDB4MCwgMHg4ZmJmMDAzMCwgMHg4ZmI1MDAyYywgCisweDhmYjQwMDI4LCAweDhmYjMwMDI0LCAweDhmYjIwMDIwLCAweDhmYjEwMDFjLCAKKzB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAzOCwgMHgyN2JkZmZlOCwgCisweDI3ODQwMjA4LCAweDI3NDUwMjAwLCAweDI0MDYwMDA4LCAweGFmYmYwMDE0LCAKKzB4YzAwMjQ5YSwgMHhhZmIwMDAxMCwgMHgyMDIxLCAweDI0MTAwMDAxLCAKKzB4MjQwMjI0MWYsIDB4YWY5MDAyMTAsIDB4YWY5MDAyMDAsIDB4YWY4MDAyMDQsIAorMHhhZjgyMDIxNCwgMHg4ZjQ2MDI0OCwgMHgyNDAzMDAwNCwgMHgzYzAyMDA0MCwgCisweDNjMDEwMDAxLCAweGFjMjM1Y2M0LCAweDNjMDEwMDAxLCAweGFjMjM1Y2M4LCAKKzB4M2MwMTAwMDEsIDB4YWMyMDVkOWMsIDB4M2MwMTAwMDEsIDB4YWMyMjVjYzAsIAorMHgzYzAxMDAwMSwgMHhhYzIzNWNjOCwgMHhjMDA1MTA4LCAweDI0MDUwMDA0LCAKKzB4YzAwNDgyMiwgMHgwLCAweDhlZTIwMDAwLCAweDNjMDNmZWZmLCAKKzB4MzQ2M2ZmZmQsIDB4NDMxMDI0LCAweGFlZTIwMDAwLCAweDNjMDIzYzAwLCAKKzB4YWY4MjAyMWMsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMzA4M2FjLCAKKzB4OGZiZjAwMTQsIDB4OGZiMDAwMTAsIDB4M2UwMDAwOCwgMHgyN2JkMDAxOCwgCisweDI3YmRmZmUwLCAweDNjMDUwMDA4LCAweDM0YTUwNDAwLCAweGFmYmYwMDE4LCAKKzB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY4NjAyMDAsIDB4M2MwNDAwMDEsIAorMHgyNDg0NTlmMCwgMHhjMDAyNDAzLCAweDM4MjEsIDB4OGVlMjAyODAsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDI4MCwgMHg4ZWUyMDI4MCwgMHg4ZjgzMDIwMCwgCisweDNjMDIzZjAwLCAweDYyMTgyNCwgMHg4ZmJmMDAxOCwgMHgzYzAyMDQwMCwgCisweDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MjdiZGZmZDgsIDB4YWZiZjAwMjAsIAorMHhhZmIxMDAxYywgMHhhZmIwMDAxOCwgMHg4ZjkwMDIyMCwgMHg4ZWUyMDIxNCwgCisweDM4MjEsIDB4MjQ0MjAwMDEsIDB4YWVlMjAyMTQsIDB4OGVlMjAyMTQsIAorMHgzYzAyMDMwMCwgMHgyMDIxMDI0LCAweDEwNDAwMDI3LCAweDNjMTEwNDAwLCAKKzB4YzAwNDI5YiwgMHgwLCAweDNjMDIwMTAwLCAweDIwMjEwMjQsIAorMHgxMDQwMDAwNywgMHgwLCAweDhlZTIwMjE4LCAweDI0NDIwMDAxLCAKKzB4YWVlMjAyMTgsIDB4OGVlMjAyMTgsIDB4ODAwNDBjNiwgMHgzYzAzZmRmZiwgCisweDhlZTIwMjFjLCAweDI0NDIwMDAxLCAweGFlZTIwMjFjLCAweDhlZTIwMjFjLCAKKzB4M2MwM2ZkZmYsIDB4MzQ2M2ZmZmYsIDB4M2MwODA4ZmYsIDB4MzUwOGZmZmYsIAorMHg4ZWUyMDAwMCwgMHgzYzA0MDAwMSwgMHgyNDg0NTlmYywgMHgzYzA1MDAwOCwgCisweDIwMDMwMjEsIDB4NDMxMDI0LCAweGFlZTIwMDAwLCAweDhmODIwMjIwLCAKKzB4MzgyMSwgMHgzYzAzMDMwMCwgMHg0ODEwMjQsIDB4NDMxMDI1LCAKKzB4YWY4MjAyMjAsIDB4YWZhMDAwMTAsIDB4YzAwMjQwMywgMHhhZmEwMDAxNCwgCisweDgwMDQyOTYsIDB4MCwgMHgyMTExMDI0LCAweDEwNDAwMDFmLCAKKzB4M2MwMjQwMDAsIDB4OGY4MzAyMjQsIDB4MjQwMjE0MDIsIDB4MTQ2MjAwMGIsIAorMHgzYzAzZmRmZiwgMHgzYzA0MDAwMSwgMHgyNDg0NWEwOCwgMHgzYzA1MDAwOCwgCisweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMjI0LCAweDM0YTVmZmZmLCAKKzB4YzAwMjQwMywgMHgzODIxLCAweDNjMDNmZGZmLCAweDhlZTIwMDAwLCAKKzB4MzQ2M2ZmZmYsIDB4MjAwMjAyMSwgMHg0MzEwMjQsIDB4YzAwNGU1NCwgCisweGFlZTIwMDAwLCAweDhlZTIwMjIwLCAweDI0NDIwMDAxLCAweGFlZTIwMjIwLCAKKzB4OGVlMjAyMjAsIDB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmYsIAorMHg0MzEwMjQsIDB4ODAwNDI5NSwgMHg1MTEwMjUsIDB4MjAyMTAyNCwgCisweDEwNDAwMTQyLCAweDAsIDB4OGVlMjAyMmMsIDB4MjQ0MjAwMDEsIAorMHhhZWUyMDIyYywgMHg4ZWUyMDIyYywgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgCisweDM0NjNmZmZmLCAweDQzMTAyNCwgMHgzNDQyMDAwNCwgMHhhZjgyMDIyMCwgCisweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDgwMDQxMGUsIDB4MjQ2MzAwMDIsIAorMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDMsIDB4MTQ0MGZmZmMsIAorMHgwLCAweDhmODYwMGUwLCAweDhmODQwMGU0LCAweDMwYzIwMDA3LCAKKzB4MTA0MDAwMTIsIDB4MCwgMHg4ZjgzMDBlNCwgMHgyNDAyZmZmOCwgCisweGMyMTAyNCwgMHgxMDQzMDAwZCwgMHgwLCAweDhmODIwMDU0LCAKKzB4OGY4MzAwZTAsIDB4MTRjMzAwMDksIDB4MjQ0NDAwNTAsIDB4OGY4MjAwNTQsIAorMHg4MjEwMjMsIDB4MmM0MjAwNTEsIDB4MTA0MDAwMDQsIDB4MCwgCisweDhmODIwMGUwLCAweDEwYzJmZmY5LCAweDAsIDB4OGY4MjAyMjAsIAorMHgzYzAzMDhmZiwgMHgzNDYzZmZmZCwgMHg0MzEwMjQsIDB4YWY4MjAyMjAsIAorMHg4Zjg2MDBlMCwgMHgzMGMyMDAwNywgMHgxMDQwMDAwMywgMHgyNDAyZmZmOCwgCisweGMyMzAyNCwgMHhhZjg2MDBlMCwgMHg4ZjgzMDBjNCwgMHgzYzAyMDAxZiwgCisweDM0NDJmZmZmLCAweDI0NjgwMDA4LCAweDQ4MTAyYiwgMHgxMDQwMDAwMywgCisweDNjMDJmZmY1LCAweDM0NDIxMDAwLCAweDEwMjQwMjEsIDB4OGY4YjAwYzgsIAorMHg4Zjg1MDEyMCwgMHg4Zjg0MDEyNCwgMHg4MDA0MTQ1LCAweDYwMjEsIAorMHgyNzYyMzgwMCwgMHg4MjEwMmIsIDB4NTA0MDAwMDEsIDB4Mjc2NDMwMDAsIAorMHgxMGE0MDAxMCwgMHgzMTgyMDBmZiwgMHg4YzgyMDAxOCwgMHgzODQzMDAwNywgCisweDJjNjMwMDAxLCAweDM4NDIwMDBiLCAweDJjNDIwMDAxLCAweDYyMTgyNSwgCisweDUwNjBmZmYzLCAweDI0ODQwMDIwLCAweDhlZTIwMjQwLCAweDI0MGMwMDAxLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAyNDAsIDB4OGVlMjAyNDAsIDB4OGM4YjAwMDgsIAorMHgzMTgyMDBmZiwgMHgxNDQwMDA2NSwgMHgwLCAweDNjMDIwMDAxLCAKKzB4NTcxMDIxLCAweDkwNDI4M2MwLCAweDE0NDAwMDYwLCAweDAsIAorMHg4Zjg0MDBlNCwgMHhjNDEwMjMsIDB4MjE4YzMsIDB4NDYyMDAwMSwgCisweDI0NjMwMjAwLCAweDhmODkwMGM0LCAweDEwNjAwMDA1LCAweDI0MDIwMDAxLCAKKzB4MTA2MjAwMDksIDB4MCwgMHg4MDA0MTg3LCAweDAsIAorMHg4ZWUyMDIzMCwgMHgxMjA1ODIxLCAweDI0NDIwMDAxLCAweGFlZTIwMjMwLCAKKzB4ODAwNDFiYywgMHg4ZWUyMDIzMCwgMHg4ZWUyMDIzNCwgMHgzYzA1MDAwYSwgCisweDI0NDIwMDAxLCAweGFlZTIwMjM0LCAweDhjOGIwMDAwLCAweDM0YTVmMDAwLCAKKzB4OGVlMjAyMzQsIDB4MTJiMTgyMywgMHhhMzEwMmIsIDB4NTQ0MDAwMDEsIAorMHg2NTE4MjEsIDB4MmM2MjIzM2YsIDB4MTQ0MDAwNDAsIDB4MCwgCisweDhmODIwMGU4LCAweDI0NDIwMDA4LCAweGFmODIwMGU4LCAweDhmODIwMGU4LCAKKzB4OGY4MjAwZTQsIDB4MTIwNTgyMSwgMHgyNDQyMDAwOCwgMHhhZjgyMDBlNCwgCisweDgwMDQxYmMsIDB4OGY4MjAwZTQsIDB4OGVlMjAyMzgsIDB4M2MwMzAwMGEsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDIzOCwgMHg4Yzg0MDAwMCwgMHgzNDYzZjAwMCwgCisweDhlZTIwMjM4LCAweDg4MzgyMywgMHg2NzEwMmIsIDB4NTQ0MDAwMDEsIAorMHhlMzM4MjEsIDB4M2MwMjAwMDMsIDB4MzQ0MjBkNDAsIDB4NDcxMDJiLCAKKzB4MTA0MDAwMDMsIDB4MCwgMHg4MDA0MWJjLCAweDgwNTgyMSwgCisweDhmODIwMGU0LCAweDI0NDQwMDA4LCAweGFmODQwMGU0LCAweDhmODQwMGU0LCAKKzB4MTA4NjAwMTgsIDB4M2MwNTAwMGEsIDB4MzRhNWYwMDAsIDB4M2MwYTAwMDMsIAorMHgzNTRhMGQ0MCwgMHg4ZWUyMDA3YywgMHgyNDQyMDAwMSwgMHhhZWUyMDA3YywgCisweDhjODMwMDAwLCAweDhlZTIwMDdjLCAweDY4MzgyMywgMHhhNzEwMmIsIAorMHg1NDQwMDAwMSwgMHhlNTM4MjEsIDB4MTQ3MTAyYiwgMHg1NDQwMDAwNywgCisweDYwNTgyMSwgMHg4ZjgyMDBlNCwgMHgyNDQ0MDAwOCwgMHhhZjg0MDBlNCwgCisweDhmODQwMGU0LCAweDE0ODZmZmVmLCAweDAsIDB4MTQ4NjAwMDUsIAorMHgwLCAweDEyMDU4MjEsIDB4YWY4NjAwZTQsIDB4ODAwNDFiYywgCisweGFmODYwMGU4LCAweGFmODQwMGU0LCAweGFmODQwMGU4LCAweDhmODIwMGM4LCAKKzB4M2MwMzAwMGEsIDB4MzQ2M2YwMDAsIDB4NDgzODIzLCAweDY3MTAyYiwgCisweDU0NDAwMDAxLCAweGUzMzgyMSwgMHgzYzAyMDAwMywgMHgzNDQyMGQzZiwgCisweDQ3MTAyYiwgMHg1NDQwMDAwNywgMHg2MDIxLCAweDE2ODM4MjMsIAorMHg2NzEwMmIsIDB4NTQ0MDAwMDMsIDB4ZTMzODIxLCAweDgwMDQxY2YsIAorMHgzYzAyMDAwMywgMHgzYzAyMDAwMywgMHgzNDQyMGQzZiwgMHg0NzEwMmIsIAorMHgxNDQwMDAxNiwgMHgzMTgyMDBmZiwgMHgxNDQwMDAwNiwgMHgwLCAKKzB4M2MwMjAwMDEsIDB4NTcxMDIxLCAweDkwNDI4M2MwLCAweDEwNDAwMDBmLCAKKzB4MCwgMHg4ZWUyMDIzYywgMHgzYzA0ZmRmZiwgMHg4ZWUzMDAwMCwgCisweDM0ODRmZmZmLCAweDI0NDIwMDAxLCAweGFlZTIwMjNjLCAweDhlZTIwMjNjLCAKKzB4MjQwMjAwMDEsIDB4NjQxODI0LCAweDNjMDEwMDAxLCAweDM3MDgyMSwgCisweGEwMjI4M2I4LCAweDgwMDQyMmMsIDB4YWVlMzAwMDAsIDB4YWY4YjAwYzgsIAorMHg4ZjgzMDBjOCwgMHg4ZjgyMDBjNCwgMHgzYzA0MDAwYSwgMHgzNDg0ZjAwMCwgCisweDYyMzgyMywgMHg4NzEwMmIsIDB4NTQ0MDAwMDEsIDB4ZTQzODIxLCAKKzB4M2MwMjAwMDMsIDB4MzQ0MjBkNDAsIDB4NDcxMDJiLCAweDJjZTMwMDAxLCAKKzB4NDMxMDI1LCAweDEwNDAwMDA4LCAweDAsIDB4OGY4MjAyMjAsIAorMHgzYzAzMDhmZiwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4M2MwMzQwMDAsIAorMHg0MzEwMjUsIDB4YWY4MjAyMjAsIDB4OGY4NjAwZTAsIDB4OGY4NDAwZTQsIAorMHgxMGM0MDAyYSwgMHgwLCAweDhlZTIwMDdjLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAwN2MsIDB4OGVlMjAwN2MsIDB4MjRjMmZmZjgsIDB4YWY4MjAwZTAsIAorMHgzYzAyMDAwMSwgMHg4YzQyN2UzMCwgMHgzYzAzMDAwOCwgMHg4Zjg2MDBlMCwgCisweDQzMTAyNCwgMHgxMDQwMDAxZCwgMHgwLCAweDEwYzQwMDFiLCAKKzB4MjQwZGZmZjgsIDB4M2MwYTAwMGEsIDB4MzU0YWYwMDAsIDB4M2MwYzAwODAsIAorMHgyNDg1MDAwOCwgMHgyNzYyMjgwMCwgMHg1MGEyMDAwMSwgMHgyNzY1MTgwMCwgCisweDhjODgwMDA0LCAweDhjODIwMDAwLCAweDhjYTkwMDAwLCAweDMxMDNmZmZmLCAKKzB4NDMxMDIxLCAweDRkMTAyNCwgMHgyNDQzMDAxMCwgMHg2YjEwMmIsIAorMHg1NDQwMDAwMSwgMHg2YTE4MjEsIDB4MTJiMTAyYiwgMHg1NDQwMDAwMSwgCisweDEyYTQ4MjEsIDB4MTA2OTAwMDIsIDB4MTBjMTAyNSwgMHhhYzgyMDAwNCwgCisweGEwMjAyMSwgMHgxNGM0ZmZlYiwgMHgyNDg1MDAwOCwgMHg4ZjgyMDIyMCwgCisweDNjMDMwOGZmLCAweDM0NjNmZmZmLCAweDQzMTAyNCwgMHgzNDQyMDAwMiwgCisweGFmODIwMjIwLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDgwMDQyMzcsIAorMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDIsIAorMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMjIwLCAweDNjMDMwOGZmLCAKKzB4MzQ2M2ZmZmIsIDB4NDMxMDI0LCAweGFmODIwMjIwLCAweDYwMTAwNTUsIAorMHgwLCAweDhlZTIwMjI4LCAweDI0NDIwMDAxLCAweGFlZTIwMjI4LCAKKzB4OGVlMjAyMjgsIDB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmYsIAorMHg0MzEwMjQsIDB4MzQ0MjAwMDQsIDB4YWY4MjAyMjAsIDB4OGY4MzAwNTQsIAorMHg4ZjgyMDA1NCwgMHg4MDA0MjUxLCAweDI0NjMwMDAyLCAweDhmODIwMDU0LCAKKzB4NjIxMDIzLCAweDJjNDIwMDAzLCAweDE0NDBmZmZjLCAweDAsIAorMHg4Zjg2MDBlMCwgMHgzMGMyMDAwNywgMHgxMDQwMDAxMiwgMHgwLCAKKzB4OGY4MzAwZTQsIDB4MjQwMmZmZjgsIDB4YzIxMDI0LCAweDEwNDMwMDBkLCAKKzB4MCwgMHg4ZjgyMDA1NCwgMHg4ZjgzMDBlMCwgMHgxNGMzMDAwOSwgCisweDI0NDQwMDMyLCAweDhmODIwMDU0LCAweDgyMTAyMywgMHgyYzQyMDAzMywgCisweDEwNDAwMDA0LCAweDAsIDB4OGY4MjAwZTAsIDB4MTBjMmZmZjksIAorMHgwLCAweDhmODIwMjIwLCAweDNjMDMwOGZmLCAweDM0NjNmZmZkLCAKKzB4NDMxMDI0LCAweGFmODIwMjIwLCAweDhmODYwMGUwLCAweDMwYzIwMDA3LCAKKzB4MTA0MDAwMDMsIDB4MjQwMmZmZjgsIDB4YzIzMDI0LCAweGFmODYwMGUwLCAKKzB4MjQwMzAxZjUsIDB4OGY4MjAwZTgsIDB4NjczODIzLCAweDcxOGMwLCAKKzB4NDMxMDIxLCAweGFmODIwMGU4LCAweDhmODIwMGU4LCAweGFmODIwMGU0LCAKKzB4OGVlMjAwN2MsIDB4M2MwNDA4ZmYsIDB4MzQ4NGZmZmYsIDB4NDcxMDIxLCAKKzB4YWVlMjAwN2MsIDB4OGY4MjAyMjAsIDB4M2MwMzgwMDAsIDB4MzQ2MzAwMDIsIAorMHg0NDEwMjQsIDB4NDMxMDI1LCAweGFmODIwMjIwLCAweDhmODMwMDU0LCAKKzB4OGY4MjAwNTQsIDB4ODAwNDI4ZCwgMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgCisweDYyMTAyMywgMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgMHgwLCAKKzB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmIsIDB4NDMxMDI0LCAKKzB4YWY4MjAyMjAsIDB4OGZiZjAwMjAsIDB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsIAorMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDNjMDIwMDAxLCAweDhjNDI1Y2Q4LCAKKzB4MjdiZGZmZDgsIDB4MTA0MDAwMTIsIDB4YWZiZjAwMjAsIDB4M2MwNDAwMDEsIAorMHgyNDg0NWExNCwgMHgzYzA1MDAwOCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgCisweDM3MDgyMSwgMHhhYzIyODNhYywgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgCisweDhmODYwMjIwLCAweDM0YTUwNDk4LCAweDNjMDEwMDAxLCAweGFjMjA1Y2Q4LCAKKzB4M2MwMTAwMDEsIDB4YWMyMjVjY2MsIDB4YzAwMjQwMywgMHgzODIxLCAKKzB4OGY0MjAyNjgsIDB4M2MwMzdmZmYsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAKKzB4YWY0MjAyNjgsIDB4OGVlMjA0ZDAsIDB4OGVlNDA0ZDQsIDB4MjQwM2ZmZmUsIAorMHg0MzEwMjQsIDB4MzA4NDAwMDIsIDB4MTA4MDAxMWUsIDB4YWVlMjA0ZDAsIAorMHg4ZWUyMDRkNCwgMHgyNDAzZmZmZCwgMHg0MzEwMjQsIDB4YWVlMjA0ZDQsIAorMHg4ZjgyMDA0NCwgMHgzYzAzMDYwMCwgMHgzNDYzMjAwMCwgMHgzNDQyMDAyMCwgCisweGFmODIwMDQ0LCAweGFmYTMwMDE4LCAweDhlZTIwNjA4LCAweDhmNDMwMjI4LCAKKzB4MjQ0MjAwMDEsIDB4MzA0YTAwZmYsIDB4NTE0MzAwZmUsIDB4YWZhMDAwMTAsIAorMHg4ZWUyMDYwOCwgMHgyMTBjMCwgMHg1NzEwMjEsIDB4OGZhMzAwMTgsIAorMHg4ZmE0MDAxYywgMHhhYzQzMDYwYywgMHhhYzQ0MDYxMCwgMHg4ZjgzMDA1NCwgCisweDhmODIwMDU0LCAweDI0NjkwMDMyLCAweDEyMjEwMjMsIDB4MmM0MjAwMzMsIAorMHgxMDQwMDA2YSwgMHg1ODIxLCAweDI0MTgwMDA4LCAweDI0MGYwMDBkLCAKKzB4MjQwZDAwMDcsIDB4MjQwYzAwNDAsIDB4MjQwZTAwMDEsIDB4OGY4NzAxMjAsIAorMHgyNzYyMzgwMCwgMHgyNGU4MDAyMCwgMHgxMDIxMDJiLCAweDUwNDAwMDAxLCAKKzB4Mjc2ODMwMDAsIDB4OGY4MjAxMjgsIDB4MTEwMjAwMDQsIDB4MCwgCisweDhmODIwMTI0LCAweDE1MDIwMDA3LCAweDEwMjEsIDB4OGVlMjAxYTQsIAorMHgyODIxLCAweDI0NDIwMDAxLCAweGFlZTIwMWE0LCAweDgwMDQzM2QsIAorMHg4ZWUyMDFhNCwgMHg4ZWU0MDYwOCwgMHg0MjBjMCwgMHg4MDE4MjEsIAorMHg4ZWU0MDQzMCwgMHg4ZWU1MDQzNCwgMHhhMzI4MjEsIDB4YTMzMDJiLCAKKzB4ODIyMDIxLCAweDg2MjAyMSwgMHhhY2U0MDAwMCwgMHhhY2U1MDAwNCwgCisweDhlZTIwNjA4LCAweGE0ZjgwMDBlLCAweGFjZWYwMDE4LCAweGFjZWEwMDFjLCAKKzB4MjEwYzAsIDB4MjQ0MjA2MGMsIDB4MmUyMTAyMSwgMHhhY2UyMDAwOCwgCisweDhlZTIwNGM0LCAweGFjZTIwMDEwLCAweGFmODgwMTIwLCAweDkyZTI0ZTIwLCAKKzB4MTQ0MDAwMzMsIDB4MjQwNTAwMDEsIDB4OGVlMjRlMzAsIDB4MjEwYzAsIAorMHgyNDQyNTAzOCwgMHgyZTIyMDIxLCAweDhjODIwMDAwLCAweDE0NGQwMDFmLCAKKzB4MCwgMHg4ZWUzNGUzMCwgMHg4ZWUyNGUzNCwgMHgxMDYyMDAxYiwgCisweDAsIDB4OGM4MjAwMDQsIDB4MjQ0MjAwMDEsIDB4YWM4MjAwMDQsIAorMHg4ZWUyNGUzNCwgMHg4ZWUzNGUzMCwgMHgyNDQyMDAwMSwgMHgxMDRjMDAwNywgCisweDAsIDB4OGVlMjRlMzQsIDB4MjQ0MjAwMDEsIDB4MTA2MjAwMDUsIAorMHgwLCAweDgwMDQzMmEsIDB4MCwgMHgxNDYwMDAwNSwgCisweDAsIDB4OGY4MjAxMjgsIDB4MjQ0MjAwMjAsIDB4YWY4MjAxMjgsIAorMHg4ZjgyMDEyOCwgMHg4YzgyMDAwNCwgMHgyYzQyMDAxMSwgMHg1MDQwMDAxMCwgCisweGFjODAwMDAwLCAweDgwMDQzM2QsIDB4MCwgMHg4ZWUyNGUzMCwgCisweDI0NDIwMDAxLCAweDUwNGMwMDAzLCAweDEwMjEsIDB4OGVlMjRlMzAsIAorMHgyNDQyMDAwMSwgMHhhZWUyNGUzMCwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4YWM4ZDAwMDAsIDB4YWM4ZTAwMDQsIAorMHg1NGEwMDAwNiwgMHgyNDBiMDAwMSwgMHg4ZjgyMDA1NCwgMHgxMjIxMDIzLCAKKzB4MmM0MjAwMzMsIDB4MTQ0MGZmOWQsIDB4MCwgMHgzMTYzMDBmZiwgCisweDI0MDIwMDAxLCAweDU0NjIwMDc5LCAweGFmYTAwMDEwLCAweGFlZWEwNjA4LCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ2OTAwMzIsIDB4MTIyMTAyMywgCisweDJjNDIwMDMzLCAweDEwNDAwMDYxLCAweDU4MjEsIDB4MjQwZDAwMDgsIAorMHgyNDBjMDAxMSwgMHgyNDA4MDAxMiwgMHgyNDA3MDA0MCwgMHgyNDBhMDAwMSwgCisweDhmODMwMTIwLCAweDI3NjIzODAwLCAweDI0NjYwMDIwLCAweGMyMTAyYiwgCisweDUwNDAwMDAxLCAweDI3NjYzMDAwLCAweDhmODIwMTI4LCAweDEwYzIwMDA0LCAKKzB4MCwgMHg4ZjgyMDEyNCwgMHgxNGMyMDAwNywgMHgwLCAKKzB4OGVlMjAxYTQsIDB4MjgyMSwgMHgyNDQyMDAwMSwgMHhhZWUyMDFhNCwgCisweDgwMDQzYTksIDB4OGVlMjAxYTQsIDB4OGVlMjA2MDgsIDB4YWM2MjAwMWMsIAorMHg4ZWU0MDRhMCwgMHg4ZWU1MDRhNCwgMHgyNDYyMDAxYywgMHhhYzYyMDAwOCwgCisweGE0NmQwMDBlLCAweGFjNmMwMDE4LCAweGFjNjQwMDAwLCAweGFjNjUwMDA0LCAKKzB4OGVlMjA0YzQsIDB4YWM2MjAwMTAsIDB4YWY4NjAxMjAsIDB4OTJlMjRlMjAsIAorMHgxNDQwMDAzMywgMHgyNDA1MDAwMSwgMHg4ZWUyNGUzMCwgMHgyMTBjMCwgCisweDI0NDI1MDM4LCAweDJlMjIwMjEsIDB4OGM4MjAwMDAsIDB4MTQ0ODAwMWYsIAorMHgwLCAweDhlZTM0ZTMwLCAweDhlZTI0ZTM0LCAweDEwNjIwMDFiLCAKKzB4MCwgMHg4YzgyMDAwNCwgMHgyNDQyMDAwMSwgMHhhYzgyMDAwNCwgCisweDhlZTI0ZTM0LCAweDhlZTM0ZTMwLCAweDI0NDIwMDAxLCAweDEwNDcwMDA3LCAKKzB4MCwgMHg4ZWUyNGUzNCwgMHgyNDQyMDAwMSwgMHgxMDYyMDAwNSwgCisweDAsIDB4ODAwNDM5NiwgMHgwLCAweDE0NjAwMDA1LCAKKzB4MCwgMHg4ZjgyMDEyOCwgMHgyNDQyMDAyMCwgMHhhZjgyMDEyOCwgCisweDhmODIwMTI4LCAweDhjODIwMDA0LCAweDJjNDIwMDExLCAweDUwNDAwMDEwLCAKKzB4YWM4MDAwMDAsIDB4ODAwNDNhOSwgMHgwLCAweDhlZTI0ZTMwLCAKKzB4MjQ0MjAwMDEsIDB4NTA0NzAwMDMsIDB4MTAyMSwgMHg4ZWUyNGUzMCwgCisweDI0NDIwMDAxLCAweGFlZTI0ZTMwLCAweDhlZTI0ZTMwLCAweDIxMGMwLCAKKzB4MjQ0MjUwMzgsIDB4MmUyMjAyMSwgMHhhYzg4MDAwMCwgMHhhYzhhMDAwNCwgCisweDU0YTAwMDA2LCAweDI0MGIwMDAxLCAweDhmODIwMDU0LCAweDEyMjEwMjMsIAorMHgyYzQyMDAzMywgMHgxNDQwZmZhNiwgMHgwLCAweDMxNjMwMGZmLCAKKzB4MjQwMjAwMDEsIDB4NTQ2MjAwMDMsIDB4YWZhMDAwMTAsIDB4ODAwNDNkNiwgCisweDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVhMjAsIDB4YWZhMDAwMTQsIAorMHg4Zjg2MDEyMCwgMHg4Zjg3MDEyNCwgMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAKKzB4MzRhNWYwMTEsIDB4ODAwNDNkNiwgMHgwLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDVhMmMsIDB4YWZhMDAwMTQsIDB4OGY4NjAxMjAsIDB4OGY4NzAxMjQsIAorMHgzYzA1MDAwOSwgMHhjMDAyNDAzLCAweDM0YTVmMDEwLCAweDgwMDQzZDYsIAorMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ1YTM4LCAweGFmYTAwMDE0LCAKKzB4OGVlNjA2MDgsIDB4OGY0NzAyMjgsIDB4M2MwNTAwMDksIDB4YzAwMjQwMywgCisweDM0YTVmMDBmLCAweDhlZTIwMWFjLCAweDI0NDIwMDAxLCAweGFlZTIwMWFjLCAKKzB4OGVlMjAxYWMsIDB4OGVlMjAxNWMsIDB4MjQ0MjAwMDEsIDB4YWVlMjAxNWMsIAorMHg4ZWUyMDE1YywgMHg4ZmJmMDAyMCwgMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAKKzB4M2MwMjAwMDEsIDB4OGM0MjVjZDgsIDB4MjdiZGZmZTAsIDB4MTQ0MDAwMGQsIAorMHhhZmJmMDAxOCwgMHgzYzA0MDAwMSwgMHgyNDg0NWE0NCwgMHgzYzA1MDAwOCwgCisweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMjIwLCAweDM0YTUwNDk5LCAKKzB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjVjZDgsIDB4YzAwMjQwMywgCisweDM4MjEsIDB4OGVlMjA0ZDAsIDB4M2MwMzAwMDEsIDB4NzcxODIxLCAKKzB4OTQ2MzgzYjIsIDB4MzQ0MjAwMDEsIDB4MTA2MDAwMDcsIDB4YWVlMjA0ZDAsIAorMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsIAorMHgzNDQyMDAwOCwgMHhhZjgyMDIyMCwgMHgyMDIxLCAweGMwMDUyYTIsIAorMHgyNDA1MDAwNCwgMHhhZjQyMDI2OCwgMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LCAKKzB4MjdiZDAwMjAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDNjMTIwMDAxLCAKKzB4MjY1MjEyMDAsIDB4M2MxNDAwMDEsIDB4OGU5NDVjNTAsIDB4M2MxMDAwMDEsIAorMHgyNjEwMTEyMCwgMHgzYzE1YzAwMCwgMHgzNmI1MDA2MCwgMHg4ZThhMDAwMCwgCisweDhlYjMwMDAwLCAweDI2YTQwMGIsIDB4MjQ4MDAwYSwgMHgyMDBmODIxLCAKKzB4MCwgMHhkLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4ODAwMTRkNiwgCisweDAsIDB4ODAwMTRkOCwgMHgzYzBhMDAwMSwgMHg4MDAxNGQ4LCAKKzB4M2MwYTAwMDIsIDB4ODAwMTRkOCwgMHgwLCAweDgwMDI0YTYsIAorMHgwLCAweDgwMDE0ZDgsIDB4M2MwYTAwMDMsIDB4ODAwMTRkOCwgCisweDNjMGEwMDA0LCAweDgwMDJmOGMsIDB4MCwgMHg4MDAxNGQ4LCAKKzB4M2MwYTAwMDUsIDB4ODAwM2NlOCwgMHgwLCAweDgwMDNjNjYsIAorMHgwLCAweDgwMDE0ZDgsIDB4M2MwYTAwMDYsIDB4ODAwMTRkOCwgCisweDNjMGEwMDA3LCAweDgwMDE0ZDgsIDB4MCwgMHg4MDAxNGQ4LCAKKzB4MCwgMHg4MDAxNGQ4LCAweDAsIDB4ODAwMmE3NSwgCisweDAsIDB4ODAwMTRkOCwgMHgzYzBhMDAwYiwgMHg4MDAxNGQ4LCAKKzB4M2MwYTAwMGMsIDB4ODAwMTRkOCwgMHgzYzBhMDAwZCwgMHg4MDAyMzdhLCAKKzB4MCwgMHg4MDAyMzM5LCAweDAsIDB4ODAwMTRkOCwgCisweDNjMGEwMDBlLCAweDgwMDFiM2MsIDB4MCwgMHg4MDAyNGE0LCAKKzB4MCwgMHg4MDAxNGQ4LCAweDNjMGEwMDBmLCAweDgwMDQwYTcsIAorMHgwLCAweDgwMDQwOTEsIDB4MCwgMHg4MDAxNGQ4LCAKKzB4M2MwYTAwMTAsIDB4ODAwMTRlZSwgMHgwLCAweDgwMDE0ZDgsIAorMHgzYzBhMDAxMSwgMHg4MDAxNGQ4LCAweDNjMGEwMDEyLCAweDgwMDE0ZDgsIAorMHgzYzBhMDAxMywgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4M2MwMzAwMDEsIAorMHgzNDYzMzgwMCwgMHgyNDA1MDA4MCwgMHgyNDA0MDAxZiwgMHgyNDA2ZmZmZiwgCisweDI0MDIwMDAxLCAweGFmODAwMjFjLCAweGFmODIwMjAwLCAweGFmODIwMjIwLCAKKzB4MzYzMTAyMSwgMHhhZjgyMDBjMCwgMHgzNjMxMDIxLCAweGFmODIwMGM0LCAKKzB4MzYzMTAyMSwgMHhhZjgyMDBjOCwgMHgyNzYyMzgwMCwgMHhhZjgyMDBkMCwgCisweDI3NjIzODAwLCAweGFmODIwMGQ0LCAweDI3NjIzODAwLCAweGFmODIwMGQ4LCAKKzB4Mjc2MjE4MDAsIDB4YWY4MjAwZTAsIDB4Mjc2MjE4MDAsIDB4YWY4MjAwZTQsIAorMHgyNzYyMTgwMCwgMHhhZjgyMDBlOCwgMHgyNzYyMTAwMCwgMHhhZjgyMDBmMCwgCisweDI3NjIxMDAwLCAweGFmODIwMGY0LCAweDI3NjIxMDAwLCAweGFmODIwMGY4LCAKKzB4YWNhMDAwMDAsIDB4MjQ4NGZmZmYsIDB4MTQ4NmZmZmQsIDB4MjRhNTAwMDQsIAorMHg4ZjgzMDA0MCwgMHgzYzAyZjAwMCwgMHg2MjE4MjQsIDB4M2MwMjUwMDAsIAorMHgxMDYyMDAwYywgMHg0MzEwMmIsIDB4MTQ0MDAwMDYsIDB4M2MwMjYwMDAsIAorMHgzYzAyNDAwMCwgMHgxMDYyMDAwOCwgMHgyNDAyMDgwMCwgMHg4MDA0NTM5LCAKKzB4MCwgMHgxMDYyMDAwNCwgMHgyNDAyMDgwMCwgMHg4MDA0NTM5LCAKKzB4MCwgMHgyNDAyMDcwMCwgMHgzYzAxMDAwMSwgMHhhYzIyNWNkYywgCisweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZkOCwgMHhhZmJmMDAyNCwgCisweGFmYjAwMDIwLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDNjMDEwMDAxLCAKKzB4YWMyMDVjYzQsIDB4ODAwNDU0NSwgMHgyNDYzMDA2NCwgMHg4ZjgyMDA1NCwgCisweDYyMTAyMywgMHgyYzQyMDA2NSwgMHgxNDQwZmZmYywgMHgwLCAKKzB4YzAwNGQ3MSwgMHgwLCAweDI0MDQwMDAxLCAweDI4MjEsIAorMHgyN2E2MDAxOCwgMHgzNDAyODAwMCwgMHhjMDA0OThlLCAweGE3YTIwMDE4LCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4ODAwNDU1NiwgMHgyNDYzMDA2NCwgCisweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDA2NSwgMHgxNDQwZmZmYywgCisweDI0MDQwMDAxLCAweDI0MDUwMDAxLCAweGMwMDQ5NGMsIDB4MjdhNjAwMTgsIAorMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHg4MDA0NTYyLCAweDI0NjMwMDY0LCAKKzB4OGY4MjAwNTQsIDB4NjIxMDIzLCAweDJjNDIwMDY1LCAweDE0NDBmZmZjLCAKKzB4MjQwNDAwMDEsIDB4MjQwNTAwMDEsIDB4YzAwNDk0YywgMHgyN2E2MDAxOCwgCisweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDgwMDQ1NmUsIDB4MjQ2MzAwNjQsIAorMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwNjUsIDB4MTQ0MGZmZmMsIAorMHgyNDA0MDAwMSwgMHgzYzA2MDAwMSwgMHgyNGM2NWRhMCwgMHhjMDA0OTRjLCAKKzB4MjQwNTAwMDIsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4ODAwNDU3YiwgCisweDI0NjMwMDY0LCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDA2NSwgCisweDE0NDBmZmZjLCAweDI0MDQwMDAxLCAweDI0MDUwMDAzLCAweDNjMTAwMDAxLCAKKzB4MjYxMDVkYTIsIDB4YzAwNDk0YywgMHgyMDAzMDIxLCAweDk3YTYwMDE4LCAKKzB4M2MwNzAwMDEsIDB4OTRlNzVkYTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVhYjAsIAorMHhhZmEwMDAxNCwgMHg5NjAyMDAwMCwgMHgzYzA1MDAwZCwgMHgzNGE1MDEwMCwgCisweGMwMDI0MDMsIDB4YWZhMjAwMTAsIDB4OTdhMjAwMTgsIDB4MTA0MDAwNGMsIAorMHgyNDAzNjA0MCwgMHg5NjAyMDAwMCwgMHgzMDQyZmZmMCwgMHgxNDQzMDAwYSwgCisweDI0MDIwMDIwLCAweDNjMDMwMDAxLCAweDk0NjM1ZGEwLCAweDU0NjIwMDA5LCAKKzB4MjQwMjc4MzAsIDB4MjQwMjAwMDMsIDB4M2MwMTAwMDEsIDB4YWMyMjVjYzQsIAorMHg4MDA0NWFjLCAweDI0MDIwMDA1LCAweDNjMDMwMDAxLCAweDk0NjM1ZGEwLCAKKzB4MjQwMjc4MzAsIDB4MTQ2MjAwMGYsIDB4MjQwMzAwMTAsIDB4M2MwMjAwMDEsIAorMHg5NDQyNWRhMiwgMHgzMDQyZmZmMCwgMHgxNDQzMDAwYSwgMHgyNDAyMDAwMywgCisweDNjMDEwMDAxLCAweGFjMjI1Y2M0LCAweDI0MDIwMDA2LCAweDNjMDEwMDAxLCAKKzB4YWMyMjVkYjAsIDB4M2MwMTAwMDEsIDB4YWMyMjVkYmMsIDB4ODAwNDVlNiwgCisweDNjMDlmZmYwLCAweDNjMDIwMDAxLCAweDhjNDI1Y2M0LCAweDNjMDMwMDAxLCAKKzB4OTQ2MzVkYTAsIDB4MzQ0MjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjVjYzQsIAorMHgyNDAyMDAxNSwgMHgxNDYyMDAwZiwgMHgwLCAweDNjMDIwMDAxLCAKKzB4OTQ0MjVkYTIsIDB4MzA0MmZmZjAsIDB4Mzg0M2Y0MjAsIDB4MmM2MzAwMDEsIAorMHgzODQyZjQzMCwgMHgyYzQyMDAwMSwgMHg2MjE4MjUsIDB4MTA2MDAwMDUsIAorMHgyNDAyMDAwMywgMHgzYzAxMDAwMSwgMHhhYzIyNWRiYywgMHg4MDA0NWU2LCAKKzB4M2MwOWZmZjAsIDB4M2MwMzAwMDEsIDB4OTQ2MzVkYTAsIDB4MjQwMjc4MTAsIAorMHgxNDYyMDAwYiwgMHgyNDAyMDAwMiwgMHgzYzAyMDAwMSwgMHg5NDQyNWRhMiwgCisweDMwNDJmZmYwLCAweDE0NDAwMDA2LCAweDI0MDIwMDAyLCAweDI0MDIwMDA0LCAKKzB4M2MwMTAwMDEsIDB4YWMyMjVkYmMsIDB4ODAwNDVlNiwgMHgzYzA5ZmZmMCwgCisweDNjMDEwMDAxLCAweGFjMjI1ZGJjLCAweDgwMDQ1ZTYsIDB4M2MwOWZmZjAsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWNjNCwgMHgyNDAzMDAwMSwgMHgzYzAxMDAwMSwgCisweGFjMjM1ZGJjLCAweDM0NDIwMDA0LCAweDNjMDEwMDAxLCAweGFjMjI1Y2M0LCAKKzB4M2MwOWZmZjAsIDB4MzUyOWJkYzAsIDB4M2MwNjAwMDEsIDB4OGNjNjVjYzQsIAorMHgzYzA0MDAwMSwgMHgyNDg0NWFiMCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgCisweGFjMjI1Y2NjLCAweDhmODIwMDU0LCAweDNjMDcwMDAxLCAweDhjZTc1ZGJjLCAKKzB4M2MwMzAwMDEsIDB4OTQ2MzVkYTAsIDB4M2MwODAwMDEsIDB4OTUwODVkYTIsIAorMHgzYzA1MDAwZCwgMHgzNGE1MDEwMCwgMHgzYzAxMDAwMSwgMHhhYzIwNWNjOCwgCisweDQ5MTAyMSwgMHgzYzAxMDAwMSwgMHhhYzIyNWRhYywgMHhhZmEzMDAxMCwgCisweGMwMDI0MDMsIDB4YWZhODAwMTQsIDB4OGZiZjAwMjQsIDB4OGZiMDAwMjAsIAorMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDI3YmRmZmU4LCAweDNjMDUwMDAxLCAKKzB4OGNhNTVjYzgsIDB4MjQwNjAwMDQsIDB4MjQwMjAwMDEsIDB4MTRhMjAwMTQsIAorMHhhZmJmMDAxMCwgMHgzYzAyMDAwMSwgMHg4YzQyN2UzYywgMHgzMDQyODAwMCwgCisweDEwNDAwMDA1LCAweDNjMDQwMDBmLCAweDNjMDMwMDAxLCAweDhjNjM1ZGJjLCAKKzB4ODAwNDYxNywgMHgzNDg0NDI0MCwgMHgzYzA0MDAwNCwgMHgzYzAzMDAwMSwgCisweDhjNjM1ZGJjLCAweDM0ODQ5M2UwLCAweDI0MDIwMDA1LCAweDE0NjIwMDE2LCAKKzB4MCwgMHgzYzA0MDAzZCwgMHg4MDA0NjJmLCAweDM0ODQwOTAwLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjdlMzgsIDB4MzA0MjgwMDAsIDB4MTA0MDAwMDUsIAorMHgzYzA0MDAxZSwgMHgzYzAzMDAwMSwgMHg4YzYzNWRiYywgMHg4MDA0NjJhLCAKKzB4MzQ4NDg0ODAsIDB4M2MwNDAwMGYsIDB4M2MwMzAwMDEsIDB4OGM2MzVkYmMsIAorMHgzNDg0NDI0MCwgMHgyNDAyMDAwNSwgMHgxNDYyMDAwMywgMHgwLCAKKzB4M2MwNDAwN2EsIDB4MzQ4NDEyMDAsIDB4M2MwMjAwMDEsIDB4OGM0MjVkYWMsIAorMHg4ZjgzMDA1NCwgMHg0NDEwMjEsIDB4NDMxMDIzLCAweDQ0MTAyYiwgCisweDE0NDAwMDM3LCAweDAsIDB4M2MwMjAwMDEsIDB4OGM0MjVjZDAsIAorMHgxNDQwMDAzMywgMHgwLCAweDNjMDEwMDAxLCAweDEwYzAwMDI1LCAKKzB4YWMyMDVjZTAsIDB4M2MwOTAwMDEsIDB4OGQyOTVjYzQsIDB4MjQwNzAwMDEsIAorMHgzYzA0NDAwMCwgMHgzYzA4MDAwMSwgMHgyNTA4N2UzYywgMHgyNTBhZmZmYywgCisweDUyODQyLCAweDE0YTAwMDAyLCAweDI0YzZmZmZmLCAweDI0MDUwMDA4LCAKKzB4YTkxMDI0LCAweDEwNDAwMDEwLCAweDAsIDB4MTRhNzAwMDgsIAorMHgwLCAweDhkMDIwMDAwLCAweDQ0MTAyNCwgMHgxMDQwMDAwYSwgCisweDAsIDB4M2MwMTAwMDEsIDB4ODAwNDY1YiwgMHhhYzI1NWNlMCwgCisweDhkNDIwMDAwLCAweDQ0MTAyNCwgMHgxMDQwMDAwMywgMHgwLCAKKzB4M2MwMTAwMDEsIDB4YWMyNzVjZTAsIDB4M2MwMjAwMDEsIDB4OGM0MjVjZTAsIAorMHg2MTgyYiwgMHgyYzQyMDAwMSwgMHg0MzEwMjQsIDB4NTQ0MGZmZTUsIAorMHg1Mjg0MiwgMHg4ZjgyMDA1NCwgMHgzYzAzMDAwMSwgMHg4YzYzNWNlMCwgCisweDNjMDEwMDAxLCAweGFjMjI1ZGFjLCAweDEwNjAwMDJhLCAweDI0MDIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4YWMyNTVjYzgsIDB4M2MwMTAwMDEsIDB4YWMyMjVjY2MsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWNlMCwgMHgxMDQwMDAyMiwgMHgwLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjVjY2MsIDB4MTA0MDAwMGEsIDB4MjQwMjAwMDEsIAorMHgzYzAxMDAwMSwgMHhhYzIwNWNjYywgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHhhYzIyODNhYywgMHgzYzAxMDAwMSwgMHhhYzIwNWQ0YywgMHgzYzAxMDAwMSwgCisweGFjMjI1ZDA0LCAweDNjMDMwMDAxLCAweDc3MTgyMSwgMHg4YzYzODNhYywgCisweDI0MDIwMDA4LCAweDEwNjIwMDA1LCAweDI0MDIwMDAxLCAweGMwMDQ2OTUsIAorMHgwLCAweDgwMDQ2OTIsIDB4MCwgMHgzYzAzMDAwMSwgCisweDhjNjM1Y2M4LCAweDEwNjIwMDA3LCAweDI0MDIwMDBlLCAweDNjMDMwMDAxLCAKKzB4OGM2MzdkZDAsIDB4MTA2MjAwMDMsIDB4MCwgMHhjMDA0ZTU0LCAKKzB4OGY4NDAyMjAsIDB4OGZiZjAwMTAsIDB4M2UwMDAwOCwgMHgyN2JkMDAxOCwgCisweDI3YmRmZmUwLCAweDNjMDJmZGZmLCAweGFmYmYwMDE4LCAweDhlZTMwMDAwLCAKKzB4M2MwNTAwMDEsIDB4OGNhNTVjYzgsIDB4M2MwNDAwMDEsIDB4OGM4NDVjZjAsIAorMHgzNDQyZmZmZiwgMHg2MjE4MjQsIDB4MTRhNDAwMDgsIDB4YWVlMzAwMDAsIAorMHgzYzAzMDAwMSwgMHg3NzE4MjEsIDB4OGM2MzgzYWMsIDB4M2MwMjAwMDEsIAorMHg4YzQyNWNmNCwgMHgxMDYyMDAwOCwgMHgwLCAweDNjMDIwMDAxLCAKKzB4NTcxMDIxLCAweDhjNDI4M2FjLCAweDNjMDEwMDAxLCAweGFjMjU1Y2YwLCAKKzB4M2MwMTAwMDEsIDB4YWMyMjVjZjQsIDB4M2MwMzAwMDEsIDB4OGM2MzVjYzgsIAorMHgyNDAyMDAwMiwgMHgxMDYyMDE2OSwgMHgyYzYyMDAwMywgMHgxMDQwMDAwNSwgCisweDI0MDIwMDAxLCAweDEwNjIwMDA4LCAweDAsIDB4ODAwNDgxYywgCisweDAsIDB4MjQwMjAwMDQsIDB4MTA2MjAwYjEsIDB4MjQwMjAwMDEsIAorMHg4MDA0ODFkLCAweDAsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAKKzB4OGM0MjgzYWMsIDB4MjQ0M2ZmZmYsIDB4MmM2MjAwMDgsIDB4MTA0MDAxNWEsIAorMHgzMTA4MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjVhYzgsIAorMHg0MDAwMDgsIDB4MCwgMHgzYzAzMDAwMSwgMHg4YzYzNWRiYywgCisweDI0MDIwMDA1LCAweDE0NjIwMDE0LCAweDAsIDB4M2MwMjAwMDEsIAorMHg4YzQyNWNkNCwgMHgxMDQwMDAwYSwgMHgyNDAyMDAwMywgMHhjMDA0ODIyLCAKKzB4MCwgMHgyNDAyMDAwMiwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHhhYzIyODNhYywgMHgzYzAxMDAwMSwgMHg4MDA0NmUwLCAweGFjMjA1Y2Q0LCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI4M2FjLCAweDNjMDEwMDAxLCAKKzB4ODAwNDgxZiwgMHhhYzIwNWM2MCwgMHhjMDA0ODIyLCAweDAsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWNkNCwgMHgzYzAxMDAwMSwgMHhhYzIwNWM2MCwgCisweDEwNDAwMGRkLCAweDI0MDIwMDAyLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgCisweGFjMjI4M2FjLCAweDNjMDEwMDAxLCAweDgwMDQ4MWYsIDB4YWMyMDVjZDQsIAorMHgzYzAzMDAwMSwgMHg4YzYzNWRiYywgMHgyNDAyMDAwNSwgMHgxNDYyMDAwMywgCisweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI1ZDAwLCAweGMwMDQ5Y2YsIAorMHgwLCAweDNjMDMwMDAxLCAweDhjNjM1ZDAwLCAweDgwMDQ3OGUsIAorMHgyNDAyMDAxMSwgMHgzYzA1MDAwMSwgMHg4Y2E1NWNjOCwgMHgzYzA2MDAwMSwgCisweDhjYzY3ZTNjLCAweGMwMDUxMDgsIDB4MjAyMSwgMHgyNDAyMDAwNSwgCisweDNjMDEwMDAxLCAweGFjMjA1Y2Q0LCAweDNjMDEwMDAxLCAweDM3MDgyMSwgCisweDgwMDQ4MWYsIDB4YWMyMjgzYWMsIDB4M2MwNDAwMDEsIDB4MjQ4NDVhYmMsIAorMHgzYzA1MDAwZiwgMHgzNGE1MDEwMCwgMHgzMDIxLCAweDM4MjEsIAorMHhhZmEwMDAxMCwgMHhjMDAyNDAzLCAweGFmYTAwMDE0LCAweDgwMDQ4MWYsIAorMHgwLCAweDhmODIwMjIwLCAweDNjMDNmNzAwLCAweDQzMTAyNSwgCisweDgwMDQ3YjcsIDB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsIDB4M2MwMzAwMDQsIAorMHg0MzEwMjQsIDB4MTQ0MDAwYTksIDB4MjQwMjAwMDcsIDB4OGY4MzAwNTQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWRhNCwgMHgyNDYzZDhmMCwgMHg0MzEwMjMsIAorMHgyYzQyMjcxMCwgMHgxNDQwMDBmOCwgMHgyNDAyMDAwMSwgMHg4MDA0ODFkLCAKKzB4MCwgMHgzYzA1MDAwMSwgMHg4Y2E1NWNjOCwgMHhjMDA1MmEyLCAKKzB4MjAyMSwgMHhjMDA1Mzg2LCAweDIwMjEsIDB4M2MwMzAwMDEsIAorMHg4YzYzN2UzNCwgMHg0NjEwMGVhLCAweDI0MDIwMDAxLCAweDNjMDIwMDA4LCAKKzB4NjIxMDI0LCAweDEwNDAwMDA2LCAweDAsIDB4OGY4MjAyMTQsIAorMHgzYzAzZmZmZiwgMHg0MzEwMjQsIDB4ODAwNDc0MSwgMHgzNDQyMjUxZiwgCisweDhmODIwMjE0LCAweDNjMDNmZmZmLCAweDQzMTAyNCwgMHgzNDQyMjQxZiwgCisweGFmODIwMjE0LCAweDhlZTIwMDAwLCAweDNjMDMwMjAwLCAweDQzMTAyNSwgCisweGFlZTIwMDAwLCAweDhmODIwMjIwLCAweDI0MDNmZmZiLCAweDQzMTAyNCwgCisweGFmODIwMjIwLCAweDhmODIwMjIwLCAweDM0NDIwMDAyLCAweGFmODIwMjIwLCAKKzB4MjQwMjAwMDgsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI4M2FjLCAKKzB4OGY4MjAyMjAsIDB4M2MwMzAwMDQsIDB4NDMxMDI0LCAweDE0NDAwMDA1LCAKKzB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzZjcwMCwgMHg0MzEwMjUsIAorMHhhZjgyMDIyMCwgMHgzYzAzMDAwMSwgMHg4YzYzNWRiYywgMHgyNDAyMDAwNSwgCisweDE0NjIwMDBhLCAweDAsIDB4M2MwMjAwMDEsIDB4OTQ0MjVkYTIsIAorMHgyNDQyOWZiYywgMHgyYzQyMDAwNCwgMHgxMDQwMDAwNCwgMHgyNDA0MDAxOCwgCisweDI0MDUwMDAyLCAweGMwMDRkOTMsIDB4MjQwNjAwMjAsIDB4YzAwNDNkZCwgCisweDAsIDB4M2MwMTAwMDEsIDB4ODAwNDgxZiwgMHhhYzIwNWQ1MCwgCisweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyODNhYywgMHgyNDQzZmZmZiwgCisweDJjNjIwMDA4LCAweDEwNDAwMGFjLCAweDMxMDgwLCAweDNjMDEwMDAxLCAKKzB4MjIwODIxLCAweDhjMjI1YWU4LCAweDQwMDAwOCwgMHgwLCAKKzB4YzAwNDI5YiwgMHgwLCAweDNjMDEwMDAxLCAweGFjMjA1Y2NjLCAKKzB4YWY4MDAyMDQsIDB4M2MwMTAwMDEsIDB4YzAwNDgyMiwgMHhhYzIwN2UyMCwgCisweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI1Y2U0LCAweDI0MDIwMDAyLCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweDgwMDQ4MWYsIDB4YWMyMjgzYWMsIAorMHhjMDA0ODlmLCAweDAsIDB4M2MwMzAwMDEsIDB4OGM2MzVjZTQsIAorMHgyNDAyMDAwOSwgMHgxNDYyMDA5MCwgMHgyNDAyMDAwMywgMHgzYzAxMDAwMSwgCisweDM3MDgyMSwgMHg4MDA0ODFmLCAweGFjMjI4M2FjLCAweDNjMDIwMDAxLCAKKzB4OGM0MjdlMzgsIDB4MzA0MjQwMDAsIDB4MTA0MDAwMDUsIDB4MCwgCisweDhmODIwMDQ0LCAweDNjMDNmZmZmLCAweDgwMDQ3OWYsIDB4MzQ2MzdmZmYsIAorMHg4ZjgyMDA0NCwgMHgyNDAzZmY3ZiwgMHg0MzEwMjQsIDB4YWY4MjAwNDQsIAorMHg4ZjgzMDA1NCwgMHg4MDA0N2I5LCAweDI0MDIwMDA0LCAweDhmODMwMDU0LCAKKzB4M2MwMjAwMDEsIDB4OGM0MjVkYTQsIDB4MjQ2M2Q4ZjAsIDB4NDMxMDIzLCAKKzB4MmM0MjI3MTAsIDB4MTQ0MDAwNzQsIDB4MjQwMjAwMDUsIDB4M2MwMTAwMDEsIAorMHgzNzA4MjEsIDB4ODAwNDgxZiwgMHhhYzIyODNhYywgMHg4ZjgyMDIyMCwgCisweDNjMDNmNzAwLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwgMHhhZjgwMDIwNCwgCisweDNjMDEwMDAxLCAweGFjMjA3ZTIwLCAweDhmODMwMDU0LCAweDI0MDIwMDA2LCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjI4M2FjLCAweDNjMDEwMDAxLCAKKzB4ODAwNDgxZiwgMHhhYzIzNWRhNCwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgCisweDhjNDI1ZGE0LCAweDI0NjNmZmY2LCAweDQzMTAyMywgMHgyYzQyMDAwYSwgCisweDE0NDAwMDU5LCAweDAsIDB4MjQwMjAwMDcsIDB4M2MwMTAwMDEsIAorMHgzNzA4MjEsIDB4ODAwNDgxZiwgMHhhYzIyODNhYywgMHg4ZjgyMDIyMCwgCisweDNjMDRmNzAwLCAweDQ0MTAyNSwgMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgCisweDNjMDMwMzAwLCAweDQzMTAyNCwgMHgxNDQwMDAwNSwgMHgxODIxLCAKKzB4OGY4MjAyMjAsIDB4MjQwMzAwMDEsIDB4NDQxMDI1LCAweGFmODIwMjIwLCAKKzB4MTA2MDAwNDMsIDB4MjQwMjAwMDEsIDB4OGY4MjAyMTQsIDB4M2MwM2ZmZmYsIAorMHgzYzA0MDAwMSwgMHg4Yzg0NWQ5OCwgMHg0MzEwMjQsIDB4MzQ0MjI1MWYsIAorMHhhZjgyMDIxNCwgMHgyNDAyMDAwOCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHgxMDgwMDAwYiwgMHhhYzIyODNhYywgMHgzYzAyMDAwMSwgMHg4YzQyNWQ3NCwgCisweDE0NDAwMDA3LCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI3ZGQwLCAKKzB4YzAwNGU1NCwgMHg4Zjg0MDIyMCwgMHg4MDA0ODBjLCAweDAsIAorMHg4ZjgyMDIyMCwgMHgzYzAzMDAwOCwgMHg0MzEwMjQsIDB4MTQ0MDAwMTcsIAorMHgyNDAyMDAwZSwgMHgzYzAxMDAwMSwgMHhhYzIyN2RkMCwgMHg4ZWUyMDAwMCwgCisweDIwMjEsIDB4M2MwMzAyMDAsIDB4NDMxMDI1LCAweGMwMDUzODYsIAorMHhhZWUyMDAwMCwgMHg4ZjgyMDIyMCwgMHgyNDAzZmZmYiwgMHg0MzEwMjQsIAorMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwgMHhjMDA0M2RkLCAKKzB4YWY4MjAyMjAsIDB4M2MwNTAwMDEsIDB4OGNhNTVjYzgsIDB4YzAwNTJhMiwgCisweDIwMjEsIDB4ODAwNDgxZiwgMHgwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjVkNzQsIDB4MTA0MDAwMTAsIDB4MCwgMHgzYzAyMDAwMSwgCisweDhjNDI1ZDcwLCAweDI0NDJmZmZmLCAweDNjMDEwMDAxLCAweGFjMjI1ZDcwLCAKKzB4MTQ0MDAwMDksIDB4MjQwMjAwMDIsIDB4M2MwMTAwMDEsIDB4YWMyMDVkNzQsIAorMHgzYzAxMDAwMSwgMHg4MDA0ODFmLCAweGFjMjI1ZDcwLCAweDI0MDIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4YWMyMjVjY2MsIDB4OGZiZjAwMTgsIDB4M2UwMDAwOCwgCisweDI3YmQwMDIwLCAweDhmODIwMjAwLCAweDhmODIwMjIwLCAweDhmODIwMjIwLCAKKzB4MzQ0MjAwMDQsIDB4YWY4MjAyMjAsIDB4OGY4MjAyMDAsIDB4M2MwNjAwMDEsIAorMHg4Y2M2NWNjOCwgMHgzNDQyMDAwNCwgMHhhZjgyMDIwMCwgMHgyNDAyMDAwMiwgCisweDEwYzIwMDNhLCAweDJjYzIwMDAzLCAweDEwNDAwMDA1LCAweDI0MDIwMDAxLCAKKzB4MTBjMjAwMDgsIDB4MCwgMHg4MDA0ODY4LCAweDAsIAorMHgyNDAyMDAwNCwgMHgxMGMyMDAxMywgMHgyNDAyMDAwMSwgMHg4MDA0ODY4LCAKKzB4MCwgMHgzYzAzMDAwMSwgMHg4YzYzNWNiOCwgMHgzYzAyMDAwMSwgCisweDhjNDI1Y2MwLCAweDNjMDQwMDAxLCAweDhjODQ1Y2RjLCAweDNjMDUwMDAxLCAKKzB4OGNhNTVjYmMsIDB4YWY4NjAyMDAsIDB4YWY4NjAyMjAsIDB4MzQ2MzAwMjIsIAorMHg0NDEwMjUsIDB4NDUxMDI1LCAweDM0NDIwMDAyLCAweDgwMDQ4NjcsIAorMHhhZjgzMDIwMCwgMHgzYzAzMDAwMSwgMHg4YzYzNWQ5OCwgMHhhZjgyMDIwMCwgCisweDEwNjAwMDA5LCAweGFmODIwMjIwLCAweDNjMDIwMDAxLCAweDhjNDI1ZDc0LCAKKzB4MTQ0MDAwMDUsIDB4M2MwMzNmMDAsIDB4M2MwMjAwMDEsIDB4OGM0MjVjYjAsIAorMHg4MDA0ODViLCAweDM0NjMwMGUwLCAweDNjMDIwMDAxLCAweDhjNDI1Y2IwLCAKKzB4M2MwMzNmMDAsIDB4MzQ2MzAwZTIsIDB4NDMxMDI1LCAweGFmODIwMjAwLCAKKzB4M2MwMzAwMDEsIDB4OGM2MzVjYjQsIDB4M2MwNGY3MDAsIDB4M2MwMjAwMDEsIAorMHg4YzQyNWNjMCwgMHgzYzA1MDAwMSwgMHg4Y2E1NWNkYywgMHg2NDE4MjUsIAorMHg0MzEwMjUsIDB4NDUxMDI1LCAweGFmODIwMjIwLCAweDNlMDAwMDgsIAorMHgwLCAweDhmODIwMjIwLCAweDNjMDMwMDAxLCAweDhjNjM1Y2M4LCAKKzB4MzQ0MjAwMDQsIDB4YWY4MjAyMjAsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMGYsIAorMHgwLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NjMwMDAyLCAKKzB4NjIxMDIzLCAweDJjNDIwMDAzLCAweDEwNDAwMDExLCAweDAsIAorMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDMsIDB4MTA0MDAwMGMsIAorMHgwLCAweDgwMDQ4NzksIDB4MCwgMHg4ZjgzMDA1NCwgCisweDhmODIwMDU0LCAweDgwMDQ4ODUsIDB4MjQ2MzAwMDcsIDB4OGY4MjAwNTQsIAorMHg2MjEwMjMsIDB4MmM0MjAwMDgsIDB4MTQ0MGZmZmMsIDB4MCwgCisweDhmODQwMGUwLCAweDMwODIwMDA3LCAweDEwNDAwMDBkLCAweDAsIAorMHg4ZjgyMDA1NCwgMHg4ZjgzMDBlMCwgMHgxNDgzMDAwOSwgMHgyNDQ1MDAzMiwgCisweDhmODIwMDU0LCAweGEyMTAyMywgMHgyYzQyMDAzMywgMHgxMDQwMDAwNCwgCisweDAsIDB4OGY4MjAwZTAsIDB4MTA4MmZmZjksIDB4MCwgCisweDhmODIwMjIwLCAweDI0MDNmZmZkLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwgCisweDNlMDAwMDgsIDB4MCwgMHgzYzAzMDAwMSwgMHg4YzYzNWNlNCwgCisweDNjMDIwMDAxLCAweDhjNDI1Y2U4LCAweDUwNjIwMDA0LCAweDI0NjNmZmZmLCAKKzB4M2MwMTAwMDEsIDB4YWMyMzVjZTgsIDB4MjQ2M2ZmZmYsIDB4MmM2MjAwMDksIAorMHgxMDQwMDA5ZCwgMHgzMTA4MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIAorMHg4YzIyNWIwOCwgMHg0MDAwMDgsIDB4MCwgMHg4ZjgyMDA0NCwgCisweDM0NDI4MDgwLCAweGFmODIwMDQ0LCAweDhmODMwMDU0LCAweDgwMDQ5MzgsIAorMHgyNDAyMDAwMiwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgMHg4YzQyNWRhOCwgCisweDI0NjNkOGYwLCAweDQzMTAyMywgMHgyYzQyMjcxMCwgMHgxNDQwMDA4YSwgCisweDI0MDIwMDAzLCAweDgwMDQ5NDUsIDB4MCwgMHg4ZjgyMDA0NCwgCisweDNjMDNmZmZmLCAweDM0NjM3ZmZmLCAweDQzMTAyNCwgMHhhZjgyMDA0NCwgCisweDhmODMwMDU0LCAweDgwMDQ5MzgsIDB4MjQwMjAwMDQsIDB4OGY4MzAwNTQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWRhOCwgMHgyNDYzZmZmNiwgMHg0MzEwMjMsIAorMHgyYzQyMDAwYSwgMHgxNDQwMDA3OCwgMHgyNDAyMDAwNSwgMHg4MDA0OTQ1LCAKKzB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzZjcwMCwgMHg0MzEwMjUsIAorMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgyNDAzZmZmYiwgMHg0MzEwMjQsIAorMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwgMHhhZjgyMDIyMCwgCisweDNjMDIzZjAwLCAweDM0NDIwMGUwLCAweGFmODIwMjAwLCAweDhmODIwMjAwLCAKKzB4MjQwM2ZmZmQsIDB4NDMxMDI0LCAweGFmODIwMjAwLCAweDI0MDQwMDAxLCAKKzB4MzQwNWZmZmYsIDB4YWY4NDAyMDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIAorMHg4MDA0OGVjLCAweDI0NjMwMDAxLCAweDhmODIwMDU0LCAweDYyMTAyMywgCisweDJjNDIwMDAyLCAweDE0NDBmZmZjLCAweDAsIDB4OGY4MjAyMjQsIAorMHg0MjA0MCwgMHhhNDEwMmIsIDB4MTA0MGZmZjIsIDB4MCwgCisweDhmODIwMjIwLCAweDNjMDNmNzAwLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwgCisweDhmODIwMjE0LCAweDNjMDNmZmZmLCAweDQzMTAyNCwgMHgzNDQyMjUxZiwgCisweGFmODIwMjE0LCAweDhmODIwMjIwLCAweDI0MDNmZmZiLCAweDQzMTAyNCwgCisweGFmODIwMjIwLCAweDhmODIwMjIwLCAweDNjMDRmNzAwLCAweDM0ODQwMDA4LCAKKzB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsIDB4M2MwMzNmMDAsIAorMHgzNDYzMDBlMiwgMHg0NDEwMjUsIDB4YWY4MjAyMjAsIDB4YWY4MzAyMDAsIAorMHg4Zjg0MDBmMCwgMHgyNzYyMTdmOCwgMHgxNDgyMDAwMiwgMHgyNDg1MDAwOCwgCisweDI3NjUxMDAwLCAweDhmODIwMGY0LCAweDEwYTIwMDA3LCAweDNjMDM4MDAwLCAKKzB4MzQ2MzAwNDAsIDB4M2MwMjAwMDEsIDB4MjQ0MjVjNzAsIDB4YWM4MjAwMDAsIAorMHhhYzgzMDAwNCwgMHhhZjg1MDBmMCwgMHg4ZjgzMDA1NCwgMHg4MDA0OTM4LCAKKzB4MjQwMjAwMDYsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjVkYTgsIAorMHgyNDYzZmZmNiwgMHg0MzEwMjMsIDB4MmM0MjAwMGEsIDB4MTQ0MDAwMjIsIAorMHgyNDAyMDAwNywgMHg4MDA0OTQ1LCAweDAsIDB4OGY4MjAwZTAsIAorMHhhZjgyMDBlNCwgMHg4ZjgyMDBlMCwgMHhhZjgyMDBlOCwgMHg4ZjgyMDIyMCwgCisweDM0NDIwMDA0LCAweGFmODIwMjIwLCAweDhmODIwMjIwLCAweDI0MDNmZmY3LCAKKzB4NDMxMDI0LCAweGFmODIwMjIwLCAweDhmODIwMDQ0LCAweDM0NDI4MDgwLCAKKzB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4MjQwMjAwMDgsIDB4M2MwMTAwMDEsIAorMHhhYzIyNWNlNCwgMHgzYzAxMDAwMSwgMHg4MDA0OTQ3LCAweGFjMjM1ZGE4LCAKKzB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjVkYTgsIDB4MjQ2M2Q4ZjAsIAorMHg0MzEwMjMsIDB4MmM0MjI3MTAsIDB4MTQ0MDAwMDMsIDB4MjQwMjAwMDksIAorMHgzYzAxMDAwMSwgMHhhYzIyNWNlNCwgMHgzZTAwMDA4LCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgyN2JkZmZkOCwgCisweGFmYjIwMDE4LCAweDgwOTAyMSwgMHhhZmIzMDAxYywgMHhhMDk4MjEsIAorMHhhZmIxMDAxNCwgMHhjMDg4MjEsIDB4YWZiMDAwMTAsIDB4ODAyMSwgCisweGFmYmYwMDIwLCAweGE2MjAwMDAwLCAweGMwMDRkNGIsIDB4MjQwNDAwMDEsIAorMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLCAKKzB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweDI0MTAwMDEwLCAweDI1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwgCisweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAKKzB4MjUwMTAyNCwgMHgyNDEwMDAxMCwgMHgyNzAxMDI0LCAweDEwNDAwMDAyLCAKKzB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwgCisweDE2MDBmZmZhLCAweDI3MDEwMjQsIDB4YzAwNGQ3MSwgMHgzNDEwODAwMCwgCisweGMwMDRkNzEsIDB4MCwgMHhjMDA0ZDJiLCAweDAsIAorMHg1MDQwMDAwNSwgMHgxMDgwNDIsIDB4OTYyMjAwMDAsIDB4NTAxMDI1LCAKKzB4YTYyMjAwMDAsIDB4MTA4MDQyLCAweDE2MDBmZmY3LCAweDAsIAorMHhjMDA0ZDcxLCAweDAsIDB4OGZiZjAwMjAsIDB4OGZiMzAwMWMsIAorMHg4ZmIyMDAxOCwgMHg4ZmIxMDAxNCwgMHg4ZmIwMDAxMCwgMHgzZTAwMDA4LCAKKzB4MjdiZDAwMjgsIDB4MjdiZGZmZDgsIDB4YWZiMTAwMTQsIDB4ODA4ODIxLCAKKzB4YWZiMjAwMTgsIDB4YTA5MDIxLCAweGFmYjMwMDFjLCAweGMwOTgyMSwgCisweGFmYjAwMDEwLCAweDgwMjEsIDB4YWZiZjAwMjAsIDB4YzAwNGQ0YiwgCisweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLCAKKzB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwgCisweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLCAKKzB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MjMwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYSwgMHgyMzAxMDI0LCAweDI0MTAwMDEwLCAweDI1MDEwMjQsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MjUwMTAyNCwgMHhjMDA0ZDRiLCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweDM0MTA4MDAwLCAKKzB4OTY2MjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxNjAwZmZmOCwgCisweDAsIDB4YzAwNGQ3MSwgMHgwLCAweDhmYmYwMDIwLCAKKzB4OGZiMzAwMWMsIDB4OGZiMjAwMTgsIDB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsIAorMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDNjMDMwMDAxLCAweDhjNjM1ZDAwLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjVkNDgsIDB4MjdiZGZmZDgsIDB4YWZiZjAwMjAsIAorMHhhZmIxMDAxYywgMHgxMDYyMDAwMywgMHhhZmIwMDAxOCwgMHgzYzAxMDAwMSwgCisweGFjMjM1ZDQ4LCAweDI0NjNmZmZmLCAweDJjNjIwMDEzLCAweDEwNDAwMzQ5LCAKKzB4MzEwODAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDhjMjI1YjMwLCAKKzB4NDAwMDA4LCAweDAsIDB4YzAwNGQ3MSwgMHg4MDIxLCAKKzB4MzQwMjgwMDAsIDB4YTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4YzAwNGQ0YiwgCisweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLCAKKzB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwgCisweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLCAKKzB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsIAorMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLCAKKzB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4YzAwNGQ0YiwgCisweDIwMjEsIDB4MTA4MDQyLCAweDE2MDBmZmZjLCAweDAsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIAorMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkNzEsIDB4MCwgCisweDgwMDRkMjQsIDB4MjQwMjAwMDIsIDB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsIAorMHg4MDIxLCAweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIAorMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNGIsIAorMHgyMDIxLCAweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgCisweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgMHgyNDEwMDAxMCwgCisweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgCisweDI0MTAwMDEwLCAweGMwMDRkNGIsIDB4MjAyMSwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYywgMHgwLCAweGMwMDRkNzEsIDB4MzQxMDgwMDAsIAorMHhjMDA0ZDcxLCAweDAsIDB4YzAwNGQyYiwgMHgwLCAKKzB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk2MjIwMDAwLCAweDUwMTAyNSwgCisweGE2MjIwMDAwLCAweDEwODA0MiwgMHgxNjAwZmZmNywgMHgwLCAKKzB4YzAwNGQ3MSwgMHgwLCAweDk3YTIwMDEwLCAweDMwNDI4MDAwLCAKKzB4MTQ0MDAyZGMsIDB4MjQwMjAwMDMsIDB4ODAwNGQyNCwgMHgwLCAKKzB4MjQwMjEyMDAsIDB4YTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4ODAyMSwgCisweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIAorMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAKKzB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgCisweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgCisweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgCisweGMwMDRkNGIsIDB4MjAyMSwgMHgxMDgwNDIsIDB4MTYwMGZmZmMsIAorMHgwLCAweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgCisweDIwMjEsIDB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAKKzB4MTA4MDQyLCAweDE2MDBmZmY4LCAweDAsIDB4YzAwNGQ3MSwgCisweDAsIDB4OGY4MzAwNTQsIDB4ODAwNGQxNiwgMHgyNDAyMDAwNCwgCisweDhmODMwMDU0LCAweDNjMDIwMDAxLCAweDhjNDI1ZGI4LCAweDI0NjNmZjljLCAKKzB4NDMxMDIzLCAweDJjNDIwMDY0LCAweDE0NDAwMjllLCAweDI0MDIwMDAyLCAKKzB4M2MwMzAwMDEsIDB4OGM2MzVkYmMsIDB4MTA2MjAyOTcsIDB4MmM2MjAwMDMsIAorMHgxNDQwMDI5NiwgMHgyNDAyMDAxMSwgMHgyNDAyMDAwMywgMHgxMDYyMDAwNSwgCisweDI0MDIwMDA0LCAweDEwNjIwMjkxLCAweDI0MDIwMDBmLCAweDgwMDRkMjQsIAorMHgyNDAyMDAxMSwgMHg4MDA0ZDI0LCAweDI0MDIwMDA1LCAweDI0MDIwMDE0LCAKKzB4YTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4ODAyMSwgMHhjMDA0ZDRiLCAKKzB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIAorMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsIAorMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAxMiwgCisweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgCisweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxMiwgMHhjMDA0ZDRiLCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweDM0MTA4MDAwLCAKKzB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxNjAwZmZmOCwgCisweDAsIDB4YzAwNGQ3MSwgMHgwLCAweDhmODMwMDU0LCAKKzB4ODAwNGQxNiwgMHgyNDAyMDAwNiwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgCisweDhjNDI1ZGI4LCAweDI0NjNmZjljLCAweDQzMTAyMywgMHgyYzQyMDA2NCwgCisweDE0NDAwMjUwLCAweDI0MDIwMDA3LCAweDgwMDRkMjQsIDB4MCwgCisweDI0MDIwMDA2LCAweGE3YTIwMDEwLCAweDI3YjEwMDEwLCAweDgwMjEsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIAorMHgzMjAyMDAxMywgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTMsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIAorMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkNzEsIDB4MCwgCisweDhmODMwMDU0LCAweDgwMDRkMTYsIDB4MjQwMjAwMDgsIDB4OGY4MzAwNTQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWRiOCwgMHgyNDYzZmY5YywgMHg0MzEwMjMsIAorMHgyYzQyMDA2NCwgMHgxNDQwMDIwZiwgMHgyNDAyMDAwOSwgMHg4MDA0ZDI0LCAKKzB4MCwgMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwgMHg4MDIxLCAKKzB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgCisweDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLCAKKzB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ0YiwgMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAKKzB4MzIwMjAwMTgsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgCisweGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE4LCAKKzB4YzAwNGQ3MSwgMHgzNDEwODAwMCwgMHhjMDA0ZDcxLCAweDAsIAorMHhjMDA0ZDJiLCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLCAKKzB4OTYyMjAwMDAsIDB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwgCisweDE2MDBmZmY3LCAweDAsIDB4YzAwNGQ3MSwgMHg4MDIxLCAKKzB4OTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4MzQ0MjAwMDEsIDB4YTdhMjAwMTAsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIAorMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTgsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIAorMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkNzEsIDB4MCwgCisweDhmODMwMDU0LCAweDgwMDRkMTYsIDB4MjQwMjAwMGEsIDB4OGY4MzAwNTQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWRiOCwgMHgyNDYzZmY5YywgMHg0MzEwMjMsIAorMHgyYzQyMDA2NCwgMHgxNDQwMDE5YiwgMHgyNDAyMDAwYiwgMHg4MDA0ZDI0LCAKKzB4MCwgMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwgMHg4MDIxLCAKKzB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgCisweDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLCAKKzB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ0YiwgMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAKKzB4MzIwMjAwMTcsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgCisweGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE3LCAKKzB4YzAwNGQ3MSwgMHgzNDEwODAwMCwgMHhjMDA0ZDcxLCAweDAsIAorMHhjMDA0ZDJiLCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLCAKKzB4OTYyMjAwMDAsIDB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwgCisweDE2MDBmZmY3LCAweDAsIDB4YzAwNGQ3MSwgMHg4MDIxLCAKKzB4OTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4MzQ0MjA3MDAsIDB4YTdhMjAwMTAsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIAorMHgzMjAyMDAxNywgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTcsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIAorMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkNzEsIDB4MCwgCisweDhmODMwMDU0LCAweDgwMDRkMTYsIDB4MjQwMjAwMGMsIDB4OGY4MzAwNTQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWRiOCwgMHgyNDYzZmY5YywgMHg0MzEwMjMsIAorMHgyYzQyMDA2NCwgMHgxNDQwMDEyNywgMHgyNDAyMDAxMiwgMHg4MDA0ZDI0LCAKKzB4MCwgMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwgMHg4MDIxLCAKKzB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgCisweDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLCAKKzB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ0YiwgMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAKKzB4MzIwMjAwMTQsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgCisweGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE0LCAKKzB4YzAwNGQ3MSwgMHgzNDEwODAwMCwgMHhjMDA0ZDcxLCAweDAsIAorMHhjMDA0ZDJiLCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLCAKKzB4OTYyMjAwMDAsIDB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwgCisweDE2MDBmZmY3LCAweDAsIDB4YzAwNGQ3MSwgMHg4MDIxLCAKKzB4OTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4MzQ0MjAwMTAsIDB4YTdhMjAwMTAsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIAorMHgzMjAyMDAxNCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTQsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIAorMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkNzEsIDB4MCwgCisweDhmODMwMDU0LCAweDgwMDRkMTYsIDB4MjQwMjAwMTMsIDB4OGY4MzAwNTQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWRiOCwgMHgyNDYzZmY5YywgMHg0MzEwMjMsIAorMHgyYzQyMDA2NCwgMHgxNDQwMDBiMywgMHgyNDAyMDAwZCwgMHg4MDA0ZDI0LCAKKzB4MCwgMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwgMHg4MDIxLCAKKzB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgCisweDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLCAKKzB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ0YiwgMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAKKzB4MzIwMjAwMTgsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgCisweGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE4LCAKKzB4YzAwNGQ3MSwgMHgzNDEwODAwMCwgMHhjMDA0ZDcxLCAweDAsIAorMHhjMDA0ZDJiLCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLCAKKzB4OTYyMjAwMDAsIDB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwgCisweDE2MDBmZmY3LCAweDAsIDB4YzAwNGQ3MSwgMHg4MDIxLCAKKzB4OTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4MzA0MmZmZmUsIDB4YTdhMjAwMTAsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweGMwMDRkNGIsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIAorMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ0YiwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTgsIAorMHhjMDA0ZDRiLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgCisweDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIAorMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkNzEsIDB4MCwgCisweDhmODMwMDU0LCAweDgwMDRkMTYsIDB4MjQwMjAwMGUsIDB4MjQwMjA4NDAsIAorMHhhN2EyMDAxMCwgMHgyN2IxMDAxMCwgMHg4MDIxLCAweGMwMDRkNGIsIAorMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgCisweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwgCisweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAKKzB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwgCisweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDEzLCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDEzLCAweGMwMDRkNGIsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4MzQxMDgwMDAsIAorMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwgCisweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmY4LCAKKzB4MCwgMHhjMDA0ZDcxLCAweDAsIDB4OGY4MzAwNTQsIAorMHgyNDAyMDAxMCwgMHgzYzAxMDAwMSwgMHhhYzIyNWQwMCwgMHgzYzAxMDAwMSwgCisweDgwMDRkMjYsIDB4YWMyMzVkYjgsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIAorMHg4YzQyNWRiOCwgMHgyNDYzZmY5YywgMHg0MzEwMjMsIDB4MmM0MjAwNjQsIAorMHgxNDQwMDAwNCwgMHgwLCAweDI0MDIwMDExLCAweDNjMDEwMDAxLCAKKzB4YWMyMjVkMDAsIDB4OGZiZjAwMjAsIDB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsIAorMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDhmODUwMDQ0LCAweDhmODIwMDQ0LCAKKzB4M2MwMzAwMDEsIDB4NDMxMDI1LCAweDNjMDMwMDA4LCAweGFmODIwMDQ0LCAKKzB4OGY4NDAwNTQsIDB4OGY4MjAwNTQsIDB4YTMyODI0LCAweDgwMDRkMzcsIAorMHgyNDg0MDAwMSwgMHg4ZjgyMDA1NCwgMHg4MjEwMjMsIDB4MmM0MjAwMDIsIAorMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMDQ0LCAweDNjMDNmZmZlLCAKKzB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmODIwMDQ0LCAweDhmODMwMDU0LCAKKzB4OGY4MjAwNTQsIDB4ODAwNGQ0NSwgMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgCisweDYyMTAyMywgMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgMHgwLCAKKzB4M2UwMDAwOCwgMHhhMDEwMjEsIDB4OGY4MzAwNDQsIDB4M2MwMmZmZjAsIAorMHgzNDQyZmZmZiwgMHg0MjQ4MCwgMHg2MjE4MjQsIDB4M2MwMjAwMDIsIAorMHg4MjIwMjUsIDB4NjQxODI1LCAweGFmODMwMDQ0LCAweDhmODIwMDQ0LCAKKzB4M2MwM2ZmZmUsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmODIwMDQ0LCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4ODAwNGQ1ZSwgMHgyNDYzMDAwMSwgCisweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgCisweDAsIDB4OGY4MjAwNDQsIDB4M2MwMzAwMDEsIDB4NDMxMDI1LCAKKzB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4ODAwNGQ2YiwgCisweDI0NjMwMDAxLCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwgCisweDE0NDBmZmZjLCAweDAsIDB4M2UwMDAwOCwgMHgwLCAKKzB4OGY4MjAwNDQsIDB4M2MwM2ZmZjAsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAKKzB4YWY4MjAwNDQsIDB4OGY4MjAwNDQsIDB4M2MwMzAwMDEsIDB4NDMxMDI1LCAKKzB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4ODAwNGQ3ZiwgCisweDI0NjMwMDAxLCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwgCisweDE0NDBmZmZjLCAweDAsIDB4OGY4MjAwNDQsIDB4M2MwM2ZmZmUsIAorMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIAorMHg4ZjgyMDA1NCwgMHg4MDA0ZDhkLCAweDI0NjMwMDAxLCAweDhmODIwMDU0LCAKKzB4NjIxMDIzLCAweDJjNDIwMDAyLCAweDE0NDBmZmZjLCAweDAsIAorMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmYzgsIDB4YWZiMzAwMjQsIAorMHg4MDk4MjEsIDB4YWZiNTAwMmMsIDB4YTBhODIxLCAweGFmYjIwMDIwLCAKKzB4YzA5MDIxLCAweDMyYTJmZmZmLCAweGFmYmYwMDMwLCAweGFmYjQwMDI4LCAKKzB4YWZiMTAwMWMsIDB4YWZiMDAwMTgsIDB4MTQ0MDAwMzQsIDB4YTdiMjAwMTAsIAorMHgzMjcxZmZmZiwgMHgyN2IyMDAxMCwgMHg4MDIxLCAweGMwMDRkNGIsIAorMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgCisweDAsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweGMwMDRkNGIsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwgCisweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAKKzB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwgCisweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDIzMDEwMjQsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MjMwMTAyNCwgMHhjMDA0ZDRiLCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyMDIxLCAweDM0MTA4MDAwLCAKKzB4OTY0MjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDEwODA0MiwgMHgxMjAwMDA3NSwgCisweDAsIDB4ODAwNGRjOSwgMHgwLCAweDMyNzRmZmZmLCAKKzB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsIDB4ODAyMSwgMHhjMDA0ZDRiLCAKKzB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIAorMHgwLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAKKzB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHgyOTAxMDI0LCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDI5MDEwMjQsIDB4YzAwNGQ3MSwgCisweDM0MTA4MDAwLCAweGMwMDRkNzEsIDB4MCwgMHhjMDA0ZDJiLCAKKzB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsIDB4OTYyMjAwMDAsIAorMHg1MDEwMjUsIDB4YTYyMjAwMDAsIDB4MTA4MDQyLCAweDE2MDBmZmY3LCAKKzB4MCwgMHhjMDA0ZDcxLCAweDAsIDB4MzJhNWZmZmYsIAorMHgyNDAyMDAwMSwgMHg1NGEyMDAwNCwgMHgyNDAyMDAwMiwgMHg5N2EyMDAxMCwgCisweDgwMDRlMTQsIDB4NTIxMDI1LCAweDE0YTIwMDA2LCAweDMyNzFmZmZmLCAKKzB4OTdhMjAwMTAsIDB4MTIxODI3LCAweDQzMTAyNCwgMHhhN2EyMDAxMCwgCisweDMyNzFmZmZmLCAweDI3YjIwMDEwLCAweDgwMjEsIDB4YzAwNGQ0YiwgCisweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLCAKKzB4MCwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4YzAwNGQ0YiwgCisweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MjAyMSwgMHhjMDA0ZDRiLCAKKzB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsIAorMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLCAKKzB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4MjMwMTAyNCwgCisweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ0YiwgCisweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgyMzAxMDI0LCAweGMwMDRkNGIsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDRiLCAweDIwMjEsIDB4MzQxMDgwMDAsIAorMHg5NjQyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwgCisweDI0MDQwMDAxLCAweGMwMDRkNGIsIDB4MTA4MDQyLCAweDE2MDBmZmY4LCAKKzB4MCwgMHhjMDA0ZDcxLCAweDAsIDB4OGZiZjAwMzAsIAorMHg4ZmI1MDAyYywgMHg4ZmI0MDAyOCwgMHg4ZmIzMDAyNCwgMHg4ZmIyMDAyMCwgCisweDhmYjEwMDFjLCAweDhmYjAwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMzgsIAorMHgwLCAweDAsIDB4MCwgMHgyN2JkZmZlOCwgCisweGFmYmYwMDEwLCAweDNjMDMwMDAxLCAweDc3MTgyMSwgMHg4YzYzODNhYywgCisweDI0MDIwMDA4LCAweDE0NjIwMjJjLCAweDgwMzAyMSwgMHgzYzAyMDAwMSwgCisweDhjNDI1ZDk4LCAweDE0NDAwMDMzLCAweDAsIDB4OGY4NTAyMjQsIAorMHgzOGEzMDAyMCwgMHgyYzYzMDAwMSwgMHgzOGEyMDAxMCwgMHgyYzQyMDAwMSwgCisweDYyMTgyNSwgMHgxNDYwMDAwZCwgMHgzOGEzMDAzMCwgMHgyYzYzMDAwMSwgCisweDM4YTIwNDAwLCAweDJjNDIwMDAxLCAweDYyMTgyNSwgMHgxNDYwMDAwNywgCisweDM4YTMwNDAyLCAweDJjNjMwMDAxLCAweDM4YTIwNDA0LCAweDJjNDIwMDAxLCAKKzB4NjIxODI1LCAweDEwNjAwMDA1LCAweDAsIDB4YzAwNDI5YiwgCisweDAsIDB4ODAwNGU4ZCwgMHgyNDAyMDAwZSwgMHhjMDA0M2RkLCAKKzB4MCwgMHgzYzA1MDAwMSwgMHg4Y2E1NWNjOCwgMHhjMDA1MmEyLCAKKzB4MjAyMSwgMHgzYzAzMDAwMSwgMHg4YzYzNWNjOCwgMHgyNDAyMDAwNCwgCisweDE0NjIwMDA1LCAweDI0MDNmZmZiLCAweDNjMDIwMDAxLCAweDhjNDI1Y2M0LCAKKzB4ODAwNGU4OSwgMHgyNDAzZmZmNywgMHgzYzAyMDAwMSwgMHg4YzQyNWNjNCwgCisweDQzMTAyNCwgMHgzYzAxMDAwMSwgMHhhYzIyNWNjNCwgMHgyNDAyMDAwZSwgCisweDNjMDEwMDAxLCAweGMwMDQyOWIsIDB4YWMyMjdkZDAsIDB4ODAwNTA4NywgCisweDAsIDB4OGY4MjAyMjAsIDB4M2MwMzA0MDAsIDB4NDMxMDI0LCAKKzB4MTA0MDAwMjcsIDB4MjQwM2ZmYmYsIDB4OGY4NTAyMjQsIDB4M2MwMjAwMDEsIAorMHg4YzQyN2RkYywgMHhhMzIwMjQsIDB4NDMxMDI0LCAweDE0ODIwMDBjLCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyN2RlMCwgMHgyNDQyMDAwMSwgCisweDNjMDEwMDAxLCAweGFjMjI3ZGUwLCAweDJjNDIwMDAyLCAweDE0NDAwMDA4LCAKKzB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4ODAwNGVhZCwgMHhhYzIyN2UwMCwgCisweDNjMDEwMDAxLCAweGFjMjA3ZGUwLCAweDNjMDEwMDAxLCAweGFjMjA3ZTAwLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjdlMDAsIDB4MTA0MDAwMDYsIDB4MzBhMjAwNDAsIAorMHgxMDQwMDAwNCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHg4MDA0ZWI4LCAKKzB4YWMyMjdlMDQsIDB4M2MwMTAwMDEsIDB4YWMyMDdlMDQsIDB4M2MwMTAwMDEsIAorMHhhYzI1N2RkYywgMHgzYzAxMDAwMSwgMHg4MDA0ZWM4LCAweGFjMjA3ZTEwLCAKKzB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjdlMTAsIDB4M2MwMTAwMDEsIAorMHhhYzIwN2UwMCwgMHgzYzAxMDAwMSwgMHhhYzIwN2RlMCwgMHgzYzAxMDAwMSwgCisweGFjMjA3ZTA0LCAweDNjMDEwMDAxLCAweGFjMjA3ZGRjLCAweDNjMDMwMDAxLCAKKzB4OGM2MzdkZDAsIDB4M2MwMjAwMDEsIDB4OGM0MjdkZDQsIDB4MTA2MjAwMDMsIAorMHgzYzAyMDIwMCwgMHgzYzAxMDAwMSwgMHhhYzIzN2RkNCwgMHhjMjEwMjQsIAorMHgxMDQwMDAwNywgMHgyNDYzZmZmZiwgMHg4ZjgyMDIyMCwgMHgyNDAzMDAwMSwgCisweDNjMDEwMDAxLCAweGFjMjM1Y2NjLCAweDgwMDUwODUsIDB4M2MwM2Y3MDAsIAorMHgyYzYyMDAwZSwgMHgxMDQwMDFhOCwgMHgzMTA4MCwgMHgzYzAxMDAwMSwgCisweDIyMDgyMSwgMHg4YzIyNWI4MCwgMHg0MDAwMDgsIDB4MCwgCisweDNjMDEwMDAxLCAweGFjMjA3ZTAwLCAweDNjMDEwMDAxLCAweGFjMjA3ZGUwLCAKKzB4M2MwMTAwMDEsIDB4YWMyMDdkZGMsIDB4M2MwMTAwMDEsIDB4YWMyMDdlMDQsIAorMHgzYzAxMDAwMSwgMHhhYzIwN2RmOCwgMHgzYzAxMDAwMSwgMHhhYzIwN2RmMCwgCisweGMwMDQ4NmEsIDB4YWY4MDAyMjQsIDB4MjQwMjAwMDIsIDB4M2MwMTAwMDEsIAorMHhhYzIyN2RkMCwgMHgzYzAyMDAwMSwgMHg4YzQyN2UxMCwgMHgxNDQwMDA1NiwgCisweDNjMDNmZGZmLCAweDhlZTIwMDAwLCAweDM0NjNmZmZmLCAweDQzMTAyNCwgCisweGMwMDQyOWIsIDB4YWVlMjAwMDAsIDB4YWY4MDAyMDQsIDB4OGY4MjAyMDAsIAorMHgyNDAzZmZmZCwgMHg0MzEwMjQsIDB4YWY4MjAyMDAsIDB4M2MwMTAwMDEsIAorMHhhYzIwN2UyMCwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgMHg4YzQyN2RmOCwgCisweDI0MDQwMDAxLCAweDNjMDEwMDAxLCAweGFjMjQ3ZTBjLCAweDI0NDIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4YWMyMjdkZjgsIDB4MmM0MjAwMDQsIDB4M2MwMTAwMDEsIAorMHhhYzIzN2RmNCwgMHgxNDQwMDAwNiwgMHgyNDAyMDAwMywgMHgzYzAxMDAwMSwgCisweGFjMjQ1Y2NjLCAweDNjMDEwMDAxLCAweDgwMDUwODMsIDB4YWMyMDdkZjgsIAorMHgzYzAxMDAwMSwgMHg4MDA1MDgzLCAweGFjMjI3ZGQwLCAweDhmODMwMDU0LCAKKzB4M2MwMjAwMDEsIDB4OGM0MjdkZjQsIDB4MjQ2M2Q4ZjAsIDB4NDMxMDIzLCAKKzB4MmM0MjI3MTAsIDB4MTQ0MDAwMDMsIDB4MjQwMjAwMDQsIDB4M2MwMTAwMDEsIAorMHhhYzIyN2RkMCwgMHgzYzAyMDAwMSwgMHg4YzQyN2UxMCwgMHgxNDQwMDAyNiwgCisweDNjMDNmZGZmLCAweDhlZTIwMDAwLCAweDM0NjNmZmZmLCAweDQzMTAyNCwgCisweDgwMDUwODMsIDB4YWVlMjAwMDAsIDB4M2MwNDAwMDEsIDB4OGM4NDVkOWMsIAorMHgzYzAxMDAwMSwgMHhjMDA1MDhhLCAweGFjMjA3ZGU4LCAweDNjMDIwMDAxLCAKKzB4OGM0MjdlMWMsIDB4YWY4MjAyMDQsIDB4M2MwMjAwMDEsIDB4OGM0MjdlMTAsIAorMHgxNDQwMDAxNSwgMHgzYzAzZmRmZiwgMHg4ZWUyMDAwMCwgMHgzNDYzZmZmZiwgCisweDQzMTAyNCwgMHhhZWUyMDAwMCwgMHg4ZjgyMDIwNCwgMHgzMDQyMDAzMCwgCisweDE0NDAwMTNjLCAweDI0MDIwMDAyLCAweDNjMDMwMDAxLCAweDhjNjM3ZTFjLCAKKzB4MjQwMjAwMDUsIDB4M2MwMTAwMDEsIDB4YWMyMjdkZDAsIDB4M2MwMTAwMDEsIAorMHg4MDA1MDgzLCAweGFjMjM3ZTIwLCAweDNjMDIwMDAxLCAweDhjNDI3ZTEwLCAKKzB4MTA0MDAwMTAsIDB4M2MwM2ZkZmYsIDB4M2MwMjAwMDEsIDB4OGM0MjVkNmMsIAorMHgyNDQyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNWQ2YywgMHgyYzQyMDAwMiwgCisweDE0NDAwMTMxLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI1ZDc0LCAKKzB4M2MwMTAwMDEsIDB4YWMyMDVkNmMsIDB4M2MwMTAwMDEsIDB4ODAwNTA4MywgCisweGFjMjI1Y2NjLCAweDhlZTIwMDAwLCAweDM0NjNmZmZmLCAweDQzMTAyNCwgCisweGFlZTIwMDAwLCAweDNjMDIwMDAxLCAweDhjNDI3ZTAwLCAweDEwNDAwMTIyLCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyN2RkYywgMHgxMDQwMDExZSwgCisweDAsIDB4M2MwMTAwMDEsIDB4YWMyMjdlMDgsIDB4MjQwMjAwMDMsIAorMHgzYzAxMDAwMSwgMHhhYzIyN2RlMCwgMHg4MDA1MDI0LCAweDI0MDIwMDA2LCAKKzB4M2MwMTAwMDEsIDB4YWMyMDdkZTgsIDB4OGY4MjAyMDQsIDB4MzQ0MjAwNDAsIAorMHhhZjgyMDIwNCwgMHgzYzAyMDAwMSwgMHg4YzQyN2UyMCwgMHgyNDAzMDAwNywgCisweDNjMDEwMDAxLCAweGFjMjM3ZGQwLCAweDM0NDIwMDQwLCAweDNjMDEwMDAxLCAKKzB4YWMyMjdlMjAsIDB4M2MwMjAwMDEsIDB4OGM0MjdlMDAsIDB4MTA0MDAwMDUsIAorMHgwLCAweDNjMDIwMDAxLCAweDhjNDI3ZGRjLCAweDEwNDAwMGY5LCAKKzB4MjQwMjAwMDIsIDB4M2MwNTAwMDEsIDB4MjRhNTdkZTAsIDB4OGNhMjAwMDAsIAorMHgyYzQyNGUyMSwgMHgxMDQwMDBmMywgMHgyNDAyMDAwMiwgMHgzYzAyMDAwMSwgCisweDhjNDI3ZTA0LCAweDEwNDAwMGY4LCAweDI0MDRmZmJmLCAweDNjMDIwMDAxLCAKKzB4OGM0MjdkZGMsIDB4M2MwMzAwMDEsIDB4OGM2MzdlMDgsIDB4NDQxMDI0LCAKKzB4NjQxODI0LCAweDEwNDMwMDA0LCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAKKzB4ODAwNTA4MywgMHhhYzIyN2RkMCwgMHgyNDAyMDAwMywgMHhhY2EyMDAwMCwgCisweDI0MDIwMDA4LCAweDNjMDEwMDAxLCAweGFjMjI3ZGQwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjdlMGMsIDB4MTA0MDAwMGMsIDB4MjQwMjAwMDEsIDB4M2MwNDAwMDEsIAorMHhjMDA1MDk3LCAweDhjODQ3ZGRjLCAweDNjMDIwMDAxLCAweDhjNDI3ZTI4LCAKKzB4MTQ0MDAwMDUsIDB4MjQwMjAwMDEsIDB4M2MwMjAwMDEsIDB4OGM0MjdlMjQsIAorMHgxMDQwMDAwNiwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNWNjYywgCisweDNjMDEwMDAxLCAweDgwMDUwODMsIDB4YWMyMDdkZjgsIDB4M2MwMjAwMDEsIAorMHg4YzQyN2RmMCwgMHgzYzAzMDAwMSwgMHg4YzYzN2RkYywgMHgyYzQyMDAwMSwgCisweDIxMGMwLCAweDMwNjMwMDA4LCAweDNjMDEwMDAxLCAweGFjMjI3ZGYwLCAKKzB4M2MwMTAwMDEsIDB4YWMyMzdkZWMsIDB4OGY4MzAwNTQsIDB4MjQwMjAwMDksIAorMHgzYzAxMDAwMSwgMHhhYzIyN2RkMCwgMHgzYzAxMDAwMSwgMHg4MDA1MDgzLCAKKzB4YWMyMzdkZjQsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjdkZjQsIAorMHgyNDYzZDhmMCwgMHg0MzEwMjMsIDB4MmM0MjI3MTAsIDB4MTQ0MDAwYTgsIAorMHgwLCAweDNjMDIwMDAxLCAweDhjNDI3ZTAwLCAweDEwNDAwMDA1LCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyN2RkYywgMHgxMDQwMDBhOSwgCisweDI0MDIwMDAyLCAweDNjMDMwMDAxLCAweDI0NjM3ZGUwLCAweDhjNjIwMDAwLCAKKzB4MmM0MjRlMjEsIDB4MTA0MDAwYTMsIDB4MjQwMjAwMDIsIDB4M2MwMjAwMDEsIAorMHg4YzQyN2UwYywgMHgxMDQwMDAwZSwgMHgwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjdkZGMsIDB4M2MwMTAwMDEsIDB4YWMyMDdlMGMsIDB4MzA0MjAwODAsIAorMHgxMDQwMDAyZiwgMHgyNDAyMDAwYywgMHg4ZjgyMDIwNCwgMHgzMDQyMDA4MCwgCisweDE0NDAwMDBjLCAweDI0MDIwMDAzLCAweDgwMDUwMTEsIDB4MjQwMjAwMGMsIAorMHgzYzAyMDAwMSwgMHg4YzQyN2RkYywgMHgzMDQyMDA4MCwgMHgxNDQwMDAwNSwgCisweDI0MDIwMDAzLCAweDhmODIwMjA0LCAweDMwNDIwMDgwLCAweDEwNDAwMDFmLCAKKzB4MjQwMjAwMDMsIDB4YWM2MjAwMDAsIDB4MjQwMjAwMGEsIDB4M2MwMTAwMDEsIAorMHhhYzIyN2RkMCwgMHgzYzA0MDAwMSwgMHgyNDg0N2UxOCwgMHg4YzgyMDAwMCwgCisweDNjMDMwMDAxLCAweDhjNjM3ZGYwLCAweDQzMTAyNSwgMHhhZjgyMDIwNCwgCisweDhjODMwMDAwLCAweDNjMDQwMDAxLCAweDhjODQ3ZGYwLCAweDI0MDIwMDBiLCAKKzB4M2MwMTAwMDEsIDB4YWMyMjdkZDAsIDB4NjQxODI1LCAweDNjMDEwMDAxLCAKKzB4YWMyMzdlMjAsIDB4M2MwNTAwMDEsIDB4MjRhNTdkZTAsIDB4OGNhMjAwMDAsIAorMHgyYzQyNGUyMSwgMHgxMDQwMDA2ZiwgMHgyNDAyMDAwMiwgMHgzYzAyMDAwMSwgCisweDhjNDI3ZTEwLCAweDEwNDAwMDA1LCAweDAsIDB4MjQwMjAwMGMsIAorMHgzYzAxMDAwMSwgMHg4MDA1MDgzLCAweGFjMjI3ZGQwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjdlMDAsIDB4MTA0MDAwNmMsIDB4MCwgMHgzYzA0MDAwMSwgCisweDhjODQ3ZGRjLCAweDEwODAwMDVlLCAweDMwODIwMDA4LCAweDNjMDMwMDAxLCAKKzB4OGM2MzdkZWMsIDB4MTA2MjAwNjQsIDB4MjQwMjAwMDMsIDB4M2MwMTAwMDEsIAorMHhhYzI0N2UwOCwgMHhhY2EyMDAwMCwgMHgyNDAyMDAwNiwgMHgzYzAxMDAwMSwgCisweDgwMDUwODMsIDB4YWMyMjdkZDAsIDB4OGY4MjAyMDAsIDB4MzQ0MjAwMDIsIAorMHhhZjgyMDIwMCwgMHg4ZjgzMDA1NCwgMHgyNDAyMDAwZCwgMHgzYzAxMDAwMSwgCisweGFjMjI3ZGQwLCAweDNjMDEwMDAxLCAweGFjMjM3ZGY0LCAweDhmODMwMDU0LCAKKzB4M2MwMjAwMDEsIDB4OGM0MjdkZjQsIDB4MjQ2M2Q4ZjAsIDB4NDMxMDIzLCAKKzB4MmM0MjI3MTAsIDB4MTQ0MDAwM2EsIDB4MCwgMHgzYzAyMDAwMSwgCisweDhjNDI3ZTEwLCAweDEwNDAwMDI5LCAweDI0MDIwMDBlLCAweDNjMDMwMDAxLCAKKzB4OGM2MzdlMjQsIDB4M2MwMTAwMDEsIDB4MTQ2MDAwMTUsIDB4YWMyMjdkZDAsIAorMHhjMDA0M2RkLCAweDAsIDB4M2MwNTAwMDEsIDB4OGNhNTVjYzgsIAorMHhjMDA1MmEyLCAweDIwMjEsIDB4M2MwMzAwMDEsIDB4OGM2MzVjYzgsIAorMHgyNDAyMDAwNCwgMHgxNDYyMDAwNSwgMHgyNDAzZmZmYiwgMHgzYzAyMDAwMSwgCisweDhjNDI1Y2M0LCAweDgwMDUwNTIsIDB4MjQwM2ZmZjcsIDB4M2MwMjAwMDEsIAorMHg4YzQyNWNjNCwgMHg0MzEwMjQsIDB4M2MwMTAwMDEsIDB4YWMyMjVjYzQsIAorMHg4ZWUyMDAwMCwgMHgzYzAzMDIwMCwgMHg0MzEwMjUsIDB4YWVlMjAwMDAsIAorMHg4ZjgyMDIyNCwgMHgzYzAxMDAwMSwgMHhhYzIyN2UyYywgMHg4ZjgyMDIyMCwgCisweDI0MDNmZmZiLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgCisweDM0NDIwMDAyLCAweDgwMDUwODMsIDB4YWY4MjAyMjAsIDB4M2MwMjAwMDEsIAorMHg4YzQyN2UwMCwgMHgxMDQwMDAwNSwgMHgwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjdkZGMsIDB4MTA0MDAwMGYsIDB4MjQwMjAwMDIsIDB4M2MwMjAwMDEsIAorMHg4YzQyN2RlMCwgMHgyYzQyNGUyMSwgMHgxMDQwMDAwYSwgMHgyNDAyMDAwMiwgCisweDNjMDIwMDAxLCAweDhjNDI3ZTAwLCAweDEwNDAwMDBmLCAweDAsIAorMHgzYzAyMDAwMSwgMHg4YzQyN2RkYywgMHgxNDQwMDAwYiwgMHgwLCAKKzB4MjQwMjAwMDIsIDB4M2MwMTAwMDEsIDB4ODAwNTA4MywgMHhhYzIyN2RkMCwgCisweDNjMDIwMDAxLCAweDhjNDI3ZTAwLCAweDEwNDAwMDAzLCAweDAsIAorMHhjMDA0MjliLCAweDAsIDB4OGY4MjAyMjAsIDB4M2MwM2Y3MDAsIAorMHg0MzEwMjUsIDB4YWY4MjAyMjAsIDB4OGZiZjAwMTAsIDB4M2UwMDAwOCwgCisweDI3YmQwMDE4LCAweDNjMDMwMDAxLCAweDI0NjM3ZTI4LCAweDhjNjIwMDAwLCAKKzB4MTA0MDAwMDUsIDB4MzQ0MjIwMDAsIDB4M2MwMTAwMDEsIDB4YWMyMjdlMWMsIAorMHg4MDA1MDk1LCAweGFjNjAwMDAwLCAweDNjMDEwMDAxLCAweGFjMjQ3ZTFjLCAKKzB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmUwLCAweDMwODIwMDMwLCAKKzB4YWZiZjAwMTgsIDB4M2MwMTAwMDEsIDB4YWMyMjdlMjQsIDB4MTQ0MDAwNjcsIAorMHgzYzAyZmZmZiwgMHgzNDQyMWYwZSwgMHg4MjEwMjQsIDB4MTQ0MDAwNjEsIAorMHgyNDAyMDAzMCwgMHgzMDgyMjAwMCwgMHgxMDQwMDA1ZCwgMHgzMDgzODAwMCwgCisweDMxYTAyLCAweDMwODIwMDAxLCAweDIxMjAwLCAweDNjMDQwMDAxLCAKKzB4OGM4NDVkOWMsIDB4NjIxODI1LCAweDMzMWMyLCAweDNjMDMwMDAxLCAKKzB4MjQ2MzVkNzgsIDB4MzA4MjgwMDAsIDB4MjEyMDIsIDB4MzA4NDAwMDEsIAorMHg0MjIwMCwgMHg0NDEwMjUsIDB4MjM5YzIsIDB4NjEwODAsIAorMHg0MzEwMjEsIDB4NDcxMDIxLCAweDkwNDMwMDAwLCAweDI0MDIwMDAxLCAKKzB4MTA2MjAwMjUsIDB4MCwgMHgxMDYwMDAwNywgMHgyNDAyMDAwMiwgCisweDEwNjIwMDEzLCAweDI0MDIwMDAzLCAweDEwNjIwMDJjLCAweDNjMDUwMDBmLCAKKzB4ODAwNTBmOSwgMHgwLCAweDhmODIwMjAwLCAweDI0MDNmZWZmLCAKKzB4NDMxMDI0LCAweGFmODIwMjAwLCAweDhmODIwMjIwLCAweDNjMDNmZmZlLCAKKzB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmODIwMjIwLCAweDNjMDEwMDAxLCAKKzB4YWMyMDdlNDQsIDB4M2MwMTAwMDEsIDB4ODAwNTEwNCwgMHhhYzIwN2U0YywgCisweDhmODIwMjAwLCAweDM0NDIwMTAwLCAweGFmODIwMjAwLCAweDhmODIwMjIwLCAKKzB4M2MwM2ZmZmUsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmODIwMjIwLCAKKzB4MjQwMjAxMDAsIDB4M2MwMTAwMDEsIDB4YWMyMjdlNDQsIDB4M2MwMTAwMDEsIAorMHg4MDA1MTA0LCAweGFjMjA3ZTRjLCAweDhmODIwMjAwLCAweDI0MDNmZWZmLCAKKzB4NDMxMDI0LCAweGFmODIwMjAwLCAweDhmODIwMjIwLCAweDNjMDMwMDAxLCAKKzB4NDMxMDI1LCAweGFmODIwMjIwLCAweDNjMDEwMDAxLCAweGFjMjA3ZTQ0LCAKKzB4M2MwMTAwMDEsIDB4ODAwNTEwNCwgMHhhYzIzN2U0YywgMHg4ZjgyMDIwMCwgCisweDM0NDIwMTAwLCAweGFmODIwMjAwLCAweDhmODIwMjIwLCAweDNjMDMwMDAxLCAKKzB4NDMxMDI1LCAweGFmODIwMjIwLCAweDI0MDIwMTAwLCAweDNjMDEwMDAxLCAKKzB4YWMyMjdlNDQsIDB4M2MwMTAwMDEsIDB4ODAwNTEwNCwgMHhhYzIzN2U0YywgCisweDM0YTVmZmZmLCAweDNjMDQwMDAxLCAweDI0ODQ1YmI4LCAweGFmYTMwMDEwLCAKKzB4YzAwMjQwMywgMHhhZmEwMDAxNCwgMHg4MDA1MTA0LCAweDAsIAorMHgyNDAyMDAzMCwgMHgzYzAxMDAwMSwgMHhhYzIyN2UyOCwgMHg4ZmJmMDAxOCwgCisweDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MCwgMHgyN2JkZmZjOCwgCisweGFmYjIwMDI4LCAweDgwOTAyMSwgMHhhZmIzMDAyYywgMHhhMDk4MjEsIAorMHhhZmIwMDAyMCwgMHhjMDgwMjEsIDB4M2MwNDAwMDEsIDB4MjQ4NDViZDAsIAorMHgzYzA1MDAwOSwgMHgzYzAyMDAwMSwgMHg4YzQyNWNjOCwgMHgzNGE1OTAwMSwgCisweDI0MDMwMjEsIDB4MjYwMzgyMSwgMHhhZmJmMDAzMCwgMHhhZmIxMDAyNCwgCisweGE3YTAwMDFhLCAweGFmYjAwMDE0LCAweGMwMDI0MDMsIDB4YWZhMjAwMTAsIAorMHgyNDAyMDAwMiwgMHgxMjYyMDA4MywgMHgyZTYyMDAwMywgMHgxMDQwMDAwNSwgCisweDI0MDIwMDAxLCAweDEyNjIwMDBhLCAweDAsIDB4ODAwNTI5YiwgCisweDAsIDB4MjQwMjAwMDQsIDB4MTI2MjAwZmEsIDB4MjQwMjAwMDgsIAorMHgxMjYyMDBmOSwgMHgzYzAyZmZlYywgMHg4MDA1MjliLCAweDAsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWNjNCwgMHgzMDQyMDAwMiwgMHgxNDQwMDAwNCwgCisweDEyODk0MCwgMHgzYzAyZmZmYiwgMHgzNDQyZmZmZiwgMHgyMDI4MDI0LCAKKzB4M2MwMTAwMDEsIDB4MzEwODIxLCAweGFjMzA3ZTNjLCAweDNjMDI0MDAwLCAKKzB4MjAyMTAyNCwgMHgxMDQwMDA0ZSwgMHgxMDIzYzIsIDB4MzA4NDAwMzAsIAorMHgxMDEzODIsIDB4MzA0MjAwMWMsIDB4M2MwMzAwMDEsIDB4MjQ2MzVkMDgsIAorMHg0MzEwMjEsIDB4ODIzODIxLCAweDNjMDIwMDIwLCAweDIwMjEwMjQsIAorMHgxMDQwMDAwNiwgMHgyNDAyMDEwMCwgMHgzYzAxMDAwMSwgMHgzMTA4MjEsIAorMHhhYzIyN2U0MCwgMHg4MDA1MTUwLCAweDNjMDIwMDgwLCAweDNjMDEwMDAxLCAKKzB4MzEwODIxLCAweGFjMjA3ZTQwLCAweDNjMDIwMDgwLCAweDIwMjEwMjQsIAorMHgxMDQwMDAwNiwgMHgxMjE5NDAsIDB4M2MwMjAwMDEsIDB4M2MwMTAwMDEsIAorMHgyMzA4MjEsIDB4ODAwNTE1YywgMHhhYzIyN2U0OCwgMHgxMjExNDAsIAorMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4YWMyMDdlNDgsIDB4OTRlNDAwMDAsIAorMHgzYzAzMDAwMSwgMHg4YzYzNWRiYywgMHgyNDAyMDAwNSwgMHgxMDYyMDAxMCwgCisweGE3YTQwMDE4LCAweDMyMDI0MDAwLCAweDEwNDAwMDAyLCAweDM0ODI0MDAwLCAKKzB4YTdhMjAwMTgsIDB4MjQwNDAwMDEsIDB4OTRlMjAwMDIsIDB4MjQwNTAwMDQsIAorMHgyNGU2MDAwMiwgMHgzNDQyMDAwMSwgMHhjMDA0OThlLCAweGE0ZTIwMDAyLCAKKzB4MjQwNDAwMDEsIDB4MjgyMSwgMHhjMDA0OThlLCAweDI3YTYwMDE4LCAKKzB4M2MwMjAwMDEsIDB4OGM0MjVjYzgsIDB4MjQxMTAwMDEsIDB4M2MwMTAwMDEsIAorMHhhYzMxNWNkNCwgMHgxNDUzMDAwNCwgMHgzMjAyODAwMCwgMHhjMDA0MjliLCAKKzB4MCwgMHgzMjAyODAwMCwgMHgxMDQwMDExZiwgMHgwLCAKKzB4YzAwNDI5YiwgMHgwLCAweDNjMDMwMDAxLCAweDhjNjM1ZGJjLCAKKzB4MjQwMjAwMDUsIDB4MTA2MjAxMTgsIDB4MjQwMjAwMDIsIDB4M2MwMTAwMDEsIAorMHhhYzMxNWNjYywgMHgzYzAxMDAwMSwgMHg4MDA1MjliLCAweGFjMjI1Y2M4LCAKKzB4MjQwNDAwMDEsIDB4MjQwNTAwMDQsIDB4MjdiMDAwMWEsIDB4YzAwNDk4ZSwgCisweDIwMDMwMjEsIDB4MjQwNDAwMDEsIDB4MjgyMSwgMHhjMDA0OThlLCAKKzB4MjAwMzAyMSwgMHgzYzAyMDAwMSwgMHg1MTEwMjEsIDB4OGM0MjdlMzQsIAorMHgzYzA0MDAwMSwgMHg4Yzg0NWNjOCwgMHgzYzAzYmZmZiwgMHgzNDYzZmZmZiwgCisweDNjMDEwMDAxLCAweGFjMzM1Y2Q0LCAweDQzMTAyNCwgMHgzYzAxMDAwMSwgCisweDMxMDgyMSwgMHgxMDkzMDBmYSwgMHhhYzIyN2UzNCwgMHg4MDA1MjliLCAKKzB4MCwgMHgzYzAyMjAwMCwgMHgyMDIxMDI0LCAweDEwNDAwMDA1LCAKKzB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjVkOTgsIDB4ODAwNTFhZCwgCisweDEyODk0MCwgMHgzYzAxMDAwMSwgMHhhYzIwNWQ5OCwgMHgxMjg5NDAsIAorMHgzYzAxMDAwMSwgMHgzMTA4MjEsIDB4YWMzMDdlMzgsIDB4M2MwMjQwMDAsIAorMHgyMDIxMDI0LCAweDE0NDAwMDE2LCAweDAsIDB4M2MwMjAwMDEsIAorMHg4YzQyNWQ5OCwgMHgxMDQwMDAwOCwgMHgyNDA0MDAwNCwgMHgyNDA1MDAwMSwgCisweGMwMDRkOTMsIDB4MjQwNjIwMDAsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIAorMHgzNzA4MjEsIDB4YWMyMjgzYWMsIDB4M2MwMjAwMDEsIDB4NTExMDIxLCAKKzB4OGM0MjdlMzAsIDB4M2MwM2JmZmYsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAKKzB4M2MwMTAwMDEsIDB4MzEwODIxLCAweDgwMDUyOTksIDB4YWMyMjdlMzAsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWQ5OCwgMHgxMDQwMDAyOCwgMHgzYzAzMDBhMCwgCisweDIwMzEwMjQsIDB4NTQ0MzAwMGQsIDB4M2MwMjAwMjAsIDB4M2MwMjAwMDEsIAorMHg4YzQyNWQ5YywgMHgyNDAzMDEwMCwgMHgzYzAxMDAwMSwgMHgzMTA4MjEsIAorMHhhYzIzN2U0NCwgMHgzYzAzMDAwMSwgMHgzYzAxMDAwMSwgMHgzMTA4MjEsIAorMHhhYzIzN2U0YywgMHg4MDA1MWYwLCAweDM0NDIwNDAwLCAweDIwMjEwMjQsIAorMHgxMDQwMDAwOCwgMHgyNDAzMDEwMCwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ5YywgCisweDNjMDEwMDAxLCAweDMxMDgyMSwgMHhhYzIzN2U0NCwgMHg4MDA1MWYwLCAKKzB4MzQ0MjA4MDAsIDB4M2MwMjAwODAsIDB4MjAyMTAyNCwgMHgxMDQwMDAyZSwgCisweDNjMDMwMDAxLCAweDNjMDIwMDAxLCAweDhjNDI1ZDljLCAweDNjMDEwMDAxLCAKKzB4MzEwODIxLCAweGFjMjM3ZTRjLCAweDM0NDIwYzAwLCAweDNjMDEwMDAxLCAKKzB4YWMyMjVkOWMsIDB4ODAwNTIxOCwgMHgyNDA0MDAwMSwgMHgzYzAyMDAyMCwgCisweDIwMjEwMjQsIDB4MTA0MDAwMDYsIDB4MjQwMjAxMDAsIDB4M2MwMTAwMDEsIAorMHgzMTA4MjEsIDB4YWMyMjdlNDQsIDB4ODAwNTIwMSwgMHgzYzAyMDA4MCwgCisweDNjMDEwMDAxLCAweDMxMDgyMSwgMHhhYzIwN2U0NCwgMHgzYzAyMDA4MCwgCisweDIwMjEwMjQsIDB4MTA0MDAwMDcsIDB4MTIxOTQwLCAweDNjMDIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4MjMwODIxLCAweGFjMjI3ZTRjLCAweDgwMDUyMGYsIAorMHgyNDA0MDAwMSwgMHgxMjExNDAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAKKzB4YWMyMDdlNGMsIDB4MjQwNDAwMDEsIDB4MjgyMSwgMHgyN2IwMDAxZSwgCisweGMwMDQ5NGMsIDB4MjAwMzAyMSwgMHgyNDA0MDAwMSwgMHgyODIxLCAKKzB4YzAwNDk0YywgMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAweDI0MDUwMDAxLCAKKzB4MjdiMDAwMWMsIDB4YzAwNDk0YywgMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAKKzB4MjQwNTAwMDEsIDB4YzAwNDk0YywgMHgyMDAzMDIxLCAweDgwMDUyOTksIAorMHgwLCAweDNjMDJmZmVjLCAweDM0NDJmZmZmLCAweDIwMjgwMjQsIAorMHgzYzAyMDAwOCwgMHgyMDI4MDI1LCAweDEyMTE0MCwgMHgzYzAxMDAwMSwgCisweDIyMDgyMSwgMHhhYzMwN2UzOCwgMHgzYzAyMjAwMCwgMHgyMDIxMDI0LCAKKzB4MTA0MDAwMDksIDB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ3NCwgCisweDE0NDAwMDA1LCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI1ZDk4LCAKKzB4ODAwNTIzYSwgMHgzYzAyNDAwMCwgMHgzYzAxMDAwMSwgMHhhYzIwNWQ5OCwgCisweDNjMDI0MDAwLCAweDIwMjEwMjQsIDB4MTQ0MDAwMWUsIDB4MCwgCisweDNjMDIwMDAxLCAweDhjNDI1ZDk4LCAweDNjMDEwMDAxLCAweGFjMjA1Y2UwLCAKKzB4MTA0MDAwMDcsIDB4MjQwMjIwMjAsIDB4M2MwMTAwMDEsIDB4YWMyMjVkOWMsIAorMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjgzYWMsIAorMHgzYzA0YmZmZiwgMHgxMjE5NDAsIDB4M2MwMjAwMDEsIDB4NDMxMDIxLCAKKzB4OGM0MjdlMzAsIDB4M2MwNTAwMDEsIDB4OGNhNTVjYzgsIDB4MzQ4NGZmZmYsIAorMHg0NDEwMjQsIDB4M2MwMTAwMDEsIDB4MjMwODIxLCAweGFjMjI3ZTMwLCAKKzB4MjQwMjAwMDEsIDB4MTBhMjAwNDQsIDB4MCwgMHg4MDA1Mjk5LCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ5OCwgMHgxMDQwMDAxYywgCisweDI0MDIyMDAwLCAweDNjMDEwMDAxLCAweGFjMjI1ZDljLCAweDNjMDMwMGEwLCAKKzB4MjAzMTAyNCwgMHgxNDQzMDAwNSwgMHgxMjExNDAsIDB4MzQwMmEwMDAsIAorMHgzYzAxMDAwMSwgMHg4MDA1Mjk0LCAweGFjMjI1ZDljLCAweDNjMDMwMDAxLCAKKzB4NjIxODIxLCAweDhjNjM3ZTM4LCAweDNjMDIwMDIwLCAweDYyMTAyNCwgCisweDEwNDAwMDA0LCAweDI0MDIyMDAxLCAweDNjMDEwMDAxLCAweDgwMDUyOTQsIAorMHhhYzIyNWQ5YywgMHgzYzAyMDA4MCwgMHg2MjEwMjQsIDB4MTA0MDAwMWYsIAorMHgzNDAyYTAwMSwgMHgzYzAxMDAwMSwgMHg4MDA1Mjk0LCAweGFjMjI1ZDljLCAKKzB4M2MwMjAwMjAsIDB4MjAyMTAyNCwgMHgxMDQwMDAwNywgMHgxMjE5NDAsIAorMHgyNDAyMDEwMCwgMHgzYzAxMDAwMSwgMHgyMzA4MjEsIDB4YWMyMjdlNDQsIAorMHg4MDA1Mjg4LCAweDNjMDIwMDgwLCAweDEyMTE0MCwgMHgzYzAxMDAwMSwgCisweDIyMDgyMSwgMHhhYzIwN2U0NCwgMHgzYzAyMDA4MCwgMHgyMDIxMDI0LCAKKzB4MTA0MDAwMDYsIDB4MTIxOTQwLCAweDNjMDIwMDAxLCAweDNjMDEwMDAxLCAKKzB4MjMwODIxLCAweDgwMDUyOTQsIDB4YWMyMjdlNGMsIDB4MTIxMTQwLCAKKzB4M2MwMTAwMDEsIDB4MjIwODIxLCAweGFjMjA3ZTRjLCAweDNjMDMwMDAxLCAKKzB4OGM2MzVjYzgsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMDMsIDB4MCwgCisweGMwMDQyOWIsIDB4MCwgMHg4ZmJmMDAzMCwgMHg4ZmIzMDAyYywgCisweDhmYjIwMDI4LCAweDhmYjEwMDI0LCAweDhmYjAwMDIwLCAweDNlMDAwMDgsIAorMHgyN2JkMDAzOCwgMHgyN2JkZmZkOCwgMHhhZmIyMDAyMCwgMHg4MDkwMjEsIAorMHhhZmIxMDAxYywgMHg4ODIxLCAweDI0MDIwMDAyLCAweGFmYmYwMDI0LCAKKzB4YWZiMDAwMTgsIDB4YTdhMDAwMTIsIDB4MTBhMjAwZDMsIDB4YTdhMDAwMTAsIAorMHgyY2EyMDAwMywgMHgxMDQwMDAwNSwgMHgyNDAyMDAwMSwgMHgxMGEyMDAwYSwgCisweDEyODE0MCwgMHg4MDA1MzgwLCAweDIyMDEwMjEsIDB4MjQwMjAwMDQsIAorMHgxMGEyMDA3ZCwgMHgyNDAyMDAwOCwgMHgxMGEyMDA3YywgMHgxMjI5NDAsIAorMHg4MDA1MzgwLCAweDIyMDEwMjEsIDB4M2MwMzAwMDEsIDB4NzAxODIxLCAKKzB4OGM2MzdlM2MsIDB4M2MwMjQwMDAsIDB4NjIxMDI0LCAweDE0NDAwMDA5LCAKKzB4MjQwNDAwMDEsIDB4M2MwMjdmZmYsIDB4MzQ0MmZmZmYsIDB4NjI4ODI0LCAKKzB4M2MwMTAwMDEsIDB4MzAwODIxLCAweGFjMzE3ZTM0LCAweDgwMDUzODAsIAorMHgyMjAxMDIxLCAweDI0MDUwMDAxLCAweGMwMDQ5NGMsIDB4MjdhNjAwMTAsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAwMSwgMHhjMDA0OTRjLCAweDI3YTYwMDEwLCAKKzB4OTdhMjAwMTAsIDB4MzA0MjAwMDQsIDB4MTA0MDAwMzQsIDB4M2MxMTQwMDAsIAorMHgzYzAyMDAwMSwgMHg4YzQyNWRiYywgMHgyNDQzZmZmZiwgMHgyYzYyMDAwNiwgCisweDEwNDAwMDM0LCAweDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgCisweDhjMjI1YmUwLCAweDQwMDAwOCwgMHgwLCAweDI0MDQwMDAxLCAKKzB4MjQwNTAwMTEsIDB4MjdiMDAwMTIsIDB4YzAwNDk0YywgMHgyMDAzMDIxLCAKKzB4MjQwNDAwMDEsIDB4MjQwNTAwMTEsIDB4YzAwNDk0YywgMHgyMDAzMDIxLCAKKzB4OTdhNTAwMTIsIDB4MzBhMjQwMDAsIDB4MTA0MDAwMDIsIDB4M2MwNDAwMTAsIAorMHgzYzA0MDAwOCwgMHgzYzAzMDAwMSwgMHg4MDA1MzAxLCAweDMwYTI4MDAwLCAKKzB4MjQwNDAwMDEsIDB4MjQwNTAwMTQsIDB4MjdiMDAwMTIsIDB4YzAwNDk0YywgCisweDIwMDMwMjEsIDB4MjQwNDAwMDEsIDB4MjQwNTAwMTQsIDB4YzAwNDk0YywgCisweDIwMDMwMjEsIDB4OTdhNTAwMTIsIDB4MzBhMjEwMDAsIDB4MTA0MDAwMDIsIAorMHgzYzA0MDAxMCwgMHgzYzA0MDAwOCwgMHgzYzAzMDAwMSwgMHgzMGEyMDgwMCwgCisweDU0NDAwMDAxLCAweDNjMDMwMDAyLCAweDNjMDI4MDAwLCAweDIyMjEwMjUsIAorMHg2NDE4MjUsIDB4ODAwNTMwZSwgMHg0Mzg4MjUsIDB4M2MxMTAwMDEsIAorMHgyMzA4ODIxLCAweDhlMzE3ZTNjLCAweDNjMDI3ZmZmLCAweDM0NDJmZmZmLCAKKzB4MjIyODgyNCwgMHgzYzAyMDAwMSwgMHg4YzQyNWNkOCwgMHgxMDQwMDAxZCwgCisweDEyMTE0MCwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ5OCwgMHgxMDQwMDAwMiwgCisweDNjMDIyMDAwLCAweDIyMjg4MjUsIDB4MTIxMTQwLCAweDNjMDEwMDAxLCAKKzB4MjIwODIxLCAweDhjMjI3ZTQwLCAweDEwNDAwMDAzLCAweDNjMDIwMDIwLCAKKzB4ODAwNTMyMiwgMHgyMjI4ODI1LCAweDNjMDJmZmRmLCAweDM0NDJmZmZmLCAKKzB4MjIyODgyNCwgMHgxMjExNDAsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAKKzB4OGMyMjdlNDgsIDB4MTA0MDAwMDMsIDB4M2MwMjAwODAsIDB4ODAwNTMyZCwgCisweDIyMjg4MjUsIDB4M2MwMmZmN2YsIDB4MzQ0MmZmZmYsIDB4MjIyODgyNCwgCisweDEyMTE0MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4YWMzMTdlMzQsIAorMHg4MDA1MzgwLCAweDIyMDEwMjEsIDB4MTIyOTQwLCAweDNjMDMwMDAxLCAKKzB4NjUxODIxLCAweDhjNjM3ZTM4LCAweDNjMDI0MDAwLCAweDYyMTAyNCwgCisweDE0NDAwMDA4LCAweDNjMDI3ZmZmLCAweDM0NDJmZmZmLCAweDYyODgyNCwgCisweDNjMDEwMDAxLCAweDI1MDgyMSwgMHhhYzMxN2UzMCwgMHg4MDA1MzgwLCAKKzB4MjIwMTAyMSwgMHgzYzAyMDAwMSwgMHg4YzQyNWNkOCwgMHgxMDQwMDAzMywgCisweDNjMTFjMDBjLCAweDNjMDIwMDAxLCAweDhjNDI1ZDc0LCAweDNjMDRjMDBjLCAKKzB4MzQ4NDIwMDAsIDB4M2MwMzAwMDEsIDB4OGM2MzVkOTgsIDB4MjEwMmIsIAorMHgyMTAyMywgMHg0NDEwMjQsIDB4MTA2MDAwMDMsIDB4NTE4ODI1LCAKKzB4M2MwMjIwMDAsIDB4MjIyODgyNSwgMHgzYzAyMDAwMSwgMHg0NTEwMjEsIAorMHg4YzQyN2U0NCwgMHgxMDQwMDAwMywgMHgzYzAyMDAyMCwgMHg4MDA1MzVkLCAKKzB4MjIyODgyNSwgMHgzYzAyZmZkZiwgMHgzNDQyZmZmZiwgMHgyMjI4ODI0LCAKKzB4MTIxMTQwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyN2U0YywgCisweDEwNDAwMDAzLCAweDNjMDIwMDgwLCAweDgwMDUzNjgsIDB4MjIyODgyNSwgCisweDNjMDJmZjdmLCAweDM0NDJmZmZmLCAweDIyMjg4MjQsIDB4M2MwMjAwMDEsIAorMHg4YzQyNWQ2MCwgMHgxMDQwMDAwMiwgMHgzYzAyMDgwMCwgMHgyMjI4ODI1LCAKKzB4M2MwMjAwMDEsIDB4OGM0MjVkNjQsIDB4MTA0MDAwMDIsIDB4M2MwMjA0MDAsIAorMHgyMjI4ODI1LCAweDNjMDIwMDAxLCAweDhjNDI1ZDY4LCAweDEwNDAwMDA2LCAKKzB4M2MwMjAxMDAsIDB4ODAwNTM3YiwgMHgyMjI4ODI1LCAweDNjMDI3ZmZmLCAKKzB4MzQ0MmZmZmYsIDB4NjI4ODI0LCAweDEyMTE0MCwgMHgzYzAxMDAwMSwgCisweDIyMDgyMSwgMHhhYzMxN2UzMCwgMHgyMjAxMDIxLCAweDhmYmYwMDI0LCAKKzB4OGZiMjAwMjAsIDB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgCisweDI3YmQwMDI4LCAweDI3YmRmZmQ4LCAweGFmYjQwMDIwLCAweDgwYTAyMSwgCisweGFmYmYwMDI0LCAweGFmYjMwMDFjLCAweGFmYjIwMDE4LCAweGFmYjEwMDE0LCAKKzB4YWZiMDAwMTAsIDB4OGY5MDAyMDAsIDB4M2MwMzAwMDEsIDB4OGM2MzVjYzgsIAorMHg4ZjkzMDIyMCwgMHgyNDAyMDAwMiwgMHgxMDYyMDA2MywgMHgyYzYyMDAwMywgCisweDEwNDAwMDA1LCAweDI0MDIwMDAxLCAweDEwNjIwMDBhLCAweDE0MTk0MCwgCisweDgwMDU0NDgsIDB4MCwgMHgyNDAyMDAwNCwgMHgxMDYyMDA1YSwgCisweDI0MDIwMDA4LCAweDEwNjIwMDU5LCAweDE0OTE0MCwgMHg4MDA1NDQ4LCAKKzB4MCwgMHgzYzA0MDAwMSwgMHg4MzIwMjEsIDB4OGM4NDdlM2MsIAorMHgzYzExMDAwMSwgMHgyMjM4ODIxLCAweDhlMzE3ZTM0LCAweDNjMDI0MDAwLCAKKzB4ODIxMDI0LCAweDEwNDAwMDNlLCAweDNjMDIwMDA4LCAweDIyMjEwMjQsIAorMHgxMDQwMDAyMCwgMHgzNjEwMDAwMiwgMHgzYzAyMDAwMSwgMHg0MzEwMjEsIAorMHg4YzQyN2U0MCwgMHgxMDQwMDAwNSwgMHgzNjEwMDAyMCwgMHgzNjEwMDEwMCwgCisweDNjMDIwMDIwLCAweDgwMDUzYmQsIDB4MjIyODgyNSwgMHgyNDAyZmVmZiwgCisweDIwMjgwMjQsIDB4M2MwMmZmZGYsIDB4MzQ0MmZmZmYsIDB4MjIyODgyNCwgCisweDE0MTE0MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjdlNDgsIAorMHgxMDQwMDAwNSwgMHgzYzAyMDAwMSwgMHgyNjI5ODI1LCAweDNjMDIwMDgwLCAKKzB4ODAwNTNkYywgMHgyMjI4ODI1LCAweDNjMDJmZmZlLCAweDM0NDJmZmZmLCAKKzB4MjYyOTgyNCwgMHgzYzAyZmY3ZiwgMHgzNDQyZmZmZiwgMHg4MDA1M2RjLCAKKzB4MjIyODgyNCwgMHgyNDAyZmVkZiwgMHgyMDI4MDI0LCAweDNjMDJmZmZlLCAKKzB4MzQ0MmZmZmYsIDB4MjYyOTgyNCwgMHgzYzAyZmY1ZiwgMHgzNDQyZmZmZiwgCisweDIyMjg4MjQsIDB4M2MwMTAwMDEsIDB4MjMwODIxLCAweGFjMjA3ZTQwLCAKKzB4M2MwMTAwMDEsIDB4MjMwODIxLCAweGFjMjA3ZTQ4LCAweGMwMDQ4NmEsIAorMHgwLCAweGFmOTAwMjAwLCAweGFmOTMwMjIwLCAweDhmODIwMjIwLCAKKzB4MjQwM2ZmZmIsIDB4NDMxMDI0LCAweGFmODIwMjIwLCAweDhmODIwMjIwLCAKKzB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsIDB4ODAwNTNmMywgMHgxNDExNDAsIAorMHg4ZjgyMDIwMCwgMHgyNDAzZmZmZCwgMHg0MzEwMjQsIDB4YzAwNDg2YSwgCisweGFmODIwMjAwLCAweDNjMDJiZmZmLCAweDM0NDJmZmZmLCAweGMwMDQyOWIsIAorMHgyMjI4ODI0LCAweDE0MTE0MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIAorMHg4MDA1NDQ4LCAweGFjMzE3ZTM0LCAweDE0OTE0MCwgMHgzYzA0MDAwMSwgCisweDkyMjAyMSwgMHg4Yzg0N2UzOCwgMHgzYzExMDAwMSwgMHgyMzI4ODIxLCAKKzB4OGUzMTdlMzAsIDB4M2MwMjQwMDAsIDB4ODIxMDI0LCAweDE0NDAwMDExLCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNWQ5OCwgMHgxNDQwMDAwNiwgCisweDNjMDJiZmZmLCAweDhmODIwMjAwLCAweDM0NDIwMDAyLCAweGMwMDQ4NmEsIAorMHhhZjgyMDIwMCwgMHgzYzAyYmZmZiwgMHgzNDQyZmZmZiwgMHhjMDA0MjliLCAKKzB4MjIyODgyNCwgMHgzYzAxMDAwMSwgMHgzMjA4MjEsIDB4ODAwNTQ0OCwgCisweGFjMzE3ZTMwLCAweDNjMDIwMDAxLCAweDhjNDI1ZDk4LCAweDEwNDAwMDA1LCAKKzB4M2MwMjAwMjAsIDB4M2MwMjAwMDEsIDB4OGM0MjVkNzQsIDB4MTA0MDAwMmIsIAorMHgzYzAyMDAyMCwgMHg4MjEwMjQsIDB4MTA0MDAwMDcsIDB4MzYxMDAwMjAsIAorMHgyNDAyMDEwMCwgMHgzYzAxMDAwMSwgMHgzMjA4MjEsIDB4YWMyMjdlNDQsIAorMHg4MDA1NDI4LCAweDM2MTAwMTAwLCAweDNjMDEwMDAxLCAweDMyMDgyMSwgCisweGFjMjA3ZTQ0LCAweDI0MDJmZWZmLCAweDIwMjgwMjQsIDB4M2MwMjAwODAsIAorMHg4MjEwMjQsIDB4MTA0MDAwMDcsIDB4MTQxOTQwLCAweDNjMDIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4MjMwODIxLCAweGFjMjI3ZTRjLCAweDgwMDU0MzksIAorMHgyNjI5ODI1LCAweDE0MTE0MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIAorMHhhYzIwN2U0YywgMHgzYzAyZmZmZSwgMHgzNDQyZmZmZiwgMHgyNjI5ODI0LCAKKzB4YzAwNDg2YSwgMHgwLCAweGFmOTAwMjAwLCAweGFmOTMwMjIwLCAKKzB4OGY4MjAyMjAsIDB4MjQwM2ZmZmIsIDB4NDMxMDI0LCAweGFmODIwMjIwLCAKKzB4OGY4MjAyMjAsIDB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsIDB4MTQxMTQwLCAKKzB4M2MwMTAwMDEsIDB4MjIwODIxLCAweGFjMzE3ZTMwLCAweDhmYmYwMDI0LCAKKzB4OGZiNDAwMjAsIDB4OGZiMzAwMWMsIDB4OGZiMjAwMTgsIDB4OGZiMTAwMTQsIAorMHg4ZmIwMDAxMCwgMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDAgfTsKK3N0YXRpYyB1MzIgdGlnb25Gd1JvZGF0YVsoTUFYX1JPREFUQV9MRU4vNCkgKyAxXSBfX2luaXRkYXRhID0geworMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsIAorMHgyZjY2Nzc2ZCwgMHg2MTY5NmUyZSwgMHg2MzJjNzYyMCwgMHgzMTJlMzEyZSwgCisweDMyMmUzMTMxLCAweDIwMzEzOTM5LCAweDM4MmYzMDM0LCAweDJmMzIzNzIwLCAKKzB4MzIzMjNhMzEsIDB4MzMzYTM0MzIsIDB4MjA3MzY4NzUsIDB4NjE2ZTY3MjAsIAorMHg0NTc4NzAyMCwgMHgyNDAwMDAwMCwgMHg3NDY4NjU1ZiwgMHg0NDQxNTc0ZSwgCisweDAsIDB4NTM1NDQxNDMsIDB4NGI1ZjMxMjAsIDB4MCwgCisweDQyNjE2NDUzLCAweDZlNjQ1MjZlLCAweDY3MDAwMDAwLCAweDNmNDU2ZTcxLCAKKzB4NDU3Njc0MDAsIDB4M2Y2ZTZmNTEsIDB4NjQ0NTc2NTAsIDB4MCwgCisweDY1NzY1MjZlLCAweDY3NDY3NTZjLCAweDZjMDAwMDAwLCAweDQ5NmM2YzQzLCAKKzB4NmY2ZTY2NTIsIDB4NzgwMDAwMDAsIDB4NTM2NTZlNjQsIDB4NDM2YjUzNzUsIAorMHg2ZDAwMDAwMCwgMHg1MjY1NjM3NiwgMHg1NjZjNjE2ZSwgMHgwLCAKKzB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsIAorMHgyZjc0Njk2ZCwgMHg2NTcyMmU2MywgMHgyYzc2MjAzMSwgMHgyZTMxMmUzMiwgCisweDJlMzgyMDMxLCAweDM5MzkzODJmLCAweDMwMzcyZjMzLCAweDMxMjAzMTM3LCAKKzB4M2EzNTM4M2EsIDB4MzQzNTIwNzMsIDB4Njg3NTYxNmUsIDB4NjcyMDQ1NzgsIAorMHg3MDIwMjQwMCwgMHg1NDJkNDQ2ZCwgMHg2MTUyNjQzMSwgMHgwLCAKKzB4NTQyZDQ0NmQsIDB4NjE0MjQyMDAsIDB4NTQyZDQ0NmQsIDB4NjEzMjAwMDAsIAorMHgzZjZlNmY1MSwgMHg2NDU0Nzg0NSwgMHgwLCAweDNmNmU2ZjUxLCAKKzB4NjQ1Mjc4NDUsIDB4MCwgMHg2NTZlNzE0ZCwgMHg0NTc2NTA0NiwgCisweDYxNjk2YzAwLCAweDY1NmU3MTRkLCAweDQ1NzY0NjYxLCAweDY5NmMwMDAwLCAKKzB4NjY2MTY5NmMsIDB4NDU2ZTQ1NGQsIDB4MCwgMHgzZjQ1NmU3MSwgCisweDQ1NzY3NDAwLCAweDNmNmU2ZjUxLCAweDY0NDU3NjUwLCAweDAsIAorMHg2NTc2NTI2ZSwgMHg2NzQ2NzU2YywgMHg2YzAwMDAwMCwgMHgwLCAKKzB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsIAorMHgyZjYzNmY2ZCwgMHg2ZDYxNmU2NCwgMHgyZTYzMmM3NiwgMHgyMDMxMmUzMSwgCisweDJlMzIyZTMxLCAweDMwMjAzMTM5LCAweDM5MzgyZjMxLCAweDMxMmYzMTM4LCAKKzB4MjAzMTM3M2EsIDB4MzEzMTNhMzEsIDB4MzgyMDczNjgsIDB4NzU2MTZlNjcsIAorMHgyMDQ1Nzg3MCwgMHgyMDI0MDAwMCwgMHgzZjRkNjI2ZiwgMHg3ODQ1NzY3NCwgCisweDAsIDB4NGU0ZjYzNmYsIDB4NmQ2MTZlNjQsIDB4MCwgCisweDY4NzM3NDY1LCAweDVmNDU1MjUyLCAweDAsIDB4NDEyZDQ1NzIsIAorMHg3MjQyNzU2MywgMHgwLCAweDQ1NTI1MjRmLCAweDUyMmQ0MTY0LCAKKzB4NjQwMDAwMDAsIDB4NjU2ZTcxNGQsIDB4NDU3NjUwNDYsIDB4NjE2OTZjMDAsIAorMHg2NTZlNzE0ZCwgMHg0NTc2NDY2MSwgMHg2OTZjMDAwMCwgMHg2NjYxNjk2YywgCisweDQ1NmU0NTRkLCAweDAsIDB4NDQyZDQ1NzIsIDB4NzI0YzYxNzMsIAorMHg3NDAwMDAwMCwgMHg0NDJkNDU3MiwgMHg3MjMyMDAwMCwgMHg2ZDQzNzM3NCwgCisweDRkNjQ0NTUyLCAweDUyMDAwMDAwLCAweDcwNzI2ZjZkLCAweDRkNjQ0NTUyLCAKKzB4NTIwMDAwMDAsIDB4NDY2OTZjNzQsIDB4NGQ2NDQ1NTIsIDB4NTIwMDAwMDAsIAorMHg2MzZkNjQ1ZiwgMHg0NTUyNTIwMCwgMHgzZjQ1NmU3MSwgMHg0NTc2NzQwMCwgCisweDNmNmU2ZjUxLCAweDY0NDU3NjUwLCAweDAsIDB4NjU3NjUyNmUsIAorMHg2NzQ2NzU2YywgMHg2YzAwMDAwMCwgMHgwLCAweDZlYTAsIAorMHg3ZmJjLCAweDZlMzgsIDB4ODczNCwgMHg4MmIwLCAKKzB4ODc4MCwgMHg4NzgwLCAweDZmNTQsIDB4NzY5NCwgCisweDdmMGMsIDB4ODBhOCwgMHg4MDc0LCAweDg3ODAsIAorMHg3ZTcwLCAweDgwY2MsIDB4NmU2NCwgMHg4MWNjLCAKKzB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsIAorMHgyZjY0NmQ2MSwgMHgyZTYzMmM3NiwgMHgyMDMxMmUzMSwgMHgyZTMyMmUzMywgCisweDIwMzEzOTM5LCAweDM4MmYzMDM0LCAweDJmMzIzNzIwLCAweDMyMzIzYTMxLCAKKzB4MzMzYTM0MzEsIDB4MjA3MzY4NzUsIDB4NjE2ZTY3MjAsIDB4NDU3ODcwMjAsIAorMHgyNDAwMDAwMCwgMHg2NDZkNjE3MiwgMHg2NDQxNTQ0ZSwgMHgwLCAKKzB4NjQ2ZDYxNzcsIDB4NzI0MTU0NGUsIDB4MCwgMHgwLCAKKzB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsIAorMHgyZjc0NzI2MSwgMHg2MzY1MmU2MywgMHgyYzc2MjAzMSwgMHgyZTMxMmUzMiwgCisweDJlMzIyMDMxLCAweDM5MzkzODJmLCAweDMwMzQyZjMyLCAweDM3MjAzMjMyLCAKKzB4M2EzMTMzM2EsIDB4MzUzMDIwNzMsIDB4Njg3NTYxNmUsIDB4NjcyMDQ1NzgsIAorMHg3MDIwMjQwMCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsIAorMHgyZjY0NjE3NCwgMHg2MTJlNjMyYywgMHg3NjIwMzEyZSwgMHgzMTJlMzIyZSwgCisweDMyMjAzMTM5LCAweDM5MzgyZjMwLCAweDM0MmYzMjM3LCAweDIwMzIzMjNhLCAKKzB4MzEzMzNhMzQsIDB4MzAyMDczNjgsIDB4NzU2MTZlNjcsIDB4MjA0NTc4NzAsIAorMHgyMDI0MDAwMCwgMHg0NjU3NWY1NiwgMHg0NTUyNTM0OSwgMHg0ZjRlM2EyMCwgCisweDIzMzEyMDQ2LCAweDcyNjkyMDQxLCAweDcwNzIyMDM3LCAweDIwMzEzNzNhLCAKKzB4MzUzNTNhMzQsIDB4MzgyMDUwNDQsIDB4NTQyMDMyMzAsIDB4MzAzMDAwMDAsIAorMHg0NjU3NWY0MywgMHg0ZjRkNTA0OSwgMHg0YzQ1NWY1NCwgMHg0OTRkNDUzYSwgCisweDIwMzEzNzNhLCAweDM1MzUzYTM0LCAweDM4MDAwMDAwLCAweDQ2NTc1ZjQzLCAKKzB4NGY0ZDUwNDksIDB4NGM0NTVmNDIsIDB4NTkzYTIwNjQsIDB4NjU3NjcyNjMsIAorMHg3MzAwMDAwMCwgMHg0NjU3NWY0MywgMHg0ZjRkNTA0OSwgMHg0YzQ1NWY0OCwgCisweDRmNTM1NDNhLCAweDIwNjM2ZjZkLCAweDcwNzU3NDY1LCAweDAsIAorMHg0NjU3NWY0MywgMHg0ZjRkNTA0OSwgMHg0YzQ1NWY0NCwgMHg0ZjRkNDE0OSwgCisweDRlM2EyMDY1LCAweDZlNjcyZTYxLCAweDYzNzQ2NTZmLCAweDZlMmU2MzZmLCAKKzB4NmQwMDAwMDAsIDB4NDY1NzVmNDMsIDB4NGY0ZDUwNDksIDB4NGM0NTUyM2EsIAorMHgyMDY3NjM2MywgMHgyMDc2NjU3MiwgMHg3MzY5NmY2ZSwgMHgyMDMyMmUzNywgCisweDJlMzIwMDAwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsIAorMHgyZjZkNjU2ZCwgMHgyZTYzMmM3NiwgMHgyMDMxMmUzMSwgMHgyZTMyMmUzMiwgCisweDIwMzEzOTM5LCAweDM4MmYzMDM0LCAweDJmMzIzNzIwLCAweDMyMzIzYTMxLCAKKzB4MzMzYTM0MzQsIDB4MjA3MzY4NzUsIDB4NjE2ZTY3MjAsIDB4NDU3ODcwMjAsIAorMHgyNDAwMDAwMCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsIAorMHgyZjczNjU2ZSwgMHg2NDJlNjMyYywgMHg3NjIwMzEyZSwgMHgzMTJlMzIyZSwgCisweDMxMzEyMDMxLCAweDM5MzkzODJmLCAweDMxMzIyZjMyLCAweDMyMjAzMTM3LCAKKzB4M2EzMTM3M2EsIDB4MzUzNTIwNzMsIDB4Njg3NTYxNmUsIDB4NjcyMDQ1NzgsIAorMHg3MDIwMjQwMCwgMHg3MzZlNjQ2NCwgMHg2NTRlNmY1MSwgMHgyMDAwMDAwMCwgCisweDZlNmY0NTRlLCAweDUxNWY1NDU4LCAweDAsIDB4NzM2ZTY0NjQsIAorMHg3NDRlNmY1MSwgMHgyMDAwMDAwMCwgMHgzZjZlNmY1MSwgMHg2NDU0Nzg0NSwgCisweDAsIDB4NzU2ZTZiNzIsIDB4NjQ3NDc5NzAsIDB4NjUwMDAwMDAsIAorMHgwLCAweGFjY2MsIDB4YWNjYywgMHhhZDljLCAKKzB4YWFiMCwgMHhhYWIwLCAweGFkOWMsIDB4YWQ5YywgCisweGFkOWMsIDB4YWQ5YywgMHhhZDljLCAweGFkOWMsIAorMHhhZDljLCAweGFkOWMsIDB4YWQ5YywgMHhhZDljLCAKKzB4YWQ5YywgMHhhZDljLCAweGFkOWMsIDB4YWQ3YywgCisweDAsIDB4YmNhOCwgMHhiY2E4LCAweGJkNzAsIAorMHhhZTRjLCAweGIwNTgsIDB4YmQ3MCwgMHhiZDcwLCAKKzB4YmQ3MCwgMHhiZDcwLCAweGJkNzAsIDB4YmQ3MCwgCisweGJkNzAsIDB4YmQ3MCwgMHhiZDcwLCAweGJkNzAsIAorMHhiZDcwLCAweGJkNzAsIDB4YmQ3MCwgMHhiZDU0LCAKKzB4YjA0MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzcyZjYzNmYsIDB4NmQ2ZDZmNmUsIAorMHgyZjcyNjU2MywgMHg3NjJlNjMyYywgMHg3NjIwMzEyZSwgMHgzMTJlMzIyZSwgCisweDMxMzkyMDMxLCAweDM5MzkzODJmLCAweDMwMzcyZjMyLCAweDM0MjAzMjMxLCAKKzB4M2EzMzMwM2EsIDB4MzAzNTIwNzMsIDB4Njg3NTYxNmUsIDB4NjcyMDQ1NzgsIAorMHg3MDIwMjQwMCwgMHg3MDZiNTI3OCwgMHg0NTUyNTIwMCwgMHg2NjcyNmQzMiwgCisweDRjNjE3MjY3LCAweDY1MDAwMDAwLCAweDcyNzg0ZTZmLCAweDUyNzg0MjY0LCAKKzB4MCwgMHg3Mjc4NTE0NCwgMHg2ZDYxNDQ0NiwgMHgwLCAKKzB4NzI3ODUxNDQsIDB4NmQ2MTQyNDYsIDB4MCwgMHgzZjZlNmY1MSwgCisweDY0NTI3ODQ1LCAweDAsIDB4NzA2YjUyNzgsIDB4NDU1MjUyNzMsIAorMHgwLCAweDY2NzI2ZDMyLCAweDRjNzI2NzUzLCAweDAsIAorMHg3Mjc4NGU2ZiwgMHg0MjY0NTMwMCwgMHgzZjcyNDI2NCwgMHg0NDZkNjE0NiwgCisweDAsIDB4M2Y3MjRhNDIsIDB4NjQ0NDZkNDYsIDB4MCwgCisweDAsIDB4ZjY3OCwgMHhmNjc4LCAweGY2NzgsIAorMHhmNjc4LCAweGY2NzgsIDB4ZjY3OCwgMHhmNjc4LCAKKzB4ZjY3OCwgMHhmNjc4LCAweGY2NzgsIDB4ZjY3OCwgCisweGY2NzgsIDB4ZjY3OCwgMHhmNjc4LCAweGY2NzgsIAorMHhmNjcwLCAweGY2NzAsIDB4ZjY3MCwgMHg1NzJkNDQ0ZCwgCisweDQxNDU2ZTQ2LCAweDAsIDB4MCwgMHhmZGMwLCAKKzB4MTAxNWMsIDB4ZmRkYywgMHgxMDE1YywgMHgxMDE1YywgCisweDEwMTVjLCAweDEwMTVjLCAweDEwMTVjLCAweDEwMTVjLCAKKzB4ZjcwNCwgMHgxMDE1YywgMHgxMDE1YywgMHgxMDE1YywgCisweDEwMTVjLCAweDEwMTVjLCAweDEwMTU0LCAweDEwMTU0LCAKKzB4MTAxNTQsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsIAorMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwgCisweDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MmY2MzZmLCAweDZkNmQ2ZjZlLCAKKzB4MmY2ZDYxNjMsIDB4MmU2MzJjNzYsIDB4MjAzMTJlMzEsIDB4MmUzMjJlMzEsIAorMHgzMjIwMzEzOSwgMHgzOTM4MmYzMCwgMHgzNDJmMzIzNywgMHgyMDMyMzIzYSwgCisweDMxMzMzYTM0LCAweDMyMjA3MzY4LCAweDc1NjE2ZTY3LCAweDIwNDU3ODcwLCAKKzB4MjAyNDAwMDAsIDB4NmQ2MTYzNzQsIDB4Nzg0MTU0NGUsIDB4MCwgCisweDRlNzQ1Mzc5LCAweDZlMjY0YzZiLCAweDAsIDB4NzI2NTZkNjEsIAorMHg3MzczNzI3NCwgMHgwLCAweDZjNjk2ZTZiLCAweDQ0NGY1NzRlLCAKKzB4MCwgMHg2NTZlNzE0ZCwgMHg0NTc2NTA0NiwgMHg2MTY5NmMwMCwgCisweDY1NmU3MTRkLCAweDQ1NzY0NjYxLCAweDY5NmMwMDAwLCAweDY2NjE2OTZjLCAKKzB4NDU2ZTQ1NGQsIDB4MCwgMHg2YzY5NmU2YiwgMHg1NTUwMDAwMCwgCisweDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsIAorMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwgCisweDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MmY2MzZmLCAweDZkNmQ2ZjZlLCAKKzB4MmY2MzZiNzMsIDB4NzU2ZDJlNjMsIDB4MmM3NjIwMzEsIDB4MmUzMTJlMzIsIAorMHgyZTMyMjAzMSwgMHgzOTM5MzgyZiwgMHgzMDM0MmYzMiwgMHgzNzIwMzIzMiwgCisweDNhMzEzMzNhLCAweDMzMzkyMDczLCAweDY4NzU2MTZlLCAweDY3MjA0NTc4LCAKKzB4NzAyMDI0MDAsIDB4NTA3MjZmNjIsIDB4NjU1MDY4NzksIDB4MCwgCisweDZjNmU2YjQxLCAweDUzNTM1MjU0LCAweDAsIDB4MTFiMmMsIAorMHgxMWJjNCwgMHgxMWJmOCwgMHgxMWMyYywgMHgxMWM1OCwgCisweDExYzZjLCAweDExY2E4LCAweDEyMDdjLCAweDExZGU0LCAKKzB4MTFlMjQsIDB4MTFlNTAsIDB4MTFlOTAsIDB4MTFlYzAsIAorMHgxMWVmYywgMHgxMWYzMCwgMHgxMjA3YywgMHgxMjJjMCwgCisweDEyMmQ4LCAweDEyMzAwLCAweDEyMzIwLCAweDEyMzQ4LCAKKzB4MTI0NzgsIDB4MTI0YTAsIDB4MTI0ZjQsIDB4MTI1MWMsIAorMHgwLCAweDEyNzhjLCAweDEyODVjLCAweDEyOTM0LCAKKzB4MTJhMDQsIDB4MTJhNjAsIDB4MTJiM2MsIDB4MTJiNjQsIAorMHgxMmM0MCwgMHgxMmM2OCwgMHgxMmUxMCwgMHgxMmUzOCwgCisweDEyZmUwLCAweDEzMWQ4LCAweDEzNDZjLCAweDEzMzgwLCAKKzB4MTM0NmMsIDB4MTM0OTgsIDB4MTMwMDgsIDB4MTMxYjAsIAorMHgwLCAweDEzYjg0LCAweDEzYmM4LCAweDEzYzYwLCAKKzB4MTNjYWMsIDB4MTNkMWMsIDB4MTNkYjQsIDB4MTNkZTgsIAorMHgxM2U3MCwgMHgxM2YwOCwgMHgxM2ZkOCwgMHgxNDAxOCwgCisweDE0MDljLCAweDE0MGMwLCAweDE0MWY0LCAweDY0NmY0MjYxLCAKKzB4NzM2NTUwNjcsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDczNzQ2ZDYxLCAweDYzNGM0ZTRiLCAweDAsIAorMHgwLCAweDE0YzM4LCAweDE0YzM4LCAweDE0YjgwLCAKKzB4MTRiYzQsIDB4MTRjMzgsIDB4MTRjMzgsIDB4MCwgCisweDAsIDB4MCB9Oworc3RhdGljIHUzMiB0aWdvbkZ3RGF0YVsoTUFYX0RBVEFfTEVOLzQpICsgMV0gX19pbml0ZGF0YSA9IHsKKzB4NDE2Yzc0NjUsIAorMHg2ZjZlMjA0MSwgMHg2MzY1NGU0OSwgMHg0MzIwNTYwMCwgMHg0MTZjNzQ2NSwgCisweDZmNmUyMDQxLCAweDYzNjU0ZTQ5LCAweDQzMjA1NjAwLCAweDQyNDI0MjQyLCAKKzB4MCwgMHgwLCAweDAsIDB4MTM1NDE4LCAKKzB4MTNlN2ZjLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4NjBjZjAwLCAKKzB4NjAsIDB4Y2YwMDAwMDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgzLCAweDAsIAorMHgxLCAweDAsIDB4MCwgMHgwLCAKKzB4MSwgMHgwLCAweDEsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDEsIAorMHgxLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDEwMDAwMDAsIDB4MjEwMDAwMDAsIAorMHgxMjAwMDE0MCwgMHgwLCAweDAsIDB4MjAwMDAwMDAsIAorMHgxMjAwMDBhMCwgMHgwLCAweDEyMDAwMDYwLCAweDEyMDAwMTgwLCAKKzB4MTIwMDAxZTAsIDB4MCwgMHgwLCAweDAsIAorMHgxLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MiwgCisweDAsIDB4MCwgMHgzMDAwMSwgMHgxLCAKKzB4MzAyMDEsIDB4MCwgMHgwLCAweDAgfTsKKyNlbmRpZgorLyogR2VuZXJhdGVkIGJ5IGdlbmZ3LmMgKi8KKyNkZWZpbmUgdGlnb24yRndSZWxlYXNlTWFqb3IgMHhjCisjZGVmaW5lIHRpZ29uMkZ3UmVsZWFzZU1pbm9yIDB4NAorI2RlZmluZSB0aWdvbjJGd1JlbGVhc2VGaXggMHhiCisjZGVmaW5lIHRpZ29uMkZ3U3RhcnRBZGRyIDB4MDAwMDQwMDAKKyNkZWZpbmUgdGlnb24yRndUZXh0QWRkciAweDAwMDA0MDAwCisjZGVmaW5lIHRpZ29uMkZ3VGV4dExlbiAweDExYmMwCisjZGVmaW5lIHRpZ29uMkZ3Um9kYXRhQWRkciAweDAwMDE1YmMwCisjZGVmaW5lIHRpZ29uMkZ3Um9kYXRhTGVuIDB4MTBkMAorI2RlZmluZSB0aWdvbjJGd0RhdGFBZGRyIDB4MDAwMTZjYzAKKyNkZWZpbmUgdGlnb24yRndEYXRhTGVuIDB4MWMwCisjZGVmaW5lIHRpZ29uMkZ3U2Jzc0FkZHIgMHgwMDAxNmU4MAorI2RlZmluZSB0aWdvbjJGd1Nic3NMZW4gMHhjYworI2RlZmluZSB0aWdvbjJGd0Jzc0FkZHIgMHgwMDAxNmY1MAorI2RlZmluZSB0aWdvbjJGd0Jzc0xlbiAweDIwYzAKK3N0YXRpYyB1MzIgdGlnb24yRndUZXh0WyhNQVhfVEVYVF9MRU4vNCkgKyAxXSBfX2luaXRkYXRhID0geworMHgwLCAKKzB4MTAwMDAwMDMsIDB4MCwgMHhkLCAweGQsIAorMHgzYzFkMDAwMSwgMHg4ZmJkNmQyMCwgMHgzYTBmMDIxLCAweDNjMTAwMDAwLCAKKzB4MjYxMDQwMDAsIDB4YzAwMTBjMCwgMHgwLCAweGQsIAorMHgzYzFkMDAwMSwgMHg4ZmJkNmQyNCwgMHgzYTBmMDIxLCAweDNjMTAwMDAwLCAKKzB4MjYxMDQwMDAsIDB4YzAwMTdlMCwgMHgwLCAweGQsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MjAwMDAwOCwgCisweDAsIDB4ODAwMTcyZiwgMHgzYzBhMDAwMSwgMHg4MDAxNzJmLCAKKzB4M2MwYTAwMDIsIDB4ODAwMTcyZiwgMHgwLCAweDgwMDJjYWMsIAorMHgwLCAweDgwMDJjNGYsIDB4MCwgMHg4MDAxNzJmLCAKKzB4M2MwYTAwMDQsIDB4ODAwMzI4YSwgMHgwLCAweDgwMDFhNTIsIAorMHgwLCAweDgwMDM5NGQsIDB4MCwgMHg4MDAzOGY0LCAKKzB4MCwgMHg4MDAxNzJmLCAweDNjMGEwMDA2LCAweDgwMDM5YmIsIAorMHgzYzBhMDAwNywgMHg4MDAxNzJmLCAweDNjMGEwMDA4LCAweDgwMDE3MmYsIAorMHgzYzBhMDAwOSwgMHg4MDAzYTEzLCAweDAsIDB4ODAwMmVhNiwgCisweDAsIDB4ODAwMTcyZiwgMHgzYzBhMDAwYiwgMHg4MDAxNzJmLCAKKzB4M2MwYTAwMGMsIDB4ODAwMTcyZiwgMHgzYzBhMDAwZCwgMHg4MDAyOGZiLCAKKzB4MCwgMHg4MDAyODkwLCAweDAsIDB4ODAwMTcyZiwgCisweDNjMGEwMDBlLCAweDgwMDIwOGMsIDB4MCwgMHg4MDAxOTY0LCAKKzB4MCwgMHg4MDAxYTA0LCAweDAsIDB4ODAwM2NhNiwgCisweDAsIDB4ODAwM2M5NCwgMHgwLCAweDgwMDE3MmYsIAorMHgwLCAweDgwMDE5MWEsIDB4MCwgMHg4MDAxNzJmLCAKKzB4MCwgMHg4MDAxNzJmLCAweDNjMGEwMDEzLCAweDgwMDE3MmYsIAorMHgzYzBhMDAxNCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MjdiZGZmZTAsIAorMHgzYzFjYzAwMCwgMHhhZmJmMDAxYywgMHhhZmIwMDAxOCwgMHg4ZjgyMDE0MCwgCisweDI0MDMwMDAzLCAweGFmODMwMGVjLCAweDM0NDIwMDA0LCAweGMwMDJiMjAsIAorMHhhZjgyMDE0MCwgMHgzYzAxMDBjMCwgMHhjMDAxNzYzLCAweGFjMjAzZmZjLCAKKzB4NDAxODIxLCAweDNjMDIwMDEwLCAweDNjMDEwMDAxLCAweGFjMjM2ZTljLCAKKzB4MTA2MjAwMTEsIDB4NDMxMDJiLCAweDE0NDAwMDAyLCAweDNjMDIwMDIwLCAKKzB4M2MwMjAwMDgsIDB4MTA2MjAwMGMsIDB4MjQwNTAxMDAsIDB4M2MwNjAwMDEsIAorMHg4Y2M2NmU5YywgMHgzYzA0MDAwMSwgMHgyNDg0NWM3NCwgMHgzODIxLCAKKzB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHgzYzAyMDAyMCwgCisweDNjMDEwMDAxLCAweGFjMjI2ZTljLCAweDI0MDIwMDA4LCAweDNjMDEwMDAxLCAKKzB4YWMyMjZlYjQsIDB4MjQwMjAwMWYsIDB4M2MwMTAwMDEsIDB4YWMyMjZlYzQsIAorMHgyNDAyMDAxNiwgMHgzYzAxMDAwMSwgMHhhYzIyNmU5OCwgMHgzYzA1ZmZmZSwgCisweDM0YTU2ZjA4LCAweDNjMDIwMDAxLCAweDhjNDI2ZTljLCAweDNjMDMwMDAyLCAKKzB4MjQ2MzkwMTAsIDB4M2MwNDAwMDEsIDB4OGM4NDZjYzQsIDB4NDMxMDIzLCAKKzB4MTQ4MDAwMDIsIDB4NDU4MDIxLCAweDI2MTBmYTM4LCAweDI0MDJmMDAwLCAKKzB4MjAyODAyNCwgMHhjMDAxNzg1LCAweDIwMDIwMjEsIDB4MjAyMjgyMywgCisweDNjMDQwMDIwLCAweDgyMTgyMywgMHg2NTE4MjMsIDB4MjQ3YmIwMDAsIAorMHgzYzAzZmZmZSwgMHgzNDYzYmYwOCwgMHgzNjNiODIxLCAweDNjMDYwMGJmLCAKKzB4MzRjNmYwMDAsIDB4M2MwNzAwMDEsIDB4OGNlNzZjYzAsIDB4M2MwMzAwYmYsIAorMHgzNDYzZTAwMCwgMHg4NTIwMjMsIDB4M2MwMTAwMDEsIDB4YWMyNDZlYTgsIAorMHg4MjIwMjMsIDB4M2MwMTAwMDEsIDB4YWMyNTZlOTAsIDB4NTI4NDIsIAorMHgzYzAxMDAwMSwgMHhhYzIyNmU4NCwgMHgyNzYyMGZmYywgMHgzYzAxMDAwMSwgCisweGFjMjI2ZDIwLCAweDI3NjIxZmZjLCAweGRiMzAyMywgMHg3YjE4MjMsIAorMHgzYzAxMDAwMSwgMHhhYzI0NmU4OCwgMHgzYzAxMDAwMSwgMHhhYzI1NmVhYywgCisweDNjMDEwMDAxLCAweGFjMjI2ZDI0LCAweGFmODYwMTUwLCAweDEwZTAwMDExLCAKKzB4YWY4MzAyNTAsIDB4M2MxZDAwMDEsIDB4OGZiZDZjY2MsIDB4M2EwZjAyMSwgCisweGMwMDE3NDksIDB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmNkMCwgCisweDNjMDMwMDAxLCAweDhjNjM2Y2Q0LCAweDI0NDJmZTAwLCAweDI0NjMwMjAwLCAKKzB4M2MwMTAwMDEsIDB4YWMyMjZjZDAsIDB4M2MwMTAwMDEsIDB4MTAwMDAwMDQsIAorMHhhYzIzNmNkNCwgMHgzYzFkMDAwMSwgMHg4ZmJkNmQyMCwgMHgzYTBmMDIxLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZjYzQsIDB4MTA0MDAwMGQsIDB4MjZmYWZhMzgsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmNkMCwgMHgzYzAzMDAwMSwgMHg4YzYzNmNkNCwgCisweDNjMWEwMDAxLCAweDhmNWE2Y2Q0LCAweDI0NDJmYTM4LCAweDI0NjMwNWM4LCAKKzB4M2MwMTAwMDEsIDB4YWMyMjZjZDAsIDB4M2MwMTAwMDEsIDB4YWMyMzZjZDQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmNjOCwgMHgxNDQwMDAwMywgMHgwLCAKKzB4M2MwMTAwMDEsIDB4YWMyMDZjZDAsIDB4YzAwMTE1MSwgMHgwLCAKKzB4OGZiZjAwMWMsIDB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyMCwgCisweDNjMDIwMDAxLCAweDhjNDI2Y2QwLCAweDNjMDMwMDAxLCAweDhjNjM2Y2Q0LCAKKzB4MjdiZGZmOTgsIDB4YWZiMDAwNDgsIDB4M2MxMDAwMDEsIDB4OGUxMDY2YjgsIAorMHhhZmIyMDA1MCwgMHgzYzEyMDAwMCwgMHgyNjUyNDEwMCwgMHhhZmJmMDA2MCwgCisweGFmYmUwMDVjLCAweGFmYjUwMDU4LCAweGFmYjMwMDU0LCAweGFmYjEwMDRjLCAKKzB4YWZhMjAwMzQsIDB4YWZhMzAwMzAsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIAorMHg4Zjg2MDA0MCwgMHgzYzA0MDAwMSwgMHgyNDg0NWM4MCwgMHgyNDA1MDIwMCwgCisweDNjMDEwMDAxLCAweGFjMzI2ZTgwLCAweGMwMDJiM2IsIDB4MjAwMzgyMSwgCisweDhmODMwMDQwLCAweDNjMDJmMDAwLCAweDYyMTgyNCwgMHgzYzAyNjAwMCwgCisweDEwNjIwMDBiLCAweGEzYTAwMDNmLCAweDI0MGUwMDAxLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDVjODgsIDB4YTNhZTAwM2YsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIAorMHg4Zjg2MDA0MCwgMHgyNDA1MDMwMCwgMHhjMDAyYjNiLCAweDIwMDM4MjEsIAorMHg4ZjgyMDI0MCwgMHgzYzAzMDAwMSwgMHg0MzEwMjUsIDB4YWY4MjAyNDAsIAorMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxNDQwMDAwNSwgMHgwLCAKKzB4YWY4MDAwNDgsIDB4OGY4MjAwNDgsIDB4MTA0MDAwMDQsIDB4MCwgCisweGFmODAwMDQ4LCAweDEwMDAwMDAzLCAweDJlMDIwMjEsIDB4YWY4MDAwNGMsIAorMHgyZTAyMDIxLCAweDNjMDUwMDAxLCAweGMwMDJiYTgsIDB4MzRhNTQwZjgsIAorMHgzNDAyMDIxLCAweGMwMDJiYTgsIDB4MjQwNTA1YzgsIDB4M2MwMjAwMDEsIAorMHg4YzQyNmVhOCwgMHgzYzBkMDAwMSwgMHg4ZGFkNmU4OCwgMHgzYzAzMDAwMSwgCisweDhjNjM2ZTg0LCAweDNjMDgwMDAxLCAweDhkMDg2ZTkwLCAweDNjMDkwMDAxLCAKKzB4OGQyOTZlYWMsIDB4M2MwYTAwMDEsIDB4OGQ0YTZlYjQsIDB4M2MwYjAwMDEsIAorMHg4ZDZiNmVjNCwgMHgzYzBjMDAwMSwgMHg4ZDhjNmU5OCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1Yzk0LCAweDI0MDUwNDAwLCAweGFmNDIwMTNjLCAweDhmNDIwMTNjLCAKKzB4MjQwNjAwMDEsIDB4MjQwNzAwMDEsIDB4YWY0MDAwMDAsIDB4YWY0ZDAxMzgsIAorMHhhZjQzMDE0NCwgMHhhZjQ4MDE0OCwgMHhhZjQ5MDE0YywgMHhhZjRhMDE1MCwgCisweGFmNGIwMTU0LCAweGFmNGMwMTU4LCAweDI0NDJmZjgwLCAweGFmNDIwMTQwLCAKKzB4MjQwMjAwMDEsIDB4YWZhMjAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgCisweDhmNDIwMTM4LCAweGFmYTIwMDEwLCAweDhmNDIwMTNjLCAweGFmYTIwMDE0LCAKKzB4OGY0NjAxNDQsIDB4OGY0NzAxNDgsIDB4M2MwNDAwMDEsIDB4MjQ4NDVjYTAsIAorMHhjMDAyYjNiLCAweDI0MDUwNTAwLCAweGFmYjcwMDEwLCAweGFmYmEwMDE0LCAKKzB4OGY0NjAxNGMsIDB4OGY0NzAxNTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVjYWMsIAorMHhjMDAyYjNiLCAweDI0MDUwNjAwLCAweDNjMDIwMDAxLCAweDhjNDI2ZTljLCAKKzB4MzYwMzgyMSwgMHgzYzA2MDAwMiwgMHgyNGM2OTAxMCwgMHgyNDQ4ZmZmZiwgCisweDEwNjE4MjQsIDB4ZTgxMDI0LCAweDQzMTAyYiwgMHgxMDQwMDAwNiwgCisweDI0MDUwOTAwLCAweDNjMDQwMDAxLCAweDI0ODQ1Y2I4LCAweGFmYTgwMDEwLCAKKzB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHg4ZjgyMDAwYywgMHhhZmEyMDAxMCwgCisweDhmODIwMDNjLCAweGFmYTIwMDE0LCAweDhmODYwMDAwLCAweDhmODcwMDA0LCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDVjYzQsIDB4YzAwMmIzYiwgMHgyNDA1MTAwMCwgCisweDhjMDIwMjIwLCAweDhjMDMwMjI0LCAweDhjMDYwMjE4LCAweDhjMDcwMjFjLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDVjY2MsIDB4MjQwNTExMDAsIDB4YWZhMjAwMTAsIAorMHhjMDAyYjNiLCAweGFmYTMwMDE0LCAweGFmODAwMDU0LCAweGFmODAwMTFjLCAKKzB4OGMwMjAyMTgsIDB4MzA0MjAwMDIsIDB4MTA0MDAwMDksIDB4MCwgCisweDhjMDIwMjIwLCAweDNjMDMwMDAyLCAweDM0NjMwMDA0LCAweDQzMTAyNSwgCisweGFmNDIwMDBjLCAweDhjMDIwMjFjLCAweDEwMDAwMDA4LCAweDM0NDIwMDA0LCAKKzB4OGMwMjAyMjAsIDB4M2MwMzAwMDIsIDB4MzQ2MzAwMDYsIDB4NDMxMDI1LCAKKzB4YWY0MjAwMGMsIDB4OGMwMjAyMWMsIDB4MzQ0MjAwMDYsIDB4YWY0MjAwMTQsIAorMHg4YzAyMDIxOCwgMHgzMDQyMDAxMCwgMHgxMDQwMDAwYSwgMHgwLCAKKzB4OGMwMjAyMWMsIDB4MzQ0MjAwMDQsIDB4YWY0MjAwMTAsIDB4OGMwMjAyMjAsIAorMHgzYzAzMDAwYSwgMHgzNDYzMDAwNCwgMHg0MzEwMjUsIDB4MTAwMDAwMDksIAorMHhhZjQyMDAwOCwgMHg4YzAyMDIyMCwgMHgzYzAzMDAwYSwgMHgzNDYzMDAwNiwgCisweDQzMTAyNSwgMHhhZjQyMDAwOCwgMHg4YzAyMDIxYywgMHgzNDQyMDAwNiwgCisweGFmNDIwMDEwLCAweDI0MDIwMDAxLCAweGFmODIwMGEwLCAweGFmODIwMGIwLCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4YWY4MDAwZDAsIDB4YWY4MDAwYzAsIAorMHgxMDAwMDAwMiwgMHgyNDYzMDA2NCwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIAorMHgyYzQyMDA2NSwgMHgxNDQwZmZmYywgMHgwLCAweDhjMDQwMjA4LCAKKzB4OGMwNTAyMGMsIDB4MjZlMjAwMjgsIDB4YWVlMjAwMjAsIDB4MjQwMjA0OTAsIAorMHhhZWUyMDAxMCwgMHhhZWU0MDAwOCwgMHhhZWU1MDAwYywgMHgyNmU0MDAwOCwgCisweDhjODIwMDAwLCAweDhjODMwMDA0LCAweGFmODIwMDkwLCAweGFmODMwMDk0LCAKKzB4OGM4MjAwMTgsIDB4YWY4MjAwYjQsIDB4OTQ4MjAwMGEsIDB4YWY4MjAwOWMsIAorMHg4ZjQyMDAxNCwgMHhhZjgyMDBiMCwgMHg4ZjgyMDBiMCwgMHgzMDQyMDAwNCwgCisweDE0NDBmZmZkLCAweDAsIDB4OGY4MjAwYjAsIDB4M2MwM2VmMDAsIAorMHg0MzEwMjQsIDB4MTA0MDAwMjEsIDB4MCwgMHg4ZjgyMDBiNCwgCisweGFmYTIwMDEwLCAweDhmODIwMDkwLCAweDhmODMwMDk0LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDVjZDQsIDB4YWZhMzAwMTQsIDB4OGY4NjAwYjAsIDB4OGY4NzAwOWMsIAorMHgzYzA1MDAwMSwgMHhjMDAyYjNiLCAweDM0YTUyMDBkLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDVjZTAsIDB4MjQwMjAzYzAsIDB4YWZhMjAwMTAsIDB4YWZhMDAwMTQsIAorMHg4Zjg2MDE0NCwgMHgzYzA3MDAwMSwgMHgyNGU3NWNlOCwgMHhjMDAyYjNiLCAKKzB4MzQwNWRlYWQsIDB4OGY4MjAxMWMsIDB4MzQ0MjAwMDIsIDB4YWY4MjAxMWMsIAorMHg4ZjgyMDIyMCwgMHgzNDQyMDAwNCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDE0MCwgCisweDNjMDMwMDAxLCAweDQzMTAyNSwgMHhhZjgyMDE0MCwgMHg5NmUyMDQ3MiwgCisweDk2ZTYwNDUyLCAweDk2ZTcwNDYyLCAweGFmYTIwMDEwLCAweDk2ZTIwNDgyLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDVkMTQsIDB4MjQwNTEyMDAsIDB4YzAwMmIzYiwgCisweGFmYTIwMDE0LCAweDk2ZjAwNDUyLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAKKzB4YjAyMSwgMHgyNDE2MDAwMSwgMHgzMjAyMDAwMiwgMHg1NDQwMDAwMSwgCisweDM2ZDYwMDAyLCAweDMyMDIwMDA4LCAweDU0NDAwMDAxLCAweDM2ZDYwMDA0LCAKKzB4MzIwMjAwMTAsIDB4NTQ0MDAwMDEsIDB4MzZkNjAwMDgsIDB4MzIwMjAwMjAsIAorMHg1NDQwMDAwMSwgMHgzNmQ2MDAxMCwgMHgzMjAyMDA0MCwgMHg1NDQwMDAwMSwgCisweDM2ZDYwMDIwLCAweDMyMDIwMDgwLCAweDU0NDAwMDAxLCAweDM2ZDYwMDQwLCAKKzB4OTZlNjA0ODIsIDB4MzBjMjAyMDAsIDB4NTQ0MDAwMDEsIDB4MzZkNjQwMDAsIAorMHg5NmUzMDQ3MiwgMHgzMDYyMDIwMCwgMHgxMDQwMDAwMywgMHgzMDYyMDEwMCwgCisweDEwMDAwMDAzLCAweDM2ZDYyMDAwLCAweDU0NDAwMDAxLCAweDM2ZDYxMDAwLCAKKzB4OTZmMDA0NjIsIDB4MzJjMjQwMDAsIDB4MTQ0MDAwMDQsIDB4MzIwNzAwOWIsIAorMHgzMGMyMDA5YiwgMHgxNGUyMDAwNywgMHgyNDBlMDAwMSwgMHgzMmMyMjAwMCwgCisweDE0NDAwMDBkLCAweDMyMDIwMDAxLCAweDMwNjIwMDliLCAweDEwZTIwMDA5LCAKKzB4MjQwZTAwMDEsIDB4M2MwNDAwMDEsIDB4MjQ4NDVkMjAsIDB4MjQwNTEzMDAsIAorMHgyMDAzODIxLCAweGEzYWUwMDNmLCAweGFmYTMwMDEwLCAweGMwMDJiM2IsIAorMHhhZmEwMDAxNCwgMHgzMjAyMDAwMSwgMHg1NDQwMDAwMSwgMHgzNmQ2MDA4MCwgCisweDMyMDIwMDAyLCAweDU0NDAwMDAxLCAweDM2ZDYwMTAwLCAweDMyMDIwMDA4LCAKKzB4NTQ0MDAwMDEsIDB4MzZkNjAyMDAsIDB4MzIwMjAwMTAsIDB4NTQ0MDAwMDEsIAorMHgzNmQ2MDQwMCwgMHgzMjAyMDA4MCwgMHg1NDQwMDAwMSwgMHgzNmQ2MDgwMCwgCisweDhjMDIwMjE4LCAweDMwNDIwMjAwLCAweDEwNDAwMDAyLCAweDNjMDIwMDA4LCAKKzB4MmMyYjAyNSwgMHg4YzAyMDIxOCwgMHgzMDQyMDgwMCwgMHgxMDQwMDAwMiwgCisweDNjMDIwMDgwLCAweDJjMmIwMjUsIDB4OGMwMjAyMTgsIDB4MzA0MjA0MDAsIAorMHgxMDQwMDAwMiwgMHgzYzAyMDEwMCwgMHgyYzJiMDI1LCAweDhjMDIwMjE4LCAKKzB4MzA0MjAxMDAsIDB4MTA0MDAwMDIsIDB4M2MwMjAyMDAsIDB4MmMyYjAyNSwgCisweDhjMDIwMjE4LCAweDMwNDIwMDgwLCAweDEwNDAwMDAyLCAweDNjMDIwNDAwLCAKKzB4MmMyYjAyNSwgMHg4YzAyMDIxOCwgMHgzMDQyMjAwMCwgMHgxMDQwMDAwMiwgCisweDNjMDIwMDEwLCAweDJjMmIwMjUsIDB4OGMwMjAyMTgsIDB4MzA0MjQwMDAsIAorMHgxMDQwMDAwMiwgMHgzYzAyMDAyMCwgMHgyYzJiMDI1LCAweDhjMDIwMjE4LCAKKzB4MzA0MjEwMDAsIDB4MTA0MDAwMDIsIDB4M2MwMjAwNDAsIDB4MmMyYjAyNSwgCisweDhlZTIwNDk4LCAweDhlZTMwNDljLCAweGFmNDIwMTYwLCAweGFmNDMwMTY0LCAKKzB4OGVlMjA0YTAsIDB4OGVlMzA0YTQsIDB4YWY0MjAxNjgsIDB4YWY0MzAxNmMsIAorMHg4ZWUyMDRhOCwgMHg4ZWUzMDRhYywgMHhhZjQyMDE3MCwgMHhhZjQzMDE3NCwgCisweDhlZTIwNDI4LCAweDhlZTMwNDJjLCAweGFmNDIwMTc4LCAweGFmNDMwMTdjLCAKKzB4OGVlMjA0NDgsIDB4OGVlMzA0NGMsIDB4YWY0MjAxODAsIDB4YWY0MzAxODQsIAorMHg4ZWUyMDQ1OCwgMHg4ZWUzMDQ1YywgMHhhZjQyMDE4OCwgMHhhZjQzMDE4YywgCisweDhlZTIwNDY4LCAweDhlZTMwNDZjLCAweGFmNDIwMTkwLCAweGFmNDMwMTk0LCAKKzB4OGVlMjA0NzgsIDB4OGVlMzA0N2MsIDB4YWY0MjAxOTgsIDB4YWY0MzAxOWMsIAorMHg4ZWUyMDQ4OCwgMHg4ZWUzMDQ4YywgMHhhZjQyMDFhMCwgMHhhZjQzMDFhNCwgCisweDhlZTIwNGIwLCAweDhlZTMwNGI0LCAweDI0MDQwMDgwLCAweGFmNDIwMWE4LCAKKzB4YWY0MzAxYWMsIDB4YzAwMmJhOCwgMHgyNDA1MDA4MCwgMHg4YzAyMDI1YywgCisweDI3NDQwMjI0LCAweGFmNDIwMWYwLCAweDhjMDIwMjYwLCAweDI0MDUwMjAwLCAKKzB4MjQwNjAwMDgsIDB4YzAwMmJiZiwgMHhhZjQyMDFmOCwgMHgzYzA0M2I5YSwgCisweDM0ODRjYTAwLCAweDM4MjEsIDB4MjQwMjAwMDYsIDB4MjQwMzAwMDIsIAorMHhhZjQyMDFmNCwgMHgyNDAyMDNlOCwgMHhhZjQzMDIwNCwgMHhhZjQzMDIwMCwgCisweGFmNDQwMWZjLCAweGFmNDIwMjk0LCAweDI0MDIwMDAxLCAweGFmNDMwMjkwLCAKKzB4YWY0MjAyOWMsIDB4M2MwMzAwMDEsIDB4NjcxODIxLCAweDkwNjM2Y2Q4LCAKKzB4MzQ3MTAyMSwgMHgyNGU3MDAwMSwgMHhhMDQzMDIyYywgMHgyY2UyMDAwZiwgCisweDE0NDBmZmY4LCAweDM0NzE4MjEsIDB4MjRlNzAwMDEsIDB4M2MwODAwMDEsIAorMHgzNTA4NDBmOCwgMHg4ZjgyMDA0MCwgMHgzYzA0MDAwMSwgMHgyNDg0NWQyYywgCisweDI0MDUxNDAwLCAweDIxNzAyLCAweDI0NDIwMDMwLCAweGEwNjIwMjJjLCAKKzB4MzQ3MTAyMSwgMHhhMDQwMDIyYywgMHg4YzA3MDIxOCwgMHgyYzAzMDIxLCAKKzB4MjQwMjA1YzgsIDB4YWZhMjAwMTAsIDB4YzAwMmIzYiwgMHhhZmE4MDAxNCwgCisweDNjMDQwMDAxLCAweDI0ODQ1ZDM4LCAweDNjMDUwMDAwLCAweDI0YTU1YzgwLCAKKzB4MjQwNjAwMTAsIDB4MjdiMTAwMzAsIDB4MjIwMzgyMSwgMHgyN2IzMDAzNCwgCisweGMwMDE3YTMsIDB4YWZiMzAwMTAsIDB4M2MwMzAwMDEsIDB4OGM2MzZjYzgsIAorMHgxMDYwMDAwYSwgMHg0MDgwMjEsIDB4OGZhMzAwMzAsIDB4MjQwNWZmMDAsIAorMHg4ZmEyMDAzNCwgMHgyNDY0MDBmZiwgMHg4NTIwMjQsIDB4ODMxODIzLCAKKzB4NDMxMDIzLCAweGFmYTIwMDM0LCAweGFmYTQwMDMwLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDVkNDQsIDB4M2MwNTAwMDAsIDB4MjRhNTQxMDAsIDB4MjQwNjAxMDgsIAorMHgyMjAzODIxLCAweGMwMDE3YTMsIDB4YWZiMzAwMTAsIDB4NDA5MDIxLCAKKzB4MzJjMjAwMDMsIDB4M2MwMTAwMDEsIDB4YWMzMjZlODAsIDB4MTA0MDAwNDUsIAorMHgyMjAzODIxLCAweDhmODIwMDUwLCAweDNjMDMwMDEwLCAweDQzMTAyNCwgCisweDEwNDAwMDE2LCAweDAsIDB4OGMwMjAyMTgsIDB4MzA0MjAwNDAsIAorMHgxMDQwMDAwZiwgMHgyNDAyMDAwMSwgMHg4ZjgyMDA1MCwgMHg4YzAzMDIxOCwgCisweDI0MGUwMDAxLCAweDNjMDQwMDAxLCAweDI0ODQ1ZDUwLCAweGEzYWUwMDNmLCAKKzB4YWZhMjAwMTAsIDB4YWZhMzAwMTQsIDB4OGY4NzAwNDAsIDB4MjQwNTE1MDAsIAorMHhjMDAyYjNiLCAweDJjMDMwMjEsIDB4MTAwMDAwMDQsIDB4MCwgCisweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIyNDBmNCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1ZDVjLCAweDNjMDUwMDAxLCAweDI0YTU1YjQwLCAweDNjMDYwMDAxLCAKKzB4MjRjNjViYWMsIDB4YzUzMDIzLCAweDhmNDIwMDEwLCAweDI3YjMwMDMwLCAKKzB4MjYwMzgyMSwgMHgyN2IxMDAzNCwgMHgzNDQyMGEwMCwgMHhhZjQyMDAxMCwgCisweGMwMDE3YTMsIDB4YWZiMTAwMTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVkNzAsIAorMHgzYzA1MDAwMSwgMHgyNGE1YjcxNCwgMHgzYzA2MDAwMSwgMHgyNGM2YmE5MCwgCisweGM1MzAyMywgMHgyNjAzODIxLCAweGFmNDIwMTA4LCAweGMwMDE3YTMsIAorMHhhZmIxMDAxMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWQ4YywgMHgzYzA1MDAwMSwgCisweDI0YTViZTU4LCAweDNjMDYwMDAxLCAweDI0YzZjOTAwLCAweGM1MzAyMywgCisweDI2MDM4MjEsIDB4M2MwMTAwMDEsIDB4YWMyMjZlZjQsIDB4YzAwMTdhMywgCisweGFmYjEwMDEwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZGE0LCAweDEwMDAwMDI0LCAKKzB4MjQwNTE2MDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVkYWMsIDB4M2MwNTAwMDEsIAorMHgyNGE1YTEwYywgMHgzYzA2MDAwMSwgMHgyNGM2YTIzOCwgMHhjNTMwMjMsIAorMHhjMDAxN2EzLCAweGFmYjMwMDEwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZGJjLCAKKzB4M2MwNTAwMDEsIDB4MjRhNWIyYjAsIDB4M2MwNjAwMDEsIDB4MjRjNmI3MGMsIAorMHhjNTMwMjMsIDB4MjIwMzgyMSwgMHhhZjQyMDEwOCwgMHhjMDAxN2EzLCAKKzB4YWZiMzAwMTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVkZDAsIDB4M2MwNTAwMDEsIAorMHgyNGE1YmE5OCwgMHgzYzA2MDAwMSwgMHgyNGM2YmU1MCwgMHhjNTMwMjMsIAorMHgyMjAzODIxLCAweDNjMDEwMDAxLCAweGFjMjI2ZWY0LCAweGMwMDE3YTMsIAorMHhhZmIzMDAxMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWRlNCwgMHgyNDA1MTY1MCwgCisweDJjMDMwMjEsIDB4MzgyMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmVmOCwgCisweGFmYTAwMDEwLCAweGMwMDJiM2IsIDB4YWZhMDAwMTQsIDB4MzJjMjAwMjAsIAorMHgxMDQwMDAyMSwgMHgyN2E3MDAzMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWRmMCwgCisweDNjMDUwMDAxLCAweDI0YTViMTNjLCAweDNjMDYwMDAxLCAweDI0YzZiMmE4LCAKKzB4YzUzMDIzLCAweDI0MDIyMDAwLCAweGFmNDIwMDFjLCAweDI3YTIwMDM0LCAKKzB4YzAwMTdhMywgMHhhZmEyMDAxMCwgMHgyMTkwMCwgMHgzMTk4MiwgCisweDNjMDQwODAwLCAweDY0MTgyNSwgMHhhZTQzMDAyOCwgMHgyNDAzMDAxMCwgCisweGFmNDMwMDNjLCAweDk2ZTMwNDUwLCAweGFmNDMwMDQwLCAweDhmNDMwMDQwLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDVlMDQsIDB4YWZhMDAwMTQsIDB4YWZhMzAwMTAsIAorMHg4ZjQ3MDAxYywgMHgyNDA1MTY2MCwgMHgzYzAxMDAwMSwgMHhhYzIyNmVmMCwgCisweDEwMDAwMDI1LCAweDMyYzYwMDIwLCAweDhlZTIwNDQ4LCAweDhlZTMwNDRjLCAKKzB4YWY0MzAwMWMsIDB4OGY0MjAwMWMsIDB4MjQ0MmUwMDAsIDB4MmM0MjIwMDEsIAorMHgxNDQwMDAwYSwgMHgyNDBlMDAwMSwgMHgzYzA0MDAwMSwgMHgyNDg0NWUxMCwgCisweGEzYWUwMDNmLCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmNDYwMDFjLCAKKzB4MjQwNTE3MDAsIDB4YzAwMmIzYiwgMHgzODIxLCAweDNjMDIwMDAwLCAKKzB4MjQ0MjVjYmMsIDB4MjExMDAsIDB4MjExODIsIDB4M2MwMzA4MDAsIAorMHg0MzEwMjUsIDB4YWU0MjAwMjgsIDB4MjQwMjAwMDgsIDB4YWY0MjAwM2MsIAorMHg5NmUyMDQ1MCwgMHhhZjQyMDA0MCwgMHg4ZjQyMDA0MCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1ZTFjLCAweGFmYTAwMDE0LCAweGFmYTIwMDEwLCAweDhmNDcwMDFjLCAKKzB4MjQwNTE4MDAsIDB4MzJjNjAwMjAsIDB4YzAwMmIzYiwgMHgwLCAKKzB4M2MwNTBmZmYsIDB4M2MwMzAwMDEsIDB4OGM2MzZlZjQsIDB4MzRhNWZmZmYsIAorMHgyNDAzMDIxLCAweDNjMDIwMDAxLCAweDhjNDI2ZWY4LCAweDNjMDQwODAwLCAKKzB4NjUxODI0LCAweDMxODgyLCAweDY0MTgyNSwgMHg0NTEwMjQsIAorMHgyMTA4MiwgMHg0NDEwMjUsIDB4YWNjMjAwODAsIDB4MzJjMjAxODAsIAorMHgxMDQwMDA1NiwgMHhhY2MzMDAyMCwgMHg4ZjgyMDA1YywgMHgzYzAzMDA4MCwgCisweDQzMTAyNCwgMHgxMDQwMDAwZCwgMHgwLCAweDhmODIwMDUwLCAKKzB4YWZhMjAwMTAsIDB4OGY4MjAwNWMsIDB4MjQwZTAwMDEsIDB4M2MwNDAwMDEsIAorMHgyNDg0NWUyOCwgMHhhM2FlMDAzZiwgMHhhZmEyMDAxNCwgMHg4Zjg3MDA0MCwgCisweDI0MDUxOTAwLCAweGMwMDJiM2IsIDB4MmMwMzAyMSwgMHg4ZjgyMDA1MCwgCisweDNjMDMwMDEwLCAweDQzMTAyNCwgMHgxMDQwMDAxNiwgMHgwLCAKKzB4OGMwMjAyMTgsIDB4MzA0MjAwNDAsIDB4MTA0MDAwMGYsIDB4MjQwMjAwMDEsIAorMHg4ZjgyMDA1MCwgMHg4YzAzMDIxOCwgMHgyNDBlMDAwMSwgMHgzYzA0MDAwMSwgCisweDI0ODQ1ZDUwLCAweGEzYWUwMDNmLCAweGFmYTIwMDEwLCAweGFmYTMwMDE0LCAKKzB4OGY4NzAwNDAsIDB4MjQwNTIwMDAsIDB4YzAwMmIzYiwgMHgyYzAzMDIxLCAKKzB4MTAwMDAwMDQsIDB4MCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHhhMDIyNDBmNCwgMHgzYzA0MDAwMSwgMHgyNDg0NWUzNCwgMHgzYzA1MDAwMSwgCisweDI0YTU1YWMwLCAweDNjMDYwMDAxLCAweDI0YzY1YjM4LCAweGM1MzAyMywgCisweDhmNDIwMDA4LCAweDI3YjMwMDMwLCAweDI2MDM4MjEsIDB4MjdiMTAwMzQsIAorMHgzNDQyMGUwMCwgMHhhZjQyMDAwOCwgMHhjMDAxN2EzLCAweGFmYjEwMDEwLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDVlNGMsIDB4M2MwNTAwMDEsIDB4MjRhNWQ4YjQsIAorMHgzYzA2MDAwMSwgMHgyNGM2ZTNjOCwgMHhjNTMwMjMsIDB4MjYwMzgyMSwgCisweGFmNDIwMTBjLCAweGMwMDE3YTMsIDB4YWZiMTAwMTAsIDB4M2MwNDAwMDEsIAorMHgyNDg0NWU2NCwgMHgzYzA1MDAwMSwgMHgyNGE1ZTlhYywgMHgzYzA2MDAwMSwgCisweDI0YzZmMGYwLCAweGM1MzAyMywgMHgyNjAzODIxLCAweDNjMDEwMDAxLCAKKzB4YWMyMjZmMDQsIDB4YzAwMTdhMywgMHhhZmIxMDAxMCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1ZTdjLCAweDEwMDAwMDI3LCAweDI0MDUyMTAwLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDVlODQsIDB4M2MwNTAwMDEsIDB4MjRhNTlmYzgsIDB4M2MwNjAwMDEsIAorMHgyNGM2YTEwNCwgMHhjNTMwMjMsIDB4MjdiMTAwMzAsIDB4MjIwMzgyMSwgCisweDI3YjMwMDM0LCAweGMwMDE3YTMsIDB4YWZiMzAwMTAsIDB4M2MwNDAwMDEsIAorMHgyNDg0NWU5NCwgMHgzYzA1MDAwMSwgMHgyNGE1Y2FkNCwgMHgzYzA2MDAwMSwgCisweDI0YzZkOGFjLCAweGM1MzAyMywgMHgyMjAzODIxLCAweGFmNDIwMTBjLCAKKzB4YzAwMTdhMywgMHhhZmIzMDAxMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWVhNCwgCisweDNjMDUwMDAxLCAweDI0YTVlODRjLCAweDNjMDYwMDAxLCAweDI0YzZlOWE0LCAKKzB4YzUzMDIzLCAweDIyMDM4MjEsIDB4M2MwMTAwMDEsIDB4YWMyMjZmMDQsIAorMHhjMDAxN2EzLCAweGFmYjMwMDEwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZWI4LCAKKzB4MjQwNTIxNTAsIDB4MmMwMzAyMSwgMHgzODIxLCAweDNjMDEwMDAxLCAKKzB4YWMyMjZmMTAsIDB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgCisweDNjMTEwZmZmLCAweDNjMDMwMDAxLCAweDhjNjM2ZjA0LCAweDM2MzFmZmZmLCAKKzB4MjQwOTgyMSwgMHgzYzAyMDAwMSwgMHg4YzQyNmYxMCwgMHgzYzBlMDgwMCwgCisweDcxMTgyNCwgMHgzMTg4MiwgMHg2ZTE4MjUsIDB4NTExMDI0LCAKKzB4MjEwODIsIDB4NGUxMDI1LCAweGFlNjMwMDM4LCAweGFlNjIwMDc4LCAKKzB4OGMwMjAyMTgsIDB4MzA0MjAwNDAsIDB4MTQ0MDAwMDQsIDB4MjQwMjAwMDEsIAorMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMjQwZjQsIDB4M2MwNDAwMDEsIAorMHgyNDg0NWVjNCwgMHgzYzA1MDAwMSwgMHgyNGE1ZTNkMCwgMHgzYzA2MDAwMSwgCisweDI0YzZlNTJjLCAweGM1MzAyMywgMHgyN2JlMDAzMCwgMHgzYzAzODIxLCAKKzB4MjdiNTAwMzQsIDB4YzAwMTdhMywgMHhhZmI1MDAxMCwgMHgzYzAxMDAwMSwgCisweGFjMjI2ZWZjLCAweDUxMTAyNCwgMHgyMTA4MiwgMHgzYzBlMDgwMCwgCisweDRlMTAyNSwgMHhhZTYyMDA1MCwgMHgzMmMyMjAwMCwgMHgxMDQwMDAwNiwgCisweDNjMDM4MjEsIDB4M2MwMjAwMDAsIDB4MjQ0MjVjYmMsIDB4MjIyMTAyNCwgCisweDEwMDAwMDBmLCAweDIxMDgyLCAweDNjMDQwMDAxLCAweDI0ODQ1ZWQ4LCAKKzB4M2MwNTAwMDEsIDB4MjRhNWU1MzQsIDB4M2MwNjAwMDEsIDB4MjRjNmU2ZTQsIAorMHhjNTMwMjMsIDB4YzAwMTdhMywgMHhhZmI1MDAxMCwgMHgzYzAxMDAwMSwgCisweGFjMjI2ZjE0LCAweDUxMTAyNCwgMHgyMTA4MiwgMHgzYzBlMDgwMCwgCisweDRlMTAyNSwgMHhhZTYyMDA0OCwgMHgzMmMyNDAwMCwgMHgxMDQwMDAwNSwgCisweDI3YTcwMDMwLCAweDNjMDIwMDAwLCAweDI0NDI1Y2JjLCAweDEwMDAwMDBlLCAKKzB4MjExMDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVlZjAsIDB4M2MwNTAwMDEsIAorMHgyNGE1ZTZlYywgMHgzYzA2MDAwMSwgMHgyNGM2ZTg0NCwgMHhjNTMwMjMsIAorMHgyN2EyMDAzNCwgMHhjMDAxN2EzLCAweGFmYTIwMDEwLCAweDNjMDEwMDAxLCAKKzB4YWMyMjZmMDgsIDB4MjExMDAsIDB4MjExODIsIDB4M2MwMzA4MDAsIAorMHg0MzEwMjUsIDB4YWU0MjAwNjAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVmMDgsIAorMHgzYzA1MDAwMSwgMHgyNGE1ODIzMCwgMHgzYzA2MDAwMSwgMHgyNGM2ODY1MCwgCisweGM1MzAyMywgMHgyN2IxMDAzMCwgMHgyMjAzODIxLCAweDI3YjMwMDM0LCAKKzB4YzAwMTdhMywgMHhhZmIzMDAxMCwgMHgzYzBlMGZmZiwgMHgzNWNlZmZmZiwgCisweDNjMDQwMDAxLCAweDI0ODQ1ZjE0LCAweDNjMDUwMDAwLCAweDI0YTU2NDY4LCAKKzB4M2MwNjAwMDAsIDB4MjRjNjY1ODgsIDB4YzUzMDIzLCAweDIyMDM4MjEsIAorMHgyNDBmMDIxLCAweDNjMDEwMDAxLCAweGFjMjI2ZWRjLCAweDRlMTAyNCwgCisweDIxMDgyLCAweDNjMTUwODAwLCAweDU1MTAyNSwgMHhhZmFlMDA0NCwgCisweGFmYzIwMGI4LCAweGMwMDE3YTMsIDB4YWZiMzAwMTAsIDB4M2MwNDAwMDEsIAorMHgyNDg0NWYyMCwgMHgzYzA1MDAwMCwgMHgyNGE1NjU5MCwgMHgzYzA2MDAwMCwgCisweDI0YzY2ODA4LCAweDhmYWUwMDQ0LCAweGM1MzAyMywgMHgyMjAzODIxLCAKKzB4M2MwMTAwMDEsIDB4YWMyMjZlZDAsIDB4NGUxMDI0LCAweDIxMDgyLCAKKzB4NTUxMDI1LCAweGFmYzIwMGU4LCAweGMwMDE3YTMsIDB4YWZiMzAwMTAsIAorMHgzYzA0MDAwMSwgMHgyNDg0NWYzOCwgMHgzYzA1MDAwMCwgMHgyNGE1NjgxMCwgCisweDNjMDYwMDAwLCAweDI0YzY2OTQwLCAweDhmYWUwMDQ0LCAweGM1MzAyMywgCisweDIyMDM4MjEsIDB4M2MwMTAwMDEsIDB4YWMyMjZlYzgsIDB4NGUxMDI0LCAKKzB4MjEwODIsIDB4NTUxMDI1LCAweGFmYzIwMGMwLCAweGMwMDE3YTMsIAorMHhhZmIzMDAxMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWY1MCwgMHgzYzA1MDAwMSwgCisweDI0YTVmYWQwLCAweDNjMDYwMDAxLCAweDI0YzZmYmE4LCAweDhmYWUwMDQ0LCAKKzB4YzUzMDIzLCAweDIyMDM4MjEsIDB4M2MwMTAwMDEsIDB4YWMyMjZlZDQsIAorMHg0ZTEwMjQsIDB4MjEwODIsIDB4NTUxMDI1LCAweGFmYzIwMGM4LCAKKzB4YzAwMTdhMywgMHhhZmIzMDAxMCwgMHgzYzA0MDAwMSwgMHgyNDg0NWY1YywgCisweDNjMDUwMDAxLCAweDI0YTVjOTNjLCAweDNjMDYwMDAxLCAweDI0YzZjYTIwLCAKKzB4YzUzMDIzLCAweDIyMDM4MjEsIDB4YWY0MjAxMTAsIDB4YzAwMTdhMywgCisweGFmYjMwMDEwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZjZjLCAweDNjMDUwMDAxLCAKKzB4MjRhNWM5MTAsIDB4M2MwNjAwMDEsIDB4MjRjNmM5MzQsIDB4YzUzMDIzLCAKKzB4MjIwMzgyMSwgMHhhZjQyMDEyNCwgMHhjMDAxN2EzLCAweGFmYjMwMDEwLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDVmN2MsIDB4M2MwNTAwMDEsIDB4MjRhNTVhODAsIAorMHgzYzA2MDAwMSwgMHgyNGM2NWFhYywgMHhjNTMwMjMsIDB4MjIwMzgyMSwgCisweGFmNDIwMTIwLCAweGFmNDIwMTE0LCAweGMwMDE3YTMsIDB4YWZiMzAwMTAsIAorMHgzYzA0MDAwMSwgMHgyNDg0NWY4OCwgMHgzYzA1MDAwMSwgMHgyNGE1ZjI5OCwgCisweDNjMDYwMDAxLCAweDI0YzZmNmI0LCAweGM1MzAyMywgMHgyMjAzODIxLCAKKzB4YWY0MjAxMTgsIDB4YzAwMTdhMywgMHhhZmIzMDAxMCwgMHg4ZmFlMDA0NCwgCisweDNjMDEwMDAxLCAweGFjMjI2ZjE4LCAweDRlMTAyNCwgMHgyMTA4MiwgCisweDU1MTAyNSwgMHhjMDAzZmMzLCAweGFmYzIwMGQwLCAweGMwMDNjNDAsIAorMHgwLCAweGMwMDI3YTgsIDB4MCwgMHhhYzAwMDIyOCwgCisweGFjMDAwMjJjLCAweDk2ZTIwNDUwLCAweDI0NDJmZmZmLCAweGFmNDIwMDM4LCAKKzB4OTZlMjA0NjAsIDB4YWY0MjAwODAsIDB4MzJjMjQwMDAsIDB4MTQ0MDAwMDMsIAorMHgwLCAweDk2ZTIwNDgwLCAweGFmNDIwMDg0LCAweDk2ZTcwNDkwLCAKKzB4NTBlMDAwMDEsIDB4MjQwNzA4MDAsIDB4MjRlMmZmZmYsIDB4YWY0MjAwODgsIAorMHhhZjQyMDA3YywgMHgyNDAyMDgwMCwgMHgxMGUyMDAwZiwgMHgzMmMyNDAwMCwgCisweDEwNDAwMDAzLCAweDI0MDIwNDAwLCAweDEwZTIwMDBiLCAweDAsIAorMHgyNDBlMDAwMSwgMHgzYzA0MDAwMSwgMHgyNDg0NWY5OCwgMHhhM2FlMDAzZiwgCisweDk2ZTYwNDkwLCAweDI0MDUyMTcwLCAweDJjMDM4MjEsIDB4YWZhMDAwMTAsIAorMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDhmNDMwMTM4LCAweDhmNDQwMTM4LCAKKzB4MjQwMjAwMDEsIDB4YTM0MjA1YzIsIDB4YWY0MzAwOTQsIDB4YWY0NDAwOTgsIAorMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgMHg4ZjQ2MDA4MCwgMHg4ZjQ3MDA4NCwgCisweDNjMDQwMDAxLCAweDI0ODQ1ZmE0LCAweGMwMDJiM2IsIDB4MjQwNTIyMDAsIAorMHhjMDAyNGE0LCAweDNjMTEwODAwLCAweDNjMTQzM2Q4LCAweDM2OTRjYjU4LCAKKzB4M2MwMjA4MDAsIDB4MzQ0MjAwODAsIDB4M2MwNDAwMDEsIDB4MjQ4NDVmYjAsIAorMHgzYzA1MDAwMCwgMHgyNGE1NWQwMCwgMHgzYzA2MDAwMCwgMHgyNGM2NWQxYywgCisweGM1MzAyMywgMHgyN2E3MDAzMCwgMHhhZjgyMDA2MCwgMHgyNDAyZmZmZiwgCisweGFmODIwMDY0LCAweDI3YTIwMDM0LCAweGMwMDE3YTMsIDB4YWZhMjAwMTAsIAorMHgzYzAxMDAwMSwgMHhhYzIyNmViOCwgMHgyMTEwMCwgMHgyMTE4MiwgCisweDUxMTAyNSwgMHhjMDAxOGZjLCAweGFlNDIwMDAwLCAweDhmODIwMjQwLCAKKzB4M2MwMzAwMDEsIDB4NDMxMDI1LCAweGFmODIwMjQwLCAweDNjMDIwMDAwLCAKKzB4MjQ0MjQwMzQsIDB4YWY4MjAyNDQsIDB4YWY4MDAyNDAsIDB4OGY4MjAwNjAsIAorMHg1MTEwMjQsIDB4MTQ0MDAwMDUsIDB4M2MwMzA4MDAsIDB4OGY4MjAwNjAsIAorMHg0MzEwMjQsIDB4MTA0MGZmZmQsIDB4MCwgMHhjMDAzYzRkLCAKKzB4ODgyMSwgMHgzYzAyMDEwMCwgMHhhZmEyMDAyMCwgMHg4ZjUzMDAxOCwgCisweDI0MDIwMGZmLCAweDU2NjIwMDAxLCAweDI2NzEwMDAxLCAweDhjMDIwMjI4LCAKKzB4MTYyMjAwMGUsIDB4MTMzMGMwLCAweDhmNDIwMzNjLCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsIDB4OGMwMjAyMjgsIDB4M2MwNDAwMDEsIAorMHgyNDg0NWMyNCwgMHgzYzA1MDAwOSwgMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwgCisweDhmYTYwMDIwLCAweDEwMDAwMDNmLCAweDM0YTUwMTAwLCAweGQ3MTAyMSwgCisweDhmYTMwMDIwLCAweDhmYTQwMDI0LCAweGFjNDMwNGMwLCAweGFjNDQwNGM0LCAKKzB4YzAxODIxLCAweDhmNDQwMTc4LCAweDhmNDUwMTdjLCAweDEwMjEsIAorMHgyNDA3MDAwNCwgMHhhZmE3MDAxMCwgMHhhZmIxMDAxNCwgMHg4ZjQ4MDAwYywgCisweDI0YzYwNGMwLCAweDJlNjMwMjEsIDB4YWZhODAwMTgsIDB4OGY0ODAxMGMsIAorMHgyNDA3MDAwOCwgMHhhMzI4MjEsIDB4YTM0ODJiLCAweDgyMjAyMSwgCisweDEwMGY4MDksIDB4ODkyMDIxLCAweDE0NDAwMDBiLCAweDI0MDcwMDA4LCAKKzB4OGY4MjAxMjAsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIAorMHgyNDg0NWMyYywgMHgzYzA1MDAwOSwgMHhhZmEyMDAxNCwgMHg4ZmE2MDAyMCwgCisweDEwMDAwMDFjLCAweDM0YTUwMjAwLCAweDhmNDQwMTYwLCAweDhmNDUwMTY0LCAKKzB4OGY0MzAwMGMsIDB4YWY1MTAwMTgsIDB4OGY4NjAxMjAsIDB4MjQwMjAwMTAsIAorMHhhZmEyMDAxMCwgMHhhZmIxMDAxNCwgMHhhZmEzMDAxOCwgMHg4ZjQyMDEwYywgCisweDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxNDQwMDAxMCwgMHgwLCAKKzB4OGY0MjAzNDAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNDAsIDB4OGY0MjAzNDAsIAorMHg4ZjgyMDEyMCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgCisweDI0ODQ1YzM0LCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LCAweDhmYTYwMDIwLCAKKzB4MzRhNTAzMDAsIDB4YzAwMmIzYiwgMHgyNjAzODIxLCAweDhmNDIwMmU0LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAyZTQsIDB4OGY0MjAyZTQsIDB4OTNhMjAwM2YsIAorMHgxMDQwMDA2OSwgMHgzYzAyMDcwMCwgMHgzNDQyMzAwMCwgMHhhZmEyMDAyOCwgCisweDhmNTMwMDE4LCAweDI0MDIwMGZmLCAweDEyNjIwMDAyLCAweDg4MjEsIAorMHgyNjcxMDAwMSwgMHg4YzAyMDIyOCwgMHgxNjIyMDAwZSwgMHgxMzMwYzAsIAorMHg4ZjQyMDMzYywgMHgyNDQyMDAwMSwgMHhhZjQyMDMzYywgMHg4ZjQyMDMzYywgCisweDhjMDIwMjI4LCAweDNjMDQwMDAxLCAweDI0ODQ1YzI0LCAweDNjMDUwMDA5LCAKKzB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsIDB4OGZhNjAwMjgsIDB4MTAwMDAwM2YsIAorMHgzNGE1MDEwMCwgMHhkNzEwMjEsIDB4OGZhMzAwMjgsIDB4OGZhNDAwMmMsIAorMHhhYzQzMDRjMCwgMHhhYzQ0MDRjNCwgMHhjMDE4MjEsIDB4OGY0NDAxNzgsIAorMHg4ZjQ1MDE3YywgMHgxMDIxLCAweDI0MDcwMDA0LCAweGFmYTcwMDEwLCAKKzB4YWZiMTAwMTQsIDB4OGY0ODAwMGMsIDB4MjRjNjA0YzAsIDB4MmU2MzAyMSwgCisweGFmYTgwMDE4LCAweDhmNDgwMTBjLCAweDI0MDcwMDA4LCAweGEzMjgyMSwgCisweGEzNDgyYiwgMHg4MjIwMjEsIDB4MTAwZjgwOSwgMHg4OTIwMjEsIAorMHgxNDQwMDAwYiwgMHgyNDA3MDAwOCwgMHg4ZjgyMDEyMCwgMHhhZmEyMDAxMCwgCisweDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ1YzJjLCAweDNjMDUwMDA5LCAKKzB4YWZhMjAwMTQsIDB4OGZhNjAwMjgsIDB4MTAwMDAwMWMsIDB4MzRhNTAyMDAsIAorMHg4ZjQ0MDE2MCwgMHg4ZjQ1MDE2NCwgMHg4ZjQzMDAwYywgMHhhZjUxMDAxOCwgCisweDhmODYwMTIwLCAweDI0MDIwMDEwLCAweGFmYTIwMDEwLCAweGFmYjEwMDE0LCAKKzB4YWZhMzAwMTgsIDB4OGY0MjAxMGMsIDB4NDBmODA5LCAweDI0YzYwMDFjLCAKKzB4MTQ0MDAwMTAsIDB4MCwgMHg4ZjQyMDM0MCwgMHgyNDQyMDAwMSwgCisweGFmNDIwMzQwLCAweDhmNDIwMzQwLCAweDhmODIwMTIwLCAweGFmYTIwMDEwLCAKKzB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDVjMzQsIDB4M2MwNTAwMDksIAorMHhhZmEyMDAxNCwgMHg4ZmE2MDAyOCwgMHgzNGE1MDMwMCwgMHhjMDAyYjNiLCAKKzB4MjYwMzgyMSwgMHg4ZjQyMDJmMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDJmMCwgCisweDhmNDIwMmYwLCAweDNjMDQwMDAxLCAweDI0ODQ1ZmMwLCAweGFmYTAwMDEwLCAKKzB4YWZhMDAwMTQsIDB4OGZhNjAwMjgsIDB4MjQwNTIzMDAsIDB4YzAwMmIzYiwgCisweDM4MjEsIDB4MTAwMDAwMDQsIDB4MCwgMHg4YzAyMDI2NCwgCisweDEwNDAwMDA1LCAweDAsIDB4OGY4MjAwYTAsIDB4MzA0MjAwMDQsIAorMHgxNDQwZmZmYSwgMHgwLCAweDhmODIwMDQ0LCAweDM0NDIwMDA0LCAKKzB4YWY4MjAwNDQsIDB4OGY0MjAzMDgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDgsIAorMHg4ZjQyMDMwOCwgMHg4ZjgyMDBkOCwgMHg4ZjgzMDBkNCwgMHg0MzEwMjMsIAorMHgyNDQyZmY4MCwgMHhhZjQyMDA5MCwgMHg4ZjQyMDA5MCwgMHgyODQyZmY4MSwgCisweDEwNDAwMDA2LCAweDI0MDIwMDAxLCAweDhmNDIwMDkwLCAweDhmNDMwMTQ0LCAKKzB4NDMxMDIxLCAweGFmNDIwMDkwLCAweDI0MDIwMDAxLCAweGFmNDIwMDhjLCAKKzB4MzJjMjAwMDgsIDB4MTA0MDAwMDYsIDB4MCwgMHg4ZjgyMDIxNCwgCisweDNjMDM4MTAwLCAweDMwNDJmZmZmLCAweDQzMTAyNSwgMHhhZjgyMDIxNCwgCisweDNjMDMwMDAxLCAweDhjNjM2ZDk0LCAweDMwNjIwMDAyLCAweDEwNDAwMDA5LCAKKzB4MzA2MjAwMDEsIDB4M2MwNDAwMDEsIDB4MjQ4NDVmY2MsIDB4M2MwNTAwMDAsIAorMHgyNGE1NmQ1MCwgMHgzYzA2MDAwMCwgMHgyNGM2NzFjOCwgMHgxMDAwMDAxMiwgCisweGM1MzAyMywgMHgxMDQwMDAwOSwgMHgwLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDVmZGMsIDB4M2MwNTAwMDAsIDB4MjRhNTcxZDAsIDB4M2MwNjAwMDAsIAorMHgyNGM2NzY3OCwgMHgxMDAwMDAwOCwgMHhjNTMwMjMsIDB4M2MwNDAwMDEsIAorMHgyNDg0NWZlYywgMHgzYzA1MDAwMCwgMHgyNGE1Njk0OCwgMHgzYzA2MDAwMCwgCisweDI0YzY2ZDQ4LCAweGM1MzAyMywgMHgyN2E3MDAzMCwgMHgyN2EyMDAzNCwgCisweGMwMDE3YTMsIDB4YWZhMjAwMTAsIDB4M2MwMTAwMDEsIDB4YWMyMjZlY2MsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmVjYywgMHgzYzAzMDgwMCwgMHgyMTEwMCwgCisweDIxMTgyLCAweDQzMTAyNSwgMHhhZTQyMDA0MCwgMHg4ZjgyMDBhMCwgCisweGFmYTIwMDEwLCAweDhmODIwMGIwLCAweGFmYTIwMDE0LCAweDhmODYwMDVjLCAKKzB4OGY4NzAxMWMsIDB4M2MwNDAwMDEsIDB4MjQ4NDVmZmMsIDB4M2MwMTAwMDEsIAorMHhhYzM2NmVhNCwgMHgzYzAxMDAwMSwgMHhhYzIwNmU5NCwgMHgzYzAxMDAwMSwgCisweGFjM2M2ZThjLCAweDNjMDEwMDAxLCAweGFjM2I2ZWJjLCAweDNjMDEwMDAxLCAKKzB4YWMzNzZlYzAsIDB4M2MwMTAwMDEsIDB4YWMzYTZlYTAsIDB4YzAwMmIzYiwgCisweDI0MDUyNDAwLCAweDhmODIwMjAwLCAweGFmYTIwMDEwLCAweDhmODIwMjIwLCAKKzB4YWZhMjAwMTQsIDB4OGY4NjAwNDQsIDB4OGY4NzAwNTAsIDB4M2MwNDAwMDEsIAorMHgyNDg0NjAwOCwgMHhjMDAyYjNiLCAweDI0MDUyNTAwLCAweDhmODMwMDYwLCAKKzB4NzQxMDBiLCAweDI0MjAwMGEsIDB4MjAwZjgyMSwgMHgwLCAKKzB4ZCwgMHg4ZmJmMDA2MCwgMHg4ZmJlMDA1YywgMHg4ZmI1MDA1OCwgCisweDhmYjMwMDU0LCAweDhmYjIwMDUwLCAweDhmYjEwMDRjLCAweDhmYjAwMDQ4LCAKKzB4M2UwMDAwOCwgMHgyN2JkMDA2OCwgMHgyN2JkZmZlMCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2MDE0LCAweDI0MDUyNjAwLCAweDMwMjEsIDB4MzgyMSwgCisweGFmYmYwMDE4LCAweGFmYTAwMDEwLCAweGMwMDJiM2IsIDB4YWZhMDAwMTQsIAorMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDIwLCAweDNlMDAwMDgsIAorMHgwLCAweDNlMDAwMDgsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDNlMDAwMDgsIDB4MCwgMHgzZTAwMDA4LCAweDAsIAorMHgyN2JkZmRlMCwgMHgyN2E1MDAxOCwgMHgzYzA0ZGVhZCwgMHgzNDg0YmVlZiwgCisweGFmYmYwMjE4LCAweDhmODIwMTUwLCAweDNjMDMwMDFmLCAweDM0NjNmZmZmLCAKKzB4YWZhNDAwMTgsIDB4YTIyODIzLCAweGEzMjgyNCwgMHg4Y2EyMDAwMCwgCisweDEwNDQwMDBhLCAweDAsIDB4YWZhNTAwMTAsIDB4OGNhMjAwMDAsIAorMHhhZmEyMDAxNCwgMHg4Zjg2MDE1MCwgMHg4Zjg3MDI1MCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2MDFjLCAweGMwMDJiM2IsIDB4MjQwNTI3MDAsIDB4OGZiZjAyMTgsIAorMHgzZTAwMDA4LCAweDI3YmQwMjIwLCAweDI3YmRmZmUwLCAweDNjMDZhYmJhLCAKKzB4MzRjNmJhYmUsIDB4YWZiMDAwMTgsIDB4M2MxMDAwMDQsIDB4M2MwNzAwN2YsIAorMHgzNGU3ZmZmZiwgMHhhZmJmMDAxYywgMHgxMDI4NDAsIDB4OGUwNDAwMDAsIAorMHg4Y2EzMDAwMCwgMHhhY2EwMDAwMCwgMHhhZTA2MDAwMCwgMHg4Y2EyMDAwMCwgCisweGFjYTMwMDAwLCAweDEwNDYwMDA1LCAweGFlMDQwMDAwLCAweGEwODAyMSwgCisweGYwMTAyYiwgMHgxMDQwZmZmNSwgMHgxMDI4NDAsIDB4M2MwNDAwMDEsIAorMHgyNDg0NjAyOCwgMHgyNDA1MjgwMCwgMHgyMDAzMDIxLCAweDM4MjEsIAorMHhhZmEwMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDIwMDEwMjEsIAorMHg4ZmJmMDAxYywgMHg4ZmIwMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDIwLCAKKzB4OGMwMjAyMjQsIDB4MzA0NzAwM2YsIDB4MTBlMDAwMTAsIDB4ODAzMDIxLCAKKzB4MjgyMSwgMHgyNDAzMDAyMCwgMHhlMzEwMjQsIDB4MTA0MDAwMDIsIAorMHg2MzA0MiwgMHhhNjI4MjEsIDB4MzE4NDIsIDB4MTQ2MGZmZmIsIAorMHhlMzEwMjQsIDB4MjQwMmYwMDAsIDB4YTIyODI0LCAweDM0MDJmZmZmLCAKKzB4NDUxMDJiLCAweDE0NDAwMDAzLCAweDNjMDIwMDAxLCAweDEwMDAwMDA4LCAKKzB4M2MwMjAwMDEsIDB4MzQ0MmZmZmYsIDB4ODUxODIzLCAweDQzMTAyYiwgCisweDE0NDAwMDAzLCAweGEwMTAyMSwgMHgzYzAyZmZmZSwgMHg4MjEwMjEsIAorMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmZDAsIDB4YWZiNTAwMjgsIAorMHg4ZmI1MDA0MCwgMHhhZmIyMDAyMCwgMHhhMDkwMjEsIDB4YWZiMTAwMWMsIAorMHgyNGM2MDAwMywgMHhhZmJmMDAyYywgMHhhZmIzMDAyNCwgMHhhZmIwMDAxOCwgCisweDhlYTIwMDAwLCAweDI0MDNmZmZjLCAweGMzODAyNCwgMHg1MDEwMmIsIAorMHgxNDQwMDAxYiwgMHhlMDg4MjEsIDB4OGUzMzAwMDAsIDB4YWZiMDAwMTAsIAorMHg4ZWEyMDAwMCwgMHhhZmEyMDAxNCwgMHg4ZTI3MDAwMCwgMHgyNDA1MzAwMCwgCisweGMwMDJiM2IsIDB4MjQwMzAyMSwgMHg4ZTIzMDAwMCwgMHg3MDIwMjEsIAorMHg2NDEwMmIsIDB4MTA0MDAwMDcsIDB4MjQwMjgyMSwgMHg4Y2EyMDAwMCwgCisweGFjNjIwMDAwLCAweDI0NjMwMDA0LCAweDY0MTAyYiwgMHgxNDQwZmZmYiwgCisweDI0YTUwMDA0LCAweDhlYTIwMDAwLCAweDUwMTAyMywgMHhhZWEyMDAwMCwgCisweDhlMjIwMDAwLCAweDUwMTAyMSwgMHgxMDAwMDAwYiwgMHhhZTIyMDAwMCwgCisweDI0MDIwMDJkLCAweGEwODIwMDAwLCAweGFmYjAwMDEwLCAweDhlYTIwMDAwLCAKKzB4MjQwOTgyMSwgMHhhZmEyMDAxNCwgMHg4ZTI3MDAwMCwgMHgyNDA1MzEwMCwgCisweGMwMDJiM2IsIDB4MjYwMzAyMSwgMHgyNjAxMDIxLCAweDhmYmYwMDJjLCAKKzB4OGZiNTAwMjgsIDB4OGZiMzAwMjQsIDB4OGZiMjAwMjAsIDB4OGZiMTAwMWMsIAorMHg4ZmIwMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDMwLCAweDI3YmRmZmU4LCAKKzB4M2MxY2MwMDAsIDB4M2MwNWZmZmUsIDB4M2MwMzAwMDEsIDB4OGM2MzZlODQsIAorMHgzYzA0MDAwMSwgMHg4Yzg0NmU5MCwgMHgzNGE1YmYwOCwgMHgyNDAyMWZmYywgCisweDNjMDEwMDAxLCAweGFjMjI2Y2QwLCAweDNjMDIwMGMwLCAweDNjMDEwMDAxLCAKKzB4YWMyMjZjZDQsIDB4M2MwMjAwMjAsIDB4YWZiZjAwMTAsIDB4M2MwMTAwYzAsIAorMHhhYzIwMWZmYywgMHg0MzEwMjMsIDB4NDQxMDIzLCAweDI0NWJiMDAwLCAKKzB4MzY1YjgyMSwgMHgzYzFkMDAwMSwgMHg4ZmJkNmNjYywgMHgzYTBmMDIxLCAKKzB4M2MwNDAwYzAsIDB4MzQ4NDAyMDAsIDB4M2MxYTAwYzAsIDB4M2MwMzAwYzAsIAorMHgzNDYzMDdjOCwgMHgyNDAyMWRmYywgMHgzYzAxMDAwMSwgMHhhYzIyNmNkMCwgCisweDI0MDIxODM0LCAweDNjMDEwMDAxLCAweGFjMjQ2Y2Q0LCAweDNjMDEwMDAxLCAKKzB4YWMyMjZjZDAsIDB4M2MwMTAwMDEsIDB4YWMyMzZjZDQsIDB4YzAwMTgwZCwgCisweDM3NWEwMjAwLCAweDhmYmYwMDEwLCAweDNlMDAwMDgsIDB4MjdiZDAwMTgsIAorMHgyN2JkZmZjOCwgMHgzYzA0MDAwMSwgMHgyNDg0NjAzNCwgMHgyNDA1MzIwMCwgCisweDNjMDIwMDAxLCAweDhjNDI2Y2QwLCAweDNjMDMwMDAxLCAweDhjNjM2Y2Q0LCAKKzB4MzAyMSwgMHgzNjAzODIxLCAweGFmYmYwMDMwLCAweGFmYjMwMDJjLCAKKzB4YWZiMjAwMjgsIDB4YWZiMTAwMjQsIDB4YWZiMDAwMjAsIDB4YWZhMjAwMWMsIAorMHhhZmEzMDAxOCwgMHhhZmI3MDAxMCwgMHhjMDAyYjNiLCAweGFmYmEwMDE0LCAKKzB4YzAwMTkxNiwgMHgwLCAweDhmODIwMjQwLCAweDM0NDIwMDA0LCAKKzB4YWY4MjAyNDAsIDB4MjQwMjAwMDEsIDB4YWY0MjAwMDAsIDB4M2MwMjAwMDEsIAorMHg1NzEwMjEsIDB4OTA0MjQwZjQsIDB4MTA0MDAwOTIsIDB4MjQwM2ZmZmMsIAorMHgzYzEwMDAwMSwgMHgyNjEwYWM3MywgMHgzYzEyMDAwMSwgMHgyNjUyYTg0YywgCisweDIxMjEwMjMsIDB4NDM4MDI0LCAweDhmYTMwMDFjLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDYwNDAsIDB4NzAxMDJiLCAweDE0NDAwMDFhLCAweDI3YjMwMDE4LCAKKzB4OGZiMTAwMTgsIDB4MjQwNTMwMDAsIDB4MjQwMzAyMSwgMHhhZmIwMDAxMCwgCisweGFmYTMwMDE0LCAweGMwMDJiM2IsIDB4MjIwMzgyMSwgMHg4ZmEzMDAxOCwgCisweDcwMjAyMSwgMHg2NDEwMmIsIDB4MTA0MDAwMDcsIDB4MjQwMzAyMSwgCisweDhjYzIwMDAwLCAweGFjNjIwMDAwLCAweDI0NjMwMDA0LCAweDY0MTAyYiwgCisweDE0NDBmZmZiLCAweDI0YzYwMDA0LCAweDhmYTIwMDFjLCAweDUwMTAyMywgCisweGFmYTIwMDFjLCAweDhlNjIwMDAwLCAweDUwMTAyMSwgMHgxMDAwMDAwYSwgCisweGFlNjIwMDAwLCAweDI0MDg4MjEsIDB4MjQwNTMxMDAsIDB4YWZiMDAwMTAsIAorMHhhZmEzMDAxNCwgMHg4ZmE3MDAxOCwgMHgyMjAzMDIxLCAweDI0MDIwMDJkLCAKKzB4YzAwMmIzYiwgMHhhMDgyMDAwMCwgMHgyNDA3MDAyMCwgMHg4ZmEzMDAxYywgCisweDNjMDQwMDAxLCAweDI0ODQ2MDVjLCAweDI0MTIwMDIwLCAweDNjMDEwMDAxLCAKKzB4YWMzMTZlYjAsIDB4MmM2MjAwMjAsIDB4MTQ0MDAwMWQsIDB4MjdiMTAwMTgsIAorMHg4ZmIwMDAxOCwgMHgyNDA1MzAwMCwgMHgzYzA2MDAwMSwgMHgyNGM2NmY1MCwgCisweGFmYTcwMDEwLCAweGFmYTMwMDE0LCAweGMwMDJiM2IsIDB4MjAwMzgyMSwgCisweDhmYTMwMDE4LCAweDNjMDQwMDAxLCAweDI0ODQ2ZjUwLCAweDI0NjUwMDIwLCAKKzB4NjUxMDJiLCAweDEwNDAwMDA3LCAweDAsIDB4OGM4MjAwMDAsIAorMHhhYzYyMDAwMCwgMHgyNDYzMDAwNCwgMHg2NTEwMmIsIDB4MTQ0MGZmZmIsIAorMHgyNDg0MDAwNCwgMHg4ZmEyMDAxYywgMHg1MjEwMjMsIDB4YWZhMjAwMWMsIAorMHg4ZTIyMDAwMCwgMHg1MjEwMjEsIDB4MTAwMDAwMGIsIDB4YWUyMjAwMDAsIAorMHgzYzEwMDAwMSwgMHgyNjEwNmY1MCwgMHgyNDA1MzEwMCwgMHhhZmE3MDAxMCwgCisweGFmYTMwMDE0LCAweDhmYTcwMDE4LCAweDIwMDMwMjEsIDB4MjQwMjAwMmQsIAorMHhjMDAyYjNiLCAweGEwODIwMDAwLCAweDI0MDcwMDIwLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDYwNzAsIDB4OGZhMzAwMWMsIDB4MjQxMjAwMjAsIDB4M2MwMTAwMDEsIAorMHhhYzMwNmVlNCwgMHgyYzYyMDAyMCwgMHgxNDQwMDAxZCwgMHgyN2IxMDAxOCwgCisweDhmYjAwMDE4LCAweDI0MDUzMDAwLCAweDNjMDYwMDAxLCAweDI0YzY2ZjcwLCAKKzB4YWZhNzAwMTAsIDB4YWZhMzAwMTQsIDB4YzAwMmIzYiwgMHgyMDAzODIxLCAKKzB4OGZhMzAwMTgsIDB4M2MwNDAwMDEsIDB4MjQ4NDZmNzAsIDB4MjQ2NTAwMjAsIAorMHg2NTEwMmIsIDB4MTA0MDAwMDcsIDB4MCwgMHg4YzgyMDAwMCwgCisweGFjNjIwMDAwLCAweDI0NjMwMDA0LCAweDY1MTAyYiwgMHgxNDQwZmZmYiwgCisweDI0ODQwMDA0LCAweDhmYTIwMDFjLCAweDUyMTAyMywgMHhhZmEyMDAxYywgCisweDhlMjIwMDAwLCAweDUyMTAyMSwgMHgxMDAwMDAwYiwgMHhhZTIyMDAwMCwgCisweDNjMTAwMDAxLCAweDI2MTA2ZjcwLCAweDI0MDUzMTAwLCAweGFmYTcwMDEwLCAKKzB4YWZhMzAwMTQsIDB4OGZhNzAwMTgsIDB4MjAwMzAyMSwgMHgyNDAyMDAyZCwgCisweGMwMDJiM2IsIDB4YTA4MjAwMDAsIDB4M2MwMTAwMDEsIDB4MTAwMDAwMzEsIAorMHhhYzMwNmVlMCwgMHgzYzEwMDAwMSwgMHgyNjEwODIxZiwgMHgzYzEyMDAwMSwgCisweDI2NTI4MDljLCAweDIxMjEwMjMsIDB4NDM4MDI0LCAweDhmYTMwMDFjLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDYwODQsIDB4NzAxMDJiLCAweDE0NDAwMDFhLCAKKzB4MjdiMzAwMTgsIDB4OGZiMTAwMTgsIDB4MjQwNTMwMDAsIDB4MjQwMzAyMSwgCisweGFmYjAwMDEwLCAweGFmYTMwMDE0LCAweGMwMDJiM2IsIDB4MjIwMzgyMSwgCisweDhmYTMwMDE4LCAweDcwMjAyMSwgMHg2NDEwMmIsIDB4MTA0MDAwMDcsIAorMHgyNDAzMDIxLCAweDhjYzIwMDAwLCAweGFjNjIwMDAwLCAweDI0NjMwMDA0LCAKKzB4NjQxMDJiLCAweDE0NDBmZmZiLCAweDI0YzYwMDA0LCAweDhmYTIwMDFjLCAKKzB4NTAxMDIzLCAweGFmYTIwMDFjLCAweDhlNjIwMDAwLCAweDUwMTAyMSwgCisweDEwMDAwMDBhLCAweGFlNjIwMDAwLCAweDI0MDg4MjEsIDB4MjQwNTMxMDAsIAorMHhhZmIwMDAxMCwgMHhhZmEzMDAxNCwgMHg4ZmE3MDAxOCwgMHgyMjAzMDIxLCAKKzB4MjQwMjAwMmQsIDB4YzAwMmIzYiwgMHhhMDgyMDAwMCwgMHgzYzAxMDAwMSwgCisweGFjMzE2ZWIwLCAweDNjMDMwMDAxLCAweDhjNjM2ZWIwLCAweDI0MDIwNDAwLCAKKzB4NjBmODA5LCAweGFmODIwMDcwLCAweDhmYmYwMDMwLCAweDhmYjMwMDJjLCAKKzB4OGZiMjAwMjgsIDB4OGZiMTAwMjQsIDB4OGZiMDAwMjAsIDB4M2UwMDAwOCwgCisweDI3YmQwMDM4LCAweDAsIDB4MCwgMHg4ZjgyMDA0MCwgCisweDNjMDNmMDAwLCAweDQzMTAyNCwgMHgzYzAzNjAwMCwgMHgxNDQzMDAwNiwgCisweDAsIDB4OGY4MjAwNTAsIDB4MjQwM2ZmODAsIDB4NDMxMDI0LCAKKzB4MzQ0MjAwNTUsIDB4YWY4MjAwNTAsIDB4OGY4MjAwNTQsIDB4MjQ0MjAzZTgsIAorMHhhZjgyMDA1OCwgMHgyNDAyMDFmNCwgMHhhZjQyMDBlMCwgMHgyNDAyMDAwNCwgCisweGFmNDIwMGU4LCAweDI0MDIwMDAyLCAweGFmNDAwMWIwLCAweGFmNDAwMGU0LCAKKzB4YWY0MjAwZGMsIDB4YWY0MDAwZDgsIDB4YWY0MDAwZDQsIDB4M2UwMDAwOCwgCisweGFmNDAwMGQwLCAweDhmODIwMDU0LCAweDI0NDIwMDA1LCAweDNlMDAwMDgsIAorMHhhZjgyMDA3OCwgMHgyN2JkZmZlOCwgMHhhZmJmMDAxMCwgMHg4ZjgyMDA1NCwgCisweDI0NDIwM2U4LCAweGFmODIwMDU4LCAweDNjMDIwODAwLCAweDJjMjEwMjQsIAorMHgxMDQwMDAwNCwgMHgzYzAyZjdmZiwgMHgzNDQyZmZmZiwgMHgyYzJiMDI0LCAKKzB4MzY5NDAwNDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkYTgsIDB4MTA0MDAwMTcsIAorMHgzYzAyMDIwMCwgMHgzYzAzMDAwMSwgMHg4YzYzNmYxYywgMHgxMDYwMDAxNiwgCisweDI4MmEwMjUsIDB4M2MwMjAwMDEsIDB4OGM0MjZlNDQsIDB4MTQ0MDAwMTIsIAorMHgzYzAyMDIwMCwgMHgzYzAyMDAwMSwgMHg4YzQyNmQ5NCwgMHgzMDQyMDAwMywgCisweDE0NDAwMDBkLCAweDNjMDIwMjAwLCAweDhmODMwMjI0LCAweDNjMDIwMDAyLCAKKzB4OGM0MjhmZWMsIDB4MTA2MjAwMDgsIDB4M2MwMjAyMDAsIDB4YzAwM2RhZiwgCisweDAsIDB4MTAwMDAwMDQsIDB4M2MwMjAyMDAsIDB4YzAwNDE5NiwgCisweDAsIDB4M2MwMjAyMDAsIDB4MmMyMTAyNCwgMHgxMDQwMDAwMywgCisweDAsIDB4YzAwMWY0YiwgMHgwLCAweDhmNDIwMGQ4LCAKKzB4OGY0MzAwZGMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAwZDgsIDB4NDMxMDJiLCAKKzB4MTQ0MDAwMDMsIDB4MCwgMHhhZjQwMDBkOCwgMHgzNjk0MDA4MCwgCisweDhjMDMwMjM4LCAweDEwNjAwMDBjLCAweDAsIDB4OGY0MjAxYjAsIAorMHgyNDQyMDNlOCwgMHhhZjQyMDFiMCwgMHg0MzEwMmIsIDB4MTQ0MDAwMDYsIAorMHgwLCAweDkzNDIwNWM1LCAweDE0NDAwMDAzLCAweDAsIAorMHhjMDAxZGEwLCAweDAsIDB4OGZiZjAwMTAsIDB4M2UwMDAwOCwgCisweDI3YmQwMDE4LCAweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZkOCwgCisweGFmYmYwMDIwLCAweDhmNDMwMDJjLCAweDhmNDIwMDM4LCAweDEwNjIwMDU5LCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjQwZjAsIAorMHgxMDQwMDAyNiwgMHgyNDA3MDAwOCwgMHg4ZjQ0MDE3MCwgMHg4ZjQ1MDE3NCwgCisweDhmNDgwMDBjLCAweDhmODYwMTIwLCAweDI0MDIwMDIwLCAweGFmYTIwMDEwLCAKKzB4YWZhMzAwMTQsIDB4YWZhODAwMTgsIDB4OGY0MjAxMGMsIDB4NDBmODA5LCAKKzB4MjRjNjAwMWMsIDB4MTQ0MDAwMTEsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIAorMHgzNzA4MjEsIDB4YTAyMjQwZjAsIDB4OGY4MjAxMjQsIDB4YWZhMjAwMTAsIAorMHg4ZjgyMDEyOCwgMHgzYzA0MDAwMSwgMHgyNDg0NjEyOCwgMHhhZmEyMDAxNCwgCisweDhmNDYwMDJjLCAweDhmODcwMTIwLCAweDNjMDUwMDA5LCAweGMwMDJiM2IsIAorMHgzNGE1MDkwMCwgMHgxMDAwMDA1YywgMHgwLCAweDhmNDIwMzAwLCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAzMDAsIDB4OGY0MjAzMDAsIDB4OGY0MjAwMmMsIAorMHhhMzQwMDVjMSwgMHgxMDAwMDAyNywgMHhhZjQyMDAzOCwgMHg4ZjQ0MDE3MCwgCisweDhmNDUwMTc0LCAweDhmNDMwMDJjLCAweDhmNDgwMDBjLCAweDhmODYwMTIwLCAKKzB4MjQwMjAwODAsIDB4YWZhMjAwMTAsIDB4YWZhMzAwMTQsIDB4YWZhODAwMTgsIAorMHg4ZjQyMDEwYywgMHg0MGY4MDksIDB4MjRjNjAwMWMsIDB4MTQ0MDAwMTEsIAorMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YTAyMjQwZjEsIAorMHg4ZjgyMDEyNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyOCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2MTM0LCAweGFmYTIwMDE0LCAweDhmNDYwMDJjLCAweDhmODcwMTIwLCAKKzB4M2MwNTAwMDksIDB4YzAwMmIzYiwgMHgzNGE1MTEwMCwgMHgxMDAwMDAzNiwgCisweDAsIDB4OGY0MjAzMDAsIDB4OGY0MzAwMmMsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDMwMCwgMHg4ZjQyMDMwMCwgMHgyNDAyMDAwMSwgMHhhMzQyMDVjMSwgCisweGFmNDMwMDM4LCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwNDBmMSwgCisweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwNDBmMCwgMHgxMDAwMDAyNiwgCisweGFmNDAwMDM0LCAweDkzNDIwNWMxLCAweDEwNDAwMDFkLCAweDAsIAorMHhhMzQwMDVjMSwgMHg4ZjgyMDA0MCwgMHgzMDQyMDAwMSwgMHgxNDQwMDAwOCwgCisweDIwMjEsIDB4OGMwMzAxMDQsIDB4MjQwMjAwMDEsIDB4NTA2MjAwMDUsIAorMHgyNDA0MDAwMSwgMHg4YzAyMDI2NCwgMHgxMDQwMDAwMywgMHg4MDEwMjEsIAorMHgyNDA0MDAwMSwgMHg4MDEwMjEsIDB4MTA0MDAwMDYsIDB4MCwgCisweDhmNDIwMzBjLCAweDI0NDIwMDAxLCAweGFmNDIwMzBjLCAweDEwMDAwMDA4LCAKKzB4OGY0MjAzMGMsIDB4OGY4MjAwNDQsIDB4MzQ0MjAwMDQsIDB4YWY4MjAwNDQsIAorMHg4ZjQyMDMwOCwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwOCwgMHg4ZjQyMDMwOCwgCisweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwNDBmMCwgMHgzYzAxMDAwMSwgCisweDM3MDgyMSwgMHhhMDIwNDBmMSwgMHg4ZjQyMDAwMCwgMHgxMDQwMDAwNywgCisweDAsIDB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsIDB4MTA0MGZmZmQsIAorMHgwLCAweDEwMDAwMDA1LCAweDAsIDB4YWY4MDAwNDgsIAorMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgMHgwLCAweDhmODIwMDYwLCAKKzB4M2MwM2ZmN2YsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmODIwMDYwLCAKKzB4OGY0MjAwMDAsIDB4MTA0MDAwMDMsIDB4MCwgMHgxMDAwMDAwMiwgCisweGFmODAwMDRjLCAweGFmODAwMDQ4LCAweDhmYmYwMDIwLCAweDNlMDAwMDgsIAorMHgyN2JkMDAyOCwgMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmZDgsIAorMHhhZmJmMDAyMCwgMHg4ZjQzMDA0NCwgMHg4ZjQyMDA3YywgMHgxMDYyMDAyOSwgCisweDI0MDcwMDA4LCAweDhmNDQwMTY4LCAweDhmNDUwMTZjLCAweDhmNDgwMDBjLCAKKzB4OGY4NjAxMjAsIDB4MjQwMjAwNDAsIDB4YWZhMjAwMTAsIDB4YWZhMzAwMTQsIAorMHhhZmE4MDAxOCwgMHg4ZjQyMDEwYywgMHg0MGY4MDksIDB4MjRjNjAwMWMsIAorMHgxNDQwMDAxMSwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHhhMDIyNDBmMiwgMHg4ZjgyMDEyNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyOCwgCisweDNjMDQwMDAxLCAweDI0ODQ2MTNjLCAweGFmYTIwMDE0LCAweDhmNDYwMDQ0LCAKKzB4OGY4NzAxMjAsIDB4M2MwNTAwMDksIDB4YzAwMmIzYiwgMHgzNGE1MTMwMCwgCisweDEwMDAwMDBmLCAweDAsIDB4OGY0MjAzMDQsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDMwNCwgMHg4ZjQyMDMwNCwgMHg4ZjQyMDA0NCwgMHhhZjQyMDA3YywgCisweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwNDBmMiwgMHgxMDAwMDAwNCwgCisweGFmNDAwMDc4LCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIwNDBmMiwgCisweDhmNDIwMDAwLCAweDEwNDAwMDA3LCAweDAsIDB4YWY4MDAwNGMsIAorMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LCAKKzB4MCwgMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgCisweDAsIDB4OGY4MjAwNjAsIDB4M2MwM2ZlZmYsIDB4MzQ2M2ZmZmYsIAorMHg0MzEwMjQsIDB4YWY4MjAwNjAsIDB4OGY0MjAwMDAsIDB4MTA0MDAwMDMsIAorMHgwLCAweDEwMDAwMDAyLCAweGFmODAwMDRjLCAweGFmODAwMDQ4LCAKKzB4OGZiZjAwMjAsIDB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgzZTAwMDA4LCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRhOCwgMHgyN2JkZmZhOCwgCisweGFmYmYwMDUwLCAweGFmYmUwMDRjLCAweGFmYjUwMDQ4LCAweGFmYjMwMDQ0LCAKKzB4YWZiMjAwNDAsIDB4YWZiMTAwM2MsIDB4YWZiMDAwMzgsIDB4MTA0MDAwZDUsIAorMHg4ZjkwMDA0NCwgMHg4ZjQyMDBkMCwgMHgyNDQzMDAwMSwgMHgyODQyMDAwYiwgCisweDE0NDAwMGU0LCAweGFmNDMwMGQwLCAweDhmNDIwMDA0LCAweDMwNDIwMDAyLCAKKzB4MTQ0MDAwOWMsIDB4YWY0MDAwZDAsIDB4OGY0MjAwMDQsIDB4M2MwMzAwMDEsIAorMHg4YzYzNmQ5OCwgMHgzNDQyMDAwMiwgMHhhZjQyMDAwNCwgMHgyNDAyMDAwMSwgCisweDE0NjIwMDAzLCAweDNjMDIwNjAwLCAweDEwMDAwMDAyLCAweDM0NDIzMDAwLCAKKzB4MzQ0MjEwMDAsIDB4YWZhMjAwMjAsIDB4OGY0YTAwMTgsIDB4YWZhYTAwMzQsIAorMHgyN2FhMDAyMCwgMHhhZmFhMDAyYywgMHg4ZmFhMDAzNCwgMHgyNDAyMDBmZiwgCisweDExNDIwMDAyLCAweDE4MjEsIDB4MjU0MzAwMDEsIDB4OGMwMjAyMjgsIAorMHg2MDk4MjEsIDB4MTY2MjAwMGUsIDB4M2MwNTAwMDksIDB4OGY0MjAzM2MsIAorMHgyNDQyMDAwMSwgMHhhZjQyMDMzYywgMHg4ZjQyMDMzYywgMHg4YzAyMDIyOCwgCisweDhmYTcwMDM0LCAweDNjMDQwMDAxLCAweDI0ODQ2MTBjLCAweGFmYTAwMDE0LCAKKzB4YWZhMjAwMTAsIDB4OGZhNjAwMjAsIDB4MTAwMDAwNzAsIDB4MzRhNTA1MDAsIAorMHg4ZmFhMDAzNCwgMHhhMzhjMCwgMHhmNzEwMjEsIDB4OGZhMzAwMjAsIAorMHg4ZmE0MDAyNCwgMHhhYzQzMDRjMCwgMHhhYzQ0MDRjNCwgMHg4ZjgzMDA1NCwgCisweDhmODIwMDU0LCAweDI0NzEwM2U4LCAweDIyMjEwMjMsIDB4MmM0MjAzZTksIAorMHgxMDQwMDAxYiwgMHhhODIxLCAweGUwOTAyMSwgMHgyNjVlMDRjMCwgCisweDhmNDQwMTc4LCAweDhmNDUwMTdjLCAweDI0MDE4MjEsIDB4MjQwYTAwMDQsIAorMHhhZmFhMDAxMCwgMHhhZmIzMDAxNCwgMHg4ZjQ4MDAwYywgMHgxMDIxLCAKKzB4MmZlMzAyMSwgMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywgMHgyNDA3MDAwOCwgCisweGEzMjgyMSwgMHhhMzQ4MmIsIDB4ODIyMDIxLCAweDEwMGY4MDksIAorMHg4OTIwMjEsIDB4NTQ0MDAwMDYsIDB4MjQxNTAwMDEsIDB4OGY4MjAwNTQsIAorMHgyMjIxMDIzLCAweDJjNDIwM2U5LCAweDE0NDBmZmU5LCAweDAsIAorMHgzMmEyMDBmZiwgMHg1NDQwMDAxOCwgMHhhZjUzMDAxOCwgMHg4ZjQyMDM3OCwgCisweDI0NDIwMDAxLCAweGFmNDIwMzc4LCAweDhmNDIwMzc4LCAweDhmODIwMTIwLCAKKzB4OGZhYTAwMmMsIDB4OGZhNzAwMzQsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsIAorMHgzYzA0MDAwMSwgMHgyNDg0NjExOCwgMHhhZmEyMDAxNCwgMHg4ZDQ2MDAwMCwgCisweDNjMDUwMDA5LCAweDEwMDAwMDM1LCAweDM0YTUwNjAwLCAweDhmNDIwMzA4LCAKKzB4MjQxNTAwMDEsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDgsIDB4OGY0MjAzMDgsIAorMHgxMDAwMDAxZSwgMHgzMmEyMDBmZiwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgCisweDI0NzEwM2U4LCAweDIyMjEwMjMsIDB4MmM0MjAzZTksIDB4MTA0MDAwMTYsIAorMHhhODIxLCAweDNjMWUwMDIwLCAweDI0MTIwMDEwLCAweDhmNDIwMDBjLCAKKzB4OGY0NDAxNjAsIDB4OGY0NTAxNjQsIDB4OGY4NjAxMjAsIDB4YWZiMjAwMTAsIAorMHhhZmIzMDAxNCwgMHg1ZTEwMjUsIDB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsIAorMHgyNDA3MDAwOCwgMHg0MGY4MDksIDB4MjRjNjAwMWMsIDB4MTQ0MGZmZTMsIAorMHgwLCAweDhmODIwMDU0LCAweDIyMjEwMjMsIDB4MmM0MjAzZTksIAorMHgxNDQwZmZlZSwgMHgwLCAweDMyYTIwMGZmLCAweDE0NDAwMDExLCAKKzB4M2MwNTAwMDksIDB4OGY0MjAzNzgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsIAorMHg4ZjQyMDM3OCwgMHg4ZjgyMDEyMCwgMHg4ZmFhMDAyYywgMHg4ZmE3MDAzNCwgCisweGFmYTIwMDEwLCAweDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ2MTIwLCAKKzB4YWZhMjAwMTQsIDB4OGQ0NjAwMDAsIDB4MzRhNTA3MDAsIDB4YzAwMmIzYiwgCisweDAsIDB4OGY0MjAyZWMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyZWMsIAorMHg4ZjQyMDJlYywgMHg4ZjQyMDAwNCwgMHgzMDQyMDAwMSwgMHg1MDQwMDAyOSwgCisweDM2MTAwMDQwLCAweDNjMDIwNDAwLCAweDJjMjEwMjQsIDB4MTA0MDAwMTMsIAorMHgyNDA0ZmZkZiwgMHg4ZjQyMDI1MCwgMHg4ZjQzMDI1NCwgMHg4ZjQ0MDFiNCwgCisweDE0NjQwMDA2LCAweDM2MTAwMDQwLCAweDhmNDIwMjcwLCAweDhmNDMwMjc0LCAKKzB4OGY0NDAxYjgsIDB4MTA2NDAwMDcsIDB4MjQwMmZmZGYsIDB4OGY0MjAyNTAsIAorMHg4ZjQzMDI1NCwgMHg4ZjQ0MDI3MCwgMHg4ZjQ1MDI3NCwgMHgxMDAwMDAxMiwgCisweDNhMTAwMDIwLCAweDEwMDAwMDJiLCAweDIwMjgwMjQsIDB4OGY0MjAyNTAsIAorMHg4ZjQzMDI1NCwgMHg4ZjQ1MDFiNCwgMHgxNDY1MDAwNiwgMHgyMDQ4MDI0LCAKKzB4OGY0MjAyNzAsIDB4OGY0MzAyNzQsIDB4OGY0NDAxYjgsIDB4NTA2NDAwMjEsIAorMHgzNjEwMDA0MCwgMHg4ZjQyMDI1MCwgMHg4ZjQzMDI1NCwgMHg4ZjQ0MDI3MCwgCisweDhmNDUwMjc0LCAweDNhMTAwMDQwLCAweGFmNDMwMWI0LCAweDEwMDAwMDE5LCAKKzB4YWY0NTAxYjgsIDB4OGY0MjAwZDQsIDB4MjQ0MzAwMDEsIDB4MTAwMDAwMTEsIAorMHgyODQyMDAzMywgMHg4ZjQyMDAwNCwgMHgzMDQyMDAwMSwgMHgxMDQwMDAwOSwgCisweDNjMDIwNDAwLCAweDJjMjEwMjQsIDB4MTA0MDAwMDQsIDB4MjQwMmZmZGYsIAorMHgyMDI4MDI0LCAweDEwMDAwMDBiLCAweDM2MTAwMDQwLCAweDEwMDAwMDA5LCAKKzB4MzYxMDAwNjAsIDB4OGY0MjAwZDQsIDB4MzYxMDAwNDAsIDB4MjQ0MzAwMDEsIAorMHgyODQyMDFmNSwgMHgxNDQwMDAwMywgMHhhZjQzMDBkNCwgMHhhZjQwMDBkNCwgCisweDNhMTAwMDIwLCAweGFmOTAwMDQ0LCAweDI0MDJmZjdmLCAweDI4MmEwMjQsIAorMHg4ZmJmMDA1MCwgMHg4ZmJlMDA0YywgMHg4ZmI1MDA0OCwgMHg4ZmIzMDA0NCwgCisweDhmYjIwMDQwLCAweDhmYjEwMDNjLCAweDhmYjAwMDM4LCAweDNlMDAwMDgsIAorMHgyN2JkMDA1OCwgMHgzZTAwMDA4LCAweDAsIDB4M2MwMjAwMDEsIAorMHg4YzQyNmRhOCwgMHgyN2JkZmZiMCwgMHhhZmJmMDA0OCwgMHhhZmJlMDA0NCwgCisweGFmYjUwMDQwLCAweGFmYjMwMDNjLCAweGFmYjIwMDM4LCAweGFmYjEwMDM0LCAKKzB4MTA0MDAwYzcsIDB4YWZiMDAwMzAsIDB4OGY0MjAwZDAsIDB4MjQ0MzAwMDEsIAorMHgyODQyMDAwYiwgMHgxNDQwMDBkYSwgMHhhZjQzMDBkMCwgMHg4ZjQyMDAwNCwgCisweDMwNDIwMDAyLCAweDE0NDAwMDk3LCAweGFmNDAwMGQwLCAweDhmNDIwMDA0LCAKKzB4M2MwMzAwMDEsIDB4OGM2MzZkOTgsIDB4MzQ0MjAwMDIsIDB4YWY0MjAwMDQsIAorMHgyNDAyMDAwMSwgMHgxNDYyMDAwMywgMHgzYzAyMDYwMCwgMHgxMDAwMDAwMiwgCisweDM0NDIzMDAwLCAweDM0NDIxMDAwLCAweGFmYTIwMDIwLCAweDE4MjEsIAorMHg4ZjVlMDAxOCwgMHgyN2FhMDAyMCwgMHgyNDAyMDBmZiwgMHgxM2MyMDAwMiwgCisweGFmYWEwMDJjLCAweDI3YzMwMDAxLCAweDhjMDIwMjI4LCAweDYwOTAyMSwgCisweDE2NDIwMDBlLCAweDFlMzhjMCwgMHg4ZjQyMDMzYywgMHgyNDQyMDAwMSwgCisweGFmNDIwMzNjLCAweDhmNDIwMzNjLCAweDhjMDIwMjI4LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDYxMGMsIDB4M2MwNTAwMDksIDB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsIAorMHg4ZmE2MDAyMCwgMHgxMDAwMDA2ZCwgMHgzNGE1MDUwMCwgMHhmNzEwMjEsIAorMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwgMHhhYzQzMDRjMCwgMHhhYzQ0MDRjNCwgCisweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NzAwM2U4LCAweDIwMjEwMjMsIAorMHgyYzQyMDNlOSwgMHgxMDQwMDAxYiwgMHg5ODIxLCAweGUwODgyMSwgCisweDI2MzUwNGMwLCAweDhmNDQwMTc4LCAweDhmNDUwMTdjLCAweDIyMDE4MjEsIAorMHgyNDBhMDAwNCwgMHhhZmFhMDAxMCwgMHhhZmIyMDAxNCwgMHg4ZjQ4MDAwYywgCisweDEwMjEsIDB4MmY1MzAyMSwgMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywgCisweDI0MDcwMDA4LCAweGEzMjgyMSwgMHhhMzQ4MmIsIDB4ODIyMDIxLCAKKzB4MTAwZjgwOSwgMHg4OTIwMjEsIDB4NTQ0MDAwMDYsIDB4MjQxMzAwMDEsIAorMHg4ZjgyMDA1NCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDE0NDBmZmU5LCAKKzB4MCwgMHgzMjYyMDBmZiwgMHg1NDQwMDAxNywgMHhhZjUyMDAxOCwgCisweDhmNDIwMzc4LCAweDI0NDIwMDAxLCAweGFmNDIwMzc4LCAweDhmNDIwMzc4LCAKKzB4OGY4MjAxMjAsIDB4OGZhYTAwMmMsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsIAorMHgzYzA0MDAwMSwgMHgyNDg0NjExOCwgMHgzYzA1MDAwOSwgMHhhZmEyMDAxNCwgCisweDhkNDYwMDAwLCAweDEwMDAwMDM1LCAweDM0YTUwNjAwLCAweDhmNDIwMzA4LCAKKzB4MjQxMzAwMDEsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDgsIDB4OGY0MjAzMDgsIAorMHgxMDAwMDAxZSwgMHgzMjYyMDBmZiwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgCisweDI0NzAwM2U4LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTA0MDAwMTYsIAorMHg5ODIxLCAweDNjMTUwMDIwLCAweDI0MTEwMDEwLCAweDhmNDIwMDBjLCAKKzB4OGY0NDAxNjAsIDB4OGY0NTAxNjQsIDB4OGY4NjAxMjAsIDB4YWZiMTAwMTAsIAorMHhhZmIyMDAxNCwgMHg1NTEwMjUsIDB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsIAorMHgyNDA3MDAwOCwgMHg0MGY4MDksIDB4MjRjNjAwMWMsIDB4MTQ0MGZmZTMsIAorMHgwLCAweDhmODIwMDU0LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIAorMHgxNDQwZmZlZSwgMHgwLCAweDMyNjIwMGZmLCAweDE0NDAwMDExLCAKKzB4MCwgMHg4ZjQyMDM3OCwgMHgyNDQyMDAwMSwgMHhhZjQyMDM3OCwgCisweDhmNDIwMzc4LCAweDhmODIwMTIwLCAweDhmYWEwMDJjLCAweGFmYTIwMDEwLCAKKzB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDYxMjAsIDB4M2MwNTAwMDksIAorMHhhZmEyMDAxNCwgMHg4ZDQ2MDAwMCwgMHgzNGE1MDcwMCwgMHhjMDAyYjNiLCAKKzB4M2MwMzgyMSwgMHg4ZjQyMDJlYywgMHgyNDQyMDAwMSwgMHhhZjQyMDJlYywgCisweDhmNDIwMmVjLCAweDhmNDIwMDA0LCAweDMwNDIwMDAxLCAweDEwNDAwMDE4LCAKKzB4MjQwNDAwMDEsIDB4OGY0MjAyNTAsIDB4OGY0MzAyNTQsIDB4OGY0NTAxYjQsIAorMHgzYzAxMDAwMSwgMHgxNDY1MDAwNiwgMHhhMDI0NmNmMSwgMHg4ZjQyMDI3MCwgCisweDhmNDMwMjc0LCAweDhmNDQwMWI4LCAweDEwNjQwMDIxLCAweDAsIAorMHg4ZjQyMDI1MCwgMHg4ZjQzMDI1NCwgMHgzYzA0MDAwMSwgMHg5MDg0NmNmMCwgCisweDhmNDYwMjcwLCAweDhmNDcwMjc0LCAweDM4ODQwMDAxLCAweGFmNDMwMWI0LCAKKzB4YWY0NzAxYjgsIDB4M2MwMTAwMDEsIDB4MTAwMDAwMjUsIDB4YTAyNDZjZjAsIAorMHg4ZjQyMDBkNCwgMHgzYzAxMDAwMSwgMHhhMDIwNmNmMCwgMHgyNDQzMDAwMSwgCisweDI4NDIwMDMzLCAweDE0NDAwMDFlLCAweGFmNDMwMGQ0LCAweDNjMDIwMDAxLCAKKzB4OTA0MjZjZjEsIDB4YWY0MDAwZDQsIDB4MTAwMDAwMTcsIDB4Mzg0MjAwMDEsIAorMHg4ZjQyMDAwNCwgMHgzMDQyMDAwMSwgMHgxMDQwMDAwOCwgMHgwLCAKKzB4YzAwNTY1YSwgMHgyMDIxLCAweDNjMDEwMDAxLCAweGEwMjA2Y2YxLCAKKzB4M2MwMTAwMDEsIDB4MTAwMDAwMGUsIDB4YTAyMDZjZjAsIDB4OGY0MjAwZDQsIAorMHgzYzAxMDAwMSwgMHhhMDIwNmNmMCwgMHgyNDQzMDAwMSwgMHgyODQyMDFmNSwgCisweDE0NDAwMDA3LCAweGFmNDMwMGQ0LCAweDNjMDIwMDAxLCAweDkwNDI2Y2YxLCAKKzB4YWY0MDAwZDQsIDB4NDIxMDI2LCAweDNjMDEwMDAxLCAweGEwMjI2Y2YxLCAKKzB4M2MwMzAwMDEsIDB4OGM2MzZkOTgsIDB4MjQwMjAwMDIsIDB4MTQ2MjAwMGMsIAorMHgzYzAzMDAwMiwgMHgzYzAzMDAwMSwgMHg5MDYzNmNmMSwgMHgyNDAyMDAwMSwgCisweDU0NjIwMDFmLCAweDIwMjEsIDB4M2MwMjAwMDEsIDB4OTA0MjZjZjAsIAorMHgxNDQzMDAxYiwgMHgyNDA0MDAwNSwgMHgxMDAwMDAxOSwgMHgyNDA0MDAwNiwgCisweDNjMDIwMDAyLCAweDhjNDI4ZmY0LCAweDQzMTAyNCwgMHgxMDQwMDAwYiwgCisweDI0MDIwMDAxLCAweDNjMDMwMDAxLCAweDkwNjM2Y2YxLCAweDU0NjIwMDEwLCAKKzB4MjAyMSwgMHgzYzAyMDAwMSwgMHg5MDQyNmNmMCwgMHgxNDQzMDAwYywgCisweDI0MDQwMDAzLCAweDEwMDAwMDBhLCAweDI0MDQwMDA0LCAweDNjMDMwMDAxLCAKKzB4OTA2MzZjZjEsIDB4MTQ2MjAwMDYsIDB4MjAyMSwgMHgzYzAyMDAwMSwgCisweDkwNDI2Y2YwLCAweDI0MDQwMDAxLCAweDUwNDQwMDAxLCAweDI0MDQwMDAyLCAKKzB4YzAwNTY1YSwgMHgwLCAweDI0MDJmZjdmLCAweDI4MmEwMjQsIAorMHg4ZmJmMDA0OCwgMHg4ZmJlMDA0NCwgMHg4ZmI1MDA0MCwgMHg4ZmIzMDAzYywgCisweDhmYjIwMDM4LCAweDhmYjEwMDM0LCAweDhmYjAwMDMwLCAweDNlMDAwMDgsIAorMHgyN2JkMDA1MCwgMHgzZTAwMDA4LCAweDAsIDB4M2MwMjAwMDEsIAorMHg4YzQyNmRhOCwgMHgyN2JkZmZiMCwgMHhhZmJmMDA0OCwgMHhhZmJlMDA0NCwgCisweGFmYjUwMDQwLCAweGFmYjMwMDNjLCAweGFmYjIwMDM4LCAweGFmYjEwMDM0LCAKKzB4MTA0MDAwZGUsIDB4YWZiMDAwMzAsIDB4OGY0MjAwZDAsIDB4M2MwNDAwMDEsIAorMHg4Yzg0NmQ5OCwgMHgyNDQzMDAwMSwgMHgyODQyMDAwYiwgMHhhZjQ0MDBlOCwgCisweDE0NDAwMGZlLCAweGFmNDMwMGQwLCAweDhmNDIwMDA0LCAweDMwNDIwMDAyLCAKKzB4MTQ0MDAwOTUsIDB4YWY0MDAwZDAsIDB4OGY0MjAwMDQsIDB4MzQ0MjAwMDIsIAorMHhhZjQyMDAwNCwgMHgyNDAyMDAwMSwgMHgxNDgyMDAwMywgMHgzYzAyMDYwMCwgCisweDEwMDAwMDAyLCAweDM0NDIzMDAwLCAweDM0NDIxMDAwLCAweGFmYTIwMDIwLCAKKzB4MTgyMSwgMHg4ZjVlMDAxOCwgMHgyN2FhMDAyMCwgMHgyNDAyMDBmZiwgCisweDEzYzIwMDAyLCAweGFmYWEwMDJjLCAweDI3YzMwMDAxLCAweDhjMDIwMjI4LCAKKzB4NjA5MDIxLCAweDE2NDIwMDBlLCAweDFlMzhjMCwgMHg4ZjQyMDMzYywgCisweDI0NDIwMDAxLCAweGFmNDIwMzNjLCAweDhmNDIwMzNjLCAweDhjMDIwMjI4LCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDYxMGMsIDB4M2MwNTAwMDksIDB4YWZhMDAwMTQsIAorMHhhZmEyMDAxMCwgMHg4ZmE2MDAyMCwgMHgxMDAwMDA2ZCwgMHgzNGE1MDUwMCwgCisweGY3MTAyMSwgMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwgMHhhYzQzMDRjMCwgCisweGFjNDQwNGM0LCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NzAwM2U4LCAKKzB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxMDQwMDAxYiwgMHg5ODIxLCAKKzB4ZTA4ODIxLCAweDI2MzUwNGMwLCAweDhmNDQwMTc4LCAweDhmNDUwMTdjLCAKKzB4MjIwMTgyMSwgMHgyNDBhMDAwNCwgMHhhZmFhMDAxMCwgMHhhZmIyMDAxNCwgCisweDhmNDgwMDBjLCAweDEwMjEsIDB4MmY1MzAyMSwgMHhhZmE4MDAxOCwgCisweDhmNDgwMTBjLCAweDI0MDcwMDA4LCAweGEzMjgyMSwgMHhhMzQ4MmIsIAorMHg4MjIwMjEsIDB4MTAwZjgwOSwgMHg4OTIwMjEsIDB4NTQ0MDAwMDYsIAorMHgyNDEzMDAwMSwgMHg4ZjgyMDA1NCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAKKzB4MTQ0MGZmZTksIDB4MCwgMHgzMjYyMDBmZiwgMHg1NDQwMDAxNywgCisweGFmNTIwMDE4LCAweDhmNDIwMzc4LCAweDI0NDIwMDAxLCAweGFmNDIwMzc4LCAKKzB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsIDB4OGZhYTAwMmMsIDB4YWZhMjAwMTAsIAorMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjExOCwgMHgzYzA1MDAwOSwgCisweGFmYTIwMDE0LCAweDhkNDYwMDAwLCAweDEwMDAwMDM1LCAweDM0YTUwNjAwLCAKKzB4OGY0MjAzMDgsIDB4MjQxMzAwMDEsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDgsIAorMHg4ZjQyMDMwOCwgMHgxMDAwMDAxZSwgMHgzMjYyMDBmZiwgMHg4ZjgzMDA1NCwgCisweDhmODIwMDU0LCAweDI0NzAwM2U4LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIAorMHgxMDQwMDAxNiwgMHg5ODIxLCAweDNjMTUwMDIwLCAweDI0MTEwMDEwLCAKKzB4OGY0MjAwMGMsIDB4OGY0NDAxNjAsIDB4OGY0NTAxNjQsIDB4OGY4NjAxMjAsIAorMHhhZmIxMDAxMCwgMHhhZmIyMDAxNCwgMHg1NTEwMjUsIDB4YWZhMjAwMTgsIAorMHg4ZjQyMDEwYywgMHgyNDA3MDAwOCwgMHg0MGY4MDksIDB4MjRjNjAwMWMsIAorMHgxNDQwZmZlMywgMHgwLCAweDhmODIwMDU0LCAweDIwMjEwMjMsIAorMHgyYzQyMDNlOSwgMHgxNDQwZmZlZSwgMHgwLCAweDMyNjIwMGZmLCAKKzB4MTQ0MDAwMTEsIDB4MCwgMHg4ZjQyMDM3OCwgMHgyNDQyMDAwMSwgCisweGFmNDIwMzc4LCAweDhmNDIwMzc4LCAweDhmODIwMTIwLCAweDhmYWEwMDJjLCAKKzB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDYxMjAsIAorMHgzYzA1MDAwOSwgMHhhZmEyMDAxNCwgMHg4ZDQ2MDAwMCwgMHgzNGE1MDcwMCwgCisweGMwMDJiM2IsIDB4M2MwMzgyMSwgMHg4ZjQyMDJlYywgMHgyNDQyMDAwMSwgCisweGFmNDIwMmVjLCAweDhmNDIwMmVjLCAweDhmNDIwMDA0LCAweDMwNDIwMDAxLCAKKzB4MTA0MDAwMzMsIDB4M2MwMjA0MDAsIDB4MmMyMTAyNCwgMHgxMDQwMDAxNywgCisweDAsIDB4OTM0MjA1YzAsIDB4OGY0NDAyNTAsIDB4OGY0NTAyNTQsIAorMHg4ZjQzMDFiNCwgMHgzNDQyMDAyMCwgMHgxNGEzMDAwNiwgMHhhMzQyMDVjMCwgCisweDhmNDIwMjcwLCAweDhmNDMwMjc0LCAweDhmNDQwMWI4LCAweDEwNjQwMDA4LCAKKzB4MCwgMHg4ZjQyMDI1MCwgMHg4ZjQzMDI1NCwgMHg5MzQ0MDVjMCwgCisweDhmNDYwMjcwLCAweDhmNDcwMjc0LCAweDEwMDAwMDE2LCAweDM4ODQwMDQwLCAKKzB4OTM0MjA1YzAsIDB4MTAwMDAwNDgsIDB4MzA0MjAwYmYsIDB4OTM0MjA1YzAsIAorMHg4ZjQ0MDI1MCwgMHg4ZjQ1MDI1NCwgMHg4ZjQzMDFiNCwgMHgzMDQyMDBiZiwgCisweDE0YTMwMDA2LCAweGEzNDIwNWMwLCAweDhmNDIwMjcwLCAweDhmNDMwMjc0LCAKKzB4OGY0NDAxYjgsIDB4MTA2NDAwMGIsIDB4MCwgMHg4ZjQyMDI1MCwgCisweDhmNDMwMjU0LCAweDkzNDQwNWMwLCAweDhmNDYwMjcwLCAweDhmNDcwMjc0LCAKKzB4Mzg4NDAwMjAsIDB4YWY0MzAxYjQsIDB4YWY0NzAxYjgsIDB4MTAwMDAwMzMsIAorMHhhMzQ0MDVjMCwgMHg5MzQyMDVjMCwgMHgxMDAwMDAyZiwgMHgzNDQyMDAyMCwgCisweDkzNDIwNWMwLCAweDhmNDMwMGQ0LCAweDM0NDIwMDIwLCAweGEzNDIwNWMwLCAKKzB4MjQ2MjAwMDEsIDB4MTAwMDAwMjMsIDB4Mjg2MzAwMzMsIDB4OGY0MjAwZTQsIAorMHg4ZjQzMDBlMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDBlNCwgMHg0MzEwMmEsIAorMHgxNDQwMDAwNiwgMHgyNDAzMDAwMSwgMHg4ZjQyMDBlOCwgMHgxNDQzMDAwMiwgCisweGFmNDAwMGU0LCAweDI0MDMwMDA0LCAweGFmNDMwMGU4LCAweDhmNDIwMDA0LCAKKzB4MzA0MjAwMDEsIDB4MTA0MDAwMGQsIDB4M2MwMjA0MDAsIDB4MmMyMTAyNCwgCisweDEwNDAwMDA3LCAweDAsIDB4OTM0MjA1YzAsIDB4MzQ0MjAwNDAsIAorMHhhMzQyMDVjMCwgMHg5MzQyMDVjMCwgMHgxMDAwMDAwZiwgMHgzMDQyMDBkZiwgCisweDkzNDIwNWMwLCAweDEwMDAwMDBjLCAweDM0NDIwMDYwLCAweDkzNDIwNWMwLCAKKzB4OGY0MzAwZDQsIDB4MzQ0MjAwMjAsIDB4YTM0MjA1YzAsIDB4MjQ2MjAwMDEsIAorMHgyODYzMDBmYiwgMHgxNDYwMDAwNSwgMHhhZjQyMDBkNCwgMHg5MzQyMDVjMCwgCisweGFmNDAwMGQ0LCAweDM4NDIwMDQwLCAweGEzNDIwNWMwLCAweDkzNDIwNWMwLCAKKzB4OGY0MzAwZTgsIDB4MzA0MjAwN2YsIDB4YTM0MjA1YzAsIDB4MjQwMjAwMDEsIAorMHgxNDYyMDAwNSwgMHgwLCAweDkzNDQwNWMwLCAweDQyMTAyLCAKKzB4MTAwMDAwMDMsIDB4MzQ4NDAwZjAsIDB4OTM0NDA1YzAsIDB4MzQ4NDAwMGYsIAorMHhjMDA1NjQwLCAweDAsIDB4MjQwMmZmN2YsIDB4MjgyYTAyNCwgCisweDhmYmYwMDQ4LCAweDhmYmUwMDQ0LCAweDhmYjUwMDQwLCAweDhmYjMwMDNjLCAKKzB4OGZiMjAwMzgsIDB4OGZiMTAwMzQsIDB4OGZiMDAwMzAsIDB4M2UwMDAwOCwgCisweDI3YmQwMDUwLCAweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZiMCwgCisweDI3NDQwMWMwLCAweDI2ZTMwMDI4LCAweDI0NjUwNDAwLCAweDY1MTAyYiwgCisweGFmYmYwMDQ4LCAweGFmYmUwMDQ0LCAweGFmYjUwMDQwLCAweGFmYjMwMDNjLCAKKzB4YWZiMjAwMzgsIDB4YWZiMTAwMzQsIDB4MTA0MDAwMDcsIDB4YWZiMDAwMzAsIAorMHg4YzgyMDAwMCwgMHhhYzYyMDAwMCwgMHgyNDYzMDAwNCwgMHg2NTEwMmIsIAorMHgxNDQwZmZmYiwgMHgyNDg0MDAwNCwgMHg4YzAyMDA4MCwgMHhhZWUyMDA0NCwgCisweDhjMDIwMGMwLCAweGFlZTIwMDQwLCAweDhjMDIwMDg0LCAweGFlZTIwMDMwLCAKKzB4OGMwMjAwODQsIDB4YWVlMjAyM2MsIDB4OGMwMjAwODgsIDB4YWVlMjAyNDAsIAorMHg4YzAyMDA4YywgMHhhZWUyMDI0NCwgMHg4YzAyMDA5MCwgMHhhZWUyMDI0OCwgCisweDhjMDIwMDk0LCAweGFlZTIwMjRjLCAweDhjMDIwMDk4LCAweGFlZTIwMjUwLCAKKzB4OGMwMjAwOWMsIDB4YWVlMjAyNTQsIDB4OGMwMjAwYTAsIDB4YWVlMjAyNTgsIAorMHg4YzAyMDBhNCwgMHhhZWUyMDI1YywgMHg4YzAyMDBhOCwgMHhhZWUyMDI2MCwgCisweDhjMDIwMGFjLCAweGFlZTIwMjY0LCAweDhjMDIwMGIwLCAweGFlZTIwMjY4LCAKKzB4OGMwMjAwYjQsIDB4YWVlMjAyNmMsIDB4OGMwMjAwYjgsIDB4YWVlMjAyNzAsIAorMHg4YzAyMDBiYywgMHgyNDA0MDAwMSwgMHhhZWUyMDI3NCwgMHhhZWUwMDAzNCwgCisweDQxMDgwLCAweDU3MTAyMSwgMHg4ZWUzMDAzNCwgMHg4YzQyMDIzYywgCisweDI0ODQwMDAxLCAweDYyMTgyMSwgMHgyYzgyMDAwZiwgMHhhZWUzMDAzNCwgCisweDE0NDBmZmY4LCAweDQxMDgwLCAweDhjMDIwMGNjLCAweGFlZTIwMDQ4LCAKKzB4OGMwMjAwZDAsIDB4YWVlMjAwNGMsIDB4OGMwMjAwZTAsIDB4YWVlMjAxZjgsIAorMHg4YzAyMDBlNCwgMHhhZWUyMDFmYywgMHg4YzAyMDBlOCwgMHhhZWUyMDIwMCwgCisweDhjMDIwMGVjLCAweGFlZTIwMjA0LCAweDhjMDIwMGYwLCAweGFlZTIwMjA4LCAKKzB4OGVlNDAwYzAsIDB4OGVlNTAwYzQsIDB4OGMwMjAwZmMsIDB4NDUxMDJiLCAKKzB4MTA0MDAwMGIsIDB4MCwgMHg4ZWUyMDBjMCwgMHg4ZWUzMDBjNCwgCisweDI0MDQwMDAxLCAweDI0MDUwMDAwLCAweDY1MTgyMSwgMHg2NTMwMmIsIAorMHg0NDEwMjEsIDB4NDYxMDIxLCAweGFlZTIwMGMwLCAweGFlZTMwMGM0LCAKKzB4OGMwMjAwZmMsIDB4OGVlNDAwYzAsIDB4OGVlNTAwYzQsIDB4MjQwOGZmZmYsIAorMHgyNDA5MDAwMCwgMHg0MDE4MjEsIDB4MTAyMSwgMHg4ODIwMjQsIAorMHhhOTI4MjQsIDB4ODIyMDI1LCAweGEzMjgyNSwgMHhhZWU0MDBjMCwgCisweGFlZTUwMGM0LCAweDhlZTQwMGQwLCAweDhlZTUwMGQ0LCAweDhjMDIwMGY0LCAKKzB4NDUxMDJiLCAweDEwNDAwMDBiLCAweDAsIDB4OGVlMjAwZDAsIAorMHg4ZWUzMDBkNCwgMHgyNDA0MDAwMSwgMHgyNDA1MDAwMCwgMHg2NTE4MjEsIAorMHg2NTMwMmIsIDB4NDQxMDIxLCAweDQ2MTAyMSwgMHhhZWUyMDBkMCwgCisweGFlZTMwMGQ0LCAweDhjMDIwMGY0LCAweDhlZTQwMGQwLCAweDhlZTUwMGQ0LCAKKzB4NDAxODIxLCAweDEwMjEsIDB4ODgyMDI0LCAweGE5MjgyNCwgCisweDgyMjAyNSwgMHhhMzI4MjUsIDB4YWVlNDAwZDAsIDB4YWVlNTAwZDQsIAorMHg4ZWU0MDBjOCwgMHg4ZWU1MDBjYywgMHg4YzAyMDBmOCwgMHg0NTEwMmIsIAorMHgxMDQwMDAwYiwgMHgwLCAweDhlZTIwMGM4LCAweDhlZTMwMGNjLCAKKzB4MjQwNDAwMDEsIDB4MjQwNTAwMDAsIDB4NjUxODIxLCAweDY1MzAyYiwgCisweDQ0MTAyMSwgMHg0NjEwMjEsIDB4YWVlMjAwYzgsIDB4YWVlMzAwY2MsIAorMHg4YzAyMDBmOCwgMHg4ZWU0MDBjOCwgMHg4ZWU1MDBjYywgMHg0MDE4MjEsIAorMHgxMDIxLCAweDg4MjAyNCwgMHhhOTI4MjQsIDB4ODIyMDI1LCAKKzB4YTMyODI1LCAweDI0MDIwMDA4LCAweGFlZTQwMGM4LCAweGFlZTUwMGNjLCAKKzB4YWZhMjAwMTAsIDB4YWZhMDAwMTQsIDB4OGY0MjAwMGMsIDB4OGMwNDAyMDgsIAorMHg4YzA1MDIwYywgMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywgMHgyNmU2MDAyOCwgCisweDQwZjgwOSwgMHgyNDA3MDQwMCwgMHgxMDQwMDBmMCwgMHgzYzAyMDQwMCwgCisweGFmYTIwMDIwLCAweDkzNDIwNWM2LCAweDEwNDAwMDg5LCAweDE4MjEsIAorMHg4ZjVlMDAxOCwgMHgyN2FhMDAyMCwgMHgyNDAyMDBmZiwgMHgxM2MyMDAwMiwgCisweGFmYWEwMDJjLCAweDI3YzMwMDAxLCAweDhjMDIwMjI4LCAweDYwOTAyMSwgCisweDE2NDIwMDBlLCAweDFlMzhjMCwgMHg4ZjQyMDMzYywgMHgyNDQyMDAwMSwgCisweGFmNDIwMzNjLCAweDhmNDIwMzNjLCAweDhjMDIwMjI4LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDYxMGMsIDB4M2MwNTAwMDksIDB4YWZhMDAwMTQsIDB4YWZhMjAwMTAsIAorMHg4ZmE2MDAyMCwgMHgxMDAwMDA2YiwgMHgzNGE1MDUwMCwgMHhmNzEwMjEsIAorMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwgMHhhYzQzMDRjMCwgMHhhYzQ0MDRjNCwgCisweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NzAwM2U4LCAweDIwMjEwMjMsIAorMHgyYzQyMDNlOSwgMHgxMDQwMDAxYiwgMHg5ODIxLCAweGUwODgyMSwgCisweDI2MzUwNGMwLCAweDhmNDQwMTc4LCAweDhmNDUwMTdjLCAweDIyMDE4MjEsIAorMHgyNDBhMDAwNCwgMHhhZmFhMDAxMCwgMHhhZmIyMDAxNCwgMHg4ZjQ4MDAwYywgCisweDEwMjEsIDB4MmY1MzAyMSwgMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywgCisweDI0MDcwMDA4LCAweGEzMjgyMSwgMHhhMzQ4MmIsIDB4ODIyMDIxLCAKKzB4MTAwZjgwOSwgMHg4OTIwMjEsIDB4NTQ0MDAwMDYsIDB4MjQxMzAwMDEsIAorMHg4ZjgyMDA1NCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDE0NDBmZmU5LCAKKzB4MCwgMHgzMjYyMDBmZiwgMHg1NDQwMDAxNywgMHhhZjUyMDAxOCwgCisweDhmNDIwMzc4LCAweDI0NDIwMDAxLCAweGFmNDIwMzc4LCAweDhmNDIwMzc4LCAKKzB4OGY4MjAxMjAsIDB4OGZhYTAwMmMsIDB4YWZhMjAwMTAsIDB4OGY4MjAxMjQsIAorMHgzYzA0MDAwMSwgMHgyNDg0NjExOCwgMHgzYzA1MDAwOSwgMHhhZmEyMDAxNCwgCisweDhkNDYwMDAwLCAweDEwMDAwMDMzLCAweDM0YTUwNjAwLCAweDhmNDIwMzA4LCAKKzB4MjQxMzAwMDEsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMDgsIDB4OGY0MjAzMDgsIAorMHgxMDAwMDAxYywgMHgzMjYyMDBmZiwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgCisweDI0NzAwM2U4LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTA0MDAwMTQsIAorMHg5ODIxLCAweDI0MTEwMDEwLCAweDhmNDIwMDBjLCAweDhmNDQwMTYwLCAKKzB4OGY0NTAxNjQsIDB4OGY4NjAxMjAsIDB4YWZiMTAwMTAsIDB4YWZiMjAwMTQsIAorMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywgMHgyNDA3MDAwOCwgMHg0MGY4MDksIAorMHgyNGM2MDAxYywgMHgxNDQwZmZlNSwgMHgwLCAweDhmODIwMDU0LCAKKzB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxNDQwZmZlZiwgMHgwLCAKKzB4MzI2MjAwZmYsIDB4NTQ0MDAwMTIsIDB4MjQwMjAwMDEsIDB4OGY0MjAzNzgsIAorMHgyNDQyMDAwMSwgMHhhZjQyMDM3OCwgMHg4ZjQyMDM3OCwgMHg4ZjgyMDEyMCwgCisweDhmYWEwMDJjLCAweGFmYTIwMDEwLCAweDhmODIwMTI0LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDYxMjAsIDB4M2MwNTAwMDksIDB4YWZhMjAwMTQsIDB4OGQ0NjAwMDAsIAorMHgzNGE1MDcwMCwgMHhjMDAyYjNiLCAweDNjMDM4MjEsIDB4MTAyMSwgCisweDE0NDAwMDViLCAweDI0MDIwMDAxLCAweDEwMDAwMDY1LCAweDAsIAorMHg4ZjUxMDAxOCwgMHgyNDAyMDBmZiwgMHgxMjIyMDAwMiwgMHg4MDIxLCAKKzB4MjYzMDAwMDEsIDB4OGMwMjAyMjgsIDB4MTYwMjAwMGUsIDB4MTEzMGMwLCAKKzB4OGY0MjAzM2MsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsIAorMHg4YzAyMDIyOCwgMHgzYzA0MDAwMSwgMHgyNDg0NjBmNCwgMHgzYzA1MDAwOSwgCisweGFmYTAwMDE0LCAweGFmYTIwMDEwLCAweDhmYTYwMDIwLCAweDEwMDAwMDNmLCAKKzB4MzRhNTAxMDAsIDB4ZDcxMDIxLCAweDhmYTMwMDIwLCAweDhmYTQwMDI0LCAKKzB4YWM0MzA0YzAsIDB4YWM0NDA0YzQsIDB4YzAxODIxLCAweDhmNDQwMTc4LCAKKzB4OGY0NTAxN2MsIDB4MTAyMSwgMHgyNDA3MDAwNCwgMHhhZmE3MDAxMCwgCisweGFmYjAwMDE0LCAweDhmNDgwMDBjLCAweDI0YzYwNGMwLCAweDJlNjMwMjEsIAorMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywgMHgyNDA3MDAwOCwgMHhhMzI4MjEsIAorMHhhMzQ4MmIsIDB4ODIyMDIxLCAweDEwMGY4MDksIDB4ODkyMDIxLCAKKzB4MTQ0MDAwMGIsIDB4MjQwNzAwMDgsIDB4OGY4MjAxMjAsIDB4YWZhMjAwMTAsIAorMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjBmYywgMHgzYzA1MDAwOSwgCisweGFmYTIwMDE0LCAweDhmYTYwMDIwLCAweDEwMDAwMDFjLCAweDM0YTUwMjAwLCAKKzB4OGY0NDAxNjAsIDB4OGY0NTAxNjQsIDB4OGY0MzAwMGMsIDB4YWY1MDAwMTgsIAorMHg4Zjg2MDEyMCwgMHgyNDAyMDAxMCwgMHhhZmEyMDAxMCwgMHhhZmIwMDAxNCwgCisweGFmYTMwMDE4LCAweDhmNDIwMTBjLCAweDQwZjgwOSwgMHgyNGM2MDAxYywgCisweDU0NDAwMDExLCAweDI0MDIwMDAxLCAweDhmNDIwMzQwLCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzNDAsIDB4OGY0MjAzNDAsIDB4OGY4MjAxMjAsIDB4YWZhMjAwMTAsIAorMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjEwNCwgMHgzYzA1MDAwOSwgCisweGFmYTIwMDE0LCAweDhmYTYwMDIwLCAweDM0YTUwMzAwLCAweGMwMDJiM2IsIAorMHgyMjAzODIxLCAweDEwMjEsIDB4MTA0MDAwMGQsIDB4MjQwMjAwMDEsIAorMHg4ZjQyMDJlOCwgMHhhMzQwMDVjNiwgMHhhZjQwMDFiMCwgMHgyNDQyMDAwMSwgCisweGFmNDIwMmU4LCAweDhmNDIwMmU4LCAweDhlZTIwMTUwLCAweDI0NDIwMDAxLCAKKzB4YWVlMjAxNTAsIDB4MTAwMDAwMDMsIDB4OGVlMjAxNTAsIDB4MjQwMjAwMDEsIAorMHhhMzQyMDVjNiwgMHg4ZmJmMDA0OCwgMHg4ZmJlMDA0NCwgMHg4ZmI1MDA0MCwgCisweDhmYjMwMDNjLCAweDhmYjIwMDM4LCAweDhmYjEwMDM0LCAweDhmYjAwMDMwLCAKKzB4M2UwMDAwOCwgMHgyN2JkMDA1MCwgMHgyN2JkZmZkOCwgMHhhZmJmMDAyMCwgCisweDhmODIwMGIwLCAweDMwNDIwMDA0LCAweDEwNDAwMDY4LCAweDAsIAorMHg4ZjQzMDEyOCwgMHg4ZjgyMDEwNCwgMHgxNDYyMDAwNSwgMHgwLCAKKzB4OGY0MzAxMzAsIDB4OGY4MjAwYjQsIDB4MTA2MjAwMDYsIDB4MCwgCisweDhmODIwMTA0LCAweGFmNDIwMTI4LCAweDhmODIwMGI0LCAweDEwMDAwMDViLCAKKzB4YWY0MjAxMzAsIDB4OGY4MjAwYjAsIDB4M2MwMzAwODAsIDB4NDMxMDI0LCAKKzB4MTA0MDAwMGQsIDB4MCwgMHg4ZjgyMDExYywgMHgzNDQyMDAwMiwgCisweGFmODIwMTFjLCAweDhmODIwMGIwLCAweDI0MDNmZmZiLCAweDQzMTAyNCwgCisweGFmODIwMGIwLCAweDhmODIwMTFjLCAweDI0MDNmZmZkLCAweDQzMTAyNCwgCisweDEwMDAwMDRhLCAweGFmODIwMTFjLCAweDhmNDMwMTI4LCAweDhmODIwMTA0LCAKKzB4MTQ2MjAwMDUsIDB4MCwgMHg4ZjQzMDEzMCwgMHg4ZjgyMDBiNCwgCisweDEwNjIwMDEwLCAweDAsIDB4OGY4MjAxMDQsIDB4YWY0MjAxMjgsIAorMHg4ZjgyMDBiNCwgMHg4ZjQzMDEyOCwgMHhhZjQyMDEzMCwgMHhhZmEzMDAxMCwgCisweDhmNDIwMTMwLCAweDNjMDQwMDAxLCAweDI0ODQ2MTQ0LCAweGFmYTIwMDE0LCAKKzB4OGY4NjAxMWMsIDB4OGY4NzAwYjAsIDB4M2MwNTAwMDUsIDB4MTAwMDAwMzEsIAorMHgzNGE1MDkwMCwgMHg4ZjQyMDEyOCwgMHhhZmEyMDAxMCwgMHg4ZjQyMDEzMCwgCisweDNjMDQwMDAxLCAweDI0ODQ2MTUwLCAweGFmYTIwMDE0LCAweDhmODYwMTFjLCAKKzB4OGY4NzAwYjAsIDB4M2MwNTAwMDUsIDB4YzAwMmIzYiwgMHgzNGE1MTAwMCwgCisweDhmODIwMTFjLCAweDM0NDIwMDAyLCAweGFmODIwMTFjLCAweDhmODMwMTA0LCAKKzB4OGY4MjAwYjAsIDB4MzQ0MjAwMDEsIDB4YWY4MjAwYjAsIDB4MjQwMjAwMDgsIAorMHhhZjgzMDEwNCwgMHhhZmEyMDAxMCwgMHhhZmEwMDAxNCwgMHg4ZjQyMDAwYywgCisweDhjMDQwMjA4LCAweDhjMDUwMjBjLCAweGFmYTIwMDE4LCAweDhmNDIwMTBjLCAKKzB4MjZlNjAwMjgsIDB4NDBmODA5LCAweDI0MDcwNDAwLCAweDhmODIwMTFjLCAKKzB4MjQwM2ZmZmQsIDB4NDMxMDI0LCAweGFmODIwMTFjLCAweDhlZTIwMWRjLCAKKzB4MjQ0MjAwMDEsIDB4YWVlMjAxZGMsIDB4OGVlMjAxZGMsIDB4OGY0MjAxMjgsIAorMHhhZmEyMDAxMCwgMHg4ZjQyMDEzMCwgMHgzYzA0MDAwMSwgMHgyNDg0NjE1YywgCisweGFmYTIwMDE0LCAweDhmODYwMTFjLCAweDhmODcwMGIwLCAweDNjMDUwMDA1LCAKKzB4MzRhNTExMDAsIDB4YzAwMmIzYiwgMHgwLCAweDhmODIwMGEwLCAKKzB4MzA0MjAwMDQsIDB4MTA0MDAwNjksIDB4MCwgMHg4ZjQzMDEyYywgCisweDhmODIwMTI0LCAweDE0NjIwMDA1LCAweDAsIDB4OGY0MzAxMzQsIAorMHg4ZjgyMDBhNCwgMHgxMDYyMDAwNiwgMHgwLCAweDhmODIwMTI0LCAKKzB4YWY0MjAxMmMsIDB4OGY4MjAwYTQsIDB4MTAwMDAwNWMsIDB4YWY0MjAxMzQsIAorMHg4ZjgyMDBhMCwgMHgzYzAzMDA4MCwgMHg0MzEwMjQsIDB4MTA0MDAwMGQsIAorMHgwLCAweDhmODIwMTFjLCAweDM0NDIwMDAyLCAweGFmODIwMTFjLCAKKzB4OGY4MjAwYTAsIDB4MjQwM2ZmZmIsIDB4NDMxMDI0LCAweGFmODIwMGEwLCAKKzB4OGY4MjAxMWMsIDB4MjQwM2ZmZmQsIDB4NDMxMDI0LCAweDEwMDAwMDRiLCAKKzB4YWY4MjAxMWMsIDB4OGY0MzAxMmMsIDB4OGY4MjAxMjQsIDB4MTQ2MjAwMDUsIAorMHgwLCAweDhmNDMwMTM0LCAweDhmODIwMGE0LCAweDEwNjIwMDEwLCAKKzB4MCwgMHg4ZjgyMDEyNCwgMHhhZjQyMDEyYywgMHg4ZjgyMDBhNCwgCisweDhmNDMwMTJjLCAweGFmNDIwMTM0LCAweGFmYTMwMDEwLCAweDhmNDIwMTM0LCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDYxNjgsIDB4YWZhMjAwMTQsIDB4OGY4NjAxMWMsIAorMHg4Zjg3MDBhMCwgMHgzYzA1MDAwNSwgMHgxMDAwMDAzMiwgMHgzNGE1MTIwMCwgCisweDhmNDIwMTJjLCAweGFmYTIwMDEwLCAweDhmNDIwMTM0LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDYxNzQsIDB4YWZhMjAwMTQsIDB4OGY4NjAxMWMsIDB4OGY4NzAwYTAsIAorMHgzYzA1MDAwNSwgMHhjMDAyYjNiLCAweDM0YTUxMzAwLCAweDhmODIwMTFjLCAKKzB4MzQ0MjAwMDIsIDB4YWY4MjAxMWMsIDB4OGY4MzAxMjQsIDB4OGY4MjAwYTAsIAorMHgzNDQyMDAwMSwgMHhhZjgyMDBhMCwgMHgyNDAyMDA4MCwgMHhhZjgzMDEyNCwgCisweGFmYTIwMDEwLCAweGFmYTAwMDE0LCAweDhmNDIwMDE0LCAweDhjMDQwMjA4LCAKKzB4OGMwNTAyMGMsIDB4YWZhMjAwMTgsIDB4OGY0MjAxMDgsIDB4M2MwNjAwMDEsIAorMHgyNGM2NmVkOCwgMHg0MGY4MDksIDB4MjQwNzAwMDQsIDB4OGY4MjAxMWMsIAorMHgyNDAzZmZmZCwgMHg0MzEwMjQsIDB4YWY4MjAxMWMsIDB4OGVlMjAxZGMsIAorMHgyNDQyMDAwMSwgMHhhZWUyMDFkYywgMHg4ZWUyMDFkYywgMHg4ZjQyMDEyYywgCisweGFmYTIwMDEwLCAweDhmNDIwMTM0LCAweDNjMDQwMDAxLCAweDI0ODQ2MTgwLCAKKzB4YWZhMjAwMTQsIDB4OGY4NjAxMWMsIDB4OGY4NzAwYTAsIDB4M2MwNTAwMDUsIAorMHgzNGE1MTQwMCwgMHhjMDAyYjNiLCAweDAsIDB4OGZiZjAwMjAsIAorMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAweDNjMDgxMDAwLCAweDI0MDcwMDAxLCAKKzB4M2MwNjAwODAsIDB4M2MwNTAxMDAsIDB4OGY4MjAwNzAsIDB4NDgxMDI0LCAKKzB4MTA0MGZmZmQsIDB4MCwgMHg4ZjgyMDA1NCwgMHgyNDQyMDAwNSwgCisweGFmODIwMDc4LCAweDhjMDQwMjM0LCAweDEwODAwMDE2LCAweDE4MjEsIAorMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjQwZTgsIDB4MjQ0MjAwMDUsIAorMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4YWMyMjQwZTgsIDB4M2MwMjAwMDEsIAorMHg1NzEwMjEsIDB4OGM0MjQwZTgsIDB4NDQxMDJiLCAweDE0NDAwMDA5LCAKKzB4MCwgMHgzYzAzMDA4MCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHhhYzIwNDBlOCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4MTAwMDAwMGIsIAorMHhhMDI3NDBmMCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjQwZjAsIAorMHg1NDQwMDAwNiwgMHg2NjE4MjUsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAKKzB4OTA0MjQwZjEsIDB4NTQ0MDAwMDEsIDB4NjYxODI1LCAweDhjMDQwMjMwLCAKKzB4MTA4MDAwMTMsIDB4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIAorMHg4YzQyNDBlYywgMHgyNDQyMDAwNSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHhhYzIyNDBlYywgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OGM0MjQwZWMsIAorMHg0NDEwMmIsIDB4MTQ0MDAwMDYsIDB4MCwgMHgzYzAxMDAwMSwgCisweDM3MDgyMSwgMHhhYzIwNDBlYywgMHgxMDAwMDAwNiwgMHg2NTE4MjUsIAorMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjQwZjIsIDB4NTQ0MDAwMDEsIAorMHg2NTE4MjUsIDB4MTA2MGZmYmMsIDB4MCwgMHg4ZjQyMDAwMCwgCisweDEwNDAwMDA3LCAweDAsIDB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsIAorMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LCAweDAsIAorMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgMHgwLCAKKzB4OGY4MjAwNjAsIDB4NDMxMDI1LCAweGFmODIwMDYwLCAweDhmNDIwMDAwLCAKKzB4MTA0MDAwMDMsIDB4MCwgMHgxMDAwZmZhNywgMHhhZjgwMDA0YywgCisweDEwMDBmZmE1LCAweGFmODAwMDQ4LCAweDNlMDAwMDgsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDI3YmRmZmUwLCAKKzB4YWZiZjAwMTgsIDB4OGY4NjAwNjQsIDB4MzBjMjAwMDQsIDB4MTA0MDAwMjUsIAorMHgyNDA0MDAwNCwgMHg4YzAyMDExNCwgMHhhZjQyMDAyMCwgMHhhZjg0MDA2NCwgCisweDhmNDIwMmZjLCAweDI0NDIwMDAxLCAweGFmNDIwMmZjLCAweDhmNDIwMmZjLCAKKzB4OGY4MjAwNjQsIDB4MzA0MjAwMDQsIDB4MTQ0MDAwMDUsIDB4MCwgCisweDhjMDMwMTE0LCAweDhmNDIwMDIwLCAweDE0NjJmZmYyLCAweDAsIAorMHg4ZjQyMDAwMCwgMHgxMDQwMDAwNywgMHg4ZjQzMDAzYywgMHhhZjgwMDA0YywgCisweDhmODIwMDRjLCAweDEwNDBmZmZkLCAweDAsIDB4MTAwMDAwMDUsIAorMHgwLCAweGFmODAwMDQ4LCAweDhmODIwMDQ4LCAweDEwNDBmZmZkLCAKKzB4MCwgMHg4ZjgyMDA2MCwgMHg0MzEwMjUsIDB4YWY4MjAwNjAsIAorMHg4ZjQyMDAwMCwgMHgxMDQwMDA3MywgMHgwLCAweDEwMDAwMDZmLCAKKzB4MCwgMHgzMGMyMDAwOCwgMHgxMDQwMDAyMCwgMHgyNDA0MDAwOCwgCisweDhjMDIwMTFjLCAweGFmNDIwMDQ4LCAweGFmODQwMDY0LCAweDhmNDIwMmE4LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAyYTgsIDB4OGY0MjAyYTgsIDB4OGY4MjAwNjQsIAorMHgzMDQyMDAwOCwgMHgxNDQwMDAwNSwgMHgwLCAweDhjMDMwMTFjLCAKKzB4OGY0MjAwNDgsIDB4MTQ2MmZmZjIsIDB4MCwgMHg4ZjQyMDAwMCwgCisweDEwNDAwMDA3LCAweDAsIDB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsIAorMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LCAweDAsIAorMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgMHgwLCAKKzB4OGY4MjAwNjAsIDB4MTAwMGZmZDksIDB4MzQ0MjAyMDAsIDB4MzBjMjAwMjAsIAorMHgxMDQwMDAyMywgMHgyNDA0MDAyMCwgMHg4YzAyMDEyYywgMHhhZjQyMDA2OCwgCisweGFmODQwMDY0LCAweDhmNDIwMmQ4LCAweDI0NDIwMDAxLCAweGFmNDIwMmQ4LCAKKzB4OGY0MjAyZDgsIDB4OGY4MjAwNjQsIDB4MzA0MjAwMjAsIDB4MTQ0MDAwMDUsIAorMHgzMmMyNDAwMCwgMHg4YzAzMDEyYywgMHg4ZjQyMDA2OCwgMHgxNDYyZmZmMiwgCisweDMyYzI0MDAwLCAweDE0NDAwMDAyLCAweDNjMDIwMDAxLCAweDJjMmIwMjUsIAorMHg4ZjQyMDAwMCwgMHgxMDQwMDAwNywgMHgwLCAweGFmODAwMDRjLCAKKzB4OGY4MjAwNGMsIDB4MTA0MGZmZmQsIDB4MCwgMHgxMDAwMDAwNSwgCisweDAsIDB4YWY4MDAwNDgsIDB4OGY4MjAwNDgsIDB4MTA0MGZmZmQsIAorMHgwLCAweDhmODIwMDYwLCAweDEwMDBmZmI0LCAweDM0NDIwODAwLCAKKzB4MzBjMjAwMTAsIDB4MTA0MDAwMjksIDB4MjQwNDAwMTAsIDB4OGMwMjAxMjQsIAorMHhhZjQyMDA1OCwgMHhhZjg0MDA2NCwgMHg4ZjQyMDJkNCwgMHgyNDQyMDAwMSwgCisweGFmNDIwMmQ0LCAweDhmNDIwMmQ0LCAweDhmODIwMDY0LCAweDMwNDIwMDEwLCAKKzB4MTQ0MDAwMDUsIDB4MzJjMjIwMDAsIDB4OGMwMzAxMjQsIDB4OGY0MjAwNTgsIAorMHgxNDYyZmZmMiwgMHgzMmMyMjAwMCwgMHg1MDQwMDAwMSwgMHgzNmQ2ODAwMCwgCisweDhmNDIwMDAwLCAweDEwNDAwMDA3LCAweDAsIDB4YWY4MDAwNGMsIAorMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LCAKKzB4MCwgMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgCisweDAsIDB4OGY4MjAwNjAsIDB4MzQ0MjAxMDAsIDB4YWY4MjAwNjAsIAorMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywgMHgwLCAweDEwMDAwMDZjLCAKKzB4YWY4MDAwNGMsIDB4MTAwMDAwNmEsIDB4YWY4MDAwNDgsIDB4MzBjMjAwMDEsIAorMHgxMDQwMDAwNCwgMHgyNDAyMDAwMSwgMHhhZjgyMDA2NCwgMHgxMDAwMDA2NCwgCisweDAsIDB4MzBjMjAwMDIsIDB4MTQ0MDAwMGIsIDB4M2MwNTAwMDMsIAorMHgzYzA0MDAwMSwgMHgyNDg0NjI0NCwgMHgzNGE1MDUwMCwgMHgzODIxLCAKKzB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHgyNDAyZmZjMCwgCisweDEwMDAwMDU3LCAweGFmODIwMDY0LCAweDhjMDUwMjJjLCAweDhjMDIwMTBjLCAKKzB4MTBhMjAwNDgsIDB4NTEwODAsIDB4OGM0NjAzMDAsIDB4MjRhMjAwMDEsIAorMHgzMDQ1MDAzZiwgMHgyNDAyMDAwMywgMHhhYzA1MDIyYywgMHg2MWUwMiwgCisweDEwNjIwMDA1LCAweDI0MDIwMDEwLCAweDEwNjIwMDFkLCAweDMwYzIwZmZmLCAKKzB4MTAwMDAwMzksIDB4MCwgMHg4ZjQzMDJhOCwgMHg4ZjQ0MDAwMCwgCisweDMwYzIwZmZmLCAweGFmNDIwMDQ4LCAweDI0NjMwMDAxLCAweGFmNDMwMmE4LCAKKzB4MTA4MDAwMDcsIDB4OGY0MjAyYTgsIDB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsIAorMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LCAweDAsIAorMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgMHgwLCAKKzB4OGY4MjAwNjAsIDB4MzQ0MjAyMDAsIDB4YWY4MjAwNjAsIDB4OGY0MjAwMDAsIAorMHgxMDQwMDAxZiwgMHgwLCAweDEwMDAwMDFiLCAweDAsIAorMHhhZjQyMDA1OCwgMHgzMmMyMjAwMCwgMHg1MDQwMDAwMSwgMHgzNmQ2ODAwMCwgCisweDhmNDIwMmQ0LCAweDhmNDMwMDAwLCAweDI0NDIwMDAxLCAweGFmNDIwMmQ0LCAKKzB4MTA2MDAwMDcsIDB4OGY0MjAyZDQsIDB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsIAorMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LCAweDAsIAorMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgMHgwLCAKKzB4OGY4MjAwNjAsIDB4MzQ0MjAxMDAsIDB4YWY4MjAwNjAsIDB4OGY0MjAwMDAsIAorMHgxMDQwMDAwMywgMHgwLCAweDEwMDAwMDA2LCAweGFmODAwMDRjLCAKKzB4MTAwMDAwMDQsIDB4YWY4MDAwNDgsIDB4YzAwMjE5NiwgMHhjMDIwMjEsIAorMHg0MDI4MjEsIDB4OGMwMjAxMGMsIDB4MTRhMjAwMDIsIDB4MjQwMjAwMDIsIAorMHhhZjgyMDA2NCwgMHg4ZjgyMDA2NCwgMHgzMDQyMDAwMiwgMHgxNDQwMDAwNCwgCisweDAsIDB4OGMwMjAxMGMsIDB4MTRhMmZmYWMsIDB4MCwgCisweDhmYmYwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4M2UwMDAwOCwgCisweDAsIDB4MjdiZGZmYTAsIDB4YWZiMDAwNDAsIDB4ODA4MDIxLCAKKzB4MTAxNjAyLCAweDI0NDJmZmZmLCAweDMwNDMwMGZmLCAweDJjNjIwMDEzLCAKKzB4YWZiZjAwNTgsIDB4YWZiZTAwNTQsIDB4YWZiNTAwNTAsIDB4YWZiMzAwNGMsIAorMHhhZmIyMDA0OCwgMHhhZmIxMDA0NCwgMHgxMDQwMDFmMywgMHhhZmE1MDAzNCwgCisweDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNjI4OCwgCisweDQwMDAwOCwgMHgwLCAweDEwMTMwMiwgMHgzMDQ0MGZmZiwgCisweDI0MDIwMDAxLCAweDEwODIwMDA1LCAweDI0MDIwMDAyLCAweDEwODIwMDBjLCAKKzB4MjQwMmZmZmUsIDB4MTAwMDAwMjQsIDB4M2MwNTAwMDMsIDB4OGY0MzAwMDQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmYwNCwgMHhhZjQ0MDIwMCwgMHhhZjQ0MDIwNCwgCisweDNjMDQwMDAxLCAweDhjODQ2ZTgwLCAweDEwMDAwMDA5LCAweDM0NjMwMDAxLCAKKzB4OGY0MzAwMDQsIDB4YWY0NDAyMDAsIDB4YWY0NDAyMDQsIDB4M2MwNDAwMDEsIAorMHg4Yzg0NmU4MCwgMHg2MjE4MjQsIDB4M2MwMjAwMDEsIDB4MjQ0MmNhMjgsIAorMHgyMTEwMCwgMHgyMTE4MiwgMHhhZjQzMDAwNCwgMHgzYzAzMDgwMCwgCisweDQzMTAyNSwgMHhhYzgyMDAzOCwgMHg4Zjg0MDA1NCwgMHg0MTQ0MiwgCisweDQxYzgyLCAweDQzMTAyMSwgMHg0MWNjMiwgMHg0MzEwMjMsIAorMHg0MWQwMiwgMHg0MzEwMjEsIDB4NDFkNDIsIDB4NDMxMDIzLCAKKzB4MTAwMDAwMDksIDB4YWY0MjAyMDgsIDB4M2MwNDAwMDEsIDB4MjQ4NDYyNTAsIAorMHgzNGE1MTAwMCwgMHgyMDAzMDIxLCAweDM4MjEsIDB4YWZhMDAwMTAsIAorMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDhmNDIwMmEwLCAweDI0NDIwMDAxLCAKKzB4YWY0MjAyYTAsIDB4MTAwMDAyMWYsIDB4OGY0MjAyYTAsIDB4MjdiMDAwMjgsIAorMHgyMDAyMDIxLCAweDI0MDUwMjEwLCAweGMwMDJiYmYsIDB4MjQwNjAwMDgsIAorMHhjMDAyNTE4LCAweDIwMDIwMjEsIDB4MTAwMDAyMTYsIDB4MCwgCisweDhmYWEwMDM0LCAweDI3YTQwMDI4LCAweGExODgwLCAweDI1NDIwMDAxLCAKKzB4MzA0MjAwM2YsIDB4YWZhMjAwMzQsIDB4OGM2NTAzMDAsIDB4OGZhYTAwMzQsIAorMHgyMTA4MCwgMHg4YzQzMDMwMCwgMHgyNTQyMDAwMSwgMHgzMDQyMDAzZiwgCisweGFmYTIwMDM0LCAweGFjMDIwMjJjLCAweGFmYTUwMDI4LCAweGMwMDI1MTgsIAorMHhhZmEzMDAyYywgMHgxMDAwMDIwMywgMHgwLCAweDI3YjAwMDI4LCAKKzB4MjAwMjAyMSwgMHgyNDA1MDIxMCwgMHhjMDAyYmJmLCAweDI0MDYwMDA4LCAKKzB4YzAwMjY1NywgMHgyMDAyMDIxLCAweDEwMDAwMWZhLCAweDAsIAorMHg4ZmFhMDAzNCwgMHgyN2E0MDAyOCwgMHhhMTg4MCwgMHgyNTQyMDAwMSwgCisweDMwNDIwMDNmLCAweGFmYTIwMDM0LCAweDhjNjUwMzAwLCAweDhmYWEwMDM0LCAKKzB4MjEwODAsIDB4OGM0MzAzMDAsIDB4MjU0MjAwMDEsIDB4MzA0MjAwM2YsIAorMHhhZmEyMDAzNCwgMHhhYzAyMDIyYywgMHhhZmE1MDAyOCwgMHhjMDAyNjU3LCAKKzB4YWZhMzAwMmMsIDB4MTAwMDAxZTcsIDB4MCwgMHgxMDEzMDIsIAorMHgzMDQzMGZmZiwgMHgyNDAyMDAwMSwgMHgxMDYyMDAwNSwgMHgyNDAyMDAwMiwgCisweDEwNjIwMDFlLCAweDNjMDIwMDAyLCAweDEwMDAwMDMzLCAweDNjMDUwMDAzLCAKKzB4M2MwMzAwMDIsIDB4MmMzMTAyNCwgMHg1NDQwMDAzNywgMHgyYzNiMDI1LCAKKzB4OGY4MjAyMjgsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjIzOGQ4LCAKKzB4OGY4MjAyMmMsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjIzOGRjLCAKKzB4OGY4MjAyMzAsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjIzOGUwLCAKKzB4OGY4MjAyMzQsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjIzOGU0LCAKKzB4MjQwMmZmZmYsIDB4YWY4MjAyMjgsIDB4YWY4MjAyMmMsIDB4YWY4MjAyMzAsIAorMHhhZjgyMDIzNCwgMHgxMDAwMDAyMCwgMHgyYzNiMDI1LCAweDJjMjEwMjQsIAorMHgxMDQwMDAxMiwgMHgzYzAyZmZmZCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIAorMHg4YzQyMzhkOCwgMHhhZjgyMDIyOCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIAorMHg4YzQyMzhkYywgMHhhZjgyMDIyYywgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIAorMHg4YzQyMzhlMCwgMHhhZjgyMDIzMCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIAorMHg4YzQyMzhlNCwgMHhhZjgyMDIzNCwgMHgzYzAyZmZmZCwgMHgzNDQyZmZmZiwgCisweDEwMDAwMDA5LCAweDJjMmIwMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDYyNWMsIAorMHgzNGE1MTEwMCwgMHgyMDAzMDIxLCAweDM4MjEsIDB4YWZhMDAwMTAsIAorMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDhmNDIwMmNjLCAweDI0NDIwMDAxLCAKKzB4YWY0MjAyY2MsIDB4MTAwMDAxOWYsIDB4OGY0MjAyY2MsIDB4MTAxMzAyLCAKKzB4MzA0NTBmZmYsIDB4MjQwMjAwMDEsIDB4MTBhMjAwMDUsIDB4MjQwMjAwMDIsIAorMHgxMGEyMDAwZCwgMHgzYzA0MDhmZiwgMHgxMDAwMDAxNCwgMHgzYzA1MDAwMywgCisweDNjMDIwOGZmLCAweDM0NDJmZmZmLCAweDhmODMwMjIwLCAweDNjMDQwMDA0LCAKKzB4MmM0YjAyNSwgMHg2MjE4MjQsIDB4MzQ2MzAwMDgsIDB4YWY4MzAyMjAsIAorMHgxMDAwMDAxMiwgMHhhZjQ1MDI5OCwgMHgzNDg0ZmZmNywgMHgzYzAzZmZmYiwgCisweDhmODIwMjIwLCAweDM0NjNmZmZmLCAweDJjM2IwMjQsIDB4NDQxMDI0LCAKKzB4YWY4MjAyMjAsIDB4MTAwMDAwMDksIDB4YWY0NTAyOTgsIDB4M2MwNDAwMDEsIAorMHgyNDg0NjI2OCwgMHgzNGE1MTIwMCwgMHgyMDAzMDIxLCAweDM4MjEsIAorMHhhZmEwMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDhmNDIwMmJjLCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAyYmMsIDB4MTAwMDAxNzYsIDB4OGY0MjAyYmMsIAorMHgyNzg0MDIwOCwgMHgyNDA1MDIwMCwgMHhjMDAyYmJmLCAweDI0MDYwMDA4LCAKKzB4Mjc0NDAyMjQsIDB4MjQwNTAyMDAsIDB4YzAwMmJiZiwgMHgyNDA2MDAwOCwgCisweDhmNDIwMmM0LCAweDI0NDIwMDAxLCAweGFmNDIwMmM0LCAweDEwMDAwMTY5LCAKKzB4OGY0MjAyYzQsIDB4MTAxMzAyLCAweDMwNDMwZmZmLCAweDI0MDIwMDAxLCAKKzB4MTA2MjAwMTEsIDB4Mjg2MjAwMDIsIDB4NTA0MDAwMDUsIDB4MjQwMjAwMDIsIAorMHgxMDYwMDAwNywgMHgwLCAweDEwMDAwMDE3LCAweDAsIAorMHgxMDYyMDAwZiwgMHgwLCAweDEwMDAwMDEzLCAweDAsIAorMHg4YzA2MDI0OCwgMHgyMDIxLCAweGMwMDUxMDQsIDB4MjQwNTAwMDQsIAorMHgxMDAwMDAwNywgMHgwLCAweDhjMDYwMjQ4LCAweDIwMjEsIAorMHhjMDA1MTA0LCAweDI0MDUwMDA0LCAweDEwMDAwMDEwLCAweDAsIAorMHg4YzA2MDI0YywgMHgyMDIxLCAweGMwMDUxMDQsIDB4MjQwNTAwMDEsIAorMHgxMDAwMDAwYSwgMHgwLCAweDNjMDQwMDAxLCAweDI0ODQ2Mjc0LCAKKzB4M2MwNTAwMDMsIDB4MzRhNTEzMDAsIDB4MjAwMzAyMSwgMHgzODIxLCAKKzB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHg4ZjQyMDJjMCwgCisweDI0NDIwMDAxLCAweGFmNDIwMmMwLCAweDEwMDAwMTNhLCAweDhmNDIwMmMwLCAKKzB4YzAwMjQyNiwgMHgwLCAweDEwMDAwMTM2LCAweDAsIAorMHgyNDAyMDAwMSwgMHhhMzQyMDVjNSwgMHgyNDEwMDEwMCwgMHg4ZjQ0MDFhOCwgCisweDhmNDUwMWFjLCAweGFmYjAwMDEwLCAweGFmYTAwMDE0LCAweDhmNDIwMDE0LCAKKzB4YWZhMjAwMTgsIDB4OGY0MjAxMDgsIDB4MjZlNjAwMjgsIDB4NDBmODA5LCAKKzB4MjQwNzA0MDAsIDB4MTA0MGZmZjUsIDB4MCwgMHgxMDAwMDEyNSwgCisweDAsIDB4M2MwM2ZmZmYsIDB4MzQ2MzdmZmYsIDB4OGY0MjAzNjgsIAorMHg4ZjQ0MDM2MCwgMHgyYzNiMDI0LCAweDE4MjEsIDB4YWY0MDAwNTgsIAorMHhhZjQwMDA1YywgMHhhZjQwMDA2MCwgMHhhZjQwMDA2NCwgMHg0NDEwMjMsIAorMHhhZjQyMDM2OCwgMHgzYzAyMDkwMCwgMHhhZjQwMDM2MCwgMHhhZmEyMDAyMCwgCisweDhmNWUwMDE4LCAweDI3YWEwMDIwLCAweDI0MDIwMGZmLCAweDEzYzIwMDAyLCAKKzB4YWZhYTAwM2MsIDB4MjdjMzAwMDEsIDB4OGMwMjAyMjgsIDB4NjA5MDIxLCAKKzB4MTY0MjAwMGUsIDB4MWUzOGMwLCAweDhmNDIwMzNjLCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsIDB4OGMwMjAyMjgsIDB4M2MwNDAwMDEsIAorMHgyNDg0NjIwYywgMHgzYzA1MDAwOSwgMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwgCisweDhmYTYwMDIwLCAweDEwMDAwMDZiLCAweDM0YTUwNTAwLCAweGY3MTAyMSwgCisweDhmYTMwMDIwLCAweDhmYTQwMDI0LCAweGFjNDMwNGMwLCAweGFjNDQwNGM0LCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ3MDAzZTgsIDB4MjAyMTAyMywgCisweDJjNDIwM2U5LCAweDEwNDAwMDFiLCAweDk4MjEsIDB4ZTA4ODIxLCAKKzB4MjYzNTA0YzAsIDB4OGY0NDAxNzgsIDB4OGY0NTAxN2MsIDB4MjIwMTgyMSwgCisweDI0MGEwMDA0LCAweGFmYWEwMDEwLCAweGFmYjIwMDE0LCAweDhmNDgwMDBjLCAKKzB4MTAyMSwgMHgyZjUzMDIxLCAweGFmYTgwMDE4LCAweDhmNDgwMTBjLCAKKzB4MjQwNzAwMDgsIDB4YTMyODIxLCAweGEzNDgyYiwgMHg4MjIwMjEsIAorMHgxMDBmODA5LCAweDg5MjAyMSwgMHg1NDQwMDAwNiwgMHgyNDEzMDAwMSwgCisweDhmODIwMDU0LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTQ0MGZmZTksIAorMHgwLCAweDMyNjIwMGZmLCAweDU0NDAwMDE3LCAweGFmNTIwMDE4LCAKKzB4OGY0MjAzNzgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsIAorMHg4ZjgyMDEyMCwgMHg4ZmFhMDAzYywgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgCisweDNjMDQwMDAxLCAweDI0ODQ2MjE4LCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LCAKKzB4OGQ0NjAwMDAsIDB4MTAwMDAwMzMsIDB4MzRhNTA2MDAsIDB4OGY0MjAzMDgsIAorMHgyNDEzMDAwMSwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwOCwgMHg4ZjQyMDMwOCwgCisweDEwMDAwMDFjLCAweDMyNjIwMGZmLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAKKzB4MjQ3MDAzZTgsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxMDQwMDAxNCwgCisweDk4MjEsIDB4MjQxMTAwMTAsIDB4OGY0MjAwMGMsIDB4OGY0NDAxNjAsIAorMHg4ZjQ1MDE2NCwgMHg4Zjg2MDEyMCwgMHhhZmIxMDAxMCwgMHhhZmIyMDAxNCwgCisweGFmYTIwMDE4LCAweDhmNDIwMTBjLCAweDI0MDcwMDA4LCAweDQwZjgwOSwgCisweDI0YzYwMDFjLCAweDE0NDBmZmU1LCAweDAsIDB4OGY4MjAwNTQsIAorMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDE0NDBmZmVmLCAweDAsIAorMHgzMjYyMDBmZiwgMHgxNDQwMDAxMSwgMHgwLCAweDhmNDIwMzc4LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsIAorMHg4ZmFhMDAzYywgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2MjIwLCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LCAweDhkNDYwMDAwLCAKKzB4MzRhNTA3MDAsIDB4YzAwMmIzYiwgMHgzYzAzODIxLCAweDhmNDIwMmIwLCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAyYjAsIDB4OGY0MjAyYjAsIDB4OGY0MjAyZjgsIAorMHgyNDQyMDAwMSwgMHhhZjQyMDJmOCwgMHgxMDAwMDA4YSwgMHg4ZjQyMDJmOCwgCisweDhjMDIwMjVjLCAweDI3NDQwMjI0LCAweGFmNDIwMWYwLCAweDhjMDIwMjYwLCAKKzB4MjQwNTAyMDAsIDB4MjQwNjAwMDgsIDB4YzAwMmJiZiwgMHhhZjQyMDFmOCwgCisweDhmODIwMjIwLCAweDMwNDIwMDA4LCAweDE0NDAwMDAyLCAweDI0MDIwMDAxLCAKKzB4MjQwMjAwMDIsIDB4YWY0MjAyOTgsIDB4OGY0MjAyYWMsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDJhYywgMHgxMDAwMDA3NywgMHg4ZjQyMDJhYywgMHgzYzAyMDBmZiwgCisweDM0NDJmZmZmLCAweDIwMjE4MjQsIDB4MzJjMjAxODAsIDB4MTQ0MDAwMDYsIAorMHgzNDAyZmZmYiwgMHg0MzEwMmIsIDB4MTQ0MDAwMDMsIDB4MCwgCisweDEwMDAwMDZjLCAweGFmNDMwMGJjLCAweDNjMDQwMDAxLCAweDI0ODQ2MjgwLCAKKzB4M2MwNTAwMDMsIDB4MzRhNTE1MDAsIDB4MjAwMzAyMSwgMHgzODIxLCAKKzB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHgzYzAyMDcwMCwgCisweDM0NDIxMDAwLCAweDEwMWUwMiwgMHg2MjE4MjUsIDB4YWZhMzAwMjAsIAorMHg4ZjUxMDAxOCwgMHgyNDAyMDBmZiwgMHgxMjIyMDAwMiwgMHg4MDIxLCAKKzB4MjYzMDAwMDEsIDB4OGMwMjAyMjgsIDB4MTYwMjAwMGUsIDB4MTEzMGMwLCAKKzB4OGY0MjAzM2MsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsIAorMHg4YzAyMDIyOCwgMHgzYzA0MDAwMSwgMHgyNDg0NjFmNCwgMHgzYzA1MDAwOSwgCisweGFmYTAwMDE0LCAweGFmYTIwMDEwLCAweDhmYTYwMDIwLCAweDEwMDAwMDNmLCAKKzB4MzRhNTAxMDAsIDB4ZDcxMDIxLCAweDhmYTMwMDIwLCAweDhmYTQwMDI0LCAKKzB4YWM0MzA0YzAsIDB4YWM0NDA0YzQsIDB4YzAxODIxLCAweDhmNDQwMTc4LCAKKzB4OGY0NTAxN2MsIDB4MTAyMSwgMHgyNDA3MDAwNCwgMHhhZmE3MDAxMCwgCisweGFmYjAwMDE0LCAweDhmNDgwMDBjLCAweDI0YzYwNGMwLCAweDJlNjMwMjEsIAorMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywgMHgyNDA3MDAwOCwgMHhhMzI4MjEsIAorMHhhMzQ4MmIsIDB4ODIyMDIxLCAweDEwMGY4MDksIDB4ODkyMDIxLCAKKzB4MTQ0MDAwMGIsIDB4MjQwNzAwMDgsIDB4OGY4MjAxMjAsIDB4YWZhMjAwMTAsIAorMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjFmYywgMHgzYzA1MDAwOSwgCisweGFmYTIwMDE0LCAweDhmYTYwMDIwLCAweDEwMDAwMDFjLCAweDM0YTUwMjAwLCAKKzB4OGY0NDAxNjAsIDB4OGY0NTAxNjQsIDB4OGY0MzAwMGMsIDB4YWY1MDAwMTgsIAorMHg4Zjg2MDEyMCwgMHgyNDAyMDAxMCwgMHhhZmEyMDAxMCwgMHhhZmIwMDAxNCwgCisweGFmYTMwMDE4LCAweDhmNDIwMTBjLCAweDQwZjgwOSwgMHgyNGM2MDAxYywgCisweDE0NDAwMDEwLCAweDAsIDB4OGY0MjAzNDAsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDM0MCwgMHg4ZjQyMDM0MCwgMHg4ZjgyMDEyMCwgMHhhZmEyMDAxMCwgCisweDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ2MjA0LCAweDNjMDUwMDA5LCAKKzB4YWZhMjAwMTQsIDB4OGZhNjAwMjAsIDB4MzRhNTAzMDAsIDB4YzAwMmIzYiwgCisweDIyMDM4MjEsIDB4OGY0MjAyZTAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyZTAsIAorMHg4ZjQyMDJlMCwgMHg4ZjQyMDJmMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDJmMCwgCisweDhmNDIwMmYwLCAweDhmYTIwMDM0LCAweDhmYmYwMDU4LCAweDhmYmUwMDU0LCAKKzB4OGZiNTAwNTAsIDB4OGZiMzAwNGMsIDB4OGZiMjAwNDgsIDB4OGZiMTAwNDQsIAorMHg4ZmIwMDA0MCwgMHgzZTAwMDA4LCAweDI3YmQwMDYwLCAweDI3YmRmZmY4LCAKKzB4MjQwOGZmZmYsIDB4MTBhMDAwMTQsIDB4NDgyMSwgMHgzYzBhZWRiOCwgCisweDM1NGE4MzIwLCAweDkwODcwMDAwLCAweDI0ODQwMDAxLCAweDMwMjEsIAorMHgxMDcxMDI2LCAweDMwNDIwMDAxLCAweDEwNDAwMDAyLCAweDgxODQyLCAKKzB4NmExODI2LCAweDYwNDAyMSwgMHgyNGM2MDAwMSwgMHgyY2MyMDAwOCwgCisweDE0NDBmZmY3LCAweDczODQyLCAweDI1MjkwMDAxLCAweDEyNTEwMmIsIAorMHgxNDQwZmZmMCwgMHgwLCAweDEwMDEwMjEsIDB4M2UwMDAwOCwgCisweDI3YmQwMDA4LCAweDI3YmRmZmIwLCAweGFmYmYwMDQ4LCAweGFmYmUwMDQ0LCAKKzB4YWZiNTAwNDAsIDB4YWZiMzAwM2MsIDB4YWZiMjAwMzgsIDB4YWZiMTAwMzQsIAorMHhhZmIwMDAzMCwgMHg4Zjg3MDIyMCwgMHhhZmE3MDAyNCwgMHg4Zjg3MDIwMCwgCisweGFmYTcwMDJjLCAweDhmODIwMjIwLCAweDNjMDMwOGZmLCAweDM0NjNmZmZmLCAKKzB4NDMxMDI0LCAweDM0NDIwMDA0LCAweGFmODIwMjIwLCAweDhmODIwMjAwLCAKKzB4M2MwM2MwZmYsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweDM0NDIwMDA0LCAKKzB4YWY4MjAyMDAsIDB4OGY1MzAzNTgsIDB4OGY1NTAzNWMsIDB4OGY1ZTAzNjAsIAorMHg4ZjQ3MDM2NCwgMHhhZmE3MDAxNCwgMHg4ZjQ3MDM2OCwgMHhhZmE3MDAxYywgCisweDhmNDIwMmQwLCAweDI3NDQwMWMwLCAweDI0NDIwMDAxLCAweGFmNDIwMmQwLCAKKzB4OGY1MDAyZDAsIDB4OGY1MTAyMDQsIDB4OGY1MjAyMDAsIDB4YzAwMmJhOCwgCisweDI0MDUwNDAwLCAweGFmNTMwMzU4LCAweGFmNTUwMzVjLCAweGFmNWUwMzYwLCAKKzB4OGZhNzAwMTQsIDB4YWY0NzAzNjQsIDB4OGZhNzAwMWMsIDB4YWY0NzAzNjgsIAorMHhhZjUwMDJkMCwgMHhhZjUxMDIwNCwgMHhhZjUyMDIwMCwgMHg4YzAyMDI1YywgCisweDI3NDQwMjI0LCAweGFmNDIwMWYwLCAweDhjMDIwMjYwLCAweDI0MDUwMjAwLCAKKzB4MjQwNjAwMDgsIDB4YWY0MjAxZjgsIDB4MjQwMjAwMDYsIDB4YzAwMmJiZiwgCisweGFmNDIwMWY0LCAweDNjMDIzYjlhLCAweDM0NDJjYTAwLCAweGFmNDIwMWZjLCAKKzB4MjQwMjAzZTgsIDB4MjQwNDAwMDIsIDB4MjQwMzAwMDEsIDB4YWY0MjAyOTQsIAorMHhhZjQ0MDI5MCwgMHhhZjQzMDI5YywgMHg4ZjgyMDIyMCwgMHgzMDQyMDAwOCwgCisweDEwNDAwMDA0LCAweDAsIDB4YWY0MzAyOTgsIDB4MTAwMDAwMDMsIAorMHgzMDIxLCAweGFmNDQwMjk4LCAweDMwMjEsIDB4M2MwMzAwMDEsIAorMHg2NjE4MjEsIDB4OTA2MzZkMDAsIDB4MzQ2MTAyMSwgMHgyNGM2MDAwMSwgCisweGEwNDMwMjJjLCAweDJjYzIwMDBmLCAweDE0NDBmZmY4LCAweDM0NjE4MjEsIAorMHgyNGM2MDAwMSwgMHg4ZjgyMDA0MCwgMHgyNDA0MDA4MCwgMHgyNDA1MDA4MCwgCisweDIxNzAyLCAweDI0NDIwMDMwLCAweGEwNjIwMjJjLCAweDM0NjEwMjEsIAorMHhjMDAyYmE4LCAweGEwNDAwMjJjLCAweDhmYTcwMDI0LCAweDMwZTIwMDA0LCAKKzB4MTQ0MDAwMDYsIDB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgCisweDM0NjNmZmZiLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwgMHg4ZmE3MDAyYywgCisweDMwZTIwMDA0LCAweDE0NDAwMDA2LCAweDAsIDB4OGY4MjAyMDAsIAorMHgzYzAzYzBmZiwgMHgzNDYzZmZmYiwgMHg0MzEwMjQsIDB4YWY4MjAyMDAsIAorMHg4ZmJmMDA0OCwgMHg4ZmJlMDA0NCwgMHg4ZmI1MDA0MCwgMHg4ZmIzMDAzYywgCisweDhmYjIwMDM4LCAweDhmYjEwMDM0LCAweDhmYjAwMDMwLCAweDNlMDAwMDgsIAorMHgyN2JkMDA1MCwgMHgwLCAweDAsIDB4YWY0MDAxMDQsIAorMHgyNDA0MDAwMSwgMHg0MTBjMCwgMHgyZTIxODIxLCAweDI0ODIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4MjMwODIxLCAweGE0MjIzNGQwLCAweDQwMjAyMSwgCisweDJjODIwMDgwLCAweDE0NDBmZmY4LCAweDQxMGMwLCAweDI0MDIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGE0MjAzOGQwLCAweGFmNDIwMTAwLCAKKzB4YWY4MDAyMjgsIDB4YWY4MDAyMmMsIDB4YWY4MDAyMzAsIDB4YWY4MDAyMzQsIAorMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmZTgsIDB4YWZiZjAwMTQsIAorMHhhZmIwMDAxMCwgMHg4ZjQyMDEwNCwgMHgyODQyMDAwNSwgMHgxMDQwMDAyNiwgCisweDgwODAyMSwgMHgzYzAyMDAwMSwgMHg4ZjQzMDEwNCwgMHgzNDQyMzBkMCwgCisweDJlMjIwMjEsIDB4MzE4YzAsIDB4NjIxODIxLCAweDJlMzE4MjEsIAorMHg4MzEwMmIsIDB4MTA0MDAwMTUsIDB4MTAyMSwgMHg5NjA3MDAwMCwgCisweDI0ODQwMDA2LCAweDI0NjYwMDA2LCAweDk0ODJmZmZjLCAweDE0NDcwMDA5LCAKKzB4MjgyMSwgMHg5NDgzZmZmZSwgMHg5NjAyMDAwMiwgMHgxNDYyMDAwNiwgCisweGEwMTAyMSwgMHg5NDgyMDAwMCwgMHg5NjAzMDAwNCwgMHg0MzEwMjYsIAorMHgyYzQ1MDAwMSwgMHhhMDEwMjEsIDB4MTQ0MDAwMDksIDB4MjQ4NDAwMDgsIAorMHg4NjEwMmIsIDB4MTQ0MGZmZjAsIDB4MTAyMSwgMHgzMDQyMDBmZiwgCisweDE0NDAwMDMwLCAweDI0MDIwMDAxLCAweDEwMDAwMDJlLCAweDEwMjEsIAorMHgxMDAwZmZmYSwgMHgyNDAyMDAwMSwgMHgyMDAyMDIxLCAweGMwMDI0MGMsIAorMHgyNDA1MDAwNiwgMHgzMDQyMDA3ZiwgMHgyMThjMCwgMHgyZTMxMDIxLCAKKzB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDk0MjIzMGQwLCAweDEwNDBmZmYyLCAKKzB4MmUzMTAyMSwgMHgzYzA2MDAwMSwgMHhjMjMwMjEsIDB4OTRjNjMwZDAsIAorMHgxMGMwZmZlZCwgMHgzYzA4MDAwMSwgMHgzNTA4MzRkMiwgMHg5NjA3MDAwMCwgCisweDYxMGMwLCAweDU3MjAyMSwgMHg4ODIwMjEsIDB4OTQ4MjAwMDAsIAorMHgxNDQ3MDAwOSwgMHgyODIxLCAweDk0ODMwMDAyLCAweDk2MDIwMDAyLCAKKzB4MTQ2MjAwMDYsIDB4YTAxMDIxLCAweDk0ODIwMDA0LCAweDk2MDMwMDA0LCAKKzB4NDMxMDI2LCAweDJjNDUwMDAxLCAweGEwMTAyMSwgMHgxNDQwMDAwNywgCisweDYxMGMwLCAweDJlMjEwMjEsIDB4M2MwNjAwMDEsIDB4YzIzMDIxLCAKKzB4OTRjNjM0ZDAsIDB4MTRjMGZmZWIsIDB4NjEwYzAsIDB4MTBjMGZmZDIsIAorMHgyNDAyMDAwMSwgMHg4ZmJmMDAxNCwgMHg4ZmIwMDAxMCwgMHgzZTAwMDA4LCAKKzB4MjdiZDAwMTgsIDB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmIwLCAKKzB4ODAxMDIxLCAweGFmYjAwMDMwLCAweDI0NTAwMDAyLCAweDIwMDIwMjEsIAorMHgyNDA1MDAwNiwgMHhhZmIxMDAzNCwgMHg0MDg4MjEsIDB4YWZiZjAwNDgsIAorMHhhZmJlMDA0NCwgMHhhZmI1MDA0MCwgMHhhZmIzMDAzYywgMHhjMDAyNDBjLCAKKzB4YWZiMjAwMzgsIDB4MzA0NzAwN2YsIDB4NzEwYzAsIDB4MmUyMTAyMSwgCisweDNjMDUwMDAxLCAweGEyMjgyMSwgMHg5NGE1MzBkMCwgMHg1MGEwMDAxYywgCisweGEwMzAyMSwgMHgzYzA5MDAwMSwgMHgzNTI5MzRkMiwgMHg5NjI4MDAwMiwgCisweDUxMGMwLCAweDU3MjAyMSwgMHg4OTIwMjEsIDB4OTQ4MjAwMDAsIAorMHgxNDQ4MDAwOSwgMHgzMDIxLCAweDk0ODMwMDAyLCAweDk2MDIwMDAyLCAKKzB4MTQ2MjAwMDYsIDB4YzAxMDIxLCAweDk0ODIwMDA0LCAweDk2MDMwMDA0LCAKKzB4NDMxMDI2LCAweDJjNDYwMDAxLCAweGMwMTAyMSwgMHgxNDQwMDAwNywgCisweDUxMGMwLCAweDJlMjEwMjEsIDB4M2MwNTAwMDEsIDB4YTIyODIxLCAKKzB4OTRhNTM0ZDAsIDB4MTRhMGZmZWIsIDB4NTEwYzAsIDB4YTAzMDIxLCAKKzB4MTBjMDAwMTQsIDB4NjEwYzAsIDB4NTcxODIxLCAweDNjMDEwMDAxLCAKKzB4MjMwODIxLCAweDhjMjMzNGQwLCAweDU3MTAyMSwgMHhhZmEzMDAxMCwgCisweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyMzRkNCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2Mzk0LCAweGFmYTIwMDE0LCAweDhlMjYwMDAwLCAweDhlMjcwMDA0LCAKKzB4M2MwNTAwMDQsIDB4YzAwMmIzYiwgMHgzNGE1MDQwMCwgMHgxMDAwMDA2MywgCisweDNjMDIwODAwLCAweDhmNDUwMTAwLCAweDEwYTAwMDA2LCAweDUxMGMwLCAKKzB4MmUyMTAyMSwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OTQyMjM0ZDAsIAorMHhhZjQyMDEwMCwgMHhhMDMwMjEsIDB4MTRjMDAwMTEsIDB4NjI4YzAsIAorMHg3MTBjMCwgMHgyZTIxMDIxLCAweGFmYTcwMDEwLCAweDNjMDEwMDAxLCAKKzB4MjIwODIxLCAweDk0MjIzMGQwLCAweDNjMDQwMDAxLCAweDI0ODQ2M2EwLCAKKzB4YWZhMjAwMTQsIDB4OGUyNjAwMDAsIDB4OGUyNzAwMDQsIDB4M2MwNTAwMDQsIAorMHhjMDAyYjNiLCAweDM0YTUwNTAwLCAweDEwMDAwMDQ4LCAweDNjMDIwODAwLCAKKzB4YjcxODIxLCAweDNjMDIwMDAxLCAweDk2MDQwMDAwLCAweDM0NDIzNGQyLCAKKzB4NjIxODIxLCAweGE0NjQwMDAwLCAweDhlMDIwMDAyLCAweDcyMGMwLCAKKzB4YWM2MjAwMDIsIDB4MmU0MTAyMSwgMHgzYzAzMDAwMSwgMHg2MjE4MjEsIAorMHg5NDYzMzBkMCwgMHgyZTUxMDIxLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgCisweGE0MjMzNGQwLCAweDJlNDEwMjEsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAKKzB4YTQyNjMwZDAsIDB4OGY0MjAxMDQsIDB4MjQ0MjAwMDEsIDB4Mjg0MjAwODAsIAorMHgxMDQwMDAwZiwgMHgzYzAyMDAwMiwgMHg4ZjQyMDEwNCwgMHgzYzA0MDAwMSwgCisweDM0ODQzMGQyLCAweDk2MDMwMDAwLCAweDIxMGMwLCAweDU3MTAyMSwgCisweDQ0MTAyMSwgMHhhNDQzMDAwMCwgMHg4ZTAzMDAwMiwgMHhhYzQzMDAwMiwgCisweDhmNDIwMTA0LCAweDI0NDIwMDAxLCAweGFmNDIwMTA0LCAweDNjMDIwMDAyLCAKKzB4MmMyMTAyNCwgMHgxMDQwMDAxMSwgMHg3MjE0MiwgMHgzYzAzMDAwMSwgCisweDM0NjMzOGQ4LCAweDI0MDIwMDAzLCAweDQ0MTAyMywgMHgyMTA4MCwgCisweDU3MjAyMSwgMHg4MzIwMjEsIDB4NTcxMDIxLCAweDQzMTAyMSwgCisweDMwZTUwMDFmLCAweDhjNDMwMDAwLCAweDI0MDIwMDAxLCAweGEyMTAwNCwgCisweDYyMTgyNSwgMHgxMDAwMDAwYywgMHhhYzgzMDAwMCwgMHgyNDAyMDAwMywgCisweDQ0MTAyMywgMHgyMTA4MCwgMHg1YzI4MjEsIDB4NWMxMDIxLCAKKzB4MzBlNDAwMWYsIDB4OGM0MzAyMjgsIDB4MjQwMjAwMDEsIDB4ODIxMDA0LCAKKzB4NjIxODI1LCAweGFjYTMwMjI4LCAweDNjMDIwODAwLCAweDM0NDIxMDAwLCAKKzB4MTgyMSwgMHhhZmEyMDAyMCwgMHg4ZjVlMDAxOCwgMHgyN2FhMDAyMCwgCisweDI0MDIwMGZmLCAweDEzYzIwMDAyLCAweGFmYWEwMDJjLCAweDI3YzMwMDAxLCAKKzB4OGMwMjAyMjgsIDB4NjA5MDIxLCAweDE2NDIwMDBlLCAweDFlMzhjMCwgCisweDhmNDIwMzNjLCAweDI0NDIwMDAxLCAweGFmNDIwMzNjLCAweDhmNDIwMzNjLCAKKzB4OGMwMjAyMjgsIDB4M2MwNDAwMDEsIDB4MjQ4NDYzNWMsIDB4M2MwNTAwMDksIAorMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwgMHg4ZmE2MDAyMCwgMHgxMDAwMDA2YiwgCisweDM0YTUwNTAwLCAweGY3MTAyMSwgMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwgCisweGFjNDMwNGMwLCAweGFjNDQwNGM0LCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAKKzB4MjQ3MDAzZTgsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxMDQwMDAxYiwgCisweDk4MjEsIDB4ZTA4ODIxLCAweDI2MzUwNGMwLCAweDhmNDQwMTc4LCAKKzB4OGY0NTAxN2MsIDB4MjIwMTgyMSwgMHgyNDBhMDAwNCwgMHhhZmFhMDAxMCwgCisweGFmYjIwMDE0LCAweDhmNDgwMDBjLCAweDEwMjEsIDB4MmY1MzAyMSwgCisweGFmYTgwMDE4LCAweDhmNDgwMTBjLCAweDI0MDcwMDA4LCAweGEzMjgyMSwgCisweGEzNDgyYiwgMHg4MjIwMjEsIDB4MTAwZjgwOSwgMHg4OTIwMjEsIAorMHg1NDQwMDAwNiwgMHgyNDEzMDAwMSwgMHg4ZjgyMDA1NCwgMHgyMDIxMDIzLCAKKzB4MmM0MjAzZTksIDB4MTQ0MGZmZTksIDB4MCwgMHgzMjYyMDBmZiwgCisweDU0NDAwMDE3LCAweGFmNTIwMDE4LCAweDhmNDIwMzc4LCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsIDB4OGZhYTAwMmMsIAorMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjM2OCwgCisweDNjMDUwMDA5LCAweGFmYTIwMDE0LCAweDhkNDYwMDAwLCAweDEwMDAwMDMzLCAKKzB4MzRhNTA2MDAsIDB4OGY0MjAzMDgsIDB4MjQxMzAwMDEsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDMwOCwgMHg4ZjQyMDMwOCwgMHgxMDAwMDAxYywgMHgzMjYyMDBmZiwgCisweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDI0NzAwM2U4LCAweDIwMjEwMjMsIAorMHgyYzQyMDNlOSwgMHgxMDQwMDAxNCwgMHg5ODIxLCAweDI0MTEwMDEwLCAKKzB4OGY0MjAwMGMsIDB4OGY0NDAxNjAsIDB4OGY0NTAxNjQsIDB4OGY4NjAxMjAsIAorMHhhZmIxMDAxMCwgMHhhZmIyMDAxNCwgMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywgCisweDI0MDcwMDA4LCAweDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxNDQwZmZlNSwgCisweDAsIDB4OGY4MjAwNTQsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwgCisweDE0NDBmZmVmLCAweDAsIDB4MzI2MjAwZmYsIDB4MTQ0MDAwMTEsIAorMHgwLCAweDhmNDIwMzc4LCAweDI0NDIwMDAxLCAweGFmNDIwMzc4LCAKKzB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsIDB4OGZhYTAwMmMsIDB4YWZhMjAwMTAsIAorMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjM3MCwgMHgzYzA1MDAwOSwgCisweGFmYTIwMDE0LCAweDhkNDYwMDAwLCAweDM0YTUwNzAwLCAweGMwMDJiM2IsIAorMHgzYzAzODIxLCAweDhmNDIwMmI0LCAweDI0NDIwMDAxLCAweGFmNDIwMmI0LCAKKzB4OGY0MjAyYjQsIDB4OGY0MjAyZjQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyZjQsIAorMHg4ZjQyMDJmNCwgMHg4ZmJmMDA0OCwgMHg4ZmJlMDA0NCwgMHg4ZmI1MDA0MCwgCisweDhmYjMwMDNjLCAweDhmYjIwMDM4LCAweDhmYjEwMDM0LCAweDhmYjAwMDMwLCAKKzB4M2UwMDAwOCwgMHgyN2JkMDA1MCwgMHgyN2JkZmZhMCwgMHg4MDEwMjEsIAorMHhhZmIwMDA0MCwgMHgyNDUwMDAwMiwgMHgyMDAyMDIxLCAweDI0MDUwMDA2LCAKKzB4YWZiMTAwNDQsIDB4NDA4ODIxLCAweGFmYmYwMDU4LCAweGFmYmUwMDU0LCAKKzB4YWZiNTAwNTAsIDB4YWZiMzAwNGMsIDB4YzAwMjQwYywgMHhhZmIyMDA0OCwgCisweDMwNDgwMDdmLCAweDgxMGMwLCAweDJlMjEwMjEsIDB4M2MwNjAwMDEsIAorMHhjMjMwMjEsIDB4OTRjNjMwZDAsIDB4MTBjMDAwMWMsIDB4MzgyMSwgCisweDNjMGEwMDAxLCAweDM1NGEzNGQyLCAweDk2MjkwMDAyLCAweDYxMGMwLCAKKzB4NTcyMDIxLCAweDhhMjAyMSwgMHg5NDgyMDAwMCwgMHgxNDQ5MDAwOSwgCisweDI4MjEsIDB4OTQ4MzAwMDIsIDB4OTYwMjAwMDIsIDB4MTQ2MjAwMDYsIAorMHhhMDEwMjEsIDB4OTQ4MjAwMDQsIDB4OTYwMzAwMDQsIDB4NDMxMDI2LCAKKzB4MmM0NTAwMDEsIDB4YTAxMDIxLCAweDE0NDAwMDA4LCAweDYxMGMwLCAKKzB4YzAzODIxLCAweDJlMjEwMjEsIDB4M2MwNjAwMDEsIDB4YzIzMDIxLCAKKzB4OTRjNjM0ZDAsIDB4MTRjMGZmZWEsIDB4NjEwYzAsIDB4MTRjMDAwMTEsIAorMHhhZmE3MDAyOCwgMHg4MTBjMCwgMHgyZTIxMDIxLCAweGFmYTgwMDEwLCAKKzB4M2MwMTAwMDEsIDB4MjIwODIxLCAweDk0MjIzMGQwLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDYzYWMsIDB4YWZhMjAwMTQsIDB4OGUyNjAwMDAsIDB4OGUyNzAwMDQsIAorMHgzYzA1MDAwNCwgMHhjMDAyYjNiLCAweDM0YTUwOTAwLCAweDEwMDAwMDc1LCAKKzB4M2MwMjA4MDAsIDB4MTBlMDAwMGMsIDB4NjEwYzAsIDB4MmUyMTAyMSwgCisweDNjMDMwMDAxLCAweDYyMTgyMSwgMHg5NDYzMzRkMCwgMHg3MTBjMCwgCisweDJlMjEwMjEsIDB4M2MwMTAwMDEsIDB4MjIwODIxLCAweGE0MjMzNGQwLCAKKzB4MTAwMDAwMGIsIDB4M2MwNDAwMDEsIDB4MmUyMTAyMSwgMHgzYzAzMDAwMSwgCisweDYyMTgyMSwgMHg5NDYzMzRkMCwgMHg4MTBjMCwgMHgyZTIxMDIxLCAKKzB4M2MwMTAwMDEsIDB4MjIwODIxLCAweGE0MjMzMGQwLCAweDNjMDQwMDAxLCAKKzB4MzQ4NDMwZDAsIDB4OGY0MzAxMDAsIDB4NjEwYzAsIDB4MmUyMTAyMSwgCisweDNjMDEwMDAxLCAweDIyMDgyMSwgMHhhNDIzMzRkMCwgMHg4ZjQyMDEwNCwgCisweDJlNDM4MjEsIDB4MjgyMSwgMHgxODQwMDAyOSwgMHhhZjQ2MDEwMCwgCisweDI0ZTYwMDA2LCAweDk0YzNmZmZjLCAweDk2MDIwMDAwLCAweDE0NjIwMDA5LCAKKzB4MjAyMSwgMHg5NGMzZmZmZSwgMHg5NjAyMDAwMiwgMHgxNDYyMDAwNiwgCisweDgwMTAyMSwgMHg5NGMyMDAwMCwgMHg5NjAzMDAwNCwgMHg0MzEwMjYsIAorMHgyYzQ0MDAwMSwgMHg4MDEwMjEsIDB4NTA0MDAwMTQsIDB4MjRhNTAwMDEsIAorMHg4ZjQyMDEwNCwgMHgyNDQyZmZmZiwgMHhhMjEwMmEsIDB4MTA0MDAwMGIsIAorMHgyNGU0MDAwNCwgMHg5NDgyMDAwNiwgMHg4YzgzMDAwOCwgMHhhNDgyZmZmZSwgCisweGFjODMwMDAwLCAweDhmNDIwMTA0LCAweDI0YTUwMDAxLCAweDI0NDJmZmZmLCAKKzB4YTIxMDJhLCAweDE0NDBmZmY3LCAweDI0ODQwMDA4LCAweDhmNDIwMTA0LCAKKzB4MjQ0MmZmZmYsIDB4MTAwMDAwMDYsIDB4YWY0MjAxMDQsIDB4OGY0MjAxMDQsIAorMHgyNGM2MDAwOCwgMHhhMjEwMmEsIDB4MTQ0MGZmZGEsIDB4MjRlNzAwMDgsIAorMHg4MTBjMCwgMHgyZTIxMDIxLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgCisweDk0MjIzMGQwLCAweDE0NDAwMDIzLCAweDNjMDIwODAwLCAweDNjMDIwMDAyLCAKKzB4MmMyMTAyNCwgMHgxMDQwMDAxMiwgMHg4MjE0MiwgMHgzYzAzMDAwMSwgCisweDM0NjMzOGQ4LCAweDI0MDIwMDAzLCAweDQ0MTAyMywgMHgyMTA4MCwgCisweDU3MjAyMSwgMHg4MzIwMjEsIDB4NTcxMDIxLCAweDQzMTAyMSwgCisweDMxMDUwMDFmLCAweDI0MDMwMDAxLCAweDhjNDIwMDAwLCAweGEzMTgwNCwgCisweDMxODI3LCAweDQzMTAyNCwgMHgxMDAwMDAwZCwgMHhhYzgyMDAwMCwgCisweDI0MDIwMDAzLCAweDQ0MTAyMywgMHgyMTA4MCwgMHg1YzI4MjEsIAorMHg1YzEwMjEsIDB4MzEwNDAwMWYsIDB4MjQwMzAwMDEsIDB4OGM0MjAyMjgsIAorMHg4MzE4MDQsIDB4MzE4MjcsIDB4NDMxMDI0LCAweGFjYTIwMjI4LCAKKzB4M2MwMjA4MDAsIDB4MzQ0MjIwMDAsIDB4MTgyMSwgMHhhZmEyMDAyMCwgCisweDhmNWUwMDE4LCAweDI3YWIwMDIwLCAweDI0MDIwMGZmLCAweDEzYzIwMDAyLCAKKzB4YWZhYjAwMzQsIDB4MjdjMzAwMDEsIDB4OGMwMjAyMjgsIDB4NjA5MDIxLCAKKzB4MTY0MjAwMGUsIDB4MWUzOGMwLCAweDhmNDIwMzNjLCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsIDB4OGMwMjAyMjgsIDB4M2MwNDAwMDEsIAorMHgyNDg0NjM1YywgMHgzYzA1MDAwOSwgMHhhZmEwMDAxNCwgMHhhZmEyMDAxMCwgCisweDhmYTYwMDIwLCAweDEwMDAwMDZiLCAweDM0YTUwNTAwLCAweGY3MTAyMSwgCisweDhmYTMwMDIwLCAweDhmYTQwMDI0LCAweGFjNDMwNGMwLCAweGFjNDQwNGM0LCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ3MDAzZTgsIDB4MjAyMTAyMywgCisweDJjNDIwM2U5LCAweDEwNDAwMDFiLCAweDk4MjEsIDB4ZTA4ODIxLCAKKzB4MjYzNTA0YzAsIDB4OGY0NDAxNzgsIDB4OGY0NTAxN2MsIDB4MjIwMTgyMSwgCisweDI0MGIwMDA0LCAweGFmYWIwMDEwLCAweGFmYjIwMDE0LCAweDhmNDgwMDBjLCAKKzB4MTAyMSwgMHgyZjUzMDIxLCAweGFmYTgwMDE4LCAweDhmNDgwMTBjLCAKKzB4MjQwNzAwMDgsIDB4YTMyODIxLCAweGEzNDgyYiwgMHg4MjIwMjEsIAorMHgxMDBmODA5LCAweDg5MjAyMSwgMHg1NDQwMDAwNiwgMHgyNDEzMDAwMSwgCisweDhmODIwMDU0LCAweDIwMjEwMjMsIDB4MmM0MjAzZTksIDB4MTQ0MGZmZTksIAorMHgwLCAweDMyNjIwMGZmLCAweDU0NDAwMDE3LCAweGFmNTIwMDE4LCAKKzB4OGY0MjAzNzgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsIAorMHg4ZjgyMDEyMCwgMHg4ZmFiMDAzNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgCisweDNjMDQwMDAxLCAweDI0ODQ2MzY4LCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LCAKKzB4OGQ2NjAwMDAsIDB4MTAwMDAwMzMsIDB4MzRhNTA2MDAsIDB4OGY0MjAzMDgsIAorMHgyNDEzMDAwMSwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwOCwgMHg4ZjQyMDMwOCwgCisweDEwMDAwMDFjLCAweDMyNjIwMGZmLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAKKzB4MjQ3MDAzZTgsIDB4MjAyMTAyMywgMHgyYzQyMDNlOSwgMHgxMDQwMDAxNCwgCisweDk4MjEsIDB4MjQxMTAwMTAsIDB4OGY0MjAwMGMsIDB4OGY0NDAxNjAsIAorMHg4ZjQ1MDE2NCwgMHg4Zjg2MDEyMCwgMHhhZmIxMDAxMCwgMHhhZmIyMDAxNCwgCisweGFmYTIwMDE4LCAweDhmNDIwMTBjLCAweDI0MDcwMDA4LCAweDQwZjgwOSwgCisweDI0YzYwMDFjLCAweDE0NDBmZmU1LCAweDAsIDB4OGY4MjAwNTQsIAorMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDE0NDBmZmVmLCAweDAsIAorMHgzMjYyMDBmZiwgMHgxNDQwMDAxMSwgMHgwLCAweDhmNDIwMzc4LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsIAorMHg4ZmFiMDAzNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2MzcwLCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LCAweDhkNjYwMDAwLCAKKzB4MzRhNTA3MDAsIDB4YzAwMmIzYiwgMHgzYzAzODIxLCAweDhmNDIwMmI4LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAyYjgsIDB4OGY0MjAyYjgsIDB4OGY0MjAyZjQsIAorMHgyNDQyMDAwMSwgMHhhZjQyMDJmNCwgMHg4ZjQyMDJmNCwgMHg4ZmJmMDA1OCwgCisweDhmYmUwMDU0LCAweDhmYjUwMDUwLCAweDhmYjMwMDRjLCAweDhmYjIwMDQ4LCAKKzB4OGZiMTAwNDQsIDB4OGZiMDAwNDAsIDB4M2UwMDAwOCwgMHgyN2JkMDA2MCwgCisweDAsIDB4MCwgMHgwLCAweDI3YmRmZmUwLCAKKzB4Mjc2NDQwMDAsIDB4YWZiZjAwMTgsIDB4YzAwMmJhOCwgMHgyNDA1MTAwMCwgCisweDNjMDMwMDAxLCAweDM0NjMyY2MwLCAweDNjMDQwMDAxLCAweDM0ODQyZWM4LCAKKzB4MjQwMjAwMjAsIDB4YWY4MjAxMWMsIDB4MmUzMTAyMSwgMHhhZjgwMDEwMCwgCisweGFmODAwMTA0LCAweGFmODAwMTA4LCAweGFmODAwMTEwLCAweGFmODAwMTE0LCAKKzB4YWY4MDAxMTgsIDB4YWY4MDAxMjAsIDB4YWY4MDAxMjQsIDB4YWY4MDAxMjgsIAorMHhhZjgwMDEzMCwgMHhhZjgwMDEzNCwgMHhhZjgwMDEzOCwgMHhhZjQyMDBlYywgCisweDJlMzEwMjEsIDB4YWY0MjAwZjAsIDB4MmU0MTAyMSwgMHhhZjQyMDBmNCwgCisweDJlNDEwMjEsIDB4YWY0MjAwZjgsIDB4M2MwMjAwMDEsIDB4NTcxMDIxLCAKKzB4OTA0MjQwZjQsIDB4MTQ0MDAwMWMsIDB4M2MwNTAwMDEsIDB4OGY4MjAxMWMsIAorMHgzYzA0MDAwMSwgMHgyNDg0NjQ3MCwgMHgzYzA1MDAwMSwgMHgzNDQyMDAwMSwgCisweGFmODIwMTFjLCAweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMTFjLCAKKzB4MzRhNTAxMDAsIDB4YzAwMmIzYiwgMHgzODIxLCAweDhjMDIwMjE4LCAKKzB4MzA0MjAwNDAsIDB4MTA0MDAwMTQsIDB4MCwgMHg4ZjgyMDExYywgCisweDNjMDQwMDAxLCAweDI0ODQ2NDdjLCAweDNjMDUwMDAxLCAweDM0NDIwMDA0LCAKKzB4YWY4MjAxMWMsIDB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY4NjAxMWMsIAorMHgxMDAwMDAwNywgMHgzNGE1MDIwMCwgMHgzYzA0MDAwMSwgMHgyNDg0NjQ4NCwgCisweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMTFjLCAweDM0YTUwMzAwLCAKKzB4YzAwMmIzYiwgMHgzODIxLCAweDhmYmYwMDE4LCAweDNlMDAwMDgsIAorMHgyN2JkMDAyMCwgMHg4ZmE5MDAxMCwgMHg4ZjgzMDEyYywgMHg4ZmFhMDAxNCwgCisweDhmYWIwMDE4LCAweDEwNjAwMDBhLCAweDI3NjI0ZmUwLCAweDE0NjIwMDAyLCAKKzB4MjQ2ODAwMjAsIDB4Mjc2ODQ4MDAsIDB4OGY4MjAxMjgsIDB4MTEwMjAwMDQsIAorMHgwLCAweDhmODIwMTI0LCAweDE1MDIwMDA3LCAweDAsIAorMHg4ZjQzMDMzNCwgMHgxMDIxLCAweDI0NjMwMDAxLCAweGFmNDMwMzM0LCAKKzB4MTAwMDAwMzksIDB4OGY0MzAzMzQsIDB4YWM2NDAwMDAsIDB4YWM2NTAwMDQsIAorMHhhYzY2MDAwOCwgMHhhNDY3MDAwZSwgMHhhYzY5MDAxOCwgMHhhYzZhMDAxYywgCisweGFjNmIwMDEwLCAweGFjNjIwMDE0LCAweGFmODgwMTIwLCAweDhmNDIwMGZjLCAKKzB4OGY0NDAwZjQsIDB4MjQ0MmZmZmYsIDB4YWY0MjAwZmMsIDB4OGM4MjAwMDAsIAorMHgxMDQ5MDAwNSwgMHgzMDQyZmY4ZiwgMHgxMDQwMDAxOSwgMHgzMTIyZmY4ZiwgCisweDEwNDAwMDE4LCAweDNjMDIwMDAxLCAweDhjODMwMDA0LCAweDJjNjIwMDEwLCAKKzB4MTA0MDAwMTMsIDB4M2MwMjAwMDEsIDB4MjQ2MzAwMDEsIDB4YWM4MzAwMDQsIAorMHg4ZjQzMDBmOCwgMHgzNDQyMzBjOCwgMHgyZTIxMDIxLCAweDU0NjIwMDA0LCAKKzB4MjQ2MjAwMDgsIDB4M2MwMjAwMDEsIDB4MzQ0MjJlYzgsIDB4MmUyMTAyMSwgCisweDE0NDQwMDE1LCAweDI0MDIwMDAxLCAweDhmODIwMTI4LCAweDI0NDIwMDIwLCAKKzB4YWY4MjAxMjgsIDB4OGY4MjAxMjgsIDB4MTAwMDAwMGYsIDB4MjQwMjAwMDEsIAorMHgzYzAyMDAwMSwgMHgzNDQyMzBjOCwgMHgyZTIxMDIxLCAweDU0ODIwMDA0LCAKKzB4MjQ4MjAwMDgsIDB4M2MwMjAwMDEsIDB4MzQ0MjJlYzgsIDB4MmUyMTAyMSwgCisweDQwMjAyMSwgMHgyNDAyMDAwMSwgMHhhZjQ0MDBmNCwgMHhhYzg5MDAwMCwgCisweGFjODIwMDA0LCAweDI0MDIwMDAxLCAweDNlMDAwMDgsIDB4MCwgCisweDNlMDAwMDgsIDB4MCwgMHg4ZmE5MDAxMCwgMHg4ZjgzMDEwYywgCisweDhmYWEwMDE0LCAweDhmYWIwMDE4LCAweDEwNjAwMDBhLCAweDI3NjI0N2UwLCAKKzB4MTQ2MjAwMDIsIDB4MjQ2ODAwMjAsIDB4Mjc2ODQwMDAsIDB4OGY4MjAxMDgsIAorMHgxMTAyMDAwNCwgMHgwLCAweDhmODIwMTA0LCAweDE1MDIwMDA3LCAKKzB4MCwgMHg4ZjQzMDMzOCwgMHgxMDIxLCAweDI0NjMwMDAxLCAKKzB4YWY0MzAzMzgsIDB4MTAwMDAwMzUsIDB4OGY0MzAzMzgsIDB4YWM2NDAwMDAsIAorMHhhYzY1MDAwNCwgMHhhYzY2MDAwOCwgMHhhNDY3MDAwZSwgMHhhYzY5MDAxOCwgCisweGFjNmEwMDFjLCAweGFjNmIwMDEwLCAweGFjNjIwMDE0LCAweGFmODgwMTAwLCAKKzB4OGY0NDAwZWMsIDB4OGM4MjAwMDAsIDB4MzA0MjAwMDYsIDB4MTA0MDAwMTksIAorMHgzMTIyMDAwNiwgMHgxMDQwMDAxOCwgMHgzYzAyMDAwMSwgMHg4YzgzMDAwNCwgCisweDJjNjIwMDEwLCAweDEwNDAwMDEzLCAweDNjMDIwMDAxLCAweDI0NjMwMDAxLCAKKzB4YWM4MzAwMDQsIDB4OGY0MzAwZjAsIDB4MzQ0MjJlYzAsIDB4MmUyMTAyMSwgCisweDU0NjIwMDA0LCAweDI0NjIwMDA4LCAweDNjMDIwMDAxLCAweDM0NDIyY2MwLCAKKzB4MmUyMTAyMSwgMHgxNDQ0MDAxNSwgMHgyNDAyMDAwMSwgMHg4ZjgyMDEwOCwgCisweDI0NDIwMDIwLCAweGFmODIwMTA4LCAweDhmODIwMTA4LCAweDEwMDAwMDBmLCAKKzB4MjQwMjAwMDEsIDB4M2MwMjAwMDEsIDB4MzQ0MjJlYzAsIDB4MmUyMTAyMSwgCisweDU0ODIwMDA0LCAweDI0ODIwMDA4LCAweDNjMDIwMDAxLCAweDM0NDIyY2MwLCAKKzB4MmUyMTAyMSwgMHg0MDIwMjEsIDB4MjQwMjAwMDEsIDB4YWY0NDAwZWMsIAorMHhhYzg5MDAwMCwgMHhhYzgyMDAwNCwgMHgyNDAyMDAwMSwgMHgzZTAwMDA4LCAKKzB4MCwgMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmZDgsIAorMHgzYzA0MDAwMSwgMHgyNDg0NjQ4YywgMHgzYzA1MDAwMSwgMHhhZmJmMDAyNCwgCisweGFmYjIwMDIwLCAweGFmYjEwMDFjLCAweGFmYjAwMDE4LCAweDhmOTAwMTA0LCAKKzB4OGY5MTAwYjAsIDB4OGY5MjAxMWMsIDB4MzRhNTI1MDAsIDB4OGY4MjAxMDAsIAorMHgyNDAzMDIxLCAweDIyMDM4MjEsIDB4YWZhMjAwMTAsIDB4YzAwMmIzYiwgCisweGFmYjAwMDE0LCAweDhlMDIwMDA4LCAweGFmYTIwMDEwLCAweDhlMDIwMDBjLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDY0OTgsIDB4YWZhMjAwMTQsIDB4OGUwNjAwMDAsIAorMHg4ZTA3MDAwNCwgMHgzYzA1MDAwMSwgMHhjMDAyYjNiLCAweDM0YTUyNTEwLCAKKzB4OGUwMjAwMTgsIDB4YWZhMjAwMTAsIDB4OGUwMjAwMWMsIDB4M2MwNDAwMDEsIAorMHgyNDg0NjRhNCwgMHhhZmEyMDAxNCwgMHg4ZTA2MDAxMCwgMHg4ZTA3MDAxNCwgCisweDNjMDUwMDAxLCAweGMwMDJiM2IsIDB4MzRhNTI1MjAsIDB4M2MwMjdmMDAsIAorMHgyMjIxMDI0LCAweDNjMDMwODAwLCAweDU0NDMwMDE2LCAweDNjMDMwMjAwLCAKKzB4OGY4MjAwOWMsIDB4MzA0MmZmZmYsIDB4MTQ0MDAwMTIsIDB4M2MwMzAyMDAsIAorMHgzYzA0MDAwMSwgMHgyNDg0NjRiMCwgMHgzYzA1MDAwMiwgMHgzNGE1ZjAzMCwgCisweDMwMjEsIDB4MzgyMSwgMHgzNjQyMDAwMiwgMHhhZjgyMDExYywgCisweDM2MjIwMDAxLCAweGFmODIwMGIwLCAweGFmOTAwMTA0LCAweGFmOTIwMTFjLCAKKzB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgMHgxMDAwMDAyNCwgCisweDAsIDB4MmMzMTAyNCwgMHgxMDQwMDAwZCwgMHgyMjMxMDI0LCAKKzB4MTA0MDAwMGIsIDB4MzY0MjAwMDIsIDB4YWY4MjAxMWMsIDB4MzYyMjAwMDEsIAorMHhhZjgyMDBiMCwgMHhhZjkwMDEwNCwgMHhhZjkyMDExYywgMHg4ZjQyMDMzMCwgCisweDI0NDIwMDAxLCAweGFmNDIwMzMwLCAweDEwMDAwMDE1LCAweDhmNDIwMzMwLCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDY0YjgsIDB4MjQwMjAyYTksIDB4YWZhMjAwMTAsIAorMHhhZmEwMDAxNCwgMHg4Zjg2MDE0NCwgMHgzYzA3MDAwMSwgMHgyNGU3NjRjMCwgCisweGMwMDJiM2IsIDB4MzQwNWRlYWQsIDB4OGY4MjAxMWMsIDB4MzQ0MjAwMDIsIAorMHhhZjgyMDExYywgMHg4ZjgyMDIyMCwgMHgzNDQyMDAwNCwgMHhhZjgyMDIyMCwgCisweDhmODIwMTQwLCAweDNjMDMwMDAxLCAweDQzMTAyNSwgMHhhZjgyMDE0MCwgCisweDhmYmYwMDI0LCAweDhmYjIwMDIwLCAweDhmYjEwMDFjLCAweDhmYjAwMDE4LCAKKzB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgyN2JkZmZkOCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2NGU4LCAweDNjMDUwMDAxLCAweGFmYmYwMDI0LCAweGFmYjIwMDIwLCAKKzB4YWZiMTAwMWMsIDB4YWZiMDAwMTgsIDB4OGY5MDAxMjQsIDB4OGY5MTAwYTAsIAorMHg4ZjkyMDExYywgMHgzNGE1MjYwMCwgMHg4ZjgyMDEyMCwgMHgyNDAzMDIxLCAKKzB4MjIwMzgyMSwgMHhhZmEyMDAxMCwgMHhjMDAyYjNiLCAweGFmYjAwMDE0LCAKKzB4OGUwMjAwMDgsIDB4YWZhMjAwMTAsIDB4OGUwMjAwMGMsIDB4M2MwNDAwMDEsIAorMHgyNDg0NjRmNCwgMHhhZmEyMDAxNCwgMHg4ZTA2MDAwMCwgMHg4ZTA3MDAwNCwgCisweDNjMDUwMDAxLCAweGMwMDJiM2IsIDB4MzRhNTI2MTAsIDB4OGUwMjAwMTgsIAorMHhhZmEyMDAxMCwgMHg4ZTAyMDAxYywgMHgzYzA0MDAwMSwgMHgyNDg0NjUwMCwgCisweGFmYTIwMDE0LCAweDhlMDYwMDEwLCAweDhlMDcwMDE0LCAweDNjMDUwMDAxLCAKKzB4YzAwMmIzYiwgMHgzNGE1MjYyMCwgMHgzYzAyN2YwMCwgMHgyMjIxMDI0LCAKKzB4M2MwMzA4MDAsIDB4NTQ0MzAwMTYsIDB4M2MwMzAyMDAsIDB4OGY4MjAwYWMsIAorMHgzMDQyZmZmZiwgMHgxNDQwMDAxMiwgMHgzYzAzMDIwMCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2NTBjLCAweDNjMDUwMDAxLCAweDM0YTVmMDMwLCAweDMwMjEsIAorMHgzODIxLCAweDM2NDIwMDAyLCAweGFmODIwMTFjLCAweDM2MjIwMDAxLCAKKzB4YWY4MjAwYTAsIDB4YWY5MDAxMjQsIDB4YWY5MjAxMWMsIDB4YWZhMDAwMTAsIAorMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDEwMDAwMDI0LCAweDAsIAorMHgyYzMxMDI0LCAweDEwNDAwMDBkLCAweDIyMzEwMjQsIDB4MTA0MDAwMGIsIAorMHgzNjQyMDAwMiwgMHhhZjgyMDExYywgMHgzNjIyMDAwMSwgMHhhZjgyMDBhMCwgCisweGFmOTAwMTI0LCAweGFmOTIwMTFjLCAweDhmNDIwMzJjLCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzMmMsIDB4MTAwMDAwMTUsIDB4OGY0MjAzMmMsIDB4M2MwNDAwMDEsIAorMHgyNDg0NjRiOCwgMHgyNDAyMDJlMiwgMHhhZmEyMDAxMCwgMHhhZmEwMDAxNCwgCisweDhmODYwMTQ0LCAweDNjMDcwMDAxLCAweDI0ZTc2NGMwLCAweGMwMDJiM2IsIAorMHgzNDA1ZGVhZCwgMHg4ZjgyMDExYywgMHgzNDQyMDAwMiwgMHhhZjgyMDExYywgCisweDhmODIwMjIwLCAweDM0NDIwMDA0LCAweGFmODIwMjIwLCAweDhmODIwMTQwLCAKKzB4M2MwMzAwMDEsIDB4NDMxMDI1LCAweGFmODIwMTQwLCAweDhmYmYwMDI0LCAKKzB4OGZiMjAwMjAsIDB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgCisweDI3YmQwMDI4LCAweDYwMjEsIDB4NTAyMSwgMHgzMDIxLCAKKzB4MjgyMSwgMHg2ODIxLCAweDQ4MjEsIDB4NzgyMSwgCisweDcwMjEsIDB4OGY4ODAxMjQsIDB4OGY4NzAxMDQsIDB4MTU4MDAwMmUsIAorMHg4ZjhiMDExYywgMHgxMWEwMDAxNCwgMHgzMTYyMDgwMCwgMHg4ZjgyMDEyMCwgCisweDEwNDYwMDI5LCAweDAsIDB4M2MwNDAwMDEsIDB4OGM4NDZlZTQsIAorMHg4Y2MyMDAwMCwgMHg4Y2MzMDAwNCwgMHhhYzgyMDAwMCwgMHhhYzgzMDAwNCwgCisweDhjYzIwMDA4LCAweGFjODIwMDA4LCAweDk0YzIwMDBlLCAweGE0ODIwMDBlLCAKKzB4OGNjMjAwMTAsIDB4MjQwYzAwMDEsIDB4YWM4MjAwMTAsIDB4OGNjMjAwMTQsIAorMHgxMDAwMDAxMiwgMHgyNGM2MDAyMCwgMHgxMDQwMDAxNywgMHgwLCAKKzB4M2MwNDAwMDEsIDB4OGM4NDZlZTQsIDB4OGQwMjAwMDAsIDB4OGQwMzAwMDQsIAorMHhhYzgyMDAwMCwgMHhhYzgzMDAwNCwgMHg4ZDAyMDAwOCwgMHhhYzgyMDAwOCwgCisweDk1MDIwMDBlLCAweGE0ODIwMDBlLCAweDhkMDIwMDEwLCAweDI1MDYwMDIwLCAKKzB4YWM4MjAwMTAsIDB4OGQwMjAwMTQsIDB4MjQwYzAwMDEsIDB4YzAxODIxLCAKKzB4YWM4MjAwMTQsIDB4Mjc2MjRmZTAsIDB4NDMxMDJiLCAweDU0NDAwMDAxLCAKKzB4Mjc2MzQ4MDAsIDB4NjAzMDIxLCAweDE1NDAwMDJmLCAweDMxNjIwMTAwLCAKKzB4MTEyMDAwMTQsIDB4MzE2MjgwMDAsIDB4OGY4MjAxMDAsIDB4MTA0NTAwMmEsIAorMHgzMTYyMDEwMCwgMHgzYzA0MDAwMSwgMHg4Yzg0NmVlMCwgMHg4Y2EyMDAwMCwgCisweDhjYTMwMDA0LCAweGFjODIwMDAwLCAweGFjODMwMDA0LCAweDhjYTIwMDA4LCAKKzB4YWM4MjAwMDgsIDB4OTRhMjAwMGUsIDB4YTQ4MjAwMGUsIDB4OGNhMjAwMTAsIAorMHgyNDBhMDAwMSwgMHhhYzgyMDAxMCwgMHg4Y2EyMDAxNCwgMHgxMDAwMDAxMiwgCisweDI0YTUwMDIwLCAweDEwNDAwMDE4LCAweDMxNjIwMTAwLCAweDNjMDQwMDAxLCAKKzB4OGM4NDZlZTAsIDB4OGNlMjAwMDAsIDB4OGNlMzAwMDQsIDB4YWM4MjAwMDAsIAorMHhhYzgzMDAwNCwgMHg4Y2UyMDAwOCwgMHhhYzgyMDAwOCwgMHg5NGUyMDAwZSwgCisweGE0ODIwMDBlLCAweDhjZTIwMDEwLCAweDI0ZTUwMDIwLCAweGFjODIwMDEwLCAKKzB4OGNlMjAwMTQsIDB4MjQwYTAwMDEsIDB4YTAxODIxLCAweGFjODIwMDE0LCAKKzB4Mjc2MjQ3ZTAsIDB4NDMxMDJiLCAweDU0NDAwMDAxLCAweDI3NjM0MDAwLCAKKzB4NjAyODIxLCAweDMxNjIwMTAwLCAweDU0NDAwMDFkLCAweDMxNjIxMDAwLCAKKzB4MTFhMDAwMDksIDB4MzFhMjA4MDAsIDB4MTA0MDAwMDQsIDB4MjUwMjAwMjAsIAorMHg4ZjgyMDBhOCwgMHhhNWUyMDAwMCwgMHgyNTAyMDAyMCwgMHhhZjgyMDEyNCwgCisweDhmODgwMTI0LCAweDY4MjEsIDB4MTE4MDAwMTEsIDB4MzE2MjEwMDAsIAorMHgzYzA0MDAwMSwgMHg4Yzg0NmVlNCwgMHg4YzgyMDAwMCwgMHg4YzgzMDAwNCwgCisweGFmODIwMDgwLCAweGFmODMwMDg0LCAweDhjODIwMDA4LCAweGFmODIwMGE0LCAKKzB4OTQ4MjAwMGUsIDB4YWY4MjAwYWMsIDB4OGM4MjAwMTAsIDB4NjAyMSwgCisweGFmODIwMGEwLCAweDhjOGQwMDEwLCAweDhjOGYwMDE0LCAweDMxNjIxMDAwLCAKKzB4MTQ0MGZmODIsIDB4MCwgMHgxMTIwMDAwZiwgMHgzMTIyMDgwMCwgCisweDEwNDAwMDA0LCAweDNjMDIwMDAyLCAweDhmODIwMGI4LCAweGE1YzIwMDAwLCAKKzB4M2MwMjAwMDIsIDB4MTIyMTAyNCwgMHgxMDQwMDAwNCwgMHgyNGUyMDAyMCwgCisweDhmODIwMGI0LCAweGFmODIwMGQ0LCAweDI0ZTIwMDIwLCAweGFmODIwMTA0LCAKKzB4OGY4NzAxMDQsIDB4NDgyMSwgMHgxMTQwZmY3MCwgMHgwLCAKKzB4M2MwNDAwMDEsIDB4OGM4NDZlZTAsIDB4OGM4MjAwMDAsIDB4OGM4MzAwMDQsIAorMHhhZjgyMDA5MCwgMHhhZjgzMDA5NCwgMHg4YzgyMDAwOCwgMHhhZjgyMDBiNCwgCisweDk0ODIwMDBlLCAweGFmODIwMDljLCAweDhjODIwMDEwLCAweDUwMjEsIAorMHhhZjgyMDBiMCwgMHg4Yzg5MDAxMCwgMHgxMDAwZmY2MCwgMHg4YzhlMDAxNCwgCisweDNlMDAwMDgsIDB4MCwgMHg2MDIxLCAweDU4MjEsIAorMHgzMDIxLCAweDI4MjEsIDB4NjgyMSwgMHg1MDIxLCAKKzB4NzgyMSwgMHg3MDIxLCAweDhmODgwMTI0LCAweDhmODcwMTA0LCAKKzB4M2MxODAxMDAsIDB4MTU4MDAwMmUsIDB4OGY4OTAxMWMsIDB4MTFhMDAwMTQsIAorMHgzMTIyMDgwMCwgMHg4ZjgyMDEyMCwgMHgxMDQ2MDAyOSwgMHgwLCAKKzB4M2MwNDAwMDEsIDB4OGM4NDZlZTQsIDB4OGNjMjAwMDAsIDB4OGNjMzAwMDQsIAorMHhhYzgyMDAwMCwgMHhhYzgzMDAwNCwgMHg4Y2MyMDAwOCwgMHhhYzgyMDAwOCwgCisweDk0YzIwMDBlLCAweGE0ODIwMDBlLCAweDhjYzIwMDEwLCAweDI0MGMwMDAxLCAKKzB4YWM4MjAwMTAsIDB4OGNjMjAwMTQsIDB4MTAwMDAwMTIsIDB4MjRjNjAwMjAsIAorMHgxMDQwMDAxNywgMHgwLCAweDNjMDQwMDAxLCAweDhjODQ2ZWU0LCAKKzB4OGQwMjAwMDAsIDB4OGQwMzAwMDQsIDB4YWM4MjAwMDAsIDB4YWM4MzAwMDQsIAorMHg4ZDAyMDAwOCwgMHhhYzgyMDAwOCwgMHg5NTAyMDAwZSwgMHhhNDgyMDAwZSwgCisweDhkMDIwMDEwLCAweDI1MDYwMDIwLCAweGFjODIwMDEwLCAweDhkMDIwMDE0LCAKKzB4MjQwYzAwMDEsIDB4YzAxODIxLCAweGFjODIwMDE0LCAweDI3NjI0ZmUwLCAKKzB4NDMxMDJiLCAweDU0NDAwMDAxLCAweDI3NjM0ODAwLCAweDYwMzAyMSwgCisweDE1NjAwMDJmLCAweDMxMjIwMTAwLCAweDExNDAwMDE0LCAweDMxMjI4MDAwLCAKKzB4OGY4MjAxMDAsIDB4MTA0NTAwMmEsIDB4MzEyMjAxMDAsIDB4M2MwNDAwMDEsIAorMHg4Yzg0NmVlMCwgMHg4Y2EyMDAwMCwgMHg4Y2EzMDAwNCwgMHhhYzgyMDAwMCwgCisweGFjODMwMDA0LCAweDhjYTIwMDA4LCAweGFjODIwMDA4LCAweDk0YTIwMDBlLCAKKzB4YTQ4MjAwMGUsIDB4OGNhMjAwMTAsIDB4MjQwYjAwMDEsIDB4YWM4MjAwMTAsIAorMHg4Y2EyMDAxNCwgMHgxMDAwMDAxMiwgMHgyNGE1MDAyMCwgMHgxMDQwMDAxOCwgCisweDMxMjIwMTAwLCAweDNjMDQwMDAxLCAweDhjODQ2ZWUwLCAweDhjZTIwMDAwLCAKKzB4OGNlMzAwMDQsIDB4YWM4MjAwMDAsIDB4YWM4MzAwMDQsIDB4OGNlMjAwMDgsIAorMHhhYzgyMDAwOCwgMHg5NGUyMDAwZSwgMHhhNDgyMDAwZSwgMHg4Y2UyMDAxMCwgCisweDI0ZTUwMDIwLCAweGFjODIwMDEwLCAweDhjZTIwMDE0LCAweDI0MGIwMDAxLCAKKzB4YTAxODIxLCAweGFjODIwMDE0LCAweDI3NjI0N2UwLCAweDQzMTAyYiwgCisweDU0NDAwMDAxLCAweDI3NjM0MDAwLCAweDYwMjgyMSwgMHgzMTIyMDEwMCwgCisweDU0NDAwMDFkLCAweDMxMjIxMDAwLCAweDExYTAwMDA5LCAweDMxYTIwODAwLCAKKzB4MTA0MDAwMDQsIDB4MjUwMjAwMjAsIDB4OGY4MjAwYTgsIDB4YTVlMjAwMDAsIAorMHgyNTAyMDAyMCwgMHhhZjgyMDEyNCwgMHg4Zjg4MDEyNCwgMHg2ODIxLCAKKzB4MTE4MDAwMTEsIDB4MzEyMjEwMDAsIDB4M2MwNDAwMDEsIDB4OGM4NDZlZTQsIAorMHg4YzgyMDAwMCwgMHg4YzgzMDAwNCwgMHhhZjgyMDA4MCwgMHhhZjgzMDA4NCwgCisweDhjODIwMDA4LCAweGFmODIwMGE0LCAweDk0ODIwMDBlLCAweGFmODIwMGFjLCAKKzB4OGM4MjAwMTAsIDB4NjAyMSwgMHhhZjgyMDBhMCwgMHg4YzhkMDAxMCwgCisweDhjOGYwMDE0LCAweDMxMjIxMDAwLCAweDE0NDAwMDIyLCAweDAsIAorMHgxMTQwMDAwZiwgMHgzMTQyMDgwMCwgMHgxMDQwMDAwNCwgMHgzYzAyMDAwMiwgCisweDhmODIwMGI4LCAweGE1YzIwMDAwLCAweDNjMDIwMDAyLCAweDE0MjEwMjQsIAorMHgxMDQwMDAwNCwgMHgyNGUyMDAyMCwgMHg4ZjgyMDBiNCwgMHhhZjgyMDBkNCwgCisweDI0ZTIwMDIwLCAweGFmODIwMTA0LCAweDhmODcwMTA0LCAweDUwMjEsIAorMHgxMTYwMDAxMCwgMHgwLCAweDNjMDQwMDAxLCAweDhjODQ2ZWUwLCAKKzB4OGM4MjAwMDAsIDB4OGM4MzAwMDQsIDB4YWY4MjAwOTAsIDB4YWY4MzAwOTQsIAorMHg4YzgyMDAwOCwgMHhhZjgyMDBiNCwgMHg5NDgyMDAwZSwgMHhhZjgyMDA5YywgCisweDhjODIwMDEwLCAweDU4MjEsIDB4YWY4MjAwYjAsIDB4OGM4YTAwMTAsIAorMHg4YzhlMDAxNCwgMHg4ZjgyMDA3MCwgMHgzYzAzMTAwMCwgMHg0MzEwMjQsIAorMHgxMDQwZmY1YywgMHgwLCAweDhmODIwMDU0LCAweDI0NDIwMDA1LCAKKzB4YWY4MjAwNzgsIDB4OGMwNDAyMzQsIDB4MTA4MDAwMTYsIDB4MTgyMSwgCisweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg4YzQyNDBlOCwgMHgyNDQyMDAwNSwgCisweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhYzIyNDBlOCwgMHgzYzAyMDAwMSwgCisweDU3MTAyMSwgMHg4YzQyNDBlOCwgMHg0NDEwMmIsIDB4MTQ0MDAwMDksIAorMHgyNDAyMDAwMSwgMHgzYzAzMDA4MCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHhhYzIwNDBlOCwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIDB4MTAwMDAwMGMsIAorMHhhMDIyNDBmMCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIDB4OTA0MjQwZjAsIAorMHgxNDQwMDAwNiwgMHgzYzAyMDA4MCwgMHgzYzAyMDAwMSwgMHg1NzEwMjEsIAorMHg5MDQyNDBmMSwgMHgxMDQwMDAwMiwgMHgzYzAyMDA4MCwgMHg2MjE4MjUsIAorMHg4YzA0MDIzMCwgMHgxMDgwMDAxMywgMHgwLCAweDNjMDIwMDAxLCAKKzB4NTcxMDIxLCAweDhjNDI0MGVjLCAweDI0NDIwMDA1LCAweDNjMDEwMDAxLCAKKzB4MzcwODIxLCAweGFjMjI0MGVjLCAweDNjMDIwMDAxLCAweDU3MTAyMSwgCisweDhjNDI0MGVjLCAweDQ0MTAyYiwgMHgxNDQwMDAwNiwgMHgwLCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGFjMjA0MGVjLCAweDEwMDAwMDA2LCAKKzB4NzgxODI1LCAweDNjMDIwMDAxLCAweDU3MTAyMSwgMHg5MDQyNDBmMiwgCisweDU0NDAwMDAxLCAweDc4MTgyNSwgMHgxMDYwZmYxYSwgMHgwLCAKKzB4OGY0MjAwMDAsIDB4MTA0MDAwMDcsIDB4MCwgMHhhZjgwMDA0YywgCisweDhmODIwMDRjLCAweDEwNDBmZmZkLCAweDAsIDB4MTAwMDAwMDUsIAorMHgwLCAweGFmODAwMDQ4LCAweDhmODIwMDQ4LCAweDEwNDBmZmZkLCAKKzB4MCwgMHg4ZjgyMDA2MCwgMHg0MzEwMjUsIDB4YWY4MjAwNjAsIAorMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywgMHgwLCAweDEwMDBmZjA1LCAKKzB4YWY4MDAwNGMsIDB4MTAwMGZmMDMsIDB4YWY4MDAwNDgsIDB4M2UwMDAwOCwgCisweDAsIDB4MCwgMHgwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjZkMjgsIDB4MjdiZGZmZTgsIDB4YWZiZjAwMTQsIDB4MTQ0MDAwMTIsIAorMHhhZmIwMDAxMCwgMHgzYzEwMDAwMSwgMHgyNjEwNmY5MCwgMHgyMDAyMDIxLCAKKzB4YzAwMmJhOCwgMHgyNDA1MjAwMCwgMHgyNjAyMWZlMCwgMHgzYzAxMDAwMSwgCisweGFjMjI2ZWVjLCAweDNjMDEwMDAxLCAweGFjMjI2ZWU4LCAweGFjMDIwMjUwLCAKKzB4MjQwMjIwMDAsIDB4YWMxMDAyNTQsIDB4YWMwMjAyNTgsIDB4MjQwMjAwMDEsIAorMHgzYzAxMDAwMSwgMHhhYzIyNmQyOCwgMHg4ZmJmMDAxNCwgMHg4ZmIwMDAxMCwgCisweDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4M2MwOTAwMDEsIDB4OGQyOTZlZWMsIAorMHg4YzgyMDAwMCwgMHg4ZmEzMDAxMCwgMHg4ZmE4MDAxNCwgMHhhZDIyMDAwMCwgCisweDhjODIwMDA0LCAweGFkMjUwMDA4LCAweGFkMjIwMDA0LCAweDhmODIwMDU0LCAKKzB4YWQyNjAwMTAsIDB4YWQyNzAwMTQsIDB4YWQyMzAwMTgsIDB4YWQyODAwMWMsIAorMHhhZDIyMDAwYywgMHgyNTI5ZmZlMCwgMHgzYzAyMDAwMSwgMHgyNDQyNmY5MCwgCisweDEyMjEwMmIsIDB4MTA0MDAwMDMsIDB4MCwgMHgzYzA5MDAwMSwgCisweDhkMjk2ZWU4LCAweDNjMDIwMDAxLCAweDhjNDI2ZDEwLCAweGFkMjIwMDAwLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZkMTAsIDB4M2MwMTAwMDEsIDB4YWMyOTZlZWMsIAorMHhhZDIyMDAwNCwgMHhhYzA5MDI1MCwgMHgzZTAwMDA4LCAweDAsIAorMHgyN2JkZmZkMCwgMHhhZmIwMDAxMCwgMHgzYzEwMDAwMSwgMHg4ZTEwNmVlYywgCisweDNjMDIwMDAxLCAweDhjNDI2ZDEwLCAweGFmYjEwMDE0LCAweDgwODgyMSwgCisweGFmYmUwMDI0LCAweDhmYmUwMDQwLCAweDhmYTQwMDQ4LCAweGFmYjIwMDE4LCAKKzB4YTA5MDIxLCAweGFmYmYwMDI4LCAweGFmYjUwMDIwLCAweGFmYjMwMDFjLCAKKzB4YWUwMjAwMDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkMTAsIDB4YzA5ODIxLCAKKzB4ZTBhODIxLCAweDEwODAwMDA2LCAweGFlMDIwMDA0LCAweDI2MDUwMDA4LCAKKzB4YzAwMmJiMywgMHgyNDA2MDAxOCwgMHgxMDAwMDAwNSwgMHgyNjEwZmZlMCwgCisweDI2MDQwMDA4LCAweGMwMDJiYTgsIDB4MjQwNTAwMTgsIDB4MjYxMGZmZTAsIAorMHgzYzAzMDAwMSwgMHgyNDYzNmY5MCwgMHgyMDMxMDJiLCAweDEwNDAwMDAzLCAKKzB4MCwgMHgzYzEwMDAwMSwgMHg4ZTEwNmVlOCwgMHg4ZTIyMDAwMCwgCisweGFlMDIwMDAwLCAweDhlMjIwMDA0LCAweGFlMTIwMDA4LCAweGFlMDIwMDA0LCAKKzB4OGY4MjAwNTQsIDB4YWUxMzAwMTAsIDB4YWUxNTAwMTQsIDB4YWUxZTAwMTgsIAorMHg4ZmE4MDA0NCwgMHhhZTA4MDAxYywgMHhhZTAyMDAwYywgMHgyNjEwZmZlMCwgCisweDIwMzEwMmIsIDB4MTA0MDAwMDMsIDB4MCwgMHgzYzEwMDAwMSwgCisweDhlMTA2ZWU4LCAweDNjMDIwMDAxLCAweDhjNDI2ZDEwLCAweGFlMDIwMDAwLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZkMTAsIDB4M2MwMTAwMDEsIDB4YWMzMDZlZWMsIAorMHhhZTAyMDAwNCwgMHhhYzEwMDI1MCwgMHg4ZmJmMDAyOCwgMHg4ZmJlMDAyNCwgCisweDhmYjUwMDIwLCAweDhmYjMwMDFjLCAweDhmYjIwMDE4LCAweDhmYjEwMDE0LCAKKzB4OGZiMDAwMTAsIDB4M2UwMDAwOCwgMHgyN2JkMDAzMCwgMHg4NTE4MjEsIAorMHg4MzEwMmIsIDB4MTA0MDAwMDYsIDB4MCwgMHhhYzgwMDAwMCwgCisweDI0ODQwMDA0LCAweDgzMTAyYiwgMHg1NDQwZmZmZCwgMHhhYzgwMDAwMCwgCisweDNlMDAwMDgsIDB4MCwgMHhhNjE4MjEsIDB4YTMxMDJiLCAKKzB4MTA0MDAwMDcsIDB4MCwgMHg4YzgyMDAwMCwgMHhhY2EyMDAwMCwgCisweDI0YTUwMDA0LCAweGEzMTAyYiwgMHgxNDQwZmZmYiwgMHgyNDg0MDAwNCwgCisweDNlMDAwMDgsIDB4MCwgMHg4NjE4MjEsIDB4ODMxMDJiLCAKKzB4MTA0MDAwMDcsIDB4MCwgMHg4Y2EyMDAwMCwgMHhhYzgyMDAwMCwgCisweDI0ODQwMDA0LCAweDgzMTAyYiwgMHgxNDQwZmZmYiwgMHgyNGE1MDAwNCwgCisweDNlMDAwMDgsIDB4MCwgMHg2MzA4MCwgMHg4NjE4MjEsIAorMHg4MzEwMmIsIDB4MTA0MDAwMDYsIDB4MCwgMHhhYzg1MDAwMCwgCisweDI0ODQwMDA0LCAweDgzMTAyYiwgMHg1NDQwZmZmZCwgMHhhYzg1MDAwMCwgCisweDNlMDAwMDgsIDB4MCwgMHgwLCAweDI2ZTUwMDI4LCAKKzB4YTAzMDIxLCAweDI3NDMwMWMwLCAweDhmNGQwMzU4LCAweDhmNDcwMzVjLCAKKzB4OGY0ODAzNjAsIDB4OGY0OTAzNjQsIDB4OGY0YTAzNjgsIDB4OGY0YjAyMDQsIAorMHg4ZjRjMDIwMCwgMHgyNDY0MDQwMCwgMHg2NDEwMmIsIDB4MTA0MDAwMDgsIAorMHgzYzAyMDhmZiwgMHg4Y2MyMDAwMCwgMHhhYzYyMDAwMCwgMHgyNDYzMDAwNCwgCisweDY0MTAyYiwgMHgxNDQwZmZmYiwgMHgyNGM2MDAwNCwgMHgzYzAyMDhmZiwgCisweDM0NDJmZmZmLCAweDNjMDNjMGZmLCAweGFmNGQwMzU4LCAweGFmNDcwMzVjLCAKKzB4YWY0ODAzNjAsIDB4YWY0OTAzNjQsIDB4YWY0YTAzNjgsIDB4YWY0YjAyMDQsIAorMHhhZjRjMDIwMCwgMHg4Zjg0MDIyMCwgMHgzNDYzZmZmZiwgMHg4Zjg2MDIwMCwgCisweDgyMTAyNCwgMHgzNDQyMDAwNCwgMHhjMzE4MjQsIDB4MzQ2MzAwMDQsIAorMHhhZjgyMDIyMCwgMHhhZjgzMDIwMCwgMHg4Y2EyMDIxNCwgMHhhYzAyMDA4NCwgCisweDhjYTIwMjE4LCAweGFjMDIwMDg4LCAweDhjYTIwMjFjLCAweGFjMDIwMDhjLCAKKzB4OGNhMjAyMjAsIDB4YWMwMjAwOTAsIDB4OGNhMjAyMjQsIDB4YWMwMjAwOTQsIAorMHg4Y2EyMDIyOCwgMHhhYzAyMDA5OCwgMHg4Y2EyMDIyYywgMHhhYzAyMDA5YywgCisweDhjYTIwMjMwLCAweGFjMDIwMGEwLCAweDhjYTIwMjM0LCAweGFjMDIwMGE0LCAKKzB4OGNhMjAyMzgsIDB4YWMwMjAwYTgsIDB4OGNhMjAyM2MsIDB4YWMwMjAwYWMsIAorMHg4Y2EyMDI0MCwgMHhhYzAyMDBiMCwgMHg4Y2EyMDI0NCwgMHhhYzAyMDBiNCwgCisweDhjYTIwMjQ4LCAweGFjMDIwMGI4LCAweDhjYTIwMjRjLCAweGFjMDIwMGJjLCAKKzB4OGNhMjAwMWMsIDB4YWMwMjAwODAsIDB4OGNhMjAwMTgsIDB4YWMwMjAwYzAsIAorMHg4Y2EyMDAyMCwgMHhhYzAyMDBjYywgMHg4Y2EyMDAyNCwgMHhhYzAyMDBkMCwgCisweDhjYTIwMWQwLCAweGFjMDIwMGUwLCAweDhjYTIwMWQ0LCAweGFjMDIwMGU0LCAKKzB4OGNhMjAxZDgsIDB4YWMwMjAwZTgsIDB4OGNhMjAxZGMsIDB4YWMwMjAwZWMsIAorMHg4Y2EyMDFlMCwgMHhhYzAyMDBmMCwgMHg4Y2EyMDA5OCwgMHg4Y2EzMDA5YywgCisweGFjMDMwMGZjLCAweDhjYTIwMGE4LCAweDhjYTMwMGFjLCAweGFjMDMwMGY0LCAKKzB4OGNhMjAwYTAsIDB4OGNhMzAwYTQsIDB4MzA4NDAwMDQsIDB4YWMwMzAwZjgsIAorMHgxNDgwMDAwNywgMHgzMGMyMDAwNCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgCisweDM0NjNmZmZiLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwgMHgzMGMyMDAwNCwgCisweDE0NDAwMDA2LCAweDAsIDB4OGY4MjAyMDAsIDB4M2MwM2MwZmYsIAorMHgzNDYzZmZmYiwgMHg0MzEwMjQsIDB4YWY4MjAyMDAsIDB4OGY0MjAyZGMsIAorMHhhMzQwMDVjNSwgMHgyNDQyMDAwMSwgMHhhZjQyMDJkYywgMHg4ZjQyMDJkYywgCisweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZkOCwgMHhhZmJmMDAyNCwgCisweGFmYjAwMDIwLCAweDhmNDMwMDI0LCAweDhmNDIwMDIwLCAweDEwNjIwMDM4LCAKKzB4MCwgMHg4ZjQzMDAyMCwgMHg4ZjQyMDAyNCwgMHg2MjIwMjMsIAorMHg0ODEwMDAzLCAweDAsIDB4OGY0MjAwNDAsIDB4ODIyMDIxLCAKKzB4OGY0MzAwMzAsIDB4OGY0MjAwMjQsIDB4NDMxMDJiLCAweDE0NDAwMDA1LCAKKzB4MCwgMHg4ZjQzMDA0MCwgMHg4ZjQyMDAyNCwgMHgxMDAwMDAwNSwgCisweDYyMTAyMywgMHg4ZjQyMDAzMCwgMHg4ZjQzMDAyNCwgMHg0MzEwMjMsIAorMHgyNDQyZmZmZiwgMHg0MDYwMjEsIDB4OGMxMDJhLCAweDU0NDAwMDAxLCAKKzB4ODA2MDIxLCAweDhmNGEwMDI0LCAweDhmNDkwMDQwLCAweDhmNDgwMDI0LCAKKzB4OGY0NDAxODAsIDB4OGY0NTAxODQsIDB4OGY0NjAwMjQsIDB4OGY0YjAwMWMsIAorMHgyNDA3MDAwMSwgMHhhZmE3MDAxMCwgMHg4NDEwMCwgMHgxMDAxODIxLCAKKzB4MTRjNTAyMSwgMHgyNTI5ZmZmZiwgMHgxNDk4MDI0LCAweGFmYjAwMDE0LCAKKzB4OGY0NzAwMTQsIDB4MTAyMSwgMHg2MzEwMCwgMHhhZmE3MDAxOCwgCisweGEzMjgyMSwgMHhhMzM4MmIsIDB4ODIyMDIxLCAweDg3MjAyMSwgCisweDhmNDIwMTA4LCAweDE2NjMwMjEsIDB4NDBmODA5LCAweGMzOTAwLCAKKzB4NTQ0MDAwMDEsIDB4YWY1MDAwMjQsIDB4OGY0MzAwMjQsIDB4OGY0MjAwMjAsIAorMHgxNDYyMDAxOCwgMHgwLCAweDhmNDIwMDAwLCAweDEwNDAwMDA3LCAKKzB4MCwgMHhhZjgwMDA0YywgMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwgCisweDAsIDB4MTAwMDAwMDUsIDB4MCwgMHhhZjgwMDA0OCwgCisweDhmODIwMDQ4LCAweDEwNDBmZmZkLCAweDAsIDB4OGY4MjAwNjAsIAorMHgyNDAzZmZlZiwgMHg0MzEwMjQsIDB4YWY4MjAwNjAsIDB4OGY0MjAwMDAsIAorMHgxMDQwMDAwMywgMHgwLCAweDEwMDAwMDAyLCAweGFmODAwMDRjLCAKKzB4YWY4MDAwNDgsIDB4OGZiZjAwMjQsIDB4OGZiMDAwMjAsIDB4M2UwMDAwOCwgCisweDI3YmQwMDI4LCAweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZjMCwgCisweDMyYzIwMDIwLCAweGFmYmYwMDM4LCAweGFmYjMwMDM0LCAweGFmYjIwMDMwLCAKKzB4YWZiMTAwMmMsIDB4MTA0MDAwMDQsIDB4YWZiMDAwMjgsIDB4OGY1MzAwMjgsIAorMHgxMDAwMDAwMiwgMHgwLCAweDhmNTMwMDIwLCAweDhmNDIwMDMwLCAKKzB4MTA1MzAwZWIsIDB4MjExMDAsIDB4OGY0MzAwMWMsIDB4NjI4MDIxLCAKKzB4OGUwNDAwMDAsIDB4OGUwNTAwMDQsIDB4OTYxMjAwMDgsIDB4OGY0MjAwOTAsIAorMHg5NjExMDAwYSwgMHgzMjQ2ZmZmZiwgMHg0NjEwMmEsIDB4MTA0MDAwMTcsIAorMHgwLCAweDhmODIwMGQ4LCAweDhmNDMwMDk4LCAweDQzMTAyMywgCisweDI0NDJkY2JlLCAweGFmNDIwMDkwLCAweDhmNDIwMDkwLCAweDI4NDJkY2JmLCAKKzB4MTA0MDAwMDUsIDB4MCwgMHg4ZjQyMDA5MCwgMHg4ZjQzMDE0NCwgCisweDQzMTAyMSwgMHhhZjQyMDA5MCwgMHg4ZjQyMDA5MCwgMHg0NjEwMmEsIAorMHgxMDQwMDAwNiwgMHgwLCAweDhmNDIwMzQ4LCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzNDgsIDB4MTAwMDAwZTEsIDB4OGY0MjAzNDgsIDB4OGY4MjAwZmMsIAorMHgxNDQwMDAwNiwgMHgwLCAweDhmNDIwMzQ0LCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzNDQsIDB4MTAwMDAwZDksIDB4OGY0MjAzNDQsIDB4OTM0MjA1YzIsIAorMHgxMDQwMDAwYiwgMHgzMmMyMDAwOCwgMHgxMDQwMDAwOCwgMHgzMjIyMDIwMCwgCisweDEwNDAwMDA2LCAweDNjMDM0MDAwLCAweDk2MDIwMDBlLCAweGFmNDMwMGFjLCAKKzB4MjE0MDAsIDB4MTAwMDAwMDIsIDB4YWY0MjAwYjAsIDB4YWY0MDAwYWMsIAorMHgzMjIyMDAwNCwgMHgxMDQwMDA3ZiwgMHgzMjIyMDgwMCwgMHgxMDQwMDAwMywgCisweDMyNDdmZmZmLCAweDEwMDAwMDAyLCAweDI0MDIwMDIwLCAweDI0MDIwMDA0LCAKKzB4YWZhMjAwMTAsIDB4OGY0MjAwMzAsIDB4YWZhMjAwMTQsIDB4OGY0MjAwMTAsIAorMHgzYzAzMDAwMiwgMHg0MzEwMjUsIDB4YWZhMjAwMTgsIDB4OGY0NjAwOTgsIAorMHg4ZjQyMDEwOCwgMHg0MGY4MDksIDB4MCwgMHgxMDQwMDBiNywgCisweDAsIDB4OGY0MjAwOWMsIDB4OGY0MzAwOTQsIDB4MjQyMTAyMSwgCisweGFmNDIwMDljLCAweGFlMDMwMDBjLCAweDhmNDIwMGFjLCAweDEwNDAwMDA4LCAKKzB4M2MwMzQwMDAsIDB4OGY0MjAwOTQsIDB4NDMxMDI1LCAweGFmYTIwMDIwLCAKKzB4OGY0MjAwOWMsIDB4OGY0MzAwYjAsIDB4MTAwMDAwMDQsIDB4NDMxMDI1LCAKKzB4OGY0MjAwOTQsIDB4YWZhMjAwMjAsIDB4OGY0MjAwOWMsIDB4YWZhMjAwMjQsIAorMHg4ZjgyMDBmYywgMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwgMHhhYzQzMDAwMCwgCisweGFjNDQwMDA0LCAweDI0NDIwMDA4LCAweGFmODIwMGYwLCAweDhmNDIwMDljLCAKKzB4OGY0NDAyNzAsIDB4OGY0NTAyNzQsIDB4NDAxODIxLCAweDEwMjEsIAorMHhhMzI4MjEsIDB4YTMzMDJiLCAweDgyMjAyMSwgMHg4NjIwMjEsIAorMHgzMjIzMDA2MCwgMHgyNDAyMDA0MCwgMHhhZjQ0MDI3MCwgMHhhZjQ1MDI3NCwgCisweDEwNjIwMDE3LCAweDJjNjIwMDQxLCAweDEwNDAwMDA1LCAweDI0MDIwMDIwLCAKKzB4MTA2MjAwMDgsIDB4MjQwMjAwMDEsIDB4MTAwMDAwMjYsIDB4MCwgCisweDI0MDIwMDYwLCAweDEwNjIwMDE5LCAweDI0MDIwMDAxLCAweDEwMDAwMDIxLCAKKzB4MCwgMHg4ZjQyMDI3OCwgMHg4ZjQzMDI3YywgMHgyNDYzMDAwMSwgCisweDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZjQyMDI3OCwgMHhhZjQzMDI3YywgCisweDhmNDIwMjc4LCAweDhmNDMwMjdjLCAweDEwMDAwMDE2LCAweDI0MDIwMDAxLCAKKzB4OGY0MjAyODAsIDB4OGY0MzAyODQsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIAorMHg0NDEwMjEsIDB4YWY0MjAyODAsIDB4YWY0MzAyODQsIDB4OGY0MjAyODAsIAorMHg4ZjQzMDI4NCwgMHgxMDAwMDAwYiwgMHgyNDAyMDAwMSwgMHg4ZjQyMDI4OCwgCisweDhmNDMwMjhjLCAweDI0NjMwMDAxLCAweDJjNjQwMDAxLCAweDQ0MTAyMSwgCisweGFmNDIwMjg4LCAweGFmNDMwMjhjLCAweDhmNDIwMjg4LCAweDhmNDMwMjhjLCAKKzB4MjQwMjAwMDEsIDB4YTM0MjA1YzIsIDB4OGY0MjAwOTgsIDB4MzI0NGZmZmYsIAorMHgyNDA2ZmZmOCwgMHg4ZjQ1MDEzYywgMHg0NDEwMjEsIDB4MjQ0MjAwMDcsIAorMHg0NjEwMjQsIDB4MjQ4NDAwMDcsIDB4YWY0MjAwOTQsIDB4OGY0MjAwOTAsIAorMHg4ZjQzMDA5NCwgMHg4NjIwMjQsIDB4NDQxMDIzLCAweDY1MTgyYiwgCisweDE0NjAwMDA1LCAweGFmNDIwMDkwLCAweDhmNDIwMDk0LCAweDhmNDMwMTQ0LCAKKzB4NDMxMDIzLCAweGFmNDIwMDk0LCAweDhmNDIwMDk0LCAweDEwMDAwMDIzLCAKKzB4YWY0MDAwOWMsIDB4MzI0N2ZmZmYsIDB4NTBlMDAwMjIsIDB4MzJjMjAwMjAsIAorMHgxNDQwMDAwMiwgMHgyNDAyMDAxMCwgMHgyNDAyMDAwMiwgMHhhZmEyMDAxMCwgCisweDhmNDIwMDMwLCAweGFmYTIwMDE0LCAweDhmNDIwMDEwLCAweGFmYTIwMDE4LCAKKzB4OGY0NjAwOTgsIDB4OGY0MjAxMDgsIDB4NDBmODA5LCAweDAsIAorMHgxMDQwMDAzYSwgMHgzMjQ1ZmZmZiwgMHg4ZjQyMDA5OCwgMHg4ZjQzMDA5MCwgCisweDhmNDYwMTNjLCAweDQ1MTAyMSwgMHhhZjQyMDA5OCwgMHg4ZjQyMDA5YywgCisweDhmNDQwMDk4LCAweGEzNDAwNWMyLCAweDY1MTgyMywgMHhhZjQzMDA5MCwgCisweDQ1MTAyMSwgMHg4NjIwMmIsIDB4MTQ4MDAwMDUsIDB4YWY0MjAwOWMsIAorMHg4ZjQyMDA5OCwgMHg4ZjQzMDE0NCwgMHg0MzEwMjMsIDB4YWY0MjAwOTgsIAorMHgzMmMyMDAyMCwgMHgxMDQwMDAwNSwgMHgwLCAweDhmNDIwMzU4LCAKKzB4MjQ0MmZmZmYsIDB4YWY0MjAzNTgsIDB4OGY0MjAzNTgsIDB4OGY0MjAwMzAsIAorMHg4ZjQzMDA0MCwgMHgyNDQyMDAwMSwgMHgyNDYzZmZmZiwgMHg0MzEwMjQsIAorMHhhZjQyMDAzMCwgMHg4ZjQyMDAzMCwgMHgxNDUzMDAxOCwgMHgwLCAKKzB4OGY0MjAwMDAsIDB4MTA0MDAwMDcsIDB4MCwgMHhhZjgwMDA0YywgCisweDhmODIwMDRjLCAweDEwNDBmZmZkLCAweDAsIDB4MTAwMDAwMDUsIAorMHgwLCAweGFmODAwMDQ4LCAweDhmODIwMDQ4LCAweDEwNDBmZmZkLCAKKzB4MCwgMHg4ZjgyMDA2MCwgMHgyNDAzZmZmNywgMHg0MzEwMjQsIAorMHhhZjgyMDA2MCwgMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywgMHgwLCAKKzB4MTAwMDAwMDIsIDB4YWY4MDAwNGMsIDB4YWY4MDAwNDgsIDB4OGZiZjAwMzgsIAorMHg4ZmIzMDAzNCwgMHg4ZmIyMDAzMCwgMHg4ZmIxMDAyYywgMHg4ZmIwMDAyOCwgCisweDNlMDAwMDgsIDB4MjdiZDAwNDAsIDB4M2UwMDAwOCwgMHgwLCAKKzB4MjdiZGZmZDAsIDB4MzJjMjAwMjAsIDB4YWZiZjAwMmMsIDB4YWZiMjAwMjgsIAorMHhhZmIxMDAyNCwgMHgxMDQwMDAwNCwgMHhhZmIwMDAyMCwgMHg4ZjUyMDAyOCwgCisweDEwMDAwMDAyLCAweDAsIDB4OGY1MjAwMjAsIDB4OGY0MjAwMzAsIAorMHgxMDUyMDBiNSwgMHgyMTEwMCwgMHg4ZjQzMDAxYywgMHg2MjgwMjEsIAorMHg4ZTA0MDAwMCwgMHg4ZTA1MDAwNCwgMHg5NjExMDAwOCwgMHg4ZjQyMDA5MCwgCisweDk2MDcwMDBhLCAweDMyMjZmZmZmLCAweDQ2MTAyYSwgMHgxMDQwMDAxNywgCisweDAsIDB4OGY4MjAwZDgsIDB4OGY0MzAwOTgsIDB4NDMxMDIzLCAKKzB4MjQ0MmRjNDYsIDB4YWY0MjAwOTAsIDB4OGY0MjAwOTAsIDB4Mjg0MmRjNDcsIAorMHgxMDQwMDAwNSwgMHgwLCAweDhmNDIwMDkwLCAweDhmNDMwMTQ0LCAKKzB4NDMxMDIxLCAweGFmNDIwMDkwLCAweDhmNDIwMDkwLCAweDQ2MTAyYSwgCisweDEwNDAwMDA2LCAweDAsIDB4OGY0MjAzNDgsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDM0OCwgMHgxMDAwMDBhYiwgMHg4ZjQyMDM0OCwgMHg4Zjg2MDBmYywgCisweDEwYzAwMDBjLCAweDAsIDB4OGY4MjAwZjQsIDB4MjQwM2ZmZjgsIAorMHg0MzEwMjQsIDB4NDYxMDIzLCAweDIxOGMzLCAweDU4NjAwMDAxLCAKKzB4MjQ2MzAxMDAsIDB4OGY0MjAwOGMsIDB4NDMxMDJiLCAweDE0NDAwMDA2LCAKKzB4NzEyYzIsIDB4OGY0MjAzNDQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNDQsIAorMHgxMDAwMDA5OCwgMHg4ZjQyMDM0NCwgMHg5MzQzMDVjMiwgMHgxMDYwMDAwZiwgCisweDMwNDYwMDAxLCAweDhmNDIwMDEwLCAweDM0NDgwNDAwLCAweDMyYzIwMDA4LCAKKzB4MTA0MDAwMDgsIDB4MzBlMjAyMDAsIDB4MTA0MDAwMDYsIDB4M2MwMzQwMDAsIAorMHg5NjAyMDAwZSwgMHhhZjQzMDBhYywgMHgyMTQwMCwgMHgxMDAwMDAwNCwgCisweGFmNDIwMGIwLCAweDEwMDAwMDAyLCAweGFmNDAwMGFjLCAweDhmNDgwMDEwLCAKKzB4MzBlMjAwMDQsIDB4MTA0MDAwNDUsIDB4MzIyN2ZmZmYsIDB4OGY0OTAwYWMsIAorMHgxMTIwMDAwNSwgMHgzMGMyMDBmZiwgMHgxNDQwMDAwNiwgMHgyNDAyMDA0MCwgCisweDEwMDAwMDA0LCAweDI0MDIwMDA4LCAweDE0NDAwMDAyLCAweDI0MDIwMDIwLCAKKzB4MjQwMjAwMDQsIDB4YWZhMjAwMTAsIDB4OGY0MzAwMzAsIDB4MTEyMDAwMDQsIAorMHhhZmEzMDAxNCwgMHg4ZjQyMDBiMCwgMHg2MjEwMjUsIDB4YWZhMjAwMTQsIAorMHgzYzAyMDAwMiwgMHgxMDIxMDI1LCAweGFmYTIwMDE4LCAweDhmNDYwMDk4LCAKKzB4OGY0MjAxMDgsIDB4NDBmODA5LCAweDAsIDB4MTA0MDAwNjksIAorMHgzMjI0ZmZmZiwgMHg4ZjQyMDA4YywgMHg4ZjQzMDA5NCwgMHgyNDQyMDAwMSwgCisweGFmNDIwMDhjLCAweDI0MDIwMDAxLCAweGFlMDMwMDBjLCAweGEzNDIwNWMyLCAKKzB4OGY0MjAwOTgsIDB4MjQwNmZmZjgsIDB4OGY0NTAxM2MsIDB4NDQxMDIxLCAKKzB4MjQ0MjAwMDcsIDB4NDYxMDI0LCAweDI0ODQwMDA3LCAweGFmNDIwMDk0LCAKKzB4OGY0MjAwOTAsIDB4OGY0MzAwOTQsIDB4ODYyMDI0LCAweDQ0MTAyMywgCisweDY1MTgyYiwgMHgxNDYwMDAwNSwgMHhhZjQyMDA5MCwgMHg4ZjQyMDA5NCwgCisweDhmNDMwMTQ0LCAweDQzMTAyMywgMHhhZjQyMDA5NCwgMHg4ZjQzMDA5NCwgCisweDhmNDIwMTQwLCAweDQzMTAyYiwgMHgxMDQwMDAwOSwgMHgwLCAKKzB4OGY0MzAxM2MsIDB4OGY0NDAwOTQsIDB4OGY0MjAwOTAsIDB4OGY0NTAxMzgsIAorMHg2NDE4MjMsIDB4NDMxMDIzLCAweGFmNDIwMDkwLCAweGFmNDUwMDk0LCAKKzB4OGY0MjAwOTQsIDB4MTAwMDAwMWYsIDB4YWY0MjAwOTgsIDB4MTBlMDAwMWQsIAorMHgzMGMyMDBmZiwgMHgxNDQwMDAwMiwgMHgyNDAyMDAxMCwgMHgyNDAyMDAwMiwgCisweGFmYTIwMDEwLCAweDhmNDIwMDMwLCAweGFmYTgwMDE4LCAweGFmYTIwMDE0LCAKKzB4OGY0NjAwOTgsIDB4OGY0MjAxMDgsIDB4NDBmODA5LCAweDAsIAorMHgxMDQwMDAzMCwgMHgzMjI1ZmZmZiwgMHg4ZjQyMDA5OCwgMHg4ZjQ0MDEzYywgCisweDQ1MTAyMSwgMHhhZjQyMDA5OCwgMHg4ZjQyMDA5MCwgMHg4ZjQzMDA5OCwgCisweGEzNDAwNWMyLCAweDQ1MTAyMywgMHg2NDE4MmIsIDB4MTQ2MDAwMDUsIAorMHhhZjQyMDA5MCwgMHg4ZjQyMDA5OCwgMHg4ZjQzMDE0NCwgMHg0MzEwMjMsIAorMHhhZjQyMDA5OCwgMHg4ZjQyMDAzMCwgMHg4ZjQzMDA0MCwgMHgyNDQyMDAwMSwgCisweDI0NjNmZmZmLCAweDQzMTAyNCwgMHhhZjQyMDAzMCwgMHg4ZjQyMDAzMCwgCisweDE0NTIwMDE4LCAweDAsIDB4OGY0MjAwMDAsIDB4MTA0MDAwMDcsIAorMHgwLCAweGFmODAwMDRjLCAweDhmODIwMDRjLCAweDEwNDBmZmZkLCAKKzB4MCwgMHgxMDAwMDAwNSwgMHgwLCAweGFmODAwMDQ4LCAKKzB4OGY4MjAwNDgsIDB4MTA0MGZmZmQsIDB4MCwgMHg4ZjgyMDA2MCwgCisweDI0MDNmZmY3LCAweDQzMTAyNCwgMHhhZjgyMDA2MCwgMHg4ZjQyMDAwMCwgCisweDEwNDAwMDAzLCAweDAsIDB4MTAwMDAwMDIsIDB4YWY4MDAwNGMsIAorMHhhZjgwMDA0OCwgMHg4ZmJmMDAyYywgMHg4ZmIyMDAyOCwgMHg4ZmIxMDAyNCwgCisweDhmYjAwMDIwLCAweDNlMDAwMDgsIDB4MjdiZDAwMzAsIDB4M2UwMDAwOCwgCisweDAsIDB4MjdiZGZmZDgsIDB4M2MwMjAwMDEsIDB4MzQ0MjJlYzAsIAorMHhhZmJmMDAyMCwgMHg4ZjQzMDBmMCwgMHg4Zjg0MDEwOCwgMHgyZTIxMDIxLCAKKzB4NTQ2MjAwMDQsIDB4MjQ2MjAwMDgsIDB4M2MwMjAwMDEsIDB4MzQ0MjJjYzAsIAorMHgyZTIxMDIxLCAweDQwMTgyMSwgMHhhZjQzMDBmMCwgMHhhYzYwMDAwMCwgCisweDhmNDIwMGVjLCAweDhjNjYwMDA0LCAweDE0NjIwMDA0LCAweDNjMDIwMDAxLCAKKzB4MjQ4MjAwMjAsIDB4MTAwMDAwMGYsIDB4YWY4MjAxMDgsIDB4OGY0MzAwZjAsIAorMHgzNDQyMmVjMCwgMHgyZTIxMDIxLCAweDU0NjIwMDA0LCAweDI0NjIwMDA4LCAKKzB4M2MwMjAwMDEsIDB4MzQ0MjJjYzAsIDB4MmUyMTAyMSwgMHg0MDE4MjEsIAorMHg4YzYyMDAwNCwgMHgyMTE0MCwgMHg4MjEwMjEsIDB4YWY4MjAxMDgsIAorMHhhYzYwMDAwMCwgMHg4Yzg1MDAxOCwgMHgzMGEyMDAzNiwgMHgxMDQwMDA2YywgCisweDMwYTIwMDAxLCAweDhjODIwMDFjLCAweDhmNDMwMDQwLCAweDhmNDQwMDM0LCAKKzB4MjQ0MjAwMDEsIDB4MjQ2M2ZmZmYsIDB4NDMxMDI0LCAweDg2MjAyMSwgCisweGFmNDIwMDJjLCAweDMwYTIwMDMwLCAweDE0NDAwMDA2LCAweGFmNDQwMDM0LCAKKzB4OGY0MjAwMzQsIDB4OGMwMzAyM2MsIDB4NDMxMDJiLCAweDE0NDAwMGI0LCAKKzB4MCwgMHgzMmMyMDAxMCwgMHgxMDQwMDAyOCwgMHgyNDA3MDAwOCwgCisweDhmNDQwMTcwLCAweDhmNDUwMTc0LCAweDhmNDMwMDJjLCAweDhmNDgwMDBjLCAKKzB4OGY4NjAxMjAsIDB4MjQwMjAwODAsIDB4YWZhMjAwMTAsIDB4YWZhMzAwMTQsIAorMHhhZmE4MDAxOCwgMHg4ZjQyMDEwYywgMHg0MGY4MDksIDB4MjRjNjAwMWMsIAorMHgxNDQwMDAxMSwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHgzNzA4MjEsIAorMHhhMDIyNDBmMSwgMHg4ZjgyMDEyNCwgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyOCwgCisweDNjMDQwMDAxLCAweDI0ODQ2N2M0LCAweGFmYTIwMDE0LCAweDhmNDYwMDJjLCAKKzB4OGY4NzAxMjAsIDB4M2MwNTAwMDksIDB4YzAwMmIzYiwgMHgzNGE1MTEwMCwgCisweDEwMDAwMDM2LCAweDAsIDB4OGY0MjAzMDAsIDB4OGY0MzAwMmMsIAorMHgyNDQyMDAwMSwgMHhhZjQyMDMwMCwgMHg4ZjQyMDMwMCwgMHgyNDAyMDAwMSwgCisweGEzNDIwNWMxLCAweDEwMDAwMDI2LCAweGFmNDMwMDM4LCAweDhmNDQwMTcwLCAKKzB4OGY0NTAxNzQsIDB4OGY0MzAwMmMsIDB4OGY0ODAwMGMsIDB4OGY4NjAxMjAsIAorMHgyNDAyMDAyMCwgMHhhZmEyMDAxMCwgMHhhZmEzMDAxNCwgMHhhZmE4MDAxOCwgCisweDhmNDIwMTBjLCAweDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxNDQwMDAxMSwgCisweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIyNDBmMCwgCisweDhmODIwMTI0LCAweGFmYTIwMDEwLCAweDhmODIwMTI4LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDY3YjgsIDB4YWZhMjAwMTQsIDB4OGY0NjAwMmMsIDB4OGY4NzAxMjAsIAorMHgzYzA1MDAwOSwgMHhjMDAyYjNiLCAweDM0YTUwOTAwLCAweDEwMDAwMDBmLCAKKzB4MCwgMHg4ZjQyMDMwMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwMCwgCisweDhmNDIwMzAwLCAweDhmNDIwMDJjLCAweGEzNDAwNWMxLCAweGFmNDIwMDM4LCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA0MGYxLCAweDNjMDEwMDAxLCAKKzB4MzcwODIxLCAweGEwMjA0MGYwLCAweGFmNDAwMDM0LCAweDhmNDIwMzE0LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAzMTQsIDB4MTAwMDAwNTksIDB4OGY0MjAzMTQsIAorMHgxMDQwMDAyMiwgMHgzMGEyNzAwMCwgMHg4Yzg1MDAxYywgMHg4ZjQyMDAyOCwgCisweGEyMjAyMywgMHg0ODEwMDAzLCAweDAsIDB4OGY0MjAwNDAsIAorMHg4MjIwMjEsIDB4OGY0MjAzNTgsIDB4OGY0MzAwMDAsIDB4YWY0NTAwMjgsIAorMHg0NDEwMjEsIDB4MTA2MDAwMDcsIDB4YWY0MjAzNTgsIDB4YWY4MDAwNGMsIAorMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LCAKKzB4MCwgMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgCisweDAsIDB4OGY4MjAwNjAsIDB4MzQ0MjAwMDgsIDB4YWY4MjAwNjAsIAorMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywgMHgwLCAweDEwMDAwMDM4LCAKKzB4YWY4MDAwNGMsIDB4MTAwMDAwMzYsIDB4YWY4MDAwNDgsIDB4MTA0MDAwMmYsIAorMHgzMGEyMTAwMCwgMHgxMDQwMDAwYywgMHgzMGEyNDAwMCwgMHg4YzgzMDAxYywgCisweDhmNDIwMDUwLCAweDYyMjAyMywgMHg0ODIwMDAxLCAweDI0ODQwMjAwLCAKKzB4OGY0MjAzNWMsIDB4NDQxMDIxLCAweGFmNDIwMzVjLCAweDhmNDIwMzY4LCAKKzB4MTAwMDAwMWEsIDB4YWY0MzAwNTAsIDB4MTA0MDAwMGMsIDB4MzJjMjgwMDAsIAorMHg4YzgzMDAxYywgMHg4ZjQyMDA3MCwgMHg2MjIwMjMsIDB4NDgyMDAwMSwgCisweDI0ODQwNDAwLCAweDhmNDIwMzY0LCAweDQ0MTAyMSwgMHhhZjQyMDM2NCwgCisweDhmNDIwMzY4LCAweDEwMDAwMDBkLCAweGFmNDMwMDcwLCAweDEwNDAwMDBlLCAKKzB4M2MwMjA4MDAsIDB4OGM4MzAwMWMsIDB4OGY0MjAwNjAsIDB4NjIyMDIzLCAKKzB4NDgyMDAwMSwgMHgyNDg0MDEwMCwgMHg4ZjQyMDM2MCwgMHg0NDEwMjEsIAorMHhhZjQyMDM2MCwgMHg4ZjQyMDM2OCwgMHhhZjQzMDA2MCwgMHg0NDEwMjEsIAorMHhhZjQyMDM2OCwgMHgzYzAyMDgwMCwgMHgyYzIxMDI0LCAweDUwNDAwMDA4LCAKKzB4MzY5NDAwNDAsIDB4MTAwMDAwMDYsIDB4MCwgMHgzMGEyMDEwMCwgCisweDEwNDAwMDAzLCAweDAsIDB4YzAwMmJkOCwgMHgwLCAKKzB4OGZiZjAwMjAsIDB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgzZTAwMDA4LCAKKzB4MCwgMHgyN2JkZmZhOCwgMHhhZmJmMDA1MCwgMHhhZmJlMDA0YywgCisweGFmYjUwMDQ4LCAweGFmYjMwMDQ0LCAweGFmYjIwMDQwLCAweGFmYjEwMDNjLCAKKzB4YWZiMDAwMzgsIDB4OGY5MTAxMDgsIDB4MjYyMjAwMjAsIDB4YWY4MjAxMDgsIAorMHg4ZTMyMDAxOCwgMHhhODIxLCAweDMyNDIwMDI0LCAweDEwNDAwMWJhLCAKKzB4ZjAyMSwgMHg4ZTI2MDAxYywgMHg4ZjQzMDAxYywgMHg2MTEwMCwgCisweDYyMTgyMSwgMHg4YzcwMDAwYywgMHg5NjA0MDAwYywgMHg5NjJkMDAxNiwgCisweDk0NzMwMDBhLCAweDJjODMwNWRkLCAweDM4ODI4ODcwLCAweDJjNDIwMDAxLCAKKzB4NjIxODI1LCAweDEwNjAwMDE1LCAweDI4MjEsIDB4MzJjMjAwNDAsIAorMHgxMDQwMDAxNSwgMHgyNDAyMDgwMCwgMHg5NjAzMDAxNCwgMHgxNDYyMDAxMiwgCisweDM0MDJhYWFhLCAweDk2MDMwMDBlLCAweDE0NjIwMDA3LCAweDIwMjEsIAorMHg5NjAzMDAxMCwgMHgyNDAyMDMwMCwgMHgxNDYyMDAwNCwgMHg4MDEwMjEsIAorMHg5NjAyMDAxMiwgMHgyYzQ0MDAwMSwgMHg4MDEwMjEsIDB4NTQ0MDAwMDYsIAorMHgyNDA1MDAxNiwgMHgxMDAwMDAwNCwgMHgwLCAweDI0MDIwODAwLCAKKzB4NTA4MjAwMDEsIDB4MjQwNTAwMGUsIDB4OTM0MjA1YzMsIDB4MTQ0MDAwMDgsIAorMHg1ODIxLCAweDI0MGIwMDAxLCAweDMyNjIwMTgwLCAweGFmNDUwMGE4LCAKKzB4YWY1MDAwYTAsIDB4MTA0MDAwMDIsIDB4YWY0NjAwYTQsIDB4YTM0YjA1YzMsIAorMHgxMGEwMDA4NSwgMHgyMDU0MDIxLCAweDkxMDIwMDAwLCAweDM4MjEsIAorMHgzMDQyMDAwZiwgMHgyNTA4MCwgMHgzMmMyMDAwMiwgMHgxMDQwMDAxMiwgCisweDEwYTE4MjEsIDB4MzI2MjAwMDIsIDB4MTA0MDAwMTAsIDB4MzJjMjAwMDEsIAorMHgxMDAyMDIxLCAweDk0ODIwMDAwLCAweDI0ODQwMDAyLCAweGUyMzgyMSwgCisweDgzMTAyYiwgMHgxNDQwZmZmYiwgMHgzMGUyZmZmZiwgMHg3MWMwMiwgCisweDYyMzgyMSwgMHg3MWMwMiwgMHgzMGUyZmZmZiwgMHg2MjM4MjEsIAorMHg3MTAyNywgMHhhNTAyMDAwYSwgMHgzMmMyMDAwMSwgMHgxMDQwMDA2YSwgCisweDMyNjIwMDAxLCAweDEwNDAwMDY4LCAweDAsIDB4OGY0MjAwYTgsIAorMHgxMDQwMDA2NSwgMHgwLCAweDhmNDIwMGEwLCAweDhmNDMwMGE4LCAKKzB4NDMxMDIxLCAweDkwNGMwMDA5LCAweDMxODkwMGZmLCAweDM5MjMwMDA2LCAKKzB4MzE4MmIsIDB4MzkyMjAwMTEsIDB4MjEwMmIsIDB4NjIxODI0LCAKKzB4MTA2MDAwMGMsIDB4M2MwNTAwMDYsIDB4OGY0MjAwYTQsIDB4M2MwNDAwMDEsIAorMHgyNDg0NjdkNCwgMHhhZmEyMDAxMCwgMHg4ZjQyMDBhMCwgMHgzNGE1NDYwMCwgCisweDEyMDM4MjEsIDB4YzAwMmIzYiwgMHhhZmEyMDAxNCwgMHgxMDAwMDA0ZSwgCisweDAsIDB4MzJjMjAwMDQsIDB4MTQ0MDAwMTMsIDB4MjgyMSwgCisweDMxNjIwMGZmLCAweDE0NDAwMDA0LCAweDAsIDB4OTUwMjAwMDIsIAorMHgxMDAwMDAwZCwgMHg0YTI4MjMsIDB4OTUwNTAwMGMsIDB4OTUwMjAwMGUsIAorMHg5NTAzMDAxMCwgMHhhMjI4MjEsIDB4YTMyODIxLCAweDk1MDMwMDEyLCAKKzB4OTEwNDAwMDksIDB4OTUwMjAwMDIsIDB4YTMyODIxLCAweGE0MjgyMSwgCisweDRhMTAyMywgMHhhMjI4MjEsIDB4MjAwMjAyMSwgMHg5NDgyMDAwMCwgCisweDI0ODQwMDAyLCAweGUyMzgyMSwgMHg4ODEwMmIsIDB4MTQ0MGZmZmIsIAorMHg3MWMwMiwgMHgzMGUyZmZmZiwgMHg2MjM4MjEsIDB4NzFjMDIsIAorMHgzMGUyZmZmZiwgMHg2MjM4MjEsIDB4MWE1MjgyMSwgMHg1MWMwMiwgCisweDMwYTJmZmZmLCAweDYyMjgyMSwgMHg1MWMwMiwgMHgzMGEyZmZmZiwgCisweDYyMjgyMSwgMHhhNzI4MjMsIDB4NTE0MDIsIDB4YTIyODIxLCAKKzB4MzBhNWZmZmYsIDB4NTBhMDAwMDEsIDB4MzQwNWZmZmYsIDB4MzE2MjAwZmYsIAorMHgxNDQwMDAwOCwgMHgzMTgzMDBmZiwgMHg4ZjQzMDBhMCwgMHg4ZjQyMDBhOCwgCisweDYyNDAyMSwgMHg5MTAyMDAwMCwgMHgzMDQyMDAwZiwgMHgyNTA4MCwgCisweDMxODMwMGZmLCAweDI0MDIwMDA2LCAweDE0NjIwMDAzLCAweDEwYTEwMjEsIAorMHgxMDAwMDAwMiwgMHgyNDQ0MDAxMCwgMHgyNDQ0MDAwNiwgMHgzMTYyMDBmZiwgCisweDE0NDAwMDA2LCAweDAsIDB4OTQ4MjAwMDAsIDB4YTIyODIxLCAKKzB4NTFjMDIsIDB4MzBhMmZmZmYsIDB4NjIyODIxLCAweDkzNDIwNWMzLCAKKzB4MTA0MDAwMDMsIDB4MzI2MjAxMDAsIDB4NTA0MDAwMDMsIDB4YTQ4NTAwMDAsIAorMHg1MjgyNywgMHhhNDg1MDAwMCwgMHg5NjIyMDAwZSwgMHg4ZjQzMDA5YywgCisweDYyMTgyMSwgMHgzMmEyMDBmZiwgMHgxMDQwMDAwNywgMHhhZjQzMDA5YywgCisweDNjMDI0MDAwLCAweDIwMjEwMjUsIDB4YWZhMjAwMjAsIDB4OGY0MjAwOWMsIAorMHgxMDAwMDAwMywgMHg1ZTEwMjUsIDB4YWZiMDAwMjAsIDB4OGY0MjAwOWMsIAorMHhhZmEyMDAyNCwgMHgzMjYyMDA4MCwgMHgxMDQwMDAxMCwgMHgzMjYyMDEwMCwgCisweDhmNDIwMGI0LCAweDI0NDMwMDAxLCAweDIxMGMwLCAweDU3MTAyMSwgCisweGFmNDMwMGI0LCAweDhmYTMwMDIwLCAweDhmYTQwMDI0LCAweDNjMDEwMDAxLCAKKzB4MjIwODIxLCAweGFjMjMzOGU4LCAweDNjMDEwMDAxLCAweDIyMDgyMSwgCisweGFjMjQzOGVjLCAweDEwMDAwMGE1LCAweDMyYzIwMDIwLCAweDEwNDAwMDY0LCAKKzB4MCwgMHg4ZjQyMDBiNCwgMHgyNDQzMDAwMSwgMHgyMTBjMCwgCisweDU3MTAyMSwgMHhhZjQzMDBiNCwgMHg4ZmEzMDAyMCwgMHg4ZmE0MDAyNCwgCisweDNjMDEwMDAxLCAweDIyMDgyMSwgMHhhYzIzMzhlOCwgMHgzYzAxMDAwMSwgCisweDIyMDgyMSwgMHhhYzI0MzhlYywgMHg4ZjQyMDBiNCwgMHgxMDQwMDA1MSwgCisweDM4MjEsIDB4M2MwOTAwMDEsIDB4MzUyOTM4ZTgsIDB4M2MwODAwMWYsIAorMHgzNTA4ZmZmZiwgMHgyNDBiZmZmZiwgMHgzNDBhZmZmZiwgMHg3MTBjMCwgCisweDU3MTAyMSwgMHg0OTEwMjEsIDB4OGM0MzAwMDAsIDB4OGM0NDAwMDQsIAorMHhhZmEzMDAyOCwgMHhhZmE0MDAyYywgMHg4ZjgyMDBmYywgMHg4ZmEzMDAyOCwgCisweDhmYTQwMDJjLCAweGFjNDMwMDAwLCAweGFjNDQwMDA0LCAweDI0NDIwMDA4LCAKKzB4YWY4MjAwZjAsIDB4OGY0MjAwOGMsIDB4MjQ0MmZmZmYsIDB4YWY0MjAwOGMsIAorMHg5N2EyMDAyZSwgMHg4ZjQ0MDI3MCwgMHg4ZjQ1MDI3NCwgMHg0MDE4MjEsIAorMHgxMDIxLCAweGEzMjgyMSwgMHhhMzMwMmIsIDB4ODIyMDIxLCAKKzB4ODYyMDIxLCAweGFmNDQwMjcwLCAweGFmNDUwMjc0LCAweDhmYTIwMDI4LCAKKzB4NDgxMDI0LCAweDkwNDMwMDAwLCAweDMwNjMwMDAxLCAweDE0NjAwMDBiLCAKKzB4NDAyMDIxLCAweDhmNDIwMjc4LCAweDhmNDMwMjdjLCAweDI0NjMwMDAxLCAKKzB4MmM2NDAwMDEsIDB4NDQxMDIxLCAweGFmNDIwMjc4LCAweGFmNDMwMjdjLCAKKzB4OGY0MjAyNzgsIDB4MTAwMDAwMWEsIDB4OGY0MzAyN2MsIDB4OGM4MjAwMDAsIAorMHgxNDRiMDAwZSwgMHgwLCAweDk0ODIwMDA0LCAweDE0NGEwMDBiLCAKKzB4MCwgMHg4ZjQyMDI4OCwgMHg4ZjQzMDI4YywgMHgyNDYzMDAwMSwgCisweDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZjQyMDI4OCwgMHhhZjQzMDI4YywgCisweDhmNDIwMjg4LCAweDEwMDAwMDBhLCAweDhmNDMwMjhjLCAweDhmNDIwMjgwLCAKKzB4OGY0MzAyODQsIDB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIDB4NDQxMDIxLCAKKzB4YWY0MjAyODAsIDB4YWY0MzAyODQsIDB4OGY0MjAyODAsIDB4OGY0MzAyODQsIAorMHg4ZjQyMDBiNCwgMHgyNGU3MDAwMSwgMHhlMjEwMmIsIDB4MTQ0MGZmYjgsIAorMHg3MTBjMCwgMHhhMzQwMDVjMywgMHgxMDAwMDAzZiwgMHhhZjQwMDBiNCwgCisweDhmODIwMGZjLCAweDhmYTMwMDIwLCAweDhmYTQwMDI0LCAweGFjNDMwMDAwLCAKKzB4YWM0NDAwMDQsIDB4MjQ0MjAwMDgsIDB4YWY4MjAwZjAsIDB4OGY0MjAwOWMsIAorMHg4ZjQ2MDA4YywgMHg4ZjQ0MDI3MCwgMHg4ZjQ1MDI3NCwgMHg0MDE4MjEsIAorMHgxMDIxLCAweDI0YzZmZmZmLCAweGFmNDYwMDhjLCAweGEzMjgyMSwgCisweGEzMzAyYiwgMHg4MjIwMjEsIDB4ODYyMDIxLCAweGFmNDQwMjcwLCAKKzB4YWY0NTAyNzQsIDB4OTIwMjAwMDAsIDB4MzA0MjAwMDEsIDB4MTQ0MDAwMGMsIAorMHgyNDAyZmZmZiwgMHg4ZjQyMDI3OCwgMHg4ZjQzMDI3YywgMHgyNDYzMDAwMSwgCisweDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZjQyMDI3OCwgMHhhZjQzMDI3YywgCisweDhmNDIwMjc4LCAweDhmNDMwMjdjLCAweDEwMDAwMDFjLCAweDMyYzIwMDIwLCAKKzB4OGUwMzAwMDAsIDB4MTQ2MjAwMGYsIDB4MzQwMmZmZmYsIDB4OTYwMzAwMDQsIAorMHgxNDYyMDAwYywgMHgwLCAweDhmNDIwMjg4LCAweDhmNDMwMjhjLCAKKzB4MjQ2MzAwMDEsIDB4MmM2NDAwMDEsIDB4NDQxMDIxLCAweGFmNDIwMjg4LCAKKzB4YWY0MzAyOGMsIDB4OGY0MjAyODgsIDB4OGY0MzAyOGMsIDB4MTAwMDAwMGIsIAorMHgzMmMyMDAyMCwgMHg4ZjQyMDI4MCwgMHg4ZjQzMDI4NCwgMHgyNDYzMDAwMSwgCisweDJjNjQwMDAxLCAweDQ0MTAyMSwgMHhhZjQyMDI4MCwgMHhhZjQzMDI4NCwgCisweDhmNDIwMjgwLCAweDhmNDMwMjg0LCAweDMyYzIwMDIwLCAweDEwNDAwMDA1LCAKKzB4YWY0MDAwOWMsIDB4OGY0MjAzNTgsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNTgsIAorMHg4ZjQyMDM1OCwgMHg4ZTIyMDAxYywgMHg4ZjQzMDA0MCwgMHgyNDQyMDAwMSwgCisweDI0NjNmZmZmLCAweDQzMTAyNCwgMHhhZjQyMDAyYywgMHgzMjQyMDA2MCwgCisweDE0NDAwMDA4LCAweDMyYzIwMDEwLCAweDhmNDIwMDM0LCAweDI0NDIwMDAxLCAKKzB4YWY0MjAwMzQsIDB4OGMwMzAyM2MsIDB4NDMxMDJiLCAweDE0NDAwMTAyLCAKKzB4MzJjMjAwMTAsIDB4MTA0MDAwMTgsIDB4MjQwNzAwMDgsIDB4OGY0NDAxNzAsIAorMHg4ZjQ1MDE3NCwgMHg4ZjQzMDAyYywgMHg4ZjQ4MDAwYywgMHg4Zjg2MDEyMCwgCisweDI0MDIwMDgwLCAweGFmYTIwMDEwLCAweGFmYTMwMDE0LCAweGFmYTgwMDE4LCAKKzB4OGY0MjAxMGMsIDB4NDBmODA5LCAweDI0YzYwMDFjLCAweDEwNDAwMDQ3LCAKKzB4MjQwMjAwMDEsIDB4OGY0MjAzMDAsIDB4OGY0MzAwMmMsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDMwMCwgMHg4ZjQyMDMwMCwgMHgyNDAyMDAwMSwgMHhhMzQyMDVjMSwgCisweDEwMDAwMDdjLCAweGFmNDMwMDM4LCAweDhmNDQwMTcwLCAweDhmNDUwMTc0LCAKKzB4OGY0MzAwMmMsIDB4OGY0ODAwMGMsIDB4OGY4NjAxMjAsIDB4MjQwMjAwMjAsIAorMHhhZmEyMDAxMCwgMHhhZmEzMDAxNCwgMHhhZmE4MDAxOCwgMHg4ZjQyMDEwYywgCisweDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxMDQwMDA1NywgMHgyNDAyMDAwMSwgCisweDEwMDAwMDY1LCAweDAsIDB4MzI0MjAwMTIsIDB4MTA0MDAwNzUsIAorMHgzMjQyMDAwMSwgMHg5NjIyMDAwZSwgMHg4ZjQzMDA5YywgMHg2MjE4MjEsIAorMHgzMmMyMDAyMCwgMHgxMDQwMDAwNSwgMHhhZjQzMDA5YywgMHg4ZjQyMDM1OCwgCisweDI0NDJmZmZmLCAweGFmNDIwMzU4LCAweDhmNDIwMzU4LCAweDhlMjIwMDFjLCAKKzB4OGY0MzAwNDAsIDB4MjQ0MjAwMDEsIDB4MjQ2M2ZmZmYsIDB4NDMxMDI0LCAKKzB4YWY0MjAwMmMsIDB4MzI0MjAwMTAsIDB4MTQ0MDAwMDgsIDB4MzJjMjAwMTAsIAorMHg4ZjQyMDAzNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDAzNCwgMHg4YzAzMDIzYywgCisweDQzMTAyYiwgMHgxNDQwMDBiYywgMHgzMmMyMDAxMCwgMHgxMDQwMDAyOCwgCisweDI0MDcwMDA4LCAweDhmNDQwMTcwLCAweDhmNDUwMTc0LCAweDhmNDMwMDJjLCAKKzB4OGY0ODAwMGMsIDB4OGY4NjAxMjAsIDB4MjQwMjAwODAsIDB4YWZhMjAwMTAsIAorMHhhZmEzMDAxNCwgMHhhZmE4MDAxOCwgMHg4ZjQyMDEwYywgMHg0MGY4MDksIAorMHgyNGM2MDAxYywgMHgxNDQwMDAxMSwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgCisweDM3MDgyMSwgMHhhMDIyNDBmMSwgMHg4ZjgyMDEyNCwgMHhhZmEyMDAxMCwgCisweDhmODIwMTI4LCAweDNjMDQwMDAxLCAweDI0ODQ2N2M0LCAweGFmYTIwMDE0LCAKKzB4OGY0NjAwMmMsIDB4OGY4NzAxMjAsIDB4M2MwNTAwMDksIDB4YzAwMmIzYiwgCisweDM0YTUxMTAwLCAweDEwMDAwMDM2LCAweDAsIDB4OGY0MjAzMDAsIAorMHg4ZjQzMDAyYywgMHgyNDQyMDAwMSwgMHhhZjQyMDMwMCwgMHg4ZjQyMDMwMCwgCisweDI0MDIwMDAxLCAweGEzNDIwNWMxLCAweDEwMDAwMDI2LCAweGFmNDMwMDM4LCAKKzB4OGY0NDAxNzAsIDB4OGY0NTAxNzQsIDB4OGY0MzAwMmMsIDB4OGY0ODAwMGMsIAorMHg4Zjg2MDEyMCwgMHgyNDAyMDAyMCwgMHhhZmEyMDAxMCwgMHhhZmEzMDAxNCwgCisweGFmYTgwMDE4LCAweDhmNDIwMTBjLCAweDQwZjgwOSwgMHgyNGM2MDAxYywgCisweDE0NDAwMDExLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgCisweGEwMjI0MGYwLCAweDhmODIwMTI0LCAweGFmYTIwMDEwLCAweDhmODIwMTI4LCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDY3YjgsIDB4YWZhMjAwMTQsIDB4OGY0NjAwMmMsIAorMHg4Zjg3MDEyMCwgMHgzYzA1MDAwOSwgMHhjMDAyYjNiLCAweDM0YTUwOTAwLCAKKzB4MTAwMDAwMGYsIDB4MCwgMHg4ZjQyMDMwMCwgMHgyNDQyMDAwMSwgCisweGFmNDIwMzAwLCAweDhmNDIwMzAwLCAweDhmNDIwMDJjLCAweGEzNDAwNWMxLCAKKzB4YWY0MjAwMzgsIDB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA0MGYxLCAKKzB4M2MwMTAwMDEsIDB4MzcwODIxLCAweGEwMjA0MGYwLCAweGFmNDAwMDM0LCAKKzB4OGY0MjAzMTQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMTQsIDB4MTAwMDAwNjIsIAorMHg4ZjQyMDMxNCwgMHgxMDQwMDAyMiwgMHgzMjQyNzAwMCwgMHg4ZTI1MDAxYywgCisweDhmNDIwMDI4LCAweGEyMjAyMywgMHg0ODEwMDAzLCAweDAsIAorMHg4ZjQyMDA0MCwgMHg4MjIwMjEsIDB4OGY0MjAzNTgsIDB4OGY0MzAwMDAsIAorMHhhZjQ1MDAyOCwgMHg0NDEwMjEsIDB4MTA2MDAwMDcsIDB4YWY0MjAzNTgsIAorMHhhZjgwMDA0YywgMHg4ZjgyMDA0YywgMHgxMDQwZmZmZCwgMHgwLCAKKzB4MTAwMDAwMDUsIDB4MCwgMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgCisweDEwNDBmZmZkLCAweDAsIDB4OGY4MjAwNjAsIDB4MzQ0MjAwMDgsIAorMHhhZjgyMDA2MCwgMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywgMHgwLCAKKzB4MTAwMDAwNDEsIDB4YWY4MDAwNGMsIDB4MTAwMDAwM2YsIDB4YWY4MDAwNDgsIAorMHgxMDQwMDAyZiwgMHgzMjQyMTAwMCwgMHgxMDQwMDAwYywgMHgzMjQyNDAwMCwgCisweDhlMjMwMDFjLCAweDhmNDIwMDUwLCAweDYyMjAyMywgMHg0ODIwMDAxLCAKKzB4MjQ4NDAyMDAsIDB4OGY0MjAzNWMsIDB4NDQxMDIxLCAweGFmNDIwMzVjLCAKKzB4OGY0MjAzNjgsIDB4MTAwMDAwMWEsIDB4YWY0MzAwNTAsIDB4MTA0MDAwMGMsIAorMHgzMmMyODAwMCwgMHg4ZTIzMDAxYywgMHg4ZjQyMDA3MCwgMHg2MjIwMjMsIAorMHg0ODIwMDAxLCAweDI0ODQwNDAwLCAweDhmNDIwMzY0LCAweDQ0MTAyMSwgCisweGFmNDIwMzY0LCAweDhmNDIwMzY4LCAweDEwMDAwMDBkLCAweGFmNDMwMDcwLCAKKzB4MTA0MDAwMGUsIDB4M2MwMjA4MDAsIDB4OGUyMzAwMWMsIDB4OGY0MjAwNjAsIAorMHg2MjIwMjMsIDB4NDgyMDAwMSwgMHgyNDg0MDEwMCwgMHg4ZjQyMDM2MCwgCisweDQ0MTAyMSwgMHhhZjQyMDM2MCwgMHg4ZjQyMDM2OCwgMHhhZjQzMDA2MCwgCisweDQ0MTAyMSwgMHhhZjQyMDM2OCwgMHgzYzAyMDgwMCwgMHgyYzIxMDI0LCAKKzB4NTA0MDAwMTEsIDB4MzY5NDAwNDAsIDB4MTAwMDAwMGYsIDB4MCwgCisweDMyNDIwMDQ4LCAweDEwNDAwMDA3LCAweDI0MTUwMDAxLCAweDhlMjIwMDFjLCAKKzB4M2MwM2ZmZmYsIDB4NDNmMDI0LCAweDMwNDJmZmZmLCAweDEwMDBmZDc1LCAKKzB4YWUyMjAwMWMsIDB4MzI0MjAxMDAsIDB4MTA0MDAwMDMsIDB4MCwgCisweGMwMDJiZDgsIDB4MCwgMHg4ZmJmMDA1MCwgMHg4ZmJlMDA0YywgCisweDhmYjUwMDQ4LCAweDhmYjMwMDQ0LCAweDhmYjIwMDQwLCAweDhmYjEwMDNjLCAKKzB4OGZiMDAwMzgsIDB4M2UwMDAwOCwgMHgyN2JkMDA1OCwgMHgzZTAwMDA4LCAKKzB4MCwgMHgwLCAweDAsIDB4OGY4MzAwZTQsIAorMHg4ZjgyMDBlMCwgMHgyNDA0ZmZmOCwgMHg0NDEwMjQsIDB4NjIxMDI2LCAKKzB4MjEwMmIsIDB4MjEwMjMsIDB4M2UwMDAwOCwgMHg2MjEwMjQsIAorMHgzZTAwMDA4LCAweDAsIDB4MjdiZGZmZTAsIDB4YWZiZjAwMWMsIAorMHhhZmIwMDAxOCwgMHg4Zjg2MDBjNCwgMHg4Zjg0MDBlMCwgMHg4Zjg1MDBlNCwgCisweDI0MDJmZmY4LCAweDgyMTgyNCwgMHgxMGEzMDAwOSwgMHgyNzYyM2ZmOCwgCisweDE0YTIwMDAyLCAweDI0YTIwMDA4LCAweDI3NjIzMDAwLCAweDQwODAyMSwgCisweDE2MDMwMDA1LCAweDMwODIwMDA0LCAweDEwNDAwMDA0LCAweGMwMjAyMSwgCisweDEwMDAwMDIyLCAweDEwMjEsIDB4OGUwNDAwMDAsIDB4OGY0MjAxMWMsIAorMHgxNGEyMDAwMywgMHgwLCAweDhmNDIwMTIwLCAweGFmNDIwMTE0LCAKKzB4OGNhMzAwMDAsIDB4OGY0MjAxNDgsIDB4ODMxODIzLCAweDQzMTAyYiwgCisweDEwNDAwMDAzLCAweDAsIDB4OGY0MjAxNDgsIDB4NjIxODIxLCAKKzB4OTRhMjAwMDYsIDB4MjQ0MjAwNTAsIDB4NjIxMDJiLCAweDE0NDAwMDBmLCAKKzB4YTAxMDIxLCAweGFmYTQwMDEwLCAweGFmYTMwMDE0LCAweDhjYTYwMDAwLCAKKzB4OGNhNzAwMDQsIDB4M2MwNDAwMDEsIDB4YzAwMmIzYiwgMHgyNDg0Njg5NCwgCisweDhmNDIwMjBjLCAweDI0NDIwMDAxLCAweGFmNDIwMjBjLCAweDhmNDIwMjBjLCAKKzB4MTAyMSwgMHhhZjkwMDBlOCwgMHhhZjkwMDBlNCwgMHg4ZmJmMDAxYywgCisweDhmYjAwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4M2UwMDAwOCwgCisweDAsIDB4OGY4NDAwZTAsIDB4OGY4ODAwYzQsIDB4OGY4MzAwZTgsIAorMHgyNDAyZmZmOCwgMHg4MjM4MjQsIDB4ZTMyMDIzLCAweDJjODIxMDAwLCAKKzB4NTA0MDAwMDEsIDB4MjQ4NDEwMDAsIDB4NDIwYzIsIDB4ODAxODIxLCAKKzB4OGY0NDAyNTgsIDB4OGY0NTAyNWMsIDB4MTAyMSwgMHhhMzI4MjEsIAorMHhhMzMwMmIsIDB4ODIyMDIxLCAweDg2MjAyMSwgMHhhZjQ0MDI1OCwgCisweGFmNDUwMjVjLCAweDhmODMwMGM4LCAweDhmNDIwMTQ4LCAweDEwMzIwMjMsIAorMHg4MjEwMmIsIDB4MTQ0MDAwMDQsIDB4ODAxODIxLCAweDhmNDIwMTQ4LCAKKzB4ODIyMDIxLCAweDgwMTgyMSwgMHg4ZjQ0MDI1MCwgMHg4ZjQ1MDI1NCwgCisweDEwMjEsIDB4YTMyODIxLCAweGEzMzAyYiwgMHg4MjIwMjEsIAorMHg4NjIwMjEsIDB4YWY0NDAyNTAsIDB4YWY0NTAyNTQsIDB4YWY4ODAwYzgsIAorMHhhZjg3MDBlNCwgMHhhZjg3MDBlOCwgMHgzZTAwMDA4LCAweDAsIAorMHgyN2JkZmYzMCwgMHgyNDBhMDAwMSwgMHhhZmJmMDBjOCwgMHhhZmJlMDBjNCwgCisweGFmYjUwMGMwLCAweGFmYjMwMGJjLCAweGFmYjIwMGI4LCAweGFmYjEwMGI0LCAKKzB4YWZiMDAwYjAsIDB4YTNhMDAwOTcsIDB4YWZhMDAwNDQsIDB4YWZhYTAwNWMsIAorMHg5MzQyMDVjNCwgMHhhN2EwMDA4ZSwgMHgxMDQwMDAwYSwgMHhhN2EwMDA4NiwgCisweDhmNGIwMGM0LCAweGFmYWIwMDY0LCAweDhmNGEwMGMwLCAweGFmYWEwMDZjLCAKKzB4OGY0YjAwY2MsIDB4YWZhYjAwNzQsIDB4OGY0YTAwYzgsIDB4MTAwMDAxMjksIAorMHhhZmFhMDA3YywgMHg4ZjQyMDExNCwgMHg0MGY4MDksIDB4MCwgCisweDQwMzAyMSwgMHgxMGMwMDM0ZiwgMHgwLCAweDhjYzIwMDAwLCAKKzB4OGNjMzAwMDQsIDB4YWZhMjAwMjAsIDB4YWZhMzAwMjQsIDB4OGZhYjAwMjQsIAorMHg4ZmFhMDAyMCwgMHgzMTYyZmZmZiwgMHgyNDQyZmZmYywgMHhhZmEyMDA2YywgCisweDNjMDIwMDA2LCAweDJjMjEwMjQsIDB4YWZhYjAwN2MsIDB4MTQ0MDAwMTUsIAorMHhhZmFhMDA2NCwgMHg5MTQyMDAwMCwgMHgzMDQyMDAwMSwgMHgxMDQwMDAxMSwgCisweDI0MDJmZmZmLCAweDhkNDMwMDAwLCAweDE0NjIwMDA0LCAweDM0MDJmZmZmLCAKKzB4OTU0MzAwMDQsIDB4MTA2MjAwMGIsIDB4MCwgMHhjMDAyNGJiLCAKKzB4OGZhNDAwNjQsIDB4MzA0MjAwZmYsIDB4MTQ0MDAwMDYsIDB4MCwgCisweDhmNDIwMTE4LCAweDQwZjgwOSwgMHgwLCAweDEwMDAwMzJkLCAKKzB4MCwgMHg4ZmEyMDAyNCwgMHgzYzAzZmZiZiwgMHgzNDYzZmZmZiwgCisweDQzMTAyNCwgMHgzYzAzZmZmZiwgMHg0MzE4MjQsIDB4MTQ2MDAwMDMsIAorMHhhZmEyMDAyNCwgMHgxMDAwMDA0MCwgMHgxODIxLCAweDNjMDIwMDgwLCAKKzB4NjIxMDI0LCAweDEwNDAwMDA3LCAweDAsIDB4OGY0MjAzOGMsIAorMHgyNDQyMDAwMSwgMHhhZjQyMDM4YywgMHg4ZjQyMDM4YywgMHgxMDAwMDAzNiwgCisweDI0MDMwMDAxLCAweDhmNDIwMjEwLCAweDI0NDIwMDAxLCAweGFmNDIwMjEwLCAKKzB4OGY0MjAyMTAsIDB4M2MwMjAwMDEsIDB4NjIxMDI0LCAweDEwNDAwMDA2LCAKKzB4M2MwMjAwMDIsIDB4OGY0MjAxYzQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAxYzQsIAorMHg4ZjQyMDFjNCwgMHgzYzAyMDAwMiwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsIAorMHgzYzAyMDAwNCwgMHg4ZjQyMDM3YywgMHgyNDQyMDAwMSwgMHhhZjQyMDM3YywgCisweDhmNDIwMzdjLCAweDNjMDIwMDA0LCAweDYyMTAyNCwgMHgxMDQwMDAwNiwgCisweDNjMDIwMDA4LCAweDhmNDIwMzgwLCAweDI0NDIwMDAxLCAweGFmNDIwMzgwLCAKKzB4OGY0MjAzODAsIDB4M2MwMjAwMDgsIDB4NjIxMDI0LCAweDEwNDAwMDA2LCAKKzB4M2MwMjAwMTAsIDB4OGY0MjAzODQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzODQsIAorMHg4ZjQyMDM4NCwgMHgzYzAyMDAxMCwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsIAorMHgzYzAyMDAyMCwgMHg4ZjQyMDFjMCwgMHgyNDQyMDAwMSwgMHhhZjQyMDFjMCwgCisweDhmNDIwMWMwLCAweDNjMDIwMDIwLCAweDYyMTAyNCwgMHgxMDQwMDAwNiwgCisweDI0MDMwMDAxLCAweDhmNDIwMzg4LCAweDI0NDIwMDAxLCAweGFmNDIwMzg4LCAKKzB4OGY0MjAzODgsIDB4MjQwMzAwMDEsIDB4OGMwMjAyNjAsIDB4OGZhYjAwNmMsIAorMHg0YjEwMmIsIDB4MTA0MDAwMTQsIDB4MzA3MDAwZmYsIDB4OGY0MjAxZTgsIAorMHgyNDQyMDAwMSwgMHhhZjQyMDFlOCwgMHg4ZjQyMDFlOCwgMHg4ZmFhMDA3YywgCisweDhmODIwMGUwLCAweDM1NGEwMTAwLCAweGFmYWEwMDdjLCAweGFmYTIwMDEwLCAKKzB4OGY4MjAwZTQsIDB4MjQxMDAwMDEsIDB4M2MwNDAwMDEsIDB4MjQ4NDY4YTAsIAorMHhhZmEyMDAxNCwgMHg4ZmE2MDAyMCwgMHg4ZmE3MDAyNCwgMHgzYzA1MDAwNywgCisweGMwMDJiM2IsIDB4MzRhNTA4MDAsIDB4MTIwMDAwMTAsIDB4M2MwMjAwODAsIAorMHgyYzIxMDI0LCAweDE0NDAwMDBlLCAweDMyYzIwNDAwLCAweDhmYWIwMDdjLCAKKzB4M2MwMjAwODAsIDB4MzQ0MjAxMDAsIDB4MTYyMTAyNCwgMHgxMDQwMDAwNSwgCisweDAsIDB4OGY0MjAyMGMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyMGMsIAorMHg4ZjQyMDIwYywgMHgxMDAwMDJiMCwgMHg4ZmEzMDA2YywgMHgzMmMyMDQwMCwgCisweDEwNDAwMDE1LCAweDM0MDI4MTAwLCAweDhmYWEwMDY0LCAweDk1NDMwMDBjLCAKKzB4MTQ2MjAwMTIsIDB4M2MwMjAxMDAsIDB4MjQwYjAyMDAsIDB4YTdhYjAwOGUsIAorMHg5NTQyMDAwZSwgMHg4ZDQzMDAwOCwgMHg4ZDQ0MDAwNCwgMHg4ZDQ1MDAwMCwgCisweDhmYWEwMDZjLCAweDhmYWIwMDY0LCAweDI1NGFmZmZjLCAweGFmYWEwMDZjLCAKKzB4YTdhMjAwODYsIDB4YWQ2MzAwMGMsIDB4YWQ2NDAwMDgsIDB4YWQ2NTAwMDQsIAorMHgyNTZiMDAwNCwgMHhhZmFiMDA2NCwgMHgzYzAyMDEwMCwgMHgyYzIxMDI0LCAKKzB4MTA0MDAwMDQsIDB4MCwgMHg4ZmFhMDA2YywgMHgyNTRhMDAwNCwgCisweGFmYWEwMDZjLCAweDhmNDIwMGJjLCAweDUwNDAwMDBhLCAweGFmYTAwMDc0LCAKKzB4OGZhYjAwNmMsIDB4NGIxMDJiLCAweDUwNDAwMDA2LCAweGFmYTAwMDc0LCAKKzB4OGY0MjAwYmMsIDB4MTYyMTAyMywgMHhhZmEyMDA3NCwgMHg4ZjRhMDBiYywgCisweGFmYWEwMDZjLCAweDhmNDIwMDgwLCAweDhmYWIwMDZjLCAweDRiMTAyYiwgCisweDEwNDAwMDU2LCAweDMyYzI4MDAwLCAweDEwNDAwMDVlLCAweDI0MGEwMDAzLCAKKzB4MzJjMjEwMDAsIDB4MTA0MDAwNWIsIDB4YWZhYTAwNWMsIDB4MTAwMDAwNTgsIAorMHgyNDBiMDAwNCwgMHg4ZjQyMDM1MCwgMHgyNDAzZmZiZiwgMHgyODNhMDI0LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAzNTAsIDB4MTAwMDAyNGYsIDB4OGY0MjAzNTAsIAorMHgyYzJiMDI1LCAweDI0MDJmZmJmLCAweDI4MmEwMjQsIDB4OGY4MzAxMjgsIAorMHgzYzA0MDAwMSwgMHgyNDg0NjhkMCwgMHgyNjYyMDAwMSwgMHhhZmEyMDAxNCwgCisweGFmYTMwMDEwLCAweDhmODYwMTIwLCAweDhmODcwMTI0LCAweDNjMDUwMDA3LCAKKzB4YzAwMmIzYiwgMHgzNGE1MjI1MCwgMHgxMDAwMDIzZiwgMHgwLCAKKzB4MmMyYjAyNSwgMHgyNDAyZmZiZiwgMHgyODJhMDI0LCAweDhmODMwMTI4LCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDY4ZDAsIDB4MjQwMjAwMDIsIDB4YWZhMjAwMTQsIAorMHhhZmEzMDAxMCwgMHg4Zjg2MDEyMCwgMHg4Zjg3MDEyNCwgMHgzYzA1MDAwNywgCisweGMwMDJiM2IsIDB4MzRhNTI0NTAsIDB4MTAwMDAyMmYsIDB4MCwgCisweDhlYTIwMDAwLCAweDhlYTMwMDA0LCAweDNjMDQwMDAxLCAweDI0ODQ2OGU4LCAKKzB4YWZiMDAwMTAsIDB4YWZiZTAwMTQsIDB4OGVhNzAwMTgsIDB4MzRhNTI4MDAsIAorMHhjMDAyYjNiLCAweDYwMzAyMSwgMHgxMDAwMDIyMywgMHgwLCAKKzB4YTZiMTAwMGEsIDB4OGY4MjAxMjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDY4ZjAsIAorMHhhZmJlMDAxNCwgMHhhZmEyMDAxMCwgMHg4ZjQ2MDA0NCwgMHg4Zjg3MDEyMCwgCisweDNjMDUwMDA3LCAweGMwMDJiM2IsIDB4MzRhNTMwMDAsIDB4MTAwMDAyMTYsIAorMHgwLCAweGE2YjEwMDBhLCAweGE2YjIwMDBlLCAweDhmODIwMTI0LCAKKzB4M2MwNDAwMDEsIDB4MjQ4NDY4ZmMsIDB4YWZiZTAwMTQsIDB4YWZhMjAwMTAsIAorMHg4ZjQ2MDA0NCwgMHg4Zjg3MDEyMCwgMHgzYzA1MDAwNywgMHhjMDAyYjNiLCAKKzB4MzRhNTMyMDAsIDB4MTAwMDAyMDgsIDB4MCwgMHg4ZjQyMDA4NCwgCisweDhmYWEwMDZjLCAweDRhMTAyYiwgMHgxNDQwMDAwNywgMHgzYzAyMDAwMSwgCisweDJjMjEwMjQsIDB4MTA0MDAwMDQsIDB4MCwgMHgyNDBiMDAwMiwgCisweGFmYWIwMDVjLCAweDhmYWEwMDZjLCAweDExNDAwMjFiLCAweDI3YWIwMDIwLCAKKzB4YWZhYjAwYTQsIDB4M2MwYTAwMWYsIDB4MzU0YWZmZmYsIDB4YWZhYTAwOWMsIAorMHg4ZmFiMDA1YywgMHgyNDBhMDAwMSwgMHg1NTZhMDAyMSwgMHgyNDBhMDAwMiwgCisweDhmNDMwMDU0LCAweDhmNDIwMDUwLCAweDEwNjIwMDBiLCAweDI3NGIwMDU0LCAKKzB4OGY1ZTAwNTQsIDB4MzQwM2VjYzAsIDB4YWZhYjAwNGMsIDB4MjdjMjAwMDEsIAorMHgzMDQyMDFmZiwgMHhhZmEyMDA1NCwgMHgxZTExNDAsIDB4NDMxMDIxLCAKKzB4MTAwMDAwNmIsIDB4MmUyYTgyMSwgMHg4ZjQyMDA0NCwgMHg4ZmFhMDA2YywgCisweDNjMDQwMDAxLCAweDI0ODQ2OGFjLCAweGFmYWEwMDE0LCAweGFmYTIwMDEwLCAKKzB4OGY0NjAwNTQsIDB4OGY0NzAwNTAsIDB4M2MwNTAwMDcsIDB4YzAwMmIzYiwgCisweDM0YTUxMzAwLCAweDhmNDMwMzUwLCAweDI0MDJmZmJmLCAweDI4MmEwMjQsIAorMHgyNDYzMDAwMSwgMHhhZjQzMDM1MCwgMHgxMDAwMDFkMywgMHg4ZjQyMDM1MCwgCisweDE1NmEwMDFkLCAweDAsIDB4OGY0MzAwNzQsIDB4OGY0MjAwNzAsIAorMHgxMDYyMDAwYSwgMHgyNzRiMDA3NCwgMHg4ZjVlMDA3NCwgMHhhZmFiMDA0YywgCisweDI3YzIwMDAxLCAweDMwNDIwM2ZmLCAweGFmYTIwMDU0LCAweDFlMTE0MCwgCisweDI0NDI2Y2MwLCAweDEwMDAwMDRhLCAweDJlMmE4MjEsIDB4OGY0MjAwNDQsIAorMHg4ZmFhMDA2YywgMHgzYzA0MDAwMSwgMHgyNDg0NjhiOCwgMHgzYzA1MDAwNywgCisweGFmYWEwMDE0LCAweGFmYTIwMDEwLCAweDhmNDYwMDc0LCAweDhmNDcwMDcwLCAKKzB4MzRhNTE1MDAsIDB4MjQwYjAwMDEsIDB4YzAwMmIzYiwgMHhhZmFiMDA1YywgCisweDEwMDBmZmMzLCAweDAsIDB4OGY0MzAwNjQsIDB4OGY0MjAwNjAsIAorMHgxMDYyMDAxYSwgMHgyNzRhMDA2NCwgMHg4ZjVlMDA2NCwgMHg4ZmFiMDA1YywgCisweGFmYWEwMDRjLCAweDI3YzIwMDAxLCAweDMwNDIwMGZmLCAweGFmYTIwMDU0LCAKKzB4MjQwMjAwMDQsIDB4MTU2MjAwMGUsIDB4MWUxMTQwLCAweDFlMTE4MCwgCisweDI0NDIwY2MwLCAweDJlMjEwMjEsIDB4YWZhMjAwNDQsIDB4OTQ0MjAwMmEsIAorMHg4ZmFhMDA0NCwgMHg4ZmFiMDA2YywgMHg0YjEwMmIsIDB4MTA0MDAwMjQsIAorMHgyNTU1MDAyMCwgMHgyNDBhMDAwMSwgMHgxMDAwMDAyMSwgMHhhM2FhMDA5NywgCisweDI0NDI0Y2MwLCAweDEwMDAwMDFlLCAweDJlMmE4MjEsIDB4OGY0MjAwNDQsIAorMHg4ZmFiMDA2YywgMHgzYzA0MDAwMSwgMHgyNDg0NjhjNCwgMHhhZmFiMDAxNCwgCisweGFmYTIwMDEwLCAweDhmNDYwMDY0LCAweDhmNDcwMDYwLCAweDNjMDUwMDA3LCAKKzB4YzAwMmIzYiwgMHgzNGE1MTgwMCwgMHgzYzAyMDAwOCwgMHgyYzIxMDI0LCAKKzB4MTQ0MGZmMzQsIDB4MCwgMHg4ZjQyMDM3MCwgMHgyNDBhMDAwMSwgCisweGFmYWEwMDVjLCAweDI0NDIwMDAxLCAweGFmNDIwMzcwLCAweDEwMDBmZjkwLCAKKzB4OGY0MjAzNzAsIDB4MjdhMzAwMzYsIDB4MTMxMDQwLCAweDYyMTgyMSwgCisweDk0NjIwMDAwLCAweDQ0MTAyMSwgMHgxMDAwMDAyMCwgMHhhNDYyMDAwMCwgCisweDhmYWIwMDY0LCAweGFlYWIwMDE4LCAweDkzYTIwMDk3LCAweDEwNDAwMDcyLCAKKzB4OTgyMSwgMHg4ZmFhMDA0NCwgMHg4ZmE0MDA2YywgMHg4ZmEzMDBhNCwgCisweDI1NDIwMDIwLCAweGFmYTIwMDI4LCAweDI1NDIwMDA4LCAweGFmYTIwMDMwLCAKKzB4MjU0MjAwMTAsIDB4YWZhYTAwMmMsIDB4YWZhMjAwMzQsIDB4OTU0MjAwMmEsIAorMHhhN2EyMDAzOCwgMHg5NTQyMDAxOCwgMHhhN2EyMDAzYSwgMHg5NTQyMDAxYSwgCisweGE3YTIwMDNjLCAweDk1NDIwMDFjLCAweGE3YTIwMDNlLCAweDk0NjIwMDE4LCAKKzB4MjQ2MzAwMDIsIDB4ODIyMDIzLCAweDE4ODBmZmRlLCAweDI2NzMwMDAxLCAKKzB4MmU2MjAwMDQsIDB4MTQ0MGZmZjksIDB4MCwgMHg4ZjQyMDBmYywgCisweDI2NjUwMDAxLCAweGEyMTAyYSwgMHgxNDQwMDAyYiwgMHgyNDAzMDAwMSwgCisweDhmODMwMTJjLCAweDEwNjAwMDIzLCAweDAsIDB4OGY4MjAxMjQsIAorMHg0MzEwMjMsIDB4MjIxNDMsIDB4NTg4MDAwMDEsIDB4MjQ4NDAwNDAsIAorMHg4ZjgyMDEyOCwgMHg0MzEwMjMsIDB4MjE5NDMsIDB4NTg2MDAwMDEsIAorMHgyNDYzMDA0MCwgMHg2NDEwMmEsIDB4NTQ0MDAwMDEsIDB4NjAyMDIxLCAKKzB4YWY0NDAwZmMsIDB4OGY0MjAwZmMsIDB4YTIxMDJhLCAweDEwNDAwMDExLCAKKzB4MjQwMzAwMDEsIDB4MTAwMDAwMTUsIDB4MzA2MjAwZmYsIDB4OGZhYjAwNjQsIAorMHg5NjA3MDAxOCwgMHhhZmFiMDAxMCwgMHg4ZTIyMDAwOCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2OGRjLCAweDhjNDMwMDA0LCAweDhjNDIwMDAwLCAweDM0YTUyNDAwLCAKKzB4MjQwMzAyMSwgMHhjMDAyYjNiLCAweGFmYTMwMDE0LCAweDEwMDAwMDJiLCAKKzB4MCwgMHg4ZjQyMDMzNCwgMHgxODIxLCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzMzQsIDB4OGY0MjAzMzQsIDB4MzA2MjAwZmYsIDB4NTA0MGZlZGMsIAorMHgzYzAyMDgwMCwgMHgxMjYwMDAyMSwgMHg5MDIxLCAweDhmYjEwMGE0LCAKKzB4MjIwODAyMSwgMHg4ZTIyMDAwOCwgMHg5NjA3MDAxOCwgMHg4ZmE2MDA2NCwgCisweDhjNDQwMDAwLCAweDhjNDUwMDA0LCAweDI0MGEwMDAxLCAweGFmYWEwMDEwLCAKKzB4YWZiZTAwMTQsIDB4OGY0MjAwMDgsIDB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsIAorMHg0MGY4MDksIDB4MCwgMHgxMDQwZmZkOCwgMHgzYzA1MDAwNywgCisweDk2MDIwMDE4LCAweDhmYWIwMDY0LCAweDhmYWEwMDljLCAweDE2MjU4MjEsIAorMHgxNGIxMDJiLCAweDEwNDAwMDA0LCAweGFmYWIwMDY0LCAweDhmNDIwMTQ4LCAKKzB4MTYyNTgyMywgMHhhZmFiMDA2NCwgMHgyNjEwMDAwMiwgMHgyNjUyMDAwMSwgCisweDI1MzEwMmIsIDB4MTQ0MGZmZTMsIDB4MjYzMTAwMDQsIDB4OGZiMDAwNmMsIAorMHgxMDAwMDAzNiwgMHg5N2IxMDAzOCwgMHg4ZjQyMDBmYywgMHgyNDA1MDAwMiwgCisweGEyMTAyYSwgMHgxNDQwMDAxYiwgMHgyNDAzMDAwMSwgMHg4ZjgzMDEyYywgCisweDEwNjAwMDEzLCAweDAsIDB4OGY4MjAxMjQsIDB4NDMxMDIzLCAKKzB4MjIxNDMsIDB4NTg4MDAwMDEsIDB4MjQ4NDAwNDAsIDB4OGY4MjAxMjgsIAorMHg0MzEwMjMsIDB4MjE5NDMsIDB4NTg2MDAwMDEsIDB4MjQ2MzAwNDAsIAorMHg2NDEwMmEsIDB4NTQ0MDAwMDEsIDB4NjAyMDIxLCAweGFmNDQwMGZjLCAKKzB4OGY0MjAwZmMsIDB4YTIxMDJhLCAweDE0NDAwMDA2LCAweDI0MDMwMDAxLCAKKzB4OGY0MjAzMzQsIDB4MTgyMSwgMHgyNDQyMDAwMSwgMHhhZjQyMDMzNCwgCisweDhmNDIwMzM0LCAweDMwNjIwMGZmLCAweDEwNDBmZWE1LCAweDNjMDIwODAwLCAKKzB4OTZiMTAwMGEsIDB4OGZiMDAwNmMsIDB4MzIyM2ZmZmYsIDB4NzAxMDJiLCAKKzB4NTQ0MDAwMDEsIDB4NjA4MDIxLCAweDhlYTQwMDAwLCAweDhlYTUwMDA0LCAKKzB4MjQwYjAwMDEsIDB4YWZhYjAwMTAsIDB4YWZiZTAwMTQsIDB4OGY0MjAwMDgsIAorMHg4ZmE2MDA2NCwgMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywgMHg0MGY4MDksIAorMHgyMDAzODIxLCAweDEwNDBmZWEyLCAweDNjMDUwMDA3LCAweDk2YTMwMDBlLCAKKzB4OTdhYTAwOGUsIDB4MTE0MDAwMDcsIDB4NjA5MDIxLCAweDkzNDIwNWM0LCAKKzB4MTQ0MDAwMDQsIDB4MCwgMHg5N2FiMDA4NiwgMHg2YTE4MjUsIAorMHhhNmFiMDAxNiwgMHg4ZmFhMDA3YywgMHgzYzAyZmZmZiwgMHgxNDIxMDI0LCAKKzB4MTA0MDAwMDMsIDB4YTE0MDIsIDB4MzQ2MzA0MDAsIDB4YTZhMjAwMTQsIAorMHg4ZmFiMDA2YywgMHg1NjBiMDA3MiwgMHhhNmEzMDAwZSwgMHgzNDYyMDAwNCwgCisweGE2YTIwMDBlLCAweDhmYWEwMDc0LCAweDE2YTEwMjEsIDB4YTZhMjAwMGEsIAorMHg4ZjQzMDA0NCwgMHg4ZjQ0MDFhMCwgMHg4ZjQ1MDFhNCwgMHgzNDAyODAwMCwgCisweGFmYTIwMDEwLCAweDhmNDIwMDQ0LCAweDJhMDMwMjEsIDB4MjQwNzAwMjAsIAorMHhhZmEyMDAxNCwgMHg4ZjQyMDAwYywgMHgzMTk0MCwgMHg2MDQ4MjEsIAorMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywgMHg0MDIxLCAweGE5MjgyMSwgCisweGE5MTgyYiwgMHg4ODIwMjEsIDB4NDBmODA5LCAweDgzMjAyMSwgCisweDUwNDBmZTdmLCAweGE2YjIwMDBlLCAweDhmNDIwMzY4LCAweGFmYTAwMDZjLCAKKzB4YTM0MDA1YzQsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNjgsIDB4OGZhYjAwNWMsIAorMHgyNDBhMDAwMSwgMHg4ZjQyMDM2OCwgMHgxNTZhMDAwNiwgMHgyNDBhMDAwMiwgCisweDhmNDIwMzVjLCAweDI0NDJmZmZmLCAweGFmNDIwMzVjLCAweDEwMDAwMDBjLCAKKzB4OGY0MjAzNWMsIDB4MTU2YTAwMDYsIDB4MCwgMHg4ZjQyMDM2NCwgCisweDI0NDJmZmZmLCAweGFmNDIwMzY0LCAweDEwMDAwMDA1LCAweDhmNDIwMzY0LCAKKzB4OGY0MjAzNjAsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNjAsIDB4OGY0MjAzNjAsIAorMHg4ZmFhMDA1NCwgMHg4ZmFiMDA0YywgMHhhZDZhMDAwMCwgMHg4ZjQyMDA0NCwgCisweDhmNDQwMDg4LCAweDhmNDMwMDc4LCAweDI0NDIwMDAxLCAweDQ0MTAyNCwgCisweDI0NjMwMDAxLCAweGFmNDIwMDQ0LCAweGFmNDMwMDc4LCAweDhjMDIwMjQwLCAKKzB4NjIxODJiLCAweDE0NjAwMDc1LCAweDI0MDcwMDA4LCAweDhmNDQwMTY4LCAKKzB4OGY0NTAxNmMsIDB4OGY0MzAwNDQsIDB4OGY0ODAwMGMsIDB4OGY4NjAxMjAsIAorMHgyNDAyMDA0MCwgMHhhZmEyMDAxMCwgMHhhZmEzMDAxNCwgMHhhZmE4MDAxOCwgCisweDhmNDIwMTBjLCAweDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxNDQwMDAxMSwgCisweDI0MGIwMDAxLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDJiNDBmMiwgCisweDhmODIwMTI0LCAweGFmYTIwMDEwLCAweDhmODIwMTI4LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDY4OGMsIDB4YWZhMjAwMTQsIDB4OGY0NjAwNDQsIDB4OGY4NzAxMjAsIAorMHgzYzA1MDAwOSwgMHhjMDAyYjNiLCAweDM0YTUxMzAwLCAweDEwMDAwMDBiLCAKKzB4MCwgMHg4ZjQyMDMwNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwNCwgCisweDhmNDIwMzA0LCAweDhmNDIwMDQ0LCAweGFmNDIwMDdjLCAweDNjMDEwMDAxLCAKKzB4MzcwODIxLCAweGEwMjA0MGYyLCAweGFmNDAwMDc4LCAweDhmNDIwMzE4LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAzMTgsIDB4MTAwMDAwNDgsIDB4OGY0MjAzMTgsIAorMHhhNmIwMDAwYSwgMHg4ZjQzMDA0NCwgMHg4ZjQ0MDFhMCwgMHg4ZjQ1MDFhNCwgCisweDM0MDI4MDAwLCAweGFmYTIwMDEwLCAweDhmNDIwMDQ0LCAweDJhMDMwMjEsIAorMHgyNDA3MDAyMCwgMHhhZmEyMDAxNCwgMHg4ZjQyMDAwYywgMHgzMTk0MCwgCisweDYwNDgyMSwgMHhhZmEyMDAxOCwgMHg4ZjQyMDEwYywgMHg0MDIxLCAKKzB4YTkyODIxLCAweGE5MTgyYiwgMHg4ODIwMjEsIDB4NDBmODA5LCAKKzB4ODMyMDIxLCAweDEwNDBmZTFmLCAweDI0MGEwMDAxLCAweGEzNGEwNWM0LCAKKzB4OGZhYjAwNmMsIDB4OGZhYTAwNjQsIDB4MTcwNTgyMywgMHhhZmFiMDA2YywgCisweDhmYWIwMDljLCAweDE1MDUwMjEsIDB4MTZhMTAyYiwgMHgxMDQwMDAwNCwgCisweGFmYWEwMDY0LCAweDhmNDIwMTQ4LCAweDE0MjUwMjMsIDB4YWZhYTAwNjQsIAorMHg4ZjQyMDM2OCwgMHgyNDQyZmZmZiwgMHhhZjQyMDM2OCwgMHg4ZmFhMDA1YywgCisweDI0MGIwMDAxLCAweDhmNDIwMzY4LCAweDE1NGIwMDA2LCAweDI0MGIwMDAyLCAKKzB4OGY0MjAzNWMsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNWMsIDB4MTAwMDAwMGMsIAorMHg4ZjQyMDM1YywgMHgxMTRiMDAwNiwgMHgwLCAweDhmNDIwMzYwLCAKKzB4MjQ0MmZmZmYsIDB4YWY0MjAzNjAsIDB4MTAwMDAwMDUsIDB4OGY0MjAzNjAsIAorMHg4ZjQyMDM2NCwgMHgyNDQyZmZmZiwgMHhhZjQyMDM2NCwgMHg4ZjQyMDM2NCwgCisweDhmYWIwMDU0LCAweDhmYWEwMDRjLCAweGFkNGIwMDAwLCAweDhmNDIwMDQ0LCAKKzB4OGY0NDAwODgsIDB4OGY0MzAwNzgsIDB4MjQ0MjAwMDEsIDB4NDQxMDI0LCAKKzB4MjQ2MzAwMDEsIDB4YWY0MjAwNDQsIDB4YWY0MzAwNzgsIDB4OGZhYTAwNmMsIAorMHgxNTQwZmUwYiwgMHgwLCAweDhmYWIwMDZjLCAweDExNjAwMDFlLCAKKzB4MCwgMHg5MzQyMDVjNCwgMHgxMDQwMDAwOSwgMHgwLCAKKzB4OGZhYTAwNjQsIDB4YWY0YTAwYzQsIDB4YWY0YjAwYzAsIDB4OGZhYjAwN2MsIAorMHhhZjRiMDBjOCwgMHg4ZmFhMDA3NCwgMHgxMDAwMDAwZSwgMHhhZjRhMDBjYywgCisweDk3YWIwMDhlLCAweDExNjAwMDBiLCAweDM0MDM4MTAwLCAweDhmYTIwMDIwLCAKKzB4OGM0NjAwMGMsIDB4YTQ0MzAwMGMsIDB4OTdhYTAwODYsIDB4OGM0NDAwMDQsIAorMHg4YzQ1MDAwOCwgMHhhNDRhMDAwZSwgMHhhYzQ0MDAwMCwgMHhhYzQ1MDAwNCwgCisweGFjNDYwMDA4LCAweDhmNDIwMzRjLCAweDI0NDIwMDAxLCAweGFmNDIwMzRjLCAKKzB4MTAwMDAwMTAsIDB4OGY0MjAzNGMsIDB4OGZhYjAwN2MsIDB4MzE2NGZmZmYsIAorMHgyNDg0ZmZmYywgMHg4MDE4MjEsIDB4OGY0NDAyNTAsIDB4OGY0NTAyNTQsIAorMHg4ZjQ2MDExOCwgMHgxMDIxLCAweGEzMjgyMSwgMHhhMzM4MmIsIAorMHg4MjIwMjEsIDB4ODcyMDIxLCAweGFmNDQwMjUwLCAweGMwZjgwOSwgCisweGFmNDUwMjU0LCAweDhmYmYwMGM4LCAweDhmYmUwMGM0LCAweDhmYjUwMGMwLCAKKzB4OGZiMzAwYmMsIDB4OGZiMjAwYjgsIDB4OGZiMTAwYjQsIDB4OGZiMDAwYjAsIAorMHgzZTAwMDA4LCAweDI3YmQwMGQwLCAweDNlMDAwMDgsIDB4MCwgCisweDI3YmRmZjM4LCAweDI0MGIwMDAxLCAweGFmYmYwMGMwLCAweGFmYmUwMGJjLCAKKzB4YWZiNTAwYjgsIDB4YWZiMzAwYjQsIDB4YWZiMjAwYjAsIDB4YWZiMTAwYWMsIAorMHhhZmIwMDBhOCwgMHhhM2EwMDA4NywgMHhhZmEwMDA0NCwgMHhhZmFiMDA1YywgCisweDkzNDIwNWM0LCAweGE3YTAwMDc2LCAweDEwNDAwMDA3LCAweGE3YTAwMDdlLCAKKzB4OGY0YzAwYzAsIDB4YWZhYzAwNjQsIDB4OGY0YjAwYzgsIDB4OGY1ZTAwYzQsIAorMHgxMDAwMDEzMCwgMHhhZmFiMDA2YywgMHg4ZjQyMDExNCwgMHg0MGY4MDksIAorMHgwLCAweDQwMzAyMSwgMHgxMGMwMDJhMSwgMHgwLCAKKzB4OGNjMjAwMDAsIDB4OGNjMzAwMDQsIDB4YWZhMjAwMjAsIDB4YWZhMzAwMjQsIAorMHg4ZmFjMDAyNCwgMHg4ZmJlMDAyMCwgMHgzMTgyZmZmZiwgMHgyNDQyZmZmYywgCisweGFmYTIwMDY0LCAweDNjMDIwMDA2LCAweDJjMjEwMjQsIDB4MTQ0MDAwMTUsIAorMHhhZmFjMDA2YywgMHg5M2MyMDAwMCwgMHgzMDQyMDAwMSwgMHgxMDQwMDAxMSwgCisweDI0MDJmZmZmLCAweDhmYzMwMDAwLCAweDE0NjIwMDA0LCAweDM0MDJmZmZmLCAKKzB4OTdjMzAwMDQsIDB4MTA2MjAwMGIsIDB4MCwgMHhjMDAyNGJiLCAKKzB4M2MwMjAyMSwgMHgzMDQyMDBmZiwgMHgxNDQwMDAwNiwgMHgwLCAKKzB4OGY0MjAxMTgsIDB4NDBmODA5LCAweDAsIDB4MTAwMDAyODAsIAorMHgwLCAweDhmYTIwMDI0LCAweDNjMDNmZmJmLCAweDM0NjNmZmZmLCAKKzB4NDMxMDI0LCAweDNjMDNmZmZmLCAweDQzMTgyNCwgMHgxNDYwMDAwMywgCisweGFmYTIwMDI0LCAweDEwMDAwMDQwLCAweDgwMjEsIDB4M2MwMjAwODAsIAorMHg2MjEwMjQsIDB4MTA0MDAwMDcsIDB4MCwgMHg4ZjQyMDM4YywgCisweDI0NDIwMDAxLCAweGFmNDIwMzhjLCAweDhmNDIwMzhjLCAweDEwMDAwMDM2LCAKKzB4MjQxMDAwMDEsIDB4OGY0MjAyMTAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAyMTAsIAorMHg4ZjQyMDIxMCwgMHgzYzAyMDAwMSwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsIAorMHgzYzAyMDAwMiwgMHg4ZjQyMDFjNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDFjNCwgCisweDhmNDIwMWM0LCAweDNjMDIwMDAyLCAweDYyMTAyNCwgMHgxMDQwMDAwNiwgCisweDNjMDIwMDA0LCAweDhmNDIwMzdjLCAweDI0NDIwMDAxLCAweGFmNDIwMzdjLCAKKzB4OGY0MjAzN2MsIDB4M2MwMjAwMDQsIDB4NjIxMDI0LCAweDEwNDAwMDA2LCAKKzB4M2MwMjAwMDgsIDB4OGY0MjAzODAsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzODAsIAorMHg4ZjQyMDM4MCwgMHgzYzAyMDAwOCwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsIAorMHgzYzAyMDAxMCwgMHg4ZjQyMDM4NCwgMHgyNDQyMDAwMSwgMHhhZjQyMDM4NCwgCisweDhmNDIwMzg0LCAweDNjMDIwMDEwLCAweDYyMTAyNCwgMHgxMDQwMDAwNiwgCisweDNjMDIwMDIwLCAweDhmNDIwMWMwLCAweDI0NDIwMDAxLCAweGFmNDIwMWMwLCAKKzB4OGY0MjAxYzAsIDB4M2MwMjAwMjAsIDB4NjIxMDI0LCAweDEwNDAwMDA2LCAKKzB4MjQxMDAwMDEsIDB4OGY0MjAzODgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzODgsIAorMHg4ZjQyMDM4OCwgMHgyNDEwMDAwMSwgMHg4YzAyMDI2MCwgMHg4ZmFiMDA2NCwgCisweDRiMTAyYiwgMHgxMDQwMDAxNSwgMHgzMjAyMDBmZiwgMHg4ZjQyMDFlOCwgCisweDI0NDIwMDAxLCAweGFmNDIwMWU4LCAweDhmNDIwMWU4LCAweDhmYWMwMDZjLCAKKzB4OGY4MjAwZTAsIDB4MzU4YzAxMDAsIDB4YWZhYzAwNmMsIDB4YWZhMjAwMTAsIAorMHg4ZjgyMDBlNCwgMHgyNDEwMDAwMSwgMHgzYzA0MDAwMSwgMHgyNDg0NjhhMCwgCisweGFmYTIwMDE0LCAweDhmYTYwMDIwLCAweDhmYTcwMDI0LCAweDNjMDUwMDA3LCAKKzB4YzAwMmIzYiwgMHgzNGE1MzYwMCwgMHgzMjAyMDBmZiwgMHgxMDQwMDAxMCwgCisweDNjMDIwMDgwLCAweDJjMjEwMjQsIDB4MTQ0MDAwMGUsIDB4MzJjMjA0MDAsIAorMHg4ZmFiMDA2YywgMHgzYzAyMDA4MCwgMHgzNDQyMDEwMCwgMHgxNjIxMDI0LCAKKzB4MTA0MDAwMDUsIDB4MCwgMHg4ZjQyMDIwYywgMHgyNDQyMDAwMSwgCisweGFmNDIwMjBjLCAweDhmNDIwMjBjLCAweDEwMDAwMjAyLCAweDhmYTMwMDY0LCAKKzB4MzJjMjA0MDAsIDB4MTA0MDAwMTIsIDB4MzQwMjgxMDAsIDB4OTdjMzAwMGMsIAorMHgxNDYyMDAwZiwgMHgwLCAweDI0MGMwMjAwLCAweGE3YWMwMDc2LCAKKzB4OTdjMjAwMGUsIDB4OGZjMzAwMDgsIDB4OGZjNDAwMDQsIDB4OGZhYjAwNjQsIAorMHg4ZmM1MDAwMCwgMHgyNTZiZmZmYywgMHhhZmFiMDA2NCwgMHhhN2EyMDA3ZSwgCisweGFmYzMwMDBjLCAweGFmYzQwMDA4LCAweGFmYzUwMDA0LCAweDI3ZGUwMDA0LCAKKzB4OGZhNzAwNjQsIDB4MzIwMjAwZmYsIDB4MTQ0MDAwMzQsIDB4M2MwMjAxMDAsIAorMHg5N2M0MDAwYywgMHgyYzgzMDVkZCwgMHgzODgyODg3MCwgMHgyYzQyMDAwMSwgCisweDYyMTgyNSwgMHgxMDYwMDAxNSwgMHgyODIxLCAweDMyYzIwODAwLCAKKzB4MTA0MDAwMTUsIDB4MjQwMjA4MDAsIDB4OTdjMzAwMTQsIDB4MTQ2MjAwMTIsIAorMHgzNDAyYWFhYSwgMHg5N2MzMDAwZSwgMHgxNDYyMDAwNywgMHgyMDIxLCAKKzB4OTdjMzAwMTAsIDB4MjQwMjAzMDAsIDB4MTQ2MjAwMDQsIDB4ODAxMDIxLCAKKzB4OTdjMjAwMTIsIDB4MmM0NDAwMDEsIDB4ODAxMDIxLCAweDU0NDAwMDA2LCAKKzB4MjQwNTAwMTYsIDB4MTAwMDAwMDQsIDB4MCwgMHgyNDAyMDgwMCwgCisweDUwODIwMDAxLCAweDI0MDUwMDBlLCAweDEwYTAwMDEzLCAweDNjNTIwMjEsIAorMHgyNDgzMDAwOSwgMHgzYzAyMDAxZiwgMHgzNDQyZmZmZiwgMHg0MzEwMmIsIAorMHgxMDQwMDAwMywgMHgwLCAweDhmNDIwMTQ4LCAweDYyMTgyMywgCisweDkwNjIwMDAwLCAweDM4NDMwMDA2LCAweDJjNjMwMDAxLCAweDM4NDIwMDExLCAKKzB4MmM0MjAwMDEsIDB4NjIxODI1LCAweDEwNjAwMDA0LCAweDNjMDIwMTAwLCAKKzB4OTQ4MjAwMDIsIDB4NDUzODIxLCAweDNjMDIwMTAwLCAweDJjMjEwMjQsIAorMHg1MDQwMDAwZSwgMHhhZmE3MDA2NCwgMHg4ZmFjMDA2NCwgMHgxMGVjMDAwOCwgCisweDNjMDUwMDA3LCAweDNjMDQwMDAxLCAweDI0ODQ2OTA4LCAweDhmYTYwMDY0LCAKKzB4MzRhNTQwMDAsIDB4YWZhMDAwMTAsIDB4YzAwMmIzYiwgMHhhZmEwMDAxNCwgCisweDhmYWIwMDY0LCAweDI1NmIwMDA0LCAweGFmYWIwMDY0LCAweDhmNDIwMDgwLCAKKzB4OGZhYzAwNjQsIDB4NGMxMDJiLCAweDEwNDAwMDJjLCAweDMyYzI4MDAwLCAKKzB4MTA0MDAwMzQsIDB4MjQwYjAwMDMsIDB4MzJjMjEwMDAsIDB4MTA0MDAwMzEsIAorMHhhZmFiMDA1YywgMHgxMDAwMDAyZSwgMHgyNDBjMDAwNCwgMHg4ZjQyMDM1MCwgCisweDI0MDNmZmJmLCAweDI4M2EwMjQsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzNTAsIAorMHgxMDAwMDE3MywgMHg4ZjQyMDM1MCwgMHgzYzAyMDgwMCwgMHgyYzJiMDI1LCAKKzB4MjQwMmZmYmYsIDB4MjgyYTAyNCwgMHg4ZjgzMDEyOCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2OGQwLCAweDI2NjIwMDAxLCAweGFmYTIwMDE0LCAweGFmYTMwMDEwLCAKKzB4OGY4NjAxMjAsIDB4OGY4NzAxMjQsIDB4M2MwNTAwMDcsIDB4YzAwMmIzYiwgCisweDM0YTU1MzAwLCAweDEwMDAwMTYyLCAweDAsIDB4OGVhMjAwMDAsIAorMHg4ZWEzMDAwNCwgMHgzYzA0MDAwMSwgMHgyNDg0NjhlOCwgMHhhZmIwMDAxMCwgCisweGFmYjEwMDE0LCAweDhlYTcwMDE4LCAweDM0YTU1OTAwLCAweGMwMDJiM2IsIAorMHg2MDMwMjEsIDB4MTAwMDAxNTYsIDB4MCwgMHg4ZjQyMDA4NCwgCisweDhmYWIwMDY0LCAweDRiMTAyYiwgMHgxNDQwMDAwNywgMHgzYzAyMDAwMSwgCisweDJjMjEwMjQsIDB4MTA0MDAwMDQsIDB4MCwgMHgyNDBjMDAwMiwgCisweGFmYWMwMDVjLCAweDhmYWIwMDY0LCAweDExNjAwMTY2LCAweDI3YWMwMDIwLCAKKzB4YWZhYzAwOGMsIDB4OGZhYjAwNWMsIDB4MjQwYzAwMDEsIDB4NTU2YzAwMjEsIAorMHgyNDBjMDAwMiwgMHg4ZjQzMDA1NCwgMHg4ZjQyMDA1MCwgMHgxMDYyMDAwYiwgCisweDI3NGIwMDU0LCAweDhmNTEwMDU0LCAweDM0MDNlY2MwLCAweGFmYWIwMDRjLCAKKzB4MjYyMjAwMDEsIDB4MzA0MjAxZmYsIDB4YWZhMjAwNTQsIDB4MTExMTQwLCAKKzB4NDMxMDIxLCAweDEwMDAwMDZiLCAweDJlMmE4MjEsIDB4OGY0MjAwNDQsIAorMHg4ZmFjMDA2NCwgMHgzYzA0MDAwMSwgMHgyNDg0NjhhYywgMHhhZmFjMDAxNCwgCisweGFmYTIwMDEwLCAweDhmNDYwMDU0LCAweDhmNDcwMDUwLCAweDNjMDUwMDA3LCAKKzB4YzAwMmIzYiwgMHgzNGE1NDMwMCwgMHg4ZjQzMDM1MCwgMHgyNDAyZmZiZiwgCisweDI4MmEwMjQsIDB4MjQ2MzAwMDEsIDB4YWY0MzAzNTAsIDB4MTAwMDAxMjQsIAorMHg4ZjQyMDM1MCwgMHgxNTZjMDAxZCwgMHgwLCAweDhmNDMwMDc0LCAKKzB4OGY0MjAwNzAsIDB4MTA2MjAwMGEsIDB4Mjc0YjAwNzQsIDB4OGY1MTAwNzQsIAorMHhhZmFiMDA0YywgMHgyNjIyMDAwMSwgMHgzMDQyMDNmZiwgMHhhZmEyMDA1NCwgCisweDExMTE0MCwgMHgyNDQyNmNjMCwgMHgxMDAwMDA0YSwgMHgyZTJhODIxLCAKKzB4OGY0MjAwNDQsIDB4OGZhYzAwNjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDY4YjgsIAorMHgzYzA1MDAwNywgMHhhZmFjMDAxNCwgMHhhZmEyMDAxMCwgMHg4ZjQ2MDA3NCwgCisweDhmNDcwMDcwLCAweDM0YTU0NTAwLCAweDI0MGIwMDAxLCAweGMwMDJiM2IsIAorMHhhZmFiMDA1YywgMHgxMDAwZmZjMywgMHgwLCAweDhmNDMwMDY0LCAKKzB4OGY0MjAwNjAsIDB4MTA2MjAwMWEsIDB4Mjc0YzAwNjQsIDB4OGY1MTAwNjQsIAorMHg4ZmFiMDA1YywgMHhhZmFjMDA0YywgMHgyNjIyMDAwMSwgMHgzMDQyMDBmZiwgCisweGFmYTIwMDU0LCAweDI0MDIwMDA0LCAweDE1NjIwMDBlLCAweDExMTE0MCwgCisweDExMTE4MCwgMHgyNDQyMGNjMCwgMHgyZTIxMDIxLCAweGFmYTIwMDQ0LCAKKzB4OTQ0MjAwMmEsIDB4OGZhYzAwNDQsIDB4OGZhYjAwNjQsIDB4NGIxMDJiLCAKKzB4MTA0MDAwMjQsIDB4MjU5NTAwMjAsIDB4MjQwYzAwMDEsIDB4MTAwMDAwMjEsIAorMHhhM2FjMDA4NywgMHgyNDQyNGNjMCwgMHgxMDAwMDAxZSwgMHgyZTJhODIxLCAKKzB4OGY0MjAwNDQsIDB4OGZhYjAwNjQsIDB4M2MwNDAwMDEsIDB4MjQ4NDY4YzQsIAorMHhhZmFiMDAxNCwgMHhhZmEyMDAxMCwgMHg4ZjQ2MDA2NCwgMHg4ZjQ3MDA2MCwgCisweDNjMDUwMDA3LCAweGMwMDJiM2IsIDB4MzRhNTQ4MDAsIDB4M2MwMjAwMDgsIAorMHgyYzIxMDI0LCAweDE0NDBmZjYxLCAweDAsIDB4OGY0MjAzNzAsIAorMHgyNDBjMDAwMSwgMHhhZmFjMDA1YywgMHgyNDQyMDAwMSwgMHhhZjQyMDM3MCwgCisweDEwMDBmZjkwLCAweDhmNDIwMzcwLCAweDI3YTMwMDM2LCAweDEzMTA0MCwgCisweDYyMTgyMSwgMHg5NDYyMDAwMCwgMHg0NDEwMjEsIDB4MTAwMDAwMWYsIAorMHhhNDYyMDAwMCwgMHhhZWJlMDAxOCwgMHg5M2EyMDA4NywgMHgxMDQwMDA4NCwgCisweDk4MjEsIDB4OGZhYjAwNDQsIDB4OGZhNDAwNjQsIDB4OGZhMzAwOGMsIAorMHgyNTYyMDAyMCwgMHhhZmEyMDAyOCwgMHgyNTYyMDAwOCwgMHhhZmEyMDAzMCwgCisweDI1NjIwMDEwLCAweGFmYWIwMDJjLCAweGFmYTIwMDM0LCAweDk1NjIwMDJhLCAKKzB4YTdhMjAwMzgsIDB4OTU2MjAwMTgsIDB4YTdhMjAwM2EsIDB4OTU2MjAwMWEsIAorMHhhN2EyMDAzYywgMHg5NTYyMDAxYywgMHhhN2EyMDAzZSwgMHg5NDYyMDAxOCwgCisweDI0NjMwMDAyLCAweDgyMjAyMywgMHgxODgwZmZkZiwgMHgyNjczMDAwMSwgCisweDJlNjIwMDA0LCAweDE0NDBmZmY5LCAweDAsIDB4OGY0MjAwZmMsIAorMHgyNjIxMDJhLCAweDE0NDAwMDMwLCAweDI0MDMwMDAxLCAweDhmODMwMTJjLCAKKzB4MTA2MDAwMjgsIDB4MCwgMHg4ZjgyMDEyNCwgMHg0MzEwMjMsIAorMHgyMjE0MywgMHg1ODgwMDAwMSwgMHgyNDg0MDA0MCwgMHg4ZjgyMDEyOCwgCisweDQzMTAyMywgMHgyMTk0MywgMHg1ODYwMDAwMSwgMHgyNDYzMDA0MCwgCisweDY0MTAyYSwgMHg1NDQwMDAwMSwgMHg2MDIwMjEsIDB4YWY0NDAwZmMsIAorMHg4ZjQyMDBmYywgMHgyNjIxMDJhLCAweDEwNDAwMDE2LCAweDI0MDMwMDAxLCAKKzB4MTAwMDAwMWEsIDB4MzA2MjAwZmYsIDB4OGZhYzAwOGMsIDB4MTAxMDQwLCAKKzB4NGMxMDIxLCAweDk0NDcwMDE4LCAweDEwMTA4MCwgMHg0YzEwMjEsIAorMHhhZmJlMDAxMCwgMHg4YzQyMDAwOCwgMHgzYzA0MDAwMSwgMHgyNDg0NjhkYywgCisweDNjMDUwMDA3LCAweDhjNDMwMDA0LCAweDhjNDIwMDAwLCAweDM0YTU1NTAwLCAKKzB4MjAwMzAyMSwgMHhjMDAyYjNiLCAweGFmYTMwMDE0LCAweDEwMDAwMDM5LCAKKzB4MCwgMHg4ZjQyMDMzNCwgMHgxODIxLCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzMzQsIDB4OGY0MjAzMzQsIDB4MzA2MjAwZmYsIDB4MTA0MGZmMDYsIAorMHg4MDIxLCAweDhmNDMwMDA4LCAweDI0MDJmYmZmLCAweDEyNjAwMDJkLCAKKzB4NjI1MDI0LCAweDNjMGI0MDAwLCAweDIyYjQwMjUsIDB4OGZiMTAwOGMsIAorMHgyNjY5ZmZmZiwgMHgyMjA5MDIxLCAweDhlNDIwMDA4LCAweDk2MjcwMDE4LCAKKzB4OGM0NDAwMDAsIDB4OGM0NTAwMDQsIDB4NTYwOTAwMDQsIDB4MjQwYjAwMDEsIAorMHgyNDBjMDAwMiwgMHgxMDAwMDAwMiwgMHhhZmFjMDAxMCwgMHhhZmFiMDAxMCwgCisweDE2MDAwMDA0LCAweGFmYTgwMDE0LCAweDhmNDIwMDA4LCAweDEwMDAwMDAyLCAKKzB4YWZhMjAwMTgsIDB4YWZhYTAwMTgsIDB4OGY0MjAxMGMsIDB4M2MwMzAyMSwgCisweGFmYTgwMDk4LCAweGFmYTkwMDljLCAweDQwZjgwOSwgMHhhZmFhMDBhMCwgCisweDhmYTgwMDk4LCAweDhmYTkwMDljLCAweDhmYWEwMGEwLCAweDEwNDBmZmMyLCAKKzB4M2MwMjAwMWYsIDB4OTYyMzAwMTgsIDB4MzQ0MmZmZmYsIDB4M2MzZjAyMSwgCisweDVlMTAyYiwgMHgxMDQwMDAwMywgMHgyNjMxMDAwMiwgMHg4ZjQyMDE0OCwgCisweDNjMmYwMjMsIDB4MjYxMDAwMDEsIDB4MjEzMTAyYiwgMHgxNDQwZmZkYSwgCisweDI2NTIwMDA0LCAweDhmYjAwMDY0LCAweDEwMDAwMDFhLCAweDAsIAorMHg5NmEzMDAwYSwgMHg4ZmIwMDA2NCwgMHg3MDEwMmIsIDB4NTQ0MDAwMDEsIAorMHg2MDgwMjEsIDB4OGVhNDAwMDAsIDB4OGVhNTAwMDQsIDB4OGZhYjAwNWMsIAorMHgyNDBjMDAwMiwgMHhhZmFjMDAxMCwgMHg5MzQzMDVjNCwgMHhiMTcwMCwgCisweDEwNjAwMDAzLCAweDIyMjMwMjUsIDB4M2MwMjA4MDAsIDB4YzIzMDI1LCAKKzB4YWZhNjAwMTQsIDB4OGY0MjAwMDgsIDB4YWZhMjAwMTgsIDB4OGY0MjAxMGMsIAorMHgzYzAzMDIxLCAweDQwZjgwOSwgMHgyMDAzODIxLCAweDEwNDBmZWNiLCAKKzB4M2MwNTAwMDcsIDB4OTdhYzAwNzYsIDB4MTE4MDAwMDcsIDB4OTZhMzAwMGUsIAorMHg5MzQyMDVjNCwgMHgxNDQwMDAwNCwgMHgwLCAweDk3YWIwMDdlLCAKKzB4NmMxODI1LCAweGE2YWIwMDE2LCAweDhmYWMwMDZjLCAweDNjMDJmZmZmLCAKKzB4MTgyMTAyNCwgMHgxMDQwMDAwMywgMHhjMTQwMiwgMHgzNDYzMDQwMCwgCisweGE2YTIwMDE0LCAweGE2YjAwMDBhLCAweDhmYWIwMDY0LCAweDU2MGIwMDA2LCAKKzB4M2QwZjAyMSwgMHgzNDYyMDAwNCwgMHhhZmEwMDA2NCwgMHhhNmEyMDAwZSwgCisweDEwMDAwMDBkLCAweGEzNDAwNWM0LCAweDhmYWMwMDY0LCAweDNjMDIwMDFmLCAKKzB4MzQ0MmZmZmYsIDB4NWUxMDJiLCAweDE5MDYwMjMsIDB4YWZhYzAwNjQsIAorMHhhNmEzMDAwZSwgMHgyNDBiMDAwMSwgMHgxMDQwMDAwMywgMHhhMzRiMDVjNCwgCisweDhmNDIwMTQ4LCAweDNjMmYwMjMsIDB4OGZhYjAwNTQsIDB4OGZhYzAwNGMsIAorMHhhZDhiMDAwMCwgMHg4ZmFjMDA2NCwgMHgxNTgwZmViYSwgMHgwLCAKKzB4OGZhYjAwNjQsIDB4MTE2MDAwMWIsIDB4MCwgMHg5MzQyMDVjNCwgCisweDEwNDAwMDA2LCAweDAsIDB4YWY1ZTAwYzQsIDB4YWY0YjAwYzAsIAorMHg4ZmFjMDA2YywgMHgxMDAwMDAwZSwgMHhhZjRjMDBjOCwgMHg5N2FiMDA3NiwgCisweDExNjAwMDBiLCAweDM0MDM4MTAwLCAweDhmYTIwMDIwLCAweDhjNDYwMDBjLCAKKzB4YTQ0MzAwMGMsIDB4OTdhYzAwN2UsIDB4OGM0NDAwMDQsIDB4OGM0NTAwMDgsIAorMHhhNDRjMDAwZSwgMHhhYzQ0MDAwMCwgMHhhYzQ1MDAwNCwgMHhhYzQ2MDAwOCwgCisweDhmNDIwMzRjLCAweDI0NDIwMDAxLCAweGFmNDIwMzRjLCAweDEwMDAwMDEwLCAKKzB4OGY0MjAzNGMsIDB4OGZhYjAwNmMsIDB4MzE2NGZmZmYsIDB4MjQ4NGZmZmMsIAorMHg4MDE4MjEsIDB4OGY0NDAyNTAsIDB4OGY0NTAyNTQsIDB4OGY0NjAxMTgsIAorMHgxMDIxLCAweGEzMjgyMSwgMHhhMzM4MmIsIDB4ODIyMDIxLCAKKzB4ODcyMDIxLCAweGFmNDQwMjUwLCAweGMwZjgwOSwgMHhhZjQ1MDI1NCwgCisweDhmYmYwMGMwLCAweDhmYmUwMGJjLCAweDhmYjUwMGI4LCAweDhmYjMwMGI0LCAKKzB4OGZiMjAwYjAsIDB4OGZiMTAwYWMsIDB4OGZiMDAwYTgsIDB4M2UwMDAwOCwgCisweDI3YmQwMGM4LCAweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZkOCwgCisweGFmYmYwMDI0LCAweGFmYjAwMDIwLCAweDhmNDMwMDRjLCAweDhmNDIwMDQ4LCAKKzB4MTA2MjAwMzQsIDB4MCwgMHg4ZjQzMDA0OCwgMHg4ZjQyMDA0YywgCisweDYyMjAyMywgMHg0ODIwMDAxLCAweDI0ODQwMjAwLCAweDhmNDMwMDU0LCAKKzB4OGY0MjAwNGMsIDB4NDMxMDJiLCAweDE0NDAwMDA0LCAweDI0MDIwMjAwLCAKKzB4OGY0MzAwNGMsIDB4MTAwMDAwMDUsIDB4NDMxMDIzLCAweDhmNDIwMDU0LCAKKzB4OGY0MzAwNGMsIDB4NDMxMDIzLCAweDI0NDJmZmZmLCAweDQwNTAyMSwgCisweDhhMTAyYSwgMHg1NDQwMDAwMSwgMHg4MDUwMjEsIDB4OGY0OTAwNGMsIAorMHg4ZjQ4MDA0YywgMHg4ZjQ0MDE4OCwgMHg4ZjQ1MDE4YywgMHg4ZjQ2MDA0YywgCisweDI0MDcxMDAwLCAweGFmYTcwMDEwLCAweDg0MTQwLCAweDEwMDE4MjEsIAorMHgxMmE0ODIxLCAweDMxMzAwMWZmLCAweGFmYjAwMDE0LCAweDhmNDcwMDE0LCAKKzB4MTAyMSwgMHg2MzE0MCwgMHhhZmE3MDAxOCwgMHhhMzI4MjEsIAorMHhhMzM4MmIsIDB4ODIyMDIxLCAweDg3MjAyMSwgMHgzNDAyZWNjMCwgCisweGMyMzAyMSwgMHg4ZjQyMDEwOCwgMHgyZTYzMDIxLCAweDQwZjgwOSwgCisweGEzOTQwLCAweDU0NDAwMDAxLCAweGFmNTAwMDRjLCAweDhmNDMwMDRjLCAKKzB4OGY0MjAwNDgsIDB4MTQ2MjAwMTgsIDB4MCwgMHg4ZjQyMDAwMCwgCisweDEwNDAwMDA3LCAweDAsIDB4YWY4MDAwNGMsIDB4OGY4MjAwNGMsIAorMHgxMDQwZmZmZCwgMHgwLCAweDEwMDAwMDA1LCAweDAsIAorMHhhZjgwMDA0OCwgMHg4ZjgyMDA0OCwgMHgxMDQwZmZmZCwgMHgwLCAKKzB4OGY4MjAwNjAsIDB4MjQwM2ZkZmYsIDB4NDMxMDI0LCAweGFmODIwMDYwLCAKKzB4OGY0MjAwMDAsIDB4MTA0MDAwMDMsIDB4MCwgMHgxMDAwMDAwMiwgCisweGFmODAwMDRjLCAweGFmODAwMDQ4LCAweDhmYmYwMDI0LCAweDhmYjAwMDIwLCAKKzB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgzZTAwMDA4LCAweDAsIAorMHgyN2JkZmZkOCwgMHhhZmJmMDAyNCwgMHhhZmIwMDAyMCwgMHg4ZjQzMDA1YywgCisweDhmNDIwMDU4LCAweDEwNjIwMDQ5LCAweDAsIDB4OGY0MzAwNTgsIAorMHg4ZjQyMDA1YywgMHg2MjIwMjMsIDB4NDgyMDAwMSwgMHgyNDg0MDEwMCwgCisweDhmNDMwMDY0LCAweDhmNDIwMDVjLCAweDQzMTAyYiwgMHgxNDQwMDAwNCwgCisweDI0MDIwMTAwLCAweDhmNDMwMDVjLCAweDEwMDAwMDA1LCAweDQzMTAyMywgCisweDhmNDIwMDY0LCAweDhmNDMwMDVjLCAweDQzMTAyMywgMHgyNDQyZmZmZiwgCisweDQwMzgyMSwgMHg4NzEwMmEsIDB4NTQ0MDAwMDEsIDB4ODAzODIxLCAKKzB4OGY0MjAwNWMsIDB4NDcxMDIxLCAweDMwNTAwMGZmLCAweDMyYzIxMDAwLCAKKzB4MTA0MDAwMTUsIDB4MjQwODIwMDAsIDB4OGY0OTAwNWMsIDB4OGY0NDAxOTAsIAorMHg4ZjQ1MDE5NCwgMHg4ZjQ2MDA1YywgMHg3Mzk4MCwgMHhhZmE4MDAxMCwgCisweGFmYjAwMDE0LCAweDhmNDgwMDE0LCAweDk0OTgwLCAweDEyMDE4MjEsIAorMHgxMDIxLCAweGEzMjgyMSwgMHhhMzQ4MmIsIDB4ODIyMDIxLCAKKzB4ODkyMDIxLCAweDYzMTgwLCAweGFmYTgwMDE4LCAweDhmNDIwMTA4LCAKKzB4MTAwMDAwMTQsIDB4MjRjNjBjYzAsIDB4OGY0OTAwNWMsIDB4OGY0NDAxOTAsIAorMHg4ZjQ1MDE5NCwgMHg4ZjQ2MDA1YywgMHg3Mzk0MCwgMHhhZmE4MDAxMCwgCisweGFmYjAwMDE0LCAweDhmNDgwMDE0LCAweDk0OTQwLCAweDEyMDE4MjEsIAorMHgxMDIxLCAweGEzMjgyMSwgMHhhMzQ4MmIsIDB4ODIyMDIxLCAKKzB4ODkyMDIxLCAweDYzMTQwLCAweGFmYTgwMDE4LCAweDhmNDIwMTA4LCAKKzB4MjRjNjRjYzAsIDB4NDBmODA5LCAweDJlNjMwMjEsIDB4NTQ0MDAwMDEsIAorMHhhZjUwMDA1YywgMHg4ZjQzMDA1YywgMHg4ZjQyMDA1OCwgMHgxNDYyMDAxOCwgCisweDAsIDB4OGY0MjAwMDAsIDB4MTA0MDAwMDcsIDB4MCwgCisweGFmODAwMDRjLCAweDhmODIwMDRjLCAweDEwNDBmZmZkLCAweDAsIAorMHgxMDAwMDAwNSwgMHgwLCAweGFmODAwMDQ4LCAweDhmODIwMDQ4LCAKKzB4MTA0MGZmZmQsIDB4MCwgMHg4ZjgyMDA2MCwgMHgyNDAzZmVmZiwgCisweDQzMTAyNCwgMHhhZjgyMDA2MCwgMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywgCisweDAsIDB4MTAwMDAwMDIsIDB4YWY4MDAwNGMsIDB4YWY4MDAwNDgsIAorMHg4ZmJmMDAyNCwgMHg4ZmIwMDAyMCwgMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAKKzB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZmQ4LCAweGFmYmYwMDI0LCAKKzB4YWZiMDAwMjAsIDB4OGY0MzAwNmMsIDB4OGY0MjAwNjgsIDB4MTA2MjAwMzMsIAorMHgwLCAweDhmNDMwMDY4LCAweDhmNDIwMDZjLCAweDYyMjAyMywgCisweDQ4MjAwMDEsIDB4MjQ4NDA0MDAsIDB4OGY0MzAwNzQsIDB4OGY0MjAwNmMsIAorMHg0MzEwMmIsIDB4MTQ0MDAwMDQsIDB4MjQwMjA0MDAsIDB4OGY0MzAwNmMsIAorMHgxMDAwMDAwNSwgMHg0MzEwMjMsIDB4OGY0MjAwNzQsIDB4OGY0MzAwNmMsIAorMHg0MzEwMjMsIDB4MjQ0MmZmZmYsIDB4NDA1MDIxLCAweDhhMTAyYSwgCisweDU0NDAwMDAxLCAweDgwNTAyMSwgMHg4ZjQ5MDA2YywgMHg4ZjQ4MDA2YywgCisweDhmNDQwMTk4LCAweDhmNDUwMTljLCAweDhmNDYwMDZjLCAweDI0MDc0MDAwLCAKKzB4YWZhNzAwMTAsIDB4ODQxNDAsIDB4MTAwMTgyMSwgMHgxMmE0ODIxLCAKKzB4MzEzMDAzZmYsIDB4YWZiMDAwMTQsIDB4OGY0NzAwMTQsIDB4MTAyMSwgCisweDYzMTQwLCAweDI0YzY2Y2MwLCAweGFmYTcwMDE4LCAweGEzMjgyMSwgCisweGEzMzgyYiwgMHg4MjIwMjEsIDB4ODcyMDIxLCAweDhmNDIwMTA4LCAKKzB4MmU2MzAyMSwgMHg0MGY4MDksIDB4YTM5NDAsIDB4NTQ0MDAwMDEsIAorMHhhZjUwMDA2YywgMHg4ZjQzMDA2YywgMHg4ZjQyMDA2OCwgMHgxNDYyMDAxOCwgCisweDAsIDB4OGY0MjAwMDAsIDB4MTA0MDAwMDcsIDB4MCwgCisweGFmODAwMDRjLCAweDhmODIwMDRjLCAweDEwNDBmZmZkLCAweDAsIAorMHgxMDAwMDAwNSwgMHgwLCAweGFmODAwMDQ4LCAweDhmODIwMDQ4LCAKKzB4MTA0MGZmZmQsIDB4MCwgMHg4ZjgyMDA2MCwgMHgyNDAzZjdmZiwgCisweDQzMTAyNCwgMHhhZjgyMDA2MCwgMHg4ZjQyMDAwMCwgMHgxMDQwMDAwMywgCisweDAsIDB4MTAwMDAwMDIsIDB4YWY4MDAwNGMsIDB4YWY4MDAwNDgsIAorMHg4ZmJmMDAyNCwgMHg4ZmIwMDAyMCwgMHgzZTAwMDA4LCAweDI3YmQwMDI4LCAKKzB4M2UwMDAwOCwgMHgwLCAweDhmNDIwMGZjLCAweDNjMDMwMDAxLCAKKzB4OGY0NDAwZjgsIDB4MzQ2MzMwYzgsIDB4MjQ0MjAwMDEsIDB4YWY0MjAwZmMsIAorMHg4Zjg1MDEyOCwgMHgyZTMxMDIxLCAweDU0ODIwMDA0LCAweDI0ODIwMDA4LCAKKzB4M2MwMjAwMDEsIDB4MzQ0MjJlYzgsIDB4MmUyMTAyMSwgMHg0MDE4MjEsIAorMHhhZjQzMDBmOCwgMHhhYzYwMDAwMCwgMHg4ZjQyMDBmNCwgMHgxNDYyMDAwNCwgCisweDNjMDIwMDAxLCAweDI0YTIwMDIwLCAweDEwMDAwMDBmLCAweGFmODIwMTI4LCAKKzB4OGY0MzAwZjgsIDB4MzQ0MjMwYzgsIDB4MmUyMTAyMSwgMHg1NDYyMDAwNCwgCisweDI0NjIwMDA4LCAweDNjMDIwMDAxLCAweDM0NDIyZWM4LCAweDJlMjEwMjEsIAorMHg0MDE4MjEsIDB4OGM2MjAwMDQsIDB4MjExNDAsIDB4YTIxMDIxLCAKKzB4YWY4MjAxMjgsIDB4YWM2MDAwMDAsIDB4OGNhMzAwMTgsIDB4MzA2MjAwNzAsIAorMHgxMDQwMDAyZCwgMHgzMDYyMDAyMCwgMHgxMDQwMDAwNCwgMHgzYzAyMDAxMCwgCisweDJjMjEwMjQsIDB4MTA0MDAwMGQsIDB4MCwgMHgzMDYyMDA0MCwgCisweDEwNDAwMDA0LCAweDNjMDIwMDIwLCAweDJjMjEwMjQsIDB4MTA0MDAwMDcsIAorMHgwLCAweDMwNjIwMDEwLCAweDEwNDAwMDFmLCAweDNjMDIwMDQwLCAKKzB4MmMyMTAyNCwgMHgxNDQwMDAxYywgMHgwLCAweDhmODIwMDQwLCAKKzB4MzA0MjAwMDEsIDB4MTQ0MDAwMDgsIDB4MjAyMSwgMHg4YzAzMDEwNCwgCisweDI0MDIwMDAxLCAweDUwNjIwMDA1LCAweDI0MDQwMDAxLCAweDhjMDIwMjY0LCAKKzB4MTA0MDAwMDMsIDB4ODAxMDIxLCAweDI0MDQwMDAxLCAweDgwMTAyMSwgCisweDEwNDAwMDA2LCAweDAsIDB4OGY0MjAzMGMsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDMwYywgMHgxMDAwMDAwOCwgMHg4ZjQyMDMwYywgMHg4ZjgyMDA0NCwgCisweDM0NDIwMDA0LCAweGFmODIwMDQ0LCAweDhmNDIwMzA4LCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzMDgsIDB4OGY0MjAzMDgsIDB4M2UwMDAwOCwgMHgwLCAKKzB4M2UwMDAwOCwgMHgwLCAweDI3YmRmZjk4LCAweGFmYmYwMDYwLCAKKzB4YWZiZTAwNWMsIDB4YWZiNTAwNTgsIDB4YWZiMzAwNTQsIDB4YWZiMjAwNTAsIAorMHhhZmIxMDA0YywgMHhhZmIwMDA0OCwgMHg4ZjQyMDBmYywgMHgyNDQyMDAwMSwgCisweGFmNDIwMGZjLCAweDhmODgwMTI4LCAweDI1MDIwMDIwLCAweGFmODIwMTI4LCAKKzB4OGQwMzAwMTgsIDB4MzA2MjAwNzAsIDB4MTA0MDAwMmUsIDB4MzA2MjAwMjAsIAorMHgxMDQwMDAwNCwgMHgzYzAyMDAxMCwgMHgyYzIxMDI0LCAweDEwNDAwMDBkLCAKKzB4MCwgMHgzMDYyMDA0MCwgMHgxMDQwMDAwNCwgMHgzYzAyMDAyMCwgCisweDJjMjEwMjQsIDB4MTA0MDAwMDcsIDB4MCwgMHgzMDYyMDAxMCwgCisweDEwNDAwMWE5LCAweDNjMDIwMDQwLCAweDJjMjEwMjQsIDB4MTQ0MDAxYTYsIAorMHgwLCAweDhmODIwMDQwLCAweDMwNDIwMDAxLCAweDE0NDAwMDA4LCAKKzB4MjAyMSwgMHg4YzAzMDEwNCwgMHgyNDAyMDAwMSwgMHg1MDYyMDAwNSwgCisweDI0MDQwMDAxLCAweDhjMDIwMjY0LCAweDEwNDAwMDAzLCAweDgwMTAyMSwgCisweDI0MDQwMDAxLCAweDgwMTAyMSwgMHgxMDQwMDAwNiwgMHgwLCAKKzB4OGY0MjAzMGMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzMGMsIDB4MTAwMDAxOTIsIAorMHg4ZjQyMDMwYywgMHg4ZjgyMDA0NCwgMHgzNDQyMDAwNCwgMHhhZjgyMDA0NCwgCisweDhmNDIwMzA4LCAweDI0NDIwMDAxLCAweGFmNDIwMzA4LCAweDEwMDAwMThhLCAKKzB4OGY0MjAzMDgsIDB4MzA2MjAwMDIsIDB4MTA0MDAxNGIsIDB4M2MwMjA4MDAsIAorMHg4ZDFlMDAxYywgMHgxZTU3MDIsIDB4YWZhYTAwMzQsIDB4OTUwYTAwMTYsIAorMHgzYzIyMDI0LCAweGFmYWEwMDI0LCAweDhmYWEwMDM0LCAweDI0MDIwMDAxLCAKKzB4MTU0MjAwMDYsIDB4MzNkZWZmZmYsIDB4MWUxMTQwLCAweDM0MDNlY2MwLCAKKzB4NDMxMDIxLCAweDEwMDAwMDEwLCAweDJlMmE4MjEsIDB4MjQwMjAwMDIsIAorMHgxNTQyMDAwNSwgMHgyNDAyMDAwMywgMHgxZTExNDAsIDB4MjQ0MjZjYzAsIAorMHgxMDAwMDAwOSwgMHgyZTJhODIxLCAweDE1NDIwMDA1LCAweDFlMTE4MCwgCisweDFlMTE0MCwgMHgyNDQyNGNjMCwgMHgxMDAwMDAwMywgMHgyZTJhODIxLCAKKzB4NTcxMDIxLCAweDI0NTUwY2UwLCAweDk2YTIwMDBlLCAweDMwNGFmZmZjLCAKKzB4MzA0MjA0MDAsIDB4MTA0MDAwMDMsIDB4YWZhYTAwMmMsIDB4MTAwMDAwZTEsIAorMHg4ODIxLCAweDEwODAwMDA0LCAweDg4MjEsIDB4OTdiMTAwMjYsIAorMHgxMDAwMDBkZCwgMHhhNmIxMDAxMiwgMHg4ZWIzMDAxOCwgMHg5NjZhMDAwYywgCisweGE3YWEwMDNlLCAweDk3YTUwMDNlLCAweDJjYTMwNWRkLCAweDM4YTI4ODcwLCAKKzB4MmM0MjAwMDEsIDB4NjIxODI1LCAweDEwNjAwMDE1LCAweDIwMjEsIAorMHgzMmMyMDgwMCwgMHgxMDQwMDAxNSwgMHgyNDAyMDgwMCwgMHg5NjYzMDAxNCwgCisweDE0NjIwMDEyLCAweDM0MDJhYWFhLCAweDk2NjMwMDBlLCAweDE0NjIwMDA3LCAKKzB4MjgyMSwgMHg5NjYzMDAxMCwgMHgyNDAyMDMwMCwgMHgxNDYyMDAwNCwgCisweGEwMTAyMSwgMHg5NjYyMDAxMiwgMHgyYzQ1MDAwMSwgMHhhMDEwMjEsIAorMHg1NDQwMDAwNiwgMHgyNDA0MDAxNiwgMHgxMDAwMDAwNCwgMHgwLCAKKzB4MjQwMjA4MDAsIDB4NTBhMjAwMDEsIDB4MjQwNDAwMGUsIDB4MTA4MDAwYjksIAorMHgyNjQ5MDIxLCAweDkyNDIwMDAwLCAweDMwNDIwMDBmLCAweDI4MDgwLCAKKzB4MzJjMjAxMDAsIDB4MTA0MDAwMjAsIDB4MjUwMTgyMSwgMHgzYzAyMDAyMCwgCisweDQzMTAyYiwgMHgxNDQwMDAwZSwgMHgyNDAyMDIxLCAweDI4MjEsIAorMHg5NDgyMDAwMCwgMHgyNDg0MDAwMiwgMHhhMjI4MjEsIDB4ODMxMDJiLCAKKzB4MTQ0MGZmZmIsIDB4MzBhMmZmZmYsIDB4NTFjMDIsIDB4NjIyODIxLCAKKzB4NTFjMDIsIDB4MzBhMmZmZmYsIDB4MTAwMDAwMDksIDB4NjIyODIxLCAKKzB4OGY0NzAxNDgsIDB4OGY0MjAxMTAsIDB4MTAyODQyLCAweDNjMDYwMDIwLCAKKzB4NDBmODA5LCAweGFmYTgwMDQwLCAweDMwNDVmZmZmLCAweDhmYTgwMDQwLCAKKzB4NTBhMDAwMDEsIDB4MzQwNWZmZmYsIDB4OGZhYTAwMmMsIDB4MzU0YTAwMDIsIAorMHgxMDAwMDAwMiwgMHhhZmFhMDAyYywgMHgyODIxLCAweDMyYzIwMDgwLCAKKzB4MTA0MDAwOTAsIDB4YTZhNTAwMTAsIDB4MjY0MzAwMDksIDB4M2MwMjAwMWYsIAorMHgzNDQyZmZmZiwgMHg0MzEwMmIsIDB4MTA0MDAwMDMsIDB4MCwgCisweDhmNDIwMTQ4LCAweDYyMTgyMywgMHg5MDY2MDAwMCwgMHgzMGMyMDBmZiwgCisweDM4NDMwMDA2LCAweDJjNjMwMDAxLCAweDM4NDIwMDExLCAweDJjNDIwMDAxLCAKKzB4NjIxODI1LCAweDEwNjAwMDdmLCAweDI0MDIwODAwLCAweDg4MjEsIAorMHg5N2EzMDAzZSwgMHgxNDYyMDAwZiwgMHgyNjAyMDIxLCAweDk2NzEwMDAwLCAKKzB4OTY2MjAwMDIsIDB4OTY2MzAwMDQsIDB4OTY2NDAwMDYsIDB4MjIyODgyMSwgCisweDIyMzg4MjEsIDB4MjI0ODgyMSwgMHg5NjYyMDAwOCwgMHg5NjYzMDAwYSwgCisweDk2NjQwMDBjLCAweDIyMjg4MjEsIDB4MjIzODgyMSwgMHgxMDAwMDAwNywgCisweDIyNDg4MjEsIDB4OTQ4MjAwMDAsIDB4MjQ4NDAwMDIsIDB4MjIyODgyMSwgCisweDkyMTAyYiwgMHgxNDQwZmZmYiwgMHgwLCAweDExMWMwMiwgCisweDMyMjJmZmZmLCAweDYyODgyMSwgMHgxMTFjMDIsIDB4MzIyMmZmZmYsIAorMHg2Mjg4MjEsIDB4MzJjMjAyMDAsIDB4MTA0MDAwMDMsIDB4MjY0NDAwMDYsIAorMHgxMDAwMDAzZSwgMHg4MDIxLCAweDNjMDUwMDFmLCAweDM0YTVmZmZmLCAKKzB4YTQxMDJiLCAweDEwNDAwMDAzLCAweDAsIDB4OGY0MjAxNDgsIAorMHg4MjIwMjMsIDB4OTQ4MjAwMDAsIDB4MzA0MjFmZmYsIDB4MTA0MDAwMDQsIAorMHgyNjQ0MDAwYywgMHg5NjQyMDAwMiwgMHgxMDAwMDAzMCwgMHg1MDgwMjMsIAorMHg5NjQyMDAwMiwgMHgyNjQzMDAxNCwgMHg1MDgwMjMsIDB4M2MwMjAwMjAsIAorMHg0MzEwMmIsIDB4MTQ0MDAwMGEsIDB4ZDA4MDIxLCAweDk2NDIwMDBjLCAKKzB4MjAyODAyMSwgMHg5NjQyMDAwZSwgMHg5NjQzMDAxMCwgMHg5NjQ0MDAxMiwgCisweDIwMjgwMjEsIDB4MjAzODAyMSwgMHgxMDAwMDAyMCwgMHgyMDQ4MDIxLCAKKzB4YTQxMDJiLCAweDEwNDAwMDAzLCAweDAsIDB4OGY0MjAxNDgsIAorMHg4MjIwMjMsIDB4OTQ4MjAwMDAsIDB4MjQ4NDAwMDIsIDB4MjAyODAyMSwgCisweGE0MTAyYiwgMHgxMDQwMDAwMywgMHgwLCAweDhmNDIwMTQ4LCAKKzB4ODIyMDIzLCAweDk0ODIwMDAwLCAweDI0ODQwMDAyLCAweDIwMjgwMjEsIAorMHhhNDEwMmIsIDB4MTA0MDAwMDMsIDB4MCwgMHg4ZjQyMDE0OCwgCisweDgyMjAyMywgMHg5NDgyMDAwMCwgMHgyNDg0MDAwMiwgMHgyMDI4MDIxLCAKKzB4YTQxMDJiLCAweDEwNDAwMDAzLCAweDAsIDB4OGY0MjAxNDgsIAorMHg4MjIwMjMsIDB4OTQ4MjAwMDAsIDB4MjAyODAyMSwgMHgzYzAyMDEwMCwgCisweDJjMjEwMjQsIDB4MTA0MDAwMGUsIDB4MCwgMHg4ZmFhMDAyYywgCisweDMxNDIwMDA0LCAweDEwNDAwMDBhLCAweDAsIDB4OTUwNDAwMGUsIAorMHgyNjQyMDIxLCAweGMwMDNlZWMsIDB4MjQ4NGZmZmMsIDB4MzA0MmZmZmYsIAorMHgyMjI4ODIxLCAweDExMWMwMiwgMHgzMjIyZmZmZiwgMHg2Mjg4MjEsIAorMHg4ZmFhMDAyNCwgMHgxNTE4ODIzLCAweDExMTQwMiwgMHgyMjI4ODIxLCAKKzB4MjMwODgyMSwgMHgxMTE0MDIsIDB4MjIyODgyMSwgMHgzMjMxZmZmZiwgCisweDUyMjAwMDAxLCAweDM0MTFmZmZmLCAweDhmYWEwMDJjLCAweDM1NGEwMDAxLCAKKzB4YWZhYTAwMmMsIDB4YTZiMTAwMTIsIDB4OTdhYTAwMmUsIDB4YTZhYTAwMGUsIAorMHg4ZmFhMDAyYywgMHgzMTQyMDAwNCwgMHgxMDQwMDAwMiwgMHgyNDA5MTAwMCwgCisweDM0MDk4MDAwLCAweDhmNDgwMDQ0LCAweDhmNDQwMWEwLCAweDhmNDUwMWE0LCAKKzB4YWZhOTAwMTAsIDB4OGY0OTAwNDQsIDB4ODQxNDAsIDB4MTAwMTgyMSwgCisweGFmYTkwMDE0LCAweDhmNDgwMDBjLCAweDJhMDMwMjEsIDB4MjQwNzAwMjAsIAorMHhhZmE4MDAxOCwgMHg4ZjQ4MDEwYywgMHgxMDIxLCAweGEzMjgyMSwgCisweGEzNDgyYiwgMHg4MjIwMjEsIDB4MTAwZjgwOSwgMHg4OTIwMjEsIAorMHgxNDQwMDAwYiwgMHgwLCAweDhmODIwMTI4LCAweDNjMDQwMDAxLCAKKzB4MjQ4NDY5MTQsIDB4YWZiZTAwMTQsIDB4YWZhMjAwMTAsIDB4OGY4NjAxMjQsIAorMHg4Zjg3MDEyMCwgMHgzYzA1MDAwNywgMHhjMDAyYjNiLCAweDM0YTU5OTIwLCAKKzB4OGY0MjAzNjgsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNjgsIDB4OGY0MjAwNDQsIAorMHg4ZjQzMDA4OCwgMHgyNDQyMDAwMSwgMHg0MzEwMjQsIDB4YWY0MjAwNDQsIAorMHg4ZmFhMDAzNCwgMHg4ZjQ0MDM2OCwgMHgyNDAyMDAwMSwgMHgxNTQyMDAwNiwgCisweDI0MDIwMDAyLCAweDhmNDIwMzVjLCAweDI0NDJmZmZmLCAweGFmNDIwMzVjLCAKKzB4MTAwMDAwNDksIDB4OGY0MjAzNWMsIDB4MTU0MjAwMDYsIDB4MCwgCisweDhmNDIwMzY0LCAweDI0NDJmZmZmLCAweGFmNDIwMzY0LCAweDEwMDAwMDQyLCAKKzB4OGY0MjAzNjQsIDB4OGY0MjAzNjAsIDB4MjQ0MmZmZmYsIDB4YWY0MjAzNjAsIAorMHgxMDAwMDAzZCwgMHg4ZjQyMDM2MCwgMHgzMDYyMTAwMCwgMHgxMDQwMDAwNSwgCisweDMwNjI4MDAwLCAweDhmNDIwMDc4LCAweDI0NDIwMDAxLCAweDEwMDAwMDM2LCAKKzB4YWY0MjAwNzgsIDB4MTA0MDAwMzQsIDB4MCwgMHg4ZjQyMDA3OCwgCisweDI0NDIwMDAxLCAweGFmNDIwMDc4LCAweDhjMDMwMjQwLCAweDQzMTAyYiwgCisweDE0NDAwMDJkLCAweDI0MDcwMDA4LCAweDhmNDQwMTY4LCAweDhmNDUwMTZjLCAKKzB4OGY0MzAwNDQsIDB4OGY0ODAwMGMsIDB4OGY4NjAxMjAsIDB4MjQwMjAwNDAsIAorMHhhZmEyMDAxMCwgMHhhZmEzMDAxNCwgMHhhZmE4MDAxOCwgMHg4ZjQyMDEwYywgCisweDQwZjgwOSwgMHgyNGM2MDAxYywgMHgxNDQwMDAxMSwgMHgyNDAyMDAwMSwgCisweDNjMDEwMDAxLCAweDM3MDgyMSwgMHhhMDIyNDBmMiwgMHg4ZjgyMDEyNCwgCisweGFmYTIwMDEwLCAweDhmODIwMTI4LCAweDNjMDQwMDAxLCAweDI0ODQ2ODhjLCAKKzB4YWZhMjAwMTQsIDB4OGY0NjAwNDQsIDB4OGY4NzAxMjAsIDB4M2MwNTAwMDksIAorMHhjMDAyYjNiLCAweDM0YTUxMzAwLCAweDEwMDAwMDBiLCAweDAsIAorMHg4ZjQyMDMwNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDMwNCwgMHg4ZjQyMDMwNCwgCisweDhmNDIwMDQ0LCAweGFmNDIwMDdjLCAweDNjMDEwMDAxLCAweDM3MDgyMSwgCisweGEwMjA0MGYyLCAweGFmNDAwMDc4LCAweDhmNDIwMzE4LCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzMTgsIDB4OGY0MjAzMTgsIDB4OGZiZjAwNjAsIDB4OGZiZTAwNWMsIAorMHg4ZmI1MDA1OCwgMHg4ZmIzMDA1NCwgMHg4ZmIyMDA1MCwgMHg4ZmIxMDA0YywgCisweDhmYjAwMDQ4LCAweDNlMDAwMDgsIDB4MjdiZDAwNjgsIDB4M2UwMDAwOCwgCisweDAsIDB4MCwgMHgwLCAweDhmNDIwMTNjLCAKKzB4YWY4MjAwYzAsIDB4OGY0MjAxM2MsIDB4YWY4MjAwYzQsIDB4OGY0MjAxM2MsIAorMHhhZjgyMDBjOCwgMHg4ZjQyMDEzOCwgMHhhZjgyMDBkMCwgMHg4ZjQyMDEzOCwgCisweGFmODIwMGQ0LCAweDhmNDIwMTM4LCAweDNlMDAwMDgsIDB4YWY4MjAwZDgsIAorMHgyN2JkZmZlMCwgMHgyNzg0MDIwOCwgMHgyNDA1MDIwMCwgMHhhZmJmMDAxOCwgCisweGMwMDJiYmYsIDB4MjQwNjAwMDgsIDB4OGMwMjAyMDQsIDB4YzAwNDAxMiwgCisweGFmODIwMjEwLCAweDNjMDIwMDAxLCAweDhjNDI2ZDk0LCAweDMwNDIwMDAyLCAKKzB4MTA0MDAwMGUsIDB4MjAyMSwgMHg4YzA2MDI0OCwgMHgyNDAyMDAwMiwgCisweDNjMDEwMDAxLCAweGFjMjI2ZDk4LCAweGMwMDUxMDQsIDB4MjQwNTAwMDIsIAorMHgyMDIxLCAweDhjMDYwMjQ4LCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAKKzB4YWMyMjZkOTgsIDB4MTAwMDAwMTEsIDB4MjQwNTAwMDEsIDB4OGMwNjAyNDgsIAorMHgyNDAyMDAwNCwgMHgzYzAxMDAwMSwgMHhhYzIyNmQ5OCwgMHhjMDA1MTA0LCAKKzB4MjQwNTAwMDQsIDB4M2MwMjAwMDEsIDB4OGM0MjZkOTQsIDB4MzA0MjAwMDEsIAorMHgxMDQwMDAwOCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmQ5OCwgCisweDIwMjEsIDB4MjQwNTAwMDEsIDB4M2MwNjYwMWIsIDB4YzAwNTEwNCwgCisweDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDY5ZDAsIDB4OGY0MjAxNTAsIAorMHg4ZjQzMDE1NCwgMHgzYzA1MDAwOCwgMHg4ZjQ2MDE1OCwgMHgyMTY0MCwgCisweDMxOTQwLCAweDM0NjMwNDAzLCAweDQzMTAyNSwgMHg2MzNjMCwgCisweDQ2MTAyNSwgMHhhZjgyMDIxYywgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgCisweDhmODYwMjFjLCAweDM0YTUwMjAwLCAweGMwMDJiM2IsIDB4MzgyMSwgCisweDNjMDEwMDAxLCAweGFjMjA2ZDkwLCAweDNjMDEwMDAxLCAweGFjMjA2ZGE4LCAKKzB4OGZiZjAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgyN2JkZmZlMCwgCisweDNjMDUwMDA4LCAweDM0YTUwMzAwLCAweGFmYmYwMDE4LCAweGFmYTAwMDEwLCAKKzB4YWZhMDAwMTQsIDB4OGY4NjAyMDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDY5ZGMsIAorMHhjMDAyYjNiLCAweDM4MjEsIDB4OGY0MjA0MTAsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDQxMCwgMHg4ZjQyMDQxMCwgMHg4ZmJmMDAxOCwgMHgzZTAwMDA4LCAKKzB4MjdiZDAwMjAsIDB4MjdiZGZmZDgsIDB4YWZiZjAwMjAsIDB4YWZiMTAwMWMsIAorMHhhZmIwMDAxOCwgMHg4ZjQyMDNhNCwgMHgyNDQyMDAwMSwgMHhhZjQyMDNhNCwgCisweDhmNDIwM2E0LCAweDhmOTAwMjIwLCAweDhmODIwMGUwLCAweGFmYTIwMDEwLCAKKzB4OGY4MjAwZTQsIDB4YWZhMjAwMTQsIDB4OGY4NjAwYzQsIDB4OGY4NzAwYzgsIAorMHgzYzA0MDAwMSwgMHgyNDg0NjllOCwgMHhjMDAyYjNiLCAweDIwMDI4MjEsIAorMHgzYzA0NDAwMCwgMHgyMDQxMDI0LCAweDUwNDAwMGI0LCAweDNjMDQwMTAwLCAKKzB4OGY0MjAzYmMsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzYmMsIDB4OGY0MjAzYmMsIAorMHg4Zjg3MDBjNCwgMHg4ZjgzMDBjOCwgMHg4ZjQyMDE0OCwgMHg2NzE4MjMsIAorMHg0MzEwMmIsIDB4MTA0MDAwMDMsIDB4MCwgMHg4ZjQyMDE0OCwgCisweDYyMTgyMSwgMHgxMDYwMDAwNSwgMHgwLCAweDhmNDIwMTRjLCAKKzB4NDMxMDJiLCAweDEwNDAwMDBiLCAweDAsIDB4OGY4MjAwZTAsIAorMHg4ZjQzMDEyNCwgMHhhZjQyMDExYywgMHhhZjQzMDExNCwgMHg4ZjgyMDIyMCwgCisweDNjMDMwOGZmLCAweDM0NjNmZmZiLCAweDQzMTAyNCwgMHgxMDAwMDBjZSwgCisweDQ0MTAyNSwgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgMHgzNDYzZmZmZiwgCisweDQzMTAyNCwgMHgzNDQyMDAwNCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDBlMCwgCisweDhmNDMwMTI0LCAweGFmNDIwMTFjLCAweGFmNDMwMTE0LCAweDhmODYwMGM4LCAKKzB4OGY4NDAxMjAsIDB4OGY4MzAxMjQsIDB4MTAwMDAwMDUsIDB4MjgyMSwgCisweDE0NjIwMDAyLCAweDI0NjIwMDIwLCAweDI3NjI0ODAwLCAweDQwMTgyMSwgCisweDEwNjQwMDBjLCAweDMwYTIwMGZmLCAweDhjNjIwMDE4LCAweDMwNDIwMDAzLCAKKzB4MTA0MGZmZjcsIDB4Mjc2MjRmZTAsIDB4OGY0MjAzZDAsIDB4MjQwNTAwMDEsIAorMHgyNDQyMDAwMSwgMHhhZjQyMDNkMCwgMHg4ZjQyMDNkMCwgMHg4YzY2MDAwOCwgCisweDMwYTIwMGZmLCAweDE0NDAwMDU4LCAweDAsIDB4OTM0MjA1YzQsIAorMHgxNDQwMDA1NSwgMHgwLCAweDhmODcwMGM0LCAweDhmODgwMGUwLCAKKzB4OGY4NDAwZTQsIDB4MjQwMmZmZjgsIDB4MTAyNDAyNCwgMHgxMDQxMDIzLCAKKzB4MjE4YzMsIDB4NDYyMDAwMSwgMHgyNDYzMDIwMCwgMHgxMDYwMDAwNSwgCisweDI0MDIwMDAxLCAweDEwNjIwMDA5LCAweDAsIDB4MTAwMDAwMWYsIAorMHgwLCAweDhmNDIwM2MwLCAweGUwMzAyMSwgMHgyNDQyMDAwMSwgCisweGFmNDIwM2MwLCAweDEwMDAwMDQwLCAweDhmNDIwM2MwLCAweDhmNDIwM2M0LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAzYzQsIDB4OGM4NjAwMDAsIDB4OGY0MjAxNDgsIAorMHg4ZjQzMDNjNCwgMHhlNjE4MjMsIDB4NDMxMDJiLCAweDEwNDAwMDA0LCAKKzB4MmM2MjIzM2YsIDB4OGY0MjAxNDgsIDB4NjIxODIxLCAweDJjNjIyMzNmLCAKKzB4MTQ0MDAwMzEsIDB4MCwgMHg4ZjQyMDIwYywgMHgyNDQyMDAwMSwgCisweGFmNDIwMjBjLCAweDhmNDIwMjBjLCAweGUwMzAyMSwgMHgyNDgyMDAwOCwgCisweGFmODIwMGU0LCAweDEwMDAwMDI4LCAweGFmODIwMGU4LCAweDhmNDIwM2M4LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAzYzgsIDB4OGY0MjAzYzgsIDB4OGM4NTAwMDAsIAorMHg4ZjQyMDE0OCwgMHhhNzE4MjMsIDB4NDMxMDJiLCAweDEwNDAwMDAzLCAKKzB4MCwgMHg4ZjQyMDE0OCwgMHg2MjE4MjEsIDB4OGY0MjAxNGMsIAorMHg0MzEwMmIsIDB4NTQ0MDAwMGEsIDB4YTAzMDIxLCAweDhmNDIwMjBjLCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAyMGMsIDB4OGY0MjAyMGMsIDB4MjQ4MjAwMDgsIAorMHhhZjgyMDBlNCwgMHg4Zjg0MDBlNCwgMHgxNDg4ZmZlYywgMHhhZjg0MDBlOCwgCisweDE0ODgwMDBkLCAweDI3NjIzMDAwLCAweDE0ODIwMDAyLCAweDI0ODJmZmY4LCAKKzB4Mjc2MjNmZjgsIDB4OTQ0MzAwMDYsIDB4M2MwMjAwMWYsIDB4MzQ0MmZmZmYsIAorMHhjMzMwMjEsIDB4NDYxMDJiLCAweDEwNDAwMDAzLCAweDAsIAorMHg4ZjQyMDE0OCwgMHhjMjMwMjMsIDB4YWY4NjAwYzgsIDB4OGY4MzAwYzQsIAorMHg4ZjQyMDE0OCwgMHhjMzE4MjMsIDB4NDMxMDJiLCAweDEwNDAwMDAzLCAKKzB4MCwgMHg4ZjQyMDE0OCwgMHg2MjE4MjEsIDB4MTA2MDAwMDUsIAorMHgwLCAweDhmNDIwMTRjLCAweDQzMTAyYiwgMHg1MDQwMDAwOCwgCisweDNjMDJmZGZmLCAweDhmODIwMjIwLCAweDNjMDMwOGZmLCAweDM0NjNmZmZiLCAKKzB4NDMxMDI0LCAweDNjMDM0MDAwLCAweDEwMDAwMDNmLCAweDQzMTAyNSwgCisweDhmNDMwM2NjLCAweDM0NDJmZmZmLCAweDI4MmEwMjQsIDB4MjQ2MzAwMDEsIAorMHhhZjQzMDNjYywgMHgxMDAwMDAzOSwgMHg4ZjQyMDNjYywgMHgyMDQxMDI0LCAKKzB4MTA0MDAwMGUsIDB4M2MxMTAyMDAsIDB4OGY0MjAzYTgsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDNhOCwgMHg4ZjQyMDNhOCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgCisweDM0NjNmZmZmLCAweDQzMTAyNCwgMHg0NDEwMjUsIDB4YzAwM2RhZiwgCisweGFmODIwMjIwLCAweDEwMDAwMDI5LCAweDAsIDB4MjExMTAyNCwgCisweDUwNDAwMDA4LCAweDNjMTEwNDAwLCAweDhmNDIwM2FjLCAweDI0NDIwMDAxLCAKKzB4YWY0MjAzYWMsIDB4YzAwM2RhZiwgMHg4ZjQyMDNhYywgMHgxMDAwMDAxOSwgCisweDAsIDB4MjExMTAyNCwgMHgxMDQwMDAxYywgMHgwLCAKKzB4OGY4MzAyMjQsIDB4MjQwMjE0MDIsIDB4MTQ2MjAwMDksIDB4M2MwNTAwMDgsIAorMHgzYzA0MDAwMSwgMHgyNDg0NjlmNCwgMHhhZmEwMDAxMCwgMHhhZmEwMDAxNCwgCisweDhmODYwMjI0LCAweDM0YTUwNTAwLCAweGMwMDJiM2IsIDB4MzgyMSwgCisweDhmNDIwM2IwLCAweDI0NDIwMDAxLCAweGFmNDIwM2IwLCAweDhmNDIwM2IwLCAKKzB4OGY4MjAyMjAsIDB4MjAwMjAyMSwgMHgzNDQyMDAwMiwgMHhjMDA0ZTljLCAKKzB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsIDB4M2MwMzA4ZmYsIDB4MzQ2M2ZmZmYsIAorMHg0MzEwMjQsIDB4NTExMDI1LCAweGFmODIwMjIwLCAweDhmYmYwMDIwLCAKKzB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgCisweDNlMDAwMDgsIDB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRhOCwgCisweDI3YmRmZmIwLCAweGFmYmYwMDQ4LCAweGFmYmUwMDQ0LCAweGFmYjUwMDQwLCAKKzB4YWZiMzAwM2MsIDB4YWZiMjAwMzgsIDB4YWZiMTAwMzQsIDB4MTA0MDAwMGYsIAorMHhhZmIwMDAzMCwgMHgzYzA0MDAwMSwgMHgyNDg0NmEwMCwgMHgzYzA1MDAwOCwgCisweGFmYTAwMDEwLCAweGFmYTAwMDE0LCAweDhmODYwMjIwLCAweDM0YTUwNjAwLCAKKzB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMDZkYTgsIDB4M2MwMTAwMDEsIAorMHhhYzIyNmQ5YywgMHhjMDAyYjNiLCAweDM4MjEsIDB4M2MwMzdmZmYsIAorMHg4YzAyMDI2OCwgMHgzNDYzZmZmZiwgMHgzYzA0ZmRmZiwgMHg0MzEwMjQsIAorMHhhYzAyMDI2OCwgMHg4ZjQyMDAwNCwgMHgzNDg0ZmZmZiwgMHgzMDQyMDAwMiwgCisweDEwNDAwMDkyLCAweDI4NGEwMjQsIDB4M2MwNDA2MDAsIDB4MzQ4NDIwMDAsIAorMHg4ZjQyMDAwNCwgMHgyODIxLCAweDI0MDNmZmZkLCAweDQzMTAyNCwgCisweGFmNDIwMDA0LCAweGFmYTQwMDIwLCAweDhmNWUwMDE4LCAweDI3YWEwMDIwLCAKKzB4MjQwMjAwZmYsIDB4MTNjMjAwMDIsIDB4YWZhYTAwMmMsIDB4MjdjNTAwMDEsIAorMHg4YzAyMDIyOCwgMHhhMDkwMjEsIDB4MTY0MjAwMGUsIDB4MWUzOGMwLCAKKzB4OGY0MjAzM2MsIDB4MjQ0MjAwMDEsIDB4YWY0MjAzM2MsIDB4OGY0MjAzM2MsIAorMHg4YzAyMDIyOCwgMHgzYzA0MDAwMSwgMHgyNDg0Njk5OCwgMHgzYzA1MDAwOSwgCisweGFmYTAwMDE0LCAweGFmYTIwMDEwLCAweDhmYTYwMDIwLCAweDEwMDAwMDZkLCAKKzB4MzRhNTA1MDAsIDB4ZjcxMDIxLCAweDhmYTMwMDIwLCAweDhmYTQwMDI0LCAKKzB4YWM0MzA0YzAsIDB4YWM0NDA0YzQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIAorMHgyNDcwMDNlOCwgMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDEwNDAwMDFiLCAKKzB4OTgyMSwgMHhlMDg4MjEsIDB4MjYzNTA0YzAsIDB4OGY0NDAxNzgsIAorMHg4ZjQ1MDE3YywgMHgyMjAxODIxLCAweDI0MGEwMDA0LCAweGFmYWEwMDEwLCAKKzB4YWZiMjAwMTQsIDB4OGY0ODAwMGMsIDB4MTAyMSwgMHgyZjUzMDIxLCAKKzB4YWZhODAwMTgsIDB4OGY0ODAxMGMsIDB4MjQwNzAwMDgsIDB4YTMyODIxLCAKKzB4YTM0ODJiLCAweDgyMjAyMSwgMHgxMDBmODA5LCAweDg5MjAyMSwgCisweDU0NDAwMDA2LCAweDI0MTMwMDAxLCAweDhmODIwMDU0LCAweDIwMjEwMjMsIAorMHgyYzQyMDNlOSwgMHgxNDQwZmZlOSwgMHgwLCAweDMyNjIwMGZmLCAKKzB4NTQ0MDAwMTcsIDB4YWY1MjAwMTgsIDB4OGY0MjAzNzgsIDB4MjQ0MjAwMDEsIAorMHhhZjQyMDM3OCwgMHg4ZjQyMDM3OCwgMHg4ZjgyMDEyMCwgMHg4ZmFhMDAyYywgCisweGFmYTIwMDEwLCAweDhmODIwMTI0LCAweDNjMDQwMDAxLCAweDI0ODQ2OWE0LCAKKzB4M2MwNTAwMDksIDB4YWZhMjAwMTQsIDB4OGQ0NjAwMDAsIDB4MTAwMDAwMzUsIAorMHgzNGE1MDYwMCwgMHg4ZjQyMDMwOCwgMHgyNDEzMDAwMSwgMHgyNDQyMDAwMSwgCisweGFmNDIwMzA4LCAweDhmNDIwMzA4LCAweDEwMDAwMDFlLCAweDMyNjIwMGZmLCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MjQ3MDAzZTgsIDB4MjAyMTAyMywgCisweDJjNDIwM2U5LCAweDEwNDAwMDE2LCAweDk4MjEsIDB4M2MxNTAwMjAsIAorMHgyNDExMDAxMCwgMHg4ZjQyMDAwYywgMHg4ZjQ0MDE2MCwgMHg4ZjQ1MDE2NCwgCisweDhmODYwMTIwLCAweGFmYjEwMDEwLCAweGFmYjIwMDE0LCAweDU1MTAyNSwgCisweGFmYTIwMDE4LCAweDhmNDIwMTBjLCAweDI0MDcwMDA4LCAweDQwZjgwOSwgCisweDI0YzYwMDFjLCAweDE0NDBmZmUzLCAweDAsIDB4OGY4MjAwNTQsIAorMHgyMDIxMDIzLCAweDJjNDIwM2U5LCAweDE0NDBmZmVlLCAweDAsIAorMHgzMjYyMDBmZiwgMHgxNDQwMDAxMSwgMHgwLCAweDhmNDIwMzc4LCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAzNzgsIDB4OGY0MjAzNzgsIDB4OGY4MjAxMjAsIAorMHg4ZmFhMDAyYywgMHhhZmEyMDAxMCwgMHg4ZjgyMDEyNCwgMHgzYzA0MDAwMSwgCisweDI0ODQ2OWFjLCAweDNjMDUwMDA5LCAweGFmYTIwMDE0LCAweDhkNDYwMDAwLCAKKzB4MzRhNTA3MDAsIDB4YzAwMmIzYiwgMHgzYzAzODIxLCAweDhmNDIwMmVjLCAKKzB4MjQ0MjAwMDEsIDB4YWY0MjAyZWMsIDB4OGY0MjAyZWMsIDB4OGZiZjAwNDgsIAorMHg4ZmJlMDA0NCwgMHg4ZmI1MDA0MCwgMHg4ZmIzMDAzYywgMHg4ZmIyMDAzOCwgCisweDhmYjEwMDM0LCAweDhmYjAwMDMwLCAweDNlMDAwMDgsIDB4MjdiZDAwNTAsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmRhOCwgMHgyN2JkZmZlMCwgMHgxNDQwMDAwZCwgCisweGFmYmYwMDE4LCAweDNjMDQwMDAxLCAweDI0ODQ2YTBjLCAweDNjMDUwMDA4LCAKKzB4YWZhMDAwMTAsIDB4YWZhMDAwMTQsIDB4OGY4NjAyMjAsIDB4MzRhNTA3MDAsIAorMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmRhOCwgMHhjMDAyYjNiLCAKKzB4MzgyMSwgMHgzYzAyMDAwNCwgMHgyYzIxMDI0LCAweDEwNDAwMDA3LCAKKzB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDhmZiwgMHgzNDYzZmZmZiwgCisweDQzMTAyNCwgMHgzNDQyMDAwOCwgMHhhZjgyMDIyMCwgMHgzYzA1MDAwMSwgCisweDhjYTU2ZDk4LCAweDI0MDIwMDAxLCAweDE0YTIwMDA3LCAweDIwMjEsIAorMHhjMDA1MjliLCAweDI0MDUwMDAxLCAweGFjMDIwMjZjLCAweDhjMDMwMjZjLCAKKzB4MTAwMDAwMDYsIDB4M2MwMjAwMDcsIDB4YzAwNTI5YiwgMHgyMDIxLCAKKzB4YWMwMjAyNjgsIDB4OGMwMzAyNjgsIDB4M2MwMjAwMDcsIDB4NjIxODI0LCAKKzB4M2MwMjAwMDIsIDB4NTA2MjAwMGQsIDB4M2MwMjA1ZjUsIDB4NDMxMDJiLCAKKzB4MTQ0MDAwMDYsIDB4M2MwMjAwMDQsIDB4M2MwMjAwMDEsIDB4MTA2MjAwMDksIAorMHgzYzAyMDA5OCwgMHgxMDAwMDAwYiwgMHgwLCAweDE0NjIwMDA5LCAKKzB4M2MwMjNiOWEsIDB4MTAwMDAwMDQsIDB4MzQ0MmNhMDAsIDB4MTAwMDAwMDIsIAorMHgzNDQyZTEwMCwgMHgzNDQyOTY4MCwgMHhhZjQyMDFmYywgMHg4ZjQyMDFmYywgCisweGFlZTIwMDY0LCAweDhmYmYwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjAsIAorMHgwLCAweDAsIDB4MCwgMHg4NjEwMmIsIAorMHg1MDQwMDAwMSwgMHg4NzIwMjMsIDB4YzQxMDIzLCAweDI0ODQzLCAKKzB4MTI1MTAyYiwgMHgxMDQwMDAxYiwgMHg5MTA0MCwgMHg4MjQwMjEsIAorMHg4ODEwMmIsIDB4MTA0MDAwMDcsIDB4MTgyMSwgMHg5NDgyMDAwMCwgCisweDI0ODQwMDAyLCAweDYyMTgyMSwgMHg4ODEwMmIsIDB4MTQ0MGZmZmIsIAorMHgwLCAweDYwMjAyMSwgMHhjNzMwMjMsIDB4YTkxMDIzLCAKKzB4MjEwNDAsIDB4YzIyODIxLCAweGM1MTAyYiwgMHgxMDQwMDAwNywgCisweDE4MjEsIDB4OTRjMjAwMDAsIDB4MjRjNjAwMDIsIDB4NjIxODIxLCAKKzB4YzUxMDJiLCAweDE0NDBmZmZiLCAweDAsIDB4MTAwMDAwMGQsIAorMHg4MzIwMjEsIDB4NTEwNDAsIDB4ODIyODIxLCAweDg1MTAyYiwgCisweDEwNDAwMDA3LCAweDE4MjEsIDB4OTQ4MjAwMDAsIDB4MjQ4NDAwMDIsIAorMHg2MjE4MjEsIDB4ODUxMDJiLCAweDE0NDBmZmZiLCAweDAsIAorMHg2MDIwMjEsIDB4NDFjMDIsIDB4MzA4MmZmZmYsIDB4NjIyMDIxLCAKKzB4NDFjMDIsIDB4MzA4MmZmZmYsIDB4NjIyMDIxLCAweDNlMDAwMDgsIAorMHgzMDgyZmZmZiwgMHgzZTAwMDA4LCAweDAsIDB4ODAyODIxLCAKKzB4MzBhMjAwMDEsIDB4MTA0MDAwMmIsIDB4M2MwMzAwMWYsIDB4MzQ2M2ZmZmYsIAorMHgyNGEyMDAwNCwgMHg2MjEwMmIsIDB4NTQ0MDAwMDcsIDB4NjUxMDJiLCAKKzB4OTBhMjAwMDEsIDB4OTBhNDAwMDMsIDB4OTBhMzAwMDAsIDB4OTBhNTAwMDIsIAorMHgxMDAwMDAyYSwgMHg0NDEwMjEsIDB4MTA0MDAwMDMsIDB4MCwgCisweDhmNDIwMTQ4LCAweGEyMjgyMywgMHg5MGE0MDAwMCwgMHgyNGE1MDAwMSwgCisweDY1MTAyYiwgMHgxMDQwMDAwMywgMHgwLCAweDhmNDIwMTQ4LCAKKzB4YTIyODIzLCAweDkwYTIwMDAwLCAweDI0YTUwMDAxLCAweDIxMjAwLCAKKzB4ODIyMDIxLCAweDY1MTAyYiwgMHgxMDQwMDAwMywgMHgwLCAKKzB4OGY0MjAxNDgsIDB4YTIyODIzLCAweDkwYTIwMDAwLCAweDI0YTUwMDAxLCAKKzB4ODIyMDIxLCAweDY1MTAyYiwgMHgxMDQwMDAwMywgMHgwLCAKKzB4OGY0MjAxNDgsIDB4YTIyODIzLCAweDkwYTIwMDAwLCAweDEwMDAwMDJkLCAKKzB4MjEyMDAsIDB4MzQ2M2ZmZmYsIDB4MjRhMjAwMDQsIDB4NjIxMDJiLCAKKzB4NTQ0MDAwMGEsIDB4NjUxMDJiLCAweDkwYTIwMDAwLCAweDkwYTQwMDAyLCAKKzB4OTBhMzAwMDEsIDB4OTBhNTAwMDMsIDB4NDQxMDIxLCAweDIxMjAwLCAKKzB4NjUxODIxLCAweDEwMDAwMDIwLCAweDQzMjAyMSwgMHgxMDQwMDAwMywgCisweDAsIDB4OGY0MjAxNDgsIDB4YTIyODIzLCAweDkwYTIwMDAwLCAKKzB4MjRhNTAwMDEsIDB4MjIyMDAsIDB4NjUxMDJiLCAweDEwNDAwMDAzLCAKKzB4MCwgMHg4ZjQyMDE0OCwgMHhhMjI4MjMsIDB4OTBhMjAwMDAsIAorMHgyNGE1MDAwMSwgMHg4MjIwMjEsIDB4NjUxMDJiLCAweDEwNDAwMDAzLCAKKzB4MCwgMHg4ZjQyMDE0OCwgMHhhMjI4MjMsIDB4OTBhMjAwMDAsIAorMHgyNGE1MDAwMSwgMHgyMTIwMCwgMHg4MjIwMjEsIDB4NjUxMDJiLCAKKzB4MTA0MDAwMDMsIDB4MCwgMHg4ZjQyMDE0OCwgMHhhMjI4MjMsIAorMHg5MGEyMDAwMCwgMHg4MjIwMjEsIDB4NDFjMDIsIDB4MzA4MmZmZmYsIAorMHg2MjIwMjEsIDB4NDFjMDIsIDB4MzA4MmZmZmYsIDB4NjIyMDIxLCAKKzB4M2UwMDAwOCwgMHgzMDgyZmZmZiwgMHgwLCAweDhmODIwMjIwLCAKKzB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsIDB4M2MwMjAwMDIsIDB4OGM0MjhmZjgsIAorMHgzMDQyNDAwMCwgMHgxMDQwMDA1NCwgMHgyNDA0MDAwMSwgMHg4ZjgyMDIwMCwgCisweDI0MDY3ZmZmLCAweDhmODMwMjAwLCAweDMwNDUwMDAyLCAweDI0MDJmZmZkLCAKKzB4NjIxODI0LCAweGFmODMwMjAwLCAweGFmODQwMjA0LCAweDhmODMwMDU0LCAKKzB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsIAorMHg2MjEwMjMsIDB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MCwgCisweDhmODIwMjI0LCAweDE0NDQwMDRkLCAweDQyMDQwLCAweGM0MTAyYiwgCisweDEwNDBmZmYxLCAweDAsIDB4OGY4MjAyMDAsIDB4NDUxMDI1LCAKKzB4YWY4MjAyMDAsIDB4OGY4MjAyMjAsIDB4MzQ0MjgwMDAsIDB4YWY4MjAyMjAsIAorMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgMHgyNDYzMDAwMSwgCisweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgCisweDAsIDB4OGY4MjAyMjAsIDB4M2MwMzAwMDQsIDB4NDMxMDI0LCAKKzB4MTQ0MDAwMGYsIDB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzZmZmZiwgCisweDM0NjM3ZmZmLCAweDQzMTAyNCwgMHhhZjgyMDIyMCwgMHg4ZjgzMDA1NCwgCisweDhmODIwMDU0LCAweDEwMDAwMDAyLCAweDI0NjMwMDAxLCAweDhmODIwMDU0LCAKKzB4NjIxMDIzLCAweDJjNDIwMDAyLCAweDE0NDBmZmZjLCAweDAsIAorMHg4ZjgyMDIyMCwgMHgzYzAzMDAwNCwgMHg0MzEwMjQsIDB4MTQ0MDAwMGQsIAorMHgwLCAweDhmODIwMjIwLCAweDM0NDI4MDAwLCAweGFmODIwMjIwLCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwMDEsIAorMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsIAorMHgwLCAweDhmODIwMjIwLCAweDNjMDMwMDA0LCAweDQzMTAyNCwgCisweDEwNDAwMDFiLCAweDEwMjEsIDB4OGY4MzAyMjAsIDB4MjQwMjAwMDEsIAorMHgxMDAwMDAxNSwgMHgzYzA0ZjcwMCwgMHg4ZjgyMDIyMCwgMHgzYzA0ZjcwMCwgCisweDQ0MTAyNSwgMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgyNDAzZmZmZCwgCisweDQzMTAyNCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDMwMCwgCisweDQzMTAyNCwgMHgxNDQwMDAwMywgMHgwLCAweDEwMDAwMDA4LCAKKzB4MTAyMSwgMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwgMHhhZjgyMDIyMCwgCisweDhmODMwMjIwLCAweDI0MDIwMDAxLCAweDY0MTgyNSwgMHhhZjgzMDIyMCwgCisweDNlMDAwMDgsIDB4MCwgMHgyMDIxLCAweDNjMDUwMTAwLCAKKzB4MjQwMjAwMDEsIDB4YWY4MDAyMWMsIDB4YWY4MjAyMDAsIDB4YWY4MjAyMjAsIAorMHgyNzYyNTAwMCwgMHhhZjgyMDBjMCwgMHgyNzYyNTAwMCwgMHhhZjgyMDBjNCwgCisweDI3NjI1MDAwLCAweGFmODIwMGM4LCAweDI3NjI1MDAwLCAweGFmODIwMGQwLCAKKzB4Mjc2MjUwMDAsIDB4YWY4MjAwZDQsIDB4Mjc2MjUwMDAsIDB4YWY4MjAwZDgsIAorMHgyNzYyMzAwMCwgMHhhZjgyMDBlMCwgMHgyNzYyMzAwMCwgMHhhZjgyMDBlNCwgCisweDI3NjIzMDAwLCAweGFmODIwMGU4LCAweDI3NjIyODAwLCAweGFmODIwMGYwLCAKKzB4Mjc2MjI4MDAsIDB4YWY4MjAwZjQsIDB4Mjc2MjI4MDAsIDB4YWY4MjAwZjgsIAorMHg0MThjMCwgMHgyNDg0MDAwMSwgMHgzNjMxMDIxLCAweGFjNDUzMDA0LCAKKzB4MzYzMTAyMSwgMHhhYzQwMzAwMCwgMHgyODgyMDIwMCwgMHgxNDQwZmZmOSwgCisweDQxOGMwLCAweDIwMjEsIDB4NDE4YzAsIDB4MjQ4NDAwMDEsIAorMHgzNjMxMDIxLCAweGFjNDAyODA0LCAweDM2MzEwMjEsIDB4YWM0MDI4MDAsIAorMHgyODgyMDEwMCwgMHgxNDQwZmZmOSwgMHg0MThjMCwgMHhhZjgwMDIzYywgCisweDI0MDMwMDgwLCAweDI0MDQwMTAwLCAweGFjNjAwMDAwLCAweDI0NjMwMDA0LCAKKzB4NjQxMDJiLCAweDU0NDBmZmZkLCAweGFjNjAwMDAwLCAweDhmODMwMDQwLCAKKzB4M2MwMmYwMDAsIDB4NjIxODI0LCAweDNjMDI1MDAwLCAweDEwNjIwMDBjLCAKKzB4NDMxMDJiLCAweDE0NDAwMDA2LCAweDNjMDI2MDAwLCAweDNjMDI0MDAwLCAKKzB4MTA2MjAwMDgsIDB4MjQwMjA4MDAsIDB4MTAwMDAwMDgsIDB4MCwgCisweDEwNjIwMDA0LCAweDI0MDIwODAwLCAweDEwMDAwMDA0LCAweDAsIAorMHgyNDAyMDcwMCwgMHgzYzAxMDAwMSwgMHhhYzIyNmRhYywgMHgzZTAwMDA4LCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRiYywgMHgyN2JkZmZkMCwgCisweGFmYmYwMDJjLCAweGFmYjIwMDI4LCAweGFmYjEwMDI0LCAweGFmYjAwMDIwLCAKKzB4M2MwMTAwMDEsIDB4MTA0MDAwMDUsIDB4YWMyMDZkOTQsIDB4YzAwNGQ5ZSwgCisweDAsIDB4M2MwMTAwMDEsIDB4YWMyMDZkYmMsIDB4OGY4MzAwNTQsIAorMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgMHgyNDYzMDA2NCwgMHg4ZjgyMDA1NCwgCisweDYyMTAyMywgMHgyYzQyMDA2NSwgMHgxNDQwZmZmYywgMHgwLCAKKzB4YzAwNGRiOSwgMHgwLCAweDI0MDQwMDAxLCAweDI4MjEsIAorMHgyN2E2MDAxOCwgMHgzNDAyODAwMCwgMHhjMDA0NWJlLCAweGE3YTIwMDE4LCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwNjQsIAorMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwNjUsIDB4MTQ0MGZmZmMsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAwMSwgMHhjMDA0NTdjLCAweDI3YTYwMDE4LCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwNjQsIAorMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwNjUsIDB4MTQ0MGZmZmMsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAwMSwgMHhjMDA0NTdjLCAweDI3YTYwMDE4LCAKKzB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwNjQsIAorMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwNjUsIDB4MTQ0MGZmZmMsIAorMHgyNDA0MDAwMSwgMHgzYzA2MDAwMSwgMHgyNGM2NmYyNCwgMHhjMDA0NTdjLCAKKzB4MjQwNTAwMDIsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIAorMHgyNDYzMDA2NCwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwNjUsIAorMHgxNDQwZmZmYywgMHgyNDA0MDAwMSwgMHgyNDA1MDAwMywgMHgzYzEwMDAwMSwgCisweDI2MTA2ZjI2LCAweGMwMDQ1N2MsIDB4MjAwMzAyMSwgMHg5N2E2MDAxOCwgCisweDNjMDcwMDAxLCAweDk0ZTc2ZjI0LCAweDNjMDQwMDAxLCAweDI0ODQ2YWUwLCAKKzB4YWZhMDAwMTQsIDB4OTYwMjAwMDAsIDB4M2MwNTAwMGQsIDB4MzRhNTAxMDAsIAorMHhjMDAyYjNiLCAweGFmYTIwMDEwLCAweDk3YTIwMDE4LCAweDEwNDAwMDRkLCAKKzB4MjQwMzYwNDAsIDB4OTYwMjAwMDAsIDB4MzA0MmZmZjAsIDB4MTQ0MzAwMGMsIAorMHgyNDAyMDAyMCwgMHgzYzAzMDAwMSwgMHg5NDYzNmYyNCwgMHgxNDYyMDAwYiwgCisweDI0MDI3ODMwLCAweDI0MDIwMDAzLCAweDNjMDEwMDAxLCAweGFjMjI2ZDk0LCAKKzB4MjQwMjAwMDUsIDB4M2MwMTAwMDEsIDB4MTAwMDAwM2YsIDB4YWMyMjZmMzQsIAorMHgzYzAzMDAwMSwgMHg5NDYzNmYyNCwgMHgyNDAyNzgzMCwgMHgxNDYyMDAwYywgCisweDI0MDMwMDEwLCAweDNjMDIwMDAxLCAweDk0NDI2ZjI2LCAweDMwNDJmZmYwLCAKKzB4MTQ0MzAwMDcsIDB4MjQwMjAwMDMsIDB4M2MwMTAwMDEsIDB4YWMyMjZkOTQsIAorMHgyNDAyMDAwNiwgMHgzYzAxMDAwMSwgMHgxMDAwMDAyZiwgMHhhYzIyNmYzNCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZDk0LCAweDNjMDMwMDAxLCAweDk0NjM2ZjI0LCAKKzB4MzQ0MjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjZkOTQsIDB4MjQwMjAwMTUsIAorMHgxNDYyMDAwYiwgMHgwLCAweDNjMDIwMDAxLCAweDk0NDI2ZjI2LCAKKzB4MzA0MmZmZjAsIDB4Mzg0M2Y0MjAsIDB4MmM2MzAwMDEsIDB4Mzg0MmY0MzAsIAorMHgyYzQyMDAwMSwgMHg2MjE4MjUsIDB4MTQ2MDAwMWIsIDB4MjQwMjAwMDMsIAorMHgzYzAzMDAwMSwgMHg5NDYzNmYyNCwgMHgyNDAyNzgxMCwgMHgxNDYyMDAxNiwgCisweDI0MDIwMDAyLCAweDNjMDIwMDAxLCAweDk0NDI2ZjI2LCAweDMwNDJmZmYwLCAKKzB4MTQ0MDAwMTEsIDB4MjQwMjAwMDIsIDB4MTAwMDAwMGYsIDB4MjQwMjAwMDQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmQ5NCwgMHgzNDQyMDAwOCwgMHgzYzAxMDAwMSwgCisweGFjMjI2ZDk0LCAweDEwMDAwMDVlLCAweDI0MDIwMDA0LCAweDNjMDIwMDAxLCAKKzB4OGM0MjZkOTQsIDB4MzQ0MjAwMDQsIDB4M2MwMTAwMDEsIDB4MTAwMDAwYWYsIAorMHhhYzIyNmQ5NCwgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmY0MCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZDk0LCAweDMwNDIwMDAyLCAweDE0NDAwMGIyLCAKKzB4M2MwOWZmZjAsIDB4MjQwMjBlMDAsIDB4YWY4MjAyMzgsIDB4OGY4NDAwNTQsIAorMHg4ZjgyMDA1NCwgMHgyNDAzMDAwOCwgMHgzYzAxMDAwMSwgMHhhYzIzNmQ5OCwgCisweDEwMDAwMDAyLCAweDI0ODQwMWY0LCAweDhmODIwMDU0LCAweDgyMTAyMywgCisweDJjNDIwMWY1LCAweDE0NDBmZmZjLCAweDNjMDIwMGM4LCAweDM0NDIwMWZiLCAKKzB4YWY4MjAyMzgsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIAorMHgyNDYzMDFmNCwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAxZjUsIAorMHgxNDQwZmZmYywgMHg4MDIxLCAweDI0MTIwMDAxLCAweDI0MTEwMDA5LCAKKzB4YzAwNDQ4MiwgMHgwLCAweDNjMDEwMDAxLCAweGFjMzI2ZGI0LCAKKzB4YzAwNDU0NywgMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZGI0LCAKKzB4MTQ1MWZmZmIsIDB4M2MwMjAwYzgsIDB4MzQ0MjAxZjYsIDB4YWY4MjAyMzgsIAorMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgMHgyNDYzMDAwYSwgCisweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwYiwgMHgxNDQwZmZmYywgCisweDAsIDB4OGY4MjAyMjAsIDB4MjQwNDAwMDEsIDB4MzQ0MjAwMDIsIAorMHhhZjgyMDIyMCwgMHg4ZjgzMDIwMCwgMHgyNDA1N2ZmZiwgMHgyNDAyZmZmZCwgCisweDYyMTgyNCwgMHhhZjgzMDIwMCwgMHhhZjg0MDIwNCwgMHg4ZjgzMDA1NCwgCisweDhmODIwMDU0LCAweDEwMDAwMDAyLCAweDI0NjMwMDAxLCAweDhmODIwMDU0LCAKKzB4NjIxMDIzLCAweDJjNDIwMDAyLCAweDE0NDBmZmZjLCAweDAsIAorMHg4ZjgyMDIyNCwgMHgxNDQ0MDAwNSwgMHgzNDAyODAwMCwgMHg0MjA0MCwgCisweGE0MTAyYiwgMHgxMDQwZmZmMCwgMHgzNDAyODAwMCwgMHgxMDgyZmZhMCwgCisweDI2MTAwMDAxLCAweDJlMDIwMDE0LCAweDE0NDBmZmNkLCAweDI0MDIwMDA0LCAKKzB4M2MwMTAwMDEsIDB4YWMyMjZkOTgsIDB4ODAyMSwgMHgyNDEyMDAwOSwgCisweDNjMTFmZmZmLCAweDM2MzEzZjdmLCAweGMwMDQ0ODIsIDB4MCwgCisweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI2ZGI0LCAweGMwMDQ1NDcsIAorMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZGI0LCAweDE0NTJmZmZiLCAKKzB4MCwgMHg4ZjgyMDA0NCwgMHg1MTEwMjQsIDB4MzQ0MjUwODAsIAorMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgCisweDI0NjMwMDBhLCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwYiwgCisweDE0NDBmZmZjLCAweDAsIDB4OGY4MjAwNDQsIDB4NTExMDI0LCAKKzB4MzQ0MmYwODAsIDB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIAorMHgxMDAwMDAwMiwgMHgyNDYzMDAwYSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIAorMHgyYzQyMDAwYiwgMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMjIwLCAKKzB4M2MwM2Y3MDAsIDB4NDMxMDI1LCAweGFmODIwMjIwLCAweDhmODMwMDU0LCAKKzB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwNjQsIDB4OGY4MjAwNTQsIAorMHg2MjEwMjMsIDB4MmM0MjAwNjUsIDB4MTQ0MGZmZmMsIDB4MCwgCisweDhmODIwMjIwLCAweDI0MDQwMDAxLCAweDM0NDIwMDAyLCAweGFmODIwMjIwLCAKKzB4OGY4MzAyMDAsIDB4MjQwNTdmZmYsIDB4MjQwMmZmZmQsIDB4NjIxODI0LCAKKzB4YWY4MzAyMDAsIDB4YWY4NDAyMDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIAorMHgxMDAwMDAwMiwgMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIAorMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMjI0LCAKKzB4MTQ0NDAwMDUsIDB4MzQwMjgwMDAsIDB4NDIwNDAsIDB4YTQxMDJiLCAKKzB4MTA0MGZmZjAsIDB4MzQwMjgwMDAsIDB4MTA4MmZmNTAsIDB4MjYxMDAwMDEsIAorMHgyZTAyMDA2NCwgMHgxNDQwZmZiMCwgMHgwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjZkOTQsIDB4MzA0MjAwMDQsIDB4MTQ0MDAwMDcsIDB4M2MwOWZmZjAsIAorMHg4ZjgyMDA0NCwgMHgzYzAzZmZmZiwgMHgzNDYzM2Y3ZiwgMHg0MzEwMjQsIAorMHhhZjgyMDA0NCwgMHgzYzA5ZmZmMCwgMHgzNTI5YmRjMCwgMHgzYzA2MDAwMSwgCisweDhjYzY2ZDk0LCAweDNjMDQwMDAxLCAweDI0ODQ2YWUwLCAweDI0MDIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4YWMyMjZkOWMsIDB4OGY4MjAwNTQsIDB4M2MwNzAwMDEsIAorMHg4Y2U3NmY0MCwgMHgzYzAzMDAwMSwgMHg5NDYzNmYyNCwgMHgzYzA4MDAwMSwgCisweDk1MDg2ZjI2LCAweDNjMDUwMDBkLCAweDM0YTUwMTAwLCAweDNjMDEwMDAxLCAKKzB4YWMyMDZkOTgsIDB4NDkxMDIxLCAweDNjMDEwMDAxLCAweGFjMjI2ZjMwLCAKKzB4YWZhMzAwMTAsIDB4YzAwMmIzYiwgMHhhZmE4MDAxNCwgMHg4ZmJmMDAyYywgCisweDhmYjIwMDI4LCAweDhmYjEwMDI0LCAweDhmYjAwMDIwLCAweDNlMDAwMDgsIAorMHgyN2JkMDAzMCwgMHgyN2JkZmZlOCwgMHgzYzA1MDAwMSwgMHg4Y2E1NmQ5OCwgCisweDI0MDYwMDA0LCAweDI0MDIwMDAxLCAweDE0YTIwMDE0LCAweGFmYmYwMDEwLCAKKzB4M2MwMjAwMDIsIDB4OGM0MjhmZmMsIDB4MzA0MjgwMDAsIDB4MTA0MDAwMDUsIAorMHgzYzA0MDAwZiwgMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwgMHgxMDAwMDAwNSwgCisweDM0ODQ0MjQwLCAweDNjMDQwMDA0LCAweDNjMDMwMDAxLCAweDhjNjM2ZjQwLCAKKzB4MzQ4NDkzZTAsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwMTYsIDB4MCwgCisweDNjMDQwMDNkLCAweDEwMDAwMDEzLCAweDM0ODQwOTAwLCAweDNjMDIwMDAyLCAKKzB4OGM0MjhmZjgsIDB4MzA0MjgwMDAsIDB4MTA0MDAwMDUsIDB4M2MwNDAwMWUsIAorMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwgMHgxMDAwMDAwNSwgMHgzNDg0ODQ4MCwgCisweDNjMDQwMDBmLCAweDNjMDMwMDAxLCAweDhjNjM2ZjQwLCAweDM0ODQ0MjQwLCAKKzB4MjQwMjAwMDUsIDB4MTQ2MjAwMDMsIDB4MCwgMHgzYzA0MDA3YSwgCisweDM0ODQxMjAwLCAweDNjMDIwMDAxLCAweDhjNDI2ZjMwLCAweDhmODMwMDU0LCAKKzB4NDQxMDIxLCAweDQzMTAyMywgMHg0NDEwMmIsIDB4MTQ0MDAwNGMsIAorMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZGEwLCAweDE0NDAwMDQ4LCAKKzB4MCwgMHgzYzAxMDAwMSwgMHgxMGMwMDAyNSwgMHhhYzIwNmRiMCwgCisweDNjMDkwMDAxLCAweDhkMjk2ZDk0LCAweDI0MDcwMDAxLCAweDNjMDQ0MDAwLCAKKzB4M2MwODAwMDIsIDB4MjUwODhmZmMsIDB4MjUwYWZmZmMsIDB4NTI4NDIsIAorMHgxNGEwMDAwMiwgMHgyNGM2ZmZmZiwgMHgyNDA1MDAwOCwgMHhhOTEwMjQsIAorMHgxMDQwMDAxMCwgMHgwLCAweDE0YTcwMDA4LCAweDAsIAorMHg4ZDAyMDAwMCwgMHg0NDEwMjQsIDB4MTA0MDAwMGEsIDB4MCwgCisweDNjMDEwMDAxLCAweDEwMDAwMDA3LCAweGFjMjU2ZGIwLCAweDhkNDIwMDAwLCAKKzB4NDQxMDI0LCAweDEwNDAwMDAzLCAweDAsIDB4M2MwMTAwMDEsIAorMHhhYzI3NmRiMCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRiMCwgMHg2MTgyYiwgCisweDJjNDIwMDAxLCAweDQzMTAyNCwgMHg1NDQwZmZlNSwgMHg1Mjg0MiwgCisweDhmODIwMDU0LCAweDNjMDMwMDAxLCAweDhjNjM2ZGIwLCAweDNjMDEwMDAxLCAKKzB4YWMyMjZmMzAsIDB4MTA2MDAwM2IsIDB4MjQwMjAwMDUsIDB4M2MwMzAwMDEsIAorMHg4YzYzNmY0MCwgMHgzYzAxMDAwMSwgMHhhYzI1NmQ5OCwgMHgxNDYyMDAxMiwgCisweDI0MDIwMDAxLCAweDNjMDIwMDAyLCAweDhjNDI4ZmY4LCAweDNjMDMyMDAwLCAKKzB4MzQ2MzUwMDAsIDB4NDMxMDI0LCAweDE0NDAwMDA2LCAweDI0MDIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4YWMyMDZmMWMsIDB4M2MwMTAwMDEsIDB4YWMyMjZkOTgsIAorMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmUyNCwgMHgzYzAxMDAwMSwgCisweGFjMjI2ZGE0LCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI2ZDljLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZkYjAsIDB4MTA0MDAwMWUsIDB4MCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZDljLCAweDEwNDAwMDA4LCAweDI0MDIwMDAxLCAKKzB4M2MwMTAwMDEsIDB4YWMyMDZkOWMsIDB4YWVlMjA0YjgsIDB4M2MwMTAwMDEsIAorMHhhYzIwNmUxYywgMHgzYzAxMDAwMSwgMHhhYzIyNmRkNCwgMHg4ZWUzMDRiOCwgCisweDI0MDIwMDA4LCAweDEwNjIwMDA1LCAweDI0MDIwMDAxLCAweGMwMDQyMzksIAorMHgwLCAweDEwMDAwMDBiLCAweDAsIDB4M2MwMzAwMDEsIAorMHg4YzYzNmQ5OCwgMHgxMDYyMDAwNywgMHgyNDAyMDAwZSwgMHgzYzAzMDAwMiwgCisweDhjNjM4ZjkwLCAweDEwNjIwMDAzLCAweDAsIDB4YzAwNGU5YywgCisweDhmODQwMjIwLCAweDhmYmYwMDEwLCAweDNlMDAwMDgsIDB4MjdiZDAwMTgsIAorMHgyN2JkZmZlMCwgMHgzYzAzZmRmZiwgMHgzYzA0MDAwMSwgMHg4Yzg0NmQ5OCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZGMwLCAweDM0NjNmZmZmLCAweDI4M2EwMjQsIAorMHgxNDgyMDAwNiwgMHhhZmJmMDAxOCwgMHg4ZWUzMDRiOCwgMHgzYzAyMDAwMSwgCisweDhjNDI2ZGM0LCAweDEwNjIwMDA2LCAweDAsIDB4OGVlMjA0YjgsIAorMHgzYzAxMDAwMSwgMHhhYzI0NmRjMCwgMHgzYzAxMDAwMSwgMHhhYzIyNmRjNCwgCisweDNjMDMwMDAxLCAweDhjNjM2ZDk4LCAweDI0MDIwMDAyLCAweDEwNjIwMTljLCAKKzB4MmM2MjAwMDMsIDB4MTA0MDAwMDUsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMGEsIAorMHgwLCAweDEwMDAwMjI2LCAweDAsIDB4MjQwMjAwMDQsIAorMHgxMDYyMDBiNiwgMHgyNDAyMDAwOCwgMHgxMDYyMDEwYSwgMHgyNDAyMDAwMSwgCisweDEwMDAwMjFmLCAweDAsIDB4OGVlMjA0YjgsIDB4MjQ0M2ZmZmYsIAorMHgyYzYyMDAwOCwgMHgxMDQwMDIxYywgMHgzMTA4MCwgMHgzYzAxMDAwMSwgCisweDIyMDgyMSwgMHg4YzIyNmFmOCwgMHg0MDAwMDgsIDB4MCwgCisweDNjMDMwMDAxLCAweDhjNjM2ZjQwLCAweDI0MDIwMDA1LCAweDE0NjIwMDEwLCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRhNCwgMHgxMDQwMDAwOCwgCisweDI0MDIwMDAzLCAweGMwMDQ0ODIsIDB4MCwgMHgyNDAyMDAwMiwgCisweGFlZTIwNGI4LCAweDNjMDEwMDAxLCAweDEwMDAwMDAyLCAweGFjMjA2ZGE0LCAKKzB4YWVlMjA0YjgsIDB4M2MwMTAwMDEsIDB4MTAwMDAyMDMsIDB4YWMyMDZkMzAsIAorMHhjMDA0NDgyLCAweDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZkYTQsIAorMHgzYzAxMDAwMSwgMHhhYzIwNmQzMCwgMHgxNDQwMDE3YSwgMHgyNDAyMDAwMiwgCisweDEwMDAwMTlkLCAweDI0MDIwMDA3LCAweDNjMDMwMDAxLCAweDhjNjM2ZjQwLCAKKzB4MjQwMjAwMDUsIDB4MTQ2MjAwMDMsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIAorMHhhYzIyNmRkMCwgMHhjMDA0NWZmLCAweDAsIDB4M2MwMzAwMDEsIAorMHg4YzYzNmRkMCwgMHgxMDAwMDE3NCwgMHgyNDAyMDAxMSwgMHgzYzA1MDAwMSwgCisweDhjYTU2ZDk4LCAweDNjMDYwMDAyLCAweDhjYzY4ZmZjLCAweGMwMDUxMDQsIAorMHgyMDIxLCAweDI0MDIwMDA1LCAweDNjMDEwMDAxLCAweGFjMjA2ZGE0LCAKKzB4MTAwMDAxZTEsIDB4YWVlMjA0YjgsIDB4M2MwNDAwMDEsIDB4MjQ4NDZhZWMsIAorMHgzYzA1MDAwZiwgMHgzNGE1MDEwMCwgMHgzMDIxLCAweDM4MjEsIAorMHhhZmEwMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDEwMDAwMWQ2LCAKKzB4MCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDAwNCwgMHg0MzEwMjQsIAorMHgxNDQwMDE3NSwgMHgyNDAyMDAwNywgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgCisweDhjNDI2ZjI4LCAweDI0NjNkOGYwLCAweDQzMTAyMywgMHgyYzQyMjcxMCwgCisweDE0NDAwMDAzLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLCAweGFjMjI2ZDljLCAKKzB4M2MwMjAwMDIsIDB4OGM0MjhmZmMsIDB4MzA0MjUwMDAsIDB4MTA0MDAxYzIsIAorMHgwLCAweDhmODIwMjIwLCAweDMwNDI4MDAwLCAweDEwNDAwMTdkLCAKKzB4MCwgMHgxMDAwMDE3NSwgMHgwLCAweDNjMDUwMDAxLCAKKzB4OGNhNTZkOTgsIDB4YzAwNTI5YiwgMHgyMDIxLCAweGMwMDU1MWIsIAorMHgyMDIxLCAweDNjMDMwMDAyLCAweDhjNjM4ZmY0LCAweDQ2MTAxYjAsIAorMHgyNDAyMDAwMSwgMHgzYzAyMDAwOCwgMHg2MjEwMjQsIDB4MTA0MDAwMDYsIAorMHgwLCAweDhmODIwMjE0LCAweDNjMDNmZmZmLCAweDQzMTAyNCwgCisweDEwMDAwMDA1LCAweDM0NDIyNTFmLCAweDhmODIwMjE0LCAweDNjMDNmZmZmLCAKKzB4NDMxMDI0LCAweDM0NDIyNDFmLCAweGFmODIwMjE0LCAweDhmODIwMjIwLCAKKzB4M2MwMzAyMDAsIDB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsIDB4MjQwMjAwMDgsIAorMHhhZWUyMDRiOCwgMHg4ZjgyMDIyMCwgMHgyODNhMDI1LCAweDNjMDMwMDA0LCAKKzB4NDMxMDI0LCAweDE0NDAwMDE2LCAweDAsIDB4M2MwMjAwMDIsIAorMHg4YzQyOGZmYywgMHgzMDQyNTAwMCwgMHgxMDQwMDAwZCwgMHgwLCAKKzB4OGY4MjAyMjAsIDB4MzA0MjgwMDAsIDB4MTA0MDAwMDYsIDB4MCwgCisweDhmODIwMjIwLCAweDNjMDNmZmZmLCAweDM0NjM3ZmZmLCAweDEwMDAwMDAzLCAKKzB4NDMxMDI0LCAweDhmODIwMjIwLCAweDM0NDI4MDAwLCAweGFmODIwMjIwLCAKKzB4OGY4MjAyMjAsIDB4M2MwM2Y3MDAsIDB4NDMxMDI1LCAweGFmODIwMjIwLCAKKzB4M2MwMzAwMDEsIDB4OGM2MzZmNDAsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwMGEsIAorMHgwLCAweDNjMDIwMDAxLCAweDk0NDI2ZjI2LCAweDI0NDI5ZmJjLCAKKzB4MmM0MjAwMDQsIDB4MTA0MDAwMDQsIDB4MjQwNDAwMTgsIDB4MjQwNTAwMDIsIAorMHhjMDA0ZGRiLCAweDI0MDYwMDIwLCAweGMwMDNlNmQsIDB4MCwgCisweDNjMDEwMDAxLCAweDEwMDAwMTcwLCAweGFjMjA2ZTIwLCAweDhlZTIwNGI4LCAKKzB4MjQ0M2ZmZmYsIDB4MmM2MjAwMDgsIDB4MTA0MDAxNmIsIDB4MzEwODAsIAorMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjZiMTgsIDB4NDAwMDA4LCAKKzB4MCwgMHhjMDA0NTQ3LCAweDAsIDB4M2MwMzAwMDEsIAorMHg4YzYzNmRiNCwgMHgxMDAwMDBlOCwgMHgyNDAyMDAwOSwgMHgzYzAyMDAwMiwgCisweDhjNDI4ZmY4LCAweDMwNDI0MDAwLCAweDEwNDAwMDA0LCAweDAsIAorMHg4ZjgyMDA0NCwgMHgxMDAwMDAwNiwgMHgzNDQyZjA4MCwgMHg4ZjgyMDA0NCwgCisweDNjMDNmZmZmLCAweDM0NjMzZjdmLCAweDQzMTAyNCwgMHgzNDQyYTA4MCwgCisweGFmODIwMDQ0LCAweDhmODMwMDU0LCAweDEwMDAwMGVhLCAweDI0MDIwMDA0LCAKKzB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMjgsIDB4MjQ2M2Q4ZjAsIAorMHg0MzEwMjMsIDB4MmM0MjI3MTAsIDB4MTQ0MDAxNDcsIDB4MjQwMjAwMDUsIAorMHgxMDAwMDBkOCwgMHgwLCAweDhmODIwMjIwLCAweDNjMDNmNzAwLCAKKzB4NDMxMDI1LCAweGFmODIwMjIwLCAweGFmODAwMjA0LCAweDNjMDEwMDAyLCAKKzB4MTAwMDAwZDYsIDB4YWMyMDhmZTAsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIAorMHg4YzQyNmYyOCwgMHgyNDYzZmZmNiwgMHg0MzEwMjMsIDB4MmM0MjAwMGEsIAorMHgxNDQwMDEzNSwgMHgyNDAyMDAwNywgMHgxMDAwMDBkNywgMHgwLCAKKzB4YzAwM2Y1MCwgMHgwLCAweDEwNDAwMTJkLCAweDI0MDIwMDAxLCAKKzB4OGY4MjAyMTQsIDB4M2MwM2ZmZmYsIDB4M2MwNDAwMDEsIDB4OGM4NDZmMWMsIAorMHg0MzEwMjQsIDB4MzQ0MjI1MWYsIDB4YWY4MjAyMTQsIDB4MjQwMjAwMDgsIAorMHgxMDgwMDAwNSwgMHhhZWUyMDRiOCwgMHgzYzAyMDAwMSwgMHg4YzQyNmU0NCwgCisweDEwNDAwMDY0LCAweDI0MDIwMDAxLCAweDhmODIwMjIwLCAweDNjMDMwMDA4LCAKKzB4NDMxMDI0LCAweDEwNDAwMDZhLCAweDNjMDIwMjAwLCAweDEwMDAwMDc4LCAKKzB4MCwgMHg4ZWUyMDRiOCwgMHgyNDQzZmZmZiwgMHgyYzYyMDAwNywgCisweDEwNDAwMTE1LCAweDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgCisweDhjMjI2YjM4LCAweDQwMDAwOCwgMHgwLCAweGMwMDNkYWYsIAorMHgwLCAweDNjMDEwMDAxLCAweGFjMjA2ZDljLCAweGFmODAwMjA0LCAKKzB4M2MwMTAwMDIsIDB4YzAwNDQ4MiwgMHhhYzIwOGZlMCwgMHgyNDAyMDAwMSwgCisweDNjMDEwMDAxLCAweGFjMjI2ZGI0LCAweDI0MDIwMDAyLCAweDEwMDAwMTAyLCAKKzB4YWVlMjA0YjgsIDB4YzAwNDU0NywgMHgwLCAweDNjMDMwMDAxLCAKKzB4OGM2MzZkYjQsIDB4MTAwMDAwODQsIDB4MjQwMjAwMDksIDB4M2MwMjAwMDIsIAorMHg4YzQyOGZmOCwgMHgzMDQyNDAwMCwgMHgxMDQwMDAwMywgMHgzYzAyMDBjOCwgCisweDEwMDAwMDAyLCAweDM0NDIwMWY2LCAweDM0NDIwMWZlLCAweGFmODIwMjM4LCAKKzB4OGY4MzAwNTQsIDB4MTAwMDAwOGIsIDB4MjQwMjAwMDQsIDB4OGY4MzAwNTQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmYyOCwgMHgyNDYzZDhmMCwgMHg0MzEwMjMsIAorMHgyYzQyMjcxMCwgMHgxNDQwMDBlOCwgMHgyNDAyMDAwNSwgMHgxMDAwMDA3OSwgCisweDAsIDB4OGY4MjAyMjAsIDB4M2MwM2Y3MDAsIDB4NDMxMDI1LCAKKzB4YWY4MjAyMjAsIDB4YWY4MDAyMDQsIDB4M2MwMTAwMDIsIDB4MTAwMDAwNzcsIAorMHhhYzIwOGZlMCwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMSwgMHg4YzQyNmYyOCwgCisweDI0NjNmZmY2LCAweDQzMTAyMywgMHgyYzQyMDAwYSwgMHgxNDQwMDBkNiwgCisweDI0MDIwMDA3LCAweDEwMDAwMDc4LCAweDAsIDB4YzAwM2Y1MCwgCisweDAsIDB4MTA0MDAwY2UsIDB4MjQwMjAwMDEsIDB4OGY4MjAyMTQsIAorMHgzYzAzZmZmZiwgMHgzYzA0MDAwMSwgMHg4Yzg0NmYxYywgMHg0MzEwMjQsIAorMHgzNDQyMjUxZiwgMHhhZjgyMDIxNCwgMHgyNDAyMDAwOCwgMHgxMDgwMDAwZiwgCisweGFlZTIwNGI4LCAweDNjMDIwMDAxLCAweDhjNDI2ZTQ0LCAweDE0NDAwMDBiLCAKKzB4MCwgMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwgMHhhZjgyMDIyMCwgCisweDI0MDIwMDAxLCAweDNjMDEwMDAyLCAweGFjMjI4ZjkwLCAweGMwMDRlOWMsIAorMHg4Zjg0MDIyMCwgMHgxMDAwMDAxNiwgMHgwLCAweDhmODIwMjIwLCAKKzB4M2MwMzAwMDgsIDB4NDMxMDI0LCAweDE0NDAwMDExLCAweDNjMDIwMjAwLCAKKzB4MjgyYTAyNSwgMHgyNDAyMDAwZSwgMHgzYzAxMDAwMiwgMHhhYzIyOGY5MCwgCisweGMwMDU1MWIsIDB4MjAyMSwgMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwgCisweGMwMDNlNmQsIDB4YWY4MjAyMjAsIDB4M2MwNTAwMDEsIDB4OGNhNTZkOTgsIAorMHhjMDA1MjliLCAweDIwMjEsIDB4MTAwMDAwYTMsIDB4MCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZTQ0LCAweDEwNDAwMDlmLCAweDAsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmU0MCwgMHgyNDQyZmZmZiwgMHgzYzAxMDAwMSwgCisweGFjMjI2ZTQwLCAweDE0NDAwMDk4LCAweDI0MDIwMDAyLCAweDNjMDEwMDAxLCAKKzB4YWMyMDZlNDQsIDB4M2MwMTAwMDEsIDB4MTAwMDAwOTMsIDB4YWMyMjZlNDAsIAorMHg4ZWUyMDRiOCwgMHgyNDQzZmZmZiwgMHgyYzYyMDAwNywgMHgxMDQwMDA4ZSwgCisweDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNmI1OCwgCisweDQwMDAwOCwgMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZGE0LCAKKzB4MTA0MDAwMTgsIDB4MjQwMjAwMDUsIDB4YzAwNDQ4MiwgMHgwLCAKKzB4MjQwMjAwMDIsIDB4YWVlMjA0YjgsIDB4M2MwMTAwMDEsIDB4MTAwMDAwN2UsIAorMHhhYzIwNmRhNCwgMHhjMDA0OTYzLCAweDAsIDB4M2MwMzAwMDEsIAorMHg4YzYzNmRkNCwgMHgyNDAyMDAwNiwgMHgxNDYyMDA3NywgMHgyNDAyMDAwMywgCisweDEwMDAwMDc1LCAweGFlZTIwNGI4LCAweDNjMDUwMDAxLCAweDhjYTU2ZDk4LCAKKzB4M2MwNjAwMDIsIDB4OGNjNjhmZjgsIDB4YzAwNTEwNCwgMHgyMDIxLCAKKzB4MjQwMjAwMDUsIDB4MTAwMDAwNmMsIDB4YWVlMjA0YjgsIDB4OGY4MjAyMjAsIAorMHgzYzAzZjcwMCwgMHg0MzEwMjUsIDB4YWY4MjAyMjAsIDB4OGY4MzAwNTQsIAorMHgyNDAyMDAwNiwgMHhhZWUyMDRiOCwgMHgzYzAxMDAwMSwgMHgxMDAwMDA2MiwgCisweGFjMjM2ZjI4LCAweDhmODIwMjIwLCAweDNjMDMwMDA0LCAweDQzMTAyNCwgCisweDEwNDAwMDAzLCAweDI0MDIwMDA3LCAweDEwMDAwMDViLCAweGFlZTIwNGI4LCAKKzB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMjgsIDB4MjQ2M2Q4ZjAsIAorMHg0MzEwMjMsIDB4MmM0MjI3MTAsIDB4MTQ0MDAwMDMsIDB4MjQwMjAwMDEsIAorMHgzYzAxMDAwMSwgMHhhYzIyNmQ5YywgMHgzYzAyMDAwMiwgMHg4YzQyOGZmOCwgCisweDMwNDI1MDAwLCAweDEwNDAwMDRjLCAweDAsIDB4OGY4MjAyMjAsIAorMHgzMDQyODAwMCwgMHgxMDQwMDAwNywgMHgwLCAweDhmODIwMjIwLCAKKzB4M2MwM2ZmZmYsIDB4MzQ2MzdmZmYsIDB4NDMxMDI0LCAweDEwMDAwMDQyLCAKKzB4YWY4MjAyMjAsIDB4OGY4MjAyMjAsIDB4MzQ0MjgwMDAsIDB4MTAwMDAwM2UsIAorMHhhZjgyMDIyMCwgMHgzYzA1MDAwMSwgMHg4Y2E1NmQ5OCwgMHhjMDA1MjliLCAKKzB4MjAyMSwgMHhjMDA1NTFiLCAweDIwMjEsIDB4M2MwMjAwMDIsIAorMHg4YzQyOGZmMCwgMHg0NDEwMDMyLCAweDI0MDIwMDAxLCAweDhmODIwMjE0LCAKKzB4M2MwM2ZmZmYsIDB4NDMxMDI0LCAweDM0NDIyNTFmLCAweGFmODIwMjE0LCAKKzB4MjQwMjAwMDgsIDB4YWVlMjA0YjgsIDB4OGY4MjAyMjAsIDB4MzQ0MjAwMDIsIAorMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgMHgzYzAzMDAwNCwgMHg0MzEwMjQsIAorMHgxNDQwMDAxNiwgMHgwLCAweDNjMDIwMDAyLCAweDhjNDI4ZmY4LCAKKzB4MzA0MjUwMDAsIDB4MTA0MDAwMGQsIDB4MCwgMHg4ZjgyMDIyMCwgCisweDMwNDI4MDAwLCAweDEwNDAwMDA2LCAweDAsIDB4OGY4MjAyMjAsIAorMHgzYzAzZmZmZiwgMHgzNDYzN2ZmZiwgMHgxMDAwMDAwMywgMHg0MzEwMjQsIAorMHg4ZjgyMDIyMCwgMHgzNDQyODAwMCwgMHhhZjgyMDIyMCwgMHg4ZjgyMDIyMCwgCisweDNjMDNmNzAwLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwgMHgzYzAyMDAwMSwgCisweDk0NDI2ZjI2LCAweDI0NDI5ZmJjLCAweDJjNDIwMDA0LCAweDEwNDAwMDA0LCAKKzB4MjQwNDAwMTgsIDB4MjQwNTAwMDIsIDB4YzAwNGRkYiwgMHgyNDA2MDAyMCwgCisweGMwMDNlNmQsIDB4MCwgMHgxMDAwMDAwMywgMHgwLCAKKzB4M2MwMTAwMDEsIDB4YWMyMjZkOWMsIDB4OGZiZjAwMTgsIDB4M2UwMDAwOCwgCisweDI3YmQwMDIwLCAweDhmODIwMjAwLCAweDhmODIwMjIwLCAweDhmODIwMjIwLCAKKzB4MzQ0MjAwMDQsIDB4YWY4MjAyMjAsIDB4OGY4MjAyMDAsIDB4M2MwNTAwMDEsIAorMHg4Y2E1NmQ5OCwgMHgzNDQyMDAwNCwgMHhhZjgyMDIwMCwgMHgyNDAyMDAwMiwgCisweDEwYTIwMDRiLCAweDJjYTIwMDAzLCAweDEwNDAwMDA1LCAweDI0MDIwMDAxLCAKKzB4MTBhMjAwMGEsIDB4MCwgMHgxMDAwMDBiMSwgMHgwLCAKKzB4MjQwMjAwMDQsIDB4MTBhMjAwNzIsIDB4MjQwMjAwMDgsIDB4MTBhMjAwODUsIAorMHgzYzAyZjBmZiwgMHgxMDAwMDBhYSwgMHgwLCAweDhmODMwMDUwLCAKKzB4M2MwMmYwZmYsIDB4MzQ0MmZmZmYsIDB4M2MwNDAwMDEsIDB4OGM4NDZmNDAsIAorMHg2MjE4MjQsIDB4M2MwMjA3MDAsIDB4NjIxODI1LCAweDI0MDIwZTAwLCAKKzB4MjQ4NGZmZmIsIDB4MmM4NDAwMDIsIDB4YWY4MzAwNTAsIDB4YWY4NTAyMDAsIAorMHhhZjg1MDIyMCwgMHgxNDgwMDAwNiwgMHhhZjgyMDIzOCwgMHg4ZjgyMDA0NCwgCisweDNjMDNmZmZmLCAweDM0NjMzZjdmLCAweDQzMTAyNCwgMHhhZjgyMDA0NCwgCisweDNjMDMwMDAxLCAweDhjNjM2ZjQwLCAweDI0MDIwMDA1LCAweDE0NjIwMDA0LCAKKzB4MCwgMHg4ZjgyMDA0NCwgMHgzNDQyNTAwMCwgMHhhZjgyMDA0NCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZDg4LCAweDNjMDMwMDAxLCAweDhjNjM2ZjQwLCAKKzB4MzQ0MjAwMjIsIDB4MjQ2M2ZmZmMsIDB4MmM2MzAwMDIsIDB4MTQ2MDAwMGMsIAorMHhhZjgyMDIwMCwgMHgzYzAyMDAwMSwgMHg4YzQyNmRhYywgMHgzYzAzMDAwMSwgCisweDhjNjM2ZDkwLCAweDNjMDQwMDAxLCAweDhjODQ2ZDhjLCAweDM0NDI4MDAwLCAKKzB4NjIxODI1LCAweDY0MTgyNSwgMHgxMDAwMDAwYSwgMHgzNDYyMDAwMiwgCisweDNjMDIwMDAxLCAweDhjNDI2ZDkwLCAweDNjMDMwMDAxLCAweDhjNjM2ZGFjLCAKKzB4M2MwNDAwMDEsIDB4OGM4NDZkOGMsIDB4NDMxMDI1LCAweDQ0MTAyNSwgCisweDM0NDIwMDAyLCAweGFmODIwMjIwLCAweDEwMDAwMDJmLCAweDI0MDIwMDAxLCAKKzB4MjQwMjBlMDEsIDB4YWY4MjAyMzgsIDB4OGY4MzAwNTAsIDB4M2MwMmYwZmYsIAorMHgzNDQyZmZmZiwgMHgzYzA0MDAwMSwgMHg4Yzg0NmYxYywgMHg2MjE4MjQsIAorMHgzYzAyMGQwMCwgMHg2MjE4MjUsIDB4MjQwMjAwMDEsIDB4YWY4MzAwNTAsIAorMHhhZjgyMDIwMCwgMHhhZjgyMDIyMCwgMHgxMDgwMDAwNSwgMHgzYzAzM2YwMCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZDgwLCAweDEwMDAwMDA0LCAweDM0NjMwMDcwLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZkODAsIDB4MzQ2MzAwNzIsIDB4NDMxMDI1LCAKKzB4YWY4MjAyMDAsIDB4M2MwMzAwMDEsIDB4OGM2MzZkODQsIDB4M2MwMmY3MDAsIAorMHg2MjE4MjUsIDB4M2MwMjAwMDEsIDB4OGM0MjZkOTAsIDB4M2MwNDAwMDEsIAorMHg4Yzg0NmRhYywgMHgzYzA1MDAwMSwgMHg4Y2E1NmY0MCwgMHg0MzEwMjUsIAorMHg0NDEwMjUsIDB4YWY4MjAyMjAsIDB4MjQwMjAwMDUsIDB4MTRhMjAwMDYsIAorMHgyNDAyMDAwMSwgMHg4ZjgyMDA0NCwgMHgyNDAzYWZmZiwgMHg0MzEwMjQsIAorMHhhZjgyMDA0NCwgMHgyNDAyMDAwMSwgMHgxMDAwMDAzZCwgMHhhZjgyMDIzOCwgCisweDhmODMwMDUwLCAweDNjMDJmMGZmLCAweDM0NDJmZmZmLCAweDNjMDQwMDAxLCAKKzB4OGM4NDZmMWMsIDB4NjIxODI0LCAweDNjMDIwYTAwLCAweDYyMTgyNSwgCisweDI0MDIwMDAxLCAweGFmODMwMDUwLCAweGFmODIwMjAwLCAweDEwODAwMDFlLCAKKzB4YWY4MjAyMjAsIDB4M2MwMjAwMDEsIDB4OGM0MjZlNDQsIDB4MTQ0MDAwMWEsIAorMHgzYzAzM2YwMCwgMHgzYzAyMDAwMSwgMHg4YzQyNmQ4MCwgMHgxMDAwMDAxYSwgCisweDM0NjMwMGUwLCAweDhmODMwMDUwLCAweDNjMDQwMDAxLCAweDhjODQ2ZjFjLCAKKzB4MzQ0MmZmZmYsIDB4NjIxODI0LCAweDEwODAwMDBmLCAweGFmODMwMDUwLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZlNDQsIDB4MTQ0MDAwMGIsIDB4M2MwNDNmMDAsIAorMHgzYzAzMDAwMSwgMHg4YzYzNmQ4MCwgMHgzNDg0MDBlMCwgMHgyNDAyMDAwMSwgCisweGFmODIwMjAwLCAweGFmODIwMjIwLCAweDY0MTgyNSwgMHhhZjgzMDIwMCwgCisweDEwMDAwMDA4LCAweDNjMDVmNzAwLCAweDNjMDIwMDAxLCAweDhjNDI2ZDgwLCAKKzB4M2MwMzNmMDAsIDB4MzQ2MzAwZTIsIDB4NDMxMDI1LCAweGFmODIwMjAwLCAKKzB4M2MwNWY3MDAsIDB4MzRhNTgwMDAsIDB4M2MwMzAwMDEsIDB4OGM2MzZkODQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmQ5MCwgMHgzYzA0MDAwMSwgMHg4Yzg0NmRhYywgCisweDY1MTgyNSwgMHg0MzEwMjUsIDB4NDQxMDI1LCAweGFmODIwMjIwLCAKKzB4M2UwMDAwOCwgMHgwLCAweDNjMDMwMDAxLCAweDhjNjM2ZGI0LCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZkYjgsIDB4MTA2MjAwMDMsIDB4MjQwMjAwMDIsIAorMHgzYzAxMDAwMSwgMHhhYzIzNmRiOCwgMHgxMDYyMDAxZCwgMHgyYzYyMDAwMywgCisweDEwNDAwMDI1LCAweDI0MDIwMDAxLCAweDE0NjIwMDIzLCAweDI0MDIwMDA0LCAKKzB4M2MwMzAwMDEsIDB4OGM2MzZkOTgsIDB4MTA2MjAwMDYsIDB4MjQwMjAwMDgsIAorMHgxNDYyMDAwYywgMHgzYzAyMDBjOCwgMHgzNDQyMDFmYiwgMHgxMDAwMDAwOSwgCisweGFmODIwMjM4LCAweDI0MDIwZTAxLCAweGFmODIwMjM4LCAweDhmODIwMDQ0LCAKKzB4M2MwM2ZmZmYsIDB4MzQ2MzNmN2YsIDB4NDMxMDI0LCAweDM0NDIwMDgwLCAKKzB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4MjQwMjAwMDIsIDB4M2MwMTAwMDEsIAorMHhhYzIyNmRiNCwgMHgzYzAxMDAwMSwgMHgxMDAwMDAwYiwgMHhhYzIzNmYyYywgCisweDhmODMwMDU0LCAweDNjMDIwMDAxLCAweDhjNDI2ZjJjLCAweDI0NjNkOGYwLCAKKzB4NDMxMDIzLCAweDJjNDIyNzEwLCAweDE0NDAwMDAzLCAweDI0MDIwMDA5LCAKKzB4M2MwMTAwMDEsIDB4YWMyMjZkYjQsIDB4M2UwMDAwOCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MjdiZGZmZDgsIAorMHhhZmIyMDAxOCwgMHg4MDkwMjEsIDB4YWZiMzAwMWMsIDB4YTA5ODIxLCAKKzB4YWZiMTAwMTQsIDB4YzA4ODIxLCAweGFmYjAwMDEwLCAweDgwMjEsIAorMHhhZmJmMDAyMCwgMHhhNjIwMDAwMCwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAKKzB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIDB4MCwgCisweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIAorMHgyNDEwMDAxMCwgMHgyNTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgCisweDI1MDEwMjQsIDB4MjQxMDAwMTAsIDB4MjcwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYSwgMHgyNzAxMDI0LCAweGMwMDRkYjksIDB4MzQxMDgwMDAsIAorMHhjMDA0ZGI5LCAweDAsIDB4YzAwNGQ1OCwgMHgwLCAKKzB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk2MjIwMDAwLCAweDUwMTAyNSwgCisweGE2MjIwMDAwLCAweDEwODA0MiwgMHgxNjAwZmZmNywgMHgwLCAKKzB4YzAwNGRiOSwgMHgwLCAweDhmYmYwMDIwLCAweDhmYjMwMDFjLCAKKzB4OGZiMjAwMTgsIDB4OGZiMTAwMTQsIDB4OGZiMDAwMTAsIDB4M2UwMDAwOCwgCisweDI3YmQwMDI4LCAweDI3YmRmZmQ4LCAweGFmYjEwMDE0LCAweDgwODgyMSwgCisweGFmYjIwMDE4LCAweGEwOTAyMSwgMHhhZmIzMDAxYywgMHhjMDk4MjEsIAorMHhhZmIwMDAxMCwgMHg4MDIxLCAweGFmYmYwMDIwLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgCisweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDIzMDEwMjQsIDB4MTA0MDAwMDIsIAorMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAKKzB4MTYwMGZmZmEsIDB4MjMwMTAyNCwgMHgyNDEwMDAxMCwgMHgyNTAxMDI0LCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDI1MDEwMjQsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgzNDEwODAwMCwgCisweDk2NjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZjgsIAorMHgwLCAweGMwMDRkYjksIDB4MCwgMHg4ZmJmMDAyMCwgCisweDhmYjMwMDFjLCAweDhmYjIwMDE4LCAweDhmYjEwMDE0LCAweDhmYjAwMDEwLCAKKzB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgzYzA0MDAwMSwgMHg4Yzg0NmRkMCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZTE4LCAweDI3YmRmZmQ4LCAweGFmYmYwMDIwLCAKKzB4YWZiMTAwMWMsIDB4MTA4MjAwMDMsIDB4YWZiMDAwMTgsIDB4M2MwMTAwMDEsIAorMHhhYzI0NmUxOCwgMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwgMHgyNDAyMDAwNSwgCisweDE0NjIwMDA1LCAweDI0ODNmZmZmLCAweGMwMDQ5NjMsIDB4MCwgCisweDEwMDAwMzRjLCAweDAsIDB4MmM2MjAwMTMsIDB4MTA0MDAzNDksIAorMHgzMTA4MCwgMHgzYzAxMDAwMSwgMHgyMjA4MjEsIDB4OGMyMjZiODAsIAorMHg0MDAwMDgsIDB4MCwgMHhjMDA0ZGI5LCAweDgwMjEsIAorMHgzNDAyODAwMCwgMHhhN2EyMDAxMCwgMHgyN2IxMDAxMCwgMHhjMDA0ZDc4LCAKKzB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIAorMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHhjMDA0ZDc4LCAKKzB4MjAyMSwgMHgxMDgwNDIsIDB4MTYwMGZmZmMsIDB4MCwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAKKzB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAKKzB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgCisweDE2MDBmZmY4LCAweDAsIDB4YzAwNGRiOSwgMHgwLCAKKzB4MTAwMDAzMGUsIDB4MjQwMjAwMDIsIDB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsIAorMHg4MDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIAorMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIAorMHgyMDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgyNDEwMDAxMCwgCisweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgCisweDI0MTAwMDEwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYywgMHgwLCAweGMwMDRkYjksIDB4MzQxMDgwMDAsIAorMHhjMDA0ZGI5LCAweDAsIDB4YzAwNGQ1OCwgMHgwLCAKKzB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk2MjIwMDAwLCAweDUwMTAyNSwgCisweGE2MjIwMDAwLCAweDEwODA0MiwgMHgxNjAwZmZmNywgMHgwLCAKKzB4YzAwNGRiOSwgMHgwLCAweDk3YTIwMDEwLCAweDMwNDI4MDAwLCAKKzB4MTQ0MDAyZGMsIDB4MjQwMjAwMDMsIDB4MTAwMDAyZDgsIDB4MCwgCisweDI0MDIxMjAwLCAweGE3YTIwMDEwLCAweDI3YjEwMDEwLCAweDgwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIAorMHhjMDA0ZDc4LCAweDIwMjEsIDB4MTA4MDQyLCAweDE2MDBmZmZjLCAKKzB4MCwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgyMDIxLCAweDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgCisweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgCisweDEwODA0MiwgMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkYjksIAorMHgwLCAweDhmODMwMDU0LCAweDEwMDAwMjk2LCAweDI0MDIwMDA0LCAKKzB4OGY4MzAwNTQsIDB4M2MwMjAwMDEsIDB4OGM0MjZmM2MsIDB4MjQ2M2ZmOWMsIAorMHg0MzEwMjMsIDB4MmM0MjAwNjQsIDB4MTQ0MDAyOWUsIDB4MjQwMjAwMDIsIAorMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwgMHgxMDYyMDI5NywgMHgyYzYyMDAwMywgCisweDE0NDAwMjk2LCAweDI0MDIwMDExLCAweDI0MDIwMDAzLCAweDEwNjIwMDA1LCAKKzB4MjQwMjAwMDQsIDB4MTA2MjAyOTEsIDB4MjQwMjAwMGYsIDB4MTAwMDAyOGYsIAorMHgyNDAyMDAxMSwgMHgxMDAwMDI4ZCwgMHgyNDAyMDAwNSwgMHgyNDAyMDAxNCwgCisweGE3YTIwMDEwLCAweDI3YjEwMDEwLCAweDgwMjEsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLCAKKzB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAKKzB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsIAorMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAKKzB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMTIsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTIsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgzNDEwODAwMCwgCisweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZjgsIAorMHgwLCAweGMwMDRkYjksIDB4MCwgMHg4ZjgzMDA1NCwgCisweDEwMDAwMjQ4LCAweDI0MDIwMDA2LCAweDhmODMwMDU0LCAweDNjMDIwMDAxLCAKKzB4OGM0MjZmM2MsIDB4MjQ2M2ZmOWMsIDB4NDMxMDIzLCAweDJjNDIwMDY0LCAKKzB4MTQ0MDAyNTAsIDB4MjQwMjAwMDcsIDB4MTAwMDAyNGMsIDB4MCwgCisweDI0MDIwMDA2LCAweGE3YTIwMDEwLCAweDI3YjEwMDEwLCAweDgwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIAorMHgzMjAyMDAxMywgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTMsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIAorMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkYjksIDB4MCwgCisweDhmODMwMDU0LCAweDEwMDAwMjA3LCAweDI0MDIwMDA4LCAweDhmODMwMDU0LCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZmM2MsIDB4MjQ2M2ZmOWMsIDB4NDMxMDIzLCAKKzB4MmM0MjAwNjQsIDB4MTQ0MDAyMGYsIDB4MjQwMjAwMDksIDB4MTAwMDAyMGIsIAorMHgwLCAweDI3YjEwMDEwLCAweGE3YTAwMDEwLCAweDgwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDIwMjEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIAorMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTgsIAorMHhjMDA0ZGI5LCAweDM0MTA4MDAwLCAweGMwMDRkYjksIDB4MCwgCisweGMwMDRkNTgsIDB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsIAorMHg5NjIyMDAwMCwgMHg1MDEwMjUsIDB4YTYyMjAwMDAsIDB4MTA4MDQyLCAKKzB4MTYwMGZmZjcsIDB4MCwgMHhjMDA0ZGI5LCAweDgwMjEsIAorMHg5N2EyMDAxMCwgMHgyN2IxMDAxMCwgMHgzNDQyMDAwMSwgMHhhN2EyMDAxMCwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIAorMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgCisweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgCisweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgCisweDMyMDIwMDE4LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxOCwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAKKzB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAKKzB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgCisweDE2MDBmZmY4LCAweDAsIDB4YzAwNGRiOSwgMHgwLCAKKzB4OGY4MzAwNTQsIDB4MTAwMDAxOTMsIDB4MjQwMjAwMGEsIDB4OGY4MzAwNTQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmYzYywgMHgyNDYzZmY5YywgMHg0MzEwMjMsIAorMHgyYzQyMDA2NCwgMHgxNDQwMDE5YiwgMHgyNDAyMDAwYiwgMHgxMDAwMDE5NywgCisweDAsIDB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsIDB4ODAyMSwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIAorMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgCisweGMwMDRkNzgsIDB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgCisweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgCisweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgCisweDMyMDIwMDE3LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxNywgCisweGMwMDRkYjksIDB4MzQxMDgwMDAsIDB4YzAwNGRiOSwgMHgwLCAKKzB4YzAwNGQ1OCwgMHgwLCAweDUwNDAwMDA1LCAweDEwODA0MiwgCisweDk2MjIwMDAwLCAweDUwMTAyNSwgMHhhNjIyMDAwMCwgMHgxMDgwNDIsIAorMHgxNjAwZmZmNywgMHgwLCAweGMwMDRkYjksIDB4ODAyMSwgCisweDk3YTIwMDEwLCAweDI3YjEwMDEwLCAweDM0NDIwNzAwLCAweGE3YTIwMDEwLCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgCisweDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAKKzB4MzIwMjAwMTcsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgCisweGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE3LCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIAorMHgzNDEwODAwMCwgMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsIAorMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAKKzB4MTYwMGZmZjgsIDB4MCwgMHhjMDA0ZGI5LCAweDAsIAorMHg4ZjgzMDA1NCwgMHgxMDAwMDExZiwgMHgyNDAyMDAwYywgMHg4ZjgzMDA1NCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZjNjLCAweDI0NjNmZjljLCAweDQzMTAyMywgCisweDJjNDIwMDY0LCAweDE0NDAwMTI3LCAweDI0MDIwMDEyLCAweDEwMDAwMTIzLCAKKzB4MCwgMHgyN2IxMDAxMCwgMHhhN2EwMDAxMCwgMHg4MDIxLCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgCisweDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ3OCwgMHgyMDIxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAKKzB4MzIwMjAwMTQsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgCisweGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDE0LCAKKzB4YzAwNGRiOSwgMHgzNDEwODAwMCwgMHhjMDA0ZGI5LCAweDAsIAorMHhjMDA0ZDU4LCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLCAKKzB4OTYyMjAwMDAsIDB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwgCisweDE2MDBmZmY3LCAweDAsIDB4YzAwNGRiOSwgMHg4MDIxLCAKKzB4OTdhMjAwMTAsIDB4MjdiMTAwMTAsIDB4MzQ0MjAwMTAsIDB4YTdhMjAwMTAsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIAorMHgzMjAyMDAxNCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTQsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweDM0MTA4MDAwLCAweDk2MjIwMDAwLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIAorMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkYjksIDB4MCwgCisweDhmODMwMDU0LCAweDEwMDAwMGFiLCAweDI0MDIwMDEzLCAweDhmODMwMDU0LCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZmM2MsIDB4MjQ2M2ZmOWMsIDB4NDMxMDIzLCAKKzB4MmM0MjAwNjQsIDB4MTQ0MDAwYjMsIDB4MjQwMjAwMGQsIDB4MTAwMDAwYWYsIAorMHgwLCAweDI3YjEwMDEwLCAweGE3YTAwMDEwLCAweDgwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDIwMjEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIAorMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMTgsIAorMHhjMDA0ZGI5LCAweDM0MTA4MDAwLCAweGMwMDRkYjksIDB4MCwgCisweGMwMDRkNTgsIDB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsIAorMHg5NjIyMDAwMCwgMHg1MDEwMjUsIDB4YTYyMjAwMDAsIDB4MTA4MDQyLCAKKzB4MTYwMGZmZjcsIDB4MCwgMHhjMDA0ZGI5LCAweDgwMjEsIAorMHg5N2EyMDAxMCwgMHgyN2IxMDAxMCwgMHgzMDQyZmZmZSwgMHhhN2EyMDAxMCwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIAorMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgCisweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgCisweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgCisweDMyMDIwMDE4LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxOCwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAKKzB4MzQxMDgwMDAsIDB4OTYyMjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAKKzB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgCisweDE2MDBmZmY4LCAweDAsIDB4YzAwNGRiOSwgMHgwLCAKKzB4OGY4MzAwNTQsIDB4MTAwMDAwMzcsIDB4MjQwMjAwMGUsIDB4MjQwMjA4NDAsIAorMHhhN2EyMDAxMCwgMHgyN2IxMDAxMCwgMHg4MDIxLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgCisweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAKKzB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgCisweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDEzLCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDEzLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4MzQxMDgwMDAsIAorMHg5NjIyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwgCisweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmY4LCAKKzB4MCwgMHhjMDA0ZGI5LCAweDAsIDB4OGY4MzAwNTQsIAorMHgyNDAyMDAxMCwgMHgzYzAxMDAwMSwgMHhhYzIyNmRkMCwgMHgzYzAxMDAwMSwgCisweDEwMDAwMDBjLCAweGFjMjM2ZjNjLCAweDhmODMwMDU0LCAweDNjMDIwMDAxLCAKKzB4OGM0MjZmM2MsIDB4MjQ2M2ZmOWMsIDB4NDMxMDIzLCAweDJjNDIwMDY0LCAKKzB4MTQ0MDAwMDQsIDB4MCwgMHgyNDAyMDAxMSwgMHgzYzAxMDAwMSwgCisweGFjMjI2ZGQwLCAweDhmYmYwMDIwLCAweDhmYjEwMDFjLCAweDhmYjAwMDE4LCAKKzB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHgzYzAzMDAwMSwgMHg4YzYzNmQ5OCwgCisweDI3YmRmZmM4LCAweDI0MDIwMDAyLCAweGFmYmYwMDM0LCAweGFmYjIwMDMwLCAKKzB4YWZiMTAwMmMsIDB4MTQ2MjAwMDQsIDB4YWZiMDAwMjgsIDB4M2MxMjAwMDIsIAorMHgxMDAwMDAwMywgMHg4ZTUyOGZmOCwgMHgzYzEyMDAwMiwgMHg4ZTUyOGZmYywgCisweDNjMDMwMDAxLCAweDhjNjM2ZGQ0LCAweDNjMDIwMDAxLCAweDhjNDI2ZTFjLCAKKzB4NTA2MjAwMDQsIDB4MjQ2M2ZmZmYsIDB4M2MwMTAwMDEsIDB4YWMyMzZlMWMsIAorMHgyNDYzZmZmZiwgMHgyYzYyMDAwNiwgMHgxMDQwMDM3NywgMHgzMTA4MCwgCisweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNmJkOCwgMHg0MDAwMDgsIAorMHgwLCAweDIwMjEsIDB4MjgyMSwgMHhjMDA0ZGRiLCAKKzB4MzQwNjgwMDAsIDB4MjQwNDAwMTAsIDB4MjQwNTAwMDIsIDB4MjQwNjAwMDIsIAorMHgyNDAyMDAwMiwgMHhjMDA0ZGRiLCAweGE3YTIwMDE4LCAweDI0MDIwMDAyLCAKKzB4M2MwMTAwMDEsIDB4MTAwMDAzNjQsIDB4YWMyMjZkZDQsIDB4MjdiMTAwMTgsIAorMHhhN2EwMDAxOCwgMHg4MDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIAorMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLCAKKzB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAweDIwMjEsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgCisweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweDEwODA0MiwgMHgxNjAwZmZmYywgMHgwLCAweGMwMDRkYjksIAorMHgzNDEwODAwMCwgMHhjMDA0ZGI5LCAweDAsIDB4YzAwNGQ1OCwgCisweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk2MjIwMDAwLCAKKzB4NTAxMDI1LCAweGE2MjIwMDAwLCAweDEwODA0MiwgMHgxNjAwZmZmNywgCisweDAsIDB4YzAwNGRiOSwgMHgwLCAweDk3YTIwMDE4LCAKKzB4MzA0MjgwMDAsIDB4MTQ0MDAwMDQsIDB4MjQwMjAwMDMsIDB4M2MwMTAwMDEsIAorMHhhYzIyNmRkNCwgMHgyNDAyMDAwMywgMHgzYzAxMDAwMSwgMHgxMDAwMDMyYSwgCisweGFjMjI2ZGQ0LCAweDI0MDQwMDEwLCAweDI0MDUwMDAyLCAweDI0MDYwMDAyLCAKKzB4MjQwMjAwMDIsIDB4YzAwNGRkYiwgMHhhN2EyMDAxOCwgMHgzYzAzMDAwMSwgCisweDhjNjM2ZTIwLCAweDI0MDIwMDAxLCAweDE0NjIwMWUxLCAweDgwMjEsIAorMHgyN2IxMDAxOCwgMHhhN2EwMDAxOCwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAKKzB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIDB4MCwgCisweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIAorMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwgMHgyMDIxLCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIAorMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAxOCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYSwgMHgzMjAyMDAxOCwgMHhjMDA0ZGI5LCAweDM0MTA4MDAwLCAKKzB4YzAwNGRiOSwgMHgwLCAweGMwMDRkNTgsIDB4MCwgCisweDUwNDAwMDA1LCAweDEwODA0MiwgMHg5NjIyMDAwMCwgMHg1MDEwMjUsIAorMHhhNjIyMDAwMCwgMHgxMDgwNDIsIDB4MTYwMGZmZjcsIDB4MCwgCisweGMwMDRkYjksIDB4ODAyMSwgMHgyN2IxMDAxOCwgMHhhN2EwMDAxOCwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIAorMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgCisweGMwMDRkNzgsIDB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgCisweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgCisweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgCisweDMyMDIwMDE4LCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAxOCwgCisweGMwMDRkYjksIDB4MzQxMDgwMDAsIDB4YzAwNGRiOSwgMHgwLCAKKzB4YzAwNGQ1OCwgMHgwLCAweDUwNDAwMDA1LCAweDEwODA0MiwgCisweDk2MjIwMDAwLCAweDUwMTAyNSwgMHhhNjIyMDAwMCwgMHgxMDgwNDIsIAorMHgxNjAwZmZmNywgMHgwLCAweGMwMDRkYjksIDB4ODAyMSwgCisweDI0MDQwMDE4LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDQwNCwgCisweGE3YTAwMDFhLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIAorMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLCAweGMwMDRkNzgsIAorMHgyMDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgyNDEwMDAxMCwgCisweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgCisweDI0MTAwMDEwLCAweDMyMDIwMDE4LCAweDEwNDAwMDAyLCAweDIwMjEsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgCisweDMyMDIwMDE4LCAweGMwMDRkYjksIDB4MzQxMDgwMDAsIDB4YzAwNGRiOSwgCisweDAsIDB4YzAwNGQ1OCwgMHgwLCAweDUwNDAwMDA1LCAKKzB4MTA4MDQyLCAweDk3YTIwMDFhLCAweDUwMTAyNSwgMHhhN2EyMDAxYSwgCisweDEwODA0MiwgMHgxNjAwZmZmNywgMHgwLCAweGMwMDRkYjksIAorMHg4MDIxLCAweGE3YTAwMDFhLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIAorMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLCAKKzB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAweDIwMjEsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmYSwgCisweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDE4LCAweDEwNDAwMDAyLCAKKzB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgCisweDE2MDBmZmZhLCAweDMyMDIwMDE4LCAweGMwMDRkYjksIDB4MzQxMDgwMDAsIAorMHhjMDA0ZGI5LCAweDAsIDB4YzAwNGQ1OCwgMHgwLCAKKzB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk3YTIwMDFhLCAweDUwMTAyNSwgCisweGE3YTIwMDFhLCAweDEwODA0MiwgMHgxNjAwZmZmNywgMHgwLCAKKzB4YzAwNGRiOSwgMHg4MDIxLCAweGE3YTAwMDFjLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgCisweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgyMDIxLCAweDI0MTAwMDEwLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweDEwODA0MiwgMHgxNjAwZmZmYywgMHgwLCAweDI0MTAwMDEwLCAKKzB4MzIwMjAwMWUsIDB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgCisweGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDFlLCAKKzB4YzAwNGRiOSwgMHgzNDEwODAwMCwgMHhjMDA0ZGI5LCAweDAsIAorMHhjMDA0ZDU4LCAweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLCAKKzB4OTdhMjAwMWMsIDB4NTAxMDI1LCAweGE3YTIwMDFjLCAweDEwODA0MiwgCisweDE2MDBmZmY3LCAweDAsIDB4YzAwNGRiOSwgMHg4MDIxLCAKKzB4YTdhMDAwMWMsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgCisweDJlMDIwMDIwLCAweDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwgCisweDIwMjEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweDI0MTAwMDEwLCAKKzB4YzAwNGQ3OCwgMHgyMDIxLCAweDEwODA0MiwgMHgxNjAwZmZmYywgCisweDAsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMWUsIDB4MTA0MDAwMDIsIAorMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAKKzB4MTYwMGZmZmEsIDB4MzIwMjAwMWUsIDB4YzAwNGRiOSwgMHgzNDEwODAwMCwgCisweGMwMDRkYjksIDB4MCwgMHhjMDA0ZDU4LCAweDAsIAorMHg1MDQwMDAwNSwgMHgxMDgwNDIsIDB4OTdhMjAwMWMsIDB4NTAxMDI1LCAKKzB4YTdhMjAwMWMsIDB4MTA4MDQyLCAweDE2MDBmZmY3LCAweDAsIAorMHhjMDA0ZGI5LCAweDgwMjEsIDB4MjQwMjAwMDIsIDB4YTdhMjAwMWUsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAKKzB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweGMwMDRkNzgsIDB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4YzAwNGQ3OCwgCisweDIwMjEsIDB4MTA4MDQyLCAweDE2MDBmZmZjLCAweDAsIAorMHgyNDEwMDAxMCwgMHgzMjAyMDAxZSwgMHgxMDQwMDAwMiwgMHgyMDIxLCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIAorMHgzMjAyMDAxZSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgyMDIxLCAweDM0MTA4MDAwLCAweDk3YTIwMDFlLCAweDUwMTAyNCwgCisweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgCisweDEwODA0MiwgMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkYjksIAorMHg4MDIxLCAweGE3YTAwMDIwLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIAorMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgMHgwLCAKKzB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIDB4MjQwNDAwMDEsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweDI0MTAwMDEwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYywgMHgwLCAweDI0MTAwMDEwLCAweDMyMDIwMDFlLCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDMyMDIwMDFlLCAweGMwMDRkYjksIAorMHgzNDEwODAwMCwgMHhjMDA0ZGI5LCAweDAsIDB4YzAwNGQ1OCwgCisweDAsIDB4NTA0MDAwMDUsIDB4MTA4MDQyLCAweDk3YTIwMDIwLCAKKzB4NTAxMDI1LCAweGE3YTIwMDIwLCAweDEwODA0MiwgMHgxNjAwZmZmNywgCisweDAsIDB4YzAwNGRiOSwgMHg4MDIxLCAweGE3YTAwMDIwLCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgCisweDE0NDBmZmZiLCAweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAKKzB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ3OCwgMHgyMDIxLCAweDI0MTAwMDEwLCAweGMwMDRkNzgsIAorMHgyMDIxLCAweDEwODA0MiwgMHgxNjAwZmZmYywgMHgwLCAKKzB4MjQxMDAwMTAsIDB4MzIwMjAwMWUsIDB4MTA0MDAwMDIsIDB4MjAyMSwgCisweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAweDE2MDBmZmZhLCAKKzB4MzIwMjAwMWUsIDB4YzAwNGRiOSwgMHgzNDEwODAwMCwgMHhjMDA0ZGI5LCAKKzB4MCwgMHhjMDA0ZDU4LCAweDAsIDB4NTA0MDAwMDUsIAorMHgxMDgwNDIsIDB4OTdhMjAwMjAsIDB4NTAxMDI1LCAweGE3YTIwMDIwLCAKKzB4MTA4MDQyLCAweDE2MDBmZmY3LCAweDAsIDB4YzAwNGRiOSwgCisweDgwMjEsIDB4YTdhMDAwMjIsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgCisweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLCAweDAsIAorMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgCisweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAKKzB4MjQxMDAwMTAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweDEwODA0MiwgCisweDE2MDBmZmZjLCAweDAsIDB4MjQxMDAwMTAsIDB4YzAwNGQ3OCwgCisweDIwMjEsIDB4MTA4MDQyLCAweDE2MDBmZmZjLCAweDAsIAorMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgCisweDM0MTA4MDAwLCAweDk3YTIwMDIyLCAweDUwMTAyNCwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIAorMHgxNjAwZmZmOCwgMHgwLCAweGMwMDRkYjksIDB4MCwgCisweDI0MDQwMDE4LCAweDI0MDUwMDAyLCAweGMwMDRkZGIsIDB4MjQwNjAwMDQsIAorMHgzYzEwMDAwMSwgMHg4ZTEwNmUyNCwgMHgyNDAyMDAwMSwgMHgxNjAyMDExZCwgCisweDAsIDB4M2MwMjAwMDEsIDB4OTQ0MjZmMjYsIDB4M2MwMTAwMDEsIAorMHhhYzIwNmUyNCwgMHgyNDQyOWZiYywgMHgyYzQyMDAwNCwgMHgxMDQwMDAwYywgCisweDI0MDQwMDA5LCAweDI0MDUwMDAxLCAweGMwMDRkZGIsIDB4MjQwNjA0MDAsIAorMHgyNDA0MDAxOCwgMHgyNDA1MDAwMSwgMHhjMDA0ZGRiLCAweDI0MDYwMDIwLCAKKzB4MjQwNDAwMTgsIDB4MjQwNTAwMDEsIDB4YzAwNGRkYiwgMHgyNDA2MjAwMCwgCisweDNjMDI0MDAwLCAweDI0MjEwMjQsIDB4MTA0MDAxMjMsIDB4M2MwMjIwMDAsIAorMHgyNDIxMDI0LCAweDEwNDAwMDA0LCAweDAsIDB4M2MwMTAwMDEsIAorMHgxMDAwMDAwMywgMHhhYzMwNmYxYywgMHgzYzAxMDAwMSwgMHhhYzIwNmYxYywgCisweDNjMDMwMDAxLCAweDhjNjM2ZjM0LCAweDI0MDIwMDA1LCAweDE0NjIwMGY5LCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmYxYywgMHgxMDQwMDA2NywgCisweDNjMDIwMDA0LCAweDI0MjEwMjQsIDB4MTA0MDAwMTEsIDB4YTdhMDAwMTgsIAorMHgzYzAyMDAwOCwgMHgyNDIxMDI0LCAweDEwNDAwMDAyLCAweDI0MDIwMjAwLCAKKzB4YTdhMjAwMTgsIDB4M2MwMjAwMTAsIDB4MjQyMTAyNCwgMHgxMDQwMDAwNCwgCisweDAsIDB4OTdhMjAwMTgsIDB4MzQ0MjAxMDAsIDB4YTdhMjAwMTgsIAorMHg5N2E2MDAxOCwgMHgyNDA0MDAwOSwgMHgxMDAwMDAwNCwgMHgyODIxLCAKKzB4MjQwNDAwMDksIDB4MjgyMSwgMHgzMDIxLCAweGMwMDRkZGIsIAorMHgwLCAweDI0MDIwMDAxLCAweGE3YTIwMDFhLCAweDNjMDIwMDA4LCAKKzB4MjQyMTAyNCwgMHgxMDQwMDAwYywgMHgzYzAyMDAwMiwgMHgyNDIxMDI0LCAKKzB4MTA0MDAwMDIsIDB4MjQwMjAxMDEsIDB4YTdhMjAwMWEsIDB4M2MwMjAwMDEsIAorMHgyNDIxMDI0LCAweDEwNDAwMDA1LCAweDNjMDIwMDEwLCAweDk3YTIwMDFhLCAKKzB4MzQ0MjAwNDAsIDB4YTdhMjAwMWEsIDB4M2MwMjAwMTAsIDB4MjQyMTAyNCwgCisweDEwNDAwMDBlLCAweDNjMDIwMDAyLCAweDI0MjEwMjQsIDB4MTA0MDAwMDUsIAorMHgzYzAyMDAwMSwgMHg5N2EyMDAxYSwgMHgzNDQyMDA4MCwgMHhhN2EyMDAxYSwgCisweDNjMDIwMDAxLCAweDI0MjEwMjQsIDB4MTA0MDAwMDUsIDB4M2MwMzAwYTAsIAorMHg5N2EyMDAxYSwgMHgzNDQyMDAyMCwgMHhhN2EyMDAxYSwgMHgzYzAzMDBhMCwgCisweDI0MzEwMjQsIDB4NTQ0MzAwMDQsIDB4M2MwMjAwMjAsIDB4OTdhMjAwMWEsIAorMHgxMDAwMDAwYywgMHgzNDQyMDQwMCwgMHgyNDIxMDI0LCAweDUwNDAwMDA0LCAKKzB4M2MwMjAwODAsIDB4OTdhMjAwMWEsIDB4MTAwMDAwMDYsIDB4MzQ0MjA4MDAsIAorMHgyNDIxMDI0LCAweDEwNDAwMDA0LCAweDAsIDB4OTdhMjAwMWEsIAorMHgzNDQyMGMwMCwgMHhhN2EyMDAxYSwgMHg5N2E2MDAxYSwgMHgyNDA0MDAwNCwgCisweGMwMDRkZGIsIDB4MjgyMSwgMHgzYzAyMDAwNCwgMHgyNDIxMDI0LCAKKzB4MTA0MDAwMDQsIDB4YTdhMDAwMWMsIDB4MzI0MjUwMDAsIDB4MTQ0MDAwMDQsIAorMHgwLCAweDMyNDI0MDAwLCAweDEwNDAwMDA1LCAweDIwMjEsIAorMHhjMDA0Y2Y5LCAweDI0MDIwMjEsIDB4MTAwMDAwOTYsIDB4MCwgCisweDk3YTYwMDFjLCAweDI4MjEsIDB4MzRjNjEyMDAsIDB4YzAwNGRkYiwgCisweGE3YTYwMDFjLCAweDEwMDAwMDhmLCAweDAsIDB4MjQyMTAyNCwgCisweDEwNDAwMDA0LCAweGE3YTAwMDE4LCAweDMyNDI1MDAwLCAweDE0NDAwMDA0LCAKKzB4MCwgMHgzMjQyNDAwMCwgMHgxMDQwMDAwNSwgMHgzYzAyMDAxMCwgCisweGMwMDRjZjksIDB4MjQwMjAyMSwgMHgxMDAwMDAxOSwgMHhhN2EwMDAxYSwgCisweDI0MjEwMjQsIDB4MTA0MDAwMDQsIDB4MCwgMHg5N2EyMDAxOCwgCisweDEwMDAwMDA0LCAweGE3YTIwMDE4LCAweDk3YTIwMDE4LCAweDM0NDIwMTAwLCAKKzB4YTdhMjAwMTgsIDB4M2MwMjAwMDEsIDB4MjQyMTAyNCwgMHgxMDQwMDAwNCwgCisweDAsIDB4OTdhMjAwMTgsIDB4MTAwMDAwMDQsIDB4YTdhMjAwMTgsIAorMHg5N2EyMDAxOCwgMHgzNDQyMjAwMCwgMHhhN2EyMDAxOCwgMHg5N2E2MDAxOCwgCisweDIwMjEsIDB4YzAwNGRkYiwgMHgyODIxLCAweGE3YTAwMDFhLCAKKzB4ODAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAKKzB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIDB4MCwgMHhjMDA0ZDc4LCAKKzB4MjAyMSwgMHhjMDA0ZDc4LCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4MjQxMDAwMTAsIAorMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAKKzB4YzAwNGQ3OCwgMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIAorMHgyNDEwMDAxMCwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4MTA4MDQyLCAKKzB4MTYwMGZmZmMsIDB4MCwgMHhjMDA0ZGI5LCAweDM0MTA4MDAwLCAKKzB4YzAwNGRiOSwgMHgwLCAweGMwMDRkNTgsIDB4MCwgCisweDUwNDAwMDA1LCAweDEwODA0MiwgMHg5N2EyMDAxYSwgMHg1MDEwMjUsIAorMHhhN2EyMDAxYSwgMHgxMDgwNDIsIDB4MTYwMGZmZjcsIDB4MCwgCisweGMwMDRkYjksIDB4ODAyMSwgMHhhN2EwMDAxYSwgMHhjMDA0ZDc4LCAKKzB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIAorMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAKKzB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHhjMDA0ZDc4LCAKKzB4MjAyMSwgMHgxMDgwNDIsIDB4MTYwMGZmZmMsIDB4MCwgCisweGMwMDRkYjksIDB4MzQxMDgwMDAsIDB4YzAwNGRiOSwgMHgwLCAKKzB4YzAwNGQ1OCwgMHgwLCAweDUwNDAwMDA1LCAweDEwODA0MiwgCisweDk3YTIwMDFhLCAweDUwMTAyNSwgMHhhN2EyMDAxYSwgMHgxMDgwNDIsIAorMHgxNjAwZmZmNywgMHgwLCAweGMwMDRkYjksIDB4MCwgCisweDNjMDQwMDAxLCAweDI0ODQ2YmNjLCAweDk3YTYwMDE4LCAweDk3YTcwMDFhLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZkOTgsIDB4M2MwMzAwMDEsIDB4OGM2MzZmMWMsIAorMHgzYzA1MDAwZCwgMHgzNGE1MDIwNSwgMHhhZmEyMDAxMCwgMHhjMDAyYjNiLCAKKzB4YWZhMzAwMTQsIDB4OGY4MzAwNTQsIDB4MjQwMjAwMDQsIDB4M2MwMTAwMDEsIAorMHhhYzIyNmRkNCwgMHgzYzAxMDAwMSwgMHgxMDAwMDAxNywgMHhhYzIzNmYzOCwgCisweDhmODMwMDU0LCAweDNjMDIwMDAxLCAweDhjNDI2ZjM4LCAweDI0NjNmZjljLCAKKzB4NDMxMDIzLCAweDJjNDIwMDY0LCAweDE0NDAwMDBmLCAweDAsIAorMHg4ZjgyMDIyMCwgMHgyNDAzMDAwNSwgMHgzYzAxMDAwMSwgMHhhYzIzNmRkNCwgCisweDNjMDNmNzAwLCAweDQzMTAyNSwgMHgxMDAwMDAwNywgMHhhZjgyMDIyMCwgCisweDI0MDIwMDA2LCAweDNjMDEwMDAxLCAweGFjMjI2ZGQ0LCAweDI0MDIwMDExLCAKKzB4M2MwMTAwMDEsIDB4YWMyMjZkZDAsIDB4OGZiZjAwMzQsIDB4OGZiMjAwMzAsIAorMHg4ZmIxMDAyYywgMHg4ZmIwMDAyOCwgMHgzZTAwMDA4LCAweDI3YmQwMDM4LCAKKzB4MjdiZGZmZDgsIDB4YWZiMDAwMTgsIDB4ODA4MDIxLCAweGFmYjEwMDFjLCAKKzB4ODgyMSwgMHgzMjAyNDAwMCwgMHgxMDQwMDAxMywgMHhhZmJmMDAyMCwgCisweDNjMDIwMDEwLCAweDIwMjEwMjQsIDB4MmM0MjAwMDEsIDB4MjEwMjMsIAorMHgzMDQzNDEwMCwgMHgzYzAyMDAwMSwgMHgyMDIxMDI0LCAweDE0NDAwMDA2LCAKKzB4MzQ3MTQwMDAsIDB4M2MwMjAwMDIsIDB4MjAyMTAyNCwgMHgxNDQwMDAwMiwgCisweDM0NzE2MDAwLCAweDM0NzE0MDQwLCAweDIwMjEsIDB4MjgyMSwgCisweDEwMDAwMDM2LCAweDIyMDMwMjEsIDB4MzIwMjEwMDAsIDB4MTA0MDAwMzUsIAorMHgyMDIxLCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDA0MCwgCisweDI0MDQwMDE4LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MGMwMCwgCisweDI0MDQwMDE3LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDQwMCwgCisweDI0MDQwMDE2LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDAwNiwgCisweDI0MDQwMDE3LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MjUwMCwgCisweDI0MDQwMDE2LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDAwNiwgCisweDI0MDQwMDE3LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2NDYwMCwgCisweDI0MDQwMDE2LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDAwNiwgCisweDI0MDQwMDE3LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2NjcwMCwgCisweDI0MDQwMDE2LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDAwNiwgCisweDI0MDQwMDFmLCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MDAxMCwgCisweDI0MDQwMDA5LCAweDI4MjEsIDB4YzAwNGRkYiwgMHgyNDA2MTUwMCwgCisweDI0MDQwMDA5LCAweDI4MjEsIDB4MjQwNjFkMDAsIDB4YzAwNGRkYiwgCisweDAsIDB4M2MwNDAwMDEsIDB4MjQ4NDZiZjAsIDB4M2MwNTAwMGUsIAorMHgzNGE1MDEwMCwgMHgyMDAzMDIxLCAweDIyMDM4MjEsIDB4YWZhMDAwMTAsIAorMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDhmYmYwMDIwLCAweDhmYjEwMDFjLCAKKzB4OGZiMDAwMTgsIDB4M2UwMDAwOCwgMHgyN2JkMDAyOCwgMHg4Zjg1MDA0NCwgCisweDhmODIwMDQ0LCAweDNjMDMwMDAxLCAweDQzMTAyNSwgMHgzYzAzMDAwOCwgCisweGFmODIwMDQ0LCAweDhmODQwMDU0LCAweDhmODIwMDU0LCAweGEzMjgyNCwgCisweDEwMDAwMDAyLCAweDI0ODQwMDAxLCAweDhmODIwMDU0LCAweDgyMTAyMywgCisweDJjNDIwMDAyLCAweDE0NDBmZmZjLCAweDAsIDB4OGY4MjAwNDQsIAorMHgzYzAzZmZmZSwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4YWY4MjAwNDQsIAorMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgMHgyNDYzMDAwMSwgCisweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwgMHgxNDQwZmZmYywgCisweDAsIDB4M2UwMDAwOCwgMHhhMDEwMjEsIDB4OGY4MzAwNDQsIAorMHgzYzAyZmZmMCwgMHgzNDQyZmZmZiwgMHg0MjQ4MCwgMHg2MjE4MjQsIAorMHgzYzAyMDAwMiwgMHg4MjIwMjUsIDB4NjQxODI1LCAweGFmODMwMDQ0LCAKKzB4OGY4MjAwNDQsIDB4M2MwM2ZmZmUsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAKKzB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIAorMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDIsIAorMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMDQ0LCAweDNjMDMwMDAxLCAKKzB4NDMxMDI1LCAweGFmODIwMDQ0LCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAKKzB4MTAwMDAwMDIsIDB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsIDB4NjIxMDIzLCAKKzB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MCwgMHgzZTAwMDA4LCAKKzB4MCwgMHg4ZjgyMDA0NCwgMHgyNDAzZmY3ZiwgMHg0MzEwMjQsIAorMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgCisweDI0NjMwMDAxLCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwgCisweDE0NDBmZmZjLCAweDAsIDB4OGY4MjAwNDQsIDB4MzQ0MjAwODAsIAorMHhhZjgyMDA0NCwgMHg4ZjgzMDA1NCwgMHg4ZjgyMDA1NCwgMHgxMDAwMDAwMiwgCisweDI0NjMwMDAxLCAweDhmODIwMDU0LCAweDYyMTAyMywgMHgyYzQyMDAwMiwgCisweDE0NDBmZmZjLCAweDAsIDB4M2UwMDAwOCwgMHgwLCAKKzB4OGY4MjAwNDQsIDB4M2MwM2ZmZjAsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAKKzB4YWY4MjAwNDQsIDB4OGY4MjAwNDQsIDB4M2MwMzAwMDEsIDB4NDMxMDI1LCAKKzB4YWY4MjAwNDQsIDB4OGY4MzAwNTQsIDB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIAorMHgyNDYzMDAwMSwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIDB4MmM0MjAwMDIsIAorMHgxNDQwZmZmYywgMHgwLCAweDhmODIwMDQ0LCAweDNjMDNmZmZlLCAKKzB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweGFmODIwMDQ0LCAweDhmODMwMDU0LCAKKzB4OGY4MjAwNTQsIDB4MTAwMDAwMDIsIDB4MjQ2MzAwMDEsIDB4OGY4MjAwNTQsIAorMHg2MjEwMjMsIDB4MmM0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MCwgCisweDNlMDAwMDgsIDB4MCwgMHgyN2JkZmZjOCwgMHhhZmIzMDAyNCwgCisweDgwOTgyMSwgMHhhZmJlMDAyYywgMHhhMGYwMjEsIDB4YWZiMjAwMjAsIAorMHhjMDkwMjEsIDB4MzNjMmZmZmYsIDB4YWZiZjAwMzAsIDB4YWZiNTAwMjgsIAorMHhhZmIxMDAxYywgMHhhZmIwMDAxOCwgMHgxNDQwMDAzNCwgMHhhN2IyMDAxMCwgCisweDMyNzFmZmZmLCAweDI3YjIwMDEwLCAweDgwMjEsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweDI2MTAwMDAxLCAweDJlMDIwMDIwLCAweDE0NDBmZmZiLCAKKzB4MCwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAKKzB4MjQwNDAwMDEsIDB4MjQxMDAwMTAsIDB4MzIwMjAwMDEsIDB4MTA0MDAwMDIsIAorMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAKKzB4MTYwMGZmZmEsIDB4MzIwMjAwMDEsIDB4MjQxMDAwMTAsIDB4MjMwMTAyNCwgCisweDEwNDAwMDAyLCAweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgCisweDEwODA0MiwgMHgxNjAwZmZmYSwgMHgyMzAxMDI0LCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4MzQxMDgwMDAsIAorMHg5NjQyMDAwMCwgMHg1MDEwMjQsIDB4MTA0MDAwMDIsIDB4MjAyMSwgCisweDI0MDQwMDAxLCAweGMwMDRkNzgsIDB4MTA4MDQyLCAweDEyMDAwMDc1LCAKKzB4MCwgMHgxMDAwZmZmNiwgMHgwLCAweDMyNzVmZmZmLCAKKzB4MjdiMTAwMTAsIDB4YTdhMDAwMTAsIDB4ODAyMSwgMHhjMDA0ZDc4LCAKKzB4MjQwNDAwMDEsIDB4MjYxMDAwMDEsIDB4MmUwMjAwMjAsIDB4MTQ0MGZmZmIsIAorMHgwLCAweGMwMDRkNzgsIDB4MjAyMSwgMHhjMDA0ZDc4LCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAKKzB4MjAyMSwgMHgyNDEwMDAxMCwgMHgzMjAyMDAwMSwgMHgxMDQwMDAwMiwgCisweDIwMjEsIDB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgxMDgwNDIsIAorMHgxNjAwZmZmYSwgMHgzMjAyMDAwMSwgMHgyNDEwMDAxMCwgMHgyYjAxMDI0LCAKKzB4MTA0MDAwMDIsIDB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAKKzB4MTA4MDQyLCAweDE2MDBmZmZhLCAweDJiMDEwMjQsIDB4YzAwNGRiOSwgCisweDM0MTA4MDAwLCAweGMwMDRkYjksIDB4MCwgMHhjMDA0ZDU4LCAKKzB4MCwgMHg1MDQwMDAwNSwgMHgxMDgwNDIsIDB4OTYyMjAwMDAsIAorMHg1MDEwMjUsIDB4YTYyMjAwMDAsIDB4MTA4MDQyLCAweDE2MDBmZmY3LCAKKzB4MCwgMHhjMDA0ZGI5LCAweDAsIDB4MzNjNWZmZmYsIAorMHgyNDAyMDAwMSwgMHg1NGEyMDAwNCwgMHgyNDAyMDAwMiwgMHg5N2EyMDAxMCwgCisweDEwMDAwMDA2LCAweDUyMTAyNSwgMHgxNGEyMDAwNiwgMHgzMjcxZmZmZiwgCisweDk3YTIwMDEwLCAweDEyMTgyNywgMHg0MzEwMjQsIDB4YTdhMjAwMTAsIAorMHgzMjcxZmZmZiwgMHgyN2IyMDAxMCwgMHg4MDIxLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHgyNjEwMDAwMSwgMHgyZTAyMDAyMCwgMHgxNDQwZmZmYiwgCisweDAsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweGMwMDRkNzgsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDIwMjEsIDB4YzAwNGQ3OCwgCisweDI0MDQwMDAxLCAweDI0MTAwMDEwLCAweDMyMDIwMDAxLCAweDEwNDAwMDAyLCAKKzB4MjAyMSwgMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgCisweDE2MDBmZmZhLCAweDMyMDIwMDAxLCAweDI0MTAwMDEwLCAweDIzMDEwMjQsIAorMHgxMDQwMDAwMiwgMHgyMDIxLCAweDI0MDQwMDAxLCAweGMwMDRkNzgsIAorMHgxMDgwNDIsIDB4MTYwMGZmZmEsIDB4MjMwMTAyNCwgMHhjMDA0ZDc4LCAKKzB4MjQwNDAwMDEsIDB4YzAwNGQ3OCwgMHgyMDIxLCAweDM0MTA4MDAwLCAKKzB4OTY0MjAwMDAsIDB4NTAxMDI0LCAweDEwNDAwMDAyLCAweDIwMjEsIAorMHgyNDA0MDAwMSwgMHhjMDA0ZDc4LCAweDEwODA0MiwgMHgxNjAwZmZmOCwgCisweDAsIDB4YzAwNGRiOSwgMHgwLCAweDhmYmYwMDMwLCAKKzB4OGZiZTAwMmMsIDB4OGZiNTAwMjgsIDB4OGZiMzAwMjQsIDB4OGZiMjAwMjAsIAorMHg4ZmIxMDAxYywgMHg4ZmIwMDAxOCwgMHgzZTAwMDA4LCAweDI3YmQwMDM4LCAKKzB4MCwgMHgwLCAweDAsIDB4MjdiZGZmZTgsIAorMHhhZmJmMDAxMCwgMHg4ZWUzMDRiOCwgMHgyNDAyMDAwOCwgMHgxNDYyMDFlMCwgCisweDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMWMsIDB4MTQ0MDAwMDUsIAorMHgwLCAweGMwMDNkYWYsIDB4OGY4NDAyMjQsIDB4MTAwMDAxZDgsIAorMHgwLCAweDhmODIwMjIwLCAweDNjMDMwMDA4LCAweDQzMTAyNCwgCisweDEwNDAwMDI2LCAweDI0MDIwMDAxLCAweDhmODQwMjI0LCAweDhmODIwMjIwLCAKKzB4M2MwMzA0MDAsIDB4NDMxMDI0LCAweDEwNDAwMDA2LCAweDAsIAorMHgzYzAxMDAwMiwgMHhhYzIwOGZhMCwgMHgzYzAxMDAwMiwgMHgxMDAwMDAwYiwgCisweGFjMjA4ZmMwLCAweDNjMDMwMDAyLCAweDI0NjM4ZmEwLCAweDhjNjIwMDAwLCAKKzB4MjQ0MjAwMDEsIDB4YWM2MjAwMDAsIDB4MmM0MjAwMDIsIDB4MTQ0MDAwMDMsIAorMHgyNDAyMDAwMSwgMHgzYzAxMDAwMiwgMHhhYzIyOGZjMCwgMHgzYzAyMDAwMiwgCisweDhjNDI4ZmMwLCAweDEwNDAwMDA2LCAweDMwODIwMDQwLCAweDEwNDAwMDA0LCAKKzB4MjQwMjAwMDEsIDB4M2MwMTAwMDIsIDB4MTAwMDAwMDMsIDB4YWMyMjhmYzQsIAorMHgzYzAxMDAwMiwgMHhhYzIwOGZjNCwgMHgzYzAxMDAwMiwgMHhhYzI0OGY5YywgCisweDNjMDEwMDAyLCAweDEwMDAwMDBiLCAweGFjMjA4ZmQwLCAweDNjMDEwMDAyLCAKKzB4YWMyMjhmZDAsIDB4M2MwMTAwMDIsIDB4YWMyMDhmYzAsIDB4M2MwMTAwMDIsIAorMHhhYzIwOGZhMCwgMHgzYzAxMDAwMiwgMHhhYzIwOGZjNCwgMHgzYzAxMDAwMiwgCisweGFjMjA4ZjljLCAweDNjMDMwMDAyLCAweDhjNjM4ZjkwLCAweDNjMDIwMDAyLCAKKzB4OGM0MjhmOTQsIDB4NTA2MjAwMDQsIDB4MjQ2M2ZmZmYsIDB4M2MwMTAwMDIsIAorMHhhYzIzOGY5NCwgMHgyNDYzZmZmZiwgMHgyYzYyMDAwZSwgMHgxMDQwMDE5NCwgCisweDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNmMwMCwgCisweDQwMDAwOCwgMHgwLCAweDI0MDIwMDAyLCAweDNjMDEwMDAyLCAKKzB4YWMyMDhmYzAsIDB4M2MwMTAwMDIsIDB4YWMyMDhmYTAsIDB4M2MwMTAwMDIsIAorMHhhYzIwOGY5YywgMHgzYzAxMDAwMiwgMHhhYzIwOGZjNCwgMHgzYzAxMDAwMiwgCisweGFjMjA4ZmI4LCAweDNjMDEwMDAyLCAweGFjMjA4ZmIwLCAweGFmODAwMjI0LCAKKzB4M2MwMTAwMDIsIDB4YWMyMjhmOTAsIDB4M2MwMjAwMDIsIDB4OGM0MjhmZDAsIAorMHgxNDQwMDA0ZiwgMHgzYzAyZmRmZiwgMHgzNDQyZmZmZiwgMHhjMDAzZGFmLCAKKzB4MjgyYTAyNCwgMHhhZjgwMDIwNCwgMHg4ZjgyMDIwMCwgMHgyNDAzZmZmZCwgCisweDQzMTAyNCwgMHhhZjgyMDIwMCwgMHgzYzAxMDAwMiwgMHhhYzIwOGZlMCwgCisweDhmODMwMDU0LCAweDNjMDIwMDAyLCAweDhjNDI4ZmI4LCAweDI0MDQwMDAxLCAKKzB4M2MwMTAwMDIsIDB4YWMyNDhmY2MsIDB4MjQ0MjAwMDEsIDB4M2MwMTAwMDIsIAorMHhhYzIyOGZiOCwgMHgyYzQyMDAwNCwgMHgzYzAxMDAwMiwgMHhhYzIzOGZiNCwgCisweDE0NDAwMDA2LCAweDI0MDIwMDAzLCAweDNjMDEwMDAxLCAweGFjMjQ2ZDljLCAKKzB4M2MwMTAwMDIsIDB4MTAwMDAxNWUsIDB4YWMyMDhmYjgsIDB4M2MwMTAwMDIsIAorMHgxMDAwMDE1YiwgMHhhYzIyOGY5MCwgMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMiwgCisweDhjNDI4ZmI0LCAweDI0NjNkOGYwLCAweDQzMTAyMywgMHgyYzQyMjcxMCwgCisweDE0NDAwMDAzLCAweDI0MDIwMDA0LCAweDNjMDEwMDAyLCAweGFjMjI4ZjkwLCAKKzB4M2MwMjAwMDIsIDB4OGM0MjhmZDAsIDB4MTQ0MDAwMjEsIDB4M2MwMmZkZmYsIAorMHgzNDQyZmZmZiwgMHgxMDAwMDE0YSwgMHgyODJhMDI0LCAweDNjMDQwMDAxLCAKKzB4OGM4NDZmMjAsIDB4M2MwMTAwMDIsIDB4YzAwNTA4NCwgMHhhYzIwOGZhOCwgCisweDNjMDIwMDAyLCAweDhjNDI4ZmRjLCAweGFmODIwMjA0LCAweDNjMDIwMDAyLCAKKzB4OGM0MjhmZDAsIDB4MTQ0MDAwMTIsIDB4M2MwM2ZkZmYsIDB4OGY4MjAyMDQsIAorMHgzNDYzZmZmZiwgMHgzMDQyMDAzMCwgMHgxNDQwMDEyZiwgMHgyODNhMDI0LCAKKzB4M2MwMzAwMDIsIDB4OGM2MzhmZGMsIDB4MjQwMjAwMDUsIDB4M2MwMTAwMDIsIAorMHhhYzIyOGY5MCwgMHgzYzAxMDAwMiwgMHgxMDAwMDEzMSwgMHhhYzIzOGZlMCwgCisweDNjMDIwMDAyLCAweDhjNDI4ZmQwLCAweDEwNDAwMDEwLCAweDNjMDJmZGZmLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZlM2MsIDB4MjQ0MjAwMDEsIDB4M2MwMTAwMDEsIAorMHhhYzIyNmUzYywgMHgyYzQyMDAwMiwgMHgxNDQwMDEyNSwgMHgyNDAyMDAwMSwgCisweDNjMDEwMDAxLCAweGFjMjI2ZTQ0LCAweDNjMDEwMDAxLCAweGFjMjA2ZTNjLCAKKzB4M2MwMTAwMDEsIDB4MTAwMDAxMWUsIDB4YWMyMjZkOWMsIDB4M2MwMzAwMDIsIAorMHg4YzYzOGZjMCwgMHgzNDQyZmZmZiwgMHgxMDYwMDExOSwgMHgyODJhMDI0LCAKKzB4M2MwMjAwMDIsIDB4OGM0MjhmOWMsIDB4MTA0MDAxMTUsIDB4MCwgCisweDNjMDEwMDAyLCAweGFjMjI4ZmM4LCAweDI0MDIwMDAzLCAweDNjMDEwMDAyLCAKKzB4YWMyMjhmYTAsIDB4MTAwMDAwYjgsIDB4MjQwMjAwMDYsIDB4M2MwMTAwMDIsIAorMHhhYzIwOGZhOCwgMHg4ZjgyMDIwNCwgMHgzNDQyMDA0MCwgMHhhZjgyMDIwNCwgCisweDNjMDIwMDAyLCAweDhjNDI4ZmUwLCAweDI0MDMwMDA3LCAweDNjMDEwMDAyLCAKKzB4YWMyMzhmOTAsIDB4MzQ0MjAwNDAsIDB4M2MwMTAwMDIsIDB4YWMyMjhmZTAsIAorMHgzYzAyMDAwMiwgMHg4YzQyOGZjMCwgMHgxMDQwMDAwNSwgMHgwLCAKKzB4M2MwMjAwMDIsIDB4OGM0MjhmOWMsIDB4MTA0MDAwZjAsIDB4MjQwMjAwMDIsIAorMHgzYzA1MDAwMiwgMHgyNGE1OGZhMCwgMHg4Y2EyMDAwMCwgMHgyYzQyNGUyMSwgCisweDEwNDAwMGVhLCAweDI0MDIwMDAyLCAweDNjMDIwMDAyLCAweDhjNDI4ZmM0LCAKKzB4MTA0MDAwZWYsIDB4MjQwNGZmYmYsIDB4M2MwMjAwMDIsIDB4OGM0MjhmOWMsIAorMHgzYzAzMDAwMiwgMHg4YzYzOGZjOCwgMHg0NDEwMjQsIDB4NjQxODI0LCAKKzB4MTA0MzAwMDQsIDB4MjQwMjAwMDEsIDB4M2MwMTAwMDIsIDB4MTAwMDAwZTQsIAorMHhhYzIyOGY5MCwgMHgyNDAyMDAwMywgMHhhY2EyMDAwMCwgMHgyNDAyMDAwOCwgCisweDNjMDEwMDAyLCAweGFjMjI4ZjkwLCAweDNjMDIwMDAyLCAweDhjNDI4ZmNjLCAKKzB4MTA0MDAwMGMsIDB4MjQwMjAwMDEsIDB4M2MwNDAwMDIsIDB4YzAwNTA5MSwgCisweDhjODQ4ZjljLCAweDNjMDIwMDAyLCAweDhjNDI4ZmU4LCAweDE0NDAwMDA1LCAKKzB4MjQwMjAwMDEsIDB4M2MwMjAwMDIsIDB4OGM0MjhmZTQsIDB4MTA0MDAwMDYsIAorMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzIyNmQ5YywgMHgzYzAxMDAwMiwgCisweDEwMDAwMGNiLCAweGFjMjA4ZmI4LCAweDNjMDIwMDAyLCAweDhjNDI4ZmIwLCAKKzB4M2MwMzAwMDIsIDB4OGM2MzhmOWMsIDB4MmM0MjAwMDEsIDB4MjEwYzAsIAorMHgzMDYzMDAwOCwgMHgzYzAxMDAwMiwgMHhhYzIyOGZiMCwgMHgzYzAxMDAwMiwgCisweGFjMjM4ZmFjLCAweDhmODMwMDU0LCAweDI0MDIwMDA5LCAweDNjMDEwMDAyLCAKKzB4YWMyMjhmOTAsIDB4M2MwMTAwMDIsIDB4MTAwMDAwYjksIDB4YWMyMzhmYjQsIAorMHg4ZjgzMDA1NCwgMHgzYzAyMDAwMiwgMHg4YzQyOGZiNCwgMHgyNDYzZDhmMCwgCisweDQzMTAyMywgMHgyYzQyMjcxMCwgMHgxNDQwMDA5ZiwgMHgwLCAKKzB4M2MwMjAwMDIsIDB4OGM0MjhmYzAsIDB4MTA0MDAwMDUsIDB4MCwgCisweDNjMDIwMDAyLCAweDhjNDI4ZjljLCAweDEwNDAwMGEwLCAweDI0MDIwMDAyLCAKKzB4M2MwMzAwMDIsIDB4MjQ2MzhmYTAsIDB4OGM2MjAwMDAsIDB4MmM0MjRlMjEsIAorMHgxMDQwMDA5YSwgMHgyNDAyMDAwMiwgMHgzYzAyMDAwMiwgMHg4YzQyOGZjYywgCisweDEwNDAwMDBlLCAweDAsIDB4M2MwMjAwMDIsIDB4OGM0MjhmOWMsIAorMHgzYzAxMDAwMiwgMHhhYzIwOGZjYywgMHgzMDQyMDA4MCwgMHgxMDQwMDAyZiwgCisweDI0MDIwMDBjLCAweDhmODIwMjA0LCAweDMwNDIwMDgwLCAweDE0NDAwMDBjLCAKKzB4MjQwMjAwMDMsIDB4MTAwMDAwMjksIDB4MjQwMjAwMGMsIDB4M2MwMjAwMDIsIAorMHg4YzQyOGY5YywgMHgzMDQyMDA4MCwgMHgxNDQwMDAwNSwgMHgyNDAyMDAwMywgCisweDhmODIwMjA0LCAweDMwNDIwMDgwLCAweDEwNDAwMDFmLCAweDI0MDIwMDAzLCAKKzB4YWM2MjAwMDAsIDB4MjQwMjAwMGEsIDB4M2MwMTAwMDIsIDB4YWMyMjhmOTAsIAorMHgzYzA0MDAwMiwgMHgyNDg0OGZkOCwgMHg4YzgyMDAwMCwgMHgzYzAzMDAwMiwgCisweDhjNjM4ZmIwLCAweDQzMTAyNSwgMHhhZjgyMDIwNCwgMHg4YzgzMDAwMCwgCisweDNjMDQwMDAyLCAweDhjODQ4ZmIwLCAweDI0MDIwMDBiLCAweDNjMDEwMDAyLCAKKzB4YWMyMjhmOTAsIDB4NjQxODI1LCAweDNjMDEwMDAyLCAweGFjMjM4ZmUwLCAKKzB4M2MwNTAwMDIsIDB4MjRhNThmYTAsIDB4OGNhMjAwMDAsIDB4MmM0MjRlMjEsIAorMHgxMDQwMDA2NiwgMHgyNDAyMDAwMiwgMHgzYzAyMDAwMiwgMHg4YzQyOGZkMCwgCisweDEwNDAwMDA1LCAweDAsIDB4MjQwMjAwMGMsIDB4M2MwMTAwMDIsIAorMHgxMDAwMDA2NywgMHhhYzIyOGY5MCwgMHgzYzAyMDAwMiwgMHg4YzQyOGZjMCwgCisweDEwNDAwMDYzLCAweDAsIDB4M2MwNDAwMDIsIDB4OGM4NDhmOWMsIAorMHgxMDgwMDA1NSwgMHgzMDgyMDAwOCwgMHgzYzAzMDAwMiwgMHg4YzYzOGZhYywgCisweDEwNjIwMDViLCAweDI0MDIwMDAzLCAweDNjMDEwMDAyLCAweGFjMjQ4ZmM4LCAKKzB4YWNhMjAwMDAsIDB4MjQwMjAwMDYsIDB4M2MwMTAwMDIsIDB4MTAwMDAwNTQsIAorMHhhYzIyOGY5MCwgMHg4ZjgyMDIwMCwgMHgzNDQyMDAwMiwgMHhhZjgyMDIwMCwgCisweDhmODMwMDU0LCAweDI0MDIwMDBkLCAweDNjMDEwMDAyLCAweGFjMjI4ZjkwLCAKKzB4M2MwMTAwMDIsIDB4YWMyMzhmYjQsIDB4OGY4MzAwNTQsIDB4M2MwMjAwMDIsIAorMHg4YzQyOGZiNCwgMHgyNDYzZDhmMCwgMHg0MzEwMjMsIDB4MmM0MjI3MTAsIAorMHgxNDQwMDAzMSwgMHgwLCAweDNjMDIwMDAyLCAweDhjNDI4ZmQwLCAKKzB4MTA0MDAwMjAsIDB4MjQwMjAwMGUsIDB4M2MwMzAwMDIsIDB4OGM2MzhmZTQsIAorMHgzYzAxMDAwMiwgMHgxNDYwMDAxNSwgMHhhYzIyOGY5MCwgMHhjMDAzZTZkLCAKKzB4MCwgMHgzYzA1MDAwMSwgMHg4Y2E1NmQ5OCwgMHhjMDA1MjliLCAKKzB4MjAyMSwgMHgzYzAzMDAwMSwgMHg4YzYzNmQ5OCwgMHgyNDAyMDAwNCwgCisweDE0NjIwMDA1LCAweDI0MDNmZmZiLCAweDNjMDIwMDAxLCAweDhjNDI2ZDk0LCAKKzB4MTAwMDAwMDMsIDB4MjQwM2ZmZjcsIDB4M2MwMjAwMDEsIDB4OGM0MjZkOTQsIAorMHg0MzEwMjQsIDB4M2MwMTAwMDEsIDB4YWMyMjZkOTQsIDB4OGY4MzAyMjQsIAorMHgzYzAyMDIwMCwgMHgzYzAxMDAwMiwgMHhhYzIzOGZlYywgMHgxMDAwMDAyMCwgCisweDI4MmEwMjUsIDB4M2MwMjAwMDIsIDB4OGM0MjhmYzAsIDB4MTA0MDAwMDUsIAorMHgwLCAweDNjMDIwMDAyLCAweDhjNDI4ZjljLCAweDEwNDAwMDBmLCAKKzB4MjQwMjAwMDIsIDB4M2MwMjAwMDIsIDB4OGM0MjhmYTAsIDB4MmM0MjRlMjEsIAorMHgxMDQwMDAwYSwgMHgyNDAyMDAwMiwgMHgzYzAyMDAwMiwgMHg4YzQyOGZjMCwgCisweDEwNDAwMDBmLCAweDAsIDB4M2MwMjAwMDIsIDB4OGM0MjhmOWMsIAorMHgxNDQwMDAwYiwgMHgwLCAweDI0MDIwMDAyLCAweDNjMDEwMDAyLCAKKzB4MTAwMDAwMDcsIDB4YWMyMjhmOTAsIDB4M2MwMjAwMDIsIDB4OGM0MjhmYzAsIAorMHgxMDQwMDAwMywgMHgwLCAweGMwMDNkYWYsIDB4MCwgCisweDhmODIwMjIwLCAweDNjMDNmNzAwLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwgCisweDhmYmYwMDEwLCAweDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4M2MwMzAwMDIsIAorMHgyNDYzOGZlOCwgMHg4YzYyMDAwMCwgMHgxMDQwMDAwNSwgMHgzNDQyMjAwMCwgCisweDNjMDEwMDAyLCAweGFjMjI4ZmRjLCAweDEwMDAwMDAzLCAweGFjNjAwMDAwLCAKKzB4M2MwMTAwMDIsIDB4YWMyNDhmZGMsIDB4M2UwMDAwOCwgMHgwLCAKKzB4MjdiZGZmZTAsIDB4MzA4MjAwMzAsIDB4YWZiZjAwMTgsIDB4M2MwMTAwMDIsIAorMHhhYzIyOGZlNCwgMHgxNDQwMDA2NywgMHgzYzAyZmZmZiwgMHgzNDQyMWYwZSwgCisweDgyMTAyNCwgMHgxNDQwMDA2MSwgMHgyNDAyMDAzMCwgMHgzMDgyMjAwMCwgCisweDEwNDAwMDVkLCAweDMwODM4MDAwLCAweDMxYTAyLCAweDMwODIwMDAxLCAKKzB4MjEyMDAsIDB4M2MwNDAwMDEsIDB4OGM4NDZmMjAsIDB4NjIxODI1LCAKKzB4MzMxYzIsIDB4M2MwMzAwMDEsIDB4MjQ2MzZlNDgsIDB4MzA4MjgwMDAsIAorMHgyMTIwMiwgMHgzMDg0MDAwMSwgMHg0MjIwMCwgMHg0NDEwMjUsIAorMHgyMzljMiwgMHg2MTA4MCwgMHg0MzEwMjEsIDB4NDcxMDIxLCAKKzB4OTA0MzAwMDAsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMjUsIDB4MCwgCisweDEwNjAwMDA3LCAweDI0MDIwMDAyLCAweDEwNjIwMDEzLCAweDI0MDIwMDAzLCAKKzB4MTA2MjAwMmMsIDB4M2MwNTAwMGYsIDB4MTAwMDAwMzcsIDB4MCwgCisweDhmODIwMjAwLCAweDI0MDNmZWZmLCAweDQzMTAyNCwgMHhhZjgyMDIwMCwgCisweDhmODIwMjIwLCAweDNjMDNmZmZlLCAweDM0NjNmZmZmLCAweDQzMTAyNCwgCisweGFmODIwMjIwLCAweDNjMDEwMDAyLCAweGFjMjA5MDA0LCAweDNjMDEwMDAyLCAKKzB4MTAwMDAwMzQsIDB4YWMyMDkwMGMsIDB4OGY4MjAyMDAsIDB4MzQ0MjAxMDAsIAorMHhhZjgyMDIwMCwgMHg4ZjgyMDIyMCwgMHgzYzAzZmZmZSwgMHgzNDYzZmZmZiwgCisweDQzMTAyNCwgMHhhZjgyMDIyMCwgMHgyNDAyMDEwMCwgMHgzYzAxMDAwMiwgCisweGFjMjI5MDA0LCAweDNjMDEwMDAyLCAweDEwMDAwMDI2LCAweGFjMjA5MDBjLCAKKzB4OGY4MjAyMDAsIDB4MjQwM2ZlZmYsIDB4NDMxMDI0LCAweGFmODIwMjAwLCAKKzB4OGY4MjAyMjAsIDB4M2MwMzAwMDEsIDB4NDMxMDI1LCAweGFmODIwMjIwLCAKKzB4M2MwMTAwMDIsIDB4YWMyMDkwMDQsIDB4M2MwMTAwMDIsIDB4MTAwMDAwMTksIAorMHhhYzIzOTAwYywgMHg4ZjgyMDIwMCwgMHgzNDQyMDEwMCwgMHhhZjgyMDIwMCwgCisweDhmODIwMjIwLCAweDNjMDMwMDAxLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwgCisweDI0MDIwMTAwLCAweDNjMDEwMDAyLCAweGFjMjI5MDA0LCAweDNjMDEwMDAyLCAKKzB4MTAwMDAwMGMsIDB4YWMyMzkwMGMsIDB4MzRhNWZmZmYsIDB4M2MwNDAwMDEsIAorMHgyNDg0NmMzOCwgMHhhZmEzMDAxMCwgMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAKKzB4MTAwMDAwMDQsIDB4MCwgMHgyNDAyMDAzMCwgMHgzYzAxMDAwMiwgCisweGFjMjI4ZmU4LCAweDhmYmYwMDE4LCAweDNlMDAwMDgsIDB4MjdiZDAwMjAsIAorMHgwLCAweDAsIDB4MCwgMHgyN2JkZmZjOCwgCisweGFmYjIwMDI4LCAweDgwOTAyMSwgMHhhZmIzMDAyYywgMHhhMDk4MjEsIAorMHhhZmIwMDAyMCwgMHhjMDgwMjEsIDB4M2MwNDAwMDEsIDB4MjQ4NDZjNTAsIAorMHgzYzA1MDAwOSwgMHgzYzAyMDAwMSwgMHg4YzQyNmQ5OCwgMHgzNGE1OTAwMSwgCisweDI0MDMwMjEsIDB4MjYwMzgyMSwgMHhhZmJmMDAzMCwgMHhhZmIxMDAyNCwgCisweGE3YTAwMDFhLCAweGFmYjAwMDE0LCAweGMwMDJiM2IsIDB4YWZhMjAwMTAsIAorMHgyNDAyMDAwMiwgMHgxMjYyMDA4MywgMHgyZTYyMDAwMywgMHgxMDQwMDAwNSwgCisweDI0MDIwMDAxLCAweDEyNjIwMDBhLCAweDAsIDB4MTAwMDAxNzMsIAorMHgwLCAweDI0MDIwMDA0LCAweDEyNjIwMGY4LCAweDI0MDIwMDA4LCAKKzB4MTI2MjAwZjcsIDB4M2MwMmZmZWMsIDB4MTAwMDAxNmMsIDB4MCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZDk0LCAweDMwNDIwMDAyLCAweDE0NDAwMDA0LCAKKzB4MTI4OTQwLCAweDNjMDJmZmZiLCAweDM0NDJmZmZmLCAweDIwMjgwMjQsIAorMHgzYzAxMDAwMiwgMHgzMTA4MjEsIDB4YWMzMDhmZmMsIDB4M2MwMjQwMDAsIAorMHgyMDIxMDI0LCAweDEwNDAwMDRlLCAweDEwMjNjMiwgMHgzMDg0MDAzMCwgCisweDEwMTM4MiwgMHgzMDQyMDAxYywgMHgzYzAzMDAwMSwgMHgyNDYzNmRkOCwgCisweDQzMTAyMSwgMHg4MjM4MjEsIDB4M2MwMjAwMjAsIDB4MjAyMTAyNCwgCisweDEwNDAwMDA2LCAweDI0MDIwMTAwLCAweDNjMDEwMDAyLCAweDMxMDgyMSwgCisweGFjMjI5MDAwLCAweDEwMDAwMDA1LCAweDNjMDIwMDgwLCAweDNjMDEwMDAyLCAKKzB4MzEwODIxLCAweGFjMjA5MDAwLCAweDNjMDIwMDgwLCAweDIwMjEwMjQsIAorMHgxMDQwMDAwNiwgMHgxMjE5NDAsIDB4M2MwMjAwMDEsIDB4M2MwMTAwMDIsIAorMHgyMzA4MjEsIDB4MTAwMDAwMDUsIDB4YWMyMjkwMDgsIDB4MTIxMTQwLCAKKzB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMjA5MDA4LCAweDk0ZTQwMDAwLCAKKzB4M2MwMzAwMDEsIDB4OGM2MzZmNDAsIDB4MjQwMjAwMDUsIDB4MTA2MjAwMTAsIAorMHhhN2E0MDAxOCwgMHgzMjAyNDAwMCwgMHgxMDQwMDAwMiwgMHgzNDgyNDAwMCwgCisweGE3YTIwMDE4LCAweDI0MDQwMDAxLCAweDk0ZTIwMDAyLCAweDI0MDUwMDA0LCAKKzB4MjRlNjAwMDIsIDB4MzQ0MjAwMDEsIDB4YzAwNDViZSwgMHhhNGUyMDAwMiwgCisweDI0MDQwMDAxLCAweDI4MjEsIDB4YzAwNDViZSwgMHgyN2E2MDAxOCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZDk4LCAweDI0MTEwMDAxLCAweDNjMDEwMDAxLCAKKzB4YWMzMTZkYTQsIDB4MTQ1MzAwMDQsIDB4MzIwMjgwMDAsIDB4YzAwM2RhZiwgCisweDAsIDB4MzIwMjgwMDAsIDB4MTA0MDAxMWMsIDB4MCwgCisweGMwMDNkYWYsIDB4MCwgMHgzYzAzMDAwMSwgMHg4YzYzNmY0MCwgCisweDI0MDIwMDA1LCAweDEwNjIwMTE1LCAweDI0MDIwMDAyLCAweDNjMDEwMDAxLCAKKzB4YWMzMTZkOWMsIDB4M2MwMTAwMDEsIDB4MTAwMDAxMTAsIDB4YWMyMjZkOTgsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAwNCwgMHgyN2IwMDAxYSwgMHhjMDA0NWJlLCAKKzB4MjAwMzAyMSwgMHgyNDA0MDAwMSwgMHgyODIxLCAweGMwMDQ1YmUsIAorMHgyMDAzMDIxLCAweDNjMDIwMDAyLCAweDUxMTAyMSwgMHg4YzQyOGZmNCwgCisweDNjMDQwMDAxLCAweDhjODQ2ZDk4LCAweDNjMDNiZmZmLCAweDM0NjNmZmZmLCAKKzB4M2MwMTAwMDEsIDB4YWMzMzZkYTQsIDB4NDMxMDI0LCAweDNjMDEwMDAyLCAKKzB4MzEwODIxLCAweDEwOTMwMGY3LCAweGFjMjI4ZmY0LCAweDEwMDAwMGY3LCAKKzB4MCwgMHgzYzAyMjAwMCwgMHgyMDIxMDI0LCAweDEwNDAwMDA1LCAKKzB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjZmMWMsIDB4MTAwMDAwMDQsIAorMHgxMjg5NDAsIDB4M2MwMTAwMDEsIDB4YWMyMDZmMWMsIDB4MTI4OTQwLCAKKzB4M2MwMTAwMDIsIDB4MzEwODIxLCAweGFjMzA4ZmY4LCAweDNjMDI0MDAwLCAKKzB4MjAyMTAyNCwgMHgxNDQwMDAxNCwgMHgwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjZmMWMsIDB4MTA0MDAwMDYsIDB4MjQwNDAwMDQsIDB4MjQwNTAwMDEsIAorMHhjMDA0ZGRiLCAweDI0MDYyMDAwLCAweDI0MDIwMDAxLCAweGFlZTIwNGI4LCAKKzB4M2MwMjAwMDIsIDB4NTExMDIxLCAweDhjNDI4ZmYwLCAweDNjMDNiZmZmLCAKKzB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAweDNjMDEwMDAyLCAweDMxMDgyMSwgCisweDEwMDAwMGQwLCAweGFjMjI4ZmYwLCAweDNjMDIwMDAxLCAweDhjNDI2ZjFjLCAKKzB4MTA0MDAwMjgsIDB4M2MwMzAwYTAsIDB4MjAzMTAyNCwgMHg1NDQzMDAwZCwgCisweDNjMDIwMDIwLCAweDNjMDIwMDAxLCAweDhjNDI2ZjIwLCAweDI0MDMwMTAwLCAKKzB4M2MwMTAwMDIsIDB4MzEwODIxLCAweGFjMjM5MDA0LCAweDNjMDMwMDAxLCAKKzB4M2MwMTAwMDIsIDB4MzEwODIxLCAweGFjMjM5MDBjLCAweDEwMDAwMDE1LCAKKzB4MzQ0MjA0MDAsIDB4MjAyMTAyNCwgMHgxMDQwMDAwOCwgMHgyNDAzMDEwMCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZjIwLCAweDNjMDEwMDAyLCAweDMxMDgyMSwgCisweGFjMjM5MDA0LCAweDEwMDAwMDBiLCAweDM0NDIwODAwLCAweDNjMDIwMDgwLCAKKzB4MjAyMTAyNCwgMHgxMDQwMDAyZSwgMHgzYzAzMDAwMSwgMHgzYzAyMDAwMSwgCisweDhjNDI2ZjIwLCAweDNjMDEwMDAyLCAweDMxMDgyMSwgMHhhYzIzOTAwYywgCisweDM0NDIwYzAwLCAweDNjMDEwMDAxLCAweGFjMjI2ZjIwLCAweDEwMDAwMDI1LCAKKzB4MjQwNDAwMDEsIDB4M2MwMjAwMjAsIDB4MjAyMTAyNCwgMHgxMDQwMDAwNiwgCisweDI0MDIwMTAwLCAweDNjMDEwMDAyLCAweDMxMDgyMSwgMHhhYzIyOTAwNCwgCisweDEwMDAwMDA1LCAweDNjMDIwMDgwLCAweDNjMDEwMDAyLCAweDMxMDgyMSwgCisweGFjMjA5MDA0LCAweDNjMDIwMDgwLCAweDIwMjEwMjQsIDB4MTA0MDAwMDcsIAorMHgxMjE5NDAsIDB4M2MwMjAwMDEsIDB4M2MwMTAwMDIsIDB4MjMwODIxLCAKKzB4YWMyMjkwMGMsIDB4MTAwMDAwMDYsIDB4MjQwNDAwMDEsIDB4MTIxMTQwLCAKKzB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMjA5MDBjLCAweDI0MDQwMDAxLCAKKzB4MjgyMSwgMHgyN2IwMDAxZSwgMHhjMDA0NTdjLCAweDIwMDMwMjEsIAorMHgyNDA0MDAwMSwgMHgyODIxLCAweGMwMDQ1N2MsIDB4MjAwMzAyMSwgCisweDI0MDQwMDAxLCAweDI0MDUwMDAxLCAweDI3YjAwMDFjLCAweGMwMDQ1N2MsIAorMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAweDI0MDUwMDAxLCAweGMwMDQ1N2MsIAorMHgyMDAzMDIxLCAweDEwMDAwMDc3LCAweDAsIDB4M2MwMmZmZWMsIAorMHgzNDQyZmZmZiwgMHgyMDI4MDI0LCAweDNjMDIwMDA4LCAweDIwMjgwMjUsIAorMHgxMjExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMzA4ZmY4LCAKKzB4M2MwMjIwMDAsIDB4MjAyMTAyNCwgMHgxMDQwMDAwOSwgMHgwLCAKKzB4M2MwMjAwMDEsIDB4OGM0MjZlNDQsIDB4MTQ0MDAwMDUsIDB4MjQwMjAwMDEsIAorMHgzYzAxMDAwMSwgMHhhYzIyNmYxYywgMHgxMDAwMDAwNCwgMHgzYzAyNDAwMCwgCisweDNjMDEwMDAxLCAweGFjMjA2ZjFjLCAweDNjMDI0MDAwLCAweDIwMjEwMjQsIAorMHgxNDQwMDAxZCwgMHgyNDAyMGUwMSwgMHgzYzAzMDAwMSwgMHg4YzYzNmYxYywgCisweGFmODIwMjM4LCAweDNjMDEwMDAxLCAweGFjMjA2ZGIwLCAweDEwNjAwMDA1LCAKKzB4MjQwMjIwMjAsIDB4M2MwMTAwMDEsIDB4YWMyMjZmMjAsIDB4MjQwMjAwMDEsIAorMHhhZWUyMDRiOCwgMHgzYzA0YmZmZiwgMHgxMjE5NDAsIDB4M2MwMjAwMDIsIAorMHg0MzEwMjEsIDB4OGM0MjhmZjAsIDB4M2MwNTAwMDEsIDB4OGNhNTZkOTgsIAorMHgzNDg0ZmZmZiwgMHg0NDEwMjQsIDB4M2MwMTAwMDIsIDB4MjMwODIxLCAKKzB4YWMyMjhmZjAsIDB4MjQwMjAwMDEsIDB4MTBhMjAwNDQsIDB4MCwgCisweDEwMDAwMDQwLCAweDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMWMsIAorMHgxMDQwMDAxYywgMHgyNDAyMjAwMCwgMHgzYzAxMDAwMSwgMHhhYzIyNmYyMCwgCisweDNjMDMwMGEwLCAweDIwMzEwMjQsIDB4MTQ0MzAwMDUsIDB4MTIxMTQwLCAKKzB4MzQwMmEwMDAsIDB4M2MwMTAwMDEsIDB4MTAwMDAwMmQsIDB4YWMyMjZmMjAsIAorMHgzYzAzMDAwMiwgMHg2MjE4MjEsIDB4OGM2MzhmZjgsIDB4M2MwMjAwMjAsIAorMHg2MjEwMjQsIDB4MTA0MDAwMDQsIDB4MjQwMjIwMDEsIDB4M2MwMTAwMDEsIAorMHgxMDAwMDAyMywgMHhhYzIyNmYyMCwgMHgzYzAyMDA4MCwgMHg2MjEwMjQsIAorMHgxMDQwMDAxZiwgMHgzNDAyYTAwMSwgMHgzYzAxMDAwMSwgMHgxMDAwMDAxYywgCisweGFjMjI2ZjIwLCAweDNjMDIwMDIwLCAweDIwMjEwMjQsIDB4MTA0MDAwMDcsIAorMHgxMjE5NDAsIDB4MjQwMjAxMDAsIDB4M2MwMTAwMDIsIDB4MjMwODIxLCAKKzB4YWMyMjkwMDQsIDB4MTAwMDAwMDYsIDB4M2MwMjAwODAsIDB4MTIxMTQwLCAKKzB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMjA5MDA0LCAweDNjMDIwMDgwLCAKKzB4MjAyMTAyNCwgMHgxMDQwMDAwNiwgMHgxMjE5NDAsIDB4M2MwMjAwMDEsIAorMHgzYzAxMDAwMiwgMHgyMzA4MjEsIDB4MTAwMDAwMDUsIDB4YWMyMjkwMGMsIAorMHgxMjExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMjA5MDBjLCAKKzB4M2MwMzAwMDEsIDB4OGM2MzZkOTgsIDB4MjQwMjAwMDEsIDB4MTA2MjAwMDMsIAorMHgwLCAweGMwMDNkYWYsIDB4MCwgMHg4ZmJmMDAzMCwgCisweDhmYjMwMDJjLCAweDhmYjIwMDI4LCAweDhmYjEwMDI0LCAweDhmYjAwMDIwLCAKKzB4M2UwMDAwOCwgMHgyN2JkMDAzOCwgMHgyN2JkZmZiMCwgMHhhZmIzMDAzYywgCisweDk4MjEsIDB4YWZiNTAwNDAsIDB4YTgyMSwgMHhhZmIxMDAzNCwgCisweDg4MjEsIDB4MjQwMjAwMDIsIDB4YWZiZjAwNDgsIDB4YWZiZTAwNDQsIAorMHhhZmIyMDAzOCwgMHhhZmIwMDAzMCwgMHhhZmE0MDAyYywgMHhhN2EwMDAxYSwgCisweGE3YTAwMDE4LCAweGE3YTAwMDIwLCAweGE3YTAwMDFlLCAweGE3YTAwMDIyLCAKKzB4MTBhMjAxMzAsIDB4YTdhMDAwMWMsIDB4MmNhMjAwMDMsIDB4MTA0MDAwMDUsIAorMHgyNDAyMDAwMSwgMHgxMGEyMDAwYSwgMHgzYzAyNDAwMCwgMHgxMDAwMDI1ZCwgCisweDIyMDEwMjEsIDB4MjQwMjAwMDQsIDB4MTBhMjAyMGEsIDB4MjQwMjAwMDgsIAorMHgxMGEyMDIwOCwgMHgyMjAxMDIxLCAweDEwMDAwMjU2LCAweDAsIAorMHg4ZmE4MDAyYywgMHg4ODE0MCwgMHgzYzAzMDAwMiwgMHg3MDE4MjEsIAorMHg4YzYzOGZmYywgMHg2MjEwMjQsIDB4MTQ0MDAwMDksIDB4MjQwNDAwMDEsIAorMHgzYzAyN2ZmZiwgMHgzNDQyZmZmZiwgMHg2Mjg4MjQsIDB4M2MwMTAwMDIsIAorMHgzMDA4MjEsIDB4YWMzMThmZjQsIDB4MTAwMDAyNDYsIDB4MjIwMTAyMSwgCisweDI0MDUwMDAxLCAweGMwMDQ1N2MsIDB4MjdhNjAwMTgsIDB4MjQwNDAwMDEsIAorMHgyNDA1MDAwMSwgMHhjMDA0NTdjLCAweDI3YTYwMDE4LCAweDk3YTIwMDE4LCAKKzB4MzA0MjAwMDQsIDB4MTA0MDAwZDksIDB4M2MxMTQwMDAsIDB4M2MwMjAwMDEsIAorMHg4YzQyNmY0MCwgMHgyNDQzZmZmZiwgMHgyYzYyMDAwNiwgMHgxMDQwMDBkOSwgCisweDMxMDgwLCAweDNjMDEwMDAxLCAweDIyMDgyMSwgMHg4YzIyNmM2OCwgCisweDQwMDAwOCwgMHgwLCAweDI0MDQwMDAxLCAweDI0MDUwMDExLCAKKzB4MjdiMDAwMWEsIDB4YzAwNDU3YywgMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAKKzB4MjQwNTAwMTEsIDB4YzAwNDU3YywgMHgyMDAzMDIxLCAweDk3YTMwMDFhLCAKKzB4MzA2MjQwMDAsIDB4MTA0MDAwMDIsIDB4M2MxNTAwMTAsIDB4M2MxNTAwMDgsIAorMHgzMDYyODAwMCwgMHgxMDQwMDBhYSwgMHgzYzEzMDAwMSwgMHgxMDAwMDBhOCwgCisweDNjMTMwMDAyLCAweDI0MDQwMDAxLCAweDI0MDUwMDE0LCAweDI3YjAwMDFhLCAKKzB4YzAwNDU3YywgMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAweDI0MDUwMDE0LCAKKzB4YzAwNDU3YywgMHgyMDAzMDIxLCAweDk3YTMwMDFhLCAweDMwNjIxMDAwLCAKKzB4MTA0MDAwMDIsIDB4M2MxNTAwMTAsIDB4M2MxNTAwMDgsIDB4MzA2MjA4MDAsIAorMHgxMDQwMDA5NywgMHgzYzEzMDAwMSwgMHgxMDAwMDA5NSwgMHgzYzEzMDAwMiwgCisweDI0MDQwMDAxLCAweDI0MDUwMDE5LCAweDI3YjAwMDFjLCAweGMwMDQ1N2MsIAorMHgyMDAzMDIxLCAweDI0MDQwMDAxLCAweDI0MDUwMDE5LCAweGMwMDQ1N2MsIAorMHgyMDAzMDIxLCAweDk3YTIwMDFjLCAweDMwNDMwNzAwLCAweDI0MDIwNDAwLCAKKzB4MTA2MjAwMjcsIDB4Mjg2MjA0MDEsIDB4MTA0MDAwMGUsIDB4MjQwMjAyMDAsIAorMHgxMDYyMDAxZiwgMHgyODYyMDIwMSwgMHgxMDQwMDAwNSwgMHgyNDAyMDEwMCwgCisweDUwNjIwMDFlLCAweDNjMTMwMDAxLCAweDEwMDAwMDFlLCAweDI0MDQwMDAxLCAKKzB4MjQwMjAzMDAsIDB4NTA2MjAwMTksIDB4M2MxMzAwMDIsIDB4MTAwMDAwMTksIAorMHgyNDA0MDAwMSwgMHgyNDAyMDYwMCwgMHgxMDYyMDAwZCwgMHgyODYyMDYwMSwgCisweDEwNDAwMDA1LCAweDI0MDIwNTAwLCAweDUwNjIwMDBiLCAweDNjMTMwMDAyLCAKKzB4MTAwMDAwMTAsIDB4MjQwNDAwMDEsIDB4MjQwMjA3MDAsIDB4MTQ2MjAwMGQsIAorMHgyNDA0MDAwMSwgMHgzYzEzMDAwNCwgMHgxMDAwMDAwYSwgMHgzYzE1MDAwOCwgCisweDEwMDAwMDA2LCAweDNjMTMwMDA0LCAweDEwMDAwMDA1LCAweDNjMTUwMDA4LCAKKzB4M2MxMzAwMDEsIDB4MTAwMDAwMDIsIDB4M2MxNTAwMDgsIDB4M2MxNTAwMTAsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAxOCwgMHgyN2IwMDAxZSwgMHhjMDA0NTdjLCAKKzB4MjAwMzAyMSwgMHgyNDA0MDAwMSwgMHgyNDA1MDAxOCwgMHhjMDA0NTdjLCAKKzB4MjAwMzAyMSwgMHg4ZmE4MDAyYywgMHg5N2E3MDAxZSwgMHg4MTE0MCwgCisweDNjMDYwMDAyLCAweGMyMzAyMSwgMHg4Y2M2OGZmNCwgMHg5N2EyMDAyMiwgCisweDNjMTAwMDAxLCAweDI2MTA2YzVjLCAweDIwMDIwMjEsIDB4YWZhMjAwMTAsIAorMHg5N2EyMDAxYywgMHgzYzA1MDAwYywgMHgzNGE1MDMwMywgMHhjMDAyYjNiLCAKKzB4YWZhMjAwMTQsIDB4M2MwMjAwMDQsIDB4MTY2MjAwMTAsIDB4M2MwMjAwMDEsIAorMHg4Zjg0MDA1NCwgMHgyNDAzMDAwMSwgMHgyNDAyMDAwMiwgMHgzYzAxMDAwMSwgCisweGFjMjM2ZDljLCAweDNjMDEwMDAxLCAweGFjMjI2ZDk4LCAweDNjMDEwMDAxLCAKKzB4YWMyMzZkYTQsIDB4M2MwMTAwMDEsIDB4YWMyMzZlMjQsIDB4M2MwMTAwMDEsIAorMHhhYzI0NmYzMCwgMHgxMDAwMDA0ZiwgMHgyYjM4ODI1LCAweDE2NjIwMDM5LCAKKzB4M2MwMjgwMDAsIDB4M2MwMjAwMDEsIDB4OGM0MjZlMjAsIDB4MTQ0MDAwMWUsIAorMHgyNDA0MDAxOCwgMHgyMDIxLCAweDI4MjEsIDB4YzAwNGRkYiwgCisweDM0MDY4MDAwLCAweDhmODMwMDU0LCAweDhmODIwMDU0LCAweDJiMzg4MjUsIAorMHgxMDAwMDAwMiwgMHgyNDYzMDAzMiwgMHg4ZjgyMDA1NCwgMHg2MjEwMjMsIAorMHgyYzQyMDAzMywgMHgxNDQwZmZmYywgMHgwLCAweDhmODMwMDU0LCAKKzB4MjQwMjAwMDEsIDB4M2MwMTAwMDEsIDB4YWMyMjZlMjAsIDB4M2MwMTAwMDEsIAorMHhhYzIyNmQ5YywgMHgzYzAxMDAwMSwgMHhhYzIyNmQ5OCwgMHgzYzAxMDAwMSwgCisweGFjMjI2ZGE0LCAweDNjMDEwMDAxLCAweGFjMjI2ZTI0LCAweDNjMDEwMDAxLCAKKzB4MTAwMDAwMmMsIDB4YWMyMzZmMzAsIDB4MjgyMSwgMHhjMDA0ZGRiLCAKKzB4MjQwNjA0MDQsIDB4MjAyMSwgMHgyNDA1MDAxZSwgMHgyN2E2MDAxOCwgCisweDI0MDIwMDAyLCAweGMwMDQ1YmUsIDB4YTdhMjAwMTgsIDB4MjAyMSwgCisweDI4MjEsIDB4MjdhNjAwMTgsIDB4YzAwNDViZSwgMHhhN2EwMDAxOCwgCisweDI0MDQwMDE4LCAweDI0MDUwMDAyLCAweGMwMDRkZGIsIDB4MjQwNjAwMDQsIAorMHgzYzAyODAwMCwgMHgyMjIxMDI1LCAweDJiMzE4MjUsIDB4MTAwMDAwMTUsIAorMHg0Mzg4MjUsIDB4MjIyMTAyNSwgMHgyNzUxODI1LCAweDQzODgyNSwgCisweDIwMDIwMjEsIDB4OTdhNjAwMWMsIDB4M2MwNzAwMDEsIDB4OGNlNzZkOTgsIAorMHgzYzA1MDAwYywgMHgzNGE1MDMyNiwgMHhhZmIzMDAxMCwgMHhjMDAyYjNiLCAKKzB4YWZiMTAwMTQsIDB4MTAwMDAwMDcsIDB4MCwgMHgzYzExMDAwMiwgCisweDIzMDg4MjEsIDB4OGUzMThmZmMsIDB4M2MwMjdmZmYsIDB4MzQ0MmZmZmYsIAorMHgyMjI4ODI0LCAweDNjMDIwMDAxLCAweDhjNDI2ZGE4LCAweDEwNDAwMDFlLCAKKzB4MCwgMHgzYzAyMDAwMSwgMHg4YzQyNmYxYywgMHgxMDQwMDAwMiwgCisweDNjMDIyMDAwLCAweDIyMjg4MjUsIDB4OGZhODAwMmMsIDB4ODExNDAsIAorMHgzYzAxMDAwMiwgMHgyMjA4MjEsIDB4OGMyMjkwMDAsIDB4MTA0MDAwMDMsIAorMHgzYzAyMDAyMCwgMHgxMDAwMDAwNSwgMHgyMjI4ODI1LCAweDNjMDJmZmRmLCAKKzB4MzQ0MmZmZmYsIDB4MjIyODgyNCwgMHg4ZmE4MDAyYywgMHg4MTE0MCwgCisweDNjMDEwMDAyLCAweDIyMDgyMSwgMHg4YzIyOTAwOCwgMHgxMDQwMDAwMywgCisweDNjMDIwMDgwLCAweDEwMDAwMDA0LCAweDIyMjg4MjUsIDB4M2MwMmZmN2YsIAorMHgzNDQyZmZmZiwgMHgyMjI4ODI0LCAweDhmYTgwMDJjLCAweDgxMTQwLCAKKzB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMzE4ZmY0LCAweDEwMDAwMTM1LCAKKzB4MjIwMTAyMSwgMHg4ZmE4MDAyYywgMHg4ZjE0MCwgMHgzYzAzMDAwMiwgCisweDdlMTgyMSwgMHg4YzYzOGZmOCwgMHgzYzAyNDAwMCwgMHg2MjEwMjQsIAorMHgxNDQwMDAwOSwgMHgyNDA0MDAwMSwgMHgzYzAyN2ZmZiwgMHgzNDQyZmZmZiwgCisweDYyODgyNCwgMHgzYzAxMDAwMiwgMHgzZTA4MjEsIDB4YWMzMThmZjAsIAorMHgxMDAwMDEyNCwgMHgyMjAxMDIxLCAweDI4MjEsIDB4YzAwNDU3YywgCisweDI3YTYwMDE4LCAweDI0MDQwMDAxLCAweDI4MjEsIDB4YzAwNDU3YywgCisweDI3YTYwMDE4LCAweDI0MDQwMDAxLCAweDI0MDUwMDAxLCAweDI3YjIwMDIwLCAKKzB4YzAwNDU3YywgMHgyNDAzMDIxLCAweDI0MDQwMDAxLCAweDI0MDUwMDAxLCAKKzB4YzAwNDU3YywgMHgyNDAzMDIxLCAweDI0MDQwMDAxLCAweDI0MDUwMDA0LCAKKzB4MjdiMTAwMWUsIDB4YzAwNDU3YywgMHgyMjAzMDIxLCAweDI0MDQwMDAxLCAKKzB4MjQwNTAwMDQsIDB4YzAwNDU3YywgMHgyMjAzMDIxLCAweDI0MDQwMDAxLCAKKzB4MjQwNTAwMDUsIDB4MjdiMDAwMjIsIDB4YzAwNDU3YywgMHgyMDAzMDIxLCAKKzB4MjQwNDAwMDEsIDB4MjQwNTAwMDUsIDB4YzAwNDU3YywgMHgyMDAzMDIxLCAKKzB4MjQwNDAwMDEsIDB4MjQwNTAwMTAsIDB4YzAwNDU3YywgMHgyN2E2MDAxOCwgCisweDI0MDQwMDAxLCAweDI0MDUwMDEwLCAweGMwMDQ1N2MsIDB4MjdhNjAwMTgsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAwYSwgMHhjMDA0NTdjLCAweDI0MDMwMjEsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAwYSwgMHhjMDA0NTdjLCAweDI0MDMwMjEsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAxOCwgMHhjMDA0NTdjLCAweDIyMDMwMjEsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAxOCwgMHhjMDA0NTdjLCAweDIyMDMwMjEsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAwMSwgMHhjMDA0NTdjLCAweDI3YTYwMDE4LCAKKzB4MjQwNDAwMDEsIDB4MjQwNTAwMDEsIDB4YzAwNDU3YywgMHgyN2E2MDAxOCwgCisweDk3YTIwMDE4LCAweDMwNDIwMDA0LCAweDEwNDAwMDY2LCAweDNjMTE0MDAwLCAKKzB4M2MwMzAwMDEsIDB4OGM2MzZmMzQsIDB4MjQwMjAwMDUsIDB4MTQ2MjAwNjcsIAorMHgyNDA0MDAwMSwgMHgyNDA1MDAxOSwgMHgyN2IwMDAxYywgMHhjMDA0NTdjLCAKKzB4MjAwMzAyMSwgMHgyNDA0MDAwMSwgMHgyNDA1MDAxOSwgMHhjMDA0NTdjLCAKKzB4MjAwMzAyMSwgMHg5N2EyMDAxYywgMHgzMDQzMDcwMCwgMHgyNDAyMDQwMCwgCisweDEwNjIwMDI3LCAweDI4NjIwNDAxLCAweDEwNDAwMDBlLCAweDI0MDIwMjAwLCAKKzB4MTA2MjAwMWYsIDB4Mjg2MjAyMDEsIDB4MTA0MDAwMDUsIDB4MjQwMjAxMDAsIAorMHg1MDYyMDAxZSwgMHgzYzEzMDAwMSwgMHgxMDAwMDAxZSwgMHgzYzAyMDAwNCwgCisweDI0MDIwMzAwLCAweDUwNjIwMDE5LCAweDNjMTMwMDAyLCAweDEwMDAwMDE5LCAKKzB4M2MwMjAwMDQsIDB4MjQwMjA2MDAsIDB4MTA2MjAwMGQsIDB4Mjg2MjA2MDEsIAorMHgxMDQwMDAwNSwgMHgyNDAyMDUwMCwgMHg1MDYyMDAwYiwgMHgzYzEzMDAwMiwgCisweDEwMDAwMDEwLCAweDNjMDIwMDA0LCAweDI0MDIwNzAwLCAweDE0NjIwMDBkLCAKKzB4M2MwMjAwMDQsIDB4M2MxMzAwMDQsIDB4MTAwMDAwMGEsIDB4M2MxNTAwMDgsIAorMHgxMDAwMDAwNiwgMHgzYzEzMDAwNCwgMHgxMDAwMDAwNSwgMHgzYzE1MDAwOCwgCisweDNjMTMwMDAxLCAweDEwMDAwMDAyLCAweDNjMTUwMDA4LCAweDNjMTUwMDEwLCAKKzB4M2MwMjAwMDQsIDB4MTI2MjAwMTcsIDB4M2MwMjgwMDAsIDB4OGY4MjAwNTQsIAorMHgyNDEwMDAwMSwgMHgzYzAxMDAwMSwgMHhhYzMwNmQ5YywgMHgzYzAxMDAwMSwgCisweGFjMzA2ZDk4LCAweDNjMDEwMDAxLCAweGFjMzA2ZGE0LCAweDNjMDEwMDAxLCAKKzB4YWMzMDZlMjQsIDB4M2MwMTAwMDEsIDB4YWMyMjZmMzAsIDB4M2MwMjAwMDEsIAorMHgxNjYyMDAyMiwgMHgyNzU4ODI1LCAweDIwMjEsIDB4MjgyMSwgCisweGMwMDRkZGIsIDB4MzQwNjgwMDAsIDB4M2MwMTAwMDEsIDB4MTAwMDAwMWIsIAorMHhhYzMwNmUyMCwgMHgyMjIxMDI1LCAweDJiMzE4MjUsIDB4NDM4ODI1LCAKKzB4OTdhNjAwMWMsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMWMsIDB4M2MwNzAwMDEsIAorMHg4Y2U3NmQ5OCwgMHgzYzA0MDAwMSwgMHgyNDg0NmM1YywgMHhhZmEyMDAxMCwgCisweDk3YTIwMDFlLCAweDNjMDUwMDBjLCAweDM0YTUwMzIzLCAweDNjMDEwMDAxLCAKKzB4YWMyMDZlMjAsIDB4YzAwMmIzYiwgMHhhZmEyMDAxNCwgMHgxMDAwMDAwNywgCisweDAsIDB4M2MxMTAwMDIsIDB4MjNlODgyMSwgMHg4ZTMxOGZmMCwgCisweDNjMDI3ZmZmLCAweDM0NDJmZmZmLCAweDIyMjg4MjQsIDB4M2MwMjAwMDEsIAorMHg4YzQyNmRhOCwgMHgxMDQwMDA2OSwgMHgwLCAweDNjMDIwMDAxLCAKKzB4OGM0MjZmMWMsIDB4MTA0MDAwMDIsIDB4M2MwMjIwMDAsIDB4MjIyODgyNSwgCisweDhmYTgwMDJjLCAweDgxMTQwLCAweDNjMDEwMDAyLCAweDIyMDgyMSwgCisweDhjMjI5MDA0LCAweDEwNDAwMDAzLCAweDNjMDIwMDIwLCAweDEwMDAwMDA1LCAKKzB4MjIyODgyNSwgMHgzYzAyZmZkZiwgMHgzNDQyZmZmZiwgMHgyMjI4ODI0LCAKKzB4OGZhODAwMmMsIDB4ODExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLCAKKzB4OGMyMjkwMGMsIDB4MTA0MDAwMDMsIDB4M2MwMjAwODAsIDB4MTAwMDAwNGYsIAorMHgyMjI4ODI1LCAweDNjMDJmZjdmLCAweDM0NDJmZmZmLCAweDEwMDAwMDRiLCAKKzB4MjIyODgyNCwgMHg4ZmE4MDAyYywgMHg4Mjk0MCwgMHgzYzAzMDAwMiwgCisweDY1MTgyMSwgMHg4YzYzOGZmOCwgMHgzYzAyNDAwMCwgMHg2MjEwMjQsIAorMHgxNDQwMDAwOCwgMHgzYzAyN2ZmZiwgMHgzNDQyZmZmZiwgMHg2Mjg4MjQsIAorMHgzYzAxMDAwMiwgMHgyNTA4MjEsIDB4YWMzMThmZjAsIDB4MTAwMDAwNDEsIAorMHgyMjAxMDIxLCAweDNjMDIwMDAxLCAweDhjNDI2ZGE4LCAweDEwNDAwMDM0LCAKKzB4M2MxMWMwMGMsIDB4M2MwMjAwMDEsIDB4OGM0MjZlNDQsIDB4M2MwNGMwMGMsIAorMHgzNDg0MjAwMCwgMHgzYzAzMDAwMSwgMHg4YzYzNmYxYywgMHgyMTAyYiwgCisweDIxMDIzLCAweDQ0MTAyNCwgMHgxMDYwMDAwMywgMHg1MTg4MjUsIAorMHgzYzAyMjAwMCwgMHgyMjI4ODI1LCAweDNjMDIwMDAyLCAweDQ1MTAyMSwgCisweDhjNDI5MDA0LCAweDEwNDAwMDAzLCAweDNjMDIwMDIwLCAweDEwMDAwMDA0LCAKKzB4MjIyODgyNSwgMHgzYzAyZmZkZiwgMHgzNDQyZmZmZiwgMHgyMjI4ODI0LCAKKzB4OGZhODAwMmMsIDB4ODExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLCAKKzB4OGMyMjkwMGMsIDB4MTA0MDAwMDMsIDB4M2MwMjAwODAsIDB4MTAwMDAwMDQsIAorMHgyMjI4ODI1LCAweDNjMDJmZjdmLCAweDM0NDJmZmZmLCAweDIyMjg4MjQsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmUzMCwgMHgxMDQwMDAwMiwgMHgzYzAyMDgwMCwgCisweDIyMjg4MjUsIDB4M2MwMjAwMDEsIDB4OGM0MjZlMzQsIDB4MTA0MDAwMDIsIAorMHgzYzAyMDQwMCwgMHgyMjI4ODI1LCAweDNjMDIwMDAxLCAweDhjNDI2ZTM4LCAKKzB4MTA0MDAwMDYsIDB4M2MwMjAxMDAsIDB4MTAwMDAwMDQsIDB4MjIyODgyNSwgCisweDNjMDI3ZmZmLCAweDM0NDJmZmZmLCAweDYyODgyNCwgMHg4ZmE4MDAyYywgCisweDgxMTQwLCAweDNjMDEwMDAyLCAweDIyMDgyMSwgMHhhYzMxOGZmMCwgCisweDIyMDEwMjEsIDB4OGZiZjAwNDgsIDB4OGZiZTAwNDQsIDB4OGZiNTAwNDAsIAorMHg4ZmIzMDAzYywgMHg4ZmIyMDAzOCwgMHg4ZmIxMDAzNCwgMHg4ZmIwMDAzMCwgCisweDNlMDAwMDgsIDB4MjdiZDAwNTAsIDB4MjdiZGZmZDAsIDB4YWZiMjAwMjgsIAorMHg4MDkwMjEsIDB4YWZiZjAwMmMsIDB4YWZiMTAwMjQsIDB4YWZiMDAwMjAsIAorMHg4Zjg0MDIwMCwgMHgzYzEwMDAwMSwgMHg4ZTEwNmQ5OCwgMHg4Zjg2MDIyMCwgCisweDI0MDIwMDAyLCAweDEyMDIwMDVjLCAweDJlMDIwMDAzLCAweDEwNDAwMDA1LCAKKzB4MjQwMjAwMDEsIDB4MTIwMjAwMGEsIDB4MTIxOTQwLCAweDEwMDAwMTBjLCAKKzB4MCwgMHgyNDAyMDAwNCwgMHgxMjAyMDBiZiwgMHgyNDAyMDAwOCwgCisweDEyMDIwMGJlLCAweDEyODk0MCwgMHgxMDAwMDEwNSwgMHgwLCAKKzB4M2MwNTAwMDIsIDB4YTMyODIxLCAweDhjYTU4ZmZjLCAweDNjMTAwMDAyLCAKKzB4MjAzODAyMSwgMHg4ZTEwOGZmNCwgMHgzYzAyNDAwMCwgMHhhMjEwMjQsIAorMHgxMDQwMDAzOCwgMHgzYzAyMDAwOCwgMHgyMDIxMDI0LCAweDEwNDAwMDIwLCAKKzB4MzQ4NDAwMDIsIDB4M2MwMjAwMDIsIDB4NDMxMDIxLCAweDhjNDI5MDAwLCAKKzB4MTA0MDAwMDUsIDB4MzQ4NDAwMjAsIDB4MzQ4NDAxMDAsIDB4M2MwMjAwMjAsIAorMHgxMDAwMDAwNiwgMHgyMDI4MDI1LCAweDI0MDJmZWZmLCAweDgyMjAyNCwgCisweDNjMDJmZmRmLCAweDM0NDJmZmZmLCAweDIwMjgwMjQsIDB4MTIxMTQwLCAKKzB4M2MwMTAwMDIsIDB4MjIwODIxLCAweDhjMjI5MDA4LCAweDEwNDAwMDA1LCAKKzB4M2MwMjAwMDEsIDB4YzIzMDI1LCAweDNjMDIwMDgwLCAweDEwMDAwMDE2LCAKKzB4MjAyODAyNSwgMHgzYzAyZmZmZSwgMHgzNDQyZmZmZiwgMHhjMjMwMjQsIAorMHgzYzAyZmY3ZiwgMHgzNDQyZmZmZiwgMHgxMDAwMDAwZiwgMHgyMDI4MDI0LCAKKzB4MjQwMmZlZGYsIDB4ODIyMDI0LCAweDNjMDJmZmZlLCAweDM0NDJmZmZmLCAKKzB4YzIzMDI0LCAweDNjMDJmZjVmLCAweDM0NDJmZmZmLCAweDIwMjgwMjQsIAorMHgzYzAxMDAwMiwgMHgyMzA4MjEsIDB4YWMyMDkwMDAsIDB4M2MwMTAwMDIsIAorMHgyMzA4MjEsIDB4YWMyMDkwMDgsIDB4YWY4NDAyMDAsIDB4YWY4NjAyMjAsIAorMHg4ZjgyMDIyMCwgMHgzNDQyMDAwMiwgMHhhZjgyMDIyMCwgMHgxMDAwMDAwYSwgCisweDEyMTE0MCwgMHgzYzAyYmZmZiwgMHgzNDQyZmZmZiwgMHg4ZjgzMDIwMCwgCisweDIwMjgwMjQsIDB4MjQwMmZmZmQsIDB4NjIxODI0LCAweGMwMDNkYWYsIAorMHhhZjgzMDIwMCwgMHgxMjExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLCAKKzB4MTAwMDAwYjcsIDB4YWMzMDhmZjQsIDB4M2MwMjAwMDEsIDB4OGM0MjZmMWMsIAorMHgxMDQwMDA2OSwgMHgyNDA1MDAwNCwgMHgyNDA0MDAwMSwgMHhjMDA0NTdjLCAKKzB4MjdhNjAwMTgsIDB4MjQwNDAwMDEsIDB4MjQwNTAwMDUsIDB4YzAwNDU3YywgCisweDI3YTYwMDFhLCAweDk3YTMwMDE4LCAweDk3YTIwMDFhLCAweDNjMDQwMDAxLCAKKzB4MjQ4NDZlNDgsIDB4MzA2MzBjMDAsIDB4MzFhODIsIDB4MzA0MjBjMDAsIAorMHgyMTI4MiwgMHhhN2EyMDAxYSwgMHgyMTA4MCwgMHg0NDEwMjEsIAorMHg0MzEwMjEsIDB4YTdhMzAwMTgsIDB4OTA0ODAwMDAsIDB4MjQwMjAwMDEsIAorMHgzMTAzZmZmZiwgMHgxMDYyMDAyOSwgMHgyODYyMDAwMiwgMHgxMDQwMDAwNSwgCisweDAsIDB4MTA2MDAwMDksIDB4MCwgMHgxMDAwMDAzZCwgCisweDAsIDB4MTA3MDAwMTMsIDB4MjQwMjAwMDMsIDB4MTA2MjAwMmMsIAorMHgwLCAweDEwMDAwMDM3LCAweDAsIDB4OGY4MjAyMDAsIAorMHgyNDAzZmVmZiwgMHg0MzEwMjQsIDB4YWY4MjAyMDAsIDB4OGY4MjAyMjAsIAorMHgzYzAzZmZmZSwgMHgzNDYzZmZmZiwgMHg0MzEwMjQsIDB4YWY4MjAyMjAsIAorMHgzYzAxMDAwMiwgMHhhYzIwOTAwNCwgMHgzYzAxMDAwMiwgMHgxMDAwMDAzMiwgCisweGFjMjA5MDBjLCAweDhmODIwMjAwLCAweDM0NDIwMTAwLCAweGFmODIwMjAwLCAKKzB4OGY4MjAyMjAsIDB4M2MwM2ZmZmUsIDB4MzQ2M2ZmZmYsIDB4NDMxMDI0LCAKKzB4YWY4MjAyMjAsIDB4MjQwMjAxMDAsIDB4M2MwMTAwMDIsIDB4YWMyMjkwMDQsIAorMHgzYzAxMDAwMiwgMHgxMDAwMDAyNCwgMHhhYzIwOTAwYywgMHg4ZjgyMDIwMCwgCisweDI0MDNmZWZmLCAweDQzMTAyNCwgMHhhZjgyMDIwMCwgMHg4ZjgyMDIyMCwgCisweDNjMDMwMDAxLCAweDQzMTAyNSwgMHhhZjgyMDIyMCwgMHgzYzAxMDAwMiwgCisweGFjMjA5MDA0LCAweDNjMDEwMDAyLCAweDEwMDAwMDE3LCAweGFjMjM5MDBjLCAKKzB4OGY4MjAyMDAsIDB4MzQ0MjAxMDAsIDB4YWY4MjAyMDAsIDB4OGY4MjAyMjAsIAorMHgzYzAzMDAwMSwgMHg0MzEwMjUsIDB4YWY4MjAyMjAsIDB4MjQwMjAxMDAsIAorMHgzYzAxMDAwMiwgMHhhYzIyOTAwNCwgMHgzYzAxMDAwMiwgMHgxMDAwMDAwYSwgCisweGFjMjM5MDBjLCAweDNjMDQwMDAxLCAweDI0ODQ2YzgwLCAweDk3YTYwMDFhLCAKKzB4OTdhNzAwMTgsIDB4M2MwNTAwMDEsIDB4MzRhNWZmZmYsIDB4YWZhODAwMTAsIAorMHhjMDAyYjNiLCAweGFmYTAwMDE0LCAweDhmODIwMjAwLCAweDM0NDIwMDAyLCAKKzB4MTAwMDAwNGIsIDB4YWY4MjAyMDAsIDB4MTI4OTQwLCAweDNjMDUwMDAyLCAKKzB4YjEyODIxLCAweDhjYTU4ZmY4LCAweDNjMTAwMDAyLCAweDIxMTgwMjEsIAorMHg4ZTEwOGZmMCwgMHgzYzAyNDAwMCwgMHhhMjEwMjQsIDB4MTQ0MDAwMTAsIAorMHgwLCAweDNjMDIwMDAxLCAweDhjNDI2ZjFjLCAweDE0NDAwMDA1LCAKKzB4M2MwMmJmZmYsIDB4OGY4MjAyMDAsIDB4MzQ0MjAwMDIsIDB4YWY4MjAyMDAsIAorMHgzYzAyYmZmZiwgMHgzNDQyZmZmZiwgMHhjMDAzZGFmLCAweDIwMjgwMjQsIAorMHgzYzAxMDAwMiwgMHgzMTA4MjEsIDB4MTAwMDAwMzEsIDB4YWMzMDhmZjAsIAorMHgzYzAyMDAwMSwgMHg4YzQyNmYxYywgMHgxMDQwMDAwNSwgMHgzYzAyMDAyMCwgCisweDNjMDIwMDAxLCAweDhjNDI2ZTQ0LCAweDEwNDAwMDI1LCAweDNjMDIwMDIwLCAKKzB4YTIxMDI0LCAweDEwNDAwMDA3LCAweDM0ODQwMDIwLCAweDI0MDIwMTAwLCAKKzB4M2MwMTAwMDIsIDB4MzEwODIxLCAweGFjMjI5MDA0LCAweDEwMDAwMDA2LCAKKzB4MzQ4NDAxMDAsIDB4M2MwMTAwMDIsIDB4MzEwODIxLCAweGFjMjA5MDA0LCAKKzB4MjQwMmZlZmYsIDB4ODIyMDI0LCAweDNjMDIwMDgwLCAweGEyMTAyNCwgCisweDEwNDAwMDA3LCAweDEyMTk0MCwgMHgzYzAyMDAwMSwgMHgzYzAxMDAwMiwgCisweDIzMDgyMSwgMHhhYzIyOTAwYywgMHgxMDAwMDAwOCwgMHhjMjMwMjUsIAorMHgxMjExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMjA5MDBjLCAKKzB4M2MwMmZmZmUsIDB4MzQ0MmZmZmYsIDB4YzIzMDI0LCAweGFmODQwMjAwLCAKKzB4YWY4NjAyMjAsIDB4OGY4MjAyMjAsIDB4MzQ0MjAwMDIsIDB4YWY4MjAyMjAsIAorMHgxMjExNDAsIDB4M2MwMTAwMDIsIDB4MjIwODIxLCAweGFjMzA4ZmYwLCAKKzB4OGZiZjAwMmMsIDB4OGZiMjAwMjgsIDB4OGZiMTAwMjQsIDB4OGZiMDAwMjAsIAorMHgzZTAwMDA4LCAweDI3YmQwMDMwLCAweDAsIDB4MTgyMSwgCisweDMwODQwMGZmLCAweDI0MDVmZmRmLCAweDI0MDZmZmJmLCAweDY0MTAwNywgCisweDMwNDIwMDAxLCAweDEwNDAwMDA0LCAweDAsIDB4OGY4MjAwNDQsIAorMHgxMDAwMDAwMywgMHgzNDQyMDA0MCwgMHg4ZjgyMDA0NCwgMHg0NjEwMjQsIAorMHhhZjgyMDA0NCwgMHg4ZjgyMDA0NCwgMHgzNDQyMDAyMCwgMHhhZjgyMDA0NCwgCisweDhmODIwMDQ0LCAweDQ1MTAyNCwgMHhhZjgyMDA0NCwgMHgyNDYzMDAwMSwgCisweDI4NjIwMDA4LCAweDU0NDBmZmVlLCAweDY0MTAwNywgMHgzZTAwMDA4LCAKKzB4MCwgMHgyYzgyMDAwOCwgMHgxMDQwMDAxYiwgMHgwLCAKKzB4MjQwNWZmZGYsIDB4MjQwNmZmYmYsIDB4NDE4ODAsIDB4M2MwMjAwMDEsIAorMHgyNDQyNmU2MCwgMHg2MjE4MjEsIDB4MjQ2NDAwMDQsIDB4OTA2MjAwMDAsIAorMHgxMDQwMDAwNCwgMHgwLCAweDhmODIwMDQ0LCAweDEwMDAwMDAzLCAKKzB4MzQ0MjAwNDAsIDB4OGY4MjAwNDQsIDB4NDYxMDI0LCAweGFmODIwMDQ0LCAKKzB4OGY4MjAwNDQsIDB4MzQ0MjAwMjAsIDB4YWY4MjAwNDQsIDB4OGY4MjAwNDQsIAorMHg0NTEwMjQsIDB4YWY4MjAwNDQsIDB4MjQ2MzAwMDEsIDB4NjQxMDJiLCAKKzB4MTQ0MGZmZWUsIDB4MCwgMHgzZTAwMDA4LCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHg4Zjg0MDBjNCwgCisweDhmODYwMGUwLCAweDhmODcwMGU0LCAweDI0MDJmZmY4LCAweGMyMjgyNCwgCisweDEwZTUwMDFhLCAweDI3NjIzZmY4LCAweDE0ZTIwMDAyLCAweDI0ZTgwMDA4LCAKKzB4Mjc2ODMwMDAsIDB4NTUwNTAwMDQsIDB4OGQwYTAwMDAsIDB4MzBjMjAwMDQsIAorMHgxNDQwMDAxMiwgMHg4MDUwMjEsIDB4OGNlOTAwMDAsIDB4OGY0MjAxM2MsIAorMHgxNDk0ODIzLCAweDQ5MTgyYiwgMHg5NGViMDAwNiwgMHgxMDYwMDAwMiwgCisweDI1NjMwMDUwLCAweDQ5NDgyMSwgMHgxMjMxODJiLCAweDUwNDAwMDAzLCAKKzB4OGY0MjAxZmMsIDB4M2UwMDAwOCwgMHhlMDEwMjEsIDB4YWY4ODAwZTgsIAorMHgyNDQyMDAwMSwgMHhhZjQyMDFmYywgMHhhZjg4MDBlNCwgMHgzZTAwMDA4LCAKKzB4MTAyMSwgMHgzZTAwMDA4LCAweDAsIDB4OGY4MzAwZTQsIAorMHgyNzYyM2ZmOCwgMHgxMDYyMDAwNCwgMHgyNDYyMDAwOCwgMHhhZjgyMDBlOCwgCisweDNlMDAwMDgsIDB4YWY4MjAwZTQsIDB4Mjc2MjMwMDAsIDB4YWY4MjAwZTgsIAorMHgzZTAwMDA4LCAweGFmODIwMGU0LCAweDNlMDAwMDgsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDhmODgwMTIwLCAKKzB4Mjc2MjRmZTAsIDB4OGY4MzAxMjgsIDB4MTUwMjAwMDIsIDB4MjUwOTAwMjAsIAorMHgyNzY5NDgwMCwgMHgxMTIzMDAxMiwgMHg4ZmEyMDAxMCwgMHhhZDA0MDAwMCwgCisweGFkMDUwMDA0LCAweGFkMDYwMDA4LCAweGE1MDcwMDBlLCAweDhmYTMwMDE0LCAKKzB4YWQwMjAwMTgsIDB4OGZhMjAwMTgsIDB4YWQwMzAwMWMsIDB4MjUwMzAwMTYsIAorMHhhZDAyMDAxMCwgMHhhZDAzMDAxNCwgMHhhZjg5MDEyMCwgMHg4ZjQzMDBmYywgCisweDI0MDIwMDAxLCAweDI0NjNmZmZmLCAweDNlMDAwMDgsIDB4YWY0MzAwZmMsIAorMHg4ZjQzMDMyNCwgMHgxMDIxLCAweDI0NjMwMDAxLCAweDNlMDAwMDgsIAorMHhhZjQzMDMyNCwgMHgzZTAwMDA4LCAweDAsIDB4OGY4ODAxMDAsIAorMHgyNzYyNDdlMCwgMHg4ZjgzMDEwOCwgMHgxNTAyMDAwMiwgMHgyNTA5MDAyMCwgCisweDI3Njk0MDAwLCAweDExMjMwMDBmLCAweDhmYTIwMDEwLCAweGFkMDQwMDAwLCAKKzB4YWQwNTAwMDQsIDB4YWQwNjAwMDgsIDB4YTUwNzAwMGUsIDB4OGZhMzAwMTQsIAorMHhhZDAyMDAxOCwgMHg4ZmEyMDAxOCwgMHhhZDAzMDAxYywgMHgyNTAzMDAxNiwgCisweGFkMDIwMDEwLCAweGFkMDMwMDE0LCAweGFmODkwMTAwLCAweDNlMDAwMDgsIAorMHgyNDAyMDAwMSwgMHg4ZjQzMDMyOCwgMHgxMDIxLCAweDI0NjMwMDAxLCAKKzB4M2UwMDAwOCwgMHhhZjQzMDMyOCwgMHgzZTAwMDA4LCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwIH07CitzdGF0aWMgdTMyIHRpZ29uMkZ3Um9kYXRhWyhNQVhfUk9EQVRBX0xFTi80KSArIDFdIF9faW5pdGRhdGEgPSB7CisweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLCAKKzB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsIAorMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwgCisweDZlMmY2Njc3LCAweDZkNjE2OTZlLCAweDJlNjMyYzc2LCAweDIwMzEyZTMxLCAKKzB4MmUzMjJlMzQsIDB4MzUyMDMxMzksIDB4MzkzOTJmMzAsIDB4MzEyZjMyMzQsIAorMHgyMDMwMzAzYSwgMHgzMTMwM2EzNSwgMHgzNTIwNzM2OCwgMHg3NTYxNmU2NywgCisweDIwNDU3ODcwLCAweDIwMjQwMDAwLCAweDY1NzY3NDUyLCAweDZlNjc0NjAwLCAKKzB4NTE2NTc2NzQsIDB4NDYwMDAwMDAsIDB4NTE2NTc2NzQsIDB4NTA1ZjQ2MDAsIAorMHg0ZDY1NzY3NCwgMHg1MjZlNjc0NiwgMHgwLCAweDRkNTE2NTc2LCAKKzB4NzQ0NjAwMDAsIDB4NGQ1MTY1NzYsIDB4NTA1ZjQ2MDAsIDB4NTE3MzQzNmYsIAorMHg2ZTQ5NWY0NiwgMHgwLCAweDUxNzM0MzZmLCAweDZlNzM0NjAwLCAKKzB4NTE3MjUwNzIsIDB4NmY2NDQ2MDAsIDB4NjI2MTY0NGQsIDB4NjU2ZDUzN2EsIAorMHgwLCAweDY4Nzc1NjY1LCAweDcyMDAwMDAwLCAweDYyNjE2NDQ4LCAKKzB4Nzc1NjY1NzIsIDB4MCwgMHgyYTJhNDQ0MSwgMHg1NzRlNWY0MSwgCisweDAsIDB4NzQ3ODUyNzgsIDB4NDI2NjUzN2EsIDB4MCwgCisweDYyNjY0MTc0LCAweDZlNGQ3MjZiLCAweDAsIDB4NzI2NTY0NWEsIAorMHg2ZjZlNjUzMSwgMHgwLCAweDcwNjM2OTQzLCAweDZmNmU2NjAwLCAKKzB4Njc2NTZlNDMsIDB4NmY2ZTY2MDAsIDB4MmE2NDZkNjEsIDB4NTI0NDY2NmMsIAorMHgwLCAweDJhNTA0MTRlLCAweDQ5NDMyYTAwLCAweDJlMmUyZjJlLCAKKzB4MmUyZjJlMmUsIDB4MmYyZTJlMmYsIDB4MmUyZTJmNzMsIDB4NzI2MzJmNmUsIAorMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwgMHg2ZTJmNjY3NywgCisweDZkNjE2OTZlLCAweDJlNjMwMDAwLCAweDcyNjM2MjQ2LCAweDZjNjE2NzczLCAKKzB4MCwgMHg2MjYxNjQ1MiwgMHg3ODUyNjM2MiwgMHgwLCAKKzB4Njc2YzZmNjIsIDB4NDY2YzY3NzMsIDB4MCwgMHgyYjVmNjQ2OSwgCisweDczNzA1ZjZjLCAweDZmNmY3MDAwLCAweDJiNjU3NjVmLCAweDY4NjE2ZTY0LCAKKzB4NmM2NTcyMDAsIDB4NjM2MTZlNzQsIDB4MzE0NDZkNjEsIDB4MCwgCisweDJiNzE1ZjY0LCAweDZkNjE1Zjc0LCAweDZmNWY2ZTY5LCAweDYzNWY2MzZiLCAKKzB4NzM3NTZkMDAsIDB4MmI2ODVmNzMsIDB4NjU2ZTY0NWYsIDB4NjQ2MTc0NjEsIAorMHg1ZjcyNjU2MSwgMHg2NDc5NWY2MywgMHg2YjczNzU2ZCwgMHgwLCAKKzB4MmI2ODVmNjQsIDB4NmQ2MTVmNzIsIDB4NjQ1ZjYxNzMsIDB4NzM2OTczNzQsIAorMHg1ZjYzNmI3MywgMHg3NTZkMDAwMCwgMHg3NDQzNmI3MywgMHg2ZDRmNmUwMCwgCisweDJiNzE1ZjY0LCAweDZkNjE1Zjc0LCAweDZmNWY2ZTY5LCAweDYzMDAwMDAwLCAKKzB4MmI2ODVmNzMsIDB4NjU2ZTY0NWYsIDB4NjQ2MTc0NjEsIDB4NWY3MjY1NjEsIAorMHg2NDc5MDAwMCwgMHgyYjY4NWY2NCwgMHg2ZDYxNWY3MiwgMHg2NDVmNjE3MywgCisweDczNjk3Mzc0LCAweDAsIDB4NzQ0MzZiNzMsIDB4NmQ0ZjY2NjYsIAorMHgwLCAweDJiNjg1ZjczLCAweDY1NmU2NDVmLCAweDYyNjQ1ZjcyLCAKKzB4NjU2MTY0NzksIDB4MCwgMHg2ODczNzQ1MywgMHg1MjY5NmU2NywgCisweDAsIDB4NjI2MTY0NTMsIDB4NTI2OTZlNjcsIDB4MCwgCisweDZlNjk2MzUzLCAweDUyNjk2ZTY3LCAweDAsIDB4Nzc0NDZkNjEsIAorMHg0MTZjNmM0MSwgMHgwLCAweDJiNzE1ZjY0LCAweDZkNjE1Zjc0LCAKKzB4NmY1ZjY4NmYsIDB4NzM3NDVmNjMsIDB4NmI3Mzc1NmQsIDB4MCwgCisweDJiNjg1ZjZkLCAweDYxNjM1ZjcyLCAweDc4NWY2MzZmLCAweDZkNzA1ZjYzLCAKKzB4NmI3Mzc1NmQsIDB4MCwgMHgyYjY4NWY2NCwgMHg2ZDYxNWY3NywgCisweDcyNWY2MTczLCAweDczNjk3Mzc0LCAweDVmNjM2YjczLCAweDc1NmQwMDAwLCAKKzB4NzI0MzZiNzMsIDB4NmQ0ZjZlMDAsIDB4MmI3MTVmNjQsIDB4NmQ2MTVmNzQsIAorMHg2ZjVmNjg2ZiwgMHg3Mzc0MDAwMCwgMHgyYjY4NWY2ZCwgMHg2MTYzNWY3MiwgCisweDc4NWY2MzZmLCAweDZkNzAwMDAwLCAweDJiNjg1ZjY0LCAweDZkNjE1Zjc3LCAKKzB4NzI1ZjYxNzMsIDB4NzM2OTczNzQsIDB4MCwgMHg3MjQzNmI3MywgCisweDZkNGY2NjY2LCAweDAsIDB4MmI2ODVmNzIsIDB4NjU2Mzc2NWYsIAorMHg2MjY0NWY3MiwgMHg2NTYxNjQ3OSwgMHgwLCAweDJiNjg1ZjcyLCAKKzB4NjU2Mzc2NWYsIDB4NmE3NTZkNjIsIDB4NmY1ZjYyNjQsIDB4NWY3MjY1NjEsIAorMHg2NDc5MDAwMCwgMHgyYjY4NWY3MiwgMHg2NTYzNzY1ZiwgMHg2ZDY5NmU2OSwgCisweDVmNjI2NDVmLCAweDcyNjU2MTY0LCAweDc5MDAwMDAwLCAweDJiNmQ2ODVmLCAKKzB4NjM2ZjZkNmQsIDB4NjE2ZTY0MDAsIDB4MmI2ODVmNzQsIDB4Njk2ZDY1NzIsIAorMHgwLCAweDJiNjg1ZjY0LCAweDZmNWY3NTcwLCAweDY0NjE3NDY1LCAKKzB4NWY3NDc4NWYsIDB4NjM2ZjZlNzMsIDB4MCwgMHgyYjY4NWY2NCwgCisweDZmNWY3NTcwLCAweDY0NjE3NDY1LCAweDVmNzI3ODVmLCAweDcwNzI2ZjY0LCAKKzB4MCwgMHgyYjYzNmI3MywgMHg3NTZkMzEzNiwgMHgwLCAKKzB4MmI3MDY1NjUsIDB4NmI1ZjZkNjEsIDB4NjM1ZjcyNzgsIDB4NWY3NzYxMDAsIAorMHgyYjcwNjU2NSwgMHg2YjVmNmQ2MSwgMHg2MzVmNzI3OCwgMHgwLCAKKzB4MmI2NDY1NzEsIDB4NWY2ZDYxNjMsIDB4NWY3Mjc4MDAsIDB4MmI2ODVmNmQsIAorMHg2MTYzNWY3MiwgMHg3ODVmNjE3NCwgMHg3NDZlMDAwMCwgMHg2MjYxNjQ1MiwgCisweDY1NzQ1MzdhLCAweDAsIDB4NzI3ODQyNjQsIDB4NDI2NjUzN2EsIAorMHgwLCAweDJiNmU3NTZjLCAweDZjNWY2ODYxLCAweDZlNjQ2YzY1LCAKKzB4NzIwMDAwMDAsIDB4NjY3NzRmNzAsIDB4NDY2MTY5NmMsIDB4MCwgCisweDJiNjg1Zjc1LCAweDcwNjQ2MTc0LCAweDY1NWY2YzY1LCAweDY0MzQwMDAwLCAKKzB4MmI2ODVmNzUsIDB4NzA2NDYxNzQsIDB4NjU1ZjZjNjUsIDB4NjQzNjAwMDAsIAorMHgyYjY4NWY3NSwgMHg3MDY0NjE3NCwgMHg2NTVmNmM2NSwgMHg2NDMyMDAwMCwgCisweDY5NmU3NDUzLCAweDc0NjE3NDY1LCAweDAsIDB4MmEyYTY5NmUsIAorMHg2OTc0NDM3MCwgMHgwLCAweDIzNzM2MzcyLCAweDY1NjE2ZDAwLCAKKzB4Njk1Mzc0NjEsIDB4NjM2YjQ1NzIsIDB4MCwgMHg3MDcyNmY2MiwgCisweDY1NGQ2NTZkLCAweDAsIDB4MmEyYTQ0NDEsIDB4NTc0ZTVmNDIsIAorMHgwLCAweDJiNzM3NzVmLCAweDY0NmQ2MTVmLCAweDYxNzM3MzY5LCAKKzB4NzM3NDVmNzAsIDB4NmM3NTczNWYsIDB4NzQ2OTZkNjUsIDB4NzIwMDAwMDAsIAorMHgyYjI2NzA3MiwgMHg2NTZjNmY2MSwgMHg2NDVmNzc3MiwgMHg1ZjY0NjU3MywgCisweDYzNzIwMDAwLCAweDJiMjY3MDcyLCAweDY1NmM2ZjYxLCAweDY0NWY3MjY0LCAKKzB4NWY2NDY1NzMsIDB4NjM3MjAwMDAsIDB4MmI2ODVmNjgsIDB4NjY1Zjc0NjksIAorMHg2ZDY1NzIwMCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzczMjJmNjMsIDB4NmY2ZDZkNmYsIAorMHg2ZTJmNzQ2OSwgMHg2ZDY1NzIyZSwgMHg2MzJjNzYyMCwgMHgzMTJlMzEyZSwgCisweDMyMmUzMzM1LCAweDIwMzEzOTM5LCAweDM5MmYzMDMxLCAweDJmMzIzNzIwLCAKKzB4MzEzOTNhMzAsIDB4MzkzYTM1MzAsIDB4MjA2ODYxNzksIDB4NjU3MzIwNDUsIAorMHg3ODcwMjAyNCwgMHgwLCAweDY1NzY3NDUyLCAweDZlNjc0NjAwLCAKKzB4NTE2NTc2NzQsIDB4NDYwMDAwMDAsIDB4NTE2NTc2NzQsIDB4NTA1ZjQ2MDAsIAorMHg0ZDY1NzY3NCwgMHg1MjZlNjc0NiwgMHgwLCAweDRkNTE2NTc2LCAKKzB4NzQ0NjAwMDAsIDB4NGQ1MTY1NzYsIDB4NTA1ZjQ2MDAsIDB4NTE3MzQzNmYsIAorMHg2ZTQ5NWY0NiwgMHgwLCAweDUxNzM0MzZmLCAweDZlNzM0NjAwLCAKKzB4NTE3MjUwNzIsIDB4NmY2NDQ2MDAsIDB4NTQyZDQ0NmQsIDB4NjE1MjY0MzIsIAorMHgwLCAweDU0MmQ0NDZkLCAweDYxNTI2NDMxLCAweDAsIAorMHg1NDJkNDQ2ZCwgMHg2MTUyNjQ0MiwgMHgwLCAweDU0MmQ0NDZkLCAKKzB4NjE1NzcyMzIsIDB4MCwgMHg1NDJkNDQ2ZCwgMHg2MTU3NzIzMSwgCisweDAsIDB4NTQyZDQ0NmQsIDB4NjE1NzcyNDIsIDB4MCwgCisweDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsIAorMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwgCisweDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLCAKKzB4NmUyZjYzNmYsIDB4NmQ2ZDYxNmUsIDB4NjQyZTYzMmMsIDB4NzYyMDMxMmUsIAorMHgzMTJlMzIyZSwgMHgzMjM4MjAzMSwgMHgzOTM5MzkyZiwgMHgzMDMxMmYzMiwgCisweDMwMjAzMTM5LCAweDNhMzQzOTNhLCAweDM0MzkyMDczLCAweDY4NzU2MTZlLCAKKzB4NjcyMDQ1NzgsIDB4NzAyMDI0MDAsIDB4NjU3Njc0NTIsIDB4NmU2NzQ2MDAsIAorMHg1MTY1NzY3NCwgMHg0NjAwMDAwMCwgMHg1MTY1NzY3NCwgMHg1MDVmNDYwMCwgCisweDRkNjU3Njc0LCAweDUyNmU2NzQ2LCAweDAsIDB4NGQ1MTY1NzYsIAorMHg3NDQ2MDAwMCwgMHg0ZDUxNjU3NiwgMHg1MDVmNDYwMCwgMHg1MTczNDM2ZiwgCisweDZlNDk1ZjQ2LCAweDAsIDB4NTE3MzQzNmYsIDB4NmU3MzQ2MDAsIAorMHg1MTcyNTA3MiwgMHg2ZjY0NDYwMCwgMHgzZjQ4NjM2ZCwgMHg2NDRkNjI3OCwgCisweDAsIDB4M2Y2MzZkNjQsIDB4NDg3Mzc0NTMsIDB4MCwgCisweDNmNjM2ZDY0LCAweDRkNjM0ZDY0LCAweDAsIDB4M2Y2MzZkNjQsIAorMHg1MDcyNmY2ZCwgMHgwLCAweDNmNjM2ZDY0LCAweDRjNjk2ZTZiLCAKKzB4MCwgMHgzZjYzNmQ2NCwgMHg0NTcyNzIwMCwgMHg4NmFjLCAKKzB4OGU1YywgMHg4ZTVjLCAweDhkZTQsIDB4OGI3OCwgCisweDhlMzAsIDB4OGU1YywgMHg4NzkwLCAweDg4MDAsIAorMHg4OTkwLCAweDhhNjgsIDB4OGEzNCwgMHg4ZTVjLCAKKzB4ODg3MCwgMHg4YjI0LCAweDhlNWMsIDB4OGIzNCwgCisweDg3YjQsIDB4ODgyNCwgMHgwLCAweDAsIAorMHgwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLCAKKzB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsIAorMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwgCisweDZlMmY2ZDYzLCAweDYxNzM3NDJlLCAweDYzMmM3NjIwLCAweDMxMmUzMTJlLCAKKzB4MzIyZTM4MjAsIDB4MzEzOTM5MzgsIDB4MmYzMTMyMmYsIDB4MzAzODIwMzAsIAorMHgzMjNhMzMzNiwgMHgzYTMzMzYyMCwgMHg3MzY4NzU2MSwgMHg2ZTY3MjA0NSwgCisweDc4NzAyMDI0LCAweDAsIDB4NjU3Njc0NTIsIDB4NmU2NzQ2MDAsIAorMHg1MTY1NzY3NCwgMHg0NjAwMDAwMCwgMHg1MTY1NzY3NCwgMHg1MDVmNDYwMCwgCisweDRkNjU3Njc0LCAweDUyNmU2NzQ2LCAweDAsIDB4NGQ1MTY1NzYsIAorMHg3NDQ2MDAwMCwgMHg0ZDUxNjU3NiwgMHg1MDVmNDYwMCwgMHg1MTczNDM2ZiwgCisweDZlNDk1ZjQ2LCAweDAsIDB4NTE3MzQzNmYsIDB4NmU3MzQ2MDAsIAorMHg1MTcyNTA3MiwgMHg2ZjY0NDYwMCwgMHg2MTY0NjQ0ZCwgMHg2MzQ0NzU3MCwgCisweDAsIDB4NjE2NDY0NGQsIDB4NjM0Njc1NmMsIDB4MCwgCisweDY0NjU2YzRkLCAweDYzNGU2ZjQ1LCAweDAsIDB4MCwgCisweDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsIAorMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwgCisweDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLCAKKzB4NmUyZjY0NmQsIDB4NjEyZTYzMmMsIDB4NzYyMDMxMmUsIDB4MzEyZTMyMmUsIAorMHgzMjM0MjAzMSwgMHgzOTM5MzgyZiwgMHgzMTMyMmYzMiwgMHgzMTIwMzAzMCwgCisweDNhMzMzMzNhLCAweDMwMzkyMDczLCAweDY4NzU2MTZlLCAweDY3MjA0NTc4LCAKKzB4NzAyMDI0MDAsIDB4NjU3Njc0NTIsIDB4NmU2NzQ2MDAsIDB4NTE2NTc2NzQsIAorMHg0NjAwMDAwMCwgMHg1MTY1NzY3NCwgMHg1MDVmNDYwMCwgMHg0ZDY1NzY3NCwgCisweDUyNmU2NzQ2LCAweDAsIDB4NGQ1MTY1NzYsIDB4NzQ0NjAwMDAsIAorMHg0ZDUxNjU3NiwgMHg1MDVmNDYwMCwgMHg1MTczNDM2ZiwgMHg2ZTQ5NWY0NiwgCisweDAsIDB4NTE3MzQzNmYsIDB4NmU3MzQ2MDAsIDB4NTE3MjUwNzIsIAorMHg2ZjY0NDYwMCwgMHg3Mzc3NDQ2ZCwgMHg2MTRmNjY2NiwgMHgwLCAKKzB4MzE0NDZkNjEsIDB4NGY2ZTAwMDAsIDB4NzM3NzQ0NmQsIDB4NjE0ZjZlMDAsIAorMHgyMzcyNDQ2ZCwgMHg2MTQxNTQ0ZSwgMHgwLCAweDcyNDQ2ZDYxLCAKKzB4NDE1NDRlMzAsIDB4MCwgMHg3MjQ0NmQ2MSwgMHg0MTU0NGUzMSwgCisweDAsIDB4NzI0NDZkNjEsIDB4MzQ0NzYyMDAsIDB4MmE1MDQxNGUsIAorMHg0OTQzMmEwMCwgMHgyZTJlMmYyZSwgMHgyZTJmMmUyZSwgMHgyZjJlMmUyZiwgCisweDJlMmUyZjczLCAweDcyNjMyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAKKzB4NmY2ZDZkNmYsIDB4NmUyZjY0NmQsIDB4NjEyZTYzMDAsIDB4MjM3NzQ0NmQsIAorMHg2MTQxNTQ0ZSwgMHgwLCAweDc3NDQ2ZDYxLCAweDQxNTQ0ZTMwLCAKKzB4MCwgMHg3NzQ0NmQ2MSwgMHg0MTU0NGUzMSwgMHgwLCAKKzB4Nzc0NDZkNjEsIDB4MzQ0NzYyMDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzczMjJmNjMsIDB4NmY2ZDZkNmYsIAorMHg2ZTJmNzQ3MiwgMHg2MTYzNjUyZSwgMHg2MzJjNzYyMCwgMHgzMTJlMzEyZSwgCisweDMyMmUzNTIwLCAweDMxMzkzOTM4LCAweDJmMzAzOTJmLCAweDMzMzAyMDMxLCAKKzB4MzgzYTM1MzAsIDB4M2EzMjM4MjAsIDB4NzM2ODc1NjEsIDB4NmU2NzIwNDUsIAorMHg3ODcwMjAyNCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsIAorMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwgCisweDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLCAKKzB4NmUyZjY0NjEsIDB4NzQ2MTJlNjMsIDB4MmM3NjIwMzEsIDB4MmUzMTJlMzIsIAorMHgyZTMxMzIyMCwgMHgzMTM5MzkzOSwgMHgyZjMwMzEyZiwgMHgzMjMwMjAzMSwgCisweDM5M2EzNDM5LCAweDNhMzUzMTIwLCAweDczNjg3NTYxLCAweDZlNjcyMDQ1LCAKKzB4Nzg3MDIwMjQsIDB4MCwgMHg0NjU3NWY1NiwgMHg0NTUyNTM0OSwgCisweDRmNGUzYTIwLCAweDIzMzEyMDQ2LCAweDcyNjkyMDQxLCAweDcwNzIyMDM3LCAKKzB4MjAzMTM3M2EsIDB4MzUzNzNhMzUsIDB4MzIyMDUwNDQsIDB4NTQyMDMyMzAsIAorMHgzMDMwMDAwMCwgMHg0NjU3NWY0MywgMHg0ZjRkNTA0OSwgMHg0YzQ1NWY1NCwgCisweDQ5NGQ0NTNhLCAweDIwMzEzNzNhLCAweDM1MzczYTM1LCAweDMyMDAwMDAwLCAKKzB4NDY1NzVmNDMsIDB4NGY0ZDUwNDksIDB4NGM0NTVmNDIsIDB4NTkzYTIwNjQsIAorMHg2NTc2NzI2MywgMHg3MzAwMDAwMCwgMHg0NjU3NWY0MywgMHg0ZjRkNTA0OSwgCisweDRjNDU1ZjQ4LCAweDRmNTM1NDNhLCAweDIwNjM2ZjZkLCAweDcwNzU3NDY1LCAKKzB4MCwgMHg0NjU3NWY0MywgMHg0ZjRkNTA0OSwgMHg0YzQ1NWY0NCwgCisweDRmNGQ0MTQ5LCAweDRlM2EyMDY1LCAweDZlNjcyZTYxLCAweDYzNzQ2NTZmLCAKKzB4NmUyZTYzNmYsIDB4NmQwMDAwMDAsIDB4NDY1NzVmNDMsIDB4NGY0ZDUwNDksIAorMHg0YzQ1NTIzYSwgMHgyMDY3NjM2MywgMHgyMDc2NjU3MiwgMHg3MzY5NmY2ZSwgCisweDIwMzIyZTM3LCAweDJlMzIwMDAwLCAweDAsIDB4MTIwNDExMDAsIAorMHgwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLCAKKzB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsIAorMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwgCisweDZlMmY2ZDY1LCAweDZkMmU2MzJjLCAweDc2MjAzMTJlLCAweDMxMmUzMjJlLCAKKzB4MzUyMDMxMzksIDB4MzkzODJmMzAsIDB4MzkyZjMzMzAsIDB4MjAzMTM4M2EsIAorMHgzNTMwM2EzMCwgMHgzODIwNzM2OCwgMHg3NTYxNmU2NywgMHgyMDQ1Nzg3MCwgCisweDIwMjQwMDAwLCAweDI0NDg2NTYxLCAweDY0NjU3MjNhLCAweDIwMmY3MDcyLCAKKzB4NmY2YTY1NjMsIDB4NzQ3MzJmNzIsIDB4NjM3MzJmNzMsIDB4NzcyZjY3NjUsIAorMHgyZjJlMmY2ZSwgMHg2OTYzMmY2NiwgMHg3NzMyMmY2MywgMHg2ZjZkNmQ2ZiwgCisweDZlMmY3MzY1LCAweDZlNjQyZTYzLCAweDJjNzYyMDMxLCAweDJlMzEyZTMyLCAKKzB4MmUzNDM0MjAsIDB4MzEzOTM5MzgsIDB4MmYzMTMyMmYsIDB4MzIzMTIwMzAsIAorMHgzMDNhMzMzMywgMHgzYTMxMzgyMCwgMHg3MzY4NzU2MSwgMHg2ZTY3MjA0NSwgCisweDc4NzAyMDI0LCAweDAsIDB4NjU3Njc0NTIsIDB4NmU2NzQ2MDAsIAorMHg1MTY1NzY3NCwgMHg0NjAwMDAwMCwgMHg1MTY1NzY3NCwgMHg1MDVmNDYwMCwgCisweDRkNjU3Njc0LCAweDUyNmU2NzQ2LCAweDAsIDB4NGQ1MTY1NzYsIAorMHg3NDQ2MDAwMCwgMHg0ZDUxNjU3NiwgMHg1MDVmNDYwMCwgMHg1MTczNDM2ZiwgCisweDZlNDk1ZjQ2LCAweDAsIDB4NTE3MzQzNmYsIDB4NmU3MzQ2MDAsIAorMHg1MTcyNTA3MiwgMHg2ZjY0NDYwMCwgMHg2OTczNmU3NCwgMHg1NDYzNzA1NSwgCisweDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsIAorMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwgCisweDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLCAKKzB4NmUyZjcyNjUsIDB4NjM3NjJlNjMsIDB4MmM3NjIwMzEsIDB4MmUzMTJlMzIsIAorMHgyZTM1MzMyMCwgMHgzMTM5MzkzOSwgMHgyZjMwMzEyZiwgMHgzMTM2MjAzMCwgCisweDMyM2EzNTM1LCAweDNhMzQzMzIwLCAweDczNjg3NTYxLCAweDZlNjcyMDQ1LCAKKzB4Nzg3MDIwMjQsIDB4MCwgMHg2NTc2NzQ1MiwgMHg2ZTY3NDYwMCwgCisweDUxNjU3Njc0LCAweDQ2MDAwMDAwLCAweDUxNjU3Njc0LCAweDUwNWY0NjAwLCAKKzB4NGQ2NTc2NzQsIDB4NTI2ZTY3NDYsIDB4MCwgMHg0ZDUxNjU3NiwgCisweDc0NDYwMDAwLCAweDRkNTE2NTc2LCAweDUwNWY0NjAwLCAweDUxNzM0MzZmLCAKKzB4NmU0OTVmNDYsIDB4MCwgMHg1MTczNDM2ZiwgMHg2ZTczNDYwMCwgCisweDUxNzI1MDcyLCAweDZmNjQ0NjAwLCAweDcyNGQ2MTYzLCAweDQzNjg2YjMwLCAKKzB4MCwgMHg3Mjc4NDY3MiwgMHg2ZDMyNGM2NywgMHgwLCAKKzB4NzI3ODRlNmYsIDB4NTM3NDQyNjQsIDB4MCwgMHg3Mjc4NGU2ZiwgCisweDRkNjk0MjY0LCAweDAsIDB4NzI3ODRlNmYsIDB4NGE2ZDQyNjQsIAorMHgwLCAweDcyNzg0MzZiLCAweDQ0NmQ2MTQ2LCAweDAsIAorMHg3Mjc4NTE0NCwgMHg2ZDQ1Nzg0NiwgMHgwLCAweDcyNzg1MTQ0LCAKKzB4NmQ2MTQ2MDAsIDB4NzI3ODUxNDQsIDB4NGM0MjY0NDYsIDB4MCwgCisweDcyNzg1MTQ0LCAweDZkNDI2NDQ2LCAweDAsIDB4NzI3ODQzNzIsIAorMHg2MzUwNjE2NCwgMHgwLCAweDcyNTM2ZDUxLCAweDQ0NmQ2MTQ2LCAKKzB4MCwgMHgyNDQ4NjU2MSwgMHg2NDY1NzIzYSwgMHgyMDJmNzA3MiwgCisweDZmNmE2NTYzLCAweDc0NzMyZjcyLCAweDYzNzMyZjczLCAweDc3MmY2NzY1LCAKKzB4MmYyZTJmNmUsIDB4Njk2MzJmNjYsIDB4NzczMjJmNjMsIDB4NmY2ZDZkNmYsIAorMHg2ZTJmNmQ2MSwgMHg2MzJlNjMyYywgMHg3NjIwMzEyZSwgMHgzMTJlMzIyZSwgCisweDMyMzIyMDMxLCAweDM5MzkzODJmLCAweDMxMzIyZjMwLCAweDM4MjAzMDMyLCAKKzB4M2EzMzM2M2EsIDB4MzMzMDIwNzMsIDB4Njg3NTYxNmUsIDB4NjcyMDQ1NzgsIAorMHg3MDIwMjQwMCwgMHg2NTc2NzQ1MiwgMHg2ZTY3NDYwMCwgMHg1MTY1NzY3NCwgCisweDQ2MDAwMDAwLCAweDUxNjU3Njc0LCAweDUwNWY0NjAwLCAweDRkNjU3Njc0LCAKKzB4NTI2ZTY3NDYsIDB4MCwgMHg0ZDUxNjU3NiwgMHg3NDQ2MDAwMCwgCisweDRkNTE2NTc2LCAweDUwNWY0NjAwLCAweDUxNzM0MzZmLCAweDZlNDk1ZjQ2LCAKKzB4MCwgMHg1MTczNDM2ZiwgMHg2ZTczNDYwMCwgMHg1MTcyNTA3MiwgCisweDZmNjQ0NjAwLCAweDZkNjE2MzU0LCAweDY4NzI2NTczLCAweDAsIAorMHgyMzc0NGQ2MSwgMHg2MzQxNTQ0ZSwgMHgwLCAweDIzNzI0ZDYxLCAKKzB4NjM0MTU0NGUsIDB4MCwgMHg3MjY1NmQ0MSwgMHg3MzczNzI3NCwgCisweDAsIDB4NmM2OTZlNmIsIDB4NDQ0ZjU3NGUsIDB4MCwgCisweDZjNjk2ZTZiLCAweDU1NTAwMDAwLCAweDAsIDB4MCwgCisweDAsIDB4MjQ0ODY1NjEsIDB4NjQ2NTcyM2EsIDB4MjAyZjcwNzIsIAorMHg2ZjZhNjU2MywgMHg3NDczMmY3MiwgMHg2MzczMmY3MywgMHg3NzJmNjc2NSwgCisweDJmMmUyZjZlLCAweDY5NjMyZjY2LCAweDc3MzIyZjYzLCAweDZmNmQ2ZDZmLCAKKzB4NmUyZjYzNmIsIDB4NzM3NTZkMmUsIDB4NjMyYzc2MjAsIDB4MzEyZTMxMmUsIAorMHgzMjJlMzkyMCwgMHgzMTM5MzkzOSwgMHgyZjMwMzEyZiwgMHgzMTM0MjAzMCwgCisweDMwM2EzMDMzLCAweDNhMzQzODIwLCAweDczNjg3NTYxLCAweDZlNjcyMDQ1LCAKKzB4Nzg3MDIwMjQsIDB4MCwgMHg2NTc2NzQ1MiwgMHg2ZTY3NDYwMCwgCisweDUxNjU3Njc0LCAweDQ2MDAwMDAwLCAweDUxNjU3Njc0LCAweDUwNWY0NjAwLCAKKzB4NGQ2NTc2NzQsIDB4NTI2ZTY3NDYsIDB4MCwgMHg0ZDUxNjU3NiwgCisweDc0NDYwMDAwLCAweDRkNTE2NTc2LCAweDUwNWY0NjAwLCAweDUxNzM0MzZmLCAKKzB4NmU0OTVmNDYsIDB4MCwgMHg1MTczNDM2ZiwgMHg2ZTczNDYwMCwgCisweDUxNzI1MDcyLCAweDZmNjQ0NjAwLCAweDAsIDB4MCwgCisweDAsIDB4NTA3MjZmNjIsIDB4NjU1MDY4NzksIDB4MCwgCisweDZjNmU2YjQxLCAweDUzNTM1MjU0LCAweDAsIDB4MTA5YTQsIAorMHgxMGExYywgMHgxMGE1MCwgMHgxMGE3YywgMHgxMTA1MCwgCisweDEwYWE4LCAweDEwYjEwLCAweDExMWZjLCAweDEwZGMwLCAKKzB4MTBjNjgsIDB4MTBjODAsIDB4MTBjYzQsIDB4MTBjZWMsIAorMHgxMGQwYywgMHgxMGQzNCwgMHgxMTFmYywgMHgxMGRjMCwgCisweDEwZGY4LCAweDEwZTEwLCAweDEwZTQwLCAweDEwZTY4LCAKKzB4MTBlODgsIDB4MTBlYjAsIDB4MCwgMHgxMGZkYywgCisweDExMDA4LCAweDExMDJjLCAweDExMWZjLCAweDExMDUwLCAKKzB4MTEwNzgsIDB4MTExMDgsIDB4MCwgMHgwLCAKKzB4MCwgMHgxMTg2YywgMHgxMTkzYywgMHgxMWExNCwgCisweDExYWU0LCAweDExYjQwLCAweDExYzFjLCAweDExYzQ0LCAKKzB4MTFkMjAsIDB4MTFkNDgsIDB4MTFlZjAsIDB4MTFmMTgsIAorMHgxMjBjMCwgMHgxMjJiOCwgMHgxMjU0YywgMHgxMjQ2MCwgCisweDEyNTRjLCAweDEyNTc4LCAweDEyMGU4LCAweDEyMjkwLCAKKzB4NzI3Mzc0NWYsIDB4Njc2ZDY5NjksIDB4MCwgMHgxMjYwOCwgCisweDEyNjQwLCAweDEyNzI4LCAweDEzMzc0LCAweDEzM2I0LCAKKzB4MTMzY2MsIDB4NzM2NTc0NmMsIDB4NmY2ZjcwMDAsIDB4MCwgCisweDAsIDB4MTNiYmMsIDB4MTNiZmMsIDB4MTNjOGMsIAorMHgxM2NkMCwgMHgxM2QzNCwgMHgxM2RjMCwgMHgxM2RmNCwgCisweDEzZTdjLCAweDEzZjE0LCAweDEzZmU0LCAweDE0MDI0LCAKKzB4MTQwYTgsIDB4MTQwY2MsIDB4MTQxZGMsIDB4NjQ2ZjQyNjEsIAorMHg3MzY1NTA2NywgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4NzM3NDZkNjEsIDB4NjM0YzRlNGIsIDB4MCwgCisweDY3NjU3NDZkLCAweDYzNmM2ZTZiLCAweDAsIDB4MTRlZDgsIAorMHgxNGVkOCwgMHgxNGI4YywgMHgxNGJkOCwgMHgxNGMyNCwgCisweDE0ZWQ4LCAweDczNjU3NDZkLCAweDYxNjM2MTYzLCAweDc0MDAwMDAwLCAKKzB4MCwgMHgwIH07CitzdGF0aWMgdTMyIHRpZ29uMkZ3RGF0YVsoTUFYX0RBVEFfTEVOLzQpICsgMV0gX19pbml0ZGF0YSA9IHsKKzB4MSwgCisweDEsIDB4MSwgMHhjMDAxZmMsIDB4M2ZmYywgCisweGMwMDAwMCwgMHg0MTZjNzQ2NSwgMHg2ZjZlMjA0MSwgMHg2MzY1NGU0OSwgCisweDQzMjA1NjAwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4NDE2Yzc0NjUsIAorMHg2ZjZlMjA0MSwgMHg2MzY1NGU0OSwgMHg0MzIwNTYwMCwgMHg0MjQyNDI0MiwgCisweDAsIDB4MCwgMHgwLCAweDFmZmZmYywgCisweDFmZmY3YywgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDYwY2YwMCwgCisweDYwLCAweGNmMDAwMDAwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgwLCAKKzB4MCwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDAsIAorMHgwLCAweDAsIDB4MywgMHgwLCAKKzB4MSwgMHgwLCAweDAsIDB4MCwgCisweDEsIDB4MCwgMHgxLCAweDAsIAorMHgwLCAweDAsIDB4MCwgMHgxLCAKKzB4MSwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgxMDAwMDAwLCAweDIxMDAwMDAwLCAKKzB4MTIwMDAxNDAsIDB4MCwgMHgwLCAweDIwMDAwMDAwLCAKKzB4MTIwMDAwYTAsIDB4MCwgMHgxMjAwMDA2MCwgMHgxMjAwMDE4MCwgCisweDEyMDAwMWUwLCAweDAsIDB4MCwgMHgwLCAKKzB4MSwgMHgwLCAweDAsIDB4MCwgCisweDAsIDB4MCwgMHgwLCAweDIsIAorMHgwLCAweDAsIDB4MzAwMDEsIDB4MSwgCisweDMwMjAxLCAweDAsIDB4MCwgMHgxMDEwMTAxLCAKKzB4MTAxMDEwMCwgMHgxMDEwMCwgMHgxMDEwMDAxLCAweDEwMDAxLCAKKzB4MTAwMDEwMSwgMHgxMDEsIDB4MCwgMHgwIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hbWQ4MTExZS5jIGIvZHJpdmVycy9uZXQvYW1kODExMWUuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMmU5MzdhYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmMKQEAgLTAsMCArMSwyMTY3IEBACisKKy8qIEFkdmFuY2VkICBNaWNybyBEZXZpY2VzIEluYy4gQU1EODExMUUgTGludXggTmV0d29yayBEcml2ZXIgCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgQWR2YW5jZWQgTWljcm8gRGV2aWNlcyAKKyAqCisgKiAKKyAqIENvcHlyaWdodCAyMDAxLDIwMDIgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAbWFuZHJha2Vzb2Z0LmNvbT4gWyA4MTM5Y3AuYyx0ZzMuYyBdCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKVsgdGczLmNdCisgKiBDb3B5cmlnaHQgMTk5Ni0xOTk5IFRob21hcyBCb2dlbmRvZXJmZXIgWyBwY25ldDMyLmMgXQorICogRGVyaXZlZCBmcm9tIHRoZSBsYW5jZSBkcml2ZXIgd3JpdHRlbiAxOTkzLDE5OTQsMTk5NSBieSBEb25hbGQgQmVja2VyLgorICogQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICoJRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS5bIHBjbmV0MzIuYyBdCisgKiBDYXJzdGVuIExhbmdnYWFyZCwgY2Fyc3RlbmxAbWlwcy5jb20gWyBwY25ldDMyLmMgXQorICogQ29weXJpZ2h0IChDKSAyMDAwIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgCisgKiBVU0EKKyAgCitNb2R1bGUgTmFtZToKKworCWFtZDgxMTFlLmMKKworQWJzdHJhY3Q6CisJCisgCSBBTUQ4MTExIGJhc2VkIDEwLzEwMCBFdGhlcm5ldCBDb250cm9sbGVyIERyaXZlci4gCisKK0Vudmlyb25tZW50OgorCisJS2VybmVsIE1vZGUKKworUmV2aXNpb24gSGlzdG9yeToKKyAJMy4wLjAKKwkgICBJbml0aWFsIFJldmlzaW9uLgorCTMuMC4xCisJIDEuIER5bmFtaWMgaW50ZXJydXB0IGNvYWxlc2NpbmcuCisJIDIuIFJlbW92ZWQgcHJldl9zdGF0cy4KKwkgMy4gTUlJIHN1cHBvcnQuCisJIDQuIER5bmFtaWMgSVBHIHN1cHBvcnQKKwkzLjAuMiAgMDUvMjkvMjAwMworCSAxLiBCdWcgZml4OiBGaXhlZCBmYWlsdXJlIHRvIHNlbmQganVtYm8gcGFja2V0cyBsYXJnZXIgdGhhbiA0ay4KKwkgMi4gQnVnIGZpeDogRml4ZWQgVkxBTiBzdXBwb3J0IGZhaWx1cmUuCisJIDMuIEJ1ZyBmaXg6IEZpeGVkIHJlY2VpdmUgaW50ZXJydXB0IGNvYWxlc2NpbmcgYnVnLgorCSA0LiBEeW5hbWljIElQRyBzdXBwb3J0IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisJMy4wLjMgMDYvMDUvMjAwMworCSAxLiBCdWcgZml4OiBGaXhlZCBmYWlsdXJlIHRvIGNsb3NlIHRoZSBpbnRlcmZhY2UgaWYgU01QIGlzIGVuYWJsZWQuCisJMy4wLjQgMTIvMDkvMjAwMworCSAxLiBBZGRlZCBzZXRfbWFjX2FkZHJlc3Mgcm91dGluZSBmb3IgYm9uZGluZyBkcml2ZXIgc3VwcG9ydC4KKwkgMi4gVGVzdGVkIHRoZSBkcml2ZXIgZm9yIGJvbmRpbmcgc3VwcG9ydAorCSAzLiBCdWcgZml4OiBGaXhlZCBtaXNtYWNoIGluIGFjdHVhbCByZWNlaXZlIGJ1ZmZlciBsZW50aCBhbmQgbGVudGggCisJICAgIGluZGljYXRlZCB0byB0aGUgaC93LgorCSA0LiBNb2RpZmllZCBhbWQ4MTExZV9yeCgpIHJvdXRpbmUgdG8gcmVjZWl2ZSBhbGwgdGhlIHJlY2VpdmVkIHBhY2tldHMgCisJICAgIGluIHRoZSBmaXJzdCBpbnRlcnJ1cHQuCisJIDUuIEJ1ZyBmaXg6IENvcnJlY3RlZCAgcnhfZXJyb3JzICByZXBvcnRlZCBpbiBnZXRfc3RhdHMoKSBmdW5jdGlvbi4KKwkzLjAuNSAwMy8yMi8yMDA0CisJIDEuIEFkZGVkIE5BUEkgc3VwcG9ydCAgCisKKyovCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CQorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKKyNkZWZpbmUgQU1EODExMUVfVkxBTl9UQUdfVVNFRCAxCisjZWxzZQorI2RlZmluZSBBTUQ4MTExRV9WTEFOX1RBR19VU0VEIDAKKyNlbmRpZgorCisjaW5jbHVkZSAiYW1kODExMWUuaCIKKyNkZWZpbmUgTU9EVUxFX05BTUUJImFtZDgxMTFlIgorI2RlZmluZSBNT0RVTEVfVkVSUwkiMy4wLjUiCitNT0RVTEVfQVVUSE9SKCJBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuIik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJBTUQ4MTExIGJhc2VkIDEwLzEwMCBFdGhlcm5ldCBDb250cm9sbGVyLiBEcml2ZXIgVmVyc2lvbiAzLjAuMyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFtZDgxMTFlX3BjaV90YmwpOworbW9kdWxlX3BhcmFtX2FycmF5KHNwZWVkX2R1cGxleCwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc3BlZWRfZHVwbGV4LCAiU2V0IGRldmljZSBzcGVlZCBhbmQgZHVwbGV4IG1vZGVzLCAwOiBBdXRvIE5lZ290aXRhdGUsIDE6IDEwTWJwcyBIYWxmIER1cGxleCwgMjogMTBNYnBzIEZ1bGwgRHVwbGV4LCAzOiAxMDBNYnBzIEhhbGYgRHVwbGV4LCA0OiAxMDBNYnBzIEZ1bGwgRHVwbGV4Iik7Cittb2R1bGVfcGFyYW1fYXJyYXkoY29hbGVzY2UsIGJvb2wsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhjb2FsZXNjZSwgIkVuYWJsZSBvciBEaXNhYmxlIGludGVycnVwdCBjb2FsZXNjaW5nLCAxOiBFbmFibGUsIDA6IERpc2FibGUiKTsKK21vZHVsZV9wYXJhbV9hcnJheShkeW5hbWljX2lwZywgYm9vbCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGR5bmFtaWNfaXBnLCAiRW5hYmxlIG9yIERpc2FibGUgZHluYW1pYyBJUEcsIDE6IEVuYWJsZSwgMDogRGlzYWJsZSIpOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYW1kODExMWVfcGNpX3RibFtdID0geworCQkKKwl7IFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRDgxMTFFXzc0NjIsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgMCwgfQorCit9OworLyogCitUaGlzIGZ1bmN0aW9uIHdpbGwgcmVhZCB0aGUgUEhZIHJlZ2lzdGVycy4KKyovCitzdGF0aWMgaW50IGFtZDgxMTFlX3JlYWRfcGh5KHN0cnVjdCBhbWQ4MTExZV9wcml2KiBscCwgaW50IHBoeV9pZCwgaW50IHJlZywgdTMyKiB2YWwpCit7CisJdm9pZCBfX2lvbWVtICptbWlvID0gbHAtPm1taW87CisJdW5zaWduZWQgaW50IHJlZ192YWw7CisJdW5zaWduZWQgaW50IHJlcGVhdD0gUkVQRUFUX0NOVDsKKworCXJlZ192YWwgPSByZWFkbChtbWlvICsgUEhZX0FDQ0VTUyk7CisJd2hpbGUgKHJlZ192YWwgJiBQSFlfQ01EX0FDVElWRSkKKwkJcmVnX3ZhbCA9IHJlYWRsKCBtbWlvICsgUEhZX0FDQ0VTUyApOworCisJd3JpdGVsKCBQSFlfUkRfQ01EIHwgKChwaHlfaWQgJiAweDFmKSA8PCAyMSkgfAorCQkJICAgKChyZWcgJiAweDFmKSA8PCAxNiksICBtbWlvICtQSFlfQUNDRVNTKTsKKwlkb3sKKwkJcmVnX3ZhbCA9IHJlYWRsKG1taW8gKyBQSFlfQUNDRVNTKTsKKwkJdWRlbGF5KDMwKTsgIC8qIEl0IHRha2VzIDMwIHVzIHRvIHJlYWQvd3JpdGUgZGF0YSAqLworCX0gd2hpbGUgKC0tcmVwZWF0ICYmIChyZWdfdmFsICYgUEhZX0NNRF9BQ1RJVkUpKTsKKwlpZihyZWdfdmFsICYgUEhZX1JEX0VSUikKKwkJZ290byBlcnJfcGh5X3JlYWQ7CisJCisJKnZhbCA9IHJlZ192YWwgJiAweGZmZmY7CisJcmV0dXJuIDA7CitlcnJfcGh5X3JlYWQ6CQorCSp2YWwgPSAwOworCXJldHVybiAtRUlOVkFMOworCQorfQorCisvKiAKK1RoaXMgZnVuY3Rpb24gd2lsbCB3cml0ZSBpbnRvIFBIWSByZWdpc3RlcnMuIAorKi8KK3N0YXRpYyBpbnQgYW1kODExMWVfd3JpdGVfcGh5KHN0cnVjdCBhbWQ4MTExZV9wcml2KiBscCxpbnQgcGh5X2lkLCBpbnQgcmVnLCB1MzIgdmFsKQoreworCXVuc2lnbmVkIGludCByZXBlYXQgPSBSRVBFQVRfQ05UCisJdm9pZCBfX2lvbWVtICptbWlvID0gbHAtPm1taW87CisJdW5zaWduZWQgaW50IHJlZ192YWw7CisKKwlyZWdfdmFsID0gcmVhZGwobW1pbyArIFBIWV9BQ0NFU1MpOworCXdoaWxlIChyZWdfdmFsICYgUEhZX0NNRF9BQ1RJVkUpCisJCXJlZ192YWwgPSByZWFkbCggbW1pbyArIFBIWV9BQ0NFU1MgKTsKKworCXdyaXRlbCggUEhZX1dSX0NNRCB8ICgocGh5X2lkICYgMHgxZikgPDwgMjEpIHwKKwkJCSAgICgocmVnICYgMHgxZikgPDwgMTYpfHZhbCwgbW1pbyArIFBIWV9BQ0NFU1MpOworCisJZG97CisJCXJlZ192YWwgPSByZWFkbChtbWlvICsgUEhZX0FDQ0VTUyk7CisJCXVkZWxheSgzMCk7ICAvKiBJdCB0YWtlcyAzMCB1cyB0byByZWFkL3dyaXRlIHRoZSBkYXRhICovCisJfSB3aGlsZSAoLS1yZXBlYXQgJiYgKHJlZ192YWwgJiBQSFlfQ01EX0FDVElWRSkpOworCQorCWlmKHJlZ192YWwgJiBQSFlfUkRfRVJSKQorCQlnb3RvIGVycl9waHlfd3JpdGU7CisJCisJcmV0dXJuIDA7CisKK2Vycl9waHlfd3JpdGU6CQorCXJldHVybiAtRUlOVkFMOworCQorfQorLyogCitUaGlzIGlzIHRoZSBtaWkgcmVnaXN0ZXIgcmVhZCBmdW5jdGlvbiBwcm92aWRlZCB0byB0aGUgbWlpIGludGVyZmFjZS4KKyovIAorc3RhdGljIGludCBhbWQ4MTExZV9tZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGludCBwaHlfaWQsIGludCByZWdfbnVtKQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2KiBscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IHJlZ192YWw7CisKKwlhbWQ4MTExZV9yZWFkX3BoeShscCxwaHlfaWQscmVnX251bSwmcmVnX3ZhbCk7CisJcmV0dXJuIHJlZ192YWw7CisJCit9CisKKy8qIAorVGhpcyBpcyB0aGUgbWlpIHJlZ2lzdGVyIHdyaXRlIGZ1bmN0aW9uIHByb3ZpZGVkIHRvIHRoZSBtaWkgaW50ZXJmYWNlLgorKi8gCitzdGF0aWMgdm9pZCBhbWQ4MTExZV9tZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnX251bSwgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiogbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJYW1kODExMWVfd3JpdGVfcGh5KGxwLCBwaHlfaWQsIHJlZ19udW0sIHZhbCk7Cit9CisKKy8qCitUaGlzIGZ1bmN0aW9uIHdpbGwgc2V0IFBIWSBzcGVlZC4gRHVyaW5nIGluaXRpYWxpemF0aW9uIHNldHMgdGhlIG9yaWdpbmFsIHNwZWVkIHRvIDEwMCBmdWxsLgorKi8KK3N0YXRpYyB2b2lkIGFtZDgxMTFlX3NldF9leHRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgYm1jcixhZHZlcnQsdG1wOworCQorCS8qIERldGVybWluZSBtaWkgcmVnaXN0ZXIgdmFsdWVzIHRvIHNldCB0aGUgc3BlZWQgKi8KKwlhZHZlcnQgPSBhbWQ4MTExZV9tZGlvX3JlYWQoZGV2LCBscC0+ZXh0X3BoeV9hZGRyLCBNSUlfQURWRVJUSVNFKTsKKwl0bXAgPSBhZHZlcnQgJiB+KEFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfMTAwQkFTRTQpOworCXN3aXRjaCAobHAtPmV4dF9waHlfb3B0aW9uKXsKKworCQlkZWZhdWx0OgorCQljYXNlIFNQRUVEX0FVVE9ORUc6IC8qIGFkdmVydGlzZSBhbGwgdmFsdWVzICovCisJCQl0bXAgfD0gKCBBRFZFUlRJU0VfMTBIQUxGfEFEVkVSVElTRV8xMEZVTEx8CisJCQkJQURWRVJUSVNFXzEwMEhBTEZ8QURWRVJUSVNFXzEwMEZVTEwpIDsKKwkJCWJyZWFrOworCQljYXNlIFNQRUVEMTBfSEFMRjoKKwkJCXRtcCB8PSBBRFZFUlRJU0VfMTBIQUxGOworCQkJYnJlYWs7CisJCWNhc2UgU1BFRUQxMF9GVUxMOgorCQkJdG1wIHw9IEFEVkVSVElTRV8xMEZVTEw7CisJCQlicmVhazsKKwkJY2FzZSBTUEVFRDEwMF9IQUxGOiAKKwkJCXRtcCB8PSBBRFZFUlRJU0VfMTAwSEFMRjsKKwkJCWJyZWFrOworCQljYXNlIFNQRUVEMTAwX0ZVTEw6CisJCQl0bXAgfD0gQURWRVJUSVNFXzEwMEZVTEw7CisJCQlicmVhazsKKwl9CisKKwlpZihhZHZlcnQgIT0gdG1wKQorCQlhbWQ4MTExZV9tZGlvX3dyaXRlKGRldiwgbHAtPmV4dF9waHlfYWRkciwgTUlJX0FEVkVSVElTRSwgdG1wKTsKKwkvKiBSZXN0YXJ0IGF1dG8gbmVnb3RpYXRpb24gKi8KKwlibWNyID0gYW1kODExMWVfbWRpb19yZWFkKGRldiwgbHAtPmV4dF9waHlfYWRkciwgTUlJX0JNQ1IpOworCWJtY3IgfD0gKEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVCk7CisJYW1kODExMWVfbWRpb193cml0ZShkZXYsIGxwLT5leHRfcGh5X2FkZHIsIE1JSV9CTUNSLCBibWNyKTsKKworfQorCisvKiAKK1RoaXMgZnVuY3Rpb24gd2lsbCB1bm1hcCBza2ItPmRhdGEgc3BhY2UgYW5kIHdpbGwgZnJlZSAKK2FsbCB0cmFuc21pdCBhbmQgcmVjZWl2ZSBza2J1ZmZzLgorKi8KK3N0YXRpYyBpbnQgYW1kODExMWVfZnJlZV9za2JzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2tfYnVmZiogcnhfc2tidWZmOworCWludCBpOworCisJLyogRnJlZWluZyB0cmFuc21pdCBza2JzICovCisJZm9yKGkgPSAwOyBpIDwgTlVNX1RYX0JVRkZFUlM7IGkrKyl7CisJCWlmKGxwLT50eF9za2J1ZmZbaV0peworCQkJcGNpX3VubWFwX3NpbmdsZShscC0+cGNpX2RldixscC0+dHhfZG1hX2FkZHJbaV0sCQkJCQlscC0+dHhfc2tidWZmW2ldLT5sZW4sUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiIChscC0+dHhfc2tidWZmW2ldKTsKKwkJCWxwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQkJbHAtPnR4X2RtYV9hZGRyW2ldID0gMDsKKwkJfQorCX0KKwkvKiBGcmVlaW5nIHByZXZpb3VzbHkgYWxsb2NhdGVkIHJlY2VpdmUgYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfQlVGRkVSUzsgaSsrKXsKKwkJcnhfc2tidWZmID0gbHAtPnJ4X3NrYnVmZltpXTsKKwkJaWYocnhfc2tidWZmICE9IE5VTEwpeworCQkJcGNpX3VubWFwX3NpbmdsZShscC0+cGNpX2RldixscC0+cnhfZG1hX2FkZHJbaV0sCisJCQkJICBscC0+cnhfYnVmZl9sZW4gLSAyLFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKGxwLT5yeF9za2J1ZmZbaV0pOworCQkJbHAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJCQlscC0+cnhfZG1hX2FkZHJbaV0gPSAwOworCQl9CisJfQorCQorCXJldHVybiAwOworfQorCisvKgorVGhpcyB3aWxsIHNldCB0aGUgcmVjZWl2ZSBidWZmZXIgbGVuZ3RoIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG10dSBzaXplIG9mIG5ldHdvcmtpbnRlcmZhY2UuCisqLworc3RhdGljIGlubGluZSB2b2lkIGFtZDgxMTFlX3NldF9yeF9idWZmX2xlbihzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2KiBscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IG10dSA9IGRldi0+bXR1OworCQorCWlmIChtdHUgPiBFVEhfREFUQV9MRU4peworCQkvKiBNVFUgKyBldGhlcm5ldCBoZWFkZXIgKyBGQ1MKKwkJKyBvcHRpb25hbCBWTEFOIHRhZyArIHNrYiByZXNlcnZlIHNwYWNlIDIgKi8KKworCQlscC0+cnhfYnVmZl9sZW4gPSBtdHUgKyBFVEhfSExFTiArIDEwOworCQlscC0+b3B0aW9ucyB8PSBPUFRJT05fSlVNQk9fRU5BQkxFOworCX0gZWxzZXsKKwkJbHAtPnJ4X2J1ZmZfbGVuID0gUEtUX0JVRkZfU1o7CisJCWxwLT5vcHRpb25zICY9IH5PUFRJT05fSlVNQk9fRU5BQkxFOworCX0KK30KKworLyogCitUaGlzIGZ1bmN0aW9uIHdpbGwgZnJlZSBhbGwgdGhlIHByZXZpb3VzbHkgYWxsb2NhdGVkIGJ1ZmZlcnMsIGRldGVybWluZSBuZXcgcmVjZWl2ZSBidWZmZXIgbGVuZ3RoICBhbmQgd2lsbCBhbGxvY2F0ZSBuZXcgcmVjZWl2ZSBidWZmZXJzLiBUaGlzIGZ1bmN0aW9uIGFsc28gYWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBib3RoIHRoZSB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZSBoYXJkd2FyZSBkZXNjcmlwdG9ycy4KKyAqLworc3RhdGljIGludCBhbWQ4MTExZV9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJbHAtPnJ4X2lkeCA9IGxwLT50eF9pZHggPSAwOworCWxwLT50eF9jb21wbGV0ZV9pZHggPSAwOworCWxwLT50eF9yaW5nX2lkeCA9IDA7CisJCisKKwlpZihscC0+b3BlbmVkKQorCQkvKiBGcmVlIHByZXZpb3VzbHkgYWxsb2NhdGVkIHRyYW5zbWl0IGFuZCByZWNlaXZlIHNrYnMgKi8KKwkJYW1kODExMWVfZnJlZV9za2JzKGRldik7CQorCisJZWxzZXsKKwkJIC8qIGFsbG9jYXRlIHRoZSB0eCBhbmQgcnggZGVzY3JpcHRvcnMgKi8KKwkgICAgIAlpZigobHAtPnR4X3JpbmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudChscC0+cGNpX2RldiwgCisJCQlzaXplb2Yoc3RydWN0IGFtZDgxMTFlX3R4X2RyKSpOVU1fVFhfUklOR19EUiwKKwkJCSZscC0+dHhfcmluZ19kbWFfYWRkcikpID09IE5VTEwpCisJCQorCQkJZ290byBlcnJfbm9fbWVtOworCQorCSAgICAgCWlmKChscC0+cnhfcmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGxwLT5wY2lfZGV2LCAKKwkJCXNpemVvZihzdHJ1Y3QgYW1kODExMWVfcnhfZHIpKk5VTV9SWF9SSU5HX0RSLAorCQkJJmxwLT5yeF9yaW5nX2RtYV9hZGRyKSkgPT0gTlVMTCkKKwkJCisJCQlnb3RvIGVycl9mcmVlX3R4X3Jpbmc7CisKKwl9CisJLyogU2V0IG5ldyByZWNlaXZlIGJ1ZmYgc2l6ZSAqLworCWFtZDgxMTFlX3NldF9yeF9idWZmX2xlbihkZXYpOworCisJLyogQWxsb2NhdGluZyByZWNlaXZlICBza2JzICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9CVUZGRVJTOyBpKyspIHsKKworCQlpZiAoIShscC0+cnhfc2tidWZmW2ldID0gZGV2X2FsbG9jX3NrYihscC0+cnhfYnVmZl9sZW4pKSkgeworCQkJCS8qIFJlbGVhc2UgcHJldmlvcyBhbGxvY2F0ZWQgc2ticyAqLworCQkJCWZvcigtLWk7IGkgPj0gMCA7aS0tKQorCQkJCQlkZXZfa2ZyZWVfc2tiKGxwLT5yeF9za2J1ZmZbaV0pOworCQkJCWdvdG8gZXJyX2ZyZWVfcnhfcmluZzsKKwkJfQorCQlza2JfcmVzZXJ2ZShscC0+cnhfc2tidWZmW2ldLDIpOworCX0KKyAgICAgICAgLyogSW5pdGlsYWl6aW5nIHJlY2VpdmUgZGVzY3JpcHRvcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0JVRkZFUlM7IGkrKykgeworCQlscC0+cnhfZG1hX2FkZHJbaV0gPSBwY2lfbWFwX3NpbmdsZShscC0+cGNpX2RldiwgCisJCQlscC0+cnhfc2tidWZmW2ldLT5kYXRhLGxwLT5yeF9idWZmX2xlbi0yLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCWxwLT5yeF9yaW5nW2ldLmJ1ZmZfcGh5X2FkZHIgPSBjcHVfdG9fbGUzMihscC0+cnhfZG1hX2FkZHJbaV0pOworCQlscC0+cnhfcmluZ1tpXS5idWZmX2NvdW50ID0gY3B1X3RvX2xlMTYobHAtPnJ4X2J1ZmZfbGVuLTIpOworCQl3bWIoKTsKKwkJbHAtPnJ4X3JpbmdbaV0ucnhfZmxhZ3MgPSBjcHVfdG9fbGUxNihPV05fQklUKTsKKwl9CisKKwkvKiBJbml0aWFsaXppbmcgdHJhbnNtaXQgZGVzY3JpcHRvcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX1JJTkdfRFI7IGkrKykgeworCQlscC0+dHhfcmluZ1tpXS5idWZmX3BoeV9hZGRyID0gMDsKKwkJbHAtPnR4X3JpbmdbaV0udHhfZmxhZ3MgPSAwOworCQlscC0+dHhfcmluZ1tpXS5idWZmX2NvdW50ID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfcnhfcmluZzoKKwkKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGxwLT5wY2lfZGV2LCAKKwkJc2l6ZW9mKHN0cnVjdCBhbWQ4MTExZV9yeF9kcikqTlVNX1JYX1JJTkdfRFIsbHAtPnJ4X3JpbmcsCisJCWxwLT5yeF9yaW5nX2RtYV9hZGRyKTsKKworZXJyX2ZyZWVfdHhfcmluZzoKKwkKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGxwLT5wY2lfZGV2LAorCQkgc2l6ZW9mKHN0cnVjdCBhbWQ4MTExZV90eF9kcikqTlVNX1RYX1JJTkdfRFIsbHAtPnR4X3JpbmcsIAorCQkgbHAtPnR4X3JpbmdfZG1hX2FkZHIpOworCitlcnJfbm9fbWVtOgorCXJldHVybiAtRU5PTUVNOworfQorLyogVGhpcyBmdW5jdGlvbiB3aWxsIHNldCB0aGUgaW50ZXJydXB0IGNvYWxlc2NpbmcgYWNjb3JkaW5nIHRvIHRoZSBpbnB1dCBhcmd1bWVudHMgKi8KK3N0YXRpYyBpbnQgYW1kODExMWVfc2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCBlbnVtIGNvYWxfbW9kZSBjbW9kKQoreworCXVuc2lnbmVkIGludCB0aW1lb3V0OworCXVuc2lnbmVkIGludCBldmVudF9jb3VudDsKKworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICptbWlvID0gbHAtPm1taW87CisJc3RydWN0IGFtZDgxMTFlX2NvYWxlc2NlX2NvbmYgKiBjb2FsX2NvbmYgPSAmbHAtPmNvYWxfY29uZjsKKworCisJc3dpdGNoKGNtb2QpCisJeworCQljYXNlIFJYX0lOVFJfQ09BTCA6CisJCQl0aW1lb3V0ID0gY29hbF9jb25mLT5yeF90aW1lb3V0OworCQkJZXZlbnRfY291bnQgPSBjb2FsX2NvbmYtPnJ4X2V2ZW50X2NvdW50OworCQkJaWYoIHRpbWVvdXQgPiBNQVhfVElNRU9VVCB8fCAKKwkJCQkJZXZlbnRfY291bnQgPiBNQVhfRVZFTlRfQ09VTlQgKSAKKwkJCXJldHVybiAtRUlOVkFMOworCisJCQl0aW1lb3V0ID0gdGltZW91dCAqIERFTEFZX1RJTUVSX0NPTlY7IAorCQkJd3JpdGVsKFZBTDB8U1RJTlRFTiwgbW1pbytJTlRFTjApOworCQkJd3JpdGVsKCh1MzIpRExZX0lOVF9BX1IwfCggZXZlbnRfY291bnQ8PCAxNiApfHRpbWVvdXQsCisJCQkJCQkJbW1pbytETFlfSU5UX0EpOworCQkJYnJlYWs7CisKKwkJY2FzZSBUWF9JTlRSX0NPQUwgOgorCQkJdGltZW91dCA9IGNvYWxfY29uZi0+dHhfdGltZW91dDsKKwkJCWV2ZW50X2NvdW50ID0gY29hbF9jb25mLT50eF9ldmVudF9jb3VudDsKKwkJCWlmKCB0aW1lb3V0ID4gTUFYX1RJTUVPVVQgfHwgCisJCQkJCWV2ZW50X2NvdW50ID4gTUFYX0VWRU5UX0NPVU5UICkgCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkgICAKKwkJCXRpbWVvdXQgPSB0aW1lb3V0ICogREVMQVlfVElNRVJfQ09OVjsgCisJCQl3cml0ZWwoVkFMMHxTVElOVEVOLG1taW8rSU5URU4wKTsKKwkJCXdyaXRlbCgodTMyKURMWV9JTlRfQl9UMHwoIGV2ZW50X2NvdW50PDwgMTYgKXx0aW1lb3V0LAorCQkJCQkJCSBtbWlvK0RMWV9JTlRfQik7CisJCQlicmVhazsKKworCQljYXNlIERJU0FCTEVfQ09BTDoKKwkJCXdyaXRlbCgwLG1taW8rU1RWQUwpOworCQkJd3JpdGVsKFNUSU5URU4sIG1taW8rSU5URU4wKTsKKwkJCXdyaXRlbCgwLCBtbWlvICtETFlfSU5UX0IpOworCQkJd3JpdGVsKDAsIG1taW8rRExZX0lOVF9BKTsKKwkJCWJyZWFrOworCQkgY2FzZSBFTkFCTEVfQ09BTDogCisJCSAgICAgICAvKiBTdGFydCB0aGUgdGltZXIgKi8KKwkJCXdyaXRlbCgodTMyKVNPRlRfVElNRVJfRlJFUSwgbW1pbytTVFZBTCk7IC8qICAwLjUgc2VjICovCisJCQl3cml0ZWwoVkFMMHxTVElOVEVOLCBtbWlvK0lOVEVOMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCisgICB9CisJcmV0dXJuIDA7CisKK30KKworLyogCitUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBkZXZpY2UgcmVnaXN0ZXJzICBhbmQgc3RhcnRzIHRoZSBkZXZpY2UuICAKKyovCitzdGF0aWMgaW50IGFtZDgxMTFlX3Jlc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqbW1pbyA9IGxwLT5tbWlvOworCWludCBpLHJlZ192YWw7CisKKwkvKiBzdG9wIHRoZSBjaGlwICovCisJIHdyaXRlbChSVU4sIG1taW8gKyBDTUQwKTsKKworCWlmKGFtZDgxMTFlX2luaXRfcmluZyhkZXYpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGVuYWJsZSB0aGUgcG9ydCBtYW5hZ2VyIGFuZCBzZXQgYXV0byBuZWdvdGlhdGlvbiBhbHdheXMgKi8KKwl3cml0ZWwoKHUzMikgVkFMMXxFTl9QTUdSLCBtbWlvICsgQ01EMyApOworCXdyaXRlbCgodTMyKVhQSFlBTkV8WFBIWVJTVCAsIG1taW8gKyBDVFJMMik7IAorCQorCWFtZDgxMTFlX3NldF9leHRfcGh5KGRldik7CisKKwkvKiBzZXQgY29udHJvbCByZWdpc3RlcnMgKi8KKwlyZWdfdmFsID0gcmVhZGwobW1pbyArIENUUkwxKTsKKwlyZWdfdmFsICY9IH5YTVRTUF9NQVNLOworCXdyaXRlbCggcmVnX3ZhbHwgWE1UU1BfMTI4IHwgQ0FDSEVfQUxJR04sIG1taW8gKyBDVFJMMSApOworCisJLyogZW5hYmxlIGludGVycnVwdCAqLworCXdyaXRlbCggQVBJTlQ1RU4gfCBBUElOVDRFTiB8IEFQSU5UM0VOIHwgQVBJTlQyRU4gfCBBUElOVDFFTiB8IAorCQlBUElOVDBFTiB8IE1JSVBEVElOVEVOIHwgTUNDSUlOVEVOIHwgTUNDSU5URU4gfCBNUkVJTlRFTiB8CisJCVNQTkRJTlRFTiB8IE1QSU5URU4gfCBTSU5URU4gfCBTVElOVEVOLCBtbWlvICsgSU5URU4wKTsKKworCXdyaXRlbChWQUwzIHwgTENJTlRFTiB8IFZBTDEgfCBUSU5URU4wIHwgVkFMMCB8IFJJTlRFTjAsIG1taW8gKyBJTlRFTjApOworCisJLyogaW5pdGlhbGl6ZSB0eCBhbmQgcnggcmluZyBiYXNlIGFkZHJlc3NlcyAqLworCXdyaXRlbCgodTMyKWxwLT50eF9yaW5nX2RtYV9hZGRyLG1taW8gKyBYTVRfUklOR19CQVNFX0FERFIwKTsKKwl3cml0ZWwoKHUzMilscC0+cnhfcmluZ19kbWFfYWRkcixtbWlvKyBSQ1ZfUklOR19CQVNFX0FERFIwKTsKKworCXdyaXRldygodTMyKU5VTV9UWF9SSU5HX0RSLCBtbWlvICsgWE1UX1JJTkdfTEVOMCk7CisJd3JpdGV3KCh1MTYpTlVNX1JYX1JJTkdfRFIsIG1taW8gKyBSQ1ZfUklOR19MRU4wKTsKKwkKKwkvKiBzZXQgZGVmYXVsdCBJUEcgdG8gOTYgKi8KKwl3cml0ZXcoKHUzMilERUZBVUxUX0lQRyxtbWlvK0lQRyk7CisJd3JpdGV3KCh1MzIpKERFRkFVTFRfSVBHLUlGUzFfREVMVEEpLCBtbWlvICsgSUZTMSk7IAorCisJaWYobHAtPm9wdGlvbnMgJiBPUFRJT05fSlVNQk9fRU5BQkxFKXsKKwkJd3JpdGVsKCh1MzIpVkFMMnxKVU1CTywgbW1pbyArIENNRDMpOworCQkvKiBSZXNldCBSRVhfVUZMTyAqLworCQl3cml0ZWwoIFJFWF9VRkxPLCBtbWlvICsgQ01EMik7CisJCS8qIFNob3VsZCBub3Qgc2V0IFJFWF9VRkxPIGZvciBqdW1ibyBmcmFtZXMgKi8KKwkJd3JpdGVsKCBWQUwwIHwgQVBBRF9YTVR8UkVYX1JUUlkgLCBtbWlvICsgQ01EMik7CisJfWVsc2V7CisJCXdyaXRlbCggVkFMMCB8IEFQQURfWE1UIHwgUkVYX1JUUll8UkVYX1VGTE8sIG1taW8gKyBDTUQyKTsKKwkJd3JpdGVsKCh1MzIpSlVNQk8sIG1taW8gKyBDTUQzKTsKKwl9CisKKyNpZiBBTUQ4MTExRV9WTEFOX1RBR19VU0VECisJd3JpdGVsKCh1MzIpIFZBTDJ8VlNJWkV8VkxfVEFHX0RFTCwgbW1pbyArIENNRDMpOworI2VuZGlmCisJd3JpdGVsKCBWQUwwIHwgQVBBRF9YTVQgfCBSRVhfUlRSWSwgbW1pbyArIENNRDIgKTsKKwkKKwkvKiBTZXR0aW5nIHRoZSBNQUMgYWRkcmVzcyB0byB0aGUgZGV2aWNlICovCisJZm9yKGkgPSAwOyBpIDwgRVRIX0FERFJfTEVOOyBpKyspCisJCXdyaXRlYiggZGV2LT5kZXZfYWRkcltpXSwgbW1pbyArIFBBRFIgKyBpICk7IAorCisJLyogRW5hYmxlIGludGVycnVwdCBjb2FsZXNjZSAqLworCWlmKGxwLT5vcHRpb25zICYgT1BUSU9OX0lOVFJfQ09BTF9FTkFCTEUpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogSW50ZXJydXB0IENvYWxlc2NpbmcgRW5hYmxlZC5cbiIsCisJCQkJCQkJCWRldi0+bmFtZSk7CisJCWFtZDgxMTFlX3NldF9jb2FsZXNjZShkZXYsRU5BQkxFX0NPQUwpOworCX0KKwkKKwkvKiBzZXQgUlVOIGJpdCB0byBzdGFydCB0aGUgY2hpcCAqLworCXdyaXRlbChWQUwyIHwgUkRNRDAsIG1taW8gKyBDTUQwKTsKKwl3cml0ZWwoVkFMMCB8IElOVFJFTiB8IFJVTiwgbW1pbyArIENNRDApOworCQorCS8qIFRvIGF2b2lkIFBDSSBwb3N0aW5nIGJ1ZyAqLworCXJlYWRsKG1taW8rQ01EMCk7CisJcmV0dXJuIDA7Cit9CisvKiAKK1RoaXMgZnVuY3Rpb24gY2xlYXJzIG5lY2Vzc2FyeSB0aGUgZGV2aWNlIHJlZ2lzdGVycy4gCisqLwkKK3N0YXRpYyB2b2lkIGFtZDgxMTFlX2luaXRfaHdfZGVmYXVsdCggc3RydWN0IGFtZDgxMTFlX3ByaXYqIGxwKQoreworCXVuc2lnbmVkIGludCByZWdfdmFsOworCXVuc2lnbmVkIGludCBsb2dpY19maWx0ZXJbMl0gPXswLH07CisJdm9pZCBfX2lvbWVtICptbWlvID0gbHAtPm1taW87CisKKworICAgICAgICAvKiBzdG9wIHRoZSBjaGlwICovCisJd3JpdGVsKFJVTiwgbW1pbyArIENNRDApOworCisJLyogQVVUT1BPTEwwIFJlZ2lzdGVyICovLypUQkQgZGVmYXVsdCB2YWx1ZSBpcyA4MTAwIGluIEZQUyAqLworCXdyaXRldyggMHg4MTAwIHwgbHAtPmV4dF9waHlfYWRkciwgbW1pbyArIEFVVE9QT0xMMCk7CisKKwkvKiBDbGVhciBSQ1ZfUklOR19CQVNFX0FERFIgKi8KKwl3cml0ZWwoMCwgbW1pbyArIFJDVl9SSU5HX0JBU0VfQUREUjApOworCisJLyogQ2xlYXIgWE1UX1JJTkdfQkFTRV9BRERSICovCisJd3JpdGVsKDAsIG1taW8gKyBYTVRfUklOR19CQVNFX0FERFIwKTsKKwl3cml0ZWwoMCwgbW1pbyArIFhNVF9SSU5HX0JBU0VfQUREUjEpOworCXdyaXRlbCgwLCBtbWlvICsgWE1UX1JJTkdfQkFTRV9BRERSMik7CisJd3JpdGVsKDAsIG1taW8gKyBYTVRfUklOR19CQVNFX0FERFIzKTsKKworCS8qIENsZWFyIENNRDAgICovCisJd3JpdGVsKENNRDBfQ0xFQVIsbW1pbyArIENNRDApOworCQorCS8qIENsZWFyIENNRDIgKi8KKwl3cml0ZWwoQ01EMl9DTEVBUiwgbW1pbyArQ01EMik7CisKKwkvKiBDbGVhciBDTUQ3ICovCisJd3JpdGVsKENNRDdfQ0xFQVIgLCBtbWlvICsgQ01ENyk7CisKKwkvKiBDbGVhciBETFlfSU5UX0EgYW5kIERMWV9JTlRfQiAqLworCXdyaXRlbCgweDAsIG1taW8gKyBETFlfSU5UX0EpOworCXdyaXRlbCgweDAsIG1taW8gKyBETFlfSU5UX0IpOworCisJLyogQ2xlYXIgRkxPV19DT05UUk9MICovCisJd3JpdGVsKDB4MCwgbW1pbyArIEZMT1dfQ09OVFJPTCk7CisKKwkvKiBDbGVhciBJTlQwICB3cml0ZSAxIHRvIGNsZWFyIHJlZ2lzdGVyICovCisJcmVnX3ZhbCA9IHJlYWRsKG1taW8gKyBJTlQwKTsKKwl3cml0ZWwocmVnX3ZhbCwgbW1pbyArIElOVDApOworCisJLyogQ2xlYXIgU1RWQUwgKi8KKwl3cml0ZWwoMHgwLCBtbWlvICsgU1RWQUwpOworCisJLyogQ2xlYXIgSU5URU4wICovCisJd3JpdGVsKCBJTlRFTjBfQ0xFQVIsIG1taW8gKyBJTlRFTjApOworCisJLyogQ2xlYXIgTEFEUkYgKi8KKwl3cml0ZWwoMHgwICwgbW1pbyArIExBRFJGKTsKKworCS8qIFNldCBTUkFNX1NJWkUgJiBTUkFNX0JPVU5EQVJZIHJlZ2lzdGVycyAgKi8KKwl3cml0ZWwoIDB4ODAwMTAsbW1pbyArIFNSQU1fU0laRSk7CisKKwkvKiBDbGVhciBSQ1ZfUklORzBfTEVOICovCisJd3JpdGVsKDB4MCwgbW1pbyArICBSQ1ZfUklOR19MRU4wKTsKKworCS8qIENsZWFyIFhNVF9SSU5HMC8xLzIvM19MRU4gKi8KKwl3cml0ZWwoMHgwLCBtbWlvICsgIFhNVF9SSU5HX0xFTjApOworCXdyaXRlbCgweDAsIG1taW8gKyAgWE1UX1JJTkdfTEVOMSk7CisJd3JpdGVsKDB4MCwgbW1pbyArICBYTVRfUklOR19MRU4yKTsKKwl3cml0ZWwoMHgwLCBtbWlvICsgIFhNVF9SSU5HX0xFTjMpOworCisJLyogQ2xlYXIgWE1UX1JJTkdfTElNSVQgKi8KKwl3cml0ZWwoMHgwLCBtbWlvICsgWE1UX1JJTkdfTElNSVQpOworCisJLyogQ2xlYXIgTUlCICovCisJd3JpdGV3KE1JQl9DTEVBUiwgbW1pbyArIE1JQl9BRERSKTsKKworCS8qIENsZWFyIExBUkYgKi8KKwlhbWQ4MTExZV93cml0ZXEoKih1NjQqKWxvZ2ljX2ZpbHRlcixtbWlvK0xBRFJGKTsKKworCS8qIFNSQU1fU0laRSByZWdpc3RlciAqLworCXJlZ192YWwgPSByZWFkbChtbWlvICsgU1JBTV9TSVpFKTsKKwkKKwlpZihscC0+b3B0aW9ucyAmIE9QVElPTl9KVU1CT19FTkFCTEUpCisJCXdyaXRlbCggVkFMMnxKVU1CTywgbW1pbyArIENNRDMpOworI2lmIEFNRDgxMTFFX1ZMQU5fVEFHX1VTRUQKKwl3cml0ZWwoVkFMMnxWU0laRXxWTF9UQUdfREVMLCBtbWlvICsgQ01EMyApOworI2VuZGlmCisJLyogU2V0IGRlZmF1bHQgdmFsdWUgdG8gQ1RSTDEgUmVnaXN0ZXIgKi8KKwl3cml0ZWwoQ1RSTDFfREVGQVVMVCwgbW1pbyArIENUUkwxKTsKKworCS8qIFRvIGF2b2lkIFBDSSBwb3N0aW5nIGJ1ZyAqLworCXJlYWRsKG1taW8gKyBDTUQyKTsKKworfQorCisvKiAKK1RoaXMgZnVuY3Rpb24gZGlzYWJsZXMgdGhlIGludGVycnVwdCBhbmQgY2xlYXJzIGFsbCB0aGUgcGVuZGluZyAKK2ludGVycnVwdHMgaW4gSU5UMAorICovCitzdGF0aWMgdm9pZCBhbWQ4MTExZV9kaXNhYmxlX2ludGVycnVwdChzdHJ1Y3QgYW1kODExMWVfcHJpdiogbHApCit7CQorCXUzMiBpbnRyMDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0ICovCisJd3JpdGVsKElOVFJFTiwgbHAtPm1taW8gKyBDTUQwKTsKKwkKKwkvKiBDbGVhciBJTlQwICovCisJaW50cjAgPSByZWFkbChscC0+bW1pbyArIElOVDApOworCXdyaXRlbChpbnRyMCwgbHAtPm1taW8gKyBJTlQwKTsKKwkKKwkvKiBUbyBhdm9pZCBQQ0kgcG9zdGluZyBidWcgKi8KKwlyZWFkbChscC0+bW1pbyArIElOVDApOworCit9CisKKy8qCitUaGlzIGZ1bmN0aW9uIHN0b3BzIHRoZSBjaGlwLiAKKyovCitzdGF0aWMgdm9pZCBhbWQ4MTExZV9zdG9wX2NoaXAoc3RydWN0IGFtZDgxMTFlX3ByaXYqIGxwKQoreworCXdyaXRlbChSVU4sIGxwLT5tbWlvICsgQ01EMCk7CisJCisJLyogVG8gYXZvaWQgUENJIHBvc3RpbmcgYnVnICovCisJcmVhZGwobHAtPm1taW8gKyBDTUQwKTsKK30KKworLyogCitUaGlzIGZ1bmN0aW9uIGZyZWVzIHRoZSAgdHJhbnNtaXRlciBhbmQgcmVjZWl2ZXIgZGVzY3JpcHRvciByaW5ncy4KKyovCitzdGF0aWMgdm9pZCBhbWQ4MTExZV9mcmVlX3Jpbmcoc3RydWN0IGFtZDgxMTFlX3ByaXYqIGxwKQorewkKKworCS8qIEZyZWUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgc2ticyAqLworCWFtZDgxMTFlX2ZyZWVfc2ticyhscC0+YW1kODExMWVfbmV0X2Rldik7CisKKwkvKiBGcmVlIHRyYW5zbWl0IGFuZCByZWNlaXZlIGRlc2NyaXB0b3IgcmluZ3MgKi8KKwlpZihscC0+cnhfcmluZyl7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQobHAtPnBjaV9kZXYsIAorCQkJc2l6ZW9mKHN0cnVjdCBhbWQ4MTExZV9yeF9kcikqTlVNX1JYX1JJTkdfRFIsCisJCQlscC0+cnhfcmluZywgbHAtPnJ4X3JpbmdfZG1hX2FkZHIpOworCQlscC0+cnhfcmluZyA9IE5VTEw7CisJfQorCQorCWlmKGxwLT50eF9yaW5nKXsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChscC0+cGNpX2RldiwgCisJCQlzaXplb2Yoc3RydWN0IGFtZDgxMTFlX3R4X2RyKSpOVU1fVFhfUklOR19EUiwKKwkJCWxwLT50eF9yaW5nLCBscC0+dHhfcmluZ19kbWFfYWRkcik7CisKKwkJbHAtPnR4X3JpbmcgPSBOVUxMOworCX0KKworfQorI2lmIEFNRDgxMTFFX1ZMQU5fVEFHX1VTRUQJCisvKiAKK1RoaXMgaXMgdGhlIHJlY2VpdmUgaW5kaWNhdGlvbiBmdW5jdGlvbiBmb3IgcGFja2V0cyB3aXRoIHZsYW4gdGFnLgorKi8JCitzdGF0aWMgaW50IGFtZDgxMTFlX3ZsYW5fcngoc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MTYgdmxhbl90YWcpCit7CisjaWZkZWYgQ09ORklHX0FNRDgxMTFFX05BUEkKKwlyZXR1cm4gdmxhbl9od2FjY2VsX3JlY2VpdmVfc2tiKHNrYiwgbHAtPnZsZ3JwLHZsYW5fdGFnKTsKKyNlbHNlCisJcmV0dXJuIHZsYW5faHdhY2NlbF9yeChza2IsIGxwLT52bGdycCwgdmxhbl90YWcpOworI2VuZGlmIC8qIENPTkZJR19BTUQ4MTExRV9OQVBJICovCit9CisjZW5kaWYKKworLyoKK1RoaXMgZnVuY3Rpb24gd2lsbCBmcmVlIGFsbCB0aGUgdHJhbnNtaXQgc2ticyB0aGF0IGFyZSBhY3R1YWxseSB0cmFuc21pdHRlZCBieSB0aGUgZGV2aWNlLiBJdCB3aWxsIGNoZWNrIHRoZSBvd25lcnNoaXAgb2YgdGhlIHNrYiBiZWZvcmUgZnJlZWluZyB0aGUgc2tiLiAKKyovCitzdGF0aWMgaW50IGFtZDgxMTFlX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYqIGxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgdHhfaW5kZXggPSBscC0+dHhfY29tcGxldGVfaWR4ICYgVFhfUklOR19EUl9NT0RfTUFTSzsKKwlpbnQgc3RhdHVzOworCS8qIENvbXBsZXRlIGFsbCB0aGUgdHJhbnNtaXQgcGFja2V0ICovCisJd2hpbGUgKGxwLT50eF9jb21wbGV0ZV9pZHggIT0gbHAtPnR4X2lkeCl7CisJCXR4X2luZGV4ID0gIGxwLT50eF9jb21wbGV0ZV9pZHggJiBUWF9SSU5HX0RSX01PRF9NQVNLOworCQlzdGF0dXMgPSBsZTE2X3RvX2NwdShscC0+dHhfcmluZ1t0eF9pbmRleF0udHhfZmxhZ3MpOworCisJCWlmKHN0YXR1cyAmIE9XTl9CSVQpCisJCQlicmVhazsJLyogSXQgc3RpbGwgaGFzbid0IGJlZW4gVHhlZCAqLworCisJCWxwLT50eF9yaW5nW3R4X2luZGV4XS5idWZmX3BoeV9hZGRyID0gMDsKKworCQkvKiBXZSBtdXN0IGZyZWUgdGhlIG9yaWdpbmFsIHNrYiAqLworCQlpZiAobHAtPnR4X3NrYnVmZlt0eF9pbmRleF0pIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUobHAtPnBjaV9kZXYsIGxwLT50eF9kbWFfYWRkclt0eF9pbmRleF0sCisJCQkJICAJbHAtPnR4X3NrYnVmZlt0eF9pbmRleF0tPmxlbiwKKwkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiX2lycSAobHAtPnR4X3NrYnVmZlt0eF9pbmRleF0pOworCQkJbHAtPnR4X3NrYnVmZlt0eF9pbmRleF0gPSBOVUxMOworCQkJbHAtPnR4X2RtYV9hZGRyW3R4X2luZGV4XSA9IDA7CisJCX0KKwkJbHAtPnR4X2NvbXBsZXRlX2lkeCsrOworCQkvKkNPQUwgdXBkYXRlIHR4IGNvYWxlc2NpbmcgcGFyYW1ldGVycyAqLworCQlscC0+Y29hbF9jb25mLnR4X3BhY2tldHMrKzsKKwkJbHAtPmNvYWxfY29uZi50eF9ieXRlcyArPSBscC0+dHhfcmluZ1t0eF9pbmRleF0uYnVmZl9jb3VudDsJCisKKwkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJgorCQkJbHAtPnR4X2NvbXBsZXRlX2lkeCA+IGxwLT50eF9pZHggLSBOVU1fVFhfQlVGRkVSUyArMil7CisJCQkvKiBUaGUgcmluZyBpcyBubyBsb25nZXIgZnVsbCwgY2xlYXIgdGJ1c3kuICovCisJCQkvKiBscC0+dHhfZnVsbCA9IDA7ICovCisJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCQl9CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0FNRDgxMTFFX05BUEkKKy8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgZHJpdmVyIHJlY2VpdmUgb3BlcmF0aW9uIGluIHBvbGxpbmcgbW9kZSAqLworc3RhdGljIGludCBhbWQ4MTExZV9yeF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqIGJ1ZGdldCkKK3sKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByeF9pbmRleCA9IGxwLT5yeF9pZHggJiBSWF9SSU5HX0RSX01PRF9NQVNLOworCXZvaWQgX19pb21lbSAqbW1pbyA9IGxwLT5tbWlvOworCXN0cnVjdCBza19idWZmICpza2IsKm5ld19za2I7CisJaW50IG1pbl9wa3RfbGVuLCBzdGF0dXM7CisJdW5zaWduZWQgaW50IGludHIwOworCWludCBudW1fcnhfcGt0ID0gMDsKKwkvKmludCBtYXhfcnhfcGt0ID0gTlVNX1JYX0JVRkZFUlM7Ki8KKwlzaG9ydCBwa3RfbGVuOworI2lmIEFNRDgxMTFFX1ZMQU5fVEFHX1VTRUQJCQorCXNob3J0IHZ0YWc7CisjZW5kaWYKKwlpbnQgcnhfcGt0X2xpbWl0ID0gZGV2LT5xdW90YTsKKwkKKwlkb3sgICAKKwkJLyogcHJvY2VzcyByZWNlaXZlIHBhY2tldHMgdW50aWwgd2UgdXNlIHRoZSBxdW90YSovCisJCS8qIElmIHdlIG93biB0aGUgbmV4dCBlbnRyeSwgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCisJCXdoaWxlKDEpIHsKKwkJCXN0YXR1cyA9IGxlMTZfdG9fY3B1KGxwLT5yeF9yaW5nW3J4X2luZGV4XS5yeF9mbGFncyk7CisJCQlpZiAoc3RhdHVzICYgT1dOX0JJVCkKKwkJCQlicmVhazsKKworCQkJLyogCisJCQkgKiBUaGVyZSBpcyBhIHRyaWNreSBlcnJvciBub3RlZCBieSBKb2huIE11cnBoeSwKKwkJCSAqIDxtdXJmQHBlcmZ0ZWNoLmNvbT4gdG8gUnVzcyBOZWxzb246IEV2ZW4gd2l0aAorCQkJICogZnVsbC1zaXplZCAqIGJ1ZmZlcnMgaXQncyBwb3NzaWJsZSBmb3IgYSAgCisJCQkgKiBqYWJiZXIgcGFja2V0IHRvIHVzZSB0d28gYnVmZmVycywgd2l0aCBvbmx5IAorCQkJICogdGhlIGxhc3QgY29ycmVjdGx5IG5vdGluZyB0aGUgZXJyb3IuCisJCQkgKi8KKworCQkJaWYoc3RhdHVzICYgRVJSX0JJVCkgeworCQkJCS8qIHJlc2V0aW5nIGZsYWdzICovCisJCQkJbHAtPnJ4X3JpbmdbcnhfaW5kZXhdLnJ4X2ZsYWdzICY9IFJFU0VUX1JYX0ZMQUdTOworCQkJCWdvdG8gZXJyX25leHRfcGt0OworCQkJfQorCQkJLyogY2hlY2sgZm9yIFNUUCBhbmQgRU5QICovCisJCQlpZighKChzdGF0dXMgJiBTVFBfQklUKSAmJiAoc3RhdHVzICYgRU5QX0JJVCkpKXsKKwkJCQkvKiByZXNldGluZyBmbGFncyAqLworCQkJCWxwLT5yeF9yaW5nW3J4X2luZGV4XS5yeF9mbGFncyAmPSBSRVNFVF9SWF9GTEFHUzsKKwkJCQlnb3RvIGVycl9uZXh0X3BrdDsKKwkJCX0KKwkJCXBrdF9sZW4gPSBsZTE2X3RvX2NwdShscC0+cnhfcmluZ1tyeF9pbmRleF0ubXNnX2NvdW50KSAtIDQ7CisKKyNpZiBBTUQ4MTExRV9WTEFOX1RBR19VU0VECQkKKwkJCXZ0YWcgPSBzdGF0dXMgJiBUVF9NQVNLOworCQkJLypNQUMgd2lsbCBzdHJpcCB2bGFuIHRhZyovIAorCQkJaWYobHAtPnZsZ3JwICE9IE5VTEwgJiYgdnRhZyAhPTApCisJCQkJbWluX3BrdF9sZW4gPU1JTl9QS1RfTEVOIC0gNDsKKwkJCWVsc2UKKyNlbmRpZgorCQkJCW1pbl9wa3RfbGVuID1NSU5fUEtUX0xFTjsKKworCQkJaWYgKHBrdF9sZW4gPCBtaW5fcGt0X2xlbikgeworCQkJCWxwLT5yeF9yaW5nW3J4X2luZGV4XS5yeF9mbGFncyAmPSBSRVNFVF9SWF9GTEFHUzsKKwkJCQlscC0+ZHJ2X3J4X2Vycm9ycysrOworCQkJCWdvdG8gZXJyX25leHRfcGt0OworCQkJfQorCQkJaWYoLS1yeF9wa3RfbGltaXQgPCAwKQorCQkJCWdvdG8gcnhfbm90X2VtcHR5OworCQkJaWYoIShuZXdfc2tiID0gZGV2X2FsbG9jX3NrYihscC0+cnhfYnVmZl9sZW4pKSl7CisJCQkJLyogaWYgYWxsb2NhdGlvbiBmYWlsLCAKKwkJCQkgICBpZ25vcmUgdGhhdCBwa3QgYW5kIGdvIHRvIG5leHQgb25lICovCisJCQkJbHAtPnJ4X3JpbmdbcnhfaW5kZXhdLnJ4X2ZsYWdzICY9IFJFU0VUX1JYX0ZMQUdTOworCQkJCWxwLT5kcnZfcnhfZXJyb3JzKys7CisJCQkJZ290byBlcnJfbmV4dF9wa3Q7CisJCQl9CisJCQorCQkJc2tiX3Jlc2VydmUobmV3X3NrYiwgMik7CisJCQlza2IgPSBscC0+cnhfc2tidWZmW3J4X2luZGV4XTsKKwkJCXBjaV91bm1hcF9zaW5nbGUobHAtPnBjaV9kZXYsbHAtPnJ4X2RtYV9hZGRyW3J4X2luZGV4XSwKKwkJCQkJIGxwLT5yeF9idWZmX2xlbi0yLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJc2tiLT5kZXYgPSBkZXY7CisJCQlscC0+cnhfc2tidWZmW3J4X2luZGV4XSA9IG5ld19za2I7CisJCQluZXdfc2tiLT5kZXYgPSBkZXY7CisJCQlscC0+cnhfZG1hX2FkZHJbcnhfaW5kZXhdID0gcGNpX21hcF9zaW5nbGUobHAtPnBjaV9kZXYsCisJCQkJCQkJCSAgIG5ld19za2ItPmRhdGEsCisJCQkJCQkJCSAgIGxwLT5yeF9idWZmX2xlbi0yLAorCQkJCQkJCQkgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQorCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworI2lmIEFNRDgxMTFFX1ZMQU5fVEFHX1VTRUQJCQorCQkJaWYobHAtPnZsZ3JwICE9IE5VTEwgJiYgKHZ0YWcgPT0gVFRfVkxBTl9UQUdHRUQpKXsKKwkJCQlhbWQ4MTExZV92bGFuX3J4KGxwLCBza2IsCisJCQkJCSBsZTE2X3RvX2NwdShscC0+cnhfcmluZ1tyeF9pbmRleF0udGFnX2N0cmxfaW5mbykpOworCQkJfSBlbHNlCisjZW5kaWYKKwkJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCQkJLypDT0FMIHVwZGF0ZSByeCBjb2FsZXNjaW5nIHBhcmFtZXRlcnMqLworCQkJbHAtPmNvYWxfY29uZi5yeF9wYWNrZXRzKys7CisJCQlscC0+Y29hbF9jb25mLnJ4X2J5dGVzICs9IHBrdF9sZW47CQorCQkJbnVtX3J4X3BrdCsrOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkKKwkJZXJyX25leHRfcGt0OgkKKwkJCWxwLT5yeF9yaW5nW3J4X2luZGV4XS5idWZmX3BoeV9hZGRyCisJCQkJPSBjcHVfdG9fbGUzMihscC0+cnhfZG1hX2FkZHJbcnhfaW5kZXhdKTsKKwkJCWxwLT5yeF9yaW5nW3J4X2luZGV4XS5idWZmX2NvdW50ID0gCisJCQkJY3B1X3RvX2xlMTYobHAtPnJ4X2J1ZmZfbGVuLTIpOworCQkJd21iKCk7CisJCQlscC0+cnhfcmluZ1tyeF9pbmRleF0ucnhfZmxhZ3MgfD0gY3B1X3RvX2xlMTYoT1dOX0JJVCk7CisJCQlyeF9pbmRleCA9ICgrK2xwLT5yeF9pZHgpICYgUlhfUklOR19EUl9NT0RfTUFTSzsKKwkJfQorCQkvKiBDaGVjayB0aGUgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciBmb3IgbW9yZSBwYWNrZXRzIGluIHRoZSAKKwkJICAgbWVhbiB0aW1lLiBQcm9jZXNzIHRoZW0gc2luY2Ugd2UgaGF2ZSBub3QgdXNlZCB1cCBvdXIgcXVvdGEuKi8KKworCQlpbnRyMCA9IHJlYWRsKG1taW8gKyBJTlQwKTsKKwkJLypBY2sgcmVjZWl2ZSBwYWNrZXRzICovCisJCXdyaXRlbChpbnRyMCAmIFJJTlQwLG1taW8gKyBJTlQwKTsKKworCX0gd2hpbGUoaW50cjAgJiBSSU5UMCk7CisKKwkvKiBSZWNlaXZlIGRlc2NyaXB0b3IgaXMgZW1wdHkgbm93ICovCisJZGV2LT5xdW90YSAtPSBudW1fcnhfcGt0OworCSpidWRnZXQgLT0gbnVtX3J4X3BrdDsKKwluZXRpZl9yeF9jb21wbGV0ZShkZXYpOworCS8qIGVuYWJsZSByZWNlaXZlIGludGVycnVwdCAqLworCXdyaXRlbChWQUwwfFJJTlRFTjAsIG1taW8gKyBJTlRFTjApOworCXdyaXRlbChWQUwyIHwgUkRNRDAsIG1taW8gKyBDTUQwKTsKKwlyZXR1cm4gMDsKK3J4X25vdF9lbXB0eToKKwkvKiBEbyBub3QgY2FsbCBhIG5ldGlmX3J4X2NvbXBsZXRlICovCisJZGV2LT5xdW90YSAtPSBudW1fcnhfcGt0OwkKKwkqYnVkZ2V0IC09IG51bV9yeF9wa3Q7CisJcmV0dXJuIDE7CisKKwkKK30KKworI2Vsc2UKKy8qIAorVGhpcyBmdW5jdGlvbiB3aWxsIGNoZWNrIHRoZSBvd25lcnNoaXAgb2YgcmVjZWl2ZSBidWZmZXJzIGFuZCBkZXNjcmlwdG9ycy4gSXQgd2lsbCBpbmRpY2F0ZSB0byBrZXJuZWwgdXAgdG8gaGFsZiB0aGUgbnVtYmVyIG9mIG1heGltdW0gcmVjZWl2ZSBidWZmZXJzIGluIHRoZSBkZXNjcmlwdG9yIHJpbmcsIGluIGEgc2luZ2xlIHJlY2VpdmUgaW50ZXJydXB0LiBJdCB3aWxsIGFsc28gcmVwbGVuaXNoIHRoZSBkZXNjcmlwdG9ycyB3aXRoIG5ldyBza2JzLgorKi8KK3N0YXRpYyBpbnQgYW1kODExMWVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBza19idWZmICpza2IsKm5ld19za2I7CisJaW50IHJ4X2luZGV4ID0gbHAtPnJ4X2lkeCAmIFJYX1JJTkdfRFJfTU9EX01BU0s7CisJaW50IG1pbl9wa3RfbGVuLCBzdGF0dXM7CisJaW50IG51bV9yeF9wa3QgPSAwOworCWludCBtYXhfcnhfcGt0ID0gTlVNX1JYX0JVRkZFUlM7CisJc2hvcnQgcGt0X2xlbjsKKyNpZiBBTUQ4MTExRV9WTEFOX1RBR19VU0VECQkKKwlzaG9ydCB2dGFnOworI2VuZGlmCisJCisJLyogSWYgd2Ugb3duIHRoZSBuZXh0IGVudHJ5LCBpdCdzIGEgbmV3IHBhY2tldC4gU2VuZCBpdCB1cC4gKi8KKwl3aGlsZSgrK251bV9yeF9wa3QgPD0gbWF4X3J4X3BrdCl7CisJCXN0YXR1cyA9IGxlMTZfdG9fY3B1KGxwLT5yeF9yaW5nW3J4X2luZGV4XS5yeF9mbGFncyk7CisJCWlmKHN0YXR1cyAmIE9XTl9CSVQpCisJCQlyZXR1cm4gMDsKKwkgICAgICAgCisJCS8qIGNoZWNrIGlmIGVyciBzdW1tYXJ5IGJpdCBpcyBzZXQgKi8gCisJCWlmKHN0YXR1cyAmIEVSUl9CSVQpeworCQkJLyogCisJCQkgKiBUaGVyZSBpcyBhIHRyaWNreSBlcnJvciBub3RlZCBieSBKb2huIE11cnBoeSwKKwkJCSAqIDxtdXJmQHBlcmZ0ZWNoLmNvbT4gdG8gUnVzcyBOZWxzb246IEV2ZW4gd2l0aCBmdWxsLXNpemVkCisJCQkgKiBidWZmZXJzIGl0J3MgcG9zc2libGUgZm9yIGEgamFiYmVyIHBhY2tldCB0byB1c2UgdHdvCisJCQkgKiBidWZmZXJzLCB3aXRoIG9ubHkgdGhlIGxhc3QgY29ycmVjdGx5IG5vdGluZyB0aGUgZXJyb3IuCQkJICovCisJCQkvKiByZXNldGluZyBmbGFncyAqLworCQkJbHAtPnJ4X3JpbmdbcnhfaW5kZXhdLnJ4X2ZsYWdzICY9IFJFU0VUX1JYX0ZMQUdTOworCQkJZ290byBlcnJfbmV4dF9wa3Q7CisJCX0KKwkJLyogY2hlY2sgZm9yIFNUUCBhbmQgRU5QICovCisJCWlmKCEoKHN0YXR1cyAmIFNUUF9CSVQpICYmIChzdGF0dXMgJiBFTlBfQklUKSkpeworCQkJLyogcmVzZXRpbmcgZmxhZ3MgKi8KKwkJCWxwLT5yeF9yaW5nW3J4X2luZGV4XS5yeF9mbGFncyAmPSBSRVNFVF9SWF9GTEFHUzsKKwkJCWdvdG8gZXJyX25leHRfcGt0OworCQl9CisJCXBrdF9sZW4gPSBsZTE2X3RvX2NwdShscC0+cnhfcmluZ1tyeF9pbmRleF0ubXNnX2NvdW50KSAtIDQ7CisKKyNpZiBBTUQ4MTExRV9WTEFOX1RBR19VU0VECQkKKwkJdnRhZyA9IHN0YXR1cyAmIFRUX01BU0s7CisJCS8qTUFDIHdpbGwgc3RyaXAgdmxhbiB0YWcqLyAKKwkJaWYobHAtPnZsZ3JwICE9IE5VTEwgJiYgdnRhZyAhPTApCisJCQltaW5fcGt0X2xlbiA9TUlOX1BLVF9MRU4gLSA0OworCQllbHNlCisjZW5kaWYKKwkJCW1pbl9wa3RfbGVuID1NSU5fUEtUX0xFTjsKKworCQlpZiAocGt0X2xlbiA8IG1pbl9wa3RfbGVuKSB7CisJCQlscC0+cnhfcmluZ1tyeF9pbmRleF0ucnhfZmxhZ3MgJj0gUkVTRVRfUlhfRkxBR1M7CisJCQlscC0+ZHJ2X3J4X2Vycm9ycysrOworCQkJZ290byBlcnJfbmV4dF9wa3Q7CisJCX0KKwkJaWYoIShuZXdfc2tiID0gZGV2X2FsbG9jX3NrYihscC0+cnhfYnVmZl9sZW4pKSl7CisJCQkvKiBpZiBhbGxvY2F0aW9uIGZhaWwsIAorCQkJCWlnbm9yZSB0aGF0IHBrdCBhbmQgZ28gdG8gbmV4dCBvbmUgKi8KKwkJCWxwLT5yeF9yaW5nW3J4X2luZGV4XS5yeF9mbGFncyAmPSBSRVNFVF9SWF9GTEFHUzsKKwkJCWxwLT5kcnZfcnhfZXJyb3JzKys7CisJCQlnb3RvIGVycl9uZXh0X3BrdDsKKwkJfQorCQkKKwkJc2tiX3Jlc2VydmUobmV3X3NrYiwgMik7CisJCXNrYiA9IGxwLT5yeF9za2J1ZmZbcnhfaW5kZXhdOworCQlwY2lfdW5tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LGxwLT5yeF9kbWFfYWRkcltyeF9pbmRleF0sCisJCQlscC0+cnhfYnVmZl9sZW4tMiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQlza2ItPmRldiA9IGRldjsKKwkJbHAtPnJ4X3NrYnVmZltyeF9pbmRleF0gPSBuZXdfc2tiOworCQluZXdfc2tiLT5kZXYgPSBkZXY7CisJCWxwLT5yeF9kbWFfYWRkcltyeF9pbmRleF0gPSBwY2lfbWFwX3NpbmdsZShscC0+cGNpX2RldiwKKwkJCW5ld19za2ItPmRhdGEsIGxwLT5yeF9idWZmX2xlbi0yLFBDSV9ETUFfRlJPTURFVklDRSk7CisJCisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisKKyNpZiBBTUQ4MTExRV9WTEFOX1RBR19VU0VECQkJCQorCQlpZihscC0+dmxncnAgIT0gTlVMTCAmJiAodnRhZyA9PSBUVF9WTEFOX1RBR0dFRCkpeworCQkJYW1kODExMWVfdmxhbl9yeChscCwgc2tiLAorCQkJCSBsZTE2X3RvX2NwdShscC0+cnhfcmluZ1tyeF9pbmRleF0udGFnX2N0cmxfaW5mbykpOworCQl9IGVsc2UKKyNlbmRpZgorCQkJCisJCQluZXRpZl9yeCAoc2tiKTsKKwkJCS8qQ09BTCB1cGRhdGUgcnggY29hbGVzY2luZyBwYXJhbWV0ZXJzKi8KKwkJCWxwLT5jb2FsX2NvbmYucnhfcGFja2V0cysrOworCQkJbHAtPmNvYWxfY29uZi5yeF9ieXRlcyArPSBwa3RfbGVuOwkKKworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkKK2Vycl9uZXh0X3BrdDoKKwkJbHAtPnJ4X3JpbmdbcnhfaW5kZXhdLmJ1ZmZfcGh5X2FkZHIKKwkJCSA9IGNwdV90b19sZTMyKGxwLT5yeF9kbWFfYWRkcltyeF9pbmRleF0pOworCQlscC0+cnhfcmluZ1tyeF9pbmRleF0uYnVmZl9jb3VudCA9IAorCQkJCWNwdV90b19sZTE2KGxwLT5yeF9idWZmX2xlbi0yKTsKKwkJd21iKCk7CisJCWxwLT5yeF9yaW5nW3J4X2luZGV4XS5yeF9mbGFncyB8PSBjcHVfdG9fbGUxNihPV05fQklUKTsKKwkJcnhfaW5kZXggPSAoKytscC0+cnhfaWR4KSAmIFJYX1JJTkdfRFJfTU9EX01BU0s7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX0FNRDgxMTFFX05BUEkgKi8KKy8qIAorVGhpcyBmdW5jdGlvbiB3aWxsIGluZGljYXRlIHRoZSBsaW5rIHN0YXR1cyB0byB0aGUga2VybmVsLgorKi8KK3N0YXRpYyBpbnQgYW1kODExMWVfbGlua19jaGFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sJCisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgc3RhdHVzMCxzcGVlZDsKKworCS8qIHJlYWQgdGhlIGxpbmsgY2hhbmdlICovCisgICAgIAlzdGF0dXMwID0gcmVhZGwobHAtPm1taW8gKyBTVEFUMCk7CisJCisJaWYoc3RhdHVzMCAmIExJTktfU1RBVFMpeworCQlpZihzdGF0dXMwICYgQVVUT05FR19DT01QTEVURSkKKwkJCWxwLT5saW5rX2NvbmZpZy5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJCWVsc2UgCisJCQlscC0+bGlua19jb25maWcuYXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKworCQlpZihzdGF0dXMwICYgRlVMTF9EUExYKQorCQkJbHAtPmxpbmtfY29uZmlnLmR1cGxleCA9IERVUExFWF9GVUxMOworCQllbHNlIAorCQkJbHAtPmxpbmtfY29uZmlnLmR1cGxleCA9IERVUExFWF9IQUxGOworCQlzcGVlZCA9IChzdGF0dXMwICYgU1BFRURfTUFTSykgPj4gNzsKKwkJaWYoc3BlZWQgPT0gUEhZX1NQRUVEXzEwKQorCQkJbHAtPmxpbmtfY29uZmlnLnNwZWVkID0gU1BFRURfMTA7CisJCWVsc2UgaWYoc3BlZWQgPT0gUEhZX1NQRUVEXzEwMCkKKwkJCWxwLT5saW5rX2NvbmZpZy5zcGVlZCA9IFNQRUVEXzEwMDsKKworCQlwcmludGsoS0VSTl9JTkZPICIlczogTGluayBpcyBVcC4gU3BlZWQgaXMgJXMgTWJwcyAlcyBEdXBsZXhcbiIsCQkJZGV2LT5uYW1lLAorCQkgICAgICAgKGxwLT5saW5rX2NvbmZpZy5zcGVlZCA9PSBTUEVFRF8xMDApID8gIjEwMCI6ICIxMCIsIAorCQkgICAgICAgKGxwLT5saW5rX2NvbmZpZy5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpPyAiRnVsbCI6ICJIYWxmIik7IAorCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJfQorCWVsc2V7CQorCQlscC0+bGlua19jb25maWcuc3BlZWQgPSBTUEVFRF9JTlZBTElEOworCQlscC0+bGlua19jb25maWcuZHVwbGV4ID0gRFVQTEVYX0lOVkFMSUQ7CisJCWxwLT5saW5rX2NvbmZpZy5hdXRvbmVnID0gQVVUT05FR19JTlZBTElEOworCQlwcmludGsoS0VSTl9JTkZPICIlczogTGluayBpcyBEb3duLlxuIixkZXYtPm5hbWUpOworCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCX0KKwkJCisJcmV0dXJuIDA7Cit9CisvKgorVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgbWliIGNvdW50ZXJzLiAJIAorKi8KK3N0YXRpYyBpbnQgYW1kODExMWVfcmVhZF9taWIodm9pZCBfX2lvbWVtICptbWlvLCB1OCBNSUJfQ09VTlRFUikKK3sKKwl1bnNpZ25lZCBpbnQgIHN0YXR1czsKKwl1bnNpZ25lZCAgaW50IGRhdGE7CisJdW5zaWduZWQgaW50IHJlcGVhdCA9IFJFUEVBVF9DTlQ7CisKKwl3cml0ZXcoIE1JQl9SRF9DTUQgfCBNSUJfQ09VTlRFUiwgbW1pbyArIE1JQl9BRERSKTsKKwlkbyB7CisJCXN0YXR1cyA9IHJlYWR3KG1taW8gKyBNSUJfQUREUik7CisJCXVkZWxheSgyKTsJLyogY29udHJvbGxlciB0YWtlcyBNQVggMiB1cyB0byBnZXQgbWliIGRhdGEgKi8KKwl9CisJd2hpbGUgKC0tcmVwZWF0ICYmIChzdGF0dXMgJiBNSUJfQ01EX0FDVElWRSkpOworCisJZGF0YSA9IHJlYWRsKG1taW8gKyBNSUJfREFUQSk7CisJcmV0dXJuIGRhdGE7Cit9CisKKy8qCitUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBtaWIgcmVnaXN0ZXJzIGFuZCByZXR1cm5zIHRoZSBoYXJkd2FyZSBzdGF0aXN0aWNzLiBJdCAgdXBkYXRlcyBwcmV2aW91cyBpbnRlcm5hbCBkcml2ZXIgc3RhdGlzdGljcyB3aXRoIG5ldyB2YWx1ZXMuCisqLyAKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYW1kODExMWVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICptbWlvID0gbHAtPm1taW87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkvKiBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcHJldl9zdGF0cyA9ICZscC0+cHJldl9zdGF0czsgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyogbmV3X3N0YXRzID0gJmxwLT5zdGF0czsKKwkKKwlpZighbHAtPm9wZW5lZCkKKwkJcmV0dXJuICZscC0+c3RhdHM7CQorCXNwaW5fbG9ja19pcnFzYXZlICgmbHAtPmxvY2ssIGZsYWdzKTsKKworCS8qIHN0YXRzLnJ4X3BhY2tldHMgKi8KKwluZXdfc3RhdHMtPnJ4X3BhY2tldHMgPSBhbWQ4MTExZV9yZWFkX21pYihtbWlvLCByY3ZfYnJvYWRjYXN0X3BrdHMpKworCQkJCWFtZDgxMTFlX3JlYWRfbWliKG1taW8sIHJjdl9tdWx0aWNhc3RfcGt0cykrCisJCQkJYW1kODExMWVfcmVhZF9taWIobW1pbywgcmN2X3VuaWNhc3RfcGt0cyk7CisKKwkvKiBzdGF0cy50eF9wYWNrZXRzICovCisJbmV3X3N0YXRzLT50eF9wYWNrZXRzID0gYW1kODExMWVfcmVhZF9taWIobW1pbywgeG10X3BhY2tldHMpOworCisJLypzdGF0cy5yeF9ieXRlcyAqLworCW5ld19zdGF0cy0+cnhfYnl0ZXMgPSBhbWQ4MTExZV9yZWFkX21pYihtbWlvLCByY3Zfb2N0ZXRzKTsKKworCS8qIHN0YXRzLnR4X2J5dGVzICovCisJbmV3X3N0YXRzLT50eF9ieXRlcyA9IGFtZDgxMTFlX3JlYWRfbWliKG1taW8sIHhtdF9vY3RldHMpOworCisJLyogc3RhdHMucnhfZXJyb3JzICovCisJLyogaHcgZXJyb3JzICsgZXJyb3JzIGRyaXZlciByZXBvcnRlZCAqLworCW5ld19zdGF0cy0+cnhfZXJyb3JzID0gYW1kODExMWVfcmVhZF9taWIobW1pbywgcmN2X3VuZGVyc2l6ZV9wa3RzKSsKKwkJCQlhbWQ4MTExZV9yZWFkX21pYihtbWlvLCByY3ZfZnJhZ21lbnRzKSsKKwkJCQlhbWQ4MTExZV9yZWFkX21pYihtbWlvLCByY3ZfamFiYmVycykrCisJCQkJYW1kODExMWVfcmVhZF9taWIobW1pbywgcmN2X2FsaWdubWVudF9lcnJvcnMpKworCQkJCWFtZDgxMTFlX3JlYWRfbWliKG1taW8sIHJjdl9mY3NfZXJyb3JzKSsKKwkJCQlhbWQ4MTExZV9yZWFkX21pYihtbWlvLCByY3ZfbWlzc19wa3RzKSsKKwkJCQlscC0+ZHJ2X3J4X2Vycm9yczsKKworCS8qIHN0YXRzLnR4X2Vycm9ycyAqLworCW5ld19zdGF0cy0+dHhfZXJyb3JzID0gYW1kODExMWVfcmVhZF9taWIobW1pbywgeG10X3VuZGVycnVuX3BrdHMpOworCisJLyogc3RhdHMucnhfZHJvcHBlZCovCisJbmV3X3N0YXRzLT5yeF9kcm9wcGVkID0gYW1kODExMWVfcmVhZF9taWIobW1pbywgcmN2X21pc3NfcGt0cyk7CisKKwkvKiBzdGF0cy50eF9kcm9wcGVkKi8KKwluZXdfc3RhdHMtPnR4X2Ryb3BwZWQgPSBhbWQ4MTExZV9yZWFkX21pYihtbWlvLCAgeG10X3VuZGVycnVuX3BrdHMpOworCisJLyogc3RhdHMubXVsdGljYXN0Ki8KKwluZXdfc3RhdHMtPm11bHRpY2FzdCA9IGFtZDgxMTFlX3JlYWRfbWliKG1taW8sIHJjdl9tdWx0aWNhc3RfcGt0cyk7CisKKwkvKiBzdGF0cy5jb2xsaXNpb25zKi8KKwluZXdfc3RhdHMtPmNvbGxpc2lvbnMgPSBhbWQ4MTExZV9yZWFkX21pYihtbWlvLCB4bXRfY29sbGlzaW9ucyk7CisKKwkvKiBzdGF0cy5yeF9sZW5ndGhfZXJyb3JzKi8KKwluZXdfc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgPSAKKwkJYW1kODExMWVfcmVhZF9taWIobW1pbywgcmN2X3VuZGVyc2l6ZV9wa3RzKSsKKwkJYW1kODExMWVfcmVhZF9taWIobW1pbywgcmN2X292ZXJzaXplX3BrdHMpOworCisJLyogc3RhdHMucnhfb3Zlcl9lcnJvcnMqLworCW5ld19zdGF0cy0+cnhfb3Zlcl9lcnJvcnMgPSBhbWQ4MTExZV9yZWFkX21pYihtbWlvLCByY3ZfbWlzc19wa3RzKTsKKworCS8qIHN0YXRzLnJ4X2NyY19lcnJvcnMqLworCW5ld19zdGF0cy0+cnhfY3JjX2Vycm9ycyA9IGFtZDgxMTFlX3JlYWRfbWliKG1taW8sIHJjdl9mY3NfZXJyb3JzKTsKKworCS8qIHN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyovCisJbmV3X3N0YXRzLT5yeF9mcmFtZV9lcnJvcnMgPQorCQlhbWQ4MTExZV9yZWFkX21pYihtbWlvLCByY3ZfYWxpZ25tZW50X2Vycm9ycyk7CisKKwkvKiBzdGF0cy5yeF9maWZvX2Vycm9ycyAqLworCW5ld19zdGF0cy0+cnhfZmlmb19lcnJvcnMgPSBhbWQ4MTExZV9yZWFkX21pYihtbWlvLCByY3ZfbWlzc19wa3RzKTsKKworCS8qIHN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKi8KKwluZXdfc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnMgPSBhbWQ4MTExZV9yZWFkX21pYihtbWlvLCByY3ZfbWlzc19wa3RzKTsKKworCS8qIHN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKi8KKwluZXdfc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzID0gCisJCWFtZDgxMTFlX3JlYWRfbWliKG1taW8sIHhtdF9leGNlc3NpdmVfY29sbGlzaW9uKTsKKworCS8qIHN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKi8KKwluZXdfc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzID0gCisJCWFtZDgxMTFlX3JlYWRfbWliKG1taW8sIHhtdF9sb3NzX2NhcnJpZXIpOworCisJLyogc3RhdHMudHhfZmlmb19lcnJvcnMqLworCW5ld19zdGF0cy0+dHhfZmlmb19lcnJvcnMgPSBhbWQ4MTExZV9yZWFkX21pYihtbWlvLCB4bXRfdW5kZXJydW5fcGt0cyk7CisKKwkvKiBzdGF0cy50eF93aW5kb3dfZXJyb3JzKi8KKwluZXdfc3RhdHMtPnR4X3dpbmRvd19lcnJvcnMgPQorCQlhbWQ4MTExZV9yZWFkX21pYihtbWlvLCB4bXRfbGF0ZV9jb2xsaXNpb24pOworCisJLyogUmVzZXQgdGhlIG1pYnMgZm9yIGNvbGxlY3RpbmcgbmV3IHN0YXRpc3RpY3MgKi8KKwkvKiB3cml0ZXcoTUlCX0NMRUFSLCBtbWlvICsgTUlCX0FERFIpOyovCisJCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZscC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIG5ld19zdGF0czsKK30KKy8qIFRoaXMgZnVuY3Rpb24gcmVjYWxjdWxhdGUgdGhlIGludGVydXB0IGNvYWxlc2NpbmcgIG1vZGUgb24gZXZlcnkgaW50ZXJydXB0IAorYWNjb3JkaW5nIHRvIHRoZSBkYXRhcmF0ZSBhbmQgdGhlIHBhY2tldCByYXRlLgorKi8KK3N0YXRpYyBpbnQgYW1kODExMWVfY2FsY19jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFtZDgxMTFlX2NvYWxlc2NlX2NvbmYgKiBjb2FsX2NvbmYgPSAmbHAtPmNvYWxfY29uZjsKKwlpbnQgdHhfcGt0X3JhdGU7CisJaW50IHJ4X3BrdF9yYXRlOworCWludCB0eF9kYXRhX3JhdGU7CisJaW50IHJ4X2RhdGFfcmF0ZTsKKwlpbnQgcnhfcGt0X3NpemU7CisJaW50IHR4X3BrdF9zaXplOworCisJdHhfcGt0X3JhdGUgPSBjb2FsX2NvbmYtPnR4X3BhY2tldHMgLSBjb2FsX2NvbmYtPnR4X3ByZXZfcGFja2V0czsKKwljb2FsX2NvbmYtPnR4X3ByZXZfcGFja2V0cyA9ICBjb2FsX2NvbmYtPnR4X3BhY2tldHM7CisJCisJdHhfZGF0YV9yYXRlID0gY29hbF9jb25mLT50eF9ieXRlcyAtIGNvYWxfY29uZi0+dHhfcHJldl9ieXRlczsKKwljb2FsX2NvbmYtPnR4X3ByZXZfYnl0ZXMgPSAgY29hbF9jb25mLT50eF9ieXRlczsKKwkKKwlyeF9wa3RfcmF0ZSA9IGNvYWxfY29uZi0+cnhfcGFja2V0cyAtIGNvYWxfY29uZi0+cnhfcHJldl9wYWNrZXRzOworCWNvYWxfY29uZi0+cnhfcHJldl9wYWNrZXRzID0gIGNvYWxfY29uZi0+cnhfcGFja2V0czsKKwkKKwlyeF9kYXRhX3JhdGUgPSBjb2FsX2NvbmYtPnJ4X2J5dGVzIC0gY29hbF9jb25mLT5yeF9wcmV2X2J5dGVzOworCWNvYWxfY29uZi0+cnhfcHJldl9ieXRlcyA9ICBjb2FsX2NvbmYtPnJ4X2J5dGVzOworCQorCWlmKHJ4X3BrdF9yYXRlIDwgODAwKXsKKwkJaWYoY29hbF9jb25mLT5yeF9jb2FsX3R5cGUgIT0gTk9fQ09BTEVTQ0UpeworCQkJCisJCQljb2FsX2NvbmYtPnJ4X3RpbWVvdXQgPSAweDA7CisJCQljb2FsX2NvbmYtPnJ4X2V2ZW50X2NvdW50ID0gMDsKKwkJCWFtZDgxMTFlX3NldF9jb2FsZXNjZShkZXYsUlhfSU5UUl9DT0FMKTsKKwkJCWNvYWxfY29uZi0+cnhfY29hbF90eXBlID0gTk9fQ09BTEVTQ0U7CisJCX0KKwl9CisJZWxzZXsKKwkKKwkJcnhfcGt0X3NpemUgPSByeF9kYXRhX3JhdGUvcnhfcGt0X3JhdGU7CisJCWlmIChyeF9wa3Rfc2l6ZSA8IDEyOCl7CisJCQlpZihjb2FsX2NvbmYtPnJ4X2NvYWxfdHlwZSAhPSBOT19DT0FMRVNDRSl7CisJCQkKKwkJCQljb2FsX2NvbmYtPnJ4X3RpbWVvdXQgPSAwOworCQkJCWNvYWxfY29uZi0+cnhfZXZlbnRfY291bnQgPSAwOworCQkJCWFtZDgxMTFlX3NldF9jb2FsZXNjZShkZXYsUlhfSU5UUl9DT0FMKTsKKwkJCQljb2FsX2NvbmYtPnJ4X2NvYWxfdHlwZSA9IE5PX0NPQUxFU0NFOworCQkJfQorCisJCX0KKwkJZWxzZSBpZiAoIChyeF9wa3Rfc2l6ZSA+PSAxMjgpICYmIChyeF9wa3Rfc2l6ZSA8IDUxMikgKXsKKwkKKwkJCWlmKGNvYWxfY29uZi0+cnhfY29hbF90eXBlICE9ICBMT1dfQ09BTEVTQ0UpeworCQkJCWNvYWxfY29uZi0+cnhfdGltZW91dCA9IDE7CisJCQkJY29hbF9jb25mLT5yeF9ldmVudF9jb3VudCA9IDQ7CisJCQkJYW1kODExMWVfc2V0X2NvYWxlc2NlKGRldixSWF9JTlRSX0NPQUwpOworCQkJCWNvYWxfY29uZi0+cnhfY29hbF90eXBlID0gTE9XX0NPQUxFU0NFOworCQkJfQorCQl9CisJCWVsc2UgaWYgKChyeF9wa3Rfc2l6ZSA+PSA1MTIpICYmIChyeF9wa3Rfc2l6ZSA8IDEwMjQpKXsKKwkJCQorCQkJaWYoY29hbF9jb25mLT5yeF9jb2FsX3R5cGUgIT0gIE1FRElVTV9DT0FMRVNDRSl7CisJCQkJY29hbF9jb25mLT5yeF90aW1lb3V0ID0gMTsKKwkJCQljb2FsX2NvbmYtPnJ4X2V2ZW50X2NvdW50ID0gNDsKKwkJCQlhbWQ4MTExZV9zZXRfY29hbGVzY2UoZGV2LFJYX0lOVFJfQ09BTCk7CisJCQkJY29hbF9jb25mLT5yeF9jb2FsX3R5cGUgPSBNRURJVU1fQ09BTEVTQ0U7CisJCQl9CQkKKwkJCQkKKwkJfQorCQllbHNlIGlmKHJ4X3BrdF9zaXplID49IDEwMjQpeworCQkJaWYoY29hbF9jb25mLT5yeF9jb2FsX3R5cGUgIT0gIEhJR0hfQ09BTEVTQ0UpeworCQkJCWNvYWxfY29uZi0+cnhfdGltZW91dCA9IDI7CisJCQkJY29hbF9jb25mLT5yeF9ldmVudF9jb3VudCA9IDM7CisJCQkJYW1kODExMWVfc2V0X2NvYWxlc2NlKGRldixSWF9JTlRSX0NPQUwpOworCQkJCWNvYWxfY29uZi0+cnhfY29hbF90eXBlID0gSElHSF9DT0FMRVNDRTsKKwkJCX0JCQorCQl9CisJfQorICAgIAkvKiBOT1cgRk9SIFRYIElOVFIgQ09BTEVTQyAqLworCWlmKHR4X3BrdF9yYXRlIDwgODAwKXsKKwkJaWYoY29hbF9jb25mLT50eF9jb2FsX3R5cGUgIT0gTk9fQ09BTEVTQ0UpeworCQkJCisJCQljb2FsX2NvbmYtPnR4X3RpbWVvdXQgPSAweDA7CisJCQljb2FsX2NvbmYtPnR4X2V2ZW50X2NvdW50ID0gMDsKKwkJCWFtZDgxMTFlX3NldF9jb2FsZXNjZShkZXYsVFhfSU5UUl9DT0FMKTsKKwkJCWNvYWxfY29uZi0+dHhfY29hbF90eXBlID0gTk9fQ09BTEVTQ0U7CisJCX0KKwl9CisJZWxzZXsKKwkKKwkJdHhfcGt0X3NpemUgPSB0eF9kYXRhX3JhdGUvdHhfcGt0X3JhdGU7CisJCWlmICh0eF9wa3Rfc2l6ZSA8IDEyOCl7CisJCQorCQkJaWYoY29hbF9jb25mLT50eF9jb2FsX3R5cGUgIT0gTk9fQ09BTEVTQ0UpeworCQkJCisJCQkJY29hbF9jb25mLT50eF90aW1lb3V0ID0gMDsKKwkJCQljb2FsX2NvbmYtPnR4X2V2ZW50X2NvdW50ID0gMDsKKwkJCQlhbWQ4MTExZV9zZXRfY29hbGVzY2UoZGV2LFRYX0lOVFJfQ09BTCk7CisJCQkJY29hbF9jb25mLT50eF9jb2FsX3R5cGUgPSBOT19DT0FMRVNDRTsKKwkJCX0KKworCQl9CisJCWVsc2UgaWYgKCAodHhfcGt0X3NpemUgPj0gMTI4KSAmJiAodHhfcGt0X3NpemUgPCA1MTIpICl7CisJCisJCQlpZihjb2FsX2NvbmYtPnR4X2NvYWxfdHlwZSAhPSAgTE9XX0NPQUxFU0NFKXsKKwkJCQljb2FsX2NvbmYtPnR4X3RpbWVvdXQgPSAxOworCQkJCWNvYWxfY29uZi0+dHhfZXZlbnRfY291bnQgPSAyOworCQkJCWFtZDgxMTFlX3NldF9jb2FsZXNjZShkZXYsVFhfSU5UUl9DT0FMKTsKKwkJCQljb2FsX2NvbmYtPnR4X2NvYWxfdHlwZSA9IExPV19DT0FMRVNDRTsKKworCQkJfQorCQl9CisJCWVsc2UgaWYgKCh0eF9wa3Rfc2l6ZSA+PSA1MTIpICYmICh0eF9wa3Rfc2l6ZSA8IDEwMjQpKXsKKwkJCQorCQkJaWYoY29hbF9jb25mLT50eF9jb2FsX3R5cGUgIT0gIE1FRElVTV9DT0FMRVNDRSl7CisJCQkJY29hbF9jb25mLT50eF90aW1lb3V0ID0gMjsKKwkJCQljb2FsX2NvbmYtPnR4X2V2ZW50X2NvdW50ID0gNTsKKwkJCQlhbWQ4MTExZV9zZXRfY29hbGVzY2UoZGV2LFRYX0lOVFJfQ09BTCk7CisJCQkJY29hbF9jb25mLT50eF9jb2FsX3R5cGUgPSBNRURJVU1fQ09BTEVTQ0U7CisJCQl9CQkKKwkJCQkKKwkJfQorCQllbHNlIGlmKHR4X3BrdF9zaXplID49IDEwMjQpeworCQkJaWYgKHR4X3BrdF9zaXplID49IDEwMjQpeworCQkJCWlmKGNvYWxfY29uZi0+dHhfY29hbF90eXBlICE9ICBISUdIX0NPQUxFU0NFKXsKKwkJCQkJY29hbF9jb25mLT50eF90aW1lb3V0ID0gNDsKKwkJCQkJY29hbF9jb25mLT50eF9ldmVudF9jb3VudCA9IDg7CisJCQkJCWFtZDgxMTFlX3NldF9jb2FsZXNjZShkZXYsVFhfSU5UUl9DT0FMKTsKKwkJCQkJY29hbF9jb25mLT50eF9jb2FsX3R5cGUgPSBISUdIX0NPQUxFU0NFOworCQkJCX0JCQorCQkJfQorCQl9CisJfQorCXJldHVybiAwOworCit9CisvKgorVGhpcyBpcyBkZXZpY2UgaW50ZXJydXB0IGZ1bmN0aW9uLiBJdCBoYW5kbGVzIHRyYW5zbWl0LCByZWNlaXZlLGxpbmsgY2hhbmdlIGFuZCBoYXJkd2FyZSB0aW1lciBpbnRlcnJ1cHRzLgorKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBhbWQ4MTExZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKworCXN0cnVjdCBuZXRfZGV2aWNlICogZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqbW1pbyA9IGxwLT5tbWlvOworCXVuc2lnbmVkIGludCBpbnRyMDsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlZCA9IDE7CisKKwlpZihkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIElSUV9OT05FOworCisJaWYgKHJlZ3MpIHNwaW5fbG9jayAoJmxwLT5sb2NrKTsKKwkvKiBkaXNhYmxpbmcgaW50ZXJydXB0ICovCisJd3JpdGVsKElOVFJFTiwgbW1pbyArIENNRDApOworCisJLyogUmVhZCBpbnRlcnJ1cHQgc3RhdHVzICovCisJaW50cjAgPSByZWFkbChtbWlvICsgSU5UMCk7CisKKwkvKiBQcm9jZXNzIGFsbCB0aGUgSU5UIGV2ZW50IHVudGlsIElOVFIgYml0IGlzIGNsZWFyLiAqLworCisJaWYgKCEoaW50cjAgJiBJTlRSKSl7CisJCWhhbmRsZWQgPSAwOworCQlnb3RvIGVycl9ub19pbnRlcnJ1cHQ7CisJfQorCQkgCisJLyogQ3VycmVudCBkcml2ZXIgcHJvY2Vzc2VzIDQgaW50ZXJydXB0cyA6IFJJTlQsVElOVCxMQ0lOVCxTVElOVCAqLworCXdyaXRlbChpbnRyMCwgbW1pbyArIElOVDApOworCisJLyogQ2hlY2sgaWYgUmVjZWl2ZSBJbnRlcnJ1cHQgaGFzIG9jY3VycmVkLiAqLworI2lmIENPTkZJR19BTUQ4MTExRV9OQVBJCisJaWYoaW50cjAgJiBSSU5UMCl7CisJCWlmKG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAoZGV2KSl7CisJCQkvKiBEaXNhYmxlIHJlY2VpdmUgaW50ZXJ1cHRzICovCisJCQl3cml0ZWwoUklOVEVOMCwgbW1pbyArIElOVEVOMCk7CisJCQkvKiBTY2hlZHVsZSBhIHBvbGxpbmcgcm91dGluZSAqLworCQkJX19uZXRpZl9yeF9zY2hlZHVsZShkZXYpOworCQl9CisJCWVsc2UgeworCQkJcHJpbnRrKCIqKioqKioqKioqKipEcml2ZXIgYnVnISBcCisJCQkJaW50ZXJydXB0IHdoaWxlIGluIHBvbGxcbiIpOworCQkJLyogRml4IGJ5IGRpc2FibGluZyBpbnRlcnJ1cHRzICovCisJCQl3cml0ZWwoUklOVDAsIG1taW8gKyBJTlQwKTsKKwkJfQorCX0KKyNlbHNlCisJaWYoaW50cjAgJiBSSU5UMCl7CisJCWFtZDgxMTFlX3J4KGRldik7CisJCXdyaXRlbChWQUwyIHwgUkRNRDAsIG1taW8gKyBDTUQwKTsKKwl9CisjZW5kaWYgLyogQ09ORklHX0FNRDgxMTFFX05BUEkgKi8KKwkvKiBDaGVjayBpZiAgVHJhbnNtaXQgSW50ZXJydXB0IGhhcyBvY2N1cnJlZC4gKi8KKwlpZihpbnRyMCAmIFRJTlQwKQorCQlhbWQ4MTExZV90eChkZXYpOworCQkKKwkvKiBDaGVjayBpZiAgTGluayBDaGFuZ2UgSW50ZXJydXB0IGhhcyBvY2N1cnJlZC4gKi8KKwlpZiAoaW50cjAgJiBMQ0lOVCkKKwkJYW1kODExMWVfbGlua19jaGFuZ2UoZGV2KTsKKworCS8qIENoZWNrIGlmIEhhcmR3YXJlIFRpbWVyIEludGVycnVwdCBoYXMgb2NjdXJyZWQuICovCisJaWYgKGludHIwICYgU1RJTlQpCisJCWFtZDgxMTFlX2NhbGNfY29hbGVzY2UoZGV2KTsKKworZXJyX25vX2ludGVycnVwdDoKKwl3cml0ZWwoIFZBTDAgfCBJTlRSRU4sbW1pbyArIENNRDApOworCQorCWlmIChyZWdzKSBzcGluX3VubG9jaygmbHAtPmxvY2spOworCQorCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIGFtZDgxMTFlX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sgCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsgCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlhbWQ4MTExZV9pbnRlcnJ1cHQoMCwgZGV2LCBOVUxMKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IAorfSAKKyNlbmRpZgorCisKKy8qCitUaGlzIGZ1bmN0aW9uIGNsb3NlcyB0aGUgbmV0d29yayBpbnRlcmZhY2UgYW5kIHVwZGF0ZXMgdGhlIHN0YXRpc3RpY3Mgc28gdGhhdCBtb3N0IHJlY2VudCBzdGF0aXN0aWNzIHdpbGwgYmUgYXZhaWxhYmxlIGFmdGVyIHRoZSBpbnRlcmZhY2UgaXMgZG93bi4KKyovCitzdGF0aWMgaW50IGFtZDgxMTFlX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5ldGRldl9wcml2KGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsKKwkKKwlhbWQ4MTExZV9kaXNhYmxlX2ludGVycnVwdChscCk7CisJYW1kODExMWVfc3RvcF9jaGlwKGxwKTsKKwlhbWQ4MTExZV9mcmVlX3JpbmcobHApOworCQorCW5ldGlmX2NhcnJpZXJfb2ZmKGxwLT5hbWQ4MTExZV9uZXRfZGV2KTsKKworCS8qIERlbGV0ZSBpcGcgdGltZXIgKi8KKwlpZihscC0+b3B0aW9ucyAmIE9QVElPTl9EWU5fSVBHX0VOQUJMRSkJICAgICAgICAKKwkJZGVsX3RpbWVyX3N5bmMoJmxwLT5pcGdfZGF0YS5pcGdfdGltZXIpOworCisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCisJLyogVXBkYXRlIHRoZSBzdGF0aXN0aWNzIGJlZm9yZSBjbG9zaW5nICovCisJYW1kODExMWVfZ2V0X3N0YXRzKGRldik7CisJbHAtPm9wZW5lZCA9IDA7CisJcmV0dXJuIDA7Cit9CisvKiBUaGlzIGZ1bmN0aW9uIG9wZW5zIG5ldyBpbnRlcmZhY2UuSXQgcmVxdWVzdHMgaXJxIGZvciB0aGUgZGV2aWNlLCBpbml0aWFsaXplcyB0aGUgZGV2aWNlLGJ1ZmZlcnMgYW5kIGRlc2NyaXB0b3JzLCBhbmQgc3RhcnRzIHRoZSBkZXZpY2UuIAorKi8KK3N0YXRpYyBpbnQgYW1kODExMWVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiApCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmKGRldi0+aXJxID09MCB8fCByZXF1ZXN0X2lycShkZXYtPmlycSwgYW1kODExMWVfaW50ZXJydXB0LCBTQV9TSElSUSwKKwkJCQkJIGRldi0+bmFtZSwgZGV2KSkgCisJCXJldHVybiAtRUFHQUlOOworCisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCisJYW1kODExMWVfaW5pdF9od19kZWZhdWx0KGxwKTsKKworCWlmKGFtZDgxMTFlX3Jlc3RhcnQoZGV2KSl7CisJCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworCQlpZiAoZGV2LT5pcnEpCisJCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIFN0YXJ0IGlwZyB0aW1lciAqLworCWlmKGxwLT5vcHRpb25zICYgT1BUSU9OX0RZTl9JUEdfRU5BQkxFKXsJICAgICAgICAKKwkJYWRkX3RpbWVyKCZscC0+aXBnX2RhdGEuaXBnX3RpbWVyKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IER5bmFtaWMgSVBHIEVuYWJsZWQuXG4iLGRldi0+bmFtZSk7CisJfQorCisJbHAtPm9wZW5lZCA9IDE7CisKKwlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsJCQorfQorLyogCitUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGVyZSBpcyBhbnkgdHJhbnNtaXQgIGRlc2NyaXB0b3JzIGF2YWlsYWJsZSB0byBxdWV1ZSBtb3JlIHBhY2tldC4KKyovCitzdGF0aWMgaW50IGFtZDgxMTFlX3R4X3F1ZXVlX2F2YWlsKHN0cnVjdCBhbWQ4MTExZV9wcml2KiBscCApCit7CQorCWludCB0eF9pbmRleCA9IGxwLT50eF9pZHggJiBUWF9CVUZGX01PRF9NQVNLOworCWlmKGxwLT50eF9za2J1ZmZbdHhfaW5kZXhdICE9IDApCisJCXJldHVybiAtMTsKKwllbHNlCisJCXJldHVybiAwOworCQorfQorLyogCitUaGlzIGZ1bmN0aW9uIHdpbGwgcXVldWUgdGhlIHRyYW5zbWl0IHBhY2tldHMgdG8gdGhlIGRlc2NyaXB0b3JzIGFuZCB3aWxsIHRyaWdnZXIgdGhlIHNlbmQgb3BlcmF0aW9uLiBJdCBhbHNvIGluaXRpYWxpemVzIHRoZSB0cmFuc21pdCBkZXNjcmlwdG9ycyB3aXRoIGJ1ZmZlciBwaHlzaWNhbCBhZGRyZXNzLCBieXRlIGNvdW50LCBvd25lcnNoaXAgdG8gaGFyZHdhcmUgZXRjLgorKi8KKworc3RhdGljIGludCBhbWQ4MTExZV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHR4X2luZGV4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXR4X2luZGV4ID0gbHAtPnR4X2lkeCAmIFRYX1JJTkdfRFJfTU9EX01BU0s7CisKKwlscC0+dHhfcmluZ1t0eF9pbmRleF0uYnVmZl9jb3VudCA9IGNwdV90b19sZTE2KHNrYi0+bGVuKTsKKworCWxwLT50eF9za2J1ZmZbdHhfaW5kZXhdID0gc2tiOworCWxwLT50eF9yaW5nW3R4X2luZGV4XS50eF9mbGFncyA9IDA7CisKKyNpZiBBTUQ4MTExRV9WTEFOX1RBR19VU0VECisJaWYoKGxwLT52bGdycCAhPSBOVUxMKSAmJiB2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpeworCQlscC0+dHhfcmluZ1t0eF9pbmRleF0udGFnX2N0cmxfY21kIHw9IAorCQkJCWNwdV90b19sZTE2KFRDQ19WTEFOX0lOU0VSVCk7CQorCQlscC0+dHhfcmluZ1t0eF9pbmRleF0udGFnX2N0cmxfaW5mbyA9IAorCQkJCWNwdV90b19sZTE2KHZsYW5fdHhfdGFnX2dldChza2IpKTsKKworCX0KKyNlbmRpZgorCWxwLT50eF9kbWFfYWRkclt0eF9pbmRleF0gPQorCSAgICBwY2lfbWFwX3NpbmdsZShscC0+cGNpX2Rldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJbHAtPnR4X3JpbmdbdHhfaW5kZXhdLmJ1ZmZfcGh5X2FkZHIgPQorCSAgICAodTMyKSBjcHVfdG9fbGUzMihscC0+dHhfZG1hX2FkZHJbdHhfaW5kZXhdKTsKKworCS8qICBTZXQgRkNTIGFuZCBMVElOVCBiaXRzICovCisJd21iKCk7CisJbHAtPnR4X3JpbmdbdHhfaW5kZXhdLnR4X2ZsYWdzIHw9CisJICAgIGNwdV90b19sZTE2KE9XTl9CSVQgfCBTVFBfQklUIHwgRU5QX0JJVHxBRERfRkNTX0JJVHxMVElOVF9CSVQpOworCisJbHAtPnR4X2lkeCsrOworCisJLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgc2VuZCBwb2xsLiAqLworCXdyaXRlbCggVkFMMSB8IFRETUQwLCBscC0+bW1pbyArIENNRDApOworCXdyaXRlbCggVkFMMiB8IFJETUQwLGxwLT5tbWlvICsgQ01EMCk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCWlmKGFtZDgxMTFlX3R4X3F1ZXVlX2F2YWlsKGxwKSA8IDApeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisvKgorVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFsbCB0aGUgbWVtb3J5IG1hcHBlZCByZWdpc3RlcnMgb2YgdGhlIGRldmljZS4KKyovCitzdGF0aWMgdm9pZCBhbWQ4MTExZV9yZWFkX3JlZ3Moc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwLCB1MzIgKmJ1ZikKK3sKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBscC0+bW1pbzsKKwkvKiBSZWFkIG9ubHkgbmVjZXNzYXJ5IHJlZ2lzdGVycyAqLworCWJ1ZlswXSA9IHJlYWRsKG1taW8gKyBYTVRfUklOR19CQVNFX0FERFIwKTsKKwlidWZbMV0gPSByZWFkbChtbWlvICsgWE1UX1JJTkdfTEVOMCk7CisJYnVmWzJdID0gcmVhZGwobW1pbyArIFJDVl9SSU5HX0JBU0VfQUREUjApOworCWJ1ZlszXSA9IHJlYWRsKG1taW8gKyBSQ1ZfUklOR19MRU4wKTsKKwlidWZbNF0gPSByZWFkbChtbWlvICsgQ01EMCk7CisJYnVmWzVdID0gcmVhZGwobW1pbyArIENNRDIpOworCWJ1Zls2XSA9IHJlYWRsKG1taW8gKyBDTUQzKTsKKwlidWZbN10gPSByZWFkbChtbWlvICsgQ01ENyk7CisJYnVmWzhdID0gcmVhZGwobW1pbyArIElOVDApOworCWJ1Zls5XSA9IHJlYWRsKG1taW8gKyBJTlRFTjApOworCWJ1ZlsxMF0gPSByZWFkbChtbWlvICsgTEFEUkYpOworCWJ1ZlsxMV0gPSByZWFkbChtbWlvICsgTEFEUkYrNCk7CisJYnVmWzEyXSA9IHJlYWRsKG1taW8gKyBTVEFUMCk7Cit9CisKKy8qCithbWQ4MTExZSBjcmMgZ2VuZXJhdG9yIGltcGxlbWVudGF0aW9uIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBrZXJuZWwKK2V0aGVyX2NyYygpIGZ1bmN0aW9uLgorKi8KK3N0YXRpYyBpbnQgYW1kODExMWVfZXRoZXJfY3JjKGludCBsZW4sIGNoYXIqIG1hY19hZGRyKQoreworCWludCBpLGJ5dGU7CisJdW5zaWduZWQgY2hhciBvY3RldDsKKwl1MzIgY3JjPSBJTklUQ1JDOworCisJZm9yKGJ5dGU9MDsgYnl0ZSA8IGxlbjsgYnl0ZSsrKXsKKwkJb2N0ZXQgPSBtYWNfYWRkcltieXRlXTsKKwkJZm9yKCBpPTA7aSA8IDg7IGkrKyl7CisJCQkvKklmIHRoZSBuZXh0IGJpdCBmb3JtIHRoZSBpbnB1dCBzdHJlYW0gaXMgMSxzdWJ0cmFjdAkJCQkgdGhlIGRpdmlzb3IgKENSQzMyKSBmcm9tIHRoZSBkaXZpZGVuZChjcmMpLiovCisJCQlpZiggKG9jdGV0ICYgMHgxKSBeIChjcmMgJiAweDEpICl7CisJCQkJY3JjID4+PSAxOworCQkJCWNyYyBePSBDUkMzMjsKKwkJCX0KKwkJCWVsc2UKKwkJCQljcmMgPj49IDE7CisJCQkKKwkJCW9jdGV0ID4+PSAxOworCQl9CisJfQkKKwlyZXR1cm4gY3JjOyAKK30KKy8qCitUaGlzIGZ1bmN0aW9uIHNldHMgcHJvbWlzY3VvcyBtb2RlLCBhbGwtbXVsdGkgbW9kZSBvciB0aGUgbXVsdGljYXN0IGFkZHJlc3MgCitsaXN0IHRvIHRoZSBkZXZpY2UuCisqLworc3RhdGljIHZvaWQgYW1kODExMWVfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldl9tY19saXN0KiBtY19wdHI7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgbWNfZmlsdGVyWzJdIDsKKwlpbnQgaSxiaXRfbnVtOworCWlmKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTZXR0aW5nICBwcm9taXNjdW91cyBtb2RlLlxuIixkZXYtPm5hbWUpOworCQl3cml0ZWwoIFZBTDIgfCBQUk9NLCBscC0+bW1pbyArIENNRDIpOworCQlyZXR1cm47CisJfQorCWVsc2UKKwkJd3JpdGVsKCBQUk9NLCBscC0+bW1pbyArIENNRDIpOworCWlmKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgfHwgZGV2LT5tY19jb3VudCA+IE1BWF9GSUxURVJfU0laRSl7CisJCS8qIGdldCBhbGwgbXVsdGljYXN0IHBhY2tldCAqLworCQltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSAweGZmZmZmZmZmOworCQlscC0+bWNfbGlzdCA9IGRldi0+bWNfbGlzdDsKKwkJbHAtPm9wdGlvbnMgfD0gT1BUSU9OX01VTFRJQ0FTVF9FTkFCTEU7CisJCWFtZDgxMTFlX3dyaXRlcSgqKHU2NCopbWNfZmlsdGVyLGxwLT5tbWlvICsgTEFEUkYpOworCQlyZXR1cm47CisJfQorCWlmKCBkZXYtPm1jX2NvdW50ID09IDAgKXsKKwkJLyogZ2V0IG9ubHkgb3duIHBhY2tldHMgKi8KKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMDsKKwkJbHAtPm1jX2xpc3QgPSBOVUxMOworCQlscC0+b3B0aW9ucyAmPSB+T1BUSU9OX01VTFRJQ0FTVF9FTkFCTEU7CisJCWFtZDgxMTFlX3dyaXRlcSgqKHU2NCopbWNfZmlsdGVyLGxwLT5tbWlvICsgTEFEUkYpOworCQkvKiBkaXNhYmxlIHByb21pc2NvdXMgbW9kZSAqLworCQl3cml0ZWwoUFJPTSwgbHAtPm1taW8gKyBDTUQyKTsKKwkJcmV0dXJuOworCX0KKwkvKiBsb2FkIGFsbCB0aGUgbXVsdGljYXN0IGFkZHJlc3NlcyBpbiB0aGUgbG9naWMgZmlsdGVyICovCisJbHAtPm9wdGlvbnMgfD0gT1BUSU9OX01VTFRJQ0FTVF9FTkFCTEU7CisJbHAtPm1jX2xpc3QgPSBkZXYtPm1jX2xpc3Q7CisJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMDsKKwlmb3IgKGkgPSAwLCBtY19wdHIgPSBkZXYtPm1jX2xpc3Q7IG1jX3B0ciAmJiBpIDwgZGV2LT5tY19jb3VudDsKKwkJICAgICBpKyssIG1jX3B0ciA9IG1jX3B0ci0+bmV4dCkgeworCQliaXRfbnVtID0gKCBhbWQ4MTExZV9ldGhlcl9jcmMoRVRIX0FMRU4sbWNfcHRyLT5kbWlfYWRkcikJCQkJCQkJID4+IDI2ICkgJiAweDNmOworCQltY19maWx0ZXJbYml0X251bSA+PiA1XSB8PSAxIDw8IChiaXRfbnVtICYgMzEpOworCX0JCisJYW1kODExMWVfd3JpdGVxKCoodTY0KiltY19maWx0ZXIsbHAtPm1taW8rIExBRFJGKTsKKworCS8qIFRvIGVsaW1pbmF0ZSBQQ0kgcG9zdGluZyBidWcgKi8KKwlyZWFkbChscC0+bW1pbyArIENNRDIpOworCit9CisKK3N0YXRpYyB2b2lkIGFtZDgxMTFlX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IGxwLT5wY2lfZGV2OworCXN0cmNweSAoaW5mby0+ZHJpdmVyLCBNT0RVTEVfTkFNRSk7CisJc3RyY3B5IChpbmZvLT52ZXJzaW9uLCBNT0RVTEVfVkVSUyk7CisJc3ByaW50ZihpbmZvLT5md192ZXJzaW9uLCIldSIsY2hpcF92ZXJzaW9uKTsKKwlzdHJjcHkgKGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShwY2lfZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgYW1kODExMWVfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIEFNRDgxMTFFX1JFR19EVU1QX0xFTjsKK30KKworc3RhdGljIHZvaWQgYW1kODExMWVfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqYnVmKQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcmVncy0+dmVyc2lvbiA9IDA7CisJYW1kODExMWVfcmVhZF9yZWdzKGxwLCBidWYpOworfQorCitzdGF0aWMgaW50IGFtZDgxMTFlX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CisJbWlpX2V0aHRvb2xfZ3NldCgmbHAtPm1paV9pZiwgZWNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1kODExMWVfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXM7CisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCXJlcyA9IG1paV9ldGh0b29sX3NzZXQoJmxwLT5taWlfaWYsIGVjbWQpOworCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgYW1kODExMWVfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIG1paV9ud2F5X3Jlc3RhcnQoJmxwLT5taWlfaWYpOworfQorCitzdGF0aWMgdTMyIGFtZDgxMTFlX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbWlpX2xpbmtfb2soJmxwLT5taWlfaWYpOworfQorCitzdGF0aWMgdm9pZCBhbWQ4MTExZV9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbF9pbmZvKQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5ldGRldl9wcml2KGRldik7CisJd29sX2luZm8tPnN1cHBvcnRlZCA9IFdBS0VfTUFHSUN8V0FLRV9QSFk7CisJaWYgKGxwLT5vcHRpb25zICYgT1BUSU9OX1dPTF9FTkFCTEUpCisJCXdvbF9pbmZvLT53b2xvcHRzID0gV0FLRV9NQUdJQzsKK30KKworc3RhdGljIGludCBhbWQ4MTExZV9zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbF9pbmZvKQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaWYgKHdvbF9pbmZvLT53b2xvcHRzICYgfihXQUtFX01BR0lDfFdBS0VfUEhZKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCWlmICh3b2xfaW5mby0+d29sb3B0cyAmIFdBS0VfTUFHSUMpCisJCWxwLT5vcHRpb25zIHw9IAorCQkJKE9QVElPTl9XT0xfRU5BQkxFIHwgT1BUSU9OX1dBS0VfTUFHSUNfRU5BQkxFKTsKKwllbHNlIGlmKHdvbF9pbmZvLT53b2xvcHRzICYgV0FLRV9QSFkpCisJCWxwLT5vcHRpb25zIHw9IAorCQkJKE9QVElPTl9XT0xfRU5BQkxFIHwgT1BUSU9OX1dBS0VfUEhZX0VOQUJMRSk7CisJZWxzZQorCQlscC0+b3B0aW9ucyAmPSB+T1BUSU9OX1dPTF9FTkFCTEU7IAorCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG9wcyA9IHsKKwkuZ2V0X2RydmluZm8gPSBhbWQ4MTExZV9nZXRfZHJ2aW5mbywKKwkuZ2V0X3JlZ3NfbGVuID0gYW1kODExMWVfZ2V0X3JlZ3NfbGVuLAorCS5nZXRfcmVncyA9IGFtZDgxMTFlX2dldF9yZWdzLAorCS5nZXRfc2V0dGluZ3MgPSBhbWQ4MTExZV9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncyA9IGFtZDgxMTFlX3NldF9zZXR0aW5ncywKKwkubndheV9yZXNldCA9IGFtZDgxMTFlX253YXlfcmVzZXQsCisJLmdldF9saW5rID0gYW1kODExMWVfZ2V0X2xpbmssCisJLmdldF93b2wgPSBhbWQ4MTExZV9nZXRfd29sLAorCS5zZXRfd29sID0gYW1kODExMWVfc2V0X3dvbCwKK307CisKKy8qCitUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgYWxsIHRoZSAgZXRodG9vbCBpb2N0bHMuIEl0IGdpdmVzIGRyaXZlciBpbmZvLCBnZXRzL3NldHMgZHJpdmVyIHNwZWVkLCBnZXRzIG1lbW9yeSBtYXBwZWQgcmVnaXN0ZXIgdmFsdWVzLCBmb3JjZXMgYXV0byBuZWdvdGlhdGlvbiwgc2V0cy9nZXRzIFdPTCBvcHRpb25zIGZvciBldGh0b29sIGFwcGxpY2F0aW9uLiAKKyovCisJCitzdGF0aWMgaW50IGFtZDgxMTFlX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2ICwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IG1paV9pb2N0bF9kYXRhICpkYXRhID0gaWZfbWlpKGlmcik7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyOworCXUzMiBtaWlfcmVndmFsOworCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgU0lPQ0dNSUlQSFk6CisJCWRhdGEtPnBoeV9pZCA9IGxwLT5leHRfcGh5X2FkZHI7CisKKwkvKiBmYWxsdGhydSAqLworCWNhc2UgU0lPQ0dNSUlSRUc6IAorCisJCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsKKwkJZXJyID0gYW1kODExMWVfcmVhZF9waHkobHAsIGRhdGEtPnBoeV9pZCwKKwkJCWRhdGEtPnJlZ19udW0gJiBQSFlfUkVHX0FERFJfTUFTSywgJm1paV9yZWd2YWwpOworCQlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKworCQlkYXRhLT52YWxfb3V0ID0gbWlpX3JlZ3ZhbDsKKwkJcmV0dXJuIGVycjsKKworCWNhc2UgU0lPQ1NNSUlSRUc6CisKKwkJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCQllcnIgPSBhbWQ4MTExZV93cml0ZV9waHkobHAsIGRhdGEtPnBoeV9pZCwKKwkJCWRhdGEtPnJlZ19udW0gJiBQSFlfUkVHX0FERFJfTUFTSywgZGF0YS0+dmFsX2luKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CisKKwkJcmV0dXJuIGVycjsKKworCWRlZmF1bHQ6CisJCS8qIGRvIG5vdGhpbmcgKi8KKwkJYnJlYWs7CisJfQorCXJldHVybiAtRU9QTk9UU1VQUDsKK30KK3N0YXRpYyBpbnQgYW1kODExMWVfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsKKwkvKiBTZXR0aW5nIHRoZSBNQUMgYWRkcmVzcyB0byB0aGUgZGV2aWNlICovCisJZm9yKGkgPSAwOyBpIDwgRVRIX0FERFJfTEVOOyBpKyspCisJCXdyaXRlYiggZGV2LT5kZXZfYWRkcltpXSwgbHAtPm1taW8gKyBQQURSICsgaSApOyAKKwkJCisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyogCitUaGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIG10dSBvZiB0aGUgZGV2aWNlLiBJdCByZXN0YXJ0cyB0aGUgZGV2aWNlICB0byBpbml0aWFsaXplIHRoZSBkZXNjcmlwdG9yIHdpdGggbmV3IHJlY2VpdmUgYnVmZmVycy4KKyovICAKK3N0YXRpYyBpbnQgYW1kODExMWVfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnI7CisKKwlpZiAoKG5ld19tdHUgPCBBTUQ4MTExRV9NSU5fTVRVKSB8fCAobmV3X210dSA+IEFNRDgxMTFFX01BWF9NVFUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCS8qIG5ld19tdHUgd2lsbCBiZSB1c2VkCisJCSAgIHdoZW4gZGV2aWNlIHN0YXJ0cyBuZXR4dCB0aW1lICovIAorCQlkZXYtPm10dSA9IG5ld19tdHU7CisJCXJldHVybiAwOworCX0KKworCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsKKworICAgICAgICAvKiBzdG9wIHRoZSBjaGlwICovCisJd3JpdGVsKFJVTiwgbHAtPm1taW8gKyBDTUQwKTsKKworCWRldi0+bXR1ID0gbmV3X210dTsKKworCWVyciA9IGFtZDgxMTFlX3Jlc3RhcnQoZGV2KTsKKwlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKwlpZighZXJyKQorCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiBlcnI7Cit9CisKKyNpZiBBTUQ4MTExRV9WTEFOX1RBR19VU0VECitzdGF0aWMgdm9pZCBhbWQ4MTExZV92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCit7CisJc3RydWN0ICBhbWQ4MTExZV9wcml2ICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCWxwLT52bGdycCA9IGdycDsKKwlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKK30KKwkKK3N0YXRpYyB2b2lkIGFtZDgxMTFlX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKQoreworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCWlmIChscC0+dmxncnApCisJCWxwLT52bGdycC0+dmxhbl9kZXZpY2VzW3ZpZF0gPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworfQorI2VuZGlmCitzdGF0aWMgaW50IGFtZDgxMTFlX2VuYWJsZV9tYWdpY3BrdChzdHJ1Y3QgYW1kODExMWVfcHJpdiogbHApCit7CisJd3JpdGVsKCBWQUwxfE1QUExCQSwgbHAtPm1taW8gKyBDTUQzKTsKKwl3cml0ZWwoIFZBTDB8TVBFTl9TVywgbHAtPm1taW8gKyBDTUQ3KTsKKworCS8qIFRvIGVsaW1pbmF0ZSBQQ0kgcG9zdGluZyBidWcgKi8KKwlyZWFkbChscC0+bW1pbyArIENNRDcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtZDgxMTFlX2VuYWJsZV9saW5rX2NoYW5nZShzdHJ1Y3QgYW1kODExMWVfcHJpdiogbHApCit7CisKKwkvKiBBZGFwdGVyIGlzIGFscmVhZHkgc3RvcGVkL3N1c3BlbmRlZC9pbnRlcnJ1cHQtZGlzYWJsZWQgKi8KKwl3cml0ZWwoVkFMMHxMQ01PREVfU1csbHAtPm1taW8gKyBDTUQ3KTsKKwkKKwkvKiBUbyBlbGltaW5hdGUgUENJIHBvc3RpbmcgYnVnICovCisJcmVhZGwobHAtPm1taW8gKyBDTUQ3KTsKKwlyZXR1cm4gMDsKK30JCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgcGFja2V0IHRyYW5zbWlzc2lvbiBmYWlscyB0byBjb21wbGV0ZSB3aXRoaW4gYSAgcmVzb25hYmxlIHBlcmlvZCwgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBhbiBpbnRlcnJ1cHRzIGhhdmUgYmVlbiBmYWlsZWQgb3IgdGhlICBpbnRlcmZhY2UgaXMgbG9ja2VkIHVwLiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVpbml0aWFsaXplIHRoZSBoYXJkd2FyZSAqLworCitzdGF0aWMgdm9pZCBhbWQ4MTExZV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYqIGxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyOworCisJcHJpbnRrKEtFUk5fRVJSICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCByZXNldHRpbmdcbiIsCisJIAkJCQkJICAgICAgZGV2LT5uYW1lKTsKKwlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CisJZXJyID0gYW1kODExMWVfcmVzdGFydChkZXYpOworCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworCWlmKCFlcnIpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KK3N0YXRpYyBpbnQgYW1kODExMWVfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorewkKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCBhbWQ4MTExZV9wcml2ICpscCA9IG5ldGRldl9wcml2KGRldik7CisJCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAwOworCisJLyogZGlzYWJsZSB0aGUgaW50ZXJydXB0ICovCisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCWFtZDgxMTFlX2Rpc2FibGVfaW50ZXJydXB0KGxwKTsKKwlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKworCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwkKKwkvKiBzdG9wIGNoaXAgKi8KKwlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CisJaWYobHAtPm9wdGlvbnMgJiBPUFRJT05fRFlOX0lQR19FTkFCTEUpCSAgICAgICAgCisJCWRlbF90aW1lcl9zeW5jKCZscC0+aXBnX2RhdGEuaXBnX3RpbWVyKTsKKwlhbWQ4MTExZV9zdG9wX2NoaXAobHApOworCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworCisJaWYobHAtPm9wdGlvbnMgJiBPUFRJT05fV09MX0VOQUJMRSl7CisJCSAvKiBlbmFibGUgd29sICovCisJCWlmKGxwLT5vcHRpb25zICYgT1BUSU9OX1dBS0VfTUFHSUNfRU5BQkxFKQorCQkJYW1kODExMWVfZW5hYmxlX21hZ2ljcGt0KGxwKTsJCisJCWlmKGxwLT5vcHRpb25zICYgT1BUSU9OX1dBS0VfUEhZX0VOQUJMRSkKKwkJCWFtZDgxMTFlX2VuYWJsZV9saW5rX2NoYW5nZShscCk7CQorCQkKKwkJcGNpX2VuYWJsZV93YWtlKHBjaV9kZXYsIFBDSV9EM2hvdCwgMSk7CisJCXBjaV9lbmFibGVfd2FrZShwY2lfZGV2LCBQQ0lfRDNjb2xkLCAxKTsKKworCX0KKwllbHNlewkJCisJCXBjaV9lbmFibGVfd2FrZShwY2lfZGV2LCBQQ0lfRDNob3QsIDApOworCQlwY2lfZW5hYmxlX3dha2UocGNpX2RldiwgUENJX0QzY29sZCwgMCk7CisJfQorCQorCXBjaV9zYXZlX3N0YXRlKHBjaV9kZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QzaG90KTsKKworCXJldHVybiAwOworfQorc3RhdGljIGludCBhbWQ4MTExZV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKwlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gMDsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwY2lfZGV2KTsKKworCXBjaV9lbmFibGVfd2FrZShwY2lfZGV2LCBQQ0lfRDNob3QsIDApOworCXBjaV9lbmFibGVfd2FrZShwY2lfZGV2LCBQQ0lfRDNjb2xkLCAwKTsgLyogRDMgY29sZCAqLworCisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCWFtZDgxMTFlX3Jlc3RhcnQoZGV2KTsKKwkvKiBSZXN0YXJ0IGlwZyB0aW1lciAqLworCWlmKGxwLT5vcHRpb25zICYgT1BUSU9OX0RZTl9JUEdfRU5BQkxFKQkgICAgICAgIAorCQltb2RfdGltZXIoJmxwLT5pcGdfZGF0YS5pcGdfdGltZXIsIAorCQkJCWppZmZpZXMgKyBJUEdfQ09OVkVSR0VfSklGRklFUyk7CisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYW1kODExMWVfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWlmIChkZXYpIHsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJaW91bm1hcCgoKHN0cnVjdCBhbWQ4MTExZV9wcml2ICopbmV0ZGV2X3ByaXYoZGV2KSktPm1taW8pOworCQlmcmVlX25ldGRldihkZXYpOworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwl9Cit9CitzdGF0aWMgdm9pZCBhbWQ4MTExZV9jb25maWdfaXBnKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaXBnX2luZm8qIGlwZ19kYXRhID0gJmxwLT5pcGdfZGF0YTsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBscC0+bW1pbzsKKwl1bnNpZ25lZCBpbnQgcHJldl9jb2xfY250ID0gaXBnX2RhdGEtPmNvbF9jbnQ7CisJdW5zaWduZWQgaW50IHRvdGFsX2NvbF9jbnQ7CisJdW5zaWduZWQgaW50IHRtcF9pcGc7CisJCisJaWYobHAtPmxpbmtfY29uZmlnLmR1cGxleCA9PSBEVVBMRVhfRlVMTCl7CisJCWlwZ19kYXRhLT5pcGcgPSBERUZBVUxUX0lQRzsKKwkJcmV0dXJuOworCX0KKworCWlmKGlwZ19kYXRhLT5pcGdfc3RhdGUgPT0gU1NUQVRFKXsKKwkJCisJCWlmKGlwZ19kYXRhLT50aW1lcl90aWNrID09IElQR19TVEFCTEVfVElNRSl7CisJCQkKKwkJCWlwZ19kYXRhLT50aW1lcl90aWNrID0gMDsKKwkJCWlwZ19kYXRhLT5pcGcgPSBNSU5fSVBHIC0gSVBHX1NURVA7CisJCQlpcGdfZGF0YS0+Y3VycmVudF9pcGcgPSBNSU5fSVBHOworCQkJaXBnX2RhdGEtPmRpZmZfY29sX2NudCA9IDB4RkZGRkZGRkY7CisJCQlpcGdfZGF0YS0+aXBnX3N0YXRlID0gQ1NUQVRFOworCQl9CisJCWVsc2UKKwkJCWlwZ19kYXRhLT50aW1lcl90aWNrKys7CisJfQorCisJaWYoaXBnX2RhdGEtPmlwZ19zdGF0ZSA9PSBDU1RBVEUpeworCQkKKwkJLyogR2V0IHRoZSBjdXJyZW50IGNvbGxpc2lvbiBjb3VudCAqLworCisJCXRvdGFsX2NvbF9jbnQgPSBpcGdfZGF0YS0+Y29sX2NudCA9IAorCQkJCWFtZDgxMTFlX3JlYWRfbWliKG1taW8sIHhtdF9jb2xsaXNpb25zKTsKKworCQlpZiAoKHRvdGFsX2NvbF9jbnQgLSBwcmV2X2NvbF9jbnQpIDwgCisJCQkJKGlwZ19kYXRhLT5kaWZmX2NvbF9jbnQpKXsKKwkJCQorCQkJaXBnX2RhdGEtPmRpZmZfY29sX2NudCA9CisJCQkJdG90YWxfY29sX2NudCAtIHByZXZfY29sX2NudCA7CisKKwkJCWlwZ19kYXRhLT5pcGcgPSBpcGdfZGF0YS0+Y3VycmVudF9pcGc7CisJCX0KKworCQlpcGdfZGF0YS0+Y3VycmVudF9pcGcgKz0gSVBHX1NURVA7CisKKwkJaWYgKGlwZ19kYXRhLT5jdXJyZW50X2lwZyA8PSBNQVhfSVBHKQorCQkJdG1wX2lwZyA9IGlwZ19kYXRhLT5jdXJyZW50X2lwZzsKKwkJZWxzZXsKKwkJCXRtcF9pcGcgPSBpcGdfZGF0YS0+aXBnOworCQkJaXBnX2RhdGEtPmlwZ19zdGF0ZSA9IFNTVEFURTsKKwkJfQorCQl3cml0ZXcoKHUzMil0bXBfaXBnLCBtbWlvICsgSVBHKTsgCisJCXdyaXRldygodTMyKSh0bXBfaXBnIC0gSUZTMV9ERUxUQSksIG1taW8gKyBJRlMxKTsgCisJfQorCSBtb2RfdGltZXIoJmxwLT5pcGdfZGF0YS5pcGdfdGltZXIsIGppZmZpZXMgKyBJUEdfQ09OVkVSR0VfSklGRklFUyk7CisJcmV0dXJuOworCit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBhbWQ4MTExZV9wcm9iZV9leHRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJc3RydWN0IGFtZDgxMTFlX3ByaXYgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDB4MWU7IGkgPj0gMDsgaS0tKSB7CisJCXUzMiBpZDEsIGlkMjsKKworCQlpZiAoYW1kODExMWVfcmVhZF9waHkobHAsIGksIE1JSV9QSFlTSUQxLCAmaWQxKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoYW1kODExMWVfcmVhZF9waHkobHAsIGksIE1JSV9QSFlTSUQyLCAmaWQyKSkKKwkJCWNvbnRpbnVlOworCQlscC0+ZXh0X3BoeV9pZCA9IChpZDEgPDwgMTYpIHwgaWQyOworCQlscC0+ZXh0X3BoeV9hZGRyID0gaTsKKwkJcmV0dXJuOworCX0KKwlscC0+ZXh0X3BoeV9pZCA9IDA7CisJbHAtPmV4dF9waHlfYWRkciA9IDE7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFtZDgxMTFlX3Byb2JlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJaW50IGVycixpLHBtX2NhcDsKKwl1bnNpZ25lZCBsb25nIHJlZ19hZGRyLHJlZ19sZW47CisJc3RydWN0IGFtZDgxMTFlX3ByaXYqIGxwOworCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXY7CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZihlcnIpeworCQlwcmludGsoS0VSTl9FUlIgImFtZDgxMTFlOiBDYW5ub3QgZW5hYmxlIG5ldyBQQ0kgZGV2aWNlLCIKKwkJCSJleGl0aW5nLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkpeworCQlwcmludGsoS0VSTl9FUlIgImFtZDgxMTFlOiBDYW5ub3QgZmluZCBQQ0kgYmFzZSBhZGRyZXNzIgorCQkgICAgICAgImV4aXRpbmcuXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfZGlzYWJsZV9wZGV2OworCX0KKworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgTU9EVUxFX05BTUUpOworCWlmKGVycil7CisJCXByaW50ayhLRVJOX0VSUiAiYW1kODExMWU6IENhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlcywgIgorCQkgICAgICAgImV4aXRpbmcuXG4iKTsKKwkJZ290byBlcnJfZGlzYWJsZV9wZGV2OworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJLyogRmluZCBwb3dlci1tYW5hZ2VtZW50IGNhcGFiaWxpdHkuICovCisJaWYoKHBtX2NhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9QTSkpPT0wKXsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbWQ4MTExZTogTm8gUG93ZXIgTWFuYWdlbWVudCBjYXBhYmlsaXR5LCAiCisJCSAgICAgICAiZXhpdGluZy5cbiIpOworCQlnb3RvIGVycl9mcmVlX3JlZzsKKwl9CisKKwkvKiBJbml0aWFsaXplIERNQSAqLworCWlmKCFwY2lfZG1hX3N1cHBvcnRlZChwZGV2LCAweGZmZmZmZmZmKSl7CisJCXByaW50ayhLRVJOX0VSUiAiYW1kODExMWU6IERNQSBub3Qgc3VwcG9ydGVkLCIKKwkJCSJleGl0aW5nLlxuIik7CisJCWdvdG8gIGVycl9mcmVlX3JlZzsKKwl9IGVsc2UKKwkJcGRldi0+ZG1hX21hc2sgPSAweGZmZmZmZmZmOworCQorCXJlZ19hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCXJlZ19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBhbWQ4MTExZV9wcml2KSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbWQ4MTExZTogRXRoZXJkZXYgYWxsb2MgZmFpbGVkLCBleGl0aW5nLlxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWVfcmVnOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisjaWYgQU1EODExMUVfVkxBTl9UQUdfVVNFRAorCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYIDsKKwlkZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPWFtZDgxMTFlX3ZsYW5fcnhfcmVnaXN0ZXI7CisJZGV2LT52bGFuX3J4X2tpbGxfdmlkID0gYW1kODExMWVfdmxhbl9yeF9raWxsX3ZpZDsKKyNlbmRpZgkKKwkKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisJbHAtPnBjaV9kZXYgPSBwZGV2OworCWxwLT5hbWQ4MTExZV9uZXRfZGV2ID0gZGV2OworCWxwLT5wbV9jYXAgPSBwbV9jYXA7CisKKwlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCisJbHAtPm1taW8gPSBpb3JlbWFwKHJlZ19hZGRyLCByZWdfbGVuKTsKKwlpZiAobHAtPm1taW8gPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgImFtZDgxMTFlOiBDYW5ub3QgbWFwIGRldmljZSByZWdpc3RlcnMsICIKKwkJICAgICAgICJleGl0aW5nXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9kZXY7CisJfQorCQorCS8qIEluaXRpYWxpemluZyBNQUMgYWRkcmVzcyAqLworCWZvcihpID0gMDsgaSA8IEVUSF9BRERSX0xFTjsgaSsrKQorCQkJZGV2LT5kZXZfYWRkcltpXSA9cmVhZGIobHAtPm1taW8gKyBQQURSICsgaSk7CisJCisJLyogU2V0dGluZyB1c2VyIGRlZmluZWQgcGFyYW1ldHJzICovCisJbHAtPmV4dF9waHlfb3B0aW9uID0gc3BlZWRfZHVwbGV4W2NhcmRfaWR4XTsKKwlpZihjb2FsZXNjZVtjYXJkX2lkeF0pCisJCWxwLT5vcHRpb25zIHw9IE9QVElPTl9JTlRSX0NPQUxfRU5BQkxFOwkJCisJaWYoZHluYW1pY19pcGdbY2FyZF9pZHgrK10pCisJCWxwLT5vcHRpb25zIHw9IE9QVElPTl9EWU5fSVBHX0VOQUJMRTsJICAgICAgICAJCisKKwkvKiBJbml0aWFsaXplIGRyaXZlciBlbnRyeSBwb2ludHMgKi8KKwlkZXYtPm9wZW4gPSBhbWQ4MTExZV9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gYW1kODExMWVfc3RhcnRfeG1pdDsKKwlkZXYtPnN0b3AgPSBhbWQ4MTExZV9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9IGFtZDgxMTFlX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGFtZDgxMTFlX3NldF9tdWx0aWNhc3RfbGlzdDsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGFtZDgxMTFlX3NldF9tYWNfYWRkcmVzczsKKwlkZXYtPmRvX2lvY3RsID0gYW1kODExMWVfaW9jdGw7CisJZGV2LT5jaGFuZ2VfbXR1ID0gYW1kODExMWVfY2hhbmdlX210dTsKKwlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmb3BzKTsKKwlkZXYtPmlycSA9cGRldi0+aXJxOworCWRldi0+dHhfdGltZW91dCA9IGFtZDgxMTFlX3R4X3RpbWVvdXQ7IAorCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBBTUQ4MTExRV9UWF9USU1FT1VUOyAKKyNpZmRlZiBDT05GSUdfQU1EODExMUVfTkFQSQorCWRldi0+cG9sbCA9IGFtZDgxMTFlX3J4X3BvbGw7CisJZGV2LT53ZWlnaHQgPSAzMjsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBhbWQ4MTExZV9wb2xsOyAKKyNlbmRpZgorCisjaWYgQU1EODExMUVfVkxBTl9UQUdfVVNFRAorCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYOworCWRldi0+dmxhbl9yeF9yZWdpc3RlciA9YW1kODExMWVfdmxhbl9yeF9yZWdpc3RlcjsKKwlkZXYtPnZsYW5fcnhfa2lsbF92aWQgPSBhbWQ4MTExZV92bGFuX3J4X2tpbGxfdmlkOworI2VuZGlmCQorCS8qIFByb2JlIHRoZSBleHRlcm5hbCBQSFkgKi8KKwlhbWQ4MTExZV9wcm9iZV9leHRfcGh5KGRldik7CisKKwkvKiBzZXR0aW5nIG1paSBkZWZhdWx0IHZhbHVlcyAqLworCWxwLT5taWlfaWYuZGV2ID0gZGV2OworCWxwLT5taWlfaWYubWRpb19yZWFkID0gYW1kODExMWVfbWRpb19yZWFkOworCWxwLT5taWlfaWYubWRpb193cml0ZSA9IGFtZDgxMTFlX21kaW9fd3JpdGU7CisJbHAtPm1paV9pZi5waHlfaWQgPSBscC0+ZXh0X3BoeV9hZGRyOworCisJLyogU2V0IHJlY2VpdmUgYnVmZmVyIGxlbmd0aCBhbmQgc2V0IGp1bWJvIG9wdGlvbiovCisJYW1kODExMWVfc2V0X3J4X2J1ZmZfbGVuKGRldik7CisKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbWQ4MTExZTogQ2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UsICIKKwkJICAgICAgICJleGl0aW5nLlxuIik7CisJCWdvdG8gZXJyX2lvdW5tYXA7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJCisJLyogSW5pdGlhbGl6ZSBzb2Z0d2FyZSBpcGcgdGltZXIgKi8KKwlpZihscC0+b3B0aW9ucyAmIE9QVElPTl9EWU5fSVBHX0VOQUJMRSl7CSAgICAgICAgCisJCWluaXRfdGltZXIoJmxwLT5pcGdfZGF0YS5pcGdfdGltZXIpOworCQlscC0+aXBnX2RhdGEuaXBnX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworCQlscC0+aXBnX2RhdGEuaXBnX3RpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKikmYW1kODExMWVfY29uZmlnX2lwZzsKKwkJbHAtPmlwZ19kYXRhLmlwZ190aW1lci5leHBpcmVzID0gamlmZmllcyArIAorCQkJCQkJIElQR19DT05WRVJHRV9KSUZGSUVTOworCQlscC0+aXBnX2RhdGEuaXBnID0gREVGQVVMVF9JUEc7CisJCWxwLT5pcGdfZGF0YS5pcGdfc3RhdGUgPSBDU1RBVEU7CisJfTsKKworCS8qICBkaXNwbGF5IGRyaXZlciBhbmQgZGV2aWNlIGluZm9ybWF0aW9uICovCisKKyAgICAJY2hpcF92ZXJzaW9uID0gKHJlYWRsKGxwLT5tbWlvICsgQ0hJUElEKSAmIDB4ZjAwMDAwMDApPj4yODsKKyAgICAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFNRC04MTExZSBEcml2ZXIgVmVyc2lvbjogJXNcbiIsCQkJCQkJCQkgZGV2LT5uYW1lLE1PRFVMRV9WRVJTKTsKKyAgICAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFsgUmV2ICV4IF0gUENJIDEwLzEwMEJhc2VUIEV0aGVybmV0ICIsCQkJCQkJCWRldi0+bmFtZSwgY2hpcF92ZXJzaW9uKTsKKyAgICAJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlMi4yeCVjIixkZXYtPmRldl9hZGRyW2ldLGkgPT0gNSA/ICcgJyA6ICc6Jyk7CisgICAgCXByaW50ayggIlxuIik7CQorCWlmIChscC0+ZXh0X3BoeV9pZCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZvdW5kIE1JSSBQSFkgSUQgMHglMDh4IGF0IGFkZHJlc3MgMHglMDJ4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBscC0+ZXh0X3BoeV9pZCwgbHAtPmV4dF9waHlfYWRkcik7CisJZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICIlczogQ291bGRuJ3QgZGV0ZWN0IE1JSSBQSFksIGFzc3VtaW5nIGFkZHJlc3MgMHgwMVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisgICAgCXJldHVybiAwOworZXJyX2lvdW5tYXA6CisJaW91bm1hcChscC0+bW1pbyk7CisKK2Vycl9mcmVlX2RldjoKKwlmcmVlX25ldGRldihkZXYpOworCitlcnJfZnJlZV9yZWc6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworZXJyX2Rpc2FibGVfcGRldjoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXJldHVybiBlcnI7CisKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFtZDgxMTFlX2RyaXZlciA9IHsKKwkubmFtZSAgIAk9IE1PRFVMRV9OQU1FLAorCS5pZF90YWJsZQk9IGFtZDgxMTFlX3BjaV90YmwsCisJLnByb2JlCQk9IGFtZDgxMTFlX3Byb2JlX29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFtZDgxMTFlX3JlbW92ZV9vbmUpLAorCS5zdXNwZW5kCT0gYW1kODExMWVfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGFtZDgxMTFlX3Jlc3VtZQorfTsKKworc3RhdGljIGludCBfX2luaXQgYW1kODExMWVfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmFtZDgxMTFlX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbWQ4MTExZV9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhbWQ4MTExZV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbWQ4MTExZV9pbml0KTsKK21vZHVsZV9leGl0KGFtZDgxMTFlX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYW1kODExMWUuaCBiL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2ZlM2E0MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmgKQEAgLTAsMCArMSw4MjMgQEAKKy8qCisgKiBBZHZhbmNlZCAgTWljcm8gRGV2aWNlcyBJbmMuIEFNRDgxMTFFIExpbnV4IE5ldHdvcmsgRHJpdmVyIAorICogQ29weXJpZ2h0IChDKSAyMDAzIEFkdmFuY2VkIE1pY3JvIERldmljZXMgCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgCisgKiBVU0EKKworTW9kdWxlIE5hbWU6CisKKyAgICBhbWQ4MTExZS5oCisKK0Fic3RyYWN0OgorCQorIAkgQU1EODExMSBiYXNlZCAxMC8xMDAgRXRoZXJuZXQgQ29udHJvbGxlciBkcml2ZXIgZGVmaW5pdGlvbnMuIAorCitFbnZpcm9ubWVudDoKKyAgICAKKwlLZXJuZWwgTW9kZQorCitSZXZpc2lvbiBIaXN0b3J5OgorIAkzLjAuMAorCSAgIEluaXRpYWwgUmV2aXNpb24uCisJMy4wLjEKKyovCisKKyNpZm5kZWYgX0FNRDgxMUVfSAorI2RlZmluZSBfQU1EODExRV9ICisKKy8qIENvbW1hbmQgc3R5bGUgcmVnaXN0ZXIgYWNjZXNzCisKK1JlZ2lzdGVycyBDTUQwLCBDTUQyLCBDTUQzLENNRDcgYW5kIElOVEVOMCB1c2VzIGEgd3JpdGUgYWNjZXNzIHRlY2huaXF1ZSBjYWxsZWQgY29tbWFuZCBzdHlsZSBhY2Nlc3MuIEl0IGFsbG93cyB0aGUgd3JpdGUgdG8gc2VsZWN0ZWQgYml0cyBvZiB0aGlzIHJlZ2lzdGVyIHdpdGhvdXQgYWx0ZXJpbmcgdGhlIGJpdHMgdGhhdCBhcmUgbm90IHNlbGVjdGVkLiBDb21tYW5kIHN0eWxlIHJlZ2lzdGVycyBhcmUgZGl2aWRlZCBpbnRvIDQgYnl0ZXMgdGhhdCBjYW4gYmUgd3JpdHRlbiBpbmRlcGVuZGVudGx5LiBIaWdoZXIgb3JkZXIgYml0IG9mIGVhY2ggYnl0ZSBpcyB0aGUgIHZhbHVlIGJpdCB0aGF0IHNwZWNpZmllcyB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIHdyaXR0ZW4gaW50byB0aGUgc2VsZWN0ZWQgYml0cyBvZiByZWdpc3Rlci4gCisKK2VnLiwgaWYgdGhlIHZhbHVlIDEwMDExMDEwYiBpcyB3cml0dGVuIGludG8gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgb2YgYSBjb21tYW5kIHN0eWxlIHJlZ2lzdGVyLCBiaXRzIDEsMyBhbmQgNCBvZiB0aGUgcmVnaXN0ZXIgd2lsbCBiZSBzZXQgdG8gMSwgYW5kIHRoZSBvdGhlciBiaXRzIHdpbGwgbm90IGJlIGFsdGVyZWQuIElmIHRoZSB2YWx1ZSAwMDAxMTAxMGIgaXMgd3JpdHRlbiBpbnRvIHRoZSBzYW1lIGJ5dGUsIGJpdHMgMSwzIGFuZCA0IHdpbGwgYmUgY2xlYXJlZCB0byAwIGFuZCB0aGUgb3RoZXIgYml0cyB3aWxsIG5vdCBiZSBhbHRlcmVkLgorCisqLworCisvKiAgT2Zmc2V0IGZvciBNZW1vcnkgTWFwcGVkIFJlZ2lzdGVycy4gKi8KKy8qIDMyIGJpdCByZWdpc3RlcnMgKi8KKworI2RlZmluZSAgQVNGX1NUQVQJCTB4MDAJLyogQVNGIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBDSElQSUQJCQkweDA0CS8qIENoaXAgSUQgcmVnc2l0ZXIgKi8KKyNkZWZpbmUJTUlCX0RBVEEJCTB4MTAJLyogTUlCIGRhdGEgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlCX0FERFIJCTB4MTQJLyogTUlCIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1RBVDAJCQkweDMwCS8qIFN0YXR1czAgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSU5UMAkJCTB4MzgJLyogSW50ZXJydXB0MCByZWdpc3RlciAqLworI2RlZmluZSBJTlRFTjAJCQkweDQwCS8qIEludGVycnVwdDAgIGVuYWJsZSByZWdpc3RlciovCisjZGVmaW5lIENNRDAJCQkweDQ4CS8qIENvbW1hbmQwIHJlZ2lzdGVyICovCisjZGVmaW5lIENNRDIJCQkweDUwCS8qIENvbW1hbmQyIHJlZ2lzdGVyICovCisjZGVmaW5lIENNRDMJCQkweDU0CS8qIENvbW1hbmQzIHJlc2l0ZXIgKi8KKyNkZWZpbmUgQ01ENwkJCTB4NjQJLyogQ29tbWFuZDcgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBDVFJMMSAJCQkweDZDCS8qIENvbnRyb2wxIHJlZ2lzdGVyICovCisjZGVmaW5lIENUUkwyIAkJCTB4NzAJLyogQ29udHJvbDIgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBYTVRfUklOR19MSU1JVAkJMHg3QwkvKiBUcmFuc21pdCByaW5nIGxpbWl0IHJlZ2lzdGVyICovCisKKyNkZWZpbmUgQVVUT1BPTEwwCQkweDg4CS8qIEF1dG8tcG9sbDAgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVVUT1BPTEwxCQkweDhBCS8qIEF1dG8tcG9sbDEgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVVUT1BPTEwyCQkweDhDCS8qIEF1dG8tcG9sbDIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVVUT1BPTEwzCQkweDhFCS8qIEF1dG8tcG9sbDMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVVUT1BPTEw0CQkweDkwCS8qIEF1dG8tcG9sbDQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJQVVUT1BPTEw1CQkweDkyCS8qIEF1dG8tcG9sbDUgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBBUF9WQUxVRQkJMHg5OAkvKiBBdXRvLXBvbGwgdmFsdWUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRExZX0lOVF9BCQkweEE4CS8qIEdyb3VwIEEgZGVsYXllZCBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRExZX0lOVF9CCQkweEFDCS8qIEdyb3VwIEIgZGVsYXllZCBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBGTE9XX0NPTlRST0wJCTB4QzgJLyogRmxvdyBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9BQ0NFU1MJCTB4RDAJLyogUEhZIGFjY2VzcyByZWdpc3RlciAqLworCisjZGVmaW5lIFNUVkFMCQkJMHhEOAkvKiBTb2Z0d2FyZSB0aW1lciB2YWx1ZSByZWdpc3RlciAqLworCisjZGVmaW5lIFhNVF9SSU5HX0JBU0VfQUREUjAJMHgxMDAJLyogVHJhbnNtaXQgcmluZzAgYmFzZSBhZGRyIHJlZ2lzdGVyICovCisjZGVmaW5lIFhNVF9SSU5HX0JBU0VfQUREUjEJMHgxMDgJLyogVHJhbnNtaXQgcmluZzEgYmFzZSBhZGRyIHJlZ2lzdGVyICovCisjZGVmaW5lIFhNVF9SSU5HX0JBU0VfQUREUjIJMHgxMTAJLyogVHJhbnNtaXQgcmluZzIgYmFzZSBhZGRyIHJlZ2lzdGVyICovCisjZGVmaW5lIFhNVF9SSU5HX0JBU0VfQUREUjMJMHgxMTgJLyogVHJhbnNtaXQgcmluZzIgYmFzZSBhZGRyIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgUkNWX1JJTkdfQkFTRV9BRERSMAkweDEyMAkvKiBUcmFuc21pdCByaW5nMCBiYXNlIGFkZHIgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBQTUFUMAkJCTB4MTkwCS8qIE9uTm93IHBhdHRlcm4gcmVnaXN0ZXIwICovCisjZGVmaW5lIFBNQVQxCQkJMHgxOTQJLyogT25Ob3cgcGF0dGVybiByZWdpc3RlcjEgKi8KKworLyogMTZiaXQgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgWE1UX1JJTkdfTEVOMAkJMHgxNDAJLyogVHJhbnNtaXQgUmluZzAgbGVuZ3RoIHJlZ2lzdGVyICovCisjZGVmaW5lIFhNVF9SSU5HX0xFTjEJCTB4MTQ0CS8qIFRyYW5zbWl0IFJpbmcxIGxlbmd0aCByZWdpc3RlciAqLworI2RlZmluZSBYTVRfUklOR19MRU4yCQkweDE0OCAJLyogVHJhbnNtaXQgUmluZzIgbGVuZ3RoIHJlZ2lzdGVyICovCisjZGVmaW5lIFhNVF9SSU5HX0xFTjMJCTB4MTRDCS8qIFRyYW5zbWl0IFJpbmczIGxlbmd0aCByZWdpc3RlciAqLworCisjZGVmaW5lIFJDVl9SSU5HX0xFTjAJCTB4MTUwCS8qIFJlY2VpdmUgUmluZzAgbGVuZ3RoIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgU1JBTV9TSVpFCQkweDE3OAkvKiBTUkFNIHNpemUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1JBTV9CT1VOREFSWQkJMHgxN0EJLyogU1JBTSBib3VuZGFyeSByZWdpc3RlciAqLworCisvKiA0OGJpdCByZWdpc3RlciAqLworCisjZGVmaW5lIFBBRFIJCQkweDE2MAkvKiBQaHlzaWNhbCBhZGRyZXNzIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgSUZTMQkJCTB4MThDCS8qIEludGVyLWZyYW1lIHNwYWNpbmcgUGFydDEgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUZTCQkJMHgxOEQJLyogSW50ZXItZnJhbWUgc3BhY2luZyByZWdpc3RlciAqLworI2RlZmluZSBJUEcJCQkweDE4RQkvKiBJbnRlci1mcmFtZSBnYXAgcmVnaXN0ZXIgKi8KKy8qIDY0Yml0IHJlZ2lzdGVyICovCisKKyNkZWZpbmUgTEFEUkYJCQkweDE2OAkvKiBMb2dpY2FsIGFkZHJlc3MgZmlsdGVyIHJlZ2lzdGVyICovCisKKworLyogUmVnaXN0ZXIgQml0IERlZmluaXRpb25zICovCit0eXBlZGVmIGVudW0geworCisJQVNGX0lOSVRfRE9ORQkJPSAoMSA8PCAxKSwKKwlBU0ZfSU5JVF9QUkVTRU5UCT0gKDEgPDwgMCksCisKK31TVEFUX0FTRl9CSVRTOyAKKyAgIAordHlwZWRlZiBlbnVtIHsKKworCU1JQl9DTURfQUNUSVZFCQk9ICgxIDw8IDE1ICksCisJTUlCX1JEX0NNRAkJPSAoMSA8PCAxMyApLAorCU1JQl9DTEVBUgkJPSAoMSA8PCAxMiApLAorCU1JQl9BRERSRVNTCQk9ICgxIDw8IDApIHwgKDEgPDwgMSkgfCAoMSA8PCAyKSB8ICgxIDw8IDMpfAorCQkJCQkoMSA8PCA0KSB8ICgxIDw8IDUpLAorfU1JQl9BRERSX0JJVFM7CisKKwordHlwZWRlZiBlbnVtIHsKKwkKKwlQTUFUX0RFVAkJPSAoMSA8PCAxMiksCisJTVBfREVUCQkgICAgICAgID0gKDEgPDwgMTEpLAorCUxDX0RFVAkJCT0gKDEgPDwgMTApLAorCVNQRUVEX01BU0sJCT0gKDEgPDwgOSl8KDEgPDwgOCl8KDEgPDwgNyksCisJRlVMTF9EUExYCQk9ICgxIDw8IDYpLAorCUxJTktfU1RBVFMJCT0gKDEgPDwgNSksCisJQVVUT05FR19DT01QTEVURQk9ICgxIDw8IDQpLAorCU1JSVBECQkJPSAoMSA8PCAzKSwKKwlSWF9TVVNQRU5ERUQJCT0gKDEgPDwgMiksCisJVFhfU1VTUEVOREVECQk9ICgxIDw8IDEpLAorCVJVTk5JTkcJCQk9ICgxIDw8IDApLAorCit9U1RBVDBfQklUUzsKKworI2RlZmluZSBQSFlfU1BFRURfMTAJCTB4MgorI2RlZmluZSBQSFlfU1BFRURfMTAwCQkweDMKKworLyogSU5UMAkJCQkweDM4LCAzMmJpdCByZWdpc3RlciAqLwordHlwZWRlZiBlbnVtIHsKKworCUlOVFIJCQk9ICgxIDw8IDMxKSwKKwlQQ1NJTlQJCQk9ICgxIDw8IDI4KSwgCisJTENJTlQJCQk9ICgxIDw8IDI3KSwKKwlBUElOVDUJCQk9ICgxIDw8IDI2KSwKKwlBUElOVDQJCQk9ICgxIDw8IDI1KSwKKwlBUElOVDMJCQk9ICgxIDw8IDI0KSwKKwlUSU5UX1NVTQkJPSAoMSA8PCAyMyksCisJQVBJTlQyCQkJPSAoMSA8PCAyMiksCisJQVBJTlQxCQkJPSAoMSA8PCAyMSksCisJQVBJTlQwCQkJPSAoMSA8PCAyMCksCisJTUlJUERUSU5UCQk9ICgxIDw8IDE5KSwKKwlNQ0NJTlQJCQk9ICgxIDw8IDE3KSwKKwlNUkVJTlQJCQk9ICgxIDw8IDE2KSwKKwlSSU5UX1NVTQkJPSAoMSA8PCAxNSksCisJU1BORElOVAkJCT0gKDEgPDwgMTQpLAorCU1QSU5UCQkJPSAoMSA8PCAxMyksCisJU0lOVAkJCT0gKDEgPDwgMTIpLAorCVRJTlQzCQkJPSAoMSA8PCAxMSksCisJVElOVDIJCQk9ICgxIDw8IDEwKSwKKwlUSU5UMQkJCT0gKDEgPDwgOSksCisJVElOVDAJCQk9ICgxIDw8IDgpLAorCVVJTlQJCQk9ICgxIDw8IDcpLAorCVNUSU5UCQkJPSAoMSA8PCA0KSwKKwlSSU5UMAkJCT0gKDEgPDwgMCksCisKK31JTlQwX0JJVFM7CisKK3R5cGVkZWYgZW51bSB7CisKKwlWQUwzCQkJPSAoMSA8PCAzMSksICAgLyogVkFMIGJpdCBmb3IgYnl0ZSAzICovCisJVkFMMgkJCT0gKDEgPDwgMjMpLCAgIC8qIFZBTCBiaXQgZm9yIGJ5dGUgMiAqLworCVZBTDEJCQk9ICgxIDw8IDE1KSwgICAvKiBWQUwgYml0IGZvciBieXRlIDEgKi8KKwlWQUwwCQkJPSAoMSA8PCA3KSwgICAgLyogVkFMIGJpdCBmb3IgYnl0ZSAwICovCisKK31WQUxfQklUUzsKKwordHlwZWRlZiBlbnVtIHsKKworCS8qIFZBTDMgKi8KKwlMQ0lOVEVOCQkJPSAoMSA8PCAyNyksCisJQVBJTlQ1RU4JCT0gKDEgPDwgMjYpLAorCUFQSU5UNEVOCQk9ICgxIDw8IDI1KSwKKwlBUElOVDNFTgkJPSAoMSA8PCAyNCksCisJLyogVkFMMiAqLworCUFQSU5UMkVOCQk9ICgxIDw8IDIyKSwKKwlBUElOVDFFTgkJPSAoMSA8PCAyMSksCisJQVBJTlQwRU4JCT0gKDEgPDwgMjApLAorCU1JSVBEVElOVEVOCQk9ICgxIDw8IDE5KSwKKwlNQ0NJSU5URU4JCT0gKDEgPDwgMTgpLAorCU1DQ0lOVEVOCQk9ICgxIDw8IDE3KSwKKwlNUkVJTlRFTgkJPSAoMSA8PCAxNiksCisJLyogVkFMMSAqLworCVNQTkRJTlRFTgkJPSAoMSA8PCAxNCksCisJTVBJTlRFTgkJCT0gKDEgPDwgMTMpLAorCVRJTlRFTjMJCQk9ICgxIDw8IDExKSwKKwlTSU5URU4JCQk9ICgxIDw8IDEyKSwKKwlUSU5URU4yCQkJPSAoMSA8PCAxMCksCisJVElOVEVOMQkJCT0gKDEgPDwgOSksCisJVElOVEVOMAkJCT0gKDEgPDwgOCksCisJLyogVkFMMCAqLworCVNUSU5URU4JCQk9ICgxIDw8IDQpLAorCVJJTlRFTjAJCQk9ICgxIDw8IDApLAorCisJSU5URU4wX0NMRUFSIAkJPSAweDFGN0Y3RjFGLCAvKiBDb21tYW5kIHN0eWxlIHJlZ2lzdGVyICovCisKK31JTlRFTjBfQklUUzsJCQorCit0eXBlZGVmIGVudW0geworCS8qIFZBTDIgKi8KKwlSRE1EMAkJCT0gKDEgPDwgMTYpLAorCS8qIFZBTDEgKi8KKwlURE1EMwkJCT0gKDEgPDwgMTEpLAorCVRETUQyCQkJPSAoMSA8PCAxMCksCisJVERNRDEJCQk9ICgxIDw8IDkpLAorCVRETUQwCQkJPSAoMSA8PCA4KSwKKwkvKiBWQUwwICovCisJVUlOVENNRAkJCT0gKDEgPDwgNiksCisJUlhfRkFTVF9TUE5ECQk9ICgxIDw8IDUpLAorCVRYX0ZBU1RfU1BORAkJPSAoMSA8PCA0KSwKKwlSWF9TUE5ECQkJPSAoMSA8PCAzKSwKKwlUWF9TUE5ECQkJPSAoMSA8PCAyKSwKKwlJTlRSRU4JCQk9ICgxIDw8IDEpLAorCVJVTgkJCT0gKDEgPDwgMCksCisKKwlDTUQwX0NMRUFSIAkJPSAweDAwMEYwRjdGLCAgIC8qIENvbW1hbmQgc3R5bGUgcmVnaXN0ZXIgKi8JCisKK31DTUQwX0JJVFM7CisKK3R5cGVkZWYgZW51bSB7CisKKwkvKiBWQUwzICovCisJQ09ORFVJVF9NT0RFCQk9ICgxIDw8IDI5KSwKKwkvKiBWQUwyICovCisJUlBBCQkJPSAoMSA8PCAxOSksCisJRFJDVlBBCQkJPSAoMSA8PCAxOCksCisJRFJDVkJDCQkJPSAoMSA8PCAxNyksCisJUFJPTQkJCT0gKDEgPDwgMTYpLAorCS8qIFZBTDEgKi8KKwlBU1RSUF9SQ1YJCT0gKDEgPDwgMTMpLAorCVJDVl9EUk9QMAkgIAk9ICgxIDw8IDEyKSwKKwlFTUJBCQkJPSAoMSA8PCAxMSksCisJRFhNVDJQRAkJCT0gKDEgPDwgMTApLAorCUxUSU5URU4JCQk9ICgxIDw8IDkpLAorCURYTVRGQ1MJCQk9ICgxIDw8IDgpLAorCS8qIFZBTDAgKi8KKwlBUEFEX1hNVAkJPSAoMSA8PCA2KSwKKwlEUlRZCQkJPSAoMSA8PCA1KSwKKwlJTkxPT1AJCQk9ICgxIDw8IDQpLAorCUVYTE9PUAkJCT0gKDEgPDwgMyksCisJUkVYX1JUUlkJCT0gKDEgPDwgMiksCisJUkVYX1VGTE8JCT0gKDEgPDwgMSksCisJUkVYX0xDT0wJCT0gKDEgPDwgMCksCisKKwlDTUQyX0NMRUFSIAkJPSAweDNGN0YzRjdGLCAgIC8qIENvbW1hbmQgc3R5bGUgcmVnaXN0ZXIgKi8KKworfUNNRDJfQklUUzsKKwordHlwZWRlZiBlbnVtIHsKKworCS8qIFZBTDMgKi8KKwlBU0ZfSU5JVF9ET05FX0FMSUFTCT0gKDEgPDwgMjkpLAorCS8qIFZBTDIgKi8KKwlKVU1CTwkJCT0gKDEgPDwgMjEpLAorCVZTSVpFCQkJPSAoMSA8PCAyMCksCQorCVZMT05MWQkJCT0gKDEgPDwgMTkpLAorCVZMX1RBR19ERUwJCT0gKDEgPDwgMTgpLAkKKwkvKiBWQUwxICovCisJRU5fUE1HUgkJCT0gKDEgPDwgMTQpLAkJCQorCUlOVExFVkVMCQk9ICgxIDw8IDEzKSwKKwlGT1JDRV9GVUxMX0RVUExFWAk9ICgxIDw8IDEyKSwJCisJRk9SQ0VfTElOS19TVEFUVVMJPSAoMSA8PCAxMSksCQorCUFQRVAJCQk9ICgxIDw8IDEwKSwJCisJTVBQTEJBCQkJPSAoMSA8PCA5KSwJCisJLyogVkFMMCAqLworCVJFU0VUX1BIWV9QVUxTRQkJPSAoMSA8PCAyKSwJCisJUkVTRVRfUEhZCQk9ICgxIDw8IDEpLAkKKwlQSFlfUlNUX1BPTAkJPSAoMSA8PCAwKSwJCisKK31DTUQzX0JJVFM7CisKKwordHlwZWRlZiBlbnVtIHsKKworCS8qIFZBTDAgKi8KKwlQTUFUX1NBVkVfTUFUQ0gJCT0gKDEgPDwgNCksCisJUE1BVF9NT0RFCQk9ICgxIDw8IDMpLAorCU1QRU5fU1cJCQk9ICgxIDw8IDEpLAorCUxDTU9ERV9TVwkJPSAoMSA8PCAwKSwKKworCUNNRDdfQ0xFQVIgIAkJPSAweDAwMDAwMDFCCS8qIENvbW1hbmQgc3R5bGUgcmVnaXN0ZXIgKi8KKworfUNNRDdfQklUUzsKKworCit0eXBlZGVmIGVudW0geworCisJUkVTRVRfUEhZX1dJRFRICQk9ICgweEYgPDwgMTYpIHwgKDB4Rjw8IDIwKSwgLyogMHgwMEZGMDAwMCAqLworCVhNVFNQX01BU0sJCT0gKDEgPDwgOSkgfCAoMSA8PCA4KSwJLyogOTo4ICovCisJWE1UU1BfMTI4CQk9ICgxIDw8IDkpLAkvKiA5ICovCQorCVhNVFNQXzY0CQk9ICgxIDw8IDgpLAorCUNBQ0hFX0FMSUdOCQk9ICgxIDw8IDQpLAorCUJVUlNUX0xJTUlUX01BU0sJPSAoMHhGIDw8IDAgKSwKKwlDVFJMMV9ERUZBVUxUCQk9IDB4MDAwMTAxMTEsCisKK31DVFJMMV9CSVRTOworCit0eXBlZGVmIGVudW0geworCisJRk1EQ19NQVNLCQk9ICgxIDw8IDkpfCgxIDw8IDgpLAkvKiA5OjggKi8KKwlYUEhZUlNUCQkJPSAoMSA8PCA3KSwKKwlYUEhZQU5FCQkJPSAoMSA8PCA2KSwKKwlYUEhZRkQJCQk9ICgxIDw8IDUpLAorCVhQSFlTUAkJCT0gKDEgPDwgNCkgfCAoMSA8PCAzKSwJLyogNDozICovCisJQVBEV19NQVNLCQk9ICgxIDw8CTIpIHwgKDEgPDwgMSkgfCAoMSA8PCAwKSwgLyogMjowICovCisKK31DVFJMMl9CSVRTOworCisvKiBYTVRfUklOR19MSU1JVAkJMHg3QywgMzJiaXQgcmVnaXN0ZXIgKi8KK3R5cGVkZWYgZW51bSB7CisKKwlYTVRfUklORzJfTElNSVQJCT0gKDB4RkYgPDwgMTYpLAkvKiAyMzoxNiAqLworCVhNVF9SSU5HMV9MSU1JVAkJPSAoMHhGRiA8PCA4KSwJLyogMTU6OCAqLworCVhNVF9SSU5HMF9MSU1JVAkJPSAoMHhGRiA8PCAwKSwgCS8qIDc6MCAqLworCit9WE1UX1JJTkdfTElNSVRfQklUUzsKKwordHlwZWRlZiBlbnVtIHsKKworCUFQX1JFRzBfRU4JCT0gKDEgPDwgMTUpLAorCUFQX1JFRzBfQUREUl9NQVNLCT0gKDB4RiA8PCA4KSB8KDEgPDwgMTIpLC8qIDEyOjggKi8KKwlBUF9QSFkwX0FERFJfTUFTSwk9ICgweEYgPDwgMCkgfCgxIDw8IDQpLC8qIDQ6MCAqLworCit9QVVUT1BPTEwwX0JJVFM7CisKKy8qIEFVVE9QT0xMMQkJCTB4OEEsIDE2Yml0IHJlZ2lzdGVyICovCit0eXBlZGVmIGVudW0geworCisJQVBfUkVHMV9FTgkJPSAoMSA8PCAxNSksCisJQVBfUkVHMV9BRERSX01BU0sJPSAoMHhGIDw8IDgpIHwoMSA8PCAxMiksLyogMTI6OCAqLworCUFQX1BSRV9TVVAxCQk9ICgxIDw8IDYpLAorCUFQX1BIWTFfREZMVAkJPSAoMSA8PCA1KSwKKwlBUF9QSFkxX0FERFJfTUFTSwk9ICgweEYgPDwgMCkgfCgxIDw8IDQpLC8qIDQ6MCAqLworCit9QVVUT1BPTEwxX0JJVFM7CisKKwordHlwZWRlZiBlbnVtIHsKKworCUFQX1JFRzJfRU4JCT0gKDEgPDwgMTUpLAorCUFQX1JFRzJfQUREUl9NQVNLCT0gKDB4RiA8PCA4KSB8KDEgPDwgMTIpLC8qIDEyOjggKi8KKwlBUF9QUkVfU1VQMgkJPSAoMSA8PCA2KSwKKwlBUF9QSFkyX0RGTFQJCT0gKDEgPDwgNSksCisJQVBfUEhZMl9BRERSX01BU0sJPSAoMHhGIDw8IDApIHwoMSA8PCA0KSwvKiA0OjAgKi8KKworfUFVVE9QT0xMMl9CSVRTOworCit0eXBlZGVmIGVudW0geworCisJQVBfUkVHM19FTgkJPSAoMSA8PCAxNSksCisJQVBfUkVHM19BRERSX01BU0sJPSAoMHhGIDw8IDgpIHwoMSA8PCAxMiksLyogMTI6OCAqLworCUFQX1BSRV9TVVAzCQk9ICgxIDw8IDYpLAorCUFQX1BIWTNfREZMVAkJPSAoMSA8PCA1KSwKKwlBUF9QSFkzX0FERFJfTUFTSwk9ICgweEYgPDwgMCkgfCgxIDw8IDQpLC8qIDQ6MCAqLworCit9QVVUT1BPTEwzX0JJVFM7CisKKwordHlwZWRlZiBlbnVtIHsKKworCUFQX1JFRzRfRU4JCT0gKDEgPDwgMTUpLAorCUFQX1JFRzRfQUREUl9NQVNLCT0gKDB4RiA8PCA4KSB8KDEgPDwgMTIpLC8qIDEyOjggKi8KKwlBUF9QUkVfU1VQNAkJPSAoMSA8PCA2KSwKKwlBUF9QSFk0X0RGTFQJCT0gKDEgPDwgNSksCisJQVBfUEhZNF9BRERSX01BU0sJPSAoMHhGIDw8IDApIHwoMSA8PCA0KSwvKiA0OjAgKi8KKworfUFVVE9QT0xMNF9CSVRTOworCisKK3R5cGVkZWYgZW51bSB7CisKKwlBUF9SRUc1X0VOCQk9ICgxIDw8IDE1KSwKKwlBUF9SRUc1X0FERFJfTUFTSwk9ICgweEYgPDwgOCkgfCgxIDw8IDEyKSwvKiAxMjo4ICovCisJQVBfUFJFX1NVUDUJCT0gKDEgPDwgNiksCisJQVBfUEhZNV9ERkxUCQk9ICgxIDw8IDUpLAorCUFQX1BIWTVfQUREUl9NQVNLCT0gKDB4RiA8PCAwKSB8KDEgPDwgNCksLyogNDowICovCisKK31BVVRPUE9MTDVfQklUUzsKKworCisKKworLyogQVBfVkFMVUUgCQkJMHg5OCwgMzJiaXQgcmFnaXN0ZXIgKi8KK3R5cGVkZWYgZW51bSB7CisKKwlBUF9WQUxfQUNUSVZFCQk9ICgxIDw8IDMxKSwKKwlBUF9WQUxfUkRfQ01ECQk9ICggMSA8PCAyOSksCisJQVBfQUREUgkJCT0gKDEgPDwgMTgpfCgxIDw8IDE3KXwoMSA8PCAxNiksIC8qIDE4OjE2ICovCisJQVBfVkFMCQkJPSAoMHhGIDw8IDApIHwgKDB4RiA8PCA0KSB8KCAweEYgPDwgOCkgfAorCQkJCSAgKDB4RiA8PCAxMiksCS8qIDE1OjAgKi8KKworfUFQX1ZBTFVFX0JJVFM7CisKK3R5cGVkZWYgZW51bSB7CisKKwlETFlfSU5UX0FfUjMJCT0gKDEgPDwgMzEpLAorCURMWV9JTlRfQV9SMgkJPSAoMSA8PCAzMCksCisJRExZX0lOVF9BX1IxCQk9ICgxIDw8IDI5KSwKKwlETFlfSU5UX0FfUjAJCT0gKDEgPDwgMjgpLAorCURMWV9JTlRfQV9UMwkJPSAoMSA8PCAyNyksCisJRExZX0lOVF9BX1QyCQk9ICgxIDw8IDI2KSwKKwlETFlfSU5UX0FfVDEJCT0gKDEgPDwgMjUpLAorCURMWV9JTlRfQV9UMAkJPSAoIDEgPDwgMjQpLAorCUVWRU5UX0NPVU5UX0EJCT0gKDB4RiA8PCAxNikgfCAoMHgxIDw8IDIwKSwvKiAyMDoxNiAqLworCU1BWF9ERUxBWV9USU1FX0EJPSAoMHhGIDw8IDApIHwgKDB4RiA8PCA0KSB8ICgxIDw8IDgpfAorCQkJCSAgKDEgPDwgOSkgfCAoMSA8PCAxMCksCS8qIDEwOjAgKi8KKworfURMWV9JTlRfQV9CSVRTOworCit0eXBlZGVmIGVudW0geworCisJRExZX0lOVF9CX1IzCQk9ICgxIDw8IDMxKSwKKwlETFlfSU5UX0JfUjIJCT0gKDEgPDwgMzApLAorCURMWV9JTlRfQl9SMQkJPSAoMSA8PCAyOSksCisJRExZX0lOVF9CX1IwCQk9ICgxIDw8IDI4KSwKKwlETFlfSU5UX0JfVDMJCT0gKDEgPDwgMjcpLAorCURMWV9JTlRfQl9UMgkJPSAoMSA8PCAyNiksCisJRExZX0lOVF9CX1QxCQk9ICgxIDw8IDI1KSwKKwlETFlfSU5UX0JfVDAJCT0gKCAxIDw8IDI0KSwKKwlFVkVOVF9DT1VOVF9CCQk9ICgweEYgPDwgMTYpIHwgKDB4MSA8PCAyMCksLyogMjA6MTYgKi8KKwlNQVhfREVMQVlfVElNRV9CCT0gKDB4RiA8PCAwKSB8ICgweEYgPDwgNCkgfCAoMSA8PCA4KXwgCisJCQkJICAoMSA8PCA5KSB8ICgxIDw8IDEwKSwJLyogMTA6MCAqLworfURMWV9JTlRfQl9CSVRTOworCisKKy8qIEZMT1dfQ09OVFJPTCAJCTB4QzgsIDMyYml0IHJlZ2lzdGVyICovCit0eXBlZGVmIGVudW0geworCisJUEFVU0VfTEVOX0NIRwkJPSAoMSA8PCAzMCksCisJRlRQRQkJCT0gKDEgPDwgMjIpLAorCUZSUEUJCQk9ICgxIDw8IDIxKSwKKwlOQVBBCQkJPSAoMSA8PCAyMCksCisJTlBBCQkJPSAoMSA8PCAxOSksCisJRklYUAkJCT0gKCAxIDw8IDE4KSwKKwlGQ0NNRAkJCT0gKCAxIDw8IDE2KSwKKwlQQVVTRV9MRU4JCT0gKDB4RiA8PCAwKSB8ICgweEYgPDwgNCkgfCggMHhGIDw8IDgpIHwJIAkJCQkgICgweEYgPDwgMTIpLAkvKiAxNTowICovCisKK31GTE9XX0NPTlRST0xfQklUUzsKKworLyogUEhZXyBBQ0NFU1MJCQkweEQwLCAzMmJpdCByZWdpc3RlciAqLwordHlwZWRlZiBlbnVtIHsKKworCVBIWV9DTURfQUNUSVZFCQk9ICgxIDw8IDMxKSwKKwlQSFlfV1JfQ01ECQk9ICgxIDw8IDMwKSwKKwlQSFlfUkRfQ01ECQk9ICgxIDw8IDI5KSwKKwlQSFlfUkRfRVJSCQk9ICgxIDw8IDI4KSwKKwlQSFlfUFJFX1NVUAkJPSAoMSA8PCAyNyksCisJUEhZX0FERFIJCT0gKDEgPDwgMjEpIHwgKDEgPDwgMjIpIHwgKDEgPDwgMjMpfAorCQkJCSAgCSgxIDw8IDI0KSB8KDEgPDwgMjUpLC8qIDI1OjIxICovCisJUEhZX1JFR19BRERSCQk9ICgxIDw8IDE2KSB8ICgxIDw8IDE3KSB8ICgxIDw8IDE4KXwJIAkJCSAgCSAgIAkgIAkoMSA8PCAxOSkgfCAoMSA8PCAyMCksLyogMjA6MTYgKi8KKwlQSFlfREFUQQkJPSAoMHhGIDw8IDApfCgweEYgPDwgNCkgfCgweEYgPDwgOCl8CisJCQkJCSgweEYgPDwgMTIpLC8qIDE1OjAgKi8KKworfVBIWV9BQ0NFU1NfQklUUzsKKworCisvKiBQTUFUMAkJCTB4MTkwLAkgMzJiaXQgcmVnaXN0ZXIgKi8KK3R5cGVkZWYgZW51bSB7CisJUE1SX0FDVElWRQkJPSAoMSA8PCAzMSksCisJUE1SX1dSX0NNRAkJPSAoMSA8PCAzMCksCisJUE1SX1JEX0NNRAkJPSAoMSA8PCAyOSksCisJUE1SX0JBTksJCT0gKDEgPDwyOCksCisJUE1SX0FERFIJCT0gKDB4RiA8PCAxNil8KDEgPDwgMjApfCgxIDw8IDIxKXwKKwkJCQkgIAkoMSA8PCAyMiksLyogMjI6MTYgKi8KKwlQTVJfQjQJCQk9ICgweEYgPDwgMCkgfCAoMHhGIDw8IDQpLC8qIDE1OjAgKi8KK31QTUFUMF9CSVRTOworCisKKy8qIFBNQVQxCQkJMHgxOTQsCSAzMmJpdCByZWdpc3RlciAqLwordHlwZWRlZiBlbnVtIHsKKwlQTVJfQjMJCQk9ICgweEYgPDwgMjQpIHwgKDB4RiA8PDI4KSwvKiAzMToyNCAqLworCVBNUl9CMgkJCT0gKDB4RiA8PCAxNikgfCgweEYgPDwgMjApLC8qIDIzOjE2ICovCisJUE1SX0IxCQkJPSAoMHhGIDw8IDgpIHwgKDB4RiA8PDEyKSwgLyogMTU6OCAqLworCVBNUl9CMAkJCT0gKDB4RiA8PCAwKXwoMHhGIDw8IDQpLC8qIDc6MCAqLworfVBNQVQxX0JJVFM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgTUlCIGNvdW50ZXIgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIHJjdl9taXNzX3BrdHMJCQkJMHgwMAorI2RlZmluZSByY3Zfb2N0ZXRzCQkJCTB4MDEKKyNkZWZpbmUgcmN2X2Jyb2FkY2FzdF9wa3RzCQkJMHgwMgorI2RlZmluZSByY3ZfbXVsdGljYXN0X3BrdHMJCQkweDAzCisjZGVmaW5lIHJjdl91bmRlcnNpemVfcGt0cwkJCTB4MDQKKyNkZWZpbmUgcmN2X292ZXJzaXplX3BrdHMJCQkweDA1CisjZGVmaW5lIHJjdl9mcmFnbWVudHMJCQkJMHgwNgorI2RlZmluZSByY3ZfamFiYmVycwkJCQkweDA3CisjZGVmaW5lIHJjdl91bmljYXN0X3BrdHMJCQkweDA4CisjZGVmaW5lIHJjdl9hbGlnbm1lbnRfZXJyb3JzCQkJMHgwOQorI2RlZmluZSByY3ZfZmNzX2Vycm9ycwkJCQkweDBBCisjZGVmaW5lIHJjdl9nb29kX29jdGV0cwkJCQkweDBCCisjZGVmaW5lIHJjdl9tYWNfY3RybAkJCQkweDBDCisjZGVmaW5lIHJjdl9mbG93X2N0cmwJCQkJMHgwRAorI2RlZmluZSByY3ZfcGt0c182NF9vY3RldHMJCQkweDBFCisjZGVmaW5lIHJjdl9wa3RzXzY1dG8xMjdfb2N0ZXRzCQkJMHgwRgorI2RlZmluZSByY3ZfcGt0c18xMjh0bzI1NV9vY3RldHMJCTB4MTAKKyNkZWZpbmUgcmN2X3BrdHNfMjU2dG81MTFfb2N0ZXRzCQkweDExCisjZGVmaW5lIHJjdl9wa3RzXzUxMnRvMTAyM19vY3RldHMJCTB4MTIKKyNkZWZpbmUgcmN2X3BrdHNfMTAyNHRvMTUxOF9vY3RldHMJCTB4MTMKKyNkZWZpbmUgcmN2X3Vuc3VwcG9ydGVkX29wY29kZQkJCTB4MTQKKyNkZWZpbmUgcmN2X3N5bWJvbF9lcnJvcnMJCQkweDE1CisjZGVmaW5lIHJjdl9kcm9wX3BrdHNfcmluZzEJCQkweDE2CisjZGVmaW5lIHJjdl9kcm9wX3BrdHNfcmluZzIJCQkweDE3CisjZGVmaW5lIHJjdl9kcm9wX3BrdHNfcmluZzMJCQkweDE4CisjZGVmaW5lIHJjdl9kcm9wX3BrdHNfcmluZzQJCQkweDE5CisjZGVmaW5lIHJjdl9qdW1ib19wa3RzCQkJCTB4MUEKKworI2RlZmluZSB4bXRfdW5kZXJydW5fcGt0cwkJCTB4MjAKKyNkZWZpbmUgeG10X29jdGV0cwkJCQkweDIxCisjZGVmaW5lIHhtdF9wYWNrZXRzCQkJCTB4MjIKKyNkZWZpbmUgeG10X2Jyb2FkY2FzdF9wa3RzCQkJMHgyMworI2RlZmluZSB4bXRfbXVsdGljYXN0X3BrdHMJCQkweDI0CisjZGVmaW5lIHhtdF9jb2xsaXNpb25zCQkJCTB4MjUKKyNkZWZpbmUgeG10X3VuaWNhc3RfcGt0cwkJCTB4MjYKKyNkZWZpbmUgeG10X29uZV9jb2xsaXNpb24JCQkweDI3CisjZGVmaW5lIHhtdF9tdWx0aXBsZV9jb2xsaXNpb24JCQkweDI4CisjZGVmaW5lIHhtdF9kZWZlcnJlZF90cmFuc21pdAkJCTB4MjkKKyNkZWZpbmUgeG10X2xhdGVfY29sbGlzaW9uCQkJMHgyQQorI2RlZmluZSB4bXRfZXhjZXNzaXZlX2RlZmVyCQkJMHgyQgorI2RlZmluZSB4bXRfbG9zc19jYXJyaWVyCQkJMHgyQworI2RlZmluZSB4bXRfZXhjZXNzaXZlX2NvbGxpc2lvbgkJCTB4MkQKKyNkZWZpbmUgeG10X2JhY2tfcHJlc3N1cmUJCQkweDJFCisjZGVmaW5lIHhtdF9mbG93X2N0cmwJCQkJMHgyRgorI2RlZmluZSB4bXRfcGt0c182NF9vY3RldHMJCQkweDMwCisjZGVmaW5lIHhtdF9wa3RzXzY1dG8xMjdfb2N0ZXRzCQkJMHgzMQorI2RlZmluZSB4bXRfcGt0c18xMjh0bzI1NV9vY3RldHMJCTB4MzIKKyNkZWZpbmUgeG10X3BrdHNfMjU2dG81MTFfb2N0ZXRzCQkweDMzCisjZGVmaW5lIHhtdF9wa3RzXzUxMnRvMTAyM19vY3RldHMJCTB4MzQKKyNkZWZpbmUgeG10X3BrdHNfMTAyNHRvMTUxOF9vY3RldAkJMHgzNQorI2RlZmluZSB4bXRfb3ZlcnNpemVfcGt0cwkJCTB4MzYKKyNkZWZpbmUgeG10X2p1bWJvX3BrdHMJCQkJMHgzNworCisKKy8qIERyaXZlciBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lCSBQQ0lfVkVORE9SX0lEX0FNRAkJMHgxMDIyCisjZGVmaW5lICBQQ0lfREVWSUNFX0lEX0FNRDgxMTFFXzc0NjIJMHg3NDYyCisKKyNkZWZpbmUgTUFYX1VOSVRTCQkJOCAvKiBNYXhpbXVtIG51bWJlciBvZiBkZXZpY2VzIHBvc3NpYmxlICovCisKKyNkZWZpbmUgTlVNX1RYX0JVRkZFUlMJCQkzMiAvKiBOdW1iZXIgb2YgdHJhbnNtaXQgYnVmZmVycyAqLworI2RlZmluZSBOVU1fUlhfQlVGRkVSUwkJCTMyIC8qIE51bWJlciBvZiByZWNlaXZlIGJ1ZmZlcnMgKi8JCisKKyNkZWZpbmUgVFhfQlVGRl9NT0RfTUFTSyAgICAgICAgIAkzMSAvKiAoTlVNX1RYX0JVRkZFUlMgLTEpICovCisjZGVmaW5lIFJYX0JVRkZfTU9EX01BU0sgICAgICAgICAJMzEgLyogKE5VTV9SWF9CVUZGRVJTIC0xKSAqLworCisjZGVmaW5lIE5VTV9UWF9SSU5HX0RSCQkJMzIgIAorI2RlZmluZSBOVU1fUlhfUklOR19EUgkJCTMyIAorCisjZGVmaW5lIFRYX1JJTkdfRFJfTU9EX01BU0sgICAgICAgICAJMzEgLyogKE5VTV9UWF9SSU5HX0RSIC0xKSAqLworI2RlZmluZSBSWF9SSU5HX0RSX01PRF9NQVNLICAgICAgICAgCTMxIC8qIChOVU1fUlhfUklOR19EUiAtMSkgKi8KKworI2RlZmluZSBNQVhfRklMVEVSX1NJWkUJCQk2NCAvKiBNYXhpbXVtIG11bHRpY2FzdCBhZGRyZXNzICovIAorI2RlZmluZSBBTUQ4MTExRV9NSU5fTVRVCSAJNjAgCQorI2RlZmluZSBBTUQ4MTExRV9NQVhfTVRVCQk5MDAwCQkJCisKKyNkZWZpbmUgUEtUX0JVRkZfU1oJCQkxNTM2CisjZGVmaW5lIE1JTl9QS1RfTEVOCQkJNjAKKyNkZWZpbmUgRVRIX0FERFJfTEVOCQkJNgorCisjZGVmaW5lICBBTUQ4MTExRV9UWF9USU1FT1VUCQkoMyAqIEhaKS8qIDMgc2VjICovCisjZGVmaW5lIFNPRlRfVElNRVJfRlJFUSAJCTB4QkVCQyAgLyogMC41IHNlYyAqLworI2RlZmluZSBERUxBWV9USU1FUl9DT05WCQk1MCAgICAvKiBtc2VjIHRvIDEwIHVzZWMgY29udmVyc2lvbi4KKwkJCQkJCSBPbmx5IDUwMCB1c2VjIHJlc29sdXRpb24gKi8gCQkJCQkJIAorI2RlZmluZSBPUFRJT05fVkxBTl9FTkFCTEUJCTB4MDAwMQorI2RlZmluZSBPUFRJT05fSlVNQk9fRU5BQkxFCQkweDAwMDIKKyNkZWZpbmUgT1BUSU9OX01VTFRJQ0FTVF9FTkFCTEUJCTB4MDAwNAorI2RlZmluZSBPUFRJT05fV09MX0VOQUJMRQkJMHgwMDA4CisjZGVmaW5lIE9QVElPTl9XQUtFX01BR0lDX0VOQUJMRQkweDAwMTAKKyNkZWZpbmUgT1BUSU9OX1dBS0VfUEhZX0VOQUJMRQkJMHgwMDIwCisjZGVmaW5lIE9QVElPTl9JTlRSX0NPQUxfRU5BQkxFCQkweDAwNDAKKyNkZWZpbmUgT1BUSU9OX0RZTl9JUEdfRU5BQkxFCSAgICAgICAgMHgwMDgwCisKKyNkZWZpbmUgUEhZX1JFR19BRERSX01BU0sJCTB4MWYKKworLyogaXBnIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgREVGQVVMVF9JUEcJCQkweDYwCisjZGVmaW5lIElGUzFfREVMVEEJCQkzNgorI2RlZmluZQlJUEdfQ09OVkVSR0VfSklGRklFUyAoSFovMikKKyNkZWZpbmUJSVBHX1NUQUJMRV9USU1FCTUKKyNkZWZpbmUJTUlOX0lQRwk5NgorI2RlZmluZQlNQVhfSVBHCTI1NQorI2RlZmluZSBJUEdfU1RFUAkxNgorI2RlZmluZSBDU1RBVEUgIDEgCisjZGVmaW5lIFNTVEFURSAgMiAKKworLyogQXNzdW1lIGNvbnRvbGxlciBnZXRzIGRhdGEgMTAgdGltZXMgdGhlIG1heGltdW0gcHJvY2Vzc2luZyB0aW1lICovCisjZGVmaW5lICBSRVBFQVRfQ05UCQkJMTA7IAorICAgICAKKy8qIGFtZDgxMTFlIGRlY3JpcHRvciBmbGFnIGRlZmluaXRpb25zICovCit0eXBlZGVmIGVudW0geworCisJT1dOX0JJVAkJPQkoMSA8PCAxNSksCisJQUREX0ZDU19CSVQJPQkoMSA8PCAxMyksCisJTFRJTlRfQklUCT0JKDEgPDwgMTIpLAorCVNUUF9CSVQJCT0JKDEgPDwgOSksCisJRU5QX0JJVAkJPQkoMSA8PCA4KSwKKwlLSUxMX0JJVAk9IAkoMSA8PCA2KSwKKwlUQ0NfVkxBTl9JTlNFUlQJPQkoMSA8PCAxKSwKKwlUQ0NfVkxBTl9SRVBMQUNFID0JKDEgPDwgMSkgfCggMTw8IDApLAorCit9VFhfRkxBR19CSVRTOworCit0eXBlZGVmIGVudW0geworCUVSUl9CSVQgCT0JKDEgPDwgMTQpLAorCUZSQU1fQklUCT0gIAkoMSA8PCAxMyksCisJT0ZMT19CSVQJPSAgICAgICAoMSA8PCAxMiksCisJQ1JDX0JJVAkJPQkoMSA8PCAxMSksCisJUEFNX0JJVAkJPQkoMSA8PCA2KSwKKwlMQUZNX0JJVAk9IAkoMSA8PCA1KSwKKwlCQU1fQklUCQk9CSgxIDw8IDQpLAorCVRUX1ZMQU5fVEFHR0VECT0gCSgxIDw8IDMpIHwoMSA8PCAyKSwvKiAweDAwMCAqLworCVRUX1BSVFlfVEFHR0VECT0JKDEgPDwgMyksLyogMHgwMDA4ICovCisKK31SWF9GTEFHX0JJVFM7CisKKyNkZWZpbmUgUkVTRVRfUlhfRkxBR1MJCTB4MDAwMAorI2RlZmluZSBUVF9NQVNLCQkJMHgwMDBjCisjZGVmaW5lIFRDQ19NQVNLCQkweDAwMDMKKworLyogZHJpdmVyIGlvY3RsIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgQU1EODExMUVfUkVHX0RVTVBfTEVOCSAxMypzaXplb2YodTMyKSAKKworLyogY3JjIGdlbmVyYXRvciBjb25zdGFudHMgKi8KKyNkZWZpbmUgQ1JDMzIgMHhlZGI4ODMyMAorI2RlZmluZSBJTklUQ1JDIDB4RkZGRkZGRkYKKworLyogYW1kODExMWUgZGVzcmlwdG9yIGZvcm1hdCAqLworCitzdHJ1Y3QgYW1kODExMWVfdHhfZHJ7CisKKwl1MTYgYnVmZl9jb3VudDsgLyogU2l6ZSBvZiB0aGUgYnVmZmVyIHBvaW50ZWQgYnkgdGhpcyBkZXNjcmlwdG9yICovCisKKwl1MTYgdHhfZmxhZ3M7CisKKwl1MTYgdGFnX2N0cmxfaW5mbzsKKworCXUxNiB0YWdfY3RybF9jbWQ7CisKKwl1MzIgYnVmZl9waHlfYWRkcjsKKworCXUzMiByZXNlcnZlZDsKK307IAorCitzdHJ1Y3QgYW1kODExMWVfcnhfZHJ7CisJCisJdTMyIHJlc2VydmVkOworCisJdTE2IG1zZ19jb3VudDsgLyogUmVjZWl2ZWQgbWVzc2FnZSBsZW4gKi8KKworCXUxNiB0YWdfY3RybF9pbmZvOyAKKworCXUxNiBidWZmX2NvdW50OyAgLyogTGVuIG9mIHRoZSBidWZmZXIgcG9pbnRlZCBieSBkZXNjcmlwdG9yLiAqLworCisJdTE2IHJ4X2ZsYWdzOworCisJdTMyIGJ1ZmZfcGh5X2FkZHI7CisKK307CitzdHJ1Y3QgYW1kODExMWVfbGlua19jb25maWd7CisKKyNkZWZpbmUgU1BFRURfSU5WQUxJRAkJMHhmZmZmCisjZGVmaW5lIERVUExFWF9JTlZBTElECQkweGZmCisjZGVmaW5lIEFVVE9ORUdfSU5WQUxJRAkJMHhmZgorCQorCXVuc2lnbmVkIGxvbmcJCQlvcmlnX3BoeV9vcHRpb247CisJdTE2CQkJCXNwZWVkOworCXU4CQkJCWR1cGxleDsKKwl1OAkJCQlhdXRvbmVnOworCXU4CQkJCXJlc2VydmVkOyAgLyogMzJiaXQgYWxpZ25tZW50ICovCit9OworCitlbnVtIGNvYWxfdHlwZXsKKworCU5PX0NPQUxFU0NFLAorCUxPV19DT0FMRVNDRSwKKwlNRURJVU1fQ09BTEVTQ0UsCisJSElHSF9DT0FMRVNDRSwKKworfTsKKworZW51bSBjb2FsX21vZGV7IAorICAgICAgIAlSWF9JTlRSX0NPQUwsCisJVFhfSU5UUl9DT0FMLAorCURJU0FCTEVfQ09BTCwKKwlFTkFCTEVfQ09BTCwKKworfTsKKyNkZWZpbmUgTUFYX1RJTUVPVVQJNDAKKyNkZWZpbmUgTUFYX0VWRU5UX0NPVU5UIDMxCitzdHJ1Y3QgYW1kODExMWVfY29hbGVzY2VfY29uZnsKKworCXVuc2lnbmVkIGludCByeF90aW1lb3V0OworCXVuc2lnbmVkIGludCByeF9ldmVudF9jb3VudDsKKwl1bnNpZ25lZCBsb25nIHJ4X3BhY2tldHM7CisJdW5zaWduZWQgbG9uZyByeF9wcmV2X3BhY2tldHM7CisJdW5zaWduZWQgbG9uZyByeF9ieXRlczsKKwl1bnNpZ25lZCBsb25nIHJ4X3ByZXZfYnl0ZXM7CisJdW5zaWduZWQgaW50IHJ4X2NvYWxfdHlwZTsKKwkKKwl1bnNpZ25lZCBpbnQgdHhfdGltZW91dDsKKwl1bnNpZ25lZCBpbnQgdHhfZXZlbnRfY291bnQ7CisJdW5zaWduZWQgbG9uZyB0eF9wYWNrZXRzOworCXVuc2lnbmVkIGxvbmcgdHhfcHJldl9wYWNrZXRzOworCXVuc2lnbmVkIGxvbmcgdHhfYnl0ZXM7CisJdW5zaWduZWQgbG9uZyB0eF9wcmV2X2J5dGVzOworCXVuc2lnbmVkIGludCB0eF9jb2FsX3R5cGU7CisKK307CitzdHJ1Y3QgaXBnX2luZm97CisJCisJdW5zaWduZWQgaW50IGlwZ19zdGF0ZTsKKwl1bnNpZ25lZCBpbnQgaXBnOworCXVuc2lnbmVkIGludCBjdXJyZW50X2lwZzsKKwl1bnNpZ25lZCBpbnQgY29sX2NudDsKKwl1bnNpZ25lZCBpbnQgZGlmZl9jb2xfY250OworCXVuc2lnbmVkIGludCB0aW1lcl90aWNrOworCXVuc2lnbmVkIGludCBwcmV2X2lwZzsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBpcGdfdGltZXI7Cit9OworCitzdHJ1Y3QgYW1kODExMWVfcHJpdnsKKwkKKwlzdHJ1Y3QgYW1kODExMWVfdHhfZHIqICB0eF9yaW5nOworCXN0cnVjdCBhbWQ4MTExZV9yeF9kciogcnhfcmluZzsKKwlkbWFfYWRkcl90IHR4X3JpbmdfZG1hX2FkZHI7CS8qIHR4IGRlc2NyaXB0b3IgcmluZyBiYXNlIGFkZHJlc3MgKi8KKwlkbWFfYWRkcl90IHJ4X3JpbmdfZG1hX2FkZHI7CS8qIHJ4IGRlc2NyaXB0b3IgcmluZyBiYXNlIGFkZHJlc3MgKi8KKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OwkvKiBQdHIgdG8gdGhlIGFzc29jaWF0ZWQgcGNpX2RldiAqLworCXN0cnVjdCBuZXRfZGV2aWNlKiBhbWQ4MTExZV9uZXRfZGV2OyAJLyogcHRyIHRvIGFzc29jaWF0ZWQgbmV0X2RldmljZSAqLworCS8qIFRyYW5zbWl0IGFuZCByZWNpdmUgc2ticyAqLworCXN0cnVjdCBza19idWZmICp0eF9za2J1ZmZbTlVNX1RYX0JVRkZFUlNdOworCXN0cnVjdCBza19idWZmICpyeF9za2J1ZmZbTlVNX1JYX0JVRkZFUlNdOworCS8qIFRyYW5zbWl0IGFuZCByZWNlaXZlIGRtYSBtYXBwZWQgYWRkciAqLworCWRtYV9hZGRyX3QgdHhfZG1hX2FkZHJbTlVNX1RYX0JVRkZFUlNdOworCWRtYV9hZGRyX3QgcnhfZG1hX2FkZHJbTlVNX1JYX0JVRkZFUlNdOworCS8qIFJlZyBtZW1vcnkgbWFwcGVkIGFkZHJlc3MgKi8KKwl2b2lkIF9faW9tZW0gKm1taW87CisJCisJc3BpbmxvY2tfdCBsb2NrOwkvKiBHdWFyZCBsb2NrICovCisJdW5zaWduZWQgbG9uZyByeF9pZHgsIHR4X2lkeDsJLyogVGhlIG5leHQgZnJlZSByaW5nIGVudHJ5ICovCisJdW5zaWduZWQgbG9uZyB0eF9jb21wbGV0ZV9pZHg7CisJdW5zaWduZWQgbG9uZyB0eF9yaW5nX2NvbXBsZXRlX2lkeDsKKwl1bnNpZ25lZCBsb25nIHR4X3JpbmdfaWR4OworCXVuc2lnbmVkIGludCByeF9idWZmX2xlbjsJLyogQnVmZmVyIGxlbmd0aCBvZiByeCBidWZmZXJzICovCisJaW50IG9wdGlvbnM7CQkvKiBPcHRpb25zIGVuYWJsZWQvZGlzYWJsZWQgZm9yIHRoZSBkZXZpY2UgKi8KKworCXVuc2lnbmVkIGxvbmcgZXh0X3BoeV9vcHRpb247CisJaW50IGV4dF9waHlfYWRkcjsKKwl1MzIgZXh0X3BoeV9pZDsKKwkKKwlzdHJ1Y3QgYW1kODExMWVfbGlua19jb25maWcgbGlua19jb25maWc7CisJaW50IHBtX2NhcDsKKworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXh0OworCWludCBtaWk7CisJc3RydWN0IG1paV9pZl9pbmZvIG1paV9pZjsKKyNpZiBBTUQ4MTExRV9WTEFOX1RBR19VU0VECisJc3RydWN0IHZsYW5fZ3JvdXAJCSp2bGdycDsKKyNlbmRpZgkKKwljaGFyIG9wZW5lZDsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwl1bnNpZ25lZCBpbnQgZHJ2X3J4X2Vycm9yczsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QqIG1jX2xpc3Q7CisJc3RydWN0IGFtZDgxMTFlX2NvYWxlc2NlX2NvbmYgY29hbF9jb25mOworCisJc3RydWN0IGlwZ19pbmZvICBpcGdfZGF0YTsJCisJCit9OworCisvKiBrZXJuZWwgcHJvdmlkZWQgd3JpdGVxIGRvZXMgbm90IHdyaXRlIDY0IGJpdHMgaW50byB0aGUgYW1kODExMWUgZGV2aWNlIHJlZ2lzdGVyIGluc3RlYWQgd3JpdGVzIG9ubHkgaGlnaGVyIDMyYml0cyBkYXRhIGludG8gbG93ZXIgMzJiaXRzIG9mIHRoZSByZWdpc3Rlci4KK0JVRz8gKi8KKyNkZWZpbmUgIGFtZDgxMTFlX3dyaXRlcShfVWxEYXRhLF9tZW1NYXApICAgXAorCQl3cml0ZWwoKih1MzIqKSgmX1VsRGF0YSksIF9tZW1NYXApOwlcCisJCXdyaXRlbCgqKHUzMiopKCh1OCopKCZfVWxEYXRhKSs0KSwgX21lbU1hcCs0KQkKKworLyogbWFwcyB0aGUgZXh0ZXJuYWwgc3BlZWQgb3B0aW9ucyB0byBpbnRlcm5hbCB2YWx1ZSAqLwordHlwZWRlZiBlbnVtIHsKKwlTUEVFRF9BVVRPTkVHLAorCVNQRUVEMTBfSEFMRiwKKwlTUEVFRDEwX0ZVTEwsCisJU1BFRUQxMDBfSEFMRiwKKwlTUEVFRDEwMF9GVUxMLAorfUVYVF9QSFlfT1BUSU9OOworCitzdGF0aWMgaW50IGNhcmRfaWR4Oworc3RhdGljIGludCBzcGVlZF9kdXBsZXhbTUFYX1VOSVRTXSA9IHsgMCwgfTsKK3N0YXRpYyBpbnQgY29hbGVzY2VbTUFYX1VOSVRTXSA9IHsxLDEsMSwxLDEsMSwxLDF9Oworc3RhdGljIGludCBkeW5hbWljX2lwZ1tNQVhfVU5JVFNdID0gezAsMCwwLDAsMCwwLDAsMH07CitzdGF0aWMgdW5zaWduZWQgaW50IGNoaXBfdmVyc2lvbjsKKworI2VuZGlmIC8qIF9BTUQ4MTExRV9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FwbmUuYyBiL2RyaXZlcnMvbmV0L2FwbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTQyMTZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXBuZS5jCkBAIC0wLDAgKzEsNjM3IEBACisvKgorICogQW1pZ2EgTGludXgvNjhrIDgzOTAgYmFzZWQgUENNQ0lBIEV0aGVybmV0IERyaXZlciBmb3IgdGhlIEFtaWdhIDEyMDAKKyAqCisgKiAoQykgQ29weXJpZ2h0IDE5OTcgQWxhaW4gTWFsZWsKKyAqICAgICAgICAgICAgICAgICAgICAoQWxhaW4uTWFsZWtAY3J5b2dlbi5jb20pCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBiYXNlZCBvbgorICoKKyAqIG5lLmM6ICAgICAgIEEgZ2VuZXJhbCBub24tc2hhcmVkLW1lbW9yeSBOUzgzOTAgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eAorICogICAgICAgICAgICAgV3JpdHRlbiAxOTkyLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisgKgorICogODM5MC5jOiAgICAgQSBnZW5lcmFsIE5TODM5MCBldGhlcm5ldCBkcml2ZXIgY29yZSBmb3IgbGludXguCisgKiAgICAgICAgICAgICBXcml0dGVuIDE5OTItOTQgYnkgRG9uYWxkIEJlY2tlci4KKyAqCisgKiBjbmV0ZGV2aWNlOiBBIFNhbmEtSUkgZXRoZXJuZXQgZHJpdmVyIGZvciBBbWlnYU9TCisgKiAgICAgICAgICAgICBXcml0dGVuIGJ5IEJydWNlIEFiYm90dCAoYmhhYmJvdHRAaW5oYi5jby5ueikKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4CisgKiBkaXN0cmlidXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2FpbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2F5bGUuaD4KKyNpbmNsdWRlIDxhc20vYW1pcGNtY2lhLmg+CisKKyNpbmNsdWRlICI4MzkwLmgiCisKKy8qIC0tLS0gTm8gdXNlci1zZXJ2aWNlYWJsZSBwYXJ0cyBiZWxvdyAtLS0tICovCisKKyNkZWZpbmUgRFJWX05BTUUgImFwbmUiCisKKyNkZWZpbmUgTkVfQkFTRQkgKGRldi0+YmFzZV9hZGRyKQorI2RlZmluZSBORV9DTUQJIAkJMHgwMAorI2RlZmluZSBORV9EQVRBUE9SVAkJMHgxMCAgICAgICAgICAgIC8qIE5hdFNlbWktZGVmaW5lZCBwb3J0IHdpbmRvdyBvZmZzZXQuICovCisjZGVmaW5lIE5FX1JFU0VUCQkweDFmICAgICAgICAgICAgLyogSXNzdWUgYSByZWFkIHRvIHJlc2V0LCBhIHdyaXRlIHRvIGNsZWFyLiAqLworI2RlZmluZSBORV9JT19FWFRFTlQJICAgICAgICAweDIwCisKKyNkZWZpbmUgTkVfRU4wX0lTUgkJMHgwNworI2RlZmluZSBORV9FTjBfRENGRwkJMHgwZQorCisjZGVmaW5lIE5FX0VOMF9SU0FSTE8JICAgICAgICAweDA4CisjZGVmaW5lIE5FX0VOMF9SU0FSSEkJICAgICAgICAweDA5CisjZGVmaW5lIE5FX0VOMF9SQ05UTE8JICAgICAgICAweDBhCisjZGVmaW5lIE5FX0VOMF9SWENSCQkweDBjCisjZGVmaW5lIE5FX0VOMF9UWENSCQkweDBkCisjZGVmaW5lIE5FX0VOMF9SQ05USEkJICAgICAgICAweDBiCisjZGVmaW5lIE5FX0VOMF9JTVIJCTB4MGYKKworI2RlZmluZSBORTFTTV9TVEFSVF9QRwkweDIwCS8qIEZpcnN0IHBhZ2Ugb2YgVFggYnVmZmVyICovCisjZGVmaW5lIE5FMVNNX1NUT1BfUEcgCTB4NDAJLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcgKi8KKyNkZWZpbmUgTkVTTV9TVEFSVF9QRwkweDQwCS8qIEZpcnN0IHBhZ2Ugb2YgVFggYnVmZmVyICovCisjZGVmaW5lIE5FU01fU1RPUF9QRwkweDgwCS8qIExhc3QgcGFnZSArMSBvZiBSWCByaW5nICovCisKKworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgYXBuZV9wcm9iZShpbnQgdW5pdCk7CitzdGF0aWMgaW50IGFwbmVfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpOworCitzdGF0aWMgaW50IGFwbmVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYXBuZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHZvaWQgYXBuZV9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYXBuZV9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwKKwkJCSAgaW50IHJpbmdfcGFnZSk7CitzdGF0aWMgdm9pZCBhcG5lX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIGFwbmVfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IGludCBjb3VudCwKKwkJCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGNvbnN0IGludCBzdGFydF9wYWdlKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBhcG5lX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworc3RhdGljIGludCBpbml0X3BjbWNpYSh2b2lkKTsKKworLyogSU8gYmFzZSBhZGRyZXNzIHVzZWQgZm9yIG5pYyAqLworCisjZGVmaW5lIElPQkFTRSAweDMwMAorCisvKgorICAgdXNlIE1BTlVBTF9DT05GSUcgYW5kIE1BTlVBTF9PRkZTRVQgZm9yIGVuYWJsaW5nIElPIGJ5IGhhbmQKKyAgIHlvdSBjYW4gZmluZCB0aGUgdmFsdWVzIHRvIHVzZSBieSBsb29raW5nIGF0IHRoZSBjbmV0LmRldmljZQorICAgY29uZmlnIGZpbGUgZXhhbXBsZSAodGhlIGRlZmF1bHQgdmFsdWVzIGFyZSBmb3IgdGhlIENORVQ0MEJDIGNhcmQpCisqLworCisvKgorI2RlZmluZSBNQU5VQUxfQ09ORklHIDB4MjAKKyNkZWZpbmUgTUFOVUFMX09GRlNFVCAweDNmOAorCisjZGVmaW5lIE1BTlVBTF9IV0FERFIwIDB4MDAKKyNkZWZpbmUgTUFOVUFMX0hXQUREUjEgMHgxMgorI2RlZmluZSBNQU5VQUxfSFdBRERSMiAweDM0CisjZGVmaW5lIE1BTlVBTF9IV0FERFIzIDB4NTYKKyNkZWZpbmUgTUFOVUFMX0hXQUREUjQgMHg3OAorI2RlZmluZSBNQU5VQUxfSFdBRERSNSAweDlhCisqLworCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPQorICAgICJhcG5lLmM6djEuMSA3LzEwLzk4IEFsYWluIE1hbGVrIChBbGFpbi5NYWxla0BjcnlvZ2VuLmNoKVxuIjsKKworc3RhdGljIGludCBhcG5lX293bmVkOwkvKiBzaWduYWwgaWYgY2FyZCBhbHJlYWR5IG93bmVkICovCisKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGFwbmVfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyNpZm5kZWYgTUFOVUFMX0NPTkZJRworCWNoYXIgdHVwbGVbOF07CisjZW5kaWYKKwlpbnQgZXJyOworCisJaWYgKGFwbmVfb3duZWQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisJaWYgKCAhKEFNSUdBSFdfUFJFU0VOVChQQ01DSUEpKSApCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlwcmludGsoIkxvb2tpbmcgZm9yIFBDTUNJQSBldGhlcm5ldCBjYXJkIDogIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJLyogY2hlY2sgaWYgYSBjYXJkIGlzIGluc2VydGVkICovCisJaWYgKCEoUENNQ0lBX0lOU0VSVEVEKSkgeworCQlwcmludGsoIk5PIFBDTUNJQSBjYXJkIGluc2VydGVkXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisJfQorCisJZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCX0KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwkvKiBkaXNhYmxlIHBjbWNpYSBpcnEgZm9yIHJlYWR0dXBsZSAqLworCXBjbWNpYV9kaXNhYmxlX2lycSgpOworCisjaWZuZGVmIE1BTlVBTF9DT05GSUcKKwlpZiAoKHBjbWNpYV9jb3B5X3R1cGxlKENJU1RQTF9GVU5DSUQsIHR1cGxlLCA4KSA8IDMpIHx8CisJCSh0dXBsZVsyXSAhPSBDSVNUUExfRlVOQ0lEX05FVFdPUkspKSB7CisJCXByaW50aygibm90IGFuIGV0aGVybmV0IGNhcmRcbiIpOworCQkvKiBYWFg6IHNob3VsZG4ndCB3ZSByZS1lbmFibGUgaXJxIGhlcmU/ICovCisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCX0KKyNlbmRpZgorCisJcHJpbnRrKCJldGhlcm5ldCBQQ01DSUEgY2FyZCBpbnNlcnRlZFxuIik7CisKKwlpZiAoIWluaXRfcGNtY2lhKCkpIHsKKwkJLyogWFhYOiBzaG91bGRuJ3Qgd2UgcmUtZW5hYmxlIGlycSBoZXJlPyAqLworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKElPQkFTRSwgMHgyMCwgRFJWX05BTUUpKSB7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7CisJfQorCisJZXJyID0gYXBuZV9wcm9iZTEoZGV2LCBJT0JBU0UpOworCWlmIChlcnIpIHsKKwkJcmVsZWFzZV9yZWdpb24oSU9CQVNFLCAweDIwKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwl9CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKCFlcnIpCisJCXJldHVybiBkZXY7CisKKwlwY21jaWFfZGlzYWJsZV9pcnEoKTsKKwlmcmVlX2lycShJUlFfQU1JR0FfUE9SVFMsIGRldik7CisJcGNtY2lhX3Jlc2V0KCk7CisJcmVsZWFzZV9yZWdpb24oSU9CQVNFLCAweDIwKTsKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFwbmVfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciBTQV9wcm9tWzMyXTsKKyAgICBpbnQgd29yZGxlbmd0aCA9IDI7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisgICAgaW50IHN0YXJ0X3BhZ2UsIHN0b3BfcGFnZTsKKyNpZm5kZWYgTUFOVUFMX0hXQUREUjAKKyAgICBpbnQgbmVYMDAwLCBjdHJvbjsKKyNlbmRpZgorICAgIHN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7CisgCisgICAgaWYgKGVpX2RlYnVnICAmJiAgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwlwcmludGsodmVyc2lvbik7CisKKyAgICBwcmludGsoIlBDTUNJQSBORSowMDAgZXRoZXJjYXJkIHByb2JlIik7CisKKyAgICAvKiBSZXNldCBjYXJkLiBXaG8ga25vd3Mgd2hhdCBkYWluLWJyYW1hZ2VkIHN0YXRlIGl0IHdhcyBsZWZ0IGluLiAqLworICAgIHsJdW5zaWduZWQgbG9uZyByZXNldF9zdGFydF90aW1lID0gamlmZmllczsKKworCW91dGIoaW5iKGlvYWRkciArIE5FX1JFU0VUKSwgaW9hZGRyICsgTkVfUkVTRVQpOworCisJd2hpbGUgKChpbmIoaW9hZGRyICsgTkVfRU4wX0lTUikgJiBFTklTUl9SRVNFVCkgPT0gMCkKKwkJaWYgKGppZmZpZXMgLSByZXNldF9zdGFydF90aW1lID4gMipIWi8xMDApIHsKKwkJCXByaW50aygiIG5vdCBmb3VuZCAobm8gcmVzZXQgYWNrKS5cbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCW91dGIoMHhmZiwgaW9hZGRyICsgTkVfRU4wX0lTUik7CQkvKiBBY2sgYWxsIGludHIuICovCisgICAgfQorCisjaWZuZGVmIE1BTlVBTF9IV0FERFIwCisKKyAgICAvKiBSZWFkIHRoZSAxNiBieXRlcyBvZiBzdGF0aW9uIGFkZHJlc3MgUFJPTS4KKyAgICAgICBXZSBtdXN0IGZpcnN0IGluaXRpYWxpemUgcmVnaXN0ZXJzLCBzaW1pbGFyIHRvIE5TODM5MF9pbml0KGVpZmRldiwgMCkuCisgICAgICAgV2UgY2FuJ3QgcmVsaWFibHkgcmVhZCB0aGUgU0FQUk9NIGFkZHJlc3Mgd2l0aG91dCB0aGlzLgorICAgICAgIChJIGxlYXJuZWQgdGhlIGhhcmQgd2F5ISkuICovCisgICAgeworCXN0cnVjdCB7dW5zaWduZWQgbG9uZyB2YWx1ZSwgb2Zmc2V0OyB9IHByb2dyYW1fc2VxW10gPSB7CisJICAgIHtFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVE9QLCBORV9DTUR9LCAvKiBTZWxlY3QgcGFnZSAwKi8KKwkgICAgezB4NDgsCU5FX0VOMF9EQ0ZHfSwJLyogU2V0IGJ5dGUtd2lkZSAoMHg0OCkgYWNjZXNzLiAqLworCSAgICB7MHgwMCwJTkVfRU4wX1JDTlRMT30sCS8qIENsZWFyIHRoZSBjb3VudCByZWdzLiAqLworCSAgICB7MHgwMCwJTkVfRU4wX1JDTlRISX0sCisJICAgIHsweDAwLAlORV9FTjBfSU1SfSwJLyogTWFzayBjb21wbGV0aW9uIGlycS4gKi8KKwkgICAgezB4RkYsCU5FX0VOMF9JU1J9LAorCSAgICB7RTgzOTBfUlhPRkYsIE5FX0VOMF9SWENSfSwJLyogMHgyMCAgU2V0IHRvIG1vbml0b3IgKi8KKwkgICAge0U4MzkwX1RYT0ZGLCBORV9FTjBfVFhDUn0sCS8qIDB4MDIgIGFuZCBsb29wYmFjayBtb2RlLiAqLworCSAgICB7MzIsCU5FX0VOMF9SQ05UTE99LAorCSAgICB7MHgwMCwJTkVfRU4wX1JDTlRISX0sCisJICAgIHsweDAwLAlORV9FTjBfUlNBUkxPfSwJLyogRE1BIHN0YXJ0aW5nIGF0IDB4MDAwMC4gKi8KKwkgICAgezB4MDAsCU5FX0VOMF9SU0FSSEl9LAorCSAgICB7RTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIE5FX0NNRH0sCisJfTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHByb2dyYW1fc2VxKS9zaXplb2YocHJvZ3JhbV9zZXFbMF0pOyBpKyspIHsKKwkgICAgb3V0Yihwcm9ncmFtX3NlcVtpXS52YWx1ZSwgaW9hZGRyICsgcHJvZ3JhbV9zZXFbaV0ub2Zmc2V0KTsKKwl9CisKKyAgICB9CisgICAgZm9yKGkgPSAwOyBpIDwgMzIgLypzaXplb2YoU0FfcHJvbSkqLzsgaSs9MikgeworCVNBX3Byb21baV0gPSBpbmIoaW9hZGRyICsgTkVfREFUQVBPUlQpOworCVNBX3Byb21baSsxXSA9IGluYihpb2FkZHIgKyBORV9EQVRBUE9SVCk7CisJaWYgKFNBX3Byb21baV0gIT0gU0FfcHJvbVtpKzFdKQorCSAgICB3b3JkbGVuZ3RoID0gMTsKKyAgICB9CisKKyAgICAvKglBdCB0aGlzIHBvaW50LCB3b3JkbGVuZ3RoICpvbmx5KiB0ZWxscyB1cyBpZiB0aGUgU0FfcHJvbSBpcyBkb3VibGVkCisJdXAgb3Igbm90IGJlY2F1c2Ugc29tZSBicm9rZW4gUENJIGNhcmRzIGRvbid0IHJlc3BlY3QgdGhlIGJ5dGUtd2lkZQorCXJlcXVlc3QgaW4gcHJvZ3JhbV9zZXEgYWJvdmUsIGFuZCBoZW5jZSBkb24ndCBoYXZlIGRvdWJsZWQgdXAgdmFsdWVzLiAKKwlUaGVzZSBicm9rZW4gY2FyZHMgd291bGQgb3RoZXJ3aXNlIGJlIGRldGVjdGVkIGFzIGFuIG5lMTAwMC4gICovCisKKyAgICBpZiAod29yZGxlbmd0aCA9PSAyKQorCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlTQV9wcm9tW2ldID0gU0FfcHJvbVtpK2ldOworICAgIAorICAgIGlmICh3b3JkbGVuZ3RoID09IDIpIHsKKwkvKiBXZSBtdXN0IHNldCB0aGUgODM5MCBmb3Igd29yZCBtb2RlLiAqLworCW91dGIoMHg0OSwgaW9hZGRyICsgTkVfRU4wX0RDRkcpOworCXN0YXJ0X3BhZ2UgPSBORVNNX1NUQVJUX1BHOworCXN0b3BfcGFnZSA9IE5FU01fU1RPUF9QRzsKKyAgICB9IGVsc2UgeworCXN0YXJ0X3BhZ2UgPSBORTFTTV9TVEFSVF9QRzsKKwlzdG9wX3BhZ2UgPSBORTFTTV9TVE9QX1BHOworICAgIH0KKworICAgIG5lWDAwMCA9IChTQV9wcm9tWzE0XSA9PSAweDU3ICAmJiAgU0FfcHJvbVsxNV0gPT0gMHg1Nyk7CisgICAgY3Ryb24gPSAgKFNBX3Byb21bMF0gPT0gMHgwMCAmJiBTQV9wcm9tWzFdID09IDB4MDAgJiYgU0FfcHJvbVsyXSA9PSAweDFkKTsKKworICAgIC8qIFNldCB1cCB0aGUgcmVzdCBvZiB0aGUgcGFyYW1ldGVycy4gKi8KKyAgICBpZiAobmVYMDAwKSB7CisJbmFtZSA9ICh3b3JkbGVuZ3RoID09IDIpID8gIk5FMjAwMCIgOiAiTkUxMDAwIjsKKyAgICB9IGVsc2UgaWYgKGN0cm9uKSB7CisJbmFtZSA9ICh3b3JkbGVuZ3RoID09IDIpID8gIkN0cm9uLTgiIDogIkN0cm9uLTE2IjsKKwlzdGFydF9wYWdlID0gMHgwMTsKKwlzdG9wX3BhZ2UgPSAod29yZGxlbmd0aCA9PSAyKSA/IDB4NDAgOiAweDIwOworICAgIH0gZWxzZSB7CisJcHJpbnRrKCIgbm90IGZvdW5kLlxuIik7CisJcmV0dXJuIC1FTlhJTzsKKworICAgIH0KKworI2Vsc2UKKyAgICB3b3JkbGVuZ3RoID0gMjsKKyAgICAvKiBXZSBtdXN0IHNldCB0aGUgODM5MCBmb3Igd29yZCBtb2RlLiAqLworICAgIG91dGIoMHg0OSwgaW9hZGRyICsgTkVfRU4wX0RDRkcpOworICAgIHN0YXJ0X3BhZ2UgPSBORVNNX1NUQVJUX1BHOworICAgIHN0b3BfcGFnZSA9IE5FU01fU1RPUF9QRzsKKworICAgIFNBX3Byb21bMF0gPSBNQU5VQUxfSFdBRERSMDsKKyAgICBTQV9wcm9tWzFdID0gTUFOVUFMX0hXQUREUjE7CisgICAgU0FfcHJvbVsyXSA9IE1BTlVBTF9IV0FERFIyOworICAgIFNBX3Byb21bM10gPSBNQU5VQUxfSFdBRERSMzsKKyAgICBTQV9wcm9tWzRdID0gTUFOVUFMX0hXQUREUjQ7CisgICAgU0FfcHJvbVs1XSA9IE1BTlVBTF9IV0FERFI1OworICAgIG5hbWUgPSAiTkUyMDAwIjsKKyNlbmRpZgorCisgICAgZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisKKyAgICAvKiBJbnN0YWxsIHRoZSBJbnRlcnJ1cHQgaGFuZGxlciAqLworICAgIGkgPSByZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGFwbmVfaW50ZXJydXB0LCBTQV9TSElSUSwgRFJWX05BTUUsIGRldik7CisgICAgaWYgKGkpIHJldHVybiBpOworCisgICAgZm9yKGkgPSAwOyBpIDwgRVRIRVJfQUREUl9MRU47IGkrKykgeworCXByaW50aygiICUyLjJ4IiwgU0FfcHJvbVtpXSk7CisJZGV2LT5kZXZfYWRkcltpXSA9IFNBX3Byb21baV07CisgICAgfQorCisgICAgcHJpbnRrKCJcbiVzOiAlcyBmb3VuZC5cbiIsIGRldi0+bmFtZSwgbmFtZSk7CisKKyAgICBlaV9zdGF0dXMubmFtZSA9IG5hbWU7CisgICAgZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBzdGFydF9wYWdlOworICAgIGVpX3N0YXR1cy5zdG9wX3BhZ2UgPSBzdG9wX3BhZ2U7CisgICAgZWlfc3RhdHVzLndvcmQxNiA9ICh3b3JkbGVuZ3RoID09IDIpOworCisgICAgZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPSBzdGFydF9wYWdlICsgVFhfUEFHRVM7CisKKyAgICBlaV9zdGF0dXMucmVzZXRfODM5MCA9ICZhcG5lX3Jlc2V0XzgzOTA7CisgICAgZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJmFwbmVfYmxvY2tfaW5wdXQ7CisgICAgZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZhcG5lX2Jsb2NrX291dHB1dDsKKyAgICBlaV9zdGF0dXMuZ2V0XzgzOTBfaGRyID0gJmFwbmVfZ2V0XzgzOTBfaGRyOworICAgIGRldi0+b3BlbiA9ICZhcG5lX29wZW47CisgICAgZGV2LT5zdG9wID0gJmFwbmVfY2xvc2U7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKyAgICBkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CisjZW5kaWYKKyAgICBOUzgzOTBfaW5pdChkZXYsIDApOworCisgICAgcGNtY2lhX2Fja19pbnQocGNtY2lhX2dldF9pbnRyZXEoKSk7CQkvKiBhY2sgUENNQ0lBIGludCByZXEgKi8KKyAgICBwY21jaWFfZW5hYmxlX2lycSgpOworCisgICAgYXBuZV9vd25lZCA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYXBuZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgZWlfb3BlbihkZXYpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CithcG5lX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgaWYgKGVpX2RlYnVnID4gMSkKKwlwcmludGsoIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZC5cbiIsIGRldi0+bmFtZSk7CisgICAgZWlfY2xvc2UoZGV2KTsKKyAgICByZXR1cm4gMDsKK30KKworLyogSGFyZCByZXNldCB0aGUgY2FyZC4gIFRoaXMgdXNlZCB0byBwYXVzZSBmb3IgdGhlIHNhbWUgcGVyaW9kIHRoYXQgYQorICAgODM5MCByZXNldCBjb21tYW5kIHJlcXVpcmVkLCBidXQgdGhhdCBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5LiAqLworc3RhdGljIHZvaWQKK2FwbmVfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHVuc2lnbmVkIGxvbmcgcmVzZXRfc3RhcnRfdGltZSA9IGppZmZpZXM7CisKKyAgICBpbml0X3BjbWNpYSgpOworCisgICAgaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCJyZXNldHRpbmcgdGhlIDgzOTAgdD0lbGQuLi4iLCBqaWZmaWVzKTsKKworICAgIG91dGIoaW5iKE5FX0JBU0UgKyBORV9SRVNFVCksIE5FX0JBU0UgKyBORV9SRVNFVCk7CisKKyAgICBlaV9zdGF0dXMudHhpbmcgPSAwOworICAgIGVpX3N0YXR1cy5kbWFpbmcgPSAwOworCisgICAgLyogVGhpcyBjaGVjayBfc2hvdWxkX25vdF8gYmUgbmVjZXNzYXJ5LCBvbWl0IGV2ZW50dWFsbHkuICovCisgICAgd2hpbGUgKChpbmIoTkVfQkFTRStORV9FTjBfSVNSKSAmIEVOSVNSX1JFU0VUKSA9PSAwKQorCWlmIChqaWZmaWVzIC0gcmVzZXRfc3RhcnRfdGltZSA+IDIqSFovMTAwKSB7CisJICAgIHByaW50aygiJXM6IG5lX3Jlc2V0XzgzOTAoKSBkaWQgbm90IGNvbXBsZXRlLlxuIiwgZGV2LT5uYW1lKTsKKwkgICAgYnJlYWs7CisJfQorICAgIG91dGIoRU5JU1JfUkVTRVQsIE5FX0JBU0UgKyBORV9FTjBfSVNSKTsJLyogQWNrIGludHIuICovCit9CisKKy8qIEdyYWIgdGhlIDgzOTAgc3BlY2lmaWMgaGVhZGVyLiBTaW1pbGFyIHRvIHRoZSBibG9ja19pbnB1dCByb3V0aW5lLCBidXQKKyAgIHdlIGRvbid0IG5lZWQgdG8gYmUgY29uY2VybmVkIHdpdGggcmluZyB3cmFwIGFzIHRoZSBoZWFkZXIgd2lsbCBiZSBhdAorICAgdGhlIHN0YXJ0IG9mIGEgcGFnZSwgc28gd2Ugb3B0aW1pemUgYWNjb3JkaW5nbHkuICovCisKK3N0YXRpYyB2b2lkCithcG5lX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQoreworCisgICAgaW50IG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGNudDsKKyAgICBjaGFyICpwdHJjOworICAgIHNob3J0ICpwdHJzOworCisgICAgLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworICAgIGlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJcHJpbnRrKCIlczogRE1BaW5nIGNvbmZsaWN0IGluIG5lX2dldF84MzkwX2hkciAiCisJICAgIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXVtpbnRyOiVkXS5cbiIsCisJICAgZGV2LT5uYW1lLCBlaV9zdGF0dXMuZG1haW5nLCBlaV9zdGF0dXMuaXJxbG9jaywgZGV2LT5pcnEpOworCXJldHVybjsKKyAgICB9CisKKyAgICBlaV9zdGF0dXMuZG1haW5nIHw9IDB4MDE7CisgICAgb3V0YihFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgbmljX2Jhc2UrIE5FX0NNRCk7CisgICAgb3V0YihFTklTUl9SREMsIG5pY19iYXNlICsgTkVfRU4wX0lTUik7CisgICAgb3V0YihzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpLCBuaWNfYmFzZSArIE5FX0VOMF9SQ05UTE8pOworICAgIG91dGIoMCwgbmljX2Jhc2UgKyBORV9FTjBfUkNOVEhJKTsKKyAgICBvdXRiKDAsIG5pY19iYXNlICsgTkVfRU4wX1JTQVJMTyk7CQkvKiBPbiBwYWdlIGJvdW5kYXJ5ICovCisgICAgb3V0YihyaW5nX3BhZ2UsIG5pY19iYXNlICsgTkVfRU4wX1JTQVJISSk7CisgICAgb3V0YihFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBORV9DTUQpOworCisgICAgaWYgKGVpX3N0YXR1cy53b3JkMTYpIHsKKyAgICAgICAgcHRycyA9IChzaG9ydCopaGRyOworICAgICAgICBmb3IoY250ID0gMDsgY250IDwgKHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcik+PjEpOyBjbnQrKykKKyAgICAgICAgICAgICpwdHJzKysgPSBpbncoTkVfQkFTRSArIE5FX0RBVEFQT1JUKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdHJjID0gKGNoYXIqKWhkcjsKKyAgICAgICAgZm9yKGNudCA9IDA7IGNudCA8IHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcik7IGNudCsrKQorICAgICAgICAgICAgKnB0cmMrKyA9IGluYihORV9CQVNFICsgTkVfREFUQVBPUlQpOworICAgIH0KKworICAgIG91dGIoRU5JU1JfUkRDLCBuaWNfYmFzZSArIE5FX0VOMF9JU1IpOwkvKiBBY2sgaW50ci4gKi8KKyAgICBlaV9zdGF0dXMuZG1haW5nICY9IH4weDAxOworCisgICAgbGUxNl90b19jcHVzKCZoZHItPmNvdW50KTsKK30KKworLyogQmxvY2sgaW5wdXQgYW5kIG91dHB1dCwgc2ltaWxhciB0byB0aGUgQ3J5bndyIHBhY2tldCBkcml2ZXIuICBJZiB5b3UKKyAgIGFyZSBwb3J0aW5nIHRvIGEgbmV3IGV0aGVyY2FyZCwgbG9vayBhdCB0aGUgcGFja2V0IGRyaXZlciBzb3VyY2UgZm9yIGhpbnRzLgorICAgVGhlIE5FeDAwMCBkb2Vzbid0IHNoYXJlIHRoZSBvbi1ib2FyZCBwYWNrZXQgbWVtb3J5IC0tIHlvdSBoYXZlIHRvIHB1dAorICAgdGhlIHBhY2tldCBvdXQgdGhyb3VnaCB0aGUgInJlbW90ZSBETUEiIGRhdGFwb3J0IHVzaW5nIG91dGIuICovCisKK3N0YXRpYyB2b2lkCithcG5lX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KQoreworICAgIGludCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKKyAgICBjaGFyICpwdHJjOworICAgIHNob3J0ICpwdHJzOworICAgIGludCBjbnQ7CisKKyAgICAvKiBUaGlzICpzaG91bGRuJ3QqIGhhcHBlbi4gSWYgaXQgZG9lcywgaXQncyB0aGUgbGFzdCB0aGluZyB5b3UnbGwgc2VlICovCisgICAgaWYgKGVpX3N0YXR1cy5kbWFpbmcpIHsKKwlwcmludGsoIiVzOiBETUFpbmcgY29uZmxpY3QgaW4gbmVfYmxvY2tfaW5wdXQgIgorCSAgICJbRE1Bc3RhdDolZF1baXJxbG9jazolZF1baW50cjolZF0uXG4iLAorCSAgIGRldi0+bmFtZSwgZWlfc3RhdHVzLmRtYWluZywgZWlfc3RhdHVzLmlycWxvY2ssIGRldi0+aXJxKTsKKwlyZXR1cm47CisgICAgfQorICAgIGVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKyAgICBvdXRiKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUQVJULCBuaWNfYmFzZSsgTkVfQ01EKTsKKyAgICBvdXRiKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBORV9FTjBfSVNSKTsKKyAgICBvdXRiKGNvdW50ICYgMHhmZiwgbmljX2Jhc2UgKyBORV9FTjBfUkNOVExPKTsKKyAgICBvdXRiKGNvdW50ID4+IDgsIG5pY19iYXNlICsgTkVfRU4wX1JDTlRISSk7CisgICAgb3V0YihyaW5nX29mZnNldCAmIDB4ZmYsIG5pY19iYXNlICsgTkVfRU4wX1JTQVJMTyk7CisgICAgb3V0YihyaW5nX29mZnNldCA+PiA4LCBuaWNfYmFzZSArIE5FX0VOMF9SU0FSSEkpOworICAgIG91dGIoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIG5pY19iYXNlICsgTkVfQ01EKTsKKyAgICBpZiAoZWlfc3RhdHVzLndvcmQxNikgeworICAgICAgcHRycyA9IChzaG9ydCopYnVmOworICAgICAgZm9yIChjbnQgPSAwOyBjbnQgPCAoY291bnQ+PjEpOyBjbnQrKykKKyAgICAgICAgKnB0cnMrKyA9IGludyhORV9CQVNFICsgTkVfREFUQVBPUlQpOworICAgICAgaWYgKGNvdW50ICYgMHgwMSkgeworCWJ1Zltjb3VudC0xXSA9IGluYihORV9CQVNFICsgTkVfREFUQVBPUlQpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBwdHJjID0gKGNoYXIqKWJ1ZjsKKyAgICAgIGZvciAoY250ID0gMDsgY250IDwgY291bnQ7IGNudCsrKQorICAgICAgICAqcHRyYysrID0gaW5iKE5FX0JBU0UgKyBORV9EQVRBUE9SVCk7CisgICAgfQorCisgICAgb3V0YihFTklTUl9SREMsIG5pY19iYXNlICsgTkVfRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworICAgIGVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7Cit9CisKK3N0YXRpYyB2b2lkCithcG5lX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgY29uc3QgaW50IHN0YXJ0X3BhZ2UpCit7CisgICAgaW50IG5pY19iYXNlID0gTkVfQkFTRTsKKyAgICB1bnNpZ25lZCBsb25nIGRtYV9zdGFydDsKKyAgICBjaGFyICpwdHJjOworICAgIHNob3J0ICpwdHJzOworICAgIGludCBjbnQ7CisKKyAgICAvKiBSb3VuZCB0aGUgY291bnQgdXAgZm9yIHdvcmQgd3JpdGVzLiAgRG8gd2UgbmVlZCB0byBkbyB0aGlzPworICAgICAgIFdoYXQgZWZmZWN0IHdpbGwgYW4gb2RkIGJ5dGUgY291bnQgaGF2ZSBvbiB0aGUgODM5MD8KKyAgICAgICBJIHNob3VsZCBjaGVjayBzb21lZGF5LiAqLworICAgIGlmIChlaV9zdGF0dXMud29yZDE2ICYmIChjb3VudCAmIDB4MDEpKQorICAgICAgY291bnQrKzsKKworICAgIC8qIFRoaXMgKnNob3VsZG4ndCogaGFwcGVuLiBJZiBpdCBkb2VzLCBpdCdzIHRoZSBsYXN0IHRoaW5nIHlvdSdsbCBzZWUgKi8KKyAgICBpZiAoZWlfc3RhdHVzLmRtYWluZykgeworCXByaW50aygiJXM6IERNQWluZyBjb25mbGljdCBpbiBuZV9ibG9ja19vdXRwdXQuIgorCSAgICJbRE1Bc3RhdDolZF1baXJxbG9jazolZF1baW50cjolZF1cbiIsCisJICAgZGV2LT5uYW1lLCBlaV9zdGF0dXMuZG1haW5nLCBlaV9zdGF0dXMuaXJxbG9jaywgZGV2LT5pcnEpOworCXJldHVybjsKKyAgICB9CisgICAgZWlfc3RhdHVzLmRtYWluZyB8PSAweDAxOworICAgIC8qIFdlIHNob3VsZCBhbHJlYWR5IGJlIGluIHBhZ2UgMCwgYnV0IHRvIGJlIHNhZmUuLi4gKi8KKyAgICBvdXRiKEU4MzkwX1BBR0UwK0U4MzkwX1NUQVJUK0U4MzkwX05PRE1BLCBuaWNfYmFzZSArIE5FX0NNRCk7CisKKyAgICBvdXRiKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBORV9FTjBfSVNSKTsKKworICAgLyogTm93IHRoZSBub3JtYWwgb3V0cHV0LiAqLworICAgIG91dGIoY291bnQgJiAweGZmLCBuaWNfYmFzZSArIE5FX0VOMF9SQ05UTE8pOworICAgIG91dGIoY291bnQgPj4gOCwgICBuaWNfYmFzZSArIE5FX0VOMF9SQ05USEkpOworICAgIG91dGIoMHgwMCwgbmljX2Jhc2UgKyBORV9FTjBfUlNBUkxPKTsKKyAgICBvdXRiKHN0YXJ0X3BhZ2UsIG5pY19iYXNlICsgTkVfRU4wX1JTQVJISSk7CisKKyAgICBvdXRiKEU4MzkwX1JXUklURStFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBORV9DTUQpOworICAgIGlmIChlaV9zdGF0dXMud29yZDE2KSB7CisgICAgICAgIHB0cnMgPSAoc2hvcnQqKWJ1ZjsKKyAgICAgICAgZm9yIChjbnQgPSAwOyBjbnQgPCBjb3VudD4+MTsgY250KyspCisgICAgICAgICAgICBvdXR3KCpwdHJzKyssIE5FX0JBU0UrTkVfREFUQVBPUlQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0cmMgPSAoY2hhciopYnVmOworICAgICAgICBmb3IgKGNudCA9IDA7IGNudCA8IGNvdW50OyBjbnQrKykKKwkgICAgb3V0YigqcHRyYysrLCBORV9CQVNFICsgTkVfREFUQVBPUlQpOworICAgIH0KKworICAgIGRtYV9zdGFydCA9IGppZmZpZXM7CisKKyAgICB3aGlsZSAoKGluYihORV9CQVNFICsgTkVfRU4wX0lTUikgJiBFTklTUl9SREMpID09IDApCisJaWYgKGppZmZpZXMgLSBkbWFfc3RhcnQgPiAyKkhaLzEwMCkgewkJLyogMjBtcyAqLworCQlwcmludGsoIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIFR4IFJEQy5cbiIsIGRldi0+bmFtZSk7CisJCWFwbmVfcmVzZXRfODM5MChkZXYpOworCQlOUzgzOTBfaW5pdChkZXYsMSk7CisJCWJyZWFrOworCX0KKworICAgIG91dGIoRU5JU1JfUkRDLCBuaWNfYmFzZSArIE5FX0VOMF9JU1IpOwkvKiBBY2sgaW50ci4gKi8KKyAgICBlaV9zdGF0dXMuZG1haW5nICY9IH4weDAxOworICAgIHJldHVybjsKK30KKworc3RhdGljIGlycXJldHVybl90IGFwbmVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgdW5zaWduZWQgY2hhciBwY21jaWFfaW50cmVxOworCisgICAgaWYgKCEoZ2F5bGUuaW50ZW4gJiBHQVlMRV9JUlFfSVJRKSkKKyAgICAgICAgcmV0dXJuIElSUV9OT05FOworCisgICAgcGNtY2lhX2ludHJlcSA9IHBjbWNpYV9nZXRfaW50cmVxKCk7CisKKyAgICBpZiAoIShwY21jaWFfaW50cmVxICYgR0FZTEVfSVJRX0lSUSkpIHsKKyAgICAgICAgcGNtY2lhX2Fja19pbnQocGNtY2lhX2ludHJlcSk7CisgICAgICAgIHJldHVybiBJUlFfTk9ORTsKKyAgICB9CisgICAgaWYgKGVpX2RlYnVnID4gMykKKyAgICAgICAgcHJpbnRrKCJwY21jaWEgaW50cmVxID0gJXhcbiIsIHBjbWNpYV9pbnRyZXEpOworICAgIHBjbWNpYV9kaXNhYmxlX2lycSgpOwkJCS8qIHRvIGdldCByaWQgb2YgdGhlIHN0aSgpIHdpdGhpbiBlaV9pbnRlcnJ1cHQgKi8KKyAgICBlaV9pbnRlcnJ1cHQoaXJxLCBkZXZfaWQsIHJlZ3MpOworICAgIHBjbWNpYV9hY2tfaW50KHBjbWNpYV9nZXRfaW50cmVxKCkpOworICAgIHBjbWNpYV9lbmFibGVfaXJxKCk7CisgICAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmFwbmVfZGV2OworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlhcG5lX2RldiA9IGFwbmVfcHJvYmUoLTEpOworCWlmIChJU19FUlIoYXBuZV9kZXYpKQorCQlyZXR1cm4gUFRSX0VSUihhcG5lX2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihhcG5lX2Rldik7CisKKwlwY21jaWFfZGlzYWJsZV9pcnEoKTsKKworCWZyZWVfaXJxKElSUV9BTUlHQV9QT1JUUywgYXBuZV9kZXYpOworCisJcGNtY2lhX3Jlc2V0KCk7CisKKwlyZWxlYXNlX3JlZ2lvbihJT0JBU0UsIDB4MjApOworCisJZnJlZV9uZXRkZXYoYXBuZV9kZXYpOworfQorCisjZW5kaWYKKworc3RhdGljIGludCBpbml0X3BjbWNpYSh2b2lkKQoreworCXVfY2hhciBjb25maWc7CisjaWZuZGVmIE1BTlVBTF9DT05GSUcKKwl1X2NoYXIgdHVwbGVbMzJdOworCWludCBvZmZzZXRfbGVuOworI2VuZGlmCisJdV9sb25nIG9mZnNldDsKKworCXBjbWNpYV9yZXNldCgpOworCXBjbWNpYV9wcm9ncmFtX3ZvbHRhZ2UoUENNQ0lBXzBWKTsKKwlwY21jaWFfYWNjZXNzX3NwZWVkKFBDTUNJQV9TUEVFRF8yNTBOUyk7CisJcGNtY2lhX3dyaXRlX2VuYWJsZSgpOworCisjaWZkZWYgTUFOVUFMX0NPTkZJRworCWNvbmZpZyA9IE1BTlVBTF9DT05GSUc7CisjZWxzZQorCS8qIGdldCBhbmQgd3JpdGUgY29uZmlnIGJ5dGUgdG8gZW5hYmxlIElPIHBvcnQgKi8KKworCWlmIChwY21jaWFfY29weV90dXBsZShDSVNUUExfQ0ZUQUJMRV9FTlRSWSwgdHVwbGUsIDMyKSA8IDMpCisJCXJldHVybiAwOworCisJY29uZmlnID0gdHVwbGVbMl0gJiAweDNmOworI2VuZGlmCisjaWZkZWYgTUFOVUFMX09GRlNFVAorCW9mZnNldCA9IE1BTlVBTF9PRkZTRVQ7CisjZWxzZQorCWlmIChwY21jaWFfY29weV90dXBsZShDSVNUUExfQ09ORklHLCB0dXBsZSwgMzIpIDwgNikKKwkJcmV0dXJuIDA7CisKKwlvZmZzZXRfbGVuID0gKHR1cGxlWzJdICYgMHgzKSArIDE7CisJb2Zmc2V0ID0gMDsKKwl3aGlsZShvZmZzZXRfbGVuLS0pIHsKKwkJb2Zmc2V0ID0gKG9mZnNldCA8PCA4KSB8IHR1cGxlWzQrb2Zmc2V0X2xlbl07CisJfQorI2VuZGlmCisKKwlvdXRfOChHQVlMRV9BVFRSSUJVVEUrb2Zmc2V0LCBjb25maWcpOworCisJcmV0dXJuIDE7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FwcGxldGFsay9LY29uZmlnIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBiMTk2NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9LY29uZmlnCkBAIC0wLDAgKzEsOTggQEAKKyMKKyMgQXBwbGV0YWxrIGRyaXZlciBjb25maWd1cmF0aW9uCisjCitjb25maWcgREVWX0FQUExFVEFMSworCWJvb2wgIkFwcGxldGFsayBpbnRlcmZhY2VzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBVEFMSworCWhlbHAKKwkgIEFwcGxlVGFsayBpcyB0aGUgcHJvdG9jb2wgdGhhdCBBcHBsZSBjb21wdXRlcnMgY2FuIHVzZSB0byBjb21tdW5pY2F0ZQorCSAgb24gYSBuZXR3b3JrLiAgSWYgeW91ciBMaW51eCBib3ggaXMgY29ubmVjdGVkIHRvIHN1Y2ggYSBuZXR3b3JrLCBhbmQgd2lzaAorCSAgdG8gZG8gSVAgb3ZlciBpdCwgb3IgeW91IGhhdmUgYSBMb2NhbFRhbGsgY2FyZCBhbmQgd2lzaCB0byB1c2UgaXQgdG8KKwkgIGNvbm5lY3QgdG8gdGhlIEFwcGxlVGFsayBuZXR3b3JrLCBzYXkgWS4KKwkgIAorCitjb25maWcgTFRQQworCXRyaXN0YXRlICJBcHBsZS9GYXJhbGxvbiBMb2NhbFRhbGsgUEMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIERFVl9BUFBMRVRBTEsgJiYgKElTQSB8fCBFSVNBKQorCWhlbHAKKwkgIFRoaXMgYWxsb3dzIHlvdSB0byB1c2UgdGhlIEFwcGxlVGFsayBQQyBjYXJkIHRvIGNvbm5lY3QgdG8gTG9jYWxUYWxrCisJICBuZXR3b3Jrcy4gVGhlIGNhcmQgaXMgYWxzbyBrbm93biBhcyB0aGUgRmFyYWxsb24gUGhvbmVOZXQgUEMgY2FyZC4KKwkgIElmIHlvdSBhcmUgaW4gZG91YnQsIHRoaXMgY2FyZCBpcyB0aGUgb25lIHdpdGggdGhlIDY1QzAyIGNoaXAgb24gaXQuCisJICBZb3UgYWxzbyBuZWVkIHZlcnNpb24gMS4zLjMgb3IgbGF0ZXIgb2YgdGhlIG5ldGF0YWxrIHBhY2thZ2UuCisJICBUaGlzIGRyaXZlciBpcyBleHBlcmltZW50YWwsIHdoaWNoIG1lYW5zIHRoYXQgaXQgbWF5IG5vdCB3b3JrLgorCSAgU2VlIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9sdHBjLnR4dD4uCisKK2NvbmZpZyBDT1BTCisJdHJpc3RhdGUgIkNPUFMgTG9jYWxUYWxrIFBDIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBERVZfQVBQTEVUQUxLICYmIChJU0EgfHwgRUlTQSkKKwloZWxwCisJICBUaGlzIGFsbG93cyB5b3UgdG8gdXNlIENPUFMgQXBwbGVUYWxrIGNhcmRzIHRvIGNvbm5lY3QgdG8gTG9jYWxUYWxrCisJICBuZXR3b3Jrcy4gWW91IGFsc28gbmVlZCB2ZXJzaW9uIDEuMy4zIG9yIGxhdGVyIG9mIHRoZSBuZXRhdGFsaworCSAgcGFja2FnZS4gVGhpcyBkcml2ZXIgaXMgZXhwZXJpbWVudGFsLCB3aGljaCBtZWFucyB0aGF0IGl0IG1heSBub3QKKwkgIHdvcmsuIFRoaXMgZHJpdmVyIHdpbGwgb25seSB3b3JrIGlmIHlvdSBjaG9vc2UgIkFwcGxlVGFsayBERFAiCisJICBuZXR3b3JraW5nIHN1cHBvcnQsIGFib3ZlLgorCSAgUGxlYXNlIHJlYWQgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2NvcHMudHh0Pi4KKworY29uZmlnIENPUFNfREFZTkEKKwlib29sICJEYXluYSBmaXJtd2FyZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQ09QUworCWhlbHAKKwkgIFN1cHBvcnQgQ09QUyBjb21wYXRpYmxlIGNhcmRzIHdpdGggRGF5bmEgc3R5bGUgZmlybXdhcmUgKERheW5hCisJICBETDIwMDAvIERheW5hdGFsay9QQyAoaGFsZiBsZW5ndGgpLCBDT1BTIExULTk1LCBGYXJhbGxvbiBQaG9uZU5FVCBQQworCSAgSUlJLCBGYXJhbGxvbiBQaG9uZU5FVCBQQyBJSSkuCisKK2NvbmZpZyBDT1BTX1RBTkdFTlQKKwlib29sICJUYW5nZW50IGZpcm13YXJlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBDT1BTCisJaGVscAorCSAgU3VwcG9ydCBDT1BTIGNvbXBhdGlibGUgY2FyZHMgd2l0aCBUYW5nZW50IHN0eWxlIGZpcm13YXJlIChUYW5nZW50CisJICBBVEJfSUksIE5vdmVsbCBOTC0xMDAwLCBEYXlzdGFyIERpZ2l0YWwgTFQtMjAwLgorCitjb25maWcgSVBERFAKKwl0cmlzdGF0ZSAiQXBwbGV0YWxrLUlQIGRyaXZlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gREVWX0FQUExFVEFMSyAmJiBBVEFMSworCS0tLWhlbHAtLS0KKwkgIFRoaXMgYWxsb3dzIElQIG5ldHdvcmtpbmcgZm9yIHVzZXJzIHdobyBvbmx5IGhhdmUgQXBwbGVUYWxrCisJICBuZXR3b3JraW5nIGF2YWlsYWJsZS4gVGhpcyBmZWF0dXJlIGlzIGV4cGVyaW1lbnRhbC4gV2l0aCB0aGlzCisJICBkcml2ZXIsIHlvdSBjYW4gZW5jYXBzdWxhdGUgSVAgaW5zaWRlIEFwcGxlVGFsayAoZS5nLiBpZiB5b3VyIExpbnV4CisJICBib3ggaXMgc3R1Y2sgb24gYW4gQXBwbGVUYWxrIG9ubHkgbmV0d29yaykgb3IgZGVjYXBzdWxhdGUgKGUuZy4gaWYKKwkgIHlvdSB3YW50IHlvdXIgTGludXggYm94IHRvIGFjdCBhcyBhbiBJbnRlcm5ldCBnYXRld2F5IGZvciBhIHpvbyBvZgorCSAgQXBwbGVUYWxrIGNvbm5lY3RlZCBNYWNzKS4gUGxlYXNlIHNlZSB0aGUgZmlsZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwZGRwLnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGUgQXBwbGVUYWxrLUlQIHN1cHBvcnQgd2lsbCBiZSBjb21waWxlZCBpbnRvCisJICB0aGUga2VybmVsLiBJbiB0aGlzIGNhc2UsIHlvdSBjYW4gZWl0aGVyIHVzZSBlbmNhcHN1bGF0aW9uIG9yCisJICBkZWNhcHN1bGF0aW9uLCBidXQgbm90IGJvdGguIFdpdGggdGhlIGZvbGxvd2luZyB0d28gcXVlc3Rpb25zLCB5b3UKKwkgIGRlY2lkZSB3aGljaCBvbmUgeW91IHdhbnQuCisKKwkgIFRvIGNvbXBpbGUgdGhlIEFwcGxlVGFsay1JUCBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpcGRkcC4KKwkgIEluIHRoaXMgY2FzZSwgeW91IHdpbGwgYmUgYWJsZSB0byB1c2UgYm90aCBlbmNhcHN1bGF0aW9uIGFuZAorCSAgZGVjYXBzdWxhdGlvbiBzaW11bHRhbmVvdXNseSwgYnkgbG9hZGluZyB0d28gY29waWVzIG9mIHRoZSBtb2R1bGUKKwkgIGFuZCBzcGVjaWZ5aW5nIGRpZmZlcmVudCB2YWx1ZXMgZm9yIHRoZSBtb2R1bGUgb3B0aW9uIGlwZGRwX21vZGUuCisKK2NvbmZpZyBJUEREUF9FTkNBUAorCWJvb2wgIklQIHRvIEFwcGxldGFsay1JUCBFbmNhcHN1bGF0aW9uIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJUEREUAorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGUgQXBwbGVUYWxrLUlQIGNvZGUgd2lsbCBiZSBhYmxlIHRvIGVuY2Fwc3VsYXRlCisJICBJUCBwYWNrZXRzIGluc2lkZSBBcHBsZVRhbGsgZnJhbWVzOyB0aGlzIGlzIHVzZWZ1bCBpZiB5b3VyIExpbnV4IGJveAorCSAgaXMgc3R1Y2sgb24gYW4gQXBwbGVUYWxrIG5ldHdvcmsgKHdoaWNoIGhvcGVmdWxseSBjb250YWlucyBhCisJICBkZWNhcHN1bGF0b3Igc29tZXdoZXJlKS4gUGxlYXNlIHNlZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwZGRwLnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uIElmCisJICB5b3Ugc2FpZCBZIHRvICJBcHBsZVRhbGstSVAgZHJpdmVyIHN1cHBvcnQiIGFib3ZlIGFuZCB5b3Ugc2F5IFkKKwkgIGhlcmUsIHRoZW4geW91IGNhbm5vdCBzYXkgWSB0byAiQXBwbGVUYWxrLUlQIHRvIElQIERlY2Fwc3VsYXRpb24KKwkgIHN1cHBvcnQiLCBiZWxvdy4KKworY29uZmlnIElQRERQX0RFQ0FQCisJYm9vbCAiQXBwbGV0YWxrLUlQIHRvIElQIERlY2Fwc3VsYXRpb24gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElQRERQCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBBcHBsZVRhbGstSVAgY29kZSB3aWxsIGJlIGFibGUgdG8gZGVjYXBzdWxhdGUKKwkgIEFwcGxlVGFsay1JUCBmcmFtZXMgdG8gSVAgcGFja2V0czsgdGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgeW91cgorCSAgTGludXggYm94IHRvIGFjdCBhcyBhbiBJbnRlcm5ldCBnYXRld2F5IGZvciBhbiBBcHBsZVRhbGsgbmV0d29yay4KKwkgIFBsZWFzZSBzZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwZGRwLnR4dD4gZm9yIG1vcmUKKwkgIGluZm9ybWF0aW9uLiAgSWYgeW91IHNhaWQgWSB0byAiQXBwbGVUYWxrLUlQIGRyaXZlciBzdXBwb3J0IiBhYm92ZQorCSAgYW5kIHlvdSBzYXkgWSBoZXJlLCB0aGVuIHlvdSBjYW5ub3Qgc2F5IFkgdG8gIklQIHRvIEFwcGxlVGFsay1JUAorCSAgRW5jYXBzdWxhdGlvbiBzdXBwb3J0IiwgYWJvdmUuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FwcGxldGFsay9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2ZjNzA1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgZHJpdmVycy9uZXQvYXBwbGV0YWxrCisjCisKK29iai0kKENPTkZJR19JUEREUCkgKz0gaXBkZHAubworb2JqLSQoQ09ORklHX0NPUFMpICs9IGNvcHMubworb2JqLSQoQ09ORklHX0xUUEMpICs9IGx0cGMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2NvcHMuYyBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9jb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2MWMyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9jb3BzLmMKQEAgLTAsMCArMSwxMDU5IEBACisvKiAgICAgIGNvcHMuYzogTG9jYWxUYWxrIGRyaXZlciBmb3IgTGludXguCisgKgorICoJQXV0aG9yczoKKyAqICAgICAgLSBKYXkgU2NodWxpc3QgPGpzY2hsc3RAc2FtYmEub3JnPgorICoKKyAqCVdpdGggbW9yZSB0aGFuIGEgbGl0dGxlIGhlbHAgZnJvbTsKKyAqCS0gQWxhbiBDb3ggPEFsYW4uQ294QGxpbnV4Lm9yZz4gCisgKgorICogICAgICBEZXJpdmVkIGZyb206CisgKiAgICAgIC0gc2tlbGV0b24uYzogQSBuZXR3b3JrIGRyaXZlciBvdXRsaW5lIGZvciBsaW51eC4KKyAqICAgICAgICBXcml0dGVuIDE5OTMtOTQgYnkgRG9uYWxkIEJlY2tlci4KKyAqCS0gbHRwYy5jOiBBIGRyaXZlciBmb3IgdGhlIExvY2FsVGFsayBQQyBjYXJkLgorICoJICBXcml0dGVuIGJ5IEJyYWRmb3JkIFcuIEpvaG5zb24uCisgKgorICogICAgICBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgKiAgICAgIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCisgKgorICogICAgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiAgICAgIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICoJQ2hhbmdlczoKKyAqCTE5OTcwNjA4CUFsYW4gQ294CUFsbG93ZWQgZHVhbCBjYXJkIHR5cGUgc3VwcG9ydAorICoJCQkJCUNhbiBzZXQgYm9hcmQgdHlwZSBpbiBpbnNtb2QKKyAqCQkJCQlIb29rcyBmb3IgY29wc19zZXR1cCByb3V0aW5lCisgKgkJCQkJKG5vdCB5ZXQgaW1wbGVtZW50ZWQpLgorICoJMTk5NzExMDEJSmF5IFNjaHVsaXN0CUZpeGVzIGZvciBtdWx0aXBsZSBsdCogZGV2aWNlcy4KKyAqCTE5OTgwNjA3CVN0ZXZlbiBIaXJzY2gJRml4ZWQgdGhlIGJhZGx5IGJyb2tlbiBzdXBwb3J0CisgKgkJCQkJZm9yIFRhbmdlbnQgdHlwZSBjYXJkcy4gT25seQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RlZCBvbiBEYXlzdGFyIExUMjAwLiBTb21lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW51cCBvZiBmb3JtYXR0aW5nIGFuZCBwcm9ncmFtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWMuICBBZGRlZCBlbWFjcyAnbG9jYWwtdmFycycKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cCBmb3IgSmF5J3MgYnJhY2Ugc3R5bGUuCisgKgkyMDAwMDIxMQlBbGFuIENveAlDbGVhbmVkIHVwIGZvciBzb2Z0bmV0CisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb24gPQorImNvcHMuYzp2MC4wNCA2LzcvOTggSmF5IFNjaHVsaXN0IDxqc2NobHN0QHNhbWJhLm9yZz5cbiI7CisvKgorICogIFNvdXJjZXM6CisgKiAgICAgIENPUFMgTG9jYWx0YWxrIFNESy4gVGhpcyBwcm92aWRlcyBhbG1vc3QgYWxsIG9mIHRoZSBpbmZvcm1hdGlvbgorICogICAgICBuZWVkZWQuCisgKi8KKworLyoKKyAqIGluc21vZC9tb2Rwcm9iZSBjb25maWd1cmFibGUgc3R1ZmYuCisgKgktIElPIFBvcnQsIGNob29zZSBvbmUgeW91ciBjYXJkIHN1cHBvcnRzIG9yIDAgaWYgeW91IGRhcmUuCisgKgktIElSUSwgYWxzbyBjaG9vc2Ugb25lIHlvdXIgY2FyZCBzdXBwb3J0cyBvciBub3RoaW5nIGFuZCBsZXQKKyAqCSAgdGhlIGRyaXZlciBmaWd1cmUgaXQgb3V0LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9sdGFsay5oPgkvKiBGb3IgbHRhbGtfc2V0dXAoKSAqLworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIEZvciB1ZGVsYXkoKSAqLworI2luY2x1ZGUgPGxpbnV4L2F0YWxrLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNpbmNsdWRlICJjb3BzLmgiCQkvKiBPdXIgU3R1ZmYgKi8KKyNpbmNsdWRlICJjb3BzX2x0ZHJ2LmgiCQkvKiBGaXJtd2FyZSBjb2RlIGZvciBUYW5nZW50IHR5cGUgY2FyZHMuICovCisjaW5jbHVkZSAiY29wc19mZmRydi5oIgkJLyogRmlybXdhcmUgY29kZSBmb3IgRGF5bmEgdHlwZSBjYXJkcy4gKi8KKworLyoKKyAqICAgICAgVGhlIG5hbWUgb2YgdGhlIGNhcmQuIElzIHVzZWQgZm9yIG1lc3NhZ2VzIGFuZCBpbiB0aGUgcmVxdWVzdHMgZm9yCisgKiAgICAgIGlvIHJlZ2lvbnMsIGlycXMgYW5kIGRtYSBjaGFubmVscworICovCisKK3N0YXRpYyBjb25zdCBjaGFyICpjYXJkbmFtZSA9ICJjb3BzIjsKKworI2lmZGVmIENPTkZJR19DT1BTX0RBWU5BCitzdGF0aWMgaW50IGJvYXJkX3R5cGUgPSBEQVlOQTsJLyogTW9kdWxlIGV4cG9ydGVkICovCisjZWxzZQorc3RhdGljIGludCBib2FyZF90eXBlID0gVEFOR0VOVDsKKyNlbmRpZgorCitzdGF0aWMgaW50IGlvID0gMHgyNDA7CQkvKiBEZWZhdWx0IElPIGZvciBEYXluYSAqLworc3RhdGljIGludCBpcnEgPSA1OwkJLyogRGVmYXVsdCBJUlEgKi8KKworLyoKKyAqCUNPUFMgQXV0b3Byb2JlIGluZm9ybWF0aW9uLgorICoJUmlnaHQgbm93IGlmIHBvcnQgYWRkcmVzcyBpcyByaWdodCBidXQgSVJRIGlzIG5vdCA1IHRoaXMgd2lsbAorICogICAgICByZXR1cm4gYSA1IG5vIG1hdHRlciB3aGF0IHNpbmNlIHdlIHdpbGwgc3RpbGwgZ2V0IGEgc3RhdHVzIHJlc3BvbnNlLgorICogICAgICBOZWVkIG9uZSBtb3JlIGFkZGl0aW9uYWwgY2hlY2sgdG8gbmFycm93IGRvd24gYWZ0ZXIgd2UgaGF2ZSBnb3R0ZW4KKyAqICAgICAgdGhlIGlvYWRkci4gQnV0IHNpbmNlIG9ubHkgb3RoZXIgcG9zc2libGUgSVJRcyBpcyAzIGFuZCA0IHNvIG5vIHJlYWwKKyAqCWh1cnJ5IG9uIHRoaXMuIEkgKlNUUk9OR0xZKiByZWNvbW1lbmQgdXNpbmcgSVJRIDUgZm9yIHlvdXIgY2FyZCB3aXRoCisgKgl0aGlzIGRyaXZlci4KKyAqIAorICoJVGhpcyBkcml2ZXIgaGFzIDIgbW9kZXMgYW5kIHRoZXkgYXJlOiBEYXluYSBtb2RlIGFuZCBUYW5nZW50IG1vZGUuCisgKglFYWNoIG1vZGUgY29ycmVzcG9uZHMgd2l0aCB0aGUgdHlwZSBvZiBjYXJkLiBJdCBoYXMgYmVlbiBmb3VuZAorICoJdGhhdCB0aGVyZSBhcmUgMiBtYWluIHR5cGVzIG9mIGNhcmRzIGFuZCBhbGwgb3RoZXIgY2FyZHMgYXJlCisgKgl0aGUgc2FtZSBhbmQganVzdCBoYXZlIGRpZmZlcmVudCBuYW1lcyBvciBvbmx5IGhhdmUgbWlub3IgZGlmZmVyZW5jZXMKKyAqCXN1Y2ggYXMgbW9yZSBJTyBwb3J0cy4gQXMgdGhpcyBkcml2ZXIgaXMgdGVzdGVkIGl0IHdpbGwKKyAqCWJlY29tZSBtb3JlIGNsZWFyIG9uIGV4YWN0bHkgd2hhdCBjYXJkcyBhcmUgc3VwcG9ydGVkLiBUaGUgZHJpdmVyCisgKglkZWZhdWx0cyB0byB1c2luZyBEYXluYSBtb2RlLiBUbyBjaGFuZ2UgdGhlIGRyaXZlcnMgbW9kZSwgc2ltcGx5CisgKglzZWxlY3QgRGF5bmEgb3IgVGFuZ2VudCBtb2RlIHdoZW4gY29uZmlndXJpbmcgdGhlIGtlcm5lbC4KKyAqCisgKiAgICAgIFRoaXMgZHJpdmVyIHNob3VsZCBzdXBwb3J0OgorICogICAgICBUQU5HRU5UIGRyaXZlciBtb2RlOgorICogICAgICAgICAgICAgIFRhbmdlbnQgQVRCLUlJLCBOb3ZlbGwgTkwtMTAwMCwgRGF5c3RhciBEaWdpdGFsIExULTIwMCwKKyAqCQlDT1BTIExULTEKKyAqICAgICAgREFZTkEgZHJpdmVyIG1vZGU6CisgKiAgICAgICAgICAgICAgRGF5bmEgREwyMDAwL0RheW5hVGFsayBQQyAoSGFsZiBMZW5ndGgpLCBDT1BTIExULTk1LCAKKyAqCQlGYXJhbGxvbiBQaG9uZU5FVCBQQyBJSUksIEZhcmFsbG9uIFBob25lTkVUIFBDIElJCisgKglPdGhlciBjYXJkcyBwb3NzaWJseSBzdXBwb3J0ZWQgbW9kZSB1bmtvd24gdGhvdWdoOgorICoJCURheW5hIERMMjAwMCAoRnVsbCBsZW5ndGgpLCBDT1BTIExUL00gKE1pY3JvLUNoYW5uZWwpCisgKgorICoJQ2FyZHMgTk9UIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciBidXQgc3VwcG9ydGVkIGJ5IHRoZSBsdHBjLmMKKyAqCWRyaXZlciB3cml0dGVuIGJ5IEJyYWRmb3JkIFcuIEpvaG5zb24gPGpvaG5zMzkzQG1hcm9vbi50Yy51bW4uZWR1PgorICoJCUZhcmFsbG9uIFBob25lTkVUIFBDCisgKgkJT3JpZ2luYWwgQXBwbGUgTG9jYWxUYWxrIFBDIGNhcmQKKyAqIAorICogICAgICBOLkIuCisgKgorICogICAgICBUaGUgRGF5c3RhciBEaWdpdGFsIExUMjAwIGJvYXJkcyBkbyBub3Qgc3VwcG9ydCBpbnRlcnJ1cHQtZHJpdmVuCisgKiAgICAgIElPLiAgWW91IG11c3Qgc3BlY2lmeSAnaXJxPTB4ZmYnIGFzIGEgbW9kdWxlIHBhcmFtZXRlciB0byBpbnZva2UKKyAqICAgICAgcG9sbGVkIG1vZGUuICBJIGFsc28gYmVsaWV2ZSB0aGF0IHRoZSBwb3J0IHByb2JpbmcgbG9naWMgaXMgcXVpdGUKKyAqICAgICAgZGFuZ2Vyb3VzIGF0IGJlc3QgYW5kIGNlcnRhaW5seSBob3BlbGVzcyBmb3IgYSBwb2xsZWQgY2FyZC4gIEJlc3QgdG8gCisgKiAgICAgIHNwZWNpZnkgYm90aC4gLSBTdGV2ZSBILgorICoKKyAqLworCisvKgorICogWmVybyB0ZXJtaW5hdGVkIGxpc3Qgb2YgSU8gcG9ydHMgdG8gcHJvYmUuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBwb3J0c1tdID0geyAKKwkweDI0MCwgMHgzNDAsIDB4MjAwLCAweDIxMCwgMHgyMjAsIDB4MjMwLCAweDI2MCwgCisJMHgyQTAsIDB4MzAwLCAweDMxMCwgMHgzMjAsIDB4MzMwLCAweDM1MCwgMHgzNjAsCisJMAorfTsKKworLyoKKyAqIFplcm8gdGVybWluYXRlZCBsaXN0IG9mIElSUSBwb3J0cyB0byBwcm9iZS4KKyAqLworCitzdGF0aWMgaW50IGNvcHNfaXJxbGlzdFtdID0geworCTUsIDQsIDMsIDAgCit9OworCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgY29wc190aW1lcjsKKworLyogdXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgMiBmb3IgZGVidWcsIDMgZm9yIHZlcmJvc2UgZGVidWcgKi8KKyNpZm5kZWYgQ09QU19ERUJVRworI2RlZmluZSBDT1BTX0RFQlVHIDEgCisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29wc19kZWJ1ZyA9IENPUFNfREVCVUc7CisKKy8qIFRoZSBudW1iZXIgb2YgbG93IEkvTyBwb3J0cyB1c2VkIGJ5IHRoZSBjYXJkLiAqLworI2RlZmluZSBDT1BTX0lPX0VYVEVOVCAgICAgICA4CisKKy8qIEluZm9ybWF0aW9uIHRoYXQgbmVlZHMgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4gKi8KKworc3RydWN0IGNvcHNfbG9jYWwKK3sKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisgICAgICAgIGludCBib2FyZDsJCQkvKiBIb2xkcyB3aGF0IGJvYXJkIHR5cGUgaXMuICovCisJaW50IG5vZGVpZDsJCQkvKiBTZXQgdG8gMSBvbmNlIGhhdmUgbm9kZWlkLiAqLworICAgICAgICB1bnNpZ25lZCBjaGFyIG5vZGVfYWNxdWlyZTsJLyogTm9kZSBJRCB3aGVuIGFjcXVpcmVkLiAqLworICAgICAgICBzdHJ1Y3QgYXRhbGtfYWRkciBub2RlX2FkZHI7CS8qIEZ1bGwgbm9kZSBhZGRyZXNzICovCisJc3BpbmxvY2tfdCBsb2NrOwkJLyogUlgvVFggbG9jayAqLworfTsKKworLyogSW5kZXggdG8gZnVuY3Rpb25zLCBhcyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLworc3RhdGljIGludCAgY29wc19wcm9iZTEgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpOworc3RhdGljIGludCAgY29wc19pcnEgKGludCBpb2FkZHIsIGludCBib2FyZCk7CisKK3N0YXRpYyBpbnQgIGNvcHNfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICBjb3BzX2p1bXBzdGFydCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBjb3BzX3Jlc2V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc2xlZXApOworc3RhdGljIHZvaWQgY29wc19sb2FkIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIGNvcHNfbm9kZWlkIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbm9kZWlkKTsKKworc3RhdGljIGlycXJldHVybl90IGNvcHNfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIGNvcHNfcG9sbCAodW5zaWduZWQgbG9uZyBsdGRldik7CitzdGF0aWMgdm9pZCBjb3BzX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBjb3BzX3J4IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIGNvcHNfc2VuZF9wYWNrZXQgKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIGNvcHNfaGFyZF9oZWFkZXIgKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLCB2b2lkICpkYWRkciwgdm9pZCAqc2FkZHIsIAorCQkJICAgICAgdW5zaWduZWQgbGVuKTsKKworc3RhdGljIGludCAgY29wc19pb2N0bCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgaW50ICBjb3BzX2Nsb3NlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqY29wc19nZXRfc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2LT5pcnEpCisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBDT1BTX0lPX0VYVEVOVCk7Cit9CisKKy8qCisgKiAgICAgIENoZWNrIGZvciBhIG5ldHdvcmsgYWRhcHRvciBvZiB0aGlzIHR5cGUsIGFuZCByZXR1cm4gJzAnIGlmZiBvbmUgZXhpc3RzLgorICogICAgICBJZiBkZXYtPmJhc2VfYWRkciA9PSAwLCBwcm9iZSBhbGwgbGlrZWx5IGxvY2F0aW9ucy4KKyAqICAgICAgSWYgZGV2LT5iYXNlX2FkZHIgaW4gWzEuLjB4MWZmXSwgYWx3YXlzIHJldHVybiBmYWlsdXJlLgorICogICAgICAgIG90aGVyd2lzZSBnbyB3aXRoIHdoYXQgd2UgcGFzcyBpbi4KKyAqLworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgY29wc19wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXVuc2lnbmVkICpwb3J0OworCWludCBiYXNlX2FkZHI7CisJaW50IGVyciA9IDA7CisKKwlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBjb3BzX2xvY2FsKSwgImx0JWQiLCBsdGFsa19zZXR1cCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWYgKHVuaXQgPj0gMCkgeworCQlzcHJpbnRmKGRldi0+bmFtZSwgImx0JWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwkJaXJxID0gZGV2LT5pcnE7CisJCWJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworCX0gZWxzZSB7CisJCWJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyID0gaW87CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaWYgKGJhc2VfYWRkciA+IDB4MWZmKSB7ICAgIC8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KKwkJZXJyID0gY29wc19wcm9iZTEoZGV2LCBiYXNlX2FkZHIpOworCX0gZWxzZSBpZiAoYmFzZV9hZGRyICE9IDApIHsgLyogRG9uJ3QgcHJvYmUgYXQgYWxsLiAqLworCQllcnIgPSAtRU5YSU87CisJfSBlbHNlIHsKKwkJLyogRklYTUUgIERvZXMgdGhpcyByZWFsbHkgd29yayBmb3IgY2FyZHMgd2hpY2ggZ2VuZXJhdGUgaXJxPworCQkgKiBJdCdzIGRlZmluaXRlbHkgTi5HLiBmb3IgcG9sbGVkIFRhbmdlbnQuIHNoCisJCSAqIERheW5hIGNhcmRzIGRvbid0IGF1dG9wcm9iZSB3ZWxsIGF0IGFsbCwgYnV0IGlmIHlvdXIgY2FyZCBpcworCQkgKiBhdCBJUlEgNSAmIElPIDB4MjQwIHdlIGZpbmQgaXQgZXZlcnkgdGltZS4gOykgSlMKKwkJICovCisJCWZvciAocG9ydCA9IHBvcnRzOyAqcG9ydCAmJiBjb3BzX3Byb2JlMShkZXYsICpwb3J0KSA8IDA7IHBvcnQrKykKKwkJCTsKKwkJaWYgKCEqcG9ydCkKKwkJCWVyciA9IC1FTk9ERVY7CisJfQorCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlyZXR1cm4gZGV2Oworb3V0MToKKwljbGVhbnVwX2NhcmQoZGV2KTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qCisgKiAgICAgIFRoaXMgaXMgdGhlIHJlYWwgcHJvYmUgcm91dGluZS4gTGludXggaGFzIGEgaGlzdG9yeSBvZiBmcmllbmRseSBkZXZpY2UKKyAqICAgICAgcHJvYmVzIG9uIHRoZSBJU0EgYnVzLiBBIGdvb2QgZGV2aWNlIHByb2JlcyBhdm9pZHMgZG9pbmcgd3JpdGVzLCBhbmQKKyAqICAgICAgdmVyaWZpZXMgdGhhdCB0aGUgY29ycmVjdCBkZXZpY2UgZXhpc3RzIGFuZCBmdW5jdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGNvcHNfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpCit7CisgICAgICAgIHN0cnVjdCBjb3BzX2xvY2FsICpscDsKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCWludCBib2FyZCA9IGJvYXJkX3R5cGU7CisJaW50IHJldHZhbDsKKwkKKyAgICAgICAgaWYoY29wc19kZWJ1ZyAmJiB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsoIiVzIiwgdmVyc2lvbik7CisKKwkvKiBHcmFiIHRoZSByZWdpb24gc28gbm8gb25lIGVsc2UgdHJpZXMgdG8gcHJvYmUgb3VyIGlvcG9ydHMuICovCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIENPUFNfSU9fRVhURU5ULCBkZXYtPm5hbWUpKQorCQlyZXR1cm4gLUVCVVNZOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNpbmNlIHRoaXMgYm9hcmQgaGFzIGp1bXBlcmVkIGludGVycnVwdHMsIGFsbG9jYXRlIHRoZSBpbnRlcnJ1cHQKKyAgICAgICAgICogdmVjdG9yIG5vdy4gVGhlcmUgaXMgbm8gcG9pbnQgaW4gd2FpdGluZyBzaW5jZSBubyBvdGhlciBkZXZpY2UKKyAgICAgICAgICogY2FuIHVzZSB0aGUgaW50ZXJydXB0LCBhbmQgdGhpcyBtYXJrcyB0aGUgaXJxIGFzIGJ1c3kuIEp1bXBlcmVkCisgICAgICAgICAqIGludGVycnVwdHMgYXJlIHR5cGljYWxseSBub3QgcmVwb3J0ZWQgYnkgdGhlIGJvYXJkcywgYW5kIHdlIG11c3QKKyAgICAgICAgICogdXNlZCBBdXRvSVJRIHRvIGZpbmQgdGhlbS4KKwkgKi8KKwlkZXYtPmlycSA9IGlycTsKKwlzd2l0Y2ggKGRldi0+aXJxKQorCXsKKwkJY2FzZSAwOgorCQkJLyogQ09QUyBBdXRvSVJRIHJvdXRpbmUgKi8KKwkJCWRldi0+aXJxID0gY29wc19pcnEoaW9hZGRyLCBib2FyZCk7CisJCQlpZiAoZGV2LT5pcnEpCisJCQkJYnJlYWs7CisJCQkvKiBObyBJUlEgZm91bmQgb24gdGhpcyBwb3J0LCBmYWxsdGhyb3VnaCAqLworCQljYXNlIDE6CisJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJZ290byBlcnJfb3V0OworCisJCS8qIEZpeHVwIGZvciB1c2VycyB0aGF0IGRvbid0IGtub3cgdGhhdCBJUlEgMiBpcyByZWFsbHkKKwkJICogSVJRIDksIG9yIGRvbid0IGtub3cgd2hpY2ggb25lIHRvIHNldC4KKwkJICovCisJCWNhc2UgMjoKKwkJCWRldi0+aXJxID0gOTsKKwkJCWJyZWFrOworCisJCS8qIFBvbGxlZCBvcGVyYXRpb24gcmVxdWVzdGVkLiBBbHRob3VnaCBpcnEgb2YgemVybyBwYXNzZWQgYXMKKwkJICogYSBwYXJhbWV0ZXIgdGVsbHMgdGhlIGluaXQgcm91dGluZXMgdG8gcHJvYmUsIHdlJ2xsCisJCSAqIG92ZXJsb2FkIGl0IHRvIGRlbm90ZSBwb2xsZWQgb3BlcmF0aW9uIGF0IHJ1bnRpbWUuCisJCSAqLworCQljYXNlIDB4ZmY6CisJCQlkZXYtPmlycSA9IDA7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJLyogUmVzZXJ2ZSBhbnkgYWN0dWFsIGludGVycnVwdC4gKi8KKwlpZiAoZGV2LT5pcnEpIHsKKwkJcmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZjb3BzX2ludGVycnVwdCwgMCwgZGV2LT5uYW1lLCBkZXYpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBlcnJfb3V0OworCX0KKworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCisgICAgICAgIGxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgbWVtc2V0KGxwLCAwLCBzaXplb2Yoc3RydWN0IGNvcHNfbG9jYWwpKTsKKyAgICAgICAgc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKworCS8qIENvcHkgbG9jYWwgYm9hcmQgdmFyaWFibGUgdG8gbHAgc3RydWN0LiAqLworCWxwLT5ib2FyZCAgICAgICAgICAgICAgID0gYm9hcmQ7CisKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCAgICA9IGNvcHNfc2VuZF9wYWNrZXQ7CisJZGV2LT50eF90aW1lb3V0CQk9IGNvcHNfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gSFogKiAyOworCWRldi0+aGFyZF9oZWFkZXIJPSBjb3BzX2hhcmRfaGVhZGVyOworICAgICAgICBkZXYtPmdldF9zdGF0cyAgICAgICAgICA9IGNvcHNfZ2V0X3N0YXRzOworCWRldi0+b3BlbiAgICAgICAgICAgICAgID0gY29wc19vcGVuOworICAgICAgICBkZXYtPnN0b3AgICAgICAgICAgICAgICA9IGNvcHNfY2xvc2U7CisgICAgICAgIGRldi0+ZG9faW9jdGwgICAgICAgICAgID0gY29wc19pb2N0bDsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHNldF9tdWx0aWNhc3RfbGlzdDsKKyAgICAgICAgZGV2LT5tY19saXN0ICAgICAgICAgICAgPSBOVUxMOworCisJLyogVGVsbCB0aGUgdXNlciB3aGVyZSB0aGUgY2FyZCBpcyBhbmQgd2hhdCBtb2RlIHdlJ3JlIGluLiAqLworCWlmKGJvYXJkPT1EQVlOQSkKKwkJcHJpbnRrKCIlczogJXMgYXQgJSMzeCwgdXNpbmcgSVJRICVkLCBpbiBEYXluYSBtb2RlLlxuIiwgCisJCQlkZXYtPm5hbWUsIGNhcmRuYW1lLCBpb2FkZHIsIGRldi0+aXJxKTsKKwlpZihib2FyZD09VEFOR0VOVCkgeworCQlpZihkZXYtPmlycSkKKwkJCXByaW50aygiJXM6ICVzIGF0ICUjM3gsIElSUSAlZCwgaW4gVGFuZ2VudCBtb2RlXG4iLCAKKwkJCQlkZXYtPm5hbWUsIGNhcmRuYW1lLCBpb2FkZHIsIGRldi0+aXJxKTsKKwkJZWxzZQorCQkJcHJpbnRrKCIlczogJXMgYXQgJSMzeCwgdXNpbmcgcG9sbGVkIElPLCBpbiBUYW5nZW50IG1vZGUuXG4iLCAKKwkJCQlkZXYtPm5hbWUsIGNhcmRuYW1lLCBpb2FkZHIpOworCisJfQorICAgICAgICByZXR1cm4gMDsKKworZXJyX291dDoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIENPUFNfSU9fRVhURU5UKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjb3BzX2lycSAoaW50IGlvYWRkciwgaW50IGJvYXJkKQoreyAgICAgICAvKgorICAgICAgICAgKiBUaGlzIGRvZXMgbm90IHVzZSB0aGUgSVJRIHRvIGRldGVybWluZSB3aGVyZSB0aGUgSVJRIGlzLiBXZSBqdXN0CisgICAgICAgICAqIGFzc3VtZSB0aGF0IHdoZW4gd2UgZ2V0IGEgY29ycmVjdCBzdGF0dXMgcmVzcG9uc2UgdGhhdCBpdCdzIHRoZSBJUlEuCisgICAgICAgICAqIFRoaXMgcmVhbGx5IGp1c3QgdmVyaWZpZXMgdGhlIElPIHBvcnQgYnV0IHNpbmNlIHdlIG9ubHkgaGF2ZSBhY2Nlc3MKKyAgICAgICAgICogdG8gc3VjaCBhIHNtYWxsIG51bWJlciBvZiBJUlFzICg1LCA0LCAzKSB0aGlzIGlzIG5vdCBiYWQuCisgICAgICAgICAqIFRoaXMgd2lsbCBwcm9iYWJseSBub3Qgd29yayBmb3IgbW9yZSB0aGFuIG9uZSBjYXJkLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IGlycWFkZHI9MDsKKyAgICAgICAgaW50IGksIHgsIHN0YXR1czsKKworICAgICAgICBpZihib2FyZD09REFZTkEpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRiKDAsIGlvYWRkcitEQVlOQV9SRVNFVCk7CisgICAgICAgICAgICAgICAgaW5iKGlvYWRkcitEQVlOQV9SRVNFVCk7CisgICAgICAgICAgICAgICAgbWRlbGF5KDMzMyk7CisgICAgICAgIH0KKyAgICAgICAgaWYoYm9hcmQ9PVRBTkdFTlQpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmIoaW9hZGRyKTsKKyAgICAgICAgICAgICAgICBvdXRiKDAsIGlvYWRkcik7CisgICAgICAgICAgICAgICAgb3V0YigwLCBpb2FkZHIrVEFOR19SRVNFVCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IoaT0wOyBjb3BzX2lycWxpc3RbaV0gIT0wOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpcnFhZGRyID0gY29wc19pcnFsaXN0W2ldOworICAgICAgICAgICAgICAgIGZvcih4ID0gMHhGRkZGOyB4PjA7IHggLS0pICAgIC8qIHdhaXQgZm9yIHJlc3BvbnNlICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoYm9hcmQ9PURBWU5BKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAoaW5iKGlvYWRkcitEQVlOQV9DQVJEX1NUQVRVUykmMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0YXR1cyA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpcnFhZGRyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoYm9hcmQ9PVRBTkdFTlQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChpbmIoaW9hZGRyK1RBTkdfQ0FSRF9TVEFUVVMpJiBUQU5HX1RYX1JFQURZKSAhPTApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlycWFkZHI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOyAgICAgICAvKiBubyBJUlEgZm91bmQgKi8KK30KKworLyoKKyAqIE9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuIFRoaXMgaXMgY2FsbGVkIChpbiB0aGUgY3VycmVudCBrZXJuZWwpCisgKiBzb21ldGltZSBhZnRlciBib290aW5nIHdoZW4gdGhlICdpZmNvbmZpZycgcHJvZ3JhbSBpcyBydW4uCisgKi8KK3N0YXRpYyBpbnQgY29wc19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGNvcHNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmKGRldi0+aXJxPT0wKQorCXsKKwkJLyoKKwkJICogSSBkb24ndCBrbm93IGlmIHRoZSBEYXluYS1zdHlsZSBib2FyZHMgc3VwcG9ydCBwb2xsZWQgCisJCSAqIG9wZXJhdGlvbi4gIEZvciBub3csIG9ubHkgYWxsb3cgaXQgZm9yIFRhbmdlbnQuCisJCSAqLworCQlpZihscC0+Ym9hcmQ9PVRBTkdFTlQpCS8qIFBvbGwgMjAgdGltZXMgcGVyIHNlY29uZCAqLworCQl7CisJCSAgICBpbml0X3RpbWVyKCZjb3BzX3RpbWVyKTsKKwkJICAgIGNvcHNfdGltZXIuZnVuY3Rpb24gPSBjb3BzX3BvbGw7CisJCSAgICBjb3BzX3RpbWVyLmRhdGEgCT0gKHVuc2lnbmVkIGxvbmcpZGV2OworCQkgICAgY29wc190aW1lci5leHBpcmVzIAk9IGppZmZpZXMgKyBIWi8yMDsKKwkJICAgIGFkZF90aW1lcigmY29wc190aW1lcik7CisJCX0gCisJCWVsc2UgCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBObyBpcnEgbGluZSBzZXRcbiIsIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCX0KKworCWNvcHNfanVtcHN0YXJ0KGRldik7CS8qIFN0YXJ0IHRoZSBjYXJkIHVwLiAqLworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKglUaGlzIGFsbG93cyBmb3IgYSBkeW5hbWljIHN0YXJ0L3Jlc3RhcnQgb2YgdGhlIGVudGlyZSBjYXJkLgorICovCitzdGF0aWMgaW50IGNvcHNfanVtcHN0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNvcHNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qCisgICAgICAgICAqICAgICAgT25jZSB0aGUgY2FyZCBoYXMgdGhlIGZpcm13YXJlIGxvYWRlZCBhbmQgaGFzIGFjcXVpcmVkCisgICAgICAgICAqICAgICAgdGhlIG5vZGVpZCwgaWYgaXQgaXMgcmVzZXQgaXQgd2lsbCBsb3NlIGl0IGFsbC4KKyAgICAgICAgICovCisgICAgICAgIGNvcHNfcmVzZXQoZGV2LDEpOwkvKiBOZWVkIHRvIHJlc2V0IGNhcmQgYmVmb3JlIGxvYWQgZmlybXdhcmUuICovCisgICAgICAgIGNvcHNfbG9hZChkZXYpOwkJLyogTG9hZCB0aGUgZmlybXdhcmUuICovCisKKwkvKgorCSAqCUlmIGF0YWxrZCBhbHJlYWR5IGdhdmUgdXMgYSBub2RlaWQgd2Ugd2lsbCB1c2UgdGhhdAorCSAqCW9uZSBhZ2FpbiwgZWxzZSB3ZSB3YWl0IGZvciBhdGFsa2QgdG8gZ2l2ZSB1cyBhIG5vZGVpZAorCSAqCWluIGNvcHNfaW9jdGwuIFRoaXMgbWF5IGNhdXNlIGEgcHJvYmxlbSBpZiBzb21lb25lIHN0ZWFscworCSAqCW91ciBub2RlaWQgd2hpbGUgd2UgYXJlIHJlc2V0dGluZy4KKwkgKi8JCisJaWYobHAtPm5vZGVpZCA9PSAxKQorCQljb3BzX25vZGVpZChkZXYsbHAtPm5vZGVfYWNxdWlyZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGFuZ2VudF93YWl0X3Jlc2V0KGludCBpb2FkZHIpCit7CisJaW50IHRpbWVvdXQ9MDsKKworCXdoaWxlKHRpbWVvdXQrKyA8IDUgJiYgKGluYihpb2FkZHIrVEFOR19DQVJEX1NUQVRVUykmVEFOR19UWF9SRUFEWSk9PTApCisJCW1kZWxheSgxKTsgICAvKiBXYWl0IDEgc2Vjb25kICovCit9CisKKy8qCisgKiAgICAgIFJlc2V0IHRoZSBMb2NhbFRhbGsgYm9hcmQuCisgKi8KK3N0YXRpYyB2b2lkIGNvcHNfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNsZWVwKQoreworICAgICAgICBzdHJ1Y3QgY29wc19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgaW9hZGRyPWRldi0+YmFzZV9hZGRyOworCisgICAgICAgIGlmKGxwLT5ib2FyZD09VEFOR0VOVCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGluYihpb2FkZHIpOwkJLyogQ2xlYXIgcmVxdWVzdCBsYXRjaC4gKi8KKyAgICAgICAgICAgICAgICBvdXRiKDAsaW9hZGRyKTsJCS8qIENsZWFyIHRoZSBUQU5HX1RYX1JFQURZIGZsb3AuICovCisgICAgICAgICAgICAgICAgb3V0YigwLCBpb2FkZHIrVEFOR19SRVNFVCk7CS8qIFJlc2V0IHRoZSBhZGFwdGVyLiAqLworCisJCXRhbmdlbnRfd2FpdF9yZXNldChpb2FkZHIpOworICAgICAgICAgICAgICAgIG91dGIoMCwgaW9hZGRyK1RBTkdfQ0xFQVJfSU5UKTsKKyAgICAgICAgfQorICAgICAgICBpZihscC0+Ym9hcmQ9PURBWU5BKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0YigwLCBpb2FkZHIrREFZTkFfUkVTRVQpOwkvKiBBc3NlcnQgdGhlIHJlc2V0IHBvcnQgKi8KKyAgICAgICAgICAgICAgICBpbmIoaW9hZGRyK0RBWU5BX1JFU0VUKTsJLyogQ2xlYXIgdGhlIHJlc2V0ICovCisgICAgICAgICAgICAgICAgaWYoc2xlZXApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBzbmFwPWppZmZpZXM7CisKKwkJCS8qIExldCBjYXJkIGZpbmlzaCBpbml0aWFsaXppbmcsIGFib3V0IDEvMyBzZWNvbmQgKi8KKwkgICAgICAgICAgICAgICAgd2hpbGUoamlmZmllcy1zbmFwPEhaLzMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG1kZWxheSgzMzMpOworICAgICAgICB9CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgY29wc19sb2FkIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgaWZyZXEgaWZyOworICAgICAgICBzdHJ1Y3QgbHRmaXJtd2FyZSAqbHRmPSAoc3RydWN0IGx0ZmlybXdhcmUgKikmaWZyLmlmcl9pZnJ1OworICAgICAgICBzdHJ1Y3QgY29wc19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgaW9hZGRyPWRldi0+YmFzZV9hZGRyOworCWludCBsZW5ndGgsIGkgPSAwOworCisgICAgICAgIHN0cmNweShpZnIuaWZyX25hbWUsImx0MCIpOworCisgICAgICAgIC8qIEdldCBjYXJkJ3MgZmlybXdhcmUgY29kZSBhbmQgZG8gc29tZSBjaGVja3Mgb24gaXQuICovCisjaWZkZWYgQ09ORklHX0NPUFNfREFZTkEgICAgICAgIAorICAgICAgICBpZihscC0+Ym9hcmQ9PURBWU5BKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgbHRmLT5sZW5ndGg9c2l6ZW9mKGZmZHJ2X2NvZGUpOworICAgICAgICAgICAgICAgIGx0Zi0+ZGF0YT1mZmRydl9jb2RlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAgICAgICAgCisjaWZkZWYgQ09ORklHX0NPUFNfVEFOR0VOVAorICAgICAgICBpZihscC0+Ym9hcmQ9PVRBTkdFTlQpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsdGYtPmxlbmd0aD1zaXplb2YobHRkcnZfY29kZSk7CisgICAgICAgICAgICAgICAgbHRmLT5kYXRhPWx0ZHJ2X2NvZGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmCisJeworCQlwcmludGsoS0VSTl9JTkZPICIlczsgdW5zdXBwb3J0ZWQgYm9hcmQgdHlwZS5cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJCisgICAgICAgIC8qIENoZWNrIHRvIG1ha2Ugc3VyZSBmaXJtd2FyZSBpcyBjb3JyZWN0IGxlbmd0aC4gKi8KKyAgICAgICAgaWYobHAtPmJvYXJkPT1EQVlOQSAmJiBsdGYtPmxlbmd0aCE9NTk4MykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGaXJtd2FyZSBpcyBub3QgbGVuZ3RoIG9mIEZGRFJWLkJJTi5cbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmKGxwLT5ib2FyZD09VEFOR0VOVCAmJiBsdGYtPmxlbmd0aCE9MjUwMSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGaXJtd2FyZSBpcyBub3QgbGVuZ3RoIG9mIERSVkNPREUuQklOLlxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZihscC0+Ym9hcmQ9PURBWU5BKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiAgICAgIFdlIG11c3Qgd2FpdCBmb3IgYSBzdGF0dXMgcmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgKiAgICAgIHdpdGggdGhlIERBWU5BIGJvYXJkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHdoaWxlKCsraTw2NTUzNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIGlmKChpbmIoaW9hZGRyK0RBWU5BX0NBUkRfU1RBVFVTKSYzKT09MSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoaT09NjU1MzYpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiAgICAgIFVwbG9hZCB0aGUgZmlybXdhcmUgYW5kIGtpY2suIEJ5dGUtYnktYnl0ZSB3b3JrcyBuaWNlbHkgaGVyZS4KKyAgICAgICAgICovCisJaT0wOworICAgICAgICBsZW5ndGggPSBsdGYtPmxlbmd0aDsKKyAgICAgICAgd2hpbGUobGVuZ3RoLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRiKGx0Zi0+ZGF0YVtpXSwgaW9hZGRyKTsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKworCWlmKGNvcHNfZGVidWcgPiAxKQorCQlwcmludGsoIiVzOiBVcGxvYWRlZCBmaXJtd2FyZSAtICVkIGJ5dGVzIG9mICVkIGJ5dGVzLlxuIiwgCisJCQlkZXYtPm5hbWUsIGksIGx0Zi0+bGVuZ3RoKTsKKworICAgICAgICBpZihscC0+Ym9hcmQ9PURBWU5BKSAJLyogVGVsbCBEYXluYSB0byBydW4gdGhlIGZpcm13YXJlIGNvZGUuICovCisgICAgICAgICAgICAgICAgb3V0YigxLCBpb2FkZHIrREFZTkFfSU5UX0NBUkQpOworCWVsc2UJCQkvKiBUZWxsIFRhbmcgdG8gcnVuIHRoZSBmaXJtd2FyZSBjb2RlLiAqLworCQlpbmIoaW9hZGRyKTsKKworICAgICAgICBpZihscC0+Ym9hcmQ9PVRBTkdFTlQpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0YW5nZW50X3dhaXRfcmVzZXQoaW9hZGRyKTsKKyAgICAgICAgICAgICAgICBpbmIoaW9hZGRyKTsJLyogQ2xlYXIgaW5pdGlhbCByZWFkeSBzaWduYWwuICovCisgICAgICAgIH0KKworICAgICAgICByZXR1cm47Cit9CisKKy8qCisgKiAJR2V0IHRoZSBMb2NhbFRhbGsgTm9kZWlkIGZyb20gdGhlIGNhcmQuIFdlIGNhbiBzdWdnZXN0CisgKglhbnkgbm9kZWlkIDEtMjU0LiBUaGUgY2FyZCB3aWxsIHRyeSBhbmQgZ2V0IHRoYXQgZXhhY3QKKyAqCWFkZHJlc3MgZWxzZSB3ZSBjYW4gc3BlY2lmeSAwIGFzIHRoZSBub2RlaWQgYW5kIHRoZSBjYXJkCisgKgl3aWxsIGF1dG9wcm9iZSBmb3IgYSBub2RlaWQuCisgKi8KK3N0YXRpYyBpbnQgY29wc19ub2RlaWQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBub2RlaWQpCit7CisJc3RydWN0IGNvcHNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpZihscC0+Ym9hcmQgPT0gREFZTkEpCisgICAgICAgIHsKKyAgICAgICAgCS8qIEVtcHR5IGFueSBwZW5kaW5nIGFkYXB0ZXIgcmVzcG9uc2VzLiAqLworICAgICAgICAgICAgICAgIHdoaWxlKChpbmIoaW9hZGRyK0RBWU5BX0NBUkRfU1RBVFVTKSZEQVlOQV9UWF9SRUFEWSk9PTApCisgICAgICAgICAgICAgICAgeworCQkJb3V0YigwLCBpb2FkZHIrQ09QU19DTEVBUl9JTlQpOwkvKiBDbGVhciBpbnRlcnJ1cHRzLiAqLworICAgICAgICAJCWlmKChpbmIoaW9hZGRyK0RBWU5BX0NBUkRfU1RBVFVTKSYweDAzKT09REFZTkFfUlhfUkVRVUVTVCkKKyAgICAgICAgICAgICAgICAJCWNvcHNfcngoZGV2KTsJLyogS2ljayBhbnkgcGFja2V0cyB3YWl0aW5nLiAqLworCQkJc2NoZWR1bGUoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvdXRiKDIsIGlvYWRkcik7ICAgICAgIAkvKiBPdXRwdXQgY29tbWFuZCBwYWNrZXQgbGVuZ3RoIGFzIDIuICovCisgICAgICAgICAgICAgICAgb3V0YigwLCBpb2FkZHIpOworICAgICAgICAgICAgICAgIG91dGIoTEFQX0lOSVQsIGlvYWRkcik7CS8qIFNlbmQgTEFQX0lOSVQgY29tbWFuZCBieXRlLiAqLworICAgICAgICAgICAgICAgIG91dGIobm9kZWlkLCBpb2FkZHIpOyAgCS8qIFN1Z2dlc3Qgbm9kZSBhZGRyZXNzLiAqLworICAgICAgICB9CisKKwlpZihscC0+Ym9hcmQgPT0gVEFOR0VOVCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEVtcHR5IGFueSBwZW5kaW5nIGFkYXB0ZXIgcmVzcG9uc2VzLiAqLworICAgICAgICAgICAgICAgIHdoaWxlKGluYihpb2FkZHIrVEFOR19DQVJEX1NUQVRVUykmVEFOR19SWF9SRUFEWSkKKyAgICAgICAgICAgICAgICB7CisJCQlvdXRiKDAsIGlvYWRkcitDT1BTX0NMRUFSX0lOVCk7CS8qIENsZWFyIGludGVycnVwdC4gKi8KKyAgICAgICAgICAgICAgICAJY29wc19yeChkZXYpOyAgICAgICAgICAJLyogS2ljayBvdXQgcGFja2V0cyB3YWl0aW5nLiAqLworCQkJc2NoZWR1bGUoKTsKKyAgICAgICAgICAgICAgICB9CisKKwkJLyogTm90IHN1cmUgd2hhdCBUYW5nZW50IGRvZXMgaWYgbm9kZWlkIHBpY2tlZCBpcyB1c2VkLiAqLworICAgICAgICAgICAgICAgIGlmKG5vZGVpZCA9PSAwKQkgICAgICAgICAJCS8qIFNlZWQuICovCisgICAgICAgICAgICAgICAgCW5vZGVpZCA9IGppZmZpZXMmMHhGRjsJCS8qIEdldCBhIHJhbmRvbSB0cnkgKi8KKyAgICAgICAgICAgICAgICBvdXRiKDIsIGlvYWRkcik7ICAgICAgICAJCS8qIENvbW1hbmQgbGVuZ3RoIExTQiAqLworICAgICAgICAgICAgICAgIG91dGIoMCwgaW9hZGRyKTsgICAgICAgCQkJLyogQ29tbWFuZCBsZW5ndGggTVNCICovCisgICAgICAgICAgICAgICAgb3V0YihMQVBfSU5JVCwgaW9hZGRyKTsgCQkvKiBTZW5kIExBUF9JTklUIGJ5dGUgKi8KKyAgICAgICAgICAgICAgICBvdXRiKG5vZGVpZCwgaW9hZGRyKTsgCQkgIAkvKiBMQVAgYWRkcmVzcyBoaW50LiAqLworICAgICAgICAgICAgICAgIG91dGIoMHhGRiwgaW9hZGRyKTsgICAgIAkJLyogSW50LiBsZXZlbCB0byB1c2UgKi8KKyAgICAgICAgfQorCisJbHAtPm5vZGVfYWNxdWlyZT0wOwkJLyogU2V0IG5vZGVpZCBob2xkZXIgdG8gMC4gKi8KKyAgICAgICAgd2hpbGUobHAtPm5vZGVfYWNxdWlyZT09MCkJLyogR2V0ICpUcnVlKiBub2RlaWQgZmluYWxseS4gKi8KKwl7CisJCW91dGIoMCwgaW9hZGRyK0NPUFNfQ0xFQVJfSU5UKTsJLyogQ2xlYXIgYW55IGludGVycnVwdC4gKi8KKworCQlpZihscC0+Ym9hcmQgPT0gREFZTkEpCisJCXsKKyAgICAgICAgICAgICAgICAJaWYoKGluYihpb2FkZHIrREFZTkFfQ0FSRF9TVEFUVVMpJjB4MDMpPT1EQVlOQV9SWF9SRVFVRVNUKQorICAgICAgICAgICAgICAgIAkJY29wc19yeChkZXYpOwkvKiBHcmFiIHRoZSBub2RlaWQgcHV0IGluIGxwLT5ub2RlX2FjcXVpcmUuICovCisJCX0KKwkJaWYobHAtPmJvYXJkID09IFRBTkdFTlQpCisJCXsJCisJCQlpZihpbmIoaW9hZGRyK1RBTkdfQ0FSRF9TVEFUVVMpJlRBTkdfUlhfUkVBRFkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHNfcngoZGV2KTsgICAvKiBHcmFiIHRoZSBub2RlaWQgcHV0IGluIGxwLT5ub2RlX2FjcXVpcmUuICovCisJCX0KKwkJc2NoZWR1bGUoKTsKKwl9CisKKwlpZihjb3BzX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBOb2RlIElEICVkIGhhcyBiZWVuIGFjcXVpcmVkLlxuIiwgCisJCQlkZXYtPm5hbWUsIGxwLT5ub2RlX2FjcXVpcmUpOworCisJbHAtPm5vZGVpZD0xOwkvKiBTZXQgZ290IG5vZGVpZCB0byAxLiAqLworCisgICAgICAgIHJldHVybiAwOworfQorCisvKgorICoJUG9sbCB0aGUgVGFuZ2VudCB0eXBlIGNhcmRzIHRvIHNlZSBpZiB3ZSBoYXZlIHdvcmsuCisgKi8KKyAKK3N0YXRpYyB2b2lkIGNvcHNfcG9sbCh1bnNpZ25lZCBsb25nIGx0ZGV2KQoreworCWludCBpb2FkZHIsIHN0YXR1czsKKwlpbnQgYm9ndXNjb3VudCA9IDA7CisKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopbHRkZXY7CisKKwlkZWxfdGltZXIoJmNvcHNfdGltZXIpOworCisJaWYoZGV2ID09IE5VTEwpCisJCXJldHVybjsJLyogV2UndmUgYmVlbiBkb3duZWQgKi8KKworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWRvIHsKKwkJc3RhdHVzPWluYihpb2FkZHIrVEFOR19DQVJEX1NUQVRVUyk7CisJCWlmKHN0YXR1cyAmIFRBTkdfUlhfUkVBRFkpCisJCQljb3BzX3J4KGRldik7CisJCWlmKHN0YXR1cyAmIFRBTkdfVFhfUkVBRFkpCisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCXN0YXR1cyA9IGluYihpb2FkZHIrVEFOR19DQVJEX1NUQVRVUyk7CisJfSB3aGlsZSgoKytib2d1c2NvdW50IDwgMjApICYmIChzdGF0dXMmKFRBTkdfUlhfUkVBRFl8VEFOR19UWF9SRUFEWSkpKTsKKworCS8qIHBvbGwgMjAgdGltZXMgcGVyIHNlY29uZCAqLworCWNvcHNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWi8yMDsKKwlhZGRfdGltZXIoJmNvcHNfdGltZXIpOworCisJcmV0dXJuOworfQorCisvKgorICogICAgICBUaGUgdHlwaWNhbCB3b3JrbG9hZCBvZiB0aGUgZHJpdmVyOgorICogICAgICBIYW5kbGUgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGludGVycnVwdHMuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBjb3BzX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKyAgICAgICAgc3RydWN0IGNvcHNfbG9jYWwgKmxwOworICAgICAgICBpbnQgaW9hZGRyLCBzdGF0dXM7CisgICAgICAgIGludCBib2d1c2NvdW50ID0gMDsKKworICAgICAgICBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAgICAgbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYobHAtPmJvYXJkPT1EQVlOQSkKKwl7CisJCWRvIHsKKwkJCW91dGIoMCwgaW9hZGRyICsgQ09QU19DTEVBUl9JTlQpOworICAgICAgICAgICAgICAgICAgICAgICAJc3RhdHVzPWluYihpb2FkZHIrREFZTkFfQ0FSRF9TVEFUVVMpOworICAgICAgICAgICAgICAgICAgICAgICAJaWYoKHN0YXR1cyYweDAzKT09REFZTkFfUlhfUkVRVUVTVCkKKyAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgY29wc19yeChkZXYpOworICAgICAgICAgICAgICAgIAluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0gd2hpbGUoKytib2d1c2NvdW50IDwgMjApOworCX0KKwllbHNlCisJeworCQlkbyB7CisgICAgICAgICAgICAgICAgICAgICAgIAlzdGF0dXM9aW5iKGlvYWRkcitUQU5HX0NBUkRfU1RBVFVTKTsKKwkJCWlmKHN0YXR1cyAmIFRBTkdfUlhfUkVBRFkpCisJCQkJY29wc19yeChkZXYpOworCQkJaWYoc3RhdHVzICYgVEFOR19UWF9SRUFEWSkKKwkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQlzdGF0dXM9aW5iKGlvYWRkcitUQU5HX0NBUkRfU1RBVFVTKTsKKwkJfSB3aGlsZSgoKytib2d1c2NvdW50IDwgMjApICYmIChzdGF0dXMmKFRBTkdfUlhfUkVBRFl8VEFOR19UWF9SRUFEWSkpKTsKKwl9CisKKyAgICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogICAgICBXZSBoYXZlIGEgZ29vZCBwYWNrZXQocyksIGdldCBpdC90aGVtIG91dCBvZiB0aGUgYnVmZmVycy4KKyAqLworc3RhdGljIHZvaWQgY29wc19yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBpbnQgcGt0X2xlbiA9IDA7CisgICAgICAgIGludCByc3BfdHlwZSA9IDA7CisgICAgICAgIHN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworICAgICAgICBzdHJ1Y3QgY29wc19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgICAgIGludCBib2d1c2NvdW50ID0gMDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJCisgICAgICAgIGlmKGxwLT5ib2FyZD09REFZTkEpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRiKDAsIGlvYWRkcik7ICAgICAgICAgICAgICAgIC8qIFNlbmQgb3V0IFplcm8gbGVuZ3RoLiAqLworICAgICAgICAgICAgICAgIG91dGIoMCwgaW9hZGRyKTsKKyAgICAgICAgICAgICAgICBvdXRiKERBVEFfUkVBRCwgaW9hZGRyKTsgICAgICAgIC8qIFNlbmQgcmVhZCBjb21tYW5kIG91dC4gKi8KKworICAgICAgICAgICAgICAgIC8qIFdhaXQgZm9yIERNQSB0byB0dXJuIGFyb3VuZC4gKi8KKyAgICAgICAgICAgICAgICB3aGlsZSgrK2JvZ3VzY291bnQ8MTAwMDAwMCkKKyAgICAgICAgICAgICAgICB7CisJCQliYXJyaWVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZigoaW5iKGlvYWRkcitEQVlOQV9DQVJEX1NUQVRVUykmMHgwMyk9PURBWU5BX1JYX1JFQURZKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZihib2d1c2NvdW50PT0xMDAwMDAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBETUEgdGltZWQgb3V0LlxuIixkZXYtPm5hbWUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBHZXQgcmVzcG9uc2UgbGVuZ3RoLiAqLworCWlmKGxwLT5ib2FyZD09REFZTkEpCisgICAgICAgIAlwa3RfbGVuID0gaW5iKGlvYWRkcikgJiAweEZGOworCWVsc2UKKwkJcGt0X2xlbiA9IGluYihpb2FkZHIpICYgMHgwMEZGOworICAgICAgICBwa3RfbGVuIHw9IChpbmIoaW9hZGRyKSA8PCA4KTsKKyAgICAgICAgLyogSW5wdXQgSU8gY29kZS4gKi8KKyAgICAgICAgcnNwX3R5cGU9aW5iKGlvYWRkcik7CisKKyAgICAgICAgLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuICovCisgICAgICAgIHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbik7CisgICAgICAgIGlmKHNrYiA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLAorCQkJZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfZHJvcHBlZCsrOworICAgICAgICAgICAgICAgIHdoaWxlKHBrdF9sZW4tLSkgICAgICAgIC8qIERpc2NhcmQgcGFja2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpbmIoaW9hZGRyKTsKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBza2ItPmRldiA9IGRldjsKKyAgICAgICAgc2tiX3B1dChza2IsIHBrdF9sZW4pOworICAgICAgICBza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfTE9DQUxUQUxLKTsKKworICAgICAgICBpbnNiKGlvYWRkciwgc2tiLT5kYXRhLCBwa3RfbGVuKTsgICAgICAgICAgICAgICAvKiBFYXQgdGhlIERhdGEgKi8KKworICAgICAgICBpZihscC0+Ym9hcmQ9PURBWU5BKQorICAgICAgICAgICAgICAgIG91dGIoMSwgaW9hZGRyK0RBWU5BX0lOVF9DQVJEKTsgICAgICAgICAvKiBJbnRlcnJ1cHQgdGhlIGNhcmQgKi8KKworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOyAgLyogUmVzdG9yZSBpbnRlcnJ1cHRzLiAqLworCisgICAgICAgIC8qIENoZWNrIGZvciBiYWQgcmVzcG9uc2UgbGVuZ3RoICovCisgICAgICAgIGlmKHBrdF9sZW4gPCAwIHx8IHBrdF9sZW4gPiBNQVhfTExBUF9TSVpFKQorICAgICAgICB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBCYWQgcGFja2V0IGxlbmd0aCBvZiAlZCBieXRlcy5cbiIsIAorCQkJZGV2LT5uYW1lLCBwa3RfbGVuKTsKKyAgICAgICAgICAgICAgICBscC0+c3RhdHMudHhfZXJyb3JzKys7CisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXQgbm9kZWlkIGFuZCB0aGVuIGdldCBvdXQuICovCisgICAgICAgIGlmKHJzcF90eXBlID09IExBUF9JTklUX1JTUCkKKyAgICAgICAgewkvKiBOb2RlaWQgdGFrZW4gZnJvbSByZWNlaXZlZCBwYWNrZXQuICovCisgICAgICAgICAgICAgICAgbHAtPm5vZGVfYWNxdWlyZSA9IHNrYi0+ZGF0YVswXTsKKyAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE9uZSBsYXN0IGNoZWNrIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgZ29vZCBwYWNrZXQuICovCisgICAgICAgIGlmKHJzcF90eXBlICE9IExBUF9SRVNQT05TRSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBCYWQgcGFja2V0IHR5cGUgJWQuXG4iLCBkZXYtPm5hbWUsIHJzcF90eXBlKTsKKyAgICAgICAgICAgICAgICBscC0+c3RhdHMudHhfZXJyb3JzKys7CisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBza2ItPm1hYy5yYXcgICAgPSBza2ItPmRhdGE7ICAgIC8qIFBvaW50IHRvIGVudGlyZSBwYWNrZXQuICovCisgICAgICAgIHNrYl9wdWxsKHNrYiwzKTsKKyAgICAgICAgc2tiLT5oLnJhdyAgICAgID0gc2tiLT5kYXRhOyAgICAvKiBQb2ludCB0byBkYXRhIChTa2lwIGhlYWRlcikuICovCisKKyAgICAgICAgLyogVXBkYXRlIHRoZSBjb3VudGVycy4gKi8KKyAgICAgICAgbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKyAgICAgICAgbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCisgICAgICAgIC8qIFNlbmQgcGFja2V0IHRvIGEgaGlnaGVyIHBsYWNlLiAqLworICAgICAgICBuZXRpZl9yeChza2IpOworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHNfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgY29wc19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlscC0+c3RhdHMudHhfZXJyb3JzKys7CisgICAgICAgIGlmKGxwLT5ib2FyZD09VEFOR0VOVCkKKyAgICAgICAgeworCQlpZigoaW5iKGlvYWRkcitUQU5HX0NBUkRfU1RBVFVTKSZUQU5HX1RYX1JFQURZKT09MCkKKyAgICAgICAgICAgICAgIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vIFRYIGNvbXBsZXRlIGludGVycnVwdC5cbiIsIGRldi0+bmFtZSk7CisJfQorCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQuXG4iLCBkZXYtPm5hbWUpOworCWNvcHNfanVtcHN0YXJ0KGRldik7CS8qIFJlc3RhcnQgdGhlIGNhcmQuICovCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisKKy8qCisgKglNYWtlIHRoZSBjYXJkIHRyYW5zbWl0IGEgTG9jYWxUYWxrIHBhY2tldC4KKyAqLworCitzdGF0aWMgaW50IGNvcHNfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IGNvcHNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgICAgIC8qCisgICAgICAgICAqIEJsb2NrIGEgdGltZXItYmFzZWQgdHJhbnNtaXQgZnJvbSBvdmVybGFwcGluZy4gCisJICovCisJIAorCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCWlmKGxwLT5ib2FyZCA9PSBEQVlOQSkJIC8qIFdhaXQgZm9yIGFkYXB0ZXIgdHJhbnNtaXQgYnVmZmVyLiAqLworCQl3aGlsZSgoaW5iKGlvYWRkcitEQVlOQV9DQVJEX1NUQVRVUykmREFZTkFfVFhfUkVBRFkpPT0wKQorCQkJY3B1X3JlbGF4KCk7CisJaWYobHAtPmJvYXJkID09IFRBTkdFTlQpIC8qIFdhaXQgZm9yIGFkYXB0ZXIgdHJhbnNtaXQgYnVmZmVyLiAqLworCQl3aGlsZSgoaW5iKGlvYWRkcitUQU5HX0NBUkRfU1RBVFVTKSZUQU5HX1RYX1JFQURZKT09MCkKKwkJCWNwdV9yZWxheCgpOworCisJLyogT3V0cHV0IElPIGxlbmd0aC4gKi8KKwlvdXRiKHNrYi0+bGVuLCBpb2FkZHIpOworCWlmKGxwLT5ib2FyZCA9PSBEQVlOQSkKKyAgICAgICAgICAgICAgIAlvdXRiKHNrYi0+bGVuID4+IDgsIGlvYWRkcik7CisJZWxzZQorCQlvdXRiKChza2ItPmxlbiA+PiA4KSYweDBGRiwgaW9hZGRyKTsKKworCS8qIE91dHB1dCBJTyBjb2RlLiAqLworCW91dGIoTEFQX1dSSVRFLCBpb2FkZHIpOworCisJaWYobHAtPmJvYXJkID09IERBWU5BKQkvKiBDaGVjayB0aGUgdHJhbnNtaXQgYnVmZmVyIGFnYWluLiAqLworICAgICAgICAJd2hpbGUoKGluYihpb2FkZHIrREFZTkFfQ0FSRF9TVEFUVVMpJkRBWU5BX1RYX1JFQURZKT09MCk7CisKKwlvdXRzYihpb2FkZHIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwkvKiBTZW5kIG91dCB0aGUgZGF0YS4gKi8KKworCWlmKGxwLT5ib2FyZD09REFZTkEpCS8qIERheW5hIHJlcXVpcmVzIHlvdSBraWNrIHRoZSBjYXJkICovCisJCW91dGIoMSwgaW9hZGRyK0RBWU5BX0lOVF9DQVJEKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CS8qIFJlc3RvcmUgaW50ZXJydXB0cy4gKi8KKworCS8qIERvbmUgc2VuZGluZyBwYWNrZXQsIHVwZGF0ZSBjb3VudGVycyBhbmQgY2xlYW51cC4gKi8KKwlscC0+c3RhdHMudHhfcGFja2V0cysrOworCWxwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlkZXZfa2ZyZWVfc2tiIChza2IpOworICAgICAgICByZXR1cm4gMDsKK30KKworLyoKKyAqCUR1bW15IGZ1bmN0aW9uIHRvIGtlZXAgdGhlIEFwcGxldGFsayBsYXllciBoYXBweS4KKyAqLworIAorc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGlmKGNvcHNfZGVidWcgPj0gMykKKwkJcHJpbnRrKCIlczogc2V0X211bHRpY2FzdF9saXN0IGV4ZWN1dGVkXG4iLCBkZXYtPm5hbWUpOworfQorCisvKgorICogICAgICBBbm90aGVyIER1bW15IGZ1bmN0aW9uIHRvIGtlZXAgdGhlIEFwcGxldGFsayBsYXllciBoYXBweS4KKyAqLworIAorc3RhdGljIGludCBjb3BzX2hhcmRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwgdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLCAKKwkJCSAgICB1bnNpZ25lZCBsZW4pCit7CisgICAgICAgIGlmKGNvcHNfZGVidWcgPj0gMykKKyAgICAgICAgICAgICAgICBwcmludGsoIiVzOiBjb3BzX2hhcmRfaGVhZGVyIGV4ZWN1dGVkLiBXb3chXG4iLCBkZXYtPm5hbWUpOworICAgICAgICByZXR1cm4gMDsKK30KKworLyoKKyAqICAgICAgU3lzdGVtIGlvY3RscyBmb3IgdGhlIENPUFMgTG9jYWxUYWxrIGNhcmQuCisgKi8KKyAKK3N0YXRpYyBpbnQgY29wc19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKyAgICAgICAgc3RydWN0IGNvcHNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX2F0ICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHJfYXQgKikmaWZyLT5pZnJfYWRkcjsKKyAgICAgICAgc3RydWN0IGF0YWxrX2FkZHIgKmFhID0gKHN0cnVjdCBhdGFsa19hZGRyICopJmxwLT5ub2RlX2FkZHI7CisKKyAgICAgICAgc3dpdGNoKGNtZCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgU0lPQ1NJRkFERFI6CisJCQkvKiBHZXQgYW5kIHNldCB0aGUgbm9kZWlkIGFuZCBuZXR3b3JrICMgYXRhbGtkIHdhbnRzLiAqLworCQkJY29wc19ub2RlaWQoZGV2LCBzYS0+c2F0X2FkZHIuc19ub2RlKTsKKwkJCWFhLT5zX25ldCAgICAgICAgICAgICAgID0gc2EtPnNhdF9hZGRyLnNfbmV0OworICAgICAgICAgICAgICAgICAgICAgICAgYWEtPnNfbm9kZSAgICAgICAgICAgICAgPSBscC0+bm9kZV9hY3F1aXJlOworCisJCQkvKiBTZXQgYnJvYXJkY2FzdCBhZGRyZXNzLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5icm9hZGNhc3RbMF0gICAgICAgPSAweEZGOworCQkJCisJCQkvKiBTZXQgaGFyZHdhcmUgYWRkcmVzcy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+ZGV2X2FkZHJbMF0gICAgICAgID0gYWEtPnNfbm9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+YWRkcl9sZW4gICAgICAgICAgID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICAgICAgY2FzZSBTSU9DR0lGQUREUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhLT5zYXRfYWRkci5zX25ldCAgICAgID0gYWEtPnNfbmV0OworICAgICAgICAgICAgICAgICAgICAgICAgc2EtPnNhdF9hZGRyLnNfbm9kZSAgICAgPSBhYS0+c19ub2RlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworICAgICAgICB9Cit9CisKKy8qCisgKglUaGUgaW52ZXJzZSByb3V0aW5lIHRvIGNvcHNfb3BlbigpLgorICovCisgCitzdGF0aWMgaW50IGNvcHNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY29wc19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogSWYgd2Ugd2VyZSBydW5uaW5nIHBvbGxlZCwgeWFuayB0aGUgdGltZXIuCisJICovCisJaWYobHAtPmJvYXJkPT1UQU5HRU5UICYmIGRldi0+aXJxPT0wKQorCQlkZWxfdGltZXIoJmNvcHNfdGltZXIpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworICAgICAgICByZXR1cm4gMDsKK30KKworLyoKKyAqICAgICAgR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCisgKiAgICAgIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IgY2xvc2VkLgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmNvcHNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBjb3BzX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHJldHVybiAmbHAtPnN0YXRzOworfQorCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmNvcHNfZGV2OworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGJvYXJkX3R5cGUsIGludCwgMCk7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWlmIChpbyA9PSAwKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogWW91IHNob3VsZG4ndCBhdXRvcHJvYmUgd2l0aCBpbnNtb2RcbiIsCisJCQljYXJkbmFtZSk7CisJY29wc19kZXYgPSBjb3BzX3Byb2JlKC0xKTsKKwlpZiAoSVNfRVJSKGNvcHNfZGV2KSkKKwkJcmV0dXJuIFBUUl9FUlIoY29wc19kZXYpOworICAgICAgICByZXR1cm4gMDsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXVucmVnaXN0ZXJfbmV0ZGV2KGNvcHNfZGV2KTsKKwljbGVhbnVwX2NhcmQoY29wc19kZXYpOworCWZyZWVfbmV0ZGV2KGNvcHNfZGV2KTsKK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RWRVJTSU9OUyAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzIgLWMgY29wcy5jIgorICogIGMtYmFzaWMtb2Zmc2V0OiA0CisgKiAgYy1maWxlLW9mZnNldHM6ICgoc3Vic3RhdGVtZW50LW9wZW4gLiAwKSkKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2NvcHMuaCBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9jb3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY4YmE5YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9jb3BzLmgKQEAgLTAsMCArMSw2MCBAQAorLyogICAgICBjb3BzLmg6IExvY2FsVGFsayBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqICAgICAgQXV0aG9yczoKKyAqICAgICAgLSBKYXkgU2NodWxpc3QgPGpzY2hsc3RAc2FtYmEub3JnPgorICovCisKKyNpZm5kZWYgX19MSU5VWF9DT1BTTFRBTEtfSAorI2RlZmluZSBfX0xJTlVYX0NPUFNMVEFMS19ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qIE1heCBMTEFQIHNpemUgd2Ugd2lsbCBhY2NlcHQuICovCisjZGVmaW5lIE1BWF9MTEFQX1NJWkUJCTYwMworCisvKiBUYW5nZW50ICovCisjZGVmaW5lIFRBTkdfQ0FSRF9TVEFUVVMgICAgICAgIDEKKyNkZWZpbmUgVEFOR19DTEVBUl9JTlQgICAgICAgICAgMQorI2RlZmluZSBUQU5HX1JFU0VUICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgVEFOR19UWF9SRUFEWSAgICAgICAgICAgMQorI2RlZmluZSBUQU5HX1JYX1JFQURZICAgICAgICAgICAyCisKKy8qIERheW5hICovCisjZGVmaW5lIERBWU5BX0NNRF9EQVRBICAgICAgICAgIDAKKyNkZWZpbmUgREFZTkFfQ0xFQVJfSU5UICAgICAgICAgMQorI2RlZmluZSBEQVlOQV9DQVJEX1NUQVRVUyAgICAgICAyCisjZGVmaW5lIERBWU5BX0lOVF9DQVJEICAgICAgICAgIDMKKyNkZWZpbmUgREFZTkFfUkVTRVQgICAgICAgICAgICAgNAorCisjZGVmaW5lIERBWU5BX1JYX1JFQURZICAgICAgICAgIDAKKyNkZWZpbmUgREFZTkFfVFhfUkVBRFkgICAgICAgICAgMQorI2RlZmluZSBEQVlOQV9SWF9SRVFVRVNUICAgICAgICAzCisKKy8qIFNhbWUgb24gYm90aCBjYXJkIHR5cGVzICovCisjZGVmaW5lIENPUFNfQ0xFQVJfSU5UICAxCisKKy8qIExBUCByZXNwb25zZSBjb2RlcyByZWNlaXZlZCBmcm9tIHRoZSBjYXJkcy4gKi8KKyNkZWZpbmUgTEFQX0lOSVQgICAgICAgIDEgICAgICAgLyogSW5pdCBjbWQgKi8KKyNkZWZpbmUgTEFQX0lOSVRfUlNQICAgIDIgICAgICAgLyogSW5pdCByZXNwb25zZSAqLworI2RlZmluZSBMQVBfV1JJVEUgICAgICAgMyAgICAgICAvKiBXcml0ZSBjbWQgKi8KKyNkZWZpbmUgREFUQV9SRUFEICAgICAgIDQgICAgICAgLyogRGF0YSByZWFkICovCisjZGVmaW5lIExBUF9SRVNQT05TRSAgICA0ICAgICAgIC8qIFJlY2VpdmVkIEFMQVAgZnJhbWUgcmVzcG9uc2UgKi8KKyNkZWZpbmUgTEFQX0dFVFNUQVQgICAgIDUgICAgICAgLyogR2V0IExBUCBhbmQgSFcgc3RhdHVzICovCisjZGVmaW5lIExBUF9SU1BTVEFUICAgICA2ICAgICAgIC8qIFN0YXR1cyByZXNwb25zZSAqLworCisjZW5kaWYKKworLyoKKyAqCVN0cnVjdHVyZSB0byBob2xkIHRoZSBmaXJtd2FyZSBpbmZvcm1hdGlvbi4KKyAqLworc3RydWN0IGx0ZmlybXdhcmUKK3sKKyAgICAgICAgdW5zaWduZWQgaW50IGxlbmd0aDsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqIGRhdGE7Cit9OworCisjZGVmaW5lIERBWU5BIDEKKyNkZWZpbmUgVEFOR0VOVCAyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2NvcHNfZmZkcnYuaCBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9jb3BzX2ZmZHJ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEzMWI0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9jb3BzX2ZmZHJ2LmgKQEAgLTAsMCArMSw1MzMgQEAKKworLyoKKyAqCVRoZSBmaXJtd2FyZSB0aGlzIGRyaXZlciBkb3dubG9hZHMgaW50byB0aGUgTG9jYWx0YWxrIGNhcmQgaXMgYQorICoJc2VwYXJhdGUgcHJvZ3JhbSBhbmQgaXMgbm90IEdQTCdkIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGUgTGludXgKKyAqCXNpZGUgZHJpdmVyIGFuZCB0aGUgcm91dGluZSB0aGF0IGxvYWRzIHRoaXMgZGF0YSBpbnRvIHRoZSBjYXJkIGFyZS4KKyAqCQorICoJSXQgaXMgdGFrZW4gZnJvbSB0aGUgQ09QUyBTREsgYW5kIGlzIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zZQorICoKKyAqCVRoaXMgbWF0ZXJpYWwgaXMgbGljZW5zZWQgdG8geW91IHN0cmljdGx5IGZvciB1c2UgaW4gY29uanVuY3Rpb24gd2l0aAorICoJdGhlIHVzZSBvZiBDT1BTIExvY2FsVGFsayBhZGFwdGVycy4KKyAqCVRoZXJlIGlzIG5vIGNoYXJnZSBmb3IgdGhpcyBTREsuIEFuZCBubyB3YXJhbnR5IGV4cHJlc3Mgb3IgaW1wbGllZAorICoJYWJvdXQgaXRzIGZpdG5lc3MgZm9yIGFueSBwdXJwb3NlLiBIb3dldmVyLCB3ZSB3aWxsIGNoZWVyZWZ1bGx5CisgKglyZWZ1bmQgZXZlcnkgcGVubnkgeW91IHBhaWQgZm9yIHRoaXMgU0RLLi4uCisgKglSZWdhcmRzLAorICoKKyAqCVRob21hcyBGLiBEaXZpbmUKKyAqCUNoaWVmIFNjaWVudGlzdAorICovCisKKworLyogICAgICBjb3BzX2ZmZHJ2Lmg6IExvY2FsVGFsayBkcml2ZXIgZmlybXdhcmUgZHVtcCBmb3IgTGludXguCisgKgorICogICAgICBBdXRob3JzOgorICogICAgICAtIEpheSBTY2h1bGlzdCA8anNjaGxzdEBzYW1iYS5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaWZkZWYgQ09ORklHX0NPUFNfREFZTkEKKwordW5zaWduZWQgY2hhciBmZmRydl9jb2RlW10gPSB7CisJNTgsMywwLDUwLDIyOCwxNDksMzMsMjU1LDI1NSwzNCwyMjYsMTQ5LAorCTI0OSwxNyw0MCwxNTIsMzMsMjAyLDE1NCwxODMsMjM3LDgyLDc3LDY4LAorCTExLDEwNyw5OCwxOSw1NCwwLDIzNywxNzYsMTc1LDUwLDgwLDAsCisJNjIsMTI4LDIzNyw3MSw2MiwzMiwyMzcsNTcsNTEsNjIsMTIsMjM3LAorCTU3LDUwLDIzNyw1Nyw1NCw2Miw2LDIzNyw1Nyw1Miw2MiwxMiwKKwkyMzcsNTcsNDksMzMsMTA3LDEzNywzNCwzMiwxMjgsMzMsODMsMTMwLAorCTM0LDQwLDEyOCwzMyw4NiwxMzAsMzQsNDIsMTI4LDMzLDExMiwxMzAsCisJMzQsMzYsMTI4LDMzLDIxMSwxMzAsMzQsMzgsMTI4LDYyLDAsMjM3LAorCTU3LDE2LDMzLDYzLDE0OCwzNCwzNCwxMjgsMjM3LDk0LDIwNSwxNSwKKwkxMzAsMjUxLDIwNSwxNjgsMTQ1LDI0LDE0MSw2NywxMTEsMTEyLDEyMSwxMTQsCisJMTA1LDEwMywxMDQsMTE2LDMyLDQwLDY3LDQxLDMyLDQ5LDU3LDU2LAorCTU2LDMyLDQ1LDMyLDY4LDk3LDEyMSwxMTAsOTcsMzIsNjcsMTExLAorCTEwOSwxMDksMTE3LDExMCwxMDUsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDExNSwKKwkzMiwzMiwzMiw2NSwxMDgsMTA4LDMyLDExNCwxMDUsMTAzLDEwNCwxMTYsCisJMTE1LDMyLDExNCwxMDEsMTE1LDEwMSwxMTQsMTE4LDEwMSwxMDAsNDYsMzIsCisJMzIsNDAsNjgsNDAsNjgsNywxNiw4LDM0LDcsMjIsNiwKKwkxNiw1LDEyLDQsOCwzLDYsMTQwLDAsMTYsMzksMTI4LAorCTAsNCw5NiwxMCwyMjQsNiwwLDcsMTI2LDIsNjQsMTEsCisJMTE4LDEyLDYsMTMsMCwxNCwxOTMsMTUsMCw1LDk2LDMsCisJMTkyLDEsNjQsOSw4LDYyLDksMjExLDY2LDYyLDE5MiwyMTEsCisJNjYsNjIsMTAwLDYxLDMyLDI1Myw2LDI4LDMzLDIwNSwxMjksMTQsCisJNjYsMjM3LDE2MywxOTQsMjUzLDEyOSw2LDI4LDMzLDIwNSwxMjksMTQsCisJNjQsMjM3LDE2MywxOTQsOSwxMzAsMjAxLDYyLDQ3LDUwLDcxLDE1MiwKKwk2Miw0NywyMTEsNjgsNTgsMjAzLDEyOSwyMzcsNTcsMjAsNTgsMjA0LAorCTEyOSwyMzcsNTcsMjEsMzMsNzcsMTUyLDU0LDEzMiwyMDUsMjMzLDEyOSwKKwk1OCwyMjgsMTQ5LDI1NCwyMDksNDAsNiw1Niw0LDYyLDAsMjQsCisJMiwyMTksOTYsMzMsMjMzLDE0OSwxMTksMjMwLDYyLDMzLDIzMiwxNDksCisJMTE5LDIxMywzMyw4LDE1MiwxNyw3LDAsMjUsMTE5LDE5LDI1LAorCTExOSwyMDksMjAxLDI1MSwyMzcsNzcsMjQ1LDE5NywyMTMsMjI5LDIyMSwyMjksCisJMjA1LDIzMywxMjksNjIsMSw1MCwxMDYsMTM3LDIwNSwxNTgsMTM5LDIyMSwKKwkyMjUsMjI1LDIwOSwxOTMsMjQxLDI1MSwyMzcsNzcsMjQ1LDE5NywyMTMsMjE5LAorCTcyLDIzNyw1NiwxNiwyMzAsNDYsMjM3LDU3LDE2LDIzNyw1NiwxMiwKKwk1OCw3MiwxNTIsMTgzLDMyLDI2LDYsMjAsMTcsMTI4LDIsMjM3LAorCTU2LDQ2LDE4NywzMiwzNSwyMzcsNTYsNDcsMTg2LDMyLDI5LDIxOSwKKwk3MiwyMzAsMSwzMiwzLDUsMzIsMjMyLDE3NSw1MCw3MiwxNTIsCisJMjI5LDIyMSwyMjksNjIsMSw1MCwxMDYsMTM3LDIwNSwxNTgsMTM5LDIyMSwKKwkyMjUsMjI1LDI0LDI1LDYyLDEsNTAsNzIsMTUyLDU4LDIwMSwxMjksCisJMjM3LDU3LDEyLDU4LDIwMiwxMjksMjM3LDU3LDEzLDIzNyw1NiwxNiwKKwkyNDYsMTcsMjM3LDU3LDE2LDIwOSwxOTMsMjQxLDI1MSwyMzcsNzcsMjQ1LAorCTE5NywyMjksMjEzLDIyMSwyMjksMjM3LDU2LDE2LDIzMCwxNywyMzcsNTcsCisJMTYsMjM3LDU2LDIwLDU4LDM0LDE1MiwyNDYsMTYsMjQ2LDgsMjExLAorCTY4LDYyLDYsNjEsMzIsMjUzLDU4LDM0LDE1MiwyNDYsOCwyMTEsCisJNjgsNTgsMjAzLDEyOSwyMzcsNTcsMjAsNTgsMjA0LDEyOSwyMzcsNTcsCisJMjEsMjM3LDU2LDE2LDI0NiwzNCwyMzcsNTcsMTYsMjIxLDIyNSwyMDksCisJMjI1LDE5MywyNDEsMjUxLDIzNyw3NywzMywyLDAsNTcsMTI2LDIzMCwKKwkzLDIzNywxMDAsMSw0MCwyLDI0NiwxMjgsMjMwLDEzMCwyNDUsNjIsCisJNSwyMTEsNjQsMjQxLDIxMSw2NCwyMDEsMjI5LDIxMywyNDMsMjM3LDU2LAorCTE2LDIzMCw0NiwyMzcsNTcsMTYsMjM3LDU2LDEyLDI1MSw3MCwzNSwKKwkzNSwxMjYsMjU0LDE3NSwyMDIsNzcsMTMzLDI1NCwxMjksMjAyLDE1LDEzMywKKwkyMzAsMTI4LDE5NCwxOTEsMTMyLDQzLDU4LDQ0LDE1MiwxMTksMzMsNzYsCisJMTUyLDExOSwzNSw2MiwxMzIsMTE5LDEyMCwyNTQsMjU1LDQwLDQsNTgsCisJNDksMTUyLDExOSwyMTksNzIsNDMsNDMsMTEyLDE3LDMsMCwyMzcsCisJNTYsNTIsMjMwLDI0OCwyMzcsNTcsNTIsMjE5LDcyLDIzMCwxLDE5NCwKKwkxNDEsMTMxLDIwOSwyMjUsMjM3LDU2LDUyLDI0Niw2LDIzNyw1Nyw1MiwKKwk2MiwxLDU1LDI1MSwyMDEsNjIsMywyMTEsNjYsNjIsMTkyLDIxMSwKKwk2Niw2Miw0OCwyMTEsNjYsMCwwLDIxOSw2NiwyMzAsMSw0MCwKKwk0LDIxOSw2NywyNCwyNDAsMjA1LDIwMywxMzUsNTgsNzUsMTUyLDI1NCwKKwkyNTUsMjAyLDEyOCwxMzIsNTgsNDksMTUyLDI1NCwxNjEsMjUwLDIwNywxMzEsCisJNTgsMzQsMTUyLDIxMSw2OCw2MiwxMCwyMTEsNjYsNjIsMTI4LDIxMSwKKwk2Niw2MiwxMSwyMTEsNjYsNjIsNiwyMTEsNjYsMjQsMCw2MiwKKwkxNCwyMTEsNjYsNjIsMzMsMjExLDY2LDYyLDEsMjExLDY2LDYyLAorCTY0LDIxMSw2Niw2MiwzLDIxMSw2Niw2MiwyMDksMjExLDY2LDYyLAorCTEwMCw3MSwyMTksNjYsMjMwLDEsMzIsNiw1LDMyLDI0NywxOTUsCisJMjQ4LDEzMiwyMTksNjcsNzEsNTgsNDQsMTUyLDE4NCwxOTQsMjQ4LDEzMiwKKwk2MiwxMDAsNzEsMjE5LDY2LDIzMCwxLDMyLDYsNSwzMiwyNDcsCisJMTk1LDI0OCwxMzIsMjE5LDY3LDYyLDEwMCw3MSwyMTksNjYsMjMwLDEsCisJMzIsNiw1LDMyLDI0NywxOTUsMjQ4LDEzMiwyMTksNjcsMjU0LDEzMywKKwkzMiw3LDYyLDAsNTAsNzQsMTUyLDI0LDE3LDI1NCwxNzMsMzIsCisJNyw2MiwxLDUwLDc0LDE1MiwyNCw2LDI1NCwxNDEsMTk0LDI0OCwKKwkxMzIsNzEsMjA5LDIyNSw1OCw0OSwxNTIsMjU0LDEzMiwzMiwxMCw2MiwKKwk1MCwyMDUsMiwxMzQsMjA1LDE0NCwxMzUsMjQsMjcsMjU0LDE0MCwzMiwKKwkxNSw2MiwxMTAsMjA1LDIsMTM0LDYyLDE0MSwxODQsMzIsNSwyMDUsCisJMTQ0LDEzNSwyNCw4LDYyLDEwLDIwNSwyLDEzNCwyMDUsOCwxMzQsCisJNjIsMSw1MCwxMDYsMTM3LDIwNSwxNTgsMTM5LDIzNyw1Niw1MiwyNDYsCisJNiwyMzcsNTcsNTIsMTc1LDE4MywyNTEsMjAxLDYyLDIwLDEzNSwyMzcsCisJNTcsMjAsMTc1LDIzNyw1NywyMSwyMzcsNTYsMTYsMjQ2LDIsMjM3LAorCTU3LDE2LDIzNyw1NiwyMCw5NSwyMzcsNTYsMjEsMTIzLDI1NCwxMCwKKwk0OCwyNDQsMjM3LDU2LDE2LDIzMCwxNywyMzcsNTcsMTYsMjA5LDIyNSwKKwkyMDUsMTQ0LDEzNSw2MiwxLDUwLDEwNiwxMzcsMjA1LDE1OCwxMzksMjM3LAorCTU2LDUyLDI0Niw2LDIzNyw1Nyw1MiwxNzUsMTgzLDI1MSwyMDEsMjA5LAorCTIyNSwyNDMsMjE5LDcyLDIzMCwxLDQwLDEzLDYyLDEwLDIxMSw2NiwKKwkwLDAsMjE5LDY2LDIzMCwxOTIsMjAyLDIyNiwxMzIsMjM3LDU2LDUyLAorCTI0Niw2LDIzNyw1Nyw1Miw2MiwxLDU1LDI1MSwyMDEsMjA1LDIwMywKKwkxMzUsNjIsMSw1MCwxMDYsMTM3LDIwNSwxNTgsMTM5LDIzNyw1Niw1MiwKKwkyNDYsNiwyMzcsNTcsNTIsMTgzLDI1MSwyMDEsMjA5LDIyNSw2MiwxLAorCTUwLDEwNiwxMzcsMjA1LDE1OCwxMzksMjM3LDU2LDUyLDI0Niw2LDIzNywKKwk1Nyw1Miw2MiwyLDU1LDI1MSwyMDEsMjA5LDIyNSwyNDMsMjE5LDcyLAorCTIzMCwxLDIwMiwyMTMsMTMyLDYyLDEwLDIxMSw2NiwwLDAsMjE5LAorCTY2LDIzMCwxOTIsMTk0LDIxMywxMzIsMjI5LDYyLDEsNTAsMTA2LDEzNywKKwk0Miw0MCwxNTIsMjA1LDY1LDE0MywyMjUsMTcsMywwLDIwNSwxMTEsCisJMTM2LDYyLDYsMjExLDY2LDU4LDQ0LDE1MiwyMTEsNjYsMjM3LDU2LAorCTUyLDI0Niw2LDIzNyw1Nyw1MiwxODMsMjUxLDIwMSwyMDksMTk3LDIzNywKKwk1Niw1MiwyMzAsMjQ4LDIzNyw1Nyw1MiwyMTksNzIsMjMwLDEsMzIsCisJMTUsMTkzLDIyNSwyMzcsNTYsNTIsMjQ2LDYsMjM3LDU3LDUyLDYyLAorCTEsNTUsMjUxLDIwMSwxNCwyMyw1OCwzNywxNTIsMjU0LDAsNDAsCisJMTQsMTQsMiwyNTQsMSwzMiw1LDYyLDE0MCwxMTksMjQsMywKKwk2MiwxMzIsMTE5LDQzLDQzLDE5NywyMDUsMjAzLDEzNSwxOTMsNjIsMSwKKwkyMTEsNjYsNjIsNjQsMjExLDY2LDYyLDMsMjExLDY2LDYyLDE5MywKKwkyMTEsNjYsNjIsMTAwLDIwMywzOSw3MSwyMTksNjYsMjMwLDEsMzIsCisJNiw1LDMyLDI0NywxOTUsMjI5LDEzMywzMywyMzgsMTUxLDIxOSw2NywKKwk3MSw1OCw0NCwxNTIsMTg0LDE5NCwyMjksMTMzLDExOSw2MiwxMDAsNzEsCisJMjE5LDY2LDIzMCwxLDMyLDYsNSwzMiwyNDcsMTk1LDIyOSwxMzMsCisJMjE5LDY3LDM1LDExOSwxMywzMiwyMzQsMTkzLDIyNSw2MiwxLDUwLAorCTEwNiwxMzcsMjA1LDE1OCwxMzksMjM3LDU2LDUyLDI0Niw2LDIzNyw1NywKKwk1MiwxNzUsMTgzLDI1MSwyMDEsMzMsMjM0LDE1MSwzNSwzNSw2MiwyNTUsCisJMTE5LDE5MywyMjUsNjIsMSw1MCwxMDYsMTM3LDIwNSwxNTgsMTM5LDIzNywKKwk1Niw1MiwyNDYsNiwyMzcsNTcsNTIsMTc1LDI1MSwyMDEsMjQzLDYxLAorCTMyLDI1MywyNTEsMjAxLDYyLDMsMjExLDY2LDYyLDE5MiwyMTEsNjYsCisJNTgsNDksMTUyLDI1NCwxNDAsMzIsMTksMTk3LDIyOSwyMTMsMTcsMTgxLAorCTEyOSwzMywxODUsMTI5LDEsMiwwLDIzNywxNzYsMjA5LDIyNSwxOTMsCisJMjQsMjcsMjI5LDIxMywzMywxODcsMTI5LDU4LDQ5LDE1MiwyMzAsMTUsCisJODcsMzAsMiwyMzcsOTIsMjUsMTcsMTgxLDEyOSwxMjYsMTgsMTksCisJMzUsMTI2LDE4LDIwOSwyMjUsNTgsMzQsMTUyLDI0Niw4LDIxMSw2OCwKKwk1OCw0OSwxNTIsMjU0LDE2NSw0MCwxNCwyNTQsMTY0LDQwLDEwLDYyLAorCTEwLDIxMSw2Niw2MiwyMjQsMjExLDY2LDI0LDI1LDU4LDc0LDE1MiwKKwkyNTQsMCw0MCwxMCw2MiwxMCwyMTEsNjYsNjIsMTYwLDIxMSw2NiwKKwkyNCw4LDYyLDEwLDIxMSw2Niw2MiwxMjgsMjExLDY2LDYyLDExLAorCTIxMSw2Niw2Miw2LDIxMSw2NiwyMDUsMTQ3LDE0Myw2Miw1LDIxMSwKKwk2Niw2MiwyMjQsMjExLDY2LDYyLDUsMjExLDY2LDYyLDk2LDIxMSwKKwk2Niw2Miw1LDYxLDMyLDI1Myw2Miw1LDIxMSw2Niw2MiwyMjQsCisJMjExLDY2LDYyLDE0LDYxLDMyLDI1Myw2Miw1LDIxMSw2Niw2MiwKKwkyMzMsMjExLDY2LDYyLDEyOCwyMTEsNjYsNTgsMTgxLDEyOSw2MSwzMiwKKwkyNTMsNjIsMSwyMTEsNjYsNjIsMTkyLDIxMSw2NiwxLDI1NCwxOSwKKwkyMzcsNTYsNDYsMTg3LDMyLDYsMTMsMzIsMjQ3LDE5NSwyMjYsMTM0LAorCTYyLDE5MiwyMTEsNjYsMCwwLDIxOSw2NiwyMDMsMTE5LDQwLDI1MCwKKwkyMTksNjYsMjAzLDg3LDQwLDI1MCwyNDMsMjM3LDU2LDE2LDIzMCwxNywKKwkyMzcsNTcsMTYsMjM3LDU2LDIwLDI1MSw2Miw1LDIxMSw2Niw2MiwKKwkyMjQsMjExLDY2LDU4LDE4MiwxMjksNjEsMzIsMjUzLDIyOSwzMywxODEsCisJMTI5LDU4LDE4MywxMjksMjAzLDYzLDExOSwzNSw1OCwxODQsMTI5LDExOSwKKwkyMjUsNjIsMTAsMjExLDY2LDYyLDIyNCwyMTEsNjYsNjIsMTEsMjExLAorCTY2LDYyLDExOCwyMTEsNjYsNjIsNDcsMjExLDY4LDYyLDUsMjExLAorCTY2LDYyLDIzMywyMTEsNjYsNTgsMTgxLDEyOSw2MSwzMiwyNTMsNjIsCisJNSwyMTEsNjYsNjIsMjI0LDIxMSw2Niw1OCwxODIsMTI5LDYxLDMyLAorCTI1Myw2Miw1LDIxMSw2Niw2Miw5NiwyMTEsNjYsMjAxLDIyOSwyMTMsCisJNTgsNTAsMTUyLDIzMCwxNSw4NywzMCwyLDIzNyw5MiwzMywxODcsCisJMTI5LDI1LDE3LDE4MSwxMjksMTI2LDE4LDM1LDE5LDEyNiwxOCwyMDksCisJMjI1LDU4LDcxLDE1MiwyNDYsOCwyMTEsNjgsNTgsNTAsMTUyLDI1NCwKKwkxNjUsNDAsMTQsMjU0LDE2NCw0MCwxMCw2MiwxMCwyMTEsNjYsNjIsCisJMjI0LDIxMSw2NiwyNCw4LDYyLDEwLDIxMSw2Niw2MiwxMjgsMjExLAorCTY2LDYyLDExLDIxMSw2Niw2Miw2LDIxMSw2NiwxOTUsMjQ4LDEzNSwKKwk2MiwzLDIxMSw2Niw2MiwxOTIsMjExLDY2LDE5NywyMjksMjEzLDE3LAorCTE4MSwxMjksMzMsMTgzLDEyOSwxLDIsMCwyMzcsMTc2LDIwOSwyMjUsCisJMTkzLDYyLDQ3LDIxMSw2OCw2MiwxMCwyMTEsNjYsNjIsMjI0LDIxMSwKKwk2Niw2MiwxMSwyMTEsNjYsNjIsMTE4LDIxMSw2Niw2MiwxLDIxMSwKKwk2Niw2MiwwLDIxMSw2NiwyMDUsMTQ3LDE0MywxOTUsMTYsMTM2LDYyLAorCTMsMjExLDY2LDYyLDE5MiwyMTEsNjYsMTk3LDIyOSwyMTMsMTcsMTgxLAorCTEyOSwzMywxODMsMTI5LDEsMiwwLDIzNywxNzYsMjA5LDIyNSwxOTMsCisJNjIsNDcsMjExLDY4LDYyLDEwLDIxMSw2Niw2MiwyMjQsMjExLDY2LAorCTYyLDExLDIxMSw2Niw2MiwxMTgsMjExLDY2LDIwNSwxNDcsMTQzLDYyLAorCTUsMjExLDY2LDYyLDIyNCwyMTEsNjYsNjIsNSwyMTEsNjYsNjIsCisJOTYsMjExLDY2LDYyLDUsNjEsMzIsMjUzLDYyLDUsMjExLDY2LAorCTYyLDIyNCwyMTEsNjYsNjIsMTQsNjEsMzIsMjUzLDYyLDUsMjExLAorCTY2LDYyLDIzMywyMTEsNjYsNjIsMTI4LDIxMSw2Niw1OCwxODEsMTI5LAorCTYxLDMyLDI1Myw2MiwxLDIxMSw2Niw2MiwxOTIsMjExLDY2LDEsCisJMjU0LDE5LDIzNyw1Niw0NiwxODcsMzIsNiwxMywzMiwyNDcsMTk1LAorCTg4LDEzNiw2MiwxOTIsMjExLDY2LDAsMCwyMTksNjYsMjAzLDExOSwKKwk0MCwyNTAsMjE5LDY2LDIwMyw4Nyw0MCwyNTAsNjIsNSwyMTEsNjYsCisJNjIsMjI0LDIxMSw2Niw1OCwxODIsMTI5LDYxLDMyLDI1Myw2Miw1LAorCTIxMSw2Niw2Miw5NiwyMTEsNjYsMjAxLDE5NywxNCw2Nyw2LDAsCisJNjIsMywyMTEsNjYsNjIsMTkyLDIxMSw2Niw2Miw0OCwyMTEsNjYsCisJMCwwLDIxOSw2NiwyMzAsMSw0MCw0LDIxOSw2NywyNCwyNDAsCisJNjIsNSwyMTEsNjYsNjIsMjMzLDIxMSw2Niw2MiwxMjgsMjExLDY2LAorCTU4LDE4MSwxMjksNjEsMzIsMjUzLDIzNywxNjMsMjksNjIsMTkyLDIxMSwKKwk2NiwyMTksNjYsMjMwLDQsNDAsMjUwLDIzNywxNjMsMjksMzIsMjQ1LAorCTIxOSw2NiwyMzAsNCw0MCwyNTAsNjIsMjU1LDcxLDIxOSw2NiwyMzAsCisJNCw0MCwzLDUsMzIsMjQ3LDIxOSw2NiwyMzAsNCw0MCwyNTAsCisJNjIsNSwyMTEsNjYsNjIsMjI0LDIxMSw2Niw1OCwxODIsMTI5LDYxLAorCTMyLDI1Myw2Miw1LDIxMSw2Niw2Miw5NiwyMTEsNjYsNTgsNzEsCisJMTUyLDI1NCwxLDIwMiwxOCwxMzcsNjIsMTYsMjExLDY2LDYyLDU2LAorCTIxMSw2Niw2MiwxNCwyMTEsNjYsNjIsMzMsMjExLDY2LDYyLDEsCisJMjExLDY2LDYyLDI0OCwyMTEsNjYsMjM3LDU2LDQ4LDI0NiwxNTMsMjMwLAorCTIwNywyMzcsNTcsNDgsNjIsMywyMTEsNjYsNjIsMjIxLDIxMSw2NiwKKwkxOTMsMjAxLDU4LDcxLDE1MiwyMTEsNjgsNjIsMTAsMjExLDY2LDYyLAorCTEyOCwyMTEsNjYsNjIsMTEsMjExLDY2LDYyLDYsMjExLDY2LDYyLAorCTYsMjExLDY2LDU4LDQ0LDE1MiwyMTEsNjYsNjIsMTYsMjExLDY2LAorCTYyLDU2LDIxMSw2Niw2Miw0OCwyMTEsNjYsMCwwLDYyLDE0LAorCTIxMSw2Niw2MiwzMywyMTEsNjYsNjIsMSwyMTEsNjYsNjIsMjQ4LAorCTIxMSw2NiwyMzcsNTYsNDgsMjQ2LDE0NSwyNDYsOCwyMzAsMjA3LDIzNywKKwk1Nyw0OCw2MiwzLDIxMSw2Niw2MiwyMjEsMjExLDY2LDE5MywyMDEsCisJNDQsMywxLDAsNzAsNjksMSwyNDUsMTk3LDIxMywyMjksMTc1LAorCTUwLDcyLDE1MiwyMzcsNTYsMTYsMjMwLDQ2LDIzNyw1NywxNiwyMzcsCisJNTYsMTIsNjIsMSwyMTEsNjYsMCwwLDIxOSw2Niw5NSwyMzAsCisJMTYwLDMyLDMsMTk1LDIwLDEzOSwxMjMsMjMwLDk2LDE5NCw3MiwxMzksCisJNjIsNDgsMjExLDY2LDYyLDEsMjExLDY2LDYyLDY0LDIxMSw2NiwKKwkyMzcsOTEsNDAsMTUyLDIwNSwyMDcsMTQzLDI1LDQzLDU1LDIzNyw4MiwKKwkyMTgsNzAsMTM5LDM0LDQyLDE1Miw5OCwxMDcsNTgsNDQsMTUyLDE5MCwKKwkxOTQsMjEwLDEzOCwzNSwzNSw2MiwxMzAsMTkwLDE5NCwyMDAsMTM3LDYyLAorCTEsNTAsNDgsMTUyLDYyLDE3NSwxOTAsMjAyLDgyLDEzOSw2MiwxMzIsCisJMTkwLDMyLDQ0LDUwLDUwLDE1Miw2Miw0Nyw1MCw3MSwxNTIsMjI5LAorCTE3NSw1MCwxMDYsMTM3LDQyLDQwLDE1MiwyMDUsNjUsMTQzLDIyNSw1NCwKKwkxMzMsNDMsNzAsNTgsNDQsMTUyLDExOSw0MywxMTIsMTcsMywwLAorCTYyLDEwLDIwNSwyLDEzNCwyMDUsMTExLDEzNiwxOTUsMTU4LDEzOCw2MiwKKwkxNDAsMTkwLDMyLDE5LDUwLDUwLDE1Miw1OCwyMzMsMTQ5LDIzMCw0LAorCTIwMiwyMjIsMTM4LDYyLDEsNTAsNzEsMTUyLDE5NSwyMTksMTM3LDEyNiwKKwkyNTQsMTYwLDI1MCwxODUsMTM4LDI1NCwxNjYsMjQyLDE4NSwxMzgsNTAsNTAsCisJMTUyLDQzLDEyNiwzNSwyMjksMjEzLDMzLDIzNCwxNDksOTUsMjIsMCwKKwkyNSwxMjYsMjU0LDEzMiw0MCwxOCwyNTQsMTQwLDQwLDE0LDU4LDUwLAorCTE1MiwyMzAsMTUsODcsMTI2LDMxLDIxLDI0Miw2NSwxMzgsNTYsMiwKKwkxNzUsMTE5LDU4LDUwLDE1MiwyMzAsMTUsODcsNTgsMjMzLDE0OSwyMzAsCisJNjIsMzEsMjEsMjQyLDg1LDEzOCwyMTgsOTgsMTM4LDIwOSwyMjUsMTk1LAorCTIwLDEzOSw1OCw1MCwxNTIsMzMsMTAwLDEzNywyMzAsMTUsOTUsMjIsCisJMCwyNSwxMjYsNTAsNzEsMTUyLDIwOSwyMjUsNTgsNTAsMTUyLDI1NCwKKwkxNjQsMjUwLDEzNSwxMzgsNTgsNzMsMTUyLDI1NCwwLDQwLDQsNTQsCisJMTczLDI0LDIsNTQsMTMzLDQzLDcwLDU4LDQ0LDE1MiwxMTksNDMsCisJMTEyLDE3LDMsMCwyMDUsNzAsMTM1LDE3NSw1MCwxMDYsMTM3LDIwNSwKKwkyMDgsMTM5LDU4LDE5OSwxMjksMjM3LDU3LDEyLDU4LDIwMCwxMjksMjM3LAorCTU3LDEzLDIzNyw1NiwxNiwyNDYsMTcsMjM3LDU3LDE2LDIyNSwyMDksCisJMTkzLDI0MSwyNTEsMjM3LDc3LDYyLDEyOSwxOTAsMTk0LDIyNywxMzgsNTQsCisJMTMwLDQzLDcwLDU4LDQ0LDE1MiwxMTksNDMsMTEyLDE3LDMsMCwKKwkyMDUsMTQ0LDEzNSwxOTUsMjAsMTM5LDM1LDM1LDEyNiwyNTQsMTMyLDE5NCwKKwkyMjcsMTM4LDE3NSw1MCwxMDYsMTM3LDIwNSwxNTgsMTM5LDI0LDQyLDU4LAorCTIwMSwxNTQsMjU0LDEsNDAsNyw2MiwxLDUwLDEwNiwxMzcsMjQsCisJMjM3LDU4LDEwNiwxMzcsMjU0LDEsMjAyLDIyMiwxMzgsNjIsMTI4LDE2NiwKKwkxOTQsMjIyLDEzOCwyMjEsMjI5LDIyMSwzMyw2NywxNTIsMjA1LDEyNywxNDIsCisJMjA1LDEwOSwxNDQsMjIxLDIyNSwyMjUsMjA5LDE5MywyNDEsMjUxLDIzNyw3NywKKwk1OCwxMDYsMTM3LDI1NCwxLDIwMiw0NCwxMzksNTgsNTAsMTUyLDI1NCwKKwkxNjQsMjUwLDQ0LDEzOSw1OCw3MywxNTIsMjM4LDEsNTAsNzMsMTUyLAorCTIyMSwyMjksMjIxLDMzLDUxLDE1MiwyMDUsMTI3LDE0MiwyMjEsMjI1LDYyLAorCTEsNTAsMTA2LDEzNywyMDUsMTU4LDEzOSwxOTUsMTMsMTM5LDI0LDIwOCwKKwkyNCwyMDYsMjQsMjA0LDIzMCw2NCw0MCwzLDE5NSwyMCwxMzksMTk1LAorCTIwLDEzOSw0MywxMjYsMzMsOCwxNTIsMTE5LDM1LDU4LDQ0LDE1MiwKKwkxMTksNDMsMjM3LDkxLDM1LDE1MiwyMDUsMjAzLDEzNSwyMDUsMTU4LDEzOSwKKwkxOTUsMTMsMTM5LDE3NSw1MCw3OCwxNTIsNjIsMywyMTEsNjYsNjIsCisJMTkyLDIxMSw2NiwyMDEsMTk3LDMzLDQsMCw1NywxMjYsMzUsMTAyLAorCTExMSw2MiwxLDUwLDEwNiwxMzcsMjE5LDcyLDIwNSwxNDEsMTM5LDE5MywKKwkyMDEsNjIsMSw1MCw3OCwxNTIsMzQsNDAsMTUyLDU0LDAsMzUsCisJMzUsNTQsMCwxOTUsMTYzLDEzOSw1OCw3OCwxNTIsMTgzLDIwMCwyMjksCisJMzMsMTgxLDEyOSw1OCwxODMsMTI5LDExOSwzNSw1OCwxODQsMTI5LDExOSwKKwkyMjUsNjIsNDcsMjExLDY4LDYyLDE0LDIxMSw2Niw2MiwxOTMsMjExLAorCTY2LDYyLDEwLDIxMSw2Niw2MiwyMjQsMjExLDY2LDYyLDExLDIxMSwKKwk2Niw2MiwxMTgsMjExLDY2LDE5NSwzLDE0MCw1OCw3OCwxNTIsMTgzLAorCTIwMCw1OCw3MSwxNTIsMjExLDY4LDI1NCw2OSw0MCw0LDI1NCw3MCwKKwkzMiwxNyw1OCw3MywxNTIsMjU0LDAsNDAsMTAsNjIsMTAsMjExLAorCTY2LDYyLDE2MCwyMTEsNjYsMjQsOCw2MiwxMCwyMTEsNjYsNjIsCisJMTI4LDIxMSw2Niw2MiwxMSwyMTEsNjYsNjIsNiwyMTEsNjYsNjIsCisJNiwyMTEsNjYsNTgsNDQsMTUyLDIxMSw2Niw2MiwxNiwyMTEsNjYsCisJNjIsNTYsMjExLDY2LDYyLDQ4LDIxMSw2NiwwLDAsMjE5LDY2LAorCTIzMCwxLDQwLDQsMjE5LDY3LDI0LDI0MCw2MiwxNCwyMTEsNjYsCisJNjIsMzMsMjExLDY2LDQyLDQwLDE1MiwyMDUsNjUsMTQzLDYyLDEsCisJMjExLDY2LDYyLDI0OCwyMTEsNjYsMjM3LDU2LDQ4LDI0NiwxNDUsMjQ2LAorCTgsMjMwLDIwNywyMzcsNTcsNDgsNjIsMywyMTEsNjYsNjIsMjIxLAorCTIxMSw2NiwyMDEsNjIsMTYsMjExLDY2LDYyLDU2LDIxMSw2Niw2MiwKKwk0OCwyMTEsNjYsMCwwLDIxOSw2NiwyMzAsMSw0MCw0LDIxOSwKKwk2NywyNCwyNDAsNjIsMTQsMjExLDY2LDYyLDMzLDIxMSw2Niw2MiwKKwkxLDIxMSw2Niw2MiwyNDgsMjExLDY2LDIzNyw1Niw0OCwyNDYsMTUzLAorCTIzMCwyMDcsMjM3LDU3LDQ4LDYyLDMsMjExLDY2LDYyLDIyMSwyMTEsCisJNjYsMjAxLDIyOSwyMTMsMzMsMjM0LDE0OSw5NSwyMiwwLDI1LDEyNiwKKwkyNTQsMTMyLDQwLDQsMjU0LDE0MCwzMiwyLDE3NSwxMTksMTIzLDIwOSwKKwkyMjUsMjAxLDYsOCwxNCwwLDMxLDQ4LDEsMTIsMTYsMjUwLAorCTEyMSwyMDEsMzMsNCwwLDU3LDk0LDM1LDg2LDMzLDIsMCwKKwk1NywxMjYsMzUsMTAyLDExMSwyMjEsMjI5LDM0LDg5LDE1MiwyMzcsODMsCisJOTEsMTUyLDIyMSwzMyw2MywxNTIsMjA1LDEyNywxNDIsNTgsODEsMTUyLAorCTUwLDgyLDE1Miw1OCw4MCwxNTIsMTM1LDUwLDgwLDE1MiwyMDUsMTYyLAorCTE0MCwyNTQsMyw1NiwxNiw1OCw4MSwxNTIsMTM1LDYwLDIzMCwxNSwKKwk1MCw4MSwxNTIsMTc1LDUwLDgwLDE1MiwyNCwyMyw1OCw3OSwxNTIsCisJMjA1LDE2MiwxNDAsMjU0LDMsNDgsMTMsNTgsODEsMTUyLDIwMyw2MywKKwk1MCw4MSwxNTIsNjIsMjU1LDUwLDc5LDE1Miw1OCw4MSwxNTIsNTAsCisJODIsMTUyLDU4LDc5LDE1MiwxMzUsNTAsNzksMTUyLDYyLDMyLDUwLAorCTgzLDE1Miw1MCw4NCwxNTIsMjM3LDU2LDE2LDIzMCwxNywyMzcsNTcsCisJMTYsMjE5LDcyLDYyLDE5Miw1MCw5MywxNTIsNjIsOTMsNTAsOTQsCisJMTUyLDU4LDkzLDE1Miw2MSw1MCw5MywxNTIsMzIsOSw1OCw5NCwKKwkxNTIsNjEsNTAsOTQsMTUyLDQwLDQ0LDYyLDE3MCwyMzcsNTcsMjAsCisJMTc1LDIzNyw1NywyMSwyMzcsNTYsMTYsMjQ2LDIsMjM3LDU3LDE2LAorCTIxOSw3MiwyMzAsMSwyMDIsMjksMTQxLDIzNyw1NiwyMCw3MSwyMzcsCisJNTYsMjEsMTIwLDI1NCwxMCw0OCwyMzcsMjM3LDU2LDE2LDIzMCwxNywKKwkyMzcsNTcsMTYsMjQzLDYyLDE0LDIxMSw2Niw2Miw2NSwyMTEsNjYsCisJMjUxLDU4LDM5LDE1MiwyMywyMyw2MCw1MCwzOSwxNTIsNzEsNTgsCisJODIsMTUyLDE2MCwyMzAsMTUsNDAsMjIsNzEsMTQsMTAsMjE5LDY2LAorCTIzMCwxNiwyMDIsMTg2LDE0MSwyMTksNzIsMjMwLDEsMjAyLDE4NiwxNDEsCisJMTMsMzIsMjM5LDE2LDIzNSw0Miw4OSwxNTIsMjM3LDkxLDkxLDE1MiwKKwkyMDUsNDcsMTMxLDQ4LDcsNjEsMjAyLDE4NiwxNDEsMTk1LDIyNywxNDEsCisJMjIxLDIyNSwzMywwLDAsMjAxLDIyMSwzMyw1NSwxNTIsMjA1LDEyNywKKwkxNDIsNTgsODQsMTUyLDYxLDUwLDg0LDE1Miw0MCwxOSw1OCw4MiwKKwkxNTIsMjQ2LDEsNTAsODIsMTUyLDU4LDc5LDE1MiwyNDYsMSw1MCwKKwk3OSwxNTIsMTk1LDI5LDE0MSwyMjEsMjI1LDMzLDEsMCwyMDEsMjIxLAorCTMzLDU5LDE1MiwyMDUsMTI3LDE0Miw1OCw4MCwxNTIsMjQ2LDEsNTAsCisJODAsMTUyLDU4LDgyLDE1MiwxMzUsMjQ2LDEsNTAsODIsMTUyLDU4LAorCTgzLDE1Miw2MSw1MCw4MywxNTIsMTk0LDI5LDE0MSwyMjEsMjI1LDMzLAorCTIsMCwyMDEsMjIxLDIyOSwzMywwLDAsNTcsMTcsNCwwLAorCTI1LDEyNiw1MCw0NCwxNTIsMjMwLDEyOCw1MCw4NSwxNTIsNTgsODUsCisJMTUyLDE4Myw0MCw2LDIyMSwzMyw4OCwyLDI0LDQsMjIxLDMzLAorCTE1MCwwLDU4LDQ0LDE1MiwxODMsNDAsNTMsNjAsNDAsNTAsNjAsCisJNDAsNDcsNjEsNjEsMzMsODYsMTUyLDExOSwzNSwxMTksMzUsNTQsCisJMTI5LDE3NSw1MCw0OCwxNTIsMjIxLDQzLDIyMSwyMjksMjI1LDEyNCwxODEsCisJNDAsNDIsMzMsODYsMTUyLDE3LDMsMCwyMDUsMTg5LDE0MCwxNywKKwkyMzIsMywyNywxMjMsMTc4LDMyLDI1MSw1OCw0OCwxNTIsMTgzLDQwLAorCTIyNCw1OCw0NCwxNTIsNzEsNjIsNywxMjgsMjMwLDEyNyw3MSw1OCwKKwk4NSwxNTIsMTc2LDUwLDQ0LDE1MiwyNCwxNjIsMjIxLDIyNSwyMDEsMTgzLAorCTIyMSw1MiwwLDE5MiwyMjEsNTIsMSwxOTIsMjIxLDUyLDIsMTkyLAorCTIyMSw1MiwzLDE5Miw1NSwyMDEsMjQ1LDYyLDEsMjExLDEwMCwyNDEsCisJMjAxLDI0NSw2MiwxLDIxMSw5NiwyNDEsMjAxLDMzLDIsMCw1NywKKwkxMjYsMzUsMTAyLDExMSwyMzcsNTYsNDgsMjMwLDE3NSwyMzcsNTcsNDgsCisJNjIsNDgsMjM3LDU3LDQ5LDEyNSwyMzcsNTcsMzIsMTI0LDIzNyw1NywKKwkzMyw2MiwwLDIzNyw1NywzNCw2Miw4OCwyMzcsNTcsMzUsNjIsCisJMCwyMzcsNTcsMzYsMjM3LDU3LDM3LDMzLDEyOCwyLDEyNSwyMzcsCisJNTcsMzgsMTI0LDIzNyw1NywzOSwyMzcsNTYsNDgsMjQ2LDk3LDIzMCwKKwkyMDcsMjM3LDU3LDQ4LDYyLDAsMjM3LDU3LDAsNjIsMCwyMTEsCisJOTYsMjExLDEwMCwyMDEsMzMsMiwwLDU3LDEyNiwzNSwxMDIsMTExLAorCTIzNyw1Niw0OCwyMzAsMTc1LDIzNyw1Nyw0OCw2MiwxMiwyMzcsNTcsCisJNDksNjIsNzYsMjM3LDU3LDMyLDYyLDAsMjM3LDU3LDMzLDIzNywKKwk1NywzNCwxMjUsMjM3LDU3LDM1LDEyNCwyMzcsNTcsMzYsNjIsMCwKKwkyMzcsNTcsMzcsMzMsMTI4LDIsMTI1LDIzNyw1NywzOCwxMjQsMjM3LAorCTU3LDM5LDIzNyw1Niw0OCwyNDYsOTcsMjMwLDIwNywyMzcsNTcsNDgsCisJNjIsMSwyMTEsOTYsMjAxLDMzLDIsMCw1NywxMjYsMzUsMTAyLAorCTExMSwyMjksMjM3LDU2LDQ4LDIzMCw4NywyMzcsNTcsNDgsMTI1LDIzNywKKwk1Nyw0MCwxMjQsMjM3LDU3LDQxLDYyLDAsMjM3LDU3LDQyLDYyLAorCTY3LDIzNyw1Nyw0Myw2MiwwLDIzNyw1Nyw0NCw1OCwxMDYsMTM3LAorCTI1NCwxLDMyLDUsMzMsNiwwLDI0LDMsMzMsMTI4LDIsCisJMTI1LDIzNyw1Nyw0NiwxMjQsMjM3LDU3LDQ3LDIzNyw1Niw1MCwyMzAsCisJMjUyLDI0NiwyLDIzNyw1Nyw1MCwyMjUsMjAxLDMzLDQsMCw1NywKKwk5NCwzNSw4NiwzMywyLDAsNTcsMTI2LDM1LDEwMiwxMTEsMjM3LAorCTU2LDQ4LDIzMCw4NywyMzcsNTcsNDgsMTI1LDIzNyw1Nyw0MCwxMjQsCisJMjM3LDU3LDQxLDYyLDAsMjM3LDU3LDQyLDYyLDY3LDIzNyw1NywKKwk0Myw2MiwwLDIzNyw1Nyw0NCwxMjMsMjM3LDU3LDQ2LDEyMiwyMzcsCisJNTcsNDcsMjM3LDU2LDUwLDIzMCwyNDQsMjQ2LDAsMjM3LDU3LDUwLAorCTIzNyw1Niw0OCwyNDYsMTQ1LDIzMCwyMDcsMjM3LDU3LDQ4LDIwMSwyMTMsCisJMjM3LDU2LDQ2LDk1LDIzNyw1Niw0Nyw4NywyMzcsNTYsNDYsMTExLAorCTIzNyw1Niw0NywxMDMsMTgzLDIzNyw4MiwzMiwyMzUsMzMsMTI4LDIsCisJMTgzLDIzNyw4MiwyMDksMjAxLDIxMywyMzcsNTYsMzgsOTUsMjM3LDU2LAorCTM5LDg3LDIzNyw1NiwzOCwxMTEsMjM3LDU2LDM5LDEwMywxODMsMjM3LAorCTgyLDMyLDIzNSwzMywxMjgsMiwxODMsMjM3LDgyLDIwOSwyMDEsMjQ1LAorCTE5NywxLDUyLDAsMjM3LDEyMCwyMzAsMjUzLDIzNywxMjEsMTkzLDI0MSwKKwkyMDEsMjQ1LDE5NywxLDUyLDAsMjM3LDEyMCwyNDYsMiwyMzcsMTIxLAorCTE5MywyNDEsMjAxLDMzLDIsMCw1NywxMjYsMzUsMTAyLDExMSwxMjYsCisJMzUsMTEwLDEwMywyMDEsMzMsMCwwLDM0LDEwMiwxNTIsMzQsOTYsCisJMTUyLDM0LDk4LDE1MiwzMywyMDIsMTU0LDM0LDEwNCwxNTIsMjM3LDkxLAorCTEwNCwxNTIsNDIsMjI2LDE0OSwxODMsMjM3LDgyLDE3LDAsMjU1LDI1LAorCTM0LDEwMCwxNTIsMjAzLDEyNCw0MCw2LDMzLDAsMTI1LDM0LDEwMCwKKwkxNTIsNDIsMTA0LDE1MiwzNSwzNSwzNSwyMjksMjA1LDEyMCwxMzksMTkzLAorCTIwMSwyMDUsMTg2LDE0OSwyMjksNDIsNDAsMTUyLDM1LDM1LDM1LDIyOSwKKwkyMDUsMzksMTQ0LDE5MywxMjQsMjMwLDMsMTAzLDIyMSwxMTcsMjU0LDIyMSwKKwkxMTYsMjU1LDIzNyw5MSw0MiwxNTIsMzUsMzUsMzUsMTgzLDIzNyw4MiwKKwkzMiwxMiwxNyw1LDAsNDIsNDIsMTUyLDIwNSwxNzEsMTQ5LDI0MiwKKwkxNjksMTQ0LDQyLDQwLDE1MiwyMjksMjA1LDEyMCwxMzksMTkzLDE5NSwxOTgsCisJMTQ5LDIzNyw5MSw0MiwxNTIsNDIsOTgsMTUyLDI1LDM0LDk4LDE1MiwKKwkxOSwxOSwxOSw0MiwxMDIsMTUyLDI1LDM0LDEwMiwxNTIsMjM3LDkxLAorCTEwMCwxNTIsMzMsMTU4LDI1MywyNSwyMzcsOTEsMTAyLDE1MiwyMDUsMTcxLAorCTE0OSwyNDIsMjE0LDE0NCwzMywwLDAsMzQsMTAyLDE1Miw2MiwxLAorCTUwLDk1LDE1MiwyMDUsMjI1LDE0NCwxOTUsMTk4LDE0OSw1OCw5NSwxNTIsCisJMTgzLDIwMCwyMzcsOTEsOTYsMTUyLDQyLDEwMiwxNTIsMjA1LDE3MSwxNDksCisJMjQyLDUsMTQ1LDIzNyw5MSwxMDIsMTUyLDMzLDk4LDIsMjUsMjM3LAorCTkxLDk2LDE1MiwyMDUsMTcxLDE0OSwyNTAsMzcsMTQ1LDIzNyw5MSw5NiwKKwkxNTIsNDIsMTAyLDE1MiwxODMsMjM3LDgyLDMyLDcsNDIsOTgsMTUyLAorCTEyNSwxODAsNDAsMTMsMjM3LDkxLDEwMiwxNTIsNDIsOTYsMTUyLDIwNSwKKwkxNzEsMTQ5LDI0Miw1OCwxNDUsMjM3LDkxLDEwNCwxNTIsNDIsMTAyLDE1MiwKKwkyNSwzNSwzNSwzNSwyMjksMjA1LDEyMCwxMzksMTkzLDE3NSw1MCw5NSwKKwkxNTIsMjAxLDE5NSwxMDcsMTM5LDIwNSwyMDYsMTQ5LDI1MCwyNTUsMjQzLDIwNSwKKwkyMjUsMTQ0LDI1MSw1OCwyMzAsMTQ5LDE4MywxOTQsMTk4LDE0OSwxNywxLAorCTAsNDIsOTgsMTUyLDIwNSwxNzEsMTQ5LDI1MCwxOTgsMTQ5LDYyLDEsCisJNTAsMjMwLDE0OSwyMzcsOTEsOTYsMTUyLDQyLDEwNCwxNTIsMjUsMjIxLAorCTExNywyNTIsMjIxLDExNiwyNTMsMjM3LDkxLDEwNCwxNTIsNDIsOTYsMTUyLAorCTI1LDM1LDM1LDM1LDIyMSwxMTcsMjU0LDIyMSwxMTYsMjU1LDM1LDM1LAorCTM1LDIyOSwyMDUsMzksMTQ0LDEyNCwyMzAsMywxMDMsMzUsMzUsMzUsCisJMjIxLDExNywyNTAsMjIxLDExNiwyNTEsMjM1LDIyMSwxMTAsMjUyLDIyMSwxMDIsCisJMjUzLDExNSwzNSwxMTQsMzUsNTQsNCw2MiwxLDIxMSwxMDAsMjExLAorCTg0LDE5NSwxOTgsMTQ5LDMzLDAsMCwzNCwxMDIsMTUyLDM0LDk2LAorCTE1MiwzNCw5OCwxNTIsMzMsMjAyLDE1NCwzNCwxMDQsMTUyLDIzNyw5MSwKKwkxMDQsMTUyLDQyLDIyNiwxNDksMTgzLDIzNyw4MiwxNywwLDI1NSwyNSwKKwkzNCwxMDAsMTUyLDMzLDEwOSwxNTIsNTQsMCwzMywxMDcsMTUyLDIyOSwKKwkyMDUsMjQwLDE0MiwxOTMsNjIsNDcsNTAsMzQsMTUyLDYyLDEzMiw1MCwKKwk0OSwxNTIsMjA1LDI0MSwxNDUsMjA1LDYxLDE0NSw1OCwzOSwxNTIsNjAsCisJNTAsMzksMTUyLDI0LDI0MSwyMDUsMjA2LDE0OSwyNTEsMjU1LDMzLDEwOSwKKwkxNTIsMTI2LDE4MywyMDIsMTk4LDE0OSwxMTAsMjIxLDExNywyNTEsMzMsMTA5LAorCTE1Miw1NCwwLDIyMSwxMjYsMjUxLDI1NCwxLDQwLDI4LDI1NCwzLAorCTQwLDEwMSwyNTQsNCwyMDIsMTkwLDE0NywyNTQsNSwyMDIsMTQ3LDE0NywKKwkyNTQsOCw0MCw4NywzMywxMDcsMTUyLDIyOSwyMDUsMjQwLDE0MiwxOTUsCisJMTk4LDE0OSw1OCwyMDEsMTU0LDE4MywzMiwyMSwzMywxMTEsMTUyLDEyNiwKKwk1MCwyMjksMTQ5LDIwNSw1MiwxNDQsMzMsMTEwLDE1MiwxMTAsMzgsMCwKKwkyMjksMjA1LDExLDE0MiwxOTMsMjM3LDkxLDk2LDE1Miw0MiwxMDQsMTUyLAorCTI1LDIyMSwxMTcsMjU0LDIyMSwxMTYsMjU1LDM1LDM1LDU0LDIsMTcsCisJMiwwLDQzLDQzLDExNSwzNSwxMTQsNTgsNDQsMTUyLDM1LDM1LAorCTExOSw1OCwyMjgsMTQ5LDM1LDExOSw2MiwxLDIxMSwxMDAsMjExLDg0LAorCTYyLDEsNTAsMjAxLDE1NCwyNCwxNjksMjA1LDE1MywxNDIsNTgsMjMxLAorCTE0OSwxODMsNDAsMjUwLDE3NSw1MCwyMzEsMTQ5LDMzLDExMCwxNTIsMTI2LAorCTI1NCwyNTUsNDAsOTEsNTgsMjMzLDE0OSwyMzAsNjMsMTgzLDQwLDgzLAorCTk0LDIyLDAsMzMsMjM0LDE0OSwyNSwxMjYsMTgzLDQwLDEzLDMzLAorCTExMCwxNTIsOTQsMzMsMjM0LDE1MCwyNSwxMjYsMjU0LDMsMzIsMzYsCisJMjA1LDgxLDE0OCwxMjUsMTgwLDMzLDExMCwxNTIsOTQsMjIsMCw0MCwKKwkxNywzMywyMzQsMTQ5LDI1LDU0LDAsMzMsMTA3LDE1MiwyMjksMjA1LAorCTI0MCwxNDIsMTkzLDE5NSwxOTgsMTQ5LDMzLDIzNCwxNTAsMjUsNTQsMCwKKwkzMywxMTAsMTUyLDk0LDIyLDAsMzMsMjM0LDE0OSwyNSwxMjYsNTAsCisJNDksMTUyLDI1NCwxMzIsMzIsMzcsNjIsNDcsNTAsMzQsMTUyLDQyLAorCTEwNywxNTIsMjI5LDMzLDExMCwxNTIsMjI5LDIwNSwxNzQsMTQwLDE5MywxOTMsCisJMTI1LDE4MCwzMywxMTAsMTUyLDk0LDIyLDAsMzMsMjM0LDE1MCwyMDIsCisJMTE3LDE0NywyNSw1MiwxOTUsMTIwLDE0Nyw1OCw0OSwxNTIsMjU0LDE0MCwKKwkzMiw3LDYyLDEsNTAsMzQsMTUyLDI0LDIxMCw2MiwzMiw1MCwKKwkxMDYsMTUyLDI0LDE5LDU4LDQ5LDE1Miw5NSw1OCwxMDYsMTUyLDE2MywKKwkxODMsNTgsMTA2LDE1MiwzMiwxMSwyMDMsNjMsNTAsMTA2LDE1Miw1OCwKKwkxMDYsMTUyLDE4MywzMiwyMzEsMjU0LDIsNDAsNTEsMjU0LDQsNDAsCisJMzgsMjU0LDgsNDAsMjYsMjU0LDE2LDQwLDEzLDI1NCwzMiwzMiwKKwkxNTgsNjIsMTY1LDUwLDQ5LDE1Miw2Miw2OSwyNCwxOTAsNjIsMTY0LAorCTUwLDQ5LDE1Miw2Miw3MCwyNCwxODEsNjIsMTYzLDUwLDQ5LDE1MiwKKwkxNzUsMjQsMTczLDYyLDE2Miw1MCw0OSwxNTIsNjIsMSwyNCwxNjQsCisJNjIsMTYxLDUwLDQ5LDE1Miw2MiwzLDI0LDE1NSwyNSw1NCwwLAorCTIyMSwxMjYsMjUxLDI1NCw4LDQwLDcsNTgsMjMwLDE0OSwxODMsMjAyLAorCTMyLDE0NiwzMywxMDcsMTUyLDIyOSwyMDUsMjQwLDE0MiwxOTMsMjExLDg0LAorCTE5NSwxOTgsMTQ5LDIzNyw5MSw5NiwxNTIsNDIsMTA0LDE1MiwyNSwyMjEsCisJMTE3LDI1NCwyMjEsMTE2LDI1NSwzNSwzNSw1NCw2LDE3LDIsMCwKKwk0Myw0MywxMTUsMzUsMTE0LDU4LDIyOCwxNDksMzUsMzUsMTE5LDU4LAorCTIzMywxNDksMzUsMTE5LDIwNSwxNDYsMTQyLDE5NSwzMiwxNDYsMjM3LDkxLAorCTk2LDE1Miw0MiwxMDQsMTUyLDI1LDIyOSwyMDUsMTYwLDE0MiwxOTMsNTgsCisJMjMxLDE0OSwxODMsNDAsMjUwLDE3NSw1MCwyMzEsMTQ5LDI0MywyMzcsOTEsCisJOTYsMTUyLDQyLDEwNCwxNTIsMjUsMjIxLDExNywyNTQsMjIxLDExNiwyNTUsCisJNzgsMzUsNzAsMjIxLDExMywyNTIsMjIxLDExMiwyNTMsODksODAsNDIsCisJOTgsMTUyLDE4MywyMzcsODIsMzQsOTgsMTUyLDIwMywxMjQsNDAsMTksCisJMzMsMCwwLDM0LDk4LDE1MiwzNCwxMDIsMTUyLDM0LDk2LDE1MiwKKwk2MiwxLDUwLDk1LDE1MiwyNCw0MCwyMjEsOTQsMjUyLDIyMSw4NiwKKwkyNTMsMTksMTksMTksNDIsOTYsMTUyLDI1LDM0LDk2LDE1MiwyMzcsCisJOTEsMTAwLDE1MiwzMywxNTgsMjUzLDI1LDIzNyw5MSw5NiwxNTIsMjA1LAorCTE3MSwxNDksMjQyLDU1LDE0OCwzMywwLDAsMzQsOTYsMTUyLDE3NSwKKwk1MCwyMzAsMTQ5LDI1MSwxOTUsMzIsMTQ2LDI0NSw2MiwxLDUwLDIzMSwKKwkxNDksNjIsMTYsMjM3LDU3LDAsMjExLDgwLDI0MSwyNTEsMjM3LDc3LAorCTIwMSwyMDUsMTg2LDE0OSwyMjksMjI5LDMzLDAsMCwzNCwzNywxNTIsCisJMzMsMTEwLDE1MiwxMjYsNTAsMjM0LDE1MSw1OCw0NCwxNTIsMzMsMjM1LAorCTE1MSwxMTksMjIxLDU0LDI1MywwLDIyMSw1NCwyNTQsMCwxOTUsMjMwLAorCTE0OCwzMywyMzYsMTUxLDU0LDE3NSwzMywzLDAsMjI5LDMzLDIzNCwKKwkxNTEsMjI5LDIwNSwxNzQsMTQwLDE5MywxOTMsMzMsMjM2LDE1MSwxMjYsMjU0LAorCTI1NSw0MCw3NCwzMywyNDUsMTUxLDExMCwyMjEsMTE3LDI1NSwzMywyNDksCisJMTUxLDEyNiwyMjEsMTY2LDI1NSwyMjEsMTE5LDI1NSwzMywyNTMsMTUxLDEyNiwKKwkyMjEsMTY2LDI1NSwyMjEsMTE5LDI1NSw1OCwyMzIsMTQ5LDk1LDIyMSwxMjYsCisJMjU1LDE2MywyMjEsMTE5LDI1NSwxODMsNDAsMTUsMjMwLDE5MSwzMywxMTAsCisJMTUyLDk0LDIyLDAsMzMsMjM0LDE0OSwyNSwxMTksMjQsMTIsMzMsCisJMTEwLDE1Miw5NCwyMiwwLDMzLDIzNCwxNDksMjUsNTQsMTMyLDMzLAorCTAsMCwxOTUsMTk4LDE0OSwyMjEsMTEwLDI1MywyMjEsMTAyLDI1NCwzNSwKKwkyMjEsMTE3LDI1MywyMjEsMTE2LDI1NCwxNywzMiwwLDIyMSwxMTAsMjUzLAorCTIyMSwxMDIsMjU0LDIwNSwxNzEsMTQ5LDI1MCwxMTcsMTQ4LDU4LDIzMywxNDksCisJMjAzLDg3LDQwLDg0LDMzLDEsMCwzNCwzNywxNTIsMjIxLDU0LAorCTI1MywwLDIyMSw1NCwyNTQsMCwyNCw1MywzMywyMzYsMTUxLDU0LAorCTE3NSwzMywzLDAsMjI5LDMzLDIzNCwxNTEsMjI5LDIwNSwxNzQsMTQwLAorCTE5MywxOTMsMzMsMjM2LDE1MSwxMjYsMjU0LDI1NSw0MCwxNCwzMywxMTAsCisJMTUyLDk0LDIyLDAsMzMsMjM0LDE0OSwyNSw1NCwxNDAsMjQsMTU5LAorCTIyMSwxMTAsMjUzLDIyMSwxMDIsMjU0LDM1LDIyMSwxMTcsMjUzLDIyMSwxMTYsCisJMjU0LDE3LDMyLDAsMjIxLDExMCwyNTMsMjIxLDEwMiwyNTQsMjA1LDE3MSwKKwkxNDksMjUwLDEyLDE0OSwzMywyLDAsMzQsMzcsMTUyLDIyMSw1NCwKKwkyNTMsMCwyMjEsNTQsMjU0LDAsMjQsNTQsMzMsMjM2LDE1MSw1NCwKKwkxNzUsMzMsMywwLDIyOSwzMywyMzQsMTUxLDIyOSwyMDUsMTc0LDE0MCwKKwkxOTMsMTkzLDMzLDIzNiwxNTEsMTI2LDI1NCwyNTUsNDAsMTUsMzMsMTEwLAorCTE1Miw5NCwyMiwwLDMzLDIzNCwxNDksMjUsNTQsMTMyLDE5NSwyMTEsCisJMTQ4LDIyMSwxMTAsMjUzLDIyMSwxMDIsMjU0LDM1LDIyMSwxMTcsMjUzLDIyMSwKKwkxMTYsMjU0LDE3LDMyLDAsMjIxLDExMCwyNTMsMjIxLDEwMiwyNTQsMjA1LAorCTE3MSwxNDksMjUwLDk2LDE0OSwzMywxLDAsMTk1LDE5OCwxNDksMTI0LAorCTE3MCwyNTAsMTc5LDE0OSwyMzcsODIsMjAxLDEyNCwyMzAsMTI4LDIzNyw4MiwKKwk2MCwyMDEsMjI1LDI1MywyMjksMjIxLDIyOSwyMjEsMzMsMCwwLDIyMSwKKwk1NywyMzMsMjIxLDI0OSwyMjEsMjI1LDI1MywyMjUsMjAxLDIzMywyMjUsMjUzLAorCTIyOSwyMjEsMjI5LDIyMSwzMywwLDAsMjIxLDU3LDk0LDM1LDg2LAorCTM1LDIzNSw1NywyNDksMjM1LDIzMywwLDAsMCwwLDAsMCwKKwk2MiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMTc1LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwxMzMsMSwwLDAsMCw2MywKKwkyNTUsMjU1LDI1NSwyNTUsMCwwLDAsNjMsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDI0LDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMAorCX0gOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FwcGxldGFsay9jb3BzX2x0ZHJ2LmggYi9kcml2ZXJzL25ldC9hcHBsZXRhbGsvY29wc19sdGRydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZGU2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcHBsZXRhbGsvY29wc19sdGRydi5oCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICoJVGhlIGZpcm13YXJlIHRoaXMgZHJpdmVyIGRvd25sb2FkcyBpbnRvIHRoZSBMb2NhbHRhbGsgY2FyZCBpcyBhCisgKglzZXBhcmF0ZSBwcm9ncmFtIGFuZCBpcyBub3QgR1BMJ2Qgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoZSBMaW51eAorICoJc2lkZSBkcml2ZXIgYW5kIHRoZSByb3V0aW5lIHRoYXQgbG9hZHMgdGhpcyBkYXRhIGludG8gdGhlIGNhcmQgYXJlLgorICoJCisgKglJdCBpcyB0YWtlbiBmcm9tIHRoZSBDT1BTIFNESyBhbmQgaXMgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNlCisgKgorICoJVGhpcyBtYXRlcmlhbCBpcyBsaWNlbnNlZCB0byB5b3Ugc3RyaWN0bHkgZm9yIHVzZSBpbiBjb25qdW5jdGlvbiB3aXRoCisgKgl0aGUgdXNlIG9mIENPUFMgTG9jYWxUYWxrIGFkYXB0ZXJzLgorICoJVGhlcmUgaXMgbm8gY2hhcmdlIGZvciB0aGlzIFNESy4gQW5kIG5vIHdhcmFudHkgZXhwcmVzcyBvciBpbXBsaWVkCisgKglhYm91dCBpdHMgZml0bmVzcyBmb3IgYW55IHB1cnBvc2UuIEhvd2V2ZXIsIHdlIHdpbGwgY2hlZXJlZnVsbHkKKyAqCXJlZnVuZCBldmVyeSBwZW5ueSB5b3UgcGFpZCBmb3IgdGhpcyBTREsuLi4KKyAqCVJlZ2FyZHMsCisgKgorICoJVGhvbWFzIEYuIERpdmluZQorICoJQ2hpZWYgU2NpZW50aXN0CisgKi8KKworCisvKiAgICAgIGNvcHNfbHRkcnYuaDogTG9jYWxUYWxrIGRyaXZlciBmaXJtd2FyZSBkdW1wIGZvciBMaW51eC4KKyAqCisgKiAgICAgIEF1dGhvcnM6CisgKiAgICAgIC0gSmF5IFNjaHVsaXN0IDxqc2NobHN0QHNhbWJhLm9yZz4KKyAqLworIAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaWZkZWYgQ09ORklHX0NPUFNfVEFOR0VOVAorCit1bnNpZ25lZCBjaGFyIGx0ZHJ2X2NvZGVbXSA9IHsKKwk1OCwzLDAsNTAsMTQ4LDEwLDMzLDE0MywxNSw2Miw4NSwxMTksCisJMTkwLDMyLDksNjIsMTcwLDExOSwxOTAsMzIsMywzNSwyNCwyNDEsCisJMzQsMTQ2LDEwLDI0OSwxNywxNTAsMTAsMzMsMTQzLDE1LDE4MywyMzcsCisJODIsNzcsNjgsMTEsMTA3LDk4LDE5LDU0LDAsMjM3LDE3Niw2MiwKKwkxNiwyMzcsNTcsNTEsNjIsMCwyMzcsNTcsNTAsMjM3LDU3LDU0LAorCTYyLDEyLDIzNyw1Nyw0OSw2MiwxOTUsMzMsMzksMiw1MCw1NiwKKwkwLDM0LDU3LDAsMjM3LDg2LDIwNSwzMCwyLDI1MSwyMDUsNjAsCisJMTAsMjQsMTY5LDY3LDExMSwxMTIsMTIxLDExNCwxMDUsMTAzLDEwNCwxMTYsCisJMzIsNDAsOTksNDEsMzIsNDksNTcsNTYsNTYsNDUsNDksNTcsCisJNTcsNTAsNDQsMzIsODAsMTE0LDEwNSwxMTAsMTE2LDEwNSwxMTAsMTAzLAorCTMyLDY3LDExMSwxMDksMTA5LDExNywxMTAsMTA1LDk5LDk3LDExNiwxMDUsCisJMTExLDExMCwxMTUsMzIsNjUsMTE1LDExNSwxMTEsOTksMTA1LDk3LDExNiwKKwkxMDEsMTE1LDQ0LDMyLDczLDExMCw5OSw0Niw2NSwxMDgsMTA4LDMyLAorCTExNCwxMDUsMTAzLDEwNCwxMTYsMTE1LDMyLDExNCwxMDEsMTE1LDEwMSwxMTQsCisJMTE4LDEwMSwxMDAsNDYsMzIsMzIsNCw0LDIyLDQwLDI1NSw2MCwKKwk0LDk2LDEwLDIyNCw2LDAsNywxMjYsMiw2NCwxMSwyNDYsCisJMTIsNiwxMywwLDE0LDE5MywxNSwwLDUsOTYsMywxOTIsCisJMSwwLDksOCw2MiwzLDIxMSw4Miw2MiwxOTIsMjExLDgyLAorCTIwMSw2MiwzLDIxMSw4Miw2MiwyMTMsMjExLDgyLDIwMSw2Miw1LAorCTIxMSw4Miw2MiwyMjQsMjExLDgyLDIwMSw2Miw1LDIxMSw4Miw2MiwKKwkyMjQsMjExLDgyLDIwMSw2Miw1LDIxMSw4Miw2Miw5NiwyMTEsODIsCisJMjAxLDYsMjgsMzMsMTgwLDEsMTQsODIsMjM3LDE2MywxOTQsNCwKKwkyLDMzLDM5LDIsMzQsNjQsMCw1OCwzLDAsMjMwLDEsCisJMTkyLDYyLDExLDIzNywxMjEsNjIsMTE4LDIzNywxMjEsMjAxLDMzLDE4MiwKKwkxMCw1NCwxMzIsMjA1LDI1MywxLDIwMSwyNDUsMTk3LDIxMywyMjksNDIsCisJMTUwLDEwLDE0LDgzLDE3LDk4LDIsNjcsMjAsMjM3LDE2Miw1OCwKKwkxNzksMSw5NSwyMTksODIsMjMwLDEsMzIsNiwyOSwzMiwyNDcsCisJMTk1LDE3LDMsNjIsMSwyMTEsODIsMjE5LDgyLDk1LDIzMCwxNjAsCisJMzIsMTAsMjM3LDE2MiwzMiwyMjUsMjEsMzIsMjIyLDE5NSwxNSwzLAorCTIzNywxNjIsMTIzLDIzMCw5NiwxOTQsMjEsMyw2Miw0OCwyMTEsODIsCisJNjIsMSwyMTEsODIsMTc1LDIxMSw4MiwyMzcsOTEsMTUwLDEwLDQzLAorCTU1LDIzNyw4MiwyMTgsMTksMywzNCwxNTIsMTAsOTgsMTA3LDU4LAorCTE1NCwxMCwxOTAsMzIsODEsNjIsMSw1MCwxNTgsMTAsMzUsMzUsCisJNjIsMTMyLDE5MCwzMiw0NCw1NCwxMzMsNDMsNzAsNTgsMTU0LDEwLAorCTExOSw0MywxMTIsMTcsMywwLDIwNSwxMzcsMyw2MiwxNiwyMTEsCisJODIsNjIsNTYsMjExLDgyLDIwNSwyMTcsMSw0MiwxNTAsMTAsMTQsCisJODMsMTcsOTgsMiw2NywyMCw1OCwxNzgsMSw5NSwxOTUsNTksCisJMiw2MiwxMjksMTkwLDE5NCwyMjcsMiw1NCwxMzAsNDMsNzAsNTgsCisJMTU0LDEwLDExOSw0MywxMTIsMTcsMywwLDIwNSwxMzcsMywxOTUsCisJMjU0LDIsMzUsMzUsMTI2LDI1NCwxMzIsMTk0LDIyNywyLDIwNSw2MSwKKwkzLDI0LDIwLDYyLDEyOCwxNjYsMTk0LDIyMiwyLDIyMSwyMjksMjIxLAorCTMzLDE3NSwxMCwyMDUsOTMsNiwyMDUsMTQ0LDcsMjIxLDIyNSwyMjUsCisJMjA5LDE5MywyNDEsMjUxLDIzNyw3NywyMjEsMjI5LDIyMSwzMywxNTksMTAsCisJMjA1LDkzLDYsMjIxLDIyNSwyMDUsNjEsMywxOTUsMjQ3LDIsMjQsCisJMjM3LDI0LDIzNSwyNCwyMzMsMjMwLDY0LDQwLDIsMjQsMjI3LDI0LAorCTIyNSwxNzUsNTAsMTc5LDEwLDIwNSwyMDgsMSwyMDEsMTk3LDMzLDQsCisJMCw1NywxMjYsMzUsMTAyLDExMSwyMDUsNTEsMywxOTMsMjAxLDYyLAorCTEsNTAsMTc5LDEwLDM0LDE1MCwxMCw1NCwwLDU4LDE3OSwxMCwKKwkxODMsMjAwLDYyLDE0LDIxMSw4Miw2MiwxOTMsMjExLDgyLDYyLDEwLAorCTIxMSw4Miw2MiwyMjQsMjExLDgyLDYyLDYsMjExLDgyLDU4LDE1NCwKKwkxMCwyMTEsODIsNjIsMTYsMjExLDgyLDYyLDU2LDIxMSw4Miw2MiwKKwk0OCwyMTEsODIsMjE5LDgyLDIzMCwxLDQwLDQsMjE5LDgzLDI0LAorCTI0Miw2MiwxNCwyMTEsODIsNjIsMzMsMjExLDgyLDYyLDEsMjExLAorCTgyLDYyLDksMjExLDgyLDYyLDMyLDIxMSw4MiwyMDUsMjE3LDEsCisJMjAxLDE0LDgzLDIwNSwyMDgsMSwyNCwyMywxNCw4MywyMDUsMjA4LAorCTEsMjA1LDIyNiwxLDU4LDE3NCwxLDYxLDMyLDI1MywyMDUsMjQ0LAorCTEsNTgsMTc0LDEsNjEsMzIsMjUzLDIwNSwyMjYsMSw1OCwxNzUsCisJMSw2MSwzMiwyNTMsNjIsNSwyMTEsODIsNjIsMjMzLDIxMSw4MiwKKwk2MiwxMjgsMjExLDgyLDU4LDE3NiwxLDYxLDMyLDI1MywyMzcsMTYzLAorCTI3LDYyLDE5MiwyMTEsODIsMjE5LDgyLDIzMCw0LDQwLDI1MCwyMzcsCisJMTYzLDI3LDEyMiwxNzksMzIsMjQzLDIxOSw4MiwyMzAsNCw0MCwyNTAsCisJNTgsMTc4LDEsNzEsMjE5LDgyLDIzMCw0LDQwLDMsNSwzMiwKKwkyNDcsMjE5LDgyLDIzMCw0LDQwLDI1MCwyMDUsMjM1LDEsNTgsMTc3LAorCTEsNjEsMzIsMjUzLDIwNSwyNDQsMSwyMDEsMjI5LDIxMywzNSwzNSwKKwkxMjYsMjMwLDEyOCwxOTQsMTQ1LDQsNDMsNTgsMTU0LDEwLDExOSw0MywKKwk3MCwzMywxODEsMTAsMTE5LDQzLDExMiwxNywzLDAsMjQzLDYyLAorCTEwLDIxMSw4MiwyMTksODIsMjMwLDEyOCwyMDIsNDEsNCwyMDksMjI1LAorCTYyLDEsNTUsMjUxLDIwMSwyMDUsMTQ0LDMsNTgsMTgwLDEwLDI1NCwKKwkyNTUsMjAyLDEyNyw0LDIwNSwyMTcsMSw1OCwxNzgsMSw3MSwyMTksCisJODIsMjMwLDEsMzIsNiw1LDMyLDI0NywxOTUsMTczLDQsMjE5LAorCTgzLDcxLDU4LDE1NCwxMCwxODQsMTk0LDE3Myw0LDU4LDE3OCwxLAorCTcxLDIxOSw4MiwyMzAsMSwzMiw2LDUsMzIsMjQ3LDE5NSwxNzMsCisJNCwyMTksODMsNTgsMTc4LDEsNzEsMjE5LDgyLDIzMCwxLDMyLAorCTYsNSwzMiwyNDcsMTk1LDE3Myw0LDIxOSw4MywyNTQsMTMzLDE5NCwKKwkxNzMsNCw1OCwxNzksMSwyNCw0LDU4LDE3OSwxLDEzNSw2MSwKKwkzMiwyNTMsMjA5LDIyNSwyMDUsMTM3LDMsMjA1LDYxLDMsMTgzLDI1MSwKKwkyMDEsMjA5LDIyNSwyNDMsNjIsMTAsMjExLDgyLDIxOSw4MiwyMzAsMTI4LAorCTIwMiwxNjQsNCw2MiwxLDU1LDI1MSwyMDEsMjA1LDE0NCwzLDIwNSwKKwk2MSwzLDE4MywyNTEsMjAxLDIwOSwyMjUsNjIsMiw1NSwyNTEsMjAxLAorCTI0Myw2MiwxNCwyMTEsODIsNjIsMzMsMjExLDgyLDI1MSwyMDEsMzMsCisJNCwwLDU3LDk0LDM1LDg2LDMzLDIsMCw1NywxMjYsMzUsCisJMTAyLDExMSwyMjEsMjI5LDM0LDE5MywxMCwyMzcsODMsMTk1LDEwLDIyMSwKKwkzMywxNzEsMTAsMjA1LDkzLDYsNTgsMTg1LDEwLDUwLDE4NiwxMCwKKwk1OCwxODQsMTAsMTM1LDUwLDE4NCwxMCwyMDUsMTEyLDYsMjU0LDMsCisJNTYsMTYsNTgsMTg1LDEwLDEzNSw2MCwyMzAsMTUsNTAsMTg1LDEwLAorCTE3NSw1MCwxODQsMTAsMjQsMjMsNTgsMTgzLDEwLDIwNSwxMTIsNiwKKwkyNTQsMyw0OCwxMyw1OCwxODUsMTAsMjAzLDYzLDUwLDE4NSwxMCwKKwk2MiwyNTUsNTAsMTgzLDEwLDU4LDE4NSwxMCw1MCwxODYsMTAsNTgsCisJMTgzLDEwLDEzNSw1MCwxODMsMTAsNjIsMzIsNTAsMTg3LDEwLDUwLAorCTE4OCwxMCw2LDI1NSwyMTksODIsMjMwLDE2LDMyLDMsNSwzMiwKKwkyNDcsMjA1LDE4MCw0LDYsNDAsMjE5LDgyLDIzMCwxNiw0MCwzLAorCTUsMzIsMjQ3LDYyLDEwLDIxMSw4MiwyMTksODIsMjMwLDEyOCwxOTQsCisJNDYsNSwyMTksODIsMjMwLDE2LDQwLDIxNCwyMzcsOTUsNzEsNTgsCisJMTg2LDEwLDE2MCwyMzAsMTUsNDAsMzIsNzEsMTQsMTAsNjIsMTAsCisJMjExLDgyLDIxOSw4MiwyMzAsMTI4LDIwMiwxMTksNSwyMDUsMTgwLDQsCisJMTk1LDE1Niw1LDIxOSw4MiwyMzAsMTYsMjAyLDE1Niw1LDEzLDMyLAorCTIyOSwxNiwyMjUsNDIsMTkzLDEwLDIzNyw5MSwxOTUsMTAsMjA1LDI1MiwKKwkzLDQ4LDcsNjEsMjAyLDE1Niw1LDE5NSwxOTcsNSwyMjEsMjI1LAorCTMzLDAsMCwyMDEsMjIxLDMzLDE2MywxMCwyMDUsOTMsNiw1OCwKKwkxODgsMTAsNjEsNTAsMTg4LDEwLDQwLDE5LDU4LDE4NiwxMCwyNDYsCisJMSw1MCwxODYsMTAsNTgsMTgzLDEwLDI0NiwxLDUwLDE4MywxMCwKKwkxOTUsNDYsNSwyMjEsMjI1LDMzLDEsMCwyMDEsMjIxLDMzLDE2NywKKwkxMCwyMDUsOTMsNiw1OCwxODQsMTAsMjQ2LDEsNTAsMTg0LDEwLAorCTU4LDE4NiwxMCwxMzUsMjQ2LDEsNTAsMTg2LDEwLDU4LDE4NywxMCwKKwk2MSw1MCwxODcsMTAsMTk0LDQ2LDUsMjIxLDIyNSwzMywyLDAsCisJMjAxLDIyMSwyMjksMzMsMCwwLDU3LDE3LDQsMCwyNSwxMjYsCisJNTAsMTU0LDEwLDIzMCwxMjgsNTAsMTg5LDEwLDU4LDE4OSwxMCwxODMsCisJNDAsNiwyMjEsMzMsODgsMiwyNCw0LDIyMSwzMywxNTAsMCwKKwk1OCwxNTQsMTAsMTgzLDQwLDQ5LDYwLDQwLDQ2LDYxLDMzLDE5MCwKKwkxMCwxMTksMzUsMTE5LDM1LDU0LDEyOSwxNzUsNTAsMTU4LDEwLDIyMSwKKwk0MywyMjEsMjI5LDIyNSwxMjQsMTgxLDQwLDQyLDMzLDE5MCwxMCwxNywKKwkzLDAsMjA1LDIwNiw0LDE3LDIzMiwzLDI3LDEyMywxNzgsMzIsCisJMjUxLDU4LDE1OCwxMCwxODMsNDAsMjI0LDU4LDE1NCwxMCw3MSw2MiwKKwk3LDEyOCwyMzAsMTI3LDcxLDU4LDE4OSwxMCwxNzYsNTAsMTU0LDEwLAorCTI0LDE2NiwyMjEsMjI1LDIwMSwxODMsMjIxLDUyLDAsMTkyLDIyMSw1MiwKKwkxLDE5MiwyMjEsNTIsMiwxOTIsMjIxLDUyLDMsMTkyLDU1LDIwMSwKKwk2LDgsMTQsMCwzMSw0OCwxLDEyLDE2LDI1MCwxMjEsMjAxLAorCTMzLDIsMCw1Nyw5NCwzNSw4NiwzNSw3OCwzNSw3MCwzNSwKKwkxMjYsMzUsMTAyLDEwNSw3OSwxMjAsNjgsMTAzLDIzNywxNzYsMjAxLDMzLAorCTIsMCw1NywxMjYsMzUsMTAyLDExMSw2MiwxNywyMzcsNTcsNDgsCisJMTI1LDIzNyw1Nyw0MCwxMjQsMjM3LDU3LDQxLDYyLDAsMjM3LDU3LAorCTQyLDYyLDY0LDIzNyw1Nyw0Myw2MiwwLDIzNyw1Nyw0NCwzMywKKwkxMjgsMiwxMjUsMjM3LDU3LDQ2LDEyNCwyMzcsNTcsNDcsNjIsMTQ1LAorCTIzNyw1Nyw0OCwyMTEsNjgsNTgsMTQ5LDEwLDIxMSw2NiwyMDEsMzMsCisJMiwwLDU3LDEyNiwzNSwxMDIsMTExLDYyLDMzLDIzNyw1Nyw0OCwKKwk2Miw2NCwyMzcsNTcsMzIsNjIsMCwyMzcsNTcsMzMsMjM3LDU3LAorCTM0LDEyNSwyMzcsNTcsMzUsMTI0LDIzNyw1NywzNiw2MiwwLDIzNywKKwk1NywzNywzMywxMjgsMiwxMjUsMjM3LDU3LDM4LDEyNCwyMzcsNTcsCisJMzksNjIsOTcsMjM3LDU3LDQ4LDIxMSw2Nyw1OCwxNDksMTAsMjExLAorCTY2LDIwMSwyMzcsNTYsNDYsOTUsMjM3LDU2LDQ3LDg3LDIzNyw1NiwKKwk0NiwxMTEsMjM3LDU2LDQ3LDEwMywxODMsMjM3LDgyLDMyLDIzNSwzMywKKwkxMjgsMiwxODMsMjM3LDgyLDIwMSwyMzcsNTYsMzgsOTUsMjM3LDU2LAorCTM5LDg3LDIzNyw1NiwzOCwxMTEsMjM3LDU2LDM5LDEwMywxODMsMjM3LAorCTgyLDMyLDIzNSwzMywxMjgsMiwxODMsMjM3LDgyLDIwMSwyMDUsMTA2LAorCTEwLDIyMSwxMTAsNiwyMjEsMTAyLDcsMTI2LDM1LDExMCwxMDMsMTk1LAorCTExOCwxMCwyMDUsMTA2LDEwLDMzLDAsMCwzNCwyMDUsMTAsMzQsCisJMTk4LDEwLDM0LDIwMCwxMCwzMywxNDMsMTUsMzQsMjA3LDEwLDIzNywKKwk5MSwyMDcsMTAsNDIsMTQ2LDEwLDE4MywyMzcsODIsMTcsMCwyNTUsCisJMjUsMzQsMjAzLDEwLDIwMywxMjQsNDAsNiwzMywwLDEyNSwzNCwKKwkyMDMsMTAsNDIsMjA3LDEwLDIyOSwyMDUsMzcsMywxOTUsMTE4LDEwLAorCTIwNSwxMDYsMTAsMjI5LDQyLDE1MCwxMCwzNSwzNSwzNSwyMjksMjA1LAorCTcwLDcsMTkzLDEyNCwyMzAsMywxMDMsMjIxLDExNywyNTQsMjIxLDExNiwKKwkyNTUsMjM3LDkxLDE1MiwxMCwzNSwzNSwzNSwxODMsMjM3LDgyLDMyLAorCTEyLDE3LDUsMCw0MiwxNTIsMTAsMjA1LDkxLDEwLDI0MiwyMDMsCisJNyw0MiwxNTAsMTAsMjI5LDIwNSwzNywzLDE5NSwxMTgsMTAsMjM3LAorCTkxLDE1MiwxMCw0MiwyMDAsMTAsMjUsMzQsMjAwLDEwLDQyLDIwNSwKKwkxMCwyNSwzNCwyMDUsMTAsMjM3LDkxLDIwMywxMCwzMywxNTgsMjUzLAorCTI1LDIzNyw5MSwyMDUsMTAsMjA1LDkxLDEwLDI0MiwyNDUsNywzMywKKwkwLDAsMzQsMjA1LDEwLDYyLDEsNTAsMTk3LDEwLDIwNSw1LAorCTgsMzMsMCwwLDU3LDI0OSwxOTUsMTE4LDEwLDIwNSwxMDYsMTAsCisJNTgsMTk3LDEwLDE4MywyMDIsMTE4LDEwLDIzNyw5MSwxOTgsMTAsNDIsCisJMjA1LDEwLDIwNSw5MSwxMCwyNDIsNDYsOCwyMzcsOTEsMjA1LDEwLAorCTMzLDk4LDIsMjUsMjM3LDkxLDE5OCwxMCwyMDUsOTEsMTAsMjUwLAorCTc4LDgsMjM3LDkxLDE5OCwxMCw0MiwyMDUsMTAsMTgzLDIzNyw4MiwKKwkzMiw3LDQyLDIwMCwxMCwxMjUsMTgwLDQwLDEzLDIzNyw5MSwyMDUsCisJMTAsNDIsMTk4LDEwLDIwNSw5MSwxMCwyNDIsOTcsOCwyMzcsOTEsCisJMjA3LDEwLDQyLDIwNSwxMCwyNSwyMjksMjA1LDM3LDMsMTc1LDUwLAorCTE5NywxMCwxOTUsMTE4LDEwLDIwNSwyOSwzLDMzLDAsMCw1NywKKwkyNDksMTk1LDExOCwxMCwyMDUsMTA2LDEwLDU4LDIwMiwxMCwxODMsNDAsCisJMjIsMjA1LDE0LDcsMjM3LDkxLDIwOSwxMCwxOSwxOSwxOSwyMDUsCisJOTEsMTAsMjQyLDEzOSw4LDMzLDEsMCwxOTUsMTE4LDEwLDMzLAorCTAsMCwxOTUsMTE4LDEwLDIwNSwxMjYsMTAsMjUyLDI1NSwyMDUsMTA4LAorCTgsMTI1LDE4MCwxOTQsMTE4LDEwLDIzNyw5MSwyMDAsMTAsMzMsMCwKKwkwLDIwNSw5MSwxMCwyNDIsMTE4LDEwLDIzNyw5MSwyMDcsMTAsNDIsCisJMTk4LDEwLDI1LDIyMSwxMTcsMjU0LDIyMSwxMTYsMjU1LDM1LDM1LDM1LAorCTIyOSwyMDUsNzAsNywxOTMsMTI0LDIzMCwzLDEwMywzNSwzNSwzNSwKKwkyMjEsMTE3LDI1MiwyMjEsMTE2LDI1MywyMjksMjIxLDExMCwyNTQsMjIxLDEwMiwKKwkyNTUsMjI5LDMzLDIxMiwxMCwyMjksMjA1LDEyNCw2LDE5MywxOTMsMjIxLAorCTExMCwyNTIsMjIxLDEwMiwyNTMsMzQsMjA5LDEwLDMzLDIxMSwxMCw1NCwKKwk0LDMzLDIwOSwxMCwyMjcsMjA1LDE0Nyw2LDE5Myw2MiwxLDUwLAorCTIwMiwxMCwyNDMsMjIxLDk0LDI1MiwyMjEsODYsMjUzLDQyLDIwMCwxMCwKKwkxODMsMjM3LDgyLDM0LDIwMCwxMCwyMDMsMTI0LDQwLDE3LDMzLDAsCisJMCwzNCwyMDAsMTAsMzQsMjA1LDEwLDM0LDE5OCwxMCw1MCwxOTcsCisJMTAsMjQsMzcsMjIxLDk0LDI1MiwyMjEsODYsMjUzLDQyLDE5OCwxMCwKKwkyNSwzNCwxOTgsMTAsMjM3LDkxLDIwMywxMCwzMywxNTgsMjUzLDI1LAorCTIzNyw5MSwxOTgsMTAsMjA1LDkxLDEwLDI0Miw2OCw5LDMzLDAsCisJMCwzNCwxOTgsMTAsMjA1LDUsOCwzMywwLDAsNTcsMjQ5LAorCTI1MSwxOTUsMTE4LDEwLDIwNSwxMDYsMTAsMzMsNDksMTMsMTI2LDE4MywKKwk0MCwxNiwyMDUsNDIsNywyMzcsOTEsNDcsMTMsMTksMTksMTksCisJMjA1LDkxLDEwLDI0MiwxMTcsOSw1OCwxNDIsMTUsMTk4LDEsNTAsCisJMTQyLDE1LDE5NSwxMTgsMTAsMzMsNDksMTMsMTI2LDI1NCwxLDQwLAorCTI1LDI1NCwzLDIwMiw3LDEwLDI1NCw1LDIwMiwyMSwxMCwzMywKKwk0OSwxMyw1NCwwLDMzLDQ3LDEzLDIyOSwyMDUsMjA3LDYsMTk1LAorCTExOCwxMCw1OCwxNDEsMTUsMTgzLDMyLDcyLDMzLDUxLDEzLDEyNiwKKwk1MCwxNDksMTAsMjA1LDg2LDcsMzMsNTAsMTMsMTI2LDIzMCwxMjcsCisJMTgzLDMyLDQwLDU4LDE0MiwxNSwyMzAsMTI3LDUwLDE0MiwxNSwxODMsCisJMzIsNSwxOTgsMSw1MCwxNDIsMTUsMzMsNTAsMTMsMTI2LDExMSwKKwkyMywxNTksMTAzLDIwMywxMjUsNTgsMTQyLDE1LDQwLDUsMTk4LDEyOCwKKwk1MCwxNDIsMTUsMzMsNTAsMTMsMTE5LDMzLDUwLDEzLDEyNiwxMTEsCisJMjMsMTU5LDEwMywyMjksMjA1LDIzNyw1LDE5MywzMywyMTEsMTAsNTQsCisJMiwzMywyLDAsMzQsMjA5LDEwLDU4LDE1NCwxMCwzMywyMTIsCisJMTAsMTE5LDU4LDE0OCwxMCwzMywyMTMsMTAsMTE5LDMzLDIwOSwxMCwKKwkyMjksMjA1LDE0Nyw2LDE5MywyNCwxMjgsNDIsNDcsMTMsMjI5LDMzLAorCTUwLDEzLDIyOSwyMDUsMTkxLDQsMTkzLDI0LDIzOSwzMywyMTEsMTAsCisJNTQsNiwzMywzLDAsMzQsMjA5LDEwLDU4LDE1NCwxMCwzMywKKwkyMTIsMTAsMTE5LDU4LDE0OCwxMCwzMywyMTMsMTAsMTE5LDMzLDIxNCwKKwkxMCw1NCw1LDMzLDIwOSwxMCwyMjksMjA1LDE0Nyw2LDI0LDIwMCwKKwkyMDUsMTA2LDEwLDMzLDQ5LDEzLDU0LDAsMzMsNDcsMTMsMjI5LAorCTIwNSwyMDcsNiwzMywyMDksMTAsMjI3LDIwNSwxNDcsNiwxOTMsMjA1LAorCTgwLDksMjA1LDE0NSw4LDI0LDI0OCwxMjQsMTcwLDI1MCw5OSwxMCwKKwkyMzcsODIsMjAxLDEyNCwyMzAsMTI4LDIzNyw4Miw2MCwyMDEsMjI1LDI1MywKKwkyMjksMjIxLDIyOSwyMjEsMzMsMCwwLDIyMSw1NywyMzMsMjIxLDI0OSwKKwkyMjEsMjI1LDI1MywyMjUsMjAxLDIzMywyMjUsMjUzLDIyOSwyMjEsMjI5LDIyMSwKKwkzMywwLDAsMjIxLDU3LDk0LDM1LDg2LDM1LDIzNSw1NywyNDksCisJMjM1LDIzMywwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMAorCX0gOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FwcGxldGFsay9pcGRkcC5jIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2lwZGRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE0NGE3OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9pcGRkcC5jCkBAIC0wLDAgKzEsMzE3IEBACisvKgorICoJaXBkZHAuYzogSVAgdG8gQXBwbGV0YWxrLUlQIEVuY2Fwc3VsYXRpb24gZHJpdmVyIGZvciBMaW51eAorICoJCSBBcHBsZXRhbGstSVAgdG8gSVAgRGVjYXBzdWxhdGlvbiBkcml2ZXIgZm9yIExpbnV4CisgKgorICoJQXV0aG9yczoKKyAqICAgICAgLSBERFAtSVAgRW5jYXAgYnk6IEJyYWRmb3JkIFcuIEpvaG5zb24gPGpvaG5zMzkzQG1hcm9vbi50Yy51bW4uZWR1PgorICoJLSBERFAtSVAgRGVjYXAgYnk6IEpheSBTY2h1bGlzdCA8anNjaGxzdEBzYW1iYS5vcmc+CisgKgorICoJRGVyaXZlZCBmcm9tOgorICoJLSBBbG1vc3QgYWxsIGNvZGUgYWxyZWFkeSBleGlzdGVkIGluIG5ldC9hcHBsZXRhbGsvZGRwLmMgSSBqdXN0CisgKgkgIG1vdmVkL3Jlb3JnaW5pemVkIGl0IGludG8gYSBkcml2ZXIgZmlsZS4gT3JpZ2luYWwgSVAtb3Zlci1ERFAgY29kZQorICoJICB3YXMgZG9uZSBieSBCcmFkZm9yZCBXLiBKb2huc29uIDxqb2huczM5M0BtYXJvb24udGMudW1uLmVkdT4KKyAqICAgICAgLSBza2VsZXRvbi5jOiBBIG5ldHdvcmsgZHJpdmVyIG91dGxpbmUgZm9yIGxpbnV4LgorICogICAgICAgIFdyaXR0ZW4gMTk5My05NCBieSBEb25hbGQgQmVja2VyLgorICoJLSBkdW1teS5jOiBBIGR1bW15IG5ldCBkcml2ZXIuIEJ5IE5pY2sgSG9sbG93YXkuCisgKgktIE1hY0dhdGU6IEEgdXNlciBzcGFjZSBEYWVtb24gZm9yIEFwcGxldGFsay1JUCBEZWNhcCBmb3IKKyAqCSAgTGludXggYnkgSmF5IFNjaHVsaXN0IDxqc2NobHN0QHNhbWJhLm9yZz4KKyAqCisgKiAgICAgIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKyAqICAgICAgRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKyAqCisgKiAgICAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqICAgICAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9hdGFsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJpcGRkcC5oIgkJLyogT3VyIHN0dWZmICovCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9IEtFUk5fSU5GTyAiaXBkZHAuYzp2MC4wMSA4LzI4Lzk3IEJyYWRmb3JkIFcuIEpvaG5zb24gPGpvaG5zMzkzQG1hcm9vbi50Yy51bW4uZWR1PlxuIjsKKworc3RhdGljIHN0cnVjdCBpcGRkcF9yb3V0ZSAqaXBkZHBfcm91dGVfbGlzdDsKKworI2lmZGVmIENPTkZJR19JUEREUF9FTkNBUAorc3RhdGljIGludCBpcGRkcF9tb2RlID0gSVBERFBfRU5DQVA7CisjZWxzZQorc3RhdGljIGludCBpcGRkcF9tb2RlID0gSVBERFBfREVDQVA7CisjZW5kaWYKKworLyogSW5kZXggdG8gZnVuY3Rpb25zLCBhcyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLworc3RhdGljIGludCBpcGRkcF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppcGRkcF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGlwZGRwX2NyZWF0ZShzdHJ1Y3QgaXBkZHBfcm91dGUgKm5ld19ydCk7CitzdGF0aWMgaW50IGlwZGRwX2RlbGV0ZShzdHJ1Y3QgaXBkZHBfcm91dGUgKnJ0KTsKK3N0YXRpYyBzdHJ1Y3QgaXBkZHBfcm91dGUqIGlwZGRwX2ZpbmRfcm91dGUoc3RydWN0IGlwZGRwX3JvdXRlICpydCk7CitzdGF0aWMgaW50IGlwZGRwX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKKworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgaXBkZHBfaW5pdCh2b2lkKQoreworCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgZXJyOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7CisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCXN0cmNweShkZXYtPm5hbWUsICJpcGRkcCVkIik7CisKKwlpZiAodmVyc2lvbl9wcmludGVkKysgPT0gMCkKKyAgICAgICAgICAgICAgICBwcmludGsodmVyc2lvbik7CisKKwkvKiBJbml0YWxpemUgdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisgICAgICAgIGRldi0+aGFyZF9zdGFydF94bWl0ID0gaXBkZHBfeG1pdDsKKyAgICAgICAgZGV2LT5nZXRfc3RhdHMgICAgICA9IGlwZGRwX2dldF9zdGF0czsKKyAgICAgICAgZGV2LT5kb19pb2N0bCAgICAgICA9IGlwZGRwX2lvY3RsOworCisgICAgICAgIGRldi0+dHlwZSA9IEFSUEhSRF9JUEREUDsgICAgICAgCS8qIElQIG92ZXIgRERQIHR1bm5lbCAqLworICAgICAgICBkZXYtPm10dSA9IDU4NTsKKyAgICAgICAgZGV2LT5mbGFncyB8PSBJRkZfTk9BUlA7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogICAgICBUaGUgd29yc3QgY2FzZSBoZWFkZXIgd2Ugd2lsbCBuZWVkIGlzIGN1cnJlbnRseSBhCisgICAgICAgICAqICAgICAgZXRoZXJuZXQgaGVhZGVyICgxNCBieXRlcykgYW5kIGEgZGRwIGhlYWRlciAoc2l6ZW9mIGRkcGVoZHIrMSkKKyAgICAgICAgICogICAgICBXZSBzZW5kIG92ZXIgU05BUCBzbyB0aGF0IHRha2VzIGFub3RoZXIgOCBieXRlcy4KKyAgICAgICAgICovCisgICAgICAgIGRldi0+aGFyZF9oZWFkZXJfbGVuID0gMTQrOCtzaXplb2Yoc3RydWN0IGRkcGVoZHIpKzE7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCisJLyogTGV0IHRoZSB1c2VyIG5vdyB3aGF0IG1vZGUgd2UgYXJlIGluICovCisJaWYoaXBkZHBfbW9kZSA9PSBJUEREUF9FTkNBUCkKKwkJcHJpbnRrKCIlczogQXBwbGV0YWxrLUlQIEVuY2FwLiBtb2RlIGJ5IEJyYWRmb3JkIFcuIEpvaG5zb24gPGpvaG5zMzkzQG1hcm9vbi50Yy51bW4uZWR1PlxuIiwgCisJCQlkZXYtPm5hbWUpOworCWlmKGlwZGRwX21vZGUgPT0gSVBERFBfREVDQVApCisJCXByaW50aygiJXM6IEFwcGxldGFsay1JUCBEZWNhcC4gbW9kZSBieSBKYXkgU2NodWxpc3QgPGpzY2hsc3RAc2FtYmEub3JnPlxuIiwgCisJCQlkZXYtPm5hbWUpOworCisgICAgICAgIHJldHVybiBkZXY7Cit9CisKKy8qCisgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4gVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvciBjbG9zZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXBkZHBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHJldHVybiBkZXYtPnByaXY7Cit9CisKKy8qCisgKiBUcmFuc21pdCBMTEFQL0VMQVAgZnJhbWUgdXNpbmcgYWFycF9zZW5kX2RkcC4KKyAqLworc3RhdGljIGludCBpcGRkcF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTMyIHBhZGRyID0gKChzdHJ1Y3QgcnRhYmxlKilza2ItPmRzdCktPnJ0X2dhdGV3YXk7CisgICAgICAgIHN0cnVjdCBkZHBlaGRyICpkZHA7CisgICAgICAgIHN0cnVjdCBpcGRkcF9yb3V0ZSAqcnQ7CisgICAgICAgIHN0cnVjdCBhdGFsa19hZGRyICpvdXJfYWRkcjsKKworCS8qCisgICAgICAgICAqIEZpbmQgYXBwcm9wcmlhdGUgcm91dGUgdG8gdXNlLCBiYXNlZCBvbmx5IG9uIElQIG51bWJlci4KKyAgICAgICAgICovCisgICAgICAgIGZvcihydCA9IGlwZGRwX3JvdXRlX2xpc3Q7IHJ0ICE9IE5VTEw7IHJ0ID0gcnQtPm5leHQpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihydC0+aXAgPT0gcGFkZHIpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZihydCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIG91cl9hZGRyID0gYXRhbGtfZmluZF9kZXZfYWRkcihydC0+ZGV2KTsKKworCWlmKGlwZGRwX21vZGUgPT0gSVBERFBfREVDQVApCisJCS8qIAorCQkgKiBQdWxsIG9mZiB0aGUgZXhjZXNzIHJvb20gdGhhdCBzaG91bGQgbm90IGJlIHRoZXJlLgorCQkgKiBUaGlzIGlzIGR1ZSB0byBhIGhhcmQtaGVhZGVyIHByb2JsZW0uIFRoaXMgaXMgdGhlCisJCSAqIHF1aWNrIGZpeCBmb3Igbm93IHRob3VnaCwgdGlsbCBpdCBicmVha3MuCisJCSAqLworCQlza2JfcHVsbChza2IsIDM1LShzaXplb2Yoc3RydWN0IGRkcGVoZHIpKzEpKTsKKworCS8qIENyZWF0ZSB0aGUgRXh0ZW5kZWQgRERQIGhlYWRlciAqLworCWRkcCA9IChzdHJ1Y3QgZGRwZWhkciAqKXNrYi0+ZGF0YTsKKyAgICAgICAgZGRwLT5kZWhfbGVuID0gc2tiLT5sZW47CisgICAgICAgIGRkcC0+ZGVoX2hvcHMgPSAxOworICAgICAgICBkZHAtPmRlaF9wYWQgPSAwOworICAgICAgICBkZHAtPmRlaF9zdW0gPSAwOworCisJLyoKKyAgICAgICAgICogRm9yIExvY2FsdGFsayB3ZSBuZWVkIGFhcnBfc2VuZF9kZHAgdG8gc3RyaXAgdGhlCisgICAgICAgICAqIGxvbmcgRERQIGhlYWRlciBhbmQgcGxhY2UgYSBzaG90IEREUCBoZWFkZXIgb24gaXQuCisgICAgICAgICAqLworICAgICAgICBpZihydC0+ZGV2LT50eXBlID09IEFSUEhSRF9MT0NBTFRMSykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGRkcC0+ZGVoX2RuZXQgID0gMDsgICAvKiBGSVhNRSBtb3JlIGhvcHM/PyAqLworICAgICAgICAgICAgICAgIGRkcC0+ZGVoX3NuZXQgID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZHAtPmRlaF9kbmV0ICA9IHJ0LT5hdC5zX25ldDsgICAvKiBGSVhNRSBtb3JlIGhvcHM/PyAqLworICAgICAgICAgICAgICAgIGRkcC0+ZGVoX3NuZXQgID0gb3VyX2FkZHItPnNfbmV0OworICAgICAgICB9CisgICAgICAgIGRkcC0+ZGVoX2Rub2RlID0gcnQtPmF0LnNfbm9kZTsKKyAgICAgICAgZGRwLT5kZWhfc25vZGUgPSBvdXJfYWRkci0+c19ub2RlOworICAgICAgICBkZHAtPmRlaF9kcG9ydCA9IDcyOworICAgICAgICBkZHAtPmRlaF9zcG9ydCA9IDcyOworCisgICAgICAgICooKF9fdTggKikoZGRwKzEpKSA9IDIyOyAgICAgICAgCS8qIGRkcCB0eXBlID0gSVAgKi8KKyAgICAgICAgKigoX191MTYgKilkZHApPW50b2hzKCooKF9fdTE2ICopZGRwKSk7CS8qIGZpeCB1cCBsZW5ndGggZmllbGQgKi8KKworICAgICAgICBza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQVRBTEspOyAgICAgLyogUHJvdG9jb2wgaGFzIGNoYW5nZWQgKi8KKworCSgoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikgZGV2LT5wcml2KS0+dHhfcGFja2V0cysrOworICAgICAgICAoKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopIGRldi0+cHJpdiktPnR4X2J5dGVzKz1za2ItPmxlbjsKKworICAgICAgICBpZihhYXJwX3NlbmRfZGRwKHJ0LT5kZXYsIHNrYiwgJnJ0LT5hdCwgTlVMTCkgPCAwKQorICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIENyZWF0ZSBhIHJvdXRpbmcgZW50cnkuIFdlIGZpcnN0IHZlcmlmeSB0aGF0IHRoZQorICogcmVjb3JkIGRvZXMgbm90IGFscmVhZHkgZXhpc3QuIElmIGl0IGRvZXMgd2UgcmV0dXJuIC1FRVhJU1QKKyAqLworc3RhdGljIGludCBpcGRkcF9jcmVhdGUoc3RydWN0IGlwZGRwX3JvdXRlICpuZXdfcnQpCit7CisgICAgICAgIHN0cnVjdCBpcGRkcF9yb3V0ZSAqcnQgPShzdHJ1Y3QgaXBkZHBfcm91dGUqKSBrbWFsbG9jKHNpemVvZigqcnQpLCBHRlBfS0VSTkVMKTsKKworICAgICAgICBpZiAocnQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKworICAgICAgICBydC0+aXAgPSBuZXdfcnQtPmlwOworICAgICAgICBydC0+YXQgPSBuZXdfcnQtPmF0OworICAgICAgICBydC0+bmV4dCA9IE5VTEw7CisgICAgICAgIGlmICgocnQtPmRldiA9IGF0cnRyX2dldF9kZXYoJnJ0LT5hdCkpID09IE5VTEwpIHsKKwkJa2ZyZWUocnQpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5FVFVOUkVBQ0g7CisgICAgICAgIH0KKworCWlmIChpcGRkcF9maW5kX3JvdXRlKHJ0KSkgeworCQlrZnJlZShydCk7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworICAgICAgICBydC0+bmV4dCA9IGlwZGRwX3JvdXRlX2xpc3Q7CisgICAgICAgIGlwZGRwX3JvdXRlX2xpc3QgPSBydDsKKworICAgICAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIERlbGV0ZSBhIHJvdXRlLCB3ZSBvbmx5IGRlbGV0ZSBhIEZVTEwgbWF0Y2guCisgKiBJZiByb3V0ZSBkb2VzIG5vdCBleGlzdCB3ZSByZXR1cm4gLUVOT0VOVC4KKyAqLworc3RhdGljIGludCBpcGRkcF9kZWxldGUoc3RydWN0IGlwZGRwX3JvdXRlICpydCkKK3sKKyAgICAgICAgc3RydWN0IGlwZGRwX3JvdXRlICoqciA9ICZpcGRkcF9yb3V0ZV9saXN0OworICAgICAgICBzdHJ1Y3QgaXBkZHBfcm91dGUgKnRtcDsKKworICAgICAgICB3aGlsZSgodG1wID0gKnIpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZih0bXAtPmlwID09IHJ0LT5pcAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgdG1wLT5hdC5zX25ldCA9PSBydC0+YXQuc19uZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHRtcC0+YXQuc19ub2RlID09IHJ0LT5hdC5zX25vZGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKnIgPSB0bXAtPm5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZSh0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHIgPSAmdG1wLT5uZXh0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgtRU5PRU5UKTsKK30KKworLyoKKyAqIEZpbmQgYSByb3V0aW5nIGVudHJ5LCB3ZSBvbmx5IHJldHVybiBhIEZVTEwgbWF0Y2gKKyAqLworc3RhdGljIHN0cnVjdCBpcGRkcF9yb3V0ZSogaXBkZHBfZmluZF9yb3V0ZShzdHJ1Y3QgaXBkZHBfcm91dGUgKnJ0KQoreworICAgICAgICBzdHJ1Y3QgaXBkZHBfcm91dGUgKmY7CisKKyAgICAgICAgZm9yKGYgPSBpcGRkcF9yb3V0ZV9saXN0OyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoZi0+aXAgPT0gcnQtPmlwCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmLT5hdC5zX25ldCA9PSBydC0+YXQuc19uZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGYtPmF0LnNfbm9kZSA9PSBydC0+YXQuc19ub2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChmKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgaXBkZHBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisgICAgICAgIHN0cnVjdCBpcGRkcF9yb3V0ZSBfX3VzZXIgKnJ0ID0gaWZyLT5pZnJfZGF0YTsKKyAgICAgICAgc3RydWN0IGlwZGRwX3JvdXRlIHJjcDsKKworICAgICAgICBpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVQRVJNOworCisJaWYoY29weV9mcm9tX3VzZXIoJnJjcCwgcnQsIHNpemVvZihyY3ApKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgICAgc3dpdGNoKGNtZCkKKyAgICAgICAgeworCQljYXNlIFNJT0NBRERJUEREUFJUOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpcGRkcF9jcmVhdGUoJnJjcCkpOworCisgICAgICAgICAgICAgICAgY2FzZSBTSU9DRklORElQRERQUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZihjb3B5X3RvX3VzZXIocnQsIGlwZGRwX2ZpbmRfcm91dGUoJnJjcCksIHNpemVvZihzdHJ1Y3QgaXBkZHBfcm91dGUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgICAgIGNhc2UgU0lPQ0RFTElQRERQUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGlwZGRwX2RlbGV0ZSgmcmNwKSk7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfaXBkZHA7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9wYXJhbShpcGRkcF9tb2RlLCBpbnQsIDApOworCitzdGF0aWMgaW50IF9faW5pdCBpcGRkcF9pbml0X21vZHVsZSh2b2lkKQoreworCWRldl9pcGRkcCA9IGlwZGRwX2luaXQoKTsKKyAgICAgICAgaWYgKElTX0VSUihkZXZfaXBkZHApKQorICAgICAgICAgICAgICAgIHJldHVybiBQVFJfRVJSKGRldl9pcGRkcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpcGRkcF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworICAgICAgICBzdHJ1Y3QgaXBkZHBfcm91dGUgKnA7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXZfaXBkZHApOworICAgICAgICBmcmVlX25ldGRldihkZXZfaXBkZHApOworCisgICAgICAgIHdoaWxlIChpcGRkcF9yb3V0ZV9saXN0KSB7CisgICAgICAgICAgICAgICAgcCA9IGlwZGRwX3JvdXRlX2xpc3QtPm5leHQ7CisgICAgICAgICAgICAgICAga2ZyZWUoaXBkZHBfcm91dGVfbGlzdCk7CisgICAgICAgICAgICAgICAgaXBkZHBfcm91dGVfbGlzdCA9IHA7CisgICAgICAgIH0KK30KKworbW9kdWxlX2luaXQoaXBkZHBfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoaXBkZHBfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2lwZGRwLmggYi9kcml2ZXJzL25ldC9hcHBsZXRhbGsvaXBkZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjA3MmZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2lwZGRwLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqCWlwZGRwLmg6IEhlYWRlciBmb3IgSVAtb3Zlci1ERFAgZHJpdmVyIGZvciBMaW51eC4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfSVBERFBfSAorI2RlZmluZSBfX0xJTlVYX0lQRERQX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBTSU9DQURESVBERFBSVCAgIChTSU9DREVWUFJJVkFURSkKKyNkZWZpbmUgU0lPQ0RFTElQRERQUlQgICAoU0lPQ0RFVlBSSVZBVEUrMSkKKyNkZWZpbmUgU0lPQ0ZJTkRJUEREUFJUICAoU0lPQ0RFVlBSSVZBVEUrMikKKworc3RydWN0IGlwZGRwX3JvdXRlCit7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7ICAgICAgICAgICAgIC8qIENhcnJpZXIgZGV2aWNlICovCisgICAgICAgIF9fdTMyIGlwOyAgICAgICAgICAgICAgICAgICAgICAgLyogSVAgYWRkcmVzcyAqLworICAgICAgICBzdHJ1Y3QgYXRhbGtfYWRkciBhdDsgICAgICAgICAgICAgIC8qIEdhdGV3YXkgYXBwbGV0YWxrIGFkZHJlc3MgKi8KKyAgICAgICAgaW50IGZsYWdzOworICAgICAgICBzdHJ1Y3QgaXBkZHBfcm91dGUgKm5leHQ7Cit9OworCisjZGVmaW5lIElQRERQX0VOQ0FQCTEKKyNkZWZpbmUgSVBERFBfREVDQVAJMgorCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworI2VuZGlmCS8qIF9fTElOVVhfSVBERFBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXBwbGV0YWxrL2x0cGMuYyBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9sdHBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ4ZTk0MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FwcGxldGFsay9sdHBjLmMKQEAgLTAsMCArMSwxMzEzIEBACisvKioqICAgIGx0cGMuYyAtLSBhIGRyaXZlciBmb3IgdGhlIExvY2FsVGFsayBQQyBjYXJkLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChjKSAxOTk1LDE5OTYgQnJhZGZvcmQgVy4gSm9obnNvbiA8am9obnMzOTNAbWFyb29uLnRjLnVtbi5lZHU+CisgKgorICogICAgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiAgICAgIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogICAgICBUaGlzIGlzIEFMUEhBIGNvZGUgYXQgYmVzdC4gIEl0IG1heSBub3Qgd29yayBmb3IgeW91LiAgSXQgbWF5CisgKiAgICAgIGRhbWFnZSB5b3VyIGVxdWlwbWVudC4gIEl0IG1heSBkYW1hZ2UgeW91ciByZWxhdGlvbnMgd2l0aCBvdGhlcgorICogICAgICB1c2VycyBvZiB5b3VyIG5ldHdvcmsuICBVc2UgaXQgYXQgeW91ciBvd24gcmlzayEKKyAqCisgKiAgICAgIEJhc2VkIGluIHBhcnQgb246CisgKiAgICAgIHNrZWxldG9uLmMgICAgICBieSBEb25hbGQgQmVja2VyCisgKiAgICAgIGR1bW15LmMgICAgICAgICBieSBOaWNrIEhvbGxvd2F5IGFuZCBBbGFuIENveAorICogICAgICBsb29wYmFjay5jICAgICAgYnkgUm9zcyBCaXJvLCBGcmVkIHZhbiBLYW1wZW4sIERvbmFsZCBCZWNrZXIKKyAqICAgICAgdGhlIG5ldGF0YWxrIHNvdXJjZSBjb2RlIChVTUlDSCkKKyAqICAgICAgbG90cyBvZiB3b3JrIG9uIHRoZSBjYXJkLi4uCisgKgorICogICAgICBJIGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgKHByb3ByaWV0YXJ5KSBTREsgdGhhdCBnb2VzIHdpdGggdGhlIGNhcmQuCisgKiAgICAgIElmIHlvdSBkbywgSSBkb24ndCB3YW50IHRvIGtub3cgYWJvdXQgaXQsIGFuZCB5b3UgY2FuIHByb2JhYmx5IHdyaXRlCisgKiAgICAgIGEgYmV0dGVyIGRyaXZlciB5b3Vyc2VsZiBhbnl3YXkuICBUaGlzIGRvZXMgbWVhbiB0aGF0IHRoZSBwaWVjZXMgdGhhdAorICogICAgICB0YWxrIHRvIHRoZSBjYXJkIGFyZSBndWVzc3dvcmsgb24gbXkgcGFydCwgc28gdXNlIGF0IHlvdXIgb3duIHJpc2shCisgKgorICogICAgICBUaGlzIGlzIG15IGZpcnN0IHRyeSBhdCB3cml0aW5nIExpbnV4IG5ldHdvcmtpbmcgY29kZSwgYW5kIGlzIGFsc28KKyAqICAgICAgZ3Vlc3N3b3JrLiAgQWdhaW4sIHVzZSBhdCB5b3VyIG93biByaXNrISAgKEFsdGhvdWdoIG9uIHRoaXMgcGFydCwgSSdkCisgKiAgICAgIHdlbGNvbWUgc3VnZ2VzdGlvbnMpCisgKgorICogICAgICBUaGlzIGlzIGEgbG9hZGFibGUga2VybmVsIG1vZHVsZSB3aGljaCBzZWVtcyB0byB3b3JrIGF0IG15IHNpdGUKKyAqICAgICAgY29uc2lzdGluZyBvZiBhIDEuMi4xMyBsaW51eCBib3ggcnVubmluZyBuZXRhdGFsayAxLjMuMywgYW5kIHdpdGgKKyAqICAgICAgdGhlIGtlcm5lbCBzdXBwb3J0IGZyb20gMS4zLjNiMiBpbmNsdWRpbmcgcGF0Y2hlcyByb3V0aW5nLnBhdGNoCisgKiAgICAgIGFuZCBkZHAuZGlzYXBwZWFycy5mcm9tLmNob29zZXIuICBJbiBvcmRlciB0byBydW4gaXQsIHlvdSB3aWxsIG5lZWQKKyAqICAgICAgdG8gcGF0Y2ggZGRwLmMgYW5kIGFhcnAuYyBpbiB0aGUga2VybmVsLCBidXQgb25seSBhIGxpdHRsZS4uLgorICoKKyAqICAgICAgSSdtIGZhaXJseSBjb25maWRlbnQgdGhhdCB3aGlsZSB0aGlzIGlzIGFyZ3VhYmx5IGJhZGx5IHdyaXR0ZW4sIHRoZQorICogICAgICBwcm9ibGVtcyB0aGF0IHBlb3BsZSBleHBlcmllbmNlIHdpbGwgYmUgImhpZ2hlciBsZXZlbCIsIHRoYXQgaXMsIHdpdGgKKyAqICAgICAgY29tcGxpY2F0aW9ucyBpbiB0aGUgbmV0YXRhbGsgY29kZS4gIFRoZSBkcml2ZXIgaXRzZWxmIGRvZXNuJ3QgZG8KKyAqICAgICAgYW55dGhpbmcgdGVycmlibHkgY29tcGxpY2F0ZWQgLS0gaXQgcHJldGVuZHMgdG8gYmUgYW4gZXRoZXIgZGV2aWNlCisgKiAgICAgIGFzIGZhciBhcyBuZXRhdGFsayBpcyBjb25jZXJuZWQsIHN0cmlwcyB0aGUgRERQIGRhdGEgb3V0IG9mIHRoZSBldGhlcgorICogICAgICBmcmFtZSBhbmQgYnVpbGRzIGEgTExBUCBwYWNrZXQgdG8gc2VuZCBvdXQgdGhlIGNhcmQuICBJbiB0aGUgb3RoZXIKKyAqICAgICAgZGlyZWN0aW9uLCBpdCByZWNlaXZlcyBMTEFQIGZyYW1lcyBmcm9tIHRoZSBjYXJkIGFuZCBidWlsZHMgYSBmYWtlCisgKiAgICAgIGV0aGVyIHBhY2tldCB0aGF0IGl0IHRoZW4gdG9zc2VzIHVwIHRvIHRoZSBuZXR3b3JraW5nIGNvZGUuICBZb3UgY2FuCisgKiAgICAgIGFyZ3VlIChjb3JyZWN0bHkpIHRoYXQgdGhpcyBpcyBhbiB1Z2x5IHdheSB0byBkbyB0aGluZ3MsIGJ1dCBpdAorICogICAgICByZXF1aXJlcyBhIG1pbmltYWwgYW1vdW50IG9mIGZvb2xpbmcgd2l0aCB0aGUgY29kZSBpbiBkZHAuYyBhbmQgYWFycC5jLgorICoKKyAqICAgICAgVGhlIGNhcmQgd2lsbCBkbyBhIGxvdCBtb3JlIHRoYW4gaXMgdXNlZCBoZXJlIC0tIEkgKnRoaW5rKiBpdCBoYXMgdGhlCisgKiAgICAgIGxheWVycyB1cCB0aHJvdWdoIEFUUC4gIEV2ZW4gaWYgeW91IGtuZXcgaG93IHRoYXQgcGFydCB3b3JrcyAod2hpY2ggSQorICogICAgICBkb24ndCkgaXQgd291bGQgYmUgYSBiaWcgam9iIHRvIGNhcnZlIHVwIHRoZSBrZXJuZWwgZGRwIGNvZGUgdG8gaW5zZXJ0CisgKiAgICAgIHRoaW5ncyBhdCBhIGhpZ2hlciBsZXZlbCwgYW5kIHByb2JhYmx5IGEgYmFkIGlkZWEuLi4KKyAqCisgKiAgICAgIFRoZXJlIGFyZSBhIG51bWJlciBvZiBvdGhlciBjYXJkcyB0aGF0IGRvIExvY2FsVGFsayBvbiB0aGUgUEMuICBJZgorICogICAgICBub2JvZHkgZmluZHMgYW55IGluc3VybW91bnRhYmxlIChhdCB0aGUgbmV0YXRhbGsgbGV2ZWwpIHByb2JsZW1zCisgKiAgICAgIGhlcmUsIHRoaXMgZHJpdmVyIHNob3VsZCBlbmNvdXJhZ2UgcGVvcGxlIHRvIHB1dCBzb21lIHdvcmsgaW50byB0aGUKKyAqICAgICAgb3RoZXIgY2FyZHMgKHNvbWUgb2Ygd2hpY2ggSSBnYXRoZXIgYXJlIHN0aWxsIGNvbW1lcmNpYWxseSBhdmFpbGFibGUpCisgKiAgICAgIGFuZCBhbHNvIHRvIHB1dCBob29rcyBmb3IgTG9jYWxUYWxrIGludG8gdGhlIG9mZmljaWFsIGRkcCBjb2RlLgorICoKKyAqICAgICAgSSB3ZWxjb21lIGNvbW1lbnRzIGFuZCBzdWdnZXN0aW9ucy4gIFRoaXMgaXMgbXkgZmlyc3QgdHJ5IGF0IExpbnV4CisgKiAgICAgIG5ldHdvcmtpbmcgc3R1ZmYsIGFuZCB0aGVyZSBhcmUgcHJvYmFibHkgbG90cyBvZiB0aGluZ3MgdGhhdCBJIGRpZAorICogICAgICBzdWJvcHRpbWFsbHkuICAKKyAqCisgKioqLworCisvKioqCisgKgorICogJExvZzogbHRwYy5jLHYgJAorICogUmV2aXNpb24gMS4xLjIuMSAgMjAwMC8wMy8wMSAwNTozNTowNyAgamdhcnppaworICogYXQgYW5kIHRyIGNsZWFudXAKKyAqCisgKiBSZXZpc2lvbiAxLjggIDE5OTcvMDEvMjggMDU6NDQ6NTQgIGJyYWRmb3JkCisgKiBDbGVhbiB1cCBmb3Igbm9uLW1vZHVsZSBhIGxpdHRsZS4KKyAqIEhhY2tlZCBhYm91dCBhIGJpdCB0byBjbGVhbiB0aGluZ3MgdXAgLSBBbGFuIENveCAKKyAqIFByb2JhYmx5IGJyb2tlbiBpdCBmcm9tIHRoZSBvcmlnaW5hIDEuOAorICoKKworICogMTk5OC8xMS8wOTogRGF2aWQgSHVnZ2lucy1EYWluZXMgPGRoZEBkZWJpYW4ub3JnPgorICogQ2xlYW5lZCB1cCB0aGUgaW5pdGlhbGl6YXRpb24gY29kZSB0byB1c2UgdGhlIHN0YW5kYXJkIGF1dG9pcnEgbWV0aG9kcywKKyAgIGFuZCB0byBwcm9iZSBmb3IgdGhpbmdzIGluIHRoZSBzdGFuZGFyZCBvcmRlciBvZiBpL28sIGlycSwgZG1hLiAgVGhpcworICAgcmVtb3ZlcyB0aGUgInJlc2V0IHRoZSByZXNldCIgaGFjaywgYmVjYXVzZSBJIGNvdWxkbid0IGZpZ3VyZSBvdXQgYW4KKyAgIGVhc3kgd2F5IHRvIGdldCB0aGUgY2FyZCB0byB0cmlnZ2VyIGFuIGludGVycnVwdCBhZnRlciBpdC4KKyAqIEFkZGVkIHN1cHBvcnQgZm9yIHBhc3NpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIG9uIHRoZSBrZXJuZWwgY29tbWFuZAorICAgbGluZSBhbmQgdGhyb3VnaCBpbnNtb2QKKyAqIENoYW5nZWQgdGhlIGRldmljZSBuYW1lIGZyb20gImx0YWxrMCIgdG8gImx0MCIsIGJvdGggdG8gY29uZm9ybSB3aXRoIHRoZQorICAgb3RoZXIgbG9jYWx0YWxrIGRyaXZlciwgYW5kIHRvIGNsZWFyIHVwIHRoZSBpbmNvbnNpc3RlbmN5IGJldHdlZW4gdGhlCisgICBtb2R1bGUgYW5kIHRoZSBub24tbW9kdWxlIHZlcnNpb25zIG9mIHRoZSBkcml2ZXIgOi0pCisgKiBBZGRlZCBhIGJ1bmNoIG9mIGNvbW1lbnRzIChJIHdhcyBnb2luZyB0byBtYWtlIHNvbWUgZW51bXMgZm9yIHRoZSBzdGF0ZQorICAgY29kZXMgYW5kIHRoZSByZWdpc3RlciBvZmZzZXRzLCBidXQgSSdtIHN0aWxsIG5vdCBzdXJlIGV4YWN0bHkgd2hhdCB0aGVpcgorICAgc2VtYW50aWNzIGFyZSkKKyAqIERvbid0IHBvbGwgYW55bW9yZSBpbiBpbnRlcnJ1cHQtZHJpdmVuIG1vZGUKKyAqIEl0IHNlZW1zIHRvIHdvcmsgYXMgYSBtb2R1bGUgbm93IChhcyBvZiAyLjEuMTI3KSwgYnV0IEkgZG9uJ3QgdGhpbmsKKyAgIEknbSByZXNwb25zaWJsZSBmb3IgdGhhdC4uLgorCisgKgorICogUmV2aXNpb24gMS43ICAxOTk2LzEyLzEyIDAzOjQyOjMzICBicmFkZm9yZAorICogRE1BIGFsbG9jIGNyaWJiZWQgZnJvbSAzYzUwNS5jLgorICoKKyAqIFJldmlzaW9uIDEuNiAgMTk5Ni8xMi8xMiAwMzoxODo1OCAgYnJhZGZvcmQKKyAqIEFkZGVkIHZpcnRfdG9fYnVzOyB3b3JrcyBpbiAyLjEuMTMuCisgKgorICogUmV2aXNpb24gMS41ICAxOTk2LzEyLzEyIDAzOjEzOjIyICByb290CisgKiB4bWl0UWVsIGluaXRpYWxpemF0aW9uIC0tIHRoaW5rIHRocm91Z2ggYmV0dGVyIHRob3VnaC4KKyAqCisgKiBSZXZpc2lvbiAxLjQgIDE5OTYvMDYvMTggMTQ6NTU6NTUgIHJvb3QKKyAqIENoYW5nZSBuYW1lcyB0byBsdHBjLiBUYWJzLiBUb29rIGEgc2hvdCBhdCBkbWEgYWxsb2MsCisgKiBhbHRob3VnaCBtb3JlIG5lZWRzIHRvIGJlIGRvbmUgZXZlbnR1YWxseS4KKyAqCisgKiBSZXZpc2lvbiAxLjMgIDE5OTYvMDUvMjIgMTQ6NTk6MzkgIHJvb3QKKyAqIENoYW5nZSBkZXYtPm9wZW4sIGRldi0+Y2xvc2UgdG8gdHJhY2sgZHVtbXkuYyBpbiAxLjk5Lihhcm91bmQgNykKKyAqCisgKiBSZXZpc2lvbiAxLjIgIDE5OTYvMDUvMjIgMTQ6NTg6MjQgIHJvb3QKKyAqIENoYW5nZSB0YWJzIG1vc3RseS4KKyAqCisgKiBSZXZpc2lvbiAxLjEgIDE5OTYvMDQvMjMgMDQ6NDU6MDkgIHJvb3QKKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisgKiBSZXZpc2lvbiAwLjE2ICAxOTk2LzAzLzA1IDE1OjU5OjU2ICByb290CisgKiBDaGFuZ2UgQVJQSFJEX0xPQ0FMVExLIGRlZmluaXRpb24gdG8gdGhlICJyZWFsIiBvbmUuCisgKgorICogUmV2aXNpb24gMC4xNSAgMTk5Ni8wMy8wNSAwNjoyODozMCAgcm9vdAorICogQ2hhbmdlcyBmb3Iga2VybmVsIDEuMy43MC4gIFN0aWxsIG5lZWQgYSBmZXcgcGF0Y2hlcyB0byBrZXJuZWwsIGJ1dAorICogaXQncyBnZXR0aW5nIGNsb3Nlci4KKyAqCisgKiBSZXZpc2lvbiAwLjE0ICAxOTk2LzAyLzI1IDE3OjM4OjMyICByb290CisgKiBNb3JlIGNsZWFudXBzLiAgUmVtb3ZlZCBxdWVyeSB0byBjYXJkIG9uIGdldF9zdGF0cy4KKyAqCisgKiBSZXZpc2lvbiAwLjEzICAxOTk2LzAyLzIxICAxNjoyNzo0MCAgcm9vdAorICogUmVmaXggZGVidWdfcHJpbnRfc2tiLiAgRml4IG1hYy5yYXcgZ290Y2hhIHRoYXQgYXBwZWFyZWQgaW4gMS4zLjY1LgorICogQ2xlYW4gdXAgcmVjZWl2ZSBjb2RlIGEgbGl0dGxlLgorICoKKyAqIFJldmlzaW9uIDAuMTIgIDE5OTYvMDIvMTkgIDE2OjM0OjUzICByb290CisgKiBGaXggZGVidWdfcHJpbnRfc2tiLiAgS2x1ZGdlIG91dGdvaW5nIHNuZXQgdG8gMCB3aGVuIHVzaW5nIHN0YXJ0dXAKKyAqIHJhbmdlLiAgQ2hhbmdlIGRlYnVnIHRvIG1hc2s6IDEgZm9yIHZlcmJvc2UsIDIgZm9yIGhpZ2hlciBsZXZlbCBzdHVmZgorICogaW5jbHVkaW5nIHBhY2tldCBwcmludGluZywgNCBmb3IgbG93ZXIgbGV2ZWwgKGNhcmQgaS9vKSBzdHVmZi4KKyAqCisgKiBSZXZpc2lvbiAwLjExICAxOTk2LzAyLzEyICAxNTo1MzozOCAgcm9vdAorICogQWRkZWQgcm91dGVyIHNlbmRzIChyZXF1aXJlcyBuZXcgYWFycC5jIHBhdGNoKQorICoKKyAqIFJldmlzaW9uIDAuMTAgIDE5OTYvMDIvMTEgIDAwOjE5OjM1ICByb290CisgKiBDaGFuZ2Ugc291cmNlIExUQUxLX0xPR0dJTkcgZGVidWcgc3dpdGNoIHRvIGluc21vZCAuLi4gZGVidWc9Mi4KKyAqCisgKiBSZXZpc2lvbiAwLjkgIDE5OTYvMDIvMTAgIDIzOjU5OjM1ICByb290CisgKiBGaXhlZCB0aG9zZSBmaXhlcyBmb3IgMS4yIC0tIERBTkdFUiEgIFRoZSBhdC5oIHRoYXQgY29tZXMgd2l0aCBuZXRhdGFsaworICogaGFzIGEgKmRpZmZlcmVudCogZGVmaW5pdGlvbiBvZiBzdHJ1Y3Qgc29ja2FkZHJfYXQgdGhhbiB0aGUgTGludXgga2VybmVsCisgKiBkb2VzLiAgVGhpcyBpcyBhbiAiaW5zaWRpb3VzIGFuZCBpbnZpZGlvdXMiIGJ1Zy4uLgorICogKEFjdHVhbGx5IHRoZSBwcmVjZWRpbmcgY29tbWVudCBpcyBmYWxzZSAtLSBpdCdzIHRoZSBhdGFsay5oIGluIHRoZQorICogYW5jaWVudCBhdGFsay0wLjA2IHRoYXQncyB0aGUgcHJvYmxlbSkKKyAqCisgKiBSZXZpc2lvbiAwLjggIDE5OTYvMDIvMTAgMTk6MDk6MDAgIHJvb3QKKyAqIE1lcmdlIDEuMyBjaGFuZ2VzLiAgVGVzdGVkIE9LIHVuZGVyIDEuMy42MC4KKyAqCisgKiBSZXZpc2lvbiAwLjcgIDE5OTYvMDIvMTAgMTc6NTY6NTYgIHJvb3QKKyAqIEFkZGVkIGRlYnVnPTEgcGFyYW1ldGVyIG9uIGluc21vZCBmb3IgZGVidWdnaW5nIHByaW50cy4gIFRyaWVkCisgKiB0byBmaXggdGltZXIgdW5sb2FkIG9uIHJtbW9kLCBidXQgSSBkb24ndCB0aGluayB0aGF0J3MgdGhlIHByb2JsZW0uCisgKgorICogUmV2aXNpb24gMC42ICAxOTk1LzEyLzMxICAxOTowMTowOSAgcm9vdAorICogQ2xlYW4gdXAgcm1tb2QsIGlycSBjb21tZW50cyBwZXIgZmVlZGJhY2sgZnJvbSBDb3JpbiBBbmRlcnNvbiAoVGhhbmtzIENvcmV5ISkKKyAqIENsZWFuIHVwIGluaXRpYWwgcHJvYmluZyAtLSBzb21ldGltZXMgdGhlIGNhcmQgd2FrZXMgdXAgbGF0Y2hlZCBpbiByZXNldC4KKyAqCisgKiBSZXZpc2lvbiAwLjUgIDE5OTUvMTIvMjIgIDA2OjAzOjQ0ICByb290CisgKiBBZGRlZCBjb21tZW50cyBpbiBmcm9udCBhbmQgY2xlYW5lZCB1cCBhIGJpdC4KKyAqIFRoaXMgdmVyc2lvbiBzZW50IG91dCB0byBwZW9wbGUuCisgKgorICogUmV2aXNpb24gMC40ICAxOTk1LzEyLzE4ICAwMzo0Njo0NCAgcm9vdAorICogUmV0dXJuIHNob3J0RERQIHRvIGxvbmdERFAgZmFrZSB0byAwLzAuICBBZGRlZCBjb21tYW5kIHN0cnVjdHMuCisgKgorICoqKi8KKworLyogbHRwYyBqdW1wZXJzIGFyZToKKyoKKyoJSW50ZXJydXB0cyAtLSBzZXQgYXQgbW9zdCBvbmUuICBJZiBub25lIGFyZSBzZXQsIHRoZSBkcml2ZXIgdXNlcworKglwb2xsZWQgbW9kZS4gIEJlY2F1c2UgdGhlIGNhcmQgd2FzIGRldmVsb3BlZCBpbiB0aGUgWFQgZXJhLCB0aGUKKyoJb3JpZ2luYWwgZG9jdW1lbnRhdGlvbiByZWZlcnMgdG8gSVJRMi4gIFNpbmNlIHlvdSdsbCBiZSBydW5uaW5nCisqCXRoaXMgb24gYW4gQVQgKG9yIGxhdGVyKSBjbGFzcyBtYWNoaW5lLCB0aGF0IHJlYWxseSBtZWFucyBJUlE5LgorKgorKglTVzEJSVJRIDQKKyoJU1cyCUlSUSAzCisqCVNXMwlJUlEgOSAoMiBpbiBvcmlnaW5hbCBjYXJkIGRvY3VtZW50YXRpb24gb25seSBhcHBsaWVzIHRvIFhUKQorKgorKgorKglETUEgLS0gY2hvb3NlIERNQSAxIG9yIDMsIGFuZCBzZXQgYm90aCBjb3JyZXNwb25kaW5nIHN3aXRjaGVzLgorKgorKglTVzQJRE1BIDMKKyoJU1c1CURNQSAxCisqCVNXNglETUEgMworKglTVzcJRE1BIDEKKyoKKyoKKyoJSS9PIGFkZHJlc3MgLS0gY2hvb3NlIG9uZS4gIAorKgorKglTVzgJMjIwIC8gMjQwCisqLworCisvKglUbyBoYXZlIHNvbWUgc3R1ZmYgbG9nZ2VkLCBkbyAKKyoJaW5zbW9kIGx0cGMubyBkZWJ1Zz0xCisqCisqCUZvciBhIHdob2xlIGJ1bmNoIG9mIHN0dWZmLCB1c2UgaGlnaGVyIG51bWJlcnMuCisqCisqCVRoZSBkZWZhdWx0IGlzIDAsIGkuZS4gbm8gbWVzc2FnZXMgZXhjZXB0IGZvciB0aGUgcHJvYmUgcmVzdWx0cy4KKyovCisKKy8qIGluc21vZC10d2Vha2FibGUgdmFyaWFibGVzICovCitzdGF0aWMgaW50IGRlYnVnOworI2RlZmluZSBERUJVR19WRVJCT1NFIDEKKyNkZWZpbmUgREVCVUdfVVBQRVIgMgorI2RlZmluZSBERUJVR19MT1dFUiA0CisKK3N0YXRpYyBpbnQgaW87CitzdGF0aWMgaW50IGlycTsKK3N0YXRpYyBpbnQgZG1hOworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9sdGFsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hdGFsay5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogb3VyIHN0dWZmICovCisjaW5jbHVkZSAibHRwYy5oIgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHR4cXVldWVfbG9jayk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1ib3hfbG9jayk7CisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBpbnQgZG9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpjYnVmLCBpbnQgY2J1ZmxlbiwKKwl2b2lkICpkYnVmLCBpbnQgZGJ1Zmxlbik7CitzdGF0aWMgaW50IHNlbmR1cF9idWZmZXIgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBEbWEgTWVtb3J5IHJlbGF0ZWQgc3R1ZmYsIGNyaWJiZWQgZGlyZWN0bHkgZnJvbSAzYzUwNS5jICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRtYV9tZW1fYWxsb2MoaW50IHNpemUpCit7CisgICAgICAgIGludCBvcmRlciA9IGdldF9vcmRlcihzaXplKTsKKworICAgICAgICByZXR1cm4gX19nZXRfZG1hX3BhZ2VzKEdGUF9LRVJORUwsIG9yZGVyKTsKK30KKworLyogRE1BIGRhdGEgYnVmZmVyLCBETUEgY29tbWFuZCBidWZmZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpsdGRtYWJ1ZjsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpsdGRtYWNidWY7CisKKy8qIHByaXZhdGUgc3RydWN0LCBob2xkcyBvdXIgYXBwbGV0YWxrIGFkZHJlc3MgKi8KKworc3RydWN0IGx0cGNfcHJpdmF0ZQoreworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBhdGFsa19hZGRyIG15X2FkZHI7Cit9OworCisvKiB0cmFuc21pdCBxdWV1ZSBlbGVtZW50IHN0cnVjdCAqLworCitzdHJ1Y3QgeG1pdFFlbCB7CisJc3RydWN0IHhtaXRRZWwgKm5leHQ7CisJLyogY29tbWFuZCBidWZmZXIgKi8KKwl1bnNpZ25lZCBjaGFyICpjYnVmOworCXNob3J0IGNidWZsZW47CisJLyogZGF0YSBidWZmZXIgKi8KKwl1bnNpZ25lZCBjaGFyICpkYnVmOworCXNob3J0IGRidWZsZW47CisJdW5zaWduZWQgY2hhciBRV3JpdGU7CS8qIHJlYWQgb3Igd3JpdGUgZGF0YSAqLworCXVuc2lnbmVkIGNoYXIgbWFpbGJveDsKK307CisKKy8qIHRoZSB0cmFuc21pdCBxdWV1ZSBpdHNlbGYgKi8KKworc3RhdGljIHN0cnVjdCB4bWl0UWVsICp4bVFoZCwgKnhtUXRsOworCitzdGF0aWMgdm9pZCBlblEoc3RydWN0IHhtaXRRZWwgKnFlbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXFlbC0+bmV4dCA9IE5VTEw7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnR4cXVldWVfbG9jaywgZmxhZ3MpOworCWlmICh4bVF0bCkgeworCQl4bVF0bC0+bmV4dCA9IHFlbDsKKwl9IGVsc2UgeworCQl4bVFoZCA9IHFlbDsKKwl9CisJeG1RdGwgPSBxZWw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHhxdWV1ZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoZGVidWcgJiBERUJVR19MT1dFUikKKwkJcHJpbnRrKCJlbnF1ZXVlZCBhIDB4JTAyeCBjb21tYW5kXG4iLHFlbC0+Y2J1ZlswXSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeG1pdFFlbCAqZGVRKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKwlzdHJ1Y3QgeG1pdFFlbCAqcWVsPU5VTEw7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnR4cXVldWVfbG9jaywgZmxhZ3MpOworCWlmICh4bVFoZCkgeworCQlxZWwgPSB4bVFoZDsKKwkJeG1RaGQgPSBxZWwtPm5leHQ7CisJCWlmKCF4bVFoZCkgeG1RdGwgPSBOVUxMOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0eHF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCWlmICgoZGVidWcgJiBERUJVR19MT1dFUikgJiYgcWVsKSB7CisJCWludCBuOworCQlwcmludGsoS0VSTl9ERUJVRyAibHRwYzogZGVxdWV1ZWQgY29tbWFuZCAiKTsKKwkJbiA9IHFlbC0+Y2J1ZmxlbjsKKwkJaWYgKG4+MTAwKSBuPTEwMDsKKwkJZm9yKGk9MDtpPG47aSsrKSBwcmludGsoIiUwMnggIixxZWwtPmNidWZbaV0pOworCQlwcmludGsoIlxuIik7CisJfQorCisJcmV0dXJuIHFlbDsKK30KKworLyogYW5kLi4uIHRoZSBxdWV1ZSBlbGVtZW50cyB3ZSdsbCBiZSB1c2luZyAqLworc3RhdGljIHN0cnVjdCB4bWl0UWVsIHFlbHNbMTZdOworCisvKiBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBtYWlsYm94ZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1haWxib3hbMTZdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgbWJveGludXNlWzE2XSA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfTsKKworc3RhdGljIGludCB3YWl0X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGMpCit7CisJLyogcmV0dXJucyB0cnVlIGlmIGl0IHN0YXllZCBjICovCisJLyogdGhpcyB1c2VzIGJhc2UrNiwgYnV0IGl0J3Mgb2sgKi8KKwlpbnQgaTsKKworCS8qIHR3ZW50eSBzZWNvbmQgb3Igc28gdG90YWwgKi8KKworCWZvcihpPTA7aTwyMDAwMDA7aSsrKSB7CisJCWlmICggYyAhPSBpbmJfcChkZXYtPmJhc2VfYWRkcis2KSApIHJldHVybiAwOworCQl1ZGVsYXkoMTAwKTsKKwl9CisJcmV0dXJuIDE7IC8qIHRpbWVkIG91dCAqLworfQorCisvKiBnZXQgdGhlIGZpcnN0IGZyZWUgbWFpbGJveCAqLworCitzdGF0aWMgaW50IGdldG1ib3godm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1ib3hfbG9jaywgZmxhZ3MpOworCWZvcihpPTE7aTwxNjtpKyspIGlmKCFtYm94aW51c2VbaV0pIHsKKwkJbWJveGludXNlW2ldPTE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1ib3hfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gaTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWJveF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHJlYWQgYSBjb21tYW5kIGZyb20gdGhlIGNhcmQgKi8KK3N0YXRpYyB2b2lkIGhhbmRsZWZjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogY2FsbGVkICpvbmx5KiBmcm9tIGlkbGUsIG5vbi1yZWVudHJhbnQgKi8KKwlpbnQgZG1hID0gZGV2LT5kbWE7CisJaW50IGJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisKKwlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCWRpc2FibGVfZG1hKGRtYSk7CisJY2xlYXJfZG1hX2ZmKGRtYSk7CisJc2V0X2RtYV9tb2RlKGRtYSxETUFfTU9ERV9SRUFEKTsKKwlzZXRfZG1hX2FkZHIoZG1hLHZpcnRfdG9fYnVzKGx0ZG1hY2J1ZikpOworCXNldF9kbWFfY291bnQoZG1hLDUwKTsKKwllbmFibGVfZG1hKGRtYSk7CisJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisKKwlpbmJfcChiYXNlKzMpOworCWluYl9wKGJhc2UrMik7CisKKwlpZiAoIHdhaXRfdGltZW91dChkZXYsMHhmYykgKSBwcmludGsoInRpbWVkIG91dCBpbiBoYW5kbGVmY1xuIik7Cit9CisKKy8qIHJlYWQgZGF0YSBmcm9tIHRoZSBjYXJkICovCitzdGF0aWMgdm9pZCBoYW5kbGVmZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBkbWEgPSBkZXYtPmRtYTsKKwlpbnQgYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCWRpc2FibGVfZG1hKGRtYSk7CisJY2xlYXJfZG1hX2ZmKGRtYSk7CisJc2V0X2RtYV9tb2RlKGRtYSxETUFfTU9ERV9SRUFEKTsKKwlzZXRfZG1hX2FkZHIoZG1hLHZpcnRfdG9fYnVzKGx0ZG1hYnVmKSk7CisJc2V0X2RtYV9jb3VudChkbWEsODAwKTsKKwllbmFibGVfZG1hKGRtYSk7CisJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisKKwlpbmJfcChiYXNlKzMpOworCWluYl9wKGJhc2UrMik7CisKKwlpZiAoIHdhaXRfdGltZW91dChkZXYsMHhmZCkgKSBwcmludGsoInRpbWVkIG91dCBpbiBoYW5kbGVmZFxuIik7CisJc2VuZHVwX2J1ZmZlcihkZXYpOworfSAKKworc3RhdGljIHZvaWQgaGFuZGxld3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBjYWxsZWQgKm9ubHkqIGZyb20gaWRsZSwgbm9uLXJlZW50cmFudCAqLworCS8qIG9uIGVudHJ5LCAweGZiIGFuZCBsdGRtYWJ1ZiBob2xkcyBkYXRhICovCisJaW50IGRtYSA9IGRldi0+ZG1hOworCWludCBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCWRpc2FibGVfZG1hKGRtYSk7CisJY2xlYXJfZG1hX2ZmKGRtYSk7CisJc2V0X2RtYV9tb2RlKGRtYSxETUFfTU9ERV9XUklURSk7CisJc2V0X2RtYV9hZGRyKGRtYSx2aXJ0X3RvX2J1cyhsdGRtYWJ1ZikpOworCXNldF9kbWFfY291bnQoZG1hLDgwMCk7CisJZW5hYmxlX2RtYShkbWEpOworCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCQorCWluYl9wKGJhc2UrMyk7CisJaW5iX3AoYmFzZSsyKTsKKworCWlmICggd2FpdF90aW1lb3V0KGRldiwweGZiKSApIHsKKwkJZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwkJcHJpbnRrKCJ0aW1lZCBvdXQgaW4gaGFuZGxld3JpdGUsIGRtYSByZXMgJWRcbiIsCisJCQlnZXRfZG1hX3Jlc2lkdWUoZGV2LT5kbWEpICk7CisJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCX0KK30KKworc3RhdGljIHZvaWQgaGFuZGxlcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIG9uIGVudHJ5LCAweGZiICovCisJLyogb24gZXhpdCwgbHRkbWFidWYgaG9sZHMgZGF0YSAqLworCWludCBkbWEgPSBkZXYtPmRtYTsKKwlpbnQgYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkKKwlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCWRpc2FibGVfZG1hKGRtYSk7CisJY2xlYXJfZG1hX2ZmKGRtYSk7CisJc2V0X2RtYV9tb2RlKGRtYSxETUFfTU9ERV9SRUFEKTsKKwlzZXRfZG1hX2FkZHIoZG1hLHZpcnRfdG9fYnVzKGx0ZG1hYnVmKSk7CisJc2V0X2RtYV9jb3VudChkbWEsODAwKTsKKwllbmFibGVfZG1hKGRtYSk7CisJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisKKwlpbmJfcChiYXNlKzMpOworCWluYl9wKGJhc2UrMik7CisJaWYgKCB3YWl0X3RpbWVvdXQoZGV2LDB4ZmIpICkgcHJpbnRrKCJ0aW1lZCBvdXQgaW4gaGFuZGxlcmVhZFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZWNvbW1hbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBvbiBlbnRyeSwgMHhmYSBhbmQgbHRkbWFjYnVmIGhvbGRzIGNvbW1hbmQgKi8KKwlpbnQgZG1hID0gZGV2LT5kbWE7CisJaW50IGJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwlkaXNhYmxlX2RtYShkbWEpOworCWNsZWFyX2RtYV9mZihkbWEpOworCXNldF9kbWFfbW9kZShkbWEsRE1BX01PREVfV1JJVEUpOworCXNldF9kbWFfYWRkcihkbWEsdmlydF90b19idXMobHRkbWFjYnVmKSk7CisJc2V0X2RtYV9jb3VudChkbWEsNTApOworCWVuYWJsZV9kbWEoZG1hKTsKKwlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwlpbmJfcChiYXNlKzMpOworCWluYl9wKGJhc2UrMik7CisJaWYgKCB3YWl0X3RpbWVvdXQoZGV2LDB4ZmEpICkgcHJpbnRrKCJ0aW1lZCBvdXQgaW4gaGFuZGxlY29tbWFuZFxuIik7Cit9IAorCisvKiByZWFkeSBtYWRlIGNvbW1hbmQgZm9yIGdldHRpbmcgdGhlIHJlc3VsdCBmcm9tIHRoZSBjYXJkICovCitzdGF0aWMgdW5zaWduZWQgY2hhciByZXNjYnVmWzJdID0ge0xUX0dFVFJFU1VMVCwwfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJlc2RidWZbMl07CisKK3N0YXRpYyBpbnQgUUluSWRsZTsKKworLyogaWRsZSBleHBlY3RzIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBJUlEgbGluZSBoaWdoIC0tIGVpdGhlciBiZWNhdXNlIG9mCisgKiBhbiBpbnRlcnJ1cHQsIG9yIGJlY2F1c2UgdGhlIGxpbmUgaXMgdHJpLXN0YXRlZAorICovCisKK3N0YXRpYyB2b2lkIGlkbGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzdGF0ZTsKKwkvKiBGSVhNRSBUaGlzIGlzIGluaXRpYWxpemVkIHRvIHNodXQgdGhlIHdhcm5pbmcgdXAsIGJ1dCBJIG5lZWQgdG8KKwkgKiB0aGluayB0aGlzIHRocm91Z2ggYWdhaW4uCisJICovCisJc3RydWN0IHhtaXRRZWwgKnEgPSBOVUxMOworCWludCBvb3BzOworCWludCBpOworCWludCBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHhxdWV1ZV9sb2NrLCBmbGFncyk7CisJaWYoUUluSWRsZSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0eHF1ZXVlX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlRSW5JZGxlID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0eHF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCS8qIHRoaXMgdHJpLXN0YXRlcyB0aGUgSVJRIGxpbmUgKi8KKwkodm9pZCkgaW5iX3AoYmFzZSs2KTsKKworCW9vcHMgPSAxMDA7CisKK2xvb3A6CisJaWYgKDA+b29wcy0tKSB7IAorCQlwcmludGsoImlkbGU6IGxvb3BlZCB0b28gbWFueSB0aW1lc1xuIik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzdGF0ZSA9IGluYl9wKGJhc2UrNik7CisJaWYgKHN0YXRlICE9IGluYl9wKGJhc2UrNikpIGdvdG8gbG9vcDsKKworCXN3aXRjaChzdGF0ZSkgeworCQljYXNlIDB4ZmM6CisJCQkvKiBpbmNvbWluZyBjb21tYW5kICovCisJCQlpZiAoZGVidWcgJiBERUJVR19MT1dFUikgcHJpbnRrKCJpZGxlOiBmY1xuIik7CisJCQloYW5kbGVmYyhkZXYpOyAKKwkJCWJyZWFrOworCQljYXNlIDB4ZmQ6CisJCQkvKiBpbmNvbWluZyBkYXRhICovCisJCQlpZihkZWJ1ZyAmIERFQlVHX0xPV0VSKSBwcmludGsoImlkbGU6IGZkXG4iKTsKKwkJCWhhbmRsZWZkKGRldik7IAorCQkJYnJlYWs7CisJCWNhc2UgMHhmOToKKwkJCS8qIHJlc3VsdCByZWFkeSAqLworCQkJaWYgKGRlYnVnICYgREVCVUdfTE9XRVIpIHByaW50aygiaWRsZTogZjlcbiIpOworCQkJaWYoIW1ib3hpbnVzZVswXSkgeworCQkJCW1ib3hpbnVzZVswXSA9IDE7CisJCQkJcWVsc1swXS5jYnVmID0gcmVzY2J1ZjsKKwkJCQlxZWxzWzBdLmNidWZsZW4gPSAyOworCQkJCXFlbHNbMF0uZGJ1ZiA9IHJlc2RidWY7CisJCQkJcWVsc1swXS5kYnVmbGVuID0gMjsKKwkJCQlxZWxzWzBdLlFXcml0ZSA9IDA7CisJCQkJcWVsc1swXS5tYWlsYm94ID0gMDsKKwkJCQllblEoJnFlbHNbMF0pOworCQkJfQorCQkJaW5iX3AoZGV2LT5iYXNlX2FkZHIrMSk7CisJCQlpbmJfcChkZXYtPmJhc2VfYWRkciswKTsKKwkJCWlmKCB3YWl0X3RpbWVvdXQoZGV2LDB4ZjkpICkKKwkJCQlwcmludGsoInRpbWVkIG91dCBpZGxlIGY5XG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDB4Zjg6CisJCQkvKiA/PyAqLworCQkJaWYgKHhtUWhkKSB7CisJCQkJaW5iX3AoZGV2LT5iYXNlX2FkZHIrMSk7CisJCQkJaW5iX3AoZGV2LT5iYXNlX2FkZHIrMCk7CisJCQkJaWYod2FpdF90aW1lb3V0KGRldiwweGY4KSApCisJCQkJCXByaW50aygidGltZWQgb3V0IGlkbGUgZjhcbiIpOworCQkJfSBlbHNlIHsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAweGZhOgorCQkJLyogd2FpdGluZyBmb3IgY29tbWFuZCAqLworCQkJaWYoZGVidWcgJiBERUJVR19MT1dFUikgcHJpbnRrKCJpZGxlOiBmYVxuIik7CisJCQlpZiAoeG1RaGQpIHsKKwkJCQlxPWRlUSgpOworCQkJCW1lbWNweShsdGRtYWNidWYscS0+Y2J1ZixxLT5jYnVmbGVuKTsKKwkJCQlsdGRtYWNidWZbMV0gPSBxLT5tYWlsYm94OworCQkJCWlmIChkZWJ1Zz4xKSB7IAorCQkJCQlpbnQgbjsKKwkJCQkJcHJpbnRrKCJsdHBjOiBzZW50IGNvbW1hbmQgICAgICIpOworCQkJCQluID0gcS0+Y2J1ZmxlbjsKKwkJCQkJaWYgKG4+MTAwKSBuPTEwMDsKKwkJCQkJZm9yKGk9MDtpPG47aSsrKQorCQkJCQkJcHJpbnRrKCIlMDJ4ICIsbHRkbWFjYnVmW2ldKTsKKwkJCQkJcHJpbnRrKCJcbiIpOworCQkJCX0KKwkJCQloYW5kbGVjb21tYW5kKGRldik7CisJCQkJCWlmKDB4ZmE9PWluYl9wKGJhc2UrNikpIHsKKwkJCQkJCS8qIHdlIHRpbWVkIG91dCwgc28gcmV0dXJuICovCisJCQkJCQlnb3RvIGRvbmU7CisJCQkJCX0gCisJCQl9IGVsc2UgeworCQkJCS8qIHdlIGRvbid0IHNlZW0gdG8gaGF2ZSBhIGNvbW1hbmQgKi8KKwkJCQlpZiAoIW1ib3hpbnVzZVswXSkgeworCQkJCQltYm94aW51c2VbMF0gPSAxOworCQkJCQlxZWxzWzBdLmNidWYgPSByZXNjYnVmOworCQkJCQlxZWxzWzBdLmNidWZsZW4gPSAyOworCQkJCQlxZWxzWzBdLmRidWYgPSByZXNkYnVmOworCQkJCQlxZWxzWzBdLmRidWZsZW4gPSAyOworCQkJCQlxZWxzWzBdLlFXcml0ZSA9IDA7CisJCQkJCXFlbHNbMF0ubWFpbGJveCA9IDA7CisJCQkJCWVuUSgmcWVsc1swXSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRrKCJ0cm91YmxlOiByZXNwb25zZSBjb21tYW5kIGFscmVhZHkgcXVldWVkXG4iKTsKKwkJCQkJZ290byBkb25lOworCQkJCX0KKwkJCX0gCisJCQlicmVhazsKKwkJY2FzZSAwWGZiOgorCQkJLyogZGF0YSB0cmFuc2ZlciByZWFkeSAqLworCQkJaWYoZGVidWcgJiBERUJVR19MT1dFUikgcHJpbnRrKCJpZGxlOiBmYlxuIik7CisJCQlpZihxLT5RV3JpdGUpIHsKKwkJCQltZW1jcHkobHRkbWFidWYscS0+ZGJ1ZixxLT5kYnVmbGVuKTsKKwkJCQloYW5kbGV3cml0ZShkZXYpOworCQkJfSBlbHNlIHsKKwkJCQloYW5kbGVyZWFkKGRldik7CisJCQkJLyogbm9uLXplcm8gbWFpbGJveCBudW1iZXJzIGFyZSBmb3IKKwkJCQkgICBjb21tbWFuZHMsIDAgaXMgZm9yIEdFVFJFU1VMVAorCQkJCSAgIHJlcXVlc3RzICovCisJCQkJaWYocS0+bWFpbGJveCkgeworCQkJCQltZW1jcHkocS0+ZGJ1ZixsdGRtYWJ1ZixxLT5kYnVmbGVuKTsKKwkJCQl9IGVsc2UgeyAKKwkJCQkJLyogdGhpcyB3YXMgYSByZXN1bHQgKi8KKwkJCQkJbWFpbGJveFsgMHgwZiAmIGx0ZG1hYnVmWzBdIF0gPSBsdGRtYWJ1ZlsxXTsKKwkJCQkJbWJveGludXNlWzBdPTA7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJfQorCWdvdG8gbG9vcDsKKworZG9uZToKKwlRSW5JZGxlPTA7CisKKwkvKiBub3cgc2V0IHRoZSBpbnRlcnJ1cHRzIGJhY2sgYXMgYXBwcm9wcmlhdGUgKi8KKwkvKiB0aGUgZmlyc3QgcmVhZCB0YWtlcyBpdCBvdXQgb2YgdHJpLXN0YXRlIChidXQgc3RpbGwgaGlnaCkgKi8KKwkvKiB0aGUgc2Vjb25kIHJlc2V0cyBpdCAqLworCS8qIG5vdGUgdGhhdCBhZnRlciB0aGlzIHBvaW50LCBhbnkgcmVhZCBvZiBiYXNlKzYgd2lsbAorCSAgIHRyaWdnZXIgYW4gaW50ZXJydXB0ICovCisKKwlpZiAoZGV2LT5pcnEpIHsKKwkJaW5iX3AoYmFzZSs3KTsKKwkJaW5iX3AoYmFzZSs3KTsKKwl9CisJcmV0dXJuOworfQorCisKK3N0YXRpYyBpbnQgZG9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqY2J1ZiwgaW50IGNidWZsZW4sCisJdm9pZCAqZGJ1ZiwgaW50IGRidWZsZW4pCit7CisKKwlpbnQgaSA9IGdldG1ib3goKTsKKwlpbnQgcmV0OworCisJaWYoaSkgeworCQlxZWxzW2ldLmNidWYgPSAodW5zaWduZWQgY2hhciAqKSBjYnVmOworCQlxZWxzW2ldLmNidWZsZW4gPSBjYnVmbGVuOworCQlxZWxzW2ldLmRidWYgPSAodW5zaWduZWQgY2hhciAqKSBkYnVmOworCQlxZWxzW2ldLmRidWZsZW4gPSBkYnVmbGVuOworCQlxZWxzW2ldLlFXcml0ZSA9IDE7CisJCXFlbHNbaV0ubWFpbGJveCA9IGk7ICAvKiB0aGlzIHNob3VsZCBiZSBpbml0dGVkIHJhdGhlciAqLworCQllblEoJnFlbHNbaV0pOworCQlpZGxlKGRldik7CisJCXJldCA9IG1haWxib3hbaV07CisJCW1ib3hpbnVzZVtpXT0wOworCQlyZXR1cm4gcmV0OworCX0KKwlwcmludGsoImx0cGM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBtYm94XG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZG9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpjYnVmLCBpbnQgY2J1ZmxlbiwKKwl2b2lkICpkYnVmLCBpbnQgZGJ1ZmxlbikKK3sKKworCWludCBpID0gZ2V0bWJveCgpOworCWludCByZXQ7CisKKwlpZihpKSB7CisJCXFlbHNbaV0uY2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGNidWY7CisJCXFlbHNbaV0uY2J1ZmxlbiA9IGNidWZsZW47CisJCXFlbHNbaV0uZGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGRidWY7CisJCXFlbHNbaV0uZGJ1ZmxlbiA9IGRidWZsZW47CisJCXFlbHNbaV0uUVdyaXRlID0gMDsKKwkJcWVsc1tpXS5tYWlsYm94ID0gaTsgIC8qIHRoaXMgc2hvdWxkIGJlIGluaXR0ZWQgcmF0aGVyICovCisJCWVuUSgmcWVsc1tpXSk7CisJCWlkbGUoZGV2KTsKKwkJcmV0ID0gbWFpbGJveFtpXTsKKwkJbWJveGludXNlW2ldPTA7CisJCXJldHVybiByZXQ7CisJfQorCXByaW50aygibHRwYzogY291bGQgbm90IGFsbG9jYXRlIG1ib3hcbiIpOworCXJldHVybiAtMTsKK30KKworLyogZW5kIG9mIGlkbGUgaGFuZGxlcnMgLS0gd2hhdCBzaG91bGQgYmUgc2VlbiBpcyBkb19yZWFkLCBkb193cml0ZSAqLworCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgbHRwY190aW1lcjsKKworc3RhdGljIGludCBsdHBjX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmx0cGNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgaW50IHJlYWRfMzAgKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWx0X2NvbW1hbmQgYzsKKwljLmdldGZsYWdzLmNvbW1hbmQgPSBMVF9HRVRGTEFHUzsKKwlyZXR1cm4gZG9fcmVhZChkZXYsICZjLCBzaXplb2YoYy5nZXRmbGFncyksJmMsMCk7Cit9CisKK3N0YXRpYyBpbnQgc2V0XzMwIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCB4KQoreworCWx0X2NvbW1hbmQgYzsKKwljLnNldGZsYWdzLmNvbW1hbmQgPSBMVF9TRVRGTEFHUzsKKwljLnNldGZsYWdzLmZsYWdzID0geDsKKwlyZXR1cm4gZG9fd3JpdGUoZGV2LCAmYywgc2l6ZW9mKGMuc2V0ZmxhZ3MpLCZjLDApOworfQorCisvKiBMTEFQIHRvIEREUCB0cmFuc2xhdGlvbiAqLworCitzdGF0aWMgaW50IHNlbmR1cF9idWZmZXIgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogb24gZW50cnksIGNvbW1hbmQgaXMgaW4gbHRkbWFjYnVmLCBkYXRhIGluIGx0ZG1hYnVmICovCisJLyogY2FsbGVkIGZyb20gaWRsZSwgbm9uLXJlZW50cmFudCAqLworCisJaW50IGRub2RlLCBzbm9kZSwgbGxhcHR5cGUsIGxlbjsgCisJaW50IHNrbGVuOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJigoc3RydWN0IGx0cGNfcHJpdmF0ZSAqKWRldi0+cHJpdiktPnN0YXRzOworCXN0cnVjdCBsdF9yY3ZsYXAgKmx0YyA9IChzdHJ1Y3QgbHRfcmN2bGFwICopIGx0ZG1hY2J1ZjsKKworCWlmIChsdGMtPmNvbW1hbmQgIT0gTFRfUkNWTEFQKSB7CisJCXByaW50aygidW5rbm93biBjb21tYW5kIDB4JTAyeCBmcm9tIGx0cGMgY2FyZFxuIixsdGMtPmNvbW1hbmQpOworCQlyZXR1cm4oLTEpOworCX0KKwlkbm9kZSA9IGx0Yy0+ZG5vZGU7CisJc25vZGUgPSBsdGMtPnNub2RlOworCWxsYXB0eXBlID0gbHRjLT5sYXB0eXBlOworCWxlbiA9IGx0Yy0+bGVuZ3RoOyAKKworCXNrbGVuID0gbGVuOworCWlmIChsbGFwdHlwZSA9PSAxKSAKKwkJc2tsZW4gKz0gODsgIC8qIGNvcnJlY3QgZm9yIHNob3J0IGRkcCAqLworCWlmKHNrbGVuID4gODAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBub25zZW5zZSBsZW5ndGggaW4gbHRwYyBjb21tYW5kIDB4MTQ6IDB4JTA4eFxuIiwKKwkJCWRldi0+bmFtZSxza2xlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIChsbGFwdHlwZT09MCkgfHwgKGxsYXB0eXBlPjIpICkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogdW5rbm93biBMTEFQIHR5cGU6ICVkXG4iLGRldi0+bmFtZSxsbGFwdHlwZSk7CisJCXJldHVybiAtMTsKKwl9CisKKworCXNrYiA9IGRldl9hbGxvY19za2IoMytza2xlbik7CisJaWYgKHNrYiA9PSBOVUxMKSAKKwl7CisJCXByaW50aygiJXM6IGRyb3BwaW5nIHBhY2tldCBkdWUgdG8gbWVtb3J5IHNxdWVlemUuXG4iLAorCQkJZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKwlza2ItPmRldiA9IGRldjsKKworCWlmIChza2xlbiA+IGxlbikKKwkJc2tiX3Jlc2VydmUoc2tiLDgpOworCXNrYl9wdXQoc2tiLGxlbiszKTsKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfTE9DQUxUQUxLKTsKKwkvKiBhZGQgTExBUCBoZWFkZXIgKi8KKwlza2ItPmRhdGFbMF0gPSBkbm9kZTsKKwlza2ItPmRhdGFbMV0gPSBzbm9kZTsKKwlza2ItPmRhdGFbMl0gPSBsbGFwdHlwZTsKKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CS8qIHNhdmUgcG9pbnRlciB0byBsbGFwIGhlYWRlciAqLworCXNrYl9wdWxsKHNrYiwzKTsKKworCS8qIGNvcHkgZGRwKHMsZSloZHIgKyBjb250ZW50cyAqLworCW1lbWNweShza2ItPmRhdGEsKHZvaWQqKWx0ZG1hYnVmLGxlbik7CisKKwlza2ItPmgucmF3ID0gc2tiLT5kYXRhOworCisJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlzdGF0cy0+cnhfYnl0ZXMrPXNrYi0+bGVuOworCisJLyogdG9zcyBpdCBvbndhcmRzICovCisJbmV0aWZfcngoc2tiKTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCXJldHVybiAwOworfQorCisvKiB0aGUgaGFuZGxlciBmb3IgdGhlIGJvYXJkIGludGVycnVwdCAqLworIAorc3RhdGljIGlycXJldHVybl90CitsdHBjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdfcHRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisKKwlpZiAoZGV2PT1OVUxMKSB7CisJCXByaW50aygibHRwY19pbnRlcnJ1cHQ6IHVua25vd24gZGV2aWNlLlxuIik7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpbmJfcChkZXYtPmJhc2VfYWRkcis2KTsgIC8qIGRpc2FibGUgZnVydGhlciBpbnRlcnJ1cHRzIGZyb20gYm9hcmQgKi8KKworCWlkbGUoZGV2KTsgLyogaGFuZGxlIHdoYXRldmVyIGlzIGNvbWluZyBpbiAqLworIAorCS8qIGlkbGUgcmUtZW5hYmxlcyBpbnRlcnJ1cHRzIGZyb20gYm9hcmQgKi8gCisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKioKKyAqCisgKiAgICBUaGUgaW9jdGxzIHRoYXQgdGhlIGRyaXZlciByZXNwb25kcyB0byBhcmU6CisgKgorICogICAgU0lPQ1NJRkFERFIgLS0gZG8gcHJvYmUgdXNpbmcgdGhlIHBhc3NlZCBub2RlIGhpbnQuCisgKiAgICBTSU9DR0lGQUREUiAtLSByZXR1cm4gbmV0LCBub2RlLgorICoKKyAqICAgIHNvbWUgb2YgdGhpcyBzdHVmZiBzaG91bGQgYmUgZG9uZSBlbHNld2hlcmUuCisgKgorICoqKi8KKworc3RhdGljIGludCBsdHBjX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBzb2NrYWRkcl9hdCAqc2EgPSAoc3RydWN0IHNvY2thZGRyX2F0ICopICZpZnItPmlmcl9hZGRyOworCS8qIHdlJ2xsIGtlZXAgdGhlIGxvY2FsdGFsayBub2RlIGFkZHJlc3MgaW4gZGV2LT5wYV9hZGRyICovCisJc3RydWN0IGF0YWxrX2FkZHIgKmFhID0gJigoc3RydWN0IGx0cGNfcHJpdmF0ZSAqKWRldi0+cHJpdiktPm15X2FkZHI7CisJc3RydWN0IGx0X2luaXQgYzsKKwlpbnQgbHRmbGFnczsKKworCWlmKGRlYnVnICYgREVCVUdfVkVSQk9TRSkgcHJpbnRrKCJsdHBjX2lvY3RsIGNhbGxlZFxuIik7CisKKwlzd2l0Y2goY21kKSB7CisJCWNhc2UgU0lPQ1NJRkFERFI6CisKKwkJCWFhLT5zX25ldCAgPSBzYS0+c2F0X2FkZHIuc19uZXQ7CisgICAgICAKKwkJCS8qIHRoaXMgZG9lcyB0aGUgcHJvYmUgYW5kIHJldHVybnMgdGhlIG5vZGUgYWRkciAqLworCQkJYy5jb21tYW5kID0gTFRfSU5JVDsKKwkJCWMuaGludCA9IHNhLT5zYXRfYWRkci5zX25vZGU7CisKKwkJCWFhLT5zX25vZGUgPSBkb19yZWFkKGRldiwmYyxzaXplb2YoYyksJmMsMCk7CisKKwkJCS8qIGdldCBhbGwgbGxhcCBmcmFtZXMgcmF3ICovCisJCQlsdGZsYWdzID0gcmVhZF8zMChkZXYpOworCQkJbHRmbGFncyB8PSBMVF9GTEFHX0FMTExBUDsKKwkJCXNldF8zMCAoZGV2LGx0ZmxhZ3MpOyAgCisKKwkJCWRldi0+YnJvYWRjYXN0WzBdID0gMHhGRjsKKwkJCWRldi0+ZGV2X2FkZHJbMF0gPSBhYS0+c19ub2RlOworCisJCQlkZXYtPmFkZHJfbGVuPTE7CisgICAKKwkJCXJldHVybiAwOworCisJCWNhc2UgU0lPQ0dJRkFERFI6CisKKwkJCXNhLT5zYXRfYWRkci5zX25ldCA9IGFhLT5zX25ldDsKKwkJCXNhLT5zYXRfYWRkci5zX25vZGUgPSBhYS0+c19ub2RlOworCisJCQlyZXR1cm4gMDsKKworCQlkZWZhdWx0OiAKKwkJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogVGhpcyBuZWVkcyB0byBiZSBwcmVzZW50IHRvIGtlZXAgbmV0YXRhbGsgaGFwcHkuICovCisJLyogQWN0dWFsbHkgbmV0YXRhbGsgbmVlZHMgZml4aW5nISAqLworfQorCitzdGF0aWMgaW50IGx0cGNfaGFyZF9oZWFkZXIgKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIAorCXVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwgdW5zaWduZWQgbGVuKQoreworCWlmKGRlYnVnICYgREVCVUdfVkVSQk9TRSkKKwkJcHJpbnRrKCJsdHBjX2hhcmRfaGVhZGVyIGNhbGxlZCBmb3IgZGV2aWNlICVzXG4iLAorCQkJZGV2LT5uYW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsdHBjX3BvbGxfY291bnRlcjsKKworc3RhdGljIHZvaWQgbHRwY19wb2xsKHVuc2lnbmVkIGxvbmcgbCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGw7CisKKwlkZWxfdGltZXIoJmx0cGNfdGltZXIpOworCisJaWYoZGVidWcgJiBERUJVR19WRVJCT1NFKSB7CisJCWlmICghbHRwY19wb2xsX2NvdW50ZXIpIHsKKwkJCWx0cGNfcG9sbF9jb3VudGVyID0gNTA7CisJCQlwcmludGsoImx0cGMgcG9sbCBpcyBhbGl2ZVxuIik7CisJCX0KKwkJbHRwY19wb2xsX2NvdW50ZXItLTsKKwl9CisgIAorCWlmICghZGV2KQorCQlyZXR1cm47ICAvKiB3ZSd2ZSBiZWVuIGRvd25lZCAqLworCisJLyogcG9sbCAyMCB0aW1lcyBwZXIgc2Vjb25kICovCisJaWRsZShkZXYpOworCWx0cGNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWi8yMDsKKwkKKwlhZGRfdGltZXIoJmx0cGNfdGltZXIpOworfQorCisvKiBERFAgdG8gTExBUCB0cmFuc2xhdGlvbiAqLworCitzdGF0aWMgaW50IGx0cGNfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIGluIGtlcm5lbCAxLjMueHgsIG9uIGVudHJ5IHNrYi0+ZGF0YSBwb2ludHMgdG8gZGRwIGhlYWRlciwKKwkgKiBhbmQgc2tiLT5sZW4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgZGRwIGRhdGEgKyBkZHAgaGVhZGVyCisJICovCisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmKChzdHJ1Y3QgbHRwY19wcml2YXRlICopZGV2LT5wcml2KS0+c3RhdHM7CisKKwlpbnQgaTsKKwlzdHJ1Y3QgbHRfc2VuZGxhcCBjYnVmOworCisJY2J1Zi5jb21tYW5kID0gTFRfU0VORExBUDsKKwljYnVmLmRub2RlID0gc2tiLT5kYXRhWzBdOworCWNidWYubGFwdHlwZSA9IHNrYi0+ZGF0YVsyXTsKKwlza2JfcHVsbChza2IsMyk7CS8qIHNraXAgcGFzdCBMTEFQIGhlYWRlciAqLworCWNidWYubGVuZ3RoID0gc2tiLT5sZW47CS8qIHRoaXMgaXMgaG9zdCBvcmRlciAqLworCXNrYi0+aC5yYXc9c2tiLT5kYXRhOworCisJaWYoZGVidWcgJiBERUJVR19VUFBFUikgeworCQlwcmludGsoImNvbW1hbmQgIik7CisJCWZvcihpPTA7aTw2O2krKykKKwkJCXByaW50aygiJTAyeCAiLCgodW5zaWduZWQgY2hhciAqKSZjYnVmKVtpXSk7CisJCXByaW50aygiXG4iKTsKKwl9CisKKwlkb193cml0ZShkZXYsJmNidWYsc2l6ZW9mKGNidWYpLHNrYi0+aC5yYXcsc2tiLT5sZW4pOworCisJaWYoZGVidWcgJiBERUJVR19VUFBFUikgeworCQlwcmludGsoInNlbnQgJWQgZGRwIGJ5dGVzXG4iLHNrYi0+bGVuKTsKKwkJZm9yKGk9MDtpPHNrYi0+bGVuO2krKykgcHJpbnRrKCIlMDJ4ICIsc2tiLT5oLnJhd1tpXSk7CisJCXByaW50aygiXG4iKTsKKwl9CisKKwlzdGF0cy0+dHhfcGFja2V0cysrOworCXN0YXRzLT50eF9ieXRlcys9c2tiLT5sZW47CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbHRwY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmKChzdHJ1Y3QgbHRwY19wcml2YXRlICopIGRldi0+cHJpdiktPnN0YXRzOworCXJldHVybiBzdGF0czsKK30KKworLyogaW5pdGlhbGl6YXRpb24gc3R1ZmYgKi8KKyAgCitzdGF0aWMgaW50IF9faW5pdCBsdHBjX3Byb2JlX2RtYShpbnQgYmFzZSwgaW50IGRtYSkKK3sKKwlpbnQgd2FudCA9IChkbWEgPT0gMykgPyAyIDogKGRtYSA9PSAxKSA/IDEgOiAzOworICAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworICAJdW5zaWduZWQgbG9uZyBmOworICAKKyAgCWlmICh3YW50ICYgMSkgeworCQlpZiAocmVxdWVzdF9kbWEoMSwibHRwYyIpKSB7CisJCQl3YW50ICY9IH4xOworCQl9IGVsc2UgeworCQkJZj1jbGFpbV9kbWFfbG9jaygpOworCQkJZGlzYWJsZV9kbWEoMSk7CisJCQljbGVhcl9kbWFfZmYoMSk7CisJCQlzZXRfZG1hX21vZGUoMSxETUFfTU9ERV9XUklURSk7CisJCQlzZXRfZG1hX2FkZHIoMSx2aXJ0X3RvX2J1cyhsdGRtYWJ1ZikpOworCQkJc2V0X2RtYV9jb3VudCgxLHNpemVvZihzdHJ1Y3QgbHRfbWVtKSk7CisJCQllbmFibGVfZG1hKDEpOworCQkJcmVsZWFzZV9kbWFfbG9jayhmKTsKKwkJfQorCX0KKwlpZiAod2FudCAmIDIpIHsKKwkJaWYgKHJlcXVlc3RfZG1hKDMsImx0cGMiKSkgeworCQkJd2FudCAmPSB+MjsKKwkJfSBlbHNlIHsKKwkJCWY9Y2xhaW1fZG1hX2xvY2soKTsKKwkJCWRpc2FibGVfZG1hKDMpOworCQkJY2xlYXJfZG1hX2ZmKDMpOworCQkJc2V0X2RtYV9tb2RlKDMsRE1BX01PREVfV1JJVEUpOworCQkJc2V0X2RtYV9hZGRyKDMsdmlydF90b19idXMobHRkbWFidWYpKTsKKwkJCXNldF9kbWFfY291bnQoMyxzaXplb2Yoc3RydWN0IGx0X21lbSkpOworCQkJZW5hYmxlX2RtYSgzKTsKKwkJCXJlbGVhc2VfZG1hX2xvY2soZik7CisJCX0KKwl9CisJLyogc2V0IHVwIHJlcXVlc3QgKi8KKworCS8qIEZJWE1FIC0tIGRvIHRpbWluZ3MgYmV0dGVyISAqLworCisJbHRkbWFidWZbMF0gPSBMVF9SRUFETUVNOworCWx0ZG1hYnVmWzFdID0gMTsgIC8qIG1haWxib3ggKi8KKwlsdGRtYWJ1ZlsyXSA9IDA7IGx0ZG1hYnVmWzNdID0gMDsgIC8qIGFkZHJlc3MgKi8KKwlsdGRtYWJ1Zls0XSA9IDA7IGx0ZG1hYnVmWzVdID0gMTsgIC8qIHJlYWQgMHgwMTAwIGJ5dGVzICovCisJbHRkbWFidWZbNl0gPSAwOyAvKiBkdW5ubyBpZiB0aGlzIGlzIG5lY2Vzc2FyeSAqLworCisJaW5iX3AoaW8rMSk7CisJaW5iX3AoaW8rMCk7CisJdGltZW91dCA9IGppZmZpZXMrMTAwKkhaLzEwMDsKKwl3aGlsZSh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlpZiAoIDB4ZmEgPT0gaW5iX3AoaW8rNikgKSBicmVhazsKKwl9CisKKwlpbmJfcChpbyszKTsKKwlpbmJfcChpbysyKTsKKwl3aGlsZSh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlpZiAoIDB4ZmIgPT0gaW5iX3AoaW8rNikgKSBicmVhazsKKwl9CisKKwkvKiByZWxlYXNlIHRoZSBvdGhlciBkbWEgY2hhbm5lbCAoaWYgd2Ugb3BlbmVkIGJvdGggb2YgdGhlbSkgKi8KKworCWlmICgod2FudCAmIDIpICYmIChnZXRfZG1hX3Jlc2lkdWUoMyk9PXNpemVvZihzdHJ1Y3QgbHRfbWVtKSkpIHsKKwkJd2FudCAmPSB+MjsKKwkJZnJlZV9kbWEoMyk7CisJfQorCisJaWYgKCh3YW50ICYgMSkgJiYgKGdldF9kbWFfcmVzaWR1ZSgxKT09c2l6ZW9mKHN0cnVjdCBsdF9tZW0pKSkgeworCQl3YW50ICY9IH4xOworCQlmcmVlX2RtYSgxKTsKKwl9CisKKwlpZiAoIXdhbnQpCisJCXJldHVybiAwOworCisJcmV0dXJuICh3YW50ICYgMikgPyAzIDogMTsKK30KKworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgbHRwY19wcm9iZSh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGVyciA9IC1FTk9NRU07CisJaW50IHg9MCx5PTA7CisJaW50IGF1dG9pcnE7CisJdW5zaWduZWQgbG9uZyBmOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCWRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IGx0cGNfcHJpdmF0ZSksICJsdCVkIiwgbHRhbGtfc2V0dXApOworCWlmICghZGV2KQorCQlnb3RvIG91dDsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCS8qIHByb2JlIGZvciB0aGUgSS9PIHBvcnQgYWRkcmVzcyAqLworCQorCWlmIChpbyAhPSAweDI0MCAmJiByZXF1ZXN0X3JlZ2lvbigweDIyMCw4LCJsdHBjIikpIHsKKwkJeCA9IGluYl9wKDB4MjIwKzYpOworCQlpZiAoICh4IT0weGZmKSAmJiAoeD49MHhmMCkgKSB7CisJCQlpbyA9IDB4MjIwOworCQkJZ290byBnb3RfcG9ydDsKKwkJfQorCQlyZWxlYXNlX3JlZ2lvbigweDIyMCw4KTsKKwl9CisJaWYgKGlvICE9IDB4MjIwICYmIHJlcXVlc3RfcmVnaW9uKDB4MjQwLDgsImx0cGMiKSkgeworCQl5ID0gaW5iX3AoMHgyNDArNik7CisJCWlmICggKHkhPTB4ZmYpICYmICh5Pj0weGYwKSApeyAKKwkJCWlvID0gMHgyNDA7CisJCQlnb3RvIGdvdF9wb3J0OworCQl9CisJCXJlbGVhc2VfcmVnaW9uKDB4MjQwLDgpOworCX0gCisKKwkvKiBnaXZlIHVwIGluIGRlc3BhaXIgKi8KKwlwcmludGsoS0VSTl9FUlIgIkxvY2FsVGFsayBjYXJkIG5vdCBmb3VuZDsgMjIwID0gJTAyeCwgMjQwID0gJTAyeC5cbiIsIHgseSk7CisJZXJyID0gLUVOT0RFVjsKKwlnb3RvIG91dDE7CisKKyBnb3RfcG9ydDoKKwkvKiBwcm9iZSBmb3IgdGhlIElSUSBsaW5lICovCisJaWYgKGlycSA8IDIpIHsKKwkJdW5zaWduZWQgbG9uZyBpcnFfbWFzazsKKworCQlpcnFfbWFzayA9IHByb2JlX2lycV9vbigpOworCQkvKiByZXNldCB0aGUgaW50ZXJydXB0IGxpbmUgKi8KKwkJaW5iX3AoaW8rNyk7CisJCWluYl9wKGlvKzcpOworCQkvKiB0cmlnZ2VyIGFuIGludGVycnVwdCAoSSBob3BlKSAqLworCQlpbmJfcChpbys2KTsKKwkJbWRlbGF5KDIpOworCQlhdXRvaXJxID0gcHJvYmVfaXJxX29mZihpcnFfbWFzayk7CisKKwkJaWYgKGF1dG9pcnEgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJsdHBjOiBwcm9iZSBhdCAlI3ggZmFpbGVkIHRvIGRldGVjdCBJUlEgbGluZS5cbiIsIGlvKTsKKwkJfSBlbHNlIHsKKwkJCWlycSA9IGF1dG9pcnE7CisJCX0KKwl9CisKKwkvKiBhbGxvY2F0ZSBhIERNQSBidWZmZXIgKi8KKwlsdGRtYWJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGRtYV9tZW1fYWxsb2MoMTAwMCk7CisJaWYgKCFsdGRtYWJ1ZikgeworCQlwcmludGsoS0VSTl9FUlIgImx0cGM6IG1lbSBhbGxvYyBmYWlsZWRcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDI7CisJfQorCisJbHRkbWFjYnVmID0gJmx0ZG1hYnVmWzgwMF07CisKKwlpZihkZWJ1ZyAmIERFQlVHX1ZFUkJPU0UpIHsKKwkJcHJpbnRrKCJsdGRtYWJ1ZiBwb2ludGVyICUwOGx4XG4iLCh1bnNpZ25lZCBsb25nKSBsdGRtYWJ1Zik7CisJfQorCisJLyogcmVzZXQgdGhlIGNhcmQgKi8KKworCWluYl9wKGlvKzEpOworCWluYl9wKGlvKzMpOworCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQoMipIWi8xMDApOworCisJaW5iX3AoaW8rMCk7CisJaW5iX3AoaW8rMik7CisJaW5iX3AoaW8rNyk7IC8qIGNsZWFyIHJlc2V0ICovCisJaW5iX3AoaW8rNCk7IAorCWluYl9wKGlvKzUpOworCWluYl9wKGlvKzUpOyAvKiBlbmFibGUgZG1hICovCisJaW5iX3AoaW8rNik7IC8qIHRyaS1zdGF0ZSBpbnRlcnJ1cHQgbGluZSAqLworCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQoSFopOworCQorCS8qIG5vdywgZmlndXJlIG91dCB3aGljaCBkbWEgY2hhbm5lbCB3ZSdyZSB1c2luZywgdW5sZXNzIGl0J3MKKwkgICBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkICovCisJLyogd2VsbCwgMCBpcyBhIGxlZ2FsIERNQSBjaGFubmVsLCBidXQgdGhlIExUUEMgY2FyZCBkb2Vzbid0CisJICAgdXNlIGl0Li4uICovCisJZG1hID0gbHRwY19wcm9iZV9kbWEoaW8sIGRtYSk7CisJaWYgKCFkbWEpIHsgIC8qIG5vIGRtYSBjaGFubmVsICovCisJCXByaW50ayhLRVJOX0VSUiAiTm8gRE1BIGNoYW5uZWwgZm91bmQgb24gbHRwYyBjYXJkLlxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0MzsKKwl9CisKKwkvKiBwcmludCBvdXQgZnJpZW5kbHkgbWVzc2FnZSAqLworCWlmKGlycSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQXBwbGUvRmFyYWxsb24gTG9jYWxUYWxrLVBDIGNhcmQgYXQgJTAzeCwgSVIlZCwgRE1BJWQuXG4iLGlvLGlycSxkbWEpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQXBwbGUvRmFyYWxsb24gTG9jYWxUYWxrLVBDIGNhcmQgYXQgJTAzeCwgRE1BJWQuICBVc2luZyBwb2xsZWQgbW9kZS5cbiIsaW8sZG1hKTsKKworCS8qIEZpbGwgaW4gdGhlIGZpZWxkcyBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSB3aXRoIGV0aGVybmV0LWdlbmVyaWMgdmFsdWVzLiAqLworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gbHRwY194bWl0OworCWRldi0+aGFyZF9oZWFkZXIgPSBsdHBjX2hhcmRfaGVhZGVyOworCWRldi0+Z2V0X3N0YXRzID0gbHRwY19nZXRfc3RhdHM7CisKKwkvKiBhZGQgdGhlIGx0cGMtc3BlY2lmaWMgdGhpbmdzICovCisJZGV2LT5kb19pb2N0bCA9ICZsdHBjX2lvY3RsOworCisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+bWNfbGlzdCA9IE5VTEw7CisJZGV2LT5iYXNlX2FkZHIgPSBpbzsKKwlkZXYtPmlycSA9IGlycTsKKwlkZXYtPmRtYSA9IGRtYTsKKworCS8qIHRoZSBjYXJkIHdpbGwgd2FudCB0byBzZW5kIGEgcmVzdWx0IGF0IHRoaXMgcG9pbnQgKi8KKwkvKiAoSSB0aGluay4uLiBsZWF2aW5nIG91dCB0aGlzIHBhcnQgbWFrZXMgdGhlIGtlcm5lbCBjcmFzaCwKKyAgICAgICAgICAgc28gSSBwdXQgaXQgYmFjayBpbi4uLikgKi8KKworCWY9Y2xhaW1fZG1hX2xvY2soKTsKKwlkaXNhYmxlX2RtYShkbWEpOworCWNsZWFyX2RtYV9mZihkbWEpOworCXNldF9kbWFfbW9kZShkbWEsRE1BX01PREVfUkVBRCk7CisJc2V0X2RtYV9hZGRyKGRtYSx2aXJ0X3RvX2J1cyhsdGRtYWJ1ZikpOworCXNldF9kbWFfY291bnQoZG1hLDB4MTAwKTsKKwllbmFibGVfZG1hKGRtYSk7CisJcmVsZWFzZV9kbWFfbG9jayhmKTsKKworCSh2b2lkKSBpbmJfcChpbyszKTsKKwkodm9pZCkgaW5iX3AoaW8rMik7CisJdGltZW91dCA9IGppZmZpZXMrMTAwKkhaLzEwMDsKKworCXdoaWxlKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCWlmKCAweGY5ID09IGluYl9wKGlvKzYpKQorCQkJYnJlYWs7CisJCXNjaGVkdWxlKCk7CisJfQorCisJaWYoZGVidWcgJiBERUJVR19WRVJCT1NFKSB7CisJCXByaW50aygic2V0dGluZyB1cCB0aW1lciBhbmQgaXJxXG4iKTsKKwl9CisKKwkvKiBncmFiIGl0IGFuZCBkb24ndCBsZXQgZ28gOi0pICovCisJaWYgKGlycSAmJiByZXF1ZXN0X2lycSggaXJxLCAmbHRwY19pbnRlcnJ1cHQsIDAsICJsdHBjIiwgZGV2KSA+PSAwKQorCXsKKwkJKHZvaWQpIGluYl9wKGlvKzcpOyAgLyogZW5hYmxlIGludGVycnVwdHMgZnJvbSBib2FyZCAqLworCQkodm9pZCkgaW5iX3AoaW8rNyk7ICAvKiBhbmQgcmVzZXQgaXJxIGxpbmUgKi8KKwl9IGVsc2UgeworCQlpZiggaXJxICkKKwkJCXByaW50ayhLRVJOX0VSUiAibHRwYzogSVJRIGFscmVhZHkgaW4gdXNlLCB1c2luZyBwb2xsZWQgbW9kZS5cbiIpOworCQlkZXYtPmlycSA9IDA7CisJCS8qIHBvbGxlZCBtb2RlIC0tIDIwIHRpbWVzIHBlciBzZWNvbmQgKi8KKwkJLyogdGhpcyBpcyByZWFsbHksIHJlYWxseSBzbG93Li4uIHNob3VsZCBpdCBwb2xsIG1vcmUgb2Z0ZW4/ICovCisJCWluaXRfdGltZXIoJmx0cGNfdGltZXIpOworCQlsdHBjX3RpbWVyLmZ1bmN0aW9uPWx0cGNfcG9sbDsKKwkJbHRwY190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKworCQlsdHBjX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFovMjA7CisJCWFkZF90aW1lcigmbHRwY190aW1lcik7CisJfQorCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0NDsKKworCXJldHVybiBOVUxMOworb3V0NDoKKwlkZWxfdGltZXJfc3luYygmbHRwY190aW1lcik7CisJaWYgKGRldi0+aXJxKQorCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKK291dDM6CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylsdGRtYWJ1ZiwgZ2V0X29yZGVyKDEwMDApKTsKK291dDI6CisJcmVsZWFzZV9yZWdpb24oaW8sIDgpOworb3V0MToKKwlmcmVlX25ldGRldihkZXYpOworb3V0OgorCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKyNpZm5kZWYgTU9EVUxFCisvKiBoYW5kbGVzICJsdHBjPWlvLGlycSxkbWEiIGtlcm5lbCBjb21tYW5kIGxpbmVzICovCitzdGF0aWMgaW50IF9faW5pdCBsdHBjX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQgaW50c1s1XTsKKworCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisKKwlpZiAoaW50c1swXSA9PSAwKSB7CisJCWlmIChzdHIgJiYgIXN0cm5jbXAoc3RyLCAiYXV0byIsIDQpKSB7CisJCQkvKiBkbyBub3RoaW5nIDotKSAqLworCQl9CisJCWVsc2UgeworCQkJLyogdXNhZ2UgbWVzc2FnZSAqLworCQkJcHJpbnRrIChLRVJOX0VSUgorCQkJCSJsdHBjOiB1c2FnZTogbHRwYz1hdXRvfGlvYmFzZVssaXJxWyxkbWFdXVxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CisJCWlvID0gaW50c1sxXTsKKwkJaWYgKGludHNbMF0gPiAxKSB7CisJCQlpcnEgPSBpbnRzWzJdOworCQl9CisJCWlmIChpbnRzWzBdID4gMikgeworCQkJZG1hID0gaW50c1szXTsKKwkJfQorCQkvKiBpZ25vcmUgYW55IG90aGVyIHBhcmFtdGVycyAqLworCX0KKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgibHRwYz0iLCBsdHBjX3NldHVwKTsKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfbHRwYzsKKworI2lmZGVmIE1PRFVMRQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRtYSwgaW50LCAwKTsKKworCitpbnQgX19pbml0IGluaXRfbW9kdWxlKHZvaWQpCit7CisgICAgICAgIGlmKGlvID09IDApCisJCXByaW50ayhLRVJOX05PVElDRQorCQkgICAgICAgImx0cGM6IEF1dG9wcm9iaW5nIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgbW9kdWxlc1xuIik7CisKKwlkZXZfbHRwYyA9IGx0cGNfcHJvYmUoKTsKKwlpZiAoSVNfRVJSKGRldl9sdHBjKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGV2X2x0cGMpOworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBsdHBjX2NsZWFudXAodm9pZCkKK3sKKworCWlmKGRlYnVnICYgREVCVUdfVkVSQk9TRSkgcHJpbnRrKCJ1bnJlZ2lzdGVyX25ldGRldlxuIik7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2X2x0cGMpOworCisJbHRwY190aW1lci5kYXRhID0gMDsgIC8qIHNpZ25hbCB0aGUgcG9sbCByb3V0aW5lIHRoYXQgd2UncmUgZG9uZSAqLworCisJZGVsX3RpbWVyX3N5bmMoJmx0cGNfdGltZXIpOworCisJaWYoZGVidWcgJiBERUJVR19WRVJCT1NFKSBwcmludGsoImZyZWVpbmcgaXJxXG4iKTsKKworCWlmIChkZXZfbHRwYy0+aXJxKQorCQlmcmVlX2lycShkZXZfbHRwYy0+aXJxLCBkZXZfbHRwYyk7CisKKwlpZihkZWJ1ZyAmIERFQlVHX1ZFUkJPU0UpIHByaW50aygiZnJlZWluZyBkbWFcbiIpOworCisJaWYgKGRldl9sdHBjLT5kbWEpCisJCWZyZWVfZG1hKGRldl9sdHBjLT5kbWEpOworCisJaWYoZGVidWcgJiBERUJVR19WRVJCT1NFKSBwcmludGsoImZyZWVpbmcgaW9hZGRyXG4iKTsKKworCWlmIChkZXZfbHRwYy0+YmFzZV9hZGRyKQorCQlyZWxlYXNlX3JlZ2lvbihkZXZfbHRwYy0+YmFzZV9hZGRyLDgpOworCisJZnJlZV9uZXRkZXYoZGV2X2x0cGMpOworCisJaWYoZGVidWcgJiBERUJVR19WRVJCT1NFKSBwcmludGsoImZyZWVfcGFnZXNcbiIpOworCisJZnJlZV9wYWdlcyggKHVuc2lnbmVkIGxvbmcpIGx0ZG1hYnVmLCBnZXRfb3JkZXIoMTAwMCkpOworCisJaWYoZGVidWcgJiBERUJVR19WRVJCT1NFKSBwcmludGsoInJldHVybmluZyBmcm9tIGNsZWFudXBfbW9kdWxlXG4iKTsKK30KKworbW9kdWxlX2V4aXQobHRwY19jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FwcGxldGFsay9sdHBjLmggYi9kcml2ZXJzL25ldC9hcHBsZXRhbGsvbHRwYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMzA1NDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcHBsZXRhbGsvbHRwYy5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qKiogICBsdHBjLmgKKyAqCisgKgorICoqKi8KKworI2RlZmluZSBMVF9HRVRSRVNVTFQgIDB4MDAKKyNkZWZpbmUgTFRfV1JJVEVNRU0gICAweDAxCisjZGVmaW5lIExUX1JFQURNRU0gICAgMHgwMgorI2RlZmluZSBMVF9HRVRGTEFHUyAgIDB4MDQKKyNkZWZpbmUgTFRfU0VURkxBR1MgICAweDA1CisjZGVmaW5lIExUX0lOSVQgICAgICAgMHgxMAorI2RlZmluZSBMVF9TRU5ETEFQICAgIDB4MTMKKyNkZWZpbmUgTFRfUkNWTEFQICAgICAweDE0CisKKy8qIHRoZSBmbGFnIHRoYXQgd2UgY2FyZSBhYm91dCAqLworI2RlZmluZSBMVF9GTEFHX0FMTExBUCAweDA0CisKK3N0cnVjdCBsdF9nZXRyZXN1bHQgeworCXVuc2lnbmVkIGNoYXIgY29tbWFuZDsKKwl1bnNpZ25lZCBjaGFyIG1haWxib3g7Cit9OworCitzdHJ1Y3QgbHRfbWVtIHsKKwl1bnNpZ25lZCBjaGFyIGNvbW1hbmQ7CisJdW5zaWduZWQgY2hhciBtYWlsYm94OworCXVuc2lnbmVkIHNob3J0IGFkZHI7CS8qIGhvc3Qgb3JkZXIgKi8KKwl1bnNpZ25lZCBzaG9ydCBsZW5ndGg7CS8qIGhvc3Qgb3JkZXIgKi8KK307CisKK3N0cnVjdCBsdF9zZXRmbGFncyB7CisJdW5zaWduZWQgY2hhciBjb21tYW5kOworCXVuc2lnbmVkIGNoYXIgbWFpbGJveDsKKwl1bnNpZ25lZCBjaGFyIGZsYWdzOworfTsKKworc3RydWN0IGx0X2dldGZsYWdzIHsKKwl1bnNpZ25lZCBjaGFyIGNvbW1hbmQ7CisJdW5zaWduZWQgY2hhciBtYWlsYm94OworfTsKKworc3RydWN0IGx0X2luaXQgeworCXVuc2lnbmVkIGNoYXIgY29tbWFuZDsKKwl1bnNpZ25lZCBjaGFyIG1haWxib3g7CisJdW5zaWduZWQgY2hhciBoaW50OworfTsKKworc3RydWN0IGx0X3NlbmRsYXAgeworCXVuc2lnbmVkIGNoYXIgY29tbWFuZDsKKwl1bnNpZ25lZCBjaGFyIG1haWxib3g7CisJdW5zaWduZWQgY2hhciBkbm9kZTsKKwl1bnNpZ25lZCBjaGFyIGxhcHR5cGU7CisJdW5zaWduZWQgc2hvcnQgbGVuZ3RoOwkvKiBob3N0IG9yZGVyICovCit9OworCitzdHJ1Y3QgbHRfcmN2bGFwIHsKKwl1bnNpZ25lZCBjaGFyIGNvbW1hbmQ7CisJdW5zaWduZWQgY2hhciBkbm9kZTsKKwl1bnNpZ25lZCBjaGFyIHNub2RlOworCXVuc2lnbmVkIGNoYXIgbGFwdHlwZTsKKwl1bnNpZ25lZCBzaG9ydCBsZW5ndGg7CS8qIGhvc3Qgb3JkZXIgKi8KK307CisKK3VuaW9uIGx0X2NvbW1hbmQgeworCXN0cnVjdCBsdF9nZXRyZXN1bHQgZ2V0cmVzdWx0OworCXN0cnVjdCBsdF9tZW0gbWVtOworCXN0cnVjdCBsdF9zZXRmbGFncyBzZXRmbGFnczsKKwlzdHJ1Y3QgbHRfZ2V0ZmxhZ3MgZ2V0ZmxhZ3M7CisJc3RydWN0IGx0X2luaXQgaW5pdDsKKwlzdHJ1Y3QgbHRfc2VuZGxhcCBzZW5kbGFwOworCXN0cnVjdCBsdF9yY3ZsYXAgcmN2bGFwOworfTsKK3R5cGVkZWYgdW5pb24gbHRfY29tbWFuZCBsdF9jb21tYW5kOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2FyY25ldC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OGRlMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcmNuZXQvS2NvbmZpZwpAQCAtMCwwICsxLDE0MCBAQAorIworIyBBcmNuZXQgY29uZmlndXJhdGlvbgorIworCittZW51ICJBUkNuZXQgZGV2aWNlcyIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMgJiYgKElTQSB8fCBQQ0kpCisKK2NvbmZpZyBBUkNORVQKKwl0cmlzdGF0ZSAiQVJDbmV0IHN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgY2hlY2sgb3V0IHRoZQorCSAgKGFyZ3VhYmx5KSBiZWF1dGlmdWwgcG9ldHJ5IGluCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYXJjbmV0LnR4dD4uCisKKwkgIFlvdSBuZWVkIGJvdGggdGhpcyBkcml2ZXIsIGFuZCB0aGUgZHJpdmVyIGZvciB0aGUgcGFydGljdWxhciBBUkNuZXQKKwkgIGNoaXBzZXQgb2YgeW91ciBjYXJkLiBJZiB5b3UgZG9uJ3Qga25vdywgdGhlbiBpdCdzIHByb2JhYmx5IGEKKwkgIENPTTkweHggdHlwZSBjYXJkLCBzbyBzYXkgWSAob3IgTSkgdG8gIkFSQ25ldCBDT005MHh4IGNoaXBzZXQKKwkgIHN1cHBvcnQiIGJlbG93LgorCisJICBZb3UgbWlnaHQgYWxzbyB3YW50IHRvIGhhdmUgYSBsb29rIGF0IHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlCisJICBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4oZXZlbiB0aG91Z2ggQVJDbmV0CisJICBpcyBub3QgcmVhbGx5IEV0aGVybmV0KS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBhcmNuZXQuCisKK2NvbmZpZyBBUkNORVRfMTIwMQorCXRyaXN0YXRlICJFbmFibGUgc3RhbmRhcmQgQVJDTmV0IHBhY2tldCBmb3JtYXQgKFJGQyAxMjAxKSIKKwlkZXBlbmRzIG9uIEFSQ05FVAorCWhlbHAKKwkgIFRoaXMgYWxsb3dzIHlvdSB0byB1c2UgUkZDMTIwMSB3aXRoIHlvdXIgQVJDbmV0IGNhcmQgdmlhIHRoZSB2aXJ0dWFsCisJICBhcmMwIGRldmljZS4gIFlvdSBuZWVkIHRvIHNheSBZIGhlcmUgdG8gY29tbXVuaWNhdGUgd2l0aAorCSAgaW5kdXN0cnktc3RhbmRhcmQgUkZDMTIwMSBpbXBsZW1lbnRhdGlvbnMsIGxpa2UgdGhlIGFyY2V0aGVyLmNvbQorCSAgcGFja2V0IGRyaXZlciBvciBtb3N0IERPUy9XaW5kb3dzIE9ESSBkcml2ZXJzLiAgUGxlYXNlIHJlYWQgdGhlCisJICBBUkNuZXQgZG9jdW1lbnRhdGlvbiBpbiA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYXJjbmV0LnR4dD4KKwkgIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHVzaW5nIGFyYzAuCisKK2NvbmZpZyBBUkNORVRfMTA1MQorCXRyaXN0YXRlICJFbmFibGUgb2xkIEFSQ05ldCBwYWNrZXQgZm9ybWF0IChSRkMgMTA1MSkiCisJZGVwZW5kcyBvbiBBUkNORVQKKwktLS1oZWxwLS0tCisJICBUaGlzIGFsbG93cyB5b3UgdG8gdXNlIFJGQzEwNTEgd2l0aCB5b3VyIEFSQ25ldCBjYXJkIHZpYSB0aGUgdmlydHVhbAorCSAgYXJjMHMgZGV2aWNlLiBZb3Ugb25seSBuZWVkIGFyYzBzIGlmIHlvdSB3YW50IHRvIHRhbGsgdG8gQVJDbmV0CisJICBzb2Z0d2FyZSBjb21wbHlpbmcgd2l0aCB0aGUgIm9sZCIgc3RhbmRhcmQsIHNwZWNpZmljYWxseSwgdGhlIERPUworCSAgYXJjbmV0LmNvbSBwYWNrZXQgZHJpdmVyLCBBbWlnYXMgcnVubmluZyBBbWlUQ1AsIGFuZCBzb21lIHZhcmlhbnRzCisJICBvZiBOZXRCU0QuIFlvdSBkbyBub3QgbmVlZCB0byBzYXkgWSBoZXJlIHRvIGNvbW11bmljYXRlIHdpdGgKKwkgIGluZHVzdHJ5LXN0YW5kYXJkIFJGQzEyMDEgaW1wbGVtZW50YXRpb25zLCBsaWtlIHRoZSBhcmNldGhlci5jb20KKwkgIHBhY2tldCBkcml2ZXIgb3IgbW9zdCBET1MvV2luZG93cyBPREkgZHJpdmVycy4gUkZDMTIwMSBpcyBpbmNsdWRlZAorCSAgYXV0b21hdGljYWxseSBhcyB0aGUgYXJjMCBkZXZpY2UuIFBsZWFzZSByZWFkIHRoZSBBUkNuZXQKKwkgIGRvY3VtZW50YXRpb24gaW4gPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2FyY25ldC50eHQ+IGZvciBtb3JlCisJICBpbmZvcm1hdGlvbiBhYm91dCB1c2luZyBhcmMwZSBhbmQgYXJjMHMuCisKK2NvbmZpZyBBUkNORVRfUkFXCisJdHJpc3RhdGUgIkVuYWJsZSByYXcgbW9kZSBwYWNrZXQgaW50ZXJmYWNlIgorCWRlcGVuZHMgb24gQVJDTkVUCisJaGVscAorCSAgQVJDbmV0ICJyYXcgbW9kZSIgcGFja2V0IGVuY2Fwc3VsYXRpb24sIG5vIHNvZnQgaGVhZGVycy4gIFVubGlrZWx5CisJICB0byB3b3JrIHVubGVzcyB0YWxraW5nIHRvIGEgY29weSBvZiB0aGUgc2FtZSBMaW51eCBhcmNuZXQgZHJpdmVyLAorCSAgYnV0IHBlcmhhcHMgbWFyZ2luYWxseSBmYXN0ZXIgaW4gdGhhdCBjYXNlLgorCitjb25maWcgQVJDTkVUX0NBUAorCXRyaXN0YXRlICJFbmFibGUgQ0FQIG1vZGUgcGFja2V0IGludGVyZmFjZSIKKwlkZXBlbmRzIG9uIEFSQ05FVAorCWhlbHAKKwkgIEFSQ25ldCAiY2FwIG1vZGUiIHBhY2tldCBlbmNhcHN1bGF0aW9uLiBVc2VkIHRvIGdldCB0aGUgaGFyZHdhcmUKKyAgICAgICAgICBhY2tub3dsZWRnZSBiYWNrIHRvIHVzZXJzcGFjZS4gQWZ0ZXIgdGhlIGluaXRpYWwgcHJvdG9jb2wgYnl0ZSBldmVyeQorICAgICAgICAgIHBhY2tldCBpcyBzdHVmZmVkIHdpdGggYW4gZXh0cmEgNCBieXRlICJjb29raWUiIHdoaWNoIGRvZXNuJ3QKKyAgICAgICAgICBhY3R1YWxseSBhcHBlYXIgb24gdGhlIG5ldHdvcmsuIEFmdGVyIHRyYW5zbWl0IHRoZSBkcml2ZXIgd2lsbCBzZW5kCisgICAgICAgICAgYmFjayBhIHBhY2tldCB3aXRoIHByb3RvY29sIGJ5dGUgMCBjb250YWluaW5nIHRoZSBzdGF0dXMgb2YgdGhlCisgICAgICAgICAgdHJhbnNtaXRpb246CisgICAgICAgICAgICAgMD1ubyBoYXJkd2FyZSBhY2tub3dsZWRnZQorICAgICAgICAgICAgIDE9ZXhjZXNzaXZlIG5haworICAgICAgICAgICAgIDI9dHJhbnNtaXRpb24gYWNjZXB0ZWQgYnkgdGhlIHJlY2lldmVyIGhhcmR3YXJlCisKKyAgICAgICAgICBSZWNlaXZlZCBwYWNrZXRzIGFyZSBhbHNvIHN0dWZmZWQgd2l0aCB0aGUgZXh0cmEgNCBieXRlcyBidXQgaXQgd2lsbAorICAgICAgICAgIGJlIHJhbmRvbSBkYXRhLgorCisgICAgICAgICAgQ2FwIG9ubHkgbGlzdGVucyB0byBwcm90b2NvbCAxLTguCisKK2NvbmZpZyBBUkNORVRfQ09NOTB4eAorCXRyaXN0YXRlICJBUkNuZXQgQ09NOTB4eCAobm9ybWFsKSBjaGlwc2V0IGRyaXZlciIKKwlkZXBlbmRzIG9uIEFSQ05FVAorCWhlbHAKKwkgIFRoaXMgaXMgdGhlIGNoaXBzZXQgZHJpdmVyIGZvciB0aGUgc3RhbmRhcmQgQ09NOTB4eCBjYXJkcy4gSWYgeW91CisJICBoYXZlIGFsd2F5cyB1c2VkIHRoZSBvbGQgQVJDbmV0IGRyaXZlciB3aXRob3V0IGtub3dpbmcgd2hhdCB0eXBlIG9mCisJICBjYXJkIHlvdSBoYWQsIHRoaXMgaXMgcHJvYmFibHkgdGhlIG9uZSBmb3IgeW91LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGNvbTkweHguCisKK2NvbmZpZyBBUkNORVRfQ09NOTB4eElPCisJdHJpc3RhdGUgIkFSQ25ldCBDT005MHh4IChJTyBtYXBwZWQpIGNoaXBzZXQgZHJpdmVyIgorCWRlcGVuZHMgb24gQVJDTkVUCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgY2hpcHNldCBkcml2ZXIgZm9yIHRoZSBDT005MHh4IGNhcmRzLCB1c2luZyB0aGVtIGluCisJICBJTy1tYXBwZWQgbW9kZSBpbnN0ZWFkIG9mIG1lbW9yeS1tYXBwZWQgbW9kZS4gVGhpcyBpcyBzbG93ZXIgdGhhbgorCSAgdGhlIG5vcm1hbCBkcml2ZXIuIE9ubHkgdXNlIGl0IGlmIHlvdXIgY2FyZCBkb2Vzbid0IHN1cHBvcnQgc2hhcmVkCisJICBtZW1vcnkuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgY29tOTBpby4KKworY29uZmlnIEFSQ05FVF9SSU1fSQorCXRyaXN0YXRlICJBUkNuZXQgQ09NOTB4eCAoUklNIEkpIGNoaXBzZXQgZHJpdmVyIgorCWRlcGVuZHMgb24gQVJDTkVUCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB5ZXQgYW5vdGhlciBjaGlwc2V0IGRyaXZlciBmb3IgdGhlIENPTTkweHggY2FyZHMsIGJ1dCB0aGlzCisJICB0aW1lIG9ubHkgdXNpbmcgbWVtb3J5LW1hcHBlZCBtb2RlLCBhbmQgbm8gSU8gcG9ydHMgYXQgYWxsLiBUaGlzCisJICBkcml2ZXIgaXMgY29tcGxldGVseSB1bnRlc3RlZCwgc28gaWYgeW91IGhhdmUgb25lIG9mIHRoZXNlIGNhcmRzLAorCSAgcGxlYXNlIG1haWwgPGR3bXcyQGluZnJhZGVhZC5vcmc+LCBlc3BlY2lhbGx5IGlmIGl0IHdvcmtzIQorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGFyYy1yaW1pLgorCitjb25maWcgQVJDTkVUX0NPTTIwMDIwCisJdHJpc3RhdGUgIkFSQ25ldCBDT00yMDAyMCBjaGlwc2V0IGRyaXZlciIKKwlkZXBlbmRzIG9uIEFSQ05FVAorCWhlbHAKKwkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIG5ldyBDT00yMDAyMCBjaGlwc2V0LiBJdCBzdXBwb3J0cyBzdWNoCisJICB0aGluZ3MgYXMgcHJvbWlzY3VvdXMgbW9kZSwgc28gcGFja2V0IHNuaWZmaW5nIGlzIHBvc3NpYmxlLCBhbmQKKwkgIGV4dHJhIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgY29tMjAwMjAuCisKK2NvbmZpZyBBUkNORVRfQ09NMjAwMjBfSVNBCisJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIENPTTIwMDIwIG9uIElTQSIKKwlkZXBlbmRzIG9uIEFSQ05FVF9DT00yMDAyMCAmJiBJU0EKKworY29uZmlnIEFSQ05FVF9DT00yMDAyMF9QQ0kKKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgQ09NMjAwMjAgb24gUENJIgorCWRlcGVuZHMgb24gQVJDTkVUX0NPTTIwMDIwICYmIFBDSQorCitlbmRtZW51CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FyY25ldC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2FyY25ldC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODYxYWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXJjbmV0L01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKKyMgTWFrZWZpbGUgZm9yIGxpbnV4L2RyaXZlcnMvbmV0L2FyY25ldAorIworCitvYmotJChDT05GSUdfQVJDTkVUKSArPSBhcmNuZXQubworb2JqLSQoQ09ORklHX0FSQ05FVF8xMjAxKSArPSByZmMxMjAxLm8KK29iai0kKENPTkZJR19BUkNORVRfMTA1MSkgKz0gcmZjMTA1MS5vCitvYmotJChDT05GSUdfQVJDTkVUX1JBVykgKz0gYXJjLXJhd21vZGUubworb2JqLSQoQ09ORklHX0FSQ05FVF9DQVApICs9IGNhcG1vZGUubworb2JqLSQoQ09ORklHX0FSQ05FVF9DT005MHh4KSArPSBjb205MHh4Lm8KK29iai0kKENPTkZJR19BUkNORVRfQ09NOTB4eElPKSArPSBjb205MGlvLm8KK29iai0kKENPTkZJR19BUkNORVRfUklNX0kpICs9IGFyYy1yaW1pLm8KK29iai0kKENPTkZJR19BUkNORVRfQ09NMjAwMjApICs9IGNvbTIwMDIwLm8KK29iai0kKENPTkZJR19BUkNORVRfQ09NMjAwMjBfSVNBKSArPSBjb20yMDAyMC1pc2Eubworb2JqLSQoQ09ORklHX0FSQ05FVF9DT00yMDAyMF9QQ0kpICs9IGNvbTIwMDIwLXBjaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvYXJjLXJhd21vZGUuYyBiL2RyaXZlcnMvbmV0L2FyY25ldC9hcmMtcmF3bW9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZWEyOWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcmNuZXQvYXJjLXJhd21vZGUuYwpAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIExpbnV4IEFSQ25ldCBkcml2ZXIgLSAicmF3IG1vZGUiIHBhY2tldCBlbmNhcHN1bGF0aW9uIChubyBzb2Z0IGhlYWRlcnMpCisgKiAKKyAqIFdyaXR0ZW4gMTk5NC0xOTk5IGJ5IEF2ZXJ5IFBlbm5hcnVuLgorICogRGVyaXZlZCBmcm9tIHNrZWxldG9uLmMgYnkgRG9uYWxkIEJlY2tlci4KKyAqCisgKiBTcGVjaWFsIHRoYW5rcyB0byBDb250ZW1wb3JhcnkgQ29udHJvbHMsIEluYy4gKHd3dy5jY29udHJvbHMuY29tKQorICogIGZvciBzcG9uc29yaW5nIHRoZSBmdXJ0aGVyIGRldmVsb3BtZW50IG9mIHRoaXMgZHJpdmVyLgorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgb3JpZ2luYWwgY29weXJpZ2h0IG9mIHNrZWxldG9uLmMgd2FzIGFzIGZvbGxvd3M6CisgKgorICogc2tlbGV0b24uYyBXcml0dGVuIDE5OTMgYnkgRG9uYWxkIEJlY2tlci4KKyAqIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKyAqIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuICBUaGlzIHNvZnR3YXJlIG1heSBvbmx5IGJlIHVzZWQKKyAqIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogbW9kaWZpZWQgYnkgU1JDLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRm9yIG1vcmUgZGV0YWlscywgc2VlIGRyaXZlcnMvbmV0L2FyY25ldC5jCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2FyY2RldmljZS5oPgorCisjZGVmaW5lIFZFUlNJT04gImFyY25ldDogcmF3IG1vZGUgKGByJykgZW5jYXBzdWxhdGlvbiBzdXBwb3J0IGxvYWRlZC5cbiIKKworCitzdGF0aWMgdm9pZCByeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmbnVtLAorCSAgICAgICBzdHJ1Y3QgYXJjaGRyICpwa3RoZHIsIGludCBsZW5ndGgpOworc3RhdGljIGludCBidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXVuc2lnbmVkIHNob3J0IHR5cGUsIHVpbnQ4X3QgZGFkZHIpOworc3RhdGljIGludCBwcmVwYXJlX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBhcmNoZHIgKnBrdCwgaW50IGxlbmd0aCwKKwkJICAgICAgaW50IGJ1Zm51bSk7CisKK3N0cnVjdCBBcmNQcm90byByYXdtb2RlX3Byb3RvID0KK3sKKwkuc3VmZml4CQk9ICdyJywKKwkubXR1CQk9IFhNVFUsCisJLnJ4CQk9IHJ4LAorCS5idWlsZF9oZWFkZXIJPSBidWlsZF9oZWFkZXIsCisJLnByZXBhcmVfdHgJPSBwcmVwYXJlX3R4LAorCS5jb250aW51ZV90eCAgICA9IE5VTEwsCisJLmFja190eCAgICAgICAgID0gTlVMTAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBhcmNuZXRfcmF3X2luaXQodm9pZCkKK3sKKwlpbnQgY291bnQ7CisKKwlwcmludGsoVkVSU0lPTik7CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAyNTY7IGNvdW50KyspCisJCWlmIChhcmNfcHJvdG9fbWFwW2NvdW50XSA9PSBhcmNfcHJvdG9fZGVmYXVsdCkKKwkJCWFyY19wcm90b19tYXBbY291bnRdID0gJnJhd21vZGVfcHJvdG87CisKKwkvKiBmb3IgcmF3IG1vZGUsIHdlIG9ubHkgc2V0IHRoZSBiY2FzdCBwcm90byBpZiB0aGVyZSdzIG5vIGJldHRlciBvbmUgKi8KKwlpZiAoYXJjX2JjYXN0X3Byb3RvID09IGFyY19wcm90b19kZWZhdWx0KQorCQlhcmNfYmNhc3RfcHJvdG8gPSAmcmF3bW9kZV9wcm90bzsKKworCWFyY19wcm90b19kZWZhdWx0ID0gJnJhd21vZGVfcHJvdG87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhcmNuZXRfcmF3X2V4aXQodm9pZCkKK3sKKwlhcmNuZXRfdW5yZWdpc3Rlcl9wcm90bygmcmF3bW9kZV9wcm90byk7Cit9CisKK21vZHVsZV9pbml0KGFyY25ldF9yYXdfaW5pdCk7Cittb2R1bGVfZXhpdChhcmNuZXRfcmF3X2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworLyogcGFja2V0IHJlY2VpdmVyICovCitzdGF0aWMgdm9pZCByeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmbnVtLAorCSAgICAgICBzdHJ1Y3QgYXJjaGRyICpwa3RoZHIsIGludCBsZW5ndGgpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgYXJjaGRyICpwa3QgPSBwa3RoZHI7CisJaW50IG9mczsKKworCUJVR01TRyhEX0RVUklORywgIml0J3MgYSByYXcgcGFja2V0IChsZW5ndGg9JWQpXG4iLCBsZW5ndGgpOworCisJaWYgKGxlbmd0aCA+PSBNaW5UVSkKKwkJb2ZzID0gNTEyIC0gbGVuZ3RoOworCWVsc2UKKwkJb2ZzID0gMjU2IC0gbGVuZ3RoOworCisJc2tiID0gYWxsb2Nfc2tiKGxlbmd0aCArIEFSQ19IRFJfU0laRSwgR0ZQX0FUT01JQyk7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCUJVR01TRyhEX05PUk1BTCwgIk1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iKTsKKwkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKwlza2JfcHV0KHNrYiwgbGVuZ3RoICsgQVJDX0hEUl9TSVpFKTsKKwlza2ItPmRldiA9IGRldjsKKworCXBrdCA9IChzdHJ1Y3QgYXJjaGRyICopIHNrYi0+ZGF0YTsKKworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcHVsbChza2IsIEFSQ19IRFJfU0laRSk7CisKKwkvKiB1cCB0byBzaXplb2YocGt0LT5zb2Z0KSBoYXMgYWxyZWFkeSBiZWVuIGNvcGllZCBmcm9tIHRoZSBjYXJkICovCisJbWVtY3B5KHBrdCwgcGt0aGRyLCBzaXplb2Yoc3RydWN0IGFyY2hkcikpOworCWlmIChsZW5ndGggPiBzaXplb2YocGt0LT5zb2Z0KSkKKwkJbHAtPmh3LmNvcHlfZnJvbV9jYXJkKGRldiwgYnVmbnVtLCBvZnMgKyBzaXplb2YocGt0LT5zb2Z0KSwKKwkJCQkgICAgICBwa3QtPnNvZnQucmF3ICsgc2l6ZW9mKHBrdC0+c29mdCksCisJCQkJICAgICAgbGVuZ3RoIC0gc2l6ZW9mKHBrdC0+c29mdCkpOworCisJQlVHTFZMKERfU0tCKSBhcmNuZXRfZHVtcF9za2IoZGV2LCBza2IsICJyeCIpOworCisJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfQVJDTkVUKTsKKzsKKwluZXRpZl9yeChza2IpOworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7Cit9CisKKworLyoKKyAqIENyZWF0ZSB0aGUgQVJDbmV0IGhhcmQvc29mdCBoZWFkZXJzIGZvciByYXcgbW9kZS4KKyAqIFRoZXJlIGFyZW4ndCBhbnkgc29mdCBoZWFkZXJzIGluIHJhdyBtb2RlIC0gbm90IGV2ZW4gdGhlIHByb3RvY29sIGlkLgorICovCitzdGF0aWMgaW50IGJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJdW5zaWduZWQgc2hvcnQgdHlwZSwgdWludDhfdCBkYWRkcikKK3sKKwlpbnQgaGRyX3NpemUgPSBBUkNfSERSX1NJWkU7CisJc3RydWN0IGFyY2hkciAqcGt0ID0gKHN0cnVjdCBhcmNoZHIgKikgc2tiX3B1c2goc2tiLCBoZHJfc2l6ZSk7CisKKwkvKgorCSAqIFNldCB0aGUgc291cmNlIGhhcmR3YXJlIGFkZHJlc3MuCisJICoKKwkgKiBUaGlzIGlzIHByZXR0eSBwb2ludGxlc3MgZm9yIG1vc3QgcHVycG9zZXMsIGJ1dCBpdCBjYW4gaGVscCBpbgorCSAqIGRlYnVnZ2luZy4gIEFSQ25ldCBkb2VzIG5vdCBhbGxvdyB1cyB0byBjaGFuZ2UgdGhlIHNvdXJjZSBhZGRyZXNzIGluCisJICogdGhlIGFjdHVhbCBwYWNrZXQgc2VudCkKKwkgKi8KKwlwa3QtPmhhcmQuc291cmNlID0gKmRldi0+ZGV2X2FkZHI7CisKKwkvKiBzZWUgbGludXgvbmV0L2V0aGVybmV0L2V0aC5jIHRvIHNlZSB3aGVyZSBJIGdvdCB0aGUgZm9sbG93aW5nICovCisKKwlpZiAoZGV2LT5mbGFncyAmIChJRkZfTE9PUEJBQ0sgfCBJRkZfTk9BUlApKSB7CisJCS8qIAorCQkgKiBGSVhNRTogZmlsbCBpbiB0aGUgbGFzdCBieXRlIG9mIHRoZSBkZXN0IGlwYWRkciBoZXJlIHRvIGJldHRlcgorCQkgKiBjb21wbHkgd2l0aCBSRkMxMDUxIGluICJub2FycCIgbW9kZS4KKwkJICovCisJCXBrdC0+aGFyZC5kZXN0ID0gMDsKKwkJcmV0dXJuIGhkcl9zaXplOworCX0KKwkvKiBvdGhlcndpc2UsIGp1c3QgZmlsbCBpdCBpbiBhbmQgZ28hICovCisJcGt0LT5oYXJkLmRlc3QgPSBkYWRkcjsKKworCXJldHVybiBoZHJfc2l6ZTsJLyogc3VjY2VzcyAqLworfQorCisKK3N0YXRpYyBpbnQgcHJlcGFyZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgYXJjaGRyICpwa3QsIGludCBsZW5ndGgsCisJCSAgICAgIGludCBidWZudW0pCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IGFyY19oYXJkd2FyZSAqaGFyZCA9ICZwa3QtPmhhcmQ7CisJaW50IG9mczsKKworCUJVR01TRyhEX0RVUklORywgInByZXBhcmVfdHg6IHR4YnVmcz0lZC8lZC8lZFxuIiwKKwkgICAgICAgbHAtPm5leHRfdHgsIGxwLT5jdXJfdHgsIGJ1Zm51bSk7CisKKwlsZW5ndGggLT0gQVJDX0hEUl9TSVpFOwkvKiBoYXJkIGhlYWRlciBpcyBub3QgaW5jbHVkZWQgaW4gcGFja2V0IGxlbmd0aCAqLworCisJaWYgKGxlbmd0aCA+IFhNVFUpIHsKKwkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiEgb3RoZXIgcGVvcGxlIGFscmVhZHkgY2hlY2sgZm9yIHRoaXMuICovCisJCUJVR01TRyhEX05PUk1BTCwgIkJ1ZyEgIHByZXBhcmVfdHggd2l0aCBzaXplICVkICg+ICVkKVxuIiwKKwkJICAgICAgIGxlbmd0aCwgWE1UVSk7CisJCWxlbmd0aCA9IFhNVFU7CisJfQorCWlmIChsZW5ndGggPiBNaW5UVSkgeworCQloYXJkLT5vZmZzZXRbMF0gPSAwOworCQloYXJkLT5vZmZzZXRbMV0gPSBvZnMgPSA1MTIgLSBsZW5ndGg7CisJfSBlbHNlIGlmIChsZW5ndGggPiBNVFUpIHsKKwkJaGFyZC0+b2Zmc2V0WzBdID0gMDsKKwkJaGFyZC0+b2Zmc2V0WzFdID0gb2ZzID0gNTEyIC0gbGVuZ3RoIC0gMzsKKwl9IGVsc2UKKwkJaGFyZC0+b2Zmc2V0WzBdID0gb2ZzID0gMjU2IC0gbGVuZ3RoOworCisJQlVHTVNHKERfRFVSSU5HLCAicHJlcGFyZV90eDogbGVuZ3RoPSVkIG9mcz0lZFxuIiwKKwkgICAgICAgbGVuZ3RoLG9mcyk7CisKKwlscC0+aHcuY29weV90b19jYXJkKGRldiwgYnVmbnVtLCAwLCBoYXJkLCBBUkNfSERSX1NJWkUpOworCWxwLT5ody5jb3B5X3RvX2NhcmQoZGV2LCBidWZudW0sIG9mcywgJnBrdC0+c29mdCwgbGVuZ3RoKTsKKworCWxwLT5sYXN0bG9hZF9kZXN0ID0gaGFyZC0+ZGVzdDsKKworCXJldHVybiAxOwkJLyogZG9uZSAqLworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJjbmV0L2FyYy1yaW1pLmMgYi9kcml2ZXJzL25ldC9hcmNuZXQvYXJjLXJpbWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGMzZjAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXJjbmV0L2FyYy1yaW1pLmMKQEAgLTAsMCArMSwzNjggQEAKKy8qCisgKiBMaW51eCBBUkNuZXQgZHJpdmVyIC0gIlJJTSBJIiAoZW50aXJlbHkgbWVtLW1hcHBlZCkgY2FyZHMKKyAqIAorICogV3JpdHRlbiAxOTk0LTE5OTkgYnkgQXZlcnkgUGVubmFydW4uCisgKiBXcml0dGVuIDE5OTktMjAwMCBieSBNYXJ0aW4gTWFyZXMgPG1qQHVjdy5jej4uCisgKiBEZXJpdmVkIGZyb20gc2tlbGV0b24uYyBieSBEb25hbGQgQmVja2VyLgorICoKKyAqIFNwZWNpYWwgdGhhbmtzIHRvIENvbnRlbXBvcmFyeSBDb250cm9scywgSW5jLiAod3d3LmNjb250cm9scy5jb20pCisgKiAgZm9yIHNwb25zb3JpbmcgdGhlIGZ1cnRoZXIgZGV2ZWxvcG1lbnQgb2YgdGhpcyBkcml2ZXIuCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoZSBvcmlnaW5hbCBjb3B5cmlnaHQgb2Ygc2tlbGV0b24uYyB3YXMgYXMgZm9sbG93czoKKyAqCisgKiBza2VsZXRvbi5jIFdyaXR0ZW4gMTk5MyBieSBEb25hbGQgQmVja2VyLgorICogQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICogRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4gIFRoaXMgc29mdHdhcmUgbWF5IG9ubHkgYmUgdXNlZAorICogYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBtb2RpZmllZCBieSBTUkMsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgZHJpdmVycy9uZXQvYXJjbmV0LmMKKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvYXJjZGV2aWNlLmg+CisKKworI2RlZmluZSBWRVJTSU9OICJhcmNuZXQ6IFJJTSBJIChlbnRpcmVseSBtZW0tbWFwcGVkKSBzdXBwb3J0XG4iCisKKworLyogSW50ZXJuYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCisKK3N0YXRpYyBpbnQgYXJjcmltaV9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYXJjcmltaV9mb3VuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGFyY3JpbWlfY29tbWFuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY29tbWFuZCk7CitzdGF0aWMgaW50IGFyY3JpbWlfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYXJjcmltaV9zZXRtYXNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtYXNrKTsKK3N0YXRpYyBpbnQgYXJjcmltaV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVhbGx5X3Jlc2V0KTsKK3N0YXRpYyB2b2lkIGFyY3JpbWlfY29weV90b19jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZudW0sIGludCBvZmZzZXQsCisJCQkJIHZvaWQgKmJ1ZiwgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIGFyY3JpbWlfY29weV9mcm9tX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSwgaW50IG9mZnNldCwKKwkJCQkgICB2b2lkICpidWYsIGludCBjb3VudCk7CisKKy8qIEhhbmR5IGRlZmluZXMgZm9yIEFSQ25ldCBzcGVjaWZpYyBzdHVmZiAqLworCisvKiBBbW91bnQgb2YgSS9PIG1lbW9yeSB1c2VkIGJ5IHRoZSBjYXJkICovCisjZGVmaW5lIEJVRkZFUl9TSVpFICg1MTIpCisjZGVmaW5lIE1JUlJPUl9TSVpFIChCVUZGRVJfU0laRSo0KQorCisvKiBDT00gOTAyNiBjb250cm9sbGVyIGNoaXAgLS0+IEFSQ25ldCByZWdpc3RlciBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgX0lOVE1BU0sgKGlvYWRkciswKQkvKiB3cml0YWJsZSAqLworI2RlZmluZSBfU1RBVFVTICAoaW9hZGRyKzApCS8qIHJlYWRhYmxlICovCisjZGVmaW5lIF9DT01NQU5EIChpb2FkZHIrMSkJLyogd3JpdGFibGUsIHJldHVybnMgcmFuZG9tIHZhbHMgb24gcmVhZCAoPykgKi8KKyNkZWZpbmUgX1JFU0VUICAoaW9hZGRyKzgpCS8qIHNvZnR3YXJlIHJlc2V0IChvbiByZWFkKSAqLworI2RlZmluZSBfTUVNREFUQSAgKGlvYWRkcisxMikJLyogRGF0YSBwb3J0IGZvciBJTy1tYXBwZWQgbWVtb3J5ICovCisjZGVmaW5lIF9BRERSX0hJICAoaW9hZGRyKzE1KQkvKiBDb250cm9sIHJlZ2lzdGVycyBmb3Igc2FpZCAqLworI2RlZmluZSBfQUREUl9MTyAgKGlvYWRkcisxNCkKKyNkZWZpbmUgX0NPTkZJRyAgKGlvYWRkcisyKQkvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisKKyN1bmRlZiBBU1RBVFVTCisjdW5kZWYgQUNPTU1BTkQKKyN1bmRlZiBBSU5UTUFTSworCisjZGVmaW5lIEFTVEFUVVMoKQlyZWFkYihfU1RBVFVTKQorI2RlZmluZSBBQ09NTUFORChjbWQpCXdyaXRlYigoY21kKSxfQ09NTUFORCkKKyNkZWZpbmUgQUlOVE1BU0sobXNrKQl3cml0ZWIoKG1zayksX0lOVE1BU0spCisjZGVmaW5lIFNFVENPTkYoKQl3cml0ZWIobHAtPmNvbmZpZyxfQ09ORklHKQorCisKKy8qCisgKiBXZSBjYW5ub3QgcHJvYmUgZm9yIGEgUklNIEkgY2FyZDsgb25lIHJlYXNvbiBpcyBJIGRvbid0IGtub3cgaG93IHRvIHJlc2V0CisgKiB0aGVtLiAgSW4gZmFjdCwgd2UgY2FuJ3QgZXZlbiBnZXQgdGhlaXIgbm9kZSBJRCBhdXRvbWF0aWNhbGx5LiAgU28sIHdlCisgKiBuZWVkIHRvIGJlIHBhc3NlZCBhIHNwZWNpZmljIHNobWVtIGFkZHJlc3MsIElSUSwgYW5kIG5vZGUgSUQuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGFyY3JpbWlfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlCVUdMVkwoRF9OT1JNQUwpIHByaW50ayhWRVJTSU9OKTsKKwlCVUdMVkwoRF9OT1JNQUwpIHByaW50aygiRS1tYWlsIG1lIGlmIHlvdSBhY3R1YWxseSB0ZXN0IHRoZSBSSU0gSSBkcml2ZXIsIHBsZWFzZSFcbiIpOworCisJQlVHTVNHKERfTk9STUFMLCAiR2l2ZW46IG5vZGUgJTAyWGgsIHNobWVtICVsWGgsIGlycSAlZFxuIiwKKwkgICAgICAgZGV2LT5kZXZfYWRkclswXSwgZGV2LT5tZW1fc3RhcnQsIGRldi0+aXJxKTsKKworCWlmIChkZXYtPm1lbV9zdGFydCA8PSAwIHx8IGRldi0+aXJxIDw9IDApIHsKKwkJQlVHTVNHKERfTk9STUFMLCAiTm8gYXV0b3Byb2JlIGZvciBSSU0gSTsgeW91ICIKKwkJICAgICAgICJtdXN0IHNwZWNpZnkgdGhlIHNobWVtIGFuZCBpcnEhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qCisJICogR3JhYiB0aGUgbWVtb3J5IHJlZ2lvbiBhdCBtZW1fc3RhcnQgZm9yIEJVRkZFUl9TSVpFIGJ5dGVzLgorCSAqIExhdGVyIGluIGFyY3JpbWlfZm91bmQoKSB0aGUgcmVhbCBzaXplIHdpbGwgYmUgZGV0ZXJtaW5lZAorCSAqIGFuZCB0aGlzIHJlc2VydmUgd2lsbCBiZSByZWxlYXNlZCBhbmQgdGhlIGNvcnJlY3Qgc2l6ZQorCSAqIHdpbGwgYmUgdGFrZW4uCisJICovCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oZGV2LT5tZW1fc3RhcnQsIEJVRkZFUl9TSVpFLCAiYXJjbmV0ICg5MHh4KSIpKSB7CisJCUJVR01TRyhEX05PUk1BTCwgIkNhcmQgbWVtb3J5IGFscmVhZHkgYWxsb2NhdGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChkZXYtPmRldl9hZGRyWzBdID09IDApIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGRldi0+bWVtX3N0YXJ0LCBCVUZGRVJfU0laRSk7CisJCUJVR01TRyhEX05PUk1BTCwgIllvdSBuZWVkIHRvIHNwZWNpZnkgeW91ciBjYXJkJ3Mgc3RhdGlvbiAiCisJCSAgICAgICAiSUQhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiBhcmNyaW1pX2ZvdW5kKGRldik7Cit9CisKKworLyoKKyAqIFNldCB1cCB0aGUgc3RydWN0IG5ldF9kZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2FyZC4gIENhbGxlZCBhZnRlcgorICogcHJvYmluZyBzdWNjZWVkcy4KKyAqLworc3RhdGljIGludCBfX2luaXQgYXJjcmltaV9mb3VuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwOworCXVuc2lnbmVkIGxvbmcgZmlyc3RfbWlycm9yLCBsYXN0X21pcnJvciwgc2htZW07CisJaW50IG1pcnJvcl9zaXplOworCWludCBlcnI7CisKKwkvKiByZXNlcnZlIHRoZSBpcnEgKi8KKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICZhcmNuZXRfaW50ZXJydXB0LCAwLCAiYXJjbmV0IChSSU0gSSkiLCBkZXYpKSB7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihkZXYtPm1lbV9zdGFydCwgQlVGRkVSX1NJWkUpOworCQlCVUdNU0coRF9OT1JNQUwsICJDYW4ndCBnZXQgSVJRICVkIVxuIiwgZGV2LT5pcnEpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzaG1lbSA9IGRldi0+bWVtX3N0YXJ0OworCWlzYV93cml0ZWIoVEVTVHZhbHVlLCBzaG1lbSk7CisJaXNhX3dyaXRlYihkZXYtPmRldl9hZGRyWzBdLCBzaG1lbSArIDEpOwkvKiBhY3R1YWxseSB0aGUgbm9kZSBJRCAqLworCisJLyogZmluZCB0aGUgcmVhbCBzaGFyZWQgbWVtb3J5IHN0YXJ0L2VuZCBwb2ludHMsIGluY2x1ZGluZyBtaXJyb3JzICovCisKKwkvKiBndWVzcyB0aGUgYWN0dWFsIHNpemUgb2Ygb25lICJtZW1vcnkgbWlycm9yIiAtIHRoZSBudW1iZXIgb2YKKwkgKiBieXRlcyBiZXR3ZWVuIGNvcGllcyBvZiB0aGUgc2hhcmVkIG1lbW9yeS4gIE9uIG1vc3QgY2FyZHMsIGl0J3MKKwkgKiAyayAob3IgdGhlcmUgYXJlIG5vIG1pcnJvcnMgYXQgYWxsKSBidXQgb24gc29tZSwgaXQncyA0ay4KKwkgKi8KKwltaXJyb3Jfc2l6ZSA9IE1JUlJPUl9TSVpFOworCWlmIChpc2FfcmVhZGIoc2htZW0pID09IFRFU1R2YWx1ZQorCSAgICAmJiBpc2FfcmVhZGIoc2htZW0gLSBtaXJyb3Jfc2l6ZSkgIT0gVEVTVHZhbHVlCisJICAgICYmIGlzYV9yZWFkYihzaG1lbSAtIDIgKiBtaXJyb3Jfc2l6ZSkgPT0gVEVTVHZhbHVlKQorCQltaXJyb3Jfc2l6ZSAqPSAyOworCisJZmlyc3RfbWlycm9yID0gbGFzdF9taXJyb3IgPSBzaG1lbTsKKwl3aGlsZSAoaXNhX3JlYWRiKGZpcnN0X21pcnJvcikgPT0gVEVTVHZhbHVlKQorCQlmaXJzdF9taXJyb3IgLT0gbWlycm9yX3NpemU7CisJZmlyc3RfbWlycm9yICs9IG1pcnJvcl9zaXplOworCisJd2hpbGUgKGlzYV9yZWFkYihsYXN0X21pcnJvcikgPT0gVEVTVHZhbHVlKQorCQlsYXN0X21pcnJvciArPSBtaXJyb3Jfc2l6ZTsKKwlsYXN0X21pcnJvciAtPSBtaXJyb3Jfc2l6ZTsKKworCWRldi0+bWVtX3N0YXJ0ID0gZmlyc3RfbWlycm9yOworCWRldi0+bWVtX2VuZCA9IGxhc3RfbWlycm9yICsgTUlSUk9SX1NJWkUgLSAxOworCisJLyogaW5pdGlhbGl6ZSB0aGUgcmVzdCBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKworCWxwID0gZGV2LT5wcml2OworCWxwLT5jYXJkX25hbWUgPSAiUklNIEkiOworCWxwLT5ody5jb21tYW5kID0gYXJjcmltaV9jb21tYW5kOworCWxwLT5ody5zdGF0dXMgPSBhcmNyaW1pX3N0YXR1czsKKwlscC0+aHcuaW50bWFzayA9IGFyY3JpbWlfc2V0bWFzazsKKwlscC0+aHcucmVzZXQgPSBhcmNyaW1pX3Jlc2V0OworCWxwLT5ody5vd25lciA9IFRISVNfTU9EVUxFOworCWxwLT5ody5jb3B5X3RvX2NhcmQgPSBhcmNyaW1pX2NvcHlfdG9fY2FyZDsKKwlscC0+aHcuY29weV9mcm9tX2NhcmQgPSBhcmNyaW1pX2NvcHlfZnJvbV9jYXJkOworCisJLyoKKwkgKiByZS1yZXNlcnZlIHRoZSBtZW1vcnkgcmVnaW9uIC0gYXJjcmltaV9wcm9iZSgpIGFsbG9jZWQgdGhpcyByZXFpb24KKwkgKiBidXQgZGlkbid0IGtub3cgdGhlIHJlYWwgc2l6ZS4gIEZyZWUgdGhhdCByZWdpb24gYW5kIHRoZW4gcmUtZ2V0CisJICogd2l0aCB0aGUgY29ycmVjdCBzaXplLiAgVGhlcmUgaXMgYSBWRVJZIHNsaW0gY2hhbmNlIHRoaXMgY291bGQKKwkgKiBmYWlsLgorCSAqLworCXJlbGVhc2VfbWVtX3JlZ2lvbihzaG1lbSwgQlVGRkVSX1NJWkUpOworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGRldi0+bWVtX3N0YXJ0LAorCQkJCWRldi0+bWVtX2VuZCAtIGRldi0+bWVtX3N0YXJ0ICsgMSwKKwkJCQkiYXJjbmV0ICg5MHh4KSIpKSB7CisJCUJVR01TRyhEX05PUk1BTCwgIkNhcmQgbWVtb3J5IGFscmVhZHkgYWxsb2NhdGVkXG4iKTsKKwkJZ290byBlcnJfZnJlZV9pcnE7CisJfQorCisJbHAtPm1lbV9zdGFydCA9IGlvcmVtYXAoZGV2LT5tZW1fc3RhcnQsIGRldi0+bWVtX2VuZCAtIGRldi0+bWVtX3N0YXJ0ICsgMSk7CisJaWYgKCFscC0+bWVtX3N0YXJ0KSB7CisJCUJVR01TRyhEX05PUk1BTCwgIkNhbid0IHJlbWFwIGRldmljZSBtZW1vcnkhXG4iKTsKKwkJZ290byBlcnJfcmVsZWFzZV9tZW07CisJfQorCisJLyogZ2V0IGFuZCBjaGVjayB0aGUgc3RhdGlvbiBJRCBmcm9tIG9mZnNldCAxIGluIHNobWVtICovCisJZGV2LT5kZXZfYWRkclswXSA9IHJlYWRiKGxwLT5tZW1fc3RhcnQgKyAxKTsKKworCUJVR01TRyhEX05PUk1BTCwgIkFSQ25ldCBSSU0gSTogc3RhdGlvbiAlMDJYaCBmb3VuZCBhdCBJUlEgJWQsICIKKwkgICAgICAgIlNoTWVtICVsWGggKCVsZColZCBieXRlcykuXG4iLAorCSAgICAgICBkZXYtPmRldl9hZGRyWzBdLAorCSAgICAgICBkZXYtPmlycSwgZGV2LT5tZW1fc3RhcnQsCisJIChkZXYtPm1lbV9lbmQgLSBkZXYtPm1lbV9zdGFydCArIDEpIC8gbWlycm9yX3NpemUsIG1pcnJvcl9zaXplKTsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3VubWFwOworCisJcmV0dXJuIDA7CisKK2Vycl91bm1hcDoKKwlpb3VubWFwKGxwLT5tZW1fc3RhcnQpOworZXJyX3JlbGVhc2VfbWVtOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihkZXYtPm1lbV9zdGFydCwgZGV2LT5tZW1fZW5kIC0gZGV2LT5tZW1fc3RhcnQgKyAxKTsKK2Vycl9mcmVlX2lycToKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZXR1cm4gLUVJTzsKK30KKworCisvKgorICogRG8gYSBoYXJkd2FyZSByZXNldCBvbiB0aGUgY2FyZCwgYW5kIHNldCB1cCBuZWNlc3NhcnkgcmVnaXN0ZXJzLgorICoKKyAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhcyBsaXR0bGUgYXMgcG9zc2libGUsIGJlY2F1c2UgaXQgZGlzcnVwdHMgdGhlCisgKiB0b2tlbiBvbiB0aGUgbmV0d29yayAoY2F1c2VzIGEgUkVDT04pIGFuZCByZXF1aXJlcyBhIHNpZ25pZmljYW50IGRlbGF5LgorICoKKyAqIEhvd2V2ZXIsIGl0IGRvZXMgbWFrZSBzdXJlIHRoZSBjYXJkIGlzIGluIGEgZGVmaW5lZCBzdGF0ZS4KKyAqLworc3RhdGljIGludCBhcmNyaW1pX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWFsbHlfcmVzZXQpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+bWVtX3N0YXJ0ICsgMHg4MDA7CisKKwlCVUdNU0coRF9JTklULCAiUmVzZXR0aW5nICVzIChzdGF0dXM9JTAyWGgpXG4iLCBkZXYtPm5hbWUsIEFTVEFUVVMoKSk7CisKKwlpZiAocmVhbGx5X3Jlc2V0KSB7CisJCXdyaXRlYihURVNUdmFsdWUsIGlvYWRkciAtIDB4ODAwKTsJLyogZmFrZSByZXNldCAqLworCQlyZXR1cm4gMDsKKwl9CisJQUNPTU1BTkQoQ0ZMQUdTY21kIHwgUkVTRVRjbGVhcik7CS8qIGNsZWFyIGZsYWdzICYgZW5kIHJlc2V0ICovCisJQUNPTU1BTkQoQ0ZMQUdTY21kIHwgQ09ORklHY2xlYXIpOworCisJLyogZW5hYmxlIGV4dGVuZGVkICg1MTItYnl0ZSkgcGFja2V0cyAqLworCUFDT01NQU5EKENPTkZJR2NtZCB8IEVYVGNvbmYpOworCisJLyogZG9uZSEgIHJldHVybiBzdWNjZXNzLiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhcmNyaW1pX3NldG1hc2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1hc2spCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+bWVtX3N0YXJ0ICsgMHg4MDA7CisKKwlBSU5UTUFTSyhtYXNrKTsKK30KKworc3RhdGljIGludCBhcmNyaW1pX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbHAtPm1lbV9zdGFydCArIDB4ODAwOworCisJcmV0dXJuIEFTVEFUVVMoKTsKK30KKworc3RhdGljIHZvaWQgYXJjcmltaV9jb21tYW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjbWQpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+bWVtX3N0YXJ0ICsgMHg4MDA7CisKKwlBQ09NTUFORChjbWQpOworfQorCitzdGF0aWMgdm9pZCBhcmNyaW1pX2NvcHlfdG9fY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmbnVtLCBpbnQgb2Zmc2V0LAorCQkJCSB2b2lkICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKm1lbWFkZHIgPSBscC0+bWVtX3N0YXJ0ICsgMHg4MDAgKyBidWZudW0gKiA1MTIgKyBvZmZzZXQ7CisJVElNRSgibWVtY3B5X3RvaW8iLCBjb3VudCwgbWVtY3B5X3RvaW8obWVtYWRkciwgYnVmLCBjb3VudCkpOworfQorCisKK3N0YXRpYyB2b2lkIGFyY3JpbWlfY29weV9mcm9tX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSwgaW50IG9mZnNldCwKKwkJCQkgICB2b2lkICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKm1lbWFkZHIgPSBscC0+bWVtX3N0YXJ0ICsgMHg4MDAgKyBidWZudW0gKiA1MTIgKyBvZmZzZXQ7CisJVElNRSgibWVtY3B5X2Zyb21pbyIsIGNvdW50LCBtZW1jcHlfZnJvbWlvKGJ1ZiwgbWVtYWRkciwgY291bnQpKTsKK30KKworc3RhdGljIGludCBub2RlOworc3RhdGljIGludCBpbzsJCQkvKiB1c2UgdGhlIGluc21vZCBpbz0gaXJxPSBub2RlPSBvcHRpb25zICovCitzdGF0aWMgaW50IGlycTsKK3N0YXRpYyBjaGFyIGRldmljZVs5XTsJCS8qIHVzZSBlZy4gZGV2aWNlPWFyYzEgdG8gY2hhbmdlIG5hbWUgKi8KKworbW9kdWxlX3BhcmFtKG5vZGUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX3N0cmluZyhkZXZpY2UsIGRldmljZSwgc2l6ZW9mKGRldmljZSksIDApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKm15X2RldjsKKworc3RhdGljIGludCBfX2luaXQgYXJjX3JpbWlfaW5pdCh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlkZXYgPSBhbGxvY19hcmNkZXYoZGV2aWNlKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAobm9kZSAmJiBub2RlICE9IDB4ZmYpCisJCWRldi0+ZGV2X2FkZHJbMF0gPSBub2RlOworCisJZGV2LT5tZW1fc3RhcnQgPSBpbzsKKwlkZXYtPmlycSA9IGlycTsKKwlpZiAoZGV2LT5pcnEgPT0gMikKKwkJZGV2LT5pcnEgPSA5OworCisJaWYgKGFyY3JpbWlfcHJvYmUoZGV2KSkgeworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlteV9kZXYgPSBkZXY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhcmNfcmltaV9leGl0KHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG15X2RldjsKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaW91bm1hcChscC0+bWVtX3N0YXJ0KTsKKwlyZWxlYXNlX21lbV9yZWdpb24oZGV2LT5tZW1fc3RhcnQsIGRldi0+bWVtX2VuZCAtIGRldi0+bWVtX3N0YXJ0ICsgMSk7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJZnJlZV9uZXRkZXYoZGV2KTsKK30KKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IGFyY3JpbWlfc2V0dXAoY2hhciAqcykKK3sKKwlpbnQgaW50c1s4XTsKKwlzID0gZ2V0X29wdGlvbnMocywgOCwgaW50cyk7CisJaWYgKCFpbnRzWzBdKQorCQlyZXR1cm4gMTsKKwlzd2l0Y2ggKGludHNbMF0pIHsKKwlkZWZhdWx0OgkJLyogRVJST1IgKi8KKwkJcHJpbnRrKCJhcmNyaW1pOiBUb28gbWFueSBhcmd1bWVudHMuXG4iKTsKKwljYXNlIDM6CQkvKiBOb2RlIElEICovCisJCW5vZGUgPSBpbnRzWzNdOworCWNhc2UgMjoJCS8qIElSUSAqLworCQlpcnEgPSBpbnRzWzJdOworCWNhc2UgMToJCS8qIElPIGFkZHJlc3MgKi8KKwkJaW8gPSBpbnRzWzFdOworCX0KKwlpZiAoKnMpCisJCXNucHJpbnRmKGRldmljZSwgc2l6ZW9mKGRldmljZSksICIlcyIsIHMpOworCXJldHVybiAxOworfQorX19zZXR1cCgiYXJjcmltaT0iLCBhcmNyaW1pX3NldHVwKTsKKyNlbmRpZgkJCQkvKiBNT0RVTEUgKi8KKworbW9kdWxlX2luaXQoYXJjX3JpbWlfaW5pdCkKK21vZHVsZV9leGl0KGFyY19yaW1pX2V4aXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcmNuZXQvYXJjbmV0LmMgYi9kcml2ZXJzL25ldC9hcmNuZXQvYXJjbmV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5ZjY5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9hcmNuZXQuYwpAQCAtMCwwICsxLDExMDIgQEAKKy8qCisgKiBMaW51eCBBUkNuZXQgZHJpdmVyIC0gZGV2aWNlLWluZGVwZW5kZW50IHJvdXRpbmVzCisgKiAKKyAqIFdyaXR0ZW4gMTk5NyBieSBEYXZpZCBXb29kaG91c2UuCisgKiBXcml0dGVuIDE5OTQtMTk5OSBieSBBdmVyeSBQZW5uYXJ1bi4KKyAqIFdyaXR0ZW4gMTk5OS0yMDAwIGJ5IE1hcnRpbiBNYXJlcyA8bWpAdWN3LmN6Pi4KKyAqIERlcml2ZWQgZnJvbSBza2VsZXRvbi5jIGJ5IERvbmFsZCBCZWNrZXIuCisgKgorICogU3BlY2lhbCB0aGFua3MgdG8gQ29udGVtcG9yYXJ5IENvbnRyb2xzLCBJbmMuICh3d3cuY2NvbnRyb2xzLmNvbSkKKyAqICBmb3Igc3BvbnNvcmluZyB0aGUgZnVydGhlciBkZXZlbG9wbWVudCBvZiB0aGlzIGRyaXZlci4KKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlIG9yaWdpbmFsIGNvcHlyaWdodCB3YXMgYXMgZm9sbG93czoKKyAqCisgKiBza2VsZXRvbi5jIFdyaXR0ZW4gMTk5MyBieSBEb25hbGQgQmVja2VyLgorICogQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICogRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4gIFRoaXMgc29mdHdhcmUgbWF5IG9ubHkgYmUgdXNlZAorICogYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBtb2RpZmllZCBieSBTUkMsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogVGhlIGNoYW5nZSBsb2cgaXMgbm93IGluIGEgZmlsZSBjYWxsZWQgQ2hhbmdlTG9nIGluIHRoaXMgZGlyZWN0b3J5LgorICoKKyAqIFNvdXJjZXM6CisgKiAgLSBDcnlud3IgYXJjbmV0LmNvbS9hcmNldGhlci5jb20gcGFja2V0IGRyaXZlcnMuCisgKiAgLSBhcmNuZXQuYyB2MC4wMCBkYXRlZCAxLzEvOTQgYW5kIGFwcGFyZW50bHkgYnkgCisgKiAgICAgRG9uYWxkIEJlY2tlciAtIGl0IGRpZG4ndCB3b3JrIDopCisgKiAgLSBza2VsZXRvbi5jIHYwLjA1IGRhdGVkIDExLzE2LzkzIGJ5IERvbmFsZCBCZWNrZXIKKyAqICAgICAoZnJvbSBMaW51eCBLZXJuZWwgMS4xLjQ1KQorICogIC0gUkZDJ3MgMTIwMSBhbmQgMTA1MSAtIHJlOiBUQ1AvSVAgb3ZlciBBUkNuZXQKKyAqICAtIFRoZSBvZmZpY2lhbCBBUkNuZXQgQ09NOTAyNiBkYXRhIHNoZWV0cyAoISkgdGhhbmtzIHRvCisgKiAgICAgS2VuIENvcm5ldGV0IDxrY29ybmV0ZUBueXgxMC5jcy5kdS5lZHU+CisgKiAgLSBUaGUgb2ZmaWNpYWwgQVJDbmV0IENPTTIwMDIwIGRhdGEgc2hlZXRzLgorICogIC0gSW5mb3JtYXRpb24gb24gc29tZSBtb3JlIG9ic2N1cmUgQVJDbmV0IGNvbnRyb2xsZXIgY2hpcHMsIHRoYW5rcworICogICAgIHRvIHRoZSBuaWNlIHBlb3BsZSBhdCBTTVNDLgorICogIC0gbmV0L2luZXQvZXRoLmMgKGZyb20ga2VybmVsIDEuMS41MCkgZm9yIGhlYWRlci1idWlsZGluZyBpbmZvLgorICogIC0gQWx0ZXJuYXRlIExpbnV4IEFSQ25ldCBzb3VyY2UgYnkgVi5TaGVyZ2luIDx2c2hlckBzYW8uc3RhdnJvcG9sLnN1PgorICogIC0gVGV4dHVhbCBpbmZvcm1hdGlvbiBhbmQgbW9yZSBhbHRlcm5hdGUgc291cmNlIGZyb20gSm9hY2hpbSBLb2VuaWcKKyAqICAgICA8am9qb0ByZXBhcy5kZT4KKyAqLworCisjZGVmaW5lIFZFUlNJT04gImFyY25ldDogdjMuOTMgQkVUQSAyMDAwLzA0LzI5IC0gYnkgQXZlcnkgUGVubmFydW4gZXQgYWwuXG4iCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9hcmNkZXZpY2UuaD4KKworLyogImRvIG5vdGhpbmciIGZ1bmN0aW9ucyBmb3IgcHJvdG9jb2wgZHJpdmVycyAqLworc3RhdGljIHZvaWQgbnVsbF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmbnVtLAorCQkgICAgc3RydWN0IGFyY2hkciAqcGt0aGRyLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyBpbnQgbnVsbF9idWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwgdWludDhfdCBkYWRkcik7CitzdGF0aWMgaW50IG51bGxfcHJlcGFyZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgYXJjaGRyICpwa3QsCisJCQkgICBpbnQgbGVuZ3RoLCBpbnQgYnVmbnVtKTsKKworCisvKgorICogb25lIEFyY1Byb3RvIHBlciBwb3NzaWJsZSBwcm90byBJRC4gIE5vbmUgb2YgdGhlIGVsZW1lbnRzIG9mCisgKiBhcmNfcHJvdG9fbWFwIGFyZSBhbGxvd2VkIHRvIGJlIE5VTEw7IHRoZXkgd2lsbCBnZXQgc2V0IHRvCisgKiBhcmNfcHJvdG9fZGVmYXVsdCBpbnN0ZWFkLiAgSXQgYWxzbyBtdXN0IG5vdCBiZSBOVUxMOyBpZiB5b3Ugd291bGQgbGlrZQorICogdG8gc2V0IGl0IHRvIE5VTEwsIHNldCBpdCB0byAmYXJjX3Byb3RvX251bGwgaW5zdGVhZC4KKyAqLworIHN0cnVjdCBBcmNQcm90byAqYXJjX3Byb3RvX21hcFsyNTZdLCAqYXJjX3Byb3RvX2RlZmF1bHQsCisgICAqYXJjX2JjYXN0X3Byb3RvLCAqYXJjX3Jhd19wcm90bzsKKworc3RydWN0IEFyY1Byb3RvIGFyY19wcm90b19udWxsID0KK3sKKwkuc3VmZml4CQk9ICc/JywKKwkubXR1CQk9IFhNVFUsCisJLmlzX2lwICAgICAgICAgID0gMCwKKwkucngJCT0gbnVsbF9yeCwKKwkuYnVpbGRfaGVhZGVyCT0gbnVsbF9idWlsZF9oZWFkZXIsCisJLnByZXBhcmVfdHgJPSBudWxsX3ByZXBhcmVfdHgsCisJLmNvbnRpbnVlX3R4ICAgID0gTlVMTCwKKwkuYWNrX3R4ICAgICAgICAgPSBOVUxMCit9OworCisvKiBFeHBvcnRlZCBmdW5jdGlvbiBwcm90b3R5cGVzICovCitpbnQgYXJjbmV0X2RlYnVnID0gQVJDTkVUX0RFQlVHOworCitFWFBPUlRfU1lNQk9MKGFyY19wcm90b19tYXApOworRVhQT1JUX1NZTUJPTChhcmNfcHJvdG9fZGVmYXVsdCk7CitFWFBPUlRfU1lNQk9MKGFyY19iY2FzdF9wcm90byk7CitFWFBPUlRfU1lNQk9MKGFyY19yYXdfcHJvdG8pOworRVhQT1JUX1NZTUJPTChhcmNfcHJvdG9fbnVsbCk7CitFWFBPUlRfU1lNQk9MKGFyY25ldF91bnJlZ2lzdGVyX3Byb3RvKTsKK0VYUE9SVF9TWU1CT0woYXJjbmV0X2RlYnVnKTsKK0VYUE9SVF9TWU1CT0woYWxsb2NfYXJjZGV2KTsKK0VYUE9SVF9TWU1CT0woYXJjbmV0X2ludGVycnVwdCk7CisKKy8qIEludGVybmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBpbnQgYXJjbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGFyY25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYXJjbmV0X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYXJjbmV0X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGFyY25ldF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSB1bnNpZ25lZCBzaG9ydCB0eXBlLCB2b2lkICpkYWRkciwgdm9pZCAqc2FkZHIsCisJCQkgdW5zaWduZWQgbGVuKTsKK3N0YXRpYyBpbnQgYXJjbmV0X3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphcmNuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBnb190eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGludCBkZWJ1ZyA9IEFSQ05FVF9ERUJVRzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBfX2luaXQgYXJjbmV0X2luaXQodm9pZCkKK3sKKwlpbnQgY291bnQ7CisKKwlhcmNuZXRfZGVidWcgPSBkZWJ1ZzsKKworCXByaW50ayhWRVJTSU9OKTsKKworI2lmZGVmIEFMUEhBX1dBUk5JTkcKKwlCVUdMVkwoRF9FWFRSQSkgeworCQlwcmludGsoImFyY25ldDogKioqXG4iCisJCSJhcmNuZXQ6ICogUmVhZCBhcmNuZXQudHh0IGZvciBpbXBvcnRhbnQgcmVsZWFzZSBub3RlcyFcbiIKKwkJICAgICAgICJhcmNuZXQ6ICpcbiIKKwkJICAgICAgICJhcmNuZXQ6ICogVGhpcyBpcyBhbiBBTFBIQSB2ZXJzaW9uISAoTGFzdCBzdGFibGUgcmVsZWFzZTogdjMuMDIpICBFLW1haWxcbiIKKwkJICAgICAgICJhcmNuZXQ6ICogbWUgaWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucywgY29tbWVudHMsIG9yIGJ1ZyByZXBvcnRzLlxuIgorCQkgICAgICAgImFyY25ldDogKioqXG4iKTsKKwl9CisjZW5kaWYKKworCS8qIGluaXRpYWxpemUgdGhlIHByb3RvY29sIG1hcCAqLworCWFyY19yYXdfcHJvdG8gPSBhcmNfcHJvdG9fZGVmYXVsdCA9IGFyY19iY2FzdF9wcm90byA9ICZhcmNfcHJvdG9fbnVsbDsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAyNTY7IGNvdW50KyspCisJCWFyY19wcm90b19tYXBbY291bnRdID0gYXJjX3Byb3RvX2RlZmF1bHQ7CisKKwlCVUdMVkwoRF9EVVJJTkcpCisJICAgIHByaW50aygiYXJjbmV0OiBzdHJ1Y3Qgc2l6ZXM6ICVaZCAlWmQgJVpkICVaZCAlWmRcbiIsCisJCSBzaXplb2Yoc3RydWN0IGFyY19oYXJkd2FyZSksIHNpemVvZihzdHJ1Y3QgYXJjX3JmYzEyMDEpLAorCQlzaXplb2Yoc3RydWN0IGFyY19yZmMxMDUxKSwgc2l6ZW9mKHN0cnVjdCBhcmNfZXRoX2VuY2FwKSwKKwkJICAgc2l6ZW9mKHN0cnVjdCBhcmNoZHIpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXJjbmV0X2V4aXQodm9pZCkKK3sKK30KKworbW9kdWxlX2luaXQoYXJjbmV0X2luaXQpOworbW9kdWxlX2V4aXQoYXJjbmV0X2V4aXQpOworCisvKgorICogRHVtcCB0aGUgY29udGVudHMgb2YgYW4gc2tfYnVmZgorICovCisjaWYgQVJDTkVUX0RFQlVHX01BWCAmIERfU0tCCit2b2lkIGFyY25ldF9kdW1wX3NrYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsIGNoYXIgKmRlc2MpCit7CisJaW50IGk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJTZzOiBza2IgZHVtcCAoJXMpIGZvbGxvd3M6IiwgZGV2LT5uYW1lLCBkZXNjKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2tiLT5sZW47IGkrKykgeworCQlpZiAoaSAlIDE2ID09IDApCisJCQlwcmludGsoIlxuIiBLRVJOX0RFQlVHICJbJTA0WF0gIiwgaSk7CisJCXByaW50aygiJTAyWCAiLCAoKHVfY2hhciAqKSBza2ItPmRhdGEpW2ldKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorCitFWFBPUlRfU1lNQk9MKGFyY25ldF9kdW1wX3NrYik7CisjZW5kaWYKKworCisvKgorICogRHVtcCB0aGUgY29udGVudHMgb2YgYW4gQVJDbmV0IGJ1ZmZlcgorICovCisjaWYgKEFSQ05FVF9ERUJVR19NQVggJiAoRF9SWCB8IERfVFgpKQordm9pZCBhcmNuZXRfZHVtcF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSwgY2hhciAqZGVzYywKKwkJCWludCB0YWtlX2FyY25ldF9sb2NrKQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWludCBpLCBsZW5ndGg7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJc3RhdGljIHVpbnQ4X3QgYnVmWzUxMl07CisKKwkvKiBody5jb3B5X2Zyb21fY2FyZCBleHBlY3RzIElSUSBjb250ZXh0IHNvIHRha2UgdGhlIElSUSBsb2NrCisJICAgdG8ga2VlcCBpdCBzaW5nbGUgdGhyZWFkZWQgKi8KKwlpZih0YWtlX2FyY25ldF9sb2NrKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCWxwLT5ody5jb3B5X2Zyb21fY2FyZChkZXYsIGJ1Zm51bSwgMCwgYnVmLCA1MTIpOworCWlmKHRha2VfYXJjbmV0X2xvY2spCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBpZiB0aGUgb2Zmc2V0WzBdIGJ5dGUgaXMgbm9uemVybywgdGhpcyBpcyBhIDI1Ni1ieXRlIHBhY2tldCAqLworCWxlbmd0aCA9IChidWZbMl0gPyAyNTYgOiA1MTIpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiU2czogcGFja2V0IGR1bXAgKCVzKSBmb2xsb3dzOiIsIGRldi0+bmFtZSwgZGVzYyk7CisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWlmIChpICUgMTYgPT0gMCkKKwkJCXByaW50aygiXG4iIEtFUk5fREVCVUcgIlslMDRYXSAiLCBpKTsKKwkJcHJpbnRrKCIlMDJYICIsIGJ1ZltpXSk7CisJfQorCXByaW50aygiXG4iKTsKKworfQorCitFWFBPUlRfU1lNQk9MKGFyY25ldF9kdW1wX3BhY2tldCk7CisjZW5kaWYKKworCisvKgorICogVW5yZWdpc3RlciBhIHByb3RvY29sIGRyaXZlciBmcm9tIHRoZSBhcmNfcHJvdG9fbWFwLiAgUHJvdG9jb2wgZHJpdmVycworICogYXJlIHJlc3BvbnNpYmxlIGZvciByZWdpc3RlcmluZyB0aGVtc2VsdmVzLCBidXQgdGhlIHVucmVnaXN0ZXIgcm91dGluZQorICogaXMgcHJldHR5IGdlbmVyaWMgc28gd2UnbGwgZG8gaXQgaGVyZS4KKyAqLwordm9pZCBhcmNuZXRfdW5yZWdpc3Rlcl9wcm90byhzdHJ1Y3QgQXJjUHJvdG8gKnByb3RvKQoreworCWludCBjb3VudDsKKworCWlmIChhcmNfcHJvdG9fZGVmYXVsdCA9PSBwcm90bykKKwkJYXJjX3Byb3RvX2RlZmF1bHQgPSAmYXJjX3Byb3RvX251bGw7CisJaWYgKGFyY19iY2FzdF9wcm90byA9PSBwcm90bykKKwkJYXJjX2JjYXN0X3Byb3RvID0gYXJjX3Byb3RvX2RlZmF1bHQ7CisJaWYgKGFyY19yYXdfcHJvdG8gPT0gcHJvdG8pCisJCWFyY19yYXdfcHJvdG8gPSBhcmNfcHJvdG9fZGVmYXVsdDsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDI1NjsgY291bnQrKykgeworCQlpZiAoYXJjX3Byb3RvX21hcFtjb3VudF0gPT0gcHJvdG8pCisJCQlhcmNfcHJvdG9fbWFwW2NvdW50XSA9IGFyY19wcm90b19kZWZhdWx0OworCX0KK30KKworCisvKgorICogQWRkIGEgYnVmZmVyIHRvIHRoZSBxdWV1ZS4gIE9ubHkgdGhlIGludGVycnVwdCBoYW5kbGVyIGlzIGFsbG93ZWQgdG8gZG8KKyAqIHRoaXMsIHVubGVzcyBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4KKyAqIAorICogTm90ZTogd2UgZG9uJ3QgY2hlY2sgZm9yIGEgZnVsbCBxdWV1ZSwgc2luY2UgdGhlcmUgYXJlbid0IGVub3VnaCBidWZmZXJzCisgKiB0byBtb3JlIHRoYW4gZmlsbCBpdC4KKyAqLworc3RhdGljIHZvaWQgcmVsZWFzZV9hcmNidWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSkKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKworCWxwLT5idWZfcXVldWVbbHAtPmZpcnN0X2ZyZWVfYnVmKytdID0gYnVmbnVtOworCWxwLT5maXJzdF9mcmVlX2J1ZiAlPSA1OworCisJQlVHTFZMKERfRFVSSU5HKSB7CisJCUJVR01TRyhEX0RVUklORywgInJlbGVhc2VfYXJjYnVmOiBmcmVlZCAjJWQ7IGJ1ZmZlciBxdWV1ZSBpcyBub3c6ICIsCisJCSAgICAgICBidWZudW0pOworCQlmb3IgKGkgPSBscC0+bmV4dF9idWY7IGkgIT0gbHAtPmZpcnN0X2ZyZWVfYnVmOyBpID0gKGkrMSkgJSA1KQorCQkJQlVHTVNHMihEX0RVUklORywgIiMlZCAiLCBscC0+YnVmX3F1ZXVlW2ldKTsKKwkJQlVHTVNHMihEX0RVUklORywgIlxuIik7CisJfQorfQorCisKKy8qCisgKiBHZXQgYSBidWZmZXIgZnJvbSB0aGUgcXVldWUuICBJZiB0aGlzIHJldHVybnMgLTEsIHRoZXJlIGFyZSBubyBidWZmZXJzCisgKiBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2FyY2J1ZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWludCBidWYgPSAtMSwgaTsKKworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmbHAtPmJ1Zl9sb2NrKSkgeworCQkvKiBhbHJlYWR5IGluIHRoaXMgZnVuY3Rpb24gKi8KKwkJQlVHTVNHKERfTk9STUFMLCAiZ2V0X2FyY2J1Zjogb3ZlcmxhcCAoJWQpIVxuIiwKKwkJICAgICAgIGxwLT5idWZfbG9jay5jb3VudGVyKTsKKwl9CisJZWxzZSB7CQkJLyogd2UgY2FuIGNvbnRpbnVlICovCisJCWlmIChscC0+bmV4dF9idWYgPj0gNSkKKwkJCWxwLT5uZXh0X2J1ZiAtPSA1OworCisJCWlmIChscC0+bmV4dF9idWYgPT0gbHAtPmZpcnN0X2ZyZWVfYnVmKQorCQkJQlVHTVNHKERfTk9STUFMLCAiZ2V0X2FyY2J1ZjogQlVHOiBubyBidWZmZXJzIGFyZSBhdmFpbGFibGU/P1xuIik7CisJCWVsc2UgeworCQkJYnVmID0gbHAtPmJ1Zl9xdWV1ZVtscC0+bmV4dF9idWYrK107CisJCQlscC0+bmV4dF9idWYgJT0gNTsKKwkJfQorCX0KKworCisJQlVHTFZMKERfRFVSSU5HKSB7CisJCUJVR01TRyhEX0RVUklORywgImdldF9hcmNidWY6IGdvdCAjJWQ7IGJ1ZmZlciBxdWV1ZSBpcyBub3c6ICIsIGJ1Zik7CisJCWZvciAoaSA9IGxwLT5uZXh0X2J1ZjsgaSAhPSBscC0+Zmlyc3RfZnJlZV9idWY7IGkgPSAoaSsxKSAlIDUpCisJCQlCVUdNU0cyKERfRFVSSU5HLCAiIyVkICIsIGxwLT5idWZfcXVldWVbaV0pOworCQlCVUdNU0cyKERfRFVSSU5HLCAiXG4iKTsKKwl9CisKKwlhdG9taWNfaW5jKCZscC0+YnVmX2xvY2spOworCXJldHVybiBidWY7Cit9CisKKworc3RhdGljIGludCBjaG9vc2VfbXR1KHZvaWQpCit7CisJaW50IGNvdW50LCBtdHUgPSA2NTUzNTsKKworCS8qIGNob29zZSB0aGUgc21hbGxlc3QgTVRVIG9mIGFsbCBhdmFpbGFibGUgZW5jYXBzICovCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMjU2OyBjb3VudCsrKSB7CisJCWlmIChhcmNfcHJvdG9fbWFwW2NvdW50XSAhPSAmYXJjX3Byb3RvX251bGwKKwkJICAgICYmIGFyY19wcm90b19tYXBbY291bnRdLT5tdHUgPCBtdHUpIHsKKwkJCW10dSA9IGFyY19wcm90b19tYXBbY291bnRdLT5tdHU7CisJCX0KKwl9CisKKwlyZXR1cm4gbXR1ID09IDY1NTM1ID8gWE1UVSA6IG10dTsKK30KKworCisvKiBTZXR1cCBhIHN0cnVjdCBkZXZpY2UgZm9yIEFSQ25ldC4gKi8KK3N0YXRpYyB2b2lkIGFyY2Rldl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRldi0+dHlwZSA9IEFSUEhSRF9BUkNORVQ7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBzaXplb2Yoc3RydWN0IGFyY2hkcik7CisJZGV2LT5tdHUgPSBjaG9vc2VfbXR1KCk7CisKKwlkZXYtPmFkZHJfbGVuID0gQVJDTkVUX0FMRU47CisJZGV2LT50eF9xdWV1ZV9sZW4gPSAxMDA7CisJZGV2LT5icm9hZGNhc3RbMF0gPSAweDAwOwkvKiBmb3IgdXMsIGJyb2FkY2FzdHMgYXJlIGFkZHJlc3MgMCAqLworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCisJLyogTmV3LXN0eWxlIGZsYWdzLiAqLworCWRldi0+ZmxhZ3MgPSBJRkZfQlJPQURDQVNUOworCisJLyoKKwkgKiBQdXQgaW4gdGhpcyBzdHVmZiBoZXJlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIGV4cG9ydCB0aGUgc3ltYm9scyB0bworCSAqIHRoZSBjaGlwc2V0IGRyaXZlcnMuCisJICovCisJZGV2LT5vcGVuID0gYXJjbmV0X29wZW47CisJZGV2LT5zdG9wID0gYXJjbmV0X2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gYXJjbmV0X3NlbmRfcGFja2V0OworCWRldi0+dHhfdGltZW91dCA9IGFyY25ldF90aW1lb3V0OworCWRldi0+Z2V0X3N0YXRzID0gYXJjbmV0X2dldF9zdGF0czsKKwlkZXYtPmhhcmRfaGVhZGVyID0gYXJjbmV0X2hlYWRlcjsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyID0gYXJjbmV0X3JlYnVpbGRfaGVhZGVyOworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfYXJjZGV2KGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCWRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IGFyY25ldF9sb2NhbCksCisJCQkgICBuYW1lICYmICpuYW1lID8gbmFtZSA6ICJhcmMlZCIsIGFyY2Rldl9zZXR1cCk7CisJaWYoZGV2KSB7CisJCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gKHN0cnVjdCBhcmNuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCQlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCX0KKworCXJldHVybiBkZXY7Cit9CisKKy8qCisgKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiAgVGhpcyBpcyBjYWxsZWQgc29tZXRpbWUgYWZ0ZXIgYm9vdGluZyB3aGVuCisgKiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KKyAqCisgKiBUaGlzIHJvdXRpbmUgc2hvdWxkIHNldCBldmVyeXRoaW5nIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuIHJlZ2lzdGVycworICogdGhhdCAic2hvdWxkIiBvbmx5IG5lZWQgdG8gYmUgc2V0IG9uY2UgYXQgYm9vdCwgc28gdGhhdCB0aGVyZSBpcworICogbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAqLworc3RhdGljIGludCBhcmNuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWludCBjb3VudCwgbmV3bXR1LCBlcnJvcjsKKworCUJVR01TRyhEX0lOSVQsIm9wZW5lZC4iKTsKKworCWlmICghdHJ5X21vZHVsZV9nZXQobHAtPmh3Lm93bmVyKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlCVUdMVkwoRF9QUk9UTykgeworCQlpbnQgY291bnQ7CisJCUJVR01TRyhEX1BST1RPLCAicHJvdG9jb2wgbWFwIChkZWZhdWx0IGlzICclYycpOiAiLAorCQkgICAgICAgYXJjX3Byb3RvX2RlZmF1bHQtPnN1ZmZpeCk7CisJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDI1NjsgY291bnQrKykKKwkJCUJVR01TRzIoRF9QUk9UTywgIiVjIiwgYXJjX3Byb3RvX21hcFtjb3VudF0tPnN1ZmZpeCk7CisJCUJVR01TRzIoRF9QUk9UTywgIlxuIik7CisJfQorCisKKwlCVUdNU0coRF9JTklULCAiYXJjbmV0X29wZW46IHJlc2V0dGluZyBjYXJkLlxuIik7CisKKwkvKiB0cnkgdG8gcHV0IHRoZSBjYXJkIGluIGEgZGVmaW5lZCBzdGF0ZSAtIGlmIGl0IGZhaWxzIHRoZSBmaXJzdAorCSAqIHRpbWUsIGFjdHVhbGx5IHJlc2V0IGl0LgorCSAqLworCWVycm9yID0gLUVOT0RFVjsKKwlpZiAoQVJDUkVTRVQoMCkgJiYgQVJDUkVTRVQoMSkpCisJCWdvdG8gb3V0X21vZHVsZV9wdXQ7CisKKwluZXdtdHUgPSBjaG9vc2VfbXR1KCk7CisJaWYgKG5ld210dSA8IGRldi0+bXR1KQorCQlkZXYtPm10dSA9IG5ld210dTsKKworCUJVR01TRyhEX0lOSVQsICJhcmNuZXRfb3BlbjogbXR1OiAlZC5cbiIsIGRldi0+bXR1KTsKKworCS8qIGF1dG9kZXRlY3QgdGhlIGVuY2Fwc3VsYXRpb24gZm9yIGVhY2ggaG9zdC4gKi8KKwltZW1zZXQobHAtPmRlZmF1bHRfcHJvdG8sIDAsIHNpemVvZihscC0+ZGVmYXVsdF9wcm90bykpOworCisJLyogdGhlIGJyb2FkY2FzdCBhZGRyZXNzIGlzIHNwZWNpYWwgLSB1c2UgdGhlICdiY2FzdCcgcHJvdG9jb2wgKi8KKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAyNTY7IGNvdW50KyspIHsKKwkJaWYgKGFyY19wcm90b19tYXBbY291bnRdID09IGFyY19iY2FzdF9wcm90bykgeworCQkJbHAtPmRlZmF1bHRfcHJvdG9bMF0gPSBjb3VudDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogaW5pdGlhbGl6ZSBidWZmZXJzICovCisJYXRvbWljX3NldCgmbHAtPmJ1Zl9sb2NrLCAxKTsKKworCWxwLT5uZXh0X2J1ZiA9IGxwLT5maXJzdF9mcmVlX2J1ZiA9IDA7CisJcmVsZWFzZV9hcmNidWYoZGV2LCAwKTsKKwlyZWxlYXNlX2FyY2J1ZihkZXYsIDEpOworCXJlbGVhc2VfYXJjYnVmKGRldiwgMik7CisJcmVsZWFzZV9hcmNidWYoZGV2LCAzKTsKKwlscC0+Y3VyX3R4ID0gbHAtPm5leHRfdHggPSAtMTsKKwlscC0+Y3VyX3J4ID0gLTE7CisKKwlscC0+cmZjMTIwMS5zZXF1ZW5jZSA9IDE7CisKKwkvKiBicmluZyB1cCB0aGUgaGFyZHdhcmUgZHJpdmVyICovCisJaWYgKGxwLT5ody5vcGVuKQorCQlscC0+aHcub3BlbihkZXYpOworCisJaWYgKGRldi0+ZGV2X2FkZHJbMF0gPT0gMCkKKwkJQlVHTVNHKERfTk9STUFMLCAiV0FSTklORyEgIFN0YXRpb24gYWRkcmVzcyAwMCBpcyByZXNlcnZlZCAiCisJCSAgICAgICAiZm9yIGJyb2FkY2FzdHMhXG4iKTsKKwllbHNlIGlmIChkZXYtPmRldl9hZGRyWzBdID09IDI1NSkKKwkJQlVHTVNHKERfTk9STUFMLCAiV0FSTklORyEgIFN0YXRpb24gYWRkcmVzcyBGRiBtYXkgY29uZnVzZSAiCisJCSAgICAgICAiRE9TIG5ldHdvcmtpbmcgcHJvZ3JhbXMhXG4iKTsKKworCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18pOworCWlmIChBU1RBVFVTKCkgJiBSRVNFVGZsYWcpIHsKKwkgIAlCVUdNU0coRF9ERUJVRywgIiVzOiAlZDogJXNcbiIsX19GSUxFX18sX19MSU5FX18sX19GVU5DVElPTl9fKTsKKwkJQUNPTU1BTkQoQ0ZMQUdTY21kIHwgUkVTRVRjbGVhcik7CisJfQorCisKKwlCVUdNU0coRF9ERUJVRywgIiVzOiAlZDogJXNcbiIsX19GSUxFX18sX19MSU5FX18sX19GVU5DVElPTl9fKTsKKwkvKiBtYWtlIHN1cmUgd2UncmUgcmVhZHkgdG8gcmVjZWl2ZSBJUlEncy4gKi8KKwlBSU5UTUFTSygwKTsKKwl1ZGVsYXkoMSk7CQkvKiBnaXZlIGl0IHRpbWUgdG8gc2V0IHRoZSBtYXNrIGJlZm9yZQorCQkJCSAqIHdlIHJlc2V0IGl0IGFnYWluLiAobWF5IG5vdCBldmVuIGJlCisJCQkJICogbmVjZXNzYXJ5KQorCQkJCSAqLworCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18pOworCWxwLT5pbnRtYXNrID0gTk9SWGZsYWcgfCBSRUNPTmZsYWc7CisJQUlOVE1BU0sobHAtPmludG1hc2spOworCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18pOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworCisgb3V0X21vZHVsZV9wdXQ6CisJbW9kdWxlX3B1dChscC0+aHcub3duZXIpOworCXJldHVybiBlcnJvcjsKK30KKworCisvKiBUaGUgaW52ZXJzZSByb3V0aW5lIHRvIGFyY25ldF9vcGVuIC0gc2h1dHMgZG93biB0aGUgY2FyZC4gKi8KK3N0YXRpYyBpbnQgYXJjbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBmbHVzaCBUWCBhbmQgZGlzYWJsZSBSWCAqLworCUFJTlRNQVNLKDApOworCUFDT01NQU5EKE5PVFhjbWQpOwkvKiBzdG9wIHRyYW5zbWl0ICovCisJQUNPTU1BTkQoTk9SWGNtZCk7CS8qIGRpc2FibGUgcmVjZWl2ZSAqLworCW1kZWxheSgxKTsKKworCS8qIHNodXQgZG93biB0aGUgY2FyZCAqLworCWxwLT5ody5jbG9zZShkZXYpOworCW1vZHVsZV9wdXQobHAtPmh3Lm93bmVyKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFyY25ldF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSB1bnNpZ25lZCBzaG9ydCB0eXBlLCB2b2lkICpkYWRkciwgdm9pZCAqc2FkZHIsCisJCQkgdW5zaWduZWQgbGVuKQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXVpbnQ4X3QgX2RhZGRyLCBwcm90b19udW07CisJc3RydWN0IEFyY1Byb3RvICpwcm90bzsKKworCUJVR01TRyhEX0RVUklORywKKwkgICAgImNyZWF0ZSBoZWFkZXIgZnJvbSAlZCB0byAlZDsgcHJvdG9jb2wgJWQgKCVYaCk7IHNpemUgJXUuXG4iLAorCSAgICAgICBzYWRkciA/ICoodWludDhfdCAqKSBzYWRkciA6IC0xLAorCSAgICAgICBkYWRkciA/ICoodWludDhfdCAqKSBkYWRkciA6IC0xLAorCSAgICAgICB0eXBlLCB0eXBlLCBsZW4pOworCisJaWYgKHNrYi0+bGVuIT0wICYmIGxlbiAhPSBza2ItPmxlbikKKwkJQlVHTVNHKERfTk9STUFMLCAiYXJjbmV0X2hlYWRlcjogWWlrZXMhICBza2ItPmxlbiglZCkgIT0gbGVuKCVkKSFcbiIsCisJCSAgICAgICBza2ItPmxlbiwgbGVuKTsKKworCisgIAkvKiBUeXBlIGlzIGhvc3Qgb3JkZXIgLSA/ICovCisgIAlpZih0eXBlID09IEVUSF9QX0FSQ05FVCkgeworICAJCXByb3RvID0gYXJjX3Jhd19wcm90bzsKKyAgCQlCVUdNU0coRF9ERUJVRywgImFyY19yYXdfcHJvdG8gdXNlZC4gcHJvdG89JyVjJ1xuIixwcm90by0+c3VmZml4KTsKKyAgCQlfZGFkZHIgPSBkYWRkciA/ICoodWludDhfdCAqKSBkYWRkciA6IDA7CisgIAl9CisJZWxzZSBpZiAoIWRhZGRyKSB7CisJCS8qCisJCSAqIGlmIHRoZSBkZXN0IGFkZHIgaXNuJ3QgcHJvdmlkZWQsIHdlIGNhbid0IGNob29zZSBhbiBlbmNhcHN1bGF0aW9uIQorCQkgKiBTdG9yZSB0aGUgcGFja2V0IHR5cGUgKGVnLiBFVEhfUF9JUCkgZm9yIG5vdywgYW5kIHdlJ2xsIHB1c2ggb24gYQorCQkgKiByZWFsIGhlYWRlciB3aGVuIHdlIGRvIHJlYnVpbGRfaGVhZGVyLgorCQkgKi8KKwkJKih1aW50MTZfdCAqKSBza2JfcHVzaChza2IsIDIpID0gdHlwZTsKKwkJaWYgKHNrYi0+bmgucmF3IC0gc2tiLT5tYWMucmF3ICE9IDIpCisJCQlCVUdNU0coRF9OT1JNQUwsICJhcmNuZXRfaGVhZGVyOiBZaWtlcyEgIGRpZmYgKCVkKSBpcyBub3QgMiFcbiIsCisJCQkgICAgICAgKGludCkoc2tiLT5uaC5yYXcgLSBza2ItPm1hYy5yYXcpKTsKKwkJcmV0dXJuIC0yOwkvKiByZXR1cm4gZXJyb3IgLS0gY2FuJ3QgdHJhbnNtaXQgeWV0ISAqLworCX0KKwllbHNlIHsKKwkJLyogb3RoZXJ3aXNlLCB3ZSBjYW4ganVzdCBhZGQgdGhlIGhlYWRlciBhcyB1c3VhbC4gKi8KKwkJX2RhZGRyID0gKih1aW50OF90ICopIGRhZGRyOworCQlwcm90b19udW0gPSBscC0+ZGVmYXVsdF9wcm90b1tfZGFkZHJdOworCQlwcm90byA9IGFyY19wcm90b19tYXBbcHJvdG9fbnVtXTsKKwkJQlVHTVNHKERfRFVSSU5HLCAiYnVpbGRpbmcgaGVhZGVyIGZvciAlMDJYaCB1c2luZyBwcm90b2NvbCAnJWMnXG4iLAorCQkgICAgICAgcHJvdG9fbnVtLCBwcm90by0+c3VmZml4KTsKKwkJaWYgKHByb3RvID09ICZhcmNfcHJvdG9fbnVsbCAmJiBhcmNfYmNhc3RfcHJvdG8gIT0gcHJvdG8pIHsKKwkJCUJVR01TRyhEX0RVUklORywgImFjdHVhbGx5LCBsZXQncyB1c2UgJyVjJyBpbnN0ZWFkLlxuIiwKKwkJCSAgICAgICBhcmNfYmNhc3RfcHJvdG8tPnN1ZmZpeCk7CisJCQlwcm90byA9IGFyY19iY2FzdF9wcm90bzsKKwkJfQorCX0KKwlyZXR1cm4gcHJvdG8tPmJ1aWxkX2hlYWRlcihza2IsIGRldiwgdHlwZSwgX2RhZGRyKTsKK30KKworCisvKiAKKyAqIFJlYnVpbGQgdGhlIEFSQ25ldCBoYXJkIGhlYWRlci4gVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYW4gQVJQIChvciBpbiB0aGUKKyAqIGZ1dHVyZSBvdGhlciBhZGRyZXNzIHJlc29sdXRpb24pIGhhcyBjb21wbGV0ZWQgb24gdGhpcyBza19idWZmLiBXZSBub3cKKyAqIGxldCBBUlAgZmlsbCBpbiB0aGUgZGVzdGluYXRpb24gZmllbGQuCisgKi8KK3N0YXRpYyBpbnQgYXJjbmV0X3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWludCBzdGF0dXMgPSAwOwkJLyogZGVmYXVsdCBpcyBmYWlsdXJlICovCisJdW5zaWduZWQgc2hvcnQgdHlwZTsKKwl1aW50OF90IGRhZGRyPTA7CisJc3RydWN0IEFyY1Byb3RvICpwcm90bzsKKworCWlmIChza2ItPm5oLnJhdyAtIHNrYi0+bWFjLnJhdyAhPSAyKSB7CisJCUJVR01TRyhEX05PUk1BTCwKKwkJICAgICAicmVidWlsZF9oZWFkZXI6IHNob3VsZG4ndCBiZSBoZXJlISAoaGRyc2l6ZT0lZClcbiIsCisJCSAgICAgKGludCkoc2tiLT5uaC5yYXcgLSBza2ItPm1hYy5yYXcpKTsKKwkJcmV0dXJuIDA7CisJfQorCXR5cGUgPSAqKHVpbnQxNl90ICopIHNrYl9wdWxsKHNrYiwgMik7CisJQlVHTVNHKERfRFVSSU5HLCAicmVidWlsZCBoZWFkZXIgZm9yIHByb3RvY29sICVYaFxuIiwgdHlwZSk7CisKKwlpZiAodHlwZSA9PSBFVEhfUF9JUCkgeworI2lmZGVmIENPTkZJR19JTkVUCisJCUJVR01TRyhEX0RVUklORywgInJlYnVpbGQgaGVhZGVyIGZvciBldGhlcm5ldCBwcm90b2NvbCAlWGhcbiIsIHR5cGUpOworCQlzdGF0dXMgPSBhcnBfZmluZCgmZGFkZHIsIHNrYikgPyAxIDogMDsKKwkJQlVHTVNHKERfRFVSSU5HLCAiIHJlYnVpbHQ6IGRlc3QgaXMgJWQ7IHByb3RvY29sICVYaFxuIiwKKwkJICAgICAgIGRhZGRyLCB0eXBlKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCUJVR01TRyhEX05PUk1BTCwKKwkJICAgICAgICJJIGRvbid0IHVuZGVyc3RhbmQgZXRoZXJuZXQgcHJvdG9jb2wgJVhoIGFkZHJlc3NlcyFcbiIsIHR5cGUpOworCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJCWxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCX0KKworCS8qIGlmIHdlIGNvdWxkbid0IHJlc29sdmUgdGhlIGFkZHJlc3MuLi4gZ2l2ZSB1cC4gKi8KKwlpZiAoIXN0YXR1cykKKwkJcmV0dXJuIDA7CisKKwkvKiBhZGQgdGhlIF9yZWFsXyBoZWFkZXIgdGhpcyB0aW1lISAqLworCXByb3RvID0gYXJjX3Byb3RvX21hcFtscC0+ZGVmYXVsdF9wcm90b1tkYWRkcl1dOworCXByb3RvLT5idWlsZF9oZWFkZXIoc2tiLCBkZXYsIHR5cGUsIGRhZGRyKTsKKworCXJldHVybiAxOwkJLyogc3VjY2VzcyAqLworfQorCisKKworLyogQ2FsbGVkIGJ5IHRoZSBrZXJuZWwgaW4gb3JkZXIgdG8gdHJhbnNtaXQgYSBwYWNrZXQuICovCitzdGF0aWMgaW50IGFyY25ldF9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBhcmNoZHIgKnBrdDsKKwlzdHJ1Y3QgYXJjX3JmYzEyMDEgKnNvZnQ7CisJc3RydWN0IEFyY1Byb3RvICpwcm90bzsKKwlpbnQgdHhidWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZnJlZXNrYiA9IDA7CisKKwlCVUdNU0coRF9EVVJJTkcsCisJICAgICAgICJ0cmFuc21pdCByZXF1ZXN0ZWQgKHN0YXR1cz0lWGgsIHR4YnVmcz0lZC8lZCwgbGVuPSVkLCBwcm90b2NvbCAleClcbiIsCisJICAgICAgIEFTVEFUVVMoKSwgbHAtPmN1cl90eCwgbHAtPm5leHRfdHgsIHNrYi0+bGVuLHNrYi0+cHJvdG9jb2wpOworCisJcGt0ID0gKHN0cnVjdCBhcmNoZHIgKikgc2tiLT5kYXRhOworCXNvZnQgPSAmcGt0LT5zb2Z0LnJmYzEyMDE7CisJcHJvdG8gPSBhcmNfcHJvdG9fbWFwW3NvZnQtPnByb3RvXTsKKworCUJVR01TRyhEX1NLQl9TSVpFLCAic2tiOiB0cmFuc21pdHRpbmcgJWQgYnl0ZXMgdG8gJTAyWFxuIiwKKwkJc2tiLT5sZW4sIHBrdC0+aGFyZC5kZXN0KTsKKwlCVUdMVkwoRF9TS0IpIGFyY25ldF9kdW1wX3NrYihkZXYsIHNrYiwgInR4Iik7CisKKwkvKiBmaXRzIGluIG9uZSBwYWNrZXQ/ICovCisJaWYgKHNrYi0+bGVuIC0gQVJDX0hEUl9TSVpFID4gWE1UVSAmJiAhcHJvdG8tPmNvbnRpbnVlX3R4KSB7CisJCUJVR01TRyhEX05PUk1BTCwgImZpeG1lOiBwYWNrZXQgdG9vIGxhcmdlOiBjb21wZW5zYXRpbmcgYmFkbHkhXG4iKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsJLyogZG9uJ3QgdHJ5IGFnYWluICovCisJfQorCisJLyogV2UncmUgYnVzeSB0cmFuc21pdHRpbmcgYSBwYWNrZXQuLi4gKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwlBSU5UTUFTSygwKTsKKworCXR4YnVmID0gZ2V0X2FyY2J1ZihkZXYpOworCWlmICh0eGJ1ZiAhPSAtMSkgeworCQlpZiAocHJvdG8tPnByZXBhcmVfdHgoZGV2LCBwa3QsIHNrYi0+bGVuLCB0eGJ1ZikgJiYKKwkJICAgICFwcm90by0+YWNrX3R4KSB7CisJCQkvKiBkb25lIHJpZ2h0IGF3YXkgYW5kIHdlIGRvbid0IHdhbnQgdG8gYWNrbm93bGVkZ2UKKwkJCSAgIHRoZSBwYWNrYWdlIGxhdGVyIC0gZm9yZ2V0IGFib3V0IGl0IG5vdyAqLworCQkJbHAtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQkJZnJlZXNrYiA9IDE7CisJCX0gZWxzZSB7CisJCQkvKiBkbyBpdCB0aGUgJ3NwbGl0JyB3YXkgKi8KKwkJCWxwLT5vdXRnb2luZy5wcm90byA9IHByb3RvOworCQkJbHAtPm91dGdvaW5nLnNrYiA9IHNrYjsKKwkJCWxwLT5vdXRnb2luZy5wa3QgPSBwa3Q7CisKKwkJCWlmIChwcm90by0+Y29udGludWVfdHggJiYKKwkJCSAgICBwcm90by0+Y29udGludWVfdHgoZGV2LCB0eGJ1ZikpIHsKKwkJCSAgQlVHTVNHKERfTk9STUFMLAorCQkJCSAiYnVnISBjb250aW51ZV90eCBmaW5pc2hlZCB0aGUgZmlyc3QgdGltZSEgIgorCQkJCSAiKHByb3RvPSclYycpXG4iLCBwcm90by0+c3VmZml4KTsKKwkJCX0KKwkJfQorCisJCWxwLT5uZXh0X3R4ID0gdHhidWY7CisJfSBlbHNlIHsKKwkJZnJlZXNrYiA9IDE7CisJfQorCisJQlVHTVNHKERfREVCVUcsICIlczogJWQ6ICVzLCBzdGF0dXM6ICV4XG4iLF9fRklMRV9fLF9fTElORV9fLF9fRlVOQ1RJT05fXyxBU1RBVFVTKCkpOworCS8qIG1ha2Ugc3VyZSB3ZSBkaWRuJ3QgaWdub3JlIGEgVFggSVJRIHdoaWxlIHdlIHdlcmUgaW4gaGVyZSAqLworCUFJTlRNQVNLKDApOworCisJQlVHTVNHKERfREVCVUcsICIlczogJWQ6ICVzXG4iLF9fRklMRV9fLF9fTElORV9fLF9fRlVOQ1RJT05fXyk7CisJbHAtPmludG1hc2sgfD0gVFhGUkVFZmxhZ3xFWENOQUtmbGFnOworCUFJTlRNQVNLKGxwLT5pbnRtYXNrKTsKKwlCVUdNU0coRF9ERUJVRywgIiVzOiAlZDogJXMsIHN0YXR1czogJXhcbiIsX19GSUxFX18sX19MSU5FX18sX19GVU5DVElPTl9fLEFTVEFUVVMoKSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCWlmIChmcmVlc2tiKSB7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9CisJcmV0dXJuIDA7CQkvKiBubyBuZWVkIHRvIHRyeSBhZ2FpbiAqLworfQorCisKKy8qCisgKiBBY3R1YWxseSBzdGFydCB0cmFuc21pdHRpbmcgYSBwYWNrZXQgdGhhdCB3YXMgbG9hZGVkIGludG8gYSBidWZmZXIKKyAqIGJ5IHByZXBhcmVfdHguICBUaGlzIHNob3VsZCBfb25seV8gYmUgY2FsbGVkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworc3RhdGljIGludCBnb190eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCisJQlVHTVNHKERfRFVSSU5HLCAiZ29fdHg6IHN0YXR1cz0lWGgsIGludG1hc2s9JVhoLCBuZXh0X3R4PSVkLCBjdXJfdHg9JWRcbiIsCisJICAgICAgIEFTVEFUVVMoKSwgbHAtPmludG1hc2ssIGxwLT5uZXh0X3R4LCBscC0+Y3VyX3R4KTsKKworCWlmIChscC0+Y3VyX3R4ICE9IC0xIHx8IGxwLT5uZXh0X3R4ID09IC0xKQorCQlyZXR1cm4gMDsKKworCUJVR0xWTChEX1RYKSBhcmNuZXRfZHVtcF9wYWNrZXQoZGV2LCBscC0+bmV4dF90eCwgImdvX3R4IiwgMCk7CisKKwlscC0+Y3VyX3R4ID0gbHAtPm5leHRfdHg7CisJbHAtPm5leHRfdHggPSAtMTsKKworCS8qIHN0YXJ0IHNlbmRpbmcgKi8KKwlBQ09NTUFORChUWGNtZCB8IChscC0+Y3VyX3R4IDw8IDMpKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJbHAtPmxhc3R0cmFuc19kZXN0ID0gbHAtPmxhc3Rsb2FkX2Rlc3Q7CisJbHAtPmxhc3Rsb2FkX2Rlc3QgPSAwOworCWxwLT5leGNuYWtfcGVuZGluZyA9IDA7CisJbHAtPmludG1hc2sgfD0gVFhGUkVFZmxhZ3xFWENOQUtmbGFnOworCisJcmV0dXJuIDE7Cit9CisKKworLyogQ2FsbGVkIGJ5IHRoZSBrZXJuZWwgd2hlbiB0cmFuc21pdCB0aW1lcyBvdXQgKi8KK3N0YXRpYyB2b2lkIGFyY25ldF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlpbnQgc3RhdHVzID0gQVNUQVRVUygpOworCWNoYXIgKm1zZzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCWlmIChzdGF0dXMgJiBUWEZSRUVmbGFnKSB7CS8qIHRyYW5zbWl0IF9ESURfIGZpbmlzaCAqLworCQltc2cgPSAiIC0gbWlzc2VkIElSUT8iOworCX0gZWxzZSB7CisJCW1zZyA9ICIiOworCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJbHAtPnRpbWVkX291dCA9IDE7CisJCUFDT01NQU5EKE5PVFhjbWQgfCAobHAtPmN1cl90eCA8PCAzKSk7CisJfQorCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKworCS8qIG1ha2Ugc3VyZSB3ZSBkaWRuJ3QgbWlzcyBhIFRYIG9yIGEgRVhDIE5BSyBJUlEgKi8KKwlBSU5UTUFTSygwKTsKKwlscC0+aW50bWFzayB8PSBUWEZSRUVmbGFnfEVYQ05BS2ZsYWc7CisJQUlOVE1BU0sobHAtPmludG1hc2spOworCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoamlmZmllcyAtIGxwLT5sYXN0X3RpbWVvdXQgPiAxMCpIWikgeworCQlCVUdNU0coRF9FWFRSQSwgInR4IHRpbWVkIG91dCVzIChzdGF0dXM9JVhoLCBpbnRtYXNrPSVYaCwgZGVzdD0lMDJYaClcbiIsCisJCSAgICAgICBtc2csIHN0YXR1cywgbHAtPmludG1hc2ssIGxwLT5sYXN0dHJhbnNfZGVzdCk7CisJCWxwLT5sYXN0X3RpbWVvdXQgPSBqaWZmaWVzOworCX0KKworCWlmIChscC0+Y3VyX3R4ID09IC0xKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKworLyoKKyAqIFRoZSB0eXBpY2FsIHdvcmtsb2FkIG9mIHRoZSBkcml2ZXI6IEhhbmRsZSB0aGUgbmV0d29yayBpbnRlcmZhY2UKKyAqIGludGVycnVwdHMuIEVzdGFibGlzaCB3aGljaCBkZXZpY2UgbmVlZHMgYXR0ZW50aW9uLCBhbmQgY2FsbCB0aGUgY29ycmVjdAorICogY2hpcHNldCBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworaXJxcmV0dXJuX3QgYXJjbmV0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHA7CisJaW50IHJlY2J1Ziwgc3RhdHVzLCBkaWFnc3RhdHVzLCBkaWRzb21ldGhpbmcsIGJvZ3VzY291bnQ7CisJaW50IHJldHZhbCA9IElSUV9OT05FOworCisJQlVHTVNHKERfRFVSSU5HLCAiXG4iKTsKKworCUJVR01TRyhEX0RVUklORywgImluIGFyY25ldF9pbnRlcnJ1cHRcbiIpOworCQorCWxwID0gZGV2LT5wcml2OworCWlmICghbHApCisJCUJVRygpOworCQkKKwlzcGluX2xvY2soJmxwLT5sb2NrKTsKKworCS8qCisJICogUkVTRVQgZmxhZyB3YXMgZW5hYmxlZCAtIGlmIGRldmljZSBpcyBub3QgcnVubmluZywgd2UgbXVzdCBjbGVhciBpdCByaWdodAorCSAqIGF3YXkgKGJ1dCBub3RoaW5nIGVsc2UpLgorCSAqLworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCWlmIChBU1RBVFVTKCkgJiBSRVNFVGZsYWcpCisJCQlBQ09NTUFORChDRkxBR1NjbWQgfCBSRVNFVGNsZWFyKTsKKwkJQUlOVE1BU0soMCk7CisJCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlCVUdNU0coRF9EVVJJTkcsICJpbiBhcmNuZXRfaW50aGFuZGxlciAoc3RhdHVzPSVYaCwgaW50bWFzaz0lWGgpXG4iLAorCSAgICAgICBBU1RBVFVTKCksIGxwLT5pbnRtYXNrKTsKKworCWJvZ3VzY291bnQgPSA1OworCWRvIHsKKwkJc3RhdHVzID0gQVNUQVRVUygpOworICAgICAgICAgICAgICAgIGRpYWdzdGF0dXMgPSAoc3RhdHVzID4+IDgpICYgMHhGRjsKKworCQlCVUdNU0coRF9ERUJVRywgIiVzOiAlZDogJXM6IHN0YXR1cz0leFxuIiwKKwkJCV9fRklMRV9fLF9fTElORV9fLF9fRlVOQ1RJT05fXyxzdGF0dXMpOworCQlkaWRzb21ldGhpbmcgPSAwOworCisJCS8qCisJCSAqIFJFU0VUIGZsYWcgd2FzIGVuYWJsZWQgLSBjYXJkIGlzIHJlc2V0dGluZyBhbmQgaWYgUlggaXMKKwkJICogZGlzYWJsZWQsIGl0J3MgTk9UIGJlY2F1c2Ugd2UganVzdCBnb3QgYSBwYWNrZXQuCisJCSAqIAorCQkgKiBUaGUgY2FyZCBpcyBpbiBhbiB1bmRlZmluZWQgc3RhdGUuICBDbGVhciBpdCBvdXQgYW5kIHN0YXJ0IG92ZXIuCisJCSAqLworCQlpZiAoc3RhdHVzICYgUkVTRVRmbGFnKSB7CisJCQlCVUdNU0coRF9OT1JNQUwsICJzcHVyaW91cyByZXNldCAoc3RhdHVzPSVYaClcbiIsIHN0YXR1cyk7CisJCQlhcmNuZXRfY2xvc2UoZGV2KTsKKwkJCWFyY25ldF9vcGVuKGRldik7CisKKwkJCS8qIGdldCBvdXQgb2YgdGhlIGludGVycnVwdCBoYW5kbGVyISAqLworCQkJYnJlYWs7CisJCX0KKwkJLyogCisJCSAqIFJYIGlzIGluaGliaXRlZCAtIHdlIG11c3QgaGF2ZSByZWNlaXZlZCBzb21ldGhpbmcuIFByZXBhcmUgdG8KKwkJICogcmVjZWl2ZSBpbnRvIHRoZSBuZXh0IGJ1ZmZlci4KKwkJICogCisJCSAqIFdlIGRvbid0IGFjdHVhbGx5IGNvcHkgdGhlIHJlY2VpdmVkIHBhY2tldCBmcm9tIHRoZSBjYXJkIHVudGlsCisJCSAqIGFmdGVyIHRoZSB0cmFuc21pdCBoYW5kbGVyIHJ1bnMgKGFuZCBwb3NzaWJseSBsYXVuY2hlcyB0aGUgbmV4dAorCQkgKiB0eCk7IHRoaXMgc2hvdWxkIGltcHJvdmUgbGF0ZW5jeSBzbGlnaHRseSBpZiB3ZSBnZXQgYm90aCB0eXBlcworCQkgKiBvZiBpbnRlcnJ1cHRzIGF0IG9uY2UuIAorCQkgKi8KKwkJcmVjYnVmID0gLTE7CisJCWlmIChzdGF0dXMgJiBscC0+aW50bWFzayAmIE5PUlhmbGFnKSB7CisJCQlyZWNidWYgPSBscC0+Y3VyX3J4OworCQkJQlVHTVNHKERfRFVSSU5HLCAiQnVmZmVyICMlZDogcmVjZWl2ZSBpcnEgKHN0YXR1cz0lWGgpXG4iLAorCQkJICAgICAgIHJlY2J1Ziwgc3RhdHVzKTsKKworCQkJbHAtPmN1cl9yeCA9IGdldF9hcmNidWYoZGV2KTsKKwkJCWlmIChscC0+Y3VyX3J4ICE9IC0xKSB7CisJCQkJQlVHTVNHKERfRFVSSU5HLCAiZW5hYmxpbmcgcmVjZWl2ZSB0byBidWZmZXIgIyVkXG4iLAorCQkJCSAgICAgICBscC0+Y3VyX3J4KTsKKwkJCQlBQ09NTUFORChSWGNtZCB8IChscC0+Y3VyX3J4IDw8IDMpIHwgUlhiY2FzdHMpOworCQkJfQorCQkJZGlkc29tZXRoaW5nKys7CisJCX0KKworCQlpZigoZGlhZ3N0YXR1cyAmIEVYQ05BS2ZsYWcpKSB7CisJCQlCVUdNU0coRF9EVVJJTkcsICJFWENOQUsgSVJRIChkaWFnc3RhdD0lWGgpXG4iLAorCQkJICAgICAgIGRpYWdzdGF0dXMpOworCisgICAgICAgICAgICAgICAgICAgICAgICBBQ09NTUFORChOT1RYY21kKTsgICAgICAvKiBkaXNhYmxlIHRyYW5zbWl0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBscC0+ZXhjbmFrX3BlbmRpbmcgPSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBBQ09NTUFORChFWENOQUtjbGVhcik7CisJCQlscC0+aW50bWFzayAmPSB+KEVYQ05BS2ZsYWcpOworICAgICAgICAgICAgICAgICAgICAgICAgZGlkc29tZXRoaW5nKys7CisgICAgICAgICAgICAgICAgfQorCisKKwkJLyogYSB0cmFuc21pdCBmaW5pc2hlZCwgYW5kIHdlJ3JlIGludGVyZXN0ZWQgaW4gaXQuICovCisJCWlmICgoc3RhdHVzICYgbHAtPmludG1hc2sgJiBUWEZSRUVmbGFnKSB8fCBscC0+dGltZWRfb3V0KSB7CisJCQlscC0+aW50bWFzayAmPSB+KFRYRlJFRWZsYWd8RVhDTkFLZmxhZyk7CisKKwkJCUJVR01TRyhEX0RVUklORywgIlRYIElSUSAoc3RhdD0lWGgpXG4iLCBzdGF0dXMpOworCisJCQlpZiAobHAtPmN1cl90eCAhPSAtMSAmJiAhbHAtPnRpbWVkX291dCkgeworCQkJCWlmKCEoc3RhdHVzICYgVFhBQ0tmbGFnKSkgeworCQkJCQlpZiAobHAtPmxhc3R0cmFuc19kZXN0ICE9IDApIHsKKwkJCQkJCUJVR01TRyhEX0VYVFJBLAorCQkJCQkJICAgICAgICJ0cmFuc21pdCB3YXMgbm90IGFja25vd2xlZGdlZCEgIgorCQkJCQkJICAgICAgICIoc3RhdHVzPSVYaCwgZGVzdD0lMDJYaClcbiIsCisJCQkJCQkgICAgICAgc3RhdHVzLCBscC0+bGFzdHRyYW5zX2Rlc3QpOworCQkJCQkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJCQkJbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlCVUdNU0coRF9EVVJJTkcsCisJCQkJCQkgICAgICAgImJyb2FkY2FzdCB3YXMgbm90IGFja25vd2xlZGdlZDsgdGhhdCdzIG5vcm1hbCAiCisJCQkJCQkgICAgICAgIihzdGF0dXM9JVhoLCBkZXN0PSUwMlhoKVxuIiwKKwkJCQkJCSAgICAgICBzdGF0dXMsIGxwLT5sYXN0dHJhbnNfZGVzdCk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAobHAtPm91dGdvaW5nLnByb3RvICYmCisJCQkJICAgIGxwLT5vdXRnb2luZy5wcm90by0+YWNrX3R4KSB7CisJCQkJICBpbnQgYWNrc3RhdHVzOworCQkJCSAgaWYoc3RhdHVzICYgVFhBQ0tmbGFnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNrc3RhdHVzPTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihscC0+ZXhjbmFrX3BlbmRpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2tzdGF0dXM9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2tzdGF0dXM9MDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5vdXRnb2luZy5wcm90bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5hY2tfdHgoZGV2LCBhY2tzdGF0dXMpOworCQkJCX0KKwkJCX0KKwkJCWlmIChscC0+Y3VyX3R4ICE9IC0xKQorCQkJCXJlbGVhc2VfYXJjYnVmKGRldiwgbHAtPmN1cl90eCk7CisKKwkJCWxwLT5jdXJfdHggPSAtMTsKKwkJCWxwLT50aW1lZF9vdXQgPSAwOworCQkJZGlkc29tZXRoaW5nKys7CisKKwkJCS8qIHNlbmQgYW5vdGhlciBwYWNrZXQgaWYgdGhlcmUgaXMgb25lICovCisJCQlnb190eChkZXYpOworCisJCQkvKiBjb250aW51ZSBhIHNwbGl0IHBhY2tldCwgaWYgYW55ICovCisJCQlpZiAobHAtPm91dGdvaW5nLnByb3RvICYmIGxwLT5vdXRnb2luZy5wcm90by0+Y29udGludWVfdHgpIHsKKwkJCQlpbnQgdHhidWYgPSBnZXRfYXJjYnVmKGRldik7CisJCQkJaWYgKHR4YnVmICE9IC0xKSB7CisJCQkJCWlmIChscC0+b3V0Z29pbmcucHJvdG8tPmNvbnRpbnVlX3R4KGRldiwgdHhidWYpKSB7CisJCQkJCQkvKiB0aGF0IHdhcyB0aGUgbGFzdCBzZWdtZW50ICovCisJCQkJCQlscC0+c3RhdHMudHhfYnl0ZXMgKz0gbHAtPm91dGdvaW5nLnNrYi0+bGVuOworCQkJCQkJaWYoIWxwLT5vdXRnb2luZy5wcm90by0+YWNrX3R4KQorCQkJCQkJICB7CisJCQkJCQkgICAgZGV2X2tmcmVlX3NrYl9pcnEobHAtPm91dGdvaW5nLnNrYik7CisJCQkJCQkgICAgbHAtPm91dGdvaW5nLnByb3RvID0gTlVMTDsKKwkJCQkJCSAgfQorCQkJCQl9CisJCQkJCWxwLT5uZXh0X3R4ID0gdHhidWY7CisJCQkJfQorCQkJfQorCQkJLyogaW5mb3JtIHVwcGVyIGxheWVycyBvZiBpZGxlbmVzcywgaWYgbmVjZXNzYXJ5ICovCisJCQlpZiAobHAtPmN1cl90eCA9PSAtMSkKKwkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0KKwkJLyogbm93IHByb2Nlc3MgdGhlIHJlY2VpdmVkIHBhY2tldCwgaWYgYW55ICovCisJCWlmIChyZWNidWYgIT0gLTEpIHsKKwkJCUJVR0xWTChEX1JYKSBhcmNuZXRfZHVtcF9wYWNrZXQoZGV2LCByZWNidWYsICJyeCBpcnEiLCAwKTsKKworCQkJYXJjbmV0X3J4KGRldiwgcmVjYnVmKTsKKwkJCXJlbGVhc2VfYXJjYnVmKGRldiwgcmVjYnVmKTsKKworCQkJZGlkc29tZXRoaW5nKys7CisJCX0KKwkJaWYgKHN0YXR1cyAmIGxwLT5pbnRtYXNrICYgUkVDT05mbGFnKSB7CisJCQlBQ09NTUFORChDRkxBR1NjbWQgfCBDT05GSUdjbGVhcik7CisJCQlscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKworCQkJQlVHTVNHKERfUkVDT04sICJOZXR3b3JrIHJlY29uZmlndXJhdGlvbiBkZXRlY3RlZCAoc3RhdHVzPSVYaClcbiIsCisJCQkgICAgICAgc3RhdHVzKTsKKworCQkJLyogaXMgdGhlIFJFQ09OIGluZm8gZW1wdHkgb3Igb2xkPyAqLworCQkJaWYgKCFscC0+Zmlyc3RfcmVjb24gfHwgIWxwLT5sYXN0X3JlY29uIHx8CisJCQkgICAgamlmZmllcyAtIGxwLT5sYXN0X3JlY29uID4gSFogKiAxMCkgeworCQkJCWlmIChscC0+bmV0d29ya19kb3duKQorCQkJCQlCVUdNU0coRF9OT1JNQUwsICJyZWNvbmZpZ3VyYXRpb24gZGV0ZWN0ZWQ6IGNhYmxpbmcgcmVzdG9yZWQ/XG4iKTsKKwkJCQlscC0+Zmlyc3RfcmVjb24gPSBscC0+bGFzdF9yZWNvbiA9IGppZmZpZXM7CisJCQkJbHAtPm51bV9yZWNvbnMgPSBscC0+bmV0d29ya19kb3duID0gMDsKKworCQkJCUJVR01TRyhEX0RVUklORywgInJlY29uOiBjbGVhcmluZyBjb3VudGVycy5cbiIpOworCQkJfSBlbHNlIHsJLyogYWRkIHRvIGN1cnJlbnQgUkVDT04gY291bnRlciAqLworCQkJCWxwLT5sYXN0X3JlY29uID0gamlmZmllczsKKwkJCQlscC0+bnVtX3JlY29ucysrOworCisJCQkJQlVHTVNHKERfRFVSSU5HLCAicmVjb246IGNvdW50ZXI9JWQsIHRpbWU9JWxkcywgbmV0PSVkXG4iLAorCQkJCSAgICAgICBscC0+bnVtX3JlY29ucywKKwkJCQkgKGxwLT5sYXN0X3JlY29uIC0gbHAtPmZpcnN0X3JlY29uKSAvIEhaLAorCQkJCSAgICAgICBscC0+bmV0d29ya19kb3duKTsKKworCQkJCS8qIGlmIG5ldHdvcmsgaXMgbWFya2VkIHVwOworCQkJCSAqIGFuZCBmaXJzdF9yZWNvbiBhbmQgbGFzdF9yZWNvbiBhcmUgNjArIGFwYXJ0OworCQkJCSAqIGFuZCB0aGUgYXZlcmFnZSBuby4gb2YgcmVjb25zIGNvdW50ZWQgaXMKKwkJCQkgKiAgICA+IFJFQ09OX1RIUkVTSE9MRC9taW47CisJCQkJICogdGhlbiBwcmludCBhIHdhcm5pbmcgbWVzc2FnZS4KKwkJCQkgKi8KKwkJCQlpZiAoIWxwLT5uZXR3b3JrX2Rvd24KKwkJCQkgICAgJiYgKGxwLT5sYXN0X3JlY29uIC0gbHAtPmZpcnN0X3JlY29uKSA8PSBIWiAqIDYwCisJCQkJICAmJiBscC0+bnVtX3JlY29ucyA+PSBSRUNPTl9USFJFU0hPTEQpIHsKKwkJCQkJbHAtPm5ldHdvcmtfZG93biA9IDE7CisJCQkJCUJVR01TRyhEX05PUk1BTCwgIm1hbnkgcmVjb25maWd1cmF0aW9ucyBkZXRlY3RlZDogY2FibGluZyBwcm9ibGVtP1xuIik7CisJCQkJfSBlbHNlIGlmICghbHAtPm5ldHdvcmtfZG93bgorCQkJCQkgICAmJiBscC0+bGFzdF9yZWNvbiAtIGxwLT5maXJzdF9yZWNvbiA+IEhaICogNjApIHsKKwkJCQkJLyogcmVzZXQgY291bnRlcnMgaWYgd2UndmUgZ29uZSBmb3Igb3ZlciBhIG1pbnV0ZS4gKi8KKwkJCQkJbHAtPmZpcnN0X3JlY29uID0gbHAtPmxhc3RfcmVjb247CisJCQkJCWxwLT5udW1fcmVjb25zID0gMTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAobHAtPm5ldHdvcmtfZG93biAmJiBqaWZmaWVzIC0gbHAtPmxhc3RfcmVjb24gPiBIWiAqIDEwKSB7CisJCQlpZiAobHAtPm5ldHdvcmtfZG93bikKKwkJCQlCVUdNU0coRF9OT1JNQUwsICJjYWJsaW5nIHJlc3RvcmVkP1xuIik7CisJCQlscC0+Zmlyc3RfcmVjb24gPSBscC0+bGFzdF9yZWNvbiA9IDA7CisJCQlscC0+bnVtX3JlY29ucyA9IGxwLT5uZXR3b3JrX2Rvd24gPSAwOworCisJCQlCVUdNU0coRF9EVVJJTkcsICJub3QgcmVjb246IGNsZWFyaW5nIGNvdW50ZXJzIGFueXdheS5cbiIpOworCQl9CisKKwkJaWYoZGlkc29tZXRoaW5nKSB7CisJCQlyZXR2YWwgfD0gSVJRX0hBTkRMRUQ7CisJCX0KKwl9CisJd2hpbGUgKC0tYm9ndXNjb3VudCAmJiBkaWRzb21ldGhpbmcpOworCisJQlVHTVNHKERfRFVSSU5HLCAiYXJjbmV0X2ludGVycnVwdCBjb21wbGV0ZSAoc3RhdHVzPSVYaCwgY291bnQ9JWQpXG4iLAorCSAgICAgICBBU1RBVFVTKCksIGJvZ3VzY291bnQpOworCUJVR01TRyhEX0RVUklORywgIlxuIik7CisKKworCUFJTlRNQVNLKDApOworCXVkZWxheSgxKTsKKwlBSU5UTUFTSyhscC0+aW50bWFzayk7CisJCisJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisKKy8qCisgKiBUaGlzIGlzIGEgZ2VuZXJpYyBwYWNrZXQgcmVjZWl2ZXIgdGhhdCBjYWxscyBhcmNuZXQ/P19yeCBkZXBlbmRpbmcgb24gdGhlCisgKiBwcm90b2NvbCBJRCBmb3VuZC4KKyAqLwordm9pZCBhcmNuZXRfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSkKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgYXJjaGRyIHBrdDsKKwlzdHJ1Y3QgYXJjX3JmYzEyMDEgKnNvZnQ7CisJaW50IGxlbmd0aCwgb2ZzOworCisJc29mdCA9ICZwa3Quc29mdC5yZmMxMjAxOworCisJbHAtPmh3LmNvcHlfZnJvbV9jYXJkKGRldiwgYnVmbnVtLCAwLCAmcGt0LCBzaXplb2YoQVJDX0hEUl9TSVpFKSk7CisJaWYgKHBrdC5oYXJkLm9mZnNldFswXSkgeworCQlvZnMgPSBwa3QuaGFyZC5vZmZzZXRbMF07CisJCWxlbmd0aCA9IDI1NiAtIG9mczsKKwl9IGVsc2UgeworCQlvZnMgPSBwa3QuaGFyZC5vZmZzZXRbMV07CisJCWxlbmd0aCA9IDUxMiAtIG9mczsKKwl9CisKKwkvKiBnZXQgdGhlIGZ1bGwgaGVhZGVyLCBpZiBwb3NzaWJsZSAqLworCWlmIChzaXplb2YocGt0LnNvZnQpIDw9IGxlbmd0aCkKKwkJbHAtPmh3LmNvcHlfZnJvbV9jYXJkKGRldiwgYnVmbnVtLCBvZnMsIHNvZnQsIHNpemVvZihwa3Quc29mdCkpOworCWVsc2UgeworCQltZW1zZXQoJnBrdC5zb2Z0LCAwLCBzaXplb2YocGt0LnNvZnQpKTsKKwkJbHAtPmh3LmNvcHlfZnJvbV9jYXJkKGRldiwgYnVmbnVtLCBvZnMsIHNvZnQsIGxlbmd0aCk7CisJfQorCisJQlVHTVNHKERfRFVSSU5HLCAiQnVmZmVyICMlZDogcmVjZWl2ZWQgcGFja2V0IGZyb20gJTAyWGggdG8gJTAyWGggIgorCSAgICAgICAiKCVkKzQgYnl0ZXMpXG4iLAorCSAgICAgICBidWZudW0sIHBrdC5oYXJkLnNvdXJjZSwgcGt0LmhhcmQuZGVzdCwgbGVuZ3RoKTsKKworCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbmd0aCArIEFSQ19IRFJfU0laRTsKKworCS8qIGNhbGwgdGhlIHJpZ2h0IHJlY2VpdmVyIGZvciB0aGUgcHJvdG9jb2wgKi8KKwlpZiAoYXJjX3Byb3RvX21hcFtzb2Z0LT5wcm90b10tPmlzX2lwKSB7CisJCUJVR0xWTChEX1BST1RPKSB7CisJCQlzdHJ1Y3QgQXJjUHJvdG8KKwkJCSpvbGRwID0gYXJjX3Byb3RvX21hcFtscC0+ZGVmYXVsdF9wcm90b1twa3QuaGFyZC5zb3VyY2VdXSwKKwkJCSpuZXdwID0gYXJjX3Byb3RvX21hcFtzb2Z0LT5wcm90b107CisKKwkJCWlmIChvbGRwICE9IG5ld3ApIHsKKwkJCQlCVUdNU0coRF9QUk9UTywKKwkJCQkgICAgICAgImdvdCBwcm90b2NvbCAlMDJYaDsgZW5jYXAgZm9yIGhvc3QgJTAyWGggaXMgbm93ICclYyciCisJCQkJICAgICAgICIgKHdhcyAnJWMnKVxuIiwgc29mdC0+cHJvdG8sIHBrdC5oYXJkLnNvdXJjZSwKKwkJCQkgICAgICAgbmV3cC0+c3VmZml4LCBvbGRwLT5zdWZmaXgpOworCQkJfQorCQl9CisKKwkJLyogYnJvYWRjYXN0cyB3aWxsIGFsd2F5cyBiZSBkb25lIHdpdGggdGhlIGxhc3QtdXNlZCBlbmNhcC4gKi8KKwkJbHAtPmRlZmF1bHRfcHJvdG9bMF0gPSBzb2Z0LT5wcm90bzsKKworCQkvKiBpbiBzdHJpa2luZyBjb250cmFzdCwgdGhlIGZvbGxvd2luZyBpc24ndCBhIGhhY2suICovCisJCWxwLT5kZWZhdWx0X3Byb3RvW3BrdC5oYXJkLnNvdXJjZV0gPSBzb2Z0LT5wcm90bzsKKwl9CisJLyogY2FsbCB0aGUgcHJvdG9jb2wtc3BlY2lmaWMgcmVjZWl2ZXIuICovCisJYXJjX3Byb3RvX21hcFtzb2Z0LT5wcm90b10tPnJ4KGRldiwgYnVmbnVtLCAmcGt0LCBsZW5ndGgpOworfQorCisKKworLyogCisgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4gIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IKKyAqIGNsb3NlZC4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphcmNuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKworc3RhdGljIHZvaWQgbnVsbF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmbnVtLAorCQkgICAgc3RydWN0IGFyY2hkciAqcGt0aGRyLCBpbnQgbGVuZ3RoKQoreworCUJVR01TRyhEX1BST1RPLAorCSJyeDogZG9uJ3Qga25vdyBob3cgdG8gZGVhbCB3aXRoIHByb3RvICUwMlhoIGZyb20gaG9zdCAlMDJYaC5cbiIsCisJICAgICAgIHBrdGhkci0+c29mdC5yZmMxMjAxLnByb3RvLCBwa3RoZHItPmhhcmQuc291cmNlKTsKK30KKworCitzdGF0aWMgaW50IG51bGxfYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIHVpbnQ4X3QgZGFkZHIpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisKKwlCVUdNU0coRF9QUk9UTywKKwkgICAgICAgInR4OiBjYW4ndCBidWlsZCBoZWFkZXIgZm9yIGVuY2FwICUwMlhoOyBsb2FkIGEgcHJvdG9jb2wgZHJpdmVyLlxuIiwKKwkgICAgICAgbHAtPmRlZmF1bHRfcHJvdG9bZGFkZHJdKTsKKworCS8qIGFsd2F5cyBmYWlscyAqLworCXJldHVybiAwOworfQorCisKKy8qIHRoZSAiZG8gbm90aGluZyIgcHJlcGFyZV90eCBmdW5jdGlvbiB3YXJucyB0aGF0IHRoZXJlJ3Mgbm90aGluZyB0byBkby4gKi8KK3N0YXRpYyBpbnQgbnVsbF9wcmVwYXJlX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBhcmNoZHIgKnBrdCwKKwkJCSAgIGludCBsZW5ndGgsIGludCBidWZudW0pCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IGFyY19oYXJkd2FyZSBuZXdwa3Q7CisKKwlCVUdNU0coRF9QUk9UTywgInR4OiBubyBlbmNhcCBmb3IgdGhpcyBob3N0OyBsb2FkIGEgcHJvdG9jb2wgZHJpdmVyLlxuIik7CisKKwkvKiBzZW5kIGEgcGFja2V0IHRvIG15c2VsZiAtLSB3aWxsIG5ldmVyIGdldCByZWNlaXZlZCwgb2YgY291cnNlICovCisJbmV3cGt0LnNvdXJjZSA9IG5ld3BrdC5kZXN0ID0gZGV2LT5kZXZfYWRkclswXTsKKworCS8qIG9ubHkgb25lIGJ5dGUgb2YgYWN0dWFsIGRhdGEgKGFuZCBpdCdzIHJhbmRvbSkgKi8KKwluZXdwa3Qub2Zmc2V0WzBdID0gMHhGRjsKKworCWxwLT5ody5jb3B5X3RvX2NhcmQoZGV2LCBidWZudW0sIDAsICZuZXdwa3QsIEFSQ19IRFJfU0laRSk7CisKKwlyZXR1cm4gMTsJCS8qIGRvbmUgKi8KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FyY25ldC9jYXBtb2RlLmMgYi9kcml2ZXJzL25ldC9hcmNuZXQvY2FwbW9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZTE1NWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcmNuZXQvY2FwbW9kZS5jCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICogTGludXggQVJDbmV0IGRyaXZlciAtICJjYXAgbW9kZSIgcGFja2V0IGVuY2Fwc3VsYXRpb24uCisgKiBJdCBhZGRzIHNlcXVlbmNlIG51bWJlcnMgdG8gcGFja2V0cyBmb3IgY29tbXVuaWNhdGluZyBiZXR3ZWVuIGEgdXNlciBzcGFjZQorICogYXBwbGljYXRpb24gYW5kIHRoZSBkcml2ZXIuIEFmdGVyIGEgdHJhbnNtaXQgaXQgc2VuZHMgYSBwYWNrZXQgd2l0aCBwcm90b2NvbAorICogYnl0ZSAwIGJhY2sgdXAgdG8gdGhlIHVzZXJzcGFjZSBjb250YWluaW5nIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIHBhY2tldAorICogcGx1cyB0aGUgdHJhbnNtaXQtc3RhdHVzIG9uIHRoZSBBcmNOZXQuCisgKgorICogV3JpdHRlbiAyMDAyLTQgYnkgRXNiZW4gTmllbHNlbiwgVmVzdGFzIFdpbmQgU3lzdGVtcyBBL1MKKyAqIERlcml2ZWQgZnJvbSBhcmMtcmF3bW9kZS5jIGJ5IEF2ZXJ5IFBlbm5hcnVuLgorICogYXJjLXJhd21vZGUgd2FzIGluIHR1cm5lZCBiYXNlZCBvbiBza2VsZXRvbi5jLCBzZWUgYmVsb3cuCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoZSBvcmlnaW5hbCBjb3B5cmlnaHQgb2Ygc2tlbGV0b24uYyB3YXMgYXMgZm9sbG93czoKKyAqCisgKiBza2VsZXRvbi5jIFdyaXR0ZW4gMTk5MyBieSBEb25hbGQgQmVja2VyLgorICogQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICogRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4gIFRoaXMgc29mdHdhcmUgbWF5IG9ubHkgYmUgdXNlZAorICogYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBtb2RpZmllZCBieSBTUkMsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgZHJpdmVycy9uZXQvYXJjbmV0LmMKKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYXJjZGV2aWNlLmg+CisKKyNkZWZpbmUgVkVSU0lPTiAiYXJjbmV0OiBjYXAgbW9kZSAoYGMnKSBlbmNhcHN1bGF0aW9uIHN1cHBvcnQgbG9hZGVkLlxuIgorCisKK3N0YXRpYyB2b2lkIHJ4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZudW0sCisJICAgICAgIHN0cnVjdCBhcmNoZHIgKnBrdGhkciwgaW50IGxlbmd0aCk7CitzdGF0aWMgaW50IGJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXVuc2lnbmVkIHNob3J0IHR5cGUsCisJCQl1aW50OF90IGRhZGRyKTsKK3N0YXRpYyBpbnQgcHJlcGFyZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgYXJjaGRyICpwa3QsIGludCBsZW5ndGgsCisJCSAgICAgIGludCBidWZudW0pOworc3RhdGljIGludCBhY2tfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFja2VkKTsKKworCitzdHJ1Y3QgQXJjUHJvdG8gY2FwbW9kZV9wcm90byA9Cit7CisJJ3InLAorCVhNVFUsCisJMCwKKyAgICAgICAJcngsCisJYnVpbGRfaGVhZGVyLAorCXByZXBhcmVfdHgsCisJTlVMTCwKKwlhY2tfdHgKK307CisKKwordm9pZCBhcmNuZXRfY2FwX2luaXQodm9pZCkKK3sKKwlpbnQgY291bnQ7CisKKwlmb3IgKGNvdW50ID0gMTsgY291bnQgPD0gODsgY291bnQrKykKKwkJaWYgKGFyY19wcm90b19tYXBbY291bnRdID09IGFyY19wcm90b19kZWZhdWx0KQorCQkJYXJjX3Byb3RvX21hcFtjb3VudF0gPSAmY2FwbW9kZV9wcm90bzsKKworCS8qIGZvciBjYXAgbW9kZSwgd2Ugb25seSBzZXQgdGhlIGJjYXN0IHByb3RvIGlmIHRoZXJlJ3Mgbm8gYmV0dGVyIG9uZSAqLworCWlmIChhcmNfYmNhc3RfcHJvdG8gPT0gYXJjX3Byb3RvX2RlZmF1bHQpCisJCWFyY19iY2FzdF9wcm90byA9ICZjYXBtb2RlX3Byb3RvOworCisJYXJjX3Byb3RvX2RlZmF1bHQgPSAmY2FwbW9kZV9wcm90bzsKKwlhcmNfcmF3X3Byb3RvID0gJmNhcG1vZGVfcHJvdG87Cit9CisKKworI2lmZGVmIE1PRFVMRQorCitpbnQgX19pbml0IGluaXRfbW9kdWxlKHZvaWQpCit7CisJcHJpbnRrKFZFUlNJT04pOworCWFyY25ldF9jYXBfaW5pdCgpOworCXJldHVybiAwOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJYXJjbmV0X3VucmVnaXN0ZXJfcHJvdG8oJmNhcG1vZGVfcHJvdG8pOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisjZW5kaWYJCQkJLyogTU9EVUxFICovCisKKworCisvKiBwYWNrZXQgcmVjZWl2ZXIgKi8KK3N0YXRpYyB2b2lkIHJ4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZudW0sCisJICAgICAgIHN0cnVjdCBhcmNoZHIgKnBrdGhkciwgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IChzdHJ1Y3QgYXJjbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBhcmNoZHIgKnBrdCA9IHBrdGhkcjsKKwljaGFyICpwa3RidWYsICpwa3RoZHJidWY7CisJaW50IG9mczsKKworCUJVR01TRyhEX0RVUklORywgIml0J3MgYSByYXcoY2FwKSBwYWNrZXQgKGxlbmd0aD0lZClcbiIsIGxlbmd0aCk7CisKKwlpZiAobGVuZ3RoID49IE1pblRVKQorCQlvZnMgPSA1MTIgLSBsZW5ndGg7CisJZWxzZQorCQlvZnMgPSAyNTYgLSBsZW5ndGg7CisKKwlza2IgPSBhbGxvY19za2IobGVuZ3RoICsgQVJDX0hEUl9TSVpFICsgc2l6ZW9mKGludCksIEdGUF9BVE9NSUMpOworCWlmIChza2IgPT0gTlVMTCkgeworCQlCVUdNU0coRF9OT1JNQUwsICJNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIik7CisJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXJldHVybjsKKwl9CisJc2tiX3B1dChza2IsIGxlbmd0aCArIEFSQ19IRFJfU0laRSArIHNpemVvZihpbnQpKTsKKwlza2ItPmRldiA9IGRldjsKKworCXBrdCA9IChzdHJ1Y3QgYXJjaGRyICopIHNrYi0+ZGF0YTsKKworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2JfcHVsbChza2IsIEFSQ19IRFJfU0laRSk7CisKKwkvKiB1cCB0byBzaXplb2YocGt0LT5zb2Z0KSBoYXMgYWxyZWFkeSBiZWVuIGNvcGllZCBmcm9tIHRoZSBjYXJkICovCisJLyogc3F1ZWV6ZSBpbiBhbiBpbnQgZm9yIHRoZSBjYXAgZW5jYXBzdWxhdGlvbiAqLworCisJLyogdXNlIHRoZXNlIHZhcmlhYmxlcyB0byBiZSBzdXJlIHdlIGNvdW50IGluIGJ5dGVzLCBub3QgaW4KKwkgICBzaXplb2Yoc3RydWN0IGFyY2hkcikgKi8KKwlwa3RidWY9KGNoYXIqKXBrdDsKKwlwa3RoZHJidWY9KGNoYXIqKXBrdGhkcjsKKwltZW1jcHkocGt0YnVmLCBwa3RoZHJidWYsIEFSQ19IRFJfU0laRStzaXplb2YocGt0LT5zb2Z0LmNhcC5wcm90bykpOworCW1lbWNweShwa3RidWYrQVJDX0hEUl9TSVpFK3NpemVvZihwa3QtPnNvZnQuY2FwLnByb3RvKStzaXplb2YoaW50KSwKKwkgICAgICAgcGt0aGRyYnVmK0FSQ19IRFJfU0laRStzaXplb2YocGt0LT5zb2Z0LmNhcC5wcm90byksCisJICAgICAgIHNpemVvZihzdHJ1Y3QgYXJjaGRyKS1BUkNfSERSX1NJWkUtc2l6ZW9mKHBrdC0+c29mdC5jYXAucHJvdG8pKTsKKworCWlmIChsZW5ndGggPiBzaXplb2YocGt0LT5zb2Z0KSkKKwkJbHAtPmh3LmNvcHlfZnJvbV9jYXJkKGRldiwgYnVmbnVtLCBvZnMgKyBzaXplb2YocGt0LT5zb2Z0KSwKKwkJCQkgICAgICBwa3QtPnNvZnQucmF3ICsgc2l6ZW9mKHBrdC0+c29mdCkKKwkJCQkgICAgICArIHNpemVvZihpbnQpLAorCQkJCSAgICAgIGxlbmd0aCAtIHNpemVvZihwa3QtPnNvZnQpKTsKKworCUJVR0xWTChEX1NLQikgYXJjbmV0X2R1bXBfc2tiKGRldiwgc2tiLCAicngiKTsKKworCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0FSQ05FVCk7Cis7CisJbmV0aWZfcngoc2tiKTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworfQorCisKKy8qCisgKiBDcmVhdGUgdGhlIEFSQ25ldCBoYXJkL3NvZnQgaGVhZGVycyBmb3IgY2FwIG1vZGUuCisgKiBUaGVyZSBhcmVuJ3QgYW55IHNvZnQgaGVhZGVycyBpbiBjYXAgbW9kZSAtIG5vdCBldmVuIHRoZSBwcm90b2NvbCBpZC4KKyAqLworc3RhdGljIGludCBidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQl1bnNpZ25lZCBzaG9ydCB0eXBlLAorCQkJdWludDhfdCBkYWRkcikKK3sKKwlpbnQgaGRyX3NpemUgPSBBUkNfSERSX1NJWkU7CisJc3RydWN0IGFyY2hkciAqcGt0ID0gKHN0cnVjdCBhcmNoZHIgKikgc2tiX3B1c2goc2tiLCBoZHJfc2l6ZSk7CisKKwlCVUdNU0coRF9QUk9UTywgIlByZXBhcmluZyBoZWFkZXIgZm9yIGNhcCBwYWNrZXQgJXguXG4iLAorCSAgICAgICAqKChpbnQqKSZwa3QtPnNvZnQuY2FwLmNvb2tpZVswXSkpOworCS8qCisJICogU2V0IHRoZSBzb3VyY2UgaGFyZHdhcmUgYWRkcmVzcy4KKwkgKgorCSAqIFRoaXMgaXMgcHJldHR5IHBvaW50bGVzcyBmb3IgbW9zdCBwdXJwb3NlcywgYnV0IGl0IGNhbiBoZWxwIGluCisJICogZGVidWdnaW5nLiAgQVJDbmV0IGRvZXMgbm90IGFsbG93IHVzIHRvIGNoYW5nZSB0aGUgc291cmNlIGFkZHJlc3MgaW4KKwkgKiB0aGUgYWN0dWFsIHBhY2tldCBzZW50KQorCSAqLworCXBrdC0+aGFyZC5zb3VyY2UgPSAqZGV2LT5kZXZfYWRkcjsKKworCS8qIHNlZSBsaW51eC9uZXQvZXRoZXJuZXQvZXRoLmMgdG8gc2VlIHdoZXJlIEkgZ290IHRoZSBmb2xsb3dpbmcgKi8KKworCWlmIChkZXYtPmZsYWdzICYgKElGRl9MT09QQkFDSyB8IElGRl9OT0FSUCkpIHsKKwkJLyoKKwkJICogRklYTUU6IGZpbGwgaW4gdGhlIGxhc3QgYnl0ZSBvZiB0aGUgZGVzdCBpcGFkZHIgaGVyZSB0byBiZXR0ZXIKKwkJICogY29tcGx5IHdpdGggUkZDMTA1MSBpbiAibm9hcnAiIG1vZGUuCisJCSAqLworCQlwa3QtPmhhcmQuZGVzdCA9IDA7CisJCXJldHVybiBoZHJfc2l6ZTsKKwl9CisJLyogb3RoZXJ3aXNlLCBqdXN0IGZpbGwgaXQgaW4gYW5kIGdvISAqLworCXBrdC0+aGFyZC5kZXN0ID0gZGFkZHI7CisKKwlyZXR1cm4gaGRyX3NpemU7CS8qIHN1Y2Nlc3MgKi8KK30KKworCitzdGF0aWMgaW50IHByZXBhcmVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGFyY2hkciAqcGt0LCBpbnQgbGVuZ3RoLAorCQkgICAgICBpbnQgYnVmbnVtKQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gKHN0cnVjdCBhcmNuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXN0cnVjdCBhcmNfaGFyZHdhcmUgKmhhcmQgPSAmcGt0LT5oYXJkOworCWludCBvZnM7CisKKworCS8qIGhhcmQgaGVhZGVyIGlzIG5vdCBpbmNsdWRlZCBpbiBwYWNrZXQgbGVuZ3RoICovCisJbGVuZ3RoIC09IEFSQ19IRFJfU0laRTsKKwkvKiBBbmQgbmVpdGhlciBpcyB0aGUgY29va2llIGZpZWxkICovCisJbGVuZ3RoIC09IHNpemVvZihpbnQpOworCisJQlVHTVNHKERfRFVSSU5HLCAicHJlcGFyZV90eDogdHhidWZzPSVkLyVkLyVkXG4iLAorCSAgICAgICBscC0+bmV4dF90eCwgbHAtPmN1cl90eCwgYnVmbnVtKTsKKworCUJVR01TRyhEX1BST1RPLCAiU2VuZGluZyBmb3IgY2FwIHBhY2tldCAleC5cbiIsCisJICAgICAgICooKGludCopJnBrdC0+c29mdC5jYXAuY29va2llWzBdKSk7CisKKwlpZiAobGVuZ3RoID4gWE1UVSkgeworCQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuISBvdGhlciBwZW9wbGUgYWxyZWFkeSBjaGVjayBmb3IgdGhpcy4gKi8KKwkJQlVHTVNHKERfTk9STUFMLCAiQnVnISAgcHJlcGFyZV90eCB3aXRoIHNpemUgJWQgKD4gJWQpXG4iLAorCQkgICAgICAgbGVuZ3RoLCBYTVRVKTsKKwkJbGVuZ3RoID0gWE1UVTsKKwl9CisJaWYgKGxlbmd0aCA+IE1pblRVKSB7CisJCWhhcmQtPm9mZnNldFswXSA9IDA7CisJCWhhcmQtPm9mZnNldFsxXSA9IG9mcyA9IDUxMiAtIGxlbmd0aDsKKwl9IGVsc2UgaWYgKGxlbmd0aCA+IE1UVSkgeworCQloYXJkLT5vZmZzZXRbMF0gPSAwOworCQloYXJkLT5vZmZzZXRbMV0gPSBvZnMgPSA1MTIgLSBsZW5ndGggLSAzOworCX0gZWxzZQorCQloYXJkLT5vZmZzZXRbMF0gPSBvZnMgPSAyNTYgLSBsZW5ndGg7CisKKwlCVUdNU0coRF9EVVJJTkcsICJwcmVwYXJlX3R4OiBsZW5ndGg9JWQgb2ZzPSVkXG4iLAorCSAgICAgICBsZW5ndGgsb2ZzKTsKKworCS8vIENvcHkgdGhlIGFyY25ldC1oZWFkZXIgKyB0aGUgcHJvdG9jb2wgYnl0ZSBkb3duOgorCWxwLT5ody5jb3B5X3RvX2NhcmQoZGV2LCBidWZudW0sIDAsIGhhcmQsIEFSQ19IRFJfU0laRSk7CisJbHAtPmh3LmNvcHlfdG9fY2FyZChkZXYsIGJ1Zm51bSwgb2ZzLCAmcGt0LT5zb2Z0LmNhcC5wcm90bywKKwkJCSAgICBzaXplb2YocGt0LT5zb2Z0LmNhcC5wcm90bykpOworCisJLy8gU2tpcCB0aGUgZXh0cmEgaW50ZWdlciB3ZSBoYXZlIHdyaXR0ZW4gaW50byBpdCBhcyBhIGNvb2tpZQorCS8vIGJ1dCB3cml0ZSB0aGUgcmVzdCBvZiB0aGUgbWVzc2FnZToKKwlscC0+aHcuY29weV90b19jYXJkKGRldiwgYnVmbnVtLCBvZnMrMSwKKwkJCSAgICAoKHVuc2lnbmVkIGNoYXIqKSZwa3QtPnNvZnQuY2FwLm1lcyksbGVuZ3RoLTEpOworCisJbHAtPmxhc3Rsb2FkX2Rlc3QgPSBoYXJkLT5kZXN0OworCisJcmV0dXJuIDE7CQkvKiBkb25lICovCit9CisKKworc3RhdGljIGludCBhY2tfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFja2VkKQoreworICBzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IChzdHJ1Y3QgYXJjbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKyAgc3RydWN0IHNrX2J1ZmYgKmFja3NrYjsKKyAgc3RydWN0IGFyY2hkciAqYWNrcGt0OworICBpbnQgbGVuZ3RoPXNpemVvZihzdHJ1Y3QgYXJjX2NhcCk7CisKKyAgQlVHTVNHKERfRFVSSU5HLCAiY2FwbW9kZTogYWNrX3R4OiBwcm90b2NvbDogJXg6IHJlc3VsdDogJWRcbiIsCisJIGxwLT5vdXRnb2luZy5za2ItPnByb3RvY29sLCBhY2tlZCk7CisKKyAgQlVHTFZMKERfU0tCKSBhcmNuZXRfZHVtcF9za2IoZGV2LCBscC0+b3V0Z29pbmcuc2tiLCAiYWNrX3R4Iik7CisKKyAgLyogTm93IGFsbG9jIGEgc2tiIHRvIHNlbmQgYmFjayB1cCB0aHJvdWdoIHRoZSBsYXllcnM6ICovCisgIGFja3NrYiA9IGFsbG9jX3NrYihsZW5ndGggKyBBUkNfSERSX1NJWkUgLCBHRlBfQVRPTUlDKTsKKyAgaWYgKGFja3NrYiA9PSBOVUxMKSB7CisJICBCVUdNU0coRF9OT1JNQUwsICJNZW1vcnkgc3F1ZWV6ZSwgY2FuJ3QgYWNrbm93bGVkZ2UuXG4iKTsKKwkgIGdvdG8gZnJlZV9vdXRza2I7CisgIH0KKworICBza2JfcHV0KGFja3NrYiwgbGVuZ3RoICsgQVJDX0hEUl9TSVpFICk7CisgIGFja3NrYi0+ZGV2ID0gZGV2OworCisgIGFja3BrdCA9IChzdHJ1Y3QgYXJjaGRyICopIGFja3NrYi0+ZGF0YTsKKworICBhY2tza2ItPm1hYy5yYXcgPSBhY2tza2ItPmRhdGE7CisgIC8qIHNrYl9wdWxsKGFja3NrYiwgQVJDX0hEUl9TSVpFKTsgKi8KKworCisgIG1lbWNweShhY2twa3QsIGxwLT5vdXRnb2luZy5za2ItPmRhdGEsIEFSQ19IRFJfU0laRStzaXplb2Yoc3RydWN0IGFyY19jYXApKTsKKyAgYWNrcGt0LT5zb2Z0LmNhcC5wcm90bz0wOyAvKiB1c2luZyBwcm90b2NvbCAwIGZvciBhY2tub3dsZWRnZSAqLworICBhY2twa3QtPnNvZnQuY2FwLm1lcy5hY2s9YWNrZWQ7CisKKyAgQlVHTVNHKERfUFJPVE8sICJBY2trbm93bGVkZ2UgZm9yIGNhcCBwYWNrZXQgJXguXG4iLAorCSAqKChpbnQqKSZhY2twa3QtPnNvZnQuY2FwLmNvb2tpZVswXSkpOworCisgIGFja3NrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0FSQ05FVCk7CisKKyAgQlVHTFZMKERfU0tCKSBhcmNuZXRfZHVtcF9za2IoZGV2LCBhY2tza2IsICJhY2tfdHhfcmVjdiIpOworICBuZXRpZl9yeChhY2tza2IpOworCisgZnJlZV9vdXRza2I6CisgIGRldl9rZnJlZV9za2JfaXJxKGxwLT5vdXRnb2luZy5za2IpOworICBscC0+b3V0Z29pbmcucHJvdG8gPSBOVUxMOyAvKiBXZSBhcmUgYWx3YXlzIGZpbmlzaGVkIHdoZW4gaW4gdGhpcyBwcm90b2NvbCAqLworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTIwMDIwLWlzYS5jIGIvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTIwMDIwLWlzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyODllNjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcmNuZXQvY29tMjAwMjAtaXNhLmMKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBMaW51eCBBUkNuZXQgZHJpdmVyIC0gQ09NMjAwMjAgY2hpcHNldCBzdXBwb3J0CisgKiAKKyAqIFdyaXR0ZW4gMTk5NyBieSBEYXZpZCBXb29kaG91c2UuCisgKiBXcml0dGVuIDE5OTQtMTk5OSBieSBBdmVyeSBQZW5uYXJ1bi4KKyAqIFdyaXR0ZW4gMTk5OS0yMDAwIGJ5IE1hcnRpbiBNYXJlcyA8bWpAdWN3LmN6Pi4KKyAqIERlcml2ZWQgZnJvbSBza2VsZXRvbi5jIGJ5IERvbmFsZCBCZWNrZXIuCisgKgorICogU3BlY2lhbCB0aGFua3MgdG8gQ29udGVtcG9yYXJ5IENvbnRyb2xzLCBJbmMuICh3d3cuY2NvbnRyb2xzLmNvbSkKKyAqICBmb3Igc3BvbnNvcmluZyB0aGUgZnVydGhlciBkZXZlbG9wbWVudCBvZiB0aGlzIGRyaXZlci4KKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlIG9yaWdpbmFsIGNvcHlyaWdodCBvZiBza2VsZXRvbi5jIHdhcyBhcyBmb2xsb3dzOgorICoKKyAqIHNrZWxldG9uLmMgV3JpdHRlbiAxOTkzIGJ5IERvbmFsZCBCZWNrZXIuCisgKiBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgKiBEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LiAgVGhpcyBzb2Z0d2FyZSBtYXkgb25seSBiZSB1c2VkCisgKiBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIG1vZGlmaWVkIGJ5IFNSQywgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZvciBtb3JlIGRldGFpbHMsIHNlZSBkcml2ZXJzL25ldC9hcmNuZXQuYworICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvYXJjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY29tMjAwMjAuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIFZFUlNJT04gImFyY25ldDogQ09NMjAwMjAgSVNBIHN1cHBvcnQgKGJ5IERhdmlkIFdvb2Rob3VzZSBldCBhbC4pXG4iCisKKworLyoKKyAqIFdlIGNhbm5vdCAoeWV0KSBwcm9iZSBmb3IgYW4gSU8gbWFwcGVkIGNhcmQsIGFsdGhvdWdoIHdlIGNhbiBjaGVjayB0aGF0CisgKiBpdCdzIHdoZXJlIHdlIHdlcmUgdG9sZCBpdCB3YXMsIGFuZCBldmVuIGRvIGF1dG9pcnEuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGNvbTIwMDIwaXNhX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkcjsKKwl1bnNpZ25lZCBsb25nIGFpcnFtYXNrOworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWludCBlcnI7CisKKwlCVUdMVkwoRF9OT1JNQUwpIHByaW50ayhWRVJTSU9OKTsKKworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWlmICghaW9hZGRyKSB7CisJCUJVR01TRyhEX05PUk1BTCwgIk5vIGF1dG9wcm9iZSAoeWV0KSBmb3IgSU8gbWFwcGVkIGNhcmRzOyB5b3UgIgorCQkgICAgICAgIm11c3Qgc3BlY2lmeSB0aGUgYmFzZSBhZGRyZXNzIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgQVJDTkVUX1RPVEFMX1NJWkUsICJhcmNuZXQgKENPTTIwMDIwKSIpKSB7CisJCUJVR01TRyhEX05PUk1BTCwgIklPIHJlZ2lvbiAleGgtJXhoIGFscmVhZHkgYWxsb2NhdGVkLlxuIiwKKwkJICAgICAgIGlvYWRkciwgaW9hZGRyICsgQVJDTkVUX1RPVEFMX1NJWkUgLSAxKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJaWYgKEFTVEFUVVMoKSA9PSAweEZGKSB7CisJCUJVR01TRyhEX05PUk1BTCwgIklPIGFkZHJlc3MgJXggZW1wdHlcbiIsIGlvYWRkcik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoY29tMjAwMjBfY2hlY2soZGV2KSkgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWRldi0+aXJxKSB7CisJCS8qIGlmIHdlIGRvIHRoaXMsIHdlJ3JlIHN1cmUgdG8gZ2V0IGFuIElSUSBzaW5jZSB0aGUKKwkJICogY2FyZCBoYXMganVzdCByZXNldCBhbmQgdGhlIE5PUlhmbGFnIGlzIG9uIHVudGlsCisJCSAqIHdlIHRlbGwgaXQgdG8gc3RhcnQgcmVjZWl2aW5nLgorCQkgKi8KKwkJQlVHTVNHKERfSU5JVF9SRUFTT05TLCAiaW50bWFzayB3YXMgJTAyWGhcbiIsIGluYihfSU5UTUFTSykpOworCQlvdXRiKDAsIF9JTlRNQVNLKTsKKwkJYWlycW1hc2sgPSBwcm9iZV9pcnFfb24oKTsKKwkJb3V0YihOT1JYZmxhZywgX0lOVE1BU0spOworCQl1ZGVsYXkoMSk7CisJCW91dGIoMCwgX0lOVE1BU0spOworCQlkZXYtPmlycSA9IHByb2JlX2lycV9vZmYoYWlycW1hc2spOworCisJCWlmIChkZXYtPmlycSA8PSAwKSB7CisJCQlCVUdNU0coRF9JTklUX1JFQVNPTlMsICJBdXRvcHJvYmUgSVJRIGZhaWxlZCBmaXJzdCB0aW1lXG4iKTsKKwkJCWFpcnFtYXNrID0gcHJvYmVfaXJxX29uKCk7CisJCQlvdXRiKE5PUlhmbGFnLCBfSU5UTUFTSyk7CisJCQl1ZGVsYXkoNSk7CisJCQlvdXRiKDAsIF9JTlRNQVNLKTsKKwkJCWRldi0+aXJxID0gcHJvYmVfaXJxX29mZihhaXJxbWFzayk7CisJCQlpZiAoZGV2LT5pcnEgPD0gMCkgeworCQkJCUJVR01TRyhEX05PUk1BTCwgIkF1dG9wcm9iZSBJUlEgZmFpbGVkLlxuIik7CisJCQkJZXJyID0gLUVOT0RFVjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KKworCWxwLT5jYXJkX25hbWUgPSAiSVNBIENPTTIwMDIwIjsKKwlpZiAoKGVyciA9IGNvbTIwMDIwX2ZvdW5kKGRldiwgMCkpICE9IDApCisJCWdvdG8gb3V0OworCisJcmV0dXJuIDA7CisKK291dDoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEFSQ05FVF9UT1RBTF9TSVpFKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG5vZGUgPSAwOworc3RhdGljIGludCBpbyA9IDB4MDsJCS8qIDwtLS0gRURJVCBUSEVTRSBMSU5FUyBGT1IgWU9VUiBDT05GSUdVUkFUSU9OICovCitzdGF0aWMgaW50IGlycSA9IDA7CQkvKiBvciB1c2UgdGhlIGluc21vZCBpbz0gaXJxPSBzaG1lbT0gb3B0aW9ucyAqLworc3RhdGljIGNoYXIgZGV2aWNlWzldOwkJLyogdXNlIGVnLiBkZXZpY2U9ImFyYzEiIHRvIGNoYW5nZSBuYW1lICovCitzdGF0aWMgaW50IHRpbWVvdXQgPSAzOworc3RhdGljIGludCBiYWNrcGxhbmUgPSAwOworc3RhdGljIGludCBjbG9ja3AgPSAwOworc3RhdGljIGludCBjbG9ja20gPSAwOworCittb2R1bGVfcGFyYW0obm9kZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW1fc3RyaW5nKGRldmljZSwgZGV2aWNlLCBzaXplb2YoZGV2aWNlKSwgMCk7Cittb2R1bGVfcGFyYW0odGltZW91dCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShiYWNrcGxhbmUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY2xvY2twLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGNsb2NrbSwgaW50LCAwKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKm15X2RldjsKKworc3RhdGljIGludCBfX2luaXQgY29tMjAwMjBfaW5pdCh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHA7CisKKwlkZXYgPSBhbGxvY19hcmNkZXYoZGV2aWNlKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAobm9kZSAmJiBub2RlICE9IDB4ZmYpCisJCWRldi0+ZGV2X2FkZHJbMF0gPSBub2RlOworCisJbHAgPSBkZXYtPnByaXY7CisJbHAtPmJhY2twbGFuZSA9IGJhY2twbGFuZTsKKwlscC0+Y2xvY2twID0gY2xvY2twICYgNzsKKwlscC0+Y2xvY2ttID0gY2xvY2ttICYgMzsKKwlscC0+dGltZW91dCA9IHRpbWVvdXQgJiAzOworCWxwLT5ody5vd25lciA9IFRISVNfTU9EVUxFOworCisJZGV2LT5iYXNlX2FkZHIgPSBpbzsKKwlkZXYtPmlycSA9IGlycTsKKworCWlmIChkZXYtPmlycSA9PSAyKQorCQlkZXYtPmlycSA9IDk7CisKKwlpZiAoY29tMjAwMjBpc2FfcHJvYmUoZGV2KSkgeworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlteV9kZXYgPSBkZXY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjb20yMDAyMF9leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYobXlfZGV2KTsKKwlmcmVlX2lycShteV9kZXYtPmlycSwgbXlfZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihteV9kZXYtPmJhc2VfYWRkciwgQVJDTkVUX1RPVEFMX1NJWkUpOworCWZyZWVfbmV0ZGV2KG15X2Rldik7Cit9CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBjb20yMDAyMGlzYV9zZXR1cChjaGFyICpzKQoreworCWludCBpbnRzWzhdOworCisJcyA9IGdldF9vcHRpb25zKHMsIDgsIGludHMpOworCWlmICghaW50c1swXSkKKwkJcmV0dXJuIDE7CisKKwlzd2l0Y2ggKGludHNbMF0pIHsKKwlkZWZhdWx0OgkJLyogRVJST1IgKi8KKwkJcHJpbnRrKCJjb205MHh4OiBUb28gbWFueSBhcmd1bWVudHMuXG4iKTsKKwljYXNlIDY6CQkvKiBUaW1lb3V0ICovCisJCXRpbWVvdXQgPSBpbnRzWzZdOworCWNhc2UgNToJCS8qIENLUCB2YWx1ZSAqLworCQljbG9ja3AgPSBpbnRzWzVdOworCWNhc2UgNDoJCS8qIEJhY2twbGFuZSBmbGFnICovCisJCWJhY2twbGFuZSA9IGludHNbNF07CisJY2FzZSAzOgkJLyogTm9kZSBJRCAqLworCQlub2RlID0gaW50c1szXTsKKwljYXNlIDI6CQkvKiBJUlEgKi8KKwkJaXJxID0gaW50c1syXTsKKwljYXNlIDE6CQkvKiBJTyBhZGRyZXNzICovCisJCWlvID0gaW50c1sxXTsKKwl9CisJaWYgKCpzKQorCQlzbnByaW50ZihkZXZpY2UsIHNpemVvZihkZXZpY2UpLCAiJXMiLCBzKTsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiY29tMjAwMjA9IiwgY29tMjAwMjBpc2Ffc2V0dXApOworCisjZW5kaWYJCQkJLyogTU9EVUxFICovCisKK21vZHVsZV9pbml0KGNvbTIwMDIwX2luaXQpCittb2R1bGVfZXhpdChjb20yMDAyMF9leGl0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTIwMDIwLXBjaS5jIGIvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTIwMDIwLXBjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NjM2Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcmNuZXQvY29tMjAwMjAtcGNpLmMKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBMaW51eCBBUkNuZXQgZHJpdmVyIC0gQ09NMjAwMjAgUENJIHN1cHBvcnQKKyAqIENvbnRlbXBvcmFyeSBDb250cm9scyBQQ0kyMCBhbmQgU09IQVJEIFNILUFSQyBQQ0kKKyAqIAorICogV3JpdHRlbiAxOTk0LTE5OTkgYnkgQXZlcnkgUGVubmFydW4sCisgKiAgICBiYXNlZCBvbiBhbiBJU0EgdmVyc2lvbiBieSBEYXZpZCBXb29kaG91c2UuCisgKiBXcml0dGVuIDE5OTktMjAwMCBieSBNYXJ0aW4gTWFyZXMgPG1qQHVjdy5jej4uCisgKiBEZXJpdmVkIGZyb20gc2tlbGV0b24uYyBieSBEb25hbGQgQmVja2VyLgorICoKKyAqIFNwZWNpYWwgdGhhbmtzIHRvIENvbnRlbXBvcmFyeSBDb250cm9scywgSW5jLiAod3d3LmNjb250cm9scy5jb20pCisgKiAgZm9yIHNwb25zb3JpbmcgdGhlIGZ1cnRoZXIgZGV2ZWxvcG1lbnQgb2YgdGhpcyBkcml2ZXIuCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoZSBvcmlnaW5hbCBjb3B5cmlnaHQgb2Ygc2tlbGV0b24uYyB3YXMgYXMgZm9sbG93czoKKyAqCisgKiBza2VsZXRvbi5jIFdyaXR0ZW4gMTk5MyBieSBEb25hbGQgQmVja2VyLgorICogQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICogRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4gIFRoaXMgc29mdHdhcmUgbWF5IG9ubHkgYmUgdXNlZAorICogYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBtb2RpZmllZCBieSBTUkMsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgZHJpdmVycy9uZXQvYXJjbmV0LmMKKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2FyY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbTIwMDIwLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworCisjZGVmaW5lIFZFUlNJT04gImFyY25ldDogQ09NMjAwMjAgUENJIHN1cHBvcnRcbiIKKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KKworc3RhdGljIGludCBub2RlOworc3RhdGljIGNoYXIgZGV2aWNlWzldOwkJLyogdXNlIGVnLiBkZXZpY2U9ImFyYzEiIHRvIGNoYW5nZSBuYW1lICovCitzdGF0aWMgaW50IHRpbWVvdXQgPSAzOworc3RhdGljIGludCBiYWNrcGxhbmU7CitzdGF0aWMgaW50IGNsb2NrcDsKK3N0YXRpYyBpbnQgY2xvY2ttOworCittb2R1bGVfcGFyYW0obm9kZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9zdHJpbmcoZGV2aWNlLCBkZXZpY2UsIHNpemVvZihkZXZpY2UpLCAwKTsKK21vZHVsZV9wYXJhbSh0aW1lb3V0LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGJhY2twbGFuZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjbG9ja3AsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY2xvY2ttLCBpbnQsIDApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjb20yMDAyMHBjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHA7CisJaW50IGlvYWRkciwgZXJyOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlyZXR1cm4gLUVJTzsKKwlkZXYgPSBhbGxvY19hcmNkZXYoZGV2aWNlKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisJbHAgPSBkZXYtPnByaXY7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCS8vIFNPSEFSRCBuZWVkcyBQQ0kgYmFzZSBhZGRyIDQKKwlpZiAocGRldi0+dmVuZG9yPT0weDEwQjUpIHsKKwkJQlVHTVNHKERfTk9STUFMLCAiU09IQVJEXG4iKTsKKwkJaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDQpOworCX0KKwllbHNlIHsKKwkJQlVHTVNHKERfTk9STUFMLCAiQ29udGVtcG9yYXJ5IENvbnRyb2xzXG4iKTsKKwkJaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpOworCX0KKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBBUkNORVRfVE9UQUxfU0laRSwgImNvbTIwMDIwLXBjaSIpKSB7CisJCUJVR01TRyhEX0lOSVQsICJJTyByZWdpb24gJXhoLSV4aCBhbHJlYWR5IGFsbG9jYXRlZC5cbiIsCisJCSAgICAgICBpb2FkZHIsIGlvYWRkciArIEFSQ05FVF9UT1RBTF9TSVpFIC0gMSk7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXRfZGV2OworCX0KKworCS8vIER1bW15IGFjY2VzcyBhZnRlciBSZXNldAorCS8vIEFSQ05FVCBjb250cm9sbGVyIG5lZWRzIHRoaXMgYWNjZXNzIHRvIGRldGVjdCBidXN0eXBlCisJb3V0YigweDAwLGlvYWRkcisxKTsKKwlpbmIoaW9hZGRyKzEpOworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJZGV2LT5kZXZfYWRkclswXSA9IG5vZGU7CisJbHAtPmNhcmRfbmFtZSA9ICJQQ0kgQ09NMjAwMjAiOworCWxwLT5jYXJkX2ZsYWdzID0gaWQtPmRyaXZlcl9kYXRhOworCWxwLT5iYWNrcGxhbmUgPSBiYWNrcGxhbmU7CisJbHAtPmNsb2NrcCA9IGNsb2NrcCAmIDc7CisJbHAtPmNsb2NrbSA9IGNsb2NrbSAmIDM7CisJbHAtPnRpbWVvdXQgPSB0aW1lb3V0OworCWxwLT5ody5vd25lciA9IFRISVNfTU9EVUxFOworCisJaWYgKEFTVEFUVVMoKSA9PSAweEZGKSB7CisJCUJVR01TRyhEX05PUk1BTCwgIklPIGFkZHJlc3MgJVhoIHdhcyByZXBvcnRlZCBieSBQQ0kgQklPUywgIgorCQkgICAgICAgImJ1dCBzZWVtcyBlbXB0eSFcbiIsIGlvYWRkcik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0X3BvcnQ7CisJfQorCWlmIChjb20yMDAyMF9jaGVjayhkZXYpKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0X3BvcnQ7CisJfQorCisJaWYgKChlcnIgPSBjb20yMDAyMF9mb3VuZChkZXYsIFNBX1NISVJRKSkgIT0gMCkKKwkgICAgICAgIGdvdG8gb3V0X3BvcnQ7CisKKwlyZXR1cm4gMDsKKworb3V0X3BvcnQ6CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBBUkNORVRfVE9UQUxfU0laRSk7CitvdXRfZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGNvbTIwMDIwcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEFSQ05FVF9UT1RBTF9TSVpFKTsKKwlmcmVlX25ldGRldihkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY29tMjAwMjBwY2lfaWRfdGFibGVbXSA9IHsKKwl7IDB4MTU3MSwgMHhhMDAxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyAweDE1NzEsIDB4YTAwMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgMHgxNTcxLCAweGEwMDMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IDB4MTU3MSwgMHhhMDA0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyAweDE1NzEsIDB4YTAwNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgMHgxNTcxLCAweGEwMDYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IDB4MTU3MSwgMHhhMDA3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyAweDE1NzEsIDB4YTAwOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgMHgxNTcxLCAweGEwMDksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEFSQ19JU181TUJJVCB9LAorCXsgMHgxNTcxLCAweGEwMGEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEFSQ19JU181TUJJVCB9LAorCXsgMHgxNTcxLCAweGEwMGIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEFSQ19JU181TUJJVCB9LAorCXsgMHgxNTcxLCAweGEwMGMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEFSQ19JU181TUJJVCB9LAorCXsgMHgxNTcxLCAweGEwMGQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEFSQ19JU181TUJJVCB9LAorCXsgMHgxNTcxLCAweGEyMDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEFSQ19DQU5fMTBNQklUIH0sCisJeyAweDE1NzEsIDB4YTIwMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVJDX0NBTl8xME1CSVQgfSwKKwl7IDB4MTU3MSwgMHhhMjAzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBBUkNfQ0FOXzEwTUJJVCB9LAorCXsgMHgxNTcxLCAweGEyMDQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEFSQ19DQU5fMTBNQklUIH0sCisJeyAweDE1NzEsIDB4YTIwNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVJDX0NBTl8xME1CSVQgfSwKKwl7IDB4MTU3MSwgMHhhMjA2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBBUkNfQ0FOXzEwTUJJVCB9LAorCXsgMHgxMEI1LCAweDkwNTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEFSQ19DQU5fMTBNQklUIH0sCisJezAsfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGNvbTIwMDIwcGNpX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGNvbTIwMDIwcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiY29tMjAwMjAiLAorCS5pZF90YWJsZQk9IGNvbTIwMDIwcGNpX2lkX3RhYmxlLAorCS5wcm9iZQkJPSBjb20yMDAyMHBjaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGNvbTIwMDIwcGNpX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjb20yMDAyMHBjaV9pbml0KHZvaWQpCit7CisJQlVHTFZMKERfTk9STUFMKSBwcmludGsoVkVSU0lPTik7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmY29tMjAwMjBwY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNvbTIwMDIwcGNpX2NsZWFudXAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmNvbTIwMDIwcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGNvbTIwMDIwcGNpX2luaXQpCittb2R1bGVfZXhpdChjb20yMDAyMHBjaV9jbGVhbnVwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTIwMDIwLmMgYi9kcml2ZXJzL25ldC9hcmNuZXQvY29tMjAwMjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGM3MGM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTIwMDIwLmMKQEAgLTAsMCArMSwzNTcgQEAKKy8qCisgKiBMaW51eCBBUkNuZXQgZHJpdmVyIC0gQ09NMjAwMjAgY2hpcHNldCBzdXBwb3J0CisgKiAKKyAqIFdyaXR0ZW4gMTk5NyBieSBEYXZpZCBXb29kaG91c2UuCisgKiBXcml0dGVuIDE5OTQtMTk5OSBieSBBdmVyeSBQZW5uYXJ1bi4KKyAqIFdyaXR0ZW4gMTk5OSBieSBNYXJ0aW4gTWFyZXMgPG1qQHVjdy5jej4uCisgKiBEZXJpdmVkIGZyb20gc2tlbGV0b24uYyBieSBEb25hbGQgQmVja2VyLgorICoKKyAqIFNwZWNpYWwgdGhhbmtzIHRvIENvbnRlbXBvcmFyeSBDb250cm9scywgSW5jLiAod3d3LmNjb250cm9scy5jb20pCisgKiAgZm9yIHNwb25zb3JpbmcgdGhlIGZ1cnRoZXIgZGV2ZWxvcG1lbnQgb2YgdGhpcyBkcml2ZXIuCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoZSBvcmlnaW5hbCBjb3B5cmlnaHQgb2Ygc2tlbGV0b24uYyB3YXMgYXMgZm9sbG93czoKKyAqCisgKiBza2VsZXRvbi5jIFdyaXR0ZW4gMTk5MyBieSBEb25hbGQgQmVja2VyLgorICogQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICogRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4gIFRoaXMgc29mdHdhcmUgbWF5IG9ubHkgYmUgdXNlZAorICogYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBtb2RpZmllZCBieSBTUkMsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgZHJpdmVycy9uZXQvYXJjbmV0LmMKKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FyY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbTIwMDIwLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBWRVJTSU9OICJhcmNuZXQ6IENPTTIwMDIwIGNoaXBzZXQgc3VwcG9ydCAoYnkgRGF2aWQgV29vZGhvdXNlIGV0IGFsLilcbiIKKworc3RhdGljIGNoYXIgKmNsb2NrcmF0ZXNbXSA9Cit7IjEwIE1iL3MiLCAiUmVzZXJ2ZWQiLCAiNSBNYi9zIiwKKyAiMi41IE1iL3MiLCAiMS4yNU1iL3MiLCAiNjI1IEtiL3MiLCAiMzEyLjUgS2IvcyIsCisgIjE1Ni4yNSBLYi9zIiwgIlJlc2VydmVkIiwgIlJlc2VydmVkIiwgIlJlc2VydmVkIn07CisKK3N0YXRpYyB2b2lkIGNvbTIwMDIwX2NvbW1hbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvbW1hbmQpOworc3RhdGljIGludCBjb20yMDAyMF9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBjb20yMDAyMF9zZXRtYXNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtYXNrKTsKK3N0YXRpYyBpbnQgY29tMjAwMjBfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJlYWxseV9yZXNldCk7CitzdGF0aWMgdm9pZCBjb20yMDAyMF9jb3B5X3RvX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSwKKwkJCQkgIGludCBvZmZzZXQsIHZvaWQgKmJ1ZiwgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIGNvbTIwMDIwX2NvcHlfZnJvbV9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZudW0sCisJCQkJICAgIGludCBvZmZzZXQsIHZvaWQgKmJ1ZiwgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIGNvbTIwMDIwX3NldF9tY19saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgY29tMjAwMjBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKik7CisKK3N0YXRpYyB2b2lkIGNvbTIwMDIwX2NvcHlfZnJvbV9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZudW0sCisJCQkJICAgIGludCBvZmZzZXQsIHZvaWQgKmJ1ZiwgaW50IGNvdW50KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciwgb2ZzID0gNTEyICogYnVmbnVtICsgb2Zmc2V0OworCisJLyogc2V0IHVwIHRoZSBhZGRyZXNzIHJlZ2lzdGVyICovCisJb3V0Yigob2ZzID4+IDgpIHwgUkREQVRBZmxhZyB8IEFVVE9JTkNmbGFnLCBfQUREUl9ISSk7CisJb3V0YihvZnMgJiAweGZmLCBfQUREUl9MTyk7CisKKwkvKiBjb3B5IHRoZSBkYXRhICovCisJVElNRSgiaW5zYiIsIGNvdW50LCBpbnNiKF9NRU1EQVRBLCBidWYsIGNvdW50KSk7Cit9CisKKworc3RhdGljIHZvaWQgY29tMjAwMjBfY29weV90b19jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZudW0sCisJCQkJICBpbnQgb2Zmc2V0LCB2b2lkICpidWYsIGludCBjb3VudCkKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIsIG9mcyA9IDUxMiAqIGJ1Zm51bSArIG9mZnNldDsKKworCS8qIHNldCB1cCB0aGUgYWRkcmVzcyByZWdpc3RlciAqLworCW91dGIoKG9mcyA+PiA4KSB8IEFVVE9JTkNmbGFnLCBfQUREUl9ISSk7CisJb3V0YihvZnMgJiAweGZmLCBfQUREUl9MTyk7CisKKwkvKiBjb3B5IHRoZSBkYXRhICovCisJVElNRSgib3V0c2IiLCBjb3VudCwgb3V0c2IoX01FTURBVEEsIGJ1ZiwgY291bnQpKTsKK30KKworCisvKiBSZXNldCB0aGUgY2FyZCBhbmQgY2hlY2sgc29tZSBiYXNpYyBzdHVmZiBkdXJpbmcgdGhlIGRldGVjdGlvbiBzdGFnZS4gKi8KK2ludCBjb20yMDAyMF9jaGVjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciwgc3RhdHVzOworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCisJQVJDUkVTRVQwOworCW1kZWxheShSRVNFVHRpbWUpOworCisJbHAtPnNldHVwID0gbHAtPmNsb2NrbSA/IDAgOiAobHAtPmNsb2NrcCA8PCAxKTsKKwlscC0+c2V0dXAyID0gKGxwLT5jbG9ja20gPDwgNCkgfCA4OworCisJLyogQ0hFQ0s6IHNob3VsZCB3ZSBkbyB0aGlzIGZvciBTT0hBUkQgY2FyZHMgPyAqLworCS8qIEVuYWJsZSBQMU1vZGUgZm9yIGJhY2twbGFuZSBtb2RlICovCisJbHAtPnNldHVwID0gbHAtPnNldHVwIHwgUDFNT0RFOworCisJU0VUX1NVQkFEUihTVUJfU0VUVVAxKTsKKwlvdXRiKGxwLT5zZXR1cCwgX1hSRUcpOworCisJaWYgKGxwLT5jYXJkX2ZsYWdzICYgQVJDX0NBTl8xME1CSVQpCisJeworCQlTRVRfU1VCQURSKFNVQl9TRVRVUDIpOworCQlvdXRiKGxwLT5zZXR1cDIsIF9YUkVHKTsKKwkKKwkJLyogbXVzdCBub3cgd3JpdGUgdGhlIG1hZ2ljICJyZXN0YXJ0IG9wZXJhdGlvbiIgY29tbWFuZCAqLworCQltZGVsYXkoMSk7CisJCW91dGIoMHgxOCwgX0NPTU1BTkQpOworCX0KKworCWxwLT5jb25maWcgPSAweDIxIHwgKGxwLT50aW1lb3V0IDw8IDMpIHwgKGxwLT5iYWNrcGxhbmUgPDwgMik7CisJLyogc2V0IG5vZGUgSUQgdG8gMHg0MiAoYnV0IHRyYW5zbWl0dGVyIGlzIGRpc2FibGVkLCBzbyBpdCdzIG9rYXkpICovCisJU0VUQ09ORjsKKwlvdXRiKDB4NDIsIGlvYWRkciArIEJVU19BTElHTio3KTsKKworCXN0YXR1cyA9IEFTVEFUVVMoKTsKKworCWlmICgoc3RhdHVzICYgMHg5OSkgIT0gKE5PUlhmbGFnIHwgVFhGUkVFZmxhZyB8IFJFU0VUZmxhZykpIHsKKwkJQlVHTVNHKERfTk9STUFMLCAic3RhdHVzIGludmFsaWQgKCVYaCkuXG4iLCBzdGF0dXMpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJQlVHTVNHKERfSU5JVF9SRUFTT05TLCAic3RhdHVzIGFmdGVyIHJlc2V0OiAlWFxuIiwgc3RhdHVzKTsKKworCS8qIEVuYWJsZSBUWCAqLworCW91dGIoMHgzOSwgX0NPTkZJRyk7CisJb3V0YihpbmIoaW9hZGRyICsgQlVTX0FMSUdOKjgpLCBpb2FkZHIgKyBCVVNfQUxJR04qNyk7CisKKwlBQ09NTUFORChDRkxBR1NjbWQgfCBSRVNFVGNsZWFyIHwgQ09ORklHY2xlYXIpOworCisJc3RhdHVzID0gQVNUQVRVUygpOworCUJVR01TRyhEX0lOSVRfUkVBU09OUywgInN0YXR1cyBhZnRlciByZXNldCBhY2tub3dsZWRnZWQ6ICVYXG4iLAorCSAgICAgICBzdGF0dXMpOworCisJLyogUmVhZCBmaXJzdCBsb2NhdGlvbiBvZiBtZW1vcnkgKi8KKwlvdXRiKDAgfCBSRERBVEFmbGFnIHwgQVVUT0lOQ2ZsYWcsIF9BRERSX0hJKTsKKwlvdXRiKDAsIF9BRERSX0xPKTsKKworCWlmICgoc3RhdHVzID0gaW5iKF9NRU1EQVRBKSkgIT0gVEVTVHZhbHVlKSB7CisJCUJVR01TRyhEX05PUk1BTCwgIlNpZ25hdHVyZSBieXRlIG5vdCBmb3VuZCAoJTAyWGggIT0gRDFoKS5cbiIsCisJCSAgICAgICBzdGF0dXMpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCB1cCB0aGUgc3RydWN0IG5ldF9kZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2FyZC4gIENhbGxlZCBhZnRlcgorICogcHJvYmluZyBzdWNjZWVkcy4KKyAqLworaW50IGNvbTIwMDIwX2ZvdW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzaGFyZWQpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHA7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcmVzdCBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKworCWxwID0gZGV2LT5wcml2OworCisJbHAtPmh3Lm93bmVyID0gVEhJU19NT0RVTEU7CisJbHAtPmh3LmNvbW1hbmQgPSBjb20yMDAyMF9jb21tYW5kOworCWxwLT5ody5zdGF0dXMgPSBjb20yMDAyMF9zdGF0dXM7CisJbHAtPmh3LmludG1hc2sgPSBjb20yMDAyMF9zZXRtYXNrOworCWxwLT5ody5yZXNldCA9IGNvbTIwMDIwX3Jlc2V0OworCWxwLT5ody5jb3B5X3RvX2NhcmQgPSBjb20yMDAyMF9jb3B5X3RvX2NhcmQ7CisJbHAtPmh3LmNvcHlfZnJvbV9jYXJkID0gY29tMjAwMjBfY29weV9mcm9tX2NhcmQ7CisJbHAtPmh3LmNsb3NlID0gY29tMjAwMjBfY2xvc2U7CisKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGNvbTIwMDIwX3NldF9tY19saXN0OworCisJaWYgKCFkZXYtPmRldl9hZGRyWzBdKQorCQlkZXYtPmRldl9hZGRyWzBdID0gaW5iKGlvYWRkciArIEJVU19BTElHTio4KTsJLyogRklYTUU6IGRvIHRoaXMgc29tZSBvdGhlciB3YXkhICovCisKKwlTRVRfU1VCQURSKFNVQl9TRVRVUDEpOworCW91dGIobHAtPnNldHVwLCBfWFJFRyk7CisKKwlpZiAobHAtPmNhcmRfZmxhZ3MgJiBBUkNfQ0FOXzEwTUJJVCkKKwl7CisJCVNFVF9TVUJBRFIoU1VCX1NFVFVQMik7CisJCW91dGIobHAtPnNldHVwMiwgX1hSRUcpOworCQorCQkvKiBtdXN0IG5vdyB3cml0ZSB0aGUgbWFnaWMgInJlc3RhcnQgb3BlcmF0aW9uIiBjb21tYW5kICovCisJCW1kZWxheSgxKTsKKwkJb3V0YigweDE4LCBfQ09NTUFORCk7CisJfQorCisJbHAtPmNvbmZpZyA9IDB4MjAgfCAobHAtPnRpbWVvdXQgPDwgMykgfCAobHAtPmJhY2twbGFuZSA8PCAyKSB8IDE7CisJLyogRGVmYXVsdCAweDM4ICsgcmVnaXN0ZXI6IE5vZGUgSUQgKi8KKwlTRVRDT05GOworCW91dGIoZGV2LT5kZXZfYWRkclswXSwgX1hSRUcpOworCisJLyogcmVzZXJ2ZSB0aGUgaXJxICovCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmYXJjbmV0X2ludGVycnVwdCwgc2hhcmVkLAorCQkJImFyY25ldCAoQ09NMjAwMjApIiwgZGV2KSkgeworCQlCVUdNU0coRF9OT1JNQUwsICJDYW4ndCBnZXQgSVJRICVkIVxuIiwgZGV2LT5pcnEpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKworCUJVR01TRyhEX05PUk1BTCwgIiVzOiBzdGF0aW9uICUwMlhoIGZvdW5kIGF0ICUwM2xYaCwgSVJRICVkLlxuIiwKKwkgICAgICAgbHAtPmNhcmRfbmFtZSwgZGV2LT5kZXZfYWRkclswXSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKworCWlmIChscC0+YmFja3BsYW5lKQorCQlCVUdNU0coRF9OT1JNQUwsICJVc2luZyBiYWNrcGxhbmUgbW9kZS5cbiIpOworCisJaWYgKGxwLT50aW1lb3V0ICE9IDMpCisJCUJVR01TRyhEX05PUk1BTCwgIlVzaW5nIGV4dGVuZGVkIHRpbWVvdXQgdmFsdWUgb2YgJWQuXG4iLCBscC0+dGltZW91dCk7CisKKwlCVUdNU0coRF9OT1JNQUwsICJVc2luZyBDS1AgJWQgLSBkYXRhIHJhdGUgJXMuXG4iLAorCSAgICAgICBscC0+c2V0dXAgPj4gMSwgCisJICAgICAgIGNsb2NrcmF0ZXNbMyAtICgobHAtPnNldHVwMiAmIDB4RjApID4+IDQpICsgKChscC0+c2V0dXAgJiAweDBGKSA+PiAxKV0pOworCisJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyogCisgKiBEbyBhIGhhcmR3YXJlIHJlc2V0IG9uIHRoZSBjYXJkLCBhbmQgc2V0IHVwIG5lY2Vzc2FyeSByZWdpc3RlcnMuCisgKiAKKyAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhcyBsaXR0bGUgYXMgcG9zc2libGUsIGJlY2F1c2UgaXQgZGlzcnVwdHMgdGhlCisgKiB0b2tlbiBvbiB0aGUgbmV0d29yayAoY2F1c2VzIGEgUkVDT04pIGFuZCByZXF1aXJlcyBhIHNpZ25pZmljYW50IGRlbGF5LgorICoKKyAqIEhvd2V2ZXIsIGl0IGRvZXMgbWFrZSBzdXJlIHRoZSBjYXJkIGlzIGluIGEgZGVmaW5lZCBzdGF0ZS4KKyAqLworc3RhdGljIGludCBjb20yMDAyMF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVhbGx5X3Jlc2V0KQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXVfaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVfY2hhciBpbmJ5dGU7CisKKwlCVUdNU0coRF9ERUJVRywgIiVzOiAlZDogJXM6IGRldjogJXAsIGxwOiAlcCwgZGV2LT5uYW1lOiAlc1xuIiwKKwkJX19GSUxFX18sX19MSU5FX18sX19GVU5DVElPTl9fLGRldixscCxkZXYtPm5hbWUpOworCUJVR01TRyhEX0lOSVQsICJSZXNldHRpbmcgJXMgKHN0YXR1cz0lMDJYaClcbiIsCisJICAgICAgIGRldi0+bmFtZSwgQVNUQVRVUygpKTsKKworCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18pOworCWxwLT5jb25maWcgPSBUWEVOY2ZnIHwgKGxwLT50aW1lb3V0IDw8IDMpIHwgKGxwLT5iYWNrcGxhbmUgPDwgMik7CisJLyogcG93ZXItdXAgZGVmYXVsdHMgKi8KKwlTRVRDT05GOworCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18pOworCisJaWYgKHJlYWxseV9yZXNldCkgeworCQkvKiByZXNldCB0aGUgY2FyZCAqLworCQlBUkNSRVNFVDsKKwkJbWRlbGF5KFJFU0VUdGltZSAqIDIpOwkvKiBDT00yMDAyMCBzZWVtcyB0byBiZSBzbG93ZXIgc29tZXRpbWVzICovCisJfQorCS8qIGNsZWFyIGZsYWdzICYgZW5kIHJlc2V0ICovCisJQlVHTVNHKERfREVCVUcsICIlczogJWQ6ICVzXG4iLF9fRklMRV9fLF9fTElORV9fLF9fRlVOQ1RJT05fXyk7CisJQUNPTU1BTkQoQ0ZMQUdTY21kIHwgUkVTRVRjbGVhciB8IENPTkZJR2NsZWFyKTsKKworCS8qIHZlcmlmeSB0aGF0IHRoZSBBUkNuZXQgc2lnbmF0dXJlIGJ5dGUgaXMgcHJlc2VudCAqLworCUJVR01TRyhEX0RFQlVHLCAiJXM6ICVkOiAlc1xuIixfX0ZJTEVfXyxfX0xJTkVfXyxfX0ZVTkNUSU9OX18pOworCisJY29tMjAwMjBfY29weV9mcm9tX2NhcmQoZGV2LCAwLCAwLCAmaW5ieXRlLCAxKTsKKwlCVUdNU0coRF9ERUJVRywgIiVzOiAlZDogJXNcbiIsX19GSUxFX18sX19MSU5FX18sX19GVU5DVElPTl9fKTsKKwlpZiAoaW5ieXRlICE9IFRFU1R2YWx1ZSkgeworCQlCVUdNU0coRF9ERUJVRywgIiVzOiAlZDogJXNcbiIsX19GSUxFX18sX19MSU5FX18sX19GVU5DVElPTl9fKTsKKwkJQlVHTVNHKERfTk9STUFMLCAicmVzZXQgZmFpbGVkOiBURVNUdmFsdWUgbm90IHByZXNlbnQuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCS8qIGVuYWJsZSBleHRlbmRlZCAoNTEyLWJ5dGUpIHBhY2tldHMgKi8KKwlBQ09NTUFORChDT05GSUdjbWQgfCBFWFRjb25mKTsKKwlCVUdNU0coRF9ERUJVRywgIiVzOiAlZDogJXNcbiIsX19GSUxFX18sX19MSU5FX18sX19GVU5DVElPTl9fKTsKKworCS8qIGRvbmUhICByZXR1cm4gc3VjY2Vzcy4gKi8KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBjb20yMDAyMF9zZXRtYXNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtYXNrKQoreworCXVfaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCUJVR01TRyhEX0RVUklORywgIlNldHRpbmcgbWFzayB0byAleCBhdCAleFxuIixtYXNrLGlvYWRkcik7CisJQUlOVE1BU0sobWFzayk7Cit9CisKKworc3RhdGljIHZvaWQgY29tMjAwMjBfY29tbWFuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY21kKQoreworCXVfaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCUFDT01NQU5EKGNtZCk7Cit9CisKKworc3RhdGljIGludCBjb20yMDAyMF9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1X2ludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCXJldHVybiBBU1RBVFVTKCkgKyAoQURJQUdTVEFUVVMoKTw8OCk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbTIwMDIwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJLyogZGlzYWJsZSB0cmFuc21pdHRlciAqLworCWxwLT5jb25maWcgJj0gflRYRU5jZmc7CisJU0VUQ09ORjsKK30KKworLyogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgKiBudW1fYWRkcnMgPT0gLTEgICAgUHJvbWlzY3VvdXMgbW9kZSwgcmVjZWl2ZSBhbGwgcGFja2V0cworICogbnVtX2FkZHJzID09IDAgICAgICAgTm9ybWFsIG1vZGUsIGNsZWFyIG11bHRpY2FzdCBsaXN0CisgKiBudW1fYWRkcnMgPiAwICAgICAgICBNdWx0aWNhc3QgbW9kZSwgcmVjZWl2ZSBub3JtYWwgYW5kIE1DIHBhY2tldHMsIGFuZCBkbworICogICAgICAgICAgICAgICAgICAgICAgYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgorICogICAgICBGSVhNRSAtIGRvIG11bHRpY2FzdCBzdHVmZiwgbm90IGp1c3QgcHJvbWlzY3VvdXMuCisgKi8KK3N0YXRpYyB2b2lkIGNvbTIwMDIwX3NldF9tY19saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpICYmIChkZXYtPmZsYWdzICYgSUZGX1VQKSkgewkvKiBFbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworCQlpZiAoIShscC0+c2V0dXAgJiBQUk9NSVNDc2V0KSkKKwkJCUJVR01TRyhEX05PUk1BTCwgIlNldHRpbmcgcHJvbWlzY3VvdXMgZmxhZy4uLlxuIik7CisJCVNFVF9TVUJBRFIoU1VCX1NFVFVQMSk7CisJCWxwLT5zZXR1cCB8PSBQUk9NSVNDc2V0OworCQlvdXRiKGxwLT5zZXR1cCwgX1hSRUcpOworCX0gZWxzZQorCQkvKiBEaXNhYmxlIHByb21pc2N1b3VzIG1vZGUsIHVzZSBub3JtYWwgbW9kZSAqLworCXsKKwkJaWYgKChscC0+c2V0dXAgJiBQUk9NSVNDc2V0KSkKKwkJCUJVR01TRyhEX05PUk1BTCwgIlJlc2V0dGluZyBwcm9taXNjdW91cyBmbGFnLi4uXG4iKTsKKwkJU0VUX1NVQkFEUihTVUJfU0VUVVAxKTsKKwkJbHAtPnNldHVwICY9IH5QUk9NSVNDc2V0OworCQlvdXRiKGxwLT5zZXR1cCwgX1hSRUcpOworCX0KK30KKworI2lmZGVmIE1PRFVMRQorCitFWFBPUlRfU1lNQk9MKGNvbTIwMDIwX2NoZWNrKTsKK0VYUE9SVF9TWU1CT0woY29tMjAwMjBfZm91bmQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCUJVR0xWTChEX05PUk1BTCkgcHJpbnRrKFZFUlNJT04pOworCXJldHVybiAwOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7Cit9CisKKyNlbmRpZgkJCQkvKiBNT0RVTEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FyY25ldC9jb205MGlvLmMgYi9kcml2ZXJzL25ldC9hcmNuZXQvY29tOTBpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYzc3Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcmNuZXQvY29tOTBpby5jCkBAIC0wLDAgKzEsNDM1IEBACisvKgorICogTGludXggQVJDbmV0IGRyaXZlciAtIENPTTkweHggY2hpcHNldCAoSU8tbWFwcGVkIGJ1ZmZlcnMpCisgKiAKKyAqIFdyaXR0ZW4gMTk5NyBieSBEYXZpZCBXb29kaG91c2UuCisgKiBXcml0dGVuIDE5OTQtMTk5OSBieSBBdmVyeSBQZW5uYXJ1bi4KKyAqIFdyaXR0ZW4gMTk5OS0yMDAwIGJ5IE1hcnRpbiBNYXJlcyA8bWpAdWN3LmN6Pi4KKyAqIERlcml2ZWQgZnJvbSBza2VsZXRvbi5jIGJ5IERvbmFsZCBCZWNrZXIuCisgKgorICogU3BlY2lhbCB0aGFua3MgdG8gQ29udGVtcG9yYXJ5IENvbnRyb2xzLCBJbmMuICh3d3cuY2NvbnRyb2xzLmNvbSkKKyAqICBmb3Igc3BvbnNvcmluZyB0aGUgZnVydGhlciBkZXZlbG9wbWVudCBvZiB0aGlzIGRyaXZlci4KKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlIG9yaWdpbmFsIGNvcHlyaWdodCBvZiBza2VsZXRvbi5jIHdhcyBhcyBmb2xsb3dzOgorICoKKyAqIHNrZWxldG9uLmMgV3JpdHRlbiAxOTkzIGJ5IERvbmFsZCBCZWNrZXIuCisgKiBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgKiBEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LiAgVGhpcyBzb2Z0d2FyZSBtYXkgb25seSBiZSB1c2VkCisgKiBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIG1vZGlmaWVkIGJ5IFNSQywgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZvciBtb3JlIGRldGFpbHMsIHNlZSBkcml2ZXJzL25ldC9hcmNuZXQuYworICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9hcmNkZXZpY2UuaD4KKworCisjZGVmaW5lIFZFUlNJT04gImFyY25ldDogQ09NOTB4eCBJTy1tYXBwZWQgbW9kZSBzdXBwb3J0IChieSBEYXZpZCBXb29kaG91c2UgZXQgZWwuKVxuIgorCisKKy8qIEludGVybmFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLworCitzdGF0aWMgaW50IGNvbTkwaW9fZm91bmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBjb205MGlvX2NvbW1hbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvbW1hbmQpOworc3RhdGljIGludCBjb205MGlvX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGNvbTkwaW9fc2V0bWFzayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWFzayk7CitzdGF0aWMgaW50IGNvbTkwaW9fcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJlYWxseV9yZXNldCk7CitzdGF0aWMgdm9pZCBjb205MGlvX2NvcHlfdG9fY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmbnVtLCBpbnQgb2Zmc2V0LAorCQkJCSB2b2lkICpidWYsIGludCBjb3VudCk7CitzdGF0aWMgdm9pZCBjb205MGlvX2NvcHlfZnJvbV9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZudW0sIGludCBvZmZzZXQsCisJCQkJICAgdm9pZCAqYnVmLCBpbnQgY291bnQpOworCisKKy8qIEhhbmR5IGRlZmluZXMgZm9yIEFSQ25ldCBzcGVjaWZpYyBzdHVmZiAqLworCisvKiBUaGUgbnVtYmVyIG9mIGxvdyBJL08gcG9ydHMgdXNlZCBieSB0aGUgY2FyZC4gKi8KKyNkZWZpbmUgQVJDTkVUX1RPVEFMX1NJWkUgMTYKKworLyogQ09NIDkwMjYgY29udHJvbGxlciBjaGlwIC0tPiBBUkNuZXQgcmVnaXN0ZXIgYWRkcmVzc2VzICovCisjZGVmaW5lIF9JTlRNQVNLIChpb2FkZHIrMCkJLyogd3JpdGFibGUgKi8KKyNkZWZpbmUgX1NUQVRVUyAgKGlvYWRkciswKQkvKiByZWFkYWJsZSAqLworI2RlZmluZSBfQ09NTUFORCAoaW9hZGRyKzEpCS8qIHdyaXRhYmxlLCByZXR1cm5zIHJhbmRvbSB2YWxzIG9uIHJlYWQgKD8pICovCisjZGVmaW5lIF9SRVNFVCAgKGlvYWRkcis4KQkvKiBzb2Z0d2FyZSByZXNldCAob24gcmVhZCkgKi8KKyNkZWZpbmUgX01FTURBVEEgIChpb2FkZHIrMTIpCS8qIERhdGEgcG9ydCBmb3IgSU8tbWFwcGVkIG1lbW9yeSAqLworI2RlZmluZSBfQUREUl9ISSAgKGlvYWRkcisxNSkJLyogQ29udHJvbCByZWdpc3RlcnMgZm9yIHNhaWQgKi8KKyNkZWZpbmUgX0FERFJfTE8gIChpb2FkZHIrMTQpCisjZGVmaW5lIF9DT05GSUcgIChpb2FkZHIrMikJLyogQ29uZmlndXJhdGlvbiByZWdpc3RlciAqLworCisjdW5kZWYgQVNUQVRVUworI3VuZGVmIEFDT01NQU5ECisjdW5kZWYgQUlOVE1BU0sKKworI2RlZmluZSBBU1RBVFVTKCkJaW5iKF9TVEFUVVMpCisjZGVmaW5lIEFDT01NQU5EKGNtZCkgb3V0YigoY21kKSxfQ09NTUFORCkKKyNkZWZpbmUgQUlOVE1BU0sobXNrKQlvdXRiKChtc2spLF9JTlRNQVNLKQorI2RlZmluZSBTRVRDT05GKCkgCW91dGIoKGxwLT5jb25maWcpLF9DT05GSUcpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBJTy1tYXBwZWQgb3BlcmF0aW9uIHJvdXRpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjdW5kZWYgT05FX0FUX0FfVElNRV9UWAorI3VuZGVmIE9ORV9BVF9BX1RJTUVfUlgKKworc3RhdGljIHVfY2hhciBnZXRfYnVmZmVyX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgb2Zmc2V0KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW91dGIob2Zmc2V0ID4+IDgsIF9BRERSX0hJKTsKKwlvdXRiKG9mZnNldCAmIDB4ZmYsIF9BRERSX0xPKTsKKworCXJldHVybiBpbmIoX01FTURBVEEpOworfQorCisjaWZkZWYgT05FX0FUX0FfVElNRV9UWAorc3RhdGljIHZvaWQgcHV0X2J1ZmZlcl9ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIG9mZnNldCwgdV9jaGFyIGRhdHVtKQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW91dGIob2Zmc2V0ID4+IDgsIF9BRERSX0hJKTsKKwlvdXRiKG9mZnNldCAmIDB4ZmYsIF9BRERSX0xPKTsKKworCW91dGIoZGF0dW0sIF9NRU1EQVRBKTsKK30KKworI2VuZGlmCisKKworc3RhdGljIHZvaWQgZ2V0X3dob2xlX2J1ZmZlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbmd0aCwgY2hhciAqZGVzdCkKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlvdXRiKChvZmZzZXQgPj4gOCkgfCBBVVRPSU5DZmxhZywgX0FERFJfSEkpOworCW91dGIob2Zmc2V0ICYgMHhmZiwgX0FERFJfTE8pOworCisJd2hpbGUgKGxlbmd0aC0tKQorI2lmZGVmIE9ORV9BVF9BX1RJTUVfUlgKKwkJKihkZXN0KyspID0gZ2V0X2J1ZmZlcl9ieXRlKGRldiwgb2Zmc2V0KyspOworI2Vsc2UKKwkJKihkZXN0KyspID0gaW5iKF9NRU1EQVRBKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBwdXRfd2hvbGVfYnVmZmVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbGVuZ3RoLCBjaGFyICpkZXN0KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW91dGIoKG9mZnNldCA+PiA4KSB8IEFVVE9JTkNmbGFnLCBfQUREUl9ISSk7CisJb3V0YihvZmZzZXQgJiAweGZmLCBfQUREUl9MTyk7CisKKwl3aGlsZSAobGVuZ3RoLS0pCisjaWZkZWYgT05FX0FUX0FfVElNRV9UWAorCQlwdXRfYnVmZmVyX2J5dGUoZGV2LCBvZmZzZXQrKywgKihkZXN0KyspKTsKKyNlbHNlCisJCW91dGIoKihkZXN0KyspLCBfTUVNREFUQSk7CisjZW5kaWYKK30KKworLyoKKyAqIFdlIGNhbm5vdCBwcm9iZSBmb3IgYW4gSU8gbWFwcGVkIGNhcmQgZWl0aGVyLCBhbHRob3VnaCB3ZSBjYW4gY2hlY2sgdGhhdAorICogaXQncyB3aGVyZSB3ZSB3ZXJlIHRvbGQgaXQgd2FzLCBhbmQgZXZlbiBhdXRvaXJxCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGNvbTkwaW9fcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIsIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGFpcnFtYXNrOworCisJQlVHTFZMKERfTk9STUFMKSBwcmludGsoVkVSU0lPTik7CisJQlVHTFZMKERfTk9STUFMKSBwcmludGsoIkUtbWFpbCBtZSBpZiB5b3UgYWN0dWFsbHkgdGVzdCB0aGlzIGRyaXZlciwgcGxlYXNlIVxuIik7CisKKwlpZiAoIWlvYWRkcikgeworCQlCVUdNU0coRF9OT1JNQUwsICJObyBhdXRvcHJvYmUgZm9yIElPIG1hcHBlZCBjYXJkczsgeW91ICIKKwkJICAgICAgICJtdXN0IHNwZWNpZnkgdGhlIGJhc2UgYWRkcmVzcyFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIEFSQ05FVF9UT1RBTF9TSVpFLCAiY29tOTBpbyBwcm9iZSIpKSB7CisJCUJVR01TRyhEX0lOSVRfUkVBU09OUywgIklPIGNoZWNrX3JlZ2lvbiAleC0leCBmYWlsZWQuXG4iLAorCQkgICAgICAgaW9hZGRyLCBpb2FkZHIgKyBBUkNORVRfVE9UQUxfU0laRSAtIDEpOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlpZiAoQVNUQVRVUygpID09IDB4RkYpIHsKKwkJQlVHTVNHKERfSU5JVF9SRUFTT05TLCAiSU8gYWRkcmVzcyAleCBlbXB0eVxuIiwgaW9hZGRyKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlpbmIoX1JFU0VUKTsKKwltZGVsYXkoUkVTRVR0aW1lKTsKKworCXN0YXR1cyA9IEFTVEFUVVMoKTsKKworCWlmICgoc3RhdHVzICYgMHg5RCkgIT0gKE5PUlhmbGFnIHwgUkVDT05mbGFnIHwgVFhGUkVFZmxhZyB8IFJFU0VUZmxhZykpIHsKKwkJQlVHTVNHKERfSU5JVF9SRUFTT05TLCAiU3RhdHVzIGludmFsaWQgKCVYaCkuXG4iLCBzdGF0dXMpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCUJVR01TRyhEX0lOSVRfUkVBU09OUywgIlN0YXR1cyBhZnRlciByZXNldDogJVhcbiIsIHN0YXR1cyk7CisKKwlBQ09NTUFORChDRkxBR1NjbWQgfCBSRVNFVGNsZWFyIHwgQ09ORklHY2xlYXIpOworCisJQlVHTVNHKERfSU5JVF9SRUFTT05TLCAiU3RhdHVzIGFmdGVyIHJlc2V0IGFja25vd2xlZGdlZDogJVhcbiIsIHN0YXR1cyk7CisKKwlzdGF0dXMgPSBBU1RBVFVTKCk7CisKKwlpZiAoc3RhdHVzICYgUkVTRVRmbGFnKSB7CisJCUJVR01TRyhEX0lOSVRfUkVBU09OUywgIkV0ZXJuYWwgcmVzZXQgKHN0YXR1cz0lWGgpXG4iLCBzdGF0dXMpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCW91dGIoKDB4MTYgfCBJT01BUGZsYWcpICYgfkVOQUJMRTE2ZmxhZywgX0NPTkZJRyk7CisKKwkvKiBSZWFkIGZpcnN0IGxvYyduIG9mIG1lbW9yeSAqLworCisJb3V0YihBVVRPSU5DZmxhZywgX0FERFJfSEkpOworCW91dGIoMCwgX0FERFJfTE8pOworCisJaWYgKChzdGF0dXMgPSBpbmIoX01FTURBVEEpKSAhPSAweGQxKSB7CisJCUJVR01TRyhEX0lOSVRfUkVBU09OUywgIlNpZ25hdHVyZSBieXRlIG5vdCBmb3VuZCIKKwkJICAgICAgICIgKCVYaCBpbnN0ZWFkKS5cbiIsIHN0YXR1cyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJaWYgKCFkZXYtPmlycSkgeworCQkvKgorCQkgKiBpZiB3ZSBkbyB0aGlzLCB3ZSdyZSBzdXJlIHRvIGdldCBhbiBJUlEgc2luY2UgdGhlCisJCSAqIGNhcmQgaGFzIGp1c3QgcmVzZXQgYW5kIHRoZSBOT1JYZmxhZyBpcyBvbiB1bnRpbAorCQkgKiB3ZSB0ZWxsIGl0IHRvIHN0YXJ0IHJlY2VpdmluZy4KKwkJICovCisKKwkJYWlycW1hc2sgPSBwcm9iZV9pcnFfb24oKTsKKwkJb3V0YihOT1JYZmxhZywgX0lOVE1BU0spOworCQl1ZGVsYXkoMSk7CisJCW91dGIoMCwgX0lOVE1BU0spOworCQlkZXYtPmlycSA9IHByb2JlX2lycV9vZmYoYWlycW1hc2spOworCisJCWlmIChkZXYtPmlycSA8PSAwKSB7CisJCQlCVUdNU0coRF9JTklUX1JFQVNPTlMsICJBdXRvcHJvYmUgSVJRIGZhaWxlZFxuIik7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwl9CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBBUkNORVRfVE9UQUxfU0laRSk7IC8qIGVuZCBvZiBwcm9iaW5nICovCisJcmV0dXJuIGNvbTkwaW9fZm91bmQoZGV2KTsKKworZXJyX291dDoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEFSQ05FVF9UT1RBTF9TSVpFKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworCisvKiBTZXQgdXAgdGhlIHN0cnVjdCBuZXRfZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhcmQuICBDYWxsZWQgYWZ0ZXIKKyAqIHByb2Jpbmcgc3VjY2VlZHMuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGNvbTkwaW9fZm91bmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscDsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGVycjsKKworCS8qIFJlc2VydmUgdGhlIGlycSAqLworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgJmFyY25ldF9pbnRlcnJ1cHQsIDAsICJhcmNuZXQgKENPTTkweHgtSU8pIiwgZGV2KSkgeworCQlCVUdNU0coRF9OT1JNQUwsICJDYW4ndCBnZXQgSVJRICVkIVxuIiwgZGV2LT5pcnEpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJLyogUmVzZXJ2ZSB0aGUgSS9PIHJlZ2lvbiAtIGd1YXJhbnRlZWQgdG8gd29yayBieSBjaGVja19yZWdpb24gKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBBUkNORVRfVE9UQUxfU0laRSwgImFyY25ldCAoQ09NOTB4eC1JTykiKSkgeworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlscCA9IGRldi0+cHJpdjsKKwlscC0+Y2FyZF9uYW1lID0gIkNPTTkweHggSS9PIjsKKwlscC0+aHcuY29tbWFuZCA9IGNvbTkwaW9fY29tbWFuZDsKKwlscC0+aHcuc3RhdHVzID0gY29tOTBpb19zdGF0dXM7CisJbHAtPmh3LmludG1hc2sgPSBjb205MGlvX3NldG1hc2s7CisJbHAtPmh3LnJlc2V0ID0gY29tOTBpb19yZXNldDsKKwlscC0+aHcub3duZXIgPSBUSElTX01PRFVMRTsKKwlscC0+aHcuY29weV90b19jYXJkID0gY29tOTBpb19jb3B5X3RvX2NhcmQ7CisJbHAtPmh3LmNvcHlfZnJvbV9jYXJkID0gY29tOTBpb19jb3B5X2Zyb21fY2FyZDsKKworCWxwLT5jb25maWcgPSAoMHgxNiB8IElPTUFQZmxhZykgJiB+RU5BQkxFMTZmbGFnOworCVNFVENPTkYoKTsKKworCS8qIGdldCBhbmQgY2hlY2sgdGhlIHN0YXRpb24gSUQgZnJvbSBvZmZzZXQgMSBpbiBzaG1lbSAqLworCisJZGV2LT5kZXZfYWRkclswXSA9IGdldF9idWZmZXJfYnl0ZShkZXYsIDEpOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlvdXRiKChpbmIoX0NPTkZJRykgJiB+SU9NQVBmbGFnKSwgX0NPTkZJRyk7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgQVJDTkVUX1RPVEFMX1NJWkUpOworCQlyZXR1cm4gZXJyOworCX0KKworCUJVR01TRyhEX05PUk1BTCwgIkNPTTkwSU86IHN0YXRpb24gJTAyWGggZm91bmQgYXQgJTAzbFhoLCBJUlEgJWQuXG4iLAorCSAgICAgICBkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIERvIGEgaGFyZHdhcmUgcmVzZXQgb24gdGhlIGNhcmQsIGFuZCBzZXQgdXAgbmVjZXNzYXJ5IHJlZ2lzdGVycy4KKyAqCisgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYXMgbGl0dGxlIGFzIHBvc3NpYmxlLCBiZWNhdXNlIGl0IGRpc3J1cHRzIHRoZQorICogdG9rZW4gb24gdGhlIG5ldHdvcmsgKGNhdXNlcyBhIFJFQ09OKSBhbmQgcmVxdWlyZXMgYSBzaWduaWZpY2FudCBkZWxheS4KKyAqCisgKiBIb3dldmVyLCBpdCBkb2VzIG1ha2Ugc3VyZSB0aGUgY2FyZCBpcyBpbiBhIGRlZmluZWQgc3RhdGUuCisgKi8KK3N0YXRpYyBpbnQgY29tOTBpb19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVhbGx5X3Jlc2V0KQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJQlVHTVNHKERfSU5JVCwgIlJlc2V0dGluZyAlcyAoc3RhdHVzPSUwMlhoKVxuIiwgZGV2LT5uYW1lLCBBU1RBVFVTKCkpOworCisJaWYgKHJlYWxseV9yZXNldCkgeworCQkvKiByZXNldCB0aGUgY2FyZCAqLworCQlpbmIoX1JFU0VUKTsKKwkJbWRlbGF5KFJFU0VUdGltZSk7CisJfQorCS8qIFNldCB0aGUgdGhpbmcgdG8gSU8tbWFwcGVkLCA4LWJpdCAgbW9kZSAqLworCWxwLT5jb25maWcgPSAoMHgxQyB8IElPTUFQZmxhZykgJiB+RU5BQkxFMTZmbGFnOworCVNFVENPTkYoKTsKKworCUFDT01NQU5EKENGTEFHU2NtZCB8IFJFU0VUY2xlYXIpOwkvKiBjbGVhciBmbGFncyAmIGVuZCByZXNldCAqLworCUFDT01NQU5EKENGTEFHU2NtZCB8IENPTkZJR2NsZWFyKTsKKworCS8qIHZlcmlmeSB0aGF0IHRoZSBBUkNuZXQgc2lnbmF0dXJlIGJ5dGUgaXMgcHJlc2VudCAqLworCWlmIChnZXRfYnVmZmVyX2J5dGUoZGV2LCAwKSAhPSBURVNUdmFsdWUpIHsKKwkJQlVHTVNHKERfTk9STUFMLCAicmVzZXQgZmFpbGVkOiBURVNUdmFsdWUgbm90IHByZXNlbnQuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCS8qIGVuYWJsZSBleHRlbmRlZCAoNTEyLWJ5dGUpIHBhY2tldHMgKi8KKwlBQ09NTUFORChDT05GSUdjbWQgfCBFWFRjb25mKTsKKworCS8qIGRvbmUhICByZXR1cm4gc3VjY2Vzcy4gKi8KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBjb205MGlvX2NvbW1hbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNtZCkKK3sKKwlzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCUFDT01NQU5EKGNtZCk7Cit9CisKKworc3RhdGljIGludCBjb205MGlvX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJcmV0dXJuIEFTVEFUVVMoKTsKK30KKworCitzdGF0aWMgdm9pZCBjb205MGlvX3NldG1hc2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1hc2spCit7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlBSU5UTUFTSyhtYXNrKTsKK30KKworc3RhdGljIHZvaWQgY29tOTBpb19jb3B5X3RvX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSwgaW50IG9mZnNldCwKKwkJCQkgdm9pZCAqYnVmLCBpbnQgY291bnQpCit7CisJVElNRSgicHV0X3dob2xlX2J1ZmZlciIsIGNvdW50LCBwdXRfd2hvbGVfYnVmZmVyKGRldiwgYnVmbnVtICogNTEyICsgb2Zmc2V0LCBjb3VudCwgYnVmKSk7Cit9CisKKworc3RhdGljIHZvaWQgY29tOTBpb19jb3B5X2Zyb21fY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmbnVtLCBpbnQgb2Zmc2V0LAorCQkJCSAgIHZvaWQgKmJ1ZiwgaW50IGNvdW50KQoreworCVRJTUUoImdldF93aG9sZV9idWZmZXIiLCBjb3VudCwgZ2V0X3dob2xlX2J1ZmZlcihkZXYsIGJ1Zm51bSAqIDUxMiArIG9mZnNldCwgY291bnQsIGJ1ZikpOworfQorCitzdGF0aWMgaW50IGlvOwkJCS8qIHVzZSB0aGUgaW5zbW9kIGlvPSBpcnE9IHNobWVtPSBvcHRpb25zICovCitzdGF0aWMgaW50IGlycTsKK3N0YXRpYyBjaGFyIGRldmljZVs5XTsJCS8qIHVzZSBlZy4gZGV2aWNlPWFyYzEgdG8gY2hhbmdlIG5hbWUgKi8KKworbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9zdHJpbmcoZGV2aWNlLCBkZXZpY2UsIHNpemVvZihkZXZpY2UpLCAwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IGNvbTkwaW9fc2V0dXAoY2hhciAqcykKK3sKKwlpbnQgaW50c1s0XTsKKwlzID0gZ2V0X29wdGlvbnMocywgNCwgaW50cyk7CisJaWYgKCFpbnRzWzBdKQorCQlyZXR1cm4gMDsKKwlzd2l0Y2ggKGludHNbMF0pIHsKKwlkZWZhdWx0OgkJLyogRVJST1IgKi8KKwkJcHJpbnRrKCJjb205MGlvOiBUb28gbWFueSBhcmd1bWVudHMuXG4iKTsKKwljYXNlIDI6CQkvKiBJUlEgKi8KKwkJaXJxID0gaW50c1syXTsKKwljYXNlIDE6CQkvKiBJTyBhZGRyZXNzICovCisJCWlvID0gaW50c1sxXTsKKwl9CisJaWYgKCpzKQorCQlzbnByaW50ZihkZXZpY2UsIHNpemVvZihkZXZpY2UpLCAiJXMiLCBzKTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImNvbTkwaW89IiwgY29tOTBpb19zZXR1cCk7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpteV9kZXY7CisKK3N0YXRpYyBpbnQgX19pbml0IGNvbTkwaW9faW5pdCh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGVycjsKKworCWRldiA9IGFsbG9jX2FyY2RldihkZXZpY2UpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWRldi0+YmFzZV9hZGRyID0gaW87CisJZGV2LT5pcnEgPSBpcnE7CisJaWYgKGRldi0+aXJxID09IDIpCisJCWRldi0+aXJxID0gOTsKKworCWVyciA9IGNvbTkwaW9fcHJvYmUoZGV2KTsKKworCWlmIChlcnIpIHsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlteV9kZXYgPSBkZXY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjb205MGlvX2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbXlfZGV2OworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwkvKiBTZXQgdGhlIHRoaW5nIGJhY2sgdG8gTU1BUCBtb2RlLCBpbiBjYXNlIHRoZSBvbGQgZHJpdmVyIGlzIGxvYWRlZCBsYXRlciAqLworCW91dGIoKGluYihfQ09ORklHKSAmIH5JT01BUGZsYWcpLCBfQ09ORklHKTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBBUkNORVRfVE9UQUxfU0laRSk7CisJZnJlZV9uZXRkZXYoZGV2KTsKK30KKworbW9kdWxlX2luaXQoY29tOTBpb19pbml0KQorbW9kdWxlX2V4aXQoY29tOTBpb19leGl0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJjbmV0L2NvbTkweHguYyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jb205MHh4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyYzliOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9jb205MHh4LmMKQEAgLTAsMCArMSw2NDYgQEAKKy8qCisgKiBMaW51eCBBUkNuZXQgZHJpdmVyIC0gQ09NOTB4eCBjaGlwc2V0IChtZW1vcnktbWFwcGVkIGJ1ZmZlcnMpCisgKiAKKyAqIFdyaXR0ZW4gMTk5NC0xOTk5IGJ5IEF2ZXJ5IFBlbm5hcnVuLgorICogV3JpdHRlbiAxOTk5IGJ5IE1hcnRpbiBNYXJlcyA8bWpAdWN3LmN6Pi4KKyAqIERlcml2ZWQgZnJvbSBza2VsZXRvbi5jIGJ5IERvbmFsZCBCZWNrZXIuCisgKgorICogU3BlY2lhbCB0aGFua3MgdG8gQ29udGVtcG9yYXJ5IENvbnRyb2xzLCBJbmMuICh3d3cuY2NvbnRyb2xzLmNvbSkKKyAqICBmb3Igc3BvbnNvcmluZyB0aGUgZnVydGhlciBkZXZlbG9wbWVudCBvZiB0aGlzIGRyaXZlci4KKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlIG9yaWdpbmFsIGNvcHlyaWdodCBvZiBza2VsZXRvbi5jIHdhcyBhcyBmb2xsb3dzOgorICoKKyAqIHNrZWxldG9uLmMgV3JpdHRlbiAxOTkzIGJ5IERvbmFsZCBCZWNrZXIuCisgKiBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgKiBEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LiAgVGhpcyBzb2Z0d2FyZSBtYXkgb25seSBiZSB1c2VkCisgKiBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIG1vZGlmaWVkIGJ5IFNSQywgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZvciBtb3JlIGRldGFpbHMsIHNlZSBkcml2ZXJzL25ldC9hcmNuZXQuYworICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvYXJjZGV2aWNlLmg+CisKKworI2RlZmluZSBWRVJTSU9OICJhcmNuZXQ6IENPTTkweHggY2hpcHNldCBzdXBwb3J0XG4iCisKKworLyogRGVmaW5lIHRoaXMgdG8gc3BlZWQgdXAgdGhlIGF1dG9wcm9iZSBieSBhc3N1bWluZyBpZiBvbmx5IG9uZSBpbyBwb3J0IGFuZAorICogc2htZW0gYXJlIGxlZnQgaW4gdGhlIGxpc3QgYXQgU3RhZ2UgNSwgdGhleSBtdXN0IGNvcnJlc3BvbmQgdG8gZWFjaAorICogb3RoZXIuCisgKgorICogVGhpcyBpcyB1bmRlZmluZWQgYnkgZGVmYXVsdCBiZWNhdXNlIGl0IG1pZ2h0IG5vdCBhbHdheXMgYmUgdHJ1ZSwgYW5kIHRoZQorICogZXh0cmEgY2hlY2sgbWFrZXMgdGhlIGF1dG9wcm9iZSBldmVuIG1vcmUgY2FyZWZ1bC4gIFNwZWVkIGRlbW9ucyBjYW4gdHVybgorICogaXQgb24gLSBJIHRoaW5rIGl0IHNob3VsZCBiZSBmaW5lIGlmIHlvdSBvbmx5IGhhdmUgb25lIEFSQ25ldCBjYXJkCisgKiBpbnN0YWxsZWQuCisgKgorICogSWYgbm8gQVJDbmV0IGNhcmRzIGFyZSBpbnN0YWxsZWQsIHRoaXMgZGVsYXkgbmV2ZXIgaGFwcGVucyBhbnl3YXkgYW5kIHRodXMKKyAqIHRoZSBvcHRpb24gaGFzIG5vIGVmZmVjdC4KKyAqLworI3VuZGVmIEZBU1RfUFJPQkUKKworCisvKiBJbnRlcm5hbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyBpbnQgY29tOTB4eF9mb3VuZChpbnQgaW9hZGRyLCBpbnQgYWlycSwgdV9sb25nIHNobWVtKTsKK3N0YXRpYyB2b2lkIGNvbTkweHhfY29tbWFuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY29tbWFuZCk7CitzdGF0aWMgaW50IGNvbTkweHhfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgY29tOTB4eF9zZXRtYXNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtYXNrKTsKK3N0YXRpYyBpbnQgY29tOTB4eF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVhbGx5X3Jlc2V0KTsKK3N0YXRpYyB2b2lkIGNvbTkweHhfY29weV90b19jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZudW0sIGludCBvZmZzZXQsCisJCQkJIHZvaWQgKmJ1ZiwgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIGNvbTkweHhfY29weV9mcm9tX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSwgaW50IG9mZnNldCwKKwkJCQkgICB2b2lkICpidWYsIGludCBjb3VudCk7CisKKy8qIEtub3duIEFSQ25ldCBjYXJkcyAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmNhcmRzWzE2XTsKK3N0YXRpYyBpbnQgbnVtY2FyZHM7CisKKy8qIEhhbmR5IGRlZmluZXMgZm9yIEFSQ25ldCBzcGVjaWZpYyBzdHVmZiAqLworCisvKiBUaGUgbnVtYmVyIG9mIGxvdyBJL08gcG9ydHMgdXNlZCBieSB0aGUgY2FyZCAqLworI2RlZmluZSBBUkNORVRfVE9UQUxfU0laRQkxNgorCisvKiBBbW91bnQgb2YgSS9PIG1lbW9yeSB1c2VkIGJ5IHRoZSBjYXJkICovCisjZGVmaW5lIEJVRkZFUl9TSVpFICg1MTIpCisjZGVmaW5lIE1JUlJPUl9TSVpFIChCVUZGRVJfU0laRSo0KQorCisvKiBDT00gOTAyNiBjb250cm9sbGVyIGNoaXAgLS0+IEFSQ25ldCByZWdpc3RlciBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgX0lOVE1BU0sgKGlvYWRkciswKQkvKiB3cml0YWJsZSAqLworI2RlZmluZSBfU1RBVFVTICAoaW9hZGRyKzApCS8qIHJlYWRhYmxlICovCisjZGVmaW5lIF9DT01NQU5EIChpb2FkZHIrMSkJLyogd3JpdGFibGUsIHJldHVybnMgcmFuZG9tIHZhbHMgb24gcmVhZCAoPykgKi8KKyNkZWZpbmUgX0NPTkZJRyAgKGlvYWRkcisyKQkvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIF9SRVNFVCAgIChpb2FkZHIrOCkJLyogc29mdHdhcmUgcmVzZXQgKG9uIHJlYWQpICovCisjZGVmaW5lIF9NRU1EQVRBIChpb2FkZHIrMTIpCS8qIERhdGEgcG9ydCBmb3IgSU8tbWFwcGVkIG1lbW9yeSAqLworI2RlZmluZSBfQUREUl9ISSAoaW9hZGRyKzE1KQkvKiBDb250cm9sIHJlZ2lzdGVycyBmb3Igc2FpZCAqLworI2RlZmluZSBfQUREUl9MTyAoaW9hZGRyKzE0KQorCisjdW5kZWYgQVNUQVRVUworI3VuZGVmIEFDT01NQU5ECisjdW5kZWYgQUlOVE1BU0sKKworI2RlZmluZSBBU1RBVFVTKCkJaW5iKF9TVEFUVVMpCisjZGVmaW5lIEFDT01NQU5EKGNtZCkgCW91dGIoKGNtZCksX0NPTU1BTkQpCisjZGVmaW5lIEFJTlRNQVNLKG1zaykJb3V0YigobXNrKSxfSU5UTUFTSykKKworCitzdGF0aWMgaW50IGNvbTkweHhfc2tpcF9wcm9iZSBfX2luaXRkYXRhID0gMDsKKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KKworc3RhdGljIGludCBpbzsJCQkvKiB1c2UgdGhlIGluc21vZCBpbz0gaXJxPSBzaG1lbT0gb3B0aW9ucyAqLworc3RhdGljIGludCBpcnE7CitzdGF0aWMgaW50IHNobWVtOworc3RhdGljIGNoYXIgZGV2aWNlWzldOwkJLyogdXNlIGVnLiBkZXZpY2U9YXJjMSB0byBjaGFuZ2UgbmFtZSAqLworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHNobWVtLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX3N0cmluZyhkZXZpY2UsIGRldmljZSwgc2l6ZW9mKGRldmljZSksIDApOworCitzdGF0aWMgdm9pZCBfX2luaXQgY29tOTB4eF9wcm9iZSh2b2lkKQoreworCWludCBjb3VudCwgc3RhdHVzLCBpb2FkZHIsIG51bXByaW50LCBhaXJxLCBvcGVucGFyZW4gPSAwOworCXVuc2lnbmVkIGxvbmcgYWlycW1hc2s7CisJaW50IHBvcnRzWygweDNmMCAtIDB4MjAwKSAvIDE2ICsgMV0gPQorCXswfTsKKwl1X2xvbmcgc2htZW1zWygweEZGODAwIC0gMHhBMDAwMCkgLyAyMDQ4ICsgMV0gPQorCXswfTsKKwlpbnQgbnVtcG9ydHMsIG51bXNobWVtcywgKnBvcnQ7CisJdV9sb25nICpwOworCisJaWYgKCFpbyAmJiAhaXJxICYmICFzaG1lbSAmJiAhKmRldmljZSAmJiBjb205MHh4X3NraXBfcHJvYmUpCisJCXJldHVybjsKKworCUJVR0xWTChEX05PUk1BTCkgcHJpbnRrKFZFUlNJT04pOworCisJLyogc2V0IHVwIHRoZSBhcnJheXMgd2hlcmUgd2UnbGwgc3RvcmUgdGhlIHBvc3NpYmxlIHByb2JlIGFkZHJlc3NlcyAqLworCW51bXBvcnRzID0gbnVtc2htZW1zID0gMDsKKwlpZiAoaW8pCisJCXBvcnRzW251bXBvcnRzKytdID0gaW87CisJZWxzZQorCQlmb3IgKGNvdW50ID0gMHgyMDA7IGNvdW50IDw9IDB4M2YwOyBjb3VudCArPSAxNikKKwkJCXBvcnRzW251bXBvcnRzKytdID0gY291bnQ7CisJaWYgKHNobWVtKQorCQlzaG1lbXNbbnVtc2htZW1zKytdID0gc2htZW07CisJZWxzZQorCQlmb3IgKGNvdW50ID0gMHhBMDAwMDsgY291bnQgPD0gMHhGRjgwMDsgY291bnQgKz0gMjA0OCkKKwkJCXNobWVtc1tudW1zaG1lbXMrK10gPSBjb3VudDsKKworCS8qIFN0YWdlIDE6IGFiYW5kb24gYW55IHJlc2VydmVkIHBvcnRzLCBvciBvbmVzIHdpdGggc3RhdHVzPT0weEZGCisJICogKGVtcHR5KSwgYW5kIHJlc2V0IGFueSBvdGhlcnMgYnkgcmVhZGluZyB0aGUgcmVzZXQgcG9ydC4KKwkgKi8KKwludW1wcmludCA9IC0xOworCWZvciAocG9ydCA9ICZwb3J0c1swXTsgcG9ydCAtIHBvcnRzIDwgbnVtcG9ydHM7IHBvcnQrKykgeworCQludW1wcmludCsrOworCQludW1wcmludCAlPSA4OworCQlpZiAoIW51bXByaW50KSB7CisJCQlCVUdNU0cyKERfSU5JVCwgIlxuIik7CisJCQlCVUdNU0cyKERfSU5JVCwgIlMxOiAiKTsKKwkJfQorCQlCVUdNU0cyKERfSU5JVCwgIiVYaCAiLCAqcG9ydCk7CisKKwkJaW9hZGRyID0gKnBvcnQ7CisKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbigqcG9ydCwgQVJDTkVUX1RPVEFMX1NJWkUsICJhcmNuZXQgKDkweHgpIikpIHsKKwkJCUJVR01TRzIoRF9JTklUX1JFQVNPTlMsICIocmVxdWVzdF9yZWdpb24pXG4iKTsKKwkJCUJVR01TRzIoRF9JTklUX1JFQVNPTlMsICJTMTogIik7CisJCQlCVUdMVkwoRF9JTklUX1JFQVNPTlMpIG51bXByaW50ID0gMDsKKwkJCSpwb3J0LS0gPSBwb3J0c1stLW51bXBvcnRzXTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChBU1RBVFVTKCkgPT0gMHhGRikgeworCQkJQlVHTVNHMihEX0lOSVRfUkVBU09OUywgIihlbXB0eSlcbiIpOworCQkJQlVHTVNHMihEX0lOSVRfUkVBU09OUywgIlMxOiAiKTsKKwkJCUJVR0xWTChEX0lOSVRfUkVBU09OUykgbnVtcHJpbnQgPSAwOworCQkJcmVsZWFzZV9yZWdpb24oKnBvcnQsIEFSQ05FVF9UT1RBTF9TSVpFKTsKKwkJCSpwb3J0LS0gPSBwb3J0c1stLW51bXBvcnRzXTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWluYihfUkVTRVQpOwkvKiBiZWdpbiByZXNldHRpbmcgY2FyZCAqLworCisJCUJVR01TRzIoRF9JTklUX1JFQVNPTlMsICJcbiIpOworCQlCVUdNU0cyKERfSU5JVF9SRUFTT05TLCAiUzE6ICIpOworCQlCVUdMVkwoRF9JTklUX1JFQVNPTlMpIG51bXByaW50ID0gMDsKKwl9CisJQlVHTVNHMihEX0lOSVQsICJcbiIpOworCisJaWYgKCFudW1wb3J0cykgeworCQlCVUdNU0cyKERfTk9STUFMLCAiUzE6IE5vIEFSQ25ldCBjYXJkcyBmb3VuZC5cbiIpOworCQlyZXR1cm47CisJfQorCS8qIFN0YWdlIDI6IHdlIGhhdmUgbm93IHJlc2V0IGFueSBwb3NzaWJsZSBBUkNuZXQgY2FyZHMsIHNvIHdlIGNhbid0CisJICogZG8gYW55dGhpbmcgdW50aWwgdGhleSBmaW5pc2guICBJZiBEX0lOSVQsIHByaW50IHRoZSBsaXN0IG9mCisJICogY2FyZHMgdGhhdCBhcmUgbGVmdC4KKwkgKi8KKwludW1wcmludCA9IC0xOworCWZvciAocG9ydCA9ICZwb3J0c1swXTsgcG9ydCA8IHBvcnRzICsgbnVtcG9ydHM7IHBvcnQrKykgeworCQludW1wcmludCsrOworCQludW1wcmludCAlPSA4OworCQlpZiAoIW51bXByaW50KSB7CisJCQlCVUdNU0cyKERfSU5JVCwgIlxuIik7CisJCQlCVUdNU0cyKERfSU5JVCwgIlMyOiAiKTsKKwkJfQorCQlCVUdNU0cyKERfSU5JVCwgIiVYaCAiLCAqcG9ydCk7CisJfQorCUJVR01TRzIoRF9JTklULCAiXG4iKTsKKwltZGVsYXkoUkVTRVR0aW1lKTsKKworCS8qIFN0YWdlIDM6IGFiYW5kb24gYW55IHNobWVtIGFkZHJlc3NlcyB0aGF0IGRvbid0IGhhdmUgdGhlIHNpZ25hdHVyZQorCSAqIDB4RDEgYnl0ZSBpbiB0aGUgcmlnaHQgcGxhY2UsIG9yIGFyZSByZWFkLW9ubHkuCisJICovCisJbnVtcHJpbnQgPSAtMTsKKwlmb3IgKHAgPSAmc2htZW1zWzBdOyBwIDwgc2htZW1zICsgbnVtc2htZW1zOyBwKyspIHsKKwkJdV9sb25nIHB0ciA9ICpwOworCisJCW51bXByaW50Kys7CisJCW51bXByaW50ICU9IDg7CisJCWlmICghbnVtcHJpbnQpIHsKKwkJCUJVR01TRzIoRF9JTklULCAiXG4iKTsKKwkJCUJVR01TRzIoRF9JTklULCAiUzM6ICIpOworCQl9CisJCUJVR01TRzIoRF9JTklULCAiJWxYaCAiLCAqcCk7CisKKwkJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oKnAsIEJVRkZFUl9TSVpFLCAiYXJjbmV0ICg5MHh4KSIpKSB7CisJCQlCVUdNU0cyKERfSU5JVF9SRUFTT05TLCAiKHJlcXVlc3RfbWVtX3JlZ2lvbilcbiIpOworCQkJQlVHTVNHMihEX0lOSVRfUkVBU09OUywgIlN0YWdlIDM6ICIpOworCQkJQlVHTFZMKERfSU5JVF9SRUFTT05TKSBudW1wcmludCA9IDA7CisJCQkqcC0tID0gc2htZW1zWy0tbnVtc2htZW1zXTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChpc2FfcmVhZGIocHRyKSAhPSBURVNUdmFsdWUpIHsKKwkJCUJVR01TRzIoRF9JTklUX1JFQVNPTlMsICIoJTAyWGggIT0gJTAyWGgpXG4iLAorCQkJCWlzYV9yZWFkYihwdHIpLCBURVNUdmFsdWUpOworCQkJQlVHTVNHMihEX0lOSVRfUkVBU09OUywgIlMzOiAiKTsKKwkJCUJVR0xWTChEX0lOSVRfUkVBU09OUykgbnVtcHJpbnQgPSAwOworCQkJcmVsZWFzZV9tZW1fcmVnaW9uKCpwLCBCVUZGRVJfU0laRSk7CisJCQkqcC0tID0gc2htZW1zWy0tbnVtc2htZW1zXTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIEJ5IHdyaXRpbmcgMHg0MiB0byB0aGUgVEVTVHZhbHVlIGxvY2F0aW9uLCB3ZSBhbHNvIG1ha2UKKwkJICogc3VyZSBubyAibWlycm9yIiBzaG1lbSBhcmVhcyBzaG93IHVwIC0gaWYgdGhleSBvY2N1cgorCQkgKiBpbiBhbm90aGVyIHBhc3MgdGhyb3VnaCB0aGlzIGxvb3AsIHRoZXkgd2lsbCBiZSBkaXNjYXJkZWQKKwkJICogYmVjYXVzZSAqY3B0ciAhPSBURVNUdmFsdWUuCisJCSAqLworCQlpc2Ffd3JpdGViKDB4NDIsIHB0cik7CisJCWlmIChpc2FfcmVhZGIocHRyKSAhPSAweDQyKSB7CisJCQlCVUdNU0cyKERfSU5JVF9SRUFTT05TLCAiKHJlYWQgb25seSlcbiIpOworCQkJQlVHTVNHMihEX0lOSVRfUkVBU09OUywgIlMzOiAiKTsKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbigqcCwgQlVGRkVSX1NJWkUpOworCQkJKnAtLSA9IHNobWVtc1stLW51bXNobWVtc107CisJCQljb250aW51ZTsKKwkJfQorCQlCVUdNU0cyKERfSU5JVF9SRUFTT05TLCAiXG4iKTsKKwkJQlVHTVNHMihEX0lOSVRfUkVBU09OUywgIlMzOiAiKTsKKwkJQlVHTFZMKERfSU5JVF9SRUFTT05TKSBudW1wcmludCA9IDA7CisJfQorCUJVR01TRzIoRF9JTklULCAiXG4iKTsKKworCWlmICghbnVtc2htZW1zKSB7CisJCUJVR01TRzIoRF9OT1JNQUwsICJTMzogTm8gQVJDbmV0IGNhcmRzIGZvdW5kLlxuIik7CisJCWZvciAocG9ydCA9ICZwb3J0c1swXTsgcG9ydCA8IHBvcnRzICsgbnVtcG9ydHM7IHBvcnQrKykKKwkJCXJlbGVhc2VfcmVnaW9uKCpwb3J0LCBBUkNORVRfVE9UQUxfU0laRSk7CisJCXJldHVybjsKKwl9CisJLyogU3RhZ2UgNDogc29tZXRoaW5nIG9mIGEgZHVtbXksIHRvIHJlcG9ydCB0aGUgc2htZW1zIHRoYXQgYXJlCisJICogc3RpbGwgcG9zc2libGUgYWZ0ZXIgc3RhZ2UgMy4KKwkgKi8KKwludW1wcmludCA9IC0xOworCWZvciAocCA9ICZzaG1lbXNbMF07IHAgPCBzaG1lbXMgKyBudW1zaG1lbXM7IHArKykgeworCQludW1wcmludCsrOworCQludW1wcmludCAlPSA4OworCQlpZiAoIW51bXByaW50KSB7CisJCQlCVUdNU0cyKERfSU5JVCwgIlxuIik7CisJCQlCVUdNU0cyKERfSU5JVCwgIlM0OiAiKTsKKwkJfQorCQlCVUdNU0cyKERfSU5JVCwgIiVsWGggIiwgKnApOworCX0KKwlCVUdNU0cyKERfSU5JVCwgIlxuIik7CisKKwkvKiBTdGFnZSA1OiBmb3IgYW55IHBvcnRzIHRoYXQgaGF2ZSB0aGUgY29ycmVjdCBzdGF0dXMsIGNhbiBkaXNhYmxlCisJICogdGhlIFJFU0VUIGZsYWcsIGFuZCAoaWYgbm8gaXJxIGlzIGdpdmVuKSBnZW5lcmF0ZSBhbiBhdXRvaXJxLAorCSAqIHJlZ2lzdGVyIGFuIEFSQ25ldCBkZXZpY2UuCisJICoKKwkgKiBDdXJyZW50bHksIHdlIGNhbiBvbmx5IHJlZ2lzdGVyIG9uZSBkZXZpY2UgcGVyIHByb2JlLCBzbyBxdWl0CisJICogYWZ0ZXIgdGhlIGZpcnN0IG9uZSBpcyBmb3VuZC4KKwkgKi8KKwludW1wcmludCA9IC0xOworCWZvciAocG9ydCA9ICZwb3J0c1swXTsgcG9ydCA8IHBvcnRzICsgbnVtcG9ydHM7IHBvcnQrKykgeworCQlpbnQgZm91bmQgPSAwOworCQludW1wcmludCsrOworCQludW1wcmludCAlPSA4OworCQlpZiAoIW51bXByaW50KSB7CisJCQlCVUdNU0cyKERfSU5JVCwgIlxuIik7CisJCQlCVUdNU0cyKERfSU5JVCwgIlM1OiAiKTsKKwkJfQorCQlCVUdNU0cyKERfSU5JVCwgIiVYaCAiLCAqcG9ydCk7CisKKwkJaW9hZGRyID0gKnBvcnQ7CisJCXN0YXR1cyA9IEFTVEFUVVMoKTsKKworCQlpZiAoKHN0YXR1cyAmIDB4OUQpCisJCSAgICAhPSAoTk9SWGZsYWcgfCBSRUNPTmZsYWcgfCBUWEZSRUVmbGFnIHwgUkVTRVRmbGFnKSkgeworCQkJQlVHTVNHMihEX0lOSVRfUkVBU09OUywgIihzdGF0dXM9JVhoKVxuIiwgc3RhdHVzKTsKKwkJCUJVR01TRzIoRF9JTklUX1JFQVNPTlMsICJTNTogIik7CisJCQlCVUdMVkwoRF9JTklUX1JFQVNPTlMpIG51bXByaW50ID0gMDsKKwkJCXJlbGVhc2VfcmVnaW9uKCpwb3J0LCBBUkNORVRfVE9UQUxfU0laRSk7CisJCQkqcG9ydC0tID0gcG9ydHNbLS1udW1wb3J0c107CisJCQljb250aW51ZTsKKwkJfQorCQlBQ09NTUFORChDRkxBR1NjbWQgfCBSRVNFVGNsZWFyIHwgQ09ORklHY2xlYXIpOworCQlzdGF0dXMgPSBBU1RBVFVTKCk7CisJCWlmIChzdGF0dXMgJiBSRVNFVGZsYWcpIHsKKwkJCUJVR01TRzIoRF9JTklUX1JFQVNPTlMsICIgKGV0ZXJuYWwgcmVzZXQsIHN0YXR1cz0lWGgpXG4iLAorCQkJCXN0YXR1cyk7CisJCQlCVUdNU0cyKERfSU5JVF9SRUFTT05TLCAiUzU6ICIpOworCQkJQlVHTFZMKERfSU5JVF9SRUFTT05TKSBudW1wcmludCA9IDA7CisJCQlyZWxlYXNlX3JlZ2lvbigqcG9ydCwgQVJDTkVUX1RPVEFMX1NJWkUpOworCQkJKnBvcnQtLSA9IHBvcnRzWy0tbnVtcG9ydHNdOworCQkJY29udGludWU7CisJCX0KKwkJLyogc2tpcCB0aGlzIGNvbXBsZXRlbHkgaWYgYW4gSVJRIHdhcyBnaXZlbiwgYmVjYXVzZSBtYXliZQorCQkgKiB3ZSdyZSBvbiBhIG1hY2hpbmUgdGhhdCBsb2NrcyBkdXJpbmcgYXV0b2lycSEKKwkJICovCisJCWlmICghaXJxKSB7CisJCQkvKiBpZiB3ZSBkbyB0aGlzLCB3ZSdyZSBzdXJlIHRvIGdldCBhbiBJUlEgc2luY2UgdGhlCisJCQkgKiBjYXJkIGhhcyBqdXN0IHJlc2V0IGFuZCB0aGUgTk9SWGZsYWcgaXMgb24gdW50aWwKKwkJCSAqIHdlIHRlbGwgaXQgdG8gc3RhcnQgcmVjZWl2aW5nLgorCQkJICovCisJCQlhaXJxbWFzayA9IHByb2JlX2lycV9vbigpOworCQkJQUlOVE1BU0soTk9SWGZsYWcpOworCQkJdWRlbGF5KDEpOworCQkJQUlOVE1BU0soMCk7CisJCQlhaXJxID0gcHJvYmVfaXJxX29mZihhaXJxbWFzayk7CisKKwkJCWlmIChhaXJxIDw9IDApIHsKKwkJCQlCVUdNU0cyKERfSU5JVF9SRUFTT05TLCAiKGFpcnE9JWQpXG4iLCBhaXJxKTsKKwkJCQlCVUdNU0cyKERfSU5JVF9SRUFTT05TLCAiUzU6ICIpOworCQkJCUJVR0xWTChEX0lOSVRfUkVBU09OUykgbnVtcHJpbnQgPSAwOworCQkJCXJlbGVhc2VfcmVnaW9uKCpwb3J0LCBBUkNORVRfVE9UQUxfU0laRSk7CisJCQkJKnBvcnQtLSA9IHBvcnRzWy0tbnVtcG9ydHNdOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9IGVsc2UgeworCQkJYWlycSA9IGlycTsKKwkJfQorCisJCUJVR01TRzIoRF9JTklULCAiKCVkLCIsIGFpcnEpOworCQlvcGVucGFyZW4gPSAxOworCisJCS8qIEV2ZXJ5dGhpbmcgc2VlbXMgb2theS4gIEJ1dCB3aGljaCBzaG1lbSwgaWYgYW55LCBwdXRzCisJCSAqIGJhY2sgaXRzIHNpZ25hdHVyZSBieXRlIHdoZW4gdGhlIGNhcmQgaXMgcmVzZXQ/CisJCSAqCisJCSAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBjYXJkcyBpbnN0YWxsZWQsIHRoZXJlIG1pZ2h0IGJlCisJCSAqIG11bHRpcGxlIHNobWVtcyBzdGlsbCBpbiB0aGUgbGlzdC4KKwkJICovCisjaWZkZWYgRkFTVF9QUk9CRQorCQlpZiAobnVtcG9ydHMgPiAxIHx8IG51bXNobWVtcyA+IDEpIHsKKwkJCWluYihfUkVTRVQpOworCQkJbWRlbGF5KFJFU0VUdGltZSk7CisJCX0gZWxzZSB7CisJCQkvKiBqdXN0IG9uZSBzaG1lbSBhbmQgcG9ydCwgYXNzdW1lIHRoZXkgbWF0Y2ggKi8KKwkJCWlzYV93cml0ZWIoVEVTVHZhbHVlLCBzaG1lbXNbMF0pOworCQl9CisjZWxzZQorCQlpbmIoX1JFU0VUKTsKKwkJbWRlbGF5KFJFU0VUdGltZSk7CisjZW5kaWYKKworCQlmb3IgKHAgPSAmc2htZW1zWzBdOyBwIDwgc2htZW1zICsgbnVtc2htZW1zOyBwKyspIHsKKwkJCXVfbG9uZyBwdHIgPSAqcDsKKworCQkJaWYgKGlzYV9yZWFkYihwdHIpID09IFRFU1R2YWx1ZSkgewkvKiBmb3VuZCBvbmUgKi8KKwkJCQlCVUdNU0cyKERfSU5JVCwgIiVsWGgpXG4iLCAqcCk7CisJCQkJb3BlbnBhcmVuID0gMDsKKworCQkJCS8qIHJlZ2lzdGVyIHRoZSBjYXJkICovCisJCQkJaWYgKGNvbTkweHhfZm91bmQoKnBvcnQsIGFpcnEsICpwKSA9PSAwKQorCQkJCQlmb3VuZCA9IDE7CisJCQkJbnVtcHJpbnQgPSAtMTsKKworCQkJCS8qIHJlbW92ZSBzaG1lbSBmcm9tIHRoZSBsaXN0ICovCisJCQkJKnAgPSBzaG1lbXNbLS1udW1zaG1lbXNdOworCQkJCWJyZWFrOwkvKiBnbyB0byB0aGUgbmV4dCBJL08gcG9ydCAqLworCQkJfSBlbHNlIHsKKwkJCQlCVUdNU0cyKERfSU5JVF9SRUFTT05TLCAiJVhoLSIsIGlzYV9yZWFkYihwdHIpKTsKKwkJCX0KKwkJfQorCisJCWlmIChvcGVucGFyZW4pIHsKKwkJCUJVR0xWTChEX0lOSVQpIHByaW50aygibm8gbWF0Y2hpbmcgc2htZW0pXG4iKTsKKwkJCUJVR0xWTChEX0lOSVRfUkVBU09OUykgcHJpbnRrKCJTNTogIik7CisJCQlCVUdMVkwoRF9JTklUX1JFQVNPTlMpIG51bXByaW50ID0gMDsKKwkJfQorCQlpZiAoIWZvdW5kKQorCQkJcmVsZWFzZV9yZWdpb24oKnBvcnQsIEFSQ05FVF9UT1RBTF9TSVpFKTsKKwkJKnBvcnQtLSA9IHBvcnRzWy0tbnVtcG9ydHNdOworCX0KKworCUJVR0xWTChEX0lOSVRfUkVBU09OUykgcHJpbnRrKCJcbiIpOworCisJLyogTm93IHB1dCBiYWNrIFRFU1R2YWx1ZSBvbiBhbGwgbGVmdG92ZXIgc2htZW1zLiAqLworCWZvciAocCA9ICZzaG1lbXNbMF07IHAgPCBzaG1lbXMgKyBudW1zaG1lbXM7IHArKykgeworCQlpc2Ffd3JpdGViKFRFU1R2YWx1ZSwgKnApOworCQlyZWxlYXNlX21lbV9yZWdpb24oKnAsIEJVRkZFUl9TSVpFKTsKKwl9Cit9CisKKworLyogU2V0IHVwIHRoZSBzdHJ1Y3QgbmV0X2RldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYXJkLiAgQ2FsbGVkIGFmdGVyCisgKiBwcm9iaW5nIHN1Y2NlZWRzLgorICovCitzdGF0aWMgaW50IF9faW5pdCBjb205MHh4X2ZvdW5kKGludCBpb2FkZHIsIGludCBhaXJxLCB1X2xvbmcgc2htZW0pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHA7CisJdV9sb25nIGZpcnN0X21pcnJvciwgbGFzdF9taXJyb3I7CisJaW50IG1pcnJvcl9zaXplOworCisJLyogYWxsb2NhdGUgc3RydWN0IG5ldF9kZXZpY2UgKi8KKwlkZXYgPSBhbGxvY19hcmNkZXYoZGV2aWNlKTsKKwlpZiAoIWRldikgeworCQlCVUdNU0cyKERfTk9STUFMLCAiY29tOTB4eDogQ2FuJ3QgYWxsb2NhdGUgZGV2aWNlIVxuIik7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihzaG1lbSwgQlVGRkVSX1NJWkUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbHAgPSBkZXYtPnByaXY7CisJLyogZmluZCB0aGUgcmVhbCBzaGFyZWQgbWVtb3J5IHN0YXJ0L2VuZCBwb2ludHMsIGluY2x1ZGluZyBtaXJyb3JzICovCisKKwkvKiBndWVzcyB0aGUgYWN0dWFsIHNpemUgb2Ygb25lICJtZW1vcnkgbWlycm9yIiAtIHRoZSBudW1iZXIgb2YKKwkgKiBieXRlcyBiZXR3ZWVuIGNvcGllcyBvZiB0aGUgc2hhcmVkIG1lbW9yeS4gIE9uIG1vc3QgY2FyZHMsIGl0J3MKKwkgKiAyayAob3IgdGhlcmUgYXJlIG5vIG1pcnJvcnMgYXQgYWxsKSBidXQgb24gc29tZSwgaXQncyA0ay4KKwkgKi8KKwltaXJyb3Jfc2l6ZSA9IE1JUlJPUl9TSVpFOworCWlmIChpc2FfcmVhZGIoc2htZW0pID09IFRFU1R2YWx1ZQorCSAgICAmJiBpc2FfcmVhZGIoc2htZW0gLSBtaXJyb3Jfc2l6ZSkgIT0gVEVTVHZhbHVlCisJICAgICYmIGlzYV9yZWFkYihzaG1lbSAtIDIgKiBtaXJyb3Jfc2l6ZSkgPT0gVEVTVHZhbHVlKQorCQltaXJyb3Jfc2l6ZSAqPSAyOworCisJZmlyc3RfbWlycm9yID0gbGFzdF9taXJyb3IgPSBzaG1lbTsKKwl3aGlsZSAoaXNhX3JlYWRiKGZpcnN0X21pcnJvcikgPT0gVEVTVHZhbHVlKQorCQlmaXJzdF9taXJyb3IgLT0gbWlycm9yX3NpemU7CisJZmlyc3RfbWlycm9yICs9IG1pcnJvcl9zaXplOworCisJd2hpbGUgKGlzYV9yZWFkYihsYXN0X21pcnJvcikgPT0gVEVTVHZhbHVlKQorCQlsYXN0X21pcnJvciArPSBtaXJyb3Jfc2l6ZTsKKwlsYXN0X21pcnJvciAtPSBtaXJyb3Jfc2l6ZTsKKworCWRldi0+bWVtX3N0YXJ0ID0gZmlyc3RfbWlycm9yOworCWRldi0+bWVtX2VuZCA9IGxhc3RfbWlycm9yICsgTUlSUk9SX1NJWkUgLSAxOworCisJcmVsZWFzZV9tZW1fcmVnaW9uKHNobWVtLCBCVUZGRVJfU0laRSk7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oZGV2LT5tZW1fc3RhcnQsIGRldi0+bWVtX2VuZCAtIGRldi0+bWVtX3N0YXJ0ICsgMSwgImFyY25ldCAoOTB4eCkiKSkKKwkJZ290byBlcnJfZnJlZV9kZXY7CisKKwkvKiByZXNlcnZlIHRoZSBpcnEgKi8KKwlpZiAocmVxdWVzdF9pcnEoYWlycSwgJmFyY25ldF9pbnRlcnJ1cHQsIDAsICJhcmNuZXQgKDkweHgpIiwgZGV2KSkgeworCQlCVUdNU0coRF9OT1JNQUwsICJDYW4ndCBnZXQgSVJRICVkIVxuIiwgYWlycSk7CisJCWdvdG8gZXJyX3JlbGVhc2VfbWVtOworCX0KKwlkZXYtPmlycSA9IGFpcnE7CisKKwkvKiBJbml0aWFsaXplIHRoZSByZXN0IG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWxwLT5jYXJkX25hbWUgPSAiQ09NOTB4eCI7CisJbHAtPmh3LmNvbW1hbmQgPSBjb205MHh4X2NvbW1hbmQ7CisJbHAtPmh3LnN0YXR1cyA9IGNvbTkweHhfc3RhdHVzOworCWxwLT5ody5pbnRtYXNrID0gY29tOTB4eF9zZXRtYXNrOworCWxwLT5ody5yZXNldCA9IGNvbTkweHhfcmVzZXQ7CisJbHAtPmh3Lm93bmVyID0gVEhJU19NT0RVTEU7CisJbHAtPmh3LmNvcHlfdG9fY2FyZCA9IGNvbTkweHhfY29weV90b19jYXJkOworCWxwLT5ody5jb3B5X2Zyb21fY2FyZCA9IGNvbTkweHhfY29weV9mcm9tX2NhcmQ7CisJbHAtPm1lbV9zdGFydCA9IGlvcmVtYXAoZGV2LT5tZW1fc3RhcnQsIGRldi0+bWVtX2VuZCAtIGRldi0+bWVtX3N0YXJ0ICsgMSk7CisJaWYgKCFscC0+bWVtX3N0YXJ0KSB7CisJCUJVR01TRyhEX05PUk1BTCwgIkNhbid0IHJlbWFwIGRldmljZSBtZW1vcnkhXG4iKTsKKwkJZ290byBlcnJfZnJlZV9pcnE7CisJfQorCisJLyogZ2V0IGFuZCBjaGVjayB0aGUgc3RhdGlvbiBJRCBmcm9tIG9mZnNldCAxIGluIHNobWVtICovCisJZGV2LT5kZXZfYWRkclswXSA9IHJlYWRiKGxwLT5tZW1fc3RhcnQgKyAxKTsKKworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCisJQlVHTVNHKERfTk9STUFMLCAiQ09NOTB4eCBzdGF0aW9uICUwMlhoIGZvdW5kIGF0ICUwM2xYaCwgSVJRICVkLCAiCisJICAgICAgICJTaE1lbSAlbFhoICglbGQqJXhoKS5cbiIsCisJICAgICAgIGRldi0+ZGV2X2FkZHJbMF0sCisJICAgICAgIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwgZGV2LT5tZW1fc3RhcnQsCisJIChkZXYtPm1lbV9lbmQgLSBkZXYtPm1lbV9zdGFydCArIDEpIC8gbWlycm9yX3NpemUsIG1pcnJvcl9zaXplKTsKKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkKKwkJZ290byBlcnJfdW5tYXA7CisKKwljYXJkc1tudW1jYXJkcysrXSA9IGRldjsKKwlyZXR1cm4gMDsKKworZXJyX3VubWFwOgorCWlvdW5tYXAobHAtPm1lbV9zdGFydCk7CitlcnJfZnJlZV9pcnE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CitlcnJfcmVsZWFzZV9tZW06CisJcmVsZWFzZV9tZW1fcmVnaW9uKGRldi0+bWVtX3N0YXJ0LCBkZXYtPm1lbV9lbmQgLSBkZXYtPm1lbV9zdGFydCArIDEpOworZXJyX2ZyZWVfZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIC1FSU87Cit9CisKKworc3RhdGljIHZvaWQgY29tOTB4eF9jb21tYW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjbWQpCit7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlBQ09NTUFORChjbWQpOworfQorCisKK3N0YXRpYyBpbnQgY29tOTB4eF9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCXJldHVybiBBU1RBVFVTKCk7Cit9CisKKworc3RhdGljIHZvaWQgY29tOTB4eF9zZXRtYXNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtYXNrKQoreworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJQUlOVE1BU0sobWFzayk7Cit9CisKKworLyoKKyAqIERvIGEgaGFyZHdhcmUgcmVzZXQgb24gdGhlIGNhcmQsIGFuZCBzZXQgdXAgbmVjZXNzYXJ5IHJlZ2lzdGVycy4KKyAqIAorICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFzIGxpdHRsZSBhcyBwb3NzaWJsZSwgYmVjYXVzZSBpdCBkaXNydXB0cyB0aGUKKyAqIHRva2VuIG9uIHRoZSBuZXR3b3JrIChjYXVzZXMgYSBSRUNPTikgYW5kIHJlcXVpcmVzIGEgc2lnbmlmaWNhbnQgZGVsYXkuCisgKgorICogSG93ZXZlciwgaXQgZG9lcyBtYWtlIHN1cmUgdGhlIGNhcmQgaXMgaW4gYSBkZWZpbmVkIHN0YXRlLgorICovCitpbnQgY29tOTB4eF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVhbGx5X3Jlc2V0KQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJQlVHTVNHKERfSU5JVCwgIlJlc2V0dGluZyAoc3RhdHVzPSUwMlhoKVxuIiwgQVNUQVRVUygpKTsKKworCWlmIChyZWFsbHlfcmVzZXQpIHsKKwkJLyogcmVzZXQgdGhlIGNhcmQgKi8KKwkJaW5iKF9SRVNFVCk7CisJCW1kZWxheShSRVNFVHRpbWUpOworCX0KKwlBQ09NTUFORChDRkxBR1NjbWQgfCBSRVNFVGNsZWFyKTsJLyogY2xlYXIgZmxhZ3MgJiBlbmQgcmVzZXQgKi8KKwlBQ09NTUFORChDRkxBR1NjbWQgfCBDT05GSUdjbGVhcik7CisKKwkvKiBkb24ndCBkbyB0aGlzIHVudGlsIHdlIHZlcmlmeSB0aGF0IGl0IGRvZXNuJ3QgaHVydCBvbGRlciBjYXJkcyEgKi8KKwkvKiBvdXRiKGluYihfQ09ORklHKSB8IEVOQUJMRTE2ZmxhZywgX0NPTkZJRyk7ICovCisKKwkvKiB2ZXJpZnkgdGhhdCB0aGUgQVJDbmV0IHNpZ25hdHVyZSBieXRlIGlzIHByZXNlbnQgKi8KKwlpZiAocmVhZGIobHAtPm1lbV9zdGFydCkgIT0gVEVTVHZhbHVlKSB7CisJCWlmIChyZWFsbHlfcmVzZXQpCisJCQlCVUdNU0coRF9OT1JNQUwsICJyZXNldCBmYWlsZWQ6IFRFU1R2YWx1ZSBub3QgcHJlc2VudC5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJLyogZW5hYmxlIGV4dGVuZGVkICg1MTItYnl0ZSkgcGFja2V0cyAqLworCUFDT01NQU5EKENPTkZJR2NtZCB8IEVYVGNvbmYpOworCisJLyogY2xlYW4gb3V0IGFsbCB0aGUgbWVtb3J5IHRvIG1ha2UgZGVidWdnaW5nIG1ha2UgbW9yZSBzZW5zZSA6KSAqLworCUJVR0xWTChEX0RVUklORykKKwkgICAgbWVtc2V0X2lvKGxwLT5tZW1fc3RhcnQsIDB4NDIsIDIwNDgpOworCisJLyogZG9uZSEgIHJldHVybiBzdWNjZXNzLiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjb205MHh4X2NvcHlfdG9fY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmbnVtLCBpbnQgb2Zmc2V0LAorCQkJCSB2b2lkICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKm1lbWFkZHIgPSBscC0+bWVtX3N0YXJ0ICsgYnVmbnVtICogNTEyICsgb2Zmc2V0OworCVRJTUUoIm1lbWNweV90b2lvIiwgY291bnQsIG1lbWNweV90b2lvKG1lbWFkZHIsIGJ1ZiwgY291bnQpKTsKK30KKworCitzdGF0aWMgdm9pZCBjb205MHh4X2NvcHlfZnJvbV9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZudW0sIGludCBvZmZzZXQsCisJCQkJICAgdm9pZCAqYnVmLCBpbnQgY291bnQpCit7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJdm9pZCBfX2lvbWVtICptZW1hZGRyID0gbHAtPm1lbV9zdGFydCArIGJ1Zm51bSAqIDUxMiArIG9mZnNldDsKKwlUSU1FKCJtZW1jcHlfZnJvbWlvIiwgY291bnQsIG1lbWNweV9mcm9taW8oYnVmLCBtZW1hZGRyLCBjb3VudCkpOworfQorCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBfX2luaXQgY29tOTB4eF9pbml0KHZvaWQpCit7CisJaWYgKGlycSA9PSAyKQorCQlpcnEgPSA5OworCWNvbTkweHhfcHJvYmUoKTsKKwlpZiAoIW51bWNhcmRzKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNvbTkweHhfZXhpdCh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGFyY25ldF9sb2NhbCAqbHA7CisJaW50IGNvdW50OworCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbnVtY2FyZHM7IGNvdW50KyspIHsKKwkJZGV2ID0gY2FyZHNbY291bnRdOworCQlscCA9IGRldi0+cHJpdjsKKworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJaW91bm1hcChscC0+bWVtX3N0YXJ0KTsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEFSQ05FVF9UT1RBTF9TSVpFKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGRldi0+bWVtX3N0YXJ0LCBkZXYtPm1lbV9lbmQgLSBkZXYtPm1lbV9zdGFydCArIDEpOworCQlmcmVlX25ldGRldihkZXYpOworCX0KK30KKworbW9kdWxlX2luaXQoY29tOTB4eF9pbml0KTsKK21vZHVsZV9leGl0KGNvbTkweHhfZXhpdCk7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBjb205MHh4X3NldHVwKGNoYXIgKnMpCit7CisJaW50IGludHNbOF07CisKKwlzID0gZ2V0X29wdGlvbnMocywgOCwgaW50cyk7CisJaWYgKCFpbnRzWzBdICYmICEqcykgeworCQlwcmludGsoImNvbTkweHg6IERpc2FibGVkLlxuIik7CisJCXJldHVybiAxOworCX0KKworCXN3aXRjaCAoaW50c1swXSkgeworCWRlZmF1bHQ6CQkvKiBFUlJPUiAqLworCQlwcmludGsoImNvbTkweHg6IFRvbyBtYW55IGFyZ3VtZW50cy5cbiIpOworCWNhc2UgMzoJCS8qIE1lbSBhZGRyZXNzICovCisJCXNobWVtID0gaW50c1szXTsKKwljYXNlIDI6CQkvKiBJUlEgKi8KKwkJaXJxID0gaW50c1syXTsKKwljYXNlIDE6CQkvKiBJTyBhZGRyZXNzICovCisJCWlvID0gaW50c1sxXTsKKwl9CisKKwlpZiAoKnMpCisJCXNucHJpbnRmKGRldmljZSwgc2l6ZW9mKGRldmljZSksICIlcyIsIHMpOworCisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImNvbTkweHg9IiwgY29tOTB4eF9zZXR1cCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FyY25ldC9yZmMxMDUxLmMgYi9kcml2ZXJzL25ldC9hcmNuZXQvcmZjMTA1MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNzkxMzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcmNuZXQvcmZjMTA1MS5jCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogTGludXggQVJDbmV0IGRyaXZlciAtIFJGQzEwNTEgKCJzaW1wbGUiIHN0YW5kYXJkKSBwYWNrZXQgZW5jYXBzdWxhdGlvbgorICogCisgKiBXcml0dGVuIDE5OTQtMTk5OSBieSBBdmVyeSBQZW5uYXJ1bi4KKyAqIERlcml2ZWQgZnJvbSBza2VsZXRvbi5jIGJ5IERvbmFsZCBCZWNrZXIuCisgKgorICogU3BlY2lhbCB0aGFua3MgdG8gQ29udGVtcG9yYXJ5IENvbnRyb2xzLCBJbmMuICh3d3cuY2NvbnRyb2xzLmNvbSkKKyAqICBmb3Igc3BvbnNvcmluZyB0aGUgZnVydGhlciBkZXZlbG9wbWVudCBvZiB0aGlzIGRyaXZlci4KKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlIG9yaWdpbmFsIGNvcHlyaWdodCBvZiBza2VsZXRvbi5jIHdhcyBhcyBmb2xsb3dzOgorICoKKyAqIHNrZWxldG9uLmMgV3JpdHRlbiAxOTkzIGJ5IERvbmFsZCBCZWNrZXIuCisgKiBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgKiBEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LiAgVGhpcyBzb2Z0d2FyZSBtYXkgb25seSBiZSB1c2VkCisgKiBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIG1vZGlmaWVkIGJ5IFNSQywgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZvciBtb3JlIGRldGFpbHMsIHNlZSBkcml2ZXJzL25ldC9hcmNuZXQuYworICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYXJjZGV2aWNlLmg+CisKKyNkZWZpbmUgVkVSU0lPTiAiYXJjbmV0OiBSRkMxMDUxIFwic2ltcGxlIHN0YW5kYXJkXCIgKGBzJykgZW5jYXBzdWxhdGlvbiBzdXBwb3J0IGxvYWRlZC5cbiIKKworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJ4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZudW0sCisJICAgICAgIHN0cnVjdCBhcmNoZHIgKnBrdGhkciwgaW50IGxlbmd0aCk7CitzdGF0aWMgaW50IGJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJdW5zaWduZWQgc2hvcnQgdHlwZSwgdWludDhfdCBkYWRkcik7CitzdGF0aWMgaW50IHByZXBhcmVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGFyY2hkciAqcGt0LCBpbnQgbGVuZ3RoLAorCQkgICAgICBpbnQgYnVmbnVtKTsKKworCitzdHJ1Y3QgQXJjUHJvdG8gcmZjMTA1MV9wcm90byA9Cit7CisJLnN1ZmZpeAkJPSAncycsCisJLm10dQkJPSBYTVRVIC0gUkZDMTA1MV9IRFJfU0laRSwKKwkuaXNfaXAgICAgICAgICAgPSAxLAorCS5yeAkJPSByeCwKKwkuYnVpbGRfaGVhZGVyCT0gYnVpbGRfaGVhZGVyLAorCS5wcmVwYXJlX3R4CT0gcHJlcGFyZV90eCwKKwkuY29udGludWVfdHggICAgPSBOVUxMLAorCS5hY2tfdHggICAgICAgICA9IE5VTEwKK307CisKKworc3RhdGljIGludCBfX2luaXQgYXJjbmV0X3JmYzEwNTFfaW5pdCh2b2lkKQoreworCXByaW50ayhWRVJTSU9OKTsKKworCWFyY19wcm90b19tYXBbQVJDX1BfSVBfUkZDMTA1MV0KKwkgICAgPSBhcmNfcHJvdG9fbWFwW0FSQ19QX0FSUF9SRkMxMDUxXQorCSAgICA9ICZyZmMxMDUxX3Byb3RvOworCisJLyogaWYgc29tZW9uZSBlbHNlIGFscmVhZHkgb3ducyB0aGUgYnJvYWRjYXN0LCB3ZSB3b24ndCB0YWtlIGl0ICovCisJaWYgKGFyY19iY2FzdF9wcm90byA9PSBhcmNfcHJvdG9fZGVmYXVsdCkKKwkJYXJjX2JjYXN0X3Byb3RvID0gJnJmYzEwNTFfcHJvdG87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFyY25ldF9yZmMxMDUxX2V4aXQodm9pZCkKK3sKKwlhcmNuZXRfdW5yZWdpc3Rlcl9wcm90bygmcmZjMTA1MV9wcm90byk7Cit9CisKK21vZHVsZV9pbml0KGFyY25ldF9yZmMxMDUxX2luaXQpOworbW9kdWxlX2V4aXQoYXJjbmV0X3JmYzEwNTFfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIERldGVybWluZSBhIHBhY2tldCdzIHByb3RvY29sIElELgorICogCisgKiBXaXRoIEFSQ25ldCB3ZSBoYXZlIHRvIGNvbnZlcnQgZXZlcnl0aGluZyB0byBFdGhlcm5ldC1zdHlsZSBzdHVmZi4KKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IHR5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgYXJjaGRyICpwa3QgPSAoc3RydWN0IGFyY2hkciAqKSBza2ItPmRhdGE7CisJc3RydWN0IGFyY19yZmMxMDUxICpzb2Z0ID0gJnBrdC0+c29mdC5yZmMxMDUxOworCWludCBoZHJfc2l6ZSA9IEFSQ19IRFJfU0laRSArIFJGQzEwNTFfSERSX1NJWkU7CisKKwkvKiBQdWxsIG9mZiB0aGUgYXJjbmV0IGhlYWRlci4gKi8KKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiX3B1bGwoc2tiLCBoZHJfc2l6ZSk7CisKKwlpZiAocGt0LT5oYXJkLmRlc3QgPT0gMCkKKwkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9CUk9BRENBU1Q7CisJZWxzZSBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCS8qIGlmIHdlJ3JlIG5vdCBzZW5kaW5nIHRvIG91cnNlbHZlcyA6KSAqLworCQlpZiAocGt0LT5oYXJkLmRlc3QgIT0gZGV2LT5kZXZfYWRkclswXSkKKwkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOworCX0KKwkvKiBub3cgcmV0dXJuIHRoZSBwcm90b2NvbCBudW1iZXIgKi8KKwlzd2l0Y2ggKHNvZnQtPnByb3RvKSB7CisJY2FzZSBBUkNfUF9JUF9SRkMxMDUxOgorCQlyZXR1cm4gaHRvbnMoRVRIX1BfSVApOworCWNhc2UgQVJDX1BfQVJQX1JGQzEwNTE6CisJCXJldHVybiBodG9ucyhFVEhfUF9BUlApOworCisJZGVmYXVsdDoKKwkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gaHRvbnMoRVRIX1BfSVApOworfQorCisKKy8qIHBhY2tldCByZWNlaXZlciAqLworc3RhdGljIHZvaWQgcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSwKKwkgICAgICAgc3RydWN0IGFyY2hkciAqcGt0aGRyLCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGFyY2hkciAqcGt0ID0gcGt0aGRyOworCWludCBvZnM7CisKKwlCVUdNU0coRF9EVVJJTkcsICJpdCdzIGEgcmF3IHBhY2tldCAobGVuZ3RoPSVkKVxuIiwgbGVuZ3RoKTsKKworCWlmIChsZW5ndGggPj0gTWluVFUpCisJCW9mcyA9IDUxMiAtIGxlbmd0aDsKKwllbHNlCisJCW9mcyA9IDI1NiAtIGxlbmd0aDsKKworCXNrYiA9IGFsbG9jX3NrYihsZW5ndGggKyBBUkNfSERSX1NJWkUsIEdGUF9BVE9NSUMpOworCWlmIChza2IgPT0gTlVMTCkgeworCQlCVUdNU0coRF9OT1JNQUwsICJNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIik7CisJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXJldHVybjsKKwl9CisJc2tiX3B1dChza2IsIGxlbmd0aCArIEFSQ19IRFJfU0laRSk7CisJc2tiLT5kZXYgPSBkZXY7CisKKwlwa3QgPSAoc3RydWN0IGFyY2hkciAqKSBza2ItPmRhdGE7CisKKwkvKiB1cCB0byBzaXplb2YocGt0LT5zb2Z0KSBoYXMgYWxyZWFkeSBiZWVuIGNvcGllZCBmcm9tIHRoZSBjYXJkICovCisJbWVtY3B5KHBrdCwgcGt0aGRyLCBzaXplb2Yoc3RydWN0IGFyY2hkcikpOworCWlmIChsZW5ndGggPiBzaXplb2YocGt0LT5zb2Z0KSkKKwkJbHAtPmh3LmNvcHlfZnJvbV9jYXJkKGRldiwgYnVmbnVtLCBvZnMgKyBzaXplb2YocGt0LT5zb2Z0KSwKKwkJCQkgICAgICBwa3QtPnNvZnQucmF3ICsgc2l6ZW9mKHBrdC0+c29mdCksCisJCQkJICAgICAgbGVuZ3RoIC0gc2l6ZW9mKHBrdC0+c29mdCkpOworCisJQlVHTFZMKERfU0tCKSBhcmNuZXRfZHVtcF9za2IoZGV2LCBza2IsICJyeCIpOworCisJc2tiLT5wcm90b2NvbCA9IHR5cGVfdHJhbnMoc2tiLCBkZXYpOworCW5ldGlmX3J4KHNrYik7CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKK30KKworCisvKgorICogQ3JlYXRlIHRoZSBBUkNuZXQgaGFyZC9zb2Z0IGhlYWRlcnMgZm9yIFJGQzEwNTEuCisgKi8KK3N0YXRpYyBpbnQgYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQl1bnNpZ25lZCBzaG9ydCB0eXBlLCB1aW50OF90IGRhZGRyKQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWludCBoZHJfc2l6ZSA9IEFSQ19IRFJfU0laRSArIFJGQzEwNTFfSERSX1NJWkU7CisJc3RydWN0IGFyY2hkciAqcGt0ID0gKHN0cnVjdCBhcmNoZHIgKikgc2tiX3B1c2goc2tiLCBoZHJfc2l6ZSk7CisJc3RydWN0IGFyY19yZmMxMDUxICpzb2Z0ID0gJnBrdC0+c29mdC5yZmMxMDUxOworCisJLyogc2V0IHRoZSBwcm90b2NvbCBJRCBhY2NvcmRpbmcgdG8gUkZDMTA1MSAqLworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgRVRIX1BfSVA6CisJCXNvZnQtPnByb3RvID0gQVJDX1BfSVBfUkZDMTA1MTsKKwkJYnJlYWs7CisJY2FzZSBFVEhfUF9BUlA6CisJCXNvZnQtPnByb3RvID0gQVJDX1BfQVJQX1JGQzEwNTE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVR01TRyhEX05PUk1BTCwgIlJGQzEwNTE6IEkgZG9uJ3QgdW5kZXJzdGFuZCBwcm90b2NvbCAlZCAoJVhoKVxuIiwKKwkJICAgICAgIHR5cGUsIHR5cGUpOworCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJCWxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQlyZXR1cm4gMDsKKwl9CisKKworCS8qCisJICogU2V0IHRoZSBzb3VyY2UgaGFyZHdhcmUgYWRkcmVzcy4KKwkgKgorCSAqIFRoaXMgaXMgcHJldHR5IHBvaW50bGVzcyBmb3IgbW9zdCBwdXJwb3NlcywgYnV0IGl0IGNhbiBoZWxwIGluCisJICogZGVidWdnaW5nLiAgQVJDbmV0IGRvZXMgbm90IGFsbG93IHVzIHRvIGNoYW5nZSB0aGUgc291cmNlIGFkZHJlc3MgaW4KKwkgKiB0aGUgYWN0dWFsIHBhY2tldCBzZW50KQorCSAqLworCXBrdC0+aGFyZC5zb3VyY2UgPSAqZGV2LT5kZXZfYWRkcjsKKworCS8qIHNlZSBsaW51eC9uZXQvZXRoZXJuZXQvZXRoLmMgdG8gc2VlIHdoZXJlIEkgZ290IHRoZSBmb2xsb3dpbmcgKi8KKworCWlmIChkZXYtPmZsYWdzICYgKElGRl9MT09QQkFDSyB8IElGRl9OT0FSUCkpIHsKKwkJLyogCisJCSAqIEZJWE1FOiBmaWxsIGluIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGRlc3QgaXBhZGRyIGhlcmUgdG8gYmV0dGVyCisJCSAqIGNvbXBseSB3aXRoIFJGQzEwNTEgaW4gIm5vYXJwIiBtb2RlLgorCQkgKi8KKwkJcGt0LT5oYXJkLmRlc3QgPSAwOworCQlyZXR1cm4gaGRyX3NpemU7CisJfQorCS8qIG90aGVyd2lzZSwganVzdCBmaWxsIGl0IGluIGFuZCBnbyEgKi8KKwlwa3QtPmhhcmQuZGVzdCA9IGRhZGRyOworCisJcmV0dXJuIGhkcl9zaXplOwkvKiBzdWNjZXNzICovCit9CisKKworc3RhdGljIGludCBwcmVwYXJlX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBhcmNoZHIgKnBrdCwgaW50IGxlbmd0aCwKKwkJICAgICAgaW50IGJ1Zm51bSkKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgYXJjX2hhcmR3YXJlICpoYXJkID0gJnBrdC0+aGFyZDsKKwlpbnQgb2ZzOworCisJQlVHTVNHKERfRFVSSU5HLCAicHJlcGFyZV90eDogdHhidWZzPSVkLyVkLyVkXG4iLAorCSAgICAgICBscC0+bmV4dF90eCwgbHAtPmN1cl90eCwgYnVmbnVtKTsKKworCWxlbmd0aCAtPSBBUkNfSERSX1NJWkU7CS8qIGhhcmQgaGVhZGVyIGlzIG5vdCBpbmNsdWRlZCBpbiBwYWNrZXQgbGVuZ3RoICovCisKKwlpZiAobGVuZ3RoID4gWE1UVSkgeworCQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuISBvdGhlciBwZW9wbGUgYWxyZWFkeSBjaGVjayBmb3IgdGhpcy4gKi8KKwkJQlVHTVNHKERfTk9STUFMLCAiQnVnISAgcHJlcGFyZV90eCB3aXRoIHNpemUgJWQgKD4gJWQpXG4iLAorCQkgICAgICAgbGVuZ3RoLCBYTVRVKTsKKwkJbGVuZ3RoID0gWE1UVTsKKwl9CisJaWYgKGxlbmd0aCA+IE1pblRVKSB7CisJCWhhcmQtPm9mZnNldFswXSA9IDA7CisJCWhhcmQtPm9mZnNldFsxXSA9IG9mcyA9IDUxMiAtIGxlbmd0aDsKKwl9IGVsc2UgaWYgKGxlbmd0aCA+IE1UVSkgeworCQloYXJkLT5vZmZzZXRbMF0gPSAwOworCQloYXJkLT5vZmZzZXRbMV0gPSBvZnMgPSA1MTIgLSBsZW5ndGggLSAzOworCX0gZWxzZQorCQloYXJkLT5vZmZzZXRbMF0gPSBvZnMgPSAyNTYgLSBsZW5ndGg7CisKKwlscC0+aHcuY29weV90b19jYXJkKGRldiwgYnVmbnVtLCAwLCBoYXJkLCBBUkNfSERSX1NJWkUpOworCWxwLT5ody5jb3B5X3RvX2NhcmQoZGV2LCBidWZudW0sIG9mcywgJnBrdC0+c29mdCwgbGVuZ3RoKTsKKworCWxwLT5sYXN0bG9hZF9kZXN0ID0gaGFyZC0+ZGVzdDsKKworCXJldHVybiAxOwkJLyogZG9uZSAqLworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJjbmV0L3JmYzEyMDEuYyBiL2RyaXZlcnMvbmV0L2FyY25ldC9yZmMxMjAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI2YWU0YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FyY25ldC9yZmMxMjAxLmMKQEAgLTAsMCArMSw1NDkgQEAKKy8qCisgKiBMaW51eCBBUkNuZXQgZHJpdmVyIC0gUkZDMTIwMSAoc3RhbmRhcmQpIHBhY2tldCBlbmNhcHN1bGF0aW9uCisgKiAKKyAqIFdyaXR0ZW4gMTk5NC0xOTk5IGJ5IEF2ZXJ5IFBlbm5hcnVuLgorICogRGVyaXZlZCBmcm9tIHNrZWxldG9uLmMgYnkgRG9uYWxkIEJlY2tlci4KKyAqCisgKiBTcGVjaWFsIHRoYW5rcyB0byBDb250ZW1wb3JhcnkgQ29udHJvbHMsIEluYy4gKHd3dy5jY29udHJvbHMuY29tKQorICogIGZvciBzcG9uc29yaW5nIHRoZSBmdXJ0aGVyIGRldmVsb3BtZW50IG9mIHRoaXMgZHJpdmVyLgorICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgb3JpZ2luYWwgY29weXJpZ2h0IG9mIHNrZWxldG9uLmMgd2FzIGFzIGZvbGxvd3M6CisgKgorICogc2tlbGV0b24uYyBXcml0dGVuIDE5OTMgYnkgRG9uYWxkIEJlY2tlci4KKyAqIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKyAqIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuICBUaGlzIHNvZnR3YXJlIG1heSBvbmx5IGJlIHVzZWQKKyAqIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogbW9kaWZpZWQgYnkgU1JDLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRm9yIG1vcmUgZGV0YWlscywgc2VlIGRyaXZlcnMvbmV0L2FyY25ldC5jCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2FyY2RldmljZS5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisjZGVmaW5lIFZFUlNJT04gImFyY25ldDogUkZDMTIwMSBcInN0YW5kYXJkXCIgKGBhJykgZW5jYXBzdWxhdGlvbiBzdXBwb3J0IGxvYWRlZC5cbiIKKworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJ4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWZudW0sCisJICAgICAgIHN0cnVjdCBhcmNoZHIgKnBrdGhkciwgaW50IGxlbmd0aCk7CitzdGF0aWMgaW50IGJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJdW5zaWduZWQgc2hvcnQgdHlwZSwgdWludDhfdCBkYWRkcik7CitzdGF0aWMgaW50IHByZXBhcmVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGFyY2hkciAqcGt0LCBpbnQgbGVuZ3RoLAorCQkgICAgICBpbnQgYnVmbnVtKTsKK3N0YXRpYyBpbnQgY29udGludWVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSk7CisKK3N0cnVjdCBBcmNQcm90byByZmMxMjAxX3Byb3RvID0KK3sKKwkuc3VmZml4CQk9ICdhJywKKwkubXR1CQk9IDE1MDAsCS8qIGNvdWxkIGJlIG1vcmUsIGJ1dCBzb21lIHJlY2VpdmVycyBjYW4ndCBoYW5kbGUgaXQuLi4gKi8KKwkuaXNfaXAgICAgICAgICAgPSAxLCAgICAvKiBUaGlzIGlzIGZvciBzZW5kaW5nIElQIGFuZCBBUlAgcGFja2FnZXMgKi8KKwkucngJCT0gcngsCisJLmJ1aWxkX2hlYWRlcgk9IGJ1aWxkX2hlYWRlciwKKwkucHJlcGFyZV90eAk9IHByZXBhcmVfdHgsCisJLmNvbnRpbnVlX3R4CT0gY29udGludWVfdHgsCisJLmFja190eCAgICAgICAgID0gTlVMTAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBhcmNuZXRfcmZjMTIwMV9pbml0KHZvaWQpCit7CisJcHJpbnRrKFZFUlNJT04pOworCisJYXJjX3Byb3RvX21hcFtBUkNfUF9JUF0KKwkgICAgPSBhcmNfcHJvdG9fbWFwW0FSQ19QX0lQVjZdCisJICAgID0gYXJjX3Byb3RvX21hcFtBUkNfUF9BUlBdCisJICAgID0gYXJjX3Byb3RvX21hcFtBUkNfUF9SQVJQXQorCSAgICA9IGFyY19wcm90b19tYXBbQVJDX1BfSVBYXQorCSAgICA9IGFyY19wcm90b19tYXBbQVJDX1BfTk9WRUxMX0VDXQorCSAgICA9ICZyZmMxMjAxX3Byb3RvOworCisJLyogaWYgc29tZW9uZSBlbHNlIGFscmVhZHkgb3ducyB0aGUgYnJvYWRjYXN0LCB3ZSB3b24ndCB0YWtlIGl0ICovCisJaWYgKGFyY19iY2FzdF9wcm90byA9PSBhcmNfcHJvdG9fZGVmYXVsdCkKKwkJYXJjX2JjYXN0X3Byb3RvID0gJnJmYzEyMDFfcHJvdG87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFyY25ldF9yZmMxMjAxX2V4aXQodm9pZCkKK3sKKwlhcmNuZXRfdW5yZWdpc3Rlcl9wcm90bygmcmZjMTIwMV9wcm90byk7Cit9CisKK21vZHVsZV9pbml0KGFyY25ldF9yZmMxMjAxX2luaXQpOworbW9kdWxlX2V4aXQoYXJjbmV0X3JmYzEyMDFfZXhpdCk7CisKKy8qCisgKiBEZXRlcm1pbmUgYSBwYWNrZXQncyBwcm90b2NvbCBJRC4KKyAqIAorICogV2l0aCBBUkNuZXQgd2UgaGF2ZSB0byBjb252ZXJ0IGV2ZXJ5dGhpbmcgdG8gRXRoZXJuZXQtc3R5bGUgc3R1ZmYuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB0eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFyY2hkciAqcGt0ID0gKHN0cnVjdCBhcmNoZHIgKikgc2tiLT5kYXRhOworCXN0cnVjdCBhcmNfcmZjMTIwMSAqc29mdCA9ICZwa3QtPnNvZnQucmZjMTIwMTsKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaGRyX3NpemUgPSBBUkNfSERSX1NJWkUgKyBSRkMxMjAxX0hEUl9TSVpFOworCisJLyogUHVsbCBvZmYgdGhlIGFyY25ldCBoZWFkZXIuICovCisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYl9wdWxsKHNrYiwgaGRyX3NpemUpOworCisJaWYgKHBrdC0+aGFyZC5kZXN0ID09IDApCisJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfQlJPQURDQVNUOworCWVsc2UgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQkvKiBpZiB3ZSdyZSBub3Qgc2VuZGluZyB0byBvdXJzZWx2ZXMgOikgKi8KKwkJaWYgKHBrdC0+aGFyZC5kZXN0ICE9IGRldi0+ZGV2X2FkZHJbMF0pCisJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKKwl9CisJLyogbm93IHJldHVybiB0aGUgcHJvdG9jb2wgbnVtYmVyICovCisJc3dpdGNoIChzb2Z0LT5wcm90bykgeworCWNhc2UgQVJDX1BfSVA6CisJCXJldHVybiBodG9ucyhFVEhfUF9JUCk7CisJY2FzZSBBUkNfUF9JUFY2OgorCQlyZXR1cm4gaHRvbnMoRVRIX1BfSVBWNik7CisJY2FzZSBBUkNfUF9BUlA6CisJCXJldHVybiBodG9ucyhFVEhfUF9BUlApOworCWNhc2UgQVJDX1BfUkFSUDoKKwkJcmV0dXJuIGh0b25zKEVUSF9QX1JBUlApOworCisJY2FzZSBBUkNfUF9JUFg6CisJY2FzZSBBUkNfUF9OT1ZFTExfRUM6CisJCXJldHVybiBodG9ucyhFVEhfUF84MDJfMyk7CisJZGVmYXVsdDoKKwkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gaHRvbnMoRVRIX1BfSVApOworfQorCisKKy8qIHBhY2tldCByZWNlaXZlciAqLworc3RhdGljIHZvaWQgcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJ1Zm51bSwKKwkgICAgICAgc3RydWN0IGFyY2hkciAqcGt0aGRyLCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGFyY2hkciAqcGt0ID0gcGt0aGRyOworCXN0cnVjdCBhcmNfcmZjMTIwMSAqc29mdCA9ICZwa3RoZHItPnNvZnQucmZjMTIwMTsKKwlpbnQgc2FkZHIgPSBwa3QtPmhhcmQuc291cmNlLCBvZnM7CisJc3RydWN0IEluY29taW5nICppbiA9ICZscC0+cmZjMTIwMS5pbmNvbWluZ1tzYWRkcl07CisKKwlCVUdNU0coRF9EVVJJTkcsICJpdCdzIGFuIFJGQzEyMDEgcGFja2V0IChsZW5ndGg9JWQpXG4iLCBsZW5ndGgpOworCisJaWYgKGxlbmd0aCA+PSBNaW5UVSkKKwkJb2ZzID0gNTEyIC0gbGVuZ3RoOworCWVsc2UKKwkJb2ZzID0gMjU2IC0gbGVuZ3RoOworCisJaWYgKHNvZnQtPnNwbGl0X2ZsYWcgPT0gMHhGRikgewkJLyogRXhjZXB0aW9uIFBhY2tldCAqLworCQlpZiAobGVuZ3RoID49IDQgKyBSRkMxMjAxX0hEUl9TSVpFKQorCQkJQlVHTVNHKERfRFVSSU5HLCAiY29tcGVuc2F0aW5nIGZvciBleGNlcHRpb24gcGFja2V0XG4iKTsKKwkJZWxzZSB7CisJCQlCVUdNU0coRF9FWFRSQSwgInNob3J0IFJGQzEyMDEgZXhjZXB0aW9uIHBhY2tldCBmcm9tICUwMlhoIiwKKwkJCSAgICAgICBzYWRkcik7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBza2lwIG92ZXIgNC1ieXRlIGp1bmtvbGEgKi8KKwkJbGVuZ3RoIC09IDQ7CisJCW9mcyArPSA0OworCQlscC0+aHcuY29weV9mcm9tX2NhcmQoZGV2LCBidWZudW0sIDUxMiAtIGxlbmd0aCwKKwkJCQkgICAgICBzb2Z0LCBzaXplb2YocGt0LT5zb2Z0KSk7CisJfQorCWlmICghc29mdC0+c3BsaXRfZmxhZykgewkvKiBub3Qgc3BsaXQgKi8KKwkJQlVHTVNHKERfUlgsICJpbmNvbWluZyBpcyBub3Qgc3BsaXQgKHNwbGl0ZmxhZz0lZClcbiIsCisJCSAgICAgICBzb2Z0LT5zcGxpdF9mbGFnKTsKKworCQlpZiAoaW4tPnNrYikgewkvKiBhbHJlYWR5IGFzc2VtYmxpbmcgb25lISAqLworCQkJQlVHTVNHKERfRVhUUkEsICJhYm9ydGluZyBhc3NlbWJseSAoc2VxPSVkKSBmb3IgdW5zcGxpdCBwYWNrZXQgKHNwbGl0ZmxhZz0lZCwgc2VxPSVkKVxuIiwKKwkJCSBpbi0+c2VxdWVuY2UsIHNvZnQtPnNwbGl0X2ZsYWcsIHNvZnQtPnNlcXVlbmNlKTsKKwkJCWxwLT5yZmMxMjAxLmFib3J0ZWRfc2VxID0gc29mdC0+c2VxdWVuY2U7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShpbi0+c2tiKTsKKwkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWxwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzKys7CisJCQlpbi0+c2tiID0gTlVMTDsKKwkJfQorCQlpbi0+c2VxdWVuY2UgPSBzb2Z0LT5zZXF1ZW5jZTsKKworCQlza2IgPSBhbGxvY19za2IobGVuZ3RoICsgQVJDX0hEUl9TSVpFLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQlCVUdNU0coRF9OT1JNQUwsICJNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIik7CisJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJcmV0dXJuOworCQl9CisJCXNrYl9wdXQoc2tiLCBsZW5ndGggKyBBUkNfSERSX1NJWkUpOworCQlza2ItPmRldiA9IGRldjsKKworCQlwa3QgPSAoc3RydWN0IGFyY2hkciAqKSBza2ItPmRhdGE7CisJCXNvZnQgPSAmcGt0LT5zb2Z0LnJmYzEyMDE7CisKKwkJLyogdXAgdG8gc2l6ZW9mKHBrdC0+c29mdCkgaGFzIGFscmVhZHkgYmVlbiBjb3BpZWQgZnJvbSB0aGUgY2FyZCAqLworCQltZW1jcHkocGt0LCBwa3RoZHIsIHNpemVvZihzdHJ1Y3QgYXJjaGRyKSk7CisJCWlmIChsZW5ndGggPiBzaXplb2YocGt0LT5zb2Z0KSkKKwkJCWxwLT5ody5jb3B5X2Zyb21fY2FyZChkZXYsIGJ1Zm51bSwgb2ZzICsgc2l6ZW9mKHBrdC0+c29mdCksCisJCQkJICAgICAgIHBrdC0+c29mdC5yYXcgKyBzaXplb2YocGt0LT5zb2Z0KSwKKwkJCQkJICAgICAgbGVuZ3RoIC0gc2l6ZW9mKHBrdC0+c29mdCkpOworCisJCS8qCisJCSAqIEFSUCBwYWNrZXRzIGhhdmUgcHJvYmxlbXMgd2hlbiBzZW50IGZyb20gc29tZSBET1Mgc3lzdGVtczogdGhlCisJCSAqIHNvdXJjZSBhZGRyZXNzIGlzIGFsd2F5cyAwISAgU28gd2UgdGFrZSB0aGUgaGFyZHdhcmUgc291cmNlIGFkZHIKKwkJICogKHdoaWNoIGlzIGltcG9zc2libGUgdG8gZnVtYmxlKSBhbmQgaW5zZXJ0IGl0IG91cnNlbHZlcy4KKwkJICovCisJCWlmIChzb2Z0LT5wcm90byA9PSBBUkNfUF9BUlApIHsKKwkJCXN0cnVjdCBhcnBoZHIgKmFycCA9IChzdHJ1Y3QgYXJwaGRyICopIHNvZnQtPnBheWxvYWQ7CisKKwkJCS8qIG1ha2Ugc3VyZSBhZGRyZXNzZXMgYXJlIHRoZSByaWdodCBsZW5ndGggKi8KKwkJCWlmIChhcnAtPmFyX2hsbiA9PSAxICYmIGFycC0+YXJfcGxuID09IDQpIHsKKwkJCQl1aW50OF90ICpjcHRyID0gKHVpbnQ4X3QgKikgYXJwICsgc2l6ZW9mKHN0cnVjdCBhcnBoZHIpOworCisJCQkJaWYgKCEqY3B0cikgewkvKiBpcyBzYWRkciA9IDAwPyAqLworCQkJCQlCVUdNU0coRF9FWFRSQSwKKwkJCQkJICAgICAgICJBUlAgc291cmNlIGFkZHJlc3Mgd2FzIDAwaCwgc2V0IHRvICUwMlhoLlxuIiwKKwkJCQkJICAgICAgIHNhZGRyKTsKKwkJCQkJbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQkJKmNwdHIgPSBzYWRkcjsKKwkJCQl9IGVsc2UgeworCQkJCQlCVUdNU0coRF9EVVJJTkcsICJBUlAgc291cmNlIGFkZHJlc3MgKCVYaCkgaXMgZmluZS5cbiIsCisJCQkJCSAgICAgICAqY3B0cik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlCVUdNU0coRF9OT1JNQUwsICJmdW5ueS1zaGFwZWQgQVJQIHBhY2tldC4gKCVYaCwgJVhoKVxuIiwKKwkJCQkgICAgICAgYXJwLT5hcl9obG4sIGFycC0+YXJfcGxuKTsKKwkJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCX0KKwkJfQorCQlCVUdMVkwoRF9TS0IpIGFyY25ldF9kdW1wX3NrYihkZXYsIHNrYiwgInJ4Iik7CisKKwkJc2tiLT5wcm90b2NvbCA9IHR5cGVfdHJhbnMoc2tiLCBkZXYpOworCQluZXRpZl9yeChza2IpOworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCX0gZWxzZSB7CQkvKiBzcGxpdCBwYWNrZXQgKi8KKwkJLyoKKwkJICogTk9URTogTVNET1MgQVJQIHBhY2tldCBjb3JyZWN0aW9uIHNob3VsZCBvbmx5IG5lZWQgdG8gYXBwbHkgdG8KKwkJICogdW5zcGxpdCBwYWNrZXRzLCBzaW5jZSBBUlAgcGFja2V0cyBhcmUgc28gc2hvcnQuCisJCSAqCisJCSAqIE15IGludGVycHJldGF0aW9uIG9mIHRoZSBSRkMxMjAxIGRvY3VtZW50IGlzIHRoYXQgaWYgYSBwYWNrZXQgaXMKKwkJICogcmVjZWl2ZWQgb3V0IG9mIG9yZGVyLCB0aGUgZW50aXJlIGFzc2VtYmx5IHByb2Nlc3Mgc2hvdWxkIGJlCisJCSAqIGFib3J0ZWQuCisJCSAqCisJCSAqIFRoZSBSRkMgYWxzbyBtZW50aW9ucyAiaXQgaXMgcG9zc2libGUgZm9yIHN1Y2Nlc3NmdWxseSByZWNlaXZlZAorCQkgKiBwYWNrZXRzIHRvIGJlIHJldHJhbnNtaXR0ZWQuIiBBcyBvZiAwLjQwIGFsbCBwcmV2aW91c2x5IHJlY2VpdmVkCisJCSAqIHBhY2tldHMgYXJlIGFsbG93ZWQsIG5vdCBqdXN0IHRoZSBtb3N0IHJlY2VudCBvbmUuCisJCSAqCisJCSAqIFdlIGFsbG93IG11bHRpcGxlIGFzc2VtYmx5IHByb2Nlc3Nlcywgb25lIGZvciBlYWNoIEFSQ25ldCBjYXJkCisJCSAqIHBvc3NpYmxlIG9uIHRoZSBuZXR3b3JrLiAgU2VlbXMgcmF0aGVyIGxpa2UgYSB3YXN0ZSBvZiBtZW1vcnksCisJCSAqIGJ1dCB0aGVyZSdzIG5vIG90aGVyIHdheSB0byBiZSByZWxpYWJsZS4KKwkJICovCisKKwkJQlVHTVNHKERfUlgsICJwYWNrZXQgaXMgc3BsaXQgKHNwbGl0ZmxhZz0lZCwgc2VxPSVkKVxuIiwKKwkJICAgICAgIHNvZnQtPnNwbGl0X2ZsYWcsIGluLT5zZXF1ZW5jZSk7CisKKwkJaWYgKGluLT5za2IgJiYgaW4tPnNlcXVlbmNlICE9IHNvZnQtPnNlcXVlbmNlKSB7CisJCQlCVUdNU0coRF9FWFRSQSwgIndyb25nIHNlcSBudW1iZXIgKHNhZGRyPSVkLCBleHBlY3RlZD0lZCwgc2VxPSVkLCBzcGxpdGZsYWc9JWQpXG4iLAorCQkJICAgICAgIHNhZGRyLCBpbi0+c2VxdWVuY2UsIHNvZnQtPnNlcXVlbmNlLAorCQkJICAgICAgIHNvZnQtPnNwbGl0X2ZsYWcpOworCQkJZGV2X2tmcmVlX3NrYl9pcnEoaW4tPnNrYik7CisJCQlpbi0+c2tiID0gTlVMTDsKKwkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWxwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzKys7CisJCQlpbi0+bGFzdHBhY2tldCA9IGluLT5udW1wYWNrZXRzID0gMDsKKwkJfQorCQlpZiAoc29mdC0+c3BsaXRfZmxhZyAmIDEpIHsJLyogZmlyc3QgcGFja2V0IGluIHNwbGl0ICovCisJCQlCVUdNU0coRF9SWCwgImJyYW5kIG5ldyBzcGxpdHBhY2tldCAoc3BsaXRmbGFnPSVkKVxuIiwKKwkJCSAgICAgICBzb2Z0LT5zcGxpdF9mbGFnKTsKKwkJCWlmIChpbi0+c2tiKSB7CS8qIGFscmVhZHkgYXNzZW1ibGluZyBvbmUhICovCisJCQkJQlVHTVNHKERfRVhUUkEsICJhYm9ydGluZyBwcmV2aW91cyAoc2VxPSVkKSBhc3NlbWJseSAiCisJCQkJICAgICAgICIoc3BsaXRmbGFnPSVkLCBzZXE9JWQpXG4iLAorCQkJCSAgICAgICBpbi0+c2VxdWVuY2UsIHNvZnQtPnNwbGl0X2ZsYWcsCisJCQkJICAgICAgIHNvZnQtPnNlcXVlbmNlKTsKKwkJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJbHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMrKzsKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycShpbi0+c2tiKTsKKwkJCX0KKwkJCWluLT5zZXF1ZW5jZSA9IHNvZnQtPnNlcXVlbmNlOworCQkJaW4tPm51bXBhY2tldHMgPSAoKHVuc2lnbmVkKSBzb2Z0LT5zcGxpdF9mbGFnID4+IDEpICsgMjsKKwkJCWluLT5sYXN0cGFja2V0ID0gMTsKKworCQkJaWYgKGluLT5udW1wYWNrZXRzID4gMTYpIHsKKwkJCQlCVUdNU0coRF9FWFRSQSwgImluY29taW5nIHBhY2tldCBtb3JlIHRoYW4gMTYgc2VnbWVudHM7IGRyb3BwaW5nLiAoc3BsaXRmbGFnPSVkKVxuIiwKKwkJCQkgICAgICAgc29mdC0+c3BsaXRfZmxhZyk7CisJCQkJbHAtPnJmYzEyMDEuYWJvcnRlZF9zZXEgPSBzb2Z0LT5zZXF1ZW5jZTsKKwkJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpbi0+c2tiID0gc2tiID0gYWxsb2Nfc2tiKDUwOCAqIGluLT5udW1wYWNrZXRzICsgQVJDX0hEUl9TSVpFLAorCQkJCQkJICBHRlBfQVRPTUlDKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCUJVR01TRyhEX05PUk1BTCwgIihzcGxpdCkgbWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIpOworCQkJCWxwLT5yZmMxMjAxLmFib3J0ZWRfc2VxID0gc29mdC0+c2VxdWVuY2U7CisJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlza2ItPmRldiA9IGRldjsKKwkJCXBrdCA9IChzdHJ1Y3QgYXJjaGRyICopIHNrYi0+ZGF0YTsKKwkJCXNvZnQgPSAmcGt0LT5zb2Z0LnJmYzEyMDE7CisKKwkJCW1lbWNweShwa3QsIHBrdGhkciwgQVJDX0hEUl9TSVpFICsgUkZDMTIwMV9IRFJfU0laRSk7CisJCQlza2JfcHV0KHNrYiwgQVJDX0hEUl9TSVpFICsgUkZDMTIwMV9IRFJfU0laRSk7CisKKwkJCXNvZnQtPnNwbGl0X2ZsYWcgPSAwOwkvKiBlbmQgcmVzdWx0IHdvbid0IGJlIHNwbGl0ICovCisJCX0gZWxzZSB7CS8qIG5vdCBmaXJzdCBwYWNrZXQgKi8KKwkJCWludCBwYWNrZXRudW0gPSAoKHVuc2lnbmVkKSBzb2Z0LT5zcGxpdF9mbGFnID4+IDEpICsgMTsKKworCQkJLyoKKwkJCSAqIGlmIHdlJ3JlIG5vdCBhc3NlbWJsaW5nLCB0aGVyZSdzIG5vIHBvaW50IHRyeWluZyB0bworCQkJICogY29udGludWUuCisJCQkgKi8KKwkJCWlmICghaW4tPnNrYikgeworCQkJCWlmIChscC0+cmZjMTIwMS5hYm9ydGVkX3NlcSAhPSBzb2Z0LT5zZXF1ZW5jZSkgeworCQkJCQlCVUdNU0coRF9FWFRSQSwgImNhbid0IGNvbnRpbnVlIHNwbGl0IHdpdGhvdXQgc3RhcnRpbmcgIgorCQkJCQkgICAgICAgImZpcnN0ISAoc3BsaXRmbGFnPSVkLCBzZXE9JWQsIGFib3J0ZWQ9JWQpXG4iLAorCQkJCQlzb2Z0LT5zcGxpdF9mbGFnLCBzb2Z0LT5zZXF1ZW5jZSwKKwkJCQkJICAgICAgIGxwLT5yZmMxMjAxLmFib3J0ZWRfc2VxKTsKKwkJCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCQlscC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycysrOworCQkJCX0KKwkJCQlyZXR1cm47CisJCQl9CisJCQlpbi0+bGFzdHBhY2tldCsrOworCQkJaWYgKHBhY2tldG51bSAhPSBpbi0+bGFzdHBhY2tldCkgewkvKiBub3QgdGhlIHJpZ2h0IGZsYWchICovCisJCQkJLyogaGFybWxlc3MgZHVwbGljYXRlPyBpZ25vcmUuICovCisJCQkJaWYgKHBhY2tldG51bSA8PSBpbi0+bGFzdHBhY2tldCAtIDEpIHsKKwkJCQkJQlVHTVNHKERfRVhUUkEsICJkdXBsaWNhdGUgc3BsaXRwYWNrZXQgaWdub3JlZCEgKHNwbGl0ZmxhZz0lZClcbiIsCisJCQkJCSAgICAgICBzb2Z0LT5zcGxpdF9mbGFnKTsKKwkJCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCQlscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJLyogImJhZCIgZHVwbGljYXRlLCBraWxsIHJlYXNzZW1ibHkgKi8KKwkJCQlCVUdNU0coRF9FWFRSQSwgIm91dC1vZi1vcmRlciBzcGxpdHBhY2tldCwgcmVhc3NlbWJseSAiCisJCQkJICAgICAgICIoc2VxPSVkKSBhYm9ydGVkIChzcGxpdGZsYWc9JWQsIHNlcT0lZClcbiIsCisJCQkJICAgICAgIGluLT5zZXF1ZW5jZSwgc29mdC0+c3BsaXRfZmxhZywgc29mdC0+c2VxdWVuY2UpOworCQkJCWxwLT5yZmMxMjAxLmFib3J0ZWRfc2VxID0gc29mdC0+c2VxdWVuY2U7CisJCQkJZGV2X2tmcmVlX3NrYl9pcnEoaW4tPnNrYik7CisJCQkJaW4tPnNrYiA9IE5VTEw7CisJCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCWxwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzKys7CisJCQkJaW4tPmxhc3RwYWNrZXQgPSBpbi0+bnVtcGFja2V0cyA9IDA7CisJCQkJcmV0dXJuOworCQkJfQorCQkJcGt0ID0gKHN0cnVjdCBhcmNoZHIgKikgaW4tPnNrYi0+ZGF0YTsKKwkJCXNvZnQgPSAmcGt0LT5zb2Z0LnJmYzEyMDE7CisJCX0KKworCQlza2IgPSBpbi0+c2tiOworCisJCWxwLT5ody5jb3B5X2Zyb21fY2FyZChkZXYsIGJ1Zm51bSwgb2ZzICsgUkZDMTIwMV9IRFJfU0laRSwKKwkJCQkgICAgICBza2ItPmRhdGEgKyBza2ItPmxlbiwKKwkJCQkgICAgICBsZW5ndGggLSBSRkMxMjAxX0hEUl9TSVpFKTsKKwkJc2tiX3B1dChza2IsIGxlbmd0aCAtIFJGQzEyMDFfSERSX1NJWkUpOworCisJCS8qIGFyZSB3ZSBkb25lPyAqLworCQlpZiAoaW4tPmxhc3RwYWNrZXQgPT0gaW4tPm51bXBhY2tldHMpIHsKKwkJCWluLT5za2IgPSBOVUxMOworCQkJaW4tPmxhc3RwYWNrZXQgPSBpbi0+bnVtcGFja2V0cyA9IDA7CisKKwkgICAgQlVHTVNHKERfU0tCX1NJWkUsICJza2I6IHJlY2VpdmVkICVkIGJ5dGVzIGZyb20gJTAyWCAodW5zcGxpdClcbiIsCisgICAgCQlza2ItPmxlbiwgcGt0LT5oYXJkLnNvdXJjZSk7CisJICAgIEJVR01TRyhEX1NLQl9TSVpFLCAic2tiOiByZWNlaXZlZCAlZCBieXRlcyBmcm9tICUwMlggKHNwbGl0KVxuIiwKKyAgICAJCXNrYi0+bGVuLCBwa3QtPmhhcmQuc291cmNlKTsKKwkJCUJVR0xWTChEX1NLQikgYXJjbmV0X2R1bXBfc2tiKGRldiwgc2tiLCAicngiKTsKKworCQkJc2tiLT5wcm90b2NvbCA9IHR5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJbmV0aWZfcngoc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCX0KKwl9Cit9CisKKworLyogQ3JlYXRlIHRoZSBBUkNuZXQgaGFyZC9zb2Z0IGhlYWRlcnMgZm9yIFJGQzEyMDEuICovCitzdGF0aWMgaW50IGJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJdW5zaWduZWQgc2hvcnQgdHlwZSwgdWludDhfdCBkYWRkcikKK3sKKwlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaGRyX3NpemUgPSBBUkNfSERSX1NJWkUgKyBSRkMxMjAxX0hEUl9TSVpFOworCXN0cnVjdCBhcmNoZHIgKnBrdCA9IChzdHJ1Y3QgYXJjaGRyICopIHNrYl9wdXNoKHNrYiwgaGRyX3NpemUpOworCXN0cnVjdCBhcmNfcmZjMTIwMSAqc29mdCA9ICZwa3QtPnNvZnQucmZjMTIwMTsKKworCS8qIHNldCB0aGUgcHJvdG9jb2wgSUQgYWNjb3JkaW5nIHRvIFJGQzEyMDEgKi8KKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEVUSF9QX0lQOgorCQlzb2Z0LT5wcm90byA9IEFSQ19QX0lQOworCQlicmVhazsKKwljYXNlIEVUSF9QX0lQVjY6CisJCXNvZnQtPnByb3RvID0gQVJDX1BfSVBWNjsKKwkJYnJlYWs7CisJY2FzZSBFVEhfUF9BUlA6CisJCXNvZnQtPnByb3RvID0gQVJDX1BfQVJQOworCQlicmVhazsKKwljYXNlIEVUSF9QX1JBUlA6CisJCXNvZnQtPnByb3RvID0gQVJDX1BfUkFSUDsKKwkJYnJlYWs7CisJY2FzZSBFVEhfUF9JUFg6CisJY2FzZSBFVEhfUF84MDJfMzoKKwljYXNlIEVUSF9QXzgwMl8yOgorCQlzb2Z0LT5wcm90byA9IEFSQ19QX0lQWDsKKwkJYnJlYWs7CisJY2FzZSBFVEhfUF9BVEFMSzoKKwkJc29mdC0+cHJvdG8gPSBBUkNfUF9BVEFMSzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHTVNHKERfTk9STUFMLCAiUkZDMTIwMTogSSBkb24ndCB1bmRlcnN0YW5kIHByb3RvY29sICVkICglWGgpXG4iLAorCQkgICAgICAgdHlwZSwgdHlwZSk7CisJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogU2V0IHRoZSBzb3VyY2UgaGFyZHdhcmUgYWRkcmVzcy4KKwkgKgorCSAqIFRoaXMgaXMgcHJldHR5IHBvaW50bGVzcyBmb3IgbW9zdCBwdXJwb3NlcywgYnV0IGl0IGNhbiBoZWxwIGluCisJICogZGVidWdnaW5nLiAgQVJDbmV0IGRvZXMgbm90IGFsbG93IHVzIHRvIGNoYW5nZSB0aGUgc291cmNlIGFkZHJlc3MgaW4KKwkgKiB0aGUgYWN0dWFsIHBhY2tldCBzZW50KQorCSAqLworCXBrdC0+aGFyZC5zb3VyY2UgPSAqZGV2LT5kZXZfYWRkcjsKKworCXNvZnQtPnNlcXVlbmNlID0gaHRvbnMobHAtPnJmYzEyMDEuc2VxdWVuY2UrKyk7CisJc29mdC0+c3BsaXRfZmxhZyA9IDA7CS8qIHNwbGl0IHBhY2tldHMgYXJlIGRvbmUgZWxzZXdoZXJlICovCisKKwkvKiBzZWUgbGludXgvbmV0L2V0aGVybmV0L2V0aC5jIHRvIHNlZSB3aGVyZSBJIGdvdCB0aGUgZm9sbG93aW5nICovCisKKwlpZiAoZGV2LT5mbGFncyAmIChJRkZfTE9PUEJBQ0sgfCBJRkZfTk9BUlApKSB7CisJCS8qIAorCQkgKiBGSVhNRTogZmlsbCBpbiB0aGUgbGFzdCBieXRlIG9mIHRoZSBkZXN0IGlwYWRkciBoZXJlIHRvIGJldHRlcgorCQkgKiBjb21wbHkgd2l0aCBSRkMxMDUxIGluICJub2FycCIgbW9kZS4gIEZvciBub3csIGFsd2F5cyBicm9hZGNhc3RpbmcKKwkJICogd2lsbCBwcm9iYWJseSBhdCBsZWFzdCBnZXQgcGFja2V0cyBzZW50IG91dCA6KQorCQkgKi8KKwkJcGt0LT5oYXJkLmRlc3QgPSAwOworCQlyZXR1cm4gaGRyX3NpemU7CisJfQorCS8qIG90aGVyd2lzZSwgZHJvcCBpbiB0aGUgZGVzdCBhZGRyZXNzICovCisJcGt0LT5oYXJkLmRlc3QgPSBkYWRkcjsKKwlyZXR1cm4gaGRyX3NpemU7Cit9CisKKworc3RhdGljIHZvaWQgbG9hZF9wa3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGFyY19oYXJkd2FyZSAqaGFyZCwKKwkJICAgICBzdHJ1Y3QgYXJjX3JmYzEyMDEgKnNvZnQsIGludCBzb2Z0bGVuLCBpbnQgYnVmbnVtKQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWludCBvZnM7CisKKwkvKiBhc3N1bWUgbGVuZ3RoIDw9IFhNVFU6IHNvbWVvbmUgc2hvdWxkIGhhdmUgaGFuZGxlZCB0aGF0IGJ5IG5vdy4gKi8KKworCWlmIChzb2Z0bGVuID4gTWluVFUpIHsKKwkJaGFyZC0+b2Zmc2V0WzBdID0gMDsKKwkJaGFyZC0+b2Zmc2V0WzFdID0gb2ZzID0gNTEyIC0gc29mdGxlbjsKKwl9IGVsc2UgaWYgKHNvZnRsZW4gPiBNVFUpIHsJLyogZXhjZXB0aW9uIHBhY2tldCAtIGFkZCBhbiBleHRyYSBoZWFkZXIgKi8KKwkJc3RydWN0IGFyY19yZmMxMjAxIGV4Y3NvZnQ7CisKKwkJZXhjc29mdC5wcm90byA9IHNvZnQtPnByb3RvOworCQlleGNzb2Z0LnNwbGl0X2ZsYWcgPSAweGZmOworCQlleGNzb2Z0LnNlcXVlbmNlID0gMHhmZmZmOworCisJCWhhcmQtPm9mZnNldFswXSA9IDA7CisJCW9mcyA9IDUxMiAtIHNvZnRsZW47CisJCWhhcmQtPm9mZnNldFsxXSA9IG9mcyAtIFJGQzEyMDFfSERSX1NJWkU7CisJCWxwLT5ody5jb3B5X3RvX2NhcmQoZGV2LCBidWZudW0sIG9mcyAtIFJGQzEyMDFfSERSX1NJWkUsCisJCQkJICAgICZleGNzb2Z0LCBSRkMxMjAxX0hEUl9TSVpFKTsKKwl9IGVsc2UKKwkJaGFyZC0+b2Zmc2V0WzBdID0gb2ZzID0gMjU2IC0gc29mdGxlbjsKKworCWxwLT5ody5jb3B5X3RvX2NhcmQoZGV2LCBidWZudW0sIDAsIGhhcmQsIEFSQ19IRFJfU0laRSk7CisJbHAtPmh3LmNvcHlfdG9fY2FyZChkZXYsIGJ1Zm51bSwgb2ZzLCBzb2Z0LCBzb2Z0bGVuKTsKKworCWxwLT5sYXN0bG9hZF9kZXN0ID0gaGFyZC0+ZGVzdDsKK30KKworCitzdGF0aWMgaW50IHByZXBhcmVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGFyY2hkciAqcGt0LCBpbnQgbGVuZ3RoLAorCQkgICAgICBpbnQgYnVmbnVtKQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWNvbnN0IGludCBtYXhzZWdzaXplID0gWE1UVSAtIFJGQzEyMDFfSERSX1NJWkU7CisJc3RydWN0IE91dGdvaW5nICpvdXQ7CisKKworCUJVR01TRyhEX0RVUklORywgInByZXBhcmVfdHg6IHR4YnVmcz0lZC8lZC8lZFxuIiwKKwkgICAgICAgbHAtPm5leHRfdHgsIGxwLT5jdXJfdHgsIGJ1Zm51bSk7CisKKwlsZW5ndGggLT0gQVJDX0hEUl9TSVpFOwkvKiBoYXJkIGhlYWRlciBpcyBub3QgaW5jbHVkZWQgaW4gcGFja2V0IGxlbmd0aCAqLworCXBrdC0+c29mdC5yZmMxMjAxLnNwbGl0X2ZsYWcgPSAwOworCisJLyogbmVlZCB0byBkbyBhIHNwbGl0IHBhY2tldD8gKi8KKwlpZiAobGVuZ3RoID4gWE1UVSkgeworCQlvdXQgPSAmbHAtPm91dGdvaW5nOworCisJCW91dC0+bGVuZ3RoID0gbGVuZ3RoIC0gUkZDMTIwMV9IRFJfU0laRTsKKwkJb3V0LT5kYXRhbGVmdCA9IGxwLT5vdXRnb2luZy5sZW5ndGg7CisJCW91dC0+bnVtc2VncyA9IChvdXQtPmRhdGFsZWZ0ICsgbWF4c2Vnc2l6ZSAtIDEpIC8gbWF4c2Vnc2l6ZTsKKwkJb3V0LT5zZWdudW0gPSAwOworCisJCUJVR01TRyhEX0RVUklORywgInJmYzEyMDEgcHJlcF90eDogcmVhZHkgZm9yICVkLXNlZ21lbnQgc3BsaXQgIgorCQkgICAgICAgIiglZCBieXRlcywgc2VxPSVkKVxuIiwgb3V0LT5udW1zZWdzLCBvdXQtPmxlbmd0aCwKKwkJICAgICAgIHBrdC0+c29mdC5yZmMxMjAxLnNlcXVlbmNlKTsKKworCQlyZXR1cm4gMDsJLyogbm90IGRvbmUgKi8KKwl9CisJLyoganVzdCBsb2FkIHRoZSBwYWNrZXQgaW50byB0aGUgYnVmZmVycyBhbmQgc2VuZCBpdCBvZmYgKi8KKwlsb2FkX3BrdChkZXYsICZwa3QtPmhhcmQsICZwa3QtPnNvZnQucmZjMTIwMSwgbGVuZ3RoLCBidWZudW0pOworCisJcmV0dXJuIDE7CQkvKiBkb25lICovCit9CisKKworc3RhdGljIGludCBjb250aW51ZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVmbnVtKQoreworCXN0cnVjdCBhcmNuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBPdXRnb2luZyAqb3V0ID0gJmxwLT5vdXRnb2luZzsKKwlzdHJ1Y3QgYXJjX2hhcmR3YXJlICpoYXJkID0gJm91dC0+cGt0LT5oYXJkOworCXN0cnVjdCBhcmNfcmZjMTIwMSAqc29mdCA9ICZvdXQtPnBrdC0+c29mdC5yZmMxMjAxLCAqbmV3c29mdDsKKwlpbnQgbWF4c2Vnc2l6ZSA9IFhNVFUgLSBSRkMxMjAxX0hEUl9TSVpFOworCWludCBzZWdsZW47CisKKwlCVUdNU0coRF9EVVJJTkcsCisJICAicmZjMTIwMSBjb250aW51ZV90eDogbG9hZGluZyBzZWdtZW50ICVkKCsxKSBvZiAlZCAoc2VxPSVkKVxuIiwKKwkgICAgICAgb3V0LT5zZWdudW0sIG91dC0+bnVtc2Vncywgc29mdC0+c2VxdWVuY2UpOworCisJLyogdGhlICJuZXciIHNvZnQgaGVhZGVyIGNvbWVzIHJpZ2h0IGJlZm9yZSB0aGUgZGF0YSBjaHVuayAqLworCW5ld3NvZnQgPSAoc3RydWN0IGFyY19yZmMxMjAxICopCisJICAgIChvdXQtPnBrdC0+c29mdC5yYXcgKyBvdXQtPmxlbmd0aCAtIG91dC0+ZGF0YWxlZnQpOworCisJaWYgKCFvdXQtPnNlZ251bSkJLyogZmlyc3QgcGFja2V0OyBuZXdzb2Z0ID09IHNvZnQgKi8KKwkJbmV3c29mdC0+c3BsaXRfZmxhZyA9ICgob3V0LT5udW1zZWdzIC0gMikgPDwgMSkgfCAxOworCWVsc2UgeworCQluZXdzb2Z0LT5zcGxpdF9mbGFnID0gb3V0LT5zZWdudW0gPDwgMTsKKwkJbmV3c29mdC0+cHJvdG8gPSBzb2Z0LT5wcm90bzsKKwkJbmV3c29mdC0+c2VxdWVuY2UgPSBzb2Z0LT5zZXF1ZW5jZTsKKwl9CisKKwlzZWdsZW4gPSBtYXhzZWdzaXplOworCWlmIChzZWdsZW4gPiBvdXQtPmRhdGFsZWZ0KQorCQlzZWdsZW4gPSBvdXQtPmRhdGFsZWZ0OworCW91dC0+ZGF0YWxlZnQgLT0gc2VnbGVuOworCisJbG9hZF9wa3QoZGV2LCBoYXJkLCBuZXdzb2Z0LCBzZWdsZW4gKyBSRkMxMjAxX0hEUl9TSVpFLCBidWZudW0pOworCisJb3V0LT5zZWdudW0rKzsKKwlpZiAob3V0LT5zZWdudW0gPj0gb3V0LT5udW1zZWdzKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJpYWRuZS5jIGIvZHJpdmVycy9uZXQvYXJpYWRuZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZTkzYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcmlhZG5lLmMKQEAgLTAsMCArMSw4NzggQEAKKy8qCisgKiAgQW1pZ2EgTGludXgvbTY4ayBBcmlhZG5lIEV0aGVybmV0IERyaXZlcgorICoKKyAqICCpIENvcHlyaWdodCAxOTk1LTIwMDMgYnkgR2VlcnQgVXl0dGVyaG9ldmVuIChnZWVydEBsaW51eC1tNjhrLm9yZykKKyAqCQkJICAgICBQZXRlciBEZSBTY2hyaWp2ZXIgKHAyQG1pbmQuYmUpCisgKgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgYmFzZWQgb24KKyAqCisgKglsYW5jZS5jOglBbiBBTUQgTEFOQ0UgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eC4KKyAqCQkJV3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisgKgorICoJQW03OUM5NjA6CVBDbmV0KHRtKS1JU0EgU2luZ2xlLUNoaXAgRXRoZXJuZXQgQ29udHJvbGxlcgorICoJCQlBZHZhbmNlZCBNaWNybyBEZXZpY2VzCisgKgkJCVB1YmxpY2F0aW9uICMxNjkwNywgUmV2LiBCLCBBbWVuZG1lbnQvMCwgTWF5IDE5OTQKKyAqCisgKglNQzY4MjMwOglQYXJhbGxlbCBJbnRlcmZhY2UvVGltZXIgKFBJL1QpCisgKgkJCU1vdG9yb2xhIFNlbWljb25kdWN0b3JzLCBEZWNlbWJlciwgMTk4MworICoKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eAorICogIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgVGhlIEFyaWFkbmUgaXMgYSBab3Jyby1JSSBib2FyZCBtYWRlIGJ5IFZpbGxhZ2UgVHJvbmljLiBJdCBjb250YWluczoKKyAqCisgKgktIGFuIEFtNzlDOTYwIFBDbmV0LUlTQSBTaW5nbGUtQ2hpcCBFdGhlcm5ldCBDb250cm9sbGVyIHdpdGggYm90aAorICoJICAxMEJBU0UtMiAodGhpbiBjb2F4KSBhbmQgMTBCQVNFLVQgKFVUUCkgY29ubmVjdG9ycworICoKKyAqCS0gYW4gTUM2ODIzMCBQYXJhbGxlbCBJbnRlcmZhY2UvVGltZXIgY29uZmlndXJlZCBhcyAyIHBhcmFsbGVsIHBvcnRzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3pvcnJvLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vYW1pZ2FpbnRzLmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlICJhcmlhZG5lLmgiCisKKworI2lmZGVmIEFSSUFETkVfREVCVUcKK2ludCBhcmlhZG5lX2RlYnVnID0gQVJJQURORV9ERUJVRzsKKyNlbHNlCitpbnQgYXJpYWRuZV9kZWJ1ZyA9IDE7CisjZW5kaWYKKworCisgICAgLyoKKyAgICAgKglNYWNyb3MgdG8gRml4IEVuZGlhbm5lc3MgcHJvYmxlbXMKKyAgICAgKi8KKworCQkJCS8qIFN3YXAgdGhlIEJ5dGVzIGluIGEgV09SRCAqLworI2RlZmluZSBzd2Fwdyh4KQkoKCh4Pj44KSYweDAwZmYpfCgoeDw8OCkmMHhmZjAwKSkKKwkJCQkvKiBHZXQgdGhlIExvdyBCWVRFIGluIGEgV09SRCAqLworI2RlZmluZSBsb3diKHgpCQkoeCYweGZmKQorCQkJCS8qIEdldCB0aGUgU3dhcHBlZCBIaWdoIFdPUkQgaW4gYSBMT05HICovCisjZGVmaW5lIHN3aGlnaHcoeCkJKCgoKHgpPj44KSYweGZmMDApfCgoKHgpPj4yNCkmMHgwMGZmKSkKKwkJCQkvKiBHZXQgdGhlIFN3YXBwZWQgTG93IFdPUkQgaW4gYSBMT05HICovCisjZGVmaW5lIHN3bG93dyh4KQkoKCgoeCk8PDgpJjB4ZmYwMCl8KCgoeCk+PjgpJjB4MDBmZikpCisKKworICAgIC8qCisgICAgICoJVHJhbnNtaXQvUmVjZWl2ZSBSaW5nIERlZmluaXRpb25zCisgICAgICovCisKKyNkZWZpbmUgVFhfUklOR19TSVpFCTUKKyNkZWZpbmUgUlhfUklOR19TSVpFCTE2CisKKyNkZWZpbmUgUEtUX0JVRl9TSVpFCTE1MjAKKworCisgICAgLyoKKyAgICAgKglQcml2YXRlIERldmljZSBEYXRhCisgICAgICovCisKK3N0cnVjdCBhcmlhZG5lX3ByaXZhdGUgeworICAgIHZvbGF0aWxlIHN0cnVjdCBURFJFICp0eF9yaW5nW1RYX1JJTkdfU0laRV07CisgICAgdm9sYXRpbGUgc3RydWN0IFJEUkUgKnJ4X3JpbmdbUlhfUklOR19TSVpFXTsKKyAgICB2b2xhdGlsZSB1X3Nob3J0ICp0eF9idWZmW1RYX1JJTkdfU0laRV07CisgICAgdm9sYXRpbGUgdV9zaG9ydCAqcnhfYnVmZltSWF9SSU5HX1NJWkVdOworICAgIGludCBjdXJfdHgsIGN1cl9yeDsJCQkvKiBUaGUgbmV4dCBmcmVlIHJpbmcgZW50cnkgKi8KKyAgICBpbnQgZGlydHlfdHg7CQkJLyogVGhlIHJpbmcgZW50cmllcyB0byBiZSBmcmVlKCllZC4gKi8KKyAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKyAgICBjaGFyIHR4X2Z1bGw7Cit9OworCisKKyAgICAvKgorICAgICAqCVN0cnVjdHVyZSBDcmVhdGVkIGluIHRoZSBBcmlhZG5lJ3MgUkFNIEJ1ZmZlcgorICAgICAqLworCitzdHJ1Y3QgbGFuY2VkYXRhIHsKKyAgICBzdHJ1Y3QgVERSRSB0eF9yaW5nW1RYX1JJTkdfU0laRV07CisgICAgc3RydWN0IFJEUkUgcnhfcmluZ1tSWF9SSU5HX1NJWkVdOworICAgIHVfc2hvcnQgdHhfYnVmZltUWF9SSU5HX1NJWkVdW1BLVF9CVUZfU0laRS9zaXplb2YodV9zaG9ydCldOworICAgIHVfc2hvcnQgcnhfYnVmZltSWF9SSU5HX1NJWkVdW1BLVF9CVUZfU0laRS9zaXplb2YodV9zaG9ydCldOworfTsKKworc3RhdGljIGludCBhcmlhZG5lX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBhcmlhZG5lX2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYXJpYWRuZV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYXJpYWRuZV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBhcmlhZG5lX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYXJpYWRuZV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBhcmlhZG5lX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqZnApOworc3RhdGljIGludCBhcmlhZG5lX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphcmlhZG5lX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNpZmRlZiBIQVZFX01VTFRJQ0FTVAorc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisKKworc3RhdGljIHZvaWQgbWVtY3B5dyh2b2xhdGlsZSB1X3Nob3J0ICpkZXN0LCB1X3Nob3J0ICpzcmMsIGludCBsZW4pCit7CisgICAgd2hpbGUgKGxlbiA+PSAyKSB7CisJKihkZXN0KyspID0gKihzcmMrKyk7CisJbGVuIC09IDI7CisgICAgfQorICAgIGlmIChsZW4gPT0gMSkKKwkqZGVzdCA9ICgqKHVfY2hhciAqKXNyYyk8PDg7Cit9CisKKworc3RhdGljIGludCBfX2RldmluaXQgYXJpYWRuZV9pbml0X29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCB6b3Jyb19kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYXJpYWRuZV9yZW1vdmVfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnopOworCisKK3N0YXRpYyBzdHJ1Y3Qgem9ycm9fZGV2aWNlX2lkIGFyaWFkbmVfem9ycm9fdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKyAgICB7IFpPUlJPX1BST0RfVklMTEFHRV9UUk9OSUNfQVJJQURORSB9LAorICAgIHsgMCB9Cit9OworCitzdGF0aWMgc3RydWN0IHpvcnJvX2RyaXZlciBhcmlhZG5lX2RyaXZlciA9IHsKKyAgICAubmFtZQk9ICJhcmlhZG5lIiwKKyAgICAuaWRfdGFibGUJPSBhcmlhZG5lX3pvcnJvX3RibCwKKyAgICAucHJvYmUJPSBhcmlhZG5lX2luaXRfb25lLAorICAgIC5yZW1vdmUJPSBfX2RldmV4aXRfcChhcmlhZG5lX3JlbW92ZV9vbmUpLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYXJpYWRuZV9pbml0X29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCB6b3Jyb19kZXZpY2VfaWQgKmVudCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGJvYXJkID0gei0+cmVzb3VyY2Uuc3RhcnQ7CisgICAgdW5zaWduZWQgbG9uZyBiYXNlX2FkZHIgPSBib2FyZCtBUklBRE5FX0xBTkNFOworICAgIHVuc2lnbmVkIGxvbmcgbWVtX3N0YXJ0ID0gYm9hcmQrQVJJQURORV9SQU07CisgICAgc3RydWN0IHJlc291cmNlICpyMSwgKnIyOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSAqcHJpdjsKKyAgICBpbnQgZXJyOworCisgICAgcjEgPSByZXF1ZXN0X21lbV9yZWdpb24oYmFzZV9hZGRyLCBzaXplb2Yoc3RydWN0IEFtNzlDOTYwKSwgIkFtNzlDOTYwIik7CisgICAgaWYgKCFyMSkKKwlyZXR1cm4gLUVCVVNZOworICAgIHIyID0gcmVxdWVzdF9tZW1fcmVnaW9uKG1lbV9zdGFydCwgQVJJQURORV9SQU1fU0laRSwgIlJBTSIpOworICAgIGlmICghcjIpIHsKKwlyZWxlYXNlX3Jlc291cmNlKHIxKTsKKwlyZXR1cm4gLUVCVVNZOworICAgIH0KKworICAgIGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgYXJpYWRuZV9wcml2YXRlKSk7CisgICAgaWYgKGRldiA9PSBOVUxMKSB7CisJcmVsZWFzZV9yZXNvdXJjZShyMSk7CisJcmVsZWFzZV9yZXNvdXJjZShyMik7CisJcmV0dXJuIC1FTk9NRU07CisgICAgfQorCisgICAgU0VUX01PRFVMRV9PV05FUihkZXYpOworICAgIHByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgcjEtPm5hbWUgPSBkZXYtPm5hbWU7CisgICAgcjItPm5hbWUgPSBkZXYtPm5hbWU7CisKKyAgICBkZXYtPmRldl9hZGRyWzBdID0gMHgwMDsKKyAgICBkZXYtPmRldl9hZGRyWzFdID0gMHg2MDsKKyAgICBkZXYtPmRldl9hZGRyWzJdID0gMHgzMDsKKyAgICBkZXYtPmRldl9hZGRyWzNdID0gKHotPnJvbS5lcl9TZXJpYWxOdW1iZXI+PjE2KSAmIDB4ZmY7CisgICAgZGV2LT5kZXZfYWRkcls0XSA9ICh6LT5yb20uZXJfU2VyaWFsTnVtYmVyPj44KSAmIDB4ZmY7CisgICAgZGV2LT5kZXZfYWRkcls1XSA9IHotPnJvbS5lcl9TZXJpYWxOdW1iZXIgJiAweGZmOworICAgIGRldi0+YmFzZV9hZGRyID0gWlRXT19WQUREUihiYXNlX2FkZHIpOworICAgIGRldi0+bWVtX3N0YXJ0ID0gWlRXT19WQUREUihtZW1fc3RhcnQpOworICAgIGRldi0+bWVtX2VuZCA9IGRldi0+bWVtX3N0YXJ0K0FSSUFETkVfUkFNX1NJWkU7CisKKyAgICBkZXYtPm9wZW4gPSAmYXJpYWRuZV9vcGVuOworICAgIGRldi0+c3RvcCA9ICZhcmlhZG5lX2Nsb3NlOworICAgIGRldi0+aGFyZF9zdGFydF94bWl0ID0gJmFyaWFkbmVfc3RhcnRfeG1pdDsKKyAgICBkZXYtPnR4X3RpbWVvdXQgPSAmYXJpYWRuZV90eF90aW1lb3V0OworICAgIGRldi0+d2F0Y2hkb2dfdGltZW8gPSA1KkhaOworICAgIGRldi0+Z2V0X3N0YXRzID0gJmFyaWFkbmVfZ2V0X3N0YXRzOworICAgIGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9tdWx0aWNhc3RfbGlzdDsKKworICAgIGVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworICAgIGlmIChlcnIpIHsKKwlyZWxlYXNlX3Jlc291cmNlKHIxKTsKKwlyZWxlYXNlX3Jlc291cmNlKHIyKTsKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBlcnI7CisgICAgfQorICAgIHpvcnJvX3NldF9kcnZkYXRhKHosIGRldik7CisKKyAgICBwcmludGsoS0VSTl9JTkZPICIlczogQXJpYWRuZSBhdCAweCUwOGx4LCBFdGhlcm5ldCBBZGRyZXNzICIKKwkgICAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIGRldi0+bmFtZSwgYm9hcmQsCisJICAgZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKKwkgICBkZXYtPmRldl9hZGRyWzNdLCBkZXYtPmRldl9hZGRyWzRdLCBkZXYtPmRldl9hZGRyWzVdKTsKKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYXJpYWRuZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgdm9sYXRpbGUgc3RydWN0IEFtNzlDOTYwICpsYW5jZSA9IChzdHJ1Y3QgQW03OUM5NjAqKWRldi0+YmFzZV9hZGRyOworICAgIHVfc2hvcnQgaW47CisgICAgdV9sb25nIHZlcnNpb247CisgICAgaW50IGk7CisKKyAgICAvKiBSZXNldCB0aGUgTEFOQ0UgKi8KKyAgICBpbiA9IGxhbmNlLT5SZXNldDsKKworICAgIC8qIFN0b3AgdGhlIExBTkNFICovCisgICAgbGFuY2UtPlJBUCA9IENTUjA7CQkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KKyAgICBsYW5jZS0+UkRQID0gU1RPUDsKKworICAgIC8qIENoZWNrIHRoZSBMQU5DRSB2ZXJzaW9uICovCisgICAgbGFuY2UtPlJBUCA9IENTUjg4OwkJLyogQ2hpcCBJRCAqLworICAgIHZlcnNpb24gPSBzd2FwdyhsYW5jZS0+UkRQKTsKKyAgICBsYW5jZS0+UkFQID0gQ1NSODk7CQkvKiBDaGlwIElEICovCisgICAgdmVyc2lvbiB8PSBzd2FwdyhsYW5jZS0+UkRQKTw8MTY7CisgICAgaWYgKCh2ZXJzaW9uICYgMHgwMDAwMGZmZikgIT0gMHgwMDAwMDAwMykgeworCXByaW50ayhLRVJOX1dBUk5JTkcgImFyaWFkbmVfb3BlbjogQ291bGRuJ3QgZmluZCBBTUQgRXRoZXJuZXQgQ2hpcFxuIik7CisJcmV0dXJuIC1FQUdBSU47CisgICAgfQorICAgIGlmICgodmVyc2lvbiAmIDB4MGZmZmYwMDApICE9IDB4MDAwMDMwMDApIHsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJhcmlhZG5lX29wZW46IENvdWxkbid0IGZpbmQgQW03OUM5NjAgKFdyb25nIHBhcnQgIgorCSAgICAgICAibnVtYmVyID0gJWxkKVxuIiwgKHZlcnNpb24gJiAweDBmZmZmMDAwKT4+MTIpOworCXJldHVybiAtRUFHQUlOOworICAgIH0KKyNpZiAwCisgICAgcHJpbnRrKEtFUk5fREVCVUcgImFyaWFkbmVfb3BlbjogQW03OUM5NjAgKFBDbmV0LUlTQSkgUmV2aXNpb24gJWxkXG4iLAorCSAgICh2ZXJzaW9uICYgMHhmMDAwMDAwMCk+PjI4KTsKKyNlbmRpZgorCisgICAgYXJpYWRuZV9pbml0X3JpbmcoZGV2KTsKKworICAgIC8qIE1pc2NlbGxhbmVvdXMgU3R1ZmYgKi8KKyAgICBsYW5jZS0+UkFQID0gQ1NSMzsJCS8qIEludGVycnVwdCBNYXNrcyBhbmQgRGVmZXJyYWwgQ29udHJvbCAqLworICAgIGxhbmNlLT5SRFAgPSAweDAwMDA7CisgICAgbGFuY2UtPlJBUCA9IENTUjQ7CQkvKiBUZXN0IGFuZCBGZWF0dXJlcyBDb250cm9sICovCisgICAgbGFuY2UtPlJEUCA9IERQT0xMfEFQQURfWE1UfE1GQ09NfFJDVkNDT018VFhTVFJUTXxKQUJNOworCisgICAgLyogU2V0IHRoZSBNdWx0aWNhc3QgVGFibGUgKi8KKyAgICBsYW5jZS0+UkFQID0gQ1NSODsJCS8qIExvZ2ljYWwgQWRkcmVzcyBGaWx0ZXIsIExBRFJGWzE1OjBdICovCisgICAgbGFuY2UtPlJEUCA9IDB4MDAwMDsKKyAgICBsYW5jZS0+UkFQID0gQ1NSOTsJCS8qIExvZ2ljYWwgQWRkcmVzcyBGaWx0ZXIsIExBRFJGWzMxOjE2XSAqLworICAgIGxhbmNlLT5SRFAgPSAweDAwMDA7CisgICAgbGFuY2UtPlJBUCA9IENTUjEwOwkJLyogTG9naWNhbCBBZGRyZXNzIEZpbHRlciwgTEFEUkZbNDc6MzJdICovCisgICAgbGFuY2UtPlJEUCA9IDB4MDAwMDsKKyAgICBsYW5jZS0+UkFQID0gQ1NSMTE7CQkvKiBMb2dpY2FsIEFkZHJlc3MgRmlsdGVyLCBMQURSRls2Mzo0OF0gKi8KKyAgICBsYW5jZS0+UkRQID0gMHgwMDAwOworCisgICAgLyogU2V0IHRoZSBFdGhlcm5ldCBIYXJkd2FyZSBBZGRyZXNzICovCisgICAgbGFuY2UtPlJBUCA9IENTUjEyOwkJLyogUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciwgUEFEUlsxNTowXSAqLworICAgIGxhbmNlLT5SRFAgPSAoKHVfc2hvcnQgKikmZGV2LT5kZXZfYWRkclswXSlbMF07CisgICAgbGFuY2UtPlJBUCA9IENTUjEzOwkJLyogUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciwgUEFEUlszMToxNl0gKi8KKyAgICBsYW5jZS0+UkRQID0gKCh1X3Nob3J0ICopJmRldi0+ZGV2X2FkZHJbMF0pWzFdOworICAgIGxhbmNlLT5SQVAgPSBDU1IxNDsJCS8qIFBoeXNpY2FsIEFkZHJlc3MgUmVnaXN0ZXIsIFBBRFJbNDc6MzJdICovCisgICAgbGFuY2UtPlJEUCA9ICgodV9zaG9ydCAqKSZkZXYtPmRldl9hZGRyWzBdKVsyXTsKKworICAgIC8qIFNldCB0aGUgSW5pdCBCbG9jayBNb2RlICovCisgICAgbGFuY2UtPlJBUCA9IENTUjE1OwkJLyogTW9kZSBSZWdpc3RlciAqLworICAgIGxhbmNlLT5SRFAgPSAweDAwMDA7CisKKyAgICAvKiBTZXQgdGhlIFRyYW5zbWl0IERlc2NyaXB0b3IgUmluZyBQb2ludGVyICovCisgICAgbGFuY2UtPlJBUCA9IENTUjMwOwkJLyogQmFzZSBBZGRyZXNzIG9mIFRyYW5zbWl0IFJpbmcgKi8KKyAgICBsYW5jZS0+UkRQID0gc3dsb3d3KEFSSUFETkVfUkFNK29mZnNldG9mKHN0cnVjdCBsYW5jZWRhdGEsIHR4X3JpbmcpKTsKKyAgICBsYW5jZS0+UkFQID0gQ1NSMzE7CQkvKiBCYXNlIEFkZHJlc3Mgb2YgdHJhbnNtaXQgUmluZyAqLworICAgIGxhbmNlLT5SRFAgPSBzd2hpZ2h3KEFSSUFETkVfUkFNK29mZnNldG9mKHN0cnVjdCBsYW5jZWRhdGEsIHR4X3JpbmcpKTsKKworICAgIC8qIFNldCB0aGUgUmVjZWl2ZSBEZXNjcmlwdG9yIFJpbmcgUG9pbnRlciAqLworICAgIGxhbmNlLT5SQVAgPSBDU1IyNDsJCS8qIEJhc2UgQWRkcmVzcyBvZiBSZWNlaXZlIFJpbmcgKi8KKyAgICBsYW5jZS0+UkRQID0gc3dsb3d3KEFSSUFETkVfUkFNK29mZnNldG9mKHN0cnVjdCBsYW5jZWRhdGEsIHJ4X3JpbmcpKTsKKyAgICBsYW5jZS0+UkFQID0gQ1NSMjU7CQkvKiBCYXNlIEFkZHJlc3Mgb2YgUmVjZWl2ZSBSaW5nICovCisgICAgbGFuY2UtPlJEUCA9IHN3aGlnaHcoQVJJQURORV9SQU0rb2Zmc2V0b2Yoc3RydWN0IGxhbmNlZGF0YSwgcnhfcmluZykpOworCisgICAgLyogU2V0IHRoZSBOdW1iZXIgb2YgUlggYW5kIFRYIFJpbmcgRW50cmllcyAqLworICAgIGxhbmNlLT5SQVAgPSBDU1I3NjsJCS8qIFJlY2VpdmUgUmluZyBMZW5ndGggKi8KKyAgICBsYW5jZS0+UkRQID0gc3dhcHcoKCh1X3Nob3J0KS1SWF9SSU5HX1NJWkUpKTsKKyAgICBsYW5jZS0+UkFQID0gQ1NSNzg7CQkvKiBUcmFuc21pdCBSaW5nIExlbmd0aCAqLworICAgIGxhbmNlLT5SRFAgPSBzd2FwdygoKHVfc2hvcnQpLVRYX1JJTkdfU0laRSkpOworCisgICAgLyogRW5hYmxlIE1lZGlhIEludGVyZmFjZSBQb3J0IEF1dG8gU2VsZWN0ICgxMEJBU0UtMi8xMEJBU0UtVCkgKi8KKyAgICBsYW5jZS0+UkFQID0gSVNBQ1NSMjsJLyogTWlzY2VsbGFuZW91cyBDb25maWd1cmF0aW9uICovCisgICAgbGFuY2UtPklEUCA9IEFTRUw7CisKKyAgICAvKiBMRUQgQ29udHJvbCAqLworICAgIGxhbmNlLT5SQVAgPSBJU0FDU1I1OwkvKiBMRUQxIFN0YXR1cyAqLworICAgIGxhbmNlLT5JRFAgPSBQU0V8WE1URTsKKyAgICBsYW5jZS0+UkFQID0gSVNBQ1NSNjsJLyogTEVEMiBTdGF0dXMgKi8KKyAgICBsYW5jZS0+SURQID0gUFNFfENPTEU7CisgICAgbGFuY2UtPlJBUCA9IElTQUNTUjc7CS8qIExFRDMgU3RhdHVzICovCisgICAgbGFuY2UtPklEUCA9IFBTRXxSQ1ZFOworCisgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworICAgIGkgPSByZXF1ZXN0X2lycShJUlFfQU1JR0FfUE9SVFMsIGFyaWFkbmVfaW50ZXJydXB0LCBTQV9TSElSUSwKKyAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBkZXYpOworICAgIGlmIChpKSByZXR1cm4gaTsKKworICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCisgICAgbGFuY2UtPlJEUCA9IElORUF8U1RSVDsKKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGFyaWFkbmVfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisgICAgdm9sYXRpbGUgc3RydWN0IGxhbmNlZGF0YSAqbGFuY2VkYXRhID0gKHN0cnVjdCBsYW5jZWRhdGEgKilkZXYtPm1lbV9zdGFydDsKKyAgICBpbnQgaTsKKworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworICAgIHByaXYtPnR4X2Z1bGwgPSAwOworICAgIHByaXYtPmN1cl9yeCA9IHByaXYtPmN1cl90eCA9IDA7CisgICAgcHJpdi0+ZGlydHlfdHggPSAwOworCisgICAgLyogU2V0IHVwIFRYIFJpbmcgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwl2b2xhdGlsZSBzdHJ1Y3QgVERSRSAqdCA9ICZsYW5jZWRhdGEtPnR4X3JpbmdbaV07CisJdC0+VE1EMCA9IHN3bG93dyhBUklBRE5FX1JBTStvZmZzZXRvZihzdHJ1Y3QgbGFuY2VkYXRhLCB0eF9idWZmW2ldKSk7CisJdC0+VE1EMSA9IHN3aGlnaHcoQVJJQURORV9SQU0rb2Zmc2V0b2Yoc3RydWN0IGxhbmNlZGF0YSwgdHhfYnVmZltpXSkpIHwKKwkJICBURl9TVFAgfCBURl9FTlA7CisJdC0+VE1EMiA9IHN3YXB3KCh1X3Nob3J0KS1QS1RfQlVGX1NJWkUpOworCXQtPlRNRDMgPSAwOworCXByaXYtPnR4X3JpbmdbaV0gPSAmbGFuY2VkYXRhLT50eF9yaW5nW2ldOworCXByaXYtPnR4X2J1ZmZbaV0gPSBsYW5jZWRhdGEtPnR4X2J1ZmZbaV07CisjaWYgMAorCXByaW50ayhLRVJOX0RFQlVHICJUWCBFbnRyeSAlMmQgYXQgJXAsIEJ1ZiBhdCAlcFxuIiwgaSwKKwkgICAgICAgJmxhbmNlZGF0YS0+dHhfcmluZ1tpXSwgbGFuY2VkYXRhLT50eF9idWZmW2ldKTsKKyNlbmRpZgorICAgIH0KKworICAgIC8qIFNldCB1cCBSWCBSaW5nICovCisgICAgZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJdm9sYXRpbGUgc3RydWN0IFJEUkUgKnIgPSAmbGFuY2VkYXRhLT5yeF9yaW5nW2ldOworCXItPlJNRDAgPSBzd2xvd3coQVJJQURORV9SQU0rb2Zmc2V0b2Yoc3RydWN0IGxhbmNlZGF0YSwgcnhfYnVmZltpXSkpOworCXItPlJNRDEgPSBzd2hpZ2h3KEFSSUFETkVfUkFNK29mZnNldG9mKHN0cnVjdCBsYW5jZWRhdGEsIHJ4X2J1ZmZbaV0pKSB8CisJCSAgUkZfT1dOOworCXItPlJNRDIgPSBzd2FwdygodV9zaG9ydCktUEtUX0JVRl9TSVpFKTsKKwlyLT5STUQzID0gMHgwMDAwOworCXByaXYtPnJ4X3JpbmdbaV0gPSAmbGFuY2VkYXRhLT5yeF9yaW5nW2ldOworCXByaXYtPnJ4X2J1ZmZbaV0gPSBsYW5jZWRhdGEtPnJ4X2J1ZmZbaV07CisjaWYgMAorCXByaW50ayhLRVJOX0RFQlVHICJSWCBFbnRyeSAlMmQgYXQgJXAsIEJ1ZiBhdCAlcFxuIiwgaSwKKwkgICAgICAgJmxhbmNlZGF0YS0+cnhfcmluZ1tpXSwgbGFuY2VkYXRhLT5yeF9idWZmW2ldKTsKKyNlbmRpZgorICAgIH0KK30KKworCitzdGF0aWMgaW50IGFyaWFkbmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgYXJpYWRuZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgQW03OUM5NjAgKmxhbmNlID0gKHN0cnVjdCBBbTc5Qzk2MCopZGV2LT5iYXNlX2FkZHI7CisKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgICBsYW5jZS0+UkFQID0gQ1NSMTEyOwkvKiBNaXNzZWQgRnJhbWUgQ291bnQgKi8KKyAgICBwcml2LT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gc3dhcHcobGFuY2UtPlJEUCk7CisgICAgbGFuY2UtPlJBUCA9IENTUjA7CQkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KKworICAgIGlmIChhcmlhZG5lX2RlYnVnID4gMSkgeworCXByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQsIHN0YXR1cyB3YXMgJTIuMnguXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGxhbmNlLT5SRFApOworCXByaW50ayhLRVJOX0RFQlVHICIlczogJWx1IHBhY2tldHMgbWlzc2VkXG4iLCBkZXYtPm5hbWUsCisJICAgICAgIHByaXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMpOworICAgIH0KKworICAgIC8qIFdlIHN0b3AgdGhlIExBTkNFIGhlcmUgLS0gaXQgb2NjYXNpb25hbGx5IHBvbGxzIG1lbW9yeSBpZiB3ZSBkb24ndC4gKi8KKyAgICBsYW5jZS0+UkRQID0gU1RPUDsKKworICAgIGZyZWVfaXJxKElSUV9BTUlHQV9QT1JUUywgZGV2KTsKKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmlhZG5lX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgdm9sYXRpbGUgc3RydWN0IEFtNzlDOTYwICpsYW5jZSA9IChzdHJ1Y3QgQW03OUM5NjAqKWRldi0+YmFzZV9hZGRyOworCisgICAgbGFuY2UtPlJBUCA9IENTUjA7CS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLworICAgIGxhbmNlLT5SRFAgPSBTVE9QOworICAgIGFyaWFkbmVfaW5pdF9yaW5nKGRldik7CisgICAgbGFuY2UtPlJEUCA9IElORUF8U1RSVDsKKyAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworfQorCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhcmlhZG5lX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqZnApCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisgICAgdm9sYXRpbGUgc3RydWN0IEFtNzlDOTYwICpsYW5jZSA9IChzdHJ1Y3QgQW03OUM5NjAqKWRldi0+YmFzZV9hZGRyOworICAgIHN0cnVjdCBhcmlhZG5lX3ByaXZhdGUgKnByaXY7CisgICAgaW50IGNzcjAsIGJvZ3VzY250OworICAgIGludCBoYW5kbGVkID0gMDsKKworICAgIGlmIChkZXYgPT0gTlVMTCkgeworCXByaW50ayhLRVJOX1dBUk5JTkcgImFyaWFkbmVfaW50ZXJydXB0KCk6IGlycSBmb3IgdW5rbm93biBkZXZpY2UuXG4iKTsKKwlyZXR1cm4gSVJRX05PTkU7CisgICAgfQorCisgICAgbGFuY2UtPlJBUCA9IENTUjA7CQkJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCisKKyAgICBpZiAoIShsYW5jZS0+UkRQICYgSU5UUikpCQkvKiBDaGVjayBpZiBhbnkgaW50ZXJydXB0IGhhcyBiZWVuICovCisJcmV0dXJuIElSUV9OT05FOwkJLyogZ2VuZXJhdGVkIGJ5IHRoZSBib2FyZC4gKi8KKworICAgIHByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgYm9ndXNjbnQgPSAxMDsKKyAgICB3aGlsZSAoKGNzcjAgPSBsYW5jZS0+UkRQKSAmIChFUlJ8UklOVHxUSU5UKSAmJiAtLWJvZ3VzY250ID49IDApIHsKKwkvKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMgQVNBUC4gKi8KKwlsYW5jZS0+UkRQID0gY3NyMCAmIH4oSU5FQXxURE1EfFNUT1B8U1RSVHxJTklUKTsKKworI2lmIDAKKwlpZiAoYXJpYWRuZV9kZWJ1ZyA+IDUpIHsKKwkgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcnJ1cHQgIGNzcjA9JSMyLjJ4IG5ldyBjc3I9JSMyLjJ4LiIsCisJCSAgIGRldi0+bmFtZSwgY3NyMCwgbGFuY2UtPlJEUCk7CisJICAgIHByaW50aygiWyIpOworCSAgICBpZiAoY3NyMCAmIElOVFIpCisJCXByaW50aygiIElOVFIiKTsKKwkgICAgaWYgKGNzcjAgJiBJTkVBKQorCQlwcmludGsoIiBJTkVBIik7CisJICAgIGlmIChjc3IwICYgUlhPTikKKwkJcHJpbnRrKCIgUlhPTiIpOworCSAgICBpZiAoY3NyMCAmIFRYT04pCisJCXByaW50aygiIFRYT04iKTsKKwkgICAgaWYgKGNzcjAgJiBURE1EKQorCQlwcmludGsoIiBURE1EIik7CisJICAgIGlmIChjc3IwICYgU1RPUCkKKwkJcHJpbnRrKCIgU1RPUCIpOworCSAgICBpZiAoY3NyMCAmIFNUUlQpCisJCXByaW50aygiIFNUUlQiKTsKKwkgICAgaWYgKGNzcjAgJiBJTklUKQorCQlwcmludGsoIiBJTklUIik7CisJICAgIGlmIChjc3IwICYgRVJSKQorCQlwcmludGsoIiBFUlIiKTsKKwkgICAgaWYgKGNzcjAgJiBCQUJMKQorCQlwcmludGsoIiBCQUJMIik7CisJICAgIGlmIChjc3IwICYgQ0VSUikKKwkJcHJpbnRrKCIgQ0VSUiIpOworCSAgICBpZiAoY3NyMCAmIE1JU1MpCisJCXByaW50aygiIE1JU1MiKTsKKwkgICAgaWYgKGNzcjAgJiBNRVJSKQorCQlwcmludGsoIiBNRVJSIik7CisJICAgIGlmIChjc3IwICYgUklOVCkKKwkJcHJpbnRrKCIgUklOVCIpOworCSAgICBpZiAoY3NyMCAmIFRJTlQpCisJCXByaW50aygiIFRJTlQiKTsKKwkgICAgaWYgKGNzcjAgJiBJRE9OKQorCQlwcmludGsoIiBJRE9OIik7CisJICAgIHByaW50aygiIF1cbiIpOworCX0KKyNlbmRpZgorCisJaWYgKGNzcjAgJiBSSU5UKSB7CS8qIFJ4IGludGVycnVwdCAqLworCSAgICBoYW5kbGVkID0gMTsKKwkgICAgYXJpYWRuZV9yeChkZXYpOworCX0KKworCWlmIChjc3IwICYgVElOVCkgewkvKiBUeC1kb25lIGludGVycnVwdCAqLworCSAgICBpbnQgZGlydHlfdHggPSBwcml2LT5kaXJ0eV90eDsKKworCSAgICBoYW5kbGVkID0gMTsKKwkgICAgd2hpbGUgKGRpcnR5X3R4IDwgcHJpdi0+Y3VyX3R4KSB7CisJCWludCBlbnRyeSA9IGRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworCQlpbnQgc3RhdHVzID0gbG93Yihwcml2LT50eF9yaW5nW2VudHJ5XS0+VE1EMSk7CisKKwkJaWYgKHN0YXR1cyAmIFRGX09XTikKKwkJICAgIGJyZWFrOwkvKiBJdCBzdGlsbCBoYXNuJ3QgYmVlbiBUeGVkICovCisKKwkJcHJpdi0+dHhfcmluZ1tlbnRyeV0tPlRNRDEgJj0gMHhmZjAwOworCisJCWlmIChzdGF0dXMgJiBURl9FUlIpIHsKKwkJICAgIC8qIFRoZXJlIHdhcyBhbiBtYWpvciBlcnJvciwgbG9nIGl0LiAqLworCQkgICAgaW50IGVycl9zdGF0dXMgPSBwcml2LT50eF9yaW5nW2VudHJ5XS0+VE1EMzsKKwkJICAgIHByaXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQkgICAgaWYgKGVycl9zdGF0dXMgJiBFRl9SVFJZKQorCQkJcHJpdi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJICAgIGlmIChlcnJfc3RhdHVzICYgRUZfTENBUikKKwkJCXByaXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCSAgICBpZiAoZXJyX3N0YXR1cyAmIEVGX0xDT0wpCisJCQlwcml2LT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCSAgICBpZiAoZXJyX3N0YXR1cyAmIEVGX1VGTE8pIHsKKwkJCS8qIEFja2shICBPbiBGSUZPIGVycm9ycyB0aGUgVHggdW5pdCBpcyB0dXJuZWQgb2ZmISAqLworCQkJcHJpdi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCS8qIFJlbW92ZSB0aGlzIHZlcmJvc2l0eSBsYXRlciEgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFR4IEZJRk8gZXJyb3IhIFN0YXR1cyAlNC40eC5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBjc3IwKTsKKwkJCS8qIFJlc3RhcnQgdGhlIGNoaXAuICovCisJCQlsYW5jZS0+UkRQID0gU1RSVDsKKwkJICAgIH0KKwkJfSBlbHNlIHsKKwkJICAgIGlmIChzdGF0dXMgJiAoVEZfTU9SRXxURl9PTkUpKQorCQkJcHJpdi0+c3RhdHMuY29sbGlzaW9ucysrOworCQkgICAgcHJpdi0+c3RhdHMudHhfcGFja2V0cysrOworCQl9CisJCWRpcnR5X3R4Kys7CisJICAgIH0KKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJICAgIGlmIChwcml2LT5jdXJfdHggLSBkaXJ0eV90eCA+PSBUWF9SSU5HX1NJWkUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJvdXQtb2Ytc3luYyBkaXJ0eSBwb2ludGVyLCAlZCB2cy4gJWQsICIKKwkJICAgICAgICJmdWxsPSVkLlxuIiwgZGlydHlfdHgsIHByaXYtPmN1cl90eCwgcHJpdi0+dHhfZnVsbCk7CisJCWRpcnR5X3R4ICs9IFRYX1JJTkdfU0laRTsKKwkgICAgfQorI2VuZGlmCisKKwkgICAgaWYgKHByaXYtPnR4X2Z1bGwgJiYgbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCisJCWRpcnR5X3R4ID4gcHJpdi0+Y3VyX3R4IC0gVFhfUklOR19TSVpFICsgMikgeworCQkvKiBUaGUgcmluZyBpcyBubyBsb25nZXIgZnVsbC4gKi8KKwkJcHJpdi0+dHhfZnVsbCA9IDA7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkgICAgfQorCisJICAgIHByaXYtPmRpcnR5X3R4ID0gZGlydHlfdHg7CisJfQorCisJLyogTG9nIG1pc2MgZXJyb3JzLiAqLworCWlmIChjc3IwICYgQkFCTCkgeworCSAgICBoYW5kbGVkID0gMTsKKwkgICAgcHJpdi0+c3RhdHMudHhfZXJyb3JzKys7CS8qIFR4IGJhYmJsZS4gKi8KKwl9CisJaWYgKGNzcjAgJiBNSVNTKSB7CisJICAgIGhhbmRsZWQgPSAxOworCSAgICBwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsJLyogTWlzc2VkIGEgUnggZnJhbWUuICovCisJfQorCWlmIChjc3IwICYgTUVSUikgeworCSAgICBoYW5kbGVkID0gMTsKKwkgICAgcHJpbnRrKEtFUk5fRVJSICIlczogQnVzIG1hc3RlciBhcmJpdHJhdGlvbiBmYWlsdXJlLCBzdGF0dXMgIgorCQkgICAiJTQuNHguXG4iLCBkZXYtPm5hbWUsIGNzcjApOworCSAgICAvKiBSZXN0YXJ0IHRoZSBjaGlwLiAqLworCSAgICBsYW5jZS0+UkRQID0gU1RSVDsKKwl9CisgICAgfQorCisgICAgLyogQ2xlYXIgYW55IG90aGVyIGludGVycnVwdCwgYW5kIHNldCBpbnRlcnJ1cHQgZW5hYmxlLiAqLworICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCisgICAgbGFuY2UtPlJEUCA9IElORUF8QkFCTHxDRVJSfE1JU1N8TUVSUnxJRE9OOworCisjaWYgMAorICAgIGlmIChhcmlhZG5lX2RlYnVnID4gNCkKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4aXRpbmcgaW50ZXJydXB0LCBjc3IlZD0lIzQuNHguXG4iLCBkZXYtPm5hbWUsCisJICAgICAgIGxhbmNlLT5SQVAsIGxhbmNlLT5SRFApOworI2VuZGlmCisgICAgcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKworc3RhdGljIHZvaWQgYXJpYWRuZV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgdm9sYXRpbGUgc3RydWN0IEFtNzlDOTYwICpsYW5jZSA9IChzdHJ1Y3QgQW03OUM5NjAqKWRldi0+YmFzZV9hZGRyOworCisgICAgcHJpbnRrKEtFUk5fRVJSICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgJTQuNHgsIHJlc2V0dGluZy5cbiIsCisJICAgZGV2LT5uYW1lLCBsYW5jZS0+UkRQKTsKKyAgICBhcmlhZG5lX3Jlc2V0KGRldik7CisgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisKK3N0YXRpYyBpbnQgYXJpYWRuZV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisgICAgdm9sYXRpbGUgc3RydWN0IEFtNzlDOTYwICpsYW5jZSA9IChzdHJ1Y3QgQW03OUM5NjAqKWRldi0+YmFzZV9hZGRyOworICAgIGludCBlbnRyeTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGludCBsZW4gPSBza2ItPmxlbjsKKworI2lmIDAKKyAgICBpZiAoYXJpYWRuZV9kZWJ1ZyA+IDMpIHsKKwlsYW5jZS0+UkFQID0gQ1NSMDsJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBhcmlhZG5lX3N0YXJ0X3htaXQoKSBjYWxsZWQsIGNzcjAgJTQuNHguXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGxhbmNlLT5SRFApOworCWxhbmNlLT5SRFAgPSAweDAwMDA7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBGSVhNRTogaXMgdGhlIDc5Qzk2MCBuZXcgZW5vdWdoIHRvIGRvIGl0cyBvd24gcGFkZGluZyByaWdodCA/ICovCisgICAgaWYgKHNrYi0+bGVuIDwgRVRIX1pMRU4pCisgICAgeworICAgIAlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisgICAgCWlmIChza2IgPT0gTlVMTCkKKyAgICAJICAgIHJldHVybiAwOworICAgIAlsZW4gPSBFVEhfWkxFTjsKKyAgICB9CisKKyAgICAvKiBGaWxsIGluIGEgVHggcmluZyBlbnRyeSAqLworCisjaWYgMAorICAgIHByaW50ayhLRVJOX0RFQlVHICJUWCBwa3QgdHlwZSAweCUwNHggZnJvbSAiLCAoKHVfc2hvcnQgKilza2ItPmRhdGEpWzZdKTsKKyAgICB7CisJaW50IGk7CisJdV9jaGFyICpwdHIgPSAmKCh1X2NoYXIgKilza2ItPmRhdGEpWzZdOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJICAgIHByaW50aygiJTAyeCIsIHB0cltpXSk7CisgICAgfQorICAgIHByaW50aygiIHRvICIpOworICAgIHsKKwlpbnQgaTsKKwl1X2NoYXIgKnB0ciA9ICh1X2NoYXIgKilza2ItPmRhdGE7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkgICAgcHJpbnRrKCIlMDJ4IiwgcHRyW2ldKTsKKyAgICB9CisgICAgcHJpbnRrKCIgZGF0YSAweCUwOHggbGVuICVkXG4iLCAoaW50KXNrYi0+ZGF0YSwgKGludClza2ItPmxlbik7CisjZW5kaWYKKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworICAgIGVudHJ5ID0gcHJpdi0+Y3VyX3R4ICUgVFhfUklOR19TSVpFOworCisgICAgLyogQ2F1dGlvbjogdGhlIHdyaXRlIG9yZGVyIGlzIGltcG9ydGFudCBoZXJlLCBzZXQgdGhlIGJhc2UgYWRkcmVzcyB3aXRoCisJCXRoZSAib3duZXJzaGlwIiBiaXRzIGxhc3QuICovCisKKyAgICBwcml2LT50eF9yaW5nW2VudHJ5XS0+VE1EMiA9IHN3YXB3KCh1X3Nob3J0KS1za2ItPmxlbik7CisgICAgcHJpdi0+dHhfcmluZ1tlbnRyeV0tPlRNRDMgPSAweDAwMDA7CisgICAgbWVtY3B5dyhwcml2LT50eF9idWZmW2VudHJ5XSwgKHVfc2hvcnQgKilza2ItPmRhdGEsIGxlbik7CisKKyNpZiAwCisgICAgeworCWludCBpLCBsZW47CisKKwlsZW4gPSBza2ItPmxlbiA+IDY0ID8gNjQgOiBza2ItPmxlbjsKKwlsZW4gPj49IDE7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7CisJICAgIGludCBqOworCSAgICBwcmludGsoS0VSTl9ERUJVRyAiJTA0eDoiLCBpKTsKKwkgICAgZm9yIChqID0gMDsgKGogPCA4KSAmJiAoKGkraikgPCBsZW4pOyBqKyspIHsKKwkJaWYgKCEoaiAmIDEpKQorCQkgICAgcHJpbnRrKCIgIik7CisJCXByaW50aygiJTA0eCIsIHByaXYtPnR4X2J1ZmZbZW50cnldW2kral0pOworCSAgICB9CisJICAgIHByaW50aygiXG4iKTsKKwl9CisgICAgfQorI2VuZGlmCisKKyAgICBwcml2LT50eF9yaW5nW2VudHJ5XS0+VE1EMSA9IChwcml2LT50eF9yaW5nW2VudHJ5XS0+VE1EMSYweGZmMDApfFRGX09XTnxURl9TVFB8VEZfRU5QOworCisgICAgZGV2X2tmcmVlX3NrYihza2IpOworCisgICAgcHJpdi0+Y3VyX3R4Kys7CisgICAgaWYgKChwcml2LT5jdXJfdHggPj0gVFhfUklOR19TSVpFKSAmJiAocHJpdi0+ZGlydHlfdHggPj0gVFhfUklOR19TSVpFKSkgeworCisjaWYgMAorCXByaW50ayhLRVJOX0RFQlVHICIqKiogU3VidHJhY3RpbmcgVFhfUklOR19TSVpFIGZyb20gY3VyX3R4ICglZCkgYW5kICIKKwkgICAgICAgImRpcnR5X3R4ICglZClcbiIsIHByaXYtPmN1cl90eCwgcHJpdi0+ZGlydHlfdHgpOworI2VuZGlmCisKKwlwcml2LT5jdXJfdHggLT0gVFhfUklOR19TSVpFOworCXByaXYtPmRpcnR5X3R4IC09IFRYX1JJTkdfU0laRTsKKyAgICB9CisKKyAgICAvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSBzZW5kIHBvbGwuICovCisgICAgbGFuY2UtPlJBUCA9IENTUjA7CQkvKiBQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMgKi8KKyAgICBsYW5jZS0+UkRQID0gSU5FQXxURE1EOworCisgICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKyAgICBpZiAobG93Yihwcml2LT50eF9yaW5nWyhlbnRyeSsxKSAlIFRYX1JJTkdfU0laRV0tPlRNRDEpICE9IDApIHsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJcHJpdi0+dHhfZnVsbCA9IDE7CisgICAgfQorICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYXJpYWRuZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBhcmlhZG5lX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGludCBlbnRyeSA9IHByaXYtPmN1cl9yeCAlIFJYX1JJTkdfU0laRTsKKyAgICBpbnQgaTsKKworICAgIC8qIElmIHdlIG93biB0aGUgbmV4dCBlbnRyeSwgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCisgICAgd2hpbGUgKCEobG93Yihwcml2LT5yeF9yaW5nW2VudHJ5XS0+Uk1EMSkgJiBSRl9PV04pKSB7CisJaW50IHN0YXR1cyA9IGxvd2IocHJpdi0+cnhfcmluZ1tlbnRyeV0tPlJNRDEpOworCisJaWYgKHN0YXR1cyAhPSAoUkZfU1RQfFJGX0VOUCkpIHsJLyogVGhlcmUgd2FzIGFuIGVycm9yLiAqLworCSAgICAvKiBUaGVyZSBpcyBhIHRyaWNreSBlcnJvciBub3RlZCBieSBKb2huIE11cnBoeSwKKwkJPG11cmZAcGVyZnRlY2guY29tPiB0byBSdXNzIE5lbHNvbjogRXZlbiB3aXRoIGZ1bGwtc2l6ZWQKKwkJYnVmZmVycyBpdCdzIHBvc3NpYmxlIGZvciBhIGphYmJlciBwYWNrZXQgdG8gdXNlIHR3bworCQlidWZmZXJzLCB3aXRoIG9ubHkgdGhlIGxhc3QgY29ycmVjdGx5IG5vdGluZyB0aGUgZXJyb3IuICovCisJICAgIGlmIChzdGF0dXMgJiBSRl9FTlApCisJCS8qIE9ubHkgY291bnQgYSBnZW5lcmFsIGVycm9yIGF0IHRoZSBlbmQgb2YgYSBwYWNrZXQuKi8KKwkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7CisJICAgIGlmIChzdGF0dXMgJiBSRl9GUkFNKQorCQlwcml2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkgICAgaWYgKHN0YXR1cyAmIFJGX09GTE8pCisJCXByaXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJICAgIGlmIChzdGF0dXMgJiBSRl9DUkMpCisJCXByaXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkgICAgaWYgKHN0YXR1cyAmIFJGX0JVRkYpCisJCXByaXYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJICAgIHByaXYtPnJ4X3JpbmdbZW50cnldLT5STUQxICY9IDB4ZmYwMHxSRl9TVFB8UkZfRU5QOworCX0gZWxzZSB7CisJICAgIC8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLCBjb21wYXRpYmxlIHdpdGggbmV0LTMuICovCisJICAgIHNob3J0IHBrdF9sZW4gPSBzd2Fwdyhwcml2LT5yeF9yaW5nW2VudHJ5XS0+Uk1EMyk7CisJICAgIHN0cnVjdCBza19idWZmICpza2I7CisKKwkgICAgc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKzIpOworCSAgICBpZiAoc2tiID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1lbW9yeSBzcXVlZXplLCBkZWZlcnJpbmcgcGFja2V0LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykKKwkJICAgIGlmIChsb3diKHByaXYtPnJ4X3JpbmdbKGVudHJ5K2kpICUgUlhfUklOR19TSVpFXS0+Uk1EMSkgJiBSRl9PV04pCisJCQlicmVhazsKKworCQlpZiAoaSA+IFJYX1JJTkdfU0laRS0yKSB7CisJCSAgICBwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCSAgICBwcml2LT5yeF9yaW5nW2VudHJ5XS0+Uk1EMSB8PSBSRl9PV047CisJCSAgICBwcml2LT5jdXJfcngrKzsKKwkJfQorCQlicmVhazsKKwkgICAgfQorCisKKwkgICAgc2tiLT5kZXYgPSBkZXY7CisJICAgIHNrYl9yZXNlcnZlKHNrYiwyKTsJCS8qIDE2IGJ5dGUgYWxpZ24gKi8KKwkgICAgc2tiX3B1dChza2IscGt0X2xlbik7CS8qIE1ha2Ugcm9vbSAqLworCSAgICBldGhfY29weV9hbmRfc3VtKHNrYiwgKGNoYXIgKilwcml2LT5yeF9idWZmW2VudHJ5XSwgcGt0X2xlbiwwKTsKKwkgICAgc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKyNpZiAwCisJICAgIHByaW50ayhLRVJOX0RFQlVHICJSWCBwa3QgdHlwZSAweCUwNHggZnJvbSAiLAorCQkgICAoKHVfc2hvcnQgKilza2ItPmRhdGEpWzZdKTsKKwkgICAgeworCQlpbnQgaTsKKwkJdV9jaGFyICpwdHIgPSAmKCh1X2NoYXIgKilza2ItPmRhdGEpWzZdOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkgICAgcHJpbnRrKCIlMDJ4IiwgcHRyW2ldKTsKKwkgICAgfQorCSAgICBwcmludGsoIiB0byAiKTsKKwkgICAgeworCQlpbnQgaTsKKwkJdV9jaGFyICpwdHIgPSAodV9jaGFyICopc2tiLT5kYXRhOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkgICAgcHJpbnRrKCIlMDJ4IiwgcHRyW2ldKTsKKwkgICAgfQorCSAgICBwcmludGsoIiBkYXRhIDB4JTA4eCBsZW4gJWRcbiIsIChpbnQpc2tiLT5kYXRhLCAoaW50KXNrYi0+bGVuKTsKKyNlbmRpZgorCisJICAgIG5ldGlmX3J4KHNrYik7CisJICAgIGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJICAgIHByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkgICAgcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwl9CisKKwlwcml2LT5yeF9yaW5nW2VudHJ5XS0+Uk1EMSB8PSBSRl9PV047CisJZW50cnkgPSAoKytwcml2LT5jdXJfcngpICUgUlhfUklOR19TSVpFOworICAgIH0KKworICAgIHByaXYtPmN1cl9yeCA9IHByaXYtPmN1cl9yeCAlIFJYX1JJTkdfU0laRTsKKworICAgIC8qIFdlIHNob3VsZCBjaGVjayB0aGF0IGF0IGxlYXN0IHR3byByaW5nIGVudHJpZXMgYXJlIGZyZWUuCSBJZiBub3QsCisgICAgICAgd2Ugc2hvdWxkIGZyZWUgb25lIGFuZCBtYXJrIHN0YXRzLT5yeF9kcm9wcGVkKysuICovCisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmFyaWFkbmVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGFyaWFkbmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisgICAgdm9sYXRpbGUgc3RydWN0IEFtNzlDOTYwICpsYW5jZSA9IChzdHJ1Y3QgQW03OUM5NjAqKWRldi0+YmFzZV9hZGRyOworICAgIHNob3J0IHNhdmVkX2FkZHI7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICBzYXZlZF9hZGRyID0gbGFuY2UtPlJBUDsKKyAgICBsYW5jZS0+UkFQID0gQ1NSMTEyOwkJLyogTWlzc2VkIEZyYW1lIENvdW50ICovCisgICAgcHJpdi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IHN3YXB3KGxhbmNlLT5SRFApOworICAgIGxhbmNlLT5SQVAgPSBzYXZlZF9hZGRyOworICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworICAgIHJldHVybiAmcHJpdi0+c3RhdHM7Cit9CisKKworLyogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgICAgbnVtX2FkZHJzID09IC0xCVByb21pc2N1b3VzIG1vZGUsIHJlY2VpdmUgYWxsIHBhY2tldHMKKyAgICBudW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKKyAgICBudW1fYWRkcnMgPiAwCU11bHRpY2FzdCBtb2RlLCByZWNlaXZlIG5vcm1hbCBhbmQgTUMgcGFja2V0cywgYW5kIGRvCisJCQliZXN0LWVmZm9ydCBmaWx0ZXJpbmcuCisgKi8KK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHZvbGF0aWxlIHN0cnVjdCBBbTc5Qzk2MCAqbGFuY2UgPSAoc3RydWN0IEFtNzlDOTYwKilkZXYtPmJhc2VfYWRkcjsKKworICAgIGlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCXJldHVybjsKKworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworICAgIC8qIFdlIHRha2UgdGhlIHNpbXBsZSB3YXkgb3V0IGFuZCBhbHdheXMgZW5hYmxlIHByb21pc2N1b3VzIG1vZGUuICovCisgICAgbGFuY2UtPlJBUCA9IENTUjA7CQkJLyogUENuZXQtSVNBIENvbnRyb2xsZXIgU3RhdHVzICovCisgICAgbGFuY2UtPlJEUCA9IFNUT1A7CQkJLyogVGVtcG9yYXJpbHkgc3RvcCB0aGUgbGFuY2UuICovCisgICAgYXJpYWRuZV9pbml0X3JpbmcoZGV2KTsKKworICAgIGlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkvKiBMb2cgYW55IG5ldCB0YXBzLiAqLworCXByaW50ayhLRVJOX0lORk8gIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLCBkZXYtPm5hbWUpOworCWxhbmNlLT5SQVAgPSBDU1IxNTsJCS8qIE1vZGUgUmVnaXN0ZXIgKi8KKwlsYW5jZS0+UkRQID0gUFJPTTsJCS8qIFNldCBwcm9taXNjdW91cyBtb2RlICovCisgICAgfSBlbHNlIHsKKwlzaG9ydCBtdWx0aWNhc3RfdGFibGVbNF07CisJaW50IG51bV9hZGRycyA9IGRldi0+bWNfY291bnQ7CisJaW50IGk7CisJLyogV2UgZG9uJ3QgdXNlIHRoZSBtdWx0aWNhc3QgdGFibGUsIGJ1dCByZWx5IG9uIHVwcGVyLWxheWVyIGZpbHRlcmluZy4gKi8KKwltZW1zZXQobXVsdGljYXN0X3RhYmxlLCAobnVtX2FkZHJzID09IDApID8gMCA6IC0xLAorCSAgICAgICBzaXplb2YobXVsdGljYXN0X3RhYmxlKSk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCSAgICBsYW5jZS0+UkFQID0gQ1NSOCsoaTw8OCk7CS8qIExvZ2ljYWwgQWRkcmVzcyBGaWx0ZXIgKi8KKwkgICAgbGFuY2UtPlJEUCA9IHN3YXB3KG11bHRpY2FzdF90YWJsZVtpXSk7CisJfQorCWxhbmNlLT5SQVAgPSBDU1IxNTsJCS8qIE1vZGUgUmVnaXN0ZXIgKi8KKwlsYW5jZS0+UkRQID0gMHgwMDAwOwkJLyogVW5zZXQgcHJvbWlzY3VvdXMgbW9kZSAqLworICAgIH0KKworICAgIGxhbmNlLT5SQVAgPSBDU1IwOwkJCS8qIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLworICAgIGxhbmNlLT5SRFAgPSBJTkVBfFNUUlR8SURPTjsJLyogUmVzdW1lIG5vcm1hbCBvcGVyYXRpb24uICovCisKKyAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IGFyaWFkbmVfcmVtb3ZlX29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6KQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB6b3Jyb19nZXRfZHJ2ZGF0YSh6KTsKKworICAgIHVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisgICAgcmVsZWFzZV9tZW1fcmVnaW9uKFpUV09fUEFERFIoZGV2LT5iYXNlX2FkZHIpLCBzaXplb2Yoc3RydWN0IEFtNzlDOTYwKSk7CisgICAgcmVsZWFzZV9tZW1fcmVnaW9uKFpUV09fUEFERFIoZGV2LT5tZW1fc3RhcnQpLCBBUklBRE5FX1JBTV9TSVpFKTsKKyAgICBmcmVlX25ldGRldihkZXYpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhcmlhZG5lX2luaXRfbW9kdWxlKHZvaWQpCit7CisgICAgcmV0dXJuIHpvcnJvX21vZHVsZV9pbml0KCZhcmlhZG5lX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhcmlhZG5lX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisgICAgem9ycm9fdW5yZWdpc3Rlcl9kcml2ZXIoJmFyaWFkbmVfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYXJpYWRuZV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChhcmlhZG5lX2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJpYWRuZS5oIGIvZHJpdmVycy9uZXQvYXJpYWRuZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OTEzZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcmlhZG5lLmgKQEAgLTAsMCArMSw0MTUgQEAKKy8qCisgKiAgQW1pZ2EgTGludXgvbTY4ayBBcmlhZG5lIEV0aGVybmV0IERyaXZlcgorICoKKyAqICCpIENvcHlyaWdodCAxOTk1IGJ5IEdlZXJ0IFV5dHRlcmhvZXZlbiAoZ2VlcnRAbGludXgtbTY4ay5vcmcpCisgKgkJCVBldGVyIERlIFNjaHJpanZlcgorICoJCSAgICAgICAoUGV0ZXIuRGVTY2hyaWp2ZXJAbGludXguY2Mua3VsZXV2ZW4uYWMuYmUpCisgKgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGJhc2VkIG9uCisgKgorICoJbGFuY2UuYzoJQW4gQU1EIExBTkNFIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguCisgKgkJCVdyaXR0ZW4gMTk5My05NCBieSBEb25hbGQgQmVja2VyLgorICoKKyAqCUFtNzlDOTYwOglQQ25ldCh0bSktSVNBIFNpbmdsZS1DaGlwIEV0aGVybmV0IENvbnRyb2xsZXIKKyAqCQkJQWR2YW5jZWQgTWljcm8gRGV2aWNlcworICoJCQlQdWJsaWNhdGlvbiAjMTY5MDcsIFJldi4gQiwgQW1lbmRtZW50LzAsIE1heSAxOTk0CisgKgorICoJTUM2ODIzMDoJUGFyYWxsZWwgSW50ZXJmYWNlL1RpbWVyIChQSS9UKQorICoJCQlNb3Rvcm9sYSBTZW1pY29uZHVjdG9ycywgRGVjZW1iZXIsIDE5ODMKKyAqCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4CisgKiAgZGlzdHJpYnV0aW9uIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgVGhlIEFyaWFkbmUgaXMgYSBab3Jyby1JSSBib2FyZCBtYWRlIGJ5IFZpbGxhZ2UgVHJvbmljLiBJdCBjb250YWluczoKKyAqCisgKgktIGFuIEFtNzlDOTYwIFBDbmV0LUlTQSBTaW5nbGUtQ2hpcCBFdGhlcm5ldCBDb250cm9sbGVyIHdpdGggYm90aAorICoJICAxMEJBU0UtMiAodGhpbiBjb2F4KSBhbmQgMTBCQVNFLVQgKFVUUCkgY29ubmVjdG9ycworICoKKyAqCS0gYW4gTUM2ODIzMCBQYXJhbGxlbCBJbnRlcmZhY2UvVGltZXIgY29uZmlndXJlZCBhcyAyIHBhcmFsbGVsIHBvcnRzCisgKi8KKworCisgICAgLyoKKyAgICAgKglBbTc5Qzk2MCBQQ25ldC1JU0EKKyAgICAgKi8KKworc3RydWN0IEFtNzlDOTYwIHsKKyAgICB2b2xhdGlsZSB1X3Nob3J0IEFkZHJlc3NQUk9NWzhdOworCQkJCS8qIElFRUUgQWRkcmVzcyBQUk9NIChVbnVzZWQgaW4gdGhlIEFyaWFkbmUpICovCisgICAgdm9sYXRpbGUgdV9zaG9ydCBSRFA7CS8qIFJlZ2lzdGVyIERhdGEgUG9ydCAqLworICAgIHZvbGF0aWxlIHVfc2hvcnQgUkFQOwkvKiBSZWdpc3RlciBBZGRyZXNzIFBvcnQgKi8KKyAgICB2b2xhdGlsZSB1X3Nob3J0IFJlc2V0OwkvKiBSZXNldCBDaGlwIG9uIFJlYWQgQWNjZXNzICovCisgICAgdm9sYXRpbGUgdV9zaG9ydCBJRFA7CS8qIElTQUNTUiBEYXRhIFBvcnQgKi8KK307CisKKworICAgIC8qCisgICAgICoJQW03OUM5NjAgQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVycworICAgICAqCisgICAgICoJVGhlc2UgdmFsdWVzIGFyZSBhbHJlYWR5IHN3YXAoKWVkISEKKyAgICAgKgorICAgICAqCU9ubHkgcmVnaXN0ZXJzIG1hcmtlZCB3aXRoIGEgYC0nIGFyZSBpbnRlbmRlZCBmb3IgbmV0d29yayBzb2Z0d2FyZQorICAgICAqCWFjY2VzcworICAgICAqLworCisjZGVmaW5lIENTUjAJCTB4MDAwMAkvKiAtIFBDbmV0LUlTQSBDb250cm9sbGVyIFN0YXR1cyAqLworI2RlZmluZSBDU1IxCQkweDAxMDAJLyogLSBJQURSWzE1OjBdICovCisjZGVmaW5lIENTUjIJCTB4MDIwMAkvKiAtIElBRFJbMjM6MTZdICovCisjZGVmaW5lIENTUjMJCTB4MDMwMAkvKiAtIEludGVycnVwdCBNYXNrcyBhbmQgRGVmZXJyYWwgQ29udHJvbCAqLworI2RlZmluZSBDU1I0CQkweDA0MDAJLyogLSBUZXN0IGFuZCBGZWF0dXJlcyBDb250cm9sICovCisjZGVmaW5lIENTUjYJCTB4MDYwMAkvKiAgIFJDVi9YTVQgRGVzY3JpcHRvciBUYWJsZSBMZW5ndGggKi8KKyNkZWZpbmUgQ1NSOAkJMHgwODAwCS8qIC0gTG9naWNhbCBBZGRyZXNzIEZpbHRlciwgTEFEUkZbMTU6MF0gKi8KKyNkZWZpbmUgQ1NSOQkJMHgwOTAwCS8qIC0gTG9naWNhbCBBZGRyZXNzIEZpbHRlciwgTEFEUkZbMzE6MTZdICovCisjZGVmaW5lIENTUjEwCQkweDBhMDAJLyogLSBMb2dpY2FsIEFkZHJlc3MgRmlsdGVyLCBMQURSRls0NzozMl0gKi8KKyNkZWZpbmUgQ1NSMTEJCTB4MGIwMAkvKiAtIExvZ2ljYWwgQWRkcmVzcyBGaWx0ZXIsIExBRFJGWzYzOjQ4XSAqLworI2RlZmluZSBDU1IxMgkJMHgwYzAwCS8qIC0gUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciwgUEFEUlsxNTowXSAqLworI2RlZmluZSBDU1IxMwkJMHgwZDAwCS8qIC0gUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciwgUEFEUlszMToxNl0gKi8KKyNkZWZpbmUgQ1NSMTQJCTB4MGUwMAkvKiAtIFBoeXNpY2FsIEFkZHJlc3MgUmVnaXN0ZXIsIFBBRFJbNDc6MzJdICovCisjZGVmaW5lIENTUjE1CQkweDBmMDAJLyogLSBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIENTUjE2CQkweDEwMDAJLyogICBJbml0aWFsaXphdGlvbiBCbG9jayBBZGRyZXNzIExvd2VyICovCisjZGVmaW5lIENTUjE3CQkweDExMDAJLyogICBJbml0aWFsaXphdGlvbiBCbG9jayBBZGRyZXNzIFVwcGVyICovCisjZGVmaW5lIENTUjE4CQkweDEyMDAJLyogICBDdXJyZW50IFJlY2VpdmUgQnVmZmVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgQ1NSMTkJCTB4MTMwMAkvKiAgIEN1cnJlbnQgUmVjZWl2ZSBCdWZmZXIgQWRkcmVzcyAqLworI2RlZmluZSBDU1IyMAkJMHgxNDAwCS8qICAgQ3VycmVudCBUcmFuc21pdCBCdWZmZXIgQWRkcmVzcyAqLworI2RlZmluZSBDU1IyMQkJMHgxNTAwCS8qICAgQ3VycmVudCBUcmFuc21pdCBCdWZmZXIgQWRkcmVzcyAqLworI2RlZmluZSBDU1IyMgkJMHgxNjAwCS8qICAgTmV4dCBSZWNlaXZlIEJ1ZmZlciBBZGRyZXNzICovCisjZGVmaW5lIENTUjIzCQkweDE3MDAJLyogICBOZXh0IFJlY2VpdmUgQnVmZmVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgQ1NSMjQJCTB4MTgwMAkvKiAtIEJhc2UgQWRkcmVzcyBvZiBSZWNlaXZlIFJpbmcgKi8KKyNkZWZpbmUgQ1NSMjUJCTB4MTkwMAkvKiAtIEJhc2UgQWRkcmVzcyBvZiBSZWNlaXZlIFJpbmcgKi8KKyNkZWZpbmUgQ1NSMjYJCTB4MWEwMAkvKiAgIE5leHQgUmVjZWl2ZSBEZXNjcmlwdG9yIEFkZHJlc3MgKi8KKyNkZWZpbmUgQ1NSMjcJCTB4MWIwMAkvKiAgIE5leHQgUmVjZWl2ZSBEZXNjcmlwdG9yIEFkZHJlc3MgKi8KKyNkZWZpbmUgQ1NSMjgJCTB4MWMwMAkvKiAgIEN1cnJlbnQgUmVjZWl2ZSBEZXNjcmlwdG9yIEFkZHJlc3MgKi8KKyNkZWZpbmUgQ1NSMjkJCTB4MWQwMAkvKiAgIEN1cnJlbnQgUmVjZWl2ZSBEZXNjcmlwdG9yIEFkZHJlc3MgKi8KKyNkZWZpbmUgQ1NSMzAJCTB4MWUwMAkvKiAtIEJhc2UgQWRkcmVzcyBvZiBUcmFuc21pdCBSaW5nICovCisjZGVmaW5lIENTUjMxCQkweDFmMDAJLyogLSBCYXNlIEFkZHJlc3Mgb2YgdHJhbnNtaXQgUmluZyAqLworI2RlZmluZSBDU1IzMgkJMHgyMDAwCS8qICAgTmV4dCBUcmFuc21pdCBEZXNjcmlwdG9yIEFkZHJlc3MgKi8KKyNkZWZpbmUgQ1NSMzMJCTB4MjEwMAkvKiAgIE5leHQgVHJhbnNtaXQgRGVzY3JpcHRvciBBZGRyZXNzICovCisjZGVmaW5lIENTUjM0CQkweDIyMDAJLyogICBDdXJyZW50IFRyYW5zbWl0IERlc2NyaXB0b3IgQWRkcmVzcyAqLworI2RlZmluZSBDU1IzNQkJMHgyMzAwCS8qICAgQ3VycmVudCBUcmFuc21pdCBEZXNjcmlwdG9yIEFkZHJlc3MgKi8KKyNkZWZpbmUgQ1NSMzYJCTB4MjQwMAkvKiAgIE5leHQgTmV4dCBSZWNlaXZlIERlc2NyaXB0b3IgQWRkcmVzcyAqLworI2RlZmluZSBDU1IzNwkJMHgyNTAwCS8qICAgTmV4dCBOZXh0IFJlY2VpdmUgRGVzY3JpcHRvciBBZGRyZXNzICovCisjZGVmaW5lIENTUjM4CQkweDI2MDAJLyogICBOZXh0IE5leHQgVHJhbnNtaXQgRGVzY3JpcHRvciBBZGRyZXNzICovCisjZGVmaW5lIENTUjM5CQkweDI3MDAJLyogICBOZXh0IE5leHQgVHJhbnNtaXQgRGVzY3JpcHRvciBBZGRyZXNzICovCisjZGVmaW5lIENTUjQwCQkweDI4MDAJLyogICBDdXJyZW50IFJlY2VpdmUgU3RhdHVzIGFuZCBCeXRlIENvdW50ICovCisjZGVmaW5lIENTUjQxCQkweDI5MDAJLyogICBDdXJyZW50IFJlY2VpdmUgU3RhdHVzIGFuZCBCeXRlIENvdW50ICovCisjZGVmaW5lIENTUjQyCQkweDJhMDAJLyogICBDdXJyZW50IFRyYW5zbWl0IFN0YXR1cyBhbmQgQnl0ZSBDb3VudCAqLworI2RlZmluZSBDU1I0MwkJMHgyYjAwCS8qICAgQ3VycmVudCBUcmFuc21pdCBTdGF0dXMgYW5kIEJ5dGUgQ291bnQgKi8KKyNkZWZpbmUgQ1NSNDQJCTB4MmMwMAkvKiAgIE5leHQgUmVjZWl2ZSBTdGF0dXMgYW5kIEJ5dGUgQ291bnQgKi8KKyNkZWZpbmUgQ1NSNDUJCTB4MmQwMAkvKiAgIE5leHQgUmVjZWl2ZSBTdGF0dXMgYW5kIEJ5dGUgQ291bnQgKi8KKyNkZWZpbmUgQ1NSNDYJCTB4MmUwMAkvKiAgIFBvbGwgVGltZSBDb3VudGVyICovCisjZGVmaW5lIENTUjQ3CQkweDJmMDAJLyogICBQb2xsaW5nIEludGVydmFsICovCisjZGVmaW5lIENTUjQ4CQkweDMwMDAJLyogICBUZW1wb3JhcnkgU3RvcmFnZSAqLworI2RlZmluZSBDU1I0OQkJMHgzMTAwCS8qICAgVGVtcG9yYXJ5IFN0b3JhZ2UgKi8KKyNkZWZpbmUgQ1NSNTAJCTB4MzIwMAkvKiAgIFRlbXBvcmFyeSBTdG9yYWdlICovCisjZGVmaW5lIENTUjUxCQkweDMzMDAJLyogICBUZW1wb3JhcnkgU3RvcmFnZSAqLworI2RlZmluZSBDU1I1MgkJMHgzNDAwCS8qICAgVGVtcG9yYXJ5IFN0b3JhZ2UgKi8KKyNkZWZpbmUgQ1NSNTMJCTB4MzUwMAkvKiAgIFRlbXBvcmFyeSBTdG9yYWdlICovCisjZGVmaW5lIENTUjU0CQkweDM2MDAJLyogICBUZW1wb3JhcnkgU3RvcmFnZSAqLworI2RlZmluZSBDU1I1NQkJMHgzNzAwCS8qICAgVGVtcG9yYXJ5IFN0b3JhZ2UgKi8KKyNkZWZpbmUgQ1NSNTYJCTB4MzgwMAkvKiAgIFRlbXBvcmFyeSBTdG9yYWdlICovCisjZGVmaW5lIENTUjU3CQkweDM5MDAJLyogICBUZW1wb3JhcnkgU3RvcmFnZSAqLworI2RlZmluZSBDU1I1OAkJMHgzYTAwCS8qICAgVGVtcG9yYXJ5IFN0b3JhZ2UgKi8KKyNkZWZpbmUgQ1NSNTkJCTB4M2IwMAkvKiAgIFRlbXBvcmFyeSBTdG9yYWdlICovCisjZGVmaW5lIENTUjYwCQkweDNjMDAJLyogICBQcmV2aW91cyBUcmFuc21pdCBEZXNjcmlwdG9yIEFkZHJlc3MgKi8KKyNkZWZpbmUgQ1NSNjEJCTB4M2QwMAkvKiAgIFByZXZpb3VzIFRyYW5zbWl0IERlc2NyaXB0b3IgQWRkcmVzcyAqLworI2RlZmluZSBDU1I2MgkJMHgzZTAwCS8qICAgUHJldmlvdXMgVHJhbnNtaXQgU3RhdHVzIGFuZCBCeXRlIENvdW50ICovCisjZGVmaW5lIENTUjYzCQkweDNmMDAJLyogICBQcmV2aW91cyBUcmFuc21pdCBTdGF0dXMgYW5kIEJ5dGUgQ291bnQgKi8KKyNkZWZpbmUgQ1NSNjQJCTB4NDAwMAkvKiAgIE5leHQgVHJhbnNtaXQgQnVmZmVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgQ1NSNjUJCTB4NDEwMAkvKiAgIE5leHQgVHJhbnNtaXQgQnVmZmVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgQ1NSNjYJCTB4NDIwMAkvKiAgIE5leHQgVHJhbnNtaXQgU3RhdHVzIGFuZCBCeXRlIENvdW50ICovCisjZGVmaW5lIENTUjY3CQkweDQzMDAJLyogICBOZXh0IFRyYW5zbWl0IFN0YXR1cyBhbmQgQnl0ZSBDb3VudCAqLworI2RlZmluZSBDU1I2OAkJMHg0NDAwCS8qICAgVHJhbnNtaXQgU3RhdHVzIFRlbXBvcmFyeSBTdG9yYWdlICovCisjZGVmaW5lIENTUjY5CQkweDQ1MDAJLyogICBUcmFuc21pdCBTdGF0dXMgVGVtcG9yYXJ5IFN0b3JhZ2UgKi8KKyNkZWZpbmUgQ1NSNzAJCTB4NDYwMAkvKiAgIFRlbXBvcmFyeSBTdG9yYWdlICovCisjZGVmaW5lIENTUjcxCQkweDQ3MDAJLyogICBUZW1wb3JhcnkgU3RvcmFnZSAqLworI2RlZmluZSBDU1I3MgkJMHg0ODAwCS8qICAgUmVjZWl2ZSBSaW5nIENvdW50ZXIgKi8KKyNkZWZpbmUgQ1NSNzQJCTB4NGEwMAkvKiAgIFRyYW5zbWl0IFJpbmcgQ291bnRlciAqLworI2RlZmluZSBDU1I3NgkJMHg0YzAwCS8qIC0gUmVjZWl2ZSBSaW5nIExlbmd0aCAqLworI2RlZmluZSBDU1I3OAkJMHg0ZTAwCS8qIC0gVHJhbnNtaXQgUmluZyBMZW5ndGggKi8KKyNkZWZpbmUgQ1NSODAJCTB4NTAwMAkvKiAtIEJ1cnN0IGFuZCBGSUZPIFRocmVzaG9sZCBDb250cm9sICovCisjZGVmaW5lIENTUjgyCQkweDUyMDAJLyogLSBCdXMgQWN0aXZpdHkgVGltZXIgKi8KKyNkZWZpbmUgQ1NSODQJCTB4NTQwMAkvKiAgIERNQSBBZGRyZXNzICovCisjZGVmaW5lIENTUjg1CQkweDU1MDAJLyogICBETUEgQWRkcmVzcyAqLworI2RlZmluZSBDU1I4NgkJMHg1NjAwCS8qICAgQnVmZmVyIEJ5dGUgQ291bnRlciAqLworI2RlZmluZSBDU1I4OAkJMHg1ODAwCS8qIC0gQ2hpcCBJRCAqLworI2RlZmluZSBDU1I4OQkJMHg1OTAwCS8qIC0gQ2hpcCBJRCAqLworI2RlZmluZSBDU1I5MgkJMHg1YzAwCS8qICAgUmluZyBMZW5ndGggQ29udmVyc2lvbiAqLworI2RlZmluZSBDU1I5NAkJMHg1ZTAwCS8qICAgVHJhbnNtaXQgVGltZSBEb21haW4gUmVmbGVjdG9tZXRyeSBDb3VudCAqLworI2RlZmluZSBDU1I5NgkJMHg2MDAwCS8qICAgQnVzIEludGVyZmFjZSBTY3JhdGNoIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgQ1NSOTcJCTB4NjEwMAkvKiAgIEJ1cyBJbnRlcmZhY2UgU2NyYXRjaCBSZWdpc3RlciAwICovCisjZGVmaW5lIENTUjk4CQkweDYyMDAJLyogICBCdXMgSW50ZXJmYWNlIFNjcmF0Y2ggUmVnaXN0ZXIgMSAqLworI2RlZmluZSBDU1I5OQkJMHg2MzAwCS8qICAgQnVzIEludGVyZmFjZSBTY3JhdGNoIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgQ1NSMTA0CQkweDY4MDAJLyogICBTV0FQICovCisjZGVmaW5lIENTUjEwNQkJMHg2OTAwCS8qICAgU1dBUCAqLworI2RlZmluZSBDU1IxMDgJCTB4NmMwMAkvKiAgIEJ1ZmZlciBNYW5hZ2VtZW50IFNjcmF0Y2ggKi8KKyNkZWZpbmUgQ1NSMTA5CQkweDZkMDAJLyogICBCdWZmZXIgTWFuYWdlbWVudCBTY3JhdGNoICovCisjZGVmaW5lIENTUjExMgkJMHg3MDAwCS8qIC0gTWlzc2VkIEZyYW1lIENvdW50ICovCisjZGVmaW5lIENTUjExNAkJMHg3MjAwCS8qIC0gUmVjZWl2ZSBDb2xsaXNpb24gQ291bnQgKi8KKyNkZWZpbmUgQ1NSMTI0CQkweDdjMDAJLyogLSBCdWZmZXIgTWFuYWdlbWVudCBVbml0IFRlc3QgKi8KKworCisgICAgLyoKKyAgICAgKglBbTc5Qzk2MCBJU0EgQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVycworICAgICAqCisgICAgICoJVGhlc2UgdmFsdWVzIGFyZSBhbHJlYWR5IHN3YXAoKWVkISEKKyAgICAgKi8KKworI2RlZmluZSBJU0FDU1IwCQkweDAwMDAJLyogTWFzdGVyIE1vZGUgUmVhZCBBY3RpdmUgKi8KKyNkZWZpbmUgSVNBQ1NSMQkJMHgwMTAwCS8qIE1hc3RlciBNb2RlIFdyaXRlIEFjdGl2ZSAqLworI2RlZmluZSBJU0FDU1IyCQkweDAyMDAJLyogTWlzY2VsbGFuZW91cyBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIElTQUNTUjQJCTB4MDQwMAkvKiBMRUQwIFN0YXR1cyAoTGluayBJbnRlZ3JpdHkpICovCisjZGVmaW5lIElTQUNTUjUJCTB4MDUwMAkvKiBMRUQxIFN0YXR1cyAqLworI2RlZmluZSBJU0FDU1I2CQkweDA2MDAJLyogTEVEMiBTdGF0dXMgKi8KKyNkZWZpbmUgSVNBQ1NSNwkJMHgwNzAwCS8qIExFRDMgU3RhdHVzICovCisKKworICAgIC8qCisgICAgICoJQml0IGRlZmluaXRpb25zIGZvciBDU1IwIChQQ25ldC1JU0EgQ29udHJvbGxlciBTdGF0dXMpCisgICAgICoKKyAgICAgKglUaGVzZSB2YWx1ZXMgYXJlIGFscmVhZHkgc3dhcCgpZWQhIQorICAgICAqLworCisjZGVmaW5lIEVSUgkJMHgwMDgwCS8qIEVycm9yICovCisjZGVmaW5lIEJBQkwJCTB4MDA0MAkvKiBCYWJibGU6IFRyYW5zbWl0dGVkIHRvbyBtYW55IGJpdHMgKi8KKyNkZWZpbmUgQ0VSUgkJMHgwMDIwCS8qIE5vIEhlYXJ0YmVhdCAoMTBCQVNFLVQpICovCisjZGVmaW5lIE1JU1MJCTB4MDAxMAkvKiBNaXNzZWQgRnJhbWUgKi8KKyNkZWZpbmUgTUVSUgkJMHgwMDA4CS8qIE1lbW9yeSBFcnJvciAqLworI2RlZmluZSBSSU5UCQkweDAwMDQJLyogUmVjZWl2ZSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgVElOVAkJMHgwMDAyCS8qIFRyYW5zbWl0IEludGVycnVwdCAqLworI2RlZmluZSBJRE9OCQkweDAwMDEJLyogSW5pdGlhbGl6YXRpb24gRG9uZSAqLworI2RlZmluZSBJTlRSCQkweDgwMDAJLyogSW50ZXJydXB0IEZsYWcgKi8KKyNkZWZpbmUgSU5FQQkJMHg0MDAwCS8qIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgUlhPTgkJMHgyMDAwCS8qIFJlY2VpdmUgT24gKi8KKyNkZWZpbmUgVFhPTgkJMHgxMDAwCS8qIFRyYW5zbWl0IE9uICovCisjZGVmaW5lIFRETUQJCTB4MDgwMAkvKiBUcmFuc21pdCBEZW1hbmQgKi8KKyNkZWZpbmUgU1RPUAkJMHgwNDAwCS8qIFN0b3AgKi8KKyNkZWZpbmUgU1RSVAkJMHgwMjAwCS8qIFN0YXJ0ICovCisjZGVmaW5lIElOSVQJCTB4MDEwMAkvKiBJbml0aWFsaXplICovCisKKworICAgIC8qCisgICAgICoJQml0IGRlZmluaXRpb25zIGZvciBDU1IzIChJbnRlcnJ1cHQgTWFza3MgYW5kIERlZmVycmFsIENvbnRyb2wpCisgICAgICoKKyAgICAgKglUaGVzZSB2YWx1ZXMgYXJlIGFscmVhZHkgc3dhcCgpZWQhIQorICAgICAqLworCisjZGVmaW5lIEJBQkxNCQkweDAwNDAJLyogQmFiYmxlIE1hc2sgKi8KKyNkZWZpbmUgTUlTU00JCTB4MDAxMAkvKiBNaXNzZWQgRnJhbWUgTWFzayAqLworI2RlZmluZSBNRVJSTQkJMHgwMDA4CS8qIE1lbW9yeSBFcnJvciBNYXNrICovCisjZGVmaW5lIFJJTlRNCQkweDAwMDQJLyogUmVjZWl2ZSBJbnRlcnJ1cHQgTWFzayAqLworI2RlZmluZSBUSU5UTQkJMHgwMDAyCS8qIFRyYW5zbWl0IEludGVycnVwdCBNYXNrICovCisjZGVmaW5lIElET05NCQkweDAwMDEJLyogSW5pdGlhbGl6YXRpb24gRG9uZSBNYXNrICovCisjZGVmaW5lIERYTVQyUEQJCTB4MTAwMAkvKiBEaXNhYmxlIFRyYW5zbWl0IFR3byBQYXJ0IERlZmVycmFsICovCisjZGVmaW5lIEVNQkEJCTB4MDgwMAkvKiBFbmFibGUgTW9kaWZpZWQgQmFjay1vZmYgQWxnb3JpdGhtICovCisKKworICAgIC8qCisgICAgICoJQml0IGRlZmluaXRpb25zIGZvciBDU1I0IChUZXN0IGFuZCBGZWF0dXJlcyBDb250cm9sKQorICAgICAqCisgICAgICoJVGhlc2UgdmFsdWVzIGFyZSBhbHJlYWR5IHN3YXAoKWVkISEKKyAgICAgKi8KKworI2RlZmluZSBFTlRTVAkJMHgwMDgwCS8qIEVuYWJsZSBUZXN0IE1vZGUgKi8KKyNkZWZpbmUgRE1BUExVUwkJMHgwMDQwCS8qIERpc2FibGUgQnVyc3QgVHJhbnNhY3Rpb24gQ291bnRlciAqLworI2RlZmluZSBUSU1FUgkJMHgwMDIwCS8qIFRpbWVyIEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBEUE9MTAkJMHgwMDEwCS8qIERpc2FibGUgVHJhbnNtaXQgUG9sbGluZyAqLworI2RlZmluZSBBUEFEX1hNVAkweDAwMDgJLyogQXV0byBQYWQgVHJhbnNtaXQgKi8KKyNkZWZpbmUgQVNUUlBfUkNWCTB4MDAwNAkvKiBBdXRvIFBhZCBTdHJpcHBpbmcgKi8KKyNkZWZpbmUgTUZDTwkJMHgwMDAyCS8qIE1pc3NlZCBGcmFtZSBDb3VudGVyIE92ZXJmbG93IEludGVycnVwdCAqLworI2RlZmluZSBNRkNPTQkJMHgwMDAxCS8qIE1pc3NlZCBGcmFtZSBDb3VudGVyIE92ZXJmbG93IE1hc2sgKi8KKyNkZWZpbmUgUkNWQ0NPCQkweDIwMDAJLyogUmVjZWl2ZSBDb2xsaXNpb24gQ291bnRlciBPdmVyZmxvdyBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgUkNWQ0NPTQkJMHgxMDAwCS8qIFJlY2VpdmUgQ29sbGlzaW9uIENvdW50ZXIgT3ZlcmZsb3cgTWFzayAqLworI2RlZmluZSBUWFNUUlQJCTB4MDgwMAkvKiBUcmFuc21pdCBTdGFydCBTdGF0dXMgKi8KKyNkZWZpbmUgVFhTVFJUTQkJMHgwNDAwCS8qIFRyYW5zbWl0IFN0YXJ0IE1hc2sgKi8KKyNkZWZpbmUgSkFCCQkweDAyMDAJLyogSmFiYmVyIEVycm9yICovCisjZGVmaW5lIEpBQk0JCTB4MDEwMAkvKiBKYWJiZXIgRXJyb3IgTWFzayAqLworCisKKyAgICAvKgorICAgICAqCUJpdCBkZWZpbml0aW9ucyBmb3IgQ1NSMTUgKE1vZGUgUmVnaXN0ZXIpCisgICAgICoKKyAgICAgKglUaGVzZSB2YWx1ZXMgYXJlIGFscmVhZHkgc3dhcCgpZWQhIQorICAgICAqLworCisjZGVmaW5lIFBST00JCTB4MDA4MAkvKiBQcm9taXNjdW91cyBNb2RlICovCisjZGVmaW5lIERSQ1ZCQwkJMHgwMDQwCS8qIERpc2FibGUgUmVjZWl2ZSBCcm9hZGNhc3QgKi8KKyNkZWZpbmUgRFJDVlBBCQkweDAwMjAJLyogRGlzYWJsZSBSZWNlaXZlIFBoeXNpY2FsIEFkZHJlc3MgKi8KKyNkZWZpbmUgRExOS1RTVAkJMHgwMDEwCS8qIERpc2FibGUgTGluayBTdGF0dXMgKi8KKyNkZWZpbmUgREFQQwkJMHgwMDA4CS8qIERpc2FibGUgQXV0b21hdGljIFBvbGFyaXR5IENvcnJlY3Rpb24gKi8KKyNkZWZpbmUgTUVOREVDTAkJMHgwMDA0CS8qIE1FTkRFQyBMb29wYmFjayBNb2RlICovCisjZGVmaW5lIExSVFRTRUwJCTB4MDAwMgkvKiBMb3cgUmVjZWl2ZSBUcmVzaG9sZC9UcmFuc21pdCBNb2RlIFNlbGVjdCAqLworI2RlZmluZSBQT1JUU0VMMQkweDAwMDEJLyogUG9ydCBTZWxlY3QgQml0cyAqLworI2RlZmluZSBQT1JUU0VMMgkweDgwMDAJLyogUG9ydCBTZWxlY3QgQml0cyAqLworI2RlZmluZSBJTlRMCQkweDQwMDAJLyogSW50ZXJuYWwgTG9vcGJhY2sgKi8KKyNkZWZpbmUgRFJUWQkJMHgyMDAwCS8qIERpc2FibGUgUmV0cnkgKi8KKyNkZWZpbmUgRkNPTEwJCTB4MTAwMAkvKiBGb3JjZSBDb2xsaXNpb24gKi8KKyNkZWZpbmUgRFhNVEZDUwkJMHgwODAwCS8qIERpc2FibGUgVHJhbnNtaXQgQ1JDICovCisjZGVmaW5lIExPT1AJCTB4MDQwMAkvKiBMb29wYmFjayBFbmFibGUgKi8KKyNkZWZpbmUgRFRYCQkweDAyMDAJLyogRGlzYWJsZSBUcmFuc21pdHRlciAqLworI2RlZmluZSBEUlgJCTB4MDEwMAkvKiBEaXNhYmxlIFJlY2VpdmVyICovCisKKworICAgIC8qCisgICAgICoJQml0IGRlZmluaXRpb25zIGZvciBJU0FDU1IyIChNaXNjZWxsYW5lb3VzIENvbmZpZ3VyYXRpb24pCisgICAgICoKKyAgICAgKglUaGVzZSB2YWx1ZXMgYXJlIGFscmVhZHkgc3dhcCgpZWQhIQorICAgICAqLworCisjZGVmaW5lIEFTRUwJCTB4MDIwMAkvKiBNZWRpYSBJbnRlcmZhY2UgUG9ydCBBdXRvIFNlbGVjdCAqLworCisKKyAgICAvKgorICAgICAqCUJpdCBkZWZpbml0aW9ucyBmb3IgSVNBQ1NSNS03IChMRUQxLTMgU3RhdHVzKQorICAgICAqCisgICAgICoJVGhlc2UgdmFsdWVzIGFyZSBhbHJlYWR5IHN3YXAoKWVkISEKKyAgICAgKi8KKworI2RlZmluZSBMRURPVVQJCTB4MDA4MAkvKiBDdXJyZW50IExFRCBTdGF0dXMgKi8KKyNkZWZpbmUgUFNFCQkweDgwMDAJLyogUHVsc2UgU3RyZXRjaGVyIEVuYWJsZSAqLworI2RlZmluZSBYTVRFCQkweDEwMDAJLyogRW5hYmxlIFRyYW5zbWl0IFN0YXR1cyBTaWduYWwgKi8KKyNkZWZpbmUgUlZQT0xFCQkweDA4MDAJLyogRW5hYmxlIFJlY2VpdmUgUG9sYXJpdHkgU2lnbmFsICovCisjZGVmaW5lIFJDVkUJCTB4MDQwMAkvKiBFbmFibGUgUmVjZWl2ZSBTdGF0dXMgU2lnbmFsICovCisjZGVmaW5lIEpBQkUJCTB4MDIwMAkvKiBFbmFibGUgSmFiYmVyIFNpZ25hbCAqLworI2RlZmluZSBDT0xFCQkweDAxMDAJLyogRW5hYmxlIENvbGxpc2lvbiBTaWduYWwgKi8KKworCisgICAgLyoKKyAgICAgKglSZWNlaXZlIERlc2NyaXB0b3IgUmluZyBFbnRyeQorICAgICAqLworCitzdHJ1Y3QgUkRSRSB7CisgICAgdm9sYXRpbGUgdV9zaG9ydCBSTUQwOwkvKiBMQURSWzE1OjBdICovCisgICAgdm9sYXRpbGUgdV9zaG9ydCBSTUQxOwkvKiBIQURSWzIzOjE2XSB8IFJlY2VpdmUgRmxhZ3MgKi8KKyAgICB2b2xhdGlsZSB1X3Nob3J0IFJNRDI7CS8qIEJ1ZmZlciBCeXRlIENvdW50ICh0d28ncyBjb21wbGVtZW50KSAqLworICAgIHZvbGF0aWxlIHVfc2hvcnQgUk1EMzsJLyogTWVzc2FnZSBCeXRlIENvdW50ICovCit9OworCisKKyAgICAvKgorICAgICAqCVRyYW5zbWl0IERlc2NyaXB0b3IgUmluZyBFbnRyeQorICAgICAqLworCitzdHJ1Y3QgVERSRSB7CisgICAgdm9sYXRpbGUgdV9zaG9ydCBUTUQwOwkvKiBMQURSWzE1OjBdICovCisgICAgdm9sYXRpbGUgdV9zaG9ydCBUTUQxOwkvKiBIQURSWzIzOjE2XSB8IFRyYW5zbWl0IEZsYWdzICovCisgICAgdm9sYXRpbGUgdV9zaG9ydCBUTUQyOwkvKiBCdWZmZXIgQnl0ZSBDb3VudCAodHdvJ3MgY29tcGxlbWVudCkgKi8KKyAgICB2b2xhdGlsZSB1X3Nob3J0IFRNRDM7CS8qIEVycm9yIEZsYWdzICovCit9OworCisKKyAgICAvKgorICAgICAqCVJlY2VpdmUgRmxhZ3MKKyAgICAgKi8KKworI2RlZmluZSBSRl9PV04JCTB4MDA4MAkvKiBQQ25ldC1JU0EgY29udHJvbGxlciBvd25zIHRoZSBkZXNjcmlwdG9yICovCisjZGVmaW5lIFJGX0VSUgkJMHgwMDQwCS8qIEVycm9yICovCisjZGVmaW5lIFJGX0ZSQU0JCTB4MDAyMAkvKiBGcmFtaW5nIEVycm9yICovCisjZGVmaW5lIFJGX09GTE8JCTB4MDAxMAkvKiBPdmVyZmxvdyBFcnJvciAqLworI2RlZmluZSBSRl9DUkMJCTB4MDAwOAkvKiBDUkMgRXJyb3IgKi8KKyNkZWZpbmUgUkZfQlVGRgkJMHgwMDA0CS8qIEJ1ZmZlciBFcnJvciAqLworI2RlZmluZSBSRl9TVFAJCTB4MDAwMgkvKiBTdGFydCBvZiBQYWNrZXQgKi8KKyNkZWZpbmUgUkZfRU5QCQkweDAwMDEJLyogRW5kIG9mIFBhY2tldCAqLworCisKKyAgICAvKgorICAgICAqCVRyYW5zbWl0IEZsYWdzCisgICAgICovCisKKyNkZWZpbmUgVEZfT1dOCQkweDAwODAJLyogUENuZXQtSVNBIGNvbnRyb2xsZXIgb3ducyB0aGUgZGVzY3JpcHRvciAqLworI2RlZmluZSBURl9FUlIJCTB4MDA0MAkvKiBFcnJvciAqLworI2RlZmluZSBURl9BRERfRkNTCTB4MDAyMAkvKiBDb250cm9scyBGQ1MgR2VuZXJhdGlvbiAqLworI2RlZmluZSBURl9NT1JFCQkweDAwMTAJLyogTW9yZSB0aGFuIG9uZSByZXRyeSBuZWVkZWQgKi8KKyNkZWZpbmUgVEZfT05FCQkweDAwMDgJLyogT25lIHJldHJ5IG5lZWRlZCAqLworI2RlZmluZSBURl9ERUYJCTB4MDAwNAkvKiBEZWZlcnJlZCAqLworI2RlZmluZSBURl9TVFAJCTB4MDAwMgkvKiBTdGFydCBvZiBQYWNrZXQgKi8KKyNkZWZpbmUgVEZfRU5QCQkweDAwMDEJLyogRW5kIG9mIFBhY2tldCAqLworCisKKyAgICAvKgorICAgICAqCUVycm9yIEZsYWdzCisgICAgICovCisKKyNkZWZpbmUgRUZfQlVGRgkJMHgwMDgwCS8qIEJ1ZmZlciBFcnJvciAqLworI2RlZmluZSBFRl9VRkxPCQkweDAwNDAJLyogVW5kZXJmbG93IEVycm9yICovCisjZGVmaW5lIEVGX0xDT0wJCTB4MDAxMAkvKiBMYXRlIENvbGxpc2lvbiAqLworI2RlZmluZSBFRl9MQ0FSCQkweDAwMDgJLyogTG9zcyBvZiBDYXJyaWVyICovCisjZGVmaW5lIEVGX1JUUlkJCTB4MDAwNAkvKiBSZXRyeSBFcnJvciAqLworI2RlZmluZSBFRl9URFIJCTB4ZmYwMwkvKiBUaW1lIERvbWFpbiBSZWZsZWN0b21ldHJ5ICovCisKKworCisgICAgLyoKKyAgICAgKglNQzY4MjMwIFBhcmFsbGVsIEludGVyZmFjZS9UaW1lcgorICAgICAqLworCitzdHJ1Y3QgTUM2ODIzMCB7CisgICAgdm9sYXRpbGUgdV9jaGFyIFBHQ1I7CS8qIFBvcnQgR2VuZXJhbCBDb250cm9sIFJlZ2lzdGVyICovCisgICAgdV9jaGFyIFBhZDFbMV07CisgICAgdm9sYXRpbGUgdV9jaGFyIFBTUlI7CS8qIFBvcnQgU2VydmljZSBSZXF1ZXN0IFJlZ2lzdGVyICovCisgICAgdV9jaGFyIFBhZDJbMV07CisgICAgdm9sYXRpbGUgdV9jaGFyIFBBRERSOwkvKiBQb3J0IEEgRGF0YSBEaXJlY3Rpb24gUmVnaXN0ZXIgKi8KKyAgICB1X2NoYXIgUGFkM1sxXTsKKyAgICB2b2xhdGlsZSB1X2NoYXIgUEJERFI7CS8qIFBvcnQgQiBEYXRhIERpcmVjdGlvbiBSZWdpc3RlciAqLworICAgIHVfY2hhciBQYWQ0WzFdOworICAgIHZvbGF0aWxlIHVfY2hhciBQQ0REUjsJLyogUG9ydCBDIERhdGEgRGlyZWN0aW9uIFJlZ2lzdGVyICovCisgICAgdV9jaGFyIFBhZDVbMV07CisgICAgdm9sYXRpbGUgdV9jaGFyIFBJVlI7CS8qIFBvcnQgSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAqLworICAgIHVfY2hhciBQYWQ2WzFdOworICAgIHZvbGF0aWxlIHVfY2hhciBQQUNSOwkvKiBQb3J0IEEgQ29udHJvbCBSZWdpc3RlciAqLworICAgIHVfY2hhciBQYWQ3WzFdOworICAgIHZvbGF0aWxlIHVfY2hhciBQQkNSOwkvKiBQb3J0IEIgQ29udHJvbCBSZWdpc3RlciAqLworICAgIHVfY2hhciBQYWQ4WzFdOworICAgIHZvbGF0aWxlIHVfY2hhciBQQURSOwkvKiBQb3J0IEEgRGF0YSBSZWdpc3RlciAqLworICAgIHVfY2hhciBQYWQ5WzFdOworICAgIHZvbGF0aWxlIHVfY2hhciBQQkRSOwkvKiBQb3J0IEIgRGF0YSBSZWdpc3RlciAqLworICAgIHVfY2hhciBQYWQxMFsxXTsKKyAgICB2b2xhdGlsZSB1X2NoYXIgUEFBUjsJLyogUG9ydCBBIEFsdGVybmF0ZSBSZWdpc3RlciAqLworICAgIHVfY2hhciBQYWQxMVsxXTsKKyAgICB2b2xhdGlsZSB1X2NoYXIgUEJBUjsJLyogUG9ydCBCIEFsdGVybmF0ZSBSZWdpc3RlciAqLworICAgIHVfY2hhciBQYWQxMlsxXTsKKyAgICB2b2xhdGlsZSB1X2NoYXIgUENEUjsJLyogUG9ydCBDIERhdGEgUmVnaXN0ZXIgKi8KKyAgICB1X2NoYXIgUGFkMTNbMV07CisgICAgdm9sYXRpbGUgdV9jaGFyIFBTUjsJLyogUG9ydCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyAgICB1X2NoYXIgUGFkMTRbNV07CisgICAgdm9sYXRpbGUgdV9jaGFyIFRDUjsJLyogVGltZXIgQ29udHJvbCBSZWdpc3RlciAqLworICAgIHVfY2hhciBQYWQxNVsxXTsKKyAgICB2b2xhdGlsZSB1X2NoYXIgVElWUjsJLyogVGltZXIgSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAqLworICAgIHVfY2hhciBQYWQxNlszXTsKKyAgICB2b2xhdGlsZSB1X2NoYXIgQ1BSSDsJLyogQ291bnRlciBQcmVsb2FkIFJlZ2lzdGVyIChIaWdoKSAqLworICAgIHVfY2hhciBQYWQxN1sxXTsKKyAgICB2b2xhdGlsZSB1X2NoYXIgQ1BSTTsJLyogQ291bnRlciBQcmVsb2FkIFJlZ2lzdGVyIChNaWQpICovCisgICAgdV9jaGFyIFBhZDE4WzFdOworICAgIHZvbGF0aWxlIHVfY2hhciBDUFJMOwkvKiBDb3VudGVyIFByZWxvYWQgUmVnaXN0ZXIgKExvdykgKi8KKyAgICB1X2NoYXIgUGFkMTlbM107CisgICAgdm9sYXRpbGUgdV9jaGFyIENOVFJIOwkvKiBDb3VudCBSZWdpc3RlciAoSGlnaCkgKi8KKyAgICB1X2NoYXIgUGFkMjBbMV07CisgICAgdm9sYXRpbGUgdV9jaGFyIENOVFJNOwkvKiBDb3VudCBSZWdpc3RlciAoTWlkKSAqLworICAgIHVfY2hhciBQYWQyMVsxXTsKKyAgICB2b2xhdGlsZSB1X2NoYXIgQ05UUkw7CS8qIENvdW50IFJlZ2lzdGVyIChMb3cpICovCisgICAgdV9jaGFyIFBhZDIyWzFdOworICAgIHZvbGF0aWxlIHVfY2hhciBUU1I7CS8qIFRpbWVyIFN0YXR1cyBSZWdpc3RlciAqLworICAgIHVfY2hhciBQYWQyM1sxMV07Cit9OworCisKKyAgICAvKgorICAgICAqCUFyaWFkbmUgRXhwYW5zaW9uIEJvYXJkIFN0cnVjdHVyZQorICAgICAqLworCisjZGVmaW5lIEFSSUFETkVfTEFOQ0UJCTB4MzYwCisKKyNkZWZpbmUgQVJJQURORV9QSVQJCTB4MTAwMAorCisjZGVmaW5lIEFSSUFETkVfQk9PVFBST00JMHg0MDAwCS8qIEkgZ3Vlc3MgaXQncyBoZXJlIDotKSAqLworI2RlZmluZSBBUklBRE5FX0JPT1RQUk9NX1NJWkUJMHg0MDAwCisKKyNkZWZpbmUgQVJJQURORV9SQU0JCTB4ODAwMAkvKiBBbHdheXMgYWNjZXNzIFdPUkRzISEgKi8KKyNkZWZpbmUgQVJJQURORV9SQU1fU0laRQkweDgwMDAKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL0tjb25maWcgYi9kcml2ZXJzL25ldC9hcm0vS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzAzNjRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXJtL0tjb25maWcKQEAgLTAsMCArMSw0NiBAQAorIworIyBBY29ybiBOZXR3b3JrIGRldmljZSBjb25maWd1cmF0aW9uCisjICBUaGVzZSBhcmUgZm9yIEFjb3JuJ3MgRXhwYW5zaW9uIGNhcmQgbmV0d29yayBpbnRlcmZhY2VzCisjCitjb25maWcgQVJNX0FNNzlDOTYxQQorCWJvb2wgIkFSTSBFQlNBMTEwIEFNNzlDOTYxQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIEFSTSAmJiBBUkNIX0VCU0ExMTAKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBJZiB5b3Ugd2lzaCB0byBjb21waWxlIGEga2VybmVsIGZvciB0aGUgRUJTQS0xMTAsIHRoZW4geW91IHNob3VsZAorCSAgYWx3YXlzIGFuc3dlciBZIHRvIHRoaXMuCisKK2NvbmZpZyBBUk1fRVRIRVIxCisJdHJpc3RhdGUgIkFjb3JuIEV0aGVyMSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIEFSTSAmJiBBUkNIX0FDT1JOCisJaGVscAorCSAgSWYgeW91IGhhdmUgYW4gQWNvcm4gc3lzdGVtIHdpdGggb25lIG9mIHRoZXNlIChBS0EyNSkgbmV0d29yayBjYXJkcywKKwkgIHlvdSBzaG91bGQgc2F5IFkgdG8gdGhpcyBvcHRpb24gaWYgeW91IHdpc2ggdG8gdXNlIGl0IHdpdGggTGludXguCisKK2NvbmZpZyBBUk1fRVRIRVIzCisJdHJpc3RhdGUgIkFjb3JuL0FOVCBFdGhlcjMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBBUk0gJiYgQVJDSF9BQ09STgorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGFuIEFjb3JuIHN5c3RlbSB3aXRoIG9uZSBvZiB0aGVzZSBuZXR3b3JrIGNhcmRzLCB5b3UKKwkgIHNob3VsZCBzYXkgWSB0byB0aGlzIG9wdGlvbiBpZiB5b3Ugd2lzaCB0byB1c2UgaXQgd2l0aCBMaW51eC4KKworY29uZmlnIEFSTV9FVEhFUkgKKwl0cmlzdGF0ZSAiSS1jdWJlZCBFdGhlckgvQU5UIEV0aGVyTSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIEFSTSAmJiBBUkNIX0FDT1JOCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgSWYgeW91IGhhdmUgYW4gQWNvcm4gc3lzdGVtIHdpdGggb25lIG9mIHRoZXNlIG5ldHdvcmsgY2FyZHMsIHlvdQorCSAgc2hvdWxkIHNheSBZIHRvIHRoaXMgb3B0aW9uIGlmIHlvdSB3aXNoIHRvIHVzZSBpdCB3aXRoIExpbnV4LgorCitjb25maWcgQVJNX0VUSEVSMDAKKwl0cmlzdGF0ZSAiQWx0ZXJhIEV0aGVyMDAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiBBUk0gJiYgQVJDSF9DQU1FTE9UCisJaGVscAorCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciBBbHRlcmEncyBldGhlcjAwIGV0aGVybmV0IG1hYyBJUCBjb3JlLiBTYXkKKwkgIFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGlzIGludG8gdGhlIGtlcm5lbC4gSXQKKwkgIGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlIChzYXkgTSBoZXJlKSB0aGF0IGNhbiBiZSBpbnNlcnRlZC8KKwkgIHJlbW92ZWQgZnJvbSB0aGUga2VybmVsIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIFBMRCBpcyBjb25maWd1cmVkLgorCSAgSWYgdGhpcyBkcml2ZXIgaXMgcnVubmluZyBvbiBhbiBlcHhhMTAgZGV2ZWxvcG1lbnQgYm9hcmQgdGhlbiBpdAorCSAgd2lsbCBnZW5lcmF0ZSBhIHN1aXRhYmxlIGh3IGFkZHJlc3MgYmFzZWQgb24gdGhlIGJvYXJkIHNlcmlhbAorCSAgbnVtYmVyIChNVEQgc3VwcG9ydCBpcyByZXF1aXJlZCBmb3IgdGhpcykuIE90aGVyd2lzZSB5b3Ugd2lsbAorCSAgbmVlZCB0byBzZXQgYSBzdWl0YWJsZSBodyBhZGRyZXNzIHVzaW5nIGlmY29uZmlnLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvYXJtL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZDcwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcm0vTWFrZWZpbGUKQEAgLTAsMCArMSwxMCBAQAorIyBGaWxlOiBkcml2ZXJzL25ldC9hcm0vTWFrZWZpbGUKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBBUk0gbmV0d29yayBkZXZpY2UgZHJpdmVycworIworCitvYmotJChDT05GSUdfQVJNX0FNNzlDOTYxQSkJKz0gYW03OWM5NjFhLm8KK29iai0kKENPTkZJR19BUk1fRVRIRVIwMCkJKz0gZXRoZXIwMC5vCitvYmotJChDT05GSUdfQVJNX0VUSEVSSCkJKz0gZXRoZXJoLm8KK29iai0kKENPTkZJR19BUk1fRVRIRVIzKQkrPSBldGhlcjMubworb2JqLSQoQ09ORklHX0FSTV9FVEhFUjEpCSs9IGV0aGVyMS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vYW03OWM5NjFhLmMgYi9kcml2ZXJzL25ldC9hcm0vYW03OWM5NjFhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI2NTllMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FybS9hbTc5Yzk2MWEuYwpAQCAtMCwwICsxLDc1MCBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL25ldC9hbTc5Yzk2MS5jCisgKgorICogIGJ5IFJ1c3NlbGwgS2luZyA8cm1rQGFybS5saW51eC5vcmcudWs+IDE5OTUtMjAwMS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIERlcml2ZWQgZnJvbSB2YXJpb3VzIHRoaW5ncyBpbmNsdWRpbmcgc2tlbGV0b24uYworICoKKyAqIFRoaXMgaXMgYSBzcGVjaWFsIGRyaXZlciBmb3IgdGhlIGFtNzljOTYxQSBMYW5jZSBjaGlwIHVzZWQgaW4gdGhlCisgKiBJbnRlbCAoZm9ybWFsbHkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycCkgRUJTQTExMCBwbGF0Zm9ybS4gIFBsZWFzZQorICogbm90ZSB0aGF0IHRoaXMgY2FuIG5vdCBiZSBidWlsdCBhcyBhIG1vZHVsZSAoaXQgZG9lc24ndCBtYWtlIHNlbnNlKS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisjZGVmaW5lIFRYX0JVRkZFUlMgMTUKKyNkZWZpbmUgUlhfQlVGRkVSUyAyNQorCisjaW5jbHVkZSAiYW03OWM5NjFhLmgiCisKK3N0YXRpYyBpcnFyZXR1cm5fdAorYW03OWM5NjFfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBuZXRfZGVidWcgPSBORVRfREVCVUc7CisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9CisJImFtNzljOTYxIGV0aGVybmV0IGRyaXZlciAoQykgMTk5NS0yMDAxIFJ1c3NlbGwgS2luZyB2MC4wNFxuIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBfX2FybV9fCitzdGF0aWMgdm9pZCB3cml0ZV9ycmVnKHVfbG9uZyBiYXNlLCB1X2ludCByZWcsIHVfaW50IHZhbCkKK3sKKwlfX2FzbV9fKAorCSJzdHIlP2gJJTEsIFslMl0JQCBORVRfUkFQXG5cdCIKKwkic3RyJT9oCSUwLCBbJTIsICMtNF0JQCBORVRfUkRQIgorCToKKwk6ICJyIiAodmFsKSwgInIiIChyZWcpLCAiciIgKElTQUlPX0JBU0UgKyAweDA0NjQpKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCByZWFkX3JyZWcodV9sb25nIGJhc2VfYWRkciwgdV9pbnQgcmVnKQoreworCXVuc2lnbmVkIHNob3J0IHY7CisJX19hc21fXygKKwkic3RyJT9oCSUxLCBbJTJdCUAgTkVUX1JBUFxuXHQiCisJImxkciU/aAklMCwgWyUyLCAjLTRdCUAgTkVUX1JEUCIKKwk6ICI9ciIgKHYpCisJOiAiciIgKHJlZyksICJyIiAoSVNBSU9fQkFTRSArIDB4MDQ2NCkpOworCXJldHVybiB2OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfaXJlZyh1X2xvbmcgYmFzZSwgdV9pbnQgcmVnLCB1X2ludCB2YWwpCit7CisJX19hc21fXygKKwkic3RyJT9oCSUxLCBbJTJdCUAgTkVUX1JBUFxuXHQiCisJInN0ciU/aAklMCwgWyUyLCAjOF0JQCBORVRfSURQIgorCToKKwk6ICJyIiAodmFsKSwgInIiIChyZWcpLCAiciIgKElTQUlPX0JBU0UgKyAweDA0NjQpKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCByZWFkX2lyZWcodV9sb25nIGJhc2VfYWRkciwgdV9pbnQgcmVnKQoreworCXVfc2hvcnQgdjsKKwlfX2FzbV9fKAorCSJzdHIlP2gJJTEsIFslMl0JQCBOQVRfUkFQXG5cdCIKKwkic3RyJT9oCSUwLCBbJTIsICM4XQlAIE5FVF9JRFBcblx0IgorCTogIj1yIiAodikKKwk6ICJyIiAocmVnKSwgInIiIChJU0FJT19CQVNFICsgMHgwNDY0KSk7CisJcmV0dXJuIHY7Cit9CisKKyNkZWZpbmUgYW1fd3JpdGV3b3JkKGRldixvZmYsdmFsKSBfX3Jhd193cml0ZXcodmFsLCBJU0FNRU1fQkFTRSArICgob2ZmKSA8PCAxKSkKKyNkZWZpbmUgYW1fcmVhZHdvcmQoZGV2LG9mZikgICAgICBfX3Jhd19yZWFkdyhJU0FNRU1fQkFTRSArICgob2ZmKSA8PCAxKSkKKworc3RhdGljIGlubGluZSB2b2lkCithbV93cml0ZWJ1ZmZlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2ludCBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwlvZmZzZXQgPSBJU0FNRU1fQkFTRSArIChvZmZzZXQgPDwgMSk7CisJbGVuZ3RoID0gKGxlbmd0aCArIDEpICYgfjE7CisJaWYgKChpbnQpYnVmICYgMikgeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3RyJT9oCSUyLCBbJTBdLCAjNCIKKwkJIDogIj0mciIgKG9mZnNldCkgOiAiMCIgKG9mZnNldCksICJyIiAoYnVmWzBdIHwgKGJ1ZlsxXSA8PCA4KSkpOworCQlidWYgKz0gMjsKKwkJbGVuZ3RoIC09IDI7CisJfQorCXdoaWxlIChsZW5ndGggPiA4KSB7CisJCXVuc2lnbmVkIGludCB0bXAsIHRtcDI7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkJImxkbSU/aWEJJTEhLCB7JTIsICUzfVxuXHQiCisJCQkic3RyJT9oCSUyLCBbJTBdLCAjNFxuXHQiCisJCQkibW92JT8JJTIsICUyLCBsc3IgIzE2XG5cdCIKKwkJCSJzdHIlP2gJJTIsIFslMF0sICM0XG5cdCIKKwkJCSJzdHIlP2gJJTMsIFslMF0sICM0XG5cdCIKKwkJCSJtb3YlPwklMywgJTMsIGxzciAjMTZcblx0IgorCQkJInN0ciU/aAklMywgWyUwXSwgIzQiCisJCTogIj0mciIgKG9mZnNldCksICI9JnIiIChidWYpLCAiPXIiICh0bXApLCAiPXIiICh0bXAyKQorCQk6ICIwIiAob2Zmc2V0KSwgIjEiIChidWYpKTsKKwkJbGVuZ3RoIC09IDg7CisJfQorCXdoaWxlIChsZW5ndGggPiAwKSB7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKCJzdHIlP2gJJTIsIFslMF0sICM0IgorCQkgOiAiPSZyIiAob2Zmc2V0KSA6ICIwIiAob2Zmc2V0KSwgInIiIChidWZbMF0gfCAoYnVmWzFdIDw8IDgpKSk7CisJCWJ1ZiArPSAyOworCQlsZW5ndGggLT0gMjsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYW1fcmVhZGJ1ZmZlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2ludCBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwlvZmZzZXQgPSBJU0FNRU1fQkFTRSArIChvZmZzZXQgPDwgMSk7CisJbGVuZ3RoID0gKGxlbmd0aCArIDEpICYgfjE7CisJaWYgKChpbnQpYnVmICYgMikgeworCQl1bnNpZ25lZCBpbnQgdG1wOworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJCSJsZHIlP2gJJTIsIFslMF0sICM0XG5cdCIKKwkJCSJzdHIlP2IJJTIsIFslMV0sICMxXG5cdCIKKwkJCSJtb3YlPwklMiwgJTIsIGxzciAjOFxuXHQiCisJCQkic3RyJT9iCSUyLCBbJTFdLCAjMSIKKwkJOiAiPSZyIiAob2Zmc2V0KSwgIj0mciIgKGJ1ZiksICI9ciIgKHRtcCk6ICIwIiAob2Zmc2V0KSwgIjEiIChidWYpKTsKKwkJbGVuZ3RoIC09IDI7CisJfQorCXdoaWxlIChsZW5ndGggPiA4KSB7CisJCXVuc2lnbmVkIGludCB0bXAsIHRtcDIsIHRtcDM7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkJImxkciU/aAklMiwgWyUwXSwgIzRcblx0IgorCQkJImxkciU/aAklMywgWyUwXSwgIzRcblx0IgorCQkJIm9yciU/CSUyLCAlMiwgJTMsIGxzbCAjMTZcblx0IgorCQkJImxkciU/aAklMywgWyUwXSwgIzRcblx0IgorCQkJImxkciU/aAklNCwgWyUwXSwgIzRcblx0IgorCQkJIm9yciU/CSUzLCAlMywgJTQsIGxzbCAjMTZcblx0IgorCQkJInN0bSU/aWEJJTEhLCB7JTIsICUzfSIKKwkJOiAiPSZyIiAob2Zmc2V0KSwgIj0mciIgKGJ1ZiksICI9ciIgKHRtcCksICI9ciIgKHRtcDIpLCAiPXIiICh0bXAzKQorCQk6ICIwIiAob2Zmc2V0KSwgIjEiIChidWYpKTsKKwkJbGVuZ3RoIC09IDg7CisJfQorCXdoaWxlIChsZW5ndGggPiAwKSB7CisJCXVuc2lnbmVkIGludCB0bXA7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkJImxkciU/aAklMiwgWyUwXSwgIzRcblx0IgorCQkJInN0ciU/YgklMiwgWyUxXSwgIzFcblx0IgorCQkJIm1vdiU/CSUyLCAlMiwgbHNyICM4XG5cdCIKKwkJCSJzdHIlP2IJJTIsIFslMV0sICMxIgorCQk6ICI9JnIiIChvZmZzZXQpLCAiPSZyIiAoYnVmKSwgIj1yIiAodG1wKSA6ICIwIiAob2Zmc2V0KSwgIjEiIChidWYpKTsKKwkJbGVuZ3RoIC09IDI7CisJfQorfQorI2Vsc2UKKyNlcnJvciBOb3QgY29tcGF0aWJsZQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK2FtNzljOTYxX3JhbXRlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBjaGFyICpidWZmZXIgPSBrbWFsbG9jICg2NTUzNiwgR0ZQX0tFUk5FTCk7CisJaW50IGksIGVycm9yID0gMCwgZXJyb3Jjb3VudCA9IDA7CisKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIDA7CisJbWVtc2V0IChidWZmZXIsIHZhbCwgNjU1MzYpOworCWFtX3dyaXRlYnVmZmVyKGRldiwgMCwgYnVmZmVyLCA2NTUzNik7CisJbWVtc2V0IChidWZmZXIsIHZhbCBeIDI1NSwgNjU1MzYpOworCWFtX3JlYWRidWZmZXIoZGV2LCAwLCBidWZmZXIsIDY1NTM2KTsKKwlmb3IgKGkgPSAwOyBpIDwgNjU1MzY7IGkrKykgeworCQlpZiAoYnVmZmVyW2ldICE9IHZhbCAmJiAhZXJyb3IpIHsKKwkJCXByaW50ayAoIiVzOiBidWZmZXIgZXJyb3IgKCUwMlggJTAyWCkgJTA1WCAtICIsIGRldi0+bmFtZSwgdmFsLCBidWZmZXJbaV0sIGkpOworCQkJZXJyb3IgPSAxOworCQkJZXJyb3Jjb3VudCArKzsKKwkJfSBlbHNlIGlmIChlcnJvciAmJiBidWZmZXJbaV0gPT0gdmFsKSB7CisJCQlwcmludGsgKCIlMDVYXG4iLCBpKTsKKwkJCWVycm9yID0gMDsKKwkJfQorCX0KKwlpZiAoZXJyb3IpCisJCXByaW50ayAoIjEwMDAwXG4iKTsKKwlrZnJlZSAoYnVmZmVyKTsKKwlyZXR1cm4gZXJyb3Jjb3VudDsKK30KKworc3RhdGljIHZvaWQKK2FtNzljOTYxX2luaXRfZm9yX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciAqcDsKKwl1X2ludCBoZHJfYWRkciwgZmlyc3RfZnJlZV9hZGRyOworCWludCBpOworCisJLyoKKwkgKiBTdG9wIHRoZSBjaGlwLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKHByaXYtPmNoaXBfbG9jaywgZmxhZ3MpOworCXdyaXRlX3JyZWcgKGRldi0+YmFzZV9hZGRyLCBDU1IwLCBDU1IwX0JBQkx8Q1NSMF9DRVJSfENTUjBfTUlTU3xDU1IwX01FUlJ8Q1NSMF9USU5UfENTUjBfUklOVHxDU1IwX1NUT1ApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocHJpdi0+Y2hpcF9sb2NrLCBmbGFncyk7CisKKwl3cml0ZV9pcmVnIChkZXYtPmJhc2VfYWRkciwgNSwgMHgwMGEwKTsgLyogUmVjZWl2ZSBhZGRyZXNzIExFRCAqLworCXdyaXRlX2lyZWcgKGRldi0+YmFzZV9hZGRyLCA2LCAweDAwODEpOyAvKiBDb2xsaXNpb24gTEVEICovCisJd3JpdGVfaXJlZyAoZGV2LT5iYXNlX2FkZHIsIDcsIDB4MDA5MCk7IC8qIFhNSVQgTEVEICovCisJd3JpdGVfaXJlZyAoZGV2LT5iYXNlX2FkZHIsIDIsIDB4MDAwMCk7IC8qIE1PREUgcmVnaXN0ZXIgc2VsZWN0cyBtZWRpYSAqLworCisJZm9yIChpID0gTEFEUkw7IGkgPD0gTEFEUkg7IGkrKykKKwkJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIGksIDApOworCisJZm9yIChpID0gUEFEUkwsIHAgPSBkZXYtPmRldl9hZGRyOyBpIDw9IFBBRFJIOyBpKyssIHAgKz0gMikKKwkJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIGksIHBbMF0gfCAocFsxXSA8PCA4KSk7CisKKwlpID0gTU9ERV9QT1JUXzEwQlQ7CisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJaSB8PSBNT0RFX1BST01JU0M7CisKKwl3cml0ZV9ycmVnIChkZXYtPmJhc2VfYWRkciwgTU9ERSwgaSk7CisJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIFBPTExJTlQsIDApOworCXdyaXRlX3JyZWcgKGRldi0+YmFzZV9hZGRyLCBTSVpFUlhSLCAtUlhfQlVGRkVSUyk7CisJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIFNJWkVUWFIsIC1UWF9CVUZGRVJTKTsKKworCWZpcnN0X2ZyZWVfYWRkciA9IFJYX0JVRkZFUlMgKiA4ICsgVFhfQlVGRkVSUyAqIDggKyAxNjsKKwloZHJfYWRkciA9IDA7CisKKwlwcml2LT5yeGhlYWQgPSAwOworCXByaXYtPnJ4dGFpbCA9IDA7CisJcHJpdi0+cnhoZHIgPSBoZHJfYWRkcjsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9CVUZGRVJTOyBpKyspIHsKKwkJcHJpdi0+cnhidWZmZXJbaV0gPSBmaXJzdF9mcmVlX2FkZHI7CisJCWFtX3dyaXRld29yZCAoZGV2LCBoZHJfYWRkciwgZmlyc3RfZnJlZV9hZGRyKTsKKwkJYW1fd3JpdGV3b3JkIChkZXYsIGhkcl9hZGRyICsgMiwgUk1EX09XTik7CisJCWFtX3dyaXRld29yZCAoZGV2LCBoZHJfYWRkciArIDQsICgtMTYwMCkpOworCQlhbV93cml0ZXdvcmQgKGRldiwgaGRyX2FkZHIgKyA2LCAwKTsKKwkJZmlyc3RfZnJlZV9hZGRyICs9IDE2MDA7CisJCWhkcl9hZGRyICs9IDg7CisJfQorCXByaXYtPnR4aGVhZCA9IDA7CisJcHJpdi0+dHh0YWlsID0gMDsKKwlwcml2LT50eGhkciA9IGhkcl9hZGRyOworCWZvciAoaSA9IDA7IGkgPCBUWF9CVUZGRVJTOyBpKyspIHsKKwkJcHJpdi0+dHhidWZmZXJbaV0gPSBmaXJzdF9mcmVlX2FkZHI7CisJCWFtX3dyaXRld29yZCAoZGV2LCBoZHJfYWRkciwgZmlyc3RfZnJlZV9hZGRyKTsKKwkJYW1fd3JpdGV3b3JkIChkZXYsIGhkcl9hZGRyICsgMiwgVE1EX1NUUHxUTURfRU5QKTsKKwkJYW1fd3JpdGV3b3JkIChkZXYsIGhkcl9hZGRyICsgNCwgMHhmMDAwKTsKKwkJYW1fd3JpdGV3b3JkIChkZXYsIGhkcl9hZGRyICsgNiwgMCk7CisJCWZpcnN0X2ZyZWVfYWRkciArPSAxNjAwOworCQloZHJfYWRkciArPSA4OworCX0KKworCXdyaXRlX3JyZWcgKGRldi0+YmFzZV9hZGRyLCBCQVNFUlhMLCBwcml2LT5yeGhkcik7CisJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIEJBU0VSWEgsIDApOworCXdyaXRlX3JyZWcgKGRldi0+YmFzZV9hZGRyLCBCQVNFVFhMLCBwcml2LT50eGhkcik7CisJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIEJBU0VSWEgsIDApOworCXdyaXRlX3JyZWcgKGRldi0+YmFzZV9hZGRyLCBDU1IwLCBDU1IwX1NUT1ApOworCXdyaXRlX3JyZWcgKGRldi0+YmFzZV9hZGRyLCBDU1IzLCBDU1IzX0lET05NfENTUjNfQkFCTE18Q1NSM19EWFNVRkxPKTsKKwl3cml0ZV9ycmVnIChkZXYtPmJhc2VfYWRkciwgQ1NSNCwgQ1NSNF9BUEFEX1hNSVR8Q1NSNF9NRkNPTXxDU1I0X1JDVkNDT018Q1NSNF9UWFNUUlRNfENTUjRfSkFCTSk7CisJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIENTUjAsIENTUjBfSUVOQXxDU1IwX1NUUlQpOworfQorCitzdGF0aWMgdm9pZCBhbTc5Yzk2MV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IGRldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgbG5rc3RhdCwgY2FycmllcjsKKworCWxua3N0YXQgPSByZWFkX2lyZWcoZGV2LT5iYXNlX2FkZHIsIElTQUxFRDApICYgSVNBTEVEMF9MTktTVDsKKwljYXJyaWVyID0gbmV0aWZfY2Fycmllcl9vayhkZXYpOworCisJaWYgKGxua3N0YXQgJiYgIWNhcnJpZXIpCisJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwllbHNlIGlmICghbG5rc3RhdCAmJiBjYXJyaWVyKQorCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJbW9kX3RpbWVyKCZwcml2LT50aW1lciwgamlmZmllcyArIDUqSFopOworfQorCisvKgorICogT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4KKyAqLworc3RhdGljIGludAorYW03OWM5NjFfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJldDsKKworCW1lbXNldCAoJnByaXYtPnN0YXRzLCAwLCBzaXplb2YgKHByaXYtPnN0YXRzKSk7CisKKwlyZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgYW03OWM5NjFfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWFtNzljOTYxX2luaXRfZm9yX29wZW4oZGV2KTsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKwlwcml2LT50aW1lci5leHBpcmVzID0gamlmZmllczsKKwlhZGRfdGltZXIoJnByaXYtPnRpbWVyKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gYW03OWM5NjFfb3BlbigpLgorICovCitzdGF0aWMgaW50CithbTc5Yzk2MV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRlbF90aW1lcl9zeW5jKCZwcml2LT50aW1lcik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKHByaXYtPmNoaXBfbG9jaywgZmxhZ3MpOworCXdyaXRlX3JyZWcgKGRldi0+YmFzZV9hZGRyLCBDU1IwLCBDU1IwX1NUT1ApOworCXdyaXRlX3JyZWcgKGRldi0+YmFzZV9hZGRyLCBDU1IzLCBDU1IzX01BU0tBTEwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocHJpdi0+Y2hpcF9sb2NrLCBmbGFncyk7CisKKwlmcmVlX2lycSAoZGV2LT5pcnEsIGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmFtNzljOTYxX2dldHN0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuICZwcml2LT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgYW03OWM5NjFfbWNfaGFzaChzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSwgdW5zaWduZWQgc2hvcnQgKmhhc2gpCit7CisJaWYgKGRtaS0+ZG1pX2FkZHJsZW4gPT0gRVRIX0FMRU4gJiYgZG1pLT5kbWlfYWRkclswXSAmIDB4MDEpIHsKKwkJaW50IGlkeCwgYml0OworCQl1MzIgY3JjOworCisJCWNyYyA9IGV0aGVyX2NyY19sZShFVEhfQUxFTiwgZG1pLT5kbWlfYWRkcik7CisKKwkJaWR4ID0gY3JjID4+IDMwOworCQliaXQgPSAoY3JjID4+IDI2KSAmIDE1OworCisJCWhhc2hbaWR4XSB8PSAxIDw8IGJpdDsKKwl9Cit9CisKKy8qCisgKiBTZXQgb3IgY2xlYXIgcHJvbWlzY3VvdXMvbXVsdGljYXN0IG1vZGUgZmlsdGVyIGZvciB0aGlzIGFkYXB0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIGFtNzljOTYxX3NldG11bHRpY2FzdGxpc3QgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHNob3J0IG11bHRpX2hhc2hbNF0sIG1vZGU7CisJaW50IGksIHN0b3BwZWQ7CisKKwltb2RlID0gTU9ERV9QT1JUXzEwQlQ7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCW1vZGUgfD0gTU9ERV9QUk9NSVNDOworCX0gZWxzZSBpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQltZW1zZXQobXVsdGlfaGFzaCwgMHhmZiwgc2l6ZW9mKG11bHRpX2hhc2gpKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaTsKKworCQltZW1zZXQobXVsdGlfaGFzaCwgMHgwMCwgc2l6ZW9mKG11bHRpX2hhc2gpKTsKKworCQlmb3IgKGRtaSA9IGRldi0+bWNfbGlzdDsgZG1pOyBkbWkgPSBkbWktPm5leHQpCisJCQlhbTc5Yzk2MV9tY19oYXNoKGRtaSwgbXVsdGlfaGFzaCk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUocHJpdi0+Y2hpcF9sb2NrLCBmbGFncyk7CisKKwlzdG9wcGVkID0gcmVhZF9ycmVnKGRldi0+YmFzZV9hZGRyLCBDU1IwKSAmIENTUjBfU1RPUDsKKworCWlmICghc3RvcHBlZCkgeworCQkvKgorCQkgKiBQdXQgdGhlIGNoaXAgaW50byBzdXNwZW5kIG1vZGUKKwkJICovCisJCXdyaXRlX3JyZWcoZGV2LT5iYXNlX2FkZHIsIENUUkwxLCBDVFJMMV9TUE5EKTsKKworCQkvKgorCQkgKiBTcGluIHdhaXRpbmcgZm9yIGNoaXAgdG8gcmVwb3J0IHN1c3BlbmQgbW9kZQorCQkgKi8KKwkJd2hpbGUgKChyZWFkX3JyZWcoZGV2LT5iYXNlX2FkZHIsIENUUkwxKSAmIENUUkwxX1NQTkQpID09IDApIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocHJpdi0+Y2hpcF9sb2NrLCBmbGFncyk7CisJCQlub3AoKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKHByaXYtPmNoaXBfbG9jaywgZmxhZ3MpOworCQl9CisJfQorCisJLyoKKwkgKiBVcGRhdGUgdGhlIG11bHRpY2FzdCBoYXNoIHRhYmxlCisJICovCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihtdWx0aV9oYXNoKSAvIHNpemVvZihtdWx0aV9oYXNoWzBdKTsgaSsrKQorCQl3cml0ZV9ycmVnKGRldi0+YmFzZV9hZGRyLCBpICsgTEFEUkwsIG11bHRpX2hhc2hbaV0pOworCisJLyoKKwkgKiBXcml0ZSB0aGUgbW9kZSByZWdpc3RlcgorCSAqLworCXdyaXRlX3JyZWcoZGV2LT5iYXNlX2FkZHIsIE1PREUsIG1vZGUpOworCisJaWYgKCFzdG9wcGVkKSB7CisJCS8qCisJCSAqIFB1dCB0aGUgY2hpcCBiYWNrIGludG8gcnVubmluZyBtb2RlCisJCSAqLworCQl3cml0ZV9ycmVnKGRldi0+YmFzZV9hZGRyLCBDVFJMMSwgMCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwcml2LT5jaGlwX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYW03OWM5NjFfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIG5ldHdvcmsgY2FibGUgcHJvYmxlbT9cbiIsCisJCWRldi0+bmFtZSk7CisKKwkvKgorCSAqIG91Z2h0IHRvIGRvIHNvbWUgc2V0dXAgb2YgdGhlIHR4IHNpZGUgaGVyZQorCSAqLworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisvKgorICogVHJhbnNtaXQgYSBwYWNrZXQKKyAqLworc3RhdGljIGludAorYW03OWM5NjFfc2VuZHBhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IGhkcmFkZHIsIGJ1ZmFkZHI7CisJdW5zaWduZWQgaW50IGhlYWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWhlYWQgPSBwcml2LT50eGhlYWQ7CisJaGRyYWRkciA9IHByaXYtPnR4aGRyICsgKGhlYWQgPDwgMyk7CisJYnVmYWRkciA9IHByaXYtPnR4YnVmZmVyW2hlYWRdOworCWhlYWQgKz0gMTsKKwlpZiAoaGVhZCA+PSBUWF9CVUZGRVJTKQorCQloZWFkID0gMDsKKworCWFtX3dyaXRlYnVmZmVyIChkZXYsIGJ1ZmFkZHIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCWFtX3dyaXRld29yZCAoZGV2LCBoZHJhZGRyICsgNCwgLXNrYi0+bGVuKTsKKwlhbV93cml0ZXdvcmQgKGRldiwgaGRyYWRkciArIDIsIFRNRF9PV058VE1EX1NUUHxUTURfRU5QKTsKKwlwcml2LT50eGhlYWQgPSBoZWFkOworCisJc3Bpbl9sb2NrX2lycXNhdmUocHJpdi0+Y2hpcF9sb2NrLCBmbGFncyk7CisJd3JpdGVfcnJlZyAoZGV2LT5iYXNlX2FkZHIsIENTUjAsIENTUjBfVERNRHxDU1IwX0lFTkEpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocHJpdi0+Y2hpcF9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIElmIHRoZSBuZXh0IHBhY2tldCBpcyBvd25lZCBieSB0aGUgZXRoZXJuZXQgZGV2aWNlLAorCSAqIHRoZW4gdGhlIHR4IHJpbmcgaXMgZnVsbCBhbmQgd2UgY2FuJ3QgYWRkIGFub3RoZXIKKwkgKiBwYWNrZXQuCisJICovCisJaWYgKGFtX3JlYWR3b3JkKGRldiwgcHJpdi0+dHhoZHIgKyAocHJpdi0+dHhoZWFkIDw8IDMpICsgMikgJiBUTURfT1dOKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIElmIHdlIGhhdmUgYSBnb29kIHBhY2tldChzKSwgZ2V0IGl0L3RoZW0gb3V0IG9mIHRoZSBidWZmZXJzLgorICovCitzdGF0aWMgdm9pZAorYW03OWM5NjFfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGRldl9wcml2ICpwcml2KQoreworCWRvIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdV9pbnQgaGRyYWRkcjsKKwkJdV9pbnQgcGt0YWRkcjsKKwkJdV9pbnQgc3RhdHVzOworCQlpbnQgbGVuOworCisJCWhkcmFkZHIgPSBwcml2LT5yeGhkciArIChwcml2LT5yeHRhaWwgPDwgMyk7CisJCXBrdGFkZHIgPSBwcml2LT5yeGJ1ZmZlcltwcml2LT5yeHRhaWxdOworCisJCXN0YXR1cyA9IGFtX3JlYWR3b3JkIChkZXYsIGhkcmFkZHIgKyAyKTsKKwkJaWYgKHN0YXR1cyAmIFJNRF9PV04pIC8qIGRvIHdlIG93biBpdD8gKi8KKwkJCWJyZWFrOworCisJCXByaXYtPnJ4dGFpbCArKzsKKwkJaWYgKHByaXYtPnJ4dGFpbCA+PSBSWF9CVUZGRVJTKQorCQkJcHJpdi0+cnh0YWlsID0gMDsKKworCQlpZiAoKHN0YXR1cyAmIChSTURfRVJSfFJNRF9TVFB8Uk1EX0VOUCkpICE9IChSTURfU1RQfFJNRF9FTlApKSB7CisJCQlhbV93cml0ZXdvcmQgKGRldiwgaGRyYWRkciArIDIsIFJNRF9PV04pOworCQkJcHJpdi0+c3RhdHMucnhfZXJyb3JzICsrOworCQkJaWYgKHN0YXR1cyAmIFJNRF9FUlIpIHsKKwkJCQlpZiAoc3RhdHVzICYgUk1EX0ZSQU0pCisJCQkJCXByaXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyArKzsKKwkJCQlpZiAoc3RhdHVzICYgUk1EX0NSQykKKwkJCQkJcHJpdi0+c3RhdHMucnhfY3JjX2Vycm9ycyArKzsKKwkJCX0gZWxzZSBpZiAoc3RhdHVzICYgUk1EX1NUUCkKKwkJCQlwcml2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzICsrOworCQkJY29udGludWU7CisJCX0KKworCQlsZW4gPSBhbV9yZWFkd29yZChkZXYsIGhkcmFkZHIgKyA2KTsKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyAyKTsKKworCQlpZiAoc2tiKSB7CisJCQlza2ItPmRldiA9IGRldjsKKwkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisKKwkJCWFtX3JlYWRidWZmZXIoZGV2LCBwa3RhZGRyLCBza2JfcHV0KHNrYiwgbGVuKSwgbGVuKTsKKwkJCWFtX3dyaXRld29yZChkZXYsIGhkcmFkZHIgKyAyLCBSTURfT1dOKTsKKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMgKys7CisJCX0gZWxzZSB7CisJCQlhbV93cml0ZXdvcmQgKGRldiwgaGRyYWRkciArIDIsIFJNRF9PV04pOworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBtZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCXByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQgKys7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKDEpOworfQorCisvKgorICogVXBkYXRlIHN0YXRzIGZvciB0aGUgdHJhbnNtaXR0ZWQgcGFja2V0CisgKi8KK3N0YXRpYyB2b2lkCithbTc5Yzk2MV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZGV2X3ByaXYgKnByaXYpCit7CisJZG8geworCQlzaG9ydCBsZW47CisJCXVfaW50IGhkcmFkZHI7CisJCXVfaW50IHN0YXR1czsKKworCQloZHJhZGRyID0gcHJpdi0+dHhoZHIgKyAocHJpdi0+dHh0YWlsIDw8IDMpOworCQlzdGF0dXMgPSBhbV9yZWFkd29yZCAoZGV2LCBoZHJhZGRyICsgMik7CisJCWlmIChzdGF0dXMgJiBUTURfT1dOKQorCQkJYnJlYWs7CisKKwkJcHJpdi0+dHh0YWlsICsrOworCQlpZiAocHJpdi0+dHh0YWlsID49IFRYX0JVRkZFUlMpCisJCQlwcml2LT50eHRhaWwgPSAwOworCisJCWlmIChzdGF0dXMgJiBUTURfRVJSKSB7CisJCQl1X2ludCBzdGF0dXMyOworCisJCQlwcml2LT5zdGF0cy50eF9lcnJvcnMgKys7CisKKwkJCXN0YXR1czIgPSBhbV9yZWFkd29yZCAoZGV2LCBoZHJhZGRyICsgNik7CisKKwkJCS8qCisJCQkgKiBDbGVhciB0aGUgZXJyb3IgYnl0ZQorCQkJICovCisJCQlhbV93cml0ZXdvcmQgKGRldiwgaGRyYWRkciArIDYsIDApOworCisJCQlpZiAoc3RhdHVzMiAmIFRTVF9SVFJZKQorCQkJCXByaXYtPnN0YXRzLmNvbGxpc2lvbnMgKz0gMTY7CisJCQlpZiAoc3RhdHVzMiAmIFRTVF9MQ09MKQorCQkJCXByaXYtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMgKys7CisJCQlpZiAoc3RhdHVzMiAmIFRTVF9MQ0FSKQorCQkJCXByaXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzICsrOworCQkJaWYgKHN0YXR1czIgJiBUU1RfVUZMTykKKwkJCQlwcml2LT5zdGF0cy50eF9maWZvX2Vycm9ycyArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCXByaXYtPnN0YXRzLnR4X3BhY2tldHMgKys7CisJCWxlbiA9IGFtX3JlYWR3b3JkIChkZXYsIGhkcmFkZHIgKyA0KTsKKwkJcHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gLWxlbjsKKwl9IHdoaWxlIChwcml2LT50eHRhaWwgIT0gcHJpdi0+dHhoZWFkKTsKKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGlycXJldHVybl90CithbTc5Yzk2MV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCXN0cnVjdCBkZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdV9pbnQgc3RhdHVzLCBuID0gMTAwOworCWludCBoYW5kbGVkID0gMDsKKworCWRvIHsKKwkJc3RhdHVzID0gcmVhZF9ycmVnKGRldi0+YmFzZV9hZGRyLCBDU1IwKTsKKwkJd3JpdGVfcnJlZyhkZXYtPmJhc2VfYWRkciwgQ1NSMCwgc3RhdHVzICYKKwkJCSAgIChDU1IwX0lFTkF8Q1NSMF9USU5UfENTUjBfUklOVHwKKwkJCSAgICBDU1IwX01FUlJ8Q1NSMF9NSVNTfENTUjBfQ0VSUnxDU1IwX0JBQkwpKTsKKworCQlpZiAoc3RhdHVzICYgQ1NSMF9SSU5UKSB7CisJCQloYW5kbGVkID0gMTsKKwkJCWFtNzljOTYxX3J4KGRldiwgcHJpdik7CisJCX0KKwkJaWYgKHN0YXR1cyAmIENTUjBfVElOVCkgeworCQkJaGFuZGxlZCA9IDE7CisJCQlhbTc5Yzk2MV90eChkZXYsIHByaXYpOworCQl9CisJCWlmIChzdGF0dXMgJiBDU1IwX01JU1MpIHsKKwkJCWhhbmRsZWQgPSAxOworCQkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCArKzsKKwkJfQorCQlpZiAoc3RhdHVzICYgQ1NSMF9DRVJSKSB7CisJCQloYW5kbGVkID0gMTsKKwkJCW1vZF90aW1lcigmcHJpdi0+dGltZXIsIGppZmZpZXMpOworCQl9CisJfSB3aGlsZSAoLS1uICYmIHN0YXR1cyAmIChDU1IwX1JJTlQgfCBDU1IwX1RJTlQpKTsKKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIGFtNzljOTYxX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWFtNzljOTYxX2ludGVycnVwdChkZXYtPmlycSwgZGV2LCBOVUxMKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisjZW5kaWYKKworLyoKKyAqIEluaXRpYWxpc2UgdGhlIGNoaXAuICBOb3RlIHRoYXQgd2UgYWx3YXlzIGV4cGVjdAorICogdG8gYmUgZW50ZXJlZCB3aXRoIGludGVycnVwdHMgZW5hYmxlZC4KKyAqLworc3RhdGljIGludAorYW03OWM5NjFfaHdfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2tfaXJxKCZwcml2LT5jaGlwX2xvY2spOworCXdyaXRlX3JyZWcgKGRldi0+YmFzZV9hZGRyLCBDU1IwLCBDU1IwX1NUT1ApOworCXdyaXRlX3JyZWcgKGRldi0+YmFzZV9hZGRyLCBDU1IzLCBDU1IzX01BU0tBTEwpOworCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+Y2hpcF9sb2NrKTsKKworCWFtNzljOTYxX3JhbXRlc3QoZGV2LCAweDY2KTsKKwlhbTc5Yzk2MV9yYW10ZXN0KGRldiwgMHg5OSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGFtNzljOTYxX2Jhbm5lcih2b2lkKQoreworCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7CisKKwlpZiAobmV0X2RlYnVnICYmIHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFtNzljOTYxX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBkZXZfcHJpdiAqcHJpdjsKKwlpbnQgaSwgcmV0OworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBkZXZfcHJpdikpOworCXJldCA9IC1FTk9NRU07CisJaWYgKCFkZXYpCisJCWdvdG8gb3V0OworCisJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKgorCSAqIEZpeGVkIGFkZHJlc3MgYW5kIElSUSBsaW5lcyBoZXJlLgorCSAqIFRoZSBQTlAgaW5pdGlhbGlzYXRpb24gc2hvdWxkIGhhdmUgYmVlbgorCSAqIGRvbmUgYnkgdGhlIGV0aGVyIGJvb3RwIGxvYWRlci4KKwkgKi8KKwlkZXYtPmJhc2VfYWRkciA9IDB4MjIwOworCWRldi0+aXJxID0gSVJRX0VCU0ExMTBfRVRIRVJORVQ7CisKKyAgICAJcmV0ID0gLUVOT0RFVjsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCAweDE4LCBkZXYtPm5hbWUpKQorCQlnb3RvIG5vZGV2OworCisJLyoKKwkgKiBSZXNldCB0aGUgZGV2aWNlLgorCSAqLworCWluYihkZXYtPmJhc2VfYWRkciArIE5FVF9SRVNFVCk7CisJdWRlbGF5KDUpOworCisJLyoKKwkgKiBDaGVjayB0aGUgbWFudWZhY3R1cmVyIHBhcnQgb2YgdGhlCisJICogZXRoZXIgYWRkcmVzcy4KKwkgKi8KKwlpZiAoaW5iKGRldi0+YmFzZV9hZGRyKSAhPSAweDA4IHx8CisJICAgIGluYihkZXYtPmJhc2VfYWRkciArIDIpICE9IDB4MDAgfHwKKwkgICAgaW5iKGRldi0+YmFzZV9hZGRyICsgNCkgIT0gMHgyYikKKwkgICAgCWdvdG8gcmVsZWFzZTsKKworCWFtNzljOTYxX2Jhbm5lcigpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBldGhlciBhZGRyZXNzICIsIGRldi0+bmFtZSk7CisKKwkvKiBSZXRyaXZlIGFuZCBwcmludCB0aGUgZXRoZXJuZXQgYWRkcmVzcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWRldi0+ZGV2X2FkZHJbaV0gPSBpbmIoZGV2LT5iYXNlX2FkZHIgKyBpICogMikgJiAweGZmOworCQlwcmludGsgKGkgPT0gNSA/ICIlMDJ4XG4iIDogIiUwMng6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmNoaXBfbG9jayk7CisJaW5pdF90aW1lcigmcHJpdi0+dGltZXIpOworCXByaXYtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJcHJpdi0+dGltZXIuZnVuY3Rpb24gPSBhbTc5Yzk2MV90aW1lcjsKKworCWlmIChhbTc5Yzk2MV9od19pbml0KGRldikpCisJCWdvdG8gcmVsZWFzZTsKKworCWRldi0+b3BlbgkJPSBhbTc5Yzk2MV9vcGVuOworCWRldi0+c3RvcAkJPSBhbTc5Yzk2MV9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IGFtNzljOTYxX3NlbmRwYWNrZXQ7CisJZGV2LT5nZXRfc3RhdHMJCT0gYW03OWM5NjFfZ2V0c3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QJPSBhbTc5Yzk2MV9zZXRtdWx0aWNhc3RsaXN0OworCWRldi0+dHhfdGltZW91dAkJPSBhbTc5Yzk2MV90aW1lb3V0OworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIJPSBhbTc5Yzk2MV9wb2xsX2NvbnRyb2xsZXI7CisjZW5kaWYKKworCXJldCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIDA7CisKK3JlbGVhc2U6CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIDB4MTgpOworbm9kZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitfX2luaXRjYWxsKGFtNzljOTYxX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2FtNzljOTYxYS5oIGIvZHJpdmVycy9uZXQvYXJtL2FtNzljOTYxYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOWIwNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hcm0vYW03OWM5NjFhLmgKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL25ldC9hbTc5Yzk2MS5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9hbTc5Yzk2MWFfSAorI2RlZmluZSBfTElOVVhfYW03OWM5NjFhX0gKKworLyogdXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgPjIgZm9yIGRlYnVnLiBkZWJ1ZyBmbGFnczogKi8KKyNkZWZpbmUgREVCVUdfVFgJIDIKKyNkZWZpbmUgREVCVUdfUlgJIDQKKyNkZWZpbmUgREVCVUdfSU5UCSA4CisjZGVmaW5lIERFQlVHX0lDCTE2CisjaWZuZGVmIE5FVF9ERUJVRworI2RlZmluZSBORVRfREVCVUcgCTAKKyNlbmRpZgorCisjZGVmaW5lIE5FVF9VSUQJCTAKKyNkZWZpbmUgTkVUX1JEUAkJMHgxMAorI2RlZmluZSBORVRfUkFQCQkweDEyCisjZGVmaW5lIE5FVF9SRVNFVAkweDE0CisjZGVmaW5lIE5FVF9JRFAJCTB4MTYKKworLyoKKyAqIFJBUCByZWdpc3RlcnMKKyAqLworI2RlZmluZSBDU1IwCQkwCisjZGVmaW5lIENTUjBfSU5JVAkweDAwMDEKKyNkZWZpbmUgQ1NSMF9TVFJUCTB4MDAwMgorI2RlZmluZSBDU1IwX1NUT1AJMHgwMDA0CisjZGVmaW5lIENTUjBfVERNRAkweDAwMDgKKyNkZWZpbmUgQ1NSMF9UWE9OCTB4MDAxMAorI2RlZmluZSBDU1IwX1JYT04JMHgwMDIwCisjZGVmaW5lIENTUjBfSUVOQQkweDAwNDAKKyNkZWZpbmUgQ1NSMF9JTlRSCTB4MDA4MAorI2RlZmluZSBDU1IwX0lET04JMHgwMTAwCisjZGVmaW5lIENTUjBfVElOVAkweDAyMDAKKyNkZWZpbmUgQ1NSMF9SSU5UCTB4MDQwMAorI2RlZmluZSBDU1IwX01FUlIJMHgwODAwCisjZGVmaW5lIENTUjBfTUlTUwkweDEwMDAKKyNkZWZpbmUgQ1NSMF9DRVJSCTB4MjAwMAorI2RlZmluZSBDU1IwX0JBQkwJMHg0MDAwCisjZGVmaW5lIENTUjBfRVJSCTB4ODAwMAorCisjZGVmaW5lIENTUjMJCTMKKyNkZWZpbmUgQ1NSM19FTUJBCTB4MDAwOAorI2RlZmluZSBDU1IzX0RYTVQyUEQJMHgwMDEwCisjZGVmaW5lIENTUjNfTEFQUEVOCTB4MDAyMAorI2RlZmluZSBDU1IzX0RYU1VGTE8JMHgwMDQwCisjZGVmaW5lIENTUjNfSURPTk0JMHgwMTAwCisjZGVmaW5lIENTUjNfVElOVE0JMHgwMjAwCisjZGVmaW5lIENTUjNfUklOVE0JMHgwNDAwCisjZGVmaW5lIENTUjNfTUVSUk0JMHgwODAwCisjZGVmaW5lIENTUjNfTUlTU00JMHgxMDAwCisjZGVmaW5lIENTUjNfQkFCTE0JMHg0MDAwCisjZGVmaW5lIENTUjNfTUFTS0FMTAkweDVGMDAKKworI2RlZmluZSBDU1I0CQk0CisjZGVmaW5lIENTUjRfSkFCTQkweDAwMDEKKyNkZWZpbmUgQ1NSNF9KQUIJMHgwMDAyCisjZGVmaW5lIENTUjRfVFhTVFJUTQkweDAwMDQKKyNkZWZpbmUgQ1NSNF9UWFNUUlQJMHgwMDA4CisjZGVmaW5lIENTUjRfUkNWQ0NPTQkweDAwMTAKKyNkZWZpbmUgQ1NSNF9SQ1ZDQ08JMHgwMDIwCisjZGVmaW5lIENTUjRfTUZDT00JMHgwMTAwCisjZGVmaW5lIENTUjRfTUZDTwkweDAyMDAKKyNkZWZpbmUgQ1NSNF9BU1RSUF9SQ1YJMHgwNDAwCisjZGVmaW5lIENTUjRfQVBBRF9YTUlUCTB4MDgwMAorCisjZGVmaW5lIENUUkwxCQk1CisjZGVmaW5lIENUUkwxX1NQTkQJMHgwMDAxCisKKyNkZWZpbmUgTEFEUkwJCTgKKyNkZWZpbmUgTEFEUk0xCQk5CisjZGVmaW5lIExBRFJNMgkJMTAKKyNkZWZpbmUgTEFEUkgJCTExCisjZGVmaW5lIFBBRFJMCQkxMgorI2RlZmluZSBQQURSTQkJMTMKKyNkZWZpbmUgUEFEUkgJCTE0CisKKyNkZWZpbmUgTU9ERQkJMTUKKyNkZWZpbmUgTU9ERV9ESVNSWAkweDAwMDEKKyNkZWZpbmUgTU9ERV9ESVNUWAkweDAwMDIKKyNkZWZpbmUgTU9ERV9MT09QCTB4MDAwNAorI2RlZmluZSBNT0RFX0RUQ1JDCTB4MDAwOAorI2RlZmluZSBNT0RFX0NPTEwJMHgwMDEwCisjZGVmaW5lIE1PREVfRFJFVFJZCTB4MDAyMAorI2RlZmluZSBNT0RFX0lOVExPT1AJMHgwMDQwCisjZGVmaW5lIE1PREVfUE9SVF9BVUkJMHgwMDAwCisjZGVmaW5lIE1PREVfUE9SVF8xMEJUCTB4MDA4MAorI2RlZmluZSBNT0RFX0RSWFBBCTB4MjAwMAorI2RlZmluZSBNT0RFX0RSWEJBCTB4NDAwMAorI2RlZmluZSBNT0RFX1BST01JU0MJMHg4MDAwCisKKyNkZWZpbmUgQkFTRVJYTAkJMjQKKyNkZWZpbmUgQkFTRVJYSAkJMjUKKyNkZWZpbmUgQkFTRVRYTAkJMzAKKyNkZWZpbmUgQkFTRVRYSAkJMzEKKworI2RlZmluZSBQT0xMSU5UCQk0NworCisjZGVmaW5lIFNJWkVSWFIJCTc2CisjZGVmaW5lIFNJWkVUWFIJCTc4CisKKyNkZWZpbmUgQ1NSX01GQwkJMTEyCisKKyNkZWZpbmUgUk1EX0VOUAkJMHgwMTAwCisjZGVmaW5lIFJNRF9TVFAJCTB4MDIwMAorI2RlZmluZSBSTURfQ1JDCQkweDA4MDAKKyNkZWZpbmUgUk1EX0ZSQU0JMHgyMDAwCisjZGVmaW5lIFJNRF9FUlIJCTB4NDAwMAorI2RlZmluZSBSTURfT1dOCQkweDgwMDAKKworI2RlZmluZSBUTURfRU5QCQkweDAxMDAKKyNkZWZpbmUgVE1EX1NUUAkJMHgwMjAwCisjZGVmaW5lIFRNRF9NT1JFCTB4MTAwMAorI2RlZmluZSBUTURfRVJSCQkweDQwMDAKKyNkZWZpbmUgVE1EX09XTgkJMHg4MDAwCisKKyNkZWZpbmUgVFNUX1JUUlkJMHgwNDAwCisjZGVmaW5lIFRTVF9MQ0FSCTB4MDgwMAorI2RlZmluZSBUU1RfTENPTAkweDEwMDAKKyNkZWZpbmUgVFNUX1VGTE8JMHg0MDAwCisjZGVmaW5lIFRTVF9CVUZGCTB4ODAwMAorCisjZGVmaW5lIElTQUxFRDAJCTB4MDAwNAorI2RlZmluZSBJU0FMRUQwX0xOS1NUCTB4ODAwMAorCitzdHJ1Y3QgZGV2X3ByaXYgeworICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworICAgIHVuc2lnbmVkIGxvbmcJcnhidWZmZXJbUlhfQlVGRkVSU107CisgICAgdW5zaWduZWQgbG9uZwl0eGJ1ZmZlcltUWF9CVUZGRVJTXTsKKyAgICB1bnNpZ25lZCBjaGFyCXR4aGVhZDsKKyAgICB1bnNpZ25lZCBjaGFyCXR4dGFpbDsKKyAgICB1bnNpZ25lZCBjaGFyCXJ4aGVhZDsKKyAgICB1bnNpZ25lZCBjaGFyCXJ4dGFpbDsKKyAgICB1bnNpZ25lZCBsb25nCXJ4aGRyOworICAgIHVuc2lnbmVkIGxvbmcJdHhoZHI7CisgICAgc3BpbmxvY2tfdAkJY2hpcF9sb2NrOworICAgIHN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOworfTsKKworZXh0ZXJuIGludAlhbTc5Yzk2MV9wcm9iZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2V0aGVyMDAuYyBiL2RyaXZlcnMvbmV0L2FybS9ldGhlcjAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYxZjRlMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FybS9ldGhlcjAwLmMKQEAgLTAsMCArMSwxMDE3IEBACisvKgorICogIGRyaXZlcnMvbmV0L2V0aGVyMDAuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgQWx0ZXJhIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKy8qIGluY2x1ZGVzICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGQvcGxkX2hvdHN3YXAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9leGNhbGlidXIuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2V0aGVyMDAuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC90ZGtwaHkuaD4KKworCitNT0RVTEVfQVVUSE9SKCJDbGl2ZSBEYXZpZXMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQWx0ZXJhIEV0aGVyMDAgSVAgY29yZSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBQS1RfQlVGX1NaIDE1NDAgLyogU2l6ZSBvZiBlYWNoIHJ4IGJ1ZmZlciAqLworI2RlZmluZSBFVEhfTlIgNCAvKiBOdW1iZXIgb2YgTUFDcyB0aGlzIGRyaXZlciBzdXBwb3J0cyAqLworCisjZGVmaW5lIERFQlVHKHgpCisKKyNkZWZpbmUgX19kbWFfdmEoeCkgKHVuc2lnbmVkIGludCkoKHVuc2lnbmVkIGludClwcml2LT5kbWFfZGF0YSsoKCh1bnNpZ25lZCBpbnQpKHgpKSYoRVhDX1NQU1JBTV9CTE9DSzBfU0laRS0xKSkpCisjZGVmaW5lIF9fZG1hX3BhKHgpICh1bnNpZ25lZCBpbnQpKEVYQ19TUFNSQU1fQkxPQ0swX0JBU0UrKCgodW5zaWduZWQgaW50KSh4KSktKHVuc2lnbmVkIGludClwcml2LT5kbWFfZGF0YSkpCisKKyNkZWZpbmUgRVRIRVIwMF9CQVNFCTAKKyNkZWZpbmUJRVRIRVIwMF9UWVBFCisjZGVmaW5lIEVUSEVSMDBfTkFNRSAiZXRoZXIwMCIKKyNkZWZpbmUgTUFDX1JFR19TSVpFIDB4NDAwIC8qIHNpemUgb2YgTUFDIHJlZ2lzdGVyIGFyZWEgKi8KKworCisKKy8qIHR5cGVkZWZzICovCisKKy8qIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBkcml2ZXIgY29udHJvbCBzdHJ1Y3R1cmUgKi8KKworI2RlZmluZSBSWF9OVU1fQlVGRiAgICAgMTAKKyNkZWZpbmUgUlhfTlVNX0ZERVNDICAgIDEwCisjZGVmaW5lIFRYX05VTV9GREVTQyAgICAxMAorCitzdHJ1Y3QgdHhfZmRhX2VudHsKKwlGREFfREVTQyAgZmQ7CisJQlVGX0RFU0MgIGJkOworCUJVRl9ERVNDICBwYWQ7Cit9Oworc3RydWN0IHJ4X2ZkYV9lbnR7CisJRkRBX0RFU0MgIGZkOworCUJVRl9ERVNDICBiZDsKKwlCVUZfREVTQyAgcGFkOworfTsKK3N0cnVjdCByeF9ibGlzdF9lbnR7CisJRkRBX0RFU0MgIGZkOworCUJVRl9ERVNDICBiZDsKKwlCVUZfREVTQyAgcGFkOworfTsKK3N0cnVjdCBuZXRfcHJpdgoreworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBza19idWZmKiBza2I7CisJdm9pZCogZG1hX2RhdGE7CisJc3RydWN0IHJ4X2JsaXN0X2VudCogIHJ4X2JsaXN0X3ZwOworCXN0cnVjdCByeF9mZGFfZW50KiByeF9mZGFfcHRyOworCXN0cnVjdCB0eF9mZGFfZW50KiB0eF9mZGFsaXN0X3ZwOworCXN0cnVjdCB0cV9zdHJ1Y3QgIHRxX21lbXVwZGF0ZTsKKwl1bnNpZ25lZCBjaGFyICAgbWVtdXBkYXRlX3NjaGVkdWxlZDsKKwl1bnNpZ25lZCBjaGFyICAgcnhfZGlzYWJsZWQ7CisJdW5zaWduZWQgY2hhciAgIHF1ZXVlX3N0b3BwZWQ7CisJc3BpbmxvY2tfdCByeF9sb2NrOworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgdmVuZG9yX2lkWzJdPXsweDA3LDB4ZWR9OworCisjaWZkZWYgRVRIRVIwMF9ERUJVRworCisvKiBEdW1wIChtb3N0KSByZWdpc3RlcnMgZm9yIGRlYnVnZ2luZyBwdXBvc2VzICovCisKK3N0YXRpYyB2b2lkIGR1bXBfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KXsKKwlzdHJ1Y3QgbmV0X3ByaXYqIHByaXY9ZGV2LT5wcml2OworCXVuc2lnbmVkIGludCogaTsKKworCXByaW50aygiXG4gUlggZnJlZSBkZXNjcmlwdG9yIGFyZWE6XG4iKTsKKworCWZvcihpPSh1bnNpZ25lZCBpbnQqKXByaXYtPnJ4X2ZkYV9wdHI7CisJICAgIGk8KCh1bnNpZ25lZCBpbnQqKShwcml2LT5yeF9mZGFfcHRyK1JYX05VTV9GREVTQykpOyl7CisJCXByaW50aygiJSM4eCAlIzh4ICUjOHggJSM4eFxuIiwqaSwqKGkrMSksKihpKzIpLCooaSszKSk7CisJCWkrPTQ7CisJfQorCisJcHJpbnRrKCJcbiBSWCBidWZmZXIgbGlzdDpcbiIpOworCisJZm9yKGk9KHVuc2lnbmVkIGludCopcHJpdi0+cnhfYmxpc3RfdnA7CisJICAgIGk8KCh1bnNpZ25lZCBpbnQqKShwcml2LT5yeF9ibGlzdF92cCtSWF9OVU1fQlVGRikpOyl7CisJCXByaW50aygiJSM4eCAlIzh4ICUjOHggJSM4eFxuIiwqaSwqKGkrMSksKihpKzIpLCooaSszKSk7CisJCWkrPTQ7CisJfQorCisJcHJpbnRrKCJcbiBUWCBmcmFtZSBkZXNjcmlwdG9yIGxpc3Q6XG4iKTsKKworCWZvcihpPSh1bnNpZ25lZCBpbnQqKXByaXYtPnR4X2ZkYWxpc3RfdnA7CisJICAgIGk8KCh1bnNpZ25lZCBpbnQqKShwcml2LT50eF9mZGFsaXN0X3ZwK1RYX05VTV9GREVTQykpOyl7CisJCXByaW50aygiJSM4eCAlIzh4ICUjOHggJSM4eFxuIiwqaSwqKGkrMSksKihpKzIpLCooaSszKSk7CisJCWkrPTQ7CisJfQorCisJcHJpbnRrKCJcbmRtYSBjdGw9JSN4XG4iLHJlYWR3KEVUSEVSX0RNQV9DVEwoZGV2LT5iYXNlX2FkZHIpKSk7CisJcHJpbnRrKCJ0eGZybXB0cj0lI3hcbiIscmVhZHcoRVRIRVJfVFhGUk1QVFIoZGV2LT5iYXNlX2FkZHIpKSk7CisJcHJpbnRrKCJ0eHRocnNoPSUjeFxuIixyZWFkdyhFVEhFUl9UWFRIUlNIKGRldi0+YmFzZV9hZGRyKSkpOworCXByaW50aygidHhwb2xsY3RyPSUjeFxuIixyZWFkdyhFVEhFUl9UWFBPTExDVFIoZGV2LT5iYXNlX2FkZHIpKSk7CisJcHJpbnRrKCJibGZybXB0cj0lI3hcbiIscmVhZHcoRVRIRVJfQkxGUk1QVFIoZGV2LT5iYXNlX2FkZHIpKSk7CisJcHJpbnRrKCJyeGZyYWdzaXplPSUjeFxuIixyZWFkdyhFVEhFUl9SWEZSQUdTSVpFKGRldi0+YmFzZV9hZGRyKSkpOworCXByaW50aygidHhfaW50X2VuPSUjeFxuIixyZWFkdyhFVEhFUl9JTlRfRU4oZGV2LT5iYXNlX2FkZHIpKSk7CisJcHJpbnRrKCJmZGFfYmFzPSUjeFxuIixyZWFkdyhFVEhFUl9GREFfQkFTKGRldi0+YmFzZV9hZGRyKSkpOworCXByaW50aygiZmRhX2xpbT0lI3hcbiIscmVhZHcoRVRIRVJfRkRBX0xJTShkZXYtPmJhc2VfYWRkcikpKTsKKwlwcmludGsoImludF9zcmM9JSN4XG4iLHJlYWR3KEVUSEVSX0lOVF9TUkMoZGV2LT5iYXNlX2FkZHIpKSk7CisJcHJpbnRrKCJwYXVzZWNudD0lI3hcbiIscmVhZHcoRVRIRVJfUEFVU0VDTlQoZGV2LT5iYXNlX2FkZHIpKSk7CisJcHJpbnRrKCJyZW1wYXVjbnQ9JSN4XG4iLHJlYWR3KEVUSEVSX1JFTVBBVUNOVChkZXYtPmJhc2VfYWRkcikpKTsKKwlwcmludGsoInR4Y29uZnJtc3RhdD0lI3hcbiIscmVhZHcoRVRIRVJfVFhDT05GUk1TVEFUKGRldi0+YmFzZV9hZGRyKSkpOworCXByaW50aygibWFjX2N0bD0lI3hcbiIscmVhZHcoRVRIRVJfTUFDX0NUTChkZXYtPmJhc2VfYWRkcikpKTsKKwlwcmludGsoImFyY19jdGw9JSN4XG4iLHJlYWR3KEVUSEVSX0FSQ19DVEwoZGV2LT5iYXNlX2FkZHIpKSk7CisJcHJpbnRrKCJ0eF9jdGw9JSN4XG4iLHJlYWR3KEVUSEVSX1RYX0NUTChkZXYtPmJhc2VfYWRkcikpKTsKK30KKyNlbmRpZiAvKiBFVEhFUjAwX0RFQlVHICovCisKKworc3RhdGljIGludCBldGhlcjAwX3dyaXRlX3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBhZGRyZXNzLCBzaG9ydCB2YWx1ZSkKK3sKKwl2b2xhdGlsZSBpbnQgY291bnQgPSAxMDI0OworCXdyaXRldyh2YWx1ZSxFVEhFUl9NRF9EQVRBKGRldi0+YmFzZV9hZGRyKSk7CisJd3JpdGV3KCBFVEhFUl9NRF9DQV9CVVNZX01TSyB8CisJCUVUSEVSX01EX0NBX1dSX01TSyB8CisJCShhZGRyZXNzICYgRVRIRVJfTURfQ0FfQUREUl9NU0spLAorCQlFVEhFUl9NRF9DQShkZXYtPmJhc2VfYWRkcikpOworCisJLyogV2FpdCBmb3IgdGhlIGNvbW1hbmQgdG8gY29tcGxldGUgKi8KKwl3aGlsZSgocmVhZHcoRVRIRVJfTURfQ0EoZGV2LT5iYXNlX2FkZHIpKSAmIEVUSEVSX01EX0NBX0JVU1lfTVNLKSYmY291bnQpeworCQljb3VudC0tOworCX0KKwlpZiAoIWNvdW50KXsKKwkJcHJpbnRrKCJXcml0ZSB0byBwaHkgZmFpbGVkLCBhZGRyPSUjeCwgZGF0YT0lI3hcbiIsYWRkcmVzcywgdmFsdWUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXRoZXIwMF9yZWFkX3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBhZGRyZXNzKQoreworCXZvbGF0aWxlIGludCBjb3VudCA9IDEwMjQ7CisJd3JpdGV3KCBFVEhFUl9NRF9DQV9CVVNZX01TSyB8CisJCShhZGRyZXNzICYgRVRIRVJfTURfQ0FfQUREUl9NU0spLAorCQlFVEhFUl9NRF9DQShkZXYtPmJhc2VfYWRkcikpOworCisJLyogV2FpdCBmb3IgdGhlIGNvbW1hbmQgdG8gY29tcGxldGUgKi8KKwl3aGlsZSgocmVhZHcoRVRIRVJfTURfQ0EoZGV2LT5iYXNlX2FkZHIpKSAmIEVUSEVSX01EX0NBX0JVU1lfTVNLKSYmY291bnQpeworCQljb3VudC0tOworCX0KKwlpZiAoIWNvdW50KXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUmVhZCBmcm9tIHBoeSB0aW1lZCBvdXRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIHJlYWR3KEVUSEVSX01EX0RBVEEoZGV2LT5iYXNlX2FkZHIpKTsKK30KKworc3RhdGljIHZvaWQgZXRoZXIwMF9waHlfaW50KGludCBpcnFfbnVtLCB2b2lkKiBkZXZfaWQsIHN0cnVjdCBwdF9yZWdzKiByZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXY9ZGV2X2lkOworCWludCBpcnFfc3RhdHVzOworCisJaXJxX3N0YXR1cz1ldGhlcjAwX3JlYWRfcGh5KGRldiwgUEhZX0lSUV9DT05UUk9MKTsKKworCWlmKGlycV9zdGF0dXMgJiBQSFlfSVJRX0NPTlRST0xfQU5FR19DT01QX0lOVF9NU0speworCQkvKgorCQkgKiBBdXRvbmVnb3RpYXRpb24gY29tcGxldGUgb24gZXB4YTEwZGIuIFRoZSBtYWMgZG9lc24ndAorCQkgKiB0d2lnIGlmIHdlJ3JlIGluIGZ1bGwgZHVwbGV4IHNvIHdlIG5lZWQgdG8gY2hlY2sgdGhlCisJCSAqIHBoeSBzdGF0dXMgcmVnaXN0ZXIgYW5kIGNvbmZpZ3VyZSB0aGUgbWFjIGFjY29yZGluZ2x5CisJCSAqLworCQlpZihldGhlcjAwX3JlYWRfcGh5KGRldiwgUEhZX1NUQVRVUykmKFBIWV9TVEFUVVNfMTBUX0ZfTVNLfFBIWV9TVEFUVVNfMTAwX1hfRl9NU0spKXsKKwkJCWludCB0bXA7CisJCQl0bXA9cmVhZGwoRVRIRVJfTUFDX0NUTChkZXYtPmJhc2VfYWRkcikpOworCQkJd3JpdGVsKHRtcHxFVEhFUl9NQUNfQ1RMX0ZVTExEVVBfTVNLLEVUSEVSX01BQ19DVEwoZGV2LT5iYXNlX2FkZHIpKTsKKwkJfQorCX0KKworCWlmKGlycV9zdGF0dXMmUEhZX0lSUV9DT05UUk9MX0xTX0NIR19JTlRfTVNLKXsKKworCQlpZihldGhlcjAwX3JlYWRfcGh5KGRldiwgUEhZX1NUQVRVUykmIFBIWV9TVEFUVVNfTElOS19NU0speworCQkJLyogTGluayBpcyB1cCAqLworCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQkJLy9wcmludGsoIkNhcnJpZXIgb25cbiIpOworCQl9ZWxzZXsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCQkvL3ByaW50aygiQ2FycmllciBvZmZcbiIpOworCisJCX0KKwl9CisKK30KKworc3RhdGljIHZvaWQgc2V0dXBfYmxpc3RfZW50cnkoc3RydWN0IHNrX2J1ZmYqIHNrYixzdHJ1Y3QgcnhfYmxpc3RfZW50KiBibGlzdF9lbnRfcHRyKXsKKwkvKiBNYWtlIHRoZSBidWZmZXIgY29uc2lzdGVudCB3aXRoIHRoZSBjYWNoZSBhcyB0aGUgbWFjIGlzIGdvaW5nIHRvIHdyaXRlCisJICogZGlyZWN0bHkgaW50byBpdCovCisJYmxpc3RfZW50X3B0ci0+ZmQuRkRTeXN0ZW09KHVuc2lnbmVkIGludClza2I7CisJYmxpc3RfZW50X3B0ci0+YmQuQnVmZkRhdGE9KGNoYXIqKV9fcGEoc2tiLT5kYXRhKTsKKwljb25zaXN0ZW50X3N5bmMoc2tiLT5kYXRhLFBLVF9CVUZfU1osUENJX0RNQV9GUk9NREVWSUNFKTsKKyAgICAgICAgLyogYWxpZ24gSVAgb24gMTYgQnl0ZSAoRE1BX0NUTCBzZXQgdG8gc2tpcCAyIGJ5dGVzKSAqLworCXNrYl9yZXNlcnZlKHNrYiwyKTsKKwlibGlzdF9lbnRfcHRyLT5iZC5CdWZmTGVuZ3RoPVBLVF9CVUZfU1otMjsKKwlibGlzdF9lbnRfcHRyLT5mZC5GRExlbmd0aD0xOworCWJsaXN0X2VudF9wdHItPmZkLkZEQ3RsPUZEQ1RMX0NPV05TRkRfTVNLOworCWJsaXN0X2VudF9wdHItPmJkLkJEQ3RsPUJEQ1RMX0NPV05TQkRfTVNLOworfQorCisKK3N0YXRpYyBpbnQgZXRoZXIwMF9tZW1faW5pdChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXN0cnVjdCBuZXRfcHJpdiogcHJpdj1kZXYtPnByaXY7CisJc3RydWN0IHR4X2ZkYV9lbnQgKnR4X2ZkX3B0ciwqdHhfZW5kX3B0cjsKKwlzdHJ1Y3QgcnhfYmxpc3RfZW50KiBibGlzdF9lbnRfcHRyOworCWludCBpOworCisJLyoKKwkgKiBHcmFiIGEgYmxvY2sgb2Ygb24gY2hpcCBTUkFNIHRvIGNvbnRhaW4gdGhlIGNvbnRyb2wgc3R1Y3R1cmVzIGZvcgorCSAqIHRoZSBldGhlcm5ldCBNQUMuIFRoaXMgdW5jYWNoZWQgYmVjdWFzZSBpdCBuZWVkcyB0byBiZSBhY2Nlc3NlcyBieSBib3RoCisJICogYnVzIG1hc3RlcnMgKGNwdSArIG1hYykuIEhvd2V2ZXIsIGl0IHNob3VsZG4ndCBtYXR0ZXIgdG9vIG11Y2ggaW4gdGVybXMKKwkgKiBvZiBzcGVlZCBhcyBpdHMgb24gY2hpcCBtZW1vcnkKKwkgKi8KKwlwcml2LT5kbWFfZGF0YT1pb3JlbWFwX25vY2FjaGUoRVhDX1NQU1JBTV9CTE9DSzBfQkFTRSxFWENfU1BTUkFNX0JMT0NLMF9TSVpFICk7CisJaWYgKCFwcml2LT5kbWFfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcml2LT5yeF9mZGFfcHRyPShzdHJ1Y3QgcnhfZmRhX2VudCopcHJpdi0+ZG1hX2RhdGE7CisJLyoKKwkgKiBOb3cgc2hhcmUgaXQgb3V0IGFtb25nc3QgdGhlIEZyYW1lIGRlc2NyaXB0b3JzIGFuZCB0aGUgYnVmZmVyIGxpc3QKKwkgKi8KKwlwcml2LT5yeF9ibGlzdF92cD0oc3RydWN0IHJ4X2JsaXN0X2VudCopKCh1bnNpZ25lZCBpbnQpcHJpdi0+ZG1hX2RhdGErUlhfTlVNX0ZERVNDKnNpemVvZihzdHJ1Y3QgcnhfZmRhX2VudCkpOworCisJLyoKKwkgKkluaXRhbGlzZSB0aGUgRkRBIGxpc3QKKwkgKi8KKwkvKiBzZXQgb3duZXJzaGlwIHRvIHRoZSBjb250cm9sbGVyICovCisJbWVtc2V0KHByaXYtPnJ4X2ZkYV9wdHIsMHg4MCxSWF9OVU1fRkRFU0Mqc2l6ZW9mKHN0cnVjdCByeF9mZGFfZW50KSk7CisKKwkvKgorCSAqSW5pdGlhbGlzZSB0aGUgYnVmZmVyIGxpc3QKKwkgKi8KKwlibGlzdF9lbnRfcHRyPXByaXYtPnJ4X2JsaXN0X3ZwOworCWk9MDsKKwl3aGlsZShibGlzdF9lbnRfcHRyPChwcml2LT5yeF9ibGlzdF92cCtSWF9OVU1fQlVGRikpeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlibGlzdF9lbnRfcHRyLT5mZC5GRExlbmd0aD0xOworCQlza2I9ZGV2X2FsbG9jX3NrYihQS1RfQlVGX1NaKTsKKwkJaWYoc2tiKXsKKwkJCXNldHVwX2JsaXN0X2VudHJ5KHNrYixibGlzdF9lbnRfcHRyKTsKKwkJCWJsaXN0X2VudF9wdHItPmZkLkZETmV4dD0oRkRBX0RFU0MqKV9fZG1hX3BhKGJsaXN0X2VudF9wdHIrMSk7CisJCQlibGlzdF9lbnRfcHRyLT5iZC5CRFN0YXQ9aSsrOworCQkJYmxpc3RfZW50X3B0cisrOworCQl9CisJCWVsc2UKKwkJeworCQkJcHJpbnRrKCJGYWlsZWQgdG8gaW5pdGFsaXNlIGJ1ZmZlciBsaXN0XG4iKTsKKwkJfQorCisJfQorCWJsaXN0X2VudF9wdHItLTsKKwlibGlzdF9lbnRfcHRyLT5mZC5GRE5leHQ9KEZEQV9ERVNDKilfX2RtYV9wYShwcml2LT5yeF9ibGlzdF92cCk7CisKKwlwcml2LT50eF9mZGFsaXN0X3ZwPShzdHJ1Y3QgdHhfZmRhX2VudCopKHByaXYtPnJ4X2JsaXN0X3ZwK1JYX05VTV9CVUZGKTsKKworCS8qIEluaXRpYWxpc2UgdGhlIGJ1ZmZlcnMgdG8gYmUgYSBjaXJjdWxhciBsaXN0LiBUaGUgbWFjIHdpbGwgdGhlbiBnbyBwb2xsCisJICogdGhlIGxpc3QgdW50aWwgaXQgZmluZHMgYSBmcmFtZSByZWFkeSB0byB0cmFuc21pdCAqLworCXR4X2VuZF9wdHI9cHJpdi0+dHhfZmRhbGlzdF92cCtUWF9OVU1fRkRFU0M7CisJZm9yKHR4X2ZkX3B0cj1wcml2LT50eF9mZGFsaXN0X3ZwO3R4X2ZkX3B0cjx0eF9lbmRfcHRyO3R4X2ZkX3B0cisrKXsKKwkJdHhfZmRfcHRyLT5mZC5GRE5leHQ9KEZEQV9ERVNDKilfX2RtYV9wYSgodHhfZmRfcHRyKzEpKTsKKwkJdHhfZmRfcHRyLT5mZC5GREN0bD0xOworCQl0eF9mZF9wdHItPmZkLkZEU3RhdD0wOworCQl0eF9mZF9wdHItPmZkLkZETGVuZ3RoPTE7CisKKwl9CisJLyogQ2hhbmdlIHRoZSBsYXN0IEZETmV4dCBwb2ludGVyIHRvIG1ha2UgYSBjaXJjdWxhciBsaXN0ICovCisJdHhfZmRfcHRyLS07CisJdHhfZmRfcHRyLT5mZC5GRE5leHQ9KEZEQV9ERVNDKilfX2RtYV9wYShwcml2LT50eF9mZGFsaXN0X3ZwKTsKKworCS8qIFBvaW50IHRoZSBkZXZpY2UgYXQgdGhlIGNoYWluIG9mIFJ4IGFuZCBUeCBCdWZmZXJzICovCisJd3JpdGVsKCh1bnNpZ25lZCBpbnQpX19kbWFfcGEocHJpdi0+cnhfZmRhX3B0ciksRVRIRVJfRkRBX0JBUyhkZXYtPmJhc2VfYWRkcikpOworCXdyaXRlbCgoUlhfTlVNX0ZERVNDLTEpKnNpemVvZihzdHJ1Y3QgcnhfZmRhX2VudCksRVRIRVJfRkRBX0xJTShkZXYtPmJhc2VfYWRkcikpOworCXdyaXRlbCgodW5zaWduZWQgaW50KV9fZG1hX3BhKHByaXYtPnJ4X2JsaXN0X3ZwKSxFVEhFUl9CTEZSTVBUUihkZXYtPmJhc2VfYWRkcikpOworCisJd3JpdGVsKCh1bnNpZ25lZCBpbnQpX19kbWFfcGEocHJpdi0+dHhfZmRhbGlzdF92cCksRVRIRVJfVFhGUk1QVFIoZGV2LT5iYXNlX2FkZHIpKTsKKworCXJldHVybiAwOworfQorCisKK3ZvaWQgZXRoZXIwMF9tZW1fdXBkYXRlKHZvaWQqIGRldl9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2PWRldl9pZDsKKwlzdHJ1Y3QgbmV0X3ByaXYqIHByaXY9ZGV2LT5wcml2OworCXN0cnVjdCBza19idWZmKiBza2I7CisJc3RydWN0IHR4X2ZkYV9lbnQgKmZkYV9wdHI9cHJpdi0+dHhfZmRhbGlzdF92cDsKKwlzdHJ1Y3QgcnhfYmxpc3RfZW50KiBibGlzdF9lbnRfcHRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcml2LT50cV9tZW11cGRhdGUuc3luYz0wOworCS8vcHJpdi0+dHFfbWVtdXBkYXRlLmxpc3Q9CisJcHJpdi0+bWVtdXBkYXRlX3NjaGVkdWxlZD0wOworCisJLyogVHJhbnNtaXQgaW50ZXJydXB0ICovCisJd2hpbGUoZmRhX3B0cjwocHJpdi0+dHhfZmRhbGlzdF92cCtUWF9OVU1fRkRFU0MpKXsKKwkJaWYoIShGRENUTF9DT1dOU0ZEX01TSyZmZGFfcHRyLT5mZC5GREN0bCkgJiYgKEVUSEVSX1RYX1NUQVRfQ09NUF9NU0smZmRhX3B0ci0+ZmQuRkRTdGF0KSl7CisJCQlwcml2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlwcml2LT5zdGF0cy50eF9ieXRlcys9ZmRhX3B0ci0+YmQuQnVmZkxlbmd0aDsKKwkJCXNrYj0oc3RydWN0IHNrX2J1ZmYqKWZkYV9wdHItPmZkLkZEU3lzdGVtOworCQkJLy9wcmludGsoIiVkOnR4Y2xuOmZkYT0lI3ggc2tiPSUjeFxuIixqaWZmaWVzLGZkYV9wdHIsc2tiKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCWZkYV9wdHItPmZkLkZEU3lzdGVtPTA7CisJCQlmZGFfcHRyLT5mZC5GRFN0YXQ9MDsKKwkJCWZkYV9wdHItPmZkLkZEQ3RsPTA7CisJCX0KKwkJZmRhX3B0cisrOworCX0KKwkvKiBGaWxsIGluIGFueSBtaXNzaW5nIGJ1ZmZlcnMgZnJvbSB0aGUgcmVjZWl2ZWQgcXVldWUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cnhfbG9jayxmbGFncyk7CisJYmxpc3RfZW50X3B0cj1wcml2LT5yeF9ibGlzdF92cDsKKwl3aGlsZShibGlzdF9lbnRfcHRyPChwcml2LT5yeF9ibGlzdF92cCtSWF9OVU1fQlVGRikpeworCQkvKiBmZC5GRFN5c3RlbSBvZiAwIGluZGljYXRlcyB3ZSBmYWlsZWQgdG8gYWxsb2NhdGUgdGhlIGJ1ZmZlciBpbiB0aGUgSVNSICovCisJCWlmKCFibGlzdF9lbnRfcHRyLT5mZC5GRFN5c3RlbSl7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJc2tiPWRldl9hbGxvY19za2IoUEtUX0JVRl9TWik7CisJCQlibGlzdF9lbnRfcHRyLT5mZC5GRFN5c3RlbT0odW5zaWduZWQgaW50KXNrYjsKKwkJCWlmKHNrYil7CisJCQkJc2V0dXBfYmxpc3RfZW50cnkoc2tiLGJsaXN0X2VudF9wdHIpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJsaXN0X2VudF9wdHIrKzsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbG9jayxmbGFncyk7CisJaWYocHJpdi0+cXVldWVfc3RvcHBlZCl7CisJCS8vcHJpbnRrKCIlZDpjbG46c3RhcnQgcVxuIixqaWZmaWVzKTsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwl9CisJaWYocHJpdi0+cnhfZGlzYWJsZWQpeworCQkvL3ByaW50aygiJWQ6ZW5hYmxlX2lycVxuIixqaWZmaWVzKTsKKwkJcHJpdi0+cnhfZGlzYWJsZWQ9MDsKKwkJd3JpdGVsKEVUSEVSX1JYX0NUTF9SWEVOX01TSyxFVEhFUl9SWF9DVEwoZGV2LT5iYXNlX2FkZHIpKTsKKworCX0KK30KKworCitzdGF0aWMgdm9pZCBldGhlcjAwX2ludCggaW50IGlycV9udW0sIHZvaWQqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MqIHJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UqIGRldj1kZXZfaWQ7CisJc3RydWN0IG5ldF9wcml2KiBwcml2PWRldi0+cHJpdjsKKworCXVuc2lnbmVkIGludCAgIGludGVycnVwdFZhbHVlOworCisJaW50ZXJydXB0VmFsdWU9cmVhZGwoRVRIRVJfSU5UX1NSQyhkZXYtPmJhc2VfYWRkcikpOworCisJLy9wcmludGsoIklOVF9TUkM9JXhcbiIsaW50ZXJydXB0VmFsdWUpOworCisJaWYoIShyZWFkbChFVEhFUl9JTlRfU1JDKGRldi0+YmFzZV9hZGRyKSkgJiBFVEhFUl9JTlRfU1JDX0lSUV9NU0spKQorCXsKKwkJcmV0dXJuOwkJLyogSW50ZXJydXB0IHdhc24ndCBjYXVzZWQgYnkgdXMhISAqLworCX0KKworCWlmKHJlYWRsKEVUSEVSX0lOVF9TUkMoZGV2LT5iYXNlX2FkZHIpKSYKKwkgICAoRVRIRVJfSU5UX1NSQ19JTlRNQUNSWF9NU0sgfAorCSAgICBFVEhFUl9JTlRfU1JDX0ZEQUVYX01TSyB8CisJICAgIEVUSEVSX0lOVF9TUkNfQkxFWF9NU0spKSB7CisJCXN0cnVjdCByeF9ibGlzdF9lbnQqIGJsaXN0X2VudF9wdHI7CisJCXN0cnVjdCByeF9mZGFfZW50KiBmZGFfZW50X3B0cjsKKwkJc3RydWN0IHNrX2J1ZmYqIHNrYjsKKworCQlmZGFfZW50X3B0cj1wcml2LT5yeF9mZGFfcHRyOworCQlzcGluX2xvY2soJnByaXYtPnJ4X2xvY2spOworCQl3aGlsZShmZGFfZW50X3B0cjwocHJpdi0+cnhfZmRhX3B0citSWF9OVU1fRkRFU0MpKXsKKwkJCWludCByZXN1bHQ7CisKKwkJCWlmKCEoZmRhX2VudF9wdHItPmZkLkZEQ3RsJkZEQ1RMX0NPV05TRkRfTVNLKSkKKwkJCXsKKwkJCQkvKiBUaGlzIGZyYW1lIGlzIHJlYWR5IGZvciBwcm9jZXNzaW5nICovCisJCQkJLypmaW5kIHRoZSBjb3JyZXNwb25kaW5nIGJ1ZmZlciBpbiB0aGUgYnVmZmVybGlzdCAqLworCQkJCWJsaXN0X2VudF9wdHI9cHJpdi0+cnhfYmxpc3RfdnArZmRhX2VudF9wdHItPmJkLkJEU3RhdDsKKwkJCQlza2I9KHN0cnVjdCBza19idWZmKilibGlzdF9lbnRfcHRyLT5mZC5GRFN5c3RlbTsKKworCQkJCS8qIFBhc3MgdGhpcyBza2IgdXAgdGhlIHN0YWNrICovCisJCQkJc2tiLT5kZXY9ZGV2OworCQkJCXNrYl9wdXQoc2tiLGZkYV9lbnRfcHRyLT5mZC5GRExlbmd0aCk7CisJCQkJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJCQlza2ItPmlwX3N1bW1lZD1DSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJCQlyZXN1bHQ9bmV0aWZfcngoc2tiKTsKKwkJCQkvKiBVcGRhdGUgc3RhdGlzdGljcyAqLworCQkJCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlwcml2LT5zdGF0cy5yeF9ieXRlcys9ZmRhX2VudF9wdHItPmZkLkZETGVuZ3RoOworCisJCQkJLyogRnJlZSB0aGUgRkRBIGVudHJ5ICovCisJCQkJZmRhX2VudF9wdHItPmJkLkJEU3RhdD0weGZmOworCQkJCWZkYV9lbnRfcHRyLT5mZC5GREN0bD1GRENUTF9DT1dOU0ZEX01TSzsKKworCQkJCS8qIEFsbG9jYXRlIGEgbmV3IHNrYiBhbmQgcG9pbnQgdGhlIGJkIGVudHJ5IHRvIGl0ICovCisJCQkJYmxpc3RfZW50X3B0ci0+ZmQuRkRTeXN0ZW09MDsKKwkJCQlza2I9ZGV2X2FsbG9jX3NrYihQS1RfQlVGX1NaKTsKKwkJCQkvL3ByaW50aygiYWxsb2Nza2I9JSN4XG4iLHNrYik7CisJCQkJaWYoc2tiKXsKKwkJCQkJc2V0dXBfYmxpc3RfZW50cnkoc2tiLGJsaXN0X2VudF9wdHIpOworCisJCQkJfQorCQkJCWVsc2UgaWYoIXByaXYtPm1lbXVwZGF0ZV9zY2hlZHVsZWQpeworCQkJCQlpbnQgdG1wOworCQkJCQkvKiBUaGVyZSBhcmUgbm8gYnVmZmVycyBhdCB0aGUgbW9tZW50LCBzbyBzY2hlZHVsZSAqLworCQkJCQkvKiB0aGUgYmFja2dyb3VuZCB0YXNrIHRvIHNvcnQgdGhpcyBvdXQgKi8KKwkJCQkJc2NoZWR1bGVfdGFzaygmcHJpdi0+dHFfbWVtdXBkYXRlKTsKKwkJCQkJcHJpdi0+bWVtdXBkYXRlX3NjaGVkdWxlZD0xOworCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6Tm8gYnVmZmVycyIsZGV2LT5uYW1lKTsKKwkJCQkJLyogSWYgdGhpcyBpbnRlcnJ1cHQgd2FzIGR1ZSB0byBhIGxhY2sgb2YgYnVmZmVycyB0aGVuCisJCQkJCSAqIHdlJ2QgYmV0dGVyIHN0b3AgdGhlIHJlY2VpdmVyIHRvbyAqLworCQkJCQlpZihpbnRlcnJ1cHRWYWx1ZSZFVEhFUl9JTlRfU1JDX0JMRVhfTVNLKXsKKwkJCQkJCXByaXYtPnJ4X2Rpc2FibGVkPTE7CisJCQkJCQl0bXA9cmVhZGwoRVRIRVJfSU5UX1NSQyhkZXYtPmJhc2VfYWRkcikpOworCQkJCQkJd3JpdGVsKHRtcCZ+RVRIRVJfUlhfQ1RMX1JYRU5fTVNLLEVUSEVSX1JYX0NUTChkZXYtPmJhc2VfYWRkcikpOworCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOkhhbHRpbmcgcngiLGRldi0+bmFtZSk7CisJCQkJCX0KKworCQkJCX0KKworCQkJfQorCQkJZmRhX2VudF9wdHIrKzsKKwkJfQorCQlzcGluX3VubG9jaygmcHJpdi0+cnhfbG9jayk7CisKKwkJLyogQ2xlYXIgdGhlICBpbnRlcnJ1cHRzICovCisJCXdyaXRlbChFVEhFUl9JTlRfU1JDX0lOVE1BQ1JYX01TSyB8IEVUSEVSX0lOVF9TUkNfRkRBRVhfTVNLCisJCSAgICAgICB8IEVUSEVSX0lOVF9TUkNfQkxFWF9NU0ssRVRIRVJfSU5UX1NSQyhkZXYtPmJhc2VfYWRkcikpOworCisJfQorCisJaWYocmVhZGwoRVRIRVJfSU5UX1NSQyhkZXYtPmJhc2VfYWRkcikpJkVUSEVSX0lOVF9TUkNfSU5UTUFDVFhfTVNLKXsKKworCQlpZighcHJpdi0+bWVtdXBkYXRlX3NjaGVkdWxlZCl7CisJCQlzY2hlZHVsZV90YXNrKCZwcml2LT50cV9tZW11cGRhdGUpOworCQkJcHJpdi0+bWVtdXBkYXRlX3NjaGVkdWxlZD0xOworCQl9CisJCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KKwkJd3JpdGVsKEVUSEVSX0lOVF9TUkNfSU5UTUFDVFhfTVNLLEVUSEVSX0lOVF9TUkMoZGV2LT5iYXNlX2FkZHIpKTsKKwl9CisKKwlpZiAocmVhZGwoRVRIRVJfSU5UX1NSQyhkZXYtPmJhc2VfYWRkcikpICYgKEVUSEVSX0lOVF9TUkNfU1dJTlRfTVNLfAorCQkJCQkJICAgIEVUSEVSX0lOVF9TUkNfSU5URUFSTk9UX01TS3wKKwkJCQkJCSAgICBFVEhFUl9JTlRfU1JDX0lOVExJTktfTVNLfAorCQkJCQkJICAgIEVUSEVSX0lOVF9TUkNfSU5URVhCRF9NU0t8CisJCQkJCQkgICAgRVRIRVJfSU5UX1NSQ19JTlRUWENUTENNUF9NU0spKQorCXsKKwkJLyoKKwkJICoJTm90IHVzaW5nIGFueSBvZiB0aGVzZSBzbyB0aGV5IHNob3VsZG4ndCBoYXBwZW4KKwkJICoKKwkJICoJSW4gdGhlIGNhc2VkIG9mIElOVEVYQkQgLSBpZiB5b3UgYWxsb2NhdGUgbW9yZQorCQkgKiAgICAgIHRoYW4gMjggZGVjc3JpcHRvcnMgeW91IG1heSBuZWVkIHRvIHRoaW5rIGFib3V0IHRoaXMKKwkJICovCisJCXByaW50aygiTm90IHVzaW5nIHRoaXMgaW50ZXJydXB0XG4iKTsKKwl9CisKKwlpZiAocmVhZGwoRVRIRVJfSU5UX1NSQyhkZXYtPmJhc2VfYWRkcikpICYKKwkgICAgKEVUSEVSX0lOVF9TUkNfSU5UU0JVU19NU0sgfAorCSAgICAgRVRIRVJfSU5UX1NSQ19JTlROUkFCVF9NU0sKKwkgICAgIHxFVEhFUl9JTlRfU1JDX0RNUEFSRVJSX01TSykpCisJeworCQkvKgorCQkgKiBIYXJkd2FyZSBlcnJvcnMsIHdlIGNhbiBlaXRoZXIgaWdub3JlIHRoZW0gYW5kIGhvcGUgdGhleSBnbyBhd2F5CisJCSAqb3IgcmVzZXQgdGhlIGRldmljZSwgSSdsbCB0cnkgdGhlIGZpcnN0IGZvciBub3cgdG8gc2VlIGlmIHRoZXkgaGFwcGVuCisJCSAqLworCQlwcmludGsoIkhhcmR3YXJlIGVycm9yXG4iKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGV0aGVyMDBfc2V0dXBfZXRoZXJuZXRfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCWludCB0bXA7CisKKwlkZXYtPmFkZHJfbGVuPTY7CisJd3JpdGV3KDAsRVRIRVJfQVJDX0FEUihkZXYtPmJhc2VfYWRkcikpOworCXdyaXRlbCgoZGV2LT5kZXZfYWRkclswXTw8MjQpIHwKKwkJKGRldi0+ZGV2X2FkZHJbMV08PDE2KSB8CisJCShkZXYtPmRldl9hZGRyWzJdPDw4KSB8CisJCWRldi0+ZGV2X2FkZHJbM10sCisJCUVUSEVSX0FSQ19EQVRBKGRldi0+YmFzZV9hZGRyKSk7CisKKwl3cml0ZXcoNCxFVEhFUl9BUkNfQURSKGRldi0+YmFzZV9hZGRyKSk7CisJdG1wPXJlYWRsKEVUSEVSX0FSQ19EQVRBKGRldi0+YmFzZV9hZGRyKSk7CisJdG1wJj0weGZmZmY7CisJdG1wfD0oZGV2LT5kZXZfYWRkcls0XTw8MjQpIHwgKGRldi0+ZGV2X2FkZHJbNV08PDE2KTsKKwl3cml0ZWwodG1wLCBFVEhFUl9BUkNfREFUQShkZXYtPmJhc2VfYWRkcikpOworCS8qIEVuYWJsZSB0aGlzIGVudHJ5IGluIHRoZSBBUkMgKi8KKworCXdyaXRlbCgxLEVUSEVSX0FSQ19FTkEoZGV2LT5iYXNlX2FkZHIpKTsKKworCXJldHVybjsKK30KKworCitzdGF0aWMgdm9pZCBldGhlcjAwX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogcmVzZXQgdGhlIGNvbnRyb2xsZXIgKi8KKwl3cml0ZXcoRVRIRVJfTUFDX0NUTF9SRVNFVF9NU0ssRVRIRVJfTUFDX0NUTChkZXYtPmJhc2VfYWRkcikpOworCisJLyoKKwkgKiBNYWtlIHN1cmUgd2UncmUgbm90IGdvaW5nIHRvIHNlbmQgYW55dGhpbmcKKwkgKi8KKworCXdyaXRldyhFVEhFUl9UWF9DVExfVFhIQUxUX01TSyxFVEhFUl9UWF9DVEwoZGV2LT5iYXNlX2FkZHIpKTsKKworCS8qCisJICogTWFrZSBzdXJlIHdlJ3JlIG5vdCBnb2luZyB0byByZWNlaXZlIGFueXRoaW5nCisJICovCisJd3JpdGV3KEVUSEVSX1JYX0NUTF9SWEhBTFRfTVNLLEVUSEVSX1JYX0NUTChkZXYtPmJhc2VfYWRkcikpOworCisJLyoKKwkgKiBEaXNhYmxlIEludGVycnVwdHMgZm9yIG5vdywgYW5kIHNldCB0aGUgYnVyc3Qgc2l6ZSB0byA4IGJ5dGVzCisJICovCisKKwl3cml0ZWwoRVRIRVJfRE1BX0NUTF9JTlRNQVNLX01TSyB8CisJICAgICAgICgoOCA8PCBFVEhFUl9ETUFfQ1RMX0RNQlVSU1RfT0ZTVCkgJiBFVEhFUl9ETUFfQ1RMX0RNQlVSU1RfTVNLKQorCSAgICAgICB8KDI8PEVUSEVSX0RNQV9DVExfUlhBTElHTl9PRlNUKSwKKwkgICAgICAgRVRIRVJfRE1BX0NUTChkZXYtPmJhc2VfYWRkcikpOworCisKKwkvKgorCSAqIFNldCBUeFRocnNoIC0gc3RhcnQgdHJhbnNtaXR0aW5nIGEgcGFja2V0IGFmdGVyIDE1MTQKKwkgKiBieXRlcyBvciB3aGVuIGEgcGFja2V0IGlzIGNvbXBsZXRlLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QKKwkgKi8KKwkgd3JpdGV3KDE1MTQsRVRIRVJfVFhUSFJTSChkZXYtPmJhc2VfYWRkcikpOworCisJLyoKKwkgKiBTZXQgVHhQb2xsQ3RyLiAgRWFjaCBjeWNsZSBpcworCSAqIDYxLjQ0IG1pY3Jvc2Vjb25kcyB3aXRoIGEgMzMgTUh6IGJ1cworCSAqLworCSB3cml0ZXcoMSxFVEhFUl9UWFBPTExDVFIoZGV2LT5iYXNlX2FkZHIpKTsKKworCS8qCisJICogU2V0IFJ4X0N0bCAtIFR1cm4gb2ZmIHJlY2VwdGlvbiBhbmQgbGV0IFJ4RGF0YSB0dXJuIGl0CisJICogb24gbGF0ZXIKKwkgKi8KKwkgd3JpdGV3KEVUSEVSX1JYX0NUTF9SWEhBTFRfTVNLLEVUSEVSX1JYX0NUTChkZXYtPmJhc2VfYWRkcikpOworCit9CisKKworc3RhdGljIHZvaWQgZXRoZXIwMF9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJaW50IGNvdW50PWRldi0+bWNfY291bnQ7CisKKwkvKiBTZXQgcHJvbWlzY3VvdXMgbW9kZSBpZiBpdCdzIGFza2VkIGZvci4gKi8KKworCWlmIChkZXYtPmZsYWdzJklGRl9QUk9NSVNDKXsKKworCQl3cml0ZXcoIEVUSEVSX0FSQ19DVExfQ09NUEVOX01TSyB8CisJCQlFVEhFUl9BUkNfQ1RMX0JST0FEQUNDX01TSyB8CisJCQlFVEhFUl9BUkNfQ1RMX0dST1VQQUNDX01TSyB8CisJCQlFVEhFUl9BUkNfQ1RMX1NUQVRJT05BQ0NfTVNLLAorCQkJRVRIRVJfQVJDX0NUTChkZXYtPmJhc2VfYWRkcikpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBHZXQgYWxsIG11bHRpY2FzdCBwYWNrZXRzIGlmIHJlcXVpcmVkLCBvciBpZiB0aGVyZSBhcmUgdG9vCisJICogbWFueSBhZGRyZXNzZXMgdG8gZml0IGluIGhhcmR3YXJlCisJICovCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpeworCQl3cml0ZXcoIEVUSEVSX0FSQ19DVExfQ09NUEVOX01TSyB8CisJCQlFVEhFUl9BUkNfQ1RMX0dST1VQQUNDX01TSyB8CisJCQlFVEhFUl9BUkNfQ1RMX0JST0FEQUNDX01TSywKKwkJCUVUSEVSX0FSQ19DVEwoZGV2LT5iYXNlX2FkZHIpKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZGV2LT5tY19jb3VudCA+IChFVEhFUl9BUkNfU0laRSAtIDEpKXsKKworCQlwcmludGsoS0VSTl9XQVJOSU5HICJUb28gbWFueSBtdWx0aWNhc3QgYWRkcmVzc2VzIGZvciBoYXJkd2FyZSB0byBmaWx0ZXIgLSByZWNlaXZpbmcgYWxsIG11bHRpY2FzdCBwYWNrZXRzXG4iKTsKKwkJd3JpdGV3KCBFVEhFUl9BUkNfQ1RMX0NPTVBFTl9NU0sgfAorCQkJRVRIRVJfQVJDX0NUTF9HUk9VUEFDQ19NU0sgfAorCQkJRVRIRVJfQVJDX0NUTF9CUk9BREFDQ19NU0ssCisJCQlFVEhFUl9BUkNfQ1RMKGRldi0+YmFzZV9hZGRyKSk7CisJCXJldHVybjsKKwl9CisKKwlpZihkZXYtPm1jX2NvdW50KXsKKwkJc3RydWN0IGRldl9tY19saXN0ICptY19saXN0X2VudD1kZXYtPm1jX2xpc3Q7CisJCXVuc2lnbmVkIGludCB0ZW1wLGk7CisJCURFQlVHKHByaW50aygibWNfY291bnQ9JWQgbWNfbGlzdD0lI3hcbiIsZGV2LT4gbWNfY291bnQsIGRldi0+bWNfbGlzdCkpOworCQlERUJVRyhwcmludGsoIm1jIGFkZHI9JTAyI3glMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKKwkJCSAgICAgbWNfbGlzdF9lbnQtPmRtaV9hZGRyWzVdLAorCQkJICAgICBtY19saXN0X2VudC0+ZG1pX2FkZHJbNF0sCisJCQkgICAgIG1jX2xpc3RfZW50LT5kbWlfYWRkclszXSwKKwkJCSAgICAgbWNfbGlzdF9lbnQtPmRtaV9hZGRyWzJdLAorCQkJICAgICBtY19saXN0X2VudC0+ZG1pX2FkZHJbMV0sCisJCQkgICAgIG1jX2xpc3RfZW50LT5kbWlfYWRkclswXSk7KQorCisJCS8qCisJCSAqIFRoZSBmaXJzdCA2IGJ5dGVzIGFyZSB0aGUgTUFDIGFkZHJlc3MsIHNvCisJCSAqIGRvbid0IGNoYW5nZSB0aGVtIQorCQkgKi8KKwkJd3JpdGV3KDQsRVRIRVJfQVJDX0FEUihkZXYtPmJhc2VfYWRkcikpOworCQl0ZW1wPXJlYWRsKEVUSEVSX0FSQ19EQVRBKGRldi0+YmFzZV9hZGRyKSk7CisJCXRlbXAmPTB4ZmZmZjAwMDA7CisKKwkJLyogRGlzYWJsZSB0aGUgY3VycmVudCBtdWx0aWNhc3Qgc3R1ZmYgKi8KKwkJd3JpdGVsKDEsRVRIRVJfQVJDX0VOQShkZXYtPmJhc2VfYWRkcikpOworCisJCWZvcig7Oyl7CisJCQl0ZW1wfD1tY19saXN0X2VudC0+ZG1pX2FkZHJbMV0gfAorCQkJCW1jX2xpc3RfZW50LT5kbWlfYWRkclswXTw8ODsKKwkJCXdyaXRlbCh0ZW1wLEVUSEVSX0FSQ19EQVRBKGRldi0+YmFzZV9hZGRyKSk7CisKKwkJCWk9cmVhZGwoRVRIRVJfQVJDX0FEUihkZXYtPmJhc2VfYWRkcikpOworCQkJd3JpdGV3KGkrNCxFVEhFUl9BUkNfQURSKGRldi0+YmFzZV9hZGRyKSk7CisKKwkJCXRlbXA9bWNfbGlzdF9lbnQtPmRtaV9hZGRyWzVdfAorCQkJCW1jX2xpc3RfZW50LT5kbWlfYWRkcls0XTw8OCB8CisJCQkJbWNfbGlzdF9lbnQtPmRtaV9hZGRyWzNdPDwxNiB8CisJCQkJbWNfbGlzdF9lbnQtPmRtaV9hZGRyWzJdPDwyNDsKKwkJCXdyaXRlbCh0ZW1wLEVUSEVSX0FSQ19EQVRBKGRldi0+YmFzZV9hZGRyKSk7CisKKwkJCWNvdW50LS07CisJCQlpZighbWNfbGlzdF9lbnQtPm5leHQgfHwgIWNvdW50KXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCURFQlVHKHByaW50aygibWNfbGlzdF9uZXh0PSUjeFxuIixtY19saXN0X2VudC0+bmV4dCk7KQorCQkJbWNfbGlzdF9lbnQ9bWNfbGlzdF9lbnQtPm5leHQ7CisKKworCQkJaT1yZWFkbChFVEhFUl9BUkNfQURSKGRldi0+YmFzZV9hZGRyKSk7CisJCQl3cml0ZWwoaSs0LEVUSEVSX0FSQ19BRFIoZGV2LT5iYXNlX2FkZHIpKTsKKworCQkJdGVtcD1tY19saXN0X2VudC0+ZG1pX2FkZHJbM118CisJCQkJbWNfbGlzdF9lbnQtPmRtaV9hZGRyWzJdPDw4IHwKKwkJCQltY19saXN0X2VudC0+ZG1pX2FkZHJbMV08PDE2IHwKKwkJCQltY19saXN0X2VudC0+ZG1pX2FkZHJbMF08PDI0OworCQkJd3JpdGVsKHRlbXAsRVRIRVJfQVJDX0RBVEEoZGV2LT5iYXNlX2FkZHIpKTsKKworCQkJaT1yZWFkbChFVEhFUl9BUkNfQURSKGRldi0+YmFzZV9hZGRyKSk7CisJCQl3cml0ZWwoaSs0LEVUSEVSX0FSQ19BRFIoZGV2LT5iYXNlX2FkZHIpKTsKKworCQkJdGVtcD1tY19saXN0X2VudC0+ZG1pX2FkZHJbNF08PDE2IHwKKwkJCQltY19saXN0X2VudC0+ZG1pX2FkZHJbNV08PDI0OworCisJCQl3cml0ZWwodGVtcCxFVEhFUl9BUkNfREFUQShkZXYtPmJhc2VfYWRkcikpOworCisJCQljb3VudC0tOworCQkJaWYoIW1jX2xpc3RfZW50LT5uZXh0IHx8ICFjb3VudCl7CisJCQkJYnJlYWs7CisJCQl9CisJCQltY19saXN0X2VudD1tY19saXN0X2VudC0+bmV4dDsKKwkJfQorCisKKwkJaWYoY291bnQpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJNdWx0aWNhc3QgbGlzdCBzaXplIGVycm9yXG4iKTsKKworCisJCXdyaXRldyggRVRIRVJfQVJDX0NUTF9CUk9BREFDQ19NU0t8CisJCQlFVEhFUl9BUkNfQ1RMX0NPTVBFTl9NU0ssCisJCQlFVEhFUl9BUkNfQ1RMKGRldi0+YmFzZV9hZGRyKSk7CisKKwl9CisKKwkvKiBlbmFibGUgdGhlIGFjdGl2ZSBBUkMgZW50aWVzICovCisJd3JpdGV3KCgxPDwoY291bnQrMikpLTEsRVRIRVJfQVJDX0VOQShkZXYtPmJhc2VfYWRkcikpOworfQorCisKK3N0YXRpYyBpbnQgZXRoZXIwMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJaW50IHJlc3VsdCx0bXA7CisJc3RydWN0IG5ldF9wcml2KiBwcml2OworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEluc3RhbGwgaW50ZXJydXB0IGhhbmRsZXJzICovCisJcmVzdWx0PXJlcXVlc3RfaXJxKGRldi0+aXJxLGV0aGVyMDBfaW50LDAsImV0aGVyMDAiLGRldik7CisJaWYocmVzdWx0KQorCQlnb3RvIG9wZW5fZXJyMTsKKworCXJlc3VsdD1yZXF1ZXN0X2lycSgyLGV0aGVyMDBfcGh5X2ludCwwLCJldGhlcjAwX3BoeSIsZGV2KTsKKwlpZihyZXN1bHQpCisJCWdvdG8gb3Blbl9lcnIyOworCisJZXRoZXIwMF9yZXNldChkZXYpOworCXJlc3VsdD1ldGhlcjAwX21lbV9pbml0KGRldik7CisJaWYocmVzdWx0KQorCQlnb3RvIG9wZW5fZXJyMzsKKworCisJZXRoZXIwMF9zZXR1cF9ldGhlcm5ldF9hZGRyZXNzKGRldik7CisKKwlldGhlcjAwX3NldF9tdWx0aWNhc3QoZGV2KTsKKworCXJlc3VsdD1ldGhlcjAwX3dyaXRlX3BoeShkZXYsUEhZX0NPTlRST0wsIFBIWV9DT05UUk9MX0FORUdFTl9NU0sgfCBQSFlfQ09OVFJPTF9SQU5FR19NU0spOworCWlmKHJlc3VsdCkKKwkJZ290byBvcGVuX2VycjQ7CisJcmVzdWx0PWV0aGVyMDBfd3JpdGVfcGh5KGRldixQSFlfSVJRX0NPTlRST0wsIFBIWV9JUlFfQ09OVFJPTF9MU19DSEdfSUVfTVNLIHwKKwkJCQkgUEhZX0lSUV9DT05UUk9MX0FORUdfQ09NUF9JRV9NU0spOworCWlmKHJlc3VsdCkKKwkJZ290byBvcGVuX2VycjQ7CisKKwkvKiBTdGFydCB0aGUgZGV2aWNlIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJd3JpdGV3KEVUSEVSX1JYX0NUTF9SWEVOX01TSworLy8JICAgICAgIHwgRVRIRVJfUlhfQ1RMX1NUUklQQ1JDX01TSworCSAgICAgICB8IEVUSEVSX1JYX0NUTF9FTkdPT0RfTVNLCisJICAgICAgIHwgRVRIRVJfUlhfQ1RMX0VOUlhQQVJfTVNLfCBFVEhFUl9SWF9DVExfRU5MT05HRVJSX01TSworCSAgICAgICB8IEVUSEVSX1JYX0NUTF9FTk9WRVJfTVNLfCBFVEhFUl9SWF9DVExfRU5DUkNFUlJfTVNLLAorCSAgICAgICBFVEhFUl9SWF9DVEwoZGV2LT5iYXNlX2FkZHIpKTsKKworCXdyaXRldyhFVEhFUl9UWF9DVExfVFhFTl9NU0t8CisJICAgICAgIEVUSEVSX1RYX0NUTF9FTkVYREVGRVJfTVNLfAorCSAgICAgICBFVEhFUl9UWF9DVExfRU5MQ0FSUl9NU0t8CisJICAgICAgIEVUSEVSX1RYX0NUTF9FTkVYQ09MTF9NU0t8CisJICAgICAgIEVUSEVSX1RYX0NUTF9FTkxBVEVDT0xMX01TS3wKKwkgICAgICAgRVRIRVJfVFhfQ1RMX0VOVFhQQVJfTVNLfAorCSAgICAgICBFVEhFUl9UWF9DVExfRU5DT01QX01TSywKKwkgICAgICAgRVRIRVJfVFhfQ1RMKGRldi0+YmFzZV9hZGRyKSk7CisKKwl0bXA9cmVhZGwoRVRIRVJfRE1BX0NUTChkZXYtPmJhc2VfYWRkcikpOworCXdyaXRlbCh0bXAmfkVUSEVSX0RNQV9DVExfSU5UTUFTS19NU0ssRVRIRVJfRE1BX0NUTChkZXYtPmJhc2VfYWRkcikpOworCisJcmV0dXJuIDA7CisKKyBvcGVuX2VycjQ6CisJZXRoZXIwMF9yZXNldChkZXYpOworIG9wZW5fZXJyMzoKKwlmcmVlX2lycSgyLGRldik7Cisgb3Blbl9lcnIyOgorCWZyZWVfaXJxKGRldi0+aXJxLGRldik7Cisgb3Blbl9lcnIxOgorCXJldHVybiByZXN1bHQ7CisKK30KKworCitzdGF0aWMgaW50IGV0aGVyMDBfdHgoc3RydWN0IHNrX2J1ZmYqIHNrYiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlzdHJ1Y3QgbmV0X3ByaXYgKnByaXY9ZGV2LT5wcml2OworCXN0cnVjdCB0eF9mZGFfZW50ICpmZGFfcHRyOworCWludCBpOworCisKKwkvKgorCSAqCUZpbmQgYW4gZW1wdHkgc2xvdCBpbiB3aGljaCB0byBzdGljayB0aGUgZnJhbWUKKwkgKi8KKwlmZGFfcHRyPShzdHJ1Y3QgdHhfZmRhX2VudCopX19kbWFfdmEocmVhZGwoRVRIRVJfVFhGUk1QVFIoZGV2LT5iYXNlX2FkZHIpKSk7CisJaT0wOworCXdoaWxlKGk8VFhfTlVNX0ZERVNDKXsKKwkJaWYgKGZkYV9wdHItPmZkLkZEU3RhdHx8KGZkYV9wdHItPmZkLkZEQ3RsICYgRkRDVExfQ09XTlNGRF9NU0spKXsKKwkJCWZkYV9wdHIgPShzdHJ1Y3QgdHhfZmRhX2VudCopIF9fZG1hX3ZhKChzdHJ1Y3QgdHhfZmRhX2VudCopZmRhX3B0ci0+ZmQuRkROZXh0KTsKKwkJfQorCQllbHNlIHsKKwkJCWJyZWFrOworCQl9CisJCWkrKzsKKwl9CisKKwkvKiBXcml0ZSB0aGUgc2tiIGRhdGEgZnJvbSB0aGUgY2FjaGUqLworCWNvbnNpc3RlbnRfc3luYyhza2ItPmRhdGEsc2tiLT5sZW4sUENJX0RNQV9UT0RFVklDRSk7CisJZmRhX3B0ci0+YmQuQnVmZkRhdGE9KGNoYXIqKV9fcGEoc2tiLT5kYXRhKTsKKwlmZGFfcHRyLT5iZC5CdWZmTGVuZ3RoPSh1bnNpZ25lZCBzaG9ydClza2ItPmxlbjsKKwkvKiBTYXZlIHRoZSBwb2ludGVyIHRvIHRoZSBza2IgZm9yIGZyZWVpbmcgbGF0ZXIgKi8KKwlmZGFfcHRyLT5mZC5GRFN5c3RlbT0odW5zaWduZWQgaW50KXNrYjsKKwlmZGFfcHRyLT5mZC5GRFN0YXQ9MDsKKwkvKiBQYXNzIG93bmVyc2hpcCBvZiB0aGUgYnVmZmVycyB0byB0aGUgY29udHJvbGxlciAqLworCWZkYV9wdHItPmZkLkZEQ3RsPTE7CisJZmRhX3B0ci0+ZmQuRkRDdGx8PUZEQ1RMX0NPV05TRkRfTVNLOworCisJLyogSWYgdGhlIG5leHQgYnVmZmVyIGluIHRoZSBsaXN0IGlzIGZ1bGwsIHN0b3AgdGhlIHF1ZXVlICovCisJZmRhX3B0cj0oc3RydWN0IHR4X2ZkYV9lbnQqKV9fZG1hX3ZhKGZkYV9wdHItPmZkLkZETmV4dCk7CisJaWYgKChmZGFfcHRyLT5mZC5GRFN0YXQpfHwoZmRhX3B0ci0+ZmQuRkRDdGwgJiBGRENUTF9DT1dOU0ZEX01TSykpeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXByaXYtPnF1ZXVlX3N0b3BwZWQ9MTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpldGhlcjAwX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJc3RydWN0IG5ldF9wcml2ICpwcml2PWRldi0+cHJpdjsKKwlyZXR1cm4gJnByaXYtPnN0YXRzOworfQorCisKK3N0YXRpYyBpbnQgZXRoZXIwMF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJc3RydWN0IG5ldF9wcml2ICpwcml2PWRldi0+cHJpdjsKKwlpbnQgdG1wOworCisJLyogU3RvcC9kaXNhYmxlIHRoZSBkZXZpY2UuICovCisJdG1wPXJlYWR3KEVUSEVSX1JYX0NUTChkZXYtPmJhc2VfYWRkcikpOworCXRtcCY9fihFVEhFUl9SWF9DVExfUlhFTl9NU0sgfCBFVEhFUl9SWF9DVExfRU5HT09EX01TSyk7CisJdG1wfD1FVEhFUl9SWF9DVExfUlhIQUxUX01TSzsKKwl3cml0ZXcodG1wLEVUSEVSX1JYX0NUTChkZXYtPmJhc2VfYWRkcikpOworCisJdG1wPXJlYWRsKEVUSEVSX1RYX0NUTChkZXYtPmJhc2VfYWRkcikpOworCXRtcCY9fkVUSEVSX1RYX0NUTF9UWEVOX01TSzsKKwl0bXB8PUVUSEVSX1RYX0NUTF9UWEhBTFRfTVNLOworCXdyaXRlbCh0bXAsRVRIRVJfVFhfQ1RMKGRldi0+YmFzZV9hZGRyKSk7CisKKwkvKiBGcmVlIHVwIHN5c3RlbSByZXNvdXJjZXMgKi8KKwlmcmVlX2lycShkZXYtPmlycSxkZXYpOworCWZyZWVfaXJxKDIsZGV2KTsKKwlpb3VubWFwKHByaXYtPmRtYV9kYXRhKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGV0aGVyMDBfZ2V0X2V0aGVybmV0X2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlzdHJ1Y3QgbXRkX2luZm8gKm15bXRkPU5VTEw7CisJaW50IGk7CisJc2l6ZV90IHJldGxlbjsKKworCS8qCisJICogRm9yIHRoZSBFcHhhMTAgZGV2IGJvYXJkIChjYW1lbG90KSwgdGhlIGV0aGVybmV0IE1BQworCSAqIGFkZHJlc3MgaXMgb2YgdGhlIGZvcm0gIDAwOmFhOmFhOjAwOnh4Onh4IHdoZXJlCisJICogMDA6YWE6YWEgaXMgdGhlIEFsdGVyYSB2ZW5kb3IgSUQgYW5kIHh4Onh4IGlzIHRoZQorCSAqIGxhc3QgMiBieXRlcyBvZiB0aGUgYm9hcmQgc2VyaWFsIG51bWJlciwgYXMgcHJvZ3JhbW1lZAorCSAqIGludG8gdGhlIE9UUCBhcmVhIG9mIHRoZSBmbGFzaCBkZXZpY2Ugb24gRUJJMS4gSWYgdGhpcworCSAqIGlzbid0IGFuIGV4cGExMCBkZXYgYm9hcmQsIG9yIHRoZXJlJ3Mgbm8gbXRkIHN1cHBvcnQgdG8KKwkgKiByZWFkIHRoZSBzZXJpYWwgbnVtYmVyIGZyb20gZmxhc2ggdGhlbiB3ZSdsbCBmb3JjZSB0aGUKKwkgKiB1c2UgdG8gc2V0IHRoZWlyIG93biBtYWMgYWRkcmVzcyB1c2luZyBpZmNvbmZpZy4KKwkgKi8KKworI2lmZGVmIENPTkZJR19BUkNIX0NBTUVMT1QKKyNpZmRlZiBDT05GSUdfTVRECisJLyogZ2V0IHRoZSBtdGRfaW5mbyBzdHJ1Y3R1cmUgZm9yIHRoZSBmaXJzdCBtdGQgZGV2aWNlKi8KKwlmb3IoaT0wO2k8TUFYX01URF9ERVZJQ0VTO2krKyl7CisJCW15bXRkPWdldF9tdGRfZGV2aWNlKE5VTEwsaSk7CisJCWlmKCFteW10ZHx8IXN0cmNtcChteW10ZC0+bmFtZSwiRVBYQTEwREIgZmxhc2giKSkKKwkJCWJyZWFrOworCX0KKworCWlmKCFteW10ZCB8fCAhbXltdGQtPnJlYWRfdXNlcl9wcm90X3JlZyl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGYWlsZWQgdG8gcmVhZCBNQUMgYWRkcmVzcyBmcm9tIGZsYXNoXG4iLGRldi0+bmFtZSk7CisJfWVsc2V7CisJCW15bXRkLT5yZWFkX3VzZXJfcHJvdF9yZWcobXltdGQsMiwxLCZyZXRsZW4sJmRldi0+ZGV2X2FkZHJbNV0pOworCQlteW10ZC0+cmVhZF91c2VyX3Byb3RfcmVnKG15bXRkLDMsMSwmcmV0bGVuLCZkZXYtPmRldl9hZGRyWzRdKTsKKwkJZGV2LT5kZXZfYWRkclszXT0wOworCQlkZXYtPmRldl9hZGRyWzJdPXZlbmRvcl9pZFsxXTsKKwkJZGV2LT5kZXZfYWRkclsxXT12ZW5kb3JfaWRbMF07CisJCWRldi0+ZGV2X2FkZHJbMF09MDsKKwl9CisjZWxzZQorCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNVEQgc3VwcG9ydCByZXF1aXJlZCB0byByZWFkIE1BQyBhZGRyZXNzIGZyb20gRVBYQTEwIGRldiBib2FyZFxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorI2VuZGlmCisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcikpCisJCXByaW50aygiJXM6IEludmFsaWQgZXRoZXJuZXQgTUFDIGFkZHJlc3MuICBQbGVhc2Ugc2V0IHVzaW5nICIKKwkJCSJpZmNvbmZpZ1xuIiwgZGV2LT5uYW1lKTsKKworfQorCisvKgorICogS2VlcCBhIG1hcHBpbmcgb2YgZGV2X2luZm8gYWRkcmVzc2VzIC0+IHBvcnQgbGluZXMgdG8gdXNlIHdoZW4KKyAqIHJlbW92aW5nIHBvcnRzIGRldj09TlVMTCBpbmRpY2F0ZXMgdW51c2VkIGVudHJ5CisgKi8KKworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UqIGRldl9saXN0W0VUSF9OUl07CisKK3N0YXRpYyBpbnQgZXRoZXIwMF9hZGRfZGV2aWNlKHN0cnVjdCBwbGRoc19kZXZfaW5mbyogZGV2X2luZm8sdm9pZCogZGV2X3BzX2RhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0X3ByaXYgKnByaXY7CisJdm9pZCAqbWFwX2FkZHI7CisJaW50IHJlc3VsdDsKKwlpbnQgaTsKKworCWk9MDsKKwl3aGlsZShkZXZfbGlzdFtpXSAmJiBpIDwgRVRIX05SKQorCQlpKys7CisKKwlpZihpPT1FVEhfTlIpeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJldGhlcjAwOiBNYXhpbXVtIG51bWJlciBvZiBwb3J0cyByZWFjaGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihkZXZfaW5mby0+YmFzZV9hZGRyLCBNQUNfUkVHX1NJWkUsICJldGhlcjAwIikpCisJCXJldHVybiAtRUJVU1k7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldF9wcml2KSk7CisJaWYoIWRldikgeworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9yZWxlYXNlOworCX0KKwlwcml2ID0gZGV2LT5wcml2OworCisJcHJpdi0+dHFfbWVtdXBkYXRlLnJvdXRpbmU9ZXRoZXIwMF9tZW1fdXBkYXRlOworCXByaXYtPnRxX21lbXVwZGF0ZS5kYXRhPSh2b2lkKikgZGV2OworCisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnJ4X2xvY2spOworCisJbWFwX2FkZHI9aW9yZW1hcF9ub2NhY2hlKGRldl9pbmZvLT5iYXNlX2FkZHIsU1pfNEspOworCWlmKCFtYXBfYWRkcil7CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCW91dF9rZnJlZTsKKwl9CisKKwlkZXYtPm9wZW49ZXRoZXIwMF9vcGVuOworCWRldi0+c3RvcD1ldGhlcjAwX3N0b3A7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3Q9ZXRoZXIwMF9zZXRfbXVsdGljYXN0OworCWRldi0+aGFyZF9zdGFydF94bWl0PWV0aGVyMDBfdHg7CisJZGV2LT5nZXRfc3RhdHM9ZXRoZXIwMF9zdGF0czsKKworCWV0aGVyMDBfZ2V0X2V0aGVybmV0X2FkZHJlc3MoZGV2KTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWRldi0+YmFzZV9hZGRyPSh1bnNpZ25lZCBpbnQpbWFwX2FkZHI7CisJZGV2LT5pcnE9ZGV2X2luZm8tPmlycTsKKwlkZXYtPmZlYXR1cmVzPU5FVElGX0ZfRFlOQUxMT0MgfCBORVRJRl9GX0hXX0NTVU07CisKKwlyZXN1bHQ9cmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYocmVzdWx0KXsKKwkJcHJpbnRrKCJFdGhlcjAwOiBFcnJvciAlaSByZWdpc3RlcmluZyBkcml2ZXJcbiIscmVzdWx0KTsKKwkJZ290byBvdXRfdW5tYXA7CisJfQorCXByaW50aygicmVnaXN0ZXJlZCBldGhlcjAwIGRldmljZSBhdCAlI3hcbiIsZGV2X2luZm8tPmJhc2VfYWRkcik7CisKKwlkZXZfbGlzdFtpXT1kZXY7CisKKwlyZXR1cm4gcmVzdWx0OworCisgb3V0X3VubWFwOgorCWlvdW5tYXAobWFwX2FkZHIpOworIG91dF9rZnJlZToKKwlmcmVlX25ldGRldihkZXYpOworIG91dF9yZWxlYXNlOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihkZXZfaW5mby0+YmFzZV9hZGRyLCBNQUNfUkVHX1NJWkUpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIGludCBldGhlcjAwX3JlbW92ZV9kZXZpY2VzKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IoaT0wO2k8RVRIX05SO2krKyl7CisJCWlmKGRldl9saXN0W2ldKXsKKwkJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2X2xpc3RbaV0pOworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2X2xpc3RbaV0pOworCQkJaW91bm1hcCgodm9pZCopZGV2X2xpc3RbaV0tPmJhc2VfYWRkcik7CisJCQlyZWxlYXNlX21lbV9yZWdpb24oZGV2X2xpc3RbaV0tPmJhc2VfYWRkciwgTUFDX1JFR19TSVpFKTsKKwkJCWZyZWVfbmV0ZGV2KGRldl9saXN0W2ldKTsKKwkJCWRldl9saXN0W2ldPTA7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxkX2hvdHN3YXBfb3BzIGV0aGVyMDBfcGxkaHNfb3BzPXsKKwkubmFtZSA9IEVUSEVSMDBfTkFNRSwKKwkuYWRkX2RldmljZSA9IGV0aGVyMDBfYWRkX2RldmljZSwKKwkucmVtb3ZlX2RldmljZXMgPSBldGhlcjAwX3JlbW92ZV9kZXZpY2VzLAorfTsKKworCitzdGF0aWMgdm9pZCBfX2V4aXQgZXRoZXIwMF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWludCByZXN1bHQ7CisJcmVzdWx0PWV0aGVyMDBfcmVtb3ZlX2RldmljZXMoKTsKKwlpZihyZXN1bHQpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImV0aGVyMDA6IGZhaWxlZCB0byByZW1vdmUgYWxsIGRldmljZXNcbiIpOworCisJcGxkaHNfdW5yZWdpc3Rlcl9kcml2ZXIoRVRIRVIwMF9OQU1FKTsKK30KK21vZHVsZV9leGl0KGV0aGVyMDBfY2xlYW51cF9tb2R1bGUpOworCisKK3N0YXRpYyBpbnQgX19pbml0IGV0aGVyMDBfbW9kX2luaXQodm9pZCkKK3sKKwlwcmludGsoIm1vZCBpbml0XG4iKTsKKwlyZXR1cm4gcGxkaHNfcmVnaXN0ZXJfZHJpdmVyKCZldGhlcjAwX3BsZGhzX29wcyk7CisKK30KKworbW9kdWxlX2luaXQoZXRoZXIwMF9tb2RfaW5pdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FybS9ldGhlcjEuYyBiL2RyaXZlcnMvbmV0L2FybS9ldGhlcjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjQ3NWViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXJtL2V0aGVyMS5jCkBAIC0wLDAgKzEsMTExMCBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2Fjb3JuL25ldC9ldGhlcjEuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMCBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBBY29ybiBldGhlcjEgZHJpdmVyICg4MjU4NiBjaGlwKSBmb3IgQWNvcm4gbWFjaGluZXMKKyAqCisgKiBXZSBiYXNpY2FsbHkga2VlcCB0d28gcXVldWVzIGluIHRoZSBjYXJkcyBtZW1vcnkgLSBvbmUgZm9yIHRyYW5zbWl0CisgKiBhbmQgb25lIGZvciByZWNlaXZlLiAgRWFjaCBoYXMgYSBoZWFkIGFuZCBhIHRhaWwuICBUaGUgaGVhZCBpcyB3aGVyZQorICogd2UvdGhlIGNoaXAgYWRkcyBwYWNrZXRzIHRvIGJlIHRyYW5zbWl0dGVkL3JlY2VpdmVkLCBhbmQgdGhlIHRhaWwKKyAqIGlzIHdoZXJlIHRoZSB0cmFuc21pdHRlciBoYXMgZ290IHRvL3doZXJlIHRoZSByZWNlaXZlciB3aWxsIHN0b3AuCisgKiBCb3RoIG9mIHRoZXNlIHF1ZXVlcyBhcmUgY2lyY3VsYXIsIGFuZCBzaW5jZSB0aGUgY2hpcCBpcyBydW5uaW5nCisgKiBhbGwgdGhlIHRpbWUsIHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB3aGVuIHdlIG1vZGlmeSB0aGUgcG9pbnRlcnMgZXRjCisgKiBzbyB0aGF0IHRoZSBidWZmZXIgbWVtb3J5IGNvbnRlbnRzIGlzIHZhbGlkIGFsbCB0aGUgdGltZS4KKyAqCisgKiBDaGFuZ2UgbG9nOgorICogMS4wMAlSTUsJCQlSZWxlYXNlZAorICogMS4wMQlSTUsJMTkvMDMvMTk5NglUcmFuc2ZlcnMgdGhlIGxhc3Qgb2RkIGJ5dGUgb250by9vZmYgb2YgdGhlIGNhcmQgbm93LgorICogMS4wMglSTUsJMjUvMDUvMTk5NwlBZGRlZCBjb2RlIHRvIHJlc3RhcnQgUlUgaWYgaXQgZ29lcyBub3QgcmVhZHkKKyAqIDEuMDMJUk1LCTE0LzA5LzE5OTcJQ2xlYW5lZCB1cCB0aGUgaGFuZGxpbmcgb2YgYSByZXNldCBkdXJpbmcgdGhlIFRYIGludGVycnVwdC4KKyAqCQkJCVNob3VsZCBwcmV2ZW50IGxvY2t1cC4KKyAqIDEuMDQgUk1LCTE3LzA5LzE5OTcJQWRkZWQgbW9yZSBpbmZvIHdoZW4gaW5pdGlhbHNhdGlvbiBvZiBjaGlwIGdvZXMgd3JvbmcuCisgKgkJCQlURFIgbm93IG9ubHkgcmVwb3J0cyBmYWlsdXJlIHdoZW4gY2hpcCByZXBvcnRzIG5vbi16ZXJvCisgKgkJCQlURFIgdGltZS1kaXN0YW5jZS4KKyAqIDEuMDUJUk1LCTMxLzEyLzE5OTcJUmVtb3ZlZCBjYWxscyB0byBkZXZfdGludCBmb3IgMi4xCisgKiAxLjA2CVJNSwkxMC8wMi8yMDAwCVVwZGF0ZWQgZm9yIDIuMy40MworICogMS4wNwlSTUsJMTMvMDUvMjAwMAlVcGRhdGVkIGZvciAyLjMuOTktcHJlOAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vZWNhcmQuaD4KKworI2RlZmluZSBfX0VUSEVSMV9DCisjaW5jbHVkZSAiZXRoZXIxLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmV0X2RlYnVnID0gTkVUX0RFQlVHOworCisjZGVmaW5lIEJVRkZFUl9TSVpFCTB4MTAwMDAKKyNkZWZpbmUgVFhfQVJFQV9TVEFSVAkweDAwMTAwCisjZGVmaW5lIFRYX0FSRUFfRU5ECTB4MDUwMDAKKyNkZWZpbmUgUlhfQVJFQV9TVEFSVAkweDA1MDAwCisjZGVmaW5lIFJYX0FSRUFfRU5ECTB4MGZjMDAKKworc3RhdGljIGludCBldGhlcjFfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZXRoZXIxX3NlbmRwYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgZXRoZXIxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgZXRoZXIxX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpldGhlcjFfZ2V0c3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBldGhlcjFfc2V0bXVsdGljYXN0bGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGV0aGVyMV90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0gImV0aGVyMSBldGhlcm5ldCBkcml2ZXIgKGMpIDIwMDAgUnVzc2VsbCBLaW5nIHYxLjA3XG4iOworCisjZGVmaW5lIEJVU18xNiAxNgorI2RlZmluZSBCVVNfOCAgOAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgRElTQUJMRUlSUVMgMQorI2RlZmluZSBOT1JNQUxJUlFTICAwCisKKyNkZWZpbmUgZXRoZXIxX3JlYWR3KGRldiwgYWRkciwgdHlwZSwgb2Zmc2V0LCBzdmZsZ3MpIGV0aGVyMV9pbndfcCAoZGV2LCBhZGRyICsgKGludCkoJigodHlwZSAqKTApLT5vZmZzZXQpLCBzdmZsZ3MpCisjZGVmaW5lIGV0aGVyMV93cml0ZXcoZGV2LCB2YWwsIGFkZHIsIHR5cGUsIG9mZnNldCwgc3ZmbGdzKSBldGhlcjFfb3V0d19wIChkZXYsIHZhbCwgYWRkciArIChpbnQpKCYoKHR5cGUgKikwKS0+b2Zmc2V0KSwgc3ZmbGdzKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0CitldGhlcjFfaW53X3AgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBhZGRyLCBpbnQgc3ZmbGdzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc2hvcnQgcmV0OworCisJaWYgKHN2ZmxncykKKwkJbG9jYWxfaXJxX3NhdmUgKGZsYWdzKTsKKworCXdyaXRlYihhZGRyID4+IDEyLCBSRUdfUEFHRSk7CisJcmV0ID0gcmVhZHcoRVRIRVIxX1JBTSArICgoYWRkciAmIDQwOTUpIDw8IDEpKTsKKwlpZiAoc3ZmbGdzKQorCQlsb2NhbF9pcnFfcmVzdG9yZSAoZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZXRoZXIxX291dHdfcCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmFsLCBpbnQgYWRkciwgaW50IHN2ZmxncykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHN2ZmxncykKKwkJbG9jYWxfaXJxX3NhdmUgKGZsYWdzKTsKKworCXdyaXRlYihhZGRyID4+IDEyLCBSRUdfUEFHRSk7CisJd3JpdGV3KHZhbCwgRVRIRVIxX1JBTSArICgoYWRkciAmIDQwOTUpIDw8IDEpKTsKKwlpZiAoc3ZmbGdzKQorCQlsb2NhbF9pcnFfcmVzdG9yZSAoZmxhZ3MpOworfQorCisvKgorICogU29tZSBpbmxpbmUgYXNzZW1ibGVyIHRvIGFsbG93IGZhc3QgdHJhbnNmZXJzIG9uIHRvL29mZiBvZiB0aGUgY2FyZC4KKyAqIFNpbmNlIHRoaXMgZHJpdmVyIGRlcGVuZHMgb24gc29tZSBmZWF0dXJlcyBwcmVzZW50ZWQgYnkgdGhlIEFSTQorICogc3BlY2lmaWMgYXJjaGl0ZWN0dXJlLCBhbmQgdGhhdCB5b3UgY2FuJ3QgY29uZmlndXJlIHRoaXMgZHJpdmVyCisgKiB3aXRob3V0IHNwZWNpZmlpbmcgQVJNIG1vZGUsIHRoaXMgaXMgbm90IGEgcHJvYmxlbS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgZXNzZW50aWFsbHkgYW4gb3B0aW1pc2VkIG1lbWNweSBmcm9tIHRoZSBjYXJkJ3MKKyAqIG9uYm9hcmQgUkFNIHRvIGtlcm5lbCBtZW1vcnkuCisgKi8KK3N0YXRpYyB2b2lkCitldGhlcjFfd3JpdGVidWZmZXIgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzdGFydCwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwl1bnNpZ25lZCBpbnQgcGFnZSwgdGhpc2xlbiwgb2Zmc2V0OworCXZvaWQgX19pb21lbSAqYWRkcjsKKworCW9mZnNldCA9IHN0YXJ0ICYgNDA5NTsKKwlwYWdlID0gc3RhcnQgPj4gMTI7CisJYWRkciA9IEVUSEVSMV9SQU0gKyAob2Zmc2V0IDw8IDEpOworCisJaWYgKG9mZnNldCArIGxlbmd0aCA+IDQwOTYpCisJCXRoaXNsZW4gPSA0MDk2IC0gb2Zmc2V0OworCWVsc2UKKwkJdGhpc2xlbiA9IGxlbmd0aDsKKworCWRvIHsKKwkJaW50IHVzZWQ7CisKKwkJd3JpdGViKHBhZ2UsIFJFR19QQUdFKTsKKwkJbGVuZ3RoIC09IHRoaXNsZW47CisKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJInN1YnMJJTMsICUzLCAjMlxuXAorCWJtaQkyZlxuXAorMToJbGRyCSUwLCBbJTFdLCAjMlxuXAorCW1vdgklMCwgJTAsIGxzbCAjMTZcblwKKwlvcnIJJTAsICUwLCAlMCwgbHNyICMxNlxuXAorCXN0cgklMCwgWyUyXSwgIzRcblwKKwlzdWJzCSUzLCAlMywgIzJcblwKKwlibWkJMmZcblwKKwlsZHIJJTAsIFslMV0sICMyXG5cCisJbW92CSUwLCAlMCwgbHNsICMxNlxuXAorCW9ycgklMCwgJTAsICUwLCBsc3IgIzE2XG5cCisJc3RyCSUwLCBbJTJdLCAjNFxuXAorCXN1YnMJJTMsICUzLCAjMlxuXAorCWJtaQkyZlxuXAorCWxkcgklMCwgWyUxXSwgIzJcblwKKwltb3YJJTAsICUwLCBsc2wgIzE2XG5cCisJb3JyCSUwLCAlMCwgJTAsIGxzciAjMTZcblwKKwlzdHIJJTAsIFslMl0sICM0XG5cCisJc3VicwklMywgJTMsICMyXG5cCisJYm1pCTJmXG5cCisJbGRyCSUwLCBbJTFdLCAjMlxuXAorCW1vdgklMCwgJTAsIGxzbCAjMTZcblwKKwlvcnIJJTAsICUwLCAlMCwgbHNyICMxNlxuXAorCXN0cgklMCwgWyUyXSwgIzRcblwKKwlzdWJzCSUzLCAlMywgIzJcblwKKwlicGwJMWJcblwKKzI6CWFkZHMJJTMsICUzLCAjMVxuXAorCWxkcmVxYgklMCwgWyUxXVxuXAorCXN0cmVxYgklMCwgWyUyXSIKKwkJOiAiPSZyIiAodXNlZCksICI9JnIiIChkYXRhKQorCQk6ICJyIiAgKGFkZHIpLCAiciIgKHRoaXNsZW4pLCAiMSIgKGRhdGEpKTsKKworCQlhZGRyID0gRVRIRVIxX1JBTTsKKworCQl0aGlzbGVuID0gbGVuZ3RoOworCQlpZiAodGhpc2xlbiA+IDQwOTYpCisJCQl0aGlzbGVuID0gNDA5NjsKKwkJcGFnZSsrOworCX0gd2hpbGUgKHRoaXNsZW4pOworfQorCitzdGF0aWMgdm9pZAorZXRoZXIxX3JlYWRidWZmZXIgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzdGFydCwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwl1bnNpZ25lZCBpbnQgcGFnZSwgdGhpc2xlbiwgb2Zmc2V0OworCXZvaWQgX19pb21lbSAqYWRkcjsKKworCW9mZnNldCA9IHN0YXJ0ICYgNDA5NTsKKwlwYWdlID0gc3RhcnQgPj4gMTI7CisJYWRkciA9IEVUSEVSMV9SQU0gKyAob2Zmc2V0IDw8IDEpOworCisJaWYgKG9mZnNldCArIGxlbmd0aCA+IDQwOTYpCisJCXRoaXNsZW4gPSA0MDk2IC0gb2Zmc2V0OworCWVsc2UKKwkJdGhpc2xlbiA9IGxlbmd0aDsKKworCWRvIHsKKwkJaW50IHVzZWQ7CisKKwkJd3JpdGViKHBhZ2UsIFJFR19QQUdFKTsKKwkJbGVuZ3RoIC09IHRoaXNsZW47CisKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJInN1YnMJJTMsICUzLCAjMlxuXAorCWJtaQkyZlxuXAorMToJbGRyCSUwLCBbJTJdLCAjNFxuXAorCXN0cmIJJTAsIFslMV0sICMxXG5cCisJbW92CSUwLCAlMCwgbHNyICM4XG5cCisJc3RyYgklMCwgWyUxXSwgIzFcblwKKwlzdWJzCSUzLCAlMywgIzJcblwKKwlibWkJMmZcblwKKwlsZHIJJTAsIFslMl0sICM0XG5cCisJc3RyYgklMCwgWyUxXSwgIzFcblwKKwltb3YJJTAsICUwLCBsc3IgIzhcblwKKwlzdHJiCSUwLCBbJTFdLCAjMVxuXAorCXN1YnMJJTMsICUzLCAjMlxuXAorCWJtaQkyZlxuXAorCWxkcgklMCwgWyUyXSwgIzRcblwKKwlzdHJiCSUwLCBbJTFdLCAjMVxuXAorCW1vdgklMCwgJTAsIGxzciAjOFxuXAorCXN0cmIJJTAsIFslMV0sICMxXG5cCisJc3VicwklMywgJTMsICMyXG5cCisJYm1pCTJmXG5cCisJbGRyCSUwLCBbJTJdLCAjNFxuXAorCXN0cmIJJTAsIFslMV0sICMxXG5cCisJbW92CSUwLCAlMCwgbHNyICM4XG5cCisJc3RyYgklMCwgWyUxXSwgIzFcblwKKwlzdWJzCSUzLCAlMywgIzJcblwKKwlicGwJMWJcblwKKzI6CWFkZHMJJTMsICUzLCAjMVxuXAorCWxkcmVxYgklMCwgWyUyXVxuXAorCXN0cmVxYgklMCwgWyUxXSIKKwkJOiAiPSZyIiAodXNlZCksICI9JnIiIChkYXRhKQorCQk6ICJyIiAgKGFkZHIpLCAiciIgKHRoaXNsZW4pLCAiMSIgKGRhdGEpKTsKKworCQlhZGRyID0gRVRIRVIxX1JBTTsKKworCQl0aGlzbGVuID0gbGVuZ3RoOworCQlpZiAodGhpc2xlbiA+IDQwOTYpCisJCQl0aGlzbGVuID0gNDA5NjsKKwkJcGFnZSsrOworCX0gd2hpbGUgKHRoaXNsZW4pOworfQorCitzdGF0aWMgaW50IF9faW5pdAorZXRoZXIxX3JhbXRlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciBieXRlKQoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9IGttYWxsb2MgKEJVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpbnQgaSwgcmV0ID0gQlVGRkVSX1NJWkU7CisJaW50IG1heF9lcnJvcnMgPSAxNTsKKwlpbnQgYmFkID0gLTE7CisJaW50IGJhZF9zdGFydCA9IDA7CisKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIDE7CisKKwltZW1zZXQgKGJ1ZmZlciwgYnl0ZSwgQlVGRkVSX1NJWkUpOworCWV0aGVyMV93cml0ZWJ1ZmZlciAoZGV2LCBidWZmZXIsIDAsIEJVRkZFUl9TSVpFKTsKKwltZW1zZXQgKGJ1ZmZlciwgYnl0ZSBeIDB4ZmYsIEJVRkZFUl9TSVpFKTsKKwlldGhlcjFfcmVhZGJ1ZmZlciAoZGV2LCBidWZmZXIsIDAsIEJVRkZFUl9TSVpFKTsKKworCWZvciAoaSA9IDA7IGkgPCBCVUZGRVJfU0laRTsgaSsrKSB7CisJCWlmIChidWZmZXJbaV0gIT0gYnl0ZSkgeworCQkJaWYgKG1heF9lcnJvcnMgPj0gMCAmJiBiYWQgIT0gYnVmZmVyW2ldKSB7CisJCQkJaWYgKGJhZCAhPSAtMSkKKwkJCQkJcHJpbnRrICgiXG4iKTsKKwkJCQlwcmludGsgKEtFUk5fQ1JJVCAiJXM6IFJBTSBmYWlsZWQgd2l0aCAoJTAyWCBpbnN0ZWFkIG9mICUwMlgpIGF0IDB4JTA0WCIsCisJCQkJCWRldi0+bmFtZSwgYnVmZmVyW2ldLCBieXRlLCBpKTsKKwkJCQlyZXQgPSAtRU5PREVWOworCQkJCW1heF9lcnJvcnMgLS07CisJCQkJYmFkID0gYnVmZmVyW2ldOworCQkJCWJhZF9zdGFydCA9IGk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoYmFkICE9IC0xKSB7CisJCQkgICAgCWlmIChiYWRfc3RhcnQgPT0gaSAtIDEpCisJCQkJCXByaW50ayAoIlxuIik7CisJCQkJZWxzZQorCQkJCQlwcmludGsgKCIgLSAweCUwNFhcbiIsIGkgLSAxKTsKKwkJCQliYWQgPSAtMTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChiYWQgIT0gLTEpCisJCXByaW50ayAoIiAtIDB4JTA0WFxuIiwgQlVGRkVSX1NJWkUpOworCWtmcmVlIChidWZmZXIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorZXRoZXIxX3Jlc2V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXdyaXRlYihDVFJMX1JTVHxDVFJMX0FDSywgUkVHX0NPTlRST0wpOworCXJldHVybiBCVVNfMTY7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0CitldGhlcjFfaW5pdF8yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJZGV2LT5tZW1fc3RhcnQgPSAwOworCisJaSA9IGV0aGVyMV9yYW10ZXN0IChkZXYsIDB4NWEpOworCisJaWYgKGkgPiAwKQorCQlpID0gZXRoZXIxX3JhbXRlc3QgKGRldiwgMHgxZSk7CisKKwlpZiAoaSA8PSAwKQorCSAgICAJcmV0dXJuIC1FTk9ERVY7CisKKwlkZXYtPm1lbV9lbmQgPSBpOworCXJldHVybiAwOworfQorCisvKgorICogVGhlc2UgYXJlIHRoZSBzdHJ1Y3R1cmVzIHRoYXQgYXJlIGxvYWRlZCBpbnRvIHRoZSBldGhlciBSQU0gY2FyZCB0bworICogaW5pdGlhbGlzZSB0aGUgODI1ODYKKyAqLworCisvKiBhdCAweDAxMDAgKi8KKyNkZWZpbmUgTk9QX0FERFIJKFRYX0FSRUFfU1RBUlQpCisjZGVmaW5lIE5PUF9TSVpFCSgweDA2KQorc3RhdGljIG5vcF90ICBpbml0X25vcCAgPSB7CisJMCwKKwlDTURfTk9QLAorCU5PUF9BRERSCit9OworCisvKiBhdCAweDAwM2EgKi8KKyNkZWZpbmUgVERSX0FERFIJKDB4MDAzYSkKKyNkZWZpbmUgVERSX1NJWkUJKDB4MDgpCitzdGF0aWMgdGRyX3QgIGluaXRfdGRyCT0geworCTAsCisJQ01EX1REUiB8IENNRF9JTlRSLAorCU5PUF9BRERSLAorCTAKK307CisKKy8qIGF0IDB4MDAyZSAqLworI2RlZmluZSBNQ19BRERSCQkoMHgwMDJlKQorI2RlZmluZSBNQ19TSVpFCQkoMHgwYykKK3N0YXRpYyBtY190ICAgaW5pdF9tYyAgID0geworCTAsCisJQ01EX1NFVE1VTFRJQ0FTVCwKKwlURFJfQUREUiwKKwkwLAorCXsgeyAwLCB9IH0KK307CisKKy8qIGF0IDB4MDAyMiAqLworI2RlZmluZSBTQV9BRERSCQkoMHgwMDIyKQorI2RlZmluZSBTQV9TSVpFCQkoMHgwYykKK3N0YXRpYyBzYV90ICAgaW5pdF9zYSAgID0geworCTAsCisJQ01EX1NFVEFERFJFU1MsCisJTUNfQUREUiwKKwl7IDAsIH0KK307CisKKy8qIGF0IDB4MDAxMCAqLworI2RlZmluZSBDRkdfQUREUgkoMHgwMDEwKQorI2RlZmluZSBDRkdfU0laRQkoMHgxMikKK3N0YXRpYyBjZmdfdCAgaW5pdF9jZmcgID0geworCTAsCisJQ01EX0NPTkZJRywKKwlTQV9BRERSLAorCTgsCisJOCwKKwlDRkc4X1NSRFksCisJQ0ZHOV9QUkVBTUI4IHwgQ0ZHOV9BRERSTEVOQlVGIHwgQ0ZHOV9BRERSTEVOKDYpLAorCTAsCisJMHg2MCwKKwkwLAorCUNGRzEzX1JFVFJZKDE1KSB8IENGRzEzX1NMT1RIKDIpLAorCTAsCit9OworCisvKiBhdCAweDAwMDAgKi8KKyNkZWZpbmUgU0NCX0FERFIJKDB4MDAwMCkKKyNkZWZpbmUgU0NCX1NJWkUJKDB4MTApCitzdGF0aWMgc2NiX3QgIGluaXRfc2NiICA9IHsKKwkwLAorCVNDQl9DTURBQ0tSTlIgfCBTQ0JfQ01EQUNLQ05BIHwgU0NCX0NNREFDS0ZSIHwgU0NCX0NNREFDS0NYLAorCUNGR19BRERSLAorCVJYX0FSRUFfU1RBUlQsCisJMCwKKwkwLAorCTAsCisJMAorfTsKKworLyogYXQgMHhmZmVlICovCisjZGVmaW5lIElTQ1BfQUREUgkoMHhmZmVlKQorI2RlZmluZSBJU0NQX1NJWkUJKDB4MDgpCitzdGF0aWMgaXNjcF90IGluaXRfaXNjcCA9IHsKKwkxLAorCVNDQl9BRERSLAorCTB4MDAwMCwKKwkweDAwMDAKK307CisKKy8qIGF0IDB4ZmZmNiAqLworI2RlZmluZSBTQ1BfQUREUgkoMHhmZmY2KQorI2RlZmluZSBTQ1BfU0laRQkoMHgwYSkKK3N0YXRpYyBzY3BfdCAgaW5pdF9zY3AgID0geworCVNDUF9TWV8xNkJCVVMsCisJeyAwLCAwIH0sCisJSVNDUF9BRERSLAorCTAKK307CisKKyNkZWZpbmUgUkZEX1NJWkUJKDB4MTYpCitzdGF0aWMgcmZkX3QgIGluaXRfcmZkCT0geworCTAsCisJMCwKKwkwLAorCTAsCisJeyAwLCB9LAorCXsgMCwgfSwKKwkwCit9OworCisjZGVmaW5lIFJCRF9TSVpFCSgweDBhKQorc3RhdGljIHJiZF90ICBpbml0X3JiZAk9IHsKKwkwLAorCTAsCisJMCwKKwkwLAorCUVUSF9GUkFNRV9MRU4gKyA4Cit9OworCisjZGVmaW5lIFRYX1NJWkUJCSgweDA4KQorI2RlZmluZSBUQkRfU0laRQkoMHgwOCkKKworc3RhdGljIGludAorZXRoZXIxX2luaXRfZm9yX29wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGksIHN0YXR1cywgYWRkciwgbmV4dCwgbmV4dDI7CisJaW50IGZhaWx1cmVzID0gMDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwl3cml0ZWIoQ1RSTF9SU1R8Q1RSTF9BQ0ssIFJFR19DT05UUk9MKTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWluaXRfc2Euc2FfYWRkcltpXSA9IGRldi0+ZGV2X2FkZHJbaV07CisKKwkvKiBsb2FkIGRhdGEgc3RydWN0dXJlcyBpbnRvIGV0aGVyMSBSQU0gKi8KKwlldGhlcjFfd3JpdGVidWZmZXIgKGRldiwgJmluaXRfc2NwLCAgU0NQX0FERFIsICBTQ1BfU0laRSk7CisJZXRoZXIxX3dyaXRlYnVmZmVyIChkZXYsICZpbml0X2lzY3AsIElTQ1BfQUREUiwgSVNDUF9TSVpFKTsKKwlldGhlcjFfd3JpdGVidWZmZXIgKGRldiwgJmluaXRfc2NiLCAgU0NCX0FERFIsICBTQ0JfU0laRSk7CisJZXRoZXIxX3dyaXRlYnVmZmVyIChkZXYsICZpbml0X2NmZywgIENGR19BRERSLCAgQ0ZHX1NJWkUpOworCWV0aGVyMV93cml0ZWJ1ZmZlciAoZGV2LCAmaW5pdF9zYSwgICBTQV9BRERSLCAgIFNBX1NJWkUpOworCWV0aGVyMV93cml0ZWJ1ZmZlciAoZGV2LCAmaW5pdF9tYywgICBNQ19BRERSLCAgIE1DX1NJWkUpOworCWV0aGVyMV93cml0ZWJ1ZmZlciAoZGV2LCAmaW5pdF90ZHIsICBURFJfQUREUiwgIFREUl9TSVpFKTsKKwlldGhlcjFfd3JpdGVidWZmZXIgKGRldiwgJmluaXRfbm9wLCAgTk9QX0FERFIsICBOT1BfU0laRSk7CisKKwlpZiAoZXRoZXIxX3JlYWR3KGRldiwgQ0ZHX0FERFIsIGNmZ190LCBjZmdfY29tbWFuZCwgTk9STUFMSVJRUykgIT0gQ01EX0NPTkZJRykgeworCQlwcmludGsgKEtFUk5fRVJSICIlczogZGV0ZWN0ZWQgZWl0aGVyIFJBTSBmYXVsdCBvciBjb21waWxlciBidWdcbiIsCisJCQlkZXYtPm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIHNldHVwIGNpcmN1bGFybHkgbGlua2VkIGxpc3Qgb2YgeyByZmQsIHJiZCwgYnVmZmVyIH0sIHdpdGgKKwkgKiBhbGwgcmZkcyBjaXJjdWxhcmx5IGxpbmtlZCwgcmJkcyBjaXJjdWxhcmx5IGxpbmtlZC4KKwkgKiBGaXJzdCByZmQgaXMgbGlua2VkIHRvIHNjcCwgZmlyc3QgcmJkIGlzIGxpbmtlZCB0byBmaXJzdAorCSAqIHJmZC4gIExhc3QgcmJkIGhhcyBhIHN1c3BlbmQgY29tbWFuZC4KKwkgKi8KKwlhZGRyID0gUlhfQVJFQV9TVEFSVDsKKwlkbyB7CisJCW5leHQgPSBhZGRyICsgUkZEX1NJWkUgKyBSQkRfU0laRSArIEVUSF9GUkFNRV9MRU4gKyAxMDsKKwkJbmV4dDIgPSBuZXh0ICsgUkZEX1NJWkUgKyBSQkRfU0laRSArIEVUSF9GUkFNRV9MRU4gKyAxMDsKKworCQlpZiAobmV4dDIgPj0gUlhfQVJFQV9FTkQpIHsKKwkJCW5leHQgPSBSWF9BUkVBX1NUQVJUOworCQkJaW5pdF9yZmQucmZkX2NvbW1hbmQgPSBSRkRfQ01ERUwgfCBSRkRfQ01EU1VTUEVORDsKKwkJCXByaXYoZGV2KS0+cnhfdGFpbCA9IGFkZHI7CisJCX0gZWxzZQorCQkJaW5pdF9yZmQucmZkX2NvbW1hbmQgPSAwOworCQlpZiAoYWRkciA9PSBSWF9BUkVBX1NUQVJUKQorCQkJaW5pdF9yZmQucmZkX3JiZG9mZnNldCA9IGFkZHIgKyBSRkRfU0laRTsKKwkJZWxzZQorCQkJaW5pdF9yZmQucmZkX3JiZG9mZnNldCA9IDA7CisJCWluaXRfcmZkLnJmZF9saW5rID0gbmV4dDsKKwkJaW5pdF9yYmQucmJkX2xpbmsgPSBuZXh0ICsgUkZEX1NJWkU7CisJCWluaXRfcmJkLnJiZF9idWZsID0gYWRkciArIFJGRF9TSVpFICsgUkJEX1NJWkU7CisKKwkJZXRoZXIxX3dyaXRlYnVmZmVyIChkZXYsICZpbml0X3JmZCwgYWRkciwgUkZEX1NJWkUpOworCQlldGhlcjFfd3JpdGVidWZmZXIgKGRldiwgJmluaXRfcmJkLCBhZGRyICsgUkZEX1NJWkUsIFJCRF9TSVpFKTsKKwkJYWRkciA9IG5leHQ7CisJfSB3aGlsZSAobmV4dDIgPCBSWF9BUkVBX0VORCk7CisKKwlwcml2KGRldiktPnR4X2xpbmsgPSBOT1BfQUREUjsKKwlwcml2KGRldiktPnR4X2hlYWQgPSBOT1BfQUREUiArIE5PUF9TSVpFOworCXByaXYoZGV2KS0+dHhfdGFpbCA9IFREUl9BRERSOworCXByaXYoZGV2KS0+cnhfaGVhZCA9IFJYX0FSRUFfU1RBUlQ7CisKKwkvKiByZWxlYXNlIHJlc2V0ICYgZ2l2ZSA1ODYgYSBwcm9kICovCisJcHJpdihkZXYpLT5yZXNldHRpbmcgPSAxOworCXByaXYoZGV2KS0+aW5pdGlhbGlzaW5nID0gMTsKKwl3cml0ZWIoQ1RSTF9SU1QsIFJFR19DT05UUk9MKTsKKwl3cml0ZWIoMCwgUkVHX0NPTlRST0wpOworCXdyaXRlYihDVFJMX0NBLCBSRUdfQ09OVFJPTCk7CisKKwkvKiA1ODYgc2hvdWxkIG5vdyB1bnNldCBpc2NwLmJ1c3kgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArIEhaLzI7CisJd2hpbGUgKGV0aGVyMV9yZWFkdyhkZXYsIElTQ1BfQUREUiwgaXNjcF90LCBpc2NwX2J1c3ksIERJU0FCTEVJUlFTKSA9PSAxKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGNhbid0IGluaXRpYWxpc2UgODI1ODY6IGlzY3AgaXMgYnVzeVxuIiwgZGV2LT5uYW1lKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJLyogY2hlY2sgc3RhdHVzIG9mIGNvbW1hbmRzIHRoYXQgd2UgaXNzdWVkICovCisJdGltZW91dCArPSBIWi8xMDsKKwl3aGlsZSAoKChzdGF0dXMgPSBldGhlcjFfcmVhZHcoZGV2LCBDRkdfQUREUiwgY2ZnX3QsIGNmZ19zdGF0dXMsIERJU0FCTEVJUlFTKSkKKwkJCSYgU1RBVF9DT01QTEVURSkgPT0gMCkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCWJyZWFrOworCX0KKworCWlmICgoc3RhdHVzICYgKFNUQVRfQ09NUExFVEUgfCBTVEFUX09LKSkgIT0gKFNUQVRfQ09NUExFVEUgfCBTVEFUX09LKSkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGNhbid0IGluaXRpYWxpc2UgODI1ODY6IGNvbmZpZyBzdGF0dXMgJTA0WFxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpOworCQlwcmludGsgKEtFUk5fREVCVUcgIiVzOiBTQ0I9W1NUUz0lMDRYIENNRD0lMDRYIENCTD0lMDRYIFJGQT0lMDRYXVxuIiwgZGV2LT5uYW1lLAorCQkJZXRoZXIxX3JlYWR3KGRldiwgU0NCX0FERFIsIHNjYl90LCBzY2Jfc3RhdHVzLCBOT1JNQUxJUlFTKSwKKwkJCWV0aGVyMV9yZWFkdyhkZXYsIFNDQl9BRERSLCBzY2JfdCwgc2NiX2NvbW1hbmQsIE5PUk1BTElSUVMpLAorCQkJZXRoZXIxX3JlYWR3KGRldiwgU0NCX0FERFIsIHNjYl90LCBzY2JfY2JsX29mZnNldCwgTk9STUFMSVJRUyksCisJCQlldGhlcjFfcmVhZHcoZGV2LCBTQ0JfQUREUiwgc2NiX3QsIHNjYl9yZmFfb2Zmc2V0LCBOT1JNQUxJUlFTKSk7CisJCWZhaWx1cmVzICs9IDE7CisJfQorCisJdGltZW91dCArPSBIWi8xMDsKKwl3aGlsZSAoKChzdGF0dXMgPSBldGhlcjFfcmVhZHcoZGV2LCBTQV9BRERSLCBzYV90LCBzYV9zdGF0dXMsIERJU0FCTEVJUlFTKSkKKwkJCSYgU1RBVF9DT01QTEVURSkgPT0gMCkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCWJyZWFrOworCX0KKworCWlmICgoc3RhdHVzICYgKFNUQVRfQ09NUExFVEUgfCBTVEFUX09LKSkgIT0gKFNUQVRfQ09NUExFVEUgfCBTVEFUX09LKSkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGNhbid0IGluaXRpYWxpc2UgODI1ODY6IHNldCBhZGRyZXNzIHN0YXR1cyAlMDRYXG4iLCBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6IFNDQj1bU1RTPSUwNFggQ01EPSUwNFggQ0JMPSUwNFggUkZBPSUwNFhdXG4iLCBkZXYtPm5hbWUsCisJCQlldGhlcjFfcmVhZHcoZGV2LCBTQ0JfQUREUiwgc2NiX3QsIHNjYl9zdGF0dXMsIE5PUk1BTElSUVMpLAorCQkJZXRoZXIxX3JlYWR3KGRldiwgU0NCX0FERFIsIHNjYl90LCBzY2JfY29tbWFuZCwgTk9STUFMSVJRUyksCisJCQlldGhlcjFfcmVhZHcoZGV2LCBTQ0JfQUREUiwgc2NiX3QsIHNjYl9jYmxfb2Zmc2V0LCBOT1JNQUxJUlFTKSwKKwkJCWV0aGVyMV9yZWFkdyhkZXYsIFNDQl9BRERSLCBzY2JfdCwgc2NiX3JmYV9vZmZzZXQsIE5PUk1BTElSUVMpKTsKKwkJZmFpbHVyZXMgKz0gMTsKKwl9CisKKwl0aW1lb3V0ICs9IEhaLzEwOworCXdoaWxlICgoKHN0YXR1cyA9IGV0aGVyMV9yZWFkdyhkZXYsIE1DX0FERFIsIG1jX3QsIG1jX3N0YXR1cywgRElTQUJMRUlSUVMpKQorCQkJJiBTVEFUX0NPTVBMRVRFKSA9PSAwKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKChzdGF0dXMgJiAoU1RBVF9DT01QTEVURSB8IFNUQVRfT0spKSAhPSAoU1RBVF9DT01QTEVURSB8IFNUQVRfT0spKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogY2FuJ3QgaW5pdGlhbGlzZSA4MjU4Njogc2V0IG11bHRpY2FzdCBzdGF0dXMgJTA0WFxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpOworCQlwcmludGsgKEtFUk5fREVCVUcgIiVzOiBTQ0I9W1NUUz0lMDRYIENNRD0lMDRYIENCTD0lMDRYIFJGQT0lMDRYXVxuIiwgZGV2LT5uYW1lLAorCQkJZXRoZXIxX3JlYWR3KGRldiwgU0NCX0FERFIsIHNjYl90LCBzY2Jfc3RhdHVzLCBOT1JNQUxJUlFTKSwKKwkJCWV0aGVyMV9yZWFkdyhkZXYsIFNDQl9BRERSLCBzY2JfdCwgc2NiX2NvbW1hbmQsIE5PUk1BTElSUVMpLAorCQkJZXRoZXIxX3JlYWR3KGRldiwgU0NCX0FERFIsIHNjYl90LCBzY2JfY2JsX29mZnNldCwgTk9STUFMSVJRUyksCisJCQlldGhlcjFfcmVhZHcoZGV2LCBTQ0JfQUREUiwgc2NiX3QsIHNjYl9yZmFfb2Zmc2V0LCBOT1JNQUxJUlFTKSk7CisJCWZhaWx1cmVzICs9IDE7CisJfQorCisJdGltZW91dCArPSBIWjsKKwl3aGlsZSAoKChzdGF0dXMgPSBldGhlcjFfcmVhZHcoZGV2LCBURFJfQUREUiwgdGRyX3QsIHRkcl9zdGF0dXMsIERJU0FCTEVJUlFTKSkKKwkJCSYgU1RBVF9DT01QTEVURSkgPT0gMCkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCWJyZWFrOworCX0KKworCWlmICgoc3RhdHVzICYgKFNUQVRfQ09NUExFVEUgfCBTVEFUX09LKSkgIT0gKFNUQVRfQ09NUExFVEUgfCBTVEFUX09LKSkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGNhbid0IHRkciAoaWdub3JlZClcbiIsIGRldi0+bmFtZSk7CisJCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6IFNDQj1bU1RTPSUwNFggQ01EPSUwNFggQ0JMPSUwNFggUkZBPSUwNFhdXG4iLCBkZXYtPm5hbWUsCisJCQlldGhlcjFfcmVhZHcoZGV2LCBTQ0JfQUREUiwgc2NiX3QsIHNjYl9zdGF0dXMsIE5PUk1BTElSUVMpLAorCQkJZXRoZXIxX3JlYWR3KGRldiwgU0NCX0FERFIsIHNjYl90LCBzY2JfY29tbWFuZCwgTk9STUFMSVJRUyksCisJCQlldGhlcjFfcmVhZHcoZGV2LCBTQ0JfQUREUiwgc2NiX3QsIHNjYl9jYmxfb2Zmc2V0LCBOT1JNQUxJUlFTKSwKKwkJCWV0aGVyMV9yZWFkdyhkZXYsIFNDQl9BRERSLCBzY2JfdCwgc2NiX3JmYV9vZmZzZXQsIE5PUk1BTElSUVMpKTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSBldGhlcjFfcmVhZHcoZGV2LCBURFJfQUREUiwgdGRyX3QsIHRkcl9yZXN1bHQsIERJU0FCTEVJUlFTKTsKKwkJaWYgKHN0YXR1cyAmIFREUl9YQ1ZSUFJPQikKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogaS9mIGZhaWxlZCB0ZHI6IHRyYW5zY2VpdmVyIHByb2JsZW1cbiIsIGRldi0+bmFtZSk7CisJCWVsc2UgaWYgKChzdGF0dXMgJiAoVERSX1NIT1JUfFREUl9PUEVOKSkgJiYgKHN0YXR1cyAmIFREUl9USU1FKSkgeworI2lmZGVmIEZBTkNZCisJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGkvZiBmYWlsZWQgdGRyOiBjYWJsZSAlcyAlZC4lZCB1cyBhd2F5XG4iLCBkZXYtPm5hbWUsCisJCQkJc3RhdHVzICYgVERSX1NIT1JUID8gInNob3J0IiA6ICJvcGVuIiwgKHN0YXR1cyAmIFREUl9USU1FKSAvIDEwLAorCQkJCShzdGF0dXMgJiBURFJfVElNRSkgJSAxMCk7CisjZWxzZQorCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBpL2YgZmFpbGVkIHRkcjogY2FibGUgJXMgJWQgY2xrcyBhd2F5XG4iLCBkZXYtPm5hbWUsCisJCQkJc3RhdHVzICYgVERSX1NIT1JUID8gInNob3J0IiA6ICJvcGVuIiwgKHN0YXR1cyAmIFREUl9USU1FKSk7CisjZW5kaWYKKwkJfQorCX0KKworCWlmIChmYWlsdXJlcykKKwkJZXRoZXIxX3Jlc2V0IChkZXYpOworCXJldHVybiBmYWlsdXJlcyA/IDEgOiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQKK2V0aGVyMV90eGFsbG9jIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc2l6ZSkKK3sKKwlpbnQgc3RhcnQsIHRhaWw7CisKKwlzaXplID0gKHNpemUgKyAxKSAmIH4xOworCXRhaWwgPSBwcml2KGRldiktPnR4X3RhaWw7CisKKwlpZiAocHJpdihkZXYpLT50eF9oZWFkICsgc2l6ZSA+IFRYX0FSRUFfRU5EKSB7CisJCWlmICh0YWlsID4gcHJpdihkZXYpLT50eF9oZWFkKQorCQkJcmV0dXJuIC0xOworCQlzdGFydCA9IFRYX0FSRUFfU1RBUlQ7CisJCWlmIChzdGFydCArIHNpemUgPiB0YWlsKQorCQkJcmV0dXJuIC0xOworCQlwcml2KGRldiktPnR4X2hlYWQgPSBzdGFydCArIHNpemU7CisJfSBlbHNlIHsKKwkJaWYgKHByaXYoZGV2KS0+dHhfaGVhZCA8IHRhaWwgJiYgKHByaXYoZGV2KS0+dHhfaGVhZCArIHNpemUpID4gdGFpbCkKKwkJCXJldHVybiAtMTsKKwkJc3RhcnQgPSBwcml2KGRldiktPnR4X2hlYWQ7CisJCXByaXYoZGV2KS0+dHhfaGVhZCArPSBzaXplOworCX0KKworCXJldHVybiBzdGFydDsKK30KKworc3RhdGljIGludAorZXRoZXIxX29wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpbnZhbGlkIGV0aGVybmV0IE1BQyBhZGRyZXNzXG4iLAorCQkJZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBldGhlcjFfaW50ZXJydXB0LCAwLCAiZXRoZXIxIiwgZGV2KSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwltZW1zZXQgKCZwcml2KGRldiktPnN0YXRzLCAwLCBzaXplb2YgKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7CisKKwlpZiAoZXRoZXIxX2luaXRfZm9yX29wZW4gKGRldikpIHsKKwkJZnJlZV9pcnEgKGRldi0+aXJxLCBkZXYpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitldGhlcjFfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0cmFuc21pdCB0aW1lb3V0LCBuZXR3b3JrIGNhYmxlIHByb2JsZW0/XG4iLAorCQlkZXYtPm5hbWUpOworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByZXNldHRpbmcgZGV2aWNlXG4iLCBkZXYtPm5hbWUpOworCisJZXRoZXIxX3Jlc2V0IChkZXYpOworCisJaWYgKGV0aGVyMV9pbml0X2Zvcl9vcGVuIChkZXYpKQorCQlwcmludGsgKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHJlc3RhcnQgaW50ZXJmYWNlXG4iLCBkZXYtPm5hbWUpOworCisJcHJpdihkZXYpLT5zdGF0cy50eF9lcnJvcnMrKzsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyBpbnQKK2V0aGVyMV9zZW5kcGFja2V0IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCB0bXAsIHRzdCwgbm9wYWRkciwgdHhhZGRyLCB0YmRhZGRyLCBkYXRhZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdHhfdCB0eDsKKwl0YmRfdCB0YmQ7CisJbm9wX3Qgbm9wOworCisJaWYgKHByaXYoZGV2KS0+cmVzdGFydCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcmVzZXR0aW5nIGRldmljZVxuIiwgZGV2LT5uYW1lKTsKKworCQlldGhlcjFfcmVzZXQoZGV2KTsKKworCQlpZiAoZXRoZXIxX2luaXRfZm9yX29wZW4oZGV2KSkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byByZXN0YXJ0IGludGVyZmFjZVxuIiwgZGV2LT5uYW1lKTsKKwkJZWxzZQorCQkJcHJpdihkZXYpLT5yZXN0YXJ0ID0gMDsKKwl9CisKKwlpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikgeworCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogaW5zZXJ0IHBhY2tldCBmb2xsb3dlZCBieSBhIG5vcAorCSAqLworCXR4YWRkciA9IGV0aGVyMV90eGFsbG9jIChkZXYsIFRYX1NJWkUpOworCXRiZGFkZHIgPSBldGhlcjFfdHhhbGxvYyAoZGV2LCBUQkRfU0laRSk7CisJZGF0YWRkciA9IGV0aGVyMV90eGFsbG9jIChkZXYsIHNrYi0+bGVuKTsKKwlub3BhZGRyID0gZXRoZXIxX3R4YWxsb2MgKGRldiwgTk9QX1NJWkUpOworCisJdHgudHhfc3RhdHVzID0gMDsKKwl0eC50eF9jb21tYW5kID0gQ01EX1RYIHwgQ01EX0lOVFI7CisJdHgudHhfbGluayA9IG5vcGFkZHI7CisJdHgudHhfdGJkb2Zmc2V0ID0gdGJkYWRkcjsKKwl0YmQudGJkX29wdHMgPSBUQkRfRU9MIHwgc2tiLT5sZW47CisJdGJkLnRiZF9saW5rID0gSTgyNTg2X05VTEw7CisJdGJkLnRiZF9idWZsID0gZGF0YWRkcjsKKwl0YmQudGJkX2J1ZmggPSAwOworCW5vcC5ub3Bfc3RhdHVzID0gMDsKKwlub3Aubm9wX2NvbW1hbmQgPSBDTURfTk9QOworCW5vcC5ub3BfbGluayA9IG5vcGFkZHI7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJZXRoZXIxX3dyaXRlYnVmZmVyIChkZXYsICZ0eCwgdHhhZGRyLCBUWF9TSVpFKTsKKwlldGhlcjFfd3JpdGVidWZmZXIgKGRldiwgJnRiZCwgdGJkYWRkciwgVEJEX1NJWkUpOworCWV0aGVyMV93cml0ZWJ1ZmZlciAoZGV2LCBza2ItPmRhdGEsIGRhdGFkZHIsIHNrYi0+bGVuKTsKKwlldGhlcjFfd3JpdGVidWZmZXIgKGRldiwgJm5vcCwgbm9wYWRkciwgTk9QX1NJWkUpOworCXRtcCA9IHByaXYoZGV2KS0+dHhfbGluazsKKwlwcml2KGRldiktPnR4X2xpbmsgPSBub3BhZGRyOworCisJLyogbm93IHJlc2V0IHRoZSBwcmV2aW91cyBub3AgcG9pbnRlciAqLworCWV0aGVyMV93cml0ZXcoZGV2LCB0eGFkZHIsIHRtcCwgbm9wX3QsIG5vcF9saW5rLCBOT1JNQUxJUlFTKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCS8qIGhhbmRsZSB0cmFuc21pdCAqLworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJLyogY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgcm9vbSBmb3IgYSBmdWxsIHNpemVkIGV0aGVyIGZyYW1lICovCisJdG1wID0gcHJpdihkZXYpLT50eF9oZWFkOworCXRzdCA9IGV0aGVyMV90eGFsbG9jIChkZXYsIFRYX1NJWkUgKyBUQkRfU0laRSArIE5PUF9TSVpFICsgRVRIX0ZSQU1FX0xFTik7CisJcHJpdihkZXYpLT50eF9oZWFkID0gdG1wOworCWRldl9rZnJlZV9za2IgKHNrYik7CisKKwlpZiAodHN0ID09IC0xKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyBvdXQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitldGhlcjFfeG1pdF9kb25lIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW5vcF90IG5vcDsKKwlpbnQgY2FkZHIsIHRzdDsKKworCWNhZGRyID0gcHJpdihkZXYpLT50eF90YWlsOworCithZ2FpbjoKKwlldGhlcjFfcmVhZGJ1ZmZlciAoZGV2LCAmbm9wLCBjYWRkciwgTk9QX1NJWkUpOworCisJc3dpdGNoIChub3Aubm9wX2NvbW1hbmQgJiBDTURfTUFTSykgeworCWNhc2UgQ01EX1REUjoKKwkJLyogc3BlY2lhbCBjYXNlICovCisJCWlmIChldGhlcjFfcmVhZHcoZGV2LCBTQ0JfQUREUiwgc2NiX3QsIHNjYl9jYmxfb2Zmc2V0LCBOT1JNQUxJUlFTKQorCQkJCSE9ICh1bnNpZ25lZCBzaG9ydClJODI1ODZfTlVMTCkgeworCQkJZXRoZXIxX3dyaXRldyhkZXYsIFNDQl9DTURDVUNTVEFSVCB8IFNDQl9DTURSWFNUQVJULCBTQ0JfQUREUiwgc2NiX3QsCisJCQkJICAgIHNjYl9jb21tYW5kLCBOT1JNQUxJUlFTKTsKKwkJCXdyaXRlYihDVFJMX0NBLCBSRUdfQ09OVFJPTCk7CisJCX0KKwkJcHJpdihkZXYpLT50eF90YWlsID0gTk9QX0FERFI7CisJCXJldHVybjsKKworCWNhc2UgQ01EX05PUDoKKwkJaWYgKG5vcC5ub3BfbGluayA9PSBjYWRkcikgeworCQkJaWYgKHByaXYoZGV2KS0+aW5pdGlhbGlzaW5nID09IDApCisJCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBzdHJhbmdlIGNvbW1hbmQgY29tcGxldGUgd2l0aCBubyB0eCBjb21tYW5kIVxuIiwgZGV2LT5uYW1lKTsKKwkJCWVsc2UKKwkJCSAgICAgICAgcHJpdihkZXYpLT5pbml0aWFsaXNpbmcgPSAwOworCQkJcmV0dXJuOworCQl9CisJCWlmIChjYWRkciA9PSBub3Aubm9wX2xpbmspCisJCQlyZXR1cm47CisJCWNhZGRyID0gbm9wLm5vcF9saW5rOworCQlnb3RvIGFnYWluOworCisJY2FzZSBDTURfVFg6CisJCWlmIChub3Aubm9wX3N0YXR1cyAmIFNUQVRfQ09NUExFVEUpCisJCQlicmVhazsKKwkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IHN0cmFuZ2UgY29tbWFuZCBjb21wbGV0ZSB3aXRob3V0IGNvbXBsZXRlZCBjb21tYW5kXG4iLCBkZXYtPm5hbWUpOworCQlwcml2KGRldiktPnJlc3RhcnQgPSAxOworCQlyZXR1cm47CisKKwlkZWZhdWx0OgorCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IHN0cmFuZ2UgY29tbWFuZCAlZCBjb21wbGV0ZSEgKG9mZnNldCAlMDRYKSIsIGRldi0+bmFtZSwKKwkJCW5vcC5ub3BfY29tbWFuZCAmIENNRF9NQVNLLCBjYWRkcik7CisJCXByaXYoZGV2KS0+cmVzdGFydCA9IDE7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAobm9wLm5vcF9zdGF0dXMgJiBTVEFUX0NPTVBMRVRFKSB7CisJCWlmIChub3Aubm9wX3N0YXR1cyAmIFNUQVRfT0spIHsKKwkJCXByaXYoZGV2KS0+c3RhdHMudHhfcGFja2V0cyArKzsKKwkJCXByaXYoZGV2KS0+c3RhdHMuY29sbGlzaW9ucyArPSAobm9wLm5vcF9zdGF0dXMgJiBTVEFUX0NPTExJU0lPTlMpOworCQl9IGVsc2UgeworCQkJcHJpdihkZXYpLT5zdGF0cy50eF9lcnJvcnMgKys7CisKKwkJCWlmIChub3Aubm9wX3N0YXR1cyAmIFNUQVRfQ09MTEFGVEVSVFgpCisJCQkJcHJpdihkZXYpLT5zdGF0cy5jb2xsaXNpb25zICsrOworCQkJaWYgKG5vcC5ub3Bfc3RhdHVzICYgU1RBVF9OT0NBUlJJRVIpCisJCQkJcHJpdihkZXYpLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyArKzsKKwkJCWlmIChub3Aubm9wX3N0YXR1cyAmIFNUQVRfVFhMT1NUQ1RTKQorCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogY3RzIGxvc3RcbiIsIGRldi0+bmFtZSk7CisJCQlpZiAobm9wLm5vcF9zdGF0dXMgJiBTVEFUX1RYU0xPV0RNQSkKKwkJCQlwcml2KGRldiktPnN0YXRzLnR4X2ZpZm9fZXJyb3JzICsrOworCQkJaWYgKG5vcC5ub3Bfc3RhdHVzICYgU1RBVF9DT0xMRVhDRVNTSVZFKQorCQkJCXByaXYoZGV2KS0+c3RhdHMuY29sbGlzaW9ucyArPSAxNjsKKwkJfQorCisJCWlmIChub3Aubm9wX2xpbmsgPT0gY2FkZHIpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgIiVzOiB0eCBidWZmZXIgY2hhaW5pbmcgZXJyb3I6IHR4IGNvbW1hbmQgcG9pbnRzIHRvIGl0c2VsZlxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FkZHIgPSBub3Aubm9wX2xpbms7CisJCWV0aGVyMV9yZWFkYnVmZmVyIChkZXYsICZub3AsIGNhZGRyLCBOT1BfU0laRSk7CisJCWlmICgobm9wLm5vcF9jb21tYW5kICYgQ01EX01BU0spICE9IENNRF9OT1ApIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgIiVzOiB0eCBidWZmZXIgY2hhaW5pbmcgZXJyb3I6IG5vIG5vcCBhZnRlciB0eCBjb21tYW5kXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoY2FkZHIgPT0gbm9wLm5vcF9saW5rKQorCQkJYnJlYWs7CisKKwkJY2FkZHIgPSBub3Aubm9wX2xpbms7CisJCWV0aGVyMV9yZWFkYnVmZmVyIChkZXYsICZub3AsIGNhZGRyLCBOT1BfU0laRSk7CisJCWlmICgobm9wLm5vcF9jb21tYW5kICYgQ01EX01BU0spICE9IENNRF9UWCkgeworCQkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IHR4IGJ1ZmZlciBjaGFpbmluZyBlcnJvcjogbm8gdHggY29tbWFuZCBhZnRlciBub3BcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlwcml2KGRldiktPnR4X3RhaWwgPSBjYWRkcjsKKworCWNhZGRyID0gcHJpdihkZXYpLT50eF9oZWFkOworCXRzdCA9IGV0aGVyMV90eGFsbG9jIChkZXYsIFRYX1NJWkUgKyBUQkRfU0laRSArIE5PUF9TSVpFICsgRVRIX0ZSQU1FX0xFTik7CisJcHJpdihkZXYpLT50eF9oZWFkID0gY2FkZHI7CisJaWYgKHRzdCAhPSAtMSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgdm9pZAorZXRoZXIxX3JlY3ZfZG9uZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgc3RhdHVzOworCWludCBuZXh0dGFpbCwgcmJkYWRkcjsKKwlyYmRfdCByYmQ7CisKKwlkbyB7CisJCXN0YXR1cyA9IGV0aGVyMV9yZWFkdyhkZXYsIHByaXYoZGV2KS0+cnhfaGVhZCwgcmZkX3QsIHJmZF9zdGF0dXMsIE5PUk1BTElSUVMpOworCQlpZiAoKHN0YXR1cyAmIFJGRF9DT01QTEVURSkgPT0gMCkKKwkJCWJyZWFrOworCisJCXJiZGFkZHIgPSBldGhlcjFfcmVhZHcoZGV2LCBwcml2KGRldiktPnJ4X2hlYWQsIHJmZF90LCByZmRfcmJkb2Zmc2V0LCBOT1JNQUxJUlFTKTsKKwkJZXRoZXIxX3JlYWRidWZmZXIgKGRldiwgJnJiZCwgcmJkYWRkciwgUkJEX1NJWkUpOworCisJCWlmICgocmJkLnJiZF9zdGF0dXMgJiAoUkJEX0VPRiB8IFJCRF9BQ05UVkFMSUQpKSA9PSAoUkJEX0VPRiB8IFJCRF9BQ05UVkFMSUQpKSB7CisJCQlpbnQgbGVuZ3RoID0gcmJkLnJiZF9zdGF0dXMgJiBSQkRfQUNOVDsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCWxlbmd0aCA9IChsZW5ndGggKyAxKSAmIH4xOworCQkJc2tiID0gZGV2X2FsbG9jX3NrYiAobGVuZ3RoICsgMik7CisKKwkJCWlmIChza2IpIHsKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2JfcmVzZXJ2ZSAoc2tiLCAyKTsKKworCQkJCWV0aGVyMV9yZWFkYnVmZmVyIChkZXYsIHNrYl9wdXQgKHNrYiwgbGVuZ3RoKSwgcmJkLnJiZF9idWZsLCBsZW5ndGgpOworCisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zIChza2IsIGRldik7CisJCQkJbmV0aWZfcnggKHNrYik7CisJCQkJcHJpdihkZXYpLT5zdGF0cy5yeF9wYWNrZXRzICsrOworCQkJfSBlbHNlCisJCQkJcHJpdihkZXYpLT5zdGF0cy5yeF9kcm9wcGVkICsrOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsCisJCQkJKHJiZC5yYmRfc3RhdHVzICYgUkJEX0VPRikgPyAib3ZlcnNpemVkIHBhY2tldCIgOiAiYWNudCBub3QgdmFsaWQiKTsKKwkJCXByaXYoZGV2KS0+c3RhdHMucnhfZHJvcHBlZCArKzsKKwkJfQorCisJCW5leHR0YWlsID0gZXRoZXIxX3JlYWR3KGRldiwgcHJpdihkZXYpLT5yeF90YWlsLCByZmRfdCwgcmZkX2xpbmssIE5PUk1BTElSUVMpOworCQkvKiBuZXh0dGFpbCBzaG91bGQgYmUgcnhfaGVhZCAqLworCQlpZiAobmV4dHRhaWwgIT0gcHJpdihkZXYpLT5yeF9oZWFkKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVjZWl2ZXIgYnVmZmVyIGNoYWluaW5nIGVycm9yICglMDRYICE9ICUwNFgpXG4iLAorCQkJCWRldi0+bmFtZSwgbmV4dHRhaWwsIHByaXYoZGV2KS0+cnhfaGVhZCk7CisJCWV0aGVyMV93cml0ZXcoZGV2LCBSRkRfQ01ERUwgfCBSRkRfQ01EU1VTUEVORCwgbmV4dHRhaWwsIHJmZF90LCByZmRfY29tbWFuZCwgTk9STUFMSVJRUyk7CisJCWV0aGVyMV93cml0ZXcoZGV2LCAwLCBwcml2KGRldiktPnJ4X3RhaWwsIHJmZF90LCByZmRfY29tbWFuZCwgTk9STUFMSVJRUyk7CisJCWV0aGVyMV93cml0ZXcoZGV2LCAwLCBwcml2KGRldiktPnJ4X3RhaWwsIHJmZF90LCByZmRfc3RhdHVzLCBOT1JNQUxJUlFTKTsKKwkJZXRoZXIxX3dyaXRldyhkZXYsIDAsIHByaXYoZGV2KS0+cnhfdGFpbCwgcmZkX3QsIHJmZF9yYmRvZmZzZXQsIE5PUk1BTElSUVMpOworCQorCQlwcml2KGRldiktPnJ4X3RhaWwgPSBuZXh0dGFpbDsKKwkJcHJpdihkZXYpLT5yeF9oZWFkID0gZXRoZXIxX3JlYWR3KGRldiwgcHJpdihkZXYpLT5yeF9oZWFkLCByZmRfdCwgcmZkX2xpbmssIE5PUk1BTElSUVMpOworCX0gd2hpbGUgKDEpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QKK2V0aGVyMV9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gZXRoZXIxX3JlYWR3KGRldiwgU0NCX0FERFIsIHNjYl90LCBzY2Jfc3RhdHVzLCBOT1JNQUxJUlFTKTsKKworCWlmIChzdGF0dXMpIHsKKwkJZXRoZXIxX3dyaXRldyhkZXYsIHN0YXR1cyAmIChTQ0JfU1RSTlIgfCBTQ0JfU1RDTkEgfCBTQ0JfU1RGUiB8IFNDQl9TVENYKSwKKwkJCSAgICBTQ0JfQUREUiwgc2NiX3QsIHNjYl9jb21tYW5kLCBOT1JNQUxJUlFTKTsKKwkJd3JpdGViKENUUkxfQ0EgfCBDVFJMX0FDSywgUkVHX0NPTlRST0wpOworCQlpZiAoc3RhdHVzICYgU0NCX1NUQ1gpIHsKKwkJCWV0aGVyMV94bWl0X2RvbmUgKGRldik7CisJCX0KKwkJaWYgKHN0YXR1cyAmIFNDQl9TVENOQSkgeworCQkJaWYgKHByaXYoZGV2KS0+cmVzZXR0aW5nID09IDApCisJCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBDVSB3ZW50IG5vdCByZWFkeSA/Pz9cbiIsIGRldi0+bmFtZSk7CisJCQllbHNlCisJCQkJcHJpdihkZXYpLT5yZXNldHRpbmcgKz0gMTsKKwkJCWlmIChldGhlcjFfcmVhZHcoZGV2LCBTQ0JfQUREUiwgc2NiX3QsIHNjYl9jYmxfb2Zmc2V0LCBOT1JNQUxJUlFTKQorCQkJCQkhPSAodW5zaWduZWQgc2hvcnQpSTgyNTg2X05VTEwpIHsKKwkJCQlldGhlcjFfd3JpdGV3KGRldiwgU0NCX0NNRENVQ1NUQVJULCBTQ0JfQUREUiwgc2NiX3QsIHNjYl9jb21tYW5kLCBOT1JNQUxJUlFTKTsKKwkJCQl3cml0ZWIoQ1RSTF9DQSwgUkVHX0NPTlRST0wpOworCQkJfQorCQkJaWYgKHByaXYoZGV2KS0+cmVzZXR0aW5nID09IDIpCisJCQkJcHJpdihkZXYpLT5yZXNldHRpbmcgPSAwOworCQl9CisJCWlmIChzdGF0dXMgJiBTQ0JfU1RGUikgeworCQkJZXRoZXIxX3JlY3ZfZG9uZSAoZGV2KTsKKwkJfQorCQlpZiAoc3RhdHVzICYgU0NCX1NUUk5SKSB7CisJCQlpZiAoZXRoZXIxX3JlYWR3KGRldiwgU0NCX0FERFIsIHNjYl90LCBzY2Jfc3RhdHVzLCBOT1JNQUxJUlFTKSAmIFNDQl9TVFJYU1VTUCkgeworCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogUlUgd2VudCBub3QgcmVhZHk6IFJVIHN1c3BlbmRlZFxuIiwgZGV2LT5uYW1lKTsKKwkJCQlldGhlcjFfd3JpdGV3KGRldiwgU0NCX0NNRFJYUkVTVU1FLCBTQ0JfQUREUiwgc2NiX3QsIHNjYl9jb21tYW5kLCBOT1JNQUxJUlFTKTsKKwkJCQl3cml0ZWIoQ1RSTF9DQSwgUkVHX0NPTlRST0wpOworCQkJCXByaXYoZGV2KS0+c3RhdHMucnhfZHJvcHBlZCArKzsJLyogd2Ugc3VzcGVuZGVkIGR1ZSB0byBsYWNrIG9mIGJ1ZmZlciBzcGFjZSAqLworCQkJfSBlbHNlCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJVIHdlbnQgbm90IHJlYWR5OiAlMDRYXG4iLCBkZXYtPm5hbWUsCisJCQkJCWV0aGVyMV9yZWFkdyhkZXYsIFNDQl9BRERSLCBzY2JfdCwgc2NiX3N0YXR1cywgTk9STUFMSVJRUykpOworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIlJVIHB0ciA9ICUwNFhcbiIsIGV0aGVyMV9yZWFkdyhkZXYsIFNDQl9BRERSLCBzY2JfdCwgc2NiX3JmYV9vZmZzZXQsCisJCQkJCQlOT1JNQUxJUlFTKSk7CisJCX0KKwl9IGVsc2UKKwkJd3JpdGViKENUUkxfQUNLLCBSRUdfQ09OVFJPTCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQKK2V0aGVyMV9jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlldGhlcjFfcmVzZXQgKGRldik7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgorZXRoZXIxX2dldHN0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiAmcHJpdihkZXYpLT5zdGF0czsKK30KKworLyoKKyAqIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICogbnVtX2FkZHJzID09IC0xCVByb21pc2N1b3VzIG1vZGUsIHJlY2VpdmUgYWxsIHBhY2tldHMuCisgKiBudW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QuCisgKiBudW1fYWRkcnMgPiAwCU11bHRpY2FzdCBtb2RlLCByZWNlaXZlIG5vcm1hbCBhbmQgTUMgcGFja2V0cywgYW5kIGRvCisgKgkJCWJlc3QtZWZmb3J0IGZpbHRlcmluZy4KKyAqLworc3RhdGljIHZvaWQKK2V0aGVyMV9zZXRtdWx0aWNhc3RsaXN0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBldGhlcjFfYmFubmVyKHZvaWQpCit7CisJc3RhdGljIHVuc2lnbmVkIGludCB2ZXJzaW9uX3ByaW50ZWQgPSAwOworCisJaWYgKG5ldF9kZWJ1ZyAmJiB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorZXRoZXIxX3Byb2JlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMsIGNvbnN0IHN0cnVjdCBlY2FyZF9pZCAqaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaSwgcmV0ID0gMDsKKworCWV0aGVyMV9iYW5uZXIoKTsKKworCXJldCA9IGVjYXJkX3JlcXVlc3RfcmVzb3VyY2VzKGVjKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgZXRoZXIxX3ByaXYpKTsKKwlpZiAoIWRldikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHJlbGVhc2U7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJmVjLT5kZXYpOworCisJZGV2LT5pcnEgPSBlYy0+aXJxOworCXByaXYoZGV2KS0+YmFzZSA9IGlvcmVtYXAoZWNhcmRfcmVzb3VyY2Vfc3RhcnQoZWMsIEVDQVJEX1JFU19JT0NGQVNUKSwKKwkJCQkgIGVjYXJkX3Jlc291cmNlX2xlbihlYywgRUNBUkRfUkVTX0lPQ0ZBU1QpKTsKKwlpZiAoIXByaXYoZGV2KS0+YmFzZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZyZWU7CisJfQorCisJaWYgKChwcml2KGRldiktPmJ1c190eXBlID0gZXRoZXIxX3Jlc2V0KGRldikpID09IDApIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBmcmVlOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSByZWFkYihJRFBST01fQUREUkVTUyArIChpIDw8IDIpKTsKKworCWlmIChldGhlcjFfaW5pdF8yKGRldikpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBmcmVlOworCX0KKworCWRldi0+b3BlbgkJPSBldGhlcjFfb3BlbjsKKwlkZXYtPnN0b3AJCT0gZXRoZXIxX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ICAgID0gZXRoZXIxX3NlbmRwYWNrZXQ7CisJZGV2LT5nZXRfc3RhdHMJCT0gZXRoZXIxX2dldHN0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gZXRoZXIxX3NldG11bHRpY2FzdGxpc3Q7CisJZGV2LT50eF90aW1lb3V0CQk9IGV0aGVyMV90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSA1ICogSFogLyAxMDA7CisKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGZyZWU7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogZXRoZXIxIGluIHNsb3QgJWQsICIsCisJCWRldi0+bmFtZSwgZWMtPnNsb3Rfbm8pOworICAgIAorCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50ayAoIiUyLjJ4JWMiLCBkZXYtPmRldl9hZGRyW2ldLCBpID09IDUgPyAnXG4nIDogJzonKTsKKworCWVjYXJkX3NldF9kcnZkYXRhKGVjLCBkZXYpOworCXJldHVybiAwOworCisgZnJlZToKKwlpZiAocHJpdihkZXYpLT5iYXNlKQorCQlpb3VubWFwKHByaXYoZGV2KS0+YmFzZSk7CisJZnJlZV9uZXRkZXYoZGV2KTsKKyByZWxlYXNlOgorCWVjYXJkX3JlbGVhc2VfcmVzb3VyY2VzKGVjKTsKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGV0aGVyMV9yZW1vdmUoc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZWNhcmRfZ2V0X2RydmRhdGEoZWMpOworCisJZWNhcmRfc2V0X2RydmRhdGEoZWMsIE5VTEwpOwkKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaW91bm1hcChwcml2KGRldiktPmJhc2UpOworCWZyZWVfbmV0ZGV2KGRldik7CisJZWNhcmRfcmVsZWFzZV9yZXNvdXJjZXMoZWMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGVjYXJkX2lkIGV0aGVyMV9pZHNbXSA9IHsKKwl7IE1BTlVfQUNPUk4sIFBST0RfQUNPUk5fRVRIRVIxIH0sCisJeyAweGZmZmYsIDB4ZmZmZiB9Cit9OworCitzdGF0aWMgc3RydWN0IGVjYXJkX2RyaXZlciBldGhlcjFfZHJpdmVyID0geworCS5wcm9iZQkJPSBldGhlcjFfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChldGhlcjFfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPSBldGhlcjFfaWRzLAorCS5kcnYgPSB7CisJCS5uYW1lCT0gImV0aGVyMSIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGV0aGVyMV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGVjYXJkX3JlZ2lzdGVyX2RyaXZlcigmZXRoZXIxX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBldGhlcjFfZXhpdCh2b2lkKQoreworCWVjYXJkX3JlbW92ZV9kcml2ZXIoJmV0aGVyMV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChldGhlcjFfaW5pdCk7Cittb2R1bGVfZXhpdChldGhlcjFfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FybS9ldGhlcjEuaCBiL2RyaXZlcnMvbmV0L2FybS9ldGhlcjEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGE0YjIzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXJtL2V0aGVyMS5oCkBAIC0wLDAgKzEsMjgxIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvYWNvcm4vbmV0L2V0aGVyMS5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NiBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBOZXR3b3JrIGRyaXZlciBmb3IgQWNvcm4gRXRoZXIxIGNhcmRzLgorICovCisKKyNpZm5kZWYgX0xJTlVYX2V0aGVyMV9ICisjZGVmaW5lIF9MSU5VWF9ldGhlcjFfSAorCisjaWZkZWYgX19FVEhFUjFfQworLyogdXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgPjIgZm9yIGRlYnVnICovCisjaWZuZGVmIE5FVF9ERUJVRworI2RlZmluZSBORVRfREVCVUcgMAorI2VuZGlmCisKKyNkZWZpbmUgcHJpdihkZXYpCSgoc3RydWN0IGV0aGVyMV9wcml2ICopbmV0ZGV2X3ByaXYoZGV2KSkKKworLyogUGFnZSByZWdpc3RlciAqLworI2RlZmluZSBSRUdfUEFHRQkocHJpdihkZXYpLT5iYXNlICsgMHgwMDAwKQorCisvKiBDb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFJFR19DT05UUk9MCShwcml2KGRldiktPmJhc2UgKyAweDAwMDQpCisjZGVmaW5lIENUUkxfUlNUCTB4MDEKKyNkZWZpbmUgQ1RSTF9MT09QQkFDSwkweDAyCisjZGVmaW5lIENUUkxfQ0EJCTB4MDQKKyNkZWZpbmUgQ1RSTF9BQ0sJMHgwOAorCisjZGVmaW5lIEVUSEVSMV9SQU0JKHByaXYoZGV2KS0+YmFzZSArIDB4MjAwMCkKKworLyogSFcgYWRkcmVzcyAqLworI2RlZmluZSBJRFBST01fQUREUkVTUwkocHJpdihkZXYpLT5iYXNlICsgMHgwMDI0KQorCitzdHJ1Y3QgZXRoZXIxX3ByaXYgeworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwl1bnNpZ25lZCBpbnQgdHhfbGluazsKKwl1bnNpZ25lZCBpbnQgdHhfaGVhZDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgdHhfdGFpbDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgcnhfaGVhZDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgcnhfdGFpbDsKKwl1bnNpZ25lZCBjaGFyIGJ1c190eXBlOworCXVuc2lnbmVkIGNoYXIgcmVzZXR0aW5nOworCXVuc2lnbmVkIGNoYXIgaW5pdGlhbGlzaW5nIDogMTsKKwl1bnNpZ25lZCBjaGFyIHJlc3RhcnQgICAgICA6IDE7Cit9OworCisjZGVmaW5lIEk4MjU4Nl9OVUxMICgtMSkKKwordHlwZWRlZiBzdHJ1Y3QgeyAvKiB0ZHIgKi8KKwl1bnNpZ25lZCBzaG9ydCB0ZHJfc3RhdHVzOworCXVuc2lnbmVkIHNob3J0IHRkcl9jb21tYW5kOworCXVuc2lnbmVkIHNob3J0IHRkcl9saW5rOworCXVuc2lnbmVkIHNob3J0IHRkcl9yZXN1bHQ7CisjZGVmaW5lIFREUl9USU1FCSgweDdmZikKKyNkZWZpbmUgVERSX1NIT1JUCSgxIDw8IDEyKQorI2RlZmluZSBURFJfT1BFTgkoMSA8PCAxMykKKyNkZWZpbmUgVERSX1hDVlJQUk9CCSgxIDw8IDE0KQorI2RlZmluZSBURFJfTE5LT0sJKDEgPDwgMTUpCit9IHRkcl90OworCit0eXBlZGVmIHN0cnVjdCB7IC8qIHRyYW5zbWl0ICovCisJdW5zaWduZWQgc2hvcnQgdHhfc3RhdHVzOworCXVuc2lnbmVkIHNob3J0IHR4X2NvbW1hbmQ7CisJdW5zaWduZWQgc2hvcnQgdHhfbGluazsKKwl1bnNpZ25lZCBzaG9ydCB0eF90YmRvZmZzZXQ7Cit9IHR4X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsgLyogdGJkICovCisJdW5zaWduZWQgc2hvcnQgdGJkX29wdHM7CisjZGVmaW5lIFRCRF9DTlQJCSgweDNmZmYpCisjZGVmaW5lIFRCRF9FT0wJCSgxIDw8IDE1KQorCXVuc2lnbmVkIHNob3J0IHRiZF9saW5rOworCXVuc2lnbmVkIHNob3J0IHRiZF9idWZsOworCXVuc2lnbmVkIHNob3J0IHRiZF9idWZoOworfSB0YmRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeyAvKiByZmQgKi8KKwl1bnNpZ25lZCBzaG9ydCByZmRfc3RhdHVzOworI2RlZmluZSBSRkRfTk9FT0YJKDEgPDwgNikKKyNkZWZpbmUgUkZEX0ZSQU1FU0hPUlQJKDEgPDwgNykKKyNkZWZpbmUgUkZEX0RNQU9WUk4JKDEgPDwgOCkKKyNkZWZpbmUgUkZEX05PUkVTT1VSQ0VTCSgxIDw8IDkpCisjZGVmaW5lIFJGRF9BTElHTkVSUk9SCSgxIDw8IDEwKQorI2RlZmluZSBSRkRfQ1JDRVJST1IJKDEgPDwgMTEpCisjZGVmaW5lIFJGRF9PSwkJKDEgPDwgMTMpCisjZGVmaW5lIFJGRF9GRENPTlNVTUVECSgxIDw8IDE0KQorI2RlZmluZSBSRkRfQ09NUExFVEUJKDEgPDwgMTUpCisJdW5zaWduZWQgc2hvcnQgcmZkX2NvbW1hbmQ7CisjZGVmaW5lIFJGRF9DTURTVVNQRU5ECSgxIDw8IDE0KQorI2RlZmluZSBSRkRfQ01ERUwJKDEgPDwgMTUpCisJdW5zaWduZWQgc2hvcnQgcmZkX2xpbms7CisJdW5zaWduZWQgc2hvcnQgcmZkX3JiZG9mZnNldDsKKwl1bnNpZ25lZCBjaGFyICByZmRfZGVzdFs2XTsKKwl1bnNpZ25lZCBjaGFyICByZmRfc3JjWzZdOworCXVuc2lnbmVkIHNob3J0IHJmZF9sZW47Cit9IHJmZF90OworCit0eXBlZGVmIHN0cnVjdCB7IC8qIHJiZCAqLworCXVuc2lnbmVkIHNob3J0IHJiZF9zdGF0dXM7CisjZGVmaW5lIFJCRF9BQ05UCSgweDNmZmYpCisjZGVmaW5lIFJCRF9BQ05UVkFMSUQJKDEgPDwgMTQpCisjZGVmaW5lIFJCRF9FT0YJCSgxIDw8IDE1KQorCXVuc2lnbmVkIHNob3J0IHJiZF9saW5rOworCXVuc2lnbmVkIHNob3J0IHJiZF9idWZsOworCXVuc2lnbmVkIHNob3J0IHJiZF9idWZoOworCXVuc2lnbmVkIHNob3J0IHJiZF9sZW47Cit9IHJiZF90OworCit0eXBlZGVmIHN0cnVjdCB7IC8qIG5vcCAqLworCXVuc2lnbmVkIHNob3J0IG5vcF9zdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgbm9wX2NvbW1hbmQ7CisJdW5zaWduZWQgc2hvcnQgbm9wX2xpbms7Cit9IG5vcF90OworCit0eXBlZGVmIHN0cnVjdCB7IC8qIHNldCBtdWx0aWNhc3QgKi8KKwl1bnNpZ25lZCBzaG9ydCBtY19zdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgbWNfY29tbWFuZDsKKwl1bnNpZ25lZCBzaG9ydCBtY19saW5rOworCXVuc2lnbmVkIHNob3J0IG1jX2NudDsKKwl1bnNpZ25lZCBjaGFyICBtY19hZGRyc1sxXVs2XTsKK30gbWNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeyAvKiBzZXQgYWRkcmVzcyAqLworCXVuc2lnbmVkIHNob3J0IHNhX3N0YXR1czsKKwl1bnNpZ25lZCBzaG9ydCBzYV9jb21tYW5kOworCXVuc2lnbmVkIHNob3J0IHNhX2xpbms7CisJdW5zaWduZWQgY2hhciAgc2FfYWRkcls2XTsKK30gc2FfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeyAvKiBjb25maWcgY29tbWFuZCAqLworCXVuc2lnbmVkIHNob3J0IGNmZ19zdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgY2ZnX2NvbW1hbmQ7CisJdW5zaWduZWQgc2hvcnQgY2ZnX2xpbms7CisJdW5zaWduZWQgY2hhciAgY2ZnX2J5dGVjbnQ7CS8qIHNpemUgZm9sbCBkYXRhOiA0IC0gMTIJCSAqLworCXVuc2lnbmVkIGNoYXIgIGNmZ19maWZvbGltOwkvKiBGSUZPIHRocmVzaG9sZAkJCSAqLworCXVuc2lnbmVkIGNoYXIgIGNmZ19ieXRlODsKKyNkZWZpbmUgQ0ZHOF9TUkRZCSgxIDw8IDYpCisjZGVmaW5lIENGRzhfU0FWRUJBREYJKDEgPDwgNykKKwl1bnNpZ25lZCBjaGFyICBjZmdfYnl0ZTk7CisjZGVmaW5lIENGRzlfQUREUkxFTih4KQkoeCkKKyNkZWZpbmUgQ0ZHOV9BRERSTEVOQlVGCSgxIDw8IDMpCisjZGVmaW5lIENGRzlfUFJFQU1CMgkoMCA8PCA0KQorI2RlZmluZSBDRkc5X1BSRUFNQjQJKDEgPDwgNCkKKyNkZWZpbmUgQ0ZHOV9QUkVBTUI4CSgyIDw8IDQpCisjZGVmaW5lIENGRzlfUFJFQU1CMTYJKDMgPDwgNCkKKyNkZWZpbmUgQ0ZHOV9JTE9PUEJBQ0sJKDEgPDwgNikKKyNkZWZpbmUgQ0ZHOV9FTE9PUEJBQ0sJKDEgPDwgNykKKwl1bnNpZ25lZCBjaGFyICBjZmdfYnl0ZTEwOworI2RlZmluZSBDRkcxMF9MSU5QUkkoeCkJKHgpCisjZGVmaW5lIENGRzEwX0FDUih4KQkoeCA8PCA0KQorI2RlZmluZSBDRkcxMF9CT0ZNRVQJKDEgPDwgNykKKwl1bnNpZ25lZCBjaGFyICBjZmdfaWZzOworCXVuc2lnbmVkIGNoYXIgIGNmZ19zbG90bDsKKwl1bnNpZ25lZCBjaGFyICBjZmdfYnl0ZTEzOworI2RlZmluZSBDRkcxM19TTE9USCh4KQkoeCkKKyNkZWZpbmUgQ0ZHMTNfUkVUUlkoeCkJKHggPDwgNCkKKwl1bnNpZ25lZCBjaGFyICBjZmdfYnl0ZTE0OworI2RlZmluZSBDRkcxNF9QUk9NSVNDCSgxIDw8IDApCisjZGVmaW5lIENGRzE0X0RJU0JSRAkoMSA8PCAxKQorI2RlZmluZSBDRkcxNF9NQU5DSAkoMSA8PCAyKQorI2RlZmluZSBDRkcxNF9UTkNSUwkoMSA8PCAzKQorI2RlZmluZSBDRkcxNF9OT0NSQwkoMSA8PCA0KQorI2RlZmluZSBDRkcxNF9DUkMxNgkoMSA8PCA1KQorI2RlZmluZSBDRkcxNF9CVFNURgkoMSA8PCA2KQorI2RlZmluZSBDRkcxNF9GTEdQQUQJKDEgPDwgNykKKwl1bnNpZ25lZCBjaGFyICBjZmdfYnl0ZTE1OworI2RlZmluZSBDRkcxNV9DU1RGKHgpCSh4KQorI2RlZmluZSBDRkcxNV9JQ1NTCSgxIDw8IDMpCisjZGVmaW5lIENGRzE1X0NEVEYoeCkJKHggPDwgNCkKKyNkZWZpbmUgQ0ZHMTVfSUNEUwkoMSA8PCA3KQorCXVuc2lnbmVkIHNob3J0IGNmZ19taW5mcm1sZW47Cit9IGNmZ190OworCit0eXBlZGVmIHN0cnVjdCB7IC8qIHNjYiAqLworCXVuc2lnbmVkIHNob3J0IHNjYl9zdGF0dXM7CS8qIHN0YXR1cyBvZiA4MjU4NgkJCSovCisjZGVmaW5lIFNDQl9TVFJYTUFTSwkJKDcgPDwgNCkJLyogUmVjZWl2ZSB1bml0IHN0YXR1cwkJKi8KKyNkZWZpbmUgU0NCX1NUUlhJRExFCQkoMCA8PCA0KQkvKiBJZGxlCQkJCSovCisjZGVmaW5lIFNDQl9TVFJYU1VTUAkJKDEgPDwgNCkJLyogU3VzcGVuZGVkCQkJKi8KKyNkZWZpbmUgU0NCX1NUUlhOUkVTCQkoMiA8PCA0KQkvKiBObyByZXNvdXJjZXMJCQkqLworI2RlZmluZSBTQ0JfU1RSWFJEWQkJKDQgPDwgNCkJLyogUmVhZHkJCQkqLworI2RlZmluZSBTQ0JfU1RDVU1BU0sJCSg3IDw8IDgpCS8qIENvbW1hbmQgdW5pdCBzdGF0dXMJCSovCisjZGVmaW5lIFNDQl9TVENVSURMRQkJKDAgPDwgOCkJLyogSWRsZQkJCQkqLworI2RlZmluZSBTQ0JfU1RDVVNVU1AJCSgxIDw8IDgpCS8qIFN1c3BlbmRlZAkJCSovCisjZGVmaW5lIFNDQl9TVENVQUNUVgkJKDIgPDwgOCkJLyogQWN0aXZlCQkJKi8KKyNkZWZpbmUgU0NCX1NUUk5SCQkoMSA8PCAxMikJLyogUmVjZWl2ZSB1bml0IG5vdCByZWFkeQkqLworI2RlZmluZSBTQ0JfU1RDTkEJCSgxIDw8IDEzKQkvKiBDb21tYW5kIHVuaXQgbm90IHJlYWR5CSovCisjZGVmaW5lIFNDQl9TVEZSCQkoMSA8PCAxNCkJLyogRnJhbWUgcmVjZWl2ZWQJCSovCisjZGVmaW5lIFNDQl9TVENYCQkoMSA8PCAxNSkJLyogQ29tbWFuZCBjb21wbGV0ZWQJCSovCisJdW5zaWduZWQgc2hvcnQgc2NiX2NvbW1hbmQ7CS8qIE5leHQgY29tbWFuZAkJCQkqLworI2RlZmluZSBTQ0JfQ01EUlhTVEFSVAkJKDEgPDwgNCkJLyogU3RhcnQgKGF0IHJmYV9vZmZzZXQpCSovCisjZGVmaW5lIFNDQl9DTURSWFJFU1VNRQkJKDIgPDwgNCkJLyogUmVzdW1lIHJlY2VwdGlvbgkJKi8KKyNkZWZpbmUgU0NCX0NNRFJYU1VTUEVORAkoMyA8PCA0KQkvKiBTdXNwZW5kIHJlY2VwdGlvbgkJKi8KKyNkZWZpbmUgU0NCX0NNRFJYQUJPUlQJCSg0IDw8IDQpCS8qIEFib3J0IHJlY2VwdGlvbgkJKi8KKyNkZWZpbmUgU0NCX0NNRENVQ1NUQVJUCQkoMSA8PCA4KQkvKiBTdGFydCAoYXQgY2JsX29mZnNldCkJKi8KKyNkZWZpbmUgU0NCX0NNRENVQ1JFU1VNRQkoMiA8PCA4KQkvKiBSZXN1bWUgZXhlY3V0aW9uCQkqLworI2RlZmluZSBTQ0JfQ01EQ1VDU1VTUEVORAkoMyA8PCA4KQkvKiBTdXNwZW5kIGV4ZWN1dGlvbgkJKi8KKyNkZWZpbmUgU0NCX0NNRENVQ0FCT1JUCQkoNCA8PCA4KQkvKiBBYm9ydCBleGVjdXRpb24JCSovCisjZGVmaW5lIFNDQl9DTURBQ0tSTlIJCSgxIDw8IDEyKQkvKiBBY2sgUlUgbm90IHJlYWR5CQkqLworI2RlZmluZSBTQ0JfQ01EQUNLQ05BCQkoMSA8PCAxMykJLyogQWNrIENVIG5vdCByZWFkeQkJKi8KKyNkZWZpbmUgU0NCX0NNREFDS0ZSCQkoMSA8PCAxNCkJLyogQWNrIEZyYW1lIHJlY2VpdmVkCQkqLworI2RlZmluZSBTQ0JfQ01EQUNLQ1gJCSgxIDw8IDE1KQkvKiBBY2sgQ29tbWFuZCBjb21wbGV0ZQkJKi8KKwl1bnNpZ25lZCBzaG9ydCBzY2JfY2JsX29mZnNldDsJLyogT2Zmc2V0IG9mIGZpcnN0IGNvbW1hbmQgdW5pdAkJKi8KKwl1bnNpZ25lZCBzaG9ydCBzY2JfcmZhX29mZnNldDsJLyogT2Zmc2V0IG9mIGZpcnN0IHJlY2VpdmUgZnJhbWUgYXJlYQkqLworCXVuc2lnbmVkIHNob3J0IHNjYl9jcmNfZXJyb3JzOwkvKiBQcm9wZXJseSBhbGlnbmVkIGZyYW1lIHdpdGggQ1JDIGVycm9yKi8KKwl1bnNpZ25lZCBzaG9ydCBzY2JfYWxuX2Vycm9yczsJLyogTWlzYWxpZ25lZCBmcmFtZXMJCQkqLworCXVuc2lnbmVkIHNob3J0IHNjYl9yc2NfZXJyb3JzOwkvKiBGcmFtZXMgbG9zdCBkdWUgdG8gbm8gc3BhY2UJCSovCisJdW5zaWduZWQgc2hvcnQgc2NiX292bl9lcnJvcnM7CS8qIEZyYW1lcyBsb3N0IGR1ZSB0byBzbG93IGJ1cwkJKi8KK30gc2NiX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsgLyogaXNjcCAqLworCXVuc2lnbmVkIHNob3J0IGlzY3BfYnVzeTsJLyogc2V0IGJ5IENQVSBiZWZvcmUgQ0EJCQkqLworCXVuc2lnbmVkIHNob3J0IGlzY3Bfb2Zmc2V0OwkvKiBvZmZzZXQgb2YgU0NCCQkJKi8KKwl1bnNpZ25lZCBzaG9ydCBpc2NwX2Jhc2VsOwkvKiBiYXNlIG9mIFNDQgkJCQkqLworCXVuc2lnbmVkIHNob3J0IGlzY3BfYmFzZWg7Cit9IGlzY3BfdDsKKworICAgIC8qIHRoaXMgYWRkcmVzcyBtdXN0IGJlIDB4ZmZmNiAqLwordHlwZWRlZiBzdHJ1Y3QgeyAvKiBzY3AgKi8KKwl1bnNpZ25lZCBzaG9ydCBzY3Bfc3lzYnVzOwkvKiBidXMgc2l6ZSAqLworI2RlZmluZSBTQ1BfU1lfMTZCQlVTCTB4MDAKKyNkZWZpbmUgU0NQX1NZXzhCQlVTCTB4MDEKKwl1bnNpZ25lZCBzaG9ydCBzY3BfanVua1syXTsJLyoganVuayAqLworCXVuc2lnbmVkIHNob3J0IHNjcF9pc2NwbDsJLyogbG93ZXIgMTYgYml0cyBvZiBpc2NwICovCisJdW5zaWduZWQgc2hvcnQgc2NwX2lzY3BoOwkvKiB1cHBlciAxNiBiaXRzIG9mIGlzY3AgKi8KK30gc2NwX3Q7CisKKy8qIGNvbW1hbmRzICovCisjZGVmaW5lIENNRF9OT1AJCQkwCisjZGVmaW5lIENNRF9TRVRBRERSRVNTCQkxCisjZGVmaW5lIENNRF9DT05GSUcJCTIKKyNkZWZpbmUgQ01EX1NFVE1VTFRJQ0FTVAkzCisjZGVmaW5lIENNRF9UWAkJCTQKKyNkZWZpbmUgQ01EX1REUgkJCTUKKyNkZWZpbmUgQ01EX0RVTVAJCTYKKyNkZWZpbmUgQ01EX0RJQUdOT1NFCQk3CisKKyNkZWZpbmUgQ01EX01BU0sJCTcKKworI2RlZmluZSBDTURfSU5UUgkJKDEgPDwgMTMpCisjZGVmaW5lIENNRF9TVVNQCQkoMSA8PCAxNCkKKyNkZWZpbmUgQ01EX0VPTAkJCSgxIDw8IDE1KQorCisjZGVmaW5lIFNUQVRfQ09MTElTSU9OUwkJKDE1KQorI2RlZmluZSBTVEFUX0NPTExFWENFU1NJVkUJKDEgPDwgNSkKKyNkZWZpbmUgU1RBVF9DT0xMQUZURVJUWAkoMSA8PCA2KQorI2RlZmluZSBTVEFUX1RYREVGRVJSRUQJCSgxIDw8IDcpCisjZGVmaW5lIFNUQVRfVFhTTE9XRE1BCQkoMSA8PCA4KQorI2RlZmluZSBTVEFUX1RYTE9TVENUUwkJKDEgPDwgOSkKKyNkZWZpbmUgU1RBVF9OT0NBUlJJRVIJCSgxIDw8IDEwKQorI2RlZmluZSBTVEFUX0ZBSUwJCSgxIDw8IDExKQorI2RlZmluZSBTVEFUX0FCT1JURUQJCSgxIDw8IDEyKQorI2RlZmluZSBTVEFUX09LCQkJKDEgPDwgMTMpCisjZGVmaW5lIFNUQVRfQlVTWQkJKDEgPDwgMTQpCisjZGVmaW5lIFNUQVRfQ09NUExFVEUJCSgxIDw8IDE1KQorI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIEV0aGVyMSBjYXJkIGRlZmluaXRpb25zOgorICoKKyAqIEZBU1QgYWNjZXNzZXM6CisgKgkrMAlQYWdlIHJlZ2lzdGVyCisgKiAJCQkxNiBwYWdlcworICoJKzQJQ29udHJvbAorICoJCQknMScgPSByZXNldAorICoJCQknMicgPSBsb29wYmFjaworICoJCQknNCcgPSBDQQorICoJCQknOCcgPSBpbnQgYWNrCisgKgorICogUkFNIGF0IGFkZHJlc3MgKyAweDIwMDAKKyAqIFBvZC4gUHJvZCBpZCA9IDMKKyAqIFdvcmRzIGFmdGVyIElEIGJsb2NrIFtiYXNlICsgOCB3b3Jkc10KKyAqCSswIHBjYiBpc3N1ZSAoMHgwYyBhbmQgMHhmMyBpbnZhbGlkKQorICoJKzEgLSArNiBldGggaHcgYWRkcmVzcworICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vZXRoZXIzLmMgYi9kcml2ZXJzL25ldC9hcm0vZXRoZXIzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNjNTNhYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2FybS9ldGhlcjMuYwpAQCAtMCwwICsxLDkzNiBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL2Fjb3JuL25ldC9ldGhlcjMuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMCBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFNFRVEgbnE4MDA1IGV0aGVybmV0IGRyaXZlciBmb3IgQWNvcm4vQU5UIEV0aGVyMyBjYXJkCisgKiAgZm9yIEFjb3JuIG1hY2hpbmVzCisgKgorICogQnkgUnVzc2VsbCBLaW5nLCB3aXRoIHNvbWUgc3VnZ2VzdGlvbnMgZnJvbSBib3JyaXNAYW50LmNvLnVrCisgKgorICogQ2hhbmdlbG9nOgorICogMS4wNAlSTUsJMjkvMDIvMTk5NglXb24ndCBwYXNzIHBhY2tldHMgdGhhdCBhcmUgZnJvbSBvdXIgZXRoZXJuZXQKKyAqCQkJCWFkZHJlc3MgdXAgdG8gdGhlIGhpZ2hlciBsZXZlbHMgLSB0aGV5J3JlCisgKgkJCQlzaWxlbnRseSBpZ25vcmVkLiAgSS9GIGNhbiBub3cgYmUgcHV0IGludG8KKyAqCQkJCW11bHRpY2FzdCBtb2RlLiAgUmVjZWl2ZXIgcm91dGluZSBvcHRpbWlzZWQuCisgKiAxLjA1CVJNSwkzMC8wMi8xOTk2CU5vdyBjbGFpbXMgaW50ZXJydXB0IGF0IG9wZW4gd2hlbiBwYXJ0IG9mCisgKgkJCQl0aGUga2VybmVsIHJhdGhlciB0aGFuIHdoZW4gYSBtb2R1bGUuCisgKiAxLjA2CVJNSwkwMi8wMy8xOTk2CVZhcmlvdXMgY29kZSBjbGVhbnVwcworICogMS4wNwlSTUsJMTMvMTAvMTk5NglPcHRpbWlzZWQgaW50ZXJydXB0IHJvdXRpbmUgYW5kIHRyYW5zbWl0CisgKgkJCQlyb3V0aW5lcy4KKyAqIDEuMDgJUk1LCTE0LzEwLzE5OTYJRml4ZWQgcHJvYmxlbSB3aXRoIHRvbyBtYW55IHBhY2tldHMsCisgKgkJCQlwcmV2ZW50ZWQgdGhlIGtlcm5lbCBtZXNzYWdlIGFib3V0IGRyb3BwZWQKKyAqCQkJCXBhY2tldHMgYXBwZWFyaW5nIHRvbyBtYW55IHRpbWVzIGEgc2Vjb25kLgorICoJCQkJTm93IGRvZXMgbm90IGRpc2FibGUgYWxsIElSUXMsIG9ubHkgdGhlIElSUQorICoJCQkJdXNlZCBieSB0aGlzIGNhcmQuCisgKiAxLjA5CVJNSwkxMC8xMS8xOTk2CU9ubHkgZW5hYmxlcyBUWCBpcnEgd2hlbiBidWZmZXIgc3BhY2UgaXMgbG93LAorICoJCQkJYnV0IHdlIHN0aWxsIHNlcnZpY2UgdGhlIFRYIHF1ZXVlIGlmIHdlIGdldCBhCisgKgkJCQlSWCBpbnRlcnJ1cHQuCisgKiAxLjEwCVJNSwkxNS8wNy8xOTk3CUZpeGVkIGF1dG9wcm9iaW5nIG9mIE5RODAwNC4KKyAqIDEuMTEJUk1LCTE2LzExLzE5OTcJRml4ZWQgYXV0b3Byb2Jpbmcgb2YgTlE4MDA1QS4KKyAqIDEuMTIJUk1LCTMxLzEyLzE5OTcJUmVtb3ZlZCByZWZlcmVuY2UgdG8gZGV2X3RpbnQgZm9yIExpbnV4IDIuMS4KKyAqICAgICAgUk1LCTI3LzA2LzE5OTgJQ2hhbmdlZCBhc20vZGVsYXkuaCB0byBsaW51eC9kZWxheS5oLgorICogMS4xMwlSTUsJMjkvMDYvMTk5OAlGaXhlZCBwcm9ibGVtIHdpdGggdHJhbnNtaXNzaW9uIG9mIHBhY2tldHMuCisgKgkJCQlDaGlwIHNlZW1zIHRvIGhhdmUgYSBidWcgaW4sIHdoZXJlYnkgaWYgdGhlCisgKgkJCQlwYWNrZXQgc3RhcnRzIHR3byBieXRlcyBmcm9tIHRoZSBlbmQgb2YgdGhlCisgKgkJCQlidWZmZXIsIGl0IGNvcnJ1cHRzIHRoZSByZWNlaXZlciBjaGFpbiwgYW5kCisgKgkJCQluZXZlciB1cGRhdGVzIHRoZSB0cmFuc21pdCBzdGF0dXMgY29ycmVjdGx5LgorICogMS4xNAlSTUsJMDcvMDEvMTk5OAlBZGRlZCBpbml0aWFsIGNvZGUgZm9yIEVUSEVSQiBhZGRyZXNzaW5nLgorICogMS4xNQlSTUsJMzAvMDQvMTk5OQlNb3JlIGZpeGVzIHRvIHRoZSB0cmFuc21pdCByb3V0aW5lIGZvciBidWdneQorICoJCQkJaGFyZHdhcmUuCisgKiAxLjE2CVJNSwkxMC8wMi8yMDAwCVVwZGF0ZWQgZm9yIDIuMy40MworICogMS4xNwlSTUsJMTMvMDUvMjAwMAlVcGRhdGVkIGZvciAyLjMuOTktcHJlOAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2VjYXJkLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9ICJldGhlcjMgZXRoZXJuZXQgZHJpdmVyIChjKSAxOTk1LTIwMDAgUi5NLktpbmcgdjEuMTdcbiI7CisKKyNpbmNsdWRlICJldGhlcjMuaCIKKworc3RhdGljIHVuc2lnbmVkIGludCBuZXRfZGVidWcgPSBORVRfREVCVUc7CisKK3N0YXRpYyB2b2lkCWV0aGVyM19zZXRtdWx0aWNhc3RsaXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludAlldGhlcjNfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG1heGNudCk7CitzdGF0aWMgdm9pZAlldGhlcjNfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CWV0aGVyM19vcGVuIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJZXRoZXIzX3NlbmRwYWNrZXQgKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGV0aGVyM19pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludAlldGhlcjNfY2xvc2UgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpldGhlcjNfZ2V0c3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQJZXRoZXIzX3NldG11bHRpY2FzdGxpc3QgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQJZXRoZXIzX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKyNkZWZpbmUgQlVTXzE2CQkyCisjZGVmaW5lIEJVU184CQkxCisjZGVmaW5lIEJVU19VTktOT1dOCTAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3R5cGVkZWYgZW51bSB7CisJYnVmZmVyX3dyaXRlLAorCWJ1ZmZlcl9yZWFkCit9IGJ1ZmZlcl9yd190OworCisvKgorICogZXRoZXIzIHJlYWQvd3JpdGUuICBTbG93IHRoaW5ncyBkb3duIGEgYml0Li4uCisgKiBUaGUgU0VFUTgwMDUgZG9lc24ndCBsaWtlIHVzIHdyaXRpbmcgdG8gaXRzIHJlZ2lzdGVycworICogdG9vIHF1aWNrbHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBldGhlcjNfb3V0YihpbnQgdiwgY29uc3Qgdm9pZCBfX2lvbWVtICpyKQoreworCXdyaXRlYih2LCByKTsKKwl1ZGVsYXkoMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBldGhlcjNfb3V0dyhpbnQgdiwgY29uc3Qgdm9pZCBfX2lvbWVtICpyKQoreworCXdyaXRldyh2LCByKTsKKwl1ZGVsYXkoMSk7Cit9CisjZGVmaW5lIGV0aGVyM19pbmIocikJCSh7IHVuc2lnbmVkIGludCBfX3YgPSByZWFkYigocikpOyB1ZGVsYXkoMSk7IF9fdjsgfSkKKyNkZWZpbmUgZXRoZXIzX2ludyhyKQkJKHsgdW5zaWduZWQgaW50IF9fdiA9IHJlYWR3KChyKSk7IHVkZWxheSgxKTsgX192OyB9KQorCitzdGF0aWMgaW50CitldGhlcjNfc2V0YnVmZmVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGJ1ZmZlcl9yd190IHJlYWQsIGludCBzdGFydCkKK3sKKwlpbnQgdGltZW91dCA9IDEwMDA7CisKKwlldGhlcjNfb3V0dyhwcml2KGRldiktPnJlZ3MuY29uZmlnMSB8IENGRzFfTE9DQlVGTUVNLCBSRUdfQ09ORklHMSk7CisJZXRoZXIzX291dHcocHJpdihkZXYpLT5yZWdzLmNvbW1hbmQgfCBDTURfRklGT1dSSVRFLCBSRUdfQ09NTUFORCk7CisKKwl3aGlsZSAoKGV0aGVyM19pbncoUkVHX1NUQVRVUykgJiBTVEFUX0ZJRk9FTVBUWSkgPT0gMCkgeworCQlpZiAoIXRpbWVvdXQtLSkgeworCQkJcHJpbnRrKCIlczogc2V0YnVmZmVyIGJyb2tlblxuIiwgZGV2LT5uYW1lKTsKKwkJCXByaXYoZGV2KS0+YnJva2VuID0gMTsKKwkJCXJldHVybiAxOworCQl9CisJCXVkZWxheSgxKTsKKwl9CisKKwlpZiAocmVhZCA9PSBidWZmZXJfcmVhZCkgeworCQlldGhlcjNfb3V0dyhzdGFydCwgUkVHX0RNQUFERFIpOworCQlldGhlcjNfb3V0dyhwcml2KGRldiktPnJlZ3MuY29tbWFuZCB8IENNRF9GSUZPUkVBRCwgUkVHX0NPTU1BTkQpOworCX0gZWxzZSB7CisJCWV0aGVyM19vdXR3KHByaXYoZGV2KS0+cmVncy5jb21tYW5kIHwgQ01EX0ZJRk9XUklURSwgUkVHX0NPTU1BTkQpOworCQlldGhlcjNfb3V0dyhzdGFydCwgUkVHX0RNQUFERFIpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHdyaXRlIGRhdGEgdG8gdGhlIGJ1ZmZlciBtZW1vcnkKKyAqLworI2RlZmluZSBldGhlcjNfd3JpdGVidWZmZXIoZGV2LGRhdGEsbGVuZ3RoKQkJCVwKKwl3cml0ZXN3KFJFR19CVUZXSU4sIChkYXRhKSwgKGxlbmd0aCkgPj4gMSkKKworI2RlZmluZSBldGhlcjNfd3JpdGV3b3JkKGRldixkYXRhKQkJCQlcCisJd3JpdGV3KChkYXRhKSwgUkVHX0JVRldJTikKKworI2RlZmluZSBldGhlcjNfd3JpdGVsb25nKGRldixkYXRhKQl7CQkJXAorCXZvaWQgX19pb21lbSAqcmVnX2J1ZndpbiA9IFJFR19CVUZXSU47CQkJXAorCXdyaXRldygoZGF0YSksIHJlZ19idWZ3aW4pOwkJCQlcCisJd3JpdGV3KChkYXRhKSA+PiAxNiwgcmVnX2J1Zndpbik7CQkJXAorfQorCisvKgorICogcmVhZCBkYXRhIGZyb20gdGhlIGJ1ZmZlciBtZW1vcnkKKyAqLworI2RlZmluZSBldGhlcjNfcmVhZGJ1ZmZlcihkZXYsZGF0YSxsZW5ndGgpCQkJXAorCXJlYWRzdyhSRUdfQlVGV0lOLCAoZGF0YSksIChsZW5ndGgpID4+IDEpCisKKyNkZWZpbmUgZXRoZXIzX3JlYWR3b3JkKGRldikJCQkJCVwKKwlyZWFkdyhSRUdfQlVGV0lOKQorCisjZGVmaW5lIGV0aGVyM19yZWFkbG9uZyhkZXYpCSAJCQkJXAorCXJlYWR3KFJFR19CVUZXSU4pIHwgKHJlYWR3KFJFR19CVUZXSU4pIDw8IDE2KQorCisvKgorICogU3dpdGNoIExFRCBvZmYuLi4KKyAqLworc3RhdGljIHZvaWQgZXRoZXIzX2xlZG9mZih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJZXRoZXIzX291dHcocHJpdihkZXYpLT5yZWdzLmNvbmZpZzIgfD0gQ0ZHMl9DVFJMTywgUkVHX0NPTkZJRzIpOworfQorCisvKgorICogc3dpdGNoIExFRCBvbi4uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZXRoZXIzX2xlZG9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGVsX3RpbWVyKCZwcml2KGRldiktPnRpbWVyKTsKKwlwcml2KGRldiktPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLyA1MDsgLyogbGVhdmUgb24gZm9yIDEvNTB0aCBzZWNvbmQgKi8KKwlwcml2KGRldiktPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJcHJpdihkZXYpLT50aW1lci5mdW5jdGlvbiA9IGV0aGVyM19sZWRvZmY7CisJYWRkX3RpbWVyKCZwcml2KGRldiktPnRpbWVyKTsKKwlpZiAocHJpdihkZXYpLT5yZWdzLmNvbmZpZzIgJiBDRkcyX0NUUkxPKQorCQlldGhlcjNfb3V0dyhwcml2KGRldiktPnJlZ3MuY29uZmlnMiAmPSB+Q0ZHMl9DVFJMTywgUkVHX0NPTkZJRzIpOworfQorCisvKgorICogUmVhZCB0aGUgZXRoZXJuZXQgYWRkcmVzcyBzdHJpbmcgZnJvbSB0aGUgb24gYm9hcmQgcm9tLgorICogVGhpcyBpcyBhbiBhc2NpaSBzdHJpbmchISEKKyAqLworc3RhdGljIGludCBfX2luaXQKK2V0aGVyM19hZGRyKGNoYXIgKmFkZHIsIHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMpCit7CisJc3RydWN0IGluX2NodW5rX2RpciBjZDsKKwljaGFyICpzOworCQorCWlmIChlY2FyZF9yZWFkY2h1bmsoJmNkLCBlYywgMHhmNSwgMCkgJiYgKHMgPSBzdHJjaHIoY2QuZC5zdHJpbmcsICcoJykpKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpPDY7IGkrKykgeworCQkJYWRkcltpXSA9IHNpbXBsZV9zdHJ0b3VsKHMgKyAxLCAmcywgMHgxMCk7CisJCQlpZiAoKnMgIT0gKGk9PTU/JyknIDogJzonICkpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPT0gNikKKwkJCXJldHVybiAwOworCX0KKwkvKiBJIHdvbmRlciBpZiB3ZSBzaG91bGQgZXZlbiBsZXQgdGhlIHVzZXIgY29udGludWUgaW4gdGhpcyBjYXNlCisJICogICAtIG5vLCBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gZGlzYWJsZSB0aGUgZGV2aWNlCisJICovCisJcHJpbnRrKEtFUk5fRVJSICJldGhlcjM6IENvdWxkbid0IHJlYWQgYSB2YWxpZCBNQUMgYWRkcmVzcyBmcm9tIGNhcmQuXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgX19pbml0CitldGhlcjNfcmFtdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGJ5dGUpCit7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyID0ga21hbGxvYyhSWF9FTkQsIEdGUF9LRVJORUwpOworCWludCBpLHJldCA9IDA7CisJaW50IG1heF9lcnJvcnMgPSA0OworCWludCBiYWQgPSAtMTsKKworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gMTsKKworCW1lbXNldChidWZmZXIsIGJ5dGUsIFJYX0VORCk7CisJZXRoZXIzX3NldGJ1ZmZlcihkZXYsIGJ1ZmZlcl93cml0ZSwgMCk7CisJZXRoZXIzX3dyaXRlYnVmZmVyKGRldiwgYnVmZmVyLCBUWF9FTkQpOworCWV0aGVyM19zZXRidWZmZXIoZGV2LCBidWZmZXJfd3JpdGUsIFJYX1NUQVJUKTsKKwlldGhlcjNfd3JpdGVidWZmZXIoZGV2LCBidWZmZXIgKyBSWF9TVEFSVCwgUlhfTEVOKTsKKwltZW1zZXQoYnVmZmVyLCBieXRlIF4gMHhmZiwgUlhfRU5EKTsKKwlldGhlcjNfc2V0YnVmZmVyKGRldiwgYnVmZmVyX3JlYWQsIDApOworCWV0aGVyM19yZWFkYnVmZmVyKGRldiwgYnVmZmVyLCBUWF9FTkQpOworCWV0aGVyM19zZXRidWZmZXIoZGV2LCBidWZmZXJfcmVhZCwgUlhfU1RBUlQpOworCWV0aGVyM19yZWFkYnVmZmVyKGRldiwgYnVmZmVyICsgUlhfU1RBUlQsIFJYX0xFTik7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfRU5EOyBpKyspIHsKKwkJaWYgKGJ1ZmZlcltpXSAhPSBieXRlKSB7CisJCQlpZiAobWF4X2Vycm9ycyA+IDAgJiYgYmFkICE9IGJ1ZmZlcltpXSkgeworCQkJCXByaW50aygiJXM6IFJBTSBmYWlsZWQgd2l0aCAoJTAyWCBpbnN0ZWFkIG9mICUwMlgpIGF0IDB4JTA0WCIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgYnVmZmVyW2ldLCBieXRlLCBpKTsKKwkJCQlyZXQgPSAyOworCQkJCW1heF9lcnJvcnMtLTsKKwkJCQliYWQgPSBpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGJhZCAhPSAtMSkgeworCQkJCWlmIChiYWQgIT0gaSAtIDEpCisJCQkJCXByaW50aygiIC0gMHglMDRYXG4iLCBpIC0gMSk7CisJCQkJcHJpbnRrKCJcbiIpOworCQkJCWJhZCA9IC0xOworCQkJfQorCQl9CisJfQorCWlmIChiYWQgIT0gLTEpCisJCXByaW50aygiIC0gMHhmZmZmXG4iKTsKKwlrZnJlZShidWZmZXIpOworCisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IF9faW5pdCBldGhlcjNfaW5pdF8yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisKKwlwcml2KGRldiktPnJlZ3MuY29uZmlnMSA9IENGRzFfUkVDVkNPTVBTVEFUMHxDRkcxX0RNQUJVUlNUODsKKwlwcml2KGRldiktPnJlZ3MuY29uZmlnMiA9IENGRzJfQ1RSTE98Q0ZHMl9SRUNWQ1JDfENGRzJfRVJSRU5DUkM7CisJcHJpdihkZXYpLT5yZWdzLmNvbW1hbmQgPSAwOworCisJLyoKKwkgKiBTZXQgdXAgb3VyIGhhcmR3YXJlIGFkZHJlc3MKKwkgKi8KKwlldGhlcjNfb3V0dyhwcml2KGRldiktPnJlZ3MuY29uZmlnMSB8IENGRzFfQlVGU0VMU1RBVDAsIFJFR19DT05GSUcxKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlldGhlcjNfb3V0YihkZXYtPmRldl9hZGRyW2ldLCBSRUdfQlVGV0lOKTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCXByaXYoZGV2KS0+cmVncy5jb25maWcxIHw9IENGRzFfUkVDVlBST01JU0M7CisJZWxzZSBpZiAoZGV2LT5mbGFncyAmIElGRl9NVUxUSUNBU1QpCisJCXByaXYoZGV2KS0+cmVncy5jb25maWcxIHw9IENGRzFfUkVDVlNQRUNCUk1VTFRJOworCWVsc2UKKwkJcHJpdihkZXYpLT5yZWdzLmNvbmZpZzEgfD0gQ0ZHMV9SRUNWU1BFQ0JST0FEOworCisJLyoKKwkgKiBUaGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgTlE4MDA1IGluIHRoYXQgaXQgb2NjYXNpb25hbGx5IGxvc2VzIHRoZQorCSAqIGxhc3QgdHdvIGJ5dGVzLiAgVG8gZ2V0IHJvdW5kIHRoaXMgcHJvYmxlbSwgd2UgcmVjZWl2ZSB0aGUgQ1JDIGFzCisJICogd2VsbC4gIFRoYXQgd2F5LCBpZiB3ZSBkbyBsb3NlIHRoZSBsYXN0IHR3bywgdGhlbiBpdCBkb2Vzbid0IG1hdHRlci4KKwkgKi8KKwlldGhlcjNfb3V0dyhwcml2KGRldiktPnJlZ3MuY29uZmlnMSB8IENGRzFfVFJBTlNFTkQsIFJFR19DT05GSUcxKTsKKwlldGhlcjNfb3V0dygoVFhfRU5EPj44KSAtIDEsIFJFR19CVUZXSU4pOworCWV0aGVyM19vdXR3KHByaXYoZGV2KS0+cnhfaGVhZCwgUkVHX1JFQ1ZQVFIpOworCWV0aGVyM19vdXR3KDAsIFJFR19UUkFOU01JVFBUUik7CisJZXRoZXIzX291dHcocHJpdihkZXYpLT5yeF9oZWFkID4+IDgsIFJFR19SRUNWRU5EKTsKKwlldGhlcjNfb3V0dyhwcml2KGRldiktPnJlZ3MuY29uZmlnMiwgUkVHX0NPTkZJRzIpOworCWV0aGVyM19vdXR3KHByaXYoZGV2KS0+cmVncy5jb25maWcxIHwgQ0ZHMV9MT0NCVUZNRU0sIFJFR19DT05GSUcxKTsKKwlldGhlcjNfb3V0dyhwcml2KGRldiktPnJlZ3MuY29tbWFuZCwgUkVHX0NPTU1BTkQpOworCisJaSA9IGV0aGVyM19yYW10ZXN0KGRldiwgMHg1QSk7CisJaWYoaSkKKwkJcmV0dXJuIGk7CisJaSA9IGV0aGVyM19yYW10ZXN0KGRldiwgMHgxRSk7CisJaWYoaSkKKwkJcmV0dXJuIGk7CisKKwlldGhlcjNfc2V0YnVmZmVyKGRldiwgYnVmZmVyX3dyaXRlLCAwKTsKKwlldGhlcjNfd3JpdGVsb25nKGRldiwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitldGhlcjNfaW5pdF9mb3Jfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCisJbWVtc2V0KCZwcml2KGRldiktPnN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKKworCS8qIFJlc2V0IHRoZSBjaGlwICovCisJZXRoZXIzX291dHcoQ0ZHMl9SRVNFVCwgUkVHX0NPTkZJRzIpOworCXVkZWxheSg0KTsKKworCXByaXYoZGV2KS0+cmVncy5jb21tYW5kID0gMDsKKwlldGhlcjNfb3V0dyhDTURfUlhPRkZ8Q01EX1RYT0ZGLCBSRUdfQ09NTUFORCk7CisJd2hpbGUgKGV0aGVyM19pbncoUkVHX1NUQVRVUykgJiAoU1RBVF9SWE9OfFNUQVRfVFhPTikpCisJCWJhcnJpZXIoKTsKKworCWV0aGVyM19vdXR3KHByaXYoZGV2KS0+cmVncy5jb25maWcxIHwgQ0ZHMV9CVUZTRUxTVEFUMCwgUkVHX0NPTkZJRzEpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWV0aGVyM19vdXRiKGRldi0+ZGV2X2FkZHJbaV0sIFJFR19CVUZXSU4pOworCisJcHJpdihkZXYpLT50eF9oZWFkCT0gMDsKKwlwcml2KGRldiktPnR4X3RhaWwJPSAwOworCXByaXYoZGV2KS0+cmVncy5jb25maWcyIHw9IENGRzJfQ1RSTE87CisJcHJpdihkZXYpLT5yeF9oZWFkCT0gUlhfU1RBUlQ7CisKKwlldGhlcjNfb3V0dyhwcml2KGRldiktPnJlZ3MuY29uZmlnMSB8IENGRzFfVFJBTlNFTkQsIFJFR19DT05GSUcxKTsKKwlldGhlcjNfb3V0dygoVFhfRU5EPj44KSAtIDEsIFJFR19CVUZXSU4pOworCWV0aGVyM19vdXR3KHByaXYoZGV2KS0+cnhfaGVhZCwgUkVHX1JFQ1ZQVFIpOworCWV0aGVyM19vdXR3KHByaXYoZGV2KS0+cnhfaGVhZCA+PiA4LCBSRUdfUkVDVkVORCk7CisJZXRoZXIzX291dHcoMCwgUkVHX1RSQU5TTUlUUFRSKTsKKwlldGhlcjNfb3V0dyhwcml2KGRldiktPnJlZ3MuY29uZmlnMiwgUkVHX0NPTkZJRzIpOworCWV0aGVyM19vdXR3KHByaXYoZGV2KS0+cmVncy5jb25maWcxIHwgQ0ZHMV9MT0NCVUZNRU0sIFJFR19DT05GSUcxKTsKKworCWV0aGVyM19zZXRidWZmZXIoZGV2LCBidWZmZXJfd3JpdGUsIDApOworCWV0aGVyM193cml0ZWxvbmcoZGV2LCAwKTsKKworCXByaXYoZGV2KS0+cmVncy5jb21tYW5kID0gQ01EX0VOSU5UUlggfCBDTURfRU5JTlRUWDsKKwlldGhlcjNfb3V0dyhwcml2KGRldiktPnJlZ3MuY29tbWFuZCB8IENNRF9SWE9OLCBSRUdfQ09NTUFORCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitldGhlcjNfcHJvYmVfYnVzXzgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZhbCkKK3sKKwlpbnQgd3JpdGVfbG93LCB3cml0ZV9oaWdoLCByZWFkX2xvdywgcmVhZF9oaWdoOworCisJd3JpdGVfbG93ID0gdmFsICYgMjU1OworCXdyaXRlX2hpZ2ggPSB2YWwgPj4gODsKKworCXByaW50ayhLRVJOX0RFQlVHICJldGhlcjNfcHJvYmU6IHdyaXRlOCBbJTAyWDolMDJYXSIsIHdyaXRlX2hpZ2gsIHdyaXRlX2xvdyk7CisKKwlldGhlcjNfb3V0Yih3cml0ZV9sb3csIFJFR19SRUNWUFRSKTsKKwlldGhlcjNfb3V0Yih3cml0ZV9oaWdoLCBSRUdfUkVDVlBUUiArIDQpOworCisJcmVhZF9sb3cgPSBldGhlcjNfaW5iKFJFR19SRUNWUFRSKTsKKwlyZWFkX2hpZ2ggPSBldGhlcjNfaW5iKFJFR19SRUNWUFRSICsgNCk7CisKKwlwcmludGsoIiwgcmVhZDggWyUwMlg6JTAyWF1cbiIsIHJlYWRfaGlnaCwgcmVhZF9sb3cpOworCisJcmV0dXJuIHJlYWRfbG93ID09IHdyaXRlX2xvdyAmJiByZWFkX2hpZ2ggPT0gd3JpdGVfaGlnaDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2V0aGVyM19wcm9iZV9idXNfMTYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZhbCkKK3sKKwlpbnQgcmVhZF92YWw7CisKKwlldGhlcjNfb3V0dyh2YWwsIFJFR19SRUNWUFRSKTsKKwlyZWFkX3ZhbCA9IGV0aGVyM19pbncoUkVHX1JFQ1ZQVFIpOworCisJcHJpbnRrKEtFUk5fREVCVUcgImV0aGVyM19wcm9iZTogd3JpdGUxNiBbJTA0WF0sIHJlYWQxNiBbJTA0WF1cbiIsIHZhbCwgcmVhZF92YWwpOworCisJcmV0dXJuIHJlYWRfdmFsID09IHZhbDsKK30KKworLyoKKyAqIE9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuICBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQorICogc29tZXRpbWUgYWZ0ZXIgYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgorICoKKyAqIFRoaXMgcm91dGluZSBzaG91bGQgc2V0IGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4KKyAqIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0CisgKiB0aGVyZSBpcyBub24tcmVib290IHdheSB0byByZWNvdmVyIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgorICovCitzdGF0aWMgaW50CitldGhlcjNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaW52YWxpZCBldGhlcm5ldCBNQUMgYWRkcmVzc1xuIiwKKwkJCWRldi0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgZXRoZXIzX2ludGVycnVwdCwgMCwgImV0aGVyMyIsIGRldikpCisJCXJldHVybiAtRUFHQUlOOworCisJZXRoZXIzX2luaXRfZm9yX29wZW4oZGV2KTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gZXRoZXIzX29wZW4oKS4KKyAqLworc3RhdGljIGludAorZXRoZXIzX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCisJZXRoZXIzX291dHcoQ01EX1JYT0ZGfENNRF9UWE9GRiwgUkVHX0NPTU1BTkQpOworCXByaXYoZGV2KS0+cmVncy5jb21tYW5kID0gMDsKKwl3aGlsZSAoZXRoZXIzX2ludyhSRUdfU1RBVFVTKSAmIChTVEFUX1JYT058U1RBVF9UWE9OKSkKKwkJYmFycmllcigpOworCWV0aGVyM19vdXRiKDB4ODAsIFJFR19DT05GSUcyICsgNCk7CisJZXRoZXIzX291dHcoMCwgUkVHX0NPTU1BTkQpOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLglUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY2FyZCBvcGVuIG9yCisgKiBjbG9zZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZXRoZXIzX2dldHN0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICZwcml2KGRldiktPnN0YXRzOworfQorCisvKgorICogU2V0IG9yIGNsZWFyIHByb21pc2N1b3VzL211bHRpY2FzdCBtb2RlIGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICoKKyAqIFdlIGRvbid0IGF0dGVtcHQgYW55IHBhY2tldCBmaWx0ZXJpbmcuICBUaGUgY2FyZCBtYXkgaGF2ZSBhIFNFRVEgODAwNAorICogaW4gd2hpY2ggZG9lcyBub3QgaGF2ZSB0aGUgb3RoZXIgZXRoZXJuZXQgYWRkcmVzcyByZWdpc3RlcnMgcHJlc2VudC4uLgorICovCitzdGF0aWMgdm9pZCBldGhlcjNfc2V0bXVsdGljYXN0bGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXByaXYoZGV2KS0+cmVncy5jb25maWcxICY9IH5DRkcxX1JFQ1ZQUk9NSVNDOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQkvKiBwcm9taXNjdW91cyBtb2RlICovCisJCXByaXYoZGV2KS0+cmVncy5jb25maWcxIHw9IENGRzFfUkVDVlBST01JU0M7CisJfSBlbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCXByaXYoZGV2KS0+cmVncy5jb25maWcxIHw9IENGRzFfUkVDVlNQRUNCUk1VTFRJOworCX0gZWxzZQorCQlwcml2KGRldiktPnJlZ3MuY29uZmlnMSB8PSBDRkcxX1JFQ1ZTUEVDQlJPQUQ7CisKKwlldGhlcjNfb3V0dyhwcml2KGRldiktPnJlZ3MuY29uZmlnMSB8IENGRzFfTE9DQlVGTUVNLCBSRUdfQ09ORklHMSk7Cit9CisKK3N0YXRpYyB2b2lkIGV0aGVyM190aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRlbF90aW1lcigmcHJpdihkZXYpLT50aW1lcik7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcHJpbnRrKEtFUk5fRVJSICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBuZXR3b3JrIGNhYmxlIHByb2JsZW0/XG4iLCBkZXYtPm5hbWUpOworCXByaW50ayhLRVJOX0VSUiAiJXM6IHN0YXRlOiB7IHN0YXR1cz0lMDRYIGNmZzE9JTA0WCBjZmcyPSUwNFggfVxuIiwgZGV2LT5uYW1lLAorCQlldGhlcjNfaW53KFJFR19TVEFUVVMpLCBldGhlcjNfaW53KFJFR19DT05GSUcxKSwgZXRoZXIzX2ludyhSRUdfQ09ORklHMikpOworCXByaW50ayhLRVJOX0VSUiAiJXM6IHsgcnByPSUwNFggcmVhPSUwNFggdHByPSUwNFggfVxuIiwgZGV2LT5uYW1lLAorCQlldGhlcjNfaW53KFJFR19SRUNWUFRSKSwgZXRoZXIzX2ludyhSRUdfUkVDVkVORCksIGV0aGVyM19pbncoUkVHX1RSQU5TTUlUUFRSKSk7CisJcHJpbnRrKEtFUk5fRVJSICIlczogdHggaGVhZD0lWCB0eCB0YWlsPSVYXG4iLCBkZXYtPm5hbWUsCisJCXByaXYoZGV2KS0+dHhfaGVhZCwgcHJpdihkZXYpLT50eF90YWlsKTsKKwlldGhlcjNfc2V0YnVmZmVyKGRldiwgYnVmZmVyX3JlYWQsIHByaXYoZGV2KS0+dHhfdGFpbCk7CisJcHJpbnRrKEtFUk5fRVJSICIlczogcGFja2V0IHN0YXR1cyA9ICUwOFhcbiIsIGRldi0+bmFtZSwgZXRoZXIzX3JlYWRsb25nKGRldikpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXByaXYoZGV2KS0+cmVncy5jb25maWcyIHw9IENGRzJfQ1RSTE87CisJcHJpdihkZXYpLT5zdGF0cy50eF9lcnJvcnMgKz0gMTsKKwlldGhlcjNfb3V0dyhwcml2KGRldiktPnJlZ3MuY29uZmlnMiwgUkVHX0NPTkZJRzIpOworCXByaXYoZGV2KS0+dHhfaGVhZCA9IHByaXYoZGV2KS0+dHhfdGFpbCA9IDA7CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qCisgKiBUcmFuc21pdCBhIHBhY2tldAorICovCitzdGF0aWMgaW50CitldGhlcjNfc2VuZHBhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGxlbmd0aCA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOworCXVuc2lnbmVkIGludCBwdHIsIG5leHRfcHRyOworCisJaWYgKHByaXYoZGV2KS0+YnJva2VuKSB7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcHJpdihkZXYpLT5zdGF0cy50eF9kcm9wcGVkICsrOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsZW5ndGggPSAobGVuZ3RoICsgMSkgJiB+MTsKKwlpZiAobGVuZ3RoICE9IHNrYi0+bGVuKSB7CisJCXNrYiA9IHNrYl9wYWR0byhza2IsIGxlbmd0aCk7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCX0KKworCW5leHRfcHRyID0gKHByaXYoZGV2KS0+dHhfaGVhZCArIDEpICYgMTU7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZiAocHJpdihkZXYpLT50eF90YWlsID09IG5leHRfcHRyKSB7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuIDE7CS8qIHVuYWJsZSB0byBxdWV1ZSAqLworCX0KKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXB0cgkJID0gMHg2MDAgKiBwcml2KGRldiktPnR4X2hlYWQ7CisJcHJpdihkZXYpLT50eF9oZWFkID0gbmV4dF9wdHI7CisJbmV4dF9wdHIJKj0gMHg2MDA7CisKKyNkZWZpbmUgVFhIRFJfRkxBR1MgKFRYSERSX1RSQU5TTUlUfFRYSERSX0NIQUlOQ09OVElOVUV8VFhIRFJfREFUQUZPTExPV1N8VFhIRFJfRU5TVUNDRVNTKQorCisJZXRoZXIzX3NldGJ1ZmZlcihkZXYsIGJ1ZmZlcl93cml0ZSwgbmV4dF9wdHIpOworCWV0aGVyM193cml0ZWxvbmcoZGV2LCAwKTsKKwlldGhlcjNfc2V0YnVmZmVyKGRldiwgYnVmZmVyX3dyaXRlLCBwdHIpOworCWV0aGVyM193cml0ZWxvbmcoZGV2LCAwKTsKKwlldGhlcjNfd3JpdGVidWZmZXIoZGV2LCBza2ItPmRhdGEsIGxlbmd0aCk7CisJZXRoZXIzX3dyaXRld29yZChkZXYsIGh0b25zKG5leHRfcHRyKSk7CisJZXRoZXIzX3dyaXRld29yZChkZXYsIFRYSERSX0NIQUlOQ09OVElOVUUgPj4gMTYpOworCWV0aGVyM19zZXRidWZmZXIoZGV2LCBidWZmZXJfd3JpdGUsIHB0cik7CisJZXRoZXIzX3dyaXRld29yZChkZXYsIGh0b25zKChwdHIgKyBsZW5ndGggKyA0KSkpOworCWV0aGVyM193cml0ZXdvcmQoZGV2LCBUWEhEUl9GTEFHUyA+PiAxNik7CisJZXRoZXIzX2xlZG9uKGRldik7CisKKwlpZiAoIShldGhlcjNfaW53KFJFR19TVEFUVVMpICYgU1RBVF9UWE9OKSkgeworCQlldGhlcjNfb3V0dyhwdHIsIFJFR19UUkFOU01JVFBUUik7CisJCWV0aGVyM19vdXR3KHByaXYoZGV2KS0+cmVncy5jb21tYW5kIHwgQ01EX1RYT04sIFJFR19DT01NQU5EKTsKKwl9CisKKwluZXh0X3B0ciA9IChwcml2KGRldiktPnR4X2hlYWQgKyAxKSAmIDE1OworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCWlmIChwcml2KGRldiktPnR4X3RhaWwgPT0gbmV4dF9wdHIpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworIG91dDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90CitldGhlcjNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzLCBoYW5kbGVkID0gSVJRX05PTkU7CisKKyNpZiBORVRfREVCVUcgPiAxCisJaWYobmV0X2RlYnVnICYgREVCVUdfSU5UKQorCQlwcmludGsoImV0aDNpcnE6ICVkICIsIGlycSk7CisjZW5kaWYKKworCXN0YXR1cyA9IGV0aGVyM19pbncoUkVHX1NUQVRVUyk7CisKKwlpZiAoc3RhdHVzICYgU1RBVF9JTlRSWCkgeworCQlldGhlcjNfb3V0dyhDTURfQUNLSU5UUlggfCBwcml2KGRldiktPnJlZ3MuY29tbWFuZCwgUkVHX0NPTU1BTkQpOworCQlldGhlcjNfcngoZGV2LCAxMik7CisJCWhhbmRsZWQgPSBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAoc3RhdHVzICYgU1RBVF9JTlRUWCkgeworCQlldGhlcjNfb3V0dyhDTURfQUNLSU5UVFggfCBwcml2KGRldiktPnJlZ3MuY29tbWFuZCwgUkVHX0NPTU1BTkQpOworCQlldGhlcjNfdHgoZGV2KTsKKwkJaGFuZGxlZCA9IElSUV9IQU5ETEVEOworCX0KKworI2lmIE5FVF9ERUJVRyA+IDEKKwlpZihuZXRfZGVidWcgJiBERUJVR19JTlQpCisJCXByaW50aygiZG9uZVxuIik7CisjZW5kaWYKKwlyZXR1cm4gaGFuZGxlZDsKK30KKworLyoKKyAqIElmIHdlIGhhdmUgYSBnb29kIHBhY2tldChzKSwgZ2V0IGl0L3RoZW0gb3V0IG9mIHRoZSBidWZmZXJzLgorICovCitzdGF0aWMgaW50IGV0aGVyM19yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbWF4Y250KQoreworCXVuc2lnbmVkIGludCBuZXh0X3B0ciA9IHByaXYoZGV2KS0+cnhfaGVhZCwgcmVjZWl2ZWQgPSAwOworCisJZXRoZXIzX2xlZG9uKGRldik7CisKKwlkbyB7CisJCXVuc2lnbmVkIGludCB0aGlzX3B0ciwgc3RhdHVzOworCQl1bnNpZ25lZCBjaGFyIGFkZHJzWzE2XTsKKworCQkvKgorCQkgKiByZWFkIHRoZSBmaXJzdCAxNiBieXRlcyBmcm9tIHRoZSBidWZmZXIuCisJCSAqIFRoaXMgY29udGFpbnMgdGhlIHN0YXR1cyBieXRlcyBldGMgYW5kIGV0aGVybmV0IGFkZHJlc3NlcywKKwkJICogYW5kIHdlIGFsc28gY2hlY2sgdGhlIHNvdXJjZSBldGhlcm5ldCBhZGRyZXNzIHRvIHNlZSBpZgorCQkgKiBpdCBvcmlnaW5hdGVkIGZyb20gdXMuCisJCSAqLworCQl7CisJCQl1bnNpZ25lZCBpbnQgdGVtcF9wdHI7CisJCQlldGhlcjNfc2V0YnVmZmVyKGRldiwgYnVmZmVyX3JlYWQsIG5leHRfcHRyKTsKKwkJCXRlbXBfcHRyID0gZXRoZXIzX3JlYWR3b3JkKGRldik7CisJCQlzdGF0dXMgPSBldGhlcjNfcmVhZHdvcmQoZGV2KTsKKwkJCWlmICgoc3RhdHVzICYgKFJYU1RBVF9ET05FIHwgUlhIRFJfQ0hBSU5DT05USU5VRSB8IFJYSERSX1JFQ0VJVkUpKSAhPQorCQkJCShSWFNUQVRfRE9ORSB8IFJYSERSX0NIQUlOQ09OVElOVUUpIHx8ICF0ZW1wX3B0cikKKwkJCQlicmVhazsKKworCQkJdGhpc19wdHIgPSBuZXh0X3B0ciArIDQ7CisJCQluZXh0X3B0ciA9IG50b2hzKHRlbXBfcHRyKTsKKwkJfQorCQlldGhlcjNfc2V0YnVmZmVyKGRldiwgYnVmZmVyX3JlYWQsIHRoaXNfcHRyKTsKKwkJZXRoZXIzX3JlYWRidWZmZXIoZGV2LCBhZGRycysyLCAxMik7CisKK2lmIChuZXh0X3B0ciA8IFJYX1NUQVJUIHx8IG5leHRfcHRyID49IFJYX0VORCkgeworIGludCBpOworIHByaW50aygiJXM6IGJhZCBuZXh0IHBvaW50ZXIgQCUwNFg6ICIsIGRldi0+bmFtZSwgcHJpdihkZXYpLT5yeF9oZWFkKTsKKyBwcmludGsoIiUwMlggJTAyWCAlMDJYICUwMlggIiwgbmV4dF9wdHIgPj4gOCwgbmV4dF9wdHIgJiAyNTUsIHN0YXR1cyAmIDI1NSwgc3RhdHVzID4+IDgpOworIGZvciAoaSA9IDI7IGkgPCAxNDsgaSsrKQorICAgcHJpbnRrKCIlMDJYICIsIGFkZHJzW2ldKTsKKyBwcmludGsoIlxuIik7CisgbmV4dF9wdHIgPSBwcml2KGRldiktPnJ4X2hlYWQ7CisgYnJlYWs7Cit9CisJCS8qCisgCQkgKiBpZ25vcmUgb3VyIG93biBwYWNrZXRzLi4uCisJIAkgKi8KKwkJaWYgKCEoKih1bnNpZ25lZCBsb25nICopJmRldi0+ZGV2X2FkZHJbMF0gXiAqKHVuc2lnbmVkIGxvbmcgKikmYWRkcnNbMis2XSkgJiYKKwkJICAgICEoKih1bnNpZ25lZCBzaG9ydCAqKSZkZXYtPmRldl9hZGRyWzRdIF4gKih1bnNpZ25lZCBzaG9ydCAqKSZhZGRyc1syKzEwXSkpIHsKKwkJCW1heGNudCArKzsgLyogY29tcGVuc2F0ZSBmb3IgbG9vcGVkYmFjayBwYWNrZXQgKi8KKwkJCWV0aGVyM19vdXR3KG5leHRfcHRyID4+IDgsIFJFR19SRUNWRU5EKTsKKwkJfSBlbHNlCisJCWlmICghKHN0YXR1cyAmIChSWFNUQVRfT1ZFUlNJWkV8UlhTVEFUX0NSQ0VSUk9SfFJYU1RBVF9EUklCQkxFRVJST1J8UlhTVEFUX1NIT1JUUEFDS0VUKSkpIHsKKwkJCXVuc2lnbmVkIGludCBsZW5ndGggPSBuZXh0X3B0ciAtIHRoaXNfcHRyOworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJaWYgKG5leHRfcHRyIDw9IHRoaXNfcHRyKQorCQkJCWxlbmd0aCArPSBSWF9FTkQgLSBSWF9TVEFSVDsKKworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW5ndGggKyAyKTsKKwkJCWlmIChza2IpIHsKKwkJCQl1bnNpZ25lZCBjaGFyICpidWY7CisKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOworCQkJCWJ1ZiA9IHNrYl9wdXQoc2tiLCBsZW5ndGgpOworCQkJCWV0aGVyM19yZWFkYnVmZmVyKGRldiwgYnVmICsgMTIsIGxlbmd0aCAtIDEyKTsKKwkJCQlldGhlcjNfb3V0dyhuZXh0X3B0ciA+PiA4LCBSRUdfUkVDVkVORCk7CisJCQkJKih1bnNpZ25lZCBzaG9ydCAqKShidWYgKyAwKQk9ICoodW5zaWduZWQgc2hvcnQgKikoYWRkcnMgKyAyKTsKKwkJCQkqKHVuc2lnbmVkIGxvbmcgKikoYnVmICsgMikJPSAqKHVuc2lnbmVkIGxvbmcgKikoYWRkcnMgKyA0KTsKKwkJCQkqKHVuc2lnbmVkIGxvbmcgKikoYnVmICsgNikJPSAqKHVuc2lnbmVkIGxvbmcgKikoYWRkcnMgKyA4KTsKKwkJCQkqKHVuc2lnbmVkIHNob3J0ICopKGJ1ZiArIDEwKQk9ICoodW5zaWduZWQgc2hvcnQgKikoYWRkcnMgKyAxMik7CisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCQluZXRpZl9yeChza2IpOworCQkJCXJlY2VpdmVkICsrOworCQkJfSBlbHNlCisJCQkJZ290byBkcm9wcGluZzsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwcml2KGRldiktPnN0YXRzOworCQkJZXRoZXIzX291dHcobmV4dF9wdHIgPj4gOCwgUkVHX1JFQ1ZFTkQpOworCQkJaWYgKHN0YXR1cyAmIFJYU1RBVF9PVkVSU0laRSkJICBzdGF0cy0+cnhfb3Zlcl9lcnJvcnMgKys7CisJCQlpZiAoc3RhdHVzICYgUlhTVEFUX0NSQ0VSUk9SKQkgIHN0YXRzLT5yeF9jcmNfZXJyb3JzICsrOworCQkJaWYgKHN0YXR1cyAmIFJYU1RBVF9EUklCQkxFRVJST1IpIHN0YXRzLT5yeF9maWZvX2Vycm9ycyArKzsKKwkJCWlmIChzdGF0dXMgJiBSWFNUQVRfU0hPUlRQQUNLRVQpICBzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyArKzsKKwkJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJfQorCX0KKwl3aGlsZSAoLS0gbWF4Y250KTsKKworZG9uZToKKwlwcml2KGRldiktPnN0YXRzLnJ4X3BhY2tldHMgKz0gcmVjZWl2ZWQ7CisJcHJpdihkZXYpLT5yeF9oZWFkID0gbmV4dF9wdHI7CisJLyoKKwkgKiBJZiByeCB3ZW50IG9mZiBsaW5lLCB0aGVuIHRoYXQgbWVhbnMgdGhhdCB0aGUgYnVmZmVyIG1heSBiZSBmdWxsLiAgV2UKKwkgKiBoYXZlIGRyb3BwZWQgYXQgbGVhc3Qgb25lIHBhY2tldC4KKwkgKi8KKwlpZiAoIShldGhlcjNfaW53KFJFR19TVEFUVVMpICYgU1RBVF9SWE9OKSkgeworCQlwcml2KGRldiktPnN0YXRzLnJ4X2Ryb3BwZWQgKys7CisgICAgCQlldGhlcjNfb3V0dyhuZXh0X3B0ciwgUkVHX1JFQ1ZQVFIpOworCQlldGhlcjNfb3V0dyhwcml2KGRldiktPnJlZ3MuY29tbWFuZCB8IENNRF9SWE9OLCBSRUdfQ09NTUFORCk7CisJfQorCisJcmV0dXJuIG1heGNudDsKKworZHJvcHBpbmc6eworCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3Rfd2FybmVkOworCisJZXRoZXIzX291dHcobmV4dF9wdHIgPj4gOCwgUkVHX1JFQ1ZFTkQpOworCS8qCisJICogRG9uJ3QgcHJpbnQgdGhpcyBtZXNzYWdlIHRvbyBtYW55IHRpbWVzLi4uCisJICovCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgbGFzdF93YXJuZWQgKyAxMCAqIEhaKSkgeworCQlsYXN0X3dhcm5lZCA9IGppZmZpZXM7CisJCXByaW50aygiJXM6IG1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCX0KKwlwcml2KGRldiktPnN0YXRzLnJ4X2Ryb3BwZWQgKys7CisJZ290byBkb25lOworCX0KK30KKworLyoKKyAqIFVwZGF0ZSBzdGF0cyBmb3IgdGhlIHRyYW5zbWl0dGVkIHBhY2tldChzKQorICovCitzdGF0aWMgdm9pZCBldGhlcjNfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBpbnQgdHhfdGFpbCA9IHByaXYoZGV2KS0+dHhfdGFpbDsKKwlpbnQgbWF4X3dvcmsgPSAxNDsKKworCWRvIHsKKwkgICAgCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCisgICAgCQkvKgorCSAgICAJICogUmVhZCB0aGUgcGFja2V0IGhlYWRlcgorICAgIAkJICovCisJICAgIAlldGhlcjNfc2V0YnVmZmVyKGRldiwgYnVmZmVyX3JlYWQsIHR4X3RhaWwgKiAweDYwMCk7CisgICAgCQlzdGF0dXMgPSBldGhlcjNfcmVhZGxvbmcoZGV2KTsKKworCQkvKgorCQkgKiBDaGVjayB0byBzZWUgaWYgdGhpcyBwYWNrZXQgaGFzIGJlZW4gdHJhbnNtaXR0ZWQKKwkJICovCisJCWlmICgoc3RhdHVzICYgKFRYU1RBVF9ET05FIHwgVFhIRFJfVFJBTlNNSVQpKSAhPQorCQkgICAgKFRYU1RBVF9ET05FIHwgVFhIRFJfVFJBTlNNSVQpKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogVXBkYXRlIGVycm9ycworCQkgKi8KKwkJaWYgKCEoc3RhdHVzICYgKFRYU1RBVF9CQUJCTEVEIHwgVFhTVEFUXzE2Q09MTElTSU9OUykpKQorCQkJcHJpdihkZXYpLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCWVsc2UgeworCQkJcHJpdihkZXYpLT5zdGF0cy50eF9lcnJvcnMgKys7CisJCQlpZiAoc3RhdHVzICYgVFhTVEFUXzE2Q09MTElTSU9OUykKKwkJCQlwcml2KGRldiktPnN0YXRzLmNvbGxpc2lvbnMgKz0gMTY7CisJCQlpZiAoc3RhdHVzICYgVFhTVEFUX0JBQkJMRUQpCisJCQkJcHJpdihkZXYpLT5zdGF0cy50eF9maWZvX2Vycm9ycyArKzsKKwkJfQorCisJCXR4X3RhaWwgPSAodHhfdGFpbCArIDEpICYgMTU7CisJfSB3aGlsZSAoLS1tYXhfd29yayk7CisKKwlpZiAocHJpdihkZXYpLT50eF90YWlsICE9IHR4X3RhaWwpIHsKKwkJcHJpdihkZXYpLT50eF90YWlsID0gdHhfdGFpbDsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IGV0aGVyM19iYW5uZXIodm9pZCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkID0gMDsKKworCWlmIChuZXRfZGVidWcgJiYgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQKK2V0aGVyM19wcm9iZShzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjLCBjb25zdCBzdHJ1Y3QgZWNhcmRfaWQgKmlkKQoreworCWNvbnN0IHN0cnVjdCBldGhlcjNfZGF0YSAqZGF0YSA9IGlkLT5kYXRhOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGksIGJ1c190eXBlLCByZXQ7CisKKwlldGhlcjNfYmFubmVyKCk7CisKKwlyZXQgPSBlY2FyZF9yZXF1ZXN0X3Jlc291cmNlcyhlYyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGRldl9wcml2KSk7CisJaWYgKCFkZXYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byByZWxlYXNlOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZlYy0+ZGV2KTsKKworCXByaXYoZGV2KS0+YmFzZSA9IGlvcmVtYXAoZWNhcmRfcmVzb3VyY2Vfc3RhcnQoZWMsIEVDQVJEX1JFU19NRU1DKSwKKwkJCQkgIGVjYXJkX3Jlc291cmNlX2xlbihlYywgRUNBUkRfUkVTX01FTUMpKTsKKwlpZiAoIXByaXYoZGV2KS0+YmFzZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZyZWU7CisJfQorCisJZWMtPmlycWFkZHIgPSBwcml2KGRldiktPmJhc2UgKyBkYXRhLT5iYXNlX29mZnNldDsKKwllYy0+aXJxbWFzayA9IDB4ZjA7CisKKwlwcml2KGRldiktPnNlZXEgPSBwcml2KGRldiktPmJhc2UgKyBkYXRhLT5iYXNlX29mZnNldDsKKwlkZXYtPmlycSA9IGVjLT5pcnE7CisKKwlldGhlcjNfYWRkcihkZXYtPmRldl9hZGRyLCBlYyk7CisKKwlpbml0X3RpbWVyKCZwcml2KGRldiktPnRpbWVyKTsKKworCS8qIFJlc2V0IGNhcmQuLi4KKwkgKi8KKwlldGhlcjNfb3V0YigweDgwLCBSRUdfQ09ORklHMiArIDQpOworCWJ1c190eXBlID0gQlVTX1VOS05PV047CisJdWRlbGF5KDQpOworCisJLyogVGVzdCB1c2luZyBSZWNlaXZlIFBvaW50ZXIgKDE2LWJpdCByZWdpc3RlcikgdG8gZmluZCBvdXQKKwkgKiBob3cgdGhlIGV0aGVyMyBpcyBjb25uZWN0ZWQgdG8gdGhlIGJ1cy4uLgorCSAqLworCWlmIChldGhlcjNfcHJvYmVfYnVzXzgoZGV2LCAweDEwMCkgJiYKKwkgICAgZXRoZXIzX3Byb2JlX2J1c184KGRldiwgMHgyMDEpKQorCQlidXNfdHlwZSA9IEJVU184OworCisJaWYgKGJ1c190eXBlID09IEJVU19VTktOT1dOICYmCisJICAgIGV0aGVyM19wcm9iZV9idXNfMTYoZGV2LCAweDEwMSkgJiYKKwkgICAgZXRoZXIzX3Byb2JlX2J1c18xNihkZXYsIDB4MjAxKSkKKwkJYnVzX3R5cGUgPSBCVVNfMTY7CisKKwlzd2l0Y2ggKGJ1c190eXBlKSB7CisJY2FzZSBCVVNfVU5LTk9XTjoKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGlkZW50aWZ5IGJ1cyB3aWR0aFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBmcmVlOworCisJY2FzZSBCVVNfODoKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgZm91bmQsIGJ1dCBpcyBhbiB1bnN1cHBvcnRlZCAiCisJCQkiOC1iaXQgY2FyZFxuIiwgZGV2LT5uYW1lLCBkYXRhLT5uYW1lKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBmcmVlOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKGV0aGVyM19pbml0XzIoZGV2KSkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZyZWU7CisJfQorCisJZGV2LT5vcGVuCQk9IGV0aGVyM19vcGVuOworCWRldi0+c3RvcAkJPSBldGhlcjNfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBldGhlcjNfc2VuZHBhY2tldDsKKwlkZXYtPmdldF9zdGF0cwkJPSBldGhlcjNfZ2V0c3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QJPSBldGhlcjNfc2V0bXVsdGljYXN0bGlzdDsKKwlkZXYtPnR4X3RpbWVvdXQJCT0gZXRoZXIzX3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwk9IDUgKiBIWiAvIDEwMDsKKworCXJldCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZnJlZTsKKworCXByaW50aygiJXM6ICVzIGluIHNsb3QgJWQsICIsIGRldi0+bmFtZSwgZGF0YS0+bmFtZSwgZWMtPnNsb3Rfbm8pOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiJTIuMnglYyIsIGRldi0+ZGV2X2FkZHJbaV0sIGkgPT0gNSA/ICdcbicgOiAnOicpOworCisJZWNhcmRfc2V0X2RydmRhdGEoZWMsIGRldik7CisJcmV0dXJuIDA7CisKKyBmcmVlOgorCWlmIChwcml2KGRldiktPmJhc2UpCisJCWlvdW5tYXAocHJpdihkZXYpLT5iYXNlKTsKKwlmcmVlX25ldGRldihkZXYpOworIHJlbGVhc2U6CisJZWNhcmRfcmVsZWFzZV9yZXNvdXJjZXMoZWMpOworIG91dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZXRoZXIzX3JlbW92ZShzdHJ1Y3QgZXhwYW5zaW9uX2NhcmQgKmVjKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBlY2FyZF9nZXRfZHJ2ZGF0YShlYyk7CisKKwllY2FyZF9zZXRfZHJ2ZGF0YShlYywgTlVMTCk7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCWlvdW5tYXAocHJpdihkZXYpLT5iYXNlKTsKKwlmcmVlX25ldGRldihkZXYpOworCWVjYXJkX3JlbGVhc2VfcmVzb3VyY2VzKGVjKTsKK30KKworc3RhdGljIHN0cnVjdCBldGhlcjNfZGF0YSBldGhlcjMgPSB7CisJLm5hbWUJCT0gImV0aGVyMyIsCisJLmJhc2Vfb2Zmc2V0CT0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXRoZXIzX2RhdGEgZXRoZXJiID0geworCS5uYW1lCQk9ICJldGhlcmIiLAorCS5iYXNlX29mZnNldAk9IDB4ODAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlY2FyZF9pZCBldGhlcjNfaWRzW10gPSB7CisJeyBNQU5VX0FOVDIsIFBST0RfQU5UX0VUSEVSMywgJmV0aGVyMyB9LAorCXsgTUFOVV9BTlQsICBQUk9EX0FOVF9FVEhFUjMsICZldGhlcjMgfSwKKwl7IE1BTlVfQU5ULCAgUFJPRF9BTlRfRVRIRVJCLCAmZXRoZXJiIH0sCisJeyAweGZmZmYsIDB4ZmZmZiB9Cit9OworCitzdGF0aWMgc3RydWN0IGVjYXJkX2RyaXZlciBldGhlcjNfZHJpdmVyID0geworCS5wcm9iZQkJPSBldGhlcjNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChldGhlcjNfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPSBldGhlcjNfaWRzLAorCS5kcnYgPSB7CisJCS5uYW1lCT0gImV0aGVyMyIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGV0aGVyM19pbml0KHZvaWQpCit7CisJcmV0dXJuIGVjYXJkX3JlZ2lzdGVyX2RyaXZlcigmZXRoZXIzX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBldGhlcjNfZXhpdCh2b2lkKQoreworCWVjYXJkX3JlbW92ZV9kcml2ZXIoJmV0aGVyM19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChldGhlcjNfaW5pdCk7Cittb2R1bGVfZXhpdChldGhlcjNfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FybS9ldGhlcjMuaCBiL2RyaXZlcnMvbmV0L2FybS9ldGhlcjMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTIxYTNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXJtL2V0aGVyMy5oCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvYWNvcm4vbmV0L2V0aGVyMy5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NS0yMDAwIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIG5ldHdvcmsgZHJpdmVyIGZvciBBY29ybi9BTlQgRXRoZXIzIGNhcmRzCisgKi8KKworI2lmbmRlZiBfTElOVVhfZXRoZXIzX0gKKyNkZWZpbmUgX0xJTlVYX2V0aGVyM19ICisKKy8qIHVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sID4yIGZvciBkZWJ1Zy4gZGVidWcgZmxhZ3M6ICovCisjZGVmaW5lIERFQlVHX1RYCSAyCisjZGVmaW5lIERFQlVHX1JYCSA0CisjZGVmaW5lIERFQlVHX0lOVAkgOAorI2RlZmluZSBERUJVR19JQwkxNgorI2lmbmRlZiBORVRfREVCVUcKKyNkZWZpbmUgTkVUX0RFQlVHIAkwCisjZW5kaWYKKworI2RlZmluZSBwcml2KGRldikJKChzdHJ1Y3QgZGV2X3ByaXYgKiluZXRkZXZfcHJpdihkZXYpKQorCisvKiBDb21tYW5kIHJlZ2lzdGVyIGRlZmluaXRpb25zICYgYml0cyAqLworI2RlZmluZSBSRUdfQ09NTUFORAkJKHByaXYoZGV2KS0+c2VlcSArIDB4MDAwMCkKKyNkZWZpbmUgQ01EX0VOSU5URE1BCQkweDAwMDEKKyNkZWZpbmUgQ01EX0VOSU5UUlgJCTB4MDAwMgorI2RlZmluZSBDTURfRU5JTlRUWAkJMHgwMDA0CisjZGVmaW5lIENNRF9FTklOVEJVRldJTgkJMHgwMDA4CisjZGVmaW5lIENNRF9BQ0tJTlRETUEJCTB4MDAxMAorI2RlZmluZSBDTURfQUNLSU5UUlgJCTB4MDAyMAorI2RlZmluZSBDTURfQUNLSU5UVFgJCTB4MDA0MAorI2RlZmluZSBDTURfQUNLSU5UQlVGV0lOCTB4MDA4MAorI2RlZmluZSBDTURfRE1BT04JCTB4MDEwMAorI2RlZmluZSBDTURfUlhPTgkJMHgwMjAwCisjZGVmaW5lIENNRF9UWE9OCQkweDA0MDAKKyNkZWZpbmUgQ01EX0RNQU9GRgkJMHgwODAwCisjZGVmaW5lIENNRF9SWE9GRgkJMHgxMDAwCisjZGVmaW5lIENNRF9UWE9GRgkJMHgyMDAwCisjZGVmaW5lIENNRF9GSUZPUkVBRAkJMHg0MDAwCisjZGVmaW5lIENNRF9GSUZPV1JJVEUJCTB4ODAwMAorCisvKiBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX1NUQVRVUwkJKHByaXYoZGV2KS0+c2VlcSArIDB4MDAwMCkKKyNkZWZpbmUgU1RBVF9FTklOVFNUQVQJCTB4MDAwMQorI2RlZmluZSBTVEFUX0VOSU5UUlgJCTB4MDAwMgorI2RlZmluZSBTVEFUX0VOSU5UVFgJCTB4MDAwNAorI2RlZmluZSBTVEFUX0VOSU5UQlVGV0lOCTB4MDAwOAorI2RlZmluZSBTVEFUX0lOVERNQQkJMHgwMDEwCisjZGVmaW5lIFNUQVRfSU5UUlgJCTB4MDAyMAorI2RlZmluZSBTVEFUX0lOVFRYCQkweDAwNDAKKyNkZWZpbmUgU1RBVF9JTlRCVUZXSU4JCTB4MDA4MAorI2RlZmluZSBTVEFUX0RNQU9OCQkweDAxMDAKKyNkZWZpbmUgU1RBVF9SWE9OCQkweDAyMDAKKyNkZWZpbmUgU1RBVF9UWE9OCQkweDA0MDAKKyNkZWZpbmUgU1RBVF9GSUZPRlVMTAkJMHgyMDAwCisjZGVmaW5lIFNUQVRfRklGT0VNUFRZCQkweDQwMDAKKyNkZWZpbmUgU1RBVF9GSUZPRElSCQkweDgwMDAKKworLyogY29uZmlndXJhdGlvbiByZWdpc3RlciAxICovCisjZGVmaW5lIFJFR19DT05GSUcxCQkocHJpdihkZXYpLT5zZWVxICsgMHgwMDQwKQorI2RlZmluZSBDRkcxX0JVRlNFTFNUQVQwCTB4MDAwMAorI2RlZmluZSBDRkcxX0JVRlNFTFNUQVQxCTB4MDAwMQorI2RlZmluZSBDRkcxX0JVRlNFTFNUQVQyCTB4MDAwMgorI2RlZmluZSBDRkcxX0JVRlNFTFNUQVQzCTB4MDAwMworI2RlZmluZSBDRkcxX0JVRlNFTFNUQVQ0CTB4MDAwNAorI2RlZmluZSBDRkcxX0JVRlNFTFNUQVQ1CTB4MDAwNQorI2RlZmluZSBDRkcxX0FERFJQUk9NCQkweDAwMDYKKyNkZWZpbmUgQ0ZHMV9UUkFOU0VORAkJMHgwMDA3CisjZGVmaW5lIENGRzFfTE9DQlVGTUVNCQkweDAwMDgKKyNkZWZpbmUgQ0ZHMV9JTlRWRUNUT1IJCTB4MDAwOQorI2RlZmluZSBDRkcxX1JFQ1ZTUEVDT05MWQkweDAwMDAKKyNkZWZpbmUgQ0ZHMV9SRUNWU1BFQ0JST0FECTB4NDAwMAorI2RlZmluZSBDRkcxX1JFQ1ZTUEVDQlJNVUxUSQkweDgwMDAKKyNkZWZpbmUgQ0ZHMV9SRUNWUFJPTUlTQwkweEMwMDAKKworLyogVGhlIGZvbGxvd2luZyBhcmVuJ3QgaW4gODAwNCAqLworI2RlZmluZSBDRkcxX0RNQUJVUlNUQ09OVAkweDAwMDAKKyNkZWZpbmUgQ0ZHMV9ETUFCVVJTVDgwME5TCTB4MDAxMAorI2RlZmluZSBDRkcxX0RNQUJVUlNUMTYwME5TCTB4MDAyMAorI2RlZmluZSBDRkcxX0RNQUJVUlNUMzIwME5TCTB4MDAzMAorI2RlZmluZSBDRkcxX0RNQUJVUlNUMQkJMHgwMDAwCisjZGVmaW5lIENGRzFfRE1BQlVSU1Q0CQkweDAwNDAKKyNkZWZpbmUgQ0ZHMV9ETUFCVVJTVDgJCTB4MDA4MAorI2RlZmluZSBDRkcxX0RNQUJVUlNUMTYJCTB4MDBDMAorI2RlZmluZSBDRkcxX1JFQ1ZDT01QU1RBVDAJMHgwMTAwCisjZGVmaW5lIENGRzFfUkVDVkNPTVBTVEFUMQkweDAyMDAKKyNkZWZpbmUgQ0ZHMV9SRUNWQ09NUFNUQVQyCTB4MDQwMAorI2RlZmluZSBDRkcxX1JFQ1ZDT01QU1RBVDMJMHgwODAwCisjZGVmaW5lIENGRzFfUkVDVkNPTVBTVEFUNAkweDEwMDAKKyNkZWZpbmUgQ0ZHMV9SRUNWQ09NUFNUQVQ1CTB4MjAwMAorCisvKiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgUkVHX0NPTkZJRzIJCShwcml2KGRldiktPnNlZXEgKyAweDAwODApCisjZGVmaW5lIENGRzJfQllURVNXQVAJCTB4MDAwMQorI2RlZmluZSBDRkcyX0VSUkVOQ1JDCQkweDAwMDgKKyNkZWZpbmUgQ0ZHMl9FUlJFTkRSSUJCTEUJMHgwMDEwCisjZGVmaW5lIENGRzJfRVJSU0hPUlRGUkFNRQkweDAwMjAKKyNkZWZpbmUgQ0ZHMl9TTE9UU0VMRUNUCQkweDAwNDAKKyNkZWZpbmUgQ0ZHMl9QUkVBTVNFTEVDVAkweDAwODAKKyNkZWZpbmUgQ0ZHMl9BRERSTEVOR1RICQkweDAxMDAKKyNkZWZpbmUgQ0ZHMl9SRUNWQ1JDCQkweDAyMDAKKyNkZWZpbmUgQ0ZHMl9YTUlUTk9DUkMJCTB4MDQwMAorI2RlZmluZSBDRkcyX0xPT1BCQUNLCQkweDA4MDAKKyNkZWZpbmUgQ0ZHMl9DVFJMTwkJMHgxMDAwCisjZGVmaW5lIENGRzJfUkVTRVQJCTB4ODAwMAorCisjZGVmaW5lIFJFR19SRUNWRU5ECQkocHJpdihkZXYpLT5zZWVxICsgMHgwMGMwKQorCisjZGVmaW5lIFJFR19CVUZXSU4JCShwcml2KGRldiktPnNlZXEgKyAweDAxMDApCisKKyNkZWZpbmUgUkVHX1JFQ1ZQVFIJCShwcml2KGRldiktPnNlZXEgKyAweDAxNDApCisKKyNkZWZpbmUgUkVHX1RSQU5TTUlUUFRSCQkocHJpdihkZXYpLT5zZWVxICsgMHgwMTgwKQorCisjZGVmaW5lIFJFR19ETUFBRERSCQkocHJpdihkZXYpLT5zZWVxICsgMHgwMWMwKQorCisvKgorICogQ2FyZHMgdHJhbnNtaXQvcmVjZWl2ZSBoZWFkZXJzCisgKi8KKyNkZWZpbmUgVFhfTkVYVAkJCSgweGZmZmYpCisjZGVmaW5lIFRYSERSX0VOQkFCQkxFSU5UCSgxIDw8IDE2KQorI2RlZmluZSBUWEhEUl9FTkNPTExJU0lPTklOVAkoMSA8PCAxNykKKyNkZWZpbmUgVFhIRFJfRU4xNkNPTExJU0lPTgkoMSA8PCAxOCkKKyNkZWZpbmUgVFhIRFJfRU5TVUNDRVNTCQkoMSA8PCAxOSkKKyNkZWZpbmUgVFhIRFJfREFUQUZPTExPV1MJKDEgPDwgMjEpCisjZGVmaW5lIFRYSERSX0NIQUlOQ09OVElOVUUJKDEgPDwgMjIpCisjZGVmaW5lIFRYSERSX1RSQU5TTUlUCQkoMSA8PCAyMykKKyNkZWZpbmUgVFhTVEFUX0JBQkJMRUQJCSgxIDw8IDI0KQorI2RlZmluZSBUWFNUQVRfQ09MTElTSU9OCSgxIDw8IDI1KQorI2RlZmluZSBUWFNUQVRfMTZDT0xMSVNJT05TCSgxIDw8IDI2KQorI2RlZmluZSBUWFNUQVRfRE9ORQkJKDEgPDwgMzEpCisKKyNkZWZpbmUgUlhfTkVYVAkJCSgweGZmZmYpCisjZGVmaW5lIFJYSERSX0NIQUlOQ09OVElOVUUJKDEgPDwgNikKKyNkZWZpbmUgUlhIRFJfUkVDRUlWRQkJKDEgPDwgNykKKyNkZWZpbmUgUlhTVEFUX09WRVJTSVpFCQkoMSA8PCA4KQorI2RlZmluZSBSWFNUQVRfQ1JDRVJST1IJCSgxIDw8IDkpCisjZGVmaW5lIFJYU1RBVF9EUklCQkxFRVJST1IJKDEgPDwgMTApCisjZGVmaW5lIFJYU1RBVF9TSE9SVFBBQ0tFVAkoMSA8PCAxMSkKKyNkZWZpbmUgUlhTVEFUX0RPTkUJCSgxIDw8IDE1KQorCisKKyNkZWZpbmUgVFhfU1RBUlQJMHgwMDAwCisjZGVmaW5lIFRYX0VORAkJMHg2MDAwCisjZGVmaW5lIFJYX1NUQVJUCTB4NjAwMAorI2RlZmluZSBSWF9MRU4JCTB4QTAwMAorI2RlZmluZSBSWF9FTkQJCTB4MTAwMDAKKy8qIG11c3QgYmUgYSBwb3dlciBvZiAyIGFuZCBncmVhdGVyIHRoYW4gTUFYX1RYX0JVRkZFUkVEICovCisjZGVmaW5lIE1BWF9UWEVECTE2CisjZGVmaW5lIE1BWF9UWF9CVUZGRVJFRAkxMAorCitzdHJ1Y3QgZGV2X3ByaXYgeworICAgIHZvaWQgX19pb21lbSAqYmFzZTsKKyAgICB2b2lkIF9faW9tZW0gKnNlZXE7CisgICAgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgY29tbWFuZDsKKwl1bnNpZ25lZCBpbnQgY29uZmlnMTsKKwl1bnNpZ25lZCBpbnQgY29uZmlnMjsKKyAgICB9IHJlZ3M7CisgICAgdW5zaWduZWQgY2hhciB0eF9oZWFkOwkJLyogYnVmZmVyIG5yIHRvIGluc2VydCBuZXh0IHBhY2tldAkgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHR4X3RhaWw7CQkvKiBidWZmZXIgbnIgb2YgdHJhbnNtaXR0aW5nIHBhY2tldAkgKi8KKyAgICB1bnNpZ25lZCBpbnQgcnhfaGVhZDsJCS8qIGFkZHJlc3MgdG8gZmV0Y2ggbmV4dCBwYWNrZXQgZnJvbQkgKi8KKyAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKyAgICBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKyAgICBpbnQgYnJva2VuOwkJCQkvKiAwID0gb2ssIDEgPSBzb21ldGhpbmcgd2VudCB3cm9uZwkgKi8KK307CisKK3N0cnVjdCBldGhlcjNfZGF0YSB7CisJY29uc3QgY2hhciBuYW1lWzhdOworCXVuc2lnbmVkIGxvbmcgYmFzZV9vZmZzZXQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FybS9ldGhlcmguYyBiL2RyaXZlcnMvbmV0L2FybS9ldGhlcmguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDJhMjgxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXJtL2V0aGVyaC5jCkBAIC0wLDAgKzEsODYyIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvYWNvcm4vbmV0L2V0aGVyaC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMC0yMDAyIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTlM4MzkwIEktY3ViZWQgRXRoZXJIIGFuZCBBTlQgRXRoZXJNIHNwZWNpZmljIGRyaXZlcgorICogVGhhbmtzIHRvIEktQ3ViZWQgZm9yIGluZm9ybWF0aW9uIG9uIHRoZWlyIGNhcmRzLgorICogRXRoZXJNIGNvbnZlcnNpb24gKEMpIDE5OTkgQ2hyaXMgS2VtcCBhbmQgVGltIFdhdHRlcnRvbgorICogRXRoZXJNIGludGVncmF0aW9uIChDKSAyMDAwIEFsZXBoIE9uZSBMdGQgKFRhay1TaGluZyBDaGFuKQorICogRXRoZXJNIGludGVncmF0aW9uIHJlLWVuZ2luZWVyZWQgYnkgUnVzc2VsbCBLaW5nLgorICoKKyAqIENoYW5nZWxvZzoKKyAqICAwOC0xMi0xOTk2CVJNSwkxLjAwCUNyZWF0ZWQKKyAqCQlSTUsJMS4wMwlBZGRlZCBzdXBwb3J0IGZvciBFdGhlckxhbjUwMCBjYXJkcworICogIDIzLTExLTE5OTcJUk1LCTEuMDQJQWRkZWQgbWVkaWEgYXV0b2RldGVjdGlvbgorICogIDE2LTA0LTE5OTgJUk1LCTEuMDUJSW1wcm92ZWQgbWVkaWEgYXV0b2RldGVjdGlvbgorICogIDEwLTAyLTIwMDAJUk1LCTEuMDYJVXBkYXRlZCBmb3IgMi4zLjQzCisgKiAgMTMtMDUtMjAwMAlSTUsJMS4wNwlVcGRhdGVkIGZvciAyLjMuOTktcHJlOAorICogIDEyLTEwLTE5OTkgIENLL1RFVwkJRXRoZXJNIGRyaXZlciBmaXJzdCByZWxlYXNlCisgKiAgMjEtMTItMjAwMAlUVEMJCUV0aGVySC9FdGhlck0gaW50ZWdyYXRpb24KKyAqICAyNS0xMi0yMDAwCVJNSwkxLjA4CUNsZWFuIGludGVncmF0aW9uIG9mIEV0aGVyTSBpbnRvIHRoaXMgZHJpdmVyLgorICogIDAzLTAxLTIwMDIJUk1LCTEuMDkJQWx3YXlzIGVuYWJsZSBJUlFzIGlmIHdlJ3JlIGluIHRoZSBuaWMgc2xvdC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vZWNhcmQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlICIuLi84MzkwLmgiCisKKyNkZWZpbmUgTkVUX0RFQlVHICAwCisjZGVmaW5lIERFQlVHX0lOSVQgMgorCisjZGVmaW5lIERSVl9OQU1FCSJldGhlcmgiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjExIgorCitzdGF0aWMgdW5zaWduZWQgaW50IG5ldF9kZWJ1ZyA9IE5FVF9ERUJVRzsKKworc3RydWN0IGV0aGVyaF9wcml2IHsKKwl2b2lkIF9faW9tZW0JKmlvY19mYXN0OworCXZvaWQgX19pb21lbQkqbWVtYzsKKwl2b2lkIF9faW9tZW0JKmRtYV9iYXNlOworCXVuc2lnbmVkIGludAlpZDsKKwl2b2lkIF9faW9tZW0JKmN0cmxfcG9ydDsKKwl1bnNpZ25lZCBjaGFyCWN0cmw7CisJdTMyCQlzdXBwb3J0ZWQ7Cit9OworCitzdHJ1Y3QgZXRoZXJoX2RhdGEgeworCXVuc2lnbmVkIGxvbmcJbnM4MzkwX29mZnNldDsKKwl1bnNpZ25lZCBsb25nCWRhdGFwb3J0X29mZnNldDsKKwl1bnNpZ25lZCBsb25nCWN0cmxwb3J0X29mZnNldDsKKwlpbnQJCWN0cmxfaW9jOworCWNvbnN0IGNoYXIJbmFtZVsxNl07CisJdTMyCQlzdXBwb3J0ZWQ7CisJdW5zaWduZWQgY2hhcgl0eF9zdGFydF9wYWdlOworCXVuc2lnbmVkIGNoYXIJc3RvcF9wYWdlOworfTsKKworTU9EVUxFX0FVVEhPUigiUnVzc2VsbCBLaW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkV0aGVySC9FdGhlck0gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0KKwkiRXRoZXJIL0V0aGVyTSBEcml2ZXIgKGMpIDIwMDItMjAwNCBSdXNzZWxsIEtpbmcgIiBEUlZfVkVSU0lPTiAiXG4iOworCisjZGVmaW5lIEVUSEVSSDUwMF9EQVRBUE9SVAkweDgwMAkvKiBNRU1DICovCisjZGVmaW5lIEVUSEVSSDUwMF9OUzgzOTAJMHgwMDAJLyogTUVNQyAqLworI2RlZmluZSBFVEhFUkg1MDBfQ1RSTFBPUlQJMHg4MDAJLyogSU9DICAqLworCisjZGVmaW5lIEVUSEVSSDYwMF9EQVRBUE9SVAkweDA0MAkvKiBNRU1DICovCisjZGVmaW5lIEVUSEVSSDYwMF9OUzgzOTAJMHg4MDAJLyogTUVNQyAqLworI2RlZmluZSBFVEhFUkg2MDBfQ1RSTFBPUlQJMHgyMDAJLyogTUVNQyAqLworCisjZGVmaW5lIEVUSEVSSF9DUF9JRQkJMQorI2RlZmluZSBFVEhFUkhfQ1BfSUYJCTIKKyNkZWZpbmUgRVRIRVJIX0NQX0hFQVJUQkVBVAkyCisKKyNkZWZpbmUgRVRIRVJIX1RYX1NUQVJUX1BBR0UJMQorI2RlZmluZSBFVEhFUkhfU1RPUF9QQUdFCTEyNworCisvKgorICogVGhlc2UgY2FtZSBmcm9tIENLL1RFVworICovCisjZGVmaW5lIEVUSEVSTV9EQVRBUE9SVAkJMHgyMDAJLyogTUVNQyAqLworI2RlZmluZSBFVEhFUk1fTlM4MzkwCQkweDgwMAkvKiBNRU1DICovCisjZGVmaW5lIEVUSEVSTV9DVFJMUE9SVAkJMHgyM2MJLyogTUVNQyAqLworCisjZGVmaW5lIEVUSEVSTV9UWF9TVEFSVF9QQUdFCTY0CisjZGVmaW5lIEVUSEVSTV9TVE9QX1BBR0UJMTI3CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIGV0aGVyaF9wcml2KGRldikgXAorICgoc3RydWN0IGV0aGVyaF9wcml2ICopKCgoY2hhciAqKW5ldGRldl9wcml2KGRldikpICsgc2l6ZW9mKHN0cnVjdCBlaV9kZXZpY2UpKSkKKworc3RhdGljIGlubGluZSB2b2lkIGV0aGVyaF9zZXRfY3RybChzdHJ1Y3QgZXRoZXJoX3ByaXYgKmVoLCB1bnNpZ25lZCBjaGFyIG1hc2spCit7CisJdW5zaWduZWQgY2hhciBjdHJsID0gZWgtPmN0cmwgfCBtYXNrOworCWVoLT5jdHJsID0gY3RybDsKKwl3cml0ZWIoY3RybCwgZWgtPmN0cmxfcG9ydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBldGhlcmhfY2xyX2N0cmwoc3RydWN0IGV0aGVyaF9wcml2ICplaCwgdW5zaWduZWQgY2hhciBtYXNrKQoreworCXVuc2lnbmVkIGNoYXIgY3RybCA9IGVoLT5jdHJsICYgfm1hc2s7CisJZWgtPmN0cmwgPSBjdHJsOworCXdyaXRlYihjdHJsLCBlaC0+Y3RybF9wb3J0KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZXRoZXJoX2dldF9zdGF0KHN0cnVjdCBldGhlcmhfcHJpdiAqZWgpCit7CisJcmV0dXJuIHJlYWRiKGVoLT5jdHJsX3BvcnQpOworfQorCisKKworCitzdGF0aWMgdm9pZCBldGhlcmhfaXJxX2VuYWJsZShlY2FyZF90ICplYywgaW50IGlycW5yKQoreworCXN0cnVjdCBldGhlcmhfcHJpdiAqZWggPSBlYy0+aXJxX2RhdGE7CisKKwlldGhlcmhfc2V0X2N0cmwoZWgsIEVUSEVSSF9DUF9JRSk7Cit9CisKK3N0YXRpYyB2b2lkIGV0aGVyaF9pcnFfZGlzYWJsZShlY2FyZF90ICplYywgaW50IGlycW5yKQoreworCXN0cnVjdCBldGhlcmhfcHJpdiAqZWggPSBlYy0+aXJxX2RhdGE7CisKKwlldGhlcmhfY2xyX2N0cmwoZWgsIEVUSEVSSF9DUF9JRSk7Cit9CisKK3N0YXRpYyBleHBhbnNpb25jYXJkX29wc190IGV0aGVyaF9vcHMgPSB7CisJLmlycWVuYWJsZQk9IGV0aGVyaF9pcnFfZW5hYmxlLAorCS5pcnFkaXNhYmxlCT0gZXRoZXJoX2lycV9kaXNhYmxlLAorfTsKKworCisKKworc3RhdGljIHZvaWQKK2V0aGVyaF9zZXRpZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgX19pb21lbSAqYWRkcjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qIHNldCB0aGUgaW50ZXJmYWNlIHR5cGUgKi8KKwlzd2l0Y2ggKGV0aGVyaF9wcml2KGRldiktPmlkKSB7CisJY2FzZSBQUk9EX0kzX0VUSEVSTEFONjAwOgorCWNhc2UgUFJPRF9JM19FVEhFUkxBTjYwMEE6CisJCWFkZHIgPSAodm9pZCAqKWRldi0+YmFzZV9hZGRyICsgRU4wX1JDTlRISTsKKworCQlzd2l0Y2ggKGRldi0+aWZfcG9ydCkgeworCQljYXNlIElGX1BPUlRfMTBCQVNFMjoKKwkJCXdyaXRlYigocmVhZGIoYWRkcikgJiAweGY4KSB8IDEsIGFkZHIpOworCQkJYnJlYWs7CisJCWNhc2UgSUZfUE9SVF8xMEJBU0VUOgorCQkJd3JpdGViKChyZWFkYihhZGRyKSAmIDB4ZjgpLCBhZGRyKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBQUk9EX0kzX0VUSEVSTEFONTAwOgorCQlzd2l0Y2ggKGRldi0+aWZfcG9ydCkgeworCQljYXNlIElGX1BPUlRfMTBCQVNFMjoKKwkJCWV0aGVyaF9jbHJfY3RybChldGhlcmhfcHJpdihkZXYpLCBFVEhFUkhfQ1BfSUYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJRl9QT1JUXzEwQkFTRVQ6CisJCQlldGhlcmhfc2V0X2N0cmwoZXRoZXJoX3ByaXYoZGV2KSwgRVRIRVJIX0NQX0lGKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgaW50CitldGhlcmhfZ2V0aWZzdGF0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqYWRkcjsKKwlpbnQgc3RhdCA9IDA7CisKKwlzd2l0Y2ggKGV0aGVyaF9wcml2KGRldiktPmlkKSB7CisJY2FzZSBQUk9EX0kzX0VUSEVSTEFONjAwOgorCWNhc2UgUFJPRF9JM19FVEhFUkxBTjYwMEE6CisJCWFkZHIgPSAodm9pZCAqKWRldi0+YmFzZV9hZGRyICsgRU4wX1JDTlRISTsKKwkJc3dpdGNoIChkZXYtPmlmX3BvcnQpIHsKKwkJY2FzZSBJRl9QT1JUXzEwQkFTRTI6CisJCQlzdGF0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIElGX1BPUlRfMTBCQVNFVDoKKwkJCXN0YXQgPSByZWFkYihhZGRyKSAmIDQ7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUFJPRF9JM19FVEhFUkxBTjUwMDoKKwkJc3dpdGNoIChkZXYtPmlmX3BvcnQpIHsKKwkJY2FzZSBJRl9QT1JUXzEwQkFTRTI6CisJCQlzdGF0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIElGX1BPUlRfMTBCQVNFVDoKKwkJCXN0YXQgPSBldGhlcmhfZ2V0X3N0YXQoZXRoZXJoX3ByaXYoZGV2KSkgJiBFVEhFUkhfQ1BfSEVBUlRCRUFUOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzdGF0ID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN0YXQgIT0gMDsKK30KKworLyoKKyAqIENvbmZpZ3VyZSB0aGUgaW50ZXJmYWNlLiAgTm90ZSB0aGF0IHdlIGlnbm9yZSB0aGUgb3RoZXIKKyAqIHBhcnRzIG9mIGlmbWFwLCBzaW5jZSBpdHMgbW9zdGx5IG1lYW5pbmdsZXNzIGZvciB0aGlzIGRyaXZlci4KKyAqLworc3RhdGljIGludCBldGhlcmhfc2V0X2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCkKK3sKKwlzd2l0Y2ggKG1hcC0+cG9ydCkgeworCWNhc2UgSUZfUE9SVF8xMEJBU0UyOgorCWNhc2UgSUZfUE9SVF8xMEJBU0VUOgorCQkvKgorCQkgKiBJZiB0aGUgdXNlciBleHBsaWNpdGx5IHNldHMgdGhlIGludGVyZmFjZQorCQkgKiBtZWRpYSB0eXBlLCB0dXJuIG9mZiBhdXRvbWVkaWEgZGV0ZWN0aW9uLgorCQkgKi8KKwkJZGV2LT5mbGFncyAmPSB+SUZGX0FVVE9NRURJQTsKKwkJZGV2LT5pZl9wb3J0ID0gbWFwLT5wb3J0OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWV0aGVyaF9zZXRpZihkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXNldCB0aGUgODM5MCAoaGFyZCByZXNldCkuICBOb3RlIHRoYXQgd2UgY2FuJ3QgYWN0dWFsbHkgZG8gdGhpcy4KKyAqLworc3RhdGljIHZvaWQKK2V0aGVyaF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmFkZHIgPSAodm9pZCAqKWRldi0+YmFzZV9hZGRyOworCisJd3JpdGViKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIGFkZHIpOworCisJLyoKKwkgKiBTZWUgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGludGVyZmFjZSB0eXBlLgorCSAqIE5vdGUgdGhhdCB3ZSB1c2UgJ2ludGVyZmFjZV9udW0nIGFzIGEgZmxhZworCSAqIHRvIGluZGljYXRlIHRoYXQgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIG1lZGlhLgorCSAqLworCWlmIChkZXYtPmZsYWdzICYgSUZGX0FVVE9NRURJQSAmJiBlaV9sb2NhbC0+aW50ZXJmYWNlX251bSkgeworCQllaV9sb2NhbC0+aW50ZXJmYWNlX251bSA9IDA7CisKKwkJaWYgKGRldi0+aWZfcG9ydCA9PSBJRl9QT1JUXzEwQkFTRVQpCisJCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwQkFTRTI7CisJCWVsc2UKKwkJCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfMTBCQVNFVDsKKworCQlldGhlcmhfc2V0aWYoZGV2KTsKKwl9Cit9CisKKy8qCisgKiBXcml0ZSBhIGJsb2NrIG9mIGRhdGEgb3V0IHRvIHRoZSA4MzkwCisgKi8KK3N0YXRpYyB2b2lkCitldGhlcmhfYmxvY2tfb3V0cHV0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHN0YXJ0X3BhZ2UpCit7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZG1hX3N0YXJ0OworCXZvaWQgX19pb21lbSAqZG1hX2Jhc2UsICphZGRyOworCisJaWYgKGVpX2xvY2FsLT5kbWFpbmcpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRE1BaW5nIGNvbmZsaWN0IGluIGV0aGVyaF9ibG9ja19pbnB1dDogIgorCQkJIiBETUFzdGF0ICVkIGlycWxvY2sgJWRcbiIsIGRldi0+bmFtZSwKKwkJCWVpX2xvY2FsLT5kbWFpbmcsIGVpX2xvY2FsLT5pcnFsb2NrKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogTWFrZSBzdXJlIHdlIGhhdmUgYSByb3VuZCBudW1iZXIgb2YgYnl0ZXMgaWYgd2UncmUgaW4gd29yZCBtb2RlLgorCSAqLworCWlmIChjb3VudCAmIDEgJiYgZWlfbG9jYWwtPndvcmQxNikKKwkJY291bnQrKzsKKworCWVpX2xvY2FsLT5kbWFpbmcgPSAxOworCisJYWRkciA9ICh2b2lkICopZGV2LT5iYXNlX2FkZHI7CisJZG1hX2Jhc2UgPSBldGhlcmhfcHJpdihkZXYpLT5kbWFfYmFzZTsKKworCWNvdW50ID0gKGNvdW50ICsgMSkgJiB+MTsKKwl3cml0ZWIgKEU4MzkwX05PRE1BIHwgRTgzOTBfUEFHRTAgfCBFODM5MF9TVEFSVCwgYWRkciArIEU4MzkwX0NNRCk7CisKKwl3cml0ZWIgKDB4NDIsIGFkZHIgKyBFTjBfUkNOVExPKTsKKwl3cml0ZWIgKDB4MDAsIGFkZHIgKyBFTjBfUkNOVEhJKTsKKwl3cml0ZWIgKDB4NDIsIGFkZHIgKyBFTjBfUlNBUkxPKTsKKwl3cml0ZWIgKDB4MDAsIGFkZHIgKyBFTjBfUlNBUkhJKTsKKwl3cml0ZWIgKEU4MzkwX1JSRUFEIHwgRTgzOTBfU1RBUlQsIGFkZHIgKyBFODM5MF9DTUQpOworCisJdWRlbGF5ICgxKTsKKworCXdyaXRlYiAoRU5JU1JfUkRDLCBhZGRyICsgRU4wX0lTUik7CisJd3JpdGViIChjb3VudCwgYWRkciArIEVOMF9SQ05UTE8pOworCXdyaXRlYiAoY291bnQgPj4gOCwgYWRkciArIEVOMF9SQ05USEkpOworCXdyaXRlYiAoMCwgYWRkciArIEVOMF9SU0FSTE8pOworCXdyaXRlYiAoc3RhcnRfcGFnZSwgYWRkciArIEVOMF9SU0FSSEkpOworCXdyaXRlYiAoRTgzOTBfUldSSVRFIHwgRTgzOTBfU1RBUlQsIGFkZHIgKyBFODM5MF9DTUQpOworCisJaWYgKGVpX2xvY2FsLT53b3JkMTYpCisJCXdyaXRlc3cgKGRtYV9iYXNlLCBidWYsIGNvdW50ID4+IDEpOworCWVsc2UKKwkJd3JpdGVzYiAoZG1hX2Jhc2UsIGJ1ZiwgY291bnQpOworCisJZG1hX3N0YXJ0ID0gamlmZmllczsKKworCXdoaWxlICgocmVhZGIgKGFkZHIgKyBFTjBfSVNSKSAmIEVOSVNSX1JEQykgPT0gMCkKKwkJaWYgKGppZmZpZXMgLSBkbWFfc3RhcnQgPiAyKkhaLzEwMCkgeyAvKiAyMG1zICovCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIFRYIFJEQ1xuIiwKKwkJCQlkZXYtPm5hbWUpOworCQkJZXRoZXJoX3Jlc2V0IChkZXYpOworCQkJTlM4MzkwX2luaXQgKGRldiwgMSk7CisJCQlicmVhazsKKwkJfQorCisJd3JpdGViIChFTklTUl9SREMsIGFkZHIgKyBFTjBfSVNSKTsKKwllaV9sb2NhbC0+ZG1haW5nID0gMDsKK30KKworLyoKKyAqIFJlYWQgYSBibG9jayBvZiBkYXRhIGZyb20gdGhlIDgzOTAKKyAqLworc3RhdGljIHZvaWQKK2V0aGVyaF9ibG9ja19pbnB1dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpCit7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwl2b2lkIF9faW9tZW0gKmRtYV9iYXNlLCAqYWRkcjsKKworCWlmIChlaV9sb2NhbC0+ZG1haW5nKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IERNQWluZyBjb25mbGljdCBpbiBldGhlcmhfYmxvY2tfaW5wdXQ6ICIKKwkJCSIgRE1Bc3RhdCAlZCBpcnFsb2NrICVkXG4iLCBkZXYtPm5hbWUsCisJCQllaV9sb2NhbC0+ZG1haW5nLCBlaV9sb2NhbC0+aXJxbG9jayk7CisJCXJldHVybjsKKwl9CisKKwllaV9sb2NhbC0+ZG1haW5nID0gMTsKKworCWFkZHIgPSAodm9pZCAqKWRldi0+YmFzZV9hZGRyOworCWRtYV9iYXNlID0gZXRoZXJoX3ByaXYoZGV2KS0+ZG1hX2Jhc2U7CisKKwlidWYgPSBza2ItPmRhdGE7CisJd3JpdGViIChFODM5MF9OT0RNQSB8IEU4MzkwX1BBR0UwIHwgRTgzOTBfU1RBUlQsIGFkZHIgKyBFODM5MF9DTUQpOworCXdyaXRlYiAoY291bnQsIGFkZHIgKyBFTjBfUkNOVExPKTsKKwl3cml0ZWIgKGNvdW50ID4+IDgsIGFkZHIgKyBFTjBfUkNOVEhJKTsKKwl3cml0ZWIgKHJpbmdfb2Zmc2V0LCBhZGRyICsgRU4wX1JTQVJMTyk7CisJd3JpdGViIChyaW5nX29mZnNldCA+PiA4LCBhZGRyICsgRU4wX1JTQVJISSk7CisJd3JpdGViIChFODM5MF9SUkVBRCB8IEU4MzkwX1NUQVJULCBhZGRyICsgRTgzOTBfQ01EKTsKKworCWlmIChlaV9sb2NhbC0+d29yZDE2KSB7CisJCXJlYWRzdyAoZG1hX2Jhc2UsIGJ1ZiwgY291bnQgPj4gMSk7CisJCWlmIChjb3VudCAmIDEpCisJCQlidWZbY291bnQgLSAxXSA9IHJlYWRiIChkbWFfYmFzZSk7CisJfSBlbHNlCisJCXJlYWRzYiAoZG1hX2Jhc2UsIGJ1ZiwgY291bnQpOworCisJd3JpdGViIChFTklTUl9SREMsIGFkZHIgKyBFTjBfSVNSKTsKKwllaV9sb2NhbC0+ZG1haW5nID0gMDsKK30KKworLyoKKyAqIFJlYWQgYSBoZWFkZXIgZnJvbSB0aGUgODM5MAorICovCitzdGF0aWMgdm9pZAorZXRoZXJoX2dldF9oZWFkZXIgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsIGludCByaW5nX3BhZ2UpCit7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqZG1hX2Jhc2UsICphZGRyOworCisJaWYgKGVpX2xvY2FsLT5kbWFpbmcpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRE1BaW5nIGNvbmZsaWN0IGluIGV0aGVyaF9nZXRfaGVhZGVyOiAiCisJCQkiIERNQXN0YXQgJWQgaXJxbG9jayAlZFxuIiwgZGV2LT5uYW1lLAorCQkJZWlfbG9jYWwtPmRtYWluZywgZWlfbG9jYWwtPmlycWxvY2spOworCQlyZXR1cm47CisJfQorCisJZWlfbG9jYWwtPmRtYWluZyA9IDE7CisKKwlhZGRyID0gKHZvaWQgKilkZXYtPmJhc2VfYWRkcjsKKwlkbWFfYmFzZSA9IGV0aGVyaF9wcml2KGRldiktPmRtYV9iYXNlOworCisJd3JpdGViIChFODM5MF9OT0RNQSB8IEU4MzkwX1BBR0UwIHwgRTgzOTBfU1RBUlQsIGFkZHIgKyBFODM5MF9DTUQpOworCXdyaXRlYiAoc2l6ZW9mICgqaGRyKSwgYWRkciArIEVOMF9SQ05UTE8pOworCXdyaXRlYiAoMCwgYWRkciArIEVOMF9SQ05USEkpOworCXdyaXRlYiAoMCwgYWRkciArIEVOMF9SU0FSTE8pOworCXdyaXRlYiAocmluZ19wYWdlLCBhZGRyICsgRU4wX1JTQVJISSk7CisJd3JpdGViIChFODM5MF9SUkVBRCB8IEU4MzkwX1NUQVJULCBhZGRyICsgRTgzOTBfQ01EKTsKKworCWlmIChlaV9sb2NhbC0+d29yZDE2KQorCQlyZWFkc3cgKGRtYV9iYXNlLCBoZHIsIHNpemVvZiAoKmhkcikgPj4gMSk7CisJZWxzZQorCQlyZWFkc2IgKGRtYV9iYXNlLCBoZHIsIHNpemVvZiAoKmhkcikpOworCisJd3JpdGViIChFTklTUl9SREMsIGFkZHIgKyBFTjBfSVNSKTsKKwllaV9sb2NhbC0+ZG1haW5nID0gMDsKK30KKworLyoKKyAqIE9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuICBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQorICogc29tZXRpbWUgYWZ0ZXIgYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgorICoKKyAqIFRoaXMgcm91dGluZSBzaG91bGQgc2V0IGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4KKyAqIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0CisgKiB0aGVyZSBpcyBub24tcmVib290IHdheSB0byByZWNvdmVyIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgorICovCitzdGF0aWMgaW50CitldGhlcmhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaW52YWxpZCBldGhlcm5ldCBNQUMgYWRkcmVzc1xuIiwKKwkJCWRldi0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgZWlfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldikpCisJCXJldHVybiAtRUFHQUlOOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCB3ZSBhcmVuJ3QgZ29pbmcgdG8gY2hhbmdlIHRoZQorCSAqIG1lZGlhIHR5cGUgb24gdGhlIG5leHQgcmVzZXQgLSB3ZSBhcmUgYWJvdXQgdG8KKwkgKiBkbyBhdXRvbWVkaWEgbWFudWFsbHkgbm93LgorCSAqLworCWVpX2xvY2FsLT5pbnRlcmZhY2VfbnVtID0gMDsKKworCS8qCisJICogSWYgd2UgYXJlIGRvaW5nIGF1dG9tZWRpYSBkZXRlY3Rpb24sIGRvIGl0IG5vdy4KKwkgKiBUaGlzIGlzIG1vcmUgcmVsaWFibGUgdGhhbiB0aGUgODM5MCdzIGRldGVjdGlvbi4KKwkgKi8KKwlpZiAoZGV2LT5mbGFncyAmIElGRl9BVVRPTUVESUEpIHsKKwkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMEJBU0VUOworCQlldGhlcmhfc2V0aWYoZGV2KTsKKwkJbWRlbGF5KDEpOworCQlpZiAoIWV0aGVyaF9nZXRpZnN0YXQoZGV2KSkgeworCQkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMEJBU0UyOworCQkJZXRoZXJoX3NldGlmKGRldik7CisJCX0KKwl9IGVsc2UKKwkJZXRoZXJoX3NldGlmKGRldik7CisKKwlldGhlcmhfcmVzZXQoZGV2KTsKKwllaV9vcGVuKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gZXRoZXJoX29wZW4oKS4KKyAqLworc3RhdGljIGludAorZXRoZXJoX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZWlfY2xvc2UgKGRldik7CisJZnJlZV9pcnEgKGRldi0+aXJxLCBkZXYpOworCXJldHVybiAwOworfQorCisvKgorICogSW5pdGlhbGlzYXRpb24KKyAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgZXRoZXJoX2Jhbm5lcih2b2lkKQoreworCXN0YXRpYyBpbnQgdmVyc2lvbl9wcmludGVkOworCisJaWYgKG5ldF9kZWJ1ZyAmJiB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworfQorCisvKgorICogUmVhZCB0aGUgZXRoZXJuZXQgYWRkcmVzcyBzdHJpbmcgZnJvbSB0aGUgb24gYm9hcmQgcm9tLgorICogVGhpcyBpcyBhbiBhc2NpaSBzdHJpbmcuLi4KKyAqLworc3RhdGljIGludCBfX2luaXQgZXRoZXJoX2FkZHIoY2hhciAqYWRkciwgc3RydWN0IGV4cGFuc2lvbl9jYXJkICplYykKK3sKKwlzdHJ1Y3QgaW5fY2h1bmtfZGlyIGNkOworCWNoYXIgKnM7CisJCisJaWYgKCFlY2FyZF9yZWFkY2h1bmsoJmNkLCBlYywgMHhmNSwgMCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHJlYWQgcG9kdWxlIGRlc2NyaXB0aW9uIHN0cmluZ1xuIiwKKwkJICAgICAgIGVjLT5kZXYuYnVzX2lkKTsKKwkJZ290byBub19hZGRyOworCX0KKworCXMgPSBzdHJjaHIoY2QuZC5zdHJpbmcsICcoJyk7CisJaWYgKHMpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQkJYWRkcltpXSA9IHNpbXBsZV9zdHJ0b3VsKHMgKyAxLCAmcywgMHgxMCk7CisJCQlpZiAoKnMgIT0gKGkgPT0gNT8gJyknIDogJzonKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpID09IDYpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gcGFyc2UgTUFDIGFkZHJlc3M6ICVzXG4iLAorCSAgICAgICBlYy0+ZGV2LmJ1c19pZCwgY2QuZC5zdHJpbmcpOworCisgbm9fYWRkcjoKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyoKKyAqIENyZWF0ZSBhbiBldGhlcm5ldCBhZGRyZXNzIGZyb20gdGhlIHN5c3RlbSBzZXJpYWwgbnVtYmVyLgorICovCitzdGF0aWMgaW50IF9faW5pdCBldGhlcm1fYWRkcihjaGFyICphZGRyKQoreworCXVuc2lnbmVkIGludCBzZXJpYWw7CisKKwlpZiAoc3lzdGVtX3NlcmlhbF9sb3cgPT0gMCAmJiBzeXN0ZW1fc2VyaWFsX2hpZ2ggPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzZXJpYWwgPSBzeXN0ZW1fc2VyaWFsX2xvdyB8IHN5c3RlbV9zZXJpYWxfaGlnaDsKKworCWFkZHJbMF0gPSAwOworCWFkZHJbMV0gPSAwOworCWFkZHJbMl0gPSAweGE0OworCWFkZHJbM10gPSAweDEwICsgKHNlcmlhbCA+PiAyNCk7CisJYWRkcls0XSA9IHNlcmlhbCA+PiAxNjsKKwlhZGRyWzVdID0gc2VyaWFsID4+IDg7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV0aGVyaF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CisJc3RybGNweShpbmZvLT5idXNfaW5mbywgZGV2LT5jbGFzc19kZXYuZGV2LT5idXNfaWQsCisJCXNpemVvZihpbmZvLT5idXNfaW5mbykpOworfQorCitzdGF0aWMgaW50IGV0aGVyaF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJY21kLT5zdXBwb3J0ZWQJPSBldGhlcmhfcHJpdihkZXYpLT5zdXBwb3J0ZWQ7CisJY21kLT5zcGVlZAk9IFNQRUVEXzEwOworCWNtZC0+ZHVwbGV4CT0gRFVQTEVYX0hBTEY7CisJY21kLT5wb3J0CT0gZGV2LT5pZl9wb3J0ID09IElGX1BPUlRfMTBCQVNFVCA/IFBPUlRfVFAgOiBQT1JUX0JOQzsKKwljbWQtPmF1dG9uZWcJPSBkZXYtPmZsYWdzICYgSUZGX0FVVE9NRURJQSA/IEFVVE9ORUdfRU5BQkxFIDogQVVUT05FR19ESVNBQkxFOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV0aGVyaF9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3dpdGNoIChjbWQtPmF1dG9uZWcpIHsKKwljYXNlIEFVVE9ORUdfRU5BQkxFOgorCQlkZXYtPmZsYWdzIHw9IElGRl9BVVRPTUVESUE7CisJCWJyZWFrOworCisJY2FzZSBBVVRPTkVHX0RJU0FCTEU6CisJCXN3aXRjaCAoY21kLT5wb3J0KSB7CisJCWNhc2UgUE9SVF9UUDoKKwkJCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfMTBCQVNFVDsKKwkJCWJyZWFrOworCisJCWNhc2UgUE9SVF9CTkM6CisJCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwQkFTRTI7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZGV2LT5mbGFncyAmPSB+SUZGX0FVVE9NRURJQTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlldGhlcmhfc2V0aWYoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aGVyaF9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzCT0gZXRoZXJoX2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCT0gZXRoZXJoX3NldF9zZXR0aW5ncywKKwkuZ2V0X2RydmluZm8JPSBldGhlcmhfZ2V0X2RydmluZm8sCit9OworCitzdGF0aWMgdTMyIGV0aGVyaF9yZWdvZmZzZXRzWzE2XTsKK3N0YXRpYyB1MzIgZXRoZXJtX3JlZ29mZnNldHNbMTZdOworCitzdGF0aWMgaW50IF9faW5pdAorZXRoZXJoX3Byb2JlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMsIGNvbnN0IHN0cnVjdCBlY2FyZF9pZCAqaWQpCit7CisJY29uc3Qgc3RydWN0IGV0aGVyaF9kYXRhICpkYXRhID0gaWQtPmRhdGE7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZXRoZXJoX3ByaXYgKmVoOworCWludCBpLCByZXQ7CisKKwlldGhlcmhfYmFubmVyKCk7CisKKwlyZXQgPSBlY2FyZF9yZXF1ZXN0X3Jlc291cmNlcyhlYyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlkZXYgPSBfX2FsbG9jX2VpX25ldGRldihzaXplb2Yoc3RydWN0IGV0aGVyaF9wcml2KSk7CisJaWYgKCFkZXYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byByZWxlYXNlOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZlYy0+ZGV2KTsKKworCWRldi0+b3BlbgkJPSBldGhlcmhfb3BlbjsKKwlkZXYtPnN0b3AJCT0gZXRoZXJoX2Nsb3NlOworCWRldi0+c2V0X2NvbmZpZwkJPSBldGhlcmhfc2V0X2NvbmZpZzsKKwlkZXYtPmlycQkJPSBlYy0+aXJxOworCWRldi0+ZXRodG9vbF9vcHMJPSAmZXRoZXJoX2V0aHRvb2xfb3BzOworCisJaWYgKGRhdGEtPnN1cHBvcnRlZCAmIFNVUFBPUlRFRF9BdXRvbmVnKQorCQlkZXYtPmZsYWdzIHw9IElGRl9BVVRPTUVESUE7CisJaWYgKGRhdGEtPnN1cHBvcnRlZCAmIFNVUFBPUlRFRF9UUCkgeworCQlkZXYtPmZsYWdzIHw9IElGRl9QT1JUU0VMOworCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwQkFTRVQ7CisJfSBlbHNlIGlmIChkYXRhLT5zdXBwb3J0ZWQgJiBTVVBQT1JURURfQk5DKSB7CisJCWRldi0+ZmxhZ3MgfD0gSUZGX1BPUlRTRUw7CisJCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfMTBCQVNFMjsKKwl9IGVsc2UKKwkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF9VTktOT1dOOworCisJZWggPSBldGhlcmhfcHJpdihkZXYpOworCWVoLT5zdXBwb3J0ZWQJCT0gZGF0YS0+c3VwcG9ydGVkOworCWVoLT5jdHJsCQk9IDA7CisJZWgtPmlkCQkJPSBlYy0+Y2lkLnByb2R1Y3Q7CisJZWgtPm1lbWMJCT0gaW9yZW1hcChlY2FyZF9yZXNvdXJjZV9zdGFydChlYywgRUNBUkRfUkVTX01FTUMpLCBQQUdFX1NJWkUpOworCWlmICghZWgtPm1lbWMpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmcmVlOworCX0KKworCWVoLT5jdHJsX3BvcnQgPSBlaC0+bWVtYzsKKwlpZiAoZGF0YS0+Y3RybF9pb2MpIHsKKwkJZWgtPmlvY19mYXN0ID0gaW9yZW1hcChlY2FyZF9yZXNvdXJjZV9zdGFydChlYywgRUNBUkRfUkVTX0lPQ0ZBU1QpLCBQQUdFX1NJWkUpOworCQlpZiAoIWVoLT5pb2NfZmFzdCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZnJlZTsKKwkJfQorCQllaC0+Y3RybF9wb3J0ID0gZWgtPmlvY19mYXN0OworCX0KKworCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpZWgtPm1lbWMgKyBkYXRhLT5uczgzOTBfb2Zmc2V0OworCWVoLT5kbWFfYmFzZSA9IGVoLT5tZW1jICsgZGF0YS0+ZGF0YXBvcnRfb2Zmc2V0OworCWVoLT5jdHJsX3BvcnQgKz0gZGF0YS0+Y3RybHBvcnRfb2Zmc2V0OworCisJLyoKKwkgKiBJUlEgYW5kIGNvbnRyb2wgcG9ydCBoYW5kbGluZyAtIG9ubHkgZm9yIG5vbi1OSUMgc2xvdCBjYXJkcy4KKwkgKi8KKwlpZiAoZWMtPnNsb3Rfbm8gIT0gOCkgeworCQllYy0+b3BzCQk9ICZldGhlcmhfb3BzOworCQllYy0+aXJxX2RhdGEJPSBlaDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBJZiB3ZSdyZSBpbiB0aGUgTklDIHNsb3QsIG1ha2Ugc3VyZSB0aGUgSVJRIGlzIGVuYWJsZWQKKwkJICovCisJCWV0aGVyaF9zZXRfY3RybChlaCwgRVRIRVJIX0NQX0lFKTsKKwl9CisKKwllaV9sb2NhbCA9IG5ldGRldl9wcml2KGRldik7CisJc3Bpbl9sb2NrX2luaXQoJmVpX2xvY2FsLT5wYWdlX2xvY2spOworCisJaWYgKGVjLT5jaWQucHJvZHVjdCA9PSBQUk9EX0FOVF9FVEhFUk0pIHsKKwkJZXRoZXJtX2FkZHIoZGV2LT5kZXZfYWRkcik7CisJCWVpX2xvY2FsLT5yZWdfb2Zmc2V0ID0gZXRoZXJtX3JlZ29mZnNldHM7CisJfSBlbHNlIHsKKwkJZXRoZXJoX2FkZHIoZGV2LT5kZXZfYWRkciwgZWMpOworCQllaV9sb2NhbC0+cmVnX29mZnNldCA9IGV0aGVyaF9yZWdvZmZzZXRzOworCX0KKworCWVpX2xvY2FsLT5uYW1lICAgICAgICAgID0gZGV2LT5uYW1lOworCWVpX2xvY2FsLT53b3JkMTYgICAgICAgID0gMTsKKwllaV9sb2NhbC0+dHhfc3RhcnRfcGFnZSA9IGRhdGEtPnR4X3N0YXJ0X3BhZ2U7CisJZWlfbG9jYWwtPnJ4X3N0YXJ0X3BhZ2UgPSBlaV9sb2NhbC0+dHhfc3RhcnRfcGFnZSArIFRYX1BBR0VTOworCWVpX2xvY2FsLT5zdG9wX3BhZ2UgICAgID0gZGF0YS0+c3RvcF9wYWdlOworCWVpX2xvY2FsLT5yZXNldF84MzkwICAgID0gZXRoZXJoX3Jlc2V0OworCWVpX2xvY2FsLT5ibG9ja19pbnB1dCAgID0gZXRoZXJoX2Jsb2NrX2lucHV0OworCWVpX2xvY2FsLT5ibG9ja19vdXRwdXQgID0gZXRoZXJoX2Jsb2NrX291dHB1dDsKKwllaV9sb2NhbC0+Z2V0XzgzOTBfaGRyICA9IGV0aGVyaF9nZXRfaGVhZGVyOworCWVpX2xvY2FsLT5pbnRlcmZhY2VfbnVtID0gMDsKKworCWV0aGVyaF9yZXNldChkZXYpOworCU5TODM5MF9pbml0KGRldiwgMCk7CisKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGZyZWU7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgaW4gc2xvdCAlZCwgIiwKKwkJZGV2LT5uYW1lLCBkYXRhLT5uYW1lLCBlYy0+c2xvdF9ubyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiUyLjJ4JWMiLCBkZXYtPmRldl9hZGRyW2ldLCBpID09IDUgPyAnXG4nIDogJzonKTsKKworCWVjYXJkX3NldF9kcnZkYXRhKGVjLCBkZXYpOworCisJcmV0dXJuIDA7CisKKyBmcmVlOgorCWlmIChlaC0+aW9jX2Zhc3QpCisJCWlvdW5tYXAoZWgtPmlvY19mYXN0KTsKKwlpZiAoZWgtPm1lbWMpCisJCWlvdW5tYXAoZWgtPm1lbWMpOworCWZyZWVfbmV0ZGV2KGRldik7CisgcmVsZWFzZToKKwllY2FyZF9yZWxlYXNlX3Jlc291cmNlcyhlYyk7Cisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBldGhlcmhfcmVtb3ZlKHN0cnVjdCBleHBhbnNpb25fY2FyZCAqZWMpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGVjYXJkX2dldF9kcnZkYXRhKGVjKTsKKwlzdHJ1Y3QgZXRoZXJoX3ByaXYgKmVoID0gZXRoZXJoX3ByaXYoZGV2KTsKKworCWVjYXJkX3NldF9kcnZkYXRhKGVjLCBOVUxMKTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJZWMtPm9wcyA9IE5VTEw7CisKKwlpZiAoZWgtPmlvY19mYXN0KQorCQlpb3VubWFwKGVoLT5pb2NfZmFzdCk7CisJaW91bm1hcChlaC0+bWVtYyk7CisKKwlmcmVlX25ldGRldihkZXYpOworCisJZWNhcmRfcmVsZWFzZV9yZXNvdXJjZXMoZWMpOworfQorCitzdGF0aWMgc3RydWN0IGV0aGVyaF9kYXRhIGV0aGVybV9kYXRhID0geworCS5uczgzOTBfb2Zmc2V0CQk9IEVUSEVSTV9OUzgzOTAsCisJLmRhdGFwb3J0X29mZnNldAk9IEVUSEVSTV9OUzgzOTAgKyBFVEhFUk1fREFUQVBPUlQsCisJLmN0cmxwb3J0X29mZnNldAk9IEVUSEVSTV9OUzgzOTAgKyBFVEhFUk1fQ1RSTFBPUlQsCisJLm5hbWUJCQk9ICJBTlQgRXRoZXJNIiwKKwkuc3VwcG9ydGVkCQk9IFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYsCisJLnR4X3N0YXJ0X3BhZ2UJCT0gRVRIRVJNX1RYX1NUQVJUX1BBR0UsCisJLnN0b3BfcGFnZQkJPSBFVEhFUk1fU1RPUF9QQUdFLAorfTsKKworc3RhdGljIHN0cnVjdCBldGhlcmhfZGF0YSBldGhlcmxhbjUwMF9kYXRhID0geworCS5uczgzOTBfb2Zmc2V0CQk9IEVUSEVSSDUwMF9OUzgzOTAsCisJLmRhdGFwb3J0X29mZnNldAk9IEVUSEVSSDUwMF9OUzgzOTAgKyBFVEhFUkg1MDBfREFUQVBPUlQsCisJLmN0cmxwb3J0X29mZnNldAk9IEVUSEVSSDUwMF9DVFJMUE9SVCwKKwkuY3RybF9pb2MJCT0gMSwKKwkubmFtZQkJCT0gImkzIEV0aGVySCA1MDAiLAorCS5zdXBwb3J0ZWQJCT0gU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiwKKwkudHhfc3RhcnRfcGFnZQkJPSBFVEhFUkhfVFhfU1RBUlRfUEFHRSwKKwkuc3RvcF9wYWdlCQk9IEVUSEVSSF9TVE9QX1BBR0UsCit9OworCitzdGF0aWMgc3RydWN0IGV0aGVyaF9kYXRhIGV0aGVybGFuNjAwX2RhdGEgPSB7CisJLm5zODM5MF9vZmZzZXQJCT0gRVRIRVJINjAwX05TODM5MCwKKwkuZGF0YXBvcnRfb2Zmc2V0CT0gRVRIRVJINjAwX05TODM5MCArIEVUSEVSSDYwMF9EQVRBUE9SVCwKKwkuY3RybHBvcnRfb2Zmc2V0CT0gRVRIRVJINjAwX05TODM5MCArIEVUSEVSSDYwMF9DVFJMUE9SVCwKKwkubmFtZQkJCT0gImkzIEV0aGVySCA2MDAiLAorCS5zdXBwb3J0ZWQJCT0gU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF9UUCB8IFNVUFBPUlRFRF9CTkMgfCBTVVBQT1JURURfQXV0b25lZywKKwkudHhfc3RhcnRfcGFnZQkJPSBFVEhFUkhfVFhfU1RBUlRfUEFHRSwKKwkuc3RvcF9wYWdlCQk9IEVUSEVSSF9TVE9QX1BBR0UsCit9OworCitzdGF0aWMgc3RydWN0IGV0aGVyaF9kYXRhIGV0aGVybGFuNjAwYV9kYXRhID0geworCS5uczgzOTBfb2Zmc2V0CQk9IEVUSEVSSDYwMF9OUzgzOTAsCisJLmRhdGFwb3J0X29mZnNldAk9IEVUSEVSSDYwMF9OUzgzOTAgKyBFVEhFUkg2MDBfREFUQVBPUlQsCisJLmN0cmxwb3J0X29mZnNldAk9IEVUSEVSSDYwMF9OUzgzOTAgKyBFVEhFUkg2MDBfQ1RSTFBPUlQsCisJLm5hbWUJCQk9ICJpMyBFdGhlckggNjAwQSIsCisJLnN1cHBvcnRlZAkJPSBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEX1RQIHwgU1VQUE9SVEVEX0JOQyB8IFNVUFBPUlRFRF9BdXRvbmVnLAorCS50eF9zdGFydF9wYWdlCQk9IEVUSEVSSF9UWF9TVEFSVF9QQUdFLAorCS5zdG9wX3BhZ2UJCT0gRVRIRVJIX1NUT1BfUEFHRSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWNhcmRfaWQgZXRoZXJoX2lkc1tdID0geworCXsgTUFOVV9BTlQsIFBST0RfQU5UX0VUSEVSTSwgICAgICAmZXRoZXJtX2RhdGEgICAgICAgfSwKKwl7IE1BTlVfSTMsICBQUk9EX0kzX0VUSEVSTEFONTAwLCAgJmV0aGVybGFuNTAwX2RhdGEgIH0sCisJeyBNQU5VX0kzLCAgUFJPRF9JM19FVEhFUkxBTjYwMCwgICZldGhlcmxhbjYwMF9kYXRhICB9LAorCXsgTUFOVV9JMywgIFBST0RfSTNfRVRIRVJMQU42MDBBLCAmZXRoZXJsYW42MDBhX2RhdGEgfSwKKwl7IDB4ZmZmZiwgICAweGZmZmYgfQorfTsKKworc3RhdGljIHN0cnVjdCBlY2FyZF9kcml2ZXIgZXRoZXJoX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gZXRoZXJoX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZXRoZXJoX3JlbW92ZSksCisJLmlkX3RhYmxlCT0gZXRoZXJoX2lkcywKKwkuZHJ2ID0geworCQkubmFtZQk9IERSVl9OQU1FLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBldGhlcmhfaW5pdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJZXRoZXJoX3JlZ29mZnNldHNbaV0gPSBpIDw8IDI7CisJCWV0aGVybV9yZWdvZmZzZXRzW2ldID0gaSA8PCA1OworCX0KKworCXJldHVybiBlY2FyZF9yZWdpc3Rlcl9kcml2ZXIoJmV0aGVyaF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXRoZXJoX2V4aXQodm9pZCkKK3sKKwllY2FyZF9yZW1vdmVfZHJpdmVyKCZldGhlcmhfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZXRoZXJoX2luaXQpOworbW9kdWxlX2V4aXQoZXRoZXJoX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXQxNzAwLmMgYi9kcml2ZXJzL25ldC9hdDE3MDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGFiMmI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXQxNzAwLmMKQEAgLTAsMCArMSw5MzkgQEAKKy8qIGF0MTcwMC5jOiBBIG5ldHdvcmsgZGV2aWNlIGRyaXZlciBmb3IgIHRoZSBBbGxpZWQgVGVsZXNpcyBBVDE3MDAuCisKKwlXcml0dGVuIDE5OTMtOTggYnkgRG9uYWxkIEJlY2tlci4KKworCUNvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKwlEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKwlUaGlzIGlzIGEgZGV2aWNlIGRyaXZlciBmb3IgdGhlIEFsbGllZCBUZWxlc2lzIEFUMTcwMCwgYW5kCisgICAgICAgIEZ1aml0c3UgRk1WLTE4MS8xODIvMTgxQS8xODJBLzE4My8xODQvMTgzQS8xODRBLCB3aGljaCBhcmUKKwlzdHJhaWdodC1mb3J3YXJkIEZ1aml0c3UgTUI4Njk2NSBpbXBsZW1lbnRhdGlvbnMuCisKKwlNb2RpZmljYXRpb24gZm9yIEZ1aml0c3UgRk1WLTE4WCBjYXJkcyBpcyBkb25lIGJ5IFl1dGFrYSBUYW1peWEKKwkodGFteUBmbGFiLmZ1aml0c3UuY28uanApLiAKKworICBTb3VyY2VzOgorICAgIFRoZSBGdWppdHN1IE1CODY5NjUgZGF0YXNoZWV0LgorCisJQWZ0ZXIgdGhlIGluaXRpYWwgdmVyc2lvbiBvZiB0aGlzIGRyaXZlciB3YXMgd3JpdHRlbiBHZXJyeSBTYXdraW5zIG9mCisJQVRJIHByb3ZpZGVkIHRoZWlyIEVFUFJPTSBjb25maWd1cmF0aW9uIGNvZGUgaGVhZGVyIGZpbGUuCisgICAgVGhhbmtzIHRvIE5JSUJFIFl1dGFrYSA8Z25paWJlQG1yaS5jby5qcD4gZm9yIGJ1ZyBmaXhlcy4KKworICAgIE1DQSBidXMgKEFUMTcyMCkgc3VwcG9ydCBieSBSZW5lIFNjaG1pdCA8cmVuZUBic3MubHU+CisKKyAgQnVnczoKKwlUaGUgTUI4Njk2NSBoYXMgYSBkZXNpZ24gZmxhdyB0aGF0IG1ha2VzIGFsbCBwcm9iZXMgdW5yZWxpYWJsZS4gIE5vdAorCW9ubHkgaXMgaXQgZGlmZmljdWx0IHRvIGRldGVjdCwgaXQgYWxzbyBtb3ZlcyBhcm91bmQgaW4gSS9PIHNwYWNlIGluCisJcmVzcG9uc2UgdG8gaW5iKClzIGZyb20gb3RoZXIgZGV2aWNlIHByb2JlcyEKKyovCisvKgorCTk5LzAzLzAzICBBbGxpZWQgVGVsZXNpcyBSRTEwMDAgUGx1cyBzdXBwb3J0IGJ5IFQuSGFnYXdhCisJOTkvMTIvMzAJcG9ydCB0byAyLjMuMzUgYnkgSy5UYWthaQorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2EtbGVnYWN5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPQorCSJhdDE3MDAuYzp2MS4xNSA0LzcvOTggIERvbmFsZCBCZWNrZXIgKGJlY2tlckBjZXNkaXMuZ3NmYy5uYXNhLmdvdilcbiI7CisKKyNkZWZpbmUgRFJWX05BTUUgImF0MTcwMCIKKworLyogVHVuYWJsZSBwYXJhbWV0ZXJzLiAqLworCisvKiBXaGVuIHRvIHN3aXRjaCBmcm9tIHRoZSA2NC1lbnRyeSBtdWx0aWNhc3QgZmlsdGVyIHRvIFJ4LWFsbC1tdWx0aWNhc3QuICovCisjZGVmaW5lIE1DX0ZJTFRFUkJSRUFLIDY0CisKKy8qIFRoZXNlIHVudXN1YWwgYWRkcmVzcyBvcmRlcnMgYXJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBDT05GSUcgcmVnaXN0ZXIuICovCisKK3N0YXRpYyBpbnQgZm12MTh4X3Byb2JlX2xpc3RbXSBfX2luaXRkYXRhID0geworCTB4MjIwLCAweDI0MCwgMHgyNjAsIDB4MjgwLCAweDJhMCwgMHgyYzAsIDB4MzAwLCAweDM0MCwgMAorfTsKKworLyoKKyAqCUlTQQorICovCisKK3N0YXRpYyB1bnNpZ25lZCBhdDE3MDBfcHJvYmVfbGlzdFtdIF9faW5pdGRhdGEgPSB7CisJMHgyNjAsIDB4MjgwLCAweDJhMCwgMHgyNDAsIDB4MzQwLCAweDMyMCwgMHgzODAsIDB4MzAwLCAwCit9OworCisvKgorICoJTUNBCisgKi8KKyNpZmRlZiBDT05GSUdfTUNBX0xFR0FDWQorc3RhdGljIGludCBhdDE3MDBfaW9hZGRyX3BhdHRlcm5bXSBfX2luaXRkYXRhID0geworCTB4MDAsIDB4MDQsIDB4MDEsIDB4MDUsIDB4MDIsIDB4MDYsIDB4MDMsIDB4MDcKK307CisKK3N0YXRpYyBpbnQgYXQxNzAwX21jYV9wcm9iZV9saXN0W10gX19pbml0ZGF0YSA9IHsKKwkweDQwMCwgMHgxNDAwLCAweDI0MDAsIDB4MzQwMCwgMHg0NDAwLCAweDU0MDAsIDB4NjQwMCwgMHg3NDAwLCAwCit9OworCitzdGF0aWMgaW50IGF0MTcwMF9pcnFfcGF0dGVybltdIF9faW5pdGRhdGEgPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgzMCwgMHg3MCwgMHhiMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweGYwLCAweDM0LCAweDc0LCAweGI0LCAweDAwLCAweDAwLCAweGY0LCAweDAwCit9OworI2VuZGlmCisKKy8qIHVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sID4yIGZvciBkZWJ1ZyAqLworI2lmbmRlZiBORVRfREVCVUcKKyNkZWZpbmUgTkVUX0RFQlVHIDEKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGludCBuZXRfZGVidWcgPSBORVRfREVCVUc7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1Y2hhcjsKKworLyogSW5mb3JtYXRpb24gdGhhdCBuZWVkIHRvIGJlIGtlcHQgZm9yIGVhY2ggYm9hcmQuICovCitzdHJ1Y3QgbmV0X2xvY2FsIHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzcGlubG9ja190IGxvY2s7CisJdW5zaWduZWQgY2hhciBtY19maWx0ZXJbOF07CisJdWludCBqdW1wZXJlZDoxOwkJCS8qIFNldCBpZmYgdGhlIGJvYXJkIGhhcyBqdW1wZXIgY29uZmlnLiAqLworCXVpbnQgdHhfc3RhcnRlZDoxOwkJCS8qIFBhY2tldHMgYXJlIG9uIHRoZSBUeCBxdWV1ZS4gKi8KKwl1aW50IHR4X3F1ZXVlX3JlYWR5OjE7CQkJLyogVHggcXVldWUgaXMgcmVhZHkgdG8gYmUgc2VudC4gKi8KKwl1aW50IHJ4X3N0YXJ0ZWQ6MTsJCQkvKiBQYWNrZXRzIGFyZSBSeGluZy4gKi8KKwl1Y2hhciB0eF9xdWV1ZTsJCQkJLyogTnVtYmVyIG9mIHBhY2tldCBvbiB0aGUgVHggcXVldWUuICovCisJY2hhciBtY2Ffc2xvdDsJCQkJLyogLTEgbWVhbnMgSVNBICovCisJdXNob3J0IHR4X3F1ZXVlX2xlbjsJCQkvKiBDdXJyZW50IGxlbmd0aCBvZiB0aGUgVHggcXVldWUuICovCit9OworCisKKy8qIE9mZnNldHMgZnJvbSB0aGUgYmFzZSBhZGRyZXNzLiAqLworI2RlZmluZSBTVEFUVVMJCQkwCisjZGVmaW5lIFRYX1NUQVRVUwkJMAorI2RlZmluZSBSWF9TVEFUVVMJCTEKKyNkZWZpbmUgVFhfSU5UUgkJCTIJCS8qIEJpdC1tYXBwZWQgaW50ZXJydXB0IGVuYWJsZSByZWdpc3RlcnMuICovCisjZGVmaW5lIFJYX0lOVFIJCQkzCisjZGVmaW5lIFRYX01PREUJCQk0CisjZGVmaW5lIFJYX01PREUJCQk1CisjZGVmaW5lIENPTkZJR18wCQk2CQkvKiBNaXNjLiBjb25maWd1cmF0aW9uIHNldHRpbmdzLiAqLworI2RlZmluZSBDT05GSUdfMQkJNworLyogUnVuLXRpbWUgcmVnaXN0ZXIgYmFuayAyIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBEQVRBUE9SVAkJOAkJLyogV29yZC13aWRlIERNQSBvciBwcm9ncmFtbWVkLUkvTyBkYXRhcG9ydC4gKi8KKyNkZWZpbmUgVFhfU1RBUlQJCTEwCisjZGVmaW5lIENPTDE2Q05UTAkJMTEJCS8qIENvbnRyb2xsIFJlZyBmb3IgMTYgY29sbGlzaW9ucyAqLworI2RlZmluZSBNT0RFMTMJCQkxMworI2RlZmluZSBSWF9DVFJMCQkJMTQKKy8qIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIG9ubHkgb24gdGhlICc4NjVBL0IgY2hpcHMuICovCisjZGVmaW5lIEVFUFJPTV9DdHJsIAkxNgorI2RlZmluZSBFRVBST01fRGF0YSAJMTcKKyNkZWZpbmUgQ0FSRFNUQVRVUwkxNgkJCS8qIEZNVi0xOHggQ2FyZCBTdGF0dXMgKi8KKyNkZWZpbmUgQ0FSRFNUQVRVUzEJMTcJCQkvKiBGTVYtMTh4IENhcmQgU3RhdHVzICovCisjZGVmaW5lIElPQ09ORklHCQkxOAkJLyogRWl0aGVyIHJlYWQgdGhlIGp1bXBlciwgb3IgbW92ZSB0aGUgSS9PLiAqLworI2RlZmluZSBJT0NPTkZJRzEJCTE5CisjZGVmaW5lCVNBUFJPTQkJCTIwCQkvKiBUaGUgc3RhdGlvbiBhZGRyZXNzIFBST00sIGlmIG5vIEVFUFJPTS4gKi8KKyNkZWZpbmUgTU9ERTI0CQkJMjQKKyNkZWZpbmUgUkVTRVQJCQkzMQkJLyogV3JpdGUgdG8gcmVzZXQgc29tZSBwYXJ0cyBvZiB0aGUgY2hpcC4gKi8KKyNkZWZpbmUgQVQxNzAwX0lPX0VYVEVOVAkzMgorI2RlZmluZSBQT1JUX09GRlNFVChvKSAobykKKworCisjZGVmaW5lIFRYX1RJTUVPVVQJCTEwCisKKworLyogSW5kZXggdG8gZnVuY3Rpb25zLCBhcyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLworCitzdGF0aWMgaW50IGF0MTcwMF9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcik7CitzdGF0aWMgaW50IHJlYWRfZWVwcm9tKGxvbmcgaW9hZGRyLCBpbnQgbG9jYXRpb24pOworc3RhdGljIGludCBuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJbmV0X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IG5ldF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBuZXRfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG5ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbmV0X3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisMCisjaWZkZWYgQ09ORklHX01DQV9MRUdBQ1kKK3N0cnVjdCBhdDE3MjBfbWNhX2FkYXB0ZXJzX3N0cnVjdCB7CisJY2hhciogbmFtZTsKKwlpbnQgaWQ7Cit9OworLyogckVuRSA6IG1heWJlIHRoZXJlIGFyZSBvdGhlcnMgSSBkb24ndCBrbm93IG9mZi4uLiAqLworCitzdGF0aWMgc3RydWN0IGF0MTcyMF9tY2FfYWRhcHRlcnNfc3RydWN0IGF0MTcyMF9tY2FfYWRhcHRlcnNbXSBfX2luaXRkYXRhID0geworCXsgIkFsbGllZCBUZWxlc3lzIEFUMTcyMEFUIiwJMHg2NDEwIH0sCisJeyAiQWxsaWVkIFRlbGVzeXMgQVQxNzIwQlQiLCAJMHg2NDEzIH0sCisJeyAiQWxsaWVkIFRlbGVzeXMgQVQxNzIwVCIsCTB4NjQxNiB9LAorCXsgTlVMTCwgMCB9LAorfTsKKyNlbmRpZgorCisvKiBDaGVjayBmb3IgYSBuZXR3b3JrIGFkYXB0b3Igb2YgdGhpcyB0eXBlLCBhbmQgcmV0dXJuICcwJyBpZmYgb25lIGV4aXN0cy4KKyAgIElmIGRldi0+YmFzZV9hZGRyID09IDAsIHByb2JlIGFsbCBsaWtlbHkgbG9jYXRpb25zLgorICAgSWYgZGV2LT5iYXNlX2FkZHIgPT0gMSwgYWx3YXlzIHJldHVybiBmYWlsdXJlLgorICAgSWYgZGV2LT5iYXNlX2FkZHIgPT0gMiwgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBkZXZpY2UgYW5kIHJldHVybiBzdWNjZXNzCisgICAoZGV0YWNoYWJsZSBkZXZpY2VzIG9ubHkpLgorICAgKi8KKworc3RhdGljIGludCBpbyA9IDB4MjYwOworCitzdGF0aWMgaW50IGlycTsKKworc3RhdGljIHZvaWQgY2xlYW51cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisjaWZkZWYgQ09ORklHX01DQV9MRUdBQ1kKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaWYgKGxwLT5tY2Ffc2xvdCA+PSAwKQorCQltY2FfbWFya19hc191bnVzZWQobHAtPm1jYV9zbG90KTsKKyNlbmRpZgkKKwlmcmVlX2lycShkZXYtPmlycSwgTlVMTCk7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEFUMTcwMF9JT19FWFRFTlQpOworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBhdDE3MDBfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisJdW5zaWduZWQgKnBvcnQ7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwkJaW8gPSBkZXYtPmJhc2VfYWRkcjsKKwkJaXJxID0gZGV2LT5pcnE7CisJfSBlbHNlIHsKKwkJZGV2LT5iYXNlX2FkZHIgPSBpbzsKKwkJZGV2LT5pcnEgPSBpcnE7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaWYgKGlvID4gMHgxZmYpIHsJLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLworCQllcnIgPSBhdDE3MDBfcHJvYmUxKGRldiwgaW8pOworCX0gZWxzZSBpZiAoaW8gIT0gMCkgewkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCWVyciA9IC1FTlhJTzsKKwl9IGVsc2UgeworCQlmb3IgKHBvcnQgPSBhdDE3MDBfcHJvYmVfbGlzdDsgKnBvcnQ7IHBvcnQrKykgeworCQkJaWYgKGF0MTcwMF9wcm9iZTEoZGV2LCAqcG9ydCkgPT0gMCkKKwkJCQlicmVhazsKKwkJCWRldi0+aXJxID0gaXJxOworCQl9CisJCWlmICghKnBvcnQpCisJCQllcnIgPSAtRU5PREVWOworCX0KKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJY2xlYW51cF9jYXJkKGRldik7CitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCisvKiBUaGUgRnVqaXRzdSBkYXRhc2hlZXQgc3VnZ2VzdHMgdGhhdCB0aGUgTklDIGJlIHByb2JlZCBmb3IgYnkgY2hlY2tpbmcgaXRzCisgICAic2lnbmF0dXJlIiwgdGhlIGRlZmF1bHQgYml0IHBhdHRlcm4gYWZ0ZXIgYSByZXNldC4gIFRoaXMgKmRvZXNuJ3QqIHdvcmsgLS0KKyAgIHRoZXJlIGlzIG5vIHdheSB0byByZXNldCB0aGUgYnVzIGludGVyZmFjZSB3aXRob3V0IGEgY29tcGxldGUgcG93ZXItY3ljbGUhCisKKyAgIEl0IHR1cm5zIG91dCB0aGF0IEFUSSBjYW1lIHRvIHRoZSBzYW1lIGNvbmNsdXNpb24gSSBkaWQ6IHRoZSBvbmx5IHRoaW5nCisgICB0aGF0IGNhbiBiZSBkb25lIGlzIGNoZWNraW5nIGEgZmV3IGJpdHMgYW5kIHRoZW4gZGl2aW5nIHJpZ2h0IGludG8gYW4KKyAgIEVFUFJPTSByZWFkLiAqLworCitzdGF0aWMgaW50IF9faW5pdCBhdDE3MDBfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpCit7CisJY2hhciBmbXZfaXJxbWFwWzRdID0gezMsIDcsIDEwLCAxNX07CisJY2hhciBmbXZfaXJxbWFwX3BucFs4XSA9IHszLCA0LCA1LCA3LCA5LCAxMCwgMTEsIDE1fTsKKwljaGFyIGF0MTcwMF9pcnFtYXBbOF0gPSB7MywgNCwgNSwgOSwgMTAsIDExLCAxNCwgMTV9OworCXVuc2lnbmVkIGludCBpLCBpcnEsIGlzX2ZtdjE4eCA9IDAsIGlzX2F0MTcwMCA9IDA7CisJaW50IHNsb3QsIHJldCA9IC1FTk9ERVY7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIEFUMTcwMF9JT19FWFRFTlQsIERSVl9OQU1FKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIFJlc2V0dGluZyB0aGUgY2hpcCBkb2Vzbid0IHJlc2V0IHRoZSBJU0EgaW50ZXJmYWNlLCBzbyBkb24ndCBib3RoZXIuCisJICAgVGhhdCBtZWFucyB3ZSBoYXZlIHRvIGJlIGNhcmVmdWwgd2l0aCB0aGUgcmVnaXN0ZXIgdmFsdWVzIHdlIHByb2JlCisJICAgZm9yLgorCSAqLworI2lmZGVmIG5vdGRlZgorCXByaW50aygiYXQxNzAwIHByb2JlIGF0ICUjeCwgZWVwcm9tIGlzICU0LjR4ICU0LjR4ICU0LjR4IGN0cmwgJTQuNHguXG4iLAorCQkgICBpb2FkZHIsIHJlYWRfZWVwcm9tKGlvYWRkciwgNCksIHJlYWRfZWVwcm9tKGlvYWRkciwgNSksCisJCSAgIHJlYWRfZWVwcm9tKGlvYWRkciwgNiksIGludyhpb2FkZHIgKyBFRVBST01fQ3RybCkpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUNBX0xFR0FDWQorCS8qIHJFbkUgKHJlbmVAYnNzLmx1KTogZ290IHRoaXMgZnJvbSAzYzUwOSBkcml2ZXIgc291cmNlICwgYWRhcHRlZCBmb3IgQVQxNzIwICovCisKKyAgICAvKiBCYXNlZCBvbiBFcmlrIE55Z3JlbidzIChueWdyZW5AbWl0LmVkdSkgM2M1MjkgcGF0Y2gsIGhlYXZpbHkKKwltb2RpZmllZCBieSBDaHJpcyBCZWF1cmVnYXJkIChjcGJlYXVyZUBjc2NsdWIudXdhdGVybG9vLmNhKQorCXRvIHN1cHBvcnQgc3RhbmRhcmQgTUNBIHByb2JpbmcuICovCisKKwkvKiByZWRvbmUgZm9yIG11bHRpLWNhcmQgZGV0ZWN0aW9uIGJ5IFpQIEd1ICh6cGdAY2FzdGxlLm5ldCkgKi8KKwkvKiBub3cgd29ya3MgYXMgYSBtb2R1bGUgKi8KKworCWlmIChNQ0FfYnVzKSB7CisJCWludCBqOworCQlpbnQgbF9pOworCQl1X2NoYXIgcG9zMywgcG9zNDsKKworCQlmb3IgKGogPSAwOyBhdDE3MjBfbWNhX2FkYXB0ZXJzW2pdLm5hbWUgIT0gTlVMTDsgaiArKykgeworCQkJc2xvdCA9IDA7CisJCQl3aGlsZSAoc2xvdCAhPSBNQ0FfTk9URk9VTkQpIHsKKwkJCQkKKwkJCQlzbG90ID0gbWNhX2ZpbmRfdW51c2VkX2FkYXB0ZXIoIGF0MTcyMF9tY2FfYWRhcHRlcnNbal0uaWQsIHNsb3QgKTsKKwkJCQlpZiAoc2xvdCA9PSBNQ0FfTk9URk9VTkQpIGJyZWFrOworCisJCQkJLyogaWYgd2UgZ2V0IHRoaXMgZmFyLCBhbiBhZGFwdGVyIGhhcyBiZWVuIGRldGVjdGVkIGFuZCBpcworCQkJCWVuYWJsZWQgKi8KKworCQkJCXBvczMgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKCBzbG90LCAzICk7CisJCQkJcG9zNCA9IG1jYV9yZWFkX3N0b3JlZF9wb3MoIHNsb3QsIDQgKTsKKworCQkJCWZvciAobF9pID0gMDsgbF9pIDwgMHgwOTsgbF9pKyspCisJCQkJCWlmICgoIHBvczMgJiAweDA3KSA9PSBhdDE3MDBfaW9hZGRyX3BhdHRlcm5bbF9pXSkKKwkJCQkJCWJyZWFrOworCQkJCWlvYWRkciA9IGF0MTcwMF9tY2FfcHJvYmVfbGlzdFtsX2ldOworCQkJCQorCQkJCWZvciAoaXJxID0gMDsgaXJxIDwgMHgxMDsgaXJxKyspCisJCQkJCWlmICgoKCgocG9zND4+NCkgJiAweDBmKSB8IChwb3MzICYgMHhmMCkpICYgMHhmZikgPT0gYXQxNzAwX2lycV9wYXR0ZXJuW2lycV0pCisJCQkJCQlicmVhazsKKworCQkJCQkvKiBwcm9iaW5nIGZvciBhIGNhcmQgYXQgYSBwYXJ0aWN1bGFyIElPL0lSUSAqLworCQkJCWlmICgoZGV2LT5pcnEgJiYgZGV2LT5pcnEgIT0gaXJxKSB8fAorCQkJCSAgICAoZGV2LT5iYXNlX2FkZHIgJiYgZGV2LT5iYXNlX2FkZHIgIT0gaW9hZGRyKSkgeworCQkJCSAgCXNsb3QrKzsJCS8qIHByb2JpbmcgbmV4dCBzbG90ICovCisJCQkJICAJY29udGludWU7CisJCQkJfQorCisJCQkJZGV2LT5pcnEgPSBpcnE7CisJCQkJCisJCQkJLyogY2xhaW0gdGhlIHNsb3QgKi8KKwkJCQltY2Ffc2V0X2FkYXB0ZXJfbmFtZSggc2xvdCwgYXQxNzIwX21jYV9hZGFwdGVyc1tqXS5uYW1lICk7CisJCQkJbWNhX21hcmtfYXNfdXNlZChzbG90KTsKKworCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCX0KKwkJLyogaWYgd2UgZ2V0IGhlcmUsIHdlIGRpZG4ndCBmaW5kIGFuIE1DQSBhZGFwdGVyIC0gdHJ5IElTQSAqLworCX0KKyNlbmRpZgorCXNsb3QgPSAtMTsKKwkvKiBXZSBtdXN0IGNoZWNrIGZvciB0aGUgRUVQUk9NLWNvbmZpZyBib2FyZHMgZmlyc3QsIGVsc2UgYWNjZXNzaW5nCisJICAgSU9DT05GSUcwIHdpbGwgbW92ZSB0aGUgYm9hcmQhICovCisJaWYgKGF0MTcwMF9wcm9iZV9saXN0W2luYihpb2FkZHIgKyBJT0NPTkZJRzEpICYgMHgwN10gPT0gaW9hZGRyCisJCSYmIHJlYWRfZWVwcm9tKGlvYWRkciwgNCkgPT0gMHgwMDAwCisJCSYmIChyZWFkX2VlcHJvbShpb2FkZHIsIDUpICYgMHhmZjAwKSA9PSAweEY0MDApCisJCWlzX2F0MTcwMCA9IDE7CisJZWxzZSBpZiAoaW5iKGlvYWRkciAgICsgU0FQUk9NICAgICkgPT0gMHgwMAorCQkmJiBpbmIoaW9hZGRyICsgU0FQUk9NICsgMSkgPT0gMHgwMAorCQkmJiBpbmIoaW9hZGRyICsgU0FQUk9NICsgMikgPT0gMHgwZSkKKwkJaXNfZm12MTh4ID0gMTsKKwllbHNlIHsKKwkJZ290byBlcnJfb3V0OworCX0KKwkJCQorI2lmZGVmIENPTkZJR19NQ0FfTEVHQUNZCitmb3VuZDoKKyNlbmRpZgorCisJCS8qIFJlc2V0IHRoZSBpbnRlcm5hbCBzdGF0ZSBtYWNoaW5lcy4gKi8KKwlvdXRiKDAsIGlvYWRkciArIFJFU0VUKTsKKworCWlmIChpc19hdDE3MDApIHsKKwkJaXJxID0gYXQxNzAwX2lycW1hcFsocmVhZF9lZXByb20oaW9hZGRyLCAxMikmMHgwNCkKKwkJCQkJCSAgIHwgKHJlYWRfZWVwcm9tKGlvYWRkciwgMCk+PjE0KV07CisJfSBlbHNlIHsKKwkJLyogQ2hlY2sgUG5QIG1vZGUgZm9yIEZNVi0xODMvMTg0LzE4M0EvMTg0QS4gKi8KKwkJLyogVGhpcyBQblAgcm91dGluZSBpcyB2ZXJ5IHBvb3IuIElPIGFuZCBJUlEgc2hvdWxkIGJlIGtub3duLiAqLworCQlpZiAoaW5iKGlvYWRkciArIENBUkRTVEFUVVMxKSAmIDB4MjApIHsKKwkJCWlycSA9IGRldi0+aXJxOworCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJCWlmIChpcnEgPT0gZm12X2lycW1hcF9wbnBbaV0pCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGkgPT0gOCkgeworCQkJCWdvdG8gZXJyX21jYTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChmbXYxOHhfcHJvYmVfbGlzdFtpbmIoaW9hZGRyICsgSU9DT05GSUcpICYgMHgwN10gIT0gaW9hZGRyKQorCQkJCWdvdG8gZXJyX21jYTsKKwkJCWlycSA9IGZtdl9pcnFtYXBbKGluYihpb2FkZHIgKyBJT0NPTkZJRyk+PjYpICYgMHgwM107CisJCX0KKwl9CisKKwlwcmludGsoIiVzOiAlcyBmb3VuZCBhdCAlIzN4LCBJUlEgJWQsIGFkZHJlc3MgIiwgZGV2LT5uYW1lLAorCQkgICBpc19hdDE3MDAgPyAiQVQxNzAwIiA6ICJGTVYtMThYIiwgaW9hZGRyLCBpcnEpOworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJZGV2LT5pcnEgPSBpcnE7CisKKwlpZiAoaXNfYXQxNzAwKSB7CisJCWZvcihpID0gMDsgaSA8IDM7IGkrKykgeworCQkJdW5zaWduZWQgc2hvcnQgZWVwcm9tX3ZhbCA9IHJlYWRfZWVwcm9tKGlvYWRkciwgNCtpKTsKKwkJCXByaW50aygiJTA0eCIsIGVlcHJvbV92YWwpOworCQkJKCh1bnNpZ25lZCBzaG9ydCAqKWRldi0+ZGV2X2FkZHIpW2ldID0gbnRvaHMoZWVwcm9tX3ZhbCk7CisJCX0KKwl9IGVsc2UgeworCQlmb3IoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJCXVuc2lnbmVkIGNoYXIgdmFsID0gaW5iKGlvYWRkciArIFNBUFJPTSArIGkpOworCQkJcHJpbnRrKCIlMDJ4IiwgdmFsKTsKKwkJCWRldi0+ZGV2X2FkZHJbaV0gPSB2YWw7CisJCX0KKwl9CisKKwkvKiBUaGUgRUVQUk9NIHdvcmQgMTIgYml0IDB4MDQwMCBtZWFucyB1c2UgcmVndWxhciAxMDAgb2htIDEwYmFzZVQgc2lnbmFscywKKwkgICByYXRoZXIgdGhhbiAxNTAgb2htIHNoaWVsZGVkIHR3aXN0ZWQgcGFpciBjb21wZW5zYXRpb24uCisJICAgMHgwMDAwID09IGF1dG8tc2Vuc2UgdGhlIGludGVyZmFjZQorCSAgIDB4MDgwMCA9PSB1c2UgVFAgaW50ZXJmYWNlCisJICAgMHgxODAwID09IHVzZSBjb2F4IGludGVyZmFjZQorCSAgICovCisJeworCQljb25zdCBjaGFyICpwb3J0dHlwZVtdID0geyJhdXRvLXNlbnNlIiwgIjEwYmFzZVQiLCAiYXV0by1zZW5zZSIsICIxMGJhc2UyIn07CisJCWlmIChpc19hdDE3MDApIHsKKwkJCXVzaG9ydCBzZXR1cF92YWx1ZSA9IHJlYWRfZWVwcm9tKGlvYWRkciwgMTIpOworCQkJZGV2LT5pZl9wb3J0ID0gc2V0dXBfdmFsdWUgPj4gODsKKwkJfSBlbHNlIHsKKwkJCXVzaG9ydCBzZXR1cF92YWx1ZSA9IGluYihpb2FkZHIgKyBDQVJEU1RBVFVTKTsKKwkJCXN3aXRjaCAoc2V0dXBfdmFsdWUgJiAweDA3KSB7CisJCQljYXNlIDB4MDE6IC8qIDEwYmFzZTUgKi8KKwkJCWNhc2UgMHgwMjogLyogMTBiYXNlMiAqLworCQkJCWRldi0+aWZfcG9ydCA9IDB4MTg7IGJyZWFrOworCQkJY2FzZSAweDA0OiAvKiAxMGJhc2VUICovCisJCQkJZGV2LT5pZl9wb3J0ID0gMHgwODsgYnJlYWs7CisJCQlkZWZhdWx0OiAgIC8qIGF1dG8tc2Vuc2UgKi8KKwkJCQlkZXYtPmlmX3BvcnQgPSAweDAwOyBicmVhazsKKwkJCX0KKwkJfQorCQlwcmludGsoIiAlcyBpbnRlcmZhY2UuXG4iLCBwb3J0dHlwZVsoZGV2LT5pZl9wb3J0Pj4zKSAmIDNdKTsKKwl9CisKKwkvKiBTZXQgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMCB0byAzMksgMTAwbnMuIGJ5dGUtd2lkZSBtZW1vcnksIDE2IGJpdAorCSAgIGJ1cyBhY2Nlc3MsIHR3byA0SyBUeCBxdWV1ZXMsIGFuZCBkaXNhYmxlZCBUeCBhbmQgUnguICovCisJb3V0YigweGRhLCBpb2FkZHIgKyBDT05GSUdfMCk7CisKKwkvKiBTZXQgdGhlIHN0YXRpb24gYWRkcmVzcyBpbiBiYW5rIHplcm8uICovCisJb3V0YigweDAwLCBpb2FkZHIgKyBDT05GSUdfMSk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJb3V0YihkZXYtPmRldl9hZGRyW2ldLCBpb2FkZHIgKyBQT1JUX09GRlNFVCg4ICsgaSkpOworCisJLyogU3dpdGNoIHRvIGJhbmsgMSBhbmQgc2V0IHRoZSBtdWx0aWNhc3QgdGFibGUgdG8gYWNjZXB0IG5vbmUuICovCisJb3V0YigweDA0LCBpb2FkZHIgKyBDT05GSUdfMSk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJb3V0YigweDAwLCBpb2FkZHIgKyBQT1JUX09GRlNFVCg4ICsgaSkpOworCisKKwkvKiBTd2l0Y2ggdG8gYmFuayAyICovCisJLyogTG9jayBvdXIgSS9PIGFkZHJlc3MsIGFuZCBzZXQgbWFudWFsIHByb2Nlc3NpbmcgbW9kZSBmb3IgMTYgY29sbGlzaW9ucy4gKi8KKwlvdXRiKDB4MDgsIGlvYWRkciArIENPTkZJR18xKTsKKwlvdXRiKGRldi0+aWZfcG9ydCwgaW9hZGRyICsgTU9ERTEzKTsKKwlvdXRiKDB4MDAsIGlvYWRkciArIENPTDE2Q05UTCk7CisKKwlpZiAobmV0X2RlYnVnKQorCQlwcmludGsodmVyc2lvbik7CisKKwltZW1zZXQobHAsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisKKwlkZXYtPm9wZW4JCT0gbmV0X29wZW47CisJZGV2LT5zdG9wCQk9IG5ldF9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IG5ldF9zZW5kX3BhY2tldDsKKwlkZXYtPmdldF9zdGF0cwk9IG5ldF9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGU7CisJZGV2LT50eF90aW1lb3V0ID0gbmV0X3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisKKwlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCisJbHAtPmp1bXBlcmVkID0gaXNfZm12MTh4OworCWxwLT5tY2Ffc2xvdCA9IHNsb3Q7CisJLyogU25hcmYgdGhlIGludGVycnVwdCB2ZWN0b3Igbm93LiAqLworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgJm5ldF9pbnRlcnJ1cHQsIDAsIERSVl9OQU1FLCBkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrICgiICBBVDE3MDAgYXQgJSMzeCBpcyB1bnVzYWJsZSBkdWUgdG8gYSBjb25mbGljdCBvbiIKKwkJCQkiSVJRICVkLlxuIiwgaW9hZGRyLCBpcnEpOworCQlnb3RvIGVycl9tY2E7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9tY2E6CisjaWZkZWYgQ09ORklHX01DQV9MRUdBQ1kKKwlpZiAoc2xvdCA+PSAwKQorCQltY2FfbWFya19hc191bnVzZWQoc2xvdCk7CisjZW5kaWYKK2Vycl9vdXQ6CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBBVDE3MDBfSU9fRVhURU5UKTsKKwlyZXR1cm4gcmV0OworfQorCisMCisvKiAgRUVQUk9NX0N0cmwgYml0cy4gKi8KKyNkZWZpbmUgRUVfU0hJRlRfQ0xLCTB4NDAJLyogRUVQUk9NIHNoaWZ0IGNsb2NrLCBpbiByZWcuIDE2LiAqLworI2RlZmluZSBFRV9DUwkJCTB4MjAJLyogRUVQUk9NIGNoaXAgc2VsZWN0LCBpbiByZWcuIDE2LiAqLworI2RlZmluZSBFRV9EQVRBX1dSSVRFCTB4ODAJLyogRUVQUk9NIGNoaXAgZGF0YSBpbiwgaW4gcmVnLiAxNy4gKi8KKyNkZWZpbmUgRUVfREFUQV9SRUFECTB4ODAJLyogRUVQUk9NIGNoaXAgZGF0YSBvdXQsIGluIHJlZy4gMTcuICovCisKKy8qIFRoZSBFRVBST00gY29tbWFuZHMgaW5jbHVkZSB0aGUgYWx3YXktc2V0IGxlYWRpbmcgYml0LiAqLworI2RlZmluZSBFRV9XUklURV9DTUQJKDUgPDwgNikKKyNkZWZpbmUgRUVfUkVBRF9DTUQJCSg2IDw8IDYpCisjZGVmaW5lIEVFX0VSQVNFX0NNRAkoNyA8PCA2KQorCitzdGF0aWMgaW50IF9faW5pdCByZWFkX2VlcHJvbShsb25nIGlvYWRkciwgaW50IGxvY2F0aW9uKQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0IHJldHZhbCA9IDA7CisJbG9uZyBlZV9hZGRyID0gaW9hZGRyICsgRUVQUk9NX0N0cmw7CisJbG9uZyBlZV9kYWRkciA9IGlvYWRkciArIEVFUFJPTV9EYXRhOworCWludCByZWFkX2NtZCA9IGxvY2F0aW9uIHwgRUVfUkVBRF9DTUQ7CisKKwkvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDk7IGkgPj0gMDsgaS0tKSB7CisJCXNob3J0IGRhdGF2YWwgPSAocmVhZF9jbWQgJiAoMSA8PCBpKSkgPyBFRV9EQVRBX1dSSVRFIDogMDsKKwkJb3V0YihFRV9DUywgZWVfYWRkcik7CisJCW91dGIoZGF0YXZhbCwgZWVfZGFkZHIpOworCQlvdXRiKEVFX0NTIHwgRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsJLyogRUVQUk9NIGNsb2NrIHRpY2suICovCisJfQorCW91dGIoRUVfREFUQV9XUklURSwgZWVfZGFkZHIpOworCWZvciAoaSA9IDE2OyBpID4gMDsgaS0tKSB7CisJCW91dGIoRUVfQ1MsIGVlX2FkZHIpOworCQlvdXRiKEVFX0NTIHwgRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW5iKGVlX2RhZGRyKSAmIEVFX0RBVEFfUkVBRCkgPyAxIDogMCk7CisJfQorCisJLyogVGVybWluYXRlIHRoZSBFRVBST00gYWNjZXNzLiAqLworCW91dGIoRUVfQ1MsIGVlX2FkZHIpOworCW91dGIoRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsKKwlvdXRiKDAsIGVlX2FkZHIpOworCXJldHVybiByZXR2YWw7Cit9CisKKwwKKworc3RhdGljIGludCBuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwkvKiBTZXQgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMCB0byAzMksgMTAwbnMuIGJ5dGUtd2lkZSBtZW1vcnksIDE2IGJpdAorCSAgIGJ1cyBhY2Nlc3MsIGFuZCB0d28gNEsgVHggcXVldWVzLiAqLworCW91dGIoMHg1YSwgaW9hZGRyICsgQ09ORklHXzApOworCisJLyogUG93ZXJ1cCwgc3dpdGNoIHRvIHJlZ2lzdGVyIGJhbmsgMiwgYW5kIGVuYWJsZSB0aGUgUnggYW5kIFR4LiAqLworCW91dGIoMHhlOCwgaW9hZGRyICsgQ09ORklHXzEpOworCisJbHAtPnR4X3N0YXJ0ZWQgPSAwOworCWxwLT50eF9xdWV1ZV9yZWFkeSA9IDE7CisJbHAtPnJ4X3N0YXJ0ZWQgPSAwOworCWxwLT50eF9xdWV1ZSA9IDA7CisJbHAtPnR4X3F1ZXVlX2xlbiA9IDA7CisKKwkvKiBUdXJuIG9uIGhhcmR3YXJlIFR4IGFuZCBSeCBpbnRlcnJ1cHRzLiAqLworCW91dGIoMHg4MiwgaW9hZGRyICsgVFhfSU5UUik7CisJb3V0YigweDgxLCBpb2FkZHIgKyBSWF9JTlRSKTsKKworCS8qIEVuYWJsZSB0aGUgSVJRIG9uIGJvYXJkcyBvZiBmbXYxOHggaXQgaXMgZmVhc2libGUuICovCisJaWYgKGxwLT5qdW1wZXJlZCkgeworCQlvdXRiKDB4ODAsIGlvYWRkciArIElPQ09ORklHMSk7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmV0X3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCXByaW50ayAoIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQgd2l0aCBzdGF0dXMgJTA0eCwgJXM/XG4iLCBkZXYtPm5hbWUsCisJCWludyAoaW9hZGRyICsgU1RBVFVTKSwgaW5iIChpb2FkZHIgKyBUWF9TVEFUVVMpICYgMHg4MAorCQk/ICJJUlEgY29uZmxpY3QiIDogIm5ldHdvcmsgY2FibGUgcHJvYmxlbSIpOworCXByaW50ayAoIiVzOiB0aW1lb3V0IHJlZ2lzdGVyczogJTA0eCAlMDR4ICUwNHggJTA0eCAlMDR4ICUwNHggJTA0eCAlMDR4LlxuIiwKKwkgZGV2LT5uYW1lLCBpbncoaW9hZGRyICsgVFhfU1RBVFVTKSwgaW53KGlvYWRkciArIFRYX0lOVFIpLCBpbncoaW9hZGRyICsgVFhfTU9ERSksCisJCWludyhpb2FkZHIgKyBDT05GSUdfMCksIGludyhpb2FkZHIgKyBEQVRBUE9SVCksIGludyhpb2FkZHIgKyBUWF9TVEFSVCksCisJCWludyhpb2FkZHIgKyBNT0RFMTMgLSAxKSwgaW53KGlvYWRkciArIFJYX0NUUkwpKTsKKwlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJLyogVG9EbzogV2Ugc2hvdWxkIHRyeSB0byByZXN0YXJ0IHRoZSBhZGFwdG9yLi4uICovCisJb3V0dygweGZmZmYsIGlvYWRkciArIE1PREUyNCk7CisJb3V0dyAoMHhmZmZmLCBpb2FkZHIgKyBUWF9TVEFUVVMpOworCW91dGIgKDB4NWEsIGlvYWRkciArIENPTkZJR18wKTsKKwlvdXRiICgweGU4LCBpb2FkZHIgKyBDT05GSUdfMSk7CisJb3V0dyAoMHg4MTgyLCBpb2FkZHIgKyBUWF9JTlRSKTsKKwlvdXRiICgweDAwLCBpb2FkZHIgKyBUWF9TVEFSVCk7CisJb3V0YiAoMHgwMywgaW9hZGRyICsgQ09MMTZDTlRMKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJbHAtPnR4X3N0YXJ0ZWQgPSAwOworCWxwLT50eF9xdWV1ZV9yZWFkeSA9IDE7CisJbHAtPnJ4X3N0YXJ0ZWQgPSAwOworCWxwLT50eF9xdWV1ZSA9IDA7CisJbHAtPnR4X3F1ZXVlX2xlbiA9IDA7CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKworc3RhdGljIGludCBuZXRfc2VuZF9wYWNrZXQgKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzaG9ydCBsZW5ndGggPSBFVEhfWkxFTiA8IHNrYi0+bGVuID8gc2tiLT5sZW4gOiBFVEhfWkxFTjsKKwlzaG9ydCBsZW4gPSBza2ItPmxlbjsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSBza2ItPmRhdGE7CisJc3RhdGljIHU4IHBhZFtFVEhfWkxFTl07CisKKwluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCisJLyogV2UgbWF5IG5vdCBzdGFydCB0cmFuc21pdHRpbmcgdW5sZXNzIHdlIGZpbmlzaCB0cmFuc2ZlcnJpbmcKKwkgICBhIHBhY2tldCBpbnRvIHRoZSBUeCBxdWV1ZS4gRHVyaW5nIGV4ZWN1dGluZyB0aGUgZm9sbG93aW5nCisJICAgY29kZXMgd2UgcG9zc2libHkgY2F0Y2ggYSBUeCBpbnRlcnJ1cHQuIFRodXMgd2UgZmxhZyBvZmYKKwkgICB0eF9xdWV1ZV9yZWFkeSwgc28gdGhhdCB3ZSBwcmV2ZW50IHRoZSBpbnRlcnJ1cHQgcm91dGluZQorCSAgIChuZXRfaW50ZXJydXB0KSB0byBzdGFydCB0cmFuc21pdHRpbmcuICovCisJbHAtPnR4X3F1ZXVlX3JlYWR5ID0gMDsKKwl7CisJCW91dHcgKGxlbmd0aCwgaW9hZGRyICsgREFUQVBPUlQpOworCQkvKiBQYWNrZXQgZGF0YSAqLworCQlvdXRzdyAoaW9hZGRyICsgREFUQVBPUlQsIGJ1ZiwgbGVuID4+IDEpOworCQkvKiBDaGVjayBmb3IgZHJpYmJsZSBieXRlICovCisJCWlmIChsZW4gJiAxKSB7CisJCQlvdXR3KHNrYi0+ZGF0YVtza2ItPmxlbi0xXSwgaW9hZGRyICsgREFUQVBPUlQpOworCQkJbGVuKys7CisJCX0KKwkJLyogQ2hlY2sgZm9yIHBhY2tldCBwYWRkaW5nICovCisJCWlmIChsZW5ndGggIT0gc2tiLT5sZW4pCisJCQlvdXRzdyhpb2FkZHIgKyBEQVRBUE9SVCwgcGFkLCAobGVuZ3RoIC0gbGVuICsgMSkgPj4gMSk7CisKKwkJbHAtPnR4X3F1ZXVlKys7CisJCWxwLT50eF9xdWV1ZV9sZW4gKz0gbGVuZ3RoICsgMjsKKwl9CisJbHAtPnR4X3F1ZXVlX3JlYWR5ID0gMTsKKworCWlmIChscC0+dHhfc3RhcnRlZCA9PSAwKSB7CisJCS8qIElmIHRoZSBUeCBpcyBpZGxlLCBhbHdheXMgdHJpZ2dlciBhIHRyYW5zbWl0LiAqLworCQlvdXRiICgweDgwIHwgbHAtPnR4X3F1ZXVlLCBpb2FkZHIgKyBUWF9TVEFSVCk7CisJCWxwLT50eF9xdWV1ZSA9IDA7CisJCWxwLT50eF9xdWV1ZV9sZW4gPSAwOworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJbHAtPnR4X3N0YXJ0ZWQgPSAxOworCQluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKwl9IGVsc2UgaWYgKGxwLT50eF9xdWV1ZV9sZW4gPCA0MDk2IC0gMTUwMikKKwkJLyogWWVzLCB0aGVyZSBpcyByb29tIGZvciBvbmUgbW9yZSBwYWNrZXQuICovCisJCW5ldGlmX3N0YXJ0X3F1ZXVlIChkZXYpOworCWRldl9rZnJlZV9za2IgKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKwwKKy8qIFRoZSB0eXBpY2FsIHdvcmtsb2FkIG9mIHRoZSBkcml2ZXI6CisgICBIYW5kbGUgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGludGVycnVwdHMuICovCitzdGF0aWMgaXJxcmV0dXJuX3QKK25ldF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBuZXRfbG9jYWwgKmxwOworCWludCBpb2FkZHIsIHN0YXR1czsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrICgiYXQxNzAwX2ludGVycnVwdCgpOiBpcnEgJWQgZm9yIHVua25vd24gZGV2aWNlLlxuIiwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwlzcGluX2xvY2sgKCZscC0+bG9jayk7CisJCisJc3RhdHVzID0gaW53KGlvYWRkciArIFRYX1NUQVRVUyk7CisJb3V0dyhzdGF0dXMsIGlvYWRkciArIFRYX1NUQVRVUyk7CisKKwlpZiAobmV0X2RlYnVnID4gNCkKKwkJcHJpbnRrKCIlczogSW50ZXJydXB0IHdpdGggc3RhdHVzICUwNHguXG4iLCBkZXYtPm5hbWUsIHN0YXR1cyk7CisJaWYgKGxwLT5yeF9zdGFydGVkID09IDAgJiYKKwkgICAgKHN0YXR1cyAmIDB4ZmYwMCB8fCAoaW5iKGlvYWRkciArIFJYX01PREUpICYgMHg0MCkgPT0gMCkpIHsKKwkJLyogR290IGEgcGFja2V0KHMpLgorCQkgICBXZSBjYW5ub3QgZXhlY3V0ZSBuZXRfcnggbW9yZSB0aGFuIG9uY2UgYXQgdGhlIHNhbWUgdGltZSBmb3IKKwkJICAgdGhlIHNhbWUgZGV2aWNlLiBEdXJpbmcgZXhlY3V0aW5nIG5ldF9yeCwgd2UgcG9zc2libHkgY2F0Y2ggYQorCQkgICBUeCBpbnRlcnJ1cHQuIFRodXMgd2UgZmxhZyBvbiByeF9zdGFydGVkLCBzbyB0aGF0IHdlIHByZXZlbnQKKwkJICAgdGhlIGludGVycnVwdCByb3V0aW5lIChuZXRfaW50ZXJydXB0KSB0byBkaXZlIGludG8gbmV0X3J4CisJCSAgIGFnYWluLiAqLworCQloYW5kbGVkID0gMTsKKwkJbHAtPnJ4X3N0YXJ0ZWQgPSAxOworCQlvdXRiKDB4MDAsIGlvYWRkciArIFJYX0lOVFIpOwkvKiBEaXNhYmxlIFJYIGludHIuICovCisJCW5ldF9yeChkZXYpOworCQlvdXRiKDB4ODEsIGlvYWRkciArIFJYX0lOVFIpOwkvKiBFbmFibGUgIFJYIGludHIuICovCisJCWxwLT5yeF9zdGFydGVkID0gMDsKKwl9CisJaWYgKHN0YXR1cyAmIDB4MDBmZikgeworCQloYW5kbGVkID0gMTsKKwkJaWYgKHN0YXR1cyAmIDB4MDIpIHsKKwkJCS8qIE1vcmUgdGhhbiAxNiBjb2xsaXNpb25zIG9jY3VycmVkICovCisJCQlpZiAobmV0X2RlYnVnID4gNCkKKwkJCQlwcmludGsoIiVzOiAxNiBDb2xsaXNpb24gb2NjdXIgZHVyaW5nIFR4aW5nLlxuIiwgZGV2LT5uYW1lKTsKKwkJCS8qIENhbmNlbCBzZW5kaW5nIGEgcGFja2V0LiAqLworCQkJb3V0YigweDAzLCBpb2FkZHIgKyBDT0wxNkNOVEwpOworCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJfQorCQlpZiAoc3RhdHVzICYgMHg4MikgeworCQkJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCS8qIFRoZSBUeCBxdWV1ZSBoYXMgYW55IHBhY2tldHMgYW5kIGlzIG5vdCBiZWluZworCQkJICAgdHJhbnNmZXJyZWQgYSBwYWNrZXQgZnJvbSB0aGUgaG9zdCwgc3RhcnQKKwkJCSAgIHRyYW5zbWl0dGluZy4gKi8KKwkJCWlmIChscC0+dHhfcXVldWUgJiYgbHAtPnR4X3F1ZXVlX3JlYWR5KSB7CisJCQkJb3V0YigweDgwIHwgbHAtPnR4X3F1ZXVlLCBpb2FkZHIgKyBUWF9TVEFSVCk7CisJCQkJbHAtPnR4X3F1ZXVlID0gMDsKKwkJCQlscC0+dHhfcXVldWVfbGVuID0gMDsKKwkJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCQkJfSBlbHNlIHsKKwkJCQlscC0+dHhfc3RhcnRlZCA9IDA7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwkJCX0KKwkJfQorCX0KKworCXNwaW5fdW5sb2NrICgmbHAtPmxvY2spOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKiBXZSBoYXZlIGEgZ29vZCBwYWNrZXQocyksIGdldCBpdC90aGVtIG91dCBvZiB0aGUgYnVmZmVycy4gKi8KK3N0YXRpYyB2b2lkCituZXRfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBib2d1c2NvdW50ID0gNTsKKworCXdoaWxlICgoaW5iKGlvYWRkciArIFJYX01PREUpICYgMHg0MCkgPT0gMCkgeworCQl1c2hvcnQgc3RhdHVzID0gaW53KGlvYWRkciArIERBVEFQT1JUKTsKKwkJdXNob3J0IHBrdF9sZW4gPSBpbncoaW9hZGRyICsgREFUQVBPUlQpOworCisJCWlmIChuZXRfZGVidWcgPiA0KQorCQkJcHJpbnRrKCIlczogUnhpbmcgcGFja2V0IG1vZGUgJTAyeCBzdGF0dXMgJTA0eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBpbmIoaW9hZGRyICsgUlhfTU9ERSksIHN0YXR1cyk7CisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkJaWYgKHN0YXR1cyA9PSAwKSB7CisJCQlvdXRiKDB4MDUsIGlvYWRkciArIFJYX0NUUkwpOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCisJCWlmICgoc3RhdHVzICYgMHhGMCkgIT0gMHgyMCkgewkvKiBUaGVyZSB3YXMgYW4gZXJyb3IuICovCisJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgMHgwOCkgbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiAweDA0KSBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgMHgwMikgbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiAweDAxKSBscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJfSBlbHNlIHsKKwkJCS8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLiAqLworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJaWYgKHBrdF9sZW4gPiAxNTUwKSB7CisJCQkJcHJpbnRrKCIlczogVGhlIEFUMTcwMCBjbGFpbWVkIGEgdmVyeSBsYXJnZSBwYWNrZXQsIHNpemUgJWQuXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHBrdF9sZW4pOworCQkJCS8qIFByaW1lIHRoZSBGSUZPIGFuZCB0aGVuIGZsdXNoIHRoZSBwYWNrZXQuICovCisJCQkJaW53KGlvYWRkciArIERBVEFQT1JUKTsgaW53KGlvYWRkciArIERBVEFQT1JUKTsKKwkJCQlvdXRiKDB4MDUsIGlvYWRkciArIFJYX0NUUkwpOworCQkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiszKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCXByaW50aygiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQgKGxlbiAlZCkuXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHBrdF9sZW4pOworCQkJCS8qIFByaW1lIHRoZSBGSUZPIGFuZCB0aGVuIGZsdXNoIHRoZSBwYWNrZXQuICovCisJCQkJaW53KGlvYWRkciArIERBVEFQT1JUKTsgaW53KGlvYWRkciArIERBVEFQT1JUKTsKKwkJCQlvdXRiKDB4MDUsIGlvYWRkciArIFJYX0NUUkwpOworCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlza2ItPmRldiA9IGRldjsKKwkJCXNrYl9yZXNlcnZlKHNrYiwyKTsKKworCQkJaW5zdyhpb2FkZHIgKyBEQVRBUE9SVCwgc2tiX3B1dChza2IscGt0X2xlbiksIChwa3RfbGVuICsgMSkgPj4gMSk7CisJCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQl9CisJCWlmICgtLWJvZ3VzY291bnQgPD0gMCkKKwkJCWJyZWFrOworCX0KKworCS8qIElmIGFueSB3b3J0aC13aGlsZSBwYWNrZXRzIGhhdmUgYmVlbiByZWNlaXZlZCwgZGV2X3JpbnQoKQorCSAgIGhhcyBkb25lIGEgbWFya19iaChORVRfQkgpIGZvciB1cyBhbmQgd2lsbCB3b3JrIG9uIHRoZW0KKwkgICB3aGVuIHdlIGdldCB0byB0aGUgYm90dG9tLWhhbGYgcm91dGluZS4gKi8KKwl7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworCQkJaWYgKChpbmIoaW9hZGRyICsgUlhfTU9ERSkgJiAweDQwKSA9PSAweDQwKQorCQkJCWJyZWFrOworCQkJaW53KGlvYWRkciArIERBVEFQT1JUKTsJCQkJLyogZHVtbXkgc3RhdHVzIHJlYWQgKi8KKwkJCW91dGIoMHgwNSwgaW9hZGRyICsgUlhfQ1RSTCk7CisJCX0KKworCQlpZiAobmV0X2RlYnVnID4gNSkKKwkJCXByaW50aygiJXM6IEV4aW50IFJ4IHBhY2tldCB3aXRoIG1vZGUgJTAyeCBhZnRlciAlZCB0aWNrcy5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBpbmIoaW9hZGRyICsgUlhfTU9ERSksIGkpOworCX0KKwlyZXR1cm47Cit9CisKKy8qIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gbmV0X29wZW4oKS4gKi8KK3N0YXRpYyBpbnQgbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIFNldCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIDAgdG8gZGlzYWJsZSBUeCBhbmQgUnguICovCisJb3V0YigweGRhLCBpb2FkZHIgKyBDT05GSUdfMCk7CisKKwkvKiBObyBzdGF0aXN0aWMgY291bnRlcnMgb24gdGhlIGNoaXAgdG8gdXBkYXRlLiAqLworCisJLyogRGlzYWJsZSB0aGUgSVJRIG9uIGJvYXJkcyBvZiBmbXYxOHggd2hlcmUgaXQgaXMgZmVhc2libGUuICovCisJaWYgKGxwLT5qdW1wZXJlZCkgeworCQlvdXRiKDB4MDAsIGlvYWRkciArIElPQ09ORklHMSk7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCX0KKworCS8qIFBvd2VyLWRvd24gdGhlIGNoaXAuICBHcmVlbiwgZ3JlZW4sIGdyZWVuISAqLworCW91dGIoMHgwMCwgaW9hZGRyICsgQ09ORklHXzEpOworCXJldHVybiAwOworfQorCisvKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4KKyAgIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IgY2xvc2VkLgorICAgVGhlcmUgYXJlIG5vIG9uLWNoaXAgY291bnRlcnMsIHNvIHRoaXMgZnVuY3Rpb24gaXMgdHJpdmlhbC4KKyovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgorbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworLyoKKyAgU2V0IHRoZSBtdWx0aWNhc3QvcHJvbWlzY3VvdXMgbW9kZSBmb3IgdGhpcyBhZGFwdG9yLgorKi8KKworc3RhdGljIHZvaWQKK3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBjaGFyIG1jX2ZpbHRlcls4XTsJCSAvKiBNdWx0aWNhc3QgaGFzaCBmaWx0ZXIgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQkvKiBVbmNvbmRpdGlvbmFsbHkgbG9nIG5ldCB0YXBzLiAqLworCQlwcmludGsoIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLCBkZXYtPm5hbWUpOworCQltZW1zZXQobWNfZmlsdGVyLCAweGZmLCBzaXplb2YobWNfZmlsdGVyKSk7CisJCW91dGIoMywgaW9hZGRyICsgUlhfTU9ERSk7CS8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJfSBlbHNlIGlmIChkZXYtPm1jX2NvdW50ID4gTUNfRklMVEVSQlJFQUsKKwkJCSAgIHx8ICAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKKwkJLyogVG9vIG1hbnkgdG8gZmlsdGVyIHBlcmZlY3RseSAtLSBhY2NlcHQgYWxsIG11bHRpY2FzdHMuICovCisJCW1lbXNldChtY19maWx0ZXIsIDB4ZmYsIHNpemVvZihtY19maWx0ZXIpKTsKKwkJb3V0YigyLCBpb2FkZHIgKyBSWF9NT0RFKTsJLyogVXNlIG5vcm1hbCBtb2RlLiAqLworCX0gZWxzZSBpZiAoZGV2LT5tY19jb3VudCA9PSAwKSB7CisJCW1lbXNldChtY19maWx0ZXIsIDB4MDAsIHNpemVvZihtY19maWx0ZXIpKTsKKwkJb3V0YigxLCBpb2FkZHIgKyBSWF9NT0RFKTsJLyogSWdub3JlIGFsbW9zdCBhbGwgbXVsdGljYXN0cy4gKi8KKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwkJaW50IGk7CisKKwkJbWVtc2V0KG1jX2ZpbHRlciwgMCwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCQlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IG1jbGlzdCAmJiBpIDwgZGV2LT5tY19jb3VudDsKKwkJCSBpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQkJdW5zaWduZWQgaW50IGJpdCA9CisJCQkJZXRoZXJfY3JjX2xlKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKSA+PiAyNjsKKwkJCW1jX2ZpbHRlcltiaXQgPj4gM10gfD0gKDEgPDwgYml0KTsKKwkJfQorCQlvdXRiKDB4MDIsIGlvYWRkciArIFJYX01PREUpOwkvKiBVc2Ugbm9ybWFsIG1vZGUuICovCisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUgKCZscC0+bG9jaywgZmxhZ3MpOworCWlmIChtZW1jbXAobWNfZmlsdGVyLCBscC0+bWNfZmlsdGVyLCBzaXplb2YobWNfZmlsdGVyKSkpIHsKKwkJaW50IHNhdmVkX2JhbmsgPSBpbncoaW9hZGRyICsgQ09ORklHXzApOworCQkvKiBTd2l0Y2ggdG8gYmFuayAxIGFuZCBzZXQgdGhlIG11bHRpY2FzdCB0YWJsZS4gKi8KKwkJb3V0dygoc2F2ZWRfYmFuayAmIH4weDBDMDApIHwgMHgwNDgwLCBpb2FkZHIgKyBDT05GSUdfMCk7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQlvdXRiKG1jX2ZpbHRlcltpXSwgaW9hZGRyICsgUE9SVF9PRkZTRVQoOCArIGkpKTsKKwkJbWVtY3B5KGxwLT5tY19maWx0ZXIsIG1jX2ZpbHRlciwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCQlvdXR3KHNhdmVkX2JhbmssIGlvYWRkciArIENPTkZJR18wKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmxwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuOworfQorCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9hdDE3MDA7CisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obmV0X2RlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkFUMTcwMC9GTVYxOFggSS9PIGJhc2UgYWRkcmVzcyIpOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJBVDE3MDAvRk1WMThYIElSUSBudW1iZXIiKTsKK01PRFVMRV9QQVJNX0RFU0MobmV0X2RlYnVnLCAiQVQxNzAwL0ZNVjE4WCBkZWJ1ZyBsZXZlbCAoMC02KSIpOworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpZiAoaW8gPT0gMCkKKwkJcHJpbnRrKCJhdDE3MDA6IFlvdSBzaG91bGQgbm90IHVzZSBhdXRvLXByb2Jpbmcgd2l0aCBpbnNtb2QhXG4iKTsKKwlkZXZfYXQxNzAwID0gYXQxNzAwX3Byb2JlKC0xKTsKKwlpZiAoSVNfRVJSKGRldl9hdDE3MDApKQorCQlyZXR1cm4gUFRSX0VSUihkZXZfYXQxNzAwKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZAorY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihkZXZfYXQxNzAwKTsKKwljbGVhbnVwX2NhcmQoZGV2X2F0MTcwMCk7CisJZnJlZV9uZXRkZXYoZGV2X2F0MTcwMCk7Cit9CisjZW5kaWYgLyogTU9EVUxFICovCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtYyBhdDE3MDAuYyIKKyAqICBhbHQtY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVkVSU0lPTlMgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1jIGF0MTcwMC5jIgorICogIHRhYi13aWR0aDogNAorICogIGMtYmFzaWMtb2Zmc2V0OiA0CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDQKKyAqIEVuZDoKKyAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGFyaV9iaW9uZXQuYyBiL2RyaXZlcnMvbmV0L2F0YXJpX2Jpb25ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OThjZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hdGFyaV9iaW9uZXQuYwpAQCAtMCwwICsxLDY3NCBAQAorLyogYmlvbmV0LmMgICAgIEJpb05ldC0xMDAgZGV2aWNlIGRyaXZlciBmb3IgbGludXg2OGsuCisgKgorICogVmVyc2lvbjoJQCgjKWJpb25ldC5jCTEuMAkwMi8wNi85NgorICoKKyAqIEF1dGhvcjoJSGFydG11dCBMYXVlIDxsYXVlQGlmay1tcC51bmkta2llbC5kZT4KKyAqIGFuZAkJVG9yc3RlbiBOYXJqZXMgPG5hcmplc0BpZmstbXAudW5pLWtpZWwuZGU+CisgKgorICogTGl0dGxlIGFkYXB0aW9ucyBmb3IgaW50ZWdyYXRpb24gaW50byBwbDcgYnkgUm9tYW4gSG9kZWsKKyAqCisgKiBTb21lIGNoYW5nZXMgaW4gYmlvbmV0X3BvbGxfcnggYnkgS2FybC1IZWlueiBMb2huZXIKKyAqCisJV2hhdCBpcyBpdCA/CisJLS0tLS0tLS0tLS0tCisJVGhpcyBkcml2ZXIgY29udHJvbHMgdGhlIEJJT05FVC0xMDAgTEFOLUFkYXB0ZXIgd2hpY2ggY29ubmVjdHMKKwlhbiBBVEFSSSBTVC9UVCB2aWEgdGhlIEFDU0ktcG9ydCB0byBhbiBFdGhlcm5ldC1iYXNlZCBuZXR3b3JrLgorCisJVGhpcyB2ZXJzaW9uIGNhbiBiZSBjb21waWxlZCBhcyBhIGxvYWRhYmxlIG1vZHVsZSAoU2VlIHRoZQorCWNvbXBpbGUgY29tbWFuZCBhdCB0aGUgYm90dG9tIG9mIHRoaXMgZmlsZSkuCisJQXQgbG9hZCB0aW1lLCB5b3UgY2FuIG9wdGlvbmFsbHkgc2V0IHRoZSBkZWJ1Z2dpbmcgbGV2ZWwgYW5kIHRoZQorCWZhc3Rlc3QgcmVzcG9uc2UgdGltZSBvbiB0aGUgY29tbWFuZCBsaW5lIG9mICdpbnNtb2QnLgorCisJJ2Jpb25ldF9kZWJ1ZycKKwkJY29udHJvbHMgdGhlIGFtb3VudCBvZiBkaWFnbm9zdGljIG1lc3NhZ2VzOgorCSAgMCAgOiBubyBtZXNzYWdlcworCSAgPjAgOiBzZWUgY29kZSBmb3IgbWVhbmluZyBvZiBwcmludGVkIG1lc3NhZ2VzCisKKwknYmlvbmV0X21pbl9wb2xsX3RpbWUnIChhbHdheXMgPj0xKQorCQlnaXZlcyB0aGUgdGltZSAoaW4gamlmZmllcykgYmV0d2VlbiBwb2xscy4gTG93IHZhbHVlcworCQlpbmNyZWFzZSB0aGUgc3lzdGVtIGxvYWQgKGJld2FyZSEpCisKKwlXaGVuIGxvYWRlZCwgYSBuZXQgZGV2aWNlIHdpdGggdGhlIG5hbWUgJ2JpbzAnIGJlY29tZXMgYXZhaWxhYmxlLAorCXdoaWNoIGNhbiBiZSBjb250cm9sbGVkIHdpdGggdGhlIHVzdWFsICdpZmNvbmZpZycgY29tbWFuZC4KKworCUl0IGlzIHBvc3NpYmxlIHRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgaW50byB0aGUga2VybmVsIGxpa2Ugb3RoZXIKKwkobmV0KSBkcml2ZXJzLiBGb3IgdGhpcyBwdXJwb3NlLCBzb21lIHNvdXJjZSBmaWxlcyAoZS5nLiBjb25maWctZmlsZXMKKwltYWtlZmlsZXMsIFNwYWNlLmMpIG11c3QgYmUgY2hhbmdlZCBhY2NvcmRpbmdseS4gKFlvdSBtYXkgcmVmZXIgdG8KKwlvdGhlciBkcml2ZXJzIGhvdyB0byBkbyBpdC4pIEluIHRoaXMgY2FzZSwgdGhlIGRldmljZSB3aWxsIGJlIGRldGVjdGVkCisJYXQgYm9vdCB0aW1lIGFuZCAocHJvYmFibHkpIGFwcGVhciBhcyAnZXRoMCcuCisKKwlUaGlzIGNvZGUgaXMgYmFzZWQgb24gc2V2ZXJhbCBzb3VyY2VzOgorCS0gVGhlIGRyaXZlciBjb2RlIGZvciBhIHBhcmFsbGVsIHBvcnQgZXRoZXJuZXQgYWRhcHRlciBieQorCSAgRG9uYWxkIEJlY2tlciAoc2VlIGZpbGUgJ2F0cC5jJyBmcm9tIHRoZSBQQyBsaW51eCBkaXN0cmlidXRpb24pCisJLSBUaGUgQUNTSSBjb2RlIGJ5IFJvbWFuIEhvZGVrIGZvciB0aGUgQVRBUkktQUNTSSBoYXJkZGlzayBzdXBwb3J0CisJICBhbmQgRE1BIGhhbmRsaW5nLgorCS0gVmVyeSBsaW1pdGVkIGluZm9ybWF0aW9uIGFib3V0IG1vdmluZyBwYWNrZXRzIGluIGFuZCBvdXQgb2YgdGhlCisJICBCSU9ORVQtYWRhcHRlciBmcm9tIHRoZSBUQ1AgcGFja2FnZSBmb3IgVE9TIGJ5IEJpb0RhdGEgR21iSC4KKworCVRoZW9yeSBvZiBPcGVyYXRpb24KKwktLS0tLS0tLS0tLS0tLS0tLS0tCisJQmVjYXVzZSB0aGUgQVRBUkkgRE1BIHBvcnQgaXMgdXN1YWxseSBzaGFyZWQgYmV0d2VlbiBzZXZlcmFsCisJZGV2aWNlcyAoZWcuIGhhcmRkaXNrLCBmbG9wcHkpIHdlIGNhbm5vdCBibG9jayB0aGUgQUNTSSBidXMKKwl3aGlsZSB3YWl0aW5nIGZvciBpbnRlcnJ1cHRzLiBUaGVyZWZvcmUgd2UgdXNlIGEgcG9sbGluZyBtZWNoYW5pc20KKwl0byBmZXRjaCBwYWNrZXRzIGZyb20gdGhlIGFkYXB0ZXIuIEZvciB0aGUgc2FtZSByZWFzb24sIHdlIHNlbmQKKwlwYWNrZXRzIHdpdGhvdXQgY2hlY2tpbmcgdGhhdCB0aGUgcHJldmlvdXMgcGFja2V0IGhhcyBiZWVuIHNlbnQgdG8KKwl0aGUgTEFOLiBXZSByZWx5IG9uIHRoZSBoaWdoZXIgbGV2ZWxzIG9mIHRoZSBuZXR3b3JraW5nIGNvZGUgdG8gZGV0ZWN0CisJbWlzc2luZyBwYWNrZXRzIGFuZCByZXNlbmQgdGhlbS4KKworCUJlZm9yZSB3ZSBhY2Nlc3MgdGhlIEFUQVJJIERNQSBjb250cm9sbGVyLCB3ZSBjaGVjayBpZiBhbm90aGVyCisJcHJvY2VzcyBpcyB1c2luZyB0aGUgRE1BLiBJZiBub3QsIHdlIGxvY2sgdGhlIERNQSwgcGVyZm9ybSBvbmUgb3IKKwltb3JlIHBhY2tldCB0cmFuc2ZlcnMgYW5kIHVubG9jayB0aGUgRE1BIGJlZm9yZSByZXR1cm5pbmcuCisJV2UgZG8gbm90IHVzZSAnc3RkbWFfbG9jaycgdW5jb25kaXRpb25hbGx5IGJlY2F1c2UgaXQgaXMgdW5jbGVhcgorCWlmIHRoZSBuZXR3b3JraW5nIGNvZGUgY2FuIGJlIHNldCB0byBzbGVlcCwgd2hpY2ggd2lsbCBoYXBwZW4gaWYKKwlhbm90aGVyIChwb3NzaWJseSBzbG93KSBkZXZpY2UgaXMgdXNpbmcgdGhlIERNQSBjb250cm9sbGVyLgorCisJVGhlIHBvbGxpbmcgaXMgZG9uZSB2aWEgdGltZXIgaW50ZXJydXB0cyB3aGljaCBwZXJpb2RpY2FsbHkKKwknc2ltdWxhdGUnIGFuIGludGVycnVwdCBmcm9tIHRoZSBFdGhlcm5ldCBhZGFwdGVyLiBUaGUgdGltZSAoaW4gamlmZmllcykKKwliZXR3ZWVuIHBvbGxzIHZhcmllcyBkZXBlbmRpbmcgb24gYW4gZXN0aW1hdGUgb2YgdGhlIG5ldCBhY3Rpdml0eS4KKwlUaGUgYWxsb3dlZCByYW5nZSBpcyBnaXZlbiBieSB0aGUgdmFyaWFibGUgJ2Jpb25ldF9taW5fcG9sbF90aW1lJworCWZvciB0aGUgbG93ZXIgKGZhc3Rlc3QpIGxpbWl0IGFuZCB0aGUgY29uc3RhbnQgJ01BWF9QT0xMX1RJTUUnCisJZm9yIHRoZSBoaWdoZXIgKHNsb3dlc3QpIGxpbWl0LgorCisJV2hlbmV2ZXIgYSBwYWNrZXQgYXJyaXZlcywgd2Ugc3dpdGNoIHRvIGZhc3Rlc3QgcmVzcG9uc2UgYnkgc2V0dGluZworCXRoZSBwb2xsaW5nIHRpbWUgdG8gaXRzIGxvd2VzdCBsaW1pdC4gSWYgdGhlIGZvbGxvd2luZyBwb2xsIGZhaWxzLAorCWJlY2F1c2Ugbm8gcGFja2V0cyBoYXZlIGFycml2ZWQsIHdlIGluY3JlYXNlIHRoZSB0aW1lIGZvciB0aGUgbmV4dAorCXBvbGwuIFdoZW4gdGhlIG5ldCBhY3Rpdml0eSBpcyBsb3csIHRoZSBwb2xsaW5nIHRpbWUgZWZmZWN0aXZlbHkKKwlzdGF5cyBhdCBpdHMgbWF4aW11bSB2YWx1ZSwgcmVzdWx0aW5nIGluIHRoZSBsb3dlc3QgbG9hZCBmb3IgdGhlCisJbWFjaGluZS4KKyAqLworCisjZGVmaW5lIE1BWF9QT0xMX1RJTUUJMTAKKworc3RhdGljIGNoYXIgdmVyc2lvbltdID0KKwkiYmlvbmV0LmM6djEuMCAwNi1mZWItOTYgKGMpIEhhcnRtdXQgTGF1ZS5cbiI7CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYXRhcmlody5oPgorI2luY2x1ZGUgPGFzbS9hdGFyaWludHMuaD4KKyNpbmNsdWRlIDxhc20vYXRhcmlfYWNzaS5oPgorI2luY2x1ZGUgPGFzbS9hdGFyaV9zdGRtYS5oPgorCisKKy8qIHVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sID4yIGZvciBkZWJ1ZworICovCisjaWZuZGVmIE5FVF9ERUJVRworI2RlZmluZSBORVRfREVCVUcgMAorI2VuZGlmCisvKgorICogR2xvYmFsIHZhcmlhYmxlICdiaW9uZXRfZGVidWcnLiBDYW4gYmUgc2V0IGF0IGxvYWQgdGltZSBieSAnaW5zbW9kJworICovCit1bnNpZ25lZCBpbnQgYmlvbmV0X2RlYnVnID0gTkVUX0RFQlVHOworTU9EVUxFX1BBUk0oYmlvbmV0X2RlYnVnLCAiaSIpOworTU9EVUxFX1BBUk1fREVTQyhiaW9uZXRfZGVidWcsICJiaW9uZXQgZGVidWcgbGV2ZWwgKDAtMikiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBiaW9uZXRfbWluX3BvbGxfdGltZSA9IDI7CisKKworLyogSW5mb3JtYXRpb24gdGhhdCBuZWVkIHRvIGJlIGtlcHQgZm9yIGVhY2ggYm9hcmQuCisgKi8KK3N0cnVjdCBuZXRfbG9jYWwgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCWxvbmcgb3Blbl90aW1lOwkJCS8qIGZvciBkZWJ1Z2dpbmcgKi8KKwlpbnQgIHBvbGxfdGltZTsJCQkvKiBwb2xsaW5nIHRpbWUgdmFyaWVzIHdpdGggbmV0IGxvYWQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgbmljX3BrdF9zIHsJCS8qIHBhY2tldCBmb3JtYXQgKi8KKwl1bnNpZ25lZCBjaGFyCXN0YXR1czsKKwl1bnNpZ25lZCBjaGFyCWR1bW15OworCXVuc2lnbmVkIGNoYXIJbF9sbywgbF9oaTsKKwl1bnNpZ25lZCBjaGFyCWJ1ZmZlclszMDAwXTsKK30gKm5pY19wYWNrZXQ7Cit1bnNpZ25lZCBjaGFyICpwaHlzX25pY19wYWNrZXQ7CisKKy8qIEluZGV4IHRvIGZ1bmN0aW9ucywgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4KKyAqLworc3RhdGljIGludCBiaW9uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYmlvbmV0X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYmlvbmV0X3BvbGxfcngoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50IGJpb25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGJpb25ldF90aWNrKHVuc2lnbmVkIGxvbmcpOworCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgYmlvbmV0X3RpbWVyID0gVElNRVJfSU5JVElBTElaRVIoYmlvbmV0X3RpY2ssIDAsIDApOworCisjZGVmaW5lIFNUUkFNX0FERFIoYSkJKCgoYSkgJiAweGZmMDAwMDAwKSA9PSAwKQorCisvKiBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFjY2VzcyB0aGUgZXRoZXJuZXQgYm9hcmQgY29ubmVjdGVkIHRvIHRoZQorICogQUNTSSBwb3J0IHZpYSB0aGUgc3RfZG1hIGNoaXAuCisgKi8KKyNkZWZpbmUgTk9ERV9BRFIgMHg2MAorCisjZGVmaW5lIENfUkVBRCA4CisjZGVmaW5lIENfV1JJVEUgMHgwYQorI2RlZmluZSBDX0dFVEVBIDB4MGYKKyNkZWZpbmUgQ19TRVRDUiAweDBlCisKK3N0YXRpYyBpbnQKK3NlbmRjbWQodW5zaWduZWQgaW50IGEwLCB1bnNpZ25lZCBpbnQgbW9kLCB1bnNpZ25lZCBpbnQgY21kKSB7CisJdW5zaWduZWQgaW50IGM7CisKKwlkbWFfd2QuZG1hX21vZGVfc3RhdHVzID0gKG1vZCB8ICgoYTApID8gMiA6IDApIHwgMHg4OCk7CisJZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudCA9IGNtZDsKKwlkbWFfd2QuZG1hX21vZGVfc3RhdHVzID0gKG1vZCB8IDB4OGEpOworCisJaWYoICFhY3NpX3dhaXRfZm9yX0lSUShIWi8yKSApCS8qIHdhaXQgZm9yIGNtZCBhY2sgKi8KKwkJcmV0dXJuIC0xOwkJLyogdGltZW91dCAqLworCisJYyA9IGRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQ7CisJcmV0dXJuIChjICYgMHhmZik7Cit9CisKKworc3RhdGljIHZvaWQKK3NldF9zdGF0dXMoaW50IGNyKSB7CisJc2VuZGNtZCgwLDB4MTAwLE5PREVfQURSIHwgQ19TRVRDUik7ICAgIC8qIENNRDogU0VUIENSICovCisJc2VuZGNtZCgxLDB4MTAwLGNyKTsKKworCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMgPSAweDgwOworfQorCitzdGF0aWMgaW50CitnZXRfc3RhdHVzKHVuc2lnbmVkIGNoYXIgKmFkcikgeworCWludCBpLGM7CisKKwlESVNBQkxFX0lSUSgpOworCWMgPSBzZW5kY21kKDAsMHgwMCxOT0RFX0FEUiB8IENfR0VURUEpOyAgLyogQ01EOiBHRVQgRVRIIEFEUiovCisJaWYoIGMgPCAwICkgZ290byBnc2VuZDsKKworCS8qIG5vdyByZWFkIHN0YXR1cyBieXRlcyAqLworCisJZm9yIChpPTA7IGk8NjsgaSsrKSB7CisJCWRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQgPSAwOwkvKiByZXF1ZXN0IG5leHQgYnl0ZSAqLworCisgICAgCQlpZiggIWFjc2lfd2FpdF9mb3JfSVJRKEhaLzIpICkgewkvKiB3YWl0IGZvciBjbWQgYWNrICovCisJCQljID0gLTE7CisJCQlnb3RvIGdzZW5kOwkJLyogdGltZW91dCAqLworCQl9CisJCWMgPSBkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50OworCQkqYWRyKysgPSAodW5zaWduZWQgY2hhciljOworCX0KKwljID0gMTsKK2dzZW5kOgorICAJZG1hX3dkLmRtYV9tb2RlX3N0YXR1cyA9IDB4ODA7CisJcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorYmlvbmV0X2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKmZwKSB7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKK3N0YXRpYyBpbnQKK2dldF9mcmFtZSh1bnNpZ25lZCBsb25nIHBhZGRyLCBpbnQgb2RkKSB7CisJaW50IGM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURJU0FCTEVfSVJRKCk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwkJPSAweDlhOworCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJCT0gMHgxOWE7CisJZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwkJPSAweDlhOworCWRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQJPSAweDA0OwkJLyogc2VjdG9yIGNvdW50ICh3YXMgNSkgKi8KKwlkbWFfd2QuZG1hX2xvCQkJPSAodW5zaWduZWQgY2hhcilwYWRkcjsKKwlwYWRkciA+Pj0gODsKKwlkbWFfd2QuZG1hX21kCQkJPSAodW5zaWduZWQgY2hhcilwYWRkcjsKKwlwYWRkciA+Pj0gODsKKwlkbWFfd2QuZG1hX2hpCQkJPSAodW5zaWduZWQgY2hhcilwYWRkcjsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwljID0gc2VuZGNtZCgwLDB4MDAsTk9ERV9BRFIgfCBDX1JFQUQpOwkvKiBDTUQ6IFJFQUQgKi8KKwlpZiggYyA8IDEyOCApIGdvdG8gcmVuZDsKKworCS8qIG5vdyByZWFkIGJsb2NrICovCisKKwljID0gc2VuZGNtZCgxLDB4MDAsb2RkKTsJLyogb2RkIGZsYWcgZm9yIGFkZHJlc3Mgc2hpZnQgKi8KKwlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHgwYTsKKworCWlmKCAhYWNzaV93YWl0X2Zvcl9JUlEoMTAwKSApIHsJLyogd2FpdCBmb3IgRE1BIHRvIGNvbXBsZXRlICovCisJCWMgPSAtMTsKKwkJZ290byByZW5kOworCX0KKwlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHg4YTsKKwlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHgxOGE7CisJZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4OGE7CisJYyA9IGRtYV93ZC5mZGNfYWNjZXNfc2VjY291bnQ7CisKKwlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHg4ODsKKwljID0gZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudDsKKwljID0gMTsKKworcmVuZDoKKwlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHg4MDsKKwl1ZGVsYXkoNDApOworCWFjc2lfd2FpdF9mb3Jfbm9JUlEoMjApOworCXJldHVybiBjOworfQorCisKK3N0YXRpYyBpbnQKK2hhcmR3YXJlX3NlbmRfcGFja2V0KHVuc2lnbmVkIGxvbmcgcGFkZHIsIGludCBjbnQpIHsKKwl1bnNpZ25lZCBpbnQgYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRElTQUJMRV9JUlEoKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlkbWFfd2QuZG1hX21vZGVfc3RhdHVzCT0gMHgxOWE7CisJZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4OWE7CisJZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4MTlhOworCWRtYV93ZC5kbWFfbG8JCT0gKHVuc2lnbmVkIGNoYXIpcGFkZHI7CisJcGFkZHIgPj49IDg7CisJZG1hX3dkLmRtYV9tZAkJPSAodW5zaWduZWQgY2hhcilwYWRkcjsKKwlwYWRkciA+Pj0gODsKKwlkbWFfd2QuZG1hX2hpCQk9ICh1bnNpZ25lZCBjaGFyKXBhZGRyOworCisJZG1hX3dkLmZkY19hY2Nlc19zZWNjb3VudAk9IDB4NDsJCS8qIHNlY3RvciBjb3VudCAqLworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCWMgPSBzZW5kY21kKDAsMHgxMDAsTk9ERV9BRFIgfCBDX1dSSVRFKTsJLyogQ01EOiBXUklURSAqLworCWMgPSBzZW5kY21kKDEsMHgxMDAsY250JjB4ZmYpOworCWMgPSBzZW5kY21kKDEsMHgxMDAsY250Pj44KTsKKworCS8qIG5vdyB3cml0ZSBibG9jayAqLworCisJZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4MTBhOwkvKiBETUEgZW5hYmxlICovCisJaWYoICFhY3NpX3dhaXRfZm9yX0lSUSgxMDApICkJCS8qIHdhaXQgZm9yIERNQSB0byBjb21wbGV0ZSAqLworCQlnb3RvIGVuZDsKKworCWRtYV93ZC5kbWFfbW9kZV9zdGF0dXMJPSAweDE5YTsJLyogRE1BIGRpc2FibGUgISAqLworCWMgPSBkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50OworCitlbmQ6CisJYyA9IHNlbmRjbWQoMSwweDEwMCwwKTsKKwljID0gc2VuZGNtZCgxLDB4MTAwLDApOworCisJZG1hX3dkLmRtYV9tb2RlX3N0YXR1cwk9IDB4MTgwOworCXVkZWxheSg0MCk7CisJYWNzaV93YWl0X2Zvcl9ub0lSUSgyMCk7CisJcmV0dXJuKCBjICYgMHgwMik7Cit9CisKKworLyogQ2hlY2sgZm9yIGEgbmV0d29yayBhZGFwdG9yIG9mIHRoaXMgdHlwZSwgYW5kIHJldHVybiAnMCcgaWYgb25lIGV4aXN0cy4KKyAqLworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgYmlvbmV0X3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgY2hhciBzdGF0aW9uX2FkZHJbNl07CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKwlzdGF0aWMgaW50IG5vX21vcmVfZm91bmQ7CS8qIGF2b2lkICJQcm9iaW5nIGZvci4uLiIgcHJpbnRlZCA0IHRpbWVzICovCisJaW50IGk7CisJaW50IGVycjsKKworCWlmICghTUFDSF9JU19BVEFSSSB8fCBub19tb3JlX2ZvdW5kKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCX0KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlwcmludGsoIlByb2JpbmcgZm9yIEJpb05ldCAxMDAgQWRhcHRlci4uLlxuIik7CisKKwlzdGRtYV9sb2NrKGJpb25ldF9pbnRyLCBOVUxMKTsKKwlpID0gZ2V0X3N0YXR1cyhzdGF0aW9uX2FkZHIpOwkvKiBSZWFkIHRoZSBzdGF0aW9uIGFkZHJlc3MgUFJPTS4gICovCisJRU5BQkxFX0lSUSgpOworCXN0ZG1hX3JlbGVhc2UoKTsKKworCS8qIENoZWNrIHRoZSBmaXJzdCB0aHJlZSBvY3RldHMgb2YgdGhlIFMuQS4gZm9yIHRoZSBtYW51ZmFjdG9yJ3MgY29kZS4KKwkgKi8KKworCWlmKCBpIDwgMAorCXx8ICBzdGF0aW9uX2FkZHJbMF0gIT0gJ0InCisJfHwgIHN0YXRpb25fYWRkclsxXSAhPSAnSScKKwl8fCAgc3RhdGlvbl9hZGRyWzJdICE9ICdPJyApIHsKKwkJbm9fbW9yZV9mb3VuZCA9IDE7CisJCXByaW50ayggIk5vIEJpb05ldCAxMDAgZm91bmQuXG4iICk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCX0KKworCWlmIChiaW9uZXRfZGVidWcgPiAwICYmIHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayh2ZXJzaW9uKTsKKworCXByaW50aygiJXM6ICVzIGZvdW5kLCBldGgtYWRkcjogJTAyeC0lMDJ4LSUwMng6JTAyeC0lMDJ4LSUwMnguXG4iLAorCQlkZXYtPm5hbWUsICJCaW9OZXQgMTAwIiwKKwkJc3RhdGlvbl9hZGRyWzBdLCBzdGF0aW9uX2FkZHJbMV0sIHN0YXRpb25fYWRkclsyXSwKKwkJc3RhdGlvbl9hZGRyWzNdLCBzdGF0aW9uX2FkZHJbNF0sIHN0YXRpb25fYWRkcls1XSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCisJbmljX3BhY2tldCA9IChzdHJ1Y3QgbmljX3BrdF9zICopYWNzaV9idWZmZXI7CisJcGh5c19uaWNfcGFja2V0ID0gKHVuc2lnbmVkIGNoYXIgKilwaHlzX2Fjc2lfYnVmZmVyOworCWlmIChiaW9uZXRfZGVidWcgPiAwKSB7CisJCXByaW50aygibmljX3BhY2tldCBhdCAweCVwLCBwaHlzIGF0IDB4JXBcbiIsCisJCQluaWNfcGFja2V0LCBwaHlzX25pY19wYWNrZXQgKTsKKwl9CisKKwlkZXYtPm9wZW4JCT0gYmlvbmV0X29wZW47CisJZGV2LT5zdG9wCQk9IGJpb25ldF9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IGJpb25ldF9zZW5kX3BhY2tldDsKKwlkZXYtPmdldF9zdGF0cwkJPSBuZXRfZ2V0X3N0YXRzOworCisJLyogRmlsbCBpbiB0aGUgZmllbGRzIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlIHdpdGggZXRoZXJuZXQtZ2VuZXJpYworCSAqIHZhbHVlcy4gVGhpcyBzaG91bGQgYmUgaW4gYSBjb21tb24gZmlsZSBpbnN0ZWFkIG9mIHBlci1kcml2ZXIuCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykgeworI2lmIDAKKwkJZGV2LT5icm9hZGNhc3RbaV0gPSAweGZmOworI2VuZGlmCisJCWRldi0+ZGV2X2FkZHJbaV0gID0gc3RhdGlvbl9hZGRyW2ldOworCX0KKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoIWVycikKKwkJcmV0dXJuIGRldjsKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qIE9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuICBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQorICAgc29tZXRpbWUgYWZ0ZXIgYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgorCisgICBUaGlzIHJvdXRpbmUgc2hvdWxkIHNldCBldmVyeXRoaW5nIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuCisgICByZWdpc3RlcnMgdGhhdCAic2hvdWxkIiBvbmx5IG5lZWQgdG8gYmUgc2V0IG9uY2UgYXQgYm9vdCwgc28gdGhhdAorICAgdGhlcmUgaXMgbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAqLworc3RhdGljIGludAorYmlvbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChiaW9uZXRfZGVidWcgPiAwKQorCQlwcmludGsoImJpb25ldF9vcGVuXG4iKTsKKwlzdGRtYV9sb2NrKGJpb25ldF9pbnRyLCBOVUxMKTsKKworCS8qIFJlc2V0IHRoZSBoYXJkd2FyZSBoZXJlLgorCSAqLworCXNldF9zdGF0dXMoNCk7CisJbHAtPm9wZW5fdGltZSA9IDA7CS8qamlmZmllcyovCisJbHAtPnBvbGxfdGltZSA9IE1BWF9QT0xMX1RJTUU7CisKKwlkZXYtPnRidXN5ID0gMDsKKwlkZXYtPmludGVycnVwdCA9IDA7CisJZGV2LT5zdGFydCA9IDE7CisKKwlzdGRtYV9yZWxlYXNlKCk7CisJYmlvbmV0X3RpbWVyLmRhdGEgPSAobG9uZylkZXY7CisJYmlvbmV0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbHAtPnBvbGxfdGltZTsKKwlhZGRfdGltZXIoJmJpb25ldF90aW1lcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2Jpb25ldF9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBCbG9jayBhIHRpbWVyLWJhc2VkIHRyYW5zbWl0IGZyb20gb3ZlcmxhcHBpbmcuICBUaGlzIGNvdWxkIGJldHRlciBiZQorCSAqIGRvbmUgd2l0aCBhdG9taWNfc3dhcCgxLCBkZXYtPnRidXN5KSwgYnV0IHNldF9iaXQoKSB3b3JrcyBhcyB3ZWxsLgorCSAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWlmIChzdGRtYV9pc2xvY2tlZCgpKSB7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCX0KKwllbHNlIHsKKwkJaW50IGxlbmd0aCA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOworCQl1bnNpZ25lZCBsb25nIGJ1ZiA9IHZpcnRfdG9fcGh5cyhza2ItPmRhdGEpOworCQlpbnQgc3RhdDsKKworCQlzdGRtYV9sb2NrKGJpb25ldF9pbnRyLCBOVUxMKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlpZiggIVNUUkFNX0FERFIoYnVmK2xlbmd0aC0xKSApIHsKKwkJCW1lbWNweShuaWNfcGFja2V0LT5idWZmZXIsIHNrYi0+ZGF0YSwgbGVuZ3RoKTsKKwkJCWJ1ZiA9ICh1bnNpZ25lZCBsb25nKSYoKHN0cnVjdCBuaWNfcGt0X3MgKilwaHlzX25pY19wYWNrZXQpLT5idWZmZXI7CisJCX0KKworCQlpZiAoYmlvbmV0X2RlYnVnID4xKSB7CisJCQl1X2NoYXIgKmRhdGEgPSBuaWNfcGFja2V0LT5idWZmZXIsICpwOworCQkJaW50IGk7CisJCQkKKwkJCXByaW50ayggIiVzOiBUWCBwa3QgdHlwZSAweCU0eCBmcm9tICIsIGRldi0+bmFtZSwKKwkJCQkgICgodV9zaG9ydCAqKWRhdGEpWzZdKTsKKworCQkJZm9yKCBwID0gJmRhdGFbNl0sIGkgPSAwOyBpIDwgNjsgaSsrICkKKwkJCQlwcmludGsoIiUwMnglcyIsICpwKyssaSAhPSA1ID8gIjoiIDogIiIgKTsKKwkJCXByaW50aygiIHRvICIpOworCisJCQlmb3IoIHAgPSBkYXRhLCBpID0gMDsgaSA8IDY7IGkrKyApCisJCQkJcHJpbnRrKCIlMDJ4JXMiLCAqcCsrLGkgIT0gNSA/ICI6IiA6ICIiICJcbiIgKTsKKworCQkJcHJpbnRrKCAiJXM6ICIsIGRldi0+bmFtZSApOworCQkJcHJpbnRrKCIgZGF0YSAlMDJ4JTAyeCAlMDJ4JTAyeCUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeCAlMDJ4JTAyeCUwMnglMDJ4IgorCQkJICAgICAgICIgJTAyeCUwMnglMDJ4JTAyeCBsZW4gJWRcbiIsCisJCQkJICBkYXRhWzEyXSwgZGF0YVsxM10sIGRhdGFbMTRdLCBkYXRhWzE1XSwgZGF0YVsxNl0sIGRhdGFbMTddLCBkYXRhWzE4XSwgZGF0YVsxOV0sCisJCQkJICBkYXRhWzIwXSwgZGF0YVsyMV0sIGRhdGFbMjJdLCBkYXRhWzIzXSwgZGF0YVsyNF0sIGRhdGFbMjVdLCBkYXRhWzI2XSwgZGF0YVsyN10sCisJCQkJICBkYXRhWzI4XSwgZGF0YVsyOV0sIGRhdGFbMzBdLCBkYXRhWzMxXSwgZGF0YVszMl0sIGRhdGFbMzNdLAorCQkJCSAgbGVuZ3RoICk7CisJCX0KKwkJZG1hX2NhY2hlX21haW50ZW5hbmNlKGJ1ZiwgbGVuZ3RoLCAxKTsKKworCQlzdGF0ID0gaGFyZHdhcmVfc2VuZF9wYWNrZXQoYnVmLCBsZW5ndGgpOworCQlFTkFCTEVfSVJRKCk7CisJCXN0ZG1hX3JlbGVhc2UoKTsKKworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJZGV2LT50YnVzeQkgPSAwOworCQlscC0+c3RhdHMudHhfcGFja2V0cysrOworCQlscC0+c3RhdHMudHhfYnl0ZXMrPWxlbmd0aDsKKwl9CisJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFdlIGhhdmUgYSBnb29kIHBhY2tldChzKSwgZ2V0IGl0L3RoZW0gb3V0IG9mIHRoZSBidWZmZXJzLgorICovCitzdGF0aWMgdm9pZAorYmlvbmV0X3BvbGxfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgYm9ndXNjb3VudCA9IDEwOworCWludCBwa3RfbGVuLCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkvKiArK3JvbWFuOiBUYWtlIGNhcmUgYXQgbG9ja2luZyB0aGUgU1QtRE1BLi4uIFRoaXMgbXVzdCBiZSBkb25lIHdpdGggaW50cworCSAqIG9mZiwgc2luY2Ugb3RoZXJ3aXNlIGFuIGludCBjb3VsZCBzbGlwIGluIGJldHdlZW4gdGhlIHF1ZXN0aW9uIGFuZCB0aGUKKwkgKiBsb2NraW5nIGl0c2VsZiwgYW5kIHRoZW4gd2UnZCBnbyB0byBzbGVlcC4uLiBBbmQgbG9ja2luZyBpdHNlbGYgaXMKKwkgKiBuZWNlc3NhcnkgdG8ga2VlcCB0aGUgZmxvcHB5X2NoYW5nZSB0aW1lciBmcm9tIHdvcmtpbmcgd2l0aCBTVC1ETUEKKwkgKiByZWdpc3RlcnMuICovCisJaWYgKHN0ZG1hX2lzbG9ja2VkKCkpIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm47CisJfQorCXN0ZG1hX2xvY2soYmlvbmV0X2ludHIsIE5VTEwpOworCURJU0FCTEVfSVJRKCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJaWYoIGxwLT5wb2xsX3RpbWUgPCBNQVhfUE9MTF9USU1FICkgbHAtPnBvbGxfdGltZSsrOworCisJd2hpbGUoYm9ndXNjb3VudC0tKSB7CisJCXN0YXR1cyA9IGdldF9mcmFtZSgodW5zaWduZWQgbG9uZylwaHlzX25pY19wYWNrZXQsIDApOworCisJCWlmKCBzdGF0dXMgPT0gMCApIGJyZWFrOworCisJCS8qIEdvb2QgcGFja2V0Li4uICovCisKKwkJZG1hX2NhY2hlX21haW50ZW5hbmNlKCh1bnNpZ25lZCBsb25nKXBoeXNfbmljX3BhY2tldCwgMTUyMCwgMCk7CisKKwkJcGt0X2xlbiA9IChuaWNfcGFja2V0LT5sX2hpIDw8IDgpIHwgbmljX3BhY2tldC0+bF9sbzsKKworCQlscC0+cG9sbF90aW1lID0gYmlvbmV0X21pbl9wb2xsX3RpbWU7ICAgIC8qIGZhc3QgcG9sbCAqLworCQlpZiggcGt0X2xlbiA+PSA2MCAmJiBwa3RfbGVuIDw9IDE1MjAgKSB7CisJCQkJCS8qCV5eXl4gd2FyIDE1MTQgIEtITCAqLworCQkJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuCisJCQkgKi8KKwkJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKCBwa3RfbGVuICsgMiApOworCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKCIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsCisJCQkJCWRldi0+bmFtZSk7CisJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJc2tiLT5kZXYgPSBkZXY7CisJCQlza2JfcmVzZXJ2ZSggc2tiLCAyICk7CQkvKiAxNiBCeXRlIGFsaWduICAqLworCQkJc2tiX3B1dCggc2tiLCBwa3RfbGVuICk7CS8qIG1ha2Ugcm9vbSAqLworCisJCQkvKiAnc2tiLT5kYXRhJyBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHNrX2J1ZmYgZGF0YSBhcmVhLgorCQkJICovCisJCQltZW1jcHkoc2tiLT5kYXRhLCBuaWNfcGFja2V0LT5idWZmZXIsIHBrdF9sZW4pOworCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKCBza2IsIGRldiApOyAKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCWxwLT5zdGF0cy5yeF9ieXRlcys9cGt0X2xlbjsKKworCS8qIElmIGFueSB3b3J0aC13aGlsZSBwYWNrZXRzIGhhdmUgYmVlbiByZWNlaXZlZCwgZGV2X3JpbnQoKQorCSAgIGhhcyBkb25lIGEgbWFya19iaChJTkVUX0JIKSBmb3IgdXMgYW5kIHdpbGwgd29yayBvbiB0aGVtCisJICAgd2hlbiB3ZSBnZXQgdG8gdGhlIGJvdHRvbS1oYWxmIHJvdXRpbmUuCisJICovCisKKyAJCQlpZiAoYmlvbmV0X2RlYnVnID4xKSB7CisgCQkJCXVfY2hhciAqZGF0YSA9IG5pY19wYWNrZXQtPmJ1ZmZlciwgKnA7CisgCQkJCWludCBpOworIAkJCQkKKyAJCQkJcHJpbnRrKCAiJXM6IFJYIHBrdCB0eXBlIDB4JTR4IGZyb20gIiwgZGV2LT5uYW1lLAorIAkJCQkJICAoKHVfc2hvcnQgKilkYXRhKVs2XSk7CisgCQkJCQkgCisgCQkJCQorIAkJCQlmb3IoIHAgPSAmZGF0YVs2XSwgaSA9IDA7IGkgPCA2OyBpKysgKQorIAkJCQkJcHJpbnRrKCIlMDJ4JXMiLCAqcCsrLGkgIT0gNSA/ICI6IiA6ICIiICk7CisgCQkJCXByaW50aygiIHRvICIpOworIAkJCQlmb3IoIHAgPSBkYXRhLCBpID0gMDsgaSA8IDY7IGkrKyApCisgCQkJCQlwcmludGsoIiUwMnglcyIsICpwKyssaSAhPSA1ID8gIjoiIDogIiIgIlxuIiApOworIAorIAkJCQlwcmludGsoICIlczogIiwgZGV2LT5uYW1lICk7CisgCQkJCXByaW50aygiIGRhdGEgJTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeCAlMDJ4JTAyeCUwMnglMDJ4ICUwMnglMDJ4JTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeCIKKyAJCQkJICAgICAgICIgJTAyeCUwMnglMDJ4JTAyeCBsZW4gJWRcbiIsCisgCQkJCQkgIGRhdGFbMTJdLCBkYXRhWzEzXSwgZGF0YVsxNF0sIGRhdGFbMTVdLCBkYXRhWzE2XSwgZGF0YVsxN10sIGRhdGFbMThdLCBkYXRhWzE5XSwKKyAJCQkJCSAgZGF0YVsyMF0sIGRhdGFbMjFdLCBkYXRhWzIyXSwgZGF0YVsyM10sIGRhdGFbMjRdLCBkYXRhWzI1XSwgZGF0YVsyNl0sIGRhdGFbMjddLAorIAkJCQkJICBkYXRhWzI4XSwgZGF0YVsyOV0sIGRhdGFbMzBdLCBkYXRhWzMxXSwgZGF0YVszMl0sIGRhdGFbMzNdLAorIAkJCQkJCSAgcGt0X2xlbiApOworIAkJCX0KKyAJCX0KKyAJCWVsc2UgeworIAkJCXByaW50aygiIFBhY2tldCBoYXMgd3JvbmcgbGVuZ3RoOiAlMDRkIGJ5dGVzXG4iLCBwa3RfbGVuKTsKKyAJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisgCQl9CisgCX0KKwlzdGRtYV9yZWxlYXNlKCk7CisJRU5BQkxFX0lSUSgpOworCXJldHVybjsKK30KKworLyogYmlvbmV0X3RpY2s6IGNhbGxlZCBieSBiaW9uZXRfdGltZXIuIFJlYWRzIHBhY2tldHMgZnJvbSB0aGUgYWRhcHRlciwKKyAqIHBhc3NlcyB0aGVtIHRvIHRoZSBoaWdoZXIgbGF5ZXJzIGFuZCByZXN0YXJ0cyB0aGUgdGltZXIuCisgKi8KK3N0YXRpYyB2b2lkCitiaW9uZXRfdGljayh1bnNpZ25lZCBsb25nIGRhdGEpIHsKKwlzdHJ1Y3QgbmV0X2RldmljZQkgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYoIGJpb25ldF9kZWJ1ZyA+IDAgJiYgKGxwLT5vcGVuX3RpbWUrKyAmIDcpID09IDggKQorCQlwcmludGsoImJpb25ldF90aWNrOiAlbGRcbiIsIGxwLT5vcGVuX3RpbWUpOworCisJaWYoICFzdGRtYV9pc2xvY2tlZCgpICkgYmlvbmV0X3BvbGxfcngoZGV2KTsKKworCWJpb25ldF90aW1lci5leHBpcmVzID0gamlmZmllcyArIGxwLT5wb2xsX3RpbWU7CisJYWRkX3RpbWVyKCZiaW9uZXRfdGltZXIpOworfQorCisvKiBUaGUgaW52ZXJzZSByb3V0aW5lIHRvIGJpb25ldF9vcGVuKCkuCisgKi8KK3N0YXRpYyBpbnQKK2Jpb25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKGJpb25ldF9kZWJ1ZyA+IDApCisJCXByaW50aygiYmlvbmV0X2Nsb3NlLCBvcGVuX3RpbWU9JWxkXG4iLCBscC0+b3Blbl90aW1lKTsKKwlkZWxfdGltZXIoJmJpb25ldF90aW1lcik7CisJc3RkbWFfbG9jayhiaW9uZXRfaW50ciwgTlVMTCk7CisKKwlzZXRfc3RhdHVzKDApOworCWxwLT5vcGVuX3RpbWUgPSAwOworCisJZGV2LT50YnVzeSA9IDE7CisJZGV2LT5zdGFydCA9IDA7CisKKwlzdGRtYV9yZWxlYXNlKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLgorICAgVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvciBjbG9zZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKworI2lmZGVmIE1PRFVMRQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmJpb19kZXY7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWJpb19kZXYgPSBiaW9uZXRfcHJvYmUoLTEpOworCWlmIChJU19FUlIoYmlvX2RldikpCisJCXJldHVybiBQVFJfRVJSKGJpb19kZXYpOworCXJldHVybiAwOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYoYmlvX2Rldik7CisJZnJlZV9uZXRkZXYoYmlvX2Rldik7Cit9CisKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworLyogTG9jYWwgdmFyaWFibGVzOgorICogIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRF9fS0VSTkVMX18gLUkvdXNyL3NyYy9saW51eC9pbmNsdWRlCisJLWIgbTY4ay1saW51eGFvdXQgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzIKKwktZm9taXQtZnJhbWUtcG9pbnRlciAtcGlwZSAtRE1PRFVMRSAtSS4uLy4uL25ldC9pbmV0IC1jIGJpb25ldC5jIgorICogIHZlcnNpb24tY29udHJvbDogdAorICogIGtlcHQtbmV3LXZlcnNpb25zOiA1CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0YXJpX3BhbXNuZXQuYyBiL2RyaXZlcnMvbmV0L2F0YXJpX3BhbXNuZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWMzNjJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXRhcmlfcGFtc25ldC5jCkBAIC0wLDAgKzEsODk1IEBACisvKiBhdGFyaV9wYW1zbmV0LmMgICAgIFBBTXNOZXQgZGV2aWNlIGRyaXZlciBmb3IgbGludXg2OGsuCisgKgorICogVmVyc2lvbjoJQCgjKVBBTXNOZXQuYwkwLjLfCTAzLzMxLzk2CisgKgorICogQXV0aG9yOiAgVG9yc3RlbiBMYW5nIDxUb3JzdGVuLkxhbmdAYXAucGh5c2lrLnVuaS1naWVzc2VuLmRlPgorICogICAgICAgICAgICAgICAgICAgICAgIDxUb3JzdGVuLkxhbmdAanVuZy5kZT4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiBteSBkcml2ZXIgUEFNU0RNQS5jIGZvciBNaU5ULU5ldCBhbmQKKyAqIG9uIHRoZSBkcml2ZXIgYmlvbmV0LmMgd3JpdHRlbiBieQorICogICAgICAgICAgSGFydG11dCBMYXVlIDxsYXVlQGlmay1tcC51bmkta2llbC5kZT4KKyAqIGFuZCAgICAgIFRvcnN0ZW4gTmFyamVzIDxuYXJqZXNAaWZrLW1wLnVuaS1raWVsLmRlPgorICoKKyAqIExpdHRsZSBhZGFwdGlvbnMgZm9yIGludGVncmF0aW9uIGludG8gcGw3IGJ5IFJvbWFuIEhvZGVrCisgKgorCVdoYXQgaXMgaXQgPworCS0tLS0tLS0tLS0tLQorCVRoaXMgZHJpdmVyIGNvbnRyb2xzIHRoZSBQQU1zTmV0IExBTi1BZGFwdGVyIHdoaWNoIGNvbm5lY3RzCisJYW4gQVRBUkkgU1QvVFQgdmlhIHRoZSBBQ1NJLXBvcnQgdG8gYW4gRXRoZXJuZXQtYmFzZWQgbmV0d29yay4KKworCVRoaXMgdmVyc2lvbiBjYW4gYmUgY29tcGlsZWQgYXMgYSBsb2FkYWJsZSBtb2R1bGUgKFNlZSB0aGUKKwljb21waWxlIGNvbW1hbmQgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIGZpbGUpLgorCUF0IGxvYWQgdGltZSwgeW91IGNhbiBvcHRpb25hbGx5IHNldCB0aGUgZGVidWdnaW5nIGxldmVsIGFuZCB0aGUKKwlmYXN0ZXN0IHJlc3BvbnNlIHRpbWUgb24gdGhlIGNvbW1hbmQgbGluZSBvZiAnaW5zbW9kJy4KKworCSdwYW1zbmV0X2RlYnVnJworCQljb250cm9scyB0aGUgYW1vdW50IG9mIGRpYWdub3N0aWMgbWVzc2FnZXM6CisJICAwICA6IG5vIG1lc3NhZ2VzCisJICA+MCA6IHNlZSBjb2RlIGZvciBtZWFuaW5nIG9mIHByaW50ZWQgbWVzc2FnZXMKKworCSdwYW1zbmV0X21pbl9wb2xsX3RpbWUnIChhbHdheXMgPj0xKQorCQlnaXZlcyB0aGUgdGltZSAoaW4gamlmZmllcykgYmV0d2VlbiBwb2xscy4gTG93IHZhbHVlcworCQlpbmNyZWFzZSB0aGUgc3lzdGVtIGxvYWQgKGJld2FyZSEpCisKKwlXaGVuIGxvYWRlZCwgYSBuZXQgZGV2aWNlIHdpdGggdGhlIG5hbWUgJ2V0aD8nIGJlY29tZXMgYXZhaWxhYmxlLAorCXdoaWNoIGNhbiBiZSBjb250cm9sbGVkIHdpdGggdGhlIHVzdWFsICdpZmNvbmZpZycgY29tbWFuZC4KKworCUl0IGlzIHBvc3NpYmxlIHRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgaW50byB0aGUga2VybmVsIGxpa2Ugb3RoZXIKKwkobmV0KSBkcml2ZXJzLiBGb3IgdGhpcyBwdXJwb3NlLCBzb21lIHNvdXJjZSBmaWxlcyAoZS5nLiBjb25maWctZmlsZXMKKwltYWtlZmlsZXMsIFNwYWNlLmMpIG11c3QgYmUgY2hhbmdlZCBhY2NvcmRpbmdseS4gKFlvdSBtYXkgcmVmZXIgdG8KKwlvdGhlciBkcml2ZXJzIGhvdyB0byBkbyBpdC4pIEluIHRoaXMgY2FzZSwgdGhlIGRldmljZSB3aWxsIGJlIGRldGVjdGVkCisJYXQgYm9vdCB0aW1lIGFuZCAocHJvYmFibHkpIGFwcGVhciBhcyAnZXRoMCcuCisKKwlUaGVvcnkgb2YgT3BlcmF0aW9uCisJLS0tLS0tLS0tLS0tLS0tLS0tLQorCUJlY2F1c2UgdGhlIEFUQVJJIERNQSBwb3J0IGlzIHVzdWFsbHkgc2hhcmVkIGJldHdlZW4gc2V2ZXJhbAorCWRldmljZXMgKGVnLiBoYXJkZGlzaywgZmxvcHB5KSB3ZSBjYW5ub3QgYmxvY2sgdGhlIEFDU0kgYnVzCisJd2hpbGUgd2FpdGluZyBmb3IgaW50ZXJydXB0cy4gVGhlcmVmb3JlIHdlIHVzZSBhIHBvbGxpbmcgbWVjaGFuaXNtCisJdG8gZmV0Y2ggcGFja2V0cyBmcm9tIHRoZSBhZGFwdGVyLiBGb3IgdGhlIHNhbWUgcmVhc29uLCB3ZSBzZW5kCisJcGFja2V0cyB3aXRob3V0IGNoZWNraW5nIHRoYXQgdGhlIHByZXZpb3VzIHBhY2tldCBoYXMgYmVlbiBzZW50IHRvCisJdGhlIExBTi4gV2UgcmVseSBvbiB0aGUgaGlnaGVyIGxldmVscyBvZiB0aGUgbmV0d29ya2luZyBjb2RlIHRvIGRldGVjdAorCW1pc3NpbmcgcGFja2V0cyBhbmQgcmVzZW5kIHRoZW0uCisKKwlCZWZvcmUgd2UgYWNjZXNzIHRoZSBBVEFSSSBETUEgY29udHJvbGxlciwgd2UgY2hlY2sgaWYgYW5vdGhlcgorCXByb2Nlc3MgaXMgdXNpbmcgdGhlIERNQS4gSWYgbm90LCB3ZSBsb2NrIHRoZSBETUEsIHBlcmZvcm0gb25lIG9yCisJbW9yZSBwYWNrZXQgdHJhbnNmZXJzIGFuZCB1bmxvY2sgdGhlIERNQSBiZWZvcmUgcmV0dXJuaW5nLgorCVdlIGRvIG5vdCB1c2UgJ3N0ZG1hX2xvY2snIHVuY29uZGl0aW9uYWxseSBiZWNhdXNlIGl0IGlzIHVuY2xlYXIKKwlpZiB0aGUgbmV0d29ya2luZyBjb2RlIGNhbiBiZSBzZXQgdG8gc2xlZXAsIHdoaWNoIHdpbGwgaGFwcGVuIGlmCisJYW5vdGhlciAocG9zc2libHkgc2xvdykgZGV2aWNlIGlzIHVzaW5nIHRoZSBETUEgY29udHJvbGxlci4KKworCVRoZSBwb2xsaW5nIGlzIGRvbmUgdmlhIHRpbWVyIGludGVycnVwdHMgd2hpY2ggcGVyaW9kaWNhbGx5CisJJ3NpbXVsYXRlJyBhbiBpbnRlcnJ1cHQgZnJvbSB0aGUgRXRoZXJuZXQgYWRhcHRlci4gVGhlIHRpbWUgKGluIGppZmZpZXMpCisJYmV0d2VlbiBwb2xscyB2YXJpZXMgZGVwZW5kaW5nIG9uIGFuIGVzdGltYXRlIG9mIHRoZSBuZXQgYWN0aXZpdHkuCisJVGhlIGFsbG93ZWQgcmFuZ2UgaXMgZ2l2ZW4gYnkgdGhlIHZhcmlhYmxlICdiaW9uZXRfbWluX3BvbGxfdGltZScKKwlmb3IgdGhlIGxvd2VyIChmYXN0ZXN0KSBsaW1pdCBhbmQgdGhlIGNvbnN0YW50ICdNQVhfUE9MTF9USU1FJworCWZvciB0aGUgaGlnaGVyIChzbG93ZXN0KSBsaW1pdC4KKworCVdoZW5ldmVyIGEgcGFja2V0IGFycml2ZXMsIHdlIHN3aXRjaCB0byBmYXN0ZXN0IHJlc3BvbnNlIGJ5IHNldHRpbmcKKwl0aGUgcG9sbGluZyB0aW1lIHRvIGl0cyBsb3dlc3QgbGltaXQuIElmIHRoZSBmb2xsb3dpbmcgcG9sbCBmYWlscywKKwliZWNhdXNlIG5vIHBhY2tldHMgaGF2ZSBhcnJpdmVkLCB3ZSBpbmNyZWFzZSB0aGUgdGltZSBmb3IgdGhlIG5leHQKKwlwb2xsLiBXaGVuIHRoZSBuZXQgYWN0aXZpdHkgaXMgbG93LCB0aGUgcG9sbGluZyB0aW1lIGVmZmVjdGl2ZWx5CisJc3RheXMgYXQgaXRzIG1heGltdW0gdmFsdWUsIHJlc3VsdGluZyBpbiB0aGUgbG93ZXN0IGxvYWQgZm9yIHRoZQorCW1hY2hpbmUuCisgKi8KKworI2RlZmluZSBNQVhfUE9MTF9USU1FCTEwCisKK3N0YXRpYyBjaGFyICp2ZXJzaW9uID0KKwkicGFtc25ldC5jOnYwLjJiZXRhIDMwLW1hci05NiAoYykgVG9yc3RlbiBMYW5nLlxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vYXRhcmlody5oPgorI2luY2x1ZGUgPGFzbS9hdGFyaWludHMuaD4KKyNpbmNsdWRlIDxhc20vYXRhcmlfc3RkbWEuaD4KKyNpbmNsdWRlIDxhc20vYXRhcmlfYWNzaS5oPgorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyN1bmRlZiBSRUFECisjdW5kZWYgV1JJVEUKKworLyogdXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgPjIgZm9yIGRlYnVnCisgKi8KKyNpZm5kZWYgTkVUX0RFQlVHCisjZGVmaW5lIE5FVF9ERUJVRyAwCisjZW5kaWYKKy8qCisgKiBHbG9iYWwgdmFyaWFibGUgJ3BhbXNuZXRfZGVidWcnLiBDYW4gYmUgc2V0IGF0IGxvYWQgdGltZSBieSAnaW5zbW9kJworICovCit1bnNpZ25lZCBpbnQgcGFtc25ldF9kZWJ1ZyA9IE5FVF9ERUJVRzsKK01PRFVMRV9QQVJNKHBhbXNuZXRfZGVidWcsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKHBhbXNuZXRfZGVidWcsICJwYW1zbmV0IGRlYnVnIGVuYWJsZSAoMC0xKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IHBhbXNuZXRfbWluX3BvbGxfdGltZSA9IDI7CisKKworLyogSW5mb3JtYXRpb24gdGhhdCBuZWVkIHRvIGJlIGtlcHQgZm9yIGVhY2ggYm9hcmQuCisgKi8KK3N0cnVjdCBuZXRfbG9jYWwgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCWxvbmcgb3Blbl90aW1lOwkJCS8qIGZvciBkZWJ1Z2dpbmcgKi8KKwlpbnQgIHBvbGxfdGltZTsJCQkvKiBwb2xsaW5nIHRpbWUgdmFyaWVzIHdpdGggbmV0IGxvYWQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgbmljX3BrdF9zIHsJCS8qIHBhY2tldCBmb3JtYXQgKi8KKwl1bnNpZ25lZCBjaGFyCWJ1ZmZlclsyMDQ4XTsKK30gKm5pY19wYWNrZXQgPSAwOwordW5zaWduZWQgY2hhciAqcGh5c19uaWNfcGFja2V0OworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgSEFERFJbNl07IC8qIDYtYnl0ZSBoYXJkd2FyZSBhZGRyZXNzIG9mIGxhbmNlICovCisKKy8qIEluZGV4IHRvIGZ1bmN0aW9ucywgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4KKyAqLworc3RhdGljIHZvaWQJc3RhcnQgKGludCB0YXJnZXQpOworc3RhdGljIGludAlzdG9wIChpbnQgdGFyZ2V0KTsKK3N0YXRpYyBpbnQJdGVzdHBrdCAoaW50IHRhcmdldCk7CitzdGF0aWMgaW50CXNlbmRwa3QgKGludCB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCk7CitzdGF0aWMgaW50CXJlY2VpdmVwa3QgKGludCB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcik7CitzdGF0aWMgaW50CWlucXVpcnkgKGludCB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcik7CitzdGF0aWMgSEFERFIJKnJlYWRfaHdfYWRkcihpbnQgdGFyZ2V0LCB1bnNpZ25lZCBjaGFyICpidWZmZXIpOworc3RhdGljIHZvaWQJc2V0dXBfZG1hICh2b2lkICphZGRyZXNzLCB1bnNpZ25lZCByd19mbGFnLCBpbnQgbnVtX2Jsb2Nrcyk7CitzdGF0aWMgaW50CXNlbmRfZmlyc3QgKGludCB0YXJnZXQsIHVuc2lnbmVkIGNoYXIgYnl0ZSk7CitzdGF0aWMgaW50CXNlbmRfMV81IChpbnQgbHVuLCB1bnNpZ25lZCBjaGFyICpjb21tYW5kLCBpbnQgZG1hKTsKK3N0YXRpYyBpbnQJZ2V0X3N0YXR1cyAodm9pZCk7CitzdGF0aWMgaW50CWNhbGNfcmVjZWl2ZWQgKHZvaWQgKnN0YXJ0X2FkZHJlc3MpOworCitzdGF0aWMgaW50IHBhbXNuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcGFtc25ldF9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHBhbXNuZXRfcG9sbF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgcGFtc25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHBhbXNuZXRfdGljayh1bnNpZ25lZCBsb25nKTsKKworc3RhdGljIGlycXJldHVybl90IHBhbXNuZXRfaW50cihpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqZnApOworCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgcGFtc25ldF90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKHBhbXNuZXRfdGljaywgMCwgMCk7CisKKyNkZWZpbmUgU1RSQU1fQUREUihhKQkoKChhKSAmIDB4ZmYwMDAwMDApID09IDApCisKK3R5cGVkZWYgc3RydWN0Cit7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZDFbMHgzOF07CisJSEFERFIgIGh3YWRkcjsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkMlsweDFjMl07Cit9IERNQUhXQUREUjsKKworLyoKKyAqIERlZmluaXRpb25zIG9mIGNvbW1hbmRzIHVuZGVyc3Rvb2QgYnkgdGhlIFBBTXMgRE1BIGFkYXB0b3IuCisgKgorICogSW4gZ2VuZXJhbCB0aGUgRE1BIGFkYXB0b3IgdXNlcyBMVU4gMCwgNSwgNiBhbmQgNyBvbiBvbmUgSUQgY2hhbmdlYWJsZQorICogYnkgdGhlIFBBTSdzIE5ldCBzb2Z0d2FyZS4KKyAqCisgKiBMVU4gMCB3b3JrcyBhcyBhIGhhcmRkaXNrLiBZb3UgY2FuIGJvb3QgdGhlIFBBTSdzIE5ldCBkcml2ZXIgdGhlcmUuCisgKiBMVU4gNSB3b3JrcyBhcyBhIGhhcmRkaXNrIGFuZCBsZXRzIHlvdSBhY2Nlc3MgdGhlIFJBTSBhbmQgc29tZSBJL08gSFcKKyAqICAgICAgIGFyZWEuIEluIHNlY3RvciAwLCBieXRlcyAweDM4LTB4M2QgeW91IGZpbmQgdGhlIGV0aGVybmV0IEhXIGFkZHJlc3MKKyAqICAgICAgIG9mIHRoZSBhZGFwdG9yLgorICogTFVOIDYgd29ya3MgYXMgYSBoYXJkZGlzayBhbmQgbGV0cyB5b3UgYWNjZXNzIHRoZSBmaXJtd2FyZSBST00uCisgKiBMVU4gNyBsZXRzIHlvdSBzZW5kIGFuZCByZWNlaXZlIHBhY2tldHMuCisgKgorICogU29tZSBjb21tYW5kcyBsaWtlIHRoZSBJTlFVSVJZIGNvbW1hbmQgd29yayBpZGVudGljYWwgb24gYWxsIHVzZWQgTFVOcy4KKyAqCisgKiBVTktOT1dOMSBzZWVtcyB0byByZWFkIHNvbWUgZGF0YS4KKyAqICAgICAgICAgIENvbW1hbmQgbGVuZ3RoIGlzIDYgYnl0ZXMuCisgKiBVTktOT1dOMiBzZWVtcyB0byByZWFkIHNvbWUgZGF0YSAoY29tbWFuZCBieXRlIDEgbXVzdCBiZSAhPTApLiBUaGUKKyAqICAgICAgICAgIGZvbGxvd2luZyBieXRlcyBzZWVtIHRvIGJlIHNvbWV0aGluZyBsaWtlIGFuIGFsbG9jYXRpb24gbGVuZ3RoLgorICogICAgICAgICAgQ29tbWFuZCBsZW5ndGggaXMgNiBieXRlcy4KKyAqIFJFQURQS1QgIHJlYWRzIGEgcGFja2V0IHJlY2VpdmVkIGJ5IHRoZSBETUEgYWRhcHRvci4KKyAqICAgICAgICAgIENvbW1hbmQgbGVuZ3RoIGlzIDYgYnl0ZXMuCisgKiBXUklURVBLVCBzZW5kcyBhIHBhY2tldCB0cmFuc2ZlcnJlZCBieSB0aGUgZm9sbG93aW5nIERNQSBwaGFzZS4gVGhlIGxlbmd0aAorICogICAgICAgICAgb2YgdGhlIHBhY2tldCBpcyB0cmFuc2ZlcnJlZCBpbiBjb21tYW5kIGJ5dGVzIDMgYW5kIDQuCisgKiAgICAgICAgICBUaGUgYWRhcHRvciBhdXRvbWF0aWNhbGx5IHJlcGxhY2VzIHRoZSBzcmMgaHcgYWRkcmVzcyBpbiBhbiBldGhlcm5ldAorICogICAgICAgICAgcGFja2V0IGJ5IGl0cyBvd24gaHcgYWRkcmVzcy4KKyAqICAgICAgICAgIENvbW1hbmQgbGVuZ3RoIGlzIDYgYnl0ZXMuCisgKiBJTlFVSVJZICBoYXMgdGhlIHNhbWUgZnVuY3Rpb24gYXMgdGhlIElOUVVJUlkgY29tbWFuZCBzdXBwb3J0ZWQgYnkgaGFyZGRpc2tzCisgKiAgICAgICAgICBhbmQgb3RoZXIgU0NTSSBkZXZpY2VzLiBJdCBsZXRzIHlvdSBkZXRlY3Qgd2hpY2ggZGV2aWNlIHlvdSBmb3VuZAorICogICAgICAgICAgYXQgYSBnaXZlbiBhZGRyZXNzLgorICogICAgICAgICAgQ29tbWFuZCBsZW5ndGggaXMgNiBieXRlcy4KKyAqIFNUQVJUICAgIGluaXRpYWxpemVzIHRoZSBETUEgYWRhcHRvci4gQWZ0ZXIgdGhpcyBjb21tYW5kIGl0IGlzIGFibGUgdG8gc2VuZAorICogICAgICAgICAgYW5kIHJlY2VpdmUgcGFja2V0cy4gVGhlcmUgaXMgbm8gc3RhdHVzIGJ5dGUgcmV0dXJuZWQhCisgKiAgICAgICAgICBDb21tYW5kIGxlbmd0aCBpcyAxIGJ5dGUuCisgKiBOVU1QS1RTICBnaXZlcyBiYWNrIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgcGFja2V0cyB3YWl0aW5nIGluIHRoZSBxdWV1ZSBpbgorICogICAgICAgICAgdGhlIHN0YXR1cyBieXRlLgorICogICAgICAgICAgQ29tbWFuZCBsZW5ndGggaXMgMSBieXRlLgorICogVU5LTk9XTjMKKyAqIFVOS05PV040IEZ1bmN0aW9uIG9mIHRoZXNlIHRocmVlIGNvbW1hbmRzIGlzIHVua25vd24uCisgKiBVTktOT1dONSBUaGUgY29tbWFuZCBsZW5ndGggb2YgdGhlc2UgdGhyZWUgY29tbWFuZHMgaXMgMSBieXRlLgorICogREVTRUxFQ1QgaW1tZWRpYXRlbHkgZGVzZWxlY3RzIHRoZSBETUEgYWRhcHRvci4gTWF5IGltcG9ydGFudCB3aXRoIGludGVycnVwdAorICogICAgICAgICAgZHJpdmVuIG9wZXJhdGlvbi4KKyAqICAgICAgICAgIENvbW1hbmQgbGVuZ3RoIGlzIDEgYnl0ZS4KKyAqIFNUT1AgICAgIHJlc2V0cyB0aGUgRE1BIGFkYXB0b3IuIEFmdGVyIHRoaXMgY29tbWFuZCBwYWNrZXRzIGNhbiBubyBsb25nZXIKKyAqICAgICAgICAgIGJlIHJlY2VpdmVkIG9yIHRyYW5zZmVycmVkLgorICogICAgICAgICAgQ29tbWFuZCBsZW5ndGggaXMgNiBieXRlLgorICovCisKK2VudW0ge1VOS05PV04xPTMsIFJFQURQS1Q9OCwgVU5LTk9XTjIsIFdSSVRFUEtUPTEwLCBJTlFVSVJZPTE4LCBTVEFSVCwKKyAgICAgIE5VTVBLVFM9MjIsIFVOS05PV04zLCBVTktOT1dONCwgVU5LTk9XTjUsIERFU0VMRUNULCBTVE9QfTsKKworI2RlZmluZSBSRUFEU0VDVE9SICBSRUFEUEtUCisjZGVmaW5lIFdSSVRFU0VDVE9SIFdSSVRFUEtUCisKK3VfY2hhciAqaW5xdWlyZTg9Ik1WICAgICAgUEFNJ3MgTkVUL0dLIjsKKworI2RlZmluZSBETUFMT1cgICBkbWFfd2QuZG1hX2xvCisjZGVmaW5lIERNQU1JRCAgIGRtYV93ZC5kbWFfbWQKKyNkZWZpbmUgRE1BSElHSCAgZG1hX3dkLmRtYV9oaQorI2RlZmluZSBEQUNDRVNTICBkbWFfd2QuZmRjX2FjY2VzX3NlY2NvdW50CisKKyNkZWZpbmUgTUZQX0dQSVAgbWZwLnBhcl9kdF9yZWcKKworLyogU29tZSB1c2VmdWwgZnVuY3Rpb25zICovCisKKyNkZWZpbmUgSU5UICAgICAgKCEoTUZQX0dQSVAgJiAweDIwKSkKKyNkZWZpbmUgREVMQVkgKHtNRlBfR1BJUDsgTUZQX0dQSVA7IE1GUF9HUElQO30pCisjZGVmaW5lIFdSSVRFTU9ERSh2YWx1ZSkJCQkJCVwKKwkoewl1X3Nob3J0IGR1bW15ID0gdmFsdWU7CQkJCVwKKwkJX19hc21fXyB2b2xhdGlsZSgibW92ZXcgJTAsIDB4RkZGRjg2MDYiIDogOiAiZCIoZHVtbXkpKTsJXAorCQlERUxBWTsJCQkJCQlcCisJfSkKKyNkZWZpbmUgV1JJVEVCT1RIKHZhbHVlMSwgdmFsdWUyKQkJCQlcCisJKHsJdV9sb25nIGR1bW15ID0gKHVfbG9uZykodmFsdWUxKTw8MTYgfCAodV9zaG9ydCkodmFsdWUyKTsJXAorCQlfX2FzbV9fIHZvbGF0aWxlKCJtb3ZlbCAlMCwgMHhGRkZGODYwNCIgOiA6ICJkIihkdW1teSkpOwlcCisJCURFTEFZOwkJCQkJCVwKKwl9KQorCisvKiBEZWZpbml0aW9ucyBmb3IgRE1PREUgKi8KKworI2RlZmluZSBSRUFEICAgICAgICAweDAwMAorI2RlZmluZSBXUklURSAgICAgICAweDEwMAorCisjZGVmaW5lIERNQV9GREMgICAgIDB4MDgwCisjZGVmaW5lIERNQV9BQ1NJICAgIDB4MDAwCisKKyNkZWZpbmUgRE1BX0RJU0FCTEUgMHgwNDAKKworI2RlZmluZSBTRUNfQ09VTlQgICAweDAxMAorI2RlZmluZSBETUFfV0lORE9XICAweDAwMAorCisjZGVmaW5lIFJFR19BQ1NJICAgIDB4MDA4CisjZGVmaW5lIFJFR19GREMgICAgIDB4MDAwCisKKyNkZWZpbmUgQTEgICAgICAgICAgMHgwMDIKKworLyogVGltZW91dCBjb25zdGFudHMgKi8KKworI2RlZmluZSBUSU1FT1VUQ01EIEhaLzIgICAvKiBjYS4gNTAwbXMgKi8KKyNkZWZpbmUgVElNRU9VVERNQSBIWiAgICAgLyogY2EuIDFzICovCisjZGVmaW5lIENPTU1BTkRfREVMQVkgNTAwIC8qIGNhLiAwLjVtcyAqLworCit1bnNpZ25lZCBydzsKK2ludCBsYW5jZV90YXJnZXQgPSAtMTsKK2ludCBpZl91cCA9IDA7CisKKy8qIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYWNjZXNzIHRoZSBldGhlcm5ldCBib2FyZCBjb25uZWN0ZWQgdG8gdGhlCisgKiBBQ1NJIHBvcnQgdmlhIHRoZSBzdF9kbWEgY2hpcC4KKyAqLworCisvKiBUaGUgZm9sbG93aW5nIGxvd2xldmVsIHJvdXRpbmVzIHdvcmsgb24gcGh5c2ljYWwgYWRkcmVzc2VzIG9ubHkgYW5kIGFzc3VtZQorICogdGhhdCBldmVudHVhbGx5IG5lZWRlZCBidWZmZXJzIGFyZQorICogLSBjb21wbGV0ZWx5IGxvY2F0ZWQgaW4gU1QgUkFNCisgKiAtIGFyZSBjb250aWdvdXMgaW4gdGhlIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UKKyAqLworCisvKiBTZXR1cCB0aGUgRE1BIGNvdW50ZXIgKi8KKworc3RhdGljIHZvaWQKK3NldHVwX2RtYSAoYWRkcmVzcywgcndfZmxhZywgbnVtX2Jsb2NrcykKKwl2b2lkICphZGRyZXNzOworCXVuc2lnbmVkIHJ3X2ZsYWc7CisJaW50IG51bV9ibG9ja3M7Cit7CisJV1JJVEVNT0RFKCh1bnNpZ25lZCkgcndfZmxhZyAgICAgICAgICB8IERNQV9GREMgfCBTRUNfQ09VTlQgfCBSRUdfQUNTSSB8CisJCSAgQTEpOworCVdSSVRFTU9ERSgodW5zaWduZWQpKHJ3X2ZsYWcgXiBXUklURSkgfCBETUFfRkRDIHwgU0VDX0NPVU5UIHwgUkVHX0FDU0kgfAorCQkgIEExKTsKKwlXUklURU1PREUoKHVuc2lnbmVkKSByd19mbGFnICAgICAgICAgIHwgRE1BX0ZEQyB8IFNFQ19DT1VOVCB8IFJFR19BQ1NJIHwKKwkJICBBMSk7CisJRE1BTE9XICA9ICh1bnNpZ25lZCBjaGFyKSgodW5zaWduZWQgbG9uZylhZGRyZXNzICYgMHhGRik7CisJRE1BTUlEICA9ICh1bnNpZ25lZCBjaGFyKSgoKHVuc2lnbmVkIGxvbmcpYWRkcmVzcyA+PiAgOCkgJiAweEZGKTsKKwlETUFISUdIID0gKHVuc2lnbmVkIGNoYXIpKCgodW5zaWduZWQgbG9uZylhZGRyZXNzID4+IDE2KSAmIDB4RkYpOworCVdSSVRFQk9USCgodW5zaWduZWQpbnVtX2Jsb2NrcyAmIDB4RkYsCisJCSAgcndfZmxhZyB8IERNQV9GREMgfCBETUFfV0lORE9XIHwgUkVHX0FDU0kgfCBBMSk7CisJcncgPSByd19mbGFnOworfQorCisvKiBTZW5kIHRoZSBmaXJzdCBieXRlIG9mIGFuIGNvbW1hbmQgYmxvY2sgKi8KKworc3RhdGljIGludAorc2VuZF9maXJzdCAodGFyZ2V0LCBieXRlKQorCWludCB0YXJnZXQ7CisJdW5zaWduZWQgY2hhciBieXRlOworeworCXJ3ID0gUkVBRDsKKwlhY3NpX2RlbGF5X2VuZChDT01NQU5EX0RFTEFZKTsKKwkvKgorCSAqIHdha2UgdXAgQUNTSQorCSAqLworCVdSSVRFTU9ERShETUFfRkRDIHwgRE1BX1dJTkRPVyB8IFJFR19BQ1NJKTsKKwkvKgorCSAqIHdyaXRlIGNvbW1hbmQgYnl0ZQorCSAqLworCVdSSVRFQk9USCgodGFyZ2V0IDw8IDUpIHwgKGJ5dGUgJiAweDFGKSwgRE1BX0ZEQyB8CisJICAgICAgICAgIERNQV9XSU5ET1cgfCBSRUdfQUNTSSB8IEExKTsKKwlyZXR1cm4gKCFhY3NpX3dhaXRfZm9yX0lSUShUSU1FT1VUQ01EKSk7Cit9CisKKy8qIFNlbmQgdGhlIHJlc3Qgb2YgYW4gY29tbWFuZCBibG9jayAqLworCitzdGF0aWMgaW50CitzZW5kXzFfNSAobHVuLCBjb21tYW5kLCBkbWEpCisJaW50IGx1bjsKKwl1bnNpZ25lZCBjaGFyICpjb21tYW5kOworCWludCBkbWE7Cit7CisJaW50IGksIGo7CisKKwlmb3IgKGk9MDsgaTw1OyBpKyspIHsKKwkJV1JJVEVCT1RIKCghaSA/ICgoKGx1biAmIDB4NykgPDwgNSkgfCAoY29tbWFuZFtpXSAmIDB4MUYpKQorCQkJICAgICAgOiBjb21tYW5kW2ldKSwKKwkJCSAgcncgfCBSRUdfQUNTSSB8IERNQV9XSU5ET1cgfAorCQkJICAgKChpIDwgNCkgPyBETUFfRkRDCisJCQkJICAgIDogKGRtYSA/IERNQV9BQ1NJCisJCQkJCSAgIDogRE1BX0ZEQykpIHwgQTEpOworCQlpZiAoaSA8IDQgJiYgKGogPSAhYWNzaV93YWl0X2Zvcl9JUlEoVElNRU9VVENNRCkpKQorCQkJcmV0dXJuIChqKTsKKwl9CisJcmV0dXJuICgwKTsKK30KKworLyogUmVhZCBhIHN0YXR1cyBieXRlICovCisKK3N0YXRpYyBpbnQKK2dldF9zdGF0dXMgKHZvaWQpCit7CisJV1JJVEVNT0RFKERNQV9GREMgfCBETUFfV0lORE9XIHwgUkVHX0FDU0kgfCBBMSk7CisJYWNzaV9kZWxheV9zdGFydCgpOworCXJldHVybiAoKGludCkoREFDQ0VTUyAmIDB4RkYpKTsKK30KKworLyogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgYnl0ZXMgKi8KKworc3RhdGljIGludAorY2FsY19yZWNlaXZlZCAoc3RhcnRfYWRkcmVzcykKKwl2b2lkICpzdGFydF9hZGRyZXNzOworeworCXJldHVybiAoaW50KSgKKwkJKCgodW5zaWduZWQgbG9uZylETUFISUdIIDw8IDE2KSB8ICgodW5zaWduZWQpRE1BTUlEIDw8IDgpIHwgRE1BTE9XKQorCSAgICAgIC0gKHVuc2lnbmVkIGxvbmcpc3RhcnRfYWRkcmVzcyk7Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgbWlkbGV2ZWwgcm91dGluZXMgc3RpbGwgd29yayBvbiBwaHlzaWNhbCBhZGRyZXNzZXMgLi4uICovCisKKy8qIHN0YXJ0KCkgc3RhcnRzIHRoZSBQQU0ncyBETUEgYWRhcHRvciAqLworCitzdGF0aWMgdm9pZAorc3RhcnQgKHRhcmdldCkKKwlpbnQgdGFyZ2V0OworeworCXNlbmRfZmlyc3QodGFyZ2V0LCBTVEFSVCk7Cit9CisKKy8qIHN0b3AoKSBzdG9wcyB0aGUgUEFNJ3MgRE1BIGFkYXB0b3IgYW5kIHJldHVybnMgYSB2YWx1ZSBvZiB6ZXJvIGluIGNhc2Ugb2Ygc3VjY2VzcyAqLworCitzdGF0aWMgaW50CitzdG9wICh0YXJnZXQpCisJaW50IHRhcmdldDsKK3sKKwlpbnQgcmV0ID0gLTE7CisJdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzVdOworCisJaWYgKHNlbmRfZmlyc3QodGFyZ2V0LCBTVE9QKSkKKwkJZ290byBiYWQ7CisJY21kX2J1ZmZlclswXSA9IGNtZF9idWZmZXJbMV0gPSBjbWRfYnVmZmVyWzJdID0KKwljbWRfYnVmZmVyWzNdID0gY21kX2J1ZmZlcls0XSA9IDA7CisJaWYgKHNlbmRfMV81KDcsIGNtZF9idWZmZXIsIDApIHx8CisJICAgICFhY3NpX3dhaXRfZm9yX0lSUShUSU1FT1VURE1BKSB8fAorCSAgICBnZXRfc3RhdHVzKCkpCisJCWdvdG8gYmFkOworCXJldCA9IDA7CitiYWQ6CisJcmV0dXJuIChyZXQpOworfQorCisvKiB0ZXN0cGt0KCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIHBhY2tldHMgd2FpdGluZyBpbiB0aGUgcXVldWUgKi8KKworc3RhdGljIGludAordGVzdHBrdCh0YXJnZXQpCisJaW50IHRhcmdldDsKK3sKKwlpbnQgcmV0ID0gLTE7CisKKwlpZiAoc2VuZF9maXJzdCh0YXJnZXQsIE5VTVBLVFMpKQorCQlnb3RvIGJhZDsKKwlyZXQgPSBnZXRfc3RhdHVzKCk7CitiYWQ6CisJcmV0dXJuIChyZXQpOworfQorCisvKiBpbnF1aXJ5KCkgcmV0dXJucyAwIHdoZW4gUEFNJ3MgRE1BIGZvdW5kLCAtMSB3aGVuIHRpbWVvdXQsIC0yIG90aGVyd2lzZSAqLworLyogUGxlYXNlIG5vdGU6IFRoZSBidWZmZXIgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5IGJ1dCBtdXN0IGJlIGRlZmluZWQhICAgKi8KKworc3RhdGljIGludAoraW5xdWlyeSAodGFyZ2V0LCBidWZmZXIpCisJaW50IHRhcmdldDsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI7Cit7CisJaW50IHJldCA9IC0xOworCXVuc2lnbmVkIGNoYXIgKnZidWZmZXIgPSBwaHlzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpYnVmZmVyKTsKKwl1bnNpZ25lZCBjaGFyIGNtZF9idWZmZXJbNV07CisKKwlpZiAoc2VuZF9maXJzdCh0YXJnZXQsIElOUVVJUlkpKQorCQlnb3RvIGJhZDsKKwlzZXR1cF9kbWEoYnVmZmVyLCBSRUFELCAxKTsKKwl2YnVmZmVyWzhdID0gdmJ1ZmZlclsyN10gPSAwOyAvKiBBdm9pZCBjb25mdXNpb24gd2l0aCBwcmV2aW91cyByZWFkIGRhdGEgKi8KKwljbWRfYnVmZmVyWzBdID0gY21kX2J1ZmZlclsxXSA9IGNtZF9idWZmZXJbMl0gPSBjbWRfYnVmZmVyWzRdID0gMDsKKwljbWRfYnVmZmVyWzNdID0gNDg7CisJaWYgKHNlbmRfMV81KDUsIGNtZF9idWZmZXIsIDEpIHx8CisJICAgICFhY3NpX3dhaXRfZm9yX0lSUShUSU1FT1VURE1BKSB8fAorCSAgICBnZXRfc3RhdHVzKCkgfHwKKwkgICAgKGNhbGNfcmVjZWl2ZWQoYnVmZmVyKSA8IDMyKSkKKwkJZ290byBiYWQ7CisJZG1hX2NhY2hlX21haW50ZW5hbmNlKCh1bnNpZ25lZCBsb25nKShidWZmZXIrOCksIDIwLCAwKTsKKwlpZiAobWVtY21wKGlucXVpcmU4LCB2YnVmZmVyKzgsIDIwKSkKKwkJZ290byBiYWQ7CisJcmV0ID0gMDsKK2JhZDoKKwlpZiAoISFORVRfREVCVUcpIHsKKwkJdmJ1ZmZlcls4KzIwXT0wOworCQlwcmludGsoImlucXVpcnkgb2YgdGFyZ2V0ICVkOiAlc1xuIiwgdGFyZ2V0LCB2YnVmZmVyKzgpOworCX0KKwlyZXR1cm4gKHJldCk7Cit9CisKKy8qCisgKiByZWFkX2h3X2FkZHIoKSByZWFkcyB0aGUgc2VjdG9yIGNvbnRhaW5pbmcgdGhlIGh3YWRkciBhbmQgcmV0dXJucworICogYSBwb2ludGVyIHRvIGl0ICh2aXJ0dWFsIGFkZHJlc3MhKSBvciAwIGluIGNhc2Ugb2YgYW4gZXJyb3IKKyAqLworCitzdGF0aWMgSEFERFIKKypyZWFkX2h3X2FkZHIodGFyZ2V0LCBidWZmZXIpCisJaW50IHRhcmdldDsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI7Cit7CisJSEFERFIgKnJldCA9IDA7CisJdW5zaWduZWQgY2hhciBjbWRfYnVmZmVyWzVdOworCisJaWYgKHNlbmRfZmlyc3QodGFyZ2V0LCBSRUFEU0VDVE9SKSkKKwkJZ290byBiYWQ7CisJc2V0dXBfZG1hKGJ1ZmZlciwgUkVBRCwgMSk7CisJY21kX2J1ZmZlclswXSA9IGNtZF9idWZmZXJbMV0gPSBjbWRfYnVmZmVyWzJdID0gY21kX2J1ZmZlcls0XSA9IDA7CisJY21kX2J1ZmZlclszXSA9IDE7CisJaWYgKHNlbmRfMV81KDUsIGNtZF9idWZmZXIsIDEpIHx8CisJICAgICFhY3NpX3dhaXRfZm9yX0lSUShUSU1FT1VURE1BKSB8fAorCSAgICBnZXRfc3RhdHVzKCkpCisJCWdvdG8gYmFkOworCXJldCA9IHBoeXNfdG9fdmlydCgodW5zaWduZWQgbG9uZykmKCgoRE1BSFdBRERSICopYnVmZmVyKS0+aHdhZGRyKSk7CisJZG1hX2NhY2hlX21haW50ZW5hbmNlKCh1bnNpZ25lZCBsb25nKWJ1ZmZlciwgNTEyLCAwKTsKK2JhZDoKKwlyZXR1cm4gKHJldCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorcGFtc25ldF9pbnRyKGlycSwgZGF0YSwgZnApCisJaW50IGlycTsKKwl2b2lkICpkYXRhOworCXN0cnVjdCBwdF9yZWdzICpmcDsKK3sKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIHJlY2VpdmVwa3QoKSBsb2FkcyBhIHBhY2tldCB0byBhIGdpdmVuIGJ1ZmZlciBhbmQgcmV0dXJucyBpdHMgbGVuZ3RoICovCisKK3N0YXRpYyBpbnQKK3JlY2VpdmVwa3QgKHRhcmdldCwgYnVmZmVyKQorCWludCB0YXJnZXQ7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyOworeworCWludCByZXQgPSAtMTsKKwl1bnNpZ25lZCBjaGFyIGNtZF9idWZmZXJbNV07CisKKwlpZiAoc2VuZF9maXJzdCh0YXJnZXQsIFJFQURQS1QpKQorCQlnb3RvIGJhZDsKKwlzZXR1cF9kbWEoYnVmZmVyLCBSRUFELCAzKTsKKwljbWRfYnVmZmVyWzBdID0gY21kX2J1ZmZlclsxXSA9IGNtZF9idWZmZXJbMl0gPSBjbWRfYnVmZmVyWzRdID0gMDsKKwljbWRfYnVmZmVyWzNdID0gMzsKKwlpZiAoc2VuZF8xXzUoNywgY21kX2J1ZmZlciwgMSkgfHwKKwkgICAgIWFjc2lfd2FpdF9mb3JfSVJRKFRJTUVPVVRETUEpIHx8CisJICAgIGdldF9zdGF0dXMoKSkKKwkJZ290byBiYWQ7CisJcmV0ID0gY2FsY19yZWNlaXZlZChidWZmZXIpOworYmFkOgorCXJldHVybiAocmV0KTsKK30KKworLyogc2VuZHBrdCgpIHNlbmRzIGEgcGFja2V0IGFuZCByZXR1cm5zIGEgdmFsdWUgb2YgemVybyB3aGVuIHRoZSBwYWNrZXQgd2FzIHNlbnQKKyAgICAgICAgICAgICBzdWNjZXNzZnVsbHkgKi8KKworc3RhdGljIGludAorc2VuZHBrdCAodGFyZ2V0LCBidWZmZXIsIGxlbmd0aCkKKwlpbnQgdGFyZ2V0OworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKwlpbnQgbGVuZ3RoOworeworCWludCByZXQgPSAtMTsKKwl1bnNpZ25lZCBjaGFyIGNtZF9idWZmZXJbNV07CisKKwlpZiAoc2VuZF9maXJzdCh0YXJnZXQsIFdSSVRFUEtUKSkKKwkJZ290byBiYWQ7CisJc2V0dXBfZG1hKGJ1ZmZlciwgV1JJVEUsIDMpOworCWNtZF9idWZmZXJbMF0gPSBjbWRfYnVmZmVyWzFdID0gY21kX2J1ZmZlcls0XSA9IDA7CisJY21kX2J1ZmZlclsyXSA9IGxlbmd0aCA+PiA4OworCWNtZF9idWZmZXJbM10gPSBsZW5ndGggJiAweEZGOworCWlmIChzZW5kXzFfNSg3LCBjbWRfYnVmZmVyLCAxKSB8fAorCSAgICAhYWNzaV93YWl0X2Zvcl9JUlEoVElNRU9VVERNQSkgfHwKKwkgICAgZ2V0X3N0YXR1cygpKQorCQlnb3RvIGJhZDsKKwlyZXQgPSAwOworYmFkOgorCXJldHVybiAocmV0KTsKK30KKworLyogVGhlIGZvbGxvd2luZyBoaWdoZXIgbGV2ZWwgcm91dGluZXMgd29yayBvbiB2aXJ0dWFsIGFkZHJlc3NlcyBhbmQgY29udmVydCB0aGVtIHRvCisgKiBwaHlzaWNhbCBhZGRyZXNzZXMgd2hlbiBwYXNzZWQgdG8gdGhlIGxvd2xldmVsIHJvdXRpbmVzLiBJdCdzIHVwIHRvIHRoZSBoaWdoZXIgbGV2ZWwKKyAqIHJvdXRpbmVzIHRvIGNvcHkgZGF0YSBmcm9tIEFsdGVybmF0ZSBSQU0gdG8gU1QgUkFNIGlmIG5lY2Nlc2FyeSEKKyAqLworCisvKiBDaGVjayBmb3IgYSBuZXR3b3JrIGFkYXB0b3Igb2YgdGhpcyB0eXBlLCBhbmQgcmV0dXJuICcwJyBpZiBvbmUgZXhpc3RzLgorICovCisKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IHBhbXNuZXRfcHJvYmUgKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGk7CisJSEFERFIgKmh3YWRkcjsKKwlpbnQgZXJyOworCisJdW5zaWduZWQgY2hhciBzdGF0aW9uX2FkZHJbNl07CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKwkvKiBhdm9pZCAiUHJvYmluZyBmb3IuLi4iIHByaW50ZWQgNCB0aW1lcyAtIHRoZSBkcml2ZXIgaXMgc3VwcG9ydGluZyBvbmx5IG9uZSBhZGFwdGVyIG5vdyEgKi8KKwlzdGF0aWMgaW50IG5vX21vcmVfZm91bmQ7CisKKwlpZiAobm9fbW9yZV9mb3VuZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisJbm9fbW9yZV9mb3VuZCA9IDE7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwl9CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJcHJpbnRrKCJQcm9iaW5nIGZvciBQQU0ncyBOZXQvR0sgQWRhcHRlci4uLlxuIik7CisKKwkvKiBBbGxvY2F0ZSB0aGUgRE1BIGJ1ZmZlciBoZXJlIHNpbmNlIHdlIG5lZWQgaXQgZm9yIHByb2JpbmchICovCisKKwluaWNfcGFja2V0ID0gKHN0cnVjdCBuaWNfcGt0X3MgKilhY3NpX2J1ZmZlcjsKKwlwaHlzX25pY19wYWNrZXQgPSAodW5zaWduZWQgY2hhciAqKXBoeXNfYWNzaV9idWZmZXI7CisJaWYgKHBhbXNuZXRfZGVidWcgPiAwKSB7CisJCXByaW50aygibmljX3BhY2tldCBhdCAweCVwLCBwaHlzIGF0IDB4JXBcbiIsCisJCQkgICBuaWNfcGFja2V0LCBwaHlzX25pY19wYWNrZXQgKTsKKwl9CisKKwlzdGRtYV9sb2NrKHBhbXNuZXRfaW50ciwgTlVMTCk7CisJRElTQUJMRV9JUlEoKTsKKworCWZvciAoaT0wOyBpPDg7IGkrKykgeworCQkvKiBEbyB0d28gaW5xdWlyaWVzIHRvIGNvdmVyIGNhc2VzIHdpdGggc3RyYW5nZSBlcXVpcG1lbnQgb24gcHJldmlvdXMgSUQgKi8KKwkJLyogYmxvY2tpbmcgdGhlIEFDU0kgYnVzIChsaWtlIHRoZSBTTE1DODA0IGxhc2VyIHByaW50ZXIgY29udHJvbGxlci4uLiAgICovCisJCWlucXVpcnkoaSwgcGh5c19uaWNfcGFja2V0KTsKKwkJaWYgKCFpbnF1aXJ5KGksIHBoeXNfbmljX3BhY2tldCkpIHsKKwkJCWxhbmNlX3RhcmdldCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghIU5FVF9ERUJVRykKKwkJcHJpbnRrKCJJRDogJWRcbiIsaSk7CisKKwlpZiAobGFuY2VfdGFyZ2V0ID49IDApIHsKKwkJaWYgKCEoaHdhZGRyID0gcmVhZF9od19hZGRyKGxhbmNlX3RhcmdldCwgcGh5c19uaWNfcGFja2V0KSkpCisJCQlsYW5jZV90YXJnZXQgPSAtMTsKKwkJZWxzZQorCQkJbWVtY3B5IChzdGF0aW9uX2FkZHIsIGh3YWRkciwgRVRIX0FMRU4pOworCX0KKworCUVOQUJMRV9JUlEoKTsKKwlzdGRtYV9yZWxlYXNlKCk7CisKKwlpZiAobGFuY2VfdGFyZ2V0IDwgMCkgeworCQlwcmludGsoIk5vIFBBTSdzIE5ldC9HSyBmb3VuZC5cbiIpOworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKwl9CisKKwlpZiAocGFtc25ldF9kZWJ1ZyA+IDAgJiYgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKHZlcnNpb24pOworCisJcHJpbnRrKCIlczogJXMgZm91bmQgb24gdGFyZ2V0ICUwMWQsIGV0aC1hZGRyOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC5cbiIsCisJCWRldi0+bmFtZSwgIlBBTSdzIE5ldC9HSyIsIGxhbmNlX3RhcmdldCwKKwkJc3RhdGlvbl9hZGRyWzBdLCBzdGF0aW9uX2FkZHJbMV0sIHN0YXRpb25fYWRkclsyXSwKKwkJc3RhdGlvbl9hZGRyWzNdLCBzdGF0aW9uX2FkZHJbNF0sIHN0YXRpb25fYWRkcls1XSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbgkJPSBwYW1zbmV0X29wZW47CisJZGV2LT5zdG9wCQk9IHBhbXNuZXRfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBwYW1zbmV0X3NlbmRfcGFja2V0OworCWRldi0+Z2V0X3N0YXRzCQk9IG5ldF9nZXRfc3RhdHM7CisKKwkvKiBGaWxsIGluIHRoZSBmaWVsZHMgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUgd2l0aCBldGhlcm5ldC1nZW5lcmljCisJICogdmFsdWVzLiBUaGlzIHNob3VsZCBiZSBpbiBhIGNvbW1vbiBmaWxlIGluc3RlYWQgb2YgcGVyLWRyaXZlci4KKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7CisjaWYgMAorCQlkZXYtPmJyb2FkY2FzdFtpXSA9IDB4ZmY7CisjZW5kaWYKKwkJZGV2LT5kZXZfYWRkcltpXSAgPSBzdGF0aW9uX2FkZHJbaV07CisJfQorCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmICghZXJyKQorCQlyZXR1cm4gZGV2OworCisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCisvKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiAgVGhpcyBpcyBjYWxsZWQgKGluIHRoZSBjdXJyZW50IGtlcm5lbCkKKyAgIHNvbWV0aW1lIGFmdGVyIGJvb3Rpbmcgd2hlbiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KKworICAgVGhpcyByb3V0aW5lIHNob3VsZCBzZXQgZXZlcnl0aGluZyB1cCBhbmV3IGF0IGVhY2ggb3BlbiwgZXZlbgorICAgcmVnaXN0ZXJzIHRoYXQgInNob3VsZCIgb25seSBuZWVkIHRvIGJlIHNldCBvbmNlIGF0IGJvb3QsIHNvIHRoYXQKKyAgIHRoZXJlIGlzIG5vbi1yZWJvb3Qgd2F5IHRvIHJlY292ZXIgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuCisgKi8KK3N0YXRpYyBpbnQKK3BhbXNuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKHBhbXNuZXRfZGVidWcgPiAwKQorCQlwcmludGsoInBhbXNuZXRfb3BlblxuIik7CisJc3RkbWFfbG9jayhwYW1zbmV0X2ludHIsIE5VTEwpOworCURJU0FCTEVfSVJRKCk7CisKKwkvKiBSZXNldCB0aGUgaGFyZHdhcmUgaGVyZS4KKwkgKi8KKwlpZiAoIWlmX3VwKQorCQlzdGFydChsYW5jZV90YXJnZXQpOworCWlmX3VwID0gMTsKKwlscC0+b3Blbl90aW1lID0gMDsJLypqaWZmaWVzKi8KKwlscC0+cG9sbF90aW1lID0gTUFYX1BPTExfVElNRTsKKworCWRldi0+dGJ1c3kgPSAwOworCWRldi0+aW50ZXJydXB0ID0gMDsKKwlkZXYtPnN0YXJ0ID0gMTsKKworCUVOQUJMRV9JUlEoKTsKKwlzdGRtYV9yZWxlYXNlKCk7CisJcGFtc25ldF90aW1lci5kYXRhID0gKGxvbmcpZGV2OworCXBhbXNuZXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBscC0+cG9sbF90aW1lOworCWFkZF90aW1lcigmcGFtc25ldF90aW1lcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3BhbXNuZXRfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogQmxvY2sgYSB0aW1lci1iYXNlZCB0cmFuc21pdCBmcm9tIG92ZXJsYXBwaW5nLiAgVGhpcyBjb3VsZCBiZXR0ZXIgYmUKKwkgKiBkb25lIHdpdGggYXRvbWljX3N3YXAoMSwgZGV2LT50YnVzeSksIGJ1dCBzZXRfYml0KCkgd29ya3MgYXMgd2VsbC4KKwkgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZiAoc3RkbWFfaXNsb2NrZWQoKSkgeworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwl9CisJZWxzZSB7CisJCWludCBsZW5ndGggPSBFVEhfWkxFTiA8IHNrYi0+bGVuID8gc2tiLT5sZW4gOiBFVEhfWkxFTjsKKwkJdW5zaWduZWQgbG9uZyBidWYgPSB2aXJ0X3RvX3BoeXMoc2tiLT5kYXRhKTsKKwkJaW50IHN0YXQ7CisKKwkJc3RkbWFfbG9jayhwYW1zbmV0X2ludHIsIE5VTEwpOworCQlESVNBQkxFX0lSUSgpOworCisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJaWYoICFTVFJBTV9BRERSKGJ1ZitsZW5ndGgtMSkgKSB7CisJCQltZW1jcHkobmljX3BhY2tldC0+YnVmZmVyLCBza2ItPmRhdGEsIGxlbmd0aCk7CisJCQlidWYgPSAodW5zaWduZWQgbG9uZylwaHlzX25pY19wYWNrZXQ7CisJCX0KKworCQlkbWFfY2FjaGVfbWFpbnRlbmFuY2UoYnVmLCBsZW5ndGgsIDEpOworCisJCXN0YXQgPSBzZW5kcGt0KGxhbmNlX3RhcmdldCwgKHVuc2lnbmVkIGNoYXIgKilidWYsIGxlbmd0aCk7CisJCUVOQUJMRV9JUlEoKTsKKwkJc3RkbWFfcmVsZWFzZSgpOworCisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlkZXYtPnRidXN5CSA9IDA7CisJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCWxwLT5zdGF0cy50eF9ieXRlcys9bGVuZ3RoOworCX0KKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworLyogV2UgaGF2ZSBhIGdvb2QgcGFja2V0KHMpLCBnZXQgaXQvdGhlbSBvdXQgb2YgdGhlIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyB2b2lkCitwYW1zbmV0X3BvbGxfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgYm9ndXNjb3VudDsKKwlpbnQgcGt0X2xlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJLyogKytyb21hbjogVGFrZSBjYXJlIGF0IGxvY2tpbmcgdGhlIFNULURNQS4uLiBUaGlzIG11c3QgYmUgZG9uZSB3aXRoIGludHMKKwkgKiBvZmYsIHNpbmNlIG90aGVyd2lzZSBhbiBpbnQgY291bGQgc2xpcCBpbiBiZXR3ZWVuIHRoZSBxdWVzdGlvbiBhbmQgdGhlCisJICogbG9ja2luZyBpdHNlbGYsIGFuZCB0aGVuIHdlJ2QgZ28gdG8gc2xlZXAuLi4gQW5kIGxvY2tpbmcgaXRzZWxmIGlzCisJICogbmVjZXNzYXJ5IHRvIGtlZXAgdGhlIGZsb3BweV9jaGFuZ2UgdGltZXIgZnJvbSB3b3JraW5nIHdpdGggU1QtRE1BCisJICogcmVnaXN0ZXJzLiAqLworCWlmIChzdGRtYV9pc2xvY2tlZCgpKSB7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlzdGRtYV9sb2NrKHBhbXNuZXRfaW50ciwgTlVMTCk7CisJRElTQUJMRV9JUlEoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlib2d1c2NvdW50ID0gdGVzdHBrdChsYW5jZV90YXJnZXQpOworCWlmKCBscC0+cG9sbF90aW1lIDwgTUFYX1BPTExfVElNRSApIGxwLT5wb2xsX3RpbWUrKzsKKworCXdoaWxlKGJvZ3VzY291bnQtLSkgeworCQlwa3RfbGVuID0gcmVjZWl2ZXBrdChsYW5jZV90YXJnZXQsIHBoeXNfbmljX3BhY2tldCk7CisKKwkJaWYoIHBrdF9sZW4gPCA2MCApIGJyZWFrOworCisJCS8qIEdvb2QgcGFja2V0Li4uICovCisKKwkJZG1hX2NhY2hlX21haW50ZW5hbmNlKCh1bnNpZ25lZCBsb25nKXBoeXNfbmljX3BhY2tldCwgcGt0X2xlbiwgMCk7CisKKwkJbHAtPnBvbGxfdGltZSA9IHBhbXNuZXRfbWluX3BvbGxfdGltZTsgICAgLyogZmFzdCBwb2xsICovCisJCWlmKCBwa3RfbGVuID49IDYwICYmIHBrdF9sZW4gPD0gMjA0OCApIHsKKwkJCWlmIChwa3RfbGVuID4gMTUxNCkKKwkJCQlwa3RfbGVuID0gMTUxNDsKKworCQkJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuCisJCQkgKi8KKwkJCXNrYiA9IGFsbG9jX3NrYihwa3RfbGVuLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCXByaW50aygiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLAorCQkJCQlkZXYtPm5hbWUpOworCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlza2ItPmxlbiA9IHBrdF9sZW47CisJCQlza2ItPmRldiA9IGRldjsKKworCQkJLyogJ3NrYi0+ZGF0YScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4KKwkJCSAqLworCQkJbWVtY3B5KHNrYi0+ZGF0YSwgbmljX3BhY2tldC0+YnVmZmVyLCBwa3RfbGVuKTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCWxwLT5zdGF0cy5yeF9ieXRlcys9cGt0X2xlbjsKKwkJfQorCX0KKworCS8qIElmIGFueSB3b3J0aC13aGlsZSBwYWNrZXRzIGhhdmUgYmVlbiByZWNlaXZlZCwgZGV2X3JpbnQoKQorCSAgIGhhcyBkb25lIGEgbWFya19iaChJTkVUX0JIKSBmb3IgdXMgYW5kIHdpbGwgd29yayBvbiB0aGVtCisJICAgd2hlbiB3ZSBnZXQgdG8gdGhlIGJvdHRvbS1oYWxmIHJvdXRpbmUuCisJICovCisKKwlFTkFCTEVfSVJRKCk7CisJc3RkbWFfcmVsZWFzZSgpOworCXJldHVybjsKK30KKworLyogcGFtc25ldF90aWNrOiBjYWxsZWQgYnkgcGFtc25ldF90aW1lci4gUmVhZHMgcGFja2V0cyBmcm9tIHRoZSBhZGFwdGVyLAorICogcGFzc2VzIHRoZW0gdG8gdGhlIGhpZ2hlciBsYXllcnMgYW5kIHJlc3RhcnRzIHRoZSB0aW1lci4KKyAqLworc3RhdGljIHZvaWQKK3BhbXNuZXRfdGljayh1bnNpZ25lZCBsb25nIGRhdGEpIHsKKwlzdHJ1Y3QgbmV0X2RldmljZQkgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYoIHBhbXNuZXRfZGVidWcgPiAwICYmIChscC0+b3Blbl90aW1lKysgJiA3KSA9PSA4ICkKKwkJcHJpbnRrKCJwYW1zbmV0X3RpY2s6ICVsZFxuIiwgbHAtPm9wZW5fdGltZSk7CisKKwlwYW1zbmV0X3BvbGxfcngoZGV2KTsKKworCXBhbXNuZXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBscC0+cG9sbF90aW1lOworCWFkZF90aW1lcigmcGFtc25ldF90aW1lcik7Cit9CisKKy8qIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gcGFtc25ldF9vcGVuKCkuCisgKi8KK3N0YXRpYyBpbnQKK3BhbXNuZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChwYW1zbmV0X2RlYnVnID4gMCkKKwkJcHJpbnRrKCJwYW1zbmV0X2Nsb3NlLCBvcGVuX3RpbWU9JWxkXG4iLCBscC0+b3Blbl90aW1lKTsKKwlkZWxfdGltZXIoJnBhbXNuZXRfdGltZXIpOworCXN0ZG1hX2xvY2socGFtc25ldF9pbnRyLCBOVUxMKTsKKwlESVNBQkxFX0lSUSgpOworCisJaWYgKGlmX3VwKQorCQlzdG9wKGxhbmNlX3RhcmdldCk7CisJaWZfdXAgPSAwOworCisJbHAtPm9wZW5fdGltZSA9IDA7CisKKwlkZXYtPnRidXN5ID0gMTsKKwlkZXYtPnN0YXJ0ID0gMDsKKworCUVOQUJMRV9JUlEoKTsKKwlzdGRtYV9yZWxlYXNlKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLgorICAgVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvciBjbG9zZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKworI2lmZGVmIE1PRFVMRQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnBhbV9kZXY7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCXBhbV9kZXYgPSBwYW1zbmV0X3Byb2JlKC0xKTsKKwlpZiAoSVNfRVJSKHBhbV9kZXYpKQorCQlyZXR1cm4gUFRSX0VSUihwYW1fZGV2KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXVucmVnaXN0ZXJfbmV0ZGV2KHBhbV9kZXYpOworCWZyZWVfbmV0ZGV2KHBhbV9kZXYpOworfQorCisjZW5kaWYgLyogTU9EVUxFICovCisKKy8qIExvY2FsIHZhcmlhYmxlczoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURfX0tFUk5FTF9fIC1JL3Vzci9zcmMvbGludXgvaW5jbHVkZQorCS1iIG02OGstbGludXhhb3V0IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU8yCisJLWZvbWl0LWZyYW1lLXBvaW50ZXIgLXBpcGUgLURNT0RVTEUgLUkuLi8uLi9uZXQvaW5ldCAtYyBhdGFyaV9wYW1zbmV0LmMiCisgKiAgdmVyc2lvbi1jb250cm9sOiB0CisgKiAga2VwdC1uZXctdmVyc2lvbnM6IDUKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXRhcmlsYW5jZS5jIGIvZHJpdmVycy9uZXQvYXRhcmlsYW5jZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMDExMjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9hdGFyaWxhbmNlLmMKQEAgLTAsMCArMSwxMjA2IEBACisvKiBhdGFyaWxhbmNlLmM6IEV0aGVybmV0IGRyaXZlciBmb3IgVk1FIExhbmNlIGNhcmRzIG9uIHRoZSBBdGFyaSAqLworLyoKKwlXcml0dGVuIDE5OTUvOTYgYnkgUm9tYW4gSG9kZWsgKFJvbWFuLkhvZGVrQGluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlKQorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlUaGlzIGRyaXZlcnMgd2FzIHdyaXR0ZW4gd2l0aCB0aGUgZm9sbG93aW5nIHNvdXJjZXMgb2YgcmVmZXJlbmNlOgorCSAtIFRoZSBkcml2ZXIgZm9yIHRoZSBSaWVibCBMYW5jZSBjYXJkIGJ5IHRoZSBUVSBWaWVubmEuCisJIC0gVGhlIG1vZGlmaWVkIFRVVyBkcml2ZXIgZm9yIFBBTSdzIFZNRSBjYXJkcworCSAtIFRoZSBQQy1MaW51eCBkcml2ZXIgZm9yIExhbmNlIGNhcmRzIChidXQgdGhpcyBpcyBmb3IgYnVzIG1hc3RlcgorICAgICAgIGNhcmRzLCBub3QgdGhlIHNoYXJlZCBtZW1vcnkgb25lcykKKwkgLSBUaGUgQW1pZ2EgQXJpYWRuZSBkcml2ZXIKKworCXYxLjA6IChpbiAxLjIuMTNwbDQvMC45LjEzKQorCSAgICAgIEluaXRpYWwgdmVyc2lvbgorCXYxLjE6IChpbiAxLjIuMTNwbDUpCisJICAgICAgbW9yZSBjb21tZW50cworCQkgIGRlbGV0ZWQgc29tZSBkZWJ1Z2dpbmcgc3R1ZmYKKwkJICBvcHRpbWl6ZWQgcmVnaXN0ZXIgYWNjZXNzIChrZWVwIEFSRUcgcG9pbnRpbmcgdG8gQ1NSMCkKKwkJICBmb2xsb3dpbmcgQU1ELCBDU1IwX1NUUlQgc2hvdWxkIGJlIHNldCBvbmx5IGFmdGVyIElET04gaXMgZGV0ZWN0ZWQKKwkJICB1c2UgbWVtY3B5KCkgZm9yIGRhdGEgdHJhbnNmZXJzLCB0aGF0IGFsc28gZW1wbG95cyBsb25nIHdvcmQgbW92ZXMKKwkJICBiZXR0ZXIgcHJvYmUgcHJvY2VkdXJlIGZvciAyNC1iaXQgc3lzdGVtcworICAgICAgICAgIG5vbi1WTUUtUmllYmxDYXJkcyBuZWVkIGV4dHJhIGRlbGF5cyBpbiBtZW1jcHkKKwkJICBtdXN0IGFsc28gZG8gd3JpdGUgdGVzdCwgc2luY2UgMHhmeGUwMDAwMCBtYXkgaGl0IFJPTQorCQkgIHVzZSA4LzMyIHR4L3J4IGJ1ZmZlcnMsIHdoaWNoIHNob3VsZCBnaXZlIGJldHRlciBORlMgcGVyZm9ybWFuY2U7CisJCSAgICB0aGlzIGlzIG1hZGUgcG9zc2libGUgYnkgc2hpZnRpbmcgdGhlIGxhc3QgcGFja2V0IGJ1ZmZlciBhZnRlciB0aGUKKwkJICAgIFJpZWJsQ2FyZCByZXNlcnZlZCBhcmVhCisgICAgdjEuMjogKGluIDEuMi4xM3BsOCkKKwkgICAgICBhZ2FpbiBmaXhlZCBwcm9iaW5nIGZvciB0aGUgRmFsY29uOyAweGZlMDEwMDAgaGl0cyBwaHlzLiAweDAwMDEwMDAwCisJCSAgYW5kIHRodXMgUkFNLCBpbiBjYXNlIG9mIG5vIExhbmNlIGZvdW5kIGFsbCBtZW1vcnkgY29udGVudHMgaGF2ZSB0bworCQkgIGJlIHJlc3RvcmVkIQorCQkgIE5vdyBwb3NzaWJsZSB0byBjb21waWxlIGFzIG1vZHVsZS4KKwl2MS4zOiAwMy8zMC85NiBKZXMgU29yZW5zZW4sIFJvbWFuIChpbiAxLjMpCisJICAgICAgU2V2ZXJhbCBsaXR0bGUgMS4zIGFkYXB0aW9ucworCQkgIFdoZW4gdGhlIGxhbmNlIGlzIHN0b3BwZWQgaXQganVtcHMgYmFjayBpbnRvIGxpdHRsZS1lbmRpYW4KKwkJICBtb2RlLiBJdCBpcyB0aGVyZWZvcmUgbmVjZXNzYXJ5IHRvIHB1dCBpdCBiYWNrIHdoZXJlIGl0CisJCSAgYmVsb25ncywgaW4gYmlnIGVuZGlhbiBtb2RlLCBpbiBvcmRlciB0byBtYWtlIHRoaW5ncyB3b3JrLgorCQkgIFRoaXMgbWlnaHQgYmUgdGhlIHJlYXNvbiB3aHkgbXVsdGljYXN0LW1vZGUgZGlkbid0IHdvcmsKKwkJICBiZWZvcmUsIGJ1dCBJJ20gbm90IGFibGUgdG8gdGVzdCBpdCBhcyBJIG9ubHkgZ290IGFuIEFtaWdhCisJCSAgKHdlIGhhZCBzaW1pbGFyIHByb2JsZW1zIHdpdGggdGhlIEEyMDY1IGRyaXZlcikuCisKKyovCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSA9ICJhdGFyaWxhbmNlLmM6IHYxLjMgMDQvMDQvOTYgIgorCQkJCQkgICAiUm9tYW4uSG9kZWtAaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGVcbiI7CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYXRhcmlody5oPgorI2luY2x1ZGUgPGFzbS9hdGFyaWludHMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyogRGVidWcgbGV2ZWw6CisgKiAgMCA9IHNpbGVudCwgcHJpbnQgb25seSBzZXJpb3VzIGVycm9ycworICogIDEgPSBub3JtYWwsIHByaW50IGVycm9yIG1lc3NhZ2VzCisgKiAgMiA9IGRlYnVnLCBwcmludCBkZWJ1ZyBpbmZvcworICogIDMgPSBkZWJ1ZywgcHJpbnQgZXZlbiBtb3JlIGRlYnVnIGluZm9zIChwYWNrZXQgZGF0YSkKKyAqLworCisjZGVmaW5lCUxBTkNFX0RFQlVHCTEKKworI2lmZGVmIExBTkNFX0RFQlVHCitzdGF0aWMgaW50IGxhbmNlX2RlYnVnID0gTEFOQ0VfREVCVUc7CisjZWxzZQorc3RhdGljIGludCBsYW5jZV9kZWJ1ZyA9IDE7CisjZW5kaWYKK01PRFVMRV9QQVJNKGxhbmNlX2RlYnVnLCAiaSIpOworTU9EVUxFX1BBUk1fREVTQyhsYW5jZV9kZWJ1ZywgImF0YXJpbGFuY2UgZGVidWcgbGV2ZWwgKDAtMykiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogUHJpbnQgZGVidWcgbWVzc2FnZXMgb24gcHJvYmluZz8gKi8KKyN1bmRlZiBMQU5DRV9ERUJVR19QUk9CRQorCisjZGVmaW5lCURQUklOVEsobixhKQkJCQkJCQlcCisJZG8gewkJCQkJCQkJCQlcCisJCWlmIChsYW5jZV9kZWJ1ZyA+PSBuKQkJCQkJXAorCQkJcHJpbnRrIGE7CQkJCQkJCVwKKwl9IHdoaWxlKCAwICkKKworI2lmZGVmIExBTkNFX0RFQlVHX1BST0JFCisjIGRlZmluZSBQUk9CRV9QUklOVChhKQlwcmludGsgYQorI2Vsc2UKKyMgZGVmaW5lIFBST0JFX1BSSU5UKGEpCisjZW5kaWYKKworLyogVGhlc2UgZGVmaW5lIHRoZSBudW1iZXIgb2YgUnggYW5kIFR4IGJ1ZmZlcnMgYXMgbG9nMi4gKE9ubHkgcG93ZXJzCisgKiBvZiB0d28gYXJlIHZhbGlkKQorICogTXVjaCBtb3JlIHJ4IGJ1ZmZlcnMgKDMyKSBhcmUgcmVzZXJ2ZWQgdGhhbiB0eCBidWZmZXJzICg4KSwgc2luY2UgcmVjZWl2aW5nCisgKiBpcyBtb3JlIHRpbWUgY3JpdGljYWwgdGhlbiBzZW5kaW5nIGFuZCBwYWNrZXRzIG1heSBoYXZlIHRvIHJlbWFpbiBpbiB0aGUKKyAqIGJvYXJkJ3MgbWVtb3J5IHdoZW4gbWFpbiBtZW1vcnkgaXMgbG93LgorICovCisKKyNkZWZpbmUgVFhfTE9HX1JJTkdfU0laRQkJCTMKKyNkZWZpbmUgUlhfTE9HX1JJTkdfU0laRQkJCTUKKworLyogVGhlc2UgYXJlIHRoZSBkZXJpdmVkIHZhbHVlcyAqLworCisjZGVmaW5lIFRYX1JJTkdfU0laRQkJCSgxIDw8IFRYX0xPR19SSU5HX1NJWkUpCisjZGVmaW5lIFRYX1JJTkdfTEVOX0JJVFMJCShUWF9MT0dfUklOR19TSVpFIDw8IDUpCisjZGVmaW5lCVRYX1JJTkdfTU9EX01BU0sJCShUWF9SSU5HX1NJWkUgLSAxKQorCisjZGVmaW5lIFJYX1JJTkdfU0laRQkJCSgxIDw8IFJYX0xPR19SSU5HX1NJWkUpCisjZGVmaW5lIFJYX1JJTkdfTEVOX0JJVFMJCShSWF9MT0dfUklOR19TSVpFIDw8IDUpCisjZGVmaW5lCVJYX1JJTkdfTU9EX01BU0sJCShSWF9SSU5HX1NJWkUgLSAxKQorCisjZGVmaW5lIFRYX1RJTUVPVVQJMjAKKworLyogVGhlIExBTkNFIFJ4IGFuZCBUeCByaW5nIGRlc2NyaXB0b3JzLiAqLworc3RydWN0IGxhbmNlX3J4X2hlYWQgeworCXVuc2lnbmVkIHNob3J0CQkJYmFzZTsJCS8qIExvdyB3b3JkIG9mIGJhc2UgYWRkciAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJZmxhZzsKKwl1bnNpZ25lZCBjaGFyCQkJYmFzZV9oaTsJLyogSGlnaCB3b3JkIG9mIGJhc2UgYWRkciAodW51c2VkKSAqLworCXNob3J0CQkJCQlidWZfbGVuZ3RoOwkvKiBUaGlzIGxlbmd0aCBpcyAycyBjb21wbGVtZW50ISAqLworCXZvbGF0aWxlIHNob3J0CQkJbXNnX2xlbmd0aDsJLyogVGhpcyBsZW5ndGggaXMgIm5vcm1hbCIuICovCit9OworCitzdHJ1Y3QgbGFuY2VfdHhfaGVhZCB7CisJdW5zaWduZWQgc2hvcnQJCQliYXNlOwkJLyogTG93IHdvcmQgb2YgYmFzZSBhZGRyICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhcglmbGFnOworCXVuc2lnbmVkIGNoYXIJCQliYXNlX2hpOwkvKiBIaWdoIHdvcmQgb2YgYmFzZSBhZGRyICh1bnVzZWQpICovCisJc2hvcnQJCQkJCWxlbmd0aDsJCS8qIExlbmd0aCBpcyAycyBjb21wbGVtZW50ISAqLworCXZvbGF0aWxlIHNob3J0CQkJbWlzYzsKK307CisKK3N0cnVjdCByaW5nZGVzYyB7CisJdW5zaWduZWQgc2hvcnQJYWRyX2xvOwkJLyogTG93IDE2IGJpdHMgb2YgYWRkcmVzcyAqLworCXVuc2lnbmVkIGNoYXIJbGVuOwkJLyogTGVuZ3RoIGJpdHMgKi8KKwl1bnNpZ25lZCBjaGFyCWFkcl9oaTsJCS8qIEhpZ2ggOCBiaXRzIG9mIGFkZHJlc3MgKHVudXNlZCkgKi8KK307CisKKy8qIFRoZSBMQU5DRSBpbml0aWFsaXphdGlvbiBibG9jaywgZGVzY3JpYmVkIGluIGRhdGFib29rLiAqLworc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgeworCXVuc2lnbmVkIHNob3J0CW1vZGU7CQkvKiBQcmUtc2V0IG1vZGUgKi8KKwl1bnNpZ25lZCBjaGFyCWh3YWRkcls2XTsJLyogUGh5c2ljYWwgZXRoZXJuZXQgYWRkcmVzcyAqLworCXVuc2lnbmVkCQlmaWx0ZXJbMl07CS8qIE11bHRpY2FzdCBmaWx0ZXIgKHVudXNlZCkuICovCisJLyogUmVjZWl2ZSBhbmQgdHJhbnNtaXQgcmluZyBiYXNlLCBhbG9uZyB3aXRoIGxlbmd0aCBiaXRzLiAqLworCXN0cnVjdCByaW5nZGVzYwlyeF9yaW5nOworCXN0cnVjdCByaW5nZGVzYwl0eF9yaW5nOworfTsKKworLyogVGhlIHdob2xlIGxheW91dCBvZiB0aGUgTGFuY2Ugc2hhcmVkIG1lbW9yeSAqLworc3RydWN0IGxhbmNlX21lbW9yeSB7CisJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sJaW5pdDsKKwlzdHJ1Y3QgbGFuY2VfdHhfaGVhZAl0eF9oZWFkW1RYX1JJTkdfU0laRV07CisJc3RydWN0IGxhbmNlX3J4X2hlYWQJcnhfaGVhZFtSWF9SSU5HX1NJWkVdOworCWNoYXIJCQkJCXBhY2tldF9hcmVhWzBdOwkvKiBwYWNrZXQgZGF0YSBmb2xsb3cgYWZ0ZXIgdGhlCisJCQkJCQkJCQkJCSAqIGluaXQgYmxvY2sgYW5kIHRoZSByaW5nCisJCQkJCQkJCQkJCSAqIGRlc2NyaXB0b3JzIGFuZCBhcmUgbG9jYXRlZAorCQkJCQkJCQkJCQkgKiBhdCBydW50aW1lICovCit9OworCisvKiBSaWVibENhcmQgc3BlY2lmaWNzOgorICogVGhlIG9yaWdpbmFsIFRPUyBkcml2ZXIgZm9yIHRoZXNlIGNhcmRzIHJlc2VydmVzIHRoZSBhcmVhIGZyb20gb2Zmc2V0CisgKiAweGVlNzAgdG8gMHhlZWJiIGZvciBzdG9yaW5nIGNvbmZpZ3VyYXRpb24gZGF0YS4gT2YgaW50ZXJlc3QgdG8gdXMgaXMgdGhlCisgKiBFdGhlcm5ldCBhZGRyZXNzIHRoZXJlLCBhbmQgdGhlIG1hZ2ljIGZvciB2ZXJpZnlpbmcgdGhlIGRhdGEncyB2YWxpZGl0eS4KKyAqIFRoZSByZXNlcnZlZCBhcmVhIGlzbid0IHRvdWNoIGJ5IHBhY2tldCBidWZmZXJzLiBGdXJ0aGVybW9yZSwgb2Zmc2V0IDB4ZmZmZQorICogaXMgcmVzZXJ2ZWQgZm9yIHRoZSBpbnRlcnJ1cHQgdmVjdG9yIG51bWJlci4KKyAqLworI2RlZmluZQlSSUVCTF9SU1ZEX1NUQVJUCTB4ZWU3MAorI2RlZmluZQlSSUVCTF9SU1ZEX0VORAkJMHhlZWMwCisjZGVmaW5lIFJJRUJMX01BR0lDCQkJMHgwOTA1MTk5MAorI2RlZmluZSBSSUVCTF9NQUdJQ19BRERSCSgodW5zaWduZWQgbG9uZyAqKSgoKGNoYXIgKilNRU0pICsgMHhlZThhKSkKKyNkZWZpbmUgUklFQkxfSFdBRERSX0FERFIJKCh1bnNpZ25lZCBjaGFyICopKCgoY2hhciAqKU1FTSkgKyAweGVlOGUpKQorI2RlZmluZSBSSUVCTF9JVkVDX0FERFIJCSgodW5zaWduZWQgc2hvcnQgKikoKChjaGFyICopTUVNKSArIDB4ZmZmZSkpCisKKy8qIFRoaXMgaXMgYSBkZWZhdWx0IGFkZHJlc3MgZm9yIHRoZSBvbGQgUmllYmxDYXJkcyB3aXRob3V0IGEgYmF0dGVyeQorICogdGhhdCBoYXZlIG5vIGV0aGVybmV0IGFkZHJlc3MgYXQgYm9vdCB0aW1lLiAwMDowMDozNjowNCBpcyB0aGUKKyAqIHByZWZpeCBmb3IgUmllYmwgY2FyZHMsIHRoZSAwMDowMCBhdCB0aGUgZW5kIGlzIGFyYml0cmFyeS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBPbGRSaWVibERlZkh3YWRkcls2XSA9IHsKKwkweDAwLCAweDAwLCAweDM2LCAweDA0LCAweDAwLCAweDAwCit9OworCisKKy8qIEkvTyByZWdpc3RlcnMgb2YgdGhlIExhbmNlIGNoaXAgKi8KKworc3RydWN0IGxhbmNlX2lvcmVnIHsKKy8qIGJhc2UrMHgwICovCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0CWRhdGE7CisvKiBiYXNlKzB4MiAqLwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydAlhZGRyOworCQkJCXVuc2lnbmVkIGNoYXIJCQlfZHVtbXkxWzNdOworLyogYmFzZSsweDcgKi8Jdm9sYXRpbGUgdW5zaWduZWQgY2hhcglpdmVjOworCQkJCXVuc2lnbmVkIGNoYXIJCQlfZHVtbXkyWzVdOworLyogYmFzZSsweGQgKi8Jdm9sYXRpbGUgdW5zaWduZWQgY2hhcgllZXByb207CisJCQkJdW5zaWduZWQgY2hhcgkJCV9kdW1teTM7CisvKiBiYXNlKzB4ZiAqLwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCW1lbTsKK307CisKKy8qIFR5cGVzIG9mIGJvYXJkcyB0aGlzIGRyaXZlciBzdXBwb3J0cyAqLworCitlbnVtIGxhbmNlX3R5cGUgeworCU9MRF9SSUVCTCwJCS8qIG9sZCBSaWVibCBjYXJkIHdpdGhvdXQgYmF0dGVyeSAqLworCU5FV19SSUVCTCwJCS8qIG5ldyBSaWVibCBjYXJkIHdpdGggYmF0dGVyeSAqLworCVBBTV9DQVJECQkvKiBQQU0gY2FyZCB3aXRoIEVFUFJPTSAqLworfTsKKworc3RhdGljIGNoYXIgKmxhbmNlX25hbWVzW10gPSB7CisJIlJpZWJsLUNhcmQgKHdpdGhvdXQgYmF0dGVyeSkiLAorCSJSaWVibC1DYXJkICh3aXRoIGJhdHRlcnkpIiwKKwkiUEFNIGludGVybiBjYXJkIgorfTsKKworLyogVGhlIGRyaXZlcidzIHByaXZhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworCitzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSB7CisJZW51bSBsYW5jZV90eXBlCQljYXJkdHlwZTsKKwlzdHJ1Y3QgbGFuY2VfaW9yZWcJKmlvYmFzZTsKKwlzdHJ1Y3QgbGFuY2VfbWVtb3J5CSptZW07CisJaW50CQkgCWN1cl9yeCwgY3VyX3R4OwkvKiBUaGUgbmV4dCBmcmVlIHJpbmcgZW50cnkgKi8KKwlpbnQJCQlkaXJ0eV90eDsJCS8qIFJpbmcgZW50cmllcyB0byBiZSBmcmVlZC4gKi8KKwkJCQkvKiBjb3B5IGZ1bmN0aW9uICovCisJdm9pZAkJCSooKm1lbWNweV9mKSggdm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCApOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworLyogVGhpcyBtdXN0IGJlIGxvbmcgZm9yIHNldF9iaXQoKSAqLworCWxvbmcJCQl0eF9mdWxsOworCXNwaW5sb2NrX3QJCWRldmxvY2s7Cit9OworCisvKiBJL08gcmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyAqLworCisjZGVmaW5lCU1FTQkJbHAtPm1lbQorI2RlZmluZQlEUkVHCUlPLT5kYXRhCisjZGVmaW5lCUFSRUcJSU8tPmFkZHIKKyNkZWZpbmUJUkVHQShhKQkoIEFSRUcgPSAoYSksIERSRUcgKQorCisvKiBEZWZpbml0aW9ucyBmb3IgcGFja2V0IGJ1ZmZlciBhY2Nlc3M6ICovCisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1NDQKKy8qIEdldCB0aGUgYWRkcmVzcyBvZiBhIHBhY2tldCBidWZmZXIgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIGJ1ZmZlciBoZWFkICovCisjZGVmaW5lCVBLVEJVRl9BRERSKGhlYWQpCSgoKHVuc2lnbmVkIGNoYXIgKikoTUVNKSkgKyAoaGVhZCktPmJhc2UpCisKKy8qIFBvc3NpYmxlIG1lbW9yeS9JTyBhZGRyZXNzZXMgZm9yIHByb2JpbmcgKi8KKworc3RydWN0IGxhbmNlX2FkZHIgeworCXVuc2lnbmVkIGxvbmcJbWVtYWRkcjsKKwl1bnNpZ25lZCBsb25nCWlvYWRkcjsKKwlpbnQJCQkJc2xvd19mbGFnOworfSBsYW5jZV9hZGRyX2xpc3RbXSA9IHsKKwl7IDB4ZmUwMTAwMDAsIDB4ZmUwMGZmZjAsIDAgfSwJLyogUmllYmxDYXJkIFZNRSBpbiBUVCAqLworCXsgMHhmZmMxMDAwMCwgMHhmZmMwZmZmMCwgMCB9LAkvKiBSaWVibENhcmQgVk1FIGluIE1lZ2FTVEUKKwkJCQkJCQkJCSAgIChoaWdoZXN0IGJ5dGUgc3RyaXBwZWQpICovCisJeyAweGZmZTAwMDAwLCAweGZmZmY3MDAwLCAxIH0sCS8qIFJpZWJsQ2FyZCBpbiBTVAorCQkJCQkJCQkJICAgKGhpZ2hlc3QgYnl0ZSBzdHJpcHBlZCkgKi8KKwl7IDB4ZmZkMDAwMDAsIDB4ZmZmZjcwMDAsIDEgfSwJLyogUmllYmxDYXJkIGluIFNUIHdpdGggaHcgbW9kaWYuIHRvCisJCQkJCQkJCQkgICBhdm9pZCBjb25mbGljdCB3aXRoIFJPTQorCQkJCQkJCQkJICAgKGhpZ2hlc3QgYnl0ZSBzdHJpcHBlZCkgKi8KKwl7IDB4ZmZjZjAwMDAsIDB4ZmZjZmZmZjAsIDAgfSwJLyogUEFNQ2FyZCBWTUUgaW4gVFQgYW5kIE1TVEUKKwkJCQkJCQkJCSAgIChoaWdoZXN0IGJ5dGUgc3RyaXBwZWQpICovCisJeyAweGZlY2YwMDAwLCAweGZlY2ZmZmYwLCAwIH0sCS8qIFJob3Ryb24ncyBQQU1DYXJkIFZNRSBpbiBUVCBhbmQgTVNURQorCQkJCQkJCQkJICAgKGhpZ2hlc3QgYnl0ZSBzdHJpcHBlZCkgKi8KK307CisKKyNkZWZpbmUJTl9MQU5DRV9BRERSCShzaXplb2YobGFuY2VfYWRkcl9saXN0KS9zaXplb2YoKmxhbmNlX2FkZHJfbGlzdCkpCisKKworLyogRGVmaW5pdGlvbnMgZm9yIHRoZSBMYW5jZSAqLworCisvKiB0eF9oZWFkIGZsYWdzICovCisjZGVmaW5lIFRNRDFfRU5QCQkweDAxCS8qIGVuZCBvZiBwYWNrZXQgKi8KKyNkZWZpbmUgVE1EMV9TVFAJCTB4MDIJLyogc3RhcnQgb2YgcGFja2V0ICovCisjZGVmaW5lIFRNRDFfREVGCQkweDA0CS8qIGRlZmVycmVkICovCisjZGVmaW5lIFRNRDFfT05FCQkweDA4CS8qIG9uZSByZXRyeSBuZWVkZWQgKi8KKyNkZWZpbmUgVE1EMV9NT1JFCQkweDEwCS8qIG1vcmUgdGhhbiBvbmUgcmV0cnkgbmVlZGVkICovCisjZGVmaW5lIFRNRDFfRVJSCQkweDQwCS8qIGVycm9yIHN1bW1hcnkgKi8KKyNkZWZpbmUgVE1EMV9PV04gCQkweDgwCS8qIG93bmVyc2hpcCAoc2V0OiBjaGlwIG93bnMpICovCisKKyNkZWZpbmUgVE1EMV9PV05fQ0hJUAlUTUQxX09XTgorI2RlZmluZSBUTUQxX09XTl9IT1NUCTAKKworLyogdHhfaGVhZCBtaXNjIGZpZWxkICovCisjZGVmaW5lIFRNRDNfVERSCQkweDAzRkYJLyogVGltZSBEb21haW4gUmVmbGVjdG9tZXRyeSBjb3VudGVyICovCisjZGVmaW5lIFRNRDNfUlRSWQkJMHgwNDAwCS8qIGZhaWxlZCBhZnRlciAxNiByZXRyaWVzICovCisjZGVmaW5lIFRNRDNfTENBUgkJMHgwODAwCS8qIGNhcnJpZXIgbG9zdCAqLworI2RlZmluZSBUTUQzX0xDT0wJCTB4MTAwMAkvKiBsYXRlIGNvbGxpc2lvbiAqLworI2RlZmluZSBUTUQzX1VGTE8JCTB4NDAwMAkvKiB1bmRlcmZsb3cgKGxhdGUgbWVtb3J5KSAqLworI2RlZmluZSBUTUQzX0JVRkYJCTB4ODAwMAkvKiBidWZmZXJpbmcgZXJyb3IgKG5vIEVOUCkgKi8KKworLyogcnhfaGVhZCBmbGFncyAqLworI2RlZmluZSBSTUQxX0VOUAkJMHgwMQkvKiBlbmQgb2YgcGFja2V0ICovCisjZGVmaW5lIFJNRDFfU1RQCQkweDAyCS8qIHN0YXJ0IG9mIHBhY2tldCAqLworI2RlZmluZSBSTUQxX0JVRkYJCTB4MDQJLyogYnVmZmVyIGVycm9yICovCisjZGVmaW5lIFJNRDFfQ1JDCQkweDA4CS8qIENSQyBlcnJvciAqLworI2RlZmluZSBSTUQxX09GTE8JCTB4MTAJLyogb3ZlcmZsb3cgKi8KKyNkZWZpbmUgUk1EMV9GUkFNCQkweDIwCS8qIGZyYW1pbmcgZXJyb3IgKi8KKyNkZWZpbmUgUk1EMV9FUlIJCTB4NDAJLyogZXJyb3Igc3VtbWFyeSAqLworI2RlZmluZSBSTUQxX09XTiAJCTB4ODAJLyogb3duZXJzaGlwIChzZXQ6IHNoaXAgb3ducykgKi8KKworI2RlZmluZSBSTUQxX09XTl9DSElQCVJNRDFfT1dOCisjZGVmaW5lIFJNRDFfT1dOX0hPU1QJMAorCisvKiByZWdpc3RlciBuYW1lcyAqLworI2RlZmluZSBDU1IwCTAJCS8qIG1vZGUvc3RhdHVzICovCisjZGVmaW5lIENTUjEJMQkJLyogaW5pdCBibG9jayBhZGRyIChsb3cpICovCisjZGVmaW5lIENTUjIJMgkJLyogaW5pdCBibG9jayBhZGRyIChoaWdoKSAqLworI2RlZmluZSBDU1IzCTMJCS8qIG1pc2MgKi8KKyNkZWZpbmUgQ1NSOAk4CSAgCS8qIGFkZHJlc3MgZmlsdGVyICovCisjZGVmaW5lIENTUjE1CTE1CQkvKiBwcm9taXNjdW91cyBtb2RlICovCisKKy8qIENTUjAgKi8KKy8qIChSPXJlYWRhYmxlLCBXPXdyaXRlYWJsZSwgUz1zZXQgb24gd3JpdGUsIEM9Y2xlYXIgb24gd3JpdGUpICovCisjZGVmaW5lIENTUjBfSU5JVAkweDAwMDEJCS8qIGluaXRpYWxpemUgKFJTKSAqLworI2RlZmluZSBDU1IwX1NUUlQJMHgwMDAyCQkvKiBzdGFydCAoUlMpICovCisjZGVmaW5lIENTUjBfU1RPUAkweDAwMDQJCS8qIHN0b3AgKFJTKSAqLworI2RlZmluZSBDU1IwX1RETUQJMHgwMDA4CQkvKiB0cmFuc21pdCBkZW1hbmQgKFJTKSAqLworI2RlZmluZSBDU1IwX1RYT04JMHgwMDEwCQkvKiB0cmFuc21pdHRlciBvbiAoUikgKi8KKyNkZWZpbmUgQ1NSMF9SWE9OCTB4MDAyMAkJLyogcmVjZWl2ZXIgb24gKFIpICovCisjZGVmaW5lIENTUjBfSU5FQQkweDAwNDAJCS8qIGludGVycnVwdCBlbmFibGUgKFJXKSAqLworI2RlZmluZSBDU1IwX0lOVFIJMHgwMDgwCQkvKiBpbnRlcnJ1cHQgYWN0aXZlIChSKSAqLworI2RlZmluZSBDU1IwX0lET04JMHgwMTAwCQkvKiBpbml0aWFsaXphdGlvbiBkb25lIChSQykgKi8KKyNkZWZpbmUgQ1NSMF9USU5UCTB4MDIwMAkJLyogdHJhbnNtaXR0ZXIgaW50ZXJydXB0IChSQykgKi8KKyNkZWZpbmUgQ1NSMF9SSU5UCTB4MDQwMAkJLyogcmVjZWl2ZXIgaW50ZXJydXB0IChSQykgKi8KKyNkZWZpbmUgQ1NSMF9NRVJSCTB4MDgwMAkJLyogbWVtb3J5IGVycm9yIChSQykgKi8KKyNkZWZpbmUgQ1NSMF9NSVNTCTB4MTAwMAkJLyogbWlzc2VkIGZyYW1lIChSQykgKi8KKyNkZWZpbmUgQ1NSMF9DRVJSCTB4MjAwMAkJLyogY2FycmllciBlcnJvciAobm8gaGVhcnRiZWF0IDotKSAoUkMpICovCisjZGVmaW5lIENTUjBfQkFCTAkweDQwMDAJCS8qIGJhYmJsZTogdHgtZWQgdG9vIG1hbnkgYml0cyAoUkMpICovCisjZGVmaW5lIENTUjBfRVJSCTB4ODAwMAkJLyogZXJyb3IgKFJDKSAqLworCisvKiBDU1IzICovCisjZGVmaW5lIENTUjNfQkNPTgkweDAwMDEJCS8qIGJ5dGUgY29udHJvbCAqLworI2RlZmluZSBDU1IzX0FDT04JMHgwMDAyCQkvKiBBTEUgY29udHJvbCAqLworI2RlZmluZSBDU1IzX0JTV1AJMHgwMDA0CQkvKiBieXRlIHN3YXAgKDE9YmlnIGVuZGlhbikgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGFkZHJfYWNjZXNzaWJsZSggdm9sYXRpbGUgdm9pZCAqcmVncCwgaW50IHdvcmRmbGFnLCBpbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZWZsYWcgKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxhbmNlX3Byb2JlMSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGxhbmNlX2FkZHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmluaXRfcmVjICk7CitzdGF0aWMgaW50IGxhbmNlX29wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK3N0YXRpYyB2b2lkIGxhbmNlX2luaXRfcmluZyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworc3RhdGljIGludCBsYW5jZV9zdGFydF94bWl0KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CitzdGF0aWMgaXJxcmV0dXJuX3QgbGFuY2VfaW50ZXJydXB0KCBpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCApOworc3RhdGljIGludCBsYW5jZV9yeCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworc3RhdGljIGludCBsYW5jZV9jbG9zZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpsYW5jZV9nZXRfc3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworc3RhdGljIGludCBsYW5jZV9zZXRfbWFjX2FkZHJlc3MoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIgKTsKK3N0YXRpYyB2b2lkIGxhbmNlX3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBFbmQgb2YgUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKwwKKworc3RhdGljIHZvaWQgKnNsb3dfbWVtY3B5KCB2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGxlbiApCisKK3sJY2hhciAqY3RvID0gZHN0OworCWNvbnN0IGNoYXIgKmNmcm9tID0gc3JjOworCisJd2hpbGUoIGxlbi0tICkgeworCQkqY3RvKysgPSAqY2Zyb20rKzsKKwkJTUZQREVMQVkoKTsKKwl9CisJcmV0dXJuKCBkc3QgKTsKK30KKworCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBhdGFyaWxhbmNlX3Byb2JlKGludCB1bml0KQoreworCWludCBpOworCXN0YXRpYyBpbnQgZm91bmQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgZXJyID0gLUVOT0RFVjsKKworCWlmICghTUFDSF9JU19BVEFSSSB8fCBmb3VuZCkKKwkJLyogQXNzdW1lIHRoZXJlJ3Mgb25seSBvbmUgYm9hcmQgcG9zc2libGUuLi4gVGhhdCBzZWVtcyB0cnVlLCBzaW5jZQorCQkgKiB0aGUgUmllYmwvUEFNIGJvYXJkJ3MgYWRkcmVzcyBjYW5ub3QgYmUgY2hhbmdlZC4gKi8KKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGxhbmNlX3ByaXZhdGUpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJaWYgKHVuaXQgPj0gMCkgeworCQlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisJfQorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWZvciggaSA9IDA7IGkgPCBOX0xBTkNFX0FERFI7ICsraSApIHsKKwkJaWYgKGxhbmNlX3Byb2JlMSggZGV2LCAmbGFuY2VfYWRkcl9saXN0W2ldICkpIHsKKwkJCWZvdW5kID0gMTsKKwkJCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCQkJaWYgKCFlcnIpCisJCQkJcmV0dXJuIGRldjsKKwkJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQkJYnJlYWs7CisJCX0KKwl9CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCisKKy8qIERlcml2ZWQgZnJvbSBod3JlZ19wcmVzZW50KCkgaW4gYXRhcmkvY29uZmlnLmM6ICovCisKK3N0YXRpYyBpbnQgX19pbml0IGFkZHJfYWNjZXNzaWJsZSggdm9sYXRpbGUgdm9pZCAqcmVncCwgaW50IHdvcmRmbGFnLCBpbnQgd3JpdGVmbGFnICkKK3sKKwlpbnQJCXJldDsKKwlsb25nCWZsYWdzOworCWxvbmcJKnZiciwgc2F2ZV9iZXJyOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibW92ZWMJJS92YnIsJTAiIDogIj1yIiAodmJyKSA6ICk7CisJc2F2ZV9iZXJyID0gdmJyWzJdOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18KKwkoCSJtb3ZlbAklL3NwLCUvZDFcblx0IgorCQkibW92ZWwJI0xiZXJyLCUyQFxuXHQiCisJCSJtb3ZlcQkjMCwlMFxuXHQiCisJCSJ0c3RsICAgJTNcblx0IgorCQkiYm5lCTFmXG5cdCIKKwkJIm1vdmViCSUxQCwlL2QwXG5cdCIKKwkJIm5vcAlcblx0IgorCQkiYnJhCTJmXG4iCisiMToJCSBtb3ZldwklMUAsJS9kMFxuXHQiCisJCSJub3AJXG4iCisiMjoJCSB0c3RsICAgJTRcblx0IgorCQkiYmVxCTJmXG5cdCIKKwkJInRzdGwJJTNcblx0IgorCQkiYm5lCTFmXG5cdCIKKwkJImNscmIJJTFAXG5cdCIKKwkJIm5vcAlcblx0IgorCQkibW92ZWIJJS9kMCwlMUBcblx0IgorCQkibm9wCVxuXHQiCisJCSJicmEJMmZcbiIKKyIxOgkJIGNscncJJTFAXG5cdCIKKwkJIm5vcAlcblx0IgorCQkibW92ZXcJJS9kMCwlMUBcblx0IgorCQkibm9wCVxuIgorIjI6CQkgbW92ZXEJIzEsJTBcbiIKKyJMYmVycjoJIG1vdmVsCSUvZDEsJS9zcCIKKwkJOiAiPSZkIiAocmV0KQorCQk6ICJhIiAocmVncCksICJhIiAoJnZiclsyXSksICJybSIgKHdvcmRmbGFnKSwgInJtIiAod3JpdGVmbGFnKQorCQk6ICJkMCIsICJkMSIsICJtZW1vcnkiCisJKTsKKworCXZiclsyXSA9IHNhdmVfYmVycjsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4oIHJldCApOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBsYW5jZV9wcm9iZTEoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBsYW5jZV9hZGRyICppbml0X3JlYyApCit7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKm1lbWFkZHIgPQorCQkodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilpbml0X3JlYy0+bWVtYWRkcjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqaW9hZGRyID0KKwkJKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopaW5pdF9yZWMtPmlvYWRkcjsKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZQkqbHA7CisJc3RydWN0IGxhbmNlX2lvcmVnCQkqSU87CisJaW50IAkJCQkJaTsKKwlzdGF0aWMgaW50IAkJCQlkaWRfdmVyc2lvbjsKKwl1bnNpZ25lZCBzaG9ydAkJCXNhdmUxLCBzYXZlMjsKKworCVBST0JFX1BSSU5UKCggIlByb2JpbmcgZm9yIExhbmNlIGNhcmQgYXQgbWVtICUjbHggaW8gJSNseFxuIiwKKwkJCQkgIChsb25nKW1lbWFkZHIsIChsb25nKWlvYWRkciApKTsKKworCS8qIFRlc3Qgd2hldGhlciBtZW1vcnkgcmVhZGFibGUgYW5kIHdyaXRhYmxlICovCisJUFJPQkVfUFJJTlQoKCAibGFuY2VfcHJvYmUxOiB0ZXN0aW5nIG1lbW9yeSB0byBiZSBhY2Nlc3NpYmxlXG4iICkpOworCWlmICghYWRkcl9hY2Nlc3NpYmxlKCBtZW1hZGRyLCAxLCAxICkpIGdvdG8gcHJvYmVfZmFpbDsKKworCS8qIFdyaXR0ZW4gdmFsdWVzIHNob3VsZCBjb21lIGJhY2suLi4gKi8KKwlQUk9CRV9QUklOVCgoICJsYW5jZV9wcm9iZTE6IHRlc3RpbmcgbWVtb3J5IHRvIGJlIHdyaXRhYmxlICgxKVxuIiApKTsKKwlzYXZlMSA9ICptZW1hZGRyOworCSptZW1hZGRyID0gMHgwMDAxOworCWlmICgqbWVtYWRkciAhPSAweDAwMDEpIGdvdG8gcHJvYmVfZmFpbDsKKwlQUk9CRV9QUklOVCgoICJsYW5jZV9wcm9iZTE6IHRlc3RpbmcgbWVtb3J5IHRvIGJlIHdyaXRhYmxlICgyKVxuIiApKTsKKwkqbWVtYWRkciA9IDB4MDAwMDsKKwlpZiAoKm1lbWFkZHIgIT0gMHgwMDAwKSBnb3RvIHByb2JlX2ZhaWw7CisJKm1lbWFkZHIgPSBzYXZlMTsKKworCS8qIEZpcnN0IHBvcnQgc2hvdWxkIGJlIHJlYWRhYmxlIGFuZCB3cml0YWJsZSAqLworCVBST0JFX1BSSU5UKCggImxhbmNlX3Byb2JlMTogdGVzdGluZyBpb3BvcnQgdG8gYmUgYWNjZXNzaWJsZVxuIiApKTsKKwlpZiAoIWFkZHJfYWNjZXNzaWJsZSggaW9hZGRyLCAxLCAxICkpIGdvdG8gcHJvYmVfZmFpbDsKKworCS8qIGFuZCB3cml0dGVuIHZhbHVlcyBzaG91bGQgYmUgcmVhZGFibGUgKi8KKwlQUk9CRV9QUklOVCgoICJsYW5jZV9wcm9iZTE6IHRlc3RpbmcgaW9wb3J0IHRvIGJlIHdyaXRlYWJsZVxuIiApKTsKKwlzYXZlMiA9IGlvYWRkclsxXTsKKwlpb2FkZHJbMV0gPSAweDAwMDE7CisJaWYgKGlvYWRkclsxXSAhPSAweDAwMDEpIGdvdG8gcHJvYmVfZmFpbDsKKworCS8qIFRoZSBDU1IwX0lOSVQgYml0IHNob3VsZCBub3QgYmUgcmVhZGFibGUgKi8KKwlQUk9CRV9QUklOVCgoICJsYW5jZV9wcm9iZTE6IHRlc3RpbmcgQ1NSMCByZWdpc3RlciBmdW5jdGlvbiAoMSlcbiIgKSk7CisJc2F2ZTEgPSBpb2FkZHJbMF07CisJaW9hZGRyWzFdID0gQ1NSMDsKKwlpb2FkZHJbMF0gPSBDU1IwX0lOSVQgfCBDU1IwX1NUT1A7CisJaWYgKGlvYWRkclswXSAhPSBDU1IwX1NUT1ApIHsKKwkJaW9hZGRyWzBdID0gc2F2ZTE7CisJCWlvYWRkclsxXSA9IHNhdmUyOworCQlnb3RvIHByb2JlX2ZhaWw7CisJfQorCVBST0JFX1BSSU5UKCggImxhbmNlX3Byb2JlMTogdGVzdGluZyBDU1IwIHJlZ2lzdGVyIGZ1bmN0aW9uICgyKVxuIiApKTsKKwlpb2FkZHJbMF0gPSBDU1IwX1NUT1A7CisJaWYgKGlvYWRkclswXSAhPSBDU1IwX1NUT1ApIHsKKwkJaW9hZGRyWzBdID0gc2F2ZTE7CisJCWlvYWRkclsxXSA9IHNhdmUyOworCQlnb3RvIHByb2JlX2ZhaWw7CisJfQorCisJLyogTm93IG9rLi4uICovCisJUFJPQkVfUFJJTlQoKCAibGFuY2VfcHJvYmUxOiBMYW5jZSBjYXJkIGRldGVjdGVkXG4iICkpOworCWdvdG8gcHJvYmVfb2s7CisKKyAgcHJvYmVfZmFpbDoKKwlyZXR1cm4oIDAgKTsKKworICBwcm9iZV9vazoKKwlscCA9IChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwlNRU0gPSAoc3RydWN0IGxhbmNlX21lbW9yeSAqKW1lbWFkZHI7CisJSU8gPSBscC0+aW9iYXNlID0gKHN0cnVjdCBsYW5jZV9pb3JlZyAqKWlvYWRkcjsKKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvYWRkcjsgLyogaW5mb3JtYXRpb25hbCBvbmx5ICovCisJbHAtPm1lbWNweV9mID0gaW5pdF9yZWMtPnNsb3dfZmxhZyA/IHNsb3dfbWVtY3B5IDogbWVtY3B5OworCisJUkVHQSggQ1NSMCApID0gQ1NSMF9TVE9QOworCisJLyogTm93IHRlc3QgZm9yIHR5cGU6IElmIHRoZSBlZXByb20gSS9PIHBvcnQgaXMgcmVhZGFibGUsIGl0IGlzIGEKKwkgKiBQQU0gY2FyZCAqLworCWlmIChhZGRyX2FjY2Vzc2libGUoICYoSU8tPmVlcHJvbSksIDAsIDAgKSkgeworCQkvKiBTd2l0Y2ggYmFjayB0byBSYW0gKi8KKwkJaSA9IElPLT5tZW07CisJCWxwLT5jYXJkdHlwZSA9IFBBTV9DQVJEOworCX0KKwllbHNlIGlmICgqUklFQkxfTUFHSUNfQUREUiA9PSBSSUVCTF9NQUdJQykgeworCQlscC0+Y2FyZHR5cGUgPSBORVdfUklFQkw7CisJfQorCWVsc2UKKwkJbHAtPmNhcmR0eXBlID0gT0xEX1JJRUJMOworCisJaWYgKGxwLT5jYXJkdHlwZSA9PSBQQU1fQ0FSRCB8fAorCQltZW1hZGRyID09ICh1bnNpZ25lZCBzaG9ydCAqKTB4ZmZlMDAwMDApIHsKKwkJLyogUEFNcyBjYXJkIGFuZCBSaWVibCBvbiBTVCB1c2UgbGV2ZWwgNSBhdXRvdmVjdG9yICovCisJCWlmIChyZXF1ZXN0X2lycShJUlFfQVVUT181LCBsYW5jZV9pbnRlcnJ1cHQsIElSUV9UWVBFX1BSSU8sCisJCSAgICAgICAgICAgICJQQU0vUmllYmwtU1QgRXRoZXJuZXQiLCBkZXYpKSB7IAorCQkJcHJpbnRrKCAiTGFuY2U6IHJlcXVlc3QgZm9yIGlycSAlZCBmYWlsZWRcbiIsIElSUV9BVVRPXzUgKTsKKwkJCXJldHVybiggMCApOworCQl9CisJCWRldi0+aXJxID0gKHVuc2lnbmVkIHNob3J0KUlSUV9BVVRPXzU7CisJfQorCWVsc2UgeworCQkvKiBGb3IgVk1FLVJpZWJsQ2FyZHMsIHJlcXVlc3QgYSBmcmVlIFZNRSBpbnQ7CisJCSAqIChUaGlzIG11c3QgYmUgdW5zaWduZWQgbG9uZywgc2luY2UgZGV2LT5pcnEgaXMgc2hvcnQgYW5kIHRoZQorCQkgKiBJUlFfTUFDSFNQRUMgYml0IHdvdWxkIGJlIGN1dCBvZmYuLi4pCisJCSAqLworCQl1bnNpZ25lZCBsb25nIGlycSA9IGF0YXJpX3JlZ2lzdGVyX3ZtZV9pbnQoKTsKKwkJaWYgKCFpcnEpIHsKKwkJCXByaW50ayggIkxhbmNlOiByZXF1ZXN0IGZvciBWTUUgaW50ZXJydXB0IGZhaWxlZFxuIiApOworCQkJcmV0dXJuKCAwICk7CisJCX0KKwkJaWYgKHJlcXVlc3RfaXJxKGlycSwgbGFuY2VfaW50ZXJydXB0LCBJUlFfVFlQRV9QUklPLAorCQkgICAgICAgICAgICAiUmllYmwtVk1FIEV0aGVybmV0IiwgZGV2KSkgeworCQkJcHJpbnRrKCAiTGFuY2U6IHJlcXVlc3QgZm9yIGlycSAlbGQgZmFpbGVkXG4iLCBpcnEgKTsKKwkJCXJldHVybiggMCApOworCQl9CisJCWRldi0+aXJxID0gaXJxOworCX0KKworCXByaW50aygiJXM6ICVzIGF0IGlvICUjbHgsIG1lbSAlI2x4LCBpcnEgJWQlcywgaHdhZGRyICIsCisJCSAgIGRldi0+bmFtZSwgbGFuY2VfbmFtZXNbbHAtPmNhcmR0eXBlXSwKKwkJICAgKHVuc2lnbmVkIGxvbmcpaW9hZGRyLAorCQkgICAodW5zaWduZWQgbG9uZyltZW1hZGRyLAorCQkgICBkZXYtPmlycSwKKwkJICAgaW5pdF9yZWMtPnNsb3dfZmxhZyA/ICIgKHNsb3cgbWVtY3B5KSIgOiAiIiApOworCisJLyogR2V0IHRoZSBldGhlcm5ldCBhZGRyZXNzICovCisJc3dpdGNoKCBscC0+Y2FyZHR5cGUgKSB7CisJICBjYXNlIE9MRF9SSUVCTDoKKwkJLyogTm8gZXRoZXJuZXQgYWRkcmVzcyEgKFNldCBzb21lIGRlZmF1bHQgYWRkcmVzcykgKi8KKwkJbWVtY3B5KCBkZXYtPmRldl9hZGRyLCBPbGRSaWVibERlZkh3YWRkciwgNiApOworCQlicmVhazsKKwkgIGNhc2UgTkVXX1JJRUJMOgorCQlscC0+bWVtY3B5X2YoIGRldi0+ZGV2X2FkZHIsIFJJRUJMX0hXQUREUl9BRERSLCA2ICk7CisJCWJyZWFrOworCSAgY2FzZSBQQU1fQ0FSRDoKKwkJaSA9IElPLT5lZXByb207CisJCWZvciggaSA9IDA7IGkgPCA2OyArK2kgKQorCQkJZGV2LT5kZXZfYWRkcltpXSA9CisJCQkJKCgoKHVuc2lnbmVkIHNob3J0ICopTUVNKVtpKjJdICYgMHgwZikgPDwgNCkgfAorCQkJCSgoKCh1bnNpZ25lZCBzaG9ydCAqKU1FTSlbaSoyKzFdICYgMHgwZikpOworCQlpID0gSU8tPm1lbTsKKwkJYnJlYWs7CisJfQorCWZvciggaSA9IDA7IGkgPCA2OyArK2kgKQorCQlwcmludGsoICIlMDJ4JXMiLCBkZXYtPmRldl9hZGRyW2ldLCAoaSA8IDUpID8gIjoiIDogIlxuIiApOworCWlmIChscC0+Y2FyZHR5cGUgPT0gT0xEX1JJRUJMKSB7CisJCXByaW50ayggIiVzOiBXYXJuaW5nOiBUaGlzIGlzIGEgZGVmYXVsdCBldGhlcm5ldCBhZGRyZXNzIVxuIiwKKwkJCQlkZXYtPm5hbWUgKTsKKwkJcHJpbnRrKCAiICAgICAgVXNlIFwiaWZjb25maWcgaHcgZXRoZXIgLi4uXCIgdG8gc2V0IHRoZSBhZGRyZXNzLlxuIiApOworCX0KKworCXNwaW5fbG9ja19pbml0KCZscC0+ZGV2bG9jayk7CisKKwlNRU0tPmluaXQubW9kZSA9IDB4MDAwMDsJCS8qIERpc2FibGUgUnggYW5kIFR4LiAqLworCWZvciggaSA9IDA7IGkgPCA2OyBpKysgKQorCQlNRU0tPmluaXQuaHdhZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXjFdOyAvKiA8LSAxNiBiaXQgc3dhcCEgKi8KKwlNRU0tPmluaXQuZmlsdGVyWzBdID0gMHgwMDAwMDAwMDsKKwlNRU0tPmluaXQuZmlsdGVyWzFdID0gMHgwMDAwMDAwMDsKKwlNRU0tPmluaXQucnhfcmluZy5hZHJfbG8gPSBvZmZzZXRvZiggc3RydWN0IGxhbmNlX21lbW9yeSwgcnhfaGVhZCApOworCU1FTS0+aW5pdC5yeF9yaW5nLmFkcl9oaSA9IDA7CisJTUVNLT5pbml0LnJ4X3JpbmcubGVuICAgID0gUlhfUklOR19MRU5fQklUUzsKKwlNRU0tPmluaXQudHhfcmluZy5hZHJfbG8gPSBvZmZzZXRvZiggc3RydWN0IGxhbmNlX21lbW9yeSwgdHhfaGVhZCApOworCU1FTS0+aW5pdC50eF9yaW5nLmFkcl9oaSA9IDA7CisJTUVNLT5pbml0LnR4X3JpbmcubGVuICAgID0gVFhfUklOR19MRU5fQklUUzsKKworCWlmIChscC0+Y2FyZHR5cGUgPT0gUEFNX0NBUkQpCisJCUlPLT5pdmVjID0gSVJRX1NPVVJDRV9UT19WRUNUT1IoZGV2LT5pcnEpOworCWVsc2UKKwkJKlJJRUJMX0lWRUNfQUREUiA9IElSUV9TT1VSQ0VfVE9fVkVDVE9SKGRldi0+aXJxKTsKKworCWlmIChkaWRfdmVyc2lvbisrID09IDApCisJCURQUklOVEsoIDEsICggdmVyc2lvbiApKTsKKworCS8qIFRoZSBMQU5DRS1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9ICZsYW5jZV9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmxhbmNlX3N0YXJ0X3htaXQ7CisJZGV2LT5zdG9wID0gJmxhbmNlX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gJmxhbmNlX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSAmbGFuY2Vfc2V0X21hY19hZGRyZXNzOworCisJLyogWFhYIE1TY2ggKi8KKwlkZXYtPnR4X3RpbWVvdXQgPSBsYW5jZV90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCQkJCisKKyNpZiAwCisJZGV2LT5zdGFydCA9IDA7CisjZW5kaWYKKworCW1lbXNldCggJmxwLT5zdGF0cywgMCwgc2l6ZW9mKGxwLT5zdGF0cykgKTsKKworCXJldHVybiggMSApOworfQorCisMCitzdGF0aWMgaW50IGxhbmNlX29wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQorCit7CXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwlzdHJ1Y3QgbGFuY2VfaW9yZWcJICpJTyA9IGxwLT5pb2Jhc2U7CisJaW50IGk7CisKKwlEUFJJTlRLKCAyLCAoICIlczogbGFuY2Vfb3BlbigpXG4iLCBkZXYtPm5hbWUgKSk7CisKKwlsYW5jZV9pbml0X3JpbmcoZGV2KTsKKwkvKiBSZS1pbml0aWFsaXplIHRoZSBMQU5DRSwgYW5kIHN0YXJ0IGl0IHdoZW4gZG9uZS4gKi8KKworCVJFR0EoIENTUjMgKSA9IENTUjNfQlNXUCB8IChscC0+Y2FyZHR5cGUgPT0gUEFNX0NBUkQgPyBDU1IzX0FDT04gOiAwKTsKKwlSRUdBKCBDU1IyICkgPSAwOworCVJFR0EoIENTUjEgKSA9IDA7CisJUkVHQSggQ1NSMCApID0gQ1NSMF9JTklUOworCS8qIEZyb20gbm93IG9uLCBBUkVHIGlzIGtlcHQgdG8gcG9pbnQgdG8gQ1NSMCAqLworCisJaSA9IDEwMDAwMDA7CisJd2hpbGUgKC0taSA+IDApCisJCWlmIChEUkVHICYgQ1NSMF9JRE9OKQorCQkJYnJlYWs7CisJaWYgKGkgPCAwIHx8IChEUkVHICYgQ1NSMF9FUlIpKSB7CisJCURQUklOVEsoIDIsICggImxhbmNlX29wZW4oKTogb3BlbmluZyAlcyBmYWlsZWQsIGk9JWQsIGNzcjA9JTA0eFxuIiwKKwkJCQkJICBkZXYtPm5hbWUsIGksIERSRUcgKSk7CisJCURSRUcgPSBDU1IwX1NUT1A7CisJCXJldHVybiggLUVJTyApOworCX0KKwlEUkVHID0gQ1NSMF9JRE9OOworCURSRUcgPSBDU1IwX1NUUlQ7CisJRFJFRyA9IENTUjBfSU5FQTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlIChkZXYpOworCisJRFBSSU5USyggMiwgKCAiJXM6IExBTkNFIGlzIG9wZW4sIGNzcjAgJTA0eFxuIiwgZGV2LT5uYW1lLCBEUkVHICkpOworCisJcmV0dXJuKCAwICk7Cit9CisKKworLyogSW5pdGlhbGl6ZSB0aGUgTEFOQ0UgUnggYW5kIFR4IHJpbmdzLiAqLworCitzdGF0aWMgdm9pZCBsYW5jZV9pbml0X3JpbmcoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQorCit7CXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBvZmZzZXQ7CisKKwlscC0+dHhfZnVsbCA9IDA7CisJbHAtPmN1cl9yeCA9IGxwLT5jdXJfdHggPSAwOworCWxwLT5kaXJ0eV90eCA9IDA7CisKKwlvZmZzZXQgPSBvZmZzZXRvZiggc3RydWN0IGxhbmNlX21lbW9yeSwgcGFja2V0X2FyZWEgKTsKKworLyogSWYgdGhlIHBhY2tldCBidWZmZXIgYXQgb2Zmc2V0ICdvJyB3b3VsZCBjb25mbGljdCB3aXRoIHRoZSByZXNlcnZlZCBhcmVhCisgKiBvZiBSaWVibENhcmRzLCBhZHZhbmNlIGl0ICovCisjZGVmaW5lCUNIRUNLX09GRlNFVChvKQkJCQkJCQkJCQkJCQkJIFwKKwlkbyB7CQkJCQkJCQkJCQkJCQkJCQkgXAorCQlpZiAobHAtPmNhcmR0eXBlID09IE9MRF9SSUVCTCB8fCBscC0+Y2FyZHR5cGUgPT0gTkVXX1JJRUJMKSB7CQkgXAorCQkJaWYgKCgobykgPCBSSUVCTF9SU1ZEX1NUQVJUKSA/IChvKStQS1RfQlVGX1NaID4gUklFQkxfUlNWRF9TVEFSVCBcCisJCQkJCQkJCQkJIDogKG8pIDwgUklFQkxfUlNWRF9FTkQpCQkJIFwKKwkJCQkobykgPSBSSUVCTF9SU1ZEX0VORDsJCQkJCQkJCQkJIFwKKwkJfQkJCQkJCQkJCQkJCQkJCQkJIFwKKwl9IHdoaWxlKDApCisKKwlmb3IoIGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKysgKSB7CisJCUNIRUNLX09GRlNFVChvZmZzZXQpOworCQlNRU0tPnR4X2hlYWRbaV0uYmFzZSA9IG9mZnNldDsKKwkJTUVNLT50eF9oZWFkW2ldLmZsYWcgPSBUTUQxX09XTl9IT1NUOworIAkJTUVNLT50eF9oZWFkW2ldLmJhc2VfaGkgPSAwOworCQlNRU0tPnR4X2hlYWRbaV0ubGVuZ3RoID0gMDsKKwkJTUVNLT50eF9oZWFkW2ldLm1pc2MgPSAwOworCQlvZmZzZXQgKz0gUEtUX0JVRl9TWjsKKwl9CisKKwlmb3IoIGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKysgKSB7CisJCUNIRUNLX09GRlNFVChvZmZzZXQpOworCQlNRU0tPnJ4X2hlYWRbaV0uYmFzZSA9IG9mZnNldDsKKwkJTUVNLT5yeF9oZWFkW2ldLmZsYWcgPSBUTUQxX09XTl9DSElQOworCQlNRU0tPnJ4X2hlYWRbaV0uYmFzZV9oaSA9IDA7CisJCU1FTS0+cnhfaGVhZFtpXS5idWZfbGVuZ3RoID0gLVBLVF9CVUZfU1o7CisJCU1FTS0+cnhfaGVhZFtpXS5tc2dfbGVuZ3RoID0gMDsKKwkJb2Zmc2V0ICs9IFBLVF9CVUZfU1o7CisJfQorfQorCisKKy8qIFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFggKi8KKworCitzdGF0aWMgdm9pZCBsYW5jZV90eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJc3RydWN0IGxhbmNlX2lvcmVnCSAqSU8gPSBscC0+aW9iYXNlOworCQorCUFSRUcgPSBDU1IwOworCURQUklOVEsoIDEsICggIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlMDR4LCByZXNldHRpbmcuXG4iLAorCQkJICBkZXYtPm5hbWUsIERSRUcgKSk7CisJRFJFRyA9IENTUjBfU1RPUDsKKwkvKgorCSAqIEFsd2F5cyBzZXQgQlNXUCBhZnRlciBhIFNUT1AgYXMgU1RPUCBwdXRzIGl0IGJhY2sgaW50bworCSAqIGxpdHRsZSBlbmRpYW4gbW9kZS4KKwkgKi8KKwlSRUdBKCBDU1IzICkgPSBDU1IzX0JTV1AgfCAobHAtPmNhcmR0eXBlID09IFBBTV9DQVJEID8gQ1NSM19BQ09OIDogMCk7CisJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCXsJaW50IGk7CisJCQlEUFJJTlRLKCAyLCAoICJSaW5nIGRhdGE6IGRpcnR5X3R4ICVkIGN1cl90eCAlZCVzIGN1cl9yeCAlZFxuIiwKKwkJCQkJCSAgbHAtPmRpcnR5X3R4LCBscC0+Y3VyX3R4LAorCQkJCQkJICBscC0+dHhfZnVsbCA/ICIgKGZ1bGwpIiA6ICIiLAorCQkJCQkJICBscC0+Y3VyX3J4ICkpOworCQkJZm9yKCBpID0gMCA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKyApCisJCQkJRFBSSU5USyggMiwgKCAicnggIyVkOiBiYXNlPSUwNHggYmxlbj0lMDR4IG1sZW49JTA0eFxuIiwKKwkJCQkJCQkgIGksIE1FTS0+cnhfaGVhZFtpXS5iYXNlLAorCQkJCQkJCSAgLU1FTS0+cnhfaGVhZFtpXS5idWZfbGVuZ3RoLAorCQkJCQkJCSAgTUVNLT5yeF9oZWFkW2ldLm1zZ19sZW5ndGggKSk7CisJCQlmb3IoIGkgPSAwIDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrICkKKwkJCQlEUFJJTlRLKCAyLCAoICJ0eCAjJWQ6IGJhc2U9JTA0eCBsZW49JTA0eCBtaXNjPSUwNHhcbiIsCisJCQkJCQkJICBpLCBNRU0tPnR4X2hlYWRbaV0uYmFzZSwKKwkJCQkJCQkgIC1NRU0tPnR4X2hlYWRbaV0ubGVuZ3RoLAorCQkJCQkJCSAgTUVNLT50eF9oZWFkW2ldLm1pc2MgKSk7CisJCX0KKyNlbmRpZiAJIAorCS8qIFhYWCBNU2NoOiBtYXliZSBwdXJnZS9yZWluaXQgcmluZyBoZXJlICovCisJLyogbGFuY2VfcmVzdGFydCwgZXNzZW50aWFsbHkgKi8KKwlsYW5jZV9pbml0X3JpbmcoZGV2KTsKKwlSRUdBKCBDU1IwICkgPSBDU1IwX0lORUEgfCBDU1IwX0lOSVQgfCBDU1IwX1NUUlQ7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKK30KKworLyogWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCAqLworCitzdGF0aWMgaW50IGxhbmNlX3N0YXJ0X3htaXQoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQorCit7CXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwlzdHJ1Y3QgbGFuY2VfaW9yZWcJICpJTyA9IGxwLT5pb2Jhc2U7CisJaW50IGVudHJ5LCBsZW47CisJc3RydWN0IGxhbmNlX3R4X2hlYWQgKmhlYWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURQUklOVEsoIDIsICggIiVzOiBsYW5jZV9zdGFydF94bWl0KCkgY2FsbGVkLCBjc3IwICU0LjR4LlxuIiwKKwkJCQkgIGRldi0+bmFtZSwgRFJFRyApKTsKKworCisJLyogVGhlIG9sZCBMQU5DRSBjaGlwcyBkb2Vzbid0IGF1dG9tYXRpY2FsbHkgcGFkIGJ1ZmZlcnMgdG8gbWluLiBzaXplLiAqLworCWxlbiA9IHNrYi0+bGVuOworCWlmIChsZW4gPCBFVEhfWkxFTikKKwkJbGVuID0gRVRIX1pMRU47CisJLyogUEFNLUNhcmQgaGFzIGEgYnVnOiBDYW4gb25seSBzZW5kIHBhY2tldHMgd2l0aCBldmVuIG51bWJlciBvZiBieXRlcyEgKi8KKwllbHNlIGlmIChscC0+Y2FyZHR5cGUgPT0gUEFNX0NBUkQgJiYgKGxlbiAmIDEpKQorCQkrK2xlbjsKKwkJCisJaWYgKGxlbiA+IHNrYi0+bGVuKSB7CisJCXNrYiA9IHNrYl9wYWR0byhza2IsIGxlbik7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCX0KKwkJCisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworCS8qIEZpbGwgaW4gYSBUeCByaW5nIGVudHJ5ICovCisJaWYgKGxhbmNlX2RlYnVnID49IDMpIHsKKwkJdV9jaGFyICpwOworCQlpbnQgaTsKKwkJcHJpbnRrKCAiJXM6IFRYIHBrdCB0eXBlIDB4JTA0eCBmcm9tICIsIGRldi0+bmFtZSwKKwkJCQkoKHVfc2hvcnQgKilza2ItPmRhdGEpWzZdKTsKKwkJZm9yKCBwID0gJigodV9jaGFyICopc2tiLT5kYXRhKVs2XSwgaSA9IDA7IGkgPCA2OyBpKysgKQorCQkJcHJpbnRrKCIlMDJ4JXMiLCAqcCsrLCBpICE9IDUgPyAiOiIgOiAiIiApOworCQlwcmludGsoIiB0byAiKTsKKwkJZm9yKCBwID0gKHVfY2hhciAqKXNrYi0+ZGF0YSwgaSA9IDA7IGkgPCA2OyBpKysgKQorCQkJcHJpbnRrKCIlMDJ4JXMiLCAqcCsrLCBpICE9IDUgPyAiOiIgOiAiIiApOworCQlwcmludGsoIiBkYXRhIGF0IDB4JTA4eCBsZW4gJWRcbiIsIChpbnQpc2tiLT5kYXRhLAorCQkJICAgKGludClza2ItPmxlbiApOworCX0KKworCS8qIFdlJ3JlIG5vdCBwcmVwYXJlZCBmb3IgdGhlIGludCB1bnRpbCB0aGUgbGFzdCBmbGFncyBhcmUgc2V0L3Jlc2V0LiBBbmQKKwkgKiB0aGUgaW50IG1heSBoYXBwZW4gYWxyZWFkeSBhZnRlciBzZXR0aW5nIHRoZSBPV05fQ0hJUC4uLiAqLworCXNwaW5fbG9ja19pcnFzYXZlICgmbHAtPmRldmxvY2ssIGZsYWdzKTsKKworCS8qIE1hc2sgdG8gcmluZyBidWZmZXIgYm91bmRhcnkuICovCisJZW50cnkgPSBscC0+Y3VyX3R4ICYgVFhfUklOR19NT0RfTUFTSzsKKwloZWFkICA9ICYoTUVNLT50eF9oZWFkW2VudHJ5XSk7CisKKwkvKiBDYXV0aW9uOiB0aGUgd3JpdGUgb3JkZXIgaXMgaW1wb3J0YW50IGhlcmUsIHNldCB0aGUgIm93bmVyc2hpcCIgYml0cworCSAqIGxhc3QuCisJICovCisKKworCWhlYWQtPmxlbmd0aCA9IC1sZW47CisJaGVhZC0+bWlzYyA9IDA7CisJbHAtPm1lbWNweV9mKCBQS1RCVUZfQUREUihoZWFkKSwgKHZvaWQgKilza2ItPmRhdGEsIHNrYi0+bGVuICk7CisJaGVhZC0+ZmxhZyA9IFRNRDFfT1dOX0NISVAgfCBUTUQxX0VOUCB8IFRNRDFfU1RQOworCWxwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwlkZXZfa2ZyZWVfc2tiKCBza2IgKTsKKwlscC0+Y3VyX3R4Kys7CisJd2hpbGUoIGxwLT5jdXJfdHggPj0gVFhfUklOR19TSVpFICYmIGxwLT5kaXJ0eV90eCA+PSBUWF9SSU5HX1NJWkUgKSB7CisJCWxwLT5jdXJfdHggLT0gVFhfUklOR19TSVpFOworCQlscC0+ZGlydHlfdHggLT0gVFhfUklOR19TSVpFOworCX0KKworCS8qIFRyaWdnZXIgYW4gaW1tZWRpYXRlIHNlbmQgcG9sbC4gKi8KKwlEUkVHID0gQ1NSMF9JTkVBIHwgQ1NSMF9URE1EOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJaWYgKChNRU0tPnR4X2hlYWRbKGVudHJ5KzEpICYgVFhfUklOR19NT0RfTUFTS10uZmxhZyAmIFRNRDFfT1dOKSA9PQorCQlUTUQxX09XTl9IT1NUKQorCQluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKwllbHNlCisJCWxwLT50eF9mdWxsID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmbHAtPmRldmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKiBUaGUgTEFOQ0UgaW50ZXJydXB0IGhhbmRsZXIuICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBsYW5jZV9pbnRlcnJ1cHQoIGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwOworCXN0cnVjdCBsYW5jZV9pb3JlZwkgKklPOworCWludCBjc3IwLCBib2d1c2NudCA9IDEwOworCWludCBoYW5kbGVkID0gMDsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlEUFJJTlRLKCAxLCAoICJsYW5jZV9pbnRlcnJ1cHQoKTogaW50ZXJydXB0IGZvciB1bmtub3duIGRldmljZS5cbiIgKSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlscCA9IChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwlJTyA9IGxwLT5pb2Jhc2U7CisJc3Bpbl9sb2NrICgmbHAtPmRldmxvY2spOworCisJQVJFRyA9IENTUjA7CisKKwl3aGlsZSggKChjc3IwID0gRFJFRykgJiAoQ1NSMF9FUlIgfCBDU1IwX1RJTlQgfCBDU1IwX1JJTlQpKSAmJgorCQkgICAtLWJvZ3VzY250ID49IDApIHsKKwkJaGFuZGxlZCA9IDE7CisJCS8qIEFja25vd2xlZGdlIGFsbCBvZiB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc291cmNlcyBBU0FQLiAqLworCQlEUkVHID0gY3NyMCAmIH4oQ1NSMF9JTklUIHwgQ1NSMF9TVFJUIHwgQ1NSMF9TVE9QIHwKKwkJCQkJCQkJCUNTUjBfVERNRCB8IENTUjBfSU5FQSk7CisKKwkJRFBSSU5USyggMiwgKCAiJXM6IGludGVycnVwdCAgY3NyMD0lMDR4IG5ldyBjc3I9JTA0eC5cbiIsCisJCQkJCSAgZGV2LT5uYW1lLCBjc3IwLCBEUkVHICkpOworCisJCWlmIChjc3IwICYgQ1NSMF9SSU5UKQkJCS8qIFJ4IGludGVycnVwdCAqLworCQkJbGFuY2VfcngoIGRldiApOworCisJCWlmIChjc3IwICYgQ1NSMF9USU5UKSB7CQkJLyogVHgtZG9uZSBpbnRlcnJ1cHQgKi8KKwkJCWludCBkaXJ0eV90eCA9IGxwLT5kaXJ0eV90eDsKKworCQkJd2hpbGUoIGRpcnR5X3R4IDwgbHAtPmN1cl90eCkgeworCQkJCWludCBlbnRyeSA9IGRpcnR5X3R4ICYgVFhfUklOR19NT0RfTUFTSzsKKwkJCQlpbnQgc3RhdHVzID0gTUVNLT50eF9oZWFkW2VudHJ5XS5mbGFnOworCisJCQkJaWYgKHN0YXR1cyAmIFRNRDFfT1dOX0NISVApCisJCQkJCWJyZWFrOwkJCS8qIEl0IHN0aWxsIGhhc24ndCBiZWVuIFR4ZWQgKi8KKworCQkJCU1FTS0+dHhfaGVhZFtlbnRyeV0uZmxhZyA9IDA7CisKKwkJCQlpZiAoc3RhdHVzICYgVE1EMV9FUlIpIHsKKwkJCQkJLyogVGhlcmUgd2FzIGFuIG1ham9yIGVycm9yLCBsb2cgaXQuICovCisJCQkJCWludCBlcnJfc3RhdHVzID0gTUVNLT50eF9oZWFkW2VudHJ5XS5taXNjOworCQkJCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJCWlmIChlcnJfc3RhdHVzICYgVE1EM19SVFJZKSBscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQkJaWYgKGVycl9zdGF0dXMgJiBUTUQzX0xDQVIpIGxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCQlpZiAoZXJyX3N0YXR1cyAmIFRNRDNfTENPTCkgbHAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJCQkJaWYgKGVycl9zdGF0dXMgJiBUTUQzX1VGTE8pIHsKKwkJCQkJCS8qIEFja2shICBPbiBGSUZPIGVycm9ycyB0aGUgVHggdW5pdCBpcyB0dXJuZWQgb2ZmISAqLworCQkJCQkJbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkJCQkvKiBSZW1vdmUgdGhpcyB2ZXJib3NpdHkgbGF0ZXIhICovCisJCQkJCQlEUFJJTlRLKCAxLCAoICIlczogVHggRklGTyBlcnJvciEgU3RhdHVzICUwNHhcbiIsCisJCQkJCQkJCQkgIGRldi0+bmFtZSwgY3NyMCApKTsKKwkJCQkJCS8qIFJlc3RhcnQgdGhlIGNoaXAuICovCisJCQkJCQlEUkVHID0gQ1NSMF9TVFJUOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHN0YXR1cyAmIChUTUQxX01PUkUgfCBUTUQxX09ORSB8IFRNRDFfREVGKSkKKwkJCQkJCWxwLT5zdGF0cy5jb2xsaXNpb25zKys7CisJCQkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQkJfQorCisJCQkJLyogWFhYIE1TY2g6IGZyZWUgc2tiPz8gKi8KKwkJCQlkaXJ0eV90eCsrOworCQkJfQorCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkJCWlmIChscC0+Y3VyX3R4IC0gZGlydHlfdHggPj0gVFhfUklOR19TSVpFKSB7CisJCQkJRFBSSU5USyggMCwgKCAib3V0LW9mLXN5bmMgZGlydHkgcG9pbnRlciwiCisJCQkJCQkJICAiICVkIHZzLiAlZCwgZnVsbD0lbGQuXG4iLAorCQkJCQkJCSAgZGlydHlfdHgsIGxwLT5jdXJfdHgsIGxwLT50eF9mdWxsICkpOworCQkJCWRpcnR5X3R4ICs9IFRYX1JJTkdfU0laRTsKKwkJCX0KKyNlbmRpZgorCisJCQlpZiAobHAtPnR4X2Z1bGwgJiYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJCQkmJiBkaXJ0eV90eCA+IGxwLT5jdXJfdHggLSBUWF9SSU5HX1NJWkUgKyAyKSB7CisJCQkJLyogVGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwsIGNsZWFyIHRidXN5LiAqLworCQkJCWxwLT50eF9mdWxsID0gMDsKKwkJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCQkJfQorCisJCQlscC0+ZGlydHlfdHggPSBkaXJ0eV90eDsKKwkJfQorCisJCS8qIExvZyBtaXNjIGVycm9ycy4gKi8KKwkJaWYgKGNzcjAgJiBDU1IwX0JBQkwpIGxwLT5zdGF0cy50eF9lcnJvcnMrKzsgLyogVHggYmFiYmxlLiAqLworCQlpZiAoY3NyMCAmIENTUjBfTUlTUykgbHAtPnN0YXRzLnJ4X2Vycm9ycysrOyAvKiBNaXNzZWQgYSBSeCBmcmFtZS4gKi8KKwkJaWYgKGNzcjAgJiBDU1IwX01FUlIpIHsKKwkJCURQUklOVEsoIDEsICggIiVzOiBCdXMgbWFzdGVyIGFyYml0cmF0aW9uIGZhaWx1cmUgKD8hPyksICIKKwkJCQkJCSAgInN0YXR1cyAlMDR4LlxuIiwgZGV2LT5uYW1lLCBjc3IwICkpOworCQkJLyogUmVzdGFydCB0aGUgY2hpcC4gKi8KKwkJCURSRUcgPSBDU1IwX1NUUlQ7CisJCX0KKwl9CisKKyAgICAvKiBDbGVhciBhbnkgb3RoZXIgaW50ZXJydXB0LCBhbmQgc2V0IGludGVycnVwdCBlbmFibGUuICovCisJRFJFRyA9IENTUjBfQkFCTCB8IENTUjBfQ0VSUiB8IENTUjBfTUlTUyB8IENTUjBfTUVSUiB8CisJCSAgIENTUjBfSURPTiB8IENTUjBfSU5FQTsKKworCURQUklOVEsoIDIsICggIiVzOiBleGl0aW5nIGludGVycnVwdCwgY3NyMD0lIzA0eC5cbiIsCisJCQkJICBkZXYtPm5hbWUsIERSRUcgKSk7CisKKwlzcGluX3VubG9jayAoJmxwLT5kZXZsb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCitzdGF0aWMgaW50IGxhbmNlX3J4KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKKworewlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGxhbmNlX3ByaXZhdGUgKilkZXYtPnByaXY7CisJaW50IGVudHJ5ID0gbHAtPmN1cl9yeCAmIFJYX1JJTkdfTU9EX01BU0s7CisJaW50IGk7CisKKwlEUFJJTlRLKCAyLCAoICIlczogcnggaW50LCBmbGFnPSUwNHhcbiIsIGRldi0+bmFtZSwKKwkJCQkgIE1FTS0+cnhfaGVhZFtlbnRyeV0uZmxhZyApKTsKKworCS8qIElmIHdlIG93biB0aGUgbmV4dCBlbnRyeSwgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCisJd2hpbGUoIChNRU0tPnJ4X2hlYWRbZW50cnldLmZsYWcgJiBSTUQxX09XTikgPT0gUk1EMV9PV05fSE9TVCApIHsKKwkJc3RydWN0IGxhbmNlX3J4X2hlYWQgKmhlYWQgPSAmKE1FTS0+cnhfaGVhZFtlbnRyeV0pOworCQlpbnQgc3RhdHVzID0gaGVhZC0+ZmxhZzsKKworCQlpZiAoc3RhdHVzICE9IChSTUQxX0VOUHxSTUQxX1NUUCkpIHsJCS8qIFRoZXJlIHdhcyBhbiBlcnJvci4gKi8KKwkJCS8qIFRoZXJlIGlzIGEgdHJpY2t5IGVycm9yIG5vdGVkIGJ5IEpvaG4gTXVycGh5LAorCQkJICAgPG11cmZAcGVyZnRlY2guY29tPiB0byBSdXNzIE5lbHNvbjogRXZlbiB3aXRoIGZ1bGwtc2l6ZWQKKwkJCSAgIGJ1ZmZlcnMgaXQncyBwb3NzaWJsZSBmb3IgYSBqYWJiZXIgcGFja2V0IHRvIHVzZSB0d28KKwkJCSAgIGJ1ZmZlcnMsIHdpdGggb25seSB0aGUgbGFzdCBjb3JyZWN0bHkgbm90aW5nIHRoZSBlcnJvci4gKi8KKwkJCWlmIChzdGF0dXMgJiBSTUQxX0VOUCkJLyogT25seSBjb3VudCBhIGdlbmVyYWwgZXJyb3IgYXQgdGhlICovCisJCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOyAvKiBlbmQgb2YgYSBwYWNrZXQuKi8KKwkJCWlmIChzdGF0dXMgJiBSTUQxX0ZSQU0pIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBSTUQxX09GTE8pIGxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIFJNRDFfQ1JDKSBscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIFJNRDFfQlVGRikgbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQloZWFkLT5mbGFnICY9IChSTUQxX0VOUHxSTUQxX1NUUCk7CisJCX0gZWxzZSB7CisJCQkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlciwgY29tcGF0aWJsZSB3aXRoIG5ldC0zLiAqLworCQkJc2hvcnQgcGt0X2xlbiA9IGhlYWQtPm1zZ19sZW5ndGggJiAweGZmZjsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCWlmIChwa3RfbGVuIDwgNjApIHsKKwkJCQlwcmludGsoICIlczogUnVudCBwYWNrZXQhXG4iLCBkZXYtPm5hbWUgKTsKKwkJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQl9CisJCQllbHNlIHsKKwkJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKCBwa3RfbGVuKzIgKTsKKwkJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQkJRFBSSU5USyggMSwgKCAiJXM6IE1lbW9yeSBzcXVlZXplLCBkZWZlcnJpbmcgcGFja2V0LlxuIiwKKwkJCQkJCQkJICBkZXYtPm5hbWUgKSk7CisJCQkJCWZvciggaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKyApCisJCQkJCQlpZiAoTUVNLT5yeF9oZWFkWyhlbnRyeStpKSAmIFJYX1JJTkdfTU9EX01BU0tdLmZsYWcgJgorCQkJCQkJCVJNRDFfT1dOX0NISVApCisJCQkJCQkJYnJlYWs7CisKKwkJCQkJaWYgKGkgPiBSWF9SSU5HX1NJWkUgLSAyKSB7CisJCQkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCQkJaGVhZC0+ZmxhZyB8PSBSTUQxX09XTl9DSElQOworCQkJCQkJbHAtPmN1cl9yeCsrOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmIChsYW5jZV9kZWJ1ZyA+PSAzKSB7CisJCQkJCXVfY2hhciAqZGF0YSA9IFBLVEJVRl9BRERSKGhlYWQpLCAqcDsKKwkJCQkJcHJpbnRrKCAiJXM6IFJYIHBrdCB0eXBlIDB4JTA0eCBmcm9tICIsIGRldi0+bmFtZSwKKwkJCQkJCQkoKHVfc2hvcnQgKilkYXRhKVs2XSk7CisJCQkJCWZvciggcCA9ICZkYXRhWzZdLCBpID0gMDsgaSA8IDY7IGkrKyApCisJCQkJCQlwcmludGsoIiUwMnglcyIsICpwKyssIGkgIT0gNSA/ICI6IiA6ICIiICk7CisJCQkJCXByaW50aygiIHRvICIpOworCQkJCQlmb3IoIHAgPSBkYXRhLCBpID0gMDsgaSA8IDY7IGkrKyApCisJCQkJCQlwcmludGsoIiUwMnglcyIsICpwKyssIGkgIT0gNSA/ICI6IiA6ICIiICk7CisJCQkJCXByaW50aygiIGRhdGEgJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICIKKwkJCQkJCSAgICJsZW4gJWRcbiIsCisJCQkJCQkgICBkYXRhWzE1XSwgZGF0YVsxNl0sIGRhdGFbMTddLCBkYXRhWzE4XSwKKwkJCQkJCSAgIGRhdGFbMTldLCBkYXRhWzIwXSwgZGF0YVsyMV0sIGRhdGFbMjJdLAorCQkJCQkJICAgcGt0X2xlbiApOworCQkJCX0KKworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlKCBza2IsIDIgKTsJLyogMTYgYnl0ZSBhbGlnbiAqLworCQkJCXNrYl9wdXQoIHNrYiwgcGt0X2xlbiApOwkvKiBNYWtlIHJvb20gKi8KKwkJCQlscC0+bWVtY3B5X2YoIHNrYi0+ZGF0YSwgUEtUQlVGX0FERFIoaGVhZCksIHBrdF9sZW4gKTsKKwkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoIHNrYiwgZGV2ICk7CisJCQkJbmV0aWZfcngoIHNrYiApOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJCX0KKwkJfQorCisJCWhlYWQtPmZsYWcgfD0gUk1EMV9PV05fQ0hJUDsKKwkJZW50cnkgPSAoKytscC0+Y3VyX3J4KSAmIFJYX1JJTkdfTU9EX01BU0s7CisJfQorCWxwLT5jdXJfcnggJj0gUlhfUklOR19NT0RfTUFTSzsKKworCS8qIEZyb20gbGFuY2UuYyAoRG9uYWxkIEJlY2tlcik6ICovCisJLyogV2Ugc2hvdWxkIGNoZWNrIHRoYXQgYXQgbGVhc3QgdHdvIHJpbmcgZW50cmllcyBhcmUgZnJlZS4JIElmIG5vdCwKKwkgICB3ZSBzaG91bGQgZnJlZSBvbmUgYW5kIG1hcmsgc3RhdHMtPnJ4X2Ryb3BwZWQrKy4gKi8KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgbGFuY2VfY2xvc2UoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQorCit7CXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwlzdHJ1Y3QgbGFuY2VfaW9yZWcJICpJTyA9IGxwLT5pb2Jhc2U7CisKKwluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCisJQVJFRyA9IENTUjA7CisKKwlEUFJJTlRLKCAyLCAoICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQsIHN0YXR1cyB3YXMgJTIuMnguXG4iLAorCQkJCSAgZGV2LT5uYW1lLCBEUkVHICkpOworCisJLyogV2Ugc3RvcCB0aGUgTEFOQ0UgaGVyZSAtLSBpdCBvY2Nhc2lvbmFsbHkgcG9sbHMKKwkgICBtZW1vcnkgaWYgd2UgZG9uJ3QuICovCisJRFJFRyA9IENTUjBfU1RPUDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbGFuY2VfZ2V0X3N0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKKworewlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGxhbmNlX3ByaXZhdGUgKilkZXYtPnByaXY7CisKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworCisvKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAgIG51bV9hZGRycyA9PSAtMQkJUHJvbWlzY3VvdXMgbW9kZSwgcmVjZWl2ZSBhbGwgcGFja2V0cworICAgbnVtX2FkZHJzID09IDAJCU5vcm1hbCBtb2RlLCBjbGVhciBtdWx0aWNhc3QgbGlzdAorICAgbnVtX2FkZHJzID4gMAkJTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLCBhbmQgZG8KKwkJCQkJCWJlc3QtZWZmb3J0IGZpbHRlcmluZy4KKyAqLworCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3QoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQorCit7CXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwlzdHJ1Y3QgbGFuY2VfaW9yZWcJICpJTyA9IGxwLT5pb2Jhc2U7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQkvKiBPbmx5IHBvc3NpYmxlIGlmIGJvYXJkIGlzIGFscmVhZHkgc3RhcnRlZCAqLworCQlyZXR1cm47CisKKwkvKiBXZSB0YWtlIHRoZSBzaW1wbGUgd2F5IG91dCBhbmQgYWx3YXlzIGVuYWJsZSBwcm9taXNjdW91cyBtb2RlLiAqLworCURSRUcgPSBDU1IwX1NUT1A7IC8qIFRlbXBvcmFyaWx5IHN0b3AgdGhlIGxhbmNlLiAqLworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQkvKiBMb2cgYW55IG5ldCB0YXBzLiAqLworCQlEUFJJTlRLKCAxLCAoICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgZGV2LT5uYW1lICkpOworCQlSRUdBKCBDU1IxNSApID0gMHg4MDAwOyAvKiBTZXQgcHJvbWlzY3VvdXMgbW9kZSAqLworCX0gZWxzZSB7CisJCXNob3J0IG11bHRpY2FzdF90YWJsZVs0XTsKKwkJaW50IG51bV9hZGRycyA9IGRldi0+bWNfY291bnQ7CisJCWludCBpOworCQkvKiBXZSBkb24ndCB1c2UgdGhlIG11bHRpY2FzdCB0YWJsZSwgYnV0IHJlbHkgb24gdXBwZXItbGF5ZXIKKwkJICogZmlsdGVyaW5nLiAqLworCQltZW1zZXQoIG11bHRpY2FzdF90YWJsZSwgKG51bV9hZGRycyA9PSAwKSA/IDAgOiAtMSwKKwkJCQlzaXplb2YobXVsdGljYXN0X3RhYmxlKSApOworCQlmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkKKwkJCVJFR0EoIENTUjgraSApID0gbXVsdGljYXN0X3RhYmxlW2ldOworCQlSRUdBKCBDU1IxNSApID0gMDsgLyogVW5zZXQgcHJvbWlzY3VvdXMgbW9kZSAqLworCX0KKworCS8qCisJICogQWx3YXlzIHNldCBCU1dQIGFmdGVyIGEgU1RPUCBhcyBTVE9QIHB1dHMgaXQgYmFjayBpbnRvCisJICogbGl0dGxlIGVuZGlhbiBtb2RlLgorCSAqLworCVJFR0EoIENTUjMgKSA9IENTUjNfQlNXUCB8IChscC0+Y2FyZHR5cGUgPT0gUEFNX0NBUkQgPyBDU1IzX0FDT04gOiAwKTsKKworCS8qIFJlc3VtZSBub3JtYWwgb3BlcmF0aW9uIGFuZCByZXNldCBBUkVHIHRvIENTUjAgKi8KKwlSRUdBKCBDU1IwICkgPSBDU1IwX0lET04gfCBDU1IwX0lORUEgfCBDU1IwX1NUUlQ7Cit9CisKKworLyogVGhpcyBpcyBuZWVkZWQgZm9yIG9sZCBSaWVibENhcmRzIGFuZCBwb3NzaWJsZSBmb3IgbmV3IFJpZWJsQ2FyZHMgKi8KKworc3RhdGljIGludCBsYW5jZV9zZXRfbWFjX2FkZHJlc3MoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIgKQorCit7CXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhZGRyID0gYWRkcjsKKwlpbnQgaTsKKworCWlmIChscC0+Y2FyZHR5cGUgIT0gT0xEX1JJRUJMICYmIGxwLT5jYXJkdHlwZSAhPSBORVdfUklFQkwpCisJCXJldHVybiggLUVPUE5PVFNVUFAgKTsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJLyogT25seSBwb3NzaWJsZSB3aGlsZSBjYXJkIGlzbid0IHN0YXJ0ZWQgKi8KKwkJRFBSSU5USyggMSwgKCAiJXM6IGh3YWRkciBjYW4gYmUgc2V0IG9ubHkgd2hpbGUgY2FyZCBpc24ndCBvcGVuLlxuIiwKKwkJCQkJICBkZXYtPm5hbWUgKSk7CisJCXJldHVybiggLUVJTyApOworCX0KKworCW1lbWNweSggZGV2LT5kZXZfYWRkciwgc2FkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4gKTsKKwlmb3IoIGkgPSAwOyBpIDwgNjsgaSsrICkKKwkJTUVNLT5pbml0Lmh3YWRkcltpXSA9IGRldi0+ZGV2X2FkZHJbaV4xXTsgLyogPC0gMTYgYml0IHN3YXAhICovCisJbHAtPm1lbWNweV9mKCBSSUVCTF9IV0FERFJfQUREUiwgZGV2LT5kZXZfYWRkciwgNiApOworCS8qIHNldCBhbHNvIHRoZSBtYWdpYyBmb3IgZnV0dXJlIHNlc3Npb25zICovCisJKlJJRUJMX01BR0lDX0FERFIgPSBSSUVCTF9NQUdJQzsKKworCXJldHVybiggMCApOworfQorCisMCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmF0YXJpbGFuY2VfZGV2OworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlhdGFyaWxhbmNlX2RldiA9IGF0YXJpbGFuY2VfcHJvYmUoLTEpOworCWlmIChJU19FUlIoYXRhcmlsYW5jZV9kZXYpKQorCQlyZXR1cm4gUFRSX0VSUihhdGFyaWxhbmNlX2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihhdGFyaWxhbmNlX2Rldik7CisJZnJlZV9pcnEoYXRhcmlsYW5jZV9kZXYtPmlycSwgYXRhcmlsYW5jZV9kZXYpOworCWZyZWVfbmV0ZGV2KGF0YXJpbGFuY2VfZGV2KTsKK30KKworI2VuZGlmIC8qIE1PRFVMRSAqLworDAorCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtaW5kZW50LWxldmVsOiA0CisgKiAgdGFiLXdpZHRoOiA0CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0cC5jIGIvZHJpdmVycy9uZXQvYXRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZhNjc0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2F0cC5jCkBAIC0wLDAgKzEsOTUyIEBACisvKiBhdHAuYzogQXR0YWNoZWQgKHBvY2tldCkgZXRoZXJuZXQgYWRhcHRlciBkcml2ZXIgZm9yIGxpbnV4LiAqLworLyoKKwlUaGlzIGlzIGEgZHJpdmVyIGZvciBjb21tb25seSBPRU0gcG9ja2V0IChwYXJhbGxlbCBwb3J0KQorCWV0aGVybmV0IGFkYXB0ZXJzIGJhc2VkIG9uIHRoZSBSZWFsdGVrIFJUTDgwMDIgYW5kIFJUTDgwMTIgY2hpcHMuCisKKwlXcml0dGVuIDE5OTMtMjAwMCBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorCXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisJRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdAorCXJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZS4gIFRoaXMgZmlsZSBpcyBub3QKKwlhIGNvbXBsZXRlIHByb2dyYW0gYW5kIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgZW50aXJlIG9wZXJhdGluZworCXN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorCisJQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZSBEaXJlY3RvciwKKwlOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuICBDb3B5cmlnaHQgMTk5NC0yMDAwIHJldGFpbmVkIGJ5IHRoZSBvcmlnaW5hbAorCWF1dGhvciwgRG9uYWxkIEJlY2tlci4gVGhlIHRpbWVyLWJhc2VkIHJlc2V0IGNvZGUgd2FzIHN1cHBsaWVkIGluIDE5OTUKKwlieSBCaWxsIENhcmxzb24sIHd3Y0BzdXBlci5vcmcuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKwlTdXBwb3J0IGluZm9ybWF0aW9uIGFuZCB1cGRhdGVzIGF2YWlsYWJsZSBhdAorCWh0dHA6Ly93d3cuc2N5bGQuY29tL25ldHdvcmsvYXRwLmh0bWwKKworCisJTW9kdWxhciBzdXBwb3J0L3NvZnRuZXQgYWRkZWQgYnkgQWxhbiBDb3guCisJX2JpdCBhYnVzZSBmaXhlZCB1cCBieSBBbGFuIENveAorCisqLworCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uQVtdID0KKyJhdHAuYzp2MS4wOT1hYyAyMDAyLzEwLzAxIERvbmFsZCBCZWNrZXIgPGJlY2tlckBzY3lsZC5jb20+XG4iOworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbkJbXSA9CisiICBodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL2F0cC5odG1sXG4iOworCisvKiBUaGUgdXNlci1jb25maWd1cmFibGUgdmFsdWVzLgorICAgVGhlc2UgbWF5IGJlIG1vZGlmaWVkIHdoZW4gYSBkcml2ZXIgbW9kdWxlIGlzIGxvYWRlZC4qLworCitzdGF0aWMgaW50IGRlYnVnID0gMTsgCQkJLyogMSBub3JtYWwgbWVzc2FnZXMsIDAgcXVpZXQgLi4gNyB2ZXJib3NlLiAqLworI2RlZmluZSBuZXRfZGVidWcgZGVidWcKKworLyogTWF4aW11bSBldmVudHMgKFJ4IHBhY2tldHMsIGV0Yy4pIHRvIGhhbmRsZSBhdCBlYWNoIGludGVycnVwdC4gKi8KK3N0YXRpYyBpbnQgbWF4X2ludGVycnVwdF93b3JrID0gMTU7CisKKyNkZWZpbmUgTlVNX1VOSVRTIDIKKy8qIFRoZSBzdGFuZGFyZCBzZXQgb2YgSVNBIG1vZHVsZSBwYXJhbWV0ZXJzLiAqLworc3RhdGljIGludCBpb1tOVU1fVU5JVFNdOworc3RhdGljIGludCBpcnFbTlVNX1VOSVRTXTsKK3N0YXRpYyBpbnQgeGN2cltOVU1fVU5JVFNdOyAJCQkvKiBUaGUgZGF0YSB0cmFuc2ZlciBtb2RlLiAqLworCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIHNldCBhdCBjb21waWxlIHRpbWUuICovCisKKy8qIFRpbWUgaW4gamlmZmllcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZy4gKi8KKyNkZWZpbmUgVFhfVElNRU9VVCAgKDQwMCpIWi8xMDAwKQorCisvKgorCVRoaXMgZmlsZSBpcyBhIGRldmljZSBkcml2ZXIgZm9yIHRoZSBSZWFsVGVrIChha2EgQVQtTGFuLVRlYykgcG9ja2V0CisJZXRoZXJuZXQgYWRhcHRlci4gIFRoaXMgaXMgYSBjb21tb24gbG93LWNvc3QgT0VNIHBvY2tldCBldGhlcm5ldAorCWFkYXB0ZXIsIHNvbGQgdW5kZXIgbWFueSBuYW1lcy4KKworICBTb3VyY2VzOgorCVRoaXMgZHJpdmVyIHdhcyB3cml0dGVuIGZyb20gdGhlIHBhY2tldCBkcml2ZXIgYXNzZW1ibHkgY29kZSBwcm92aWRlZCBieQorCVZpbmNlbnQgQm9ubyBvZiBBVC1MYW4tVGVjLgkgRXZlciB0cnkgdG8gZmlndXJlIG91dCBob3cgYSBjb21wbGljYXRlZAorCWRldmljZSB3b3JrcyBqdXN0IGZyb20gdGhlIGFzc2VtYmx5IGNvZGU/ICBJdCBhaW4ndCBwcmV0dHkuICBUaGUgZm9sbG93aW5nCisJZGVzY3JpcHRpb24gaXMgd3JpdHRlbiBiYXNlZCBvbiBndWVzc2VzIGFuZCB3cml0aW5nIGxvdHMgb2Ygc3BlY2lhbC1wdXJwb3NlCisJY29kZSB0byB0ZXN0IG15IHRoZW9yaXplZCBvcGVyYXRpb24uCisKKwlJbiAxOTk3IFJlYWx0ZWsgbWFkZSBhdmFpbGFibGUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBzZWNvbmQgZ2VuZXJhdGlvbgorCVJUTDgwMTIgY2hpcCwgd2hpY2ggaGFzIGxlYWQgdG8gc2V2ZXJhbCBkcml2ZXIgaW1wcm92ZW1lbnRzLgorCSAgaHR0cDovL3d3dy5yZWFsdGVrLmNvbS50dy9jbi9jbi5odG1sCisKKwkJCQkJVGhlb3J5IG9mIE9wZXJhdGlvbgorCisJVGhlIFJUTDgwMDIgYWRhcHRlciBzZWVtcyB0byBiZSBidWlsdCBhcm91bmQgYSBjdXN0b20gc3BpbiBvZiB0aGUgU0VFUQorCWNvbnRyb2xsZXIgY29yZS4gIEl0IHByb2JhYmx5IGhhcyBhIDE2SyBvciA2NEsgaW50ZXJuYWwgcGFja2V0IGJ1ZmZlciwgb2YKKwl3aGljaCB0aGUgZmlyc3QgNEsgaXMgZGV2b3RlZCB0byB0cmFuc21pdCBhbmQgdGhlIHJlc3QgdG8gcmVjZWl2ZS4KKwlUaGUgY29udHJvbGxlciBtYWludGFpbnMgdGhlIHF1ZXVlIG9mIHJlY2VpdmVkIHBhY2tldCBhbmQgdGhlIHBhY2tldCBidWZmZXIKKwlhY2Nlc3MgcG9pbnRlciBpbnRlcm5hbGx5LCB3aXRoIG9ubHkgJ3Jlc2V0IHRvIGJlZ2lubmluZycgYW5kICdza2lwIHRvIG5leHQKKwlwYWNrZXQnIGNvbW1hbmRzIHZpc2libGUuICBUaGUgdHJhbnNtaXQgcGFja2V0IHF1ZXVlIGhvbGRzIHR3byAob3IgbW9yZT8pCisJcGFja2V0czogYm90aCAncmV0cmFuc21pdCB0aGlzIHBhY2tldCcgKGR1ZSB0byBjb2xsaXNpb24pIGFuZCAndHJhbnNtaXQgbmV4dAorCXBhY2tldCcgY29tbWFuZHMgbXVzdCBiZSBzdGFydGVkIGJ5IGhhbmQuCisKKwlUaGUgc3RhdGlvbiBhZGRyZXNzIGlzIHN0b3JlZCBpbiBhIHN0YW5kYXJkIGJpdC1zZXJpYWwgRUVQUk9NIHdoaWNoIG11c3QgYmUKKwlyZWFkICh1Z2hoKSBieSB0aGUgZGV2aWNlIGRyaXZlci4gIChQcm92aXNpb25zIGhhdmUgYmVlbiBtYWRlIGZvcgorCXN1YnN0aXR1dGluZyBhIDc0UzI4OCBQUk9NLCBidXQgSSBoYXZlbid0IGdvdHRlbiByZXBvcnRzIG9mIGFueSBtb2RlbHMKKwl1c2luZyBpdC4pICBVbmxpa2UgYnVpbHQtaW4gZGV2aWNlcywgYSBwb2NrZXQgYWRhcHRlciBjYW4gdGVtcG9yYXJpbHkgbG9zZQorCXBvd2VyIHdpdGhvdXQgaW5kaWNhdGlvbiB0byB0aGUgZGV2aWNlIGRyaXZlci4gIFRoZSBtYWpvciBlZmZlY3QgaXMgdGhhdAorCXRoZSBzdGF0aW9uIGFkZHJlc3MsIHJlY2VpdmUgZmlsdGVyIChwcm9taXNjdW91cywgZXRjLikgYW5kIHRyYW5zY2VpdmVyCisJbXVzdCBiZSByZXNldC4KKworCVRoZSBjb250cm9sbGVyIGl0c2VsZiBoYXMgMTYgcmVnaXN0ZXJzLCBzb21lIG9mIHdoaWNoIHVzZSBvbmx5IHRoZSBsb3dlcgorCWJpdHMuICBUaGUgcmVnaXN0ZXJzIGFyZSByZWFkIGFuZCB3cml0dGVuIDQgYml0cyBhdCBhIHRpbWUuICBUaGUgZm91ciBiaXQKKwlyZWdpc3RlciBhZGRyZXNzIGlzIHByZXNlbnRlZCBvbiB0aGUgZGF0YSBsaW5lcyBhbG9uZyB3aXRoIGEgZmV3IGFkZGl0aW9uYWwKKwl0aW1pbmcgYW5kIGNvbnRyb2wgYml0cy4gIFRoZSBkYXRhIGlzIHRoZW4gcmVhZCBmcm9tIHN0YXR1cyBwb3J0IG9yIHdyaXR0ZW4KKwl0byB0aGUgZGF0YSBwb3J0LgorCisJQ29ycmVjdGlvbjogdGhlIGNvbnRyb2xsZXIgaGFzIHR3byBiYW5rcyBvZiAxNiByZWdpc3RlcnMuICBUaGUgc2Vjb25kCisJYmFuayBjb250YWlucyBvbmx5IHRoZSBtdWx0aWNhc3QgZmlsdGVyIHRhYmxlIChub3cgdXNlZCkgYW5kIHRoZSBFRVBST00KKwlhY2Nlc3MgcmVnaXN0ZXJzLgorCisJU2luY2UgdGhlIGJ1bGsgZGF0YSB0cmFuc2ZlciBvZiB0aGUgYWN0dWFsIHBhY2tldHMgdGhyb3VnaCB0aGUgc2xvdworCXBhcmFsbGVsIHBvcnQgZG9taW5hdGVzIHRoZSBkcml2ZXIncyBydW5uaW5nIHRpbWUsIGZvdXIgZGlzdGluY3QgZGF0YQorCShub24tcmVnaXN0ZXIpIHRyYW5zZmVyIG1vZGVzIGFyZSBwcm92aWRlZCBieSB0aGUgYWRhcHRlciwgdHdvIGluIGVhY2gKKwlkaXJlY3Rpb24uICBJbiB0aGUgZmlyc3QgbW9kZSB0aW1pbmcgZm9yIHRoZSBuaWJibGUgdHJhbnNmZXJzIGlzCisJcHJvdmlkZWQgdGhyb3VnaCB0aGUgZGF0YSBwb3J0LiAgSW4gdGhlIHNlY29uZCBtb2RlIHRoZSBzYW1lIHRpbWluZyBpcworCXByb3ZpZGVkIHRocm91Z2ggdGhlIGNvbnRyb2wgcG9ydC4gIEluIGVpdGhlciBjYXNlIHRoZSBkYXRhIGlzIHJlYWQgZnJvbQorCXRoZSBzdGF0dXMgcG9ydCBhbmQgd3JpdHRlbiB0byB0aGUgZGF0YSBwb3J0LCBqdXN0IGFzIGl0IGlzIGFjY2Vzc2luZworCXJlZ2lzdGVycy4KKworCUluIGFkZGl0aW9uIHRvIHRoZSBiYXNpYyBkYXRhIHRyYW5zZmVyIG1ldGhvZHMsIHNldmVyYWwgbW9yZSBhcmUgbW9kZXMgYXJlCisJY3JlYXRlZCBieSBhZGRpbmcgc29tZSBkZWxheSBieSBkb2luZyBtdWx0aXBsZSByZWFkcyBvZiB0aGUgZGF0YSB0byBhbGxvdworCWl0IHRvIHN0YWJpbGl6ZS4gIFRoaXMgZGVsYXkgc2VlbXMgdG8gYmUgbmVlZGVkIG9uIG1vc3QgbWFjaGluZXMuCisKKwlUaGUgZGF0YSB0cmFuc2ZlciBtb2RlIGlzIHN0b3JlZCBpbiB0aGUgJ2Rldi0+aWZfcG9ydCcgZmllbGQuICBJdHMgZGVmYXVsdAorCXZhbHVlIGlzICc0Jy4gIEl0IG1heSBiZSBvdmVycmlkZGVuIGF0IGJvb3QtdGltZSB1c2luZyB0aGUgdGhpcmQgcGFyYW1ldGVyCisJdG8gdGhlICJldGhlcj0uLi4iIGluaXRpYWxpemF0aW9uLgorCisJVGhlIGhlYWRlciBmaWxlIDxhdHAuaD4gcHJvdmlkZXMgaW5saW5lIGZ1bmN0aW9ucyB0aGF0IGVuY2Fwc3VsYXRlIHRoZQorCXJlZ2lzdGVyIGFuZCBkYXRhIGFjY2VzcyBtZXRob2RzLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBoYW5kLXR1bmVkIHRvCisJZ2VuZXJhdGUgcmVhc29uYWJsZSBvYmplY3QgY29kZS4gIFRoaXMgaGVhZGVyIGZpbGUgYWxzbyBkb2N1bWVudHMgbXkKKwlpbnRlcnByZXRhdGlvbnMgb2YgdGhlIGRldmljZSByZWdpc3RlcnMuCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisjaW5jbHVkZSAiYXRwLmgiCisKK01PRFVMRV9BVVRIT1IoIkRvbmFsZCBCZWNrZXIgPGJlY2tlckBzY3lsZC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJlYWxUZWsgUlRMODAwMi84MDEyIHBhcmFsbGVsIHBvcnQgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShtYXhfaW50ZXJydXB0X3dvcmssIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KHhjdnIsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9pbnRlcnJ1cHRfd29yaywgIkFUUCBtYXhpbXVtIGV2ZW50cyBoYW5kbGVkIHBlciBpbnRlcnJ1cHQiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJBVFAgZGVidWcgbGV2ZWwgKDAtNykiKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJBVFAgSS9PIGJhc2UgYWRkcmVzcyhlcykiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiQVRQIElSUSBudW1iZXIocykiKTsKK01PRFVMRV9QQVJNX0RFU0MoeGN2ciwgIkFUUCB0cmFuc2NlaXZlcihzKSAoMD1pbnRlcm5hbCwgMT1leHRlcm5hbCkiKTsKKworLyogVGhlIG51bWJlciBvZiBsb3cgSS9PIHBvcnRzIHVzZWQgYnkgdGhlIGV0aGVyY2FyZC4gKi8KKyNkZWZpbmUgRVRIRVJDQVJEX1RPVEFMX1NJWkUJMworCisvKiBTZXF1ZW5jZSB0byBzd2l0Y2ggYW4gODAxMiBmcm9tIHByaW50ZXIgbXV4IHRvIGV0aGVybmV0IG1vZGUuICovCitzdGF0aWMgY2hhciBtdXhfODAxMltdID0geyAweGZmLCAweGY3LCAweGZmLCAweGZiLCAweGYzLCAweGZiLCAweGZmLCAweGY3LH07CisKK3N0cnVjdCBuZXRfbG9jYWwgeworICAgIHNwaW5sb2NrX3QgbG9jazsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV4dF9tb2R1bGU7CisgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisgICAgc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CS8qIE1lZGlhIHNlbGVjdGlvbiB0aW1lci4gKi8KKyAgICBsb25nIGxhc3RfcnhfdGltZTsJCS8qIExhc3QgUngsIGluIGppZmZpZXMsIHRvIGhhbmRsZSBSeCBoYW5nLiAqLworICAgIGludCBzYXZlZF90eF9zaXplOworICAgIHVuc2lnbmVkIGludCB0eF91bml0X2J1c3k6MTsKKyAgICB1bnNpZ25lZCBjaGFyIHJlX3R4LAkvKiBOdW1iZXIgb2YgcGFja2V0IHJldHJhbnNtaXNzaW9ucy4gKi8KKwkJYWRkcl9tb2RlLAkJLyogQ3VycmVudCBSeCBmaWx0ZXIgZS5nLiBwcm9taXNjdW91cywgZXRjLiAqLworCQlwYWNfY250X2luX3R4X2J1ZiwKKwkJY2hpcF90eXBlOworfTsKKworLyogVGhpcyBjb2RlLCB3cml0dGVuIGJ5IHd3Y0BzdXBlci5vcmcsIHJlc2V0cyB0aGUgYWRhcHRlciBldmVyeQorICAgVElNRURfQ0hFQ0tFUiB0aWNrcy4gIFRoaXMgcmVjb3ZlcnMgZnJvbSBhbiB1bmtub3duIGVycm9yIHdoaWNoCisgICBoYW5ncyB0aGUgZGV2aWNlLiAqLworI2RlZmluZSBUSU1FRF9DSEVDS0VSIChIWi80KQorI2lmZGVmIFRJTUVEX0NIRUNLRVIKKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorc3RhdGljIHZvaWQgYXRwX3RpbWVkX2NoZWNrZXIodW5zaWduZWQgbG9uZyBpZ25vcmVkKTsKKyNlbmRpZgorCisvKiBJbmRleCB0byBmdW5jdGlvbnMsIGFzIGZ1bmN0aW9uIHByb3RvdHlwZXMuICovCisKK3N0YXRpYyBpbnQgYXRwX3Byb2JlMShsb25nIGlvYWRkcik7CitzdGF0aWMgdm9pZCBnZXRfbm9kZV9JRChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBlZXByb21fb3AobG9uZyBpb2FkZHIsIHVuc2lnbmVkIGludCBjbWQpOworc3RhdGljIGludCBuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGhhcmR3YXJlX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB3cml0ZV9wYWNrZXQobG9uZyBpb2FkZHIsIGludCBsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKnBhY2tldCwgaW50IHBhZCwgaW50IG1vZGUpOworc3RhdGljIHZvaWQgdHJpZ2dlcl9zZW5kKGxvbmcgaW9hZGRyLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyBpbnQJYXRwX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGF0cF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBuZXRfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCByZWFkX2Jsb2NrKGxvbmcgaW9hZGRyLCBpbnQgbGVuZ3RoLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBkYXRhX21vZGUpOworc3RhdGljIGludCBuZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZV84MDAyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X3J4X21vZGVfODAxMihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHR4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworLyogQSBsaXN0IG9mIGFsbCBpbnN0YWxsZWQgQVRQIGRldmljZXMsIGZvciByZW1vdmluZyB0aGUgZHJpdmVyIG1vZHVsZS4gKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqcm9vdF9hdHBfZGV2OworCisvKiBDaGVjayBmb3IgYSBuZXR3b3JrIGFkYXB0ZXIgb2YgdGhpcyB0eXBlLCBhbmQgcmV0dXJuICcwJyBpZmYgb25lIGV4aXN0cy4KKyAgIElmIGRldi0+YmFzZV9hZGRyID09IDAsIHByb2JlIGFsbCBsaWtlbHkgbG9jYXRpb25zLgorICAgSWYgZGV2LT5iYXNlX2FkZHIgPT0gMSwgYWx3YXlzIHJldHVybiBmYWlsdXJlLgorICAgSWYgZGV2LT5iYXNlX2FkZHIgPT0gMiwgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBkZXZpY2UgYW5kIHJldHVybiBzdWNjZXNzCisgICAoZGV0YWNoYWJsZSBkZXZpY2VzIG9ubHkpLgorICAgCisgICBGSVhNRTogd2Ugc2hvdWxkIHVzZSB0aGUgcGFycG9ydCBsYXllciBmb3IgdGhpcworICAgKi8KK3N0YXRpYyBpbnQgX19pbml0IGF0cF9pbml0KHZvaWQpCit7CisJaW50ICpwb3J0LCBwb3J0c1tdID0gezB4Mzc4LCAweDI3OCwgMHgzYmMsIDB9OworCWludCBiYXNlX2FkZHIgPSBpb1swXTsKKworCWlmIChiYXNlX2FkZHIgPiAweDFmZikJCS8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KKwkJcmV0dXJuIGF0cF9wcm9iZTEoYmFzZV9hZGRyKTsKKwllbHNlIGlmIChiYXNlX2FkZHIgPT0gMSkJLyogRG9uJ3QgcHJvYmUgYXQgYWxsLiAqLworCQlyZXR1cm4gLUVOWElPOworCisJZm9yIChwb3J0ID0gcG9ydHM7ICpwb3J0OyBwb3J0KyspIHsKKwkJbG9uZyBpb2FkZHIgPSAqcG9ydDsKKwkJb3V0YigweDU3LCBpb2FkZHIgKyBQQVJfREFUQSk7CisJCWlmIChpbmIoaW9hZGRyICsgUEFSX0RBVEEpICE9IDB4NTcpCisJCQljb250aW51ZTsKKwkJaWYgKGF0cF9wcm9iZTEoaW9hZGRyKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGF0cF9wcm9iZTEobG9uZyBpb2FkZHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IG5ldF9sb2NhbCAqbHA7CisJaW50IHNhdmVkX2N0cmxfcmVnLCBzdGF0dXMsIGk7CisJaW50IHJlczsKKworCW91dGIoMHhmZiwgaW9hZGRyICsgUEFSX0RBVEEpOworCS8qIFNhdmUgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSBDb250cm9sIHJlZ2lzdGVyLCBpbiBjYXNlIHdlIGd1ZXNzZWQKKwkgICB3cm9uZy4gKi8KKwlzYXZlZF9jdHJsX3JlZyA9IGluYihpb2FkZHIgKyBQQVJfQ09OVFJPTCk7CisJaWYgKG5ldF9kZWJ1ZyA+IDMpCisJCXByaW50aygiYXRwOiBDb250cm9sIHJlZ2lzdGVyIHdhcyAlIzIuMnguXG4iLCBzYXZlZF9jdHJsX3JlZyk7CisJLyogSVJRRU49MCwgU0xDVEI9aGlnaCBJTklUQj1oaWdoLCBBVVRPRkRCPWhpZ2gsIFNUQkI9aGlnaC4gKi8KKwlvdXRiKDB4MDQsIGlvYWRkciArIFBBUl9DT05UUk9MKTsKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCWlmIChuZXRfZGVidWcgPiAzKSB7CisJCS8qIFR1cm4gb2ZmIHRoZSBwcmludGVyIG11bHRpcGxleGVyIG9uIHRoZSA4MDEyLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQkJb3V0YihtdXhfODAxMltpXSwgaW9hZGRyICsgUEFSX0RBVEEpOworCQl3cml0ZV9yZWcoaW9hZGRyLCBNT0RTRUwsIDB4MDApOworCQlwcmludGsoImF0cDogUmVnaXN0ZXJzIGFyZSAiKTsKKwkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCQlwcmludGsoIiAlMi4yeCIsIHJlYWRfbmliYmxlKGlvYWRkciwgaSkpOworCQlwcmludGsoIi5cbiIpOworCX0KKyNlbmRpZgorCS8qIFR1cm4gb2ZmIHRoZSBwcmludGVyIG11bHRpcGxleGVyIG9uIHRoZSA4MDEyLiAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCW91dGIobXV4XzgwMTJbaV0sIGlvYWRkciArIFBBUl9EQVRBKTsKKwl3cml0ZV9yZWdfaGlnaChpb2FkZHIsIENNUjEsIENNUjFoX1JFU0VUKTsKKwkvKiB1ZGVsYXkoKSBoZXJlPyAqLworCXN0YXR1cyA9IHJlYWRfbmliYmxlKGlvYWRkciwgQ01SMSk7CisKKwlpZiAobmV0X2RlYnVnID4gMykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiYXRwOiBTdGF0dXMgbmliYmxlIHdhcyAlIzIuMnguLiIsIHN0YXR1cyk7CisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQkJcHJpbnRrKCIgJTIuMngiLCByZWFkX25pYmJsZShpb2FkZHIsIGkpKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKworCWlmICgoc3RhdHVzICYgMHg3OCkgIT0gMHgwOCkgeworCQkvKiBUaGUgcG9ja2V0IGFkYXB0ZXIgcHJvYmUgZmFpbGVkLCByZXN0b3JlIHRoZSBjb250cm9sIHJlZ2lzdGVyLiAqLworCQlvdXRiKHNhdmVkX2N0cmxfcmVnLCBpb2FkZHIgKyBQQVJfQ09OVFJPTCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlzdGF0dXMgPSByZWFkX25pYmJsZShpb2FkZHIsIENNUjJfaCk7CisJaWYgKChzdGF0dXMgJiAweDc4KSAhPSAweDEwKSB7CisJCW91dGIoc2F2ZWRfY3RybF9yZWcsIGlvYWRkciArIFBBUl9DT05UUk9MKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJLyogRmluZCB0aGUgSVJRIHVzZWQgYnkgdHJpZ2dlcmluZyBhbiBpbnRlcnJ1cHQuICovCisJd3JpdGVfcmVnX2J5dGUoaW9hZGRyLCBDTVIyLCAweDAxKTsJCQkvKiBObyBhY2NlcHQgbW9kZSwgSVJRIG91dC4gKi8KKwl3cml0ZV9yZWdfaGlnaChpb2FkZHIsIENNUjEsIENNUjFoX1J4RU5BQkxFIHwgQ01SMWhfVHhFTkFCTEUpOwkvKiBFbmFibGUgVHggYW5kIFJ4LiAqLworCisJLyogT21pdCBhdXRvSVJRIHJvdXRpbmUgZm9yIG5vdy4gVXNlICJ0YWJsZSBsb29rdXAiIGluc3RlYWQuICBVaGdnZ2guICovCisJaWYgKGlycVswXSkKKwkJZGV2LT5pcnEgPSBpcnFbMF07CisJZWxzZSBpZiAoaW9hZGRyID09IDB4Mzc4KQorCQlkZXYtPmlycSA9IDc7CisJZWxzZQorCQlkZXYtPmlycSA9IDU7CisJd3JpdGVfcmVnX2hpZ2goaW9hZGRyLCBDTVIxLCBDTVIxaF9UeFJ4T0ZGKTsgLyogRGlzYWJsZSBUeCBhbmQgUnggdW5pdHMuICovCisJd3JpdGVfcmVnKGlvYWRkciwgQ01SMiwgQ01SMl9OVUxMKTsKKworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCisJLyogUmVhZCB0aGUgc3RhdGlvbiBhZGRyZXNzIFBST00uICAqLworCWdldF9ub2RlX0lEKGRldik7CisKKyNpZm5kZWYgTU9EVUxFCisJaWYgKG5ldF9kZWJ1ZykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiIEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uQSwgdmVyc2lvbkIpOworI2VuZGlmCisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBQb2NrZXQgYWRhcHRlciBmb3VuZCBhdCAlIzNseCwgSVJRICVkLCBTQVBST00gIgorCQkgICAiJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlguXG4iLCBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLAorCQkgICBkZXYtPmlycSwgZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKKwkJICAgZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7CisKKwkvKiBSZXNldCB0aGUgZXRoZXJuZXQgaGFyZHdhcmUgYW5kIGFjdGl2YXRlIHRoZSBwcmludGVyIHBhc3MtdGhyb3VnaC4gKi8KKwl3cml0ZV9yZWdfaGlnaChpb2FkZHIsIENNUjEsIENNUjFoX1JFU0VUIHwgQ01SMWhfTVVYKTsKKworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlscC0+Y2hpcF90eXBlID0gUlRMODAwMjsKKwlscC0+YWRkcl9tb2RlID0gQ01SMmhfTm9ybWFsOworCXNwaW5fbG9ja19pbml0KCZscC0+bG9jayk7CisKKwkvKiBGb3IgdGhlIEFUUCBhZGFwdGVyIHRoZSAiaWZfcG9ydCIgaXMgcmVhbGx5IHRoZSBkYXRhIHRyYW5zZmVyIG1vZGUuICovCisJaWYgKHhjdnJbMF0pCisJCWRldi0+aWZfcG9ydCA9IHhjdnJbMF07CisJZWxzZQorCQlkZXYtPmlmX3BvcnQgPSAoZGV2LT5tZW1fc3RhcnQgJiAweGYpID8gKGRldi0+bWVtX3N0YXJ0ICYgMHg3KSA6IDQ7CisJaWYgKGRldi0+bWVtX2VuZCAmIDB4ZikKKwkJbmV0X2RlYnVnID0gZGV2LT5tZW1fZW5kICYgNzsKKworCWRldi0+b3BlbgkJPSBuZXRfb3BlbjsKKwlkZXYtPnN0b3AJCT0gbmV0X2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gYXRwX3NlbmRfcGFja2V0OworCWRldi0+Z2V0X3N0YXRzCQk9IG5ldF9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPQorCSAgbHAtPmNoaXBfdHlwZSA9PSBSVEw4MDAyID8gJnNldF9yeF9tb2RlXzgwMDIgOiAmc2V0X3J4X21vZGVfODAxMjsKKwlkZXYtPnR4X3RpbWVvdXQJCT0gdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gVFhfVElNRU9VVDsKKworCXJlcyA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXMpIHsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwlscC0+bmV4dF9tb2R1bGUgPSByb290X2F0cF9kZXY7CisJcm9vdF9hdHBfZGV2ID0gZGV2OworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlYWQgdGhlIHN0YXRpb24gYWRkcmVzcyBQUk9NLCB1c3VhbGx5IGEgd29yZC13aWRlIEVFUFJPTS4gKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBnZXRfbm9kZV9JRChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IHNhX29mZnNldCA9IDA7CisJaW50IGk7CisKKwl3cml0ZV9yZWcoaW9hZGRyLCBDTVIyLCBDTVIyX0VFUFJPTSk7CSAgLyogUG9pbnQgdG8gdGhlIEVFUFJPTSBjb250cm9sIHJlZ2lzdGVycy4gKi8KKworCS8qIFNvbWUgYWRhcHRlcnMgaGF2ZSB0aGUgc3RhdGlvbiBhZGRyZXNzIGF0IG9mZnNldCAxNSBpbnN0ZWFkIG9mIG9mZnNldAorCSAgIHplcm8uICBDaGVjayBmb3IgaXQsIGFuZCBmaXggaXQgaWYgbmVlZGVkLiAqLworCWlmIChlZXByb21fb3AoaW9hZGRyLCBFRV9SRUFEKDApKSA9PSAweGZmZmYpCisJCXNhX29mZnNldCA9IDE1OworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJKCh1MTYgKilkZXYtPmRldl9hZGRyKVtpXSA9CisJCQliZTE2X3RvX2NwdShlZXByb21fb3AoaW9hZGRyLCBFRV9SRUFEKHNhX29mZnNldCArIGkpKSk7CisKKwl3cml0ZV9yZWcoaW9hZGRyLCBDTVIyLCBDTVIyX05VTEwpOworfQorCisvKgorICBBbiBFRVBST00gcmVhZCBjb21tYW5kIHN0YXJ0cyBieSBzaGlmdGluZyBvdXQgMHg2MCthZGRyZXNzLCBhbmQgdGhlbgorICBzaGlmdGluZyBpbiB0aGUgc2VyaWFsIGRhdGEuIFNlZSB0aGUgTmF0U2VtaSBkYXRhYm9vayBmb3IgZGV0YWlscy4KKyAqCQkgICBfX19fX19fX19fX19fX19fCisgKiBDUyA6IF9ffAorICoJCQkgICBfX18JICAgX19fCisgKiBDTEs6IF9fX19fX3wJICB8X19ffAkgIHwKKyAqCQkgX18gX19fX19fXyBfX19fX19fCisgKiBESSA6CSBfX1hfX19fX19fWF9fX19fX19YCisgKiBETyA6CSBfX19fX19fX19YX19fX19fX1gKKyAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgX19pbml0IGVlcHJvbV9vcChsb25nIGlvYWRkciwgdTMyIGNtZCkKK3sKKwl1bnNpZ25lZCBlZWRhdGFfb3V0ID0gMDsKKwlpbnQgbnVtX2JpdHMgPSBFRV9DTURfU0laRTsKKworCXdoaWxlICgtLW51bV9iaXRzID49IDApIHsKKwkJY2hhciBvdXR2YWwgPSAoY21kICYgKDE8PG51bV9iaXRzKSkgPyBFRV9EQVRBX1dSSVRFIDogMDsKKwkJd3JpdGVfcmVnX2hpZ2goaW9hZGRyLCBQUk9NX0NNRCwgb3V0dmFsIHwgRUVfQ0xLX0xPVyk7CisJCXdyaXRlX3JlZ19oaWdoKGlvYWRkciwgUFJPTV9DTUQsIG91dHZhbCB8IEVFX0NMS19ISUdIKTsKKwkJZWVkYXRhX291dCA8PD0gMTsKKwkJaWYgKHJlYWRfbmliYmxlKGlvYWRkciwgUFJPTV9EQVRBKSAmIEVFX0RBVEFfUkVBRCkKKwkJCWVlZGF0YV9vdXQrKzsKKwl9CisJd3JpdGVfcmVnX2hpZ2goaW9hZGRyLCBQUk9NX0NNRCwgRUVfQ0xLX0xPVyAmIH5FRV9DUyk7CisJcmV0dXJuIGVlZGF0YV9vdXQ7Cit9CisKKworLyogT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4gIFRoaXMgaXMgY2FsbGVkIChpbiB0aGUgY3VycmVudCBrZXJuZWwpCisgICBzb21ldGltZSBhZnRlciBib290aW5nIHdoZW4gdGhlICdpZmNvbmZpZycgcHJvZ3JhbSBpcyBydW4uCisKKyAgIFRoaXMgcm91dGluZSBzZXRzIGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4KKyAgIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0CisgICB0aGVyZSBpcyBub24tcmVib290IHdheSB0byByZWNvdmVyIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgorCisgICBUaGlzIGlzIGFuIGF0dGFjaGFibGUgZGV2aWNlOiBpZiB0aGVyZSBpcyBubyBkZXYtPnByaXYgZW50cnkgdGhlbiBpdCB3YXNuJ3QKKyAgIHByb2JlZCBmb3IgYXQgYm9vdC10aW1lLCBhbmQgd2UgbmVlZCB0byBwcm9iZSBmb3IgaXQgYWdhaW4uCisgICAqLworc3RhdGljIGludCBuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCisJLyogVGhlIGludGVycnVwdCBsaW5lIGlzIHR1cm5lZCBvZmYgKHRyaS1zdGF0ZWQpIHdoZW4gdGhlIGRldmljZSBpc24ndCBpbgorCSAgIHVzZS4gIFRoYXQncyBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgImF0dGFjaGVkIiBpbnRlcmZhY2VzIHdoZXJlIHRoZQorCSAgIHBvcnQgb3IgaW50ZXJydXB0IG1heSBiZSBzaGFyZWQuICovCisJcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZhdHBfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWhhcmR3YXJlX2luaXQoZGV2KTsKKworCWluaXRfdGltZXIoJmxwLT50aW1lcik7CisJbHAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgVElNRURfQ0hFQ0tFUjsKKwlscC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlscC0+dGltZXIuZnVuY3Rpb24gPSAmYXRwX3RpbWVkX2NoZWNrZXI7ICAgIC8qIHRpbWVyIGhhbmRsZXIgKi8KKwlhZGRfdGltZXIoJmxwLT50aW1lcik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCisvKiBUaGlzIHJvdXRpbmUgcmVzZXRzIHRoZSBoYXJkd2FyZS4gIFdlIGluaXRpYWxpemUgZXZlcnl0aGluZywgYXNzdW1pbmcgdGhhdAorICAgdGhlIGhhcmR3YXJlIG1heSBoYXZlIGJlZW4gdGVtcG9yYXJpbHkgZGV0YWNoZWQuICovCitzdGF0aWMgdm9pZCBoYXJkd2FyZV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGk7CisKKwkvKiBUdXJuIG9mZiB0aGUgcHJpbnRlciBtdWx0aXBsZXhlciBvbiB0aGUgODAxMi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlvdXRiKG11eF84MDEyW2ldLCBpb2FkZHIgKyBQQVJfREFUQSk7CisJd3JpdGVfcmVnX2hpZ2goaW9hZGRyLCBDTVIxLCBDTVIxaF9SRVNFVCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQl3cml0ZV9yZWdfYnl0ZShpb2FkZHIsIFBBUjAgKyBpLCBkZXYtPmRldl9hZGRyW2ldKTsKKworCXdyaXRlX3JlZ19oaWdoKGlvYWRkciwgQ01SMiwgbHAtPmFkZHJfbW9kZSk7CisKKwlpZiAobmV0X2RlYnVnID4gMikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlc2V0OiBjdXJyZW50IFJ4IG1vZGUgJWQuXG4iLCBkZXYtPm5hbWUsCisJCQkgICAocmVhZF9uaWJibGUoaW9hZGRyLCBDTVIyX2gpID4+IDMpICYgMHgwZik7CisJfQorCisgICAgd3JpdGVfcmVnKGlvYWRkciwgQ01SMiwgQ01SMl9JUlFPVVQpOworICAgIHdyaXRlX3JlZ19oaWdoKGlvYWRkciwgQ01SMSwgQ01SMWhfUnhFTkFCTEUgfCBDTVIxaF9UeEVOQUJMRSk7CisKKwkvKiBFbmFibGUgdGhlIGludGVycnVwdCBsaW5lIGZyb20gdGhlIHNlcmlhbCBwb3J0LiAqLworCW91dGIoQ3RybF9TZWxEYXRhICsgQ3RybF9JUlFFTiwgaW9hZGRyICsgUEFSX0NPTlRST0wpOworCisJLyogVW5tYXNrIHRoZSBpbnRlcmVzdGluZyBpbnRlcnJ1cHRzLiAqLworICAgIHdyaXRlX3JlZyhpb2FkZHIsIElNUiwgSVNSX1J4T0sgfCBJU1JfVHhFcnIgfCBJU1JfVHhPSyk7CisgICAgd3JpdGVfcmVnX2hpZ2goaW9hZGRyLCBJTVIsIElTUmhfUnhFcnIpOworCisJbHAtPnR4X3VuaXRfYnVzeSA9IDA7CisgICAgbHAtPnBhY19jbnRfaW5fdHhfYnVmID0gMDsKKwlscC0+c2F2ZWRfdHhfc2l6ZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHRyaWdnZXJfc2VuZChsb25nIGlvYWRkciwgaW50IGxlbmd0aCkKK3sKKwl3cml0ZV9yZWdfYnl0ZShpb2FkZHIsIFR4Q05UMCwgbGVuZ3RoICYgMHhmZik7CisJd3JpdGVfcmVnKGlvYWRkciwgVHhDTlQxLCBsZW5ndGggPj4gOCk7CisJd3JpdGVfcmVnKGlvYWRkciwgQ01SMSwgQ01SMV9YbWl0KTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfcGFja2V0KGxvbmcgaW9hZGRyLCBpbnQgbGVuZ3RoLCB1bnNpZ25lZCBjaGFyICpwYWNrZXQsIGludCBwYWRfbGVuLCBpbnQgZGF0YV9tb2RlKQoreworICAgIGlmIChsZW5ndGggJiAxKQorICAgIHsKKyAgICAJbGVuZ3RoKys7CisgICAgCXBhZF9sZW4rKzsKKyAgICB9CisKKyAgICBvdXRiKEVPQytNQVIsIGlvYWRkciArIFBBUl9EQVRBKTsKKyAgICBpZiAoKGRhdGFfbW9kZSAmIDEpID09IDApIHsKKwkJLyogV3JpdGUgdGhlIHBhY2tldCBvdXQsIHN0YXJ0aW5nIHdpdGggdGhlIHdyaXRlIGFkZHIuICovCisJCW91dGIoV3JBZGRyK01BUiwgaW9hZGRyICsgUEFSX0RBVEEpOworCQlkbyB7CisJCQl3cml0ZV9ieXRlX21vZGUwKGlvYWRkciwgKnBhY2tldCsrKTsKKwkJfSB3aGlsZSAoLS1sZW5ndGggPiBwYWRfbGVuKSA7CisJCWRvIHsKKwkJCXdyaXRlX2J5dGVfbW9kZTAoaW9hZGRyLCAwKTsKKwkJfSB3aGlsZSAoLS1sZW5ndGggPiAwKSA7CisgICAgfSBlbHNlIHsKKwkJLyogV3JpdGUgdGhlIHBhY2tldCBvdXQgaW4gc2xvdyBtb2RlLiAqLworCQl1bnNpZ25lZCBjaGFyIG91dGJ5dGUgPSAqcGFja2V0Kys7CisKKwkJb3V0YihDdHJsX0xOaWJXcml0ZSArIEN0cmxfSVJRRU4sIGlvYWRkciArIFBBUl9DT05UUk9MKTsKKwkJb3V0YihXckFkZHIrTUFSLCBpb2FkZHIgKyBQQVJfREFUQSk7CisKKwkJb3V0Yigob3V0Ynl0ZSAmIDB4MGYpfDB4NDAsIGlvYWRkciArIFBBUl9EQVRBKTsKKwkJb3V0YihvdXRieXRlICYgMHgwZiwgaW9hZGRyICsgUEFSX0RBVEEpOworCQlvdXRieXRlID4+PSA0OworCQlvdXRiKG91dGJ5dGUgJiAweDBmLCBpb2FkZHIgKyBQQVJfREFUQSk7CisJCW91dGIoQ3RybF9ITmliV3JpdGUgKyBDdHJsX0lSUUVOLCBpb2FkZHIgKyBQQVJfQ09OVFJPTCk7CisJCXdoaWxlICgtLWxlbmd0aCA+IHBhZF9sZW4pCisJCQl3cml0ZV9ieXRlX21vZGUxKGlvYWRkciwgKnBhY2tldCsrKTsKKwkJd2hpbGUgKC0tbGVuZ3RoID4gMCkKKwkJCXdyaXRlX2J5dGVfbW9kZTEoaW9hZGRyLCAwKTsKKyAgICB9CisgICAgLyogVGVybWluYXRlIHRoZSBUeCBmcmFtZS4gIEVuZCBvZiB3cml0ZTogRUNCLiAqLworICAgIG91dGIoMHhmZiwgaW9hZGRyICsgUEFSX0RBVEEpOworICAgIG91dGIoQ3RybF9ITmliV3JpdGUgfCBDdHJsX1NlbERhdGEgfCBDdHJsX0lSUUVOLCBpb2FkZHIgKyBQQVJfQ09OVFJPTCk7Cit9CisKK3N0YXRpYyB2b2lkIHR4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpucCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQsICVzP1xuIiwgZGV2LT5uYW1lLAorCQkgICBpbmIoaW9hZGRyICsgUEFSX0NPTlRST0wpICYgMHgxMCA/ICJuZXR3b3JrIGNhYmxlIHByb2JsZW0iCisJCSAgIDogICJJUlEgY29uZmxpY3QiKTsKKwlucC0+c3RhdHMudHhfZXJyb3JzKys7CisJLyogVHJ5IHRvIHJlc3RhcnQgdGhlIGFkYXB0ZXIuICovCisJaGFyZHdhcmVfaW5pdChkZXYpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlucC0+c3RhdHMudHhfZXJyb3JzKys7Cit9CisKK3N0YXRpYyBpbnQgYXRwX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGxlbmd0aDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbGVuZ3RoID0gRVRIX1pMRU4gPCBza2ItPmxlbiA/IHNrYi0+bGVuIDogRVRIX1pMRU47CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYnkgd3JpdGluZyAweDAwIHRvIHRoZSBJbnRlcnJ1cHQgTWFzayBSZWdpc3Rlci4KKwkgICBUaGlzIHNlcXVlbmNlIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IGFuIGluY29taW5nIHBhY2tldC4gKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCXdyaXRlX3JlZyhpb2FkZHIsIElNUiwgMCk7CisJd3JpdGVfcmVnX2hpZ2goaW9hZGRyLCBJTVIsIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwl3cml0ZV9wYWNrZXQoaW9hZGRyLCBsZW5ndGgsIHNrYi0+ZGF0YSwgbGVuZ3RoLXNrYi0+bGVuLCBkZXYtPmlmX3BvcnQpOworCisJbHAtPnBhY19jbnRfaW5fdHhfYnVmKys7CisJaWYgKGxwLT50eF91bml0X2J1c3kgPT0gMCkgeworCQl0cmlnZ2VyX3NlbmQoaW9hZGRyLCBsZW5ndGgpOworCQlscC0+c2F2ZWRfdHhfc2l6ZSA9IDA7IAkJCQkvKiBSZWR1bmRhbnQgKi8KKwkJbHAtPnJlX3R4ID0gMDsKKwkJbHAtPnR4X3VuaXRfYnVzeSA9IDE7CisJfSBlbHNlCisJCWxwLT5zYXZlZF90eF9zaXplID0gbGVuZ3RoOworCS8qIFJlLWVuYWJsZSB0aGUgTFBUIGludGVycnVwdHMuICovCisJd3JpdGVfcmVnKGlvYWRkciwgSU1SLCBJU1JfUnhPSyB8IElTUl9UeEVyciB8IElTUl9UeE9LKTsKKwl3cml0ZV9yZWdfaGlnaChpb2FkZHIsIElNUiwgSVNSaF9SeEVycik7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlkZXZfa2ZyZWVfc2tiIChza2IpOworCXJldHVybiAwOworfQorCisKKy8qIFRoZSB0eXBpY2FsIHdvcmtsb2FkIG9mIHRoZSBkcml2ZXI6CisgICBIYW5kbGUgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGludGVycnVwdHMuICovCitzdGF0aWMgaXJxcmV0dXJuX3QKK2F0cF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscDsKKwlsb25nIGlvYWRkcjsKKwlzdGF0aWMgaW50IG51bV90eF9zaW5jZV9yeDsKKwlpbnQgYm9ndXNjb3VudCA9IG1heF9pbnRlcnJ1cHRfd29yazsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJBVFBfaW50ZXJydXB0KCk6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9jaygmbHAtPmxvY2spOworCisJLyogRGlzYWJsZSBhZGRpdGlvbmFsIHNwdXJpb3VzIGludGVycnVwdHMuICovCisJb3V0YihDdHJsX1NlbERhdGEsIGlvYWRkciArIFBBUl9DT05UUk9MKTsKKworCS8qIFRoZSBhZGFwdGVyJ3Mgb3V0cHV0IGlzIGN1cnJlbnRseSB0aGUgSVJRIGxpbmUsIHN3aXRjaCBpdCB0byBkYXRhLiAqLworCXdyaXRlX3JlZyhpb2FkZHIsIENNUjIsIENNUjJfTlVMTCk7CisJd3JpdGVfcmVnKGlvYWRkciwgSU1SLCAwKTsKKworCWlmIChuZXRfZGVidWcgPiA1KSBwcmludGsoS0VSTl9ERUJVRyAiJXM6IEluIGludGVycnVwdCAiLCBkZXYtPm5hbWUpOworICAgIHdoaWxlICgtLWJvZ3VzY291bnQgPiAwKSB7CisJCWludCBzdGF0dXMgPSByZWFkX25pYmJsZShpb2FkZHIsIElTUik7CisJCWlmIChuZXRfZGVidWcgPiA1KSBwcmludGsoImxvb3Agc3RhdHVzICUwMnguLiIsIHN0YXR1cyk7CisKKwkJaWYgKHN0YXR1cyAmIChJU1JfUnhPSzw8MykpIHsKKwkJCWhhbmRsZWQgPSAxOworCQkJd3JpdGVfcmVnKGlvYWRkciwgSVNSLCBJU1JfUnhPSyk7IC8qIENsZWFyIHRoZSBSeCBpbnRlcnJ1cHQuICovCisJCQlkbyB7CisJCQkJaW50IHJlYWRfc3RhdHVzID0gcmVhZF9uaWJibGUoaW9hZGRyLCBDTVIxKTsKKwkJCQlpZiAobmV0X2RlYnVnID4gNikKKwkJCQkJcHJpbnRrKCJoYW5kbGluZyBSeCBwYWNrZXQgJTAyeC4uIiwgcmVhZF9zdGF0dXMpOworCQkJCS8qIFdlIGFja25vd2xlZGdlZCB0aGUgbm9ybWFsIFJ4IGludGVycnVwdCwgc28gaWYgdGhlIGludGVycnVwdAorCQkJCSAgIGlzIHN0aWxsIG91dHN0YW5kaW5nIHdlIG11c3QgaGF2ZSBhIFJ4IGVycm9yLiAqLworCQkJCWlmIChyZWFkX3N0YXR1cyAmIChDTVIxX0lSUSA8PCAzKSkgeyAvKiBPdmVycnVuLiAqLworCQkJCQlscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCQkJLyogU2V0IHRvIG5vLWFjY2VwdCBtb2RlIGxvbmcgZW5vdWdoIHRvIHJlbW92ZSBhIHBhY2tldC4gKi8KKwkJCQkJd3JpdGVfcmVnX2hpZ2goaW9hZGRyLCBDTVIyLCBDTVIyaF9PRkYpOworCQkJCQluZXRfcngoZGV2KTsKKwkJCQkJLyogQ2xlYXIgdGhlIGludGVycnVwdCBhbmQgcmV0dXJuIHRvIG5vcm1hbCBSeCBtb2RlLiAqLworCQkJCQl3cml0ZV9yZWdfaGlnaChpb2FkZHIsIElTUiwgSVNSaF9SeEVycik7CisJCQkJCXdyaXRlX3JlZ19oaWdoKGlvYWRkciwgQ01SMiwgbHAtPmFkZHJfbW9kZSk7CisJCQkJfSBlbHNlIGlmICgocmVhZF9zdGF0dXMgJiAoQ01SMV9CdWZFbmIgPDwgMykpID09IDApIHsKKwkJCQkJbmV0X3J4KGRldik7CisJCQkJCW51bV90eF9zaW5jZV9yeCA9IDA7CisJCQkJfSBlbHNlCisJCQkJCWJyZWFrOworCQkJfSB3aGlsZSAoLS1ib2d1c2NvdW50ID4gMCk7CisJCX0gZWxzZSBpZiAoc3RhdHVzICYgKChJU1JfVHhFcnIgKyBJU1JfVHhPSyk8PDMpKSB7CisJCQloYW5kbGVkID0gMTsKKwkJCWlmIChuZXRfZGVidWcgPiA2KSAgcHJpbnRrKCJoYW5kbGluZyBUeCBkb25lLi4iKTsKKwkJCS8qIENsZWFyIHRoZSBUeCBpbnRlcnJ1cHQuICBXZSBzaG91bGQgY2hlY2sgZm9yIHRvbyBtYW55IGZhaWx1cmVzCisJCQkgICBhbmQgcmVpbml0aWFsaXplIHRoZSBhZGFwdGVyLiAqLworCQkJd3JpdGVfcmVnKGlvYWRkciwgSVNSLCBJU1JfVHhFcnIgKyBJU1JfVHhPSyk7CisJCQlpZiAoc3RhdHVzICYgKElTUl9UeEVycjw8MykpIHsKKwkJCQlscC0+c3RhdHMuY29sbGlzaW9ucysrOworCQkJCWlmICgrK2xwLT5yZV90eCA+IDE1KSB7CisJCQkJCWxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJCQloYXJkd2FyZV9pbml0KGRldik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBBdHRlbXB0IHRvIHJldHJhbnNtaXQuICovCisJCQkJaWYgKG5ldF9kZWJ1ZyA+IDYpICBwcmludGsoImF0dGVtcHRpbmcgdG8gUmVUeCIpOworCQkJCXdyaXRlX3JlZyhpb2FkZHIsIENNUjEsIENNUjFfUmVYbWl0ICsgQ01SMV9YbWl0KTsKKwkJCX0gZWxzZSB7CisJCQkJLyogRmluaXNoIHVwIHRoZSB0cmFuc21pdC4gKi8KKwkJCQlscC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJCWxwLT5wYWNfY250X2luX3R4X2J1Zi0tOworCQkJCWlmICggbHAtPnNhdmVkX3R4X3NpemUpIHsKKwkJCQkJdHJpZ2dlcl9zZW5kKGlvYWRkciwgbHAtPnNhdmVkX3R4X3NpemUpOworCQkJCQlscC0+c2F2ZWRfdHhfc2l6ZSA9IDA7CisJCQkJCWxwLT5yZV90eCA9IDA7CisJCQkJfSBlbHNlCisJCQkJCWxwLT50eF91bml0X2J1c3kgPSAwOworCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsJLyogSW5mb3JtIHVwcGVyIGxheWVycy4gKi8KKwkJCX0KKwkJCW51bV90eF9zaW5jZV9yeCsrOworCQl9IGVsc2UgaWYgKG51bV90eF9zaW5jZV9yeCA+IDgKKwkJCQkgICAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIGRldi0+bGFzdF9yeCArIEhaKSkgeworCQkJaWYgKG5ldF9kZWJ1ZyA+IDIpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNaXNzZWQgcGFja2V0PyBObyBSeCBhZnRlciAlZCBUeCBhbmQgIgorCQkJCQkgICAiJWxkIGppZmZpZXMgc3RhdHVzICUwMnggIENNUjEgJTAyeC5cbiIsIGRldi0+bmFtZSwKKwkJCQkJICAgbnVtX3R4X3NpbmNlX3J4LCBqaWZmaWVzIC0gZGV2LT5sYXN0X3J4LCBzdGF0dXMsCisJCQkJCSAgIChyZWFkX25pYmJsZShpb2FkZHIsIENNUjEpID4+IDMpICYgMTUpOworCQkJbHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMrKzsKKwkJCWhhcmR3YXJlX2luaXQoZGV2KTsKKwkJCW51bV90eF9zaW5jZV9yeCA9IDA7CisJCQlicmVhazsKKwkJfSBlbHNlCisJCQlicmVhazsKKyAgICB9CisKKwkvKiBUaGlzIGZvbGxvd2luZyBjb2RlIGZpeGVzIGEgcmFyZSAoYW5kIHZlcnkgZGlmZmljdWx0IHRvIHRyYWNrIGRvd24pCisJICAgcHJvYmxlbSB3aGVyZSB0aGUgYWRhcHRlciBmb3JnZXRzIGl0cyBldGhlcm5ldCBhZGRyZXNzLiAqLworCXsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQl3cml0ZV9yZWdfYnl0ZShpb2FkZHIsIFBBUjAgKyBpLCBkZXYtPmRldl9hZGRyW2ldKTsKKyNpZiAwICYmIGRlZmluZWQoVElNRURfQ0hFQ0tFUikKKwkJbW9kX3RpbWVyKCZscC0+dGltZXIsIGppZmZpZXMgKyBUSU1FRF9DSEVDS0VSKTsKKyNlbmRpZgorCX0KKworCS8qIFRlbGwgdGhlIGFkYXB0ZXIgdGhhdCBpdCBjYW4gZ28gYmFjayB0byB1c2luZyB0aGUgb3V0cHV0IGxpbmUgYXMgSVJRLiAqLworICAgIHdyaXRlX3JlZyhpb2FkZHIsIENNUjIsIENNUjJfSVJRT1VUKTsKKwkvKiBFbmFibGUgdGhlIHBoeXNpY2FsIGludGVycnVwdCBsaW5lLCB3aGljaCBpcyBzdXJlIHRvIGJlIGxvdyB1bnRpbC4uICovCisJb3V0YihDdHJsX1NlbERhdGEgKyBDdHJsX0lSUUVOLCBpb2FkZHIgKyBQQVJfQ09OVFJPTCk7CisJLyogLi4gd2UgZW5hYmxlIHRoZSBpbnRlcnJ1cHQgc291cmNlcy4gKi8KKwl3cml0ZV9yZWcoaW9hZGRyLCBJTVIsIElTUl9SeE9LIHwgSVNSX1R4RXJyIHwgSVNSX1R4T0spOworCXdyaXRlX3JlZ19oaWdoKGlvYWRkciwgSU1SLCBJU1JoX1J4RXJyKTsgCQkJLyogSG1tbSwgcmVhbGx5IG5lZWRlZD8gKi8KKworCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisKKwlpZiAobmV0X2RlYnVnID4gNSkgcHJpbnRrKCJleGl0aW5nIGludGVycnVwdC5cbiIpOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisjaWZkZWYgVElNRURfQ0hFQ0tFUgorLyogVGhpcyBmb2xsb3dpbmcgY29kZSBmaXhlcyBhIHJhcmUgKGFuZCB2ZXJ5IGRpZmZpY3VsdCB0byB0cmFjayBkb3duKQorICAgcHJvYmxlbSB3aGVyZSB0aGUgYWRhcHRlciBmb3JnZXRzIGl0cyBldGhlcm5ldCBhZGRyZXNzLiAqLworc3RhdGljIHZvaWQgYXRwX3RpbWVkX2NoZWNrZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCB0aWNrc3NvZmFyID0gamlmZmllcyAtIGxwLT5sYXN0X3J4X3RpbWU7CisJaW50IGk7CisKKwlzcGluX2xvY2soJmxwLT5sb2NrKTsKKwlpZiAodGlja3Nzb2ZhciA+IDIqSFopIHsKKyNpZiAxCisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQl3cml0ZV9yZWdfYnl0ZShpb2FkZHIsIFBBUjAgKyBpLCBkZXYtPmRldl9hZGRyW2ldKTsKKwkJbHAtPmxhc3RfcnhfdGltZSA9IGppZmZpZXM7CisjZWxzZQorCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJaWYgKHJlYWRfY21kX2J5dGUoaW9hZGRyLCBQQVIwICsgaSkgIT0gYXRwX3RpbWVkX2Rldi0+ZGV2X2FkZHJbaV0pCisJCQkJeworCQkJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihhdHBfdGltZWRfZGV2KTsKKwkJCXdyaXRlX3JlZ19ieXRlKGlvYWRkciwgUEFSMCArIGksIGF0cF90aW1lZF9kZXYtPmRldl9hZGRyW2ldKTsKKwkJCWlmIChpID09IDIpCisJCQkgIGxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWVsc2UgaWYgKGkgPT0gMykKKwkJCSAgbHAtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJCWVsc2UgaWYgKGkgPT0gNCkKKwkJCSAgbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJCWVsc2UKKwkJCSAgbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkgIH0KKyNlbmRpZgorCX0KKwlzcGluX3VubG9jaygmbHAtPmxvY2spOworCWxwLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIFRJTUVEX0NIRUNLRVI7CisJYWRkX3RpbWVyKCZscC0+dGltZXIpOworfQorI2VuZGlmCisKKy8qIFdlIGhhdmUgYSBnb29kIHBhY2tldChzKSwgZ2V0IGl0L3RoZW0gb3V0IG9mIHRoZSBidWZmZXJzLiAqLworc3RhdGljIHZvaWQgbmV0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IHJ4X2hlYWRlciByeF9oZWFkOworCisJLyogUHJvY2VzcyB0aGUgcmVjZWl2ZWQgcGFja2V0LiAqLworCW91dGIoRU9DK01BUiwgaW9hZGRyICsgUEFSX0RBVEEpOworCXJlYWRfYmxvY2soaW9hZGRyLCA4LCAodW5zaWduZWQgY2hhciopJnJ4X2hlYWQsIGRldi0+aWZfcG9ydCk7CisJaWYgKG5ldF9kZWJ1ZyA+IDUpCisJCXByaW50ayhLRVJOX0RFQlVHICIgcnhfY291bnQgJTA0eCAlMDR4ICUwNHggJTA0eC4uIiwgcnhfaGVhZC5wYWQsCisJCQkgICByeF9oZWFkLnJ4X2NvdW50LCByeF9oZWFkLnJ4X3N0YXR1cywgcnhfaGVhZC5jdXJfYWRkcik7CisJaWYgKChyeF9oZWFkLnJ4X3N0YXR1cyAmIDB4NzcpICE9IDB4MDEpIHsKKwkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlpZiAocnhfaGVhZC5yeF9zdGF0dXMgJiAweDAwMDQpIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJZWxzZSBpZiAocnhfaGVhZC5yeF9zdGF0dXMgJiAweDAwMDIpIGxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCWlmIChuZXRfZGVidWcgPiAzKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBVbmtub3duIEFUUCBSeCBlcnJvciAlMDR4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIHJ4X2hlYWQucnhfc3RhdHVzKTsKKwkJaWYgIChyeF9oZWFkLnJ4X3N0YXR1cyAmIDB4MDAyMCkgeworCQkJbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQl3cml0ZV9yZWdfaGlnaChpb2FkZHIsIENNUjEsIENNUjFoX1R4RU5BQkxFKTsKKwkJCXdyaXRlX3JlZ19oaWdoKGlvYWRkciwgQ01SMSwgQ01SMWhfUnhFTkFCTEUgfCBDTVIxaF9UeEVOQUJMRSk7CisJCX0gZWxzZSBpZiAocnhfaGVhZC5yeF9zdGF0dXMgJiAweDAwNTApCisJCQloYXJkd2FyZV9pbml0KGRldik7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlci4gVGhlICItNCIgb21pdHMgdGhlIEZDUyAoQ1JDKS4gKi8KKwkJaW50IHBrdF9sZW4gPSAocnhfaGVhZC5yeF9jb3VudCAmIDB4N2ZmKSAtIDQ7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMik7CisJCWlmIChza2IgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsCisJCQkJICAgZGV2LT5uYW1lKTsKKwkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJc2tiLT5kZXYgPSBkZXY7CisKKwkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCisJCXJlYWRfYmxvY2soaW9hZGRyLCBwa3RfbGVuLCBza2JfcHV0KHNrYixwa3RfbGVuKSwgZGV2LT5pZl9wb3J0KTsKKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJbmV0aWZfcngoc2tiKTsKKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJfQorIGRvbmU6CisJd3JpdGVfcmVnKGlvYWRkciwgQ01SMSwgQ01SMV9OZXh0UGt0KTsKKwlscC0+bGFzdF9yeF90aW1lID0gamlmZmllczsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfYmxvY2sobG9uZyBpb2FkZHIsIGludCBsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKnAsIGludCBkYXRhX21vZGUpCit7CisKKwlpZiAoZGF0YV9tb2RlIDw9IDMpIHsgLyogTW9kZSAwIG9yIDEgKi8KKwkJb3V0YihDdHJsX0xOaWJSZWFkLCBpb2FkZHIgKyBQQVJfQ09OVFJPTCk7CisJCW91dGIobGVuZ3RoID09IDggID8gIFJkQWRkciB8IEhOaWIgfCBNQVIgIDogIFJkQWRkciB8IE1BUiwKKwkJCSBpb2FkZHIgKyBQQVJfREFUQSk7CisJCWlmIChkYXRhX21vZGUgPD0gMSkgeyAvKiBNb2RlIDAgb3IgMSAqLworCQkJZG8gICpwKysgPSByZWFkX2J5dGVfbW9kZTAoaW9hZGRyKTsgIHdoaWxlICgtLWxlbmd0aCA+IDApOworCQl9IGVsc2UJLyogTW9kZSAyIG9yIDMgKi8KKwkJCWRvICAqcCsrID0gcmVhZF9ieXRlX21vZGUyKGlvYWRkcik7ICB3aGlsZSAoLS1sZW5ndGggPiAwKTsKKwl9IGVsc2UgaWYgKGRhdGFfbW9kZSA8PSA1KQorCQlkbyAgICAgICpwKysgPSByZWFkX2J5dGVfbW9kZTQoaW9hZGRyKTsgIHdoaWxlICgtLWxlbmd0aCA+IDApOworCWVsc2UKKwkJZG8gICAgICAqcCsrID0gcmVhZF9ieXRlX21vZGU2KGlvYWRkcik7ICB3aGlsZSAoLS1sZW5ndGggPiAwKTsKKworICAgIG91dGIoRU9DK0hOaWIrTUFSLCBpb2FkZHIgKyBQQVJfREFUQSk7CisJb3V0YihDdHJsX1NlbERhdGEsIGlvYWRkciArIFBBUl9DT05UUk9MKTsKK30KKworLyogVGhlIGludmVyc2Ugcm91dGluZSB0byBuZXRfb3BlbigpLiAqLworc3RhdGljIGludAorbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlkZWxfdGltZXJfc3luYygmbHAtPnRpbWVyKTsKKworCS8qIEZsdXNoIHRoZSBUeCBhbmQgZGlzYWJsZSBSeCBoZXJlLiAqLworCWxwLT5hZGRyX21vZGUgPSBDTVIyaF9PRkY7CisJd3JpdGVfcmVnX2hpZ2goaW9hZGRyLCBDTVIyLCBDTVIyaF9PRkYpOworCisJLyogRnJlZSB0aGUgSVJRIGxpbmUuICovCisJb3V0YigweDAwLCBpb2FkZHIgKyBQQVJfQ09OVFJPTCk7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwkvKiBSZXNldCB0aGUgZXRoZXJuZXQgaGFyZHdhcmUgYW5kIGFjdGl2YXRlIHRoZSBwcmludGVyIHBhc3MtdGhyb3VnaC4gKi8KKwl3cml0ZV9yZWdfaGlnaChpb2FkZHIsIENNUjEsIENNUjFoX1JFU0VUIHwgQ01SMWhfTVVYKTsKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCVRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IKKyAgIGNsb3NlZC4gKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCituZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiAmbHAtPnN0YXRzOworfQorCisvKgorICoJU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0ZXIuCisgKi8KKworc3RhdGljIHZvaWQgc2V0X3J4X21vZGVfODAwMihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKCBkZXYtPm1jX2NvdW50ID4gMCB8fCAoZGV2LT5mbGFncyAmIChJRkZfQUxMTVVMVEl8SUZGX1BST01JU0MpKSkgeworCQkvKiBXZSBtdXN0IG1ha2UgdGhlIGtlcm5lbCByZWFsaXNlIHdlIGhhZCB0byBtb3ZlCisJCSAqCWludG8gcHJvbWlzYyBtb2RlIG9yIHdlIHN0YXJ0IGFsbCBvdXQgd2FyIG9uCisJCSAqCXRoZSBjYWJsZS4gLSBBQworCQkgKi8KKwkJZGV2LT5mbGFnc3w9SUZGX1BST01JU0M7CisJCWxwLT5hZGRyX21vZGUgPSBDTVIyaF9QUk9NSVNDOworCX0gZWxzZQorCQlscC0+YWRkcl9tb2RlID0gQ01SMmhfTm9ybWFsOworCXdyaXRlX3JlZ19oaWdoKGlvYWRkciwgQ01SMiwgbHAtPmFkZHJfbW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlXzgwMTIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBjaGFyIG5ld19tb2RlLCBtY19maWx0ZXJbOF07IC8qIE11bHRpY2FzdCBoYXNoIGZpbHRlciAqLworCWludCBpOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewkJCS8qIFNldCBwcm9taXNjdW91cy4gKi8KKwkJbmV3X21vZGUgPSBDTVIyaF9QUk9NSVNDOworCX0gZWxzZSBpZiAoKGRldi0+bWNfY291bnQgPiAxMDAwKSAgfHwgIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQkvKiBUb28gbWFueSB0byBmaWx0ZXIgcGVyZmVjdGx5IC0tIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KKwkJbWVtc2V0KG1jX2ZpbHRlciwgMHhmZiwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCQluZXdfbW9kZSA9IENNUjJoX05vcm1hbDsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKworCQltZW1zZXQobWNfZmlsdGVyLCAwLCBzaXplb2YobWNfZmlsdGVyKSk7CisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCQkJIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KQorCQl7CisJCQlpbnQgZmlsdGVyYml0ID0gZXRoZXJfY3JjX2xlKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKSAmIDB4M2Y7CisJCQltY19maWx0ZXJbZmlsdGVyYml0ID4+IDVdIHw9IDEgPDwgKGZpbHRlcmJpdCAmIDMxKTsKKwkJfQorCQluZXdfbW9kZSA9IENNUjJoX05vcm1hbDsKKwl9CisJbHAtPmFkZHJfbW9kZSA9IG5ld19tb2RlOworICAgIHdyaXRlX3JlZyhpb2FkZHIsIENNUjIsIENNUjJfSVJRT1VUIHwgMHgwNCk7IC8qIFN3aXRjaCB0byBwYWdlIDEuICovCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJd3JpdGVfcmVnX2J5dGUoaW9hZGRyLCBpLCBtY19maWx0ZXJbaV0pOworCWlmIChuZXRfZGVidWcgPiAyIHx8IDEpIHsKKwkJbHAtPmFkZHJfbW9kZSA9IDE7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogTW9kZSAlZCwgc2V0dGluZyBtdWx0aWNhc3QgZmlsdGVyIHRvIiwKKwkJCSAgIGRldi0+bmFtZSwgbHAtPmFkZHJfbW9kZSk7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQlwcmludGsoIiAlMi4yeCIsIG1jX2ZpbHRlcltpXSk7CisJCXByaW50aygiLlxuIik7CisJfQorCisJd3JpdGVfcmVnX2hpZ2goaW9hZGRyLCBDTVIyLCBscC0+YWRkcl9tb2RlKTsKKyAgICB3cml0ZV9yZWcoaW9hZGRyLCBDTVIyLCBDTVIyX0lSUU9VVCk7IC8qIFN3aXRjaCBiYWNrIHRvIHBhZ2UgMCAqLworfQorCitzdGF0aWMgaW50IF9faW5pdCBhdHBfaW5pdF9tb2R1bGUodm9pZCkgeworCWlmIChkZWJ1ZykJCQkJCS8qIEVtaXQgdmVyc2lvbiBldmVuIGlmIG5vIGNhcmRzIGRldGVjdGVkLiAqLworCQlwcmludGsoS0VSTl9JTkZPICIlcyIgS0VSTl9JTkZPICIlcyIsIHZlcnNpb25BLCB2ZXJzaW9uQik7CisJcmV0dXJuIGF0cF9pbml0KCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhdHBfY2xlYW51cF9tb2R1bGUodm9pZCkgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXh0X2RldjsKKworCXdoaWxlIChyb290X2F0cF9kZXYpIHsKKwkJbmV4dF9kZXYgPSAoKHN0cnVjdCBuZXRfbG9jYWwgKilyb290X2F0cF9kZXYtPnByaXYpLT5uZXh0X21vZHVsZTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYocm9vdF9hdHBfZGV2KTsKKwkJLyogTm8gbmVlZCB0byByZWxlYXNlX3JlZ2lvbigpLCBzaW5jZSB3ZSBuZXZlciBzbmFyZiBpdC4gKi8KKwkJZnJlZV9uZXRkZXYocm9vdF9hdHBfZGV2KTsKKwkJcm9vdF9hdHBfZGV2ID0gbmV4dF9kZXY7CisJfQorfQorCittb2R1bGVfaW5pdChhdHBfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoYXRwX2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0cC5oIGIvZHJpdmVycy9uZXQvYXRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVkYzY0MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2F0cC5oCkBAIC0wLDAgKzEsMjU5IEBACisvKiBMaW51eCBoZWFkZXIgZmlsZSBmb3IgdGhlIEFUUCBwb2NrZXQgZXRoZXJuZXQgYWRhcHRlci4gKi8KKy8qIHYxLjA5IDgvOS8yMDAwIGJlY2tlckBzY3lsZC5jb20uICovCisKKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIFRoZSBoZWFkZXIgcHJlcGVuZGVkIHRvIHJlY2VpdmVkIHBhY2tldHMuICovCitzdHJ1Y3QgcnhfaGVhZGVyIHsKKyAgICB1c2hvcnQgcGFkOwkJCS8qIFBhZC4gKi8KKyAgICB1c2hvcnQgcnhfY291bnQ7CisgICAgdXNob3J0IHJ4X3N0YXR1czsJCS8qIFVua25vd24gYml0IGFzc2lnbm1lbnRzIDotPC4gICovCisgICAgdXNob3J0IGN1cl9hZGRyOwkJLyogQXBwYXJlbnRseSB0aGUgY3VycmVudCBidWZmZXIgYWRkcmVzcyg/KSAqLworfTsKKworI2RlZmluZSBQQVJfREFUQQkwCisjZGVmaW5lIFBBUl9TVEFUVVMJMQorI2RlZmluZSBQQVJfQ09OVFJPTCAyCisKK2VudW0gY2hpcF90eXBlIHsgUlRMODAwMiwgUlRMODAxMiB9OworCisjZGVmaW5lIEN0cmxfTE5pYlJlYWQJMHgwOAkvKiBMUF9QU0VMRUNQICovCisjZGVmaW5lIEN0cmxfSE5pYlJlYWQJMAorI2RlZmluZSBDdHJsX0xOaWJXcml0ZQkweDA4CS8qIExQX1BTRUxFQ1AgKi8KKyNkZWZpbmUgQ3RybF9ITmliV3JpdGUJMAorI2RlZmluZSBDdHJsX1NlbERhdGEJMHgwNAkvKiBMUF9QSU5JVFAgKi8KKyNkZWZpbmUgQ3RybF9JUlFFTgkweDEwCS8qIExQX1BJTlRFTiAqLworCisjZGVmaW5lIEVPVwkweEUwCisjZGVmaW5lIEVPQwkweEUwCisjZGVmaW5lIFdyQWRkcgkweDQwCS8qIFNldCBhZGRyZXNzIG9mIEVQTEMgcmVhZCwgd3JpdGUgcmVnaXN0ZXIuICovCisjZGVmaW5lIFJkQWRkcgkweEMwCisjZGVmaW5lIEhOaWIJMHgxMAorCitlbnVtIHBhZ2UwX3JlZ3MKK3sKKyAgICAvKiBUaGUgZmlyc3Qgc2l4IHJlZ2lzdGVycyBob2xkIHRoZSBldGhlcm5ldCBwaHlzaWNhbCBzdGF0aW9uIGFkZHJlc3MuICovCisgICAgUEFSMCA9IDAsIFBBUjEgPSAxLCBQQVIyID0gMiwgUEFSMyA9IDMsIFBBUjQgPSA0LCBQQVI1ID0gNSwKKyAgICBUeENOVDAgPSA2LCBUeENOVDEgPSA3LAkJLyogVGhlIHRyYW5zbWl0IGJ5dGUgY291bnQuICovCisgICAgVHhTVEFUID0gOCwgUnhTVEFUID0gOSwJCS8qIFR4IGFuZCBSeCBzdGF0dXMuICovCisgICAgSVNSID0gMTAsIElNUiA9IDExLAkJCS8qIEludGVycnVwdCBzdGF0dXMgYW5kIG1hc2suICovCisgICAgQ01SMSA9IDEyLAkJCQkvKiBDb21tYW5kIHJlZ2lzdGVyIDEuICovCisgICAgQ01SMiA9IDEzLAkJCQkvKiBDb21tYW5kIHJlZ2lzdGVyIDIuICovCisgICAgTU9EU0VMID0gMTQsCQkJLyogTW9kZSBzZWxlY3QgcmVnaXN0ZXIuICovCisgICAgTUFSID0gMTQsCQkJCS8qIE1lbW9yeSBhZGRyZXNzIHJlZ2lzdGVyICg/KS4gKi8KKyAgICBDTVIyX2ggPSAweDFkLCB9OworCitlbnVtIGVlcGFnZV9yZWdzCit7IFBST01fQ01EID0gNiwgUFJPTV9EQVRBID0gNyB9OwkvKiBOb3RlIHRoYXQgUFJPTV9DTUQgaXMgaW4gdGhlICJoaWdoIiBiaXRzLiAqLworCisKKyNkZWZpbmUgSVNSX1R4T0sJMHgwMQorI2RlZmluZSBJU1JfUnhPSwkweDA0CisjZGVmaW5lIElTUl9UeEVycgkweDAyCisjZGVmaW5lIElTUmhfUnhFcnIJMHgxMQkvKiBJU1IsIGhpZ2ggbmliYmxlICovCisKKyNkZWZpbmUgQ01SMWhfTVVYCTB4MDgJLyogU2VsZWN0IHByaW50ZXIgbXVsdGlwbGV4b3Igb24gODAxMi4gKi8KKyNkZWZpbmUgQ01SMWhfUkVTRVQJMHgwNAkvKiBSZXNldC4gKi8KKyNkZWZpbmUgQ01SMWhfUnhFTkFCTEUJMHgwMgkvKiBSeCB1bml0IGVuYWJsZS4gICovCisjZGVmaW5lIENNUjFoX1R4RU5BQkxFCTB4MDEJLyogVHggdW5pdCBlbmFibGUuICAqLworI2RlZmluZSBDTVIxaF9UeFJ4T0ZGCTB4MDAKKyNkZWZpbmUgQ01SMV9SZVhtaXQJMHgwOAkvKiBUcmlnZ2VyIGEgcmV0cmFuc21pdC4gKi8KKyNkZWZpbmUgQ01SMV9YbWl0CTB4MDQJLyogVHJpZ2dlciBhIHRyYW5zbWl0LiAqLworI2RlZmluZQlDTVIxX0lSUQkweDAyCS8qIEludGVycnVwdCBhY3RpdmUuICovCisjZGVmaW5lCUNNUjFfQnVmRW5iCTB4MDEJLyogRW5hYmxlIHRoZSBidWZmZXIoPykuICovCisjZGVmaW5lCUNNUjFfTmV4dFBrdAkweDAxCS8qIEVuYWJsZSB0aGUgYnVmZmVyKD8pLiAqLworCisjZGVmaW5lIENNUjJfTlVMTAk4CisjZGVmaW5lIENNUjJfSVJRT1VUCTkKKyNkZWZpbmUgQ01SMl9SQU1URVNUCTEwCisjZGVmaW5lIENNUjJfRUVQUk9NCTEyCS8qIFNldCB0byBwYWdlIDEsIGZvciByZWFkaW5nIHRoZSBFRVBST00uICovCisKKyNkZWZpbmUgQ01SMmhfT0ZGCTAJLyogTm8gYWNjZXB0IG1vZGUuICovCisjZGVmaW5lIENNUjJoX1BoeXNpY2FsCTEJLyogQWNjZXB0IGEgcGh5c2ljYWwgYWRkcmVzcyBtYXRjaCBvbmx5LiAqLworI2RlZmluZSBDTVIyaF9Ob3JtYWwJMgkvKiBBY2NlcHQgcGh5c2ljYWwgYW5kIGJyb2FkY2FzdCBhZGRyZXNzLiAqLworI2RlZmluZSBDTVIyaF9QUk9NSVNDCTMJLyogUHJvbWlzY3VvdXMgbW9kZS4gKi8KKworLyogQW4gaW5saW5lIGZ1bmN0aW9uIHVzZWQgYmVsb3c6IGl0IGRpZmZlcnMgZnJvbSBpbmIoKSBieSBleHBsaWNpdGx5IHJldHVybiBhbiB1bnNpZ25lZAorICAgY2hhciwgc2F2aW5nIGEgdHJ1bmNhdGlvbi4gKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBpbmJ5dGUodW5zaWduZWQgc2hvcnQgcG9ydCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIF92OworICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgiaW5iICV3MSwlYjAiIDoiPWEiIChfdik6ImQiIChwb3J0KSk7CisgICAgcmV0dXJuIF92OworfQorCisvKiBSZWFkIHJlZ2lzdGVyIE9GRlNFVC4KKyAgIFRoaXMgY29tbWFuZCBzaG91bGQgYWx3YXlzIGJlIHRlcm1pbmF0ZWQgd2l0aCByZWFkX2VuZCgpLiAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHJlYWRfbmliYmxlKHNob3J0IHBvcnQsIHVuc2lnbmVkIGNoYXIgb2Zmc2V0KQoreworICAgIHVuc2lnbmVkIGNoYXIgcmV0dmFsOworICAgIG91dGIoRU9DK29mZnNldCwgcG9ydCArIFBBUl9EQVRBKTsKKyAgICBvdXRiKFJkQWRkcitvZmZzZXQsIHBvcnQgKyBQQVJfREFUQSk7CisgICAgaW5ieXRlKHBvcnQgKyBQQVJfU1RBVFVTKTsJCS8qIFNldHRsaW5nIHRpbWUgZGVsYXkgKi8KKyAgICByZXR2YWwgPSBpbmJ5dGUocG9ydCArIFBBUl9TVEFUVVMpOworICAgIG91dGIoRU9DK29mZnNldCwgcG9ydCArIFBBUl9EQVRBKTsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIEZ1bmN0aW9ucyBmb3IgYnVsayBkYXRhIHJlYWQuICBUaGUgaW50ZXJydXB0IGxpbmUgaXMgYWx3YXlzIGRpc2FibGVkLiAqLworLyogR2V0IGEgYnl0ZSB1c2luZyByZWFkIG1vZGUgMCwgcmVhZGluZyBkYXRhIGZyb20gdGhlIGNvbnRyb2wgbGluZXMuICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmVhZF9ieXRlX21vZGUwKHNob3J0IGlvYWRkcikKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGxvd19uaWI7CisKKyAgICBvdXRiKEN0cmxfTE5pYlJlYWQsIGlvYWRkciArIFBBUl9DT05UUk9MKTsKKyAgICBpbmJ5dGUoaW9hZGRyICsgUEFSX1NUQVRVUyk7CisgICAgbG93X25pYiA9IChpbmJ5dGUoaW9hZGRyICsgUEFSX1NUQVRVUykgPj4gMykgJiAweDBmOworICAgIG91dGIoQ3RybF9ITmliUmVhZCwgaW9hZGRyICsgUEFSX0NPTlRST0wpOworICAgIGluYnl0ZShpb2FkZHIgKyBQQVJfU1RBVFVTKTsJLyogU2V0dGxpbmcgdGltZSBkZWxheSAtLSBuZWVkZWQhICAqLworICAgIGluYnl0ZShpb2FkZHIgKyBQQVJfU1RBVFVTKTsJLyogU2V0dGxpbmcgdGltZSBkZWxheSAtLSBuZWVkZWQhICAqLworICAgIHJldHVybiBsb3dfbmliIHwgKChpbmJ5dGUoaW9hZGRyICsgUEFSX1NUQVRVUykgPDwgMSkgJiAweGYwKTsKK30KKworLyogVGhlIHNhbWUgYXMgcmVhZF9ieXRlX21vZGUwKCksIGJ1dCBkb2VzIG11bHRpcGxlIGluYigpcyBmb3Igc3RhYmlsaXR5LiAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHJlYWRfYnl0ZV9tb2RlMihzaG9ydCBpb2FkZHIpCit7CisgICAgdW5zaWduZWQgY2hhciBsb3dfbmliOworCisgICAgb3V0YihDdHJsX0xOaWJSZWFkLCBpb2FkZHIgKyBQQVJfQ09OVFJPTCk7CisgICAgaW5ieXRlKGlvYWRkciArIFBBUl9TVEFUVVMpOworICAgIGxvd19uaWIgPSAoaW5ieXRlKGlvYWRkciArIFBBUl9TVEFUVVMpID4+IDMpICYgMHgwZjsKKyAgICBvdXRiKEN0cmxfSE5pYlJlYWQsIGlvYWRkciArIFBBUl9DT05UUk9MKTsKKyAgICBpbmJ5dGUoaW9hZGRyICsgUEFSX1NUQVRVUyk7CS8qIFNldHRsaW5nIHRpbWUgZGVsYXkgLS0gbmVlZGVkISAgKi8KKyAgICByZXR1cm4gbG93X25pYiB8ICgoaW5ieXRlKGlvYWRkciArIFBBUl9TVEFUVVMpIDw8IDEpICYgMHhmMCk7Cit9CisKKy8qIFJlYWQgYSBieXRlIHRocm91Z2ggdGhlIGRhdGEgcmVnaXN0ZXIuICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmVhZF9ieXRlX21vZGU0KHNob3J0IGlvYWRkcikKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGxvd19uaWI7CisKKyAgICBvdXRiKFJkQWRkciB8IE1BUiwgaW9hZGRyICsgUEFSX0RBVEEpOworICAgIGxvd19uaWIgPSAoaW5ieXRlKGlvYWRkciArIFBBUl9TVEFUVVMpID4+IDMpICYgMHgwZjsKKyAgICBvdXRiKFJkQWRkciB8IEhOaWIgfCBNQVIsIGlvYWRkciArIFBBUl9EQVRBKTsKKyAgICByZXR1cm4gbG93X25pYiB8ICgoaW5ieXRlKGlvYWRkciArIFBBUl9TVEFUVVMpIDw8IDEpICYgMHhmMCk7Cit9CisKKy8qIFJlYWQgYSBieXRlIHRocm91Z2ggdGhlIGRhdGEgcmVnaXN0ZXIsIGRvdWJsZSByZWFkaW5nIHRvIGFsbG93IHNldHRsaW5nLiAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHJlYWRfYnl0ZV9tb2RlNihzaG9ydCBpb2FkZHIpCit7CisgICAgdW5zaWduZWQgY2hhciBsb3dfbmliOworCisgICAgb3V0YihSZEFkZHIgfCBNQVIsIGlvYWRkciArIFBBUl9EQVRBKTsKKyAgICBpbmJ5dGUoaW9hZGRyICsgUEFSX1NUQVRVUyk7CisgICAgbG93X25pYiA9IChpbmJ5dGUoaW9hZGRyICsgUEFSX1NUQVRVUykgPj4gMykgJiAweDBmOworICAgIG91dGIoUmRBZGRyIHwgSE5pYiB8IE1BUiwgaW9hZGRyICsgUEFSX0RBVEEpOworICAgIGluYnl0ZShpb2FkZHIgKyBQQVJfU1RBVFVTKTsKKyAgICByZXR1cm4gbG93X25pYiB8ICgoaW5ieXRlKGlvYWRkciArIFBBUl9TVEFUVVMpIDw8IDEpICYgMHhmMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAord3JpdGVfcmVnKHNob3J0IHBvcnQsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbHVlKQoreworICAgIHVuc2lnbmVkIGNoYXIgb3V0dmFsOworICAgIG91dGIoRU9DIHwgcmVnLCBwb3J0ICsgUEFSX0RBVEEpOworICAgIG91dHZhbCA9IFdyQWRkciB8IHJlZzsKKyAgICBvdXRiKG91dHZhbCwgcG9ydCArIFBBUl9EQVRBKTsKKyAgICBvdXRiKG91dHZhbCwgcG9ydCArIFBBUl9EQVRBKTsJLyogRG91YmxlIHdyaXRlIGZvciBQUy8yLiAqLworCisgICAgb3V0dmFsICY9IDB4ZjA7CisgICAgb3V0dmFsIHw9IHZhbHVlOworICAgIG91dGIob3V0dmFsLCBwb3J0ICsgUEFSX0RBVEEpOworICAgIG91dHZhbCAmPSAweDFmOworICAgIG91dGIob3V0dmFsLCBwb3J0ICsgUEFSX0RBVEEpOworICAgIG91dGIob3V0dmFsLCBwb3J0ICsgUEFSX0RBVEEpOworCisgICAgb3V0YihFT0MgfCBvdXR2YWwsIHBvcnQgKyBQQVJfREFUQSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAord3JpdGVfcmVnX2hpZ2goc2hvcnQgcG9ydCwgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisgICAgdW5zaWduZWQgY2hhciBvdXR2YWwgPSBFT0MgfCBITmliIHwgcmVnOworCisgICAgb3V0YihvdXR2YWwsIHBvcnQgKyBQQVJfREFUQSk7CisgICAgb3V0dmFsICY9IFdyQWRkciB8IEhOaWIgfCAweDBmOworICAgIG91dGIob3V0dmFsLCBwb3J0ICsgUEFSX0RBVEEpOworICAgIG91dGIob3V0dmFsLCBwb3J0ICsgUEFSX0RBVEEpOwkvKiBEb3VibGUgd3JpdGUgZm9yIFBTLzIuICovCisKKyAgICBvdXR2YWwgPSBXckFkZHIgfCBITmliIHwgdmFsdWU7CisgICAgb3V0YihvdXR2YWwsIHBvcnQgKyBQQVJfREFUQSk7CisgICAgb3V0dmFsICY9IEhOaWIgfCAweDBmOwkJLyogSE5pYiB8IHZhbHVlICovCisgICAgb3V0YihvdXR2YWwsIHBvcnQgKyBQQVJfREFUQSk7CisgICAgb3V0YihvdXR2YWwsIHBvcnQgKyBQQVJfREFUQSk7CisKKyAgICBvdXRiKEVPQyB8IEhOaWIgfCBvdXR2YWwsIHBvcnQgKyBQQVJfREFUQSk7Cit9CisKKy8qIFdyaXRlIGEgYnl0ZSBvdXQgdXNpbmcgbmliYmxlIG1vZGUuICBUaGUgbG93IG5pYmJsZSBpcyB3cml0dGVuIGZpcnN0LiAqLworc3RhdGljIGlubGluZSB2b2lkCit3cml0ZV9yZWdfYnl0ZShzaG9ydCBwb3J0LCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIG91dHZhbDsKKyAgICBvdXRiKEVPQyB8IHJlZywgcG9ydCArIFBBUl9EQVRBKTsgCS8qIFJlc2V0IHRoZSBhZGRyZXNzIHJlZ2lzdGVyLiAqLworICAgIG91dHZhbCA9IFdyQWRkciB8IHJlZzsKKyAgICBvdXRiKG91dHZhbCwgcG9ydCArIFBBUl9EQVRBKTsKKyAgICBvdXRiKG91dHZhbCwgcG9ydCArIFBBUl9EQVRBKTsJLyogRG91YmxlIHdyaXRlIGZvciBQUy8yLiAqLworCisgICAgb3V0Yigob3V0dmFsICYgMHhmMCkgfCAodmFsdWUgJiAweDBmKSwgcG9ydCArIFBBUl9EQVRBKTsKKyAgICBvdXRiKHZhbHVlICYgMHgwZiwgcG9ydCArIFBBUl9EQVRBKTsKKyAgICB2YWx1ZSA+Pj0gNDsKKyAgICBvdXRiKHZhbHVlLCBwb3J0ICsgUEFSX0RBVEEpOworICAgIG91dGIoMHgxMCB8IHZhbHVlLCBwb3J0ICsgUEFSX0RBVEEpOworICAgIG91dGIoMHgxMCB8IHZhbHVlLCBwb3J0ICsgUEFSX0RBVEEpOworCisgICAgb3V0YihFT0MgIHwgdmFsdWUsIHBvcnQgKyBQQVJfREFUQSk7IAkvKiBSZXNldCB0aGUgYWRkcmVzcyByZWdpc3Rlci4gKi8KK30KKworLyoKKyAqIEJ1bGsgZGF0YSB3cml0ZXMgdG8gdGhlIHBhY2tldCBidWZmZXIuICBUaGUgaW50ZXJydXB0IGxpbmUgcmVtYWlucyBlbmFibGVkLgorICogVGhlIGZpcnN0LCBmYXN0ZXIgbWV0aG9kIHVzZXMgb25seSB0aGUgZGF0YXBvcnQgKGRhdGEgbW9kZXMgMCwgMiAmIDQpLgorICogVGhlIHNlY29uZCAoYmFja3VwKSBtZXRob2QgdXNlcyBkYXRhIGFuZCBjb250cm9sIHJlZ3MgKG1vZGVzIDEsIDMgJiA1KS4KKyAqIEl0IHNob3VsZCBvbmx5IGJlIG5lZWRlZCB3aGVuIHRoZXJlIGlzIHNrZXcgYmV0d2VlbiB0aGUgaW5kaXZpZHVhbCBkYXRhCisgKiBsaW5lcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2J5dGVfbW9kZTAoc2hvcnQgaW9hZGRyLCB1bnNpZ25lZCBjaGFyIHZhbHVlKQoreworICAgIG91dGIodmFsdWUgJiAweDBmLCBpb2FkZHIgKyBQQVJfREFUQSk7CisgICAgb3V0YigodmFsdWU+PjQpIHwgMHgxMCwgaW9hZGRyICsgUEFSX0RBVEEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfYnl0ZV9tb2RlMShzaG9ydCBpb2FkZHIsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisgICAgb3V0Yih2YWx1ZSAmIDB4MGYsIGlvYWRkciArIFBBUl9EQVRBKTsKKyAgICBvdXRiKEN0cmxfSVJRRU4gfCBDdHJsX0xOaWJXcml0ZSwgaW9hZGRyICsgUEFSX0NPTlRST0wpOworICAgIG91dGIoKHZhbHVlPj40KSB8IDB4MTAsIGlvYWRkciArIFBBUl9EQVRBKTsKKyAgICBvdXRiKEN0cmxfSVJRRU4gfCBDdHJsX0hOaWJXcml0ZSwgaW9hZGRyICsgUEFSX0NPTlRST0wpOworfQorCisvKiBXcml0ZSAxNmJpdCBWQUxVRSB0byB0aGUgcGFja2V0IGJ1ZmZlcjogdGhlIHNhbWUgYXMgYWJvdmUganVzdCBkb3VibGVkLiAqLworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3dvcmRfbW9kZTAoc2hvcnQgaW9hZGRyLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKK3sKKyAgICBvdXRiKHZhbHVlICYgMHgwZiwgaW9hZGRyICsgUEFSX0RBVEEpOworICAgIHZhbHVlID4+PSA0OworICAgIG91dGIoKHZhbHVlICYgMHgwZikgfCAweDEwLCBpb2FkZHIgKyBQQVJfREFUQSk7CisgICAgdmFsdWUgPj49IDQ7CisgICAgb3V0Yih2YWx1ZSAmIDB4MGYsIGlvYWRkciArIFBBUl9EQVRBKTsKKyAgICB2YWx1ZSA+Pj0gNDsKKyAgICBvdXRiKCh2YWx1ZSAmIDB4MGYpIHwgMHgxMCwgaW9hZGRyICsgUEFSX0RBVEEpOworfQorCisvKiAgRUVQUk9NX0N0cmwgYml0cy4gKi8KKyNkZWZpbmUgRUVfU0hJRlRfQ0xLCTB4MDQJLyogRUVQUk9NIHNoaWZ0IGNsb2NrLiAqLworI2RlZmluZSBFRV9DUwkJMHgwMgkvKiBFRVBST00gY2hpcCBzZWxlY3QuICovCisjZGVmaW5lIEVFX0NMS19ISUdICTB4MTIKKyNkZWZpbmUgRUVfQ0xLX0xPVwkweDE2CisjZGVmaW5lIEVFX0RBVEFfV1JJVEUJMHgwMQkvKiBFRVBST00gY2hpcCBkYXRhIGluLiAqLworI2RlZmluZSBFRV9EQVRBX1JFQUQJMHgwOAkvKiBFRVBST00gY2hpcCBkYXRhIG91dC4gKi8KKworLyogRGVsYXkgYmV0d2VlbiBFRVBST00gY2xvY2sgdHJhbnNpdGlvbnMuICovCisjZGVmaW5lIGVlcHJvbV9kZWxheSh0aWNrcykgXAorZG8geyBpbnQgX2kgPSA0MDsgd2hpbGUgKC0tX2kgPiAwKSB7IF9fU0xPV19ET1dOX0lPOyB9fSB3aGlsZSAoMCkKKworLyogVGhlIEVFUFJPTSBjb21tYW5kcyBpbmNsdWRlIHRoZSBhbHdheS1zZXQgbGVhZGluZyBiaXQuICovCisjZGVmaW5lIEVFX1dSSVRFX0NNRChvZmZzZXQpCSgoKDUgPDwgNikgKyAob2Zmc2V0KSkgPDwgMTcpCisjZGVmaW5lIEVFX1JFQUQob2Zmc2V0KSAJKCgoNiA8PCA2KSArIChvZmZzZXQpKSA8PCAxNykKKyNkZWZpbmUgRUVfRVJBU0Uob2Zmc2V0KQkoKCg3IDw8IDYpICsgKG9mZnNldCkpIDw8IDE3KQorI2RlZmluZSBFRV9DTURfU0laRQkyNwkvKiBUaGUgY29tbWFuZCthZGRyZXNzK2RhdGEgc2l6ZS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F1MTAwMF9ldGguYyBiL2RyaXZlcnMvbmV0L2F1MTAwMF9ldGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTJlZmQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYXUxMDAwX2V0aC5jCkBAIC0wLDAgKzEsMjI3MyBAQAorLyoKKyAqCisgKiBBbGNoZW15IEF1MXgwMCBldGhlcm5ldCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwMSwyMDAyLDIwMDMgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAwMiBUaW1lU3lzIENvcnAuCisgKiBBZGRlZCBldGh0b29sL21paS10b29sIHN1cHBvcnQsCisgKiBDb3B5cmlnaHQgMjAwNCBNYXR0IFBvcnRlciA8bXBvcnRlckBrZXJuZWwuY3Jhc2hpbmcub3JnPgorICogVXBkYXRlOiAyMDA0IEJqb2VybiBSaWVtZXIsIHJpZW1lckBmb2t1cy5mcmF1bmhvZmVyLmRlIAorICogb3IgcmllbWVyQHJpZW1lci1udC5kZTogZml4ZWQgdGhlIGxpbmsgYmVhdCBkZXRlY3Rpb24gd2l0aCAKKyAqIGlvY3RscyAoU0lPQ0dNSUlQSFkpCisgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqICAgICAgICAgCXBwb3BvdkBtdmlzdGEuY29tIG9yIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIGRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKFZlcnNpb24gMikgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgKgorICogCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxMDAwLmg+CisjaW5jbHVkZSA8YXNtL2NwdS5oPgorI2luY2x1ZGUgImF1MTAwMF9ldGguaCIKKworI2lmZGVmIEFVMTAwMF9FVEhfREVCVUcKK3N0YXRpYyBpbnQgYXUxMDAwX2RlYnVnID0gNTsKKyNlbHNlCitzdGF0aWMgaW50IGF1MTAwMF9kZWJ1ZyA9IDM7CisjZW5kaWYKKworI2RlZmluZSBEUlZfTkFNRQkiYXUxMDAwZXRoIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS41IgorI2RlZmluZSBEUlZfQVVUSE9SCSJQZXRlIFBvcG92IDxwcG9wb3ZAZW1iZWRkZWRhbGxleS5jb20+IgorI2RlZmluZSBEUlZfREVTQwkiQXUxeHh4IG9uLWNoaXAgRXRoZXJuZXQgZHJpdmVyIgorCitNT0RVTEVfQVVUSE9SKERSVl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLy8gcHJvdG90eXBlcworc3RhdGljIHZvaWQgaGFyZF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHZvaWQgZW5hYmxlX3J4X3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICogYXUxMDAwX3Byb2JlKHUzMiBpb2FkZHIsIGludCBpcnEsIGludCBwb3J0X251bSk7CitzdGF0aWMgaW50IGF1MTAwMF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCBhdTEwMDBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgYXUxMDAwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCBhdTEwMDBfdHgoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50IGF1MTAwMF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBhdTEwMDBfaW50ZXJydXB0KGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKK3N0YXRpYyB2b2lkIGF1MTAwMF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCBhdTEwMDBfc2V0X2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCk7CitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYXUxMDAwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfdHhfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKiwgdTMyLCB1MzIpOworc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9yeF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MzIpOworc3RhdGljIHZvaWQgYXUxMDAwX3RpbWVyKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIGludCBhdTEwMDBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGlmcmVxICosIGludCk7CitzdGF0aWMgaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQsIGludCk7CitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgaW50LCB1MTYpOworc3RhdGljIHZvaWQgZHVtcF9taWkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCk7CisKKy8vIGV4dGVybnMKK2V4dGVybiAgdm9pZCBhY2tfcmlzZV9lZGdlX2lycSh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIGludCBnZXRfZXRoZXJuZXRfYWRkcihjaGFyICpldGhlcm5ldF9hZGRyKTsKK2V4dGVybiB2b2lkIHN0cjJlYWRkcih1bnNpZ25lZCBjaGFyICplYSwgdW5zaWduZWQgY2hhciAqc3RyKTsKK2V4dGVybiBjaGFyICogX19pbml0IHByb21fZ2V0Y21kbGluZSh2b2lkKTsKKworLyoKKyAqIFRoZW9yeSBvZiBvcGVyYXRpb24KKyAqCisgKiBUaGUgQXUxMDAwIE1BQ3MgdXNlIGEgc2ltcGxlIHJ4IGFuZCB0eCBkZXNjcmlwdG9yIHJpbmcgc2NoZW1lLiAKKyAqIFRoZXJlIGFyZSBmb3VyIHJlY2VpdmUgYW5kIGZvdXIgdHJhbnNtaXQgZGVzY3JpcHRvcnMuICBUaGVzZSAKKyAqIGRlc2NyaXB0b3JzIGFyZSBub3QgaW4gbWVtb3J5OyByYXRoZXIsIHRoZXkgYXJlIGp1c3QgYSBzZXQgb2YgCisgKiBoYXJkd2FyZSByZWdpc3RlcnMuCisgKgorICogU2luY2UgdGhlIEF1MTAwMCBoYXMgYSBjb2hlcmVudCBkYXRhIGNhY2hlLCB0aGUgcmVjZWl2ZSBhbmQKKyAqIHRyYW5zbWl0IGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZCBmcm9tIHRoZSBLU0VHMCBzZWdtZW50LiBUaGUgCisgKiBoYXJkd2FyZSByZWdpc3RlcnMsIGhvd2V2ZXIsIGFyZSBzdGlsbCBtYXBwZWQgYXQgS1NFRzEgdG8KKyAqIG1ha2Ugc3VyZSB0aGVyZSdzIG5vIG91dC1vZi1vcmRlciB3cml0ZXMsIGFuZCB0aGF0IGFsbCB3cml0ZXMKKyAqIGNvbXBsZXRlIGltbWVkaWF0ZWx5LgorICovCisKKy8qIFRoZXNlIGFkZHJlc3NlcyBhcmUgb25seSB1c2VkIGlmIHlhbW9uIGRvZXNuJ3QgdGVsbCB1cyB3aGF0CisgKiB0aGUgbWFjIGFkZHJlc3MgaXMsIGFuZCB0aGUgbWFjIGFkZHJlc3MgaXMgbm90IHBhc3NlZCBvbiB0aGUKKyAqIGNvbW1hbmQgbGluZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXUxMDAwX21hY19hZGRyWzZdIF9fZGV2aW5pdGRhdGEgPSB7IAorCTB4MDAsIDB4NTAsIDB4YzIsIDB4MGMsIDB4MzAsIDB4MDAKK307CisKKyNkZWZpbmUgbmlic3dhcCh4KSAoKCgoeCkgPj4gNCkgJiAweDBmKSB8ICgoKHgpIDw8IDQpICYgMHhmMCkpCisjZGVmaW5lIFJVTl9BVCh4KSAoamlmZmllcyArICh4KSkKKworLy8gRm9yIHJlYWRpbmcvd3JpdGluZyAzMi1iaXQgd29yZHMgZnJvbS90byBETUEgbWVtb3J5CisjZGVmaW5lIGNwdV90b19kbWEzMiBjcHVfdG9fYmUzMgorI2RlZmluZSBkbWEzMl90b19jcHUgYmUzMl90b19jcHUKKworc3RydWN0IGF1MTAwMF9wcml2YXRlICphdV9tYWNzW05VTV9FVEhfSU5URVJGQUNFU107CisKKy8qIEZJWE1FIAorICogQWxsIG9mIHRoZSBQSFkgY29kZSByZWFsbHkgc2hvdWxkIGJlIGRldGFjaGVkIGZyb20gdGhlIE1BQyAKKyAqIGNvZGUuCisgKi8KKworLyogRGVmYXVsdCBhZHZlcnRpc2UgKi8KKyNkZWZpbmUgR0VOTUlJX0RFRkFVTFRfQURWRVJUSVNFIFwKKwlBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsIHwgXAorCUFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCB8IFwKKwlBRFZFUlRJU0VEX0F1dG9uZWcKKworI2RlZmluZSBHRU5NSUlfREVGQVVMVF9GRUFUVVJFUyBcCisJU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfCBcCisJU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8IFwKKwlTVVBQT1JURURfQXV0b25lZworCitzdGF0aWMgY2hhciAqcGh5X2xpbmtbXSA9IAorewkidW5rbm93biIsIAorCSIxMEJhc2UyIiwgIjEwQmFzZVQiLCAKKwkiQVVJIiwKKwkiMTAwQmFzZVQiLCAiMTAwQmFzZVRYIiwgIjEwMEJhc2VGWCIKK307CisKK2ludCBiY21fNTIwMV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkcikKK3sKKwlzMTYgZGF0YTsKKwkKKwkvKiBTdG9wIGF1dG8tbmVnb3RpYXRpb24gKi8KKwlkYXRhID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MKTsKKwltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MLCBkYXRhICYgfk1JSV9DTlRMX0FVVE8pOworCisJLyogU2V0IGFkdmVydGlzZW1lbnQgdG8gMTAvMTAwIGFuZCBIYWxmL0Z1bGwgZHVwbGV4CisJICogKGZ1bGwgY2FwYWJpbGl0aWVzKSAqLworCWRhdGEgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0FOQURWKTsKKwlkYXRhIHw9IE1JSV9OV0FZX1RYIHwgTUlJX05XQVlfVFhfRkRYIHwgTUlJX05XQVlfVF9GRFggfCBNSUlfTldBWV9UOworCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgTUlJX0FOQURWLCBkYXRhKTsKKwkKKwkvKiBSZXN0YXJ0IGF1dG8tbmVnb3RpYXRpb24gKi8KKwlkYXRhID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MKTsKKwlkYXRhIHw9IE1JSV9DTlRMX1JTVF9BVVRPIHwgTUlJX0NOVExfQVVUTzsKKwltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MLCBkYXRhKTsKKworCWlmIChhdTEwMDBfZGVidWcgPiA0KSAKKwkJZHVtcF9taWkoZGV2LCBwaHlfYWRkcik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBiY21fNTIwMV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIpCit7CisJczE2IG1paV9jb250cm9sLCB0aW1lb3V0OworCQorCW1paV9jb250cm9sID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MKTsKKwltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MLCBtaWlfY29udHJvbCB8IE1JSV9DTlRMX1JFU0VUKTsKKwltZGVsYXkoMSk7CisJZm9yICh0aW1lb3V0ID0gMTAwOyB0aW1lb3V0ID4gMDsgLS10aW1lb3V0KSB7CisJCW1paV9jb250cm9sID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MKTsKKwkJaWYgKChtaWlfY29udHJvbCAmIE1JSV9DTlRMX1JFU0VUKSA9PSAwKQorCQkJYnJlYWs7CisJCW1kZWxheSgxKTsKKwl9CisJaWYgKG1paV9jb250cm9sICYgTUlJX0NOVExfUkVTRVQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyBQSFkgcmVzZXQgdGltZW91dCAhXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitpbnQgCitiY21fNTIwMV9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyLCB1MTYgKmxpbmssIHUxNiAqc3BlZWQpCit7CisJdTE2IG1paV9kYXRhOworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwOworCisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiY21fNTIwMV9zdGF0dXMgZXJyb3I6IE5VTEwgZGV2XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlhdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopIGRldi0+cHJpdjsKKworCW1paV9kYXRhID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX1NUQVRVUyk7CisJaWYgKG1paV9kYXRhICYgTUlJX1NUQVRfTElOSykgeworCQkqbGluayA9IDE7CisJCW1paV9kYXRhID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX0FVWF9DTlRSTCk7CisJCWlmIChtaWlfZGF0YSAmIE1JSV9BVVhfMTAwKSB7CisJCQlpZiAobWlpX2RhdGEgJiBNSUlfQVVYX0ZEWCkgeworCQkJCSpzcGVlZCA9IElGX1BPUlRfMTAwQkFTRUZYOworCQkJCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfMTAwQkFTRUZYOworCQkJfQorCQkJZWxzZSB7CisJCQkJKnNwZWVkID0gSUZfUE9SVF8xMDBCQVNFVFg7CisJCQkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMDBCQVNFVFg7CisJCQl9CisJCX0KKwkJZWxzZSAgeworCQkJKnNwZWVkID0gSUZfUE9SVF8xMEJBU0VUOworCQkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMEJBU0VUOworCQl9CisKKwl9CisJZWxzZSB7CisJCSpsaW5rID0gMDsKKwkJKnNwZWVkID0gMDsKKwkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF9VTktOT1dOOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGxzaV84MDIyN19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkcikKK3sKKwlpZiAoYXUxMDAwX2RlYnVnID4gNCkKKwkJcHJpbnRrKCJsc2lfODAyMjdfaW5pdFxuIik7CisKKwkvKiByZXN0YXJ0IGF1dG8tbmVnb3RpYXRpb24gKi8KKwltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MLAorCQkgICBNSUlfQ05UTF9GMTAwIHwgTUlJX0NOVExfQVVUTyB8IE1JSV9DTlRMX1JTVF9BVVRPKTsgLy8gfCBNSUlfQ05UTF9GRFgpOworCW1kZWxheSgxKTsKKworCS8qIHNldCB1cCBMRURzIHRvIGNvcnJlY3QgZGlzcGxheSAqLworI2lmZGVmIENPTkZJR19NSVBTX01UWDEKKwltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIDE3LCAweGZmODApOworI2Vsc2UKKwltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIDE3LCAweGZmYzApOworI2VuZGlmCisKKwlpZiAoYXUxMDAwX2RlYnVnID4gNCkKKwkJZHVtcF9taWkoZGV2LCBwaHlfYWRkcik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBsc2lfODAyMjdfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyKQoreworCXMxNiBtaWlfY29udHJvbCwgdGltZW91dDsKKwkKKwlpZiAoYXUxMDAwX2RlYnVnID4gNCkgeworCQlwcmludGsoImxzaV84MDIyN19yZXNldFxuIik7CisJCWR1bXBfbWlpKGRldiwgcGh5X2FkZHIpOworCX0KKworCW1paV9jb250cm9sID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MKTsKKwltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MLCBtaWlfY29udHJvbCB8IE1JSV9DTlRMX1JFU0VUKTsKKwltZGVsYXkoMSk7CisJZm9yICh0aW1lb3V0ID0gMTAwOyB0aW1lb3V0ID4gMDsgLS10aW1lb3V0KSB7CisJCW1paV9jb250cm9sID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MKTsKKwkJaWYgKChtaWlfY29udHJvbCAmIE1JSV9DTlRMX1JFU0VUKSA9PSAwKQorCQkJYnJlYWs7CisJCW1kZWxheSgxKTsKKwl9CisJaWYgKG1paV9jb250cm9sICYgTUlJX0NOVExfUkVTRVQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyBQSFkgcmVzZXQgdGltZW91dCAhXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitpbnQKK2xzaV84MDIyN19zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyLCB1MTYgKmxpbmssIHUxNiAqc3BlZWQpCit7CisJdTE2IG1paV9kYXRhOworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwOworCisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsc2lfODAyMjdfc3RhdHVzIGVycm9yOiBOVUxMIGRldlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisKKwltaWlfZGF0YSA9IG1kaW9fcmVhZChkZXYsIGF1cC0+cGh5X2FkZHIsIE1JSV9TVEFUVVMpOworCWlmIChtaWlfZGF0YSAmIE1JSV9TVEFUX0xJTkspIHsKKwkJKmxpbmsgPSAxOworCQltaWlfZGF0YSA9IG1kaW9fcmVhZChkZXYsIGF1cC0+cGh5X2FkZHIsIE1JSV9MU0lfUEhZX1NUQVQpOworCQlpZiAobWlpX2RhdGEgJiBNSUlfTFNJX1BIWV9TVEFUX1NQRCkgeworCQkJaWYgKG1paV9kYXRhICYgTUlJX0xTSV9QSFlfU1RBVF9GRFgpIHsKKwkJCQkqc3BlZWQgPSBJRl9QT1JUXzEwMEJBU0VGWDsKKwkJCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwMEJBU0VGWDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCSpzcGVlZCA9IElGX1BPUlRfMTAwQkFTRVRYOworCQkJCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfMTAwQkFTRVRYOworCQkJfQorCQl9CisJCWVsc2UgIHsKKwkJCSpzcGVlZCA9IElGX1BPUlRfMTBCQVNFVDsKKwkJCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfMTBCQVNFVDsKKwkJfQorCisJfQorCWVsc2UgeworCQkqbGluayA9IDA7CisJCSpzcGVlZCA9IDA7CisJCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfVU5LTk9XTjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBhbTc5YzkwMV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkcikKK3sKKwlwcmludGsoImFtNzljOTAxX2luaXRcbiIpOworCXJldHVybiAwOworfQorCitpbnQgYW03OWM5MDFfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyKQoreworCXByaW50aygiYW03OWM5MDFfcmVzZXRcbiIpOworCXJldHVybiAwOworfQorCitpbnQgCithbTc5YzkwMV9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyLCB1MTYgKmxpbmssIHUxNiAqc3BlZWQpCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBhbTc5Yzg3NF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkcikKK3sKKwlzMTYgZGF0YTsKKworCS8qIDc5Yzg3NCBoYXMgcXVpdCByZXNlbWJsZWQgYml0IGFzc2lnbm1lbnRzIHRvIEJDTTUyMDEgKi8KKwlpZiAoYXUxMDAwX2RlYnVnID4gNCkKKwkJcHJpbnRrKCJhbTc5Yzg0N19pbml0XG4iKTsKKworCS8qIFN0b3AgYXV0by1uZWdvdGlhdGlvbiAqLworCWRhdGEgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wpOworCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wsIGRhdGEgJiB+TUlJX0NOVExfQVVUTyk7CisKKwkvKiBTZXQgYWR2ZXJ0aXNlbWVudCB0byAxMC8xMDAgYW5kIEhhbGYvRnVsbCBkdXBsZXgKKwkgKiAoZnVsbCBjYXBhYmlsaXRpZXMpICovCisJZGF0YSA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfQU5BRFYpOworCWRhdGEgfD0gTUlJX05XQVlfVFggfCBNSUlfTldBWV9UWF9GRFggfCBNSUlfTldBWV9UX0ZEWCB8IE1JSV9OV0FZX1Q7CisJbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQU5BRFYsIGRhdGEpOworCQorCS8qIFJlc3RhcnQgYXV0by1uZWdvdGlhdGlvbiAqLworCWRhdGEgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wpOworCWRhdGEgfD0gTUlJX0NOVExfUlNUX0FVVE8gfCBNSUlfQ05UTF9BVVRPOworCisJbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCwgZGF0YSk7CisKKwlpZiAoYXUxMDAwX2RlYnVnID4gNCkgZHVtcF9taWkoZGV2LCBwaHlfYWRkcik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBhbTc5Yzg3NF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIpCit7CisJczE2IG1paV9jb250cm9sLCB0aW1lb3V0OworCQorCWlmIChhdTEwMDBfZGVidWcgPiA0KQorCQlwcmludGsoImFtNzljODc0X3Jlc2V0XG4iKTsKKworCW1paV9jb250cm9sID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MKTsKKwltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MLCBtaWlfY29udHJvbCB8IE1JSV9DTlRMX1JFU0VUKTsKKwltZGVsYXkoMSk7CisJZm9yICh0aW1lb3V0ID0gMTAwOyB0aW1lb3V0ID4gMDsgLS10aW1lb3V0KSB7CisJCW1paV9jb250cm9sID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MKTsKKwkJaWYgKChtaWlfY29udHJvbCAmIE1JSV9DTlRMX1JFU0VUKSA9PSAwKQorCQkJYnJlYWs7CisJCW1kZWxheSgxKTsKKwl9CisJaWYgKG1paV9jb250cm9sICYgTUlJX0NOVExfUkVTRVQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyBQSFkgcmVzZXQgdGltZW91dCAhXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitpbnQgCithbTc5Yzg3NF9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyLCB1MTYgKmxpbmssIHUxNiAqc3BlZWQpCit7CisJdTE2IG1paV9kYXRhOworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwOworCisJLy8gcHJpbnRrKCJhbTc5Yzg3NF9zdGF0dXNcbiIpOworCWlmICghZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAiYW03OWM4NzRfc3RhdHVzIGVycm9yOiBOVUxMIGRldlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlhdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopIGRldi0+cHJpdjsKKwltaWlfZGF0YSA9IG1kaW9fcmVhZChkZXYsIGF1cC0+cGh5X2FkZHIsIE1JSV9TVEFUVVMpOworCisJaWYgKG1paV9kYXRhICYgTUlJX1NUQVRfTElOSykgeworCQkqbGluayA9IDE7CisJCW1paV9kYXRhID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX0FNRF9QSFlfU1RBVCk7CisJCWlmIChtaWlfZGF0YSAmIE1JSV9BTURfUEhZX1NUQVRfU1BEKSB7CisJCQlpZiAobWlpX2RhdGEgJiBNSUlfQU1EX1BIWV9TVEFUX0ZEWCkgeworCQkJCSpzcGVlZCA9IElGX1BPUlRfMTAwQkFTRUZYOworCQkJCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfMTAwQkFTRUZYOworCQkJfQorCQkJZWxzZSB7CisJCQkJKnNwZWVkID0gSUZfUE9SVF8xMDBCQVNFVFg7CisJCQkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMDBCQVNFVFg7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkqc3BlZWQgPSBJRl9QT1JUXzEwQkFTRVQ7CisJCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwQkFTRVQ7CisJCX0KKworCX0KKwllbHNlIHsKKwkJKmxpbmsgPSAwOworCQkqc3BlZWQgPSAwOworCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUX1VOS05PV047CisJfQorCXJldHVybiAwOworfQorCitpbnQgbHh0OTcxYV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkcikKK3sKKwlpZiAoYXUxMDAwX2RlYnVnID4gNCkKKwkJcHJpbnRrKCJseHQ5NzFhX2luaXRcbiIpOworCisJLyogcmVzdGFydCBhdXRvLW5lZ290aWF0aW9uICovCisJbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCwKKwkJICAgTUlJX0NOVExfRjEwMCB8IE1JSV9DTlRMX0FVVE8gfCBNSUlfQ05UTF9SU1RfQVVUTyB8IE1JSV9DTlRMX0ZEWCk7CisKKwkvKiBzZXQgdXAgTEVEcyB0byBjb3JyZWN0IGRpc3BsYXkgKi8KKwltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIDIwLCAweDA0MjIpOworCisJaWYgKGF1MTAwMF9kZWJ1ZyA+IDQpCisJCWR1bXBfbWlpKGRldiwgcGh5X2FkZHIpOworCXJldHVybiAwOworfQorCitpbnQgbHh0OTcxYV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIpCit7CisJczE2IG1paV9jb250cm9sLCB0aW1lb3V0OworCQorCWlmIChhdTEwMDBfZGVidWcgPiA0KSB7CisJCXByaW50aygibHh0OTcxYV9yZXNldFxuIik7CisJCWR1bXBfbWlpKGRldiwgcGh5X2FkZHIpOworCX0KKworCW1paV9jb250cm9sID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MKTsKKwltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MLCBtaWlfY29udHJvbCB8IE1JSV9DTlRMX1JFU0VUKTsKKwltZGVsYXkoMSk7CisJZm9yICh0aW1lb3V0ID0gMTAwOyB0aW1lb3V0ID4gMDsgLS10aW1lb3V0KSB7CisJCW1paV9jb250cm9sID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MKTsKKwkJaWYgKChtaWlfY29udHJvbCAmIE1JSV9DTlRMX1JFU0VUKSA9PSAwKQorCQkJYnJlYWs7CisJCW1kZWxheSgxKTsKKwl9CisJaWYgKG1paV9jb250cm9sICYgTUlJX0NOVExfUkVTRVQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyBQSFkgcmVzZXQgdGltZW91dCAhXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitpbnQKK2x4dDk3MWFfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkciwgdTE2ICpsaW5rLCB1MTYgKnNwZWVkKQoreworCXUxNiBtaWlfZGF0YTsKKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cDsKKworCWlmICghZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAibHh0OTcxYV9zdGF0dXMgZXJyb3I6IE5VTEwgZGV2XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlhdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopIGRldi0+cHJpdjsKKworCW1paV9kYXRhID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX1NUQVRVUyk7CisJaWYgKG1paV9kYXRhICYgTUlJX1NUQVRfTElOSykgeworCQkqbGluayA9IDE7CisJCW1paV9kYXRhID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX0lOVEVMX1BIWV9TVEFUKTsKKwkJaWYgKG1paV9kYXRhICYgTUlJX0lOVEVMX1BIWV9TVEFUX1NQRCkgeworCQkJaWYgKG1paV9kYXRhICYgTUlJX0lOVEVMX1BIWV9TVEFUX0ZEWCkgeworCQkJCSpzcGVlZCA9IElGX1BPUlRfMTAwQkFTRUZYOworCQkJCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfMTAwQkFTRUZYOworCQkJfQorCQkJZWxzZSB7CisJCQkJKnNwZWVkID0gSUZfUE9SVF8xMDBCQVNFVFg7CisJCQkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMDBCQVNFVFg7CisJCQl9CisJCX0KKwkJZWxzZSAgeworCQkJKnNwZWVkID0gSUZfUE9SVF8xMEJBU0VUOworCQkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMEJBU0VUOworCQl9CisKKwl9CisJZWxzZSB7CisJCSpsaW5rID0gMDsKKwkJKnNwZWVkID0gMDsKKwkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF9VTktOT1dOOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGtzODk5NW1faW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIpCit7CisJczE2IGRhdGE7CisJCisvLwlwcmludGsoImtzODk5NW1faW5pdFxuIik7CisJLyogU3RvcCBhdXRvLW5lZ290aWF0aW9uICovCisJZGF0YSA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCk7CisJbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCwgZGF0YSAmIH5NSUlfQ05UTF9BVVRPKTsKKworCS8qIFNldCBhZHZlcnRpc2VtZW50IHRvIDEwLzEwMCBhbmQgSGFsZi9GdWxsIGR1cGxleAorCSAqIChmdWxsIGNhcGFiaWxpdGllcykgKi8KKwlkYXRhID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9BTkFEVik7CisJZGF0YSB8PSBNSUlfTldBWV9UWCB8IE1JSV9OV0FZX1RYX0ZEWCB8IE1JSV9OV0FZX1RfRkRYIHwgTUlJX05XQVlfVDsKKwltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9BTkFEViwgZGF0YSk7CisJCisJLyogUmVzdGFydCBhdXRvLW5lZ290aWF0aW9uICovCisJZGF0YSA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCk7CisJZGF0YSB8PSBNSUlfQ05UTF9SU1RfQVVUTyB8IE1JSV9DTlRMX0FVVE87CisJbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCwgZGF0YSk7CisKKwlpZiAoYXUxMDAwX2RlYnVnID4gNCkgZHVtcF9taWkoZGV2LCBwaHlfYWRkcik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGtzODk5NW1fcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyKQoreworCXMxNiBtaWlfY29udHJvbCwgdGltZW91dDsKKwkKKy8vCXByaW50aygia3M4OTk1bV9yZXNldFxuIik7CisJbWlpX2NvbnRyb2wgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wpOworCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wsIG1paV9jb250cm9sIHwgTUlJX0NOVExfUkVTRVQpOworCW1kZWxheSgxKTsKKwlmb3IgKHRpbWVvdXQgPSAxMDA7IHRpbWVvdXQgPiAwOyAtLXRpbWVvdXQpIHsKKwkJbWlpX2NvbnRyb2wgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wpOworCQlpZiAoKG1paV9jb250cm9sICYgTUlJX0NOVExfUkVTRVQpID09IDApCisJCQlicmVhazsKKwkJbWRlbGF5KDEpOworCX0KKwlpZiAobWlpX2NvbnRyb2wgJiBNSUlfQ05UTF9SRVNFVCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzIFBIWSByZXNldCB0aW1lb3V0ICFcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBrczg5OTVtX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIsIHUxNiAqbGluaywgdTE2ICpzcGVlZCkKK3sKKwl1MTYgbWlpX2RhdGE7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXA7CisKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgImtzODk5NW1fc3RhdHVzIGVycm9yOiBOVUxMIGRldlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisKKwltaWlfZGF0YSA9IG1kaW9fcmVhZChkZXYsIGF1cC0+cGh5X2FkZHIsIE1JSV9TVEFUVVMpOworCWlmIChtaWlfZGF0YSAmIE1JSV9TVEFUX0xJTkspIHsKKwkJKmxpbmsgPSAxOworCQltaWlfZGF0YSA9IG1kaW9fcmVhZChkZXYsIGF1cC0+cGh5X2FkZHIsIE1JSV9BVVhfQ05UUkwpOworCQlpZiAobWlpX2RhdGEgJiBNSUlfQVVYXzEwMCkgeworCQkJaWYgKG1paV9kYXRhICYgTUlJX0FVWF9GRFgpIHsKKwkJCQkqc3BlZWQgPSBJRl9QT1JUXzEwMEJBU0VGWDsKKwkJCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwMEJBU0VGWDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCSpzcGVlZCA9IElGX1BPUlRfMTAwQkFTRVRYOworCQkJCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfMTAwQkFTRVRYOworCQkJfQorCQl9CisJCWVsc2UgIHsJCQkJCQkJCQkJCQorCQkJKnNwZWVkID0gSUZfUE9SVF8xMEJBU0VUOworCQkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMEJBU0VUOworCQl9CisKKwl9CisJZWxzZSB7CisJCSpsaW5rID0gMDsKKwkJKnNwZWVkID0gMDsKKwkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF9VTktOT1dOOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50CitzbXNjXzgzQzE4NV9pbml0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIpCit7CisJczE2IGRhdGE7CisKKwlpZiAoYXUxMDAwX2RlYnVnID4gNCkKKwkJcHJpbnRrKCJzbXNjXzgzQzE4NV9pbml0XG4iKTsKKworCS8qIFN0b3AgYXV0by1uZWdvdGlhdGlvbiAqLworCWRhdGEgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wpOworCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wsIGRhdGEgJiB+TUlJX0NOVExfQVVUTyk7CisKKwkvKiBTZXQgYWR2ZXJ0aXNlbWVudCB0byAxMC8xMDAgYW5kIEhhbGYvRnVsbCBkdXBsZXgKKwkgKiAoZnVsbCBjYXBhYmlsaXRpZXMpICovCisJZGF0YSA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfQU5BRFYpOworCWRhdGEgfD0gTUlJX05XQVlfVFggfCBNSUlfTldBWV9UWF9GRFggfCBNSUlfTldBWV9UX0ZEWCB8IE1JSV9OV0FZX1Q7CisJbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQU5BRFYsIGRhdGEpOworCQorCS8qIFJlc3RhcnQgYXV0by1uZWdvdGlhdGlvbiAqLworCWRhdGEgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wpOworCWRhdGEgfD0gTUlJX0NOVExfUlNUX0FVVE8gfCBNSUlfQ05UTF9BVVRPOworCisJbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQ09OVFJPTCwgZGF0YSk7CisKKwlpZiAoYXUxMDAwX2RlYnVnID4gNCkgZHVtcF9taWkoZGV2LCBwaHlfYWRkcik7CisJcmV0dXJuIDA7Cit9CisKK2ludAorc21zY184M0MxODVfcmVzZXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkcikKK3sKKwlzMTYgbWlpX2NvbnRyb2wsIHRpbWVvdXQ7CisJCisJaWYgKGF1MTAwMF9kZWJ1ZyA+IDQpCisJCXByaW50aygic21zY184M0MxODVfcmVzZXRcbiIpOworCisJbWlpX2NvbnRyb2wgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wpOworCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wsIG1paV9jb250cm9sIHwgTUlJX0NOVExfUkVTRVQpOworCW1kZWxheSgxKTsKKwlmb3IgKHRpbWVvdXQgPSAxMDA7IHRpbWVvdXQgPiAwOyAtLXRpbWVvdXQpIHsKKwkJbWlpX2NvbnRyb2wgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX0NPTlRST0wpOworCQlpZiAoKG1paV9jb250cm9sICYgTUlJX0NOVExfUkVTRVQpID09IDApCisJCQlicmVhazsKKwkJbWRlbGF5KDEpOworCX0KKwlpZiAobWlpX2NvbnRyb2wgJiBNSUlfQ05UTF9SRVNFVCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzIFBIWSByZXNldCB0aW1lb3V0ICFcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCAKK3Ntc2NfODNDMTg1X3N0YXR1cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyLCB1MTYgKmxpbmssIHUxNiAqc3BlZWQpCit7CisJdTE2IG1paV9kYXRhOworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwOworCisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzbXNjXzgzQzE4NV9zdGF0dXMgZXJyb3I6IE5VTEwgZGV2XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2OworCW1paV9kYXRhID0gbWRpb19yZWFkKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX1NUQVRVUyk7CisKKwlpZiAobWlpX2RhdGEgJiBNSUlfU1RBVF9MSU5LKSB7CisJCSpsaW5rID0gMTsKKwkJbWlpX2RhdGEgPSBtZGlvX3JlYWQoZGV2LCBhdXAtPnBoeV9hZGRyLCAweDFmKTsKKwkJaWYgKG1paV9kYXRhICYgKDE8PDMpKSB7CisJCQlpZiAobWlpX2RhdGEgJiAoMTw8NCkpIHsKKwkJCQkqc3BlZWQgPSBJRl9QT1JUXzEwMEJBU0VGWDsKKwkJCQlkZXYtPmlmX3BvcnQgPSBJRl9QT1JUXzEwMEJBU0VGWDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCSpzcGVlZCA9IElGX1BPUlRfMTAwQkFTRVRYOworCQkJCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfMTAwQkFTRVRYOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJKnNwZWVkID0gSUZfUE9SVF8xMEJBU0VUOworCQkJZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF8xMEJBU0VUOworCQl9CisJfQorCWVsc2UgeworCQkqbGluayA9IDA7CisJCSpzcGVlZCA9IDA7CisJCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfVU5LTk9XTjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworI2lmZGVmIENPTkZJR19NSVBTX0JPU1BPUlVTCitpbnQgc3R1Yl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkcikKK3sKKwkvL3ByaW50aygiUEhZIHN0dWJfaW5pdFxuIik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzdHViX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkcikKK3sKKwkvL3ByaW50aygiUEhZIHN0dWJfcmVzZXRcbiIpOworCXJldHVybiAwOworfQorCitpbnQgCitzdHViX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIsIHUxNiAqbGluaywgdTE2ICpzcGVlZCkKK3sKKwkvL3ByaW50aygiUEhZIHN0dWJfc3RhdHVzXG4iKTsKKwkqbGluayA9IDE7CisJLyogaG1tbSwgcmV2aXNpdCAqLworCSpzcGVlZCA9IElGX1BPUlRfMTAwQkFTRUZYOworCWRldi0+aWZfcG9ydCA9IElGX1BPUlRfMTAwQkFTRUZYOworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0cnVjdCBwaHlfb3BzIGJjbV81MjAxX29wcyA9IHsKKwliY21fNTIwMV9pbml0LAorCWJjbV81MjAxX3Jlc2V0LAorCWJjbV81MjAxX3N0YXR1cywKK307CisKK3N0cnVjdCBwaHlfb3BzIGFtNzljODc0X29wcyA9IHsKKwlhbTc5Yzg3NF9pbml0LAorCWFtNzljODc0X3Jlc2V0LAorCWFtNzljODc0X3N0YXR1cywKK307CisKK3N0cnVjdCBwaHlfb3BzIGFtNzljOTAxX29wcyA9IHsKKwlhbTc5YzkwMV9pbml0LAorCWFtNzljOTAxX3Jlc2V0LAorCWFtNzljOTAxX3N0YXR1cywKK307CisKK3N0cnVjdCBwaHlfb3BzIGxzaV84MDIyN19vcHMgPSB7IAorCWxzaV84MDIyN19pbml0LAorCWxzaV84MDIyN19yZXNldCwKKwlsc2lfODAyMjdfc3RhdHVzLAorfTsKKworc3RydWN0IHBoeV9vcHMgbHh0OTcxYV9vcHMgPSB7IAorCWx4dDk3MWFfaW5pdCwKKwlseHQ5NzFhX3Jlc2V0LAorCWx4dDk3MWFfc3RhdHVzLAorfTsKKworc3RydWN0IHBoeV9vcHMga3M4OTk1bV9vcHMgPSB7CisJa3M4OTk1bV9pbml0LAorCWtzODk5NW1fcmVzZXQsCisJa3M4OTk1bV9zdGF0dXMsCit9OworCitzdHJ1Y3QgcGh5X29wcyBzbXNjXzgzQzE4NV9vcHMgPSB7CisJc21zY184M0MxODVfaW5pdCwKKwlzbXNjXzgzQzE4NV9yZXNldCwKKwlzbXNjXzgzQzE4NV9zdGF0dXMsCit9OworCisjaWZkZWYgQ09ORklHX01JUFNfQk9TUE9SVVMKK3N0cnVjdCBwaHlfb3BzIHN0dWJfb3BzID0geworCXN0dWJfaW5pdCwKKwlzdHViX3Jlc2V0LAorCXN0dWJfc3RhdHVzLAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG1paV9jaGlwX2luZm8geworCWNvbnN0IGNoYXIgKiBuYW1lOworCXUxNiBwaHlfaWQwOworCXUxNiBwaHlfaWQxOworCXN0cnVjdCBwaHlfb3BzICpwaHlfb3BzOwkKKwlpbnQgZHVhbF9waHk7Cit9IG1paV9jaGlwX3RhYmxlW10gPSB7CisJeyJCcm9hZGNvbSBCQ001MjAxIDEwLzEwMCBCYXNlVCBQSFkiLDB4MDA0MCwweDYyMTIsICZiY21fNTIwMV9vcHMsMH0sCisJeyJCcm9hZGNvbSBCQ001MjIxIDEwLzEwMCBCYXNlVCBQSFkiLDB4MDA0MCwweDYxZTQsICZiY21fNTIwMV9vcHMsMH0sCisJeyJCcm9hZGNvbSBCQ001MjIyIDEwLzEwMCBCYXNlVCBQSFkiLDB4MDA0MCwweDYzMjIsICZiY21fNTIwMV9vcHMsMX0sCisJeyJBTUQgNzlDOTAxIEhvbWVQTkEgUEhZIiwweDAwMDAsMHgzNWM4LCAmYW03OWM5MDFfb3BzLDB9LAorCXsiQU1EIDc5Qzg3NCAxMC8xMDAgQmFzZVQgUEhZIiwweDAwMjIsMHg1NjFiLCAmYW03OWM4NzRfb3BzLDB9LAorCXsiTFNJIDgwMjI3IDEwLzEwMCBCYXNlVCBQSFkiLDB4MDAxNiwweGY4NDAsICZsc2lfODAyMjdfb3BzLDB9LAorCXsiSW50ZWwgTFhUOTcxQSBEdWFsIFNwZWVkIFBIWSIsMHgwMDEzLDB4NzhlMiwgJmx4dDk3MWFfb3BzLDB9LAorCXsiS2VuZGluIEtTODk5NU0gMTAvMTAwIEJhc2VUIFBIWSIsMHgwMDIyLDB4MTQ1MCwgJmtzODk5NW1fb3BzLDB9LAorCXsiU01TQyBMQU44M0MxODUgMTAvMTAwIEJhc2VUIFBIWSIsMHgwMDA3LDB4YzBhMywgJnNtc2NfODNDMTg1X29wcywwfSwKKyNpZmRlZiBDT05GSUdfTUlQU19CT1NQT1JVUworCXsiU3R1YiIsIDB4MTIzNCwgMHg1Njc4LCAmc3R1Yl9vcHMgfSwKKyNlbmRpZgorCXswLH0sCit9OworCitzdGF0aWMgaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnKQoreworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdm9sYXRpbGUgdTMyICptaWlfY29udHJvbF9yZWc7CisJdm9sYXRpbGUgdTMyICptaWlfZGF0YV9yZWc7CisJdTMyIHRpbWVkb3V0ID0gMjA7CisJdTMyIG1paV9jb250cm9sOworCisJI2lmZGVmIENPTkZJR19CQ001MjIyX0RVQUxfUEhZCisJLyogRmlyc3QgdGltZSB3ZSBwcm9iZSwgaXQncyBmb3IgdGhlIG1hYzAgcGh5LgorCSAqIFNpbmNlIHdlIGhhdmVuJ3QgZGV0ZXJtaW5lZCB5ZXQgdGhhdCB3ZSBoYXZlIGEgZHVhbCBwaHksCisJICogYXVwLT5taWktPm1paV9jb250cm9sX3JlZyB3b24ndCBiZSBzZXR1cCBhbmQgd2UnbGwKKwkgKiBkZWZhdWx0IHRvIHRoZSBlbHNlIHN0YXRlbWVudC4KKwkgKiBCeSB0aGUgdGltZSB3ZSBwcm9iZSBmb3IgdGhlIG1hYzEgcGh5LCB0aGUgbWlpX2NvbnRyb2xfcmVnCisJICogd2lsbCBiZSBzZXR1cCB0byBiZSB0aGUgYWRkcmVzcyBvZiB0aGUgbWFjMCBwaHkgY29udHJvbCBzaW5jZQorCSAqIGJvdGggcGh5cyBhcmUgY29udHJvbGxlZCB0aHJvdWdoIG1hYzAuCisJICovCisJaWYgKGF1cC0+bWlpICYmIGF1cC0+bWlpLT5taWlfY29udHJvbF9yZWcpIHsKKwkJbWlpX2NvbnRyb2xfcmVnID0gYXVwLT5taWktPm1paV9jb250cm9sX3JlZzsKKwkJbWlpX2RhdGFfcmVnID0gYXVwLT5taWktPm1paV9kYXRhX3JlZzsKKwl9CisJZWxzZSBpZiAoYXVfbWFjc1swXS0+bWlpICYmIGF1X21hY3NbMF0tPm1paS0+bWlpX2NvbnRyb2xfcmVnKSB7CisJCS8qIGFzc3VtZSBib3RoIHBoeXMgYXJlIGNvbnRyb2xsZWQgdGhyb3VnaCBtYWMwICovCisJCW1paV9jb250cm9sX3JlZyA9IGF1X21hY3NbMF0tPm1paS0+bWlpX2NvbnRyb2xfcmVnOworCQltaWlfZGF0YV9yZWcgPSBhdV9tYWNzWzBdLT5taWktPm1paV9kYXRhX3JlZzsKKwl9CisJZWxzZSAKKwkjZW5kaWYKKwl7CisJCS8qIGRlZmF1bHQgY29udHJvbCBhbmQgZGF0YSByZWcgYWRkcmVzc2VzICovCisJCW1paV9jb250cm9sX3JlZyA9ICZhdXAtPm1hYy0+bWlpX2NvbnRyb2w7CisJCW1paV9kYXRhX3JlZyA9ICZhdXAtPm1hYy0+bWlpX2RhdGE7CisJfQorCisJd2hpbGUgKCptaWlfY29udHJvbF9yZWcgJiBNQUNfTUlJX0JVU1kpIHsKKwkJbWRlbGF5KDEpOworCQlpZiAoLS10aW1lZG91dCA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWFkX01JSSBidXN5IHRpbWVvdXQhIVxuIiwgCisJCQkJCWRldi0+bmFtZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwltaWlfY29udHJvbCA9IE1BQ19TRVRfTUlJX1NFTEVDVF9SRUcocmVnKSB8IAorCQlNQUNfU0VUX01JSV9TRUxFQ1RfUEhZKHBoeV9pZCkgfCBNQUNfTUlJX1JFQUQ7CisKKwkqbWlpX2NvbnRyb2xfcmVnID0gbWlpX2NvbnRyb2w7CisKKwl0aW1lZG91dCA9IDIwOworCXdoaWxlICgqbWlpX2NvbnRyb2xfcmVnICYgTUFDX01JSV9CVVNZKSB7CisJCW1kZWxheSgxKTsKKwkJaWYgKC0tdGltZWRvdXQgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbWRpb19yZWFkIGJ1c3kgdGltZW91dCEhXG4iLCAKKwkJCQkJZGV2LT5uYW1lKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlyZXR1cm4gKGludCkqbWlpX2RhdGFfcmVnOworfQorCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCByZWcsIHUxNiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXZvbGF0aWxlIHUzMiAqbWlpX2NvbnRyb2xfcmVnOworCXZvbGF0aWxlIHUzMiAqbWlpX2RhdGFfcmVnOworCXUzMiB0aW1lZG91dCA9IDIwOworCXUzMiBtaWlfY29udHJvbDsKKworCSNpZmRlZiBDT05GSUdfQkNNNTIyMl9EVUFMX1BIWQorCWlmIChhdXAtPm1paSAmJiBhdXAtPm1paS0+bWlpX2NvbnRyb2xfcmVnKSB7CisJCW1paV9jb250cm9sX3JlZyA9IGF1cC0+bWlpLT5taWlfY29udHJvbF9yZWc7CisJCW1paV9kYXRhX3JlZyA9IGF1cC0+bWlpLT5taWlfZGF0YV9yZWc7CisJfQorCWVsc2UgaWYgKGF1X21hY3NbMF0tPm1paSAmJiBhdV9tYWNzWzBdLT5taWktPm1paV9jb250cm9sX3JlZykgeworCQkvKiBhc3N1bWUgYm90aCBwaHlzIGFyZSBjb250cm9sbGVkIHRocm91Z2ggbWFjMCAqLworCQltaWlfY29udHJvbF9yZWcgPSBhdV9tYWNzWzBdLT5taWktPm1paV9jb250cm9sX3JlZzsKKwkJbWlpX2RhdGFfcmVnID0gYXVfbWFjc1swXS0+bWlpLT5taWlfZGF0YV9yZWc7CisJfQorCWVsc2UgCisJI2VuZGlmCisJeworCQkvKiBkZWZhdWx0IGNvbnRyb2wgYW5kIGRhdGEgcmVnIGFkZHJlc3NlcyAqLworCQltaWlfY29udHJvbF9yZWcgPSAmYXVwLT5tYWMtPm1paV9jb250cm9sOworCQltaWlfZGF0YV9yZWcgPSAmYXVwLT5tYWMtPm1paV9kYXRhOworCX0KKworCXdoaWxlICgqbWlpX2NvbnRyb2xfcmVnICYgTUFDX01JSV9CVVNZKSB7CisJCW1kZWxheSgxKTsKKwkJaWYgKC0tdGltZWRvdXQgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbWRpb193cml0ZSBidXN5IHRpbWVvdXQhIVxuIiwgCisJCQkJCWRldi0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwltaWlfY29udHJvbCA9IE1BQ19TRVRfTUlJX1NFTEVDVF9SRUcocmVnKSB8IAorCQlNQUNfU0VUX01JSV9TRUxFQ1RfUEhZKHBoeV9pZCkgfCBNQUNfTUlJX1dSSVRFOworCisJKm1paV9kYXRhX3JlZyA9IHZhbHVlOworCSptaWlfY29udHJvbF9yZWcgPSBtaWlfY29udHJvbDsKK30KKworCitzdGF0aWMgdm9pZCBkdW1wX21paShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkKQoreworCWludCBpLCB2YWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCWlmICgodmFsID0gbWRpb19yZWFkKGRldiwgcGh5X2lkLCBpKSkgPj0gMCkKKwkJCXByaW50aygiJXM6IE1JSSBSZWcgJWQ9JXhcbiIsIGRldi0+bmFtZSwgaSwgdmFsKTsKKwl9CisJZm9yIChpID0gMTY7IGkgPCAyNTsgaSsrKSB7CisJCWlmICgodmFsID0gbWRpb19yZWFkKGRldiwgcGh5X2lkLCBpKSkgPj0gMCkKKwkJCXByaW50aygiJXM6IE1JSSBSZWcgJWQ9JXhcbiIsIGRldi0+bmFtZSwgaSwgdmFsKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWlpX3Byb2JlIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2OworCWludCBwaHlfYWRkcjsKKyNpZmRlZiBDT05GSUdfTUlQU19CT1NQT1JVUworCWludCBwaHlfZm91bmQ9MDsKKyNlbmRpZgorCisJLyogc2VhcmNoIGZvciB0b3RhbCBvZiAzMiBwb3NzaWJsZSBtaWkgcGh5IGFkZHJlc3NlcyAqLworCWZvciAocGh5X2FkZHIgPSAwOyBwaHlfYWRkciA8IDMyOyBwaHlfYWRkcisrKSB7CisJCXUxNiBtaWlfc3RhdHVzOworCQl1MTYgcGh5X2lkMCwgcGh5X2lkMTsKKwkJaW50IGk7CisKKwkJI2lmZGVmIENPTkZJR19CQ001MjIyX0RVQUxfUEhZCisJCS8qIE1hc2sgdGhlIGFscmVhZHkgZm91bmQgcGh5LCB0cnkgbmV4dCBvbmUgKi8KKwkJaWYgKGF1X21hY3NbMF0tPm1paSAmJiBhdV9tYWNzWzBdLT5taWktPm1paV9jb250cm9sX3JlZykgeworCQkJaWYgKGF1X21hY3NbMF0tPnBoeV9hZGRyID09IHBoeV9hZGRyKQorCQkJCWNvbnRpbnVlOworCQl9CisJCSNlbmRpZgorCisJCW1paV9zdGF0dXMgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX1NUQVRVUyk7CisJCWlmIChtaWlfc3RhdHVzID09IDB4ZmZmZiB8fCBtaWlfc3RhdHVzID09IDB4MDAwMCkKKwkJCS8qIHRoZSBtaWkgaXMgbm90IGFjY2Vzc2FibGUsIHRyeSBuZXh0IG9uZSAqLworCQkJY29udGludWU7CisKKwkJcGh5X2lkMCA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfUEhZX0lEMCk7CisJCXBoeV9pZDEgPSBtZGlvX3JlYWQoZGV2LCBwaHlfYWRkciwgTUlJX1BIWV9JRDEpOworCisJCS8qIHNlYXJjaCBvdXIgbWlpIHRhYmxlIGZvciB0aGUgY3VycmVudCBtaWkgKi8gCisJCWZvciAoaSA9IDA7IG1paV9jaGlwX3RhYmxlW2ldLnBoeV9pZDE7IGkrKykgeworCQkJaWYgKHBoeV9pZDAgPT0gbWlpX2NoaXBfdGFibGVbaV0ucGh5X2lkMCAmJgorCQkJICAgIHBoeV9pZDEgPT0gbWlpX2NoaXBfdGFibGVbaV0ucGh5X2lkMSkgeworCQkJCXN0cnVjdCBtaWlfcGh5ICogbWlpX3BoeSA9IGF1cC0+bWlpOworCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGF0IHBoeSBhZGRyZXNzICVkXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIG1paV9jaGlwX3RhYmxlW2ldLm5hbWUsIAorCQkJCSAgICAgICBwaHlfYWRkcik7CisjaWZkZWYgQ09ORklHX01JUFNfQk9TUE9SVVMKKwkJCQlwaHlfZm91bmQgPSAxOworI2VuZGlmCisJCQkJbWlpX3BoeS0+Y2hpcF9pbmZvID0gbWlpX2NoaXBfdGFibGUraTsKKwkJCQlhdXAtPnBoeV9hZGRyID0gcGh5X2FkZHI7CisJCQkJYXVwLT53YW50X2F1dG9uZWcgPSAxOworCQkJCWF1cC0+cGh5X29wcyA9IG1paV9jaGlwX3RhYmxlW2ldLnBoeV9vcHM7CisJCQkJYXVwLT5waHlfb3BzLT5waHlfaW5pdChkZXYscGh5X2FkZHIpOworCisJCQkJLy8gQ2hlY2sgZm9yIGR1YWwtcGh5IGFuZCB0aGVuIHN0b3JlIHJlcXVpcmVkIAorCQkJCS8vIHZhbHVlcyBhbmQgc2V0IGluZGljYXRvcnMuIFdlIG5lZWQgdG8gZG8gCisJCQkJLy8gdGhpcyBub3cgc2luY2UgbWRpb197cmVhZCx3cml0ZX0gbmVlZCB0aGUgCisJCQkJLy8gY29udHJvbCBhbmQgZGF0YSByZWdpc3RlciBhZGRyZXNzZXMuCisJCQkJI2lmZGVmIENPTkZJR19CQ001MjIyX0RVQUxfUEhZCisJCQkJaWYgKCBtaWlfY2hpcF90YWJsZVtpXS5kdWFsX3BoeSkgeworCisJCQkJCS8qIGFzc3VtZSBib3RoIHBoeXMgYXJlIGNvbnRyb2xsZWQgCisJCQkJCSAqIHRocm91Z2ggTUFDMC4gQm9hcmQgc3BlY2lmaWM/ICovCisJCQkJCQorCQkJCQkvKiBzYW5pdHkgY2hlY2sgKi8KKwkJCQkJaWYgKCFhdV9tYWNzWzBdIHx8ICFhdV9tYWNzWzBdLT5taWkpCisJCQkJCQlyZXR1cm4gLTE7CisJCQkJCWF1cC0+bWlpLT5taWlfY29udHJvbF9yZWcgPSAodTMyICopCisJCQkJCQkmYXVfbWFjc1swXS0+bWFjLT5taWlfY29udHJvbDsKKwkJCQkJYXVwLT5taWktPm1paV9kYXRhX3JlZyA9ICh1MzIgKikKKwkJCQkJCSZhdV9tYWNzWzBdLT5tYWMtPm1paV9kYXRhOworCQkJCX0KKwkJCQkjZW5kaWYKKwkJCQlnb3RvIGZvdW5kOworCQkJfQorCQl9CisJfQorZm91bmQ6CisKKyNpZmRlZiBDT05GSUdfTUlQU19CT1NQT1JVUworCS8qIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciB0aGUgTWljcmVsL0tlbmRpbiA1IHBvcnQgc3dpdGNoCisJICAgVGhlIHNlY29uZCBNQUMgZG9lc24ndCBzZWUgYSBQSFkgY29ubmVjdGVkLi4uIHNvIHdlIG5lZWQgdG8KKwkgICB0cmljayBpdCBpbnRvIHRoaW5raW5nIHdlIGhhdmUgb25lLgorCQkKKwkgICBJZiB0aGlzIGtlcm5lbCBpcyBydW4gb24gYW5vdGhlciBBdTE1MDAgZGV2ZWxvcG1lbnQgYm9hcmQKKwkgICB0aGUgc3R1YiB3aWxsIGJlIGZvdW5kIGFzIHdlbGwgYXMgdGhlIGFjdHVhbCBQSFkuIEhvd2V2ZXIsCisJICAgdGhlIGxhc3QgZm91bmQgUEhZIHdpbGwgYmUgdXNlZC4uLiB1c3VhbGx5IGF0IEFkZHIgMzEgKERiMTUwMCkuCQorCSovCisJaWYgKCAoIXBoeV9mb3VuZCkgKQorCXsKKwkJdTE2IHBoeV9pZDAsIHBoeV9pZDE7CisJCWludCBpOworCisJCXBoeV9pZDAgPSAweDEyMzQ7CisJCXBoeV9pZDEgPSAweDU2Nzg7CisKKwkJLyogc2VhcmNoIG91ciBtaWkgdGFibGUgZm9yIHRoZSBjdXJyZW50IG1paSAqLyAKKwkJZm9yIChpID0gMDsgbWlpX2NoaXBfdGFibGVbaV0ucGh5X2lkMTsgaSsrKSB7CisJCQlpZiAocGh5X2lkMCA9PSBtaWlfY2hpcF90YWJsZVtpXS5waHlfaWQwICYmCisJCQkgICAgcGh5X2lkMSA9PSBtaWlfY2hpcF90YWJsZVtpXS5waHlfaWQxKSB7CisJCQkJc3RydWN0IG1paV9waHkgKiBtaWlfcGh5OworCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGF0IHBoeSBhZGRyZXNzICVkXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIG1paV9jaGlwX3RhYmxlW2ldLm5hbWUsIAorCQkJCSAgICAgICBwaHlfYWRkcik7CisJCQkJbWlpX3BoeSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWlfcGh5KSwgCisJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCQlpZiAobWlpX3BoeSkgeworCQkJCQltaWlfcGh5LT5jaGlwX2luZm8gPSBtaWlfY2hpcF90YWJsZStpOworCQkJCQlhdXAtPnBoeV9hZGRyID0gcGh5X2FkZHI7CisJCQkJCW1paV9waHktPm5leHQgPSBhdXAtPm1paTsKKwkJCQkJYXVwLT5waHlfb3BzID0gCisJCQkJCQltaWlfY2hpcF90YWJsZVtpXS5waHlfb3BzOworCQkJCQlhdXAtPm1paSA9IG1paV9waHk7CisJCQkJCWF1cC0+cGh5X29wcy0+cGh5X2luaXQoZGV2LHBoeV9hZGRyKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvdXQgb2YgbWVtb3J5XG4iLCAKKwkJCQkJCQlkZXYtPm5hbWUpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCW1paV9waHktPmNoaXBfaW5mbyA9IG1paV9jaGlwX3RhYmxlK2k7CisJCQkJYXVwLT5waHlfYWRkciA9IHBoeV9hZGRyOworCQkJCWF1cC0+cGh5X29wcyA9IG1paV9jaGlwX3RhYmxlW2ldLnBoeV9vcHM7CisJCQkJYXVwLT5waHlfb3BzLT5waHlfaW5pdChkZXYscGh5X2FkZHIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmIChhdXAtPm1hY19pZCA9PSAwKSB7CisJCS8qIHRoZSBCb3Nwb3J1cyBwaHkgcmVzcG9uZHMgdG8gYWRkcmVzc2VzIDAtNSBidXQgCisJCSAqIDUgaXMgdGhlIGNvcnJlY3Qgb25lLgorCQkgKi8KKwkJYXVwLT5waHlfYWRkciA9IDU7CisJfQorI2VuZGlmCisKKwlpZiAoYXVwLT5taWktPmNoaXBfaW5mbyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEF1MXggTm8gTUlJIHRyYW5zY2VpdmVycyBmb3VuZCFcbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBVc2luZyAlcyBhcyBkZWZhdWx0XG4iLCAKKwkJCWRldi0+bmFtZSwgYXVwLT5taWktPmNoaXBfaW5mby0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogQnVmZmVyIGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uIHJvdXRpbmVzLiBUaGUgYnVmZmVyIGRlc2NyaXB0b3IgcmV0dXJuZWQKKyAqIGhhcyB0aGUgdmlydHVhbCBhbmQgZG1hIGFkZHJlc3Mgb2YgYSBidWZmZXIgc3VpdGFibGUgZm9yIAorICogYm90aCwgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgb3BlcmF0aW9ucy4KKyAqLworc3RhdGljIGRiX2Rlc3RfdCAqR2V0RnJlZURCKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwKQoreworCWRiX2Rlc3RfdCAqcERCOworCXBEQiA9IGF1cC0+cERCZnJlZTsKKworCWlmIChwREIpIHsKKwkJYXVwLT5wREJmcmVlID0gcERCLT5wbmV4dDsKKwl9CisJcmV0dXJuIHBEQjsKK30KKwordm9pZCBSZWxlYXNlREIoc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAsIGRiX2Rlc3RfdCAqcERCKQoreworCWRiX2Rlc3RfdCAqcERCZnJlZSA9IGF1cC0+cERCZnJlZTsKKwlpZiAocERCZnJlZSkKKwkJcERCZnJlZS0+cG5leHQgPSBwREI7CisJYXVwLT5wREJmcmVlID0gcERCOworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfcnhfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2OworCisJaWYgKGF1MTAwMF9kZWJ1ZyA+IDQpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBlbmFibGVfcnhfdHhcbiIsIGRldi0+bmFtZSk7CisKKwlhdXAtPm1hYy0+Y29udHJvbCB8PSAoTUFDX1JYX0VOQUJMRSB8IE1BQ19UWF9FTkFCTEUpOworCWF1X3N5bmNfZGVsYXkoMTApOworfQorCitzdGF0aWMgdm9pZCBoYXJkX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2OworCisJaWYgKGF1MTAwMF9kZWJ1ZyA+IDQpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBoYXJkIHN0b3BcbiIsIGRldi0+bmFtZSk7CisKKwlhdXAtPm1hYy0+Y29udHJvbCAmPSB+KE1BQ19SWF9FTkFCTEUgfCBNQUNfVFhfRU5BQkxFKTsKKwlhdV9zeW5jX2RlbGF5KDEwKTsKK30KKworCitzdGF0aWMgdm9pZCByZXNldF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwl1MzIgZmxhZ3M7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopIGRldi0+cHJpdjsKKworCWlmIChhdTEwMDBfZGVidWcgPiA0KSAKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlc2V0IG1hYywgYXVwICV4XG4iLCAKKwkJCQlkZXYtPm5hbWUsICh1bnNpZ25lZClhdXApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmF1cC0+bG9jaywgZmxhZ3MpOworCWlmIChhdXAtPnRpbWVyLmZ1bmN0aW9uID09ICZhdTEwMDBfdGltZXIpIHsvKiBjaGVjayBpZiB0aW1lciBpbml0dGVkICovCisJCWRlbF90aW1lcigmYXVwLT50aW1lcik7CisJfQorCisJaGFyZF9zdG9wKGRldik7CisJI2lmZGVmIENPTkZJR19CQ001MjIyX0RVQUxfUEhZCisJaWYgKGF1cC0+bWFjX2lkICE9IDApIHsKKwkjZW5kaWYKKwkJLyogSWYgQkNNNTIyMiwgd2UgY2FuJ3QgbGVhdmUgTUFDMCBpbiByZXNldCBiZWNhdXNlIHRoZW4gCisJCSAqIHdlIGNhbid0IGFjY2VzcyB0aGUgZHVhbCBwaHkgZm9yIEVUSDEgKi8KKwkJKmF1cC0+ZW5hYmxlID0gTUFDX0VOX0NMT0NLX0VOQUJMRTsKKwkJYXVfc3luY19kZWxheSgyKTsKKwkJKmF1cC0+ZW5hYmxlID0gMDsKKwkJYXVfc3luY19kZWxheSgyKTsKKwkjaWZkZWYgQ09ORklHX0JDTTUyMjJfRFVBTF9QSFkKKwl9CisJI2VuZGlmCisJYXVwLT50eF9mdWxsID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0RNQTsgaSsrKSB7CisJCS8qIHJlc2V0IGNvbnRyb2wgYml0cyAqLworCQlhdXAtPnJ4X2RtYV9yaW5nW2ldLT5idWZmX3N0YXQgJj0gfjB4ZjsKKwl9CisJZm9yIChpID0gMDsgaSA8IE5VTV9UWF9ETUE7IGkrKykgeworCQkvKiByZXNldCBjb250cm9sIGJpdHMgKi8KKwkJYXVwLT50eF9kbWFfcmluZ1tpXS0+YnVmZl9zdGF0ICY9IH4weGY7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF1cC0+bG9jaywgZmxhZ3MpOworfQorCisKKy8qIAorICogU2V0dXAgdGhlIHJlY2VpdmUgYW5kIHRyYW5zbWl0ICJyaW5ncyIuICBUaGVzZSBwb2ludGVycyBhcmUgdGhlIGFkZHJlc3NlcworICogb2YgdGhlIHJ4IGFuZCB0eCBNQUMgRE1BIHJlZ2lzdGVycyBzbyB0aGV5IGFyZSBmaXhlZCBieSB0aGUgaGFyZHdhcmUgLS0KKyAqIHRoZXNlIGFyZSBub3QgZGVzY3JpcHRvcnMgc2l0dGluZyBpbiBtZW1vcnkuCisgKi8KK3N0YXRpYyB2b2lkIAorc2V0dXBfaHdfcmluZ3Moc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAsIHUzMiByeF9iYXNlLCB1MzIgdHhfYmFzZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfRE1BOyBpKyspIHsKKwkJYXVwLT5yeF9kbWFfcmluZ1tpXSA9IAorCQkJKHZvbGF0aWxlIHJ4X2RtYV90ICopIChyeF9iYXNlICsgc2l6ZW9mKHJ4X2RtYV90KSppKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IE5VTV9UWF9ETUE7IGkrKykgeworCQlhdXAtPnR4X2RtYV9yaW5nW2ldID0gCisJCQkodm9sYXRpbGUgdHhfZG1hX3QgKikgKHR4X2Jhc2UgKyBzaXplb2YodHhfZG1hX3QpKmkpOworCX0KK30KKworc3RhdGljIHN0cnVjdCB7CisJaW50IHBvcnQ7CisJdTMyIGJhc2VfYWRkcjsKKwl1MzIgbWFjZW5fYWRkcjsKKwlpbnQgaXJxOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Cit9IGlmbGlzdFsyXTsKKworc3RhdGljIGludCBudW1faWZzOworCisvKgorICogU2V0dXAgdGhlIGJhc2UgYWRkcmVzcyBhbmQgaW50ZXJ1cHQgb2YgdGhlIEF1MXh4eCBldGhlcm5ldCBtYWNzCisgKiBiYXNlZCBvbiBjcHUgdHlwZSBhbmQgd2hldGhlciB0aGUgaW50ZXJmYWNlIGlzIGVuYWJsZWQgaW4gc3lzX3BpbmZ1bmMKKyAqIHJlZ2lzdGVyLiBUaGUgbGFzdCBpbnRlcmZhY2UgaXMgZW5hYmxlZCBpZiBTWVNfUEZfTkkyIChiaXQgNCkgaXMgMC4KKyAqLworc3RhdGljIGludCBfX2luaXQgYXUxMDAwX2luaXRfbW9kdWxlKHZvaWQpCit7CisJc3RydWN0IGNwdWluZm9fbWlwcyAqYyA9ICZjdXJyZW50X2NwdV9kYXRhOworCWludCBuaSA9IChpbnQpKChhdV9yZWFkbChTWVNfUElORlVOQykgJiAodTMyKShTWVNfUEZfTkkyKSkgPj4gNCk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaSwgZm91bmRfb25lID0gMDsKKworCXN3aXRjaCAoYy0+Y3B1dHlwZSkgeworI2lmZGVmIENPTkZJR19TT0NfQVUxMDAwCisJY2FzZSBDUFVfQVUxMDAwOgorCQludW1faWZzID0gMiAtIG5pOworCQlpZmxpc3RbMF0uYmFzZV9hZGRyID0gQVUxMDAwX0VUSDBfQkFTRTsKKwkJaWZsaXN0WzFdLmJhc2VfYWRkciA9IEFVMTAwMF9FVEgxX0JBU0U7CisJCWlmbGlzdFswXS5tYWNlbl9hZGRyID0gQVUxMDAwX01BQzBfRU5BQkxFOworCQlpZmxpc3RbMV0ubWFjZW5fYWRkciA9IEFVMTAwMF9NQUMxX0VOQUJMRTsKKwkJaWZsaXN0WzBdLmlycSA9IEFVMTAwMF9NQUMwX0RNQV9JTlQ7CisJCWlmbGlzdFsxXS5pcnEgPSBBVTEwMDBfTUFDMV9ETUFfSU5UOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TT0NfQVUxMTAwCisJY2FzZSBDUFVfQVUxMTAwOgorCQludW1faWZzID0gMSAtIG5pOworCQlpZmxpc3RbMF0uYmFzZV9hZGRyID0gQVUxMTAwX0VUSDBfQkFTRTsKKwkJaWZsaXN0WzBdLm1hY2VuX2FkZHIgPSBBVTExMDBfTUFDMF9FTkFCTEU7CisJCWlmbGlzdFswXS5pcnEgPSBBVTExMDBfTUFDMF9ETUFfSU5UOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TT0NfQVUxNTAwCisJY2FzZSBDUFVfQVUxNTAwOgorCQludW1faWZzID0gMiAtIG5pOworCQlpZmxpc3RbMF0uYmFzZV9hZGRyID0gQVUxNTAwX0VUSDBfQkFTRTsKKwkJaWZsaXN0WzFdLmJhc2VfYWRkciA9IEFVMTUwMF9FVEgxX0JBU0U7CisJCWlmbGlzdFswXS5tYWNlbl9hZGRyID0gQVUxNTAwX01BQzBfRU5BQkxFOworCQlpZmxpc3RbMV0ubWFjZW5fYWRkciA9IEFVMTUwMF9NQUMxX0VOQUJMRTsKKwkJaWZsaXN0WzBdLmlycSA9IEFVMTUwMF9NQUMwX0RNQV9JTlQ7CisJCWlmbGlzdFsxXS5pcnEgPSBBVTE1MDBfTUFDMV9ETUFfSU5UOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TT0NfQVUxNTUwCisJY2FzZSBDUFVfQVUxNTUwOgorCQludW1faWZzID0gMiAtIG5pOworCQlpZmxpc3RbMF0uYmFzZV9hZGRyID0gQVUxNTUwX0VUSDBfQkFTRTsKKwkJaWZsaXN0WzFdLmJhc2VfYWRkciA9IEFVMTU1MF9FVEgxX0JBU0U7CisJCWlmbGlzdFswXS5tYWNlbl9hZGRyID0gQVUxNTUwX01BQzBfRU5BQkxFOworCQlpZmxpc3RbMV0ubWFjZW5fYWRkciA9IEFVMTU1MF9NQUMxX0VOQUJMRTsKKwkJaWZsaXN0WzBdLmlycSA9IEFVMTU1MF9NQUMwX0RNQV9JTlQ7CisJCWlmbGlzdFsxXS5pcnEgPSBBVTE1NTBfTUFDMV9ETUFfSU5UOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCW51bV9pZnMgPSAwOworCX0KKwlmb3IoaSA9IDA7IGkgPCBudW1faWZzOyBpKyspIHsKKwkJZGV2ID0gYXUxMDAwX3Byb2JlKGlmbGlzdFtpXS5iYXNlX2FkZHIsIGlmbGlzdFtpXS5pcnEsIGkpOworCQlpZmxpc3RbaV0uZGV2ID0gZGV2OworCQlpZiAoZGV2KQorCQkJZm91bmRfb25lKys7CisJfQorCWlmICghZm91bmRfb25lKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdTEwMDBfc2V0dXBfYW5lZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgYWR2ZXJ0aXNlKQoreworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwl1MTYgY3RsLCBhZHY7CisKKwkvKiBTZXR1cCBzdGFuZGFyZCBhZHZlcnRpc2UgKi8KKwlhZHYgPSBtZGlvX3JlYWQoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfQURWRVJUSVNFKTsKKwlhZHYgJj0gfihBRFZFUlRJU0VfQUxMIHwgQURWRVJUSVNFXzEwMEJBU0U0KTsKKwlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpCisJCWFkdiB8PSBBRFZFUlRJU0VfMTBIQUxGOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkKKwkJYWR2IHw9IEFEVkVSVElTRV8xMEZVTEw7CisJaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZikKKwkJYWR2IHw9IEFEVkVSVElTRV8xMDBIQUxGOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpCisJCWFkdiB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwltZGlvX3dyaXRlKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX0FEVkVSVElTRSwgYWR2KTsKKworCS8qIFN0YXJ0L1Jlc3RhcnQgYW5lZyAqLworCWN0bCA9IG1kaW9fcmVhZChkZXYsIGF1cC0+cGh5X2FkZHIsIE1JSV9CTUNSKTsKKwljdGwgfD0gKEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVCk7CisJbWRpb193cml0ZShkZXYsIGF1cC0+cGh5X2FkZHIsIE1JSV9CTUNSLCBjdGwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXUxMDAwX3NldHVwX2ZvcmNlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3BlZWQsIGludCBmZCkKK3sKKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKilkZXYtPnByaXY7CisJdTE2IGN0bDsKKworCWN0bCA9IG1kaW9fcmVhZChkZXYsIGF1cC0+cGh5X2FkZHIsIE1JSV9CTUNSKTsKKwljdGwgJj0gfihCTUNSX0ZVTExEUExYIHwgQk1DUl9TUEVFRDEwMCB8IEJNQ1JfQU5FTkFCTEUpOworCisJLyogRmlyc3QgcmVzZXQgdGhlIFBIWSAqLworCW1kaW9fd3JpdGUoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfQk1DUiwgY3RsIHwgQk1DUl9SRVNFVCk7CisKKwkvKiBTZWxlY3Qgc3BlZWQgJiBkdXBsZXggKi8KKwlzd2l0Y2ggKHNwZWVkKSB7CisJCWNhc2UgU1BFRURfMTA6CisJCQlicmVhazsKKwkJY2FzZSBTUEVFRF8xMDA6CisJCQljdGwgfD0gQk1DUl9TUEVFRDEwMDsKKwkJCWJyZWFrOworCQljYXNlIFNQRUVEXzEwMDA6CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGZkID09IERVUExFWF9GVUxMKQorCQljdGwgfD0gQk1DUl9GVUxMRFBMWDsKKwltZGlvX3dyaXRlKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX0JNQ1IsIGN0bCk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZAorYXUxMDAwX3N0YXJ0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopZGV2LT5wcml2OworCXUzMiBhZHZlcnRpc2U7CisJaW50IGF1dG9uZWc7CisJaW50IGZvcmNlZF9zcGVlZDsKKwlpbnQgZm9yY2VkX2R1cGxleDsKKworCS8qIERlZmF1bHQgYWR2ZXJ0aXNlICovCisJYWR2ZXJ0aXNlID0gR0VOTUlJX0RFRkFVTFRfQURWRVJUSVNFOworCWF1dG9uZWcgPSBhdXAtPndhbnRfYXV0b25lZzsKKwlmb3JjZWRfc3BlZWQgPSBTUEVFRF8xMDA7CisJZm9yY2VkX2R1cGxleCA9IERVUExFWF9GVUxMOworCisJLyogU2V0dXAgbGluayBwYXJhbWV0ZXJzICovCisJaWYgKGNtZCkgeworCQlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCQlhZHZlcnRpc2UgPSBjbWQtPmFkdmVydGlzaW5nOworCQkJYXV0b25lZyA9IDE7CisJCX0gZWxzZSB7CisJCQlhdXRvbmVnID0gMDsKKworCQkJZm9yY2VkX3NwZWVkID0gY21kLT5zcGVlZDsKKwkJCWZvcmNlZF9kdXBsZXggPSBjbWQtPmR1cGxleDsKKwkJfQorCX0KKworCS8qIENvbmZpZ3VyZSBQSFkgJiBzdGFydCBhbmVnICovCisJYXVwLT53YW50X2F1dG9uZWcgPSBhdXRvbmVnOworCWlmIChhdXRvbmVnKQorCQlhdTEwMDBfc2V0dXBfYW5lZyhkZXYsIGFkdmVydGlzZSk7CisJZWxzZQorCQlhdTEwMDBfc2V0dXBfZm9yY2VkKGRldiwgZm9yY2VkX3NwZWVkLCBmb3JjZWRfZHVwbGV4KTsKKwltb2RfdGltZXIoJmF1cC0+dGltZXIsIGppZmZpZXMgKyBIWik7Cit9CisKK3N0YXRpYyBpbnQgYXUxMDAwX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKilkZXYtPnByaXY7CisJdTE2IGxpbmssIHNwZWVkOworCisJY21kLT5zdXBwb3J0ZWQgPSBHRU5NSUlfREVGQVVMVF9GRUFUVVJFUzsKKwljbWQtPmFkdmVydGlzaW5nID0gR0VOTUlJX0RFRkFVTFRfQURWRVJUSVNFOworCWNtZC0+cG9ydCA9IFBPUlRfTUlJOworCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0VYVEVSTkFMOworCWNtZC0+cGh5X2FkZHJlc3MgPSBhdXAtPnBoeV9hZGRyOworCXNwaW5fbG9ja19pcnEoJmF1cC0+bG9jayk7CisJY21kLT5hdXRvbmVnID0gYXVwLT53YW50X2F1dG9uZWc7CisJYXVwLT5waHlfb3BzLT5waHlfc3RhdHVzKGRldiwgYXVwLT5waHlfYWRkciwgJmxpbmssICZzcGVlZCk7CisJaWYgKChzcGVlZCA9PSBJRl9QT1JUXzEwMEJBU0VUWCkgfHwgKHNwZWVkID09IElGX1BPUlRfMTAwQkFTRUZYKSkKKwkJY21kLT5zcGVlZCA9IFNQRUVEXzEwMDsKKwllbHNlIGlmIChzcGVlZCA9PSBJRl9QT1JUXzEwQkFTRVQpCisJCWNtZC0+c3BlZWQgPSBTUEVFRF8xMDsKKwlpZiAobGluayAmJiAoZGV2LT5pZl9wb3J0ID09IElGX1BPUlRfMTAwQkFTRUZYKSkKKwkJY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwllbHNlCisJCWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJc3Bpbl91bmxvY2tfaXJxKCZhdXAtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1MTAwMF9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJIHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwkgIHVuc2lnbmVkIGxvbmcgZmVhdHVyZXMgPSBHRU5NSUlfREVGQVVMVF9GRUFUVVJFUzsKKworCSBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCSByZXR1cm4gLUVQRVJNOworCisJIGlmIChjbWQtPmF1dG9uZWcgIT0gQVVUT05FR19FTkFCTEUgJiYgY21kLT5hdXRvbmVnICE9IEFVVE9ORUdfRElTQUJMRSkKKwkJIHJldHVybiAtRUlOVkFMOworCSBpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFICYmIGNtZC0+YWR2ZXJ0aXNpbmcgPT0gMCkKKwkJIHJldHVybiAtRUlOVkFMOworCSBpZiAoY21kLT5kdXBsZXggIT0gRFVQTEVYX0hBTEYgJiYgY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpCisJCSByZXR1cm4gLUVJTlZBTDsKKwkgaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUpCisJCSBzd2l0Y2ggKGNtZC0+c3BlZWQpIHsKKwkJIGNhc2UgU1BFRURfMTA6CisJCQkgaWYgKGNtZC0+ZHVwbGV4ID09IERVUExFWF9IQUxGICYmCisJCQkJIChmZWF0dXJlcyAmIFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYpID09IDApCisJCQkJIHJldHVybiAtRUlOVkFMOworCQkJIGlmIChjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCAmJgorCQkJCSAoZmVhdHVyZXMgJiBTVVBQT1JURURfMTBiYXNlVF9GdWxsKSA9PSAwKQorCQkJCSByZXR1cm4gLUVJTlZBTDsKKwkJCSBicmVhazsKKwkJIGNhc2UgU1BFRURfMTAwOgorCQkJIGlmIChjbWQtPmR1cGxleCA9PSBEVVBMRVhfSEFMRiAmJgorCQkJCSAoZmVhdHVyZXMgJiBTVVBQT1JURURfMTAwYmFzZVRfSGFsZikgPT0gMCkKKwkJCQkgcmV0dXJuIC1FSU5WQUw7CisJCQkgaWYgKGNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMICYmCisJCQkJIChmZWF0dXJlcyAmIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsKSA9PSAwKQorCQkJCSByZXR1cm4gLUVJTlZBTDsKKwkJCSBicmVhazsKKwkJIGRlZmF1bHQ6CisJCQkgcmV0dXJuIC1FSU5WQUw7CisJCSB9CisJIGVsc2UgaWYgKChmZWF0dXJlcyAmIFNVUFBPUlRFRF9BdXRvbmVnKSA9PSAwKQorCQkgcmV0dXJuIC1FSU5WQUw7CisKKwkgc3Bpbl9sb2NrX2lycSgmYXVwLT5sb2NrKTsKKwkgYXUxMDAwX3N0YXJ0X2xpbmsoZGV2LCBjbWQpOworCSBzcGluX3VubG9ja19pcnEoJmF1cC0+bG9jayk7CisJIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1MTAwMF9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopZGV2LT5wcml2OworCisJaWYgKCFhdXAtPndhbnRfYXV0b25lZykKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3Bpbl9sb2NrX2lycSgmYXVwLT5sb2NrKTsKKwlhdTEwMDBfc3RhcnRfbGluayhkZXYsIE5VTEwpOworCXNwaW5fdW5sb2NrX2lycSgmYXVwLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2F1MTAwMF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCWluZm8tPmZ3X3ZlcnNpb25bMF0gPSAnXDAnOworCXNwcmludGYoaW5mby0+YnVzX2luZm8sICIlcyAlZCIsIERSVl9OQU1FLCBhdXAtPm1hY19pZCk7CisJaW5mby0+cmVnZHVtcF9sZW4gPSAwOworfQorCitzdGF0aWMgdTMyIGF1MTAwMF9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBuZXRpZl9jYXJyaWVyX29rKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgYXUxMDAwX2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MgPSBhdTEwMDBfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgPSBhdTEwMDBfc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbyA9IGF1MTAwMF9nZXRfZHJ2aW5mbywKKwkubndheV9yZXNldCA9IGF1MTAwMF9ud2F5X3Jlc2V0LAorCS5nZXRfbGluayA9IGF1MTAwMF9nZXRfbGluaworfTsKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICoKK2F1MTAwMF9wcm9iZSh1MzIgaW9hZGRyLCBpbnQgaXJxLCBpbnQgcG9ydF9udW0pCit7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZCA9IDA7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCWRiX2Rlc3RfdCAqcERCLCAqcERCZnJlZTsKKwljaGFyICpwbWFjLCAqYXJncHRyOworCWNoYXIgZXRoYWRkcls2XTsKKwlpbnQgaSwgZXJyOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oQ1BIWVNBRERSKGlvYWRkciksIE1BQ19JT1NJWkUsICJBdTF4MDAgRU5FVCIpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICh2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKSAKKwkJcHJpbnRrKCIlcyB2ZXJzaW9uICVzICVzXG4iLCBEUlZfTkFNRSwgRFJWX1ZFUlNJT04sIERSVl9BVVRIT1IpOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSkpOworCWlmICghZGV2KSB7CisJCXByaW50ayAoS0VSTl9FUlIgImF1MTAwMCBldGg6IGFsbG9jX2V0aGVyZGV2IGZhaWxlZFxuIik7ICAKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKChlcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJBdTF4X2V0aCBDYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZSBlcnIgJWRcbiIsCisJCQkJZXJyKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcHJpbnRrKCIlczogQXUxeCBFdGhlcm5ldCBmb3VuZCBhdCAweCV4LCBpcnEgJWRcbiIsIAorCQkJZGV2LT5uYW1lLCBpb2FkZHIsIGlycSk7CisKKwlhdXAgPSBkZXYtPnByaXY7CisKKwkvKiBBbGxvY2F0ZSB0aGUgZGF0YSBidWZmZXJzICovCisJLyogU25vb3Bpbmcgd29ya3MgZmluZSB3aXRoIGV0aCBvbiBhbGwgYXUxeHh4ICovCisJYXVwLT52YWRkciA9ICh1MzIpZG1hX2FsbG9jX25vbmNvaGVyZW50KE5VTEwsCisJCQlNQVhfQlVGX1NJWkUgKiAoTlVNX1RYX0JVRkZTK05VTV9SWF9CVUZGUyksCisJCQkmYXVwLT5kbWFfYWRkciwKKwkJCTApOworCWlmICghYXVwLT52YWRkcikgeworCQlmcmVlX25ldGRldihkZXYpOworCQlyZWxlYXNlX21lbV9yZWdpb24oQ1BIWVNBRERSKGlvYWRkciksIE1BQ19JT1NJWkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBhdXAtPm1hYyBpcyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBNQUMncyByZWdpc3RlcnMgKi8KKwlhdXAtPm1hYyA9ICh2b2xhdGlsZSBtYWNfcmVnX3QgKikoKHVuc2lnbmVkIGxvbmcpaW9hZGRyKTsKKwkvKiBTZXR1cCBzb21lIHZhcmlhYmxlcyBmb3IgcXVpY2sgcmVnaXN0ZXIgYWRkcmVzcyBhY2Nlc3MgKi8KKwlpZiAoaW9hZGRyID09IGlmbGlzdFswXS5iYXNlX2FkZHIpCisJeworCQkvKiBjaGVjayBlbnYgdmFyaWFibGVzIGZpcnN0ICovCisJCWlmICghZ2V0X2V0aGVybmV0X2FkZHIoZXRoYWRkcikpIHsgCisJCQltZW1jcHkoYXUxMDAwX21hY19hZGRyLCBldGhhZGRyLCBzaXplb2YoYXUxMDAwX21hY19hZGRyKSk7CisJCX0gZWxzZSB7CisJCQkvKiBDaGVjayBjb21tYW5kIGxpbmUgKi8KKwkJCWFyZ3B0ciA9IHByb21fZ2V0Y21kbGluZSgpOworCQkJaWYgKChwbWFjID0gc3Ryc3RyKGFyZ3B0ciwgImV0aGFkZHI9IikpID09IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTm8gbWFjIGFkZHJlc3MgZm91bmRcbiIsIAorCQkJCQkJZGV2LT5uYW1lKTsKKwkJCQkvKiB1c2UgdGhlIGhhcmQgY29kZWQgbWFjIGFkZHJlc3NlcyAqLworCQkJfSBlbHNlIHsKKwkJCQlzdHIyZWFkZHIoZXRoYWRkciwgcG1hYyArIHN0cmxlbigiZXRoYWRkcj0iKSk7CisJCQkJbWVtY3B5KGF1MTAwMF9tYWNfYWRkciwgZXRoYWRkciwgCisJCQkJCQlzaXplb2YoYXUxMDAwX21hY19hZGRyKSk7CisJCQl9CisJCX0KKwkJCWF1cC0+ZW5hYmxlID0gKHZvbGF0aWxlIHUzMiAqKSAKKwkJCQkoKHVuc2lnbmVkIGxvbmcpaWZsaXN0WzBdLm1hY2VuX2FkZHIpOworCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgYXUxMDAwX21hY19hZGRyLCBzaXplb2YoYXUxMDAwX21hY19hZGRyKSk7CisJCXNldHVwX2h3X3JpbmdzKGF1cCwgTUFDMF9SWF9ETUFfQUREUiwgTUFDMF9UWF9ETUFfQUREUik7CisJCWF1cC0+bWFjX2lkID0gMDsKKwkJYXVfbWFjc1swXSA9IGF1cDsKKwl9CisJCWVsc2UKKwlpZiAoaW9hZGRyID09IGlmbGlzdFsxXS5iYXNlX2FkZHIpCisJeworCQkJYXVwLT5lbmFibGUgPSAodm9sYXRpbGUgdTMyICopIAorCQkJCSgodW5zaWduZWQgbG9uZylpZmxpc3RbMV0ubWFjZW5fYWRkcik7CisJCW1lbWNweShkZXYtPmRldl9hZGRyLCBhdTEwMDBfbWFjX2FkZHIsIHNpemVvZihhdTEwMDBfbWFjX2FkZHIpKTsKKwkJZGV2LT5kZXZfYWRkcls0XSArPSAweDEwOworCQlzZXR1cF9od19yaW5ncyhhdXAsIE1BQzFfUlhfRE1BX0FERFIsIE1BQzFfVFhfRE1BX0FERFIpOworCQlhdXAtPm1hY19pZCA9IDE7CisJCWF1X21hY3NbMV0gPSBhdXA7CisJfQorCWVsc2UKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGJhZCBpb2FkZHJcbiIsIGRldi0+bmFtZSk7CisJfQorCisJLyogYnJpbmcgdGhlIGRldmljZSBvdXQgb2YgcmVzZXQsIG90aGVyd2lzZSBwcm9iaW5nIHRoZSBtaWkKKwkgKiB3aWxsIGhhbmcgKi8KKwkqYXVwLT5lbmFibGUgPSBNQUNfRU5fQ0xPQ0tfRU5BQkxFOworCWF1X3N5bmNfZGVsYXkoMik7CisJKmF1cC0+ZW5hYmxlID0gTUFDX0VOX1JFU0VUMCB8IE1BQ19FTl9SRVNFVDEgfCAKKwkJTUFDX0VOX1JFU0VUMiB8IE1BQ19FTl9DTE9DS19FTkFCTEU7CisJYXVfc3luY19kZWxheSgyKTsKKworCWF1cC0+bWlpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1paV9waHkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWF1cC0+bWlpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG91dCBvZiBtZW1vcnlcbiIsIGRldi0+bmFtZSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJYXVwLT5taWktPm1paV9jb250cm9sX3JlZyA9IDA7CisJYXVwLT5taWktPm1paV9kYXRhX3JlZyA9IDA7CisKKwlpZiAobWlpX3Byb2JlKGRldikgIT0gMCkgeworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJcERCZnJlZSA9IE5VTEw7CisJLyogc2V0dXAgdGhlIGRhdGEgYnVmZmVyIGRlc2NyaXB0b3JzIGFuZCBhdHRhY2ggYSBidWZmZXIgdG8gZWFjaCBvbmUgKi8KKwlwREIgPSBhdXAtPmRiOworCWZvciAoaSA9IDA7IGkgPCAoTlVNX1RYX0JVRkZTK05VTV9SWF9CVUZGUyk7IGkrKykgeworCQlwREItPnBuZXh0ID0gcERCZnJlZTsKKwkJcERCZnJlZSA9IHBEQjsKKwkJcERCLT52YWRkciA9ICh1MzIgKikoKHVuc2lnbmVkKWF1cC0+dmFkZHIgKyBNQVhfQlVGX1NJWkUqaSk7CisJCXBEQi0+ZG1hX2FkZHIgPSAoZG1hX2FkZHJfdCl2aXJ0X3RvX2J1cyhwREItPnZhZGRyKTsKKwkJcERCKys7CisJfQorCWF1cC0+cERCZnJlZSA9IHBEQmZyZWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0RNQTsgaSsrKSB7CisJCXBEQiA9IEdldEZyZWVEQihhdXApOworCQlpZiAoIXBEQikgeworCQkJZ290byBlcnJfb3V0OworCQl9CisJCWF1cC0+cnhfZG1hX3JpbmdbaV0tPmJ1ZmZfc3RhdCA9ICh1bnNpZ25lZClwREItPmRtYV9hZGRyOworCQlhdXAtPnJ4X2RiX2ludXNlW2ldID0gcERCOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX0RNQTsgaSsrKSB7CisJCXBEQiA9IEdldEZyZWVEQihhdXApOworCQlpZiAoIXBEQikgeworCQkJZ290byBlcnJfb3V0OworCQl9CisJCWF1cC0+dHhfZG1hX3JpbmdbaV0tPmJ1ZmZfc3RhdCA9ICh1bnNpZ25lZClwREItPmRtYV9hZGRyOworCQlhdXAtPnR4X2RtYV9yaW5nW2ldLT5sZW4gPSAwOworCQlhdXAtPnR4X2RiX2ludXNlW2ldID0gcERCOworCX0KKworCXNwaW5fbG9ja19pbml0KCZhdXAtPmxvY2spOworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCWRldi0+aXJxID0gaXJxOworCWRldi0+b3BlbiA9IGF1MTAwMF9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gYXUxMDAwX3R4OworCWRldi0+c3RvcCA9IGF1MTAwMF9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9IGF1MTAwMF9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGU7CisJZGV2LT5kb19pb2N0bCA9ICZhdTEwMDBfaW9jdGw7CisJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmF1MTAwMF9ldGh0b29sX29wcyk7CisJZGV2LT5zZXRfY29uZmlnID0gJmF1MTAwMF9zZXRfY29uZmlnOworCWRldi0+dHhfdGltZW91dCA9IGF1MTAwMF90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBFVEhfVFhfVElNRU9VVDsKKworCS8qIAorCSAqIFRoZSBib290IGNvZGUgdXNlcyB0aGUgZXRoZXJuZXQgY29udHJvbGxlciwgc28gcmVzZXQgaXQgdG8gc3RhcnQgCisJICogZnJlc2guICBhdTEwMDBfaW5pdCgpIGV4cGVjdHMgdGhhdCB0aGUgZGV2aWNlIGlzIGluIHJlc2V0IHN0YXRlLgorCSAqLworCXJlc2V0X21hYyhkZXYpOworCisJcmV0dXJuIGRldjsKKworZXJyX291dDoKKwkvKiBoZXJlIHdlIHNob3VsZCBoYXZlIGEgdmFsaWQgZGV2IHBsdXMgYXVwLT4gcmVnaXN0ZXIgYWRkcmVzc2VzCisJICogc28gd2UgY2FuIHJlc2V0IHRoZSBtYWMgcHJvcGVybHkuKi8KKwlyZXNldF9tYWMoZGV2KTsKKwlpZiAoYXVwLT5taWkpCisJCWtmcmVlKGF1cC0+bWlpKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0RNQTsgaSsrKSB7CisJCWlmIChhdXAtPnJ4X2RiX2ludXNlW2ldKQorCQkJUmVsZWFzZURCKGF1cCwgYXVwLT5yeF9kYl9pbnVzZVtpXSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfRE1BOyBpKyspIHsKKwkJaWYgKGF1cC0+dHhfZGJfaW51c2VbaV0pCisJCQlSZWxlYXNlREIoYXVwLCBhdXAtPnR4X2RiX2ludXNlW2ldKTsKKwl9CisJZG1hX2ZyZWVfbm9uY29oZXJlbnQoTlVMTCwKKwkJCU1BWF9CVUZfU0laRSAqIChOVU1fVFhfQlVGRlMrTlVNX1JYX0JVRkZTKSwKKwkJCSh2b2lkICopYXVwLT52YWRkciwKKwkJCWF1cC0+ZG1hX2FkZHIpOworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZWxlYXNlX21lbV9yZWdpb24oQ1BIWVNBRERSKGlvYWRkciksIE1BQ19JT1NJWkUpOworCXJldHVybiBOVUxMOworfQorCisvKiAKKyAqIEluaXRpYWxpemUgdGhlIGludGVyZmFjZS4KKyAqCisgKiBXaGVuIHRoZSBkZXZpY2UgcG93ZXJzIHVwLCB0aGUgY2xvY2tzIGFyZSBkaXNhYmxlZCBhbmQgdGhlCisgKiBtYWMgaXMgaW4gcmVzZXQgc3RhdGUuICBXaGVuIHRoZSBpbnRlcmZhY2UgaXMgY2xvc2VkLCB3ZQorICogZG8gdGhlIHNhbWUgLS0gcmVzZXQgdGhlIGRldmljZSBhbmQgZGlzYWJsZSB0aGUgY2xvY2tzIHRvCisgKiBjb25zZXJ2ZSBwb3dlci4gVGh1cywgd2hlbmV2ZXIgYXUxMDAwX2luaXQoKSBpcyBjYWxsZWQsCisgKiB0aGUgZGV2aWNlIHNob3VsZCBhbHJlYWR5IGJlIGluIHJlc2V0IHN0YXRlLgorICovCitzdGF0aWMgaW50IGF1MTAwMF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopIGRldi0+cHJpdjsKKwl1MzIgZmxhZ3M7CisJaW50IGk7CisJdTMyIGNvbnRyb2w7CisJdTE2IGxpbmssIHNwZWVkOworCisJaWYgKGF1MTAwMF9kZWJ1ZyA+IDQpIAorCQlwcmludGsoIiVzOiBhdTEwMDBfaW5pdFxuIiwgZGV2LT5uYW1lKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhdXAtPmxvY2ssIGZsYWdzKTsKKworCS8qIGJyaW5nIHRoZSBkZXZpY2Ugb3V0IG9mIHJlc2V0ICovCisJKmF1cC0+ZW5hYmxlID0gTUFDX0VOX0NMT0NLX0VOQUJMRTsKKyAgICAgICAgYXVfc3luY19kZWxheSgyKTsKKwkqYXVwLT5lbmFibGUgPSBNQUNfRU5fUkVTRVQwIHwgTUFDX0VOX1JFU0VUMSB8IAorCQlNQUNfRU5fUkVTRVQyIHwgTUFDX0VOX0NMT0NLX0VOQUJMRTsKKwlhdV9zeW5jX2RlbGF5KDIwKTsKKworCWF1cC0+bWFjLT5jb250cm9sID0gMDsKKwlhdXAtPnR4X2hlYWQgPSAoYXVwLT50eF9kbWFfcmluZ1swXS0+YnVmZl9zdGF0ICYgMHhDKSA+PiAyOworCWF1cC0+dHhfdGFpbCA9IGF1cC0+dHhfaGVhZDsKKwlhdXAtPnJ4X2hlYWQgPSAoYXVwLT5yeF9kbWFfcmluZ1swXS0+YnVmZl9zdGF0ICYgMHhDKSA+PiAyOworCisJYXVwLT5tYWMtPm1hY19hZGRyX2hpZ2ggPSBkZXYtPmRldl9hZGRyWzVdPDw4IHwgZGV2LT5kZXZfYWRkcls0XTsKKwlhdXAtPm1hYy0+bWFjX2FkZHJfbG93ID0gZGV2LT5kZXZfYWRkclszXTw8MjQgfCBkZXYtPmRldl9hZGRyWzJdPDwxNiB8CisJCWRldi0+ZGV2X2FkZHJbMV08PDggfCBkZXYtPmRldl9hZGRyWzBdOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9ETUE7IGkrKykgeworCQlhdXAtPnJ4X2RtYV9yaW5nW2ldLT5idWZmX3N0YXQgfD0gUlhfRE1BX0VOQUJMRTsKKwl9CisJYXVfc3luYygpOworCisJYXVwLT5waHlfb3BzLT5waHlfc3RhdHVzKGRldiwgYXVwLT5waHlfYWRkciwgJmxpbmssICZzcGVlZCk7CisJY29udHJvbCA9IE1BQ19ESVNBQkxFX1JYX09XTiB8IE1BQ19SWF9FTkFCTEUgfCBNQUNfVFhfRU5BQkxFOworI2lmbmRlZiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4KKwljb250cm9sIHw9IE1BQ19CSUdfRU5ESUFOOworI2VuZGlmCisJaWYgKGxpbmsgJiYgKGRldi0+aWZfcG9ydCA9PSBJRl9QT1JUXzEwMEJBU0VGWCkpIHsKKwkJY29udHJvbCB8PSBNQUNfRlVMTF9EVVBMRVg7CisJfQorCisJLyogZml4IGZvciBzdGFydHVwIHdpdGhvdXQgY2FibGUgKi8KKwlpZiAoIWxpbmspIAorCQlkZXYtPmZsYWdzICY9IH5JRkZfUlVOTklORzsKKworCWF1cC0+bWFjLT5jb250cm9sID0gY29udHJvbDsKKwlhdXAtPm1hYy0+dmxhbjFfdGFnID0gMHg4MTAwOyAvKiBhY3RpdmF0ZSB2bGFuIHN1cHBvcnQgKi8KKwlhdV9zeW5jKCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdXAtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXUxMDAwX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGNoYXIgaWZfcG9ydDsKKwl1MTYgbGluaywgc3BlZWQ7CisKKwlpZiAoIWRldikgeworCQkvKiBmYXRhbCBlcnJvciwgZG9uJ3QgcmVzdGFydCB0aGUgdGltZXIgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJhdTEwMDBfdGltZXIgZXJyb3I6IE5VTEwgZGV2XG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmX3BvcnQgPSBkZXYtPmlmX3BvcnQ7CisJaWYgKGF1cC0+cGh5X29wcy0+cGh5X3N0YXR1cyhkZXYsIGF1cC0+cGh5X2FkZHIsICZsaW5rLCAmc3BlZWQpID09IDApIHsKKwkJaWYgKGxpbmspIHsKKwkJCWlmICghKGRldi0+ZmxhZ3MgJiBJRkZfUlVOTklORykpIHsKKwkJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCQkJZGV2LT5mbGFncyB8PSBJRkZfUlVOTklORzsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogbGluayB1cFxuIiwgZGV2LT5uYW1lKTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWlmIChkZXYtPmZsYWdzICYgSUZGX1JVTk5JTkcpIHsKKwkJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQkJCWRldi0+ZmxhZ3MgJj0gfklGRl9SVU5OSU5HOworCQkJCWRldi0+aWZfcG9ydCA9IDA7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgZG93blxuIiwgZGV2LT5uYW1lKTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChsaW5rICYmIChkZXYtPmlmX3BvcnQgIT0gaWZfcG9ydCkgJiYgCisJCQkoZGV2LT5pZl9wb3J0ICE9IElGX1BPUlRfVU5LTk9XTikpIHsKKwkJaGFyZF9zdG9wKGRldik7CisJCWlmIChkZXYtPmlmX3BvcnQgPT0gSUZfUE9SVF8xMDBCQVNFRlgpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBnb2luZyB0byBmdWxsIGR1cGxleFxuIiwgCisJCQkJCWRldi0+bmFtZSk7CisJCQlhdXAtPm1hYy0+Y29udHJvbCB8PSBNQUNfRlVMTF9EVVBMRVg7CisJCQlhdV9zeW5jX2RlbGF5KDEpOworCQl9CisJCWVsc2UgeworCQkJYXVwLT5tYWMtPmNvbnRyb2wgJj0gfk1BQ19GVUxMX0RVUExFWDsKKwkJCWF1X3N5bmNfZGVsYXkoMSk7CisJCX0KKwkJZW5hYmxlX3J4X3R4KGRldik7CisJfQorCisJYXVwLT50aW1lci5leHBpcmVzID0gUlVOX0FUKCgxKkhaKSk7IAorCWF1cC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlhdXAtPnRpbWVyLmZ1bmN0aW9uID0gJmF1MTAwMF90aW1lcjsgLyogdGltZXIgaGFuZGxlciAqLworCWFkZF90aW1lcigmYXVwLT50aW1lcik7CisKK30KKworc3RhdGljIGludCBhdTEwMDBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXR2YWw7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopIGRldi0+cHJpdjsKKworCWlmIChhdTEwMDBfZGVidWcgPiA0KQorCQlwcmludGsoIiVzOiBvcGVuOiBkZXY9JXBcbiIsIGRldi0+bmFtZSwgZGV2KTsKKworCWlmICgocmV0dmFsID0gYXUxMDAwX2luaXQoZGV2KSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgaW4gYXUxMDAwX2luaXRcbiIsIGRldi0+bmFtZSk7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJmF1MTAwMF9pbnRlcnJ1cHQsIDAsIAorCQkJCQlkZXYtPm5hbWUsIGRldikpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkXG4iLCAKKwkJCQlkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlpbml0X3RpbWVyKCZhdXAtPnRpbWVyKTsgLyogdXNlZCBpbiBpb2N0bCgpICovCisJYXVwLT50aW1lci5leHBpcmVzID0gUlVOX0FUKCgzKkhaKSk7IAorCWF1cC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlhdXAtPnRpbWVyLmZ1bmN0aW9uID0gJmF1MTAwMF90aW1lcjsgLyogdGltZXIgaGFuZGxlciAqLworCWFkZF90aW1lcigmYXVwLT50aW1lcik7CisKKwlpZiAoYXUxMDAwX2RlYnVnID4gNCkKKwkJcHJpbnRrKCIlczogb3BlbjogSW5pdGlhbGl6YXRpb24gZG9uZS5cbiIsIGRldi0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdTEwMDBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1MzIgZmxhZ3M7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopIGRldi0+cHJpdjsKKworCWlmIChhdTEwMDBfZGVidWcgPiA0KQorCQlwcmludGsoIiVzOiBjbG9zZTogZGV2PSVwXG4iLCBkZXYtPm5hbWUsIGRldik7CisKKwlyZXNldF9tYWMoZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhdXAtPmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBzdG9wIHRoZSBkZXZpY2UgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgKi8KKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdXAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXUxMDAwX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IGksIGo7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1faWZzOyBpKyspIHsKKwkJZGV2ID0gaWZsaXN0W2ldLmRldjsKKwkJaWYgKGRldikgeworCQkJYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQkJaWYgKGF1cC0+bWlpKQorCQkJCWtmcmVlKGF1cC0+bWlpKTsKKwkJCWZvciAoaiA9IDA7IGogPCBOVU1fUlhfRE1BOyBqKyspIHsKKwkJCQlpZiAoYXVwLT5yeF9kYl9pbnVzZVtqXSkKKwkJCQkJUmVsZWFzZURCKGF1cCwgYXVwLT5yeF9kYl9pbnVzZVtqXSk7CisJCQl9CisJCQlmb3IgKGogPSAwOyBqIDwgTlVNX1RYX0RNQTsgaisrKSB7CisJCQkJaWYgKGF1cC0+dHhfZGJfaW51c2Vbal0pCisJCQkJCVJlbGVhc2VEQihhdXAsIGF1cC0+dHhfZGJfaW51c2Vbal0pOworCQkJfQorCQkJZG1hX2ZyZWVfbm9uY29oZXJlbnQoTlVMTCwKKwkJCQkJTUFYX0JVRl9TSVpFICogKE5VTV9UWF9CVUZGUytOVU1fUlhfQlVGRlMpLAorCQkJCQkodm9pZCAqKWF1cC0+dmFkZHIsCisJCQkJCWF1cC0+ZG1hX2FkZHIpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbihDUEhZU0FERFIoaWZsaXN0W2ldLmJhc2VfYWRkciksIE1BQ19JT1NJWkUpOworCQl9CisJfQorfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAKK3VwZGF0ZV90eF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RhdHVzLCB1MzIgcGt0X2xlbikKK3sKKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwcyA9ICZhdXAtPnN0YXRzOworCisJcHMtPnR4X3BhY2tldHMrKzsKKwlwcy0+dHhfYnl0ZXMgKz0gcGt0X2xlbjsKKworCWlmIChzdGF0dXMgJiBUWF9GUkFNRV9BQk9SVEVEKSB7CisJCWlmIChkZXYtPmlmX3BvcnQgPT0gSUZfUE9SVF8xMDBCQVNFRlgpIHsKKwkJCWlmIChzdGF0dXMgJiAoVFhfSkFCX1RJTUVPVVQgfCBUWF9VTkRFUlJVTikpIHsKKwkJCQkvKiBhbnkgb3RoZXIgdHggZXJyb3JzIGFyZSBvbmx5IHZhbGlkCisJCQkJICogaW4gaGFsZiBkdXBsZXggbW9kZSAqLworCQkJCXBzLT50eF9lcnJvcnMrKzsKKwkJCQlwcy0+dHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCXBzLT50eF9lcnJvcnMrKzsKKwkJCXBzLT50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIChUWF9OT19DQVJSSUVSIHwgVFhfTE9TU19DQVJSSUVSKSkKKwkJCQlwcy0+dHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJfQorCX0KK30KKworCisvKgorICogQ2FsbGVkIGZyb20gdGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgdG8gYWNrbm93bGVkZ2UKKyAqIHRoZSBUWCBET05FIGJpdHMuICBUaGlzIGlzIGEgbXVzdCBpZiB0aGUgaXJxIGlzIHNldHVwIGFzCisgKiBlZGdlIHRyaWdnZXJlZC4KKyAqLworc3RhdGljIHZvaWQgYXUxMDAwX3R4X2FjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdm9sYXRpbGUgdHhfZG1hX3QgKnB0eGQ7CisKKwlwdHhkID0gYXVwLT50eF9kbWFfcmluZ1thdXAtPnR4X3RhaWxdOworCisJd2hpbGUgKHB0eGQtPmJ1ZmZfc3RhdCAmIFRYX1RfRE9ORSkgeworCQl1cGRhdGVfdHhfc3RhdHMoZGV2LCBwdHhkLT5zdGF0dXMsIHB0eGQtPmxlbiAmIDB4M2ZmKTsKKwkJcHR4ZC0+YnVmZl9zdGF0ICY9IH5UWF9UX0RPTkU7CisJCXB0eGQtPmxlbiA9IDA7CisJCWF1X3N5bmMoKTsKKworCQlhdXAtPnR4X3RhaWwgPSAoYXVwLT50eF90YWlsICsgMSkgJiAoTlVNX1RYX0RNQSAtIDEpOworCQlwdHhkID0gYXVwLT50eF9kbWFfcmluZ1thdXAtPnR4X3RhaWxdOworCisJCWlmIChhdXAtPnR4X2Z1bGwpIHsKKwkJCWF1cC0+dHhfZnVsbCA9IDA7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0KKwl9Cit9CisKKworLyoKKyAqIEF1MTAwMCB0cmFuc21pdCByb3V0aW5lLgorICovCitzdGF0aWMgaW50IGF1MTAwMF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdm9sYXRpbGUgdHhfZG1hX3QgKnB0eGQ7CisJdTMyIGJ1ZmZfc3RhdDsKKwlkYl9kZXN0X3QgKnBEQjsKKwlpbnQgaTsKKworCWlmIChhdTEwMDBfZGVidWcgPiA1KQorCQlwcmludGsoIiVzOiB0eDogYXVwICV4IGxlbj0lZCwgZGF0YT0lcCwgaGVhZCAlZFxuIiwgCisJCQkJZGV2LT5uYW1lLCAodW5zaWduZWQpYXVwLCBza2ItPmxlbiwgCisJCQkJc2tiLT5kYXRhLCBhdXAtPnR4X2hlYWQpOworCisJcHR4ZCA9IGF1cC0+dHhfZG1hX3JpbmdbYXVwLT50eF9oZWFkXTsKKwlidWZmX3N0YXQgPSBwdHhkLT5idWZmX3N0YXQ7CisJaWYgKGJ1ZmZfc3RhdCAmIFRYX0RNQV9FTkFCTEUpIHsKKwkJLyogV2UndmUgd3JhcHBlZCBhcm91bmQgYW5kIHRoZSB0cmFuc21pdHRlciBpcyBzdGlsbCBidXN5ICovCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJYXVwLT50eF9mdWxsID0gMTsKKwkJcmV0dXJuIDE7CisJfQorCWVsc2UgaWYgKGJ1ZmZfc3RhdCAmIFRYX1RfRE9ORSkgeworCQl1cGRhdGVfdHhfc3RhdHMoZGV2LCBwdHhkLT5zdGF0dXMsIHB0eGQtPmxlbiAmIDB4M2ZmKTsKKwkJcHR4ZC0+bGVuID0gMDsKKwl9CisKKwlpZiAoYXVwLT50eF9mdWxsKSB7CisJCWF1cC0+dHhfZnVsbCA9IDA7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisKKwlwREIgPSBhdXAtPnR4X2RiX2ludXNlW2F1cC0+dHhfaGVhZF07CisJbWVtY3B5KCh2b2lkICopcERCLT52YWRkciwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJaWYgKHNrYi0+bGVuIDwgRVRIX1pMRU4pIHsKKwkJZm9yIChpPXNrYi0+bGVuOyBpPEVUSF9aTEVOOyBpKyspIHsgCisJCQkoKGNoYXIgKilwREItPnZhZGRyKVtpXSA9IDA7CisJCX0KKwkJcHR4ZC0+bGVuID0gRVRIX1pMRU47CisJfQorCWVsc2UKKwkJcHR4ZC0+bGVuID0gc2tiLT5sZW47CisKKwlwdHhkLT5idWZmX3N0YXQgPSBwREItPmRtYV9hZGRyIHwgVFhfRE1BX0VOQUJMRTsKKwlhdV9zeW5jKCk7CisJZGV2X2tmcmVlX3NrYihza2IpOworCWF1cC0+dHhfaGVhZCA9IChhdXAtPnR4X2hlYWQgKyAxKSAmIChOVU1fVFhfRE1BIC0gMSk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9yeF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RhdHVzKQoreworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnBzID0gJmF1cC0+c3RhdHM7CisKKwlwcy0+cnhfcGFja2V0cysrOworCWlmIChzdGF0dXMgJiBSWF9NQ0FTVF9GUkFNRSkKKwkJcHMtPm11bHRpY2FzdCsrOworCisJaWYgKHN0YXR1cyAmIFJYX0VSUk9SKSB7CisJCXBzLT5yeF9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIFJYX01JU1NFRF9GUkFNRSkKKwkJCXBzLT5yeF9taXNzZWRfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiAoUlhfT1ZFUkxFTiB8IFJYX09WRVJMRU4gfCBSWF9MRU5fRVJST1IpKQorCQkJcHMtPnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIFJYX0NSQ19FUlJPUikKKwkJCXBzLT5yeF9jcmNfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBSWF9DT0xMKQorCQkJcHMtPmNvbGxpc2lvbnMrKzsKKwl9CisJZWxzZSAKKwkJcHMtPnJ4X2J5dGVzICs9IHN0YXR1cyAmIFJYX0ZSQU1FX0xFTl9NQVNLOworCit9CisKKy8qCisgKiBBdTEwMDAgcmVjZWl2ZSByb3V0aW5lLgorICovCitzdGF0aWMgaW50IGF1MTAwMF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl2b2xhdGlsZSByeF9kbWFfdCAqcHJ4ZDsKKwl1MzIgYnVmZl9zdGF0LCBzdGF0dXM7CisJZGJfZGVzdF90ICpwREI7CisJdTMyCWZybWxlbjsKKworCWlmIChhdTEwMDBfZGVidWcgPiA1KQorCQlwcmludGsoIiVzOiBhdTEwMDBfcnggaGVhZCAlZFxuIiwgZGV2LT5uYW1lLCBhdXAtPnJ4X2hlYWQpOworCisJcHJ4ZCA9IGF1cC0+cnhfZG1hX3JpbmdbYXVwLT5yeF9oZWFkXTsKKwlidWZmX3N0YXQgPSBwcnhkLT5idWZmX3N0YXQ7CisJd2hpbGUgKGJ1ZmZfc3RhdCAmIFJYX1RfRE9ORSkgIHsKKwkJc3RhdHVzID0gcHJ4ZC0+c3RhdHVzOworCQlwREIgPSBhdXAtPnJ4X2RiX2ludXNlW2F1cC0+cnhfaGVhZF07CisJCXVwZGF0ZV9yeF9zdGF0cyhkZXYsIHN0YXR1cyk7CisJCWlmICghKHN0YXR1cyAmIFJYX0VSUk9SKSkgIHsKKworCQkJLyogZ29vZCBmcmFtZSAqLworCQkJZnJtbGVuID0gKHN0YXR1cyAmIFJYX0ZSQU1FX0xFTl9NQVNLKTsKKwkJCWZybWxlbiAtPSA0OyAvKiBSZW1vdmUgRkNTICovCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGZybWxlbiArIDIpOworCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJYXVwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlza2ItPmRldiA9IGRldjsKKwkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgSVAgaGVhZGVyIGFsaWduICovCisJCQlldGhfY29weV9hbmRfc3VtKHNrYiwKKwkJCQkodW5zaWduZWQgY2hhciAqKXBEQi0+dmFkZHIsIGZybWxlbiwgMCk7CisJCQlza2JfcHV0KHNrYiwgZnJtbGVuKTsKKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQluZXRpZl9yeChza2IpOwkvKiBwYXNzIHRoZSBwYWNrZXQgdG8gdXBwZXIgbGF5ZXJzICovCisJCX0KKwkJZWxzZSB7CisJCQlpZiAoYXUxMDAwX2RlYnVnID4gNCkgeworCQkJCWlmIChzdGF0dXMgJiBSWF9NSVNTRURfRlJBTUUpIAorCQkJCQlwcmludGsoInJ4IG1pc3NcbiIpOworCQkJCWlmIChzdGF0dXMgJiBSWF9XRE9HX1RJTUVSKSAKKwkJCQkJcHJpbnRrKCJyeCB3ZG9nXG4iKTsKKwkJCQlpZiAoc3RhdHVzICYgUlhfUlVOVCkgCisJCQkJCXByaW50aygicnggcnVudFxuIik7CisJCQkJaWYgKHN0YXR1cyAmIFJYX09WRVJMRU4pIAorCQkJCQlwcmludGsoInJ4IG92ZXJsZW5cbiIpOworCQkJCWlmIChzdGF0dXMgJiBSWF9DT0xMKQorCQkJCQlwcmludGsoInJ4IGNvbGxcbiIpOworCQkJCWlmIChzdGF0dXMgJiBSWF9NSUlfRVJST1IpCisJCQkJCXByaW50aygicnggbWlpIGVycm9yXG4iKTsKKwkJCQlpZiAoc3RhdHVzICYgUlhfQ1JDX0VSUk9SKQorCQkJCQlwcmludGsoInJ4IGNyYyBlcnJvclxuIik7CisJCQkJaWYgKHN0YXR1cyAmIFJYX0xFTl9FUlJPUikKKwkJCQkJcHJpbnRrKCJyeCBsZW4gZXJyb3JcbiIpOworCQkJCWlmIChzdGF0dXMgJiBSWF9VX0NOVFJMX0ZSQU1FKQorCQkJCQlwcmludGsoInJ4IHUgY29udHJvbCBmcmFtZVxuIik7CisJCQkJaWYgKHN0YXR1cyAmIFJYX01JU1NFRF9GUkFNRSkKKwkJCQkJcHJpbnRrKCJyeCBtaXNzXG4iKTsKKwkJCX0KKwkJfQorCQlwcnhkLT5idWZmX3N0YXQgPSAodTMyKShwREItPmRtYV9hZGRyIHwgUlhfRE1BX0VOQUJMRSk7CisJCWF1cC0+cnhfaGVhZCA9IChhdXAtPnJ4X2hlYWQgKyAxKSAmIChOVU1fUlhfRE1BIC0gMSk7CisJCWF1X3N5bmMoKTsKKworCQkvKiBuZXh0IGRlc2NyaXB0b3IgKi8KKwkJcHJ4ZCA9IGF1cC0+cnhfZG1hX3JpbmdbYXVwLT5yeF9oZWFkXTsKKwkJYnVmZl9zdGF0ID0gcHJ4ZC0+YnVmZl9zdGF0OworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKgorICogQXUxMDAwIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBhdTEwMDBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaXNyOiBudWxsIGRldiBwdHJcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiBJUlFfUkVUVkFMKDEpOworCX0KKworCS8qIEhhbmRsZSBSWCBpbnRlcnJ1cHRzIGZpcnN0IHRvIG1pbmltaXplIGNoYW5jZSBvZiBvdmVycnVuICovCisKKwlhdTEwMDBfcngoZGV2KTsKKwlhdTEwMDBfdHhfYWNrKGRldik7CisJcmV0dXJuIElSUV9SRVRWQUwoMSk7Cit9CisKKworLyoKKyAqIFRoZSBUeCByaW5nIGhhcyBiZWVuIGZ1bGwgbG9uZ2VyIHRoYW4gdGhlIHdhdGNoZG9nIHRpbWVvdXQKKyAqIHZhbHVlLiBUaGUgdHJhbnNtaXR0ZXIgbXVzdCBiZSBodW5nPworICovCitzdGF0aWMgdm9pZCBhdTEwMDBfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXByaW50ayhLRVJOX0VSUiAiJXM6IGF1MTAwMF90eF90aW1lb3V0OiBkZXY9JXBcbiIsIGRldi0+bmFtZSwgZGV2KTsKKwlyZXNldF9tYWMoZGV2KTsKKwlhdTEwMDBfaW5pdChkZXYpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgY29uc3QgZXRoZXJuZXRfcG9seW5vbWlhbCA9IDB4MDRjMTFkYjdVOworc3RhdGljIGlubGluZSB1MzIgZXRoZXJfY3JjKGludCBsZW5ndGgsIHVuc2lnbmVkIGNoYXIgKmRhdGEpCit7CisgICAgaW50IGNyYyA9IC0xOworCisgICAgd2hpbGUoLS1sZW5ndGggPj0gMCkgeworCQl1bnNpZ25lZCBjaGFyIGN1cnJlbnRfb2N0ZXQgPSAqZGF0YSsrOworCQlpbnQgYml0OworCQlmb3IgKGJpdCA9IDA7IGJpdCA8IDg7IGJpdCsrLCBjdXJyZW50X29jdGV0ID4+PSAxKQorCQkJY3JjID0gKGNyYyA8PCAxKSBeCisJCQkJKChjcmMgPCAwKSBeIChjdXJyZW50X29jdGV0ICYgMSkgPyAKKwkJCQkgZXRoZXJuZXRfcG9seW5vbWlhbCA6IDApOworICAgIH0KKyAgICByZXR1cm4gY3JjOworfQorCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqYXVwID0gKHN0cnVjdCBhdTEwMDBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisKKwlpZiAoYXUxMDAwX2RlYnVnID4gNCkgCisJCXByaW50aygiJXM6IHNldF9yeF9tb2RlOiBmbGFncz0leFxuIiwgZGV2LT5uYW1lLCBkZXYtPmZsYWdzKTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsJCQkvKiBTZXQgcHJvbWlzY3VvdXMuICovCisJCWF1cC0+bWFjLT5jb250cm9sIHw9IE1BQ19QUk9NSVNDVU9VUzsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CisJfSBlbHNlIGlmICgoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgIHx8CisJCQkgICBkZXYtPm1jX2NvdW50ID4gTVVMVElDQVNUX0ZJTFRFUl9MSU1JVCkgeworCQlhdXAtPm1hYy0+Y29udHJvbCB8PSBNQUNfUEFTU19BTExfTVVMVEk7CisJCWF1cC0+bWFjLT5jb250cm9sICY9IH5NQUNfUFJPTUlTQ1VPVVM7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQYXNzIGFsbCBtdWx0aWNhc3RcbiIsIGRldi0+bmFtZSk7CisJfSBlbHNlIHsKKwkJaW50IGk7CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCQl1MzIgbWNfZmlsdGVyWzJdOwkvKiBNdWx0aWNhc3QgaGFzaCBmaWx0ZXIgKi8KKworCQltY19maWx0ZXJbMV0gPSBtY19maWx0ZXJbMF0gPSAwOworCQlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IG1jbGlzdCAmJiBpIDwgZGV2LT5tY19jb3VudDsKKwkJCSBpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQkJc2V0X2JpdChldGhlcl9jcmMoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpPj4yNiwgCisJCQkJCShsb25nICopbWNfZmlsdGVyKTsKKwkJfQorCQlhdXAtPm1hYy0+bXVsdGlfaGFzaF9oaWdoID0gbWNfZmlsdGVyWzFdOworCQlhdXAtPm1hYy0+bXVsdGlfaGFzaF9sb3cgPSBtY19maWx0ZXJbMF07CisJCWF1cC0+bWFjLT5jb250cm9sICY9IH5NQUNfUFJPTUlTQ1VPVVM7CisJCWF1cC0+bWFjLT5jb250cm9sIHw9IE1BQ19IQVNIX01PREU7CisJfQorfQorCisKK3N0YXRpYyBpbnQgYXUxMDAwX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopZGV2LT5wcml2OworCXUxNiAqZGF0YSA9ICh1MTYgKikmcnEtPmlmcl9pZnJ1OworCisJc3dpdGNoKGNtZCkgeyAKKwkJY2FzZSBTSU9DREVWUFJJVkFURToJLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBQSFkgaW4gdXNlLiAqLworCQljYXNlIFNJT0NHTUlJUEhZOgorCQkgICAgICAgIGlmICghbmV0aWZfcnVubmluZyhkZXYpKSByZXR1cm4gLUVJTlZBTDsKKwkJCWRhdGFbMF0gPSBhdXAtPnBoeV9hZGRyOworCQljYXNlIFNJT0NERVZQUklWQVRFKzE6CS8qIFJlYWQgdGhlIHNwZWNpZmllZCBNSUkgcmVnaXN0ZXIuICovCisJCWNhc2UgU0lPQ0dNSUlSRUc6CisJCQlkYXRhWzNdID0gIG1kaW9fcmVhZChkZXYsIGRhdGFbMF0sIGRhdGFbMV0pOyAKKwkJCXJldHVybiAwOworCQljYXNlIFNJT0NERVZQUklWQVRFKzI6CS8qIFdyaXRlIHRoZSBzcGVjaWZpZWQgTUlJIHJlZ2lzdGVyICovCisJCWNhc2UgU0lPQ1NNSUlSRUc6IAorCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJCXJldHVybiAtRVBFUk07CisJCQltZGlvX3dyaXRlKGRldiwgZGF0YVswXSwgZGF0YVsxXSxkYXRhWzJdKTsKKwkJCXJldHVybiAwOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworfQorCisKK3N0YXRpYyBpbnQgYXUxMDAwX3NldF9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApCit7CisJc3RydWN0IGF1MTAwMF9wcml2YXRlICphdXAgPSAoc3RydWN0IGF1MTAwMF9wcml2YXRlICopIGRldi0+cHJpdjsKKwl1MTYgY29udHJvbDsKKworCWlmIChhdTEwMDBfZGVidWcgPiA0KSAgeworCQlwcmludGsoIiVzOiBzZXRfY29uZmlnIGNhbGxlZDogZGV2LT5pZl9wb3J0ICVkIG1hcC0+cG9ydCAleFxuIiwgCisJCQkJZGV2LT5uYW1lLCBkZXYtPmlmX3BvcnQsIG1hcC0+cG9ydCk7CisJfQorCisJc3dpdGNoKG1hcC0+cG9ydCl7CisJCWNhc2UgSUZfUE9SVF9VTktOT1dOOiAvKiB1c2UgYXV0byBoZXJlICovICAgCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogY29uZmlnIHBoeSBmb3IgYW5lZ1xuIiwgCisJCQkJCWRldi0+bmFtZSk7CisJCQlkZXYtPmlmX3BvcnQgPSBtYXAtPnBvcnQ7CisJCQkvKiBMaW5rIERvd246IHRoZSB0aW1lciB3aWxsIGJyaW5nIGl0IHVwICovCisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQorCQkJLyogcmVhZCBjdXJyZW50IGNvbnRyb2wgKi8KKwkJCWNvbnRyb2wgPSBtZGlvX3JlYWQoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfQ09OVFJPTCk7CisJCQljb250cm9sICY9IH4oTUlJX0NOVExfRkRYIHwgTUlJX0NOVExfRjEwMCk7CisKKwkJCS8qIGVuYWJsZSBhdXRvIG5lZ290aWF0aW9uIGFuZCByZXNldCB0aGUgbmVnb3RpYXRpb24gKi8KKwkJCW1kaW9fd3JpdGUoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfQ09OVFJPTCwgCisJCQkJCWNvbnRyb2wgfCBNSUlfQ05UTF9BVVRPIHwgCisJCQkJCU1JSV9DTlRMX1JTVF9BVVRPKTsKKworCQkJYnJlYWs7CisgICAgCisJCWNhc2UgSUZfUE9SVF8xMEJBU0VUOiAvKiAxMEJhc2VUICovICAgICAgICAgCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogY29uZmlnIHBoeSBmb3IgMTBCYXNlVFxuIiwgCisJCQkJCWRldi0+bmFtZSk7CisJCQlkZXYtPmlmX3BvcnQgPSBtYXAtPnBvcnQ7CisJCisJCQkvKiBMaW5rIERvd246IHRoZSB0aW1lciB3aWxsIGJyaW5nIGl0IHVwICovCisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJCQkvKiBzZXQgU3BlZWQgdG8gMTBNYnBzLCBIYWxmIER1cGxleCAqLworCQkJY29udHJvbCA9IG1kaW9fcmVhZChkZXYsIGF1cC0+cGh5X2FkZHIsIE1JSV9DT05UUk9MKTsKKwkJCWNvbnRyb2wgJj0gfihNSUlfQ05UTF9GMTAwIHwgTUlJX0NOVExfQVVUTyB8IAorCQkJCQlNSUlfQ05UTF9GRFgpOworCQorCQkJLyogZGlzYWJsZSBhdXRvIG5lZ290aWF0aW9uIGFuZCBmb3JjZSAxME0vSEQgbW9kZSovCisJCQltZGlvX3dyaXRlKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX0NPTlRST0wsIGNvbnRyb2wpOworCQkJYnJlYWs7CisgICAgCisJCWNhc2UgSUZfUE9SVF8xMDBCQVNFVDogLyogMTAwQmFzZVQgKi8KKwkJY2FzZSBJRl9QT1JUXzEwMEJBU0VUWDogLyogMTAwQmFzZVR4ICovIAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbmZpZyBwaHkgZm9yIDEwMEJhc2VUWFxuIiwgCisJCQkJCWRldi0+bmFtZSk7CisJCQlkZXYtPmlmX3BvcnQgPSBtYXAtPnBvcnQ7CisJCisJCQkvKiBMaW5rIERvd246IHRoZSB0aW1lciB3aWxsIGJyaW5nIGl0IHVwICovCisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQorCQkJLyogc2V0IFNwZWVkIHRvIDEwME1icHMsIEhhbGYgRHVwbGV4ICovCisJCQkvKiBkaXNhYmxlIGF1dG8gbmVnb3RpYXRpb24gYW5kIGVuYWJsZSAxMDBNQml0IE1vZGUgKi8KKwkJCWNvbnRyb2wgPSBtZGlvX3JlYWQoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfQ09OVFJPTCk7CisJCQljb250cm9sICY9IH4oTUlJX0NOVExfQVVUTyB8IE1JSV9DTlRMX0ZEWCk7CisJCQljb250cm9sIHw9IE1JSV9DTlRMX0YxMDA7CisJCQltZGlvX3dyaXRlKGRldiwgYXVwLT5waHlfYWRkciwgTUlJX0NPTlRST0wsIGNvbnRyb2wpOworCQkJYnJlYWs7CisgICAgCisJCWNhc2UgSUZfUE9SVF8xMDBCQVNFRlg6IC8qIDEwMEJhc2VGeCAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbmZpZyBwaHkgZm9yIDEwMEJhc2VGWFxuIiwgCisJCQkJCWRldi0+bmFtZSk7CisJCQlkZXYtPmlmX3BvcnQgPSBtYXAtPnBvcnQ7CisJCisJCQkvKiBMaW5rIERvd246IHRoZSB0aW1lciB3aWxsIGJyaW5nIGl0IHVwICovCisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQorCQkJLyogc2V0IFNwZWVkIHRvIDEwME1icHMsIEZ1bGwgRHVwbGV4ICovCisJCQkvKiBkaXNhYmxlIGF1dG8gbmVnb3RpYXRpb24gYW5kIGVuYWJsZSAxMDBNQml0IE1vZGUgKi8KKwkJCWNvbnRyb2wgPSBtZGlvX3JlYWQoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfQ09OVFJPTCk7CisJCQljb250cm9sICY9IH5NSUlfQ05UTF9BVVRPOworCQkJY29udHJvbCB8PSAgTUlJX0NOVExfRjEwMCB8IE1JSV9DTlRMX0ZEWDsKKwkJCW1kaW9fd3JpdGUoZGV2LCBhdXAtPnBoeV9hZGRyLCBNSUlfQ09OVFJPTCwgY29udHJvbCk7CisJCQlicmVhazsKKwkJY2FzZSBJRl9QT1JUXzEwQkFTRTI6IC8qIDEwQmFzZTIgKi8KKwkJY2FzZSBJRl9QT1JUX0FVSTogLyogQVVJICovCisJCS8qIFRoZXNlIE1vZGVzIGFyZSBub3Qgc3VwcG9ydGVkIChhcmUgdGhleT8pKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IDEwQmFzZTIvQVVJIG5vdCBzdXBwb3J0ZWQiLCAKKwkJCQkJZGV2LT5uYW1lKTsKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworICAgIAorCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBtZWRpYSBzZWxlY3RlZCIsIAorCQkJCQlkZXYtPm5hbWUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmF1MTAwMF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKmF1cCA9IChzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgKikgZGV2LT5wcml2OworCisJaWYgKGF1MTAwMF9kZWJ1ZyA+IDQpCisJCXByaW50aygiJXM6IGF1MTAwMF9nZXRfc3RhdHM6IGRldj0lcFxuIiwgZGV2LT5uYW1lLCBkZXYpOworCisJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpIHsKKwkJcmV0dXJuICZhdXAtPnN0YXRzOworCX0KKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQoYXUxMDAwX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGF1MTAwMF9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdTEwMDBfZXRoLmggYi9kcml2ZXJzL25ldC9hdTEwMDBfZXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y5MzI2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2F1MTAwMF9ldGguaApAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqCisgKiBBbGNoZW15IEF1MXgwMCBldGhlcm5ldCBkcml2ZXIgaW5jbHVkZSBmaWxlCisgKgorICogQXV0aG9yOiBQZXRlIFBvcG92IDxwcG9wb3ZAbXZpc3RhLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoVmVyc2lvbiAyKSBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqCisgKiAKKyAqLworCisKKyNkZWZpbmUgTUFDX0lPU0laRSAweDEwMDAwCisjZGVmaW5lIE5VTV9SWF9ETUEgNCAgICAgICAvKiBBdTF4MDAgaGFzIDQgcnggaGFyZHdhcmUgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgTlVNX1RYX0RNQSA0ICAgICAgIC8qIEF1MXgwMCBoYXMgNCB0eCBoYXJkd2FyZSBkZXNjcmlwdG9ycyAqLworCisjZGVmaW5lIE5VTV9SWF9CVUZGUyA0CisjZGVmaW5lIE5VTV9UWF9CVUZGUyA0CisjZGVmaW5lIE1BWF9CVUZfU0laRSAyMDQ4CisKKyNkZWZpbmUgRVRIX1RYX1RJTUVPVVQgSFovNAorI2RlZmluZSBNQUNfTUlOX1BLVF9TSVpFIDY0CisKKyNkZWZpbmUgTVVMVElDQVNUX0ZJTFRFUl9MSU1JVCA2NAorCisvKiBGSVhNRSAKKyAqIFRoZSBQSFkgZGVmaW5lcyBzaG91bGQgYmUgaW4gYSBzZXBhcmF0ZSBmaWxlLgorICovCisKKy8qIE1JSSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lCU1JSV9DT05UUk9MIDB4MDAwMAorI2RlZmluZSBNSUlfU1RBVFVTICAweDAwMDEKKyNkZWZpbmUgTUlJX1BIWV9JRDAgMHgwMDAyCisjZGVmaW5lCU1JSV9QSFlfSUQxIDB4MDAwMworI2RlZmluZSBNSUlfQU5BRFYgICAweDAwMDQKKyNkZWZpbmUgTUlJX0FOTFBBUiAgMHgwMDA1CisjZGVmaW5lIE1JSV9BRVhQICAgIDB4MDAwNgorI2RlZmluZSBNSUlfQU5FWFQgICAweDAwMDcKKyNkZWZpbmUgTUlJX0xTSV9QSFlfQ09ORklHIDB4MDAxMQorLyogU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9MU0lfUEhZX1NUQVQgICAweDAwMTIKKyNkZWZpbmUgTUlJX0FNRF9QSFlfU1RBVCAgIE1JSV9MU0lfUEhZX1NUQVQKKyNkZWZpbmUgTUlJX0lOVEVMX1BIWV9TVEFUIDB4MDAxMQorCisjZGVmaW5lIE1JSV9BVVhfQ05UUkwgIDB4MDAxOAorLyogbWlpIHJlZ2lzdGVycyBzcGVjaWZpYyB0byBBTUQgNzlDOTAxICovCisjZGVmaW5lCU1JSV9TVEFUVVNfU1VNTUFSWSA9IDB4MDAxOAorCisvKiBNSUkgQ29udHJvbCByZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMuICovCisjZGVmaW5lCU1JSV9DTlRMX0ZEWCAgICAgIDB4MDEwMAorI2RlZmluZSBNSUlfQ05UTF9SU1RfQVVUTyAweDAyMDAKKyNkZWZpbmUJTUlJX0NOVExfSVNPTEFURSAgMHgwNDAwCisjZGVmaW5lIE1JSV9DTlRMX1BXUkRXTiAgIDB4MDgwMAorI2RlZmluZQlNSUlfQ05UTF9BVVRPICAgICAweDEwMDAKKyNkZWZpbmUgTUlJX0NOVExfRjEwMCAgICAgMHgyMDAwCisjZGVmaW5lCU1JSV9DTlRMX0xQQksgICAgIDB4NDAwMAorI2RlZmluZSBNSUlfQ05UTF9SRVNFVCAgICAweDgwMDAKKworLyogTUlJIFN0YXR1cyByZWdpc3RlciBiaXQgICovCisjZGVmaW5lCU1JSV9TVEFUX0VYVCAgICAgICAgMHgwMDAxIAorI2RlZmluZSBNSUlfU1RBVF9KQUIgICAgICAgIDB4MDAwMgorI2RlZmluZQlNSUlfU1RBVF9MSU5LICAgICAgIDB4MDAwNAorI2RlZmluZSBNSUlfU1RBVF9DQU5fQVVUTyAgIDB4MDAwOAorI2RlZmluZQlNSUlfU1RBVF9GQVVMVCAgICAgIDB4MDAxMCAKKyNkZWZpbmUgTUlJX1NUQVRfQVVUT19ET05FICAweDAwMjAKKyNkZWZpbmUJTUlJX1NUQVRfQ0FOX1QgICAgICAweDA4MDAKKyNkZWZpbmUgTUlJX1NUQVRfQ0FOX1RfRkRYICAweDEwMDAKKyNkZWZpbmUJTUlJX1NUQVRfQ0FOX1RYICAgICAweDIwMDAgCisjZGVmaW5lIE1JSV9TVEFUX0NBTl9UWF9GRFggMHg0MDAwCisjZGVmaW5lCU1JSV9TVEFUX0NBTl9UNCAgICAgMHg4MDAwCisKKworI2RlZmluZQkJTUlJX0lEMV9PVUlfTE8JCTB4RkMwMAkvKiBsb3cgYml0cyBvZiBPVUkgbWFzayAqLworI2RlZmluZQkJTUlJX0lEMV9NT0RFTAkJMHgwM0YwCS8qIG1vZGVsIG51bWJlciAqLworI2RlZmluZQkJTUlJX0lEMV9SRVYJCTB4MDAwRgkvKiBtb2RlbCBudW1iZXIgKi8KKworLyogTUlJIE5XQVkgUmVnaXN0ZXIgQml0cyAuLi4KKyAgIHZhbGlkIGZvciB0aGUgQU5BUiAoQXV0by1OZWdvdGlhdGlvbiBBZHZlcnRpc2VtZW50KSBhbmQKKyAgIEFOTFBBUiAoQXV0by1OZWdvdGlhdGlvbiBMaW5rIFBhcnRuZXIpIHJlZ2lzdGVycyAqLworI2RlZmluZQlNSUlfTldBWV9OT0RFX1NFTCAweDAwMWYKKyNkZWZpbmUgTUlJX05XQVlfQ1NNQV9DRCAgMHgwMDAxCisjZGVmaW5lCU1JSV9OV0FZX1QJICAweDAwMjAKKyNkZWZpbmUgTUlJX05XQVlfVF9GRFggICAgMHgwMDQwCisjZGVmaW5lCU1JSV9OV0FZX1RYICAgICAgIDB4MDA4MAorI2RlZmluZSBNSUlfTldBWV9UWF9GRFggICAweDAxMDAKKyNkZWZpbmUJTUlJX05XQVlfVDQgICAgICAgMHgwMjAwIAorI2RlZmluZSBNSUlfTldBWV9QQVVTRSAgICAweDA0MDAgCisjZGVmaW5lCU1JSV9OV0FZX1JGICAgICAgIDB4MjAwMCAvKiBSZW1vdGUgRmF1bHQgKi8KKyNkZWZpbmUgTUlJX05XQVlfQUNLICAgICAgMHg0MDAwIC8qIFJlbW90ZSBBY2tub3dsZWRnZSAqLworI2RlZmluZQlNSUlfTldBWV9OUCAgICAgICAweDgwMDAgLyogTmV4dCBQYWdlIChFbmFibGUpICovCisKKy8qIG1paSBzdHNvdXQgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZQlNSUlfU1RTT1VUX0xJTktfRkFJTCAweDQwMDAKKyNkZWZpbmUJTUlJX1NUU09VVF9TUEQgICAgICAgMHgwMDgwCisjZGVmaW5lIE1JSV9TVFNPVVRfRFBMWCAgICAgIDB4MDA0MAorCisvKiBtaWkgc3RzaWNzIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUJTUlJX1NUU0lDU19TUEQgICAgICAgMHg4MDAwCisjZGVmaW5lIE1JSV9TVFNJQ1NfRFBMWCAgICAgIDB4NDAwMAorI2RlZmluZQlNSUlfU1RTSUNTX0xJTktTVFMgICAweDAwMDEKKworLyogbWlpIHN0c3N1bSByZWdpc3RlciBiaXRzICovCisjZGVmaW5lCU1JSV9TVFNTVU1fTElOSyAgMHgwMDA4CisjZGVmaW5lIE1JSV9TVFNTVU1fRFBMWCAgMHgwMDA0CisjZGVmaW5lCU1JSV9TVFNTVU1fQVVUTyAgMHgwMDAyCisjZGVmaW5lIE1JSV9TVFNTVU1fU1BEICAgMHgwMDAxCisKKy8qIGxzaSBwaHkgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9MU0lfUEhZX1NUQVRfRkRYCTB4MDA0MAorI2RlZmluZSBNSUlfTFNJX1BIWV9TVEFUX1NQRAkweDAwODAKKworLyogYW1kIHBoeSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0FNRF9QSFlfU1RBVF9GRFgJMHgwODAwCisjZGVmaW5lIE1JSV9BTURfUEhZX1NUQVRfU1BECTB4MDQwMAorCisvKiBpbnRlbCBwaHkgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9JTlRFTF9QSFlfU1RBVF9GRFgJMHgwMjAwCisjZGVmaW5lIE1JSV9JTlRFTF9QSFlfU1RBVF9TUEQJMHg0MDAwCisKKy8qIEF1eGlsbGlhcnkgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0FVWF9GRFggICAgICAweDAwMDEKKyNkZWZpbmUgTUlJX0FVWF8xMDAgICAgICAweDAwMDIKKyNkZWZpbmUgTUlJX0FVWF9GMTAwICAgICAweDAwMDQKKyNkZWZpbmUgTUlJX0FVWF9BTkVHICAgICAweDAwMDgKKwordHlwZWRlZiBzdHJ1Y3QgbWlpX3BoeSB7CisJc3RydWN0IG1paV9waHkgKiBuZXh0OworCXN0cnVjdCBtaWlfY2hpcF9pbmZvICogY2hpcF9pbmZvOworCXUxNiBzdGF0dXM7CisJdTMyICptaWlfY29udHJvbF9yZWc7CisJdTMyICptaWlfZGF0YV9yZWc7Cit9IG1paV9waHlfdDsKKworc3RydWN0IHBoeV9vcHMgeworCWludCAoKnBoeV9pbml0KSAoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50KTsKKwlpbnQgKCpwaHlfcmVzZXQpIChzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQpOworCWludCAoKnBoeV9zdGF0dXMpIChzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQsIHUxNiAqLCB1MTYgKik7Cit9OworCisvKiAKKyAqIERhdGEgQnVmZmVyIERlc2NyaXB0b3IuIERhdGEgYnVmZmVycyBtdXN0IGJlIGFsaWduZWQgb24gMzIgYnl0ZSAKKyAqIGJvdW5kYXJ5IGZvciBib3RoLCByZWNlaXZlIGFuZCB0cmFuc21pdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZGJfZGVzdCB7CisJc3RydWN0IGRiX2Rlc3QgKnBuZXh0OworCXZvbGF0aWxlIHUzMiAqdmFkZHI7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKK30gZGJfZGVzdF90OworCisvKgorICogVGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIGRlc2NyaXB0b3JzIGFyZSBtZW1vcnkgCisgKiBtYXBwZWQgcmVnaXN0ZXJzLgorICovCit0eXBlZGVmIHN0cnVjdCB0eF9kbWEgeworCXUzMiBzdGF0dXM7CisJdTMyIGJ1ZmZfc3RhdDsKKwl1MzIgbGVuOworCXUzMiBwYWQ7Cit9IHR4X2RtYV90OworCit0eXBlZGVmIHN0cnVjdCByeF9kbWEgeworCXUzMiBzdGF0dXM7CisJdTMyIGJ1ZmZfc3RhdDsKKwl1MzIgcGFkWzJdOworfSByeF9kbWFfdDsKKworCisvKgorICogTUFDIGNvbnRyb2wgcmVnaXN0ZXJzLCBtZW1vcnkgbWFwcGVkLgorICovCit0eXBlZGVmIHN0cnVjdCBtYWNfcmVnIHsKKwl1MzIgY29udHJvbDsKKwl1MzIgbWFjX2FkZHJfaGlnaDsKKwl1MzIgbWFjX2FkZHJfbG93OworCXUzMiBtdWx0aV9oYXNoX2hpZ2g7CisJdTMyIG11bHRpX2hhc2hfbG93OworCXUzMiBtaWlfY29udHJvbDsKKwl1MzIgbWlpX2RhdGE7CisJdTMyIGZsb3dfY29udHJvbDsKKwl1MzIgdmxhbjFfdGFnOworCXUzMiB2bGFuMl90YWc7Cit9IG1hY19yZWdfdDsKKworCitzdHJ1Y3QgYXUxMDAwX3ByaXZhdGUgeworCQorCWRiX2Rlc3RfdCAqcERCZnJlZTsKKwlkYl9kZXN0X3QgZGJbTlVNX1JYX0JVRkZTK05VTV9UWF9CVUZGU107CisJdm9sYXRpbGUgcnhfZG1hX3QgKnJ4X2RtYV9yaW5nW05VTV9SWF9ETUFdOworCXZvbGF0aWxlIHR4X2RtYV90ICp0eF9kbWFfcmluZ1tOVU1fVFhfRE1BXTsKKwlkYl9kZXN0X3QgKnJ4X2RiX2ludXNlW05VTV9SWF9ETUFdOworCWRiX2Rlc3RfdCAqdHhfZGJfaW51c2VbTlVNX1RYX0RNQV07CisJdTMyIHJ4X2hlYWQ7CisJdTMyIHR4X2hlYWQ7CisJdTMyIHR4X3RhaWw7CisJdTMyIHR4X2Z1bGw7CisKKwlpbnQgbWFjX2lkOworCW1paV9waHlfdCAqbWlpOworCXN0cnVjdCBwaHlfb3BzICpwaHlfb3BzOworCQorCS8qIFRoZXNlIHZhcmlhYmxlcyBhcmUganVzdCBmb3IgcXVpY2sgYWNjZXNzIHRvIGNlcnRhaW4gcmVncyBhZGRyZXNzZXMuICovCisJdm9sYXRpbGUgbWFjX3JlZ190ICptYWM7ICAvKiBtYWMgcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICovICAgCisJdm9sYXRpbGUgdTMyICplbmFibGU7ICAgICAvKiBhZGRyZXNzIG9mIE1BQyBFbmFibGUgUmVnaXN0ZXIgICAgICovCisKKwl1MzIgdmFkZHI7ICAgICAgICAgICAgICAgIC8qIHZpcnR1YWwgYWRkcmVzcyBvZiByeC90eCBidWZmZXJzICAgKi8KKwlkbWFfYWRkcl90IGRtYV9hZGRyOyAgICAgIC8qIGRtYSBhZGRyZXNzIG9mIHJ4L3R4IGJ1ZmZlcnMgICAgICAgKi8KKworCXU4ICpoYXNoX3RhYmxlOworCXUzMiBoYXNoX21vZGU7CisJdTMyIGludHJfd29ya19kb25lOyAvKiBudW1iZXIgb2YgUnggYW5kIFR4IHBrdHMgcHJvY2Vzc2VkIGluIHRoZSBpc3IgKi8KKwlpbnQgcGh5X2FkZHI7ICAgICAgICAgIC8qIHBoeSBhZGRyZXNzICovCisJdTMyIG9wdGlvbnM7ICAgICAgICAgICAvKiBVc2VyLXNldHRhYmxlIG1pc2MuIGRyaXZlciBvcHRpb25zLiAqLworCXUzMiBkcnZfZmxhZ3M7CisJaW50IHdhbnRfYXV0b25lZzsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwlzcGlubG9ja190IGxvY2s7ICAgICAgIC8qIFNlcmlhbGlzZSBhY2Nlc3MgdG8gZGV2aWNlICovCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYjQ0LmMgYi9kcml2ZXJzL25ldC9iNDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmU4YmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYjQ0LmMKQEAgLTAsMCArMSwxOTc4IEBACisvKiBiNDQuYzogQnJvYWRjb20gNDQwMCBkZXZpY2UgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKiBGaXhlZCBieSBQZWtrYSBQaWV0aWthaW5lbiAocHBAZWUub3VsdS5maSkKKyAqCisgKiBEaXN0cmlidXRlIHVuZGVyIEdQTC4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlICJiNDQuaCIKKworI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJiNDQiCisjZGVmaW5lIFBGWCBEUlZfTU9EVUxFX05BTUUJIjogIgorI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjAuOTUiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiQXVnIDMsIDIwMDQiCisKKyNkZWZpbmUgQjQ0X0RFRl9NU0dfRU5BQkxFCSAgXAorCShORVRJRl9NU0dfRFJWCQl8IFwKKwkgTkVUSUZfTVNHX1BST0JFCXwgXAorCSBORVRJRl9NU0dfTElOSwkJfCBcCisJIE5FVElGX01TR19USU1FUgl8IFwKKwkgTkVUSUZfTVNHX0lGRE9XTgl8IFwKKwkgTkVUSUZfTVNHX0lGVVAJCXwgXAorCSBORVRJRl9NU0dfUlhfRVJSCXwgXAorCSBORVRJRl9NU0dfVFhfRVJSKQorCisvKiBsZW5ndGggb2YgdGltZSBiZWZvcmUgd2UgZGVjaWRlIHRoZSBoYXJkd2FyZSBpcyBib3JrZWQsCisgKiBhbmQgZGV2LT50eF90aW1lb3V0KCkgc2hvdWxkIGJlIGNhbGxlZCB0byBmaXggdGhlIHByb2JsZW0KKyAqLworI2RlZmluZSBCNDRfVFhfVElNRU9VVAkJCSg1ICogSFopCisKKy8qIGhhcmR3YXJlIG1pbmltdW0gYW5kIG1heGltdW0gZm9yIGEgc2luZ2xlIGZyYW1lJ3MgZGF0YSBwYXlsb2FkICovCisjZGVmaW5lIEI0NF9NSU5fTVRVCQkJNjAKKyNkZWZpbmUgQjQ0X01BWF9NVFUJCQkxNTAwCisKKyNkZWZpbmUgQjQ0X1JYX1JJTkdfU0laRQkJNTEyCisjZGVmaW5lIEI0NF9ERUZfUlhfUklOR19QRU5ESU5HCQkyMDAKKyNkZWZpbmUgQjQ0X1JYX1JJTkdfQllURVMJKHNpemVvZihzdHJ1Y3QgZG1hX2Rlc2MpICogXAorCQkJCSBCNDRfUlhfUklOR19TSVpFKQorI2RlZmluZSBCNDRfVFhfUklOR19TSVpFCQk1MTIKKyNkZWZpbmUgQjQ0X0RFRl9UWF9SSU5HX1BFTkRJTkcJCShCNDRfVFhfUklOR19TSVpFIC0gMSkKKyNkZWZpbmUgQjQ0X1RYX1JJTkdfQllURVMJKHNpemVvZihzdHJ1Y3QgZG1hX2Rlc2MpICogXAorCQkJCSBCNDRfVFhfUklOR19TSVpFKQorI2RlZmluZSBCNDRfRE1BX01BU0sgMHgzZmZmZmZmZgorCisjZGVmaW5lIFRYX1JJTkdfR0FQKEJQKQlcCisJKEI0NF9UWF9SSU5HX1NJWkUgLSAoQlApLT50eF9wZW5kaW5nKQorI2RlZmluZSBUWF9CVUZGU19BVkFJTChCUCkJCQkJCQlcCisJKCgoQlApLT50eF9jb25zIDw9IChCUCktPnR4X3Byb2QpID8JCQkJXAorCSAgKEJQKS0+dHhfY29ucyArIChCUCktPnR4X3BlbmRpbmcgLSAoQlApLT50eF9wcm9kIDoJCVwKKwkgIChCUCktPnR4X2NvbnMgLSAoQlApLT50eF9wcm9kIC0gVFhfUklOR19HQVAoQlApKQorI2RlZmluZSBORVhUX1RYKE4pCQkoKChOKSArIDEpICYgKEI0NF9UWF9SSU5HX1NJWkUgLSAxKSkKKworI2RlZmluZSBSWF9QS1RfQlVGX1NaCQkoMTUzNiArIGJwLT5yeF9vZmZzZXQgKyA2NCkKKyNkZWZpbmUgVFhfUEtUX0JVRl9TWgkJKEI0NF9NQVhfTVRVICsgRVRIX0hMRU4gKyA4KQorCisvKiBtaW5pbXVtIG51bWJlciBvZiBmcmVlIFRYIGRlc2NyaXB0b3JzIHJlcXVpcmVkIHRvIHdha2UgdXAgVFggcHJvY2VzcyAqLworI2RlZmluZSBCNDRfVFhfV0FLRVVQX1RIUkVTSAkJKEI0NF9UWF9SSU5HX1NJWkUgLyA0KQorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisJRFJWX01PRFVMRV9OQU1FICIuYzp2IiBEUlZfTU9EVUxFX1ZFUlNJT04gIiAoIiBEUlZfTU9EVUxFX1JFTERBVEUgIilcbiI7CisKK01PRFVMRV9BVVRIT1IoIkZsb3JpYW4gU2NoaXJtZXIsIFBla2thIFBpZXRpa2FpbmVuLCBEYXZpZCBTLiBNaWxsZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQnJvYWRjb20gNDQwMCAxMC8xMDAgUENJIGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX01PRFVMRV9WRVJTSU9OKTsKKworc3RhdGljIGludCBiNDRfZGVidWcgPSAtMTsJLyogLTEgPT0gdXNlIEI0NF9ERUZfTVNHX0VOQUJMRSBhcyB2YWx1ZSAqLworbW9kdWxlX3BhcmFtKGI0NF9kZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYjQ0X2RlYnVnLCAiQjQ0IGJpdG1hcHBlZCBkZWJ1Z2dpbmcgbWVzc2FnZSBlbmFibGUgdmFsdWUiKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGI0NF9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX0JDTTQ0MDEsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfQkNNNDQwMUIwLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX0JDTTQ0MDFCMSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCB3aXRoIGVtcHR5IGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYjQ0X3BjaV90YmwpOworCitzdGF0aWMgdm9pZCBiNDRfaGFsdChzdHJ1Y3QgYjQ0ICopOworc3RhdGljIHZvaWQgYjQ0X2luaXRfcmluZ3Moc3RydWN0IGI0NCAqKTsKK3N0YXRpYyB2b2lkIGI0NF9pbml0X2h3KHN0cnVjdCBiNDQgKik7CitzdGF0aWMgaW50IGI0NF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgYjQ0X3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYnIzMihjb25zdCBzdHJ1Y3QgYjQ0ICpicCwgdW5zaWduZWQgbG9uZyByZWcpCit7CisJcmV0dXJuIHJlYWRsKGJwLT5yZWdzICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJ3MzIoY29uc3Qgc3RydWN0IGI0NCAqYnAsIAorCQkJdW5zaWduZWQgbG9uZyByZWcsIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCXdyaXRlbCh2YWwsIGJwLT5yZWdzICsgcmVnKTsKK30KKworc3RhdGljIGludCBiNDRfd2FpdF9iaXQoc3RydWN0IGI0NCAqYnAsIHVuc2lnbmVkIGxvbmcgcmVnLAorCQkJdTMyIGJpdCwgdW5zaWduZWQgbG9uZyB0aW1lb3V0LCBjb25zdCBpbnQgY2xlYXIpCit7CisJdW5zaWduZWQgbG9uZyBpOworCisJZm9yIChpID0gMDsgaSA8IHRpbWVvdXQ7IGkrKykgeworCQl1MzIgdmFsID0gYnIzMihicCwgcmVnKTsKKworCQlpZiAoY2xlYXIgJiYgISh2YWwgJiBiaXQpKQorCQkJYnJlYWs7CisJCWlmICghY2xlYXIgJiYgKHZhbCAmIGJpdCkpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisJaWYgKGkgPT0gdGltZW91dCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogQlVHISAgVGltZW91dCB3YWl0aW5nIGZvciBiaXQgJTA4eCBvZiByZWdpc3RlciAiCisJCSAgICAgICAiJWx4IHRvICVzLlxuIiwKKwkJICAgICAgIGJwLT5kZXYtPm5hbWUsCisJCSAgICAgICBiaXQsIHJlZywKKwkJICAgICAgIChjbGVhciA/ICJjbGVhciIgOiAic2V0IikpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFNvbmljcyBTaWxpY29uQmFja3BsYW5lIHN1cHBvcnQgcm91dGluZXMuICBST0ZMLCB5b3Ugc2hvdWxkIHNlZSBhbGwgdGhlCisgKiBidXp6IHdvcmRzIHVzZWQgb24gdGhpcyBjb21wYW55J3Mgd2Vic2l0ZSA6LSkKKyAqCisgKiBBbGwgb2YgdGhlc2Ugcm91dGluZXMgbXVzdCBiZSBpbnZva2VkIHdpdGggYnAtPmxvY2sgaGVsZCBhbmQKKyAqIGludGVycnVwdHMgZGlzYWJsZWQuCisgKi8KKworI2RlZmluZSBTQl9QQ0lfRE1BICAgICAgICAgICAgIDB4NDAwMDAwMDAgICAgICAvKiBDbGllbnQgTW9kZSBQQ0kgbWVtb3J5IGFjY2VzcyBzcGFjZSAoMSBHQikgKi8KKyNkZWZpbmUgQkNNNDQwMF9QQ0lfQ09SRV9BRERSICAweDE4MDAyMDAwICAgICAgLyogQWRkcmVzcyBvZiBQQ0kgY29yZSBvbiBCQ000NDAwIGNhcmRzICovCisKK3N0YXRpYyB1MzIgc3NiX2dldF9jb3JlX3JldihzdHJ1Y3QgYjQ0ICpicCkKK3sKKwlyZXR1cm4gKGJyMzIoYnAsIEI0NF9TQklESElHSCkgJiBTQklESElHSF9SQ19NQVNLKTsKK30KKworc3RhdGljIHUzMiBzc2JfcGNpX3NldHVwKHN0cnVjdCBiNDQgKmJwLCB1MzIgY29yZXMpCit7CisJdTMyIGJhcl9vcmlnLCBwY2lfcmV2LCB2YWw7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoYnAtPnBkZXYsIFNTQl9CQVIwX1dJTiwgJmJhcl9vcmlnKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJwLT5wZGV2LCBTU0JfQkFSMF9XSU4sIEJDTTQ0MDBfUENJX0NPUkVfQUREUik7CisJcGNpX3JldiA9IHNzYl9nZXRfY29yZV9yZXYoYnApOworCisJdmFsID0gYnIzMihicCwgQjQ0X1NCSU5UVkVDKTsKKwl2YWwgfD0gY29yZXM7CisJYnczMihicCwgQjQ0X1NCSU5UVkVDLCB2YWwpOworCisJdmFsID0gYnIzMihicCwgU1NCX1BDSV9UUkFOU18yKTsKKwl2YWwgfD0gU1NCX1BDSV9QUkVGIHwgU1NCX1BDSV9CVVJTVDsKKwlidzMyKGJwLCBTU0JfUENJX1RSQU5TXzIsIHZhbCk7CisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJwLT5wZGV2LCBTU0JfQkFSMF9XSU4sIGJhcl9vcmlnKTsKKworCXJldHVybiBwY2lfcmV2OworfQorCitzdGF0aWMgdm9pZCBzc2JfY29yZV9kaXNhYmxlKHN0cnVjdCBiNDQgKmJwKQoreworCWlmIChicjMyKGJwLCBCNDRfU0JUTVNMT1cpICYgU0JUTVNMT1dfUkVTRVQpCisJCXJldHVybjsKKworCWJ3MzIoYnAsIEI0NF9TQlRNU0xPVywgKFNCVE1TTE9XX1JFSkVDVCB8IFNCVE1TTE9XX0NMT0NLKSk7CisJYjQ0X3dhaXRfYml0KGJwLCBCNDRfU0JUTVNMT1csIFNCVE1TTE9XX1JFSkVDVCwgMTAwMDAwLCAwKTsKKwliNDRfd2FpdF9iaXQoYnAsIEI0NF9TQlRNU0hJR0gsIFNCVE1TSElHSF9CVVNZLCAxMDAwMDAsIDEpOworCWJ3MzIoYnAsIEI0NF9TQlRNU0xPVywgKFNCVE1TTE9XX0ZHQyB8IFNCVE1TTE9XX0NMT0NLIHwKKwkJCSAgICBTQlRNU0xPV19SRUpFQ1QgfCBTQlRNU0xPV19SRVNFVCkpOworCWJyMzIoYnAsIEI0NF9TQlRNU0xPVyk7CisJdWRlbGF5KDEpOworCWJ3MzIoYnAsIEI0NF9TQlRNU0xPVywgKFNCVE1TTE9XX1JFSkVDVCB8IFNCVE1TTE9XX1JFU0VUKSk7CisJYnIzMihicCwgQjQ0X1NCVE1TTE9XKTsKKwl1ZGVsYXkoMSk7Cit9CisKK3N0YXRpYyB2b2lkIHNzYl9jb3JlX3Jlc2V0KHN0cnVjdCBiNDQgKmJwKQoreworCXUzMiB2YWw7CisKKwlzc2JfY29yZV9kaXNhYmxlKGJwKTsKKwlidzMyKGJwLCBCNDRfU0JUTVNMT1csIChTQlRNU0xPV19SRVNFVCB8IFNCVE1TTE9XX0NMT0NLIHwgU0JUTVNMT1dfRkdDKSk7CisJYnIzMihicCwgQjQ0X1NCVE1TTE9XKTsKKwl1ZGVsYXkoMSk7CisKKwkvKiBDbGVhciBTRVJSIGlmIHNldCwgdGhpcyBpcyBhIGh3IGJ1ZyB3b3JrYXJvdW5kLiAgKi8KKwlpZiAoYnIzMihicCwgQjQ0X1NCVE1TSElHSCkgJiBTQlRNU0hJR0hfU0VSUikKKwkJYnczMihicCwgQjQ0X1NCVE1TSElHSCwgMCk7CisKKwl2YWwgPSBicjMyKGJwLCBCNDRfU0JJTVNUQVRFKTsKKwlpZiAodmFsICYgKFNCSU1TVEFURV9JQkUgfCBTQklNU1RBVEVfVE8pKQorCQlidzMyKGJwLCBCNDRfU0JJTVNUQVRFLCB2YWwgJiB+KFNCSU1TVEFURV9JQkUgfCBTQklNU1RBVEVfVE8pKTsKKworCWJ3MzIoYnAsIEI0NF9TQlRNU0xPVywgKFNCVE1TTE9XX0NMT0NLIHwgU0JUTVNMT1dfRkdDKSk7CisJYnIzMihicCwgQjQ0X1NCVE1TTE9XKTsKKwl1ZGVsYXkoMSk7CisKKwlidzMyKGJwLCBCNDRfU0JUTVNMT1csIChTQlRNU0xPV19DTE9DSykpOworCWJyMzIoYnAsIEI0NF9TQlRNU0xPVyk7CisJdWRlbGF5KDEpOworfQorCitzdGF0aWMgaW50IHNzYl9jb3JlX3VuaXQoc3RydWN0IGI0NCAqYnApCit7CisjaWYgMAorCXUzMiB2YWwgPSBicjMyKGJwLCBCNDRfU0JBRE1BVENIMCk7CisJdTMyIGJhc2U7CisKKwl0eXBlID0gdmFsICYgU0JBRE1BVENIMF9UWVBFX01BU0s7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSAwOgorCQliYXNlID0gdmFsICYgU0JBRE1BVENIMF9CUzBfTUFTSzsKKwkJYnJlYWs7CisKKwljYXNlIDE6CisJCWJhc2UgPSB2YWwgJiBTQkFETUFUQ0gwX0JTMV9NQVNLOworCQlicmVhazsKKworCWNhc2UgMjoKKwlkZWZhdWx0OgorCQliYXNlID0gdmFsICYgU0JBRE1BVENIMF9CUzJfTUFTSzsKKwkJYnJlYWs7CisJfTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNzYl9pc19jb3JlX3VwKHN0cnVjdCBiNDQgKmJwKQoreworCXJldHVybiAoKGJyMzIoYnAsIEI0NF9TQlRNU0xPVykgJiAoU0JUTVNMT1dfUkVTRVQgfCBTQlRNU0xPV19SRUpFQ1QgfCBTQlRNU0xPV19DTE9DSykpCisJCT09IFNCVE1TTE9XX0NMT0NLKTsKK30KKworc3RhdGljIHZvaWQgX19iNDRfY2FtX3dyaXRlKHN0cnVjdCBiNDQgKmJwLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgaW5kZXgpCit7CisJdTMyIHZhbDsKKworCXZhbCAgPSAoKHUzMikgZGF0YVsyXSkgPDwgMjQ7CisJdmFsIHw9ICgodTMyKSBkYXRhWzNdKSA8PCAxNjsKKwl2YWwgfD0gKCh1MzIpIGRhdGFbNF0pIDw8ICA4OworCXZhbCB8PSAoKHUzMikgZGF0YVs1XSkgPDwgIDA7CisJYnczMihicCwgQjQ0X0NBTV9EQVRBX0xPLCB2YWwpOworCXZhbCA9IChDQU1fREFUQV9ISV9WQUxJRCB8IAorCSAgICAgICAoKCh1MzIpIGRhdGFbMF0pIDw8IDgpIHwKKwkgICAgICAgKCgodTMyKSBkYXRhWzFdKSA8PCAwKSk7CisJYnczMihicCwgQjQ0X0NBTV9EQVRBX0hJLCB2YWwpOworCWJ3MzIoYnAsIEI0NF9DQU1fQ1RSTCwgKENBTV9DVFJMX1dSSVRFIHwKKwkJCSAgICAoaW5kZXggPDwgQ0FNX0NUUkxfSU5ERVhfU0hJRlQpKSk7CisJYjQ0X3dhaXRfYml0KGJwLCBCNDRfQ0FNX0NUUkwsIENBTV9DVFJMX0JVU1ksIDEwMCwgMSk7CQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19iNDRfZGlzYWJsZV9pbnRzKHN0cnVjdCBiNDQgKmJwKQoreworCWJ3MzIoYnAsIEI0NF9JTUFTSywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGI0NF9kaXNhYmxlX2ludHMoc3RydWN0IGI0NCAqYnApCit7CisJX19iNDRfZGlzYWJsZV9pbnRzKGJwKTsKKworCS8qIEZsdXNoIHBvc3RlZCB3cml0ZXMuICovCisJYnIzMihicCwgQjQ0X0lNQVNLKTsKK30KKworc3RhdGljIHZvaWQgYjQ0X2VuYWJsZV9pbnRzKHN0cnVjdCBiNDQgKmJwKQoreworCWJ3MzIoYnAsIEI0NF9JTUFTSywgYnAtPmltYXNrKTsKK30KKworc3RhdGljIGludCBiNDRfcmVhZHBoeShzdHJ1Y3QgYjQ0ICpicCwgaW50IHJlZywgdTMyICp2YWwpCit7CisJaW50IGVycjsKKworCWJ3MzIoYnAsIEI0NF9FTUFDX0lTVEFULCBFTUFDX0lOVF9NSUkpOworCWJ3MzIoYnAsIEI0NF9NRElPX0RBVEEsIChNRElPX0RBVEFfU0JfU1RBUlQgfAorCQkJICAgICAoTURJT19PUF9SRUFEIDw8IE1ESU9fREFUQV9PUF9TSElGVCkgfAorCQkJICAgICAoYnAtPnBoeV9hZGRyIDw8IE1ESU9fREFUQV9QTURfU0hJRlQpIHwKKwkJCSAgICAgKHJlZyA8PCBNRElPX0RBVEFfUkFfU0hJRlQpIHwKKwkJCSAgICAgKE1ESU9fVEFfVkFMSUQgPDwgTURJT19EQVRBX1RBX1NISUZUKSkpOworCWVyciA9IGI0NF93YWl0X2JpdChicCwgQjQ0X0VNQUNfSVNUQVQsIEVNQUNfSU5UX01JSSwgMTAwLCAwKTsKKwkqdmFsID0gYnIzMihicCwgQjQ0X01ESU9fREFUQSkgJiBNRElPX0RBVEFfREFUQTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYjQ0X3dyaXRlcGh5KHN0cnVjdCBiNDQgKmJwLCBpbnQgcmVnLCB1MzIgdmFsKQoreworCWJ3MzIoYnAsIEI0NF9FTUFDX0lTVEFULCBFTUFDX0lOVF9NSUkpOworCWJ3MzIoYnAsIEI0NF9NRElPX0RBVEEsIChNRElPX0RBVEFfU0JfU1RBUlQgfAorCQkJICAgICAoTURJT19PUF9XUklURSA8PCBNRElPX0RBVEFfT1BfU0hJRlQpIHwKKwkJCSAgICAgKGJwLT5waHlfYWRkciA8PCBNRElPX0RBVEFfUE1EX1NISUZUKSB8CisJCQkgICAgIChyZWcgPDwgTURJT19EQVRBX1JBX1NISUZUKSB8CisJCQkgICAgIChNRElPX1RBX1ZBTElEIDw8IE1ESU9fREFUQV9UQV9TSElGVCkgfAorCQkJICAgICAodmFsICYgTURJT19EQVRBX0RBVEEpKSk7CisJcmV0dXJuIGI0NF93YWl0X2JpdChicCwgQjQ0X0VNQUNfSVNUQVQsIEVNQUNfSU5UX01JSSwgMTAwLCAwKTsKK30KKworLyogbWlpbGliIGludGVyZmFjZSAqLworLyogRklYTUUgRklYTUU6IHBoeV9pZCBpcyBpZ25vcmVkLCBicC0+cGh5X2FkZHIgdXNlIGlzIHVuY29uZGl0aW9uYWwKKyAqIGR1ZSB0byBjb2RlIGV4aXN0aW5nIGJlZm9yZSBtaWlsaWIgdXNlIHdhcyBhZGRlZCB0byB0aGlzIGRyaXZlci4KKyAqIFNvbWVvbmUgc2hvdWxkIHJlbW92ZSB0aGlzIGFydGlmaWNpYWwgZHJpdmVyIGxpbWl0YXRpb24gaW4KKyAqIGI0NF97cmVhZCx3cml0ZX1waHkuICBicC0+cGh5X2FkZHIgaXRzZWxmIGlzIGZpbmUgKGFuZCBuZWVkZWQpLgorICovCitzdGF0aWMgaW50IGI0NF9taWlfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pCit7CisJdTMyIHZhbDsKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjID0gYjQ0X3JlYWRwaHkoYnAsIGxvY2F0aW9uLCAmdmFsKTsKKwlpZiAocmMpCisJCXJldHVybiAweGZmZmZmZmZmOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGI0NF9taWlfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLAorCQkJIGludCB2YWwpCit7CisJc3RydWN0IGI0NCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWI0NF93cml0ZXBoeShicCwgbG9jYXRpb24sIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgYjQ0X3BoeV9yZXNldChzdHJ1Y3QgYjQ0ICpicCkKK3sKKwl1MzIgdmFsOworCWludCBlcnI7CisKKwllcnIgPSBiNDRfd3JpdGVwaHkoYnAsIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCXVkZWxheSgxMDApOworCWVyciA9IGI0NF9yZWFkcGh5KGJwLCBNSUlfQk1DUiwgJnZhbCk7CisJaWYgKCFlcnIpIHsKKwkJaWYgKHZhbCAmIEJNQ1JfUkVTRVQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBQSFkgUmVzZXQgd291bGQgbm90IGNvbXBsZXRlLlxuIiwKKwkJCSAgICAgICBicC0+ZGV2LT5uYW1lKTsKKwkJCWVyciA9IC1FTk9ERVY7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19iNDRfc2V0X2Zsb3dfY3RybChzdHJ1Y3QgYjQ0ICpicCwgdTMyIHBhdXNlX2ZsYWdzKQoreworCXUzMiB2YWw7CisKKwlicC0+ZmxhZ3MgJj0gfihCNDRfRkxBR19UWF9QQVVTRSB8IEI0NF9GTEFHX1JYX1BBVVNFKTsKKwlicC0+ZmxhZ3MgfD0gcGF1c2VfZmxhZ3M7CisKKwl2YWwgPSBicjMyKGJwLCBCNDRfUlhDT05GSUcpOworCWlmIChwYXVzZV9mbGFncyAmIEI0NF9GTEFHX1JYX1BBVVNFKQorCQl2YWwgfD0gUlhDT05GSUdfRkxPVzsKKwllbHNlCisJCXZhbCAmPSB+UlhDT05GSUdfRkxPVzsKKwlidzMyKGJwLCBCNDRfUlhDT05GSUcsIHZhbCk7CisKKwl2YWwgPSBicjMyKGJwLCBCNDRfTUFDX0ZMT1cpOworCWlmIChwYXVzZV9mbGFncyAmIEI0NF9GTEFHX1RYX1BBVVNFKQorCQl2YWwgfD0gKE1BQ19GTE9XX1BBVVNFX0VOQUIgfAorCQkJKDB4YzAgJiBNQUNfRkxPV19SWF9ISV9XQVRFUikpOworCWVsc2UKKwkJdmFsICY9IH5NQUNfRkxPV19QQVVTRV9FTkFCOworCWJ3MzIoYnAsIEI0NF9NQUNfRkxPVywgdmFsKTsKK30KKworc3RhdGljIHZvaWQgYjQ0X3NldF9mbG93X2N0cmwoc3RydWN0IGI0NCAqYnAsIHUzMiBsb2NhbCwgdTMyIHJlbW90ZSkKK3sKKwl1MzIgcGF1c2VfZW5hYiA9IGJwLT5mbGFncyAmIChCNDRfRkxBR19UWF9QQVVTRSB8CisJCQkJICAgICAgQjQ0X0ZMQUdfUlhfUEFVU0UpOworCisJaWYgKGxvY2FsICYgQURWRVJUSVNFX1BBVVNFX0NBUCkgeworCQlpZiAobG9jYWwgJiBBRFZFUlRJU0VfUEFVU0VfQVNZTSkgeworCQkJaWYgKHJlbW90ZSAmIExQQV9QQVVTRV9DQVApCisJCQkJcGF1c2VfZW5hYiB8PSAoQjQ0X0ZMQUdfVFhfUEFVU0UgfAorCQkJCQkgICAgICAgQjQ0X0ZMQUdfUlhfUEFVU0UpOworCQkJZWxzZSBpZiAocmVtb3RlICYgTFBBX1BBVVNFX0FTWU0pCisJCQkJcGF1c2VfZW5hYiB8PSBCNDRfRkxBR19SWF9QQVVTRTsKKwkJfSBlbHNlIHsKKwkJCWlmIChyZW1vdGUgJiBMUEFfUEFVU0VfQ0FQKQorCQkJCXBhdXNlX2VuYWIgfD0gKEI0NF9GTEFHX1RYX1BBVVNFIHwKKwkJCQkJICAgICAgIEI0NF9GTEFHX1JYX1BBVVNFKTsKKwkJfQorCX0gZWxzZSBpZiAobG9jYWwgJiBBRFZFUlRJU0VfUEFVU0VfQVNZTSkgeworCQlpZiAoKHJlbW90ZSAmIExQQV9QQVVTRV9DQVApICYmCisJCSAgICAocmVtb3RlICYgTFBBX1BBVVNFX0FTWU0pKQorCQkJcGF1c2VfZW5hYiB8PSBCNDRfRkxBR19UWF9QQVVTRTsKKwl9CisKKwlfX2I0NF9zZXRfZmxvd19jdHJsKGJwLCBwYXVzZV9lbmFiKTsKK30KKworc3RhdGljIGludCBiNDRfc2V0dXBfcGh5KHN0cnVjdCBiNDQgKmJwKQoreworCXUzMiB2YWw7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gYjQ0X3JlYWRwaHkoYnAsIEI0NF9NSUlfQUxFRENUUkwsICZ2YWwpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKGVyciA9IGI0NF93cml0ZXBoeShicCwgQjQ0X01JSV9BTEVEQ1RSTCwKKwkJCQl2YWwgJiBNSUlfQUxFRENUUkxfQUxMTVNLKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKChlcnIgPSBiNDRfcmVhZHBoeShicCwgQjQ0X01JSV9UTEVEQ1RSTCwgJnZhbCkpICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoZXJyID0gYjQ0X3dyaXRlcGh5KGJwLCBCNDRfTUlJX1RMRURDVFJMLAorCQkJCXZhbCB8IE1JSV9UTEVEQ1RSTF9FTkFCTEUpKSAhPSAwKQorCQlnb3RvIG91dDsKKworCWlmICghKGJwLT5mbGFncyAmIEI0NF9GTEFHX0ZPUkNFX0xJTkspKSB7CisJCXUzMiBhZHYgPSBBRFZFUlRJU0VfQ1NNQTsKKworCQlpZiAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfQURWXzEwSEFMRikKKwkJCWFkdiB8PSBBRFZFUlRJU0VfMTBIQUxGOworCQlpZiAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfQURWXzEwRlVMTCkKKwkJCWFkdiB8PSBBRFZFUlRJU0VfMTBGVUxMOworCQlpZiAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfQURWXzEwMEhBTEYpCisJCQlhZHYgfD0gQURWRVJUSVNFXzEwMEhBTEY7CisJCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19BRFZfMTAwRlVMTCkKKwkJCWFkdiB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKworCQlpZiAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfUEFVU0VfQVVUTykKKwkJCWFkdiB8PSBBRFZFUlRJU0VfUEFVU0VfQ0FQIHwgQURWRVJUSVNFX1BBVVNFX0FTWU07CisKKwkJaWYgKChlcnIgPSBiNDRfd3JpdGVwaHkoYnAsIE1JSV9BRFZFUlRJU0UsIGFkdikpICE9IDApCisJCQlnb3RvIG91dDsKKwkJaWYgKChlcnIgPSBiNDRfd3JpdGVwaHkoYnAsIE1JSV9CTUNSLCAoQk1DUl9BTkVOQUJMRSB8CisJCQkJCQkgICAgICAgQk1DUl9BTlJFU1RBUlQpKSkgIT0gMCkKKwkJCWdvdG8gb3V0OworCX0gZWxzZSB7CisJCXUzMiBibWNyOworCisJCWlmICgoZXJyID0gYjQ0X3JlYWRwaHkoYnAsIE1JSV9CTUNSLCAmYm1jcikpICE9IDApCisJCQlnb3RvIG91dDsKKwkJYm1jciAmPSB+KEJNQ1JfRlVMTERQTFggfCBCTUNSX0FORU5BQkxFIHwgQk1DUl9TUEVFRDEwMCk7CisJCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR18xMDBfQkFTRV9UKQorCQkJYm1jciB8PSBCTUNSX1NQRUVEMTAwOworCQlpZiAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfRlVMTF9EVVBMRVgpCisJCQlibWNyIHw9IEJNQ1JfRlVMTERQTFg7CisJCWlmICgoZXJyID0gYjQ0X3dyaXRlcGh5KGJwLCBNSUlfQk1DUiwgYm1jcikpICE9IDApCisJCQlnb3RvIG91dDsKKworCQkvKiBTaW5jZSB3ZSB3aWxsIG5vdCBiZSBuZWdvdGlhdGluZyB0aGVyZSBpcyBubyBzYWZlIHdheQorCQkgKiB0byBkZXRlcm1pbmUgaWYgdGhlIGxpbmsgcGFydG5lciBzdXBwb3J0cyBmbG93IGNvbnRyb2wKKwkJICogb3Igbm90LiAgU28ganVzdCBkaXNhYmxlIGl0IGNvbXBsZXRlbHkgaW4gdGhpcyBjYXNlLgorCQkgKi8KKwkJYjQ0X3NldF9mbG93X2N0cmwoYnAsIDAsIDApOworCX0KKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGI0NF9zdGF0c191cGRhdGUoc3RydWN0IGI0NCAqYnApCit7CisJdW5zaWduZWQgbG9uZyByZWc7CisJdTMyICp2YWw7CisKKwl2YWwgPSAmYnAtPmh3X3N0YXRzLnR4X2dvb2Rfb2N0ZXRzOworCWZvciAocmVnID0gQjQ0X1RYX0dPT0RfTzsgcmVnIDw9IEI0NF9UWF9QQVVTRTsgcmVnICs9IDRVTCkgeworCQkqdmFsKysgKz0gYnIzMihicCwgcmVnKTsKKwl9CisJdmFsID0gJmJwLT5od19zdGF0cy5yeF9nb29kX29jdGV0czsKKwlmb3IgKHJlZyA9IEI0NF9SWF9HT09EX087IHJlZyA8PSBCNDRfUlhfTlBBVVNFOyByZWcgKz0gNFVMKSB7CisJCSp2YWwrKyArPSBicjMyKGJwLCByZWcpOworCX0KK30KKworc3RhdGljIHZvaWQgYjQ0X2xpbmtfcmVwb3J0KHN0cnVjdCBiNDQgKmJwKQoreworCWlmICghbmV0aWZfY2Fycmllcl9vayhicC0+ZGV2KSkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6IExpbmsgaXMgZG93bi5cbiIsIGJwLT5kZXYtPm5hbWUpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICIlczogTGluayBpcyB1cCBhdCAlZCBNYnBzLCAlcyBkdXBsZXguXG4iLAorCQkgICAgICAgYnAtPmRldi0+bmFtZSwKKwkJICAgICAgIChicC0+ZmxhZ3MgJiBCNDRfRkxBR18xMDBfQkFTRV9UKSA/IDEwMCA6IDEwLAorCQkgICAgICAgKGJwLT5mbGFncyAmIEI0NF9GTEFHX0ZVTExfRFVQTEVYKSA/ICJmdWxsIiA6ICJoYWxmIik7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBGbG93IGNvbnRyb2wgaXMgJXMgZm9yIFRYIGFuZCAiCisJCSAgICAgICAiJXMgZm9yIFJYLlxuIiwKKwkJICAgICAgIGJwLT5kZXYtPm5hbWUsCisJCSAgICAgICAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfVFhfUEFVU0UpID8gIm9uIiA6ICJvZmYiLAorCQkgICAgICAgKGJwLT5mbGFncyAmIEI0NF9GTEFHX1JYX1BBVVNFKSA/ICJvbiIgOiAib2ZmIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBiNDRfY2hlY2tfcGh5KHN0cnVjdCBiNDQgKmJwKQoreworCXUzMiBibXNyLCBhdXg7CisKKwlpZiAoIWI0NF9yZWFkcGh5KGJwLCBNSUlfQk1TUiwgJmJtc3IpICYmCisJICAgICFiNDRfcmVhZHBoeShicCwgQjQ0X01JSV9BVVhDVFJMLCAmYXV4KSAmJgorCSAgICAoYm1zciAhPSAweGZmZmYpKSB7CisJCWlmIChhdXggJiBNSUlfQVVYQ1RSTF9TUEVFRCkKKwkJCWJwLT5mbGFncyB8PSBCNDRfRkxBR18xMDBfQkFTRV9UOworCQllbHNlCisJCQlicC0+ZmxhZ3MgJj0gfkI0NF9GTEFHXzEwMF9CQVNFX1Q7CisJCWlmIChhdXggJiBNSUlfQVVYQ1RSTF9EVVBMRVgpCisJCQlicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfRlVMTF9EVVBMRVg7CisJCWVsc2UKKwkJCWJwLT5mbGFncyAmPSB+QjQ0X0ZMQUdfRlVMTF9EVVBMRVg7CisKKwkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKGJwLT5kZXYpICYmCisJCSAgICAoYm1zciAmIEJNU1JfTFNUQVRVUykpIHsKKwkJCXUzMiB2YWwgPSBicjMyKGJwLCBCNDRfVFhfQ1RSTCk7CisJCQl1MzIgbG9jYWxfYWR2LCByZW1vdGVfYWR2OworCisJCQlpZiAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfRlVMTF9EVVBMRVgpCisJCQkJdmFsIHw9IFRYX0NUUkxfRFVQTEVYOworCQkJZWxzZQorCQkJCXZhbCAmPSB+VFhfQ1RSTF9EVVBMRVg7CisJCQlidzMyKGJwLCBCNDRfVFhfQ1RSTCwgdmFsKTsKKworCQkJaWYgKCEoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfRk9SQ0VfTElOSykgJiYKKwkJCSAgICAhYjQ0X3JlYWRwaHkoYnAsIE1JSV9BRFZFUlRJU0UsICZsb2NhbF9hZHYpICYmCisJCQkgICAgIWI0NF9yZWFkcGh5KGJwLCBNSUlfTFBBLCAmcmVtb3RlX2FkdikpCisJCQkJYjQ0X3NldF9mbG93X2N0cmwoYnAsIGxvY2FsX2FkdiwgcmVtb3RlX2Fkdik7CisKKwkJCS8qIExpbmsgbm93IHVwICovCisJCQluZXRpZl9jYXJyaWVyX29uKGJwLT5kZXYpOworCQkJYjQ0X2xpbmtfcmVwb3J0KGJwKTsKKwkJfSBlbHNlIGlmIChuZXRpZl9jYXJyaWVyX29rKGJwLT5kZXYpICYmICEoYm1zciAmIEJNU1JfTFNUQVRVUykpIHsKKwkJCS8qIExpbmsgbm93IGRvd24gKi8KKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGJwLT5kZXYpOworCQkJYjQ0X2xpbmtfcmVwb3J0KGJwKTsKKwkJfQorCisJCWlmIChibXNyICYgQk1TUl9SRkFVTFQpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiJXM6IFJlbW90ZSBmYXVsdCBkZXRlY3RlZCBpbiBQSFlcbiIsCisJCQkgICAgICAgYnAtPmRldi0+bmFtZSk7CisJCWlmIChibXNyICYgQk1TUl9KQ0QpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiJXM6IEphYmJlciBkZXRlY3RlZCBpbiBQSFlcbiIsCisJCQkgICAgICAgYnAtPmRldi0+bmFtZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBiNDRfdGltZXIodW5zaWduZWQgbG9uZyBfX29wYXF1ZSkKK3sKKwlzdHJ1Y3QgYjQ0ICpicCA9IChzdHJ1Y3QgYjQ0ICopIF9fb3BhcXVlOworCisJc3Bpbl9sb2NrX2lycSgmYnAtPmxvY2spOworCisJYjQ0X2NoZWNrX3BoeShicCk7CisKKwliNDRfc3RhdHNfdXBkYXRlKGJwKTsKKworCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOworCisJYnAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisJYWRkX3RpbWVyKCZicC0+dGltZXIpOworfQorCitzdGF0aWMgdm9pZCBiNDRfdHgoc3RydWN0IGI0NCAqYnApCit7CisJdTMyIGN1ciwgY29uczsKKworCWN1ciAgPSBicjMyKGJwLCBCNDRfRE1BVFhfU1RBVCkgJiBETUFUWF9TVEFUX0NETUFTSzsKKwljdXIgLz0gc2l6ZW9mKHN0cnVjdCBkbWFfZGVzYyk7CisKKwkvKiBYWFggbmVlZHMgdXBkYXRpbmcgd2hlbiBORVRJRl9GX1NHIGlzIHN1cHBvcnRlZCAqLworCWZvciAoY29ucyA9IGJwLT50eF9jb25zOyBjb25zICE9IGN1cjsgY29ucyA9IE5FWFRfVFgoY29ucykpIHsKKwkJc3RydWN0IHJpbmdfaW5mbyAqcnAgPSAmYnAtPnR4X2J1ZmZlcnNbY29uc107CisJCXN0cnVjdCBza19idWZmICpza2IgPSBycC0+c2tiOworCisJCWlmICh1bmxpa2VseShza2IgPT0gTlVMTCkpCisJCQlCVUcoKTsKKworCQlwY2lfdW5tYXBfc2luZ2xlKGJwLT5wZGV2LAorCQkJCSBwY2lfdW5tYXBfYWRkcihycCwgbWFwcGluZyksCisJCQkJIHNrYi0+bGVuLAorCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJcnAtPnNrYiA9IE5VTEw7CisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJfQorCisJYnAtPnR4X2NvbnMgPSBjb25zOworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGJwLT5kZXYpICYmCisJICAgIFRYX0JVRkZTX0FWQUlMKGJwKSA+IEI0NF9UWF9XQUtFVVBfVEhSRVNIKQorCQluZXRpZl93YWtlX3F1ZXVlKGJwLT5kZXYpOworCisJYnczMihicCwgQjQ0X0dQVElNRVIsIDApOworfQorCisvKiBXb3JrcyBsaWtlIHRoaXMuICBUaGlzIGNoaXAgd3JpdGVzIGEgJ3N0cnVjdCByeF9oZWFkZXIiIDMwIGJ5dGVzCisgKiBiZWZvcmUgdGhlIERNQSBhZGRyZXNzIHlvdSBnaXZlIGl0LiAgU28gd2UgYWxsb2NhdGUgMzAgbW9yZSBieXRlcworICogZm9yIHRoZSBSWCBidWZmZXIsIERNQSBtYXAgYWxsIG9mIGl0LCBza2JfcmVzZXJ2ZSB0aGUgMzAgYnl0ZXMsIHRoZW4KKyAqIHBvaW50IHRoZSBjaGlwIGF0IDMwIGJ5dGVzIHBhc3Qgd2hlcmUgdGhlIHJ4X2hlYWRlciB3aWxsIGdvLgorICovCitzdGF0aWMgaW50IGI0NF9hbGxvY19yeF9za2Ioc3RydWN0IGI0NCAqYnAsIGludCBzcmNfaWR4LCB1MzIgZGVzdF9pZHhfdW5tYXNrZWQpCit7CisJc3RydWN0IGRtYV9kZXNjICpkcDsKKwlzdHJ1Y3QgcmluZ19pbmZvICpzcmNfbWFwLCAqbWFwOworCXN0cnVjdCByeF9oZWFkZXIgKnJoOworCXN0cnVjdCBza19idWZmICpza2I7CisJZG1hX2FkZHJfdCBtYXBwaW5nOworCWludCBkZXN0X2lkeDsKKwl1MzIgY3RybDsKKworCXNyY19tYXAgPSBOVUxMOworCWlmIChzcmNfaWR4ID49IDApCisJCXNyY19tYXAgPSAmYnAtPnJ4X2J1ZmZlcnNbc3JjX2lkeF07CisJZGVzdF9pZHggPSBkZXN0X2lkeF91bm1hc2tlZCAmIChCNDRfUlhfUklOR19TSVpFIC0gMSk7CisJbWFwID0gJmJwLT5yeF9idWZmZXJzW2Rlc3RfaWR4XTsKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKFJYX1BLVF9CVUZfU1opOworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUoYnAtPnBkZXYsIHNrYi0+ZGF0YSwKKwkJCQkgUlhfUEtUX0JVRl9TWiwKKwkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCS8qIEhhcmR3YXJlIGJ1ZyB3b3JrLWFyb3VuZCwgdGhlIGNoaXAgaXMgdW5hYmxlIHRvIGRvIFBDSSBETUEKKwkgICB0by9mcm9tIGFueXRoaW5nIGFib3ZlIDFHQiA6LSggKi8KKwlpZihtYXBwaW5nK1JYX1BLVF9CVUZfU1ogPiBCNDRfRE1BX01BU0spIHsKKwkJLyogU2lnaC4uLiAqLworCQlwY2lfdW5tYXBfc2luZ2xlKGJwLT5wZGV2LCBtYXBwaW5nLCBSWF9QS1RfQlVGX1NaLFBDSV9ETUFfRlJPTURFVklDRSk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXNrYiA9IF9fZGV2X2FsbG9jX3NrYihSWF9QS1RfQlVGX1NaLEdGUF9ETUEpOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKGJwLT5wZGV2LCBza2ItPmRhdGEsCisJCQkJCSBSWF9QS1RfQlVGX1NaLAorCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJaWYobWFwcGluZytSWF9QS1RfQlVGX1NaID4gQjQ0X0RNQV9NQVNLKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKGJwLT5wZGV2LCBtYXBwaW5nLCBSWF9QS1RfQlVGX1NaLFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwlza2ItPmRldiA9IGJwLT5kZXY7CisJc2tiX3Jlc2VydmUoc2tiLCBicC0+cnhfb2Zmc2V0KTsKKworCXJoID0gKHN0cnVjdCByeF9oZWFkZXIgKikKKwkJKHNrYi0+ZGF0YSAtIGJwLT5yeF9vZmZzZXQpOworCXJoLT5sZW4gPSAwOworCXJoLT5mbGFncyA9IDA7CisKKwltYXAtPnNrYiA9IHNrYjsKKwlwY2lfdW5tYXBfYWRkcl9zZXQobWFwLCBtYXBwaW5nLCBtYXBwaW5nKTsKKworCWlmIChzcmNfbWFwICE9IE5VTEwpCisJCXNyY19tYXAtPnNrYiA9IE5VTEw7CisKKwljdHJsICA9IChERVNDX0NUUkxfTEVOICYgKFJYX1BLVF9CVUZfU1ogLSBicC0+cnhfb2Zmc2V0KSk7CisJaWYgKGRlc3RfaWR4ID09IChCNDRfUlhfUklOR19TSVpFIC0gMSkpCisJCWN0cmwgfD0gREVTQ19DVFJMX0VPVDsKKworCWRwID0gJmJwLT5yeF9yaW5nW2Rlc3RfaWR4XTsKKwlkcC0+Y3RybCA9IGNwdV90b19sZTMyKGN0cmwpOworCWRwLT5hZGRyID0gY3B1X3RvX2xlMzIoKHUzMikgbWFwcGluZyArIGJwLT5yeF9vZmZzZXQgKyBicC0+ZG1hX29mZnNldCk7CisKKwlyZXR1cm4gUlhfUEtUX0JVRl9TWjsKK30KKworc3RhdGljIHZvaWQgYjQ0X3JlY3ljbGVfcngoc3RydWN0IGI0NCAqYnAsIGludCBzcmNfaWR4LCB1MzIgZGVzdF9pZHhfdW5tYXNrZWQpCit7CisJc3RydWN0IGRtYV9kZXNjICpzcmNfZGVzYywgKmRlc3RfZGVzYzsKKwlzdHJ1Y3QgcmluZ19pbmZvICpzcmNfbWFwLCAqZGVzdF9tYXA7CisJc3RydWN0IHJ4X2hlYWRlciAqcmg7CisJaW50IGRlc3RfaWR4OworCXUzMiBjdHJsOworCisJZGVzdF9pZHggPSBkZXN0X2lkeF91bm1hc2tlZCAmIChCNDRfUlhfUklOR19TSVpFIC0gMSk7CisJZGVzdF9kZXNjID0gJmJwLT5yeF9yaW5nW2Rlc3RfaWR4XTsKKwlkZXN0X21hcCA9ICZicC0+cnhfYnVmZmVyc1tkZXN0X2lkeF07CisJc3JjX2Rlc2MgPSAmYnAtPnJ4X3Jpbmdbc3JjX2lkeF07CisJc3JjX21hcCA9ICZicC0+cnhfYnVmZmVyc1tzcmNfaWR4XTsKKworCWRlc3RfbWFwLT5za2IgPSBzcmNfbWFwLT5za2I7CisJcmggPSAoc3RydWN0IHJ4X2hlYWRlciAqKSBzcmNfbWFwLT5za2ItPmRhdGE7CisJcmgtPmxlbiA9IDA7CisJcmgtPmZsYWdzID0gMDsKKwlwY2lfdW5tYXBfYWRkcl9zZXQoZGVzdF9tYXAsIG1hcHBpbmcsCisJCQkgICBwY2lfdW5tYXBfYWRkcihzcmNfbWFwLCBtYXBwaW5nKSk7CisKKwljdHJsID0gc3JjX2Rlc2MtPmN0cmw7CisJaWYgKGRlc3RfaWR4ID09IChCNDRfUlhfUklOR19TSVpFIC0gMSkpCisJCWN0cmwgfD0gY3B1X3RvX2xlMzIoREVTQ19DVFJMX0VPVCk7CisJZWxzZQorCQljdHJsICY9IGNwdV90b19sZTMyKH5ERVNDX0NUUkxfRU9UKTsKKworCWRlc3RfZGVzYy0+Y3RybCA9IGN0cmw7CisJZGVzdF9kZXNjLT5hZGRyID0gc3JjX2Rlc2MtPmFkZHI7CisJc3JjX21hcC0+c2tiID0gTlVMTDsKKworCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShicC0+cGRldiwgc3JjX2Rlc2MtPmFkZHIsCisJCQkJICAgICAgIFJYX1BLVF9CVUZfU1osCisJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7Cit9CisKK3N0YXRpYyBpbnQgYjQ0X3J4KHN0cnVjdCBiNDQgKmJwLCBpbnQgYnVkZ2V0KQoreworCWludCByZWNlaXZlZDsKKwl1MzIgY29ucywgcHJvZDsKKworCXJlY2VpdmVkID0gMDsKKwlwcm9kICA9IGJyMzIoYnAsIEI0NF9ETUFSWF9TVEFUKSAmIERNQVJYX1NUQVRfQ0RNQVNLOworCXByb2QgLz0gc2l6ZW9mKHN0cnVjdCBkbWFfZGVzYyk7CisJY29ucyA9IGJwLT5yeF9jb25zOworCisJd2hpbGUgKGNvbnMgIT0gcHJvZCAmJiBidWRnZXQgPiAwKSB7CisJCXN0cnVjdCByaW5nX2luZm8gKnJwID0gJmJwLT5yeF9idWZmZXJzW2NvbnNdOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcnAtPnNrYjsKKwkJZG1hX2FkZHJfdCBtYXAgPSBwY2lfdW5tYXBfYWRkcihycCwgbWFwcGluZyk7CisJCXN0cnVjdCByeF9oZWFkZXIgKnJoOworCQl1MTYgbGVuOworCisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShicC0+cGRldiwgbWFwLAorCQkJCQkgICAgUlhfUEtUX0JVRl9TWiwKKwkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCXJoID0gKHN0cnVjdCByeF9oZWFkZXIgKikgc2tiLT5kYXRhOworCQlsZW4gPSBjcHVfdG9fbGUxNihyaC0+bGVuKTsKKwkJaWYgKChsZW4gPiAoUlhfUEtUX0JVRl9TWiAtIGJwLT5yeF9vZmZzZXQpKSB8fAorCQkgICAgKHJoLT5mbGFncyAmIGNwdV90b19sZTE2KFJYX0ZMQUdfRVJST1JTKSkpIHsKKwkJZHJvcF9pdDoKKwkJCWI0NF9yZWN5Y2xlX3J4KGJwLCBjb25zLCBicC0+cnhfcHJvZCk7CisJCWRyb3BfaXRfbm9fcmVjeWNsZToKKwkJCWJwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQlnb3RvIG5leHRfcGt0OworCQl9CisKKwkJaWYgKGxlbiA9PSAwKSB7CisJCQlpbnQgaSA9IDA7CisKKwkJCWRvIHsKKwkJCQl1ZGVsYXkoMik7CisJCQkJYmFycmllcigpOworCQkJCWxlbiA9IGNwdV90b19sZTE2KHJoLT5sZW4pOworCQkJfSB3aGlsZSAobGVuID09IDAgJiYgaSsrIDwgNSk7CisJCQlpZiAobGVuID09IDApCisJCQkJZ290byBkcm9wX2l0OworCQl9CisKKwkJLyogT21pdCBDUkMuICovCisJCWxlbiAtPSA0OworCisJCWlmIChsZW4gPiBSWF9DT1BZX1RIUkVTSE9MRCkgeworCQkJaW50IHNrYl9zaXplOworCQkJc2tiX3NpemUgPSBiNDRfYWxsb2Nfcnhfc2tiKGJwLCBjb25zLCBicC0+cnhfcHJvZCk7CisJCQlpZiAoc2tiX3NpemUgPCAwKQorCQkJCWdvdG8gZHJvcF9pdDsKKwkJCXBjaV91bm1hcF9zaW5nbGUoYnAtPnBkZXYsIG1hcCwKKwkJCQkJIHNrYl9zaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJLyogTGVhdmUgb3V0IHJ4X2hlYWRlciAqLworICAgICAgICAgICAgICAgIAlza2JfcHV0KHNrYiwgbGVuK2JwLT5yeF9vZmZzZXQpOworICAgICAgICAgICAgCSAgICAgICAgc2tiX3B1bGwoc2tiLGJwLT5yeF9vZmZzZXQpOworCQl9IGVsc2UgeworCQkJc3RydWN0IHNrX2J1ZmYgKmNvcHlfc2tiOworCisJCQliNDRfcmVjeWNsZV9yeChicCwgY29ucywgYnAtPnJ4X3Byb2QpOworCQkJY29weV9za2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDIpOworCQkJaWYgKGNvcHlfc2tiID09IE5VTEwpCisJCQkJZ290byBkcm9wX2l0X25vX3JlY3ljbGU7CisKKwkJCWNvcHlfc2tiLT5kZXYgPSBicC0+ZGV2OworCQkJc2tiX3Jlc2VydmUoY29weV9za2IsIDIpOworCQkJc2tiX3B1dChjb3B5X3NrYiwgbGVuKTsKKwkJCS8qIERNQSBzeW5jIGRvbmUgYWJvdmUsIGNvcHkganVzdCB0aGUgYWN0dWFsIHBhY2tldCAqLworCQkJbWVtY3B5KGNvcHlfc2tiLT5kYXRhLCBza2ItPmRhdGErYnAtPnJ4X29mZnNldCwgbGVuKTsKKworCQkJc2tiID0gY29weV9za2I7CisJCX0KKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBicC0+ZGV2KTsKKwkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKwkJYnAtPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCXJlY2VpdmVkKys7CisJCWJ1ZGdldC0tOworCW5leHRfcGt0OgorCQlicC0+cnhfcHJvZCA9IChicC0+cnhfcHJvZCArIDEpICYKKwkJCShCNDRfUlhfUklOR19TSVpFIC0gMSk7CisJCWNvbnMgPSAoY29ucyArIDEpICYgKEI0NF9SWF9SSU5HX1NJWkUgLSAxKTsKKwl9CisKKwlicC0+cnhfY29ucyA9IGNvbnM7CisJYnczMihicCwgQjQ0X0RNQVJYX1BUUiwgY29ucyAqIHNpemVvZihzdHJ1Y3QgZG1hX2Rlc2MpKTsKKworCXJldHVybiByZWNlaXZlZDsKK30KKworc3RhdGljIGludCBiNDRfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgKmJ1ZGdldCkKK3sKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IGRvbmU7CisKKwlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7CisKKwlpZiAoYnAtPmlzdGF0ICYgKElTVEFUX1RYIHwgSVNUQVRfVE8pKSB7CisJCS8qIHNwaW5fbG9jaygmYnAtPnR4X2xvY2spOyAqLworCQliNDRfdHgoYnApOworCQkvKiBzcGluX3VubG9jaygmYnAtPnR4X2xvY2spOyAqLworCX0KKwlzcGluX3VubG9ja19pcnEoJmJwLT5sb2NrKTsKKworCWRvbmUgPSAxOworCWlmIChicC0+aXN0YXQgJiBJU1RBVF9SWCkgeworCQlpbnQgb3JpZ19idWRnZXQgPSAqYnVkZ2V0OworCQlpbnQgd29ya19kb25lOworCisJCWlmIChvcmlnX2J1ZGdldCA+IG5ldGRldi0+cXVvdGEpCisJCQlvcmlnX2J1ZGdldCA9IG5ldGRldi0+cXVvdGE7CisKKwkJd29ya19kb25lID0gYjQ0X3J4KGJwLCBvcmlnX2J1ZGdldCk7CisKKwkJKmJ1ZGdldCAtPSB3b3JrX2RvbmU7CisJCW5ldGRldi0+cXVvdGEgLT0gd29ya19kb25lOworCisJCWlmICh3b3JrX2RvbmUgPj0gb3JpZ19idWRnZXQpCisJCQlkb25lID0gMDsKKwl9CisKKwlpZiAoYnAtPmlzdGF0ICYgSVNUQVRfRVJST1JTKSB7CisJCXNwaW5fbG9ja19pcnEoJmJwLT5sb2NrKTsKKwkJYjQ0X2hhbHQoYnApOworCQliNDRfaW5pdF9yaW5ncyhicCk7CisJCWI0NF9pbml0X2h3KGJwKTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShicC0+ZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CisJCWRvbmUgPSAxOworCX0KKworCWlmIChkb25lKSB7CisJCW5ldGlmX3J4X2NvbXBsZXRlKG5ldGRldik7CisJCWI0NF9lbmFibGVfaW50cyhicCk7CisJfQorCisJcmV0dXJuIChkb25lID8gMCA6IDEpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYjQ0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IGI0NCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGlzdGF0LCBpbWFzazsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKworCWlzdGF0ID0gYnIzMihicCwgQjQ0X0lTVEFUKTsKKwlpbWFzayA9IGJyMzIoYnAsIEI0NF9JTUFTSyk7CisKKwkvKiA/Pz8gV2hhdCB0aGUgZnVjayBpcyB0aGUgcHVycG9zZSBvZiB0aGUgaW50ZXJydXB0IG1hc2sKKwkgKiA/Pz8gcmVnaXN0ZXIgaWYgd2UgaGF2ZSB0byBtYXNrIGl0IG91dCBieSBoYW5kIGFueXdheXM/CisJICovCisJaXN0YXQgJj0gaW1hc2s7CisJaWYgKGlzdGF0KSB7CisJCWhhbmRsZWQgPSAxOworCQlpZiAobmV0aWZfcnhfc2NoZWR1bGVfcHJlcChkZXYpKSB7CisJCQkvKiBOT1RFOiBUaGVzZSB3cml0ZXMgYXJlIHBvc3RlZCBieSB0aGUgcmVhZGJhY2sgb2YKKwkJCSAqICAgICAgIHRoZSBJU1RBVCByZWdpc3RlciBiZWxvdy4KKwkJCSAqLworCQkJYnAtPmlzdGF0ID0gaXN0YXQ7CisJCQlfX2I0NF9kaXNhYmxlX2ludHMoYnApOworCQkJX19uZXRpZl9yeF9zY2hlZHVsZShkZXYpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEVycm9yLCBwb2xsIGFscmVhZHkgc2NoZWR1bGVkXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCX0KKworCQlidzMyKGJwLCBCNDRfSVNUQVQsIGlzdGF0KTsKKwkJYnIzMihicCwgQjQ0X0lTVEFUKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIHZvaWQgYjQ0X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwlwcmludGsoS0VSTl9FUlIgUEZYICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCByZXNldHRpbmdcbiIsCisJICAgICAgIGRldi0+bmFtZSk7CisKKwlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7CisKKwliNDRfaGFsdChicCk7CisJYjQ0X2luaXRfcmluZ3MoYnApOworCWI0NF9pbml0X2h3KGJwKTsKKworCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOworCisJYjQ0X2VuYWJsZV9pbnRzKGJwKTsKKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBiNDRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYm91bmNlX3NrYjsKKwlkbWFfYWRkcl90IG1hcHBpbmc7CisJdTMyIGxlbiwgZW50cnksIGN0cmw7CisKKwlsZW4gPSBza2ItPmxlbjsKKwlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7CisKKwkvKiBUaGlzIGlzIGEgaGFyZCBlcnJvciwgbG9nIGl0LiAqLworCWlmICh1bmxpa2VseShUWF9CVUZGU19BVkFJTChicCkgPCAxKSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOworCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogQlVHISBUeCBSaW5nIGZ1bGwgd2hlbiBxdWV1ZSBhd2FrZSFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUoYnAtPnBkZXYsIHNrYi0+ZGF0YSwgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlpZihtYXBwaW5nK2xlbiA+IEI0NF9ETUFfTUFTSykgeworCQkvKiBDaGlwIGNhbid0IGhhbmRsZSBETUEgdG8vZnJvbSA+MUdCLCB1c2UgYm91bmNlIGJ1ZmZlciAqLworCQlwY2lfdW5tYXBfc2luZ2xlKGJwLT5wZGV2LCBtYXBwaW5nLCBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCWJvdW5jZV9za2IgPSBfX2Rldl9hbGxvY19za2IoVFhfUEtUX0JVRl9TWiwKKwkJCQkJICAgICBHRlBfQVRPTUlDfEdGUF9ETUEpOworCQlpZiAoIWJvdW5jZV9za2IpCisJCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CisKKwkJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKGJwLT5wZGV2LCBib3VuY2Vfc2tiLT5kYXRhLAorCQkJCQkgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJaWYobWFwcGluZytsZW4gPiBCNDRfRE1BX01BU0spIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoYnAtPnBkZXYsIG1hcHBpbmcsCisJCQkJCSBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoYm91bmNlX3NrYik7CisJCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CisJCX0KKworCQltZW1jcHkoc2tiX3B1dChib3VuY2Vfc2tiLCBsZW4pLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJc2tiID0gYm91bmNlX3NrYjsKKwl9CisKKwllbnRyeSA9IGJwLT50eF9wcm9kOworCWJwLT50eF9idWZmZXJzW2VudHJ5XS5za2IgPSBza2I7CisJcGNpX3VubWFwX2FkZHJfc2V0KCZicC0+dHhfYnVmZmVyc1tlbnRyeV0sIG1hcHBpbmcsIG1hcHBpbmcpOworCisJY3RybCAgPSAobGVuICYgREVTQ19DVFJMX0xFTik7CisJY3RybCB8PSBERVNDX0NUUkxfSU9DIHwgREVTQ19DVFJMX1NPRiB8IERFU0NfQ1RSTF9FT0Y7CisJaWYgKGVudHJ5ID09IChCNDRfVFhfUklOR19TSVpFIC0gMSkpCisJCWN0cmwgfD0gREVTQ19DVFJMX0VPVDsKKworCWJwLT50eF9yaW5nW2VudHJ5XS5jdHJsID0gY3B1X3RvX2xlMzIoY3RybCk7CisJYnAtPnR4X3JpbmdbZW50cnldLmFkZHIgPSBjcHVfdG9fbGUzMigodTMyKSBtYXBwaW5nK2JwLT5kbWFfb2Zmc2V0KTsKKworCWVudHJ5ID0gTkVYVF9UWChlbnRyeSk7CisKKwlicC0+dHhfcHJvZCA9IGVudHJ5OworCisJd21iKCk7CisKKwlidzMyKGJwLCBCNDRfRE1BVFhfUFRSLCBlbnRyeSAqIHNpemVvZihzdHJ1Y3QgZG1hX2Rlc2MpKTsKKwlpZiAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfQlVHR1lfVFhQVFIpCisJCWJ3MzIoYnAsIEI0NF9ETUFUWF9QVFIsIGVudHJ5ICogc2l6ZW9mKHN0cnVjdCBkbWFfZGVzYykpOworCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19SRU9SREVSX0JVRykKKwkJYnIzMihicCwgQjQ0X0RNQVRYX1BUUik7CisKKwlpZiAoVFhfQlVGRlNfQVZBSUwoYnApIDwgMSkKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGI0NF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChuZXdfbXR1IDwgQjQ0X01JTl9NVFUgfHwgbmV3X210dSA+IEI0NF9NQVhfTVRVKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCS8qIFdlJ2xsIGp1c3QgY2F0Y2ggaXQgbGF0ZXIgd2hlbiB0aGUKKwkJICogZGV2aWNlIGlzIHVwJ2QuCisJCSAqLworCQlkZXYtPm10dSA9IG5ld19tdHU7CisJCXJldHVybiAwOworCX0KKworCXNwaW5fbG9ja19pcnEoJmJwLT5sb2NrKTsKKwliNDRfaGFsdChicCk7CisJZGV2LT5tdHUgPSBuZXdfbXR1OworCWI0NF9pbml0X3JpbmdzKGJwKTsKKwliNDRfaW5pdF9odyhicCk7CisJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CisKKwliNDRfZW5hYmxlX2ludHMoYnApOworCQorCXJldHVybiAwOworfQorCisvKiBGcmVlIHVwIHBlbmRpbmcgcGFja2V0cyBpbiBhbGwgcngvdHggcmluZ3MuCisgKgorICogVGhlIGNoaXAgaGFzIGJlZW4gc2h1dCBkb3duIGFuZCB0aGUgZHJpdmVyIGRldGFjaGVkIGZyb20KKyAqIHRoZSBuZXR3b3JraW5nLCBzbyBubyBpbnRlcnJ1cHRzIG9yIG5ldyB0eCBwYWNrZXRzIHdpbGwKKyAqIGVuZCB1cCBpbiB0aGUgZHJpdmVyLiAgYnAtPmxvY2sgaXMgbm90IGhlbGQgYW5kIHdlIGFyZSBub3QKKyAqIGluIGFuIGludGVycnVwdCBjb250ZXh0IGFuZCB0aHVzIG1heSBzbGVlcC4KKyAqLworc3RhdGljIHZvaWQgYjQ0X2ZyZWVfcmluZ3Moc3RydWN0IGI0NCAqYnApCit7CisJc3RydWN0IHJpbmdfaW5mbyAqcnA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQjQ0X1JYX1JJTkdfU0laRTsgaSsrKSB7CisJCXJwID0gJmJwLT5yeF9idWZmZXJzW2ldOworCisJCWlmIChycC0+c2tiID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJcGNpX3VubWFwX3NpbmdsZShicC0+cGRldiwKKwkJCQkgcGNpX3VubWFwX2FkZHIocnAsIG1hcHBpbmcpLAorCQkJCSBSWF9QS1RfQlVGX1NaLAorCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlkZXZfa2ZyZWVfc2tiX2FueShycC0+c2tiKTsKKwkJcnAtPnNrYiA9IE5VTEw7CisJfQorCisJLyogWFhYIG5lZWRzIGNoYW5nZXMgb25jZSBORVRJRl9GX1NHIGlzIHNldC4uLiAqLworCWZvciAoaSA9IDA7IGkgPCBCNDRfVFhfUklOR19TSVpFOyBpKyspIHsKKwkJcnAgPSAmYnAtPnR4X2J1ZmZlcnNbaV07CisKKwkJaWYgKHJwLT5za2IgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlwY2lfdW5tYXBfc2luZ2xlKGJwLT5wZGV2LAorCQkJCSBwY2lfdW5tYXBfYWRkcihycCwgbWFwcGluZyksCisJCQkJIHJwLT5za2ItPmxlbiwKKwkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCWRldl9rZnJlZV9za2JfYW55KHJwLT5za2IpOworCQlycC0+c2tiID0gTlVMTDsKKwl9Cit9CisKKy8qIEluaXRpYWxpemUgdHgvcnggcmluZ3MgZm9yIHBhY2tldCBwcm9jZXNzaW5nLgorICoKKyAqIFRoZSBjaGlwIGhhcyBiZWVuIHNodXQgZG93biBhbmQgdGhlIGRyaXZlciBkZXRhY2hlZCBmcm9tCisgKiB0aGUgbmV0d29ya2luZywgc28gbm8gaW50ZXJydXB0cyBvciBuZXcgdHggcGFja2V0cyB3aWxsCisgKiBlbmQgdXAgaW4gdGhlIGRyaXZlci4gIGJwLT5sb2NrIGlzIG5vdCBoZWxkIGFuZCB3ZSBhcmUgbm90CisgKiBpbiBhbiBpbnRlcnJ1cHQgY29udGV4dCBhbmQgdGh1cyBtYXkgc2xlZXAuCisgKi8KK3N0YXRpYyB2b2lkIGI0NF9pbml0X3JpbmdzKHN0cnVjdCBiNDQgKmJwKQoreworCWludCBpOworCisJYjQ0X2ZyZWVfcmluZ3MoYnApOworCisJbWVtc2V0KGJwLT5yeF9yaW5nLCAwLCBCNDRfUlhfUklOR19CWVRFUyk7CisJbWVtc2V0KGJwLT50eF9yaW5nLCAwLCBCNDRfVFhfUklOR19CWVRFUyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnAtPnJ4X3BlbmRpbmc7IGkrKykgeworCQlpZiAoYjQ0X2FsbG9jX3J4X3NrYihicCwgLTEsIGkpIDwgMCkKKwkJCWJyZWFrOworCX0KK30KKworLyoKKyAqIE11c3Qgbm90IGJlIGludm9rZWQgd2l0aCBpbnRlcnJ1cHQgc291cmNlcyBkaXNhYmxlZCBhbmQKKyAqIHRoZSBoYXJkd2FyZSBzaHV0ZG93biBkb3duLgorICovCitzdGF0aWMgdm9pZCBiNDRfZnJlZV9jb25zaXN0ZW50KHN0cnVjdCBiNDQgKmJwKQoreworCWlmIChicC0+cnhfYnVmZmVycykgeworCQlrZnJlZShicC0+cnhfYnVmZmVycyk7CisJCWJwLT5yeF9idWZmZXJzID0gTlVMTDsKKwl9CisJaWYgKGJwLT50eF9idWZmZXJzKSB7CisJCWtmcmVlKGJwLT50eF9idWZmZXJzKTsKKwkJYnAtPnR4X2J1ZmZlcnMgPSBOVUxMOworCX0KKwlpZiAoYnAtPnJ4X3JpbmcpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChicC0+cGRldiwgRE1BX1RBQkxFX0JZVEVTLAorCQkJCSAgICBicC0+cnhfcmluZywgYnAtPnJ4X3JpbmdfZG1hKTsKKwkJYnAtPnJ4X3JpbmcgPSBOVUxMOworCX0KKwlpZiAoYnAtPnR4X3JpbmcpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChicC0+cGRldiwgRE1BX1RBQkxFX0JZVEVTLAorCQkJCSAgICBicC0+dHhfcmluZywgYnAtPnR4X3JpbmdfZG1hKTsKKwkJYnAtPnR4X3JpbmcgPSBOVUxMOworCX0KK30KKworLyoKKyAqIE11c3Qgbm90IGJlIGludm9rZWQgd2l0aCBpbnRlcnJ1cHQgc291cmNlcyBkaXNhYmxlZCBhbmQKKyAqIHRoZSBoYXJkd2FyZSBzaHV0ZG93biBkb3duLiAgQ2FuIHNsZWVwLgorICovCitzdGF0aWMgaW50IGI0NF9hbGxvY19jb25zaXN0ZW50KHN0cnVjdCBiNDQgKmJwKQoreworCWludCBzaXplOworCisJc2l6ZSAgPSBCNDRfUlhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCByaW5nX2luZm8pOworCWJwLT5yeF9idWZmZXJzID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJwLT5yeF9idWZmZXJzKQorCQlnb3RvIG91dF9lcnI7CisJbWVtc2V0KGJwLT5yeF9idWZmZXJzLCAwLCBzaXplKTsKKworCXNpemUgPSBCNDRfVFhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCByaW5nX2luZm8pOworCWJwLT50eF9idWZmZXJzID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJwLT50eF9idWZmZXJzKQorCQlnb3RvIG91dF9lcnI7CisJbWVtc2V0KGJwLT50eF9idWZmZXJzLCAwLCBzaXplKTsKKworCXNpemUgPSBETUFfVEFCTEVfQllURVM7CisJYnAtPnJ4X3JpbmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudChicC0+cGRldiwgc2l6ZSwgJmJwLT5yeF9yaW5nX2RtYSk7CisJaWYgKCFicC0+cnhfcmluZykKKwkJZ290byBvdXRfZXJyOworCisJYnAtPnR4X3JpbmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudChicC0+cGRldiwgc2l6ZSwgJmJwLT50eF9yaW5nX2RtYSk7CisJaWYgKCFicC0+dHhfcmluZykKKwkJZ290byBvdXRfZXJyOworCisJcmV0dXJuIDA7CisKK291dF9lcnI6CisJYjQ0X2ZyZWVfY29uc2lzdGVudChicCk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qIGJwLT5sb2NrIGlzIGhlbGQuICovCitzdGF0aWMgdm9pZCBiNDRfY2xlYXJfc3RhdHMoc3RydWN0IGI0NCAqYnApCit7CisJdW5zaWduZWQgbG9uZyByZWc7CisKKwlidzMyKGJwLCBCNDRfTUlCX0NUUkwsIE1JQl9DVFJMX0NMUl9PTl9SRUFEKTsKKwlmb3IgKHJlZyA9IEI0NF9UWF9HT09EX087IHJlZyA8PSBCNDRfVFhfUEFVU0U7IHJlZyArPSA0VUwpCisJCWJyMzIoYnAsIHJlZyk7CisJZm9yIChyZWcgPSBCNDRfUlhfR09PRF9POyByZWcgPD0gQjQ0X1JYX05QQVVTRTsgcmVnICs9IDRVTCkKKwkJYnIzMihicCwgcmVnKTsKK30KKworLyogYnAtPmxvY2sgaXMgaGVsZC4gKi8KK3N0YXRpYyB2b2lkIGI0NF9jaGlwX3Jlc2V0KHN0cnVjdCBiNDQgKmJwKQoreworCWlmIChzc2JfaXNfY29yZV91cChicCkpIHsKKwkJYnczMihicCwgQjQ0X1JDVl9MQVpZLCAwKTsKKwkJYnczMihicCwgQjQ0X0VORVRfQ1RSTCwgRU5FVF9DVFJMX0RJU0FCTEUpOworCQliNDRfd2FpdF9iaXQoYnAsIEI0NF9FTkVUX0NUUkwsIEVORVRfQ1RSTF9ESVNBQkxFLCAxMDAsIDEpOworCQlidzMyKGJwLCBCNDRfRE1BVFhfQ1RSTCwgMCk7CisJCWJwLT50eF9wcm9kID0gYnAtPnR4X2NvbnMgPSAwOworCQlpZiAoYnIzMihicCwgQjQ0X0RNQVJYX1NUQVQpICYgRE1BUlhfU1RBVF9FTUFTSykgeworCQkJYjQ0X3dhaXRfYml0KGJwLCBCNDRfRE1BUlhfU1RBVCwgRE1BUlhfU1RBVF9TSURMRSwKKwkJCQkgICAgIDEwMCwgMCk7CisJCX0KKwkJYnczMihicCwgQjQ0X0RNQVJYX0NUUkwsIDApOworCQlicC0+cnhfcHJvZCA9IGJwLT5yeF9jb25zID0gMDsKKwl9IGVsc2UgeworCQlzc2JfcGNpX3NldHVwKGJwLCAoYnAtPmNvcmVfdW5pdCA9PSAwID8KKwkJCQkgICBTQklOVFZFQ19FTkVUMCA6CisJCQkJICAgU0JJTlRWRUNfRU5FVDEpKTsKKwl9CisKKwlzc2JfY29yZV9yZXNldChicCk7CisKKwliNDRfY2xlYXJfc3RhdHMoYnApOworCisJLyogTWFrZSBQSFkgYWNjZXNzaWJsZS4gKi8KKwlidzMyKGJwLCBCNDRfTURJT19DVFJMLCAoTURJT19DVFJMX1BSRUFNQkxFIHwKKwkJCSAgICAgKDB4MGQgJiBNRElPX0NUUkxfTUFYRl9NQVNLKSkpOworCWJyMzIoYnAsIEI0NF9NRElPX0NUUkwpOworCisJaWYgKCEoYnIzMihicCwgQjQ0X0RFVkNUUkwpICYgREVWQ1RSTF9JUFApKSB7CisJCWJ3MzIoYnAsIEI0NF9FTkVUX0NUUkwsIEVORVRfQ1RSTF9FUFNFTCk7CisJCWJyMzIoYnAsIEI0NF9FTkVUX0NUUkwpOworCQlicC0+ZmxhZ3MgJj0gfkI0NF9GTEFHX0lOVEVSTkFMX1BIWTsKKwl9IGVsc2UgeworCQl1MzIgdmFsID0gYnIzMihicCwgQjQ0X0RFVkNUUkwpOworCisJCWlmICh2YWwgJiBERVZDVFJMX0VQUikgeworCQkJYnczMihicCwgQjQ0X0RFVkNUUkwsICh2YWwgJiB+REVWQ1RSTF9FUFIpKTsKKwkJCWJyMzIoYnAsIEI0NF9ERVZDVFJMKTsKKwkJCXVkZWxheSgxMDApOworCQl9CisJCWJwLT5mbGFncyB8PSBCNDRfRkxBR19JTlRFUk5BTF9QSFk7CisJfQorfQorCisvKiBicC0+bG9jayBpcyBoZWxkLiAqLworc3RhdGljIHZvaWQgYjQ0X2hhbHQoc3RydWN0IGI0NCAqYnApCit7CisJYjQ0X2Rpc2FibGVfaW50cyhicCk7CisJYjQ0X2NoaXBfcmVzZXQoYnApOworfQorCisvKiBicC0+bG9jayBpcyBoZWxkLiAqLworc3RhdGljIHZvaWQgX19iNDRfc2V0X21hY19hZGRyKHN0cnVjdCBiNDQgKmJwKQoreworCWJ3MzIoYnAsIEI0NF9DQU1fQ1RSTCwgMCk7CisJaWYgKCEoYnAtPmRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykpIHsKKwkJdTMyIHZhbDsKKworCQlfX2I0NF9jYW1fd3JpdGUoYnAsIGJwLT5kZXYtPmRldl9hZGRyLCAwKTsKKwkJdmFsID0gYnIzMihicCwgQjQ0X0NBTV9DVFJMKTsKKwkJYnczMihicCwgQjQ0X0NBTV9DVFJMLCB2YWwgfCBDQU1fQ1RSTF9FTkFCTEUpOworCX0KK30KKworc3RhdGljIGludCBiNDRfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCit7CisJc3RydWN0IGI0NCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCisJc3Bpbl9sb2NrX2lycSgmYnAtPmxvY2spOworCV9fYjQ0X3NldF9tYWNfYWRkcihicCk7CisJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIGF0IGRldmljZSBvcGVuIHRpbWUgdG8gZ2V0IHRoZSBjaGlwIHJlYWR5IGZvcgorICogcGFja2V0IHByb2Nlc3NpbmcuICBJbnZva2VkIHdpdGggYnAtPmxvY2sgaGVsZC4KKyAqLworc3RhdGljIHZvaWQgX19iNDRfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgdm9pZCBiNDRfaW5pdF9odyhzdHJ1Y3QgYjQ0ICpicCkKK3sKKwl1MzIgdmFsOworCisJYjQ0X2NoaXBfcmVzZXQoYnApOworCWI0NF9waHlfcmVzZXQoYnApOworCWI0NF9zZXR1cF9waHkoYnApOworCisJLyogRW5hYmxlIENSQzMyLCBzZXQgcHJvcGVyIExFRCBtb2RlcyBhbmQgcG93ZXIgb24gUEhZICovCisJYnczMihicCwgQjQ0X01BQ19DVFJMLCBNQUNfQ1RSTF9DUkMzMl9FTkFCIHwgTUFDX0NUUkxfUEhZX0xFRENUUkwpOworCWJ3MzIoYnAsIEI0NF9SQ1ZfTEFaWSwgKDEgPDwgUkNWX0xBWllfRkNfU0hJRlQpKTsKKworCS8qIFRoaXMgc2V0cyB0aGUgTUFDIGFkZHJlc3MgdG9vLiAgKi8KKwlfX2I0NF9zZXRfcnhfbW9kZShicC0+ZGV2KTsKKworCS8qIE1UVSArIGV0aCBoZWFkZXIgKyBwb3NzaWJsZSBWTEFOIHRhZyArIHN0cnVjdCByeF9oZWFkZXIgKi8KKwlidzMyKGJwLCBCNDRfUlhNQVhMRU4sIGJwLT5kZXYtPm10dSArIEVUSF9ITEVOICsgOCArIFJYX0hFQURFUl9MRU4pOworCWJ3MzIoYnAsIEI0NF9UWE1BWExFTiwgYnAtPmRldi0+bXR1ICsgRVRIX0hMRU4gKyA4ICsgUlhfSEVBREVSX0xFTik7CisKKwlidzMyKGJwLCBCNDRfVFhfV01BUkssIDU2KTsgLyogWFhYIG1hZ2ljICovCisJYnczMihicCwgQjQ0X0RNQVRYX0NUUkwsIERNQVRYX0NUUkxfRU5BQkxFKTsKKwlidzMyKGJwLCBCNDRfRE1BVFhfQUREUiwgYnAtPnR4X3JpbmdfZG1hICsgYnAtPmRtYV9vZmZzZXQpOworCWJ3MzIoYnAsIEI0NF9ETUFSWF9DVFJMLCAoRE1BUlhfQ1RSTF9FTkFCTEUgfAorCQkJICAgICAgKGJwLT5yeF9vZmZzZXQgPDwgRE1BUlhfQ1RSTF9ST1NISUZUKSkpOworCWJ3MzIoYnAsIEI0NF9ETUFSWF9BRERSLCBicC0+cnhfcmluZ19kbWEgKyBicC0+ZG1hX29mZnNldCk7CisKKwlidzMyKGJwLCBCNDRfRE1BUlhfUFRSLCBicC0+cnhfcGVuZGluZyk7CisJYnAtPnJ4X3Byb2QgPSBicC0+cnhfcGVuZGluZzsJCisKKwlidzMyKGJwLCBCNDRfTUlCX0NUUkwsIE1JQl9DVFJMX0NMUl9PTl9SRUFEKTsKKworCXZhbCA9IGJyMzIoYnAsIEI0NF9FTkVUX0NUUkwpOworCWJ3MzIoYnAsIEI0NF9FTkVUX0NUUkwsICh2YWwgfCBFTkVUX0NUUkxfRU5BQkxFKSk7Cit9CisKK3N0YXRpYyBpbnQgYjQ0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKworCWVyciA9IGI0NF9hbGxvY19jb25zaXN0ZW50KGJwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGI0NF9pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisKKwlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7CisKKwliNDRfaW5pdF9yaW5ncyhicCk7CisJYjQ0X2luaXRfaHcoYnApOworCWJwLT5mbGFncyB8PSBCNDRfRkxBR19JTklUX0NPTVBMRVRFOworCisJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CisKKwlpbml0X3RpbWVyKCZicC0+dGltZXIpOworCWJwLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaOworCWJwLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGJwOworCWJwLT50aW1lci5mdW5jdGlvbiA9IGI0NF90aW1lcjsKKwlhZGRfdGltZXIoJmJwLT50aW1lcik7CisKKwliNDRfZW5hYmxlX2ludHMoYnApOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZnJlZToKKwliNDRfZnJlZV9jb25zaXN0ZW50KGJwKTsKKwlyZXR1cm4gZXJyOworfQorCisjaWYgMAorLypzdGF0aWMqLyB2b2lkIGI0NF9kdW1wX3N0YXRlKHN0cnVjdCBiNDQgKmJwKQoreworCXUzMiB2YWwzMiwgdmFsMzJfMiwgdmFsMzJfMywgdmFsMzJfNCwgdmFsMzJfNTsKKwl1MTYgdmFsMTY7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChicC0+cGRldiwgUENJX1NUQVRVUywgJnZhbDE2KTsKKwlwcmludGsoIkRFQlVHOiBQQ0kgc3RhdHVzIFslMDR4XSBcbiIsIHZhbDE2KTsKKworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorLyoKKyAqIFBvbGxpbmcgcmVjZWl2ZSAtIHVzZWQgYnkgbmV0Y29uc29sZSBhbmQgb3RoZXIgZGlhZ25vc3RpYyB0b29scworICogdG8gYWxsb3cgbmV0d29yayBpL28gd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICovCitzdGF0aWMgdm9pZCBiNDRfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCWI0NF9pbnRlcnJ1cHQoZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBiNDRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlkZWxfdGltZXJfc3luYygmYnAtPnRpbWVyKTsKKworCXNwaW5fbG9ja19pcnEoJmJwLT5sb2NrKTsKKworI2lmIDAKKwliNDRfZHVtcF9zdGF0ZShicCk7CisjZW5kaWYKKwliNDRfaGFsdChicCk7CisJYjQ0X2ZyZWVfcmluZ3MoYnApOworCWJwLT5mbGFncyAmPSB+QjQ0X0ZMQUdfSU5JVF9DT01QTEVURTsKKwluZXRpZl9jYXJyaWVyX29mZihicC0+ZGV2KTsKKworCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwliNDRfZnJlZV9jb25zaXN0ZW50KGJwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmI0NF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5zdGF0ID0gJmJwLT5zdGF0czsKKwlzdHJ1Y3QgYjQ0X2h3X3N0YXRzICpod3N0YXQgPSAmYnAtPmh3X3N0YXRzOworCisJLyogQ29udmVydCBIVyBzdGF0cyBpbnRvIG5ldGRldmljZSBzdGF0cy4gKi8KKwluc3RhdC0+cnhfcGFja2V0cyA9IGh3c3RhdC0+cnhfcGt0czsKKwluc3RhdC0+dHhfcGFja2V0cyA9IGh3c3RhdC0+dHhfcGt0czsKKwluc3RhdC0+cnhfYnl0ZXMgICA9IGh3c3RhdC0+cnhfb2N0ZXRzOworCW5zdGF0LT50eF9ieXRlcyAgID0gaHdzdGF0LT50eF9vY3RldHM7CisJbnN0YXQtPnR4X2Vycm9ycyAgPSAoaHdzdGF0LT50eF9qYWJiZXJfcGt0cyArCisJCQkgICAgIGh3c3RhdC0+dHhfb3ZlcnNpemVfcGt0cyArCisJCQkgICAgIGh3c3RhdC0+dHhfdW5kZXJydW5zICsKKwkJCSAgICAgaHdzdGF0LT50eF9leGNlc3NpdmVfY29scyArCisJCQkgICAgIGh3c3RhdC0+dHhfbGF0ZV9jb2xzKTsKKwluc3RhdC0+bXVsdGljYXN0ICA9IGh3c3RhdC0+dHhfbXVsdGljYXN0X3BrdHM7CisJbnN0YXQtPmNvbGxpc2lvbnMgPSBod3N0YXQtPnR4X3RvdGFsX2NvbHM7CisKKwluc3RhdC0+cnhfbGVuZ3RoX2Vycm9ycyA9IChod3N0YXQtPnJ4X292ZXJzaXplX3BrdHMgKworCQkJCSAgIGh3c3RhdC0+cnhfdW5kZXJzaXplKTsKKwluc3RhdC0+cnhfb3Zlcl9lcnJvcnMgICA9IGh3c3RhdC0+cnhfbWlzc2VkX3BrdHM7CisJbnN0YXQtPnJ4X2ZyYW1lX2Vycm9ycyAgPSBod3N0YXQtPnJ4X2FsaWduX2VycnM7CisJbnN0YXQtPnJ4X2NyY19lcnJvcnMgICAgPSBod3N0YXQtPnJ4X2NyY19lcnJzOworCW5zdGF0LT5yeF9lcnJvcnMgICAgICAgID0gKGh3c3RhdC0+cnhfamFiYmVyX3BrdHMgKworCQkJCSAgIGh3c3RhdC0+cnhfb3ZlcnNpemVfcGt0cyArCisJCQkJICAgaHdzdGF0LT5yeF9taXNzZWRfcGt0cyArCisJCQkJICAgaHdzdGF0LT5yeF9jcmNfYWxpZ25fZXJycyArCisJCQkJICAgaHdzdGF0LT5yeF91bmRlcnNpemUgKworCQkJCSAgIGh3c3RhdC0+cnhfY3JjX2VycnMgKworCQkJCSAgIGh3c3RhdC0+cnhfYWxpZ25fZXJycyArCisJCQkJICAgaHdzdGF0LT5yeF9zeW1ib2xfZXJycyk7CisKKwluc3RhdC0+dHhfYWJvcnRlZF9lcnJvcnMgPSBod3N0YXQtPnR4X3VuZGVycnVuczsKKyNpZiAwCisJLyogQ2FycmllciBsb3N0IGNvdW50ZXIgc2VlbXMgdG8gYmUgYnJva2VuIGZvciBzb21lIGRldmljZXMgKi8KKwluc3RhdC0+dHhfY2Fycmllcl9lcnJvcnMgPSBod3N0YXQtPnR4X2NhcnJpZXJfbG9zdDsKKyNlbmRpZgorCisJcmV0dXJuIG5zdGF0OworfQorCitzdGF0aWMgaW50IF9fYjQ0X2xvYWRfbWNhc3Qoc3RydWN0IGI0NCAqYnAsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJaW50IGksIG51bV9lbnRzOworCisJbnVtX2VudHMgPSBtaW5fdChpbnQsIGRldi0+bWNfY291bnQsIEI0NF9NQ0FTVF9UQUJMRV9TSVpFKTsKKwltY2xpc3QgPSBkZXYtPm1jX2xpc3Q7CisJZm9yIChpID0gMDsgbWNsaXN0ICYmIGkgPCBudW1fZW50czsgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJX19iNDRfY2FtX3dyaXRlKGJwLCBtY2xpc3QtPmRtaV9hZGRyLCBpICsgMSk7CisJfQorCXJldHVybiBpKzE7Cit9CisKK3N0YXRpYyB2b2lkIF9fYjQ0X3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGI0NCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiB2YWw7CisJaW50IGk9MDsKKwl1bnNpZ25lZCBjaGFyIHplcm9bNl0gPSB7MCwwLDAsMCwwLDB9OworCisJdmFsID0gYnIzMihicCwgQjQ0X1JYQ09ORklHKTsKKwl2YWwgJj0gfihSWENPTkZJR19QUk9NSVNDIHwgUlhDT05GSUdfQUxMTVVMVEkpOworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJdmFsIHw9IFJYQ09ORklHX1BST01JU0M7CisJCWJ3MzIoYnAsIEI0NF9SWENPTkZJRywgdmFsKTsKKwl9IGVsc2UgeworCQlfX2I0NF9zZXRfbWFjX2FkZHIoYnApOworCisJCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQorCQkJdmFsIHw9IFJYQ09ORklHX0FMTE1VTFRJOworCQllbHNlCisJCQlpPV9fYjQ0X2xvYWRfbWNhc3QoYnAsIGRldik7CisJCQorCQlmb3IoO2k8NjQ7aSsrKSB7CisJCQlfX2I0NF9jYW1fd3JpdGUoYnAsIHplcm8sIGkpOwkJCQorCQl9CisJCWJ3MzIoYnAsIEI0NF9SWENPTkZJRywgdmFsKTsKKyAgICAgICAgCXZhbCA9IGJyMzIoYnAsIEI0NF9DQU1fQ1RSTCk7CisJICAgICAgICBidzMyKGJwLCBCNDRfQ0FNX0NUUkwsIHZhbCB8IENBTV9DVFJMX0VOQUJMRSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBiNDRfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7CisJX19iNDRfc2V0X3J4X21vZGUoZGV2KTsKKwlzcGluX3VubG9ja19pcnEoJmJwLT5sb2NrKTsKK30KKworc3RhdGljIHUzMiBiNDRfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGI0NCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiBicC0+bXNnX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQgYjQ0X3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdmFsdWUpCit7CisJc3RydWN0IGI0NCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWJwLT5tc2dfZW5hYmxlID0gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIGI0NF9nZXRfZHJ2aW5mbyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBicC0+cGRldjsKKworCXN0cmNweSAoaW5mby0+ZHJpdmVyLCBEUlZfTU9EVUxFX05BTUUpOworCXN0cmNweSAoaW5mby0+dmVyc2lvbiwgRFJWX01PRFVMRV9WRVJTSU9OKTsKKwlzdHJjcHkgKGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShwY2lfZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgYjQ0X253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIGJtY3I7CisJaW50IHI7CisKKwlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7CisJYjQ0X3JlYWRwaHkoYnAsIE1JSV9CTUNSLCAmYm1jcik7CisJYjQ0X3JlYWRwaHkoYnAsIE1JSV9CTUNSLCAmYm1jcik7CisJciA9IC1FSU5WQUw7CisJaWYgKGJtY3IgJiBCTUNSX0FORU5BQkxFKSB7CisJCWI0NF93cml0ZXBoeShicCwgTUlJX0JNQ1IsCisJCQkgICAgIGJtY3IgfCBCTUNSX0FOUkVTVEFSVCk7CisJCXIgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnEoJmJwLT5sb2NrKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IGI0NF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IGI0NCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCEoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfSU5JVF9DT01QTEVURSkpCisJCXJldHVybiAtRUFHQUlOOworCWNtZC0+c3VwcG9ydGVkID0gKFNVUFBPUlRFRF9BdXRvbmVnKTsKKwljbWQtPnN1cHBvcnRlZCB8PSAoU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfAorCQkJICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8CisJCQkgIFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAorCQkJICBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKKwkJCSAgU1VQUE9SVEVEX01JSSk7CisKKwljbWQtPmFkdmVydGlzaW5nID0gMDsKKwlpZiAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfQURWXzEwSEFMRikKKwkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VfMTBIQUxGOworCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19BRFZfMTBGVUxMKQorCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRV8xMEZVTEw7CisJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX0FEVl8xMDBIQUxGKQorCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRV8xMDBIQUxGOworCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19BRFZfMTAwRlVMTCkKKwkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRV9QQVVTRV9DQVAgfCBBRFZFUlRJU0VfUEFVU0VfQVNZTTsKKwljbWQtPnNwZWVkID0gKGJwLT5mbGFncyAmIEI0NF9GTEFHXzEwMF9CQVNFX1QpID8KKwkJU1BFRURfMTAwIDogU1BFRURfMTA7CisJY21kLT5kdXBsZXggPSAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfRlVMTF9EVVBMRVgpID8KKwkJRFVQTEVYX0ZVTEwgOiBEVVBMRVhfSEFMRjsKKwljbWQtPnBvcnQgPSAwOworCWNtZC0+cGh5X2FkZHJlc3MgPSBicC0+cGh5X2FkZHI7CisJY21kLT50cmFuc2NlaXZlciA9IChicC0+ZmxhZ3MgJiBCNDRfRkxBR19JTlRFUk5BTF9QSFkpID8KKwkJWENWUl9JTlRFUk5BTCA6IFhDVlJfRVhURVJOQUw7CisJY21kLT5hdXRvbmVnID0gKGJwLT5mbGFncyAmIEI0NF9GTEFHX0ZPUkNFX0xJTkspID8KKwkJQVVUT05FR19ESVNBQkxFIDogQVVUT05FR19FTkFCTEU7CisJY21kLT5tYXh0eHBrdCA9IDA7CisJY21kLT5tYXhyeHBrdCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYjQ0X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoIShicC0+ZmxhZ3MgJiBCNDRfRkxBR19JTklUX0NPTVBMRVRFKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwkvKiBXZSBkbyBub3Qgc3VwcG9ydCBnaWdhYml0LiAqLworCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJaWYgKGNtZC0+YWR2ZXJ0aXNpbmcgJgorCQkgICAgKEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYgfAorCQkgICAgIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmICgoY21kLT5zcGVlZCAhPSBTUEVFRF8xMDAgJiYKKwkJICAgIGNtZC0+c3BlZWQgIT0gU1BFRURfMTApIHx8CisJCSAgIChjbWQtPmR1cGxleCAhPSBEVVBMRVhfSEFMRiAmJgorCQkgICAgY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7CisKKwlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCWJwLT5mbGFncyAmPSB+QjQ0X0ZMQUdfRk9SQ0VfTElOSzsKKwkJYnAtPmZsYWdzICY9IH4oQjQ0X0ZMQUdfQURWXzEwSEFMRiB8CisJCQkgICAgICAgQjQ0X0ZMQUdfQURWXzEwRlVMTCB8CisJCQkgICAgICAgQjQ0X0ZMQUdfQURWXzEwMEhBTEYgfAorCQkJICAgICAgIEI0NF9GTEFHX0FEVl8xMDBGVUxMKTsKKwkJaWYgKGNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VfMTBIQUxGKQorCQkJYnAtPmZsYWdzIHw9IEI0NF9GTEFHX0FEVl8xMEhBTEY7CisJCWlmIChjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFXzEwRlVMTCkKKwkJCWJwLT5mbGFncyB8PSBCNDRfRkxBR19BRFZfMTBGVUxMOworCQlpZiAoY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRV8xMDBIQUxGKQorCQkJYnAtPmZsYWdzIHw9IEI0NF9GTEFHX0FEVl8xMDBIQUxGOworCQlpZiAoY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRV8xMDBGVUxMKQorCQkJYnAtPmZsYWdzIHw9IEI0NF9GTEFHX0FEVl8xMDBGVUxMOworCX0gZWxzZSB7CisJCWJwLT5mbGFncyB8PSBCNDRfRkxBR19GT1JDRV9MSU5LOworCQlpZiAoY21kLT5zcGVlZCA9PSBTUEVFRF8xMDApCisJCQlicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfMTAwX0JBU0VfVDsKKwkJaWYgKGNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJYnAtPmZsYWdzIHw9IEI0NF9GTEFHX0ZVTExfRFVQTEVYOworCX0KKworCWI0NF9zZXR1cF9waHkoYnApOworCisJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYjQ0X2dldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqZXJpbmcpCit7CisJc3RydWN0IGI0NCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZXJpbmctPnJ4X21heF9wZW5kaW5nID0gQjQ0X1JYX1JJTkdfU0laRSAtIDE7CisJZXJpbmctPnJ4X3BlbmRpbmcgPSBicC0+cnhfcGVuZGluZzsKKworCS8qIFhYWCBldGh0b29sIGxhY2tzIGEgdHhfbWF4X3BlbmRpbmcsIG9vcHMuLi4gKi8KK30KKworc3RhdGljIGludCBiNDRfc2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKmVyaW5nKQoreworCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICgoZXJpbmctPnJ4X3BlbmRpbmcgPiBCNDRfUlhfUklOR19TSVpFIC0gMSkgfHwKKwkgICAgKGVyaW5nLT5yeF9taW5pX3BlbmRpbmcgIT0gMCkgfHwKKwkgICAgKGVyaW5nLT5yeF9qdW1ib19wZW5kaW5nICE9IDApIHx8CisJICAgIChlcmluZy0+dHhfcGVuZGluZyA+IEI0NF9UWF9SSU5HX1NJWkUgLSAxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7CisKKwlicC0+cnhfcGVuZGluZyA9IGVyaW5nLT5yeF9wZW5kaW5nOworCWJwLT50eF9wZW5kaW5nID0gZXJpbmctPnR4X3BlbmRpbmc7CisKKwliNDRfaGFsdChicCk7CisJYjQ0X2luaXRfcmluZ3MoYnApOworCWI0NF9pbml0X2h3KGJwKTsKKwluZXRpZl93YWtlX3F1ZXVlKGJwLT5kZXYpOworCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOworCisJYjQ0X2VuYWJsZV9pbnRzKGJwKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYjQ0X2dldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZXBhdXNlKQoreworCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWVwYXVzZS0+YXV0b25lZyA9CisJCShicC0+ZmxhZ3MgJiBCNDRfRkxBR19QQVVTRV9BVVRPKSAhPSAwOworCWVwYXVzZS0+cnhfcGF1c2UgPQorCQkoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfUlhfUEFVU0UpICE9IDA7CisJZXBhdXNlLT50eF9wYXVzZSA9CisJCShicC0+ZmxhZ3MgJiBCNDRfRkxBR19UWF9QQVVTRSkgIT0gMDsKK30KKworc3RhdGljIGludCBiNDRfc2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICplcGF1c2UpCit7CisJc3RydWN0IGI0NCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2lycSgmYnAtPmxvY2spOworCWlmIChlcGF1c2UtPmF1dG9uZWcpCisJCWJwLT5mbGFncyB8PSBCNDRfRkxBR19QQVVTRV9BVVRPOworCWVsc2UKKwkJYnAtPmZsYWdzICY9IH5CNDRfRkxBR19QQVVTRV9BVVRPOworCWlmIChlcGF1c2UtPnJ4X3BhdXNlKQorCQlicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfUlhfUEFVU0U7CisJZWxzZQorCQlicC0+ZmxhZ3MgJj0gfkI0NF9GTEFHX1JYX1BBVVNFOworCWlmIChlcGF1c2UtPnR4X3BhdXNlKQorCQlicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfVFhfUEFVU0U7CisJZWxzZQorCQlicC0+ZmxhZ3MgJj0gfkI0NF9GTEFHX1RYX1BBVVNFOworCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19QQVVTRV9BVVRPKSB7CisJCWI0NF9oYWx0KGJwKTsKKwkJYjQ0X2luaXRfcmluZ3MoYnApOworCQliNDRfaW5pdF9odyhicCk7CisJfSBlbHNlIHsKKwkJX19iNDRfc2V0X2Zsb3dfY3RybChicCwgYnAtPmZsYWdzKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CisKKwliNDRfZW5hYmxlX2ludHMoYnApOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGI0NF9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gYjQ0X2dldF9kcnZpbmZvLAorCS5nZXRfc2V0dGluZ3MJCT0gYjQ0X2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCQk9IGI0NF9zZXRfc2V0dGluZ3MsCisJLm53YXlfcmVzZXQJCT0gYjQ0X253YXlfcmVzZXQsCisJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9yaW5ncGFyYW0JCT0gYjQ0X2dldF9yaW5ncGFyYW0sCisJLnNldF9yaW5ncGFyYW0JCT0gYjQ0X3NldF9yaW5ncGFyYW0sCisJLmdldF9wYXVzZXBhcmFtCQk9IGI0NF9nZXRfcGF1c2VwYXJhbSwKKwkuc2V0X3BhdXNlcGFyYW0JCT0gYjQ0X3NldF9wYXVzZXBhcmFtLAorCS5nZXRfbXNnbGV2ZWwJCT0gYjQ0X2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCQk9IGI0NF9zZXRfbXNnbGV2ZWwsCit9OworCitzdGF0aWMgaW50IGI0NF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkoaWZyKTsKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKworCXNwaW5fbG9ja19pcnEoJmJwLT5sb2NrKTsKKwllcnIgPSBnZW5lcmljX21paV9pb2N0bCgmYnAtPm1paV9pZiwgZGF0YSwgY21kLCBOVUxMKTsKKwlzcGluX3VubG9ja19pcnEoJmJwLT5sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qIFJlYWQgMTI4LWJ5dGVzIG9mIEVFUFJPTS4gKi8KK3N0YXRpYyBpbnQgYjQ0X3JlYWRfZWVwcm9tKHN0cnVjdCBiNDQgKmJwLCB1OCAqZGF0YSkKK3sKKwlsb25nIGk7CisJdTE2ICpwdHIgPSAodTE2ICopIGRhdGE7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpICs9IDIpCisJCXB0cltpIC8gMl0gPSByZWFkdyhicC0+cmVncyArIDQwOTYgKyBpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBiNDRfZ2V0X2ludmFyaWFudHMoc3RydWN0IGI0NCAqYnApCit7CisJdTggZWVwcm9tWzEyOF07CisJaW50IGVycjsKKworCWVyciA9IGI0NF9yZWFkX2VlcHJvbShicCwgJmVlcHJvbVswXSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlicC0+ZGV2LT5kZXZfYWRkclswXSA9IGVlcHJvbVs3OV07CisJYnAtPmRldi0+ZGV2X2FkZHJbMV0gPSBlZXByb21bNzhdOworCWJwLT5kZXYtPmRldl9hZGRyWzJdID0gZWVwcm9tWzgxXTsKKwlicC0+ZGV2LT5kZXZfYWRkclszXSA9IGVlcHJvbVs4MF07CisJYnAtPmRldi0+ZGV2X2FkZHJbNF0gPSBlZXByb21bODNdOworCWJwLT5kZXYtPmRldl9hZGRyWzVdID0gZWVwcm9tWzgyXTsKKworCWJwLT5waHlfYWRkciA9IGVlcHJvbVs5MF0gJiAweDFmOworCisJLyogV2l0aCB0aGlzLCBwbHVzIHRoZSByeF9oZWFkZXIgcHJlcGVuZGVkIHRvIHRoZSBkYXRhIGJ5IHRoZQorCSAqIGhhcmR3YXJlLCB3ZSdsbCBsYW5kIHRoZSBldGhlcm5ldCBoZWFkZXIgb24gYSAyLWJ5dGUgYm91bmRhcnkuCisJICovCisJYnAtPnJ4X29mZnNldCA9IDMwOworCisJYnAtPmltYXNrID0gSU1BU0tfREVGOworCisJYnAtPmNvcmVfdW5pdCA9IHNzYl9jb3JlX3VuaXQoYnApOworCWJwLT5kbWFfb2Zmc2V0ID0gU0JfUENJX0RNQTsKKworCS8qIFhYWCAtIHJlYWxseSByZXF1aXJlZD8gCisJICAgYnAtPmZsYWdzIHw9IEI0NF9GTEFHX0JVR0dZX1RYUFRSOworICAgICAgICAgKi8KK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBiNDRfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0YXRpYyBpbnQgYjQ0X3ZlcnNpb25fcHJpbnRlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBiNDRyZWdfYmFzZSwgYjQ0cmVnX2xlbjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBiNDQgKmJwOworCWludCBlcnIsIGk7CisKKwlpZiAoYjQ0X3ZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBlbmFibGUgUENJIGRldmljZSwgIgorCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApICYgSU9SRVNPVVJDRV9NRU0pKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBmaW5kIHByb3BlciBQQ0kgZGV2aWNlICIKKwkJICAgICAgICJiYXNlIGFkZHJlc3MsIGFib3J0aW5nLlxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9kaXNhYmxlX3BkZXY7CisJfQorCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTU9EVUxFX05BTUUpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IG9idGFpbiBQQ0kgcmVzb3VyY2VzLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGVfcGRldjsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgKHU2NCkgQjQ0X0RNQV9NQVNLKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIk5vIHVzYWJsZSBETUEgY29uZmlndXJhdGlvbiwgIgorCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKKwl9CisJCisJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsICh1NjQpIEI0NF9ETUFfTUFTSyk7CisJaWYgKGVycikgeworCSAgcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uLCAiCisJCSAiYWJvcnRpbmcuXG4iKTsKKwkgIGdvdG8gZXJyX291dF9mcmVlX3JlczsKKwl9CisKKwliNDRyZWdfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwliNDRyZWdfbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqYnApKTsKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJFdGhlcmRldiBhbGxvYyBmYWlsZWQsIGFib3J0aW5nLlxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKKwl9CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCZwZGV2LT5kZXYpOworCisJLyogTm8gaW50ZXJlc3RpbmcgbmV0ZGV2aWNlIGZlYXR1cmVzIGluIHRoaXMgY2FyZC4uLiAqLworCWRldi0+ZmVhdHVyZXMgfD0gMDsKKworCWJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlicC0+cGRldiA9IHBkZXY7CisJYnAtPmRldiA9IGRldjsKKwlpZiAoYjQ0X2RlYnVnID49IDApCisJCWJwLT5tc2dfZW5hYmxlID0gKDEgPDwgYjQ0X2RlYnVnKSAtIDE7CisJZWxzZQorCQlicC0+bXNnX2VuYWJsZSA9IEI0NF9ERUZfTVNHX0VOQUJMRTsKKworCXNwaW5fbG9ja19pbml0KCZicC0+bG9jayk7CisKKwlicC0+cmVncyA9IGlvcmVtYXAoYjQ0cmVnX2Jhc2UsIGI0NHJlZ19sZW4pOworCWlmIChicC0+cmVncyA9PSAwVUwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IG1hcCBkZXZpY2UgcmVnaXN0ZXJzLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfZGV2OworCX0KKworCWJwLT5yeF9wZW5kaW5nID0gQjQ0X0RFRl9SWF9SSU5HX1BFTkRJTkc7CisJYnAtPnR4X3BlbmRpbmcgPSBCNDRfREVGX1RYX1JJTkdfUEVORElORzsKKworCWRldi0+b3BlbiA9IGI0NF9vcGVuOworCWRldi0+c3RvcCA9IGI0NF9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGI0NF9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gYjQ0X2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGI0NF9zZXRfcnhfbW9kZTsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGI0NF9zZXRfbWFjX2FkZHI7CisJZGV2LT5kb19pb2N0bCA9IGI0NF9pb2N0bDsKKwlkZXYtPnR4X3RpbWVvdXQgPSBiNDRfdHhfdGltZW91dDsKKwlkZXYtPnBvbGwgPSBiNDRfcG9sbDsKKwlkZXYtPndlaWdodCA9IDY0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBCNDRfVFhfVElNRU9VVDsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gYjQ0X3BvbGxfY29udHJvbGxlcjsKKyNlbmRpZgorCWRldi0+Y2hhbmdlX210dSA9IGI0NF9jaGFuZ2VfbXR1OworCWRldi0+aXJxID0gcGRldi0+aXJxOworCVNFVF9FVEhUT09MX09QUyhkZXYsICZiNDRfZXRodG9vbF9vcHMpOworCisJZXJyID0gYjQ0X2dldF9pbnZhcmlhbnRzKGJwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlByb2JsZW0gZmV0Y2hpbmcgaW52YXJpYW50cyBvZiBjaGlwLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCisJYnAtPm1paV9pZi5kZXYgPSBkZXY7CisJYnAtPm1paV9pZi5tZGlvX3JlYWQgPSBiNDRfbWlpX3JlYWQ7CisJYnAtPm1paV9pZi5tZGlvX3dyaXRlID0gYjQ0X21paV93cml0ZTsKKwlicC0+bWlpX2lmLnBoeV9pZCA9IGJwLT5waHlfYWRkcjsKKwlicC0+bWlpX2lmLnBoeV9pZF9tYXNrID0gMHgxZjsKKwlicC0+bWlpX2lmLnJlZ19udW1fbWFzayA9IDB4MWY7CisKKwkvKiBCeSBkZWZhdWx0LCBhZHZlcnRpc2UgYWxsIHNwZWVkL2R1cGxleCBzZXR0aW5ncy4gKi8KKwlicC0+ZmxhZ3MgfD0gKEI0NF9GTEFHX0FEVl8xMEhBTEYgfCBCNDRfRkxBR19BRFZfMTBGVUxMIHwKKwkJICAgICAgQjQ0X0ZMQUdfQURWXzEwMEhBTEYgfCBCNDRfRkxBR19BRFZfMTAwRlVMTCk7CisKKwkvKiBCeSBkZWZhdWx0LCBhdXRvLW5lZ290aWF0ZSBQQVVTRS4gKi8KKwlicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfUEFVU0VfQVVUTzsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UsICIKKwkJICAgICAgICJhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCXBjaV9zYXZlX3N0YXRlKGJwLT5wZGV2KTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBCcm9hZGNvbSA0NDAwIDEwLzEwMEJhc2VUIEV0aGVybmV0ICIsIGRldi0+bmFtZSk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlMi4yeCVjIiwgZGV2LT5kZXZfYWRkcltpXSwKKwkJICAgICAgIGkgPT0gNSA/ICdcbicgOiAnOicpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfaW91bm1hcDoKKwlpb3VubWFwKGJwLT5yZWdzKTsKKworZXJyX291dF9mcmVlX2RldjoKKwlmcmVlX25ldGRldihkZXYpOworCitlcnJfb3V0X2ZyZWVfcmVzOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKK2Vycl9vdXRfZGlzYWJsZV9wZGV2OgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGI0NF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoZGV2KSB7CisJCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlpb3VubWFwKGJwLT5yZWdzKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJfQorfQorCitzdGF0aWMgaW50IGI0NF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisgICAgICAgICAgICAgICAgIHJldHVybiAwOworCisJZGVsX3RpbWVyX3N5bmMoJmJwLT50aW1lcik7CisKKwlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7IAorCisJYjQ0X2hhbHQoYnApOworCW5ldGlmX2NhcnJpZXJfb2ZmKGJwLT5kZXYpOyAKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGJwLT5kZXYpOworCWI0NF9mcmVlX3JpbmdzKGJwKTsKKworCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGI0NF9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19pcnEoJmJwLT5sb2NrKTsKKworCWI0NF9pbml0X3JpbmdzKGJwKTsKKwliNDRfaW5pdF9odyhicCk7CisJbmV0aWZfZGV2aWNlX2F0dGFjaChicC0+ZGV2KTsKKwlzcGluX3VubG9ja19pcnEoJmJwLT5sb2NrKTsKKworCWJwLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaOworCWFkZF90aW1lcigmYnAtPnRpbWVyKTsKKworCWI0NF9lbmFibGVfaW50cyhicCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBiNDRfZHJpdmVyID0geworCS5uYW1lCQk9IERSVl9NT0RVTEVfTkFNRSwKKwkuaWRfdGFibGUJPSBiNDRfcGNpX3RibCwKKwkucHJvYmUJCT0gYjQ0X2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYjQ0X3JlbW92ZV9vbmUpLAorICAgICAgICAuc3VzcGVuZCAgICAgICAgPSBiNDRfc3VzcGVuZCwKKyAgICAgICAgLnJlc3VtZSAgICAgICAgID0gYjQ0X3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGI0NF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmYjQ0X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBiNDRfY2xlYW51cCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYjQ0X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGI0NF9pbml0KTsKK21vZHVsZV9leGl0KGI0NF9jbGVhbnVwKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYjQ0LmggYi9kcml2ZXJzL25ldC9iNDQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWM0MGEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYjQ0LmgKQEAgLTAsMCArMSw0MjcgQEAKKyNpZm5kZWYgX0I0NF9ICisjZGVmaW5lIF9CNDRfSAorCisvKiBSZWdpc3RlciBsYXlvdXQuIChUaGVzZSBjb3JyZXNwb25kIHRvIHN0cnVjdCBfYmNtZW5ldHRyZWdzIGluIGJjbTQ0MDAuKSAqLworI2RlZmluZQlCNDRfREVWQ1RSTAkweDAwMDBVTCAvKiBEZXZpY2UgQ29udHJvbCAqLworI2RlZmluZSAgREVWQ1RSTF9NUE0JCTB4MDAwMDAwNDAgLyogTWFnaWMgUGFja2V0IFBNRSBFbmFibGUgKEIwIG9ubHkpICovCisjZGVmaW5lICBERVZDVFJMX1BGRQkJMHgwMDAwMDA4MCAvKiBQYXR0ZXJuIEZpbHRlcmluZyBFbmFibGUgKi8KKyNkZWZpbmUgIERFVkNUUkxfSVBQCQkweDAwMDAwNDAwIC8qIEludGVybmFsIEVQSFkgUHJlc2VudCAqLworI2RlZmluZSAgREVWQ1RSTF9FUFIJCTB4MDAwMDgwMDAgLyogRVBIWSBSZXNldCAqLworI2RlZmluZSAgREVWQ1RSTF9QTUUJCTB4MDAwMDEwMDAgLyogUEhZIE1vZGUgRW5hYmxlICovCisjZGVmaW5lICBERVZDVFJMX1BNQ0UJCTB4MDAwMDIwMDAgLyogUEhZIE1vZGUgQ2xvY2tzIEVuYWJsZSAqLworI2RlZmluZSAgREVWQ1RSTF9QQUREUgkJMHgwMDA3YzAwMCAvKiBQSFkgQWRkcmVzcyAqLworI2RlZmluZSAgREVWQ1RSTF9QQUREUl9TSElGVAkxOAorI2RlZmluZSBCNDRfQklTVF9TVEFUCTB4MDAwQ1VMIC8qIEJ1aWx0LUluIFNlbGYtVGVzdCBTdGF0dXMgKi8KKyNkZWZpbmUgQjQ0X1dLVVBfTEVOCTB4MDAxMFVMIC8qIFdha2V1cCBMZW5ndGggKi8KKyNkZWZpbmUgIFdLVVBfTEVOX1AwX01BU0sJMHgwMDAwMDA3ZiAvKiBQYXR0ZXJuIDAgKi8KKyNkZWZpbmUgIFdLVVBfTEVOX0QwCQkweDAwMDAwMDgwCisjZGVmaW5lICBXS1VQX0xFTl9QMV9NQVNLCTB4MDAwMDdmMDAgLyogUGF0dGVybiAxICovCisjZGVmaW5lICBXS1VQX0xFTl9QMV9TSElGVAk4CisjZGVmaW5lICBXS1VQX0xFTl9EMQkJMHgwMDAwODAwMAorI2RlZmluZSAgV0tVUF9MRU5fUDJfTUFTSwkweDAwN2YwMDAwIC8qIFBhdHRlcm4gMiAqLworI2RlZmluZSAgV0tVUF9MRU5fUDJfU0hJRlQJMTYKKyNkZWZpbmUgIFdLVVBfTEVOX0QyCQkweDAwMDAwMDAwCisjZGVmaW5lICBXS1VQX0xFTl9QM19NQVNLCTB4N2YwMDAwMDAgLyogUGF0dGVybiAzICovCisjZGVmaW5lICBXS1VQX0xFTl9QM19TSElGVAkyNAorI2RlZmluZSAgV0tVUF9MRU5fRDMJCTB4ODAwMDAwMDAKKyNkZWZpbmUgQjQ0X0lTVEFUCTB4MDAyMFVMIC8qIEludGVycnVwdCBTdGF0dXMgKi8KKyNkZWZpbmUgIElTVEFUX0xTCQkweDAwMDAwMDIwIC8qIExpbmsgQ2hhbmdlIChCMCBvbmx5KSAqLworI2RlZmluZSAgSVNUQVRfUE1FCQkweDAwMDAwMDQwIC8qIFBvd2VyIE1hbmFnZW1lbnQgRXZlbnQgKi8KKyNkZWZpbmUgIElTVEFUX1RPCQkweDAwMDAwMDgwIC8qIEdlbmVyYWwgUHVycG9zZSBUaW1lb3V0ICovCisjZGVmaW5lICBJU1RBVF9EU0NFCQkweDAwMDAwNDAwIC8qIERlc2NyaXB0b3IgRXJyb3IgKi8KKyNkZWZpbmUgIElTVEFUX0RBVEFFCQkweDAwMDAwODAwIC8qIERhdGEgRXJyb3IgKi8KKyNkZWZpbmUgIElTVEFUX0RQRQkJMHgwMDAwMTAwMCAvKiBEZXNjci4gUHJvdG9jb2wgRXJyb3IgKi8KKyNkZWZpbmUgIElTVEFUX1JEVQkJMHgwMDAwMjAwMCAvKiBSZWNlaXZlIERlc2NyLiBVbmRlcmZsb3cgKi8KKyNkZWZpbmUgIElTVEFUX1JGTwkJMHgwMDAwNDAwMCAvKiBSZWNlaXZlIEZJRk8gT3ZlcmZsb3cgKi8KKyNkZWZpbmUgIElTVEFUX1RGVQkJMHgwMDAwODAwMCAvKiBUcmFuc21pdCBGSUZPIFVuZGVyZmxvdyAqLworI2RlZmluZSAgSVNUQVRfUlgJCTB4MDAwMTAwMDAgLyogUlggSW50ZXJydXB0ICovCisjZGVmaW5lICBJU1RBVF9UWAkJMHgwMTAwMDAwMCAvKiBUWCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgIElTVEFUX0VNQUMJCTB4MDQwMDAwMDAgLyogRU1BQyBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgIElTVEFUX01JSV9XUklURQkweDA4MDAwMDAwIC8qIE1JSSBXcml0ZSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgIElTVEFUX01JSV9SRUFECQkweDEwMDAwMDAwIC8qIE1JSSBSZWFkIEludGVycnVwdCAqLworI2RlZmluZSAgSVNUQVRfRVJST1JTIChJU1RBVF9EU0NFfElTVEFUX0RBVEFFfElTVEFUX0RQRXxJU1RBVF9SRFV8SVNUQVRfUkZPfElTVEFUX1RGVSkKKyNkZWZpbmUgQjQ0X0lNQVNLCTB4MDAyNFVMIC8qIEludGVycnVwdCBNYXNrICovCisjZGVmaW5lICBJTUFTS19ERUYJCShJU1RBVF9FUlJPUlMgfCBJU1RBVF9UTyB8IElTVEFUX1JYIHwgSVNUQVRfVFgpCisjZGVmaW5lIEI0NF9HUFRJTUVSCTB4MDAyOFVMIC8qIEdlbmVyYWwgUHVycG9zZSBUaW1lciAqLworI2RlZmluZSBCNDRfQUREUl9MTwkweDAwODhVTCAvKiBFTkVUIEFkZHJlc3MgTG8gKEIwIG9ubHkpICovCisjZGVmaW5lIEI0NF9BRERSX0hJCTB4MDA4Q1VMIC8qIEVORVQgQWRkcmVzcyBIaSAoQjAgb25seSkgKi8KKyNkZWZpbmUgQjQ0X0ZJTFRfQUREUgkweDAwOTBVTCAvKiBFTkVUIEZpbHRlciBBZGRyZXNzICovCisjZGVmaW5lIEI0NF9GSUxUX0RBVEEJMHgwMDk0VUwgLyogRU5FVCBGaWx0ZXIgRGF0YSAqLworI2RlZmluZSBCNDRfVFhCVVJTVAkweDAwQTBVTCAvKiBUWCBNYXggQnVyc3QgTGVuZ3RoICovCisjZGVmaW5lIEI0NF9SWEJVUlNUCTB4MDBBNFVMIC8qIFJYIE1heCBCdXJzdCBMZW5ndGggKi8KKyNkZWZpbmUgQjQ0X01BQ19DVFJMCTB4MDBBOFVMIC8qIE1BQyBDb250cm9sICovCisjZGVmaW5lICBNQUNfQ1RSTF9DUkMzMl9FTkFCCTB4MDAwMDAwMDEgLyogQ1JDMzIgR2VuZXJhdGlvbiBFbmFibGUgKi8KKyNkZWZpbmUgIE1BQ19DVFJMX1BIWV9QRE9XTgkweDAwMDAwMDA0IC8qIE9uY2hpcCBFUEhZIFBvd2VyZG93biAqLworI2RlZmluZSAgTUFDX0NUUkxfUEhZX0VERVQJMHgwMDAwMDAwOCAvKiBPbmNoaXAgRVBIWSBFbmVyZ3kgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgIE1BQ19DVFJMX1BIWV9MRURDVFJMCTB4MDAwMDAwZTAgLyogT25jaGlwIEVQSFkgTEVEIENvbnRyb2wgKi8KKyNkZWZpbmUgIE1BQ19DVFJMX1BIWV9MRURDVFJMX1NISUZUIDUKKyNkZWZpbmUgQjQ0X01BQ19GTE9XCTB4MDBBQ1VMIC8qIE1BQyBGbG93IENvbnRyb2wgKi8KKyNkZWZpbmUgIE1BQ19GTE9XX1JYX0hJX1dBVEVSCTB4MDAwMDAwZmYgLyogUmVjZWl2ZSBGSUZPIEhJIFdhdGVyIE1hcmsgKi8KKyNkZWZpbmUgIE1BQ19GTE9XX1BBVVNFX0VOQUIJMHgwMDAwODAwMCAvKiBFbmFibGUgUGF1c2UgRnJhbWUgR2VuZXJhdGlvbiAqLworI2RlZmluZSBCNDRfUkNWX0xBWlkJMHgwMTAwVUwgLyogTGF6eSBJbnRlcnJ1cHQgQ29udHJvbCAqLworI2RlZmluZSAgUkNWX0xBWllfVE9fTUFTSwkweDAwZmZmZmZmIC8qIFRpbWVvdXQgKi8KKyNkZWZpbmUgIFJDVl9MQVpZX0ZDX01BU0sJMHhmZjAwMDAwMCAvKiBGcmFtZSBDb3VudCAqLworI2RlZmluZSAgUkNWX0xBWllfRkNfU0hJRlQJMjQKKyNkZWZpbmUgQjQ0X0RNQVRYX0NUUkwJMHgwMjAwVUwgLyogRE1BIFRYIENvbnRyb2wgKi8KKyNkZWZpbmUgIERNQVRYX0NUUkxfRU5BQkxFCTB4MDAwMDAwMDEgLyogRW5hYmxlICovCisjZGVmaW5lICBETUFUWF9DVFJMX1NVU1BFTkQJMHgwMDAwMDAwMiAvKiBTdWVwZW5kIFJlcXVlc3QgKi8KKyNkZWZpbmUgIERNQVRYX0NUUkxfTFBCQUNLCTB4MDAwMDAwMDQgLyogTG9vcGJhY2sgRW5hYmxlICovCisjZGVmaW5lICBETUFUWF9DVFJMX0ZBSVJQUklPUgkweDAwMDAwMDA4IC8qIEZhaXIgUHJpb3JpdHkgKi8KKyNkZWZpbmUgIERNQVRYX0NUUkxfRkxVU0gJMHgwMDAwMDAxMCAvKiBGbHVzaCBSZXF1ZXN0ICovCisjZGVmaW5lIEI0NF9ETUFUWF9BRERSCTB4MDIwNFVMIC8qIERNQSBUWCBEZXNjcmlwdG9yIFJpbmcgQWRkcmVzcyAqLworI2RlZmluZSBCNDRfRE1BVFhfUFRSCTB4MDIwOFVMIC8qIERNQSBUWCBMYXN0IFBvc3RlZCBEZXNjcmlwdG9yICovCisjZGVmaW5lIEI0NF9ETUFUWF9TVEFUCTB4MDIwQ1VMIC8qIERNQSBUWCBDdXJyZW50IEFjdGl2ZSBEZXNjLiArIFN0YXR1cyAqLworI2RlZmluZSAgRE1BVFhfU1RBVF9DRE1BU0sJMHgwMDAwMGZmZiAvKiBDdXJyZW50IERlc2NyaXB0b3IgTWFzayAqLworI2RlZmluZSAgRE1BVFhfU1RBVF9TTUFTSwkweDAwMDBmMDAwIC8qIFN0YXRlIE1hc2sgKi8KKyNkZWZpbmUgIERNQVRYX1NUQVRfU0RJU0FCTEVECTB4MDAwMDAwMDAgLyogU3RhdGUgRGlzYWJsZWQgKi8KKyNkZWZpbmUgIERNQVRYX1NUQVRfU0FDVElWRQkweDAwMDAxMDAwIC8qIFN0YXRlIEFjdGl2ZSAqLworI2RlZmluZSAgRE1BVFhfU1RBVF9TSURMRQkweDAwMDAyMDAwIC8qIFN0YXRlIElkbGUgV2FpdCAqLworI2RlZmluZSAgRE1BVFhfU1RBVF9TU1RPUFBFRAkweDAwMDAzMDAwIC8qIFN0YXRlIFN0b3BwZWQgKi8KKyNkZWZpbmUgIERNQVRYX1NUQVRfU1NVU1AJMHgwMDAwNDAwMCAvKiBTdGF0ZSBTdXNwZW5kIFBlbmRpbmcgKi8KKyNkZWZpbmUgIERNQVRYX1NUQVRfRU1BU0sJMHgwMDBmMDAwMCAvKiBFcnJvciBNYXNrICovCisjZGVmaW5lICBETUFUWF9TVEFUX0VOT05FCTB4MDAwMDAwMDAgLyogRXJyb3IgTm9uZSAqLworI2RlZmluZSAgRE1BVFhfU1RBVF9FRFBFCTB4MDAwMTAwMDAgLyogRXJyb3IgRGVzYy4gUHJvdG9jb2wgRXJyb3IgKi8KKyNkZWZpbmUgIERNQVRYX1NUQVRfRURGVQkweDAwMDIwMDAwIC8qIEVycm9yIERhdGEgRklGTyBVbmRlcnJ1biAqLworI2RlZmluZSAgRE1BVFhfU1RBVF9FQkVCUgkweDAwMDMwMDAwIC8qIEVycm9yIEJ1cyBFcnJvciBvbiBCdWZmZXIgUmVhZCAqLworI2RlZmluZSAgRE1BVFhfU1RBVF9FQkVEQQkweDAwMDQwMDAwIC8qIEVycm9yIEJ1cyBFcnJvciBvbiBEZXNjLiBBY2Nlc3MgKi8KKyNkZWZpbmUgIERNQVRYX1NUQVRfRkxVU0hFRAkweDAwMTAwMDAwIC8qIEZsdXNoZWQgKi8KKyNkZWZpbmUgQjQ0X0RNQVJYX0NUUkwJMHgwMjEwVUwgLyogRE1BIFJYIENvbnRyb2wgKi8KKyNkZWZpbmUgIERNQVJYX0NUUkxfRU5BQkxFCTB4MDAwMDAwMDEgLyogRW5hYmxlICovCisjZGVmaW5lICBETUFSWF9DVFJMX1JPTUFTSwkweDAwMDAwMGZlIC8qIFJlY2VpdmUgT2Zmc2V0IE1hc2sgKi8KKyNkZWZpbmUgIERNQVJYX0NUUkxfUk9TSElGVAkxIAkgICAvKiBSZWNlaXZlIE9mZnNldCBTaGlmdCAqLworI2RlZmluZSBCNDRfRE1BUlhfQUREUgkweDAyMTRVTCAvKiBETUEgUlggRGVzY3JpcHRvciBSaW5nIEFkZHJlc3MgKi8KKyNkZWZpbmUgQjQ0X0RNQVJYX1BUUgkweDAyMThVTCAvKiBETUEgUlggTGFzdCBQb3N0ZWQgRGVzY3JpcHRvciAqLworI2RlZmluZSBCNDRfRE1BUlhfU1RBVAkweDAyMUNVTCAvKiBETUEgUlggQ3VycmVudCBBY3RpdmUgRGVzYy4gKyBTdGF0dXMgKi8KKyNkZWZpbmUgIERNQVJYX1NUQVRfQ0RNQVNLCTB4MDAwMDBmZmYgLyogQ3VycmVudCBEZXNjcmlwdG9yIE1hc2sgKi8KKyNkZWZpbmUgIERNQVJYX1NUQVRfU01BU0sJMHgwMDAwZjAwMCAvKiBTdGF0ZSBNYXNrICovCisjZGVmaW5lICBETUFSWF9TVEFUX1NESVNBQkxFRAkweDAwMDAwMDAwIC8qIFN0YXRlIERpc2JhbGVkICovCisjZGVmaW5lICBETUFSWF9TVEFUX1NBQ1RJVkUJMHgwMDAwMTAwMCAvKiBTdGF0ZSBBY3RpdmUgKi8KKyNkZWZpbmUgIERNQVJYX1NUQVRfU0lETEUJMHgwMDAwMjAwMCAvKiBTdGF0ZSBJZGxlIFdhaXQgKi8KKyNkZWZpbmUgIERNQVJYX1NUQVRfU1NUT1BQRUQJMHgwMDAwMzAwMCAvKiBTdGF0ZSBTdG9wcGVkICovCisjZGVmaW5lICBETUFSWF9TVEFUX0VNQVNLCTB4MDAwZjAwMDAgLyogRXJyb3IgTWFzayAqLworI2RlZmluZSAgRE1BUlhfU1RBVF9FTk9ORQkweDAwMDAwMDAwIC8qIEVycm9yIE5vbmUgKi8KKyNkZWZpbmUgIERNQVJYX1NUQVRfRURQRQkweDAwMDEwMDAwIC8qIEVycm9yIERlc2MuIFByb3RvY29sIEVycm9yICovCisjZGVmaW5lICBETUFSWF9TVEFUX0VERk8JMHgwMDAyMDAwMCAvKiBFcnJvciBEYXRhIEZJRk8gT3ZlcmZsb3cgKi8KKyNkZWZpbmUgIERNQVJYX1NUQVRfRUJFQlcJMHgwMDAzMDAwMCAvKiBFcnJvciBCdXMgRXJyb3Igb24gQnVmZmVyIFdyaXRlICovCisjZGVmaW5lICBETUFSWF9TVEFUX0VCRURBCTB4MDAwNDAwMDAgLyogRXJyb3IgQnVzIEVycm9yIG9uIERlc2MuIEFjY2VzcyAqLworI2RlZmluZSBCNDRfRE1BRklGT19BRAkweDAyMjBVTCAvKiBETUEgRklGTyBEaWFnIEFkZHJlc3MgKi8KKyNkZWZpbmUgIERNQUZJRk9fQURfT01BU0sJMHgwMDAwZmZmZiAvKiBPZmZzZXQgTWFzayAqLworI2RlZmluZSAgRE1BRklGT19BRF9TTUFTSwkweDAwMGYwMDAwIC8qIFNlbGVjdCBNYXNrICovCisjZGVmaW5lICBETUFGSUZPX0FEX1NYREQJMHgwMDAwMDAwMCAvKiBTZWxlY3QgVHJhbnNtaXQgRE1BIERhdGEgKi8KKyNkZWZpbmUgIERNQUZJRk9fQURfU1hEUAkweDAwMDEwMDAwIC8qIFNlbGVjdCBUcmFuc21pdCBETUEgUG9pbnRlcnMgKi8KKyNkZWZpbmUgIERNQUZJRk9fQURfU1JERAkweDAwMDQwMDAwIC8qIFNlbGVjdCBSZWNlaXZlIERNQSBEYXRhICovCisjZGVmaW5lICBETUFGSUZPX0FEX1NSRFAJMHgwMDA1MDAwMCAvKiBTZWxlY3QgUmVjZWl2ZSBETUEgUG9pbnRlcnMgKi8KKyNkZWZpbmUgIERNQUZJRk9fQURfU1hGRAkweDAwMDgwMDAwIC8qIFNlbGVjdCBUcmFuc21pdCBGSUZPIERhdGEgKi8KKyNkZWZpbmUgIERNQUZJRk9fQURfU1hGUAkweDAwMDkwMDAwIC8qIFNlbGVjdCBUcmFuc21pdCBGSUZPIFBvaW50ZXJzICovCisjZGVmaW5lICBETUFGSUZPX0FEX1NSRkQJMHgwMDBjMDAwMCAvKiBTZWxlY3QgUmVjZWl2ZSBGSUZPIERhdGEgKi8KKyNkZWZpbmUgIERNQUZJRk9fQURfU1JGUAkweDAwMGMwMDAwIC8qIFNlbGVjdCBSZWNlaXZlIEZJRk8gUG9pbnRlcnMgKi8KKyNkZWZpbmUgQjQ0X0RNQUZJRk9fTE8JMHgwMjI0VUwgLyogRE1BIEZJRk8gRGlhZyBMb3cgRGF0YSAqLworI2RlZmluZSBCNDRfRE1BRklGT19ISQkweDAyMjhVTCAvKiBETUEgRklGTyBEaWFnIEhpZ2ggRGF0YSAqLworI2RlZmluZSBCNDRfUlhDT05GSUcJMHgwNDAwVUwgLyogRU1BQyBSWCBDb25maWcgKi8KKyNkZWZpbmUgIFJYQ09ORklHX0RCQ0FTVAkweDAwMDAwMDAxIC8qIERpc2FibGUgQnJvYWRjYXN0ICovCisjZGVmaW5lICBSWENPTkZJR19BTExNVUxUSQkweDAwMDAwMDAyIC8qIEFjY2VwdCBBbGwgTXVsdGljYXN0ICovCisjZGVmaW5lICBSWENPTkZJR19OT1JYX1dISUxFX1RYCTB4MDAwMDAwMDQgLyogUmVjZWl2ZSBEaXNhYmxlIFdoaWxlIFRyYW5zbWl0dGluZyAqLworI2RlZmluZSAgUlhDT05GSUdfUFJPTUlTQwkweDAwMDAwMDA4IC8qIFByb21pc2N1b3VzIEVuYWJsZSAqLworI2RlZmluZSAgUlhDT05GSUdfTFBCQUNLCTB4MDAwMDAwMTAgLyogTG9vcGJhY2sgRW5hYmxlICovCisjZGVmaW5lICBSWENPTkZJR19GTE9XCQkweDAwMDAwMDIwIC8qIEZsb3cgQ29udHJvbCBFbmFibGUgKi8KKyNkZWZpbmUgIFJYQ09ORklHX0ZMT1dfQUNDRVBUCTB4MDAwMDAwNDAgLyogQWNjZXB0IFVuaWNhc3QgRmxvdyBDb250cm9sIEZyYW1lICovCisjZGVmaW5lICBSWENPTkZJR19SRklMVAkJMHgwMDAwMDA4MCAvKiBSZWplY3QgRmlsdGVyICovCisjZGVmaW5lIEI0NF9SWE1BWExFTgkweDA0MDRVTCAvKiBFTUFDIFJYIE1heCBQYWNrZXQgTGVuZ3RoICovCisjZGVmaW5lIEI0NF9UWE1BWExFTgkweDA0MDhVTCAvKiBFTUFDIFRYIE1heCBQYWNrZXQgTGVuZ3RoICovCisjZGVmaW5lIEI0NF9NRElPX0NUUkwJMHgwNDEwVUwgLyogRU1BQyBNRElPIENvbnRyb2wgKi8KKyNkZWZpbmUgIE1ESU9fQ1RSTF9NQVhGX01BU0sJMHgwMDAwMDA3ZiAvKiBNREMgRnJlcXVlbmN5ICovCisjZGVmaW5lICBNRElPX0NUUkxfUFJFQU1CTEUJMHgwMDAwMDA4MCAvKiBNSUkgUHJlYW1ibGUgRW5hYmxlICovCisjZGVmaW5lIEI0NF9NRElPX0RBVEEJMHgwNDE0VUwgLyogRU1BQyBNRElPIERhdGEgKi8KKyNkZWZpbmUgIE1ESU9fREFUQV9EQVRBCQkweDAwMDBmZmZmIC8qIFIvVyBEYXRhICovCisjZGVmaW5lICBNRElPX0RBVEFfVEFfTUFTSwkweDAwMDMwMDAwIC8qIFR1cm5hcm91bmQgVmFsdWUgKi8KKyNkZWZpbmUgIE1ESU9fREFUQV9UQV9TSElGVAkxNgorI2RlZmluZSAgTURJT19UQV9WQUxJRAkJMgorI2RlZmluZSAgTURJT19EQVRBX1JBX01BU0sJMHgwMDdjMDAwMCAvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lICBNRElPX0RBVEFfUkFfU0hJRlQJMTgKKyNkZWZpbmUgIE1ESU9fREFUQV9QTURfTUFTSwkweDBmODAwMDAwIC8qIFBoeXNpY2FsIE1lZGlhIERldmljZSAqLworI2RlZmluZSAgTURJT19EQVRBX1BNRF9TSElGVAkyMworI2RlZmluZSAgTURJT19EQVRBX09QX01BU0sJMHgzMDAwMDAwMCAvKiBPcGNvZGUgKi8KKyNkZWZpbmUgIE1ESU9fREFUQV9PUF9TSElGVAkyOAorI2RlZmluZSAgTURJT19PUF9XUklURQkJMQorI2RlZmluZSAgTURJT19PUF9SRUFECQkyCisjZGVmaW5lICBNRElPX0RBVEFfU0JfTUFTSwkweGMwMDAwMDAwIC8qIFN0YXJ0IEJpdHMgKi8KKyNkZWZpbmUgIE1ESU9fREFUQV9TQl9TSElGVAkzMAorI2RlZmluZSAgTURJT19EQVRBX1NCX1NUQVJUCTB4NDAwMDAwMDAgLyogU3RhcnQgT2YgRnJhbWUgKi8KKyNkZWZpbmUgQjQ0X0VNQUNfSU1BU0sJMHgwNDE4VUwgLyogRU1BQyBJbnRlcnJ1cHQgTWFzayAqLworI2RlZmluZSBCNDRfRU1BQ19JU1RBVAkweDA0MUNVTCAvKiBFTUFDIEludGVycnVwdCBTdGF0dXMgKi8KKyNkZWZpbmUgIEVNQUNfSU5UX01JSQkJMHgwMDAwMDAwMSAvKiBNSUkgTURJTyBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgIEVNQUNfSU5UX01JQgkJMHgwMDAwMDAwMiAvKiBNSUIgSW50ZXJydXB0ICovCisjZGVmaW5lICBFTUFDX0lOVF9GTE9XCQkweDAwMDAwMDAzIC8qIEZsb3cgQ29udHJvbCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgQjQ0X0NBTV9EQVRBX0xPCTB4MDQyMFVMIC8qIEVNQUMgQ0FNIERhdGEgTG93ICovCisjZGVmaW5lIEI0NF9DQU1fREFUQV9ISQkweDA0MjRVTCAvKiBFTUFDIENBTSBEYXRhIEhpZ2ggKi8KKyNkZWZpbmUgIENBTV9EQVRBX0hJX1ZBTElECTB4MDAwMTAwMDAgLyogVmFsaWQgQml0ICovCisjZGVmaW5lIEI0NF9DQU1fQ1RSTAkweDA0MjhVTCAvKiBFTUFDIENBTSBDb250cm9sICovCisjZGVmaW5lICBDQU1fQ1RSTF9FTkFCTEUJMHgwMDAwMDAwMSAvKiBDQU0gRW5hYmxlICovCisjZGVmaW5lICBDQU1fQ1RSTF9NU0VMCQkweDAwMDAwMDAyIC8qIE1hc2sgU2VsZWN0ICovCisjZGVmaW5lICBDQU1fQ1RSTF9SRUFECQkweDAwMDAwMDA0IC8qIFJlYWQgKi8KKyNkZWZpbmUgIENBTV9DVFJMX1dSSVRFCQkweDAwMDAwMDA4IC8qIFJlYWQgKi8KKyNkZWZpbmUgIENBTV9DVFJMX0lOREVYX01BU0sJMHgwMDNmMDAwMCAvKiBJbmRleCBNYXNrICovCisjZGVmaW5lICBDQU1fQ1RSTF9JTkRFWF9TSElGVAkxNgorI2RlZmluZSAgQ0FNX0NUUkxfQlVTWQkJMHg4MDAwMDAwMCAvKiBDQU0gQnVzeSAqLworI2RlZmluZSBCNDRfRU5FVF9DVFJMCTB4MDQyQ1VMIC8qIEVNQUMgRU5FVCBDb250cm9sICovCisjZGVmaW5lICBFTkVUX0NUUkxfRU5BQkxFCTB4MDAwMDAwMDEgLyogRU1BQyBFbmFibGUgKi8KKyNkZWZpbmUgIEVORVRfQ1RSTF9ESVNBQkxFCTB4MDAwMDAwMDIgLyogRU1BQyBEaXNhYmxlICovCisjZGVmaW5lICBFTkVUX0NUUkxfU1JTVAkJMHgwMDAwMDAwNCAvKiBFTUFDIFNvZnQgUmVzZXQgKi8KKyNkZWZpbmUgIEVORVRfQ1RSTF9FUFNFTAkweDAwMDAwMDA4IC8qIEV4dGVybmFsIFBIWSBTZWxlY3QgKi8KKyNkZWZpbmUgQjQ0X1RYX0NUUkwJMHgwNDMwVUwgLyogRU1BQyBUWCBDb250cm9sICovCisjZGVmaW5lICBUWF9DVFJMX0RVUExFWAkJMHgwMDAwMDAwMSAvKiBGdWxsIER1cGxleCAqLworI2RlZmluZSAgVFhfQ1RSTF9GTU9ERQkJMHgwMDAwMDAwMiAvKiBGbG93IE1vZGUgKi8KKyNkZWZpbmUgIFRYX0NUUkxfU0JFTkFCCQkweDAwMDAwMDA0IC8qIFNpbmdsZSBCYWNrb2ZmIEVuYWJsZSAqLworI2RlZmluZSAgVFhfQ1RSTF9TTUFMTF9TTE9UCTB4MDAwMDAwMDggLyogU21hbGwgU2xvdHRpbWUgKi8KKyNkZWZpbmUgQjQ0X1RYX1dNQVJLCTB4MDQzNFVMIC8qIEVNQUMgVFggV2F0ZXJtYXJrICovCisjZGVmaW5lIEI0NF9NSUJfQ1RSTAkweDA0MzhVTCAvKiBFTUFDIE1JQiBDb250cm9sICovCisjZGVmaW5lICBNSUJfQ1RSTF9DTFJfT05fUkVBRAkweDAwMDAwMDAxIC8qIEF1dG9jbGVhciBvbiBSZWFkICovCisjZGVmaW5lIEI0NF9UWF9HT09EX08JMHgwNTAwVUwgLyogTUlCIFRYIEdvb2QgT2N0ZXRzICovCisjZGVmaW5lIEI0NF9UWF9HT09EX1AJMHgwNTA0VUwgLyogTUlCIFRYIEdvb2QgUGFja2V0cyAqLworI2RlZmluZSBCNDRfVFhfTwkweDA1MDhVTCAvKiBNSUIgVFggT2N0ZXRzICovCisjZGVmaW5lIEI0NF9UWF9QCTB4MDUwQ1VMIC8qIE1JQiBUWCBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9UWF9CQ0FTVAkweDA1MTBVTCAvKiBNSUIgVFggQnJvYWRjYXN0IFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1RYX01DQVNUCTB4MDUxNFVMIC8qIE1JQiBUWCBNdWx0aWNhc3QgUGFja2V0cyAqLworI2RlZmluZSBCNDRfVFhfNjQJMHgwNTE4VUwgLyogTUlCIFRYIDw9IDY0IGJ5dGUgUGFja2V0cyAqLworI2RlZmluZSBCNDRfVFhfNjVfMTI3CTB4MDUxQ1VMIC8qIE1JQiBUWCA2NSB0byAxMjcgYnl0ZSBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9UWF8xMjhfMjU1CTB4MDUyMFVMIC8qIE1JQiBUWCAxMjggdG8gMjU1IGJ5dGUgUGFja2V0cyAqLworI2RlZmluZSBCNDRfVFhfMjU2XzUxMQkweDA1MjRVTCAvKiBNSUIgVFggMjU2IHRvIDUxMSBieXRlIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1RYXzUxMl8xMDIzCTB4MDUyOFVMIC8qIE1JQiBUWCA1MTIgdG8gMTAyMyBieXRlIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1RYXzEwMjRfTUFYCTB4MDUyQ1VMIC8qIE1JQiBUWCAxMDI0IHRvIG1heCBieXRlIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1RYX0pBQkJFUgkweDA1MzBVTCAvKiBNSUIgVFggSmFiYmVyIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1RYX09TSVpFCTB4MDUzNFVMIC8qIE1JQiBUWCBPdmVyc2l6ZSBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9UWF9GUkFHCTB4MDUzOFVMIC8qIE1JQiBUWCBGcmFnbWVudCBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9UWF9VUlVOUwkweDA1M0NVTCAvKiBNSUIgVFggVW5kZXJydW5zICovCisjZGVmaW5lIEI0NF9UWF9UQ09MUwkweDA1NDBVTCAvKiBNSUIgVFggVG90YWwgQ29sbGlzaW9ucyAqLworI2RlZmluZSBCNDRfVFhfU0NPTFMJMHgwNTQ0VUwgLyogTUlCIFRYIFNpbmdsZSBDb2xsaXNpb25zICovCisjZGVmaW5lIEI0NF9UWF9NQ09MUwkweDA1NDhVTCAvKiBNSUIgVFggTXVsdGlwbGUgQ29sbGlzaW9ucyAqLworI2RlZmluZSBCNDRfVFhfRUNPTFMJMHgwNTRDVUwgLyogTUlCIFRYIEV4Y2Vzc2l2ZSBDb2xsaXNpb25zICovCisjZGVmaW5lIEI0NF9UWF9MQ09MUwkweDA1NTBVTCAvKiBNSUIgVFggTGF0ZSBDb2xsaXNpb25zICovCisjZGVmaW5lIEI0NF9UWF9ERUZFUkVECTB4MDU1NFVMIC8qIE1JQiBUWCBEZWZlcmVkIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1RYX0NMT1NUCTB4MDU1OFVMIC8qIE1JQiBUWCBDYXJyaWVyIExvc3QgKi8KKyNkZWZpbmUgQjQ0X1RYX1BBVVNFCTB4MDU1Q1VMIC8qIE1JQiBUWCBQYXVzZSBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9SWF9HT09EX08JMHgwNTgwVUwgLyogTUlCIFJYIEdvb2QgT2N0ZXRzICovCisjZGVmaW5lIEI0NF9SWF9HT09EX1AJMHgwNTg0VUwgLyogTUlCIFJYIEdvb2QgUGFja2V0cyAqLworI2RlZmluZSBCNDRfUlhfTwkweDA1ODhVTCAvKiBNSUIgUlggT2N0ZXRzICovCisjZGVmaW5lIEI0NF9SWF9QCTB4MDU4Q1VMIC8qIE1JQiBSWCBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9SWF9CQ0FTVAkweDA1OTBVTCAvKiBNSUIgUlggQnJvYWRjYXN0IFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1JYX01DQVNUCTB4MDU5NFVMIC8qIE1JQiBSWCBNdWx0aWNhc3QgUGFja2V0cyAqLworI2RlZmluZSBCNDRfUlhfNjQJMHgwNTk4VUwgLyogTUlCIFJYIDw9IDY0IGJ5dGUgUGFja2V0cyAqLworI2RlZmluZSBCNDRfUlhfNjVfMTI3CTB4MDU5Q1VMIC8qIE1JQiBSWCA2NSB0byAxMjcgYnl0ZSBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9SWF8xMjhfMjU1CTB4MDVBMFVMIC8qIE1JQiBSWCAxMjggdG8gMjU1IGJ5dGUgUGFja2V0cyAqLworI2RlZmluZSBCNDRfUlhfMjU2XzUxMQkweDA1QTRVTCAvKiBNSUIgUlggMjU2IHRvIDUxMSBieXRlIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1JYXzUxMl8xMDIzCTB4MDVBOFVMIC8qIE1JQiBSWCA1MTIgdG8gMTAyMyBieXRlIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1JYXzEwMjRfTUFYCTB4MDVBQ1VMIC8qIE1JQiBSWCAxMDI0IHRvIG1heCBieXRlIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1JYX0pBQkJFUgkweDA1QjBVTCAvKiBNSUIgUlggSmFiYmVyIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1JYX09TSVpFCTB4MDVCNFVMIC8qIE1JQiBSWCBPdmVyc2l6ZSBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9SWF9GUkFHCTB4MDVCOFVMIC8qIE1JQiBSWCBGcmFnbWVudCBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9SWF9NSVNTCTB4MDVCQ1VMIC8qIE1JQiBSWCBNaXNzZWQgUGFja2V0cyAqLworI2RlZmluZSBCNDRfUlhfQ1JDQQkweDA1QzBVTCAvKiBNSUIgUlggQ1JDIEFsaWduIEVycm9ycyAqLworI2RlZmluZSBCNDRfUlhfVVNJWkUJMHgwNUM0VUwgLyogTUlCIFJYIFVuZGVyc2l6ZSBQYWNrZXRzICovCisjZGVmaW5lIEI0NF9SWF9DUkMJMHgwNUM4VUwgLyogTUlCIFJYIENSQyBFcnJvcnMgKi8KKyNkZWZpbmUgQjQ0X1JYX0FMSUdOCTB4MDVDQ1VMIC8qIE1JQiBSWCBBbGlnbiBFcnJvcnMgKi8KKyNkZWZpbmUgQjQ0X1JYX1NZTQkweDA1RDBVTCAvKiBNSUIgUlggU3ltYm9sIEVycm9ycyAqLworI2RlZmluZSBCNDRfUlhfUEFVU0UJMHgwNUQ0VUwgLyogTUlCIFJYIFBhdXNlIFBhY2tldHMgKi8KKyNkZWZpbmUgQjQ0X1JYX05QQVVTRQkweDA1RDhVTCAvKiBNSUIgUlggTm9uLVBhdXNlIFBhY2tldHMgKi8KKworLyogU2lsaWNvbiBiYWNrcGxhbmUgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQjQ0X1NCSU1TVEFURQkweDBGOTBVTCAvKiBTQiBJbml0aWF0b3IgQWdlbnQgU3RhdGUgKi8KKyNkZWZpbmUgIFNCSU1TVEFURV9QQwkJMHgwMDAwMDAwZiAvKiBQaXBlIENvdW50ICovCisjZGVmaW5lICBTQklNU1RBVEVfQVBfTUFTSwkweDAwMDAwMDMwIC8qIEFyYml0cmF0aW9uIFByaW9yaXR5ICovCisjZGVmaW5lICBTQklNU1RBVEVfQVBfQk9USAkweDAwMDAwMDAwIC8qIFVzZSBib3RoIHRpbWVzbGljZXMgYW5kIHRva2VuICovCisjZGVmaW5lICBTQklNU1RBVEVfQVBfVFMJMHgwMDAwMDAxMCAvKiBVc2UgdGltZXNsaWNlcyBvbmx5ICovCisjZGVmaW5lICBTQklNU1RBVEVfQVBfVEsJMHgwMDAwMDAyMCAvKiBVc2UgdG9rZW4gb25seSAqLworI2RlZmluZSAgU0JJTVNUQVRFX0FQX1JTVgkweDAwMDAwMDMwIC8qIFJlc2VydmVkICovCisjZGVmaW5lICBTQklNU1RBVEVfSUJFCQkweDAwMDIwMDAwIC8qIEluIEJhbmQgRXJyb3IgKi8KKyNkZWZpbmUgIFNCSU1TVEFURV9UTwkJMHgwMDA0MDAwMCAvKiBUaW1lb3V0ICovCisjZGVmaW5lIEI0NF9TQklOVFZFQwkweDBGOTRVTCAvKiBTQiBJbnRlcnJ1cHQgTWFzayAqLworI2RlZmluZSAgU0JJTlRWRUNfUENJCQkweDAwMDAwMDAxIC8qIEVuYWJsZSBpbnRlcnJ1cHRzIGZvciBQQ0kgKi8KKyNkZWZpbmUgIFNCSU5UVkVDX0VORVQwCQkweDAwMDAwMDAyIC8qIEVuYWJsZSBpbnRlcnJ1cHRzIGZvciBlbmV0IDAgKi8KKyNkZWZpbmUgIFNCSU5UVkVDX0lMSU5FMjAJMHgwMDAwMDAwNCAvKiBFbmFibGUgaW50ZXJydXB0cyBmb3IgaWxpbmUyMCAqLworI2RlZmluZSAgU0JJTlRWRUNfQ09ERUMJCTB4MDAwMDAwMDggLyogRW5hYmxlIGludGVycnVwdHMgZm9yIHY5MCBjb2RlYyAqLworI2RlZmluZSAgU0JJTlRWRUNfVVNCCQkweDAwMDAwMDEwIC8qIEVuYWJsZSBpbnRlcnJ1cHRzIGZvciB1c2IgKi8KKyNkZWZpbmUgIFNCSU5UVkVDX0VYVElGCQkweDAwMDAwMDIwIC8qIEVuYWJsZSBpbnRlcnJ1cHRzIGZvciBleHRlcm5hbCBpL2YgKi8KKyNkZWZpbmUgIFNCSU5UVkVDX0VORVQxCQkweDAwMDAwMDQwIC8qIEVuYWJsZSBpbnRlcnJ1cHRzIGZvciBlbmV0IDEgKi8KKyNkZWZpbmUgQjQ0X1NCVE1TTE9XCTB4MEY5OFVMIC8qIFNCIFRhcmdldCBTdGF0ZSBMb3cgKi8KKyNkZWZpbmUgIFNCVE1TTE9XX1JFU0VUCQkweDAwMDAwMDAxIC8qIFJlc2V0ICovCisjZGVmaW5lICBTQlRNU0xPV19SRUpFQ1QJMHgwMDAwMDAwMiAvKiBSZWplY3QgKi8KKyNkZWZpbmUgIFNCVE1TTE9XX0NMT0NLCQkweDAwMDEwMDAwIC8qIENsb2NrIEVuYWJsZSAqLworI2RlZmluZSAgU0JUTVNMT1dfRkdDCQkweDAwMDIwMDAwIC8qIEZvcmNlIEdhdGVkIENsb2NrcyBPbiAqLworI2RlZmluZSAgU0JUTVNMT1dfUEUJCTB4NDAwMDAwMDAgLyogUG93ZXIgTWFuYWdlbWVudCBFbmFibGUgKi8KKyNkZWZpbmUgIFNCVE1TTE9XX0JFCQkweDgwMDAwMDAwIC8qIEJJU1QgRW5hYmxlICovCisjZGVmaW5lIEI0NF9TQlRNU0hJR0gJMHgwRjlDVUwgLyogU0IgVGFyZ2V0IFN0YXRlIEhpZ2ggKi8KKyNkZWZpbmUgIFNCVE1TSElHSF9TRVJSCQkweDAwMDAwMDAxIC8qIFMtZXJyb3IgKi8KKyNkZWZpbmUgIFNCVE1TSElHSF9JTlQJCTB4MDAwMDAwMDIgLyogSW50ZXJydXB0ICovCisjZGVmaW5lICBTQlRNU0hJR0hfQlVTWQkJMHgwMDAwMDAwNCAvKiBCdXN5ICovCisjZGVmaW5lICBTQlRNU0hJR0hfR0NSCQkweDIwMDAwMDAwIC8qIEdhdGVkIENsb2NrIFJlcXVlc3QgKi8KKyNkZWZpbmUgIFNCVE1TSElHSF9CSVNURgkweDQwMDAwMDAwIC8qIEJJU1QgRmFpbGVkICovCisjZGVmaW5lICBTQlRNU0hJR0hfQklTVEQJMHg4MDAwMDAwMCAvKiBCSVNUIERvbmUgKi8KKyNkZWZpbmUgQjQ0X1NCSURISUdICTB4MEZGQ1VMIC8qIFNCIElkZW50aWZpY2F0aW9uIEhpZ2ggKi8KKyNkZWZpbmUgIFNCSURISUdIX1JDX01BU0sJMHgwMDAwMDAwZiAvKiBSZXZpc2lvbiBDb2RlICovCisjZGVmaW5lICBTQklESElHSF9DQ19NQVNLCTB4MDAwMGZmZjAgLyogQ29yZSBDb2RlICovCisjZGVmaW5lICBTQklESElHSF9DQ19TSElGVAk0CisjZGVmaW5lICBTQklESElHSF9WQ19NQVNLCTB4ZmZmZjAwMDAgLyogVmVuZG9yIENvZGUgKi8KKyNkZWZpbmUgIFNCSURISUdIX1ZDX1NISUZUCTE2CisKKy8qIFNTQiBQQ0kgY29uZmlnIHNwYWNlIHJlZ2lzdGVycy4gICovCisjZGVmaW5lCVNTQl9CQVIwX1dJTgkJMHg4MAorI2RlZmluZQlTU0JfQkFSMV9XSU4JCTB4ODQKKyNkZWZpbmUJU1NCX1NQUk9NX0NPTlRST0wJMHg4OAorI2RlZmluZQlTU0JfQkFSMV9DT05UUk9MCTB4OGMKKworLyogU1NCIGNvcmUgYW5kIGhvc3QgY29udHJvbCByZWdpc3RlcnMuICAqLworI2RlZmluZSBTU0JfQ09OVFJPTAkJMHgwMDAwVUwKKyNkZWZpbmUgU1NCX0FSQkNPTlRST0wJCTB4MDAxMFVMCisjZGVmaW5lIFNTQl9JU1RBVAkJMHgwMDIwVUwKKyNkZWZpbmUgU1NCX0lNQVNLCQkweDAwMjRVTAorI2RlZmluZSBTU0JfTUJPWAkJMHgwMDI4VUwKKyNkZWZpbmUgU1NCX0JDQVNUX0FERFIJCTB4MDA1MFVMCisjZGVmaW5lIFNTQl9CQ0FTVF9EQVRBCQkweDAwNTRVTAorI2RlZmluZSBTU0JfUENJX1RSQU5TXzAJCTB4MDEwMFVMCisjZGVmaW5lIFNTQl9QQ0lfVFJBTlNfMQkJMHgwMTA0VUwKKyNkZWZpbmUgU1NCX1BDSV9UUkFOU18yCQkweDAxMDhVTAorI2RlZmluZSBTU0JfU1BST00JCTB4MDgwMFVMCisKKyNkZWZpbmUgU1NCX1BDSV9NRU0JCTB4MDAwMDAwMDAKKyNkZWZpbmUgU1NCX1BDSV9JTwkJMHgwMDAwMDAwMQorI2RlZmluZSBTU0JfUENJX0NGRzAJCTB4MDAwMDAwMDIKKyNkZWZpbmUgU1NCX1BDSV9DRkcxCQkweDAwMDAwMDAzCisjZGVmaW5lIFNTQl9QQ0lfUFJFRgkJMHgwMDAwMDAwNAorI2RlZmluZSBTU0JfUENJX0JVUlNUCQkweDAwMDAwMDA4CisjZGVmaW5lIFNTQl9QQ0lfTUFTSzAJCTB4ZmMwMDAwMDAKKyNkZWZpbmUgU1NCX1BDSV9NQVNLMQkJMHhmYzAwMDAwMAorI2RlZmluZSBTU0JfUENJX01BU0syCQkweGMwMDAwMDAwCisKKy8qIDQ0MDAgUEhZIHJlZ2lzdGVycyAqLworI2RlZmluZSBCNDRfTUlJX0FVWENUUkwJCTI0CS8qIEF1eGlsaWFyeSBDb250cm9sICovCisjZGVmaW5lICBNSUlfQVVYQ1RSTF9EVVBMRVgJMHgwMDAxICAvKiBGdWxsIER1cGxleCAqLworI2RlZmluZSAgTUlJX0FVWENUUkxfU1BFRUQJMHgwMDAyICAvKiAxPTEwME1icHMsIDA9MTBNYnBzICovCisjZGVmaW5lICBNSUlfQVVYQ1RSTF9GT1JDRUQJMHgwMDA0CS8qIEZvcmNlZCAxMC8xMDAgKi8KKyNkZWZpbmUgQjQ0X01JSV9BTEVEQ1RSTAkyNgkvKiBBY3Rpdml0eSBMRUQgKi8KKyNkZWZpbmUgIE1JSV9BTEVEQ1RSTF9BTExNU0sJMHg3ZmZmCisjZGVmaW5lIEI0NF9NSUlfVExFRENUUkwJMjcJLyogVHJhZmZpYyBNZXRlciBMRUQgKi8KKyNkZWZpbmUgIE1JSV9UTEVEQ1RSTF9FTkFCTEUJMHgwMDQwCisKK3N0cnVjdCBkbWFfZGVzYyB7CisJdTMyCWN0cmw7CisJdTMyCWFkZHI7Cit9OworCisvKiBUaGVyZSBhcmUgb25seSAxMiBiaXRzIGluIHRoZSBETUEgZW5naW5lIGZvciBkZXNjcmlwdG9yIG9mZnNldHRpbmcKKyAqIHNvIHRoZSB0YWJsZSBtdXN0IGJlIGFsaWduZWQgb24gYSBib3VuZGFyeSBvZiB0aGlzLgorICovCisjZGVmaW5lIERNQV9UQUJMRV9CWVRFUwkJNDA5NgorCisjZGVmaW5lIERFU0NfQ1RSTF9MRU4JMHgwMDAwMWZmZgorI2RlZmluZSBERVNDX0NUUkxfQ01BU0sJMHgwZmYwMDAwMCAvKiBDb3JlIHNwZWNpZmljIGJpdHMgKi8KKyNkZWZpbmUgREVTQ19DVFJMX0VPVAkweDEwMDAwMDAwIC8qIEVuZCBvZiBUYWJsZSAqLworI2RlZmluZSBERVNDX0NUUkxfSU9DCTB4MjAwMDAwMDAgLyogSW50ZXJydXB0IE9uIENvbXBsZXRpb24gKi8KKyNkZWZpbmUgREVTQ19DVFJMX0VPRgkweDQwMDAwMDAwIC8qIEVuZCBvZiBGcmFtZSAqLworI2RlZmluZSBERVNDX0NUUkxfU09GCTB4ODAwMDAwMDAgLyogU3RhcnQgb2YgRnJhbWUgKi8KKworI2RlZmluZSBSWF9DT1BZX1RIUkVTSE9MRCAgCTI1NgorCitzdHJ1Y3QgcnhfaGVhZGVyIHsKKwl1MTYJbGVuOworCXUxNglmbGFnczsKKwl1MTYJcGFkWzEyXTsKK307CisjZGVmaW5lIFJYX0hFQURFUl9MRU4JMjgKKworI2RlZmluZSBSWF9GTEFHX09GSUZPCTB4MDAwMDAwMDEgLyogRklGTyBPdmVyZmxvdyAqLworI2RlZmluZSBSWF9GTEFHX0NSQ0VSUgkweDAwMDAwMDAyIC8qIENSQyBFcnJvciAqLworI2RlZmluZSBSWF9GTEFHX1NFUlIJMHgwMDAwMDAwNCAvKiBSZWNlaXZlIFN5bWJvbCBFcnJvciAqLworI2RlZmluZSBSWF9GTEFHX09ERAkweDAwMDAwMDA4IC8qIEZyYW1lIGhhcyBvZGQgbnVtYmVyIG9mIG5pYmJsZXMgKi8KKyNkZWZpbmUgUlhfRkxBR19MQVJHRQkweDAwMDAwMDEwIC8qIEZyYW1lIGlzID4gUlggTUFYIExlbmd0aCAqLworI2RlZmluZSBSWF9GTEFHX01DQVNUCTB4MDAwMDAwMjAgLyogRGVzdCBpcyBNdWx0aWNhc3QgQWRkcmVzcyAqLworI2RlZmluZSBSWF9GTEFHX0JDQVNUCTB4MDAwMDAwNDAgLyogRGVzdCBpcyBCcm9hZGNhc3QgQWRkcmVzcyAqLworI2RlZmluZSBSWF9GTEFHX01JU1MJMHgwMDAwMDA4MCAvKiBSZWNlaXZlZCBkdWUgdG8gcHJvbWlzYyBtb2RlICovCisjZGVmaW5lIFJYX0ZMQUdfTEFTVAkweDAwMDAwODAwIC8qIExhc3QgYnVmZmVyIGluIGZyYW1lICovCisjZGVmaW5lIFJYX0ZMQUdfRVJST1JTCShSWF9GTEFHX09ERCB8IFJYX0ZMQUdfU0VSUiB8IFJYX0ZMQUdfQ1JDRVJSIHwgUlhfRkxBR19PRklGTykKKworc3RydWN0IHJpbmdfaW5mbyB7CisJc3RydWN0IHNrX2J1ZmYJCSpza2I7CisJREVDTEFSRV9QQ0lfVU5NQVBfQUREUihtYXBwaW5nKTsKK307CisKKyNkZWZpbmUgQjQ0X01DQVNUX1RBQkxFX1NJWkUJMzIKKworLyogU1cgY29weSBvZiBkZXZpY2Ugc3RhdGlzdGljcywga2VwdCB1cCB0byBkYXRlIGJ5IHBlcmlvZGljIHRpbWVyCisgKiB3aGljaCBwcm9iZXMgSFcgdmFsdWVzLiAgTXVzdCBoYXZlIHNhbWUgcmVsYXRpdmUgbGF5b3V0IGFzIEhXCisgKiByZWdpc3RlciBhYm92ZSwgYmVjYXVzZSBiNDRfc3RhdHNfdXBkYXRlIGRlcGVuZHMgdXBvbiB0aGlzLgorICovCitzdHJ1Y3QgYjQ0X2h3X3N0YXRzIHsKKwl1MzIgdHhfZ29vZF9vY3RldHMsIHR4X2dvb2RfcGt0cywgdHhfb2N0ZXRzOworCXUzMiB0eF9wa3RzLCB0eF9icm9hZGNhc3RfcGt0cywgdHhfbXVsdGljYXN0X3BrdHM7CisJdTMyIHR4X2xlbl82NCwgdHhfbGVuXzY1X3RvXzEyNywgdHhfbGVuXzEyOF90b18yNTU7CisJdTMyIHR4X2xlbl8yNTZfdG9fNTExLCB0eF9sZW5fNTEyX3RvXzEwMjMsIHR4X2xlbl8xMDI0X3RvX21heDsKKwl1MzIgdHhfamFiYmVyX3BrdHMsIHR4X292ZXJzaXplX3BrdHMsIHR4X2ZyYWdtZW50X3BrdHM7CisJdTMyIHR4X3VuZGVycnVucywgdHhfdG90YWxfY29scywgdHhfc2luZ2xlX2NvbHM7CisJdTMyIHR4X211bHRpcGxlX2NvbHMsIHR4X2V4Y2Vzc2l2ZV9jb2xzLCB0eF9sYXRlX2NvbHM7CisJdTMyIHR4X2RlZmVyZWQsIHR4X2NhcnJpZXJfbG9zdCwgdHhfcGF1c2VfcGt0czsKKwl1MzIgX19wYWQxWzhdOworCisJdTMyIHJ4X2dvb2Rfb2N0ZXRzLCByeF9nb29kX3BrdHMsIHJ4X29jdGV0czsKKwl1MzIgcnhfcGt0cywgcnhfYnJvYWRjYXN0X3BrdHMsIHJ4X211bHRpY2FzdF9wa3RzOworCXUzMiByeF9sZW5fNjQsIHJ4X2xlbl82NV90b18xMjcsIHJ4X2xlbl8xMjhfdG9fMjU1OworCXUzMiByeF9sZW5fMjU2X3RvXzUxMSwgcnhfbGVuXzUxMl90b18xMDIzLCByeF9sZW5fMTAyNF90b19tYXg7CisJdTMyIHJ4X2phYmJlcl9wa3RzLCByeF9vdmVyc2l6ZV9wa3RzLCByeF9mcmFnbWVudF9wa3RzOworCXUzMiByeF9taXNzZWRfcGt0cywgcnhfY3JjX2FsaWduX2VycnMsIHJ4X3VuZGVyc2l6ZTsKKwl1MzIgcnhfY3JjX2VycnMsIHJ4X2FsaWduX2VycnMsIHJ4X3N5bWJvbF9lcnJzOworCXUzMiByeF9wYXVzZV9wa3RzLCByeF9ub25wYXVzZV9wa3RzOworfTsKKworc3RydWN0IGI0NCB7CisJc3BpbmxvY2tfdAkJbG9jazsKKworCXUzMgkJCWltYXNrLCBpc3RhdDsKKworCXN0cnVjdCBkbWFfZGVzYwkJKnJ4X3JpbmcsICp0eF9yaW5nOworCisJdTMyCQkJdHhfcHJvZCwgdHhfY29uczsKKwl1MzIJCQlyeF9wcm9kLCByeF9jb25zOworCisJc3RydWN0IHJpbmdfaW5mbwkqcnhfYnVmZmVyczsKKwlzdHJ1Y3QgcmluZ19pbmZvCSp0eF9idWZmZXJzOworCisJdTMyCQkJZG1hX29mZnNldDsKKwl1MzIJCQlmbGFnczsKKyNkZWZpbmUgQjQ0X0ZMQUdfSU5JVF9DT01QTEVURQkweDAwMDAwMDAxCisjZGVmaW5lIEI0NF9GTEFHX0JVR0dZX1RYUFRSCTB4MDAwMDAwMDIKKyNkZWZpbmUgQjQ0X0ZMQUdfUkVPUkRFUl9CVUcJMHgwMDAwMDAwNAorI2RlZmluZSBCNDRfRkxBR19QQVVTRV9BVVRPCTB4MDAwMDgwMDAKKyNkZWZpbmUgQjQ0X0ZMQUdfRlVMTF9EVVBMRVgJMHgwMDAxMDAwMAorI2RlZmluZSBCNDRfRkxBR18xMDBfQkFTRV9UCTB4MDAwMjAwMDAKKyNkZWZpbmUgQjQ0X0ZMQUdfVFhfUEFVU0UJMHgwMDA0MDAwMAorI2RlZmluZSBCNDRfRkxBR19SWF9QQVVTRQkweDAwMDgwMDAwCisjZGVmaW5lIEI0NF9GTEFHX0ZPUkNFX0xJTksJMHgwMDEwMDAwMAorI2RlZmluZSBCNDRfRkxBR19BRFZfMTBIQUxGCTB4MDEwMDAwMDAKKyNkZWZpbmUgQjQ0X0ZMQUdfQURWXzEwRlVMTAkweDAyMDAwMDAwCisjZGVmaW5lIEI0NF9GTEFHX0FEVl8xMDBIQUxGCTB4MDQwMDAwMDAKKyNkZWZpbmUgQjQ0X0ZMQUdfQURWXzEwMEZVTEwJMHgwODAwMDAwMAorI2RlZmluZSBCNDRfRkxBR19JTlRFUk5BTF9QSFkJMHgxMDAwMDAwMAorCisJdTMyCQkJcnhfb2Zmc2V0OworCisJdTMyCQkJbXNnX2VuYWJsZTsKKworCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOworCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CisJc3RydWN0IGI0NF9od19zdGF0cwlod19zdGF0czsKKworCXZvaWQgX19pb21lbQkJKnJlZ3M7CisJc3RydWN0IHBjaV9kZXYJCSpwZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CisKKwlkbWFfYWRkcl90CQlyeF9yaW5nX2RtYSwgdHhfcmluZ19kbWE7CisKKwl1MzIJCQlyeF9wZW5kaW5nOworCXUzMgkJCXR4X3BlbmRpbmc7CisJdTgJCQlwaHlfYWRkcjsKKwl1OAkJCWNvcmVfdW5pdDsKKworCXN0cnVjdCBtaWlfaWZfaW5mbwltaWlfaWY7Cit9OworCisjZW5kaWYgLyogX0I0NF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibWFjLmMgYi9kcml2ZXJzL25ldC9ibWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QyYmU3YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2JtYWMuYwpAQCAtMCwwICsxLDE3MDggQEAKKy8qCisgKiBOZXR3b3JrIGRldmljZSBkcml2ZXIgZm9yIHRoZSBCTUFDIGV0aGVybmV0IGNvbnRyb2xsZXIgb24KKyAqIEFwcGxlIFBvd2VybWFjcy4gIEFzc3VtZXMgaXQncyB1bmRlciBhIERCRE1BIGNvbnRyb2xsZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4IFJhbmR5IEdvYmJlbC4KKyAqCisgKiBNYXkgMTk5OSwgQWwgVmlybzogcHJvcGVyIHJlbGVhc2Ugb2YgL3Byb2MvbmV0L2JtYWMgZW50cnksIHN3aXRjaGVkIHRvCisgKiBkeW5hbWljIHByb2NmcyBpbm9kZS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL2RiZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNpby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgImJtYWMuaCIKKworI2RlZmluZSB0cnVuY19wYWdlKHgpCSgodm9pZCAqKSgoKHVuc2lnbmVkIGxvbmcpKHgpKSAmIH4oKHVuc2lnbmVkIGxvbmcpKFBBR0VfU0laRSAtIDEpKSkpCisjZGVmaW5lIHJvdW5kX3BhZ2UoeCkJdHJ1bmNfcGFnZSgoKHVuc2lnbmVkIGxvbmcpKHgpKSArICgodW5zaWduZWQgbG9uZykoUEFHRV9TSVpFIC0gMSkpKQorCisvKgorICogQ1JDIHBvbHlub21pYWwgLSB1c2VkIGluIHdvcmtpbmcgb3V0IG11bHRpY2FzdCBmaWx0ZXIgYml0cy4KKyAqLworI2RlZmluZSBFTkVUX0NSQ1BPTFkgMHgwNGMxMWRiNworCisvKiBzd2l0Y2ggdG8gdXNlIG11bHRpY2FzdCBjb2RlIGxpZnRlZCBmcm9tIHN1bmhtZSBkcml2ZXIgKi8KKyNkZWZpbmUgU1VOSE1FX01VTFRJQ0FTVAorCisjZGVmaW5lIE5fUlhfUklORwk2NAorI2RlZmluZSBOX1RYX1JJTkcJMzIKKyNkZWZpbmUgTUFYX1RYX0FDVElWRQkxCisjZGVmaW5lIEVUSEVSQ1JDCTQKKyNkZWZpbmUgRVRIRVJNSU5QQUNLRVQJNjQKKyNkZWZpbmUgRVRIRVJNVFUJMTUwMAorI2RlZmluZSBSWF9CVUZMRU4JKEVUSEVSTVRVICsgMTQgKyBFVEhFUkNSQyArIDIpCisjZGVmaW5lIFRYX1RJTUVPVVQJSFoJLyogMSBzZWNvbmQgKi8KKworLyogQml0cyBpbiB0cmFuc21pdCBETUEgc3RhdHVzICovCisjZGVmaW5lIFRYX0RNQV9FUlIJMHg4MAorCisjZGVmaW5lIFhYREVCVUcoYXJncykKKworc3RydWN0IGJtYWNfZGF0YSB7CisJLyogdm9sYXRpbGUgc3RydWN0IGJtYWMgKmJtYWM7ICovCisJc3RydWN0IHNrX2J1ZmZfaGVhZCAqcXVldWU7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqdHhfZG1hOworCWludCB0eF9kbWFfaW50cjsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpyeF9kbWE7CisJaW50IHJ4X2RtYV9pbnRyOworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKnR4X2NtZHM7CS8qIHhtaXQgZG1hIGNvbW1hbmQgbGlzdCAqLworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKnJ4X2NtZHM7CS8qIHJlY3YgZG1hIGNvbW1hbmQgbGlzdCAqLworCXN0cnVjdCBtYWNpb19kZXYgKm1kZXY7CisJaW50IGlzX2JtYWNfcGx1czsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfYnVmc1tOX1JYX1JJTkddOworCWludCByeF9maWxsOworCWludCByeF9lbXB0eTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfYnVmc1tOX1RYX1JJTkddOworCWludCB0eF9maWxsOworCWludCB0eF9lbXB0eTsKKwl1bnNpZ25lZCBjaGFyIHR4X2Z1bGx1cDsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0eF90aW1lb3V0OworCWludCB0aW1lb3V0X2FjdGl2ZTsKKwlpbnQgc2xlZXBpbmc7CisJaW50IG9wZW5lZDsKKwl1bnNpZ25lZCBzaG9ydCBoYXNoX3VzZV9jb3VudFs2NF07CisJdW5zaWduZWQgc2hvcnQgaGFzaF90YWJsZV9tYXNrWzRdOworCXNwaW5sb2NrX3QgbG9jazsKK307CisKKyNpZiAwIC8qIE1vdmUgdGhhdCB0byBldGh0b29sICovCisKK3R5cGVkZWYgc3RydWN0IGJtYWNfcmVnX2VudHJ5IHsKKwljaGFyICpuYW1lOworCXVuc2lnbmVkIHNob3J0IHJlZ19vZmZzZXQ7Cit9IGJtYWNfcmVnX2VudHJ5X3Q7CisKKyNkZWZpbmUgTl9SRUdfRU5UUklFUyAzMQorCitzdGF0aWMgYm1hY19yZWdfZW50cnlfdCByZWdfZW50cmllc1tOX1JFR19FTlRSSUVTXSA9IHsKKwl7Ik1FTUFERCIsIE1FTUFERH0sCisJeyJNRU1EQVRBSEkiLCBNRU1EQVRBSEl9LAorCXsiTUVNREFUQUxPIiwgTUVNREFUQUxPfSwKKwl7IlRYUE5UUiIsIFRYUE5UUn0sCisJeyJSWFBOVFIiLCBSWFBOVFJ9LAorCXsiSVBHMSIsIElQRzF9LAorCXsiSVBHMiIsIElQRzJ9LAorCXsiQUxJTUlUIiwgQUxJTUlUfSwKKwl7IlNMT1QiLCBTTE9UfSwKKwl7IlBBTEVOIiwgUEFMRU59LAorCXsiUEFQQVQiLCBQQVBBVH0sCisJeyJUWFNGRCIsIFRYU0ZEfSwKKwl7IkpBTSIsIEpBTX0sCisJeyJUWENGRyIsIFRYQ0ZHfSwKKwl7IlRYTUFYIiwgVFhNQVh9LAorCXsiVFhNSU4iLCBUWE1JTn0sCisJeyJQQVJFRyIsIFBBUkVHfSwKKwl7IkRDTlQiLCBEQ05UfSwKKwl7Ik5DQ05UIiwgTkNDTlR9LAorCXsiTlRDTlQiLCBOVENOVH0sCisJeyJFWENOVCIsIEVYQ05UfSwKKwl7IkxUQ05UIiwgTFRDTlR9LAorCXsiVFhTTSIsIFRYU019LAorCXsiUlhDRkciLCBSWENGR30sCisJeyJSWE1BWCIsIFJYTUFYfSwKKwl7IlJYTUlOIiwgUlhNSU59LAorCXsiRlJDTlQiLCBGUkNOVH0sCisJeyJBRUNOVCIsIEFFQ05UfSwKKwl7IkZFQ05UIiwgRkVDTlR9LAorCXsiUlhTTSIsIFJYU019LAorCXsiUlhDViIsIFJYQ1Z9Cit9OworCisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmJtYWNfZW1lcmdlbmN5X3J4YnVmOworCisvKgorICogTnVtYmVyIG9mIGJ5dGVzIG9mIHByaXZhdGUgZGF0YSBwZXIgQk1BQzogYWxsb3cgZW5vdWdoIGZvcgorICogdGhlIHJ4IGFuZCB0eCBkbWEgY29tbWFuZHMgcGx1cyBhIGJyYW5jaCBkbWEgY29tbWFuZCBlYWNoLAorICogYW5kIGFub3RoZXIgMTYgYnl0ZXMgdG8gYWxsb3cgdXMgdG8gYWxpZ24gdGhlIGRtYSBjb21tYW5kCisgKiBidWZmZXJzIG9uIGEgMTYgYnl0ZSBib3VuZGFyeS4KKyAqLworI2RlZmluZSBQUklWX0JZVEVTCShzaXplb2Yoc3RydWN0IGJtYWNfZGF0YSkgXAorCSsgKE5fUlhfUklORyArIE5fVFhfUklORyArIDQpICogc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpIFwKKwkrIHNpemVvZihzdHJ1Y3Qgc2tfYnVmZl9oZWFkKSkKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYml0cmV2KHVuc2lnbmVkIGNoYXIgYik7CitzdGF0aWMgaW50IGJtYWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYm1hY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYm1hY190cmFuc21pdF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmJtYWNfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBibWFjX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBibWFjX3Jlc2V0X2FuZF9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBibWFjX3N0YXJ0X2NoaXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBibWFjX2luaXRfY2hpcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGJtYWNfaW5pdF9yZWdpc3RlcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBibWFjX2VuYWJsZV9hbmRfcmVzZXRfY2hpcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYm1hY19zZXRfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBibWFjX21pc2NfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBibWFjX3R4ZG1hX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaXJxcmV0dXJuX3QgYm1hY19yeGRtYV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgYm1hY19zZXRfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGJtYWNfdHhfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIGludCBibWFjX291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGJtYWNfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKyNkZWZpbmUJREJETUFfU0VUKHgpCSggKCh4KSB8ICh4KSA8PCAxNikgKQorI2RlZmluZQlEQkRNQV9DTEVBUih4KQkoICh4KSA8PCAxNikKKworc3RhdGljIGlubGluZSB2b2lkCitkYmRtYV9zdDMyKHZvbGF0aWxlIF9fdTMyIF9faW9tZW0gKmEsIHVuc2lnbmVkIGxvbmcgeCkKK3sKKwlfX2FzbV9fIHZvbGF0aWxlKCAic3R3YnJ4ICUwLDAsJTEiIDogOiAiciIgKHgpLCAiciIgKGEpIDogIm1lbW9yeSIpOworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitkYmRtYV9sZDMyKHZvbGF0aWxlIF9fdTMyIF9faW9tZW0gKmEpCit7CisJX191MzIgc3dhcDsKKwlfX2FzbV9fIHZvbGF0aWxlICgibHdicnggJTAsMCwlMSIgOiAgIj1yIiAoc3dhcCkgOiAiciIgKGEpKTsKKwlyZXR1cm4gc3dhcDsKK30KKworc3RhdGljIHZvaWQKK2RiZG1hX2NvbnRpbnVlKHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKmRtYXApCit7CisJZGJkbWFfc3QzMigmZG1hcC0+Y29udHJvbCwKKwkJICAgREJETUFfU0VUKFJVTnxXQUtFKSB8IERCRE1BX0NMRUFSKFBBVVNFfERFQUQpKTsKKwllaWVpbygpOworfQorCitzdGF0aWMgdm9pZAorZGJkbWFfcmVzZXQodm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqZG1hcCkKK3sKKwlkYmRtYV9zdDMyKCZkbWFwLT5jb250cm9sLAorCQkgICBEQkRNQV9DTEVBUihBQ1RJVkV8REVBRHxXQUtFfEZMVVNIfFBBVVNFfFJVTikpOworCWVpZWlvKCk7CisJd2hpbGUgKGRiZG1hX2xkMzIoJmRtYXAtPnN0YXR1cykgJiBSVU4pCisJCWVpZWlvKCk7Cit9CisKK3N0YXRpYyB2b2lkCitkYmRtYV9zZXRjbWQodm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqY3AsCisJICAgICB1bnNpZ25lZCBzaG9ydCBjbWQsIHVuc2lnbmVkIGNvdW50LCB1bnNpZ25lZCBsb25nIGFkZHIsCisJICAgICB1bnNpZ25lZCBsb25nIGNtZF9kZXApCit7CisJb3V0X2xlMTYoJmNwLT5jb21tYW5kLCBjbWQpOworCW91dF9sZTE2KCZjcC0+cmVxX2NvdW50LCBjb3VudCk7CisJb3V0X2xlMzIoJmNwLT5waHlfYWRkciwgYWRkcik7CisJb3V0X2xlMzIoJmNwLT5jbWRfZGVwLCBjbWRfZGVwKTsKKwlvdXRfbGUxNigmY3AtPnhmZXJfc3RhdHVzLCAwKTsKKwlvdXRfbGUxNigmY3AtPnJlc19jb3VudCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgYm13cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHJlZ19vZmZzZXQsIHVuc2lnbmVkIGRhdGEgKQoreworCW91dF9sZTE2KCh2b2lkIF9faW9tZW0gKilkZXYtPmJhc2VfYWRkciArIHJlZ19vZmZzZXQsIGRhdGEpOworfQorCisKK3N0YXRpYyBpbmxpbmUKK3ZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGJtcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHJlZ19vZmZzZXQgKQoreworCXJldHVybiBpbl9sZTE2KCh2b2lkIF9faW9tZW0gKilkZXYtPmJhc2VfYWRkciArIHJlZ19vZmZzZXQpOworfQorCitzdGF0aWMgdm9pZAorYm1hY19lbmFibGVfYW5kX3Jlc2V0X2NoaXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYm1hY19kYXRhICpicCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqcmQgPSBicC0+cnhfZG1hOworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKnRkID0gYnAtPnR4X2RtYTsKKworCWlmIChyZCkKKwkJZGJkbWFfcmVzZXQocmQpOworCWlmICh0ZCkKKwkJZGJkbWFfcmVzZXQodGQpOworCisJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfQk1BQ19FTkFCTEUsIG1hY2lvX2dldF9vZl9ub2RlKGJwLT5tZGV2KSwgMCwgMSk7Cit9CisKKyNkZWZpbmUgTUlGREVMQVkJdWRlbGF5KDEwKQorCitzdGF0aWMgdW5zaWduZWQgaW50CitibWFjX21pZl9yZWFkYml0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmIpCit7CisJdW5zaWduZWQgaW50IHZhbCA9IDA7CisKKwl3aGlsZSAoLS1uYiA+PSAwKSB7CisJCWJtd3JpdGUoZGV2LCBNSUZDU1IsIDApOworCQlNSUZERUxBWTsKKwkJaWYgKGJtcmVhZChkZXYsIE1JRkNTUikgJiA4KQorCQkJdmFsIHw9IDEgPDwgbmI7CisJCWJtd3JpdGUoZGV2LCBNSUZDU1IsIDEpOworCQlNSUZERUxBWTsKKwl9CisJYm13cml0ZShkZXYsIE1JRkNTUiwgMCk7CisJTUlGREVMQVk7CisJYm13cml0ZShkZXYsIE1JRkNTUiwgMSk7CisJTUlGREVMQVk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQKK2JtYWNfbWlmX3dyaXRlYml0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgbmIpCit7CisJaW50IGI7CisKKwl3aGlsZSAoLS1uYiA+PSAwKSB7CisJCWIgPSAodmFsICYgKDEgPDwgbmIpKT8gNjogNDsKKwkJYm13cml0ZShkZXYsIE1JRkNTUiwgYik7CisJCU1JRkRFTEFZOworCQlibXdyaXRlKGRldiwgTUlGQ1NSLCBifDEpOworCQlNSUZERUxBWTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2JtYWNfbWlmX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGFkZHIpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWJtd3JpdGUoZGV2LCBNSUZDU1IsIDQpOworCU1JRkRFTEFZOworCWJtYWNfbWlmX3dyaXRlYml0cyhkZXYsIH4wVSwgMzIpOworCWJtYWNfbWlmX3dyaXRlYml0cyhkZXYsIDYsIDQpOworCWJtYWNfbWlmX3dyaXRlYml0cyhkZXYsIGFkZHIsIDEwKTsKKwlibXdyaXRlKGRldiwgTUlGQ1NSLCAyKTsKKwlNSUZERUxBWTsKKwlibXdyaXRlKGRldiwgTUlGQ1NSLCAxKTsKKwlNSUZERUxBWTsKKwl2YWwgPSBibWFjX21pZl9yZWFkYml0cyhkZXYsIDE3KTsKKwlibXdyaXRlKGRldiwgTUlGQ1NSLCA0KTsKKwlNSUZERUxBWTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZAorYm1hY19taWZfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGFkZHIsIHVuc2lnbmVkIGludCB2YWwpCit7CisJYm13cml0ZShkZXYsIE1JRkNTUiwgNCk7CisJTUlGREVMQVk7CisJYm1hY19taWZfd3JpdGViaXRzKGRldiwgfjBVLCAzMik7CisJYm1hY19taWZfd3JpdGViaXRzKGRldiwgNSwgNCk7CisJYm1hY19taWZfd3JpdGViaXRzKGRldiwgYWRkciwgMTApOworCWJtYWNfbWlmX3dyaXRlYml0cyhkZXYsIDIsIDIpOworCWJtYWNfbWlmX3dyaXRlYml0cyhkZXYsIHZhbCwgMTYpOworCWJtYWNfbWlmX3dyaXRlYml0cyhkZXYsIDMsIDIpOworfQorCitzdGF0aWMgdm9pZAorYm1hY19pbml0X3JlZ2lzdGVycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBibWFjX2RhdGEgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCByZWdWYWx1ZTsKKwl1bnNpZ25lZCBzaG9ydCAqcFdvcmQxNjsKKwlpbnQgaTsKKworCS8qIFhYREVCVUcoKCJibWFjOiBlbnRlciBpbml0X3JlZ2lzdGVyc1xuIikpOyAqLworCisJYm13cml0ZShkZXYsIFJYUlNULCBSeFJlc2V0VmFsdWUpOworCWJtd3JpdGUoZGV2LCBUWFJTVCwgVHhSZXNldEJpdCk7CisKKwlpID0gMTAwOworCWRvIHsKKwkJLS1pOworCQl1ZGVsYXkoMTAwMDApOworCQlyZWdWYWx1ZSA9IGJtcmVhZChkZXYsIFRYUlNUKTsgLyogd2FpdCBmb3IgcmVzZXQgdG8gY2xlYXIuLmFja25vd2xlZGdlICovCisJfSB3aGlsZSAoKHJlZ1ZhbHVlICYgVHhSZXNldEJpdCkgJiYgaSA+IDApOworCisJaWYgKCFicC0+aXNfYm1hY19wbHVzKSB7CisJCXJlZ1ZhbHVlID0gYm1yZWFkKGRldiwgWENWUklGKTsKKwkJcmVnVmFsdWUgfD0gQ2xrQml0IHwgU2VyaWFsTW9kZSB8IENPTEFjdGl2ZUxvdzsKKwkJYm13cml0ZShkZXYsIFhDVlJJRiwgcmVnVmFsdWUpOworCQl1ZGVsYXkoMTAwMDApOworCX0KKworCWJtd3JpdGUoZGV2LCBSU0VFRCwgKHVuc2lnbmVkIHNob3J0KTB4MTk2OCk7CQkKKworCXJlZ1ZhbHVlID0gYm1yZWFkKGRldiwgWElGQyk7CisJcmVnVmFsdWUgfD0gVHhPdXRwdXRFbmFibGU7CisJYm13cml0ZShkZXYsIFhJRkMsIHJlZ1ZhbHVlKTsKKworCWJtcmVhZChkZXYsIFBBUkVHKTsKKworCS8qIHNldCBjb2xsaXNpb24gY291bnRlcnMgdG8gMCAqLworCWJtd3JpdGUoZGV2LCBOQ0NOVCwgMCk7CisJYm13cml0ZShkZXYsIE5UQ05ULCAwKTsKKwlibXdyaXRlKGRldiwgRVhDTlQsIDApOworCWJtd3JpdGUoZGV2LCBMVENOVCwgMCk7CisKKwkvKiBzZXQgcnggY291bnRlcnMgdG8gMCAqLworCWJtd3JpdGUoZGV2LCBGUkNOVCwgMCk7CisJYm13cml0ZShkZXYsIExFQ05ULCAwKTsKKwlibXdyaXRlKGRldiwgQUVDTlQsIDApOworCWJtd3JpdGUoZGV2LCBGRUNOVCwgMCk7CisJYm13cml0ZShkZXYsIFJYQ1YsIDApOworCisJLyogc2V0IHR4IGZpZm8gaW5mb3JtYXRpb24gKi8KKwlibXdyaXRlKGRldiwgVFhUSCwgNCk7CS8qIDQgb2N0ZXRzIGJlZm9yZSB0eCBzdGFydHMgKi8KKworCWJtd3JpdGUoZGV2LCBUWEZJRk9DU1IsIDApOwkvKiBmaXJzdCBkaXNhYmxlIHR4RklGTyAqLworCWJtd3JpdGUoZGV2LCBUWEZJRk9DU1IsIFR4RklGT0VuYWJsZSApOworCisJLyogc2V0IHJ4IGZpZm8gaW5mb3JtYXRpb24gKi8KKwlibXdyaXRlKGRldiwgUlhGSUZPQ1NSLCAwKTsJLyogZmlyc3QgZGlzYWJsZSByeEZJRk8gKi8KKwlibXdyaXRlKGRldiwgUlhGSUZPQ1NSLCBSeEZJRk9FbmFibGUgKTsKKworCS8vYm13cml0ZShkZXYsIFRYQ0ZHLCBUeE1BQ0VuYWJsZSk7CSAgICAgICAJLyogVHhOZXZlckdpdmVVcCBtYXliZSBsYXRlciAqLworCWJtcmVhZChkZXYsIFNUQVRVUyk7CQkvKiByZWFkIGl0IGp1c3QgdG8gY2xlYXIgaXQgKi8KKworCS8qIHplcm8gb3V0IHRoZSBjaGlwIEhhc2ggRmlsdGVyIHJlZ2lzdGVycyAqLworCWZvciAoaT0wOyBpPDQ7IGkrKykgYnAtPmhhc2hfdGFibGVfbWFza1tpXSA9IDA7CisJYm13cml0ZShkZXYsIEJIQVNIMywgYnAtPmhhc2hfdGFibGVfbWFza1swXSk7IAkvKiBiaXRzIDE1IC0gMCAqLworCWJtd3JpdGUoZGV2LCBCSEFTSDIsIGJwLT5oYXNoX3RhYmxlX21hc2tbMV0pOyAJLyogYml0cyAzMSAtIDE2ICovCisJYm13cml0ZShkZXYsIEJIQVNIMSwgYnAtPmhhc2hfdGFibGVfbWFza1syXSk7IAkvKiBiaXRzIDQ3IC0gMzIgKi8KKwlibXdyaXRlKGRldiwgQkhBU0gwLCBicC0+aGFzaF90YWJsZV9tYXNrWzNdKTsgCS8qIGJpdHMgNjMgLSA0OCAqLworCQorCXBXb3JkMTYgPSAodW5zaWduZWQgc2hvcnQgKilkZXYtPmRldl9hZGRyOworCWJtd3JpdGUoZGV2LCBNQUREMCwgKnBXb3JkMTYrKyk7CisJYm13cml0ZShkZXYsIE1BREQxLCAqcFdvcmQxNisrKTsKKwlibXdyaXRlKGRldiwgTUFERDIsICpwV29yZDE2KTsKKworCWJtd3JpdGUoZGV2LCBSWENGRywgUnhDUkNOb1N0cmlwIHwgUnhIYXNoRmlsdGVyRW5hYmxlIHwgUnhSZWplY3RPd25QYWNrZXRzKTsKKworCWJtd3JpdGUoZGV2LCBJTlRESVNBQkxFLCBFbmFibGVOb3JtYWwpOworCisJcmV0dXJuOworfQorCisjaWYgMAorc3RhdGljIHZvaWQKK2JtYWNfZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJYm13cml0ZShkZXYsIElOVERJU0FCTEUsIERpc2FibGVBbGwpOworfQorCitzdGF0aWMgdm9pZAorYm1hY19lbmFibGVfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWJtd3JpdGUoZGV2LCBJTlRESVNBQkxFLCBFbmFibGVOb3JtYWwpOworfQorI2VuZGlmCisKKworc3RhdGljIHZvaWQKK2JtYWNfc3RhcnRfY2hpcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBibWFjX2RhdGEgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpyZCA9IGJwLT5yeF9kbWE7CisJdW5zaWduZWQgc2hvcnQJb2xkQ29uZmlnOworCisJLyogZW5hYmxlIHJ4IGRtYSBjaGFubmVsICovCisJZGJkbWFfY29udGludWUocmQpOworCisJb2xkQ29uZmlnID0gYm1yZWFkKGRldiwgVFhDRkcpOwkJCisJYm13cml0ZShkZXYsIFRYQ0ZHLCBvbGRDb25maWcgfCBUeE1BQ0VuYWJsZSApOworCisJLyogdHVybiBvbiByeCBwbHVzIGFueSBvdGhlciBiaXRzIGFscmVhZHkgb24gKHByb21pc2N1b3VzIHBvc3NpYmx5KSAqLworCW9sZENvbmZpZyA9IGJtcmVhZChkZXYsIFJYQ0ZHKTsJCQorCWJtd3JpdGUoZGV2LCBSWENGRywgb2xkQ29uZmlnIHwgUnhNQUNFbmFibGUgKTsKKwl1ZGVsYXkoMjAwMDApOworfQorCitzdGF0aWMgdm9pZAorYm1hY19pbml0X3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGludCBhZGRyOworCXN0cnVjdCBibWFjX2RhdGEgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXByaW50ayhLRVJOX0RFQlVHICJwaHkgcmVnaXN0ZXJzOiIpOworCWZvciAoYWRkciA9IDA7IGFkZHIgPCAzMjsgKythZGRyKSB7CisJCWlmICgoYWRkciAmIDcpID09IDApCisJCQlwcmludGsoIlxuIiBLRVJOX0RFQlVHKTsKKwkJcHJpbnRrKCIgJS40eCIsIGJtYWNfbWlmX3JlYWQoZGV2LCBhZGRyKSk7CisJfQorCXByaW50aygiXG4iKTsKKwlpZiAoYnAtPmlzX2JtYWNfcGx1cykgeworCQl1bnNpZ25lZCBpbnQgY2FwYWJsZSwgY3RybDsKKworCQljdHJsID0gYm1hY19taWZfcmVhZChkZXYsIDApOworCQljYXBhYmxlID0gKChibWFjX21pZl9yZWFkKGRldiwgMSkgJiAweGY4MDApID4+IDYpIHwgMTsKKwkJaWYgKGJtYWNfbWlmX3JlYWQoZGV2LCA0KSAhPSBjYXBhYmxlCisJCSAgICB8fCAoY3RybCAmIDB4MTAwMCkgPT0gMCkgeworCQkJYm1hY19taWZfd3JpdGUoZGV2LCA0LCBjYXBhYmxlKTsKKwkJCWJtYWNfbWlmX3dyaXRlKGRldiwgMCwgMHgxMjAwKTsKKwkJfSBlbHNlCisJCQlibWFjX21pZl93cml0ZShkZXYsIDAsIDB4MTAwMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBibWFjX2luaXRfY2hpcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWJtYWNfaW5pdF9waHkoZGV2KTsKKwlibWFjX2luaXRfcmVnaXN0ZXJzKGRldik7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYm1hY19zdXNwZW5kKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIHUzMiBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2ID0gbWFjaW9fZ2V0X2RydmRhdGEobWRldik7CQorCXN0cnVjdCBibWFjX2RhdGEgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHNob3J0IGNvbmZpZzsKKwlpbnQgaTsKKwkKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJLyogcHJvbGx5IHNob3VsZCB3YWl0IGZvciBkbWEgdG8gZmluaXNoICYgdHVybiBvZmYgdGhlIGNoaXAgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlpZiAoYnAtPnRpbWVvdXRfYWN0aXZlKSB7CisJCWRlbF90aW1lcigmYnAtPnR4X3RpbWVvdXQpOworCQlicC0+dGltZW91dF9hY3RpdmUgPSAwOworCX0KKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJZGlzYWJsZV9pcnEoYnAtPnR4X2RtYV9pbnRyKTsKKwlkaXNhYmxlX2lycShicC0+cnhfZG1hX2ludHIpOworCWJwLT5zbGVlcGluZyA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlpZiAoYnAtPm9wZW5lZCkgeworCQl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpyZCA9IGJwLT5yeF9kbWE7CisJCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKnRkID0gYnAtPnR4X2RtYTsKKwkJCQorCQljb25maWcgPSBibXJlYWQoZGV2LCBSWENGRyk7CisJCWJtd3JpdGUoZGV2LCBSWENGRywgKGNvbmZpZyAmIH5SeE1BQ0VuYWJsZSkpOworCQljb25maWcgPSBibXJlYWQoZGV2LCBUWENGRyk7CisgICAgICAgCQlibXdyaXRlKGRldiwgVFhDRkcsIChjb25maWcgJiB+VHhNQUNFbmFibGUpKTsKKwkJYm13cml0ZShkZXYsIElOVERJU0FCTEUsIERpc2FibGVBbGwpOyAvKiBkaXNhYmxlIGFsbCBpbnRycyAqLworICAgICAgIAkJLyogZGlzYWJsZSByeCBhbmQgdHggZG1hICovCisgICAgICAgCQlzdF9sZTMyKCZyZC0+Y29udHJvbCwgREJETUFfQ0xFQVIoUlVOfFBBVVNFfEZMVVNIfFdBS0UpKTsJLyogY2xlYXIgcnVuIGJpdCAqLworICAgICAgIAkJc3RfbGUzMigmdGQtPmNvbnRyb2wsIERCRE1BX0NMRUFSKFJVTnxQQVVTRXxGTFVTSHxXQUtFKSk7CS8qIGNsZWFyIHJ1biBiaXQgKi8KKyAgICAgICAJCS8qIGZyZWUgc29tZSBza2IncyAqLworICAgICAgIAkJZm9yIChpPTA7IGk8Tl9SWF9SSU5HOyBpKyspIHsKKyAgICAgICAJCQlpZiAoYnAtPnJ4X2J1ZnNbaV0gIT0gTlVMTCkgeworICAgICAgIAkJCQlkZXZfa2ZyZWVfc2tiKGJwLT5yeF9idWZzW2ldKTsKKyAgICAgICAJCQkJYnAtPnJ4X2J1ZnNbaV0gPSBOVUxMOworICAgICAgIAkJCX0KKyAgICAgICAJCX0KKyAgICAgICAJCWZvciAoaSA9IDA7IGk8Tl9UWF9SSU5HOyBpKyspIHsKKwkJCWlmIChicC0+dHhfYnVmc1tpXSAhPSBOVUxMKSB7CisJCSAgICAgICAJCWRldl9rZnJlZV9za2IoYnAtPnR4X2J1ZnNbaV0pOworCSAgICAgICAJCQlicC0+dHhfYnVmc1tpXSA9IE5VTEw7CisJCSAgICAgICAJfQorCQl9CisJfQorICAgICAgIAlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9CTUFDX0VOQUJMRSwgbWFjaW9fZ2V0X29mX25vZGUoYnAtPm1kZXYpLCAwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibWFjX3Jlc3VtZShzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXYgPSBtYWNpb19nZXRfZHJ2ZGF0YShtZGV2KTsJCisJc3RydWN0IGJtYWNfZGF0YSAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogc2VlIGlmIHRoaXMgaXMgZW5vdWdoICovCisJaWYgKGJwLT5vcGVuZWQpCisJCWJtYWNfcmVzZXRfYW5kX2VuYWJsZShkZXYpOworCisJZW5hYmxlX2lycShkZXYtPmlycSk7CisgICAgICAgCWVuYWJsZV9pcnEoYnAtPnR4X2RtYV9pbnRyKTsKKyAgICAgICAJZW5hYmxlX2lycShicC0+cnhfZG1hX2ludHIpOworICAgICAgIAluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIGludCBibWFjX3NldF9hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisJc3RydWN0IGJtYWNfZGF0YSAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGNoYXIgKnAgPSBhZGRyOworCXVuc2lnbmVkIHNob3J0ICpwV29yZDE2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlYWERFQlVHKCgiYm1hYzogZW50ZXIgc2V0X2FkZHJlc3NcbiIpKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyArK2kpIHsKKwkJZGV2LT5kZXZfYWRkcltpXSA9IHBbaV07CisJfQorCS8qIGxvYWQgdXAgdGhlIGhhcmR3YXJlIGFkZHJlc3MgKi8KKwlwV29yZDE2ICA9ICh1bnNpZ25lZCBzaG9ydCAqKWRldi0+ZGV2X2FkZHI7CisJYm13cml0ZShkZXYsIE1BREQwLCAqcFdvcmQxNisrKTsKKwlibXdyaXRlKGRldiwgTUFERDEsICpwV29yZDE2KyspOworCWJtd3JpdGUoZGV2LCBNQUREMiwgKnBXb3JkMTYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKwlYWERFQlVHKCgiYm1hYzogZXhpdCBzZXRfYWRkcmVzc1xuIikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYm1hY19zZXRfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBibWFjX2RhdGEgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJaWYgKGJwLT50aW1lb3V0X2FjdGl2ZSkKKwkJZGVsX3RpbWVyKCZicC0+dHhfdGltZW91dCk7CisJYnAtPnR4X3RpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyBUWF9USU1FT1VUOworCWJwLT50eF90aW1lb3V0LmZ1bmN0aW9uID0gYm1hY190eF90aW1lb3V0OworCWJwLT50eF90aW1lb3V0LmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworCWFkZF90aW1lcigmYnAtPnR4X3RpbWVvdXQpOworCWJwLT50aW1lb3V0X2FjdGl2ZSA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK2JtYWNfY29uc3RydWN0X3htdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICpjcCkKK3sKKwl2b2lkICp2YWRkcjsKKwl1bnNpZ25lZCBsb25nIGJhZGRyOworCXVuc2lnbmVkIGxvbmcgbGVuOworCisJbGVuID0gc2tiLT5sZW47CisJdmFkZHIgPSBza2ItPmRhdGE7CisJYmFkZHIgPSB2aXJ0X3RvX2J1cyh2YWRkcik7CisKKwlkYmRtYV9zZXRjbWQoY3AsIChPVVRQVVRfTEFTVCB8IElOVFJfQUxXQVlTIHwgV0FJVF9JRkNMUiksIGxlbiwgYmFkZHIsIDApOworfQorCitzdGF0aWMgdm9pZAorYm1hY19jb25zdHJ1Y3RfcnhidWZmKHN0cnVjdCBza19idWZmICpza2IsIHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKmNwKQoreworCXVuc2lnbmVkIGNoYXIgKmFkZHIgPSBza2I/IHNrYi0+ZGF0YTogYm1hY19lbWVyZ2VuY3lfcnhidWY7CisKKwlkYmRtYV9zZXRjbWQoY3AsIChJTlBVVF9MQVNUIHwgSU5UUl9BTFdBWVMpLCBSWF9CVUZMRU4sCisJCSAgICAgdmlydF90b19idXMoYWRkciksIDApOworfQorCisvKiBCaXQtcmV2ZXJzZSBvbmUgYnl0ZSBvZiBhbiBldGhlcm5ldCBoYXJkd2FyZSBhZGRyZXNzLiAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIKK2JpdHJldih1bnNpZ25lZCBjaGFyIGIpCit7CisJaW50IGQgPSAwLCBpOworCisJZm9yIChpID0gMDsgaSA8IDg7ICsraSwgYiA+Pj0gMSkKKwkJZCA9IChkIDw8IDEpIHwgKGIgJiAxKTsKKwlyZXR1cm4gZDsKK30KKworCitzdGF0aWMgdm9pZAorYm1hY19pbml0X3R4X3Jpbmcoc3RydWN0IGJtYWNfZGF0YSAqYnApCit7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqdGQgPSBicC0+dHhfZG1hOworCisJbWVtc2V0KChjaGFyICopYnAtPnR4X2NtZHMsIDAsIChOX1RYX1JJTkcrMSkgKiBzaXplb2Yoc3RydWN0IGRiZG1hX2NtZCkpOworCisJYnAtPnR4X2VtcHR5ID0gMDsKKwlicC0+dHhfZmlsbCA9IDA7CisJYnAtPnR4X2Z1bGx1cCA9IDA7CisKKwkvKiBwdXQgYSBicmFuY2ggYXQgdGhlIGVuZCBvZiB0aGUgdHggY29tbWFuZCBsaXN0ICovCisJZGJkbWFfc2V0Y21kKCZicC0+dHhfY21kc1tOX1RYX1JJTkddLAorCQkgICAgIChEQkRNQV9OT1AgfCBCUl9BTFdBWVMpLCAwLCAwLCB2aXJ0X3RvX2J1cyhicC0+dHhfY21kcykpOworCisJLyogcmVzZXQgdHggZG1hICovCisJZGJkbWFfcmVzZXQodGQpOworCW91dF9sZTMyKCZ0ZC0+d2FpdF9zZWwsIDB4MDAyMDAwMjApOworCW91dF9sZTMyKCZ0ZC0+Y21kcHRyLCB2aXJ0X3RvX2J1cyhicC0+dHhfY21kcykpOworfQorCitzdGF0aWMgaW50CitibWFjX2luaXRfcnhfcmluZyhzdHJ1Y3QgYm1hY19kYXRhICpicCkKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpyZCA9IGJwLT5yeF9kbWE7CisJaW50IGk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCS8qIGluaXRpYWxpemUgbGlzdCBvZiBza19idWZmcyBmb3IgcmVjZWl2aW5nIGFuZCBzZXQgdXAgcmVjdiBkbWEgKi8KKwltZW1zZXQoKGNoYXIgKilicC0+cnhfY21kcywgMCwKKwkgICAgICAgKE5fUlhfUklORyArIDEpICogc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpKTsKKwlmb3IgKGkgPSAwOyBpIDwgTl9SWF9SSU5HOyBpKyspIHsKKwkJaWYgKChza2IgPSBicC0+cnhfYnVmc1tpXSkgPT0gTlVMTCkgeworCQkJYnAtPnJ4X2J1ZnNbaV0gPSBza2IgPSBkZXZfYWxsb2Nfc2tiKFJYX0JVRkxFTisyKTsKKwkJCWlmIChza2IgIT0gTlVMTCkKKwkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOworCQl9CisJCWJtYWNfY29uc3RydWN0X3J4YnVmZihza2IsICZicC0+cnhfY21kc1tpXSk7CisJfQorCisJYnAtPnJ4X2VtcHR5ID0gMDsKKwlicC0+cnhfZmlsbCA9IGk7CisKKwkvKiBQdXQgYSBicmFuY2ggYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZWNlaXZlIGNvbW1hbmQgbGlzdCAqLworCWRiZG1hX3NldGNtZCgmYnAtPnJ4X2NtZHNbTl9SWF9SSU5HXSwKKwkJICAgICAoREJETUFfTk9QIHwgQlJfQUxXQVlTKSwgMCwgMCwgdmlydF90b19idXMoYnAtPnJ4X2NtZHMpKTsKKworCS8qIHN0YXJ0IHJ4IGRtYSAqLworCWRiZG1hX3Jlc2V0KHJkKTsKKwlvdXRfbGUzMigmcmQtPmNtZHB0ciwgdmlydF90b19idXMoYnAtPnJ4X2NtZHMpKTsKKworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgYm1hY190cmFuc21pdF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYm1hY19kYXRhICpicCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqdGQgPSBicC0+dHhfZG1hOworCWludCBpOworCisJLyogc2VlIGlmIHRoZXJlJ3MgYSBmcmVlIHNsb3QgaW4gdGhlIHR4IHJpbmcgKi8KKwkvKiBYWERFQlVHKCgiYm1hY194bWl0X3N0YXJ0OiBlbXB0eT0lZCBmaWxsPSVkXG4iLCAqLworCS8qIAkgICAgIGJwLT50eF9lbXB0eSwgYnAtPnR4X2ZpbGwpKTsgKi8KKwlpID0gYnAtPnR4X2ZpbGwgKyAxOworCWlmIChpID49IE5fVFhfUklORykKKwkJaSA9IDA7CisJaWYgKGkgPT0gYnAtPnR4X2VtcHR5KSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJYnAtPnR4X2Z1bGx1cCA9IDE7CisJCVhYREVCVUcoKCJibWFjX3RyYW5zbWl0X3BhY2tldDogdHggcmluZyBmdWxsXG4iKSk7CisJCXJldHVybiAtMTsJCS8qIGNhbid0IHRha2UgaXQgYXQgdGhlIG1vbWVudCAqLworCX0KKworCWRiZG1hX3NldGNtZCgmYnAtPnR4X2NtZHNbaV0sIERCRE1BX1NUT1AsIDAsIDAsIDApOworCisJYm1hY19jb25zdHJ1Y3RfeG10KHNrYiwgJmJwLT50eF9jbWRzW2JwLT50eF9maWxsXSk7CisKKwlicC0+dHhfYnVmc1ticC0+dHhfZmlsbF0gPSBza2I7CisJYnAtPnR4X2ZpbGwgPSBpOworCisJYnAtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCisJZGJkbWFfY29udGludWUodGQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnhpbnRjb3VudDsKKworc3RhdGljIGlycXJldHVybl90IGJtYWNfcnhkbWFfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCXN0cnVjdCBibWFjX2RhdGEgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpyZCA9IGJwLT5yeF9kbWE7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqY3A7CisJaW50IGksIG5iLCBzdGF0OworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgaW50IHJlc2lkdWFsOworCWludCBsYXN0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPmxvY2ssIGZsYWdzKTsKKworCWlmICgrK3J4aW50Y291bnQgPCAxMCkgeworCQlYWERFQlVHKCgiYm1hY19yeGRtYV9pbnRyXG4iKSk7CisJfQorCisJbGFzdCA9IC0xOworCWkgPSBicC0+cnhfZW1wdHk7CisKKwl3aGlsZSAoMSkgeworCQljcCA9ICZicC0+cnhfY21kc1tpXTsKKwkJc3RhdCA9IGxkX2xlMTYoJmNwLT54ZmVyX3N0YXR1cyk7CisJCXJlc2lkdWFsID0gbGRfbGUxNigmY3AtPnJlc19jb3VudCk7CisJCWlmICgoc3RhdCAmIEFDVElWRSkgPT0gMCkKKwkJCWJyZWFrOworCQluYiA9IFJYX0JVRkxFTiAtIHJlc2lkdWFsIC0gMjsKKwkJaWYgKG5iIDwgKEVUSEVSTUlOUEFDS0VUIC0gRVRIRVJDUkMpKSB7CisJCQlza2IgPSBOVUxMOworCQkJYnAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCWJwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJfSBlbHNlIHsKKwkJCXNrYiA9IGJwLT5yeF9idWZzW2ldOworCQkJYnAtPnJ4X2J1ZnNbaV0gPSBOVUxMOworCQl9CisJCWlmIChza2IgIT0gTlVMTCkgeworCQkJbmIgLT0gRVRIRVJDUkM7CisJCQlza2JfcHV0KHNrYiwgbmIpOworCQkJc2tiLT5kZXYgPSBkZXY7CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJbmV0aWZfcngoc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkrK2JwLT5zdGF0cy5yeF9wYWNrZXRzOworCQkJYnAtPnN0YXRzLnJ4X2J5dGVzICs9IG5iOworCQl9IGVsc2UgeworCQkJKyticC0+c3RhdHMucnhfZHJvcHBlZDsKKwkJfQorCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlpZiAoKHNrYiA9IGJwLT5yeF9idWZzW2ldKSA9PSBOVUxMKSB7CisJCQlicC0+cnhfYnVmc1tpXSA9IHNrYiA9IGRldl9hbGxvY19za2IoUlhfQlVGTEVOKzIpOworCQkJaWYgKHNrYiAhPSBOVUxMKQorCQkJCXNrYl9yZXNlcnZlKGJwLT5yeF9idWZzW2ldLCAyKTsKKwkJfQorCQlibWFjX2NvbnN0cnVjdF9yeGJ1ZmYoc2tiLCAmYnAtPnJ4X2NtZHNbaV0pOworCQlzdF9sZTE2KCZjcC0+cmVzX2NvdW50LCAwKTsKKwkJc3RfbGUxNigmY3AtPnhmZXJfc3RhdHVzLCAwKTsKKwkJbGFzdCA9IGk7CisJCWlmICgrK2kgPj0gTl9SWF9SSU5HKSBpID0gMDsKKwl9CisKKwlpZiAobGFzdCAhPSAtMSkgeworCQlicC0+cnhfZmlsbCA9IGxhc3Q7CisJCWJwLT5yeF9lbXB0eSA9IGk7CisJfQorCisJZGJkbWFfY29udGludWUocmQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAocnhpbnRjb3VudCA8IDEwKSB7CisJCVhYREVCVUcoKCJibWFjX3J4ZG1hX2ludHIgZG9uZVxuIikpOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgdHhpbnRjb3VudDsKKworc3RhdGljIGlycXJldHVybl90IGJtYWNfdHhkbWFfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCXN0cnVjdCBibWFjX2RhdGEgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICpjcDsKKwlpbnQgc3RhdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodHhpbnRjb3VudCsrIDwgMTApIHsKKwkJWFhERUJVRygoImJtYWNfdHhkbWFfaW50clxuIikpOworCX0KKworCS8qICAgICBkZWxfdGltZXIoJmJwLT50eF90aW1lb3V0KTsgKi8KKwkvKiAgICAgYnAtPnRpbWVvdXRfYWN0aXZlID0gMDsgKi8KKworCXdoaWxlICgxKSB7CisJCWNwID0gJmJwLT50eF9jbWRzW2JwLT50eF9lbXB0eV07CisJCXN0YXQgPSBsZF9sZTE2KCZjcC0+eGZlcl9zdGF0dXMpOworCQlpZiAodHhpbnRjb3VudCA8IDEwKSB7CisJCQlYWERFQlVHKCgiYm1hY190eGRtYV94ZmVyX3N0YXQ9JSMweFxuIiwgc3RhdCkpOworCQl9CisJCWlmICghKHN0YXQgJiBBQ1RJVkUpKSB7CisJCQkvKgorCQkJICogc3RhdHVzIGZpZWxkIG1pZ2h0IG5vdCBoYXZlIGJlZW4gZmlsbGVkIGJ5IERCRE1BCisJCQkgKi8KKwkJCWlmIChjcCA9PSBidXNfdG9fdmlydChpbl9sZTMyKCZicC0+dHhfZG1hLT5jbWRwdHIpKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChicC0+dHhfYnVmc1ticC0+dHhfZW1wdHldKSB7CisJCQkrK2JwLT5zdGF0cy50eF9wYWNrZXRzOworCQkJZGV2X2tmcmVlX3NrYl9pcnEoYnAtPnR4X2J1ZnNbYnAtPnR4X2VtcHR5XSk7CisJCX0KKwkJYnAtPnR4X2J1ZnNbYnAtPnR4X2VtcHR5XSA9IE5VTEw7CisJCWJwLT50eF9mdWxsdXAgPSAwOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCWlmICgrK2JwLT50eF9lbXB0eSA+PSBOX1RYX1JJTkcpCisJCQlicC0+dHhfZW1wdHkgPSAwOworCQlpZiAoYnAtPnR4X2VtcHR5ID09IGJwLT50eF9maWxsKQorCQkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKKworCWlmICh0eGludGNvdW50IDwgMTApIHsKKwkJWFhERUJVRygoImJtYWNfdHhkbWFfaW50ciBkb25lLT5ibWFjX3N0YXJ0XG4iKSk7CisJfQorCisJYm1hY19zdGFydChkZXYpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpibWFjX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJtYWNfZGF0YSAqcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gJnAtPnN0YXRzOworfQorCisjaWZuZGVmIFNVTkhNRV9NVUxUSUNBU1QKKy8qIFJlYWwgZmFzdCBiaXQtcmV2ZXJzYWwgYWxnb3JpdGhtLCA2LWJpdCB2YWx1ZXMgKi8KK3N0YXRpYyBpbnQgcmV2ZXJzZTZbNjRdID0geworCTB4MCwweDIwLDB4MTAsMHgzMCwweDgsMHgyOCwweDE4LDB4MzgsCisJMHg0LDB4MjQsMHgxNCwweDM0LDB4YywweDJjLDB4MWMsMHgzYywKKwkweDIsMHgyMiwweDEyLDB4MzIsMHhhLDB4MmEsMHgxYSwweDNhLAorCTB4NiwweDI2LDB4MTYsMHgzNiwweGUsMHgyZSwweDFlLDB4M2UsCisJMHgxLDB4MjEsMHgxMSwweDMxLDB4OSwweDI5LDB4MTksMHgzOSwKKwkweDUsMHgyNSwweDE1LDB4MzUsMHhkLDB4MmQsMHgxZCwweDNkLAorCTB4MywweDIzLDB4MTMsMHgzMywweGIsMHgyYiwweDFiLDB4M2IsCisJMHg3LDB4MjcsMHgxNywweDM3LDB4ZiwweDJmLDB4MWYsMHgzZgorfTsKKworc3RhdGljIHVuc2lnbmVkIGludAorY3JjNDE2KHVuc2lnbmVkIGludCBjdXJ2YWwsIHVuc2lnbmVkIHNob3J0IG54dHZhbCkKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBpbnQgY291bnRlciwgY3VyID0gY3VydmFsLCBuZXh0ID0gbnh0dmFsOworCXJlZ2lzdGVyIGludCBoaWdoX2NyY19zZXQsIGxvd19kYXRhX3NldDsKKworCS8qIFN3YXAgYnl0ZXMgKi8KKwluZXh0ID0gKChuZXh0ICYgMHgwMEZGKSA8PCA4KSB8IChuZXh0ID4+IDgpOworCisJLyogQ29tcHV0ZSBiaXQtYnktYml0ICovCisJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IDE2OyArK2NvdW50ZXIpIHsKKwkJLyogaXMgaGlnaCBDUkMgYml0IHNldD8gKi8KKwkJaWYgKChjdXIgJiAweDgwMDAwMDAwKSA9PSAwKSBoaWdoX2NyY19zZXQgPSAwOworCQllbHNlIGhpZ2hfY3JjX3NldCA9IDE7CisKKwkJY3VyID0gY3VyIDw8IDE7CisJCisJCWlmICgobmV4dCAmIDB4MDAwMSkgPT0gMCkgbG93X2RhdGFfc2V0ID0gMDsKKwkJZWxzZSBsb3dfZGF0YV9zZXQgPSAxOworCisJCW5leHQgPSBuZXh0ID4+IDE7CisJCisJCS8qIGRvIHRoZSBYT1IgKi8KKwkJaWYgKGhpZ2hfY3JjX3NldCBeIGxvd19kYXRhX3NldCkgY3VyID0gY3VyIF4gRU5FVF9DUkNQT0xZOworCX0KKwlyZXR1cm4gY3VyOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitibWFjX2NyYyh1bnNpZ25lZCBzaG9ydCAqYWRkcmVzcykKK3sJCisJdW5zaWduZWQgaW50IG5ld2NyYzsKKworCVhYREVCVUcoKCJibWFjX2NyYzogYWRkcj0lIzA0eCwgJSMwNHgsICUjMDR4XG4iLCAqYWRkcmVzcywgYWRkcmVzc1sxXSwgYWRkcmVzc1syXSkpOworCW5ld2NyYyA9IGNyYzQxNigweGZmZmZmZmZmLCAqYWRkcmVzcyk7CS8qIGFkZHJlc3MgYml0cyA0NyAtIDMyICovCisJbmV3Y3JjID0gY3JjNDE2KG5ld2NyYywgYWRkcmVzc1sxXSk7CS8qIGFkZHJlc3MgYml0cyAzMSAtIDE2ICovCisJbmV3Y3JjID0gY3JjNDE2KG5ld2NyYywgYWRkcmVzc1syXSk7CS8qIGFkZHJlc3MgYml0cyAxNSAtIDAgICovCisKKwlyZXR1cm4obmV3Y3JjKTsKK30KKworLyoKKyAqIEFkZCByZXF1ZXN0ZWQgbWNhc3QgYWRkciB0byBCTWFjJ3MgaGFzaCB0YWJsZSBmaWx0ZXIuCisgKgorICovCisKK3N0YXRpYyB2b2lkCitibWFjX2FkZGhhc2goc3RydWN0IGJtYWNfZGF0YSAqYnAsIHVuc2lnbmVkIGNoYXIgKmFkZHIpCit7CQorCXVuc2lnbmVkIGludAkgY3JjOworCXVuc2lnbmVkIHNob3J0CSBtYXNrOworCisJaWYgKCEoKmFkZHIpKSByZXR1cm47CisJY3JjID0gYm1hY19jcmMoKHVuc2lnbmVkIHNob3J0ICopYWRkcikgJiAweDNmOyAvKiBCaWctZW5kaWFuIGFsZXJ0ISAqLworCWNyYyA9IHJldmVyc2U2W2NyY107CS8qIEh5cGVyZmFzdCBiaXQtcmV2ZXJzaW5nIGFsZ29yaXRobSAqLworCWlmIChicC0+aGFzaF91c2VfY291bnRbY3JjXSsrKSByZXR1cm47IC8qIFRoaXMgYml0IGlzIGFscmVhZHkgc2V0ICovCisJbWFzayA9IGNyYyAlIDE2OworCW1hc2sgPSAodW5zaWduZWQgY2hhcikxIDw8IG1hc2s7CisJYnAtPmhhc2hfdXNlX2NvdW50W2NyYy8xNl0gfD0gbWFzazsKK30KKworc3RhdGljIHZvaWQKK2JtYWNfcmVtb3ZlaGFzaChzdHJ1Y3QgYm1hY19kYXRhICpicCwgdW5zaWduZWQgY2hhciAqYWRkcikKK3sJCisJdW5zaWduZWQgaW50IGNyYzsKKwl1bnNpZ25lZCBjaGFyIG1hc2s7CisKKwkvKiBOb3csIGRlbGV0ZSB0aGUgYWRkcmVzcyBmcm9tIHRoZSBmaWx0ZXIgY29weSwgYXMgaW5kaWNhdGVkICovCisJY3JjID0gYm1hY19jcmMoKHVuc2lnbmVkIHNob3J0ICopYWRkcikgJiAweDNmOyAvKiBCaWctZW5kaWFuIGFsZXJ0ISAqLworCWNyYyA9IHJldmVyc2U2W2NyY107CS8qIEh5cGVyZmFzdCBiaXQtcmV2ZXJzaW5nIGFsZ29yaXRobSAqLworCWlmIChicC0+aGFzaF91c2VfY291bnRbY3JjXSA9PSAwKSByZXR1cm47IC8qIFRoYXQgYml0IHdhc24ndCBpbiB1c2UhICovCisJaWYgKC0tYnAtPmhhc2hfdXNlX2NvdW50W2NyY10pIHJldHVybjsgLyogVGhhdCBiaXQgaXMgc3RpbGwgaW4gdXNlICovCisJbWFzayA9IGNyYyAlIDE2OworCW1hc2sgPSAoKHVuc2lnbmVkIGNoYXIpMSA8PCBtYXNrKSBeIDB4ZmZmZjsgLyogVG8gdHVybiBvZmYgYml0ICovCisJYnAtPmhhc2hfdGFibGVfbWFza1tjcmMvMTZdICY9IG1hc2s7Cit9CisKKy8qCisgKiBTeW5jIHRoZSBhZGFwdGVyIHdpdGggdGhlIHNvZnR3YXJlIGNvcHkgb2YgdGhlIG11bHRpY2FzdCBtYXNrCisgKiAgKGxvZ2ljYWwgYWRkcmVzcyBmaWx0ZXIpLgorICovCisKK3N0YXRpYyB2b2lkCitibWFjX3J4X29mZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIHNob3J0IHJ4X2NmZzsKKworCXJ4X2NmZyA9IGJtcmVhZChkZXYsIFJYQ0ZHKTsKKwlyeF9jZmcgJj0gflJ4TUFDRW5hYmxlOworCWJtd3JpdGUoZGV2LCBSWENGRywgcnhfY2ZnKTsKKwlkbyB7CisJCXJ4X2NmZyA9IGJtcmVhZChkZXYsIFJYQ0ZHKTsKKwl9ICB3aGlsZSAocnhfY2ZnICYgUnhNQUNFbmFibGUpOworfQorCit1bnNpZ25lZCBzaG9ydAorYm1hY19yeF9vbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaGFzaF9lbmFibGUsIGludCBwcm9taXNjX2VuYWJsZSkKK3sKKwl1bnNpZ25lZCBzaG9ydCByeF9jZmc7CisKKwlyeF9jZmcgPSBibXJlYWQoZGV2LCBSWENGRyk7CisJcnhfY2ZnIHw9IFJ4TUFDRW5hYmxlOworCWlmIChoYXNoX2VuYWJsZSkgcnhfY2ZnIHw9IFJ4SGFzaEZpbHRlckVuYWJsZTsKKwllbHNlIHJ4X2NmZyAmPSB+UnhIYXNoRmlsdGVyRW5hYmxlOworCWlmIChwcm9taXNjX2VuYWJsZSkgcnhfY2ZnIHw9IFJ4UHJvbWlzY0VuYWJsZTsKKwllbHNlIHJ4X2NmZyAmPSB+UnhQcm9taXNjRW5hYmxlOworCWJtd3JpdGUoZGV2LCBSWFJTVCwgUnhSZXNldFZhbHVlKTsKKwlibXdyaXRlKGRldiwgUlhGSUZPQ1NSLCAwKTsJLyogZmlyc3QgZGlzYWJsZSByeEZJRk8gKi8KKwlibXdyaXRlKGRldiwgUlhGSUZPQ1NSLCBSeEZJRk9FbmFibGUgKTsKKwlibXdyaXRlKGRldiwgUlhDRkcsIHJ4X2NmZyApOworCXJldHVybiByeF9jZmc7Cit9CisKK3N0YXRpYyB2b2lkCitibWFjX3VwZGF0ZV9oYXNoX3RhYmxlX21hc2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGJtYWNfZGF0YSAqYnApCit7CisJYm13cml0ZShkZXYsIEJIQVNIMywgYnAtPmhhc2hfdGFibGVfbWFza1swXSk7IC8qIGJpdHMgMTUgLSAwICovCisJYm13cml0ZShkZXYsIEJIQVNIMiwgYnAtPmhhc2hfdGFibGVfbWFza1sxXSk7IC8qIGJpdHMgMzEgLSAxNiAqLworCWJtd3JpdGUoZGV2LCBCSEFTSDEsIGJwLT5oYXNoX3RhYmxlX21hc2tbMl0pOyAvKiBiaXRzIDQ3IC0gMzIgKi8KKwlibXdyaXRlKGRldiwgQkhBU0gwLCBicC0+aGFzaF90YWJsZV9tYXNrWzNdKTsgLyogYml0cyA2MyAtIDQ4ICovCit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAorYm1hY19hZGRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkgICAgICAgc3RydWN0IGJtYWNfZGF0YSAqYnAsIHVuc2lnbmVkIGNoYXIgKmFkZHIpCit7CisJLyogWFhERUJVRygoImJtYWM6IGVudGVyIGJtYWNfYWRkX211bHRpXG4iKSk7ICovCisJYm1hY19hZGRoYXNoKGJwLCBhZGRyKTsKKwlibWFjX3J4X29mZihkZXYpOworCWJtYWNfdXBkYXRlX2hhc2hfdGFibGVfbWFzayhkZXYsIGJwKTsKKwlibWFjX3J4X29uKGRldiwgMSwgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyk/IDEgOiAwKTsKKwkvKiBYWERFQlVHKCgiYm1hYzogZXhpdCBibWFjX2FkZF9tdWx0aVxuIikpOyAqLworfQorCitzdGF0aWMgdm9pZAorYm1hY19yZW1vdmVfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICBzdHJ1Y3QgYm1hY19kYXRhICpicCwgdW5zaWduZWQgY2hhciAqYWRkcikKK3sKKwlibWFjX3JlbW92ZWhhc2goYnAsIGFkZHIpOworCWJtYWNfcnhfb2ZmKGRldik7CisJYm1hY191cGRhdGVfaGFzaF90YWJsZV9tYXNrKGRldiwgYnApOworCWJtYWNfcnhfb24oZGV2LCAxLCAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKT8gMSA6IDApOworfQorI2VuZGlmCisKKy8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICAgIG51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisgICAgbnVtX2FkZHJzID09IDAJTm9ybWFsIG1vZGUsIGNsZWFyIG11bHRpY2FzdCBsaXN0CisgICAgbnVtX2FkZHJzID4gMAlNdWx0aWNhc3QgbW9kZSwgcmVjZWl2ZSBub3JtYWwgYW5kIE1DIHBhY2tldHMsIGFuZCBkbworCQkJYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgorICovCitzdGF0aWMgdm9pZCBibWFjX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaTsKKwlzdHJ1Y3QgYm1hY19kYXRhICpicCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IG51bV9hZGRycyA9IGRldi0+bWNfY291bnQ7CisJdW5zaWduZWQgc2hvcnQgcnhfY2ZnOworCWludCBpOworCisJaWYgKGJwLT5zbGVlcGluZykKKwkJcmV0dXJuOworCisJWFhERUJVRygoImJtYWM6IGVudGVyIGJtYWNfc2V0X211bHRpY2FzdCwgbl9hZGRycz0lZFxuIiwgbnVtX2FkZHJzKSk7CisKKwlpZigoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgfHwgKGRldi0+bWNfY291bnQgPiA2NCkpIHsKKwkJZm9yIChpPTA7IGk8NDsgaSsrKSBicC0+aGFzaF90YWJsZV9tYXNrW2ldID0gMHhmZmZmOworCQlibWFjX3VwZGF0ZV9oYXNoX3RhYmxlX21hc2soZGV2LCBicCk7CisJCXJ4X2NmZyA9IGJtYWNfcnhfb24oZGV2LCAxLCAwKTsKKwkJWFhERUJVRygoImJtYWM6IGFsbCBtdWx0aSwgcnhfY2ZnPSUjMDh4XG4iKSk7CisJfSBlbHNlIGlmICgoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB8fCAobnVtX2FkZHJzIDwgMCkpIHsKKwkJcnhfY2ZnID0gYm1yZWFkKGRldiwgUlhDRkcpOworCQlyeF9jZmcgfD0gUnhQcm9taXNjRW5hYmxlOworCQlibXdyaXRlKGRldiwgUlhDRkcsIHJ4X2NmZyk7CisJCXJ4X2NmZyA9IGJtYWNfcnhfb24oZGV2LCAwLCAxKTsKKwkJWFhERUJVRygoImJtYWM6IHByb21pc2MgbW9kZSBlbmFibGVkLCByeF9jZmc9JSMwOHhcbiIsIHJ4X2NmZykpOworCX0gZWxzZSB7CisJCWZvciAoaT0wOyBpPDQ7IGkrKykgYnAtPmhhc2hfdGFibGVfbWFza1tpXSA9IDA7CisJCWZvciAoaT0wOyBpPDY0OyBpKyspIGJwLT5oYXNoX3VzZV9jb3VudFtpXSA9IDA7CisJCWlmIChudW1fYWRkcnMgPT0gMCkgeworCQkJcnhfY2ZnID0gYm1hY19yeF9vbihkZXYsIDAsIDApOworCQkJWFhERUJVRygoImJtYWM6IG11bHRpIGRpc2FibGVkLCByeF9jZmc9JSMwOHhcbiIsIHJ4X2NmZykpOworCQl9IGVsc2UgeworCQkJZm9yIChkbWk9ZGV2LT5tY19saXN0OyBkbWkhPU5VTEw7IGRtaT1kbWktPm5leHQpCisJCQkJYm1hY19hZGRoYXNoKGJwLCBkbWktPmRtaV9hZGRyKTsKKwkJCWJtYWNfdXBkYXRlX2hhc2hfdGFibGVfbWFzayhkZXYsIGJwKTsKKwkJCXJ4X2NmZyA9IGJtYWNfcnhfb24oZGV2LCAxLCAwKTsKKwkJCVhYREVCVUcoKCJibWFjOiBtdWx0aSBlbmFibGVkLCByeF9jZmc9JSMwOHhcbiIsIHJ4X2NmZykpOworCQl9CisJfQorCS8qIFhYREVCVUcoKCJibWFjOiBleGl0IGJtYWNfc2V0X211bHRpY2FzdFxuIikpOyAqLworfQorI2Vsc2UgLyogaWZkZWYgU1VOSE1FX01VTFRJQ0FTVCAqLworCisvKiBUaGUgdmVyc2lvbiBvZiBzZXRfbXVsdGljYXN0IGJlbG93IHdhcyBsaWZ0ZWQgZnJvbSBzdW5obWUuYyAqLworCitzdGF0aWMgdm9pZCBibWFjX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IGRldi0+bWNfbGlzdDsKKwljaGFyICphZGRyczsKKwlpbnQgaTsKKwl1bnNpZ25lZCBzaG9ydCByeF9jZmc7CisJdTMyIGNyYzsKKworCWlmKChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fCAoZGV2LT5tY19jb3VudCA+IDY0KSkgeworCQlibXdyaXRlKGRldiwgQkhBU0gwLCAweGZmZmYpOworCQlibXdyaXRlKGRldiwgQkhBU0gxLCAweGZmZmYpOworCQlibXdyaXRlKGRldiwgQkhBU0gyLCAweGZmZmYpOworCQlibXdyaXRlKGRldiwgQkhBU0gzLCAweGZmZmYpOworCX0gZWxzZSBpZihkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJcnhfY2ZnID0gYm1yZWFkKGRldiwgUlhDRkcpOworCQlyeF9jZmcgfD0gUnhQcm9taXNjRW5hYmxlOworCQlibXdyaXRlKGRldiwgUlhDRkcsIHJ4X2NmZyk7CisJfSBlbHNlIHsKKwkJdTE2IGhhc2hfdGFibGVbNF07CisJCisJCXJ4X2NmZyA9IGJtcmVhZChkZXYsIFJYQ0ZHKTsKKwkJcnhfY2ZnICY9IH5SeFByb21pc2NFbmFibGU7CisJCWJtd3JpdGUoZGV2LCBSWENGRywgcnhfY2ZnKTsKKworCQlmb3IoaSA9IDA7IGkgPCA0OyBpKyspIGhhc2hfdGFibGVbaV0gPSAwOworCQorCQlmb3IoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyspIHsKKwkJCWFkZHJzID0gZG1pLT5kbWlfYWRkcjsKKwkJCWRtaSA9IGRtaS0+bmV4dDsKKworCQkJaWYoISgqYWRkcnMgJiAxKSkKKwkJCQljb250aW51ZTsKKworCQkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGFkZHJzKTsKKwkJCWNyYyA+Pj0gMjY7CisJCQloYXNoX3RhYmxlW2NyYyA+PiA0XSB8PSAxIDw8IChjcmMgJiAweGYpOworCQl9CisJCWJtd3JpdGUoZGV2LCBCSEFTSDAsIGhhc2hfdGFibGVbMF0pOworCQlibXdyaXRlKGRldiwgQkhBU0gxLCBoYXNoX3RhYmxlWzFdKTsKKwkJYm13cml0ZShkZXYsIEJIQVNIMiwgaGFzaF90YWJsZVsyXSk7CisJCWJtd3JpdGUoZGV2LCBCSEFTSDMsIGhhc2hfdGFibGVbM10pOworCX0KK30KKyNlbmRpZiAvKiBTVU5ITUVfTVVMVElDQVNUICovCisKK3N0YXRpYyBpbnQgbWlzY2ludGNvdW50OworCitzdGF0aWMgaXJxcmV0dXJuX3QgYm1hY19taXNjX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgYm1hY19kYXRhICpicCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IHN0YXR1cyA9IGJtcmVhZChkZXYsIFNUQVRVUyk7CisJaWYgKG1pc2NpbnRjb3VudCsrIDwgMTApIHsKKwkJWFhERUJVRygoImJtYWNfbWlzY19pbnRyXG4iKSk7CisJfQorCS8qIFhYREVCVUcoKCJibWFjX21pc2NfaW50ciwgc3RhdHVzPSUjMDh4XG4iLCBzdGF0dXMpKTsgKi8KKwkvKiAgICAgYm1hY190eGRtYV9pbnRyX2lubmVyKGlycSwgZGV2X2lkLCByZWdzKTsgKi8KKwkvKiAgIGlmIChzdGF0dXMgJiBGcmFtZVJlY2VpdmVkKSBicC0+c3RhdHMucnhfZHJvcHBlZCsrOyAqLworCWlmIChzdGF0dXMgJiBSeEVycm9yTWFzaykgYnAtPnN0YXRzLnJ4X2Vycm9ycysrOworCWlmIChzdGF0dXMgJiBSeENSQ0NudEV4cCkgYnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgUnhMZW5DbnRFeHApIGJwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIFJ4T3ZlckZsb3cpIGJwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCWlmIChzdGF0dXMgJiBSeEFsaWduQ250RXhwKSBicC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisKKwkvKiAgIGlmIChzdGF0dXMgJiBGcmFtZVNlbnQpIGJwLT5zdGF0cy50eF9kcm9wcGVkKys7ICovCisJaWYgKHN0YXR1cyAmIFR4RXJyb3JNYXNrKSBicC0+c3RhdHMudHhfZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIFR4VW5kZXJydW4pIGJwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCWlmIChzdGF0dXMgJiBUeE5vcm1hbENvbGxFeHApIGJwLT5zdGF0cy5jb2xsaXNpb25zKys7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogUHJvY2VkdXJlIGZvciByZWFkaW5nIEVFUFJPTQorICovCisjZGVmaW5lIFNST01BZGRyZXNzTGVuZ3RoCTUKKyNkZWZpbmUgRGF0YUluT24JCTB4MDAwOAorI2RlZmluZSBEYXRhSW5PZmYJCTB4MDAwMAorI2RlZmluZSBDbGsJCQkweDAwMDIKKyNkZWZpbmUgQ2hpcFNlbGVjdAkJMHgwMDAxCisjZGVmaW5lIFNESVNoaWZ0Q291bnQJCTMKKyNkZWZpbmUgU0QwU2hpZnRDb3VudAkJMgorI2RlZmluZQlEZWxheVZhbHVlCQkxMDAwCS8qIG51bWJlciBvZiBtaWNyb3NlY29uZHMgKi8KKyNkZWZpbmUgU1JPTVN0YXJ0T2Zmc2V0CQkxMAkvKiB0aGlzIGlzIGluIHdvcmRzICovCisjZGVmaW5lIFNST01SZWFkQ291bnQJCTMJLyogbnVtYmVyIG9mIHdvcmRzIHRvIHJlYWQgZnJvbSBTUk9NICovCisjZGVmaW5lIFNST01BZGRyZXNzQml0cwkJNgorI2RlZmluZSBFbmV0QWRkcmVzc09mZnNldAkyMAorCitzdGF0aWMgdW5zaWduZWQgY2hhcgorYm1hY19jbG9ja19vdXRfYml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgc2hvcnQgICAgICAgICBkYXRhOworCXVuc2lnbmVkIHNob3J0ICAgICAgICAgdmFsOworCisJYm13cml0ZShkZXYsIFNST01DU1IsIENoaXBTZWxlY3QgfCBDbGspOworCXVkZWxheShEZWxheVZhbHVlKTsKKworCWRhdGEgPSBibXJlYWQoZGV2LCBTUk9NQ1NSKTsKKwl1ZGVsYXkoRGVsYXlWYWx1ZSk7CisJdmFsID0gKGRhdGEgPj4gU0QwU2hpZnRDb3VudCkgJiAxOworCisJYm13cml0ZShkZXYsIFNST01DU1IsIENoaXBTZWxlY3QpOworCXVkZWxheShEZWxheVZhbHVlKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitibWFjX2Nsb2NrX2luX2JpdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIHNob3J0IGRhdGE7CisKKwlpZiAodmFsICE9IDAgJiYgdmFsICE9IDEpIHJldHVybjsKKworCWRhdGEgPSAodmFsIDw8IFNESVNoaWZ0Q291bnQpOworCWJtd3JpdGUoZGV2LCBTUk9NQ1NSLCBkYXRhIHwgQ2hpcFNlbGVjdCAgKTsKKwl1ZGVsYXkoRGVsYXlWYWx1ZSk7CisKKwlibXdyaXRlKGRldiwgU1JPTUNTUiwgZGF0YSB8IENoaXBTZWxlY3QgfCBDbGsgKTsKKwl1ZGVsYXkoRGVsYXlWYWx1ZSk7CisKKwlibXdyaXRlKGRldiwgU1JPTUNTUiwgZGF0YSB8IENoaXBTZWxlY3QpOworCXVkZWxheShEZWxheVZhbHVlKTsKK30KKworc3RhdGljIHZvaWQKK3Jlc2V0X2FuZF9zZWxlY3Rfc3JvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIGZpcnN0IHJlc2V0ICovCisJYm13cml0ZShkZXYsIFNST01DU1IsIDApOworCXVkZWxheShEZWxheVZhbHVlKTsKKworCS8qIHNlbmQgaXQgdGhlIHJlYWQgY29tbWFuZCAoMTEwKSAqLworCWJtYWNfY2xvY2tfaW5fYml0KGRldiwgMSk7CisJYm1hY19jbG9ja19pbl9iaXQoZGV2LCAxKTsKKwlibWFjX2Nsb2NrX2luX2JpdChkZXYsIDApOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK3JlYWRfc3JvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgaW50IGFkZHJfbGVuKQoreworCXVuc2lnbmVkIHNob3J0IGRhdGEsIHZhbDsKKwlpbnQgaTsKKworCS8qIHNlbmQgb3V0IHRoZSBhZGRyZXNzIHdlIHdhbnQgdG8gcmVhZCBmcm9tICovCisJZm9yIChpID0gMDsgaSA8IGFkZHJfbGVuOyBpKyspCXsKKwkJdmFsID0gYWRkciA+PiAoYWRkcl9sZW4taS0xKTsKKwkJYm1hY19jbG9ja19pbl9iaXQoZGV2LCB2YWwgJiAxKTsKKwl9CisKKwkvKiBOb3cgcmVhZCBpbiB0aGUgMTYtYml0IGRhdGEgKi8KKwlkYXRhID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykJeworCQl2YWwgPSBibWFjX2Nsb2NrX291dF9iaXQoZGV2KTsKKwkJZGF0YSA8PD0gMTsKKwkJZGF0YSB8PSB2YWw7CisJfQorCWJtd3JpdGUoZGV2LCBTUk9NQ1NSLCAwKTsKKworCXJldHVybiBkYXRhOworfQorCisvKgorICogSXQgbG9va3MgbGlrZSBDb2dlbnQgYW5kIFNNQyB1c2UgZGlmZmVyZW50IG1ldGhvZHMgZm9yIGNhbGN1bGF0aW5nCisgKiBjaGVja3N1bXMuIFdoYXQgYSBwYWluLi4KKyAqLworCitzdGF0aWMgaW50CitibWFjX3ZlcmlmeV9jaGVja3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIHNob3J0IGRhdGEsIHN0b3JlZENTOworCisJcmVzZXRfYW5kX3NlbGVjdF9zcm9tKGRldik7CisJZGF0YSA9IHJlYWRfc3JvbShkZXYsIDMsIFNST01BZGRyZXNzQml0cyk7CisJc3RvcmVkQ1MgPSAoKGRhdGEgPj4gOCkgJiAweDBmZikgfCAoKGRhdGEgPDwgOCkgJiAweGZmMDApOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQKK2JtYWNfZ2V0X3N0YXRpb25fYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICplYSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBzaG9ydCBkYXRhOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykJCisJCXsKKwkJCXJlc2V0X2FuZF9zZWxlY3Rfc3JvbShkZXYpOworCQkJZGF0YSA9IHJlYWRfc3JvbShkZXYsIGkgKyBFbmV0QWRkcmVzc09mZnNldC8yLCBTUk9NQWRkcmVzc0JpdHMpOworCQkJZWFbMippXSAgID0gYml0cmV2KGRhdGEgJiAweDBmZik7CisJCQllYVsyKmkrMV0gPSBiaXRyZXYoKGRhdGEgPj4gOCkgJiAweDBmZik7CisJCX0KK30KKworc3RhdGljIHZvaWQgYm1hY19yZXNldF9hbmRfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJtYWNfZGF0YSAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJYm1hY19lbmFibGVfYW5kX3Jlc2V0X2NoaXAoZGV2KTsKKwlibWFjX2luaXRfdHhfcmluZyhicCk7CisJYm1hY19pbml0X3J4X3JpbmcoYnApOworCWJtYWNfaW5pdF9jaGlwKGRldik7CisJYm1hY19zdGFydF9jaGlwKGRldik7CisJYm13cml0ZShkZXYsIElOVERJU0FCTEUsIEVuYWJsZU5vcm1hbCk7CisJYnAtPnNsZWVwaW5nID0gMDsKKwkKKwkvKgorCSAqIEl0IHNlZW1zIHRoYXQgdGhlIGJtYWMgY2FuJ3QgcmVjZWl2ZSB1bnRpbCBpdCdzIHRyYW5zbWl0dGVkCisJICogYSBwYWNrZXQuICBTbyB3ZSBnaXZlIGl0IGEgZHVtbXkgcGFja2V0IHRvIHRyYW5zbWl0LgorCSAqLworCXNrYiA9IGRldl9hbGxvY19za2IoRVRIRVJNSU5QQUNLRVQpOworCWlmIChza2IgIT0gTlVMTCkgeworCQlkYXRhID0gc2tiX3B1dChza2IsIEVUSEVSTUlOUEFDS0VUKTsKKwkJbWVtc2V0KGRhdGEsIDAsIEVUSEVSTUlOUEFDS0VUKTsKKwkJbWVtY3B5KGRhdGEsIGRldi0+ZGV2X2FkZHIsIDYpOworCQltZW1jcHkoZGF0YSs2LCBkZXYtPmRldl9hZGRyLCA2KTsKKwkJYm1hY190cmFuc21pdF9wYWNrZXQoc2tiLCBkZXYpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBibWFjX3Byb2JlKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2gpCit7CisJaW50IGosIHJldiwgcmV0OworCXN0cnVjdCBibWFjX2RhdGEgKmJwOworCXVuc2lnbmVkIGNoYXIgKmFkZHI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaXNfYm1hY19wbHVzID0gKChpbnQpbWF0Y2gtPmRhdGEpICE9IDA7CisKKwlpZiAobWFjaW9fcmVzb3VyY2VfY291bnQobWRldikgIT0gMyB8fCBtYWNpb19pcnFfY291bnQobWRldikgIT0gMykgeworCQlwcmludGsoS0VSTl9FUlIgIkJNQUM6IGNhbid0IHVzZSwgbmVlZCAzIGFkZHJzIGFuZCAzIGludHJzXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWFkZHIgPSBnZXRfcHJvcGVydHkobWFjaW9fZ2V0X29mX25vZGUobWRldiksICJtYWMtYWRkcmVzcyIsIE5VTEwpOworCWlmIChhZGRyID09IE5VTEwpIHsKKwkJYWRkciA9IGdldF9wcm9wZXJ0eShtYWNpb19nZXRfb2Zfbm9kZShtZGV2KSwgImxvY2FsLW1hYy1hZGRyZXNzIiwgTlVMTCk7CisJCWlmIChhZGRyID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiQk1BQzogQ2FuJ3QgZ2V0IG1hYy1hZGRyZXNzXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoUFJJVl9CWVRFUyk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCTUFDOiBhbGxvY19ldGhlcmRldiBmYWlsZWQsIG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJCQorCWJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmbWRldi0+b2ZkZXYuZGV2KTsKKwltYWNpb19zZXRfZHJ2ZGF0YShtZGV2LCBkZXYpOworCisJYnAtPm1kZXYgPSBtZGV2OworCXNwaW5fbG9ja19pbml0KCZicC0+bG9jayk7CisKKwlpZiAobWFjaW9fcmVxdWVzdF9yZXNvdXJjZXMobWRldiwgImJtYWMiKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkJNQUM6IGNhbid0IHJlcXVlc3QgSU8gcmVzb3VyY2UgIVxuIik7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZykKKwkJaW9yZW1hcChtYWNpb19yZXNvdXJjZV9zdGFydChtZGV2LCAwKSwgbWFjaW9fcmVzb3VyY2VfbGVuKG1kZXYsIDApKTsKKwlpZiAoZGV2LT5iYXNlX2FkZHIgPT0gMCkKKwkJZ290byBvdXRfcmVsZWFzZTsKKworCWRldi0+aXJxID0gbWFjaW9faXJxKG1kZXYsIDApOworCisJYm1hY19lbmFibGVfYW5kX3Jlc2V0X2NoaXAoZGV2KTsKKwlibXdyaXRlKGRldiwgSU5URElTQUJMRSwgRGlzYWJsZUFsbCk7CisKKwlyZXYgPSBhZGRyWzBdID09IDAgJiYgYWRkclsxXSA9PSAweEEwOworCWZvciAoaiA9IDA7IGogPCA2OyArK2opCisJCWRldi0+ZGV2X2FkZHJbal0gPSByZXY/IGJpdHJldihhZGRyW2pdKTogYWRkcltqXTsKKworCS8qIEVuYWJsZSBjaGlwIHdpdGhvdXQgaW50ZXJydXB0cyBmb3Igbm93ICovCisJYm1hY19lbmFibGVfYW5kX3Jlc2V0X2NoaXAoZGV2KTsKKwlibXdyaXRlKGRldiwgSU5URElTQUJMRSwgRGlzYWJsZUFsbCk7CisKKwlkZXYtPm9wZW4gPSBibWFjX29wZW47CisJZGV2LT5zdG9wID0gYm1hY19jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGJtYWNfb3V0cHV0OworCWRldi0+Z2V0X3N0YXRzID0gYm1hY19zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGJtYWNfc2V0X211bHRpY2FzdDsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGJtYWNfc2V0X2FkZHJlc3M7CisKKwlibWFjX2dldF9zdGF0aW9uX2FkZHJlc3MoZGV2LCBhZGRyKTsKKwlpZiAoYm1hY192ZXJpZnlfY2hlY2tzdW0oZGV2KSAhPSAwKQorCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKworCWJwLT5pc19ibWFjX3BsdXMgPSBpc19ibWFjX3BsdXM7CisJYnAtPnR4X2RtYSA9IGlvcmVtYXAobWFjaW9fcmVzb3VyY2Vfc3RhcnQobWRldiwgMSksIG1hY2lvX3Jlc291cmNlX2xlbihtZGV2LCAxKSk7CisJaWYgKCFicC0+dHhfZG1hKQorCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwlicC0+dHhfZG1hX2ludHIgPSBtYWNpb19pcnEobWRldiwgMSk7CisJYnAtPnJ4X2RtYSA9IGlvcmVtYXAobWFjaW9fcmVzb3VyY2Vfc3RhcnQobWRldiwgMiksIG1hY2lvX3Jlc291cmNlX2xlbihtZGV2LCAyKSk7CisJaWYgKCFicC0+cnhfZG1hKQorCQlnb3RvIGVycl9vdXRfaW91bm1hcF90eDsKKwlicC0+cnhfZG1hX2ludHIgPSBtYWNpb19pcnEobWRldiwgMik7CisKKwlicC0+dHhfY21kcyA9ICh2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICopIERCRE1BX0FMSUdOKGJwICsgMSk7CisJYnAtPnJ4X2NtZHMgPSBicC0+dHhfY21kcyArIE5fVFhfUklORyArIDE7CisKKwlicC0+cXVldWUgPSAoc3RydWN0IHNrX2J1ZmZfaGVhZCAqKShicC0+cnhfY21kcyArIE5fUlhfUklORyArIDEpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoYnAtPnF1ZXVlKTsKKworCWluaXRfdGltZXIoJmJwLT50eF90aW1lb3V0KTsKKworCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBibWFjX21pc2NfaW50ciwgMCwgIkJNQUMtbWlzYyIsIGRldik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIkJNQUM6IGNhbid0IGdldCBpcnEgJWRcbiIsIGRldi0+aXJxKTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXBfcng7CisJfQorCXJldCA9IHJlcXVlc3RfaXJxKGJwLT50eF9kbWFfaW50ciwgYm1hY190eGRtYV9pbnRyLCAwLCAiQk1BQy10eGRtYSIsIGRldik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIkJNQUM6IGNhbid0IGdldCBpcnEgJWRcbiIsIGJwLT50eF9kbWFfaW50cik7CisJCWdvdG8gZXJyX291dF9pcnEwOworCX0KKwlyZXQgPSByZXF1ZXN0X2lycShicC0+cnhfZG1hX2ludHIsIGJtYWNfcnhkbWFfaW50ciwgMCwgIkJNQUMtcnhkbWEiLCBkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCTUFDOiBjYW4ndCBnZXQgaXJxICVkXG4iLCBicC0+cnhfZG1hX2ludHIpOworCQlnb3RvIGVycl9vdXRfaXJxMTsKKwl9CisKKwkvKiBNYXNrIGNoaXAgaW50ZXJydXB0cyBhbmQgZGlzYWJsZSBjaGlwLCB3aWxsIGJlCisJICogcmUtZW5hYmxlZCBvbiBvcGVuKCkKKwkgKi8KKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfQk1BQ19FTkFCTEUsIG1hY2lvX2dldF9vZl9ub2RlKGJwLT5tZGV2KSwgMCwgMCk7CisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkJNQUM6IEV0aGVybmV0IHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9vdXRfaXJxMjsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogQk1BQyVzIGF0IiwgZGV2LT5uYW1lLCAoaXNfYm1hY19wbHVzPyAiKyI6ICIiKSk7CisJZm9yIChqID0gMDsgaiA8IDY7ICsraikKKwkJcHJpbnRrKCIlYyUuMngiLCAoaj8gJzonOiAnICcpLCBkZXYtPmRldl9hZGRyW2pdKTsKKwlYWERFQlVHKCgiLCBiYXNlX2FkZHI9JSMwbHgiLCBkZXYtPmJhc2VfYWRkcikpOworCXByaW50aygiXG4iKTsKKwkKKwlyZXR1cm4gMDsKKworZXJyX291dF9pcnEyOgorCWZyZWVfaXJxKGJwLT5yeF9kbWFfaW50ciwgZGV2KTsKK2Vycl9vdXRfaXJxMToKKwlmcmVlX2lycShicC0+dHhfZG1hX2ludHIsIGRldik7CitlcnJfb3V0X2lycTA6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CitlcnJfb3V0X2lvdW5tYXBfcng6CisJaW91bm1hcChicC0+cnhfZG1hKTsKK2Vycl9vdXRfaW91bm1hcF90eDoKKwlpb3VubWFwKGJwLT50eF9kbWEpOworZXJyX291dF9pb3VubWFwOgorCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKWRldi0+YmFzZV9hZGRyKTsKK291dF9yZWxlYXNlOgorCW1hY2lvX3JlbGVhc2VfcmVzb3VyY2VzKG1kZXYpOworb3V0X2ZyZWU6CisJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfQk1BQ19FTkFCTEUsIG1hY2lvX2dldF9vZl9ub2RlKGJwLT5tZGV2KSwgMCwgMCk7CisJZnJlZV9uZXRkZXYoZGV2KTsKKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGJtYWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBibWFjX2RhdGEgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkvKiBYWERFQlVHKCgiYm1hYzogZW50ZXIgb3BlblxuIikpOyAqLworCS8qIHJlc2V0IHRoZSBjaGlwICovCisJYnAtPm9wZW5lZCA9IDE7CisJYm1hY19yZXNldF9hbmRfZW5hYmxlKGRldik7CisJZW5hYmxlX2lycShkZXYtPmlycSk7CisJZGV2LT5mbGFncyB8PSBJRkZfUlVOTklORzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibWFjX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJtYWNfZGF0YSAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKnJkID0gYnAtPnJ4X2RtYTsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICp0ZCA9IGJwLT50eF9kbWE7CisJdW5zaWduZWQgc2hvcnQgY29uZmlnOworCWludCBpOworCisJYnAtPnNsZWVwaW5nID0gMTsKKwlkZXYtPmZsYWdzICY9IH4oSUZGX1VQIHwgSUZGX1JVTk5JTkcpOworCisJLyogZGlzYWJsZSByeCBhbmQgdHggKi8KKwljb25maWcgPSBibXJlYWQoZGV2LCBSWENGRyk7CisJYm13cml0ZShkZXYsIFJYQ0ZHLCAoY29uZmlnICYgflJ4TUFDRW5hYmxlKSk7CisKKwljb25maWcgPSBibXJlYWQoZGV2LCBUWENGRyk7CisJYm13cml0ZShkZXYsIFRYQ0ZHLCAoY29uZmlnICYgflR4TUFDRW5hYmxlKSk7CisKKwlibXdyaXRlKGRldiwgSU5URElTQUJMRSwgRGlzYWJsZUFsbCk7IC8qIGRpc2FibGUgYWxsIGludHJzICovCisKKwkvKiBkaXNhYmxlIHJ4IGFuZCB0eCBkbWEgKi8KKwlzdF9sZTMyKCZyZC0+Y29udHJvbCwgREJETUFfQ0xFQVIoUlVOfFBBVVNFfEZMVVNIfFdBS0UpKTsJLyogY2xlYXIgcnVuIGJpdCAqLworCXN0X2xlMzIoJnRkLT5jb250cm9sLCBEQkRNQV9DTEVBUihSVU58UEFVU0V8RkxVU0h8V0FLRSkpOwkvKiBjbGVhciBydW4gYml0ICovCisKKwkvKiBmcmVlIHNvbWUgc2tiJ3MgKi8KKwlYWERFQlVHKCgiYm1hYzogZnJlZSByeCBidWZzXG4iKSk7CisJZm9yIChpPTA7IGk8Tl9SWF9SSU5HOyBpKyspIHsKKwkJaWYgKGJwLT5yeF9idWZzW2ldICE9IE5VTEwpIHsKKwkJCWRldl9rZnJlZV9za2IoYnAtPnJ4X2J1ZnNbaV0pOworCQkJYnAtPnJ4X2J1ZnNbaV0gPSBOVUxMOworCQl9CisJfQorCVhYREVCVUcoKCJibWFjOiBmcmVlIHR4IGJ1ZnNcbiIpKTsKKwlmb3IgKGkgPSAwOyBpPE5fVFhfUklORzsgaSsrKSB7CisJCWlmIChicC0+dHhfYnVmc1tpXSAhPSBOVUxMKSB7CisJCQlkZXZfa2ZyZWVfc2tiKGJwLT50eF9idWZzW2ldKTsKKwkJCWJwLT50eF9idWZzW2ldID0gTlVMTDsKKwkJfQorCX0KKwlYWERFQlVHKCgiYm1hYzogYWxsIGJ1ZnMgZnJlZWRcbiIpKTsKKworCWJwLT5vcGVuZWQgPSAwOworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9CTUFDX0VOQUJMRSwgbWFjaW9fZ2V0X29mX25vZGUoYnAtPm1kZXYpLCAwLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorYm1hY19zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBibWFjX2RhdGEgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoYnAtPnNsZWVwaW5nKQorCQlyZXR1cm47CisJCQorCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCXdoaWxlICgxKSB7CisJCWkgPSBicC0+dHhfZmlsbCArIDE7CisJCWlmIChpID49IE5fVFhfUklORykKKwkJCWkgPSAwOworCQlpZiAoaSA9PSBicC0+dHhfZW1wdHkpCisJCQlicmVhazsKKwkJc2tiID0gc2tiX2RlcXVldWUoYnAtPnF1ZXVlKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWJtYWNfdHJhbnNtaXRfcGFja2V0KHNrYiwgZGV2KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludAorYm1hY19vdXRwdXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYm1hY19kYXRhICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc2tiX3F1ZXVlX3RhaWwoYnAtPnF1ZXVlLCBza2IpOworCWJtYWNfc3RhcnQoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYm1hY190eF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7CisJc3RydWN0IGJtYWNfZGF0YSAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKnRkID0gYnAtPnR4X2RtYTsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpyZCA9IGJwLT5yeF9kbWE7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqY3A7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCBjb25maWcsIG9sZENvbmZpZzsKKwlpbnQgaTsKKworCVhYREVCVUcoKCJibWFjOiB0eF90aW1lb3V0IGNhbGxlZFxuIikpOworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+bG9jaywgZmxhZ3MpOworCWJwLT50aW1lb3V0X2FjdGl2ZSA9IDA7CisKKwkvKiB1cGRhdGUgdmFyaW91cyBjb3VudGVycyAqLworLyogICAgIAlibWFjX2hhbmRsZV9taXNjX2ludHJzKGJwLCAwKTsgKi8KKworCWNwID0gJmJwLT50eF9jbWRzW2JwLT50eF9lbXB0eV07CisvKglYWERFQlVHKChLRVJOX0RFQlVHICJibWFjOiB0eCBkbWFzdGF0PSV4ICV4IHJ1bnQ9JWQgcHI9JXggZnM9JXggZmM9JXhcbiIsICovCisvKiAJICAgbGRfbGUzMigmdGQtPnN0YXR1cyksIGxkX2xlMTYoJmNwLT54ZmVyX3N0YXR1cyksIGJwLT50eF9iYWRfcnVudCwgKi8KKy8qIAkgICBtYi0+cHIsIG1iLT54bXRmcywgbWItPmZpZm9mYykpOyAqLworCisJLyogdHVybiBvZmYgYm90aCB0eCBhbmQgcnggYW5kIHJlc2V0IHRoZSBjaGlwICovCisJY29uZmlnID0gYm1yZWFkKGRldiwgUlhDRkcpOworCWJtd3JpdGUoZGV2LCBSWENGRywgKGNvbmZpZyAmIH5SeE1BQ0VuYWJsZSkpOworCWNvbmZpZyA9IGJtcmVhZChkZXYsIFRYQ0ZHKTsKKwlibXdyaXRlKGRldiwgVFhDRkcsIChjb25maWcgJiB+VHhNQUNFbmFibGUpKTsKKwlvdXRfbGUzMigmdGQtPmNvbnRyb2wsIERCRE1BX0NMRUFSKFJVTnxQQVVTRXxGTFVTSHxXQUtFfEFDVElWRXxERUFEKSk7CisJcHJpbnRrKEtFUk5fRVJSICJibWFjOiB0cmFuc21pdCB0aW1lb3V0IC0gcmVzZXR0aW5nXG4iKTsKKwlibWFjX2VuYWJsZV9hbmRfcmVzZXRfY2hpcChkZXYpOworCisJLyogcmVzdGFydCByeCBkbWEgKi8KKwljcCA9IGJ1c190b192aXJ0KGxkX2xlMzIoJnJkLT5jbWRwdHIpKTsKKwlvdXRfbGUzMigmcmQtPmNvbnRyb2wsIERCRE1BX0NMRUFSKFJVTnxQQVVTRXxGTFVTSHxXQUtFfEFDVElWRXxERUFEKSk7CisJb3V0X2xlMTYoJmNwLT54ZmVyX3N0YXR1cywgMCk7CisJb3V0X2xlMzIoJnJkLT5jbWRwdHIsIHZpcnRfdG9fYnVzKGNwKSk7CisJb3V0X2xlMzIoJnJkLT5jb250cm9sLCBEQkRNQV9TRVQoUlVOfFdBS0UpKTsKKworCS8qIGZpeCB1cCB0aGUgdHJhbnNtaXQgc2lkZSAqLworCVhYREVCVUcoKEtFUk5fREVCVUcgImJtYWM6IHR4IGVtcHR5PSVkIGZpbGw9JWQgZnVsbHVwPSVkXG4iLAorCQkgYnAtPnR4X2VtcHR5LCBicC0+dHhfZmlsbCwgYnAtPnR4X2Z1bGx1cCkpOworCWkgPSBicC0+dHhfZW1wdHk7CisJKyticC0+c3RhdHMudHhfZXJyb3JzOworCWlmIChpICE9IGJwLT50eF9maWxsKSB7CisJCWRldl9rZnJlZV9za2IoYnAtPnR4X2J1ZnNbaV0pOworCQlicC0+dHhfYnVmc1tpXSA9IE5VTEw7CisJCWlmICgrK2kgPj0gTl9UWF9SSU5HKSBpID0gMDsKKwkJYnAtPnR4X2VtcHR5ID0gaTsKKwl9CisJYnAtPnR4X2Z1bGx1cCA9IDA7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCWlmIChpICE9IGJwLT50eF9maWxsKSB7CisJCWNwID0gJmJwLT50eF9jbWRzW2ldOworCQlvdXRfbGUxNigmY3AtPnhmZXJfc3RhdHVzLCAwKTsKKwkJb3V0X2xlMTYoJmNwLT5jb21tYW5kLCBPVVRQVVRfTEFTVCk7CisJCW91dF9sZTMyKCZ0ZC0+Y21kcHRyLCB2aXJ0X3RvX2J1cyhjcCkpOworCQlvdXRfbGUzMigmdGQtPmNvbnRyb2wsIERCRE1BX1NFVChSVU4pKTsKKwkJLyogCWJtYWNfc2V0X3RpbWVvdXQoZGV2KTsgKi8KKwkJWFhERUJVRygoS0VSTl9ERUJVRyAiYm1hYzogc3RhcnRpbmcgJWRcbiIsIGkpKTsKKwl9CisKKwkvKiB0dXJuIGl0IGJhY2sgb24gKi8KKwlvbGRDb25maWcgPSBibXJlYWQoZGV2LCBSWENGRyk7CQkKKwlibXdyaXRlKGRldiwgUlhDRkcsIG9sZENvbmZpZyB8IFJ4TUFDRW5hYmxlICk7CisJb2xkQ29uZmlnID0gYm1yZWFkKGRldiwgVFhDRkcpOwkJCisJYm13cml0ZShkZXYsIFRYQ0ZHLCBvbGRDb25maWcgfCBUeE1BQ0VuYWJsZSApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIGR1bXBfZGJkbWEodm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqY3AsaW50IGNvdW50KQoreworCWludCBpLCppcDsKKwkKKwlmb3IgKGk9MDtpPCBjb3VudDtpKyspIHsKKwkJaXAgPSAoaW50KikoY3AraSk7CisJCisJCXByaW50aygiZGJkbWEgcmVxIDB4JXggYWRkciAweCV4IGJhZGRyIDB4JXggeGZlci9yZXMgMHgleFxuIiwKKwkJICAgICAgIGxkX2xlMzIoaXArMCksCisJCSAgICAgICBsZF9sZTMyKGlwKzEpLAorCQkgICAgICAgbGRfbGUzMihpcCsyKSwKKwkJICAgICAgIGxkX2xlMzIoaXArMykpOworCX0KKworfQorI2VuZGlmCisKKyNpZiAwCitzdGF0aWMgaW50CitibWFjX3Byb2NfaW5mbyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoKQoreworCWludCBsZW4gPSAwOworCW9mZl90IHBvcyAgID0gMDsKKwlvZmZfdCBiZWdpbiA9IDA7CisJaW50IGk7CisKKwlpZiAoYm1hY19kZXZzID09IE5VTEwpCisJCXJldHVybiAoLUVOT1NZUyk7CisKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIsICJCTUFDIGNvdW50ZXJzICYgcmVnaXN0ZXJzXG4iKTsKKworCWZvciAoaSA9IDA7IGk8Tl9SRUdfRU5UUklFUzsgaSsrKSB7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiVzOiAlIzA4eFxuIiwKKwkJCSAgICAgICByZWdfZW50cmllc1tpXS5uYW1lLAorCQkJICAgICAgIGJtcmVhZChibWFjX2RldnMsIHJlZ19lbnRyaWVzW2ldLnJlZ19vZmZzZXQpKTsKKwkJcG9zID0gYmVnaW4gKyBsZW47CisKKwkJaWYgKHBvcyA8IG9mZnNldCkgeworCQkJbGVuID0gMDsKKwkJCWJlZ2luID0gcG9zOworCQl9CisKKwkJaWYgKHBvcyA+IG9mZnNldCtsZW5ndGgpIGJyZWFrOworCX0KKworCSpzdGFydCA9IGJ1ZmZlciArIChvZmZzZXQgLSBiZWdpbik7CisJbGVuIC09IChvZmZzZXQgLSBiZWdpbik7CisKKwlpZiAobGVuID4gbGVuZ3RoKSBsZW4gPSBsZW5ndGg7CisKKwlyZXR1cm4gbGVuOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGJtYWNfcmVtb3ZlKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG1hY2lvX2dldF9kcnZkYXRhKG1kZXYpOworCXN0cnVjdCBibWFjX2RhdGEgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKyAgICAgICAJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJZnJlZV9pcnEoYnAtPnR4X2RtYV9pbnRyLCBkZXYpOwkKKwlmcmVlX2lycShicC0+cnhfZG1hX2ludHIsIGRldik7CisKKwlpb3VubWFwKCh2b2lkIF9faW9tZW0gKilkZXYtPmJhc2VfYWRkcik7CisJaW91bm1hcChicC0+dHhfZG1hKTsKKwlpb3VubWFwKGJwLT5yeF9kbWEpOworCisJbWFjaW9fcmVsZWFzZV9yZXNvdXJjZXMobWRldik7CisKKwlmcmVlX25ldGRldihkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfbWF0Y2ggYm1hY19tYXRjaFtdID0gCit7CisJeworCS5uYW1lIAkJPSAiYm1hYyIsCisJLnR5cGUJCT0gT0ZfQU5ZX01BVENILAorCS5jb21wYXRpYmxlCT0gT0ZfQU5ZX01BVENILAorCS5kYXRhCQk9ICh2b2lkICopMCwKKwl9LAorCXsKKwkubmFtZSAJCT0gT0ZfQU5ZX01BVENILAorCS50eXBlCQk9ICJuZXR3b3JrIiwKKwkuY29tcGF0aWJsZQk9ICJibWFjKyIsCisJLmRhdGEJCT0gKHZvaWQgKikxLAorCX0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IG1hY2lvX2RyaXZlciBibWFjX2RyaXZlciA9IAoreworCS5uYW1lIAkJPSAiYm1hYyIsCisJLm1hdGNoX3RhYmxlCT0gYm1hY19tYXRjaCwKKwkucHJvYmUJCT0gYm1hY19wcm9iZSwKKwkucmVtb3ZlCQk9IGJtYWNfcmVtb3ZlLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gYm1hY19zdXNwZW5kLAorCS5yZXN1bWUJCT0gYm1hY19yZXN1bWUsCisjZW5kaWYKK307CisKKworc3RhdGljIGludCBfX2luaXQgYm1hY19pbml0KHZvaWQpCit7CisJaWYgKGJtYWNfZW1lcmdlbmN5X3J4YnVmID09IE5VTEwpIHsKKwkJYm1hY19lbWVyZ2VuY3lfcnhidWYgPSBrbWFsbG9jKFJYX0JVRkxFTiwgR0ZQX0tFUk5FTCk7CisJCWlmIChibWFjX2VtZXJnZW5jeV9yeGJ1ZiA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkJNQUM6IGNhbid0IGFsbG9jYXRlIGVtZXJnZW5jeSBSWCBidWZmZXJcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwlyZXR1cm4gbWFjaW9fcmVnaXN0ZXJfZHJpdmVyKCZibWFjX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBibWFjX2V4aXQodm9pZCkKK3sKKwltYWNpb191bnJlZ2lzdGVyX2RyaXZlcigmYm1hY19kcml2ZXIpOworCisJaWYgKGJtYWNfZW1lcmdlbmN5X3J4YnVmICE9IE5VTEwpIHsKKwkJa2ZyZWUoYm1hY19lbWVyZ2VuY3lfcnhidWYpOworCQlibWFjX2VtZXJnZW5jeV9yeGJ1ZiA9IE5VTEw7CisJfQorfQorCitNT0RVTEVfQVVUSE9SKCJSYW5keSBHb2JiZWwvUGF1bCBNYWNrZXJyYXMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUG93ZXJNYWMgQk1BQyBldGhlcm5ldCBkcml2ZXIuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGJtYWNfaW5pdCk7Cittb2R1bGVfZXhpdChibWFjX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm1hYy5oIGIvZHJpdmVycy9uZXQvYm1hYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmM2I5M2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ibWFjLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBtYWNlLmggLSBkZWZpbml0aW9ucyBmb3IgdGhlIHJlZ2lzdGVycyBpbiB0aGUgIkJpZyBNYWMiCisgKiAgRXRoZXJuZXQgY29udHJvbGxlciBmb3VuZCBpbiBQb3dlck1hYyBHMyBtb2RlbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4IFJhbmR5IEdvYmJlbC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy8qIFRoZSAiQmlnIE1BQyIgYXBwZWFycyB0byBoYXZlIHNvbWUgcGFydHMgaW4gY29tbW9uIHdpdGggdGhlIFN1biAiSGFwcHkgTWVhbCIKKyAqIChITUUpIGNvbnRyb2xsZXIuICBTZWUgc3VuaG1lLmgKKyAqLworCisgCisvKiByZWdpc3RlciBvZmZzZXRzICovCisKKy8qIGdsb2JhbCBzdGF0dXMgYW5kIGNvbnRyb2wgKi8KKyNkZWZpbmUJWElGQwkJMHgwMDAgICAvKiBsb3ctbGV2ZWwgaW50ZXJmYWNlIGNvbnRyb2wgKi8KKyMJZGVmaW5lCVR4T3V0cHV0RW5hYmxlCTB4MDAwMSAvKiBvdXRwdXQgZHJpdmVyIGVuYWJsZSAqLworIwlkZWZpbmUJWElGTG9vcGJhY2sJMHgwMDAyIC8qIExvb3BiYWNrLW1vZGUgWElGIGVuYWJsZSAqLworIwlkZWZpbmUJTUlJTG9vcGJhY2sJMHgwMDA0IC8qIExvb3BiYWNrLW1vZGUgTUlJIGVuYWJsZSAqLworIwlkZWZpbmUJTUlJTG9vcGJhY2tCaXRzCTB4MDAwNgorIwlkZWZpbmUJTUlJQnVmZkRpc2FibGUJMHgwMDA4IC8qIE1JSSByZWNlaXZlIGJ1ZmZlciBkaXNhYmxlICovCisjCWRlZmluZQlTUUVUZXN0RW5hYmxlCTB4MDAxMCAvKiBTUUUgdGVzdCBlbmFibGUgKi8KKyMJZGVmaW5lCVNRRVRpbWVXaW5kb3cJMHgwM2UwIC8qIFNRRSB0aW1lIHdpbmRvdyAqLworIwlkZWZpbmUJWElGTGFuY2VNb2RlCTB4MDAxMCAvKiBMYW5jZSBtb2RlIGVuYWJsZSAqLworIwlkZWZpbmUJWElGTGFuY2VJUEcwCTB4MDNlMCAvKiBMYW5jZSBtb2RlIElQRzAgKi8KKyNkZWZpbmUJVFhGSUZPQ1NSCTB4MTAwICAgLyogdHJhbnNtaXQgRklGTyBjb250cm9sICovCisjCWRlZmluZQlUeEZJRk9FbmFibGUJMHgwMDAxCisjZGVmaW5lCVRYVEgJCTB4MTEwICAgLyogdHJhbnNtaXQgdGhyZXNob2xkICovCisjCWRlZmluZQlUeFRocmVzaG9sZAkweDAwMDQKKyNkZWZpbmUgUlhGSUZPQ1NSCTB4MTIwICAgLyogcmVjZWl2ZSBGSUZPIGNvbnRyb2wgKi8KKyMJZGVmaW5lCVJ4RklGT0VuYWJsZQkweDAwMDEKKyNkZWZpbmUgTUVNQURECQkweDEzMCAgIC8qIG1lbW9yeSBhZGRyZXNzLCB1bmtub3duIGZ1bmN0aW9uICovCisjZGVmaW5lIE1FTURBVEFISQkweDE0MCAgIC8qIG1lbW9yeSBkYXRhIGhpZ2gsIHByZXNlbnRseSB1bnVzZWQgaW4gZHJpdmVyICovCisjZGVmaW5lIE1FTURBVEFMTwkweDE1MCAgIC8qIG1lbW9yeSBkYXRhIGxvdywgcHJlc2VudGx5IHVudXNlZCBpbiBkcml2ZXIgKi8KKyNkZWZpbmUgWENWUklGCQkweDE2MCAgIC8qIHRyYW5zY2VpdmVyIGludGVyZmFjZSBjb250cm9sICovCisjCWRlZmluZQlDT0xBY3RpdmVMb3cJMHgwMDAyCisjCWRlZmluZQlTZXJpYWxNb2RlCTB4MDAwNAorIwlkZWZpbmUJQ2xrQml0CQkweDAwMDgKKyMJZGVmaW5lCUxpbmtTdGF0dXMJMHgwMTAwCisjZGVmaW5lIENISVBJRCAgICAgICAgICAweDE3MCAgIC8qIGNoaXAgSUQgKi8KKyNkZWZpbmUJTUlGQ1NSCQkweDE4MCAgIC8qID8/PyAqLworI2RlZmluZQlTUk9NQ1NSCQkweDE5MCAgIC8qIFNST00gY29udHJvbCAqLworIwlkZWZpbmUJQ2hpcFNlbGVjdAkweDAwMDEKKyMJZGVmaW5lCUNsawkJMHgwMDAyCisjZGVmaW5lIFRYUE5UUgkJMHgxYTAgICAvKiB0cmFuc21pdCBwb2ludGVyICovCisjZGVmaW5lCVJYUE5UUgkJMHgxYjAgICAvKiByZWNlaXZlIHBvaW50ZXIgKi8KKyNkZWZpbmUJU1RBVFVTCQkweDIwMCAgIC8qIHN0YXR1cy0tcmVhZGluZyB0aGlzIGNsZWFycyBpdCAqLworI2RlZmluZQlJTlRESVNBQkxFCTB4MjEwICAgLyogaW50ZXJydXB0IGVuYWJsZS9kaXNhYmxlIGNvbnRyb2wgKi8KKy8qIGJpdHMgYmVsb3cgYXJlIHRoZSBzYW1lIGluIGJvdGggU1RBVFVTIGFuZCBJTlRESVNBQkxFIHJlZ2lzdGVycyAqLworIwlkZWZpbmUJRnJhbWVSZWNlaXZlZAkweDAwMDAwMDAxIC8qIFJlY2VpdmVkIGEgZnJhbWUgKi8KKyMJZGVmaW5lCVJ4RnJhbWVDbnRFeHAJMHgwMDAwMDAwMiAvKiBSZWNlaXZlIGZyYW1lIGNvdW50ZXIgZXhwaXJlZCAqLworIwlkZWZpbmUJUnhBbGlnbkNudEV4cAkweDAwMDAwMDA0IC8qIEFsaWduLWVycm9yIGNvdW50ZXIgZXhwaXJlZCAqLworIwlkZWZpbmUJUnhDUkNDbnRFeHAJMHgwMDAwMDAwOCAvKiBDUkMtZXJyb3IgY291bnRlciBleHBpcmVkICovCisjCWRlZmluZQlSeExlbkNudEV4cAkweDAwMDAwMDEwIC8qIExlbmd0aC1lcnJvciBjb3VudGVyIGV4cGlyZWQgKi8KKyMJZGVmaW5lCVJ4T3ZlckZsb3cJMHgwMDAwMDAyMCAvKiBSZWNlaXZlIEZJRk8gb3ZlcmZsb3cgKi8KKyMJZGVmaW5lCVJ4Q29kZVZpb2xhdGlvbgkweDAwMDAwMDQwIC8qIENvZGUtdmlvbGF0aW9uIGNvdW50ZXIgZXhwaXJlZCAqLworIwlkZWZpbmUJU1FFVGVzdEVycm9yCTB4MDAwMDAwODAgLyogVGVzdCBlcnJvciBpbiBYSUYgZm9yIFNRRSAqLworIwlkZWZpbmUJRnJhbWVTZW50CTB4MDAwMDAxMDAgLyogVHJhbnNtaXR0ZWQgYSBmcmFtZSAqLworIwlkZWZpbmUJVHhVbmRlcnJ1bgkweDAwMDAwMjAwIC8qIFRyYW5zbWl0IEZJRk8gdW5kZXJydW4gKi8KKyMJZGVmaW5lCVR4TWF4U2l6ZUVycm9yCTB4MDAwMDA0MDAgLyogTWF4LXBhY2tldCBzaXplIGVycm9yICovCisjCWRlZmluZQlUeE5vcm1hbENvbGxFeHAJMHgwMDAwMDgwMCAvKiBOb3JtYWwtY29sbGlzaW9uIGNvdW50ZXIgZXhwaXJlZCAqLworIwlkZWZpbmUJVHhFeGNlc3NDb2xsRXhwCTB4MDAwMDEwMDAgLyogRXhjZXNzLWNvbGxpc2lvbiBjb3VudGVyIGV4cGlyZWQgKi8KKyMJZGVmaW5lCVR4TGF0ZUNvbGxFeHAJMHgwMDAwMjAwMCAvKiBMYXRlLWNvbGxpc2lvbiBjb3VudGVyIGV4cGlyZWQgKi8KKyMJZGVmaW5lCVR4TmV0d29ya0NvbGxFeHAgMHgwMDAwNDAwMCAvKiBGaXJzdC1jb2xsaXNpb24gY291bnRlciBleHBpcmVkICovCisjCWRlZmluZQlUeERlZmVyVGltZXJFeHAJMHgwMDAwODAwMCAvKiBEZWZlci10aW1lciBleHBpcmVkICovCisjCWRlZmluZQlSeEZJRk9Ub0hvc3QJMHgwMDAxMDAwMCAvKiBEYXRhIG1vdmVkIGZyb20gRklGTyB0byBob3N0ICovCisjCWRlZmluZQlSeE5vRGVzY3JpcHRvcnMJMHgwMDAyMDAwMCAvKiBObyBtb3JlIHJlY2VpdmUgZGVzY3JpcHRvcnMgKi8KKyMJZGVmaW5lCVJ4RE1BRXJyb3IJMHgwMDA0MDAwMCAvKiBFcnJvciBkdXJpbmcgcmVjZWl2ZSBETUEgKi8KKyMJZGVmaW5lCVJ4RE1BTGF0ZUVycgkweDAwMDgwMDAwIC8qIFJlY2VpdmUgRE1BLCBkYXRhIGxhdGUgKi8KKyMJZGVmaW5lCVJ4UGFyaXR5RXJyCTB4MDAxMDAwMDAgLyogUGFyaXR5IGVycm9yIGR1cmluZyByZWNlaXZlIERNQSAqLworIwlkZWZpbmUJUnhUYWdFcnJvcgkweDAwMjAwMDAwIC8qIFRhZyBlcnJvciBkdXJpbmcgcmVjZWl2ZSBETUEgKi8KKyMJZGVmaW5lCVR4RU9QRXJyb3IJMHgwMDQwMDAwMCAvKiBUeCBkZXNjcmlwdG9yIGRpZCBub3QgaGF2ZSBFT1Agc2V0ICovCisjCWRlZmluZQlNSUZJbnRyRXZlbnQJMHgwMDgwMDAwMCAvKiBNSUYgaXMgc2lnbmFsaW5nIGFuIGludGVycnVwdCAqLworIwlkZWZpbmUJVHhIb3N0VG9GSUZPCTB4MDEwMDAwMDAgLyogRGF0YSBtb3ZlZCBmcm9tIGhvc3QgdG8gRklGTyAgKi8KKyMJZGVmaW5lCVR4RklGT0FsbFNlbnQJMHgwMjAwMDAwMCAvKiBUcmFuc21pdHRlZCBhbGwgcGFja2V0cyBpbiBGSUZPICovCisjCWRlZmluZQlUeERNQUVycm9yCTB4MDQwMDAwMDAgLyogRXJyb3IgZHVyaW5nIHRyYW5zbWl0IERNQSAqLworIwlkZWZpbmUJVHhETUFMYXRlRXJyb3IJMHgwODAwMDAwMCAvKiBMYXRlIGVycm9yIGR1cmluZyB0cmFuc21pdCBETUEgKi8KKyMJZGVmaW5lCVR4UGFyaXR5RXJyb3IJMHgxMDAwMDAwMCAvKiBQYXJpdHkgZXJyb3IgZHVyaW5nIHRyYW5zbWl0IERNQSAqLworIwlkZWZpbmUJVHhUYWdFcnJvcgkweDIwMDAwMDAwIC8qIFRhZyBlcnJvciBkdXJpbmcgdHJhbnNtaXQgRE1BICovCisjCWRlZmluZQlQSU9FcnJvcgkweDQwMDAwMDAwIC8qIFBJTyBhY2Nlc3MgZ290IGFuIGVycm9yICovCisjCWRlZmluZQlQSU9QYXJpdHlFcnJvcgkweDgwMDAwMDAwIC8qIFBJTyBhY2Nlc3MgZ290IGEgcGFyaXR5IGVycm9yICAqLworIwlkZWZpbmUJRGlzYWJsZUFsbAkweGZmZmZmZmZmCisjCWRlZmluZQlFbmFibGVBbGwJMHgwMDAwMDAwMAorLyogIwlkZWZpbmUJTm9ybWFsSW50RXZlbnRzCX4oRnJhbWVSZWNlaXZlZCB8IEZyYW1lU2VudCB8IFR4VW5kZXJydW4pICovCisjCWRlZmluZQlFbmFibGVOb3JtYWwJfihGcmFtZVJlY2VpdmVkIHwgRnJhbWVTZW50KQorIwlkZWZpbmUJRW5hYmxlRXJyb3JzCShGcmFtZVJlY2VpdmVkIHwgRnJhbWVTZW50KQorIwlkZWZpbmUJUnhFcnJvck1hc2sJKFJ4RnJhbWVDbnRFeHAgfCBSeEFsaWduQ250RXhwIHwgUnhDUkNDbnRFeHAgfCBcCisJCQkJIFJ4TGVuQ250RXhwIHwgUnhPdmVyRmxvdyB8IFJ4Q29kZVZpb2xhdGlvbikKKyMJZGVmaW5lCVR4RXJyb3JNYXNrCShUeFVuZGVycnVuIHwgVHhNYXhTaXplRXJyb3IgfCBUeEV4Y2Vzc0NvbGxFeHAgfCBcCisJCQkJIFR4TGF0ZUNvbGxFeHAgfCBUeE5ldHdvcmtDb2xsRXhwIHwgVHhEZWZlclRpbWVyRXhwKQorCisvKiB0cmFuc21pdCBjb250cm9sICovCisjZGVmaW5lCVRYUlNUCQkweDQyMCAgIC8qIHRyYW5zbWl0IHJlc2V0ICovCisjCWRlZmluZQlUeFJlc2V0Qml0CTB4MDAwMQorI2RlZmluZQlUWENGRwkJMHg0MzAgICAvKiB0cmFuc21pdCBjb25maWd1cmF0aW9uIGNvbnRyb2wqLworIwlkZWZpbmUJVHhNQUNFbmFibGUJMHgwMDAxIC8qIG91dHB1dCBkcml2ZXIgZW5hYmxlICovCisjCWRlZmluZQlUeFNsb3dNb2RlCTB4MDAyMCAvKiBlbmFibGUgc2xvdyBtb2RlICovCisjCWRlZmluZQlUeElnbm9yZUNvbGwJMHgwMDQwIC8qIGlnbm9yZSB0cmFuc21pdCBjb2xsaXNpb25zICovCisjCWRlZmluZQlUeE5vRkNTCQkweDAwODAgLyogZG8gbm90IGVtaXQgRkNTICovCisjCWRlZmluZQlUeE5vQmFja29mZgkweDAxMDAgLyogbm8gYmFja29mZiBpbiBjYXNlIG9mIGNvbGxpc2lvbnMgKi8KKyMJZGVmaW5lCVR4RnVsbER1cGxleAkweDAyMDAgLyogZW5hYmxlIGZ1bGwtZHVwbGV4ICovCisjCWRlZmluZQlUeE5ldmVyR2l2ZVVwCTB4MDQwMCAvKiBkb24ndCBnaXZlIHVwIG9uIHRyYW5zbWl0cyAqLworI2RlZmluZSBJUEcxCQkweDQ0MCAgIC8qIEludGVyLXBhY2tldCBnYXAgMSAqLworI2RlZmluZSBJUEcyCQkweDQ1MCAgIC8qIEludGVyLXBhY2tldCBnYXAgMiAqLworI2RlZmluZSBBTElNSVQJCTB4NDYwICAgLyogVHJhbnNtaXQgYXR0ZW1wdCBsaW1pdCAqLworI2RlZmluZSBTTE9UCQkweDQ3MCAgIC8qIFRyYW5zbWl0IHNsb3QgdGltZSAqLworI2RlZmluZSBQQUxFTgkJMHg0ODAgICAvKiBTaXplIG9mIHRyYW5zbWl0IHByZWFtYmxlICovCisjZGVmaW5lIFBBUEFUCQkweDQ5MCAgIC8qIFBhdHRlcm4gZm9yIHRyYW5zbWl0IHByZWFtYmxlICovCisjZGVmaW5lIFRYU0ZECQkweDRhMCAgIC8qIFRyYW5zbWl0IGZyYW1lIGRlbGltaXRlciAqLworI2RlZmluZSBKQU0JCTB4NGIwICAgLyogSmFtIHNpemUgKi8KKyNkZWZpbmUgVFhNQVgJCTB4NGMwICAgLyogVHJhbnNtaXQgbWF4IHBrdCBzaXplICovCisjZGVmaW5lIFRYTUlOCQkweDRkMCAgIC8qIFRyYW5zbWl0IG1pbiBwa3Qgc2l6ZSAqLworI2RlZmluZSBQQVJFRwkJMHg0ZTAgICAvKiBDb3VudCBvZiB0cmFuc21pdCBwZWFrIGF0dGVtcHRzICovCisjZGVmaW5lIERDTlQJCTB4NGYwICAgLyogVHJhbnNtaXQgZGVmZXIgdGltZXIgKi8KKyNkZWZpbmUgTkNDTlQJCTB4NTAwICAgLyogVHJhbnNtaXQgbm9ybWFsLWNvbGxpc2lvbiBjb3VudGVyICovCisjZGVmaW5lIE5UQ05UCQkweDUxMCAgIC8qIFRyYW5zbWl0IGZpcnN0LWNvbGxpc2lvbiBjb3VudGVyICovCisjZGVmaW5lIEVYQ05UCQkweDUyMCAgIC8qIFRyYW5zbWl0IGV4Y2Vzcy1jb2xsaXNpb24gY291bnRlciAqLworI2RlZmluZSBMVENOVAkJMHg1MzAgICAvKiBUcmFuc21pdCBsYXRlLWNvbGxpc2lvbiBjb3VudGVyICovCisjZGVmaW5lIFJTRUVECQkweDU0MCAgIC8qIFRyYW5zbWl0IHJhbmRvbSBudW1iZXIgc2VlZCAqLworI2RlZmluZSBUWFNNCQkweDU1MCAgIC8qIFRyYW5zbWl0IHN0YXRlIG1hY2hpbmUgKi8KKworLyogcmVjZWl2ZSBjb250cm9sICovCisjZGVmaW5lIFJYUlNUCQkweDYyMCAgIC8qIHJlY2VpdmUgcmVzZXQgKi8KKyMJZGVmaW5lCVJ4UmVzZXRWYWx1ZQkweDAwMDAKKyNkZWZpbmUgUlhDRkcJCTB4NjMwICAgLyogcmVjZWl2ZSBjb25maWd1cmF0aW9uIGNvbnRyb2wgKi8KKyMJZGVmaW5lCVJ4TUFDRW5hYmxlCTB4MDAwMSAvKiByZWNlaXZlciBvdmVyYWxsIGVuYWJsZSAqLworIwlkZWZpbmUJUnhDRkdSZXNlcnZlZAkweDAwMDQKKyMJZGVmaW5lCVJ4UGFkU3RyaXBFbmFiCTB4MDAyMCAvKiBlbmFibGUgcGFkIGJ5dGUgc3RyaXBwaW5nICovCisjCWRlZmluZQlSeFByb21pc2NFbmFibGUJMHgwMDQwIC8qIHR1cm4gb24gcHJvbWlzY3VvdXMgbW9kZSAqLworIwlkZWZpbmUJUnhOb0VyckNoZWNrCTB4MDA4MCAvKiBkaXNhYmxlIHJlY2VpdmUgZXJyb3IgY2hlY2tpbmcgKi8KKyMJZGVmaW5lCVJ4Q1JDTm9TdHJpcAkweDAxMDAgLyogZGlzYWJsZSBhdXRvLUNSQy1zdHJpcHBpbmcgKi8KKyMJZGVmaW5lCVJ4UmVqZWN0T3duUGFja2V0cyAweDAyMDAgLyogZG9uJ3QgcmVjZWl2ZSBvdXIgb3duIHBhY2tldHMgKi8KKyMJZGVmaW5lCVJ4R3JwUHJvbWlzY2sJMHgwNDAwIC8qIGVuYWJsZSBncm91cCBwcm9taXNjdW91cyBtb2RlICovCisjCWRlZmluZQlSeEhhc2hGaWx0ZXJFbmFibGUgMHgwODAwIC8qIGVuYWJsZSBoYXNoIGZpbHRlciAqLworIwlkZWZpbmUJUnhBZGRyRmlsdGVyRW5hYmxlIDB4MTAwMCAvKiBlbmFibGUgYWRkcmVzcyBmaWx0ZXIgKi8KKyNkZWZpbmUgUlhNQVgJCTB4NjQwICAgLyogTWF4IHJlY2VpdmUgcGFja2V0IHNpemUgKi8KKyNkZWZpbmUgUlhNSU4JCTB4NjUwICAgLyogTWluIHJlY2VpdmUgcGFja2V0IHNpemUgKi8KKyNkZWZpbmUgTUFERDIJCTB4NjYwICAgLyogb3VyIGVuZXQgYWRkcmVzcywgaGlnaCBwYXJ0ICovCisjZGVmaW5lIE1BREQxCQkweDY3MCAgIC8qIG91ciBlbmV0IGFkZHJlc3MsIG1pZGRsZSBwYXJ0ICovCisjZGVmaW5lIE1BREQwCQkweDY4MCAgIC8qIG91ciBlbmV0IGFkZHJlc3MsIGxvdyBwYXJ0ICovCisjZGVmaW5lIEZSQ05UCQkweDY5MCAgIC8qIHJlY2VpdmUgZnJhbWUgY291bnRlciAqLworI2RlZmluZSBMRUNOVAkJMHg2YTAgICAvKiBSZWNlaXZlIGV4Y2VzcyBsZW5ndGggZXJyb3IgY291bnRlciAqLworI2RlZmluZSBBRUNOVAkJMHg2YjAgICAvKiBSZWNlaXZlIG1pc2FsaWduZWQgZXJyb3IgY291bnRlciAqLworI2RlZmluZSBGRUNOVAkJMHg2YzAgICAvKiBSZWNlaXZlIENSQyBlcnJvciBjb3VudGVyICovCisjZGVmaW5lIFJYU00JCTB4NmQwICAgLyogUmVjZWl2ZSBzdGF0ZSBtYWNoaW5lICovCisjZGVmaW5lIFJYQ1YJCTB4NmUwICAgLyogUmVjZWl2ZSBjb2RlIHZpb2xhdGlvbiAqLworCisjZGVmaW5lIEJIQVNIMwkJMHg3MDAgICAvKiBtdWx0aWNhc3QgaGFzaCByZWdpc3RlciAqLworI2RlZmluZSBCSEFTSDIJCTB4NzEwICAgLyogbXVsdGljYXN0IGhhc2ggcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQkhBU0gxCQkweDcyMCAgIC8qIG11bHRpY2FzdCBoYXNoIHJlZ2lzdGVyICovCisjZGVmaW5lIEJIQVNIMAkJMHg3MzAgICAvKiBtdWx0aWNhc3QgaGFzaCByZWdpc3RlciAqLworCisjZGVmaW5lIEFGUjIJCTB4NzQwICAgLyogYWRkcmVzcyBmaWx0ZXJpbmcgc2V0dXA/ICovCisjZGVmaW5lIEFGUjEJCTB4NzUwICAgLyogYWRkcmVzcyBmaWx0ZXJpbmcgc2V0dXA/ICovCisjZGVmaW5lIEFGUjAJCTB4NzYwICAgLyogYWRkcmVzcyBmaWx0ZXJpbmcgc2V0dXA/ICovCisjZGVmaW5lIEFGQ1IJCTB4NzcwICAgLyogYWRkcmVzcyBmaWx0ZXIgY29tcGFyZSByZWdpc3Rlcj8gKi8KKyMJZGVmaW5lCUVuYWJsZUFsbENvbXBhcmVzIDB4MGZmZgorCisvKiBiaXRzIGluIFhJRkMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ib25kaW5nL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNTAzODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL01ha2VmaWxlCkBAIC0wLDAgKzEsOCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIEV0aGVybmV0IEJvbmRpbmcgZHJpdmVyCisjCisKK29iai0kKENPTkZJR19CT05ESU5HKSArPSBib25kaW5nLm8KKworYm9uZGluZy1vYmpzIDo9IGJvbmRfbWFpbi5vIGJvbmRfM2FkLm8gYm9uZF9hbGIubworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfM2FkLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfM2FkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIzM2M0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF8zYWQuYwpAQCAtMCwwICsxLDI0NTEgQEAKKy8qCisgKiBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqCisgKiBDaGFuZ2VzOgorICoKKyAqIDIwMDMvMDUvMDEgLSBUc2lwcHkgTWVuZGVsc29uIDx0c2lwcHkubWVuZGVsc29uIGF0IGludGVsIGRvdCBjb20+IGFuZAorICoJCUFtaXIgTm9hbSA8YW1pci5ub2FtIGF0IGludGVsIGRvdCBjb20+CisgKgktIEFkZGVkIHN1cHBvcnQgZm9yIGxhY3BfcmF0ZSBtb2R1bGUgcGFyYW0uCisgKgorICogMjAwMy8wNS8wMSAtIFNobXVsaWsgSGVuIDxzaG11bGlrLmhlbiBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBCYXNlZCBvbiBkaXNjdXNzaW9uIG9uIG1haWxpbmcgbGlzdCwgY2hhbmdlZCBsb2NraW5nIHNjaGVtZQorICoJICB0byB1c2UgbG9jay91bmxvY2sgb3IgbG9ja19iaC91bmxvY2tfYmggYXBwcm9wcmlhdGVseSBpbnN0ZWFkCisgKgkgIG9mIGxvY2tfaXJxc2F2ZS91bmxvY2tfaXJxcmVzdG9yZS4gVGhlIG5ldyBzY2hlbWUgaGVscHMgZXhwb3NpbmcKKyAqCSAgaGlkZGVuIGJ1Z3MgYW5kIHNvbHZlcyBzeXN0ZW0gaGFuZ3MgdGhhdCBvY2N1cnJlZCBkdWUgdG8gdGhlIGZhY3QKKyAqCSAgdGhhdCBob2xkaW5nIGxvY2tfaXJxc2F2ZSBkb2Vzbid0IHByZXZlbnQgc29mdGlycXMgZnJvbSBydW5uaW5nLgorICoJICBUaGlzIGFsc28gaW5jcmVhc2VzIHRvdGFsIHRocm91Z2hwdXQgc2luY2UgaW50ZXJydXB0cyBhcmUgbm90CisgKgkgIGJsb2NrZWQgb24gZWFjaCB0cmFuc21pdHRlZCBwYWNrZXRzIG9yIG1vbml0b3IgdGltZW91dC4KKyAqCisgKiAyMDAzLzA1LzAxIC0gU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKgktIFJlbmFtZWQgYm9uZF8zYWRfbGlua19zdGF0dXNfY2hhbmdlZCgpIHRvCisgKgkgIGJvbmRfM2FkX2hhbmRsZV9saW5rX2NoYW5nZSgpIGZvciBjb21wYXRpYmlsaXR5IHdpdGggVExCLgorICoKKyAqIDIwMDMvMDUvMjAgLSBBbWlyIE5vYW0gPGFtaXIubm9hbSBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBGaXggbG9uZyBmYWlsIG92ZXIgdGltZSB3aGVuIHJlbGVhc2luZyBsYXN0IHNsYXZlIG9mIGFuIGFjdGl2ZQorICoJICBhZ2dyZWdhdG9yIC0gc2VuZCBMQUNQRFUgb24gdW5iaW5kIG9mIHNsYXZlIHRvIHRlbGwgcGFydG5lciB0aGlzCisgKgkgIHBvcnQgaXMgbm8gbG9uZ2VyIGFnZ3JlZ2F0YWJsZS4KKyAqCisgKiAyMDAzLzA2LzI1IC0gVHNpcHB5IE1lbmRlbHNvbiA8dHNpcHB5Lm1lbmRlbHNvbiBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBTZW5kIExBQ1BEVSBhcyBoaWdoZXN0IHByaW9yaXR5IHBhY2tldCB0byBmdXJ0aGVyIGZpeCB0aGUgYWJvdmUKKyAqCSAgcHJvYmxlbSBvbiB2ZXJ5IGhpZ2ggVHggdHJhZmZpYyBsb2FkIHdoZXJlIHBhY2tldHMgbWF5IGdldCBkcm9wcGVkCisgKgkgIGJ5IHRoZSBzbGF2ZS4KKyAqCisgKiAyMDAzLzEyLzAxIC0gU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKgktIENvZGUgY2xlYW51cCBhbmQgc3R5bGUgY2hhbmdlcworICovCisKKy8vI2RlZmluZSBCT05ESU5HX0RFQlVHIDEKKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYm9uZGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgImJvbmRpbmcuaCIKKyNpbmNsdWRlICJib25kXzNhZC5oIgorCisvLyBHZW5lcmFsIGRlZmluaXRpb25zCisjZGVmaW5lIEFEX1NIT1JUX1RJTUVPVVQgICAgICAgICAgIDEKKyNkZWZpbmUgQURfTE9OR19USU1FT1VUICAgICAgICAgICAgMAorI2RlZmluZSBBRF9TVEFOREJZICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgQURfTUFYX1RYX0lOX1NFQ09ORCAgICAgICAgMworI2RlZmluZSBBRF9DT0xMRUNUT1JfTUFYX0RFTEFZICAgICAwCisKKy8vIFRpbWVyIGRlZmluaXRpb25zKDQzLjQuNCBpbiB0aGUgODAyLjNhZCBzdGFuZGFyZCkKKyNkZWZpbmUgQURfRkFTVF9QRVJJT0RJQ19USU1FICAgICAgMQorI2RlZmluZSBBRF9TTE9XX1BFUklPRElDX1RJTUUgICAgICAzMAorI2RlZmluZSBBRF9TSE9SVF9USU1FT1VUX1RJTUUgICAgICAoMypBRF9GQVNUX1BFUklPRElDX1RJTUUpCisjZGVmaW5lIEFEX0xPTkdfVElNRU9VVF9USU1FICAgICAgICgzKkFEX1NMT1dfUEVSSU9ESUNfVElNRSkKKyNkZWZpbmUgQURfQ0hVUk5fREVURUNUSU9OX1RJTUUgICAgNjAKKyNkZWZpbmUgQURfQUdHUkVHQVRFX1dBSVRfVElNRSAgICAgMgorCisvLyBQb3J0IHN0YXRlIGRlZmluaXRpb25zKDQzLjQuMi4yIGluIHRoZSA4MDIuM2FkIHN0YW5kYXJkKQorI2RlZmluZSBBRF9TVEFURV9MQUNQX0FDVElWSVRZICAgMHgxCisjZGVmaW5lIEFEX1NUQVRFX0xBQ1BfVElNRU9VVCAgICAweDIKKyNkZWZpbmUgQURfU1RBVEVfQUdHUkVHQVRJT04gICAgIDB4NAorI2RlZmluZSBBRF9TVEFURV9TWU5DSFJPTklaQVRJT04gMHg4CisjZGVmaW5lIEFEX1NUQVRFX0NPTExFQ1RJTkcgICAgICAweDEwCisjZGVmaW5lIEFEX1NUQVRFX0RJU1RSSUJVVElORyAgICAweDIwCisjZGVmaW5lIEFEX1NUQVRFX0RFRkFVTFRFRCAgICAgICAweDQwCisjZGVmaW5lIEFEX1NUQVRFX0VYUElSRUQgICAgICAgICAweDgwCisKKy8vIFBvcnQgVmFyaWFibGVzIGRlZmluaXRpb25zIHVzZWQgYnkgdGhlIFN0YXRlIE1hY2hpbmVzKDQzLjQuNyBpbiB0aGUgODAyLjNhZCBzdGFuZGFyZCkKKyNkZWZpbmUgQURfUE9SVF9CRUdJTiAgICAgICAgICAgMHgxCisjZGVmaW5lIEFEX1BPUlRfTEFDUF9FTkFCTEVEICAgIDB4MgorI2RlZmluZSBBRF9QT1JUX0FDVE9SX0NIVVJOICAgICAweDQKKyNkZWZpbmUgQURfUE9SVF9QQVJUTkVSX0NIVVJOICAgMHg4CisjZGVmaW5lIEFEX1BPUlRfUkVBRFkgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQURfUE9SVF9SRUFEWV9OICAgICAgICAgMHgyMAorI2RlZmluZSBBRF9QT1JUX01BVENIRUQgICAgICAgICAweDQwCisjZGVmaW5lIEFEX1BPUlRfU1RBTkRCWSAgICAgICAgIDB4ODAKKyNkZWZpbmUgQURfUE9SVF9TRUxFQ1RFRCAgICAgICAgMHgxMDAKKyNkZWZpbmUgQURfUE9SVF9NT1ZFRCAgICAgICAgICAgMHgyMDAKKworLy8gUG9ydCBLZXkgZGVmaW5pdGlvbnMKKy8vIGtleSBpcyBkZXRlcm1pbmVkIGFjY29yZGluZyB0byB0aGUgbGluayBzcGVlZCwgZHVwbGV4IGFuZAorLy8gdXNlciBrZXkod2hpY2ggaXMgeWV0IG5vdCBzdXBwb3J0ZWQpCisvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQb3J0IGtleSA6ICAgfCBVc2VyIGtleSAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIFNwZWVkICAgICAgIHxEdXBsZXh8CisvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICAgICAgICAgMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiAgICAgICAgICAgICAgIDEgMAorI2RlZmluZSAgQURfRFVQTEVYX0tFWV9CSVRTICAgIDB4MQorI2RlZmluZSAgQURfU1BFRURfS0VZX0JJVFMgICAgIDB4M0UKKyNkZWZpbmUgIEFEX1VTRVJfS0VZX0JJVFMgICAgICAweEZGQzAKKworLy9kYWxsb3VuCisjZGVmaW5lICAgICBBRF9MSU5LX1NQRUVEX0JJVE1BU0tfMU1CUFMgICAgICAgMHgxCisjZGVmaW5lICAgICBBRF9MSU5LX1NQRUVEX0JJVE1BU0tfMTBNQlBTICAgICAgMHgyCisjZGVmaW5lICAgICBBRF9MSU5LX1NQRUVEX0JJVE1BU0tfMTAwTUJQUyAgICAgMHg0CisjZGVmaW5lICAgICBBRF9MSU5LX1NQRUVEX0JJVE1BU0tfMTAwME1CUFMgICAgMHg4CisvL2VuZGFsbG91bgorCisvLyBjb21wYXJlIE1BQyBhZGRyZXNzZXMKKyNkZWZpbmUgTUFDX0FERFJFU1NfQ09NUEFSRShBLCBCKSBtZW1jbXAoQSwgQiwgRVRIX0FMRU4pCisKK3N0YXRpYyBzdHJ1Y3QgbWFjX2FkZHIgbnVsbF9tYWNfYWRkciA9IHt7MCwgMCwgMCwgMCwgMCwgMH19Oworc3RhdGljIHUxNiBhZF90aWNrc19wZXJfc2VjOworc3RhdGljIGNvbnN0IGludCBhZF9kZWx0YV9pbl90aWNrcyA9IChBRF9USU1FUl9JTlRFUlZBTCAqIEhaKSAvIDEwMDA7CisKKy8vID09PT09PT09PT09PT09PT09IDNBRCBhcGkgdG8gYm9uZGluZyBhbmQga2VybmVsIGNvZGUgPT09PT09PT09PT09PT09PT09CitzdGF0aWMgdTE2IF9fZ2V0X2xpbmtfc3BlZWQoc3RydWN0IHBvcnQgKnBvcnQpOworc3RhdGljIHU4IF9fZ2V0X2R1cGxleChzdHJ1Y3QgcG9ydCAqcG9ydCk7CitzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0aWFsaXplX3BvcnRfbG9ja3Moc3RydWN0IHBvcnQgKnBvcnQpOworLy9jb252ZXJzaW9ucworc3RhdGljIHZvaWQgX19udG9oc19sYWNwZHUoc3RydWN0IGxhY3BkdSAqbGFjcGR1KTsKK3N0YXRpYyB1MTYgX19hZF90aW1lcl90b190aWNrcyh1MTYgdGltZXJfdHlwZSwgdTE2IFBhcik7CisKKworLy8gPT09PT09PT09PT09PT09PT0gYWQgY29kZSBoZWxwZXIgZnVuY3Rpb25zID09PT09PT09PT09PT09PT09PQorLy9uZWVkZWQgYnkgYWRfcnhfbWFjaGluZSguLi4pCitzdGF0aWMgdm9pZCBfX3JlY29yZF9wZHUoc3RydWN0IGxhY3BkdSAqbGFjcGR1LCBzdHJ1Y3QgcG9ydCAqcG9ydCk7CitzdGF0aWMgdm9pZCBfX3JlY29yZF9kZWZhdWx0KHN0cnVjdCBwb3J0ICpwb3J0KTsKK3N0YXRpYyB2b2lkIF9fdXBkYXRlX3NlbGVjdGVkKHN0cnVjdCBsYWNwZHUgKmxhY3BkdSwgc3RydWN0IHBvcnQgKnBvcnQpOworc3RhdGljIHZvaWQgX191cGRhdGVfZGVmYXVsdF9zZWxlY3RlZChzdHJ1Y3QgcG9ydCAqcG9ydCk7CitzdGF0aWMgdm9pZCBfX2Nob29zZV9tYXRjaGVkKHN0cnVjdCBsYWNwZHUgKmxhY3BkdSwgc3RydWN0IHBvcnQgKnBvcnQpOworc3RhdGljIHZvaWQgX191cGRhdGVfbnR0KHN0cnVjdCBsYWNwZHUgKmxhY3BkdSwgc3RydWN0IHBvcnQgKnBvcnQpOworCisvL25lZWRlZCBmb3IgYWRfbXV4X21hY2hpbmUoLi4pCitzdGF0aWMgdm9pZCBfX2F0dGFjaF9ib25kX3RvX2FnZyhzdHJ1Y3QgcG9ydCAqcG9ydCk7CitzdGF0aWMgdm9pZCBfX2RldGFjaF9ib25kX2Zyb21fYWdnKHN0cnVjdCBwb3J0ICpwb3J0KTsKK3N0YXRpYyBpbnQgX19hZ2dfcG9ydHNfYXJlX3JlYWR5KHN0cnVjdCBhZ2dyZWdhdG9yICphZ2dyZWdhdG9yKTsKK3N0YXRpYyB2b2lkIF9fc2V0X2FnZ19wb3J0c19yZWFkeShzdHJ1Y3QgYWdncmVnYXRvciAqYWdncmVnYXRvciwgaW50IHZhbCk7CisKKy8vbmVlZGVkIGZvciBhZF9hZ2dfc2VsZWN0aW9uX2xvZ2ljKC4uLikKK3N0YXRpYyB1MzIgX19nZXRfYWdnX2JhbmR3aWR0aChzdHJ1Y3QgYWdncmVnYXRvciAqYWdncmVnYXRvcik7CitzdGF0aWMgc3RydWN0IGFnZ3JlZ2F0b3IgKl9fZ2V0X2FjdGl2ZV9hZ2coc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZ3JlZ2F0b3IpOworCisKKy8vID09PT09PT09PT09PT09PT09IG1haW4gODAyLjNhZCBwcm90b2NvbCBmdW5jdGlvbnMgPT09PT09PT09PT09PT09PT09CitzdGF0aWMgaW50IGFkX2xhY3BkdV9zZW5kKHN0cnVjdCBwb3J0ICpwb3J0KTsKK3N0YXRpYyBpbnQgYWRfbWFya2VyX3NlbmQoc3RydWN0IHBvcnQgKnBvcnQsIHN0cnVjdCBtYXJrZXIgKm1hcmtlcik7CitzdGF0aWMgdm9pZCBhZF9tdXhfbWFjaGluZShzdHJ1Y3QgcG9ydCAqcG9ydCk7CitzdGF0aWMgdm9pZCBhZF9yeF9tYWNoaW5lKHN0cnVjdCBsYWNwZHUgKmxhY3BkdSwgc3RydWN0IHBvcnQgKnBvcnQpOworc3RhdGljIHZvaWQgYWRfdHhfbWFjaGluZShzdHJ1Y3QgcG9ydCAqcG9ydCk7CitzdGF0aWMgdm9pZCBhZF9wZXJpb2RpY19tYWNoaW5lKHN0cnVjdCBwb3J0ICpwb3J0KTsKK3N0YXRpYyB2b2lkIGFkX3BvcnRfc2VsZWN0aW9uX2xvZ2ljKHN0cnVjdCBwb3J0ICpwb3J0KTsKK3N0YXRpYyB2b2lkIGFkX2FnZ19zZWxlY3Rpb25fbG9naWMoc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZ3JlZ2F0b3IpOworc3RhdGljIHZvaWQgYWRfY2xlYXJfYWdnKHN0cnVjdCBhZ2dyZWdhdG9yICphZ2dyZWdhdG9yKTsKK3N0YXRpYyB2b2lkIGFkX2luaXRpYWxpemVfYWdnKHN0cnVjdCBhZ2dyZWdhdG9yICphZ2dyZWdhdG9yKTsKK3N0YXRpYyB2b2lkIGFkX2luaXRpYWxpemVfcG9ydChzdHJ1Y3QgcG9ydCAqcG9ydCwgaW50IGxhY3BfZmFzdCk7CitzdGF0aWMgdm9pZCBhZF9pbml0aWFsaXplX2xhY3BkdShzdHJ1Y3QgbGFjcGR1ICpMYWNwZHUpOworc3RhdGljIHZvaWQgYWRfZW5hYmxlX2NvbGxlY3RpbmdfZGlzdHJpYnV0aW5nKHN0cnVjdCBwb3J0ICpwb3J0KTsKK3N0YXRpYyB2b2lkIGFkX2Rpc2FibGVfY29sbGVjdGluZ19kaXN0cmlidXRpbmcoc3RydWN0IHBvcnQgKnBvcnQpOworc3RhdGljIHZvaWQgYWRfbWFya2VyX2luZm9fcmVjZWl2ZWQoc3RydWN0IG1hcmtlciAqbWFya2VyX2luZm8sIHN0cnVjdCBwb3J0ICpwb3J0KTsKK3N0YXRpYyB2b2lkIGFkX21hcmtlcl9yZXNwb25zZV9yZWNlaXZlZChzdHJ1Y3QgbWFya2VyICptYXJrZXIsIHN0cnVjdCBwb3J0ICpwb3J0KTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vID09PT09PT09PT09PT09PT09IGFwaSB0byBib25kaW5nIGFuZCBrZXJuZWwgY29kZSA9PT09PT09PT09PT09PT09PT0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIF9fZ2V0X2JvbmRfYnlfcG9ydCAtIGdldCB0aGUgcG9ydCdzIGJvbmRpbmcgc3RydWN0CisgKiBAcG9ydDogdGhlIHBvcnQgd2UncmUgbG9va2luZyBhdAorICoKKyAqIFJldHVybiBAcG9ydCdzIGJvbmRpbmcgc3RydWN0LCBvciAlTlVMTCBpZiBpdCBjYW4ndCBiZSBmb3VuZC4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYm9uZGluZyAqX19nZXRfYm9uZF9ieV9wb3J0KHN0cnVjdCBwb3J0ICpwb3J0KQoreworCWlmIChwb3J0LT5zbGF2ZSA9PSBOVUxMKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBib25kX2dldF9ib25kX2J5X3NsYXZlKHBvcnQtPnNsYXZlKTsKK30KKworLyoqCisgKiBfX2dldF9maXJzdF9wb3J0IC0gZ2V0IHRoZSBmaXJzdCBwb3J0IGluIHRoZSBib25kCisgKiBAYm9uZDogdGhlIGJvbmQgd2UncmUgbG9va2luZyBhdAorICoKKyAqIFJldHVybiB0aGUgcG9ydCBvZiB0aGUgZmlyc3Qgc2xhdmUgaW4gQGJvbmQsIG9yICVOVUxMIGlmIGl0IGNhbid0IGJlIGZvdW5kLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwb3J0ICpfX2dldF9maXJzdF9wb3J0KHN0cnVjdCBib25kaW5nICpib25kKQoreworCWlmIChib25kLT5zbGF2ZV9jbnQgPT0gMCkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gJihTTEFWRV9BRF9JTkZPKGJvbmQtPmZpcnN0X3NsYXZlKS5wb3J0KTsKK30KKworLyoqCisgKiBfX2dldF9uZXh0X3BvcnQgLSBnZXQgdGhlIG5leHQgcG9ydCBpbiB0aGUgYm9uZAorICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKiBSZXR1cm4gdGhlIHBvcnQgb2YgdGhlIHNsYXZlIHRoYXQgaXMgbmV4dCBpbiBsaW5lIG9mIEBwb3J0J3Mgc2xhdmUgaW4gdGhlCisgKiBib25kLCBvciAlTlVMTCBpZiBpdCBjYW4ndCBiZSBmb3VuZC4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcG9ydCAqX19nZXRfbmV4dF9wb3J0KHN0cnVjdCBwb3J0ICpwb3J0KQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gX19nZXRfYm9uZF9ieV9wb3J0KHBvcnQpOworCXN0cnVjdCBzbGF2ZSAqc2xhdmUgPSBwb3J0LT5zbGF2ZTsKKworCS8vIElmIHRoZXJlJ3Mgbm8gYm9uZCBmb3IgdGhpcyBwb3J0LCBvciB0aGlzIGlzIHRoZSBsYXN0IHNsYXZlCisJaWYgKChib25kID09IE5VTEwpIHx8IChzbGF2ZS0+bmV4dCA9PSBib25kLT5maXJzdF9zbGF2ZSkpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuICYoU0xBVkVfQURfSU5GTyhzbGF2ZS0+bmV4dCkucG9ydCk7Cit9CisKKy8qKgorICogX19nZXRfZmlyc3RfYWdnIC0gZ2V0IHRoZSBmaXJzdCBhZ2dyZWdhdG9yIGluIHRoZSBib25kCisgKiBAYm9uZDogdGhlIGJvbmQgd2UncmUgbG9va2luZyBhdAorICoKKyAqIFJldHVybiB0aGUgYWdncmVnYXRvciBvZiB0aGUgZmlyc3Qgc2xhdmUgaW4gQGJvbmQsIG9yICVOVUxMIGlmIGl0IGNhbid0IGJlCisgKiBmb3VuZC4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYWdncmVnYXRvciAqX19nZXRfZmlyc3RfYWdnKHN0cnVjdCBwb3J0ICpwb3J0KQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gX19nZXRfYm9uZF9ieV9wb3J0KHBvcnQpOworCisJLy8gSWYgdGhlcmUncyBubyBib25kIGZvciB0aGlzIHBvcnQsIG9yIGJvbmQgaGFzIG5vIHNsYXZlcworCWlmICgoYm9uZCA9PSBOVUxMKSB8fCAoYm9uZC0+c2xhdmVfY250ID09IDApKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiAmKFNMQVZFX0FEX0lORk8oYm9uZC0+Zmlyc3Rfc2xhdmUpLmFnZ3JlZ2F0b3IpOworfQorCisvKioKKyAqIF9fZ2V0X25leHRfYWdnIC0gZ2V0IHRoZSBuZXh0IGFnZ3JlZ2F0b3IgaW4gdGhlIGJvbmQKKyAqIEBhZ2dyZWdhdG9yOiB0aGUgYWdncmVnYXRvciB3ZSdyZSBsb29raW5nIGF0CisgKgorICogUmV0dXJuIHRoZSBhZ2dyZWdhdG9yIG9mIHRoZSBzbGF2ZSB0aGF0IGlzIG5leHQgaW4gbGluZSBvZiBAYWdncmVnYXRvcidzCisgKiBzbGF2ZSBpbiB0aGUgYm9uZCwgb3IgJU5VTEwgaWYgaXQgY2FuJ3QgYmUgZm91bmQuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGFnZ3JlZ2F0b3IgKl9fZ2V0X25leHRfYWdnKHN0cnVjdCBhZ2dyZWdhdG9yICphZ2dyZWdhdG9yKQoreworCXN0cnVjdCBzbGF2ZSAqc2xhdmUgPSBhZ2dyZWdhdG9yLT5zbGF2ZTsKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZ2V0X2JvbmRfYnlfc2xhdmUoc2xhdmUpOworCisJLy8gSWYgdGhlcmUncyBubyBib25kIGZvciB0aGlzIGFnZ3JlZ2F0b3IsIG9yIHRoaXMgaXMgdGhlIGxhc3Qgc2xhdmUKKwlpZiAoKGJvbmQgPT0gTlVMTCkgfHwgKHNsYXZlLT5uZXh0ID09IGJvbmQtPmZpcnN0X3NsYXZlKSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gJihTTEFWRV9BRF9JTkZPKHNsYXZlLT5uZXh0KS5hZ2dyZWdhdG9yKTsKK30KKworLyoqCisgKiBfX2Rpc2FibGVfcG9ydCAtIGRpc2FibGUgdGhlIHBvcnQncyBzbGF2ZQorICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2Rpc2FibGVfcG9ydChzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwlib25kX3NldF9zbGF2ZV9pbmFjdGl2ZV9mbGFncyhwb3J0LT5zbGF2ZSk7Cit9CisKKy8qKgorICogX19lbmFibGVfcG9ydCAtIGVuYWJsZSB0aGUgcG9ydCdzIHNsYXZlLCBpZiBpdCdzIHVwCisgKiBAcG9ydDogdGhlIHBvcnQgd2UncmUgbG9va2luZyBhdAorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fZW5hYmxlX3BvcnQoc3RydWN0IHBvcnQgKnBvcnQpCit7CisJc3RydWN0IHNsYXZlICpzbGF2ZSA9IHBvcnQtPnNsYXZlOworCisJaWYgKChzbGF2ZS0+bGluayA9PSBCT05EX0xJTktfVVApICYmIElTX1VQKHNsYXZlLT5kZXYpKSB7CisJCWJvbmRfc2V0X3NsYXZlX2FjdGl2ZV9mbGFncyhzbGF2ZSk7CisJfQorfQorCisvKioKKyAqIF9fcG9ydF9pc19lbmFibGVkIC0gY2hlY2sgaWYgdGhlIHBvcnQncyBzbGF2ZSBpcyBpbiBhY3RpdmUgc3RhdGUKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICovCitzdGF0aWMgaW5saW5lIGludCBfX3BvcnRfaXNfZW5hYmxlZChzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4ocG9ydC0+c2xhdmUtPnN0YXRlID09IEJPTkRfU1RBVEVfQUNUSVZFKTsKK30KKworLyoqCisgKiBfX2dldF9hZ2dfc2VsZWN0aW9uX21vZGUgLSBnZXQgdGhlIGFnZ3JlZ2F0b3Igc2VsZWN0aW9uIG1vZGUKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICogR2V0IHRoZSBhZ2dyZWdhdG9yIHNlbGVjdGlvbiBtb2RlLiBDYW4gYmUgJUJBTkRXSURUSCBvciAlQ09VTlQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIF9fZ2V0X2FnZ19zZWxlY3Rpb25fbW9kZShzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IF9fZ2V0X2JvbmRfYnlfcG9ydChwb3J0KTsKKworCWlmIChib25kID09IE5VTEwpIHsKKwkJcmV0dXJuIEFEX0JBTkRXSURUSDsKKwl9CisKKwlyZXR1cm4gQk9ORF9BRF9JTkZPKGJvbmQpLmFnZ19zZWxlY3RfbW9kZTsKK30KKworLyoqCisgKiBfX2NoZWNrX2FnZ19zZWxlY3Rpb25fdGltZXIgLSBjaGVjayBpZiB0aGUgc2VsZWN0aW9uIHRpbWVyIGhhcyBleHBpcmVkCisgKiBAcG9ydDogdGhlIHBvcnQgd2UncmUgbG9va2luZyBhdAorICoKKyAqLworc3RhdGljIGlubGluZSBpbnQgX19jaGVja19hZ2dfc2VsZWN0aW9uX3RpbWVyKHN0cnVjdCBwb3J0ICpwb3J0KQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gX19nZXRfYm9uZF9ieV9wb3J0KHBvcnQpOworCisJaWYgKGJvbmQgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gQk9ORF9BRF9JTkZPKGJvbmQpLmFnZ19zZWxlY3RfdGltZXIgPyAxIDogMDsKK30KKworLyoqCisgKiBfX2dldF9yeF9tYWNoaW5lX2xvY2sgLSBsb2NrIHRoZSBwb3J0J3MgUlggbWFjaGluZQorICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2dldF9yeF9tYWNoaW5lX2xvY2soc3RydWN0IHBvcnQgKnBvcnQpCit7CisJc3Bpbl9sb2NrKCYoU0xBVkVfQURfSU5GTyhwb3J0LT5zbGF2ZSkucnhfbWFjaGluZV9sb2NrKSk7Cit9CisKKy8qKgorICogX19yZWxlYXNlX3J4X21hY2hpbmVfbG9jayAtIHVubG9jayB0aGUgcG9ydCdzIFJYIG1hY2hpbmUKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19yZWxlYXNlX3J4X21hY2hpbmVfbG9jayhzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwlzcGluX3VubG9jaygmKFNMQVZFX0FEX0lORk8ocG9ydC0+c2xhdmUpLnJ4X21hY2hpbmVfbG9jaykpOworfQorCisvKioKKyAqIF9fZ2V0X2xpbmtfc3BlZWQgLSBnZXQgYSBwb3J0J3Mgc3BlZWQKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICogUmV0dXJuIEBwb3J0J3Mgc3BlZWQgaW4gODAyLjNhZCBiaXRtYXNrIGZvcm1hdC4gaS5lLiBvbmUgb2Y6CisgKiAgICAgMCwKKyAqICAgICAlQURfTElOS19TUEVFRF9CSVRNQVNLXzEwTUJQUywKKyAqICAgICAlQURfTElOS19TUEVFRF9CSVRNQVNLXzEwME1CUFMsCisgKiAgICAgJUFEX0xJTktfU1BFRURfQklUTUFTS18xMDAwTUJQUworICovCitzdGF0aWMgdTE2IF9fZ2V0X2xpbmtfc3BlZWQoc3RydWN0IHBvcnQgKnBvcnQpCit7CisJc3RydWN0IHNsYXZlICpzbGF2ZSA9IHBvcnQtPnNsYXZlOworCXUxNiBzcGVlZDsKKworCS8qIHRoaXMgaWYgY292ZXJzIG9ubHkgYSBzcGVjaWFsIGNhc2U6IHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gc3RhcnRzIHdpdGgKKwkgKiBsaW5rIGRvd24sIGl0IHNldHMgdGhlIHNwZWVkIHRvIDAuCisJICogVGhpcyBpcyBkb25lIGluIHNwaXRlIG9mIHRoZSBmYWN0IHRoYXQgdGhlIGUxMDAgZHJpdmVyIHJlcG9ydHMgMCB0byBiZQorCSAqIGNvbXBhdGlibGUgd2l0aCBNVlQgaW4gdGhlIGZ1dHVyZS4qLworCWlmIChzbGF2ZS0+bGluayAhPSBCT05EX0xJTktfVVApIHsKKwkJc3BlZWQ9MDsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKHNsYXZlLT5zcGVlZCkgeworCQljYXNlIFNQRUVEXzEwOgorCQkJc3BlZWQgPSBBRF9MSU5LX1NQRUVEX0JJVE1BU0tfMTBNQlBTOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVFRF8xMDA6CisJCQlzcGVlZCA9IEFEX0xJTktfU1BFRURfQklUTUFTS18xMDBNQlBTOworCQkJYnJlYWs7CisKKwkJY2FzZSBTUEVFRF8xMDAwOgorCQkJc3BlZWQgPSBBRF9MSU5LX1NQRUVEX0JJVE1BU0tfMTAwME1CUFM7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJc3BlZWQgPSAwOyAvLyB1bmtub3duIHNwZWVkIHZhbHVlIGZyb20gZXRodG9vbC4gc2hvdWxkbid0IGhhcHBlbgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlkcHJpbnRrKCJQb3J0ICVkIFJlY2VpdmVkIGxpbmsgc3BlZWQgJWQgdXBkYXRlIGZyb20gYWRhcHRlclxuIiwgcG9ydC0+YWN0b3JfcG9ydF9udW1iZXIsIHNwZWVkKTsKKwlyZXR1cm4gc3BlZWQ7Cit9CisKKy8qKgorICogX19nZXRfZHVwbGV4IC0gZ2V0IGEgcG9ydCdzIGR1cGxleAorICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKiBSZXR1cm4gQHBvcnQncyBkdXBsZXggaW4gODAyLjNhZCBiaXRtYXNrIGZvcm1hdC4gaS5lLjoKKyAqICAgICAweDAxIGlmIGluIGZ1bGwgZHVwbGV4CisgKiAgICAgMHgwMCBvdGhlcndpc2UKKyAqLworc3RhdGljIHU4IF9fZ2V0X2R1cGxleChzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlID0gcG9ydC0+c2xhdmU7CisKKwl1OCByZXR2YWw7CisKKwkvLyAgaGFuZGxpbmcgYSBzcGVjaWFsIGNhc2U6IHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gc3RhcnRzIHdpdGgKKwkvLyBsaW5rIGRvd24sIGl0IHNldHMgdGhlIGR1cGxleCB0byAwLgorCWlmIChzbGF2ZS0+bGluayAhPSBCT05EX0xJTktfVVApIHsKKwkJcmV0dmFsPTB4MDsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKHNsYXZlLT5kdXBsZXgpIHsKKwkJY2FzZSBEVVBMRVhfRlVMTDoKKwkJCXJldHZhbD0weDE7CisJCQlkcHJpbnRrKCJQb3J0ICVkIFJlY2VpdmVkIHN0YXR1cyBmdWxsIGR1cGxleCB1cGRhdGUgZnJvbSBhZGFwdGVyXG4iLCBwb3J0LT5hY3Rvcl9wb3J0X251bWJlcik7CisJCQlicmVhazsKKwkJY2FzZSBEVVBMRVhfSEFMRjoKKwkJZGVmYXVsdDoKKwkJCXJldHZhbD0weDA7CisJCQlkcHJpbnRrKCJQb3J0ICVkIFJlY2VpdmVkIHN0YXR1cyBOT1QgZnVsbCBkdXBsZXggdXBkYXRlIGZyb20gYWRhcHRlclxuIiwgcG9ydC0+YWN0b3JfcG9ydF9udW1iZXIpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBfX2luaXRpYWxpemVfcG9ydF9sb2NrcyAtIGluaXRpYWxpemUgYSBwb3J0J3MgUlggbWFjaGluZSBzcGlubG9jaworICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXRpYWxpemVfcG9ydF9sb2NrcyhzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwkvLyBtYWtlIHN1cmUgaXQgaXNuJ3QgY2FsbGVkIHR3aWNlCisJc3Bpbl9sb2NrX2luaXQoJihTTEFWRV9BRF9JTkZPKHBvcnQtPnNsYXZlKS5yeF9tYWNoaW5lX2xvY2spKTsKK30KKworLy9jb252ZXJzaW9ucworLyoqCisgKiBfX250b2hzX2xhY3BkdSAtIGNvbnZlcnQgdGhlIGNvbnRlbnRzIG9mIGEgTEFDUERVIHRvIGhvc3QgYnl0ZSBvcmRlcgorICogQGxhY3BkdTogdGhlIHNwZWljaWZlZCBsYWNwZHUKKyAqCisgKiBGb3IgZWFjaCBtdWx0aS1ieXRlIGZpZWxkIGluIHRoZSBsYWNwZHUsIGNvbnZlcnQgaXRzIGNvbnRlbnQKKyAqLworc3RhdGljIHZvaWQgX19udG9oc19sYWNwZHUoc3RydWN0IGxhY3BkdSAqbGFjcGR1KQoreworCWlmIChsYWNwZHUpIHsKKwkJbGFjcGR1LT5hY3Rvcl9zeXN0ZW1fcHJpb3JpdHkgPSAgIG50b2hzKGxhY3BkdS0+YWN0b3Jfc3lzdGVtX3ByaW9yaXR5KTsKKwkJbGFjcGR1LT5hY3Rvcl9rZXkgPSAgICAgICAgICAgICAgIG50b2hzKGxhY3BkdS0+YWN0b3Jfa2V5KTsKKwkJbGFjcGR1LT5hY3Rvcl9wb3J0X3ByaW9yaXR5ID0gICAgIG50b2hzKGxhY3BkdS0+YWN0b3JfcG9ydF9wcmlvcml0eSk7CisJCWxhY3BkdS0+YWN0b3JfcG9ydCA9ICAgICAgICAgICAgICBudG9ocyhsYWNwZHUtPmFjdG9yX3BvcnQpOworCQlsYWNwZHUtPnBhcnRuZXJfc3lzdGVtX3ByaW9yaXR5ID0gbnRvaHMobGFjcGR1LT5wYXJ0bmVyX3N5c3RlbV9wcmlvcml0eSk7CisJCWxhY3BkdS0+cGFydG5lcl9rZXkgPSAgICAgICAgICAgICBudG9ocyhsYWNwZHUtPnBhcnRuZXJfa2V5KTsKKwkJbGFjcGR1LT5wYXJ0bmVyX3BvcnRfcHJpb3JpdHkgPSAgIG50b2hzKGxhY3BkdS0+cGFydG5lcl9wb3J0X3ByaW9yaXR5KTsKKwkJbGFjcGR1LT5wYXJ0bmVyX3BvcnQgPSAgICAgICAgICAgIG50b2hzKGxhY3BkdS0+cGFydG5lcl9wb3J0KTsKKwkJbGFjcGR1LT5jb2xsZWN0b3JfbWF4X2RlbGF5ID0gICAgIG50b2hzKGxhY3BkdS0+Y29sbGVjdG9yX21heF9kZWxheSk7CisJfQorfQorCisvKioKKyAqIF9fYWRfdGltZXJfdG9fdGlja3MgLSBjb252ZXJ0IGEgZ2l2ZW4gdGltZXIgdHlwZSB0byBBRCBtb2R1bGUgdGlja3MKKyAqIEB0aW1lcl90eXBlOgl3aGljaCB0aW1lciB0byBvcGVyYXRlCisgKiBAcGFyOiB0aW1lciBwYXJhbWV0ZXIuIHNlZSBiZWxvdworICoKKyAqIElmIEB0aW1lcl90eXBlIGlzICVjdXJyZW50X3doaWxlX3RpbWVyLCBAcGFyIGluZGljYXRlcyBsb25nL3Nob3J0IHRpbWVyLgorICogSWYgQHRpbWVyX3R5cGUgaXMgJXBlcmlvZGljX3RpbWVyLCBAcGFyIGlzIG9uZSBvZiAlRkFTVF9QRVJJT0RJQ19USU1FLAorICoJCQkJCQkgICAgJVNMT1dfUEVSSU9ESUNfVElNRS4KKyAqLworc3RhdGljIHUxNiBfX2FkX3RpbWVyX3RvX3RpY2tzKHUxNiB0aW1lcl90eXBlLCB1MTYgcGFyKQoreworCXUxNiByZXR2YWw9MDsJIC8vdG8gc2lsZW5jZSB0aGUgY29tcGlsZXIKKworCXN3aXRjaCAodGltZXJfdHlwZSkgeworCWNhc2UgQURfQ1VSUkVOVF9XSElMRV9USU1FUjogICAvLyBmb3IgcnggbWFjaGluZSB1c2FnZQorCQlpZiAocGFyKSB7CSAgICAgIC8vIGZvciBzaG9ydCBvciBsb25nIHRpbWVvdXQKKwkJCXJldHZhbCA9IChBRF9TSE9SVF9USU1FT1VUX1RJTUUqYWRfdGlja3NfcGVyX3NlYyk7IC8vIHNob3J0IHRpbWVvdXQKKwkJfSBlbHNlIHsKKwkJCXJldHZhbCA9IChBRF9MT05HX1RJTUVPVVRfVElNRSphZF90aWNrc19wZXJfc2VjKTsgLy8gbG9uZyB0aW1lb3V0CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBRF9BQ1RPUl9DSFVSTl9USU1FUjoJICAgIC8vIGZvciBsb2NhbCBjaHVybiBtYWNoaW5lCisJCXJldHZhbCA9IChBRF9DSFVSTl9ERVRFQ1RJT05fVElNRSphZF90aWNrc19wZXJfc2VjKTsKKwkJYnJlYWs7CisJY2FzZSBBRF9QRVJJT0RJQ19USU1FUjoJICAgIC8vIGZvciBwZXJpb2RpYyBtYWNoaW5lCisJCXJldHZhbCA9IChwYXIqYWRfdGlja3NfcGVyX3NlYyk7IC8vIGxvbmcgdGltZW91dAorCQlicmVhazsKKwljYXNlIEFEX1BBUlRORVJfQ0hVUk5fVElNRVI6ICAgLy8gZm9yIHJlbW90ZSBjaHVybiBtYWNoaW5lCisJCXJldHZhbCA9IChBRF9DSFVSTl9ERVRFQ1RJT05fVElNRSphZF90aWNrc19wZXJfc2VjKTsKKwkJYnJlYWs7CisJY2FzZSBBRF9XQUlUX1dISUxFX1RJTUVSOgkgICAgLy8gZm9yIHNlbGVjdGlvbiBtYWNoaW5lCisJCXJldHZhbCA9IChBRF9BR0dSRUdBVEVfV0FJVF9USU1FKmFkX3RpY2tzX3Blcl9zZWMpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vID09PT09PT09PT09PT09PT09IGFkX3J4X21hY2hpbmUgaGVscGVyIGZ1bmN0aW9ucyA9PT09PT09PT09PT09PT09PT0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKioKKyAqIF9fcmVjb3JkX3BkdSAtIHJlY29yZCBwYXJhbWV0ZXJzIGZyb20gYSByZWNlaXZlZCBsYWNwZHUKKyAqIEBsYWNwZHU6IHRoZSBsYWNwZHUgd2UndmUgcmVjZWl2ZWQKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICogUmVjb3JkIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGZvciB0aGUgQWN0b3IgY2FycmllZCBpbiBhIHJlY2VpdmVkIGxhY3BkdSBhcworICogdGhlIGN1cnJlbnQgcGFydG5lciBvcGVyYXRpb25hbCBwYXJhbWV0ZXIgdmFsdWVzIGFuZCBzZXRzCisgKiBhY3Rvcl9vcGVyX3BvcnRfc3RhdGUuZGVmYXVsdGVkIHRvIEZBTFNFLgorICovCitzdGF0aWMgdm9pZCBfX3JlY29yZF9wZHUoc3RydWN0IGxhY3BkdSAqbGFjcGR1LCBzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwkvLyB2YWxpZGF0ZSBsYWNwZHUgYW5kIHBvcnQKKwlpZiAobGFjcGR1ICYmIHBvcnQpIHsKKwkJLy8gcmVjb3JkIHRoZSBuZXcgcGFyYW1ldGVyIHZhbHVlcyBmb3IgdGhlIHBhcnRuZXIgb3BlcmF0aW9uYWwKKwkJcG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfbnVtYmVyID0gbGFjcGR1LT5hY3Rvcl9wb3J0OworCQlwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9wcmlvcml0eSA9IGxhY3BkdS0+YWN0b3JfcG9ydF9wcmlvcml0eTsKKwkJcG9ydC0+cGFydG5lcl9vcGVyX3N5c3RlbSA9IGxhY3BkdS0+YWN0b3Jfc3lzdGVtOworCQlwb3J0LT5wYXJ0bmVyX29wZXJfc3lzdGVtX3ByaW9yaXR5ID0gbGFjcGR1LT5hY3Rvcl9zeXN0ZW1fcHJpb3JpdHk7CisJCXBvcnQtPnBhcnRuZXJfb3Blcl9rZXkgPSBsYWNwZHUtPmFjdG9yX2tleTsKKwkJLy8gemVybyBwYXJ0ZW5lcidzIGxhc2Ugc3RhdGVzCisJCXBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X3N0YXRlID0gMDsKKwkJcG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfc3RhdGUgfD0gKGxhY3BkdS0+YWN0b3Jfc3RhdGUgJiBBRF9TVEFURV9MQUNQX0FDVElWSVRZKTsKKwkJcG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfc3RhdGUgfD0gKGxhY3BkdS0+YWN0b3Jfc3RhdGUgJiBBRF9TVEFURV9MQUNQX1RJTUVPVVQpOworCQlwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9zdGF0ZSB8PSAobGFjcGR1LT5hY3Rvcl9zdGF0ZSAmIEFEX1NUQVRFX0FHR1JFR0FUSU9OKTsKKwkJcG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfc3RhdGUgfD0gKGxhY3BkdS0+YWN0b3Jfc3RhdGUgJiBBRF9TVEFURV9TWU5DSFJPTklaQVRJT04pOworCQlwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9zdGF0ZSB8PSAobGFjcGR1LT5hY3Rvcl9zdGF0ZSAmIEFEX1NUQVRFX0NPTExFQ1RJTkcpOworCQlwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9zdGF0ZSB8PSAobGFjcGR1LT5hY3Rvcl9zdGF0ZSAmIEFEX1NUQVRFX0RJU1RSSUJVVElORyk7CisJCXBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X3N0YXRlIHw9IChsYWNwZHUtPmFjdG9yX3N0YXRlICYgQURfU1RBVEVfREVGQVVMVEVEKTsKKwkJcG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfc3RhdGUgfD0gKGxhY3BkdS0+YWN0b3Jfc3RhdGUgJiBBRF9TVEFURV9FWFBJUkVEKTsKKworCQkvLyBzZXQgYWN0b3Jfb3Blcl9wb3J0X3N0YXRlLmRlZmF1bHRlZCB0byBGQUxTRQorCQlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgJj0gfkFEX1NUQVRFX0RFRkFVTFRFRDsKKworCQkvLyBzZXQgdGhlIHBhcnRuZXIgc3luYy4gdG8gb24gaWYgdGhlIHBhcnRuZXIgaXMgc3luYy4gYW5kIHRoZSBwb3J0IGlzIG1hdGNoZWQKKwkJaWYgKChwb3J0LT5zbV92YXJzICYgQURfUE9SVF9NQVRDSEVEKSAmJiAobGFjcGR1LT5hY3Rvcl9zdGF0ZSAmIEFEX1NUQVRFX1NZTkNIUk9OSVpBVElPTikpIHsKKwkJCXBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X3N0YXRlIHw9IEFEX1NUQVRFX1NZTkNIUk9OSVpBVElPTjsKKwkJfSBlbHNlIHsKKwkJCXBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X3N0YXRlICY9IH5BRF9TVEFURV9TWU5DSFJPTklaQVRJT047CisJCX0KKwl9Cit9CisKKy8qKgorICogX19yZWNvcmRfZGVmYXVsdCAtIHJlY29yZCBkZWZhdWx0IHBhcmFtZXRlcnMKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICogVGhpcyBmdW5jdGlvbiByZWNvcmRzIHRoZSBkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMgZm9yIHRoZSBwYXJ0bmVyIGNhcnJpZWQKKyAqIGluIHRoZSBQYXJ0bmVyIEFkbWluIHBhcmFtZXRlcnMgYXMgdGhlIGN1cnJlbnQgcGFydG5lciBvcGVyYXRpb25hbCBwYXJhbWV0ZXIKKyAqIHZhbHVlcyBhbmQgc2V0cyBhY3Rvcl9vcGVyX3BvcnRfc3RhdGUuZGVmYXVsdGVkIHRvIFRSVUUuCisgKi8KK3N0YXRpYyB2b2lkIF9fcmVjb3JkX2RlZmF1bHQoc3RydWN0IHBvcnQgKnBvcnQpCit7CisJLy8gdmFsaWRhdGUgdGhlIHBvcnQKKwlpZiAocG9ydCkgeworCQkvLyByZWNvcmQgdGhlIHBhcnRuZXIgYWRtaW4gcGFyYW1ldGVycworCQlwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9udW1iZXIgPSBwb3J0LT5wYXJ0bmVyX2FkbWluX3BvcnRfbnVtYmVyOworCQlwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9wcmlvcml0eSA9IHBvcnQtPnBhcnRuZXJfYWRtaW5fcG9ydF9wcmlvcml0eTsKKwkJcG9ydC0+cGFydG5lcl9vcGVyX3N5c3RlbSA9IHBvcnQtPnBhcnRuZXJfYWRtaW5fc3lzdGVtOworCQlwb3J0LT5wYXJ0bmVyX29wZXJfc3lzdGVtX3ByaW9yaXR5ID0gcG9ydC0+cGFydG5lcl9hZG1pbl9zeXN0ZW1fcHJpb3JpdHk7CisJCXBvcnQtPnBhcnRuZXJfb3Blcl9rZXkgPSBwb3J0LT5wYXJ0bmVyX2FkbWluX2tleTsKKwkJcG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfc3RhdGUgPSBwb3J0LT5wYXJ0bmVyX2FkbWluX3BvcnRfc3RhdGU7CisKKwkJLy8gc2V0IGFjdG9yX29wZXJfcG9ydF9zdGF0ZS5kZWZhdWx0ZWQgdG8gdHJ1ZQorCQlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgfD0gQURfU1RBVEVfREVGQVVMVEVEOworCX0KK30KKworLyoqCisgKiBfX3VwZGF0ZV9zZWxlY3RlZCAtIHVwZGF0ZSBhIHBvcnQncyBTZWxlY3RlZCB2YXJpYWJsZSBmcm9tIGEgcmVjZWl2ZWQgbGFjcGR1CisgKiBAbGFjcGR1OiB0aGUgbGFjcGR1IHdlJ3ZlIHJlY2VpdmVkCisgKiBAcG9ydDogdGhlIHBvcnQgd2UncmUgbG9va2luZyBhdAorICoKKyAqIFVwZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIHNlbGVjdGVkIHZhcmlhYmxlLCB1c2luZyBwYXJhbWV0ZXIgdmFsdWVzIGZyb20gYQorICogbmV3bHkgcmVjZWl2ZWQgbGFjcGR1LiBUaGUgcGFyYW1ldGVyIHZhbHVlcyBmb3IgdGhlIEFjdG9yIGNhcnJpZWQgaW4gdGhlCisgKiByZWNlaXZlZCBQRFUgYXJlIGNvbXBhcmVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uYWwgcGFyYW1ldGVyCisgKiB2YWx1ZXMgZm9yIHRoZSBwb3J0cyBwYXJ0bmVyLiBJZiBvbmUgb3IgbW9yZSBvZiB0aGUgY29tcGFyaXNvbnMgc2hvd3MgdGhhdAorICogdGhlIHZhbHVlKHMpIHJlY2VpdmVkIGluIHRoZSBQRFUgZGlmZmVyIGZyb20gdGhlIGN1cnJlbnQgb3BlcmF0aW9uYWwgdmFsdWVzLAorICogdGhlbiBzZWxlY3RlZCBpcyBzZXQgdG8gRkFMU0UgYW5kIGFjdG9yX29wZXJfcG9ydF9zdGF0ZS5zeW5jaHJvbml6YXRpb24gaXMKKyAqIHNldCB0byBvdXRfb2Zfc3luYy4gT3RoZXJ3aXNlLCBzZWxlY3RlZCByZW1haW5zIHVuY2hhbmdlZC4KKyAqLworc3RhdGljIHZvaWQgX191cGRhdGVfc2VsZWN0ZWQoc3RydWN0IGxhY3BkdSAqbGFjcGR1LCBzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwkvLyB2YWxpZGF0ZSBsYWNwZHUgYW5kIHBvcnQKKwlpZiAobGFjcGR1ICYmIHBvcnQpIHsKKwkJLy8gY2hlY2sgaWYgYW55IHBhcmFtZXRlciBpcyBkaWZmZXJlbnQKKwkJaWYgKChsYWNwZHUtPmFjdG9yX3BvcnQgIT0gcG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfbnVtYmVyKSB8fAorCQkgICAgKGxhY3BkdS0+YWN0b3JfcG9ydF9wcmlvcml0eSAhPSBwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9wcmlvcml0eSkgfHwKKwkJICAgIE1BQ19BRERSRVNTX0NPTVBBUkUoJihsYWNwZHUtPmFjdG9yX3N5c3RlbSksICYocG9ydC0+cGFydG5lcl9vcGVyX3N5c3RlbSkpIHx8CisJCSAgICAobGFjcGR1LT5hY3Rvcl9zeXN0ZW1fcHJpb3JpdHkgIT0gcG9ydC0+cGFydG5lcl9vcGVyX3N5c3RlbV9wcmlvcml0eSkgfHwKKwkJICAgIChsYWNwZHUtPmFjdG9yX2tleSAhPSBwb3J0LT5wYXJ0bmVyX29wZXJfa2V5KSB8fAorCQkgICAgKChsYWNwZHUtPmFjdG9yX3N0YXRlICYgQURfU1RBVEVfQUdHUkVHQVRJT04pICE9IChwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9zdGF0ZSAmIEFEX1NUQVRFX0FHR1JFR0FUSU9OKSkKKwkJICAgKSB7CisJCQkvLyB1cGRhdGUgdGhlIHN0YXRlIG1hY2hpbmUgU2VsZWN0ZWQgdmFyaWFibGUKKwkJCXBvcnQtPnNtX3ZhcnMgJj0gfkFEX1BPUlRfU0VMRUNURUQ7CisJCX0KKwl9Cit9CisKKy8qKgorICogX191cGRhdGVfZGVmYXVsdF9zZWxlY3RlZCAtIHVwZGF0ZSBhIHBvcnQncyBTZWxlY3RlZCB2YXJpYWJsZSBmcm9tIFBhcnRuZXIKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICogVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgdmFyaWFibGUsIHVzaW5nIHRoZSBwYXJ0bmVyCisgKiBhZG1pbmlzdHJhdGl2ZSBwYXJhbWV0ZXIgdmFsdWVzLiBUaGUgYWRtaW5pc3RyYXRpdmUgdmFsdWVzIGFyZSBjb21wYXJlZCB3aXRoCisgKiB0aGUgY29ycmVzcG9uZGluZyBvcGVyYXRpb25hbCBwYXJhbWV0ZXIgdmFsdWVzIGZvciB0aGUgcGFydG5lci4gSWYgb25lIG9yCisgKiBtb3JlIG9mIHRoZSBjb21wYXJpc29ucyBzaG93cyB0aGF0IHRoZSBhZG1pbmlzdHJhdGl2ZSB2YWx1ZShzKSBkaWZmZXIgZnJvbQorICogdGhlIGN1cnJlbnQgb3BlcmF0aW9uYWwgdmFsdWVzLCB0aGVuIFNlbGVjdGVkIGlzIHNldCB0byBGQUxTRSBhbmQKKyAqIGFjdG9yX29wZXJfcG9ydF9zdGF0ZS5zeW5jaHJvbml6YXRpb24gaXMgc2V0IHRvIE9VVF9PRl9TWU5DLiBPdGhlcndpc2UsCisgKiBTZWxlY3RlZCByZW1haW5zIHVuY2hhbmdlZC4KKyAqLworc3RhdGljIHZvaWQgX191cGRhdGVfZGVmYXVsdF9zZWxlY3RlZChzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwkvLyB2YWxpZGF0ZSB0aGUgcG9ydAorCWlmIChwb3J0KSB7CisJCS8vIGNoZWNrIGlmIGFueSBwYXJhbWV0ZXIgaXMgZGlmZmVyZW50CisJCWlmICgocG9ydC0+cGFydG5lcl9hZG1pbl9wb3J0X251bWJlciAhPSBwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9udW1iZXIpIHx8CisJCSAgICAocG9ydC0+cGFydG5lcl9hZG1pbl9wb3J0X3ByaW9yaXR5ICE9IHBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X3ByaW9yaXR5KSB8fAorCQkgICAgTUFDX0FERFJFU1NfQ09NUEFSRSgmKHBvcnQtPnBhcnRuZXJfYWRtaW5fc3lzdGVtKSwgJihwb3J0LT5wYXJ0bmVyX29wZXJfc3lzdGVtKSkgfHwKKwkJICAgIChwb3J0LT5wYXJ0bmVyX2FkbWluX3N5c3RlbV9wcmlvcml0eSAhPSBwb3J0LT5wYXJ0bmVyX29wZXJfc3lzdGVtX3ByaW9yaXR5KSB8fAorCQkgICAgKHBvcnQtPnBhcnRuZXJfYWRtaW5fa2V5ICE9IHBvcnQtPnBhcnRuZXJfb3Blcl9rZXkpIHx8CisJCSAgICAoKHBvcnQtPnBhcnRuZXJfYWRtaW5fcG9ydF9zdGF0ZSAmIEFEX1NUQVRFX0FHR1JFR0FUSU9OKSAhPSAocG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfc3RhdGUgJiBBRF9TVEFURV9BR0dSRUdBVElPTikpCisJCSAgICkgeworCQkJLy8gdXBkYXRlIHRoZSBzdGF0ZSBtYWNoaW5lIFNlbGVjdGVkIHZhcmlhYmxlCisJCQlwb3J0LT5zbV92YXJzICY9IH5BRF9QT1JUX1NFTEVDVEVEOworCQl9CisJfQorfQorCisvKioKKyAqIF9fY2hvb3NlX21hdGNoZWQgLSB1cGRhdGUgYSBwb3J0J3MgbWF0Y2hlZCB2YXJpYWJsZSBmcm9tIGEgcmVjZWl2ZWQgbGFjcGR1CisgKiBAbGFjcGR1OiB0aGUgbGFjcGR1IHdlJ3ZlIHJlY2VpdmVkCisgKiBAcG9ydDogdGhlIHBvcnQgd2UncmUgbG9va2luZyBhdAorICoKKyAqIFVwZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIG1hdGNoZWQgdmFyaWFibGUsIHVzaW5nIHBhcmFtZXRlciB2YWx1ZXMgZnJvbSBhCisgKiBuZXdseSByZWNlaXZlZCBsYWNwZHUuIFBhcmFtZXRlciB2YWx1ZXMgZm9yIHRoZSBwYXJ0bmVyIGNhcnJpZWQgaW4gdGhlCisgKiByZWNlaXZlZCBQRFUgYXJlIGNvbXBhcmVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uYWwgcGFyYW1ldGVyCisgKiB2YWx1ZXMgZm9yIHRoZSBhY3Rvci4gTWF0Y2hlZCBpcyBzZXQgdG8gVFJVRSBpZiBhbGwgb2YgdGhlc2UgcGFyYW1ldGVycworICogbWF0Y2ggYW5kIHRoZSBQRFUgcGFyYW1ldGVyIHBhcnRuZXJfc3RhdGUuYWdncmVnYXRpb24gaGFzIHRoZSBzYW1lIHZhbHVlIGFzCisgKiBhY3Rvcl9vcGVyX3BvcnRfc3RhdGUuYWdncmVnYXRpb24gYW5kIGxhY3Agd2lsbCBhY3RpdmVseSBtYWludGFpbiB0aGUgbGluaworICogaW4gdGhlIGFnZ3JlZ2F0aW9uLiBNYXRjaGVkIGlzIGFsc28gc2V0IHRvIFRSVUUgaWYgdGhlIHZhbHVlIG9mCisgKiBhY3Rvcl9zdGF0ZS5hZ2dyZWdhdGlvbiBpbiB0aGUgcmVjZWl2ZWQgUERVIGlzIHNldCB0byBGQUxTRSwgaS5lLiwgaW5kaWNhdGVzCisgKiBhbiBpbmRpdmlkdWFsIGxpbmsgYW5kIGxhY3Agd2lsbCBhY3RpdmVseSBtYWludGFpbiB0aGUgbGluay4gT3RoZXJ3aXNlLAorICogbWF0Y2hlZCBpcyBzZXQgdG8gRkFMU0UuIExBQ1AgaXMgY29uc2lkZXJlZCB0byBiZSBhY3RpdmVseSBtYWludGFpbmluZyB0aGUKKyAqIGxpbmsgaWYgZWl0aGVyIHRoZSBQRFUncyBhY3Rvcl9zdGF0ZS5sYWNwX2FjdGl2aXR5IHZhcmlhYmxlIGlzIFRSVUUgb3IgYm90aAorICogdGhlIGFjdG9yJ3MgYWN0b3Jfb3Blcl9wb3J0X3N0YXRlLmxhY3BfYWN0aXZpdHkgYW5kIHRoZSBQRFUncworICogcGFydG5lcl9zdGF0ZS5sYWNwX2FjdGl2aXR5IHZhcmlhYmxlcyBhcmUgVFJVRS4KKyAqLworc3RhdGljIHZvaWQgX19jaG9vc2VfbWF0Y2hlZChzdHJ1Y3QgbGFjcGR1ICpsYWNwZHUsIHN0cnVjdCBwb3J0ICpwb3J0KQoreworCS8vIHZhbGlkYXRlIGxhY3BkdSBhbmQgcG9ydAorCWlmIChsYWNwZHUgJiYgcG9ydCkgeworCQkvLyBjaGVjayBpZiBhbGwgcGFyYW1ldGVycyBhcmUgYWxpa2UKKwkJaWYgKCgobGFjcGR1LT5wYXJ0bmVyX3BvcnQgPT0gcG9ydC0+YWN0b3JfcG9ydF9udW1iZXIpICYmCisJCSAgICAgKGxhY3BkdS0+cGFydG5lcl9wb3J0X3ByaW9yaXR5ID09IHBvcnQtPmFjdG9yX3BvcnRfcHJpb3JpdHkpICYmCisJCSAgICAgIU1BQ19BRERSRVNTX0NPTVBBUkUoJihsYWNwZHUtPnBhcnRuZXJfc3lzdGVtKSwgJihwb3J0LT5hY3Rvcl9zeXN0ZW0pKSAmJgorCQkgICAgIChsYWNwZHUtPnBhcnRuZXJfc3lzdGVtX3ByaW9yaXR5ID09IHBvcnQtPmFjdG9yX3N5c3RlbV9wcmlvcml0eSkgJiYKKwkJICAgICAobGFjcGR1LT5wYXJ0bmVyX2tleSA9PSBwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfa2V5KSAmJgorCQkgICAgICgobGFjcGR1LT5wYXJ0bmVyX3N0YXRlICYgQURfU1RBVEVfQUdHUkVHQVRJT04pID09IChwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgJiBBRF9TVEFURV9BR0dSRUdBVElPTikpKSB8fAorCQkgICAgLy8gb3IgdGhpcyBpcyBpbmRpdmlkdWFsIGxpbmsoYWdncmVnYXRpb24gPT0gRkFMU0UpCisJCSAgICAoKGxhY3BkdS0+YWN0b3Jfc3RhdGUgJiBBRF9TVEFURV9BR0dSRUdBVElPTikgPT0gMCkKKwkJICAgKSB7CisJCQkvLyB1cGRhdGUgdGhlIHN0YXRlIG1hY2hpbmUgTWF0Y2hlZCB2YXJpYWJsZQorCQkJcG9ydC0+c21fdmFycyB8PSBBRF9QT1JUX01BVENIRUQ7CisJCX0gZWxzZSB7CisJCQlwb3J0LT5zbV92YXJzICY9IH5BRF9QT1JUX01BVENIRUQ7CisJCX0KKwl9Cit9CisKKy8qKgorICogX191cGRhdGVfbnR0IC0gdXBkYXRlIGEgcG9ydCdzIG50dCB2YXJpYWJsZSBmcm9tIGEgcmVjZWl2ZWQgbGFjcGR1CisgKiBAbGFjcGR1OiB0aGUgbGFjcGR1IHdlJ3ZlIHJlY2VpdmVkCisgKiBAcG9ydDogdGhlIHBvcnQgd2UncmUgbG9va2luZyBhdAorICoKKyAqIFVwZGF0ZXMgdGhlIHZhbHVlIG9mIHRoZSBudHQgdmFyaWFibGUsIHVzaW5nIHBhcmFtZXRlciB2YWx1ZXMgZnJvbSBhIG5ld2x5CisgKiByZWNlaXZlZCBsYWNwZHUuIFRoZSBwYXJhbWV0ZXIgdmFsdWVzIGZvciB0aGUgcGFydG5lciBjYXJyaWVkIGluIHRoZQorICogcmVjZWl2ZWQgUERVIGFyZSBjb21wYXJlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbmFsIHBhcmFtZXRlcgorICogdmFsdWVzIGZvciB0aGUgQWN0b3IuIElmIG9uZSBvciBtb3JlIG9mIHRoZSBjb21wYXJpc29ucyBzaG93cyB0aGF0IHRoZQorICogdmFsdWUocykgcmVjZWl2ZWQgaW4gdGhlIFBEVSBkaWZmZXIgZnJvbSB0aGUgY3VycmVudCBvcGVyYXRpb25hbCB2YWx1ZXMsCisgKiB0aGVuIG50dCBpcyBzZXQgdG8gVFJVRS4gT3RoZXJ3aXNlLCBudHQgcmVtYWlucyB1bmNoYW5nZWQuCisgKi8KK3N0YXRpYyB2b2lkIF9fdXBkYXRlX250dChzdHJ1Y3QgbGFjcGR1ICpsYWNwZHUsIHN0cnVjdCBwb3J0ICpwb3J0KQoreworCS8vIHZhbGlkYXRlIGxhY3BkdSBhbmQgcG9ydAorCWlmIChsYWNwZHUgJiYgcG9ydCkgeworCQkvLyBjaGVjayBpZiBhbnkgcGFyYW1ldGVyIGlzIGRpZmZlcmVudAorCQlpZiAoKGxhY3BkdS0+cGFydG5lcl9wb3J0ICE9IHBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyKSB8fAorCQkgICAgKGxhY3BkdS0+cGFydG5lcl9wb3J0X3ByaW9yaXR5ICE9IHBvcnQtPmFjdG9yX3BvcnRfcHJpb3JpdHkpIHx8CisJCSAgICBNQUNfQUREUkVTU19DT01QQVJFKCYobGFjcGR1LT5wYXJ0bmVyX3N5c3RlbSksICYocG9ydC0+YWN0b3Jfc3lzdGVtKSkgfHwKKwkJICAgIChsYWNwZHUtPnBhcnRuZXJfc3lzdGVtX3ByaW9yaXR5ICE9IHBvcnQtPmFjdG9yX3N5c3RlbV9wcmlvcml0eSkgfHwKKwkJICAgIChsYWNwZHUtPnBhcnRuZXJfa2V5ICE9IHBvcnQtPmFjdG9yX29wZXJfcG9ydF9rZXkpIHx8CisJCSAgICAoKGxhY3BkdS0+cGFydG5lcl9zdGF0ZSAmIEFEX1NUQVRFX0xBQ1BfQUNUSVZJVFkpICE9IChwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgJiBBRF9TVEFURV9MQUNQX0FDVElWSVRZKSkgfHwKKwkJICAgICgobGFjcGR1LT5wYXJ0bmVyX3N0YXRlICYgQURfU1RBVEVfTEFDUF9USU1FT1VUKSAhPSAocG9ydC0+YWN0b3Jfb3Blcl9wb3J0X3N0YXRlICYgQURfU1RBVEVfTEFDUF9USU1FT1VUKSkgfHwKKwkJICAgICgobGFjcGR1LT5wYXJ0bmVyX3N0YXRlICYgQURfU1RBVEVfU1lOQ0hST05JWkFUSU9OKSAhPSAocG9ydC0+YWN0b3Jfb3Blcl9wb3J0X3N0YXRlICYgQURfU1RBVEVfU1lOQ0hST05JWkFUSU9OKSkgfHwKKwkJICAgICgobGFjcGR1LT5wYXJ0bmVyX3N0YXRlICYgQURfU1RBVEVfQUdHUkVHQVRJT04pICE9IChwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgJiBBRF9TVEFURV9BR0dSRUdBVElPTikpCisJCSAgICkgeworCQkJLy8gc2V0IG50dCB0byBiZSBUUlVFCisJCQlwb3J0LT5udHQgPSAxOworCQl9CisJfQorfQorCisvKioKKyAqIF9fYXR0YWNoX2JvbmRfdG9fYWdnCisgKiBAcG9ydDogdGhlIHBvcnQgd2UncmUgbG9va2luZyBhdAorICoKKyAqIEhhbmRsZSB0aGUgYXR0YWNoaW5nIG9mIHRoZSBwb3J0J3MgY29udHJvbCBwYXJzZXIvbXVsdGlwbGV4ZXIgYW5kIHRoZQorICogYWdncmVnYXRvci4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcgc2luY2UgdGhlIHBhcnNlci9tdWx0aXBsZXhlciBvZiB0aGUKKyAqIHJlY2VpdmUgYW5kIHRoZSBwYXJzZXIvbXVsdGlwbGV4ZXIgb2YgdGhlIGFnZ3JlZ2F0b3IgYXJlIGFscmVhZHkgY29tYmluZWQuCisgKi8KK3N0YXRpYyB2b2lkIF9fYXR0YWNoX2JvbmRfdG9fYWdnKHN0cnVjdCBwb3J0ICpwb3J0KQoreworCXBvcnQ9TlVMTDsgLy8ganVzdCB0byBzYXRpc2Z5IHRoZSBjb21waWxlcgorCS8vIFRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nIHNpbmNlIHRoZSBwYXJzZXIvbXVsdGlwbGV4ZXIgb2YgdGhlIHJlY2VpdmUKKwkvLyBhbmQgdGhlIHBhcnNlci9tdWx0aXBsZXhlciBvZiB0aGUgYWdncmVnYXRvciBhcmUgYWxyZWFkeSBjb21iaW5lZAorfQorCisvKioKKyAqIF9fZGV0YWNoX2JvbmRfZnJvbV9hZ2cKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICogSGFuZGxlIHRoZSBkZXRhY2hpbmcgb2YgdGhlIHBvcnQncyBjb250cm9sIHBhcnNlci9tdWx0aXBsZXhlciBmcm9tIHRoZQorICogYWdncmVnYXRvci4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcgc2luY2UgdGhlIHBhcnNlci9tdWx0aXBsZXhlciBvZiB0aGUKKyAqIHJlY2VpdmUgYW5kIHRoZSBwYXJzZXIvbXVsdGlwbGV4ZXIgb2YgdGhlIGFnZ3JlZ2F0b3IgYXJlIGFscmVhZHkgY29tYmluZWQuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV0YWNoX2JvbmRfZnJvbV9hZ2coc3RydWN0IHBvcnQgKnBvcnQpCit7CisJcG9ydD1OVUxMOyAvLyBqdXN0IHRvIHNhdGlzZnkgdGhlIGNvbXBpbGVyCisJLy8gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcgc2llbmNlIHRoZSBwYXJzZXIvbXVsdGlwbGV4ZXIgb2YgdGhlIHJlY2VpdmUKKwkvLyBhbmQgdGhlIHBhcnNlci9tdWx0aXBsZXhlciBvZiB0aGUgYWdncmVnYXRvciBhcmUgYWxyZWFkeSBjb21iaW5lZAorfQorCisvKioKKyAqIF9fYWdnX3BvcnRzX2FyZV9yZWFkeSAtIGNoZWNrIGlmIGFsbCBwb3J0cyBpbiBhbiBhZ2dyZWdhdG9yIGFyZSByZWFkeQorICogQGFnZ3JlZ2F0b3I6IHRoZSBhZ2dyZWdhdG9yIHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKi8KK3N0YXRpYyBpbnQgX19hZ2dfcG9ydHNfYXJlX3JlYWR5KHN0cnVjdCBhZ2dyZWdhdG9yICphZ2dyZWdhdG9yKQoreworCXN0cnVjdCBwb3J0ICpwb3J0OworCWludCByZXR2YWwgPSAxOworCisJaWYgKGFnZ3JlZ2F0b3IpIHsKKwkJLy8gc2NhbiBhbGwgcG9ydHMgaW4gdGhpcyBhZ2dyZWdhdG9yIHRvIHZlcmZ5IGlmIHRoZXkgYXJlIGFsbCByZWFkeQorCQlmb3IgKHBvcnQ9YWdncmVnYXRvci0+bGFnX3BvcnRzOyBwb3J0OyBwb3J0PXBvcnQtPm5leHRfcG9ydF9pbl9hZ2dyZWdhdG9yKSB7CisJCQlpZiAoIShwb3J0LT5zbV92YXJzICYgQURfUE9SVF9SRUFEWV9OKSkgeworCQkJCXJldHZhbCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIF9fc2V0X2FnZ19wb3J0c19yZWFkeSAtIHNldCB2YWx1ZSBvZiBSZWFkeSBiaXQgaW4gYWxsIHBvcnRzIG9mIGFuIGFnZ3JlZ2F0b3IKKyAqIEBhZ2dyZWdhdG9yOiB0aGUgYWdncmVnYXRvciB3ZSdyZSBsb29raW5nIGF0CisgKiBAdmFsOiBTaG91bGQgdGhlIHBvcnRzJyByZWFkeSBiaXQgYmUgc2V0IG9uIG9yIG9mZgorICoKKyAqLworc3RhdGljIHZvaWQgX19zZXRfYWdnX3BvcnRzX3JlYWR5KHN0cnVjdCBhZ2dyZWdhdG9yICphZ2dyZWdhdG9yLCBpbnQgdmFsKQoreworCXN0cnVjdCBwb3J0ICpwb3J0OworCisJZm9yIChwb3J0PWFnZ3JlZ2F0b3ItPmxhZ19wb3J0czsgcG9ydDsgcG9ydD1wb3J0LT5uZXh0X3BvcnRfaW5fYWdncmVnYXRvcikgeworCQlpZiAodmFsKSB7CisJCQlwb3J0LT5zbV92YXJzIHw9IEFEX1BPUlRfUkVBRFk7CisJCX0gZWxzZSB7CisJCQlwb3J0LT5zbV92YXJzICY9IH5BRF9QT1JUX1JFQURZOworCQl9CisJfQorfQorCisvKioKKyAqIF9fZ2V0X2FnZ19iYW5kd2lkdGggLSBnZXQgdGhlIHRvdGFsIGJhbmR3aWR0aCBvZiBhbiBhZ2dyZWdhdG9yCisgKiBAYWdncmVnYXRvcjogdGhlIGFnZ3JlZ2F0b3Igd2UncmUgbG9va2luZyBhdAorICoKKyAqLworc3RhdGljIHUzMiBfX2dldF9hZ2dfYmFuZHdpZHRoKHN0cnVjdCBhZ2dyZWdhdG9yICphZ2dyZWdhdG9yKQoreworCXUzMiBiYW5kd2lkdGg9MDsKKwl1MzIgYmFzaWNfc3BlZWQ7CisKKwlpZiAoYWdncmVnYXRvci0+bnVtX29mX3BvcnRzKSB7CisJCWJhc2ljX3NwZWVkID0gX19nZXRfbGlua19zcGVlZChhZ2dyZWdhdG9yLT5sYWdfcG9ydHMpOworCQlzd2l0Y2ggKGJhc2ljX3NwZWVkKSB7CisJCWNhc2UgQURfTElOS19TUEVFRF9CSVRNQVNLXzFNQlBTOgorCQkJYmFuZHdpZHRoID0gYWdncmVnYXRvci0+bnVtX29mX3BvcnRzOworCQkJYnJlYWs7CisJCWNhc2UgQURfTElOS19TUEVFRF9CSVRNQVNLXzEwTUJQUzoKKwkJCWJhbmR3aWR0aCA9IGFnZ3JlZ2F0b3ItPm51bV9vZl9wb3J0cyAqIDEwOworCQkJYnJlYWs7CisJCWNhc2UgQURfTElOS19TUEVFRF9CSVRNQVNLXzEwME1CUFM6CisJCQliYW5kd2lkdGggPSBhZ2dyZWdhdG9yLT5udW1fb2ZfcG9ydHMgKiAxMDA7CisJCQlicmVhazsKKwkJY2FzZSBBRF9MSU5LX1NQRUVEX0JJVE1BU0tfMTAwME1CUFM6CisJCQliYW5kd2lkdGggPSBhZ2dyZWdhdG9yLT5udW1fb2ZfcG9ydHMgKiAxMDAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQliYW5kd2lkdGg9MDsgLy8gdG8gc2lsZW50IHRoZSBjb21waWxvciAuLi4uCisJCX0KKwl9CisJcmV0dXJuIGJhbmR3aWR0aDsKK30KKworLyoqCisgKiBfX2dldF9hY3RpdmVfYWdnIC0gZ2V0IHRoZSBjdXJyZW50IGFjdGl2ZSBhZ2dyZWdhdG9yCisgKiBAYWdncmVnYXRvcjogdGhlIGFnZ3JlZ2F0b3Igd2UncmUgbG9va2luZyBhdAorICoKKyAqLworc3RhdGljIHN0cnVjdCBhZ2dyZWdhdG9yICpfX2dldF9hY3RpdmVfYWdnKHN0cnVjdCBhZ2dyZWdhdG9yICphZ2dyZWdhdG9yKQoreworCXN0cnVjdCBhZ2dyZWdhdG9yICpyZXR2YWwgPSBOVUxMOworCisJZm9yICg7IGFnZ3JlZ2F0b3I7IGFnZ3JlZ2F0b3IgPSBfX2dldF9uZXh0X2FnZyhhZ2dyZWdhdG9yKSkgeworCQlpZiAoYWdncmVnYXRvci0+aXNfYWN0aXZlKSB7CisJCQlyZXR2YWwgPSBhZ2dyZWdhdG9yOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIF9fdXBkYXRlX2xhY3BkdV9mcm9tX3BvcnQgLSB1cGRhdGUgYSBwb3J0J3MgbGFjcGR1IGZpZWxkcworICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3VwZGF0ZV9sYWNwZHVfZnJvbV9wb3J0KHN0cnVjdCBwb3J0ICpwb3J0KQoreworCXN0cnVjdCBsYWNwZHUgKmxhY3BkdSA9ICZwb3J0LT5sYWNwZHU7CisKKwkvKiB1cGRhdGUgY3VycmVudCBhY3R1YWwgQWN0b3IgcGFyYW1ldGVycyAqLworCS8qIGxhY3BkdS0+c3VidHlwZSAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZAorCSAqIGxhY3BkdS0+dmVyc2lvbl9udW1iZXIgICAgICAgICAgICBpbml0aWFsaXplZAorCSAqIGxhY3BkdS0+dGx2X3R5cGVfYWN0b3JfaW5mbyAgICAgICBpbml0aWFsaXplZAorCSAqIGxhY3BkdS0+YWN0b3JfaW5mb3JtYXRpb25fbGVuZ3RoICBpbml0aWFsaXplZAorCSAqLworCisJbGFjcGR1LT5hY3Rvcl9zeXN0ZW1fcHJpb3JpdHkgPSBwb3J0LT5hY3Rvcl9zeXN0ZW1fcHJpb3JpdHk7CisJbGFjcGR1LT5hY3Rvcl9zeXN0ZW0gPSBwb3J0LT5hY3Rvcl9zeXN0ZW07CisJbGFjcGR1LT5hY3Rvcl9rZXkgPSBwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfa2V5OworCWxhY3BkdS0+YWN0b3JfcG9ydF9wcmlvcml0eSA9IHBvcnQtPmFjdG9yX3BvcnRfcHJpb3JpdHk7CisJbGFjcGR1LT5hY3Rvcl9wb3J0ID0gcG9ydC0+YWN0b3JfcG9ydF9udW1iZXI7CisJbGFjcGR1LT5hY3Rvcl9zdGF0ZSA9IHBvcnQtPmFjdG9yX29wZXJfcG9ydF9zdGF0ZTsKKworCS8qIGxhY3BkdS0+cmVzZXJ2ZWRfM18xICAgICAgICAgICAgICBpbml0aWFsaXplZAorCSAqIGxhY3BkdS0+dGx2X3R5cGVfcGFydG5lcl9pbmZvICAgICBpbml0aWFsaXplZAorCSAqIGxhY3BkdS0+cGFydG5lcl9pbmZvcm1hdGlvbl9sZW5ndGggaW5pdGlhbGl6ZWQKKwkgKi8KKworCWxhY3BkdS0+cGFydG5lcl9zeXN0ZW1fcHJpb3JpdHkgPSBwb3J0LT5wYXJ0bmVyX29wZXJfc3lzdGVtX3ByaW9yaXR5OworCWxhY3BkdS0+cGFydG5lcl9zeXN0ZW0gPSBwb3J0LT5wYXJ0bmVyX29wZXJfc3lzdGVtOworCWxhY3BkdS0+cGFydG5lcl9rZXkgPSBwb3J0LT5wYXJ0bmVyX29wZXJfa2V5OworCWxhY3BkdS0+cGFydG5lcl9wb3J0X3ByaW9yaXR5ID0gcG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfcHJpb3JpdHk7CisJbGFjcGR1LT5wYXJ0bmVyX3BvcnQgPSBwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9udW1iZXI7CisJbGFjcGR1LT5wYXJ0bmVyX3N0YXRlID0gcG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfc3RhdGU7CisKKwkvKiBsYWNwZHUtPnJlc2VydmVkXzNfMiAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQKKwkgKiBsYWNwZHUtPnRsdl90eXBlX2NvbGxlY3Rvcl9pbmZvICAgaW5pdGlhbGl6ZWQKKwkgKiBsYWNwZHUtPmNvbGxlY3Rvcl9pbmZvcm1hdGlvbl9sZW5ndGggaW5pdGlhbGl6ZWQKKwkgKiBjb2xsZWN0b3JfbWF4X2RlbGF5ICAgICAgICAgICAgICAgIGluaXRpYWxpemVkCisJICogcmVzZXJ2ZWRfMTJbMTJdICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkCisJICogdGx2X3R5cGVfdGVybWluYXRvciAgICAgICAgICAgICAgIGluaXRpYWxpemVkCisJICogdGVybWluYXRvcl9sZW5ndGggICAgICAgICAgICAgICAgIGluaXRpYWxpemVkCisJICogcmVzZXJ2ZWRfNTBbNTBdICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkCisJICovCisKKwkvKiBDb252ZXJ0IGFsbCBub24gdTggcGFyYW1ldGVycyB0byBCaWcgRW5kaWFuIGZvciB0cmFuc21pdCAqLworCV9fbnRvaHNfbGFjcGR1KGxhY3BkdSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyA9PT09PT09PT09PT09PT09PSBtYWluIDgwMi4zYWQgcHJvdG9jb2wgY29kZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqCisgKiBhZF9sYWNwZHVfc2VuZCAtIHNlbmQgb3V0IGEgbGFjcGR1IHBhY2tldCBvbiBhIGdpdmVuIHBvcnQKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICogUmV0dXJuczogICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgICAgIDwgMCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IGFkX2xhY3BkdV9zZW5kKHN0cnVjdCBwb3J0ICpwb3J0KQoreworCXN0cnVjdCBzbGF2ZSAqc2xhdmUgPSBwb3J0LT5zbGF2ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBsYWNwZHVfaGVhZGVyICpsYWNwZHVfaGVhZGVyOworCWludCBsZW5ndGggPSBzaXplb2Yoc3RydWN0IGxhY3BkdV9oZWFkZXIpOworCXN0cnVjdCBtYWNfYWRkciBsYWNwZHVfbXVsdGljYXN0X2FkZHJlc3MgPSBBRF9NVUxUSUNBU1RfTEFDUERVX0FERFI7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbmd0aCk7CisJaWYgKCFza2IpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc2tiLT5kZXYgPSBzbGF2ZS0+ZGV2OworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YSArIEVUSF9ITEVOOworCXNrYi0+cHJvdG9jb2wgPSBQS1RfVFlQRV9MQUNQRFU7CisJc2tiLT5wcmlvcml0eSA9IFRDX1BSSU9fQ09OVFJPTDsKKworCWxhY3BkdV9oZWFkZXIgPSAoc3RydWN0IGxhY3BkdV9oZWFkZXIgKilza2JfcHV0KHNrYiwgbGVuZ3RoKTsKKworCWxhY3BkdV9oZWFkZXItPmFkX2hlYWRlci5kZXN0aW5hdGlvbl9hZGRyZXNzID0gbGFjcGR1X211bHRpY2FzdF9hZGRyZXNzOworCS8qIE5vdGU6IHNvdXJjZSBhZGRyZXMgaXMgc2V0IHRvIGJlIHRoZSBtZW1iZXIncyBQRVJNQU5FTlQgYWRkcmVzcywgYmVjYXVzZSB3ZSB1c2UgaXQKKwkgICB0byBpZGVudGlmeSBsb29wYmFjayBsYWNwZHVzIGluIHJlY2VpdmUuICovCisJbGFjcGR1X2hlYWRlci0+YWRfaGVhZGVyLnNvdXJjZV9hZGRyZXNzID0gKigoc3RydWN0IG1hY19hZGRyICopKHNsYXZlLT5wZXJtX2h3YWRkcikpOworCWxhY3BkdV9oZWFkZXItPmFkX2hlYWRlci5sZW5ndGhfdHlwZSA9IFBLVF9UWVBFX0xBQ1BEVTsKKworCWxhY3BkdV9oZWFkZXItPmxhY3BkdSA9IHBvcnQtPmxhY3BkdTsgLy8gc3RydWN0IGNvcHkKKworCWRldl9xdWV1ZV94bWl0KHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBhZF9tYXJrZXJfc2VuZCAtIHNlbmQgbWFya2VyIGluZm9ybWF0aW9uL3Jlc3BvbnNlIG9uIGEgZ2l2ZW4gcG9ydAorICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqIEBtYXJrZXI6IG1hcmtlciBkYXRhIHRvIHNlbmQKKyAqCisgKiBSZXR1cm5zOiAgIDAgb24gc3VjY2VzcworICogICAgICAgICAgPCAwIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgYWRfbWFya2VyX3NlbmQoc3RydWN0IHBvcnQgKnBvcnQsIHN0cnVjdCBtYXJrZXIgKm1hcmtlcikKK3sKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlID0gcG9ydC0+c2xhdmU7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbWFya2VyX2hlYWRlciAqbWFya2VyX2hlYWRlcjsKKwlpbnQgbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBtYXJrZXJfaGVhZGVyKTsKKwlzdHJ1Y3QgbWFjX2FkZHIgbGFjcGR1X211bHRpY2FzdF9hZGRyZXNzID0gQURfTVVMVElDQVNUX0xBQ1BEVV9BRERSOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW5ndGggKyAxNik7CisJaWYgKCFza2IpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc2tiX3Jlc2VydmUoc2tiLCAxNik7CisKKwlza2ItPmRldiA9IHNsYXZlLT5kZXY7CisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhICsgRVRIX0hMRU47CisJc2tiLT5wcm90b2NvbCA9IFBLVF9UWVBFX0xBQ1BEVTsKKworCW1hcmtlcl9oZWFkZXIgPSAoc3RydWN0IG1hcmtlcl9oZWFkZXIgKilza2JfcHV0KHNrYiwgbGVuZ3RoKTsKKworCW1hcmtlcl9oZWFkZXItPmFkX2hlYWRlci5kZXN0aW5hdGlvbl9hZGRyZXNzID0gbGFjcGR1X211bHRpY2FzdF9hZGRyZXNzOworCS8qIE5vdGU6IHNvdXJjZSBhZGRyZXMgaXMgc2V0IHRvIGJlIHRoZSBtZW1iZXIncyBQRVJNQU5FTlQgYWRkcmVzcywgYmVjYXVzZSB3ZSB1c2UgaXQKKwkgICB0byBpZGVudGlmeSBsb29wYmFjayBNQVJLRVJzIGluIHJlY2VpdmUuICovCisJbWFya2VyX2hlYWRlci0+YWRfaGVhZGVyLnNvdXJjZV9hZGRyZXNzID0gKigoc3RydWN0IG1hY19hZGRyICopKHNsYXZlLT5wZXJtX2h3YWRkcikpOworCW1hcmtlcl9oZWFkZXItPmFkX2hlYWRlci5sZW5ndGhfdHlwZSA9IFBLVF9UWVBFX0xBQ1BEVTsKKworCW1hcmtlcl9oZWFkZXItPm1hcmtlciA9ICptYXJrZXI7IC8vIHN0cnVjdCBjb3B5CisKKwlkZXZfcXVldWVfeG1pdChza2IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYWRfbXV4X21hY2hpbmUgLSBoYW5kbGUgYSBwb3J0J3MgbXV4IHN0YXRlIG1hY2hpbmUKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICovCitzdGF0aWMgdm9pZCBhZF9tdXhfbWFjaGluZShzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwltdXhfc3RhdGVzX3QgbGFzdF9zdGF0ZTsKKworCS8vIGtlZXAgY3VycmVudCBTdGF0ZSBNYWNoaW5lIHN0YXRlIHRvIGNvbXBhcmUgbGF0ZXIgaWYgaXQgd2FzIGNoYW5nZWQKKwlsYXN0X3N0YXRlID0gcG9ydC0+c21fbXV4X3N0YXRlOworCisJaWYgKHBvcnQtPnNtX3ZhcnMgJiBBRF9QT1JUX0JFR0lOKSB7CisJCXBvcnQtPnNtX211eF9zdGF0ZSA9IEFEX01VWF9ERVRBQ0hFRDsJCSAvLyBuZXh0IHN0YXRlCisJfSBlbHNlIHsKKwkJc3dpdGNoIChwb3J0LT5zbV9tdXhfc3RhdGUpIHsKKwkJY2FzZSBBRF9NVVhfREVUQUNIRUQ6CisJCQlpZiAoKHBvcnQtPnNtX3ZhcnMgJiBBRF9QT1JUX1NFTEVDVEVEKSB8fCAocG9ydC0+c21fdmFycyAmIEFEX1BPUlRfU1RBTkRCWSkpIHsgLy8gaWYgU0VMRUNURUQgb3IgU1RBTkRCWQorCQkJCXBvcnQtPnNtX211eF9zdGF0ZSA9IEFEX01VWF9XQUlUSU5HOyAvLyBuZXh0IHN0YXRlCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBBRF9NVVhfV0FJVElORzoKKwkJCS8vIGlmIFNFTEVDVEVEID09IEZBTFNFIHJldHVybiB0byBERVRBQ0ggc3RhdGUKKwkJCWlmICghKHBvcnQtPnNtX3ZhcnMgJiBBRF9QT1JUX1NFTEVDVEVEKSkgeyAvLyBpZiBVTlNFTEVDVEVECisJCQkJcG9ydC0+c21fdmFycyAmPSB+QURfUE9SVF9SRUFEWV9OOworCQkJCS8vIGluIG9yZGVyIHRvIHdpdGhob2xkIHRoZSBTZWxlY3Rpb24gTG9naWMgdG8gY2hlY2sgYWxsIHBvcnRzIFJFQURZX04gdmFsdWUKKwkJCQkvLyBldmVyeSBjYWxsYmFjayBjeWNsZSB0byB1cGRhdGUgcmVhZHkgdmFyaWFibGUsIHdlIGNoZWNrIFJFQURZX04gYW5kIHVwZGF0ZSBSRUFEWSBoZXJlCisJCQkJX19zZXRfYWdnX3BvcnRzX3JlYWR5KHBvcnQtPmFnZ3JlZ2F0b3IsIF9fYWdnX3BvcnRzX2FyZV9yZWFkeShwb3J0LT5hZ2dyZWdhdG9yKSk7CisJCQkJcG9ydC0+c21fbXV4X3N0YXRlID0gQURfTVVYX0RFVEFDSEVEOwkgLy8gbmV4dCBzdGF0ZQorCQkJCWJyZWFrOworCQkJfQorCisJCQkvLyBjaGVjayBpZiB0aGUgd2FpdF93aGlsZV90aW1lciBleHBpcmVkCisJCQlpZiAocG9ydC0+c21fbXV4X3RpbWVyX2NvdW50ZXIgJiYgISgtLXBvcnQtPnNtX211eF90aW1lcl9jb3VudGVyKSkgeworCQkJCXBvcnQtPnNtX3ZhcnMgfD0gQURfUE9SVF9SRUFEWV9OOworCQkJfQorCisJCQkvLyBpbiBvcmRlciB0byB3aXRoaG9sZCB0aGUgc2VsZWN0aW9uIGxvZ2ljIHRvIGNoZWNrIGFsbCBwb3J0cyBSRUFEWV9OIHZhbHVlCisJCQkvLyBldmVyeSBjYWxsYmFjayBjeWNsZSB0byB1cGRhdGUgcmVhZHkgdmFyaWFibGUsIHdlIGNoZWNrIFJFQURZX04gYW5kIHVwZGF0ZSBSRUFEWSBoZXJlCisJCQlfX3NldF9hZ2dfcG9ydHNfcmVhZHkocG9ydC0+YWdncmVnYXRvciwgX19hZ2dfcG9ydHNfYXJlX3JlYWR5KHBvcnQtPmFnZ3JlZ2F0b3IpKTsKKworCQkJLy8gaWYgdGhlIHdhaXRfd2hpbGVfdGltZXIgZXhwaXJlZCwgYW5kIHRoZSBwb3J0IGlzIGluIFJFQURZIHN0YXRlLCBtb3ZlIHRvIEFUVEFDSEVEIHN0YXRlCisJCQlpZiAoKHBvcnQtPnNtX3ZhcnMgJiBBRF9QT1JUX1JFQURZKSAmJiAhcG9ydC0+c21fbXV4X3RpbWVyX2NvdW50ZXIpIHsKKwkJCQlwb3J0LT5zbV9tdXhfc3RhdGUgPSBBRF9NVVhfQVRUQUNIRUQ7CSAvLyBuZXh0IHN0YXRlCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBBRF9NVVhfQVRUQUNIRUQ6CisJCQkvLyBjaGVjayBhbHNvIGlmIGFnZ19zZWxlY3RfdGltZXIgZXhwaXJlZChzbyB0aGUgZWRhYmxlIHBvcnQgd2lsbCB0YWtlIHBsYWNlIG9ubHkgYWZ0ZXIgdGhpcyB0aW1lcikKKwkJCWlmICgocG9ydC0+c21fdmFycyAmIEFEX1BPUlRfU0VMRUNURUQpICYmIChwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9zdGF0ZSAmIEFEX1NUQVRFX1NZTkNIUk9OSVpBVElPTikgJiYgIV9fY2hlY2tfYWdnX3NlbGVjdGlvbl90aW1lcihwb3J0KSkgeworCQkJCXBvcnQtPnNtX211eF9zdGF0ZSA9IEFEX01VWF9DT0xMRUNUSU5HX0RJU1RSSUJVVElORzsvLyBuZXh0IHN0YXRlCisJCQl9IGVsc2UgaWYgKCEocG9ydC0+c21fdmFycyAmIEFEX1BPUlRfU0VMRUNURUQpIHx8IChwb3J0LT5zbV92YXJzICYgQURfUE9SVF9TVEFOREJZKSkgewkgIC8vIGlmIFVOU0VMRUNURUQgb3IgU1RBTkRCWQorCQkJCXBvcnQtPnNtX3ZhcnMgJj0gfkFEX1BPUlRfUkVBRFlfTjsKKwkJCQkvLyBpbiBvcmRlciB0byB3aXRoaG9sZCB0aGUgc2VsZWN0aW9uIGxvZ2ljIHRvIGNoZWNrIGFsbCBwb3J0cyBSRUFEWV9OIHZhbHVlCisJCQkJLy8gZXZlcnkgY2FsbGJhY2sgY3ljbGUgdG8gdXBkYXRlIHJlYWR5IHZhcmlhYmxlLCB3ZSBjaGVjayBSRUFEWV9OIGFuZCB1cGRhdGUgUkVBRFkgaGVyZQorCQkJCV9fc2V0X2FnZ19wb3J0c19yZWFkeShwb3J0LT5hZ2dyZWdhdG9yLCBfX2FnZ19wb3J0c19hcmVfcmVhZHkocG9ydC0+YWdncmVnYXRvcikpOworCQkJCXBvcnQtPnNtX211eF9zdGF0ZSA9IEFEX01VWF9ERVRBQ0hFRDsvLyBuZXh0IHN0YXRlCisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBBRF9NVVhfQ09MTEVDVElOR19ESVNUUklCVVRJTkc6CisJCQlpZiAoIShwb3J0LT5zbV92YXJzICYgQURfUE9SVF9TRUxFQ1RFRCkgfHwgKHBvcnQtPnNtX3ZhcnMgJiBBRF9QT1JUX1NUQU5EQlkpIHx8CisJCQkgICAgIShwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9zdGF0ZSAmIEFEX1NUQVRFX1NZTkNIUk9OSVpBVElPTikKKwkJCSAgICkgeworCQkJCXBvcnQtPnNtX211eF9zdGF0ZSA9IEFEX01VWF9BVFRBQ0hFRDsvLyBuZXh0IHN0YXRlCisKKwkJCX0gZWxzZSB7CisJCQkJLy8gaWYgcG9ydCBzdGF0ZSBoYXNuJ3QgY2hhbmdlZCBtYWtlCisJCQkJLy8gc3VyZSB0aGF0IGEgY29sbGVjdGluZyBkaXN0cmlidXRpbmcKKwkJCQkvLyBwb3J0IGluIGFuIGFjdGl2ZSBhZ2dyZWdhdG9yIGlzIGVuYWJsZWQKKwkJCQlpZiAocG9ydC0+YWdncmVnYXRvciAmJgorCQkJCSAgICBwb3J0LT5hZ2dyZWdhdG9yLT5pc19hY3RpdmUgJiYKKwkJCQkgICAgIV9fcG9ydF9pc19lbmFibGVkKHBvcnQpKSB7CisKKwkJCQkJX19lbmFibGVfcG9ydChwb3J0KTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDogICAgLy90byBzaWxlbmNlIHRoZSBjb21waWxlcgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBjaGVjayBpZiB0aGUgc3RhdGUgbWFjaGluZSB3YXMgY2hhbmdlZAorCWlmIChwb3J0LT5zbV9tdXhfc3RhdGUgIT0gbGFzdF9zdGF0ZSkgeworCQlkcHJpbnRrKCJNdXggTWFjaGluZTogUG9ydD0lZCwgTGFzdCBTdGF0ZT0lZCwgQ3VyciBTdGF0ZT0lZFxuIiwgcG9ydC0+YWN0b3JfcG9ydF9udW1iZXIsIGxhc3Rfc3RhdGUsIHBvcnQtPnNtX211eF9zdGF0ZSk7CisJCXN3aXRjaCAocG9ydC0+c21fbXV4X3N0YXRlKSB7CisJCWNhc2UgQURfTVVYX0RFVEFDSEVEOgorCQkJX19kZXRhY2hfYm9uZF9mcm9tX2FnZyhwb3J0KTsKKwkJCXBvcnQtPmFjdG9yX29wZXJfcG9ydF9zdGF0ZSAmPSB+QURfU1RBVEVfU1lOQ0hST05JWkFUSU9OOworCQkJYWRfZGlzYWJsZV9jb2xsZWN0aW5nX2Rpc3RyaWJ1dGluZyhwb3J0KTsKKwkJCXBvcnQtPmFjdG9yX29wZXJfcG9ydF9zdGF0ZSAmPSB+QURfU1RBVEVfQ09MTEVDVElORzsKKwkJCXBvcnQtPmFjdG9yX29wZXJfcG9ydF9zdGF0ZSAmPSB+QURfU1RBVEVfRElTVFJJQlVUSU5HOworCQkJcG9ydC0+bnR0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIEFEX01VWF9XQUlUSU5HOgorCQkJcG9ydC0+c21fbXV4X3RpbWVyX2NvdW50ZXIgPSBfX2FkX3RpbWVyX3RvX3RpY2tzKEFEX1dBSVRfV0hJTEVfVElNRVIsIDApOworCQkJYnJlYWs7CisJCWNhc2UgQURfTVVYX0FUVEFDSEVEOgorCQkJX19hdHRhY2hfYm9uZF90b19hZ2cocG9ydCk7CisJCQlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgfD0gQURfU1RBVEVfU1lOQ0hST05JWkFUSU9OOworCQkJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X3N0YXRlICY9IH5BRF9TVEFURV9DT0xMRUNUSU5HOworCQkJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X3N0YXRlICY9IH5BRF9TVEFURV9ESVNUUklCVVRJTkc7CisJCQlhZF9kaXNhYmxlX2NvbGxlY3RpbmdfZGlzdHJpYnV0aW5nKHBvcnQpOworCQkJcG9ydC0+bnR0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIEFEX01VWF9DT0xMRUNUSU5HX0RJU1RSSUJVVElORzoKKwkJCXBvcnQtPmFjdG9yX29wZXJfcG9ydF9zdGF0ZSB8PSBBRF9TVEFURV9DT0xMRUNUSU5HOworCQkJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X3N0YXRlIHw9IEFEX1NUQVRFX0RJU1RSSUJVVElORzsKKwkJCWFkX2VuYWJsZV9jb2xsZWN0aW5nX2Rpc3RyaWJ1dGluZyhwb3J0KTsKKwkJCXBvcnQtPm50dCA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDogICAgLy90byBzaWxlbmNlIHRoZSBjb21waWxlcgorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qKgorICogYWRfcnhfbWFjaGluZSAtIGhhbmRsZSBhIHBvcnQncyByeCBTdGF0ZSBNYWNoaW5lCisgKiBAbGFjcGR1OiB0aGUgbGFjcGR1IHdlJ3ZlIHJlY2VpdmVkCisgKiBAcG9ydDogdGhlIHBvcnQgd2UncmUgbG9va2luZyBhdAorICoKKyAqIElmIGxhY3BkdSBhcnJpdmVkLCBzdG9wIHByZXZpb3VzIHRpbWVyIChpZiBleGlzdHMpIGFuZCBzZXQgdGhlIG5leHQgc3RhdGUgYXMKKyAqIENVUlJFTlQuIElmIHRpbWVyIGV4cGlyZWQgc2V0IHRoZSBzdGF0ZSBtYWNoaW5lIGluIHRoZSBwcm9wZXIgc3RhdGUuCisgKiBJbiBvdGhlciBjYXNlcywgdGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgd2UgbmVlZCB0byBzd2l0Y2ggdG8gb3RoZXIgc3RhdGUuCisgKi8KK3N0YXRpYyB2b2lkIGFkX3J4X21hY2hpbmUoc3RydWN0IGxhY3BkdSAqbGFjcGR1LCBzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwlyeF9zdGF0ZXNfdCBsYXN0X3N0YXRlOworCisJLy8gTG9jayB0byBwcmV2ZW50IDIgaW5zdGFuY2VzIG9mIHRoaXMgZnVuY3Rpb24gdG8gcnVuIHNpbXVsdGFuZW91c2x5KHJ4IGludGVycnVwdCBhbmQgcGVyaW9kaWMgbWFjaGluZSBjYWxsYmFjaykKKwlfX2dldF9yeF9tYWNoaW5lX2xvY2socG9ydCk7CisKKwkvLyBrZWVwIGN1cnJlbnQgU3RhdGUgTWFjaGluZSBzdGF0ZSB0byBjb21wYXJlIGxhdGVyIGlmIGl0IHdhcyBjaGFuZ2VkCisJbGFzdF9zdGF0ZSA9IHBvcnQtPnNtX3J4X3N0YXRlOworCisJLy8gY2hlY2sgaWYgc3RhdGUgbWFjaGluZSBzaG91bGQgY2hhbmdlIHN0YXRlCisJLy8gZmlyc3QsIGNoZWNrIGlmIHBvcnQgd2FzIHJlaW5pdGlhbGl6ZWQKKwlpZiAocG9ydC0+c21fdmFycyAmIEFEX1BPUlRfQkVHSU4pIHsKKwkJcG9ydC0+c21fcnhfc3RhdGUgPSBBRF9SWF9JTklUSUFMSVpFOwkJICAgIC8vIG5leHQgc3RhdGUKKwl9CisJLy8gY2hlY2sgaWYgcG9ydCBpcyBub3QgZW5hYmxlZAorCWVsc2UgaWYgKCEocG9ydC0+c21fdmFycyAmIEFEX1BPUlRfQkVHSU4pICYmICFwb3J0LT5pc19lbmFibGVkICYmICEocG9ydC0+c21fdmFycyAmIEFEX1BPUlRfTU9WRUQpKSB7CisJCXBvcnQtPnNtX3J4X3N0YXRlID0gQURfUlhfUE9SVF9ESVNBQkxFRDsJICAgIC8vIG5leHQgc3RhdGUKKwl9CisJLy8gY2hlY2sgaWYgbmV3IGxhY3BkdSBhcnJpdmVkCisJZWxzZSBpZiAobGFjcGR1ICYmICgocG9ydC0+c21fcnhfc3RhdGUgPT0gQURfUlhfRVhQSVJFRCkgfHwgKHBvcnQtPnNtX3J4X3N0YXRlID09IEFEX1JYX0RFRkFVTFRFRCkgfHwgKHBvcnQtPnNtX3J4X3N0YXRlID09IEFEX1JYX0NVUlJFTlQpKSkgeworCQlwb3J0LT5zbV9yeF90aW1lcl9jb3VudGVyID0gMDsgLy8gemVybyB0aW1lcgorCQlwb3J0LT5zbV9yeF9zdGF0ZSA9IEFEX1JYX0NVUlJFTlQ7CisJfSBlbHNlIHsKKwkJLy8gaWYgdGltZXIgaXMgb24sIGFuZCBpZiBpdCBpcyBleHBpcmVkCisJCWlmIChwb3J0LT5zbV9yeF90aW1lcl9jb3VudGVyICYmICEoLS1wb3J0LT5zbV9yeF90aW1lcl9jb3VudGVyKSkgeworCQkJc3dpdGNoIChwb3J0LT5zbV9yeF9zdGF0ZSkgeworCQkJY2FzZSBBRF9SWF9FWFBJUkVEOgorCQkJCXBvcnQtPnNtX3J4X3N0YXRlID0gQURfUlhfREVGQVVMVEVEOwkJLy8gbmV4dCBzdGF0ZQorCQkJCWJyZWFrOworCQkJY2FzZSBBRF9SWF9DVVJSRU5UOgorCQkJCXBvcnQtPnNtX3J4X3N0YXRlID0gQURfUlhfRVhQSVJFRDsJICAgIC8vIG5leHQgc3RhdGUKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6ICAgIC8vdG8gc2lsZW5jZSB0aGUgY29tcGlsZXIKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIGlmIG5vIGxhY3BkdSBhcnJpdmVkIGFuZCBubyB0aW1lciBpcyBvbgorCQkJc3dpdGNoIChwb3J0LT5zbV9yeF9zdGF0ZSkgeworCQkJY2FzZSBBRF9SWF9QT1JUX0RJU0FCTEVEOgorCQkJCWlmIChwb3J0LT5zbV92YXJzICYgQURfUE9SVF9NT1ZFRCkgeworCQkJCQlwb3J0LT5zbV9yeF9zdGF0ZSA9IEFEX1JYX0lOSVRJQUxJWkU7CSAgICAvLyBuZXh0IHN0YXRlCisJCQkJfSBlbHNlIGlmIChwb3J0LT5pc19lbmFibGVkICYmIChwb3J0LT5zbV92YXJzICYgQURfUE9SVF9MQUNQX0VOQUJMRUQpKSB7CisJCQkJCXBvcnQtPnNtX3J4X3N0YXRlID0gQURfUlhfRVhQSVJFRDsJLy8gbmV4dCBzdGF0ZQorCQkJCX0gZWxzZSBpZiAocG9ydC0+aXNfZW5hYmxlZCAmJiAoKHBvcnQtPnNtX3ZhcnMgJiBBRF9QT1JUX0xBQ1BfRU5BQkxFRCkgPT0gMCkpIHsKKwkJCQkJcG9ydC0+c21fcnhfc3RhdGUgPSBBRF9SWF9MQUNQX0RJU0FCTEVEOyAgICAvLyBuZXh0IHN0YXRlCisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDogICAgLy90byBzaWxlbmNlIHRoZSBjb21waWxlcgorCQkJCWJyZWFrOworCisJCQl9CisJCX0KKwl9CisKKwkvLyBjaGVjayBpZiB0aGUgU3RhdGUgbWFjaGluZSB3YXMgY2hhbmdlZCBvciBuZXcgbGFjcGR1IGFycml2ZWQKKwlpZiAoKHBvcnQtPnNtX3J4X3N0YXRlICE9IGxhc3Rfc3RhdGUpIHx8IChsYWNwZHUpKSB7CisJCWRwcmludGsoIlJ4IE1hY2hpbmU6IFBvcnQ9JWQsIExhc3QgU3RhdGU9JWQsIEN1cnIgU3RhdGU9JWRcbiIsIHBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyLCBsYXN0X3N0YXRlLCBwb3J0LT5zbV9yeF9zdGF0ZSk7CisJCXN3aXRjaCAocG9ydC0+c21fcnhfc3RhdGUpIHsKKwkJY2FzZSBBRF9SWF9JTklUSUFMSVpFOgorCQkJaWYgKCEocG9ydC0+YWN0b3Jfb3Blcl9wb3J0X2tleSAmIEFEX0RVUExFWF9LRVlfQklUUykpIHsKKwkJCQlwb3J0LT5zbV92YXJzICY9IH5BRF9QT1JUX0xBQ1BfRU5BQkxFRDsKKwkJCX0gZWxzZSB7CisJCQkJcG9ydC0+c21fdmFycyB8PSBBRF9QT1JUX0xBQ1BfRU5BQkxFRDsKKwkJCX0KKwkJCXBvcnQtPnNtX3ZhcnMgJj0gfkFEX1BPUlRfU0VMRUNURUQ7CisJCQlfX3JlY29yZF9kZWZhdWx0KHBvcnQpOworCQkJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X3N0YXRlICY9IH5BRF9TVEFURV9FWFBJUkVEOworCQkJcG9ydC0+c21fdmFycyAmPSB+QURfUE9SVF9NT1ZFRDsKKwkJCXBvcnQtPnNtX3J4X3N0YXRlID0gQURfUlhfUE9SVF9ESVNBQkxFRDsJLy8gbmV4dCBzdGF0ZQorCisJCQkvKi0gRmFsbCBUaHJvdWdoIC0qLworCisJCWNhc2UgQURfUlhfUE9SVF9ESVNBQkxFRDoKKwkJCXBvcnQtPnNtX3ZhcnMgJj0gfkFEX1BPUlRfTUFUQ0hFRDsKKwkJCWJyZWFrOworCQljYXNlIEFEX1JYX0xBQ1BfRElTQUJMRUQ6CisJCQlwb3J0LT5zbV92YXJzICY9IH5BRF9QT1JUX1NFTEVDVEVEOworCQkJX19yZWNvcmRfZGVmYXVsdChwb3J0KTsKKwkJCXBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X3N0YXRlICY9IH5BRF9TVEFURV9BR0dSRUdBVElPTjsKKwkJCXBvcnQtPnNtX3ZhcnMgfD0gQURfUE9SVF9NQVRDSEVEOworCQkJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X3N0YXRlICY9IH5BRF9TVEFURV9FWFBJUkVEOworCQkJYnJlYWs7CisJCWNhc2UgQURfUlhfRVhQSVJFRDoKKwkJCS8vUmVzZXQgb2YgdGhlIFN5bmNocm9uaXphdGlvbiBmbGFnLiAoU3RhbmRhcmQgNDMuNC4xMikKKwkJCS8vVGhpcyByZXNldCBjYXVzZSB0byBkaXNhYmxlIHRoaXMgcG9ydCBpbiB0aGUgQ09MTEVDVElOR19ESVNUUklCVVRJTkcgc3RhdGUgb2YgdGhlCisJCQkvL211eCBtYWNoaW5lIGluIGNhc2Ugb2YgRVhQSVJFRCBldmVuIGlmIExJTktfRE9XTiBkaWRuJ3QgYXJyaXZlIGZvciB0aGUgcG9ydC4KKwkJCXBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X3N0YXRlICY9IH5BRF9TVEFURV9TWU5DSFJPTklaQVRJT047CisJCQlwb3J0LT5zbV92YXJzICY9IH5BRF9QT1JUX01BVENIRUQ7CisJCQlwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9zdGF0ZSB8PSBBRF9TSE9SVF9USU1FT1VUOworCQkJcG9ydC0+c21fcnhfdGltZXJfY291bnRlciA9IF9fYWRfdGltZXJfdG9fdGlja3MoQURfQ1VSUkVOVF9XSElMRV9USU1FUiwgKHUxNikoQURfU0hPUlRfVElNRU9VVCkpOworCQkJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X3N0YXRlIHw9IEFEX1NUQVRFX0VYUElSRUQ7CisJCQlicmVhazsKKwkJY2FzZSBBRF9SWF9ERUZBVUxURUQ6CisJCQlfX3VwZGF0ZV9kZWZhdWx0X3NlbGVjdGVkKHBvcnQpOworCQkJX19yZWNvcmRfZGVmYXVsdChwb3J0KTsKKwkJCXBvcnQtPnNtX3ZhcnMgfD0gQURfUE9SVF9NQVRDSEVEOworCQkJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X3N0YXRlICY9IH5BRF9TVEFURV9FWFBJUkVEOworCQkJYnJlYWs7CisJCWNhc2UgQURfUlhfQ1VSUkVOVDoKKwkJCS8vIGRldGVjdCBsb29wYmFjayBzaXR1YXRpb24KKwkJCWlmICghTUFDX0FERFJFU1NfQ09NUEFSRSgmKGxhY3BkdS0+YWN0b3Jfc3lzdGVtKSwgJihwb3J0LT5hY3Rvcl9zeXN0ZW0pKSkgeworCQkJCS8vIElORk9fUkVDRUlWRURfTE9PUEJBQ0tfRlJBTUVTCisJCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IEFuIGlsbGVnYWwgbG9vcGJhY2sgb2NjdXJyZWQgb24gYWRhcHRlciAoJXMpXG4iLAorCQkJCQkJcG9ydC0+c2xhdmUtPmRldi0+bmFtZSk7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJDaGVjayB0aGUgY29uZmlndXJhdGlvbiB0byB2ZXJpZnkgdGhhdCBhbGwgQWRhcHRlcnMgIgorCQkJCQkJImFyZSBjb25uZWN0ZWQgdG8gODAyLjNhZCBjb21wbGlhbnQgc3dpdGNoIHBvcnRzXG4iKTsKKwkJCQlfX3JlbGVhc2VfcnhfbWFjaGluZV9sb2NrKHBvcnQpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCV9fdXBkYXRlX3NlbGVjdGVkKGxhY3BkdSwgcG9ydCk7CisJCQlfX3VwZGF0ZV9udHQobGFjcGR1LCBwb3J0KTsKKwkJCV9fcmVjb3JkX3BkdShsYWNwZHUsIHBvcnQpOworCQkJX19jaG9vc2VfbWF0Y2hlZChsYWNwZHUsIHBvcnQpOworCQkJcG9ydC0+c21fcnhfdGltZXJfY291bnRlciA9IF9fYWRfdGltZXJfdG9fdGlja3MoQURfQ1VSUkVOVF9XSElMRV9USU1FUiwgKHUxNikocG9ydC0+YWN0b3Jfb3Blcl9wb3J0X3N0YXRlICYgQURfU1RBVEVfTEFDUF9USU1FT1VUKSk7CisJCQlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgJj0gfkFEX1NUQVRFX0VYUElSRUQ7CisJCQkvLyB2ZXJpZnkgdGhhdCBpZiB0aGUgYWdncmVnYXRvciBpcyBlbmFibGVkLCB0aGUgcG9ydCBpcyBlbmFibGVkIHRvby4KKwkJCS8vKGJlY2F1c2UgaWYgdGhlIGxpbmsgZ29lcyBkb3duIGZvciBhIHNob3J0IHRpbWUsIHRoZSA4MDIuM2FkIHdpbGwgbm90CisJCQkvLyBjYXRjaCBpdCwgYW5kIHRoZSBwb3J0IHdpbGwgY29udGludWUgdG8gYmUgZGlzYWJsZWQpCisJCQlpZiAocG9ydC0+YWdncmVnYXRvciAmJiBwb3J0LT5hZ2dyZWdhdG9yLT5pc19hY3RpdmUgJiYgIV9fcG9ydF9pc19lbmFibGVkKHBvcnQpKSB7CisJCQkJX19lbmFibGVfcG9ydChwb3J0KTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OiAgICAvL3RvIHNpbGVuY2UgdGhlIGNvbXBpbGVyCisJCQlicmVhazsKKwkJfQorCX0KKwlfX3JlbGVhc2VfcnhfbWFjaGluZV9sb2NrKHBvcnQpOworfQorCisvKioKKyAqIGFkX3R4X21hY2hpbmUgLSBoYW5kbGUgYSBwb3J0J3MgdHggc3RhdGUgbWFjaGluZQorICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGFkX3R4X21hY2hpbmUoc3RydWN0IHBvcnQgKnBvcnQpCit7CisJLy8gY2hlY2sgaWYgdHggdGltZXIgZXhwaXJlZCwgdG8gdmVyaWZ5IHRoYXQgd2UgZG8gbm90IHNlbmQgbW9yZSB0aGFuIDMgcGFja2V0cyBwZXIgc2Vjb25kCisJaWYgKHBvcnQtPnNtX3R4X3RpbWVyX2NvdW50ZXIgJiYgISgtLXBvcnQtPnNtX3R4X3RpbWVyX2NvdW50ZXIpKSB7CisJCS8vIGNoZWNrIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0byBzZW5kCisJCWlmIChwb3J0LT5udHQgJiYgKHBvcnQtPnNtX3ZhcnMgJiBBRF9QT1JUX0xBQ1BfRU5BQkxFRCkpIHsKKwkJCV9fdXBkYXRlX2xhY3BkdV9mcm9tX3BvcnQocG9ydCk7CisJCQkvLyBzZW5kIHRoZSBsYWNwZHUKKwkJCWlmIChhZF9sYWNwZHVfc2VuZChwb3J0KSA+PSAwKSB7CisJCQkJZHByaW50aygiU2VudCBMQUNQRFUgb24gcG9ydCAlZFxuIiwgcG9ydC0+YWN0b3JfcG9ydF9udW1iZXIpOworCQkJCS8vIG1hcmsgbnR0IGFzIGZhbHNlLCBzbyBpdCB3aWxsIG5vdCBiZSBzZW50IGFnYWluIHVudGlsIGRlbWFuZGVkCisJCQkJcG9ydC0+bnR0ID0gMDsKKwkJCX0KKwkJfQorCQkvLyByZXN0YXJ0IHR4IHRpbWVyKHRvIHZlcmlmeSB0aGF0IHdlIHdpbGwgbm90IGV4Y2VlZCBBRF9NQVhfVFhfSU5fU0VDT05ECisJCXBvcnQtPnNtX3R4X3RpbWVyX2NvdW50ZXI9YWRfdGlja3NfcGVyX3NlYy9BRF9NQVhfVFhfSU5fU0VDT05EOworCX0KK30KKworLyoqCisgKiBhZF9wZXJpb2RpY19tYWNoaW5lIC0gaGFuZGxlIGEgcG9ydCdzIHBlcmlvZGljIHN0YXRlIG1hY2hpbmUKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICogVHVybiBudHQgZmxhZyBvbiBwcmlvZGljYWxseSB0byBwZXJmb3JtIHBlcmlvZGljIHRyYW5zbWlzc2lvbiBvZiBsYWNwZHUncy4KKyAqLworc3RhdGljIHZvaWQgYWRfcGVyaW9kaWNfbWFjaGluZShzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwlwZXJpb2RpY19zdGF0ZXNfdCBsYXN0X3N0YXRlOworCisJLy8ga2VlcCBjdXJyZW50IHN0YXRlIG1hY2hpbmUgc3RhdGUgdG8gY29tcGFyZSBsYXRlciBpZiBpdCB3YXMgY2hhbmdlZAorCWxhc3Rfc3RhdGUgPSBwb3J0LT5zbV9wZXJpb2RpY19zdGF0ZTsKKworCS8vIGNoZWNrIGlmIHBvcnQgd2FzIHJlaW5pdGlhbGl6ZWQKKwlpZiAoKChwb3J0LT5zbV92YXJzICYgQURfUE9SVF9CRUdJTikgfHwgIShwb3J0LT5zbV92YXJzICYgQURfUE9SVF9MQUNQX0VOQUJMRUQpIHx8ICFwb3J0LT5pc19lbmFibGVkKSB8fAorCSAgICAoIShwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgJiBBRF9TVEFURV9MQUNQX0FDVElWSVRZKSAmJiAhKHBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X3N0YXRlICYgQURfU1RBVEVfTEFDUF9BQ1RJVklUWSkpCisJICAgKSB7CisJCXBvcnQtPnNtX3BlcmlvZGljX3N0YXRlID0gQURfTk9fUEVSSU9ESUM7CSAgICAgLy8gbmV4dCBzdGF0ZQorCX0KKwkvLyBjaGVjayBpZiBzdGF0ZSBtYWNoaW5lIHNob3VsZCBjaGFuZ2Ugc3RhdGUKKwllbHNlIGlmIChwb3J0LT5zbV9wZXJpb2RpY190aW1lcl9jb3VudGVyKSB7CisJCS8vIGNoZWNrIGlmIHBlcmlvZGljIHN0YXRlIG1hY2hpbmUgZXhwaXJlZAorCQlpZiAoISgtLXBvcnQtPnNtX3BlcmlvZGljX3RpbWVyX2NvdW50ZXIpKSB7CisJCQkvLyBpZiBleHBpcmVkIHRoZW4gZG8gdHgKKwkJCXBvcnQtPnNtX3BlcmlvZGljX3N0YXRlID0gQURfUEVSSU9ESUNfVFg7ICAgIC8vIG5leHQgc3RhdGUKKwkJfSBlbHNlIHsKKwkJCS8vIElmIG5vdCBleHBpcmVkLCBjaGVjayBpZiB0aGVyZSBpcyBzb21lIG5ldyB0aW1lb3V0IHBhcmFtZXRlciBmcm9tIHRoZSBwYXJ0bmVyIHN0YXRlCisJCQlzd2l0Y2ggKHBvcnQtPnNtX3BlcmlvZGljX3N0YXRlKSB7CisJCQljYXNlIEFEX0ZBU1RfUEVSSU9ESUM6CisJCQkJaWYgKCEocG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfc3RhdGUgJiBBRF9TVEFURV9MQUNQX1RJTUVPVVQpKSB7CisJCQkJCXBvcnQtPnNtX3BlcmlvZGljX3N0YXRlID0gQURfU0xPV19QRVJJT0RJQzsgIC8vIG5leHQgc3RhdGUKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEFEX1NMT1dfUEVSSU9ESUM6CisJCQkJaWYgKChwb3J0LT5wYXJ0bmVyX29wZXJfcG9ydF9zdGF0ZSAmIEFEX1NUQVRFX0xBQ1BfVElNRU9VVCkpIHsKKwkJCQkJLy8gc3RvcCBjdXJyZW50IHRpbWVyCisJCQkJCXBvcnQtPnNtX3BlcmlvZGljX3RpbWVyX2NvdW50ZXIgPSAwOworCQkJCQlwb3J0LT5zbV9wZXJpb2RpY19zdGF0ZSA9IEFEX1BFUklPRElDX1RYOwkgLy8gbmV4dCBzdGF0ZQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6ICAgIC8vdG8gc2lsZW5jZSB0aGUgY29tcGlsZXIKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAocG9ydC0+c21fcGVyaW9kaWNfc3RhdGUpIHsKKwkJY2FzZSBBRF9OT19QRVJJT0RJQzoKKwkJCXBvcnQtPnNtX3BlcmlvZGljX3N0YXRlID0gQURfRkFTVF9QRVJJT0RJQzsJIC8vIG5leHQgc3RhdGUKKwkJCWJyZWFrOworCQljYXNlIEFEX1BFUklPRElDX1RYOgorCQkJaWYgKCEocG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfc3RhdGUgJiBBRF9TVEFURV9MQUNQX1RJTUVPVVQpKSB7CisJCQkJcG9ydC0+c21fcGVyaW9kaWNfc3RhdGUgPSBBRF9TTE9XX1BFUklPRElDOyAgLy8gbmV4dCBzdGF0ZQorCQkJfSBlbHNlIHsKKwkJCQlwb3J0LT5zbV9wZXJpb2RpY19zdGF0ZSA9IEFEX0ZBU1RfUEVSSU9ESUM7ICAvLyBuZXh0IHN0YXRlCisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDogICAgLy90byBzaWxlbmNlIHRoZSBjb21waWxlcgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBjaGVjayBpZiB0aGUgc3RhdGUgbWFjaGluZSB3YXMgY2hhbmdlZAorCWlmIChwb3J0LT5zbV9wZXJpb2RpY19zdGF0ZSAhPSBsYXN0X3N0YXRlKSB7CisJCWRwcmludGsoIlBlcmlvZGljIE1hY2hpbmU6IFBvcnQ9JWQsIExhc3QgU3RhdGU9JWQsIEN1cnIgU3RhdGU9JWRcbiIsIHBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyLCBsYXN0X3N0YXRlLCBwb3J0LT5zbV9wZXJpb2RpY19zdGF0ZSk7CisJCXN3aXRjaCAocG9ydC0+c21fcGVyaW9kaWNfc3RhdGUpIHsKKwkJY2FzZSBBRF9OT19QRVJJT0RJQzoKKwkJCXBvcnQtPnNtX3BlcmlvZGljX3RpbWVyX2NvdW50ZXIgPSAwOwkgICAvLyB6ZXJvIHRpbWVyCisJCQlicmVhazsKKwkJY2FzZSBBRF9GQVNUX1BFUklPRElDOgorCQkJcG9ydC0+c21fcGVyaW9kaWNfdGltZXJfY291bnRlciA9IF9fYWRfdGltZXJfdG9fdGlja3MoQURfUEVSSU9ESUNfVElNRVIsICh1MTYpKEFEX0ZBU1RfUEVSSU9ESUNfVElNRSkpLTE7IC8vIGRlY3JlbWVudCAxIHRpY2sgd2UgbG9zdCBpbiB0aGUgUEVSSU9ESUNfVFggY3ljbGUKKwkJCWJyZWFrOworCQljYXNlIEFEX1NMT1dfUEVSSU9ESUM6CisJCQlwb3J0LT5zbV9wZXJpb2RpY190aW1lcl9jb3VudGVyID0gX19hZF90aW1lcl90b190aWNrcyhBRF9QRVJJT0RJQ19USU1FUiwgKHUxNikoQURfU0xPV19QRVJJT0RJQ19USU1FKSktMTsgLy8gZGVjcmVtZW50IDEgdGljayB3ZSBsb3N0IGluIHRoZSBQRVJJT0RJQ19UWCBjeWNsZQorCQkJYnJlYWs7CisJCWNhc2UgQURfUEVSSU9ESUNfVFg6CisJCQlwb3J0LT5udHQgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6ICAgIC8vdG8gc2lsZW5jZSB0aGUgY29tcGlsZXIKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKioKKyAqIGFkX3BvcnRfc2VsZWN0aW9uX2xvZ2ljIC0gc2VsZWN0IGFnZ3JlZ2F0aW9uIGdyb3VwcworICogQHBvcnQ6IHRoZSBwb3J0IHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKiBTZWxlY3QgYWdncmVnYXRpb24gZ3JvdXBzLCBhbmQgYXNzaWduIGVhY2ggcG9ydCBmb3IgaXQncyBhZ2dyZWdldG9yLiBUaGUKKyAqIHNlbGVjdGlvbiBsb2dpYyBpcyBjYWxsZWQgaW4gdGhlIGluaXRpdGFsaXphdGlvbiAoYWZ0ZXIgYWxsIHRoZSBoYW5kc2hrZXMpLAorICogYW5kIGFmdGVyIGV2ZXJ5IGxhY3BkdSByZWNlaXZlIChpZiBzZWxlY3RlZCBpcyBvZmYpLgorICovCitzdGF0aWMgdm9pZCBhZF9wb3J0X3NlbGVjdGlvbl9sb2dpYyhzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgYWdncmVnYXRvciAqYWdncmVnYXRvciwgKmZyZWVfYWdncmVnYXRvciA9IE5VTEwsICp0ZW1wX2FnZ3JlZ2F0b3I7CisJc3RydWN0IHBvcnQgKmxhc3RfcG9ydCA9IE5VTEwsICpjdXJyX3BvcnQ7CisJaW50IGZvdW5kID0gMDsKKworCS8vIGlmIHRoZSBwb3J0IGlzIGFscmVhZHkgU2VsZWN0ZWQsIGRvIG5vdGhpbmcKKwlpZiAocG9ydC0+c21fdmFycyAmIEFEX1BPUlRfU0VMRUNURUQpIHsKKwkJcmV0dXJuOworCX0KKworCS8vIGlmIHRoZSBwb3J0IGlzIGNvbm5lY3RlZCB0byBvdGhlciBhZ2dyZWdhdG9yLCBkZXRhY2ggaXQKKwlpZiAocG9ydC0+YWdncmVnYXRvcikgeworCQkvLyBkZXRhY2ggdGhlIHBvcnQgZnJvbSBpdHMgZm9ybWVyIGFnZ3JlZ2F0b3IKKwkJdGVtcF9hZ2dyZWdhdG9yPXBvcnQtPmFnZ3JlZ2F0b3I7CisJCWZvciAoY3Vycl9wb3J0PXRlbXBfYWdncmVnYXRvci0+bGFnX3BvcnRzOyBjdXJyX3BvcnQ7IGxhc3RfcG9ydD1jdXJyX3BvcnQsIGN1cnJfcG9ydD1jdXJyX3BvcnQtPm5leHRfcG9ydF9pbl9hZ2dyZWdhdG9yKSB7CisJCQlpZiAoY3Vycl9wb3J0ID09IHBvcnQpIHsKKwkJCQl0ZW1wX2FnZ3JlZ2F0b3ItPm51bV9vZl9wb3J0cy0tOworCQkJCWlmICghbGFzdF9wb3J0KSB7Ly8gaWYgaXQgaXMgdGhlIGZpcnN0IHBvcnQgYXR0YWNoZWQgdG8gdGhlIGFnZ3JlZ2F0b3IKKwkJCQkJdGVtcF9hZ2dyZWdhdG9yLT5sYWdfcG9ydHM9cG9ydC0+bmV4dF9wb3J0X2luX2FnZ3JlZ2F0b3I7CisJCQkJfSBlbHNlIHsvLyBub3QgdGhlIGZpcnN0IHBvcnQgYXR0YWNoZWQgdG8gdGhlIGFnZ3JlZ2F0b3IKKwkJCQkJbGFzdF9wb3J0LT5uZXh0X3BvcnRfaW5fYWdncmVnYXRvcj1wb3J0LT5uZXh0X3BvcnRfaW5fYWdncmVnYXRvcjsKKwkJCQl9CisKKwkJCQkvLyBjbGVhciB0aGUgcG9ydCdzIHJlbGF0aW9ucyB0byB0aGlzIGFnZ3JlZ2F0b3IKKwkJCQlwb3J0LT5hZ2dyZWdhdG9yID0gTlVMTDsKKwkJCQlwb3J0LT5uZXh0X3BvcnRfaW5fYWdncmVnYXRvcj1OVUxMOworCQkJCXBvcnQtPmFjdG9yX3BvcnRfYWdncmVnYXRvcl9pZGVudGlmaWVyPTA7CisKKwkJCQlkcHJpbnRrKCJQb3J0ICVkIGxlZnQgTEFHICVkXG4iLCBwb3J0LT5hY3Rvcl9wb3J0X251bWJlciwgdGVtcF9hZ2dyZWdhdG9yLT5hZ2dyZWdhdG9yX2lkZW50aWZpZXIpOworCQkJCS8vIGlmIHRoZSBhZ2dyZWdhdG9yIGlzIGVtcHR5LCBjbGVhciBpdHMgcGFyYW1ldGVycywgYW5kIHNldCBpdCByZWFkeSB0byBiZSBhdHRhY2hlZAorCQkJCWlmICghdGVtcF9hZ2dyZWdhdG9yLT5sYWdfcG9ydHMpIHsKKwkJCQkJYWRfY2xlYXJfYWdnKHRlbXBfYWdncmVnYXRvcik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghY3Vycl9wb3J0KSB7IC8vIG1lYW5pbmc6IHRoZSBwb3J0IHdhcyByZWxhdGVkIHRvIGFuIGFnZ3JlZ2F0b3IgYnV0IHdhcyBub3Qgb24gdGhlIGFnZ3JlZ2F0b3IgcG9ydCBsaXN0CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6IFdhcm5pbmc6IFBvcnQgJWQgKG9uICVzKSB3YXMgIgorCQkJICAgICAgICJyZWxhdGVkIHRvIGFnZ3JlZ2F0b3IgJWQgYnV0IHdhcyBub3Qgb24gaXRzIHBvcnQgbGlzdFxuIiwKKwkJCSAgICAgICBwb3J0LT5hY3Rvcl9wb3J0X251bWJlciwgcG9ydC0+c2xhdmUtPmRldi0+bmFtZSwKKwkJCSAgICAgICBwb3J0LT5hZ2dyZWdhdG9yLT5hZ2dyZWdhdG9yX2lkZW50aWZpZXIpOworCQl9CisJfQorCS8vIHNlYXJjaCBvbiBhbGwgYWdncmVnYXRvcnMgZm9yIGEgc3VpdGFibGUgYWdncmVnYXRvciBmb3IgdGhpcyBwb3J0CisJZm9yIChhZ2dyZWdhdG9yID0gX19nZXRfZmlyc3RfYWdnKHBvcnQpOyBhZ2dyZWdhdG9yOworCSAgICAgYWdncmVnYXRvciA9IF9fZ2V0X25leHRfYWdnKGFnZ3JlZ2F0b3IpKSB7CisKKwkJLy8ga2VlcCBhIGZyZWUgYWdncmVnYXRvciBmb3IgbGF0ZXIgdXNlKGlmIG5lZWRlZCkKKwkJaWYgKCFhZ2dyZWdhdG9yLT5sYWdfcG9ydHMpIHsKKwkJCWlmICghZnJlZV9hZ2dyZWdhdG9yKSB7CisJCQkJZnJlZV9hZ2dyZWdhdG9yPWFnZ3JlZ2F0b3I7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQkvLyBjaGVjayBpZiBjdXJyZW50IGFnZ3JlZ2F0b3Igc3VpdHMgdXMKKwkJaWYgKCgoYWdncmVnYXRvci0+YWN0b3Jfb3Blcl9hZ2dyZWdhdG9yX2tleSA9PSBwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfa2V5KSAmJiAvLyBpZiBhbGwgcGFyYW1ldGVycyBtYXRjaCBBTkQKKwkJICAgICAhTUFDX0FERFJFU1NfQ09NUEFSRSgmKGFnZ3JlZ2F0b3ItPnBhcnRuZXJfc3lzdGVtKSwgJihwb3J0LT5wYXJ0bmVyX29wZXJfc3lzdGVtKSkgJiYKKwkJICAgICAoYWdncmVnYXRvci0+cGFydG5lcl9zeXN0ZW1fcHJpb3JpdHkgPT0gcG9ydC0+cGFydG5lcl9vcGVyX3N5c3RlbV9wcmlvcml0eSkgJiYKKwkJICAgICAoYWdncmVnYXRvci0+cGFydG5lcl9vcGVyX2FnZ3JlZ2F0b3Jfa2V5ID09IHBvcnQtPnBhcnRuZXJfb3Blcl9rZXkpCisJCSAgICApICYmCisJCSAgICAoKE1BQ19BRERSRVNTX0NPTVBBUkUoJihwb3J0LT5wYXJ0bmVyX29wZXJfc3lzdGVtKSwgJihudWxsX21hY19hZGRyKSkgJiYgLy8gcGFydG5lciBhbnN3ZXJzCisJCSAgICAgICFhZ2dyZWdhdG9yLT5pc19pbmRpdmlkdWFsKSAgLy8gYnV0IGlzIG5vdCBpbmRpdmlkdWFsIE9SCisJCSAgICApCisJCSAgICkgeworCQkJLy8gYXR0YWNoIHRvIHRoZSBmb3VuZGVkIGFnZ3JlZ2F0b3IKKwkJCXBvcnQtPmFnZ3JlZ2F0b3IgPSBhZ2dyZWdhdG9yOworCQkJcG9ydC0+YWN0b3JfcG9ydF9hZ2dyZWdhdG9yX2lkZW50aWZpZXI9cG9ydC0+YWdncmVnYXRvci0+YWdncmVnYXRvcl9pZGVudGlmaWVyOworCQkJcG9ydC0+bmV4dF9wb3J0X2luX2FnZ3JlZ2F0b3I9YWdncmVnYXRvci0+bGFnX3BvcnRzOworCQkJcG9ydC0+YWdncmVnYXRvci0+bnVtX29mX3BvcnRzKys7CisJCQlhZ2dyZWdhdG9yLT5sYWdfcG9ydHM9cG9ydDsKKwkJCWRwcmludGsoIlBvcnQgJWQgam9pbmVkIExBRyAlZChleGlzdGluZyBMQUcpXG4iLCBwb3J0LT5hY3Rvcl9wb3J0X251bWJlciwgcG9ydC0+YWdncmVnYXRvci0+YWdncmVnYXRvcl9pZGVudGlmaWVyKTsKKworCQkJLy8gbWFyayB0aGlzIHBvcnQgYXMgc2VsZWN0ZWQKKwkJCXBvcnQtPnNtX3ZhcnMgfD0gQURfUE9SVF9TRUxFQ1RFRDsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLy8gdGhlIHBvcnQgY291bGRuJ3QgZmluZCBhbiBhZ2dyZWdhdG9yIC0gYXR0YWNoIGl0IHRvIGEgbmV3IGFnZ3JlZ2F0b3IKKwlpZiAoIWZvdW5kKSB7CisJCWlmIChmcmVlX2FnZ3JlZ2F0b3IpIHsKKwkJCS8vIGFzc2lnbiBwb3J0IGEgbmV3IGFnZ3JlZ2F0b3IKKwkJCXBvcnQtPmFnZ3JlZ2F0b3IgPSBmcmVlX2FnZ3JlZ2F0b3I7CisJCQlwb3J0LT5hY3Rvcl9wb3J0X2FnZ3JlZ2F0b3JfaWRlbnRpZmllcj1wb3J0LT5hZ2dyZWdhdG9yLT5hZ2dyZWdhdG9yX2lkZW50aWZpZXI7CisKKwkJCS8vIHVwZGF0ZSB0aGUgbmV3IGFnZ3JlZ2F0b3IncyBwYXJhbWV0ZXJzCisJCQkvLyBpZiBwb3J0IHdhcyByZXNwb25zZWQgZnJvbSB0aGUgZW5kLXVzZXIKKwkJCWlmIChwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfa2V5ICYgQURfRFVQTEVYX0tFWV9CSVRTKSB7Ly8gaWYgcG9ydCBpcyBmdWxsIGR1cGxleAorCQkJCXBvcnQtPmFnZ3JlZ2F0b3ItPmlzX2luZGl2aWR1YWwgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlwb3J0LT5hZ2dyZWdhdG9yLT5pc19pbmRpdmlkdWFsID0gMTsKKwkJCX0KKworCQkJcG9ydC0+YWdncmVnYXRvci0+YWN0b3JfYWRtaW5fYWdncmVnYXRvcl9rZXkgPSBwb3J0LT5hY3Rvcl9hZG1pbl9wb3J0X2tleTsKKwkJCXBvcnQtPmFnZ3JlZ2F0b3ItPmFjdG9yX29wZXJfYWdncmVnYXRvcl9rZXkgPSBwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfa2V5OworCQkJcG9ydC0+YWdncmVnYXRvci0+cGFydG5lcl9zeXN0ZW09cG9ydC0+cGFydG5lcl9vcGVyX3N5c3RlbTsKKwkJCXBvcnQtPmFnZ3JlZ2F0b3ItPnBhcnRuZXJfc3lzdGVtX3ByaW9yaXR5ID0gcG9ydC0+cGFydG5lcl9vcGVyX3N5c3RlbV9wcmlvcml0eTsKKwkJCXBvcnQtPmFnZ3JlZ2F0b3ItPnBhcnRuZXJfb3Blcl9hZ2dyZWdhdG9yX2tleSA9IHBvcnQtPnBhcnRuZXJfb3Blcl9rZXk7CisJCQlwb3J0LT5hZ2dyZWdhdG9yLT5yZWNlaXZlX3N0YXRlID0gMTsKKwkJCXBvcnQtPmFnZ3JlZ2F0b3ItPnRyYW5zbWl0X3N0YXRlID0gMTsKKwkJCXBvcnQtPmFnZ3JlZ2F0b3ItPmxhZ19wb3J0cyA9IHBvcnQ7CisJCQlwb3J0LT5hZ2dyZWdhdG9yLT5udW1fb2ZfcG9ydHMrKzsKKworCQkJLy8gbWFyayB0aGlzIHBvcnQgYXMgc2VsZWN0ZWQKKwkJCXBvcnQtPnNtX3ZhcnMgfD0gQURfUE9SVF9TRUxFQ1RFRDsKKworCQkJZHByaW50aygiUG9ydCAlZCBqb2luZWQgTEFHICVkKG5ldyBMQUcpXG4iLCBwb3J0LT5hY3Rvcl9wb3J0X251bWJlciwgcG9ydC0+YWdncmVnYXRvci0+YWdncmVnYXRvcl9pZGVudGlmaWVyKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiBQb3J0ICVkIChvbiAlcykgZGlkIG5vdCBmaW5kIGEgc3VpdGFibGUgYWdncmVnYXRvclxuIiwKKwkJCSAgICAgICBwb3J0LT5hY3Rvcl9wb3J0X251bWJlciwgcG9ydC0+c2xhdmUtPmRldi0+bmFtZSk7CisJCX0KKwl9CisJLy8gaWYgYWxsIGFnZ3JlZ2F0b3IncyBwb3J0cyBhcmUgUkVBRFlfTiA9PSBUUlVFLCBzZXQgcmVhZHk9VFJVRSBpbiBhbGwgYWdncmVnYXRvcidzIHBvcnRzCisJLy8gZWxzZSBzZXQgcmVhZHk9RkFMU0UgaW4gYWxsIGFnZ3JlZ2F0b3IncyBwb3J0cworCV9fc2V0X2FnZ19wb3J0c19yZWFkeShwb3J0LT5hZ2dyZWdhdG9yLCBfX2FnZ19wb3J0c19hcmVfcmVhZHkocG9ydC0+YWdncmVnYXRvcikpOworCisJaWYgKCFfX2NoZWNrX2FnZ19zZWxlY3Rpb25fdGltZXIocG9ydCkgJiYgKGFnZ3JlZ2F0b3IgPSBfX2dldF9maXJzdF9hZ2cocG9ydCkpKSB7CisJCWFkX2FnZ19zZWxlY3Rpb25fbG9naWMoYWdncmVnYXRvcik7CisJfQorfQorCisvKioKKyAqIGFkX2FnZ19zZWxlY3Rpb25fbG9naWMgLSBzZWxlY3QgYW4gYWdncmVnYXRpb24gZ3JvdXAgZm9yIGEgdGVhbQorICogQGFnZ3JlZ2F0b3I6IHRoZSBhZ2dyZWdhdG9yIHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKiBJdCBpcyBhc3N1bWVkIHRoYXQgb25seSBvbmUgYWdncmVnYXRvciBtYXkgYmUgc2VsZWN0ZWQgZm9yIGEgdGVhbS4KKyAqIFRoZSBsb2dpYyBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIHNlbGVjdCAoYXQgZmlyc3QgdGltZSkgdGhlIGFnZ3JlZ2F0b3Igd2l0aAorICogdGhlIG1vc3QgcG9ydHMgYXR0YWNoZWQgdG8gaXQsIGFuZCB0byByZXNlbGVjdCB0aGUgYWN0aXZlIGFnZ3JlZ2F0b3Igb25seSBpZgorICogdGhlIHByZXZpb3VzIGFnZ3JlZ2F0b3IgaGFzIG5vIG1vcmUgcG9ydHMgcmVsYXRlZCB0byBpdC4KKyAqCisgKiBGSVhNRTogdGhpcyBmdW5jdGlvbiBNVVNUIGJlIGNhbGxlZCB3aXRoIHRoZSBmaXJzdCBhZ2cgaW4gdGhlIGJvbmQsIG9yCisgKiBfX2dldF9hY3RpdmVfYWdnKCkgd29uJ3Qgd29yayBjb3JyZWN0bHkuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGJldHRlcgorICogY2FsbGVkIHdpdGggdGhlIGJvbmQgaXRzZWxmLCBhbmQgcmV0cmlldmUgdGhlIGZpcnN0IGFnZyBmcm9tIGl0LgorICovCitzdGF0aWMgdm9pZCBhZF9hZ2dfc2VsZWN0aW9uX2xvZ2ljKHN0cnVjdCBhZ2dyZWdhdG9yICphZ2dyZWdhdG9yKQoreworCXN0cnVjdCBhZ2dyZWdhdG9yICpiZXN0X2FnZ3JlZ2F0b3IgPSBOVUxMLCAqYWN0aXZlX2FnZ3JlZ2F0b3IgPSBOVUxMOworCXN0cnVjdCBhZ2dyZWdhdG9yICpsYXN0X2FjdGl2ZV9hZ2dyZWdhdG9yID0gTlVMTCwgKm9yaWdpbl9hZ2dyZWdhdG9yOworCXN0cnVjdCBwb3J0ICpwb3J0OworCXUxNiBudW1fb2ZfYWdncz0wOworCisJb3JpZ2luX2FnZ3JlZ2F0b3IgPSBhZ2dyZWdhdG9yOworCisJLy9nZXQgY3VycmVudCBhY3RpdmUgYWdncmVnYXRvcgorCWxhc3RfYWN0aXZlX2FnZ3JlZ2F0b3IgPSBfX2dldF9hY3RpdmVfYWdnKGFnZ3JlZ2F0b3IpOworCisJLy8gc2VhcmNoIGZvciB0aGUgYWdncmVnYXRvciB3aXRoIHRoZSBtb3N0IHBvcnRzIGF0dGFjaGVkIHRvIGl0LgorCWRvIHsKKwkJLy8gY291bnQgaG93IG1hbnkgY2FuZGlkYXRlIGxhZydzIHdlIGhhdmUKKwkJaWYgKGFnZ3JlZ2F0b3ItPmxhZ19wb3J0cykgeworCQkJbnVtX29mX2FnZ3MrKzsKKwkJfQorCQlpZiAoYWdncmVnYXRvci0+aXNfYWN0aXZlICYmICFhZ2dyZWdhdG9yLT5pc19pbmRpdmlkdWFsICYmICAgLy8gaWYgY3VycmVudCBhZ2dyZWdhdG9yIGlzIHRoZSBhY3RpdmUgYWdncmVnYXRvcgorCQkgICAgTUFDX0FERFJFU1NfQ09NUEFSRSgmKGFnZ3JlZ2F0b3ItPnBhcnRuZXJfc3lzdGVtKSwgJihudWxsX21hY19hZGRyKSkpIHsgICAvLyBhbmQgcGFydG5lciBhbnN3ZXJzIHRvIDgwMi4zYWQgUERVcworCQkJaWYgKGFnZ3JlZ2F0b3ItPm51bV9vZl9wb3J0cykgewkvLyBpZiBhbnkgcG9ydHMgYXR0YWNoZWQgdG8gdGhlIGN1cnJlbnQgYWdncmVnYXRvcgorCQkJCWJlc3RfYWdncmVnYXRvcj1OVUxMOwkgLy8gZGlzcmVnYXJkIHRoZSBiZXN0IGFnZ3JlZ2F0b3IgdGhhdCB3YXMgY2hvc2VuIGJ5IG5vdworCQkJCWJyZWFrOwkJIC8vIHN0b3AgdGhlIHNlbGVjdGlvbiBvZiBvdGhlciBhZ2dyZWdhdG9yIGlmIHRoZXJlIGFyZSBhbnkgcG9ydHMgYXR0YWNoZWQgdG8gdGhpcyBhY3RpdmUgYWdncmVnYXRvcgorCQkJfSBlbHNlIHsgLy8gbm8gcG9ydHMgYXR0YWNoZWQgdG8gdGhpcyBhY3RpdmUgYWdncmVnYXRvcgorCQkJCWFnZ3JlZ2F0b3ItPmlzX2FjdGl2ZSA9IDA7IC8vIG1hcmsgdGhpcyBhZ2dyZWdhdG9yIGFzIG5vdCBhY3RpdmUgYW55bW9yZQorCQkJfQorCQl9CisJCWlmIChhZ2dyZWdhdG9yLT5udW1fb2ZfcG9ydHMpIHsJLy8gaWYgYW55IHBvcnRzIGF0dGFjaGVkCisJCQlpZiAoYmVzdF9hZ2dyZWdhdG9yKSB7CS8vIGlmIHRoZXJlIGlzIGEgY2FuZGlkdGUgYWdncmVnYXRvcgorCQkJCS8vVGhlIHJlYXNvbnMgZm9yIGNob29zaW5nIG5ldyBiZXN0IGFnZ3JlZ2F0b3I6CisJCQkJLy8gMS4gaWYgY3VycmVudCBhZ2cgaXMgTk9UIGluZGl2aWR1YWwgYW5kIHRoZSBiZXN0IGFnZyBjaG9zZW4gc28gZmFyIGlzIGluZGl2aWR1YWwgT1IKKwkJCQkvLyBjdXJyZW50IGFuZCBiZXN0IGFnZ3MgYXJlIGJvdGggaW5kaXZpZHVhbCBvciBib3RoIG5vdCBpbmRpdmlkdWFsLCBBTkQKKwkJCQkvLyAyYS4gIGN1cnJlbnQgYWdnIHBhcnRuZXIgcmVwbHkgYnV0IGJlc3QgYWdnIHBhcnRuZXIgZG8gbm90IHJlcGx5IE9SCisJCQkJLy8gMmIuICBjdXJyZW50IGFnZyBwYXJ0bmVyIHJlcGx5IE9SIGN1cnJlbnQgYWdnIHBhcnRuZXIgZG8gbm90IHJlcGx5IEFORCBiZXN0IGFnZyBwYXJ0bmVyIGFsc28gZG8gbm90IHJlcGx5IEFORAorCQkJCS8vICAgICAgY3VycmVudCBoYXMgbW9yZSBwb3J0cy9iYW5kd2lkdGgsIG9yIHNhbWUgYW1vdW50IG9mIHBvcnRzIGJ1dCBjdXJyZW50IGhhcyBmYXN0ZXIgcG9ydHMsIFRIRU4KKwkJCQkvLyAgICAgIGN1cnJlbnQgYWdnIGJlY29tZSBiZXN0IGFnZyBzbyBmYXIKKworCQkJCS8vaWYgY3VycmVudCBhZ2cgaXMgTk9UIGluZGl2aWR1YWwgYW5kIHRoZSBiZXN0IGFnZyBjaG9zZW4gc28gZmFyIGlzIGluZGl2aWR1YWwgY2hhbmdlIGJlc3RfYWdncmVnYXRvcgorCQkJCWlmICghYWdncmVnYXRvci0+aXNfaW5kaXZpZHVhbCAmJiBiZXN0X2FnZ3JlZ2F0b3ItPmlzX2luZGl2aWR1YWwpIHsKKwkJCQkJYmVzdF9hZ2dyZWdhdG9yPWFnZ3JlZ2F0b3I7CisJCQkJfQorCQkJCS8vIGN1cnJlbnQgYW5kIGJlc3QgYWdncyBhcmUgYm90aCBpbmRpdmlkdWFsIG9yIGJvdGggbm90IGluZGl2aWR1YWwKKwkJCQllbHNlIGlmICgoYWdncmVnYXRvci0+aXNfaW5kaXZpZHVhbCAmJiBiZXN0X2FnZ3JlZ2F0b3ItPmlzX2luZGl2aWR1YWwpIHx8CisJCQkJCSAoIWFnZ3JlZ2F0b3ItPmlzX2luZGl2aWR1YWwgJiYgIWJlc3RfYWdncmVnYXRvci0+aXNfaW5kaXZpZHVhbCkpIHsKKwkJCQkJLy8gIGN1cnJlbnQgYW5kIGJlc3QgYWdncyBhcmUgYm90aCBpbmRpdmlkdWFsIG9yIGJvdGggbm90IGluZGl2aWR1YWwgQU5ECisJCQkJCS8vICBjdXJyZW50IGFnZyBwYXJ0bmVyIHJlcGx5IGJ1dCBiZXN0IGFnZyBwYXJ0bmVyIGRvIG5vdCByZXBseQorCQkJCQlpZiAoKE1BQ19BRERSRVNTX0NPTVBBUkUoJihhZ2dyZWdhdG9yLT5wYXJ0bmVyX3N5c3RlbSksICYobnVsbF9tYWNfYWRkcikpICYmCisJCQkJCSAgICAgIU1BQ19BRERSRVNTX0NPTVBBUkUoJihiZXN0X2FnZ3JlZ2F0b3ItPnBhcnRuZXJfc3lzdGVtKSwgJihudWxsX21hY19hZGRyKSkpKSB7CisJCQkJCQliZXN0X2FnZ3JlZ2F0b3I9YWdncmVnYXRvcjsKKwkJCQkJfQorCQkJCQkvLyAgY3VycmVudCBhZ2cgcGFydG5lciByZXBseSBPUiBjdXJyZW50IGFnZyBwYXJ0bmVyIGRvIG5vdCByZXBseSBBTkQgYmVzdCBhZ2cgcGFydG5lciBhbHNvIGRvIG5vdCByZXBseQorCQkJCQllbHNlIGlmICghICghTUFDX0FERFJFU1NfQ09NUEFSRSgmKGFnZ3JlZ2F0b3ItPnBhcnRuZXJfc3lzdGVtKSwgJihudWxsX21hY19hZGRyKSkgJiYKKwkJCQkJCSAgICBNQUNfQUREUkVTU19DT01QQVJFKCYoYmVzdF9hZ2dyZWdhdG9yLT5wYXJ0bmVyX3N5c3RlbSksICYobnVsbF9tYWNfYWRkcikpKSkgeworCQkJCQkJaWYgKChfX2dldF9hZ2dfc2VsZWN0aW9uX21vZGUoYWdncmVnYXRvci0+bGFnX3BvcnRzKSA9PSBBRF9CQU5EV0lEVEgpJiYKKwkJCQkJCSAgICAoX19nZXRfYWdnX2JhbmR3aWR0aChhZ2dyZWdhdG9yKSA+IF9fZ2V0X2FnZ19iYW5kd2lkdGgoYmVzdF9hZ2dyZWdhdG9yKSkpIHsKKwkJCQkJCQliZXN0X2FnZ3JlZ2F0b3I9YWdncmVnYXRvcjsKKwkJCQkJCX0gZWxzZSBpZiAoX19nZXRfYWdnX3NlbGVjdGlvbl9tb2RlKGFnZ3JlZ2F0b3ItPmxhZ19wb3J0cykgPT0gQURfQ09VTlQpIHsKKwkJCQkJCQlpZiAoKChhZ2dyZWdhdG9yLT5udW1fb2ZfcG9ydHMgPiBiZXN0X2FnZ3JlZ2F0b3ItPm51bV9vZl9wb3J0cykgJiYKKwkJCQkJCQkgICAgIChhZ2dyZWdhdG9yLT5hY3Rvcl9vcGVyX2FnZ3JlZ2F0b3Jfa2V5ICYgQURfU1BFRURfS0VZX0JJVFMpKXx8CisJCQkJCQkJICAgICgoYWdncmVnYXRvci0+bnVtX29mX3BvcnRzID09IGJlc3RfYWdncmVnYXRvci0+bnVtX29mX3BvcnRzKSAmJgorCQkJCQkJCSAgICAgKCh1MTYpKGFnZ3JlZ2F0b3ItPmFjdG9yX29wZXJfYWdncmVnYXRvcl9rZXkgJiBBRF9TUEVFRF9LRVlfQklUUykgPgorCQkJCQkJCSAgICAgICh1MTYpKGJlc3RfYWdncmVnYXRvci0+YWN0b3Jfb3Blcl9hZ2dyZWdhdG9yX2tleSAmIEFEX1NQRUVEX0tFWV9CSVRTKSkpKSB7CisJCQkJCQkJCWJlc3RfYWdncmVnYXRvcj1hZ2dyZWdhdG9yOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJYmVzdF9hZ2dyZWdhdG9yPWFnZ3JlZ2F0b3I7CisJCQl9CisJCX0KKwkJYWdncmVnYXRvci0+aXNfYWN0aXZlID0gMDsgLy8gbWFyayBhbGwgYWdncmVnYXRvcnMgYXMgbm90IGFjdGl2ZSBhbnltb3JlCisJfSB3aGlsZSAoKGFnZ3JlZ2F0b3IgPSBfX2dldF9uZXh0X2FnZyhhZ2dyZWdhdG9yKSkpOworCisJLy8gaWYgd2UgaGF2ZSBuZXcgYWdncmVnYXRvciBzZWxlY3RlZCwgZG9uJ3QgcmVwbGFjZSB0aGUgb2xkIGFnZ3JlZ2F0b3IgaWYgaXQgaGFzIGFuIGFuc3dlcmluZyBwYXJ0bmVyLAorCS8vIG9yIGlmIGJvdGggb2xkIGFnZ3JlZ2F0b3IgYW5kIG5ldyBhZ2dyZWdhdG9yIGRvbid0IGhhdmUgYW5zd2VyaW5nIHBhcnRuZXIKKwlpZiAoYmVzdF9hZ2dyZWdhdG9yKSB7CisJCWlmIChsYXN0X2FjdGl2ZV9hZ2dyZWdhdG9yICYmIGxhc3RfYWN0aXZlX2FnZ3JlZ2F0b3ItPmxhZ19wb3J0cyAmJiBsYXN0X2FjdGl2ZV9hZ2dyZWdhdG9yLT5sYWdfcG9ydHMtPmlzX2VuYWJsZWQgJiYKKwkJICAgIChNQUNfQUREUkVTU19DT01QQVJFKCYobGFzdF9hY3RpdmVfYWdncmVnYXRvci0+cGFydG5lcl9zeXN0ZW0pLCAmKG51bGxfbWFjX2FkZHIpKSB8fCAgIC8vIHBhcnRuZXIgYW5zd2VycyBPUgorCQkgICAgICghTUFDX0FERFJFU1NfQ09NUEFSRSgmKGxhc3RfYWN0aXZlX2FnZ3JlZ2F0b3ItPnBhcnRuZXJfc3lzdGVtKSwgJihudWxsX21hY19hZGRyKSkgJiYJLy8gYm90aCBvbGQgYW5kIG5ldworCQkgICAgICAhTUFDX0FERFJFU1NfQ09NUEFSRSgmKGJlc3RfYWdncmVnYXRvci0+cGFydG5lcl9zeXN0ZW0pLCAmKG51bGxfbWFjX2FkZHIpKSkpICAgICAvLyBwYXJ0bmVyIGRvIG5vdCBhbnN3ZXIKKwkJICAgKSB7CisJCQkvLyBpZiBuZXcgYWdncmVnYXRvciBoYXMgbGluaywgYW5kIG9sZCBhZ2dyZWdhdG9yIGRvZXMgbm90LCByZXBsYWNlIG9sZCBhZ2dyZWdhdG9yLihkbyBub3RoaW5nKQorCQkJLy8gLT4gZG9uJ3QgcmVwbGFjZSBvdGhlcndpc2UuCisJCQlpZiAoISghbGFzdF9hY3RpdmVfYWdncmVnYXRvci0+YWN0b3Jfb3Blcl9hZ2dyZWdhdG9yX2tleSAmJiBiZXN0X2FnZ3JlZ2F0b3ItPmFjdG9yX29wZXJfYWdncmVnYXRvcl9rZXkpKSB7CisJCQkJYmVzdF9hZ2dyZWdhdG9yPU5VTEw7CisJCQkJbGFzdF9hY3RpdmVfYWdncmVnYXRvci0+aXNfYWN0aXZlID0gMTsgLy8gZG9uJ3QgcmVwbGFjZSBnb29kIG9sZCBhZ2dyZWdhdG9yCisKKwkJCX0KKwkJfQorCX0KKworCS8vIGlmIHRoZXJlIGlzIG5ldyBiZXN0IGFnZ3JlZ2F0b3IsIGFjdGl2YXRlIGl0CisJaWYgKGJlc3RfYWdncmVnYXRvcikgeworCQlmb3IgKGFnZ3JlZ2F0b3IgPSBfX2dldF9maXJzdF9hZ2coYmVzdF9hZ2dyZWdhdG9yLT5sYWdfcG9ydHMpOworCQkgICAgYWdncmVnYXRvcjsKKwkJICAgIGFnZ3JlZ2F0b3IgPSBfX2dldF9uZXh0X2FnZyhhZ2dyZWdhdG9yKSkgeworCisJCQlkcHJpbnRrKCJBZ2c9JWQ7IFBvcnRzPSVkOyBhIGtleT0lZDsgcCBrZXk9JWQ7IEluZGl2PSVkOyBBY3RpdmU9JWRcbiIsCisJCQkJCWFnZ3JlZ2F0b3ItPmFnZ3JlZ2F0b3JfaWRlbnRpZmllciwgYWdncmVnYXRvci0+bnVtX29mX3BvcnRzLAorCQkJCQlhZ2dyZWdhdG9yLT5hY3Rvcl9vcGVyX2FnZ3JlZ2F0b3Jfa2V5LCBhZ2dyZWdhdG9yLT5wYXJ0bmVyX29wZXJfYWdncmVnYXRvcl9rZXksCisJCQkJCWFnZ3JlZ2F0b3ItPmlzX2luZGl2aWR1YWwsIGFnZ3JlZ2F0b3ItPmlzX2FjdGl2ZSk7CisJCX0KKworCQkvLyBjaGVjayBpZiBhbnkgcGFydG5lciByZXBseXMKKwkJaWYgKGJlc3RfYWdncmVnYXRvci0+aXNfaW5kaXZpZHVhbCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRSAiOiBXYXJuaW5nOiBObyA4MDIuM2FkIHJlc3BvbnNlIGZyb20gdGhlIGxpbmsgcGFydG5lciAiCisJCQkJCSJmb3IgYW55IGFkYXB0ZXJzIGluIHRoZSBib25kXG4iKTsKKwkJfQorCisJCS8vIGNoZWNrIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIGFnZ3JlZ2F0b3IKKwkJaWYgKG51bV9vZl9hZ2dzID4gMSkgeworCQkJZHByaW50aygiV2FybmluZzogTW9yZSB0aGFuIG9uZSBMaW5rIEFnZ3JlZ2F0aW9uIEdyb3VwIHdhcyAiCisJCQkJImZvdW5kIGluIHRoZSBib25kLiBPbmx5IG9uZSBncm91cCB3aWxsIGZ1bmN0aW9uIGluIHRoZSBib25kXG4iKTsKKwkJfQorCisJCWJlc3RfYWdncmVnYXRvci0+aXNfYWN0aXZlID0gMTsKKwkJZHByaW50aygiTEFHICVkIGNob29zZWQgYXMgdGhlIGFjdGl2ZSBMQUdcbiIsIGJlc3RfYWdncmVnYXRvci0+YWdncmVnYXRvcl9pZGVudGlmaWVyKTsKKwkJZHByaW50aygiQWdnPSVkOyBQb3J0cz0lZDsgYSBrZXk9JWQ7IHAga2V5PSVkOyBJbmRpdj0lZDsgQWN0aXZlPSVkXG4iLAorCQkJCWJlc3RfYWdncmVnYXRvci0+YWdncmVnYXRvcl9pZGVudGlmaWVyLCBiZXN0X2FnZ3JlZ2F0b3ItPm51bV9vZl9wb3J0cywKKwkJCQliZXN0X2FnZ3JlZ2F0b3ItPmFjdG9yX29wZXJfYWdncmVnYXRvcl9rZXksIGJlc3RfYWdncmVnYXRvci0+cGFydG5lcl9vcGVyX2FnZ3JlZ2F0b3Jfa2V5LAorCQkJCWJlc3RfYWdncmVnYXRvci0+aXNfaW5kaXZpZHVhbCwgYmVzdF9hZ2dyZWdhdG9yLT5pc19hY3RpdmUpOworCisJCS8vIGRpc2FibGUgdGhlIHBvcnRzIHRoYXQgd2VyZSByZWxhdGVkIHRvIHRoZSBmb3JtZXIgYWN0aXZlX2FnZ3JlZ2F0b3IKKwkJaWYgKGxhc3RfYWN0aXZlX2FnZ3JlZ2F0b3IpIHsKKwkJCWZvciAocG9ydD1sYXN0X2FjdGl2ZV9hZ2dyZWdhdG9yLT5sYWdfcG9ydHM7IHBvcnQ7IHBvcnQ9cG9ydC0+bmV4dF9wb3J0X2luX2FnZ3JlZ2F0b3IpIHsKKwkJCQlfX2Rpc2FibGVfcG9ydChwb3J0KTsKKwkJCX0KKwkJfQorCX0KKworCS8vIGlmIHRoZSBzZWxlY3RlZCBhZ2dyZWdhdG9yIGlzIG9mIGpvaW4gaW5kaXZpZHVhbHMocGFydG5lcl9zeXN0ZW0gaXMgTlVMTCksIGVuYWJsZSB0aGVpciBwb3J0cworCWFjdGl2ZV9hZ2dyZWdhdG9yID0gX19nZXRfYWN0aXZlX2FnZyhvcmlnaW5fYWdncmVnYXRvcik7CisKKwlpZiAoYWN0aXZlX2FnZ3JlZ2F0b3IpIHsKKwkJaWYgKCFNQUNfQUREUkVTU19DT01QQVJFKCYoYWN0aXZlX2FnZ3JlZ2F0b3ItPnBhcnRuZXJfc3lzdGVtKSwgJihudWxsX21hY19hZGRyKSkpIHsKKwkJCWZvciAocG9ydD1hY3RpdmVfYWdncmVnYXRvci0+bGFnX3BvcnRzOyBwb3J0OyBwb3J0PXBvcnQtPm5leHRfcG9ydF9pbl9hZ2dyZWdhdG9yKSB7CisJCQkJX19lbmFibGVfcG9ydChwb3J0KTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqCisgKiBhZF9jbGVhcl9hZ2cgLSBjbGVhciBhIGdpdmVuIGFnZ3JlZ2F0b3IncyBwYXJhbWV0ZXJzCisgKiBAYWdncmVnYXRvcjogdGhlIGFnZ3JlZ2F0b3Igd2UncmUgbG9va2luZyBhdAorICoKKyAqLworc3RhdGljIHZvaWQgYWRfY2xlYXJfYWdnKHN0cnVjdCBhZ2dyZWdhdG9yICphZ2dyZWdhdG9yKQoreworCWlmIChhZ2dyZWdhdG9yKSB7CisJCWFnZ3JlZ2F0b3ItPmlzX2luZGl2aWR1YWwgPSAwOworCQlhZ2dyZWdhdG9yLT5hY3Rvcl9hZG1pbl9hZ2dyZWdhdG9yX2tleSA9IDA7CisJCWFnZ3JlZ2F0b3ItPmFjdG9yX29wZXJfYWdncmVnYXRvcl9rZXkgPSAwOworCQlhZ2dyZWdhdG9yLT5wYXJ0bmVyX3N5c3RlbSA9IG51bGxfbWFjX2FkZHI7CisJCWFnZ3JlZ2F0b3ItPnBhcnRuZXJfc3lzdGVtX3ByaW9yaXR5ID0gMDsKKwkJYWdncmVnYXRvci0+cGFydG5lcl9vcGVyX2FnZ3JlZ2F0b3Jfa2V5ID0gMDsKKwkJYWdncmVnYXRvci0+cmVjZWl2ZV9zdGF0ZSA9IDA7CisJCWFnZ3JlZ2F0b3ItPnRyYW5zbWl0X3N0YXRlID0gMDsKKwkJYWdncmVnYXRvci0+bGFnX3BvcnRzID0gTlVMTDsKKwkJYWdncmVnYXRvci0+aXNfYWN0aXZlID0gMDsKKwkJYWdncmVnYXRvci0+bnVtX29mX3BvcnRzID0gMDsKKwkJZHByaW50aygiTEFHICVkIHdhcyBjbGVhcmVkXG4iLCBhZ2dyZWdhdG9yLT5hZ2dyZWdhdG9yX2lkZW50aWZpZXIpOworCX0KK30KKworLyoqCisgKiBhZF9pbml0aWFsaXplX2FnZyAtIGluaXRpYWxpemUgYSBnaXZlbiBhZ2dyZWdhdG9yJ3MgcGFyYW1ldGVycworICogQGFnZ3JlZ2F0b3I6IHRoZSBhZ2dyZWdhdG9yIHdlJ3JlIGxvb2tpbmcgYXQKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGFkX2luaXRpYWxpemVfYWdnKHN0cnVjdCBhZ2dyZWdhdG9yICphZ2dyZWdhdG9yKQoreworCWlmIChhZ2dyZWdhdG9yKSB7CisJCWFkX2NsZWFyX2FnZyhhZ2dyZWdhdG9yKTsKKworCQlhZ2dyZWdhdG9yLT5hZ2dyZWdhdG9yX21hY19hZGRyZXNzID0gbnVsbF9tYWNfYWRkcjsKKwkJYWdncmVnYXRvci0+YWdncmVnYXRvcl9pZGVudGlmaWVyID0gMDsKKwkJYWdncmVnYXRvci0+c2xhdmUgPSBOVUxMOworCX0KK30KKworLyoqCisgKiBhZF9pbml0aWFsaXplX3BvcnQgLSBpbml0aWFsaXplIGEgZ2l2ZW4gcG9ydCdzIHBhcmFtZXRlcnMKKyAqIEBhZ2dyZWdhdG9yOiB0aGUgYWdncmVnYXRvciB3ZSdyZSBsb29raW5nIGF0CisgKiBAbGFjcF9mYXN0OiBib29sZWFuLiB3aGV0aGVyIGZhc3QgcGVyaW9kaWMgc2hvdWxkIGJlIHVzZWQKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGFkX2luaXRpYWxpemVfcG9ydChzdHJ1Y3QgcG9ydCAqcG9ydCwgaW50IGxhY3BfZmFzdCkKK3sKKwlpZiAocG9ydCkgeworCQlwb3J0LT5hY3Rvcl9wb3J0X251bWJlciA9IDE7CisJCXBvcnQtPmFjdG9yX3BvcnRfcHJpb3JpdHkgPSAweGZmOworCQlwb3J0LT5hY3Rvcl9zeXN0ZW0gPSBudWxsX21hY19hZGRyOworCQlwb3J0LT5hY3Rvcl9zeXN0ZW1fcHJpb3JpdHkgPSAweGZmZmY7CisJCXBvcnQtPmFjdG9yX3BvcnRfYWdncmVnYXRvcl9pZGVudGlmaWVyID0gMDsKKwkJcG9ydC0+bnR0ID0gMDsKKwkJcG9ydC0+YWN0b3JfYWRtaW5fcG9ydF9rZXkgPSAxOworCQlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfa2V5ICA9IDE7CisJCXBvcnQtPmFjdG9yX2FkbWluX3BvcnRfc3RhdGUgPSBBRF9TVEFURV9BR0dSRUdBVElPTiB8IEFEX1NUQVRFX0xBQ1BfQUNUSVZJVFk7CisJCXBvcnQtPmFjdG9yX29wZXJfcG9ydF9zdGF0ZSAgPSBBRF9TVEFURV9BR0dSRUdBVElPTiB8IEFEX1NUQVRFX0xBQ1BfQUNUSVZJVFk7CisKKwkJaWYgKGxhY3BfZmFzdCkgeworCQkJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X3N0YXRlIHw9IEFEX1NUQVRFX0xBQ1BfVElNRU9VVDsKKwkJfQorCisJCXBvcnQtPnBhcnRuZXJfYWRtaW5fc3lzdGVtID0gbnVsbF9tYWNfYWRkcjsKKwkJcG9ydC0+cGFydG5lcl9vcGVyX3N5c3RlbSAgPSBudWxsX21hY19hZGRyOworCQlwb3J0LT5wYXJ0bmVyX2FkbWluX3N5c3RlbV9wcmlvcml0eSA9IDB4ZmZmZjsKKwkJcG9ydC0+cGFydG5lcl9vcGVyX3N5c3RlbV9wcmlvcml0eSAgPSAweGZmZmY7CisJCXBvcnQtPnBhcnRuZXJfYWRtaW5fa2V5ID0gMTsKKwkJcG9ydC0+cGFydG5lcl9vcGVyX2tleSAgPSAxOworCQlwb3J0LT5wYXJ0bmVyX2FkbWluX3BvcnRfbnVtYmVyID0gMTsKKwkJcG9ydC0+cGFydG5lcl9vcGVyX3BvcnRfbnVtYmVyICA9IDE7CisJCXBvcnQtPnBhcnRuZXJfYWRtaW5fcG9ydF9wcmlvcml0eSA9IDB4ZmY7CisJCXBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X3ByaW9yaXR5ICA9IDB4ZmY7CisJCXBvcnQtPnBhcnRuZXJfYWRtaW5fcG9ydF9zdGF0ZSA9IDE7CisJCXBvcnQtPnBhcnRuZXJfb3Blcl9wb3J0X3N0YXRlICA9IDE7CisJCXBvcnQtPmlzX2VuYWJsZWQgPSAxOworCQkvLyAqKioqKiogcHJpdmF0ZSBwYXJhbWV0ZXJzICoqKioqKgorCQlwb3J0LT5zbV92YXJzID0gMHgzOworCQlwb3J0LT5zbV9yeF9zdGF0ZSA9IDA7CisJCXBvcnQtPnNtX3J4X3RpbWVyX2NvdW50ZXIgPSAwOworCQlwb3J0LT5zbV9wZXJpb2RpY19zdGF0ZSA9IDA7CisJCXBvcnQtPnNtX3BlcmlvZGljX3RpbWVyX2NvdW50ZXIgPSAwOworCQlwb3J0LT5zbV9tdXhfc3RhdGUgPSAwOworCQlwb3J0LT5zbV9tdXhfdGltZXJfY291bnRlciA9IDA7CisJCXBvcnQtPnNtX3R4X3N0YXRlID0gMDsKKwkJcG9ydC0+c21fdHhfdGltZXJfY291bnRlciA9IDA7CisJCXBvcnQtPnNsYXZlID0gTlVMTDsKKwkJcG9ydC0+YWdncmVnYXRvciA9IE5VTEw7CisJCXBvcnQtPm5leHRfcG9ydF9pbl9hZ2dyZWdhdG9yID0gTlVMTDsKKwkJcG9ydC0+dHJhbnNhY3Rpb25faWQgPSAwOworCisJCWFkX2luaXRpYWxpemVfbGFjcGR1KCYocG9ydC0+bGFjcGR1KSk7CisJfQorfQorCisvKioKKyAqIGFkX2VuYWJsZV9jb2xsZWN0aW5nX2Rpc3RyaWJ1dGluZyAtIGVuYWJsZSBhIHBvcnQncyB0cmFuc21pdC9yZWNlaXZlCisgKiBAcG9ydDogdGhlIHBvcnQgd2UncmUgbG9va2luZyBhdAorICoKKyAqIEVuYWJsZSBAcG9ydCBpZiBpdCdzIGluIGFuIGFjdGl2ZSBhZ2dyZWdhdG9yCisgKi8KK3N0YXRpYyB2b2lkIGFkX2VuYWJsZV9jb2xsZWN0aW5nX2Rpc3RyaWJ1dGluZyhzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwlpZiAocG9ydC0+YWdncmVnYXRvci0+aXNfYWN0aXZlKSB7CisJCWRwcmludGsoIkVuYWJsaW5nIHBvcnQgJWQoTEFHICVkKVxuIiwgcG9ydC0+YWN0b3JfcG9ydF9udW1iZXIsIHBvcnQtPmFnZ3JlZ2F0b3ItPmFnZ3JlZ2F0b3JfaWRlbnRpZmllcik7CisJCV9fZW5hYmxlX3BvcnQocG9ydCk7CisJfQorfQorCisvKioKKyAqIGFkX2Rpc2FibGVfY29sbGVjdGluZ19kaXN0cmlidXRpbmcgLSBkaXNhYmxlIGEgcG9ydCdzIHRyYW5zbWl0L3JlY2VpdmUKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICovCitzdGF0aWMgdm9pZCBhZF9kaXNhYmxlX2NvbGxlY3RpbmdfZGlzdHJpYnV0aW5nKHN0cnVjdCBwb3J0ICpwb3J0KQoreworCWlmIChwb3J0LT5hZ2dyZWdhdG9yICYmIE1BQ19BRERSRVNTX0NPTVBBUkUoJihwb3J0LT5hZ2dyZWdhdG9yLT5wYXJ0bmVyX3N5c3RlbSksICYobnVsbF9tYWNfYWRkcikpKSB7CisJCWRwcmludGsoIkRpc2FibGluZyBwb3J0ICVkKExBRyAlZClcbiIsIHBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyLCBwb3J0LT5hZ2dyZWdhdG9yLT5hZ2dyZWdhdG9yX2lkZW50aWZpZXIpOworCQlfX2Rpc2FibGVfcG9ydChwb3J0KTsKKwl9Cit9CisKKyNpZiAwCisvKioKKyAqIGFkX21hcmtlcl9pbmZvX3NlbmQgLSBzZW5kIGEgbWFya2VyIGluZm9ybWF0aW9uIGZyYW1lCisgKiBAcG9ydDogdGhlIHBvcnQgd2UncmUgbG9va2luZyBhdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nIHNpbmNlIHdlIGRlY2lkZWQgbm90IHRvIGltcGxlbWVudCBzZW5kIGFuZCBoYW5kbGUKKyAqIHJlc3BvbnNlIGZvciBtYXJrZXIgUERVJ3MsIGluIHRoaXMgc3RhZ2UsIGJ1dCBvbmx5IHRvIHJlc3BvbmQgdG8gbWFya2VyCisgKiBpbmZvcm1hdGlvbi4KKyAqLworc3RhdGljIHZvaWQgYWRfbWFya2VyX2luZm9fc2VuZChzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgbWFya2VyIG1hcmtlcjsKKwl1MTYgaW5kZXg7CisKKwkvLyBmaWxsIHRoZSBtYXJrZXIgUERVIHdpdGggdGhlIGFwcHJvcHJpYXRlIHZhbHVlcworCW1hcmtlci5zdWJ0eXBlID0gMHgwMjsKKwltYXJrZXIudmVyc2lvbl9udW1iZXIgPSAweDAxOworCW1hcmtlci50bHZfdHlwZSA9IEFEX01BUktFUl9JTkZPUk1BVElPTl9TVUJUWVBFOworCW1hcmtlci5tYXJrZXJfbGVuZ3RoID0gMHgxNjsKKwkvLyBjb252ZXJ0IHJlcXVlc3Rlcl9wb3J0IHRvIEJpZyBFbmRpYW4KKwltYXJrZXIucmVxdWVzdGVyX3BvcnQgPSAoKChwb3J0LT5hY3Rvcl9wb3J0X251bWJlciAmIDB4RkYpIDw8IDgpIHwoKHUxNikocG9ydC0+YWN0b3JfcG9ydF9udW1iZXIgJiAweEZGMDApID4+IDgpKTsKKwltYXJrZXIucmVxdWVzdGVyX3N5c3RlbSA9IHBvcnQtPmFjdG9yX3N5c3RlbTsKKwkvLyBjb252ZXJ0IHJlcXVlc3Rlcl9wb3J0KHUzMikgdG8gQmlnIEVuZGlhbgorCW1hcmtlci5yZXF1ZXN0ZXJfdHJhbnNhY3Rpb25faWQgPSAoKCgrK3BvcnQtPnRyYW5zYWN0aW9uX2lkICYgMHhGRikgPDwgMjQpIHwoKHBvcnQtPnRyYW5zYWN0aW9uX2lkICYgMHhGRjAwKSA8PCA4KSB8KChwb3J0LT50cmFuc2FjdGlvbl9pZCAmIDB4RkYwMDAwKSA+PiA4KSB8KChwb3J0LT50cmFuc2FjdGlvbl9pZCAmIDB4RkYwMDAwMDApID4+IDI0KSk7CisJbWFya2VyLnBhZCA9IDA7CisJbWFya2VyLnRsdl90eXBlX3Rlcm1pbmF0b3IgPSAweDAwOworCW1hcmtlci50ZXJtaW5hdG9yX2xlbmd0aCA9IDB4MDA7CisJZm9yIChpbmRleD0wOyBpbmRleDw5MDsgaW5kZXgrKykgeworCQltYXJrZXIucmVzZXJ2ZWRfOTBbaW5kZXhdPTA7CisJfQorCisJLy8gc2VuZCB0aGUgbWFya2VyIGluZm9ybWF0aW9uCisJaWYgKGFkX21hcmtlcl9zZW5kKHBvcnQsICZtYXJrZXIpID49IDApIHsKKwkJZHByaW50aygiU2VudCBNYXJrZXIgSW5mb3JtYXRpb24gb24gcG9ydCAlZFxuIiwgcG9ydC0+YWN0b3JfcG9ydF9udW1iZXIpOworCX0KK30KKyNlbmRpZgorCisvKioKKyAqIGFkX21hcmtlcl9pbmZvX3JlY2VpdmVkIC0gaGFuZGxlIHJlY2VpdmUgb2YgYSBNYXJrZXIgaW5mb3JtYXRpb24gZnJhbWUKKyAqIEBtYXJrZXJfaW5mbzogTWFya2VyIGluZm8gcmVjZWl2ZWQKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICovCitzdGF0aWMgdm9pZCBhZF9tYXJrZXJfaW5mb19yZWNlaXZlZChzdHJ1Y3QgbWFya2VyICptYXJrZXJfaW5mbyxzdHJ1Y3QgcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgbWFya2VyIG1hcmtlcjsKKworCS8vIGNvcHkgdGhlIHJlY2VpdmVkIG1hcmtlciBkYXRhIHRvIHRoZSByZXNwb25zZSBtYXJrZXIKKwkvL21hcmtlciA9ICptYXJrZXJfaW5mbzsKKwltZW1jcHkoJm1hcmtlciwgbWFya2VyX2luZm8sIHNpemVvZihzdHJ1Y3QgbWFya2VyKSk7CisJLy8gY2hhbmdlIHRoZSBtYXJrZXIgc3VidHlwZSB0byBtYXJrZXIgcmVzcG9uc2UKKwltYXJrZXIudGx2X3R5cGU9QURfTUFSS0VSX1JFU1BPTlNFX1NVQlRZUEU7CisJLy8gc2VuZCB0aGUgbWFya2VyIHJlc3BvbnNlCisKKwlpZiAoYWRfbWFya2VyX3NlbmQocG9ydCwgJm1hcmtlcikgPj0gMCkgeworCQlkcHJpbnRrKCJTZW50IE1hcmtlciBSZXNwb25zZSBvbiBwb3J0ICVkXG4iLCBwb3J0LT5hY3Rvcl9wb3J0X251bWJlcik7CisJfQorfQorCisvKioKKyAqIGFkX21hcmtlcl9yZXNwb25zZV9yZWNlaXZlZCAtIGhhbmRsZSByZWNlaXZlIG9mIGEgbWFya2VyIHJlc3BvbnNlIGZyYW1lCisgKiBAbWFya2VyOiBtYXJrZXIgUERVIHJlY2VpdmVkCisgKiBAcG9ydDogdGhlIHBvcnQgd2UncmUgbG9va2luZyBhdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nIHNpbmNlIHdlIGRlY2lkZWQgbm90IHRvIGltcGxlbWVudCBzZW5kIGFuZCBoYW5kbGUKKyAqIHJlc3BvbnNlIGZvciBtYXJrZXIgUERVJ3MsIGluIHRoaXMgc3RhZ2UsIGJ1dCBvbmx5IHRvIHJlc3BvbmQgdG8gbWFya2VyCisgKiBpbmZvcm1hdGlvbi4KKyAqLworc3RhdGljIHZvaWQgYWRfbWFya2VyX3Jlc3BvbnNlX3JlY2VpdmVkKHN0cnVjdCBtYXJrZXIgKm1hcmtlciwgc3RydWN0IHBvcnQgKnBvcnQpCit7CisJbWFya2VyPU5VTEw7IC8vIGp1c3QgdG8gc2F0aXNmeSB0aGUgY29tcGlsZXIKKwlwb3J0PU5VTEw7ICAvLyBqdXN0IHRvIHNhdGlzZnkgdGhlIGNvbXBpbGVyCisJLy8gRE8gTk9USElORywgU0lOQ0UgV0UgREVDSURFRCBOT1QgVE8gSU1QTEVNRU5UIFRISVMgRkVBVFVSRSBGT1IgTk9XCit9CisKKy8qKgorICogYWRfaW5pdGlhbGl6ZV9sYWNwZHUgLSBpbml0aWFsaXplIGEgZ2l2ZW4gbGFjcGR1IHN0cnVjdHVyZQorICogQGxhY3BkdTogbGFjcGR1IHN0cnVjdHVyZSB0byBpbml0aWFsaXplCisgKgorICovCitzdGF0aWMgdm9pZCBhZF9pbml0aWFsaXplX2xhY3BkdShzdHJ1Y3QgbGFjcGR1ICpsYWNwZHUpCit7CisJdTE2IGluZGV4OworCisJLy8gaW5pdGlhbGl6ZSBsYWNwZHUgZGF0YQorCWxhY3BkdS0+c3VidHlwZSA9IDB4MDE7CisJbGFjcGR1LT52ZXJzaW9uX251bWJlciA9IDB4MDE7CisJbGFjcGR1LT50bHZfdHlwZV9hY3Rvcl9pbmZvID0gMHgwMTsKKwlsYWNwZHUtPmFjdG9yX2luZm9ybWF0aW9uX2xlbmd0aCA9IDB4MTQ7CisJLy8gbGFjcGR1LT5hY3Rvcl9zeXN0ZW1fcHJpb3JpdHkgICAgdXBkYXRlZCBvbiBzZW5kCisJLy8gbGFjcGR1LT5hY3Rvcl9zeXN0ZW0gICAgICAgICAgICAgdXBkYXRlZCBvbiBzZW5kCisJLy8gbGFjcGR1LT5hY3Rvcl9rZXkgICAgICAgICAgICAgICAgdXBkYXRlZCBvbiBzZW5kCisJLy8gbGFjcGR1LT5hY3Rvcl9wb3J0X3ByaW9yaXR5ICAgICAgdXBkYXRlZCBvbiBzZW5kCisJLy8gbGFjcGR1LT5hY3Rvcl9wb3J0ICAgICAgICAgICAgICAgdXBkYXRlZCBvbiBzZW5kCisJLy8gbGFjcGR1LT5hY3Rvcl9zdGF0ZSAgICAgICAgICAgICAgdXBkYXRlZCBvbiBzZW5kCisJbGFjcGR1LT50bHZfdHlwZV9wYXJ0bmVyX2luZm8gPSAweDAyOworCWxhY3BkdS0+cGFydG5lcl9pbmZvcm1hdGlvbl9sZW5ndGggPSAweDE0OworCWZvciAoaW5kZXg9MDsgaW5kZXg8PTI7IGluZGV4KyspIHsKKwkJbGFjcGR1LT5yZXNlcnZlZF8zXzFbaW5kZXhdPTA7CisJfQorCS8vIGxhY3BkdS0+cGFydG5lcl9zeXN0ZW1fcHJpb3JpdHkgIHVwZGF0ZWQgb24gc2VuZAorCS8vIGxhY3BkdS0+cGFydG5lcl9zeXN0ZW0gICAgICAgICAgIHVwZGF0ZWQgb24gc2VuZAorCS8vIGxhY3BkdS0+cGFydG5lcl9rZXkgICAgICAgICAgICAgIHVwZGF0ZWQgb24gc2VuZAorCS8vIGxhY3BkdS0+cGFydG5lcl9wb3J0X3ByaW9yaXR5ICAgIHVwZGF0ZWQgb24gc2VuZAorCS8vIGxhY3BkdS0+cGFydG5lcl9wb3J0ICAgICAgICAgICAgIHVwZGF0ZWQgb24gc2VuZAorCS8vIGxhY3BkdS0+cGFydG5lcl9zdGF0ZSAgICAgICAgICAgIHVwZGF0ZWQgb24gc2VuZAorCWZvciAoaW5kZXg9MDsgaW5kZXg8PTI7IGluZGV4KyspIHsKKwkJbGFjcGR1LT5yZXNlcnZlZF8zXzJbaW5kZXhdPTA7CisJfQorCWxhY3BkdS0+dGx2X3R5cGVfY29sbGVjdG9yX2luZm8gPSAweDAzOworCWxhY3BkdS0+Y29sbGVjdG9yX2luZm9ybWF0aW9uX2xlbmd0aD0gMHgxMDsKKwlsYWNwZHUtPmNvbGxlY3Rvcl9tYXhfZGVsYXkgPSBBRF9DT0xMRUNUT1JfTUFYX0RFTEFZOworCWZvciAoaW5kZXg9MDsgaW5kZXg8PTExOyBpbmRleCsrKSB7CisJCWxhY3BkdS0+cmVzZXJ2ZWRfMTJbaW5kZXhdPTA7CisJfQorCWxhY3BkdS0+dGx2X3R5cGVfdGVybWluYXRvciA9IDB4MDA7CisJbGFjcGR1LT50ZXJtaW5hdG9yX2xlbmd0aCA9IDA7CisJZm9yIChpbmRleD0wOyBpbmRleDw9NDk7IGluZGV4KyspIHsKKwkJbGFjcGR1LT5yZXNlcnZlZF81MFtpbmRleF09MDsKKwl9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyA9PT09PT09PT09PT09PT09PSBBRCBleHBvcnRlZCBmdW5jdGlvbnMgdG8gdGhlIG1haW4gYm9uZGluZyBjb2RlID09PT09PT09PT09PT09PT09PQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gQ2hlY2sgYWdncmVnYXRvcnMgc3RhdHVzIGluIHRlYW0gZXZlcnkgVCBzZWNvbmRzCisjZGVmaW5lIEFEX0FHR1JFR0FUT1JfU0VMRUNUSU9OX1RJTUVSICA4CisKK3N0YXRpYyB1MTYgYWdncmVnYXRvcl9pZGVudGlmaWVyOworCisvKioKKyAqIGJvbmRfM2FkX2luaXRpYWxpemUgLSBpbml0aWFsaXplIGEgYm9uZCdzIDgwMi4zYWQgcGFyYW1ldGVycyBhbmQgc3RydWN0dXJlcworICogQGJvbmQ6IGJvbmRpbmcgc3RydWN0IHRvIHdvcmsgb24KKyAqIEB0aWNrX3Jlc29sdXRpb246IHRpY2sgZHVyYXRpb24gKG1pbGxpc2Vjb25kIHJlc29sdXRpb24pCisgKiBAbGFjcF9mYXN0OiBib29sZWFuLiB3aGV0aGVyIGZhc3QgcGVyaW9kaWMgc2hvdWxkIGJlIHVzZWQKKyAqCisgKiBDYW4gYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgdGhlIG1hYyBhZGRyZXNzIG9mIHRoZSBib25kIGlzIHNldC4KKyAqLwordm9pZCBib25kXzNhZF9pbml0aWFsaXplKHN0cnVjdCBib25kaW5nICpib25kLCB1MTYgdGlja19yZXNvbHV0aW9uLCBpbnQgbGFjcF9mYXN0KQoreyAgICAgICAgICAgICAgICAgICAgICAgICAKKwkvLyBjaGVjayB0aGF0IHRoZSBib25kIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQKKwlpZiAoTUFDX0FERFJFU1NfQ09NUEFSRSgmKEJPTkRfQURfSU5GTyhib25kKS5zeXN0ZW0uc3lzX21hY19hZGRyKSwgJihib25kLT5kZXYtPmRldl9hZGRyKSkpIHsKKworCQlhZ2dyZWdhdG9yX2lkZW50aWZpZXIgPSAwOworCisJCUJPTkRfQURfSU5GTyhib25kKS5sYWNwX2Zhc3QgPSBsYWNwX2Zhc3Q7CisJCUJPTkRfQURfSU5GTyhib25kKS5zeXN0ZW0uc3lzX3ByaW9yaXR5ID0gMHhGRkZGOworCQlCT05EX0FEX0lORk8oYm9uZCkuc3lzdGVtLnN5c19tYWNfYWRkciA9ICooKHN0cnVjdCBtYWNfYWRkciAqKWJvbmQtPmRldi0+ZGV2X2FkZHIpOworCisJCS8vIGluaXRpYWxpemUgaG93IG1hbnkgdGltZXMgdGhpcyBtb2R1bGUgaXMgY2FsbGVkIGluIG9uZSBzZWNvbmQoc2hvdWxkIGJlIGFib3V0IGV2ZXJ5IDEwMG1zKQorCQlhZF90aWNrc19wZXJfc2VjID0gdGlja19yZXNvbHV0aW9uOworCisJCS8vIGluaXRpYWxpemUgdGhlIGFnZ3JlZ2F0b3Igc2VsZWN0aW9uIHRpbWVyKHRvIGFjdGl2YXRlIGFuIGFnZ3JlZ2F0aW9uIHNlbGVjdGlvbiBhZnRlciBpbml0aWFsaXplKQorCQlCT05EX0FEX0lORk8oYm9uZCkuYWdnX3NlbGVjdF90aW1lciA9IChBRF9BR0dSRUdBVE9SX1NFTEVDVElPTl9USU1FUiAqIGFkX3RpY2tzX3Blcl9zZWMpOworCQlCT05EX0FEX0lORk8oYm9uZCkuYWdnX3NlbGVjdF9tb2RlID0gQURfQkFORFdJRFRIOworCX0KK30KKworLyoqCisgKiBib25kXzNhZF9iaW5kX3NsYXZlIC0gaW5pdGlhbGl6ZSBhIHNsYXZlJ3MgcG9ydAorICogQHNsYXZlOiBzbGF2ZSBzdHJ1Y3QgdG8gd29yayBvbgorICoKKyAqIFJldHVybnM6ICAgMCBvbiBzdWNjZXNzCisgKiAgICAgICAgICA8IDAgb24gZXJyb3IKKyAqLworaW50IGJvbmRfM2FkX2JpbmRfc2xhdmUoc3RydWN0IHNsYXZlICpzbGF2ZSkKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZ2V0X2JvbmRfYnlfc2xhdmUoc2xhdmUpOworCXN0cnVjdCBwb3J0ICpwb3J0OworCXN0cnVjdCBhZ2dyZWdhdG9yICphZ2dyZWdhdG9yOworCisJaWYgKGJvbmQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIlRoZSBzbGF2ZSAlcyBpcyBub3QgYXR0YWNoZWQgdG8gaXRzIGJvbmRcbiIsIHNsYXZlLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJLy9jaGVjayB0aGF0IHRoZSBzbGF2ZSBoYXMgbm90IGJlZW4gaW50aWFsaXplZCB5ZXQuCisJaWYgKFNMQVZFX0FEX0lORk8oc2xhdmUpLnBvcnQuc2xhdmUgIT0gc2xhdmUpIHsKKworCQkvLyBwb3J0IGluaXRpYWxpemF0aW9uCisJCXBvcnQgPSAmKFNMQVZFX0FEX0lORk8oc2xhdmUpLnBvcnQpOworCisJCWFkX2luaXRpYWxpemVfcG9ydChwb3J0LCBCT05EX0FEX0lORk8oYm9uZCkubGFjcF9mYXN0KTsKKworCQlwb3J0LT5zbGF2ZSA9IHNsYXZlOworCQlwb3J0LT5hY3Rvcl9wb3J0X251bWJlciA9IFNMQVZFX0FEX0lORk8oc2xhdmUpLmlkOworCQkvLyBrZXkgaXMgZGV0ZXJtaW5lZCBhY2NvcmRpbmcgdG8gdGhlIGxpbmsgc3BlZWQsIGR1cGxleCBhbmQgdXNlciBrZXkod2hpY2ggaXMgeWV0IG5vdCBzdXBwb3J0ZWQpCisJCS8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy8gUG9ydCBrZXkgOiAgIHwgVXNlciBrZXkgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICBTcGVlZCAgICAgICB8RHVwbGV4fAorCQkvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vICAgICAgICAgICAgICAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ICAgICAgICAgICAgICAgMSAwCisJCXBvcnQtPmFjdG9yX2FkbWluX3BvcnRfa2V5ID0gMDsJLy8gaW5pdGlhbGl6ZSB0aGlzIHBhcmFtZXRlcgorCQlwb3J0LT5hY3Rvcl9hZG1pbl9wb3J0X2tleSB8PSBfX2dldF9kdXBsZXgocG9ydCk7CisJCXBvcnQtPmFjdG9yX2FkbWluX3BvcnRfa2V5IHw9IChfX2dldF9saW5rX3NwZWVkKHBvcnQpIDw8IDEpOworCQlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfa2V5ID0gcG9ydC0+YWN0b3JfYWRtaW5fcG9ydF9rZXk7CisJCS8vIGlmIHRoZSBwb3J0IGlzIG5vdCBmdWxsIGR1cGxleCwgdGhlbiB0aGUgcG9ydCBzaG91bGQgYmUgbm90IGxhY3AgRW5hYmxlZAorCQlpZiAoIShwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfa2V5ICYgQURfRFVQTEVYX0tFWV9CSVRTKSkgeworCQkJcG9ydC0+c21fdmFycyAmPSB+QURfUE9SVF9MQUNQX0VOQUJMRUQ7CisJCX0KKwkJLy8gYWN0b3Igc3lzdGVtIGlzIHRoZSBib25kJ3Mgc3lzdGVtCisJCXBvcnQtPmFjdG9yX3N5c3RlbSA9IEJPTkRfQURfSU5GTyhib25kKS5zeXN0ZW0uc3lzX21hY19hZGRyOworCQkvLyB0eCB0aW1lcih0byB2ZXJpZnkgdGhhdCBubyBtb3JlIHRoYW4gTUFYX1RYX0lOX1NFQ09ORCBsYWNwZHUncyBhcmUgc2VudCBpbiBvbmUgc2Vjb25kKQorCQlwb3J0LT5zbV90eF90aW1lcl9jb3VudGVyID0gYWRfdGlja3NfcGVyX3NlYy9BRF9NQVhfVFhfSU5fU0VDT05EOworCQlwb3J0LT5hZ2dyZWdhdG9yID0gTlVMTDsKKwkJcG9ydC0+bmV4dF9wb3J0X2luX2FnZ3JlZ2F0b3IgPSBOVUxMOworCisJCV9fZGlzYWJsZV9wb3J0KHBvcnQpOworCQlfX2luaXRpYWxpemVfcG9ydF9sb2Nrcyhwb3J0KTsKKworCisJCS8vIGFnZ3JlZ2F0b3IgaW5pdGlhbGl6YXRpb24KKwkJYWdncmVnYXRvciA9ICYoU0xBVkVfQURfSU5GTyhzbGF2ZSkuYWdncmVnYXRvcik7CisKKwkJYWRfaW5pdGlhbGl6ZV9hZ2coYWdncmVnYXRvcik7CisKKwkJYWdncmVnYXRvci0+YWdncmVnYXRvcl9tYWNfYWRkcmVzcyA9ICooKHN0cnVjdCBtYWNfYWRkciAqKWJvbmQtPmRldi0+ZGV2X2FkZHIpOworCQlhZ2dyZWdhdG9yLT5hZ2dyZWdhdG9yX2lkZW50aWZpZXIgPSAoKythZ2dyZWdhdG9yX2lkZW50aWZpZXIpOworCQlhZ2dyZWdhdG9yLT5zbGF2ZSA9IHNsYXZlOworCQlhZ2dyZWdhdG9yLT5pc19hY3RpdmUgPSAwOworCQlhZ2dyZWdhdG9yLT5udW1fb2ZfcG9ydHMgPSAwOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGJvbmRfM2FkX3VuYmluZF9zbGF2ZSAtIGRlaW5pdGlhbGl6ZSBhIHNsYXZlJ3MgcG9ydAorICogQHNsYXZlOiBzbGF2ZSBzdHJ1Y3QgdG8gd29yayBvbgorICoKKyAqIFNlYXJjaCBmb3IgdGhlIGFnZ3JlZ2F0b3IgdGhhdCBpcyByZWxhdGVkIHRvIHRoaXMgcG9ydCwgcmVtb3ZlIHRoZQorICogYWdncmVnYXRvciBhbmQgYXNzaWduIGFub3RoZXIgYWdncmVnYXRvciBmb3Igb3RoZXIgcG9ydCByZWxhdGVkIHRvIGl0CisgKiAoaWYgYW55KSwgYW5kIHJlbW92ZSB0aGUgcG9ydC4KKyAqLwordm9pZCBib25kXzNhZF91bmJpbmRfc2xhdmUoc3RydWN0IHNsYXZlICpzbGF2ZSkKK3sKKwlzdHJ1Y3QgcG9ydCAqcG9ydCwgKnByZXZfcG9ydCwgKnRlbXBfcG9ydDsKKwlzdHJ1Y3QgYWdncmVnYXRvciAqYWdncmVnYXRvciwgKm5ld19hZ2dyZWdhdG9yLCAqdGVtcF9hZ2dyZWdhdG9yOworCWludCBzZWxlY3RfbmV3X2FjdGl2ZV9hZ2cgPSAwOworCQorCS8vIGZpbmQgdGhlIGFnZ3JlZ2F0b3IgcmVsYXRlZCB0byB0aGlzIHNsYXZlCisJYWdncmVnYXRvciA9ICYoU0xBVkVfQURfSU5GTyhzbGF2ZSkuYWdncmVnYXRvcik7CisKKwkvLyBmaW5kIHRoZSBwb3J0IHJlbGF0ZWQgdG8gdGhpcyBzbGF2ZQorCXBvcnQgPSAmKFNMQVZFX0FEX0lORk8oc2xhdmUpLnBvcnQpOworCisJLy8gaWYgc2xhdmUgaXMgbnVsbCwgdGhlIHdob2xlIHBvcnQgaXMgbm90IGluaXRpYWxpemVkCisJaWYgKCFwb3J0LT5zbGF2ZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6IFRyeWluZyB0byB1bmJpbmQgYW4gdW5pbml0aWFsaXplZCBwb3J0IG9uICVzXG4iLCBzbGF2ZS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWRwcmludGsoIlVuYmluZGluZyBMaW5rIEFnZ3JlZ2F0aW9uIEdyb3VwICVkXG4iLCBhZ2dyZWdhdG9yLT5hZ2dyZWdhdG9yX2lkZW50aWZpZXIpOworCisJLyogVGVsbCB0aGUgcGFydG5lciB0aGF0IHRoaXMgcG9ydCBpcyBub3Qgc3VpdGFibGUgZm9yIGFnZ3JlZ2F0aW9uICovCisJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X3N0YXRlICY9IH5BRF9TVEFURV9BR0dSRUdBVElPTjsKKwlfX3VwZGF0ZV9sYWNwZHVfZnJvbV9wb3J0KHBvcnQpOworCWFkX2xhY3BkdV9zZW5kKHBvcnQpOworCisJLy8gY2hlY2sgaWYgdGhpcyBhZ2dyZWdhdG9yIGlzIG9jY3VwaWVkCisJaWYgKGFnZ3JlZ2F0b3ItPmxhZ19wb3J0cykgeworCQkvLyBjaGVjayBpZiB0aGVyZSBhcmUgb3RoZXIgcG9ydHMgcmVsYXRlZCB0byB0aGlzIGFnZ3JlZ2F0b3IgZXhjZXB0CisJCS8vIHRoZSBwb3J0IHJlbGF0ZWQgdG8gdGhpcyBzbGF2ZSh0aGF0cyBlbnN1cmUgdXMgdGhhdCB0aGVyZSBpcyBhCisJCS8vIHJlYXNvbiB0byBzZWFyY2ggZm9yIG5ldyBhZ2dyZWdhdG9yLCBhbmQgdGhhdCB3ZSB3aWxsIGZpbmQgb25lCisJCWlmICgoYWdncmVnYXRvci0+bGFnX3BvcnRzICE9IHBvcnQpIHx8IChhZ2dyZWdhdG9yLT5sYWdfcG9ydHMtPm5leHRfcG9ydF9pbl9hZ2dyZWdhdG9yKSkgeworCQkJLy8gZmluZCBuZXcgYWdncmVnYXRvciBmb3IgdGhlIHJlbGF0ZWQgcG9ydChzKQorCQkJbmV3X2FnZ3JlZ2F0b3IgPSBfX2dldF9maXJzdF9hZ2cocG9ydCk7CisJCQlmb3IgKDsgbmV3X2FnZ3JlZ2F0b3I7IG5ld19hZ2dyZWdhdG9yID0gX19nZXRfbmV4dF9hZ2cobmV3X2FnZ3JlZ2F0b3IpKSB7CisJCQkJLy8gaWYgdGhlIG5ldyBhZ2dyZWdhdG9yIGlzIGVtcHR5LCBvciBpdCBjb25uZWN0ZWQgdG8gdG8gb3VyIHBvcnQgb25seQorCQkJCWlmICghbmV3X2FnZ3JlZ2F0b3ItPmxhZ19wb3J0cyB8fCAoKG5ld19hZ2dyZWdhdG9yLT5sYWdfcG9ydHMgPT0gcG9ydCkgJiYgIW5ld19hZ2dyZWdhdG9yLT5sYWdfcG9ydHMtPm5leHRfcG9ydF9pbl9hZ2dyZWdhdG9yKSkgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQkvLyBpZiBuZXcgYWdncmVnYXRvciBmb3VuZCwgY29weSB0aGUgYWdncmVnYXRvcidzIHBhcmFtZXRlcnMKKwkJCS8vIGFuZCBjb25uZWN0IHRoZSByZWxhdGVkIGxhZ19wb3J0cyB0byB0aGUgbmV3IGFnZ3JlZ2F0b3IKKwkJCWlmICgobmV3X2FnZ3JlZ2F0b3IpICYmICgoIW5ld19hZ2dyZWdhdG9yLT5sYWdfcG9ydHMpIHx8ICgobmV3X2FnZ3JlZ2F0b3ItPmxhZ19wb3J0cyA9PSBwb3J0KSAmJiAhbmV3X2FnZ3JlZ2F0b3ItPmxhZ19wb3J0cy0+bmV4dF9wb3J0X2luX2FnZ3JlZ2F0b3IpKSkgeworCQkJCWRwcmludGsoIlNvbWUgcG9ydChzKSByZWxhdGVkIHRvIExBRyAlZCAtIHJlcGxhY2Vpbmcgd2l0aCBMQUcgJWRcbiIsIGFnZ3JlZ2F0b3ItPmFnZ3JlZ2F0b3JfaWRlbnRpZmllciwgbmV3X2FnZ3JlZ2F0b3ItPmFnZ3JlZ2F0b3JfaWRlbnRpZmllcik7CisKKwkJCQlpZiAoKG5ld19hZ2dyZWdhdG9yLT5sYWdfcG9ydHMgPT0gcG9ydCkgJiYgbmV3X2FnZ3JlZ2F0b3ItPmlzX2FjdGl2ZSkgeworCQkJCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FICI6IFJlbW92aW5nIGFuIGFjdGl2ZSBhZ2dyZWdhdG9yXG4iKTsKKwkJCQkJLy8gc2VsZWN0IG5ldyBhY3RpdmUgYWdncmVnYXRvcgorCQkJCQkgc2VsZWN0X25ld19hY3RpdmVfYWdnID0gMTsKKwkJCQl9CisKKwkJCQluZXdfYWdncmVnYXRvci0+aXNfaW5kaXZpZHVhbCA9IGFnZ3JlZ2F0b3ItPmlzX2luZGl2aWR1YWw7CisJCQkJbmV3X2FnZ3JlZ2F0b3ItPmFjdG9yX2FkbWluX2FnZ3JlZ2F0b3Jfa2V5ID0gYWdncmVnYXRvci0+YWN0b3JfYWRtaW5fYWdncmVnYXRvcl9rZXk7CisJCQkJbmV3X2FnZ3JlZ2F0b3ItPmFjdG9yX29wZXJfYWdncmVnYXRvcl9rZXkgPSBhZ2dyZWdhdG9yLT5hY3Rvcl9vcGVyX2FnZ3JlZ2F0b3Jfa2V5OworCQkJCW5ld19hZ2dyZWdhdG9yLT5wYXJ0bmVyX3N5c3RlbSA9IGFnZ3JlZ2F0b3ItPnBhcnRuZXJfc3lzdGVtOworCQkJCW5ld19hZ2dyZWdhdG9yLT5wYXJ0bmVyX3N5c3RlbV9wcmlvcml0eSA9IGFnZ3JlZ2F0b3ItPnBhcnRuZXJfc3lzdGVtX3ByaW9yaXR5OworCQkJCW5ld19hZ2dyZWdhdG9yLT5wYXJ0bmVyX29wZXJfYWdncmVnYXRvcl9rZXkgPSBhZ2dyZWdhdG9yLT5wYXJ0bmVyX29wZXJfYWdncmVnYXRvcl9rZXk7CisJCQkJbmV3X2FnZ3JlZ2F0b3ItPnJlY2VpdmVfc3RhdGUgPSBhZ2dyZWdhdG9yLT5yZWNlaXZlX3N0YXRlOworCQkJCW5ld19hZ2dyZWdhdG9yLT50cmFuc21pdF9zdGF0ZSA9IGFnZ3JlZ2F0b3ItPnRyYW5zbWl0X3N0YXRlOworCQkJCW5ld19hZ2dyZWdhdG9yLT5sYWdfcG9ydHMgPSBhZ2dyZWdhdG9yLT5sYWdfcG9ydHM7CisJCQkJbmV3X2FnZ3JlZ2F0b3ItPmlzX2FjdGl2ZSA9IGFnZ3JlZ2F0b3ItPmlzX2FjdGl2ZTsKKwkJCQluZXdfYWdncmVnYXRvci0+bnVtX29mX3BvcnRzID0gYWdncmVnYXRvci0+bnVtX29mX3BvcnRzOworCisJCQkJLy8gdXBkYXRlIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGlzIHdyaXR0ZW4gb24gdGhlIHBvcnRzIGFib3V0IHRoZSBhZ2dyZWdhdG9yCisJCQkJZm9yICh0ZW1wX3BvcnQ9YWdncmVnYXRvci0+bGFnX3BvcnRzOyB0ZW1wX3BvcnQ7IHRlbXBfcG9ydD10ZW1wX3BvcnQtPm5leHRfcG9ydF9pbl9hZ2dyZWdhdG9yKSB7CisJCQkJCXRlbXBfcG9ydC0+YWdncmVnYXRvcj1uZXdfYWdncmVnYXRvcjsKKwkJCQkJdGVtcF9wb3J0LT5hY3Rvcl9wb3J0X2FnZ3JlZ2F0b3JfaWRlbnRpZmllciA9IG5ld19hZ2dyZWdhdG9yLT5hZ2dyZWdhdG9yX2lkZW50aWZpZXI7CisJCQkJfQorCisJCQkJLy8gY2xlYXIgdGhlIGFnZ3JlZ2F0b3IKKwkJCQlhZF9jbGVhcl9hZ2coYWdncmVnYXRvcik7CisJCQkJCisJCQkJaWYgKHNlbGVjdF9uZXdfYWN0aXZlX2FnZykgeworCQkJCQlhZF9hZ2dfc2VsZWN0aW9uX2xvZ2ljKF9fZ2V0X2ZpcnN0X2FnZyhwb3J0KSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6IFdhcm5pbmc6IHVuYmluZGluZyBhZ2dyZWdhdG9yLCAiCisJCQkJICAgICAgICJhbmQgY291bGQgbm90IGZpbmQgYSBuZXcgYWdncmVnYXRvciBmb3IgaXRzIHBvcnRzXG4iKTsKKwkJCX0KKwkJfSBlbHNlIHsgLy8gaW4gY2FzZSB0aGF0IHRoZSBvbmx5IHBvcnQgcmVsYXRlZCB0byB0aGlzIGFnZ3JlZ2F0b3IgaXMgdGhlIG9uZSB3ZSB3YW50IHRvIHJlbW92ZQorCQkJc2VsZWN0X25ld19hY3RpdmVfYWdnID0gYWdncmVnYXRvci0+aXNfYWN0aXZlOworCQkJLy8gY2xlYXIgdGhlIGFnZ3JlZ2F0b3IKKwkJCWFkX2NsZWFyX2FnZyhhZ2dyZWdhdG9yKTsKKwkJCWlmIChzZWxlY3RfbmV3X2FjdGl2ZV9hZ2cpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJSZW1vdmluZyBhbiBhY3RpdmUgYWdncmVnYXRvclxuIik7CisJCQkJLy8gc2VsZWN0IG5ldyBhY3RpdmUgYWdncmVnYXRvcgorCQkJCWFkX2FnZ19zZWxlY3Rpb25fbG9naWMoX19nZXRfZmlyc3RfYWdnKHBvcnQpKTsKKwkJCX0KKwkJfQorCX0KKworCWRwcmludGsoIlVuYmluZGluZyBwb3J0ICVkXG4iLCBwb3J0LT5hY3Rvcl9wb3J0X251bWJlcik7CisJLy8gZmluZCB0aGUgYWdncmVnYXRvciB0aGF0IHRoaXMgcG9ydCBpcyBjb25uZWN0ZWQgdG8KKwl0ZW1wX2FnZ3JlZ2F0b3IgPSBfX2dldF9maXJzdF9hZ2cocG9ydCk7CisJZm9yICg7IHRlbXBfYWdncmVnYXRvcjsgdGVtcF9hZ2dyZWdhdG9yID0gX19nZXRfbmV4dF9hZ2codGVtcF9hZ2dyZWdhdG9yKSkgeworCQlwcmV2X3BvcnQgPSBOVUxMOworCQkvLyBzZWFyY2ggdGhlIHBvcnQgaW4gdGhlIGFnZ3JlZ2F0b3IncyByZWxhdGVkIHBvcnRzCisJCWZvciAodGVtcF9wb3J0PXRlbXBfYWdncmVnYXRvci0+bGFnX3BvcnRzOyB0ZW1wX3BvcnQ7IHByZXZfcG9ydD10ZW1wX3BvcnQsIHRlbXBfcG9ydD10ZW1wX3BvcnQtPm5leHRfcG9ydF9pbl9hZ2dyZWdhdG9yKSB7CisJCQlpZiAodGVtcF9wb3J0ID09IHBvcnQpIHsgLy8gdGhlIGFnZ3JlZ2F0b3IgZm91bmQgLSBkZXRhY2ggdGhlIHBvcnQgZnJvbSB0aGlzIGFnZ3JlZ2F0b3IKKwkJCQlpZiAocHJldl9wb3J0KSB7CisJCQkJCXByZXZfcG9ydC0+bmV4dF9wb3J0X2luX2FnZ3JlZ2F0b3IgPSB0ZW1wX3BvcnQtPm5leHRfcG9ydF9pbl9hZ2dyZWdhdG9yOworCQkJCX0gZWxzZSB7CisJCQkJCXRlbXBfYWdncmVnYXRvci0+bGFnX3BvcnRzID0gdGVtcF9wb3J0LT5uZXh0X3BvcnRfaW5fYWdncmVnYXRvcjsKKwkJCQl9CisJCQkJdGVtcF9hZ2dyZWdhdG9yLT5udW1fb2ZfcG9ydHMtLTsKKwkJCQlpZiAodGVtcF9hZ2dyZWdhdG9yLT5udW1fb2ZfcG9ydHM9PTApIHsKKwkJCQkJc2VsZWN0X25ld19hY3RpdmVfYWdnID0gdGVtcF9hZ2dyZWdhdG9yLT5pc19hY3RpdmU7CisJCQkJCS8vIGNsZWFyIHRoZSBhZ2dyZWdhdG9yCisJCQkJCWFkX2NsZWFyX2FnZyh0ZW1wX2FnZ3JlZ2F0b3IpOworCQkJCQlpZiAoc2VsZWN0X25ld19hY3RpdmVfYWdnKSB7CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICJSZW1vdmluZyBhbiBhY3RpdmUgYWdncmVnYXRvclxuIik7CisJCQkJCQkvLyBzZWxlY3QgbmV3IGFjdGl2ZSBhZ2dyZWdhdG9yCisJCQkJCQlhZF9hZ2dfc2VsZWN0aW9uX2xvZ2ljKF9fZ2V0X2ZpcnN0X2FnZyhwb3J0KSk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcG9ydC0+c2xhdmU9TlVMTDsJCit9CisKKy8qKgorICogYm9uZF8zYWRfc3RhdGVfbWFjaGluZV9oYW5kbGVyIC0gaGFuZGxlIHN0YXRlIG1hY2hpbmVzIHRpbWVvdXQKKyAqIEBib25kOiBib25kaW5nIHN0cnVjdCB0byB3b3JrIG9uCisgKgorICogVGhlIHN0YXRlIG1hY2hpbmUgaGFuZGxpbmcgY29uY2VwdCBpbiB0aGlzIG1vZHVsZSBpcyB0byBjaGVjayBldmVyeSB0aWNrCisgKiB3aGljaCBzdGF0ZSBtYWNoaW5lIHNob3VsZCBvcGVyYXRlIGFueSBmdW5jdGlvbi4gVGhlIGV4ZWN1dGlvbiBvcmRlciBpcworICogcm91bmQgcm9iaW4sIHNvIHdoZW4gd2UgaGF2ZSBhbiBpbnRlcmFjdGlvbiBiZXR3ZWVuIHN0YXRlIG1hY2hpbmVzLCB0aGUKKyAqIHJlcGx5IG9mIG9uZSB0byBlYWNoIG90aGVyIG1pZ2h0IGJlIGRlbGF5ZWQgdW50aWwgbmV4dCB0aWNrLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYWxzbyBjb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gd2hlbiB0aGUgYWdnX3NlbGVjdF90aW1lcgorICogdGltZXMgb3V0LCBhbmQgaXQgc2VsZWN0cyBhbiBhZ2dyZWdhdG9yIGZvciB0aGUgcG9ydHMgdGhhdCBhcmUgeWV0IG5vdAorICogcmVsYXRlZCB0byBhbnkgYWdncmVnYXRvciwgYW5kIHNlbGVjdHMgdGhlIGFjdGl2ZSBhZ2dyZWdhdG9yIGZvciBhIGJvbmQuCisgKi8KK3ZvaWQgYm9uZF8zYWRfc3RhdGVfbWFjaGluZV9oYW5kbGVyKHN0cnVjdCBib25kaW5nICpib25kKQoreworCXN0cnVjdCBwb3J0ICpwb3J0OworCXN0cnVjdCBhZ2dyZWdhdG9yICphZ2dyZWdhdG9yOworCisJcmVhZF9sb2NrKCZib25kLT5sb2NrKTsKKworCWlmIChib25kLT5raWxsX3RpbWVycykgeworCQlnb3RvIG91dDsKKwl9CisKKwkvL2NoZWNrIGlmIHRoZXJlIGFyZSBhbnkgc2xhdmVzCisJaWYgKGJvbmQtPnNsYXZlX2NudCA9PSAwKSB7CisJCWdvdG8gcmVfYXJtOworCX0KKworCS8vIGNoZWNrIGlmIGFnZ19zZWxlY3RfdGltZXIgdGltZXIgYWZ0ZXIgaW5pdGlhbGl6ZSBpcyB0aW1lZCBvdXQKKwlpZiAoQk9ORF9BRF9JTkZPKGJvbmQpLmFnZ19zZWxlY3RfdGltZXIgJiYgISgtLUJPTkRfQURfSU5GTyhib25kKS5hZ2dfc2VsZWN0X3RpbWVyKSkgeworCQkvLyBzZWxlY3QgdGhlIGFjdGl2ZSBhZ2dyZWdhdG9yIGZvciB0aGUgYm9uZAorCQlpZiAoKHBvcnQgPSBfX2dldF9maXJzdF9wb3J0KGJvbmQpKSkgeworCQkJaWYgKCFwb3J0LT5zbGF2ZSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUgIjogV2FybmluZzogYm9uZCdzIGZpcnN0IHBvcnQgaXMgdW5pbml0aWFsaXplZFxuIik7CisJCQkJZ290byByZV9hcm07CisJCQl9CisKKwkJCWFnZ3JlZ2F0b3IgPSBfX2dldF9maXJzdF9hZ2cocG9ydCk7CisJCQlhZF9hZ2dfc2VsZWN0aW9uX2xvZ2ljKGFnZ3JlZ2F0b3IpOworCQl9CisJfQorCisJLy8gZm9yIGVhY2ggcG9ydCBydW4gdGhlIHN0YXRlIG1hY2hpbmVzCisJZm9yIChwb3J0ID0gX19nZXRfZmlyc3RfcG9ydChib25kKTsgcG9ydDsgcG9ydCA9IF9fZ2V0X25leHRfcG9ydChwb3J0KSkgeworCQlpZiAoIXBvcnQtPnNsYXZlKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6IFdhcm5pbmc6IEZvdW5kIGFuIHVuaW5pdGlhbGl6ZWQgcG9ydFxuIik7CisJCQlnb3RvIHJlX2FybTsKKwkJfQorCisJCWFkX3J4X21hY2hpbmUoTlVMTCwgcG9ydCk7CisJCWFkX3BlcmlvZGljX21hY2hpbmUocG9ydCk7CisJCWFkX3BvcnRfc2VsZWN0aW9uX2xvZ2ljKHBvcnQpOworCQlhZF9tdXhfbWFjaGluZShwb3J0KTsKKwkJYWRfdHhfbWFjaGluZShwb3J0KTsKKworCQkvLyB0dXJuIG9mZiB0aGUgQkVHSU4gYml0LCBzaW5jZSB3ZSBhbHJlYWR5IGhhbmRsZWQgaXQKKwkJaWYgKHBvcnQtPnNtX3ZhcnMgJiBBRF9QT1JUX0JFR0lOKSB7CisJCQlwb3J0LT5zbV92YXJzICY9IH5BRF9QT1JUX0JFR0lOOworCQl9CisJfQorCityZV9hcm06CisJbW9kX3RpbWVyKCYoQk9ORF9BRF9JTkZPKGJvbmQpLmFkX3RpbWVyKSwgamlmZmllcyArIGFkX2RlbHRhX2luX3RpY2tzKTsKK291dDoKKwlyZWFkX3VubG9jaygmYm9uZC0+bG9jayk7Cit9CisKKy8qKgorICogYm9uZF8zYWRfcnhfaW5kaWNhdGlvbiAtIGhhbmRsZSBhIHJlY2VpdmVkIGZyYW1lCisgKiBAbGFjcGR1OiByZWNlaXZlZCBsYWNwZHUKKyAqIEBzbGF2ZTogc2xhdmUgc3RydWN0IHRvIHdvcmsgb24KKyAqIEBsZW5ndGg6IGxlbmd0aCBvZiB0aGUgZGF0YSByZWNlaXZlZAorICoKKyAqIEl0IGlzIGFzc3VtZWQgdGhhdCBmcmFtZXMgdGhhdCB3ZXJlIHNlbnQgb24gdGhpcyBOSUMgZG9uJ3QgcmV0dXJuZWQgYXMgbmV3CisgKiByZWNlaXZlZCBmcmFtZXMgKGxvb3BiYWNrKS4gU2luY2Ugb25seSB0aGUgcGF5bG9hZCBpcyBnaXZlbiB0byB0aGlzCisgKiBmdW5jdGlvbiwgaXQgY2hlY2sgZm9yIGxvb3BiYWNrLgorICovCitzdGF0aWMgdm9pZCBib25kXzNhZF9yeF9pbmRpY2F0aW9uKHN0cnVjdCBsYWNwZHUgKmxhY3BkdSwgc3RydWN0IHNsYXZlICpzbGF2ZSwgdTE2IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgcG9ydCAqcG9ydDsKKworCWlmIChsZW5ndGggPj0gc2l6ZW9mKHN0cnVjdCBsYWNwZHUpKSB7CisKKwkJcG9ydCA9ICYoU0xBVkVfQURfSU5GTyhzbGF2ZSkucG9ydCk7CisKKwkJaWYgKCFwb3J0LT5zbGF2ZSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRSAiOiBXYXJuaW5nOiBwb3J0IG9mIHNsYXZlICVzIGlzIHVuaW5pdGlhbGl6ZWRcbiIsIHNsYXZlLT5kZXYtPm5hbWUpOworCQkJcmV0dXJuOworCQl9CisKKwkJc3dpdGNoIChsYWNwZHUtPnN1YnR5cGUpIHsKKwkJY2FzZSBBRF9UWVBFX0xBQ1BEVToKKwkJCV9fbnRvaHNfbGFjcGR1KGxhY3BkdSk7CisJCQlkcHJpbnRrKCJSZWNlaXZlZCBMQUNQRFUgb24gcG9ydCAlZFxuIiwgcG9ydC0+YWN0b3JfcG9ydF9udW1iZXIpOworCQkJYWRfcnhfbWFjaGluZShsYWNwZHUsIHBvcnQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBRF9UWVBFX01BUktFUjoKKwkJCS8vIE5vIG5lZWQgdG8gY29udmVydCBmaWVsZHMgdG8gTGl0dGxlIEVuZGlhbiBzaW5jZSB3ZSBkb24ndCB1c2UgdGhlIG1hcmtlcidzIGZpZWxkcy4KKworCQkJc3dpdGNoICgoKHN0cnVjdCBtYXJrZXIgKilsYWNwZHUpLT50bHZfdHlwZSkgeworCQkJY2FzZSBBRF9NQVJLRVJfSU5GT1JNQVRJT05fU1VCVFlQRToKKwkJCQlkcHJpbnRrKCJSZWNlaXZlZCBNYXJrZXIgSW5mb3JtYXRpb24gb24gcG9ydCAlZFxuIiwgcG9ydC0+YWN0b3JfcG9ydF9udW1iZXIpOworCQkJCWFkX21hcmtlcl9pbmZvX3JlY2VpdmVkKChzdHJ1Y3QgbWFya2VyICopbGFjcGR1LCBwb3J0KTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBRF9NQVJLRVJfUkVTUE9OU0VfU1VCVFlQRToKKwkJCQlkcHJpbnRrKCJSZWNlaXZlZCBNYXJrZXIgUmVzcG9uc2Ugb24gcG9ydCAlZFxuIiwgcG9ydC0+YWN0b3JfcG9ydF9udW1iZXIpOworCQkJCWFkX21hcmtlcl9yZXNwb25zZV9yZWNlaXZlZCgoc3RydWN0IG1hcmtlciAqKWxhY3BkdSwgcG9ydCk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJZHByaW50aygiUmVjZWl2ZWQgYW4gdW5rbm93biBNYXJrZXIgc3VidHlwZSBvbiBzbG90ICVkXG4iLCBwb3J0LT5hY3Rvcl9wb3J0X251bWJlcik7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qKgorICogYm9uZF8zYWRfYWRhcHRlcl9zcGVlZF9jaGFuZ2VkIC0gaGFuZGxlIGEgc2xhdmUncyBzcGVlZCBjaGFuZ2UgaW5kaWNhdGlvbgorICogQHNsYXZlOiBzbGF2ZSBzdHJ1Y3QgdG8gd29yayBvbgorICoKKyAqIEhhbmRsZSByZXNlbGVjdGlvbiBvZiBhZ2dyZWdhdG9yIChpZiBuZWVkZWQpIGZvciB0aGlzIHBvcnQuCisgKi8KK3ZvaWQgYm9uZF8zYWRfYWRhcHRlcl9zcGVlZF9jaGFuZ2VkKHN0cnVjdCBzbGF2ZSAqc2xhdmUpCit7CisJc3RydWN0IHBvcnQgKnBvcnQ7CisKKwlwb3J0ID0gJihTTEFWRV9BRF9JTkZPKHNsYXZlKS5wb3J0KTsKKworCS8vIGlmIHNsYXZlIGlzIG51bGwsIHRoZSB3aG9sZSBwb3J0IGlzIG5vdCBpbml0aWFsaXplZAorCWlmICghcG9ydC0+c2xhdmUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRSAiOiBXYXJuaW5nOiBzcGVlZCBjaGFuZ2VkIGZvciB1bmluaXRpYWxpemVkIHBvcnQgb24gJXNcbiIsCisJCSAgICAgICBzbGF2ZS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXBvcnQtPmFjdG9yX2FkbWluX3BvcnRfa2V5ICY9IH5BRF9TUEVFRF9LRVlfQklUUzsKKwlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfa2V5PXBvcnQtPmFjdG9yX2FkbWluX3BvcnRfa2V5IHw9IChfX2dldF9saW5rX3NwZWVkKHBvcnQpIDw8IDEpOworCWRwcmludGsoIlBvcnQgJWQgY2hhbmdlZCBzcGVlZFxuIiwgcG9ydC0+YWN0b3JfcG9ydF9udW1iZXIpOworCS8vIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVzZWxlY3QgYSBuZXcgYWdncmVnYXRvciwganVzdCBzaWduYWwgdGhlCisJLy8gc3RhdGUgbWFjaGluZXMgdG8gcmVpbml0aWFsaXplCisJcG9ydC0+c21fdmFycyB8PSBBRF9QT1JUX0JFR0lOOworfQorCisvKioKKyAqIGJvbmRfM2FkX2FkYXB0ZXJfZHVwbGV4X2NoYW5nZWQgLSBoYW5kbGUgYSBzbGF2ZSdzIGR1cGxleCBjaGFuZ2UgaW5kaWNhdGlvbgorICogQHNsYXZlOiBzbGF2ZSBzdHJ1Y3QgdG8gd29yayBvbgorICoKKyAqIEhhbmRsZSByZXNlbGVjdGlvbiBvZiBhZ2dyZWdhdG9yIChpZiBuZWVkZWQpIGZvciB0aGlzIHBvcnQuCisgKi8KK3ZvaWQgYm9uZF8zYWRfYWRhcHRlcl9kdXBsZXhfY2hhbmdlZChzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQoreworCXN0cnVjdCBwb3J0ICpwb3J0OworCisJcG9ydD0mKFNMQVZFX0FEX0lORk8oc2xhdmUpLnBvcnQpOworCisJLy8gaWYgc2xhdmUgaXMgbnVsbCwgdGhlIHdob2xlIHBvcnQgaXMgbm90IGluaXRpYWxpemVkCisJaWYgKCFwb3J0LT5zbGF2ZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6IFdhcm5pbmc6IGR1cGxleCBjaGFuZ2VkIGZvciB1bmluaXRpYWxpemVkIHBvcnQgb24gJXNcbiIsCisJCSAgICAgICBzbGF2ZS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXBvcnQtPmFjdG9yX2FkbWluX3BvcnRfa2V5ICY9IH5BRF9EVVBMRVhfS0VZX0JJVFM7CisJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X2tleT1wb3J0LT5hY3Rvcl9hZG1pbl9wb3J0X2tleSB8PSBfX2dldF9kdXBsZXgocG9ydCk7CisJZHByaW50aygiUG9ydCAlZCBjaGFuZ2VkIGR1cGxleFxuIiwgcG9ydC0+YWN0b3JfcG9ydF9udW1iZXIpOworCS8vIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVzZWxlY3QgYSBuZXcgYWdncmVnYXRvciwganVzdCBzaWduYWwgdGhlCisJLy8gc3RhdGUgbWFjaGluZXMgdG8gcmVpbml0aWFsaXplCisJcG9ydC0+c21fdmFycyB8PSBBRF9QT1JUX0JFR0lOOworfQorCisvKioKKyAqIGJvbmRfM2FkX2hhbmRsZV9saW5rX2NoYW5nZSAtIGhhbmRsZSBhIHNsYXZlJ3MgbGluayBzdGF0dXMgY2hhbmdlIGluZGljYXRpb24KKyAqIEBzbGF2ZTogc2xhdmUgc3RydWN0IHRvIHdvcmsgb24KKyAqIEBzdGF0dXM6IHdoZXRoZXIgdGhlIGxpbmsgaXMgbm93IHVwIG9yIGRvd24KKyAqCisgKiBIYW5kbGUgcmVzZWxlY3Rpb24gb2YgYWdncmVnYXRvciAoaWYgbmVlZGVkKSBmb3IgdGhpcyBwb3J0LgorICovCit2b2lkIGJvbmRfM2FkX2hhbmRsZV9saW5rX2NoYW5nZShzdHJ1Y3Qgc2xhdmUgKnNsYXZlLCBjaGFyIGxpbmspCit7CisJc3RydWN0IHBvcnQgKnBvcnQ7CisKKwlwb3J0ID0gJihTTEFWRV9BRF9JTkZPKHNsYXZlKS5wb3J0KTsKKworCS8vIGlmIHNsYXZlIGlzIG51bGwsIHRoZSB3aG9sZSBwb3J0IGlzIG5vdCBpbml0aWFsaXplZAorCWlmICghcG9ydC0+c2xhdmUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRSAiOiBXYXJuaW5nOiBsaW5rIHN0YXR1cyBjaGFuZ2VkIGZvciB1bmluaXRpYWxpemVkIHBvcnQgb24gJXNcbiIsCisJCQlzbGF2ZS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8vIG9uIGxpbmsgZG93biB3ZSBhcmUgemVyb2luZyBkdXBsZXggYW5kIHNwZWVkIHNpbmNlIHNvbWUgb2YgdGhlIGFkYXB0b3JzKGNlMTAwMC5sYW4pIHJlcG9ydCBmdWxsIGR1cGxleC9zcGVlZCBpbnN0ZWFkIG9mIE4vQShkdXBsZXgpIC8gMChzcGVlZCkKKwkvLyBvbiBsaW5rIHVwIHdlIGFyZSBmb3JjaW5nIHJlY2hlY2sgb24gdGhlIGR1cGxleCBhbmQgc3BlZWQgc2luY2Ugc29tZSBvZiBoZSBhZGFwdG9ycyhjZTEwMDAubGFuKSByZXBvcnQKKwlpZiAobGluayA9PSBCT05EX0xJTktfVVApIHsKKwkJcG9ydC0+aXNfZW5hYmxlZCA9IDE7CisJCXBvcnQtPmFjdG9yX2FkbWluX3BvcnRfa2V5ICY9IH5BRF9EVVBMRVhfS0VZX0JJVFM7CisJCXBvcnQtPmFjdG9yX29wZXJfcG9ydF9rZXk9cG9ydC0+YWN0b3JfYWRtaW5fcG9ydF9rZXkgfD0gX19nZXRfZHVwbGV4KHBvcnQpOworCQlwb3J0LT5hY3Rvcl9hZG1pbl9wb3J0X2tleSAmPSB+QURfU1BFRURfS0VZX0JJVFM7CisJCXBvcnQtPmFjdG9yX29wZXJfcG9ydF9rZXk9cG9ydC0+YWN0b3JfYWRtaW5fcG9ydF9rZXkgfD0gKF9fZ2V0X2xpbmtfc3BlZWQocG9ydCkgPDwgMSk7CisJfSBlbHNlIHsKKwkJLyogbGluayBoYXMgZmFpbGVkICovCisJCXBvcnQtPmlzX2VuYWJsZWQgPSAwOworCQlwb3J0LT5hY3Rvcl9hZG1pbl9wb3J0X2tleSAmPSB+QURfRFVQTEVYX0tFWV9CSVRTOworCQlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfa2V5PSAocG9ydC0+YWN0b3JfYWRtaW5fcG9ydF9rZXkgJj0gfkFEX1NQRUVEX0tFWV9CSVRTKTsKKwl9CisJLy9CT05EX1BSSU5UX0RCRygoIlBvcnQgJWQgY2hhbmdlZCBsaW5rIHN0YXR1cyB0byAlcyIsIHBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyLCAoKGxpbmsgPT0gQk9ORF9MSU5LX1VQKT8iVVAiOiJET1dOIikpKTsKKwkvLyB0aGVyZSBpcyBubyBuZWVkIHRvIHJlc2VsZWN0IGEgbmV3IGFnZ3JlZ2F0b3IsIGp1c3Qgc2lnbmFsIHRoZQorCS8vIHN0YXRlIG1hY2hpbmVzIHRvIHJlaW5pdGlhbGl6ZQorCXBvcnQtPnNtX3ZhcnMgfD0gQURfUE9SVF9CRUdJTjsKK30KKworLyoqCisgKiBib25kXzNhZF9nZXRfYWN0aXZlX2FnZ19pbmZvIC0gZ2V0IGluZm9ybWF0aW9uIG9mIHRoZSBhY3RpdmUgYWdncmVnYXRvcgorICogQGJvbmQ6IGJvbmRpbmcgc3RydWN0IHRvIHdvcmsgb24KKyAqIEBhZF9pbmZvOiBhZF9pbmZvIHN0cnVjdCB0byBmaWxsIHdpdGggdGhlIGJvbmQncyBpbmZvCisgKgorICogUmV0dXJuczogICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgICAgIDwgMCBvbiBlcnJvcgorICovCitpbnQgYm9uZF8zYWRfZ2V0X2FjdGl2ZV9hZ2dfaW5mbyhzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IGFkX2luZm8gKmFkX2luZm8pCit7CisJc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZ3JlZ2F0b3IgPSBOVUxMOworCXN0cnVjdCBwb3J0ICpwb3J0OworCisJZm9yIChwb3J0ID0gX19nZXRfZmlyc3RfcG9ydChib25kKTsgcG9ydDsgcG9ydCA9IF9fZ2V0X25leHRfcG9ydChwb3J0KSkgeworCQlpZiAocG9ydC0+YWdncmVnYXRvciAmJiBwb3J0LT5hZ2dyZWdhdG9yLT5pc19hY3RpdmUpIHsKKwkJCWFnZ3JlZ2F0b3IgPSBwb3J0LT5hZ2dyZWdhdG9yOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoYWdncmVnYXRvcikgeworCQlhZF9pbmZvLT5hZ2dyZWdhdG9yX2lkID0gYWdncmVnYXRvci0+YWdncmVnYXRvcl9pZGVudGlmaWVyOworCQlhZF9pbmZvLT5wb3J0cyA9IGFnZ3JlZ2F0b3ItPm51bV9vZl9wb3J0czsKKwkJYWRfaW5mby0+YWN0b3Jfa2V5ID0gYWdncmVnYXRvci0+YWN0b3Jfb3Blcl9hZ2dyZWdhdG9yX2tleTsKKwkJYWRfaW5mby0+cGFydG5lcl9rZXkgPSBhZ2dyZWdhdG9yLT5wYXJ0bmVyX29wZXJfYWdncmVnYXRvcl9rZXk7CisJCW1lbWNweShhZF9pbmZvLT5wYXJ0bmVyX3N5c3RlbSwgYWdncmVnYXRvci0+cGFydG5lcl9zeXN0ZW0ubWFjX2FkZHJfdmFsdWUsIEVUSF9BTEVOKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC0xOworfQorCitpbnQgYm9uZF8zYWRfeG1pdF94b3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlLCAqc3RhcnRfYXQ7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBkZXYtPnByaXY7CisJc3RydWN0IGV0aGhkciAqZGF0YSA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOworCWludCBzbGF2ZV9hZ2dfbm87CisJaW50IHNsYXZlc19pbl9hZ2c7CisJaW50IGFnZ19pZDsKKwlpbnQgaTsKKwlzdHJ1Y3QgYWRfaW5mbyBhZF9pbmZvOworCWludCByZXMgPSAxOworCisJLyogbWFrZSBzdXJlIHRoYXQgdGhlIHNsYXZlcyBsaXN0IHdpbGwKKwkgKiBub3QgY2hhbmdlIGR1cmluZyB0eAorCSAqLworCXJlYWRfbG9jaygmYm9uZC0+bG9jayk7CisKKwlpZiAoIUJPTkRfSVNfT0soYm9uZCkpIHsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGJvbmRfM2FkX2dldF9hY3RpdmVfYWdnX2luZm8oYm9uZCwgJmFkX2luZm8pKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJFUlJPUjogYm9uZF8zYWRfZ2V0X2FjdGl2ZV9hZ2dfaW5mbyBmYWlsZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlzbGF2ZXNfaW5fYWdnID0gYWRfaW5mby5wb3J0czsKKwlhZ2dfaWQgPSBhZF9pbmZvLmFnZ3JlZ2F0b3JfaWQ7CisKKwlpZiAoc2xhdmVzX2luX2FnZyA9PSAwKSB7CisJCS8qdGhlIGFnZ3JlZ2F0b3IgaXMgZW1wdHkqLworCQlwcmludGsoS0VSTl9ERUJVRyAiRVJST1I6IGFjdGl2ZSBhZ2dyZWdhdG9yIGlzIGVtcHR5XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJc2xhdmVfYWdnX25vID0gKGRhdGEtPmhfZGVzdFs1XV5ib25kLT5kZXYtPmRldl9hZGRyWzVdKSAlIHNsYXZlc19pbl9hZ2c7CisKKwlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7CisJCXN0cnVjdCBhZ2dyZWdhdG9yICphZ2cgPSBTTEFWRV9BRF9JTkZPKHNsYXZlKS5wb3J0LmFnZ3JlZ2F0b3I7CisKKwkJaWYgKGFnZyAmJiAoYWdnLT5hZ2dyZWdhdG9yX2lkZW50aWZpZXIgPT0gYWdnX2lkKSkgeworCQkJc2xhdmVfYWdnX25vLS07CisJCQlpZiAoc2xhdmVfYWdnX25vIDwgMCkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKHNsYXZlX2FnZ19ubyA+PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiBFcnJvcjogQ291bGRuJ3QgZmluZCBhIHNsYXZlIHRvIHR4IG9uIGZvciBhZ2dyZWdhdG9yIElEICVkXG4iLCBhZ2dfaWQpOworCQlnb3RvIG91dDsKKwl9CisKKwlzdGFydF9hdCA9IHNsYXZlOworCisJYm9uZF9mb3JfZWFjaF9zbGF2ZV9mcm9tKGJvbmQsIHNsYXZlLCBpLCBzdGFydF9hdCkgeworCQlpbnQgc2xhdmVfYWdnX2lkID0gMDsKKwkJc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZyA9IFNMQVZFX0FEX0lORk8oc2xhdmUpLnBvcnQuYWdncmVnYXRvcjsKKworCQlpZiAoYWdnKSB7CisJCQlzbGF2ZV9hZ2dfaWQgPSBhZ2ctPmFnZ3JlZ2F0b3JfaWRlbnRpZmllcjsKKwkJfQorCisJCWlmIChTTEFWRV9JU19PSyhzbGF2ZSkgJiYgYWdnICYmIChzbGF2ZV9hZ2dfaWQgPT0gYWdnX2lkKSkgeworCQkJcmVzID0gYm9uZF9kZXZfcXVldWVfeG1pdChib25kLCBza2IsIHNsYXZlLT5kZXYpOworCQkJYnJlYWs7CisJCX0KKwl9CisKK291dDoKKwlpZiAocmVzKSB7CisJCS8qIG5vIHN1aXRhYmxlIGludGVyZmFjZSwgZnJhbWUgbm90IHNlbnQgKi8KKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0KKwlyZWFkX3VubG9jaygmYm9uZC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBib25kXzNhZF9sYWNwZHVfcmVjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcGFja2V0X3R5cGUqIHB0eXBlKQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gZGV2LT5wcml2OworCXN0cnVjdCBzbGF2ZSAqc2xhdmUgPSBOVUxMOworCWludCByZXQgPSBORVRfUlhfRFJPUDsKKworCWlmICghKGRldi0+ZmxhZ3MgJiBJRkZfTUFTVEVSKSkgeworCQlnb3RvIG91dDsKKwl9CisKKwlyZWFkX2xvY2soJmJvbmQtPmxvY2spOworCXNsYXZlID0gYm9uZF9nZXRfc2xhdmVfYnlfZGV2KChzdHJ1Y3QgYm9uZGluZyAqKWRldi0+cHJpdiwKKwkJCQkgICAgICBza2ItPnJlYWxfZGV2KTsKKwlpZiAoc2xhdmUgPT0gTlVMTCkgeworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJYm9uZF8zYWRfcnhfaW5kaWNhdGlvbigoc3RydWN0IGxhY3BkdSAqKSBza2ItPmRhdGEsIHNsYXZlLCBza2ItPmxlbik7CisKKwlyZXQgPSBORVRfUlhfU1VDQ0VTUzsKKworb3V0X3VubG9jazoKKwlyZWFkX3VubG9jaygmYm9uZC0+bG9jayk7CitvdXQ6CisJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIHJldDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kXzNhZC5oIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kXzNhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NjgyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfM2FkLmgKQEAgLTAsMCArMSwzMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqCisgKiBDaGFuZ2VzOgorICoKKyAqIDIwMDMvMDUvMDEgLSBUc2lwcHkgTWVuZGVsc29uIDx0c2lwcHkubWVuZGVsc29uIGF0IGludGVsIGRvdCBjb20+IGFuZAorICoJCUFtaXIgTm9hbSA8YW1pci5ub2FtIGF0IGludGVsIGRvdCBjb20+CisgKgktIEFkZGVkIHN1cHBvcnQgZm9yIGxhY3BfcmF0ZSBtb2R1bGUgcGFyYW0uCisgKgorICogMjAwMy8wNS8wMSAtIFNobXVsaWsgSGVuIDxzaG11bGlrLmhlbiBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBSZW5hbWVkIGJvbmRfM2FkX2xpbmtfc3RhdHVzX2NoYW5nZWQoKSB0bworICoJICBib25kXzNhZF9oYW5kbGVfbGlua19jaGFuZ2UoKSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFRMQi4KKyAqCisgKiAyMDAzLzEyLzAxIC0gU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKgktIENvZGUgY2xlYW51cCBhbmQgc3R5bGUgY2hhbmdlcworICovCisKKyNpZm5kZWYgX19CT05EXzNBRF9IX18KKyNkZWZpbmUgX19CT05EXzNBRF9IX18KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworLy8gR2VuZXJhbCBkZWZpbml0aW9ucworI2RlZmluZSBCT05EX0VUSF9QX0xBQ1BEVSAgICAgICAweDg4MDkKKyNkZWZpbmUgUEtUX1RZUEVfTEFDUERVICAgICAgICAgX19jb25zdGFudF9odG9ucyhCT05EX0VUSF9QX0xBQ1BEVSkKKyNkZWZpbmUgQURfVElNRVJfSU5URVJWQUwgICAgICAgMTAwIC8qbXNlYyovCisKKyNkZWZpbmUgTVVMVElDQVNUX0xBQ1BEVV9BRERSICAgIHsweDAxLCAweDgwLCAweEMyLCAweDAwLCAweDAwLCAweDAyfQorI2RlZmluZSBBRF9NVUxUSUNBU1RfTEFDUERVX0FERFIgICAge01VTFRJQ0FTVF9MQUNQRFVfQUREUn0KKworI2RlZmluZSBBRF9MQUNQX1NMT1cgMAorI2RlZmluZSBBRF9MQUNQX0ZBU1QgMQorCit0eXBlZGVmIHN0cnVjdCBtYWNfYWRkciB7CisJdTggbWFjX2FkZHJfdmFsdWVbRVRIX0FMRU5dOworfSBtYWNfYWRkcl90OworCit0eXBlZGVmIGVudW0geworCUFEX0JBTkRXSURUSCA9IDAsCisJQURfQ09VTlQKK30gYWdnX3NlbGVjdGlvbl90OworCisvLyByeCBtYWNoaW5lIHN0YXRlcyg0My40LjExIGluIHRoZSA4MDIuM2FkIHN0YW5kYXJkKQordHlwZWRlZiBlbnVtIHsKKwlBRF9SWF9EVU1NWSwKKwlBRF9SWF9JTklUSUFMSVpFLCAgICAgLy8gcnggTWFjaGluZQorCUFEX1JYX1BPUlRfRElTQUJMRUQsICAvLyByeCBNYWNoaW5lCisJQURfUlhfTEFDUF9ESVNBQkxFRCwgIC8vIHJ4IE1hY2hpbmUKKwlBRF9SWF9FWFBJUkVELAkgICAgICAvLyByeCBNYWNoaW5lCisJQURfUlhfREVGQVVMVEVELCAgICAgIC8vIHJ4IE1hY2hpbmUKKwlBRF9SWF9DVVJSRU5UCSAgICAgIC8vIHJ4IE1hY2hpbmUKK30gcnhfc3RhdGVzX3Q7CisKKy8vIHBlcmlvZGljIG1hY2hpbmUgc3RhdGVzKDQzLjQuMTIgaW4gdGhlIDgwMi4zYWQgc3RhbmRhcmQpCit0eXBlZGVmIGVudW0geworCUFEX1BFUklPRElDX0RVTU1ZLAorCUFEX05PX1BFUklPRElDLAkgICAgICAgLy8gcGVyaW9kaWMgbWFjaGluZQorCUFEX0ZBU1RfUEVSSU9ESUMsICAgICAgLy8gcGVyaW9kaWMgbWFjaGluZQorCUFEX1NMT1dfUEVSSU9ESUMsICAgICAgLy8gcGVyaW9kaWMgbWFjaGluZQorCUFEX1BFUklPRElDX1RYCSAgIC8vIHBlcmlvZGljIG1hY2hpbmUKK30gcGVyaW9kaWNfc3RhdGVzX3Q7CisKKy8vIG11eCBtYWNoaW5lIHN0YXRlcyg0My40LjEzIGluIHRoZSA4MDIuM2FkIHN0YW5kYXJkKQordHlwZWRlZiBlbnVtIHsKKwlBRF9NVVhfRFVNTVksCisJQURfTVVYX0RFVEFDSEVELCAgICAgICAvLyBtdXggbWFjaGluZQorCUFEX01VWF9XQUlUSU5HLAkgICAgICAgLy8gbXV4IG1hY2hpbmUKKwlBRF9NVVhfQVRUQUNIRUQsICAgICAgIC8vIG11eCBtYWNoaW5lCisJQURfTVVYX0NPTExFQ1RJTkdfRElTVFJJQlVUSU5HIC8vIG11eCBtYWNoaW5lCit9IG11eF9zdGF0ZXNfdDsKKworLy8gdHggbWFjaGluZSBzdGF0ZXMoNDMuNC4xNSBpbiB0aGUgODAyLjNhZCBzdGFuZGFyZCkKK3R5cGVkZWYgZW51bSB7CisJQURfVFhfRFVNTVksCisJQURfVFJBTlNNSVQJICAgLy8gdHggTWFjaGluZQorfSB0eF9zdGF0ZXNfdDsKKworLy8gcnggaW5kaWNhdGlvbiB0eXBlcwordHlwZWRlZiBlbnVtIHsKKwlBRF9UWVBFX0xBQ1BEVSA9IDEsICAgIC8vIHR5cGUgbGFjcGR1CisJQURfVFlQRV9NQVJLRVIJICAgLy8gdHlwZSBtYXJrZXIKK30gcGR1X3R5cGVfdDsKKworLy8gcnggbWFya2VyIGluZGljYXRpb24gdHlwZXMKK3R5cGVkZWYgZW51bSB7CisJQURfTUFSS0VSX0lORk9STUFUSU9OX1NVQlRZUEUgPSAxLCAvLyBtYXJrZXIgaW1mb3JtYXRpb24gc3VidHlwZQorCUFEX01BUktFUl9SRVNQT05TRV9TVUJUWVBFICAgICAvLyBtYXJrZXIgcmVzcG9uc2Ugc3VidHlwZQorfSBtYXJrZXJfc3VidHlwZV90OworCisvLyB0aW1lcnMgdHlwZXMoNDMuNC45IGluIHRoZSA4MDIuM2FkIHN0YW5kYXJkKQordHlwZWRlZiBlbnVtIHsKKwlBRF9DVVJSRU5UX1dISUxFX1RJTUVSLAorCUFEX0FDVE9SX0NIVVJOX1RJTUVSLAorCUFEX1BFUklPRElDX1RJTUVSLAorCUFEX1BBUlRORVJfQ0hVUk5fVElNRVIsCisJQURfV0FJVF9XSElMRV9USU1FUgorfSBhZF90aW1lcnNfdDsKKworI3ByYWdtYSBwYWNrKDEpCisKK3R5cGVkZWYgc3RydWN0IGFkX2hlYWRlciB7CisJc3RydWN0IG1hY19hZGRyIGRlc3RpbmF0aW9uX2FkZHJlc3M7CisJc3RydWN0IG1hY19hZGRyIHNvdXJjZV9hZGRyZXNzOworCXUxNiBsZW5ndGhfdHlwZTsKK30gYWRfaGVhZGVyX3Q7CisKKy8vIExpbmsgQWdncmVnYXRpb24gQ29udHJvbCBQcm90b2NvbChMQUNQKSBkYXRhIHVuaXQgc3RydWN0dXJlKDQzLjQuMi4yIGluIHRoZSA4MDIuM2FkIHN0YW5kYXJkKQordHlwZWRlZiBzdHJ1Y3QgbGFjcGR1IHsKKwl1OCBzdWJ0eXBlOwkJICAgICAvLyA9IExBQ1AoPSAweDAxKQorCXU4IHZlcnNpb25fbnVtYmVyOworCXU4IHRsdl90eXBlX2FjdG9yX2luZm87CSAgICAgIC8vID0gYWN0b3IgaW5mb3JtYXRpb24odHlwZS9sZW5ndGgvdmFsdWUpCisJdTggYWN0b3JfaW5mb3JtYXRpb25fbGVuZ3RoOyAvLyA9IDIwCisJdTE2IGFjdG9yX3N5c3RlbV9wcmlvcml0eTsKKwlzdHJ1Y3QgbWFjX2FkZHIgYWN0b3Jfc3lzdGVtOworCXUxNiBhY3Rvcl9rZXk7CisJdTE2IGFjdG9yX3BvcnRfcHJpb3JpdHk7CisJdTE2IGFjdG9yX3BvcnQ7CisJdTggYWN0b3Jfc3RhdGU7CisJdTggcmVzZXJ2ZWRfM18xWzNdOwkgICAgIC8vID0gMAorCXU4IHRsdl90eXBlX3BhcnRuZXJfaW5mbzsgICAgIC8vID0gcGFydG5lciBpbmZvcm1hdGlvbgorCXU4IHBhcnRuZXJfaW5mb3JtYXRpb25fbGVuZ3RoOwkgLy8gPSAyMAorCXUxNiBwYXJ0bmVyX3N5c3RlbV9wcmlvcml0eTsKKwlzdHJ1Y3QgbWFjX2FkZHIgcGFydG5lcl9zeXN0ZW07CisJdTE2IHBhcnRuZXJfa2V5OworCXUxNiBwYXJ0bmVyX3BvcnRfcHJpb3JpdHk7CisJdTE2IHBhcnRuZXJfcG9ydDsKKwl1OCBwYXJ0bmVyX3N0YXRlOworCXU4IHJlc2VydmVkXzNfMlszXTsJICAgICAvLyA9IDAKKwl1OCB0bHZfdHlwZV9jb2xsZWN0b3JfaW5mbzsJICAvLyA9IGNvbGxlY3RvciBpbmZvcm1hdGlvbgorCXU4IGNvbGxlY3Rvcl9pbmZvcm1hdGlvbl9sZW5ndGg7IC8vID0gMTYKKwl1MTYgY29sbGVjdG9yX21heF9kZWxheTsKKwl1OCByZXNlcnZlZF8xMlsxMl07CisJdTggdGx2X3R5cGVfdGVybWluYXRvcjsJICAgICAvLyA9IHRlcm1pbmF0b3IKKwl1OCB0ZXJtaW5hdG9yX2xlbmd0aDsJICAgICAvLyA9IDAKKwl1OCByZXNlcnZlZF81MFs1MF07CSAgICAgLy8gPSAwCit9IGxhY3BkdV90OworCit0eXBlZGVmIHN0cnVjdCBsYWNwZHVfaGVhZGVyIHsKKwlzdHJ1Y3QgYWRfaGVhZGVyIGFkX2hlYWRlcjsKKwlzdHJ1Y3QgbGFjcGR1IGxhY3BkdTsKK30gbGFjcGR1X2hlYWRlcl90OworCisvLyBNYXJrZXIgUHJvdG9jb2wgRGF0YSBVbml0KFBEVSkgc3RydWN0dXJlKDQzLjUuMy4yIGluIHRoZSA4MDIuM2FkIHN0YW5kYXJkKQordHlwZWRlZiBzdHJ1Y3QgbWFya2VyIHsKKwl1OCBzdWJ0eXBlOwkJIC8vICA9IDB4MDIgIChtYXJrZXIgUERVKQorCXU4IHZlcnNpb25fbnVtYmVyOwkgLy8gID0gMHgwMQorCXU4IHRsdl90eXBlOwkJIC8vICA9IDB4MDEgIChtYXJrZXIgaW5mb3JtYXRpb24pCisJLy8gID0gMHgwMiAgKG1hcmtlciByZXNwb25zZSBpbmZvcm1hdGlvbikKKwl1OCBtYXJrZXJfbGVuZ3RoOwkgLy8gID0gMHgxNgorCXUxNiByZXF1ZXN0ZXJfcG9ydDsJIC8vICAgVGhlIG51bWJlciBhc3NpZ25lZCB0byB0aGUgcG9ydCBieSB0aGUgcmVxdWVzdGVyCisJc3RydWN0IG1hY19hZGRyIHJlcXVlc3Rlcl9zeXN0ZW07ICAgICAgLy8gICBUaGUgcmVxdWVzdGVyJ3Mgc3lzdGVtIGlkCisJdTMyIHJlcXVlc3Rlcl90cmFuc2FjdGlvbl9pZDsJLy8gICBUaGUgdHJhbnNhY3Rpb24gaWQgYWxsb2NhdGVkIGJ5IHRoZSByZXF1ZXN0ZXIsCisJdTE2IHBhZDsJCSAvLyAgPSAwCisJdTggdGx2X3R5cGVfdGVybWluYXRvcjsJICAgICAvLyAgPSAweDAwCisJdTggdGVybWluYXRvcl9sZW5ndGg7CSAgICAgLy8gID0gMHgwMAorCXU4IHJlc2VydmVkXzkwWzkwXTsJICAgICAvLyAgPSAwCit9IG1hcmtlcl90OworCit0eXBlZGVmIHN0cnVjdCBtYXJrZXJfaGVhZGVyIHsKKwlzdHJ1Y3QgYWRfaGVhZGVyIGFkX2hlYWRlcjsKKwlzdHJ1Y3QgbWFya2VyIG1hcmtlcjsKK30gbWFya2VyX2hlYWRlcl90OworCisjcHJhZ21hIHBhY2soKQorCitzdHJ1Y3Qgc2xhdmU7CitzdHJ1Y3QgYm9uZGluZzsKK3N0cnVjdCBhZF9pbmZvOworc3RydWN0IHBvcnQ7CisKKyNpZmRlZiBfX2lhNjRfXworI3ByYWdtYSBwYWNrKDgpCisjZW5kaWYKKworLy8gYWdncmVnYXRvciBzdHJ1Y3R1cmUoNDMuNC41IGluIHRoZSA4MDIuM2FkIHN0YW5kYXJkKQordHlwZWRlZiBzdHJ1Y3QgYWdncmVnYXRvciB7CisJc3RydWN0IG1hY19hZGRyIGFnZ3JlZ2F0b3JfbWFjX2FkZHJlc3M7CisJdTE2IGFnZ3JlZ2F0b3JfaWRlbnRpZmllcjsKKwl1MTYgaXNfaW5kaXZpZHVhbDsJCSAvLyBCT09MRUFOCisJdTE2IGFjdG9yX2FkbWluX2FnZ3JlZ2F0b3Jfa2V5OworCXUxNiBhY3Rvcl9vcGVyX2FnZ3JlZ2F0b3Jfa2V5OworCXN0cnVjdCBtYWNfYWRkciBwYXJ0bmVyX3N5c3RlbTsKKwl1MTYgcGFydG5lcl9zeXN0ZW1fcHJpb3JpdHk7CisJdTE2IHBhcnRuZXJfb3Blcl9hZ2dyZWdhdG9yX2tleTsKKwl1MTYgcmVjZWl2ZV9zdGF0ZTsJCS8vIEJPT0xFQU4KKwl1MTYgdHJhbnNtaXRfc3RhdGU7CQkvLyBCT09MRUFOCisJc3RydWN0IHBvcnQgKmxhZ19wb3J0czsKKwkvLyAqKioqKiogUFJJVkFURSBQQVJBTUVURVJTICoqKioqKgorCXN0cnVjdCBzbGF2ZSAqc2xhdmU7CSAgICAvLyBwb2ludGVyIHRvIHRoZSBib25kIHNsYXZlIHRoYXQgdGhpcyBhZ2dyZWdhdG9yIGJlbG9uZ3MgdG8KKwl1MTYgaXNfYWN0aXZlOwkgICAgLy8gQk9PTEVBTi4gSW5kaWNhdGVzIGlmIHRoaXMgYWdncmVnYXRvciBpcyBhY3RpdmUKKwl1MTYgbnVtX29mX3BvcnRzOworfSBhZ2dyZWdhdG9yX3Q7CisKKy8vIHBvcnQgc3RydWN0dXJlKDQzLjQuNiBpbiB0aGUgODAyLjNhZCBzdGFuZGFyZCkKK3R5cGVkZWYgc3RydWN0IHBvcnQgeworCXUxNiBhY3Rvcl9wb3J0X251bWJlcjsKKwl1MTYgYWN0b3JfcG9ydF9wcmlvcml0eTsKKwlzdHJ1Y3QgbWFjX2FkZHIgYWN0b3Jfc3lzdGVtOwkgICAgICAgLy8gVGhpcyBwYXJhbWV0ZXIgaXMgYWRkZWQgaGVyZSBhbHRob3VnaCBpdCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBzdGFuZGFyZCwganVzdCBmb3Igc2ltcGxpZmljYXRpb24KKwl1MTYgYWN0b3Jfc3lzdGVtX3ByaW9yaXR5OwkgLy8gVGhpcyBwYXJhbWV0ZXIgaXMgYWRkZWQgaGVyZSBhbHRob3VnaCBpdCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBzdGFuZGFyZCwganVzdCBmb3Igc2ltcGxpZmljYXRpb24KKwl1MTYgYWN0b3JfcG9ydF9hZ2dyZWdhdG9yX2lkZW50aWZpZXI7CisJdTE2IG50dDsJCQkgLy8gQk9PTEVBTgorCXUxNiBhY3Rvcl9hZG1pbl9wb3J0X2tleTsKKwl1MTYgYWN0b3Jfb3Blcl9wb3J0X2tleTsKKwl1OCBhY3Rvcl9hZG1pbl9wb3J0X3N0YXRlOworCXU4IGFjdG9yX29wZXJfcG9ydF9zdGF0ZTsKKwlzdHJ1Y3QgbWFjX2FkZHIgcGFydG5lcl9hZG1pbl9zeXN0ZW07CisJc3RydWN0IG1hY19hZGRyIHBhcnRuZXJfb3Blcl9zeXN0ZW07CisJdTE2IHBhcnRuZXJfYWRtaW5fc3lzdGVtX3ByaW9yaXR5OworCXUxNiBwYXJ0bmVyX29wZXJfc3lzdGVtX3ByaW9yaXR5OworCXUxNiBwYXJ0bmVyX2FkbWluX2tleTsKKwl1MTYgcGFydG5lcl9vcGVyX2tleTsKKwl1MTYgcGFydG5lcl9hZG1pbl9wb3J0X251bWJlcjsKKwl1MTYgcGFydG5lcl9vcGVyX3BvcnRfbnVtYmVyOworCXUxNiBwYXJ0bmVyX2FkbWluX3BvcnRfcHJpb3JpdHk7CisJdTE2IHBhcnRuZXJfb3Blcl9wb3J0X3ByaW9yaXR5OworCXU4IHBhcnRuZXJfYWRtaW5fcG9ydF9zdGF0ZTsKKwl1OCBwYXJ0bmVyX29wZXJfcG9ydF9zdGF0ZTsKKwl1MTYgaXNfZW5hYmxlZDsJICAgICAgLy8gQk9PTEVBTgorCS8vICoqKioqKiBQUklWQVRFIFBBUkFNRVRFUlMgKioqKioqCisJdTE2IHNtX3ZhcnM7CSAgICAgIC8vIGFsbCBzdGF0ZSBtYWNoaW5lcyB2YXJpYWJsZXMgZm9yIHRoaXMgcG9ydAorCXJ4X3N0YXRlc190IHNtX3J4X3N0YXRlOwkvLyBzdGF0ZSBtYWNoaW5lIHJ4IHN0YXRlCisJdTE2IHNtX3J4X3RpbWVyX2NvdW50ZXI7ICAgIC8vIHN0YXRlIG1hY2hpbmUgcnggdGltZXIgY291bnRlcgorCXBlcmlvZGljX3N0YXRlc190IHNtX3BlcmlvZGljX3N0YXRlOy8vIHN0YXRlIG1hY2hpbmUgcGVyaW9kaWMgc3RhdGUKKwl1MTYgc21fcGVyaW9kaWNfdGltZXJfY291bnRlcjsJLy8gc3RhdGUgbWFjaGluZSBwZXJpb2RpYyB0aW1lciBjb3VudGVyCisJbXV4X3N0YXRlc190IHNtX211eF9zdGF0ZTsJLy8gc3RhdGUgbWFjaGluZSBtdXggc3RhdGUKKwl1MTYgc21fbXV4X3RpbWVyX2NvdW50ZXI7ICAgLy8gc3RhdGUgbWFjaGluZSBtdXggdGltZXIgY291bnRlcgorCXR4X3N0YXRlc190IHNtX3R4X3N0YXRlOwkvLyBzdGF0ZSBtYWNoaW5lIHR4IHN0YXRlCisJdTE2IHNtX3R4X3RpbWVyX2NvdW50ZXI7ICAgIC8vIHN0YXRlIG1hY2hpbmUgdHggdGltZXIgY291bnRlcihhbGx3YXlzIG9uIC0gZW50ZXIgdG8gdHJhbnNtaXQgc3RhdGUgMyB0aW1lIHBlciBzZWNvbmQpCisJc3RydWN0IHNsYXZlICpzbGF2ZTsJICAgIC8vIHBvaW50ZXIgdG8gdGhlIGJvbmQgc2xhdmUgdGhhdCB0aGlzIHBvcnQgYmVsb25ncyB0bworCXN0cnVjdCBhZ2dyZWdhdG9yICphZ2dyZWdhdG9yOwkgICAvLyBwb2ludGVyIHRvIGFuIGFnZ3JlZ2F0b3IgdGhhdCB0aGlzIHBvcnQgcmVsYXRlZCB0bworCXN0cnVjdCBwb3J0ICpuZXh0X3BvcnRfaW5fYWdncmVnYXRvcjsgLy8gTmV4dCBwb3J0IG9uIHRoZSBsaW5rZWQgbGlzdCBvZiB0aGUgcGFyZW50IGFnZ3JlZ2F0b3IKKwl1MzIgdHJhbnNhY3Rpb25faWQ7CSAgICAvLyBjb250aW51b3VzIG51bWJlciBmb3IgaWRlbnRpZmljYXRpb24gb2YgTWFya2VyIFBEVSdzOworCXN0cnVjdCBsYWNwZHUgbGFjcGR1OwkgICAgICAgLy8gdGhlIGxhY3BkdSB0aGF0IHdpbGwgYmUgc2VudCBmb3IgdGhpcyBwb3J0Cit9IHBvcnRfdDsKKworLy8gc3lzdGVtIHN0cnVjdHVyZQordHlwZWRlZiBzdHJ1Y3QgYWRfc3lzdGVtIHsKKwl1MTYgc3lzX3ByaW9yaXR5OworCXN0cnVjdCBtYWNfYWRkciBzeXNfbWFjX2FkZHI7Cit9IGFkX3N5c3RlbV90OworCisjaWZkZWYgX19pYTY0X18KKyNwcmFnbWEgcGFjaygpCisjZW5kaWYKKworLy8gPT09PT09PT09PT09PT09PT0gQUQgRXhwb3J0ZWQgc3RydWN0dXJlcyB0byB0aGUgbWFpbiBib25kaW5nIGNvZGUgPT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEJPTkRfQURfSU5GTyhib25kKSAgICgoYm9uZCktPmFkX2luZm8pCisjZGVmaW5lIFNMQVZFX0FEX0lORk8oc2xhdmUpICgoc2xhdmUpLT5hZF9pbmZvKQorCitzdHJ1Y3QgYWRfYm9uZF9pbmZvIHsKKwlhZF9zeXN0ZW1fdCBzeXN0ZW07CSAgICAvLyA4MDIuM2FkIHN5c3RlbSBzdHJ1Y3R1cmUKKwl1MzIgYWdnX3NlbGVjdF90aW1lcjsJICAgIC8vIFRpbWVyIHRvIHNlbGVjdCBhZ2dyZWdhdG9yIGFmdGVyIGFsbCBhZGFwdGVyJ3MgaGFuZCBzaGFrZXMKKwl1MzIgYWdnX3NlbGVjdF9tb2RlOwkgICAgLy8gTW9kZSBvZiBzZWxlY3Rpb24gb2YgYWN0aXZlIGFnZ3JlZ2F0b3IoYmFuZHdpZHRoL2NvdW50KQorCWludCBsYWNwX2Zhc3Q7CQkvKiB3aGV0aGVyIGZhc3QgcGVyaW9kaWMgdHggc2hvdWxkIGJlCisJCQkJICogcmVxdWVzdGVkCisJCQkJICovCisJc3RydWN0IHRpbWVyX2xpc3QgYWRfdGltZXI7CisJc3RydWN0IHBhY2tldF90eXBlIGFkX3BrdF90eXBlOworfTsKKworc3RydWN0IGFkX3NsYXZlX2luZm8geworCXN0cnVjdCBhZ2dyZWdhdG9yIGFnZ3JlZ2F0b3I7CSAgICAvLyA4MDIuM2FkIGFnZ3JlZ2F0b3Igc3RydWN0dXJlCisJc3RydWN0IHBvcnQgcG9ydDsJCSAgICAvLyA4MDIuM2FkIHBvcnQgc3RydWN0dXJlCisJc3BpbmxvY2tfdCByeF9tYWNoaW5lX2xvY2s7IC8vIFRvIGF2b2lkIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gY2FsbGJhY2sgYW5kIHJlY2VpdmUgaW50ZXJydXB0CisJdTE2IGlkOworfTsKKworLy8gPT09PT09PT09PT09PT09PT0gQUQgRXhwb3J0ZWQgZnVuY3Rpb25zIHRvIHRoZSBtYWluIGJvbmRpbmcgY29kZSA9PT09PT09PT09PT09PT09PT0KK3ZvaWQgYm9uZF8zYWRfaW5pdGlhbGl6ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgdTE2IHRpY2tfcmVzb2x1dGlvbiwgaW50IGxhY3BfZmFzdCk7CitpbnQgIGJvbmRfM2FkX2JpbmRfc2xhdmUoc3RydWN0IHNsYXZlICpzbGF2ZSk7Cit2b2lkIGJvbmRfM2FkX3VuYmluZF9zbGF2ZShzdHJ1Y3Qgc2xhdmUgKnNsYXZlKTsKK3ZvaWQgYm9uZF8zYWRfc3RhdGVfbWFjaGluZV9oYW5kbGVyKHN0cnVjdCBib25kaW5nICpib25kKTsKK3ZvaWQgYm9uZF8zYWRfYWRhcHRlcl9zcGVlZF9jaGFuZ2VkKHN0cnVjdCBzbGF2ZSAqc2xhdmUpOwordm9pZCBib25kXzNhZF9hZGFwdGVyX2R1cGxleF9jaGFuZ2VkKHN0cnVjdCBzbGF2ZSAqc2xhdmUpOwordm9pZCBib25kXzNhZF9oYW5kbGVfbGlua19jaGFuZ2Uoc3RydWN0IHNsYXZlICpzbGF2ZSwgY2hhciBsaW5rKTsKK2ludCAgYm9uZF8zYWRfZ2V0X2FjdGl2ZV9hZ2dfaW5mbyhzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IGFkX2luZm8gKmFkX2luZm8pOworaW50IGJvbmRfM2FkX3htaXRfeG9yKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IGJvbmRfM2FkX2xhY3BkdV9yZWN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBwYWNrZXRfdHlwZSogcHR5cGUpOworI2VuZGlmIC8vX19CT05EXzNBRF9IX18KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5jIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZTYwNmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfYWxiLmMKQEAgLTAsMCArMSwxNjk2IEBACisvKgorICogQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKKyAqIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKgorICogQ2hhbmdlczoKKyAqCisgKiAyMDAzLzA2LzI1IC0gU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKgktIEZpeGVkIHNpZ25lZC91bnNpZ25lZCBjYWxjdWxhdGlvbiBlcnJvcnMgdGhhdCBjYXVzZWQgbG9hZCBzaGFyaW5nCisgKgkgIHRvIGNvbGxhcHNlIHRvIG9uZSBzbGF2ZSB1bmRlciB2ZXJ5IGhlYXZ5IFVEUCBUeCBzdHJlc3MuCisgKgorICogMjAwMy8wOC8wNiAtIEFtaXIgTm9hbSA8YW1pci5ub2FtIGF0IGludGVsIGRvdCBjb20+CisgKgktIEFkZCBzdXBwb3J0IGZvciBzZXR0aW5nIGJvbmQncyBNQUMgYWRkcmVzcyB3aXRoIHNwZWNpYWwKKyAqCSAgaGFuZGxpbmcgcmVxdWlyZWQgZm9yIEFMQi9UTEIuCisgKgorICogMjAwMy8xMi8wMSAtIFNobXVsaWsgSGVuIDxzaG11bGlrLmhlbiBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBDb2RlIGNsZWFudXAgYW5kIHN0eWxlIGNoYW5nZXMKKyAqCisgKiAyMDAzLzEyLzMwIC0gQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gRml4ZWQ6IENhbm5vdCByZW1vdmUgYW5kIHJlLWVuc2xhdmUgdGhlIG9yaWdpbmFsIGFjdGl2ZSBzbGF2ZS4KKyAqCisgKiAyMDA0LzAxLzE0IC0gU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKgktIEFkZCBjYXBhYmlsaXR5IHRvIHRhZyBzZWxmIGdlbmVyYXRlZCBwYWNrZXRzIGluIEFMQi9UTEIgbW9kZXMuCisgKi8KKworLy8jZGVmaW5lIEJPTkRJTkdfREVCVUcgMQorCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYm9uZGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPG5ldC9pcHguaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgImJvbmRpbmcuaCIKKyNpbmNsdWRlICJib25kX2FsYi5oIgorCisKKyNkZWZpbmUgQUxCX1RJTUVSX1RJQ0tTX1BFUl9TRUMJICAgIDEwCS8qIHNob3VsZCBiZSBhIGRpdmlzb3Igb2YgSFogKi8KKyNkZWZpbmUgQk9ORF9UTEJfUkVCQUxBTkNFX0lOVEVSVkFMIDEwCS8qIEluIHNlY29uZHMsIHBlcmlvZGljIHJlLWJhbGFuY2luZy4KKwkJCQkJICogVXNlZCBmb3IgZGl2aXNpb24gLSBuZXZlciBzZXQKKwkJCQkJICogdG8gemVybyAhISEKKwkJCQkJICovCisjZGVmaW5lIEJPTkRfQUxCX0xQX0lOVEVSVkFMCSAgICAxCS8qIEluIHNlY29uZHMsIHBlcmlvZGljIHNlbmQgb2YKKwkJCQkJICogbGVhcm5pbmcgcGFja2V0cyB0byB0aGUgc3dpdGNoCisJCQkJCSAqLworCisjZGVmaW5lIEJPTkRfVExCX1JFQkFMQU5DRV9USUNLUyAoQk9ORF9UTEJfUkVCQUxBTkNFX0lOVEVSVkFMIFwKKwkJCQkgICogQUxCX1RJTUVSX1RJQ0tTX1BFUl9TRUMpCisKKyNkZWZpbmUgQk9ORF9BTEJfTFBfVElDS1MgKEJPTkRfQUxCX0xQX0lOVEVSVkFMIFwKKwkJCSAgICogQUxCX1RJTUVSX1RJQ0tTX1BFUl9TRUMpCisKKyNkZWZpbmUgVExCX0hBU0hfVEFCTEVfU0laRSAyNTYJLyogVGhlIHNpemUgb2YgdGhlIGNsaWVudHMgaGFzaCB0YWJsZS4KKwkJCQkgKiBOb3RlIHRoYXQgdGhpcyB2YWx1ZSBNVVNUIE5PVCBiZSBzbWFsbGVyCisJCQkJICogYmVjYXVzZSB0aGUga2V5IGhhc2ggdGFibGUgaXMgQllURSB3aWRlICEKKwkJCQkgKi8KKworCisjZGVmaW5lIFRMQl9OVUxMX0lOREVYCQkweGZmZmZmZmZmCisjZGVmaW5lIE1BWF9MUF9CVVJTVAkJMworCisvKiBybGIgZGVmcyAqLworI2RlZmluZSBSTEJfSEFTSF9UQUJMRV9TSVpFCTI1NgorI2RlZmluZSBSTEJfTlVMTF9JTkRFWAkJMHhmZmZmZmZmZgorI2RlZmluZSBSTEJfVVBEQVRFX0RFTEFZCTIqQUxCX1RJTUVSX1RJQ0tTX1BFUl9TRUMgLyogMiBzZWNvbmRzICovCisjZGVmaW5lIFJMQl9BUlBfQlVSU1RfU0laRQkyCisjZGVmaW5lIFJMQl9VUERBVEVfUkVUUlkJMwkvKiAzLXRpY2tzIC0gbXVzdCBiZSBzbWFsbGVyIHRoYW4gdGhlIHJsYgorCQkJCQkgKiByZWJhbGFuY2UgaW50ZXJ2YWwgKDUgbWluKS4KKwkJCQkJICovCisvKiBSTEJfUFJPTUlTQ19USU1FT1VUID0gMTAgc2VjIGVxdWFscyB0aGUgdGltZSB0aGF0IHRoZSBjdXJyZW50IHNsYXZlIGlzCisgKiBwcm9taXNjdW91cyBhZnRlciBmYWlsb3ZlcgorICovCisjZGVmaW5lIFJMQl9QUk9NSVNDX1RJTUVPVVQJMTAqQUxCX1RJTUVSX1RJQ0tTX1BFUl9TRUMKKworc3RhdGljIGNvbnN0IHU4IG1hY19iY2FzdFtFVEhfQUxFTl0gPSB7MHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmZ9Oworc3RhdGljIGNvbnN0IGludCBhbGJfZGVsdGFfaW5fdGlja3MgPSBIWiAvIEFMQl9USU1FUl9USUNLU19QRVJfU0VDOworCisjcHJhZ21hIHBhY2soMSkKK3N0cnVjdCBsZWFybmluZ19wa3QgeworCXU4IG1hY19kc3RbRVRIX0FMRU5dOworCXU4IG1hY19zcmNbRVRIX0FMRU5dOworCXUxNiB0eXBlOworCXU4IHBhZGRpbmdbRVRIX1pMRU4gLSBFVEhfSExFTl07Cit9OworCitzdHJ1Y3QgYXJwX3BrdCB7CisJdTE2ICAgICBod19hZGRyX3NwYWNlOworCXUxNiAgICAgcHJvdF9hZGRyX3NwYWNlOworCXU4ICAgICAgaHdfYWRkcl9sZW47CisJdTggICAgICBwcm90X2FkZHJfbGVuOworCXUxNiAgICAgb3BfY29kZTsKKwl1OCAgICAgIG1hY19zcmNbRVRIX0FMRU5dOwkvKiBzZW5kZXIgaGFyZHdhcmUgYWRkcmVzcyAqLworCXUzMiAgICAgaXBfc3JjOwkJCS8qIHNlbmRlciBJUCBhZGRyZXNzICovCisJdTggICAgICBtYWNfZHN0W0VUSF9BTEVOXTsJLyogdGFyZ2V0IGhhcmR3YXJlIGFkZHJlc3MgKi8KKwl1MzIgICAgIGlwX2RzdDsJCQkvKiB0YXJnZXQgSVAgYWRkcmVzcyAqLworfTsKKyNwcmFnbWEgcGFjaygpCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0YXRpYyB2b2lkIGFsYl9zZW5kX2xlYXJuaW5nX3BhY2tldHMoc3RydWN0IHNsYXZlICpzbGF2ZSwgdTggbWFjX2FkZHJbXSk7CisKK3N0YXRpYyBpbmxpbmUgdTggX3NpbXBsZV9oYXNoKHU4ICpoYXNoX3N0YXJ0LCBpbnQgaGFzaF9zaXplKQoreworCWludCBpOworCXU4IGhhc2ggPSAwOworCisJZm9yIChpID0gMDsgaSA8IGhhc2hfc2l6ZTsgaSsrKSB7CisJCWhhc2ggXj0gaGFzaF9zdGFydFtpXTsKKwl9CisKKwlyZXR1cm4gaGFzaDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqIHRsYiBzcGVjaWZpYyBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW5saW5lIHZvaWQgX2xvY2tfdHhfaGFzaHRibChzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKK3sKKwlzcGluX2xvY2soJihCT05EX0FMQl9JTkZPKGJvbmQpLnR4X2hhc2h0YmxfbG9jaykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX3VubG9ja190eF9oYXNodGJsKHN0cnVjdCBib25kaW5nICpib25kKQoreworCXNwaW5fdW5sb2NrKCYoQk9ORF9BTEJfSU5GTyhib25kKS50eF9oYXNodGJsX2xvY2spKTsKK30KKworLyogQ2FsbGVyIG11c3QgaG9sZCB0eF9oYXNodGJsIGxvY2sgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB0bGJfaW5pdF90YWJsZV9lbnRyeShzdHJ1Y3QgdGxiX2NsaWVudF9pbmZvICplbnRyeSwgaW50IHNhdmVfbG9hZCkKK3sKKwlpZiAoc2F2ZV9sb2FkKSB7CisJCWVudHJ5LT5sb2FkX2hpc3RvcnkgPSAxICsgZW50cnktPnR4X2J5dGVzIC8KKwkJCQkgICAgICBCT05EX1RMQl9SRUJBTEFOQ0VfSU5URVJWQUw7CisJCWVudHJ5LT50eF9ieXRlcyA9IDA7CisJfQorCisJZW50cnktPnR4X3NsYXZlID0gTlVMTDsKKwllbnRyeS0+bmV4dCA9IFRMQl9OVUxMX0lOREVYOworCWVudHJ5LT5wcmV2ID0gVExCX05VTExfSU5ERVg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0bGJfaW5pdF9zbGF2ZShzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQoreworCVNMQVZFX1RMQl9JTkZPKHNsYXZlKS5sb2FkID0gMDsKKwlTTEFWRV9UTEJfSU5GTyhzbGF2ZSkuaGVhZCA9IFRMQl9OVUxMX0lOREVYOworfQorCisvKiBDYWxsZXIgbXVzdCBob2xkIGJvbmQgbG9jayBmb3IgcmVhZCAqLworc3RhdGljIHZvaWQgdGxiX2NsZWFyX3NsYXZlKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2xhdmUgKnNsYXZlLCBpbnQgc2F2ZV9sb2FkKQoreworCXN0cnVjdCB0bGJfY2xpZW50X2luZm8gKnR4X2hhc2hfdGFibGU7CisJdTMyIGluZGV4OworCisJX2xvY2tfdHhfaGFzaHRibChib25kKTsKKworCS8qIGNsZWFyIHNsYXZlIGZyb20gdHhfaGFzaHRibCAqLworCXR4X2hhc2hfdGFibGUgPSBCT05EX0FMQl9JTkZPKGJvbmQpLnR4X2hhc2h0Ymw7CisKKwlpbmRleCA9IFNMQVZFX1RMQl9JTkZPKHNsYXZlKS5oZWFkOworCXdoaWxlIChpbmRleCAhPSBUTEJfTlVMTF9JTkRFWCkgeworCQl1MzIgbmV4dF9pbmRleCA9IHR4X2hhc2hfdGFibGVbaW5kZXhdLm5leHQ7CisJCXRsYl9pbml0X3RhYmxlX2VudHJ5KCZ0eF9oYXNoX3RhYmxlW2luZGV4XSwgc2F2ZV9sb2FkKTsKKwkJaW5kZXggPSBuZXh0X2luZGV4OworCX0KKworCV91bmxvY2tfdHhfaGFzaHRibChib25kKTsKKworCXRsYl9pbml0X3NsYXZlKHNsYXZlKTsKK30KKworLyogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHN0YXJ0aW5nIHRoZSBtb25pdG9yIHRpbWVyICovCitzdGF0aWMgaW50IHRsYl9pbml0aWFsaXplKHN0cnVjdCBib25kaW5nICpib25kKQoreworCXN0cnVjdCBhbGJfYm9uZF9pbmZvICpib25kX2luZm8gPSAmKEJPTkRfQUxCX0lORk8oYm9uZCkpOworCWludCBzaXplID0gVExCX0hBU0hfVEFCTEVfU0laRSAqIHNpemVvZihzdHJ1Y3QgdGxiX2NsaWVudF9pbmZvKTsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pbml0KCYoYm9uZF9pbmZvLT50eF9oYXNodGJsX2xvY2spKTsKKworCV9sb2NrX3R4X2hhc2h0YmwoYm9uZCk7CisKKwlib25kX2luZm8tPnR4X2hhc2h0YmwgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghYm9uZF9pbmZvLT50eF9oYXNodGJsKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkgICAgICAgIjogRXJyb3I6ICVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgVExCIGhhc2ggdGFibGVcbiIsCisJCSAgICAgICBib25kLT5kZXYtPm5hbWUpOworCQlfdW5sb2NrX3R4X2hhc2h0YmwoYm9uZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1zZXQoYm9uZF9pbmZvLT50eF9oYXNodGJsLCAwLCBzaXplKTsKKworCWZvciAoaSA9IDA7IGkgPCBUTEJfSEFTSF9UQUJMRV9TSVpFOyBpKyspIHsKKwkJdGxiX2luaXRfdGFibGVfZW50cnkoJmJvbmRfaW5mby0+dHhfaGFzaHRibFtpXSwgMSk7CisJfQorCisJX3VubG9ja190eF9oYXNodGJsKGJvbmQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgYWxsIHNsYXZlcyBoYXZlIGJlZW4gcmVsZWFzZWQgKi8KK3N0YXRpYyB2b2lkIHRsYl9kZWluaXRpYWxpemUoc3RydWN0IGJvbmRpbmcgKmJvbmQpCit7CisJc3RydWN0IGFsYl9ib25kX2luZm8gKmJvbmRfaW5mbyA9ICYoQk9ORF9BTEJfSU5GTyhib25kKSk7CisKKwlfbG9ja190eF9oYXNodGJsKGJvbmQpOworCisJa2ZyZWUoYm9uZF9pbmZvLT50eF9oYXNodGJsKTsKKwlib25kX2luZm8tPnR4X2hhc2h0YmwgPSBOVUxMOworCisJX3VubG9ja190eF9oYXNodGJsKGJvbmQpOworfQorCisvKiBDYWxsZXIgbXVzdCBob2xkIGJvbmQgbG9jayBmb3IgcmVhZCAqLworc3RhdGljIHN0cnVjdCBzbGF2ZSAqdGxiX2dldF9sZWFzdF9sb2FkZWRfc2xhdmUoc3RydWN0IGJvbmRpbmcgKmJvbmQpCit7CisJc3RydWN0IHNsYXZlICpzbGF2ZSwgKmxlYXN0X2xvYWRlZDsKKwlzNjQgbWF4X2dhcDsKKwlpbnQgaSwgZm91bmQgPSAwOworCisJLyogRmluZCB0aGUgZmlyc3QgZW5hYmxlZCBzbGF2ZSAqLworCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGkpIHsKKwkJaWYgKFNMQVZFX0lTX09LKHNsYXZlKSkgeworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCWxlYXN0X2xvYWRlZCA9IHNsYXZlOworCW1heF9nYXAgPSAoczY0KShzbGF2ZS0+c3BlZWQgPDwgMjApIC0gLyogQ29udmVydCB0byBNZWdhYml0IHBlciBzZWMgKi8KKwkJCShzNjQpKFNMQVZFX1RMQl9JTkZPKHNsYXZlKS5sb2FkIDw8IDMpOyAvKiBCeXRlcyB0byBiaXRzICovCisKKwkvKiBGaW5kIHRoZSBzbGF2ZSB3aXRoIHRoZSBsYXJnZXN0IGdhcCAqLworCWJvbmRfZm9yX2VhY2hfc2xhdmVfZnJvbShib25kLCBzbGF2ZSwgaSwgbGVhc3RfbG9hZGVkKSB7CisJCWlmIChTTEFWRV9JU19PSyhzbGF2ZSkpIHsKKwkJCXM2NCBnYXAgPSAoczY0KShzbGF2ZS0+c3BlZWQgPDwgMjApIC0KKwkJCQkJKHM2NCkoU0xBVkVfVExCX0lORk8oc2xhdmUpLmxvYWQgPDwgMyk7CisJCQlpZiAobWF4X2dhcCA8IGdhcCkgeworCQkJCWxlYXN0X2xvYWRlZCA9IHNsYXZlOworCQkJCW1heF9nYXAgPSBnYXA7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gbGVhc3RfbG9hZGVkOworfQorCisvKiBDYWxsZXIgbXVzdCBob2xkIGJvbmQgbG9jayBmb3IgcmVhZCAqLworc3RhdGljIHN0cnVjdCBzbGF2ZSAqdGxiX2Nob29zZV9jaGFubmVsKHN0cnVjdCBib25kaW5nICpib25kLCB1MzIgaGFzaF9pbmRleCwgdTMyIHNrYl9sZW4pCit7CisJc3RydWN0IGFsYl9ib25kX2luZm8gKmJvbmRfaW5mbyA9ICYoQk9ORF9BTEJfSU5GTyhib25kKSk7CisJc3RydWN0IHRsYl9jbGllbnRfaW5mbyAqaGFzaF90YWJsZTsKKwlzdHJ1Y3Qgc2xhdmUgKmFzc2lnbmVkX3NsYXZlOworCisJX2xvY2tfdHhfaGFzaHRibChib25kKTsKKworCWhhc2hfdGFibGUgPSBib25kX2luZm8tPnR4X2hhc2h0Ymw7CisJYXNzaWduZWRfc2xhdmUgPSBoYXNoX3RhYmxlW2hhc2hfaW5kZXhdLnR4X3NsYXZlOworCWlmICghYXNzaWduZWRfc2xhdmUpIHsKKwkJYXNzaWduZWRfc2xhdmUgPSB0bGJfZ2V0X2xlYXN0X2xvYWRlZF9zbGF2ZShib25kKTsKKworCQlpZiAoYXNzaWduZWRfc2xhdmUpIHsKKwkJCXN0cnVjdCB0bGJfc2xhdmVfaW5mbyAqc2xhdmVfaW5mbyA9CisJCQkJJihTTEFWRV9UTEJfSU5GTyhhc3NpZ25lZF9zbGF2ZSkpOworCQkJdTMyIG5leHRfaW5kZXggPSBzbGF2ZV9pbmZvLT5oZWFkOworCisJCQloYXNoX3RhYmxlW2hhc2hfaW5kZXhdLnR4X3NsYXZlID0gYXNzaWduZWRfc2xhdmU7CisJCQloYXNoX3RhYmxlW2hhc2hfaW5kZXhdLm5leHQgPSBuZXh0X2luZGV4OworCQkJaGFzaF90YWJsZVtoYXNoX2luZGV4XS5wcmV2ID0gVExCX05VTExfSU5ERVg7CisKKwkJCWlmIChuZXh0X2luZGV4ICE9IFRMQl9OVUxMX0lOREVYKSB7CisJCQkJaGFzaF90YWJsZVtuZXh0X2luZGV4XS5wcmV2ID0gaGFzaF9pbmRleDsKKwkJCX0KKworCQkJc2xhdmVfaW5mby0+aGVhZCA9IGhhc2hfaW5kZXg7CisJCQlzbGF2ZV9pbmZvLT5sb2FkICs9CisJCQkJaGFzaF90YWJsZVtoYXNoX2luZGV4XS5sb2FkX2hpc3Rvcnk7CisJCX0KKwl9CisKKwlpZiAoYXNzaWduZWRfc2xhdmUpIHsKKwkJaGFzaF90YWJsZVtoYXNoX2luZGV4XS50eF9ieXRlcyArPSBza2JfbGVuOworCX0KKworCV91bmxvY2tfdHhfaGFzaHRibChib25kKTsKKworCXJldHVybiBhc3NpZ25lZF9zbGF2ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqIHJsYiBzcGVjaWZpYyBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkIF9sb2NrX3J4X2hhc2h0Ymwoc3RydWN0IGJvbmRpbmcgKmJvbmQpCit7CisJc3Bpbl9sb2NrKCYoQk9ORF9BTEJfSU5GTyhib25kKS5yeF9oYXNodGJsX2xvY2spKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF91bmxvY2tfcnhfaGFzaHRibChzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKK3sKKwlzcGluX3VubG9jaygmKEJPTkRfQUxCX0lORk8oYm9uZCkucnhfaGFzaHRibF9sb2NrKSk7Cit9CisKKy8qIHdoZW4gYW4gQVJQIFJFUExZIGlzIHJlY2VpdmVkIGZyb20gYSBjbGllbnQgdXBkYXRlIGl0cyBpbmZvCisgKiBpbiB0aGUgcnhfaGFzaHRibAorICovCitzdGF0aWMgdm9pZCBybGJfdXBkYXRlX2VudHJ5X2Zyb21fYXJwKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3QgYXJwX3BrdCAqYXJwKQoreworCXN0cnVjdCBhbGJfYm9uZF9pbmZvICpib25kX2luZm8gPSAmKEJPTkRfQUxCX0lORk8oYm9uZCkpOworCXN0cnVjdCBybGJfY2xpZW50X2luZm8gKmNsaWVudF9pbmZvOworCXUzMiBoYXNoX2luZGV4OworCisJX2xvY2tfcnhfaGFzaHRibChib25kKTsKKworCWhhc2hfaW5kZXggPSBfc2ltcGxlX2hhc2goKHU4KikmKGFycC0+aXBfc3JjKSwgc2l6ZW9mKGFycC0+aXBfc3JjKSk7CisJY2xpZW50X2luZm8gPSAmKGJvbmRfaW5mby0+cnhfaGFzaHRibFtoYXNoX2luZGV4XSk7CisKKwlpZiAoKGNsaWVudF9pbmZvLT5hc3NpZ25lZCkgJiYKKwkgICAgKGNsaWVudF9pbmZvLT5pcF9zcmMgPT0gYXJwLT5pcF9kc3QpICYmCisJICAgIChjbGllbnRfaW5mby0+aXBfZHN0ID09IGFycC0+aXBfc3JjKSkgeworCQkvKiB1cGRhdGUgdGhlIGNsaWVudHMgTUFDIGFkZHJlc3MgKi8KKwkJbWVtY3B5KGNsaWVudF9pbmZvLT5tYWNfZHN0LCBhcnAtPm1hY19zcmMsIEVUSF9BTEVOKTsKKwkJY2xpZW50X2luZm8tPm50dCA9IDE7CisJCWJvbmRfaW5mby0+cnhfbnR0ID0gMTsKKwl9CisKKwlfdW5sb2NrX3J4X2hhc2h0YmwoYm9uZCk7Cit9CisKK3N0YXRpYyBpbnQgcmxiX2FycF9yZWN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2Rldiwgc3RydWN0IHBhY2tldF90eXBlICpwdHlwZSkKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZGV2LT5wcml2OworCXN0cnVjdCBhcnBfcGt0ICphcnAgPSAoc3RydWN0IGFycF9wa3QgKilza2ItPmRhdGE7CisJaW50IHJlcyA9IE5FVF9SWF9EUk9QOworCisJaWYgKCEoYm9uZF9kZXYtPmZsYWdzICYgSUZGX01BU1RFUikpIHsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFhcnApIHsKKwkJZHByaW50aygiUGFja2V0IGhhcyBubyBBUlAgZGF0YVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgYXJwX3BrdCkpIHsKKwkJZHByaW50aygiUGFja2V0IGlzIHRvbyBzbWFsbCB0byBiZSBhbiBBUlBcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYXJwLT5vcF9jb2RlID09IGh0b25zKEFSUE9QX1JFUExZKSkgeworCQkvKiB1cGRhdGUgcnggaGFzaCB0YWJsZSBmb3IgdGhpcyBBUlAgKi8KKwkJcmxiX3VwZGF0ZV9lbnRyeV9mcm9tX2FycChib25kLCBhcnApOworCQlkcHJpbnRrKCJTZXJ2ZXIgcmVjZWl2ZWQgYW4gQVJQIFJlcGx5IGZyb20gY2xpZW50XG4iKTsKKwl9CisKKwlyZXMgPSBORVRfUlhfU1VDQ0VTUzsKKworb3V0OgorCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiByZXM7Cit9CisKKy8qIENhbGxlciBtdXN0IGhvbGQgYm9uZCBsb2NrIGZvciByZWFkICovCitzdGF0aWMgc3RydWN0IHNsYXZlICpybGJfbmV4dF9yeF9zbGF2ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKK3sKKwlzdHJ1Y3QgYWxiX2JvbmRfaW5mbyAqYm9uZF9pbmZvID0gJihCT05EX0FMQl9JTkZPKGJvbmQpKTsKKwlzdHJ1Y3Qgc2xhdmUgKnJ4X3NsYXZlLCAqc2xhdmUsICpzdGFydF9hdDsKKwlpbnQgaSA9IDA7CisKKwlpZiAoYm9uZF9pbmZvLT5uZXh0X3J4X3NsYXZlKSB7CisJCXN0YXJ0X2F0ID0gYm9uZF9pbmZvLT5uZXh0X3J4X3NsYXZlOworCX0gZWxzZSB7CisJCXN0YXJ0X2F0ID0gYm9uZC0+Zmlyc3Rfc2xhdmU7CisJfQorCisJcnhfc2xhdmUgPSBOVUxMOworCisJYm9uZF9mb3JfZWFjaF9zbGF2ZV9mcm9tKGJvbmQsIHNsYXZlLCBpLCBzdGFydF9hdCkgeworCQlpZiAoU0xBVkVfSVNfT0soc2xhdmUpKSB7CisJCQlpZiAoIXJ4X3NsYXZlKSB7CisJCQkJcnhfc2xhdmUgPSBzbGF2ZTsKKwkJCX0gZWxzZSBpZiAoc2xhdmUtPnNwZWVkID4gcnhfc2xhdmUtPnNwZWVkKSB7CisJCQkJcnhfc2xhdmUgPSBzbGF2ZTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChyeF9zbGF2ZSkgeworCQlib25kX2luZm8tPm5leHRfcnhfc2xhdmUgPSByeF9zbGF2ZS0+bmV4dDsKKwl9CisKKwlyZXR1cm4gcnhfc2xhdmU7Cit9CisKKy8qIHRlYWNoIHRoZSBzd2l0Y2ggdGhlIG1hYyBvZiBhIGRpc2FibGVkIHNsYXZlCisgKiBvbiB0aGUgcHJpbWFyeSBmb3IgZmF1bHQgdG9sZXJhbmNlCisgKgorICogQ2FsbGVyIG11c3QgaG9sZCBib25kLT5jdXJyX3NsYXZlX2xvY2sgZm9yIHdyaXRlIG9yIGJvbmQgbG9jayBmb3Igd3JpdGUKKyAqLworc3RhdGljIHZvaWQgcmxiX3RlYWNoX2Rpc2FibGVkX21hY19vbl9wcmltYXJ5KHN0cnVjdCBib25kaW5nICpib25kLCB1OCBhZGRyW10pCit7CisJaWYgKCFib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSkgeworCQlyZXR1cm47CisJfQorCisJaWYgKCFib25kLT5hbGJfaW5mby5wcmltYXJ5X2lzX3Byb21pc2MpIHsKKwkJYm9uZC0+YWxiX2luZm8ucHJpbWFyeV9pc19wcm9taXNjID0gMTsKKwkJZGV2X3NldF9wcm9taXNjdWl0eShib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZS0+ZGV2LCAxKTsKKwl9CisKKwlib25kLT5hbGJfaW5mby5ybGJfcHJvbWlzY190aW1lb3V0X2NvdW50ZXIgPSAwOworCisJYWxiX3NlbmRfbGVhcm5pbmdfcGFja2V0cyhib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSwgYWRkcik7Cit9CisKKy8qIHNsYXZlIGJlaW5nIHJlbW92ZWQgc2hvdWxkIG5vdCBiZSBhY3RpdmUgYXQgdGhpcyBwb2ludAorICoKKyAqIENhbGxlciBtdXN0IGhvbGQgYm9uZCBsb2NrIGZvciByZWFkCisgKi8KK3N0YXRpYyB2b2lkIHJsYl9jbGVhcl9zbGF2ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHNsYXZlICpzbGF2ZSkKK3sKKwlzdHJ1Y3QgYWxiX2JvbmRfaW5mbyAqYm9uZF9pbmZvID0gJihCT05EX0FMQl9JTkZPKGJvbmQpKTsKKwlzdHJ1Y3QgcmxiX2NsaWVudF9pbmZvICpyeF9oYXNoX3RhYmxlOworCXUzMiBpbmRleCwgbmV4dF9pbmRleDsKKworCS8qIGNsZWFyIHNsYXZlIGZyb20gcnhfaGFzaHRibCAqLworCV9sb2NrX3J4X2hhc2h0YmwoYm9uZCk7CisKKwlyeF9oYXNoX3RhYmxlID0gYm9uZF9pbmZvLT5yeF9oYXNodGJsOworCWluZGV4ID0gYm9uZF9pbmZvLT5yeF9oYXNodGJsX2hlYWQ7CisJZm9yICg7IGluZGV4ICE9IFJMQl9OVUxMX0lOREVYOyBpbmRleCA9IG5leHRfaW5kZXgpIHsKKwkJbmV4dF9pbmRleCA9IHJ4X2hhc2hfdGFibGVbaW5kZXhdLm5leHQ7CisJCWlmIChyeF9oYXNoX3RhYmxlW2luZGV4XS5zbGF2ZSA9PSBzbGF2ZSkgeworCQkJc3RydWN0IHNsYXZlICphc3NpZ25lZF9zbGF2ZSA9IHJsYl9uZXh0X3J4X3NsYXZlKGJvbmQpOworCisJCQlpZiAoYXNzaWduZWRfc2xhdmUpIHsKKwkJCQlyeF9oYXNoX3RhYmxlW2luZGV4XS5zbGF2ZSA9IGFzc2lnbmVkX3NsYXZlOworCQkJCWlmIChtZW1jbXAocnhfaGFzaF90YWJsZVtpbmRleF0ubWFjX2RzdCwKKwkJCQkJICAgbWFjX2JjYXN0LCBFVEhfQUxFTikpIHsKKwkJCQkJYm9uZF9pbmZvLT5yeF9oYXNodGJsW2luZGV4XS5udHQgPSAxOworCQkJCQlib25kX2luZm8tPnJ4X250dCA9IDE7CisJCQkJCS8qIEEgc2xhdmUgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZQorCQkJCQkgKiB0YWJsZSBiZWNhdXNlIGl0IGlzIGVpdGhlciBkaXNhYmxlZAorCQkJCQkgKiBvciBiZWluZyByZWxlYXNlZC4gV2UgbXVzdCByZXRyeSB0aGUKKwkJCQkJICogdXBkYXRlIHRvIGF2b2lkIGNsaWVudHMgZnJvbSBub3QKKwkJCQkJICogYmVpbmcgdXBkYXRlZCAmIGRpc2Nvbm5lY3Rpbmcgd2hlbgorCQkJCQkgKiB0aGVyZSBpcyBzdHJlc3MKKwkJCQkJICovCisJCQkJCWJvbmRfaW5mby0+cmxiX3VwZGF0ZV9yZXRyeV9jb3VudGVyID0KKwkJCQkJCVJMQl9VUERBVEVfUkVUUlk7CisJCQkJfQorCQkJfSBlbHNlIHsgIC8qIHRoZXJlIGlzIG5vIGFjdGl2ZSBzbGF2ZSAqLworCQkJCXJ4X2hhc2hfdGFibGVbaW5kZXhdLnNsYXZlID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKworCV91bmxvY2tfcnhfaGFzaHRibChib25kKTsKKworCXdyaXRlX2xvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisKKwlpZiAoc2xhdmUgIT0gYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUpIHsKKwkJcmxiX3RlYWNoX2Rpc2FibGVkX21hY19vbl9wcmltYXJ5KGJvbmQsIHNsYXZlLT5kZXYtPmRldl9hZGRyKTsKKwl9CisKKwl3cml0ZV91bmxvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHJsYl91cGRhdGVfY2xpZW50KHN0cnVjdCBybGJfY2xpZW50X2luZm8gKmNsaWVudF9pbmZvKQoreworCWludCBpOworCisJaWYgKCFjbGllbnRfaW5mby0+c2xhdmUpIHsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBSTEJfQVJQX0JVUlNUX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCXNrYiA9IGFycF9jcmVhdGUoQVJQT1BfUkVQTFksIEVUSF9QX0FSUCwKKwkJCQkgY2xpZW50X2luZm8tPmlwX2RzdCwKKwkJCQkgY2xpZW50X2luZm8tPnNsYXZlLT5kZXYsCisJCQkJIGNsaWVudF9pbmZvLT5pcF9zcmMsCisJCQkJIGNsaWVudF9pbmZvLT5tYWNfZHN0LAorCQkJCSBjbGllbnRfaW5mby0+c2xhdmUtPmRldi0+ZGV2X2FkZHIsCisJCQkJIGNsaWVudF9pbmZvLT5tYWNfZHN0KTsKKwkJaWYgKCFza2IpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkJICAgICAgICI6IEVycm9yOiBmYWlsZWQgdG8gY3JlYXRlIGFuIEFSUCBwYWNrZXRcbiIpOworCQkJY29udGludWU7CisJCX0KKworCQlza2ItPmRldiA9IGNsaWVudF9pbmZvLT5zbGF2ZS0+ZGV2OworCisJCWlmIChjbGllbnRfaW5mby0+dGFnKSB7CisJCQlza2IgPSB2bGFuX3B1dF90YWcoc2tiLCBjbGllbnRfaW5mby0+dmxhbl9pZCk7CisJCQlpZiAoIXNrYikgeworCQkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkJCSAgICAgICAiOiBFcnJvcjogZmFpbGVkIHRvIGluc2VydCBWTEFOIHRhZ1xuIik7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQlhcnBfeG1pdChza2IpOworCX0KK30KKworLyogc2VuZHMgQVJQIFJFUExJRVMgdGhhdCB1cGRhdGUgdGhlIGNsaWVudHMgdGhhdCBuZWVkIHVwZGF0aW5nICovCitzdGF0aWMgdm9pZCBybGJfdXBkYXRlX3J4X2NsaWVudHMoc3RydWN0IGJvbmRpbmcgKmJvbmQpCit7CisJc3RydWN0IGFsYl9ib25kX2luZm8gKmJvbmRfaW5mbyA9ICYoQk9ORF9BTEJfSU5GTyhib25kKSk7CisJc3RydWN0IHJsYl9jbGllbnRfaW5mbyAqY2xpZW50X2luZm87CisJdTMyIGhhc2hfaW5kZXg7CisKKwlfbG9ja19yeF9oYXNodGJsKGJvbmQpOworCisJaGFzaF9pbmRleCA9IGJvbmRfaW5mby0+cnhfaGFzaHRibF9oZWFkOworCWZvciAoOyBoYXNoX2luZGV4ICE9IFJMQl9OVUxMX0lOREVYOyBoYXNoX2luZGV4ID0gY2xpZW50X2luZm8tPm5leHQpIHsKKwkJY2xpZW50X2luZm8gPSAmKGJvbmRfaW5mby0+cnhfaGFzaHRibFtoYXNoX2luZGV4XSk7CisJCWlmIChjbGllbnRfaW5mby0+bnR0KSB7CisJCQlybGJfdXBkYXRlX2NsaWVudChjbGllbnRfaW5mbyk7CisJCQlpZiAoYm9uZF9pbmZvLT5ybGJfdXBkYXRlX3JldHJ5X2NvdW50ZXIgPT0gMCkgeworCQkJCWNsaWVudF9pbmZvLT5udHQgPSAwOworCQkJfQorCQl9CisJfQorCisJLyogZG8gbm90IHVwZGF0ZSB0aGUgZW50cmllcyBhZ2FpbiB1bnRpbGwgdGhpcyBjb3VudGVyIGlzIHplcm8gc28gdGhhdAorCSAqIG5vdCB0byBjb25mdXNlIHRoZSBjbGllbnRzLgorCSAqLworCWJvbmRfaW5mby0+cmxiX3VwZGF0ZV9kZWxheV9jb3VudGVyID0gUkxCX1VQREFURV9ERUxBWTsKKworCV91bmxvY2tfcnhfaGFzaHRibChib25kKTsKK30KKworLyogVGhlIHNsYXZlIHdhcyBhc3NpZ25lZCBhIG5ldyBtYWMgYWRkcmVzcyAtIHVwZGF0ZSB0aGUgY2xpZW50cyAqLworc3RhdGljIHZvaWQgcmxiX3JlcV91cGRhdGVfc2xhdmVfY2xpZW50cyhzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHNsYXZlICpzbGF2ZSkKK3sKKwlzdHJ1Y3QgYWxiX2JvbmRfaW5mbyAqYm9uZF9pbmZvID0gJihCT05EX0FMQl9JTkZPKGJvbmQpKTsKKwlzdHJ1Y3QgcmxiX2NsaWVudF9pbmZvICpjbGllbnRfaW5mbzsKKwlpbnQgbnR0ID0gMDsKKwl1MzIgaGFzaF9pbmRleDsKKworCV9sb2NrX3J4X2hhc2h0YmwoYm9uZCk7CisKKwloYXNoX2luZGV4ID0gYm9uZF9pbmZvLT5yeF9oYXNodGJsX2hlYWQ7CisJZm9yICg7IGhhc2hfaW5kZXggIT0gUkxCX05VTExfSU5ERVg7IGhhc2hfaW5kZXggPSBjbGllbnRfaW5mby0+bmV4dCkgeworCQljbGllbnRfaW5mbyA9ICYoYm9uZF9pbmZvLT5yeF9oYXNodGJsW2hhc2hfaW5kZXhdKTsKKworCQlpZiAoKGNsaWVudF9pbmZvLT5zbGF2ZSA9PSBzbGF2ZSkgJiYKKwkJICAgIG1lbWNtcChjbGllbnRfaW5mby0+bWFjX2RzdCwgbWFjX2JjYXN0LCBFVEhfQUxFTikpIHsKKwkJCWNsaWVudF9pbmZvLT5udHQgPSAxOworCQkJbnR0ID0gMTsKKwkJfQorCX0KKworCS8vIHVwZGF0ZSB0aGUgdGVhbSdzIGZsYWcgb25seSBhZnRlciB0aGUgd2hvbGUgaXRlcmF0aW9uCisJaWYgKG50dCkgeworCQlib25kX2luZm8tPnJ4X250dCA9IDE7CisJCS8vZmFzdGVuIHRoZSBjaGFuZ2UKKwkJYm9uZF9pbmZvLT5ybGJfdXBkYXRlX3JldHJ5X2NvdW50ZXIgPSBSTEJfVVBEQVRFX1JFVFJZOworCX0KKworCV91bmxvY2tfcnhfaGFzaHRibChib25kKTsKK30KKworLyogbWFyayBhbGwgY2xpZW50cyB1c2luZyBzcmNfaXAgdG8gYmUgdXBkYXRlZCAqLworc3RhdGljIHZvaWQgcmxiX3JlcV91cGRhdGVfc3VibmV0X2NsaWVudHMoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHUzMiBzcmNfaXApCit7CisJc3RydWN0IGFsYl9ib25kX2luZm8gKmJvbmRfaW5mbyA9ICYoQk9ORF9BTEJfSU5GTyhib25kKSk7CisJc3RydWN0IHJsYl9jbGllbnRfaW5mbyAqY2xpZW50X2luZm87CisJdTMyIGhhc2hfaW5kZXg7CisKKwlfbG9ja19yeF9oYXNodGJsKGJvbmQpOworCisJaGFzaF9pbmRleCA9IGJvbmRfaW5mby0+cnhfaGFzaHRibF9oZWFkOworCWZvciAoOyBoYXNoX2luZGV4ICE9IFJMQl9OVUxMX0lOREVYOyBoYXNoX2luZGV4ID0gY2xpZW50X2luZm8tPm5leHQpIHsKKwkJY2xpZW50X2luZm8gPSAmKGJvbmRfaW5mby0+cnhfaGFzaHRibFtoYXNoX2luZGV4XSk7CisKKwkJaWYgKCFjbGllbnRfaW5mby0+c2xhdmUpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkJICAgICAgICI6IEVycm9yOiBmb3VuZCBhIGNsaWVudCB3aXRoIG5vIGNoYW5uZWwgaW4gIgorCQkJICAgICAgICJ0aGUgY2xpZW50J3MgaGFzaCB0YWJsZVxuIik7CisJCQljb250aW51ZTsKKwkJfQorCQkvKnVwZGF0ZSBhbGwgY2xpZW50cyB1c2luZyB0aGlzIHNyY19pcCwgdGhhdCBhcmUgbm90IGFzc2lnbmVkCisJCSAqIHRvIHRoZSB0ZWFtJ3MgYWRkcmVzcyAoY3Vycl9hY3RpdmVfc2xhdmUpIGFuZCBoYXZlIGEga25vd24KKwkJICogdW5pY2FzdCBtYWMgYWRkcmVzcy4KKwkJICovCisJCWlmICgoY2xpZW50X2luZm8tPmlwX3NyYyA9PSBzcmNfaXApICYmCisJCSAgICBtZW1jbXAoY2xpZW50X2luZm8tPnNsYXZlLT5kZXYtPmRldl9hZGRyLAorCQkJICAgYm9uZC0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pICYmCisJCSAgICBtZW1jbXAoY2xpZW50X2luZm8tPm1hY19kc3QsIG1hY19iY2FzdCwgRVRIX0FMRU4pKSB7CisJCQljbGllbnRfaW5mby0+bnR0ID0gMTsKKwkJCWJvbmRfaW5mby0+cnhfbnR0ID0gMTsKKwkJfQorCX0KKworCV91bmxvY2tfcnhfaGFzaHRibChib25kKTsKK30KKworLyogQ2FsbGVyIG11c3QgaG9sZCBib3RoIGJvbmQgYW5kIHB0ciBsb2NrcyBmb3IgcmVhZCAqLworc3RhdGljIHN0cnVjdCBzbGF2ZSAqcmxiX2Nob29zZV9jaGFubmVsKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBib25kaW5nICpib25kKQoreworCXN0cnVjdCBhbGJfYm9uZF9pbmZvICpib25kX2luZm8gPSAmKEJPTkRfQUxCX0lORk8oYm9uZCkpOworCXN0cnVjdCBhcnBfcGt0ICphcnAgPSAoc3RydWN0IGFycF9wa3QgKilza2ItPm5oLnJhdzsKKwlzdHJ1Y3Qgc2xhdmUgKmFzc2lnbmVkX3NsYXZlOworCXN0cnVjdCBybGJfY2xpZW50X2luZm8gKmNsaWVudF9pbmZvOworCXUzMiBoYXNoX2luZGV4ID0gMDsKKworCV9sb2NrX3J4X2hhc2h0YmwoYm9uZCk7CisKKwloYXNoX2luZGV4ID0gX3NpbXBsZV9oYXNoKCh1OCAqKSZhcnAtPmlwX2RzdCwgc2l6ZW9mKGFycC0+aXBfc3JjKSk7CisJY2xpZW50X2luZm8gPSAmKGJvbmRfaW5mby0+cnhfaGFzaHRibFtoYXNoX2luZGV4XSk7CisKKwlpZiAoY2xpZW50X2luZm8tPmFzc2lnbmVkKSB7CisJCWlmICgoY2xpZW50X2luZm8tPmlwX3NyYyA9PSBhcnAtPmlwX3NyYykgJiYKKwkJICAgIChjbGllbnRfaW5mby0+aXBfZHN0ID09IGFycC0+aXBfZHN0KSkgeworCQkJLyogdGhlIGVudHJ5IGlzIGFscmVhZHkgYXNzaWduZWQgdG8gdGhpcyBjbGllbnQgKi8KKwkJCWlmIChtZW1jbXAoYXJwLT5tYWNfZHN0LCBtYWNfYmNhc3QsIEVUSF9BTEVOKSkgeworCQkJCS8qIHVwZGF0ZSBtYWMgYWRkcmVzcyBmcm9tIGFycCAqLworCQkJCW1lbWNweShjbGllbnRfaW5mby0+bWFjX2RzdCwgYXJwLT5tYWNfZHN0LCBFVEhfQUxFTik7CisJCQl9CisKKwkJCWFzc2lnbmVkX3NsYXZlID0gY2xpZW50X2luZm8tPnNsYXZlOworCQkJaWYgKGFzc2lnbmVkX3NsYXZlKSB7CisJCQkJX3VubG9ja19yeF9oYXNodGJsKGJvbmQpOworCQkJCXJldHVybiBhc3NpZ25lZF9zbGF2ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIHRoZSBlbnRyeSBpcyBhbHJlYWR5IGFzc2lnbmVkIHRvIHNvbWUgb3RoZXIgY2xpZW50LAorCQkJICogbW92ZSB0aGUgb2xkIGNsaWVudCB0byBwcmltYXJ5IChjdXJyX2FjdGl2ZV9zbGF2ZSkgc28KKwkJCSAqIHRoYXQgdGhlIG5ldyBjbGllbnQgY2FuIGJlIGFzc2lnbmVkIHRvIHRoaXMgZW50cnkuCisJCQkgKi8KKwkJCWlmIChib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSAmJgorCQkJICAgIGNsaWVudF9pbmZvLT5zbGF2ZSAhPSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSkgeworCQkJCWNsaWVudF9pbmZvLT5zbGF2ZSA9IGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlOworCQkJCXJsYl91cGRhdGVfY2xpZW50KGNsaWVudF9pbmZvKTsKKwkJCX0KKwkJfQorCX0KKwkvKiBhc3NpZ24gYSBuZXcgc2xhdmUgKi8KKwlhc3NpZ25lZF9zbGF2ZSA9IHJsYl9uZXh0X3J4X3NsYXZlKGJvbmQpOworCisJaWYgKGFzc2lnbmVkX3NsYXZlKSB7CisJCWNsaWVudF9pbmZvLT5pcF9zcmMgPSBhcnAtPmlwX3NyYzsKKwkJY2xpZW50X2luZm8tPmlwX2RzdCA9IGFycC0+aXBfZHN0OworCQkvKiBhcnAtPm1hY19kc3QgaXMgYnJvYWRjYXN0IGZvciBhcnAgcmVxZXVzdHMuCisJCSAqIHdpbGwgYmUgdXBkYXRlZCB3aXRoIGNsaWVudHMgYWN0dWFsIHVuaWNhc3QgbWFjIGFkZHJlc3MKKwkJICogdXBvbiByZWNlaXZpbmcgYW4gYXJwIHJlcGx5LgorCQkgKi8KKwkJbWVtY3B5KGNsaWVudF9pbmZvLT5tYWNfZHN0LCBhcnAtPm1hY19kc3QsIEVUSF9BTEVOKTsKKwkJY2xpZW50X2luZm8tPnNsYXZlID0gYXNzaWduZWRfc2xhdmU7CisKKwkJaWYgKG1lbWNtcChjbGllbnRfaW5mby0+bWFjX2RzdCwgbWFjX2JjYXN0LCBFVEhfQUxFTikpIHsKKwkJCWNsaWVudF9pbmZvLT5udHQgPSAxOworCQkJYm9uZC0+YWxiX2luZm8ucnhfbnR0ID0gMTsKKwkJfSBlbHNlIHsKKwkJCWNsaWVudF9pbmZvLT5udHQgPSAwOworCQl9CisKKwkJaWYgKCFsaXN0X2VtcHR5KCZib25kLT52bGFuX2xpc3QpKSB7CisJCQl1bnNpZ25lZCBzaG9ydCB2bGFuX2lkOworCQkJaW50IHJlcyA9IHZsYW5fZ2V0X3RhZyhza2IsICZ2bGFuX2lkKTsKKwkJCWlmICghcmVzKSB7CisJCQkJY2xpZW50X2luZm8tPnRhZyA9IDE7CisJCQkJY2xpZW50X2luZm8tPnZsYW5faWQgPSB2bGFuX2lkOworCQkJfQorCQl9CisKKwkJaWYgKCFjbGllbnRfaW5mby0+YXNzaWduZWQpIHsKKwkJCXUzMiBwcmV2X3RibF9oZWFkID0gYm9uZF9pbmZvLT5yeF9oYXNodGJsX2hlYWQ7CisJCQlib25kX2luZm8tPnJ4X2hhc2h0YmxfaGVhZCA9IGhhc2hfaW5kZXg7CisJCQljbGllbnRfaW5mby0+bmV4dCA9IHByZXZfdGJsX2hlYWQ7CisJCQlpZiAocHJldl90YmxfaGVhZCAhPSBSTEJfTlVMTF9JTkRFWCkgeworCQkJCWJvbmRfaW5mby0+cnhfaGFzaHRibFtwcmV2X3RibF9oZWFkXS5wcmV2ID0KKwkJCQkJaGFzaF9pbmRleDsKKwkJCX0KKwkJCWNsaWVudF9pbmZvLT5hc3NpZ25lZCA9IDE7CisJCX0KKwl9CisKKwlfdW5sb2NrX3J4X2hhc2h0YmwoYm9uZCk7CisKKwlyZXR1cm4gYXNzaWduZWRfc2xhdmU7Cit9CisKKy8qIGNob29zZXMgKGFuZCByZXR1cm5zKSB0cmFuc21pdCBjaGFubmVsIGZvciBhcnAgcmVwbHkKKyAqIGRvZXMgbm90IGNob29zZSBjaGFubmVsIGZvciBvdGhlciBhcnAgdHlwZXMgc2luY2UgdGhleSBhcmUKKyAqIHNlbnQgb24gdGhlIGN1cnJfYWN0aXZlX3NsYXZlCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2xhdmUgKnJsYl9hcnBfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKK3sKKwlzdHJ1Y3QgYXJwX3BrdCAqYXJwID0gKHN0cnVjdCBhcnBfcGt0ICopc2tiLT5uaC5yYXc7CisJc3RydWN0IHNsYXZlICp0eF9zbGF2ZSA9IE5VTEw7CisKKwlpZiAoYXJwLT5vcF9jb2RlID09IF9fY29uc3RhbnRfaHRvbnMoQVJQT1BfUkVQTFkpKSB7CisJCS8qIHRoZSBhcnAgbXVzdCBiZSBzZW50IG9uIHRoZSBzZWxlY3RlZAorCQkqIHJ4IGNoYW5uZWwKKwkJKi8KKwkJdHhfc2xhdmUgPSBybGJfY2hvb3NlX2NoYW5uZWwoc2tiLCBib25kKTsKKwkJaWYgKHR4X3NsYXZlKSB7CisJCQltZW1jcHkoYXJwLT5tYWNfc3JjLHR4X3NsYXZlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJCX0KKwkJZHByaW50aygiU2VydmVyIHNlbnQgQVJQIFJlcGx5IHBhY2tldFxuIik7CisJfSBlbHNlIGlmIChhcnAtPm9wX2NvZGUgPT0gX19jb25zdGFudF9odG9ucyhBUlBPUF9SRVFVRVNUKSkgeworCQkvKiBDcmVhdGUgYW4gZW50cnkgaW4gdGhlIHJ4X2hhc2h0YmwgZm9yIHRoaXMgY2xpZW50IGFzIGEKKwkJICogcGxhY2UgaG9sZGVyLgorCQkgKiBXaGVuIHRoZSBhcnAgcmVwbHkgaXMgcmVjZWl2ZWQgdGhlIGVudHJ5IHdpbGwgYmUgdXBkYXRlZAorCQkgKiB3aXRoIHRoZSBjb3JyZWN0IHVuaWNhc3QgYWRkcmVzcyBvZiB0aGUgY2xpZW50LgorCQkgKi8KKwkJcmxiX2Nob29zZV9jaGFubmVsKHNrYiwgYm9uZCk7CisKKwkJLyogVGhlIEFSUCByZWxweSBwYWNrZXRzIG11c3QgYmUgZGVsYXllZCBzbyB0aGF0CisJCSAqIHRoZXkgY2FuIGNhbmNlbCBvdXQgdGhlIGluZmx1ZW5jZSBvZiB0aGUgQVJQIHJlcXVlc3QuCisJCSAqLworCQlib25kLT5hbGJfaW5mby5ybGJfdXBkYXRlX2RlbGF5X2NvdW50ZXIgPSBSTEJfVVBEQVRFX0RFTEFZOworCisJCS8qIGFycCByZXF1ZXN0cyBhcmUgYnJvYWRjYXN0IGFuZCBhcmUgc2VudCBvbiB0aGUgcHJpbWFyeQorCQkgKiB0aGUgYXJwIHJlcXVlc3Qgd2lsbCBjb2xsYXBzZSBhbGwgY2xpZW50cyBvbiB0aGUgc3VibmV0IHRvCisJCSAqIHRoZSBwcmltYXJ5IHNsYXZlLiBXZSBtdXN0IHJlZ2lzdGVyIHRoZXNlIGNsaWVudHMgdG8gYmUKKwkJICogdXBkYXRlZCB3aXRoIHRoZWlyIGFzc2lnbmVkIG1hYy4KKwkJICovCisJCXJsYl9yZXFfdXBkYXRlX3N1Ym5ldF9jbGllbnRzKGJvbmQsIGFycC0+aXBfc3JjKTsKKwkJZHByaW50aygiU2VydmVyIHNlbnQgQVJQIFJlcXVlc3QgcGFja2V0XG4iKTsKKwl9CisKKwlyZXR1cm4gdHhfc2xhdmU7Cit9CisKKy8qIENhbGxlciBtdXN0IGhvbGQgYm9uZCBsb2NrIGZvciByZWFkICovCitzdGF0aWMgdm9pZCBybGJfcmViYWxhbmNlKHN0cnVjdCBib25kaW5nICpib25kKQoreworCXN0cnVjdCBhbGJfYm9uZF9pbmZvICpib25kX2luZm8gPSAmKEJPTkRfQUxCX0lORk8oYm9uZCkpOworCXN0cnVjdCBzbGF2ZSAqYXNzaWduZWRfc2xhdmU7CisJc3RydWN0IHJsYl9jbGllbnRfaW5mbyAqY2xpZW50X2luZm87CisJaW50IG50dDsKKwl1MzIgaGFzaF9pbmRleDsKKworCV9sb2NrX3J4X2hhc2h0YmwoYm9uZCk7CisKKwludHQgPSAwOworCWhhc2hfaW5kZXggPSBib25kX2luZm8tPnJ4X2hhc2h0YmxfaGVhZDsKKwlmb3IgKDsgaGFzaF9pbmRleCAhPSBSTEJfTlVMTF9JTkRFWDsgaGFzaF9pbmRleCA9IGNsaWVudF9pbmZvLT5uZXh0KSB7CisJCWNsaWVudF9pbmZvID0gJihib25kX2luZm8tPnJ4X2hhc2h0YmxbaGFzaF9pbmRleF0pOworCQlhc3NpZ25lZF9zbGF2ZSA9IHJsYl9uZXh0X3J4X3NsYXZlKGJvbmQpOworCQlpZiAoYXNzaWduZWRfc2xhdmUgJiYgKGNsaWVudF9pbmZvLT5zbGF2ZSAhPSBhc3NpZ25lZF9zbGF2ZSkpIHsKKwkJCWNsaWVudF9pbmZvLT5zbGF2ZSA9IGFzc2lnbmVkX3NsYXZlOworCQkJY2xpZW50X2luZm8tPm50dCA9IDE7CisJCQludHQgPSAxOworCQl9CisJfQorCisJLyogdXBkYXRlIHRoZSB0ZWFtJ3MgZmxhZyBvbmx5IGFmdGVyIHRoZSB3aG9sZSBpdGVyYXRpb24gKi8KKwlpZiAobnR0KSB7CisJCWJvbmRfaW5mby0+cnhfbnR0ID0gMTsKKwl9CisJX3VubG9ja19yeF9oYXNodGJsKGJvbmQpOworfQorCisvKiBDYWxsZXIgbXVzdCBob2xkIHJ4X2hhc2h0YmwgbG9jayAqLworc3RhdGljIHZvaWQgcmxiX2luaXRfdGFibGVfZW50cnkoc3RydWN0IHJsYl9jbGllbnRfaW5mbyAqZW50cnkpCit7CisJbWVtc2V0KGVudHJ5LCAwLCBzaXplb2Yoc3RydWN0IHJsYl9jbGllbnRfaW5mbykpOworCWVudHJ5LT5uZXh0ID0gUkxCX05VTExfSU5ERVg7CisJZW50cnktPnByZXYgPSBSTEJfTlVMTF9JTkRFWDsKK30KKworc3RhdGljIGludCBybGJfaW5pdGlhbGl6ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKK3sKKwlzdHJ1Y3QgYWxiX2JvbmRfaW5mbyAqYm9uZF9pbmZvID0gJihCT05EX0FMQl9JTkZPKGJvbmQpKTsKKwlzdHJ1Y3QgcGFja2V0X3R5cGUgKnBrX3R5cGUgPSAmKEJPTkRfQUxCX0lORk8oYm9uZCkucmxiX3BrdF90eXBlKTsKKwlpbnQgc2l6ZSA9IFJMQl9IQVNIX1RBQkxFX1NJWkUgKiBzaXplb2Yoc3RydWN0IHJsYl9jbGllbnRfaW5mbyk7CisJaW50IGk7CisKKwlzcGluX2xvY2tfaW5pdCgmKGJvbmRfaW5mby0+cnhfaGFzaHRibF9sb2NrKSk7CisKKwlfbG9ja19yeF9oYXNodGJsKGJvbmQpOworCisJYm9uZF9pbmZvLT5yeF9oYXNodGJsID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJvbmRfaW5mby0+cnhfaGFzaHRibCkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKKwkJICAgICAgICI6IEVycm9yOiAlczogRmFpbGVkIHRvIGFsbG9jYXRlIFJMQiBoYXNoIHRhYmxlXG4iLAorCQkgICAgICAgYm9uZC0+ZGV2LT5uYW1lKTsKKwkJX3VubG9ja19yeF9oYXNodGJsKGJvbmQpOworCQlyZXR1cm4gLTE7CisJfQorCisJYm9uZF9pbmZvLT5yeF9oYXNodGJsX2hlYWQgPSBSTEJfTlVMTF9JTkRFWDsKKworCWZvciAoaSA9IDA7IGkgPCBSTEJfSEFTSF9UQUJMRV9TSVpFOyBpKyspIHsKKwkJcmxiX2luaXRfdGFibGVfZW50cnkoYm9uZF9pbmZvLT5yeF9oYXNodGJsICsgaSk7CisJfQorCisJX3VubG9ja19yeF9oYXNodGJsKGJvbmQpOworCisJLyppbml0aWFsaXplIHBhY2tldCB0eXBlKi8KKwlwa190eXBlLT50eXBlID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9BUlApOworCXBrX3R5cGUtPmRldiA9IGJvbmQtPmRldjsKKwlwa190eXBlLT5mdW5jID0gcmxiX2FycF9yZWN2OworCisJLyogcmVnaXN0ZXIgdG8gcmVjZWl2ZSBBUlBzICovCisJZGV2X2FkZF9wYWNrKHBrX3R5cGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJsYl9kZWluaXRpYWxpemUoc3RydWN0IGJvbmRpbmcgKmJvbmQpCit7CisJc3RydWN0IGFsYl9ib25kX2luZm8gKmJvbmRfaW5mbyA9ICYoQk9ORF9BTEJfSU5GTyhib25kKSk7CisKKwlkZXZfcmVtb3ZlX3BhY2soJihib25kX2luZm8tPnJsYl9wa3RfdHlwZSkpOworCisJX2xvY2tfcnhfaGFzaHRibChib25kKTsKKworCWtmcmVlKGJvbmRfaW5mby0+cnhfaGFzaHRibCk7CisJYm9uZF9pbmZvLT5yeF9oYXNodGJsID0gTlVMTDsKKwlib25kX2luZm8tPnJ4X2hhc2h0YmxfaGVhZCA9IFJMQl9OVUxMX0lOREVYOworCisJX3VubG9ja19yeF9oYXNodGJsKGJvbmQpOworfQorCitzdGF0aWMgdm9pZCBybGJfY2xlYXJfdmxhbihzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgdW5zaWduZWQgc2hvcnQgdmxhbl9pZCkKK3sKKwlzdHJ1Y3QgYWxiX2JvbmRfaW5mbyAqYm9uZF9pbmZvID0gJihCT05EX0FMQl9JTkZPKGJvbmQpKTsKKwl1MzIgY3Vycl9pbmRleDsKKworCV9sb2NrX3J4X2hhc2h0YmwoYm9uZCk7CisKKwljdXJyX2luZGV4ID0gYm9uZF9pbmZvLT5yeF9oYXNodGJsX2hlYWQ7CisJd2hpbGUgKGN1cnJfaW5kZXggIT0gUkxCX05VTExfSU5ERVgpIHsKKwkJc3RydWN0IHJsYl9jbGllbnRfaW5mbyAqY3VyciA9ICYoYm9uZF9pbmZvLT5yeF9oYXNodGJsW2N1cnJfaW5kZXhdKTsKKwkJdTMyIG5leHRfaW5kZXggPSBib25kX2luZm8tPnJ4X2hhc2h0YmxbY3Vycl9pbmRleF0ubmV4dDsKKwkJdTMyIHByZXZfaW5kZXggPSBib25kX2luZm8tPnJ4X2hhc2h0YmxbY3Vycl9pbmRleF0ucHJldjsKKworCQlpZiAoY3Vyci0+dGFnICYmIChjdXJyLT52bGFuX2lkID09IHZsYW5faWQpKSB7CisJCQlpZiAoY3Vycl9pbmRleCA9PSBib25kX2luZm8tPnJ4X2hhc2h0YmxfaGVhZCkgeworCQkJCWJvbmRfaW5mby0+cnhfaGFzaHRibF9oZWFkID0gbmV4dF9pbmRleDsKKwkJCX0KKwkJCWlmIChwcmV2X2luZGV4ICE9IFJMQl9OVUxMX0lOREVYKSB7CisJCQkJYm9uZF9pbmZvLT5yeF9oYXNodGJsW3ByZXZfaW5kZXhdLm5leHQgPSBuZXh0X2luZGV4OworCQkJfQorCQkJaWYgKG5leHRfaW5kZXggIT0gUkxCX05VTExfSU5ERVgpIHsKKwkJCQlib25kX2luZm8tPnJ4X2hhc2h0YmxbbmV4dF9pbmRleF0ucHJldiA9IHByZXZfaW5kZXg7CisJCQl9CisKKwkJCXJsYl9pbml0X3RhYmxlX2VudHJ5KGN1cnIpOworCQl9CisKKwkJY3Vycl9pbmRleCA9IG5leHRfaW5kZXg7CisJfQorCisJX3VubG9ja19yeF9oYXNodGJsKGJvbmQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKiogdGxiL3JsYiBzaGFyZWQgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgYWxiX3NlbmRfbGVhcm5pbmdfcGFja2V0cyhzdHJ1Y3Qgc2xhdmUgKnNsYXZlLCB1OCBtYWNfYWRkcltdKQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9nZXRfYm9uZF9ieV9zbGF2ZShzbGF2ZSk7CisJc3RydWN0IGxlYXJuaW5nX3BrdCBwa3Q7CisJaW50IHNpemUgPSBzaXplb2Yoc3RydWN0IGxlYXJuaW5nX3BrdCk7CisJaW50IGk7CisKKwltZW1zZXQoJnBrdCwgMCwgc2l6ZSk7CisJbWVtY3B5KHBrdC5tYWNfZHN0LCBtYWNfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShwa3QubWFjX3NyYywgbWFjX2FkZHIsIEVUSF9BTEVOKTsKKwlwa3QudHlwZSA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfTE9PUCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xQX0JVUlNUOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJY2hhciAqZGF0YTsKKworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemUpOworCQlpZiAoIXNrYikgeworCQkJcmV0dXJuOworCQl9CisKKwkJZGF0YSA9IHNrYl9wdXQoc2tiLCBzaXplKTsKKwkJbWVtY3B5KGRhdGEsICZwa3QsIHNpemUpOworCisJCXNrYi0+bWFjLnJhdyA9IGRhdGE7CisJCXNrYi0+bmgucmF3ID0gZGF0YSArIEVUSF9ITEVOOworCQlza2ItPnByb3RvY29sID0gcGt0LnR5cGU7CisJCXNrYi0+cHJpb3JpdHkgPSBUQ19QUklPX0NPTlRST0w7CisJCXNrYi0+ZGV2ID0gc2xhdmUtPmRldjsKKworCQlpZiAoIWxpc3RfZW1wdHkoJmJvbmQtPnZsYW5fbGlzdCkpIHsKKwkJCXN0cnVjdCB2bGFuX2VudHJ5ICp2bGFuOworCisJCQl2bGFuID0gYm9uZF9uZXh0X3ZsYW4oYm9uZCwKKwkJCQkJICAgICAgYm9uZC0+YWxiX2luZm8uY3VycmVudF9hbGJfdmxhbik7CisKKwkJCWJvbmQtPmFsYl9pbmZvLmN1cnJlbnRfYWxiX3ZsYW4gPSB2bGFuOworCQkJaWYgKCF2bGFuKSB7CisJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXNrYiA9IHZsYW5fcHV0X3RhZyhza2IsIHZsYW4tPnZsYW5faWQpOworCQkJaWYgKCFza2IpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKKwkJCQkgICAgICAgIjogRXJyb3I6IGZhaWxlZCB0byBpbnNlcnQgVkxBTiB0YWdcbiIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJZGV2X3F1ZXVlX3htaXQoc2tiKTsKKwl9Cit9CisKKy8qIGh3IGlzIGEgYm9vbGVhbiBwYXJhbWV0ZXIgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgd2Ugc2hvdWxkIHRyeSBhbmQKKyAqIHNldCB0aGUgaHcgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGFzIHdlbGwgYXMgdGhlIGh3IGFkZHJlc3Mgb2YgdGhlCisgKiBuZXRfZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgYWxiX3NldF9zbGF2ZV9tYWNfYWRkcihzdHJ1Y3Qgc2xhdmUgKnNsYXZlLCB1OCBhZGRyW10sIGludCBodykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2xhdmUtPmRldjsKKwlzdHJ1Y3Qgc29ja2FkZHIgc19hZGRyOworCisJaWYgKCFodykgeworCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkciwgZGV2LT5hZGRyX2xlbik7CisJCXJldHVybiAwOworCX0KKworCS8qIGZvciBybGIgZWFjaCBzbGF2ZSBtdXN0IGhhdmUgYSB1bmlxdWUgaHcgbWFjIGFkZHJlc3NlcyBzbyB0aGF0ICovCisJLyogZWFjaCBzbGF2ZSB3aWxsIHJlY2VpdmUgcGFja2V0cyBkZXN0aW5lZCB0byBhIGRpZmZlcmVudCBtYWMgKi8KKwltZW1jcHkoc19hZGRyLnNhX2RhdGEsIGFkZHIsIGRldi0+YWRkcl9sZW4pOworCXNfYWRkci5zYV9mYW1pbHkgPSBkZXYtPnR5cGU7CisJaWYgKGRldl9zZXRfbWFjX2FkZHJlc3MoZGV2LCAmc19hZGRyKSkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKKwkJICAgICAgICI6IEVycm9yOiBkZXZfc2V0X21hY19hZGRyZXNzIG9mIGRldiAlcyBmYWlsZWQhIEFMQiAiCisJCSAgICAgICAibW9kZSByZXF1aXJlcyB0aGF0IHRoZSBiYXNlIGRyaXZlciBzdXBwb3J0IHNldHRpbmcgIgorCQkgICAgICAgInRoZSBodyBhZGRyZXNzIGFsc28gd2hlbiB0aGUgbmV0d29yayBkZXZpY2UncyAiCisJCSAgICAgICAiaW50ZXJmYWNlIGlzIG9wZW5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCXJldHVybiAwOworfQorCisvKiBDYWxsZXIgbXVzdCBob2xkIGJvbmQgbG9jayBmb3Igd3JpdGUgb3IgY3Vycl9zbGF2ZV9sb2NrIGZvciB3cml0ZSovCitzdGF0aWMgdm9pZCBhbGJfc3dhcF9tYWNfYWRkcihzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHNsYXZlICpzbGF2ZTEsIHN0cnVjdCBzbGF2ZSAqc2xhdmUyKQoreworCXN0cnVjdCBzbGF2ZSAqZGlzYWJsZWRfc2xhdmUgPSBOVUxMOworCXU4IHRtcF9tYWNfYWRkcltFVEhfQUxFTl07CisJaW50IHNsYXZlc19zdGF0ZV9kaWZmZXI7CisKKwlzbGF2ZXNfc3RhdGVfZGlmZmVyID0gKFNMQVZFX0lTX09LKHNsYXZlMSkgIT0gU0xBVkVfSVNfT0soc2xhdmUyKSk7CisKKwltZW1jcHkodG1wX21hY19hZGRyLCBzbGF2ZTEtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwlhbGJfc2V0X3NsYXZlX21hY19hZGRyKHNsYXZlMSwgc2xhdmUyLT5kZXYtPmRldl9hZGRyLCBib25kLT5hbGJfaW5mby5ybGJfZW5hYmxlZCk7CisJYWxiX3NldF9zbGF2ZV9tYWNfYWRkcihzbGF2ZTIsIHRtcF9tYWNfYWRkciwgYm9uZC0+YWxiX2luZm8ucmxiX2VuYWJsZWQpOworCisJLyogZmFzdGVuIHRoZSBjaGFuZ2UgaW4gdGhlIHN3aXRjaCAqLworCWlmIChTTEFWRV9JU19PSyhzbGF2ZTEpKSB7CisJCWFsYl9zZW5kX2xlYXJuaW5nX3BhY2tldHMoc2xhdmUxLCBzbGF2ZTEtPmRldi0+ZGV2X2FkZHIpOworCQlpZiAoYm9uZC0+YWxiX2luZm8ucmxiX2VuYWJsZWQpIHsKKwkJCS8qIGluZm9ybSB0aGUgY2xpZW50cyB0aGF0IHRoZSBtYWMgYWRkcmVzcworCQkJICogaGFzIGNoYW5nZWQKKwkJCSAqLworCQkJcmxiX3JlcV91cGRhdGVfc2xhdmVfY2xpZW50cyhib25kLCBzbGF2ZTEpOworCQl9CisJfSBlbHNlIHsKKwkJZGlzYWJsZWRfc2xhdmUgPSBzbGF2ZTE7CisJfQorCisJaWYgKFNMQVZFX0lTX09LKHNsYXZlMikpIHsKKwkJYWxiX3NlbmRfbGVhcm5pbmdfcGFja2V0cyhzbGF2ZTIsIHNsYXZlMi0+ZGV2LT5kZXZfYWRkcik7CisJCWlmIChib25kLT5hbGJfaW5mby5ybGJfZW5hYmxlZCkgeworCQkJLyogaW5mb3JtIHRoZSBjbGllbnRzIHRoYXQgdGhlIG1hYyBhZGRyZXNzCisJCQkgKiBoYXMgY2hhbmdlZAorCQkJICovCisJCQlybGJfcmVxX3VwZGF0ZV9zbGF2ZV9jbGllbnRzKGJvbmQsIHNsYXZlMik7CisJCX0KKwl9IGVsc2UgeworCQlkaXNhYmxlZF9zbGF2ZSA9IHNsYXZlMjsKKwl9CisKKwlpZiAoYm9uZC0+YWxiX2luZm8ucmxiX2VuYWJsZWQgJiYgc2xhdmVzX3N0YXRlX2RpZmZlcikgeworCQkvKiBBIGRpc2FibGVkIHNsYXZlIHdhcyBhc3NpZ25lZCBhbiBhY3RpdmUgbWFjIGFkZHIgKi8KKwkJcmxiX3RlYWNoX2Rpc2FibGVkX21hY19vbl9wcmltYXJ5KGJvbmQsCisJCQkJCQkgIGRpc2FibGVkX3NsYXZlLT5kZXYtPmRldl9hZGRyKTsKKwl9Cit9CisKKy8qKgorICogYWxiX2NoYW5nZV9od19hZGRyX29uX2RldGFjaAorICogQGJvbmQ6IGJvbmRpbmcgd2UncmUgd29ya2luZyBvbgorICogQHNsYXZlOiB0aGUgc2xhdmUgdGhhdCB3YXMganVzdCBkZXRhY2hlZAorICoKKyAqIFdlIGFzc3VtZSB0aGF0IEBzbGF2ZSB3YXMgYWxyZWFkeSBkZXRhY2hlZCBmcm9tIHRoZSBzbGF2ZSBsaXN0LgorICoKKyAqIElmIEBzbGF2ZSdzIHBlcm1hbmVudCBodyBhZGRyZXNzIGlzIGRpZmZlcmVudCBib3RoIGZyb20gaXRzIGN1cnJlbnQKKyAqIGFkZHJlc3MgYW5kIGZyb20gQGJvbmQncyBhZGRyZXNzLCB0aGVuIHNvbWV3aGVyZSBpbiB0aGUgYm9uZCB0aGVyZSdzCisgKiBhIHNsYXZlIHRoYXQgaGFzIEBzbGF2ZSdzIHBlcm1hbmV0IGFkZHJlc3MgYXMgaXRzIGN1cnJlbnQgYWRkcmVzcy4KKyAqIFdlJ2xsIG1ha2Ugc3VyZSB0aGF0IHRoYXQgc2xhdmUgbm8gbG9uZ2VyIHVzZXMgQHNsYXZlJ3MgcGVybWFuZW50IGFkZHJlc3MuCisgKgorICogQ2FsbGVyIG11c3QgaG9sZCBib25kIGxvY2sKKyAqLworc3RhdGljIHZvaWQgYWxiX2NoYW5nZV9od19hZGRyX29uX2RldGFjaChzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHNsYXZlICpzbGF2ZSkKK3sKKwlpbnQgcGVybV9jdXJyX2RpZmY7CisJaW50IHBlcm1fYm9uZF9kaWZmOworCisJcGVybV9jdXJyX2RpZmYgPSBtZW1jbXAoc2xhdmUtPnBlcm1faHdhZGRyLAorCQkJCXNsYXZlLT5kZXYtPmRldl9hZGRyLAorCQkJCUVUSF9BTEVOKTsKKwlwZXJtX2JvbmRfZGlmZiA9IG1lbWNtcChzbGF2ZS0+cGVybV9od2FkZHIsCisJCQkJYm9uZC0+ZGV2LT5kZXZfYWRkciwKKwkJCQlFVEhfQUxFTik7CisKKwlpZiAocGVybV9jdXJyX2RpZmYgJiYgcGVybV9ib25kX2RpZmYpIHsKKwkJc3RydWN0IHNsYXZlICp0bXBfc2xhdmU7CisJCWludCBpLCBmb3VuZCA9IDA7CisKKwkJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCB0bXBfc2xhdmUsIGkpIHsKKwkJCWlmICghbWVtY21wKHNsYXZlLT5wZXJtX2h3YWRkciwKKwkJCQkgICAgdG1wX3NsYXZlLT5kZXYtPmRldl9hZGRyLAorCQkJCSAgICBFVEhfQUxFTikpIHsKKwkJCQlmb3VuZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoZm91bmQpIHsKKwkJCWFsYl9zd2FwX21hY19hZGRyKGJvbmQsIHNsYXZlLCB0bXBfc2xhdmUpOworCQl9CisJfQorfQorCisvKioKKyAqIGFsYl9oYW5kbGVfYWRkcl9jb2xsaXNpb25fb25fYXR0YWNoCisgKiBAYm9uZDogYm9uZGluZyB3ZSdyZSB3b3JraW5nIG9uCisgKiBAc2xhdmU6IHRoZSBzbGF2ZSB0aGF0IHdhcyBqdXN0IGF0dGFjaGVkCisgKgorICogY2hlY2tzIHVuaXF1ZW5lc3Mgb2Ygc2xhdmUncyBtYWMgYWRkcmVzcyBhbmQgaGFuZGxlcyB0aGUgY2FzZSB0aGUKKyAqIG5ldyBzbGF2ZSB1c2VzIHRoZSBib25kcyBtYWMgYWRkcmVzcy4KKyAqCisgKiBJZiB0aGUgcGVybWFuZW50IGh3IGFkZHJlc3Mgb2YgQHNsYXZlIGlzIEBib25kJ3MgaHcgYWRkcmVzcywgd2UgbmVlZCB0bworICogZmluZCBhIGRpZmZlcmVudCBodyBhZGRyZXNzIHRvIGdpdmUgQHNsYXZlLCB0aGF0IGlzbid0IGluIHVzZSBieSBhbnkgb3RoZXIKKyAqIHNsYXZlIGluIHRoZSBib25kLiBUaGlzIGFkZHJlc3MgbXVzdCBiZSwgb2YgY291cnNlLCBvbmUgb2YgdGhlIHByZW1hbmVudAorICogYWRkcmVzc2VzIG9mIHRoZSBvdGhlciBzbGF2ZXMuCisgKgorICogV2UgZ28gb3ZlciB0aGUgc2xhdmUgbGlzdCwgYW5kIGZvciBlYWNoIHNsYXZlIHRoZXJlIHdlIGNvbXBhcmUgaXRzCisgKiBwZXJtYW5lbnQgaHcgYWRkcmVzcyB3aXRoIHRoZSBjdXJyZW50IGFkZHJlc3Mgb2YgYWxsIHRoZSBvdGhlciBzbGF2ZXMuCisgKiBJZiBubyBtYXRjaCB3YXMgZm91bmQsIHRoZW4gd2UndmUgZm91bmQgYSBzbGF2ZSB3aXRoIGEgcGVybWFuZW50IGFkZHJlc3MKKyAqIHRoYXQgaXNuJ3QgdXNlZCBieSBhbnkgb3RoZXIgc2xhdmUgaW4gdGhlIGJvbmQsIHNvIHdlIGNhbiBhc3NpZ24gaXQgdG8KKyAqIEBzbGF2ZS4KKyAqCisgKiBhc3N1bXB0aW9uOiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgQHNsYXZlIGlzIGF0dGFjaGVkIHRvIHRoZQorICogCSAgICAgICBib25kIHNsYXZlIGxpc3QuCisgKgorICogY2FsbGVyIG11c3QgaG9sZCB0aGUgYm9uZCBsb2NrIGZvciB3cml0ZSBzaW5jZSB0aGUgbWFjIGFkZHJlc3NlcyBhcmUgY29tcGFyZWQKKyAqIGFuZCBtYXkgYmUgc3dhcHBlZC4KKyAqLworc3RhdGljIGludCBhbGJfaGFuZGxlX2FkZHJfY29sbGlzaW9uX29uX2F0dGFjaChzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHNsYXZlICpzbGF2ZSkKK3sKKwlzdHJ1Y3Qgc2xhdmUgKnRtcF9zbGF2ZTEsICp0bXBfc2xhdmUyLCAqZnJlZV9tYWNfc2xhdmU7CisJc3RydWN0IHNsYXZlICpoYXNfYm9uZF9hZGRyID0gYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmU7CisJaW50IGksIGosIGZvdW5kID0gMDsKKworCWlmIChib25kLT5zbGF2ZV9jbnQgPT0gMCkgeworCQkvKiB0aGlzIGlzIHRoZSBmaXJzdCBzbGF2ZSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBpZiBzbGF2ZSdzIG1hYyBhZGRyZXNzIGRpZmZlcnMgZnJvbSBib25kJ3MgbWFjIGFkZHJlc3MKKwkgKiBjaGVjayB1bmlxdWVuZXNzIG9mIHNsYXZlJ3MgbWFjIGFkZHJlc3MgYWdhaW5zdCB0aGUgb3RoZXIKKwkgKiBzbGF2ZXMgaW4gdGhlIGJvbmQuCisJICovCisJaWYgKG1lbWNtcChzbGF2ZS0+cGVybV9od2FkZHIsIGJvbmQtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSkgeworCQlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHRtcF9zbGF2ZTEsIGkpIHsKKwkJCWlmICghbWVtY21wKHRtcF9zbGF2ZTEtPmRldi0+ZGV2X2FkZHIsIHNsYXZlLT5kZXYtPmRldl9hZGRyLAorCQkJCSAgICBFVEhfQUxFTikpIHsKKwkJCQlmb3VuZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoZm91bmQpIHsKKwkJCS8qIGEgc2xhdmUgd2FzIGZvdW5kIHRoYXQgaXMgdXNpbmcgdGhlIG1hYyBhZGRyZXNzCisJCQkgKiBvZiB0aGUgbmV3IHNsYXZlCisJCQkgKi8KKwkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkJICAgICAgICI6IEVycm9yOiB0aGUgaHcgYWRkcmVzcyBvZiBzbGF2ZSAlcyBpcyBub3QgIgorCQkJICAgICAgICJ1bmlxdWUgLSBjYW5ub3QgZW5zbGF2ZSBpdCEiLAorCQkJICAgICAgIHNsYXZlLT5kZXYtPm5hbWUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBUaGUgc2xhdmUncyBhZGRyZXNzIGlzIGVxdWFsIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBib25kLgorCSAqIFNlYXJjaCBmb3IgYSBzcGFyZSBhZGRyZXNzIGluIHRoZSBib25kIGZvciB0aGlzIHNsYXZlLgorCSAqLworCWZyZWVfbWFjX3NsYXZlID0gTlVMTDsKKworCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgdG1wX3NsYXZlMSwgaSkgeworCQlmb3VuZCA9IDA7CisJCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgdG1wX3NsYXZlMiwgaikgeworCQkJaWYgKCFtZW1jbXAodG1wX3NsYXZlMS0+cGVybV9od2FkZHIsCisJCQkJICAgIHRtcF9zbGF2ZTItPmRldi0+ZGV2X2FkZHIsCisJCQkJICAgIEVUSF9BTEVOKSkgeworCQkJCWZvdW5kID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICghZm91bmQpIHsKKwkJCS8qIG5vIHNsYXZlIGhhcyB0bXBfc2xhdmUxJ3MgcGVybSBhZGRyCisJCQkgKiBhcyBpdHMgY3VyciBhZGRyCisJCQkgKi8KKwkJCWZyZWVfbWFjX3NsYXZlID0gdG1wX3NsYXZlMTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCFoYXNfYm9uZF9hZGRyKSB7CisJCQlpZiAoIW1lbWNtcCh0bXBfc2xhdmUxLT5kZXYtPmRldl9hZGRyLAorCQkJCSAgICBib25kLT5kZXYtPmRldl9hZGRyLAorCQkJCSAgICBFVEhfQUxFTikpIHsKKworCQkJCWhhc19ib25kX2FkZHIgPSB0bXBfc2xhdmUxOworCQkJfQorCQl9CisJfQorCisJaWYgKGZyZWVfbWFjX3NsYXZlKSB7CisJCWFsYl9zZXRfc2xhdmVfbWFjX2FkZHIoc2xhdmUsIGZyZWVfbWFjX3NsYXZlLT5wZXJtX2h3YWRkciwKKwkJCQkgICAgICAgYm9uZC0+YWxiX2luZm8ucmxiX2VuYWJsZWQpOworCisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJICAgICAgICI6IFdhcm5pbmc6IHRoZSBodyBhZGRyZXNzIG9mIHNsYXZlICVzIGlzIGluIHVzZSBieSAiCisJCSAgICAgICAidGhlIGJvbmQ7IGdpdmluZyBpdCB0aGUgaHcgYWRkcmVzcyBvZiAlc1xuIiwKKwkJICAgICAgIHNsYXZlLT5kZXYtPm5hbWUsIGZyZWVfbWFjX3NsYXZlLT5kZXYtPm5hbWUpOworCisJfSBlbHNlIGlmIChoYXNfYm9uZF9hZGRyKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkgICAgICAgIjogRXJyb3I6IHRoZSBodyBhZGRyZXNzIG9mIHNsYXZlICVzIGlzIGluIHVzZSBieSB0aGUgIgorCQkgICAgICAgImJvbmQ7IGNvdWxkbid0IGZpbmQgYSBzbGF2ZSB3aXRoIGEgZnJlZSBodyBhZGRyZXNzIHRvICIKKwkJICAgICAgICJnaXZlIGl0ICh0aGlzIHNob3VsZCBub3QgaGF2ZSBoYXBwZW5lZClcbiIsCisJCSAgICAgICBzbGF2ZS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYWxiX3NldF9tYWNfYWRkcmVzcworICogQGJvbmQ6CisgKiBAYWRkcjoKKyAqCisgKiBJbiBUTEIgbW9kZSBhbGwgc2xhdmVzIGFyZSBjb25maWd1cmVkIHRvIHRoZSBib25kJ3MgaHcgYWRkcmVzcywgYnV0IHNldAorICogdGhlaXIgZGV2X2FkZHIgZmllbGQgdG8gZGlmZmVyZW50IGFkZHJlc3NlcyAoYmFzZWQgb24gdGhlaXIgcGVybWFuZW50IGh3CisgKiBhZGRyZXNzZXMpLgorICoKKyAqIEZvciBlYWNoIHNsYXZlLCB0aGlzIGZ1bmN0aW9uIHNldHMgdGhlIGludGVyZmFjZSB0byB0aGUgbmV3IGFkZHJlc3MgYW5kIHRoZW4KKyAqIGNoYW5nZXMgaXRzIGRldl9hZGRyIGZpZWxkIHRvIGl0cyBwcmV2aW91cyB2YWx1ZS4KKyAqCisgKiBVbndpbmRpbmcgYXNzdW1lcyBib25kJ3MgbWFjIGFkZHJlc3MgaGFzIG5vdCB5ZXQgY2hhbmdlZC4KKyAqLworc3RhdGljIGludCBhbGJfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBib25kaW5nICpib25kLCB2b2lkICphZGRyKQoreworCXN0cnVjdCBzb2NrYWRkciBzYTsKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlLCAqc3RvcF9hdDsKKwljaGFyIHRtcF9hZGRyW0VUSF9BTEVOXTsKKwlpbnQgcmVzOworCWludCBpOworCisJaWYgKGJvbmQtPmFsYl9pbmZvLnJsYl9lbmFibGVkKSB7CisJCXJldHVybiAwOworCX0KKworCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGkpIHsKKwkJaWYgKHNsYXZlLT5kZXYtPnNldF9tYWNfYWRkcmVzcyA9PSBOVUxMKSB7CisJCQlyZXMgPSAtRU9QTk9UU1VQUDsKKwkJCWdvdG8gdW53aW5kOworCQl9CisKKwkJLyogc2F2ZSBuZXRfZGV2aWNlJ3MgY3VycmVudCBodyBhZGRyZXNzICovCisJCW1lbWNweSh0bXBfYWRkciwgc2xhdmUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKworCQlyZXMgPSBkZXZfc2V0X21hY19hZGRyZXNzKHNsYXZlLT5kZXYsIGFkZHIpOworCisJCS8qIHJlc3RvcmUgbmV0X2RldmljZSdzIGh3IGFkZHJlc3MgKi8KKwkJbWVtY3B5KHNsYXZlLT5kZXYtPmRldl9hZGRyLCB0bXBfYWRkciwgRVRIX0FMRU4pOworCisJCWlmIChyZXMpIHsKKwkJCWdvdG8gdW53aW5kOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK3Vud2luZDoKKwltZW1jcHkoc2Euc2FfZGF0YSwgYm9uZC0+ZGV2LT5kZXZfYWRkciwgYm9uZC0+ZGV2LT5hZGRyX2xlbik7CisJc2Euc2FfZmFtaWx5ID0gYm9uZC0+ZGV2LT50eXBlOworCisJLyogdW53aW5kIGZyb20gaGVhZCB0byB0aGUgc2xhdmUgdGhhdCBmYWlsZWQgKi8KKwlzdG9wX2F0ID0gc2xhdmU7CisJYm9uZF9mb3JfZWFjaF9zbGF2ZV9mcm9tX3RvKGJvbmQsIHNsYXZlLCBpLCBib25kLT5maXJzdF9zbGF2ZSwgc3RvcF9hdCkgeworCQltZW1jcHkodG1wX2FkZHIsIHNsYXZlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJCWRldl9zZXRfbWFjX2FkZHJlc3Moc2xhdmUtPmRldiwgJnNhKTsKKwkJbWVtY3B5KHNsYXZlLT5kZXYtPmRldl9hZGRyLCB0bXBfYWRkciwgRVRIX0FMRU4pOworCX0KKworCXJldHVybiByZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogZXhwb3J0ZWQgYWxiIGZ1bmNpb25zICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IGJvbmRfYWxiX2luaXRpYWxpemUoc3RydWN0IGJvbmRpbmcgKmJvbmQsIGludCBybGJfZW5hYmxlZCkKK3sKKwlpbnQgcmVzOworCisJcmVzID0gdGxiX2luaXRpYWxpemUoYm9uZCk7CisJaWYgKHJlcykgeworCQlyZXR1cm4gcmVzOworCX0KKworCWlmIChybGJfZW5hYmxlZCkgeworCQlib25kLT5hbGJfaW5mby5ybGJfZW5hYmxlZCA9IDE7CisJCS8qIGluaXRpYWxpemUgcmxiICovCisJCXJlcyA9IHJsYl9pbml0aWFsaXplKGJvbmQpOworCQlpZiAocmVzKSB7CisJCQl0bGJfZGVpbml0aWFsaXplKGJvbmQpOworCQkJcmV0dXJuIHJlczsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGJvbmRfYWxiX2RlaW5pdGlhbGl6ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKK3sKKwlzdHJ1Y3QgYWxiX2JvbmRfaW5mbyAqYm9uZF9pbmZvID0gJihCT05EX0FMQl9JTkZPKGJvbmQpKTsKKworCXRsYl9kZWluaXRpYWxpemUoYm9uZCk7CisKKwlpZiAoYm9uZF9pbmZvLT5ybGJfZW5hYmxlZCkgeworCQlybGJfZGVpbml0aWFsaXplKGJvbmQpOworCX0KK30KKworaW50IGJvbmRfYWxiX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2KQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisJc3RydWN0IGV0aGhkciAqZXRoX2RhdGE7CisJc3RydWN0IGFsYl9ib25kX2luZm8gKmJvbmRfaW5mbyA9ICYoQk9ORF9BTEJfSU5GTyhib25kKSk7CisJc3RydWN0IHNsYXZlICp0eF9zbGF2ZSA9IE5VTEw7CisJc3RhdGljIHUzMiBpcF9iY2FzdCA9IDB4ZmZmZmZmZmY7CisJaW50IGhhc2hfc2l6ZSA9IDA7CisJaW50IGRvX3R4X2JhbGFuY2UgPSAxOworCXUzMiBoYXNoX2luZGV4ID0gMDsKKwl1OCAqaGFzaF9zdGFydCA9IE5VTEw7CisJaW50IHJlcyA9IDE7CisKKwlza2ItPm1hYy5yYXcgPSAodW5zaWduZWQgY2hhciAqKXNrYi0+ZGF0YTsKKwlldGhfZGF0YSA9IGV0aF9oZHIoc2tiKTsKKworCS8qIG1ha2Ugc3VyZSB0aGF0IHRoZSBjdXJyX2FjdGl2ZV9zbGF2ZSBhbmQgdGhlIHNsYXZlcyBsaXN0IGRvCisJICogbm90IGNoYW5nZSBkdXJpbmcgdHgKKwkgKi8KKwlyZWFkX2xvY2soJmJvbmQtPmxvY2spOworCXJlYWRfbG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKworCWlmICghQk9ORF9JU19PSyhib25kKSkgeworCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2ggKG50b2hzKHNrYi0+cHJvdG9jb2wpKSB7CisJY2FzZSBFVEhfUF9JUDoKKwkJaWYgKChtZW1jbXAoZXRoX2RhdGEtPmhfZGVzdCwgbWFjX2JjYXN0LCBFVEhfQUxFTikgPT0gMCkgfHwKKwkJICAgIChza2ItPm5oLmlwaC0+ZGFkZHIgPT0gaXBfYmNhc3QpIHx8CisJCSAgICAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fSUdNUCkpIHsKKwkJCWRvX3R4X2JhbGFuY2UgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJaGFzaF9zdGFydCA9IChjaGFyKikmKHNrYi0+bmguaXBoLT5kYWRkcik7CisJCWhhc2hfc2l6ZSA9IHNpemVvZihza2ItPm5oLmlwaC0+ZGFkZHIpOworCQlicmVhazsKKwljYXNlIEVUSF9QX0lQVjY6CisJCWlmIChtZW1jbXAoZXRoX2RhdGEtPmhfZGVzdCwgbWFjX2JjYXN0LCBFVEhfQUxFTikgPT0gMCkgeworCQkJZG9fdHhfYmFsYW5jZSA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWhhc2hfc3RhcnQgPSAoY2hhciopJihza2ItPm5oLmlwdjZoLT5kYWRkcik7CisJCWhhc2hfc2l6ZSA9IHNpemVvZihza2ItPm5oLmlwdjZoLT5kYWRkcik7CisJCWJyZWFrOworCWNhc2UgRVRIX1BfSVBYOgorCQlpZiAoaXB4X2hkcihza2IpLT5pcHhfY2hlY2tzdW0gIT0KKwkJICAgIF9fY29uc3RhbnRfaHRvbnMoSVBYX05PX0NIRUNLU1VNKSkgeworCQkJLyogc29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhpcyBwYWNrZXQgKi8KKwkJCWRvX3R4X2JhbGFuY2UgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaXB4X2hkcihza2IpLT5pcHhfdHlwZSAhPSBJUFhfVFlQRV9OQ1ApIHsKKwkJCS8qIFRoZSBvbmx5IHByb3RvY29sIHdvcnRoIGJhbGFuY2luZyBpbgorCQkJICogdGhpcyBmYW1pbHkgc2luY2UgaXQgaGFzIGFuICJBUlAiIGxpa2UKKwkJCSAqIG1lY2hhbmlzbQorCQkJICovCisJCQlkb190eF9iYWxhbmNlID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJaGFzaF9zdGFydCA9IChjaGFyKilldGhfZGF0YS0+aF9kZXN0OworCQloYXNoX3NpemUgPSBFVEhfQUxFTjsKKwkJYnJlYWs7CisJY2FzZSBFVEhfUF9BUlA6CisJCWRvX3R4X2JhbGFuY2UgPSAwOworCQlpZiAoYm9uZF9pbmZvLT5ybGJfZW5hYmxlZCkgeworCQkJdHhfc2xhdmUgPSBybGJfYXJwX3htaXQoc2tiLCBib25kKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkb190eF9iYWxhbmNlID0gMDsKKwkJYnJlYWs7CisJfQorCisJaWYgKGRvX3R4X2JhbGFuY2UpIHsKKwkJaGFzaF9pbmRleCA9IF9zaW1wbGVfaGFzaChoYXNoX3N0YXJ0LCBoYXNoX3NpemUpOworCQl0eF9zbGF2ZSA9IHRsYl9jaG9vc2VfY2hhbm5lbChib25kLCBoYXNoX2luZGV4LCBza2ItPmxlbik7CisJfQorCisJaWYgKCF0eF9zbGF2ZSkgeworCQkvKiB1bmJhbGFuY2VkIG9yIHVuYXNzaWduZWQsIHNlbmQgdGhyb3VnaCBwcmltYXJ5ICovCisJCXR4X3NsYXZlID0gYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmU7CisJCWJvbmRfaW5mby0+dW5iYWxhbmNlZF9sb2FkICs9IHNrYi0+bGVuOworCX0KKworCWlmICh0eF9zbGF2ZSAmJiBTTEFWRV9JU19PSyh0eF9zbGF2ZSkpIHsKKwkJaWYgKHR4X3NsYXZlICE9IGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKSB7CisJCQltZW1jcHkoZXRoX2RhdGEtPmhfc291cmNlLAorCQkJICAgICAgIHR4X3NsYXZlLT5kZXYtPmRldl9hZGRyLAorCQkJICAgICAgIEVUSF9BTEVOKTsKKwkJfQorCisJCXJlcyA9IGJvbmRfZGV2X3F1ZXVlX3htaXQoYm9uZCwgc2tiLCB0eF9zbGF2ZS0+ZGV2KTsKKwl9IGVsc2UgeworCQlpZiAodHhfc2xhdmUpIHsKKwkJCXRsYl9jbGVhcl9zbGF2ZShib25kLCB0eF9zbGF2ZSwgMCk7CisJCX0KKwl9CisKK291dDoKKwlpZiAocmVzKSB7CisJCS8qIG5vIHN1aXRhYmxlIGludGVyZmFjZSwgZnJhbWUgbm90IHNlbnQgKi8KKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0KKwlyZWFkX3VubG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKwlyZWFkX3VubG9jaygmYm9uZC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYm9uZF9hbGJfbW9uaXRvcihzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKK3sKKwlzdHJ1Y3QgYWxiX2JvbmRfaW5mbyAqYm9uZF9pbmZvID0gJihCT05EX0FMQl9JTkZPKGJvbmQpKTsKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlOworCWludCBpOworCisJcmVhZF9sb2NrKCZib25kLT5sb2NrKTsKKworCWlmIChib25kLT5raWxsX3RpbWVycykgeworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYm9uZC0+c2xhdmVfY250ID09IDApIHsKKwkJYm9uZF9pbmZvLT50eF9yZWJhbGFuY2VfY291bnRlciA9IDA7CisJCWJvbmRfaW5mby0+bHBfY291bnRlciA9IDA7CisJCWdvdG8gcmVfYXJtOworCX0KKworCWJvbmRfaW5mby0+dHhfcmViYWxhbmNlX2NvdW50ZXIrKzsKKwlib25kX2luZm8tPmxwX2NvdW50ZXIrKzsKKworCS8qIHNlbmQgbGVhcm5pbmcgcGFja2V0cyAqLworCWlmIChib25kX2luZm8tPmxwX2NvdW50ZXIgPj0gQk9ORF9BTEJfTFBfVElDS1MpIHsKKwkJLyogY2hhbmdlIG9mIGN1cnJfYWN0aXZlX3NsYXZlIGludm9sdmVzIHN3YXBwaW5nIG9mIG1hYyBhZGRyZXNzZXMuCisJCSAqIGluIG9yZGVyIHRvIGF2b2lkIHRoaXMgc3dhcHBpbmcgZnJvbSBoYXBwZW5pbmcgd2hpbGUKKwkJICogc2VuZGluZyB0aGUgbGVhcm5pbmcgcGFja2V0cywgdGhlIGN1cnJfc2xhdmVfbG9jayBtdXN0IGJlIGhlbGQgZm9yCisJCSAqIHJlYWQuCisJCSAqLworCQlyZWFkX2xvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisKKwkJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgeworCQkJYWxiX3NlbmRfbGVhcm5pbmdfcGFja2V0cyhzbGF2ZSxzbGF2ZS0+ZGV2LT5kZXZfYWRkcik7CisJCX0KKworCQlyZWFkX3VubG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKworCQlib25kX2luZm8tPmxwX2NvdW50ZXIgPSAwOworCX0KKworCS8qIHJlYmFsYW5jZSB0eCB0cmFmZmljICovCisJaWYgKGJvbmRfaW5mby0+dHhfcmViYWxhbmNlX2NvdW50ZXIgPj0gQk9ORF9UTEJfUkVCQUxBTkNFX1RJQ0tTKSB7CisKKwkJcmVhZF9sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCisJCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGkpIHsKKwkJCXRsYl9jbGVhcl9zbGF2ZShib25kLCBzbGF2ZSwgMSk7CisJCQlpZiAoc2xhdmUgPT0gYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUpIHsKKwkJCQlTTEFWRV9UTEJfSU5GTyhzbGF2ZSkubG9hZCA9CisJCQkJCWJvbmRfaW5mby0+dW5iYWxhbmNlZF9sb2FkIC8KKwkJCQkJCUJPTkRfVExCX1JFQkFMQU5DRV9JTlRFUlZBTDsKKwkJCQlib25kX2luZm8tPnVuYmFsYW5jZWRfbG9hZCA9IDA7CisJCQl9CisJCX0KKworCQlyZWFkX3VubG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKworCQlib25kX2luZm8tPnR4X3JlYmFsYW5jZV9jb3VudGVyID0gMDsKKwl9CisKKwkvKiBoYW5kbGUgcmxiIHN0dWZmICovCisJaWYgKGJvbmRfaW5mby0+cmxiX2VuYWJsZWQpIHsKKwkJLyogdGhlIGZvbGxvd2luZyBjb2RlIGNoYW5nZXMgdGhlIHByb21pc2N1aXR5IG9mIHRoZQorCQkgKiB0aGUgY3Vycl9hY3RpdmVfc2xhdmUuIEl0IG5lZWRzIHRvIGJlIGxvY2tlZCB3aXRoIGEKKwkJICogd3JpdGUgbG9jayB0byBwcm90ZWN0IGZyb20gb3RoZXIgY29kZSB0aGF0IGFsc28KKwkJICogc2V0cyB0aGUgcHJvbWlzY3VpdHkuCisJCSAqLworCQl3cml0ZV9sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCisJCWlmIChib25kX2luZm8tPnByaW1hcnlfaXNfcHJvbWlzYyAmJgorCQkgICAgKCsrYm9uZF9pbmZvLT5ybGJfcHJvbWlzY190aW1lb3V0X2NvdW50ZXIgPj0gUkxCX1BST01JU0NfVElNRU9VVCkpIHsKKworCQkJYm9uZF9pbmZvLT5ybGJfcHJvbWlzY190aW1lb3V0X2NvdW50ZXIgPSAwOworCisJCQkvKiBJZiB0aGUgcHJpbWFyeSB3YXMgc2V0IHRvIHByb21pc2N1b3VzIG1vZGUKKwkJCSAqIGJlY2F1c2UgYSBzbGF2ZSB3YXMgZGlzYWJsZWQgdGhlbgorCQkJICogaXQgY2FuIG5vdyBsZWF2ZSBwcm9taXNjdW91cyBtb2RlLgorCQkJICovCisJCQlkZXZfc2V0X3Byb21pc2N1aXR5KGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlLT5kZXYsIC0xKTsKKwkJCWJvbmRfaW5mby0+cHJpbWFyeV9pc19wcm9taXNjID0gMDsKKwkJfQorCisJCXdyaXRlX3VubG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKworCQlpZiAoYm9uZF9pbmZvLT5ybGJfcmViYWxhbmNlKSB7CisJCQlib25kX2luZm8tPnJsYl9yZWJhbGFuY2UgPSAwOworCQkJcmxiX3JlYmFsYW5jZShib25kKTsKKwkJfQorCisJCS8qIGNoZWNrIGlmIGNsaWVudHMgbmVlZCB1cGRhdGluZyAqLworCQlpZiAoYm9uZF9pbmZvLT5yeF9udHQpIHsKKwkJCWlmIChib25kX2luZm8tPnJsYl91cGRhdGVfZGVsYXlfY291bnRlcikgeworCQkJCS0tYm9uZF9pbmZvLT5ybGJfdXBkYXRlX2RlbGF5X2NvdW50ZXI7CisJCQl9IGVsc2UgeworCQkJCXJsYl91cGRhdGVfcnhfY2xpZW50cyhib25kKTsKKwkJCQlpZiAoYm9uZF9pbmZvLT5ybGJfdXBkYXRlX3JldHJ5X2NvdW50ZXIpIHsKKwkJCQkJLS1ib25kX2luZm8tPnJsYl91cGRhdGVfcmV0cnlfY291bnRlcjsKKwkJCQl9IGVsc2UgeworCQkJCQlib25kX2luZm8tPnJ4X250dCA9IDA7CisJCQkJfQorCQkJfQorCQl9CisJfQorCityZV9hcm06CisJbW9kX3RpbWVyKCYoYm9uZF9pbmZvLT5hbGJfdGltZXIpLCBqaWZmaWVzICsgYWxiX2RlbHRhX2luX3RpY2tzKTsKK291dDoKKwlyZWFkX3VubG9jaygmYm9uZC0+bG9jayk7Cit9CisKKy8qIGFzc3VtcHRpb246IGNhbGxlZCBiZWZvcmUgdGhlIHNsYXZlIGlzIGF0dGFjaGVkIHRvIHRoZSBib25kCisgKiBhbmQgbm90IGxvY2tlZCBieSB0aGUgYm9uZCBsb2NrCisgKi8KK2ludCBib25kX2FsYl9pbml0X3NsYXZlKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQoreworCWludCByZXM7CisKKwlyZXMgPSBhbGJfc2V0X3NsYXZlX21hY19hZGRyKHNsYXZlLCBzbGF2ZS0+cGVybV9od2FkZHIsCisJCQkJICAgICBib25kLT5hbGJfaW5mby5ybGJfZW5hYmxlZCk7CisJaWYgKHJlcykgeworCQlyZXR1cm4gcmVzOworCX0KKworCS8qIGNhbGxlciBtdXN0IGhvbGQgdGhlIGJvbmQgbG9jayBmb3Igd3JpdGUgc2luY2UgdGhlIG1hYyBhZGRyZXNzZXMKKwkgKiBhcmUgY29tcGFyZWQgYW5kIG1heSBiZSBzd2FwcGVkLgorCSAqLworCXdyaXRlX2xvY2tfYmgoJmJvbmQtPmxvY2spOworCisJcmVzID0gYWxiX2hhbmRsZV9hZGRyX2NvbGxpc2lvbl9vbl9hdHRhY2goYm9uZCwgc2xhdmUpOworCisJd3JpdGVfdW5sb2NrX2JoKCZib25kLT5sb2NrKTsKKworCWlmIChyZXMpIHsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwl0bGJfaW5pdF9zbGF2ZShzbGF2ZSk7CisKKwkvKiBvcmRlciBhIHJlYmFsYW5jZSBBU0FQICovCisJYm9uZC0+YWxiX2luZm8udHhfcmViYWxhbmNlX2NvdW50ZXIgPSBCT05EX1RMQl9SRUJBTEFOQ0VfVElDS1M7CisKKwlpZiAoYm9uZC0+YWxiX2luZm8ucmxiX2VuYWJsZWQpIHsKKwkJYm9uZC0+YWxiX2luZm8ucmxiX3JlYmFsYW5jZSA9IDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlciBtdXN0IGhvbGQgYm9uZCBsb2NrIGZvciB3cml0ZSAqLwordm9pZCBib25kX2FsYl9kZWluaXRfc2xhdmUoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHN0cnVjdCBzbGF2ZSAqc2xhdmUpCit7CisJaWYgKGJvbmQtPnNsYXZlX2NudCA+IDEpIHsKKwkJYWxiX2NoYW5nZV9od19hZGRyX29uX2RldGFjaChib25kLCBzbGF2ZSk7CisJfQorCisJdGxiX2NsZWFyX3NsYXZlKGJvbmQsIHNsYXZlLCAwKTsKKworCWlmIChib25kLT5hbGJfaW5mby5ybGJfZW5hYmxlZCkgeworCQlib25kLT5hbGJfaW5mby5uZXh0X3J4X3NsYXZlID0gTlVMTDsKKwkJcmxiX2NsZWFyX3NsYXZlKGJvbmQsIHNsYXZlKTsKKwl9Cit9CisKKy8qIENhbGxlciBtdXN0IGhvbGQgYm9uZCBsb2NrIGZvciByZWFkICovCit2b2lkIGJvbmRfYWxiX2hhbmRsZV9saW5rX2NoYW5nZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHNsYXZlICpzbGF2ZSwgY2hhciBsaW5rKQoreworCXN0cnVjdCBhbGJfYm9uZF9pbmZvICpib25kX2luZm8gPSAmKEJPTkRfQUxCX0lORk8oYm9uZCkpOworCisJaWYgKGxpbmsgPT0gQk9ORF9MSU5LX0RPV04pIHsKKwkJdGxiX2NsZWFyX3NsYXZlKGJvbmQsIHNsYXZlLCAwKTsKKwkJaWYgKGJvbmQtPmFsYl9pbmZvLnJsYl9lbmFibGVkKSB7CisJCQlybGJfY2xlYXJfc2xhdmUoYm9uZCwgc2xhdmUpOworCQl9CisJfSBlbHNlIGlmIChsaW5rID09IEJPTkRfTElOS19VUCkgeworCQkvKiBvcmRlciBhIHJlYmFsYW5jZSBBU0FQICovCisJCWJvbmRfaW5mby0+dHhfcmViYWxhbmNlX2NvdW50ZXIgPSBCT05EX1RMQl9SRUJBTEFOQ0VfVElDS1M7CisJCWlmIChib25kLT5hbGJfaW5mby5ybGJfZW5hYmxlZCkgeworCQkJYm9uZC0+YWxiX2luZm8ucmxiX3JlYmFsYW5jZSA9IDE7CisJCQkvKiBJZiB0aGUgdXBkZWxheSBtb2R1bGUgcGFyYW1ldGVyIGlzIHNtYWxsZXIgdGhhbiB0aGUKKwkJCSAqIGZvcndhcmRpbmcgZGVsYXkgb2YgdGhlIHN3aXRjaCB0aGUgcmViYWxhbmNlIHdpbGwKKwkJCSAqIG5vdCB3b3JrIGJlY2F1c2UgdGhlIHJlYmFsYW5jZSBhcnAgcmVwbGllcyB3aWxsCisJCQkgKiBub3QgYmUgZm9yd2FyZGVkIHRvIHRoZSBjbGllbnRzLi4KKwkJCSAqLworCQl9CisJfQorfQorCisvKioKKyAqIGJvbmRfYWxiX2hhbmRsZV9hY3RpdmVfY2hhbmdlIC0gYXNzaWduIG5ldyBjdXJyX2FjdGl2ZV9zbGF2ZQorICogQGJvbmQ6IG91ciBib25kaW5nIHN0cnVjdAorICogQG5ld19zbGF2ZTogbmV3IHNsYXZlIHRvIGFzc2lnbgorICoKKyAqIFNldCB0aGUgYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUgdG8gQG5ld19zbGF2ZSBhbmQgaGFuZGxlCisgKiBtYWMgYWRkcmVzcyBzd2FwcGluZyBhbmQgcHJvbWlzY3VpdHkgY2hhbmdlcyBhcyBuZWVkZWQuCisgKgorICogQ2FsbGVyIG11c3QgaG9sZCBib25kIGN1cnJfc2xhdmVfbG9jayBmb3Igd3JpdGUgKG9yIGJvbmQgbG9jayBmb3Igd3JpdGUpCisgKi8KK3ZvaWQgYm9uZF9hbGJfaGFuZGxlX2FjdGl2ZV9jaGFuZ2Uoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHN0cnVjdCBzbGF2ZSAqbmV3X3NsYXZlKQoreworCXN0cnVjdCBzbGF2ZSAqc3dhcF9zbGF2ZTsKKwlpbnQgaTsKKworCWlmIChib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSA9PSBuZXdfc2xhdmUpIHsKKwkJcmV0dXJuOworCX0KKworCWlmIChib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSAmJiBib25kLT5hbGJfaW5mby5wcmltYXJ5X2lzX3Byb21pc2MpIHsKKwkJZGV2X3NldF9wcm9taXNjdWl0eShib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZS0+ZGV2LCAtMSk7CisJCWJvbmQtPmFsYl9pbmZvLnByaW1hcnlfaXNfcHJvbWlzYyA9IDA7CisJCWJvbmQtPmFsYl9pbmZvLnJsYl9wcm9taXNjX3RpbWVvdXRfY291bnRlciA9IDA7CisJfQorCisJc3dhcF9zbGF2ZSA9IGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlOworCWJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlID0gbmV3X3NsYXZlOworCisJaWYgKCFuZXdfc2xhdmUgfHwgKGJvbmQtPnNsYXZlX2NudCA9PSAwKSkgeworCQlyZXR1cm47CisJfQorCisJLyogc2V0IHRoZSBuZXcgY3Vycl9hY3RpdmVfc2xhdmUgdG8gdGhlIGJvbmRzIG1hYyBhZGRyZXNzCisJICogaS5lLiBzd2FwIG1hYyBhZGRyZXNzZXMgb2Ygb2xkIGN1cnJfYWN0aXZlX3NsYXZlIGFuZCBuZXcgY3Vycl9hY3RpdmVfc2xhdmUKKwkgKi8KKwlpZiAoIXN3YXBfc2xhdmUpIHsKKwkJc3RydWN0IHNsYXZlICp0bXBfc2xhdmU7CisJCS8qIGZpbmQgc2xhdmUgdGhhdCBpcyBob2xkaW5nIHRoZSBib25kJ3MgbWFjIGFkZHJlc3MgKi8KKwkJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCB0bXBfc2xhdmUsIGkpIHsKKwkJCWlmICghbWVtY21wKHRtcF9zbGF2ZS0+ZGV2LT5kZXZfYWRkciwKKwkJCQkgICAgYm9uZC0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pKSB7CisJCQkJc3dhcF9zbGF2ZSA9IHRtcF9zbGF2ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIGN1cnJfYWN0aXZlX3NsYXZlIG11c3QgYmUgc2V0IGJlZm9yZSBjYWxsaW5nIGFsYl9zd2FwX21hY19hZGRyICovCisJaWYgKHN3YXBfc2xhdmUpIHsKKwkJLyogc3dhcCBtYWMgYWRkcmVzcyAqLworCQlhbGJfc3dhcF9tYWNfYWRkcihib25kLCBzd2FwX3NsYXZlLCBuZXdfc2xhdmUpOworCX0gZWxzZSB7CisJCS8qIHNldCB0aGUgbmV3X3NsYXZlIHRvIHRoZSBib25kIG1hYyBhZGRyZXNzICovCisJCWFsYl9zZXRfc2xhdmVfbWFjX2FkZHIobmV3X3NsYXZlLCBib25kLT5kZXYtPmRldl9hZGRyLAorCQkJCSAgICAgICBib25kLT5hbGJfaW5mby5ybGJfZW5hYmxlZCk7CisJCS8qIGZhc3RlbiBib25kIG1hYyBvbiBuZXcgY3VycmVudCBzbGF2ZSAqLworCQlhbGJfc2VuZF9sZWFybmluZ19wYWNrZXRzKG5ld19zbGF2ZSwgYm9uZC0+ZGV2LT5kZXZfYWRkcik7CisJfQorfQorCitpbnQgYm9uZF9hbGJfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2Rldiwgdm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZGV2LT5wcml2OworCXN0cnVjdCBzb2NrYWRkciAqc2EgPSBhZGRyOworCXN0cnVjdCBzbGF2ZSAqc2xhdmUsICpzd2FwX3NsYXZlOworCWludCByZXM7CisJaW50IGk7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoc2EtPnNhX2RhdGEpKSB7CisJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKwl9CisKKwlyZXMgPSBhbGJfc2V0X21hY19hZGRyZXNzKGJvbmQsIGFkZHIpOworCWlmIChyZXMpIHsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwltZW1jcHkoYm9uZF9kZXYtPmRldl9hZGRyLCBzYS0+c2FfZGF0YSwgYm9uZF9kZXYtPmFkZHJfbGVuKTsKKworCS8qIElmIHRoZXJlIGlzIG5vIGN1cnJfYWN0aXZlX3NsYXZlIHRoZXJlIGlzIG5vdGhpbmcgZWxzZSB0byBkby4KKwkgKiBPdGhlcndpc2Ugd2UnbGwgbmVlZCB0byBwYXNzIHRoZSBuZXcgYWRkcmVzcyB0byBpdCBhbmQgaGFuZGxlCisJICogZHVwbGljYXRpb25zLgorCSAqLworCWlmICghYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dhcF9zbGF2ZSA9IE5VTEw7CisKKwlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7CisJCWlmICghbWVtY21wKHNsYXZlLT5kZXYtPmRldl9hZGRyLCBib25kX2Rldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSkgeworCQkJc3dhcF9zbGF2ZSA9IHNsYXZlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoc3dhcF9zbGF2ZSkgeworCQlhbGJfc3dhcF9tYWNfYWRkcihib25kLCBzd2FwX3NsYXZlLCBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSk7CisJfSBlbHNlIHsKKwkJYWxiX3NldF9zbGF2ZV9tYWNfYWRkcihib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSwgYm9uZF9kZXYtPmRldl9hZGRyLAorCQkJCSAgICAgICBib25kLT5hbGJfaW5mby5ybGJfZW5hYmxlZCk7CisKKwkJYWxiX3NlbmRfbGVhcm5pbmdfcGFja2V0cyhib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSwgYm9uZF9kZXYtPmRldl9hZGRyKTsKKwkJaWYgKGJvbmQtPmFsYl9pbmZvLnJsYl9lbmFibGVkKSB7CisJCQkvKiBpbmZvcm0gY2xpZW50cyBtYWMgYWRkcmVzcyBoYXMgY2hhbmdlZCAqLworCQkJcmxiX3JlcV91cGRhdGVfc2xhdmVfY2xpZW50cyhib25kLCBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBib25kX2FsYl9jbGVhcl92bGFuKHN0cnVjdCBib25kaW5nICpib25kLCB1bnNpZ25lZCBzaG9ydCB2bGFuX2lkKQoreworCWlmIChib25kLT5hbGJfaW5mby5jdXJyZW50X2FsYl92bGFuICYmCisJICAgIChib25kLT5hbGJfaW5mby5jdXJyZW50X2FsYl92bGFuLT52bGFuX2lkID09IHZsYW5faWQpKSB7CisJCWJvbmQtPmFsYl9pbmZvLmN1cnJlbnRfYWxiX3ZsYW4gPSBOVUxMOworCX0KKworCWlmIChib25kLT5hbGJfaW5mby5ybGJfZW5hYmxlZCkgeworCQlybGJfY2xlYXJfdmxhbihib25kLCB2bGFuX2lkKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuaCBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9hbGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDA5MWNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2FsYi5oCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKKyAqIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKgorICogQ2hhbmdlczoKKyAqCisgKiAyMDAzLzA4LzA2IC0gQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gQWRkIHN1cHBvcnQgZm9yIHNldHRpbmcgYm9uZCdzIE1BQyBhZGRyZXNzIHdpdGggc3BlY2lhbAorICoJICBoYW5kbGluZyByZXF1aXJlZCBmb3IgQUxCL1RMQi4KKyAqCisgKiAyMDAzLzEyLzAxIC0gU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKgktIENvZGUgY2xlYW51cCBhbmQgc3R5bGUgY2hhbmdlcworICovCisKKyNpZm5kZWYgX19CT05EX0FMQl9IX18KKyNkZWZpbmUgX19CT05EX0FMQl9IX18KKworI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisKK3N0cnVjdCBib25kaW5nOworc3RydWN0IHNsYXZlOworCisjZGVmaW5lIEJPTkRfQUxCX0lORk8oYm9uZCkgICAoKGJvbmQpLT5hbGJfaW5mbykKKyNkZWZpbmUgU0xBVkVfVExCX0lORk8oc2xhdmUpICgoc2xhdmUpLT50bGJfaW5mbykKKworc3RydWN0IHRsYl9jbGllbnRfaW5mbyB7CisJc3RydWN0IHNsYXZlICp0eF9zbGF2ZTsJLyogQSBwb2ludGVyIHRvIHNsYXZlIHVzZWQgZm9yIHRyYW5zbWl0aW5nCisJCQkJICogcGFja2V0cyB0byBhIENsaWVudCB0aGF0IHRoZSBIYXNoIGZ1bmN0aW9uCisJCQkJICogZ2F2ZSB0aGlzIGVudHJ5IGluZGV4LgorCQkJCSAqLworCXUzMiB0eF9ieXRlczsJCS8qIEVhY2ggQ2xpZW50IGFjdW11bGF0ZXMgdGhlIEJ5dGVzVHggdGhhdAorCQkJCSAqIHdlcmUgdHJhbm1pdHRlZCB0byBpdCwgYW5kIGFmdGVyIGVhY2gKKwkJCQkgKiBDYWxsQmFjayB0aGUgTG9hZEhpc3RvcnkgaXMgZGV2aWRlZAorCQkJCSAqIGJ5IHRoZSBiYWxhbmNlIGludGVydmFsCisJCQkJICovCisJdTMyIGxvYWRfaGlzdG9yeTsJLyogVGhpcyBmaWVsZCBjb250YWlucyB0aGUgYW1vdW50IG9mIEJ5dGVzCisJCQkJICogdGhhdCB3ZXJlIHRyYW5zbWl0dGVkIHRvIHRoaXMgY2xpZW50IGJ5CisJCQkJICogdGhlIHNlcnZlciBvbiB0aGUgcHJldmlvdXMgYmFsYW5jZQorCQkJCSAqIGludGVydmFsIGluIEJwcy4KKwkJCQkgKi8KKwl1MzIgbmV4dDsJCS8qIFRoZSBuZXh0IEhhc2ggdGFibGUgZW50cnkgaW5kZXgsIGFzc2lnbmVkCisJCQkJICogdG8gdXNlIHRoZSBzYW1lIGFkYXB0ZXIgZm9yIHRyYW5zbWl0LgorCQkJCSAqLworCXUzMiBwcmV2OwkJLyogVGhlIHByZXZpb3VzIEhhc2ggdGFibGUgZW50cnkgaW5kZXgsCisJCQkJICogYXNzaWduZWQgdG8gdXNlIHRoZSBzYW1lCisJCQkJICovCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBzdHJ1Y3QgcmxiX2NsaWVudF9pbmZvIGNvbnRhaW5zIGFsbCBpbmZvIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyByeCBjbGllbnQKKyAqIGNvbm5lY3Rpb24uIFRoaXMgaXMgdGhlIENsaWVudHMgSGFzaCBUYWJsZSBlbnRyeSBzdHJ1Y3QKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RydWN0IHJsYl9jbGllbnRfaW5mbyB7CisJdTMyIGlwX3NyYzsJCS8qIHRoZSBzZXJ2ZXIgSVAgYWRkcmVzcyAqLworCXUzMiBpcF9kc3Q7CQkvKiB0aGUgY2xpZW50IElQIGFkZHJlc3MgKi8KKwl1OCAgbWFjX2RzdFtFVEhfQUxFTl07CS8qIHRoZSBjbGllbnQgTUFDIGFkZHJlc3MgKi8KKwl1MzIgbmV4dDsJCS8qIFRoZSBuZXh0IEhhc2ggdGFibGUgZW50cnkgaW5kZXggKi8KKwl1MzIgcHJldjsJCS8qIFRoZSBwcmV2aW91cyBIYXNoIHRhYmxlIGVudHJ5IGluZGV4ICovCisJdTggIGFzc2lnbmVkOwkJLyogY2hlY2tpbmcgd2hldGhlciB0aGlzIGVudHJ5IGlzIGFzc2lnbmVkICovCisJdTggIG50dDsJCS8qIGZsYWcgLSBuZWVkIHRvIHRyYW5zbWl0IGNsaWVudCBpbmZvICovCisJc3RydWN0IHNsYXZlICpzbGF2ZTsJLyogdGhlIHNsYXZlIGFzc2lnbmVkIHRvIHRoaXMgY2xpZW50ICovCisJdTggdGFnOwkJCS8qIGZsYWcgLSBuZWVkIHRvIHRhZyBza2IgKi8KKwl1bnNpZ25lZCBzaG9ydCB2bGFuX2lkOwkvKiBWTEFOIHRhZyBhc3NvY2lhdGVkIHdpdGggSVAgYWRkcmVzcyAqLworfTsKKworc3RydWN0IHRsYl9zbGF2ZV9pbmZvIHsKKwl1MzIgaGVhZDsJLyogSW5kZXggdG8gdGhlIGhlYWQgb2YgdGhlIGJpLWRpcmVjdGlvbmFsIGNsaWVudHMKKwkJCSAqIGhhc2ggdGFibGUgZW50cmllcyBsaXN0LiBUaGUgZW50cmllcyBpbiB0aGUgbGlzdAorCQkJICogYXJlIHRoZSBlbnRyaWVzIHRoYXQgd2VyZSBhc3NpZ25lZCB0byB1c2UgdGhpcworCQkJICogc2xhdmUgZm9yIHRyYW5zbWl0LgorCQkJICovCisJdTMyIGxvYWQ7CS8qIEVhY2ggc2xhdmUgc3VtcyB0aGUgbG9hZEhpc3Rvcnkgb2YgYWxsIGNsaWVudHMKKwkJCSAqIGFzc2lnbmVkIHRvIGl0CisJCQkgKi8KK307CisKK3N0cnVjdCBhbGJfYm9uZF9pbmZvIHsKKwlzdHJ1Y3QgdGltZXJfbGlzdAlhbGJfdGltZXI7CisJc3RydWN0IHRsYl9jbGllbnRfaW5mbwkqdHhfaGFzaHRibDsgLyogRHluYW1pY2FsbHkgYWxsb2NhdGVkICovCisJc3BpbmxvY2tfdAkJdHhfaGFzaHRibF9sb2NrOworCXUzMgkJCXVuYmFsYW5jZWRfbG9hZDsKKwlpbnQJCQl0eF9yZWJhbGFuY2VfY291bnRlcjsKKwlpbnQJCQlscF9jb3VudGVyOworCS8qIC0tLS0tLS0tIHJsYiBwYXJhbWV0ZXJzIC0tLS0tLS0tICovCisJaW50IHJsYl9lbmFibGVkOworCXN0cnVjdCBwYWNrZXRfdHlwZQlybGJfcGt0X3R5cGU7CisJc3RydWN0IHJsYl9jbGllbnRfaW5mbwkqcnhfaGFzaHRibDsJLyogUmVjZWl2ZSBoYXNoIHRhYmxlICovCisJc3BpbmxvY2tfdAkJcnhfaGFzaHRibF9sb2NrOworCXUzMgkJCXJ4X2hhc2h0YmxfaGVhZDsKKwl1OAkJCXJ4X250dDsJLyogZmxhZyAtIG5lZWQgdG8gdHJhbnNtaXQKKwkJCQkJICogdG8gYWxsIHJ4IGNsaWVudHMKKwkJCQkJICovCisJc3RydWN0IHNsYXZlCQkqbmV4dF9yeF9zbGF2ZTsvKiBuZXh0IHNsYXZlIHRvIGJlIGFzc2lnbmVkCisJCQkJCQkqIHRvIGEgbmV3IHJ4IGNsaWVudCBmb3IKKwkJCQkJCSovCisJdTMyCQkJcmxiX2ludGVydmFsX2NvdW50ZXI7CisJdTgJCQlwcmltYXJ5X2lzX3Byb21pc2M7CSAgIC8qIGJvb2xlYW4gKi8KKwl1MzIJCQlybGJfcHJvbWlzY190aW1lb3V0X2NvdW50ZXI7LyogY291bnRzIHByaW1hcnkKKwkJCQkJCQkgICAgICogcHJvbWlzY3VpdHkgdGltZQorCQkJCQkJCSAgICAgKi8KKwl1MzIJCQlybGJfdXBkYXRlX2RlbGF5X2NvdW50ZXI7CisJdTMyCQkJcmxiX3VwZGF0ZV9yZXRyeV9jb3VudGVyOy8qIGNvdW50ZXIgb2YgcmV0cmllcworCQkJCQkJCSAgKiBvZiBjbGllbnQgdXBkYXRlCisJCQkJCQkJICAqLworCXU4CQkJcmxiX3JlYmFsYW5jZTsJLyogZmxhZyAtIGluZGljYXRlcyB0aGF0IHRoZQorCQkJCQkJICogcnggdHJhZmZpYyBzaG91bGQgYmUKKwkJCQkJCSAqIHJlYmFsYW5jZWQKKwkJCQkJCSAqLworCXN0cnVjdCB2bGFuX2VudHJ5CSpjdXJyZW50X2FsYl92bGFuOworfTsKKworaW50IGJvbmRfYWxiX2luaXRpYWxpemUoc3RydWN0IGJvbmRpbmcgKmJvbmQsIGludCBybGJfZW5hYmxlZCk7Cit2b2lkIGJvbmRfYWxiX2RlaW5pdGlhbGl6ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCk7CitpbnQgYm9uZF9hbGJfaW5pdF9zbGF2ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHNsYXZlICpzbGF2ZSk7Cit2b2lkIGJvbmRfYWxiX2RlaW5pdF9zbGF2ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHNsYXZlICpzbGF2ZSk7Cit2b2lkIGJvbmRfYWxiX2hhbmRsZV9saW5rX2NoYW5nZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHNsYXZlICpzbGF2ZSwgY2hhciBsaW5rKTsKK3ZvaWQgYm9uZF9hbGJfaGFuZGxlX2FjdGl2ZV9jaGFuZ2Uoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHN0cnVjdCBzbGF2ZSAqbmV3X3NsYXZlKTsKK2ludCBib25kX2FsYl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2Rldik7Cit2b2lkIGJvbmRfYWxiX21vbml0b3Ioc3RydWN0IGJvbmRpbmcgKmJvbmQpOworaW50IGJvbmRfYWxiX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYsIHZvaWQgKmFkZHIpOwordm9pZCBib25kX2FsYl9jbGVhcl92bGFuKHN0cnVjdCBib25kaW5nICpib25kLCB1bnNpZ25lZCBzaG9ydCB2bGFuX2lkKTsKKyNlbmRpZiAvKiBfX0JPTkRfQUxCX0hfXyAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzBlMjhmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYwpAQCAtMCwwICsxLDQ3MDggQEAKKy8qCisgKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBkdW1teSBkZXZpY2UuCisgKgorICogQ29weXJpZ2h0IDE5OTksIFRob21hcyBEYXZpcywgdGFkYXZpc0BsYmwuZ292LgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC4gQmFzZWQgb24gZHVtbXkuYywgYW5kIGVxbC5jIGRldmljZXMuCisgKgorICogYm9uZGluZy5jOiBhbiBFdGhlcm5ldCBCb25kaW5nIGRyaXZlcgorICoKKyAqIFRoaXMgaXMgdXNlZnVsIHRvIHRhbGsgdG8gYSBDaXNjbyBFdGhlckNoYW5uZWwgY29tcGF0aWJsZSBlcXVpcG1lbnQ6CisgKglDaXNjbyA1NTAwCisgKglTdW4gVHJ1bmtpbmcgKFNvbGFyaXMpCisgKglBbHRlb24gQWNlRGlyZWN0b3IgVHJ1bmtzCisgKglMaW51eCBCb25kaW5nCisgKglhbmQgcHJvYmFibHkgbWFueSBMMiBzd2l0Y2hlcyAuLi4KKyAqCisgKiBIb3cgaXQgd29ya3M6CisgKiAgICBpZmNvbmZpZyBib25kMCBpcGFkZHJlc3MgbmV0bWFzayB1cAorICogICAgICB3aWxsIHNldHVwIGEgbmV0d29yayBkZXZpY2UsIHdpdGggYW4gaXAgYWRkcmVzcy4gIE5vIG1hYyBhZGRyZXNzCisgKgl3aWxsIGJlIGFzc2lnbmVkIGF0IHRoaXMgdGltZS4gIFRoZSBodyBtYWMgYWRkcmVzcyB3aWxsIGNvbWUgZnJvbQorICoJdGhlIGZpcnN0IHNsYXZlIGJvbmRlZCB0byB0aGUgY2hhbm5lbC4gIEFsbCBzbGF2ZXMgd2lsbCB0aGVuIHVzZQorICoJdGhpcyBodyBtYWMgYWRkcmVzcy4KKyAqCisgKiAgICBpZmNvbmZpZyBib25kMCBkb3duCisgKiAgICAgICAgIHdpbGwgcmVsZWFzZSBhbGwgc2xhdmVzLCBtYXJraW5nIHRoZW0gYXMgZG93bi4KKyAqCisgKiAgICBpZmVuc2xhdmUgYm9uZDAgZXRoMAorICoJd2lsbCBhdHRhY2ggZXRoMCB0byBib25kMCBhcyBhIHNsYXZlLiAgZXRoMCBodyBtYWMgYWRkcmVzcyB3aWxsIGVpdGhlcgorICoJYTogYmUgdXNlZCBhcyBpbml0aWFsIG1hYyBhZGRyZXNzCisgKgliOiBpZiBhIGh3IG1hYyBhZGRyZXNzIGFscmVhZHkgaXMgdGhlcmUsIGV0aDAncyBodyBtYWMgYWRkcmVzcworICoJICAgd2lsbCB0aGVuIGJlIHNldCBmcm9tIGJvbmQwLgorICoKKyAqIHYwLjEgLSBmaXJzdCB3b3JraW5nIHZlcnNpb24uCisgKiB2MC4yIC0gY2hhbmdlZCBzdGF0cyB0byBiZSBjYWxjdWxhdGVkIGJ5IHN1bW1pbmcgc2xhdmVzIHN0YXRzLgorICoKKyAqIENoYW5nZXM6CisgKiBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAqIC0gZml4IGxlYWtzIG9uIGZhaWx1cmUgYXQgYm9uZF9pbml0CisgKgorICogMjAwMC8wOS8zMCAtIFdpbGx5IFRhcnJlYXUgPHdpbGx5IGF0IG1ldGEteC5vcmc+CisgKiAgICAgLSBhZGRlZCB0cml2aWFsIGNvZGUgdG8gcmVsZWFzZSBhIHNsYXZlIGRldmljZS4KKyAqICAgICAtIGZpeGVkIHNlY3VyaXR5IGJ1ZyAoQ0FQX05FVF9BRE1JTiBub3QgY2hlY2tlZCkKKyAqICAgICAtIGltcGxlbWVudGVkIE1JSSBsaW5rIG1vbml0b3JpbmcgdG8gZGlzYWJsZSBkZWFkIGxpbmtzIDoKKyAqICAgICAgIEFsbCBNSUkgY2FwYWJsZSBzbGF2ZXMgYXJlIGNoZWNrZWQgZXZlcnkgPG1paW1vbj4gbWlsbGlzZWNvbmRzCisgKiAgICAgICAoMTAwIG1zIHNlZW1zIGdvb2QpLiBUaGlzIHZhbHVlIGNhbiBiZSBjaGFuZ2VkIGJ5IHBhc3NpbmcgaXQgdG8KKyAqICAgICAgIGluc21vZC4gQSB2YWx1ZSBvZiB6ZXJvIGRpc2FibGVzIHRoZSBtb25pdG9yaW5nIChkZWZhdWx0KS4KKyAqICAgICAtIGZpeGVkIGFuIGluZmluaXRlIGxvb3AgaW4gYm9uZF94bWl0X3JvdW5kcm9iaW4oKSB3aGVuIHRoZXJlJ3Mgbm8KKyAqICAgICAgIGdvb2Qgc2xhdmUuCisgKiAgICAgLSBtYWRlIHRoZSBjb2RlIGhvcGVmdWxseSBTTVAgc2FmZQorICoKKyAqIDIwMDAvMTAvMDMgLSBXaWxseSBUYXJyZWF1IDx3aWxseSBhdCBtZXRhLXgub3JnPgorICogICAgIC0gb3B0aW1pemVkIHNsYXZlIGxpc3RzIGJhc2VkIG9uIHJlbGV2YW50IHN1Z2dlc3Rpb25zIGZyb20gVGhvbWFzIERhdmlzCisgKiAgICAgLSBpbXBsZW1lbnRlZCBhY3RpdmUtYmFja3VwIG1ldGhvZCB0byBvYnRhaW4gSEEgd2l0aCB0d28gc3dpdGNoZXM6CisgKiAgICAgICBzdGF5IGFzIGxvbmcgYXMgcG9zc2libGUgb24gdGhlIHNhbWUgYWN0aXZlIGludGVyZmFjZSwgd2hpbGUgd2UKKyAqICAgICAgIGFsc28gbW9uaXRvciB0aGUgYmFja3VwIG9uZSAoTUlJIGxpbmsgc3RhdHVzKSBiZWNhdXNlIHdlIHdhbnQgdG8ga25vdworICogICAgICAgaWYgd2UgYXJlIGFibGUgdG8gc3dpdGNoIGF0IGFueSB0aW1lLiAoIHBhc3MgIm1vZGU9MSIgdG8gaW5zbW9kICkKKyAqICAgICAtIGxvdHMgb2Ygc3RyZXNzIHRlc3RpbmdzIGJlY2F1c2Ugd2UgbmVlZCBpdCB0byBiZSBtb3JlIHJvYnVzdCB0aGFuIHRoZQorICogICAgICAgd2lyZXMgISA6LT4KKyAqCisgKiAyMDAwLzEwLzA5IC0gV2lsbHkgVGFycmVhdSA8d2lsbHkgYXQgbWV0YS14Lm9yZz4KKyAqICAgICAtIGFkZGVkIHVwIGFuZCBkb3duIGRlbGF5cyBhZnRlciBsaW5rIHN0YXRlIGNoYW5nZS4KKyAqICAgICAtIG9wdGltaXplZCB0aGUgc2xhdmVzIGNoYWluaW5nIHNvIHRoYXQgd2hlbiB3ZSBydW4gZm9yd2FyZCwgd2UgbmV2ZXIKKyAqICAgICAgIHJlcGFzcyB0aHJvdWdoIHRoZSBib25kIGl0c2VsZiwgYnV0IHdlIGNhbiBmaW5kIGl0IGJ5IHNlYXJjaGluZworICogICAgICAgYmFja3dhcmRzLiBSZW5kZXJzIHRoZSBkZWxldGlvbiBtb3JlIGRpZmZpY3VsdCwgYnV0IGFjY2VsZXJhdGVzIHRoZQorICogICAgICAgc2Nhbi4KKyAqICAgICAtIHNtYXJ0ZXIgZW5zbGF2aW5nIGFuZCByZWxlYXNpbmcuCisgKiAgICAgLSBmaW5lciBhbmQgbW9yZSByb2J1c3QgU01QIGxvY2tpbmcKKyAqCisgKiAyMDAwLzEwLzE3IC0gV2lsbHkgVGFycmVhdSA8d2lsbHkgYXQgbWV0YS14Lm9yZz4KKyAqICAgICAtIGZpeGVkIHR3byBwb3RlbnRpYWwgU01QIHJhY2UgY29uZGl0aW9ucworICoKKyAqIDIwMDAvMTAvMTggLSBXaWxseSBUYXJyZWF1IDx3aWxseSBhdCBtZXRhLXgub3JnPgorICogICAgIC0gc21hbGwgZml4ZXMgdG8gdGhlIG1vbml0b3JpbmcgRlNNIGluIGNhc2Ugb2YgemVybyBkZWxheXMKKyAqIDIwMDAvMTEvMDEgLSBXaWxseSBUYXJyZWF1IDx3aWxseSBhdCBtZXRhLXgub3JnPgorICogICAgIC0gZml4ZWQgZmlyc3Qgc2xhdmUgbm90IGF1dG9tYXRpY2FsbHkgdXNlZCBpbiB0cnVuayBtb2RlLgorICogMjAwMC8xMS8xMCA6IHNwZWxsaW5nIG9mICJFdGhlckNoYW5uZWwiIGNvcnJlY3RlZC4KKyAqIDIwMDAvMTEvMTMgOiBmaXhlZCBhIHJhY2UgY29uZGl0aW9uIGluIGNhc2Ugb2YgY29uY3VycmVudCBhY2Nlc3NlcyB0byBpb2N0bCgpLgorICogMjAwMC8xMi8xNiA6IGZpeGVkIGltcHJvcGVyIHVzYWdlIG9mIHJ0bmxfZXhsb2NrX25vd2FpdCgpLgorICoKKyAqIDIwMDEvMS8zIC0gQ2hhZCBOLiBUaW5kZWwgPGN0aW5kZWwgYXQgaWVlZSBkb3Qgb3JnPgorICogICAgIC0gVGhlIGJvbmRpbmcgZHJpdmVyIG5vdyBzaW11bGF0ZXMgTUlJIHN0YXR1cyBtb25pdG9yaW5nLCBqdXN0IGxpa2UKKyAqICAgICAgIGEgbm9ybWFsIG5ldHdvcmsgZGV2aWNlLiAgSXQgd2lsbCBzaG93IHRoYXQgdGhlIGxpbmsgaXMgZG93biBpZmYKKyAqICAgICAgIGV2ZXJ5IHNsYXZlIGluIHRoZSBib25kIHNob3dzIHRoYXQgdGhlaXIgbGlua3MgYXJlIGRvd24uICBJZiBhdCBsZWFzdAorICogICAgICAgb25lIHNsYXZlIGlzIHVwLCB0aGUgYm9uZCdzIE1JSSBzdGF0dXMgd2lsbCBhcHBlYXIgYXMgdXAuCisgKgorICogMjAwMS8yLzcgLSBDaGFkIE4uIFRpbmRlbCA8Y3RpbmRlbCBhdCBpZWVlIGRvdCBvcmc+CisgKiAgICAgLSBBcHBsaWNhdGlvbnMgY2FuIG5vdyBxdWVyeSB0aGUgYm9uZCBmcm9tIHVzZXIgc3BhY2UgdG8gZ2V0CisgKiAgICAgICBpbmZvcm1hdGlvbiB3aGljaCBtYXkgYmUgdXNlZnVsLiAgVGhleSBkbyB0aGlzIGJ5IGNhbGxpbmcKKyAqICAgICAgIHRoZSBCT05EX0lORk9fUVVFUlkgaW9jdGwuICBPbmNlIHRoZSBhcHAga25vd3MgaG93IG1hbnkgc2xhdmVzCisgKiAgICAgICBhcmUgaW4gdGhlIGJvbmQsIGl0IGNhbiBjYWxsIHRoZSBCT05EX1NMQVZFX0lORk9fUVVFUlkgaW9jdGwgdG8KKyAqICAgICAgIGdldCBzbGF2ZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiAoIyBsaW5rIGZhaWx1cmVzLCBldGMpLiAgU2VlCisgKiAgICAgICA8bGludXgvaWZfYm9uZGluZy5oPiBmb3IgbW9yZSBkZXRhaWxzLiAgVGhlIHN0cnVjdHMgb2YgaW50ZXJlc3QKKyAqICAgICAgIGFyZSBpZmJvbmQgYW5kIGlmc2xhdmUuCisgKgorICogMjAwMS80LzUgLSBDaGFkIE4uIFRpbmRlbCA8Y3RpbmRlbCBhdCBpZWVlIGRvdCBvcmc+CisgKiAgICAgLSBQb3J0ZWQgdG8gMi40IEtlcm5lbAorICoKKyAqIDIwMDEvNS8yIC0gSmVmZnJleSBFLiBNYXN0IDxqZWZmIGF0IG1hc3RmYW1pbHkgZG90IGNvbT4KKyAqICAgICAtIFdoZW4gYSBkZXZpY2UgaXMgZGV0YWNoZWQgZnJvbSBhIGJvbmQsIHRoZSBzbGF2ZSBkZXZpY2UgaXMgbm8gbG9uZ2VyCisgKiAgICAgICBsZWZ0IHRoaW5raW5nIHRoYXQgaXMgaGFzIGEgbWFzdGVyLgorICoKKyAqIDIwMDEvNS8xNiAtIEplZmZyZXkgRS4gTWFzdCA8amVmZiBhdCBtYXN0ZmFtaWx5IGRvdCBjb20+CisgKiAgICAgLSBtZW1zZXQgZGlkIG5vdCBhcHByb3ByaWF0ZWx5IGluaXRpYWxpemVkIHRoZSBib25kIHJ3X2xvY2tzLiBVc2VkCisgKiAgICAgICByd2xvY2tfaW5pdCB0byBpbml0aWFsaXplIHRvIHVubG9ja2VkIHN0YXRlIHRvIHByZXZlbnQgZGVhZGxvY2sgd2hlbgorICogICAgICAgZmlyc3QgYXR0ZW1wdGluZyBhIGxvY2sKKyAqICAgICAtIENhbGxlZCBTRVRfTU9EVUxFX09XTkVSIGZvciBib25kIGRldmljZQorICoKKyAqIDIwMDEvNS8xNyAtIFRpbSBBbmRlcnNvbiA8dHNhIGF0IG12aXN0YS5jb20+CisgKiAgICAgLSAyIHBhdGhzIGZvciByZWxlYXNpbmcgZm9yIHNsYXZlIHJlbGVhc2U7IDEgdGhyb3VnaCBpb2N0bAorICogICAgICAgYW5kIDIpIHRocm91Z2ggY2xvc2UuIEJvdGggcGF0aHMgbmVlZCB0byByZWxlYXNlIHRoZSBzYW1lIHdheS4KKyAqICAgICAtIHRoZSBmcmVlIHNsYXZlIGluIGJvbmQgcmVsZWFzZSBpcyBjaGFuZ2luZyBzbGF2ZSBzdGF0dXMgYmVmb3JlCisgKiAgICAgICB0aGUgZnJlZS4gVGhlIG5ldGRldl9zZXRfbWFzdGVyKCkgaXMgaW50ZW5kZWQgdG8gY2hhbmdlIHNsYXZlIHN0YXRlCisgKiAgICAgICBzbyBpdCBzaG91bGQgbm90IGJlIGRvbmUgYXMgcGFydCBvZiB0aGUgcmVsZWFzZSBwcm9jZXNzLgorICogICAgIC0gU2ltcGxlIHJ1bGUgZm9yIHNsYXZlIHN0YXRlIGF0IHJlbGVhc2U6IG9ubHkgdGhlIGFjdGl2ZSBpbiBBL0IgYW5kCisgKiAgICAgICBvbmx5IG9uZSBpbiB0aGUgdHJ1bmtlZCBjYXNlLgorICoKKyAqIDIwMDEvNi8wMSAtIFRpbSBBbmRlcnNvbiA8dHNhIGF0IG12aXN0YS5jb20+CisgKiAgICAgLSBOb3cgY2FsbCBkZXZfY2xvc2Ugd2hlbiByZWxlYXNpbmcgYSBzbGF2ZSBzbyBpdCBkb2Vzbid0IHNjcmV3IHVwCisgKiAgICAgICBvdXQgcm91dGluZyB0YWJsZS4KKyAqCisgKiAyMDAxLzYvMDEgLSBDaGFkIE4uIFRpbmRlbCA8Y3RpbmRlbCBhdCBpZWVlIGRvdCBvcmc+CisgKiAgICAgLSBBZGRlZCAvcHJvYyBzdXBwb3J0IGZvciBnZXR0aW5nIGJvbmQgYW5kIHNsYXZlIGluZm9ybWF0aW9uLgorICogICAgICAgSW5mb3JtYXRpb24gaXMgaW4gL3Byb2MvbmV0Lzxib25kIGRldmljZT4vaW5mby4KKyAqICAgICAtIENoYW5nZWQgdGhlIGxvY2tpbmcgd2hlbiBjYWxsaW5nIGJvbmRfY2xvc2UgdG8gcHJldmVudCBkZWFkbG9jay4KKyAqCisgKiAyMDAxLzgvMDUgLSBKYW5pY2UgR2lyb3VhcmQgPGdpcm91YXJkIGF0IHVzLmlibS5jb20+CisgKiAgICAgLSBjb3JyZWN0IHByb2JsZW0gd2hlcmUgcmVmY250IG9mIHNsYXZlIGlzIG5vdCBpbmNyZW1lbnRlZCBpbiBib25kX2lvY3RsCisgKiAgICAgICBzbyB0aGUgc3lzdGVtIGhhbmdzIHdoZW4gaGFsdGluZy4KKyAqICAgICAtIGNvcnJlY3QgbG9ja2luZyBwcm9ibGVtIHdoZW4gdW5hYmxlIHRvIG1hbGxvYyBpbiBib25kX2Vuc2xhdmUuCisgKiAgICAgLSBhZGRpbmcgYm9uZF94bWl0X3hvciBsb2dpYy4KKyAqICAgICAtIGFkZGluZyBtdWx0aXBsZSBib25kIGRldmljZSBzdXBwb3J0LgorICoKKyAqIDIwMDEvOC8xMyAtIEVyaWsgSGFiYmluZ2EgPGVyaWtfaGFiYmluZ2EgYXQgaHAgZG90IGNvbT4KKyAqICAgICAtIGNvcnJlY3QgbG9ja2luZyBwcm9ibGVtIHdpdGggcnRubF9leGxvY2tfbm93YWl0CisgKgorICogMjAwMS84LzIzIC0gSmFuaWNlIEdpcm91YXJkIDxnaXJvdWFyZCBhdCB1cy5pYm0uY29tPgorICogICAgIC0gYnplcm8gaW5pdGlhbCBkZXZfYm9uZHMsIHRvIGNvcnJlY3Qgb29wcworICogICAgIC0gY29udmVydCBTSU9DREVWUFJJVkFURSB0byBuZXcgTUlJIGlvY3RsIGNhbGxzCisgKgorICogMjAwMS85LzEzIC0gVGFrYW8gSW5kb2ggPGluZG91IGRvdCB0YWthbyBhdCBqcCBkb3QgZnVqaXRzdSBkb3QgY29tPgorICogICAgIC0gQWRkIHRoZSBCT05EX0NIQU5HRV9BQ1RJVkUgaW9jdGwgaW1wbGVtZW50YXRpb24KKyAqCisgKiAyMDAxLzkvMTQgLSBNYXJrIEh1dGggPG1odXRoIGF0IG12aXN0YSBkb3QgY29tPgorICogICAgIC0gQ2hhbmdlIE1JSV9MSU5LX1JFQURZIHRvIG5vdCBjaGVjayBmb3IgZW5kIG9mIGF1dG8tbmVnb3RpYXRpb24sCisgKiAgICAgICBidXQgb25seSBmb3IgYW4gdXAgbGluay4KKyAqCisgKiAyMDAxLzkvMjAgLSBDaGFkIE4uIFRpbmRlbCA8Y3RpbmRlbCBhdCBpZWVlIGRvdCBvcmc+CisgKiAgICAgLSBBZGQgdGhlIGRldmljZSBmaWVsZCB0byBib25kaW5nX3QuICBQcmV2aW91c2x5IHRoZSBuZXRfZGV2aWNlCisgKiAgICAgICBjb3JyZXNwb25kaW5nIHRvIGEgYm9uZCB3YXNuJ3QgYXZhaWxhYmxlIGZyb20gdGhlIGJvbmRpbmdfdAorICogICAgICAgc3RydWN0dXJlLgorICoKKyAqIDIwMDEvOS8yNSAtIEphbmljZSBHaXJvdWFyZCA8Z2lyb3VhcmQgYXQgdXMuaWJtLmNvbT4KKyAqICAgICAtIGFkZCBhcnBfbW9uaXRvciBmb3IgYWN0aXZlIGJhY2t1cCBtb2RlCisgKgorICogMjAwMS8xMC8yMyAtIFRha2FvIEluZG9oIDxpbmRvdSBkb3QgdGFrYW8gYXQganAgZG90IGZ1aml0c3UgZG90IGNvbT4KKyAqICAgICAtIFZhcmlvdXMgbWVtb3J5IGxlYWsgZml4ZXMKKyAqCisgKiAyMDAxLzExLzUgLSBNYXJrIEh1dGggPG1hcmsgZG90IGh1dGggYXQgbXZpc3RhIGRvdCBjb20+CisgKiAgICAgLSBEb24ndCB0YWtlIHJ0bmwgbG9jayBpbiBib25kX21paV9tb25pdG9yIGFzIGl0IGRlYWRsb2NrcyB1bmRlcgorICogICAgICAgY2VydGFpbiBob3Rzd2FwIGNvbmRpdGlvbnMuCisgKiAgICAgICBOb3RlOiAgdGhpcyBzYW1lIGNoYW5nZSBtYXkgYmUgcmVxdWlyZWQgaW4gYm9uZF9hcnBfbW9uaXRvciA/Pz8KKyAqICAgICAtIFJlbW92ZSBwb3NzaWJpbGl0eSBvZiBjYWxsaW5nIGJvbmRfc2V0aHdhZGRyIHdpdGggTlVMTCBzbGF2ZV9kZXYgcHRyCisgKiAgICAgLSBIYW5kbGUgaG90IHN3YXAgZXRoZXJuZXQgaW50ZXJmYWNlIGRlcmVnaXN0cmF0aW9uIGV2ZW50cyB0byByZW1vdmUKKyAqICAgICAgIGtlcm5lbCBvb3BzIGZvbGxvd2luZyBob3Qgc3dhcCBvZiBlbnNsYXZlZCBpbnRlcmZhY2UKKyAqCisgKiAyMDAyLzEvMiAtIENoYWQgTi4gVGluZGVsIDxjdGluZGVsIGF0IGllZWUgZG90IG9yZz4KKyAqICAgICAtIFJlc3RvcmUgb3JpZ2luYWwgc2xhdmUgZmxhZ3MgYXQgcmVsZWFzZSB0aW1lLgorICoKKyAqIDIwMDIvMDIvMTggLSBFcmlrIEhhYmJpbmdhIDxlcmlrX2hhYmJpbmdhIGF0IGhwIGRvdCBjb20+CisgKiAgICAgLSBib25kX3JlbGVhc2UoKTogY2FsbGluZyBrZnJlZSBvbiBvdXJfc2xhdmUgYWZ0ZXIgY2FsbCB0bworICogICAgICAgYm9uZF9yZXN0b3JlX3NsYXZlX2ZsYWdzLCBub3QgYmVmb3JlCisgKiAgICAgLSBib25kX2Vuc2xhdmUoKTogc2F2aW5nIHNsYXZlIGZsYWdzIGludG8gb3JpZ2luYWxfZmxhZ3MgYmVmb3JlCisgKiAgICAgICBjYWxsIHRvIG5ldGRldl9zZXRfbWFzdGVyLCBzbyB0aGUgSUZGX1NMQVZFIGZsYWcgZG9lc24ndCBlbmQKKyAqICAgICAgIHVwIGluIG9yaWdpbmFsX2ZsYWdzCisgKgorICogMjAwMi8wNC8wNSAtIE1hcmsgU21pdGggPG1hcmsuc21pdGggYXQgY29tZGV2IGRvdCBjYz4gYW5kCisgKiAgICAgICAgICAgICAgU3RldmUgTWVhZCA8c3RldmUubWVhZCBhdCBjb21kZXYgZG90IGNjPgorICogICAgIC0gUG9ydCBHbGViIE5hdGFwb3YncyBtdWx0aWNhc3Qgc3VwcG9ydCBwYXRjaHMgZnJvbSAyLjQuMTIKKyAqICAgICAgIHRvIDIuNC4xOCBhZGRpbmcgc3VwcG9ydCBmb3IgbXVsdGljYXN0LgorICoKKyAqIDIwMDIvMDYvMTAgLSBUb255IEN1cmVpbmd0b24gPHRvbnkuY3VyZWluZ3RvbiAqIGhwX2NvbT4KKyAqICAgICAtIGNvcnJlY3RlZCB1bmluaXRpYWxpemVkIHBvaW50ZXIgKGlmci5pZnJfZGF0YSkgaW4gYm9uZF9jaGVja19kZXZfbGluazsKKyAqICAgICAgIGFjdHVhbGx5IGNoYW5nZWQgZnVuY3Rpb24gdG8gdXNlIE1JSVBIWSwgdGhlbiBNSUlSRUcsIGFuZCBmaW5hbGx5CisgKiAgICAgICBFVEhUT09MIHRvIGRldGVybWluZSB0aGUgbGluayBzdGF0dXMKKyAqICAgICAtIGZpeGVkIGJhZCBpZnJfZGF0YSBwb2ludGVyIGFzc2lnbm1lbnRzIGluIGJvbmRfaW9jdGwKKyAqICAgICAtIGNvcnJlY3RlZCBtb2RlIDEgYmVpbmcgcmVwb3J0ZWQgYXMgYWN0aXZlLWJhY2t1cCBpbiBib25kX2dldF9pbmZvOworICogICAgICAgYWxzbyBhZGRlZCB0ZXh0IHRvIGRpc3Rpbmd1aXNoIHR5cGUgb2YgbG9hZCBiYWxhbmNpbmcgKHJyIG9yIHhvcikKKyAqICAgICAtIGNoYW5nZSBhcnBfaXBfdGFyZ2V0IG1vZHVsZSBwYXJhbSBmcm9tICIxLTEycyIgKGFycmF5IG9mIDEyIHB0cnMpCisgKiAgICAgICB0byAicyIgKGEgc2luZ2xlIHB0cikKKyAqCisgKiAyMDAyLzA4LzMwIC0gSmF5IFZvc2J1cmdoIDxmdWJhciBhdCB1cyBkb3QgaWJtIGRvdCBjb20+CisgKiAgICAgLSBSZW1vdmVkIGFjcXVpc2l0aW9uIG9mIHhtaXRfbG9jayBpbiBzZXRfbXVsdGljYXN0X2xpc3Q7IGNhdXNlZAorICogICAgICAgZGVhZGxvY2sgb24gU01QIChsb2NrIGlzIGhlbGQgYnkgY2FsbGVyKS4KKyAqICAgICAtIFJldmFtcGVkIFNJT0NHTUlJUEhZLCBTSU9DR01JSVJFRyBwb3J0aW9uIG9mIGJvbmRfY2hlY2tfZGV2X2xpbmsoKS4KKyAqCisgKiAyMDAyLzA5LzE4IC0gSmF5IFZvc2J1cmdoIDxmdWJhciBhdCB1cyBkb3QgaWJtIGRvdCBjb20+CisgKiAgICAgLSBGaXhlZCB1cCBib25kX2NoZWNrX2Rldl9saW5rKCkgKGFuZCBjYWxsZXJzKTogcmVtb3ZlZCBzb21lIG1hZ2ljCisgKgkgbnVtYmVycywgYmFuaXNoZWQgbG9jYWwgTUlJXyBkZWZpbmVzLCB3cmFwcGVkIGlvY3RsIGNhbGxzIHRvCisgKgkgcHJldmVudCBFRkFVTFQgZXJyb3JzCisgKgorICogMjAwMi85LzMwIC0gSmF5IFZvc2J1cmdoIDxmdWJhciBhdCB1cyBkb3QgaWJtIGRvdCBjb20+CisgKiAgICAgLSBtYWtlIHN1cmUgdGhlIGlwIHRhcmdldCBtYXRjaGVzIHRoZSBhcnBfdGFyZ2V0IGJlZm9yZSBzYXZpbmcgdGhlCisgKgkgaHcgYWRkcmVzcy4KKyAqCisgKiAyMDAyLzkvMzAgLSBEYW4gRWlzbmVyIDxlaXNuZXIgYXQgMnJvYm90cyBkb3QgY29tPgorICogICAgIC0gbWFrZSBzdXJlIG15X2lwIGlzIHNldCBiZWZvcmUgdGFraW5nIGRvd24gdGhlIGxpbmssIHNpbmNlCisgKgkgbm90IGFsbCBzd2l0Y2hlcyByZXNwb25kIGlmIHRoZSBzb3VyY2UgaXAgaXMgbm90IHNldC4KKyAqCisgKiAyMDAyLzEwLzggLSBKYW5pY2UgR2lyb3VhcmQgPGdpcm91YXJkIGF0IHVzIGRvdCBpYm0gZG90IGNvbT4KKyAqICAgICAtIHJlYWQgaW4gdGhlIGxvY2FsIGlwIGFkZHJlc3Mgd2hlbiBlbnNsYXZpbmcgYSBkZXZpY2UKKyAqICAgICAtIGFkZCBwcmltYXJ5IHN1cHBvcnQKKyAqICAgICAtIG1ha2Ugc3VyZSAyKmFycF9pbnRlcnZhbCBoYXMgcGFzc2VkIHdoZW4gYSBuZXcgZGV2aWNlCisgKiAgICAgICBpcyBicm91Z2h0IG9uLWxpbmUgYmVmb3JlIHRha2luZyBpdCBkb3duLgorICoKKyAqIDIwMDIvMDkvMTEgLSBQaGlsaXBwZSBEZSBNdXl0ZXIgPHBoZG0gYXQgbWFjcWVsIGRvdCBiZT4KKyAqICAgICAtIEFkZGVkIGJvbmRfeG1pdF9icm9hZGNhc3QgbG9naWMuCisgKiAgICAgLSBBZGRlZCBib25kX21vZGUoKSBzdXBwb3J0IGZ1bmN0aW9uLgorICoKKyAqIDIwMDIvMTAvMjYgLSBMYXVyZW50IERlbmllbCA8bGF1cmVudC5kZW5pZWwgYXQgZnJlZS5mcj4KKyAqICAgICAtIGFsbG93IHRvIHJlZ2lzdGVyIG11bHRpY2FzdCBhZGRyZXNzZXMgb25seSBvbiBhY3RpdmUgc2xhdmUKKyAqICAgICAgICh1c2VmdWwgaW4gYWN0aXZlLWJhY2t1cCBtb2RlKQorICogICAgIC0gYWRkIG11bHRpY2FzdCBtb2R1bGUgcGFyYW1ldGVyCisgKiAgICAgLSBmaXggZGVsZXRpb24gb2YgbXVsdGljYXN0IGdyb3VwcyBhZnRlciB1bmxvYWRpbmcgbW9kdWxlCisgKgorICogMjAwMi8xMS8wNiAtIEthbWVzaHdhcmEgUmF5YXByb2x1IDxrYW1lc2h3YXJhLnJhbyAqIHdpcHJvX2NvbT4KKyAqICAgICAtIENoYW5nZXMgdG8gcHJldmVudCBwYW5pYyBmcm9tIGNsb3NpbmcgdGhlIGRldmljZSB0d2ljZTsgaWYgd2UgY2xvc2UKKyAqICAgICAgIHRoZSBkZXZpY2UgaW4gYm9uZF9yZWxlYXNlLCB3ZSBtdXN0IHNldCB0aGUgb3JpZ2luYWxfZmxhZ3MgdG8gZG93bgorICogICAgICAgc28gaXQgd29uJ3QgYmUgY2xvc2VkIGFnYWluIGJ5IHRoZSBuZXR3b3JrIGxheWVyLgorICoKKyAqIDIwMDIvMTEvMDcgLSBUb255IEN1cmVpbmd0b24gPHRvbnkuY3VyZWluZ3RvbiAqIGhwX2NvbT4KKyAqICAgICAtIEZpeCBhcnBfdGFyZ2V0X2h3X2FkZHIgbWVtb3J5IGxlYWsKKyAqICAgICAtIENyZWF0ZWQgYWN0aXZlYmFja3VwX2FycF9tb25pdG9yIGZ1bmN0aW9uIHRvIGhhbmRsZSBhcnAgbW9uaXRvcmluZworICogICAgICAgaW4gYWN0aXZlIGJhY2t1cCBtb2RlIC0gdGhlIGJvbmRfYXJwX21vbml0b3IgaGFkIHNldmVyYWwgcHJvYmxlbXMuLi4KKyAqICAgICAgIHN1Y2ggYXMgYWxsb3dpbmcgc2xhdmVzIHRvIHR4IGFycHMgc2VxdWVudGlhbGx5IHdpdGhvdXQgYW55IGRlbGF5CisgKiAgICAgICBmb3IgYSByZXNwb25zZQorICogICAgIC0gUmVuYW1lZCBib25kX2FycF9tb25pdG9yIHRvIGxvYWRiYWxhbmNlX2FycF9tb25pdG9yIGFuZCByZS13cm90ZQorICogICAgICAgdGhpcyBmdW5jdGlvbiB0byBqdXN0IGhhbmRsZSBhcnAgbW9uaXRvcmluZyBpbiBsb2FkLWJhbGFuY2luZyBtb2RlOworICogICAgICAgaXQgaXMgYSBsb3QgbW9yZSBjb21wYWN0IG5vdworICogICAgIC0gQ2hhbmdlcyB0byBlbnN1cmUgb25lIGFuZCBvbmx5IG9uZSBzbGF2ZSB0cmFuc21pdHMgaW4gYWN0aXZlLWJhY2t1cAorICogICAgICAgbW9kZQorICogICAgIC0gUm9idXN0ZXNpemUgcGFyYW1ldGVyczsgd2FybiB1c2VycyBhYm91dCBiYWQgY29tYmluYXRpb25zIG9mCisgKiAgICAgICBwYXJhbWV0ZXJzOyBhbHNvIGlmIG1paW1vbiBpcyBzcGVjaWZpZWQgYW5kIGEgbmV0d29yayBkcml2ZXIgZG9lcworICogICAgICAgbm90IHN1cHBvcnQgTUlJIG9yIEVUSFRPT0wsIGluZm9ybSB0aGUgdXNlciBvZiB0aGlzCisgKiAgICAgLSBDaGFuZ2VzIHRvIHN1cHBvcnQgbGlua19mYWlsdXJlX2NvdW50IHdoZW4gaW4gYXJwIG1vbml0b3JpbmcgbW9kZQorICogICAgIC0gRml4IHVwL2Rvd24gZGVsYXkgcmVwb3J0ZWQgaW4gL3Byb2MKKyAqICAgICAtIEFkZGVkIHZlcnNpb247IGxvZyB2ZXJzaW9uOyBtYWtlIHZlcnNpb24gYXZhaWxhYmxlIGZyb20gIm1vZGluZm8gLWQiCisgKiAgICAgLSBGaXhlZCBwcm9ibGVtIGluIGJvbmRfY2hlY2tfZGV2X2xpbmsgLSBpZiB0aGUgZmlyc3QgSU9DVEwgKFNJT0NHTUlJUEgpCisgKgkgZmFpbGVkLCB0aGUgRVRIVE9PTCBpb2N0bCBuZXZlciBnb3QgYSBjaGFuY2UKKyAqCisgKiAyMDAyLzExLzE2IC0gTGF1cmVudCBEZW5pZWwgPGxhdXJlbnQuZGVuaWVsIGF0IGZyZWUuZnI+CisgKiAgICAgLSBmaXggbXVsdGljYXN0IGhhbmRsaW5nIGluIGFjdGl2ZWJhY2t1cF9hcnBfbW9uaXRvcgorICogICAgIC0gcmVtb3ZlIG9uZSB1bm5lY2Vzc2FyeSBhbmQgY29uZnVzaW5nIGN1cnJfYWN0aXZlX3NsYXZlID09IHNsYXZlIHRlc3QKKyAqCSBpbiBhY3RpdmViYWNrdXBfYXJwX21vbml0b3IKKyAqCisgKiAgMjAwMi8xMS8xNyAtIExhdXJlbnQgRGVuaWVsIDxsYXVyZW50LmRlbmllbCBhdCBmcmVlLmZyPgorICogICAgIC0gZml4IGJvbmRfc2xhdmVfaW5mb19xdWVyeSB3aGVuIHNsYXZlX2lkID0gbnVtX3NsYXZlcworICoKKyAqICAyMDAyLzExLzE5IC0gSmFuaWNlIEdpcm91YXJkIDxnaXJvdWFyZCBhdCB1cyBkb3QgaWJtIGRvdCBjb20+CisgKiAgICAgLSBjb3JyZWN0IGlmcl9kYXRhIHJlZmVyZW5jZS4gIFVwZGF0ZSBpZnJfZGF0YSByZWZlcmVuY2UKKyAqICAgICAgIHRvIG1paV9pb2N0bF9kYXRhIHN0cnVjdCB2YWx1ZXMgdG8gYXZvaWQgY29uZnVzaW9uLgorICoKKyAqICAyMDAyLzExLzIyIC0gQmVydCBCYXJiZSA8YmVydC5iYXJiZSBhdCBvcmFjbGUgZG90IGNvbT4KKyAqICAgICAgLSBBZGQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgYXJwX2lwX3RhcmdldAorICoKKyAqICAyMDAyLzEyLzEzIC0gSmF5IFZvc2J1cmdoIDxmdWJhciBhdCB1cyBkb3QgaWJtIGRvdCBjb20+CisgKgktIENoYW5nZWQgdG8gYWxsb3cgdGV4dCBzdHJpbmdzIGZvciBtb2RlIGFuZCBtdWx0aWNhc3QsIGUuZy4sCisgKgkgIGluc21vZCBib25kaW5nIG1vZGU9YWN0aXZlLWJhY2t1cC4gIFRoZSBudW1iZXJzIHN0aWxsIHdvcmsuCisgKgkgIE9uZSBjaGFuZ2U6IGFuIGludmFsaWQgY2hvaWNlIHdpbGwgY2F1c2UgbW9kdWxlIGxvYWQgZmFpbHVyZSwKKyAqCSAgcmF0aGVyIHRoYW4gdGhlIHByZXZpb3VzIGJlaGF2aW9yIG9mIGp1c3QgcGlja2luZyBvbmUuCisgKgktIE1pbm9yIGNsZWFudXBzOyBnb3QgcmlkIG9mIGR1cCBjdHlwZSBzdHVmZiwgYXRvaSBmdW5jdGlvbgorICoKKyAqIDIwMDMvMDIvMDcgLSBKYXkgVm9zYnVyZ2ggPGZ1YmFyIGF0IHVzIGRvdCBpYm0gZG90IGNvbT4KKyAqCS0gQWRkZWQgdXNlX2NhcnJpZXIgbW9kdWxlIHBhcmFtZXRlciB0aGF0IGNhdXNlcyBtaWltb24gdG8KKyAqCSAgdXNlIG5ldGlmX2NhcnJpZXJfb2soKSB0ZXN0IGluc3RlYWQgb2YgTUlJL0VUSFRPT0wgaW9jdGxzLgorICoJLSBNaW5vciBjbGVhbnVwczsgY29uc29saWRhdGVkIGlvY3RsIGNhbGxzIHRvIG9uZSBmdW5jdGlvbi4KKyAqCisgKiAyMDAzLzAyLzA3IC0gVG9ueSBDdXJlaW5ndG9uIDx0b255LmN1cmVpbmd0b24gKiBocF9jb20+CisgKgktIEZpeCBib25kX21paV9tb25pdG9yKCkgbG9naWMgZXJyb3IgdGhhdCBjb3VsZCByZXN1bHQgaW4KKyAqCSAgYm9uZGluZyByb3VuZC1yb2JpbiBtb2RlIGlnbm9yaW5nIGxpbmtzIGFmdGVyIGZhaWxvdmVyL3JlY292ZXJ5CisgKgorICogMjAwMy8wMy8xNyAtIEpheSBWb3NidXJnaCA8ZnViYXIgYXQgdXMgZG90IGlibSBkb3QgY29tPgorICoJLSBrbWFsbG9jIGZpeCAoR0ZQX0tFUk5FTCB0byBHRlBfQVRPTUlDKSByZXBvcnRlZCBieQorICoJICBTaG11bGlrIGRvdCBIZW4gYXQgaW50ZWwuY29tLgorICoJLSBCYXNlZCBvbiBkaXNjdXNzaW9uIG9uIG1haWxpbmcgbGlzdCwgY2hhbmdlZCB1c2Ugb2YKKyAqCSAgdXBkYXRlX3NsYXZlX2NudCgpLCBjcmVhdGVkIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBhZGRpbmcvcmVtb3ZpbmcKKyAqCSAgc2xhdmVzLCBjaGFuZ2VkIGJvbmRfeG1pdF94b3IoKSB0byBjaGVjayBzbGF2ZV9jbnQgaW5zdGVhZCBvZgorICoJICBjaGVja2luZyBzbGF2ZSBhbmQgc2xhdmUtPmRldiAod2hpY2ggb25seSB3b3JrZWQgYnkgYWNjaWRlbnQpLgorICoJLSBNaXNjIGNvZGUgY2xlYW51cDogZ2V0IGFycF9zZW5kKCkgcHJvdG90eXBlIGZyb20gaGVhZGVyIGZpbGUsCisgKgkgIGFkZCBtYXhfYm9uZHMgdG8gYm9uZGluZy50eHQuCisgKgorICogMjAwMy8wMy8xOCAtIFRzaXBweSBNZW5kZWxzb24gPHRzaXBweS5tZW5kZWxzb24gYXQgaW50ZWwgZG90IGNvbT4gYW5kCisgKgkJU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKgktIE1ha2Ugc3VyZSBvbmx5IGJvbmRfYXR0YWNoX3NsYXZlKCkgYW5kIGJvbmRfZGV0YWNoX3NsYXZlKCkgY2FuCisgKgkgIG1hbmlwdWxhdGUgdGhlIHNsYXZlIGxpc3QsIGluY2x1ZGluZyBzbGF2ZV9jbnQsIGV2ZW4gd2hlbiBpbgorICoJICBib25kX3JlbGVhc2VfYWxsKCkuCisgKgktIEZpeGVkIGhhbmcgaW4gYm9uZF9yZWxlYXNlKCkgd2l0aCB0cmFmZmljIHJ1bm5pbmc6CisgKgkgIG5ldGRldl9zZXRfbWFzdGVyKCkgbXVzdCBub3QgYmUgY2FsbGVkIGZyb20gd2l0aGluIHRoZSBib25kIGxvY2suCisgKgorICogMjAwMy8wMy8xOCAtIFRzaXBweSBNZW5kZWxzb24gPHRzaXBweS5tZW5kZWxzb24gYXQgaW50ZWwgZG90IGNvbT4gYW5kCisgKgkJU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKgktIEZpeGVkIGhhbmcgaW4gYm9uZF9lbnNsYXZlKCkgd2l0aCB0cmFmZmljIHJ1bm5pbmc6CisgKgkgIG5ldGRldl9zZXRfbWFzdGVyKCkgbXVzdCBub3QgYmUgY2FsbGVkIGZyb20gd2l0aGluIHRoZSBib25kIGxvY2suCisgKgorICogMjAwMy8wMy8xOCAtIEFtaXIgTm9hbSA8YW1pci5ub2FtIGF0IGludGVsIGRvdCBjb20+CisgKgktIEFkZGVkIHN1cHBvcnQgZm9yIGdldHRpbmcgc2xhdmUncyBzcGVlZCBhbmQgZHVwbGV4IHZpYSBldGh0b29sLgorICoJICBOZWVkZWQgZm9yIDgwMi4zYWQgYW5kIG90aGVyIGZ1dHVyZSBtb2Rlcy4KKyAqCisgKiAyMDAzLzAzLzE4IC0gVHNpcHB5IE1lbmRlbHNvbiA8dHNpcHB5Lm1lbmRlbHNvbiBhdCBpbnRlbCBkb3QgY29tPiBhbmQKKyAqCQlTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gRW5hYmxlIHN1cHBvcnQgb2YgbW9kZXMgdGhhdCBuZWVkIHRvIHVzZSB0aGUgdW5pcXVlIG1hYyBhZGRyZXNzIG9mCisgKgkgIGVhY2ggc2xhdmUuCisgKgkgICogYm9uZF9lbnNsYXZlKCk6IE1vdmVkIHNldHRpbmcgdGhlIHNsYXZlJ3MgbWFjIGFkZHJlc3MsIGFuZAorICoJICAgIG9wZW5uaW5nIGl0LCBmcm9tIHRoZSBhcHBsaWNhdGlvbiB0byB0aGUgZHJpdmVyLiBUaGlzIGJyZWFrcworICoJICAgIGJhY2t3YXJkIGNvbWFwdGliaWxpdHkgd2l0aCBvbGQgdmVyc2lvbnMgb2YgaWZlbnNsYXZlIHRoYXQgb3BlbgorICoJICAgICB0aGUgc2xhdmUgYmVmb3JlIGVuYWxzdmluZyBpdCAhISEuCisgKgkgICogYm9uZF9yZWxlYXNlKCk6IFRoZSBkcml2ZXIgYWxzbyB0YWtlcyBjYXJlIG9mIGNsb3NpbmcgdGhlIHNsYXZlCisgKgkgICAgYW5kIHJlc3RvcmluZyBpdHMgb3JpZ2luYWwgbWFjIGFkZHJlc3MuCisgKgktIFJlbW92ZWQgdGhlIGNvZGUgdGhhdCByZXN0b3JlcyBhbGwgYmFzZSBkcml2ZXIncyBmbGFncy4KKyAqCSAgRmxhZ3MgYXJlIGF1dG9tYXRpY2FsbHkgcmVzdG9yZWQgb25jZSBhbGwgdW5kbyBzdGFnZXMgYXJlIGRvbmUKKyAqCSAgcHJvcGVybHkuCisgKgktIEJsb2NrIHBvc3NpYmlsaXR5IG9mIGVuc2xhdmluZyBiZWZvcmUgdGhlIG1hc3RlciBpcyB1cC4gVGhpcworICoJICBwcmV2ZW50cyBwdXR0aW5nIHRoZSBzeXN0ZW0gaW4gYW4gdW5zdGFibGUgc3RhdGUuCisgKgorICogMjAwMy8wMy8xOCAtIEFtaXIgTm9hbSA8YW1pci5ub2FtIGF0IGludGVsIGRvdCBjb20+LAorICoJCVRzaXBweSBNZW5kZWxzb24gPHRzaXBweS5tZW5kZWxzb24gYXQgaW50ZWwgZG90IGNvbT4gYW5kCisgKgkJU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKgktIEFkZGVkIHN1cHBvcnQgZm9yIElFRUUgODAyLjNhZCBEeW5hbWljIGxpbmsgYWdncmVnYXRpb24gbW9kZS4KKyAqCisgKiAyMDAzLzA1LzAxIC0gQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gQWRkZWQgQUJJIHZlcnNpb24gY29udHJvbCB0byByZXN0b3JlIGNvbXBhdGliaWxpdHkgYmV0d2VlbgorICoJICBuZXcvb2xkIGlmZW5zbGF2ZSBhbmQgbmV3L29sZCBib25kaW5nLgorICoKKyAqIDIwMDMvMDUvMDEgLSBTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gRml4ZWQgYnVnIGluIGJvbmRfcmVsZWFzZV9hbGwoKTogc2F2ZSBvbGQgdmFsdWUgb2YgY3Vycl9hY3RpdmVfc2xhdmUKKyAqCSAgYmVmb3JlIHNldHRpbmcgaXQgdG8gTlVMTC4KKyAqCS0gQ2hhbmdlZCBkcml2ZXIgdmVyc2lvbmluZyBzY2hlbWUgdG8gaW5jbHVkZSB2ZXJzaW9uIG51bWJlciBpbnN0ZWFkCisgKgkgIG9mIHJlbGVhc2UgZGF0ZSAodGhhdCBpcyBhbHJlYWR5IGluIGFub3RoZXIgZmllbGQpLiBUaGVyZSBhcmUgMworICoJICBmaWVsZHMgWC5ZLlogd2hlcmU6CisgKgkJWCAtIE1ham9yIHZlcnNpb24gLSBiaWcgYmVoYXZpb3IgY2hhbmdlcworICoJCVkgLSBNaW5vciB2ZXJzaW9uIC0gYWRkaXRpb24gb2YgZmVhdHVyZXMKKyAqCQlaIC0gRXh0cmEgdmVyc2lvbiAtIG1pbm9yIGNoYW5nZXMgYW5kIGJ1ZyBmaXhlcworICoJICBUaGUgY3VycmVudCB2ZXJzaW9uIGlzIDEuMC4wIGFzIGEgYmFzZSBsaW5lLgorICoKKyAqIDIwMDMvMDUvMDEgLSBUc2lwcHkgTWVuZGVsc29uIDx0c2lwcHkubWVuZGVsc29uIGF0IGludGVsIGRvdCBjb20+IGFuZAorICoJCUFtaXIgTm9hbSA8YW1pci5ub2FtIGF0IGludGVsIGRvdCBjb20+CisgKgktIEFkZGVkIHN1cHBvcnQgZm9yIGxhY3BfcmF0ZSBtb2R1bGUgcGFyYW0uCisgKgktIENvZGUgYmVhdXRpZmljYXRpb24gYW5kIHN0eWxlIGNoYW5nZXMgKG1haW5seSBpbiBjb21tZW50cykuCisgKgkgIG5ldyB2ZXJzaW9uIC0gMS4wLjEKKyAqCisgKiAyMDAzLzA1LzAxIC0gU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKgktIEJhc2VkIG9uIGRpc2N1c3Npb24gb24gbWFpbGluZyBsaXN0LCBjaGFuZ2VkIGxvY2tpbmcgc2NoZW1lCisgKgkgIHRvIHVzZSBsb2NrL3VubG9jayBvciBsb2NrX2JoL3VubG9ja19iaCBhcHByb3ByaWF0ZWx5IGluc3RlYWQKKyAqCSAgb2YgbG9ja19pcnFzYXZlL3VubG9ja19pcnFyZXN0b3JlLiBUaGUgbmV3IHNjaGVtZSBoZWxwcyBleHBvc2luZworICoJICBoaWRkZW4gYnVncyBhbmQgc29sdmVzIHN5c3RlbSBoYW5ncyB0aGF0IG9jY3VycmVkIGR1ZSB0byB0aGUgZmFjdAorICoJICB0aGF0IGhvbGRpbmcgbG9ja19pcnFzYXZlIGRvZXNuJ3QgcHJldmVudCBzb2Z0aXJxcyBmcm9tIHJ1bm5pbmcuCisgKgkgIFRoaXMgYWxzbyBpbmNyZWFzZXMgdG90YWwgdGhyb3VnaHB1dCBzaW5jZSBpbnRlcnJ1cHRzIGFyZSBub3QKKyAqCSAgYmxvY2tlZCBvbiBlYWNoIHRyYW5zbWl0dGVkIHBhY2tldHMgb3IgbW9uaXRvciB0aW1lb3V0LgorICoJICBuZXcgdmVyc2lvbiAtIDIuMC4wCisgKgorICogMjAwMy8wNS8wMSAtIFNobXVsaWsgSGVuIDxzaG11bGlrLmhlbiBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBBZGRlZCBzdXBwb3J0IGZvciBUcmFuc21pdCBsb2FkIGJhbGFuY2luZyBtb2RlLgorICoJLSBDb25jZW50cmF0ZSBhbGwgYXNzaWdubWVudHMgb2YgY3Vycl9hY3RpdmVfc2xhdmUgdG8gYSBzaW5nbGUgcG9pbnQKKyAqCSAgc28gc3BlY2lmaWMgbW9kZXMgY2FuIHRha2UgYWN0aW9ucyB3aGVuIHRoZSBwcmltYXJ5IGFkYXB0ZXIgaXMKKyAqCSAgY2hhbmdlZC4KKyAqCS0gVGFrZSB0aGUgdXBkZWxheSBwYXJhbWV0ZXIgaW50byBjb25zaWRlcmF0aW9uIGR1cmluZyBib25kX2Vuc2xhdmUKKyAqCSAgc2luY2Ugc29tZSBhZGFwdGVycyBsb29zZSB0aGVpciBsaW5rIGR1cmluZyBzZXR0aW5nIHRoZSBkZXZpY2UuCisgKgktIFJlbmFtZWQgYm9uZF8zYWRfbGlua19zdGF0dXNfY2hhbmdlZCgpIHRvCisgKgkgIGJvbmRfM2FkX2hhbmRsZV9saW5rX2NoYW5nZSgpIGZvciBjb21wYXRpYmlsaXR5IHdpdGggVExCLgorICoJICBuZXcgdmVyc2lvbiAtIDIuMS4wCisgKgorICogMjAwMy8wNS8wMSAtIFRzaXBweSBNZW5kZWxzb24gPHRzaXBweS5tZW5kZWxzb24gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gQWRkZWQgc3VwcG9ydCBmb3IgQWRhcHRpdmUgbG9hZCBiYWxhbmNpbmcgbW9kZSB3aGljaCBpcworICoJICBlcXVpdmFsZW50IHRvIFRyYW5zbWl0IGxvYWQgYmFsYW5jaW5nICsgUmVjZWl2ZSBsb2FkIGJhbGFuY2luZy4KKyAqCSAgbmV3IHZlcnNpb24gLSAyLjIuMAorICoKKyAqIDIwMDMvMDUvMTUgLSBKYXkgVm9zYnVyZ2ggPGZ1YmFyIGF0IHVzIGRvdCBpYm0gZG90IGNvbT4KKyAqCS0gQXBwbGllZCBmaXggdG8gYWN0aXZlYmFja3VwX2FycF9tb25pdG9yIHBvc3RlZCB0byBib25kaW5nLWRldmVsCisgKgkgIGJ5IFRvbnkgQ3VyZWluZ3RvbiA8dG9ueS5jdXJlaW5ndG9uICogaHBfY29tPi4gIEZpeGVzIEFSUAorICoJICBtb25pdG9yIGVuZGxlc3MgZmFpbG92ZXIgYnVnLiAgVmVyc2lvbiB0byAyLjIuMTAKKyAqCisgKiAyMDAzLzA1LzIwIC0gQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gRml4ZWQgYnVnIGluIEFCSSB2ZXJzaW9uIGNvbnRyb2wgLSBEb24ndCBjb21taXQgdG8gYSBzcGVjaWZpYworICoJICBBQkkgdmVyc2lvbiBpZiByZWNlaXZpbmcgdW5zdXBwb3J0ZWQgaW9jdGwgY29tbWFuZHMuCisgKgorICogMjAwMy8wNS8yMiAtIEpheSBWb3NidXJnaCA8ZnViYXIgYXQgdXMgZG90IGlibSBkb3QgY29tPgorICoJLSBGaXggaWZlbnNsYXZlIC1jIGNhdXNpbmcgYm9uZCB0byBsb29zZSBleGlzdGluZyByb3V0ZXM7CisgKgkgIGFkZGVkIGJvbmRfc2V0X21hY19hZGRyZXNzKCkgdGhhdCBkb2Vzbid0IHJlcXVpcmUgdGhlCisgKgkgIGJvbmQgdG8gYmUgZG93bi4KKyAqCS0gSW4gY29uanVuY3Rpb24gd2l0aCBmaXggZm9yIGlmZW5zbGF2ZSAtYywgaW4KKyAqCSAgYm9uZF9jaGFuZ2VfYWN0aXZlKCksIGNoYW5naW5nIHRvIHRoZSBhbHJlYWR5IGFjdGl2ZSBzbGF2ZQorICoJICBpcyBubyBsb25nZXIgYW4gZXJyb3IgKGl0IHN1Y2Nlc3NmdWxseSBkb2VzIG5vdGhpbmcpLgorICoKKyAqIDIwMDMvMDYvMzAgLSBBbWlyIE5vYW0gPGFtaXIubm9hbSBhdCBpbnRlbCBkb3QgY29tPgorICogCS0gRml4ZWQgYm9uZF9jaGFuZ2VfYWN0aXZlKCkgZm9yIEFMQi9UTEIgbW9kZXMuCisgKgkgIFZlcnNpb24gdG8gMi4yLjE0LgorICoKKyAqIDIwMDMvMDcvMjkgLSBBbWlyIE5vYW0gPGFtaXIubm9hbSBhdCBpbnRlbCBkb3QgY29tPgorICogCS0gRml4ZWQgQVJQIG1vbml0b3JpbmcgYnVnLgorICoJICBWZXJzaW9uIHRvIDIuMi4xNS4KKyAqCisgKiAyMDAzLzA3LzMxIC0gV2lsbHkgVGFycmVhdSA8d2lsbHkgYXQgb2RzIGRvdCBvcmc+CisgKiAJLSBGaXhlZCBrZXJuZWwgcGFuaWMgd2hlbiB1c2luZyBBUlAgbW9uaXRvcmluZyB3aXRob3V0CisgKgkgIHNldHRpbmcgYm9uZCdzIElQIGFkZHJlc3MuCisgKgkgIFZlcnNpb24gdG8gMi4yLjE2LgorICoKKyAqIDIwMDMvMDgvMDYgLSBBbWlyIE5vYW0gPGFtaXIubm9hbSBhdCBpbnRlbCBkb3QgY29tPgorICogCS0gQmFjayBwb3J0IGZyb20gMi42OiB1c2UgYWxsb2NfbmV0ZGV2KCk7IGZpeCAvcHJvYyBoYW5kbGluZzsKKyAqCSAgbWFkZSBzdGF0cyBhIHBhcnQgb2YgYm9uZCBzdHJ1Y3Qgc28gbm8gbmVlZCB0byBhbGxvY2F0ZQorICoJICBhbmQgZnJlZSBpdCBzZXBhcmF0ZWx5OyB1c2Ugc3RhbmRhcmQgbGlzdCBvcGVyYXRpb25zIGluc3RlYWQKKyAqCSAgb2YgcHJlLWFsbG9jYXRlZCBhcnJheSBvZiBib25kcy4KKyAqCSAgVmVyc2lvbiB0byAyLjMuMC4KKyAqCisgKiAyMDAzLzA4LzA3IC0gSmF5IFZvc2J1cmdoIDxmdWJhciBhdCB1cyBkb3QgaWJtIGRvdCBjb20+LAorICoJICAgICAgIEFtaXIgTm9hbSA8YW1pci5ub2FtIGF0IGludGVsIGRvdCBjb20+IGFuZAorICoJICAgICAgIFNobXVsaWsgSGVuIDxzaG11bGlrLmhlbiBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBQcm9wYWdhdGluZyBtYXN0ZXIncyBzZXR0aW5nczogRGlzdGluZ3Vpc2ggYmV0d2VlbiBtb2RlcyB0aGF0CisgKgkgIHVzZSBhIHByaW1hcnkgc2xhdmUgZnJvbSB0aG9zZSB0aGF0IGRvbid0LCBhbmQgcHJvcGFnYXRlIHNldHRpbmdzCisgKgkgIGFjY29yZGluZ2x5OyBDb25zb2xpZGF0ZSBjaGFuZ2VfYWN0aXZlIG9wZWFydGlvbnMgYW5kIGFkZAorICoJICByZXNlbGVjdF9hY3RpdmUgYW5kIGZpbmRfYmVzdCBvcGVhcnRpb25zOyBEZWNvdXBsZSBwcm9taXNjdW91cworICoJICBoYW5kbGluZyBmcm9tIHRoZSBtdWx0aWNhc3QgbW9kZSBzZXR0aW5nOyBBZGQgc3VwcG9ydCBmb3IgY2hhbmdpbmcKKyAqCSAgSFcgYWRkcmVzcyBhbmQgTVRVIHdpdGggcHJvcGVyIHVud2luZDsgQ29uc29saWRhdGUgcHJvY2ZzIGNvZGUsCisgKgkgIGFkZCBDSEFOR0VOQU1FIGhhbmRsZXI7IEVuaGFuY2UgbmV0ZGV2IG5vdGlmaWNhdGlvbiBoYW5kbGluZy4KKyAqCSAgVmVyc2lvbiB0byAyLjQuMC4KKyAqCisgKiAyMDAzLzA5LzE1IC0gU3RlcGhlbiBIZW1taW5nZXIgPHNoZW1taW5nZXIgYXQgb3NkbCBkb3Qgb3JnPiwKKyAqCSAgICAgICBBbWlyIE5vYW0gPGFtaXIubm9hbSBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBDb252ZXJ0IC9wcm9jIHRvIHNlcV9maWxlIGludGVyZmFjZS4KKyAqCSAgQ2hhbmdlIC9wcm9jL25ldC9ib25kWC9pbmZvIHRvIC9wcm9jL25ldC9ib25kaW5nL2JvbmRYLgorICoJICBTZXQgdmVyc2lvbiB0byAyLjQuMS4KKyAqCisgKiAyMDAzLzExLzIwIC0gQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gRml4IC9wcm9jIGNyZWF0aW9uL2Rlc3RydWN0aW9uLgorICoKKyAqIDIwMDMvMTIvMDEgLSBTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gTWFzc2l2ZSBjbGVhbnVwIC0gU2V0IHZlcnNpb24gdG8gMi41LjAKKyAqCSAgQ29kZSBjaGFuZ2VzOgorICoJICBvIENvbnNvbGlkYXRlIGZvcm1hdCBvZiBwcmludHMgYW5kIGRlYnVnIHByaW50cy4KKyAqCSAgbyBSZW1vdmUgYm9uZGluZ190L3NsYXZlX3QgdHlwZWRlZnMgYW5kIGNvbnNvbGlkYXRlIGFsbCBjYXN0cy4KKyAqCSAgbyBSZW1vdmUgZGVhZCBjb2RlIGFuZCB1bm5lY2Vzc2FyeSBjaGVja3MuCisgKgkgIG8gQ29uc29saWRhdGUgc3RhcnRpbmcvc3RvcHBpbmcgdGltZXJzLgorICoJICBvIENvbnNvbGlkYXRlIGhhbmRsaW5nIG9mIHByaW1hcnkgbW9kdWxlIHBhcmFtIHRocm91Z2hvdXQgdGhlIGNvZGUuCisgKgkgIG8gUmVtb3ZlZCBtdWx0aWNhc3QgbW9kdWxlIHBhcmFtIHN1cHBvcnQgLSBhbGwgc2V0dGluZ3MgYXJlIGRvbmUKKyAqCSAgICBhY2NvcmRpbmcgdG8gbW9kZS4KKyAqCSAgbyBTbGF2ZSBsaXN0IGl0ZXJhdGlvbiAtIGJvbmQgaXMgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIGxpc3QsCisgKgkgICAgYWRkZWQgY3ljbGljIGxpc3QgaXRlcmF0aW9uIG1hY3Jvcy4KKyAqCSAgbyBDb25zb2xpZGF0ZSBlcnJvciBoYW5kbGluZyBpbiBhbGwgeG1pdCBmdW5jdGlvbnMuCisgKgkgIFN0eWxlIGNoYW5nZXM6CisgKgkgIG8gQ29uc29saWRhdGUgZnVuY3Rpb24gbmFtaW5nIGFuZCBkZWNsYXJhdGlvbnMuCisgKgkgIG8gQ29uc29saWRhdGUgZnVuY3Rpb24gcGFyYW1zIGFuZCBsb2NhbCB2YXJpYWJsZXMgbmFtZXMuCisgKgkgIG8gQ29uc29saWRhdGUgcmV0dXJuIHZhbHVlcy4KKyAqCSAgbyBDb25zb2xpZGF0ZSBjdXJseSBicmFjZXMuCisgKgkgIG8gQ29uc29saWRhdGUgY29uZGl0aW9uYWxzIGZvcm1hdC4KKyAqCSAgbyBDaGFuZ2Ugc3RydWN0IG1lbWJlciBuYW1lcyBhbmQgdHlwZXMuCisgKgkgIG8gQ2hvbXAgdHJhaWxpbmcgc3BhY2VzLCByZW1vdmUgZW1wdHkgbGluZXMsIGZpeCBpbmRlbnRhdGlvbnMuCisgKgkgIG8gUmUtb3JnYW5pemUgY29kZSBhY2NvcmRpbmcgdG8gY29udGV4dC4KKyAqCisgKiAyMDAzLzEyLzMwIC0gQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gRml4ZWQ6IENhbm5vdCByZW1vdmUgYW5kIHJlLWVuc2xhdmUgdGhlIG9yaWdpbmFsIGFjdGl2ZSBzbGF2ZS4KKyAqCS0gRml4ZWQ6IFJlbGVhc2luZyB0aGUgb3JpZ2luYWwgYWN0aXZlIHNsYXZlIGNhdXNlcyBtYWMgYWRkcmVzcworICoJCSBkdXBsaWNhdGlvbi4KKyAqCS0gQWRkIHN1cHBvcnQgZm9yIHNsYXZlcyB0aGF0IHVzZSBldGh0b29sX29wcy4KKyAqCSAgU2V0IHZlcnNpb24gdG8gMi41LjMuCisgKgorICogMjAwNC8wMS8wNSAtIEFtaXIgTm9hbSA8YW1pci5ub2FtIGF0IGludGVsIGRvdCBjb20+CisgKgktIFNhdmUgYm9uZGluZyBwYXJhbWV0ZXJzIHBlciBib25kIGluc3RlYWQgb2YgdXNpbmcgdGhlIGdsb2JhbCB2YWx1ZXMuCisgKgkgIFNldCB2ZXJzaW9uIHRvIDIuNS40LgorICoKKyAqIDIwMDQvMDEvMTQgLSBTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gRW5oYW5jZSBWTEFOIHN1cHBvcnQ6CisgKgkgICogQWRkIHN1cHBvcnQgZm9yIFZMQU4gaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGNhcGFibGUgc2xhdmVzLgorICoJICAqIEFkZCBjYXBhYmlsaXR5IHRvIHRhZyBzZWxmIGdlbmVyYXRlZCBwYWNrZXRzIGluIEFMQi9UTEIgbW9kZXMuCisgKgkgIFNldCB2ZXJzaW9uIHRvIDIuNi4wLgorICogMjAwNC8xMC8yOSAtIE1pdGNoIFdpbGxpYW1zIDxtaXRjaC5hLndpbGxpYW1zIGF0IGludGVsIGRvdCBjb20+CisgKiAgICAgIC0gRml4ZWQgYnVnIHdoZW4gdW5sb2FkaW5nIG1vZHVsZSB3aGlsZSB1c2luZyA4MDIuM2FkLiAgSWYKKyAqICAgICAgICBzcGlubG9jayBkZWJ1Z2dpbmcgaXMgdHVybmVkIG9uLCB0aGlzIGNhdXNlcyBhIHN0YWNrIGR1bXAuCisgKiAgICAgICAgU29sdXRpb24gaXMgdG8gbW92ZSBjYWxsIHRvIGRldl9yZW1vdmVfcGFjayBvdXRzaWRlIG9mIHRoZQorICogICAgICAgIHNwaW5sb2NrLgorICogICAgICAgIFNldCB2ZXJzaW9uIHRvIDIuNi4xLgorICoKKyAqLworCisvLyNkZWZpbmUgQk9ORElOR19ERUJVRyAxCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ib25kaW5nLmg+CisjaW5jbHVkZSAiYm9uZGluZy5oIgorI2luY2x1ZGUgImJvbmRfM2FkLmgiCisjaW5jbHVkZSAiYm9uZF9hbGIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1vZHVsZSBwYXJhbWV0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBtb25pdG9yIGFsbCBsaW5rcyB0aGF0IG9mdGVuIChpbiBtaWxsaXNlY29uZHMpLiA8PTAgZGlzYWJsZXMgbW9uaXRvcmluZyAqLworI2RlZmluZSBCT05EX0xJTktfTU9OX0lOVEVSVgkwCisjZGVmaW5lIEJPTkRfTElOS19BUlBfSU5URVJWCTAKKworc3RhdGljIGludCBtYXhfYm9uZHMJPSBCT05EX0RFRkFVTFRfTUFYX0JPTkRTOworc3RhdGljIGludCBtaWltb24JPSBCT05EX0xJTktfTU9OX0lOVEVSVjsKK3N0YXRpYyBpbnQgdXBkZWxheQk9IDA7CitzdGF0aWMgaW50IGRvd25kZWxheQk9IDA7CitzdGF0aWMgaW50IHVzZV9jYXJyaWVyCT0gMTsKK3N0YXRpYyBjaGFyICptb2RlCT0gTlVMTDsKK3N0YXRpYyBjaGFyICpwcmltYXJ5CT0gTlVMTDsKK3N0YXRpYyBjaGFyICpsYWNwX3JhdGUJPSBOVUxMOworc3RhdGljIGludCBhcnBfaW50ZXJ2YWwgPSBCT05EX0xJTktfQVJQX0lOVEVSVjsKK3N0YXRpYyBjaGFyICphcnBfaXBfdGFyZ2V0W0JPTkRfTUFYX0FSUF9UQVJHRVRTXSA9IHsgTlVMTCwgfTsKKworbW9kdWxlX3BhcmFtKG1heF9ib25kcywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2JvbmRzLCAiTWF4IG51bWJlciBvZiBib25kZWQgZGV2aWNlcyIpOworbW9kdWxlX3BhcmFtKG1paW1vbiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWlpbW9uLCAiTGluayBjaGVjayBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMiKTsKK21vZHVsZV9wYXJhbSh1cGRlbGF5LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh1cGRlbGF5LCAiRGVsYXkgYmVmb3JlIGNvbnNpZGVyaW5nIGxpbmsgdXAsIGluIG1pbGxpc2Vjb25kcyIpOworbW9kdWxlX3BhcmFtKGRvd25kZWxheSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZG93bmRlbGF5LCAiRGVsYXkgYmVmb3JlIGNvbnNpZGVyaW5nIGxpbmsgZG93biwgaW4gbWlsbGlzZWNvbmRzIik7Cittb2R1bGVfcGFyYW0odXNlX2NhcnJpZXIsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHVzZV9jYXJyaWVyLCAiVXNlIG5ldGlmX2NhcnJpZXJfb2sgKHZzIE1JSSBpb2N0bHMpIGluIG1paW1vbjsgMCBmb3Igb2ZmLCAxIGZvciBvbiAoZGVmYXVsdCkiKTsKK21vZHVsZV9wYXJhbShtb2RlLCBjaGFycCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1vZGUsICJNb2RlIG9mIG9wZXJhdGlvbiA6IDAgZm9yIHJvdW5kIHJvYmluLCAxIGZvciBhY3RpdmUtYmFja3VwLCAyIGZvciB4b3IiKTsKK21vZHVsZV9wYXJhbShwcmltYXJ5LCBjaGFycCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHByaW1hcnksICJQcmltYXJ5IG5ldHdvcmsgZGV2aWNlIHRvIHVzZSIpOworbW9kdWxlX3BhcmFtKGxhY3BfcmF0ZSwgY2hhcnAsIDApOworTU9EVUxFX1BBUk1fREVTQyhsYWNwX3JhdGUsICJMQUNQRFUgdHggcmF0ZSB0byByZXF1ZXN0IGZyb20gODAyLjNhZCBwYXJ0bmVyIChzbG93L2Zhc3QpIik7Cittb2R1bGVfcGFyYW0oYXJwX2ludGVydmFsLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhhcnBfaW50ZXJ2YWwsICJhcnAgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoYXJwX2lwX3RhcmdldCwgY2hhcnAsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhhcnBfaXBfdGFyZ2V0LCAiYXJwIHRhcmdldHMgaW4gbi5uLm4ubiBmb3JtIik7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb24gPQorCURSVl9ERVNDUklQVElPTiAiOiB2IiBEUlZfVkVSU0lPTiAiICgiIERSVl9SRUxEQVRFICIpXG4iOworCitzdGF0aWMgTElTVF9IRUFEKGJvbmRfZGV2X2xpc3QpOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmJvbmRfcHJvY19kaXIgPSBOVUxMOworI2VuZGlmCisKK3N0YXRpYyB1MzIgYXJwX3RhcmdldFtCT05EX01BWF9BUlBfVEFSR0VUU10gPSB7IDAsIH0gOworc3RhdGljIGludCBhcnBfaXBfY291bnQJPSAwOworc3RhdGljIHUzMiBteV9pcAk9IDA7CitzdGF0aWMgaW50IGJvbmRfbW9kZQk9IEJPTkRfTU9ERV9ST1VORFJPQklOOworc3RhdGljIGludCBsYWNwX2Zhc3QJPSAwOworc3RhdGljIGludCBhcHBfYWJpX3Zlcgk9IDA7CitzdGF0aWMgaW50IG9yaWdfYXBwX2FiaV92ZXIgPSAtMTsgLyogVGhpcyBpcyB1c2VkIHRvIHNhdmUgdGhlIGZpcnN0IEFCSSB2ZXJzaW9uCisJCQkJICAgKiB3ZSByZWNlaXZlIGZyb20gdGhlIGFwcGxpY2F0aW9uLiBPbmNlIHNldCwKKwkJCQkgICAqIGl0IHdvbid0IGJlIGNoYW5nZWQsIGFuZCB0aGUgbW9kdWxlIHdpbGwKKwkJCQkgICAqIHJlZnVzZSB0byBlbnNsYXZlL3JlbGVhc2UgaW50ZXJmYWNlcyBpZiB0aGUKKwkJCQkgICAqIGNvbW1hbmQgY29tZXMgZnJvbSBhbiBhcHBsaWNhdGlvbiB1c2luZworCQkJCSAgICogYW5vdGhlciBBQkkgdmVyc2lvbi4KKwkJCQkgICAqLworCitzdHJ1Y3QgYm9uZF9wYXJtX3RibCB7CisJY2hhciAqbW9kZW5hbWU7CisJaW50IG1vZGU7Cit9OworCitzdGF0aWMgc3RydWN0IGJvbmRfcGFybV90YmwgYm9uZF9sYWNwX3RibFtdID0geworewkic2xvdyIsCQlBRF9MQUNQX1NMT1d9LAorewkiZmFzdCIsCQlBRF9MQUNQX0ZBU1R9LAorewlOVUxMLAkJLTF9LAorfTsKKworc3RhdGljIHN0cnVjdCBib25kX3Bhcm1fdGJsIGJvbmRfbW9kZV90YmxbXSA9IHsKK3sJImJhbGFuY2UtcnIiLAkJQk9ORF9NT0RFX1JPVU5EUk9CSU59LAorewkiYWN0aXZlLWJhY2t1cCIsCUJPTkRfTU9ERV9BQ1RJVkVCQUNLVVB9LAorewkiYmFsYW5jZS14b3IiLAkJQk9ORF9NT0RFX1hPUn0sCit7CSJicm9hZGNhc3QiLAkJQk9ORF9NT0RFX0JST0FEQ0FTVH0sCit7CSI4MDIuM2FkIiwJCUJPTkRfTU9ERV84MDIzQUR9LAorewkiYmFsYW5jZS10bGIiLAkJQk9ORF9NT0RFX1RMQn0sCit7CSJiYWxhbmNlLWFsYiIsCQlCT05EX01PREVfQUxCfSwKK3sJTlVMTCwJCQktMX0sCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZvcndhcmQgZGVjbGFyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBib25kX3NldF9tb2RlX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYsIGludCBtb2RlKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdlbmVyYWwgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgY29uc3QgY2hhciAqYm9uZF9tb2RlX25hbWUoaW50IG1vZGUpCit7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBCT05EX01PREVfUk9VTkRST0JJTiA6CisJCXJldHVybiAibG9hZCBiYWxhbmNpbmcgKHJvdW5kLXJvYmluKSI7CisJY2FzZSBCT05EX01PREVfQUNUSVZFQkFDS1VQIDoKKwkJcmV0dXJuICJmYXVsdC10b2xlcmFuY2UgKGFjdGl2ZS1iYWNrdXApIjsKKwljYXNlIEJPTkRfTU9ERV9YT1IgOgorCQlyZXR1cm4gImxvYWQgYmFsYW5jaW5nICh4b3IpIjsKKwljYXNlIEJPTkRfTU9ERV9CUk9BRENBU1QgOgorCQlyZXR1cm4gImZhdWx0LXRvbGVyYW5jZSAoYnJvYWRjYXN0KSI7CisJY2FzZSBCT05EX01PREVfODAyM0FEOgorCQlyZXR1cm4gIklFRUUgODAyLjNhZCBEeW5hbWljIGxpbmsgYWdncmVnYXRpb24iOworCWNhc2UgQk9ORF9NT0RFX1RMQjoKKwkJcmV0dXJuICJ0cmFuc21pdCBsb2FkIGJhbGFuY2luZyI7CisJY2FzZSBCT05EX01PREVfQUxCOgorCQlyZXR1cm4gImFkYXB0aXZlIGxvYWQgYmFsYW5jaW5nIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gInVua25vd24iOworCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZMQU4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIGJvbmRfYWRkX3ZsYW4gLSBhZGQgYSBuZXcgdmxhbiBpZCBvbiBib25kCisgKiBAYm9uZDogYm9uZCB0aGF0IGdvdCB0aGUgbm90aWZpY2F0aW9uCisgKiBAdmxhbl9pZDogdGhlIHZsYW4gaWQgdG8gYWRkCisgKgorICogUmV0dXJucyAtRU5PTUVNIGlmIGFsbG9jYXRpb24gZmFpbGVkLgorICovCitzdGF0aWMgaW50IGJvbmRfYWRkX3ZsYW4oc3RydWN0IGJvbmRpbmcgKmJvbmQsIHVuc2lnbmVkIHNob3J0IHZsYW5faWQpCit7CisJc3RydWN0IHZsYW5fZW50cnkgKnZsYW47CisKKwlkcHJpbnRrKCJib25kOiAlcywgdmxhbiBpZCAlZFxuIiwKKwkJKGJvbmQgPyBib25kLT5kZXYtPm5hbWU6ICJOb25lIiksIHZsYW5faWQpOworCisJdmxhbiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2bGFuX2VudHJ5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2bGFuKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCUlOSVRfTElTVF9IRUFEKCZ2bGFuLT52bGFuX2xpc3QpOworCXZsYW4tPnZsYW5faWQgPSB2bGFuX2lkOworCisJd3JpdGVfbG9ja19iaCgmYm9uZC0+bG9jayk7CisKKwlsaXN0X2FkZF90YWlsKCZ2bGFuLT52bGFuX2xpc3QsICZib25kLT52bGFuX2xpc3QpOworCisJd3JpdGVfdW5sb2NrX2JoKCZib25kLT5sb2NrKTsKKworCWRwcmludGsoImFkZGVkIFZMQU4gSUQgJWQgb24gYm9uZCAlc1xuIiwgdmxhbl9pZCwgYm9uZC0+ZGV2LT5uYW1lKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGJvbmRfZGVsX3ZsYW4gLSBkZWxldGUgYSB2bGFuIGlkIGZyb20gYm9uZAorICogQGJvbmQ6IGJvbmQgdGhhdCBnb3QgdGhlIG5vdGlmaWNhdGlvbgorICogQHZsYW5faWQ6IHRoZSB2bGFuIGlkIHRvIGRlbGV0ZQorICoKKyAqIHJldHVybnMgLUVOT0RFViBpZiBAdmxhbl9pZCB3YXMgbm90IGZvdW5kIGluIEBib25kLgorICovCitzdGF0aWMgaW50IGJvbmRfZGVsX3ZsYW4oc3RydWN0IGJvbmRpbmcgKmJvbmQsIHVuc2lnbmVkIHNob3J0IHZsYW5faWQpCit7CisJc3RydWN0IHZsYW5fZW50cnkgKnZsYW4sICpuZXh0OworCWludCByZXMgPSAtRU5PREVWOworCisJZHByaW50aygiYm9uZDogJXMsIHZsYW4gaWQgJWRcbiIsIGJvbmQtPmRldi0+bmFtZSwgdmxhbl9pZCk7CisKKwl3cml0ZV9sb2NrX2JoKCZib25kLT5sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2bGFuLCBuZXh0LCAmYm9uZC0+dmxhbl9saXN0LCB2bGFuX2xpc3QpIHsKKwkJaWYgKHZsYW4tPnZsYW5faWQgPT0gdmxhbl9pZCkgeworCQkJbGlzdF9kZWwoJnZsYW4tPnZsYW5fbGlzdCk7CisKKwkJCWlmICgoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX1RMQikgfHwKKwkJCSAgICAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX0FMQikpIHsKKwkJCQlib25kX2FsYl9jbGVhcl92bGFuKGJvbmQsIHZsYW5faWQpOworCQkJfQorCisJCQlkcHJpbnRrKCJyZW1vdmVkIFZMQU4gSUQgJWQgZnJvbSBib25kICVzXG4iLCB2bGFuX2lkLAorCQkJCWJvbmQtPmRldi0+bmFtZSk7CisKKwkJCWtmcmVlKHZsYW4pOworCisJCQlpZiAobGlzdF9lbXB0eSgmYm9uZC0+dmxhbl9saXN0KSAmJgorCQkJICAgIChib25kLT5zbGF2ZV9jbnQgPT0gMCkpIHsKKwkJCQkvKiBMYXN0IFZMQU4gcmVtb3ZlZCBhbmQgbm8gc2xhdmVzLCBzbworCQkJCSAqIHJlc3RvcmUgYmxvY2sgb24gYWRkaW5nIFZMQU5zLiBUaGlzIHdpbGwKKwkJCQkgKiBiZSByZW1vdmVkIG9uY2UgbmV3IHNsYXZlcyB0aGF0IGFyZSBub3QKKwkJCQkgKiBWTEFOIGNoYWxsZW5nZWQgd2lsbCBiZSBhZGRlZC4KKwkJCQkgKi8KKwkJCQlib25kLT5kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVkxBTl9DSEFMTEVOR0VEOworCQkJfQorCisJCQlyZXMgPSAwOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlkcHJpbnRrKCJjb3VsZG4ndCBmaW5kIFZMQU4gSUQgJWQgaW4gYm9uZCAlc1xuIiwgdmxhbl9pZCwKKwkJYm9uZC0+ZGV2LT5uYW1lKTsKKworb3V0OgorCXdyaXRlX3VubG9ja19iaCgmYm9uZC0+bG9jayk7CisJcmV0dXJuIHJlczsKK30KKworLyoqCisgKiBib25kX2hhc19jaGFsbGVuZ2VkX3NsYXZlcworICogQGJvbmQ6IHRoZSBib25kIHdlJ3JlIHdvcmtpbmcgb24KKyAqCisgKiBTZWFyY2hlcyB0aGUgc2xhdmUgbGlzdC4gUmV0dXJucyAxIGlmIGEgdmxhbiBjaGFsbGVuZ2VkIHNsYXZlCisgKiB3YXMgZm91bmQsIDAgb3RoZXJ3aXNlLgorICoKKyAqIEFzc3VtZXMgYm9uZC0+bG9jayBpcyBoZWxkLgorICovCitzdGF0aWMgaW50IGJvbmRfaGFzX2NoYWxsZW5nZWRfc2xhdmVzKHN0cnVjdCBib25kaW5nICpib25kKQoreworCXN0cnVjdCBzbGF2ZSAqc2xhdmU7CisJaW50IGk7CisKKwlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7CisJCWlmIChzbGF2ZS0+ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfVkxBTl9DSEFMTEVOR0VEKSB7CisJCQlkcHJpbnRrKCJmb3VuZCBWTEFOIGNoYWxsZW5nZWQgc2xhdmUgLSAlc1xuIiwKKwkJCQlzbGF2ZS0+ZGV2LT5uYW1lKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJZHByaW50aygibm8gVkxBTiBjaGFsbGVuZ2VkIHNsYXZlcyBmb3VuZFxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYm9uZF9uZXh0X3ZsYW4gLSBzYWZlbHkgc2tpcCB0byB0aGUgbmV4dCBpdGVtIGluIHRoZSB2bGFucyBsaXN0LgorICogQGJvbmQ6IHRoZSBib25kIHdlJ3JlIHdvcmtpbmcgb24KKyAqIEBjdXJyOiBpdGVtIHdlJ3JlIGFkdmFuY2luZyBmcm9tCisgKgorICogUmV0dXJucyAlTlVMTCBpZiBsaXN0IGlzIGVtcHR5LCBib25kLT5uZXh0X3ZsYW4gaWYgQGN1cnIgaXMgJU5VTEwsCisgKiBvciBAY3Vyci0+bmV4dCBvdGhlcndpc2UgKGV2ZW4gaWYgaXQgaXMgQGN1cnIgaXRzZWxmIGFnYWluKS4KKyAqIAorICogQ2FsbGVyIG11c3QgaG9sZCBib25kLT5sb2NrCisgKi8KK3N0cnVjdCB2bGFuX2VudHJ5ICpib25kX25leHRfdmxhbihzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHZsYW5fZW50cnkgKmN1cnIpCit7CisJc3RydWN0IHZsYW5fZW50cnkgKm5leHQsICpsYXN0OworCisJaWYgKGxpc3RfZW1wdHkoJmJvbmQtPnZsYW5fbGlzdCkpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCFjdXJyKSB7CisJCW5leHQgPSBsaXN0X2VudHJ5KGJvbmQtPnZsYW5fbGlzdC5uZXh0LAorCQkJCSAgc3RydWN0IHZsYW5fZW50cnksIHZsYW5fbGlzdCk7CisJfSBlbHNlIHsKKwkJbGFzdCA9IGxpc3RfZW50cnkoYm9uZC0+dmxhbl9saXN0LnByZXYsCisJCQkJICBzdHJ1Y3Qgdmxhbl9lbnRyeSwgdmxhbl9saXN0KTsKKwkJaWYgKGxhc3QgPT0gY3VycikgeworCQkJbmV4dCA9IGxpc3RfZW50cnkoYm9uZC0+dmxhbl9saXN0Lm5leHQsCisJCQkJCSAgc3RydWN0IHZsYW5fZW50cnksIHZsYW5fbGlzdCk7CisJCX0gZWxzZSB7CisJCQluZXh0ID0gbGlzdF9lbnRyeShjdXJyLT52bGFuX2xpc3QubmV4dCwKKwkJCQkJICBzdHJ1Y3Qgdmxhbl9lbnRyeSwgdmxhbl9saXN0KTsKKwkJfQorCX0KKworCXJldHVybiBuZXh0OworfQorCisvKioKKyAqIGJvbmRfZGV2X3F1ZXVlX3htaXQgLSBQcmVwYXJlIHNrYiBmb3IgeG1pdC4KKyAqIAorICogQGJvbmQ6IGJvbmQgZGV2aWNlIHRoYXQgZ290IHRoaXMgc2tiIGZvciB0eC4KKyAqIEBza2I6IGh3IGFjY2VsIFZMQU4gdGFnZ2VkIHNrYiB0byB0cmFuc21pdAorICogQHNsYXZlX2Rldjogc2xhdmUgdGhhdCBpcyBzdXBwb3NlZCB0byB4bWl0IHRoaXMgc2tidWZmCisgKiAKKyAqIFdoZW4gdGhlIGJvbmQgZ2V0cyBhbiBza2IgdG8gdHJhbnNtaXQgdGhhdCBpcworICogYWxyZWFkeSBoYXJkd2FyZSBhY2NlbGVyYXRlZCBWTEFOIHRhZ2dlZCwgYW5kIGl0CisgKiBuZWVkcyB0byByZWxheSB0aGlzIHNrYiB0byBhIHNsYXZlIHRoYXQgaXMgbm90CisgKiBodyBhY2NlbCBjYXBhYmxlLCB0aGUgc2tiIG5lZWRzIHRvIGJlICJ1bmFjY2VsZXJhdGVkIiwKKyAqIGkuZS4gc3RyaXAgdGhlIGh3YWNjZWwgdGFnIGFuZCByZS1pbnNlcnQgaXQgYXMgcGFydAorICogb2YgdGhlIHBheWxvYWQuCisgKi8KK2ludCBib25kX2Rldl9xdWV1ZV94bWl0KHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2KQoreworCXVuc2lnbmVkIHNob3J0IHZsYW5faWQ7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmJvbmQtPnZsYW5fbGlzdCkgJiYKKwkgICAgIShzbGF2ZV9kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1RYKSAmJgorCSAgICB2bGFuX2dldF90YWcoc2tiLCAmdmxhbl9pZCkgPT0gMCkgeworCQlza2ItPmRldiA9IHNsYXZlX2RldjsKKwkJc2tiID0gdmxhbl9wdXRfdGFnKHNrYiwgdmxhbl9pZCk7CisJCWlmICghc2tiKSB7CisJCQkvKiB2bGFuX3B1dF90YWcoKSBmcmVlcyB0aGUgc2tiIGluIGNhc2Ugb2YgZXJyb3IsCisJCQkgKiBzbyByZXR1cm4gc3VjY2VzcyBoZXJlIHNvIHRoZSBjYWxsaW5nIGZ1bmN0aW9ucworCQkJICogd29uJ3QgYXR0ZW1wdCB0byBmcmVlIGlzIGFnYWluLgorCQkJICovCisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CisJCXNrYi0+ZGV2ID0gc2xhdmVfZGV2OworCX0KKworCXNrYi0+cHJpb3JpdHkgPSAxOworCWRldl9xdWV1ZV94bWl0KHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluIHRoZSBmb2xsb3dpbmcgMyBmdW5jdGlvbnMsIGJvbmRfdmxhbl9yeF9yZWdpc3RlcigpLCBib25kX3ZsYW5fcnhfYWRkX3ZpZAorICogYW5kIGJvbmRfdmxhbl9yeF9raWxsX3ZpZCwgV2UgZG9uJ3QgcHJvdGVjdCB0aGUgc2xhdmUgbGlzdCBpdGVyYXRpb24gd2l0aCBhCisgKiBsb2NrIGJlY2F1c2U6CisgKiBhLiBUaGlzIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgaW4gSU9DVEwgY29udGV4dCwKKyAqIGIuIFRoZSBvcGVyYXRpb24gaXMgcHJvdGVjdGVkIGJ5IHRoZSBSVE5MIHNlbWFwaG9yZSBpbiB0aGUgODAyMXEgY29kZSwKKyAqIGMuIEhvbGRpbmcgYSBsb2NrIHdpdGggQkggZGlzYWJsZWQgd2hpbGUgZGlyZWN0bHkgY2FsbGluZyBhIGJhc2UgZHJpdmVyCisgKiAgICBlbnRyeSBwb2ludCBpcyBnZW5lcmFsbHkgYSBCQUQgaWRlYS4KKyAqIAorICogVGhlIGRlc2lnbiBvZiBzeW5jaHJvbml6YXRpb24vcHJvdGVjdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24gaW4gdGhlIDgwMjFxCisgKiBtb2R1bGUgaXMgZ29vZCBmb3Igb25lIG9yIG1vcmUgVkxBTiBkZXZpY2VzIG92ZXIgYSBzaW5nbGUgcGh5c2ljYWwgZGV2aWNlCisgKiBhbmQgY2Fubm90IGJlIGV4dGVuZGVkIGZvciBhIHRlYW1pbmcgc29sdXRpb24gbGlrZSBib25kaW5nLCBzbyB0aGVyZSBpcyBhCisgKiBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24gaGVyZSB3aGVyZSBhIG5ldCBkZXZpY2UgZnJvbSB0aGUgdmxhbiBncm91cCBtaWdodAorICogYmUgcmVmZXJlbmNlZCAoZWl0aGVyIGJ5IGEgYmFzZSBkcml2ZXIgb3IgdGhlIDgwMjFxIGNvZGUpIHdoaWxlIGl0IGlzIGJlaW5nCisgKiByZW1vdmVkIGZyb20gdGhlIHN5c3RlbS4gSG93ZXZlciwgaXQgdHVybnMgb3V0IHdlJ3JlIG5vdCBtYWtpbmcgbWF0dGVycworICogd29yc2UsIGFuZCBpZiBpdCB3b3JrcyBmb3IgcmVndWxhciBWTEFOIHVzYWdlIGl0IHdpbGwgd29yayBoZXJlIHRvby4KKyovCisKKy8qKgorICogYm9uZF92bGFuX3J4X3JlZ2lzdGVyIC0gUHJvcGFnYXRlcyByZWdpc3RyYXRpb24gdG8gc2xhdmVzCisgKiBAYm9uZF9kZXY6IGJvbmRpbmcgbmV0IGRldmljZSB0aGF0IGdvdCBjYWxsZWQKKyAqIEBncnA6IHZsYW4gZ3JvdXAgYmVpbmcgcmVnaXN0ZXJlZAorICovCitzdGF0aWMgdm9pZCBib25kX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2LCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisJc3RydWN0IHNsYXZlICpzbGF2ZTsKKwlpbnQgaTsKKworCWJvbmQtPnZsZ3JwID0gZ3JwOworCisJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2ID0gc2xhdmUtPmRldjsKKworCQlpZiAoKHNsYXZlX2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fUlgpICYmCisJCSAgICBzbGF2ZV9kZXYtPnZsYW5fcnhfcmVnaXN0ZXIpIHsKKwkJCXNsYXZlX2Rldi0+dmxhbl9yeF9yZWdpc3RlcihzbGF2ZV9kZXYsIGdycCk7CisJCX0KKwl9Cit9CisKKy8qKgorICogYm9uZF92bGFuX3J4X2FkZF92aWQgLSBQcm9wYWdhdGVzIGFkZGluZyBhbiBpZCB0byBzbGF2ZXMKKyAqIEBib25kX2RldjogYm9uZGluZyBuZXQgZGV2aWNlIHRoYXQgZ290IGNhbGxlZAorICogQHZpZDogdmxhbiBpZCBiZWluZyBhZGRlZAorICovCitzdGF0aWMgdm9pZCBib25kX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYsIHVpbnQxNl90IHZpZCkKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZGV2LT5wcml2OworCXN0cnVjdCBzbGF2ZSAqc2xhdmU7CisJaW50IGksIHJlczsKKworCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGkpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldiA9IHNsYXZlLT5kZXY7CisKKwkJaWYgKChzbGF2ZV9kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUikgJiYKKwkJICAgIHNsYXZlX2Rldi0+dmxhbl9yeF9hZGRfdmlkKSB7CisJCQlzbGF2ZV9kZXYtPnZsYW5fcnhfYWRkX3ZpZChzbGF2ZV9kZXYsIHZpZCk7CisJCX0KKwl9CisKKwlyZXMgPSBib25kX2FkZF92bGFuKGJvbmQsIHZpZCk7CisJaWYgKHJlcykgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKKwkJICAgICAgICI6ICVzOiBGYWlsZWQgdG8gYWRkIHZsYW4gaWQgJWRcbiIsCisJCSAgICAgICBib25kX2Rldi0+bmFtZSwgdmlkKTsKKwl9Cit9CisKKy8qKgorICogYm9uZF92bGFuX3J4X2tpbGxfdmlkIC0gUHJvcGFnYXRlcyBkZWxldGluZyBhbiBpZCB0byBzbGF2ZXMKKyAqIEBib25kX2RldjogYm9uZGluZyBuZXQgZGV2aWNlIHRoYXQgZ290IGNhbGxlZAorICogQHZpZDogdmxhbiBpZCBiZWluZyByZW1vdmVkCisgKi8KK3N0YXRpYyB2b2lkIGJvbmRfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYsIHVpbnQxNl90IHZpZCkKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZGV2LT5wcml2OworCXN0cnVjdCBzbGF2ZSAqc2xhdmU7CisJc3RydWN0IG5ldF9kZXZpY2UgKnZsYW5fZGV2OworCWludCBpLCByZXM7CisKKwlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXYgPSBzbGF2ZS0+ZGV2OworCisJCWlmICgoc2xhdmVfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9GSUxURVIpICYmCisJCSAgICBzbGF2ZV9kZXYtPnZsYW5fcnhfa2lsbF92aWQpIHsKKwkJCS8qIFNhdmUgYW5kIHRoZW4gcmVzdG9yZSB2bGFuX2RldiBpbiB0aGUgZ3JwIGFycmF5LAorCQkJICogc2luY2UgdGhlIHNsYXZlJ3MgZHJpdmVyIG1pZ2h0IGNsZWFyIGl0LgorCQkJICovCisJCQl2bGFuX2RldiA9IGJvbmQtPnZsZ3JwLT52bGFuX2RldmljZXNbdmlkXTsKKwkJCXNsYXZlX2Rldi0+dmxhbl9yeF9raWxsX3ZpZChzbGF2ZV9kZXYsIHZpZCk7CisJCQlib25kLT52bGdycC0+dmxhbl9kZXZpY2VzW3ZpZF0gPSB2bGFuX2RldjsKKwkJfQorCX0KKworCXJlcyA9IGJvbmRfZGVsX3ZsYW4oYm9uZCwgdmlkKTsKKwlpZiAocmVzKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkgICAgICAgIjogJXM6IEZhaWxlZCB0byByZW1vdmUgdmxhbiBpZCAlZFxuIiwKKwkJICAgICAgIGJvbmRfZGV2LT5uYW1lLCB2aWQpOworCX0KK30KKworc3RhdGljIHZvaWQgYm9uZF9hZGRfdmxhbnNfb25fc2xhdmUoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXYpCit7CisJc3RydWN0IHZsYW5fZW50cnkgKnZsYW47CisKKwl3cml0ZV9sb2NrX2JoKCZib25kLT5sb2NrKTsKKworCWlmIChsaXN0X2VtcHR5KCZib25kLT52bGFuX2xpc3QpKSB7CisJCWdvdG8gb3V0OworCX0KKworCWlmICgoc2xhdmVfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9SWCkgJiYKKwkgICAgc2xhdmVfZGV2LT52bGFuX3J4X3JlZ2lzdGVyKSB7CisJCXNsYXZlX2Rldi0+dmxhbl9yeF9yZWdpc3RlcihzbGF2ZV9kZXYsIGJvbmQtPnZsZ3JwKTsKKwl9CisKKwlpZiAoIShzbGF2ZV9kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUikgfHwKKwkgICAgIShzbGF2ZV9kZXYtPnZsYW5fcnhfYWRkX3ZpZCkpIHsKKwkJZ290byBvdXQ7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2bGFuLCAmYm9uZC0+dmxhbl9saXN0LCB2bGFuX2xpc3QpIHsKKwkJc2xhdmVfZGV2LT52bGFuX3J4X2FkZF92aWQoc2xhdmVfZGV2LCB2bGFuLT52bGFuX2lkKTsKKwl9CisKK291dDoKKwl3cml0ZV91bmxvY2tfYmgoJmJvbmQtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBib25kX2RlbF92bGFuc19mcm9tX3NsYXZlKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2KQoreworCXN0cnVjdCB2bGFuX2VudHJ5ICp2bGFuOworCXN0cnVjdCBuZXRfZGV2aWNlICp2bGFuX2RldjsKKworCXdyaXRlX2xvY2tfYmgoJmJvbmQtPmxvY2spOworCisJaWYgKGxpc3RfZW1wdHkoJmJvbmQtPnZsYW5fbGlzdCkpIHsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCEoc2xhdmVfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9GSUxURVIpIHx8CisJICAgICEoc2xhdmVfZGV2LT52bGFuX3J4X2tpbGxfdmlkKSkgeworCQlnb3RvIHVucmVnOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkodmxhbiwgJmJvbmQtPnZsYW5fbGlzdCwgdmxhbl9saXN0KSB7CisJCS8qIFNhdmUgYW5kIHRoZW4gcmVzdG9yZSB2bGFuX2RldiBpbiB0aGUgZ3JwIGFycmF5LAorCQkgKiBzaW5jZSB0aGUgc2xhdmUncyBkcml2ZXIgbWlnaHQgY2xlYXIgaXQuCisJCSAqLworCQl2bGFuX2RldiA9IGJvbmQtPnZsZ3JwLT52bGFuX2RldmljZXNbdmxhbi0+dmxhbl9pZF07CisJCXNsYXZlX2Rldi0+dmxhbl9yeF9raWxsX3ZpZChzbGF2ZV9kZXYsIHZsYW4tPnZsYW5faWQpOworCQlib25kLT52bGdycC0+dmxhbl9kZXZpY2VzW3ZsYW4tPnZsYW5faWRdID0gdmxhbl9kZXY7CisJfQorCit1bnJlZzoKKwlpZiAoKHNsYXZlX2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fUlgpICYmCisJICAgIHNsYXZlX2Rldi0+dmxhbl9yeF9yZWdpc3RlcikgeworCQlzbGF2ZV9kZXYtPnZsYW5fcnhfcmVnaXN0ZXIoc2xhdmVfZGV2LCBOVUxMKTsKKwl9CisKK291dDoKKwl3cml0ZV91bmxvY2tfYmgoJmJvbmQtPmxvY2spOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTGluayBzdGF0dXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBHZXQgbGluayBzcGVlZCBhbmQgZHVwbGV4IGZyb20gdGhlIHNsYXZlJ3MgYmFzZSBkcml2ZXIKKyAqIHVzaW5nIGV0aHRvb2wuIElmIGZvciBzb21lIHJlYXNvbiB0aGUgY2FsbCBmYWlscyBvciB0aGUKKyAqIHZhbHVlcyBhcmUgaW52YWxpZCwgZmFrZSBzcGVlZCBhbmQgZHVwbGV4IHRvIDEwMC9GdWxsCisgKiBhbmQgcmV0dXJuIGVycm9yLgorICovCitzdGF0aWMgaW50IGJvbmRfdXBkYXRlX3NwZWVkX2R1cGxleChzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXYgPSBzbGF2ZS0+ZGV2OworCXN0YXRpYyBpbnQgKCogaW9jdGwpKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBpZnJlcSAqLCBpbnQpOworCXN0cnVjdCBpZnJlcSBpZnI7CisJc3RydWN0IGV0aHRvb2xfY21kIGV0b29sOworCisJLyogRmFrZSBzcGVlZCBhbmQgZHVwbGV4ICovCisJc2xhdmUtPnNwZWVkID0gU1BFRURfMTAwOworCXNsYXZlLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKworCWlmIChzbGF2ZV9kZXYtPmV0aHRvb2xfb3BzKSB7CisJCXUzMiByZXM7CisKKwkJaWYgKCFzbGF2ZV9kZXYtPmV0aHRvb2xfb3BzLT5nZXRfc2V0dGluZ3MpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXJlcyA9IHNsYXZlX2Rldi0+ZXRodG9vbF9vcHMtPmdldF9zZXR0aW5ncyhzbGF2ZV9kZXYsICZldG9vbCk7CisJCWlmIChyZXMgPCAwKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlnb3RvIHZlcmlmeTsKKwl9CisKKwlpb2N0bCA9IHNsYXZlX2Rldi0+ZG9faW9jdGw7CisJc3RybmNweShpZnIuaWZyX25hbWUsIHNsYXZlX2Rldi0+bmFtZSwgSUZOQU1TSVopOworCWV0b29sLmNtZCA9IEVUSFRPT0xfR1NFVDsKKwlpZnIuaWZyX2RhdGEgPSAoY2hhciopJmV0b29sOworCWlmICghaW9jdGwgfHwgKElPQ1RMKHNsYXZlX2RldiwgJmlmciwgU0lPQ0VUSFRPT0wpIDwgMCkpIHsKKwkJcmV0dXJuIC0xOworCX0KKwordmVyaWZ5OgorCXN3aXRjaCAoZXRvb2wuc3BlZWQpIHsKKwljYXNlIFNQRUVEXzEwOgorCWNhc2UgU1BFRURfMTAwOgorCWNhc2UgU1BFRURfMTAwMDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKworCXN3aXRjaCAoZXRvb2wuZHVwbGV4KSB7CisJY2FzZSBEVVBMRVhfRlVMTDoKKwljYXNlIERVUExFWF9IQUxGOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorCisJc2xhdmUtPnNwZWVkID0gZXRvb2wuc3BlZWQ7CisJc2xhdmUtPmR1cGxleCA9IGV0b29sLmR1cGxleDsKKworCXJldHVybiAwOworfQorCisvKgorICogaWYgPGRldj4gc3VwcG9ydHMgTUlJIGxpbmsgc3RhdHVzIHJlcG9ydGluZywgY2hlY2sgaXRzIGxpbmsgc3RhdHVzLgorICoKKyAqIFdlIGVpdGhlciBkbyBNSUkvRVRIVE9PTCBpb2N0bHMsIG9yIGNoZWNrIG5ldGlmX2NhcnJpZXJfb2soKSwKKyAqIGRlcGVuaW5nIHVwb24gdGhlIHNldHRpbmcgb2YgdGhlIHVzZV9jYXJyaWVyIHBhcmFtZXRlci4KKyAqCisgKiBSZXR1cm4gZWl0aGVyIEJNU1JfTFNUQVRVUywgbWVhbmluZyB0aGF0IHRoZSBsaW5rIGlzIHVwIChvciB3ZQorICogY2FuJ3QgdGVsbCBhbmQganVzdCBwcmV0ZW5kIGl0IGlzKSwgb3IgMCwgbWVhbmluZyB0aGF0IHRoZSBsaW5rIGlzCisgKiBkb3duLgorICoKKyAqIElmIHJlcG9ydGluZyBpcyBub24temVybywgaW5zdGVhZCBvZiBmYWtpbmcgbGluayB1cCwgcmV0dXJuIC0xIGlmCisgKiBib3RoIEVUSFRPT0wgYW5kIE1JSSBpb2N0bHMgZmFpbCAobWVhbmluZyB0aGUgZGV2aWNlIGRvZXMgbm90CisgKiBzdXBwb3J0IHRoZW0pLiAgSWYgdXNlX2NhcnJpZXIgaXMgc2V0LCByZXR1cm4gd2hhdGV2ZXIgaXQgc2F5cy4KKyAqIEl0J2QgYmUgbmljZSBpZiB0aGVyZSB3YXMgYSBnb29kIHdheSB0byB0ZWxsIGlmIGEgZHJpdmVyIHN1cHBvcnRzCisgKiBuZXRpZl9jYXJyaWVyLCBidXQgdGhlcmUgcmVhbGx5IGlzbid0LgorICovCitzdGF0aWMgaW50IGJvbmRfY2hlY2tfZGV2X2xpbmsoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXYsIGludCByZXBvcnRpbmcpCit7CisJc3RhdGljIGludCAoKiBpb2N0bCkoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGlmcmVxICosIGludCk7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKm1paTsKKwlzdHJ1Y3QgZXRodG9vbF92YWx1ZSBldG9vbDsKKworCWlmIChib25kLT5wYXJhbXMudXNlX2NhcnJpZXIpIHsKKwkJcmV0dXJuIG5ldGlmX2NhcnJpZXJfb2soc2xhdmVfZGV2KSA/IEJNU1JfTFNUQVRVUyA6IDA7CisJfQorCisJaW9jdGwgPSBzbGF2ZV9kZXYtPmRvX2lvY3RsOworCWlmIChpb2N0bCkgeworCQkvKiBUT0RPOiBzZXQgcG9pbnRlciB0byBjb3JyZWN0IGlvY3RsIG9uIGEgcGVyIHRlYW0gbWVtYmVyICovCisJCS8qICAgICAgIGJhc2VzIHRvIG1ha2UgdGhpcyBtb3JlIGVmZmljaWVudC4gdGhhdCBpcywgb25jZSAgKi8KKwkJLyogICAgICAgd2UgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IGlvY3RsLCB3ZSB3aWxsIGFsd2F5cyAgICAqLworCQkvKiAgICAgICBjYWxsIGl0IGFuZCBub3QgdGhlIG90aGVycyBmb3IgdGhhdCB0ZWFtICAgICAgICAgICovCisJCS8qICAgICAgIG1lbWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCQkvKgorCQkgKiBXZSBjYW5ub3QgYXNzdW1lIHRoYXQgU0lPQ0dNSUlQSFkgd2lsbCBhbHNvIHJlYWQgYQorCQkgKiByZWdpc3Rlcjsgbm90IGFsbCBuZXR3b3JrIGRyaXZlcnMgKGUuZy4sIGUxMDApCisJCSAqIHN1cHBvcnQgdGhhdC4KKwkJICovCisKKwkJLyogWWVzLCB0aGUgbWlpIGlzIG92ZXJsYWlkIG9uIHRoZSBpZnJlcS5pZnJfaWZydSAqLworCQlzdHJuY3B5KGlmci5pZnJfbmFtZSwgc2xhdmVfZGV2LT5uYW1lLCBJRk5BTVNJWik7CisJCW1paSA9IGlmX21paSgmaWZyKTsKKwkJaWYgKElPQ1RMKHNsYXZlX2RldiwgJmlmciwgU0lPQ0dNSUlQSFkpID09IDApIHsKKwkJCW1paS0+cmVnX251bSA9IE1JSV9CTVNSOworCQkJaWYgKElPQ1RMKHNsYXZlX2RldiwgJmlmciwgU0lPQ0dNSUlSRUcpID09IDApIHsKKwkJCQlyZXR1cm4gKG1paS0+dmFsX291dCAmIEJNU1JfTFNUQVRVUyk7CisJCQl9CisJCX0KKwl9CisKKwkvKiB0cnkgU0lPQ0VUSFRPT0wgaW9jdGwsIHNvbWUgZHJpdmVycyBjYWNoZSBFVEhUT09MX0dMSU5LICovCisJLyogZm9yIGEgcGVyaW9kIG9mIHRpbWUgc28gd2UgYXR0ZW1wdCB0byBnZXQgbGluayBzdGF0dXMgICAqLworCS8qIGZyb20gaXQgbGFzdCBpZiB0aGUgYWJvdmUgTUlJIGlvY3RscyBmYWlsLi4uICAgICAgICAgICAgKi8KKwlpZiAoc2xhdmVfZGV2LT5ldGh0b29sX29wcykgeworCQlpZiAoc2xhdmVfZGV2LT5ldGh0b29sX29wcy0+Z2V0X2xpbmspIHsKKwkJCXUzMiBsaW5rOworCisJCQlsaW5rID0gc2xhdmVfZGV2LT5ldGh0b29sX29wcy0+Z2V0X2xpbmsoc2xhdmVfZGV2KTsKKworCQkJcmV0dXJuIGxpbmsgPyBCTVNSX0xTVEFUVVMgOiAwOworCQl9CisJfQorCisJaWYgKGlvY3RsKSB7CisJCXN0cm5jcHkoaWZyLmlmcl9uYW1lLCBzbGF2ZV9kZXYtPm5hbWUsIElGTkFNU0laKTsKKwkJZXRvb2wuY21kID0gRVRIVE9PTF9HTElOSzsKKwkJaWZyLmlmcl9kYXRhID0gKGNoYXIqKSZldG9vbDsKKwkJaWYgKElPQ1RMKHNsYXZlX2RldiwgJmlmciwgU0lPQ0VUSFRPT0wpID09IDApIHsKKwkJCWlmIChldG9vbC5kYXRhID09IDEpIHsKKwkJCQlyZXR1cm4gQk1TUl9MU1RBVFVTOworCQkJfSBlbHNlIHsKKwkJCQlkcHJpbnRrKCJTSU9DRVRIVE9PTCBzaG93cyBsaW5rIGRvd25cbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBJZiByZXBvcnRpbmcsIHJlcG9ydCB0aGF0IGVpdGhlciB0aGVyZSdzIG5vIGRldi0+ZG9faW9jdGwsCisJICogb3IgYm90aCBTSU9DR01JSVJFRyBhbmQgU0lPQ0VUSFRPT0wgZmFpbGVkIChtZWFuaW5nIHRoYXQgd2UKKwkgKiBjYW5ub3QgcmVwb3J0IGxpbmsgc3RhdHVzKS4gIElmIG5vdCByZXBvcnRpbmcsIHByZXRlbmQKKwkgKiB3ZSdyZSBvay4KKwkgKi8KKwlyZXR1cm4gKHJlcG9ydGluZyA/IC0xIDogQk1TUl9MU1RBVFVTKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNdWx0aWNhc3QgbGlzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogUmV0dXJucyAwIGlmIGRtaTEgYW5kIGRtaTIgYXJlIHRoZSBzYW1lLCBub24tMCBvdGhlcndpc2UKKyAqLworc3RhdGljIGlubGluZSBpbnQgYm9uZF9pc19kbWlfc2FtZShzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaTEsIHN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pMikKK3sKKwlyZXR1cm4gbWVtY21wKGRtaTEtPmRtaV9hZGRyLCBkbWkyLT5kbWlfYWRkciwgZG1pMS0+ZG1pX2FkZHJsZW4pID09IDAgJiYKKwkJCWRtaTEtPmRtaV9hZGRybGVuID09IGRtaTItPmRtaV9hZGRybGVuOworfQorCisvKgorICogcmV0dXJucyBkbWkgZW50cnkgaWYgZm91bmQsIE5VTEwgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2X21jX2xpc3QgKmJvbmRfbWNfbGlzdF9maW5kX2RtaShzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSwgc3RydWN0IGRldl9tY19saXN0ICptY19saXN0KQoreworCXN0cnVjdCBkZXZfbWNfbGlzdCAqaWRtaTsKKworCWZvciAoaWRtaSA9IG1jX2xpc3Q7IGlkbWk7IGlkbWkgPSBpZG1pLT5uZXh0KSB7CisJCWlmIChib25kX2lzX2RtaV9zYW1lKGRtaSwgaWRtaSkpIHsKKwkJCXJldHVybiBpZG1pOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBQdXNoIHRoZSBwcm9taXNjdWl0eSBmbGFnIGRvd24gdG8gYXBwcm9wcmlhdGUgc2xhdmVzCisgKi8KK3N0YXRpYyB2b2lkIGJvbmRfc2V0X3Byb21pc2N1aXR5KHN0cnVjdCBib25kaW5nICpib25kLCBpbnQgaW5jKQoreworCWlmIChVU0VTX1BSSU1BUlkoYm9uZC0+cGFyYW1zLm1vZGUpKSB7CisJCS8qIHdyaXRlIGxvY2sgYWxyZWFkeSBhY3F1aXJlZCAqLworCQlpZiAoYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUpIHsKKwkJCWRldl9zZXRfcHJvbWlzY3VpdHkoYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUtPmRldiwgaW5jKTsKKwkJfQorCX0gZWxzZSB7CisJCXN0cnVjdCBzbGF2ZSAqc2xhdmU7CisJCWludCBpOworCQlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7CisJCQlkZXZfc2V0X3Byb21pc2N1aXR5KHNsYXZlLT5kZXYsIGluYyk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBQdXNoIHRoZSBhbGxtdWx0aSBmbGFnIGRvd24gdG8gYWxsIHNsYXZlcworICovCitzdGF0aWMgdm9pZCBib25kX3NldF9hbGxtdWx0aShzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgaW50IGluYykKK3sKKwlpZiAoVVNFU19QUklNQVJZKGJvbmQtPnBhcmFtcy5tb2RlKSkgeworCQkvKiB3cml0ZSBsb2NrIGFscmVhZHkgYWNxdWlyZWQgKi8KKwkJaWYgKGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKSB7CisJCQlkZXZfc2V0X2FsbG11bHRpKGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlLT5kZXYsIGluYyk7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3Qgc2xhdmUgKnNsYXZlOworCQlpbnQgaTsKKwkJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgeworCQkJZGV2X3NldF9hbGxtdWx0aShzbGF2ZS0+ZGV2LCBpbmMpOworCQl9CisJfQorfQorCisvKgorICogQWRkIGEgTXVsdGljYXN0IGFkZHJlc3MgdG8gc2xhdmVzCisgKiBhY2NvcmRpbmcgdG8gbW9kZQorICovCitzdGF0aWMgdm9pZCBib25kX21jX2FkZChzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgdm9pZCAqYWRkciwgaW50IGFsZW4pCit7CisJaWYgKFVTRVNfUFJJTUFSWShib25kLT5wYXJhbXMubW9kZSkpIHsKKwkJLyogd3JpdGUgbG9jayBhbHJlYWR5IGFjcXVpcmVkICovCisJCWlmIChib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSkgeworCQkJZGV2X21jX2FkZChib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZS0+ZGV2LCBhZGRyLCBhbGVuLCAwKTsKKwkJfQorCX0gZWxzZSB7CisJCXN0cnVjdCBzbGF2ZSAqc2xhdmU7CisJCWludCBpOworCQlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7CisJCQlkZXZfbWNfYWRkKHNsYXZlLT5kZXYsIGFkZHIsIGFsZW4sIDApOworCQl9CisJfQorfQorCisvKgorICogUmVtb3ZlIGEgbXVsdGljYXN0IGFkZHJlc3MgZnJvbSBzbGF2ZQorICogYWNjb3JkaW5nIHRvIG1vZGUKKyAqLworc3RhdGljIHZvaWQgYm9uZF9tY19kZWxldGUoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHZvaWQgKmFkZHIsIGludCBhbGVuKQoreworCWlmIChVU0VTX1BSSU1BUlkoYm9uZC0+cGFyYW1zLm1vZGUpKSB7CisJCS8qIHdyaXRlIGxvY2sgYWxyZWFkeSBhY3F1aXJlZCAqLworCQlpZiAoYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUpIHsKKwkJCWRldl9tY19kZWxldGUoYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUtPmRldiwgYWRkciwgYWxlbiwgMCk7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3Qgc2xhdmUgKnNsYXZlOworCQlpbnQgaTsKKwkJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgeworCQkJZGV2X21jX2RlbGV0ZShzbGF2ZS0+ZGV2LCBhZGRyLCBhbGVuLCAwKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFRvdGFsbHkgZGVzdHJveXMgdGhlIG1jX2xpc3QgaW4gYm9uZAorICovCitzdGF0aWMgdm9pZCBib25kX21jX2xpc3RfZGVzdHJveShzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKK3sKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaTsKKworCWRtaSA9IGJvbmQtPm1jX2xpc3Q7CisJd2hpbGUgKGRtaSkgeworCQlib25kLT5tY19saXN0ID0gZG1pLT5uZXh0OworCQlrZnJlZShkbWkpOworCQlkbWkgPSBib25kLT5tY19saXN0OworCX0KK30KKworLyoKKyAqIENvcHkgYWxsIHRoZSBNdWx0aWNhc3QgYWRkcmVzc2VzIGZyb20gc3JjIHRvIHRoZSBib25kaW5nIGRldmljZSBkc3QKKyAqLworc3RhdGljIGludCBib25kX21jX2xpc3RfY29weShzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jX2xpc3QsIHN0cnVjdCBib25kaW5nICpib25kLCBpbnQgZ3BmX2ZsYWcpCit7CisJc3RydWN0IGRldl9tY19saXN0ICpkbWksICpuZXdfZG1pOworCisJZm9yIChkbWkgPSBtY19saXN0OyBkbWk7IGRtaSA9IGRtaS0+bmV4dCkgeworCQluZXdfZG1pID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRldl9tY19saXN0KSwgZ3BmX2ZsYWcpOworCisJCWlmICghbmV3X2RtaSkgeworCQkJLyogRklYTUU6IFBvdGVudGlhbCBtZW1vcnkgbGVhayAhISEgKi8KKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJbmV3X2RtaS0+bmV4dCA9IGJvbmQtPm1jX2xpc3Q7CisJCWJvbmQtPm1jX2xpc3QgPSBuZXdfZG1pOworCQluZXdfZG1pLT5kbWlfYWRkcmxlbiA9IGRtaS0+ZG1pX2FkZHJsZW47CisJCW1lbWNweShuZXdfZG1pLT5kbWlfYWRkciwgZG1pLT5kbWlfYWRkciwgZG1pLT5kbWlfYWRkcmxlbik7CisJCW5ld19kbWktPmRtaV91c2VycyA9IGRtaS0+ZG1pX3VzZXJzOworCQluZXdfZG1pLT5kbWlfZ3VzZXJzID0gZG1pLT5kbWlfZ3VzZXJzOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogZmx1c2ggYWxsIG1lbWJlcnMgb2YgZmx1c2gtPm1jX2xpc3QgZnJvbSBkZXZpY2UgZGV2LT5tY19saXN0CisgKi8KK3N0YXRpYyB2b2lkIGJvbmRfbWNfbGlzdF9mbHVzaChzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXYpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2Rldi0+cHJpdjsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaTsKKworCWZvciAoZG1pID0gYm9uZF9kZXYtPm1jX2xpc3Q7IGRtaTsgZG1pID0gZG1pLT5uZXh0KSB7CisJCWRldl9tY19kZWxldGUoc2xhdmVfZGV2LCBkbWktPmRtaV9hZGRyLCBkbWktPmRtaV9hZGRybGVuLCAwKTsKKwl9CisKKwlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFXzgwMjNBRCkgeworCQkvKiBkZWwgbGFjcGR1IG1jIGFkZHIgZnJvbSBtYyBsaXN0ICovCisJCXU4IGxhY3BkdV9tdWx0aWNhc3RbRVRIX0FMRU5dID0gTVVMVElDQVNUX0xBQ1BEVV9BRERSOworCisJCWRldl9tY19kZWxldGUoc2xhdmVfZGV2LCBsYWNwZHVfbXVsdGljYXN0LCBFVEhfQUxFTiwgMCk7CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBY3RpdmUgc2xhdmUgY2hhbmdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBVcGRhdGUgdGhlIG1jIGxpc3QgYW5kIG11bHRpY2FzdC1yZWxhdGVkIGZsYWdzIGZvciB0aGUgbmV3IGFuZAorICogb2xkIGFjdGl2ZSBzbGF2ZXMgKGlmIGFueSkgYWNjb3JkaW5nIHRvIHRoZSBtdWx0aWNhc3QgbW9kZSwgYW5kCisgKiBwcm9taXNjdW91cyBmbGFncyB1bmNvbmRpdGlvbmFsbHkuCisgKi8KK3N0YXRpYyB2b2lkIGJvbmRfbWNfc3dhcChzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHNsYXZlICpuZXdfYWN0aXZlLCBzdHJ1Y3Qgc2xhdmUgKm9sZF9hY3RpdmUpCit7CisJc3RydWN0IGRldl9tY19saXN0ICpkbWk7CisKKwlpZiAoIVVTRVNfUFJJTUFSWShib25kLT5wYXJhbXMubW9kZSkpIHsKKwkJLyogbm90aGluZyB0byBkbyAtICBtYyBsaXN0IGlzIGFscmVhZHkgdXAtdG8tZGF0ZSBvbgorCQkgKiBhbGwgc2xhdmVzCisJCSAqLworCQlyZXR1cm47CisJfQorCisJaWYgKG9sZF9hY3RpdmUpIHsKKwkJaWYgKGJvbmQtPmRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQkJZGV2X3NldF9wcm9taXNjdWl0eShvbGRfYWN0aXZlLT5kZXYsIC0xKTsKKwkJfQorCisJCWlmIChib25kLT5kZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCQlkZXZfc2V0X2FsbG11bHRpKG9sZF9hY3RpdmUtPmRldiwgLTEpOworCQl9CisKKwkJZm9yIChkbWkgPSBib25kLT5kZXYtPm1jX2xpc3Q7IGRtaTsgZG1pID0gZG1pLT5uZXh0KSB7CisJCQlkZXZfbWNfZGVsZXRlKG9sZF9hY3RpdmUtPmRldiwgZG1pLT5kbWlfYWRkciwgZG1pLT5kbWlfYWRkcmxlbiwgMCk7CisJCX0KKwl9CisKKwlpZiAobmV3X2FjdGl2ZSkgeworCQlpZiAoYm9uZC0+ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCQlkZXZfc2V0X3Byb21pc2N1aXR5KG5ld19hY3RpdmUtPmRldiwgMSk7CisJCX0KKworCQlpZiAoYm9uZC0+ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQkJZGV2X3NldF9hbGxtdWx0aShuZXdfYWN0aXZlLT5kZXYsIDEpOworCQl9CisKKwkJZm9yIChkbWkgPSBib25kLT5kZXYtPm1jX2xpc3Q7IGRtaTsgZG1pID0gZG1pLT5uZXh0KSB7CisJCQlkZXZfbWNfYWRkKG5ld19hY3RpdmUtPmRldiwgZG1pLT5kbWlfYWRkciwgZG1pLT5kbWlfYWRkcmxlbiwgMCk7CisJCX0KKwl9Cit9CisKKy8qKgorICogZmluZF9iZXN0X2ludGVyZmFjZSAtIHNlbGVjdCB0aGUgYmVzdCBhdmFpbGFibGUgc2xhdmUgdG8gYmUgdGhlIGFjdGl2ZSBvbmUKKyAqIEBib25kOiBvdXIgYm9uZGluZyBzdHJ1Y3QKKyAqCisgKiBXYXJuaW5nOiBDYWxsZXIgbXVzdCBob2xkIGN1cnJfc2xhdmVfbG9jayBmb3Igd3JpdGluZy4KKyAqLworc3RhdGljIHN0cnVjdCBzbGF2ZSAqYm9uZF9maW5kX2Jlc3Rfc2xhdmUoc3RydWN0IGJvbmRpbmcgKmJvbmQpCit7CisJc3RydWN0IHNsYXZlICpuZXdfYWN0aXZlLCAqb2xkX2FjdGl2ZTsKKwlzdHJ1Y3Qgc2xhdmUgKmJlc3RzbGF2ZSA9IE5VTEw7CisJaW50IG1pbnRpbWUgPSBib25kLT5wYXJhbXMudXBkZWxheTsKKwlpbnQgaTsKKworCW5ld19hY3RpdmUgPSBvbGRfYWN0aXZlID0gYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmU7CisKKwlpZiAoIW5ld19hY3RpdmUpIHsgLyogdGhlcmUgd2VyZSBubyBhY3RpdmUgc2xhdmVzIGxlZnQgKi8KKwkJaWYgKGJvbmQtPnNsYXZlX2NudCA+IDApIHsgIC8qIGZvdW5kIG9uZSBzbGF2ZSAqLworCQkJbmV3X2FjdGl2ZSA9IGJvbmQtPmZpcnN0X3NsYXZlOworCQl9IGVsc2UgeworCQkJcmV0dXJuIE5VTEw7IC8qIHN0aWxsIG5vIHNsYXZlLCByZXR1cm4gTlVMTCAqLworCQl9CisJfQorCisJLyogZmlyc3QgdHJ5IHRoZSBwcmltYXJ5IGxpbms7IGlmIGFycGluZywgYSBsaW5rIG11c3QgdHgvcnggdHJhZmZpYworCSAqIGJlZm9yZSBpdCBjYW4gYmUgY29uc2lkZXJlZCB0aGUgY3Vycl9hY3RpdmVfc2xhdmUgLSBhbHNvLCB3ZSB3b3VsZCBza2lwCisJICogc2xhdmVzIGJldHdlZW4gdGhlIGN1cnJfYWN0aXZlX3NsYXZlIGFuZCBwcmltYXJ5X3NsYXZlIHRoYXQgbWF5IGJlIHVwCisJICogYW5kIGFibGUgdG8gYXJwCisJICovCisJaWYgKChib25kLT5wcmltYXJ5X3NsYXZlKSAmJgorCSAgICAoIWJvbmQtPnBhcmFtcy5hcnBfaW50ZXJ2YWwpICYmCisJICAgIChJU19VUChib25kLT5wcmltYXJ5X3NsYXZlLT5kZXYpKSkgeworCQluZXdfYWN0aXZlID0gYm9uZC0+cHJpbWFyeV9zbGF2ZTsKKwl9CisKKwkvKiByZW1lbWJlciB3aGVyZSB0byBzdG9wIGl0ZXJhdGluZyBvdmVyIHRoZSBzbGF2ZXMgKi8KKwlvbGRfYWN0aXZlID0gbmV3X2FjdGl2ZTsKKworCWJvbmRfZm9yX2VhY2hfc2xhdmVfZnJvbShib25kLCBuZXdfYWN0aXZlLCBpLCBvbGRfYWN0aXZlKSB7CisJCWlmIChJU19VUChuZXdfYWN0aXZlLT5kZXYpKSB7CisJCQlpZiAobmV3X2FjdGl2ZS0+bGluayA9PSBCT05EX0xJTktfVVApIHsKKwkJCQlyZXR1cm4gbmV3X2FjdGl2ZTsKKwkJCX0gZWxzZSBpZiAobmV3X2FjdGl2ZS0+bGluayA9PSBCT05EX0xJTktfQkFDSykgeworCQkJCS8qIGxpbmsgdXAsIGJ1dCB3YWl0aW5nIGZvciBzdGFiaWxpemF0aW9uICovCisJCQkJaWYgKG5ld19hY3RpdmUtPmRlbGF5IDwgbWludGltZSkgeworCQkJCQltaW50aW1lID0gbmV3X2FjdGl2ZS0+ZGVsYXk7CisJCQkJCWJlc3RzbGF2ZSA9IG5ld19hY3RpdmU7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGJlc3RzbGF2ZTsKK30KKworLyoqCisgKiBjaGFuZ2VfYWN0aXZlX2ludGVyZmFjZSAtIGNoYW5nZSB0aGUgYWN0aXZlIHNsYXZlIGludG8gdGhlIHNwZWNpZmllZCBvbmUKKyAqIEBib25kOiBvdXIgYm9uZGluZyBzdHJ1Y3QKKyAqIEBuZXc6IHRoZSBuZXcgc2xhdmUgdG8gbWFrZSB0aGUgYWN0aXZlIG9uZQorICoKKyAqIFNldCB0aGUgbmV3IHNsYXZlIHRvIHRoZSBib25kJ3Mgc2V0dGluZ3MgYW5kIHVuc2V0IHRoZW0gb24gdGhlIG9sZAorICogY3Vycl9hY3RpdmVfc2xhdmUuCisgKiBTZXR0aW5nIGluY2x1ZGUgZmxhZ3MsIG1jLWxpc3QsIHByb21pc2N1aXR5LCBhbGxtdWx0aSwgZXRjLgorICoKKyAqIElmIEBuZXcncyBsaW5rIHN0YXRlIGlzICVCT05EX0xJTktfQkFDSyB3ZSdsbCBzZXQgaXQgdG8gJUJPTkRfTElOS19VUCwKKyAqIGJlY2F1c2UgaXQgaXMgYXBwYXJlbnRseSB0aGUgYmVzdCBhdmFpbGFibGUgc2xhdmUgd2UgaGF2ZSwgZXZlbiB0aG91Z2ggaXRzCisgKiB1cGRlbGF5IGhhc24ndCB0aW1lZCBvdXQgeWV0LgorICoKKyAqIFdhcm5pbmc6IENhbGxlciBtdXN0IGhvbGQgY3Vycl9zbGF2ZV9sb2NrIGZvciB3cml0aW5nLgorICovCitzdGF0aWMgdm9pZCBib25kX2NoYW5nZV9hY3RpdmVfc2xhdmUoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHN0cnVjdCBzbGF2ZSAqbmV3X2FjdGl2ZSkKK3sKKwlzdHJ1Y3Qgc2xhdmUgKm9sZF9hY3RpdmUgPSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZTsKKworCWlmIChvbGRfYWN0aXZlID09IG5ld19hY3RpdmUpIHsKKwkJcmV0dXJuOworCX0KKworCWlmIChuZXdfYWN0aXZlKSB7CisJCWlmIChuZXdfYWN0aXZlLT5saW5rID09IEJPTkRfTElOS19CQUNLKSB7CisJCQlpZiAoVVNFU19QUklNQVJZKGJvbmQtPnBhcmFtcy5tb2RlKSkgeworCQkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJCQkgICAgICAgIjogJXM6IG1ha2luZyBpbnRlcmZhY2UgJXMgdGhlIG5ldyAiCisJCQkJICAgICAgICJhY3RpdmUgb25lICVkIG1zIGVhcmxpZXIuXG4iLAorCQkJCSAgICAgICBib25kLT5kZXYtPm5hbWUsIG5ld19hY3RpdmUtPmRldi0+bmFtZSwKKwkJCQkgICAgICAgKGJvbmQtPnBhcmFtcy51cGRlbGF5IC0gbmV3X2FjdGl2ZS0+ZGVsYXkpICogYm9uZC0+cGFyYW1zLm1paW1vbik7CisJCQl9CisKKwkJCW5ld19hY3RpdmUtPmRlbGF5ID0gMDsKKwkJCW5ld19hY3RpdmUtPmxpbmsgPSBCT05EX0xJTktfVVA7CisJCQluZXdfYWN0aXZlLT5qaWZmaWVzID0gamlmZmllczsKKworCQkJaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpIHsKKwkJCQlib25kXzNhZF9oYW5kbGVfbGlua19jaGFuZ2UobmV3X2FjdGl2ZSwgQk9ORF9MSU5LX1VQKTsKKwkJCX0KKworCQkJaWYgKChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfVExCKSB8fAorCQkJICAgIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUxCKSkgeworCQkJCWJvbmRfYWxiX2hhbmRsZV9saW5rX2NoYW5nZShib25kLCBuZXdfYWN0aXZlLCBCT05EX0xJTktfVVApOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKFVTRVNfUFJJTUFSWShib25kLT5wYXJhbXMubW9kZSkpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCQkJICAgICAgICI6ICVzOiBtYWtpbmcgaW50ZXJmYWNlICVzIHRoZSBuZXcgIgorCQkJCSAgICAgICAiYWN0aXZlIG9uZS5cbiIsCisJCQkJICAgICAgIGJvbmQtPmRldi0+bmFtZSwgbmV3X2FjdGl2ZS0+ZGV2LT5uYW1lKTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUNUSVZFQkFDS1VQKSB7CisJCWlmIChvbGRfYWN0aXZlKSB7CisJCQlib25kX3NldF9zbGF2ZV9pbmFjdGl2ZV9mbGFncyhvbGRfYWN0aXZlKTsKKwkJfQorCisJCWlmIChuZXdfYWN0aXZlKSB7CisJCQlib25kX3NldF9zbGF2ZV9hY3RpdmVfZmxhZ3MobmV3X2FjdGl2ZSk7CisJCX0KKwl9CisKKwlpZiAoVVNFU19QUklNQVJZKGJvbmQtPnBhcmFtcy5tb2RlKSkgeworCQlib25kX21jX3N3YXAoYm9uZCwgbmV3X2FjdGl2ZSwgb2xkX2FjdGl2ZSk7CisJfQorCisJaWYgKChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfVExCKSB8fAorCSAgICAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX0FMQikpIHsKKwkJYm9uZF9hbGJfaGFuZGxlX2FjdGl2ZV9jaGFuZ2UoYm9uZCwgbmV3X2FjdGl2ZSk7CisJfSBlbHNlIHsKKwkJYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUgPSBuZXdfYWN0aXZlOworCX0KK30KKworLyoqCisgKiBib25kX3NlbGVjdF9hY3RpdmVfc2xhdmUgLSBzZWxlY3QgYSBuZXcgYWN0aXZlIHNsYXZlLCBpZiBuZWVkZWQKKyAqIEBib25kOiBvdXIgYm9uZGluZyBzdHJ1Y3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9ucyBzaG91ZCBiZSBjYWxsZWQgd2hlbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBvY2N1cnM6CisgKiAtIFRoZSBvbGQgY3Vycl9hY3RpdmVfc2xhdmUgaGFzIGJlZW4gcmVsZWFzZWQgb3IgbG9zdCBpdHMgbGluay4KKyAqIC0gVGhlIHByaW1hcnlfc2xhdmUgaGFzIGdvdCBpdHMgbGluayBiYWNrLgorICogLSBBIHNsYXZlIGhhcyBnb3QgaXRzIGxpbmsgYmFjayBhbmQgdGhlcmUncyBubyBvbGQgY3Vycl9hY3RpdmVfc2xhdmUuCisgKgorICogV2FybmluZzogQ2FsbGVyIG11c3QgaG9sZCBjdXJyX3NsYXZlX2xvY2sgZm9yIHdyaXRpbmcuCisgKi8KK3N0YXRpYyB2b2lkIGJvbmRfc2VsZWN0X2FjdGl2ZV9zbGF2ZShzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKK3sKKwlzdHJ1Y3Qgc2xhdmUgKmJlc3Rfc2xhdmU7CisKKwliZXN0X3NsYXZlID0gYm9uZF9maW5kX2Jlc3Rfc2xhdmUoYm9uZCk7CisJaWYgKGJlc3Rfc2xhdmUgIT0gYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUpIHsKKwkJYm9uZF9jaGFuZ2VfYWN0aXZlX3NsYXZlKGJvbmQsIGJlc3Rfc2xhdmUpOworCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2xhdmUgbGlzdCBoYW5kbGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogVGhpcyBmdW5jdGlvbiBhdHRhY2hlcyB0aGUgc2xhdmUgdG8gdGhlIGVuZCBvZiBsaXN0LgorICoKKyAqIGJvbmQtPmxvY2sgaGVsZCBmb3Igd3JpdGluZyBieSBjYWxsZXIuCisgKi8KK3N0YXRpYyB2b2lkIGJvbmRfYXR0YWNoX3NsYXZlKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2xhdmUgKm5ld19zbGF2ZSkKK3sKKwlpZiAoYm9uZC0+Zmlyc3Rfc2xhdmUgPT0gTlVMTCkgeyAvKiBhdHRhY2hpbmcgdGhlIGZpcnN0IHNsYXZlICovCisJCW5ld19zbGF2ZS0+bmV4dCA9IG5ld19zbGF2ZTsKKwkJbmV3X3NsYXZlLT5wcmV2ID0gbmV3X3NsYXZlOworCQlib25kLT5maXJzdF9zbGF2ZSA9IG5ld19zbGF2ZTsKKwl9IGVsc2UgeworCQluZXdfc2xhdmUtPm5leHQgPSBib25kLT5maXJzdF9zbGF2ZTsKKwkJbmV3X3NsYXZlLT5wcmV2ID0gYm9uZC0+Zmlyc3Rfc2xhdmUtPnByZXY7CisJCW5ld19zbGF2ZS0+bmV4dC0+cHJldiA9IG5ld19zbGF2ZTsKKwkJbmV3X3NsYXZlLT5wcmV2LT5uZXh0ID0gbmV3X3NsYXZlOworCX0KKworCWJvbmQtPnNsYXZlX2NudCsrOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBkZXRhY2hlcyB0aGUgc2xhdmUgZnJvbSB0aGUgbGlzdC4KKyAqIFdBUk5JTkc6IG5vIGNoZWNrIGlzIG1hZGUgdG8gdmVyaWZ5IGlmIHRoZSBzbGF2ZSBlZmZlY3RpdmVseQorICogYmVsb25ncyB0byA8Ym9uZD4uCisgKiBOb3RoaW5nIGlzIGZyZWVkIG9uIHJldHVybiwgc3RydWN0dXJlcyBhcmUganVzdCB1bmNoYWluZWQuCisgKiBJZiBhbnkgc2xhdmUgcG9pbnRlciBpbiBib25kIHdhcyBwb2ludGluZyB0byA8c2xhdmU+LAorICogaXQgc2hvdWxkIGJlIGNoYW5nZWQgYnkgdGhlIGNhbGxpbmcgZnVuY3Rpb24uCisgKgorICogYm9uZC0+bG9jayBoZWxkIGZvciB3cml0aW5nIGJ5IGNhbGxlci4KKyAqLworc3RhdGljIHZvaWQgYm9uZF9kZXRhY2hfc2xhdmUoc3RydWN0IGJvbmRpbmcgKmJvbmQsIHN0cnVjdCBzbGF2ZSAqc2xhdmUpCit7CisJaWYgKHNsYXZlLT5uZXh0KSB7CisJCXNsYXZlLT5uZXh0LT5wcmV2ID0gc2xhdmUtPnByZXY7CisJfQorCisJaWYgKHNsYXZlLT5wcmV2KSB7CisJCXNsYXZlLT5wcmV2LT5uZXh0ID0gc2xhdmUtPm5leHQ7CisJfQorCisJaWYgKGJvbmQtPmZpcnN0X3NsYXZlID09IHNsYXZlKSB7IC8qIHNsYXZlIGlzIHRoZSBmaXJzdCBzbGF2ZSAqLworCQlpZiAoYm9uZC0+c2xhdmVfY250ID4gMSkgeyAvKiB0aGVyZSBhcmUgbW9yZSBzbGF2ZSAqLworCQkJYm9uZC0+Zmlyc3Rfc2xhdmUgPSBzbGF2ZS0+bmV4dDsKKwkJfSBlbHNlIHsKKwkJCWJvbmQtPmZpcnN0X3NsYXZlID0gTlVMTDsgLyogc2xhdmUgd2FzIHRoZSBsYXN0IG9uZSAqLworCQl9CisJfQorCisJc2xhdmUtPm5leHQgPSBOVUxMOworCXNsYXZlLT5wcmV2ID0gTlVMTDsKKwlib25kLT5zbGF2ZV9jbnQtLTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElPQ1RMIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IGJvbmRfc2V0aHdhZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2Rldiwgc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldikKK3sKKwlkcHJpbnRrKCJib25kX2Rldj0lcFxuIiwgYm9uZF9kZXYpOworCWRwcmludGsoInNsYXZlX2Rldj0lcFxuIiwgc2xhdmVfZGV2KTsKKwlkcHJpbnRrKCJzbGF2ZV9kZXYtPmFkZHJfbGVuPSVkXG4iLCBzbGF2ZV9kZXYtPmFkZHJfbGVuKTsKKwltZW1jcHkoYm9uZF9kZXYtPmRldl9hZGRyLCBzbGF2ZV9kZXYtPmRldl9hZGRyLCBzbGF2ZV9kZXYtPmFkZHJfbGVuKTsKKwlyZXR1cm4gMDsKK30KKworLyogZW5zbGF2ZSBkZXZpY2UgPHNsYXZlPiB0byBib25kIGRldmljZSA8bWFzdGVyPiAqLworc3RhdGljIGludCBib25kX2Vuc2xhdmUoc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2KQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisJc3RydWN0IHNsYXZlICpuZXdfc2xhdmUgPSBOVUxMOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pOworCXN0cnVjdCBzb2NrYWRkciBhZGRyOworCWludCBsaW5rX3JlcG9ydGluZzsKKwlpbnQgb2xkX2ZlYXR1cmVzID0gYm9uZF9kZXYtPmZlYXR1cmVzOworCWludCByZXMgPSAwOworCisJaWYgKHNsYXZlX2Rldi0+ZG9faW9jdGwgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCSAgICAgICAiOiBXYXJuaW5nIDogbm8gbGluayBtb25pdG9yaW5nIHN1cHBvcnQgZm9yICVzXG4iLAorCQkgICAgICAgc2xhdmVfZGV2LT5uYW1lKTsKKwl9CisKKwkvKiBib25kIG11c3QgYmUgaW5pdGlhbGl6ZWQgYnkgYm9uZF9vcGVuKCkgYmVmb3JlIGVuc2xhdmluZyAqLworCWlmICghKGJvbmRfZGV2LT5mbGFncyAmIElGRl9VUCkpIHsKKwkJZHByaW50aygiRXJyb3IsIG1hc3Rlcl9kZXYgaXMgbm90IHVwXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwkvKiBhbHJlYWR5IGVuc2xhdmVkICovCisJaWYgKHNsYXZlX2Rldi0+ZmxhZ3MgJiBJRkZfU0xBVkUpIHsKKwkJZHByaW50aygiRXJyb3IsIERldmljZSB3YXMgYWxyZWFkeSBlbnNsYXZlZFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogdmxhbiBjaGFsbGVuZ2VkIG11dHVhbCBleGNsdXNpb24gKi8KKwkvKiBubyBuZWVkIHRvIGxvY2sgc2luY2Ugd2UncmUgcHJvdGVjdGVkIGJ5IHJ0bmxfbG9jayAqLworCWlmIChzbGF2ZV9kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9WTEFOX0NIQUxMRU5HRUQpIHsKKwkJZHByaW50aygiJXM6IE5FVElGX0ZfVkxBTl9DSEFMTEVOR0VEXG4iLCBzbGF2ZV9kZXYtPm5hbWUpOworCQlpZiAoIWxpc3RfZW1wdHkoJmJvbmQtPnZsYW5fbGlzdCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkJICAgICAgICI6IEVycm9yOiBjYW5ub3QgZW5zbGF2ZSBWTEFOICIKKwkJCSAgICAgICAiY2hhbGxlbmdlZCBzbGF2ZSAlcyBvbiBWTEFOIGVuYWJsZWQgIgorCQkJICAgICAgICJib25kICVzXG4iLCBzbGF2ZV9kZXYtPm5hbWUsCisJCQkgICAgICAgYm9uZF9kZXYtPm5hbWUpOworCQkJcmV0dXJuIC1FUEVSTTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJCSAgICAgICAiOiBXYXJuaW5nOiBlbnNsYXZlZCBWTEFOIGNoYWxsZW5nZWQgIgorCQkJICAgICAgICJzbGF2ZSAlcy4gQWRkaW5nIFZMQU5zIHdpbGwgYmUgYmxvY2tlZCBhcyAiCisJCQkgICAgICAgImxvbmcgYXMgJXMgaXMgcGFydCBvZiBib25kICVzXG4iLAorCQkJICAgICAgIHNsYXZlX2Rldi0+bmFtZSwgc2xhdmVfZGV2LT5uYW1lLAorCQkJICAgICAgIGJvbmRfZGV2LT5uYW1lKTsKKwkJCWJvbmRfZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1ZMQU5fQ0hBTExFTkdFRDsKKwkJfQorCX0gZWxzZSB7CisJCWRwcmludGsoIiVzOiAhIE5FVElGX0ZfVkxBTl9DSEFMTEVOR0VEXG4iLCBzbGF2ZV9kZXYtPm5hbWUpOworCQlpZiAoYm9uZC0+c2xhdmVfY250ID09IDApIHsKKwkJCS8qIEZpcnN0IHNsYXZlLCBhbmQgaXQgaXMgbm90IFZMQU4gY2hhbGxlbmdlZCwKKwkJCSAqIHNvIHJlbW92ZSB0aGUgYmxvY2sgb2YgYWRkaW5nIFZMQU5zIG92ZXIgdGhlIGJvbmQuCisJCQkgKi8KKwkJCWJvbmRfZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9WTEFOX0NIQUxMRU5HRUQ7CisJCX0KKwl9CisKKwlpZiAoYXBwX2FiaV92ZXIgPj0gMSkgeworCQkvKiBUaGUgYXBwbGljYXRpb24gaXMgdXNpbmcgYW4gQUJJLCB3aGljaCByZXF1aXJlcyB0aGUKKwkJICogc2xhdmUgaW50ZXJmYWNlIHRvIGJlIGNsb3NlZC4KKwkJICovCisJCWlmICgoc2xhdmVfZGV2LT5mbGFncyAmIElGRl9VUCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkJICAgICAgICI6IEVycm9yOiAlcyBpcyB1cFxuIiwKKwkJCSAgICAgICBzbGF2ZV9kZXYtPm5hbWUpOworCQkJcmVzID0gLUVQRVJNOworCQkJZ290byBlcnJfdW5kb19mbGFnczsKKwkJfQorCisJCWlmIChzbGF2ZV9kZXYtPnNldF9tYWNfYWRkcmVzcyA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKKwkJCSAgICAgICAiOiBFcnJvcjogVGhlIHNsYXZlIGRldmljZSB5b3Ugc3BlY2lmaWVkIGRvZXMgIgorCQkJICAgICAgICJub3Qgc3VwcG9ydCBzZXR0aW5nIHRoZSBNQUMgYWRkcmVzcy5cbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIllvdXIga2VybmVsIGxpa2VseSBkb2VzIG5vdCBzdXBwb3J0IHNsYXZlICIKKwkJCSAgICAgICAiZGV2aWNlcy5cbiIpOworCisJCQlyZXMgPSAtRU9QTk9UU1VQUDsKKwkJCWdvdG8gZXJyX3VuZG9fZmxhZ3M7CisJCX0KKwl9IGVsc2UgeworCQkvKiBUaGUgYXBwbGljYXRpb24gaXMgbm90IHVzaW5nIGFuIEFCSSwgd2hpY2ggcmVxdWlyZXMgdGhlCisJCSAqIHNsYXZlIGludGVyZmFjZSB0byBiZSBvcGVuLgorCQkgKi8KKwkJaWYgKCEoc2xhdmVfZGV2LT5mbGFncyAmIElGRl9VUCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkJICAgICAgICI6IEVycm9yOiAlcyBpcyBub3QgcnVubmluZ1xuIiwKKwkJCSAgICAgICBzbGF2ZV9kZXYtPm5hbWUpOworCQkJcmVzID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX3VuZG9fZmxhZ3M7CisJCX0KKworCQlpZiAoKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpIHx8CisJCSAgICAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX1RMQikgICAgfHwKKwkJICAgIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUxCKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCisJCQkgICAgICAgIjogRXJyb3I6IHRvIHVzZSAlcyBtb2RlLCB5b3UgbXVzdCB1cGdyYWRlICIKKwkJCSAgICAgICAiaWZlbnNsYXZlLlxuIiwKKwkJCSAgICAgICBib25kX21vZGVfbmFtZShib25kLT5wYXJhbXMubW9kZSkpOworCQkJcmVzID0gLUVPUE5PVFNVUFA7CisJCQlnb3RvIGVycl91bmRvX2ZsYWdzOworCQl9CisJfQorCisJbmV3X3NsYXZlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNsYXZlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdfc2xhdmUpIHsKKwkJcmVzID0gLUVOT01FTTsKKwkJZ290byBlcnJfdW5kb19mbGFnczsKKwl9CisKKwltZW1zZXQobmV3X3NsYXZlLCAwLCBzaXplb2Yoc3RydWN0IHNsYXZlKSk7CisKKwkvKiBzYXZlIHNsYXZlJ3Mgb3JpZ2luYWwgZmxhZ3MgYmVmb3JlIGNhbGxpbmcKKwkgKiBuZXRkZXZfc2V0X21hc3RlciBhbmQgZGV2X29wZW4KKwkgKi8KKwluZXdfc2xhdmUtPm9yaWdpbmFsX2ZsYWdzID0gc2xhdmVfZGV2LT5mbGFnczsKKworCWlmIChhcHBfYWJpX3ZlciA+PSAxKSB7CisJCS8qIHNhdmUgc2xhdmUncyBvcmlnaW5hbCAoInBlcm1hbmVudCIpIG1hYyBhZGRyZXNzIGZvcgorCQkgKiBtb2RlcyB0aGF0IG5lZWRzIGl0LCBhbmQgZm9yIHJlc3RvcmluZyBpdCB1cG9uIHJlbGVhc2UsCisJCSAqIGFuZCB0aGVuIHNldCBpdCB0byB0aGUgbWFzdGVyJ3MgYWRkcmVzcworCQkgKi8KKwkJbWVtY3B5KG5ld19zbGF2ZS0+cGVybV9od2FkZHIsIHNsYXZlX2Rldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKworCQkvKiBzZXQgc2xhdmUgdG8gbWFzdGVyJ3MgbWFjIGFkZHJlc3MKKwkJICogVGhlIGFwcGxpY2F0aW9uIGFscmVhZHkgc2V0IHRoZSBtYXN0ZXIncworCQkgKiBtYWMgYWRkcmVzcyB0byB0aGF0IG9mIHRoZSBmaXJzdCBzbGF2ZQorCQkgKi8KKwkJbWVtY3B5KGFkZHIuc2FfZGF0YSwgYm9uZF9kZXYtPmRldl9hZGRyLCBib25kX2Rldi0+YWRkcl9sZW4pOworCQlhZGRyLnNhX2ZhbWlseSA9IHNsYXZlX2Rldi0+dHlwZTsKKwkJcmVzID0gZGV2X3NldF9tYWNfYWRkcmVzcyhzbGF2ZV9kZXYsICZhZGRyKTsKKwkJaWYgKHJlcykgeworCQkJZHByaW50aygiRXJyb3IgJWQgY2FsbGluZyBzZXRfbWFjX2FkZHJlc3NcbiIsIHJlcyk7CisJCQlnb3RvIGVycl9mcmVlOworCQl9CisKKwkJLyogb3BlbiB0aGUgc2xhdmUgc2luY2UgdGhlIGFwcGxpY2F0aW9uIGNsb3NlZCBpdCAqLworCQlyZXMgPSBkZXZfb3BlbihzbGF2ZV9kZXYpOworCQlpZiAocmVzKSB7CisJCQlkcHJpbnRrKCJPcGVubmluZyBzbGF2ZSAlcyBmYWlsZWRcbiIsIHNsYXZlX2Rldi0+bmFtZSk7CisJCQlnb3RvIGVycl9yZXN0b3JlX21hYzsKKwkJfQorCX0KKworCXJlcyA9IG5ldGRldl9zZXRfbWFzdGVyKHNsYXZlX2RldiwgYm9uZF9kZXYpOworCWlmIChyZXMpIHsKKwkJZHByaW50aygiRXJyb3IgJWQgY2FsbGluZyBuZXRkZXZfc2V0X21hc3RlclxuIiwgcmVzKTsKKwkJaWYgKGFwcF9hYmlfdmVyIDwgMSkgeworCQkJZ290byBlcnJfZnJlZTsKKwkJfSBlbHNlIHsKKwkJCWdvdG8gZXJyX2Nsb3NlOworCQl9CisJfQorCisJbmV3X3NsYXZlLT5kZXYgPSBzbGF2ZV9kZXY7CisKKwlpZiAoKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9UTEIpIHx8CisJICAgIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUxCKSkgeworCQkvKiBib25kX2FsYl9pbml0X3NsYXZlKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFsbCBvdGhlciBzdGFnZXMgc2luY2UKKwkJICogaXQgbWlnaHQgZmFpbCBhbmQgd2UgZG8gbm90IHdhbnQgdG8gaGF2ZSB0byB1bmRvIGV2ZXJ5dGhpbmcKKwkJICovCisJCXJlcyA9IGJvbmRfYWxiX2luaXRfc2xhdmUoYm9uZCwgbmV3X3NsYXZlKTsKKwkJaWYgKHJlcykgeworCQkJZ290byBlcnJfdW5zZXRfbWFzdGVyOworCQl9CisJfQorCisJLyogSWYgdGhlIG1vZGUgVVNFU19QUklNQVJZLCB0aGVuIHRoZSBuZXcgc2xhdmUgZ2V0cyB0aGUKKwkgKiBtYXN0ZXIncyBwcm9taXNjIChhbmQgbWMpIHNldHRpbmdzIG9ubHkgaWYgaXQgYmVjb21lcyB0aGUKKwkgKiBjdXJyX2FjdGl2ZV9zbGF2ZSwgYW5kIHRoYXQgaXMgdGFrZW4gY2FyZSBvZiBsYXRlciB3aGVuIGNhbGxpbmcKKwkgKiBib25kX2NoYW5nZV9hY3RpdmUoKQorCSAqLworCWlmICghVVNFU19QUklNQVJZKGJvbmQtPnBhcmFtcy5tb2RlKSkgeworCQkvKiBzZXQgcHJvbWlzY3VpdHkgbGV2ZWwgdG8gbmV3IHNsYXZlICovCisJCWlmIChib25kX2Rldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQkJZGV2X3NldF9wcm9taXNjdWl0eShzbGF2ZV9kZXYsIDEpOworCQl9CisKKwkJLyogc2V0IGFsbG11bHRpIGxldmVsIHRvIG5ldyBzbGF2ZSAqLworCQlpZiAoYm9uZF9kZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCQlkZXZfc2V0X2FsbG11bHRpKHNsYXZlX2RldiwgMSk7CisJCX0KKworCQkvKiB1cGxvYWQgbWFzdGVyJ3MgbWNfbGlzdCB0byBuZXcgc2xhdmUgKi8KKwkJZm9yIChkbWkgPSBib25kX2Rldi0+bWNfbGlzdDsgZG1pOyBkbWkgPSBkbWktPm5leHQpIHsKKwkJCWRldl9tY19hZGQgKHNsYXZlX2RldiwgZG1pLT5kbWlfYWRkciwgZG1pLT5kbWlfYWRkcmxlbiwgMCk7CisJCX0KKwl9CisKKwlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFXzgwMjNBRCkgeworCQkvKiBhZGQgbGFjcGR1IG1jIGFkZHIgdG8gbWMgbGlzdCAqLworCQl1OCBsYWNwZHVfbXVsdGljYXN0W0VUSF9BTEVOXSA9IE1VTFRJQ0FTVF9MQUNQRFVfQUREUjsKKworCQlkZXZfbWNfYWRkKHNsYXZlX2RldiwgbGFjcGR1X211bHRpY2FzdCwgRVRIX0FMRU4sIDApOworCX0KKworCWJvbmRfYWRkX3ZsYW5zX29uX3NsYXZlKGJvbmQsIHNsYXZlX2Rldik7CisKKwl3cml0ZV9sb2NrX2JoKCZib25kLT5sb2NrKTsKKworCWJvbmRfYXR0YWNoX3NsYXZlKGJvbmQsIG5ld19zbGF2ZSk7CisKKwluZXdfc2xhdmUtPmRlbGF5ID0gMDsKKwluZXdfc2xhdmUtPmxpbmtfZmFpbHVyZV9jb3VudCA9IDA7CisKKwlpZiAoYm9uZC0+cGFyYW1zLm1paW1vbiAmJiAhYm9uZC0+cGFyYW1zLnVzZV9jYXJyaWVyKSB7CisJCWxpbmtfcmVwb3J0aW5nID0gYm9uZF9jaGVja19kZXZfbGluayhib25kLCBzbGF2ZV9kZXYsIDEpOworCisJCWlmICgobGlua19yZXBvcnRpbmcgPT0gLTEpICYmICFib25kLT5wYXJhbXMuYXJwX2ludGVydmFsKSB7CisJCQkvKgorCQkJICogbWlpbW9uIGlzIHNldCBidXQgYSBib25kZWQgbmV0d29yayBkcml2ZXIKKwkJCSAqIGRvZXMgbm90IHN1cHBvcnQgRVRIVE9PTC9NSUkgYW5kCisJCQkgKiBhcnBfaW50ZXJ2YWwgaXMgbm90IHNldC4gIE5vdGU6IGlmCisJCQkgKiB1c2VfY2FycmllciBpcyBlbmFibGVkLCB3ZSB3aWxsIG5ldmVyIGdvCisJCQkgKiBoZXJlIChiZWNhdXNlIG5ldGlmX2NhcnJpZXIgaXMgYWx3YXlzCisJCQkgKiBzdXBwb3J0ZWQpOyB0aHVzLCB3ZSBkb24ndCBuZWVkIHRvIGNoYW5nZQorCQkJICogdGhlIG1lc3NhZ2VzIGZvciBuZXRpZl9jYXJyaWVyLgorCQkJICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCQkgICAgICAgIjogV2FybmluZzogTUlJIGFuZCBFVEhUT09MIHN1cHBvcnQgbm90ICIKKwkJCSAgICAgICAiYXZhaWxhYmxlIGZvciBpbnRlcmZhY2UgJXMsIGFuZCAiCisJCQkgICAgICAgImFycF9pbnRlcnZhbC9hcnBfaXBfdGFyZ2V0IG1vZHVsZSBwYXJhbWV0ZXJzICIKKwkJCSAgICAgICAibm90IHNwZWNpZmllZCwgdGh1cyBib25kaW5nIHdpbGwgbm90IGRldGVjdCAiCisJCQkgICAgICAgImxpbmsgZmFpbHVyZXMhIHNlZSBib25kaW5nLnR4dCBmb3IgZGV0YWlscy5cbiIsCisJCQkgICAgICAgc2xhdmVfZGV2LT5uYW1lKTsKKwkJfSBlbHNlIGlmIChsaW5rX3JlcG9ydGluZyA9PSAtMSkgeworCQkJLyogdW5hYmxlIGdldCBsaW5rIHN0YXR1cyB1c2luZyBtaWkvZXRodG9vbCAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkJICAgICAgICI6IFdhcm5pbmc6IGNhbid0IGdldCBsaW5rIHN0YXR1cyBmcm9tICIKKwkJCSAgICAgICAiaW50ZXJmYWNlICVzOyB0aGUgbmV0d29yayBkcml2ZXIgYXNzb2NpYXRlZCAiCisJCQkgICAgICAgIndpdGggdGhpcyBpbnRlcmZhY2UgZG9lcyBub3Qgc3VwcG9ydCBNSUkgb3IgIgorCQkJICAgICAgICJFVEhUT09MIGxpbmsgc3RhdHVzIHJlcG9ydGluZywgdGh1cyBtaWltb24gIgorCQkJICAgICAgICJoYXMgbm8gZWZmZWN0IG9uIHRoaXMgaW50ZXJmYWNlLlxuIiwKKwkJCSAgICAgICBzbGF2ZV9kZXYtPm5hbWUpOworCQl9CisJfQorCisJLyogY2hlY2sgZm9yIGluaXRpYWwgc3RhdGUgKi8KKwlpZiAoIWJvbmQtPnBhcmFtcy5taWltb24gfHwKKwkgICAgKGJvbmRfY2hlY2tfZGV2X2xpbmsoYm9uZCwgc2xhdmVfZGV2LCAwKSA9PSBCTVNSX0xTVEFUVVMpKSB7CisJCWlmIChib25kLT5wYXJhbXMudXBkZWxheSkgeworCQkJZHByaW50aygiSW5pdGlhbCBzdGF0ZSBvZiBzbGF2ZV9kZXYgaXMgIgorCQkJCSJCT05EX0xJTktfQkFDS1xuIik7CisJCQluZXdfc2xhdmUtPmxpbmsgID0gQk9ORF9MSU5LX0JBQ0s7CisJCQluZXdfc2xhdmUtPmRlbGF5ID0gYm9uZC0+cGFyYW1zLnVwZGVsYXk7CisJCX0gZWxzZSB7CisJCQlkcHJpbnRrKCJJbml0aWFsIHN0YXRlIG9mIHNsYXZlX2RldiBpcyAiCisJCQkJIkJPTkRfTElOS19VUFxuIik7CisJCQluZXdfc2xhdmUtPmxpbmsgID0gQk9ORF9MSU5LX1VQOworCQl9CisJCW5ld19zbGF2ZS0+amlmZmllcyA9IGppZmZpZXM7CisJfSBlbHNlIHsKKwkJZHByaW50aygiSW5pdGlhbCBzdGF0ZSBvZiBzbGF2ZV9kZXYgaXMgIgorCQkJIkJPTkRfTElOS19ET1dOXG4iKTsKKwkJbmV3X3NsYXZlLT5saW5rICA9IEJPTkRfTElOS19ET1dOOworCX0KKworCWlmIChib25kX3VwZGF0ZV9zcGVlZF9kdXBsZXgobmV3X3NsYXZlKSAmJgorCSAgICAobmV3X3NsYXZlLT5saW5rICE9IEJPTkRfTElOS19ET1dOKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCSAgICAgICAiOiBXYXJuaW5nOiBmYWlsZWQgdG8gZ2V0IHNwZWVkIGFuZCBkdXBsZXggZnJvbSAlcywgIgorCQkgICAgICAgImFzc3VtZWQgdG8gYmUgMTAwTWIvc2VjIGFuZCBGdWxsLlxuIiwKKwkJICAgICAgIG5ld19zbGF2ZS0+ZGV2LT5uYW1lKTsKKworCQlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFXzgwMjNBRCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJPcGVyYXRpb24gb2YgODAyLjNhZCBtb2RlIHJlcXVpcmVzIEVUSFRPT0wgIgorCQkJICAgICAgICJzdXBwb3J0IGluIGJhc2UgZHJpdmVyIGZvciBwcm9wZXIgYWdncmVnYXRvciAiCisJCQkgICAgICAgInNlbGVjdGlvbi5cbiIpOworCQl9CisJfQorCisJaWYgKFVTRVNfUFJJTUFSWShib25kLT5wYXJhbXMubW9kZSkgJiYgYm9uZC0+cGFyYW1zLnByaW1hcnlbMF0pIHsKKwkJLyogaWYgdGhlcmUgaXMgYSBwcmltYXJ5IHNsYXZlLCByZW1lbWJlciBpdCAqLworCQlpZiAoc3RyY21wKGJvbmQtPnBhcmFtcy5wcmltYXJ5LCBuZXdfc2xhdmUtPmRldi0+bmFtZSkgPT0gMCkgeworCQkJYm9uZC0+cHJpbWFyeV9zbGF2ZSA9IG5ld19zbGF2ZTsKKwkJfQorCX0KKworCXN3aXRjaCAoYm9uZC0+cGFyYW1zLm1vZGUpIHsKKwljYXNlIEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVA6CisJCS8qIGlmIHdlJ3JlIGluIGFjdGl2ZS1iYWNrdXAgbW9kZSwgd2UgbmVlZCBvbmUgYW5kIG9ubHkgb25lIGFjdGl2ZQorCQkgKiBpbnRlcmZhY2UuIFRoZSBiYWNrdXAgaW50ZXJmYWNlcyB3aWxsIGhhdmUgdGhlaXIgTk9BUlAgZmxhZyBzZXQKKwkJICogYmVjYXVzZSB3ZSBuZWVkIHRoZW0gdG8gYmUgY29tcGxldGVseSBkZWFmIGFuZCBub3QgdG8gcmVzcG9uZCB0bworCQkgKiBhbnkgQVJQIHJlcXVlc3Qgb24gdGhlIG5ldHdvcmsgdG8gYXZvaWQgZm9vbGluZyBhIHN3aXRjaC4gVGh1cywKKwkJICogc2luY2Ugd2UgZ3VhcmFudGVlIHRoYXQgY3Vycl9hY3RpdmVfc2xhdmUgYWx3YXlzIHBvaW50IHRvIHRoZSBsYXN0CisJCSAqIHVzYWJsZSBpbnRlcmZhY2UsIHdlIGp1c3QgaGF2ZSB0byB2ZXJpZnkgdGhpcyBpbnRlcmZhY2UncyBmbGFnLgorCQkgKi8KKwkJaWYgKCgoIWJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKSB8fAorCQkgICAgIChib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZS0+ZGV2LT5mbGFncyAmIElGRl9OT0FSUCkpICYmCisJCSAgICAobmV3X3NsYXZlLT5saW5rICE9IEJPTkRfTElOS19ET1dOKSkgeworCQkJZHByaW50aygiVGhpcyBpcyB0aGUgZmlyc3QgYWN0aXZlIHNsYXZlXG4iKTsKKwkJCS8qIGZpcnN0IHNsYXZlIG9yIG5vIGFjdGl2ZSBzbGF2ZSB5ZXQsIGFuZCB0aGlzIGxpbmsKKwkJCSAgIGlzIE9LLCBzbyBtYWtlIHRoaXMgaW50ZXJmYWNlIHRoZSBhY3RpdmUgb25lICovCisJCQlib25kX2NoYW5nZV9hY3RpdmVfc2xhdmUoYm9uZCwgbmV3X3NsYXZlKTsKKwkJfSBlbHNlIHsKKwkJCWRwcmludGsoIlRoaXMgaXMganVzdCBhIGJhY2t1cCBzbGF2ZVxuIik7CisJCQlib25kX3NldF9zbGF2ZV9pbmFjdGl2ZV9mbGFncyhuZXdfc2xhdmUpOworCQl9CisJCWJyZWFrOworCWNhc2UgQk9ORF9NT0RFXzgwMjNBRDoKKwkJLyogaW4gODAyLjNhZCBtb2RlLCB0aGUgaW50ZXJuYWwgbWVjaGFuaXNtCisJCSAqIHdpbGwgYWN0aXZhdGUgdGhlIHNsYXZlcyBpbiB0aGUgc2VsZWN0ZWQKKwkJICogYWdncmVnYXRvcgorCQkgKi8KKwkJYm9uZF9zZXRfc2xhdmVfaW5hY3RpdmVfZmxhZ3MobmV3X3NsYXZlKTsKKwkJLyogaWYgdGhpcyBpcyB0aGUgZmlyc3Qgc2xhdmUgKi8KKwkJaWYgKGJvbmQtPnNsYXZlX2NudCA9PSAxKSB7CisJCQlTTEFWRV9BRF9JTkZPKG5ld19zbGF2ZSkuaWQgPSAxOworCQkJLyogSW5pdGlhbGl6ZSBBRCB3aXRoIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgQUQgdGltZXIgaXMgY2FsbGVkIGluIDEgc2Vjb25kCisJCQkgKiBjYW4gYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgdGhlIG1hYyBhZGRyZXNzIG9mIHRoZSBib25kIGlzIHNldAorCQkJICovCisJCQlib25kXzNhZF9pbml0aWFsaXplKGJvbmQsIDEwMDAvQURfVElNRVJfSU5URVJWQUwsCisJCQkJCSAgICBib25kLT5wYXJhbXMubGFjcF9mYXN0KTsKKwkJfSBlbHNlIHsKKwkJCVNMQVZFX0FEX0lORk8obmV3X3NsYXZlKS5pZCA9CisJCQkJU0xBVkVfQURfSU5GTyhuZXdfc2xhdmUtPnByZXYpLmlkICsgMTsKKwkJfQorCisJCWJvbmRfM2FkX2JpbmRfc2xhdmUobmV3X3NsYXZlKTsKKwkJYnJlYWs7CisJY2FzZSBCT05EX01PREVfVExCOgorCWNhc2UgQk9ORF9NT0RFX0FMQjoKKwkJbmV3X3NsYXZlLT5zdGF0ZSA9IEJPTkRfU1RBVEVfQUNUSVZFOworCQlpZiAoKCFib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSkgJiYKKwkJICAgIChuZXdfc2xhdmUtPmxpbmsgIT0gQk9ORF9MSU5LX0RPV04pKSB7CisJCQkvKiBmaXJzdCBzbGF2ZSBvciBubyBhY3RpdmUgc2xhdmUgeWV0LCBhbmQgdGhpcyBsaW5rCisJCQkgKiBpcyBPSywgc28gbWFrZSB0aGlzIGludGVyZmFjZSB0aGUgYWN0aXZlIG9uZQorCQkJICovCisJCQlib25kX2NoYW5nZV9hY3RpdmVfc2xhdmUoYm9uZCwgbmV3X3NsYXZlKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkcHJpbnRrKCJUaGlzIHNsYXZlIGlzIGFsd2F5cyBhY3RpdmUgaW4gdHJ1bmsgbW9kZVxuIik7CisKKwkJLyogYWx3YXlzIGFjdGl2ZSBpbiB0cnVuayBtb2RlICovCisJCW5ld19zbGF2ZS0+c3RhdGUgPSBCT05EX1NUQVRFX0FDVElWRTsKKworCQkvKiBJbiB0cnVua2luZyBtb2RlIHRoZXJlIGlzIGxpdHRsZSBtZWFuaW5nIHRvIGN1cnJfYWN0aXZlX3NsYXZlCisJCSAqIGFueXdheSAoaXQgaG9sZHMgbm8gc3BlY2lhbCBwcm9wZXJ0aWVzIG9mIHRoZSBib25kIGRldmljZSksCisJCSAqIHNvIHdlIGNhbiBjaGFuZ2UgaXQgd2l0aG91dCBjYWxsaW5nIGNoYW5nZV9hY3RpdmVfaW50ZXJmYWNlKCkKKwkJICovCisJCWlmICghYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUpIHsKKwkJCWJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlID0gbmV3X3NsYXZlOworCQl9CisJCWJyZWFrOworCX0gLyogc3dpdGNoKGJvbmRfbW9kZSkgKi8KKworCXdyaXRlX3VubG9ja19iaCgmYm9uZC0+bG9jayk7CisKKwlpZiAoYXBwX2FiaV92ZXIgPCAxKSB7CisJCS8qCisJCSAqICEhISBUaGlzIGlzIHRvIHN1cHBvcnQgb2xkIHZlcnNpb25zIG9mIGlmZW5zbGF2ZS4KKwkJICogV2UgY2FuIHJlbW92ZSB0aGlzIGluIDIuNSBiZWNhdXNlIG91ciBpZmVuc2xhdmUgdGFrZXMKKwkJICogY2FyZSBvZiB0aGlzIGZvciB1cy4KKwkJICogV2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBtYXN0ZXIgaGFzIGEgbWFjIGFkZHJlc3MgeWV0LgorCQkgKiBJZiBub3QsIHdlJ2xsIGdpdmUgaXQgdGhlIG1hYyBhZGRyZXNzIG9mIG91ciBzbGF2ZSBkZXZpY2UuCisJCSAqLworCQlpbnQgbmR4ID0gMDsKKworCQlmb3IgKG5keCA9IDA7IG5keCA8IGJvbmRfZGV2LT5hZGRyX2xlbjsgbmR4KyspIHsKKwkJCWRwcmludGsoIkNoZWNraW5nIG5keD0lZCBvZiBib25kX2Rldi0+ZGV2X2FkZHJcbiIsCisJCQkJbmR4KTsKKwkJCWlmIChib25kX2Rldi0+ZGV2X2FkZHJbbmR4XSAhPSAwKSB7CisJCQkJZHByaW50aygiRm91bmQgbm9uLXplcm8gYnl0ZSBhdCBuZHg9JWRcbiIsCisJCQkJCW5keCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAobmR4ID09IGJvbmRfZGV2LT5hZGRyX2xlbikgeworCQkJLyoKKwkJCSAqIFdlIGdvdCBhbGwgdGhlIHdheSB0aHJvdWdoIHRoZSBhZGRyZXNzIGFuZCBpdCB3YXMKKwkJCSAqIGFsbCAwJ3MuCisJCQkgKi8KKwkJCWRwcmludGsoIiVzIGRvZXNuJ3QgaGF2ZSBhIE1BQyBhZGRyZXNzIHlldC4gIFxuIiwKKwkJCQlib25kX2Rldi0+bmFtZSk7CisJCQlkcHJpbnRrKCJHb2luZyB0byBnaXZlIGFzc2lnbiBpdCBmcm9tICVzLlxuIiwKKwkJCQlzbGF2ZV9kZXYtPm5hbWUpOworCQkJYm9uZF9zZXRod2FkZHIoYm9uZF9kZXYsIHNsYXZlX2Rldik7CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJICAgICAgICI6ICVzOiBlbnNsYXZpbmcgJXMgYXMgYSVzIGludGVyZmFjZSB3aXRoIGElcyBsaW5rLlxuIiwKKwkgICAgICAgYm9uZF9kZXYtPm5hbWUsIHNsYXZlX2Rldi0+bmFtZSwKKwkgICAgICAgbmV3X3NsYXZlLT5zdGF0ZSA9PSBCT05EX1NUQVRFX0FDVElWRSA/ICJuIGFjdGl2ZSIgOiAiIGJhY2t1cCIsCisJICAgICAgIG5ld19zbGF2ZS0+bGluayAhPSBCT05EX0xJTktfRE9XTiA/ICJuIHVwIiA6ICIgZG93biIpOworCisJLyogZW5zbGF2ZSBpcyBzdWNjZXNzZnVsICovCisJcmV0dXJuIDA7CisKKy8qIFVuZG8gc3RhZ2VzIG9uIGVycm9yICovCitlcnJfdW5zZXRfbWFzdGVyOgorCW5ldGRldl9zZXRfbWFzdGVyKHNsYXZlX2RldiwgTlVMTCk7CisKK2Vycl9jbG9zZToKKwlkZXZfY2xvc2Uoc2xhdmVfZGV2KTsKKworZXJyX3Jlc3RvcmVfbWFjOgorCW1lbWNweShhZGRyLnNhX2RhdGEsIG5ld19zbGF2ZS0+cGVybV9od2FkZHIsIEVUSF9BTEVOKTsKKwlhZGRyLnNhX2ZhbWlseSA9IHNsYXZlX2Rldi0+dHlwZTsKKwlkZXZfc2V0X21hY19hZGRyZXNzKHNsYXZlX2RldiwgJmFkZHIpOworCitlcnJfZnJlZToKKwlrZnJlZShuZXdfc2xhdmUpOworCitlcnJfdW5kb19mbGFnczoKKwlib25kX2Rldi0+ZmVhdHVyZXMgPSBvbGRfZmVhdHVyZXM7CisKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogVHJ5IHRvIHJlbGVhc2UgdGhlIHNsYXZlIGRldmljZSA8c2xhdmU+IGZyb20gdGhlIGJvbmQgZGV2aWNlIDxtYXN0ZXI+CisgKiBJdCBpcyBsZWdhbCB0byBhY2Nlc3MgY3Vycl9hY3RpdmVfc2xhdmUgd2l0aG91dCBhIGxvY2sgYmVjYXVzZSBhbGwgdGhlIGZ1bmN0aW9uCisgKiBpcyB3cml0ZS1sb2NrZWQuCisgKgorICogVGhlIHJ1bGVzIGZvciBzbGF2ZSBzdGF0ZSBzaG91bGQgYmU6CisgKiAgIGZvciBBY3RpdmUvQmFja3VwOgorICogICAgIEFjdGl2ZSBzdGF5cyBvbiBhbGwgYmFja3VwcyBnbyBkb3duCisgKiAgIGZvciBCb25kZWQgY29ubmVjdGlvbnM6CisgKiAgICAgVGhlIGZpcnN0IHVwIGludGVyZmFjZSBzaG91bGQgYmUgbGVmdCBvbiBhbmQgYWxsIG90aGVycyBkb3duZWQuCisgKi8KK3N0YXRpYyBpbnQgYm9uZF9yZWxlYXNlKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2Rldiwgc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldikKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZGV2LT5wcml2OworCXN0cnVjdCBzbGF2ZSAqc2xhdmUsICpvbGRjdXJyZW50OworCXN0cnVjdCBzb2NrYWRkciBhZGRyOworCWludCBtYWNfYWRkcl9kaWZmZXI7CisKKwkvKiBzbGF2ZSBpcyBub3QgYSBzbGF2ZSBvciBtYXN0ZXIgaXMgbm90IG1hc3RlciBvZiB0aGlzIHNsYXZlICovCisJaWYgKCEoc2xhdmVfZGV2LT5mbGFncyAmIElGRl9TTEFWRSkgfHwKKwkgICAgKHNsYXZlX2Rldi0+bWFzdGVyICE9IGJvbmRfZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKKwkJICAgICAgICI6IEVycm9yOiAlczogY2Fubm90IHJlbGVhc2UgJXMuXG4iLAorCQkgICAgICAgYm9uZF9kZXYtPm5hbWUsIHNsYXZlX2Rldi0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXdyaXRlX2xvY2tfYmgoJmJvbmQtPmxvY2spOworCisJc2xhdmUgPSBib25kX2dldF9zbGF2ZV9ieV9kZXYoYm9uZCwgc2xhdmVfZGV2KTsKKwlpZiAoIXNsYXZlKSB7CisJCS8qIG5vdCBhIHNsYXZlIG9mIHRoaXMgYm9uZCAqLworCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCSAgICAgICAiOiAlczogJXMgbm90IGVuc2xhdmVkXG4iLAorCQkgICAgICAgYm9uZF9kZXYtPm5hbWUsIHNsYXZlX2Rldi0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1hY19hZGRyX2RpZmZlciA9IG1lbWNtcChib25kX2Rldi0+ZGV2X2FkZHIsCisJCQkJIHNsYXZlLT5wZXJtX2h3YWRkciwKKwkJCQkgRVRIX0FMRU4pOworCWlmICghbWFjX2FkZHJfZGlmZmVyICYmIChib25kLT5zbGF2ZV9jbnQgPiAxKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCSAgICAgICAiOiBXYXJuaW5nOiB0aGUgcGVybWFuZW50IEhXYWRkciBvZiAlcyAiCisJCSAgICAgICAiLSAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCAtIGlzICIKKwkJICAgICAgICJzdGlsbCBpbiB1c2UgYnkgJXMuIFNldCB0aGUgSFdhZGRyIG9mICIKKwkJICAgICAgICIlcyB0byBhIGRpZmZlcmVudCBhZGRyZXNzIHRvIGF2b2lkICIKKwkJICAgICAgICJjb25mbGljdHMuXG4iLAorCQkgICAgICAgc2xhdmVfZGV2LT5uYW1lLAorCQkgICAgICAgc2xhdmUtPnBlcm1faHdhZGRyWzBdLAorCQkgICAgICAgc2xhdmUtPnBlcm1faHdhZGRyWzFdLAorCQkgICAgICAgc2xhdmUtPnBlcm1faHdhZGRyWzJdLAorCQkgICAgICAgc2xhdmUtPnBlcm1faHdhZGRyWzNdLAorCQkgICAgICAgc2xhdmUtPnBlcm1faHdhZGRyWzRdLAorCQkgICAgICAgc2xhdmUtPnBlcm1faHdhZGRyWzVdLAorCQkgICAgICAgYm9uZF9kZXYtPm5hbWUsCisJCSAgICAgICBzbGF2ZV9kZXYtPm5hbWUpOworCX0KKworCS8qIEluZm9ybSBBRCBwYWNrYWdlIG9mIHVuYmluZGluZyBvZiBzbGF2ZS4gKi8KKwlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFXzgwMjNBRCkgeworCQkvKiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIHNsYXZlIGlzCisJCSAqIGRldGFjaGVkIGZyb20gdGhlIGxpc3QKKwkJICovCisJCWJvbmRfM2FkX3VuYmluZF9zbGF2ZShzbGF2ZSk7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCSAgICAgICAiOiAlczogcmVsZWFzaW5nICVzIGludGVyZmFjZSAlc1xuIiwKKwkgICAgICAgYm9uZF9kZXYtPm5hbWUsCisJICAgICAgIChzbGF2ZS0+c3RhdGUgPT0gQk9ORF9TVEFURV9BQ1RJVkUpCisJICAgICAgID8gImFjdGl2ZSIgOiAiYmFja3VwIiwKKwkgICAgICAgc2xhdmVfZGV2LT5uYW1lKTsKKworCW9sZGN1cnJlbnQgPSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZTsKKworCWJvbmQtPmN1cnJlbnRfYXJwX3NsYXZlID0gTlVMTDsKKworCS8qIHJlbGVhc2UgdGhlIHNsYXZlIGZyb20gaXRzIGJvbmQgKi8KKwlib25kX2RldGFjaF9zbGF2ZShib25kLCBzbGF2ZSk7CisKKwlpZiAoYm9uZC0+cHJpbWFyeV9zbGF2ZSA9PSBzbGF2ZSkgeworCQlib25kLT5wcmltYXJ5X3NsYXZlID0gTlVMTDsKKwl9CisKKwlpZiAob2xkY3VycmVudCA9PSBzbGF2ZSkgeworCQlib25kX2NoYW5nZV9hY3RpdmVfc2xhdmUoYm9uZCwgTlVMTCk7CisJfQorCisJaWYgKChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfVExCKSB8fAorCSAgICAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX0FMQikpIHsKKwkJLyogTXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciB0aGUgc2xhdmUgaGFzIGJlZW4KKwkJICogZGV0YWNoZWQgZnJvbSB0aGUgbGlzdCBhbmQgdGhlIGN1cnJfYWN0aXZlX3NsYXZlCisJCSAqIGhhcyBiZWVuIGNsZWFyZWQgKGlmIG91cl9zbGF2ZSA9PSBvbGRfY3VycmVudCksCisJCSAqIGJ1dCBiZWZvcmUgYSBuZXcgYWN0aXZlIHNsYXZlIGlzIHNlbGVjdGVkLgorCQkgKi8KKwkJYm9uZF9hbGJfZGVpbml0X3NsYXZlKGJvbmQsIHNsYXZlKTsKKwl9CisKKwlpZiAob2xkY3VycmVudCA9PSBzbGF2ZSkgeworCQlib25kX3NlbGVjdF9hY3RpdmVfc2xhdmUoYm9uZCk7CisKKwkJaWYgKCFib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCQkJICAgICAgICI6ICVzOiBub3cgcnVubmluZyB3aXRob3V0IGFueSBhY3RpdmUgIgorCQkJICAgICAgICJpbnRlcmZhY2UgIVxuIiwKKwkJCSAgICAgICBib25kX2Rldi0+bmFtZSk7CisJCX0KKwl9CisKKwlpZiAoYm9uZC0+c2xhdmVfY250ID09IDApIHsKKwkJLyogaWYgdGhlIGxhc3Qgc2xhdmUgd2FzIHJlbW92ZWQsIHplcm8gdGhlIG1hYyBhZGRyZXNzCisJCSAqIG9mIHRoZSBtYXN0ZXIgc28gaXQgd2lsbCBiZSBzZXQgYnkgdGhlIGFwcGxpY2F0aW9uCisJCSAqIHRvIHRoZSBtYWMgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgc2xhdmUKKwkJICovCisJCW1lbXNldChib25kX2Rldi0+ZGV2X2FkZHIsIDAsIGJvbmRfZGV2LT5hZGRyX2xlbik7CisKKwkJaWYgKGxpc3RfZW1wdHkoJmJvbmQtPnZsYW5fbGlzdCkpIHsKKwkJCWJvbmRfZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1ZMQU5fQ0hBTExFTkdFRDsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJCSAgICAgICAiOiBXYXJuaW5nOiBjbGVhcmluZyBIVyBhZGRyZXNzIG9mICVzIHdoaWxlIGl0ICIKKwkJCSAgICAgICAic3RpbGwgaGFzIFZMQU5zLlxuIiwKKwkJCSAgICAgICBib25kX2Rldi0+bmFtZSk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCQkgICAgICAgIjogV2hlbiByZS1hZGRpbmcgc2xhdmVzLCBtYWtlIHN1cmUgdGhlIGJvbmQncyAiCisJCQkgICAgICAgIkhXIGFkZHJlc3MgbWF0Y2hlcyBpdHMgVkxBTnMnLlxuIik7CisJCX0KKwl9IGVsc2UgaWYgKChib25kX2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1ZMQU5fQ0hBTExFTkdFRCkgJiYKKwkJICAgIWJvbmRfaGFzX2NoYWxsZW5nZWRfc2xhdmVzKGJvbmQpKSB7CisJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJICAgICAgICI6IGxhc3QgVkxBTiBjaGFsbGVuZ2VkIHNsYXZlICVzICIKKwkJICAgICAgICJsZWZ0IGJvbmQgJXMuIFZMQU4gYmxvY2tpbmcgaXMgcmVtb3ZlZFxuIiwKKwkJICAgICAgIHNsYXZlX2Rldi0+bmFtZSwgYm9uZF9kZXYtPm5hbWUpOworCQlib25kX2Rldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfVkxBTl9DSEFMTEVOR0VEOworCX0KKworCXdyaXRlX3VubG9ja19iaCgmYm9uZC0+bG9jayk7CisKKwlib25kX2RlbF92bGFuc19mcm9tX3NsYXZlKGJvbmQsIHNsYXZlX2Rldik7CisKKwkvKiBJZiB0aGUgbW9kZSBVU0VTX1BSSU1BUlksIHRoZW4gd2Ugc2hvdWxkIG9ubHkgcmVtb3ZlIGl0cworCSAqIHByb21pc2MgYW5kIG1jIHNldHRpbmdzIGlmIGl0IHdhcyB0aGUgY3Vycl9hY3RpdmVfc2xhdmUsIGJ1dCB0aGF0IHdhcworCSAqIGFscmVhZHkgdGFrZW4gY2FyZSBvZiBhYm92ZSB3aGVuIHdlIGRldGFjaGVkIHRoZSBzbGF2ZQorCSAqLworCWlmICghVVNFU19QUklNQVJZKGJvbmQtPnBhcmFtcy5tb2RlKSkgeworCQkvKiB1bnNldCBwcm9taXNjdWl0eSBsZXZlbCBmcm9tIHNsYXZlICovCisJCWlmIChib25kX2Rldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQkJZGV2X3NldF9wcm9taXNjdWl0eShzbGF2ZV9kZXYsIC0xKTsKKwkJfQorCisJCS8qIHVuc2V0IGFsbG11bHRpIGxldmVsIGZyb20gc2xhdmUgKi8KKwkJaWYgKGJvbmRfZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQkJZGV2X3NldF9hbGxtdWx0aShzbGF2ZV9kZXYsIC0xKTsKKwkJfQorCisJCS8qIGZsdXNoIG1hc3RlcidzIG1jX2xpc3QgZnJvbSBzbGF2ZSAqLworCQlib25kX21jX2xpc3RfZmx1c2goYm9uZF9kZXYsIHNsYXZlX2Rldik7CisJfQorCisJbmV0ZGV2X3NldF9tYXN0ZXIoc2xhdmVfZGV2LCBOVUxMKTsKKworCS8qIGNsb3NlIHNsYXZlIGJlZm9yZSByZXN0b3JpbmcgaXRzIG1hYyBhZGRyZXNzICovCisJZGV2X2Nsb3NlKHNsYXZlX2Rldik7CisKKwlpZiAoYXBwX2FiaV92ZXIgPj0gMSkgeworCQkvKiByZXN0b3JlIG9yaWdpbmFsICgicGVybWFuZW50IikgbWFjIGFkZHJlc3MgKi8KKwkJbWVtY3B5KGFkZHIuc2FfZGF0YSwgc2xhdmUtPnBlcm1faHdhZGRyLCBFVEhfQUxFTik7CisJCWFkZHIuc2FfZmFtaWx5ID0gc2xhdmVfZGV2LT50eXBlOworCQlkZXZfc2V0X21hY19hZGRyZXNzKHNsYXZlX2RldiwgJmFkZHIpOworCX0KKworCS8qIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHN0YXRlIG9mIHRoZQorCSAqIElGRl9OT0FSUCBmbGFnIHRoYXQgbWlnaHQgaGF2ZSBiZWVuCisJICogc2V0IGJ5IGJvbmRfc2V0X3NsYXZlX2luYWN0aXZlX2ZsYWdzKCkKKwkgKi8KKwlpZiAoKHNsYXZlLT5vcmlnaW5hbF9mbGFncyAmIElGRl9OT0FSUCkgPT0gMCkgeworCQlzbGF2ZV9kZXYtPmZsYWdzICY9IH5JRkZfTk9BUlA7CisJfQorCisJa2ZyZWUoc2xhdmUpOworCisJcmV0dXJuIDA7ICAvKiBkZWxldGlvbiBPSyAqLworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiByZWxlYXNlcyBhbGwgc2xhdmVzLgorICovCitzdGF0aWMgaW50IGJvbmRfcmVsZWFzZV9hbGwoc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2KQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisJc3RydWN0IHNsYXZlICpzbGF2ZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2OworCXN0cnVjdCBzb2NrYWRkciBhZGRyOworCisJd3JpdGVfbG9ja19iaCgmYm9uZC0+bG9jayk7CisKKwlpZiAoYm9uZC0+c2xhdmVfY250ID09IDApIHsKKwkJZ290byBvdXQ7CisJfQorCisJYm9uZC0+Y3VycmVudF9hcnBfc2xhdmUgPSBOVUxMOworCWJvbmQtPnByaW1hcnlfc2xhdmUgPSBOVUxMOworCWJvbmRfY2hhbmdlX2FjdGl2ZV9zbGF2ZShib25kLCBOVUxMKTsKKworCXdoaWxlICgoc2xhdmUgPSBib25kLT5maXJzdF9zbGF2ZSkgIT0gTlVMTCkgeworCQkvKiBJbmZvcm0gQUQgcGFja2FnZSBvZiB1bmJpbmRpbmcgb2Ygc2xhdmUKKwkJICogYmVmb3JlIHNsYXZlIGlzIGRldGFjaGVkIGZyb20gdGhlIGxpc3QuCisJCSAqLworCQlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFXzgwMjNBRCkgeworCQkJYm9uZF8zYWRfdW5iaW5kX3NsYXZlKHNsYXZlKTsKKwkJfQorCisJCXNsYXZlX2RldiA9IHNsYXZlLT5kZXY7CisJCWJvbmRfZGV0YWNoX3NsYXZlKGJvbmQsIHNsYXZlKTsKKworCQlpZiAoKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9UTEIpIHx8CisJCSAgICAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX0FMQikpIHsKKwkJCS8qIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgdGhlIHNsYXZlCisJCQkgKiBoYXMgYmVlbiBkZXRhY2hlZCBmcm9tIHRoZSBsaXN0CisJCQkgKi8KKwkJCWJvbmRfYWxiX2RlaW5pdF9zbGF2ZShib25kLCBzbGF2ZSk7CisJCX0KKworCQkvKiBub3cgdGhhdCB0aGUgc2xhdmUgaXMgZGV0YWNoZWQsIHVubG9jayBhbmQgcGVyZm9ybQorCQkgKiBhbGwgdGhlIHVuZG8gc3RlcHMgdGhhdCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tCisJCSAqIHdpdGhpbiBhIGxvY2suCisJCSAqLworCQl3cml0ZV91bmxvY2tfYmgoJmJvbmQtPmxvY2spOworCisJCWJvbmRfZGVsX3ZsYW5zX2Zyb21fc2xhdmUoYm9uZCwgc2xhdmVfZGV2KTsKKworCQkvKiBJZiB0aGUgbW9kZSBVU0VTX1BSSU1BUlksIHRoZW4gd2Ugc2hvdWxkIG9ubHkgcmVtb3ZlIGl0cworCQkgKiBwcm9taXNjIGFuZCBtYyBzZXR0aW5ncyBpZiBpdCB3YXMgdGhlIGN1cnJfYWN0aXZlX3NsYXZlLCBidXQgdGhhdCB3YXMKKwkJICogYWxyZWFkeSB0YWtlbiBjYXJlIG9mIGFib3ZlIHdoZW4gd2UgZGV0YWNoZWQgdGhlIHNsYXZlCisJCSAqLworCQlpZiAoIVVTRVNfUFJJTUFSWShib25kLT5wYXJhbXMubW9kZSkpIHsKKwkJCS8qIHVuc2V0IHByb21pc2N1aXR5IGxldmVsIGZyb20gc2xhdmUgKi8KKwkJCWlmIChib25kX2Rldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQkJCWRldl9zZXRfcHJvbWlzY3VpdHkoc2xhdmVfZGV2LCAtMSk7CisJCQl9CisKKwkJCS8qIHVuc2V0IGFsbG11bHRpIGxldmVsIGZyb20gc2xhdmUgKi8KKwkJCWlmIChib25kX2Rldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwkJCQlkZXZfc2V0X2FsbG11bHRpKHNsYXZlX2RldiwgLTEpOworCQkJfQorCisJCQkvKiBmbHVzaCBtYXN0ZXIncyBtY19saXN0IGZyb20gc2xhdmUgKi8KKwkJCWJvbmRfbWNfbGlzdF9mbHVzaChib25kX2Rldiwgc2xhdmVfZGV2KTsKKwkJfQorCisJCW5ldGRldl9zZXRfbWFzdGVyKHNsYXZlX2RldiwgTlVMTCk7CisKKwkJLyogY2xvc2Ugc2xhdmUgYmVmb3JlIHJlc3RvcmluZyBpdHMgbWFjIGFkZHJlc3MgKi8KKwkJZGV2X2Nsb3NlKHNsYXZlX2Rldik7CisKKwkJaWYgKGFwcF9hYmlfdmVyID49IDEpIHsKKwkJCS8qIHJlc3RvcmUgb3JpZ2luYWwgKCJwZXJtYW5lbnQiKSBtYWMgYWRkcmVzcyovCisJCQltZW1jcHkoYWRkci5zYV9kYXRhLCBzbGF2ZS0+cGVybV9od2FkZHIsIEVUSF9BTEVOKTsKKwkJCWFkZHIuc2FfZmFtaWx5ID0gc2xhdmVfZGV2LT50eXBlOworCQkJZGV2X3NldF9tYWNfYWRkcmVzcyhzbGF2ZV9kZXYsICZhZGRyKTsKKwkJfQorCisJCS8qIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHN0YXRlIG9mIHRoZSBJRkZfTk9BUlAgZmxhZyB0aGF0IG1pZ2h0IGhhdmUKKwkJICogYmVlbiBzZXQgYnkgYm9uZF9zZXRfc2xhdmVfaW5hY3RpdmVfZmxhZ3MoKQorCQkgKi8KKwkJaWYgKChzbGF2ZS0+b3JpZ2luYWxfZmxhZ3MgJiBJRkZfTk9BUlApID09IDApIHsKKwkJCXNsYXZlX2Rldi0+ZmxhZ3MgJj0gfklGRl9OT0FSUDsKKwkJfQorCisJCWtmcmVlKHNsYXZlKTsKKworCQkvKiByZS1hY3F1aXJlIHRoZSBsb2NrIGJlZm9yZSBnZXR0aW5nIHRoZSBuZXh0IHNsYXZlICovCisJCXdyaXRlX2xvY2tfYmgoJmJvbmQtPmxvY2spOworCX0KKworCS8qIHplcm8gdGhlIG1hYyBhZGRyZXNzIG9mIHRoZSBtYXN0ZXIgc28gaXQgd2lsbCBiZQorCSAqIHNldCBieSB0aGUgYXBwbGljYXRpb24gdG8gdGhlIG1hYyBhZGRyZXNzIG9mIHRoZQorCSAqIGZpcnN0IHNsYXZlCisJICovCisJbWVtc2V0KGJvbmRfZGV2LT5kZXZfYWRkciwgMCwgYm9uZF9kZXYtPmFkZHJfbGVuKTsKKworCWlmIChsaXN0X2VtcHR5KCZib25kLT52bGFuX2xpc3QpKSB7CisJCWJvbmRfZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1ZMQU5fQ0hBTExFTkdFRDsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCSAgICAgICAiOiBXYXJuaW5nOiBjbGVhcmluZyBIVyBhZGRyZXNzIG9mICVzIHdoaWxlIGl0ICIKKwkJICAgICAgICJzdGlsbCBoYXMgVkxBTnMuXG4iLAorCQkgICAgICAgYm9uZF9kZXYtPm5hbWUpOworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCSAgICAgICAiOiBXaGVuIHJlLWFkZGluZyBzbGF2ZXMsIG1ha2Ugc3VyZSB0aGUgYm9uZCdzICIKKwkJICAgICAgICJIVyBhZGRyZXNzIG1hdGNoZXMgaXRzIFZMQU5zJy5cbiIpOworCX0KKworCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkgICAgICAgIjogJXM6IHJlbGVhc2VkIGFsbCBzbGF2ZXNcbiIsCisJICAgICAgIGJvbmRfZGV2LT5uYW1lKTsKKworb3V0OgorCXdyaXRlX3VubG9ja19iaCgmYm9uZC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgYWN0aXZlIHNsYXZlIHRvIHNsYXZlIDxzbGF2ZV9kZXY+LgorICogSXQgcmV0dXJucyAtRUlOVkFMIGluIHRoZSBmb2xsb3dpbmcgY2FzZXMuCisgKiAgLSA8c2xhdmVfZGV2PiBpcyBub3QgZm91bmQgaW4gdGhlIGxpc3QuCisgKiAgLSBUaGVyZSBpcyBub3QgYWN0aXZlIHNsYXZlIG5vdy4KKyAqICAtIDxzbGF2ZV9kZXY+IGlzIGFscmVhZHkgYWN0aXZlLgorICogIC0gVGhlIGxpbmsgc3RhdGUgb2YgPHNsYXZlX2Rldj4gaXMgbm90IEJPTkRfTElOS19VUC4KKyAqICAtIDxzbGF2ZV9kZXY+IGlzIG5vdCBydW5uaW5nLgorICogSW4gdGhlc2UgY2FzZXMsIHRoaXMgZnVjdGlvbiBkb2VzIG5vdGhpbmcuCisgKiBJbiB0aGUgb3RoZXIgY2FzZXMsIGN1cnJudF9zbGF2ZSBwb2ludGVyIGlzIGNoYW5nZWQgYW5kIDAgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBpbnQgYm9uZF9pb2N0bF9jaGFuZ2VfYWN0aXZlKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2Rldiwgc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldikKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZGV2LT5wcml2OworCXN0cnVjdCBzbGF2ZSAqb2xkX2FjdGl2ZSA9IE5VTEw7CisJc3RydWN0IHNsYXZlICpuZXdfYWN0aXZlID0gTlVMTDsKKwlpbnQgcmVzID0gMDsKKworCWlmICghVVNFU19QUklNQVJZKGJvbmQtPnBhcmFtcy5tb2RlKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBWZXJpZnkgdGhhdCBtYXN0ZXJfZGV2IGlzIGluZGVlZCB0aGUgbWFzdGVyIG9mIHNsYXZlX2RldiAqLworCWlmICghKHNsYXZlX2Rldi0+ZmxhZ3MgJiBJRkZfU0xBVkUpIHx8CisJICAgIChzbGF2ZV9kZXYtPm1hc3RlciAhPSBib25kX2RldikpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd3JpdGVfbG9ja19iaCgmYm9uZC0+bG9jayk7CisKKwlvbGRfYWN0aXZlID0gYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmU7CisJbmV3X2FjdGl2ZSA9IGJvbmRfZ2V0X3NsYXZlX2J5X2Rldihib25kLCBzbGF2ZV9kZXYpOworCisJLyoKKwkgKiBDaGFuZ2luZyB0byB0aGUgY3VycmVudCBhY3RpdmU6IGRvIG5vdGhpbmc7IHJldHVybiBzdWNjZXNzLgorCSAqLworCWlmIChuZXdfYWN0aXZlICYmIChuZXdfYWN0aXZlID09IG9sZF9hY3RpdmUpKSB7CisJCXdyaXRlX3VubG9ja19iaCgmYm9uZC0+bG9jayk7CisJCXJldHVybiAwOworCX0KKworCWlmICgobmV3X2FjdGl2ZSkgJiYKKwkgICAgKG9sZF9hY3RpdmUpICYmCisJICAgIChuZXdfYWN0aXZlLT5saW5rID09IEJPTkRfTElOS19VUCkgJiYKKwkgICAgSVNfVVAobmV3X2FjdGl2ZS0+ZGV2KSkgeworCQlib25kX2NoYW5nZV9hY3RpdmVfc2xhdmUoYm9uZCwgbmV3X2FjdGl2ZSk7CisJfSBlbHNlIHsKKwkJcmVzID0gLUVJTlZBTDsKKwl9CisKKwl3cml0ZV91bmxvY2tfYmgoJmJvbmQtPmxvY2spOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBib25kX2V0aHRvb2xfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmcikKK3sKKwlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvIGluZm87CisJdm9pZCBfX3VzZXIgKmFkZHIgPSBpZnItPmlmcl9kYXRhOworCXVpbnQzMl90IGNtZDsKKworCWlmIChnZXRfdXNlcihjbWQsICh1aW50MzJfdCBfX3VzZXIgKilhZGRyKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRVRIVE9PTF9HRFJWSU5GTzoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhZGRyLCBzaXplb2YoaW5mbykpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCWlmIChzdHJjbXAoaW5mby5kcml2ZXIsICJpZmVuc2xhdmUiKSA9PSAwKSB7CisJCQlpbnQgbmV3X2FiaV92ZXI7CisJCQljaGFyICplbmRwdHI7CisKKwkJCW5ld19hYmlfdmVyID0gc2ltcGxlX3N0cnRvdWwoaW5mby5md192ZXJzaW9uLAorCQkJCQkJICAgICAmZW5kcHRyLCAwKTsKKwkJCWlmICgqZW5kcHRyKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCisJCQkJICAgICAgICI6IEVycm9yOiBnb3QgaW52YWxpZCBBQkkgIgorCQkJCSAgICAgICAidmVyc2lvbiBmcm9tIGFwcGxpY2F0aW9uXG4iKTsKKworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQlpZiAob3JpZ19hcHBfYWJpX3ZlciA9PSAtMSkgeworCQkJCW9yaWdfYXBwX2FiaV92ZXIgID0gbmV3X2FiaV92ZXI7CisJCQl9CisKKwkJCWFwcF9hYmlfdmVyID0gbmV3X2FiaV92ZXI7CisJCX0KKworCQlzdHJuY3B5KGluZm8uZHJpdmVyLCAgRFJWX05BTUUsIDMyKTsKKwkJc3RybmNweShpbmZvLnZlcnNpb24sIERSVl9WRVJTSU9OLCAzMik7CisJCXNucHJpbnRmKGluZm8uZndfdmVyc2lvbiwgMzIsICIlZCIsIEJPTkRfQUJJX1ZFUlNJT04pOworCisJCWlmIChjb3B5X3RvX3VzZXIoYWRkciwgJmluZm8sIHNpemVvZihpbmZvKSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKworc3RhdGljIGludCBib25kX2luZm9fcXVlcnkoc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2LCBzdHJ1Y3QgaWZib25kICppbmZvKQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisKKwlpbmZvLT5ib25kX21vZGUgPSBib25kLT5wYXJhbXMubW9kZTsKKwlpbmZvLT5taWltb24gPSBib25kLT5wYXJhbXMubWlpbW9uOworCisJcmVhZF9sb2NrX2JoKCZib25kLT5sb2NrKTsKKwlpbmZvLT5udW1fc2xhdmVzID0gYm9uZC0+c2xhdmVfY250OworCXJlYWRfdW5sb2NrX2JoKCZib25kLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJvbmRfc2xhdmVfaW5mb19xdWVyeShzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYsIHN0cnVjdCBpZnNsYXZlICppbmZvKQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisJc3RydWN0IHNsYXZlICpzbGF2ZTsKKwlpbnQgaSwgZm91bmQgPSAwOworCisJaWYgKGluZm8tPnNsYXZlX2lkIDwgMCkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZWFkX2xvY2tfYmgoJmJvbmQtPmxvY2spOworCisJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgeworCQlpZiAoaSA9PSAoaW50KWluZm8tPnNsYXZlX2lkKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJlYWRfdW5sb2NrX2JoKCZib25kLT5sb2NrKTsKKworCWlmIChmb3VuZCkgeworCQlzdHJjcHkoaW5mby0+c2xhdmVfbmFtZSwgc2xhdmUtPmRldi0+bmFtZSk7CisJCWluZm8tPmxpbmsgPSBzbGF2ZS0+bGluazsKKwkJaW5mby0+c3RhdGUgPSBzbGF2ZS0+c3RhdGU7CisJCWluZm8tPmxpbmtfZmFpbHVyZV9jb3VudCA9IHNsYXZlLT5saW5rX2ZhaWx1cmVfY291bnQ7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTW9uaXRvcmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgcmVndWxhcmx5IHRvIG1vbml0b3IgZWFjaCBzbGF2ZSdzIGxpbmsuICovCitzdGF0aWMgdm9pZCBib25kX21paV9tb25pdG9yKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldikKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZGV2LT5wcml2OworCXN0cnVjdCBzbGF2ZSAqc2xhdmUsICpvbGRjdXJyZW50OworCWludCBkb19mYWlsb3ZlciA9IDA7CisJaW50IGRlbHRhX2luX3RpY2tzOworCWludCBpOworCisJcmVhZF9sb2NrKCZib25kLT5sb2NrKTsKKworCWRlbHRhX2luX3RpY2tzID0gKGJvbmQtPnBhcmFtcy5taWltb24gKiBIWikgLyAxMDAwOworCisJaWYgKGJvbmQtPmtpbGxfdGltZXJzKSB7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChib25kLT5zbGF2ZV9jbnQgPT0gMCkgeworCQlnb3RvIHJlX2FybTsKKwl9CisKKwkvKiB3ZSB3aWxsIHRyeSB0byByZWFkIHRoZSBsaW5rIHN0YXR1cyBvZiBlYWNoIG9mIG91ciBzbGF2ZXMsIGFuZAorCSAqIHNldCB0aGVpciBJRkZfUlVOTklORyBmbGFnIGFwcHJvcHJpYXRlbHkuIEZvciBlYWNoIHNsYXZlIG5vdAorCSAqIHN1cHBvcnRpbmcgTUlJIHN0YXR1cywgd2Ugd29uJ3QgZG8gYW55dGhpbmcgc28gdGhhdCBhIHVzZXItc3BhY2UKKwkgKiBwcm9ncmFtIGNvdWxkIG1vbml0b3IgdGhlIGxpbmsgaXRzZWxmIGlmIG5lZWRlZC4KKwkgKi8KKworCXJlYWRfbG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKwlvbGRjdXJyZW50ID0gYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmU7CisJcmVhZF91bmxvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisKKwlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXYgPSBzbGF2ZS0+ZGV2OworCQlpbnQgbGlua19zdGF0ZTsKKwkJdTE2IG9sZF9zcGVlZCA9IHNsYXZlLT5zcGVlZDsKKwkJdTggb2xkX2R1cGxleCA9IHNsYXZlLT5kdXBsZXg7CisKKwkJbGlua19zdGF0ZSA9IGJvbmRfY2hlY2tfZGV2X2xpbmsoYm9uZCwgc2xhdmVfZGV2LCAwKTsKKworCQlzd2l0Y2ggKHNsYXZlLT5saW5rKSB7CisJCWNhc2UgQk9ORF9MSU5LX1VQOgkvKiB0aGUgbGluayB3YXMgdXAgKi8KKwkJCWlmIChsaW5rX3N0YXRlID09IEJNU1JfTFNUQVRVUykgeworCQkJCS8qIGxpbmsgc3RheXMgdXAsIG5vdGhpbmcgbW9yZSB0byBkbyAqLworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsgLyogbGluayBnb2luZyBkb3duICovCisJCQkJc2xhdmUtPmxpbmsgID0gQk9ORF9MSU5LX0ZBSUw7CisJCQkJc2xhdmUtPmRlbGF5ID0gYm9uZC0+cGFyYW1zLmRvd25kZWxheTsKKworCQkJCWlmIChzbGF2ZS0+bGlua19mYWlsdXJlX2NvdW50IDwgVUlOVF9NQVgpIHsKKwkJCQkJc2xhdmUtPmxpbmtfZmFpbHVyZV9jb3VudCsrOworCQkJCX0KKworCQkJCWlmIChib25kLT5wYXJhbXMuZG93bmRlbGF5KSB7CisJCQkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJCQkJICAgICAgICI6ICVzOiBsaW5rIHN0YXR1cyBkb3duIGZvciAlcyAiCisJCQkJCSAgICAgICAiaW50ZXJmYWNlICVzLCBkaXNhYmxpbmcgaXQgaW4gIgorCQkJCQkgICAgICAgIiVkIG1zLlxuIiwKKwkJCQkJICAgICAgIGJvbmRfZGV2LT5uYW1lLAorCQkJCQkgICAgICAgSVNfVVAoc2xhdmVfZGV2KQorCQkJCQkgICAgICAgPyAoKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9BQ1RJVkVCQUNLVVApCisJCQkJCQkgID8gKChzbGF2ZSA9PSBvbGRjdXJyZW50KQorCQkJCQkJICAgICA/ICJhY3RpdmUgIiA6ICJiYWNrdXAgIikKKwkJCQkJCSAgOiAiIikKKwkJCQkJICAgICAgIDogImlkbGUgIiwKKwkJCQkJICAgICAgIHNsYXZlX2Rldi0+bmFtZSwKKwkJCQkJICAgICAgIGJvbmQtPnBhcmFtcy5kb3duZGVsYXkgKiBib25kLT5wYXJhbXMubWlpbW9uKTsKKwkJCQl9CisJCQl9CisJCQkvKiBubyBicmVhayAhIGZhbGwgdGhyb3VnaCB0aGUgQk9ORF9MSU5LX0ZBSUwgdGVzdCB0bworCQkJICAgZW5zdXJlIHByb3BlciBhY3Rpb24gdG8gYmUgdGFrZW4KKwkJCSovCisJCWNhc2UgQk9ORF9MSU5LX0ZBSUw6CS8qIHRoZSBsaW5rIGhhcyBqdXN0IGdvbmUgZG93biAqLworCQkJaWYgKGxpbmtfc3RhdGUgIT0gQk1TUl9MU1RBVFVTKSB7CisJCQkJLyogbGluayBzdGF5cyBkb3duICovCisJCQkJaWYgKHNsYXZlLT5kZWxheSA8PSAwKSB7CisJCQkJCS8qIGxpbmsgZG93biBmb3IgdG9vIGxvbmcgdGltZSAqLworCQkJCQlzbGF2ZS0+bGluayA9IEJPTkRfTElOS19ET1dOOworCisJCQkJCS8qIGluIGFjdGl2ZS9iYWNrdXAgbW9kZSwgd2UgbXVzdAorCQkJCQkgKiBjb21wbGV0ZWx5IGRpc2FibGUgdGhpcyBpbnRlcmZhY2UKKwkJCQkJICovCisJCQkJCWlmICgoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX0FDVElWRUJBQ0tVUCkgfHwKKwkJCQkJICAgIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKSkgeworCQkJCQkJYm9uZF9zZXRfc2xhdmVfaW5hY3RpdmVfZmxhZ3Moc2xhdmUpOworCQkJCQl9CisKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCQkJCQkgICAgICAgIjogJXM6IGxpbmsgc3RhdHVzIGRlZmluaXRlbHkgIgorCQkJCQkgICAgICAgImRvd24gZm9yIGludGVyZmFjZSAlcywgIgorCQkJCQkgICAgICAgImRpc2FibGluZyBpdFxuIiwKKwkJCQkJICAgICAgIGJvbmRfZGV2LT5uYW1lLAorCQkJCQkgICAgICAgc2xhdmVfZGV2LT5uYW1lKTsKKworCQkJCQkvKiBub3RpZnkgYWQgdGhhdCB0aGUgbGluayBzdGF0dXMgaGFzIGNoYW5nZWQgKi8KKwkJCQkJaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpIHsKKwkJCQkJCWJvbmRfM2FkX2hhbmRsZV9saW5rX2NoYW5nZShzbGF2ZSwgQk9ORF9MSU5LX0RPV04pOworCQkJCQl9CisKKwkJCQkJaWYgKChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfVExCKSB8fAorCQkJCQkgICAgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9BTEIpKSB7CisJCQkJCQlib25kX2FsYl9oYW5kbGVfbGlua19jaGFuZ2UoYm9uZCwgc2xhdmUsIEJPTkRfTElOS19ET1dOKTsKKwkJCQkJfQorCisJCQkJCWlmIChzbGF2ZSA9PSBvbGRjdXJyZW50KSB7CisJCQkJCQlkb19mYWlsb3ZlciA9IDE7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlzbGF2ZS0+ZGVsYXktLTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIGxpbmsgdXAgYWdhaW4gKi8KKwkJCQlzbGF2ZS0+bGluayAgPSBCT05EX0xJTktfVVA7CisJCQkJc2xhdmUtPmppZmZpZXMgPSBqaWZmaWVzOworCQkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJCQkgICAgICAgIjogJXM6IGxpbmsgc3RhdHVzIHVwIGFnYWluIGFmdGVyICVkICIKKwkJCQkgICAgICAgIm1zIGZvciBpbnRlcmZhY2UgJXMuXG4iLAorCQkJCSAgICAgICBib25kX2Rldi0+bmFtZSwKKwkJCQkgICAgICAgKGJvbmQtPnBhcmFtcy5kb3duZGVsYXkgLSBzbGF2ZS0+ZGVsYXkpICogYm9uZC0+cGFyYW1zLm1paW1vbiwKKwkJCQkgICAgICAgc2xhdmVfZGV2LT5uYW1lKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEJPTkRfTElOS19ET1dOOgkvKiB0aGUgbGluayB3YXMgZG93biAqLworCQkJaWYgKGxpbmtfc3RhdGUgIT0gQk1TUl9MU1RBVFVTKSB7CisJCQkJLyogdGhlIGxpbmsgc3RheXMgZG93biwgbm90aGluZyBtb3JlIHRvIGRvICovCisJCQkJYnJlYWs7CisJCQl9IGVsc2UgewkvKiBsaW5rIGdvaW5nIHVwICovCisJCQkJc2xhdmUtPmxpbmsgID0gQk9ORF9MSU5LX0JBQ0s7CisJCQkJc2xhdmUtPmRlbGF5ID0gYm9uZC0+cGFyYW1zLnVwZGVsYXk7CisKKwkJCQlpZiAoYm9uZC0+cGFyYW1zLnVwZGVsYXkpIHsKKwkJCQkJLyogaWYgdXBkZWxheSA9PSAwLCBubyBuZWVkIHRvCisJCQkJCSAgIGFkdmVydGlzZSBhYm91dCBhIDAgbXMgZGVsYXkgKi8KKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCQkJCQkgICAgICAgIjogJXM6IGxpbmsgc3RhdHVzIHVwIGZvciAiCisJCQkJCSAgICAgICAiaW50ZXJmYWNlICVzLCBlbmFibGluZyBpdCAiCisJCQkJCSAgICAgICAiaW4gJWQgbXMuXG4iLAorCQkJCQkgICAgICAgYm9uZF9kZXYtPm5hbWUsCisJCQkJCSAgICAgICBzbGF2ZV9kZXYtPm5hbWUsCisJCQkJCSAgICAgICBib25kLT5wYXJhbXMudXBkZWxheSAqIGJvbmQtPnBhcmFtcy5taWltb24pOworCQkJCX0KKwkJCX0KKwkJCS8qIG5vIGJyZWFrICEgZmFsbCB0aHJvdWdoIHRoZSBCT05EX0xJTktfQkFDSyBzdGF0ZSBpbgorCQkJICAgY2FzZSB0aGVyZSdzIHNvbWV0aGluZyB0byBkby4KKwkJCSovCisJCWNhc2UgQk9ORF9MSU5LX0JBQ0s6CS8qIHRoZSBsaW5rIGhhcyBqdXN0IGNvbWUgYmFjayAqLworCQkJaWYgKGxpbmtfc3RhdGUgIT0gQk1TUl9MU1RBVFVTKSB7CisJCQkJLyogbGluayBkb3duIGFnYWluICovCisJCQkJc2xhdmUtPmxpbmsgID0gQk9ORF9MSU5LX0RPV047CisKKwkJCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCQkJICAgICAgICI6ICVzOiBsaW5rIHN0YXR1cyBkb3duIGFnYWluIGFmdGVyICVkICIKKwkJCQkgICAgICAgIm1zIGZvciBpbnRlcmZhY2UgJXMuXG4iLAorCQkJCSAgICAgICBib25kX2Rldi0+bmFtZSwKKwkJCQkgICAgICAgKGJvbmQtPnBhcmFtcy51cGRlbGF5IC0gc2xhdmUtPmRlbGF5KSAqIGJvbmQtPnBhcmFtcy5taWltb24sCisJCQkJICAgICAgIHNsYXZlX2Rldi0+bmFtZSk7CisJCQl9IGVsc2UgeworCQkJCS8qIGxpbmsgc3RheXMgdXAgKi8KKwkJCQlpZiAoc2xhdmUtPmRlbGF5ID09IDApIHsKKwkJCQkJLyogbm93IHRoZSBsaW5rIGhhcyBiZWVuIHVwIGZvciBsb25nIHRpbWUgZW5vdWdoICovCisJCQkJCXNsYXZlLT5saW5rID0gQk9ORF9MSU5LX1VQOworCQkJCQlzbGF2ZS0+amlmZmllcyA9IGppZmZpZXM7CisKKwkJCQkJaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpIHsKKwkJCQkJCS8qIHByZXZlbnQgaXQgZnJvbSBiZWluZyB0aGUgYWN0aXZlIG9uZSAqLworCQkJCQkJc2xhdmUtPnN0YXRlID0gQk9ORF9TVEFURV9CQUNLVVA7CisJCQkJCX0gZWxzZSBpZiAoYm9uZC0+cGFyYW1zLm1vZGUgIT0gQk9ORF9NT0RFX0FDVElWRUJBQ0tVUCkgeworCQkJCQkJLyogbWFrZSBpdCBpbW1lZGlhdGVseSBhY3RpdmUgKi8KKwkJCQkJCXNsYXZlLT5zdGF0ZSA9IEJPTkRfU1RBVEVfQUNUSVZFOworCQkJCQl9IGVsc2UgaWYgKHNsYXZlICE9IGJvbmQtPnByaW1hcnlfc2xhdmUpIHsKKwkJCQkJCS8qIHByZXZlbnQgaXQgZnJvbSBiZWluZyB0aGUgYWN0aXZlIG9uZSAqLworCQkJCQkJc2xhdmUtPnN0YXRlID0gQk9ORF9TVEFURV9CQUNLVVA7CisJCQkJCX0KKworCQkJCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCQkJCSAgICAgICAiOiAlczogbGluayBzdGF0dXMgZGVmaW5pdGVseSAiCisJCQkJCSAgICAgICAidXAgZm9yIGludGVyZmFjZSAlcy5cbiIsCisJCQkJCSAgICAgICBib25kX2Rldi0+bmFtZSwKKwkJCQkJICAgICAgIHNsYXZlX2Rldi0+bmFtZSk7CisKKwkJCQkJLyogbm90aWZ5IGFkIHRoYXQgdGhlIGxpbmsgc3RhdHVzIGhhcyBjaGFuZ2VkICovCisJCQkJCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKSB7CisJCQkJCQlib25kXzNhZF9oYW5kbGVfbGlua19jaGFuZ2Uoc2xhdmUsIEJPTkRfTElOS19VUCk7CisJCQkJCX0KKworCQkJCQlpZiAoKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9UTEIpIHx8CisJCQkJCSAgICAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX0FMQikpIHsKKwkJCQkJCWJvbmRfYWxiX2hhbmRsZV9saW5rX2NoYW5nZShib25kLCBzbGF2ZSwgQk9ORF9MSU5LX1VQKTsKKwkJCQkJfQorCisJCQkJCWlmICgoIW9sZGN1cnJlbnQpIHx8CisJCQkJCSAgICAoc2xhdmUgPT0gYm9uZC0+cHJpbWFyeV9zbGF2ZSkpIHsKKwkJCQkJCWRvX2ZhaWxvdmVyID0gMTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXNsYXZlLT5kZWxheS0tOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogU2hvdWxkIG5vdCBoYXBwZW4gKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiYm9uZGluZzogRXJyb3I6ICVzICBJbGxlZ2FsIHZhbHVlIChsaW5rPSVkKVxuIiwKKwkJCSAgICAgICBzbGF2ZS0+ZGV2LT5uYW1lLCBzbGF2ZS0+bGluayk7CisJCQlnb3RvIG91dDsKKwkJfSAvKiBlbmQgb2Ygc3dpdGNoIChzbGF2ZS0+bGluaykgKi8KKworCQlib25kX3VwZGF0ZV9zcGVlZF9kdXBsZXgoc2xhdmUpOworCisJCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKSB7CisJCQlpZiAob2xkX3NwZWVkICE9IHNsYXZlLT5zcGVlZCkgeworCQkJCWJvbmRfM2FkX2FkYXB0ZXJfc3BlZWRfY2hhbmdlZChzbGF2ZSk7CisJCQl9CisKKwkJCWlmIChvbGRfZHVwbGV4ICE9IHNsYXZlLT5kdXBsZXgpIHsKKwkJCQlib25kXzNhZF9hZGFwdGVyX2R1cGxleF9jaGFuZ2VkKHNsYXZlKTsKKwkJCX0KKwkJfQorCisJfSAvKiBlbmQgb2YgZm9yICovCisKKwlpZiAoZG9fZmFpbG92ZXIpIHsKKwkJd3JpdGVfbG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKworCQlib25kX3NlbGVjdF9hY3RpdmVfc2xhdmUoYm9uZCk7CisKKwkJaWYgKG9sZGN1cnJlbnQgJiYgIWJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKSB7CisJCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCQkgICAgICAgIjogJXM6IG5vdyBydW5uaW5nIHdpdGhvdXQgYW55IGFjdGl2ZSAiCisJCQkgICAgICAgImludGVyZmFjZSAhXG4iLAorCQkJICAgICAgIGJvbmRfZGV2LT5uYW1lKTsKKwkJfQorCisJCXdyaXRlX3VubG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKwl9CisKK3JlX2FybToKKwlpZiAoYm9uZC0+cGFyYW1zLm1paW1vbikgeworCQltb2RfdGltZXIoJmJvbmQtPm1paV90aW1lciwgamlmZmllcyArIGRlbHRhX2luX3RpY2tzKTsKKwl9CitvdXQ6CisJcmVhZF91bmxvY2soJmJvbmQtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBib25kX2FycF9zZW5kX2FsbChzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHNsYXZlICpzbGF2ZSkKK3sKKwlpbnQgaTsKKwl1MzIgKnRhcmdldHMgPSBib25kLT5wYXJhbXMuYXJwX3RhcmdldHM7CisKKwlmb3IgKGkgPSAwOyAoaSA8IEJPTkRfTUFYX0FSUF9UQVJHRVRTKSAmJiB0YXJnZXRzW2ldOyBpKyspIHsKKwkJYXJwX3NlbmQoQVJQT1BfUkVRVUVTVCwgRVRIX1BfQVJQLCB0YXJnZXRzW2ldLCBzbGF2ZS0+ZGV2LAorCQkJIG15X2lwLCBOVUxMLCBzbGF2ZS0+ZGV2LT5kZXZfYWRkciwKKwkJCSBOVUxMKTsKKwl9Cit9CisKKy8qCisgKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCByZWd1bGFybHkgdG8gbW9uaXRvciBlYWNoIHNsYXZlJ3MgbGluaworICogZW5zdXJpbmcgdGhhdCB0cmFmZmljIGlzIGJlaW5nIHNlbnQgYW5kIHJlY2VpdmVkIHdoZW4gYXJwIG1vbml0b3JpbmcKKyAqIGlzIHVzZWQgaW4gbG9hZC1iYWxhbmNpbmcgbW9kZS4gaWYgdGhlIGFkYXB0ZXIgaGFzIGJlZW4gZG9ybWFudCwgdGhlbiBhbgorICogYXJwIGlzIHRyYW5zbWl0dGVkIHRvIGdlbmVyYXRlIHRyYWZmaWMuIHNlZSBhY3RpdmViYWNrdXBfYXJwX21vbml0b3IgZm9yCisgKiBhcnAgbW9uaXRvcmluZyBpbiBhY3RpdmUgYmFja3VwIG1vZGUuCisgKi8KK3N0YXRpYyB2b2lkIGJvbmRfbG9hZGJhbGFuY2VfYXJwX21vbihzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2Rldi0+cHJpdjsKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlLCAqb2xkY3VycmVudDsKKwlpbnQgZG9fZmFpbG92ZXIgPSAwOworCWludCBkZWx0YV9pbl90aWNrczsKKwlpbnQgaTsKKworCXJlYWRfbG9jaygmYm9uZC0+bG9jayk7CisKKwlkZWx0YV9pbl90aWNrcyA9IChib25kLT5wYXJhbXMuYXJwX2ludGVydmFsICogSFopIC8gMTAwMDsKKworCWlmIChib25kLT5raWxsX3RpbWVycykgeworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYm9uZC0+c2xhdmVfY250ID09IDApIHsKKwkJZ290byByZV9hcm07CisJfQorCisJcmVhZF9sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCW9sZGN1cnJlbnQgPSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZTsKKwlyZWFkX3VubG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKworCS8qIHNlZSBpZiBhbnkgb2YgdGhlIHByZXZpb3VzIGRldmljZXMgYXJlIHVwIG5vdyAoaS5lLiB0aGV5IGhhdmUKKwkgKiB4bXQgYW5kIHJjdiB0cmFmZmljKS4gdGhlIGN1cnJfYWN0aXZlX3NsYXZlIGRvZXMgbm90IGNvbWUgaW50bworCSAqIHRoZSBwaWN0dXJlIHVubGVzcyBpdCBpcyBudWxsLiBhbHNvLCBzbGF2ZS0+amlmZmllcyBpcyBub3QgbmVlZGVkCisJICogaGVyZSBiZWNhdXNlIHdlIHNlbmQgYW4gYXJwIG9uIGVhY2ggc2xhdmUgYW5kIGdpdmUgYSBzbGF2ZSBhcworCSAqIGxvbmcgYXMgaXQgbmVlZHMgdG8gZ2V0IHRoZSB0eC9yeCB3aXRoaW4gdGhlIGRlbHRhLgorCSAqIFRPRE86IHdoYXQgYWJvdXQgdXAvZG93biBkZWxheSBpbiBhcnAgbW9kZT8gaXQgd2Fzbid0IGhlcmUgYmVmb3JlCisJICogICAgICAgc28gaXQgY2FuIHdhaXQKKwkgKi8KKwlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7CisJCWlmIChzbGF2ZS0+bGluayAhPSBCT05EX0xJTktfVVApIHsKKwkJCWlmICgoKGppZmZpZXMgLSBzbGF2ZS0+ZGV2LT50cmFuc19zdGFydCkgPD0gZGVsdGFfaW5fdGlja3MpICYmCisJCQkgICAgKChqaWZmaWVzIC0gc2xhdmUtPmRldi0+bGFzdF9yeCkgPD0gZGVsdGFfaW5fdGlja3MpKSB7CisKKwkJCQlzbGF2ZS0+bGluayAgPSBCT05EX0xJTktfVVA7CisJCQkJc2xhdmUtPnN0YXRlID0gQk9ORF9TVEFURV9BQ1RJVkU7CisKKwkJCQkvKiBwcmltYXJ5X3NsYXZlIGhhcyBubyBtZWFuaW5nIGluIHJvdW5kLXJvYmluCisJCQkJICogbW9kZS4gdGhlIHdpbmRvdyBvZiBhIHNsYXZlIGJlaW5nIHVwIGFuZAorCQkJCSAqIGN1cnJfYWN0aXZlX3NsYXZlIGJlaW5nIG51bGwgYWZ0ZXIgZW5zbGF2aW5nCisJCQkJICogaXMgY2xvc2VkLgorCQkJCSAqLworCQkJCWlmICghb2xkY3VycmVudCkgeworCQkJCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCQkJCSAgICAgICAiOiAlczogbGluayBzdGF0dXMgZGVmaW5pdGVseSAiCisJCQkJCSAgICAgICAidXAgZm9yIGludGVyZmFjZSAlcywgIiwKKwkJCQkJICAgICAgIGJvbmRfZGV2LT5uYW1lLAorCQkJCQkgICAgICAgc2xhdmUtPmRldi0+bmFtZSk7CisJCQkJCWRvX2ZhaWxvdmVyID0gMTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCQkJCSAgICAgICAiOiAlczogaW50ZXJmYWNlICVzIGlzIG5vdyB1cFxuIiwKKwkJCQkJICAgICAgIGJvbmRfZGV2LT5uYW1lLAorCQkJCQkgICAgICAgc2xhdmUtPmRldi0+bmFtZSk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJLyogc2xhdmUtPmxpbmsgPT0gQk9ORF9MSU5LX1VQICovCisKKwkJCS8qIG5vdCBhbGwgc3dpdGNoZXMgd2lsbCByZXNwb25kIHRvIGFuIGFycCByZXF1ZXN0CisJCQkgKiB3aGVuIHRoZSBzb3VyY2UgaXAgaXMgMCwgc28gZG9uJ3QgdGFrZSB0aGUgbGluayBkb3duCisJCQkgKiBpZiB3ZSBkb24ndCBrbm93IG91ciBpcCB5ZXQKKwkJCSAqLworCQkJaWYgKCgoamlmZmllcyAtIHNsYXZlLT5kZXYtPnRyYW5zX3N0YXJ0KSA+PSAoMipkZWx0YV9pbl90aWNrcykpIHx8CisJCQkgICAgKCgoamlmZmllcyAtIHNsYXZlLT5kZXYtPmxhc3RfcngpID49ICgyKmRlbHRhX2luX3RpY2tzKSkgJiYKKwkJCSAgICAgbXlfaXApKSB7CisKKwkJCQlzbGF2ZS0+bGluayAgPSBCT05EX0xJTktfRE9XTjsKKwkJCQlzbGF2ZS0+c3RhdGUgPSBCT05EX1NUQVRFX0JBQ0tVUDsKKworCQkJCWlmIChzbGF2ZS0+bGlua19mYWlsdXJlX2NvdW50IDwgVUlOVF9NQVgpIHsKKwkJCQkJc2xhdmUtPmxpbmtfZmFpbHVyZV9jb3VudCsrOworCQkJCX0KKworCQkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJCQkgICAgICAgIjogJXM6IGludGVyZmFjZSAlcyBpcyBub3cgZG93bi5cbiIsCisJCQkJICAgICAgIGJvbmRfZGV2LT5uYW1lLAorCQkJCSAgICAgICBzbGF2ZS0+ZGV2LT5uYW1lKTsKKworCQkJCWlmIChzbGF2ZSA9PSBvbGRjdXJyZW50KSB7CisJCQkJCWRvX2ZhaWxvdmVyID0gMTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBub3RlOiBpZiBzd2l0Y2ggaXMgaW4gcm91bmQtcm9iaW4gbW9kZSwgYWxsIGxpbmtzCisJCSAqIG11c3QgdHggYXJwIHRvIGVuc3VyZSBhbGwgbGlua3MgcnggYW4gYXJwIC0gb3RoZXJ3aXNlCisJCSAqIGxpbmtzIG1heSBvc2NpbGxhdGUgb3Igbm90IGNvbWUgdXAgYXQgYWxsOyBpZiBzd2l0Y2ggaXMKKwkJICogaW4gc29tZXRoaW5nIGxpa2UgeG9yIG1vZGUsIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuCisJCSAqIGRvIC0gYWxsIHJlcGxpZXMgd2lsbCBiZSByeCdlZCBvbiBzYW1lIGxpbmsgY2F1c2luZyBzbGF2ZXMKKwkJICogdG8gYmUgdW5zdGFibGUgZHVyaW5nIGxvdy9ubyB0cmFmZmljIHBlcmlvZHMKKwkJICovCisJCWlmIChJU19VUChzbGF2ZS0+ZGV2KSkgeworCQkJYm9uZF9hcnBfc2VuZF9hbGwoYm9uZCwgc2xhdmUpOworCQl9CisJfQorCisJaWYgKGRvX2ZhaWxvdmVyKSB7CisJCXdyaXRlX2xvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisKKwkJYm9uZF9zZWxlY3RfYWN0aXZlX3NsYXZlKGJvbmQpOworCisJCWlmIChvbGRjdXJyZW50ICYmICFib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCQkJICAgICAgICI6ICVzOiBub3cgcnVubmluZyB3aXRob3V0IGFueSBhY3RpdmUgIgorCQkJICAgICAgICJpbnRlcmZhY2UgIVxuIiwKKwkJCSAgICAgICBib25kX2Rldi0+bmFtZSk7CisJCX0KKworCQl3cml0ZV91bmxvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisJfQorCityZV9hcm06CisJaWYgKGJvbmQtPnBhcmFtcy5hcnBfaW50ZXJ2YWwpIHsKKwkJbW9kX3RpbWVyKCZib25kLT5hcnBfdGltZXIsIGppZmZpZXMgKyBkZWx0YV9pbl90aWNrcyk7CisJfQorb3V0OgorCXJlYWRfdW5sb2NrKCZib25kLT5sb2NrKTsKK30KKworLyoKKyAqIFdoZW4gdXNpbmcgYXJwIG1vbml0b3JpbmcgaW4gYWN0aXZlLWJhY2t1cCBtb2RlLCB0aGlzIGZ1bmN0aW9uIGlzCisgKiBjYWxsZWQgdG8gZGV0ZXJtaW5lIGlmIGFueSBiYWNrdXAgc2xhdmVzIGhhdmUgd2VudCBkb3duIG9yIGEgbmV3CisgKiBjdXJyZW50IHNsYXZlIG5lZWRzIHRvIGJlIGZvdW5kLgorICogVGhlIGJhY2t1cCBzbGF2ZXMgbmV2ZXIgZ2VuZXJhdGUgdHJhZmZpYywgdGhleSBhcmUgY29uc2lkZXJlZCB1cCBieSBtZXJlbHkKKyAqIHJlY2VpdmluZyB0cmFmZmljLiBJZiB0aGUgY3VycmVudCBzbGF2ZSBnb2VzIGRvd24sIGVhY2ggYmFja3VwIHNsYXZlIHdpbGwKKyAqIGJlIGdpdmVuIHRoZSBvcHBvcnR1bml0eSB0byB0eC9yeCBhbiBhcnAgYmVmb3JlIGJlaW5nIHRha2VuIGRvd24gLSB0aGlzCisgKiBwcmV2ZW50cyBhbGwgc2xhdmVzIGZyb20gYmVpbmcgdGFrZW4gZG93biBkdWUgdG8gdGhlIGN1cnJlbnQgc2xhdmUgbm90CisgKiBzZW5kaW5nIGFueSB0cmFmZmljIGZvciB0aGUgYmFja3VwcyB0byByZWNlaXZlLiBUaGUgYXJwcyBhcmUgbm90IG5lY2Vzc2FyaWx5CisgKiBuZWNlc3NhcnksIGFueSB0eCBhbmQgcnggdHJhZmZpYyB3aWxsIGtlZXAgdGhlIGN1cnJlbnQgc2xhdmUgdXAuIFdoaWxlIGFueQorICogcnggdHJhZmZpYyB3aWxsIGtlZXAgdGhlIGJhY2t1cCBzbGF2ZXMgdXAsIHRoZSBjdXJyZW50IHNsYXZlIGlzIHJlc3BvbnNpYmxlCisgKiBmb3IgZ2VuZXJhdGluZyB0cmFmZmljIHRvIGtlZXAgdGhlbSB1cCByZWdhcmRsZXNzIG9mIGFueSBvdGhlciB0cmFmZmljIHRoZXkKKyAqIG1heSBoYXZlIHJlY2VpdmVkLgorICogc2VlIGxvYWRiYWxhbmNlX2FycF9tb25pdG9yIGZvciBhcnAgbW9uaXRvcmluZyBpbiBsb2FkIGJhbGFuY2luZyBtb2RlCisgKi8KK3N0YXRpYyB2b2lkIGJvbmRfYWN0aXZlYmFja3VwX2FycF9tb24oc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2KQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisJc3RydWN0IHNsYXZlICpzbGF2ZTsKKwlpbnQgZGVsdGFfaW5fdGlja3M7CisJaW50IGk7CisKKwlyZWFkX2xvY2soJmJvbmQtPmxvY2spOworCisJZGVsdGFfaW5fdGlja3MgPSAoYm9uZC0+cGFyYW1zLmFycF9pbnRlcnZhbCAqIEhaKSAvIDEwMDA7CisKKwlpZiAoYm9uZC0+a2lsbF90aW1lcnMpIHsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGJvbmQtPnNsYXZlX2NudCA9PSAwKSB7CisJCWdvdG8gcmVfYXJtOworCX0KKworCS8qIGRldGVybWluZSBpZiBhbnkgc2xhdmUgaGFzIGNvbWUgdXAgb3IgYW55IGJhY2t1cCBzbGF2ZSBoYXMKKwkgKiBnb25lIGRvd24KKwkgKiBUT0RPOiB3aGF0IGFib3V0IHVwL2Rvd24gZGVsYXkgaW4gYXJwIG1vZGU/IGl0IHdhc24ndCBoZXJlIGJlZm9yZQorCSAqICAgICAgIHNvIGl0IGNhbiB3YWl0CisJICovCisJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgeworCQlpZiAoc2xhdmUtPmxpbmsgIT0gQk9ORF9MSU5LX1VQKSB7CisJCQlpZiAoKGppZmZpZXMgLSBzbGF2ZS0+ZGV2LT5sYXN0X3J4KSA8PSBkZWx0YV9pbl90aWNrcykgeworCisJCQkJc2xhdmUtPmxpbmsgPSBCT05EX0xJTktfVVA7CisKKwkJCQl3cml0ZV9sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCisJCQkJaWYgKCghYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUpICYmCisJCQkJICAgICgoamlmZmllcyAtIHNsYXZlLT5kZXYtPnRyYW5zX3N0YXJ0KSA8PSBkZWx0YV9pbl90aWNrcykpIHsKKwkJCQkJYm9uZF9jaGFuZ2VfYWN0aXZlX3NsYXZlKGJvbmQsIHNsYXZlKTsKKwkJCQkJYm9uZC0+Y3VycmVudF9hcnBfc2xhdmUgPSBOVUxMOworCQkJCX0gZWxzZSBpZiAoYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUgIT0gc2xhdmUpIHsKKwkJCQkJLyogdGhpcyBzbGF2ZSBoYXMganVzdCBjb21lIHVwIGJ1dCB3ZQorCQkJCQkgKiBhbHJlYWR5IGhhdmUgYSBjdXJyZW50IHNsYXZlOyB0aGlzCisJCQkJCSAqIGNhbiBhbHNvIGhhcHBlbiBpZiBib25kX2Vuc2xhdmUgYWRkcworCQkJCQkgKiBhIG5ldyBzbGF2ZSB0aGF0IGlzIHVwIHdoaWxlIHdlIGFyZQorCQkJCQkgKiBzZWFyY2hpbmcgZm9yIGEgbmV3IHNsYXZlCisJCQkJCSAqLworCQkJCQlib25kX3NldF9zbGF2ZV9pbmFjdGl2ZV9mbGFncyhzbGF2ZSk7CisJCQkJCWJvbmQtPmN1cnJlbnRfYXJwX3NsYXZlID0gTlVMTDsKKwkJCQl9CisKKwkJCQlpZiAoc2xhdmUgPT0gYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUpIHsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQorCQkJCQkgICAgICAgIjogJXM6ICVzIGlzIHVwIGFuZCBub3cgdGhlICIKKwkJCQkJICAgICAgICJhY3RpdmUgaW50ZXJmYWNlXG4iLAorCQkJCQkgICAgICAgYm9uZF9kZXYtPm5hbWUsCisJCQkJCSAgICAgICBzbGF2ZS0+ZGV2LT5uYW1lKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCQkJCSAgICAgICAiOiAlczogYmFja3VwIGludGVyZmFjZSAlcyBpcyAiCisJCQkJCSAgICAgICAibm93IHVwXG4iLAorCQkJCQkgICAgICAgYm9uZF9kZXYtPm5hbWUsCisJCQkJCSAgICAgICBzbGF2ZS0+ZGV2LT5uYW1lKTsKKwkJCQl9CisKKwkJCQl3cml0ZV91bmxvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZWFkX2xvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisKKwkJCWlmICgoc2xhdmUgIT0gYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUpICYmCisJCQkgICAgKCFib25kLT5jdXJyZW50X2FycF9zbGF2ZSkgJiYKKwkJCSAgICAoKChqaWZmaWVzIC0gc2xhdmUtPmRldi0+bGFzdF9yeCkgPj0gMypkZWx0YV9pbl90aWNrcykgJiYKKwkJCSAgICAgbXlfaXApKSB7CisJCQkJLyogYSBiYWNrdXAgc2xhdmUgaGFzIGdvbmUgZG93bjsgdGhyZWUgdGltZXMKKwkJCQkgKiB0aGUgZGVsdGEgYWxsb3dzIHRoZSBjdXJyZW50IHNsYXZlIHRvIGJlCisJCQkJICogdGFrZW4gb3V0IGJlZm9yZSB0aGUgYmFja3VwIHNsYXZlLgorCQkJCSAqIG5vdGU6IGEgbm9uLW51bGwgY3VycmVudF9hcnBfc2xhdmUgaW5kaWNhdGVzCisJCQkJICogdGhlIGN1cnJfYWN0aXZlX3NsYXZlIHdlbnQgZG93biBhbmQgd2UgYXJlCisJCQkJICogc2VhcmNoaW5nIGZvciBhIG5ldyBvbmU7IHVuZGVyIHRoaXMKKwkJCQkgKiBjb25kaXRpb24gd2Ugb25seSB0YWtlIHRoZSBjdXJyX2FjdGl2ZV9zbGF2ZQorCQkJCSAqIGRvd24gLSB0aGlzIGdpdmVzIGVhY2ggc2xhdmUgYSBjaGFuY2UgdG8KKwkJCQkgKiB0eC9yeCB0cmFmZmljIGJlZm9yZSBiZWluZyB0YWtlbiBvdXQKKwkJCQkgKi8KKworCQkJCXJlYWRfdW5sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCisJCQkJc2xhdmUtPmxpbmsgID0gQk9ORF9MSU5LX0RPV047CisKKwkJCQlpZiAoc2xhdmUtPmxpbmtfZmFpbHVyZV9jb3VudCA8IFVJTlRfTUFYKSB7CisJCQkJCXNsYXZlLT5saW5rX2ZhaWx1cmVfY291bnQrKzsKKwkJCQl9CisKKwkJCQlib25kX3NldF9zbGF2ZV9pbmFjdGl2ZV9mbGFncyhzbGF2ZSk7CisKKwkJCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCQkJICAgICAgICI6ICVzOiBiYWNrdXAgaW50ZXJmYWNlICVzIGlzIG5vdyBkb3duXG4iLAorCQkJCSAgICAgICBib25kX2Rldi0+bmFtZSwKKwkJCQkgICAgICAgc2xhdmUtPmRldi0+bmFtZSk7CisJCQl9IGVsc2UgeworCQkJCXJlYWRfdW5sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCQkJfQorCQl9CisJfQorCisJcmVhZF9sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCXNsYXZlID0gYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmU7CisJcmVhZF91bmxvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisKKwlpZiAoc2xhdmUpIHsKKwkJLyogaWYgd2UgaGF2ZSBzZW50IHRyYWZmaWMgaW4gdGhlIHBhc3QgMiphcnBfaW50ZXJ2YWxzIGJ1dAorCQkgKiBoYXZlbid0IHhtaXQgYW5kIHJ4IHRyYWZmaWMgaW4gdGhhdCB0aW1lIGludGVydmFsLCBzZWxlY3QKKwkJICogYSBkaWZmZXJlbnQgc2xhdmUuIHNsYXZlLT5qaWZmaWVzIGlzIG9ubHkgdXBkYXRlZCB3aGVuCisJCSAqIGEgc2xhdmUgZmlyc3QgYmVjb21lcyB0aGUgY3Vycl9hY3RpdmVfc2xhdmUgLSBub3QgbmVjZXNzYXJpbHkKKwkJICogYWZ0ZXIgZXZlcnkgYXJwOyB0aGlzIGVuc3VyZXMgdGhlIHNsYXZlIGhhcyBhIGZ1bGwgMipkZWx0YQorCQkgKiBiZWZvcmUgYmVpbmcgdGFrZW4gb3V0LiBpZiBhIHByaW1hcnkgaXMgYmVpbmcgdXNlZCwgY2hlY2sKKwkJICogaWYgaXQgaXMgdXAgYW5kIG5lZWRzIHRvIHRha2Ugb3ZlciBhcyB0aGUgY3Vycl9hY3RpdmVfc2xhdmUKKwkJICovCisJCWlmICgoKChqaWZmaWVzIC0gc2xhdmUtPmRldi0+dHJhbnNfc3RhcnQpID49ICgyKmRlbHRhX2luX3RpY2tzKSkgfHwKKwkJICAgICAoKChqaWZmaWVzIC0gc2xhdmUtPmRldi0+bGFzdF9yeCkgPj0gKDIqZGVsdGFfaW5fdGlja3MpKSAmJgorCQkgICAgICBteV9pcCkpICYmCisJCSAgICAoKGppZmZpZXMgLSBzbGF2ZS0+amlmZmllcykgPj0gMipkZWx0YV9pbl90aWNrcykpIHsKKworCQkJc2xhdmUtPmxpbmsgID0gQk9ORF9MSU5LX0RPV047CisKKwkJCWlmIChzbGF2ZS0+bGlua19mYWlsdXJlX2NvdW50IDwgVUlOVF9NQVgpIHsKKwkJCQlzbGF2ZS0+bGlua19mYWlsdXJlX2NvdW50Kys7CisJCQl9CisKKwkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJCSAgICAgICAiOiAlczogbGluayBzdGF0dXMgZG93biBmb3IgYWN0aXZlIGludGVyZmFjZSAiCisJCQkgICAgICAgIiVzLCBkaXNhYmxpbmcgaXRcbiIsCisJCQkgICAgICAgYm9uZF9kZXYtPm5hbWUsCisJCQkgICAgICAgc2xhdmUtPmRldi0+bmFtZSk7CisKKwkJCXdyaXRlX2xvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisKKwkJCWJvbmRfc2VsZWN0X2FjdGl2ZV9zbGF2ZShib25kKTsKKwkJCXNsYXZlID0gYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmU7CisKKwkJCXdyaXRlX3VubG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKworCQkJYm9uZC0+Y3VycmVudF9hcnBfc2xhdmUgPSBzbGF2ZTsKKworCQkJaWYgKHNsYXZlKSB7CisJCQkJc2xhdmUtPmppZmZpZXMgPSBqaWZmaWVzOworCQkJfQorCQl9IGVsc2UgaWYgKChib25kLT5wcmltYXJ5X3NsYXZlKSAmJgorCQkJICAgKGJvbmQtPnByaW1hcnlfc2xhdmUgIT0gc2xhdmUpICYmCisJCQkgICAoYm9uZC0+cHJpbWFyeV9zbGF2ZS0+bGluayA9PSBCT05EX0xJTktfVVApKSB7CisJCQkvKiBhdCB0aGlzIHBvaW50LCBzbGF2ZSBpcyB0aGUgY3Vycl9hY3RpdmVfc2xhdmUgKi8KKwkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJCSAgICAgICAiOiAlczogY2hhbmdpbmcgZnJvbSBpbnRlcmZhY2UgJXMgdG8gcHJpbWFyeSAiCisJCQkgICAgICAgImludGVyZmFjZSAlc1xuIiwKKwkJCSAgICAgICBib25kX2Rldi0+bmFtZSwKKwkJCSAgICAgICBzbGF2ZS0+ZGV2LT5uYW1lLAorCQkJICAgICAgIGJvbmQtPnByaW1hcnlfc2xhdmUtPmRldi0+bmFtZSk7CisKKwkJCS8qIHByaW1hcnkgaXMgdXAgc28gc3dpdGNoIHRvIGl0ICovCisJCQl3cml0ZV9sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCQkJYm9uZF9jaGFuZ2VfYWN0aXZlX3NsYXZlKGJvbmQsIGJvbmQtPnByaW1hcnlfc2xhdmUpOworCQkJd3JpdGVfdW5sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCisJCQlzbGF2ZSA9IGJvbmQtPnByaW1hcnlfc2xhdmU7CisJCQlzbGF2ZS0+amlmZmllcyA9IGppZmZpZXM7CisJCX0gZWxzZSB7CisJCQlib25kLT5jdXJyZW50X2FycF9zbGF2ZSA9IE5VTEw7CisJCX0KKworCQkvKiB0aGUgY3VycmVudCBzbGF2ZSBtdXN0IHR4IGFuIGFycCB0byBlbnN1cmUgYmFja3VwIHNsYXZlcworCQkgKiByeCB0cmFmZmljCisJCSAqLworCQlpZiAoc2xhdmUgJiYgbXlfaXApIHsKKwkJCWJvbmRfYXJwX3NlbmRfYWxsKGJvbmQsIHNsYXZlKTsKKwkJfQorCX0KKworCS8qIGlmIHdlIGRvbid0IGhhdmUgYSBjdXJyX2FjdGl2ZV9zbGF2ZSwgc2VhcmNoIGZvciB0aGUgbmV4dCBhdmFpbGFibGUKKwkgKiBiYWNrdXAgc2xhdmUgZnJvbSB0aGUgY3VycmVudF9hcnBfc2xhdmUgYW5kIG1ha2UgaXQgdGhlIGNhbmRpZGF0ZQorCSAqIGZvciBiZWNvbWluZyB0aGUgY3Vycl9hY3RpdmVfc2xhdmUKKwkgKi8KKwlpZiAoIXNsYXZlKSB7CisJCWlmICghYm9uZC0+Y3VycmVudF9hcnBfc2xhdmUpIHsKKwkJCWJvbmQtPmN1cnJlbnRfYXJwX3NsYXZlID0gYm9uZC0+Zmlyc3Rfc2xhdmU7CisJCX0KKworCQlpZiAoYm9uZC0+Y3VycmVudF9hcnBfc2xhdmUpIHsKKwkJCWJvbmRfc2V0X3NsYXZlX2luYWN0aXZlX2ZsYWdzKGJvbmQtPmN1cnJlbnRfYXJwX3NsYXZlKTsKKworCQkJLyogc2VhcmNoIGZvciBuZXh0IGNhbmRpZGF0ZSAqLworCQkJYm9uZF9mb3JfZWFjaF9zbGF2ZV9mcm9tKGJvbmQsIHNsYXZlLCBpLCBib25kLT5jdXJyZW50X2FycF9zbGF2ZSkgeworCQkJCWlmIChJU19VUChzbGF2ZS0+ZGV2KSkgeworCQkJCQlzbGF2ZS0+bGluayA9IEJPTkRfTElOS19CQUNLOworCQkJCQlib25kX3NldF9zbGF2ZV9hY3RpdmVfZmxhZ3Moc2xhdmUpOworCQkJCQlib25kX2FycF9zZW5kX2FsbChib25kLCBzbGF2ZSk7CisJCQkJCXNsYXZlLT5qaWZmaWVzID0gamlmZmllczsKKwkJCQkJYm9uZC0+Y3VycmVudF9hcnBfc2xhdmUgPSBzbGF2ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyogaWYgdGhlIGxpbmsgc3RhdGUgaXMgdXAgYXQgdGhpcyBwb2ludCwgd2UKKwkJCQkgKiBtYXJrIGl0IGRvd24gLSB0aGlzIGNhbiBoYXBwZW4gaWYgd2UgaGF2ZQorCQkJCSAqIHNpbXVsdGFuZW91cyBsaW5rIGZhaWx1cmVzIGFuZAorCQkJCSAqIHJlc2VsZWN0X2FjdGl2ZV9pbnRlcmZhY2UgZG9lc24ndCBtYWtlIHRoaXMKKwkJCQkgKiBvbmUgdGhlIGN1cnJlbnQgc2xhdmUgc28gaXQgaXMgc3RpbGwgbWFya2VkCisJCQkJICogdXAgd2hlbiBpdCBpcyBhY3R1YWxseSBkb3duCisJCQkJICovCisJCQkJaWYgKHNsYXZlLT5saW5rID09IEJPTkRfTElOS19VUCkgeworCQkJCQlzbGF2ZS0+bGluayAgPSBCT05EX0xJTktfRE9XTjsKKwkJCQkJaWYgKHNsYXZlLT5saW5rX2ZhaWx1cmVfY291bnQgPCBVSU5UX01BWCkgeworCQkJCQkJc2xhdmUtPmxpbmtfZmFpbHVyZV9jb3VudCsrOworCQkJCQl9CisKKwkJCQkJYm9uZF9zZXRfc2xhdmVfaW5hY3RpdmVfZmxhZ3Moc2xhdmUpOworCisJCQkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJCQkJICAgICAgICI6ICVzOiBiYWNrdXAgaW50ZXJmYWNlICVzIGlzICIKKwkJCQkJICAgICAgICJub3cgZG93bi5cbiIsCisJCQkJCSAgICAgICBib25kX2Rldi0+bmFtZSwKKwkJCQkJICAgICAgIHNsYXZlLT5kZXYtPm5hbWUpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworcmVfYXJtOgorCWlmIChib25kLT5wYXJhbXMuYXJwX2ludGVydmFsKSB7CisJCW1vZF90aW1lcigmYm9uZC0+YXJwX3RpbWVyLCBqaWZmaWVzICsgZGVsdGFfaW5fdGlja3MpOworCX0KK291dDoKKwlyZWFkX3VubG9jaygmYm9uZC0+bG9jayk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByb2Mvc2VxX2ZpbGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisKKyNkZWZpbmUgU0VRX1NUQVJUX1RPS0VOICgodm9pZCAqKTEpCisKK3N0YXRpYyB2b2lkICpib25kX2luZm9fc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHNlcS0+cHJpdmF0ZTsKKwlsb2ZmX3Qgb2ZmID0gMDsKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlOworCWludCBpOworCisJLyogbWFrZSBzdXJlIHRoZSBib25kIHdvbid0IGJlIHRha2VuIGF3YXkgKi8KKwlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOworCXJlYWRfbG9ja19iaCgmYm9uZC0+bG9jayk7CisKKwlpZiAoKnBvcyA9PSAwKSB7CisJCXJldHVybiBTRVFfU1RBUlRfVE9LRU47CisJfQorCisJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgeworCQlpZiAoKytvZmYgPT0gKnBvcykgeworCQkJcmV0dXJuIHNsYXZlOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICpib25kX2luZm9fc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gc2VxLT5wcml2YXRlOworCXN0cnVjdCBzbGF2ZSAqc2xhdmUgPSB2OworCisJKysqcG9zOworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlyZXR1cm4gYm9uZC0+Zmlyc3Rfc2xhdmU7CisJfQorCisJc2xhdmUgPSBzbGF2ZS0+bmV4dDsKKworCXJldHVybiAoc2xhdmUgPT0gYm9uZC0+Zmlyc3Rfc2xhdmUpID8gTlVMTCA6IHNsYXZlOworfQorCitzdGF0aWMgdm9pZCBib25kX2luZm9fc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBzZXEtPnByaXZhdGU7CisKKwlyZWFkX3VubG9ja19iaCgmYm9uZC0+bG9jayk7CisJcmVhZF91bmxvY2soJmRldl9iYXNlX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBib25kX2luZm9fc2hvd19tYXN0ZXIoc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBzZXEtPnByaXZhdGU7CisJc3RydWN0IHNsYXZlICpjdXJyOworCisJcmVhZF9sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCWN1cnIgPSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZTsKKwlyZWFkX3VubG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKworCXNlcV9wcmludGYoc2VxLCAiQm9uZGluZyBNb2RlOiAlc1xuIiwKKwkJICAgYm9uZF9tb2RlX25hbWUoYm9uZC0+cGFyYW1zLm1vZGUpKTsKKworCWlmIChVU0VTX1BSSU1BUlkoYm9uZC0+cGFyYW1zLm1vZGUpKSB7CisJCXNlcV9wcmludGYoc2VxLCAiUHJpbWFyeSBTbGF2ZTogJXNcbiIsCisJCQkgICAoYm9uZC0+cGFyYW1zLnByaW1hcnlbMF0pID8KKwkJCSAgIAlib25kLT5wYXJhbXMucHJpbWFyeSA6ICJOb25lIik7CisKKwkJc2VxX3ByaW50ZihzZXEsICJDdXJyZW50bHkgQWN0aXZlIFNsYXZlOiAlc1xuIiwKKwkJCSAgIChjdXJyKSA/IGN1cnItPmRldi0+bmFtZSA6ICJOb25lIik7CisJfQorCisJc2VxX3ByaW50ZihzZXEsICJNSUkgU3RhdHVzOiAlc1xuIiwgKGN1cnIpID8gInVwIiA6ICJkb3duIik7CisJc2VxX3ByaW50ZihzZXEsICJNSUkgUG9sbGluZyBJbnRlcnZhbCAobXMpOiAlZFxuIiwgYm9uZC0+cGFyYW1zLm1paW1vbik7CisJc2VxX3ByaW50ZihzZXEsICJVcCBEZWxheSAobXMpOiAlZFxuIiwKKwkJICAgYm9uZC0+cGFyYW1zLnVwZGVsYXkgKiBib25kLT5wYXJhbXMubWlpbW9uKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkRvd24gRGVsYXkgKG1zKTogJWRcbiIsCisJCSAgIGJvbmQtPnBhcmFtcy5kb3duZGVsYXkgKiBib25kLT5wYXJhbXMubWlpbW9uKTsKKworCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKSB7CisJCXN0cnVjdCBhZF9pbmZvIGFkX2luZm87CisKKwkJc2VxX3B1dHMoc2VxLCAiXG44MDIuM2FkIGluZm9cbiIpOworCQlzZXFfcHJpbnRmKHNlcSwgIkxBQ1AgcmF0ZTogJXNcbiIsCisJCQkgICAoYm9uZC0+cGFyYW1zLmxhY3BfZmFzdCkgPyAiZmFzdCIgOiAic2xvdyIpOworCisJCWlmIChib25kXzNhZF9nZXRfYWN0aXZlX2FnZ19pbmZvKGJvbmQsICZhZF9pbmZvKSkgeworCQkJc2VxX3ByaW50ZihzZXEsICJib25kICVzIGhhcyBubyBhY3RpdmUgYWdncmVnYXRvclxuIiwKKwkJCQkgICBib25kLT5kZXYtPm5hbWUpOworCQl9IGVsc2UgeworCQkJc2VxX3ByaW50ZihzZXEsICJBY3RpdmUgQWdncmVnYXRvciBJbmZvOlxuIik7CisKKwkJCXNlcV9wcmludGYoc2VxLCAiXHRBZ2dyZWdhdG9yIElEOiAlZFxuIiwKKwkJCQkgICBhZF9pbmZvLmFnZ3JlZ2F0b3JfaWQpOworCQkJc2VxX3ByaW50ZihzZXEsICJcdE51bWJlciBvZiBwb3J0czogJWRcbiIsCisJCQkJICAgYWRfaW5mby5wb3J0cyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIlx0QWN0b3IgS2V5OiAlZFxuIiwKKwkJCQkgICBhZF9pbmZvLmFjdG9yX2tleSk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIlx0UGFydG5lciBLZXk6ICVkXG4iLAorCQkJCSAgIGFkX2luZm8ucGFydG5lcl9rZXkpOworCQkJc2VxX3ByaW50ZihzZXEsICJcdFBhcnRuZXIgTWFjIEFkZHJlc3M6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCSAgIGFkX2luZm8ucGFydG5lcl9zeXN0ZW1bMF0sCisJCQkJICAgYWRfaW5mby5wYXJ0bmVyX3N5c3RlbVsxXSwKKwkJCQkgICBhZF9pbmZvLnBhcnRuZXJfc3lzdGVtWzJdLAorCQkJCSAgIGFkX2luZm8ucGFydG5lcl9zeXN0ZW1bM10sCisJCQkJICAgYWRfaW5mby5wYXJ0bmVyX3N5c3RlbVs0XSwKKwkJCQkgICBhZF9pbmZvLnBhcnRuZXJfc3lzdGVtWzVdKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYm9uZF9pbmZvX3Nob3dfc2xhdmUoc3RydWN0IHNlcV9maWxlICpzZXEsIGNvbnN0IHN0cnVjdCBzbGF2ZSAqc2xhdmUpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBzZXEtPnByaXZhdGU7CisKKwlzZXFfcHJpbnRmKHNlcSwgIlxuU2xhdmUgSW50ZXJmYWNlOiAlc1xuIiwgc2xhdmUtPmRldi0+bmFtZSk7CisJc2VxX3ByaW50ZihzZXEsICJNSUkgU3RhdHVzOiAlc1xuIiwKKwkJICAgKHNsYXZlLT5saW5rID09IEJPTkRfTElOS19VUCkgPyAgInVwIiA6ICJkb3duIik7CisJc2VxX3ByaW50ZihzZXEsICJMaW5rIEZhaWx1cmUgQ291bnQ6ICVkXG4iLAorCQkgICBzbGF2ZS0+bGlua19mYWlsdXJlX2NvdW50KTsKKworCWlmIChhcHBfYWJpX3ZlciA+PSAxKSB7CisJCXNlcV9wcmludGYoc2VxLAorCQkJICAgIlBlcm1hbmVudCBIVyBhZGRyOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCSAgIHNsYXZlLT5wZXJtX2h3YWRkclswXSwKKwkJCSAgIHNsYXZlLT5wZXJtX2h3YWRkclsxXSwKKwkJCSAgIHNsYXZlLT5wZXJtX2h3YWRkclsyXSwKKwkJCSAgIHNsYXZlLT5wZXJtX2h3YWRkclszXSwKKwkJCSAgIHNsYXZlLT5wZXJtX2h3YWRkcls0XSwKKwkJCSAgIHNsYXZlLT5wZXJtX2h3YWRkcls1XSk7CisJfQorCisJaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpIHsKKwkJY29uc3Qgc3RydWN0IGFnZ3JlZ2F0b3IgKmFnZworCQkJPSBTTEFWRV9BRF9JTkZPKHNsYXZlKS5wb3J0LmFnZ3JlZ2F0b3I7CisKKwkJaWYgKGFnZykgeworCQkJc2VxX3ByaW50ZihzZXEsICJBZ2dyZWdhdG9yIElEOiAlZFxuIiwKKwkJCQkgICBhZ2ctPmFnZ3JlZ2F0b3JfaWRlbnRpZmllcik7CisJCX0gZWxzZSB7CisJCQlzZXFfcHV0cyhzZXEsICJBZ2dyZWdhdG9yIElEOiBOL0FcbiIpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGJvbmRfaW5mb19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJc2VxX3ByaW50ZihzZXEsICIlc1xuIiwgdmVyc2lvbik7CisJCWJvbmRfaW5mb19zaG93X21hc3RlcihzZXEpOworCX0gZWxzZSB7CisJCWJvbmRfaW5mb19zaG93X3NsYXZlKHNlcSwgdik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgYm9uZF9pbmZvX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gYm9uZF9pbmZvX3NlcV9zdGFydCwKKwkubmV4dCAgPSBib25kX2luZm9fc2VxX25leHQsCisJLnN0b3AgID0gYm9uZF9pbmZvX3NlcV9zdG9wLAorCS5zaG93ICA9IGJvbmRfaW5mb19zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgYm9uZF9pbmZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICpzZXE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jOworCWludCByZXM7CisKKwlyZXMgPSBzZXFfb3BlbihmaWxlLCAmYm9uZF9pbmZvX3NlcV9vcHMpOworCWlmICghcmVzKSB7CisJCS8qIHJlY292ZXIgdGhlIHBvaW50ZXIgYnVyaWVkIGluIHByb2NfZGlyX2VudHJ5IGRhdGEgKi8KKwkJc2VxID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQlwcm9jID0gUERFKGlub2RlKTsKKwkJc2VxLT5wcml2YXRlID0gcHJvYy0+ZGF0YTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBib25kX2luZm9fZm9wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gYm9uZF9pbmZvX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBib25kX2NyZWF0ZV9wcm9jX2VudHJ5KHN0cnVjdCBib25kaW5nICpib25kKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldiA9IGJvbmQtPmRldjsKKworCWlmIChib25kX3Byb2NfZGlyKSB7CisJCWJvbmQtPnByb2NfZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShib25kX2Rldi0+bmFtZSwKKwkJCQkJCSAgICAgU19JUlVHTywKKwkJCQkJCSAgICAgYm9uZF9wcm9jX2Rpcik7CisJCWlmIChib25kLT5wcm9jX2VudHJ5ID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJCSAgICAgICAiOiBXYXJuaW5nOiBDYW5ub3QgY3JlYXRlIC9wcm9jL25ldC8lcy8lc1xuIiwKKwkJCSAgICAgICBEUlZfTkFNRSwgYm9uZF9kZXYtPm5hbWUpOworCQl9IGVsc2UgeworCQkJYm9uZC0+cHJvY19lbnRyeS0+ZGF0YSA9IGJvbmQ7CisJCQlib25kLT5wcm9jX2VudHJ5LT5wcm9jX2ZvcHMgPSAmYm9uZF9pbmZvX2ZvcHM7CisJCQlib25kLT5wcm9jX2VudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCQkJbWVtY3B5KGJvbmQtPnByb2NfZmlsZV9uYW1lLCBib25kX2Rldi0+bmFtZSwgSUZOQU1TSVopOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJvbmRfcmVtb3ZlX3Byb2NfZW50cnkoc3RydWN0IGJvbmRpbmcgKmJvbmQpCit7CisJaWYgKGJvbmRfcHJvY19kaXIgJiYgYm9uZC0+cHJvY19lbnRyeSkgeworCQlyZW1vdmVfcHJvY19lbnRyeShib25kLT5wcm9jX2ZpbGVfbmFtZSwgYm9uZF9wcm9jX2Rpcik7CisJCW1lbXNldChib25kLT5wcm9jX2ZpbGVfbmFtZSwgMCwgSUZOQU1TSVopOworCQlib25kLT5wcm9jX2VudHJ5ID0gTlVMTDsKKwl9Cit9CisKKy8qIENyZWF0ZSB0aGUgYm9uZGluZyBkaXJlY3RvcnkgdW5kZXIgL3Byb2MvbmV0LCBpZiBkb2Vzbid0IGV4aXN0IHlldC4KKyAqIENhbGxlciBtdXN0IGhvbGQgcnRubF9sb2NrLgorICovCitzdGF0aWMgdm9pZCBib25kX2NyZWF0ZV9wcm9jX2Rpcih2b2lkKQoreworCWludCBsZW4gPSBzdHJsZW4oRFJWX05BTUUpOworCisJZm9yIChib25kX3Byb2NfZGlyID0gcHJvY19uZXQtPnN1YmRpcjsgYm9uZF9wcm9jX2RpcjsKKwkgICAgIGJvbmRfcHJvY19kaXIgPSBib25kX3Byb2NfZGlyLT5uZXh0KSB7CisJCWlmICgoYm9uZF9wcm9jX2Rpci0+bmFtZWxlbiA9PSBsZW4pICYmCisJCSAgICAhbWVtY21wKGJvbmRfcHJvY19kaXItPm5hbWUsIERSVl9OQU1FLCBsZW4pKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghYm9uZF9wcm9jX2RpcikgeworCQlib25kX3Byb2NfZGlyID0gcHJvY19ta2RpcihEUlZfTkFNRSwgcHJvY19uZXQpOworCQlpZiAoYm9uZF9wcm9jX2RpcikgeworCQkJYm9uZF9wcm9jX2Rpci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJCQkiOiBXYXJuaW5nOiBjYW5ub3QgY3JlYXRlIC9wcm9jL25ldC8lc1xuIiwKKwkJCQlEUlZfTkFNRSk7CisJCX0KKwl9Cit9CisKKy8qIERlc3Ryb3kgdGhlIGJvbmRpbmcgZGlyZWN0b3J5IHVuZGVyIC9wcm9jL25ldCwgaWYgZW1wdHkuCisgKiBDYWxsZXIgbXVzdCBob2xkIHJ0bmxfbG9jay4KKyAqLworc3RhdGljIHZvaWQgYm9uZF9kZXN0cm95X3Byb2NfZGlyKHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZTsKKworCWlmICghYm9uZF9wcm9jX2RpcikgeworCQlyZXR1cm47CisJfQorCisJLyogdmVyaWZ5IHRoYXQgdGhlIC9wcm9jIGRpciBpcyBlbXB0eSAqLworCWZvciAoZGUgPSBib25kX3Byb2NfZGlyLT5zdWJkaXI7IGRlOyBkZSA9IGRlLT5uZXh0KSB7CisJCS8qIGlnbm9yZSAuIGFuZCAuLiAqLworCQlpZiAoKihkZS0+bmFtZSkgIT0gJy4nKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChkZSkgeworCQlpZiAoYm9uZF9wcm9jX2Rpci0+b3duZXIgPT0gVEhJU19NT0RVTEUpIHsKKwkJCWJvbmRfcHJvY19kaXItPm93bmVyID0gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KERSVl9OQU1FLCBwcm9jX25ldCk7CisJCWJvbmRfcHJvY19kaXIgPSBOVUxMOworCX0KK30KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG5ldGRldiBldmVudCBoYW5kbGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBDaGFuZ2UgZGV2aWNlIG5hbWUKKyAqLworc3RhdGljIGludCBib25kX2V2ZW50X2NoYW5nZW5hbWUoc3RydWN0IGJvbmRpbmcgKmJvbmQpCit7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlib25kX3JlbW92ZV9wcm9jX2VudHJ5KGJvbmQpOworCWJvbmRfY3JlYXRlX3Byb2NfZW50cnkoYm9uZCk7CisjZW5kaWYKKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIGludCBib25kX21hc3Rlcl9uZXRkZXZfZXZlbnQodW5zaWduZWQgbG9uZyBldmVudCwgc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2KQoreworCXN0cnVjdCBib25kaW5nICpldmVudF9ib25kID0gYm9uZF9kZXYtPnByaXY7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBORVRERVZfQ0hBTkdFTkFNRToKKwkJcmV0dXJuIGJvbmRfZXZlbnRfY2hhbmdlbmFtZShldmVudF9ib25kKTsKKwljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgorCQkvKgorCQkgKiBUT0RPOiByZW1vdmUgYSBib25kIGZyb20gdGhlIGxpc3Q/CisJCSAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBpbnQgYm9uZF9zbGF2ZV9uZXRkZXZfZXZlbnQodW5zaWduZWQgbG9uZyBldmVudCwgc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYgPSBzbGF2ZV9kZXYtPm1hc3RlcjsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgorCQlpZiAoYm9uZF9kZXYpIHsKKwkJCWJvbmRfcmVsZWFzZShib25kX2Rldiwgc2xhdmVfZGV2KTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5FVERFVl9DSEFOR0U6CisJCS8qCisJCSAqIFRPRE86IGlzIHRoaXMgd2hhdCB3ZSBnZXQgaWYgc29tZWJvZHkKKwkJICogc2V0cyB1cCBhIGhpZXJhcmNoaWNhbCBib25kLCB0aGVuIHJtbW9kJ3MKKwkJICogb25lIG9mIHRoZSBzbGF2ZSBib25kaW5nIGRldmljZXM/CisJCSAqLworCQlicmVhazsKKwljYXNlIE5FVERFVl9ET1dOOgorCQkvKgorCQkgKiAuLi4gT3IgaXMgaXQgdGhpcz8KKwkJICovCisJCWJyZWFrOworCWNhc2UgTkVUREVWX0NIQU5HRU1UVToKKwkJLyoKKwkJICogVE9ETzogU2hvdWxkIHNsYXZlcyBiZSBhbGxvd2VkIHRvCisJCSAqIGluZGVwZW5kZW50bHkgYWx0ZXIgdGhlaXIgTVRVPyAgRm9yCisJCSAqIGFuIGFjdGl2ZS1iYWNrdXAgYm9uZCwgc2xhdmVzIG5lZWQKKwkJICogbm90IGJlIHRoZSBzYW1lIHR5cGUgb2YgZGV2aWNlLCBzbworCQkgKiBNVFVzIG1heSB2YXJ5LiAgRm9yIG90aGVyIG1vZGVzLAorCQkgKiBzbGF2ZXMgYXJndWFibHkgc2hvdWxkIGhhdmUgdGhlCisJCSAqIHNhbWUgTVRVcy4gVG8gZG8gdGhpcywgd2UnZCBuZWVkIHRvCisJCSAqIHRha2Ugb3ZlciB0aGUgc2xhdmUncyBjaGFuZ2VfbXR1CisJCSAqIGZ1bmN0aW9uIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlaXIKKwkJICogc2Vydml0dWRlLgorCQkgKi8KKwkJYnJlYWs7CisJY2FzZSBORVRERVZfQ0hBTkdFTkFNRToKKwkJLyoKKwkJICogVE9ETzogaGFuZGxlIGNoYW5naW5nIHRoZSBwcmltYXJ5J3MgbmFtZQorCQkgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKgorICogYm9uZF9uZXRkZXZfZXZlbnQ6IGhhbmRsZSBuZXRkZXYgbm90aWZpZXIgY2hhaW4gZXZlbnRzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVjZWl2ZXMgZXZlbnRzIGZvciB0aGUgbmV0ZGV2IGNoYWluLiAgVGhlIGNhbGxlciAoYW4KKyAqIGlvY3RsIGhhbmRsZXIgY2FsbGluZyBub3RpZmllcl9jYWxsX2NoYWluKSBob2xkcyB0aGUgbmVjZXNzYXJ5CisgKiBsb2NrcyBmb3IgdXMgdG8gc2FmZWx5IG1hbmlwdWxhdGUgdGhlIHNsYXZlIGRldmljZXMgKFJUTkwgbG9jaywKKyAqIGRldl9wcm9iZV9sb2NrKS4KKyAqLworc3RhdGljIGludCBib25kX25ldGRldl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZXZlbnRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopcHRyOworCisJZHByaW50aygiZXZlbnRfZGV2OiAlcywgZXZlbnQ6ICVseFxuIiwKKwkJKGV2ZW50X2RldiA/IGV2ZW50X2Rldi0+bmFtZSA6ICJOb25lIiksCisJCWV2ZW50KTsKKworCWlmIChldmVudF9kZXYtPmZsYWdzICYgSUZGX01BU1RFUikgeworCQlkcHJpbnRrKCJJRkZfTUFTVEVSXG4iKTsKKwkJcmV0dXJuIGJvbmRfbWFzdGVyX25ldGRldl9ldmVudChldmVudCwgZXZlbnRfZGV2KTsKKwl9CisKKwlpZiAoZXZlbnRfZGV2LT5mbGFncyAmIElGRl9TTEFWRSkgeworCQlkcHJpbnRrKCJJRkZfU0xBVkVcbiIpOworCQlyZXR1cm4gYm9uZF9zbGF2ZV9uZXRkZXZfZXZlbnQoZXZlbnQsIGV2ZW50X2Rldik7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGJvbmRfbmV0ZGV2X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gYm9uZF9uZXRkZXZfZXZlbnQsCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhY2tldCB0eXBlIGhhbmRsaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHJlZ2lzdGVyIHRvIHJlY2VpdmUgbGFjcGR1cyBvbiBhIGJvbmQgKi8KK3N0YXRpYyB2b2lkIGJvbmRfcmVnaXN0ZXJfbGFjcGR1KHN0cnVjdCBib25kaW5nICpib25kKQoreworCXN0cnVjdCBwYWNrZXRfdHlwZSAqcGtfdHlwZSA9ICYoQk9ORF9BRF9JTkZPKGJvbmQpLmFkX3BrdF90eXBlKTsKKworCS8qIGluaXRpYWxpemUgcGFja2V0IHR5cGUgKi8KKwlwa190eXBlLT50eXBlID0gUEtUX1RZUEVfTEFDUERVOworCXBrX3R5cGUtPmRldiA9IGJvbmQtPmRldjsKKwlwa190eXBlLT5mdW5jID0gYm9uZF8zYWRfbGFjcGR1X3JlY3Y7CisKKwlkZXZfYWRkX3BhY2socGtfdHlwZSk7Cit9CisKKy8qIHVucmVnaXN0ZXIgdG8gcmVjZWl2ZSBsYWNwZHVzIG9uIGEgYm9uZCAqLworc3RhdGljIHZvaWQgYm9uZF91bnJlZ2lzdGVyX2xhY3BkdShzdHJ1Y3QgYm9uZGluZyAqYm9uZCkKK3sKKwlkZXZfcmVtb3ZlX3BhY2soJihCT05EX0FEX0lORk8oYm9uZCkuYWRfcGt0X3R5cGUpKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEZXZpY2UgZW50cnkgcG9pbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IGJvbmRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2Rldi0+cHJpdjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCAqbWlpX3RpbWVyID0gJmJvbmQtPm1paV90aW1lcjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCAqYXJwX3RpbWVyID0gJmJvbmQtPmFycF90aW1lcjsKKworCWJvbmQtPmtpbGxfdGltZXJzID0gMDsKKworCWlmICgoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX1RMQikgfHwKKwkgICAgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV9BTEIpKSB7CisJCXN0cnVjdCB0aW1lcl9saXN0ICphbGJfdGltZXIgPSAmKEJPTkRfQUxCX0lORk8oYm9uZCkuYWxiX3RpbWVyKTsKKworCQkvKiBib25kX2FsYl9pbml0aWFsaXplIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgdGltZXIKKwkJICogaXMgc3RhcnRlZC4KKwkJICovCisJCWlmIChib25kX2FsYl9pbml0aWFsaXplKGJvbmQsIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUxCKSkpIHsKKwkJCS8qIHNvbWV0aGluZyB3ZW50IHdyb25nIC0gZmFpbCB0aGUgb3BlbiBvcGVyYXRpb24gKi8KKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWluaXRfdGltZXIoYWxiX3RpbWVyKTsKKwkJYWxiX3RpbWVyLT5leHBpcmVzICA9IGppZmZpZXMgKyAxOworCQlhbGJfdGltZXItPmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpYm9uZDsKKwkJYWxiX3RpbWVyLT5mdW5jdGlvbiA9ICh2b2lkICopJmJvbmRfYWxiX21vbml0b3I7CisJCWFkZF90aW1lcihhbGJfdGltZXIpOworCX0KKworCWlmIChib25kLT5wYXJhbXMubWlpbW9uKSB7ICAvKiBsaW5rIGNoZWNrIGludGVydmFsLCBpbiBtaWxsaXNlY29uZHMuICovCisJCWluaXRfdGltZXIobWlpX3RpbWVyKTsKKwkJbWlpX3RpbWVyLT5leHBpcmVzICA9IGppZmZpZXMgKyAxOworCQltaWlfdGltZXItPmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpYm9uZF9kZXY7CisJCW1paV90aW1lci0+ZnVuY3Rpb24gPSAodm9pZCAqKSZib25kX21paV9tb25pdG9yOworCQlhZGRfdGltZXIobWlpX3RpbWVyKTsKKwl9CisKKwlpZiAoYm9uZC0+cGFyYW1zLmFycF9pbnRlcnZhbCkgeyAgLyogYXJwIGludGVydmFsLCBpbiBtaWxsaXNlY29uZHMuICovCisJCWluaXRfdGltZXIoYXJwX3RpbWVyKTsKKwkJYXJwX3RpbWVyLT5leHBpcmVzICA9IGppZmZpZXMgKyAxOworCQlhcnBfdGltZXItPmRhdGEgICAgID0gKHVuc2lnbmVkIGxvbmcpYm9uZF9kZXY7CisJCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUNUSVZFQkFDS1VQKSB7CisJCQlhcnBfdGltZXItPmZ1bmN0aW9uID0gKHZvaWQgKikmYm9uZF9hY3RpdmViYWNrdXBfYXJwX21vbjsKKwkJfSBlbHNlIHsKKwkJCWFycF90aW1lci0+ZnVuY3Rpb24gPSAodm9pZCAqKSZib25kX2xvYWRiYWxhbmNlX2FycF9tb247CisJCX0KKwkJYWRkX3RpbWVyKGFycF90aW1lcik7CisJfQorCisJaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpIHsKKwkJc3RydWN0IHRpbWVyX2xpc3QgKmFkX3RpbWVyID0gJihCT05EX0FEX0lORk8oYm9uZCkuYWRfdGltZXIpOworCQlpbml0X3RpbWVyKGFkX3RpbWVyKTsKKwkJYWRfdGltZXItPmV4cGlyZXMgID0gamlmZmllcyArIDE7CisJCWFkX3RpbWVyLT5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKWJvbmQ7CisJCWFkX3RpbWVyLT5mdW5jdGlvbiA9ICh2b2lkICopJmJvbmRfM2FkX3N0YXRlX21hY2hpbmVfaGFuZGxlcjsKKwkJYWRkX3RpbWVyKGFkX3RpbWVyKTsKKworCQkvKiByZWdpc3RlciB0byByZWNlaXZlIExBQ1BEVXMgKi8KKwkJYm9uZF9yZWdpc3Rlcl9sYWNwZHUoYm9uZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYm9uZF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2Rldi0+cHJpdjsKKworCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKSB7CisJCS8qIFVucmVnaXN0ZXIgdGhlIHJlY2VpdmUgb2YgTEFDUERVcyAqLworCQlib25kX3VucmVnaXN0ZXJfbGFjcGR1KGJvbmQpOworCX0KKworCXdyaXRlX2xvY2tfYmgoJmJvbmQtPmxvY2spOworCisJYm9uZF9tY19saXN0X2Rlc3Ryb3koYm9uZCk7CisKKwkvKiBzaWduYWwgdGltZXJzIG5vdCB0byByZS1hcm0gKi8KKwlib25kLT5raWxsX3RpbWVycyA9IDE7CisKKwl3cml0ZV91bmxvY2tfYmgoJmJvbmQtPmxvY2spOworCisJLyogZGVsX3RpbWVyX3N5bmMgbXVzdCBydW4gd2l0aG91dCBob2xkaW5nIHRoZSBib25kLT5sb2NrCisJICogYmVjYXVzZSBhIHJ1bm5pbmcgdGltZXIgbWlnaHQgYmUgdHJ5aW5nIHRvIGhvbGQgaXQgdG9vCisJICovCisKKwlpZiAoYm9uZC0+cGFyYW1zLm1paW1vbikgeyAgLyogbGluayBjaGVjayBpbnRlcnZhbCwgaW4gbWlsbGlzZWNvbmRzLiAqLworCQlkZWxfdGltZXJfc3luYygmYm9uZC0+bWlpX3RpbWVyKTsKKwl9CisKKwlpZiAoYm9uZC0+cGFyYW1zLmFycF9pbnRlcnZhbCkgeyAgLyogYXJwIGludGVydmFsLCBpbiBtaWxsaXNlY29uZHMuICovCisJCWRlbF90aW1lcl9zeW5jKCZib25kLT5hcnBfdGltZXIpOworCX0KKworCXN3aXRjaCAoYm9uZC0+cGFyYW1zLm1vZGUpIHsKKwljYXNlIEJPTkRfTU9ERV84MDIzQUQ6CisJCWRlbF90aW1lcl9zeW5jKCYoQk9ORF9BRF9JTkZPKGJvbmQpLmFkX3RpbWVyKSk7CisJCWJyZWFrOworCWNhc2UgQk9ORF9NT0RFX1RMQjoKKwljYXNlIEJPTkRfTU9ERV9BTEI6CisJCWRlbF90aW1lcl9zeW5jKCYoQk9ORF9BTEJfSU5GTyhib25kKS5hbGJfdGltZXIpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogUmVsZWFzZSB0aGUgYm9uZGVkIHNsYXZlcyAqLworCWJvbmRfcmVsZWFzZV9hbGwoYm9uZF9kZXYpOworCisJaWYgKChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfVExCKSB8fAorCSAgICAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFX0FMQikpIHsKKwkJLyogTXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBhbGwKKwkJICogc2xhdmVzIGhhdmUgYmVlbiByZWxlYXNlZAorCQkgKi8KKwkJYm9uZF9hbGJfZGVpbml0aWFsaXplKGJvbmQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmJvbmRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldikKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZGV2LT5wcml2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICYoYm9uZC0+c3RhdHMpLCAqc3N0YXRzOworCXN0cnVjdCBzbGF2ZSAqc2xhdmU7CisJaW50IGk7CisKKwltZW1zZXQoc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCisJcmVhZF9sb2NrX2JoKCZib25kLT5sb2NrKTsKKworCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGkpIHsKKwkJc3N0YXRzID0gc2xhdmUtPmRldi0+Z2V0X3N0YXRzKHNsYXZlLT5kZXYpOworCisJCXN0YXRzLT5yeF9wYWNrZXRzICs9IHNzdGF0cy0+cnhfcGFja2V0czsKKwkJc3RhdHMtPnJ4X2J5dGVzICs9IHNzdGF0cy0+cnhfYnl0ZXM7CisJCXN0YXRzLT5yeF9lcnJvcnMgKz0gc3N0YXRzLT5yeF9lcnJvcnM7CisJCXN0YXRzLT5yeF9kcm9wcGVkICs9IHNzdGF0cy0+cnhfZHJvcHBlZDsKKworCQlzdGF0cy0+dHhfcGFja2V0cyArPSBzc3RhdHMtPnR4X3BhY2tldHM7CisJCXN0YXRzLT50eF9ieXRlcyArPSBzc3RhdHMtPnR4X2J5dGVzOworCQlzdGF0cy0+dHhfZXJyb3JzICs9IHNzdGF0cy0+dHhfZXJyb3JzOworCQlzdGF0cy0+dHhfZHJvcHBlZCArPSBzc3RhdHMtPnR4X2Ryb3BwZWQ7CisKKwkJc3RhdHMtPm11bHRpY2FzdCArPSBzc3RhdHMtPm11bHRpY2FzdDsKKwkJc3RhdHMtPmNvbGxpc2lvbnMgKz0gc3N0YXRzLT5jb2xsaXNpb25zOworCisJCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzICs9IHNzdGF0cy0+cnhfbGVuZ3RoX2Vycm9yczsKKwkJc3RhdHMtPnJ4X292ZXJfZXJyb3JzICs9IHNzdGF0cy0+cnhfb3Zlcl9lcnJvcnM7CisJCXN0YXRzLT5yeF9jcmNfZXJyb3JzICs9IHNzdGF0cy0+cnhfY3JjX2Vycm9yczsKKwkJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycyArPSBzc3RhdHMtPnJ4X2ZyYW1lX2Vycm9yczsKKwkJc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzICs9IHNzdGF0cy0+cnhfZmlmb19lcnJvcnM7CisJCXN0YXRzLT5yeF9taXNzZWRfZXJyb3JzICs9IHNzdGF0cy0+cnhfbWlzc2VkX2Vycm9yczsKKworCQlzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMgKz0gc3N0YXRzLT50eF9hYm9ydGVkX2Vycm9yczsKKwkJc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzICs9IHNzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnM7CisJCXN0YXRzLT50eF9maWZvX2Vycm9ycyArPSBzc3RhdHMtPnR4X2ZpZm9fZXJyb3JzOworCQlzdGF0cy0+dHhfaGVhcnRiZWF0X2Vycm9ycyArPSBzc3RhdHMtPnR4X2hlYXJ0YmVhdF9lcnJvcnM7CisJCXN0YXRzLT50eF93aW5kb3dfZXJyb3JzICs9IHNzdGF0cy0+dHhfd2luZG93X2Vycm9yczsKKwl9CisKKwlyZWFkX3VubG9ja19iaCgmYm9uZC0+bG9jayk7CisKKwlyZXR1cm4gc3RhdHM7Cit9CisKK3N0YXRpYyBpbnQgYm9uZF9kb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXYgPSBOVUxMOworCXN0cnVjdCBpZmJvbmQga19iaW5mbzsKKwlzdHJ1Y3QgaWZib25kIF9fdXNlciAqdV9iaW5mbyA9IE5VTEw7CisJc3RydWN0IGlmc2xhdmUga19zaW5mbzsKKwlzdHJ1Y3QgaWZzbGF2ZSBfX3VzZXIgKnVfc2luZm8gPSBOVUxMOworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqbWlpID0gTlVMTDsKKwlpbnQgcHJldl9hYmlfdmVyID0gb3JpZ19hcHBfYWJpX3ZlcjsKKwlpbnQgcmVzID0gMDsKKworCWRwcmludGsoImJvbmRfaW9jdGw6IG1hc3Rlcj0lcywgY21kPSVkXG4iLAorCQlib25kX2Rldi0+bmFtZSwgY21kKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DRVRIVE9PTDoKKwkJcmV0dXJuIGJvbmRfZXRodG9vbF9pb2N0bChib25kX2RldiwgaWZyKTsKKwljYXNlIFNJT0NHTUlJUEhZOgorCQltaWkgPSBpZl9taWkoaWZyKTsKKwkJaWYgKCFtaWkpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCW1paS0+cGh5X2lkID0gMDsKKwkJLyogRmFsbCBUaHJvdWdoICovCisJY2FzZSBTSU9DR01JSVJFRzoKKwkJLyoKKwkJICogV2UgZG8gdGhpcyBhZ2FpbiBqdXN0IGluIGNhc2Ugd2Ugd2VyZSBjYWxsZWQgYnkgU0lPQ0dNSUlSRUcKKwkJICogaW5zdGVhZCBvZiBTSU9DR01JSVBIWS4KKwkJICovCisJCW1paSA9IGlmX21paShpZnIpOworCQlpZiAoIW1paSkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAobWlpLT5yZWdfbnVtID09IDEpIHsKKwkJCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisJCQltaWktPnZhbF9vdXQgPSAwOworCQkJcmVhZF9sb2NrX2JoKCZib25kLT5sb2NrKTsKKwkJCXJlYWRfbG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKwkJCWlmIChib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSkgeworCQkJCW1paS0+dmFsX291dCA9IEJNU1JfTFNUQVRVUzsKKwkJCX0KKwkJCXJlYWRfdW5sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCQkJcmVhZF91bmxvY2tfYmgoJmJvbmQtPmxvY2spOworCQl9CisKKwkJcmV0dXJuIDA7CisJY2FzZSBCT05EX0lORk9fUVVFUllfT0xEOgorCWNhc2UgU0lPQ0JPTkRJTkZPUVVFUlk6CisJCXVfYmluZm8gPSAoc3RydWN0IGlmYm9uZCBfX3VzZXIgKilpZnItPmlmcl9kYXRhOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigma19iaW5mbywgdV9iaW5mbywgc2l6ZW9mKGlmYm9uZCkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXJlcyA9IGJvbmRfaW5mb19xdWVyeShib25kX2RldiwgJmtfYmluZm8pOworCQlpZiAocmVzID09IDApIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIodV9iaW5mbywgJmtfYmluZm8sIHNpemVvZihpZmJvbmQpKSkgeworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJlczsKKwljYXNlIEJPTkRfU0xBVkVfSU5GT19RVUVSWV9PTEQ6CisJY2FzZSBTSU9DQk9ORFNMQVZFSU5GT1FVRVJZOgorCQl1X3NpbmZvID0gKHN0cnVjdCBpZnNsYXZlIF9fdXNlciAqKWlmci0+aWZyX2RhdGE7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZrX3NpbmZvLCB1X3NpbmZvLCBzaXplb2YoaWZzbGF2ZSkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXJlcyA9IGJvbmRfc2xhdmVfaW5mb19xdWVyeShib25kX2RldiwgJmtfc2luZm8pOworCQlpZiAocmVzID09IDApIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIodV9zaW5mbywgJmtfc2luZm8sIHNpemVvZihpZnNsYXZlKSkpIHsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXM7CisJZGVmYXVsdDoKKwkJLyogR28gb24gKi8KKwkJYnJlYWs7CisJfQorCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJaWYgKG9yaWdfYXBwX2FiaV92ZXIgPT0gLTEpIHsKKwkJLyogbm8gb3JpZ19hcHBfYWJpX3ZlciB3YXMgcHJvdmlkZWQgeWV0LCBzbyB3ZSdsbCB1c2UgdGhlCisJCSAqIGN1cnJlbnQgb25lIGZyb20gbm93IG9uLCBldmVuIGlmIGl0J3MgMAorCQkgKi8KKwkJb3JpZ19hcHBfYWJpX3ZlciA9IGFwcF9hYmlfdmVyOworCisJfSBlbHNlIGlmIChvcmlnX2FwcF9hYmlfdmVyICE9IGFwcF9hYmlfdmVyKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkgICAgICAgIjogRXJyb3I6IGFscmVhZHkgdXNpbmcgaWZlbnNsYXZlIEFCSSB2ZXJzaW9uICVkOyB0byAiCisJCSAgICAgICAidXBncmFkZSBpZmVuc2xhdmUgdG8gdmVyc2lvbiAlZCwgeW91IG11c3QgZmlyc3QgIgorCQkgICAgICAgInJlbG9hZCBib25kaW5nLlxuIiwKKwkJICAgICAgIG9yaWdfYXBwX2FiaV92ZXIsIGFwcF9hYmlfdmVyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2xhdmVfZGV2ID0gZGV2X2dldF9ieV9uYW1lKGlmci0+aWZyX3NsYXZlKTsKKworCWRwcmludGsoInNsYXZlX2Rldj0lcDogXG4iLCBzbGF2ZV9kZXYpOworCisJaWYgKCFzbGF2ZV9kZXYpIHsKKwkJcmVzID0gLUVOT0RFVjsKKwl9IGVsc2UgeworCQlkcHJpbnRrKCJzbGF2ZV9kZXYtPm5hbWU9JXM6IFxuIiwgc2xhdmVfZGV2LT5uYW1lKTsKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBCT05EX0VOU0xBVkVfT0xEOgorCQljYXNlIFNJT0NCT05ERU5TTEFWRToKKwkJCXJlcyA9IGJvbmRfZW5zbGF2ZShib25kX2Rldiwgc2xhdmVfZGV2KTsKKwkJCWJyZWFrOworCQljYXNlIEJPTkRfUkVMRUFTRV9PTEQ6CisJCWNhc2UgU0lPQ0JPTkRSRUxFQVNFOgorCQkJcmVzID0gYm9uZF9yZWxlYXNlKGJvbmRfZGV2LCBzbGF2ZV9kZXYpOworCQkJYnJlYWs7CisJCWNhc2UgQk9ORF9TRVRIV0FERFJfT0xEOgorCQljYXNlIFNJT0NCT05EU0VUSFdBRERSOgorCQkJcmVzID0gYm9uZF9zZXRod2FkZHIoYm9uZF9kZXYsIHNsYXZlX2Rldik7CisJCQlicmVhazsKKwkJY2FzZSBCT05EX0NIQU5HRV9BQ1RJVkVfT0xEOgorCQljYXNlIFNJT0NCT05EQ0hBTkdFQUNUSVZFOgorCQkJcmVzID0gYm9uZF9pb2N0bF9jaGFuZ2VfYWN0aXZlKGJvbmRfZGV2LCBzbGF2ZV9kZXYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXMgPSAtRU9QTk9UU1VQUDsKKwkJfQorCisJCWRldl9wdXQoc2xhdmVfZGV2KTsKKwl9CisKKwlpZiAocmVzIDwgMCkgeworCQkvKiBUaGUgaW9jdGwgZmFpbGVkLCBzbyB0aGVyZSdzIG5vIHBvaW50IGluIGNoYW5naW5nIHRoZQorCQkgKiBvcmlnX2FwcF9hYmlfdmVyLiBXZSdsbCByZXN0b3JlIGl0J3MgdmFsdWUganVzdCBpbiBjYXNlCisJCSAqIHdlJ3ZlIGNoYW5nZWQgaXQgZWFybGllciBpbiB0aGlzIGZ1bmN0aW9uLgorCQkgKi8KKwkJb3JpZ19hcHBfYWJpX3ZlciA9IHByZXZfYWJpX3ZlcjsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBib25kX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2Rldi0+cHJpdjsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaTsKKworCXdyaXRlX2xvY2tfYmgoJmJvbmQtPmxvY2spOworCisJLyoKKwkgKiBEbyBwcm9taXNjIGJlZm9yZSBjaGVja2luZyBtdWx0aWNhc3RfbW9kZQorCSAqLworCWlmICgoYm9uZF9kZXYtPmZsYWdzICYgSUZGX1BST01JU0MpICYmICEoYm9uZC0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykpIHsKKwkJYm9uZF9zZXRfcHJvbWlzY3VpdHkoYm9uZCwgMSk7CisJfQorCisJaWYgKCEoYm9uZF9kZXYtPmZsYWdzICYgSUZGX1BST01JU0MpICYmIChib25kLT5mbGFncyAmIElGRl9QUk9NSVNDKSkgeworCQlib25kX3NldF9wcm9taXNjdWl0eShib25kLCAtMSk7CisJfQorCisJLyogc2V0IGFsbG11bHRpIGZsYWcgdG8gc2xhdmVzICovCisJaWYgKChib25kX2Rldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpICYmICEoYm9uZC0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCWJvbmRfc2V0X2FsbG11bHRpKGJvbmQsIDEpOworCX0KKworCWlmICghKGJvbmRfZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgJiYgKGJvbmQtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQlib25kX3NldF9hbGxtdWx0aShib25kLCAtMSk7CisJfQorCisJYm9uZC0+ZmxhZ3MgPSBib25kX2Rldi0+ZmxhZ3M7CisKKwkvKiBsb29raW5nIGZvciBhZGRyZXNzZXMgdG8gYWRkIHRvIHNsYXZlcycgbWMgbGlzdCAqLworCWZvciAoZG1pID0gYm9uZF9kZXYtPm1jX2xpc3Q7IGRtaTsgZG1pID0gZG1pLT5uZXh0KSB7CisJCWlmICghYm9uZF9tY19saXN0X2ZpbmRfZG1pKGRtaSwgYm9uZC0+bWNfbGlzdCkpIHsKKwkJCWJvbmRfbWNfYWRkKGJvbmQsIGRtaS0+ZG1pX2FkZHIsIGRtaS0+ZG1pX2FkZHJsZW4pOworCQl9CisJfQorCisJLyogbG9va2luZyBmb3IgYWRkcmVzc2VzIHRvIGRlbGV0ZSBmcm9tIHNsYXZlcycgbGlzdCAqLworCWZvciAoZG1pID0gYm9uZC0+bWNfbGlzdDsgZG1pOyBkbWkgPSBkbWktPm5leHQpIHsKKwkJaWYgKCFib25kX21jX2xpc3RfZmluZF9kbWkoZG1pLCBib25kX2Rldi0+bWNfbGlzdCkpIHsKKwkJCWJvbmRfbWNfZGVsZXRlKGJvbmQsIGRtaS0+ZG1pX2FkZHIsIGRtaS0+ZG1pX2FkZHJsZW4pOworCQl9CisJfQorCisJLyogc2F2ZSBtYXN0ZXIncyBtdWx0aWNhc3QgbGlzdCAqLworCWJvbmRfbWNfbGlzdF9kZXN0cm95KGJvbmQpOworCWJvbmRfbWNfbGlzdF9jb3B5KGJvbmRfZGV2LT5tY19saXN0LCBib25kLCBHRlBfQVRPTUlDKTsKKworCXdyaXRlX3VubG9ja19iaCgmYm9uZC0+bG9jayk7Cit9CisKKy8qCisgKiBDaGFuZ2UgdGhlIE1UVSBvZiBhbGwgb2YgYSBtYXN0ZXIncyBzbGF2ZXMgdG8gbWF0Y2ggdGhlIG1hc3RlcgorICovCitzdGF0aWMgaW50IGJvbmRfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisJc3RydWN0IHNsYXZlICpzbGF2ZSwgKnN0b3BfYXQ7CisJaW50IHJlcyA9IDA7CisJaW50IGk7CisKKwlkcHJpbnRrKCJib25kPSVwLCBuYW1lPSVzLCBuZXdfbXR1PSVkXG4iLCBib25kLAorCQkoYm9uZF9kZXYgPyBib25kX2Rldi0+bmFtZSA6ICJOb25lIiksIG5ld19tdHUpOworCisJLyogQ2FuJ3QgaG9sZCBib25kLT5sb2NrIHdpdGggYmggZGlzYWJsZWQgaGVyZSBzaW5jZQorCSAqIHNvbWUgYmFzZSBkcml2ZXJzIHBhbmljLiBPbiB0aGUgb3RoZXIgaGFuZCB3ZSBjYW4ndAorCSAqIGhvbGQgYm9uZC0+bG9jayB3aXRob3V0IGJoIGRpc2FibGVkIGJlY2F1c2Ugd2UnbGwKKwkgKiBkZWFkbG9jay4gVGhlIG9ubHkgc29sdXRpb24gaXMgdG8gcmVseSBvbiB0aGUgZmFjdAorCSAqIHRoYXQgd2UncmUgdW5kZXIgcnRubF9sb2NrIGhlcmUsIGFuZCB0aGUgc2xhdmVzCisJICogbGlzdCB3b24ndCBjaGFuZ2UuIFRoaXMgZG9lc24ndCBzb2x2ZSB0aGUgcHJvYmxlbQorCSAqIG9mIHNldHRpbmcgdGhlIHNsYXZlJ3MgTVRVIHdoaWxlIGl0IGlzCisJICogdHJhbnNtaXR0aW5nLCBidXQgdGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGUgYmFzZQorCSAqIGRyaXZlciBjYW4gaGFuZGxlIHRoYXQuCisJICoKKwkgKiBUT0RPOiBmaWd1cmUgb3V0IGEgd2F5IHRvIHNhZmVseSBpdGVyYXRlIHRoZSBzbGF2ZXMKKwkgKiBsaXN0LCBidXQgd2l0aG91dCBob2xkaW5nIGEgbG9jayBhcm91bmQgdGhlIGFjdHVhbAorCSAqIGNhbGwgdG8gdGhlIGJhc2UgZHJpdmVyLgorCSAqLworCisJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgeworCQlkcHJpbnRrKCJzICVwIHMtPnAgJXAgY19tICVwXG4iLCBzbGF2ZSwKKwkJCXNsYXZlLT5wcmV2LCBzbGF2ZS0+ZGV2LT5jaGFuZ2VfbXR1KTsKKwkJcmVzID0gZGV2X3NldF9tdHUoc2xhdmUtPmRldiwgbmV3X210dSk7CisKKwkJaWYgKHJlcykgeworCQkJLyogSWYgd2UgZmFpbGVkIHRvIHNldCB0aGUgc2xhdmUncyBtdHUgdG8gdGhlIG5ldyB2YWx1ZQorCQkJICogd2UgbXVzdCBhYm9ydCB0aGUgb3BlcmF0aW9uIGV2ZW4gaW4gQUNUSVZFX0JBQ0tVUAorCQkJICogbW9kZSwgYmVjYXVzZSBpZiB3ZSBhbGxvdyB0aGUgYmFja3VwIHNsYXZlcyB0byBoYXZlCisJCQkgKiBkaWZmZXJlbnQgbXR1IHZhbHVlcyB0aGFuIHRoZSBhY3RpdmUgc2xhdmUgd2UnbGwKKwkJCSAqIG5lZWQgdG8gY2hhbmdlIHRoZWlyIG10dSB3aGVuIGRvaW5nIGEgZmFpbG92ZXIuIFRoYXQKKwkJCSAqIG1lYW5zIGNoYW5naW5nIHRoZWlyIG10dSBmcm9tIHRpbWVyIGNvbnRleHQsIHdoaWNoCisJCQkgKiBpcyBwcm9iYWJseSBub3QgYSBnb29kIGlkZWEuCisJCQkgKi8KKwkJCWRwcmludGsoImVyciAlZCAlc1xuIiwgcmVzLCBzbGF2ZS0+ZGV2LT5uYW1lKTsKKwkJCWdvdG8gdW53aW5kOworCQl9CisJfQorCisJYm9uZF9kZXYtPm10dSA9IG5ld19tdHU7CisKKwlyZXR1cm4gMDsKKwordW53aW5kOgorCS8qIHVud2luZCBmcm9tIGhlYWQgdG8gdGhlIHNsYXZlIHRoYXQgZmFpbGVkICovCisJc3RvcF9hdCA9IHNsYXZlOworCWJvbmRfZm9yX2VhY2hfc2xhdmVfZnJvbV90byhib25kLCBzbGF2ZSwgaSwgYm9uZC0+Zmlyc3Rfc2xhdmUsIHN0b3BfYXQpIHsKKwkJaW50IHRtcF9yZXM7CisKKwkJdG1wX3JlcyA9IGRldl9zZXRfbXR1KHNsYXZlLT5kZXYsIGJvbmRfZGV2LT5tdHUpOworCQlpZiAodG1wX3JlcykgeworCQkJZHByaW50aygidW53aW5kIGVyciAlZCBkZXYgJXNcbiIsIHRtcF9yZXMsCisJCQkJc2xhdmUtPmRldi0+bmFtZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogQ2hhbmdlIEhXIGFkZHJlc3MKKyAqCisgKiBOb3RlIHRoYXQgbWFueSBkZXZpY2VzIG11c3QgYmUgZG93biB0byBjaGFuZ2UgdGhlIEhXIGFkZHJlc3MsIGFuZAorICogZG93bmluZyB0aGUgbWFzdGVyIHJlbGVhc2VzIGFsbCBzbGF2ZXMuICBXZSBjYW4gbWFrZSBib25kcyBmdWxsIG9mCisgKiBib25kaW5nIGRldmljZXMgdG8gdGVzdCB0aGlzLCBob3dldmVyLgorICovCitzdGF0aWMgaW50IGJvbmRfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2Rldiwgdm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZGV2LT5wcml2OworCXN0cnVjdCBzb2NrYWRkciAqc2EgPSBhZGRyLCB0bXBfc2E7CisJc3RydWN0IHNsYXZlICpzbGF2ZSwgKnN0b3BfYXQ7CisJaW50IHJlcyA9IDA7CisJaW50IGk7CisKKwlkcHJpbnRrKCJib25kPSVwLCBuYW1lPSVzXG4iLCBib25kLCAoYm9uZF9kZXYgPyBib25kX2Rldi0+bmFtZSA6ICJOb25lIikpOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKHNhLT5zYV9kYXRhKSkgeworCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisJfQorCisJLyogQ2FuJ3QgaG9sZCBib25kLT5sb2NrIHdpdGggYmggZGlzYWJsZWQgaGVyZSBzaW5jZQorCSAqIHNvbWUgYmFzZSBkcml2ZXJzIHBhbmljLiBPbiB0aGUgb3RoZXIgaGFuZCB3ZSBjYW4ndAorCSAqIGhvbGQgYm9uZC0+bG9jayB3aXRob3V0IGJoIGRpc2FibGVkIGJlY2F1c2Ugd2UnbGwKKwkgKiBkZWFkbG9jay4gVGhlIG9ubHkgc29sdXRpb24gaXMgdG8gcmVseSBvbiB0aGUgZmFjdAorCSAqIHRoYXQgd2UncmUgdW5kZXIgcnRubF9sb2NrIGhlcmUsIGFuZCB0aGUgc2xhdmVzCisJICogbGlzdCB3b24ndCBjaGFuZ2UuIFRoaXMgZG9lc24ndCBzb2x2ZSB0aGUgcHJvYmxlbQorCSAqIG9mIHNldHRpbmcgdGhlIHNsYXZlJ3MgaHcgYWRkcmVzcyB3aGlsZSBpdCBpcworCSAqIHRyYW5zbWl0dGluZywgYnV0IHRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlIGJhc2UKKwkgKiBkcml2ZXIgY2FuIGhhbmRsZSB0aGF0LgorCSAqCisJICogVE9ETzogZmlndXJlIG91dCBhIHdheSB0byBzYWZlbHkgaXRlcmF0ZSB0aGUgc2xhdmVzCisJICogbGlzdCwgYnV0IHdpdGhvdXQgaG9sZGluZyBhIGxvY2sgYXJvdW5kIHRoZSBhY3R1YWwKKwkgKiBjYWxsIHRvIHRoZSBiYXNlIGRyaXZlci4KKwkgKi8KKworCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGkpIHsKKwkJZHByaW50aygic2xhdmUgJXAgJXNcbiIsIHNsYXZlLCBzbGF2ZS0+ZGV2LT5uYW1lKTsKKworCQlpZiAoc2xhdmUtPmRldi0+c2V0X21hY19hZGRyZXNzID09IE5VTEwpIHsKKwkJCXJlcyA9IC1FT1BOT1RTVVBQOworCQkJZHByaW50aygiRU9QTk9UU1VQUCAlc1xuIiwgc2xhdmUtPmRldi0+bmFtZSk7CisJCQlnb3RvIHVud2luZDsKKwkJfQorCisJCXJlcyA9IGRldl9zZXRfbWFjX2FkZHJlc3Moc2xhdmUtPmRldiwgYWRkcik7CisJCWlmIChyZXMpIHsKKwkJCS8qIFRPRE86IGNvbnNpZGVyIGRvd25pbmcgdGhlIHNsYXZlCisJCQkgKiBhbmQgcmV0cnkgPworCQkJICogVXNlciBzaG91bGQgZXhwZWN0IGNvbW11bmljYXRpb25zCisJCQkgKiBicmVha2FnZSBhbnl3YXkgdW50aWwgQVJQIGZpbmlzaAorCQkJICogdXBkYXRpbmcsIHNvLi4uCisJCQkgKi8KKwkJCWRwcmludGsoImVyciAlZCAlc1xuIiwgcmVzLCBzbGF2ZS0+ZGV2LT5uYW1lKTsKKwkJCWdvdG8gdW53aW5kOworCQl9CisJfQorCisJLyogc3VjY2VzcyAqLworCW1lbWNweShib25kX2Rldi0+ZGV2X2FkZHIsIHNhLT5zYV9kYXRhLCBib25kX2Rldi0+YWRkcl9sZW4pOworCXJldHVybiAwOworCit1bndpbmQ6CisJbWVtY3B5KHRtcF9zYS5zYV9kYXRhLCBib25kX2Rldi0+ZGV2X2FkZHIsIGJvbmRfZGV2LT5hZGRyX2xlbik7CisJdG1wX3NhLnNhX2ZhbWlseSA9IGJvbmRfZGV2LT50eXBlOworCisJLyogdW53aW5kIGZyb20gaGVhZCB0byB0aGUgc2xhdmUgdGhhdCBmYWlsZWQgKi8KKwlzdG9wX2F0ID0gc2xhdmU7CisJYm9uZF9mb3JfZWFjaF9zbGF2ZV9mcm9tX3RvKGJvbmQsIHNsYXZlLCBpLCBib25kLT5maXJzdF9zbGF2ZSwgc3RvcF9hdCkgeworCQlpbnQgdG1wX3JlczsKKworCQl0bXBfcmVzID0gZGV2X3NldF9tYWNfYWRkcmVzcyhzbGF2ZS0+ZGV2LCAmdG1wX3NhKTsKKwkJaWYgKHRtcF9yZXMpIHsKKwkJCWRwcmludGsoInVud2luZCBlcnIgJWQgZGV2ICVzXG4iLCB0bXBfcmVzLAorCQkJCXNsYXZlLT5kZXYtPm5hbWUpOworCQl9CisJfQorCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBib25kX3htaXRfcm91bmRyb2JpbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2Rldi0+cHJpdjsKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlLCAqc3RhcnRfYXQ7CisJaW50IGk7CisJaW50IHJlcyA9IDE7CisKKwlyZWFkX2xvY2soJmJvbmQtPmxvY2spOworCisJaWYgKCFCT05EX0lTX09LKGJvbmQpKSB7CisJCWdvdG8gb3V0OworCX0KKworCXJlYWRfbG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKwlzbGF2ZSA9IHN0YXJ0X2F0ID0gYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmU7CisJcmVhZF91bmxvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisKKwlpZiAoIXNsYXZlKSB7CisJCWdvdG8gb3V0OworCX0KKworCWJvbmRfZm9yX2VhY2hfc2xhdmVfZnJvbShib25kLCBzbGF2ZSwgaSwgc3RhcnRfYXQpIHsKKwkJaWYgKElTX1VQKHNsYXZlLT5kZXYpICYmCisJCSAgICAoc2xhdmUtPmxpbmsgPT0gQk9ORF9MSU5LX1VQKSAmJgorCQkgICAgKHNsYXZlLT5zdGF0ZSA9PSBCT05EX1NUQVRFX0FDVElWRSkpIHsKKwkJCXJlcyA9IGJvbmRfZGV2X3F1ZXVlX3htaXQoYm9uZCwgc2tiLCBzbGF2ZS0+ZGV2KTsKKworCQkJd3JpdGVfbG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKwkJCWJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlID0gc2xhdmUtPm5leHQ7CisJCQl3cml0ZV91bmxvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisKKwkJCWJyZWFrOworCQl9CisJfQorCisKK291dDoKKwlpZiAocmVzKSB7CisJCS8qIG5vIHN1aXRhYmxlIGludGVyZmFjZSwgZnJhbWUgbm90IHNlbnQgKi8KKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0KKwlyZWFkX3VubG9jaygmYm9uZC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpbiBhY3RpdmUtYmFja3VwIG1vZGUsIHdlIGtub3cgdGhhdCBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSBpcyBhbHdheXMgdmFsaWQgaWYKKyAqIHRoZSBib25kIGhhcyBhIHVzYWJsZSBpbnRlcmZhY2UuCisgKi8KK3N0YXRpYyBpbnQgYm9uZF94bWl0X2FjdGl2ZWJhY2t1cChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYpCit7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2Rldi0+cHJpdjsKKwlpbnQgcmVzID0gMTsKKworCS8qIGlmIHdlIGFyZSBzZW5kaW5nIGFycCBwYWNrZXRzLCB0cnkgdG8gYXQgbGVhc3QKKwkgICBpZGVudGlmeSBvdXIgb3duIGlwIGFkZHJlc3MgKi8KKwlpZiAoYm9uZC0+cGFyYW1zLmFycF9pbnRlcnZhbCAmJiAhbXlfaXAgJiYKKwkJKHNrYi0+cHJvdG9jb2wgPT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9BUlApKSkgeworCQljaGFyICp0aGVfaXAgPSAoY2hhciAqKXNrYi0+ZGF0YSArCisJCQkJc2l6ZW9mKHN0cnVjdCBldGhoZHIpICsKKwkJCQlzaXplb2Yoc3RydWN0IGFycGhkcikgKworCQkJCUVUSF9BTEVOOworCQltZW1jcHkoJm15X2lwLCB0aGVfaXAsIDQpOworCX0KKworCXJlYWRfbG9jaygmYm9uZC0+bG9jayk7CisJcmVhZF9sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCisJaWYgKCFCT05EX0lTX09LKGJvbmQpKSB7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZSkgeyAvKiBvbmUgdXNhYmxlIGludGVyZmFjZSAqLworCQlyZXMgPSBib25kX2Rldl9xdWV1ZV94bWl0KGJvbmQsIHNrYiwgYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUtPmRldik7CisJfQorCitvdXQ6CisJaWYgKHJlcykgeworCQkvKiBubyBzdWl0YWJsZSBpbnRlcmZhY2UsIGZyYW1lIG5vdCBzZW50ICovCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9CisJcmVhZF91bmxvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisJcmVhZF91bmxvY2soJmJvbmQtPmxvY2spOworCXJldHVybiAwOworfQorCisvKgorICogaW4gWE9SIG1vZGUsIHdlIGRldGVybWluZSB0aGUgb3V0cHV0IGRldmljZSBieSBwZXJmb3JtaW5nIHhvciBvbgorICogdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gaHcgYWRyZXNzZXMuICBJZiB0aGlzIGRldmljZSBpcyBub3QKKyAqIGVuYWJsZWQsIGZpbmQgdGhlIG5leHQgc2xhdmUgZm9sbG93aW5nIHRoaXMgeG9yIHNsYXZlLgorICovCitzdGF0aWMgaW50IGJvbmRfeG1pdF94b3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2KQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisJc3RydWN0IGV0aGhkciAqZGF0YSA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOworCXN0cnVjdCBzbGF2ZSAqc2xhdmUsICpzdGFydF9hdDsKKwlpbnQgc2xhdmVfbm87CisJaW50IGk7CisJaW50IHJlcyA9IDE7CisKKwlyZWFkX2xvY2soJmJvbmQtPmxvY2spOworCisJaWYgKCFCT05EX0lTX09LKGJvbmQpKSB7CisJCWdvdG8gb3V0OworCX0KKworCXNsYXZlX25vID0gKGRhdGEtPmhfZGVzdFs1XV5ib25kX2Rldi0+ZGV2X2FkZHJbNV0pICUgYm9uZC0+c2xhdmVfY250OworCisJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgeworCQlzbGF2ZV9uby0tOworCQlpZiAoc2xhdmVfbm8gPCAwKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCXN0YXJ0X2F0ID0gc2xhdmU7CisKKwlib25kX2Zvcl9lYWNoX3NsYXZlX2Zyb20oYm9uZCwgc2xhdmUsIGksIHN0YXJ0X2F0KSB7CisJCWlmIChJU19VUChzbGF2ZS0+ZGV2KSAmJgorCQkgICAgKHNsYXZlLT5saW5rID09IEJPTkRfTElOS19VUCkgJiYKKwkJICAgIChzbGF2ZS0+c3RhdGUgPT0gQk9ORF9TVEFURV9BQ1RJVkUpKSB7CisJCQlyZXMgPSBib25kX2Rldl9xdWV1ZV94bWl0KGJvbmQsIHNrYiwgc2xhdmUtPmRldik7CisJCQlicmVhazsKKwkJfQorCX0KKworb3V0OgorCWlmIChyZXMpIHsKKwkJLyogbm8gc3VpdGFibGUgaW50ZXJmYWNlLCBmcmFtZSBub3Qgc2VudCAqLworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfQorCXJlYWRfdW5sb2NrKCZib25kLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGluIGJyb2FkY2FzdCBtb2RlLCB3ZSBzZW5kIGV2ZXJ5dGhpbmcgdG8gYWxsIHVzYWJsZSBpbnRlcmZhY2VzLgorICovCitzdGF0aWMgaW50IGJvbmRfeG1pdF9icm9hZGNhc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2KQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisJc3RydWN0IHNsYXZlICpzbGF2ZSwgKnN0YXJ0X2F0OworCXN0cnVjdCBuZXRfZGV2aWNlICp0eF9kZXYgPSBOVUxMOworCWludCBpOworCWludCByZXMgPSAxOworCisJcmVhZF9sb2NrKCZib25kLT5sb2NrKTsKKworCWlmICghQk9ORF9JU19PSyhib25kKSkgeworCQlnb3RvIG91dDsKKwl9CisKKwlyZWFkX2xvY2soJmJvbmQtPmN1cnJfc2xhdmVfbG9jayk7CisJc3RhcnRfYXQgPSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZTsKKwlyZWFkX3VubG9jaygmYm9uZC0+Y3Vycl9zbGF2ZV9sb2NrKTsKKworCWlmICghc3RhcnRfYXQpIHsKKwkJZ290byBvdXQ7CisJfQorCisJYm9uZF9mb3JfZWFjaF9zbGF2ZV9mcm9tKGJvbmQsIHNsYXZlLCBpLCBzdGFydF9hdCkgeworCQlpZiAoSVNfVVAoc2xhdmUtPmRldikgJiYKKwkJICAgIChzbGF2ZS0+bGluayA9PSBCT05EX0xJTktfVVApICYmCisJCSAgICAoc2xhdmUtPnN0YXRlID09IEJPTkRfU1RBVEVfQUNUSVZFKSkgeworCQkJaWYgKHR4X2RldikgeworCQkJCXN0cnVjdCBza19idWZmICpza2IyID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJCQkJaWYgKCFza2IyKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkJCQkgICAgICAgIjogRXJyb3I6IGJvbmRfeG1pdF9icm9hZGNhc3QoKTogIgorCQkJCQkgICAgICAgInNrYl9jbG9uZSgpIGZhaWxlZFxuIik7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCXJlcyA9IGJvbmRfZGV2X3F1ZXVlX3htaXQoYm9uZCwgc2tiMiwgdHhfZGV2KTsKKwkJCQlpZiAocmVzKSB7CisJCQkJCWRldl9rZnJlZV9za2Ioc2tiMik7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCXR4X2RldiA9IHNsYXZlLT5kZXY7CisJCX0KKwl9CisKKwlpZiAodHhfZGV2KSB7CisJCXJlcyA9IGJvbmRfZGV2X3F1ZXVlX3htaXQoYm9uZCwgc2tiLCB0eF9kZXYpOworCX0KKworb3V0OgorCWlmIChyZXMpIHsKKwkJLyogbm8gc3VpdGFibGUgaW50ZXJmYWNlLCBmcmFtZSBub3Qgc2VudCAqLworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfQorCS8qIGZyYW1lIHNlbnQgdG8gYWxsIHN1aXRhYmxlIGludGVyZmFjZXMgKi8KKwlyZWFkX3VubG9jaygmYm9uZC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEZXZpY2UgaW5pdGlhbGl6YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIHNldCBib25kIG1vZGUgc3BlY2lmaWMgbmV0IGRldmljZSBvcGVyYXRpb25zCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBib25kX3NldF9tb2RlX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYsIGludCBtb2RlKQoreworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQk9ORF9NT0RFX1JPVU5EUk9CSU46CisJCWJvbmRfZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBib25kX3htaXRfcm91bmRyb2JpbjsKKwkJYnJlYWs7CisJY2FzZSBCT05EX01PREVfQUNUSVZFQkFDS1VQOgorCQlib25kX2Rldi0+aGFyZF9zdGFydF94bWl0ID0gYm9uZF94bWl0X2FjdGl2ZWJhY2t1cDsKKwkJYnJlYWs7CisJY2FzZSBCT05EX01PREVfWE9SOgorCQlib25kX2Rldi0+aGFyZF9zdGFydF94bWl0ID0gYm9uZF94bWl0X3hvcjsKKwkJYnJlYWs7CisJY2FzZSBCT05EX01PREVfQlJPQURDQVNUOgorCQlib25kX2Rldi0+aGFyZF9zdGFydF94bWl0ID0gYm9uZF94bWl0X2Jyb2FkY2FzdDsKKwkJYnJlYWs7CisJY2FzZSBCT05EX01PREVfODAyM0FEOgorCQlib25kX2Rldi0+aGFyZF9zdGFydF94bWl0ID0gYm9uZF8zYWRfeG1pdF94b3I7CisJCWJyZWFrOworCWNhc2UgQk9ORF9NT0RFX1RMQjoKKwljYXNlIEJPTkRfTU9ERV9BTEI6CisJCWJvbmRfZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBib25kX2FsYl94bWl0OworCQlib25kX2Rldi0+c2V0X21hY19hZGRyZXNzID0gYm9uZF9hbGJfc2V0X21hY19hZGRyZXNzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuLCBtb2RlIGFscmVhZHkgY2hlY2tlZCAqLworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKKwkJICAgICAgICI6IEVycm9yOiBVbmtub3duIGJvbmRpbmcgbW9kZSAlZFxuIiwKKwkJICAgICAgIG1vZGUpOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBEb2VzIG5vdCBhbGxvY2F0ZSBidXQgY3JlYXRlcyBhIC9wcm9jIGVudHJ5LgorICogQWxsb3dlZCB0byBmYWlsLgorICovCitzdGF0aWMgaW50IF9faW5pdCBib25kX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2LCBzdHJ1Y3QgYm9uZF9wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IGJvbmRfZGV2LT5wcml2OworCisJZHByaW50aygiQmVnaW4gYm9uZF9pbml0IGZvciAlc1xuIiwgYm9uZF9kZXYtPm5hbWUpOworCisJLyogaW5pdGlhbGl6ZSByd2xvY2tzICovCisJcndsb2NrX2luaXQoJmJvbmQtPmxvY2spOworCXJ3bG9ja19pbml0KCZib25kLT5jdXJyX3NsYXZlX2xvY2spOworCisJYm9uZC0+cGFyYW1zID0gKnBhcmFtczsgLyogY29weSBwYXJhbXMgc3RydWN0ICovCisKKwkvKiBJbml0aWFsaXplIHBvaW50ZXJzICovCisJYm9uZC0+Zmlyc3Rfc2xhdmUgPSBOVUxMOworCWJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlID0gTlVMTDsKKwlib25kLT5jdXJyZW50X2FycF9zbGF2ZSA9IE5VTEw7CisJYm9uZC0+cHJpbWFyeV9zbGF2ZSA9IE5VTEw7CisJYm9uZC0+ZGV2ID0gYm9uZF9kZXY7CisJSU5JVF9MSVNUX0hFQUQoJmJvbmQtPnZsYW5fbGlzdCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBkZXZpY2UgZW50cnkgcG9pbnRzICovCisJYm9uZF9kZXYtPm9wZW4gPSBib25kX29wZW47CisJYm9uZF9kZXYtPnN0b3AgPSBib25kX2Nsb3NlOworCWJvbmRfZGV2LT5nZXRfc3RhdHMgPSBib25kX2dldF9zdGF0czsKKwlib25kX2Rldi0+ZG9faW9jdGwgPSBib25kX2RvX2lvY3RsOworCWJvbmRfZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBib25kX3NldF9tdWx0aWNhc3RfbGlzdDsKKwlib25kX2Rldi0+Y2hhbmdlX210dSA9IGJvbmRfY2hhbmdlX210dTsKKwlib25kX2Rldi0+c2V0X21hY19hZGRyZXNzID0gYm9uZF9zZXRfbWFjX2FkZHJlc3M7CisKKwlib25kX3NldF9tb2RlX29wcyhib25kX2RldiwgYm9uZC0+cGFyYW1zLm1vZGUpOworCisJYm9uZF9kZXYtPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldjsKKworCS8qIEluaXRpYWxpemUgdGhlIGRldmljZSBvcHRpb25zICovCisJYm9uZF9kZXYtPnR4X3F1ZXVlX2xlbiA9IDA7CisJYm9uZF9kZXYtPmZsYWdzIHw9IElGRl9NQVNURVJ8SUZGX01VTFRJQ0FTVDsKKworCS8qIEF0IGZpcnN0LCB3ZSBibG9jayBhZGRpbmcgVkxBTnMuIFRoYXQncyB0aGUgb25seSB3YXkgdG8KKwkgKiBwcmV2ZW50IHByb2JsZW1zIHRoYXQgb2NjdXIgd2hlbiBhZGRpbmcgVkxBTnMgb3ZlciBhbgorCSAqIGVtcHR5IGJvbmQuIFRoZSBibG9jayB3aWxsIGJlIHJlbW92ZWQgb25jZSBub24tY2hhbGxlbmdlZAorCSAqIHNsYXZlcyBhcmUgZW5zbGF2ZWQuCisJICovCisJYm9uZF9kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVkxBTl9DSEFMTEVOR0VEOworCisJLyogZG9uJ3QgYWNxdWlyZSBib25kIGRldmljZSdzIHhtaXRfbG9jayB3aGVuIAorCSAqIHRyYW5zbWl0dGluZyAqLworCWJvbmRfZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0xMVFg7CisKKwkvKiBCeSBkZWZhdWx0LCB3ZSBkZWNsYXJlIHRoZSBib25kIHRvIGJlIGZ1bGx5CisJICogVkxBTiBoYXJkd2FyZSBhY2NlbGVyYXRlZCBjYXBhYmxlLiBTcGVjaWFsCisJICogY2FyZSBpcyB0YWtlbiBpbiB0aGUgdmFyaW91cyB4bWl0IGZ1bmN0aW9ucworCSAqIHdoZW4gdGhlcmUgYXJlIHNsYXZlcyB0aGF0IGFyZSBub3QgaHcgYWNjZWwKKwkgKiBjYXBhYmxlCisJICovCisJYm9uZF9kZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPSBib25kX3ZsYW5fcnhfcmVnaXN0ZXI7CisJYm9uZF9kZXYtPnZsYW5fcnhfYWRkX3ZpZCAgPSBib25kX3ZsYW5fcnhfYWRkX3ZpZDsKKwlib25kX2Rldi0+dmxhbl9yeF9raWxsX3ZpZCA9IGJvbmRfdmxhbl9yeF9raWxsX3ZpZDsKKwlib25kX2Rldi0+ZmVhdHVyZXMgfD0gKE5FVElGX0ZfSFdfVkxBTl9UWCB8CisJCQkgICAgICAgTkVUSUZfRl9IV19WTEFOX1JYIHwKKwkJCSAgICAgICBORVRJRl9GX0hXX1ZMQU5fRklMVEVSKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJYm9uZF9jcmVhdGVfcHJvY19lbnRyeShib25kKTsKKyNlbmRpZgorCisJbGlzdF9hZGRfdGFpbCgmYm9uZC0+Ym9uZF9saXN0LCAmYm9uZF9kZXZfbGlzdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogRGUtaW5pdGlhbGl6ZSBkZXZpY2Ugc3BlY2lmaWMgZGF0YS4KKyAqIENhbGxlciBtdXN0IGhvbGQgcnRubF9sb2NrLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYm9uZF9kZWluaXQoc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2KQoreworCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7CisKKwlsaXN0X2RlbCgmYm9uZC0+Ym9uZF9saXN0KTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJYm9uZF9yZW1vdmVfcHJvY19lbnRyeShib25kKTsKKyNlbmRpZgorfQorCisvKiBVbnJlZ2lzdGVyIGFuZCBmcmVlIGFsbCBib25kIGRldmljZXMuCisgKiBDYWxsZXIgbXVzdCBob2xkIHJ0bmxfbG9jay4KKyAqLworc3RhdGljIHZvaWQgYm9uZF9mcmVlX2FsbCh2b2lkKQoreworCXN0cnVjdCBib25kaW5nICpib25kLCAqbnh0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJvbmQsIG54dCwgJmJvbmRfZGV2X2xpc3QsIGJvbmRfbGlzdCkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYgPSBib25kLT5kZXY7CisKKwkJdW5yZWdpc3Rlcl9uZXRkZXZpY2UoYm9uZF9kZXYpOworCQlib25kX2RlaW5pdChib25kX2Rldik7CisJfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlib25kX2Rlc3Ryb3lfcHJvY19kaXIoKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTW9kdWxlIGluaXRpYWxpemF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBDb252ZXJ0IHN0cmluZyBpbnB1dCBtb2R1bGUgcGFybXMuICBBY2NlcHQgZWl0aGVyIHRoZQorICogbnVtYmVyIG9mIHRoZSBtb2RlIG9yIGl0cyBzdHJpbmcgbmFtZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYm9uZF9wYXJzZV9wYXJtKGNoYXIgKm1vZGVfYXJnLCBzdHJ1Y3QgYm9uZF9wYXJtX3RibCAqdGJsKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgdGJsW2ldLm1vZGVuYW1lOyBpKyspIHsKKwkJaWYgKChpc2RpZ2l0KCptb2RlX2FyZykgJiYKKwkJICAgICB0YmxbaV0ubW9kZSA9PSBzaW1wbGVfc3RydG9sKG1vZGVfYXJnLCBOVUxMLCAwKSkgfHwKKwkJICAgIChzdHJuY21wKG1vZGVfYXJnLCB0YmxbaV0ubW9kZW5hbWUsCisJCQkgICAgIHN0cmxlbih0YmxbaV0ubW9kZW5hbWUpKSA9PSAwKSkgeworCQkJcmV0dXJuIHRibFtpXS5tb2RlOworCQl9CisJfQorCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGJvbmRfY2hlY2tfcGFyYW1zKHN0cnVjdCBib25kX3BhcmFtcyAqcGFyYW1zKQoreworCS8qCisJICogQ29udmVydCBzdHJpbmcgcGFyYW1ldGVycy4KKwkgKi8KKwlpZiAobW9kZSkgeworCQlib25kX21vZGUgPSBib25kX3BhcnNlX3Bhcm0obW9kZSwgYm9uZF9tb2RlX3RibCk7CisJCWlmIChib25kX21vZGUgPT0gLTEpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkJICAgICAgICI6IEVycm9yOiBJbnZhbGlkIGJvbmRpbmcgbW9kZSBcIiVzXCJcbiIsCisJCQkgICAgICAgbW9kZSA9PSBOVUxMID8gIk5VTEwiIDogbW9kZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmIChsYWNwX3JhdGUpIHsKKwkJaWYgKGJvbmRfbW9kZSAhPSBCT05EX01PREVfODAyM0FEKSB7CisJCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCQkgICAgICAgIjogbGFjcF9yYXRlIHBhcmFtIGlzIGlycmVsZXZhbnQgaW4gbW9kZSAlc1xuIiwKKwkJCSAgICAgICBib25kX21vZGVfbmFtZShib25kX21vZGUpKTsKKwkJfSBlbHNlIHsKKwkJCWxhY3BfZmFzdCA9IGJvbmRfcGFyc2VfcGFybShsYWNwX3JhdGUsIGJvbmRfbGFjcF90YmwpOworCQkJaWYgKGxhY3BfZmFzdCA9PSAtMSkgeworCQkJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRQorCQkJCSAgICAgICAiOiBFcnJvcjogSW52YWxpZCBsYWNwIHJhdGUgXCIlc1wiXG4iLAorCQkJCSAgICAgICBsYWNwX3JhdGUgPT0gTlVMTCA/ICJOVUxMIiA6IGxhY3BfcmF0ZSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9CisKKwlpZiAobWF4X2JvbmRzIDwgMSB8fCBtYXhfYm9uZHMgPiBJTlRfTUFYKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJICAgICAgICI6IFdhcm5pbmc6IG1heF9ib25kcyAoJWQpIG5vdCBpbiByYW5nZSAlZC0lZCwgc28gaXQgIgorCQkgICAgICAgIndhcyByZXNldCB0byBCT05EX0RFRkFVTFRfTUFYX0JPTkRTICglZCkiLAorCQkgICAgICAgbWF4X2JvbmRzLCAxLCBJTlRfTUFYLCBCT05EX0RFRkFVTFRfTUFYX0JPTkRTKTsKKwkJbWF4X2JvbmRzID0gQk9ORF9ERUZBVUxUX01BWF9CT05EUzsKKwl9CisKKwlpZiAobWlpbW9uIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCSAgICAgICAiOiBXYXJuaW5nOiBtaWltb24gbW9kdWxlIHBhcmFtZXRlciAoJWQpLCAiCisJCSAgICAgICAibm90IGluIHJhbmdlIDAtJWQsIHNvIGl0IHdhcyByZXNldCB0byAlZFxuIiwKKwkJICAgICAgIG1paW1vbiwgSU5UX01BWCwgQk9ORF9MSU5LX01PTl9JTlRFUlYpOworCQltaWltb24gPSBCT05EX0xJTktfTU9OX0lOVEVSVjsKKwl9CisKKwlpZiAodXBkZWxheSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkgICAgICAgIjogV2FybmluZzogdXBkZWxheSBtb2R1bGUgcGFyYW1ldGVyICglZCksICIKKwkJICAgICAgICJub3QgaW4gcmFuZ2UgMC0lZCwgc28gaXQgd2FzIHJlc2V0IHRvIDBcbiIsCisJCSAgICAgICB1cGRlbGF5LCBJTlRfTUFYKTsKKwkJdXBkZWxheSA9IDA7CisJfQorCisJaWYgKGRvd25kZWxheSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkgICAgICAgIjogV2FybmluZzogZG93bmRlbGF5IG1vZHVsZSBwYXJhbWV0ZXIgKCVkKSwgIgorCQkgICAgICAgIm5vdCBpbiByYW5nZSAwLSVkLCBzbyBpdCB3YXMgcmVzZXQgdG8gMFxuIiwKKwkJICAgICAgIGRvd25kZWxheSwgSU5UX01BWCk7CisJCWRvd25kZWxheSA9IDA7CisJfQorCisJaWYgKCh1c2VfY2FycmllciAhPSAwKSAmJiAodXNlX2NhcnJpZXIgIT0gMSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkgICAgICAgIjogV2FybmluZzogdXNlX2NhcnJpZXIgbW9kdWxlIHBhcmFtZXRlciAoJWQpLCAiCisJCSAgICAgICAibm90IG9mIHZhbGlkIHZhbHVlICgwLzEpLCBzbyBpdCB3YXMgc2V0IHRvIDFcbiIsCisJCSAgICAgICB1c2VfY2Fycmllcik7CisJCXVzZV9jYXJyaWVyID0gMTsKKwl9CisKKwkvKiByZXNldCB2YWx1ZXMgZm9yIDgwMi4zYWQgKi8KKwlpZiAoYm9uZF9tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpIHsKKwkJaWYgKCFtaWltb24pIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJCSAgICAgICAiOiBXYXJuaW5nOiBtaWltb24gbXVzdCBiZSBzcGVjaWZpZWQsICIKKwkJCSAgICAgICAib3RoZXJ3aXNlIGJvbmRpbmcgd2lsbCBub3QgZGV0ZWN0IGxpbmsgIgorCQkJICAgICAgICJmYWlsdXJlLCBzcGVlZCBhbmQgZHVwbGV4IHdoaWNoIGFyZSAiCisJCQkgICAgICAgImVzc2VudGlhbCBmb3IgODAyLjNhZCBvcGVyYXRpb25cbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRm9yY2luZyBtaWltb24gdG8gMTAwbXNlY1xuIik7CisJCQltaWltb24gPSAxMDA7CisJCX0KKwl9CisKKwkvKiByZXNldCB2YWx1ZXMgZm9yIFRMQi9BTEIgKi8KKwlpZiAoKGJvbmRfbW9kZSA9PSBCT05EX01PREVfVExCKSB8fAorCSAgICAoYm9uZF9tb2RlID09IEJPTkRfTU9ERV9BTEIpKSB7CisJCWlmICghbWlpbW9uKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCQkgICAgICAgIjogV2FybmluZzogbWlpbW9uIG11c3QgYmUgc3BlY2lmaWVkLCAiCisJCQkgICAgICAgIm90aGVyd2lzZSBib25kaW5nIHdpbGwgbm90IGRldGVjdCBsaW5rICIKKwkJCSAgICAgICAiZmFpbHVyZSBhbmQgbGluayBzcGVlZCB3aGljaCBhcmUgZXNzZW50aWFsICIKKwkJCSAgICAgICAiZm9yIFRMQi9BTEIgbG9hZCBiYWxhbmNpbmdcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRm9yY2luZyBtaWltb24gdG8gMTAwbXNlY1xuIik7CisJCQltaWltb24gPSAxMDA7CisJCX0KKwl9CisKKwlpZiAoYm9uZF9tb2RlID09IEJPTkRfTU9ERV9BTEIpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFIERSVl9OQU1FCisJCSAgICAgICAiOiBJbiBBTEIgbW9kZSB5b3UgbWlnaHQgZXhwZXJpZW5jZSBjbGllbnQgIgorCQkgICAgICAgImRpc2Nvbm5lY3Rpb25zIHVwb24gcmVjb25uZWN0aW9uIG9mIGEgbGluayBpZiB0aGUgIgorCQkgICAgICAgImJvbmRpbmcgbW9kdWxlIHVwZGVsYXkgcGFyYW1ldGVyICglZCBtc2VjKSBpcyAiCisJCSAgICAgICAiaW5jb21wYXRpYmxlIHdpdGggdGhlIGZvcndhcmRpbmcgZGVsYXkgdGltZSBvZiB0aGUgIgorCQkgICAgICAgInN3aXRjaFxuIiwKKwkJICAgICAgIHVwZGVsYXkpOworCX0KKworCWlmICghbWlpbW9uKSB7CisJCWlmICh1cGRlbGF5IHx8IGRvd25kZWxheSkgeworCQkJLyoganVzdCB3YXJuIHRoZSB1c2VyIHRoZSB1cC9kb3duIGRlbGF5IHdpbGwgaGF2ZQorCQkJICogbm8gZWZmZWN0IHNpbmNlIG1paW1vbiBpcyB6ZXJvLi4uCisJCQkgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJCSAgICAgICAiOiBXYXJuaW5nOiBtaWltb24gbW9kdWxlIHBhcmFtZXRlciBub3Qgc2V0ICIKKwkJCSAgICAgICAiYW5kIHVwZGVsYXkgKCVkKSBvciBkb3duZGVsYXkgKCVkKSBtb2R1bGUgIgorCQkJICAgICAgICJwYXJhbWV0ZXIgaXMgc2V0OyB1cGRlbGF5IGFuZCBkb3duZGVsYXkgaGF2ZSAiCisJCQkgICAgICAgIm5vIGVmZmVjdCB1bmxlc3MgbWlpbW9uIGlzIHNldFxuIiwKKwkJCSAgICAgICB1cGRlbGF5LCBkb3duZGVsYXkpOworCQl9CisJfSBlbHNlIHsKKwkJLyogZG9uJ3QgYWxsb3cgYXJwIG1vbml0b3JpbmcgKi8KKwkJaWYgKGFycF9pbnRlcnZhbCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkJICAgICAgICI6IFdhcm5pbmc6IG1paW1vbiAoJWQpIGFuZCBhcnBfaW50ZXJ2YWwgKCVkKSAiCisJCQkgICAgICAgImNhbid0IGJlIHVzZWQgc2ltdWx0YW5lb3VzbHksIGRpc2FibGluZyBBUlAgIgorCQkJICAgICAgICJtb25pdG9yaW5nXG4iLAorCQkJICAgICAgIG1paW1vbiwgYXJwX2ludGVydmFsKTsKKwkJCWFycF9pbnRlcnZhbCA9IDA7CisJCX0KKworCQlpZiAoKHVwZGVsYXkgJSBtaWltb24pICE9IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJCSAgICAgICAiOiBXYXJuaW5nOiB1cGRlbGF5ICglZCkgaXMgbm90IGEgbXVsdGlwbGUgIgorCQkJICAgICAgICJvZiBtaWltb24gKCVkKSwgdXBkZWxheSByb3VuZGVkIHRvICVkIG1zXG4iLAorCQkJICAgICAgIHVwZGVsYXksIG1paW1vbiwgKHVwZGVsYXkgLyBtaWltb24pICogbWlpbW9uKTsKKwkJfQorCisJCXVwZGVsYXkgLz0gbWlpbW9uOworCisJCWlmICgoZG93bmRlbGF5ICUgbWlpbW9uKSAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCQkgICAgICAgIjogV2FybmluZzogZG93bmRlbGF5ICglZCkgaXMgbm90IGEgbXVsdGlwbGUgIgorCQkJICAgICAgICJvZiBtaWltb24gKCVkKSwgZG93bmRlbGF5IHJvdW5kZWQgdG8gJWQgbXNcbiIsCisJCQkgICAgICAgZG93bmRlbGF5LCBtaWltb24sCisJCQkgICAgICAgKGRvd25kZWxheSAvIG1paW1vbikgKiBtaWltb24pOworCQl9CisKKwkJZG93bmRlbGF5IC89IG1paW1vbjsKKwl9CisKKwlpZiAoYXJwX2ludGVydmFsIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCSAgICAgICAiOiBXYXJuaW5nOiBhcnBfaW50ZXJ2YWwgbW9kdWxlIHBhcmFtZXRlciAoJWQpICIKKwkJICAgICAgICIsIG5vdCBpbiByYW5nZSAwLSVkLCBzbyBpdCB3YXMgcmVzZXQgdG8gJWRcbiIsCisJCSAgICAgICBhcnBfaW50ZXJ2YWwsIElOVF9NQVgsIEJPTkRfTElOS19BUlBfSU5URVJWKTsKKwkJYXJwX2ludGVydmFsID0gQk9ORF9MSU5LX0FSUF9JTlRFUlY7CisJfQorCisJZm9yIChhcnBfaXBfY291bnQgPSAwOworCSAgICAgKGFycF9pcF9jb3VudCA8IEJPTkRfTUFYX0FSUF9UQVJHRVRTKSAmJiBhcnBfaXBfdGFyZ2V0W2FycF9pcF9jb3VudF07CisJICAgICBhcnBfaXBfY291bnQrKykgeworCQkvKiBub3QgY29tcGxldGUgY2hlY2ssIGJ1dCBzaG91bGQgYmUgZ29vZCBlbm91Z2ggdG8KKwkJICAgY2F0Y2ggbWlzdGFrZXMgKi8KKwkJaWYgKCFpc2RpZ2l0KGFycF9pcF90YXJnZXRbYXJwX2lwX2NvdW50XVswXSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJCSAgICAgICAiOiBXYXJuaW5nOiBiYWQgYXJwX2lwX3RhcmdldCBtb2R1bGUgcGFyYW1ldGVyICIKKwkJCSAgICAgICAiKCVzKSwgQVJQIG1vbml0b3Jpbmcgd2lsbCBub3QgYmUgcGVyZm9ybWVkXG4iLAorCQkJICAgICAgIGFycF9pcF90YXJnZXRbYXJwX2lwX2NvdW50XSk7CisJCQlhcnBfaW50ZXJ2YWwgPSAwOworCQl9IGVsc2UgeworCQkJdTMyIGlwID0gaW5fYXRvbihhcnBfaXBfdGFyZ2V0W2FycF9pcF9jb3VudF0pOworCQkJYXJwX3RhcmdldFthcnBfaXBfY291bnRdID0gaXA7CisJCX0KKwl9CisKKwlpZiAoYXJwX2ludGVydmFsICYmICFhcnBfaXBfY291bnQpIHsKKwkJLyogZG9uJ3QgYWxsb3cgYXJwaW5nIGlmIG5vIGFycF9pcF90YXJnZXQgZ2l2ZW4uLi4gKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCQkgICAgICAgIjogV2FybmluZzogYXJwX2ludGVydmFsIG1vZHVsZSBwYXJhbWV0ZXIgKCVkKSAiCisJCSAgICAgICAic3BlY2lmaWVkIHdpdGhvdXQgcHJvdmlkaW5nIGFuIGFycF9pcF90YXJnZXQgIgorCQkgICAgICAgInBhcmFtZXRlciwgYXJwX2ludGVydmFsIHdhcyByZXNldCB0byAwXG4iLAorCQkgICAgICAgYXJwX2ludGVydmFsKTsKKwkJYXJwX2ludGVydmFsID0gMDsKKwl9CisKKwlpZiAobWlpbW9uKSB7CisJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJICAgICAgICI6IE1JSSBsaW5rIG1vbml0b3Jpbmcgc2V0IHRvICVkIG1zXG4iLAorCQkgICAgICAgbWlpbW9uKTsKKwl9IGVsc2UgaWYgKGFycF9pbnRlcnZhbCkgeworCQlpbnQgaTsKKworCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FCisJCSAgICAgICAiOiBBUlAgbW9uaXRvcmluZyBzZXQgdG8gJWQgbXMgd2l0aCAlZCB0YXJnZXQocyk6IiwKKwkJICAgICAgIGFycF9pbnRlcnZhbCwgYXJwX2lwX2NvdW50KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgYXJwX2lwX2NvdW50OyBpKyspCisJCQlwcmludGsgKCIgJXMiLCBhcnBfaXBfdGFyZ2V0W2ldKTsKKworCQlwcmludGsoIlxuIik7CisKKwl9IGVsc2UgeworCQkvKiBtaWltb24gYW5kIGFycF9pbnRlcnZhbCBub3Qgc2V0LCB3ZSBuZWVkIG9uZSBzbyB0aGluZ3MKKwkJICogd29yayBhcyBleHBlY3RlZCwgc2VlIGJvbmRpbmcudHh0IGZvciBkZXRhaWxzCisJCSAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCisJCSAgICAgICAiOiBXYXJuaW5nOiBlaXRoZXIgbWlpbW9uIG9yIGFycF9pbnRlcnZhbCBhbmQgIgorCQkgICAgICAgImFycF9pcF90YXJnZXQgbW9kdWxlIHBhcmFtZXRlcnMgbXVzdCBiZSBzcGVjaWZpZWQsICIKKwkJICAgICAgICJvdGhlcndpc2UgYm9uZGluZyB3aWxsIG5vdCBkZXRlY3QgbGluayBmYWlsdXJlcyEgc2VlICIKKwkJICAgICAgICJib25kaW5nLnR4dCBmb3IgZGV0YWlscy5cbiIpOworCX0KKworCWlmIChwcmltYXJ5ICYmICFVU0VTX1BSSU1BUlkoYm9uZF9tb2RlKSkgeworCQkvKiBjdXJyZW50bHksIHVzaW5nIGEgcHJpbWFyeSBvbmx5IG1ha2VzIHNlbnNlCisJCSAqIGluIGFjdGl2ZSBiYWNrdXAsIFRMQiBvciBBTEIgbW9kZXMKKwkJICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJICAgICAgICI6IFdhcm5pbmc6ICVzIHByaW1hcnkgZGV2aWNlIHNwZWNpZmllZCBidXQgaGFzIG5vICIKKwkJICAgICAgICJlZmZlY3QgaW4gJXMgbW9kZVxuIiwKKwkJICAgICAgIHByaW1hcnksIGJvbmRfbW9kZV9uYW1lKGJvbmRfbW9kZSkpOworCQlwcmltYXJ5ID0gTlVMTDsKKwl9CisKKwkvKiBmaWxsIHBhcmFtcyBzdHJ1Y3Qgd2l0aCB0aGUgcHJvcGVyIHZhbHVlcyAqLworCXBhcmFtcy0+bW9kZSA9IGJvbmRfbW9kZTsKKwlwYXJhbXMtPm1paW1vbiA9IG1paW1vbjsKKwlwYXJhbXMtPmFycF9pbnRlcnZhbCA9IGFycF9pbnRlcnZhbDsKKwlwYXJhbXMtPnVwZGVsYXkgPSB1cGRlbGF5OworCXBhcmFtcy0+ZG93bmRlbGF5ID0gZG93bmRlbGF5OworCXBhcmFtcy0+dXNlX2NhcnJpZXIgPSB1c2VfY2FycmllcjsKKwlwYXJhbXMtPmxhY3BfZmFzdCA9IGxhY3BfZmFzdDsKKwlwYXJhbXMtPnByaW1hcnlbMF0gPSAwOworCisJaWYgKHByaW1hcnkpIHsKKwkJc3RybmNweShwYXJhbXMtPnByaW1hcnksIHByaW1hcnksIElGTkFNU0laKTsKKwkJcGFyYW1zLT5wcmltYXJ5W0lGTkFNU0laIC0gMV0gPSAwOworCX0KKworCW1lbWNweShwYXJhbXMtPmFycF90YXJnZXRzLCBhcnBfdGFyZ2V0LCBzaXplb2YoYXJwX3RhcmdldCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGJvbmRpbmdfaW5pdCh2b2lkKQoreworCXN0cnVjdCBib25kX3BhcmFtcyBwYXJhbXM7CisJaW50IGk7CisJaW50IHJlczsKKworCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisKKwlyZXMgPSBib25kX2NoZWNrX3BhcmFtcygmcGFyYW1zKTsKKwlpZiAocmVzKSB7CisJCXJldHVybiByZXM7CisJfQorCisJcnRubF9sb2NrKCk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCWJvbmRfY3JlYXRlX3Byb2NfZGlyKCk7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBtYXhfYm9uZHM7IGkrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXY7CisKKwkJYm9uZF9kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBib25kaW5nKSwgIiIsIGV0aGVyX3NldHVwKTsKKwkJaWYgKCFib25kX2RldikgeworCQkJcmVzID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCisJCXJlcyA9IGRldl9hbGxvY19uYW1lKGJvbmRfZGV2LCAiYm9uZCVkIik7CisJCWlmIChyZXMgPCAwKSB7CisJCQlmcmVlX25ldGRldihib25kX2Rldik7CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKworCQkvKiBib25kX2luaXQoKSBtdXN0IGJlIGNhbGxlZCBhZnRlciBkZXZfYWxsb2NfbmFtZSgpIChmb3IgdGhlCisJCSAqIC9wcm9jIGZpbGVzKSwgYnV0IGJlZm9yZSByZWdpc3Rlcl9uZXRkZXZpY2UoKSwgYmVjYXVzZSB3ZQorCQkgKiBuZWVkIHRvIHNldCBmdW5jdGlvbiBwb2ludGVycy4KKwkJICovCisJCXJlcyA9IGJvbmRfaW5pdChib25kX2RldiwgJnBhcmFtcyk7CisJCWlmIChyZXMgPCAwKSB7CisJCQlmcmVlX25ldGRldihib25kX2Rldik7CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKworCQlTRVRfTU9EVUxFX09XTkVSKGJvbmRfZGV2KTsKKworCQlyZXMgPSByZWdpc3Rlcl9uZXRkZXZpY2UoYm9uZF9kZXYpOworCQlpZiAocmVzIDwgMCkgeworCQkJYm9uZF9kZWluaXQoYm9uZF9kZXYpOworCQkJZnJlZV9uZXRkZXYoYm9uZF9kZXYpOworCQkJZ290byBvdXRfZXJyOworCQl9CisJfQorCisJcnRubF91bmxvY2soKTsKKwlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmJvbmRfbmV0ZGV2X25vdGlmaWVyKTsKKworCXJldHVybiAwOworCitvdXRfZXJyOgorCS8qIGZyZWUgYW5kIHVucmVnaXN0ZXIgYWxsIGJvbmRzIHRoYXQgd2VyZSBzdWNjZXNzZnVsbHkgYWRkZWQgKi8KKwlib25kX2ZyZWVfYWxsKCk7CisKKwlydG5sX3VubG9jaygpOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGJvbmRpbmdfZXhpdCh2b2lkKQoreworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZib25kX25ldGRldl9ub3RpZmllcik7CisKKwlydG5sX2xvY2soKTsKKwlib25kX2ZyZWVfYWxsKCk7CisJcnRubF91bmxvY2soKTsKK30KKworbW9kdWxlX2luaXQoYm9uZGluZ19pbml0KTsKK21vZHVsZV9leGl0KGJvbmRpbmdfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJWX0RFU0NSSVBUSU9OICIsIHYiIERSVl9WRVJTSU9OKTsKK01PRFVMRV9BVVRIT1IoIlRob21hcyBEYXZpcywgdGFkYXZpc0BsYmwuZ292IGFuZCBtYW55IG90aGVycyIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIm1vc3QgZXRoZXJuZXQgZGV2aWNlcyIpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRpbmcuaCBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMzI1MzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRpbmcuaApAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIEJvbmQgc2V2ZXJhbCBldGhlcm5ldCBpbnRlcmZhY2VzIGludG8gYSBDaXNjbywgcnVubmluZyAnRXRoZXJjaGFubmVsJy4KKyAqCisgKiBQb3J0aW9ucyBhcmUgKGMpIENvcHlyaWdodCAxOTk1IFNpbW9uICJHdXJ1IEFsZXBoLU51bGwiIEphbmVzCisgKiBOQ006IE5ldHdvcmsgYW5kIENvbW11bmljYXRpb25zIE1hbmFnZW1lbnQsIEluYy4KKyAqCisgKiBCVVQsIEknbSB0aGUgb25lIHdobyBtb2RpZmllZCBpdCBmb3IgZXRoZXJuZXQsIHNvOgorICogKGMpIENvcHlyaWdodCAxOTk5LCBUaG9tYXMgRGF2aXMsIHRhZGF2aXNAbGJsLmdvdgorICoKKyAqCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqCW9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqCisgKiAyMDAzLzAzLzE4IC0gQW1pciBOb2FtIDxhbWlyLm5vYW0gYXQgaW50ZWwgZG90IGNvbT4sCisgKgkJVHNpcHB5IE1lbmRlbHNvbiA8dHNpcHB5Lm1lbmRlbHNvbiBhdCBpbnRlbCBkb3QgY29tPiBhbmQKKyAqCQlTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gQWRkZWQgc3VwcG9ydCBmb3IgSUVFRSA4MDIuM2FkIER5bmFtaWMgbGluayBhZ2dyZWdhdGlvbiBtb2RlLgorICoKKyAqIDIwMDMvMDUvMDEgLSBUc2lwcHkgTWVuZGVsc29uIDx0c2lwcHkubWVuZGVsc29uIGF0IGludGVsIGRvdCBjb20+IGFuZAorICoJCUFtaXIgTm9hbSA8YW1pci5ub2FtIGF0IGludGVsIGRvdCBjb20+CisgKgktIENvZGUgYmVhdXRpZmljYXRpb24gYW5kIHN0eWxlIGNoYW5nZXMgKG1haW5seSBpbiBjb21tZW50cykuCisgKgorICogMjAwMy8wNS8wMSAtIFNobXVsaWsgSGVuIDxzaG11bGlrLmhlbiBhdCBpbnRlbCBkb3QgY29tPgorICoJLSBBZGRlZCBzdXBwb3J0IGZvciBUcmFuc21pdCBsb2FkIGJhbGFuY2luZyBtb2RlLgorICoKKyAqIDIwMDMvMTIvMDEgLSBTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KKyAqCS0gQ29kZSBjbGVhbnVwIGFuZCBzdHlsZSBjaGFuZ2VzCisgKi8KKworI2lmbmRlZiBfTElOVVhfQk9ORElOR19ICisjZGVmaW5lIF9MSU5VWF9CT05ESU5HX0gKKworI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2JvbmRpbmcuaD4KKyNpbmNsdWRlICJib25kXzNhZC5oIgorI2luY2x1ZGUgImJvbmRfYWxiLmgiCisKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjIuNi4xIgorI2RlZmluZSBEUlZfUkVMREFURQkiT2N0b2JlciAyOSwgMjAwNCIKKyNkZWZpbmUgRFJWX05BTUUJImJvbmRpbmciCisjZGVmaW5lIERSVl9ERVNDUklQVElPTgkiRXRoZXJuZXQgQ2hhbm5lbCBCb25kaW5nIERyaXZlciIKKworI2RlZmluZSBCT05EX01BWF9BUlBfVEFSR0VUUwkxNgorCisjaWZkZWYgQk9ORElOR19ERUJVRworI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHICAgICBcCisJICAgICAgIERSVl9OQU1FICI6ICVzKCkgJWQ6ICIgZm10LCBfX0ZVTkNUSU9OX18sIF9fTElORV9fICwgIyMgYXJncyApCisjZWxzZQorI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJncy4uLikKKyNlbmRpZiAvKiBCT05ESU5HX0RFQlVHICovCisKKyNkZWZpbmUgSVNfVVAoZGV2KQkJCQkJICAgXAorCSAgICAgICgoKChkZXYpLT5mbGFncyAmIElGRl9VUCkgPT0gSUZGX1VQKQkmJiBcCisJICAgICAgIG5ldGlmX3J1bm5pbmcoZGV2KQkJCSYmIFwKKwkgICAgICAgbmV0aWZfY2Fycmllcl9vayhkZXYpKQorCisvKgorICogQ2hlY2tzIHdoZXRoZXIgYm9uZCBpcyByZWFkeSBmb3IgdHJhbnNtaXQuCisgKgorICogQ2FsbGVyIG11c3QgaG9sZCBib25kLT5sb2NrCisgKi8KKyNkZWZpbmUgQk9ORF9JU19PSyhib25kKQkJCSAgICAgXAorCQkgICAoKChib25kKS0+ZGV2LT5mbGFncyAmIElGRl9VUCkgJiYgXAorCQkgICAgbmV0aWZfcnVubmluZygoYm9uZCktPmRldikJICAmJiBcCisJCSAgICAoKGJvbmQpLT5zbGF2ZV9jbnQgPiAwKSkKKworLyoKKyAqIENoZWNrcyB3aGV0aGVyIHNsYXZlIGlzIHJlYWR5IGZvciB0cmFuc21pdC4KKyAqLworI2RlZmluZSBTTEFWRV9JU19PSyhzbGF2ZSkJCQkgICAgICAgIFwKKwkJICAgICgoKHNsYXZlKS0+ZGV2LT5mbGFncyAmIElGRl9VUCkgICYmIFwKKwkJICAgICBuZXRpZl9ydW5uaW5nKChzbGF2ZSktPmRldikgICAgICYmIFwKKwkJICAgICAoKHNsYXZlKS0+bGluayA9PSBCT05EX0xJTktfVVApICYmIFwKKwkJICAgICAoKHNsYXZlKS0+c3RhdGUgPT0gQk9ORF9TVEFURV9BQ1RJVkUpKQorCisKKyNkZWZpbmUgVVNFU19QUklNQVJZKG1vZGUpCQkJCVwKKwkJKCgobW9kZSkgPT0gQk9ORF9NT0RFX0FDVElWRUJBQ0tVUCkgfHwJXAorCQkgKChtb2RlKSA9PSBCT05EX01PREVfVExCKSAgICAgICAgICB8fAlcCisJCSAoKG1vZGUpID09IEJPTkRfTU9ERV9BTEIpKQorCisvKgorICogTGVzcyBiYWQgd2F5IHRvIGNhbGwgaW9jdGwgZnJvbSB3aXRoaW4gdGhlIGtlcm5lbDsgdGhpcyBuZWVkcyB0byBiZQorICogZG9uZSBzb21lIG90aGVyIHdheSB0byBnZXQgdGhlIGNhbGwgb3V0IG9mIGludGVycnVwdCBjb250ZXh0LgorICogTmVlZHMgImlvY3RsIiB2YXJpYWJsZSB0byBiZSBzdXBwbGllZCBieSBjYWxsaW5nIGNvbnRleHQuCisgKi8KKyNkZWZpbmUgSU9DVEwoZGV2LCBhcmcsIGNtZCkgKHsJCVwKKwlpbnQgcmVzID0gMDsJCQlcCisJbW1fc2VnbWVudF90IGZzID0gZ2V0X2ZzKCk7CVwKKwlzZXRfZnMoZ2V0X2RzKCkpOwkJXAorCXJlcyA9IGlvY3RsKGRldiwgYXJnLCBjbWQpOwlcCisJc2V0X2ZzKGZzKTsJCQlcCisJcmVzOyB9KQorCisvKioKKyAqIGJvbmRfZm9yX2VhY2hfc2xhdmVfZnJvbSAtIGl0ZXJhdGUgdGhlIHNsYXZlcyBsaXN0IGZyb20gYSBzdGFydGluZyBwb2ludAorICogQGJvbmQ6CXRoZSBib25kIGhvbGRpbmcgdGhpcyBsaXN0LgorICogQHBvczoJY3VycmVudCBzbGF2ZS4KKyAqIEBjbnQ6CWNvdW50ZXIgZm9yIG1heCBudW1iZXIgb2YgbW92ZXMKKyAqIEBzdGFydDoJc3RhcnRpbmcgcG9pbnQuCisgKgorICogQ2FsbGVyIG11c3QgaG9sZCBib25kLT5sb2NrCisgKi8KKyNkZWZpbmUgYm9uZF9mb3JfZWFjaF9zbGF2ZV9mcm9tKGJvbmQsIHBvcywgY250LCBzdGFydCkJXAorCWZvciAoY250ID0gMCwgcG9zID0gc3RhcnQ7CQkJCVwKKwkgICAgIGNudCA8IChib25kKS0+c2xhdmVfY250OwkJCQlcCisgICAgICAgICAgICAgY250KyssIHBvcyA9IChwb3MpLT5uZXh0KQorCisvKioKKyAqIGJvbmRfZm9yX2VhY2hfc2xhdmVfZnJvbV90byAtIGl0ZXJhdGUgdGhlIHNsYXZlcyBsaXN0IGZyb20gc3RhcnQgcG9pbnQgdG8gc3RvcCBwb2ludAorICogQGJvbmQ6CXRoZSBib25kIGhvbGRpbmcgdGhpcyBsaXN0LgorICogQHBvczoJY3VycmVudCBzbGF2ZS4KKyAqIEBjbnQ6CWNvdW50ZXIgZm9yIG51bWJlciBtYXggb2YgbW92ZXMKKyAqIEBzdGFydDoJc3RhcnQgcG9pbnQuCisgKiBAc3RvcDoJc3RvcCBwb2ludC4KKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIGJvbmQtPmxvY2sKKyAqLworI2RlZmluZSBib25kX2Zvcl9lYWNoX3NsYXZlX2Zyb21fdG8oYm9uZCwgcG9zLCBjbnQsIHN0YXJ0LCBzdG9wKQlcCisJZm9yIChjbnQgPSAwLCBwb3MgPSBzdGFydDsJCQkJCVwKKwkgICAgICgoY250IDwgKGJvbmQpLT5zbGF2ZV9jbnQpICYmIChwb3MgIT0gKHN0b3ApLT5uZXh0KSk7CVwKKyAgICAgICAgICAgICBjbnQrKywgcG9zID0gKHBvcyktPm5leHQpCisKKy8qKgorICogYm9uZF9mb3JfZWFjaF9zbGF2ZSAtIGl0ZXJhdGUgdGhlIHNsYXZlcyBsaXN0IGZyb20gaGVhZAorICogQGJvbmQ6CXRoZSBib25kIGhvbGRpbmcgdGhpcyBsaXN0LgorICogQHBvczoJY3VycmVudCBzbGF2ZS4KKyAqIEBjbnQ6CWNvdW50ZXIgZm9yIG1heCBudW1iZXIgb2YgbW92ZXMKKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIGJvbmQtPmxvY2sKKyAqLworI2RlZmluZSBib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHBvcywgY250KQlcCisJCWJvbmRfZm9yX2VhY2hfc2xhdmVfZnJvbShib25kLCBwb3MsIGNudCwgKGJvbmQpLT5maXJzdF9zbGF2ZSkKKworCitzdHJ1Y3QgYm9uZF9wYXJhbXMgeworCWludCBtb2RlOworCWludCBtaWltb247CisJaW50IGFycF9pbnRlcnZhbDsKKwlpbnQgdXNlX2NhcnJpZXI7CisJaW50IHVwZGVsYXk7CisJaW50IGRvd25kZWxheTsKKwlpbnQgbGFjcF9mYXN0OworCWNoYXIgcHJpbWFyeVtJRk5BTVNJWl07CisJdTMyIGFycF90YXJnZXRzW0JPTkRfTUFYX0FSUF9UQVJHRVRTXTsKK307CisKK3N0cnVjdCB2bGFuX2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHZsYW5fbGlzdDsKKwl1bnNpZ25lZCBzaG9ydCB2bGFuX2lkOworfTsKKworc3RydWN0IHNsYXZlIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OyAvKiBmaXJzdCAtIHVzZWZ1bGwgZm9yIHBhbmljIGRlYnVnICovCisJc3RydWN0IHNsYXZlICpuZXh0OworCXN0cnVjdCBzbGF2ZSAqcHJldjsKKwlzMTYgICAgZGVsYXk7CisJdTMyICAgIGppZmZpZXM7CisJczggICAgIGxpbms7ICAgIC8qIG9uZSBvZiBCT05EX0xJTktfWFhYWCAqLworCXM4ICAgICBzdGF0ZTsgICAvKiBvbmUgb2YgQk9ORF9TVEFURV9YWFhYICovCisJdTMyICAgIG9yaWdpbmFsX2ZsYWdzOworCXUzMiAgICBsaW5rX2ZhaWx1cmVfY291bnQ7CisJdTE2ICAgIHNwZWVkOworCXU4ICAgICBkdXBsZXg7CisJdTggICAgIHBlcm1faHdhZGRyW0VUSF9BTEVOXTsKKwlzdHJ1Y3QgYWRfc2xhdmVfaW5mbyBhZF9pbmZvOyAvKiBIVUdFIC0gYmV0dGVyIHRvIGR5bmFtaWNhbGx5IGFsbG9jICovCisJc3RydWN0IHRsYl9zbGF2ZV9pbmZvIHRsYl9pbmZvOworfTsKKworLyoKKyAqIEhlcmUgYXJlIHRoZSBsb2NraW5nIHBvbGljaWVzIGZvciB0aGUgdHdvIGJvbmRpbmcgbG9ja3M6CisgKgorICogMSkgR2V0IGJvbmQtPmxvY2sgd2hlbiByZWFkaW5nL3dyaXRpbmcgc2xhdmUgbGlzdC4KKyAqIDIpIEdldCBib25kLT5jdXJyX3NsYXZlX2xvY2sgd2hlbiByZWFkaW5nL3dyaXRpbmcgYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUuCisgKiAgICAoSXQgaXMgdW5uZWNlc3Nhcnkgd2hlbiB0aGUgd3JpdGUtbG9jayBpcyBwdXQgd2l0aCBib25kLT5sb2NrLikKKyAqIDMpIFdoZW4gd2UgbG9jayB3aXRoIGJvbmQtPmN1cnJfc2xhdmVfbG9jaywgd2UgbXVzdCBsb2NrIHdpdGggYm9uZC0+bG9jaworICogICAgYmVmb3JlaGFuZC4KKyAqLworc3RydWN0IGJvbmRpbmcgeworCXN0cnVjdCAgIG5ldF9kZXZpY2UgKmRldjsgLyogZmlyc3QgLSB1c2VmdWxsIGZvciBwYW5pYyBkZWJ1ZyAqLworCXN0cnVjdCAgIHNsYXZlICpmaXJzdF9zbGF2ZTsKKwlzdHJ1Y3QgICBzbGF2ZSAqY3Vycl9hY3RpdmVfc2xhdmU7CisJc3RydWN0ICAgc2xhdmUgKmN1cnJlbnRfYXJwX3NsYXZlOworCXN0cnVjdCAgIHNsYXZlICpwcmltYXJ5X3NsYXZlOworCXMzMiAgICAgIHNsYXZlX2NudDsgLyogbmV2ZXIgY2hhbmdlIHRoaXMgdmFsdWUgb3V0c2lkZSB0aGUgYXR0YWNoL2RldGFjaCB3cmFwcGVycyAqLworCXJ3bG9ja190IGxvY2s7CisJcndsb2NrX3QgY3Vycl9zbGF2ZV9sb2NrOworCXN0cnVjdCAgIHRpbWVyX2xpc3QgbWlpX3RpbWVyOworCXN0cnVjdCAgIHRpbWVyX2xpc3QgYXJwX3RpbWVyOworCXM4ICAgICAgIGtpbGxfdGltZXJzOworCXN0cnVjdCAgIG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlzdHJ1Y3QgICBwcm9jX2Rpcl9lbnRyeSAqcHJvY19lbnRyeTsKKwljaGFyICAgICBwcm9jX2ZpbGVfbmFtZVtJRk5BTVNJWl07CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKwlzdHJ1Y3QgICBsaXN0X2hlYWQgYm9uZF9saXN0OworCXN0cnVjdCAgIGRldl9tY19saXN0ICptY19saXN0OworCXUxNiAgICAgIGZsYWdzOworCXN0cnVjdCAgIGFkX2JvbmRfaW5mbyBhZF9pbmZvOworCXN0cnVjdCAgIGFsYl9ib25kX2luZm8gYWxiX2luZm87CisJc3RydWN0ICAgYm9uZF9wYXJhbXMgcGFyYW1zOworCXN0cnVjdCAgIGxpc3RfaGVhZCB2bGFuX2xpc3Q7CisJc3RydWN0ICAgdmxhbl9ncm91cCAqdmxncnA7Cit9OworCisvKioKKyAqIFJldHVybnMgTlVMTCBpZiB0aGUgbmV0X2RldmljZSBkb2VzIG5vdCBiZWxvbmcgdG8gYW55IG9mIHRoZSBib25kJ3Mgc2xhdmVzCisgKgorICogQ2FsbGVyIG11c3QgaG9sZCBib25kIGxvY2sgZm9yIHJlYWQKKyAqLworZXh0ZXJuIGlubGluZSBzdHJ1Y3Qgc2xhdmUgKmJvbmRfZ2V0X3NsYXZlX2J5X2RldihzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldikKK3sKKwlzdHJ1Y3Qgc2xhdmUgKnNsYXZlID0gTlVMTDsKKwlpbnQgaTsKKworCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGkpIHsKKwkJaWYgKHNsYXZlLT5kZXYgPT0gc2xhdmVfZGV2KSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBzbGF2ZTsKK30KKworZXh0ZXJuIGlubGluZSBzdHJ1Y3QgYm9uZGluZyAqYm9uZF9nZXRfYm9uZF9ieV9zbGF2ZShzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQoreworCWlmICghc2xhdmUgfHwgIXNsYXZlLT5kZXYtPm1hc3RlcikgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gKHN0cnVjdCBib25kaW5nICopc2xhdmUtPmRldi0+bWFzdGVyLT5wcml2OworfQorCitleHRlcm4gaW5saW5lIHZvaWQgYm9uZF9zZXRfc2xhdmVfaW5hY3RpdmVfZmxhZ3Moc3RydWN0IHNsYXZlICpzbGF2ZSkKK3sKKwlzbGF2ZS0+c3RhdGUgPSBCT05EX1NUQVRFX0JBQ0tVUDsKKwlzbGF2ZS0+ZGV2LT5mbGFncyB8PSBJRkZfTk9BUlA7Cit9CisKK2V4dGVybiBpbmxpbmUgdm9pZCBib25kX3NldF9zbGF2ZV9hY3RpdmVfZmxhZ3Moc3RydWN0IHNsYXZlICpzbGF2ZSkKK3sKKwlzbGF2ZS0+c3RhdGUgPSBCT05EX1NUQVRFX0FDVElWRTsKKwlzbGF2ZS0+ZGV2LT5mbGFncyAmPSB+SUZGX05PQVJQOworfQorCitzdHJ1Y3Qgdmxhbl9lbnRyeSAqYm9uZF9uZXh0X3ZsYW4oc3RydWN0IGJvbmRpbmcgKmJvbmQsIHN0cnVjdCB2bGFuX2VudHJ5ICpjdXJyKTsKK2ludCBib25kX2Rldl9xdWV1ZV94bWl0KHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2KTsKKworI2VuZGlmIC8qIF9MSU5VWF9CT05ESU5HX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYnNkX2NvbXAuYyBiL2RyaXZlcnMvbmV0L2JzZF9jb21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4OGFkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2JzZF9jb21wLmMKQEAgLTAsMCArMSwxMTc5IEBACisvKgorICogVXBkYXRlOiBUaGUgQmVya2VsZXkgY29weXJpZ2h0IHdhcyBjaGFuZ2VkLCBhbmQgdGhlIGNoYW5nZSAKKyAqIGlzIHJldHJvYWN0aXZlIHRvIGFsbCAidHJ1ZSIgQlNEIHNvZnR3YXJlIChpZSBldmVyeXRoaW5nCisgKiBmcm9tIFVDQiBhcyBvcHBvc2VkIHRvIG90aGVyIHBlb3BsZXMgY29kZSB0aGF0IGp1c3QgY2FycmllZAorICogdGhlIHNhbWUgbGljZW5zZSkuIFRoZSBuZXcgY29weXJpZ2h0IGRvZXNuJ3QgY2xhc2ggd2l0aCB0aGUKKyAqIEdQTCwgc28gdGhlIG1vZHVsZS1vbmx5IHJlc3RyaWN0aW9uIGhhcyBiZWVuIHJlbW92ZWQuLgorICovCisKKy8qIEJlY2F1c2UgdGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgNC4zQlNEIGNvbXByZXNzIHNvdXJjZToKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODUsIDE5ODYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogSmFtZXMgQS4gV29vZHMsIGRlcml2ZWQgZnJvbSBvcmlnaW5hbCB3b3JrIGJ5IFNwZW5jZXIgVGhvbWFzCisgKiBhbmQgSm9zZXBoIE9yb3N0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFRoaXMgdmVyc2lvbiBpcyBmb3IgdXNlIHdpdGggY29udGlndW91cyBidWZmZXJzIG9uIExpbnV4LWRlcml2ZWQgc3lzdGVtcy4KKyAqCisgKiAgPT1GSUxFVkVSU0lPTiAyMDAwMDIyNj09CisgKgorICogIE5PVEUgVE8gTUFJTlRBSU5FUlM6CisgKiAgICAgSWYgeW91IG1vZGlmeSB0aGlzIGZpbGUgYXQgYWxsLCBwbGVhc2Ugc2V0IHRoZSBudW1iZXIgYWJvdmUgdG8gdGhlCisgKiAgICAgZGF0ZSBvZiB0aGUgbW9kaWZpY2F0aW9uIGFzIFlZTU1ERCAoeWVhciBtb250aCBkYXkpLgorICogICAgIGJzZF9jb21wLmMgaXMgc2hpcHBlZCB3aXRoIGEgUFBQIGRpc3RyaWJ1dGlvbiBhcyB3ZWxsIGFzIHdpdGgKKyAqICAgICB0aGUga2VybmVsOyBpZiBldmVyeW9uZSBpbmNyZWFzZXMgdGhlIEZJTEVWRVJTSU9OIG51bWJlciBhYm92ZSwKKyAqICAgICB0aGVuIHNjcmlwdHMgY2FuIGRvIHRoZSByaWdodCB0aGluZyB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8KKyAqICAgICBpbnN0YWxsIGEgbmV3IGJzZF9jb21wLmMgZmlsZS4gRG9uJ3QgY2hhbmdlIHRoZSBmb3JtYXQgb2YgdGhhdAorICogICAgIGxpbmUgb3RoZXJ3aXNlLCBzbyB0aGUgaW5zdGFsbGF0aW9uIHNjcmlwdCBjYW4gcmVjb2duaXplIGl0LgorICoKKyAqIEZyb206IGJzZF9jb21wLmMsdiAxLjMgMTk5NC8xMi8wOCAwMTo1OTo1OCBwYXVsdXMgRXhwCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSA8bGludXgvcHBwX2RlZnMuaD4KKworI3VuZGVmICAgUEFDS0VUUFRSCisjZGVmaW5lICBQQUNLRVRQVFIgMQorI2luY2x1ZGUgPGxpbnV4L3BwcC1jb21wLmg+CisjdW5kZWYgICBQQUNLRVRQVFIKKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworLyoKKyAqIFBQUCAiQlNEIGNvbXByZXNzIiBjb21wcmVzc2lvbgorICogIFRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoaXMgY29tcHJlc3Npb24gYW5kIHRoZSBjbGFzc2ljIEJTRCBMWlcKKyAqICBzb3VyY2UgYXJlIG9idmlvdXMgZnJvbSB0aGUgcmVxdWlyZW1lbnQgdGhhdCB0aGUgY2xhc3NpYyBjb2RlIHdvcmtlZAorICogIHdpdGggZmlsZXMgd2hpbGUgdGhpcyBoYW5kbGVzIGFyYml0cmFyaWx5IGxvbmcgc3RyZWFtcyB0aGF0CisgKiAgYXJlIGJyb2tlbiBpbnRvIHBhY2tldHMuICBUaGV5IGFyZToKKyAqCisgKglXaGVuIHRoZSBjb2RlIHNpemUgZXhwYW5kcywgYSBibG9jayBvZiBqdW5rIGlzIG5vdCBlbWl0dGVkIGJ5CisgKgkgICAgdGhlIGNvbXByZXNzb3IgYW5kIG5vdCBleHBlY3RlZCBieSB0aGUgZGVjb21wcmVzc29yLgorICoKKyAqCU5ldyBjb2RlcyBhcmUgbm90IG5lY2Vzc2FyaWx5IGFzc2lnbmVkIGV2ZXJ5IHRpbWUgYW4gb2xkCisgKgkgICAgY29kZSBpcyBvdXRwdXQgYnkgdGhlIGNvbXByZXNzb3IuICBUaGlzIGlzIGJlY2F1c2UgYSBwYWNrZXQKKyAqCSAgICBlbmQgZm9yY2VzIGEgY29kZSB0byBiZSBlbWl0dGVkLCBidXQgZG9lcyBub3QgaW1wbHkgdGhhdCBhCisgKgkgICAgbmV3IHNlcXVlbmNlIGhhcyBiZWVuIHNlZW4uCisgKgorICoJVGhlIGNvbXByZXNzaW9uIHJhdGlvIGlzIGNoZWNrZWQgYXQgdGhlIGZpcnN0IGVuZCBvZiBhIHBhY2tldAorICoJICAgIGFmdGVyIHRoZSBhcHByb3ByaWF0ZSBnYXAuCUJlc2lkZXMgc2ltcGxpZnlpbmcgYW5kIHNwZWVkaW5nCisgKgkgICAgdGhpbmdzIHVwLCB0aGlzIG1ha2VzIGl0IG1vcmUgbGlrZWx5IHRoYXQgdGhlIHRyYW5zbWl0dGVyCisgKgkgICAgYW5kIHJlY2VpdmVyIHdpbGwgYWdyZWUgd2hlbiB0aGUgZGljdGlvbmFyeSBpcyBjbGVhcmVkIHdoZW4KKyAqCSAgICBjb21wcmVzc2lvbiBpcyBub3QgZ29pbmcgd2VsbC4KKyAqLworCisvKgorICogTWFjcm9zIHRvIGV4dHJhY3QgcHJvdG9jb2wgdmVyc2lvbiBhbmQgbnVtYmVyIG9mIGJpdHMKKyAqIGZyb20gdGhlIHRoaXJkIGJ5dGUgb2YgdGhlIEJTRCBDb21wcmVzcyBDQ1AgY29uZmlndXJhdGlvbiBvcHRpb24uCisgKi8KKworI2RlZmluZSBCU0RfVkVSU0lPTih4KQkoKHgpID4+IDUpCisjZGVmaW5lIEJTRF9OQklUUyh4KQkoKHgpICYgMHgxRikKKworI2RlZmluZSBCU0RfQ1VSUkVOVF9WRVJTSU9OCTEKKworLyoKKyAqIEEgZGljdGlvbmFyeSBmb3IgZG9pbmcgQlNEIGNvbXByZXNzLgorICovCisKK3N0cnVjdCBic2RfZGljdCB7CisgICAgdW5pb24gewkJCQkvKiBoYXNoIHZhbHVlICovCisJdW5zaWduZWQgbG9uZwlmY29kZTsKKwlzdHJ1Y3QgeworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQkJLyogTGl0dGxlIGVuZGlhbiBvcmRlciAqLworCSAgICB1bnNpZ25lZCBzaG9ydAlwcmVmaXg7CS8qIHByZWNlZGluZyBjb2RlICovCisJICAgIHVuc2lnbmVkIGNoYXIJc3VmZml4OyAvKiBsYXN0IGNoYXJhY3RlciBvZiBuZXcgY29kZSAqLworCSAgICB1bnNpZ25lZCBjaGFyCXBhZDsKKyNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOKQkJLyogQmlnIGVuZGlhbiBvcmRlciAqLworCSAgICB1bnNpZ25lZCBjaGFyCXBhZDsKKwkgICAgdW5zaWduZWQgY2hhcglzdWZmaXg7IC8qIGxhc3QgY2hhcmFjdGVyIG9mIG5ldyBjb2RlICovCisJICAgIHVuc2lnbmVkIHNob3J0CXByZWZpeDsgLyogcHJlY2VkaW5nIGNvZGUgKi8KKyNlbHNlCisjZXJyb3IgRW5kaWFubmVzcyBub3QgZGVmaW5lZC4uLgorI2VuZGlmCisJfSBoczsKKyAgICB9IGY7CisgICAgdW5zaWduZWQgc2hvcnQgY29kZW0xOwkJLyogb3V0cHV0IG9mIGhhc2ggdGFibGUgLTEgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBjcHRyOwkJLyogbWFwIGNvZGUgdG8gaGFzaCB0YWJsZSBlbnRyeSAqLworfTsKKworc3RydWN0IGJzZF9kYiB7CisgICAgaW50CSAgICB0b3RsZW47CQkJLyogbGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlICovCisgICAgdW5zaWduZWQgaW50ICAgaHNpemU7CQkvKiBzaXplIG9mIHRoZSBoYXNoIHRhYmxlICovCisgICAgdW5zaWduZWQgY2hhciAgaHNoaWZ0OwkJLyogdXNlZCBpbiBoYXNoIGZ1bmN0aW9uICovCisgICAgdW5zaWduZWQgY2hhciAgbl9iaXRzOwkJLyogY3VycmVudCBiaXRzL2NvZGUgKi8KKyAgICB1bnNpZ25lZCBjaGFyICBtYXhiaXRzOwkJLyogbWF4aW11bSBiaXRzL2NvZGUgKi8KKyAgICB1bnNpZ25lZCBjaGFyICBkZWJ1ZzsJCS8qIG5vbi16ZXJvIGlmIGRlYnVnIGRlc2lyZWQgKi8KKyAgICB1bnNpZ25lZCBjaGFyICB1bml0OwkJLyogcHBwIHVuaXQgbnVtYmVyICovCisgICAgdW5zaWduZWQgc2hvcnQgc2Vxbm87CQkvKiBzZXF1ZW5jZSAjIG9mIG5leHQgcGFja2V0ICovCisgICAgdW5zaWduZWQgaW50ICAgbXJ1OwkJCS8qIHNpemUgb2YgcmVjZWl2ZSAoZGVjb21wcmVzcykgYnVmciAqLworICAgIHVuc2lnbmVkIGludCAgIG1heG1heGNvZGU7CQkvKiBsYXJnZXN0IHZhbGlkIGNvZGUgKi8KKyAgICB1bnNpZ25lZCBpbnQgICBtYXhfZW50OwkJLyogbGFyZ2VzdCBjb2RlIGluIHVzZSAqLworICAgIHVuc2lnbmVkIGludCAgIGluX2NvdW50OwkJLyogdW5jb21wcmVzc2VkIGJ5dGVzLCBhZ2VkICovCisgICAgdW5zaWduZWQgaW50ICAgYnl0ZXNfb3V0OwkJLyogY29tcHJlc3NlZCBieXRlcywgYWdlZCAqLworICAgIHVuc2lnbmVkIGludCAgIHJhdGlvOwkJLyogcmVjZW50IGNvbXByZXNzaW9uIHJhdGlvICovCisgICAgdW5zaWduZWQgaW50ICAgY2hlY2twb2ludDsJCS8qIHdoZW4gdG8gbmV4dCBjaGVjayB0aGUgcmF0aW8gKi8KKyAgICB1bnNpZ25lZCBpbnQgICBjbGVhcl9jb3VudDsJCS8qIHRpbWVzIGRpY3Rpb25hcnkgY2xlYXJlZCAqLworICAgIHVuc2lnbmVkIGludCAgIGluY29tcF9jb3VudDsJLyogaW5jb21wcmVzc2libGUgcGFja2V0cyAqLworICAgIHVuc2lnbmVkIGludCAgIGluY29tcF9ieXRlczsJLyogaW5jb21wcmVzc2libGUgYnl0ZXMgKi8KKyAgICB1bnNpZ25lZCBpbnQgICB1bmNvbXBfY291bnQ7CS8qIHVuY29tcHJlc3NlZCBwYWNrZXRzICovCisgICAgdW5zaWduZWQgaW50ICAgdW5jb21wX2J5dGVzOwkvKiB1bmNvbXByZXNzZWQgYnl0ZXMgKi8KKyAgICB1bnNpZ25lZCBpbnQgICBjb21wX2NvdW50OwkJLyogY29tcHJlc3NlZCBwYWNrZXRzICovCisgICAgdW5zaWduZWQgaW50ICAgY29tcF9ieXRlczsJCS8qIGNvbXByZXNzZWQgYnl0ZXMgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCAgKmxlbnM7CQkvKiBhcnJheSBvZiBsZW5ndGhzIG9mIGNvZGVzICovCisgICAgc3RydWN0IGJzZF9kaWN0ICpkaWN0OwkJLyogZGljdGlvbmFyeSAqLworfTsKKworI2RlZmluZSBCU0RfT1ZIRAkyCQkvKiBCU0QgY29tcHJlc3Mgb3ZlcmhlYWQvcGFja2V0ICovCisjZGVmaW5lIE1JTl9CU0RfQklUUwk5CisjZGVmaW5lIEJTRF9JTklUX0JJVFMJTUlOX0JTRF9CSVRTCisjZGVmaW5lIE1BWF9CU0RfQklUUwkxNQorCitzdGF0aWMgdm9pZAlic2RfZnJlZSAodm9pZCAqc3RhdGUpOworc3RhdGljIHZvaWQJKmJzZF9hbGxvYyh1bnNpZ25lZCBjaGFyICpvcHRpb25zLCBpbnQgb3B0X2xlbiwgaW50IGRlY29tcCk7CitzdGF0aWMgdm9pZAkqYnNkX2NvbXBfYWxsb2MgKHVuc2lnbmVkIGNoYXIgKm9wdGlvbnMsIGludCBvcHRfbGVuKTsKK3N0YXRpYyB2b2lkCSpic2RfZGVjb21wX2FsbG9jICh1bnNpZ25lZCBjaGFyICpvcHRpb25zLCBpbnQgb3B0X2xlbik7CisKK3N0YXRpYyBpbnQJYnNkX2luaXQgICAgICAgICh2b2lkICpkYiwgdW5zaWduZWQgY2hhciAqb3B0aW9ucywKKwkJCSAgICAgICAgIGludCBvcHRfbGVuLCBpbnQgdW5pdCwgaW50IGRlYnVnLCBpbnQgZGVjb21wKTsKK3N0YXRpYyBpbnQJYnNkX2NvbXBfaW5pdCAgICh2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqb3B0aW9ucywKKwkJCSAgICAgICAgIGludCBvcHRfbGVuLCBpbnQgdW5pdCwgaW50IG9wdGhkciwgaW50IGRlYnVnKTsKK3N0YXRpYyBpbnQJYnNkX2RlY29tcF9pbml0ICh2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqb3B0aW9ucywKKwkJCQkgaW50IG9wdF9sZW4sIGludCB1bml0LCBpbnQgb3B0aGRyLCBpbnQgbXJ1LAorCQkJCSBpbnQgZGVidWcpOworCitzdGF0aWMgdm9pZAlic2RfcmVzZXQgKHZvaWQgKnN0YXRlKTsKK3N0YXRpYyB2b2lkCWJzZF9jb21wX3N0YXRzICh2b2lkICpzdGF0ZSwgc3RydWN0IGNvbXBzdGF0ICpzdGF0cyk7CisKK3N0YXRpYyBpbnQJYnNkX2NvbXByZXNzICh2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqcnB0ciwKKwkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKm9idWYsIGludCBpc2l6ZSwgaW50IG9zaXplKTsKK3N0YXRpYyB2b2lkCWJzZF9pbmNvbXAgKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICppYnVmLCBpbnQgaWNudCk7CisKK3N0YXRpYyBpbnQJYnNkX2RlY29tcHJlc3MgKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICppYnVmLCBpbnQgaXNpemUsCisJCQkJdW5zaWduZWQgY2hhciAqb2J1ZiwgaW50IG9zaXplKTsKKworLyogVGhlc2UgYXJlIGluIHBwcF9nZW5lcmljLmMgKi8KK2V4dGVybiBpbnQgIHBwcF9yZWdpc3Rlcl9jb21wcmVzc29yICAgKHN0cnVjdCBjb21wcmVzc29yICpjcCk7CitleHRlcm4gdm9pZCBwcHBfdW5yZWdpc3Rlcl9jb21wcmVzc29yIChzdHJ1Y3QgY29tcHJlc3NvciAqY3ApOworCisvKgorICogdGhlIG5leHQgdHdvIGNvZGVzIHNob3VsZCBub3QgYmUgY2hhbmdlZCBsaWdodGx5LCBhcyB0aGV5IG11c3Qgbm90CisgKiBsaWUgd2l0aGluIHRoZSBjb250aWd1b3VzIGdlbmVyYWwgY29kZSBzcGFjZS4KKyAqLworI2RlZmluZSBDTEVBUgkyNTYJCQkvKiB0YWJsZSBjbGVhciBvdXRwdXQgY29kZSAqLworI2RlZmluZSBGSVJTVAkyNTcJCQkvKiBmaXJzdCBmcmVlIGVudHJ5ICovCisjZGVmaW5lIExBU1QJMjU1CisKKyNkZWZpbmUgTUFYQ09ERShiKQkoKDEgPDwgKGIpKSAtIDEpCisjZGVmaW5lIEJBRENPREVNMQlNQVhDT0RFKE1BWF9CU0RfQklUUyk7CisKKyNkZWZpbmUgQlNEX0hBU0gocHJlZml4LHN1ZmZpeCxoc2hpZnQpICgoKCh1bnNpZ25lZCBsb25nKShzdWZmaXgpKTw8KGhzaGlmdCkpIFwKKwkJCQkJIF4gKHVuc2lnbmVkIGxvbmcpKHByZWZpeCkpCisjZGVmaW5lIEJTRF9LRVkocHJlZml4LHN1ZmZpeCkJCSgoKCh1bnNpZ25lZCBsb25nKShzdWZmaXgpKSA8PCAxNikgXAorCQkJCQkgKyAodW5zaWduZWQgbG9uZykocHJlZml4KSkKKworI2RlZmluZSBDSEVDS19HQVAJMTAwMDAJCS8qIFJhdGlvIGNoZWNrIGludGVydmFsICovCisKKyNkZWZpbmUgUkFUSU9fU0NBTEVfTE9HCTgKKyNkZWZpbmUgUkFUSU9fU0NBTEUJKDE8PFJBVElPX1NDQUxFX0xPRykKKyNkZWZpbmUgUkFUSU9fTUFYCSgweDdmZmZmZmZmPj5SQVRJT19TQ0FMRV9MT0cpCisKKy8qCisgKiBjbGVhciB0aGUgZGljdGlvbmFyeQorICovCisKK3N0YXRpYyB2b2lkCitic2RfY2xlYXIoc3RydWN0IGJzZF9kYiAqZGIpCit7CisgICAgZGItPmNsZWFyX2NvdW50Kys7CisgICAgZGItPm1heF9lbnQgICAgICA9IEZJUlNULTE7CisgICAgZGItPm5fYml0cyAgICAgICA9IEJTRF9JTklUX0JJVFM7CisgICAgZGItPmJ5dGVzX291dCAgICA9IDA7CisgICAgZGItPmluX2NvdW50ICAgICA9IDA7CisgICAgZGItPnJhdGlvCSAgICAgPSAwOworICAgIGRiLT5jaGVja3BvaW50ICAgPSBDSEVDS19HQVA7Cit9CisKKy8qCisgKiBJZiB0aGUgZGljdGlvbmFyeSBpcyBmdWxsLCB0aGVuIHNlZSBpZiBpdCBpcyB0aW1lIHRvIHJlc2V0IGl0LgorICoKKyAqIENvbXB1dGUgdGhlIGNvbXByZXNzaW9uIHJhdGlvIHVzaW5nIGZpeGVkLXBvaW50IGFyaXRobWV0aWMKKyAqIHdpdGggOCBmcmFjdGlvbmFsIGJpdHMuCisgKgorICogU2luY2Ugd2UgaGF2ZSBhbiBpbmZpbml0ZSBzdHJlYW0gaW5zdGVhZCBvZiBhIHNpbmdsZSBmaWxlLAorICogd2F0Y2ggb25seSB0aGUgbG9jYWwgY29tcHJlc3Npb24gcmF0aW8uCisgKgorICogU2luY2UgYm90aCBwZWVycyBtdXN0IHJlc2V0IHRoZSBkaWN0aW9uYXJ5IGF0IHRoZSBzYW1lIHRpbWUgZXZlbiBpbgorICogdGhlIGFic2VuY2Ugb2YgQ0xFQVIgY29kZXMgKHdoaWxlIHBhY2tldHMgYXJlIGluY29tcHJlc3NpYmxlKSwgdGhleQorICogbXVzdCBjb21wdXRlIHRoZSBzYW1lIHJhdGlvLgorICovCisKK3N0YXRpYyBpbnQgYnNkX2NoZWNrIChzdHJ1Y3QgYnNkX2RiICpkYikJLyogMT1vdXRwdXQgQ0xFQVIgKi8KKyAgeworICAgIHVuc2lnbmVkIGludCBuZXdfcmF0aW87CisKKyAgICBpZiAoZGItPmluX2NvdW50ID49IGRiLT5jaGVja3BvaW50KQorICAgICAgeworCS8qIGFnZSB0aGUgcmF0aW8gYnkgbGltaXRpbmcgdGhlIHNpemUgb2YgdGhlIGNvdW50cyAqLworCWlmIChkYi0+aW5fY291bnQgPj0gUkFUSU9fTUFYIHx8IGRiLT5ieXRlc19vdXQgPj0gUkFUSU9fTUFYKQorCSAgeworCSAgICBkYi0+aW5fY291bnQgIC09IChkYi0+aW5fY291bnQgID4+IDIpOworCSAgICBkYi0+Ynl0ZXNfb3V0IC09IChkYi0+Ynl0ZXNfb3V0ID4+IDIpOworCSAgfQorCQorCWRiLT5jaGVja3BvaW50ID0gZGItPmluX2NvdW50ICsgQ0hFQ0tfR0FQOworCQorCWlmIChkYi0+bWF4X2VudCA+PSBkYi0+bWF4bWF4Y29kZSkKKwkgIHsKKwkgICAgLyogUmVzZXQgdGhlIGRpY3Rpb25hcnkgb25seSBpZiB0aGUgcmF0aW8gaXMgd29yc2UsCisJICAgICAqIG9yIGlmIGl0IGxvb2tzIGFzIGlmIGl0IGhhcyBiZWVuIHBvaXNvbmVkCisJICAgICAqIGJ5IGluY29tcHJlc3NpYmxlIGRhdGEuCisJICAgICAqCisJICAgICAqIFRoaXMgZG9lcyBub3Qgb3ZlcmZsb3csIGJlY2F1c2UKKwkgICAgICoJZGItPmluX2NvdW50IDw9IFJBVElPX01BWC4KKwkgICAgICovCisKKwkgICAgbmV3X3JhdGlvID0gZGItPmluX2NvdW50IDw8IFJBVElPX1NDQUxFX0xPRzsKKwkgICAgaWYgKGRiLT5ieXRlc19vdXQgIT0gMCkKKwkgICAgICB7CisJCW5ld19yYXRpbyAvPSBkYi0+Ynl0ZXNfb3V0OworCSAgICAgIH0KKwkgICAgCisJICAgIGlmIChuZXdfcmF0aW8gPCBkYi0+cmF0aW8gfHwgbmV3X3JhdGlvIDwgMSAqIFJBVElPX1NDQUxFKQorCSAgICAgIHsKKwkJYnNkX2NsZWFyIChkYik7CisJCXJldHVybiAxOworCSAgICAgIH0KKwkgICAgZGItPnJhdGlvID0gbmV3X3JhdGlvOworCSAgfQorICAgICAgfQorICAgIHJldHVybiAwOworICB9CisKKy8qCisgKiBSZXR1cm4gc3RhdGlzdGljcy4KKyAqLworCitzdGF0aWMgdm9pZCBic2RfY29tcF9zdGF0cyAodm9pZCAqc3RhdGUsIHN0cnVjdCBjb21wc3RhdCAqc3RhdHMpCisgIHsKKyAgICBzdHJ1Y3QgYnNkX2RiICpkYiA9IChzdHJ1Y3QgYnNkX2RiICopIHN0YXRlOworICAgIAorICAgIHN0YXRzLT51bmNfYnl0ZXMgICAgPSBkYi0+dW5jb21wX2J5dGVzOworICAgIHN0YXRzLT51bmNfcGFja2V0cyAgPSBkYi0+dW5jb21wX2NvdW50OworICAgIHN0YXRzLT5jb21wX2J5dGVzICAgPSBkYi0+Y29tcF9ieXRlczsKKyAgICBzdGF0cy0+Y29tcF9wYWNrZXRzID0gZGItPmNvbXBfY291bnQ7CisgICAgc3RhdHMtPmluY19ieXRlcyAgICA9IGRiLT5pbmNvbXBfYnl0ZXM7CisgICAgc3RhdHMtPmluY19wYWNrZXRzICA9IGRiLT5pbmNvbXBfY291bnQ7CisgICAgc3RhdHMtPmluX2NvdW50ICAgICA9IGRiLT5pbl9jb3VudDsKKyAgICBzdGF0cy0+Ynl0ZXNfb3V0ICAgID0gZGItPmJ5dGVzX291dDsKKyAgfQorCisvKgorICogUmVzZXQgc3RhdGUsIGFzIG9uIGEgQ0NQIFJlc2V0UmVxLgorICovCisKK3N0YXRpYyB2b2lkIGJzZF9yZXNldCAodm9pZCAqc3RhdGUpCisgIHsKKyAgICBzdHJ1Y3QgYnNkX2RiICpkYiA9IChzdHJ1Y3QgYnNkX2RiICopIHN0YXRlOworCisgICAgYnNkX2NsZWFyKGRiKTsKKworICAgIGRiLT5zZXFubyAgICAgICA9IDA7CisgICAgZGItPmNsZWFyX2NvdW50ID0gMDsKKyAgfQorCisvKgorICogUmVsZWFzZSB0aGUgY29tcHJlc3Npb24gc3RydWN0dXJlCisgKi8KKworc3RhdGljIHZvaWQgYnNkX2ZyZWUgKHZvaWQgKnN0YXRlKQorICB7CisgICAgc3RydWN0IGJzZF9kYiAqZGIgPSAoc3RydWN0IGJzZF9kYiAqKSBzdGF0ZTsKKyAgICAKKyAgICBpZiAoZGIpCisgICAgICB7CisvKgorICogUmVsZWFzZSB0aGUgZGljdGlvbmFyeQorICovCisJaWYgKGRiLT5kaWN0KQorCSAgeworCSAgICB2ZnJlZSAoZGItPmRpY3QpOworCSAgICBkYi0+ZGljdCA9IE5VTEw7CisJICB9CisvKgorICogUmVsZWFzZSB0aGUgc3RyaW5nIGJ1ZmZlcgorICovCisJaWYgKGRiLT5sZW5zKQorCSAgeworCSAgICB2ZnJlZSAoZGItPmxlbnMpOworCSAgICBkYi0+bGVucyA9IE5VTEw7CisJICB9CisvKgorICogRmluYWxseSByZWxlYXNlIHRoZSBzdHJ1Y3R1cmUgaXRzZWxmLgorICovCisJa2ZyZWUgKGRiKTsKKyAgICAgIH0KKyAgfQorCisvKgorICogQWxsb2NhdGUgc3BhY2UgZm9yIGEgKGRlKSBjb21wcmVzc29yLgorICovCisKK3N0YXRpYyB2b2lkICpic2RfYWxsb2MgKHVuc2lnbmVkIGNoYXIgKm9wdGlvbnMsIGludCBvcHRfbGVuLCBpbnQgZGVjb21wKQorICB7CisgICAgaW50IGJpdHM7CisgICAgdW5zaWduZWQgaW50IGhzaXplLCBoc2hpZnQsIG1heG1heGNvZGU7CisgICAgc3RydWN0IGJzZF9kYiAqZGI7CisKKyAgICBpZiAob3B0X2xlbiAhPSAzIHx8IG9wdGlvbnNbMF0gIT0gQ0lfQlNEX0NPTVBSRVNTIHx8IG9wdGlvbnNbMV0gIT0gMworCXx8IEJTRF9WRVJTSU9OKG9wdGlvbnNbMl0pICE9IEJTRF9DVVJSRU5UX1ZFUlNJT04pCisgICAgICB7CisJcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgICBiaXRzID0gQlNEX05CSVRTKG9wdGlvbnNbMl0pOworCisgICAgc3dpdGNoIChiaXRzKQorICAgICAgeworICAgIGNhc2UgOToJCQkvKiBuZWVkcyA4MjE1MiBmb3IgYm90aCBkaXJlY3Rpb25zICovCisgICAgY2FzZSAxMDoJCQkvKiBuZWVkcyA4NDE0NCAqLworICAgIGNhc2UgMTE6CQkJLyogbmVlZHMgODgyNDAgKi8KKyAgICBjYXNlIDEyOgkJCS8qIG5lZWRzIDk2NDMyICovCisJaHNpemUgPSA1MDAzOworCWhzaGlmdCA9IDQ7CisJYnJlYWs7CisgICAgY2FzZSAxMzoJCQkvKiBuZWVkcyAxNzY3ODQgKi8KKwloc2l6ZSA9IDkwMDE7CisJaHNoaWZ0ID0gNTsKKwlicmVhazsKKyAgICBjYXNlIDE0OgkJCS8qIG5lZWRzIDM1Mzc0NCAqLworCWhzaXplID0gMTgwMTM7CisJaHNoaWZ0ID0gNjsKKwlicmVhazsKKyAgICBjYXNlIDE1OgkJCS8qIG5lZWRzIDY5MTQ0MCAqLworCWhzaXplID0gMzUwMjM7CisJaHNoaWZ0ID0gNzsKKwlicmVhazsKKyAgICBjYXNlIDE2OgkJCS8qIG5lZWRzIDEzNjYxNjAtLWZhciB0b28gbXVjaCwgKi8KKwkvKiBoc2l6ZSA9IDY5MDAxOyAqLwkvKiBhbmQgNjkwMDEgaXMgdG9vIGJpZyBmb3IgY3B0ciAqLworCS8qIGhzaGlmdCA9IDg7ICovCS8qIGluIHN0cnVjdCBic2RfZGIgKi8KKwkvKiBicmVhazsgKi8KKyAgICBkZWZhdWx0OgorCXJldHVybiBOVUxMOworICAgICAgfQorLyoKKyAqIEFsbG9jYXRlIHRoZSBtYWluIGNvbnRyb2wgc3RydWN0dXJlIGZvciB0aGlzIGluc3RhbmNlLgorICovCisgICAgbWF4bWF4Y29kZSA9IE1BWENPREUoYml0cyk7CisgICAgZGIgICAgICAgICA9IChzdHJ1Y3QgYnNkX2RiICopIGttYWxsb2MgKHNpemVvZiAoc3RydWN0IGJzZF9kYiksCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIWRiKQorICAgICAgeworCXJldHVybiBOVUxMOworICAgICAgfQorCisgICAgbWVtc2V0IChkYiwgMCwgc2l6ZW9mKHN0cnVjdCBic2RfZGIpKTsKKy8qCisgKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGRpY3Rpb25hcnkuIFRoaXMgbWF5IGJlIG1vcmUgdGhhbiBvbmUgcGFnZSBpbgorICogbGVuZ3RoLgorICovCisgICAgZGItPmRpY3QgPSAoc3RydWN0IGJzZF9kaWN0ICopIHZtYWxsb2MgKGhzaXplICoKKwkJCQkJICAgIHNpemVvZiAoc3RydWN0IGJzZF9kaWN0KSk7CisgICAgaWYgKCFkYi0+ZGljdCkKKyAgICAgIHsKKwlic2RfZnJlZSAoZGIpOworCXJldHVybiBOVUxMOworICAgICAgfQorCisvKgorICogSWYgdGhpcyBpcyB0aGUgY29tcHJlc3Npb24gYnVmZmVyIHRoZW4gdGhlcmUgaXMgbm8gbGVuZ3RoIGRhdGEuCisgKi8KKyAgICBpZiAoIWRlY29tcCkKKyAgICAgIHsKKwlkYi0+bGVucyA9IE5VTEw7CisgICAgICB9CisvKgorICogRm9yIGRlY29tcHJlc3Npb24sIHRoZSBsZW5ndGggaW5mb3JtYXRpb24gaXMgbmVlZGVkIGFzIHdlbGwuCisgKi8KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIGRiLT5sZW5zID0gKHVuc2lnbmVkIHNob3J0ICopIHZtYWxsb2MgKChtYXhtYXhjb2RlICsgMSkgKgorCQkJCQkgICAgICAgc2l6ZW9mIChkYi0+bGVuc1swXSkpOworCWlmICghZGItPmxlbnMpCisJICB7CisJICAgIGJzZF9mcmVlIChkYik7CisJICAgIHJldHVybiAoTlVMTCk7CisJICB9CisgICAgICB9CisvKgorICogSW5pdGlhbGl6ZSB0aGUgZGF0YSBpbmZvcm1hdGlvbiBmb3IgdGhlIGNvbXByZXNzaW9uIGNvZGUKKyAqLworICAgIGRiLT50b3RsZW4gICAgID0gc2l6ZW9mIChzdHJ1Y3QgYnNkX2RiKSAgICsKKyAgICAgIAkJICAgIChzaXplb2YgKHN0cnVjdCBic2RfZGljdCkgKiBoc2l6ZSk7CisKKyAgICBkYi0+aHNpemUgICAgICA9IGhzaXplOworICAgIGRiLT5oc2hpZnQgICAgID0gaHNoaWZ0OworICAgIGRiLT5tYXhtYXhjb2RlID0gbWF4bWF4Y29kZTsKKyAgICBkYi0+bWF4Yml0cyAgICA9IGJpdHM7CisKKyAgICByZXR1cm4gKHZvaWQgKikgZGI7CisgIH0KKworc3RhdGljIHZvaWQgKmJzZF9jb21wX2FsbG9jICh1bnNpZ25lZCBjaGFyICpvcHRpb25zLCBpbnQgb3B0X2xlbikKKyAgeworICAgIHJldHVybiBic2RfYWxsb2MgKG9wdGlvbnMsIG9wdF9sZW4sIDApOworICB9CisKK3N0YXRpYyB2b2lkICpic2RfZGVjb21wX2FsbG9jICh1bnNpZ25lZCBjaGFyICpvcHRpb25zLCBpbnQgb3B0X2xlbikKKyAgeworICAgIHJldHVybiBic2RfYWxsb2MgKG9wdGlvbnMsIG9wdF9sZW4sIDEpOworICB9CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBkYXRhYmFzZS4KKyAqLworCitzdGF0aWMgaW50IGJzZF9pbml0ICh2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqb3B0aW9ucywKKwkJICAgICBpbnQgb3B0X2xlbiwgaW50IHVuaXQsIGludCBkZWJ1ZywgaW50IGRlY29tcCkKKyAgeworICAgIHN0cnVjdCBic2RfZGIgKmRiID0gc3RhdGU7CisgICAgaW50IGluZHg7CisgICAgCisgICAgaWYgKChvcHRfbGVuICE9IDMpIHx8IChvcHRpb25zWzBdICE9IENJX0JTRF9DT01QUkVTUykgfHwgKG9wdGlvbnNbMV0gIT0gMykKKwl8fCAoQlNEX1ZFUlNJT04ob3B0aW9uc1syXSkgIT0gQlNEX0NVUlJFTlRfVkVSU0lPTikKKwl8fCAoQlNEX05CSVRTKG9wdGlvbnNbMl0pICE9IGRiLT5tYXhiaXRzKQorCXx8IChkZWNvbXAgJiYgZGItPmxlbnMgPT0gTlVMTCkpCisgICAgICB7CisJcmV0dXJuIDA7CisgICAgICB9CisKKyAgICBpZiAoZGVjb21wKQorICAgICAgeworCWluZHggPSBMQVNUOworCWRvCisJICB7CisJICAgIGRiLT5sZW5zW2luZHhdID0gMTsKKwkgIH0KKwl3aGlsZSAoaW5keC0tID4gMCk7CisgICAgICB9CisKKyAgICBpbmR4ID0gZGItPmhzaXplOworICAgIHdoaWxlIChpbmR4LS0gIT0gMCkKKyAgICAgIHsKKwlkYi0+ZGljdFtpbmR4XS5jb2RlbTEgPSBCQURDT0RFTTE7CisJZGItPmRpY3RbaW5keF0uY3B0ciAgID0gMDsKKyAgICAgIH0KKworICAgIGRiLT51bml0ID0gdW5pdDsKKyAgICBkYi0+bXJ1ICA9IDA7CisjaWZuZGVmIERFQlVHCisgICAgaWYgKGRlYnVnKQorI2VuZGlmCisgICAgICBkYi0+ZGVidWcgPSAxOworICAgIAorICAgIGJzZF9yZXNldChkYik7CisgICAgCisgICAgcmV0dXJuIDE7CisgIH0KKworc3RhdGljIGludCBic2RfY29tcF9pbml0ICh2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqb3B0aW9ucywKKwkJCSAgaW50IG9wdF9sZW4sIGludCB1bml0LCBpbnQgb3B0aGRyLCBpbnQgZGVidWcpCisgIHsKKyAgICByZXR1cm4gYnNkX2luaXQgKHN0YXRlLCBvcHRpb25zLCBvcHRfbGVuLCB1bml0LCBkZWJ1ZywgMCk7CisgIH0KKworc3RhdGljIGludCBic2RfZGVjb21wX2luaXQgKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICpvcHRpb25zLAorCQkJICAgIGludCBvcHRfbGVuLCBpbnQgdW5pdCwgaW50IG9wdGhkciwgaW50IG1ydSwKKwkJCSAgICBpbnQgZGVidWcpCisgIHsKKyAgICByZXR1cm4gYnNkX2luaXQgKHN0YXRlLCBvcHRpb25zLCBvcHRfbGVuLCB1bml0LCBkZWJ1ZywgMSk7CisgIH0KKworLyoKKyAqIE9idGFpbiBwb2ludGVycyB0byB0aGUgdmFyaW91cyBzdHJ1Y3R1cmVzIGluIHRoZSBjb21wcmVzc2lvbiB0YWJsZXMKKyAqLworCisjZGVmaW5lIGRpY3RfcHRyeChwLGlkeCkgJihwLT5kaWN0W2lkeF0pCisjZGVmaW5lIGxlbnNfcHRyeChwLGlkeCkgJihwLT5sZW5zW2lkeF0pCisKKyNpZmRlZiBERUJVRworc3RhdGljIHVuc2lnbmVkIHNob3J0ICpsZW5zX3B0cihzdHJ1Y3QgYnNkX2RiICpkYiwgaW50IGlkeCkKKyAgeworICAgIGlmICgodW5zaWduZWQgaW50KSBpZHggPiAodW5zaWduZWQgaW50KSBkYi0+bWF4bWF4Y29kZSkKKyAgICAgIHsKKwlwcmludGsgKCI8OT5wcHA6IGxlbnNfcHRyKCVkKSA+IG1heFxuIiwgaWR4KTsKKwlpZHggPSAwOworICAgICAgfQorICAgIHJldHVybiBsZW5zX3B0cnggKGRiLCBpZHgpOworICB9CisKK3N0YXRpYyBzdHJ1Y3QgYnNkX2RpY3QgKmRpY3RfcHRyKHN0cnVjdCBic2RfZGIgKmRiLCBpbnQgaWR4KQorICB7CisgICAgaWYgKCh1bnNpZ25lZCBpbnQpIGlkeCA+PSAodW5zaWduZWQgaW50KSBkYi0+aHNpemUpCisgICAgICB7CisJcHJpbnRrICgiPDk+cHBwOiBkaWN0X3B0ciglZCkgPiBtYXhcbiIsIGlkeCk7CisJaWR4ID0gMDsKKyAgICAgIH0KKyAgICByZXR1cm4gZGljdF9wdHJ4IChkYiwgaWR4KTsKKyAgfQorCisjZWxzZQorI2RlZmluZSBsZW5zX3B0cihkYixpZHgpIGxlbnNfcHRyeChkYixpZHgpCisjZGVmaW5lIGRpY3RfcHRyKGRiLGlkeCkgZGljdF9wdHJ4KGRiLGlkeCkKKyNlbmRpZgorCisvKgorICogY29tcHJlc3MgYSBwYWNrZXQKKyAqCisgKglUaGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gaXMgdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzZWQKKyAqCXBhY2tldC4gQSB6ZXJvIGlzIHJldHVybmVkIGlmIHRoZSBwYWNrZXQgd2FzIG5vdCBjb21wcmVzc2VkCisgKglmb3Igc29tZSByZWFzb24sIHN1Y2ggYXMgdGhlIHNpemUgYmVpbmcgbGFyZ2VyIHRoYW4gdW5jb21wcmVzc2VkLgorICoKKyAqCU9uZSBjaGFuZ2UgZnJvbSB0aGUgQlNEIGNvbXByZXNzIGNvbW1hbmQgaXMgdGhhdCB3aGVuIHRoZQorICoJY29kZSBzaXplIGV4cGFuZHMsIHdlIGRvIG5vdCBvdXRwdXQgYSBidW5jaCBvZiBwYWRkaW5nLgorICovCisKK3N0YXRpYyBpbnQgYnNkX2NvbXByZXNzICh2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqcnB0ciwgdW5zaWduZWQgY2hhciAqb2J1ZiwKKwkJCSBpbnQgaXNpemUsIGludCBvc2l6ZSkKKyAgeworICAgIHN0cnVjdCBic2RfZGIgKmRiOworICAgIGludCBoc2hpZnQ7CisgICAgdW5zaWduZWQgaW50IG1heF9lbnQ7CisgICAgdW5zaWduZWQgaW50IG5fYml0czsKKyAgICB1bnNpZ25lZCBpbnQgYml0bm87CisgICAgdW5zaWduZWQgbG9uZyBhY2NtOworICAgIGludCBlbnQ7CisgICAgdW5zaWduZWQgbG9uZyBmY29kZTsKKyAgICBzdHJ1Y3QgYnNkX2RpY3QgKmRpY3RwOworICAgIHVuc2lnbmVkIGNoYXIgYzsKKyAgICBpbnQgaHZhbDsKKyAgICBpbnQgZGlzcDsKKyAgICBpbnQgaWxlbjsKKyAgICBpbnQgbXhjb2RlOworICAgIHVuc2lnbmVkIGNoYXIgKndwdHI7CisgICAgaW50IG9sZW47CisKKyNkZWZpbmUgUFVUQllURSh2KQkJCVwKKyAgewkJCQkJXAorICAgICsrb2xlbjsJCQkJXAorICAgIGlmICh3cHRyKQkJCQlcCisgICAgICB7CQkJCQlcCisJKndwdHIrKyA9ICh1bnNpZ25lZCBjaGFyKSAodik7CVwKKwlpZiAob2xlbiA+PSBvc2l6ZSkJCVwKKwkgIHsJCQkJXAorCSAgICB3cHRyID0gTlVMTDsJCVwKKwkgIH0JCQkJXAorICAgICAgfQkJCQkJXAorICB9CisKKyNkZWZpbmUgT1VUUFVUKGVudCkJCQlcCisgIHsJCQkJCVwKKyAgICBiaXRubyAtPSBuX2JpdHM7CQkJXAorICAgIGFjY20gfD0gKChlbnQpIDw8IGJpdG5vKTsJCVwKKyAgICBkbwkJCQkJXAorICAgICAgewkJCQkJXAorCVBVVEJZVEUoYWNjbSA+PiAyNCk7CQlcCisJYWNjbSA8PD0gODsJCQlcCisJYml0bm8gKz0gODsJCQlcCisgICAgICB9CQkJCQlcCisgICAgd2hpbGUgKGJpdG5vIDw9IDI0KTsJCVwKKyAgfQorCisgIC8qCisgICAqIElmIHRoZSBwcm90b2NvbCBpcyBub3QgaW4gdGhlIHJhbmdlIHdlJ3JlIGludGVyZXN0ZWQgaW4sCisgICAqIGp1c3QgcmV0dXJuIHdpdGhvdXQgY29tcHJlc3NpbmcgdGhlIHBhY2tldC4gIElmIGl0IGlzLAorICAgKiB0aGUgcHJvdG9jb2wgYmVjb21lcyB0aGUgZmlyc3QgYnl0ZSB0byBjb21wcmVzcy4KKyAgICovCisKKyAgICBlbnQgPSBQUFBfUFJPVE9DT0wocnB0cik7CisgICAgaWYgKGVudCA8IDB4MjEgfHwgZW50ID4gMHhmOSkKKyAgICAgIHsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKworICAgIGRiICAgICAgPSAoc3RydWN0IGJzZF9kYiAqKSBzdGF0ZTsKKyAgICBoc2hpZnQgID0gZGItPmhzaGlmdDsKKyAgICBtYXhfZW50ID0gZGItPm1heF9lbnQ7CisgICAgbl9iaXRzICA9IGRiLT5uX2JpdHM7CisgICAgYml0bm8gICA9IDMyOworICAgIGFjY20gICAgPSAwOworICAgIG14Y29kZSAgPSBNQVhDT0RFIChuX2JpdHMpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgb3V0cHV0IHBvaW50ZXJzICovCisgICAgd3B0ciAgPSBvYnVmOworICAgIG9sZW4gID0gUFBQX0hEUkxFTiArIEJTRF9PVkhEOworCisgICAgaWYgKG9zaXplID4gaXNpemUpCisgICAgICB7CisJb3NpemUgPSBpc2l6ZTsKKyAgICAgIH0KKworICAgIC8qIFRoaXMgaXMgdGhlIFBQUCBoZWFkZXIgaW5mb3JtYXRpb24gKi8KKyAgICBpZiAod3B0cikKKyAgICAgIHsKKwkqd3B0cisrID0gUFBQX0FERFJFU1MocnB0cik7CisJKndwdHIrKyA9IFBQUF9DT05UUk9MKHJwdHIpOworCSp3cHRyKysgPSAwOworCSp3cHRyKysgPSBQUFBfQ09NUDsKKwkqd3B0cisrID0gZGItPnNlcW5vID4+IDg7CisJKndwdHIrKyA9IGRiLT5zZXFubzsKKyAgICAgIH0KKworICAgIC8qIFNraXAgdGhlIGlucHV0IGhlYWRlciAqLworICAgIHJwdHIgICs9IFBQUF9IRFJMRU47CisgICAgaXNpemUgLT0gUFBQX0hEUkxFTjsKKyAgICBpbGVuICAgPSArK2lzaXplOwkvKiBMb3cgYnl0ZSBvZiBwcm90b2NvbCBpcyBjb3VudGVkIGFzIGlucHV0ICovCisKKyAgICB3aGlsZSAoLS1pbGVuID4gMCkKKyAgICAgIHsKKwljICAgICA9ICpycHRyKys7CisJZmNvZGUgPSBCU0RfS0VZICAoZW50LCBjKTsKKwlodmFsICA9IEJTRF9IQVNIIChlbnQsIGMsIGhzaGlmdCk7CisJZGljdHAgPSBkaWN0X3B0ciAoZGIsIGh2YWwpOworCQorCS8qIFZhbGlkYXRlIGFuZCB0aGVuIGNoZWNrIHRoZSBlbnRyeS4gKi8KKwlpZiAoZGljdHAtPmNvZGVtMSA+PSBtYXhfZW50KQorCSAgeworCSAgICBnb3RvIG5vbWF0Y2g7CisJICB9CisKKwlpZiAoZGljdHAtPmYuZmNvZGUgPT0gZmNvZGUpCisJICB7CisJICAgIGVudCA9IGRpY3RwLT5jb2RlbTEgKyAxOworCSAgICBjb250aW51ZTsJLyogZm91bmQgKHByZWZpeCxzdWZmaXgpICovCisJICB9CisJCisJLyogY29udGludWUgcHJvYmluZyB1bnRpbCBhIG1hdGNoIG9yIGludmFsaWQgZW50cnkgKi8KKwlkaXNwID0gKGh2YWwgPT0gMCkgPyAxIDogaHZhbDsKKworCWRvCisJICB7CisJICAgIGh2YWwgKz0gZGlzcDsKKwkgICAgaWYgKGh2YWwgPj0gZGItPmhzaXplKQorCSAgICAgIHsKKwkJaHZhbCAtPSBkYi0+aHNpemU7CisJICAgICAgfQorCSAgICBkaWN0cCA9IGRpY3RfcHRyIChkYiwgaHZhbCk7CisJICAgIGlmIChkaWN0cC0+Y29kZW0xID49IG1heF9lbnQpCisJICAgICAgeworCQlnb3RvIG5vbWF0Y2g7CisJICAgICAgfQorCSAgfQorCXdoaWxlIChkaWN0cC0+Zi5mY29kZSAhPSBmY29kZSk7CisKKwllbnQgPSBkaWN0cC0+Y29kZW0xICsgMTsJLyogZmluYWxseSBmb3VuZCAocHJlZml4LHN1ZmZpeCkgKi8KKwljb250aW51ZTsKKwkKK25vbWF0Y2g6CisJT1VUUFVUKGVudCk7CQkvKiBvdXRwdXQgdGhlIHByZWZpeCAqLworCQorCS8qIGNvZGUgLT4gaGFzaHRhYmxlICovCisJaWYgKG1heF9lbnQgPCBkYi0+bWF4bWF4Y29kZSkKKwkgIHsKKwkgICAgc3RydWN0IGJzZF9kaWN0ICpkaWN0cDI7CisJICAgIHN0cnVjdCBic2RfZGljdCAqZGljdHAzOworCSAgICBpbnQgICAgaW5keDsKKworCSAgICAvKiBleHBhbmQgY29kZSBzaXplIGlmIG5lZWRlZCAqLworCSAgICBpZiAobWF4X2VudCA+PSBteGNvZGUpCisJICAgICAgeworCQlkYi0+bl9iaXRzID0gKytuX2JpdHM7CisJCW14Y29kZSAgICAgPSBNQVhDT0RFIChuX2JpdHMpOworCSAgICAgIH0KKwkgICAgCisJICAgIC8qIEludmFsaWRhdGUgb2xkIGhhc2ggdGFibGUgZW50cnkgdXNpbmcKKwkgICAgICogdGhpcyBjb2RlLCBhbmQgdGhlbiB0YWtlIGl0IG92ZXIuCisJICAgICAqLworCisJICAgIGRpY3RwMiA9IGRpY3RfcHRyIChkYiwgbWF4X2VudCArIDEpOworCSAgICBpbmR4ICAgPSBkaWN0cDItPmNwdHI7CisJICAgIGRpY3RwMyA9IGRpY3RfcHRyIChkYiwgaW5keCk7CisKKwkgICAgaWYgKGRpY3RwMy0+Y29kZW0xID09IG1heF9lbnQpCisJICAgICAgeworCQlkaWN0cDMtPmNvZGVtMSA9IEJBRENPREVNMTsKKwkgICAgICB9CisKKwkgICAgZGljdHAyLT5jcHRyICAgPSBodmFsOworCSAgICBkaWN0cC0+Y29kZW0xICA9IG1heF9lbnQ7CisJICAgIGRpY3RwLT5mLmZjb2RlID0gZmNvZGU7CisJICAgIGRiLT5tYXhfZW50ICAgID0gKyttYXhfZW50OworCisJICAgIGlmIChkYi0+bGVucykKKwkgICAgICB7CisJCXVuc2lnbmVkIHNob3J0ICpsZW4xID0gbGVuc19wdHIgKGRiLCBtYXhfZW50KTsKKwkJdW5zaWduZWQgc2hvcnQgKmxlbjIgPSBsZW5zX3B0ciAoZGIsIGVudCk7CisJCSpsZW4xID0gKmxlbjIgKyAxOworCSAgICAgIH0KKwkgIH0KKwllbnQgPSBjOworICAgICAgfQorICAgIAorICAgIE9VVFBVVChlbnQpOwkJLyogb3V0cHV0IHRoZSBsYXN0IGNvZGUgKi8KKworICAgIGRiLT5ieXRlc19vdXQgICAgKz0gb2xlbiAtIFBQUF9IRFJMRU4gLSBCU0RfT1ZIRDsKKyAgICBkYi0+dW5jb21wX2J5dGVzICs9IGlzaXplOworICAgIGRiLT5pbl9jb3VudCAgICAgKz0gaXNpemU7CisgICAgKytkYi0+dW5jb21wX2NvdW50OworICAgICsrZGItPnNlcW5vOworCisgICAgaWYgKGJpdG5vIDwgMzIpCisgICAgICB7CisJKytkYi0+Ynl0ZXNfb3V0OyAvKiBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbGluZyBic2RfY2hlY2sgKi8KKyAgICAgIH0KKworICAgIC8qCisgICAgICogR2VuZXJhdGUgdGhlIGNsZWFyIGNvbW1hbmQgaWYgbmVlZGVkCisgICAgICovCisKKyAgICBpZiAoYnNkX2NoZWNrKGRiKSkKKyAgICAgIHsKKwlPVVRQVVQgKENMRUFSKTsKKyAgICAgIH0KKyAgICAKKyAgICAvKgorICAgICAqIFBhZCBkcmliYmxlIGJpdHMgb2YgbGFzdCBjb2RlIHdpdGggb25lcy4KKyAgICAgKiBEbyBub3QgZW1pdCBhIGNvbXBsZXRlbHkgdXNlbGVzcyBieXRlIG9mIG9uZXMuCisgICAgICovCisKKyAgICBpZiAoYml0bm8gIT0gMzIpCisgICAgICB7CisJUFVUQllURSgoYWNjbSB8ICgweGZmIDw8IChiaXRuby04KSkpID4+IDI0KTsKKyAgICAgIH0KKyAgICAKKyAgICAvKgorICAgICAqIEluY3JlYXNlIGNvZGUgc2l6ZSBpZiB3ZSB3b3VsZCBoYXZlIHdpdGhvdXQgdGhlIHBhY2tldAorICAgICAqIGJvdW5kYXJ5IGJlY2F1c2UgdGhlIGRlY29tcHJlc3NvciB3aWxsIGRvIHNvLgorICAgICAqLworCisgICAgaWYgKG1heF9lbnQgPj0gbXhjb2RlICYmIG1heF9lbnQgPCBkYi0+bWF4bWF4Y29kZSkKKyAgICAgIHsKKwlkYi0+bl9iaXRzKys7CisgICAgICB9CisKKyAgICAvKiBJZiBvdXRwdXQgbGVuZ3RoIGlzIHRvbyBsYXJnZSB0aGVuIHRoaXMgaXMgYW4gaW5jb21wbGV0ZSBmcmFtZS4gKi8KKyAgICBpZiAod3B0ciA9PSBOVUxMKQorICAgICAgeworCSsrZGItPmluY29tcF9jb3VudDsKKwlkYi0+aW5jb21wX2J5dGVzICs9IGlzaXplOworCW9sZW4gICAgICAgICAgICAgID0gMDsKKyAgICAgIH0KKyAgICBlbHNlIC8qIENvdW50IHRoZSBudW1iZXIgb2YgY29tcHJlc3NlZCBmcmFtZXMgKi8KKyAgICAgIHsKKwkrK2RiLT5jb21wX2NvdW50OworCWRiLT5jb21wX2J5dGVzICs9IG9sZW47CisgICAgICB9CisKKyAgICAvKiBSZXR1cm4gdGhlIHJlc3VsdGluZyBvdXRwdXQgbGVuZ3RoICovCisgICAgcmV0dXJuIG9sZW47CisjdW5kZWYgT1VUUFVUCisjdW5kZWYgUFVUQllURQorICB9CisKKy8qCisgKiBVcGRhdGUgdGhlICJCU0QgQ29tcHJlc3MiIGRpY3Rpb25hcnkgb24gdGhlIHJlY2VpdmVyIGZvcgorICogaW5jb21wcmVzc2libGUgZGF0YSBieSBwcmV0ZW5kaW5nIHRvIGNvbXByZXNzIHRoZSBpbmNvbWluZyBkYXRhLgorICovCisKK3N0YXRpYyB2b2lkIGJzZF9pbmNvbXAgKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICppYnVmLCBpbnQgaWNudCkKKyAgeworICAgICh2b2lkKSBic2RfY29tcHJlc3MgKHN0YXRlLCBpYnVmLCAoY2hhciAqKSAwLCBpY250LCAwKTsKKyAgfQorCisvKgorICogRGVjb21wcmVzcyAiQlNEIENvbXByZXNzIi4KKyAqCisgKiBCZWNhdXNlIG9mIHBhdGVudCBwcm9ibGVtcywgd2UgcmV0dXJuIERFQ09NUF9FUlJPUiBmb3IgZXJyb3JzCisgKiBmb3VuZCBieSBpbnNwZWN0aW5nIHRoZSBpbnB1dCBkYXRhIGFuZCBmb3Igc3lzdGVtIHByb2JsZW1zLCBidXQKKyAqIERFQ09NUF9GQVRBTEVSUk9SIGZvciBhbnkgZXJyb3JzIHdoaWNoIGNvdWxkIHBvc3NpYmx5IGJlIHNhaWQgdG8KKyAqIGJlIGJlaW5nIGRldGVjdGVkICJhZnRlciIgZGVjb21wcmVzc2lvbi4gIEZvciBERUNPTVBfRVJST1IsCisgKiB3ZSBjYW4gaXNzdWUgYSBDQ1AgcmVzZXQtcmVxdWVzdDsgZm9yIERFQ09NUF9GQVRBTEVSUk9SLCB3ZSBtYXkgYmUKKyAqIGluZnJpbmdpbmcgYSBwYXRlbnQgb2YgTW90b3JvbGEncyBpZiB3ZSBkbywgc28gd2UgdGFrZSBDQ1AgZG93bgorICogaW5zdGVhZC4KKyAqCisgKiBHaXZlbiB0aGF0IHRoZSBmcmFtZSBoYXMgdGhlIGNvcnJlY3Qgc2VxdWVuY2UgbnVtYmVyIGFuZCBhIGdvb2QgRkNTLAorICogZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBjb2RlcyBpbiB0aGUgaW5wdXQgbW9zdCBsaWtlbHkgaW5kaWNhdGUgYQorICogYnVnLCBzbyB3ZSByZXR1cm4gREVDT01QX0ZBVEFMRVJST1IgZm9yIHRoZW0gaW4gb3JkZXIgdG8gdHVybiBvZmYKKyAqIGNvbXByZXNzaW9uLCBldmVuIHRob3VnaCB0aGV5IGFyZSBkZXRlY3RlZCBieSBpbnNwZWN0aW5nIHRoZSBpbnB1dC4KKyAqLworCitzdGF0aWMgaW50IGJzZF9kZWNvbXByZXNzICh2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqaWJ1ZiwgaW50IGlzaXplLAorCQkJICAgdW5zaWduZWQgY2hhciAqb2J1ZiwgaW50IG9zaXplKQorICB7CisgICAgc3RydWN0IGJzZF9kYiAqZGI7CisgICAgdW5zaWduZWQgaW50IG1heF9lbnQ7CisgICAgdW5zaWduZWQgbG9uZyBhY2NtOworICAgIHVuc2lnbmVkIGludCBiaXRubzsJCS8qIDFzdCB2YWxpZCBiaXQgaW4gYWNjbSAqLworICAgIHVuc2lnbmVkIGludCBuX2JpdHM7CisgICAgdW5zaWduZWQgaW50IHRndGJpdG5vOwkvKiBiaXRubyB3aGVuIHdlIGhhdmUgYSBjb2RlICovCisgICAgc3RydWN0IGJzZF9kaWN0ICpkaWN0cDsKKyAgICBpbnQgZXhwbGVuOworICAgIGludCBzZXE7CisgICAgdW5zaWduZWQgaW50IGluY29kZTsKKyAgICB1bnNpZ25lZCBpbnQgb2xkY29kZTsKKyAgICB1bnNpZ25lZCBpbnQgZmluY2hhcjsKKyAgICB1bnNpZ25lZCBjaGFyICpwOworICAgIHVuc2lnbmVkIGNoYXIgKndwdHI7CisgICAgaW50IGFkcnM7CisgICAgaW50IGN0cmw7CisgICAgaW50IGlsZW47CisgICAgaW50IGNvZGVsZW47CisgICAgaW50IGV4dHJhOworCisgICAgZGIgICAgICAgPSAoc3RydWN0IGJzZF9kYiAqKSBzdGF0ZTsKKyAgICBtYXhfZW50ICA9IGRiLT5tYXhfZW50OworICAgIGFjY20gICAgID0gMDsKKyAgICBiaXRubyAgICA9IDMyOwkJLyogMXN0IHZhbGlkIGJpdCBpbiBhY2NtICovCisgICAgbl9iaXRzICAgPSBkYi0+bl9iaXRzOworICAgIHRndGJpdG5vID0gMzIgLSBuX2JpdHM7CS8qIGJpdG5vIHdoZW4gd2UgaGF2ZSBhIGNvZGUgKi8KKyAgICAKKyAgICAvKgorICAgICAqIFNhdmUgdGhlIGFkZHJlc3MvY29udHJvbCBmcm9tIHRoZSBQUFAgaGVhZGVyCisgICAgICogYW5kIHRoZW4gZ2V0IHRoZSBzZXF1ZW5jZSBudW1iZXIuCisgICAgICovCisKKyAgICBhZHJzICA9IFBQUF9BRERSRVNTIChpYnVmKTsKKyAgICBjdHJsICA9IFBQUF9DT05UUk9MIChpYnVmKTsKKworICAgIHNlcSAgID0gKGlidWZbNF0gPDwgOCkgKyBpYnVmWzVdOworCisgICAgaWJ1ZiArPSAoUFBQX0hEUkxFTiArIDIpOworICAgIGlsZW4gID0gaXNpemUgLSAoUFBQX0hEUkxFTiArIDIpOworICAgIAorICAgIC8qCisgICAgICogQ2hlY2sgdGhlIHNlcXVlbmNlIG51bWJlciBhbmQgZ2l2ZSB1cCBpZiBpdCBkaWZmZXJzIGZyb20KKyAgICAgKiB0aGUgdmFsdWUgd2UncmUgZXhwZWN0aW5nLgorICAgICAqLworCisgICAgaWYgKHNlcSAhPSBkYi0+c2Vxbm8pCisgICAgICB7CisJaWYgKGRiLT5kZWJ1ZykKKwkgIHsKKwkgICAgcHJpbnRrKCJic2RfZGVjb21wJWQ6IGJhZCBzZXF1ZW5jZSAjICVkLCBleHBlY3RlZCAlZFxuIiwKKwkJICAgZGItPnVuaXQsIHNlcSwgZGItPnNlcW5vIC0gMSk7CisJICB9CisJcmV0dXJuIERFQ09NUF9FUlJPUjsKKyAgICAgIH0KKworICAgICsrZGItPnNlcW5vOworICAgIGRiLT5ieXRlc19vdXQgKz0gaWxlbjsKKworICAgIC8qCisgICAgICogRmlsbCBpbiB0aGUgcHBwIGhlYWRlciwgYnV0IG5vdCB0aGUgbGFzdCBieXRlIG9mIHRoZSBwcm90b2NvbAorICAgICAqICh0aGF0IGNvbWVzIGZyb20gdGhlIGRlY29tcHJlc3NlZCBkYXRhKS4KKyAgICAgKi8KKworICAgIHdwdHIgICAgPSBvYnVmOworICAgICp3cHRyKysgPSBhZHJzOworICAgICp3cHRyKysgPSBjdHJsOworICAgICp3cHRyKysgPSAwOworICAgIAorICAgIG9sZGNvZGUgPSBDTEVBUjsKKyAgICBleHBsZW4gID0gMzsKKworICAgIC8qCisgICAgICogS2VlcCB0aGUgY2hlY2twb2ludCBjb3JyZWN0bHkgc28gdGhhdCBpbmNvbXByZXNzaWJsZSBwYWNrZXRzCisgICAgICogY2xlYXIgdGhlIGRpY3Rpb25hcnkgYXQgdGhlIHByb3BlciB0aW1lcy4KKyAgICAgKi8KKworICAgIGZvciAoOzspCisgICAgICB7CisJaWYgKGlsZW4tLSA8PSAwKQorCSAgeworCSAgICBkYi0+aW5fY291bnQgKz0gKGV4cGxlbiAtIDMpOyAvKiBkb24ndCBjb3VudCB0aGUgaGVhZGVyICovCisJICAgIGJyZWFrOworCSAgfQorCisJLyoKKwkgKiBBY2N1bXVsYXRlIGJ5dGVzIHVudGlsIHdlIGhhdmUgYSBjb21wbGV0ZSBjb2RlLgorCSAqIFRoZW4gZ2V0IHRoZSBuZXh0IGNvZGUsIHJlbHlpbmcgb24gdGhlIDMyLWJpdCwKKwkgKiB1bnNpZ25lZCBhY2NtIHRvIG1hc2sgdGhlIHJlc3VsdC4KKwkgKi8KKworCWJpdG5vIC09IDg7CisJYWNjbSAgfD0gKmlidWYrKyA8PCBiaXRubzsKKwlpZiAodGd0Yml0bm8gPCBiaXRubykKKwkgIHsKKwkgICAgY29udGludWU7CisJICB9CisKKwlpbmNvZGUgPSBhY2NtID4+IHRndGJpdG5vOworCWFjY20gPDw9IG5fYml0czsKKwliaXRubyArPSBuX2JpdHM7CisKKwkvKgorCSAqIFRoZSBkaWN0aW9uYXJ5IG11c3Qgb25seSBiZSBjbGVhcmVkIGF0IHRoZSBlbmQgb2YgYSBwYWNrZXQuCisJICovCisJCisJaWYgKGluY29kZSA9PSBDTEVBUikKKwkgIHsKKwkgICAgaWYgKGlsZW4gPiAwKQorCSAgICAgIHsKKwkJaWYgKGRiLT5kZWJ1ZykKKwkJICB7CisJCSAgICBwcmludGsoImJzZF9kZWNvbXAlZDogYmFkIENMRUFSXG4iLCBkYi0+dW5pdCk7CisJCSAgfQorCQlyZXR1cm4gREVDT01QX0ZBVEFMRVJST1I7CS8qIHByb2JhYmx5IGEgYnVnICovCisJICAgICAgfQorCSAgICAKKwkgICAgYnNkX2NsZWFyKGRiKTsKKwkgICAgYnJlYWs7CisJICB9CisKKwlpZiAoKGluY29kZSA+IG1heF9lbnQgKyAyKSB8fCAoaW5jb2RlID4gZGItPm1heG1heGNvZGUpCisJICAgIHx8IChpbmNvZGUgPiBtYXhfZW50ICYmIG9sZGNvZGUgPT0gQ0xFQVIpKQorCSAgeworCSAgICBpZiAoZGItPmRlYnVnKQorCSAgICAgIHsKKwkJcHJpbnRrKCJic2RfZGVjb21wJWQ6IGJhZCBjb2RlIDB4JXggb2xkY29kZT0weCV4ICIsCisJCSAgICAgICBkYi0+dW5pdCwgaW5jb2RlLCBvbGRjb2RlKTsKKwkJcHJpbnRrKCJtYXhfZW50PTB4JXggZXhwbGVuPSVkIHNlcW5vPSVkXG4iLAorCQkgICAgICAgbWF4X2VudCwgZXhwbGVuLCBkYi0+c2Vxbm8pOworCSAgICAgIH0KKwkgICAgcmV0dXJuIERFQ09NUF9GQVRBTEVSUk9SOwkvKiBwcm9iYWJseSBhIGJ1ZyAqLworCSAgfQorCQorCS8qIFNwZWNpYWwgY2FzZSBmb3IgS3dLd0sgc3RyaW5nLiAqLworCWlmIChpbmNvZGUgPiBtYXhfZW50KQorCSAgeworCSAgICBmaW5jaGFyID0gb2xkY29kZTsKKwkgICAgZXh0cmEgICA9IDE7CisJICB9CisJZWxzZQorCSAgeworCSAgICBmaW5jaGFyID0gaW5jb2RlOworCSAgICBleHRyYSAgID0gMDsKKwkgIH0KKwkKKwljb2RlbGVuID0gKihsZW5zX3B0ciAoZGIsIGZpbmNoYXIpKTsKKwlleHBsZW4gKz0gY29kZWxlbiArIGV4dHJhOworCWlmIChleHBsZW4gPiBvc2l6ZSkKKwkgIHsKKwkgICAgaWYgKGRiLT5kZWJ1ZykKKwkgICAgICB7CisJCXByaW50aygiYnNkX2RlY29tcCVkOiByYW4gb3V0IG9mIG1ydVxuIiwgZGItPnVuaXQpOworI2lmZGVmIERFQlVHCisJCXByaW50aygiICBsZW49JWQsIGZpbmNoYXI9MHgleCwgY29kZWxlbj0lZCwgZXhwbGVuPSVkXG4iLAorCQkgICAgICAgaWxlbiwgZmluY2hhciwgY29kZWxlbiwgZXhwbGVuKTsKKyNlbmRpZgorCSAgICAgIH0KKwkgICAgcmV0dXJuIERFQ09NUF9GQVRBTEVSUk9SOworCSAgfQorCQorCS8qCisJICogRGVjb2RlIHRoaXMgY29kZSBhbmQgaW5zdGFsbCBpdCBpbiB0aGUgZGVjb21wcmVzc2VkIGJ1ZmZlci4KKwkgKi8KKworCXdwdHIgKz0gY29kZWxlbjsKKwlwICAgICA9IHdwdHI7CisJd2hpbGUgKGZpbmNoYXIgPiBMQVNUKQorCSAgeworCSAgICBzdHJ1Y3QgYnNkX2RpY3QgKmRpY3RwMiA9IGRpY3RfcHRyIChkYiwgZmluY2hhcik7CisJICAgIAorCSAgICBkaWN0cCA9IGRpY3RfcHRyIChkYiwgZGljdHAyLT5jcHRyKTsKKyNpZmRlZiBERUJVRworCSAgICBpZiAoLS1jb2RlbGVuIDw9IDAgfHwgZGljdHAtPmNvZGVtMSAhPSBmaW5jaGFyLTEpCisJICAgICAgeworCQlpZiAoY29kZWxlbiA8PSAwKQorCQkgIHsKKwkJICAgIHByaW50aygiYnNkX2RlY29tcCVkOiBmZWxsIG9mZiBlbmQgb2YgY2hhaW4gIiwgZGItPnVuaXQpOworCQkgICAgcHJpbnRrKCIweCV4IGF0IDB4JXggYnkgMHgleCwgbWF4X2VudD0weCV4XG4iLAorCQkJICAgaW5jb2RlLCBmaW5jaGFyLCBkaWN0cDItPmNwdHIsIG1heF9lbnQpOworCQkgIH0KKwkJZWxzZQorCQkgIHsKKwkJICAgIGlmIChkaWN0cC0+Y29kZW0xICE9IGZpbmNoYXItMSkKKwkJICAgICAgeworCQkJcHJpbnRrKCJic2RfZGVjb21wJWQ6IGJhZCBjb2RlIGNoYWluIDB4JXggIgorCQkJICAgICAgICJmaW5jaGFyPTB4JXggIiwKKwkJCSAgICAgICBkYi0+dW5pdCwgaW5jb2RlLCBmaW5jaGFyKTsKKworCQkJcHJpbnRrKCJvbGRjb2RlPTB4JXggY3B0cj0weCV4IGNvZGVtMT0weCV4XG4iLAorCQkJICAgICAgIG9sZGNvZGUsIGRpY3RwMi0+Y3B0ciwgZGljdHAtPmNvZGVtMSk7CisJCSAgICAgIH0KKwkJICB9CisJCXJldHVybiBERUNPTVBfRkFUQUxFUlJPUjsKKwkgICAgICB9CisjZW5kaWYKKwkgICAgKi0tcCAgICA9IGRpY3RwLT5mLmhzLnN1ZmZpeDsKKwkgICAgZmluY2hhciA9IGRpY3RwLT5mLmhzLnByZWZpeDsKKwkgIH0KKwkqLS1wID0gZmluY2hhcjsKKwkKKyNpZmRlZiBERUJVRworCWlmICgtLWNvZGVsZW4gIT0gMCkKKwkgIHsKKwkgICAgcHJpbnRrKCJic2RfZGVjb21wJWQ6IHNob3J0IGJ5ICVkIGFmdGVyIGNvZGUgMHgleCwgbWF4X2VudD0weCV4XG4iLAorCQkgICBkYi0+dW5pdCwgY29kZWxlbiwgaW5jb2RlLCBtYXhfZW50KTsKKwkgIH0KKyNlbmRpZgorCQorCWlmIChleHRyYSkJCS8qIHRoZSBLd0t3SyBjYXNlIGFnYWluICovCisJICB7CisJICAgICp3cHRyKysgPSBmaW5jaGFyOworCSAgfQorCQorCS8qCisJICogSWYgbm90IGZpcnN0IGNvZGUgaW4gYSBwYWNrZXQsIGFuZAorCSAqIGlmIG5vdCBvdXQgb2YgY29kZSBzcGFjZSwgdGhlbiBhbGxvY2F0ZSBhIG5ldyBjb2RlLgorCSAqCisJICogS2VlcCB0aGUgaGFzaCB0YWJsZSBjb3JyZWN0IHNvIGl0IGNhbiBiZSB1c2VkCisJICogd2l0aCB1bmNvbXByZXNzZWQgcGFja2V0cy4KKwkgKi8KKworCWlmIChvbGRjb2RlICE9IENMRUFSICYmIG1heF9lbnQgPCBkYi0+bWF4bWF4Y29kZSkKKwkgIHsKKwkgICAgc3RydWN0IGJzZF9kaWN0ICpkaWN0cDIsICpkaWN0cDM7CisJICAgIHVuc2lnbmVkIHNob3J0ICAqbGVuczEsICAqbGVuczI7CisJICAgIHVuc2lnbmVkIGxvbmcgZmNvZGU7CisJICAgIGludCBodmFsLCBkaXNwLCBpbmR4OworCSAgICAKKwkgICAgZmNvZGUgPSBCU0RfS0VZKG9sZGNvZGUsZmluY2hhcik7CisJICAgIGh2YWwgID0gQlNEX0hBU0gob2xkY29kZSxmaW5jaGFyLGRiLT5oc2hpZnQpOworCSAgICBkaWN0cCA9IGRpY3RfcHRyIChkYiwgaHZhbCk7CisJICAgIAorCSAgICAvKiBsb29rIGZvciBhIGZyZWUgaGFzaCB0YWJsZSBlbnRyeSAqLworCSAgICBpZiAoZGljdHAtPmNvZGVtMSA8IG1heF9lbnQpCisJICAgICAgeworCQlkaXNwID0gKGh2YWwgPT0gMCkgPyAxIDogaHZhbDsKKwkJZG8KKwkJICB7CisJCSAgICBodmFsICs9IGRpc3A7CisJCSAgICBpZiAoaHZhbCA+PSBkYi0+aHNpemUpCisJCSAgICAgIHsKKwkJCWh2YWwgLT0gZGItPmhzaXplOworCQkgICAgICB9CisJCSAgICBkaWN0cCA9IGRpY3RfcHRyIChkYiwgaHZhbCk7CisJCSAgfQorCQl3aGlsZSAoZGljdHAtPmNvZGVtMSA8IG1heF9lbnQpOworCSAgICAgIH0KKwkgICAgCisJICAgIC8qCisJICAgICAqIEludmFsaWRhdGUgcHJldmlvdXMgaGFzaCB0YWJsZSBlbnRyeQorCSAgICAgKiBhc3NpZ25lZCB0aGlzIGNvZGUsIGFuZCB0aGVuIHRha2UgaXQgb3ZlcgorCSAgICAgKi8KKworCSAgICBkaWN0cDIgPSBkaWN0X3B0ciAoZGIsIG1heF9lbnQgKyAxKTsKKwkgICAgaW5keCAgID0gZGljdHAyLT5jcHRyOworCSAgICBkaWN0cDMgPSBkaWN0X3B0ciAoZGIsIGluZHgpOworCisJICAgIGlmIChkaWN0cDMtPmNvZGVtMSA9PSBtYXhfZW50KQorCSAgICAgIHsKKwkJZGljdHAzLT5jb2RlbTEgPSBCQURDT0RFTTE7CisJICAgICAgfQorCisJICAgIGRpY3RwMi0+Y3B0ciAgID0gaHZhbDsKKwkgICAgZGljdHAtPmNvZGVtMSAgPSBtYXhfZW50OworCSAgICBkaWN0cC0+Zi5mY29kZSA9IGZjb2RlOworCSAgICBkYi0+bWF4X2VudCAgICA9ICsrbWF4X2VudDsKKworCSAgICAvKiBVcGRhdGUgdGhlIGxlbmd0aCBvZiB0aGlzIHN0cmluZy4gKi8KKwkgICAgbGVuczEgID0gbGVuc19wdHIgKGRiLCBtYXhfZW50KTsKKwkgICAgbGVuczIgID0gbGVuc19wdHIgKGRiLCBvbGRjb2RlKTsKKwkgICAgKmxlbnMxID0gKmxlbnMyICsgMTsKKwkgICAgCisJICAgIC8qIEV4cGFuZCBjb2RlIHNpemUgaWYgbmVlZGVkLiAqLworCSAgICBpZiAobWF4X2VudCA+PSBNQVhDT0RFKG5fYml0cykgJiYgbWF4X2VudCA8IGRiLT5tYXhtYXhjb2RlKQorCSAgICAgIHsKKwkJZGItPm5fYml0cyA9ICsrbl9iaXRzOworCQl0Z3RiaXRubyAgID0gMzItbl9iaXRzOworCSAgICAgIH0KKwkgIH0KKwlvbGRjb2RlID0gaW5jb2RlOworICAgICAgfQorCisgICAgKytkYi0+Y29tcF9jb3VudDsKKyAgICArK2RiLT51bmNvbXBfY291bnQ7CisgICAgZGItPmNvbXBfYnl0ZXMgICArPSBpc2l6ZSAtIEJTRF9PVkhEIC0gUFBQX0hEUkxFTjsKKyAgICBkYi0+dW5jb21wX2J5dGVzICs9IGV4cGxlbjsKKworICAgIGlmIChic2RfY2hlY2soZGIpKQorICAgICAgeworCWlmIChkYi0+ZGVidWcpCisJICB7CisJICAgIHByaW50aygiYnNkX2RlY29tcCVkOiBwZWVyIHNob3VsZCBoYXZlIGNsZWFyZWQgZGljdGlvbmFyeSBvbiAlZFxuIiwKKwkJICAgZGItPnVuaXQsIGRiLT5zZXFubyAtIDEpOworCSAgfQorICAgICAgfQorICAgIHJldHVybiBleHBsZW47CisgIH0KKyAgICAgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGFibGUgb2YgYWRkcmVzc2VzIGZvciB0aGUgQlNEIGNvbXByZXNzaW9uIG1vZHVsZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgY29tcHJlc3NvciBwcHBfYnNkX2NvbXByZXNzID0geworCS5jb21wcmVzc19wcm90byA9CUNJX0JTRF9DT01QUkVTUywKKwkuY29tcF9hbGxvYyA9CQlic2RfY29tcF9hbGxvYywKKwkuY29tcF9mcmVlID0JCWJzZF9mcmVlLAorCS5jb21wX2luaXQgPQkJYnNkX2NvbXBfaW5pdCwKKwkuY29tcF9yZXNldCA9CQlic2RfcmVzZXQsCisJLmNvbXByZXNzID0JCWJzZF9jb21wcmVzcywKKwkuY29tcF9zdGF0ID0JCWJzZF9jb21wX3N0YXRzLAorCS5kZWNvbXBfYWxsb2MgPQkJYnNkX2RlY29tcF9hbGxvYywKKwkuZGVjb21wX2ZyZWUgPQkJYnNkX2ZyZWUsCisJLmRlY29tcF9pbml0ID0JCWJzZF9kZWNvbXBfaW5pdCwKKwkuZGVjb21wX3Jlc2V0ID0JCWJzZF9yZXNldCwKKwkuZGVjb21wcmVzcyA9CQlic2RfZGVjb21wcmVzcywKKwkuaW5jb21wID0JCWJzZF9pbmNvbXAsCisJLmRlY29tcF9zdGF0ID0JCWJzZF9jb21wX3N0YXRzLAorCS5vd25lciA9CQlUSElTX01PRFVMRQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1vZHVsZSBzdXBwb3J0IHJvdXRpbmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBfX2luaXQgYnNkY29tcF9pbml0KHZvaWQpCit7CisJaW50IGFuc3dlciA9IHBwcF9yZWdpc3Rlcl9jb21wcmVzc29yKCZwcHBfYnNkX2NvbXByZXNzKTsKKwlpZiAoYW5zd2VyID09IDApCisJCXByaW50ayhLRVJOX0lORk8gIlBQUCBCU0QgQ29tcHJlc3Npb24gbW9kdWxlIHJlZ2lzdGVyZWRcbiIpOworCXJldHVybiBhbnN3ZXI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBic2Rjb21wX2NsZWFudXAodm9pZCkKK3sKKwlwcHBfdW5yZWdpc3Rlcl9jb21wcmVzc29yKCZwcHBfYnNkX2NvbXByZXNzKTsKK30KKworbW9kdWxlX2luaXQoYnNkY29tcF9pbml0KTsKK21vZHVsZV9leGl0KGJzZGNvbXBfY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CitNT0RVTEVfQUxJQVMoInBwcC1jb21wcmVzcy0iIF9fc3RyaW5naWZ5KENJX0JTRF9DT01QUkVTUykpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3Jpcy9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2NyaXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRlODkzMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2NyaXMvTWFrZWZpbGUKQEAgLTAsMCArMSBAQAorb2JqLSQoQ09ORklHX0VUUkFYX0FSQ0hfVjEwKSArPSBldGhfdjEwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NyaXMvZXRoX3YxMC5jIGIvZHJpdmVycy9uZXQvY3Jpcy9ldGhfdjEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyNjcwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2NyaXMvZXRoX3YxMC5jCkBAIC0wLDAgKzEsMTgzNiBAQAorLyogJElkOiBldGhlcm5ldC5jLHYgMS4zMSAyMDA0LzEwLzE4IDE0OjQ5OjAzIHN0YXJ2aWsgRXhwICQKKyAqCisgKiBlMTAwbmV0LmM6IEEgbmV0d29yayBkcml2ZXIgZm9yIHRoZSBFVFJBWCAxMDBMWCBuZXR3b3JrIGNvbnRyb2xsZXIuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIgQXhpcyBDb21tdW5pY2F0aW9ucyBBQi4KKyAqCisgKiBUaGUgb3V0bGluZSBvZiB0aGlzIGRyaXZlciBjb21lcyBmcm9tIHNrZWxldG9uLmMuCisgKgorICogJExvZzogZXRoZXJuZXQuYyx2ICQKKyAqIFJldmlzaW9uIDEuMzEgIDIwMDQvMTAvMTggMTQ6NDk6MDMgIHN0YXJ2aWsKKyAqIFVzZSBSWCBpbnRlcnJ1cHQgYXMgcmFuZG9tIHNvdXJjZQorICoKKyAqIFJldmlzaW9uIDEuMzAgIDIwMDQvMDkvMjkgMTA6NDQ6MDQgIHN0YXJ2aWsKKyAqIEVuYWJlZCBNQUMtYWRkcmVzcyBvdXRwdXQgYWdhaW4KKyAqCisgKiBSZXZpc2lvbiAxLjI5ICAyMDA0LzA4LzI0IDA3OjE0OjA1ICBzdGFydmlrCisgKiBNYWtlIHVzZSBvZiBnZW5lcmljIE1ESU8gaW50ZXJmYWNlIGFuZCBjb25zdGFudHMuCisgKgorICogUmV2aXNpb24gMS4yOCAgMjAwNC8wOC8yMCAwOTozNzoxMSAgc3RhcnZpaworICogQWRkZWQgc3VwcG9ydCBmb3IgSW50ZWwgTFhUOTcyQS4gQ3JlZHMgdG8gUmFuZHkgU2NhcmJvcm91Z2guCisgKgorICogUmV2aXNpb24gMS4yNyAgMjAwNC8wOC8xNiAxMjozNzoyMiAgc3RhcnZpaworICogTWVyZ2Ugb2YgTGludXggMi42LjgKKyAqCisgKiBSZXZpc2lvbiAxLjI1ICAyMDA0LzA2LzIxIDEwOjI5OjU3ICBzdGFydmlrCisgKiBNZXJnZSBvZiBMaW51eCAyLjYuNworICoKKyAqIFJldmlzaW9uIDEuMjMgIDIwMDQvMDYvMDkgMDU6Mjk6MjIgIHN0YXJ2aWsKKyAqIEF2b2lkIGFueSByYWNlIHdoZXJlIFJfRE1BX0NIMV9GSVJTVCBpcyBOVUxMIChtYXkgdHJpZ2dlciBjYWNoZSBidWcpLgorICoKKyAqIFJldmlzaW9uIDEuMjIgIDIwMDQvMDUvMTQgMDc6NTg6MDMgIHN0YXJ2aWsKKyAqIE1lcmdlIG9mIGNoYW5nZXMgZnJvbSAyLjQKKyAqCisgKiBSZXZpc2lvbiAxLjIwICAyMDA0LzAzLzExIDExOjM4OjQwICBzdGFydmlrCisgKiBNZXJnZSBvZiBMaW51eCAyLjYuNAorICoKKyAqIFJldmlzaW9uIDEuMTggIDIwMDMvMTIvMDMgMTM6NDU6NDYgIHN0YXJ2aWsKKyAqIFVzZSBoYXJkd2FyZSBwYWQgZm9yIHNob3J0IHBhY2tldHMgdG8gcHJldmVudCBpbmZvcm1hdGlvbiBsZWFrYWdlLgorICoKKyAqIFJldmlzaW9uIDEuMTcgIDIwMDMvMDcvMDQgMDg6Mjc6MzcgIHN0YXJ2aWsKKyAqIE1lcmdlIG9mIExpbnV4IDIuNS43NAorICoKKyAqIFJldmlzaW9uIDEuMTYgIDIwMDMvMDQvMjQgMDg6Mjg6MjIgIHN0YXJ2aWsKKyAqIE5ldyBMRUQgYmVoYXZpb3VyOiBMRUQgb2ZmIHdoZW4gbm8gbGluaworICoKKyAqIFJldmlzaW9uIDEuMTUgIDIwMDMvMDQvMDkgMDU6MjA6NDcgIHN0YXJ2aWsKKyAqIE1lcmdlIG9mIExpbnV4IDIuNS42NworICoKKyAqIFJldmlzaW9uIDEuMTMgIDIwMDMvMDMvMDYgMTY6MTE6MDEgIGhlbnJpa2VuCisgKiBPZmYgYnkgb25lIGVycm9yIGluIGdyb3VwIGFkZHJlc3MgcmVnaXN0ZXIgc2V0dGluZy4KKyAqCisgKiBSZXZpc2lvbiAxLjEyICAyMDAzLzAyLzI3IDE3OjI0OjE5ICBzdGFydmlrCisgKiBDb3JyZWN0ZWQgUmV2IHRvIFJldmlzaW9uCisgKgorICogUmV2aXNpb24gMS4xMSAgMjAwMy8wMS8yNCAwOTo1MzoyMSAgc3RhcnZpaworICogT29wcy4gSW5pdGlhbGl6ZSBHQSB0byAwLCBub3QgdG8gMQorICoKKyAqIFJldmlzaW9uIDEuMTAgIDIwMDMvMDEvMjQgMDk6NTA6NTUgIHN0YXJ2aWsKKyAqIEluaXRpYWxpemUgR0FfMCBhbmQgR0FfMSB0byAwIHRvIGF2b2lkIG1hdGNoaW5nIG9mIHVud2FudGVkIHBhY2tldHMKKyAqCisgKiBSZXZpc2lvbiAxLjkgIDIwMDIvMTIvMTMgMDc6NDA6NTggIHN0YXJ2aWsKKyAqIEFkZGVkIGJhc2ljIGV0aHRvb2wgaW50ZXJmYWNlCisgKiBIYW5kbGVkIG91dCBvZiBtZW1vcnkgd2hlbiBhbGxvY2F0aW5nIG5ldyBidWZmZXJzCisgKgorICogUmV2aXNpb24gMS44ICAyMDAyLzEyLzExIDEzOjEzOjU3ICBzdGFydmlrCisgKiBBZGRlZCBhcmNoLyB0byB2MTAgc3BlY2lmaWMgaW5jbHVkZXMKKyAqIEFkZGVkIGZpeCBmcm9tIExpbnV4IDIuNCBpbiBzZXJpYWwuYyAoZmx1c2hfdG9fZmxpcF9idWZmZXIpCisgKgorICogUmV2aXNpb24gMS43ICAyMDAyLzExLzI2IDA5OjQxOjQyICBzdGFydmlrCisgKiBBZGRlZCBlMTAwX3NldF9jb25maWcgKHN0YW5kYXJkIGludGVyZmFjZSB0byBzZXQgbWVkaWEgdHlwZSkKKyAqIEFkZGVkIHByb3RlY3Rpb24gYWdhaW5zdCBwcmVlbXB0aXZlIHNjaGVkdWxpbmcKKyAqIEFkZGVkIHN0YW5kYXJkIE1JSSBpb2N0bHMKKyAqCisgKiBSZXZpc2lvbiAxLjYgIDIwMDIvMTEvMjEgMDc6MTg6MTggIHN0YXJ2aWsKKyAqIFRpbWVycyBtdXN0IGJlIGluaXRpYWxpemVkIGluIDIuNS40OAorICoKKyAqIFJldmlzaW9uIDEuNSAgMjAwMi8xMS8yMCAxMTo1NjoxMSAgc3RhcnZpaworICogTWVyZ2Ugb2YgTGludXggMi41LjQ4CisgKgorICogUmV2aXNpb24gMS40ICAyMDAyLzExLzE4IDA3OjI2OjQ2ICBzdGFydmlrCisgKiBMaW51eCAyLjUgcG9ydCBvZiBsYXRlc3QgTGludXggMi40IGV0aGVybmV0IGRyaXZlcgorICoKKyAqIFJldmlzaW9uIDEuMzMgIDIwMDIvMTAvMDIgMjA6MTY6MTcgIGhwCisgKiBTRVRGLCBTRVRTOiBVc2UgdW5kZXJzY29yZWQgSU9feF8gbWFjcm9zIHJhdGhlciB0aGFuIGluY29ycmVjdCB0b2tlbiBjb25jYXRlbmF0aW9uCisgKgorICogUmV2aXNpb24gMS4zMiAgMjAwMi8wOS8xNiAwNjowNTo1OCAgc3RhcnZpaworICogQWxpZ24gbWVtb3J5IHJldHVybmVkIGJ5IGRldl9hbGxvY19za2IKKyAqIE1vdmVkIGhhbmRsaW5nIG9mIHNlbnQgcGFja2V0cyB0byBpbnRlcnJ1cHQgdG8gYXZvaWQgcmVmZXJlbmNlIGNvdW50aW5nIHByb2JsZW0KKyAqCisgKiBSZXZpc2lvbiAxLjMxICAyMDAyLzA5LzEwIDEzOjI4OjIzICBsYXJzdgorICogUmV0dXJuIC1FSU5WQUwgZm9yIHVua25vd24gaW9jdGxzIHRvIGF2b2lkIGNvbmZ1c2luZyB0b29scyB0aGF0IHRlc3RzCisgKiBmb3Igc3VwcG9ydGVkIGZ1bmN0aW9uYWxpdHkgYnkgaXNzdWluZyBzcGVjaWFsIGlvY3RscywgaS5lLiB3aXJlbGVzcworICogZXh0ZW5zaW9ucy4KKyAqCisgKiBSZXZpc2lvbiAxLjMwICAyMDAyLzA1LzA3IDE4OjUwOjA4ICBqb2hhbmEKKyAqIENvcnJlY3Qgc3BlbGxpbmcgaW4gY29tbWVudHMuCisgKgorICogUmV2aXNpb24gMS4yOSAgMjAwMi8wNS8wNiAwNTozODo0OSAgc3RhcnZpaworICogUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzOgorICogICAgTGFyZ2UgcGFja2V0cyBhcmUgbm90IGNvcGllZCAoYnJlYWtwb2ludCBzZXQgdG8gMjU2IGJ5dGVzKQorICogICAgVGhlIGNhY2hlIGJ1ZyB3b3JrYXJvdW5kIGlzIGRlbGF5ZWQgdW50aWwgaGFsZiBvZiB0aGUgcmVjZWl2ZSBsaXN0CisgKiAgICAgIGhhcyBiZWVuIHVzZWQKKyAqICAgIEFkZGVkIHRyYW5zbWl0IGxpc3QKKyAqICAgIFRyYW5zbWl0IGludGVycnVwdHMgYXJlIG9ubHkgZW5hYmxlZCB3aGVuIHRyYW5zbWl0IHF1ZXVlIGlzIGZ1bGwKKyAqCisgKiBSZXZpc2lvbiAxLjI4LjIuMSAgMjAwMi8wNC8zMCAwODoxNTo1MSAgc3RhcnZpaworICogUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzOgorICogICBMYXJnZSBwYWNrZXRzIGFyZSBub3QgY29waWVkIChicmVha3BvaW50IHNldCB0byAyNTYgYnl0ZXMpCisgKiAgIFRoZSBjYWNoZSBidWcgd29ya2Fyb3VuZCBpcyBkZWxheWVkIHVudGlsIGhhbGYgb2YgdGhlIHJlY2VpdmUgbGlzdAorICogICAgIGhhcyBiZWVuIHVzZWQuCisgKiAgIEFkZGVkIHRyYW5zbWl0IGxpc3QKKyAqICAgVHJhbnNtaXQgaW50ZXJydXB0cyBhcmUgb25seSBlbmFibGVkIHdoZW4gdHJhbnNtaXQgcXVldWUgaXMgZnVsbAorICoKKyAqIFJldmlzaW9uIDEuMjggIDIwMDIvMDQvMjIgMTE6NDc6MjEgIGpvaGFuYQorICogRml4IGFjY29yZGluZyB0byAyLjQuMTktcHJlNy4gdGltZV9hZnRlci90aW1lX2JlZm9yZSBhbmQKKyAqIG1pc3NpbmcgZW5kIG9mIGNvbW1lbnQuCisgKiBUaGUgcGF0Y2ggaGFzIGEgdHlwbyBmb3IgZXRoZXJuZXQuYyBpbiBlMTAwX2NsZWFyX25ldHdvcmtfbGVkcygpLAorICogIHRoYXQgaXMgZml4ZWQgaGVyZS4KKyAqCisgKiBSZXZpc2lvbiAxLjI3ICAyMDAyLzA0LzEyIDExOjU1OjExICBiam9ybncKKyAqIEFkZGVkIFRPRE8KKyAqCisgKiBSZXZpc2lvbiAxLjI2ICAyMDAyLzAzLzE1IDE3OjExOjAyICBiam9ybncKKyAqIFVzZSBwcmVwYXJlX3J4X2Rlc2NyaXB0b3IgYWZ0ZXIgdGhlIENQVSBoYXMgdG91Y2hlZCB0aGUgcmVjZWl2aW5nIGRlc2NzCisgKgorICogUmV2aXNpb24gMS4yNSAgMjAwMi8wMy8wOCAxMzowNzo1MyAgYmpvcm53CisgKiBVbm5lY2Vzc2FyeSBzcGlubG9jayByZW1vdmVkCisgKgorICogUmV2aXNpb24gMS4yNCAgMjAwMi8wMi8yMCAxMjo1Nzo0MyAgZnJlZHJpa3MKKyAqIFJlcGxhY2VkIE1JTigpIHdpdGggbWluKCkuCisgKgorICogUmV2aXNpb24gMS4yMyAgMjAwMi8wMi8yMCAxMDo1ODoxNCAgZnJlZHJpa3MKKyAqIFN0cmlwIHRoZSBFdGhlcm5ldCBjaGVja3N1bSAoNCBieXRlcykgYmVmb3JlIGZvcndhcmRpbmcgYSBmcmFtZSB0byB1cHBlciBsYXllcnMuCisgKgorICogUmV2aXNpb24gMS4yMiAgMjAwMi8wMS8zMCAwNzo0ODoyMiAgbWF0c2ZnCisgKiBJbml0aWF0ZSBSX05FVFdPUktfVFJfQ1RSTAorICoKKyAqIFJldmlzaW9uIDEuMjEgIDIwMDEvMTEvMjMgMTE6NTQ6NDkgIHN0YXJ2aWsKKyAqIEFkZGVkIElGRl9QUk9NSVNDIGFuZCBJRkZfQUxMTVVMVEkgaGFuZGxpbmcgaW4gc2V0X211bHRpY2FzdF9saXN0CisgKiBSZW1vdmVkIGNvbXBpbGVyIHdhcm5pbmdzCisgKgorICogUmV2aXNpb24gMS4yMCAgMjAwMS8xMS8xMiAxOToyNjowMCAgcGtqCisgKiAqIENvcnJlY3RlZCBlMTAwX25lZ290aWF0ZSgpIHRvIG5vdCBhc3NpZ24gaGFsZiB0byBjdXJyZW50X2R1cGxleCB3aGVuCisgKiAgIGl0IHdhcyBzdXBwb3NlZCB0byBjb21wYXJlIHRoZW0uLi4KKyAqICogQ2xlYW5lZCB1cCBmYWlsdXJlIGhhbmRsaW5nIGluIGUxMDBfb3BlbigpLgorICogKiBGaXhlZCBjb21waWxlciB3YXJuaW5ncy4KKyAqCisgKiBSZXZpc2lvbiAxLjE5ICAyMDAxLzExLzA5IDA3OjQzOjA5ICBzdGFydmlrCisgKiBBZGRlZCBmdWxsIGR1cGxleCBzdXBwb3J0CisgKiBBZGRlZCBpb2N0bCB0byBzZXQgc3BlZWQgYW5kIGR1cGxleAorICogQ2xlYXIgTEVEIHRpbWVyIG9ubHkgcnVucyB3aGVuIExFRCBpcyBsaXQKKyAqCisgKiBSZXZpc2lvbiAxLjE4ICAyMDAxLzEwLzAzIDE0OjQwOjQzICBqb25hc2hnCisgKiBVcGRhdGUgcnhfYnl0ZXMgY291bnRlci4KKyAqCisgKiBSZXZpc2lvbiAxLjE3ICAyMDAxLzA2LzExIDEyOjQzOjQ2ICBvbG9mCisgKiBNb2RpZmllZCBkZWZpbmVzIGZvciBuZXR3b3JrIExFRCBiZWhhdmlvcgorICoKKyAqIFJldmlzaW9uIDEuMTYgIDIwMDEvMDUvMzAgMDY6MTI6NDYgIG1hcmt1c2wKKyAqIFR4RGVzYy5uZXh0IHNob3VsZCBub3QgYmUgc2V0IHRvIE5VTEwKKyAqCisgKiBSZXZpc2lvbiAxLjE1ICAyMDAxLzA1LzI5IDEwOjI3OjA0ICBtYXJrdXNsCisgKiBVcGRhdGVkIGFmdGVyIHJldmlldyByZW1hcmtzOgorICogK1VzZSBJT19FWFRSQUNUCisgKiArSGFuZGxlIHVuZGVycnVuCisgKgorICogUmV2aXNpb24gMS4xNCAgMjAwMS8wNS8yOSAwOToyMDoxNCAgam9uYXNoZworICogVXNlIGRyaXZlciBuYW1lIG9uIHByaW50ayBvdXRwdXQgc28gb25lIGNhbiB0ZWxsIHdoaWNoIGRyaXZlciB0aGF0IGNvbXBsYWlucy4KKyAqCisgKiBSZXZpc2lvbiAxLjEzICAyMDAxLzA1LzA5IDEyOjM1OjU5ICBqb2hhbmEKKyAqIFVzZSBETUFfTkJSIGFuZCBJUlFfTkJSIGRlZmluZXMgZnJvbSBkbWEuaCBhbmQgaXJxLmgKKyAqCisgKiBSZXZpc2lvbiAxLjEyICAyMDAxLzA0LzA1IDExOjQzOjExICB0b2JpYXNhCisgKiBDaGVjayBkZXYgYmVmb3JlIHBhbmljLgorICoKKyAqIFJldmlzaW9uIDEuMTEgIDIwMDEvMDQvMDQgMTE6MjE6MDUgIG1hcmt1c2wKKyAqIFVwZGF0ZWQgYWNjb3JkaW5nIHRvIHJldmlldyByZW1hcmtzCisgKgorICogUmV2aXNpb24gMS4xMCAgMjAwMS8wMy8yNiAxNjowMzowNiAgYmpvcm53CisgKiBOZWVkcyBsaW51eC9jb25maWcuaAorICoKKyAqIFJldmlzaW9uIDEuOSAgMjAwMS8wMy8xOSAxNDo0Nzo0OCAgcGtqCisgKiAqIE1ha2Ugc3VyZSB0aGVyZSBpcyBhbHdheXMgYSBwYXVzZSBhZnRlciB0aGUgbmV0d29yayBMRURzIGFyZQorICogICBjaGFuZ2VkIHNvIHRoZXkgd2lsbCBub3QgbG9vayBjb25zdGFudGx5IGxpdCBkdXJpbmcgaGVhdnkgdHJhZmZpYy4KKyAqICogQWx3YXlzIHVzZSBIWiB3aGVuIHNldHRpbmcgdGltZXMgcmVsYXRpdmUgdG8gamlmZmllcy4KKyAqICogVXNlIExFRF9ORVRXT1JLX1NFVCgpIHdoZW4gc2V0dGluZyB0aGUgbmV0d29yayBMRURzLgorICoKKyAqIFJldmlzaW9uIDEuOCAgMjAwMS8wMi8yNyAxMzo1Mjo0OCAgYmpvcm53CisgKiBtYWxsb2MuaCAtPiBzbGFiLmgKKyAqCisgKiBSZXZpc2lvbiAxLjcgIDIwMDEvMDIvMjMgMTM6NDY6MzggIGJqb3JudworICogU3BlbGxsaW5nIGNoZWNrCisgKgorICogUmV2aXNpb24gMS42ICAyMDAxLzAxLzI2IDE1OjIxOjA0ICBzdGFydmlrCisgKiBEb24ndCBkaXNhYmxlIGludGVycnVwdHMgd2hpbGUgcmVhZGluZyBNRElPIHJlZ2lzdGVycyAoTURJTyBpcyBzbG93KQorICogQ29ycmVjdGVkIHByb21pc2N1b3VzIG1vZGUKKyAqIEltcHJvdmVkIGRlYWxsb2NhdGlvbiBvZiBJUlFzICgiaWZjb25maWcgZXRoMCBkb3duIiBub3cgd29ya3MpCisgKgorICogUmV2aXNpb24gMS41ICAyMDAwLzExLzI5IDE3OjIyOjIyICBiam9ybncKKyAqIEdldCByaWQgb2YgdGhlIHVkd29yZCB0eXBlcyBsZWdhY3kgc3R1ZmYKKyAqCisgKiBSZXZpc2lvbiAxLjQgIDIwMDAvMTEvMjIgMTY6MzY6MDkgIGJqb3JudworICogUGxlYXNlIG1hcmtldGluZyBieSB1c2luZyB0aGUgY29ycmVjdCBjYXNlIHdoZW4gc3BlbGxpbmcgRXRyYXguCisgKgorICogUmV2aXNpb24gMS4zICAyMDAwLzExLzIxIDE2OjQzOjA0ICBiam9ybncKKyAqIE1pbm9yIHNob3J0LT5pbnQgY2hhbmdlCisgKgorICogUmV2aXNpb24gMS4yICAyMDAwLzExLzA4IDE0OjI3OjU3ICBiam9ybncKKyAqIDIuNCBwb3J0CisgKgorICogUmV2aXNpb24gMS4xICAyMDAwLzExLzA2IDEzOjU2OjAwICBiam9ybncKKyAqIFZlcmJhdGltIGNvcHkgb2YgdGhlIDEuMjQgdmVyc2lvbiBvZiBlMTAwbmV0LmMgZnJvbSBlbGludXgKKyAqCisgKiBSZXZpc2lvbiAxLjI0ICAyMDAwLzEwLzA0IDE1OjU1OjIzICBiam9ybncKKyAqICogVXNlIHZpcnRfdG9fcGh5cyBldGMuIGZvciBETUEgYWRkcmVzc2VzCisgKiAqIFJlbW92ZWQgYm9ndXMgQ0hFQ0tTVU1fVU5ORUNFU1NBUlkKKyAqCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL3N2aW50by5oPi8qIERNQSBhbmQgcmVnaXN0ZXIgZGVzY3JpcHRpb25zICovCisjaW5jbHVkZSA8YXNtL2lvLmg+ICAgICAgICAgLyogTEVEXyogSS9PIGZ1bmN0aW9ucyAqLworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vZXRoZXJuZXQuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKworLy8jZGVmaW5lIEVUSERFQlVHCisjZGVmaW5lIEQoeCkKKworLyoKKyAqIFRoZSBuYW1lIG9mIHRoZSBjYXJkLiBJcyB1c2VkIGZvciBtZXNzYWdlcyBhbmQgaW4gdGhlIHJlcXVlc3RzIGZvcgorICogaW8gcmVnaW9ucywgaXJxcyBhbmQgZG1hIGNoYW5uZWxzCisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIqIGNhcmRuYW1lID0gIkVUUkFYIDEwMExYIGJ1aWx0LWluIGV0aGVybmV0IGNvbnRyb2xsZXIiOworCisvKiBBIGRlZmF1bHQgZXRoZXJuZXQgYWRkcmVzcy4gSGlnaGxldmVsIFNXIHdpbGwgc2V0IHRoZSByZWFsIG9uZSBsYXRlciAqLworCitzdGF0aWMgc3RydWN0IHNvY2thZGRyIGRlZmF1bHRfbWFjID0geworCTAsCisJeyAweDAwLCAweDQwLCAweDhDLCAweENELCAweDAwLCAweDAwIH0KK307CisKKy8qIEluZm9ybWF0aW9uIHRoYXQgbmVlZCB0byBiZSBrZXB0IGZvciBlYWNoIGJvYXJkLiAqLworc3RydWN0IG5ldF9sb2NhbCB7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IG1paV9pZl9pbmZvIG1paV9pZjsKKworCS8qIFR4IGNvbnRyb2wgbG9jay4gIFRoaXMgcHJvdGVjdHMgdGhlIHRyYW5zbWl0IGJ1ZmZlciByaW5nCisJICogc3RhdGUgYWxvbmcgd2l0aCB0aGUgInR4IGZ1bGwiIHN0YXRlIG9mIHRoZSBkcml2ZXIuICBUaGlzCisJICogbWVhbnMgYWxsIG5ldGlmX3F1ZXVlIGZsb3cgY29udHJvbCBhY3Rpb25zIGFyZSBwcm90ZWN0ZWQKKwkgKiBieSB0aGlzIGxvY2sgYXMgd2VsbC4KKwkgKi8KKwlzcGlubG9ja190IGxvY2s7Cit9OworCit0eXBlZGVmIHN0cnVjdCBldHJheF9ldGhfZGVzY3IKK3sKKwlldHJheF9kbWFfZGVzY3IgZGVzY3I7CisJc3RydWN0IHNrX2J1ZmYqIHNrYjsKK30gZXRyYXhfZXRoX2Rlc2NyOworCisvKiBTb21lIHRyYW5zY2VpdmVycyByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nICovCitzdHJ1Y3QgdHJhbnNjZWl2ZXJfb3BzCit7CisJdW5zaWduZWQgaW50IG91aTsKKwl2b2lkICgqY2hlY2tfc3BlZWQpKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworCXZvaWQgKCpjaGVja19kdXBsZXgpKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworfTsKKworc3RydWN0IHRyYW5zY2VpdmVyX29wcyogdHJhbnNjZWl2ZXI7CisKKy8qIER1cGxleCBzZXR0aW5ncyAqLworZW51bSBkdXBsZXgKK3sKKwloYWxmLAorCWZ1bGwsCisJYXV0b25lZworfTsKKworLyogRG1hIGRlc2NyaXB0b3JzIGV0Yy4gKi8KKworI2RlZmluZSBNQVhfTUVESUFfREFUQV9TSVpFIDE1MTgKKworI2RlZmluZSBNSU5fUEFDS0VUX0xFTiAgICAgIDQ2CisjZGVmaW5lIEVUSEVSX0hFQURfTEVOICAgICAgMTQKKworLyoKKyoqIE1ESU8gY29uc3RhbnRzLgorKi8KKyNkZWZpbmUgTURJT19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIE1ESU9fUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBNRElPX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgTURJT19QUkVBTUJMRSAgICAgICAgICAgICAgMHhmZmZmZmZmZnVsCisKKy8qIEJyb2FkY29tIHNwZWNpZmljICovCisjZGVmaW5lIE1ESU9fQVVYX0NUUkxfU1RBVFVTX1JFRyAgICAgICAgICAgMHgxOAorI2RlZmluZSBNRElPX0JDX0ZVTExfRFVQTEVYX0lORCAgICAgICAgICAgICAweDEKKyNkZWZpbmUgTURJT19CQ19TUEVFRCAgICAgICAgICAgICAgICAgICAgICAgMHgyCisKKy8qIFRESyBzcGVjaWZpYyAqLworI2RlZmluZSBNRElPX1RES19ESUFHTk9TVElDX1JFRyAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgTURJT19UREtfRElBR05PU1RJQ19SQVRFICAgICAgICAgIDB4NDAwCisjZGVmaW5lIE1ESU9fVERLX0RJQUdOT1NUSUNfRFBMWCAgICAgICAgICAweDgwMAorCisvKkludGVsIExYVDk3MkEgc3BlY2lmaWMqLworI2RlZmluZSBNRElPX0lOVF9TVEFUVVNfUkVHXzIJCQkweDAwMTEKKyNkZWZpbmUgTURJT19JTlRfRlVMTF9EVVBMRVhfSU5ECQkoIDEgPDwgOSApCisjZGVmaW5lIE1ESU9fSU5UX1NQRUVECQkJCSggMSA8PCAxNCApCisKKy8qIE5ldHdvcmsgZmxhc2ggY29uc3RhbnRzICovCisjZGVmaW5lIE5FVF9GTEFTSF9USU1FICAgICAgICAgICAgICAgICAgKEhaLzUwKSAvKiAyMCBtcyAqLworI2RlZmluZSBORVRfRkxBU0hfUEFVU0UgICAgICAgICAgICAgICAgKEhaLzEwMCkgLyogMTAgbXMgKi8KKyNkZWZpbmUgTkVUX0xJTktfVVBfQ0hFQ0tfSU5URVJWQUwgICAgICAgKDIqSFopIC8qIDIgcyAgICovCisjZGVmaW5lIE5FVF9EVVBMRVhfQ0hFQ0tfSU5URVJWQUwgICAgICAgICgyKkhaKSAvKiAyIHMgICAqLworCisjZGVmaW5lIE5PX05FVFdPUktfQUNUSVZJVFkgMAorI2RlZmluZSBORVRXT1JLX0FDVElWSVRZICAgIDEKKworI2RlZmluZSBOQlJfT0ZfUlhfREVTQyAgICAgNjQKKyNkZWZpbmUgTkJSX09GX1RYX0RFU0MgICAgIDI1NgorCisvKiBMYXJnZSBwYWNrZXRzIGFyZSBzZW50IGRpcmVjdGx5IHRvIHVwcGVyIGxheWVycyB3aGlsZSBzbWFsbCBwYWNrZXRzIGFyZSAqLworLyogY29waWVkICh0byByZWR1Y2UgbWVtb3J5IHdhc3RlKS4gVGhlIGZvbGxvd2luZyBjb25zdGFudCBkZWNpZGVzIHRoZSBicmVha3BvaW50ICovCisjZGVmaW5lIFJYX0NPUFlCUkVBSyAyNTYKKworLyogRHVlIHRvIGEgY2hpcCBidWcgd2UgbmVlZCB0byBmbHVzaCB0aGUgY2FjaGUgd2hlbiBkZXNjcmlwdG9ycyBhcmUgcmV0dXJuZWQgKi8KKy8qIHRvIHRoZSBETUEuIFRvIGRlY3JlYXNlIHBlcmZvcm1hbmNlIGltcGFjdCB3ZSByZXR1cm4gZGVzY3JpcHRvcnMgaW4gY2h1bmtzLiAqLworLyogVGhlIGZvbGxvd2luZyBjb25zdGFudCBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgZGVzY3JpcHRvcnMgdG8gcmV0dXJuLiAqLworI2RlZmluZSBSWF9RVUVVRV9USFJFU0hPTEQgIE5CUl9PRl9SWF9ERVNDLzIKKworI2RlZmluZSBHRVRfQklUKGJpdCx2YWwpICAgKCgodmFsKSA+PiAoYml0KSkgJiAweDAxKQorCisvKiBEZWZpbmUgc29tZSBtYWNyb3MgdG8gYWNjZXNzIEVUUkFYIDEwMCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU0VURih2YXIsIHJlZywgZmllbGQsIHZhbCkgdmFyID0gKHZhciAmIH5JT19NQVNLXyhyZWcjI18sIGZpZWxkIyNfKSkgfCBcCisJCQkJCSAgSU9fRklFTERfKHJlZyMjXywgZmllbGQjI18sIHZhbCkKKyNkZWZpbmUgU0VUUyh2YXIsIHJlZywgZmllbGQsIHZhbCkgdmFyID0gKHZhciAmIH5JT19NQVNLXyhyZWcjI18sIGZpZWxkIyNfKSkgfCBcCisJCQkJCSAgSU9fU1RBVEVfKHJlZyMjXywgZmllbGQjI18sIF8jI3ZhbCkKKworc3RhdGljIGV0cmF4X2V0aF9kZXNjciAqbXlOZXh0UnhEZXNjOyAgLyogUG9pbnRzIHRvIHRoZSBuZXh0IGRlc2NyaXB0b3IgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHByb2Nlc3NlZCAqLworc3RhdGljIGV0cmF4X2V0aF9kZXNjciAqbXlMYXN0UnhEZXNjOyAgLyogVGhlIGxhc3QgcHJvY2Vzc2VkIGRlc2NyaXB0b3IgKi8KK3N0YXRpYyBldHJheF9ldGhfZGVzY3IgKm15UHJldlJ4RGVzYzsgIC8qIFRoZSBkZXNjcmlwdG9yIHJpZ2h0IGJlZm9yZSBteU5leHRSeERlc2MgKi8KKworc3RhdGljIGV0cmF4X2V0aF9kZXNjciBSeERlc2NMaXN0W05CUl9PRl9SWF9ERVNDXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgzMikpKTsKKworc3RhdGljIGV0cmF4X2V0aF9kZXNjciogbXlGaXJzdFR4RGVzYzsgLyogRmlyc3QgcGFja2V0IG5vdCB5ZXQgc2VudCAqLworc3RhdGljIGV0cmF4X2V0aF9kZXNjciogbXlMYXN0VHhEZXNjOyAgLyogRW5kIG9mIHNlbmQgcXVldWUgKi8KK3N0YXRpYyBldHJheF9ldGhfZGVzY3IqIG15TmV4dFR4RGVzYzsgIC8qIE5leHQgZGVzY3JpcHRvciB0byB1c2UgKi8KK3N0YXRpYyBldHJheF9ldGhfZGVzY3IgVHhEZXNjTGlzdFtOQlJfT0ZfVFhfREVTQ10gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMzIpKSk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmV0d29ya19yZWNfY29uZmlnX3NoYWRvdyA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IG1kaW9fcGh5X2FkZHI7IC8qIFRyYW5zY2lldmVyIGFkZHJlc3MgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBuZXR3b3JrX3RyX2N0cmxfc2hhZG93ID0gMDsKKworLyogTmV0d29yayBzcGVlZCBpbmRpY2F0aW9uLiAqLworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHNwZWVkX3RpbWVyID0gVElNRVJfSU5JVElBTElaRVIoTlVMTCwgMCwgMCk7CitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgY2xlYXJfbGVkX3RpbWVyID0gVElNRVJfSU5JVElBTElaRVIoTlVMTCwgMCwgMCk7CitzdGF0aWMgaW50IGN1cnJlbnRfc3BlZWQ7IC8qIFNwZWVkIHJlYWQgZnJvbSB0cmFuc2NlaXZlciAqLworc3RhdGljIGludCBjdXJyZW50X3NwZWVkX3NlbGVjdGlvbjsgLyogU3BlZWQgc2VsZWN0ZWQgYnkgdXNlciAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbGVkX25leHRfdGltZTsKK3N0YXRpYyBpbnQgbGVkX2FjdGl2ZTsKK3N0YXRpYyBpbnQgcnhfcXVldWVfbGVuOworCisvKiBEdXBsZXggKi8KK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBkdXBsZXhfdGltZXIgPSBUSU1FUl9JTklUSUFMSVpFUihOVUxMLCAwLCAwKTsKK3N0YXRpYyBpbnQgZnVsbF9kdXBsZXg7CitzdGF0aWMgZW51bSBkdXBsZXggY3VycmVudF9kdXBsZXg7CisKKy8qIEluZGV4IHRvIGZ1bmN0aW9ucywgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4gKi8KKworc3RhdGljIGludCBldHJheF9ldGhlcm5ldF9pbml0KHZvaWQpOworCitzdGF0aWMgaW50IGUxMDBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZTEwMF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcik7CitzdGF0aWMgaW50IGUxMDBfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgZTEwMHJ4dHhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGlycXJldHVybl90IGUxMDBud19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBlMTAwX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBlMTAwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBlMTAwX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgZTEwMF9ldGh0b29sX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHN0cnVjdCBpZnJlcSAqaWZyKTsKK3N0YXRpYyBpbnQgZTEwMF9zZXRfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHN0cnVjdCBpZm1hcCogbWFwKTsKK3N0YXRpYyB2b2lkIGUxMDBfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZTEwMF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlMTAwX2hhcmR3YXJlX3NlbmRfcGFja2V0KGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCB1cGRhdGVfcnhfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKik7CitzdGF0aWMgdm9pZCB1cGRhdGVfdHhfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKik7CitzdGF0aWMgaW50IGUxMDBfcHJvYmVfdHJhbnNjZWl2ZXIoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CisKK3N0YXRpYyB2b2lkIGUxMDBfY2hlY2tfc3BlZWQodW5zaWduZWQgbG9uZyBwcml2KTsKK3N0YXRpYyB2b2lkIGUxMDBfc2V0X3NwZWVkKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHVuc2lnbmVkIGxvbmcgc3BlZWQpOworc3RhdGljIHZvaWQgZTEwMF9jaGVja19kdXBsZXgodW5zaWduZWQgbG9uZyBwcml2KTsKK3N0YXRpYyB2b2lkIGUxMDBfc2V0X2R1cGxleChzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBlbnVtIGR1cGxleCk7CitzdGF0aWMgdm9pZCBlMTAwX25lZ290aWF0ZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKKworc3RhdGljIGludCBlMTAwX2dldF9tZGlvX3JlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOworc3RhdGljIHZvaWQgZTEwMF9zZXRfbWRpb19yZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpOworCitzdGF0aWMgdm9pZCBlMTAwX3NlbmRfbWRpb19jbWQodW5zaWduZWQgc2hvcnQgY21kLCBpbnQgd3JpdGVfY21kKTsKK3N0YXRpYyB2b2lkIGUxMDBfc2VuZF9tZGlvX2JpdCh1bnNpZ25lZCBjaGFyIGJpdCk7CitzdGF0aWMgdW5zaWduZWQgY2hhciBlMTAwX3JlY2VpdmVfbWRpb19iaXQodm9pZCk7CitzdGF0aWMgdm9pZCBlMTAwX3Jlc2V0X3RyYW5zY2VpdmVyKHN0cnVjdCBuZXRfZGV2aWNlKiBuZXQpOworCitzdGF0aWMgdm9pZCBlMTAwX2NsZWFyX25ldHdvcmtfbGVkcyh1bnNpZ25lZCBsb25nIGR1bW15KTsKK3N0YXRpYyB2b2lkIGUxMDBfc2V0X25ldHdvcmtfbGVkcyhpbnQgYWN0aXZlKTsKKworc3RhdGljIHZvaWQgYnJvYWRjb21fY2hlY2tfc3BlZWQoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitzdGF0aWMgdm9pZCBicm9hZGNvbV9jaGVja19kdXBsZXgoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitzdGF0aWMgdm9pZCB0ZGtfY2hlY2tfc3BlZWQoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitzdGF0aWMgdm9pZCB0ZGtfY2hlY2tfZHVwbGV4KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworc3RhdGljIHZvaWQgaW50ZWxfY2hlY2tfc3BlZWQoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitzdGF0aWMgdm9pZCBpbnRlbF9jaGVja19kdXBsZXgoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitzdGF0aWMgdm9pZCBnZW5lcmljX2NoZWNrX3NwZWVkKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworc3RhdGljIHZvaWQgZ2VuZXJpY19jaGVja19kdXBsZXgoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CisKK3N0cnVjdCB0cmFuc2NlaXZlcl9vcHMgdHJhbnNjZWl2ZXJzW10gPQoreworCXsweDEwMTgsIGJyb2FkY29tX2NoZWNrX3NwZWVkLCBicm9hZGNvbV9jaGVja19kdXBsZXh9LCAgLyogQnJvYWRjb20gKi8KKwl7MHhDMDM5LCB0ZGtfY2hlY2tfc3BlZWQsIHRka19jaGVja19kdXBsZXh9LCAgICAgICAgICAgIC8qIFRESyAyMTIwICovCisJezB4MDM5QywgdGRrX2NoZWNrX3NwZWVkLCB0ZGtfY2hlY2tfZHVwbGV4fSwgICAgICAgICAgICAvKiBUREsgMjEyMEMgKi8KKyAgICAgICAgezB4MDRkZSwgaW50ZWxfY2hlY2tfc3BlZWQsIGludGVsX2NoZWNrX2R1cGxleH0sICAgICAJLyogSW50ZWwgTFhUOTcyQSovCisJezB4MDAwMCwgZ2VuZXJpY19jaGVja19zcGVlZCwgZ2VuZXJpY19jaGVja19kdXBsZXh9ICAgICAvKiBHZW5lcmljLCBtdXN0IGJlIGxhc3QgKi8KK307CisKKyNkZWZpbmUgdHhfZG9uZShkZXYpICgqUl9ETUFfQ0gwX0NNRCA9PSAwKQorCisvKgorICogQ2hlY2sgZm9yIGEgbmV0d29yayBhZGFwdG9yIG9mIHRoaXMgdHlwZSwgYW5kIHJldHVybiAnMCcgaWYgb25lIGV4aXN0cy4KKyAqIElmIGRldi0+YmFzZV9hZGRyID09IDAsIHByb2JlIGFsbCBsaWtlbHkgbG9jYXRpb25zLgorICogSWYgZGV2LT5iYXNlX2FkZHIgPT0gMSwgYWx3YXlzIHJldHVybiBmYWlsdXJlLgorICogSWYgZGV2LT5iYXNlX2FkZHIgPT0gMiwgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBkZXZpY2UgYW5kIHJldHVybiBzdWNjZXNzCisgKiAoZGV0YWNoYWJsZSBkZXZpY2VzIG9ubHkpLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0CitldHJheF9ldGhlcm5ldF9pbml0KHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCogbnA7CisJaW50IGksIGVycjsKKworCXByaW50ayhLRVJOX0lORk8KKwkgICAgICAgIkVUUkFYIDEwMExYIDEwLzEwME1CaXQgZXRoZXJuZXQgdjIuMCAoYykgMjAwMC0yMDAzIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUJcbiIpOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwlucCA9IGRldi0+cHJpdjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGludClSX05FVFdPUktfU0FfMDsgLyoganVzdCB0byBoYXZlIHNvbWV0aGluZyB0byBzaG93ICovCisKKwkvKiBub3cgc2V0dXAgb3VyIGV0cmF4IHNwZWNpZmljIHN0dWZmICovCisKKwlkZXYtPmlycSA9IE5FVFdPUktfRE1BX1JYX0lSUV9OQlI7IC8qIHdlIHJlYWxseSB1c2UgRE1BVFggYXMgd2VsbC4uLiAqLworCWRldi0+ZG1hID0gTkVUV09SS19SWF9ETUFfTkJSOworCisJLyogZmlsbCBpbiBvdXIgaGFuZGxlcnMgc28gdGhlIG5ldHdvcmsgbGF5ZXIgY2FuIHRhbGsgdG8gdXMgaW4gdGhlIGZ1dHVyZSAqLworCisJZGV2LT5vcGVuICAgICAgICAgICAgICAgPSBlMTAwX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgICAgPSBlMTAwX3NlbmRfcGFja2V0OworCWRldi0+c3RvcCAgICAgICAgICAgICAgID0gZTEwMF9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyAgICAgICAgICA9IGUxMDBfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+c2V0X21hY19hZGRyZXNzICAgID0gZTEwMF9zZXRfbWFjX2FkZHJlc3M7CisJZGV2LT5kb19pb2N0bCAgICAgICAgICAgPSBlMTAwX2lvY3RsOworCWRldi0+c2V0X2NvbmZpZwkJPSBlMTAwX3NldF9jb25maWc7CisJZGV2LT50eF90aW1lb3V0ICAgICAgICAgPSBlMTAwX3R4X3RpbWVvdXQ7CisKKwkvKiBJbml0aWFsaXNlIHRoZSBsaXN0IG9mIEV0cmF4IERNQS1kZXNjcmlwdG9ycyAqLworCisJLyogSW5pdGlhbGlzZSByZWNlaXZlIGRlc2NyaXB0b3JzICovCisKKwlmb3IgKGkgPSAwOyBpIDwgTkJSX09GX1JYX0RFU0M7IGkrKykgeworCQkvKiBBbGxvY2F0ZSB0d28gZXh0cmEgY2FjaGVsaW5lcyB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgdXNlZCBieSBETUEKKwkJICogZG9lcyBub3Qgc2hhcmUgY2FjaGVsaW5lIHdpdGggYW55IG90aGVyIGRhdGEgKHRvIGF2b2lkIGNhY2hlIGJ1ZykKKwkJICovCisJCVJ4RGVzY0xpc3RbaV0uc2tiID0gZGV2X2FsbG9jX3NrYihNQVhfTUVESUFfREFUQV9TSVpFICsgMiAqIEwxX0NBQ0hFX0JZVEVTKTsKKwkJUnhEZXNjTGlzdFtpXS5kZXNjci5jdHJsICAgPSAwOworCQlSeERlc2NMaXN0W2ldLmRlc2NyLnN3X2xlbiA9IE1BWF9NRURJQV9EQVRBX1NJWkU7CisJCVJ4RGVzY0xpc3RbaV0uZGVzY3IubmV4dCAgID0gdmlydF90b19waHlzKCZSeERlc2NMaXN0W2kgKyAxXSk7CisJCVJ4RGVzY0xpc3RbaV0uZGVzY3IuYnVmICAgID0gTDFfQ0FDSEVfQUxJR04odmlydF90b19waHlzKFJ4RGVzY0xpc3RbaV0uc2tiLT5kYXRhKSk7CisJCVJ4RGVzY0xpc3RbaV0uZGVzY3Iuc3RhdHVzID0gMDsKKwkJUnhEZXNjTGlzdFtpXS5kZXNjci5od19sZW4gPSAwOworCQlwcmVwYXJlX3J4X2Rlc2NyaXB0b3IoJlJ4RGVzY0xpc3RbaV0uZGVzY3IpOworCX0KKworCVJ4RGVzY0xpc3RbTkJSX09GX1JYX0RFU0MgLSAxXS5kZXNjci5jdHJsICAgPSBkX2VvbDsKKwlSeERlc2NMaXN0W05CUl9PRl9SWF9ERVNDIC0gMV0uZGVzY3IubmV4dCAgID0gdmlydF90b19waHlzKCZSeERlc2NMaXN0WzBdKTsKKwlyeF9xdWV1ZV9sZW4gPSAwOworCisJLyogSW5pdGlhbGl6ZSB0cmFuc21pdCBkZXNjcmlwdG9ycyAqLworCWZvciAoaSA9IDA7IGkgPCBOQlJfT0ZfVFhfREVTQzsgaSsrKSB7CisJCVR4RGVzY0xpc3RbaV0uZGVzY3IuY3RybCAgID0gMDsKKwkJVHhEZXNjTGlzdFtpXS5kZXNjci5zd19sZW4gPSAwOworCQlUeERlc2NMaXN0W2ldLmRlc2NyLm5leHQgICA9IHZpcnRfdG9fcGh5cygmVHhEZXNjTGlzdFtpICsgMV0uZGVzY3IpOworCQlUeERlc2NMaXN0W2ldLmRlc2NyLmJ1ZiAgICA9IDA7CisJCVR4RGVzY0xpc3RbaV0uZGVzY3Iuc3RhdHVzID0gMDsKKwkJVHhEZXNjTGlzdFtpXS5kZXNjci5od19sZW4gPSAwOworCQlUeERlc2NMaXN0W2ldLnNrYiA9IDA7CisJfQorCisJVHhEZXNjTGlzdFtOQlJfT0ZfVFhfREVTQyAtIDFdLmRlc2NyLmN0cmwgICA9IGRfZW9sOworCVR4RGVzY0xpc3RbTkJSX09GX1RYX0RFU0MgLSAxXS5kZXNjci5uZXh0ICAgPSB2aXJ0X3RvX3BoeXMoJlR4RGVzY0xpc3RbMF0uZGVzY3IpOworCisJLyogSW5pdGlhbGlzZSBpbml0aWFsIHBvaW50ZXJzICovCisKKwlteU5leHRSeERlc2MgID0gJlJ4RGVzY0xpc3RbMF07CisJbXlMYXN0UnhEZXNjICA9ICZSeERlc2NMaXN0W05CUl9PRl9SWF9ERVNDIC0gMV07CisJbXlQcmV2UnhEZXNjICA9ICZSeERlc2NMaXN0W05CUl9PRl9SWF9ERVNDIC0gMV07CisJbXlGaXJzdFR4RGVzYyA9ICZUeERlc2NMaXN0WzBdOworCW15TmV4dFR4RGVzYyAgPSAmVHhEZXNjTGlzdFswXTsKKwlteUxhc3RUeERlc2MgID0gJlR4RGVzY0xpc3RbTkJSX09GX1RYX0RFU0MgLSAxXTsKKworCS8qIFJlZ2lzdGVyIGRldmljZSAqLworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBzZXQgdGhlIGRlZmF1bHQgTUFDIGFkZHJlc3MgKi8KKworCWUxMDBfc2V0X21hY19hZGRyZXNzKGRldiwgJmRlZmF1bHRfbWFjKTsKKworCS8qIEluaXRpYWxpemUgc3BlZWQgaW5kaWNhdG9yIHN0dWZmLiAqLworCisJY3VycmVudF9zcGVlZCA9IDEwOworCWN1cnJlbnRfc3BlZWRfc2VsZWN0aW9uID0gMDsgLyogQXV0byAqLworCXNwZWVkX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgTkVUX0xJTktfVVBfQ0hFQ0tfSU5URVJWQUw7CisgICAgICAgIGR1cGxleF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCXNwZWVkX3RpbWVyLmZ1bmN0aW9uID0gZTEwMF9jaGVja19zcGVlZDsKKworCWNsZWFyX2xlZF90aW1lci5mdW5jdGlvbiA9IGUxMDBfY2xlYXJfbmV0d29ya19sZWRzOworCisJZnVsbF9kdXBsZXggPSAwOworCWN1cnJlbnRfZHVwbGV4ID0gYXV0b25lZzsKKwlkdXBsZXhfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBORVRfRFVQTEVYX0NIRUNLX0lOVEVSVkFMOworICAgICAgICBkdXBsZXhfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlkdXBsZXhfdGltZXIuZnVuY3Rpb24gPSBlMTAwX2NoZWNrX2R1cGxleDsKKworICAgICAgICAvKiBJbml0aWFsaXplIG1paSBpbnRlcmZhY2UgKi8KKwlucC0+bWlpX2lmLnBoeV9pZCA9IG1kaW9fcGh5X2FkZHI7CisJbnAtPm1paV9pZi5waHlfaWRfbWFzayA9IDB4MWY7CisJbnAtPm1paV9pZi5yZWdfbnVtX21hc2sgPSAweDFmOworCW5wLT5taWlfaWYuZGV2ID0gZGV2OworCW5wLT5taWlfaWYubWRpb19yZWFkID0gZTEwMF9nZXRfbWRpb19yZWc7CisJbnAtPm1paV9pZi5tZGlvX3dyaXRlID0gZTEwMF9zZXRfbWRpb19yZWc7CisKKwkvKiBJbml0aWFsaXplIGdyb3VwIGFkZHJlc3MgcmVnaXN0ZXJzIHRvIG1ha2Ugc3VyZSB0aGF0IG5vICovCisJLyogdW53YW50ZWQgYWRkcmVzc2VzIGFyZSBtYXRjaGVkICovCisJKlJfTkVUV09SS19HQV8wID0gMHgwMDAwMDAwMDsKKwkqUl9ORVRXT1JLX0dBXzEgPSAweDAwMDAwMDAwOworCXJldHVybiAwOworfQorCisvKiBzZXQgTUFDIGFkZHJlc3Mgb2YgdGhlIGludGVyZmFjZS4gY2FsbGVkIGZyb20gdGhlIGNvcmUgYWZ0ZXIgYQorICogU0lPQ1NJRkFERFIgaW9jdGwsIGFuZCBmcm9tIHRoZSBib290dXAgYWJvdmUuCisgKi8KKworc3RhdGljIGludAorZTEwMF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpucCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopZGV2LT5wcml2OworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisJaW50IGk7CisKKwlzcGluX2xvY2soJm5wLT5sb2NrKTsgLyogcHJlZW1wdGlvbiBwcm90ZWN0aW9uICovCisKKwkvKiByZW1lbWJlciBpdCAqLworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCisJLyogV3JpdGUgaXQgdG8gdGhlIGhhcmR3YXJlLgorCSAqIE5vdGUgdGhlIHdheSB0aGUgYWRkcmVzcyBpcyB3cmFwcGVkOgorCSAqICpSX05FVFdPUktfU0FfMCA9IGEwXzAgfCAoYTBfMSA8PCA4KSB8IChhMF8yIDw8IDE2KSB8IChhMF8zIDw8IDI0KTsKKwkgKiAqUl9ORVRXT1JLX1NBXzEgPSBhMF80IHwgKGEwXzUgPDwgOCk7CisJICovCisKKwkqUl9ORVRXT1JLX1NBXzAgPSBkZXYtPmRldl9hZGRyWzBdIHwgKGRldi0+ZGV2X2FkZHJbMV0gPDwgOCkgfAorCQkoZGV2LT5kZXZfYWRkclsyXSA8PCAxNikgfCAoZGV2LT5kZXZfYWRkclszXSA8PCAyNCk7CisJKlJfTkVUV09SS19TQV8xID0gZGV2LT5kZXZfYWRkcls0XSB8IChkZXYtPmRldl9hZGRyWzVdIDw8IDgpOworCSpSX05FVFdPUktfU0FfMiA9IDA7CisKKwkvKiBzaG93IGl0IGluIHRoZSBsb2cgYXMgd2VsbCAqLworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNoYW5nZWQgTUFDIHRvICIsIGRldi0+bmFtZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlwcmludGsoIiUwMlg6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisKKwlwcmludGsoIiUwMlhcbiIsIGRldi0+ZGV2X2FkZHJbaV0pOworCisJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKgorICogT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4gVGhpcyBpcyBjYWxsZWQgKGluIHRoZSBjdXJyZW50IGtlcm5lbCkKKyAqIHNvbWV0aW1lIGFmdGVyIGJvb3Rpbmcgd2hlbiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KKyAqCisgKiBUaGlzIHJvdXRpbmUgc2hvdWxkIHNldCBldmVyeXRoaW5nIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuCisgKiByZWdpc3RlcnMgdGhhdCAic2hvdWxkIiBvbmx5IG5lZWQgdG8gYmUgc2V0IG9uY2UgYXQgYm9vdCwgc28gdGhhdAorICogdGhlcmUgaXMgbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAqLworCitzdGF0aWMgaW50CitlMTAwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogZW5hYmxlIHRoZSBNRElPIG91dHB1dCBwaW4gKi8KKworCSpSX05FVFdPUktfTUdNX0NUUkwgPSBJT19TVEFURShSX05FVFdPUktfTUdNX0NUUkwsIG1kb2UsIGVuYWJsZSk7CisKKwkqUl9JUlFfTUFTSzBfQ0xSID0KKwkJSU9fU1RBVEUoUl9JUlFfTUFTSzBfQ0xSLCBvdmVycnVuLCBjbHIpIHwKKwkJSU9fU1RBVEUoUl9JUlFfTUFTSzBfQ0xSLCB1bmRlcnJ1biwgY2xyKSB8CisJCUlPX1NUQVRFKFJfSVJRX01BU0swX0NMUiwgZXhjZXNzaXZlX2NvbCwgY2xyKTsKKworCS8qIGNsZWFyIGRtYTAgYW5kIDEgZW9wIGFuZCBkZXNjciBpcnEgbWFza3MgKi8KKwkqUl9JUlFfTUFTSzJfQ0xSID0KKwkJSU9fU1RBVEUoUl9JUlFfTUFTSzJfQ0xSLCBkbWEwX2Rlc2NyLCBjbHIpIHwKKwkJSU9fU1RBVEUoUl9JUlFfTUFTSzJfQ0xSLCBkbWEwX2VvcCwgY2xyKSB8CisJCUlPX1NUQVRFKFJfSVJRX01BU0syX0NMUiwgZG1hMV9kZXNjciwgY2xyKSB8CisJCUlPX1NUQVRFKFJfSVJRX01BU0syX0NMUiwgZG1hMV9lb3AsIGNscik7CisKKwkvKiBSZXNldCBhbmQgd2FpdCBmb3IgdGhlIERNQSBjaGFubmVscyAqLworCisJUkVTRVRfRE1BKE5FVFdPUktfVFhfRE1BX05CUik7CisJUkVTRVRfRE1BKE5FVFdPUktfUlhfRE1BX05CUik7CisJV0FJVF9ETUEoTkVUV09SS19UWF9ETUFfTkJSKTsKKwlXQUlUX0RNQShORVRXT1JLX1JYX0RNQV9OQlIpOworCisJLyogSW5pdGlhbGlzZSB0aGUgZXRyYXggbmV0d29yayBjb250cm9sbGVyICovCisKKwkvKiBhbGxvY2F0ZSB0aGUgaXJxIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlY2VpdmluZyBETUEgKi8KKworCWlmIChyZXF1ZXN0X2lycShORVRXT1JLX0RNQV9SWF9JUlFfTkJSLCBlMTAwcnh0eF9pbnRlcnJ1cHQsCisJCQlTQV9TQU1QTEVfUkFORE9NLCBjYXJkbmFtZSwgKHZvaWQgKilkZXYpKSB7CisJCWdvdG8gZ3JhY2VfZXhpdDA7CisJfQorCisJLyogYWxsb2NhdGUgdGhlIGlycSBjb3JyZXNwb25kaW5nIHRvIHRoZSB0cmFuc21pdHRpbmcgRE1BICovCisKKwlpZiAocmVxdWVzdF9pcnEoTkVUV09SS19ETUFfVFhfSVJRX05CUiwgZTEwMHJ4dHhfaW50ZXJydXB0LCAwLAorCQkJY2FyZG5hbWUsICh2b2lkICopZGV2KSkgeworCQlnb3RvIGdyYWNlX2V4aXQxOworCX0KKworCS8qIGFsbG9jYXRlIHRoZSBpcnEgY29ycmVzcG9uZGluZyB0byB0aGUgbmV0d29yayBlcnJvcnMgZXRjICovCisKKwlpZiAocmVxdWVzdF9pcnEoTkVUV09SS19TVEFUVVNfSVJRX05CUiwgZTEwMG53X2ludGVycnVwdCwgMCwKKwkJCWNhcmRuYW1lLCAodm9pZCAqKWRldikpIHsKKwkJZ290byBncmFjZV9leGl0MjsKKwl9CisKKwkvKiBnaXZlIHRoZSBIVyBhbiBpZGVhIG9mIHdoYXQgTUFDIGFkZHJlc3Mgd2Ugd2FudCAqLworCisJKlJfTkVUV09SS19TQV8wID0gZGV2LT5kZXZfYWRkclswXSB8IChkZXYtPmRldl9hZGRyWzFdIDw8IDgpIHwKKwkJKGRldi0+ZGV2X2FkZHJbMl0gPDwgMTYpIHwgKGRldi0+ZGV2X2FkZHJbM10gPDwgMjQpOworCSpSX05FVFdPUktfU0FfMSA9IGRldi0+ZGV2X2FkZHJbNF0gfCAoZGV2LT5kZXZfYWRkcls1XSA8PCA4KTsKKwkqUl9ORVRXT1JLX1NBXzIgPSAwOworCisjaWYgMAorCS8qIHVzZSBwcm9taXNjdW91cyBtb2RlIGZvciB0ZXN0aW5nICovCisJKlJfTkVUV09SS19HQV8wID0gMHhmZmZmZmZmZjsKKwkqUl9ORVRXT1JLX0dBXzEgPSAweGZmZmZmZmZmOworCisJKlJfTkVUV09SS19SRUNfQ09ORklHID0gMHhkOyAvKiBicm9hZGNhc3QgcmVjLCBpbmRpdmlkLiByZWMsIG1hMCBlbmFibGVkICovCisjZWxzZQorCVNFVFMobmV0d29ya19yZWNfY29uZmlnX3NoYWRvdywgUl9ORVRXT1JLX1JFQ19DT05GSUcsIGJyb2FkY2FzdCwgcmVjZWl2ZSk7CisJU0VUUyhuZXR3b3JrX3JlY19jb25maWdfc2hhZG93LCBSX05FVFdPUktfUkVDX0NPTkZJRywgbWEwLCBlbmFibGUpOworCVNFVEYobmV0d29ya19yZWNfY29uZmlnX3NoYWRvdywgUl9ORVRXT1JLX1JFQ19DT05GSUcsIGR1cGxleCwgZnVsbF9kdXBsZXgpOworCSpSX05FVFdPUktfUkVDX0NPTkZJRyA9IG5ldHdvcmtfcmVjX2NvbmZpZ19zaGFkb3c7CisjZW5kaWYKKworCSpSX05FVFdPUktfR0VOX0NPTkZJRyA9CisJCUlPX1NUQVRFKFJfTkVUV09SS19HRU5fQ09ORklHLCBwaHksICAgIG1paV9jbGspIHwKKwkJSU9fU1RBVEUoUl9ORVRXT1JLX0dFTl9DT05GSUcsIGVuYWJsZSwgb24pOworCisJU0VUUyhuZXR3b3JrX3RyX2N0cmxfc2hhZG93LCBSX05FVFdPUktfVFJfQ1RSTCwgY2xyX2Vycm9yLCBjbHIpOworCVNFVFMobmV0d29ya190cl9jdHJsX3NoYWRvdywgUl9ORVRXT1JLX1RSX0NUUkwsIGRlbGF5LCBub25lKTsKKwlTRVRTKG5ldHdvcmtfdHJfY3RybF9zaGFkb3csIFJfTkVUV09SS19UUl9DVFJMLCBjYW5jZWwsIGRvbnQpOworCVNFVFMobmV0d29ya190cl9jdHJsX3NoYWRvdywgUl9ORVRXT1JLX1RSX0NUUkwsIGNkLCBlbmFibGUpOworCVNFVFMobmV0d29ya190cl9jdHJsX3NoYWRvdywgUl9ORVRXT1JLX1RSX0NUUkwsIHJldHJ5LCBlbmFibGUpOworCVNFVFMobmV0d29ya190cl9jdHJsX3NoYWRvdywgUl9ORVRXT1JLX1RSX0NUUkwsIHBhZCwgZW5hYmxlKTsKKwlTRVRTKG5ldHdvcmtfdHJfY3RybF9zaGFkb3csIFJfTkVUV09SS19UUl9DVFJMLCBjcmMsIGVuYWJsZSk7CisJKlJfTkVUV09SS19UUl9DVFJMID0gbmV0d29ya190cl9jdHJsX3NoYWRvdzsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCisJLyogZW5hYmxlIHRoZSBpcnEncyBmb3IgZXRoZXJuZXQgRE1BICovCisKKwkqUl9JUlFfTUFTSzJfU0VUID0KKwkJSU9fU1RBVEUoUl9JUlFfTUFTSzJfU0VULCBkbWEwX2VvcCwgc2V0KSB8CisJCUlPX1NUQVRFKFJfSVJRX01BU0syX1NFVCwgZG1hMV9lb3AsIHNldCk7CisKKwkqUl9JUlFfTUFTSzBfU0VUID0KKwkJSU9fU1RBVEUoUl9JUlFfTUFTSzBfU0VULCBvdmVycnVuLCAgICAgICBzZXQpIHwKKwkJSU9fU1RBVEUoUl9JUlFfTUFTSzBfU0VULCB1bmRlcnJ1biwgICAgICBzZXQpIHwKKwkJSU9fU1RBVEUoUl9JUlFfTUFTSzBfU0VULCBleGNlc3NpdmVfY29sLCBzZXQpOworCisJLyogbWFrZSBzdXJlIHRoZSBpcnFzIGFyZSBjbGVhcmVkICovCisKKwkqUl9ETUFfQ0gwX0NMUl9JTlRSID0gSU9fU1RBVEUoUl9ETUFfQ0gwX0NMUl9JTlRSLCBjbHJfZW9wLCBkbyk7CisJKlJfRE1BX0NIMV9DTFJfSU5UUiA9IElPX1NUQVRFKFJfRE1BX0NIMV9DTFJfSU5UUiwgY2xyX2VvcCwgZG8pOworCisJLyogbWFrZSBzdXJlIHRoZSByZWMgYW5kIHRyYW5zbWl0IGVycm9yIGNvdW50ZXJzIGFyZSBjbGVhcmVkICovCisKKwkodm9pZCkqUl9SRUNfQ09VTlRFUlM7ICAvKiBkdW1teSByZWFkICovCisJKHZvaWQpKlJfVFJfQ09VTlRFUlM7ICAgLyogZHVtbXkgcmVhZCAqLworCisJLyogc3RhcnQgdGhlIHJlY2VpdmluZyBETUEgY2hhbm5lbCBzbyB3ZSBjYW4gcmVjZWl2ZSBwYWNrZXRzIGZyb20gbm93IG9uICovCisKKwkqUl9ETUFfQ0gxX0ZJUlNUID0gdmlydF90b19waHlzKG15TmV4dFJ4RGVzYyk7CisJKlJfRE1BX0NIMV9DTUQgPSBJT19TVEFURShSX0RNQV9DSDFfQ01ELCBjbWQsIHN0YXJ0KTsKKworCS8qIFNldCB1cCB0cmFuc21pdCBETUEgY2hhbm5lbCBzbyBpdCBjYW4gYmUgcmVzdGFydGVkIGxhdGVyICovCisKKwkqUl9ETUFfQ0gwX0ZJUlNUID0gMDsKKwkqUl9ETUFfQ0gwX0RFU0NSID0gdmlydF90b19waHlzKG15TGFzdFR4RGVzYyk7CisKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCS8qIFByb2JlIGZvciB0cmFuc2NlaXZlciAqLworCWlmIChlMTAwX3Byb2JlX3RyYW5zY2VpdmVyKGRldikpCisJCWdvdG8gZ3JhY2VfZXhpdDM7CisKKwkvKiBTdGFydCBkdXBsZXgvc3BlZWQgdGltZXJzICovCisJYWRkX3RpbWVyKCZzcGVlZF90aW1lcik7CisJYWRkX3RpbWVyKCZkdXBsZXhfdGltZXIpOworCisJLyogV2UgYXJlIG5vdyByZWFkeSB0byBhY2NlcHQgdHJhbnNtaXQgcmVxdWV1c3RzIGZyb20KKwkgKiB0aGUgcXVldWVpbmcgbGF5ZXIgb2YgdGhlIG5ldHdvcmtpbmcuCisJICovCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworCitncmFjZV9leGl0MzoKKwlmcmVlX2lycShORVRXT1JLX1NUQVRVU19JUlFfTkJSLCAodm9pZCAqKWRldik7CitncmFjZV9leGl0MjoKKwlmcmVlX2lycShORVRXT1JLX0RNQV9UWF9JUlFfTkJSLCAodm9pZCAqKWRldik7CitncmFjZV9leGl0MToKKwlmcmVlX2lycShORVRXT1JLX0RNQV9SWF9JUlFfTkJSLCAodm9pZCAqKWRldik7CitncmFjZV9leGl0MDoKKwlyZXR1cm4gLUVBR0FJTjsKK30KKworCitzdGF0aWMgdm9pZAorZ2VuZXJpY19jaGVja19zcGVlZChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlkYXRhID0gZTEwMF9nZXRfbWRpb19yZWcoZGV2LCBtZGlvX3BoeV9hZGRyLCBNSUlfQURWRVJUSVNFKTsKKwlpZiAoKGRhdGEgJiBBRFZFUlRJU0VfMTAwRlVMTCkgfHwKKwkgICAgKGRhdGEgJiBBRFZFUlRJU0VfMTAwSEFMRikpCisJCWN1cnJlbnRfc3BlZWQgPSAxMDA7CisJZWxzZQorCQljdXJyZW50X3NwZWVkID0gMTA7Cit9CisKK3N0YXRpYyB2b2lkCit0ZGtfY2hlY2tfc3BlZWQoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJZGF0YSA9IGUxMDBfZ2V0X21kaW9fcmVnKGRldiwgbWRpb19waHlfYWRkciwgTURJT19UREtfRElBR05PU1RJQ19SRUcpOworCWN1cnJlbnRfc3BlZWQgPSAoZGF0YSAmIE1ESU9fVERLX0RJQUdOT1NUSUNfUkFURSA/IDEwMCA6IDEwKTsKK30KKworc3RhdGljIHZvaWQKK2Jyb2FkY29tX2NoZWNrX3NwZWVkKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWRhdGEgPSBlMTAwX2dldF9tZGlvX3JlZyhkZXYsIG1kaW9fcGh5X2FkZHIsIE1ESU9fQVVYX0NUUkxfU1RBVFVTX1JFRyk7CisJY3VycmVudF9zcGVlZCA9IChkYXRhICYgTURJT19CQ19TUEVFRCA/IDEwMCA6IDEwKTsKK30KKworc3RhdGljIHZvaWQKK2ludGVsX2NoZWNrX3NwZWVkKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWRhdGEgPSBlMTAwX2dldF9tZGlvX3JlZyhkZXYsIG1kaW9fcGh5X2FkZHIsIE1ESU9fSU5UX1NUQVRVU19SRUdfMik7CisJY3VycmVudF9zcGVlZCA9IChkYXRhICYgTURJT19JTlRfU1BFRUQgPyAxMDAgOiAxMCk7Cit9CisKK3N0YXRpYyB2b2lkCitlMTAwX2NoZWNrX3NwZWVkKHVuc2lnbmVkIGxvbmcgcHJpdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlKilwcml2OworCXN0YXRpYyBpbnQgbGVkX2luaXRpYXRlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWludCBvbGRfc3BlZWQgPSBjdXJyZW50X3NwZWVkOworCisJZGF0YSA9IGUxMDBfZ2V0X21kaW9fcmVnKGRldiwgbWRpb19waHlfYWRkciwgTUlJX0JNU1IpOworCWlmICghKGRhdGEgJiBCTVNSX0xTVEFUVVMpKSB7CisJCWN1cnJlbnRfc3BlZWQgPSAwOworCX0gZWxzZSB7CisJCXRyYW5zY2VpdmVyLT5jaGVja19zcGVlZChkZXYpOworCX0KKworCWlmICgob2xkX3NwZWVkICE9IGN1cnJlbnRfc3BlZWQpIHx8ICFsZWRfaW5pdGlhdGVkKSB7CisJCWxlZF9pbml0aWF0ZWQgPSAxOworCQllMTAwX3NldF9uZXR3b3JrX2xlZHMoTk9fTkVUV09SS19BQ1RJVklUWSk7CisJfQorCisJLyogUmVpbml0aWFsaXplIHRoZSB0aW1lci4gKi8KKwlzcGVlZF90aW1lci5leHBpcmVzID0gamlmZmllcyArIE5FVF9MSU5LX1VQX0NIRUNLX0lOVEVSVkFMOworCWFkZF90aW1lcigmc3BlZWRfdGltZXIpOworfQorCitzdGF0aWMgdm9pZAorZTEwMF9uZWdvdGlhdGUoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl1bnNpZ25lZCBzaG9ydCBkYXRhID0gZTEwMF9nZXRfbWRpb19yZWcoZGV2LCBtZGlvX3BoeV9hZGRyLCBNSUlfQURWRVJUSVNFKTsKKworCS8qIERpc2NhcmQgb2xkIHNwZWVkIGFuZCBkdXBsZXggc2V0dGluZ3MgKi8KKwlkYXRhICY9IH4oQURWRVJUSVNFXzEwMEhBTEYgfCBBRFZFUlRJU0VfMTAwRlVMTCB8CisJICAgICAgICAgIEFEVkVSVElTRV8xMEhBTEYgfCBBRFZFUlRJU0VfMTBGVUxMKTsKKworCXN3aXRjaCAoY3VycmVudF9zcGVlZF9zZWxlY3Rpb24pIHsKKwkJY2FzZSAxMCA6CisJCQlpZiAoY3VycmVudF9kdXBsZXggPT0gZnVsbCkKKwkJCQlkYXRhIHw9IEFEVkVSVElTRV8xMEZVTEw7CisJCQllbHNlIGlmIChjdXJyZW50X2R1cGxleCA9PSBoYWxmKQorCQkJCWRhdGEgfD0gQURWRVJUSVNFXzEwSEFMRjsKKwkJCWVsc2UKKwkJCQlkYXRhIHw9IEFEVkVSVElTRV8xMEhBTEYgfCBBRFZFUlRJU0VfMTBGVUxMOworCQkJYnJlYWs7CisKKwkJY2FzZSAxMDAgOgorCQkJIGlmIChjdXJyZW50X2R1cGxleCA9PSBmdWxsKQorCQkJCWRhdGEgfD0gQURWRVJUSVNFXzEwMEZVTEw7CisJCQllbHNlIGlmIChjdXJyZW50X2R1cGxleCA9PSBoYWxmKQorCQkJCWRhdGEgfD0gQURWRVJUSVNFXzEwMEhBTEY7CisJCQllbHNlCisJCQkJZGF0YSB8PSBBRFZFUlRJU0VfMTAwSEFMRiB8IEFEVkVSVElTRV8xMDBGVUxMOworCQkJYnJlYWs7CisKKwkJY2FzZSAwIDogLyogQXV0byAqLworCQkJIGlmIChjdXJyZW50X2R1cGxleCA9PSBmdWxsKQorCQkJCWRhdGEgfD0gQURWRVJUSVNFXzEwMEZVTEwgfCBBRFZFUlRJU0VfMTBGVUxMOworCQkJZWxzZSBpZiAoY3VycmVudF9kdXBsZXggPT0gaGFsZikKKwkJCQlkYXRhIHw9IEFEVkVSVElTRV8xMDBIQUxGIHwgQURWRVJUSVNFXzEwSEFMRjsKKwkJCWVsc2UKKwkJCQlkYXRhIHw9IEFEVkVSVElTRV8xMEhBTEYgfCBBRFZFUlRJU0VfMTBGVUxMIHwKKwkJCQkgIEFEVkVSVElTRV8xMDBIQUxGIHwgQURWRVJUSVNFXzEwMEZVTEw7CisJCQlicmVhazsKKworCQlkZWZhdWx0IDogLyogYXNzdW1lIGF1dG9uZWcgc3BlZWQgYW5kIGR1cGxleCAqLworCQkJZGF0YSB8PSBBRFZFUlRJU0VfMTBIQUxGIHwgQURWRVJUSVNFXzEwRlVMTCB8CisJCQkJICBBRFZFUlRJU0VfMTAwSEFMRiB8IEFEVkVSVElTRV8xMDBGVUxMOworCX0KKworCWUxMDBfc2V0X21kaW9fcmVnKGRldiwgbWRpb19waHlfYWRkciwgTUlJX0FEVkVSVElTRSwgZGF0YSk7CisKKwkvKiBSZW5lZ290aWF0ZSB3aXRoIGxpbmsgcGFydG5lciAqLworCWRhdGEgPSBlMTAwX2dldF9tZGlvX3JlZyhkZXYsIG1kaW9fcGh5X2FkZHIsIE1JSV9CTUNSKTsKKwlkYXRhIHw9IEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVDsKKworCWUxMDBfc2V0X21kaW9fcmVnKGRldiwgbWRpb19waHlfYWRkciwgTUlJX0JNQ1IsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZAorZTEwMF9zZXRfc3BlZWQoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdW5zaWduZWQgbG9uZyBzcGVlZCkKK3sKKwlpZiAoc3BlZWQgIT0gY3VycmVudF9zcGVlZF9zZWxlY3Rpb24pIHsKKwkJY3VycmVudF9zcGVlZF9zZWxlY3Rpb24gPSBzcGVlZDsKKwkJZTEwMF9uZWdvdGlhdGUoZGV2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitlMTAwX2NoZWNrX2R1cGxleCh1bnNpZ25lZCBsb25nIHByaXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXByaXY7CisJc3RydWN0IG5ldF9sb2NhbCAqbnAgPSAoc3RydWN0IG5ldF9sb2NhbCAqKWRldi0+cHJpdjsKKwlpbnQgb2xkX2R1cGxleCA9IGZ1bGxfZHVwbGV4OworCXRyYW5zY2VpdmVyLT5jaGVja19kdXBsZXgoZGV2KTsKKwlpZiAob2xkX2R1cGxleCAhPSBmdWxsX2R1cGxleCkgeworCQkvKiBEdXBsZXggY2hhbmdlZCAqLworCQlTRVRGKG5ldHdvcmtfcmVjX2NvbmZpZ19zaGFkb3csIFJfTkVUV09SS19SRUNfQ09ORklHLCBkdXBsZXgsIGZ1bGxfZHVwbGV4KTsKKwkJKlJfTkVUV09SS19SRUNfQ09ORklHID0gbmV0d29ya19yZWNfY29uZmlnX3NoYWRvdzsKKwl9CisKKwkvKiBSZWluaXRpYWxpemUgdGhlIHRpbWVyLiAqLworCWR1cGxleF90aW1lci5leHBpcmVzID0gamlmZmllcyArIE5FVF9EVVBMRVhfQ0hFQ0tfSU5URVJWQUw7CisJYWRkX3RpbWVyKCZkdXBsZXhfdGltZXIpOworCW5wLT5taWlfaWYuZnVsbF9kdXBsZXggPSBmdWxsX2R1cGxleDsKK30KKworc3RhdGljIHZvaWQKK2dlbmVyaWNfY2hlY2tfZHVwbGV4KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWRhdGEgPSBlMTAwX2dldF9tZGlvX3JlZyhkZXYsIG1kaW9fcGh5X2FkZHIsIE1JSV9BRFZFUlRJU0UpOworCWlmICgoZGF0YSAmIEFEVkVSVElTRV8xMEZVTEwpIHx8CisJICAgIChkYXRhICYgQURWRVJUSVNFXzEwMEZVTEwpKQorCQlmdWxsX2R1cGxleCA9IDE7CisJZWxzZQorCQlmdWxsX2R1cGxleCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCit0ZGtfY2hlY2tfZHVwbGV4KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWRhdGEgPSBlMTAwX2dldF9tZGlvX3JlZyhkZXYsIG1kaW9fcGh5X2FkZHIsIE1ESU9fVERLX0RJQUdOT1NUSUNfUkVHKTsKKwlmdWxsX2R1cGxleCA9IChkYXRhICYgTURJT19UREtfRElBR05PU1RJQ19EUExYKSA/IDEgOiAwOworfQorCitzdGF0aWMgdm9pZAorYnJvYWRjb21fY2hlY2tfZHVwbGV4KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWRhdGEgPSBlMTAwX2dldF9tZGlvX3JlZyhkZXYsIG1kaW9fcGh5X2FkZHIsIE1ESU9fQVVYX0NUUkxfU1RBVFVTX1JFRyk7CisJZnVsbF9kdXBsZXggPSAoZGF0YSAmIE1ESU9fQkNfRlVMTF9EVVBMRVhfSU5EKSA/IDEgOiAwOworfQorCitzdGF0aWMgdm9pZAoraW50ZWxfY2hlY2tfZHVwbGV4KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCWRhdGEgPSBlMTAwX2dldF9tZGlvX3JlZyhkZXYsIG1kaW9fcGh5X2FkZHIsIE1ESU9fSU5UX1NUQVRVU19SRUdfMik7CisJZnVsbF9kdXBsZXggPSAoZGF0YSAmIE1ESU9fSU5UX0ZVTExfRFVQTEVYX0lORCkgPyAxIDogMDsKK30KKworc3RhdGljIHZvaWQKK2UxMDBfc2V0X2R1cGxleChzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBlbnVtIGR1cGxleCBuZXdfZHVwbGV4KQoreworCWlmIChuZXdfZHVwbGV4ICE9IGN1cnJlbnRfZHVwbGV4KSB7CisJCWN1cnJlbnRfZHVwbGV4ID0gbmV3X2R1cGxleDsKKwkJZTEwMF9uZWdvdGlhdGUoZGV2KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2UxMDBfcHJvYmVfdHJhbnNjZWl2ZXIoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl1bnNpZ25lZCBpbnQgcGh5aWRfaGlnaDsKKwl1bnNpZ25lZCBpbnQgcGh5aWRfbG93OworCXVuc2lnbmVkIGludCBvdWk7CisJc3RydWN0IHRyYW5zY2VpdmVyX29wcyogb3BzID0gTlVMTDsKKworCS8qIFByb2JlIE1ESU8gcGh5c2ljYWwgYWRkcmVzcyAqLworCWZvciAobWRpb19waHlfYWRkciA9IDA7IG1kaW9fcGh5X2FkZHIgPD0gMzE7IG1kaW9fcGh5X2FkZHIrKykgeworCQlpZiAoZTEwMF9nZXRfbWRpb19yZWcoZGV2LCBtZGlvX3BoeV9hZGRyLCBNSUlfQk1TUikgIT0gMHhmZmZmKQorCQkJYnJlYWs7CisJfQorCWlmIChtZGlvX3BoeV9hZGRyID09IDMyKQorCQkgcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBHZXQgbWFudWZhY3R1cmVyICovCisJcGh5aWRfaGlnaCA9IGUxMDBfZ2V0X21kaW9fcmVnKGRldiwgbWRpb19waHlfYWRkciwgTUlJX1BIWVNJRDEpOworCXBoeWlkX2xvdyA9IGUxMDBfZ2V0X21kaW9fcmVnKGRldiwgbWRpb19waHlfYWRkciwgTUlJX1BIWVNJRDIpOworCW91aSA9IChwaHlpZF9oaWdoIDw8IDYpIHwgKHBoeWlkX2xvdyA+PiAxMCk7CisKKwlmb3IgKG9wcyA9ICZ0cmFuc2NlaXZlcnNbMF07IG9wcy0+b3VpOyBvcHMrKykgeworCQlpZiAob3BzLT5vdWkgPT0gb3VpKQorCQkJYnJlYWs7CisJfQorCXRyYW5zY2VpdmVyID0gb3BzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2UxMDBfZ2V0X21kaW9fcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKK3sKKwl1bnNpZ25lZCBzaG9ydCBjbWQ7ICAgIC8qIERhdGEgdG8gYmUgc2VudCBvbiBNRElPIHBvcnQgKi8KKwlpbnQgZGF0YTsgICAvKiBEYXRhIHJlYWQgZnJvbSBNRElPICovCisJaW50IGJpdENvdW50ZXI7CisKKwkvKiBTdGFydCBvZiBmcmFtZSwgT1AgQ29kZSwgUGh5c2ljYWwgQWRkcmVzcywgUmVnaXN0ZXIgQWRkcmVzcyAqLworCWNtZCA9IChNRElPX1NUQVJUIDw8IDE0KSB8IChNRElPX1JFQUQgPDwgMTIpIHwgKHBoeV9pZCA8PCA3KSB8CisJCShsb2NhdGlvbiA8PCAyKTsKKworCWUxMDBfc2VuZF9tZGlvX2NtZChjbWQsIDApOworCisJZGF0YSA9IDA7CisKKwkvKiBEYXRhLi4uICovCisJZm9yIChiaXRDb3VudGVyPTE1OyBiaXRDb3VudGVyPj0wIDsgYml0Q291bnRlci0tKSB7CisJCWRhdGEgfD0gKGUxMDBfcmVjZWl2ZV9tZGlvX2JpdCgpIDw8IGJpdENvdW50ZXIpOworCX0KKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdm9pZAorZTEwMF9zZXRfbWRpb19yZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpCit7CisJaW50IGJpdENvdW50ZXI7CisJdW5zaWduZWQgc2hvcnQgY21kOworCisJY21kID0gKE1ESU9fU1RBUlQgPDwgMTQpIHwgKE1ESU9fV1JJVEUgPDwgMTIpIHwgKHBoeV9pZCA8PCA3KSB8CisJICAgICAgKGxvY2F0aW9uIDw8IDIpOworCisJZTEwMF9zZW5kX21kaW9fY21kKGNtZCwgMSk7CisKKwkvKiBEYXRhLi4uICovCisJZm9yIChiaXRDb3VudGVyPTE1OyBiaXRDb3VudGVyPj0wIDsgYml0Q291bnRlci0tKSB7CisJCWUxMDBfc2VuZF9tZGlvX2JpdChHRVRfQklUKGJpdENvdW50ZXIsIHZhbHVlKSk7CisJfQorCit9CisKK3N0YXRpYyB2b2lkCitlMTAwX3NlbmRfbWRpb19jbWQodW5zaWduZWQgc2hvcnQgY21kLCBpbnQgd3JpdGVfY21kKQoreworCWludCBiaXRDb3VudGVyOworCXVuc2lnbmVkIGNoYXIgZGF0YSA9IDB4MjsKKworCS8qIFByZWFtYmxlICovCisJZm9yIChiaXRDb3VudGVyID0gMzE7IGJpdENvdW50ZXI+PSAwOyBiaXRDb3VudGVyLS0pCisJCWUxMDBfc2VuZF9tZGlvX2JpdChHRVRfQklUKGJpdENvdW50ZXIsIE1ESU9fUFJFQU1CTEUpKTsKKworCWZvciAoYml0Q291bnRlciA9IDE1OyBiaXRDb3VudGVyID49IDI7IGJpdENvdW50ZXItLSkKKwkJZTEwMF9zZW5kX21kaW9fYml0KEdFVF9CSVQoYml0Q291bnRlciwgY21kKSk7CisKKwkvKiBUdXJuYXJvdW5kICovCisJZm9yIChiaXRDb3VudGVyID0gMTsgYml0Q291bnRlciA+PSAwIDsgYml0Q291bnRlci0tKQorCQlpZiAod3JpdGVfY21kKQorCQkJZTEwMF9zZW5kX21kaW9fYml0KEdFVF9CSVQoYml0Q291bnRlciwgZGF0YSkpOworCQllbHNlCisJCQllMTAwX3JlY2VpdmVfbWRpb19iaXQoKTsKK30KKworc3RhdGljIHZvaWQKK2UxMDBfc2VuZF9tZGlvX2JpdCh1bnNpZ25lZCBjaGFyIGJpdCkKK3sKKwkqUl9ORVRXT1JLX01HTV9DVFJMID0KKwkJSU9fU1RBVEUoUl9ORVRXT1JLX01HTV9DVFJMLCBtZG9lLCBlbmFibGUpIHwKKwkJSU9fRklFTEQoUl9ORVRXT1JLX01HTV9DVFJMLCBtZGlvLCBiaXQpOworCXVkZWxheSgxKTsKKwkqUl9ORVRXT1JLX01HTV9DVFJMID0KKwkJSU9fU1RBVEUoUl9ORVRXT1JLX01HTV9DVFJMLCBtZG9lLCBlbmFibGUpIHwKKwkJSU9fTUFTSyhSX05FVFdPUktfTUdNX0NUUkwsIG1kY2spIHwKKwkJSU9fRklFTEQoUl9ORVRXT1JLX01HTV9DVFJMLCBtZGlvLCBiaXQpOworCXVkZWxheSgxKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIKK2UxMDBfcmVjZWl2ZV9tZGlvX2JpdCgpCit7CisJdW5zaWduZWQgY2hhciBiaXQ7CisJKlJfTkVUV09SS19NR01fQ1RSTCA9IDA7CisJYml0ID0gSU9fRVhUUkFDVChSX05FVFdPUktfU1RBVCwgbWRpbywgKlJfTkVUV09SS19TVEFUKTsKKwl1ZGVsYXkoMSk7CisJKlJfTkVUV09SS19NR01fQ1RSTCA9IElPX01BU0soUl9ORVRXT1JLX01HTV9DVFJMLCBtZGNrKTsKKwl1ZGVsYXkoMSk7CisJcmV0dXJuIGJpdDsKK30KKworc3RhdGljIHZvaWQKK2UxMDBfcmVzZXRfdHJhbnNjZWl2ZXIoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl1bnNpZ25lZCBzaG9ydCBjbWQ7CisJdW5zaWduZWQgc2hvcnQgZGF0YTsKKwlpbnQgYml0Q291bnRlcjsKKworCWRhdGEgPSBlMTAwX2dldF9tZGlvX3JlZyhkZXYsIG1kaW9fcGh5X2FkZHIsIE1JSV9CTUNSKTsKKworCWNtZCA9IChNRElPX1NUQVJUIDw8IDE0KSB8IChNRElPX1dSSVRFIDw8IDEyKSB8IChtZGlvX3BoeV9hZGRyIDw8IDcpIHwgKE1JSV9CTUNSIDw8IDIpOworCisJZTEwMF9zZW5kX21kaW9fY21kKGNtZCwgMSk7CisKKwlkYXRhIHw9IDB4ODAwMDsKKworCWZvciAoYml0Q291bnRlciA9IDE1OyBiaXRDb3VudGVyID49IDAgOyBiaXRDb3VudGVyLS0pIHsKKwkJZTEwMF9zZW5kX21kaW9fYml0KEdFVF9CSVQoYml0Q291bnRlciwgZGF0YSkpOworCX0KK30KKworLyogQ2FsbGVkIGJ5IHVwcGVyIGxheWVycyBpZiB0aGV5IGRlY2lkZSBpdCB0b29rIHRvbyBsb25nIHRvIGNvbXBsZXRlCisgKiBzZW5kaW5nIGEgcGFja2V0IC0gd2UgbmVlZCB0byByZXNldCBhbmQgc3R1ZmYuCisgKi8KKworc3RhdGljIHZvaWQKK2UxMDBfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKm5wID0gKHN0cnVjdCBuZXRfbG9jYWwgKilkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZucC0+bG9jaywgZmxhZ3MpOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgJXM/XG4iLCBkZXYtPm5hbWUsCisJICAgICAgIHR4X2RvbmUoZGV2KSA/ICJJUlEgcHJvYmxlbSIgOiAibmV0d29yayBjYWJsZSBwcm9ibGVtIik7CisKKwkvKiByZW1lbWJlciB3ZSBnb3QgYW4gZXJyb3IgKi8KKworCW5wLT5zdGF0cy50eF9lcnJvcnMrKzsKKworCS8qIHJlc2V0IHRoZSBUWCBETUEgaW4gY2FzZSBpdCBoYXMgaHVuZyBvbiBzb21ldGhpbmcgKi8KKworCVJFU0VUX0RNQShORVRXT1JLX1RYX0RNQV9OQlIpOworCVdBSVRfRE1BKE5FVFdPUktfVFhfRE1BX05CUik7CisKKwkvKiBSZXNldCB0aGUgdHJhbnNjZWl2ZXIuICovCisKKwllMTAwX3Jlc2V0X3RyYW5zY2VpdmVyKGRldik7CisKKwkvKiBhbmQgZ2V0IHJpZCBvZiB0aGUgcGFja2V0cyB0aGF0IG5ldmVyIGdvdCBhbiBpbnRlcnJ1cHQgKi8KKwl3aGlsZSAobXlGaXJzdFR4RGVzYyAhPSBteU5leHRUeERlc2MpCisJeworCQlkZXZfa2ZyZWVfc2tiKG15Rmlyc3RUeERlc2MtPnNrYik7CisJCW15Rmlyc3RUeERlc2MtPnNrYiA9IDA7CisJCW15Rmlyc3RUeERlc2MgPSBwaHlzX3RvX3ZpcnQobXlGaXJzdFR4RGVzYy0+ZGVzY3IubmV4dCk7CisJfQorCisJLyogU2V0IHVwIHRyYW5zbWl0IERNQSBjaGFubmVsIHNvIGl0IGNhbiBiZSByZXN0YXJ0ZWQgbGF0ZXIgKi8KKwkqUl9ETUFfQ0gwX0ZJUlNUID0gMDsKKwkqUl9ETUFfQ0gwX0RFU0NSID0gdmlydF90b19waHlzKG15TGFzdFR4RGVzYyk7CisKKwkvKiB0ZWxsIHRoZSB1cHBlciBsYXllcnMgd2UncmUgb2sgYWdhaW4gKi8KKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+bG9jaywgZmxhZ3MpOworfQorCisKKy8qIFRoaXMgd2lsbCBvbmx5IGJlIGludm9rZWQgaWYgdGhlIGRyaXZlciBpcyBfbm90XyBpbiBYT0ZGIHN0YXRlLgorICogV2hhdCB0aGlzIG1lYW5zIGlzIHRoYXQgd2UgbmVlZCBub3QgY2hlY2sgaXQsIGFuZCB0aGF0IHRoaXMKKyAqIGludmFyaWFudCB3aWxsIGhvbGQgaWYgd2UgbWFrZSBzdXJlIHRoYXQgdGhlIG5ldGlmXypfcXVldWUoKQorICogY2FsbHMgYXJlIGRvbmUgYXQgdGhlIHByb3BlciB0aW1lcy4KKyAqLworCitzdGF0aWMgaW50CitlMTAwX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbnAgPSAoc3RydWN0IG5ldF9sb2NhbCAqKWRldi0+cHJpdjsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSBza2ItPmRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmZGVmIEVUSERFQlVHCisJcHJpbnRrKCJzZW5kIHBhY2tldCBsZW4gJWRcbiIsIGxlbmd0aCk7CisjZW5kaWYKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPmxvY2ssIGZsYWdzKTsgIC8qIHByb3RlY3QgZnJvbSB0eF9pbnRlcnJ1cHQgYW5kIG91cnNlbGYgKi8KKworCW15TmV4dFR4RGVzYy0+c2tiID0gc2tiOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwllMTAwX2hhcmR3YXJlX3NlbmRfcGFja2V0KGJ1Ziwgc2tiLT5sZW4pOworCisJbXlOZXh0VHhEZXNjID0gcGh5c190b192aXJ0KG15TmV4dFR4RGVzYy0+ZGVzY3IubmV4dCk7CisKKwkvKiBTdG9wIHF1ZXVlIGlmIGZ1bGwgKi8KKwlpZiAobXlOZXh0VHhEZXNjID09IG15Rmlyc3RUeERlc2MpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5wLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZSB0eXBpY2FsIHdvcmtsb2FkIG9mIHRoZSBkcml2ZXI6CisgKiAgIEhhbmRsZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaW50ZXJydXB0cy4KKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QKK2UxMDByeHR4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCXN0cnVjdCBuZXRfbG9jYWwgKm5wID0gKHN0cnVjdCBuZXRfbG9jYWwgKilkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpcnFiaXRzID0gKlJfSVJRX01BU0syX1JEOworCisJLyogRGlzYWJsZSBSWC9UWCBJUlFzIHRvIGF2b2lkIHJlZW50cmFuY3kgKi8KKwkqUl9JUlFfTUFTSzJfQ0xSID0KKwkgIElPX1NUQVRFKFJfSVJRX01BU0syX0NMUiwgZG1hMF9lb3AsIGNscikgfAorCSAgSU9fU1RBVEUoUl9JUlFfTUFTSzJfQ0xSLCBkbWExX2VvcCwgY2xyKTsKKworCS8qIEhhbmRsZSByZWNlaXZlZCBwYWNrZXRzICovCisJaWYgKGlycWJpdHMgJiBJT19TVEFURShSX0lSUV9NQVNLMl9SRCwgZG1hMV9lb3AsIGFjdGl2ZSkpIHsKKwkJLyogYWNrbm93bGVkZ2UgdGhlIGVvcCBpbnRlcnJ1cHQgKi8KKworCQkqUl9ETUFfQ0gxX0NMUl9JTlRSID0gSU9fU1RBVEUoUl9ETUFfQ0gxX0NMUl9JTlRSLCBjbHJfZW9wLCBkbyk7CisKKwkJLyogY2hlY2sgaWYgb25lIG9yIG1vcmUgY29tcGxldGUgcGFja2V0cyB3ZXJlIGluZGVlZCByZWNlaXZlZCAqLworCisJCXdoaWxlICgoKlJfRE1BX0NIMV9GSVJTVCAhPSB2aXJ0X3RvX3BoeXMobXlOZXh0UnhEZXNjKSkgJiYKKwkJICAgICAgIChteU5leHRSeERlc2MgIT0gbXlMYXN0UnhEZXNjKSkgeworCQkJLyogVGFrZSBvdXQgdGhlIGJ1ZmZlciBhbmQgZ2l2ZSBpdCB0byB0aGUgT1MsIHRoZW4KKwkJCSAqIGFsbG9jYXRlIGEgbmV3IGJ1ZmZlciB0byBwdXQgYSBwYWNrZXQgaW4uCisJCQkgKi8KKwkJCWUxMDBfcngoZGV2KTsKKwkJCSgoc3RydWN0IG5ldF9sb2NhbCAqKWRldi0+cHJpdiktPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCS8qIHJlc3RhcnQvY29udGludWUgb24gdGhlIGNoYW5uZWwsIGZvciBzYWZldHkgKi8KKwkJCSpSX0RNQV9DSDFfQ01EID0gSU9fU1RBVEUoUl9ETUFfQ0gxX0NNRCwgY21kLCByZXN0YXJ0KTsKKwkJCS8qIGNsZWFyIGRtYSBjaGFubmVsIDEgZW9wL2Rlc2NyIGlycSBiaXRzICovCisJCQkqUl9ETUFfQ0gxX0NMUl9JTlRSID0KKwkJCQlJT19TVEFURShSX0RNQV9DSDFfQ0xSX0lOVFIsIGNscl9lb3AsIGRvKSB8CisJCQkJSU9fU1RBVEUoUl9ETUFfQ0gxX0NMUl9JTlRSLCBjbHJfZGVzY3IsIGRvKTsKKworCQkJLyogbm93LCB3ZSBtaWdodCBoYXZlIGdvdHRlbiBhbm90aGVyIHBhY2tldAorCQkJICAgc28gd2UgaGF2ZSB0byBsb29wIGJhY2sgYW5kIGNoZWNrIGlmIHNvICovCisJCX0KKwl9CisKKwkvKiBSZXBvcnQgYW55IHBhY2tldHMgdGhhdCBoYXZlIGJlZW4gc2VudCAqLworCXdoaWxlIChteUZpcnN0VHhEZXNjICE9IHBoeXNfdG9fdmlydCgqUl9ETUFfQ0gwX0ZJUlNUKSAmJgorCSAgICAgICBteUZpcnN0VHhEZXNjICE9IG15TmV4dFR4RGVzYykKKwl7CisJCW5wLT5zdGF0cy50eF9ieXRlcyArPSBteUZpcnN0VHhEZXNjLT5za2ItPmxlbjsKKwkJbnAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKworCQkvKiBkbWEgaXMgcmVhZHkgd2l0aCB0aGUgdHJhbnNtaXNzaW9uIG9mIHRoZSBkYXRhIGluIHR4X3NrYiwgc28gbm93CisJCSAgIHdlIGNhbiByZWxlYXNlIHRoZSBza2IgbWVtb3J5ICovCisJCWRldl9rZnJlZV9za2JfaXJxKG15Rmlyc3RUeERlc2MtPnNrYik7CisJCW15Rmlyc3RUeERlc2MtPnNrYiA9IDA7CisJCW15Rmlyc3RUeERlc2MgPSBwaHlzX3RvX3ZpcnQobXlGaXJzdFR4RGVzYy0+ZGVzY3IubmV4dCk7CisJfQorCisJaWYgKGlycWJpdHMgJiBJT19TVEFURShSX0lSUV9NQVNLMl9SRCwgZG1hMF9lb3AsIGFjdGl2ZSkpIHsKKwkJLyogYWNrbm93bGVkZ2UgdGhlIGVvcCBpbnRlcnJ1cHQgYW5kIHdha2UgdXAgcXVldWUgKi8KKwkJKlJfRE1BX0NIMF9DTFJfSU5UUiA9IElPX1NUQVRFKFJfRE1BX0NIMF9DTFJfSU5UUiwgY2xyX2VvcCwgZG8pOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCisJLyogRW5hYmxlIFJYL1RYIElSUXMgYWdhaW4gKi8KKwkqUl9JUlFfTUFTSzJfU0VUID0KKwkgIElPX1NUQVRFKFJfSVJRX01BU0syX1NFVCwgZG1hMF9lb3AsIHNldCkgfAorCSAgSU9fU1RBVEUoUl9JUlFfTUFTSzJfU0VULCBkbWExX2VvcCwgc2V0KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90CitlMTAwbndfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisJc3RydWN0IG5ldF9sb2NhbCAqbnAgPSAoc3RydWN0IG5ldF9sb2NhbCAqKWRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGlycWJpdHMgPSAqUl9JUlFfTUFTSzBfUkQ7CisKKwkvKiBjaGVjayBmb3IgdW5kZXJydW4gaXJxICovCisJaWYgKGlycWJpdHMgJiBJT19TVEFURShSX0lSUV9NQVNLMF9SRCwgdW5kZXJydW4sIGFjdGl2ZSkpIHsKKwkJU0VUUyhuZXR3b3JrX3RyX2N0cmxfc2hhZG93LCBSX05FVFdPUktfVFJfQ1RSTCwgY2xyX2Vycm9yLCBjbHIpOworCQkqUl9ORVRXT1JLX1RSX0NUUkwgPSBuZXR3b3JrX3RyX2N0cmxfc2hhZG93OworCQlTRVRTKG5ldHdvcmtfdHJfY3RybF9zaGFkb3csIFJfTkVUV09SS19UUl9DVFJMLCBjbHJfZXJyb3IsIG5vcCk7CisJCW5wLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJRChwcmludGsoImV0aGVybmV0IHJlY2VpdmVyIHVuZGVycnVuIVxuIikpOworCX0KKworCS8qIGNoZWNrIGZvciBvdmVycnVuIGlycSAqLworCWlmIChpcnFiaXRzICYgSU9fU1RBVEUoUl9JUlFfTUFTSzBfUkQsIG92ZXJydW4sIGFjdGl2ZSkpIHsKKwkJdXBkYXRlX3J4X3N0YXRzKCZucC0+c3RhdHMpOyAvKiB0aGlzIHdpbGwgYWNrIHRoZSBpcnEgKi8KKwkJRChwcmludGsoImV0aGVybmV0IHJlY2VpdmVyIG92ZXJydW4hXG4iKSk7CisJfQorCS8qIGNoZWNrIGZvciBleGNlc3NpdmUgY29sbGlzaW9uIGlycSAqLworCWlmIChpcnFiaXRzICYgSU9fU1RBVEUoUl9JUlFfTUFTSzBfUkQsIGV4Y2Vzc2l2ZV9jb2wsIGFjdGl2ZSkpIHsKKwkJU0VUUyhuZXR3b3JrX3RyX2N0cmxfc2hhZG93LCBSX05FVFdPUktfVFJfQ1RSTCwgY2xyX2Vycm9yLCBjbHIpOworCQkqUl9ORVRXT1JLX1RSX0NUUkwgPSBuZXR3b3JrX3RyX2N0cmxfc2hhZG93OworCQlTRVRTKG5ldHdvcmtfdHJfY3RybF9zaGFkb3csIFJfTkVUV09SS19UUl9DVFJMLCBjbHJfZXJyb3IsIG5vcCk7CisJCSpSX05FVFdPUktfVFJfQ1RSTCA9IElPX1NUQVRFKFJfTkVUV09SS19UUl9DVFJMLCBjbHJfZXJyb3IsIGNscik7CisJCW5wLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJRChwcmludGsoImV0aGVybmV0IGV4Y2Vzc2l2ZSBjb2xsaXNpb25zIVxuIikpOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIFdlIGhhdmUgYSBnb29kIHBhY2tldChzKSwgZ2V0IGl0L3RoZW0gb3V0IG9mIHRoZSBidWZmZXJzLiAqLworc3RhdGljIHZvaWQKK2UxMDBfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBsZW5ndGggPSAwOworCXN0cnVjdCBuZXRfbG9jYWwgKm5wID0gKHN0cnVjdCBuZXRfbG9jYWwgKilkZXYtPnByaXY7CisJdW5zaWduZWQgY2hhciAqc2tiX2RhdGFfcHRyOworI2lmZGVmIEVUSERFQlVHCisJaW50IGk7CisjZW5kaWYKKworCWlmICghbGVkX2FjdGl2ZSAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIGxlZF9uZXh0X3RpbWUpKSB7CisJCS8qIGxpZ2h0IHRoZSBuZXR3b3JrIGxlZHMgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHNwZWVkLiAqLworCQllMTAwX3NldF9uZXR3b3JrX2xlZHMoTkVUV09SS19BQ1RJVklUWSk7CisKKwkJLyogU2V0IHRoZSBlYXJsaWVzdCB0aW1lIHdlIG1heSBjbGVhciB0aGUgTEVEICovCisJCWxlZF9uZXh0X3RpbWUgPSBqaWZmaWVzICsgTkVUX0ZMQVNIX1RJTUU7CisJCWxlZF9hY3RpdmUgPSAxOworCQltb2RfdGltZXIoJmNsZWFyX2xlZF90aW1lciwgamlmZmllcyArIEhaLzEwKTsKKwl9CisKKwlsZW5ndGggPSBteU5leHRSeERlc2MtPmRlc2NyLmh3X2xlbiAtIDQ7CisJKChzdHJ1Y3QgbmV0X2xvY2FsICopZGV2LT5wcml2KS0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuZ3RoOworCisjaWZkZWYgRVRIREVCVUcKKwlwcmludGsoIkdvdCBhIHBhY2tldCBvZiBsZW5ndGggJWQ6XG4iLCBsZW5ndGgpOworCS8qIGR1bXAgdGhlIGZpcnN0IGJ5dGVzIGluIHRoZSBwYWNrZXQgKi8KKwlza2JfZGF0YV9wdHIgPSAodW5zaWduZWQgY2hhciAqKXBoeXNfdG9fdmlydChteU5leHRSeERlc2MtPmRlc2NyLmJ1Zik7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlwcmludGsoIiVkOiAlLjJ4ICUuMnggJS4yeCAlLjJ4ICUuMnggJS4yeCAlLjJ4ICUuMnhcbiIsIGkgKiA4LAorCQkgICAgICAgc2tiX2RhdGFfcHRyWzBdLHNrYl9kYXRhX3B0clsxXSxza2JfZGF0YV9wdHJbMl0sc2tiX2RhdGFfcHRyWzNdLAorCQkgICAgICAgc2tiX2RhdGFfcHRyWzRdLHNrYl9kYXRhX3B0cls1XSxza2JfZGF0YV9wdHJbNl0sc2tiX2RhdGFfcHRyWzddKTsKKwkJc2tiX2RhdGFfcHRyICs9IDg7CisJfQorI2VuZGlmCisKKwlpZiAobGVuZ3RoIDwgUlhfQ09QWUJSRUFLKSB7CisJCS8qIFNtYWxsIHBhY2tldCwgY29weSBkYXRhICovCisJCXNrYiA9IGRldl9hbGxvY19za2IobGVuZ3RoIC0gRVRIRVJfSEVBRF9MRU4pOworCQlpZiAoIXNrYikgeworCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsIGRldi0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKworCQlza2JfcHV0KHNrYiwgbGVuZ3RoIC0gRVRIRVJfSEVBRF9MRU4pOyAgICAgICAgLyogYWxsb2NhdGUgcm9vbSBmb3IgdGhlIHBhY2tldCBib2R5ICovCisJCXNrYl9kYXRhX3B0ciA9IHNrYl9wdXNoKHNrYiwgRVRIRVJfSEVBRF9MRU4pOyAvKiBhbGxvY2F0ZSByb29tIGZvciB0aGUgaGVhZGVyICovCisKKyNpZmRlZiBFVEhERUJVRworCQlwcmludGsoImhlYWQgPSAweCV4LCBkYXRhID0gMHgleCwgdGFpbCA9IDB4JXgsIGVuZCA9IDB4JXhcbiIsCisJCSAgc2tiLT5oZWFkLCBza2ItPmRhdGEsIHNrYi0+dGFpbCwgc2tiLT5lbmQpOworCQlwcmludGsoImNvcHlpbmcgcGFja2V0IHRvIDB4JXguXG4iLCBza2JfZGF0YV9wdHIpOworI2VuZGlmCisKKwkJbWVtY3B5KHNrYl9kYXRhX3B0ciwgcGh5c190b192aXJ0KG15TmV4dFJ4RGVzYy0+ZGVzY3IuYnVmKSwgbGVuZ3RoKTsKKwl9CisJZWxzZSB7CisJCS8qIExhcmdlIHBhY2tldCwgc2VuZCBkaXJlY3RseSB0byB1cHBlciBsYXllcnMgYW5kIGFsbG9jYXRlIG5ldworCQkgKiBtZW1vcnkgKGFsaWduZWQgdG8gY2FjaGUgbGluZSBib3VuZGFyeSB0byBhdm9pZCBidWcpLgorCQkgKiBCZWZvcmUgc2VuZGluZyB0aGUgc2tiIHRvIHVwcGVyIGxheWVycyB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0CisJCSAqIHNrYi0+ZGF0YSBwb2ludHMgdG8gdGhlIGFsaWduZWQgc3RhcnQgb2YgdGhlIHBhY2tldC4KKwkJICovCisJCWludCBhbGlnbjsKKwkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKE1BWF9NRURJQV9EQVRBX1NJWkUgKyAyICogTDFfQ0FDSEVfQllURVMpOworCQlpZiAoIW5ld19za2IpIHsKKwkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCQkJcmV0dXJuOworCQl9CisJCXNrYiA9IG15TmV4dFJ4RGVzYy0+c2tiOworCQlhbGlnbiA9IChpbnQpcGh5c190b192aXJ0KG15TmV4dFJ4RGVzYy0+ZGVzY3IuYnVmKSAtIChpbnQpc2tiLT5kYXRhOworCQlza2JfcHV0KHNrYiwgbGVuZ3RoICsgYWxpZ24pOworCQlza2JfcHVsbChza2IsIGFsaWduKTsgLyogUmVtb3ZlIGFsaWdubWVudCBieXRlcyAqLworCQlteU5leHRSeERlc2MtPnNrYiA9IG5ld19za2I7CisJCW15TmV4dFJ4RGVzYy0+ZGVzY3IuYnVmID0gTDFfQ0FDSEVfQUxJR04odmlydF90b19waHlzKG15TmV4dFJ4RGVzYy0+c2tiLT5kYXRhKSk7CisJfQorCisJc2tiLT5kZXYgPSBkZXY7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworCS8qIFNlbmQgdGhlIHBhY2tldCB0byB0aGUgdXBwZXIgbGF5ZXJzICovCisJbmV0aWZfcngoc2tiKTsKKworCS8qIFByZXBhcmUgZm9yIG5leHQgcGFja2V0ICovCisJbXlOZXh0UnhEZXNjLT5kZXNjci5zdGF0dXMgPSAwOworCW15UHJldlJ4RGVzYyA9IG15TmV4dFJ4RGVzYzsKKwlteU5leHRSeERlc2MgPSBwaHlzX3RvX3ZpcnQobXlOZXh0UnhEZXNjLT5kZXNjci5uZXh0KTsKKworCXJ4X3F1ZXVlX2xlbisrOworCisJLyogQ2hlY2sgaWYgZGVzY3JpcHRvcnMgc2hvdWxkIGJlIHJldHVybmVkICovCisJaWYgKHJ4X3F1ZXVlX2xlbiA9PSBSWF9RVUVVRV9USFJFU0hPTEQpIHsKKwkJZmx1c2hfZXRyYXhfY2FjaGUoKTsKKwkJbXlQcmV2UnhEZXNjLT5kZXNjci5jdHJsIHw9IGRfZW9sOworCQlteUxhc3RSeERlc2MtPmRlc2NyLmN0cmwgJj0gfmRfZW9sOworCQlteUxhc3RSeERlc2MgPSBteVByZXZSeERlc2M7CisJCXJ4X3F1ZXVlX2xlbiA9IDA7CisJfQorfQorCisvKiBUaGUgaW52ZXJzZSByb3V0aW5lIHRvIG5ldF9vcGVuKCkuICovCitzdGF0aWMgaW50CitlMTAwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbnAgPSAoc3RydWN0IG5ldF9sb2NhbCAqKWRldi0+cHJpdjsKKworCXByaW50ayhLRVJOX0lORk8gIkNsb3NpbmcgJXMuXG4iLCBkZXYtPm5hbWUpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJKlJfSVJRX01BU0swX0NMUiA9CisJCUlPX1NUQVRFKFJfSVJRX01BU0swX0NMUiwgb3ZlcnJ1biwgY2xyKSB8CisJCUlPX1NUQVRFKFJfSVJRX01BU0swX0NMUiwgdW5kZXJydW4sIGNscikgfAorCQlJT19TVEFURShSX0lSUV9NQVNLMF9DTFIsIGV4Y2Vzc2l2ZV9jb2wsIGNscik7CisKKwkqUl9JUlFfTUFTSzJfQ0xSID0KKwkJSU9fU1RBVEUoUl9JUlFfTUFTSzJfQ0xSLCBkbWEwX2Rlc2NyLCBjbHIpIHwKKwkJSU9fU1RBVEUoUl9JUlFfTUFTSzJfQ0xSLCBkbWEwX2VvcCwgY2xyKSB8CisJCUlPX1NUQVRFKFJfSVJRX01BU0syX0NMUiwgZG1hMV9kZXNjciwgY2xyKSB8CisJCUlPX1NUQVRFKFJfSVJRX01BU0syX0NMUiwgZG1hMV9lb3AsIGNscik7CisKKwkvKiBTdG9wIHRoZSByZWNlaXZlciBhbmQgdGhlIHRyYW5zbWl0dGVyICovCisKKwlSRVNFVF9ETUEoTkVUV09SS19UWF9ETUFfTkJSKTsKKwlSRVNFVF9ETUEoTkVUV09SS19SWF9ETUFfTkJSKTsKKworCS8qIEZsdXNoIHRoZSBUeCBhbmQgZGlzYWJsZSBSeCBoZXJlLiAqLworCisJZnJlZV9pcnEoTkVUV09SS19ETUFfUlhfSVJRX05CUiwgKHZvaWQgKilkZXYpOworCWZyZWVfaXJxKE5FVFdPUktfRE1BX1RYX0lSUV9OQlIsICh2b2lkICopZGV2KTsKKwlmcmVlX2lycShORVRXT1JLX1NUQVRVU19JUlFfTkJSLCAodm9pZCAqKWRldik7CisKKwkvKiBVcGRhdGUgdGhlIHN0YXRpc3RpY3MgaGVyZS4gKi8KKworCXVwZGF0ZV9yeF9zdGF0cygmbnAtPnN0YXRzKTsKKwl1cGRhdGVfdHhfc3RhdHMoJm5wLT5zdGF0cyk7CisKKwkvKiBTdG9wIHNwZWVkL2R1cGxleCB0aW1lcnMgKi8KKwlkZWxfdGltZXIoJnNwZWVkX3RpbWVyKTsKKwlkZWxfdGltZXIoJmR1cGxleF90aW1lcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZTEwMF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkoaWZyKTsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2soJm5wLT5sb2NrKTsgLyogUHJlZW1wdCBwcm90ZWN0aW9uICovCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBTSU9DRVRIVE9PTDoKKwkJCXJldHVybiBlMTAwX2V0aHRvb2xfaW9jdGwoZGV2LGlmcik7CisJCWNhc2UgU0lPQ0dNSUlQSFk6IC8qIEdldCBQSFkgYWRkcmVzcyAqLworCQkJZGF0YS0+cGh5X2lkID0gbWRpb19waHlfYWRkcjsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NHTUlJUkVHOiAvKiBSZWFkIE1JSSByZWdpc3RlciAqLworCQkJZGF0YS0+dmFsX291dCA9IGUxMDBfZ2V0X21kaW9fcmVnKGRldiwgbWRpb19waHlfYWRkciwgZGF0YS0+cmVnX251bSk7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DU01JSVJFRzogLyogV3JpdGUgTUlJIHJlZ2lzdGVyICovCisJCQllMTAwX3NldF9tZGlvX3JlZyhkZXYsIG1kaW9fcGh5X2FkZHIsIGRhdGEtPnJlZ19udW0sIGRhdGEtPnZhbF9pbik7CisJCQlicmVhazsKKwkJLyogVGhlIGlvY3RscyBiZWxvdyBzaG91bGQgYmUgY29uc2lkZXJlZCBvYnNvbGV0ZSBidXQgYXJlICovCisJCS8qIHN0aWxsIHByZXNlbnQgZm9yIGNvbXBhdGFiaWxpdHkgd2l0aCBvbGQgc2NyaXB0cy9hcHBzICAqLworCQljYXNlIFNFVF9FVEhfU1BFRURfMTA6ICAgICAgICAgICAgICAgICAgLyogMTAgTWJwcyAqLworCQkJZTEwMF9zZXRfc3BlZWQoZGV2LCAxMCk7CisJCQlicmVhazsKKwkJY2FzZSBTRVRfRVRIX1NQRUVEXzEwMDogICAgICAgICAgICAgICAgLyogMTAwIE1icHMgKi8KKwkJCWUxMDBfc2V0X3NwZWVkKGRldiwgMTAwKTsKKwkJCWJyZWFrOworCQljYXNlIFNFVF9FVEhfU1BFRURfQVVUTzogICAgICAgICAgICAgIC8qIEF1dG8gbmVnb3RpYXRlIHNwZWVkICovCisJCQllMTAwX3NldF9zcGVlZChkZXYsIDApOworCQkJYnJlYWs7CisJCWNhc2UgU0VUX0VUSF9EVVBMRVhfSEFMRjogICAgICAgICAgICAgIC8qIEhhbGYgZHVwbGV4LiAqLworCQkJZTEwMF9zZXRfZHVwbGV4KGRldiwgaGFsZik7CisJCQlicmVhazsKKwkJY2FzZSBTRVRfRVRIX0RVUExFWF9GVUxMOiAgICAgICAgICAgICAgLyogRnVsbCBkdXBsZXguICovCisJCQllMTAwX3NldF9kdXBsZXgoZGV2LCBmdWxsKTsKKwkJCWJyZWFrOworCQljYXNlIFNFVF9FVEhfRFVQTEVYX0FVVE86ICAgICAgICAgICAgIC8qIEF1dG9uZWdvdGlhdGUgZHVwbGV4Ki8KKwkJCWUxMDBfc2V0X2R1cGxleChkZXYsIGF1dG9uZWcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZTEwMF9ldGh0b29sX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyKQoreworCXN0cnVjdCBldGh0b29sX2NtZCBlY21kOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZlY21kLCBpZnItPmlmcl9kYXRhLCBzaXplb2YgKGVjbWQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKGVjbWQuY21kKSB7CisJCWNhc2UgRVRIVE9PTF9HU0VUOgorCQl7CisJCQltZW1zZXQoKHZvaWQgKikgJmVjbWQsIDAsIHNpemVvZiAoZWNtZCkpOworCQkJZWNtZC5zdXBwb3J0ZWQgPQorCQkJICBTVVBQT1JURURfQXV0b25lZyB8IFNVUFBPUlRFRF9UUCB8IFNVUFBPUlRFRF9NSUkgfAorCQkJICBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CisJCQkgIFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGw7CisJCQllY21kLnBvcnQgPSBQT1JUX1RQOworCQkJZWNtZC50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CisJCQllY21kLnBoeV9hZGRyZXNzID0gbWRpb19waHlfYWRkcjsKKwkJCWVjbWQuc3BlZWQgPSBjdXJyZW50X3NwZWVkOworCQkJZWNtZC5kdXBsZXggPSBmdWxsX2R1cGxleCA/IERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CisJCQllY21kLmFkdmVydGlzaW5nID0gQURWRVJUSVNFRF9UUDsKKwkJCWlmIChjdXJyZW50X2R1cGxleCA9PSBhdXRvbmVnICYmIGN1cnJlbnRfc3BlZWRfc2VsZWN0aW9uID09IDApCisJCQkJZWNtZC5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0F1dG9uZWc7CisJCQllbHNlIHsKKwkJCQllY21kLmFkdmVydGlzaW5nIHw9CisJCQkJICBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsIHwKKwkJCQkgIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbDsKKwkJCQlpZiAoY3VycmVudF9zcGVlZF9zZWxlY3Rpb24gPT0gMTApCisJCQkJCWVjbWQuYWR2ZXJ0aXNpbmcgJj0gfihBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpOworCQkJCWVsc2UgaWYgKGN1cnJlbnRfc3BlZWRfc2VsZWN0aW9uID09IDEwMCkKKwkJCQkJZWNtZC5hZHZlcnRpc2luZyAmPSB+KEFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwpOworCQkJCWlmIChjdXJyZW50X2R1cGxleCA9PSBoYWxmKQorCQkJCQllY21kLmFkdmVydGlzaW5nICY9IH4oQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfCBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpOworCQkJCWVsc2UgaWYgKGN1cnJlbnRfZHVwbGV4ID09IGZ1bGwpCisJCQkJCWVjbWQuYWR2ZXJ0aXNpbmcgJj0gfihBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZik7CisJCQl9CisJCQllY21kLmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgJmVjbWQsIHNpemVvZiAoZWNtZCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCQljYXNlIEVUSFRPT0xfU1NFVDoKKwkJeworCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCX0KKwkJCWlmIChlY21kLmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJCQllMTAwX3NldF9kdXBsZXgoZGV2LCBhdXRvbmVnKTsKKwkJCQllMTAwX3NldF9zcGVlZChkZXYsIDApOworCQkJfSBlbHNlIHsKKwkJCQllMTAwX3NldF9kdXBsZXgoZGV2LCBlY21kLmR1cGxleCA9PSBEVVBMRVhfSEFMRiA/IGhhbGYgOiBmdWxsKTsKKwkJCQllMTAwX3NldF9zcGVlZChkZXYsIGVjbWQuc3BlZWQgPT0gU1BFRURfMTAgPyAxMDogMTAwKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwkJY2FzZSBFVEhUT09MX0dEUlZJTkZPOgorCQl7CisJCQlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvIGluZm87CisJCQltZW1zZXQoKHZvaWQgKikgJmluZm8sIDAsIHNpemVvZiAoaW5mbykpOworCQkJc3RybmNweShpbmZvLmRyaXZlciwgIkVUUkFYIDEwMExYIiwgc2l6ZW9mKGluZm8uZHJpdmVyKSAtIDEpOworCQkJc3RybmNweShpbmZvLnZlcnNpb24sICIkUmV2aXNpb246IDEuMzEgJCIsIHNpemVvZihpbmZvLnZlcnNpb24pIC0gMSk7CisJCQlzdHJuY3B5KGluZm8uZndfdmVyc2lvbiwgIk4vQSIsIHNpemVvZihpbmZvLmZ3X3ZlcnNpb24pIC0gMSk7CisJCQlzdHJuY3B5KGluZm8uYnVzX2luZm8sICJOL0EiLCBzaXplb2YoaW5mby5idXNfaW5mbykgLSAxKTsKKwkJCWluZm8ucmVnZHVtcF9sZW4gPSAwOworCQkJaW5mby5lZWR1bXBfbGVuID0gMDsKKwkJCWluZm8udGVzdGluZm9fbGVuID0gMDsKKwkJCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgJmluZm8sIHNpemVvZiAoaW5mbykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCQljYXNlIEVUSFRPT0xfTldBWV9SU1Q6CisJCQlpZiAoY3VycmVudF9kdXBsZXggPT0gYXV0b25lZyAmJiBjdXJyZW50X3NwZWVkX3NlbGVjdGlvbiA9PSAwKQorCQkJCWUxMDBfbmVnb3RpYXRlKGRldik7CisJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2UxMDBfc2V0X2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpucCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopZGV2LT5wcml2OworCXNwaW5fbG9jaygmbnAtPmxvY2spOyAvKiBQcmVlbXB0IHByb3RlY3Rpb24gKi8KKworCXN3aXRjaChtYXAtPnBvcnQpIHsKKwkJY2FzZSBJRl9QT1JUX1VOS05PV046CisJCQkvKiBVc2UgYXV0b25lZyAqLworCQkJZTEwMF9zZXRfc3BlZWQoZGV2LCAwKTsKKwkJCWUxMDBfc2V0X2R1cGxleChkZXYsIGF1dG9uZWcpOworCQkJYnJlYWs7CisJCWNhc2UgSUZfUE9SVF8xMEJBU0VUOgorCQkJZTEwMF9zZXRfc3BlZWQoZGV2LCAxMCk7CisJCQllMTAwX3NldF9kdXBsZXgoZGV2LCBhdXRvbmVnKTsKKwkJCWJyZWFrOworCQljYXNlIElGX1BPUlRfMTAwQkFTRVQ6CisJCWNhc2UgSUZfUE9SVF8xMDBCQVNFVFg6CisJCQllMTAwX3NldF9zcGVlZChkZXYsIDEwMCk7CisJCQllMTAwX3NldF9kdXBsZXgoZGV2LCBhdXRvbmVnKTsKKwkJCWJyZWFrOworCQljYXNlIElGX1BPUlRfMTAwQkFTRUZYOgorCQljYXNlIElGX1BPUlRfMTBCQVNFMjoKKwkJY2FzZSBJRl9QT1JUX0FVSToKKwkJCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgbWVkaWEgc2VsZWN0ZWQiLCBkZXYtPm5hbWUpOworCQkJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlzcGluX3VubG9jaygmbnAtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAordXBkYXRlX3J4X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICplcykKK3sKKwl1bnNpZ25lZCBsb25nIHIgPSAqUl9SRUNfQ09VTlRFUlM7CisJLyogdXBkYXRlIHN0YXRzIHJlbGV2YW50IHRvIHJlY2VwdGlvbiBlcnJvcnMgKi8KKwllcy0+cnhfZmlmb19lcnJvcnMgKz0gSU9fRVhUUkFDVChSX1JFQ19DT1VOVEVSUywgY29uZ2VzdGlvbiwgcik7CisJZXMtPnJ4X2NyY19lcnJvcnMgKz0gSU9fRVhUUkFDVChSX1JFQ19DT1VOVEVSUywgY3JjX2Vycm9yLCByKTsKKwllcy0+cnhfZnJhbWVfZXJyb3JzICs9IElPX0VYVFJBQ1QoUl9SRUNfQ09VTlRFUlMsIGFsaWdubWVudF9lcnJvciwgcik7CisJZXMtPnJ4X2xlbmd0aF9lcnJvcnMgKz0gSU9fRVhUUkFDVChSX1JFQ19DT1VOVEVSUywgb3ZlcnNpemUsIHIpOworfQorCitzdGF0aWMgdm9pZAordXBkYXRlX3R4X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICplcykKK3sKKwl1bnNpZ25lZCBsb25nIHIgPSAqUl9UUl9DT1VOVEVSUzsKKwkvKiB1cGRhdGUgc3RhdHMgcmVsZXZhbnQgdG8gdHJhbnNtaXNzaW9uIGVycm9ycyAqLworCWVzLT5jb2xsaXNpb25zICs9CisJCUlPX0VYVFJBQ1QoUl9UUl9DT1VOVEVSUywgc2luZ2xlX2NvbCwgcikgKworCQlJT19FWFRSQUNUKFJfVFJfQ09VTlRFUlMsIG11bHRpcGxlX2NvbCwgcik7CisJZXMtPnR4X2Vycm9ycyArPSBJT19FWFRSQUNUKFJfVFJfQ09VTlRFUlMsIGRlZmVycmVkLCByKTsKK30KKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLgorICogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvciBjbG9zZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCitlMTAwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gKHN0cnVjdCBuZXRfbG9jYWwgKilkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXVwZGF0ZV9yeF9zdGF0cygmbHAtPnN0YXRzKTsKKwl1cGRhdGVfdHhfc3RhdHMoJmxwLT5zdGF0cyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCXJldHVybiAmbHAtPnN0YXRzOworfQorCisvKgorICogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgKiBudW1fYWRkcnMgPT0gLTEJUHJvbWlzY3VvdXMgbW9kZSwgcmVjZWl2ZSBhbGwgcGFja2V0cworICogbnVtX2FkZHJzID09IDAJTm9ybWFsIG1vZGUsIGNsZWFyIG11bHRpY2FzdCBsaXN0CisgKiBudW1fYWRkcnMgPiAwCU11bHRpY2FzdCBtb2RlLCByZWNlaXZlIG5vcm1hbCBhbmQgTUMgcGFja2V0cywKKyAqCQkJYW5kIGRvIGJlc3QtZWZmb3J0IGZpbHRlcmluZy4KKyAqLworc3RhdGljIHZvaWQKK3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gKHN0cnVjdCBuZXRfbG9jYWwgKilkZXYtPnByaXY7CisJaW50IG51bV9hZGRyID0gZGV2LT5tY19jb3VudDsKKwl1bnNpZ25lZCBsb25nIGludCBsb19iaXRzOworCXVuc2lnbmVkIGxvbmcgaW50IGhpX2JpdHM7CisJc3Bpbl9sb2NrKCZscC0+bG9jayk7CisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwl7CisJCS8qIHByb21pc2N1b3VzIG1vZGUgKi8KKwkJbG9fYml0cyA9IDB4ZmZmZmZmZmZ1bDsKKwkJaGlfYml0cyA9IDB4ZmZmZmZmZmZ1bDsKKworCQkvKiBFbmFibGUgaW5kaXZpZHVhbCByZWNlaXZlICovCisJCVNFVFMobmV0d29ya19yZWNfY29uZmlnX3NoYWRvdywgUl9ORVRXT1JLX1JFQ19DT05GSUcsIGluZGl2aWR1YWwsIHJlY2VpdmUpOworCQkqUl9ORVRXT1JLX1JFQ19DT05GSUcgPSBuZXR3b3JrX3JlY19jb25maWdfc2hhZG93OworCX0gZWxzZSBpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQkvKiBlbmFibGUgYWxsIG11bHRpY2FzdHMgKi8KKwkJbG9fYml0cyA9IDB4ZmZmZmZmZmZ1bDsKKwkJaGlfYml0cyA9IDB4ZmZmZmZmZmZ1bDsKKworCQkvKiBEaXNhYmxlIGluZGl2aWR1YWwgcmVjZWl2ZSAqLworCQlTRVRTKG5ldHdvcmtfcmVjX2NvbmZpZ19zaGFkb3csIFJfTkVUV09SS19SRUNfQ09ORklHLCBpbmRpdmlkdWFsLCBkaXNjYXJkKTsKKwkJKlJfTkVUV09SS19SRUNfQ09ORklHID0gIG5ldHdvcmtfcmVjX2NvbmZpZ19zaGFkb3c7CisJfSBlbHNlIGlmIChudW1fYWRkciA9PSAwKSB7CisJCS8qIE5vcm1hbCwgY2xlYXIgdGhlIG1jIGxpc3QgKi8KKwkJbG9fYml0cyA9IDB4MDAwMDAwMDB1bDsKKwkJaGlfYml0cyA9IDB4MDAwMDAwMDB1bDsKKworCQkvKiBEaXNhYmxlIGluZGl2aWR1YWwgcmVjZWl2ZSAqLworCQlTRVRTKG5ldHdvcmtfcmVjX2NvbmZpZ19zaGFkb3csIFJfTkVUV09SS19SRUNfQ09ORklHLCBpbmRpdmlkdWFsLCBkaXNjYXJkKTsKKwkJKlJfTkVUV09SS19SRUNfQ09ORklHID0gIG5ldHdvcmtfcmVjX2NvbmZpZ19zaGFkb3c7CisJfSBlbHNlIHsKKwkJLyogTUMgbW9kZSwgcmVjZWl2ZSBub3JtYWwgYW5kIE1DIHBhY2tldHMgKi8KKwkJY2hhciBoYXNoX2l4OworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IGRldi0+bWNfbGlzdDsKKwkJaW50IGk7CisJCWNoYXIgKmJhZGRyOworCQlsb19iaXRzID0gMHgwMDAwMDAwMHVsOworCQloaV9iaXRzID0gMHgwMDAwMDAwMHVsOworCQlmb3IgKGk9MDsgaTxudW1fYWRkcjsgaSsrKSB7CisJCQkvKiBDYWxjdWxhdGUgdGhlIGhhc2ggaW5kZXggZm9yIHRoZSBHQSByZWdpc3RlcnMgKi8KKworCQkJaGFzaF9peCA9IDA7CisJCQliYWRkciA9IGRtaS0+ZG1pX2FkZHI7CisJCQloYXNoX2l4IF49ICgqYmFkZHIpICYgMHgzZjsKKwkJCWhhc2hfaXggXj0gKCgqYmFkZHIpID4+IDYpICYgMHgwMzsKKwkJCSsrYmFkZHI7CisJCQloYXNoX2l4IF49ICgoKmJhZGRyKSA8PCAyKSAmIDB4MDNjOworCQkJaGFzaF9peCBePSAoKCpiYWRkcikgPj4gNCkgJiAweGY7CisJCQkrK2JhZGRyOworCQkJaGFzaF9peCBePSAoKCpiYWRkcikgPDwgNCkgJiAweDMwOworCQkJaGFzaF9peCBePSAoKCpiYWRkcikgPj4gMikgJiAweDNmOworCQkJKytiYWRkcjsKKwkJCWhhc2hfaXggXj0gKCpiYWRkcikgJiAweDNmOworCQkJaGFzaF9peCBePSAoKCpiYWRkcikgPj4gNikgJiAweDAzOworCQkJKytiYWRkcjsKKwkJCWhhc2hfaXggXj0gKCgqYmFkZHIpIDw8IDIpICYgMHgwM2M7CisJCQloYXNoX2l4IF49ICgoKmJhZGRyKSA+PiA0KSAmIDB4ZjsKKwkJCSsrYmFkZHI7CisJCQloYXNoX2l4IF49ICgoKmJhZGRyKSA8PCA0KSAmIDB4MzA7CisJCQloYXNoX2l4IF49ICgoKmJhZGRyKSA+PiAyKSAmIDB4M2Y7CisKKwkJCWhhc2hfaXggJj0gMHgzZjsKKworCQkJaWYgKGhhc2hfaXggPj0gMzIpIHsKKwkJCQloaV9iaXRzIHw9ICgxIDw8IChoYXNoX2l4LTMyKSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlsb19iaXRzIHw9ICgxIDw8IGhhc2hfaXgpOworCQkJfQorCQkJZG1pID0gZG1pLT5uZXh0OworCQl9CisJCS8qIERpc2FibGUgaW5kaXZpZHVhbCByZWNlaXZlICovCisJCVNFVFMobmV0d29ya19yZWNfY29uZmlnX3NoYWRvdywgUl9ORVRXT1JLX1JFQ19DT05GSUcsIGluZGl2aWR1YWwsIGRpc2NhcmQpOworCQkqUl9ORVRXT1JLX1JFQ19DT05GSUcgPSBuZXR3b3JrX3JlY19jb25maWdfc2hhZG93OworCX0KKwkqUl9ORVRXT1JLX0dBXzAgPSBsb19iaXRzOworCSpSX05FVFdPUktfR0FfMSA9IGhpX2JpdHM7CisJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKK30KKwordm9pZAorZTEwMF9oYXJkd2FyZV9zZW5kX3BhY2tldChjaGFyICpidWYsIGludCBsZW5ndGgpCit7CisJRChwcmludGsoImUxMDAgc2VuZCBwYWNrLCBidWYgMHgleCBsZW4gJWRcbiIsIGJ1ZiwgbGVuZ3RoKSk7CisKKwlpZiAoIWxlZF9hY3RpdmUgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBsZWRfbmV4dF90aW1lKSkgeworCQkvKiBsaWdodCB0aGUgbmV0d29yayBsZWRzIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBzcGVlZC4gKi8KKwkJZTEwMF9zZXRfbmV0d29ya19sZWRzKE5FVFdPUktfQUNUSVZJVFkpOworCisJCS8qIFNldCB0aGUgZWFybGllc3QgdGltZSB3ZSBtYXkgY2xlYXIgdGhlIExFRCAqLworCQlsZWRfbmV4dF90aW1lID0gamlmZmllcyArIE5FVF9GTEFTSF9USU1FOworCQlsZWRfYWN0aXZlID0gMTsKKwkJbW9kX3RpbWVyKCZjbGVhcl9sZWRfdGltZXIsIGppZmZpZXMgKyBIWi8xMCk7CisJfQorCisJLyogY29uZmlndXJlIHRoZSB0eCBkbWEgZGVzY3JpcHRvciAqLworCW15TmV4dFR4RGVzYy0+ZGVzY3Iuc3dfbGVuID0gbGVuZ3RoOworCW15TmV4dFR4RGVzYy0+ZGVzY3IuY3RybCA9IGRfZW9wIHwgZF9lb2wgfCBkX3dhaXQ7CisJbXlOZXh0VHhEZXNjLT5kZXNjci5idWYgPSB2aXJ0X3RvX3BoeXMoYnVmKTsKKworICAgICAgICAvKiBNb3ZlIGVuZCBvZiBsaXN0ICovCisgICAgICAgIG15TGFzdFR4RGVzYy0+ZGVzY3IuY3RybCAmPSB+ZF9lb2w7CisgICAgICAgIG15TGFzdFR4RGVzYyA9IG15TmV4dFR4RGVzYzsKKworCS8qIFJlc3RhcnQgRE1BIGNoYW5uZWwgKi8KKwkqUl9ETUFfQ0gwX0NNRCA9IElPX1NUQVRFKFJfRE1BX0NIMF9DTUQsIGNtZCwgcmVzdGFydCk7Cit9CisKK3N0YXRpYyB2b2lkCitlMTAwX2NsZWFyX25ldHdvcmtfbGVkcyh1bnNpZ25lZCBsb25nIGR1bW15KQoreworCWlmIChsZWRfYWN0aXZlICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgbGVkX25leHRfdGltZSkpIHsKKwkJZTEwMF9zZXRfbmV0d29ya19sZWRzKE5PX05FVFdPUktfQUNUSVZJVFkpOworCisJCS8qIFNldCB0aGUgZWFybGllc3QgdGltZSB3ZSBtYXkgc2V0IHRoZSBMRUQgKi8KKwkJbGVkX25leHRfdGltZSA9IGppZmZpZXMgKyBORVRfRkxBU0hfUEFVU0U7CisJCWxlZF9hY3RpdmUgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQKK2UxMDBfc2V0X25ldHdvcmtfbGVkcyhpbnQgYWN0aXZlKQoreworI2lmIGRlZmluZWQoQ09ORklHX0VUUkFYX05FVFdPUktfTEVEX09OX1dIRU5fTElOSykKKwlpbnQgbGlnaHRfbGVkcyA9IChhY3RpdmUgPT0gTk9fTkVUV09SS19BQ1RJVklUWSk7CisjZWxpZiBkZWZpbmVkKENPTkZJR19FVFJBWF9ORVRXT1JLX0xFRF9PTl9XSEVOX0FDVElWSVRZKQorCWludCBsaWdodF9sZWRzID0gKGFjdGl2ZSA9PSBORVRXT1JLX0FDVElWSVRZKTsKKyNlbHNlCisjZXJyb3IgIkRlZmluZSBlaXRoZXIgQ09ORklHX0VUUkFYX05FVFdPUktfTEVEX09OX1dIRU5fTElOSyBvciBDT05GSUdfRVRSQVhfTkVUV09SS19MRURfT05fV0hFTl9BQ1RJVklUWSIKKyNlbmRpZgorCisJaWYgKCFjdXJyZW50X3NwZWVkKSB7CisJCS8qIE1ha2UgTEVEIHJlZCwgbGluayBpcyBkb3duICovCisjaWYgZGVmaW5lZChDT05GSUdfRVRSQVhfTkVUV09SS19SRURfT05fTk9fQ09OTkVDVElPTikKKwkJTEVEX05FVFdPUktfU0VUKExFRF9SRUQpOworI2Vsc2UKKwkJTEVEX05FVFdPUktfU0VUKExFRF9PRkYpOworI2VuZGlmCisJfQorCWVsc2UgaWYgKGxpZ2h0X2xlZHMpIHsKKwkJaWYgKGN1cnJlbnRfc3BlZWQgPT0gMTApIHsKKwkJCUxFRF9ORVRXT1JLX1NFVChMRURfT1JBTkdFKTsKKwkJfSBlbHNlIHsKKwkJCUxFRF9ORVRXT1JLX1NFVChMRURfR1JFRU4pOworCQl9CisJfQorCWVsc2UgeworCQlMRURfTkVUV09SS19TRVQoTEVEX09GRik7CisJfQorfQorCitzdGF0aWMgaW50CitldHJheF9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBldHJheF9ldGhlcm5ldF9pbml0KCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0CitlMTAwX2Jvb3Rfc2V0dXAoY2hhciogc3RyKQoreworCXN0cnVjdCBzb2NrYWRkciBzYSA9IHswfTsKKwlpbnQgaTsKKworCS8qIFBhcnNlIHRoZSBjb2xvbiBzZXBhcmF0ZWQgRXRoZXJuZXQgc3RhdGlvbiBhZGRyZXNzICovCisJZm9yIChpID0gMDsgaSA8ICBFVEhfQUxFTjsgaSsrKSB7CisJCXVuc2lnbmVkIGludCB0bXA7CisJCWlmIChzc2NhbmYoc3RyICsgMyppLCAiJTJ4IiwgJnRtcCkgIT0gMSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTWFsZm9ybWVkIHN0YXRpb24gYWRkcmVzcyIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJc2Euc2FfZGF0YVtpXSA9IChjaGFyKXRtcDsKKwl9CisKKwlkZWZhdWx0X21hYyA9IHNhOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJldHJheDEwMF9ldGg9IiwgZTEwMF9ib290X3NldHVwKTsKKworbW9kdWxlX2luaXQoZXRyYXhfaW5pdF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3M4OXgwLmMgYi9kcml2ZXJzL25ldC9jczg5eDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzVmNTQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY3M4OXgwLmMKQEAgLTAsMCArMSwxODY2IEBACisvKiBjczg5eDAuYzogQSBDcnlzdGFsIFNlbWljb25kdWN0b3IgKE5vdyBDaXJydXMgTG9naWMpIENTODlbMDJdMAorICogIGRyaXZlciBmb3IgbGludXguCisgKi8KKworLyoKKwlXcml0dGVuIDE5OTYgYnkgUnVzc2VsbCBOZWxzb24sIHdpdGggcmVmZXJlbmNlIHRvIHNrZWxldG9uLmMKKwl3cml0dGVuIDE5OTMtMTk5NCBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKyAgICAgICAgVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhdCBuZWxzb25AY3J5bndyLmNvbSwgQ3J5bndyCisgICAgICAgIFNvZnR3YXJlLCA1MjEgUGxlYXNhbnQgVmFsbGV5IFJkLiwgUG90c2RhbSwgTlkgMTM2NzYKKworICBDaGFuZ2Vsb2c6CisKKyAgTWlrZSBDcnVzZSAgICAgICAgOiBtY3J1c2VAY3RpLWx0ZC5jb20KKyAgICAgICAgICAgICAgICAgICAgOiBDaGFuZ2VzIGZvciBMaW51eCAyLjAgY29tcGF0aWJpbGl0eS4gCisgICAgICAgICAgICAgICAgICAgIDogQWRkZWQgZGV2X2lkIHBhcmFtZXRlciBpbiBuZXRfaW50ZXJydXB0KCksCisgICAgICAgICAgICAgICAgICAgIDogcmVxdWVzdF9pcnEoKSBhbmQgZnJlZV9pcnEoKS4gSnVzdCBOVUxMIGZvciBub3cuCisKKyAgTWlrZSBDcnVzZSAgICAgICAgOiBBZGRlZCBNT0RfSU5DX1VTRV9DT1VOVCBhbmQgTU9EX0RFQ19VU0VfQ09VTlQgbWFjcm9zCisgICAgICAgICAgICAgICAgICAgIDogaW4gbmV0X29wZW4oKSBhbmQgbmV0X2Nsb3NlKCkgc28ga2VybmVsZCB3b3VsZCBrbm93CisgICAgICAgICAgICAgICAgICAgIDogdGhhdCB0aGUgbW9kdWxlIGlzIGluIHVzZSBhbmQgd291bGRuJ3QgZWplY3QgdGhlIAorICAgICAgICAgICAgICAgICAgICA6IGRyaXZlciBwcmVtYXR1cmVseS4KKworICBNaWtlIENydXNlICAgICAgICA6IFJld3JvdGUgaW5pdF9tb2R1bGUoKSBhbmQgY2xlYW51cF9tb2R1bGUgdXNpbmcgODM5MC5jCisgICAgICAgICAgICAgICAgICAgIDogYXMgYW4gZXhhbXBsZS4gRGlzYWJsZWQgYXV0b3Byb2JpbmcgaW4gaW5pdF9tb2R1bGUoKSwKKyAgICAgICAgICAgICAgICAgICAgOiBub3QgYSBnb29kIHRoaW5nIHRvIGRvIHRvIG90aGVyIGRldmljZXMgd2hpbGUgTGludXgKKyAgICAgICAgICAgICAgICAgICAgOiBpcyBydW5uaW5nIGZyb20gYWxsIGFjY291bnRzLgorCisgIFJ1c3MgTmVsc29uICAgICAgIDogSnVsIDEzIDE5OTguICBBZGRlZCBSeE9ubHkgRE1BIHN1cHBvcnQuCisKKyAgTWVsb2R5IExlZSAgICAgICAgOiBBdWcgMTAgMTk5OS4gIENoYW5nZXMgZm9yIExpbnV4IDIuMi41IGNvbXBhdGliaWxpdHkuIAorICAgICAgICAgICAgICAgICAgICA6IGVtYWlsOiBldGhlcm5ldEBjcnlzdGFsLmNpcnJ1cy5jb20KKworICBBbGFuIENveCAgICAgICAgICA6IFJlbW92ZWQgMS4yIHN1cHBvcnQsIGFkZGVkIDIuMSBleHRyYSBjb3VudGVycy4KKworICBBbmRyZXcgTW9ydG9uICAgICA6IGFuZHJld21AdW93LmVkdS5hdQorICAgICAgICAgICAgICAgICAgICA6IEtlcm5lbCAyLjMuNDgKKyAgICAgICAgICAgICAgICAgICAgOiBIYW5kbGUga21hbGxvYygpIGZhaWx1cmVzCisgICAgICAgICAgICAgICAgICAgIDogT3RoZXIgcmVzb3VyY2UgYWxsb2NhdGlvbiBmaXhlcworICAgICAgICAgICAgICAgICAgICA6IEFkZCBTTVAgbG9ja3MKKyAgICAgICAgICAgICAgICAgICAgOiBJbnRlZ3JhdGUgUnVzcyBOZWxzb24ncyBBTExPV19ETUEgZnVuY3Rpb25hbGl0eSBiYWNrIGluLgorICAgICAgICAgICAgICAgICAgICA6IElmIEFMTE9XX0RNQSBpcyB0cnVlLCBtYWtlIERNQSBydW50aW1lIHNlbGVjdGFibGUKKyAgICAgICAgICAgICAgICAgICAgOiBGb2xkZWQgaW4gY2hhbmdlcyBmcm9tIENpcnJ1cyAoTWVsb2R5IExlZQorICAgICAgICAgICAgICAgICAgICA6IDxrbGVlQGNyeXN0YWwuY2lycnVzLmNvbT4pCisgICAgICAgICAgICAgICAgICAgIDogRG9uJ3QgY2FsbCBuZXRpZl93YWtlX3F1ZXVlKCkgaW4gbmV0X3NlbmRfcGFja2V0KCkKKyAgICAgICAgICAgICAgICAgICAgOiBGaXhlZCBhbiBvdXQtb2YtbWVtIGJ1ZyBpbiBkbWFfcngoKQorICAgICAgICAgICAgICAgICAgICA6IFVwZGF0ZWQgRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2NzODl4MC50eHQKKworICBBbmRyZXcgTW9ydG9uICAgICA6IGFuZHJld21AdW93LmVkdS5hdSAvIEtlcm5lbCAyLjMuOTktcHJlMQorICAgICAgICAgICAgICAgICAgICA6IFVzZSBza2JfcmVzZXJ2ZSB0byBsb25nd29yZCBhbGlnbiBJUCBoZWFkZXIgKHR3byBwbGFjZXMpCisgICAgICAgICAgICAgICAgICAgIDogUmVtb3ZlIGEgZGVsYXkgbG9vcCBmcm9tIGRtYV9yeCgpCisgICAgICAgICAgICAgICAgICAgIDogUmVwbGFjZSAnMTAwJyB3aXRoIEhaCisgICAgICAgICAgICAgICAgICAgIDogQ2xlYW4gdXAgYSBjb3VwbGUgb2Ygc2tiIEFQSSBhYnVzZXMKKyAgICAgICAgICAgICAgICAgICAgOiBBZGRlZCAnY3M4OXgwX2RtYT1OJyBrZXJuZWwgYm9vdCBvcHRpb24KKyAgICAgICAgICAgICAgICAgICAgOiBDb3JyZWN0bHkgaW5pdGlhbGlzZSBscC0+bG9jayBpbiBub24tbW9kdWxlIGNvbXBpbGUKKworICBBbmRyZXcgTW9ydG9uICAgICA6IGFuZHJld21AdW93LmVkdS5hdSAvIEtlcm5lbCAyLjMuOTktcHJlNC0xCisgICAgICAgICAgICAgICAgICAgIDogTU9EX0lOQy9ERUMgcmFjZSBmaXggKHNlZQorICAgICAgICAgICAgICAgICAgICA6IGh0dHA6Ly93d3cudXdzZy5pbmRpYW5hLmVkdS9oeXBlcm1haWwvbGludXgva2VybmVsLzAwMDMuMy8xNTMyLmh0bWwpCisKKyAgQW5kcmV3IE1vcnRvbiAgICAgOiBhbmRyZXdtQHVvdy5lZHUuYXUgLyBLZXJuZWwgMi40LjAtdGVzdDctcHJlMgorICAgICAgICAgICAgICAgICAgICA6IEVuaGFuY2VkIEVFUFJPTSBzdXBwb3J0IHRvIGNvdmVyIG1vcmUgZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgOiAgIGFic3RyYWN0ZWQgSVJRIG1hcHBpbmcgdG8gc3VwcG9ydCBDT05GSUdfQVJDSF9DTFBTNzUwMCBhcmNoCisgICAgICAgICAgICAgICAgICAgIDogICAoSmFzb24gR3VudGhvcnBlIDxqZ2dAdWFsYmVydGEuY2E+KQorCisgIEFuZHJldyBNb3J0b24gICAgIDogS2VybmVsIDIuNC4wLXRlc3QxMS1wcmU0CisgICAgICAgICAgICAgICAgICAgIDogVXNlIGRldi0+bmFtZSBpbiByZXF1ZXN0XyooKSAoQW5kcmV5IFBhbmluKQorICAgICAgICAgICAgICAgICAgICA6IEZpeCBhbiBlcnJvci1wYXRoIG1lbWxlYWsgaW4gaW5pdF9tb2R1bGUoKQorICAgICAgICAgICAgICAgICAgICA6IFByZXNlcnZlIHJldHVybiB2YWx1ZSBmcm9tIHJlcXVlc3RfaXJxKCkKKyAgICAgICAgICAgICAgICAgICAgOiBGaXggdHlwZSBvZiBgbWVkaWEnIG1vZHVsZSBwYXJtIChLZWl0aCBPd2VucykKKyAgICAgICAgICAgICAgICAgICAgOiBVc2UgU0VUX01PRFVMRV9PV05FUigpCisgICAgICAgICAgICAgICAgICAgIDogVGlkaWVkIHVwIHN0cmFuZ2UgcmVxdWVzdF9pcnEoKSBhYnVzZSBpbiBuZXRfb3BlbigpLgorCisgIEFuZHJldyBNb3J0b24gICAgIDogS2VybmVsIDIuNC4zLXByZTEKKyAgICAgICAgICAgICAgICAgICAgOiBSZXF1ZXN0IGNvcnJlY3QgbnVtYmVyIG9mIHBhZ2VzIGZvciBETUEgKEh1Z2ggRGlja2VucykKKyAgICAgICAgICAgICAgICAgICAgOiBTZWxlY3QgUFBfQ2hpcElEIF9hZnRlcl8gdW5yZWdpc3Rlcl9uZXRkZXYgaW4gY2xlYW51cF9tb2R1bGUoKQorICAgICAgICAgICAgICAgICAgICA6ICBiZWNhdXNlIHVucmVnaXN0ZXJfbmV0ZGV2KCkgY2FsbHMgZ2V0X3N0YXRzLgorICAgICAgICAgICAgICAgICAgICA6IE1ha2UgYHZlcnNpb25bXScgX19pbml0ZGF0YQorICAgICAgICAgICAgICAgICAgICA6IFVuaW5saW5lZCB0aGUgcmVhZC93cml0ZSByZWcvd29yZCBmdW5jdGlvbnMuCisKKyAgT3NrYXIgU2NoaXJtZXIgICAgOiBvc2thckBzY2FyYS5jb20KKyAgICAgICAgICAgICAgICAgICAgOiBIaUNPLlNINCAoc3VwZXJoKSBzdXBwb3J0IGFkZGVkIChpcnEjMSwgY3M4OXgwX21lZGlhPSkKKworICBEZWVwYWsgU2F4ZW5hICAgICA6IGRzYXhlbmFAcGxleGl0eS5uZXQKKyAgICAgICAgICAgICAgICAgICAgOiBJbnRlbCBJWERQMngwMSAoWFNjYWxlIGl4cDJ4MDAgTlBVKSBwbGF0Zm9ybSBzdXBwb3J0CisKKyovCisKKy8qIEFsd2F5cyBpbmNsdWRlICdjb25maWcuaCcgZmlyc3QgaW4gY2FzZSB0aGUgdXNlciB3YW50cyB0byB0dXJuIG9uCisgICBvciBvdmVycmlkZSBzb21ldGhpbmcuICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKy8qCisgKiBTZXQgdGhpcyB0byB6ZXJvIHRvIGRpc2FibGUgRE1BIGNvZGUKKyAqCisgKiBOb3RlIHRoYXQgZXZlbiBpZiBETUEgaXMgdHVybmVkIG9mZiB3ZSBzdGlsbCBzdXBwb3J0IHRoZSAnZG1hJyBhbmQgICd1c2VfZG1hJworICogbW9kdWxlIG9wdGlvbnMgc28gd2UgZG9uJ3QgYnJlYWsgYW55IHN0YXJ0dXAgc2NyaXB0cy4KKyAqLworI2lmbmRlZiBDT05GSUdfQVJDSF9JWERQMlgwMQorI2RlZmluZSBBTExPV19ETUEJMAorI2Vsc2UKKyNkZWZpbmUgQUxMT1dfRE1BCTEKKyNlbmRpZgorCisvKgorICogU2V0IHRoaXMgdG8gemVybyB0byByZW1vdmUgYWxsIHRoZSBkZWJ1ZyBzdGF0ZW1lbnRzIHZpYQorICogZGVhZCBjb2RlIGVsaW1pbmF0aW9uCisgKi8KKyNkZWZpbmUgREVCVUdHSU5HCTEKKworLyoKKyAgU291cmNlczoKKworCUNyeW53ciBwYWNrZXQgZHJpdmVyIGVwa3Rpc2EuCisKKwlDcnlzdGFsIFNlbWljb25kdWN0b3IgZGF0YSBzaGVldHMuCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaWYgQUxMT1dfRE1BCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJjczg5eDAuaCIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPQorImNzODl4MC5jOiB2Mi40LjMtcHJlMSBSdXNzZWxsIE5lbHNvbiA8bmVsc29uQGNyeW53ci5jb20+LCBBbmRyZXcgTW9ydG9uIDxhbmRyZXdtQHVvdy5lZHUuYXU+XG4iOworCisjZGVmaW5lIERSVl9OQU1FICJjczg5eDAiCisKKy8qIEZpcnN0LCBhIGZldyBkZWZpbml0aW9ucyB0aGF0IHRoZSBicmF2ZSBtaWdodCBjaGFuZ2UuCisgICBBIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIEkvTyBhZGRyZXNzZXMgdG8gYmUgcHJvYmVkLiBTb21lIHNwZWNpYWwgZmxhZ3MuLgorICAgICAgQWRkciAmIDEgPSBSZWFkIGJhY2sgdGhlIGFkZHJlc3MgcG9ydCwgbG9vayBmb3Igc2lnbmF0dXJlIGFuZCByZXNldAorICAgICAgICAgICAgICAgICB0aGUgcGFnZSB3aW5kb3cgYmVmb3JlIHByb2JpbmcgCisgICAgICBBZGRyICYgMyA9IFJlc2V0IHRoZSBwYWdlIHdpbmRvdyBhbmQgcHJvYmUgCisgICBUaGUgQ0xQUyBldmFsIGJvYXJkIGhhcyB0aGUgQ2lycnVzIGNoaXAgYXQgMHg4MDA5MDMwMCwgaW4gQVJNIElPIHNwYWNlLAorICAgYnV0IGl0IGlzIHBvc3NpYmxlIHRoYXQgYSBDaXJydXMgYm9hcmQgY291bGQgYmUgcGx1Z2dlZCBpbnRvIHRoZSBJU0EKKyAgIHNsb3RzLiAqLworLyogVGhlIGNzODkwMCBoYXMgNCBJUlEgcGlucywgc29mdHdhcmUgc2VsZWN0YWJsZS4gY3M4OTAwX2lycV9tYXAgbWFwcyAKKyAgIHRoZW0gdG8gc3lzdGVtIElSUSBudW1iZXJzLiBUaGlzIG1hcHBpbmcgaXMgY2FyZCBzcGVjaWZpYyBhbmQgaXMgc2V0IHRvCisgICB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgQ2lycnVzIEV2YWwgYm9hcmQgZm9yIHRoaXMgY2hpcC4gKi8KKyNpZmRlZiBDT05GSUdfQVJDSF9DTFBTNzUwMAorc3RhdGljIHVuc2lnbmVkIGludCBuZXRjYXJkX3BvcnRsaXN0W10gX19pbml0ZGF0YSA9CisgICB7IDB4ODAwOTAzMDMsIDB4MzAwLCAweDMyMCwgMHgzNDAsIDB4MzYwLCAweDIwMCwgMHgyMjAsIDB4MjQwLCAweDI2MCwgMHgyODAsIDB4MmEwLCAweDJjMCwgMHgyZTAsIDB9Oworc3RhdGljIHVuc2lnbmVkIGludCBjczg5MDBfaXJxX21hcFtdID0gezEyLDAsMCwwfTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NIX0hJQ09TSDQpCitzdGF0aWMgdW5zaWduZWQgaW50IG5ldGNhcmRfcG9ydGxpc3RbXSBfX2luaXRkYXRhID0KKyAgIHsgMHgwMzAwLCAwfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3M4OTAwX2lycV9tYXBbXSA9IHsxLDAsMCwwfTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfSVhEUDJYMDEpCisjaW5jbHVkZSA8YXNtL2lycS5oPgorc3RhdGljIHVuc2lnbmVkIGludCBuZXRjYXJkX3BvcnRsaXN0W10gX19pbml0ZGF0YSA9IHtJWERQMlgwMV9DUzg5MDBfVklSVF9CQVNFLCAwfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3M4OTAwX2lycV9tYXBbXSA9IHtJUlFfSVhEUDJYMDFfQ1M4OTAwLCAwLCAwLCAwfTsKKyNlbHNlCitzdGF0aWMgdW5zaWduZWQgaW50IG5ldGNhcmRfcG9ydGxpc3RbXSBfX2luaXRkYXRhID0KKyAgIHsgMHgzMDAsIDB4MzIwLCAweDM0MCwgMHgzNjAsIDB4MjAwLCAweDIyMCwgMHgyNDAsIDB4MjYwLCAweDI4MCwgMHgyYTAsIDB4MmMwLCAweDJlMCwgMH07CitzdGF0aWMgdW5zaWduZWQgaW50IGNzODkwMF9pcnFfbWFwW10gPSB7MTAsMTEsMTIsNX07CisjZW5kaWYKKworI2lmIERFQlVHR0lORworc3RhdGljIHVuc2lnbmVkIGludCBuZXRfZGVidWcgPSBERUJVR0dJTkc7CisjZWxzZQorI2RlZmluZSBuZXRfZGVidWcgMAkvKiBnY2Mgd2lsbCByZW1vdmUgYWxsIHRoZSBkZWJ1ZyBjb2RlIGZvciB1cyAqLworI2VuZGlmCisKKy8qIFRoZSBudW1iZXIgb2YgbG93IEkvTyBwb3J0cyB1c2VkIGJ5IHRoZSBldGhlcmNhcmQuICovCisjZGVmaW5lIE5FVENBUkRfSU9fRVhURU5UCTE2CisKKy8qIHdlIGFsbG93IHRoZSB1c2VyIHRvIG92ZXJyaWRlIHZhcmlvdXMgdmFsdWVzIG5vcm1hbGx5IHNldCBpbiB0aGUgRUVQUk9NICovCisjZGVmaW5lIEZPUkNFX1JKNDUJMHgwMDAxICAgIC8qIHBpY2sgb25lIG9mIHRoZXNlIHRocmVlICovCisjZGVmaW5lIEZPUkNFX0FVSQkweDAwMDIKKyNkZWZpbmUgRk9SQ0VfQk5DCTB4MDAwNAorCisjZGVmaW5lIEZPUkNFX0FVVE8JMHgwMDEwICAgIC8qIHBpY2sgb25lIG9mIHRoZXNlIHRocmVlICovCisjZGVmaW5lIEZPUkNFX0hBTEYJMHgwMDIwCisjZGVmaW5lIEZPUkNFX0ZVTEwJMHgwMDMwCisKKy8qIEluZm9ybWF0aW9uIHRoYXQgbmVlZCB0byBiZSBrZXB0IGZvciBlYWNoIGJvYXJkLiAqLworc3RydWN0IG5ldF9sb2NhbCB7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJaW50IGNoaXBfdHlwZTsJCS8qIG9uZSBvZjogQ1M4OTAwLCBDUzg5MjAsIENTODkyME0gKi8KKwljaGFyIGNoaXBfcmV2aXNpb247CS8qIHJldmlzaW9uIGxldHRlciBvZiB0aGUgY2hpcCAoJ0EnLi4uKSAqLworCWludCBzZW5kX2NtZDsJCS8qIHRoZSBwcm9wZXIgc2VuZCBjb21tYW5kOiBUWF9OT1csIFRYX0FGVEVSXzM4MSwgb3IgVFhfQUZURVJfQUxMICovCisJaW50IGF1dG9fbmVnX2NuZjsJLyogYXV0by1uZWdvdGlhdGlvbiB3b3JkIGZyb20gRUVQUk9NICovCisJaW50IGFkYXB0ZXJfY25mOwkvKiBhZGFwdGVyIGNvbmZpZ3VyYXRpb24gZnJvbSBFRVBST00gKi8KKwlpbnQgaXNhX2NvbmZpZzsJCS8qIElTQSBjb25maWd1cmF0aW9uIGZyb20gRUVQUk9NICovCisJaW50IGlycV9tYXA7CQkvKiBJUlEgbWFwIGZyb20gRUVQUk9NICovCisJaW50IHJ4X21vZGU7CQkvKiB3aGF0IG1vZGUgYXJlIHdlIGluPyAwLCBSWF9NVUxUQ0FTVF9BQ0NFUFQsIG9yIFJYX0FMTF9BQ0NFUFQgKi8KKwlpbnQgY3Vycl9yeF9jZmc7CS8qIGEgY29weSBvZiBQUF9SeENGRyAqLworCWludCBsaW5lY3RsOwkJLyogZWl0aGVyIDAgb3IgTE9XX1JYX1NRVUVMQ0gsIGRlcGVuZGluZyBvbiBjb25maWd1cmF0aW9uLiAqLworCWludCBzZW5kX3VuZGVycnVuOwkvKiBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IHVuZGVycnVucyBpbiBhIHJvdyB3ZSBnZXQgKi8KKwlpbnQgZm9yY2U7CQkvKiBmb3JjZSB2YXJpb3VzIHZhbHVlczsgc2VlIEZPUkNFKiBhYm92ZS4gKi8KKwlzcGlubG9ja190IGxvY2s7CisjaWYgQUxMT1dfRE1BCisJaW50IHVzZV9kbWE7CQkvKiBGbGFnOiB3ZSdyZSB1c2luZyBkbWEgKi8KKwlpbnQgZG1hOwkJLyogRE1BIGNoYW5uZWwgKi8KKwlpbnQgZG1hc2l6ZTsJCS8qIDE2IG9yIDY0ICovCisJdW5zaWduZWQgY2hhciAqZG1hX2J1ZmY7CS8qIHBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgKi8KKwl1bnNpZ25lZCBjaGFyICplbmRfZG1hX2J1ZmY7CS8qIHBvaW50cyB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KKwl1bnNpZ25lZCBjaGFyICpyeF9kbWFfcHRyOwkvKiBwb2ludHMgdG8gdGhlIG5leHQgcGFja2V0ICAqLworI2VuZGlmCit9OworCisvKiBJbmRleCB0byBmdW5jdGlvbnMsIGFzIGZ1bmN0aW9uIHByb3RvdHlwZXMuICovCisKK3N0YXRpYyBpbnQgY3M4OXgwX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyLCBpbnQgbW9kdWxhcik7CitzdGF0aWMgaW50IG5ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBuZXRfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgbmV0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG5ldF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbmV0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBuZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCByZXNldF9jaGlwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBnZXRfZWVwcm9tX2RhdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG9mZiwgaW50IGxlbiwgaW50ICpidWZmZXIpOworc3RhdGljIGludCBnZXRfZWVwcm9tX2Nrc3VtKGludCBvZmYsIGludCBsZW4sIGludCAqYnVmZmVyKTsKK3N0YXRpYyBpbnQgc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpOworc3RhdGljIHZvaWQgY291bnRfcnhfZXJyb3JzKGludCBzdGF0dXMsIHN0cnVjdCBuZXRfbG9jYWwgKmxwKTsKKyNpZiBBTExPV19ETUEKK3N0YXRpYyB2b2lkIGdldF9kbWFfY2hhbm5lbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJlbGVhc2VfZG1hX2J1ZmYoc3RydWN0IG5ldF9sb2NhbCAqbHApOworI2VuZGlmCisKKy8qIEV4YW1wbGUgcm91dGluZXMgeW91IG11c3Qgd3JpdGUgOy0+LiAqLworI2RlZmluZSB0eF9kb25lKGRldikgMQorCisvKgorICogUGVybWl0ICdjczg5eDBfZG1hPU4nIGluIHRoZSBrZXJuZWwgYm9vdCBlbnZpcm9ubWVudAorICovCisjaWYgIWRlZmluZWQoTU9EVUxFKSAmJiAoQUxMT1dfRE1BICE9IDApCitzdGF0aWMgaW50IGdfY3M4OXgwX2RtYTsKKworc3RhdGljIGludCBfX2luaXQgZG1hX2ZuKGNoYXIgKnN0cikKK3sKKwlnX2NzODl4MF9kbWEgPSBzaW1wbGVfc3RydG9sKHN0cixOVUxMLDApOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJjczg5eDBfZG1hPSIsIGRtYV9mbik7CisjZW5kaWYJLyogIWRlZmluZWQoTU9EVUxFKSAmJiAoQUxMT1dfRE1BICE9IDApICovCisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IGdfY3M4OXgwX21lZGlhX19mb3JjZTsKKworc3RhdGljIGludCBfX2luaXQgbWVkaWFfZm4oY2hhciAqc3RyKQoreworCWlmICghc3RyY21wKHN0ciwgInJqNDUiKSkgZ19jczg5eDBfbWVkaWFfX2ZvcmNlID0gRk9SQ0VfUko0NTsKKwllbHNlIGlmICghc3RyY21wKHN0ciwgImF1aSIpKSBnX2NzODl4MF9tZWRpYV9fZm9yY2UgPSBGT1JDRV9BVUk7CisJZWxzZSBpZiAoIXN0cmNtcChzdHIsICJibmMiKSkgZ19jczg5eDBfbWVkaWFfX2ZvcmNlID0gRk9SQ0VfQk5DOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJjczg5eDBfbWVkaWE9IiwgbWVkaWFfZm4pOworCisMCisvKiBDaGVjayBmb3IgYSBuZXR3b3JrIGFkYXB0b3Igb2YgdGhpcyB0eXBlLCBhbmQgcmV0dXJuICcwJyBpZmYgb25lIGV4aXN0cy4KKyAgIElmIGRldi0+YmFzZV9hZGRyID09IDAsIHByb2JlIGFsbCBsaWtlbHkgbG9jYXRpb25zLgorICAgSWYgZGV2LT5iYXNlX2FkZHIgPT0gMSwgYWx3YXlzIHJldHVybiBmYWlsdXJlLgorICAgSWYgZGV2LT5iYXNlX2FkZHIgPT0gMiwgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBkZXZpY2UgYW5kIHJldHVybiBzdWNjZXNzCisgICAoZGV0YWNoYWJsZSBkZXZpY2VzIG9ubHkpLgorICAgUmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAgICovCisKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGNzODl4MF9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwl1bnNpZ25lZCAqcG9ydDsKKwlpbnQgZXJyID0gMDsKKwlpbnQgaXJxOworCWludCBpbzsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCWlvID0gZGV2LT5iYXNlX2FkZHI7CisJaXJxID0gZGV2LT5pcnE7CisKKwlpZiAobmV0X2RlYnVnKQorCQlwcmludGsoImNzODl4MDpjczg5eDBfcHJvYmUoMHgleClcbiIsIGlvKTsKKworCWlmIChpbyA+IDB4MWZmKQl7CS8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KKwkJZXJyID0gY3M4OXgwX3Byb2JlMShkZXYsIGlvLCAwKTsKKwl9IGVsc2UgaWYgKGlvICE9IDApIHsJLyogRG9uJ3QgcHJvYmUgYXQgYWxsLiAqLworCQllcnIgPSAtRU5YSU87CisJfSBlbHNlIHsKKwkJZm9yIChwb3J0ID0gbmV0Y2FyZF9wb3J0bGlzdDsgKnBvcnQ7IHBvcnQrKykgeworCQkJaWYgKGNzODl4MF9wcm9iZTEoZGV2LCAqcG9ydCwgMCkgPT0gMCkKKwkJCQlicmVhazsKKwkJCWRldi0+aXJxID0gaXJxOworCQl9CisJCWlmICghKnBvcnQpCisJCQllcnIgPSAtRU5PREVWOworCX0KKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJb3V0dyhQUF9DaGlwSUQsIGRldi0+YmFzZV9hZGRyICsgQUREX1BPUlQpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBORVRDQVJEX0lPX0VYVEVOVCk7CitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJjczg5eDA6IG5vIGNzODkwMCBvciBjczg5MjAgZGV0ZWN0ZWQuICBCZSBzdXJlIHRvIGRpc2FibGUgUG5QIHdpdGggU0VUVVBcbiIpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorcmVhZHJlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcG9ydG5vKQoreworCW91dHcocG9ydG5vLCBkZXYtPmJhc2VfYWRkciArIEFERF9QT1JUKTsKKwlyZXR1cm4gaW53KGRldi0+YmFzZV9hZGRyICsgREFUQV9QT1JUKTsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwb3J0bm8sIGludCB2YWx1ZSkKK3sKKwlvdXR3KHBvcnRubywgZGV2LT5iYXNlX2FkZHIgKyBBRERfUE9SVCk7CisJb3V0dyh2YWx1ZSwgZGV2LT5iYXNlX2FkZHIgKyBEQVRBX1BPUlQpOworfQorCitzdGF0aWMgaW50CityZWFkd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcG9ydG5vKQoreworCXJldHVybiBpbncoZGV2LT5iYXNlX2FkZHIgKyBwb3J0bm8pOworfQorCitzdGF0aWMgdm9pZAord3JpdGV3b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwb3J0bm8sIGludCB2YWx1ZSkKK3sKKwlvdXR3KHZhbHVlLCBkZXYtPmJhc2VfYWRkciArIHBvcnRubyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0Cit3YWl0X2VlcHJvbV9yZWFkeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCB0aW1lb3V0ID0gamlmZmllczsKKwkvKiBjaGVjayB0byBzZWUgaWYgdGhlIEVFUFJPTSBpcyByZWFkeSwgYSB0aW1lb3V0IGlzIHVzZWQgLQorCSAgIGp1c3QgaW4gY2FzZSBFRVBST00gaXMgcmVhZHkgd2hlbiBTSV9CVVNZIGluIHRoZQorCSAgIFBQX1NlbGZTVCBpcyBjbGVhciAqLworCXdoaWxlKHJlYWRyZWcoZGV2LCBQUF9TZWxmU1QpICYgU0lfQlVTWSkKKwkJaWYgKGppZmZpZXMgLSB0aW1lb3V0ID49IDQwKQorCQkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdAorZ2V0X2VlcHJvbV9kYXRhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBvZmYsIGludCBsZW4sIGludCAqYnVmZmVyKQoreworCWludCBpOworCisJaWYgKG5ldF9kZWJ1ZyA+IDMpIHByaW50aygiRUVQUk9NIGRhdGEgZnJvbSAleCBmb3IgJXg6XG4iLG9mZixsZW4pOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAod2FpdF9lZXByb21fcmVhZHkoZGV2KSA8IDApIHJldHVybiAtMTsKKwkJLyogTm93IHNlbmQgdGhlIEVFUFJPTSByZWFkIGNvbW1hbmQgYW5kIEVFUFJPTSBsb2NhdGlvbiB0byByZWFkICovCisJCXdyaXRlcmVnKGRldiwgUFBfRUVDTUQsIChvZmYgKyBpKSB8IEVFUFJPTV9SRUFEX0NNRCk7CisJCWlmICh3YWl0X2VlcHJvbV9yZWFkeShkZXYpIDwgMCkgcmV0dXJuIC0xOworCQlidWZmZXJbaV0gPSByZWFkcmVnKGRldiwgUFBfRUVEYXRhKTsKKwkJaWYgKG5ldF9kZWJ1ZyA+IDMpIHByaW50aygiJTA0eCAiLCBidWZmZXJbaV0pOworCX0KKwlpZiAobmV0X2RlYnVnID4gMykgcHJpbnRrKCJcbiIpOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCAgX19pbml0CitnZXRfZWVwcm9tX2Nrc3VtKGludCBvZmYsIGludCBsZW4sIGludCAqYnVmZmVyKQoreworCWludCBpLCBja3N1bTsKKworCWNrc3VtID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCWNrc3VtICs9IGJ1ZmZlcltpXTsKKwlja3N1bSAmPSAweGZmZmY7CisJaWYgKGNrc3VtID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtMTsKK30KKworLyogVGhpcyBpcyB0aGUgcmVhbCBwcm9iZSByb3V0aW5lLiAgTGludXggaGFzIGEgaGlzdG9yeSBvZiBmcmllbmRseSBkZXZpY2UKKyAgIHByb2JlcyBvbiB0aGUgSVNBIGJ1cy4gIEEgZ29vZCBkZXZpY2UgcHJvYmVzIGF2b2lkcyBkb2luZyB3cml0ZXMsIGFuZAorICAgdmVyaWZpZXMgdGhhdCB0aGUgY29ycmVjdCBkZXZpY2UgZXhpc3RzIGFuZCBmdW5jdGlvbnMuCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0Citjczg5eDBfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIsIGludCBtb2R1bGFyKQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCWludCBpOworCXVuc2lnbmVkIHJldl90eXBlID0gMDsKKwlpbnQgZWVwcm9tX2J1ZmZbQ0hLU1VNX0xFTl07CisJaW50IHJldHZhbDsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwkvKiBJbml0aWFsaXplIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWlmICghbW9kdWxhcikgeworCQltZW1zZXQobHAsIDAsIHNpemVvZigqbHApKTsKKwkJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKyNpZm5kZWYgTU9EVUxFCisjaWYgQUxMT1dfRE1BCisJCWlmIChnX2NzODl4MF9kbWEpIHsKKwkJCWxwLT51c2VfZG1hID0gMTsKKwkJCWxwLT5kbWEgPSBnX2NzODl4MF9kbWE7CisJCQlscC0+ZG1hc2l6ZSA9IDE2OwkvKiBDb3VsZCBtYWtlIHRoaXMgYW4gb3B0aW9uLi4uICovCisJCX0KKyNlbmRpZgorCQlscC0+Zm9yY2UgPSBnX2NzODl4MF9tZWRpYV9fZm9yY2U7CisjZW5kaWYKKyAgICAgICAgfQorCisJLyogR3JhYiB0aGUgcmVnaW9uIHNvIHdlIGNhbiBmaW5kIGFub3RoZXIgYm9hcmQgaWYgYXV0b0lSUSBmYWlscy4gKi8KKwkvKiBXVEYgaXMgZ29pbmcgb24gaGVyZT8gKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciAmIH4zLCBORVRDQVJEX0lPX0VYVEVOVCwgRFJWX05BTUUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlcXVlc3RfcmVnaW9uKDB4JXgsIDB4JXgpIGZhaWxlZFxuIiwKKwkJCQlEUlZfTkFNRSwgaW9hZGRyLCBORVRDQVJEX0lPX0VYVEVOVCk7CisJCXJldHZhbCA9IC1FQlVTWTsKKwkJZ290byBvdXQxOworCX0KKworI2lmZGVmIENPTkZJR19TSF9ISUNPU0g0CisJLyogdHJ1ZWx5IHJlc2V0IHRoZSBjaGlwICovCisJb3V0dygweDAxMTQsIGlvYWRkciArIEFERF9QT1JUKTsKKwlvdXR3KDB4MDA0MCwgaW9hZGRyICsgREFUQV9QT1JUKTsKKyNlbmRpZgorCisJLyogaWYgdGhleSBnaXZlIHVzIGFuIG9kZCBJL08gYWRkcmVzcywgdGhlbiBkbyBPTkUgd3JpdGUgdG8KKyAgICAgICAgICAgdGhlIGFkZHJlc3MgcG9ydCwgdG8gZ2V0IGl0IGJhY2sgdG8gYWRkcmVzcyB6ZXJvLCB3aGVyZSB3ZQorICAgICAgICAgICBleHBlY3QgdG8gZmluZCB0aGUgRUlTQSBzaWduYXR1cmUgd29yZC4gQW4gSU8gd2l0aCBhIGJhc2Ugb2YgMHgzCisJICAgd2lsbCBza2lwIHRoZSB0ZXN0IGZvciB0aGUgQUREX1BPUlQuICovCisJaWYgKGlvYWRkciAmIDEpIHsKKwkJaWYgKG5ldF9kZWJ1ZyA+IDEpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogb2RkIGlvYWRkciAweCV4XG4iLCBkZXYtPm5hbWUsIGlvYWRkcik7CisJICAgICAgICBpZiAoKGlvYWRkciAmIDIpICE9IDIpCisJICAgICAgICAJaWYgKChpbncoKGlvYWRkciAmIH4zKSsgQUREX1BPUlQpICYgQUREX01BU0spICE9IEFERF9TSUcpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBiYWQgc2lnbmF0dXJlIDB4JXhcbiIsCisJCQkJCWRldi0+bmFtZSwgaW53KChpb2FkZHIgJiB+MykrIEFERF9QT1JUKSk7CisJCSAgICAgICAgCXJldHZhbCA9IC1FTk9ERVY7CisJCQkJZ290byBvdXQyOworCQkJfQorCX0KK3ByaW50aygiUFBfYWRkcj0weCV4XG4iLCBpbncoaW9hZGRyICsgQUREX1BPUlQpKTsKKworCWlvYWRkciAmPSB+MzsKKwlvdXR3KFBQX0NoaXBJRCwgaW9hZGRyICsgQUREX1BPUlQpOworCisJaWYgKGludyhpb2FkZHIgKyBEQVRBX1BPUlQpICE9IENISVBfRUlTQV9JRF9TSUcpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaW5jb3JyZWN0IHNpZ25hdHVyZSAweCV4XG4iLAorCQkJZGV2LT5uYW1lLCBpbncoaW9hZGRyICsgREFUQV9QT1JUKSk7CisgIAkJcmV0dmFsID0gLUVOT0RFVjsKKyAgCQlnb3RvIG91dDI7CisJfQorCisJLyogRmlsbCBpbiB0aGUgJ2RldicgZmllbGRzLiAqLworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCisJLyogZ2V0IHRoZSBjaGlwIHR5cGUgKi8KKwlyZXZfdHlwZSA9IHJlYWRyZWcoZGV2LCBQUk9EVUNUX0lEX0FERCk7CisJbHAtPmNoaXBfdHlwZSA9IHJldl90eXBlICZ+IFJFVklTT05fQklUUzsKKwlscC0+Y2hpcF9yZXZpc2lvbiA9ICgocmV2X3R5cGUgJiBSRVZJU09OX0JJVFMpID4+IDgpICsgJ0EnOworCisJLyogQ2hlY2sgdGhlIGNoaXAgdHlwZSBhbmQgcmV2aXNpb24gaW4gb3JkZXIgdG8gc2V0IHRoZSBjb3JyZWN0IHNlbmQgY29tbWFuZAorCUNTODkyMCByZXZpc2lvbiBDIGFuZCBDUzg5MDAgcmV2aXNpb24gRiBjYW4gdXNlIHRoZSBmYXN0ZXIgc2VuZC4gKi8KKwlscC0+c2VuZF9jbWQgPSBUWF9BRlRFUl8zODE7CisJaWYgKGxwLT5jaGlwX3R5cGUgPT0gQ1M4OTAwICYmIGxwLT5jaGlwX3JldmlzaW9uID49ICdGJykKKwkJbHAtPnNlbmRfY21kID0gVFhfTk9XOworCWlmIChscC0+Y2hpcF90eXBlICE9IENTODkwMCAmJiBscC0+Y2hpcF9yZXZpc2lvbiA+PSAnQycpCisJCWxwLT5zZW5kX2NtZCA9IFRYX05PVzsKKworCWlmIChuZXRfZGVidWcgICYmICB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsodmVyc2lvbik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogY3M4OSVjMCVzIHJldiAlYyBmb3VuZCBhdCAlIzNseCAiLAorCSAgICAgICBkZXYtPm5hbWUsCisJICAgICAgIGxwLT5jaGlwX3R5cGU9PUNTODkwMD8nMCc6JzInLAorCSAgICAgICBscC0+Y2hpcF90eXBlPT1DUzg5MjBNPyJNIjoiIiwKKwkgICAgICAgbHAtPmNoaXBfcmV2aXNpb24sCisJICAgICAgIGRldi0+YmFzZV9hZGRyKTsKKworCXJlc2V0X2NoaXAoZGV2KTsKKyAgIAorICAgICAgICAvKiBIZXJlIHdlIHJlYWQgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiB0aGUgY2hpcC4gSWYgdGhlcmUKKwkgICBpcyBubyBFeHRlbmRlZCBFRVBST00gdGhlbiB0aGUgaWRlYSBpcyB0byBub3QgZGlzdHVyYiB0aGUgY2hpcAorCSAgIGNvbmZpZ3VyYXRpb24sIGl0IHNob3VsZCBoYXZlIGJlZW4gY29ycmVjdGx5IHNldHVwIGJ5IGF1dG9tYXRpYworCSAgIEVFUFJPTSByZWFkIG9uIHJlc2V0LiBTbywgaWYgdGhlIGNoaXAgc2F5cyBpdCByZWFkIHRoZSBFRVBST00KKwkgICB0aGUgZHJpdmVyIHdpbGwgYWx3YXlzIGRvICpzb21ldGhpbmcqIGluc3RlYWQgb2YgY29tcGxhaW4gdGhhdAorCSAgIGFkYXB0ZXJfY25mIGlzIDAuICovCisKKyNpZmRlZiBDT05GSUdfU0hfSElDT1NINAorCWlmICgxKSB7CisJCS8qIEZvciB0aGUgSGlDTy5TSDQgYm9hcmQsIHRoaW5ncyBhcmUgZGlmZmVyZW50OiB3ZSBkb24ndAorCQkgICBoYXZlIEVFUFJPTSwgYnV0IHRoZXJlIGlzIHNvbWUgZGF0YSBpbiBmbGFzaCwgc28gd2UgZ28KKwkJICAgZ2V0IGl0IHRoZXJlIGRpcmVjdGx5IChNQUMpLiAqLworCQlfX3UxNiAqY29uZmQ7CisJCXNob3J0IGNudDsKKwkJaWYgKCgoKiAodm9sYXRpbGUgX191MzIgKikgMHhhMDAxM2ZmMCkgJiAweDAwZmZmZmZmKQorCQkJPT0gMHgwMDZjMzAwMCkgeworCQkJY29uZmQgPSAoX191MTYqKSAweGEwMDEzZmMwOworCQl9IGVsc2UgeworCQkJY29uZmQgPSAoX191MTYqKSAweGEwMDFmZmMwOworCQl9CisJCWNudCA9ICgqY29uZmQrKyAmIDB4MDBmZikgPj4gMTsKKwkJd2hpbGUgKC0tY250ID4gMCkgeworCQkJX191MTYgaiA9ICpjb25mZCsrOworCQkJCisJCQlzd2l0Y2ggKGogJiAweDBmZmYpIHsKKwkJCWNhc2UgUFBfSUE6CisJCQkJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOLzI7IGkrKykgeworCQkJCQlkZXYtPmRldl9hZGRyW2kqMl0gPSBjb25mZFtpXSAmIDB4RkY7CisJCQkJCWRldi0+ZGV2X2FkZHJbaSoyKzFdID0gY29uZmRbaV0gPj4gODsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlqID0gKGogPj4gMTIpICsgMTsKKwkJCWNvbmZkICs9IGo7CisJCQljbnQgLT0gajsKKwkJfQorCX0gZWxzZQorI2VuZGlmCisKKyAgICAgICAgaWYgKChyZWFkcmVnKGRldiwgUFBfU2VsZlNUKSAmIChFRVBST01fT0sgfCBFRVBST01fUFJFU0VOVCkpID09IAorCSAgICAgIChFRVBST01fT0t8RUVQUk9NX1BSRVNFTlQpKSB7CisJICAgICAgICAvKiBMb2FkIHRoZSBNQUMuICovCisJCWZvciAoaT0wOyBpIDwgRVRIX0FMRU4vMjsgaSsrKSB7CisJICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBBZGRyOworCQkJQWRkciA9IHJlYWRyZWcoZGV2LCBQUF9JQStpKjIpOworCQkgICAgICAgIGRldi0+ZGV2X2FkZHJbaSoyXSA9IEFkZHIgJiAweEZGOworCQkgICAgICAgIGRldi0+ZGV2X2FkZHJbaSoyKzFdID0gQWRkciA+PiA4OworCQl9CisgICAKKwkgICAJLyogTG9hZCB0aGUgQWRhcHRlciBDb25maWd1cmF0aW9uLiAKKwkJICAgTm90ZTogIEJhcnJpbmcgYW55IG1vcmUgc3BlY2lmaWMgaW5mb3JtYXRpb24gZnJvbSBzb21lIAorCQkgICBvdGhlciBzb3VyY2UgKGllIEVFUFJPTStTY2hlbWF0aWNzKSwgd2Ugd291bGQgbm90IGtub3cgCisJCSAgIGhvdyB0byBvcGVyYXRlIGEgMTBCYXNlMiBpbnRlcmZhY2Ugb24gdGhlIEFVSSBwb3J0LiAKKwkJICAgSG93ZXZlciwgc2luY2Ugd2UgIGRvIHJlYWQgdGhlIHN0YXR1cyBvZiBIQ0IxIGFuZCB1c2UgCisJCSAgIHNldHRpbmdzIHRoYXQgYWx3YXlzIHJlc3VsdCBpbiBjYWxscyB0byBjb250cm9sX2RjX2RjKGRldiwwKSAKKwkJICAgYSBCTkMgaW50ZXJmYWNlIHNob3VsZCB3b3JrIGlmIHRoZSBlbmFibGUgcGluIAorCQkgICAoZGMvZGMgY29udmVydGVyKSBpcyBvbiBIQ0IxLiBJdCB3aWxsIGJlIGNhbGxlZCBBVUkgCisJCSAgIGhvd2V2ZXIuICovCisJICAgCisJCWxwLT5hZGFwdGVyX2NuZiA9IDA7CisJCWkgPSByZWFkcmVnKGRldiwgUFBfTGluZUNUTCk7CisJCS8qIFByZXNlcnZlIHRoZSBzZXR0aW5nIG9mIHRoZSBIQ0IxIHBpbi4gKi8KKwkJaWYgKChpICYgKEhDQjEgfCBIQ0IxX0VOQkwpKSA9PSAgKEhDQjEgfCBIQ0IxX0VOQkwpKQorCQkJbHAtPmFkYXB0ZXJfY25mIHw9IEFfQ05GX0RDX0RDX1BPTEFSSVRZOworCQkvKiBTYXZlIHRoZSBzcWVsY2ggYml0ICovCisJCWlmICgoaSAmIExPV19SWF9TUVVFTENIKSA9PSBMT1dfUlhfU1FVRUxDSCkKKwkJCWxwLT5hZGFwdGVyX2NuZiB8PSBBX0NORl9FWFRORF8xMEJfMiB8IEFfQ05GX0xPV19SWF9TUVVFTENIOworCQkvKiBDaGVjayBpZiB0aGUgY2FyZCBpcyBpbiAxMEJhc2UtdCBvbmx5IG1vZGUgKi8KKwkJaWYgKChpICYgKEFVSV9PTkxZIHwgQVVUT19BVUlfMTBCQVNFVCkpID09IDApCisJCQlscC0+YWRhcHRlcl9jbmYgfD0gIEFfQ05GXzEwQl9UIHwgQV9DTkZfTUVESUFfMTBCX1Q7CisJCS8qIENoZWNrIGlmIHRoZSBjYXJkIGlzIGluIEFVSSBvbmx5IG1vZGUgKi8KKwkJaWYgKChpICYgKEFVSV9PTkxZIHwgQVVUT19BVUlfMTBCQVNFVCkpID09IEFVSV9PTkxZKQorCQkJbHAtPmFkYXB0ZXJfY25mIHw9ICBBX0NORl9BVUkgfCBBX0NORl9NRURJQV9BVUk7CisJCS8qIENoZWNrIGlmIHRoZSBjYXJkIGlzIGluIEF1dG8gbW9kZS4gKi8KKwkJaWYgKChpICYgKEFVSV9PTkxZIHwgQVVUT19BVUlfMTBCQVNFVCkpID09IEFVVE9fQVVJXzEwQkFTRVQpCisJCQlscC0+YWRhcHRlcl9jbmYgfD0gIEFfQ05GX0FVSSB8IEFfQ05GXzEwQl9UIHwgCisJCQlBX0NORl9NRURJQV9BVUkgfCBBX0NORl9NRURJQV8xMEJfVCB8IEFfQ05GX01FRElBX0FVVE87CisJCQorCQlpZiAobmV0X2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQUF9MaW5lQ1RMPTB4JXgsIGFkYXB0ZXJfY25mPTB4JXhcbiIsCisJCQkJCWRldi0+bmFtZSwgaSwgbHAtPmFkYXB0ZXJfY25mKTsKKworCQkvKiBJUlEuIE90aGVyIGNoaXBzIGFscmVhZHkgcHJvYmUsIHNlZSBiZWxvdy4gKi8KKwkJaWYgKGxwLT5jaGlwX3R5cGUgPT0gQ1M4OTAwKSAKKwkJCWxwLT5pc2FfY29uZmlnID0gcmVhZHJlZyhkZXYsIFBQX0NTODkwMF9JU0FJTlQpICYgSU5UX05PX01BU0s7CisJICAgCisJCXByaW50ayggIltDaXJydXMgRUVQUk9NXSAiKTsKKwl9CisKKyAgICAgICAgcHJpbnRrKCJcbiIpOworICAgCisJLyogRmlyc3QgY2hlY2sgdG8gc2VlIGlmIGFuIEVFUFJPTSBpcyBhdHRhY2hlZC4gKi8KKyNpZmRlZiBDT05GSUdfU0hfSElDT1NINCAvKiBubyBFRVBST00gb24gSGlDTywgZG9uJ3QgaGF6emxlIHdpdGggaXQgaGVyZSAqLworCWlmICgxKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiY3M4OXgwOiBObyBFRVBST00gb24gSGlDTy5TSDRcbiIpOworCX0gZWxzZQorI2VuZGlmCisJaWYgKChyZWFkcmVnKGRldiwgUFBfU2VsZlNUKSAmIEVFUFJPTV9QUkVTRU5UKSA9PSAwKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJjczg5eDA6IE5vIEVFUFJPTSwgcmVseWluZyBvbiBjb21tYW5kIGxpbmUuLi4uXG4iKTsKKwllbHNlIGlmIChnZXRfZWVwcm9tX2RhdGEoZGV2LCBTVEFSVF9FRVBST01fREFUQSxDSEtTVU1fTEVOLGVlcHJvbV9idWZmKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiXG5jczg5eDA6IEVFUFJPTSByZWFkIGZhaWxlZCwgcmVseWluZyBvbiBjb21tYW5kIGxpbmUuXG4iKTsKKyAgICAgICAgfSBlbHNlIGlmIChnZXRfZWVwcm9tX2Nrc3VtKFNUQVJUX0VFUFJPTV9EQVRBLENIS1NVTV9MRU4sZWVwcm9tX2J1ZmYpIDwgMCkgeworCQkvKiBDaGVjayBpZiB0aGUgY2hpcCB3YXMgYWJsZSB0byByZWFkIGl0cyBvd24gY29uZmlndXJhdGlvbiBzdGFydGluZworCQkgICBhdCAwIGluIHRoZSBFRVBST00qLworCQlpZiAoKHJlYWRyZWcoZGV2LCBQUF9TZWxmU1QpICYgKEVFUFJPTV9PSyB8IEVFUFJPTV9QUkVTRU5UKSkgIT0KKwkJICAgIChFRVBST01fT0t8RUVQUk9NX1BSRVNFTlQpKSAKKyAgICAgICAgICAgICAgICAJcHJpbnRrKEtFUk5fV0FSTklORyAiY3M4OXgwOiBFeHRlbmRlZCBFRVBST00gY2hlY2tzdW0gYmFkIGFuZCBubyBDaXJydXMgRUVQUk9NLCByZWx5aW5nIG9uIGNvbW1hbmQgbGluZVxuIik7CisJCSAgIAorICAgICAgICB9IGVsc2UgeworCQkvKiBUaGlzIHJlYWRzIGFuIGV4dGVuZGVkIEVFUFJPTSB0aGF0IGlzIG5vdCBkb2N1bWVudGVkCisJCSAgIGluIHRoZSBDUzg5MDAgZGF0YXNoZWV0LiAqLworCQkKKyAgICAgICAgICAgICAgICAvKiBnZXQgdHJhbnNtaXNzaW9uIGNvbnRyb2wgd29yZCAgYnV0IGtlZXAgdGhlIGF1dG9uZWdvdGlhdGlvbiBiaXRzICovCisgICAgICAgICAgICAgICAgaWYgKCFscC0+YXV0b19uZWdfY25mKSBscC0+YXV0b19uZWdfY25mID0gZWVwcm9tX2J1ZmZbQVVUT19ORUdfQ05GX09GRlNFVC8yXTsKKyAgICAgICAgICAgICAgICAvKiBTdG9yZSBhZGFwdGVyIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgICAgICAgICBpZiAoIWxwLT5hZGFwdGVyX2NuZikgbHAtPmFkYXB0ZXJfY25mID0gZWVwcm9tX2J1ZmZbQURBUFRFUl9DTkZfT0ZGU0VULzJdOworICAgICAgICAgICAgICAgIC8qIFN0b3JlIElTQSBjb25maWd1cmF0aW9uICovCisgICAgICAgICAgICAgICAgbHAtPmlzYV9jb25maWcgPSBlZXByb21fYnVmZltJU0FfQ05GX09GRlNFVC8yXTsKKyAgICAgICAgICAgICAgICBkZXYtPm1lbV9zdGFydCA9IGVlcHJvbV9idWZmW1BBQ0tFVF9QQUdFX09GRlNFVC8yXSA8PCA4OworCisgICAgICAgICAgICAgICAgLyogZWVwcm9tX2J1ZmYgaGFzIDMyLWJpdCBpbnRzLCBzbyB3ZSBjYW4ndCBqdXN0IG1lbWNweSBpdCAqLworICAgICAgICAgICAgICAgIC8qIHN0b3JlIHRoZSBpbml0aWFsIG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU4vMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmRldl9hZGRyW2kqMl0gPSBlZXByb21fYnVmZltpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+ZGV2X2FkZHJbaSoyKzFdID0gZWVwcm9tX2J1ZmZbaV0gPj4gODsKKyAgICAgICAgICAgICAgICB9CisJCWlmIChuZXRfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBuZXcgYWRhcHRlcl9jbmY6IDB4JXhcbiIsCisJCQkJZGV2LT5uYW1lLCBscC0+YWRhcHRlcl9jbmYpOworICAgICAgICB9CisKKyAgICAgICAgLyogYWxsb3cgdGhlbSB0byBmb3JjZSBtdWx0aXBsZSB0cmFuc2NlaXZlcnMuICBJZiB0aGV5IGZvcmNlIG11bHRpcGxlLCBhdXRvc2Vuc2UgKi8KKyAgICAgICAgeworCQlpbnQgY291bnQgPSAwOworCQlpZiAobHAtPmZvcmNlICYgRk9SQ0VfUko0NSkJe2xwLT5hZGFwdGVyX2NuZiB8PSBBX0NORl8xMEJfVDsgY291bnQrKzsgfQorCQlpZiAobHAtPmZvcmNlICYgRk9SQ0VfQVVJKSAJe2xwLT5hZGFwdGVyX2NuZiB8PSBBX0NORl9BVUk7IGNvdW50Kys7IH0KKwkJaWYgKGxwLT5mb3JjZSAmIEZPUkNFX0JOQykJe2xwLT5hZGFwdGVyX2NuZiB8PSBBX0NORl8xMEJfMjsgY291bnQrKzsgfQorCQlpZiAoY291bnQgPiAxKQkJCXtscC0+YWRhcHRlcl9jbmYgfD0gQV9DTkZfTUVESUFfQVVUTzsgfQorCQllbHNlIGlmIChscC0+Zm9yY2UgJiBGT1JDRV9SSjQ1KXtscC0+YWRhcHRlcl9jbmYgfD0gQV9DTkZfTUVESUFfMTBCX1Q7IH0KKwkJZWxzZSBpZiAobHAtPmZvcmNlICYgRk9SQ0VfQVVJKQl7bHAtPmFkYXB0ZXJfY25mIHw9IEFfQ05GX01FRElBX0FVSTsgfQorCQllbHNlIGlmIChscC0+Zm9yY2UgJiBGT1JDRV9CTkMpCXtscC0+YWRhcHRlcl9jbmYgfD0gQV9DTkZfTUVESUFfMTBCXzI7IH0KKyAgICAgICAgfQorCisJaWYgKG5ldF9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogYWZ0ZXIgZm9yY2UgMHgleCwgYWRhcHRlcl9jbmY9MHgleFxuIiwKKwkJCWRldi0+bmFtZSwgbHAtPmZvcmNlLCBscC0+YWRhcHRlcl9jbmYpOworCisgICAgICAgIC8qIEZJWE1FOiBXZSBkb24ndCBsZXQgeW91IHNldCBkYy1kYyBwb2xhcml0eSBvciBsb3cgUlggc3F1ZWxjaCBmcm9tIHRoZSBjb21tYW5kIGxpbmU6IGFkZCBpdCBoZXJlICovCisKKyAgICAgICAgLyogRklYTUU6IFdlIGRvbid0IGxldCB5b3Ugc2V0IHRoZSBJTU0gYml0IGZyb20gdGhlIGNvbW1hbmQgbGluZTogYWRkIGl0IHRvIGxwLT5hdXRvX25lZ19jbmYgaGVyZSAqLworCisgICAgICAgIC8qIEZJWE1FOiB3ZSBkb24ndCBzZXQgdGhlIEV0aGVybmV0IGFkZHJlc3Mgb24gdGhlIGNvbW1hbmQgbGluZS4gIFVzZQorICAgICAgICAgICBpZmNvbmZpZyBJRkFDRSBodyBldGhlciBBQUJCQ0NEREVFRkYgKi8KKworCXByaW50ayhLRVJOX0lORk8gImNzODl4MCBtZWRpYSAlcyVzJXMiLAorCSAgICAgICAobHAtPmFkYXB0ZXJfY25mICYgQV9DTkZfMTBCX1QpPyJSSi00NSwiOiIiLAorCSAgICAgICAobHAtPmFkYXB0ZXJfY25mICYgQV9DTkZfQVVJKT8iQVVJLCI6IiIsCisJICAgICAgIChscC0+YWRhcHRlcl9jbmYgJiBBX0NORl8xMEJfMik/IkJOQywiOiIiKTsKKworCWxwLT5pcnFfbWFwID0gMHhmZmZmOworCisJLyogSWYgdGhpcyBpcyBhIENTODkwMCB0aGVuIG5vIHBucCBzb2Z0ICovCisJaWYgKGxwLT5jaGlwX3R5cGUgIT0gQ1M4OTAwICYmCisJICAgIC8qIENoZWNrIGlmIHRoZSBJU0EgSVJRIGhhcyBiZWVuIHNldCAgKi8KKwkJKGkgPSByZWFkcmVnKGRldiwgUFBfQ1M4OTIwX0lTQUlOVCkgJiAweGZmLAorCQkgKGkgIT0gMCAmJiBpIDwgQ1M4OTIwX05PX0lOVFMpKSkgeworCQlpZiAoIWRldi0+aXJxKQorCQkJZGV2LT5pcnEgPSBpOworCX0gZWxzZSB7CisJCWkgPSBscC0+aXNhX2NvbmZpZyAmIElOVF9OT19NQVNLOworCQlpZiAobHAtPmNoaXBfdHlwZSA9PSBDUzg5MDApIHsKKyNpZmRlZiBDT05GSUdfQVJDSF9JWERQMlgwMQorCQkgICAgICAgIGkgPSBjczg5MDBfaXJxX21hcFswXTsKKyNlbHNlCisJCQkvKiBUcmFuc2xhdGUgdGhlIElSUSB1c2luZyB0aGUgSVJRIG1hcHBpbmcgdGFibGUuICovCisJCQlpZiAoaSA+PSBzaXplb2YoY3M4OTAwX2lycV9tYXApL3NpemVvZihjczg5MDBfaXJxX21hcFswXSkpCisJCQkJcHJpbnRrKCJcbmNzODl4MDogaW52YWxpZCBJU0EgaW50ZXJydXB0IG51bWJlciAlZFxuIiwgaSk7CisJCQllbHNlCisJCQkJaSA9IGNzODkwMF9pcnFfbWFwW2ldOworCQkJCisJCQlscC0+aXJxX21hcCA9IENTODkwMF9JUlFfTUFQOyAvKiBmaXhlZCBJUlEgbWFwIGZvciBDUzg5MDAgKi8KKwkJfSBlbHNlIHsKKwkJCWludCBpcnFfbWFwX2J1ZmZbSVJRX01BUF9MRU4vMl07CisKKwkJCWlmIChnZXRfZWVwcm9tX2RhdGEoZGV2LCBJUlFfTUFQX0VFUFJPTV9EQVRBLAorCQkJCQkgICAgSVJRX01BUF9MRU4vMiwKKwkJCQkJICAgIGlycV9tYXBfYnVmZikgPj0gMCkgeworCQkJCWlmICgoaXJxX21hcF9idWZmWzBdICYgMHhmZikgPT0gUE5QX0lSUV9GUk1UKQorCQkJCQlscC0+aXJxX21hcCA9IChpcnFfbWFwX2J1ZmZbMF0+PjgpIHwgKGlycV9tYXBfYnVmZlsxXSA8PCA4KTsKKwkJCX0KKyNlbmRpZgorCQl9CisJCWlmICghZGV2LT5pcnEpCisJCQlkZXYtPmlycSA9IGk7CisJfQorCisJcHJpbnRrKCIgSVJRICVkIiwgZGV2LT5pcnEpOworCisjaWYgQUxMT1dfRE1BCisJaWYgKGxwLT51c2VfZG1hKSB7CisJCWdldF9kbWFfY2hhbm5lbChkZXYpOworCQlwcmludGsoIiwgRE1BICVkIiwgZGV2LT5kbWEpOworCX0KKwllbHNlCisjZW5kaWYKKwl7CisJCXByaW50aygiLCBwcm9ncmFtbWVkIEkvTyIpOworCX0KKworCS8qIHByaW50IHRoZSBldGhlcm5ldCBhZGRyZXNzLiAqLworCXByaW50aygiLCBNQUMiKTsKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKKwl7CisJCXByaW50aygiJWMlMDJ4IiwgaSA/ICc6JyA6ICcgJywgZGV2LT5kZXZfYWRkcltpXSk7CisJfQorCisJZGV2LT5vcGVuCQk9IG5ldF9vcGVuOworCWRldi0+c3RvcAkJPSBuZXRfY2xvc2U7CisJZGV2LT50eF90aW1lb3V0CQk9IG5ldF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBIWjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCAJPSBuZXRfc2VuZF9wYWNrZXQ7CisJZGV2LT5nZXRfc3RhdHMJCT0gbmV0X2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHNldF9tdWx0aWNhc3RfbGlzdDsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyAJPSBzZXRfbWFjX2FkZHJlc3M7CisKKwlwcmludGsoIlxuIik7CisJaWYgKG5ldF9kZWJ1ZykKKwkJcHJpbnRrKCJjczg5eDBfcHJvYmUxKCkgc3VjY2Vzc2Z1bFxuIik7CisJcmV0dXJuIDA7CitvdXQyOgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciAmIH4zLCBORVRDQVJEX0lPX0VYVEVOVCk7CitvdXQxOgorCXJldHVybiByZXR2YWw7Cit9CisKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoaXMgcGFnZSBjb250YWlucyBETUEgcm91dGluZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBBTExPV19ETUEKKworI2RlZmluZSBkbWFfcGFnZV9lcShwdHIxLCBwdHIyKSAoKGxvbmcpKHB0cjEpPj4xNyA9PSAobG9uZykocHRyMik+PjE3KQorCitzdGF0aWMgdm9pZAorZ2V0X2RtYV9jaGFubmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKGxwLT5kbWEpIHsKKwkJZGV2LT5kbWEgPSBscC0+ZG1hOworCQlscC0+aXNhX2NvbmZpZyB8PSBJU0FfUnhETUE7CisJfSBlbHNlIHsKKwkJaWYgKChscC0+aXNhX2NvbmZpZyAmIEFOWV9JU0FfRE1BKSA9PSAwKQorCQkJcmV0dXJuOworCQlkZXYtPmRtYSA9IGxwLT5pc2FfY29uZmlnICYgRE1BX05PX01BU0s7CisJCWlmIChscC0+Y2hpcF90eXBlID09IENTODkwMCkKKwkJCWRldi0+ZG1hICs9IDU7CisJCWlmIChkZXYtPmRtYSA8IDUgfHwgZGV2LT5kbWEgPiA3KSB7CisJCQlscC0+aXNhX2NvbmZpZyAmPSB+QU5ZX0lTQV9ETUE7CisJCQlyZXR1cm47CisJCX0KKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAord3JpdGVfZG1hKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjaGlwX3R5cGUsIGludCBkbWEpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWlmICgobHAtPmlzYV9jb25maWcgJiBBTllfSVNBX0RNQSkgPT0gMCkKKwkJcmV0dXJuOworCWlmIChjaGlwX3R5cGUgPT0gQ1M4OTAwKSB7CisJCXdyaXRlcmVnKGRldiwgUFBfQ1M4OTAwX0lTQURNQSwgZG1hLTUpOworCX0gZWxzZSB7CisJCXdyaXRlcmVnKGRldiwgUFBfQ1M4OTIwX0lTQURNQSwgZG1hKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfZG1hX2NmZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChscC0+dXNlX2RtYSkgeworCQlpZiAoKGxwLT5pc2FfY29uZmlnICYgQU5ZX0lTQV9ETUEpID09IDApIHsKKwkJCWlmIChuZXRfZGVidWcgPiAzKQorCQkJCXByaW50aygic2V0X2RtYV9jZmcoKTogbm8gRE1BXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAobHAtPmlzYV9jb25maWcgJiBJU0FfUnhETUEpIHsKKwkJCWxwLT5jdXJyX3J4X2NmZyB8PSBSWF9ETUFfT05MWTsKKwkJCWlmIChuZXRfZGVidWcgPiAzKQorCQkJCXByaW50aygic2V0X2RtYV9jZmcoKTogUlhfRE1BX09OTFlcbiIpOworCQl9IGVsc2UgeworCQkJbHAtPmN1cnJfcnhfY2ZnIHw9IEFVVE9fUlhfRE1BOwkvKiBub3QgdGhhdCB3ZSBzdXBwb3J0IGl0Li4uICovCisJCQlpZiAobmV0X2RlYnVnID4gMykKKwkJCQlwcmludGsoInNldF9kbWFfY2ZnKCk6IEFVVE9fUlhfRE1BXG4iKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludAorZG1hX2J1ZmNmZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpZiAobHAtPnVzZV9kbWEpCisJCXJldHVybiAobHAtPmlzYV9jb25maWcgJiBBTllfSVNBX0RNQSk/IFJYX0RNQV9FTkJMIDogMDsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkbWFfYnVzY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWlmIChscC0+dXNlX2RtYSkgeworCQlpZiAobHAtPmlzYV9jb25maWcgJiBBTllfSVNBX0RNQSkKKwkJCXJldHZhbCB8PSBSRVNFVF9SWF9ETUE7IC8qIFJlc2V0IHRoZSBETUEgcG9pbnRlciAqLworCQlpZiAobHAtPmlzYV9jb25maWcgJiBETUFfQlVSU1QpCisJCQlyZXR2YWwgfD0gRE1BX0JVUlNUX01PREU7IC8qIERvZXMgSVNBIGNvbmZpZyBzcGVjaWZ5IERNQSBidXJzdCA/ICovCisJCWlmIChscC0+ZG1hc2l6ZSA9PSA2NCkKKwkJCXJldHZhbCB8PSBSWF9ETUFfU0laRV82NEs7IC8qIGRpZCB0aGV5IGFzayBmb3IgNjRLPyAqLworCQlyZXR2YWwgfD0gTUVNT1JZX09OOwkvKiB3ZSBuZWVkIG1lbW9yeSBlbmFibGVkIHRvIHVzZSBETUEuICovCisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitkbWFfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgc3RhdHVzLCBsZW5ndGg7CisJdW5zaWduZWQgY2hhciAqYnAgPSBscC0+cnhfZG1hX3B0cjsKKworCXN0YXR1cyA9IGJwWzBdICsgKGJwWzFdPDw4KTsKKwlsZW5ndGggPSBicFsyXSArIChicFszXTw8OCk7CisJYnAgKz0gNDsKKwlpZiAobmV0X2RlYnVnID4gNSkgeworCQlwcmludGsoCSIlczogcmVjZWl2aW5nIERNQSBwYWNrZXQgYXQgJWx4LCBzdGF0dXMgJXgsIGxlbmd0aCAleFxuIiwKKwkJCWRldi0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpYnAsIHN0YXR1cywgbGVuZ3RoKTsKKwl9CisJaWYgKChzdGF0dXMgJiBSWF9PSykgPT0gMCkgeworCQljb3VudF9yeF9lcnJvcnMoc3RhdHVzLCBscCk7CisJCWdvdG8gc2tpcF90aGlzX2ZyYW1lOworCX0KKworCS8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLiAqLworCXNrYiA9IGRldl9hbGxvY19za2IobGVuZ3RoICsgMik7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCWlmIChuZXRfZGVidWcpCS8qIEkgZG9uJ3QgdGhpbmsgd2Ugd2FudCB0byBkbyB0aGlzIHRvIGEgc3RyZXNzZWQgc3lzdGVtICovCisJCQlwcmludGsoIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKworCQkvKiBBS1BNOiBhZHZhbmNlIGJwIHRvIHRoZSBuZXh0IGZyYW1lICovCitza2lwX3RoaXNfZnJhbWU6CisJCWJwICs9IChsZW5ndGggKyAzKSAmIH4zOworCQlpZiAoYnAgPj0gbHAtPmVuZF9kbWFfYnVmZikgYnAgLT0gbHAtPmRtYXNpemUqMTAyNDsKKwkJbHAtPnJ4X2RtYV9wdHIgPSBicDsKKwkJcmV0dXJuOworCX0KKwlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBsb25nd29yZCBhbGlnbiBMMyBoZWFkZXIgKi8KKwlza2ItPmRldiA9IGRldjsKKworCWlmIChicCArIGxlbmd0aCA+IGxwLT5lbmRfZG1hX2J1ZmYpIHsKKwkJaW50IHNlbWlfY250ID0gbHAtPmVuZF9kbWFfYnVmZiAtIGJwOworCQltZW1jcHkoc2tiX3B1dChza2Isc2VtaV9jbnQpLCBicCwgc2VtaV9jbnQpOworCQltZW1jcHkoc2tiX3B1dChza2IsbGVuZ3RoIC0gc2VtaV9jbnQpLCBscC0+ZG1hX2J1ZmYsCisJCSAgICAgICBsZW5ndGggLSBzZW1pX2NudCk7CisJfSBlbHNlIHsKKwkJbWVtY3B5KHNrYl9wdXQoc2tiLGxlbmd0aCksIGJwLCBsZW5ndGgpOworCX0KKwlicCArPSAobGVuZ3RoICsgMykgJiB+MzsKKwlpZiAoYnAgPj0gbHAtPmVuZF9kbWFfYnVmZikgYnAgLT0gbHAtPmRtYXNpemUqMTAyNDsKKwlscC0+cnhfZG1hX3B0ciA9IGJwOworCisJaWYgKG5ldF9kZWJ1ZyA+IDMpIHsKKwkJcHJpbnRrKAkiJXM6IHJlY2VpdmVkICVkIGJ5dGUgRE1BIHBhY2tldCBvZiB0eXBlICV4XG4iLAorCQkJZGV2LT5uYW1lLCBsZW5ndGgsCisJCQkoc2tiLT5kYXRhW0VUSF9BTEVOK0VUSF9BTEVOXSA8PCA4KSB8IHNrYi0+ZGF0YVtFVEhfQUxFTitFVEhfQUxFTisxXSk7CisJfQorICAgICAgICBza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCW5ldGlmX3J4KHNrYik7CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlscC0+c3RhdHMucnhfcGFja2V0cysrOworCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBsZW5ndGg7Cit9CisKKyNlbmRpZgkvKiBBTExPV19ETUEgKi8KKwordm9pZCAgX19pbml0IHJlc2V0X2NoaXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZm5kZWYgQ09ORklHX0FSQ0hfSVhEUDJYMDEKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworI2VuZGlmCisJaW50IHJlc2V0X3N0YXJ0X3RpbWU7CisKKwl3cml0ZXJlZyhkZXYsIFBQX1NlbGZDVEwsIHJlYWRyZWcoZGV2LCBQUF9TZWxmQ1RMKSB8IFBPV0VSX09OX1JFU0VUKTsKKworCS8qIHdhaXQgMzAgbXMgKi8KKwltc2xlZXAoMzApOworCisjaWZuZGVmIENPTkZJR19BUkNIX0lYRFAyWDAxCisJaWYgKGxwLT5jaGlwX3R5cGUgIT0gQ1M4OTAwKSB7CisJCS8qIEhhcmR3YXJlIHByb2JsZW0gcmVxdWlyZXMgUE5QIHJlZ2lzdGVycyB0byBiZSByZWNvbmZpZ3VyZWQgYWZ0ZXIgYSByZXNldCAqLworCQlvdXR3KFBQX0NTODkyMF9JU0FJTlQsIGlvYWRkciArIEFERF9QT1JUKTsKKwkJb3V0YihkZXYtPmlycSwgaW9hZGRyICsgREFUQV9QT1JUKTsKKwkJb3V0YigwLCAgICAgIGlvYWRkciArIERBVEFfUE9SVCArIDEpOworCisJCW91dHcoUFBfQ1M4OTIwX0lTQU1lbUIsIGlvYWRkciArIEFERF9QT1JUKTsKKwkJb3V0YigoZGV2LT5tZW1fc3RhcnQgPj4gMTYpICYgMHhmZiwgaW9hZGRyICsgREFUQV9QT1JUKTsKKwkJb3V0YigoZGV2LT5tZW1fc3RhcnQgPj4gOCkgJiAweGZmLCAgIGlvYWRkciArIERBVEFfUE9SVCArIDEpOworCX0KKyNlbmRpZgkvKiBJWERQMngwMSAqLworCisJLyogV2FpdCB1bnRpbCB0aGUgY2hpcCBpcyByZXNldCAqLworCXJlc2V0X3N0YXJ0X3RpbWUgPSBqaWZmaWVzOworCXdoaWxlKCAocmVhZHJlZyhkZXYsIFBQX1NlbGZTVCkgJiBJTklUX0RPTkUpID09IDAgJiYgamlmZmllcyAtIHJlc2V0X3N0YXJ0X3RpbWUgPCAyKQorCQk7Cit9CisKKwwKK3N0YXRpYyB2b2lkCitjb250cm9sX2RjX2RjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBvbl9ub3Rfb2ZmKQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgc2VsZmNvbnRyb2w7CisJaW50IHRpbWVub3cgPSBqaWZmaWVzOworCS8qIGNvbnRyb2wgdGhlIERDIHRvIERDIGNvbnZlcnRvciBpbiB0aGUgU2VsZkNvbnRyb2wgcmVnaXN0ZXIuICAKKwkgICBOb3RlOiBUaGlzIGlzIGhvb2tlZCB1cCB0byBhIGdlbmVyYWwgcHVycG9zZSBwaW4sIG1pZ2h0IG5vdAorCSAgIGFsd2F5cyBiZSBhIERDIHRvIERDIGNvbnZlcnRvci4gKi8KKworCXNlbGZjb250cm9sID0gSENCMV9FTkJMOyAvKiBFbmFibGUgdGhlIEhDQjEgYml0IGFzIGFuIG91dHB1dCAqLworCWlmICgoKGxwLT5hZGFwdGVyX2NuZiAmIEFfQ05GX0RDX0RDX1BPTEFSSVRZKSAhPSAwKSBeIG9uX25vdF9vZmYpCisJCXNlbGZjb250cm9sIHw9IEhDQjE7CisJZWxzZQorCQlzZWxmY29udHJvbCAmPSB+SENCMTsKKwl3cml0ZXJlZyhkZXYsIFBQX1NlbGZDVEwsIHNlbGZjb250cm9sKTsKKworCS8qIFdhaXQgZm9yIHRoZSBEQy9EQyBjb252ZXJ0ZXIgdG8gcG93ZXIgdXAgLSA1MDBtcyAqLworCXdoaWxlIChqaWZmaWVzIC0gdGltZW5vdyA8IEhaKQorCQk7Cit9CisKKyNkZWZpbmUgREVURUNURURfTk9ORSAgMAorI2RlZmluZSBERVRFQ1RFRF9SSjQ1SCAxCisjZGVmaW5lIERFVEVDVEVEX1JKNDVGIDIKKyNkZWZpbmUgREVURUNURURfQVVJICAgMworI2RlZmluZSBERVRFQ1RFRF9CTkMgICA0CisKK3N0YXRpYyBpbnQKK2RldGVjdF90cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgdGltZW5vdyA9IGppZmZpZXM7CisJaW50IGZkeDsKKworCWlmIChuZXRfZGVidWcgPiAxKSBwcmludGsoIiVzOiBBdHRlbXB0aW5nIFRQXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIC8qIElmIGNvbm5lY3RlZCB0byBhbm90aGVyIGZ1bGwgZHVwbGV4IGNhcGFibGUgMTAtQmFzZS1UIGNhcmQgdGhlIGxpbmsgcHVsc2VzCisgICAgICAgICAgIHNlZW0gdG8gYmUgbG9zdCB3aGVuIHRoZSBhdXRvIGRldGVjdCBiaXQgaW4gdGhlIExpbmVDVEwgaXMgc2V0LgorICAgICAgICAgICBUbyBvdmVyY29tZSB0aGlzIHRoZSBhdXRvIGRldGVjdCBiaXQgd2lsbCBiZSBjbGVhcmVkIHdoaWxzdCB0ZXN0aW5nIHRoZQorICAgICAgICAgICAxMC1CYXNlLVQgaW50ZXJmYWNlLiAgVGhpcyB3b3VsZCBub3QgYmUgbmVjZXNzYXJ5IGZvciB0aGUgc3BhcnJvdyBjaGlwIGJ1dAorICAgICAgICAgICBpcyBzaW1wbGVyIHRvIGRvIGl0IGFueXdheS4gKi8KKwl3cml0ZXJlZyhkZXYsIFBQX0xpbmVDVEwsIGxwLT5saW5lY3RsICZ+IEFVSV9PTkxZKTsKKwljb250cm9sX2RjX2RjKGRldiwgMCk7CisKKyAgICAgICAgLyogRGVsYXkgZm9yIHRoZSBoYXJkd2FyZSB0byB3b3JrIG91dCBpZiB0aGUgVFAgY2FibGUgaXMgcHJlc2VudCAtIDE1MG1zICovCisJZm9yICh0aW1lbm93ID0gamlmZmllczsgamlmZmllcyAtIHRpbWVub3cgPCAxNTsgKQorICAgICAgICAgICAgICAgIDsKKwlpZiAoKHJlYWRyZWcoZGV2LCBQUF9MaW5lU1QpICYgTElOS19PSykgPT0gMCkKKwkJcmV0dXJuIERFVEVDVEVEX05PTkU7CisKKwlpZiAobHAtPmNoaXBfdHlwZSA9PSBDUzg5MDApIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGxwLT5mb3JjZSAmIDB4ZjApIHsKKyNpZiAwCisgICAgICAgICAgICAgICAgY2FzZSBGT1JDRV9BVVRPOgorCQkJcHJpbnRrKCIlczogY3M4OTAwIGRvZXNuJ3QgYXV0b25lZ290aWF0ZVxuIixkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERFVEVDVEVEX05PTkU7CisjZW5kaWYKKwkJLyogQ1M4OTAwIGRvZXNuJ3Qgc3VwcG9ydCBBVVRPLCBjaGFuZ2UgdG8gSEFMRiovCisgICAgICAgICAgICAgICAgY2FzZSBGT1JDRV9BVVRPOgorCQkJbHAtPmZvcmNlICY9IH5GT1JDRV9BVVRPOworICAgICAgICAgICAgICAgICAgICAgICAgbHAtPmZvcmNlIHw9IEZPUkNFX0hBTEY7CisJCQlicmVhazsKKwkJY2FzZSBGT1JDRV9IQUxGOgorCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGT1JDRV9GVUxMOgorCQkJd3JpdGVyZWcoZGV2LCBQUF9UZXN0Q1RMLCByZWFkcmVnKGRldiwgUFBfVGVzdENUTCkgfCBGRFhfODkwMCk7CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICB9CisJCWZkeCA9IHJlYWRyZWcoZGV2LCBQUF9UZXN0Q1RMKSAmIEZEWF84OTAwOworCX0gZWxzZSB7CisJCXN3aXRjaCAobHAtPmZvcmNlICYgMHhmMCkgeworCQljYXNlIEZPUkNFX0FVVE86CisJCQlscC0+YXV0b19uZWdfY25mID0gQVVUT19ORUdfRU5BQkxFOworCQkJYnJlYWs7CisJCWNhc2UgRk9SQ0VfSEFMRjoKKwkJCWxwLT5hdXRvX25lZ19jbmYgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgRk9SQ0VfRlVMTDoKKwkJCWxwLT5hdXRvX25lZ19jbmYgPSBSRV9ORUdfTk9XIHwgQUxMT1dfRkRYOworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisJCXdyaXRlcmVnKGRldiwgUFBfQXV0b05lZ0NUTCwgbHAtPmF1dG9fbmVnX2NuZiAmIEFVVE9fTkVHX01BU0spOworCisJCWlmICgobHAtPmF1dG9fbmVnX2NuZiAmIEFVVE9fTkVHX0JJVFMpID09IEFVVE9fTkVHX0VOQUJMRSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5lZ290aWF0aW5nIGR1cGxleC4uLlxuIixkZXYtPm5hbWUpOworCQkJd2hpbGUgKHJlYWRyZWcoZGV2LCBQUF9BdXRvTmVnU1QpICYgQVVUT19ORUdfQlVTWSkgeworCQkJCWlmIChqaWZmaWVzIC0gdGltZW5vdyA+IDQwMDApIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICIqKioqIEZ1bGwgLyBoYWxmIGR1cGxleCBhdXRvLW5lZ290aWF0aW9uIHRpbWVkIG91dCAqKioqXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWZkeCA9IHJlYWRyZWcoZGV2LCBQUF9BdXRvTmVnU1QpICYgRkRYX0FDVElWRTsKKwl9CisJaWYgKGZkeCkKKwkJcmV0dXJuIERFVEVDVEVEX1JKNDVGOworCWVsc2UKKwkJcmV0dXJuIERFVEVDVEVEX1JKNDVIOworfQorCisvKiBzZW5kIGEgdGVzdCBwYWNrZXQgLSByZXR1cm4gdHJ1ZSBpZiBjYXJyaWVyIGJpdHMgYXJlIG9rICovCitzdGF0aWMgaW50CitzZW5kX3Rlc3RfcGt0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJY2hhciB0ZXN0X3BhY2tldFtdID0geyAwLDAsMCwwLDAsMCwgMCwwLDAsMCwwLDAsCisJCQkJIDAsIDQ2LCAvKiBBIDQ2IGluIG5ldHdvcmsgb3JkZXIgKi8KKwkJCQkgMCwgMCwgLyogRFNBUD0wICYgU1NBUD0wIGZpZWxkcyAqLworCQkJCSAweGYzLCAwIC8qIENvbnRyb2wgKFRlc3QgUmVxICsgUCBiaXQgc2V0KSAqLyB9OworCWxvbmcgdGltZW5vdyA9IGppZmZpZXM7CisKKwl3cml0ZXJlZyhkZXYsIFBQX0xpbmVDVEwsIHJlYWRyZWcoZGV2LCBQUF9MaW5lQ1RMKSB8IFNFUklBTF9UWF9PTik7CisKKwltZW1jcHkodGVzdF9wYWNrZXQsICAgICAgICAgIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkodGVzdF9wYWNrZXQrRVRIX0FMRU4sIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKworICAgICAgICB3cml0ZXdvcmQoZGV2LCBUWF9DTURfUE9SVCwgVFhfQUZURVJfQUxMKTsKKyAgICAgICAgd3JpdGV3b3JkKGRldiwgVFhfTEVOX1BPUlQsIEVUSF9aTEVOKTsKKworCS8qIFRlc3QgdG8gc2VlIGlmIHRoZSBjaGlwIGhhcyBhbGxvY2F0ZWQgbWVtb3J5IGZvciB0aGUgcGFja2V0ICovCisJd2hpbGUgKGppZmZpZXMgLSB0aW1lbm93IDwgNSkKKwkJaWYgKHJlYWRyZWcoZGV2LCBQUF9CdXNTVCkgJiBSRUFEWV9GT1JfVFhfTk9XKQorCQkJYnJlYWs7CisJaWYgKGppZmZpZXMgLSB0aW1lbm93ID49IDUpCisJCXJldHVybiAwOwkvKiB0aGlzIHNob3VsZG4ndCBoYXBwZW4gKi8KKworCS8qIFdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGUgcGFja2V0ICovCisJb3V0c3coZGV2LT5iYXNlX2FkZHIgKyBUWF9GUkFNRV9QT1JULHRlc3RfcGFja2V0LChFVEhfWkxFTisxKSA+PjEpOworCisJaWYgKG5ldF9kZWJ1ZyA+IDEpIHByaW50aygiU2VuZGluZyB0ZXN0IHBhY2tldCAiKTsKKwkvKiB3YWl0IGEgY291cGxlIG9mIGppZmZpZXMgZm9yIHBhY2tldCB0byBiZSByZWNlaXZlZCAqLworCWZvciAodGltZW5vdyA9IGppZmZpZXM7IGppZmZpZXMgLSB0aW1lbm93IDwgMzsgKQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgaWYgKChyZWFkcmVnKGRldiwgUFBfVHhFdmVudCkgJiBUWF9TRU5EX09LX0JJVFMpID09IFRYX09LKSB7CisgICAgICAgICAgICAgICAgaWYgKG5ldF9kZWJ1ZyA+IDEpIHByaW50aygic3VjY2VlZGVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCWlmIChuZXRfZGVidWcgPiAxKSBwcmludGsoImZhaWxlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorZGV0ZWN0X2F1aShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChuZXRfZGVidWcgPiAxKSBwcmludGsoIiVzOiBBdHRlbXB0aW5nIEFVSVxuIiwgZGV2LT5uYW1lKTsKKwljb250cm9sX2RjX2RjKGRldiwgMCk7CisKKwl3cml0ZXJlZyhkZXYsIFBQX0xpbmVDVEwsIChscC0+bGluZWN0bCAmfiBBVVRPX0FVSV8xMEJBU0VUKSB8IEFVSV9PTkxZKTsKKworCWlmIChzZW5kX3Rlc3RfcGt0KGRldikpCisJCXJldHVybiBERVRFQ1RFRF9BVUk7CisJZWxzZQorCQlyZXR1cm4gREVURUNURURfTk9ORTsKK30KKworc3RhdGljIGludAorZGV0ZWN0X2JuYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChuZXRfZGVidWcgPiAxKSBwcmludGsoIiVzOiBBdHRlbXB0aW5nIEJOQ1xuIiwgZGV2LT5uYW1lKTsKKwljb250cm9sX2RjX2RjKGRldiwgMSk7CisKKwl3cml0ZXJlZyhkZXYsIFBQX0xpbmVDVEwsIChscC0+bGluZWN0bCAmfiBBVVRPX0FVSV8xMEJBU0VUKSB8IEFVSV9PTkxZKTsKKworCWlmIChzZW5kX3Rlc3RfcGt0KGRldikpCisJCXJldHVybiBERVRFQ1RFRF9CTkM7CisJZWxzZQorCQlyZXR1cm4gREVURUNURURfTk9ORTsKK30KKworDAorc3RhdGljIHZvaWQKK3dyaXRlX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY2hpcF90eXBlLCBpbnQgaXJxKQoreworCWludCBpOworCisJaWYgKGNoaXBfdHlwZSA9PSBDUzg5MDApIHsKKwkJLyogU2VhcmNoIHRoZSBtYXBwaW5nIHRhYmxlIGZvciB0aGUgY29ycmVzcG9uZGluZyBJUlEgcGluLiAqLworCQlmb3IgKGkgPSAwOyBpICE9IHNpemVvZihjczg5MDBfaXJxX21hcCkvc2l6ZW9mKGNzODkwMF9pcnFfbWFwWzBdKTsgaSsrKQorCQkJaWYgKGNzODkwMF9pcnFfbWFwW2ldID09IGlycSkKKwkJCQlicmVhazsKKwkJLyogTm90IGZvdW5kICovCisJCWlmIChpID09IHNpemVvZihjczg5MDBfaXJxX21hcCkvc2l6ZW9mKGNzODkwMF9pcnFfbWFwWzBdKSkKKwkJCWkgPSAzOworCQl3cml0ZXJlZyhkZXYsIFBQX0NTODkwMF9JU0FJTlQsIGkpOworCX0gZWxzZSB7CisJCXdyaXRlcmVnKGRldiwgUFBfQ1M4OTIwX0lTQUlOVCwgaXJxKTsKKwl9Cit9CisKKy8qIE9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuICBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQorICAgc29tZXRpbWUgYWZ0ZXIgYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgorCisgICBUaGlzIHJvdXRpbmUgc2hvdWxkIHNldCBldmVyeXRoaW5nIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuCisgICByZWdpc3RlcnMgdGhhdCAic2hvdWxkIiBvbmx5IG5lZWQgdG8gYmUgc2V0IG9uY2UgYXQgYm9vdCwgc28gdGhhdAorICAgdGhlcmUgaXMgbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAgICovCisKKy8qIEFLUE06IGRvIHdlIG5lZWQgdG8gZG8gYW55IGxvY2tpbmcgaGVyZT8gKi8KKworc3RhdGljIGludAorbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IGk7CisJaW50IHJldDsKKworI2lmbmRlZiBDT05GSUdfU0hfSElDT1NINCAvKiB1c2VzIGlycSMxLCBzbyB0aGlzIHdvbid0IHdvcmsgKi8KKwlpZiAoZGV2LT5pcnEgPCAyKSB7CisJCS8qIEFsbG93IGludGVycnVwdHMgdG8gYmUgZ2VuZXJhdGVkIGJ5IHRoZSBjaGlwICovCisvKiBDaXJydXMnIHJlbGVhc2UgaGFkIHRoaXM6ICovCisjaWYgMAorCQl3cml0ZXJlZyhkZXYsIFBQX0J1c0NUTCwgcmVhZHJlZyhkZXYsIFBQX0J1c0NUTCl8RU5BQkxFX0lSUSApOworI2VuZGlmCisvKiBBbmQgMi4zLjQ3IGhhZCB0aGlzOiAqLworCQl3cml0ZXJlZyhkZXYsIFBQX0J1c0NUTCwgRU5BQkxFX0lSUSB8IE1FTU9SWV9PTik7CisKKwkJZm9yIChpID0gMjsgaSA8IENTODkyMF9OT19JTlRTOyBpKyspIHsKKwkJCWlmICgoMSA8PCBpKSAmIGxwLT5pcnFfbWFwKSB7CisJCQkJaWYgKHJlcXVlc3RfaXJxKGksIG5ldF9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSA9PSAwKSB7CisJCQkJCWRldi0+aXJxID0gaTsKKwkJCQkJd3JpdGVfaXJxKGRldiwgbHAtPmNoaXBfdHlwZSwgaSk7CisJCQkJCS8qIHdyaXRlcmVnKGRldiwgUFBfQnVmQ0ZHLCBHRU5FUkFURV9TV19JTlRFUlJVUFQpOyAqLworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoaSA+PSBDUzg5MjBfTk9fSU5UUykgeworCQkJd3JpdGVyZWcoZGV2LCBQUF9CdXNDVEwsIDApOwkvKiBkaXNhYmxlIGludGVycnVwdHMuICovCisJCQlwcmludGsoS0VSTl9FUlIgImNzODl4MDogY2FuJ3QgZ2V0IGFuIGludGVycnVwdFxuIik7CisJCQlyZXQgPSAtRUFHQUlOOworCQkJZ290byBiYWRfb3V0OworCQl9CisJfQorCWVsc2UKKyNlbmRpZgorCXsKKyNpZm5kZWYgQ09ORklHX0FSQ0hfSVhEUDJYMDEKKwkJaWYgKCgoMSA8PCBkZXYtPmlycSkgJiBscC0+aXJxX21hcCkgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSVJRICVkIGlzIG5vdCBpbiBvdXIgbWFwIG9mIGFsbG93YWJsZSBJUlFzLCB3aGljaCBpcyAleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGRldi0+aXJxLCBscC0+aXJxX21hcCk7CisJCQlyZXQgPSAtRUFHQUlOOworCQkJZ290byBiYWRfb3V0OworCQl9CisjZW5kaWYKKy8qIEZJWE1FOiBDaXJydXMnIHJlbGVhc2UgaGFkIHRoaXM6ICovCisJCXdyaXRlcmVnKGRldiwgUFBfQnVzQ1RMLCByZWFkcmVnKGRldiwgUFBfQnVzQ1RMKXxFTkFCTEVfSVJRICk7CisvKiBBbmQgMi4zLjQ3IGhhZCB0aGlzOiAqLworI2lmIDAKKwkJd3JpdGVyZWcoZGV2LCBQUF9CdXNDVEwsIEVOQUJMRV9JUlEgfCBNRU1PUllfT04pOworI2VuZGlmCisJCXdyaXRlX2lycShkZXYsIGxwLT5jaGlwX3R5cGUsIGRldi0+aXJxKTsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZuZXRfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldik7CisJCWlmIChyZXQpIHsKKwkJCWlmIChuZXRfZGVidWcpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImNzODl4MDogcmVxdWVzdF9pcnEoJWQpIGZhaWxlZFxuIiwgZGV2LT5pcnEpOworCQkJZ290byBiYWRfb3V0OworCQl9CisJfQorCisjaWYgQUxMT1dfRE1BCisJaWYgKGxwLT51c2VfZG1hKSB7CisJCWlmIChscC0+aXNhX2NvbmZpZyAmIEFOWV9JU0FfRE1BKSB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJbHAtPmRtYV9idWZmID0gKHVuc2lnbmVkIGNoYXIgKilfX2dldF9kbWFfcGFnZXMoR0ZQX0tFUk5FTCwKKwkJCQkJCQlnZXRfb3JkZXIobHAtPmRtYXNpemUgKiAxMDI0KSk7CisKKwkJCWlmICghbHAtPmRtYV9idWZmKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IGdldCAlZEsgbWVtb3J5IGZvciBETUFcbiIsIGRldi0+bmFtZSwgbHAtPmRtYXNpemUpOworCQkJCWdvdG8gcmVsZWFzZV9pcnE7CisJCQl9CisJCQlpZiAobmV0X2RlYnVnID4gMSkgeworCQkJCXByaW50aygJIiVzOiBkbWEgJWx4ICVseFxuIiwKKwkJCQkJZGV2LT5uYW1lLAorCQkJCQkodW5zaWduZWQgbG9uZylscC0+ZG1hX2J1ZmYsCisJCQkJCSh1bnNpZ25lZCBsb25nKWlzYV92aXJ0X3RvX2J1cyhscC0+ZG1hX2J1ZmYpKTsKKwkJCX0KKwkJCWlmICgodW5zaWduZWQgbG9uZykgbHAtPmRtYV9idWZmID49IE1BWF9ETUFfQUREUkVTUyB8fAorCQkJICAgICFkbWFfcGFnZV9lcShscC0+ZG1hX2J1ZmYsIGxwLT5kbWFfYnVmZitscC0+ZG1hc2l6ZSoxMDI0LTEpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm90IHVzYWJsZSBhcyBETUEgYnVmZmVyXG4iLCBkZXYtPm5hbWUpOworCQkJCWdvdG8gcmVsZWFzZV9pcnE7CisJCQl9CisJCQltZW1zZXQobHAtPmRtYV9idWZmLCAwLCBscC0+ZG1hc2l6ZSAqIDEwMjQpOwkvKiBXaHk/ICovCisJCQlpZiAocmVxdWVzdF9kbWEoZGV2LT5kbWEsIGRldi0+bmFtZSkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW5ub3QgZ2V0IGRtYSBjaGFubmVsICVkXG4iLCBkZXYtPm5hbWUsIGRldi0+ZG1hKTsKKwkJCQlnb3RvIHJlbGVhc2VfaXJxOworCQkJfQorCQkJd3JpdGVfZG1hKGRldiwgbHAtPmNoaXBfdHlwZSwgZGV2LT5kbWEpOworCQkJbHAtPnJ4X2RtYV9wdHIgPSBscC0+ZG1hX2J1ZmY7CisJCQlscC0+ZW5kX2RtYV9idWZmID0gbHAtPmRtYV9idWZmICsgbHAtPmRtYXNpemUqMTAyNDsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCQkJZGlzYWJsZV9kbWEoZGV2LT5kbWEpOworCQkJY2xlYXJfZG1hX2ZmKGRldi0+ZG1hKTsKKwkJCXNldF9kbWFfbW9kZShkZXYtPmRtYSwgMHgxNCk7IC8qIGF1dG9faW5pdCBhcyB3ZWxsICovCisJCQlzZXRfZG1hX2FkZHIoZGV2LT5kbWEsIGlzYV92aXJ0X3RvX2J1cyhscC0+ZG1hX2J1ZmYpKTsKKwkJCXNldF9kbWFfY291bnQoZGV2LT5kbWEsIGxwLT5kbWFzaXplKjEwMjQpOworCQkJZW5hYmxlX2RtYShkZXYtPmRtYSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCQl9CisJfQorI2VuZGlmCS8qIEFMTE9XX0RNQSAqLworCisJLyogc2V0IHRoZSBFdGhlcm5ldCBhZGRyZXNzICovCisJZm9yIChpPTA7IGkgPCBFVEhfQUxFTi8yOyBpKyspCisJCXdyaXRlcmVnKGRldiwgUFBfSUEraSoyLCBkZXYtPmRldl9hZGRyW2kqMl0gfCAoZGV2LT5kZXZfYWRkcltpKjIrMV0gPDwgOCkpOworCisJLyogd2hpbGUgd2UncmUgdGVzdGluZyB0aGUgaW50ZXJmYWNlLCBsZWF2ZSBpbnRlcnJ1cHRzIGRpc2FibGVkICovCisJd3JpdGVyZWcoZGV2LCBQUF9CdXNDVEwsIE1FTU9SWV9PTik7CisKKwkvKiBTZXQgdGhlIExpbmVDVEwgcXVpbnR1cGxldCBiYXNlZCBvbiBhZGFwdGVyIGNvbmZpZ3VyYXRpb24gcmVhZCBmcm9tIEVFUFJPTSAqLworCWlmICgobHAtPmFkYXB0ZXJfY25mICYgQV9DTkZfRVhUTkRfMTBCXzIpICYmIChscC0+YWRhcHRlcl9jbmYgJiBBX0NORl9MT1dfUlhfU1FVRUxDSCkpCisgICAgICAgICAgICAgICAgbHAtPmxpbmVjdGwgPSBMT1dfUlhfU1FVRUxDSDsKKwllbHNlCisgICAgICAgICAgICAgICAgbHAtPmxpbmVjdGwgPSAwOworCisgICAgICAgIC8qIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXkgaGF2ZSB0aGUgInJpZ2h0IiBoYXJkd2FyZSBhdmFpbGFibGUgKi8KKwlzd2l0Y2gobHAtPmFkYXB0ZXJfY25mICYgQV9DTkZfTUVESUFfVFlQRSkgeworCWNhc2UgQV9DTkZfTUVESUFfMTBCX1Q6IHJlc3VsdCA9IGxwLT5hZGFwdGVyX2NuZiAmIEFfQ05GXzEwQl9UOyBicmVhazsKKwljYXNlIEFfQ05GX01FRElBX0FVSTogICByZXN1bHQgPSBscC0+YWRhcHRlcl9jbmYgJiBBX0NORl9BVUk7IGJyZWFrOworCWNhc2UgQV9DTkZfTUVESUFfMTBCXzI6IHJlc3VsdCA9IGxwLT5hZGFwdGVyX2NuZiAmIEFfQ05GXzEwQl8yOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogcmVzdWx0ID0gbHAtPmFkYXB0ZXJfY25mICYgKEFfQ05GXzEwQl9UIHwgQV9DTkZfQVVJIHwgQV9DTkZfMTBCXzIpOworICAgICAgICB9CisgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogRUVQUk9NIGlzIGNvbmZpZ3VyZWQgZm9yIHVuYXZhaWxhYmxlIG1lZGlhXG4iLCBkZXYtPm5hbWUpOworICAgICAgICByZWxlYXNlX2lycToKKyNpZiBBTExPV19ETUEKKwkJcmVsZWFzZV9kbWFfYnVmZihscCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB3cml0ZXJlZyhkZXYsIFBQX0xpbmVDVEwsIHJlYWRyZWcoZGV2LCBQUF9MaW5lQ1RMKSAmIH4oU0VSSUFMX1RYX09OIHwgU0VSSUFMX1JYX09OKSk7CisgICAgICAgICAgICAgICAgZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gYmFkX291dDsKKwl9CisKKyAgICAgICAgLyogc2V0IHRoZSBoYXJkd2FyZSB0byB0aGUgY29uZmlndXJlZCBjaG9pY2UgKi8KKwlzd2l0Y2gobHAtPmFkYXB0ZXJfY25mICYgQV9DTkZfTUVESUFfVFlQRSkgeworCWNhc2UgQV9DTkZfTUVESUFfMTBCX1Q6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZGV0ZWN0X3RwKGRldik7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdD09REVURUNURURfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IDEwQmFzZS1UIChSSi00NSkgaGFzIG5vIGNhYmxlXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxwLT5hdXRvX25lZ19jbmYgJiBJTU1fQklUKSAvKiBjaGVjayAiaWdub3JlIG1pc3NpbmcgbWVkaWEiIGJpdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBERVRFQ1RFRF9SSjQ1SDsgLyogWWVzISBJIGRvbid0IGNhcmUgaWYgSSBzZWUgYSBsaW5rIHB1bHNlICovCisgICAgICAgICAgICAgICAgfQorCQlicmVhazsKKwljYXNlIEFfQ05GX01FRElBX0FVSToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBkZXRlY3RfYXVpKGRldik7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdD09REVURUNURURfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IDEwQmFzZS01IChBVUkpIGhhcyBubyBjYWJsZVxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChscC0+YXV0b19uZWdfY25mICYgSU1NX0JJVCkgLyogY2hlY2sgImlnbm9yZSBtaXNzaW5nIG1lZGlhIiBiaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gREVURUNURURfQVVJOyAvKiBZZXMhIEkgZG9uJ3QgY2FyZSBpZiBJIHNlZSBhIGNhcnJyaWVyICovCisgICAgICAgICAgICAgICAgfQorCQlicmVhazsKKwljYXNlIEFfQ05GX01FRElBXzEwQl8yOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRldGVjdF9ibmMoZGV2KTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0PT1ERVRFQ1RFRF9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogMTBCYXNlLTIgKEJOQykgaGFzIG5vIGNhYmxlXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxwLT5hdXRvX25lZ19jbmYgJiBJTU1fQklUKSAvKiBjaGVjayAiaWdub3JlIG1pc3NpbmcgbWVkaWEiIGJpdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBERVRFQ1RFRF9CTkM7IC8qIFllcyEgSSBkb24ndCBjYXJlIGlmIEkgY2FuIHhtaXQgYSBwYWNrZXQgKi8KKyAgICAgICAgICAgICAgICB9CisJCWJyZWFrOworCWNhc2UgQV9DTkZfTUVESUFfQVVUTzoKKwkJd3JpdGVyZWcoZGV2LCBQUF9MaW5lQ1RMLCBscC0+bGluZWN0bCB8IEFVVE9fQVVJXzEwQkFTRVQpOworCQlpZiAobHAtPmFkYXB0ZXJfY25mICYgQV9DTkZfMTBCX1QpCisJCQlpZiAoKHJlc3VsdCA9IGRldGVjdF90cChkZXYpKSAhPSBERVRFQ1RFRF9OT05FKQorCQkJCWJyZWFrOworCQlpZiAobHAtPmFkYXB0ZXJfY25mICYgQV9DTkZfQVVJKQorCQkJaWYgKChyZXN1bHQgPSBkZXRlY3RfYXVpKGRldikpICE9IERFVEVDVEVEX05PTkUpCisJCQkJYnJlYWs7CisJCWlmIChscC0+YWRhcHRlcl9jbmYgJiBBX0NORl8xMEJfMikKKwkJCWlmICgocmVzdWx0ID0gZGV0ZWN0X2JuYyhkZXYpKSAhPSBERVRFQ1RFRF9OT05FKQorCQkJCWJyZWFrOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBtZWRpYSBkZXRlY3RlZFxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICBnb3RvIHJlbGVhc2VfaXJxOworCX0KKwlzd2l0Y2gocmVzdWx0KSB7CisJY2FzZSBERVRFQ1RFRF9OT05FOgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBuZXR3b3JrIGNhYmxlIGF0dGFjaGVkIHRvIGNvbmZpZ3VyZWQgbWVkaWFcbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgZ290byByZWxlYXNlX2lycTsKKwljYXNlIERFVEVDVEVEX1JKNDVIOgorCQlwcmludGsoS0VSTl9JTkZPICIlczogdXNpbmcgaGFsZi1kdXBsZXggMTBCYXNlLVQgKFJKLTQ1KVxuIiwgZGV2LT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBERVRFQ1RFRF9SSjQ1RjoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHVzaW5nIGZ1bGwtZHVwbGV4IDEwQmFzZS1UIChSSi00NSlcbiIsIGRldi0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgREVURUNURURfQVVJOgorCQlwcmludGsoS0VSTl9JTkZPICIlczogdXNpbmcgMTBCYXNlLTUgKEFVSSlcbiIsIGRldi0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgREVURUNURURfQk5DOgorCQlwcmludGsoS0VSTl9JTkZPICIlczogdXNpbmcgMTBCYXNlLTIgKEJOQylcbiIsIGRldi0+bmFtZSk7CisJCWJyZWFrOworCX0KKworCS8qIFR1cm4gb24gYm90aCByZWNlaXZlIGFuZCB0cmFuc21pdCBvcGVyYXRpb25zICovCisJd3JpdGVyZWcoZGV2LCBQUF9MaW5lQ1RMLCByZWFkcmVnKGRldiwgUFBfTGluZUNUTCkgfCBTRVJJQUxfUlhfT04gfCBTRVJJQUxfVFhfT04pOworCisJLyogUmVjZWl2ZSBvbmx5IGVycm9yIGZyZWUgcGFja2V0cyBhZGRyZXNzZWQgdG8gdGhpcyBjYXJkICovCisJbHAtPnJ4X21vZGUgPSAwOworCXdyaXRlcmVnKGRldiwgUFBfUnhDVEwsIERFRl9SWF9BQ0NFUFQpOworCisJbHAtPmN1cnJfcnhfY2ZnID0gUlhfT0tfRU5CTCB8IFJYX0NSQ19FUlJPUl9FTkJMOworCisJaWYgKGxwLT5pc2FfY29uZmlnICYgU1RSRUFNX1RSQU5TRkVSKQorCQlscC0+Y3Vycl9yeF9jZmcgfD0gUlhfU1RSRUFNX0VOQkw7CisjaWYgQUxMT1dfRE1BCisJc2V0X2RtYV9jZmcoZGV2KTsKKyNlbmRpZgorCXdyaXRlcmVnKGRldiwgUFBfUnhDRkcsIGxwLT5jdXJyX3J4X2NmZyk7CisKKwl3cml0ZXJlZyhkZXYsIFBQX1R4Q0ZHLCBUWF9MT1NUX0NSU19FTkJMIHwgVFhfU1FFX0VSUk9SX0VOQkwgfCBUWF9PS19FTkJMIHwKKwkJVFhfTEFURV9DT0xfRU5CTCB8IFRYX0pCUl9FTkJMIHwgVFhfQU5ZX0NPTF9FTkJMIHwgVFhfMTZfQ09MX0VOQkwpOworCisJd3JpdGVyZWcoZGV2LCBQUF9CdWZDRkcsIFJFQURZX0ZPUl9UWF9FTkJMIHwgUlhfTUlTU19DT1VOVF9PVlJGTE9XX0VOQkwgfAorI2lmIEFMTE9XX0RNQQorCQlkbWFfYnVmY2ZnKGRldikgfAorI2VuZGlmCisJCVRYX0NPTF9DT1VOVF9PVlJGTE9XX0VOQkwgfCBUWF9VTkRFUlJVTl9FTkJMKTsKKworCS8qIG5vdyB0aGF0IHdlJ3ZlIGdvdCBvdXIgYWN0IHRvZ2V0aGVyLCBlbmFibGUgZXZlcnl0aGluZyAqLworCXdyaXRlcmVnKGRldiwgUFBfQnVzQ1RMLCBFTkFCTEVfSVJRCisJCSB8IChkZXYtPm1lbV9zdGFydD9NRU1PUllfT04gOiAwKSAvKiB0dXJuIG1lbW9yeSBvbiAqLworI2lmIEFMTE9XX0RNQQorCQkgfCBkbWFfYnVzY3RsKGRldikKKyNlbmRpZgorICAgICAgICAgICAgICAgICApOworICAgICAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCWlmIChuZXRfZGVidWcgPiAxKQorCQlwcmludGsoImNzODl4MDogbmV0X29wZW4oKSBzdWNjZWVkZWRcbiIpOworCXJldHVybiAwOworYmFkX291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBuZXRfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIElmIHdlIGdldCBoZXJlLCBzb21lIGhpZ2hlciBsZXZlbCBoYXMgZGVjaWRlZCB3ZSBhcmUgYnJva2VuLgorCSAgIFRoZXJlIHNob3VsZCByZWFsbHkgYmUgYSAia2ljayBtZSIgZnVuY3Rpb24gY2FsbCBpbnN0ZWFkLiAqLworCWlmIChuZXRfZGVidWcgPiAwKSBwcmludGsoIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsICVzP1xuIiwgZGV2LT5uYW1lLAorCQkgICB0eF9kb25lKGRldikgPyAiSVJRIGNvbmZsaWN0ID8iIDogIm5ldHdvcmsgY2FibGUgcHJvYmxlbSIpOworCS8qIFRyeSB0byByZXN0YXJ0IHRoZSBhZGFwdG9yLiAqLworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBuZXRfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAobmV0X2RlYnVnID4gMykgeworCQlwcmludGsoIiVzOiBzZW50ICVkIGJ5dGUgcGFja2V0IG9mIHR5cGUgJXhcbiIsCisJCQlkZXYtPm5hbWUsIHNrYi0+bGVuLAorCQkJKHNrYi0+ZGF0YVtFVEhfQUxFTitFVEhfQUxFTl0gPDwgOCkgfCBza2ItPmRhdGFbRVRIX0FMRU4rRVRIX0FMRU4rMV0pOworCX0KKworCS8qIGtlZXAgdGhlIHVwbG9hZCBmcm9tIGJlaW5nIGludGVycnVwdGVkLCBzaW5jZSB3ZQorICAgICAgICAgICAgICAgICAgYXNrIHRoZSBjaGlwIHRvIHN0YXJ0IHRyYW5zbWl0dGluZyBiZWZvcmUgdGhlCisgICAgICAgICAgICAgICAgICB3aG9sZSBwYWNrZXQgaGFzIGJlZW4gY29tcGxldGVseSB1cGxvYWRlZC4gKi8KKworCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBpbml0aWF0ZSBhIHRyYW5zbWl0IHNlcXVlbmNlICovCisJd3JpdGV3b3JkKGRldiwgVFhfQ01EX1BPUlQsIGxwLT5zZW5kX2NtZCk7CisJd3JpdGV3b3JkKGRldiwgVFhfTEVOX1BPUlQsIHNrYi0+bGVuKTsKKworCS8qIFRlc3QgdG8gc2VlIGlmIHRoZSBjaGlwIGhhcyBhbGxvY2F0ZWQgbWVtb3J5IGZvciB0aGUgcGFja2V0ICovCisJaWYgKChyZWFkcmVnKGRldiwgUFBfQnVzU1QpICYgUkVBRFlfRk9SX1RYX05PVykgPT0gMCkgeworCQkvKgorCQkgKiBHYXNwISAgSXQgaGFzbid0LiAgQnV0IHRoYXQgc2hvdWxkbid0IGhhcHBlbiBzaW5jZQorCQkgKiB3ZSdyZSB3YWl0aW5nIGZvciBUeE9rLCBzbyByZXR1cm4gMSBhbmQgcmVxdWV1ZSB0aGlzIHBhY2tldC4KKwkJICovCisJCQorCQlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKwkJaWYgKG5ldF9kZWJ1ZykgcHJpbnRrKCJjczg5eDA6IFR4IGJ1ZmZlciBub3QgZnJlZSFcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJLyogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBwYWNrZXQgKi8KKwlvdXRzdyhkZXYtPmJhc2VfYWRkciArIFRYX0ZSQU1FX1BPUlQsc2tiLT5kYXRhLChza2ItPmxlbisxKSA+PjEpOworCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCWRldl9rZnJlZV9za2IgKHNrYik7CisKKwkvKgorCSAqIFdlIERPIE5PVCBjYWxsIG5ldGlmX3dha2VfcXVldWUoKSBoZXJlLgorCSAqIFdlIGFsc28gRE8gTk9UIGNhbGwgbmV0aWZfc3RhcnRfcXVldWUoKS4KKwkgKgorCSAqIEVpdGhlciBvZiB0aGVzZSB3b3VsZCBjYXVzZSBhbm90aGVyIGJvdHRvbSBoYWxmIHJ1biB0aHJvdWdoCisJICogbmV0X3NlbmRfcGFja2V0KCkgYmVmb3JlIHRoaXMgcGFja2V0IGhhcyBmdWxseSBnb25lIG91dC4gIFRoYXQgY2F1c2VzCisJICogdXMgdG8gaGl0IHRoZSAiR2FzcCEiIGFib3ZlIGFuZCB0aGUgc2VuZCBpcyByZXNjaGVkdWxlZC4gIGl0IHJ1bnMgbGlrZQorCSAqIGEgZG9nLiAgV2UganVzdCByZXR1cm4gYW5kIHdhaXQgZm9yIHRoZSBUeCBjb21wbGV0aW9uIGludGVycnVwdCBoYW5kbGVyCisJICogdG8gcmVzdGFydCB0aGUgbmV0ZGV2aWNlIGxheWVyCisJICovCisKKwlyZXR1cm4gMDsKK30KKwwKKy8qIFRoZSB0eXBpY2FsIHdvcmtsb2FkIG9mIHRoZSBkcml2ZXI6CisgICBIYW5kbGUgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGludGVycnVwdHMuICovCisgICAKK3N0YXRpYyBpcnFyZXR1cm5fdCBuZXRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IG5ldF9sb2NhbCAqbHA7CisJaW50IGlvYWRkciwgc3RhdHVzOworIAlpbnQgaGFuZGxlZCA9IDA7CisKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiB3ZSBNVVNUIHJlYWQgYWxsIHRoZSBldmVudHMgb3V0IG9mIHRoZSBJU1EsIG90aGVyd2lzZSB3ZSdsbCBuZXZlcgorICAgICAgICAgICBnZXQgaW50ZXJydXB0ZWQgYWdhaW4uICBBcyBhIGNvbnNlcXVlbmNlLCB3ZSBjYW4ndCBoYXZlIGFueSBsaW1pdAorICAgICAgICAgICBvbiB0aGUgbnVtYmVyIG9mIHRpbWVzIHdlIGxvb3AgaW4gdGhlIGludGVycnVwdCBoYW5kbGVyLiAgVGhlCisgICAgICAgICAgIGhhcmR3YXJlIGd1YXJhbnRlZXMgdGhhdCBldmVudHVhbGx5IHdlJ2xsIHJ1biBvdXQgb2YgZXZlbnRzLiAgT2YKKyAgICAgICAgICAgY291cnNlLCBpZiB5b3UncmUgb24gYSBzbG93IG1hY2hpbmUsIGFuZCBwYWNrZXRzIGFyZSBhcnJpdmluZworICAgICAgICAgICBmYXN0ZXIgdGhhbiB5b3UgY2FuIHJlYWQgdGhlbSBvZmYsIHlvdSdyZSBzY3Jld2VkLiAgSGFzdGEgbGEKKyAgICAgICAgICAgdmlzdGEsIGJhYnkhICAqLworCXdoaWxlICgoc3RhdHVzID0gcmVhZHdvcmQoZGV2LCBJU1FfUE9SVCkpKSB7CisJCWlmIChuZXRfZGVidWcgPiA0KXByaW50aygiJXM6IGV2ZW50PSUwNHhcbiIsIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJaGFuZGxlZCA9IDE7CisJCXN3aXRjaChzdGF0dXMgJiBJU1FfRVZFTlRfTUFTSykgeworCQljYXNlIElTUV9SRUNFSVZFUl9FVkVOVDoKKwkJCS8qIEdvdCBhIHBhY2tldChzKS4gKi8KKwkJCW5ldF9yeChkZXYpOworCQkJYnJlYWs7CisJCWNhc2UgSVNRX1RSQU5TTUlUVEVSX0VWRU5UOgorCQkJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsJLyogSW5mb3JtIHVwcGVyIGxheWVycy4gKi8KKwkJCWlmICgoc3RhdHVzICYgKAlUWF9PSyB8CisJCQkJCVRYX0xPU1RfQ1JTIHwKKwkJCQkJVFhfU1FFX0VSUk9SIHwKKwkJCQkJVFhfTEFURV9DT0wgfAorCQkJCQlUWF8xNl9DT0wpKSAhPSBUWF9PSykgeworCQkJCWlmICgoc3RhdHVzICYgVFhfT0spID09IDApIGxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgVFhfTE9TVF9DUlMpIGxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiBUWF9TUUVfRVJST1IpIGxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIFRYX0xBVEVfQ09MKSBscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiBUWF8xNl9DT0wpIGxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgSVNRX0JVRkZFUl9FVkVOVDoKKwkJCWlmIChzdGF0dXMgJiBSRUFEWV9GT1JfVFgpIHsKKwkJCQkvKiB3ZSB0cmllZCB0byB0cmFuc21pdCBhIHBhY2tldCBlYXJsaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgaW5leHBsaWNhYmx5IHJhbiBvdXQgb2YgYnVmZmVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhhdCBzaG91bGRuJ3QgaGFwcGVuIHNpbmNlIHdlIG9ubHkgZXZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkIG9uZSBwYWNrZXQuICBTaHJ1Zy4gIERvIHRoZSByaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluZyBhbnl3YXkuICovCisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwkvKiBJbmZvcm0gdXBwZXIgbGF5ZXJzLiAqLworCQkJfQorCQkJaWYgKHN0YXR1cyAmIFRYX1VOREVSUlVOKSB7CisJCQkJaWYgKG5ldF9kZWJ1ZyA+IDApIHByaW50aygiJXM6IHRyYW5zbWl0IHVuZGVycnVuXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+c2VuZF91bmRlcnJ1bisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobHAtPnNlbmRfdW5kZXJydW4gPT0gMykgbHAtPnNlbmRfY21kID0gVFhfQUZURVJfMzgxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChscC0+c2VuZF91bmRlcnJ1biA9PSA2KSBscC0+c2VuZF9jbWQgPSBUWF9BRlRFUl9BTEw7CisJCQkJLyogdHJhbnNtaXQgY3ljbGUgaXMgZG9uZSwgYWx0aG91Z2gKKwkJCQkgICBmcmFtZSB3YXNuJ3QgdHJhbnNtaXR0ZWQgLSB0aGlzCisJCQkJICAgYXZvaWRzIGhhdmluZyB0byB3YWl0IGZvciB0aGUgdXBwZXIKKwkJCQkgICBsYXllcnMgdG8gdGltZW91dCBvbiB1cywgaW4gdGhlCisJCQkJICAgZXZlbnQgb2YgYSB0eCB1bmRlcnJ1biAqLworCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsJLyogSW5mb3JtIHVwcGVyIGxheWVycy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNpZiBBTExPV19ETUEKKwkJCWlmIChscC0+dXNlX2RtYSAmJiAoc3RhdHVzICYgUlhfRE1BKSkgeworCQkJCWludCBjb3VudCA9IHJlYWRyZWcoZGV2LCBQUF9EbWFGcmFtZUNudCk7CisJCQkJd2hpbGUoY291bnQpIHsKKwkJCQkJaWYgKG5ldF9kZWJ1ZyA+IDUpCisJCQkJCQlwcmludGsoIiVzOiByZWNlaXZpbmcgJWQgRE1BIGZyYW1lc1xuIiwgZGV2LT5uYW1lLCBjb3VudCk7CisJCQkJCWlmIChuZXRfZGVidWcgPiAyICYmIGNvdW50ID4xKQorCQkJCQkJcHJpbnRrKCIlczogcmVjZWl2aW5nICVkIERNQSBmcmFtZXNcbiIsIGRldi0+bmFtZSwgY291bnQpOworCQkJCQlkbWFfcngoZGV2KTsKKwkJCQkJaWYgKC0tY291bnQgPT0gMCkKKwkJCQkJCWNvdW50ID0gcmVhZHJlZyhkZXYsIFBQX0RtYUZyYW1lQ250KTsKKwkJCQkJaWYgKG5ldF9kZWJ1ZyA+IDIgJiYgY291bnQgPiAwKQorCQkJCQkJcHJpbnRrKCIlczogY29udGludWluZyB3aXRoICVkIERNQSBmcmFtZXNcbiIsIGRldi0+bmFtZSwgY291bnQpOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQkJYnJlYWs7CisJCWNhc2UgSVNRX1JYX01JU1NfRVZFTlQ6CisJCQlscC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSAoc3RhdHVzID4+Nik7CisJCQlicmVhazsKKwkJY2FzZSBJU1FfVFhfQ09MX0VWRU5UOgorCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKHN0YXR1cyA+PjYpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKK3N0YXRpYyB2b2lkCitjb3VudF9yeF9lcnJvcnMoaW50IHN0YXR1cywgc3RydWN0IG5ldF9sb2NhbCAqbHApCit7CisJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCWlmIChzdGF0dXMgJiBSWF9SVU5UKSBscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCWlmIChzdGF0dXMgJiBSWF9FWFRSQV9EQVRBKSBscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCWlmIChzdGF0dXMgJiBSWF9DUkNfRVJST1IpIGlmICghKHN0YXR1cyAmIChSWF9FWFRSQV9EQVRBfFJYX1JVTlQpKSkKKwkJLyogcGVyIHN0ciAxNzIgKi8KKwkJbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgUlhfRFJJQkJMRSkgbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCXJldHVybjsKK30KKworLyogV2UgaGF2ZSBhIGdvb2QgcGFja2V0KHMpLCBnZXQgaXQvdGhlbSBvdXQgb2YgdGhlIGJ1ZmZlcnMuICovCitzdGF0aWMgdm9pZAorbmV0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHN0YXR1cywgbGVuZ3RoOworCisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0YXR1cyA9IGludyhpb2FkZHIgKyBSWF9GUkFNRV9QT1JUKTsKKwlsZW5ndGggPSBpbncoaW9hZGRyICsgUlhfRlJBTUVfUE9SVCk7CisKKwlpZiAoKHN0YXR1cyAmIFJYX09LKSA9PSAwKSB7CisJCWNvdW50X3J4X2Vycm9ycyhzdGF0dXMsIGxwKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLiAqLworCXNrYiA9IGRldl9hbGxvY19za2IobGVuZ3RoICsgMik7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisjaWYgMAkJLyogQWdhaW4sIHRoaXMgc2VlbXMgYSBjcnVlbCB0aGluZyB0byBkbyAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKwlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBsb25nd29yZCBhbGlnbiBMMyBoZWFkZXIgKi8KKwlza2ItPmRldiA9IGRldjsKKworCWluc3coaW9hZGRyICsgUlhfRlJBTUVfUE9SVCwgc2tiX3B1dChza2IsIGxlbmd0aCksIGxlbmd0aCA+PiAxKTsKKwlpZiAobGVuZ3RoICYgMSkKKwkJc2tiLT5kYXRhW2xlbmd0aC0xXSA9IGludyhpb2FkZHIgKyBSWF9GUkFNRV9QT1JUKTsKKworCWlmIChuZXRfZGVidWcgPiAzKSB7CisJCXByaW50aygJIiVzOiByZWNlaXZlZCAlZCBieXRlIHBhY2tldCBvZiB0eXBlICV4XG4iLAorCQkJZGV2LT5uYW1lLCBsZW5ndGgsCisJCQkoc2tiLT5kYXRhW0VUSF9BTEVOK0VUSF9BTEVOXSA8PCA4KSB8IHNrYi0+ZGF0YVtFVEhfQUxFTitFVEhfQUxFTisxXSk7CisJfQorCisgICAgICAgIHNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJbmV0aWZfcngoc2tiKTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbmd0aDsKK30KKworI2lmIEFMTE9XX0RNQQorc3RhdGljIHZvaWQgcmVsZWFzZV9kbWFfYnVmZihzdHJ1Y3QgbmV0X2xvY2FsICpscCkKK3sKKwlpZiAobHAtPmRtYV9idWZmKSB7CisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpKGxwLT5kbWFfYnVmZiksIGdldF9vcmRlcihscC0+ZG1hc2l6ZSAqIDEwMjQpKTsKKwkJbHAtPmRtYV9idWZmID0gTlVMTDsKKwl9Cit9CisjZW5kaWYKKworLyogVGhlIGludmVyc2Ugcm91dGluZSB0byBuZXRfb3BlbigpLiAqLworc3RhdGljIGludAorbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisjaWYgQUxMT1dfRE1BCisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworI2VuZGlmCisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJd3JpdGVyZWcoZGV2LCBQUF9SeENGRywgMCk7CisJd3JpdGVyZWcoZGV2LCBQUF9UeENGRywgMCk7CisJd3JpdGVyZWcoZGV2LCBQUF9CdWZDRkcsIDApOworCXdyaXRlcmVnKGRldiwgUFBfQnVzQ1RMLCAwKTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisjaWYgQUxMT1dfRE1BCisJaWYgKGxwLT51c2VfZG1hICYmIGxwLT5kbWEpIHsKKwkJZnJlZV9kbWEoZGV2LT5kbWEpOworCQlyZWxlYXNlX2RtYV9idWZmKGxwKTsKKwl9CisjZW5kaWYKKworCS8qIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyBoZXJlLiAqLworCXJldHVybiAwOworfQorCisvKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4JVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvcgorICAgY2xvc2VkLiAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKK25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCS8qIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyBmcm9tIHRoZSBkZXZpY2UgcmVnaXN0ZXJzLiAqLworCWxwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IChyZWFkcmVnKGRldiwgUFBfUnhNaXNzKSA+PiA2KTsKKwlscC0+c3RhdHMuY29sbGlzaW9ucyArPSAocmVhZHJlZyhkZXYsIFBQX1R4Q29sKSA+PiA2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJaWYoZGV2LT5mbGFncyZJRkZfUFJPTUlTQykKKwl7CisJCWxwLT5yeF9tb2RlID0gUlhfQUxMX0FDQ0VQVDsKKwl9CisJZWxzZSBpZigoZGV2LT5mbGFncyZJRkZfQUxMTVVMVEkpfHxkZXYtPm1jX2xpc3QpCisJeworCQkvKiBUaGUgbXVsdGljYXN0LWFjY2VwdCBsaXN0IGlzIGluaXRpYWxpemVkIHRvIGFjY2VwdC1hbGwsIGFuZCB3ZQorCQkgICByZWx5IG9uIGhpZ2hlci1sZXZlbCBmaWx0ZXJpbmcgZm9yIG5vdy4gKi8KKwkJbHAtPnJ4X21vZGUgPSBSWF9NVUxUQ0FTVF9BQ0NFUFQ7CisJfSAKKwllbHNlCisJCWxwLT5yeF9tb2RlID0gMDsKKworCXdyaXRlcmVnKGRldiwgUFBfUnhDVEwsIERFRl9SWF9BQ0NFUFQgfCBscC0+cnhfbW9kZSk7CisKKwkvKiBpbiBwcm9taXNjdW91cyBtb2RlLCB3ZSBhY2NlcHQgZXJyb3JlZCBwYWNrZXRzLCBzbyB3ZSBoYXZlIHRvIGVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZW0gYWxzbyAqLworCXdyaXRlcmVnKGRldiwgUFBfUnhDRkcsIGxwLT5jdXJyX3J4X2NmZyB8CisJICAgICAobHAtPnJ4X21vZGUgPT0gUlhfQUxMX0FDQ0VQVD8gKFJYX0NSQ19FUlJPUl9FTkJMfFJYX1JVTlRfRU5CTHxSWF9FWFRSQV9EQVRBX0VOQkwpIDogMCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIGludCBzZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworCisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCisJaWYgKG5ldF9kZWJ1ZykgeworCQlwcmludGsoIiVzOiBTZXR0aW5nIE1BQyBhZGRyZXNzIHRvICIsIGRldi0+bmFtZSk7CisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPmFkZHJfbGVuOyBpKyspCisJCQlwcmludGsoIiAlMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0pOworCQlwcmludGsoIi5cbiIpOworCX0KKwkvKiBzZXQgdGhlIEV0aGVybmV0IGFkZHJlc3MgKi8KKwlmb3IgKGk9MDsgaSA8IEVUSF9BTEVOLzI7IGkrKykKKwkJd3JpdGVyZWcoZGV2LCBQUF9JQStpKjIsIGRldi0+ZGV2X2FkZHJbaSoyXSB8IChkZXYtPmRldl9hZGRyW2kqMisxXSA8PCA4KSk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIE1PRFVMRQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9jczg5eDA7CisKKy8qCisgKiBTdXBwb3J0IHRoZSAnZGVidWcnIG1vZHVsZSBwYXJtIGV2ZW4gaWYgd2UncmUgY29tcGlsZWQgZm9yIG5vbi1kZWJ1ZyB0byAKKyAqIGF2b2lkIGJyZWFraW5nIHNvbWVvbmUncyBzdGFydHVwIHNjcmlwdHMgCisgKi8KKworc3RhdGljIGludCBpbzsKK3N0YXRpYyBpbnQgaXJxOworc3RhdGljIGludCBkZWJ1ZzsKK3N0YXRpYyBjaGFyIG1lZGlhWzhdOworc3RhdGljIGludCBkdXBsZXg9LTE7CisKK3N0YXRpYyBpbnQgdXNlX2RtYTsJCQkvKiBUaGVzZSBnZW5lcmF0ZSB1bnVzZWQgdmFyIHdhcm5pbmdzIGlmIEFMTE9XX0RNQSA9IDAgKi8KK3N0YXRpYyBpbnQgZG1hOworc3RhdGljIGludCBkbWFzaXplPTE2OwkJCS8qIG9yIDY0ICovCisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW1fc3RyaW5nKG1lZGlhLCBtZWRpYSwgc2l6ZW9mKG1lZGlhKSwgMCk7Cittb2R1bGVfcGFyYW0oZHVwbGV4LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRtYSAsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZG1hc2l6ZSAsIGludCwgMCk7Cittb2R1bGVfcGFyYW0odXNlX2RtYSAsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiY3M4OXgwIEkvTyBiYXNlIGFkZHJlc3MiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiY3M4OXgwIElSUSBudW1iZXIiKTsKKyNpZiBERUJVR0dJTkcKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJjczg5eDAgZGVidWcgbGV2ZWwgKDAtNikiKTsKKyNlbHNlCitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiKGlnbm9yZWQpIik7CisjZW5kaWYKK01PRFVMRV9QQVJNX0RFU0MobWVkaWEsICJTZXQgY3M4OXgwIGFkYXB0ZXIocykgbWVkaWEgdHlwZShzKSAocmo0NSxibmMsYXVpKSIpOworLyogTm8gb3RoZXIgdmFsdWUgdGhhbiAtMSBmb3IgZHVwbGV4IHNlZW1zIHRvIGJlIGN1cnJlbnRseSBpbnRlcnByZXRlZCAqLworTU9EVUxFX1BBUk1fREVTQyhkdXBsZXgsICIoaWdub3JlZCkiKTsKKyNpZiBBTExPV19ETUEKK01PRFVMRV9QQVJNX0RFU0MoZG1hICwgImNzODl4MCBJU0EgRE1BIGNoYW5uZWw7IGlnbm9yZWQgaWYgdXNlX2RtYT0wIik7CitNT0RVTEVfUEFSTV9ERVNDKGRtYXNpemUgLCAiY3M4OXgwIERNQSBzaXplIGluIGtCICgxNiw2NCk7IGlnbm9yZWQgaWYgdXNlX2RtYT0wIik7CitNT0RVTEVfUEFSTV9ERVNDKHVzZV9kbWEgLCAiY3M4OXgwIHVzaW5nIERNQSAoMC0xKSIpOworI2Vsc2UKK01PRFVMRV9QQVJNX0RFU0MoZG1hICwgIihpZ25vcmVkKSIpOworTU9EVUxFX1BBUk1fREVTQyhkbWFzaXplICwgIihpZ25vcmVkKSIpOworTU9EVUxFX1BBUk1fREVTQyh1c2VfZG1hICwgIihpZ25vcmVkKSIpOworI2VuZGlmCisKK01PRFVMRV9BVVRIT1IoIk1pa2UgQ3J1c2UsIFJ1c3N3bGwgTmVsc29uIDxuZWxzb25AY3J5bndyLmNvbT4sIEFuZHJldyBNb3J0b24gPGFuZHJld21AdW93LmVkdS5hdT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCisvKgorKiBtZWRpYT10ICAgICAgICAgICAgIC0gc3BlY2lmeSBtZWRpYSB0eXBlCisgICBvciBtZWRpYT0yCisgICBvciBtZWRpYT1hdWkKKyAgIG9yIG1lZGFpPWF1dG8KKyogZHVwbGV4PTAgICAgICAgICAgICAtIHNwZWNpZnkgZm9yY2VkIGhhbGYvZnVsbC9hdXRvbmVnb3RpYXRlIGR1cGxleAorKiBkZWJ1Zz0jICAgICAgICAgICAgIC0gZGVidWcgbGV2ZWwKKworCisqIERlZmF1bHQgQ2hpcCBDb25maWd1cmF0aW9uOgorICAqIERNQSBCdXJzdCA9IGVuYWJsZWQKKyAgKiBJT0NIUkRZIEVuYWJsZWQgPSBlbmFibGVkCisgICAgKiBVc2VTQSA9IGVuYWJsZWQKKyAgICAqIENTODkwMCBkZWZhdWx0cyB0byBoYWxmLWR1cGxleCBpZiBub3Qgc3BlY2lmaWVkIG9uIGNvbW1hbmQtbGluZQorICAgICogQ1M4OTIwIGRlZmF1bHRzIHRvIGF1dG9uZWcgaWYgbm90IHNwZWNpZmllZCBvbiBjb21tYW5kLWxpbmUKKyAgICAqIFVzZSByZXNldCBkZWZhdWx0cyBmb3Igb3RoZXIgY29uZmlnIHBhcmFtZXRlcnMKKworKiBBc3N1bXB0aW9uczoKKyAgKiBtZWRpYSB0eXBlIHNwZWNpZmllZCBpcyBzdXBwb3J0ZWQgKGNpcmN1aXRyeSBpcyBwcmVzZW50KQorICAqIGlmIG1lbW9yeSBhZGRyZXNzIGlzID4gMU1CLCB0aGVuIHJlcXVpcmVkIG1lbSBkZWNvZGUgaHcgaXMgcHJlc2VudAorICAqIGlmIDEwQi0yLCB0aGVuIGFnZW50IG90aGVyIHRoYW4gZHJpdmVyIHdpbGwgZW5hYmxlIERDL0RDIGNvbnZlcnRlcgorICAgIChodyBvciBzb2Z0d2FyZSB1dGlsKQorCisKKyovCisKK2ludAoraW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscDsKKwlpbnQgcmV0ID0gMDsKKworI2lmIERFQlVHR0lORworCW5ldF9kZWJ1ZyA9IGRlYnVnOworI2Vsc2UKKwlkZWJ1ZyA9IDA7CisjZW5kaWYKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXYtPmlycSA9IGlycTsKKwlkZXYtPmJhc2VfYWRkciA9IGlvOworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworI2lmIEFMTE9XX0RNQQorCWlmICh1c2VfZG1hKSB7CisJCWxwLT51c2VfZG1hID0gdXNlX2RtYTsKKwkJbHAtPmRtYSA9IGRtYTsKKwkJbHAtPmRtYXNpemUgPSBkbWFzaXplOworCX0KKyNlbmRpZgorCisJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKworICAgICAgICAvKiBib3ksIHRoZXknZCBiZXR0ZXIgZ2V0IHRoZXNlIHJpZ2h0ICovCisgICAgICAgIGlmICghc3RyY21wKG1lZGlhLCAicmo0NSIpKQorCQlscC0+YWRhcHRlcl9jbmYgPSBBX0NORl9NRURJQV8xMEJfVCB8IEFfQ05GXzEwQl9UOworCWVsc2UgaWYgKCFzdHJjbXAobWVkaWEsICJhdWkiKSkKKwkJbHAtPmFkYXB0ZXJfY25mID0gQV9DTkZfTUVESUFfQVVJICAgfCBBX0NORl9BVUk7CisJZWxzZSBpZiAoIXN0cmNtcChtZWRpYSwgImJuYyIpKQorCQlscC0+YWRhcHRlcl9jbmYgPSBBX0NORl9NRURJQV8xMEJfMiB8IEFfQ05GXzEwQl8yOworCWVsc2UKKwkJbHAtPmFkYXB0ZXJfY25mID0gQV9DTkZfTUVESUFfMTBCX1QgfCBBX0NORl8xMEJfVDsKKworICAgICAgICBpZiAoZHVwbGV4PT0tMSkKKwkJbHAtPmF1dG9fbmVnX2NuZiA9IEFVVE9fTkVHX0VOQUJMRTsKKworICAgICAgICBpZiAoaW8gPT0gMCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiY3M4OXgwLmM6IE1vZHVsZSBhdXRvcHJvYmluZyBub3QgYWxsb3dlZC5cbiIpOworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiY3M4OXgwLmM6IEFwcGVuZCBpbz0weE5OTlxuIik7CisgICAgICAgICAgICAgICAgcmV0ID0gLUVQRVJNOworCQlnb3RvIG91dDsKKyAgICAgICAgfSBlbHNlIGlmIChpbyA8PSAweDFmZikgeworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gb3V0OworCX0KKworI2lmIEFMTE9XX0RNQQorCWlmICh1c2VfZG1hICYmIGRtYXNpemUgIT0gMTYgJiYgZG1hc2l6ZSAhPSA2NCkgeworCQlwcmludGsoS0VSTl9FUlIgImNzODl4MC5jOiBkbWEgc2l6ZSBtdXN0IGJlIGVpdGhlciAxNksgb3IgNjRLLCBub3QgJWRLXG4iLCBkbWFzaXplKTsKKwkJcmV0ID0gLUVQRVJNOworCQlnb3RvIG91dDsKKwl9CisjZW5kaWYKKwlyZXQgPSBjczg5eDBfcHJvYmUxKGRldiwgaW8sIDEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisgICAgICAgIGlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJjczg5eDAuYzogTm8gY2FyZCBmb3VuZCBhdCAweCV4XG4iLCBpbyk7CisgICAgICAgICAgICAgICAgcmV0ID0gLUVOWElPOworCQlvdXR3KFBQX0NoaXBJRCwgZGV2LT5iYXNlX2FkZHIgKyBBRERfUE9SVCk7CisJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBORVRDQVJEX0lPX0VYVEVOVCk7CisJCWdvdG8gb3V0OworICAgICAgICB9CisJZGV2X2NzODl4MCA9IGRldjsKKwlyZXR1cm4gMDsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2X2NzODl4MCk7CisJb3V0dyhQUF9DaGlwSUQsIGRldl9jczg5eDAtPmJhc2VfYWRkciArIEFERF9QT1JUKTsKKwlyZWxlYXNlX3JlZ2lvbihkZXZfY3M4OXgwLT5iYXNlX2FkZHIsIE5FVENBUkRfSU9fRVhURU5UKTsKKwlmcmVlX25ldGRldihkZXZfY3M4OXgwKTsKK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgdmVyc2lvbi1jb250cm9sOiB0CisgKiAga2VwdC1uZXctdmVyc2lvbnM6IDUKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3M4OXgwLmggYi9kcml2ZXJzL25ldC9jczg5eDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGVmN2FkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY3M4OXgwLmgKQEAgLTAsMCArMSw0NzYgQEAKKy8qICBDb3B5cmlnaHQsIDE5ODgtMTk5MiwgUnVzc2VsbCBOZWxzb24sIENyeW53ciBTb2Z0d2FyZQorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMS4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAgICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2lmZGVmIENPTkZJR19BUkNIX0lYRFAyWDAxCisvKiBJWERQMjQwMS9JWERQMjgwMSB1c2VzIGR3b3JkLWFsaWduZWQgcmVnaXN0ZXIgYWRkcmVzc2luZyAqLworI2RlZmluZSBDUzg5eDBfUE9SVChyZWcpICgocmVnKSAqIDIpCisjZWxzZQorI2RlZmluZSBDUzg5eDBfUE9SVChyZWcpIChyZWcpCisjZW5kaWYKKworI2RlZmluZSBQUF9DaGlwSUQgMHgwMDAwCS8qIG9mZnNldCAgIDBoIC0+IENvcnAgLUlEICAgICAgICAgICAgICAqLworCQkJCS8qIG9mZnNldCAgIDJoIC0+IE1vZGVsL1Byb2R1Y3QgTnVtYmVyICAqLworCQkJCS8qIG9mZnNldCAgIDNoIC0+IENoaXAgUmV2aXNpb24gTnVtYmVyICAqLworCisjZGVmaW5lIFBQX0lTQUlPQiAweDAwMjAJLyogIElPIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBQUF9DUzg5MDBfSVNBSU5UIDB4MDAyMgkvKiAgSVNBIGludGVycnVwdCBzZWxlY3QgKi8KKyNkZWZpbmUgUFBfQ1M4OTIwX0lTQUlOVCAweDAzNzAJLyogIElTQSBpbnRlcnJ1cHQgc2VsZWN0ICovCisjZGVmaW5lIFBQX0NTODkwMF9JU0FETUEgMHgwMDI0CS8qICBJU0EgUmVjIERNQSBjaGFubmVsICovCisjZGVmaW5lIFBQX0NTODkyMF9JU0FETUEgMHgwMzc0CS8qICBJU0EgUmVjIERNQSBjaGFubmVsICovCisjZGVmaW5lIFBQX0lTQVNPRiAweDAwMjYJLyogIElTQSBETUEgb2Zmc2V0ICovCisjZGVmaW5lIFBQX0RtYUZyYW1lQ250IDB4MDAyOAkvKiAgSVNBIERNQSBGcmFtZSBjb3VudCAqLworI2RlZmluZSBQUF9EbWFCeXRlQ250IDB4MDAyQQkvKiAgSVNBIERNQSBCeXRlIGNvdW50ICovCisjZGVmaW5lIFBQX0NTODkwMF9JU0FNZW1CIDB4MDAyQwkvKiAgTWVtb3J5IGJhc2UgKi8KKyNkZWZpbmUgUFBfQ1M4OTIwX0lTQU1lbUIgMHgwMzQ4IC8qICAqLworCisjZGVmaW5lIFBQX0lTQUJvb3RCYXNlIDB4MDAzMAkvKiAgQm9vdCBQcm9tIGJhc2UgICovCisjZGVmaW5lIFBQX0lTQUJvb3RNYXNrIDB4MDAzNAkvKiAgQm9vdCBQcm9tIE1hc2sgKi8KKworLyogRUVQUk9NIGRhdGEgYW5kIGNvbW1hbmQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBQX0VFQ01EIDB4MDA0MAkJLyogIE5WUiBJbnRlcmZhY2UgQ29tbWFuZCByZWdpc3RlciAqLworI2RlZmluZSBQUF9FRURhdGEgMHgwMDQyCS8qICBOVlIgSW50ZXJmYWNlIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFBfRGVidWdSZWcgMHgwMDQ0CS8qICBEZWJ1ZyBSZWdpc3RlciAqLworCisjZGVmaW5lIFBQX1J4Q0ZHIDB4MDEwMgkJLyogIFJ4IEJ1cyBjb25maWcgKi8KKyNkZWZpbmUgUFBfUnhDVEwgMHgwMTA0CQkvKiAgUmVjZWl2ZSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFBQX1R4Q0ZHIDB4MDEwNgkJLyogIFRyYW5zbWl0IENvbmZpZyBSZWdpc3RlciAqLworI2RlZmluZSBQUF9UeENNRCAweDAxMDgJCS8qICBUcmFuc21pdCBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lIFBQX0J1ZkNGRyAweDAxMEEJLyogIEJ1cyBjb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIFBQX0xpbmVDVEwgMHgwMTEyCS8qICBMaW5lIENvbmZpZyBSZWdpc3RlciAqLworI2RlZmluZSBQUF9TZWxmQ1RMIDB4MDExNAkvKiAgU2VsZiBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lIFBQX0J1c0NUTCAweDAxMTYJLyogIElTQSBidXMgY29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBQUF9UZXN0Q1RMIDB4MDExOAkvKiAgVGVzdCBSZWdpc3RlciAqLworI2RlZmluZSBQUF9BdXRvTmVnQ1RMIDB4MDExQwkvKiAgQXV0byBOZWdvdGlhdGlvbiBDdHJsICovCisKKyNkZWZpbmUgUFBfSVNRIDB4MDEyMAkJLyogIEludGVycnVwdCBTdGF0dXMgKi8KKyNkZWZpbmUgUFBfUnhFdmVudCAweDAxMjQJLyogIFJ4IEV2ZW50IFJlZ2lzdGVyICovCisjZGVmaW5lIFBQX1R4RXZlbnQgMHgwMTI4CS8qICBUeCBFdmVudCBSZWdpc3RlciAqLworI2RlZmluZSBQUF9CdWZFdmVudCAweDAxMkMJLyogIEJ1cyBFdmVudCBSZWdpc3RlciAqLworI2RlZmluZSBQUF9SeE1pc3MgMHgwMTMwCS8qICBSZWNlaXZlIE1pc3MgQ291bnQgKi8KKyNkZWZpbmUgUFBfVHhDb2wgMHgwMTMyCQkvKiAgVHJhbnNtaXQgQ29sbGlzaW9uIENvdW50ICovCisjZGVmaW5lIFBQX0xpbmVTVCAweDAxMzQJLyogIExpbmUgU3RhdGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUFBfU2VsZlNUIDB4MDEzNgkvKiAgU2VsZiBTdGF0ZSByZWdpc3RlciAqLworI2RlZmluZSBQUF9CdXNTVCAweDAxMzgJCS8qICBCdXMgU3RhdHVzICovCisjZGVmaW5lIFBQX1REUiAweDAxM0MJCS8qICBUaW1lIERvbWFpbiBSZWZsZWN0b21ldHJ5ICovCisjZGVmaW5lIFBQX0F1dG9OZWdTVCAweDAxM0UJLyogIEF1dG8gTmVnIFN0YXR1cyAqLworI2RlZmluZSBQUF9UeENvbW1hbmQgMHgwMTQ0CS8qICBUeCBDb21tYW5kICovCisjZGVmaW5lIFBQX1R4TGVuZ3RoIDB4MDE0NgkvKiAgVHggTGVuZ3RoICovCisjZGVmaW5lIFBQX0xBRiAweDAxNTAJCS8qICBIYXNoIFRhYmxlICovCisjZGVmaW5lIFBQX0lBIDB4MDE1OAkJLyogIFBoeXNpY2FsIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBQUF9SeFN0YXR1cyAweDA0MDAJLyogIFJlY2VpdmUgc3RhcnQgb2YgZnJhbWUgKi8KKyNkZWZpbmUgUFBfUnhMZW5ndGggMHgwNDAyCS8qICBSZWNlaXZlIExlbmd0aCBvZiBmcmFtZSAqLworI2RlZmluZSBQUF9SeEZyYW1lIDB4MDQwNAkvKiAgUmVjZWl2ZSBmcmFtZSBwb2ludGVyICovCisjZGVmaW5lIFBQX1R4RnJhbWUgMHgwQTAwCS8qICBUcmFuc21pdCBmcmFtZSBwb2ludGVyICovCisKKy8qICBQcmltYXJ5IEkvTyBCYXNlIEFkZHJlc3MuIElmIG5vIEkvTyBiYXNlIGlzIHN1cHBsaWVkIGJ5IHRoZSB1c2VyLCB0aGVuIHRoaXMgKi8KKy8qICBjYW4gYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBJL08gYmFzZSB0byBhY2Nlc3MgdGhlIFBhY2tldFBhZ2UgQXJlYS4gKi8KKyNkZWZpbmUgREVGQVVMVElPQkFTRSAweDAzMDAKKyNkZWZpbmUgRklSU1RfSU8gMHgwMjBDCQkvKiAgRmlyc3QgSS9PIHBvcnQgdG8gY2hlY2sgKi8KKyNkZWZpbmUgTEFTVF9JTyAweDAzN0MJCS8qICBMYXN0IEkvTyBwb3J0IHRvIGNoZWNrICgrMTBoKSAqLworI2RlZmluZSBBRERfTUFTSyAweDMwMDAJCS8qICBNYXNrIGl0IHVzZSBvZiB0aGUgQUREX1BPUlQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQUREX1NJRyAweDMwMDAJCS8qICBFeHBlY3RlZCBJRCBzaWduYXR1cmUgKi8KKworLyogT24gTWFjcywgd2Ugb25seSBuZWVkIHVzZSB0aGUgSVNBIEkvTyBzdHVmZiB1bnRpbCB3ZSBkbyBNRU1PUllfT04gKi8KKyNpZmRlZiBDT05GSUdfTUFDCisjZGVmaW5lIExDU0xPVEJBU0UgMHhmZWUwMDAwMAorI2RlZmluZSBNTUlPQkFTRSAweDQwMDAwCisjZW5kaWYKKworI2RlZmluZSBDSElQX0VJU0FfSURfU0lHIDB4NjMwRSAgIC8qICBQcm9kdWN0IElEIENvZGUgZm9yIENyeXN0YWwgQ2hpcCAoQ1M4OTAwIHNwZWMgNC4zKSAqLworCisjaWZkZWYgSUJNRUlQS1QKKyNkZWZpbmUgRUlTQV9JRF9TSUcgMHg0RDI0CS8qICBJQk0gKi8KKyNkZWZpbmUgUEFSVF9OT19TSUcgMHgxMDEwCS8qICBJQk0gKi8KKyNkZWZpbmUgTU9OR09PU0VfQklUIDB4MDAwMAkvKiAgSUJNICovCisjZWxzZQorI2RlZmluZSBFSVNBX0lEX1NJRyAweDYzMEUJLyogIFBuUCBWZW5kb3IgSUQgKHNhbWUgYXMgY2hpcCBpZCBmb3IgQ3J5c3RhbCBib2FyZCkgKi8KKyNkZWZpbmUgUEFSVF9OT19TSUcgMHg0MDAwCS8qICBJRCBjb2RlIENTODkyMCBib2FyZCAoUG5QIFZlbmRvciBQcm9kdWN0IGNvZGUpICovCisjZGVmaW5lIE1PTkdPT1NFX0JJVCAweDIwMDAJLyogIFBBUlRfTk9fU0lHICsgTU9OR09PU0VfQlVUID0+IElEIG9mIG1vbmdvb3NlICovCisjZW5kaWYKKworI2RlZmluZSBQUk9EVUNUX0lEX0FERCAweDAwMDIgICAvKiAgQWRkcmVzcyBvZiBwcm9kdWN0IElEICovCisKKy8qICBNYXNrIHRvIGZpbmQgb3V0IHRoZSB0eXBlcyBvZiAgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJFR19UWVBFX01BU0sgMHgwMDFGCisKKy8qICBFZXByb20gQ29tbWFuZHMgKi8KKyNkZWZpbmUgRVJTRV9XUl9FTkJMIDB4MDBGMAorI2RlZmluZSBFUlNFX1dSX0RJU0FCTEUgMHgwMDAwCisKKy8qICBEZWZpbmVzIENvbnRyb2wvQ29uZmlnIHJlZ2lzdGVyIHF1aW50dXBsZXQgbnVtYmVycyAqLworI2RlZmluZSBSWF9CVUZfQ0ZHIDB4MDAwMworI2RlZmluZSBSWF9DT05UUk9MIDB4MDAwNQorI2RlZmluZSBUWF9DRkcgMHgwMDA3CisjZGVmaW5lIFRYX0NPTU1BTkQgMHgwMDA5CisjZGVmaW5lIEJVRl9DRkcgMHgwMDBCCisjZGVmaW5lIExJTkVfQ09OVFJPTCAweDAwMTMKKyNkZWZpbmUgU0VMRl9DT05UUk9MIDB4MDAxNQorI2RlZmluZSBCVVNfQ09OVFJPTCAweDAwMTcKKyNkZWZpbmUgVEVTVF9DT05UUk9MIDB4MDAxOQorCisvKiAgRGVmaW5lcyBTdGF0dXMvQ291bnQgcmVnaXN0ZXJzIHF1aW50dXBsZXQgbnVtYmVycyAqLworI2RlZmluZSBSWF9FVkVOVCAweDAwMDQKKyNkZWZpbmUgVFhfRVZFTlQgMHgwMDA4CisjZGVmaW5lIEJVRl9FVkVOVCAweDAwMEMKKyNkZWZpbmUgUlhfTUlTU19DT1VOVCAweDAwMTAKKyNkZWZpbmUgVFhfQ09MX0NPVU5UIDB4MDAxMgorI2RlZmluZSBMSU5FX1NUQVRVUyAweDAwMTQKKyNkZWZpbmUgU0VMRl9TVEFUVVMgMHgwMDE2CisjZGVmaW5lIEJVU19TVEFUVVMgMHgwMDE4CisjZGVmaW5lIFREUiAweDAwMUMKKworLyogUFBfUnhDRkcgLSBSZWNlaXZlICBDb25maWd1cmF0aW9uIGFuZCBJbnRlcnJ1cHQgTWFzayBiaXQgZGVmaW5pdGlvbiAtICBSZWFkL3dyaXRlICovCisjZGVmaW5lIFNLSVBfMSAweDAwNDAKKyNkZWZpbmUgUlhfU1RSRUFNX0VOQkwgMHgwMDgwCisjZGVmaW5lIFJYX09LX0VOQkwgMHgwMTAwCisjZGVmaW5lIFJYX0RNQV9PTkxZIDB4MDIwMAorI2RlZmluZSBBVVRPX1JYX0RNQSAweDA0MDAKKyNkZWZpbmUgQlVGRkVSX0NSQyAweDA4MDAKKyNkZWZpbmUgUlhfQ1JDX0VSUk9SX0VOQkwgMHgxMDAwCisjZGVmaW5lIFJYX1JVTlRfRU5CTCAweDIwMDAKKyNkZWZpbmUgUlhfRVhUUkFfREFUQV9FTkJMIDB4NDAwMAorCisvKiBQUF9SeENUTCAtIFJlY2VpdmUgQ29udHJvbCBiaXQgZGVmaW5pdGlvbiAtIFJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgUlhfSUFfSEFTSF9BQ0NFUFQgMHgwMDQwCisjZGVmaW5lIFJYX1BST01fQUNDRVBUIDB4MDA4MAorI2RlZmluZSBSWF9PS19BQ0NFUFQgMHgwMTAwCisjZGVmaW5lIFJYX01VTFRDQVNUX0FDQ0VQVCAweDAyMDAKKyNkZWZpbmUgUlhfSUFfQUNDRVBUIDB4MDQwMAorI2RlZmluZSBSWF9CUk9BRENBU1RfQUNDRVBUIDB4MDgwMAorI2RlZmluZSBSWF9CQURfQ1JDX0FDQ0VQVCAweDEwMDAKKyNkZWZpbmUgUlhfUlVOVF9BQ0NFUFQgMHgyMDAwCisjZGVmaW5lIFJYX0VYVFJBX0RBVEFfQUNDRVBUIDB4NDAwMAorI2RlZmluZSBSWF9BTExfQUNDRVBUIChSWF9QUk9NX0FDQ0VQVHxSWF9CQURfQ1JDX0FDQ0VQVHxSWF9SVU5UX0FDQ0VQVHxSWF9FWFRSQV9EQVRBX0FDQ0VQVCkKKy8qICBEZWZhdWx0IHJlY2VpdmUgbW9kZSAtIGluZGl2aWR1YWxseSBhZGRyZXNzZWQsIGJyb2FkY2FzdCwgYW5kIGVycm9yIGZyZWUgKi8KKyNkZWZpbmUgREVGX1JYX0FDQ0VQVCAoUlhfSUFfQUNDRVBUIHwgUlhfQlJPQURDQVNUX0FDQ0VQVCB8IFJYX09LX0FDQ0VQVCkKKworLyogUFBfVHhDRkcgLSBUcmFuc21pdCBDb25maWd1cmF0aW9uIEludGVycnVwdCBNYXNrIGJpdCBkZWZpbml0aW9uIC0gUmVhZC93cml0ZSAqLworI2RlZmluZSBUWF9MT1NUX0NSU19FTkJMIDB4MDA0MAorI2RlZmluZSBUWF9TUUVfRVJST1JfRU5CTCAweDAwODAKKyNkZWZpbmUgVFhfT0tfRU5CTCAweDAxMDAKKyNkZWZpbmUgVFhfTEFURV9DT0xfRU5CTCAweDAyMDAKKyNkZWZpbmUgVFhfSkJSX0VOQkwgMHgwNDAwCisjZGVmaW5lIFRYX0FOWV9DT0xfRU5CTCAweDA4MDAKKyNkZWZpbmUgVFhfMTZfQ09MX0VOQkwgMHg4MDAwCisKKy8qIFBQX1R4Q01EIC0gVHJhbnNtaXQgQ29tbWFuZCBiaXQgZGVmaW5pdGlvbiAtIFJlYWQtb25seSAqLworI2RlZmluZSBUWF9TVEFSVF80X0JZVEVTIDB4MDAwMAorI2RlZmluZSBUWF9TVEFSVF82NF9CWVRFUyAweDAwNDAKKyNkZWZpbmUgVFhfU1RBUlRfMTI4X0JZVEVTIDB4MDA4MAorI2RlZmluZSBUWF9TVEFSVF9BTExfQllURVMgMHgwMEMwCisjZGVmaW5lIFRYX0ZPUkNFIDB4MDEwMAorI2RlZmluZSBUWF9PTkVfQ09MIDB4MDIwMAorI2RlZmluZSBUWF9UV09fUEFSVF9ERUZGX0RJU0FCTEUgMHgwNDAwCisjZGVmaW5lIFRYX05PX0NSQyAweDEwMDAKKyNkZWZpbmUgVFhfUlVOVCAweDIwMDAKKworLyogUFBfQnVmQ0ZHIC0gQnVmZmVyIENvbmZpZ3VyYXRpb24gSW50ZXJydXB0IE1hc2sgYml0IGRlZmluaXRpb24gLSBSZWFkL3dyaXRlICovCisjZGVmaW5lIEdFTkVSQVRFX1NXX0lOVEVSUlVQVCAweDAwNDAKKyNkZWZpbmUgUlhfRE1BX0VOQkwgMHgwMDgwCisjZGVmaW5lIFJFQURZX0ZPUl9UWF9FTkJMIDB4MDEwMAorI2RlZmluZSBUWF9VTkRFUlJVTl9FTkJMIDB4MDIwMAorI2RlZmluZSBSWF9NSVNTX0VOQkwgMHgwNDAwCisjZGVmaW5lIFJYXzEyOF9CWVRFX0VOQkwgMHgwODAwCisjZGVmaW5lIFRYX0NPTF9DT1VOVF9PVlJGTE9XX0VOQkwgMHgxMDAwCisjZGVmaW5lIFJYX01JU1NfQ09VTlRfT1ZSRkxPV19FTkJMIDB4MjAwMAorI2RlZmluZSBSWF9ERVNUX01BVENIX0VOQkwgMHg4MDAwCisKKy8qIFBQX0xpbmVDVEwgLSBMaW5lIENvbnRyb2wgYml0IGRlZmluaXRpb24gLSBSZWFkL3dyaXRlICovCisjZGVmaW5lIFNFUklBTF9SWF9PTiAweDAwNDAKKyNkZWZpbmUgU0VSSUFMX1RYX09OIDB4MDA4MAorI2RlZmluZSBBVUlfT05MWSAweDAxMDAKKyNkZWZpbmUgQVVUT19BVUlfMTBCQVNFVCAweDAyMDAKKyNkZWZpbmUgTU9ESUZJRURfQkFDS09GRiAweDA4MDAKKyNkZWZpbmUgTk9fQVVUT19QT0xBUklUWSAweDEwMDAKKyNkZWZpbmUgVFdPX1BBUlRfREVGRElTIDB4MjAwMAorI2RlZmluZSBMT1dfUlhfU1FVRUxDSCAweDQwMDAKKworLyogUFBfU2VsZkNUTCAtIFNvZnR3YXJlIFNlbGYgQ29udHJvbCBiaXQgZGVmaW5pdGlvbiAtIFJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgUE9XRVJfT05fUkVTRVQgMHgwMDQwCisjZGVmaW5lIFNXX1NUT1AgMHgwMTAwCisjZGVmaW5lIFNMRUVQX09OIDB4MDIwMAorI2RlZmluZSBBVVRPX1dBS0VVUCAweDA0MDAKKyNkZWZpbmUgSENCMF9FTkJMIDB4MTAwMAorI2RlZmluZSBIQ0IxX0VOQkwgMHgyMDAwCisjZGVmaW5lIEhDQjAgMHg0MDAwCisjZGVmaW5lIEhDQjEgMHg4MDAwCisKKy8qIFBQX0J1c0NUTCAtIElTQSBCdXMgQ29udHJvbCBiaXQgZGVmaW5pdGlvbiAtIFJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgUkVTRVRfUlhfRE1BIDB4MDA0MAorI2RlZmluZSBNRU1PUllfT04gMHgwNDAwCisjZGVmaW5lIERNQV9CVVJTVF9NT0RFIDB4MDgwMAorI2RlZmluZSBJT19DSEFOTkVMX1JFQURZX09OIDB4MTAwMAorI2RlZmluZSBSWF9ETUFfU0laRV82NEsgMHgyMDAwCisjZGVmaW5lIEVOQUJMRV9JUlEgMHg4MDAwCisKKy8qIFBQX1Rlc3RDVEwgLSBUZXN0IENvbnRyb2wgYml0IGRlZmluaXRpb24gLSBSZWFkL3dyaXRlICovCisjZGVmaW5lIExJTktfT0ZGIDB4MDA4MAorI2RlZmluZSBFTkRFQ19MT09QQkFDSyAweDAyMDAKKyNkZWZpbmUgQVVJX0xPT1BCQUNLIDB4MDQwMAorI2RlZmluZSBCQUNLT0ZGX09GRiAweDA4MDAKKyNkZWZpbmUgRkRYXzg5MDAgMHg0MDAwCisjZGVmaW5lIEZBU1RfVEVTVCAweDgwMDAKKworLyogUFBfUnhFdmVudCAtIFJlY2VpdmUgRXZlbnQgQml0IGRlZmluaXRpb24gLSBSZWFkLW9ubHkgKi8KKyNkZWZpbmUgUlhfSUFfSEFTSEVEIDB4MDA0MAorI2RlZmluZSBSWF9EUklCQkxFIDB4MDA4MAorI2RlZmluZSBSWF9PSyAweDAxMDAKKyNkZWZpbmUgUlhfSEFTSEVEIDB4MDIwMAorI2RlZmluZSBSWF9JQSAweDA0MDAKKyNkZWZpbmUgUlhfQlJPQURDQVNUIDB4MDgwMAorI2RlZmluZSBSWF9DUkNfRVJST1IgMHgxMDAwCisjZGVmaW5lIFJYX1JVTlQgMHgyMDAwCisjZGVmaW5lIFJYX0VYVFJBX0RBVEEgMHg0MDAwCisKKyNkZWZpbmUgSEFTSF9JTkRFWF9NQVNLIDB4MEZDMDAKKworLyogUFBfVHhFdmVudCAtIFRyYW5zbWl0IEV2ZW50IEJpdCBkZWZpbml0aW9uIC0gUmVhZC1vbmx5ICovCisjZGVmaW5lIFRYX0xPU1RfQ1JTIDB4MDA0MAorI2RlZmluZSBUWF9TUUVfRVJST1IgMHgwMDgwCisjZGVmaW5lIFRYX09LIDB4MDEwMAorI2RlZmluZSBUWF9MQVRFX0NPTCAweDAyMDAKKyNkZWZpbmUgVFhfSkJSIDB4MDQwMAorI2RlZmluZSBUWF8xNl9DT0wgMHg4MDAwCisjZGVmaW5lIFRYX1NFTkRfT0tfQklUUyAoVFhfT0t8VFhfTE9TVF9DUlMpCisjZGVmaW5lIFRYX0NPTF9DT1VOVF9NQVNLIDB4NzgwMAorCisvKiBQUF9CdWZFdmVudCAtIEJ1ZmZlciBFdmVudCBCaXQgZGVmaW5pdGlvbiAtIFJlYWQtb25seSAqLworI2RlZmluZSBTV19JTlRFUlJVUFQgMHgwMDQwCisjZGVmaW5lIFJYX0RNQSAweDAwODAKKyNkZWZpbmUgUkVBRFlfRk9SX1RYIDB4MDEwMAorI2RlZmluZSBUWF9VTkRFUlJVTiAweDAyMDAKKyNkZWZpbmUgUlhfTUlTUyAweDA0MDAKKyNkZWZpbmUgUlhfMTI4X0JZVEUgMHgwODAwCisjZGVmaW5lIFRYX0NPTF9PVlJGTFcgMHgxMDAwCisjZGVmaW5lIFJYX01JU1NfT1ZSRkxXIDB4MjAwMAorI2RlZmluZSBSWF9ERVNUX01BVENIIDB4ODAwMAorCisvKiBQUF9MaW5lU1QgLSBFdGhlcm5ldCBMaW5lIFN0YXR1cyBiaXQgZGVmaW5pdGlvbiAtIFJlYWQtb25seSAqLworI2RlZmluZSBMSU5LX09LIDB4MDA4MAorI2RlZmluZSBBVUlfT04gMHgwMTAwCisjZGVmaW5lIFRFTkJBU0VUX09OIDB4MDIwMAorI2RlZmluZSBQT0xBUklUWV9PSyAweDEwMDAKKyNkZWZpbmUgQ1JTX09LIDB4NDAwMAorCisvKiBQUF9TZWxmU1QgLSBDaGlwIFNvZnR3YXJlIFN0YXR1cyBiaXQgZGVmaW5pdGlvbiAqLworI2RlZmluZSBBQ1RJVkVfMzNWIDB4MDA0MAorI2RlZmluZSBJTklUX0RPTkUgMHgwMDgwCisjZGVmaW5lIFNJX0JVU1kgMHgwMTAwCisjZGVmaW5lIEVFUFJPTV9QUkVTRU5UIDB4MDIwMAorI2RlZmluZSBFRVBST01fT0sgMHgwNDAwCisjZGVmaW5lIEVMX1BSRVNFTlQgMHgwODAwCisjZGVmaW5lIEVFX1NJWkVfNjQgMHgxMDAwCisKKy8qIFBQX0J1c1NUIC0gSVNBIEJ1cyBTdGF0dXMgYml0IGRlZmluaXRpb24gKi8KKyNkZWZpbmUgVFhfQklEX0VSUk9SIDB4MDA4MAorI2RlZmluZSBSRUFEWV9GT1JfVFhfTk9XIDB4MDEwMAorCisvKiBQUF9BdXRvTmVnQ1RMIC0gQXV0byBOZWdvdGlhdGlvbiBDb250cm9sIGJpdCBkZWZpbml0aW9uICovCisjZGVmaW5lIFJFX05FR19OT1cgMHgwMDQwCisjZGVmaW5lIEFMTE9XX0ZEWCAweDAwODAKKyNkZWZpbmUgQVVUT19ORUdfRU5BQkxFIDB4MDEwMAorI2RlZmluZSBOTFBfRU5BQkxFIDB4MDIwMAorI2RlZmluZSBGT1JDRV9GRFggMHg4MDAwCisjZGVmaW5lIEFVVE9fTkVHX0JJVFMgKEZPUkNFX0ZEWHxOTFBfRU5BQkxFfEFVVE9fTkVHX0VOQUJMRSkKKyNkZWZpbmUgQVVUT19ORUdfTUFTSyAoRk9SQ0VfRkRYfE5MUF9FTkFCTEV8QVVUT19ORUdfRU5BQkxFfEFMTE9XX0ZEWHxSRV9ORUdfTk9XKQorCisvKiBQUF9BdXRvTmVnU1QgLSBBdXRvIE5lZ290aWF0aW9uIFN0YXR1cyBiaXQgZGVmaW5pdGlvbiAqLworI2RlZmluZSBBVVRPX05FR19CVVNZIDB4MDA4MAorI2RlZmluZSBGTFBfTElOSyAweDAxMDAKKyNkZWZpbmUgRkxQX0xJTktfR09PRCAweDA4MDAKKyNkZWZpbmUgTElOS19GQVVMVCAweDEwMDAKKyNkZWZpbmUgSERYX0FDVElWRSAweDQwMDAKKyNkZWZpbmUgRkRYX0FDVElWRSAweDgwMDAKKworLyogIFRoZSBmb2xsb3dpbmcgYmxvY2sgZGVmaW5lcyB0aGUgSVNRIGV2ZW50IHR5cGVzICovCisjZGVmaW5lIElTUV9SRUNFSVZFUl9FVkVOVCAweDA0CisjZGVmaW5lIElTUV9UUkFOU01JVFRFUl9FVkVOVCAweDA4CisjZGVmaW5lIElTUV9CVUZGRVJfRVZFTlQgMHgwYworI2RlZmluZSBJU1FfUlhfTUlTU19FVkVOVCAweDEwCisjZGVmaW5lIElTUV9UWF9DT0xfRVZFTlQgMHgxMgorCisjZGVmaW5lIElTUV9FVkVOVF9NQVNLIDB4MDAzRiAgIC8qICBJU1EgbWFzayB0byBmaW5kIG91dCB0eXBlIG9mIGV2ZW50ICovCisjZGVmaW5lIElTUV9ISVNUIDE2CQkvKiAgc21hbGwgaGlzdG9yeSBidWZmZXIgKi8KKyNkZWZpbmUgQVVUT0lOQ1JFTUVOVCAweDgwMDAJLyogIEJpdCBtYXNrIHRvIHNldCBiaXQtMTUgZm9yIGF1dG9pbmNyZW1lbnQgKi8KKworI2RlZmluZSBUWFJYQlVGU0laRSAweDA2MDAKKyNkZWZpbmUgUlhETUFCVUZTSVpFIDB4ODAwMAorI2RlZmluZSBSWERNQVNJWkUgMHg0MDAwCisjZGVmaW5lIFRYUlhfTEVOR1RIX01BU0sgMHgwN0ZGCisKKy8qICByeCBvcHRpb25zIGJpdHMgKi8KKyNkZWZpbmUgUkNWX1dJVEhfUlhPTgkxICAgICAgIC8qICBTZXQgU2VyUnggT04gKi8KKyNkZWZpbmUgUkNWX0NPVU5UUwkyICAgICAgIC8qICBVc2UgRnJhbWVjbnQxICovCisjZGVmaW5lIFJDVl9QT05HCTQgICAgICAgLyogIFBvbmcgcmVzcG9uZGVudCAqLworI2RlZmluZSBSQ1ZfRE9ORwk4ICAgICAgIC8qICBEb25nIG9wZXJhdGlvbiAqLworI2RlZmluZSBSQ1ZfUE9MTElORwkweDEwCS8qICBQb2xsIFJ4RXZlbnQgKi8KKyNkZWZpbmUgUkNWX0lTUQkJMHgyMAkvKiAgVXNlIElTUSwgaW50ICovCisjZGVmaW5lIFJDVl9BVVRPX0RNQQkweDEwMAkvKiAgU2V0IEF1dG9SeERNQUUgKi8KKyNkZWZpbmUgUkNWX0RNQQkJMHgyMDAJLyogIFNldCBSeERNQSBvbmx5ICovCisjZGVmaW5lIFJDVl9ETUFfQUxMCTB4NDAwCS8qICBDb3B5IGFsbCBETUEnZWQgKi8KKyNkZWZpbmUgUkNWX0ZJWEVEX0RBVEEJMHg4MDAJLyogIEV2ZXJ5IGZyYW1lIHNhbWUgKi8KKyNkZWZpbmUgUkNWX0lPCQkweDEwMDAJLyogIFVzZSBJU0EgSU8gb25seSAqLworI2RlZmluZSBSQ1ZfTUVNT1JZCTB4MjAwMAkvKiAgVXNlIElTQSBNZW1vcnkgKi8KKworI2RlZmluZSBSQU1fU0laRQkweDEwMDAgICAgICAgLyogIFRoZSBjYXJkIGhhcyA0ayBieXRlcyBvciBSQU0gKi8KKyNkZWZpbmUgUEtUX1NUQVJUIFBQX1R4RnJhbWUgIC8qICBTdGFydCBvZiBwYWNrZXQgUkFNICovCisKKyNkZWZpbmUgUlhfRlJBTUVfUE9SVAlDUzg5eDBfUE9SVCgweDAwMDApCisjZGVmaW5lIFRYX0ZSQU1FX1BPUlQgUlhfRlJBTUVfUE9SVAorI2RlZmluZSBUWF9DTURfUE9SVAlDUzg5eDBfUE9SVCgweDAwMDQpCisjZGVmaW5lIFRYX05PVwkJMHgwMDAwICAgICAgIC8qICBUeCBwYWNrZXQgYWZ0ZXIgICA1IGJ5dGVzIGNvcGllZCAqLworI2RlZmluZSBUWF9BRlRFUl8zODEJMHgwMDQwICAgICAgIC8qICBUeCBwYWNrZXQgYWZ0ZXIgMzgxIGJ5dGVzIGNvcGllZCAqLworI2RlZmluZSBUWF9BRlRFUl9BTEwJMHgwMGMwICAgICAgIC8qICBUeCBwYWNrZXQgYWZ0ZXIgYWxsIGJ5dGVzIGNvcGllZCAqLworI2RlZmluZSBUWF9MRU5fUE9SVAlDUzg5eDBfUE9SVCgweDAwMDYpCisjZGVmaW5lIElTUV9QT1JUCUNTODl4MF9QT1JUKDB4MDAwOCkKKyNkZWZpbmUgQUREX1BPUlQJQ1M4OXgwX1BPUlQoMHgwMDBBKQorI2RlZmluZSBEQVRBX1BPUlQJQ1M4OXgwX1BPUlQoMHgwMDBDKQorCisjZGVmaW5lIEVFUFJPTV9XUklURV9FTgkJMHgwMEYwCisjZGVmaW5lIEVFUFJPTV9XUklURV9ESVMJMHgwMDAwCisjZGVmaW5lIEVFUFJPTV9XUklURV9DTUQJMHgwMTAwCisjZGVmaW5lIEVFUFJPTV9SRUFEX0NNRAkJMHgwMjAwCisKKy8qICBSZWNlaXZlIEhlYWRlciAqLworLyogIERlc2NyaXB0aW9uIG9mIGhlYWRlciBvZiBlYWNoIHBhY2tldCBpbiByZWNlaXZlIGFyZWEgb2YgbWVtb3J5ICovCisjZGVmaW5lIFJCVUZfRVZFTlRfTE9XCTAgICAvKiAgTG93IGJ5dGUgb2YgUnhFdmVudCAtIHN0YXR1cyBvZiByZWNlaXZlZCBmcmFtZSAqLworI2RlZmluZSBSQlVGX0VWRU5UX0hJR0gJMSAgIC8qICBIaWdoIGJ5dGUgb2YgUnhFdmVudCAtIHN0YXR1cyBvZiByZWNlaXZlZCBmcmFtZSAqLworI2RlZmluZSBSQlVGX0xFTl9MT1cJMiAgIC8qICBMZW5ndGggb2YgcmVjZWl2ZWQgZGF0YSAtIGxvdyBieXRlICovCisjZGVmaW5lIFJCVUZfTEVOX0hJCTMgICAvKiAgTGVuZ3RoIG9mIHJlY2VpdmVkIGRhdGEgLSBoaWdoIGJ5dGUgKi8KKyNkZWZpbmUgUkJVRl9IRUFEX0xFTgk0ICAgLyogIExlbmd0aCBvZiB0aGlzIGhlYWRlciAqLworCisjZGVmaW5lIENISVBfUkVBRCAweDEgICAvKiAgVXNlZCB0byBtYXJrIHN0YXRlIG9mIHRoZSByZXBpbnMgY29kZSAoY2hpcCBvciBkbWEpICovCisjZGVmaW5lIERNQV9SRUFEIDB4MiAgIC8qICBVc2VkIHRvIG1hcmsgc3RhdGUgb2YgdGhlIHJlcGlucyBjb2RlIChjaGlwIG9yIGRtYSkgKi8KKworLyogIGZvciBiaW9zIHNjYW4gKi8KKy8qICAqLworI2lmZGVmIENTREVCVUcKKy8qICB1c2UgdGhlc2UgdmFsdWVzIGZvciBkZWJ1Z2dpbmcgYmlvcyBzY2FuICovCisjZGVmaW5lIEJJT1NfU1RBUlRfU0VHIDB4MDAwMDAKKyNkZWZpbmUgQklPU19PRkZTRVRfSU5DIDB4MDAxMAorI2Vsc2UKKyNkZWZpbmUgQklPU19TVEFSVF9TRUcgMHgwYzAwMAorI2RlZmluZSBCSU9TX09GRlNFVF9JTkMgMHgwMjAwCisjZW5kaWYKKworI2RlZmluZSBCSU9TX0xBU1RfT0ZGU0VUIDB4MGZjMDAKKworLyogIEJ5dGUgb2Zmc2V0cyBpbnRvIHRoZSBFRVBST00gY29uZmlndXJhdGlvbiBidWZmZXIgKi8KKyNkZWZpbmUgSVNBX0NORl9PRkZTRVQgMHg2CisjZGVmaW5lIFRYX0NUTF9PRkZTRVQgKElTQV9DTkZfT0ZGU0VUICsgOCkJCQkvKiAgODkwMCBlZXByb20gKi8KKyNkZWZpbmUgQVVUT19ORUdfQ05GX09GRlNFVCAoSVNBX0NORl9PRkZTRVQgKyA4KQkJLyogIDg5MjAgZWVwcm9tICovCisKKyAgLyogIHRoZSBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCB0aGUgYml0cyBpbiB0aGUgZWVwcm9tIGFyZSBnZW5lcmFsbHkgICovCisgIC8qICBpbiB0aGUgc2FtZSBwb3NpdGlvbiBhcyB0aG9zZSBpbiB0aGUgYXV0b25lZ2N0bCByZWdpc3Rlci4gKi8KKyAgLyogIE9mIGNvdXJzZSB0aGUgSU1NIGJpdCBpcyBub3QgaW4gdGhhdCByZWdpc3RlciBzbyBpdCBtdXN0IGJlICAqLworICAvKiAgbWFza2VkIG91dCAqLworI2RlZmluZSBFRV9GT1JDRV9GRFggIDB4ODAwMAorI2RlZmluZSBFRV9OTFBfRU5BQkxFIDB4MDIwMAorI2RlZmluZSBFRV9BVVRPX05FR19FTkFCTEUgMHgwMTAwCisjZGVmaW5lIEVFX0FMTE9XX0ZEWCAweDAwODAKKyNkZWZpbmUgRUVfQVVUT19ORUdfQ05GX01BU0sgKEVFX0ZPUkNFX0ZEWHxFRV9OTFBfRU5BQkxFfEVFX0FVVE9fTkVHX0VOQUJMRXxFRV9BTExPV19GRFgpCisKKyNkZWZpbmUgSU1NX0JJVCAweDAwNDAJCS8qICBpZ25vcmUgbWlzc2luZyBtZWRpYQkgKi8KKworI2RlZmluZSBBREFQVEVSX0NORl9PRkZTRVQgKEFVVE9fTkVHX0NORl9PRkZTRVQgKyAyKQorI2RlZmluZSBBX0NORl8xMEJfVCAweDAwMDEKKyNkZWZpbmUgQV9DTkZfQVVJIDB4MDAwMgorI2RlZmluZSBBX0NORl8xMEJfMiAweDAwMDQKKyNkZWZpbmUgQV9DTkZfTUVESUFfVFlQRSAweDAwNzAKKyNkZWZpbmUgQV9DTkZfTUVESUFfQVVUTyAweDAwNzAKKyNkZWZpbmUgQV9DTkZfTUVESUFfMTBCX1QgMHgwMDIwCisjZGVmaW5lIEFfQ05GX01FRElBX0FVSSAweDAwNDAKKyNkZWZpbmUgQV9DTkZfTUVESUFfMTBCXzIgMHgwMDEwCisjZGVmaW5lIEFfQ05GX0RDX0RDX1BPTEFSSVRZIDB4MDA4MAorI2RlZmluZSBBX0NORl9OT19BVVRPX1BPTEFSSVRZIDB4MjAwMAorI2RlZmluZSBBX0NORl9MT1dfUlhfU1FVRUxDSCAweDQwMDAKKyNkZWZpbmUgQV9DTkZfRVhUTkRfMTBCXzIgMHg4MDAwCisKKyNkZWZpbmUgUEFDS0VUX1BBR0VfT0ZGU0VUIDB4OAorCisvKiAgQml0IGRlZmluaXRpb25zIGZvciB0aGUgSVNBIGNvbmZpZ3VyYXRpb24gd29yZCBmcm9tIHRoZSBFRVBST00gKi8KKyNkZWZpbmUgSU5UX05PX01BU0sgMHgwMDBGCisjZGVmaW5lIERNQV9OT19NQVNLIDB4MDA3MAorI2RlZmluZSBJU0FfRE1BX1NJWkUgMHgwMjAwCisjZGVmaW5lIElTQV9BVVRPX1J4RE1BIDB4MDQwMAorI2RlZmluZSBJU0FfUnhETUEgMHgwODAwCisjZGVmaW5lIERNQV9CVVJTVCAweDEwMDAKKyNkZWZpbmUgU1RSRUFNX1RSQU5TRkVSIDB4MjAwMAorI2RlZmluZSBBTllfSVNBX0RNQSAoSVNBX0FVVE9fUnhETUEgfCBJU0FfUnhETUEpCisKKy8qICBETUEgY29udHJvbGxlciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRE1BX0JBU0UgMHgwMCAgICAgLyogIERNQSBjb250cm9sbGVyIGJhc2UgKi8KKyNkZWZpbmUgRE1BX0JBU0VfMiAweDBDMCAgICAvKiAgRE1BIGNvbnRyb2xsZXIgYmFzZSAqLworCisjZGVmaW5lIERNQV9TVEFUIDB4MEQwICAgIC8qICBETUEgY29udHJvbGxlciBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX01BU0sgMHgwRDQgICAgLyogIERNQSBjb250cm9sbGVyIG1hc2sgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX01PREUgMHgwRDYgICAgLyogIERNQSBjb250cm9sbGVyIG1vZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRE1BX1JFU0VURkYgMHgwRDggICAgLyogIERNQSBjb250cm9sbGVyIGZpcnN0L2xhc3QgZmxpcCBmbG9wICovCisKKy8qICBETUEgZGF0YSAqLworI2RlZmluZSBETUFfRElTQUJMRSAweDA0ICAgICAvKiAgRGlzYWJsZSBjaGFubmVsIG4gKi8KKyNkZWZpbmUgRE1BX0VOQUJMRSAweDAwICAgICAvKiAgRW5hYmxlIGNoYW5uZWwgbiAqLworLyogIERlbWFuZCB0cmFuc2ZlcnMsIGluY3IuIGFkZHJlc3MsIGF1dG8gaW5pdCwgd3JpdGVzLCBjaC4gbiAqLworI2RlZmluZSBETUFfUlhfTU9ERSAweDE0CisvKiAgRGVtYW5kIHRyYW5zZmVycywgaW5jci4gYWRkcmVzcywgYXV0byBpbml0LCByZWFkcywgY2guIG4gKi8KKyNkZWZpbmUgRE1BX1RYX01PREUgMHgxOAorCisjZGVmaW5lIERNQV9TSVpFICgxNioxMDI0KSAvKiAgU2l6ZSBvZiBkbWEgYnVmZmVyIC0gMTZrICovCisKKyNkZWZpbmUgQ1M4OTAwIDB4MDAwMAorI2RlZmluZSBDUzg5MjAgMHg0MDAwICAgCisjZGVmaW5lIENTODkyME0gMHg2MDAwICAgCisjZGVmaW5lIFJFVklTT05fQklUUyAweDFGMDAKKyNkZWZpbmUgRUVWRVJfTlVNQkVSIDB4MTIKKyNkZWZpbmUgQ0hLU1VNX0xFTiAweDE0CisjZGVmaW5lIENIS1NVTV9WQUwgMHgwMDAwCisjZGVmaW5lIFNUQVJUX0VFUFJPTV9EQVRBIDB4MDAxYyAvKiAgT2Zmc2V0IGludG8gZWVwcm9tIGZvciBzdGFydCBvZiBkYXRhICovCisjZGVmaW5lIElSUV9NQVBfRUVQUk9NX0RBVEEgMHgwMDQ2IC8qICBPZmZzZXQgaW50byBlZXByb20gZm9yIHRoZSBJUlEgbWFwICovCisjZGVmaW5lIElSUV9NQVBfTEVOIDB4MDAwNCAvKiAgTm8gb2YgYnl0ZXMgdG8gcmVhZCBmb3IgdGhlIElSUSBtYXAgKi8KKyNkZWZpbmUgUE5QX0lSUV9GUk1UIDB4MDAyMiAvKiAgUE5QIHNtYWxsIGl0ZW0gSVJRIGZvcm1hdCAqLworI2lmZGVmIENPTkZJR19TSF9ISUNPU0g0CisjZGVmaW5lIENTODkwMF9JUlFfTUFQIDB4MDAwMiAvKiBIaUNPLVNINCBib2FyZCBoYXMgaXRzIElSUSBvbiAjMSAqLworI2Vsc2UKKyNkZWZpbmUgQ1M4OTAwX0lSUV9NQVAgMHgxYzIwIC8qICBUaGlzIElSUSBtYXAgaXMgZml4ZWQgKi8KKyNlbmRpZgorCisjZGVmaW5lIENTODkyMF9OT19JTlRTIDB4MEYgICAvKiAgTWF4IENTODkyMCBpbnRlcnJ1cHQgc2VsZWN0ICMgKi8KKworI2RlZmluZSBQTlBfQUREX1BPUlQgMHgwMjc5CisjZGVmaW5lIFBOUF9XUklURV9QT1JUIDB4MEE3OQorCisjZGVmaW5lIEdFVF9QTlBfSVNBX1NUUlVDVCAweDQwCisjZGVmaW5lIFBOUF9JU0FfU1RSVUNUX0xFTiAweDA2CisjZGVmaW5lIFBOUF9DU05fQ05UX09GRiAweDAxCisjZGVmaW5lIFBOUF9SRF9QT1JUX09GRiAweDAyCisjZGVmaW5lIFBOUF9GVU5DVElPTl9PSyAweDAwCisjZGVmaW5lIFBOUF9XQUtFIDB4MDMKKyNkZWZpbmUgUE5QX1JTUkNfREFUQSAweDA0CisjZGVmaW5lIFBOUF9SU1JDX1JFQURZIDB4MDEKKyNkZWZpbmUgUE5QX1NUQVRVUyAweDA1CisjZGVmaW5lIFBOUF9BQ1RJVkFURSAweDMwCisjZGVmaW5lIFBOUF9DTkZfSU9fSCAweDYwCisjZGVmaW5lIFBOUF9DTkZfSU9fTCAweDYxCisjZGVmaW5lIFBOUF9DTkZfSU5UIDB4NzAKKyNkZWZpbmUgUE5QX0NORl9ETUEgMHg3NAorI2RlZmluZSBQTlBfQ05GX01FTSAweDQ4CisKKyNkZWZpbmUgQklUMCAxCisjZGVmaW5lIEJJVDE1IDB4ODAwMAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZTYwMC5jIGIvZHJpdmVycy9uZXQvZGU2MDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmExMDBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZGU2MDAuYwpAQCAtMCwwICsxLDU2MSBAQAorc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0gImRlNjAwLmM6ICRSZXZpc2lvbjogMS40MS0yLjUgJCwgIEJqb3JuIEVrd2FsbCAoYmowcm5AYmxveC5zZSlcbiI7CisvKgorICoJZGU2MDAuYworICoKKyAqCUxpbnV4IGRyaXZlciBmb3IgdGhlIEQtTGluayBERS02MDAgRXRoZXJuZXQgcG9ja2V0IGFkYXB0ZXIuCisgKgorICoJUG9ydGlvbnMgKEMpIENvcHlyaWdodCAxOTkzLCAxOTk0IGJ5IEJqb3JuIEVrd2FsbAorICoJVGhlIEF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiajBybkBibG94LnNlCisgKgorICoJQmFzZWQgb24gYWRhcHRlciBpbmZvcm1hdGlvbiBnYXRoZXJlZCBmcm9tIERFNjAwLkFTTSBieSBELUxpbmsgSW5jLiwKKyAqCWFzIGluY2x1ZGVkIG9uIGRpc2sgQyBpbiB0aGUgdi4yLjExIG9mIFBDL1RDUCBmcm9tIEZUUCBTb2Z0d2FyZS4KKyAqCUZvciBERTYwMC5hc206CisgKgkJUG9ydGlvbnMgKEMpIENvcHlyaWdodCAxOTkwIEQtTGluaywgSW5jLgorICoJCUNvcHlyaWdodCwgMTk4OC0xOTkyLCBSdXNzZWxsIE5lbHNvbiwgQ3J5bndyIFNvZnR3YXJlCisgKgorICoJQWRhcHRlZCB0byB0aGUgc2FtcGxlIG5ldHdvcmsgZHJpdmVyIGNvcmUgZm9yIGxpbnV4LAorICoJd3JpdHRlbiBieTogRG9uYWxkIEJlY2tlciA8YmVja2VyQHN1cGVyLm9yZz4KKyAqCQkoTm93IGF0IDxiZWNrZXJAc2N5bGQuY29tPikKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKglhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBZGQgbW9yZSB0aW1lIGhlcmUgaWYgeW91ciBhZGFwdGVyIHdvbid0IHdvcmsgT0s6ICovCisjZGVmaW5lIERFNjAwX1NMT1dfRE9XTgl1ZGVsYXkoZGVsYXlfdGltZSkKKworIC8qCisgKiBJZiB5b3Ugc3RpbGwgaGF2ZSB0cm91YmxlIHJlYWRpbmcvd3JpdGluZyB0byB0aGUgYWRhcHRlciwKKyAqIG1vZGlmeSB0aGUgZm9sbG93aW5nICIjZGVmaW5lIjogKHNlZSA8YXNtL2lvLmg+IGZvciBtb3JlIGluZm8pCisjZGVmaW5lIFJFQUxMWV9TTE9XX0lPCisgKi8KKyNkZWZpbmUgU0xPV19JT19CWV9KVU1QSU5HIC8qIExvb2tzICJiZXR0ZXIiIHRoYW4gZHVtbXkgd3JpdGUgdG8gcG9ydCAweDgwIDotKSAqLworCisvKiB1c2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgdmVyaWZpY2F0aW9uLCA+MiBmb3IgZGVidWcgKi8KKyNpZmRlZiBERTYwMF9ERUJVRworI2RlZmluZSBQUklOVEsoeCkgaWYgKGRlNjAwX2RlYnVnID49IDIpIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBERTYwMF9ERUJVRyAwCisjZGVmaW5lIFBSSU5USyh4KSAvKiovCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJkZTYwMC5oIgorCitzdGF0aWMgdW5zaWduZWQgaW50IGRlNjAwX2RlYnVnID0gREU2MDBfREVCVUc7Cittb2R1bGVfcGFyYW0oZGU2MDBfZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlNjAwX2RlYnVnLCAiREUtNjAwIGRlYnVnIGxldmVsICgwLTIpIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2hlY2tfbG9zdCA9IDE7Cittb2R1bGVfcGFyYW0oY2hlY2tfbG9zdCwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGNoZWNrX2xvc3QsICJJZiBzZXQgdGhlbiBjaGVjayBmb3IgdW5wbHVnZ2VkIGRlNjAwIik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVsYXlfdGltZSA9IDEwOworbW9kdWxlX3BhcmFtKGRlbGF5X3RpbWUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlbGF5X3RpbWUsICJERS02MDAgZGVsZXkgb24gSS9PIGluIG1pY3Jvc2Vjb25kcyIpOworCisKKy8qCisgKiBELUxpbmsgZHJpdmVyIHZhcmlhYmxlczoKKyAqLworCitzdGF0aWMgdm9sYXRpbGUgaW50CQlyeF9wYWdlOworCisjZGVmaW5lIFRYX1BBR0VTIDIKK3N0YXRpYyB2b2xhdGlsZSBpbnQJCXR4X2ZpZm9bVFhfUEFHRVNdOworc3RhdGljIHZvbGF0aWxlIGludAkJdHhfZmlmb19pbjsKK3N0YXRpYyB2b2xhdGlsZSBpbnQJCXR4X2ZpZm9fb3V0Oworc3RhdGljIHZvbGF0aWxlIGludAkJZnJlZV90eF9wYWdlcyA9IFRYX1BBR0VTOworc3RhdGljIGludAkJCXdhc19kb3duOworc3RhdGljIERFRklORV9TUElOTE9DSyhkZTYwMF9sb2NrKTsKKworc3RhdGljIGlubGluZSB1OCBkZTYwMF9yZWFkX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXU4IHN0YXR1czsKKworCW91dGJfcChTVEFUVVMsIERBVEFfUE9SVCk7CisJc3RhdHVzID0gaW5iKFNUQVRVU19QT1JUKTsKKwlvdXRiX3AoTlVMTF9DT01NQU5EIHwgSElfTklCQkxFLCBEQVRBX1BPUlQpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGlubGluZSB1OCBkZTYwMF9yZWFkX2J5dGUodW5zaWduZWQgY2hhciB0eXBlLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIGRldiB1c2VkIGJ5IG1hY3JvcyAqLworCXU4IGxvOworCW91dGJfcCgodHlwZSksIERBVEFfUE9SVCk7CisJbG8gPSAoKHVuc2lnbmVkIGNoYXIpaW5iKFNUQVRVU19QT1JUKSkgPj4gNDsKKwlvdXRiX3AoKHR5cGUpIHwgSElfTklCQkxFLCBEQVRBX1BPUlQpOworCXJldHVybiAoKHVuc2lnbmVkIGNoYXIpaW5iKFNUQVRVU19QT1JUKSAmICh1bnNpZ25lZCBjaGFyKTB4ZjApIHwgbG87Cit9CisKKy8qCisgKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiAgVGhpcyBpcyBjYWxsZWQgKGluIHRoZSBjdXJyZW50IGtlcm5lbCkKKyAqIGFmdGVyIGJvb3Rpbmcgd2hlbiAnaWZjb25maWcgPGRldi0+bmFtZT4gJElQX0FERFInIGlzIHJ1biAoaW4gcmMuaW5ldDEpLgorICoKKyAqIFRoaXMgcm91dGluZSBzaG91bGQgc2V0IGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4KKyAqIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0CisgKiB0aGVyZSBpcyBhIG5vbi1yZWJvb3Qgd2F5IHRvIHJlY292ZXIgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuCisgKi8KKworc3RhdGljIGludCBkZTYwMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gcmVxdWVzdF9pcnEoREU2MDBfSVJRLCBkZTYwMF9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkXG4iLCBkZXYtPm5hbWUsIERFNjAwX0lSUSk7CisJCXJldHVybiByZXQ7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZkZTYwMF9sb2NrLCBmbGFncyk7CisJcmV0ID0gYWRhcHRlcl9pbml0KGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGU2MDBfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGUgaW52ZXJzZSByb3V0aW5lIHRvIGRlNjAwX29wZW4oKS4KKyAqLworCitzdGF0aWMgaW50IGRlNjAwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2VsZWN0X25pYygpOworCXJ4X3BhZ2UgPSAwOworCWRlNjAwX3B1dF9jb21tYW5kKFJFU0VUKTsKKwlkZTYwMF9wdXRfY29tbWFuZChTVE9QX1JFU0VUKTsKKwlkZTYwMF9wdXRfY29tbWFuZCgwKTsKKwlzZWxlY3RfcHJuKCk7CisJZnJlZV9pcnEoREU2MDBfSVJRLCBkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiAoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikoZGV2LT5wcml2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRyaWdnZXJfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGU2MDBfcHV0X2NvbW1hbmQoRkxJUF9JUlEpOworCXNlbGVjdF9wcm4oKTsKKwlERTYwMF9TTE9XX0RPV047CisJc2VsZWN0X25pYygpOworCWRlNjAwX3B1dF9jb21tYW5kKDApOworfQorCisvKgorICogQ29weSBhIGJ1ZmZlciB0byB0aGUgYWRhcHRlciB0cmFuc21pdCBwYWdlIG1lbW9yeS4KKyAqIFN0YXJ0IHNlbmRpbmcuCisgKi8KKyAKK3N0YXRpYyBpbnQgZGU2MDBfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50CXRyYW5zbWl0X2Zyb207CisJaW50CWxlbjsKKwlpbnQJdGlja3Nzb2ZhcjsKKwl1OAkqYnVmZmVyID0gc2tiLT5kYXRhOworCWludAlpOworCisJaWYgKGZyZWVfdHhfcGFnZXMgPD0gMCkgewkvKiBEbyB0aW1lb3V0cywgdG8gYXZvaWQgaGFuZ3MuICovCisJCXRpY2tzc29mYXIgPSBqaWZmaWVzIC0gZGV2LT50cmFuc19zdGFydDsKKwkJaWYgKHRpY2tzc29mYXIgPCA1KQorCQkJcmV0dXJuIDE7CisJCS8qIGVsc2UgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCAoJWQpLCAlcz9cbiIsIGRldi0+bmFtZSwgdGlja3Nzb2ZhciwgIm5ldHdvcmsgY2FibGUgcHJvYmxlbSIpOworCQkvKiBSZXN0YXJ0IHRoZSBhZGFwdGVyLiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGU2MDBfbG9jaywgZmxhZ3MpOworCQlpZiAoYWRhcHRlcl9pbml0KGRldikpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlNjAwX2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAxOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlNjAwX2xvY2ssIGZsYWdzKTsKKwl9CisKKwkvKiBTdGFydCByZWFsIG91dHB1dCAqLworCVBSSU5USygoImRlNjAwX3N0YXJ0X3htaXQ6bGVuPSVkLCBwYWdlICVkLyVkXG4iLCBza2ItPmxlbiwgdHhfZmlmb19pbiwgZnJlZV90eF9wYWdlcykpOworCisJaWYgKChsZW4gPSBza2ItPmxlbikgPCBSVU5UKQorCQlsZW4gPSBSVU5UOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlNjAwX2xvY2ssIGZsYWdzKTsKKwlzZWxlY3RfbmljKCk7CisJdHhfZmlmb1t0eF9maWZvX2luXSA9IHRyYW5zbWl0X2Zyb20gPSB0eF9wYWdlX2Fkcih0eF9maWZvX2luKSAtIGxlbjsKKwl0eF9maWZvX2luID0gKHR4X2ZpZm9faW4gKyAxKSAlIFRYX1BBR0VTOyAvKiBOZXh0IGZyZWUgdHggcGFnZSAqLworCisJaWYoY2hlY2tfbG9zdCkKKwl7CisJCS8qIFRoaXMgY29zdHMgYWJvdXQgNDAgaW5zdHJ1Y3Rpb25zIHBlciBwYWNrZXQuLi4gKi8KKwkJZGU2MDBfc2V0dXBfYWRkcmVzcyhOT0RFX0FERFJFU1MsIFJXX0FERFIpOworCQlkZTYwMF9yZWFkX2J5dGUoUkVBRF9EQVRBLCBkZXYpOworCQlpZiAod2FzX2Rvd24gfHwgKGRlNjAwX3JlYWRfYnl0ZShSRUFEX0RBVEEsIGRldikgIT0gMHhkZSkpIHsKKwkJCWlmIChhZGFwdGVyX2luaXQoZGV2KSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlNjAwX2xvY2ssIGZsYWdzKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKworCWRlNjAwX3NldHVwX2FkZHJlc3ModHJhbnNtaXRfZnJvbSwgUldfQUREUik7CisJZm9yIChpID0gMDsgIGkgPCBza2ItPmxlbiA7ICsraSwgKytidWZmZXIpCisJCWRlNjAwX3B1dF9ieXRlKCpidWZmZXIpOworCWZvciAoOyBpIDwgbGVuOyArK2kpCisJCWRlNjAwX3B1dF9ieXRlKDApOworCisJaWYgKGZyZWVfdHhfcGFnZXMtLSA9PSBUWF9QQUdFUykgeyAvKiBObyB0cmFuc21pc3Npb24gZ29pbmcgb24gKi8KKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7IC8qIGFsbG93IG1vcmUgcGFja2V0cyBpbnRvIGFkYXB0ZXIgKi8KKwkJLyogU2VuZCBwYWdlIGFuZCBnZW5lcmF0ZSBhIGZha2VkIGludGVycnVwdCAqLworCQlkZTYwMF9zZXR1cF9hZGRyZXNzKHRyYW5zbWl0X2Zyb20sIFRYX0FERFIpOworCQlkZTYwMF9wdXRfY29tbWFuZChUWF9FTkFCTEUpOworCX0KKwllbHNlIHsKKwkJaWYgKGZyZWVfdHhfcGFnZXMpCisJCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQllbHNlCisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXNlbGVjdF9wcm4oKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGU2MDBfbG9jaywgZmxhZ3MpOworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZSB0eXBpY2FsIHdvcmtsb2FkIG9mIHRoZSBkcml2ZXI6CisgKiBIYW5kbGUgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGludGVycnVwdHMuCisgKi8KKworc3RhdGljIGlycXJldHVybl90IGRlNjAwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2ID0gZGV2X2lkOworCXU4CQlpcnFfc3RhdHVzOworCWludAkJcmV0cmlnID0gMDsKKwlpbnQJCWJvZ3VzY291bnQgPSAwOworCisJLyogVGhpcyBtaWdodCBqdXN0IGFzIHdlbGwgYmUgZGVsZXRlZCBub3csIG5vIGNydW1teSBkcml2ZXJzIHByZXNlbnQgOi0pICovCisJaWYgKChkZXYgPT0gTlVMTCkgfHwgKERFNjAwX0lSUSAhPSBpcnEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGJvZ3VzIGludGVycnVwdCAlZFxuIiwgZGV2P2Rldi0+bmFtZToiREUtNjAwIiwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCXNwaW5fbG9jaygmZGU2MDBfbG9jayk7CisJCisJc2VsZWN0X25pYygpOworCWlycV9zdGF0dXMgPSBkZTYwMF9yZWFkX3N0YXR1cyhkZXYpOworCisJZG8geworCQlQUklOVEsoKCJkZTYwMF9pbnRlcnJ1cHQgKCUwMlgpXG4iLCBpcnFfc3RhdHVzKSk7CisKKwkJaWYgKGlycV9zdGF0dXMgJiBSWF9HT09EKQorCQkJZGU2MDBfcnhfaW50cihkZXYpOworCQllbHNlIGlmICghKGlycV9zdGF0dXMgJiBSWF9CVVNZKSkKKwkJCWRlNjAwX3B1dF9jb21tYW5kKFJYX0VOQUJMRSk7CisKKwkJLyogQW55IHRyYW5zbWlzc2lvbiBpbiBwcm9ncmVzcz8gKi8KKwkJaWYgKGZyZWVfdHhfcGFnZXMgPCBUWF9QQUdFUykKKwkJCXJldHJpZyA9IGRlNjAwX3R4X2ludHIoZGV2LCBpcnFfc3RhdHVzKTsKKwkJZWxzZQorCQkJcmV0cmlnID0gMDsKKworCQlpcnFfc3RhdHVzID0gZGU2MDBfcmVhZF9zdGF0dXMoZGV2KTsKKwl9IHdoaWxlICggKGlycV9zdGF0dXMgJiBSWF9HT09EKSB8fCAoKCsrYm9ndXNjb3VudCA8IDEwMCkgJiYgcmV0cmlnKSApOworCS8qCisJICogWWVhaCwgaXQgX2xvb2tzXyBsaWtlIGJ1c3kgd2FpdGluZywgc21lbGxzIGxpa2UgYnVzeSB3YWl0aW5nCisJICogYW5kIEkga25vdyBpdCdzIG5vdCBQQywgYnV0IHBsZWFzZSwgaXQgd2lsbCBvbmx5IG9jY3VyIG9uY2UKKwkgKiBpbiBhIHdoaWxlIGFuZCB0aGVuIG9ubHkgZm9yIGEgbG9vcCBvciBzbyAoPCAxbXMgZm9yIHN1cmUhKQorCSAqLworCisJLyogRW5hYmxlIGFkYXB0ZXIgaW50ZXJydXB0cyAqLworCXNlbGVjdF9wcm4oKTsKKwlpZiAocmV0cmlnKQorCQl0cmlnZ2VyX2ludGVycnVwdChkZXYpOworCXNwaW5fdW5sb2NrKCZkZTYwMF9sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgZGU2MDBfdHhfaW50cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaXJxX3N0YXR1cykKK3sKKwkvKgorCSAqIFJldHVybnMgMSBpZiB0eCBzdGlsbCBub3QgZG9uZQorCSAqLworCisJLyogQ2hlY2sgaWYgY3VycmVudCB0cmFuc21pc3Npb24gaXMgZG9uZSB5ZXQgKi8KKwlpZiAoaXJxX3N0YXR1cyAmIFRYX0JVU1kpCisJCXJldHVybiAxOyAvKiB0eCBub3QgZG9uZSwgdHJ5IGFnYWluICovCisKKwkvKiBlbHNlICovCisJLyogSWYgbGFzdCB0cmFuc21pc3Npb24gT0sgdGhlbiBidW1wIGZpZm8gaW5kZXggKi8KKwlpZiAoIShpcnFfc3RhdHVzICYgVFhfRkFJTEVEMTYpKSB7CisJCXR4X2ZpZm9fb3V0ID0gKHR4X2ZpZm9fb3V0ICsgMSkgJSBUWF9QQUdFUzsKKwkJKytmcmVlX3R4X3BhZ2VzOworCQkoKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopKGRldi0+cHJpdikpLT50eF9wYWNrZXRzKys7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisKKwkvKiBNb3JlIHRvIHNlbmQsIG9yIHJlc2VuZCBsYXN0IHBhY2tldD8gKi8KKwlpZiAoKGZyZWVfdHhfcGFnZXMgPCBUWF9QQUdFUykgfHwgKGlycV9zdGF0dXMgJiBUWF9GQUlMRUQxNikpIHsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCWRlNjAwX3NldHVwX2FkZHJlc3ModHhfZmlmb1t0eF9maWZvX291dF0sIFRYX0FERFIpOworCQlkZTYwMF9wdXRfY29tbWFuZChUWF9FTkFCTEUpOworCQlyZXR1cm4gMTsKKwl9CisJLyogZWxzZSAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXZSBoYXZlIGEgZ29vZCBwYWNrZXQsIGdldCBpdCBvdXQgb2YgdGhlIGFkYXB0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIGRlNjAwX3J4X2ludHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOworCWludAkJaTsKKwlpbnQJCXJlYWRfZnJvbTsKKwlpbnQJCXNpemU7CisJdW5zaWduZWQgY2hhcgkqYnVmZmVyOworCisJLyogR2V0IHNpemUgb2YgcmVjZWl2ZWQgcGFja2V0ICovCisJc2l6ZSA9IGRlNjAwX3JlYWRfYnl0ZShSWF9MRU4sIGRldik7CS8qIGxvdyBieXRlICovCisJc2l6ZSArPSAoZGU2MDBfcmVhZF9ieXRlKFJYX0xFTiwgZGV2KSA8PCA4KTsJLyogaGlnaCBieXRlICovCisJc2l6ZSAtPSA0OwkvKiBJZ25vcmUgdHJhaWxpbmcgNCBDUkMtYnl0ZXMgKi8KKworCS8qIFRlbGwgYWRhcHRlciB3aGVyZSB0byBzdG9yZSBuZXh0IGluY29taW5nIHBhY2tldCwgZW5hYmxlIHJlY2VpdmVyICovCisJcmVhZF9mcm9tID0gcnhfcGFnZV9hZHIoKTsKKwluZXh0X3J4X3BhZ2UoKTsKKwlkZTYwMF9wdXRfY29tbWFuZChSWF9FTkFCTEUpOworCisJaWYgKChzaXplIDwgMzIpICB8fCAgKHNpemUgPiAxNTM1KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQm9ndXMgcGFja2V0IHNpemUgJWQuXG4iLCBkZXYtPm5hbWUsIHNpemUpOworCQlpZiAoc2l6ZSA+IDEwMDAwKQorCQkJYWRhcHRlcl9pbml0KGRldik7CisJCXJldHVybjsKKwl9CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemUrMik7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCXByaW50aygiJXM6IENvdWxkbid0IGFsbG9jYXRlIGEgc2tfYnVmZiBvZiBzaXplICVkLlxuIiwgZGV2LT5uYW1lLCBzaXplKTsKKwkJcmV0dXJuOworCX0KKwkvKiBlbHNlICovCisKKwlza2ItPmRldiA9IGRldjsKKwlza2JfcmVzZXJ2ZShza2IsMik7CS8qIEFsaWduICovCisKKwkvKiAnc2tiLT5kYXRhJyBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHNrX2J1ZmYgZGF0YSBhcmVhLiAqLworCWJ1ZmZlciA9IHNrYl9wdXQoc2tiLHNpemUpOworCisJLyogY29weSB0aGUgcGFja2V0IGludG8gdGhlIGJ1ZmZlciAqLworCWRlNjAwX3NldHVwX2FkZHJlc3MocmVhZF9mcm9tLCBSV19BRERSKTsKKwlmb3IgKGkgPSBzaXplOyBpID4gMDsgLS1pLCArK2J1ZmZlcikKKwkJKmJ1ZmZlciA9IGRlNjAwX3JlYWRfYnl0ZShSRUFEX0RBVEEsIGRldik7CisKKwlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCisJbmV0aWZfcngoc2tiKTsKKworCS8qIHVwZGF0ZSBzdGF0cyAqLworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKShkZXYtPnByaXYpKS0+cnhfcGFja2V0cysrOyAvKiBjb3VudCBhbGwgcmVjZWl2ZXMgKi8KKwkoKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopKGRldi0+cHJpdikpLT5yeF9ieXRlcyArPSBzaXplOyAvKiBjb3VudCBhbGwgcmVjZWl2ZWQgYnl0ZXMgKi8KKworCS8qCisJICogSWYgYW55IHdvcnRoLXdoaWxlIHBhY2tldHMgaGF2ZSBiZWVuIHJlY2VpdmVkLCBuZXRpZl9yeCgpCisJICogd2lsbCB3b3JrIG9uIHRoZW0gd2hlbiB3ZSBnZXQgdG8gdGhlIHRhc2tsZXRzLgorCSAqLworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgZGU2MDBfcHJvYmUodm9pZCkKK3sKKwlpbnQJaTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBlcnI7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKERFNjAwX0lPLCAzLCAiZGU2MDAiKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJERTYwMDogcG9ydCAweCV4IGJ1c3lcbiIsIERFNjAwX0lPKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogRC1MaW5rIERFLTYwMCBwb2NrZXQgYWRhcHRlciIsIGRldi0+bmFtZSk7CisJLyogQWxwaGEgdGVzdGVycyBtdXN0IGhhdmUgdGhlIHZlcnNpb24gbnVtYmVyIHRvIHJlcG9ydCBidWdzLiAqLworCWlmIChkZTYwMF9kZWJ1ZyA+IDEpCisJCXByaW50ayh2ZXJzaW9uKTsKKworCS8qIHByb2JlIGZvciBhZGFwdGVyICovCisJZXJyID0gLUVOT0RFVjsKKwlyeF9wYWdlID0gMDsKKwlzZWxlY3RfbmljKCk7CisJKHZvaWQpZGU2MDBfcmVhZF9zdGF0dXMoZGV2KTsKKwlkZTYwMF9wdXRfY29tbWFuZChSRVNFVCk7CisJZGU2MDBfcHV0X2NvbW1hbmQoU1RPUF9SRVNFVCk7CisJaWYgKGRlNjAwX3JlYWRfc3RhdHVzKGRldikgJiAweGYwKSB7CisJCXByaW50aygiOiBub3QgYXQgSS9PICUjM3guXG4iLCBEQVRBX1BPUlQpOworCQlnb3RvIG91dDE7CisJfQorCisJLyoKKwkgKiBNYXliZSB3ZSBmb3VuZCBvbmUsCisJICogaGF2ZSB0byBjaGVjayBpZiBpdCBpcyBhIEQtTGluayBERS02MDAgYWRhcHRlci4uLgorCSAqLworCisJLyogR2V0IHRoZSBhZGFwdGVyIGV0aGVybmV0IGFkZHJlc3MgZnJvbSB0aGUgUk9NICovCisJZGU2MDBfc2V0dXBfYWRkcmVzcyhOT0RFX0FERFJFU1MsIFJXX0FERFIpOworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7CisJCWRldi0+ZGV2X2FkZHJbaV0gPSBkZTYwMF9yZWFkX2J5dGUoUkVBRF9EQVRBLCBkZXYpOworCQlkZXYtPmJyb2FkY2FzdFtpXSA9IDB4ZmY7CisJfQorCisJLyogQ2hlY2sgbWFnaWMgY29kZSAqLworCWlmICgoZGV2LT5kZXZfYWRkclsxXSA9PSAweGRlKSAmJiAoZGV2LT5kZXZfYWRkclsyXSA9PSAweDE1KSkgeworCQkvKiBPSywgaW5zdGFsbCByZWFsIGFkZHJlc3MgKi8KKwkJZGV2LT5kZXZfYWRkclswXSA9IDB4MDA7CisJCWRldi0+ZGV2X2FkZHJbMV0gPSAweDgwOworCQlkZXYtPmRldl9hZGRyWzJdID0gMHhjODsKKwkJZGV2LT5kZXZfYWRkclszXSAmPSAweDBmOworCQlkZXYtPmRldl9hZGRyWzNdIHw9IDB4NzA7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCIgbm90IGlkZW50aWZpZWQgaW4gdGhlIHByaW50ZXIgcG9ydFxuIik7CisJCWdvdG8gb3V0MTsKKwl9CisKKwlwcmludGsoIiwgRXRoZXJuZXQgQWRkcmVzczogJTAyWCIsIGRldi0+ZGV2X2FkZHJbMF0pOworCWZvciAoaSA9IDE7IGkgPCBFVEhfQUxFTjsgaSsrKQorCQlwcmludGsoIjolMDJYIixkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIlxuIik7CisKKwlkZXYtPmdldF9zdGF0cyA9IGdldF9zdGF0czsKKworCWRldi0+b3BlbiA9IGRlNjAwX29wZW47CisJZGV2LT5zdG9wID0gZGU2MDBfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmZGU2MDBfc3RhcnRfeG1pdDsKKworCWRldi0+ZmxhZ3MmPX5JRkZfTVVMVElDQVNUOworCisJc2VsZWN0X3BybigpOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCisJcmV0dXJuIGRldjsKKworb3V0MToKKwlyZWxlYXNlX3JlZ2lvbihERTYwMF9JTywgMyk7CitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCitzdGF0aWMgaW50IGFkYXB0ZXJfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludAlpOworCisJc2VsZWN0X25pYygpOworCXJ4X3BhZ2UgPSAwOyAvKiB1c2VkIGJ5IFJFU0VUICovCisJZGU2MDBfcHV0X2NvbW1hbmQoUkVTRVQpOworCWRlNjAwX3B1dF9jb21tYW5kKFNUT1BfUkVTRVQpOworCisJLyogQ2hlY2sgaWYgaXQgaXMgc3RpbGwgdGhlcmUuLi4gKi8KKwkvKiBHZXQgdGhlIHNvbWUgYnl0ZXMgb2YgdGhlIGFkYXB0ZXIgZXRoZXJuZXQgYWRkcmVzcyBmcm9tIHRoZSBST00gKi8KKwlkZTYwMF9zZXR1cF9hZGRyZXNzKE5PREVfQUREUkVTUywgUldfQUREUik7CisJZGU2MDBfcmVhZF9ieXRlKFJFQURfREFUQSwgZGV2KTsKKwlpZiAoKGRlNjAwX3JlYWRfYnl0ZShSRUFEX0RBVEEsIGRldikgIT0gMHhkZSkgfHwKKwkgICAgKGRlNjAwX3JlYWRfYnl0ZShSRUFEX0RBVEEsIGRldikgIT0gMHgxNSkpIHsKKwkvKiB3YXM6IGlmIChkZTYwMF9yZWFkX3N0YXR1cyhkZXYpICYgMHhmMCkgeyAqLworCQlwcmludGsoIlNvbWV0aGluZyBoYXMgaGFwcGVuZWQgdG8gdGhlIERFLTYwMCEgIFBsZWFzZSBjaGVjayBpdCBhbmQgZG8gYSBuZXcgaWZjb25maWchXG4iKTsKKwkJLyogR29vZGJ5ZSwgY3J1ZWwgd29ybGQuLi4gKi8KKwkJZGV2LT5mbGFncyAmPSB+SUZGX1VQOworCQlkZTYwMF9jbG9zZShkZXYpOworCQl3YXNfZG93biA9IDE7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsgLyogVHJhbnNtaXQgYnVzeS4uLiAgKi8KKwkJcmV0dXJuIDE7IC8qIGZhaWxlZCAqLworCX0KKworCWlmICh3YXNfZG93bikgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogVGhhbmtzLCBJIGZlZWwgbXVjaCBiZXR0ZXIgbm93IVxuIiwgZGV2LT5uYW1lKTsKKwkJd2FzX2Rvd24gPSAwOworCX0KKworCXR4X2ZpZm9faW4gPSAwOworCXR4X2ZpZm9fb3V0ID0gMDsKKwlmcmVlX3R4X3BhZ2VzID0gVFhfUEFHRVM7CisKKworCS8qIHNldCB0aGUgZXRoZXIgYWRkcmVzcy4gKi8KKwlkZTYwMF9zZXR1cF9hZGRyZXNzKE5PREVfQUREUkVTUywgUldfQUREUik7CisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCisJCWRlNjAwX3B1dF9ieXRlKGRldi0+ZGV2X2FkZHJbaV0pOworCisJLyogd2hlcmUgdG8gc3RhcnQgc2F2aW5nIGluY29taW5nIHBhY2tldHMgKi8KKwlyeF9wYWdlID0gUlhfQlAgfCBSWF9CQVNFX1BBR0U7CisJZGU2MDBfc2V0dXBfYWRkcmVzcyhNRU1fNEssIFJXX0FERFIpOworCS8qIEVuYWJsZSByZWNlaXZlciAqLworCWRlNjAwX3B1dF9jb21tYW5kKFJYX0VOQUJMRSk7CisJc2VsZWN0X3BybigpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOyAvKiBPSyAqLworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRlNjAwX2RldjsKKworc3RhdGljIGludCBfX2luaXQgZGU2MDBfaW5pdCh2b2lkKQoreworCWRlNjAwX2RldiA9IGRlNjAwX3Byb2JlKCk7CisJaWYgKElTX0VSUihkZTYwMF9kZXYpKQorCQlyZXR1cm4gUFRSX0VSUihkZTYwMF9kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZGU2MDBfZXhpdCh2b2lkKQoreworCXVucmVnaXN0ZXJfbmV0ZGV2KGRlNjAwX2Rldik7CisJcmVsZWFzZV9yZWdpb24oREU2MDBfSU8sIDMpOworCWZyZWVfbmV0ZGV2KGRlNjAwX2Rldik7Cit9CisKK21vZHVsZV9pbml0KGRlNjAwX2luaXQpOworbW9kdWxlX2V4aXQoZGU2MDBfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlNjAwLmggYi9kcml2ZXJzL25ldC9kZTYwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDczMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kZTYwMC5oCkBAIC0wLDAgKzEsMTY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRGVmaW5pdGlvbiBvZiBELUxpbmsgRXRoZXJuZXQgUG9ja2V0IGFkYXB0ZXIgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBELUxpbmsgRXRoZXJuZXQgcG9ja2V0IGFkYXB0ZXIgcG9ydHMKKyAqLworLyoKKyAqIE9LLCBzbyBJJ20gY2hlYXRpbmcsIGJ1dCB0aGVyZSBhcmUgYW4gYXdmdWwgbG90IG9mCisgKiByZWFkcyBhbmQgd3JpdGVzIGluIG9yZGVyIHRvIGdldCBhbnl0aGluZyBpbiBhbmQgb3V0CisgKiBvZiB0aGUgREUtNjAwIHdpdGggNCBiaXRzIGF0IGEgdGltZSBpbiB0aGUgcGFyYWxsZWwgcG9ydCwKKyAqIHNvIGV2ZXJ5IHNhdmVkIGluc3RydWN0aW9uIHJlYWxseSBoZWxwcyA6LSkKKyAqLworCisjaWZuZGVmIERFNjAwX0lPCisjZGVmaW5lIERFNjAwX0lPCTB4Mzc4CisjZW5kaWYKKworI2RlZmluZSBEQVRBX1BPUlQJKERFNjAwX0lPKQorI2RlZmluZSBTVEFUVVNfUE9SVAkoREU2MDBfSU8gKyAxKQorI2RlZmluZSBDT01NQU5EX1BPUlQJKERFNjAwX0lPICsgMikKKworI2lmbmRlZiBERTYwMF9JUlEKKyNkZWZpbmUgREU2MDBfSVJRCTcKKyNlbmRpZgorLyoKKyAqIEl0IHJlYWxseSBzaG91bGQgbG9vayBsaWtlIHRoaXMsIGFuZCBhdXRvcHJvYmluZyBhcyB3ZWxsLi4uCisgKgorI2RlZmluZSBEQVRBX1BPUlQJKGRldi0+YmFzZV9hZGRyICsgMCkKKyNkZWZpbmUgU1RBVFVTX1BPUlQJKGRldi0+YmFzZV9hZGRyICsgMSkKKyNkZWZpbmUgQ09NTUFORF9QT1JUCShkZXYtPmJhc2VfYWRkciArIDIpCisjZGVmaW5lIERFNjAwX0lSUQlkZXYtPmlycQorICovCisKKy8qCisgKiBELUxpbmsgQ09NTUFORF9QT1JUIGNvbW1hbmRzCisgKi8KKyNkZWZpbmUgU0VMRUNUX05JQwkweDA0IC8qIHNlbGVjdCBOZXR3b3JrIEludGVyZmFjZSBDYXJkICovCisjZGVmaW5lIFNFTEVDVF9QUk4JMHgxYyAvKiBzZWxlY3QgUHJpbnRlciAqLworI2RlZmluZSBOTUxfUFJOCQkweGVjIC8qIG5vcm1hbCBQcmludGVyIHNpdHVhdGlvbiAqLworI2RlZmluZSBJUlFFTgkJMHgxMCAvKiBlbmFibGUgSVJRIGxpbmUgKi8KKworLyoKKyAqIEQtTGluayBTVEFUVVNfUE9SVAorICovCisjZGVmaW5lIFJYX0JVU1kJCTB4ODAKKyNkZWZpbmUgUlhfR09PRAkJMHg0MAorI2RlZmluZSBUWF9GQUlMRUQxNgkweDEwCisjZGVmaW5lIFRYX0JVU1kJCTB4MDgKKworLyoKKyAqIEQtTGluayBEQVRBX1BPUlQgY29tbWFuZHMKKyAqIGNvbW1hbmQgaW4gbG93IDQgYml0cworICogZGF0YSBpbiBoaWdoIDQgYml0cworICogc2VsZWN0IGN1cnJlbnQgZGF0YSBuaWJibGUgd2l0aCBISV9OSUJCTEUgYml0CisgKi8KKyNkZWZpbmUgV1JJVEVfREFUQQkweDAwIC8qIHdyaXRlIG1lbW9yeSAqLworI2RlZmluZSBSRUFEX0RBVEEJMHgwMSAvKiByZWFkIG1lbW9yeSAqLworI2RlZmluZSBTVEFUVVMJCTB4MDIgLyogcmVhZCAgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIENPTU1BTkQJCTB4MDMgLyogd3JpdGUgY29tbWFuZCByZWdpc3RlciAoc2VlIENPTU1BTkQgYmVsb3cpICovCisjZGVmaW5lIE5VTExfQ09NTUFORAkweDA0IC8qIG51bGwgY29tbWFuZCAqLworI2RlZmluZSBSWF9MRU4JCTB4MDUgLyogcmVhZCAgcmVjZWl2ZWQgcGFja2V0IGxlbmd0aCAqLworI2RlZmluZSBUWF9BRERSCQkweDA2IC8qIHNldCBhZGFwdGVyIHRyYW5zbWl0IG1lbW9yeSBhZGRyZXNzICovCisjZGVmaW5lIFJXX0FERFIJCTB4MDcgLyogc2V0IGFkYXB0ZXIgcmVhZC93cml0ZSBtZW1vcnkgYWRkcmVzcyAqLworI2RlZmluZSBISV9OSUJCTEUJMHgwOCAvKiByZWFkL3dyaXRlIHRoZSBoaWdoIG5pYmJsZSBvZiBkYXRhLAorCQkJCW9yLWVkIHdpdGggcmVzdCBvZiBjb21tYW5kICovCisKKy8qCisgKiBjb21tYW5kIHJlZ2lzdGVyLCBhY2Nlc3NlZCB0aHJvdWdoIERBVEFfUE9SVCB3aXRoIGxvdyBiaXRzID0gQ09NTUFORAorICovCisjZGVmaW5lIFJYX0FMTAkJMHgwMSAvKiBQUk9NSVNDVU9VUyAqLworI2RlZmluZSBSWF9CUAkJMHgwMiAvKiBkZWZhdWx0OiBCUk9BRENBU1QgJiBQSFlTSUNBTCBBRERSRVNTICovCisjZGVmaW5lIFJYX01CUAkJMHgwMyAvKiBNVUxUSUNBU1QsIEJST0FEQ0FTVCAmIFBIWVNJQ0FMIEFERFJFU1MgKi8KKworI2RlZmluZSBUWF9FTkFCTEUJMHgwNCAvKiBiaXQgMiAqLworI2RlZmluZSBSWF9FTkFCTEUJMHgwOCAvKiBiaXQgMyAqLworCisjZGVmaW5lIFJFU0VUCQkweDgwIC8qIHNldCBiaXQgNyBoaWdoICovCisjZGVmaW5lIFNUT1BfUkVTRVQJMHgwMCAvKiBzZXQgYml0IDcgbG93ICovCisKKy8qCisgKiBkYXRhIHRvIGNvbW1hbmQgcmVnaXN0ZXIKKyAqIChoaWdoIDQgYml0cyBpbiB3cml0ZSB0byBEQVRBX1BPUlQpCisgKi8KKyNkZWZpbmUgUlhfUEFHRTJfU0VMRUNUCTB4MTAgLyogYml0IDQsIG9ubHkgMiBwYWdlcyB0byBzZWxlY3QgKi8KKyNkZWZpbmUgUlhfQkFTRV9QQUdFCTB4MjAgLyogYml0IDUsIGFsd2F5cyBzZXQgd2hlbiBzcGVjaWZ5aW5nIFJYX0FERFIgKi8KKyNkZWZpbmUgRkxJUF9JUlEJMHg0MCAvKiBiaXQgNiAqLworCisvKgorICogRC1MaW5rIGFkYXB0ZXIgaW50ZXJuYWwgbWVtb3J5OgorICoKKyAqIDAtMksgMTpzdCB0cmFuc21pdCBwYWdlIChzZW5kIGZyb20gcG9pbnRlciB1cCB0byAySykKKyAqIDItNEsJMjpuZCB0cmFuc21pdCBwYWdlIChzZW5kIGZyb20gcG9pbnRlciB1cCB0byA0SykKKyAqCisgKiA0LTZLIDE6c3QgcmVjZWl2ZSBwYWdlIChkYXRhIGZyb20gNEsgdXB3YXJkcykKKyAqIDYtOEsgMjpuZCByZWNlaXZlIHBhZ2UgKGRhdGEgZnJvbSA2SyB1cHdhcmRzKQorICoKKyAqIDhLKwlBZGFwdGVyIFJPTSAoY29udGFpbnMgbWFnaWMgY29kZSBhbmQgbGFzdCAzIGJ5dGVzIG9mIEV0aGVybmV0IGFkZHJlc3MpCisgKi8KKyNkZWZpbmUgTUVNXzJLCQkweDA4MDAgLyogMjA0OCAqLworI2RlZmluZSBNRU1fNEsJCTB4MTAwMCAvKiA0MDk2ICovCisjZGVmaW5lIE1FTV82SwkJMHgxODAwIC8qIDYxNDQgKi8KKyNkZWZpbmUgTk9ERV9BRERSRVNTCTB4MjAwMCAvKiA4MTkyICovCisKKyNkZWZpbmUgUlVOVCA2MAkJLyogVG9vIHNtYWxsIEV0aGVybmV0IHBhY2tldCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgRW5kIG9mIGRlZmluaXRpb24gICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEluZGV4IHRvIGZ1bmN0aW9ucywgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4KKyAqLworLyogUm91dGluZXMgdXNlZCBpbnRlcm5hbGx5LiAoU2VlICJjb252ZW5pZW5jZSBtYWNyb3MiKSAqLworc3RhdGljIHU4CWRlNjAwX3JlYWRfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHU4CWRlNjAwX3JlYWRfYnl0ZSh1bnNpZ25lZCBjaGFyIHR5cGUsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBQdXQgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCitzdGF0aWMgaW50CWRlNjAwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CWRlNjAwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpnZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CWRlNjAwX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIERpc3BhdGNoIGZyb20gaW50ZXJydXB0cy4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBkZTYwMF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50CWRlNjAwX3R4X2ludHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlycV9zdGF0dXMpOworc3RhdGljIHZvaWQJZGU2MDBfcnhfaW50cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogSW5pdGlhbGl6YXRpb24gKi8KK3N0YXRpYyB2b2lkCXRyaWdnZXJfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludAlhZGFwdGVyX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qCisgKiBDb252ZW5pZW5jZSBtYWNyb3MvZnVuY3Rpb25zIGZvciBELUxpbmsgYWRhcHRlcgorICovCisKKyNkZWZpbmUgc2VsZWN0X3BybigpIG91dGJfcChTRUxFQ1RfUFJOLCBDT01NQU5EX1BPUlQpOyBERTYwMF9TTE9XX0RPV04KKyNkZWZpbmUgc2VsZWN0X25pYygpIG91dGJfcChTRUxFQ1RfTklDLCBDT01NQU5EX1BPUlQpOyBERTYwMF9TTE9XX0RPV04KKworLyogVGhhbmtzIGZvciBoaW50cyBmcm9tIE1hcmsgQnVydG9uIDxtYXJrYkBvcmRlcm4uZGVtb24uY28udWs+ICovCisjZGVmaW5lIGRlNjAwX3B1dF9ieXRlKGRhdGEpICggXAorCW91dGJfcCgoKGRhdGEpIDw8IDQpICAgfCBXUklURV9EQVRBICAgICAgICAgICAgLCBEQVRBX1BPUlQpLCBcCisJb3V0Yl9wKCgoZGF0YSkgJiAweGYwKSB8IFdSSVRFX0RBVEEgfCBISV9OSUJCTEUsIERBVEFfUE9SVCkpCisKKy8qCisgKiBUaGUgZmlyc3QgdHdvIG91dGJfcCgpJ3MgYmVsb3cgY291bGQgcGVyaGFwcyBiZSBkZWxldGVkIGlmIHRoZXJlCisgKiB3b3VsZCBiZSBtb3JlIGRlbGF5IGluIHRoZSBsYXN0IHR3by4gTm90IGNlcnRhaW4gYWJvdXQgaXQgeWV0Li4uCisgKi8KKyNkZWZpbmUgZGU2MDBfcHV0X2NvbW1hbmQoY21kKSAoIFwKKwlvdXRiX3AoKCByeF9wYWdlICAgICAgICA8PCA0KSAgIHwgQ09NTUFORCAgICAgICAgICAgICwgREFUQV9QT1JUKSwgXAorCW91dGJfcCgoIHJ4X3BhZ2UgICAgICAgICYgMHhmMCkgfCBDT01NQU5EIHwgSElfTklCQkxFLCBEQVRBX1BPUlQpLCBcCisJb3V0Yl9wKCgocnhfcGFnZSB8IGNtZCkgPDwgNCkgICB8IENPTU1BTkQgICAgICAgICAgICAsIERBVEFfUE9SVCksIFwKKwlvdXRiX3AoKChyeF9wYWdlIHwgY21kKSAmIDB4ZjApIHwgQ09NTUFORCB8IEhJX05JQkJMRSwgREFUQV9QT1JUKSkKKworI2RlZmluZSBkZTYwMF9zZXR1cF9hZGRyZXNzKGFkZHIsdHlwZSkgKCBcCisJb3V0Yl9wKCgoKGFkZHIpIDw8IDQpICYgMHhmMCkgfCB0eXBlICAgICAgICAgICAgLCBEQVRBX1BPUlQpLCBcCisJb3V0Yl9wKCggKGFkZHIpICAgICAgICYgMHhmMCkgfCB0eXBlIHwgSElfTklCQkxFLCBEQVRBX1BPUlQpLCBcCisJb3V0Yl9wKCgoKGFkZHIpID4+IDQpICYgMHhmMCkgfCB0eXBlICAgICAgICAgICAgLCBEQVRBX1BPUlQpLCBcCisJb3V0Yl9wKCgoKGFkZHIpID4+IDgpICYgMHhmMCkgfCB0eXBlIHwgSElfTklCQkxFLCBEQVRBX1BPUlQpKQorCisjZGVmaW5lIHJ4X3BhZ2VfYWRyKCkgKChyeF9wYWdlICYgUlhfUEFHRTJfU0VMRUNUKT8oTUVNXzZLKTooTUVNXzRLKSkKKworLyogRmxpcCBiaXQsIG9ubHkgMiBwYWdlcyAqLworI2RlZmluZSBuZXh0X3J4X3BhZ2UoKSAocnhfcGFnZSBePSBSWF9QQUdFMl9TRUxFQ1QpCisKKyNkZWZpbmUgdHhfcGFnZV9hZHIoYSkgKCgoYSkgKyAxKSAqIE1FTV8ySykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlNjIwLmMgYi9kcml2ZXJzL25ldC9kZTYyMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNjlmNWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kZTYyMC5jCkBAIC0wLDAgKzEsMTA0NyBAQAorLyoKKyAqCWRlNjIwLmMgJFJldmlzaW9uOiAxLjQwICQgQkVUQQorICoKKyAqCisgKglMaW51eCBkcml2ZXIgZm9yIHRoZSBELUxpbmsgREUtNjIwIEV0aGVybmV0IHBvY2tldCBhZGFwdGVyLgorICoKKyAqCVBvcnRpb25zIChDKSBDb3B5cmlnaHQgMTk5MywgMTk5NCBieSBCam9ybiBFa3dhbGwgPGJqMHJuQGJsb3guc2U+CisgKgorICoJQmFzZWQgb24gYWRhcHRlciBpbmZvcm1hdGlvbiBnYXRoZXJlZCBmcm9tIERPUyBwYWNrZXRkcml2ZXIKKyAqCXNvdXJjZXMgZnJvbSBELUxpbmsgSW5jOiAgKFNwZWNpYWwgdGhhbmtzIHRvIEhlbnJ5IE5nYWkgb2YgRC1MaW5rLikKKyAqCQlQb3J0aW9ucyAoQykgQ29weXJpZ2h0IEQtTGluayBTWVNURU0gSW5jLiAxOTkxLCAxOTkyCisgKgkJQ29weXJpZ2h0LCAxOTg4LCBSdXNzZWxsIE5lbHNvbiwgQ3J5bndyIFNvZnR3YXJlCisgKgorICoJQWRhcHRlZCB0byB0aGUgc2FtcGxlIG5ldHdvcmsgZHJpdmVyIGNvcmUgZm9yIGxpbnV4LAorICoJd3JpdHRlbiBieTogRG9uYWxkIEJlY2tlciA8YmVja2VyQHN1cGVyLm9yZz4KKyAqCQkoTm93IGF0IDxiZWNrZXJAc2N5bGQuY29tPikKKyAqCisgKglWYWx1YWJsZSBhc3Npc3RhbmNlIGZyb206CisgKgkJSi4gSm9zaHVhIEtvcHBlciA8a29wcGVyQHJ0c2cubW90LmNvbT4KKyAqCQlPbGF2IEt2aXR0ZW0gPE9sYXYuS3ZpdHRlbUB1bmluZXR0Lm5vPgorICoJCUdlcm1hbm8gQ2Fyb25uaSA8Y2Fyb25uaUBuZXNzaWUuY3MuaWQuZXRoei5jaD4KKyAqCQlKZXJlbXkgRml0emhhcmRpbmdlIDxqZXJlbXlAc3VpdGUuc3cub3ouYXU+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICoJYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9CisJImRlNjIwLmM6ICRSZXZpc2lvbjogMS40MCAkLCAgQmpvcm4gRWt3YWxsIDxiajBybkBibG94LnNlPlxuIjsKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICJUdW5pbmciIHNlY3Rpb24uCisgKgorICogQ29tcGlsZS10aW1lIG9wdGlvbnM6IChzZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucykKKyAqIC1EREU2MjBfSU89MHgzNzgJKGxwdDEpCisgKiAtRERFNjIwX0lSUT03CShscHQxKQorICogLURERTYwMl9ERUJVRz0uLi4KKyAqIC1EU0hVVERPV05fV0hFTl9MT1NUCisgKiAtRENPVU5UX0xPT1BTCisgKiAtRExPV1NQRUVECisgKiAtRFJFQURfREVMQVkKKyAqIC1EV1JJVEVfREVMQVkKKyAqLworCisvKgorICogVGhpcyBkcml2ZXIgYXNzdW1lcyB0aGF0IHRoZSBwcmludGVyIHBvcnQgaXMgYSAibm9ybWFsIiwKKyAqIGR1bWIsIHVuaS1kaXJlY3Rpb25hbCBwb3J0IQorICogSWYgeW91ciBwb3J0IGlzICJmYW5jeSIgaW4gYW55IHdheSwgcGxlYXNlIHRyeSB0byBzZXQgaXQgdG8gIm5vcm1hbCIKKyAqIHdpdGggeW91ciBCSU9TIHNldHVwLiAgSSBoYXZlIG5vIGFjY2VzcyB0byBtYWNoaW5lcyB3aXRoIGJpLWRpcmVjdGlvbmFsCisgKiBwb3J0cywgc28gSSBjYW4ndCB0ZXN0IHN1Y2ggYSBkcml2ZXIgOi0oCisgKiAoWWVzLCBJIF9rbm93XyBpdCBpcyBwb3NzaWJsZSB0byB1c2UgREU2MjAgd2l0aCBiaWRpcmVjdGlvbmFsIHBvcnRzLi4uKQorICoKKyAqIFRoZXJlIGFyZSBzb21lIGNsb25lcyBvZiBERTYyMCBvdXQgdGhlcmUsIHdpdGggZGlmZmVyZW50IG5hbWVzLgorICogSWYgdGhlIGN1cnJlbnQgZHJpdmVyIGRvZXMgbm90IHJlY29nbml6ZSBhIGNsb25lLCB0cnkgdG8gY2hhbmdlCisgKiB0aGUgZm9sbG93aW5nICNkZWZpbmUgdG86CisgKgorICogI2RlZmluZSBERTYyMF9DTE9ORSAxCisgKi8KKyNkZWZpbmUgREU2MjBfQ0xPTkUgMAorCisvKgorICogSWYgdGhlIGFkYXB0ZXIgaGFzIHByb2JsZW1zIHdpdGggaGlnaCBzcGVlZHMsIGVuYWJsZSB0aGlzICNkZWZpbmUKKyAqIG90aGVyd2lzZSBmdWxsIHByaW50ZXJwb3J0IHNwZWVkIHdpbGwgYmUgYXR0ZW1wdGVkLgorICoKKyAqIFlvdSBjYW4gdHVuZSB0aGUgUkVBRF9ERUxBWS9XUklURV9ERUxBWSBiZWxvdyBpZiB5b3UgZW5hYmxlIExPV1NQRUVECisgKgorI2RlZmluZSBMT1dTUEVFRAorICovCisKKyNpZm5kZWYgUkVBRF9ERUxBWQorI2RlZmluZSBSRUFEX0RFTEFZIDEwMAkvKiBhZGFwdGVyIGludGVybmFsIHJlYWQgZGVsYXkgaW4gMTAwbnMgdW5pdHMgKi8KKyNlbmRpZgorCisjaWZuZGVmIFdSSVRFX0RFTEFZCisjZGVmaW5lIFdSSVRFX0RFTEFZIDEwMAkvKiBhZGFwdGVyIGludGVybmFsIHdyaXRlIGRlbGF5IGluIDEwMG5zIHVuaXRzICovCisjZW5kaWYKKworLyoKKyAqIEVuYWJsZSB0aGlzICNkZWZpbmUgaWYgeW91IHdhbnQgdGhlIGFkYXB0ZXIgdG8gZG8gYSAiaWZjb25maWcgZG93biIgb24KKyAqIGl0c2VsZiB3aGVuIHdlIGhhdmUgZGV0ZWN0ZWQgdGhhdCBzb21ldGhpbmcgaXMgcG9zc2libHkgd3Jvbmcgd2l0aCBpdC4KKyAqIFRoZSBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byByZXRyeSB3aXRoICJhZGFwdGVyX2luaXQoKSIgdW50aWwgc3VjY2Vzcy4KKyAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5LgorICoKKyNkZWZpbmUgU0hVVERPV05fV0hFTl9MT1NUCisgKi8KKworLyoKKyAqIEVuYWJsZSBkZWJ1Z2dpbmcgYnkgIi1EREU2MjBfREVCVUc9MyIgd2hlbiBjb21waWxpbmcsCisgKiBPUiBieSBlbmFibGluZyB0aGUgZm9sbG93aW5nICNkZWZpbmUKKyAqCisgKiB1c2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgdmVyaWZpY2F0aW9uLCA+MiBmb3IgZGVidWcKKyAqCisjZGVmaW5lIERFNjIwX0RFQlVHIDMKKyAqLworCisjaWZkZWYgTE9XU1BFRUQKKy8qCisgKiBFbmFibGUgdGhpcyAjZGVmaW5lIGlmIHlvdSB3YW50IHRvIHNlZSBkZWJ1Z2dpbmcgb3V0cHV0IHRoYXQgc2hvdyBob3cgbG9uZworICogd2UgaGF2ZSB0byB3YWl0IGJlZm9yZSB0aGUgREUtNjIwIGlzIHJlYWR5IGZvciB0aGUgbmV4dCByZWFkL3dyaXRlL2NvbW1hbmQuCisgKgorI2RlZmluZSBDT1VOVF9MT09QUworICovCisjZW5kaWYKKwwKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworLyogQ29uc3RhbnQgZGVmaW5pdGlvbnMgZm9yIHRoZSBERS02MjAgcmVnaXN0ZXJzLCBjb21tYW5kcyBhbmQgYml0cyAqLworI2luY2x1ZGUgImRlNjIwLmgiCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBieXRlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIERlZmluaXRpb24gb2YgRC1MaW5rIERFLTYyMCBFdGhlcm5ldCBQb2NrZXQgYWRhcHRlciAqCisgKiBTZWUgYWxzbyAiZGU2MjAuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBERTYyMF9JTyAvKiBDb21waWxlLXRpbWUgY29uZmlndXJhYmxlICovCisjZGVmaW5lIERFNjIwX0lPIDB4Mzc4CisjZW5kaWYKKworI2lmbmRlZiBERTYyMF9JUlEgLyogQ29tcGlsZS10aW1lIGNvbmZpZ3VyYWJsZSAqLworI2RlZmluZSBERTYyMF9JUlEJNworI2VuZGlmCisKKyNkZWZpbmUgREFUQV9QT1JUCShkZXYtPmJhc2VfYWRkcikKKyNkZWZpbmUgU1RBVFVTX1BPUlQJKGRldi0+YmFzZV9hZGRyICsgMSkKKyNkZWZpbmUgQ09NTUFORF9QT1JUCShkZXYtPmJhc2VfYWRkciArIDIpCisKKyNkZWZpbmUgUlVOVCA2MAkJLyogVG9vIHNtYWxsIEV0aGVybmV0IHBhY2tldCAqLworI2RlZmluZSBHSUFOVCAxNTE0CS8qIGxhcmdlc3QgbGVnYWwgc2l6ZSBwYWNrZXQsIG5vIGZjcyAqLworCisjaWZkZWYgREU2MjBfREVCVUcgLyogQ29tcGlsZS10aW1lIGNvbmZpZ3VyYWJsZSAqLworI2RlZmluZSBQUklOVEsoeCkgaWYgKGRlNjIwX2RlYnVnID49IDIpIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBERTYyMF9ERUJVRyAwCisjZGVmaW5lIFBSSU5USyh4KSAvKiovCisjZW5kaWYKKworCisvKgorICogRm9yY2UgbWVkaWEgd2l0aCBpbnNtb2Q6CisgKglpbnNtb2QgZGU2MjAubyBibmM9MQorICogb3IKKyAqCWluc21vZCBkZTYyMC5vIHV0cD0xCisgKgorICogRm9yY2UgaW8gYW5kL29yIGlycSB3aXRoIGluc21vZDoKKyAqCWluc21vZCBkZTYyMC5vIGlvPTB4Mzc4IGlycT03CisgKgorICogTWFrZSBhIGNsb25lIHNraXAgdGhlIEV0aGVybmV0LWFkZHJlc3MgcmFuZ2UgY2hlY2s6CisgKglpbnNtb2QgZGU2MjAubyBjbG9uZT0xCisgKi8KK3N0YXRpYyBpbnQgYm5jOworc3RhdGljIGludCB1dHA7CitzdGF0aWMgaW50IGlvICA9IERFNjIwX0lPOworc3RhdGljIGludCBpcnEgPSBERTYyMF9JUlE7CitzdGF0aWMgaW50IGNsb25lID0gREU2MjBfQ0xPTkU7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGU2MjBfZGVidWcgPSBERTYyMF9ERUJVRzsKKworc3RhdGljIHNwaW5sb2NrX3QgZGU2MjBfbG9jazsKKworbW9kdWxlX3BhcmFtKGJuYywgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh1dHAsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGNsb25lLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRlNjIwX2RlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhibmMsICJERS02MjAgc2V0IEJOQyBtZWRpdW0gKDAtMSkiKTsKK01PRFVMRV9QQVJNX0RFU0ModXRwLCAiREUtNjIwIHNldCBVVFAgbWVkaXVtICgwLTEpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiREUtNjIwIEkvTyBiYXNlIGFkZHJlc3MscmVxdWlyZWQiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiREUtNjIwIElSUSBudW1iZXIscmVxdWlyZWQiKTsKK01PRFVMRV9QQVJNX0RFU0MoY2xvbmUsICJDaGVjayBhbHNvIGZvciBub24tRC1MaW5rIERFLTYyMCBjbG9uZXMgKDAtMSkiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGU2MjBfZGVidWcsICJERS02MjAgZGVidWcgbGV2ZWwgKDAtMikiKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEluZGV4IHRvIGZ1bmN0aW9ucywgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4gKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBSb3V0aW5lcyB1c2VkIGludGVybmFsbHkuIChTZWUgYWxzbyAiY29udmVuaWVuY2UgbWFjcm9zLi4gYmVsb3ciKQorICovCisKKy8qIFB1dCBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KK3N0YXRpYyBpbnQJZGU2MjBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQJZGU2MjBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgc3RydWN0CW5ldF9kZXZpY2Vfc3RhdHMgKmdldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyB2b2lkCWRlNjIwX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQJZGU2MjBfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKworLyogRGlzcGF0Y2ggZnJvbSBpbnRlcnJ1cHRzLiAqLworc3RhdGljIGlycXJldHVybl90IGRlNjIwX2ludGVycnVwdChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgaW50CWRlNjIwX3J4X2ludHIoc3RydWN0IG5ldF9kZXZpY2UgKik7CisKKy8qIEluaXRpYWxpemF0aW9uICovCitzdGF0aWMgaW50CWFkYXB0ZXJfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQJcmVhZF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKik7CisKKworLyoKKyAqIEQtTGluayBkcml2ZXIgdmFyaWFibGVzOgorICovCisjZGVmaW5lIFNDUl9ERUYgTklCQkxFTU9ERSB8SU5UT04gfCBTTEVFUCB8IEFVVE9UWAorI2RlZmluZQlUQ1JfREVGIFJYUEIJCQkvKiBub3QgdXNlZDogfCBUWFNVQ0lOVCB8IFQxNklOVCAqLworI2RlZmluZSBERTYyMF9SWF9TVEFSVF9QQUdFIDEyCQkvKiAxMiBwYWdlcyAoPTNrKSByZXNlcnZlZCBmb3IgdHggKi8KKyNkZWZpbmUgREVGX05JQ19DTUQgSVJRRU4gfCBJQ0VOIHwgRFMxCisKK3N0YXRpYyB2b2xhdGlsZSBieXRlCU5JQ19DbWQ7CitzdGF0aWMgdm9sYXRpbGUgYnl0ZQluZXh0X3J4X3BhZ2U7CitzdGF0aWMgYnl0ZQkJZmlyc3RfcnhfcGFnZTsKK3N0YXRpYyBieXRlCQlsYXN0X3J4X3BhZ2U7CitzdGF0aWMgYnl0ZQkJRUlQUmVnaXN0ZXI7CisKK3N0YXRpYyBzdHJ1Y3QgbmljIHsKKwlieXRlCU5vZGVJRFs2XTsKKwlieXRlCVJBTV9TaXplOworCWJ5dGUJTW9kZWw7CisJYnl0ZQlNZWRpYTsKKwlieXRlCVNDUjsKK30gbmljX2RhdGE7CisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvbnZlbmllbmNlIG1hY3Jvcy9mdW5jdGlvbnMgZm9yIEQtTGluayBERS02MjAgYWRhcHRlciAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIGRlNjIwX3R4X2J1ZmZzKGRkKSAoaW5iKFNUQVRVU19QT1JUKSAmIChUWEJGMCB8IFRYQkYxKSkKKyNkZWZpbmUgZGU2MjBfZmxpcF9kcyhkZCkgTklDX0NtZCBePSBEUzAgfCBEUzE7IG91dGIoTklDX0NtZCwgQ09NTUFORF9QT1JUKTsKKworLyogQ2hlY2sgZm9yIHJlYWR5LXN0YXR1cywgYW5kIHJldHVybiBhIG5pYmJsZSAoaGlnaCA0IGJpdHMpIGZvciBkYXRhIGlucHV0ICovCisjaWZkZWYgQ09VTlRfTE9PUFMKK3N0YXRpYyBpbnQgdG90X2NudDsKKyNlbmRpZgorc3RhdGljIGlubGluZSBieXRlCitkZTYyMF9yZWFkeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWJ5dGUgdmFsdWU7CisJcmVnaXN0ZXIgc2hvcnQgaW50IGNudCA9IDA7CisKKwl3aGlsZSAoKCgodmFsdWUgPSBpbmIoU1RBVFVTX1BPUlQpKSAmIFJFQURZKSA9PSAwKSAmJiAoY250IDw9IDEwMDApKQorCQkrK2NudDsKKworI2lmZGVmIENPVU5UX0xPT1BTCisJdG90X2NudCArPSBjbnQ7CisjZW5kaWYKKwlyZXR1cm4gdmFsdWUgJiAweGYwOyAvKiBuaWJibGUgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkCitkZTYyMF9zZW5kX2NvbW1hbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYnl0ZSBjbWQpCit7CisJZGU2MjBfcmVhZHkoZGV2KTsKKwlpZiAoY21kID09IFdfRFVNTVkpCisJCW91dGIoTklDX0NtZCwgQ09NTUFORF9QT1JUKTsKKworCW91dGIoY21kLCBEQVRBX1BPUlQpOworCisJb3V0YihOSUNfQ21kIF4gQ1MwLCBDT01NQU5EX1BPUlQpOworCWRlNjIwX3JlYWR5KGRldik7CisJb3V0YihOSUNfQ21kLCBDT01NQU5EX1BPUlQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2RlNjIwX3B1dF9ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGJ5dGUgdmFsdWUpCit7CisJLyogVGhlIGRlNjIwX3JlYWR5KCkgbWFrZXMgNyBsb29wcywgb24gdGhlIGF2ZXJhZ2UsIG9uIGEgRFgyLzY2ICovCisJZGU2MjBfcmVhZHkoZGV2KTsKKwlvdXRiKHZhbHVlLCBEQVRBX1BPUlQpOworCWRlNjIwX2ZsaXBfZHMoZGV2KTsKK30KKworc3RhdGljIGlubGluZSBieXRlCitkZTYyMF9yZWFkX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlieXRlIHZhbHVlOworCisJLyogVGhlIGRlNjIwX3JlYWR5KCkgbWFrZXMgNyBsb29wcywgb24gdGhlIGF2ZXJhZ2UsIG9uIGEgRFgyLzY2ICovCisJdmFsdWUgPSBkZTYyMF9yZWFkeShkZXYpOyAvKiBIaWdoIG5pYmJsZSAqLworCWRlNjIwX2ZsaXBfZHMoZGV2KTsKKwl2YWx1ZSB8PSBkZTYyMF9yZWFkeShkZXYpID4+IDQ7IC8qIExvdyBuaWJibGUgKi8KKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZGU2MjBfd3JpdGVfYmxvY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYnl0ZSAqYnVmZmVyLCBpbnQgY291bnQsIGludCBwYWQpCit7CisjaWZuZGVmIExPV1NQRUVECisJYnl0ZSB1ZmxpcCA9IE5JQ19DbWQgXiAoRFMwIHwgRFMxKTsKKwlieXRlIGRmbGlwID0gTklDX0NtZDsKKyNlbHNlIC8qIExPV1NQRUVEICovCisjaWZkZWYgQ09VTlRfTE9PUFMKKwlpbnQgYnl0ZXMgPSBjb3VudDsKKyNlbmRpZiAvKiBDT1VOVF9MT09QUyAqLworI2VuZGlmIC8qIExPV1NQRUVEICovCisKKyNpZmRlZiBMT1dTUEVFRAorI2lmZGVmIENPVU5UX0xPT1BTCisJdG90X2NudCA9IDA7CisjZW5kaWYgLyogQ09VTlRfTE9PUFMgKi8KKwkvKiBObyBmdXJ0aGVyIG9wdGltaXphdGlvbiB1c2VmdWwsIHRoZSBsaW1pdCBpcyBpbiB0aGUgYWRhcHRlci4gKi8KKwlmb3IgKCA7IGNvdW50ID4gMDsgLS1jb3VudCwgKytidWZmZXIpIHsKKwkJZGU2MjBfcHV0X2J5dGUoZGV2LCpidWZmZXIpOworCX0KKwlmb3IgKCBjb3VudCA9IHBhZCA7IGNvdW50ID4gMDsgLS1jb3VudCwgKytidWZmZXIpIHsKKwkJZGU2MjBfcHV0X2J5dGUoZGV2LCAwKTsKKwl9CisJZGU2MjBfc2VuZF9jb21tYW5kKGRldixXX0RVTU1ZKTsKKyNpZmRlZiBDT1VOVF9MT09QUworCS8qIHRyaWFsIGRlYnVnIG91dHB1dDogbG9vcHMgcGVyIGJ5dGUgaW4gZGU2MjBfcmVhZHkoKSAqLworCXByaW50aygiV1JJVEUoJWQpXG4iLCB0b3RfY250LygoYnl0ZXM/Ynl0ZXM6MSkpKTsKKyNlbmRpZiAvKiBDT1VOVF9MT09QUyAqLworI2Vsc2UgLyogbm90IExPV1NQRUVEICovCisJZm9yICggOyBjb3VudCA+IDA7IGNvdW50IC09MikgeworCQlvdXRiKCpidWZmZXIrKywgREFUQV9QT1JUKTsKKwkJb3V0Yih1ZmxpcCwgQ09NTUFORF9QT1JUKTsKKwkJb3V0YigqYnVmZmVyKyssIERBVEFfUE9SVCk7CisJCW91dGIoZGZsaXAsIENPTU1BTkRfUE9SVCk7CisJfQorCWRlNjIwX3NlbmRfY29tbWFuZChkZXYsV19EVU1NWSk7CisjZW5kaWYgLyogTE9XU1BFRUQgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkCitkZTYyMF9yZWFkX2Jsb2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGJ5dGUgKmRhdGEsIGludCBjb3VudCkKK3sKKyNpZm5kZWYgTE9XU1BFRUQKKwlieXRlIHZhbHVlOworCWJ5dGUgdWZsaXAgPSBOSUNfQ21kIF4gKERTMCB8IERTMSk7CisJYnl0ZSBkZmxpcCA9IE5JQ19DbWQ7CisjZWxzZSAvKiBMT1dTUEVFRCAqLworI2lmZGVmIENPVU5UX0xPT1BTCisJaW50IGJ5dGVzID0gY291bnQ7CisKKwl0b3RfY250ID0gMDsKKyNlbmRpZiAvKiBDT1VOVF9MT09QUyAqLworI2VuZGlmIC8qIExPV1NQRUVEICovCisKKyNpZmRlZiBMT1dTUEVFRAorCS8qIE5vIGZ1cnRoZXIgb3B0aW1pemF0aW9uIHVzZWZ1bCwgdGhlIGxpbWl0IGlzIGluIHRoZSBhZGFwdGVyLiAqLworCXdoaWxlIChjb3VudC0tID4gMCkgeworCQkqZGF0YSsrID0gZGU2MjBfcmVhZF9ieXRlKGRldik7CisJCWRlNjIwX2ZsaXBfZHMoZGV2KTsKKwl9CisjaWZkZWYgQ09VTlRfTE9PUFMKKwkvKiB0cmlhbCBkZWJ1ZyBvdXRwdXQ6IGxvb3BzIHBlciBieXRlIGluIGRlNjIwX3JlYWR5KCkgKi8KKwlwcmludGsoIlJFQUQoJWQpXG4iLCB0b3RfY250LygyKihieXRlcz9ieXRlczoxKSkpOworI2VuZGlmIC8qIENPVU5UX0xPT1BTICovCisjZWxzZSAvKiBub3QgTE9XU1BFRUQgKi8KKwl3aGlsZSAoY291bnQtLSA+IDApIHsKKwkJdmFsdWUgPSBpbmIoU1RBVFVTX1BPUlQpICYgMHhmMDsgLyogSGlnaCBuaWJibGUgKi8KKwkJb3V0Yih1ZmxpcCwgQ09NTUFORF9QT1JUKTsKKwkJKmRhdGErKyA9IHZhbHVlIHwgaW5iKFNUQVRVU19QT1JUKSA+PiA0OyAvKiBMb3cgbmliYmxlICovCisJCW91dGIoZGZsaXAgLCBDT01NQU5EX1BPUlQpOworCX0KKyNlbmRpZiAvKiBMT1dTUEVFRCAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2RlNjIwX3NldF9kZWxheShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRlNjIwX3JlYWR5KGRldik7CisJb3V0YihXX0RGUiwgREFUQV9QT1JUKTsKKwlvdXRiKE5JQ19DbWQgXiBDUzAsIENPTU1BTkRfUE9SVCk7CisKKwlkZTYyMF9yZWFkeShkZXYpOworI2lmZGVmIExPV1NQRUVECisJb3V0YihXUklURV9ERUxBWSwgREFUQV9QT1JUKTsKKyNlbHNlCisJb3V0YigwLCBEQVRBX1BPUlQpOworI2VuZGlmCisJZGU2MjBfZmxpcF9kcyhkZXYpOworCisJZGU2MjBfcmVhZHkoZGV2KTsKKyNpZmRlZiBMT1dTUEVFRAorCW91dGIoUkVBRF9ERUxBWSwgREFUQV9QT1JUKTsKKyNlbHNlCisJb3V0YigwLCBEQVRBX1BPUlQpOworI2VuZGlmCisJZGU2MjBfZmxpcF9kcyhkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2RlNjIwX3NldF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBieXRlIHJlZywgYnl0ZSB2YWx1ZSkKK3sKKwlkZTYyMF9yZWFkeShkZXYpOworCW91dGIocmVnLCBEQVRBX1BPUlQpOworCW91dGIoTklDX0NtZCBeIENTMCwgQ09NTUFORF9QT1JUKTsKKworCWRlNjIwX3B1dF9ieXRlKGRldiwgdmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIGJ5dGUKK2RlNjIwX2dldF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBieXRlIHJlZykKK3sKKwlieXRlIHZhbHVlOworCisJZGU2MjBfc2VuZF9jb21tYW5kKGRldixyZWcpOworCXZhbHVlID0gZGU2MjBfcmVhZF9ieXRlKGRldik7CisJZGU2MjBfc2VuZF9jb21tYW5kKGRldixXX0RVTU1ZKTsKKworCXJldHVybiB2YWx1ZTsKK30KKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLgorICoKKyAqIFRoaXMgcm91dGluZSBzaG91bGQgc2V0IGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4KKyAqIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0CisgKiB0aGVyZSBpcyBhIG5vbi1yZWJvb3Qgd2F5IHRvIHJlY292ZXIgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuCisgKgorICovCitzdGF0aWMgaW50IGRlNjIwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGRlNjIwX2ludGVycnVwdCwgMCwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoYWRhcHRlcl9pbml0KGRldikpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXRfZnJlZV9pcnE7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVfaXJxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgaW52ZXJzZSByb3V0aW5lIHRvIGRlNjIwX29wZW4oKS4KKyAqCisgKi8KKworc3RhdGljIGludCBkZTYyMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkvKiBkaXNhYmxlIHJlY3YgKi8KKwlkZTYyMF9zZXRfcmVnaXN0ZXIoZGV2LCBXX1RDUiwgUlhPRkYpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmV0dXJuIGN1cnJlbnQgc3RhdGlzdGljcworICoKKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpnZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopKGRldi0+cHJpdik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAqIChubyByZWFsIG11bHRpY2FzdCBpbXBsZW1lbnRlZCBmb3IgdGhlIERFLTYyMCwgYnV0IHNoZSBjYW4gYmUgcHJvbWlzY3VvdXMuLi4pCisgKgorICovCisKK3N0YXRpYyB2b2lkIGRlNjIwX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmIChkZXYtPm1jX2NvdW50IHx8IGRldi0+ZmxhZ3MmKElGRl9BTExNVUxUSXxJRkZfUFJPTUlTQykpCisJeyAvKiBFbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworCQkvKgorCQkgKglXZSBtdXN0IG1ha2UgdGhlIGtlcm5lbCByZWFsaXNlIHdlIGhhZCB0byBtb3ZlCisJCSAqCWludG8gcHJvbWlzYyBtb2RlIG9yIHdlIHN0YXJ0IGFsbCBvdXQgd2FyIG9uCisJCSAqCXRoZSBjYWJsZS4gLSBBQworCQkgKi8KKwkJZGV2LT5mbGFnc3w9SUZGX1BST01JU0M7CisKKwkJZGU2MjBfc2V0X3JlZ2lzdGVyKGRldiwgV19UQ1IsIChUQ1JfREVGICYgflJYUEJNKSB8IFJYQUxMKTsKKwl9CisJZWxzZQorCXsgLyogRGlzYWJsZSBwcm9taXNjdW91cyBtb2RlLCB1c2Ugbm9ybWFsIG1vZGUgKi8KKwkJZGU2MjBfc2V0X3JlZ2lzdGVyKGRldiwgV19UQ1IsIFRDUl9ERUYpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQorICogSGFuZGxlIHRpbWVvdXRzIG9uIHRyYW5zbWl0CisgKi8KKyAKK3N0YXRpYyB2b2lkIGRlNjIwX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCAlcz9cbiIsIGRldi0+bmFtZSwgIm5ldHdvcmsgY2FibGUgcHJvYmxlbSIpOworCS8qIFJlc3RhcnQgdGhlIGFkYXB0ZXIuICovCisJaWYgKCFhZGFwdGVyX2luaXQoZGV2KSkgLyogbWF5YmUgY2xvc2UgaXQgKi8KKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHkgYSBidWZmZXIgdG8gdGhlIGFkYXB0ZXIgdHJhbnNtaXQgcGFnZSBtZW1vcnkuCisgKiBTdGFydCBzZW5kaW5nLgorICovCitzdGF0aWMgaW50IGRlNjIwX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBsZW47CisJYnl0ZSAqYnVmZmVyID0gc2tiLT5kYXRhOworCWJ5dGUgdXNpbmdfdHhidWY7CisKKwl1c2luZ190eGJ1ZiA9IGRlNjIwX3R4X2J1ZmZzKGRldik7IC8qIFBlZWsgYXQgdGhlIGFkYXB0ZXIgKi8KKwkKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisKKwlpZiAoKGxlbiA9IHNrYi0+bGVuKSA8IFJVTlQpCisJCWxlbiA9IFJVTlQ7CisJaWYgKGxlbiAmIDEpIC8qIHNlbmQgYW4gZXZlbiBudW1iZXIgb2YgYnl0ZXMgKi8KKwkJKytsZW47CisKKwkvKiBTdGFydCByZWFsIG91dHB1dCAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlNjIwX2xvY2ssIGZsYWdzKQorCVBSSU5USygoImRlNjIwX3N0YXJ0X3htaXQ6IGxlbj0lZCwgYnVmcyAweCUwMnhcbiIsCisJCShpbnQpc2tiLT5sZW4sIHVzaW5nX3R4YnVmKSk7CisKKwkvKiBzZWxlY3QgYSBmcmVlIHR4IGJ1ZmZlci4gaWYgdGhlcmUgaXMgb25lLi4uICovCisJc3dpdGNoICh1c2luZ190eGJ1ZikgeworCWRlZmF1bHQ6IC8qIGJvdGggYXJlIGZyZWU6IHVzZSBUWEJGMCAqLworCWNhc2UgVFhCRjE6IC8qIHVzZSBUWEJGMCAqLworCQlkZTYyMF9zZW5kX2NvbW1hbmQoZGV2LFdfQ1IgfCBSVzApOworCQl1c2luZ190eGJ1ZiB8PSBUWEJGMDsKKwkJYnJlYWs7CisKKwljYXNlIFRYQkYwOiAvKiB1c2UgVFhCRjEgKi8KKwkJZGU2MjBfc2VuZF9jb21tYW5kKGRldixXX0NSIHwgUlcxKTsKKwkJdXNpbmdfdHhidWYgfD0gVFhCRjE7CisJCWJyZWFrOworCisJY2FzZSAoVFhCRjAgfCBUWEJGMSk6IC8qIE5PTkUhISEgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vIHR4LWJ1ZmZlciBhdmFpbGFibGUhXG4iLCBkZXYtPm5hbWUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZTYyMF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAxOworCX0KKwlkZTYyMF93cml0ZV9ibG9jayhkZXYsIGJ1ZmZlciwgc2tiLT5sZW4sIGxlbi1za2ItPmxlbik7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlpZighKHVzaW5nX3R4YnVmID09IChUWEJGMCB8IFRYQkYxKSkpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCSgoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikoZGV2LT5wcml2KSktPnR4X3BhY2tldHMrKzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZTYyMF9sb2NrLCBmbGFncyk7CisJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKwlyZXR1cm4gMDsKK30KKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEhhbmRsZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaW50ZXJydXB0cy4KKyAqCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorZGU2MjBfaW50ZXJydXB0KGludCBpcnFfaW4sIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlieXRlIGlycV9zdGF0dXM7CisJaW50IGJvZ3VzX2NvdW50ID0gMDsKKwlpbnQgYWdhaW4gPSAwOworCisJc3Bpbl9sb2NrKCZkZTYyMF9sb2NrKTsKKwkKKwkvKiBSZWFkIHRoZSBzdGF0dXMgcmVnaXN0ZXIgKF9ub3RfIHRoZSBzdGF0dXMgcG9ydCkgKi8KKwlpcnFfc3RhdHVzID0gZGU2MjBfZ2V0X3JlZ2lzdGVyKGRldiwgUl9TVFMpOworCisJUFJJTlRLKCgiZGU2MjBfaW50ZXJydXB0ICglMi4yWClcbiIsIGlycV9zdGF0dXMpKTsKKworCWlmIChpcnFfc3RhdHVzICYgUlhHT09EKSB7CisJCWRvIHsKKwkJCWFnYWluID0gZGU2MjBfcnhfaW50cihkZXYpOworCQkJUFJJTlRLKCgiYWdhaW49JWRcbiIsIGFnYWluKSk7CisJCX0KKwkJd2hpbGUgKGFnYWluICYmICgrK2JvZ3VzX2NvdW50IDwgMTAwKSk7CisJfQorCisJaWYoZGU2MjBfdHhfYnVmZnMoZGV2KSAhPSAoVFhCRjAgfCBUWEJGMSkpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCisJc3Bpbl91bmxvY2soJmRlNjIwX2xvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR2V0IGEgcGFja2V0IGZyb20gdGhlIGFkYXB0ZXIKKyAqCisgKiBTZW5kIGl0ICJ1cHN0YWlycyIKKyAqCisgKi8KK3N0YXRpYyBpbnQgZGU2MjBfcnhfaW50cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBoZWFkZXJfYnVmIHsKKwkJYnl0ZQkJc3RhdHVzOworCQlieXRlCQlSeF9OZXh0UGFnZTsKKwkJdW5zaWduZWQgc2hvcnQJUnhfQnl0ZUNvdW50OworCX0gaGVhZGVyX2J1ZjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBzaXplOworCWJ5dGUgKmJ1ZmZlcjsKKwlieXRlIHBhZ2VsaW5rOworCWJ5dGUgY3Vycl9wYWdlOworCisJUFJJTlRLKCgiZGU2MjBfcnhfaW50cjogbmV4dF9yeF9wYWdlID0gJWRcbiIsIG5leHRfcnhfcGFnZSkpOworCisJLyogVGVsbCB0aGUgYWRhcHRlciB0aGF0IHdlIGFyZSBnb2luZyB0byByZWFkIGRhdGEsIGFuZCBmcm9tIHdoZXJlICovCisJZGU2MjBfc2VuZF9jb21tYW5kKGRldiwgV19DUiB8IFJSTik7CisJZGU2MjBfc2V0X3JlZ2lzdGVyKGRldiwgV19SU0ExLCBuZXh0X3J4X3BhZ2UpOworCWRlNjIwX3NldF9yZWdpc3RlcihkZXYsIFdfUlNBMCwgMCk7CisKKwkvKiBEZWVwIGJyZWF0aCwgYW5kIGF3YXkgd2UgZ29vb29vbyAqLworCWRlNjIwX3JlYWRfYmxvY2soZGV2LCAoYnl0ZSAqKSZoZWFkZXJfYnVmLCBzaXplb2Yoc3RydWN0IGhlYWRlcl9idWYpKTsKKwlQUklOVEsoKCJwYWdlIHN0YXR1cz0weCUwMngsIG5leHRwYWdlPSVkLCBwYWNrZXRzaXplPSVkXG4iLAorCWhlYWRlcl9idWYuc3RhdHVzLCBoZWFkZXJfYnVmLlJ4X05leHRQYWdlLCBoZWFkZXJfYnVmLlJ4X0J5dGVDb3VudCkpOworCisJLyogUGxhdXNpYmxlIHBhZ2UgaGVhZGVyPyAqLworCXBhZ2VsaW5rID0gaGVhZGVyX2J1Zi5SeF9OZXh0UGFnZTsKKwlpZiAoKHBhZ2VsaW5rIDwgZmlyc3RfcnhfcGFnZSkgfHwgKGxhc3RfcnhfcGFnZSA8IHBhZ2VsaW5rKSkgeworCQkvKiBPdWNoLi4uIEZvcmdldCBpdCEgU2tpcCBhbGwgYW5kIHN0YXJ0IGFmcmVzaC4uLiAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmluZyBvdmVycnVuPyBSZXN0b3JpbmcuLi5cbiIsIGRldi0+bmFtZSk7CisJCS8qIFlvdSB3aW4gc29tZSwgeW91IGxvc2Ugc29tZS4gQW5kIHNvbWV0aW1lcyBwbGVudHkuLi4gKi8KKwkJYWRhcHRlcl9pbml0KGRldik7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKShkZXYtPnByaXYpKS0+cnhfb3Zlcl9lcnJvcnMrKzsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogT0ssIHRoaXMgbG9vayBnb29kLCBzbyBmYXIuIExldCdzIHNlZSBpZiBpdCdzIGNvbnNpc3RlbnQuLi4gKi8KKwkvKiBMZXQncyBjb21wdXRlIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBwYWNrZXQsIGJhc2VkIG9uIHdoZXJlIHdlIGFyZSAqLworCXBhZ2VsaW5rID0gbmV4dF9yeF9wYWdlICsKKwkJKChoZWFkZXJfYnVmLlJ4X0J5dGVDb3VudCArICg0IC0gMSArIDB4MTAwKSkgPj4gOCk7CisKKwkvKiBBcmUgd2UgZ29pbmcgdG8gd3JhcCBhcm91bmQgdGhlIHBhZ2UgY291bnRlcj8gKi8KKwlpZiAocGFnZWxpbmsgPiBsYXN0X3J4X3BhZ2UpCisJCXBhZ2VsaW5rIC09IChsYXN0X3J4X3BhZ2UgLSBmaXJzdF9yeF9wYWdlICsgMSk7CisKKwkvKiBJcyB0aGUgX2NvbXB1dGVkXyBuZXh0IHBhZ2UgbnVtYmVyIGVxdWFsIHRvIHdoYXQgdGhlIGFkYXB0ZXIgc2F5cz8gKi8KKwlpZiAocGFnZWxpbmsgIT0gaGVhZGVyX2J1Zi5SeF9OZXh0UGFnZSkgeworCQkvKiBOYWFoLCB3ZSdsbCBza2lwIHRoaXMgcGFja2V0LiBQcm9iYWJseSBib2d1cyBkYXRhIGFzIHdlbGwgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFBhZ2UgbGluayBvdXQgb2Ygc3luYyEgUmVzdG9yaW5nLi4uXG4iLCBkZXYtPm5hbWUpOworCQluZXh0X3J4X3BhZ2UgPSBoZWFkZXJfYnVmLlJ4X05leHRQYWdlOyAvKiBhdCBsZWFzdCBhIHRyeS4uLiAqLworCQlkZTYyMF9zZW5kX2NvbW1hbmQoZGV2LCBXX0RVTU1ZKTsKKwkJZGU2MjBfc2V0X3JlZ2lzdGVyKGRldiwgV19OUFJGLCBuZXh0X3J4X3BhZ2UpOworCQkoKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopKGRldi0+cHJpdikpLT5yeF9vdmVyX2Vycm9ycysrOworCQlyZXR1cm4gMDsKKwl9CisJbmV4dF9yeF9wYWdlID0gcGFnZWxpbms7CisKKwlzaXplID0gaGVhZGVyX2J1Zi5SeF9CeXRlQ291bnQgLSA0OworCWlmICgoc2l6ZSA8IFJVTlQpIHx8IChHSUFOVCA8IHNpemUpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJbGxlZ2FsIHBhY2tldCBzaXplOiAlZCFcbiIsIGRldi0+bmFtZSwgc2l6ZSk7CisJfQorCWVsc2UgeyAvKiBHb29kIHBhY2tldD8gKi8KKwkJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplKzIpOworCQlpZiAoc2tiID09IE5VTEwpIHsgLyogWWVhaCwgYnV0IG5vIHBsYWNlIHRvIHB1dCBpdC4uLiAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkbid0IGFsbG9jYXRlIGEgc2tfYnVmZiBvZiBzaXplICVkLlxuIiwgZGV2LT5uYW1lLCBzaXplKTsKKwkJCSgoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikoZGV2LT5wcml2KSktPnJ4X2Ryb3BwZWQrKzsKKwkJfQorCQllbHNlIHsgLyogWWVwISBHbyBnZXQgaXQhICovCisJCQlza2JfcmVzZXJ2ZShza2IsMik7CS8qIEFsaWduICovCisJCQlza2ItPmRldiA9IGRldjsKKwkJCS8qIHNrYi0+ZGF0YSBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHNrX2J1ZmYgZGF0YSBhcmVhICovCisJCQlidWZmZXIgPSBza2JfcHV0KHNrYixzaXplKTsKKwkJCS8qIGNvcHkgdGhlIHBhY2tldCBpbnRvIHRoZSBidWZmZXIgKi8KKwkJCWRlNjIwX3JlYWRfYmxvY2soZGV2LCBidWZmZXIsIHNpemUpOworCQkJUFJJTlRLKCgiUmVhZCAlZCBieXRlc1xuIiwgc2l6ZSkpOworCQkJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7IC8qIGRlbGl2ZXIgaXQgInVwc3RhaXJzIiAqLworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCS8qIGNvdW50IGFsbCByZWNlaXZlcyAqLworCQkJKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKShkZXYtPnByaXYpKS0+cnhfcGFja2V0cysrOworCQkJKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKShkZXYtPnByaXYpKS0+cnhfYnl0ZXMgKz0gc2l6ZTsKKwkJfQorCX0KKworCS8qIExldCdzIHBlZWsgYWhlYWQgdG8gc2VlIGlmIHdlIGhhdmUgcmVhZCB0aGUgbGFzdCBjdXJyZW50IHBhY2tldCAqLworCS8qIE5PVEUhIFdlJ3JlIF9ub3RfIGNoZWNraW5nIHRoZSAnRU1QVFknLWZsYWchIFRoaXMgc2VlbXMgYmV0dGVyLi4uICovCisJY3Vycl9wYWdlID0gZGU2MjBfZ2V0X3JlZ2lzdGVyKGRldiwgUl9DUFIpOworCWRlNjIwX3NldF9yZWdpc3RlcihkZXYsIFdfTlBSRiwgbmV4dF9yeF9wYWdlKTsKKwlQUklOVEsoKCJuZXh0X3J4X3BhZ2U9JWQgQ1BSPSVkXG4iLCBuZXh0X3J4X3BhZ2UsIGN1cnJfcGFnZSkpOworCisJcmV0dXJuIChuZXh0X3J4X3BhZ2UgIT0gY3Vycl9wYWdlKTsgLyogVGhhdCB3YXMgc2xpZ2h0bHkgdHJpY2t5Li4uICovCit9CisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmVzZXQgdGhlIGFkYXB0ZXIgdG8gYSBrbm93biBzdGF0ZQorICoKKyAqLworc3RhdGljIGludCBhZGFwdGVyX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwlzdGF0aWMgaW50IHdhc19kb3duOworCisJaWYgKChuaWNfZGF0YS5Nb2RlbCA9PSAzKSB8fCAobmljX2RhdGEuTW9kZWwgPT0gMCkpIHsgLyogQ1QgKi8KKwkJRUlQUmVnaXN0ZXIgPSBOQ1RMMDsKKwkJaWYgKG5pY19kYXRhLk1lZGlhICE9IDEpCisJCQlFSVBSZWdpc3RlciB8PSBOSVMwOwkvKiBub3QgQk5DICovCisJfQorCWVsc2UgaWYgKG5pY19kYXRhLk1vZGVsID09IDIpIHsgLyogVVRQICovCisJCUVJUFJlZ2lzdGVyID0gTkNUTDAgfCBOSVMwOworCX0KKworCWlmICh1dHApCisJCUVJUFJlZ2lzdGVyID0gTkNUTDAgfCBOSVMwOworCWlmIChibmMpCisJCUVJUFJlZ2lzdGVyID0gTkNUTDA7CisKKwlkZTYyMF9zZW5kX2NvbW1hbmQoZGV2LCBXX0NSIHwgUk5PUCB8IENMRUFSKTsKKwlkZTYyMF9zZW5kX2NvbW1hbmQoZGV2LCBXX0NSIHwgUk5PUCk7CisKKwlkZTYyMF9zZXRfcmVnaXN0ZXIoZGV2LCBXX1NDUiwgU0NSX0RFRik7CisJLyogZGlzYWJsZSByZWN2IHRvIHdhaXQgaW5pdCAqLworCWRlNjIwX3NldF9yZWdpc3RlcihkZXYsIFdfVENSLCBSWE9GRik7CisKKwkvKiBTZXQgdGhlIG5vZGUgSUQgaW4gdGhlIGFkYXB0ZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgKytpKSB7IC8qIFdfUEFSbiA9IDB4YWEgKyBuICovCisJCWRlNjIwX3NldF9yZWdpc3RlcihkZXYsIFdfUEFSMCArIGksIGRldi0+ZGV2X2FkZHJbaV0pOworCX0KKworCWRlNjIwX3NldF9yZWdpc3RlcihkZXYsIFdfRUlQLCBFSVBSZWdpc3Rlcik7CisKKwluZXh0X3J4X3BhZ2UgPSBmaXJzdF9yeF9wYWdlID0gREU2MjBfUlhfU1RBUlRfUEFHRTsKKwlpZiAobmljX2RhdGEuUkFNX1NpemUpCisJCWxhc3RfcnhfcGFnZSA9IG5pY19kYXRhLlJBTV9TaXplIC0gMTsKKwllbHNlIC8qIDY0ayBSQU0gKi8KKwkJbGFzdF9yeF9wYWdlID0gMjU1OworCisJZGU2MjBfc2V0X3JlZ2lzdGVyKGRldiwgV19TUFIsIGZpcnN0X3J4X3BhZ2UpOyAvKiBTdGFydCBQYWdlIFJlZ2lzdGVyKi8KKwlkZTYyMF9zZXRfcmVnaXN0ZXIoZGV2LCBXX0VQUiwgbGFzdF9yeF9wYWdlKTsgIC8qIEVuZCBQYWdlIFJlZ2lzdGVyICovCisJZGU2MjBfc2V0X3JlZ2lzdGVyKGRldiwgV19DUFIsIGZpcnN0X3J4X3BhZ2UpOy8qQ3VycmVudCBQYWdlIFJlZ2lzdGVyKi8KKwlkZTYyMF9zZW5kX2NvbW1hbmQoZGV2LCBXX05QUiB8IGZpcnN0X3J4X3BhZ2UpOyAvKiBOZXh0IFBhZ2UgUmVnaXN0ZXIqLworCWRlNjIwX3NlbmRfY29tbWFuZChkZXYsIFdfRFVNTVkpOworCWRlNjIwX3NldF9kZWxheShkZXYpOworCisJLyogRmluYWwgc2FuaXR5IGNoZWNrOiBBbnlib2R5IG91dCB0aGVyZT8gKi8KKwkvKiBMZXQncyBob3BlIHNvbWUgYml0cyBmcm9tIHRoZSBzdGF0dXNyZWdpc3RlciBtYWtlIGEgZ29vZCBjaGVjayAqLworI2RlZmluZSBDSEVDS19NQVNLICggIDAgfCBUWFNVQyB8ICBUMTYgIHwgIDAgIHwgUlhDUkMgfCBSWFNIT1JUIHwgIDAgIHwgIDAgICkKKyNkZWZpbmUgQ0hFQ0tfT0sgICAoICAwIHwgICAwICAgfCAgMCAgICB8ICAwICB8ICAgMCAgIHwgICAwICAgICB8ICAwICB8ICAwICApCisgICAgICAgIC8qIHN1Y2Nlc3M6ICAgWCAgICAgMCAgICAgIDAgICAgICAgWCAgICAgIDAgICAgICAgMCAgICAgICAgWCAgICAgWCAgKi8KKyAgICAgICAgLyogaWdub3JlOiAgIEVFREkgICAgICAgICAgICAgICAgUlhHT09EICAgICAgICAgICAgICAgICAgIENPTFMgIExOS1MqLworCisJaWYgKCgoaSA9IGRlNjIwX2dldF9yZWdpc3RlcihkZXYsIFJfU1RTKSkgJiBDSEVDS19NQVNLKSAhPSBDSEVDS19PSykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBTb21ldGhpbmcgaGFzIGhhcHBlbmVkIHRvIHRoZSBERS02MjAhICBQbGVhc2UgY2hlY2sgaXQiCisjaWZkZWYgU0hVVERPV05fV0hFTl9MT1NUCisJCQkiIGFuZCBkbyBhIG5ldyBpZmNvbmZpZyIKKyNlbmRpZgorCQkJIiEgKCUwMngpXG4iLCBkZXYtPm5hbWUsIGkpOworI2lmZGVmIFNIVVRET1dOX1dIRU5fTE9TVAorCQkvKiBHb29kYnllLCBjcnVlbCB3b3JsZC4uLiAqLworCQlkZXYtPmZsYWdzICY9IH5JRkZfVVA7CisJCWRlNjIwX2Nsb3NlKGRldik7CisjZW5kaWYKKwkJd2FzX2Rvd24gPSAxOworCQlyZXR1cm4gMTsgLyogZmFpbGVkICovCisJfQorCWlmICh3YXNfZG93bikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVGhhbmtzLCBJIGZlZWwgbXVjaCBiZXR0ZXIgbm93IVxuIiwgZGV2LT5uYW1lKTsKKwkJd2FzX2Rvd24gPSAwOworCX0KKworCS8qIEFsbCBPSywgZ28gYWhlYWQuLi4gKi8KKwlkZTYyMF9zZXRfcmVnaXN0ZXIoZGV2LCBXX1RDUiwgVENSX0RFRik7CisKKwlyZXR1cm4gMDsgLyogYWxsIG9rICovCit9CisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogT25seSBzdGFydC11cCBjb2RlIGJlbG93CisgKgorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENoZWNrIGlmIHRoZXJlIGlzIGEgREUtNjIwIGNvbm5lY3RlZAorICovCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBkZTYyMF9wcm9iZShpbnQgdW5pdCkKK3sKKwlieXRlIGNoZWNrYnl0ZSA9IDB4YTU7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgZXJyID0gLUVOT01FTTsKKwlpbnQgaTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCWlmICghZGV2KQorCQlnb3RvIG91dDsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCXNwaW5fbG9ja19pbml0KCZkZTYyMF9sb2NrKTsKKwkKKwkvKgorCSAqIFRoaXMgaXMgd2hlcmUgdGhlIGJhc2VfYWRkciBhbmQgaXJxIGdldHMgc2V0LgorCSAqIFR1bmFibGUgYXQgY29tcGlsZS10aW1lIGFuZCBpbnNtb2QtdGltZQorCSAqLworCWRldi0+YmFzZV9hZGRyID0gaW87CisJZGV2LT5pcnEgICAgICAgPSBpcnE7CisKKwkvKiBhbGxvdyBvdmVycmlkaW5nIHBhcmFtZXRlcnMgb24gY29tbWFuZCBsaW5lICovCisJaWYgKHVuaXQgPj0gMCkgeworCQlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisJfQorCQorCWlmIChkZTYyMF9kZWJ1ZykKKwkJcHJpbnRrKHZlcnNpb24pOworCisJcHJpbnRrKEtFUk5fSU5GTyAiRC1MaW5rIERFLTYyMCBwb2NrZXQgYWRhcHRlciIpOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgMywgImRlNjIwIikpIHsKKwkJcHJpbnRrKCIgaW8gMHglM2xYLCB3aGljaCBpcyBidXN5LlxuIiwgZGV2LT5iYXNlX2FkZHIpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gb3V0MTsKKwl9CisKKwkvKiBJbml0aWFsbHksIGNvbmZpZ3VyZSBiYXNpYyBuaWJibGUgbW9kZSwgc28gd2UgY2FuIHJlYWQgdGhlIEVFUFJPTSAqLworCU5JQ19DbWQgPSBERUZfTklDX0NNRDsKKwlkZTYyMF9zZXRfcmVnaXN0ZXIoZGV2LCBXX0VJUCwgRUlQUmVnaXN0ZXIpOworCisJLyogQW55Ym9keSBvdXQgdGhlcmU/ICovCisJZGU2MjBfc2V0X3JlZ2lzdGVyKGRldiwgV19DUFIsIGNoZWNrYnl0ZSk7CisJY2hlY2tieXRlID0gZGU2MjBfZ2V0X3JlZ2lzdGVyKGRldiwgUl9DUFIpOworCisJaWYgKChjaGVja2J5dGUgIT0gMHhhNSkgfHwgKHJlYWRfZWVwcm9tKGRldikgIT0gMCkpIHsKKwkJcHJpbnRrKCIgbm90IGlkZW50aWZpZWQgaW4gdGhlIHByaW50ZXIgcG9ydFxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0MjsKKwl9CisKKwkvKiBlbHNlLCBnb3QgaXQhICovCisJcHJpbnRrKCIsIEV0aGVybmV0IEFkZHJlc3M6ICUyLjJYIiwKKwkJZGV2LT5kZXZfYWRkclswXSA9IG5pY19kYXRhLk5vZGVJRFswXSk7CisJZm9yIChpID0gMTsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKwkJcHJpbnRrKCI6JTIuMlgiLCBkZXYtPmRldl9hZGRyW2ldID0gbmljX2RhdGEuTm9kZUlEW2ldKTsKKwkJZGV2LT5icm9hZGNhc3RbaV0gPSAweGZmOworCX0KKworCXByaW50aygiICglZGsgUkFNLCIsCisJCShuaWNfZGF0YS5SQU1fU2l6ZSkgPyAobmljX2RhdGEuUkFNX1NpemUgPj4gMikgOiA2NCk7CisKKwlpZiAobmljX2RhdGEuTWVkaWEgPT0gMSkKKwkJcHJpbnRrKCIgQk5DKVxuIik7CisJZWxzZQorCQlwcmludGsoIiBVVFApXG4iKTsKKworCWRldi0+Z2V0X3N0YXRzIAkJPSBnZXRfc3RhdHM7CisJZGV2LT5vcGVuIAkJPSBkZTYyMF9vcGVuOworCWRldi0+c3RvcCAJCT0gZGU2MjBfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgCT0gZGU2MjBfc3RhcnRfeG1pdDsKKwlkZXYtPnR4X3RpbWVvdXQgCT0gZGU2MjBfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gSFoqMjsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGRlNjIwX3NldF9tdWx0aWNhc3RfbGlzdDsKKwkKKwkvKiBiYXNlX2FkZHIgYW5kIGlycSBhcmUgYWxyZWFkeSBzZXQsIHNlZSBhYm92ZSEgKi8KKworCS8qIGR1bXAgZWVwcm9tICovCisJaWYgKGRlNjIwX2RlYnVnKSB7CisJCXByaW50aygiXG5FRVBST00gY29udGVudHM6XG4iKTsKKwkJcHJpbnRrKCJSQU1fU2l6ZSA9IDB4JTAyWFxuIiwgbmljX2RhdGEuUkFNX1NpemUpOworCQlwcmludGsoIk5vZGVJRCA9ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCQkJbmljX2RhdGEuTm9kZUlEWzBdLCBuaWNfZGF0YS5Ob2RlSURbMV0sCisJCQluaWNfZGF0YS5Ob2RlSURbMl0sIG5pY19kYXRhLk5vZGVJRFszXSwKKwkJCW5pY19kYXRhLk5vZGVJRFs0XSwgbmljX2RhdGEuTm9kZUlEWzVdKTsKKwkJcHJpbnRrKCJNb2RlbCA9ICVkXG4iLCBuaWNfZGF0YS5Nb2RlbCk7CisJCXByaW50aygiTWVkaWEgPSAlZFxuIiwgbmljX2RhdGEuTWVkaWEpOworCQlwcmludGsoIlNDUiA9IDB4JTAyeFxuIiwgbmljX2RhdGEuU0NSKTsKKwl9CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDI7CisJcmV0dXJuIGRldjsKKworb3V0MjoKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgMyk7CitvdXQxOgorCWZyZWVfbmV0ZGV2KGRldik7CitvdXQ6CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmVhZCBpbmZvIGZyb20gb24tYm9hcmQgRUVQUk9NCisgKgorICogTm90ZTogQml0d2lzZSBzZXJpYWwgSS9PIHRvL2Zyb20gdGhlIEVFUFJPTSB2aSB0aGUgc3RhdHVzIF9yZWdpc3Rlcl8hCisgKi8KKyNkZWZpbmUgc2VuZGl0KGRldixkYXRhKSBkZTYyMF9zZXRfcmVnaXN0ZXIoZGV2LCBXX0VJUCwgZGF0YSB8IEVJUFJlZ2lzdGVyKTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IF9faW5pdCBSZWFkQVdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZyb20pCit7CisJdW5zaWduZWQgc2hvcnQgZGF0YTsKKwlpbnQgbmJpdHM7CisKKwkvKiBjcyAgIFtfX35+XSBTRVQgU0VORCBTVEFURSAqLworCS8qIGRpICAgW19fX19dICAgICAgICAgICAgICAgICovCisJLyogc2NrICBbX35+X10gICAgICAgICAgICAgICAgKi8KKwlzZW5kaXQoZGV2LCAwKTsgc2VuZGl0KGRldiwgMSk7IHNlbmRpdChkZXYsIDUpOyBzZW5kaXQoZGV2LCA0KTsKKworCS8qIFNlbmQgdGhlIDktYml0IGFkZHJlc3MgZnJvbSB3aGVyZSB3ZSB3YW50IHRvIHJlYWQgdGhlIDE2LWJpdCB3b3JkICovCisJZm9yIChuYml0cyA9IDk7IG5iaXRzID4gMDsgLS1uYml0cywgZnJvbSA8PD0gMSkgeworCQlpZiAoZnJvbSAmIDB4MDEwMCkgeyAvKiBiaXQgc2V0PyAqLworCQkJLyogY3MgICAgW35+fn5dIFNFTkQgMSAqLworCQkJLyogZGkgICAgW35+fn5dICAgICAgICAqLworCQkJLyogc2NrICAgW19+fl9dICAgICAgICAqLworCQkJc2VuZGl0KGRldiwgNik7IHNlbmRpdChkZXYsIDcpOyBzZW5kaXQoZGV2LCA3KTsgc2VuZGl0KGRldiwgNik7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBjcyAgICBbfn5+fl0gU0VORCAwICovCisJCQkvKiBkaSAgICBbX19fX10gICAgICAgICovCisJCQkvKiBzY2sgICBbX35+X10gICAgICAgICovCisJCQlzZW5kaXQoZGV2LCA0KTsgc2VuZGl0KGRldiwgNSk7IHNlbmRpdChkZXYsIDUpOyBzZW5kaXQoZGV2LCA0KTsKKwkJfQorCX0KKworCS8qIFNoaWZ0IGluIHRoZSAxNi1iaXQgd29yZC4gVGhlIGJpdHMgYXBwZWFyIHNlcmlhbGx5IGluIEVFREkgKD0weDgwKSAqLworCWZvciAoZGF0YSA9IDAsIG5iaXRzID0gMTY7IG5iaXRzID4gMDsgLS1uYml0cykgeworCQkvKiBjcyAgICBbfn5+fl0gU0VORCAwICovCisJCS8qIGRpICAgIFtfX19fXSAgICAgICAgKi8KKwkJLyogc2NrICAgW19+fl9dICAgICAgICAqLworCQlzZW5kaXQoZGV2LCA0KTsgc2VuZGl0KGRldiwgNSk7IHNlbmRpdChkZXYsIDUpOyBzZW5kaXQoZGV2LCA0KTsKKwkJZGF0YSA9IChkYXRhIDw8IDEpIHwgKChkZTYyMF9nZXRfcmVnaXN0ZXIoZGV2LCBSX1NUUykgJiBFRURJKSA+PiA3KTsKKwl9CisJLyogY3MgICAgW19fX19dIFJFU0VUIFNFTkQgU1RBVEUgKi8KKwkvKiBkaSAgICBbX19fX10gICAgICAgICAgICAgICAgICAqLworCS8qIHNjayAgIFtffn5fXSAgICAgICAgICAgICAgICAgICovCisJc2VuZGl0KGRldiwgMCk7IHNlbmRpdChkZXYsIDEpOyBzZW5kaXQoZGV2LCAxKTsgc2VuZGl0KGRldiwgMCk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBfX2luaXQgcmVhZF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBzaG9ydCB3cmQ7CisKKwkvKiBELUxpbmsgRXRoZXJuZXQgYWRkcmVzc2VzIGFyZSBpbiB0aGUgc2VyaWVzICAwMDo4MDpjODo3WDpYWDpYWDpYWCAqLworCXdyZCA9IFJlYWRBV29yZChkZXYsIDB4MWFhKTsJLyogYnl0ZXMgMCArIDEgb2YgTm9kZUlEICovCisJaWYgKCFjbG9uZSAmJiAod3JkICE9IGh0b25zKDB4MDA4MCkpKSAvKiBWYWxpZCBELUxpbmsgZXRoZXIgc2VxdWVuY2U/ICovCisJCXJldHVybiAtMTsgLyogTm9wZSwgbm90IGEgREUtNjIwICovCisJbmljX2RhdGEuTm9kZUlEWzBdID0gd3JkICYgMHhmZjsKKwluaWNfZGF0YS5Ob2RlSURbMV0gPSB3cmQgPj4gODsKKworCXdyZCA9IFJlYWRBV29yZChkZXYsIDB4MWFiKTsJLyogYnl0ZXMgMiArIDMgb2YgTm9kZUlEICovCisJaWYgKCFjbG9uZSAmJiAoKHdyZCAmIDB4ZmYpICE9IDB4YzgpKSAvKiBWYWxpZCBELUxpbmsgZXRoZXIgc2VxdWVuY2U/ICovCisJCXJldHVybiAtMTsgLyogTm9wZSwgbm90IGEgREUtNjIwICovCisJbmljX2RhdGEuTm9kZUlEWzJdID0gd3JkICYgMHhmZjsKKwluaWNfZGF0YS5Ob2RlSURbM10gPSB3cmQgPj4gODsKKworCXdyZCA9IFJlYWRBV29yZChkZXYsIDB4MWFjKTsJLyogYnl0ZXMgNCArIDUgb2YgTm9kZUlEICovCisJbmljX2RhdGEuTm9kZUlEWzRdID0gd3JkICYgMHhmZjsKKwluaWNfZGF0YS5Ob2RlSURbNV0gPSB3cmQgPj4gODsKKworCXdyZCA9IFJlYWRBV29yZChkZXYsIDB4MWFkKTsJLyogUkFNIHNpemUgaW4gcGFnZXMgKDI1NiBieXRlcykuIDAgPSA2NGsgKi8KKwluaWNfZGF0YS5SQU1fU2l6ZSA9ICh3cmQgPj4gOCk7CisKKwl3cmQgPSBSZWFkQVdvcmQoZGV2LCAweDFhZSk7CS8qIGhhcmR3YXJlIG1vZGVsIChDVCA9IDMpICovCisJbmljX2RhdGEuTW9kZWwgPSAod3JkICYgMHhmZik7CisKKwl3cmQgPSBSZWFkQVdvcmQoZGV2LCAweDFhZik7IC8qIG1lZGlhIChpbmRpY2F0ZXMgQk5DL1VUUCkgKi8KKwluaWNfZGF0YS5NZWRpYSA9ICh3cmQgJiAweGZmKTsKKworCXdyZCA9IFJlYWRBV29yZChkZXYsIDB4MWE4KTsgLyogU3lzdGVtIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKwluaWNfZGF0YS5TQ1IgPSAod3JkID4+IDgpOworCisJcmV0dXJuIDA7IC8qIG5vIGVycm9ycyAqLworfQorDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIExvYWRhYmxlIG1vZHVsZSBza2VsZXRvbgorICoKKyAqLworI2lmZGVmIE1PRFVMRQorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZTYyMF9kZXY7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWRlNjIwX2RldiA9IGRlNjIwX3Byb2JlKC0xKTsKKwlpZiAoSVNfRVJSKGRlNjIwX2RldikpCisJCXJldHVybiBQVFJfRVJSKGRlNjIwX2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihkZTYyMF9kZXYpOworCXJlbGVhc2VfcmVnaW9uKGRlNjIwX2Rldi0+YmFzZV9hZGRyLCAzKTsKKwlmcmVlX25ldGRldihkZTYyMF9kZXYpOworfQorI2VuZGlmIC8qIE1PRFVMRSAqLworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisMCisvKgorICogKGFkZCAnLURNT0RVTEUnIHdoZW4gY29tcGlsaW5nIGFzIGxvYWRhYmxlIG1vZHVsZSkKKyAqCisgKiBjb21waWxlLWNvbW1hbmQ6CisgKglnY2MgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU8yIFwKKyAqCSAtZm9taXQtZnJhbWUtcG9pbnRlciAtbTQ4NiBcCisgKgktSS91c3Ivc3JjL2xpbnV4L2luY2x1ZGUgLUkuLi8uLi9uZXQvaW5ldCAtYyBkZTYyMC5jCisqLworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBrZXJuZWwtY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1EX19LRVJORUxfXyAtSWxpbnV4L2luY2x1ZGUgLUkuLi8uLi9uZXQvaW5ldCAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PMiAtbTQ4NiAtYyBkZTYyMC5jIgorICogIG1vZHVsZS1jb21waWxlLWNvbW1hbmQ6ICJnY2MgLURfX0tFUk5FTF9fIC1ETU9EVUxFIC1JbGludXgvaW5jbHVkZSAtSS4uLy4uL25ldC9pbmV0IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU8yIC1tNDg2IC1jIGRlNjIwLmMiCisgKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1EX19LRVJORUxfXyAtRE1PRFVMRSAtSWxpbnV4L2luY2x1ZGUgLUkuLi8uLi9uZXQvaW5ldCAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PMiAtbTQ4NiAtYyBkZTYyMC5jIgorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZTYyMC5oIGIvZHJpdmVycy9uZXQvZGU2MjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGQ5YTg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZGU2MjAuaApAQCAtMCwwICsxLDExNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogRGVmaW5pdGlvbiBvZiBELUxpbmsgREUtNjIwIEV0aGVybmV0IFBvY2tldCBhZGFwdGVyICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogREUtNjIwJ3MgQ01EIHBvcnQgQ29tbWFuZCAqLworI2RlZmluZSBDUzAJCTB4MDgJLyogMS0+MCBjb21tYW5kIHN0cm9iZSAqLworI2RlZmluZSBJQ0VOCQkweDA0CS8qIDA9ZW5hYmxlIERMMzUyMCBob3N0IGludGVyZmFjZSAqLworI2RlZmluZSBEUzAJCTB4MDIJLyogMS0+MCBkYXRhIHN0cm9iZSAwICovCisjZGVmaW5lIERTMQkJMHgwMQkvKiAxLT4wIGRhdGEgc3Ryb2JlIDEgKi8KKworI2RlZmluZSBXRElSCQkweDIwCS8qIGdlbmVyYWwgMD1yZWFkICAxPXdyaXRlICovCisjZGVmaW5lIFJESVIJCTB4MDAJLyogIChub3QgMTAwJSBjb25maXJtICkgKi8KKyNkZWZpbmUgUFMyV0RJUgkJMHgwMAkvKiBwcy8yIG1vZGUgMT1yZWFkLCAwPXdyaXRlICovCisjZGVmaW5lIFBTMlJESVIJCTB4MjAKKworI2RlZmluZSBJUlFFTgkJMHgxMAkvKiAxID0gZW5hYmxlIHByaW50ZXIgSVJRIGxpbmUgKi8KKyNkZWZpbmUgU0VMRUNUSU4JMHgwOAkvKiAxID0gc2VsZWN0IHByaW50ZXIgKi8KKyNkZWZpbmUgSU5JVFAJCTB4MDQJLyogMCA9IGluaXRpYWwgcHJpbnRlciAqLworI2RlZmluZSBBVVRPRkVFRAkweDAyCS8qIDEgPSBwcmludGVyIGF1dG8gZm9ybSBmZWVkICovCisjZGVmaW5lIFNUUk9CRQkJMHgwMQkvKiAwLT4xIGRhdGEgc3Ryb2JlICovCisKKyNkZWZpbmUgUkVTRVQJCTB4MDgKKyNkZWZpbmUgTklTMAkJMHgyMAkvKiAwID0gQk5DLCAxID0gVVRQICovCisjZGVmaW5lIE5DVEwwCQkweDEwCisKKy8qIERFLTYyMCBESUMgQ29tbWFuZCAqLworI2RlZmluZSBXX0RVTU1ZCQkweDAwCS8qIERJQyByZXNlcnZlZCBjb21tYW5kICovCisjZGVmaW5lIFdfQ1IJCTB4MjAJLyogRElDIHdyaXRlIGNvbW1hbmQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgV19OUFIJCTB4NDAJLyogRElDIHdyaXRlIE5leHQgUGFnZSBSZWdpc3RlciAqLworI2RlZmluZSBXX1RCUgkJMHg2MAkvKiBESUMgd3JpdGUgVHggQnl0ZSBDb3VudCAxIHJlZyAqLworI2RlZmluZSBXX1JTQQkJMHg4MAkvKiBESUMgd3JpdGUgUmVtb3RlIFN0YXJ0IEFkZHIgMSAqLworCisvKiBERS02MjAncyBTVEFUIHBvcnQgYml0cyA3LTQgKi8KKyNkZWZpbmUgRU1QVFkJCTB4ODAJLyogMSA9IHJlY2VpdmUgYnVmZmVyIGVtcHR5ICovCisjZGVmaW5lIElOVExFVkVMCTB4NDAJLyogMSA9IGludGVycnVwdCBsZXZlbCBpcyBoaWdoICovCisjZGVmaW5lIFRYQkYxCQkweDIwCS8qIDEgPSB0cmFuc21pdCBidWZmZXIgMSBpcyBpbiB1c2UgKi8KKyNkZWZpbmUgVFhCRjAJCTB4MTAJLyogMSA9IHRyYW5zbWl0IGJ1ZmZlciAwIGlzIGluIHVzZSAqLworI2RlZmluZSBSRUFEWQkJMHgwOAkvKiAxID0gaC93IHJlYWR5IHRvIGFjY2VwdCBjbWQvZGF0YSAqLworCisvKiBJREMgMSBDb21tYW5kICovCisjZGVmaW5lCVdfUlNBMQkJMHhhMAkvKiB3cml0ZSByZW1vdGUgc3RhcnQgYWRkcmVzcyAxICovCisjZGVmaW5lCVdfUlNBMAkJMHhhMQkvKiB3cml0ZSByZW1vdGUgc3RhcnQgYWRkcmVzcyAwICovCisjZGVmaW5lCVdfTlBSRgkJMHhhMgkvKiB3cml0ZSBuZXh0IHBhZ2UgcmVnaXN0ZXIgTlBSMTUtTlBSOCAqLworI2RlZmluZQlXX0RGUgkJMHhhMwkvKiB3cml0ZSBkZWxheSBmYWN0b3IgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJV19DUFIJCTB4YTQJLyogd3JpdGUgY3VycmVudCBwYWdlIHJlZ2lzdGVyICovCisjZGVmaW5lCVdfU1BSCQkweGE1CS8qIHdyaXRlIHN0YXJ0IHBhZ2UgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJV19FUFIJCTB4YTYJLyogd3JpdGUgZW5kIHBhZ2UgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJV19TQ1IJCTB4YTcJLyogd3JpdGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUJV19UQ1IJCTB4YTgJLyogd3JpdGUgVHJhbnNjZWl2ZXIgQ29uZmlndXJhdGlvbiByZWcgKi8KKyNkZWZpbmUJV19FSVAJCTB4YTkJLyogd3JpdGUgRUVQTSBJbnRlcmZhY2UgcG9ydCAqLworI2RlZmluZQlXX1BBUjAJCTB4YWEJLyogd3JpdGUgcGh5c2ljYWwgYWRkcmVzcyByZWdpc3RlciAwICovCisjZGVmaW5lCVdfUEFSMQkJMHhhYgkvKiB3cml0ZSBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJV19QQVIyCQkweGFjCS8qIHdyaXRlIHBoeXNpY2FsIGFkZHJlc3MgcmVnaXN0ZXIgMiAqLworI2RlZmluZQlXX1BBUjMJCTB4YWQJLyogd3JpdGUgcGh5c2ljYWwgYWRkcmVzcyByZWdpc3RlciAzICovCisjZGVmaW5lCVdfUEFSNAkJMHhhZQkvKiB3cml0ZSBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lzdGVyIDQgKi8KKyNkZWZpbmUJV19QQVI1CQkweGFmCS8qIHdyaXRlIHBoeXNpY2FsIGFkZHJlc3MgcmVnaXN0ZXIgNSAqLworCisvKiBJREMgMiBDb21tYW5kICovCisjZGVmaW5lCVJfU1RTCQkweGMwCS8qIHJlYWQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lCVJfQ1BSCQkweGMxCS8qIHJlYWQgY3VycmVudCBwYWdlIHJlZ2lzdGVyICovCisjZGVmaW5lCVJfQlBSCQkweGMyCS8qIHJlYWQgYm91bmRhcnkgcGFnZSByZWdpc3RlciAqLworI2RlZmluZQlSX1REUgkJMHhjMwkvKiByZWFkIHRpbWUgZG9tYWluIHJlZmxlY3RvbWV0cnkgcmVnICovCisKKy8qIFNUQVRVUyBSZWdpc3RlciAqLworI2RlZmluZSBFRURJCQkweDgwCS8qIEVFUE0gRE8gcGluICovCisjZGVmaW5lIFRYU1VDCQkweDQwCS8qIHR4IHN1Y2Nlc3MgKi8KKyNkZWZpbmUgVDE2CQkweDIwCS8qIHR4IGZhaWwgMTYgdGltZXMgKi8KKyNkZWZpbmUgVFMxCQkweDQwCS8qIDA9VHggc3VjY2VzcywgMT1UMTYgKi8KKyNkZWZpbmUgVFMwCQkweDIwCS8qIDA9VHggc3VjY2VzcywgMT1UMTYgKi8KKyNkZWZpbmUgUlhHT09ECQkweDEwCS8qIHJ4IGEgZ29vZCBwYWNrZXQgKi8KKyNkZWZpbmUgUlhDUkMJCTB4MDgJLyogcnggYSBDUkMgZXJyb3IgcGFja2V0ICovCisjZGVmaW5lIFJYU0hPUlQJCTB4MDQJLyogcnggYSBzaG9ydCBwYWNrZXQgKi8KKyNkZWZpbmUgQ09MUwkJMHgwMgkvKiBjb2F4aWFsIGNvbGxpc2lvbiBzdGF0dXMgKi8KKyNkZWZpbmUgTE5LUwkJMHgwMQkvKiBVVFAgbGluayBzdGF0dXMgKi8KKworLyogQ29tbWFuZCBSZWdpc3RlciAqLworI2RlZmluZSBDTEVBUgkJMHgxMAkvKiByZXNldCBwYXJ0IG9mIGhhcmR3YXJlICovCisjZGVmaW5lIE5PUEVSCQkweDA4CS8qIE5vIE9wZXJhdGlvbiAqLworI2RlZmluZSBSTk9QCQkweDA4CisjZGVmaW5lIFJSQQkJMHgwNgkvKiBBZnRlciBSUiB0aGVuIGF1dG8tYWR2YW5jZSBOUFIgJiBCUFIoPU5QUi0xKSAqLworI2RlZmluZSBSUk4JCTB4MDQJLyogTm9ybWFsIFJlbW90ZSBSZWFkIG1vZGUgKi8KKyNkZWZpbmUgUlcxCQkweDAyCS8qIFJlbW90ZSBXcml0ZSB0eCBidWZmZXIgMSAgKCBwYWdlIDYgLSAxMSApICovCisjZGVmaW5lIFJXMAkJMHgwMAkvKiBSZW1vdGUgV3JpdGUgdHggYnVmZmVyIDAgICggcGFnZSAwIC0gNSApICovCisjZGVmaW5lIFRYRU4JCTB4MDEJLyogMC0+MSB0eCBlbmFibGUgKi8KKworLyogU3lzdGVtIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVEVTVE9OCQkweDgwCS8qIHRlc3QgaG9zdCBkYXRhIHRyYW5zZmVyIHJlbGlhYmlsaXR5ICovCisjZGVmaW5lIFNMRUVQCQkweDQwCS8qIHNsZWVwIG1vZGUgKi8KKyNpZiAwCisjZGVmaW5lIEZBU1RNT0RFCTB4MDQJLyogZmFzdCBtb2RlIGZvciBpbnRlbCA4MjM2MFNMIGZhc3QgbW9kZSAqLworI2RlZmluZSBCWVRFTU9ERQkweDAyCS8qIGJ5dGUgbW9kZSAqLworI2Vsc2UKKyNkZWZpbmUgRkFTVE1PREUJMHgyMAkvKiBmYXN0IG1vZGUgZm9yIGludGVsIDgyMzYwU0wgZmFzdCBtb2RlICovCisjZGVmaW5lIEJZVEVNT0RFCTB4MTAJLyogYnl0ZSBtb2RlICovCisjZW5kaWYKKyNkZWZpbmUgTklCQkxFTU9ERQkweDAwCS8qIG5pYmJsZSBtb2RlICovCisjZGVmaW5lIElSUUlOVgkJMHgwOAkvKiB0dXJuIG9mZiBJUlEgbGluZSBpbnZlcnRlciAqLworI2RlZmluZSBJUlFOTUwJCTB4MDAJLyogdHVybiBvbiBJUlEgbGluZSBpbnZlcnRlciAqLworI2RlZmluZSBJTlRPTgkJMHgwNAorI2RlZmluZSBBVVRPRkZTRVQJMHgwMgkvKiBhdXRvIHNoaWZ0IGFkZHJlc3MgdG8gVFBSKzEyICovCisjZGVmaW5lIEFVVE9UWAkJMHgwMQkvKiBhdXRvIHR4IHdoZW4gbGVhdmUgUlcgbW9kZSAqLworCisvKiBUcmFuc2NlaXZlciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIEpBQkJFUgkJMHg4MAkvKiBnZW5lcmF0ZSBqYWJiZXIgY29uZGl0aW9uICovCisjZGVmaW5lIFRYU1VDSU5UCTB4NDAJLyogZW5hYmxlIHR4IHN1Y2Nlc3MgaW50ZXJydXB0ICovCisjZGVmaW5lIFQxNklOVAkJMHgyMAkvKiBlbmFibGUgVDE2IGludGVycnVwdCAqLworI2RlZmluZSBSWEVSUlBLVAkweDEwCS8qIGFjY2VwdCBDUkMgZXJyb3Igb3Igc2hvcnQgcGFja2V0ICovCisjZGVmaW5lIEVYVEVSTkFMQjIJMHgwQwkvKiBleHRlcm5hbCBsb29wYmFjayAyICovCisjZGVmaW5lIEVYVEVSTkFMQjEJMHgwOAkvKiBleHRlcm5hbCBsb29wYmFjayAxICovCisjZGVmaW5lIElOVEVSTkFMQgkweDA0CS8qIGludGVybmFsIGxvb3BiYWNrICovCisjZGVmaW5lIE5NTE9QRVJBVEUJMHgwMAkvKiBub3JtYWwgb3BlcmF0aW9uICovCisjZGVmaW5lIFJYUEJNCQkweDAzCS8qIHJ4IHBoeXNpY2FsLCBicm9hZGNhc3QsIG11bHRpY2FzdCAqLworI2RlZmluZSBSWFBCCQkweDAyCS8qIHJ4IHBoeXNpY2FsLCBicm9hZGNhc3QgKi8KKyNkZWZpbmUgUlhBTEwJCTB4MDEJLyogcnggYWxsIHBhY2tldCAqLworI2RlZmluZSBSWE9GRgkJMHgwMAkvKiByeCBkaXNhYmxlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZWNsYW5jZS5jIGIvZHJpdmVycy9uZXQvZGVjbGFuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjFjODMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZGVjbGFuY2UuYwpAQCAtMCwwICsxLDEzMjAgQEAKKy8qICAgICAKKyAqICAgIExhbmNlIGV0aGVybmV0IGRyaXZlciBmb3IgdGhlIE1JUFMgcHJvY2Vzc29yIGJhc2VkCisgKiAgICAgIERFQ3N0YXRpb24gZmFtaWx5CisgKgorICoKKyAqICAgICAgYWRvcHRlZCBmcm9tIHN1bmxhbmNlLmMgYnkgUmljaGFyZCB2YW4gZGVuIEJlcmcKKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgTWFjaWVqIFcuIFJvenlja2kKKyAqCisgKiAgICAgIGFkZGl0aW9uYWwgc291cmNlczoKKyAqICAgICAgLSBQTUFELUFBIFRVUkJPY2hhbm5lbCBFdGhlcm5ldCBNb2R1bGUgRnVuY3Rpb25hbCBTcGVjaWZpY2F0aW9uLAorICogICAgICAgIFJldmlzaW9uIDEuMgorICoKKyAqICAgICAgSGlzdG9yeToKKyAqCisgKiAgICAgIHYwLjAwMTogVGhlIGtlcm5lbCBhY2NlcHRzIHRoZSBjb2RlIGFuZCBpdCBzaG93cyB0aGUgaGFyZHdhcmUgYWRkcmVzcy4KKyAqCisgKiAgICAgIHYwLjAwMjogUmVtb3ZlZCBtb3N0IHNwYXJjIHN0dWZmLCBsZWZ0IG9ubHkgc29tZSBtb2R1bGUgYW5kIGRtYSBzdHVmZi4KKyAqCisgKiAgICAgIHYwLjAwMzogRW5oYW5jZWQgYmFzZSBhZGRyZXNzIGNhbGN1bGF0aW9uIGZyb20gcHJvcG9zYWxzIGJ5CisgKiAgICAgICAgICAgICAgSGFyYWxkIEtvZXJmZ2VuIGFuZCBUaG9tYXMgUmllbWVyLgorICoKKyAqICAgICAgdjAuMDA0OiBsYW5jZS1yZWdzIGlzIHBvaW50aW5nIGF0IHRoZSByaWdodCBhZGRyZXNzZXMsIGFkZGVkIHByb20KKyAqICAgICAgICAgICAgICBjaGVjay4gRmlyc3Qgc3RhcnQgb2YgYWRkcmVzcyBtYXBwaW5nIGFuZCBETUEuCisgKgorICogICAgICB2MC4wMDU6IHN0YXJ0ZWQgdG8gcGxheSBhcm91bmQgd2l0aCBMQU5DRS1ETUEuIFRoaXMgZHJpdmVyIHdpbGwgbm90CisgKiAgICAgICAgICAgICAgd29yayBmb3Igbm9uIElPQVNJQyBsYW5jZXMuIEhLCisgKgorICogICAgICB2MC4wMDY6IGFkZGVkIHBvaW50ZXIgYXJyYXlzIHRvIGxhbmNlX3ByaXZhdGUgYW5kIHNldHVwIHJvdXRpbmUgZm9yCisgKiAgICAgICAgICAgICAgdGhlbSBpbiBkZWNfbGFuY2VfaW5pdC4gSEsKKyAqCisgKiAgICAgIHYwLjAwNzogQmlnIHNoaXQuIFRoZSBMQU5DRSBzZWVtcyB0byB1c2UgYSBkaWZmZXJlbnQgRE1BIG1lY2hhbmlzbSB0bworICogICAgICAgICAgICAgIGFjY2VzcyB0aGUgaW5pdCBibG9jay4gVGhpcyBsb29rcyBsaWtlIG9uZSAoc2hvcnQpIHdvcmQgYXQgYQorICogICAgICAgICAgICAgIHRpbWUsIGJ1dCB0aGUgc21hbGxlc3QgYW1vdW50IHRoZSBJT0FTSUMgY2FuIHRyYW5zZmVyIGlzIGEKKyAqICAgICAgICAgICAgICAobG9uZykgd29yZC4gU28gd2UgaGF2ZSBhIDItMiBwYWRkaW5nIGhlcmUuIENoYW5nZWQKKyAqICAgICAgICAgICAgICBsYW5jZV9pbml0X2Jsb2NrIGFjY29yZGluZ2x5LiBUaGUgMTYtMTYgcGFkZGluZyBmb3IgdGhlIGJ1ZmZlcnMKKyAqICAgICAgICAgICAgICBzZWVtcyB0byBiZSBjb3JyZWN0LiBISworICoKKyAqICAgICAgdjAuMDA4OiBtb2RzIHRvIG1ha2UgUE1BWF9MQU5DRSB3b3JrLiAwMS8wOS8xOTk5IHRyaWVtZXIKKyAqCisgKiAgICAgIHYwLjAwOTogTW9kdWxlIHN1cHBvcnQgZml4ZXMsIG11bHRpcGxlIGludGVyZmFjZXMgc3VwcG9ydCwgdmFyaW91cworICogICAgICAgICAgICAgIGJpdHMuIG1hY3JvCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KKyNpbmNsdWRlIDxhc20vZGVjL2ludGVycnVwdHMuaD4KKyNpbmNsdWRlIDxhc20vZGVjL2lvYXNpYy5oPgorI2luY2x1ZGUgPGFzbS9kZWMvaW9hc2ljX2FkZHJzLmg+CisjaW5jbHVkZSA8YXNtL2RlYy9rbjAxLmg+CisjaW5jbHVkZSA8YXNtL2RlYy9tYWNodHlwZS5oPgorI2luY2x1ZGUgPGFzbS9kZWMvdGMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KKyJkZWNsYW5jZS5jOiB2MC4wMDkgYnkgTGludXggTUlQUyBERUNzdGF0aW9uIHRhc2sgZm9yY2VcbiI7CisKK01PRFVMRV9BVVRIT1IoIkxpbnV4IE1JUFMgREVDc3RhdGlvbiB0YXNrIGZvcmNlIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRFQyBMQU5DRSAoREVDc3RhdGlvbiBvbmJvYXJkLCBQTUFELXh4KSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIGNhcmQgdHlwZXMKKyAqLworI2RlZmluZSBBU0lDX0xBTkNFIDEKKyNkZWZpbmUgUE1BRF9MQU5DRSAyCisjZGVmaW5lIFBNQVhfTEFOQ0UgMworCisjaWZuZGVmIENPTkZJR19UQwordW5zaWduZWQgbG9uZyBzeXN0ZW1fYmFzZTsKK3Vuc2lnbmVkIGxvbmcgZG1hcHRyOworI2VuZGlmCisKKyNkZWZpbmUgTEVfQ1NSMCAwCisjZGVmaW5lIExFX0NTUjEgMQorI2RlZmluZSBMRV9DU1IyIDIKKyNkZWZpbmUgTEVfQ1NSMyAzCisKKyNkZWZpbmUgTEVfTU9fUFJPTSAgICAgIDB4ODAwMAkvKiBFbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworCisjZGVmaW5lCUxFX0MwX0VSUgkweDgwMDAJLyogRXJyb3I6IHNldCBpZiBCQUIsIFNRRSwgTUlTUyBvciBNRSBpcyBzZXQgKi8KKyNkZWZpbmUJTEVfQzBfQkFCTAkweDQwMDAJLyogQkFCOiAgQmFiYmxlOiB0eCB0aW1lb3V0LiAqLworI2RlZmluZQlMRV9DMF9DRVJSCTB4MjAwMAkvKiBTUUU6ICBTaWduYWwgcXVhbGl0eSBlcnJvciAqLworI2RlZmluZQlMRV9DMF9NSVNTCTB4MTAwMAkvKiBNSVNTOiBNaXNzZWQgYSBwYWNrZXQgKi8KKyNkZWZpbmUJTEVfQzBfTUVSUgkweDA4MDAJLyogTUU6ICAgTWVtb3J5IGVycm9yICovCisjZGVmaW5lCUxFX0MwX1JJTlQJMHgwNDAwCS8qIFJlY2VpdmVkIGludGVycnVwdCAqLworI2RlZmluZQlMRV9DMF9USU5UCTB4MDIwMAkvKiBUcmFuc21pdHRlciBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJTEVfQzBfSURPTgkweDAxMDAJLyogSUZJTjogSW5pdCBmaW5pc2hlZC4gKi8KKyNkZWZpbmUJTEVfQzBfSU5UUgkweDAwODAJLyogSW50ZXJydXB0IG9yIGVycm9yICovCisjZGVmaW5lCUxFX0MwX0lORUEJMHgwMDQwCS8qIEludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUJTEVfQzBfUlhPTgkweDAwMjAJLyogUmVjZWl2ZXIgb24gKi8KKyNkZWZpbmUJTEVfQzBfVFhPTgkweDAwMTAJLyogVHJhbnNtaXR0ZXIgb24gKi8KKyNkZWZpbmUJTEVfQzBfVERNRAkweDAwMDgJLyogVHJhbnNtaXR0ZXIgZGVtYW5kICovCisjZGVmaW5lCUxFX0MwX1NUT1AJMHgwMDA0CS8qIFN0b3AgdGhlIGNhcmQgKi8KKyNkZWZpbmUJTEVfQzBfU1RSVAkweDAwMDIJLyogU3RhcnQgdGhlIGNhcmQgKi8KKyNkZWZpbmUJTEVfQzBfSU5JVAkweDAwMDEJLyogSW5pdCB0aGUgY2FyZCAqLworCisjZGVmaW5lCUxFX0MzX0JTV1AJMHg0CS8qIFNXQVAgKi8KKyNkZWZpbmUJTEVfQzNfQUNPTgkweDIJLyogQUxFIENvbnRyb2wgKi8KKyNkZWZpbmUJTEVfQzNfQkNPTgkweDEJLyogQnl0ZSBjb250cm9sICovCisKKy8qIFJlY2VpdmUgbWVzc2FnZSBkZXNjcmlwdG9yIDEgKi8KKyNkZWZpbmUgTEVfUjFfT1dOICAgICAgIDB4ODAJLyogV2hvIG93bnMgdGhlIGVudHJ5ICovCisjZGVmaW5lIExFX1IxX0VSUiAgICAgICAweDQwCS8qIEVycm9yOiBpZiBGUkEsIE9GTCwgQ1JDIG9yIEJVRiBpcyBzZXQgKi8KKyNkZWZpbmUgTEVfUjFfRlJBICAgICAgIDB4MjAJLyogRlJBOiBGcmFtZSBlcnJvciAqLworI2RlZmluZSBMRV9SMV9PRkwgICAgICAgMHgxMAkvKiBPRkw6IEZyYW1lIG92ZXJmbG93ICovCisjZGVmaW5lIExFX1IxX0NSQyAgICAgICAweDA4CS8qIENSQyBlcnJvciAqLworI2RlZmluZSBMRV9SMV9CVUYgICAgICAgMHgwNAkvKiBCVUY6IEJ1ZmZlciBlcnJvciAqLworI2RlZmluZSBMRV9SMV9TT1AgICAgICAgMHgwMgkvKiBTdGFydCBvZiBwYWNrZXQgKi8KKyNkZWZpbmUgTEVfUjFfRU9QICAgICAgIDB4MDEJLyogRW5kIG9mIHBhY2tldCAqLworI2RlZmluZSBMRV9SMV9QT0sgICAgICAgMHgwMwkvKiBQYWNrZXQgaXMgY29tcGxldGU6IFNPUCArIEVPUCAqLworCisjZGVmaW5lIExFX1QxX09XTiAgICAgICAweDgwCS8qIExhbmNlIG93bnMgdGhlIHBhY2tldCAqLworI2RlZmluZSBMRV9UMV9FUlIgICAgICAgMHg0MAkvKiBFcnJvciBzdW1tYXJ5ICovCisjZGVmaW5lIExFX1QxX0VNT1JFICAgICAweDEwCS8qIEVycm9yOiBtb3JlIHRoYW4gb25lIHJldHJ5IG5lZWRlZCAqLworI2RlZmluZSBMRV9UMV9FT05FICAgICAgMHgwOAkvKiBFcnJvcjogb25lIHJldHJ5IG5lZWRlZCAqLworI2RlZmluZSBMRV9UMV9FREVGICAgICAgMHgwNAkvKiBFcnJvcjogZGVmZXJyZWQgKi8KKyNkZWZpbmUgTEVfVDFfU09QICAgICAgIDB4MDIJLyogU3RhcnQgb2YgcGFja2V0ICovCisjZGVmaW5lIExFX1QxX0VPUCAgICAgICAweDAxCS8qIEVuZCBvZiBwYWNrZXQgKi8KKyNkZWZpbmUgTEVfVDFfUE9LCTB4MDMJLyogUGFja2V0IGlzIGNvbXBsZXRlOiBTT1AgKyBFT1AgKi8KKworI2RlZmluZSBMRV9UM19CVUYgICAgICAgMHg4MDAwCS8qIEJ1ZmZlciBlcnJvciAqLworI2RlZmluZSBMRV9UM19VRkwgICAgICAgMHg0MDAwCS8qIEVycm9yIHVuZGVyZmxvdyAqLworI2RlZmluZSBMRV9UM19MQ09MICAgICAgMHgxMDAwCS8qIEVycm9yIGxhdGUgY29sbGlzaW9uICovCisjZGVmaW5lIExFX1QzX0NMT1MgICAgICAweDA4MDAJLyogRXJyb3IgY2FycmllciBsb3NzICovCisjZGVmaW5lIExFX1QzX1JUWSAgICAgICAweDA0MDAJLyogRXJyb3IgcmV0cnkgKi8KKyNkZWZpbmUgTEVfVDNfVERSICAgICAgIDB4MDNmZgkvKiBUaW1lIERvbWFpbiBSZWZsZWN0b21ldHJ5IGNvdW50ZXIgKi8KKworLyogRGVmaW5lOiAyXjQgVHggYnVmZmVycyBhbmQgMl40IFJ4IGJ1ZmZlcnMgKi8KKworI2lmbmRlZiBMQU5DRV9MT0dfVFhfQlVGRkVSUworI2RlZmluZSBMQU5DRV9MT0dfVFhfQlVGRkVSUyA0CisjZGVmaW5lIExBTkNFX0xPR19SWF9CVUZGRVJTIDQKKyNlbmRpZgorCisjZGVmaW5lIFRYX1JJTkdfU0laRQkJCSgxIDw8IChMQU5DRV9MT0dfVFhfQlVGRkVSUykpCisjZGVmaW5lIFRYX1JJTkdfTU9EX01BU0sJCShUWF9SSU5HX1NJWkUgLSAxKQorCisjZGVmaW5lIFJYX1JJTkdfU0laRQkJCSgxIDw8IChMQU5DRV9MT0dfUlhfQlVGRkVSUykpCisjZGVmaW5lIFJYX1JJTkdfTU9EX01BU0sJCShSWF9SSU5HX1NJWkUgLSAxKQorCisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1MzYKKyNkZWZpbmUgUlhfQlVGRl9TSVpFICAgICAgICAgICAgUEtUX0JVRl9TWgorI2RlZmluZSBUWF9CVUZGX1NJWkUgICAgICAgICAgICBQS1RfQlVGX1NaCisKKyN1bmRlZiBURVNUX0hJVFMKKyNkZWZpbmUgWkVSTyAwCisKKy8qIFRoZSBEUzIwMDAvMzAwMCBoYXZlIGEgbGluZWFyIDY0IEtCIGJ1ZmZlci4KKworICogVGhlIFBNQUQtQUEgaGFzIDEyOCBrYiBidWZmZXIgb24tYm9hcmQuIAorICoKKyAqIFRoZSBJT0FTSUMgTEFOQ0UgZGV2aWNlcyB1c2UgYSBzaGFyZWQgbWVtb3J5IHJlZ2lvbi4gVGhpcyByZWdpb24gYXMgc2VlbiAKKyAqIGZyb20gdGhlIENQVSBpcyAobWF4KSAxMjggS0IgbG9uZyBhbmQgaGFzIHRvIGJlIG9uIGFuIDEyOCBLQiBib3VuZGFyeS4KKyAqIFRoZSBMQU5DRSBzZWVzIHRoaXMgYXMgYSA2NCBLQiBsb25nIGNvbnRpbnVvdXMgbWVtb3J5IHJlZ2lvbi4KKyAqCisgKiBUaGUgTEFOQ0UncyBETUEgYWRkcmVzcyBpcyB1c2VkIGFzIGFuIGluZGV4IGluIHRoaXMgYnVmZmVyIGFuZCBETUEgdGFrZXMKKyAqIHBsYWNlIGluIGJ1cnN0cyBvZiBlaWdodCAxNi1CaXQgd29yZHMgd2hpY2ggYXJlIHBhY2tlZCBpbnRvIGZvdXIgMzItQml0IHdvcmRzCisgKiBieSB0aGUgSU9BU0lDLiBUaGlzIGxlYWRzIHRvIGEgc3RyYW5nZSBwYWRkaW5nOiAxNiBieXRlcyBvZiB2YWxpZCBkYXRhIGZvbGxvd2VkCisgKiBieSBhIDE2IGJ5dGUgZ2FwIDotKC4KKyAqLworCitzdHJ1Y3QgbGFuY2VfcnhfZGVzYyB7CisJdW5zaWduZWQgc2hvcnQgcm1kMDsJCS8qIGxvdyBhZGRyZXNzIG9mIHBhY2tldCAqLworCXNob3J0IGdhcDA7CisJdW5zaWduZWQgY2hhciBybWQxX2hhZHI7CS8qIGhpZ2ggYWRkcmVzcyBvZiBwYWNrZXQgKi8KKwl1bnNpZ25lZCBjaGFyIHJtZDFfYml0czsJLyogZGVzY3JpcHRvciBiaXRzICovCisJc2hvcnQgZ2FwMTsKKwlzaG9ydCBsZW5ndGg7CQkJLyogMnMgY29tcGxlbWVudCAobmVnYXRpdmUhKQorCQkJCQkgICBvZiBidWZmZXIgbGVuZ3RoICovCisJc2hvcnQgZ2FwMjsKKwl1bnNpZ25lZCBzaG9ydCBtYmxlbmd0aDsJLyogYWN0dWFsIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCAqLworCXNob3J0IGdhcDM7Cit9OworCitzdHJ1Y3QgbGFuY2VfdHhfZGVzYyB7CisJdW5zaWduZWQgc2hvcnQgdG1kMDsJCS8qIGxvdyBhZGRyZXNzIG9mIHBhY2tldCAqLworCXNob3J0IGdhcDA7CisJdW5zaWduZWQgY2hhciB0bWQxX2hhZHI7CS8qIGhpZ2ggYWRkcmVzcyBvZiBwYWNrZXQgKi8KKwl1bnNpZ25lZCBjaGFyIHRtZDFfYml0czsJLyogZGVzY3JpcHRvciBiaXRzICovCisJc2hvcnQgZ2FwMTsKKwlzaG9ydCBsZW5ndGg7CQkJLyogMnMgY29tcGxlbWVudCAobmVnYXRpdmUhKQorCQkJCQkgICBvZiBidWZmZXIgbGVuZ3RoICovCisJc2hvcnQgZ2FwMjsKKwl1bnNpZ25lZCBzaG9ydCBtaXNjOworCXNob3J0IGdhcDM7Cit9OworCisKKy8qIEZpcnN0IHBhcnQgb2YgdGhlIExBTkNFIGluaXRpYWxpemF0aW9uIGJsb2NrLCBkZXNjcmliZWQgaW4gZGF0YWJvb2suICovCitzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayB7CisJdW5zaWduZWQgc2hvcnQgbW9kZTsJCS8qIHByZS1zZXQgbW9kZSAocmVnLiAxNSkgKi8KKwlzaG9ydCBnYXAwOworCisJdW5zaWduZWQgY2hhciBwaHlzX2FkZHJbMTJdOwkvKiBwaHlzaWNhbCBldGhlcm5ldCBhZGRyZXNzCisJCQkJCSAgIG9ubHkgMCwgMSwgNCwgNSwgOCwgOSBhcmUgdmFsaWQKKwkJCQkJICAgMiwgMywgNiwgNywgMTAsIDExIGFyZSBnYXBzICovCisJdW5zaWduZWQgc2hvcnQgZmlsdGVyWzhdOwkvKiBtdWx0aWNhc3QgZmlsdGVyCisJCQkJCSAgIG9ubHkgMCwgMiwgNCwgNiBhcmUgdmFsaWQKKwkJCQkJICAgMSwgMywgNSwgNyBhcmUgZ2FwcyAqLworCisJLyogUmVjZWl2ZSBhbmQgdHJhbnNtaXQgcmluZyBiYXNlLCBhbG9uZyB3aXRoIGV4dHJhIGJpdHMuICovCisJdW5zaWduZWQgc2hvcnQgcnhfcHRyOwkJLyogcmVjZWl2ZSBkZXNjcmlwdG9yIGFkZHIgKi8KKwlzaG9ydCBnYXAxOworCXVuc2lnbmVkIHNob3J0IHJ4X2xlbjsJCS8qIHJlY2VpdmUgbGVuIGFuZCBoaWdoIGFkZHIgKi8KKwlzaG9ydCBnYXAyOworCXVuc2lnbmVkIHNob3J0IHR4X3B0cjsJCS8qIHRyYW5zbWl0IGRlc2NyaXB0b3IgYWRkciAqLworCXNob3J0IGdhcDM7CisJdW5zaWduZWQgc2hvcnQgdHhfbGVuOwkJLyogdHJhbnNtaXQgbGVuIGFuZCBoaWdoIGFkZHIgKi8KKwlzaG9ydCBnYXA0OworCXNob3J0IGdhcDVbOF07CisKKwkvKiBUaGUgYnVmZmVyIGRlc2NyaXB0b3JzICovCisJc3RydWN0IGxhbmNlX3J4X2Rlc2MgYnJ4X3JpbmdbUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3QgbGFuY2VfdHhfZGVzYyBidHhfcmluZ1tUWF9SSU5HX1NJWkVdOworfTsKKworI2RlZmluZSBCVUZfT0ZGU0VUX0NQVSBzaXplb2Yoc3RydWN0IGxhbmNlX2luaXRfYmxvY2spCisjZGVmaW5lIEJVRl9PRkZTRVRfTE5DIChzaXplb2Yoc3RydWN0IGxhbmNlX2luaXRfYmxvY2spPj4xKQorCisjZGVmaW5lIGxpYmRlc2Nfb2Zmc2V0KHJ0LCBlbGVtKSBcCisoKF9fdTMyKSgoKHVuc2lnbmVkIGxvbmcpKCYoKChzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqKTApLT5ydFtlbGVtXSkpKSkpCisKKy8qCisgKiBUaGlzIHdvcmtzICpvbmx5KiBmb3IgdGhlIHJpbmcgZGVzY3JpcHRvcnMKKyAqLworI2RlZmluZSBMQU5DRV9BRERSKHgpIChQSFlTQUREUih4KSA+PiAxKQorCitzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5leHQ7CisJaW50IHR5cGU7CisJaW50IHNsb3Q7CisJaW50IGRtYV9pcnE7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppbml0X2Jsb2NrOworCisJc3BpbmxvY2tfdAlsb2NrOworCisJaW50IHJ4X25ldywgdHhfbmV3OworCWludCByeF9vbGQsIHR4X29sZDsKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCisJdW5zaWduZWQgc2hvcnQgYnVzbWFzdGVyX3JlZ3ZhbDsKKworCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgIG11bHRpY2FzdF90aW1lcjsKKworCS8qIFBvaW50ZXJzIHRvIHRoZSByaW5nIGJ1ZmZlcnMgYXMgc2VlbiBmcm9tIHRoZSBDUFUgKi8KKwljaGFyICpyeF9idWZfcHRyX2NwdVtSWF9SSU5HX1NJWkVdOworCWNoYXIgKnR4X2J1Zl9wdHJfY3B1W1RYX1JJTkdfU0laRV07CisKKwkvKiBQb2ludGVycyB0byB0aGUgcmluZyBidWZmZXJzIGFzIHNlZW4gZnJvbSB0aGUgTEFOQ0UgKi8KKwljaGFyICpyeF9idWZfcHRyX2xuY1tSWF9SSU5HX1NJWkVdOworCWNoYXIgKnR4X2J1Zl9wdHJfbG5jW1RYX1JJTkdfU0laRV07Cit9OworCisjZGVmaW5lIFRYX0JVRkZTX0FWQUlMICgobHAtPnR4X29sZDw9bHAtPnR4X25ldyk/XAorCQkJbHAtPnR4X29sZCtUWF9SSU5HX01PRF9NQVNLLWxwLT50eF9uZXc6XAorCQkJbHAtPnR4X29sZCAtIGxwLT50eF9uZXctMSkKKworLyogVGhlIGxhbmNlIGNvbnRyb2wgcG9ydHMgYXJlIGF0IGFuIGFic29sdXRlIGFkZHJlc3MsIG1hY2hpbmUgYW5kIHRjLXNsb3QKKyAqIGRlcGVuZGVudC4KKyAqIERFQ3N0YXRpb25zIGRvIG9ubHkgMzItYml0IGFjY2VzcyBhbmQgdGhlIExBTkNFIHVzZXMgMTYgYml0IGFkZHJlc3NlcywKKyAqIHNvIHdlIGhhdmUgdG8gZ2l2ZSB0aGUgc3RydWN0dXJlIGFuIGV4dHJhIG1lbWJlciBtYWtpbmcgcmFwIHBvaW50aW5nCisgKiBhdCB0aGUgcmlnaHQgYWRkcmVzcworICovCitzdHJ1Y3QgbGFuY2VfcmVncyB7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgcmRwOwkvKiByZWdpc3RlciBkYXRhIHBvcnQgKi8KKwl1bnNpZ25lZCBzaG9ydCBwYWQ7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgcmFwOwkvKiByZWdpc3RlciBhZGRyZXNzIHBvcnQgKi8KK307CisKK2ludCBkZWNfbGFuY2VfZGVidWcgPSAyOworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnJvb3RfbGFuY2VfZGV2OworCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVyZWcodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKnJlZ3B0ciwgc2hvcnQgdmFsdWUpCit7CisJKnJlZ3B0ciA9IHZhbHVlOworCWlvYigpOworfQorCisvKiBMb2FkIHRoZSBDU1IgcmVnaXN0ZXJzICovCitzdGF0aWMgdm9pZCBsb2FkX2NzcnMoc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwKQoreworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKKwlpbnQgbGVwdHI7CisKKwkvKiBUaGUgYWRkcmVzcyBzcGFjZSBhcyBzZWVuIGZyb20gdGhlIExBTkNFCisJICogYmVnaW5zIGF0IGFkZHJlc3MgMC4gSEsKKwkgKi8KKwlsZXB0ciA9IDA7CisKKwl3cml0ZXJlZygmbGwtPnJhcCwgTEVfQ1NSMSk7CisJd3JpdGVyZWcoJmxsLT5yZHAsIChsZXB0ciAmIDB4RkZGRikpOworCXdyaXRlcmVnKCZsbC0+cmFwLCBMRV9DU1IyKTsKKwl3cml0ZXJlZygmbGwtPnJkcCwgbGVwdHIgPj4gMTYpOworCXdyaXRlcmVnKCZsbC0+cmFwLCBMRV9DU1IzKTsKKwl3cml0ZXJlZygmbGwtPnJkcCwgbHAtPmJ1c21hc3Rlcl9yZWd2YWwpOworCisJLyogUG9pbnQgYmFjayB0byBjc3IwICovCisJd3JpdGVyZWcoJmxsLT5yYXAsIExFX0NTUjApOworfQorCisvKgorICogT3VyIHNwZWNpYWxpemVkIGNvcHkgcm91dGluZXMKKyAqCisgKi8KK3ZvaWQgY3BfdG9fYnVmKGNvbnN0IGludCB0eXBlLCB2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBzaG9ydCAqdHAsICpmcCwgY2xlbjsKKwl1bnNpZ25lZCBjaGFyICpydHAsICpyZnA7CisKKwlpZiAodHlwZSA9PSBQTUFYX0xBTkNFKSB7CisJCWNsZW4gPSBsZW4gPj4gMTsKKwkJdHAgPSAodW5zaWduZWQgc2hvcnQgKikgdG87CisJCWZwID0gKHVuc2lnbmVkIHNob3J0ICopIGZyb207CisKKwkJd2hpbGUgKGNsZW4tLSkgeworCQkJKnRwKysgPSAqZnArKzsKKwkJCXRwKys7CisJCX0KKworCQljbGVuID0gbGVuICYgMTsKKwkJcnRwID0gKHVuc2lnbmVkIGNoYXIgKikgdHA7CisJCXJmcCA9ICh1bnNpZ25lZCBjaGFyICopIGZwOworCQl3aGlsZSAoY2xlbi0tKSB7CisJCQkqcnRwKysgPSAqcmZwKys7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBjb3B5IDE2IEJ5dGUgY2h1bmtzCisJCSAqLworCQljbGVuID0gbGVuID4+IDQ7CisJCXRwID0gKHVuc2lnbmVkIHNob3J0ICopIHRvOworCQlmcCA9ICh1bnNpZ25lZCBzaG9ydCAqKSBmcm9tOworCQl3aGlsZSAoY2xlbi0tKSB7CisJCQkqdHArKyA9ICpmcCsrOworCQkJKnRwKysgPSAqZnArKzsKKwkJCSp0cCsrID0gKmZwKys7CisJCQkqdHArKyA9ICpmcCsrOworCQkJKnRwKysgPSAqZnArKzsKKwkJCSp0cCsrID0gKmZwKys7CisJCQkqdHArKyA9ICpmcCsrOworCQkJKnRwKysgPSAqZnArKzsKKwkJCXRwICs9IDg7CisJCX0KKworCQkvKgorCQkgKiBkbyB0aGUgcmVzdCwgaWYgYW55LgorCQkgKi8KKwkJY2xlbiA9IGxlbiAmIDE1OworCQlydHAgPSAodW5zaWduZWQgY2hhciAqKSB0cDsKKwkJcmZwID0gKHVuc2lnbmVkIGNoYXIgKikgZnA7CisJCXdoaWxlIChjbGVuLS0pIHsKKwkJCSpydHArKyA9ICpyZnArKzsKKwkJfQorCX0KKworCWlvYigpOworfQorCit2b2lkIGNwX2Zyb21fYnVmKGNvbnN0IGludCB0eXBlLCB2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBzaG9ydCAqdHAsICpmcCwgY2xlbjsKKwl1bnNpZ25lZCBjaGFyICpydHAsICpyZnA7CisKKwlpZiAodHlwZSA9PSBQTUFYX0xBTkNFKSB7CisJCWNsZW4gPSBsZW4gPj4gMTsKKwkJdHAgPSAodW5zaWduZWQgc2hvcnQgKikgdG87CisJCWZwID0gKHVuc2lnbmVkIHNob3J0ICopIGZyb207CisJCXdoaWxlIChjbGVuLS0pIHsKKwkJCSp0cCsrID0gKmZwKys7CisJCQlmcCsrOworCQl9CisKKwkJY2xlbiA9IGxlbiAmIDE7CisKKwkJcnRwID0gKHVuc2lnbmVkIGNoYXIgKikgdHA7CisJCXJmcCA9ICh1bnNpZ25lZCBjaGFyICopIGZwOworCisJCXdoaWxlIChjbGVuLS0pIHsKKwkJCSpydHArKyA9ICpyZnArKzsKKwkJfQorCX0gZWxzZSB7CisKKwkJLyoKKwkJICogY29weSAxNiBCeXRlIGNodW5rcworCQkgKi8KKwkJY2xlbiA9IGxlbiA+PiA0OworCQl0cCA9ICh1bnNpZ25lZCBzaG9ydCAqKSB0bzsKKwkJZnAgPSAodW5zaWduZWQgc2hvcnQgKikgZnJvbTsKKwkJd2hpbGUgKGNsZW4tLSkgeworCQkJKnRwKysgPSAqZnArKzsKKwkJCSp0cCsrID0gKmZwKys7CisJCQkqdHArKyA9ICpmcCsrOworCQkJKnRwKysgPSAqZnArKzsKKwkJCSp0cCsrID0gKmZwKys7CisJCQkqdHArKyA9ICpmcCsrOworCQkJKnRwKysgPSAqZnArKzsKKwkJCSp0cCsrID0gKmZwKys7CisJCQlmcCArPSA4OworCQl9CisKKwkJLyoKKwkJICogZG8gdGhlIHJlc3QsIGlmIGFueS4KKwkJICovCisJCWNsZW4gPSBsZW4gJiAxNTsKKwkJcnRwID0gKHVuc2lnbmVkIGNoYXIgKikgdHA7CisJCXJmcCA9ICh1bnNpZ25lZCBjaGFyICopIGZwOworCQl3aGlsZSAoY2xlbi0tKSB7CisJCQkqcnRwKysgPSAqcmZwKys7CisJCX0KKworCisJfQorCit9CisKKy8qIFNldHVwIHRoZSBMYW5jZSBSeCBhbmQgVHggcmluZ3MgKi8KK3N0YXRpYyB2b2lkIGxhbmNlX2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliOworCWludCBsZXB0cjsKKwlpbnQgaTsKKworCWliID0gKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICopIChkZXYtPm1lbV9zdGFydCk7CisKKwkvKiBMb2NrIG91dCBvdGhlciBwcm9jZXNzZXMgd2hpbGUgc2V0dGluZyB1cCBoYXJkd2FyZSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlscC0+cnhfbmV3ID0gbHAtPnR4X25ldyA9IDA7CisJbHAtPnJ4X29sZCA9IGxwLT50eF9vbGQgPSAwOworCisJLyogQ29weSB0aGUgZXRoZXJuZXQgYWRkcmVzcyB0byB0aGUgbGFuY2UgaW5pdCBibG9jay4KKwkgKiBYWFggYml0IDAgb2YgdGhlIHBoeXNpY2FsIGFkZHJlc3MgcmVnaXN0ZXJzIGhhcyB0byBiZSB6ZXJvCisJICovCisJaWItPnBoeXNfYWRkclswXSA9IGRldi0+ZGV2X2FkZHJbMF07CisJaWItPnBoeXNfYWRkclsxXSA9IGRldi0+ZGV2X2FkZHJbMV07CisJaWItPnBoeXNfYWRkcls0XSA9IGRldi0+ZGV2X2FkZHJbMl07CisJaWItPnBoeXNfYWRkcls1XSA9IGRldi0+ZGV2X2FkZHJbM107CisJaWItPnBoeXNfYWRkcls4XSA9IGRldi0+ZGV2X2FkZHJbNF07CisJaWItPnBoeXNfYWRkcls5XSA9IGRldi0+ZGV2X2FkZHJbNV07CisJLyogU2V0dXAgdGhlIGluaXRpYWxpemF0aW9uIGJsb2NrICovCisKKwkvKiBTZXR1cCByeCBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KKwlsZXB0ciA9IExBTkNFX0FERFIobGliZGVzY19vZmZzZXQoYnJ4X3JpbmcsIDApKTsKKwlpYi0+cnhfbGVuID0gKExBTkNFX0xPR19SWF9CVUZGRVJTIDw8IDEzKSB8IChsZXB0ciA+PiAxNik7CisJaWItPnJ4X3B0ciA9IGxlcHRyOworCWlmIChaRVJPKQorCQlwcmludGsoIlJYIHB0cjogJTguOHgoJTguOHgpXG4iLCBsZXB0ciwgbGliZGVzY19vZmZzZXQoYnJ4X3JpbmcsIDApKTsKKworCS8qIFNldHVwIHR4IGRlc2NyaXB0b3IgcG9pbnRlciAqLworCWxlcHRyID0gTEFOQ0VfQUREUihsaWJkZXNjX29mZnNldChidHhfcmluZywgMCkpOworCWliLT50eF9sZW4gPSAoTEFOQ0VfTE9HX1RYX0JVRkZFUlMgPDwgMTMpIHwgKGxlcHRyID4+IDE2KTsKKwlpYi0+dHhfcHRyID0gbGVwdHI7CisJaWYgKFpFUk8pCisJCXByaW50aygiVFggcHRyOiAlOC44eCglOC44eClcbiIsIGxlcHRyLCBsaWJkZXNjX29mZnNldChidHhfcmluZywgMCkpOworCisJaWYgKFpFUk8pCisJCXByaW50aygiVFggcmluZ3M6XG4iKTsKKworCS8qIFNldHVwIHRoZSBUeCByaW5nIGVudHJpZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJbGVwdHIgPSAoaW50KSBscC0+dHhfYnVmX3B0cl9sbmNbaV07CisJCWliLT5idHhfcmluZ1tpXS50bWQwID0gbGVwdHI7CisJCWliLT5idHhfcmluZ1tpXS50bWQxX2hhZHIgPSBsZXB0ciA+PiAxNjsKKwkJaWItPmJ0eF9yaW5nW2ldLnRtZDFfYml0cyA9IDA7CisJCWliLT5idHhfcmluZ1tpXS5sZW5ndGggPSAweGYwMDA7CS8qIFRoZSBvbmVzIHJlcXVpcmVkIGJ5IHRtZDIgKi8KKwkJaWItPmJ0eF9yaW5nW2ldLm1pc2MgPSAwOworCQlpZiAoaSA8IDMgJiYgWkVSTykKKwkJCXByaW50aygiJWQ6IDB4JTguOHgoMHglOC44eClcbiIsIGksIGxlcHRyLCAoaW50KSBscC0+dHhfYnVmX3B0cl9jcHVbaV0pOworCX0KKworCS8qIFNldHVwIHRoZSBSeCByaW5nIGVudHJpZXMgKi8KKwlpZiAoWkVSTykKKwkJcHJpbnRrKCJSWCByaW5nczpcbiIpOworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlsZXB0ciA9IChpbnQpIGxwLT5yeF9idWZfcHRyX2xuY1tpXTsKKwkJaWItPmJyeF9yaW5nW2ldLnJtZDAgPSBsZXB0cjsKKwkJaWItPmJyeF9yaW5nW2ldLnJtZDFfaGFkciA9IGxlcHRyID4+IDE2OworCQlpYi0+YnJ4X3JpbmdbaV0ucm1kMV9iaXRzID0gTEVfUjFfT1dOOworCQlpYi0+YnJ4X3JpbmdbaV0ubGVuZ3RoID0gLVJYX0JVRkZfU0laRSB8IDB4ZjAwMDsKKwkJaWItPmJyeF9yaW5nW2ldLm1ibGVuZ3RoID0gMDsKKwkJaWYgKGkgPCAzICYmIFpFUk8pCisJCQlwcmludGsoIiVkOiAweCU4Ljh4KDB4JTguOHgpXG4iLCBpLCBsZXB0ciwgKGludCkgbHAtPnJ4X2J1Zl9wdHJfY3B1W2ldKTsKKwl9CisJaW9iKCk7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9yZXN0YXJ0X2xhbmNlKHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCkKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfcmVncyAqbGwgPSBscC0+bGw7CisJaW50IGk7CisKKwl3cml0ZXJlZygmbGwtPnJhcCwgTEVfQ1NSMCk7CisJd3JpdGVyZWcoJmxsLT5yZHAsIExFX0MwX0lOSVQpOworCisJLyogV2FpdCBmb3IgdGhlIGxhbmNlIHRvIGNvbXBsZXRlIGluaXRpYWxpemF0aW9uICovCisJZm9yIChpID0gMDsgKGkgPCAxMDApICYmICEobGwtPnJkcCAmIExFX0MwX0lET04pOyBpKyspIHsKKwkJdWRlbGF5KDEwKTsKKwl9CisJaWYgKChpID09IDEwMCkgfHwgKGxsLT5yZHAgJiBMRV9DMF9FUlIpKSB7CisJCXByaW50aygiTEFOQ0UgdW5vcGVuZWQgYWZ0ZXIgJWQgdGlja3MsIGNzcjA9JTQuNHguXG4iLCBpLCBsbC0+cmRwKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoKGxsLT5yZHAgJiBMRV9DMF9FUlIpKSB7CisJCXByaW50aygiTEFOQ0UgdW5vcGVuZWQgYWZ0ZXIgJWQgdGlja3MsIGNzcjA9JTQuNHguXG4iLCBpLCBsbC0+cmRwKTsKKwkJcmV0dXJuIC0xOworCX0KKwl3cml0ZXJlZygmbGwtPnJkcCwgTEVfQzBfSURPTik7CisJd3JpdGVyZWcoJmxsLT5yZHAsIExFX0MwX1NUUlQpOworCXdyaXRlcmVnKCZsbC0+cmRwLCBMRV9DMF9JTkVBKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhbmNlX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWI7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3J4X2Rlc2MgKnJkID0gMDsKKwl1bnNpZ25lZCBjaGFyIGJpdHM7CisJaW50IGxlbiA9IDA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IDA7CisJaWIgPSAoc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKikgKGRldi0+bWVtX3N0YXJ0KTsKKworI2lmZGVmIFRFU1RfSElUUworCXsKKwkJaW50IGk7CisKKwkJcHJpbnRrKCJbIik7CisJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQkJaWYgKGkgPT0gbHAtPnJ4X25ldykKKwkJCQlwcmludGsoIiVzIiwgaWItPmJyeF9yaW5nW2ldLnJtZDFfYml0cyAmCisJCQkJCSAgICAgTEVfUjFfT1dOID8gIl8iIDogIlgiKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoIiVzIiwgaWItPmJyeF9yaW5nW2ldLnJtZDFfYml0cyAmCisJCQkJCSAgICAgTEVfUjFfT1dOID8gIi4iIDogIjEiKTsKKwkJfQorCQlwcmludGsoIl0iKTsKKwl9CisjZW5kaWYKKworCWZvciAocmQgPSAmaWItPmJyeF9yaW5nW2xwLT5yeF9uZXddOworCSAgICAgISgoYml0cyA9IHJkLT5ybWQxX2JpdHMpICYgTEVfUjFfT1dOKTsKKwkgICAgIHJkID0gJmliLT5icnhfcmluZ1tscC0+cnhfbmV3XSkgeworCisJCS8qIFdlIGdvdCBhbiBpbmNvbXBsZXRlIGZyYW1lPyAqLworCQlpZiAoKGJpdHMgJiBMRV9SMV9QT0spICE9IExFX1IxX1BPSykgeworCQkJbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCX0gZWxzZSBpZiAoYml0cyAmIExFX1IxX0VSUikgeworCQkJLyogQ291bnQgb25seSB0aGUgZW5kIGZyYW1lIGFzIGEgcnggZXJyb3IsCisJCQkgKiBub3QgdGhlIGJlZ2lubmluZworCQkJICovCisJCQlpZiAoYml0cyAmIExFX1IxX0JVRikKKwkJCQlscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCWlmIChiaXRzICYgTEVfUjFfQ1JDKQorCQkJCWxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAoYml0cyAmIExFX1IxX09GTCkKKwkJCQlscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCWlmIChiaXRzICYgTEVfUjFfRlJBKQorCQkJCWxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChiaXRzICYgTEVfUjFfRU9QKQorCQkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJfSBlbHNlIHsKKwkJCWxlbiA9IChyZC0+bWJsZW5ndGggJiAweGZmZikgLSA0OworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyAyKTsKKworCQkJaWYgKHNrYiA9PSAwKSB7CisJCQkJcHJpbnRrKCIlczogTWVtb3J5IHNxdWVlemUsIGRlZmVycmluZyBwYWNrZXQuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJcmQtPm1ibGVuZ3RoID0gMDsKKwkJCQlyZC0+cm1kMV9iaXRzID0gTEVfUjFfT1dOOworCQkJCWxwLT5yeF9uZXcgPSAobHAtPnJ4X25ldyArIDEpICYgUlhfUklOR19NT0RfTUFTSzsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisKKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiAqLworCQkJc2tiX3B1dChza2IsIGxlbik7CS8qIG1ha2Ugcm9vbSAqLworCisJCQljcF9mcm9tX2J1ZihscC0+dHlwZSwgc2tiLT5kYXRhLAorCQkJCSAgICAoY2hhciAqKWxwLT5yeF9idWZfcHRyX2NwdVtscC0+cnhfbmV3XSwKKwkJCQkgICAgbGVuKTsKKworCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJfQorCisJCS8qIFJldHVybiB0aGUgcGFja2V0IHRvIHRoZSBwb29sICovCisJCXJkLT5tYmxlbmd0aCA9IDA7CisJCXJkLT5sZW5ndGggPSAtUlhfQlVGRl9TSVpFIHwgMHhmMDAwOworCQlyZC0+cm1kMV9iaXRzID0gTEVfUjFfT1dOOworCQlscC0+cnhfbmV3ID0gKGxwLT5yeF9uZXcgKyAxKSAmIFJYX1JJTkdfTU9EX01BU0s7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsYW5jZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfdHhfZGVzYyAqdGQ7CisJaW50IGksIGo7CisJaW50IHN0YXR1czsKKwlpYiA9IChzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqKSAoZGV2LT5tZW1fc3RhcnQpOworCWogPSBscC0+dHhfb2xkOworCisJc3Bpbl9sb2NrKCZscC0+bG9jayk7CisKKwlmb3IgKGkgPSBqOyBpICE9IGxwLT50eF9uZXc7IGkgPSBqKSB7CisJCXRkID0gJmliLT5idHhfcmluZ1tpXTsKKwkJLyogSWYgd2UgaGl0IGEgcGFja2V0IG5vdCBvd25lZCBieSB1cywgc3RvcCAqLworCQlpZiAodGQtPnRtZDFfYml0cyAmIExFX1QxX09XTikKKwkJCWJyZWFrOworCisJCWlmICh0ZC0+dG1kMV9iaXRzICYgTEVfVDFfRVJSKSB7CisJCQlzdGF0dXMgPSB0ZC0+bWlzYzsKKworCQkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIExFX1QzX1JUWSkKKwkJCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBMRV9UM19MQ09MKQorCQkJCWxwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisKKwkJCWlmIChzdGF0dXMgJiBMRV9UM19DTE9TKSB7CisJCQkJbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJcHJpbnRrKCIlczogQ2FycmllciBMb3N0XG4iLCBkZXYtPm5hbWUpOworCQkJCS8qIFN0b3AgdGhlIGxhbmNlICovCisJCQkJd3JpdGVyZWcoJmxsLT5yYXAsIExFX0NTUjApOworCQkJCXdyaXRlcmVnKCZsbC0+cmRwLCBMRV9DMF9TVE9QKTsKKwkJCQlsYW5jZV9pbml0X3JpbmcoZGV2KTsKKwkJCQlsb2FkX2NzcnMobHApOworCQkJCWluaXRfcmVzdGFydF9sYW5jZShscCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQkvKiBCdWZmZXIgZXJyb3JzIGFuZCB1bmRlcmZsb3dzIHR1cm4gb2ZmIHRoZQorCQkJICogdHJhbnNtaXR0ZXIsIHJlc3RhcnQgdGhlIGFkYXB0ZXIuCisJCQkgKi8KKwkJCWlmIChzdGF0dXMgJiAoTEVfVDNfQlVGIHwgTEVfVDNfVUZMKSkgeworCQkJCWxwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCisJCQkJcHJpbnRrKCIlczogVHg6IEVSUl9CVUZ8RVJSX1VGTCwgcmVzdGFydGluZ1xuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCQkvKiBTdG9wIHRoZSBsYW5jZSAqLworCQkJCXdyaXRlcmVnKCZsbC0+cmFwLCBMRV9DU1IwKTsKKwkJCQl3cml0ZXJlZygmbGwtPnJkcCwgTEVfQzBfU1RPUCk7CisJCQkJbGFuY2VfaW5pdF9yaW5nKGRldik7CisJCQkJbG9hZF9jc3JzKGxwKTsKKwkJCQlpbml0X3Jlc3RhcnRfbGFuY2UobHApOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9IGVsc2UgaWYgKCh0ZC0+dG1kMV9iaXRzICYgTEVfVDFfUE9LKSA9PSBMRV9UMV9QT0spIHsKKwkJCS8qCisJCQkgKiBTbyB3ZSBkb24ndCBjb3VudCB0aGUgcGFja2V0IG1vcmUgdGhhbiBvbmNlLgorCQkJICovCisJCQl0ZC0+dG1kMV9iaXRzICY9IH4oTEVfVDFfUE9LKTsKKworCQkJLyogT25lIGNvbGxpc2lvbiBiZWZvcmUgcGFja2V0IHdhcyBzZW50LiAqLworCQkJaWYgKHRkLT50bWQxX2JpdHMgJiBMRV9UMV9FT05FKQorCQkJCWxwLT5zdGF0cy5jb2xsaXNpb25zKys7CisKKwkJCS8qIE1vcmUgdGhhbiBvbmUgY29sbGlzaW9uLCBiZSBvcHRpbWlzdGljLiAqLworCQkJaWYgKHRkLT50bWQxX2JpdHMgJiBMRV9UMV9FTU9SRSkKKwkJCQlscC0+c3RhdHMuY29sbGlzaW9ucyArPSAyOworCisJCQlscC0+c3RhdHMudHhfcGFja2V0cysrOworCQl9CisJCWogPSAoaiArIDEpICYgVFhfUklOR19NT0RfTUFTSzsKKwl9CisJbHAtPnR4X29sZCA9IGo7CitvdXQ6CisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJgorCSAgICBUWF9CVUZGU19BVkFJTCA+IDApCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGxhbmNlX2RtYV9tZXJyX2ludChjb25zdCBpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisKKwlwcmludGsoIiVzOiBETUEgZXJyb3JcbiIsIGRldi0+bmFtZSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorbGFuY2VfaW50ZXJydXB0KGNvbnN0IGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfcmVncyAqbGwgPSBscC0+bGw7CisJaW50IGNzcjA7CisKKwl3cml0ZXJlZygmbGwtPnJhcCwgTEVfQ1NSMCk7CisJY3NyMCA9IGxsLT5yZHA7CisKKwkvKiBBY2tub3dsZWRnZSBhbGwgdGhlIGludGVycnVwdCBzb3VyY2VzIEFTQVAgKi8KKwl3cml0ZXJlZygmbGwtPnJkcCwgY3NyMCAmIChMRV9DMF9JTlRSIHwgTEVfQzBfVElOVCB8IExFX0MwX1JJTlQpKTsKKworCWlmICgoY3NyMCAmIExFX0MwX0VSUikpIHsKKwkJLyogQ2xlYXIgdGhlIGVycm9yIGNvbmRpdGlvbiAqLworCQl3cml0ZXJlZygmbGwtPnJkcCwgTEVfQzBfQkFCTCB8IExFX0MwX0VSUiB8IExFX0MwX01JU1MgfAorCQkJIExFX0MwX0NFUlIgfCBMRV9DMF9NRVJSKTsKKwl9CisJaWYgKGNzcjAgJiBMRV9DMF9SSU5UKQorCQlsYW5jZV9yeChkZXYpOworCisJaWYgKGNzcjAgJiBMRV9DMF9USU5UKQorCQlsYW5jZV90eChkZXYpOworCisJaWYgKGNzcjAgJiBMRV9DMF9CQUJMKQorCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisKKwlpZiAoY3NyMCAmIExFX0MwX01JU1MpCisJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKworCWlmIChjc3IwICYgTEVfQzBfTUVSUikgeworCQlwcmludGsoIiVzOiBNZW1vcnkgZXJyb3IsIHN0YXR1cyAlMDR4XG4iLCBkZXYtPm5hbWUsIGNzcjApOworCisJCXdyaXRlcmVnKCZsbC0+cmRwLCBMRV9DMF9TVE9QKTsKKworCQlsYW5jZV9pbml0X3JpbmcoZGV2KTsKKwkJbG9hZF9jc3JzKGxwKTsKKwkJaW5pdF9yZXN0YXJ0X2xhbmNlKGxwKTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKworCXdyaXRlcmVnKCZsbC0+cmRwLCBMRV9DMF9JTkVBKTsKKwl3cml0ZXJlZygmbGwtPnJkcCwgTEVfQzBfSU5FQSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqbGFzdF9kZXYgPSAwOworCitzdGF0aWMgaW50IGxhbmNlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWIgPSAoc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKikgKGRldi0+bWVtX3N0YXJ0KTsKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKKwlpbnQgc3RhdHVzID0gMDsKKworCWxhc3RfZGV2ID0gZGV2OworCisJLyogU3RvcCB0aGUgTGFuY2UgKi8KKwl3cml0ZXJlZygmbGwtPnJhcCwgTEVfQ1NSMCk7CisJd3JpdGVyZWcoJmxsLT5yZHAsIExFX0MwX1NUT1ApOworCisJLyogU2V0IG1vZGUgYW5kIGNsZWFyIG11bHRpY2FzdCBmaWx0ZXIgb25seSBhdCBkZXZpY2Ugb3BlbiwKKwkgKiBzbyB0aGF0IGxhbmNlX2luaXRfcmluZygpIGNhbGxlZCBhdCBhbnkgZXJyb3Igd2lsbCBub3QKKwkgKiBmb3JnZXQgbXVsdGljYXN0IGZpbHRlcnMuCisJICoKKwkgKiBCVFcgaXQgaXMgY29tbW9uIGJ1ZyBpbiBhbGwgbGFuY2UgZHJpdmVycyEgLS1BTksKKwkgKi8KKwlpYi0+bW9kZSA9IDA7CisJaWItPmZpbHRlciBbMF0gPSAwOworCWliLT5maWx0ZXIgWzJdID0gMDsKKwlpYi0+ZmlsdGVyIFs0XSA9IDA7CisJaWItPmZpbHRlciBbNl0gPSAwOworCisJbGFuY2VfaW5pdF9yaW5nKGRldik7CisJbG9hZF9jc3JzKGxwKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwkvKiBBc3NvY2lhdGUgSVJRIHdpdGggbGFuY2VfaW50ZXJydXB0ICovCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmbGFuY2VfaW50ZXJydXB0LCAwLCAibGFuY2UiLCBkZXYpKSB7CisJCXByaW50aygiJXM6IENhbid0IGdldCBJUlEgJWRcbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJaWYgKGxwLT5kbWFfaXJxID49IDApIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlpZiAocmVxdWVzdF9pcnEobHAtPmRtYV9pcnEsICZsYW5jZV9kbWFfbWVycl9pbnQsIDAsCisJCQkJImxhbmNlIGVycm9yIiwgZGV2KSkgeworCQkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCQlwcmludGsoIiVzOiBDYW4ndCBnZXQgRE1BIElSUSAlZFxuIiwgZGV2LT5uYW1lLAorCQkJCWxwLT5kbWFfaXJxKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXNpY19zc3JfbG9jaywgZmxhZ3MpOworCisJCWZhc3RfbWIoKTsKKwkJLyogRW5hYmxlIEkvTyBBU0lDIExBTkNFIERNQS4gICovCisJCWlvYXNpY193cml0ZShJT19SRUdfU1NSLAorCQkJICAgICBpb2FzaWNfcmVhZChJT19SRUdfU1NSKSB8IElPX1NTUl9MQU5DRV9ETUFfRU4pOworCisJCWZhc3RfbWIoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hc2ljX3Nzcl9sb2NrLCBmbGFncyk7CisJfQorCisJc3RhdHVzID0gaW5pdF9yZXN0YXJ0X2xhbmNlKGxwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGxhbmNlX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfcmVncyAqbGwgPSBscC0+bGw7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJZGVsX3RpbWVyX3N5bmMoJmxwLT5tdWx0aWNhc3RfdGltZXIpOworCisJLyogU3RvcCB0aGUgY2FyZCAqLworCXdyaXRlcmVnKCZsbC0+cmFwLCBMRV9DU1IwKTsKKwl3cml0ZXJlZygmbGwtPnJkcCwgTEVfQzBfU1RPUCk7CisKKwlpZiAobHAtPmRtYV9pcnEgPj0gMCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FzaWNfc3NyX2xvY2ssIGZsYWdzKTsKKworCQlmYXN0X21iKCk7CisJCS8qIERpc2FibGUgSS9PIEFTSUMgTEFOQ0UgRE1BLiAgKi8KKwkJaW9hc2ljX3dyaXRlKElPX1JFR19TU1IsCisJCQkgICAgIGlvYXNpY19yZWFkKElPX1JFR19TU1IpICYgfklPX1NTUl9MQU5DRV9ETUFfRU4pOworCisJCWZhc3RfaW9iKCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXNpY19zc3JfbG9jaywgZmxhZ3MpOworCisJCWZyZWVfaXJxKGxwLT5kbWFfaXJxLCBkZXYpOworCX0KKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGFuY2VfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKKwlpbnQgc3RhdHVzOworCisJLyogU3RvcCB0aGUgbGFuY2UgKi8KKwl3cml0ZXJlZygmbGwtPnJhcCwgTEVfQ1NSMCk7CisJd3JpdGVyZWcoJmxsLT5yZHAsIExFX0MwX1NUT1ApOworCisJbGFuY2VfaW5pdF9yaW5nKGRldik7CisJbG9hZF9jc3JzKGxwKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlzdGF0dXMgPSBpbml0X3Jlc3RhcnRfbGFuY2UobHApOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIGxhbmNlX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICUwNHgsIHJlc2V0XG4iLAorCQlkZXYtPm5hbWUsIGxsLT5yZHApOworCWxhbmNlX3Jlc2V0KGRldik7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IGxhbmNlX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbCA9IGxwLT5sbDsKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWIgPSAoc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKikgKGRldi0+bWVtX3N0YXJ0KTsKKwlpbnQgZW50cnksIHNrYmxlbiwgbGVuOworCisJc2tibGVuID0gc2tiLT5sZW47CisKKwlsZW4gPSBza2JsZW47CisJCisJaWYgKGxlbiA8IEVUSF9aTEVOKSB7CisJCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCWxlbiA9IEVUSF9aTEVOOworCX0KKworCWxwLT5zdGF0cy50eF9ieXRlcyArPSBsZW47CisKKwllbnRyeSA9IGxwLT50eF9uZXcgJiBUWF9SSU5HX01PRF9NQVNLOworCWliLT5idHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0gKC1sZW4pOworCWliLT5idHhfcmluZ1tlbnRyeV0ubWlzYyA9IDA7CisKKwljcF90b19idWYobHAtPnR5cGUsIChjaGFyICopbHAtPnR4X2J1Zl9wdHJfY3B1W2VudHJ5XSwgc2tiLT5kYXRhLAorCQkgIHNrYmxlbik7CisKKwkvKiBDbGVhciB0aGUgc2xhY2sgb2YgdGhlIHBhY2tldCwgZG8gSSBuZWVkIHRoaXM/ICovCisJLyogRm9yIGEgZmlyZXdhbGwgaXQncyBhIGdvb2QgaWRlYSAtIEFDICovCisvKgorICAgaWYgKGxlbiAhPSBza2JsZW4pCisgICBtZW1zZXQgKChjaGFyICopICZpYi0+dHhfYnVmIFtlbnRyeV1bc2tibGVuXSwgMCwgKGxlbiAtIHNrYmxlbikgPDwgMSk7CisgKi8KKworCS8qIE5vdywgZ2l2ZSB0aGUgcGFja2V0IHRvIHRoZSBsYW5jZSAqLworCWliLT5idHhfcmluZ1tlbnRyeV0udG1kMV9iaXRzID0gKExFX1QxX1BPSyB8IExFX1QxX09XTik7CisJbHAtPnR4X25ldyA9IChscC0+dHhfbmV3ICsgMSkgJiBUWF9SSU5HX01PRF9NQVNLOworCisJaWYgKFRYX0JVRkZTX0FWQUlMIDw9IDApCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIEtpY2sgdGhlIGxhbmNlOiB0cmFuc21pdCBub3cgKi8KKwl3cml0ZXJlZygmbGwtPnJkcCwgTEVfQzBfSU5FQSB8IExFX0MwX1RETUQpOworCisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKyAJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbGFuY2VfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiAmbHAtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCBsYW5jZV9sb2FkX211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYiA9IChzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqKSAoZGV2LT5tZW1fc3RhcnQpOworCXZvbGF0aWxlIHUxNiAqbWNhc3RfdGFibGUgPSAodTE2ICopICYgaWItPmZpbHRlcjsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IGRldi0+bWNfbGlzdDsKKwljaGFyICphZGRyczsKKwlpbnQgaTsKKwl1MzIgY3JjOworCisJLyogc2V0IGFsbCBtdWx0aWNhc3QgYml0cyAqLworCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCWliLT5maWx0ZXJbMF0gPSAweGZmZmY7CisJCWliLT5maWx0ZXJbMl0gPSAweGZmZmY7CisJCWliLT5maWx0ZXJbNF0gPSAweGZmZmY7CisJCWliLT5maWx0ZXJbNl0gPSAweGZmZmY7CisJCXJldHVybjsKKwl9CisJLyogY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgKi8KKwlpYi0+ZmlsdGVyWzBdID0gMDsKKwlpYi0+ZmlsdGVyWzJdID0gMDsKKwlpYi0+ZmlsdGVyWzRdID0gMDsKKwlpYi0+ZmlsdGVyWzZdID0gMDsKKworCS8qIEFkZCBhZGRyZXNzZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrKSB7CisJCWFkZHJzID0gZG1pLT5kbWlfYWRkcjsKKwkJZG1pID0gZG1pLT5uZXh0OworCisJCS8qIG11bHRpY2FzdCBhZGRyZXNzPyAqLworCQlpZiAoISgqYWRkcnMgJiAxKSkKKwkJCWNvbnRpbnVlOworCisJCWNyYyA9IGV0aGVyX2NyY19sZShFVEhfQUxFTiwgYWRkcnMpOworCQljcmMgPSBjcmMgPj4gMjY7CisJCW1jYXN0X3RhYmxlWzIgKiAoY3JjID4+IDQpXSB8PSAxIDw8IChjcmMgJiAweGYpOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGxhbmNlX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYjsKKwl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfcmVncyAqbGwgPSBscC0+bGw7CisKKwlpYiA9IChzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqKSAoZGV2LT5tZW1fc3RhcnQpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybjsKKworCWlmIChscC0+dHhfb2xkICE9IGxwLT50eF9uZXcpIHsKKwkJbW9kX3RpbWVyKCZscC0+bXVsdGljYXN0X3RpbWVyLCBqaWZmaWVzICsgNCAqIEhaLzEwMCk7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJcmV0dXJuOworCX0KKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCXdyaXRlcmVnKCZsbC0+cmFwLCBMRV9DU1IwKTsKKwl3cml0ZXJlZygmbGwtPnJkcCwgTEVfQzBfU1RPUCk7CisKKwlsYW5jZV9pbml0X3JpbmcoZGV2KTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJaWItPm1vZGUgfD0gTEVfTU9fUFJPTTsKKwl9IGVsc2UgeworCQlpYi0+bW9kZSAmPSB+TEVfTU9fUFJPTTsKKwkJbGFuY2VfbG9hZF9tdWx0aWNhc3QoZGV2KTsKKwl9CisJbG9hZF9jc3JzKGxwKTsKKwlpbml0X3Jlc3RhcnRfbGFuY2UobHApOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIHZvaWQgbGFuY2Vfc2V0X211bHRpY2FzdF9yZXRyeSh1bnNpZ25lZCBsb25nIF9vcGFxdWUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBfb3BhcXVlOworCisJbGFuY2Vfc2V0X211bHRpY2FzdChkZXYpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkZWNfbGFuY2VfaW5pdChjb25zdCBpbnQgdHlwZSwgY29uc3QgaW50IHNsb3QpCit7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKwlzdGF0aWMgY29uc3QgY2hhciBmbXRbXSA9ICJkZWNsYW5jZSVkIjsKKwljaGFyIG5hbWVbMTBdOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwOworCXZvbGF0aWxlIHN0cnVjdCBsYW5jZV9yZWdzICpsbDsKKwlpbnQgaSwgcmV0OworCXVuc2lnbmVkIGxvbmcgZXNhcl9iYXNlOworCXVuc2lnbmVkIGNoYXIgKmVzYXI7CisKKyNpZm5kZWYgQ09ORklHX1RDCisJc3lzdGVtX2Jhc2UgPSBLTjAxX0xBTkNFX0JBU0U7CisjZW5kaWYKKworCWlmIChkZWNfbGFuY2VfZGVidWcgJiYgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKHZlcnNpb24pOworCisJaSA9IDA7CisJZGV2ID0gcm9vdF9sYW5jZV9kZXY7CisJd2hpbGUgKGRldikgeworCQlpKys7CisJCWxwID0gKHN0cnVjdCBsYW5jZV9wcml2YXRlICopZGV2LT5wcml2OworCQlkZXYgPSBscC0+bmV4dDsKKwl9CisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBmbXQsIGkpOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBsYW5jZV9wcml2YXRlKSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGV0aGVyZGV2LCBhYm9ydGluZy5cbiIsCisJCQluYW1lKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qCisJICogYWxsb2NfZXRoZXJkZXYgZW5zdXJlcyB0aGUgZGF0YSBzdHJ1Y3R1cmVzIHVzZWQgYnkgdGhlIExBTkNFCisJICogYXJlIGFsaWduZWQuCisJICovCisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNwaW5fbG9ja19pbml0KCZscC0+bG9jayk7CisKKwlscC0+dHlwZSA9IHR5cGU7CisJbHAtPnNsb3QgPSBzbG90OworCXN3aXRjaCAodHlwZSkgeworI2lmZGVmIENPTkZJR19UQworCWNhc2UgQVNJQ19MQU5DRToKKwkJZGV2LT5iYXNlX2FkZHIgPSBzeXN0ZW1fYmFzZSArIElPQVNJQ19MQU5DRTsKKworCQkvKiBidWZmZXIgc3BhY2UgZm9yIHRoZSBvbi1ib2FyZCBMQU5DRSBzaGFyZWQgbWVtb3J5ICovCisJCS8qCisJCSAqIEZJWE1FOiB1Z2x5IGhhY2shCisJCSAqLworCQlkZXYtPm1lbV9zdGFydCA9IEtTRUcxQUREUigweDAwMDIwMDAwKTsKKwkJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyAweDAwMDIwMDAwOworCQlkZXYtPmlycSA9IGRlY19pbnRlcnJ1cHRbREVDX0lSUV9MQU5DRV07CisJCWVzYXJfYmFzZSA9IHN5c3RlbV9iYXNlICsgSU9BU0lDX0VTQVI7CisKKwkJLyogV29ya2Fyb3VuZCBjcmFzaCB3aXRoIGJvb3RpbmcgS04wNCAyLjFrIGZyb20gRGlzayAqLworCQltZW1zZXQoKHZvaWQgKilkZXYtPm1lbV9zdGFydCwgMCwKKwkJICAgICAgIGRldi0+bWVtX2VuZCAtIGRldi0+bWVtX3N0YXJ0KTsKKworCQkvKgorCQkgKiBzZXR1cCB0aGUgcG9pbnRlciBhcnJheXMsIHRoaXMgc3Vja3MgW3RtXSA6LSgKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQkJbHAtPnJ4X2J1Zl9wdHJfY3B1W2ldID0KKwkJCQkoY2hhciAqKShkZXYtPm1lbV9zdGFydCArIEJVRl9PRkZTRVRfQ1BVICsKKwkJCQkJIDIgKiBpICogUlhfQlVGRl9TSVpFKTsKKwkJCWxwLT5yeF9idWZfcHRyX2xuY1tpXSA9CisJCQkJKGNoYXIgKikoQlVGX09GRlNFVF9MTkMgKyBpICogUlhfQlVGRl9TSVpFKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJCWxwLT50eF9idWZfcHRyX2NwdVtpXSA9CisJCQkJKGNoYXIgKikoZGV2LT5tZW1fc3RhcnQgKyBCVUZfT0ZGU0VUX0NQVSArCisJCQkJCSAyICogUlhfUklOR19TSVpFICogUlhfQlVGRl9TSVpFICsKKwkJCQkJIDIgKiBpICogVFhfQlVGRl9TSVpFKTsKKwkJCWxwLT50eF9idWZfcHRyX2xuY1tpXSA9CisJCQkJKGNoYXIgKikoQlVGX09GRlNFVF9MTkMgKworCQkJCQkgUlhfUklOR19TSVpFICogUlhfQlVGRl9TSVpFICsKKwkJCQkJIGkgKiBUWF9CVUZGX1NJWkUpOworCQl9CisKKwkJLyogU2V0dXAgSS9PIEFTSUMgTEFOQ0UgRE1BLiAgKi8KKwkJbHAtPmRtYV9pcnEgPSBkZWNfaW50ZXJydXB0W0RFQ19JUlFfTEFOQ0VfTUVSUl07CisJCWlvYXNpY193cml0ZShJT19SRUdfTEFOQ0VfRE1BX1AsCisJCQkgICAgIFBIWVNBRERSKGRldi0+bWVtX3N0YXJ0KSA8PCAzKTsKKworCQlicmVhazsKKworCWNhc2UgUE1BRF9MQU5DRToKKwkJY2xhaW1fdGNfY2FyZChzbG90KTsKKworCQlkZXYtPm1lbV9zdGFydCA9IGdldF90Y19iYXNlX2FkZHIoc2xvdCk7CisJCWRldi0+YmFzZV9hZGRyID0gZGV2LT5tZW1fc3RhcnQgKyAweDEwMDAwMDsKKwkJZGV2LT5pcnEgPSBnZXRfdGNfaXJxX25yKHNsb3QpOworCQllc2FyX2Jhc2UgPSBkZXYtPm1lbV9zdGFydCArIDB4MWMwMDAyOworCQlscC0+ZG1hX2lycSA9IC0xOworCisJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQkJbHAtPnJ4X2J1Zl9wdHJfY3B1W2ldID0KKwkJCQkoY2hhciAqKShkZXYtPm1lbV9zdGFydCArIEJVRl9PRkZTRVRfQ1BVICsKKwkJCQkJIGkgKiBSWF9CVUZGX1NJWkUpOworCQkJbHAtPnJ4X2J1Zl9wdHJfbG5jW2ldID0KKwkJCQkoY2hhciAqKShCVUZfT0ZGU0VUX0xOQyArIGkgKiBSWF9CVUZGX1NJWkUpOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQkJbHAtPnR4X2J1Zl9wdHJfY3B1W2ldID0KKwkJCQkoY2hhciAqKShkZXYtPm1lbV9zdGFydCArIEJVRl9PRkZTRVRfQ1BVICsKKwkJCQkJIFJYX1JJTkdfU0laRSAqIFJYX0JVRkZfU0laRSArCisJCQkJCSBpICogVFhfQlVGRl9TSVpFKTsKKwkJCWxwLT50eF9idWZfcHRyX2xuY1tpXSA9CisJCQkJKGNoYXIgKikoQlVGX09GRlNFVF9MTkMgKworCQkJCQkgUlhfUklOR19TSVpFICogUlhfQlVGRl9TSVpFICsKKwkJCQkJIGkgKiBUWF9CVUZGX1NJWkUpOworCQl9CisKKwkJYnJlYWs7CisjZW5kaWYKKworCWNhc2UgUE1BWF9MQU5DRToKKwkJZGV2LT5pcnEgPSBkZWNfaW50ZXJydXB0W0RFQ19JUlFfTEFOQ0VdOworCQlkZXYtPmJhc2VfYWRkciA9IEtOMDFfTEFOQ0VfQkFTRTsKKwkJZGV2LT5tZW1fc3RhcnQgPSBLTjAxX0xBTkNFX0JBU0UgKyAweDAxMDAwMDAwOworCQllc2FyX2Jhc2UgPSBLTjAxX1JUQ19CQVNFICsgMTsKKwkJbHAtPmRtYV9pcnEgPSAtMTsKKworCQkvKgorCQkgKiBzZXR1cCB0aGUgcG9pbnRlciBhcnJheXMsIHRoaXMgc3Vja3MgW3RtXSA6LSgKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQkJbHAtPnJ4X2J1Zl9wdHJfY3B1W2ldID0KKwkJCQkoY2hhciAqKShkZXYtPm1lbV9zdGFydCArIEJVRl9PRkZTRVRfQ1BVICsKKwkJCQkJIDIgKiBpICogUlhfQlVGRl9TSVpFKTsKKwkJCWxwLT5yeF9idWZfcHRyX2xuY1tpXSA9CisJCQkJKGNoYXIgKikoQlVGX09GRlNFVF9MTkMgKyBpICogUlhfQlVGRl9TSVpFKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJCWxwLT50eF9idWZfcHRyX2NwdVtpXSA9CisJCQkJKGNoYXIgKikoZGV2LT5tZW1fc3RhcnQgKyBCVUZfT0ZGU0VUX0NQVSArCisJCQkJCSAyICogUlhfUklOR19TSVpFICogUlhfQlVGRl9TSVpFICsKKwkJCQkJIDIgKiBpICogVFhfQlVGRl9TSVpFKTsKKwkJCWxwLT50eF9idWZfcHRyX2xuY1tpXSA9CisJCQkJKGNoYXIgKikoQlVGX09GRlNFVF9MTkMgKworCQkJCQkgUlhfUklOR19TSVpFICogUlhfQlVGRl9TSVpFICsKKwkJCQkJIGkgKiBUWF9CVUZGX1NJWkUpOworCQl9CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkZWNsYW5jZV9pbml0IGNhbGxlZCB3aXRoIHVua25vd24gdHlwZVxuIiwKKwkJCW5hbWUpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfZnJlZV9kZXY7CisJfQorCisJbGwgPSAoc3RydWN0IGxhbmNlX3JlZ3MgKikgZGV2LT5iYXNlX2FkZHI7CisJZXNhciA9ICh1bnNpZ25lZCBjaGFyICopIGVzYXJfYmFzZTsKKworCS8qIHByb20gY2hlY2tzICovCisJLyogRmlyc3QsIGNoZWNrIGZvciB0ZXN0IHBhdHRlcm4gKi8KKwlpZiAoZXNhclsweDYwXSAhPSAweGZmICYmIGVzYXJbMHg2NF0gIT0gMHgwMCAmJgorCSAgICBlc2FyWzB4NjhdICE9IDB4NTUgJiYgZXNhclsweDZjXSAhPSAweGFhKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJIiVzOiBFdGhlcm5ldCBzdGF0aW9uIGFkZHJlc3MgcHJvbSBub3QgZm91bmQhXG4iLAorCQkJbmFtZSk7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9mcmVlX2RldjsKKwl9CisJLyogQ2hlY2sgdGhlIHByb20gY29udGVudHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmIChlc2FyW2kgKiA0XSAhPSBlc2FyWzB4M2MgLSBpICogNF0gJiYKKwkJICAgIGVzYXJbaSAqIDRdICE9IGVzYXJbMHg0MCArIGkgKiA0XSAmJgorCQkgICAgZXNhclsweDNjIC0gaSAqIDRdICE9IGVzYXJbMHg0MCArIGkgKiA0XSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogU29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhlICIKKwkJCQkiZXRoZXJuZXQgc3RhdGlvbiBhZGRyZXNzIHByb20hXG4iLCBuYW1lKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGVycl9vdXRfZnJlZV9kZXY7CisJCX0KKwl9CisKKwkvKiBDb3B5IHRoZSBldGhlcm5ldCBhZGRyZXNzIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlLCBsYXRlciB0byB0aGUKKwkgKiBsYW5jZSBpbml0aWFsaXphdGlvbiBibG9jayBzbyB0aGUgbGFuY2UgZ2V0cyBpdCBldmVyeSB0aW1lIGl0J3MKKwkgKiAocmUpaW5pdGlhbGl6ZWQuCisJICovCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBBU0lDX0xBTkNFOgorCQlwcmludGsoIiVzOiBJT0FTSUMgb25ib2FyZCBMQU5DRSwgYWRkciA9ICIsIG5hbWUpOworCQlicmVhazsKKwljYXNlIFBNQURfTEFOQ0U6CisJCXByaW50aygiJXM6IFBNQUQtQUEsIGFkZHIgPSAiLCBuYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBQTUFYX0xBTkNFOgorCQlwcmludGsoIiVzOiBQTUFYIG9uYm9hcmQgTEFOQ0UsIGFkZHIgPSAiLCBuYW1lKTsKKwkJYnJlYWs7CisJfQorCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJZGV2LT5kZXZfYWRkcltpXSA9IGVzYXJbaSAqIDRdOworCQlwcmludGsoIiUyLjJ4JWMiLCBkZXYtPmRldl9hZGRyW2ldLCBpID09IDUgPyAnLCcgOiAnOicpOworCX0KKworCXByaW50aygiIGlycSA9ICVkXG4iLCBkZXYtPmlycSk7CisKKwlkZXYtPm9wZW4gPSAmbGFuY2Vfb3BlbjsKKwlkZXYtPnN0b3AgPSAmbGFuY2VfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmbGFuY2Vfc3RhcnRfeG1pdDsKKwlkZXYtPnR4X3RpbWVvdXQgPSAmbGFuY2VfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gNSpIWjsKKwlkZXYtPmdldF9zdGF0cyA9ICZsYW5jZV9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmbGFuY2Vfc2V0X211bHRpY2FzdDsKKworCS8qIGxwLT5sbCBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIHJlZ2lzdGVycyBmb3IgbGFuY2UgY2FyZCAqLworCWxwLT5sbCA9IGxsOworCisJLyogYnVzbWFzdGVyX3JlZ3ZhbCAoQ1NSMykgc2hvdWxkIGJlIHplcm8gYWNjb3JkaW5nIHRvIHRoZSBQTUFELUFBCisJICogc3BlY2lmaWNhdGlvbi4KKwkgKi8KKwlscC0+YnVzbWFzdGVyX3JlZ3ZhbCA9IDA7CisKKwlkZXYtPmRtYSA9IDA7CisKKwkvKiBXZSBjYW5ub3Qgc2xlZXAgaWYgdGhlIGNoaXAgaXMgYnVzeSBkdXJpbmcgYQorCSAqIG11bHRpY2FzdCBsaXN0IHVwZGF0ZSBldmVudCwgYmVjYXVzZSBzdWNoIGV2ZW50cworCSAqIGNhbiBvY2N1ciBmcm9tIGludGVycnVwdHMgKGV4LiBJUHY2KS4gIFNvIHdlCisJICogdXNlIGEgdGltZXIgdG8gdHJ5IGFnYWluIGxhdGVyIHdoZW4gbmVjZXNzYXJ5LiAtRGF2ZU0KKwkgKi8KKwlpbml0X3RpbWVyKCZscC0+bXVsdGljYXN0X3RpbWVyKTsKKwlscC0+bXVsdGljYXN0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworCWxwLT5tdWx0aWNhc3RfdGltZXIuZnVuY3Rpb24gPSAmbGFuY2Vfc2V0X211bHRpY2FzdF9yZXRyeTsKKworCXJldCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiJXM6IFVuYWJsZSB0byByZWdpc3RlciBuZXRkZXYsIGFib3J0aW5nLlxuIiwgbmFtZSk7CisJCWdvdG8gZXJyX291dF9mcmVlX2RldjsKKwl9CisKKwlscC0+bmV4dCA9IHJvb3RfbGFuY2VfZGV2OworCXJvb3RfbGFuY2VfZGV2ID0gZGV2OworCisJcHJpbnRrKCIlczogcmVnaXN0ZXJlZCBhcyAlcy5cbiIsIG5hbWUsIGRldi0+bmFtZSk7CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZnJlZV9kZXY6CisJa2ZyZWUoZGV2KTsKKworZXJyX291dDoKKwlyZXR1cm4gcmV0OworfQorCisKKy8qIEZpbmQgYWxsIHRoZSBsYW5jZSBjYXJkcyBvbiB0aGUgc3lzdGVtIGFuZCBpbml0aWFsaXplIHRoZW0gKi8KK3N0YXRpYyBpbnQgX19pbml0IGRlY19sYW5jZV9wcm9iZSh2b2lkKQoreworCWludCBjb3VudCA9IDA7CisKKwkvKiBTY2FuIHNsb3RzIGZvciBQTUFELUFBIGNhcmRzIGZpcnN0LiAqLworI2lmZGVmIENPTkZJR19UQworCWlmIChUVVJCT0NIQU5ORUwpIHsKKwkJaW50IHNsb3Q7CisKKwkJd2hpbGUgKChzbG90ID0gc2VhcmNoX3RjX2NhcmQoIlBNQUQtQUEiKSkgPj0gMCkgeworCQkJaWYgKGRlY19sYW5jZV9pbml0KFBNQURfTEFOQ0UsIHNsb3QpIDwgMCkKKwkJCQlicmVhazsKKwkJCWNvdW50Kys7CisJCX0KKwl9CisjZW5kaWYKKworCS8qIFRoZW4gaGFuZGxlIG9uYm9hcmQgZGV2aWNlcy4gKi8KKwlpZiAoZGVjX2ludGVycnVwdFtERUNfSVJRX0xBTkNFXSA+PSAwKSB7CisJCWlmIChkZWNfaW50ZXJydXB0W0RFQ19JUlFfTEFOQ0VfTUVSUl0gPj0gMCkgeworI2lmZGVmIENPTkZJR19UQworCQkJaWYgKGRlY19sYW5jZV9pbml0KEFTSUNfTEFOQ0UsIC0xKSA+PSAwKQorCQkJCWNvdW50Kys7CisjZW5kaWYKKwkJfSBlbHNlIGlmICghVFVSQk9DSEFOTkVMKSB7CisJCQlpZiAoZGVjX2xhbmNlX2luaXQoUE1BWF9MQU5DRSwgLTEpID49IDApCisJCQkJY291bnQrKzsKKwkJfQorCX0KKworCXJldHVybiAoY291bnQgPiAwKSA/IDAgOiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZGVjX2xhbmNlX2NsZWFudXAodm9pZCkKK3sKKwl3aGlsZSAocm9vdF9sYW5jZV9kZXYpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHJvb3RfbGFuY2VfZGV2OworCQlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworI2lmZGVmIENPTkZJR19UQworCQlpZiAobHAtPnNsb3QgPj0gMCkKKwkJCXJlbGVhc2VfdGNfY2FyZChscC0+c2xvdCk7CisjZW5kaWYKKwkJcm9vdF9sYW5jZV9kZXYgPSBscC0+bmV4dDsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwl9Cit9CisKK21vZHVsZV9pbml0KGRlY19sYW5jZV9wcm9iZSk7Cittb2R1bGVfZXhpdChkZWNfbGFuY2VfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZWZ4eC5jIGIvZHJpdmVycy9uZXQvZGVmeHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmFhNTY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZGVmeHguYwpAQCAtMCwwICsxLDM0NjMgQEAKKy8qCisgKiBGaWxlIE5hbWU6CisgKiAgIGRlZnh4LmMKKyAqCisgKiBDb3B5cmlnaHQgSW5mb3JtYXRpb246CisgKiAgIENvcHlyaWdodCBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiAxOTk2LgorICoKKyAqICAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIEFic3RyYWN0OgorICogICBBIExpbnV4IGRldmljZSBkcml2ZXIgc3VwcG9ydGluZyB0aGUgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24KKyAqICAgRkRESSBFSVNBIGFuZCBQQ0kgY29udHJvbGxlciBmYW1pbGllcy4gIFN1cHBvcnRlZCBhZGFwdGVycyBpbmNsdWRlOgorICoKKyAqCQlERUMgRkRESWNvbnRyb2xsZXIvRUlTQSAoREVGRUEpCisgKgkJREVDIEZEREljb250cm9sbGVyL1BDSSAgKERFRlBBKQorICoKKyAqIFRoZSBvcmlnaW5hbCBhdXRob3I6CisgKiAgIExWUwlMYXdyZW5jZSBWLiBTdGVmYW5pIDxsc3RlZmFuaUB5YWhvby5jb20+CisgKgorICogTWFpbnRhaW5lcnM6CisgKiAgIG1hY3JvCU1hY2llaiBXLiBSb3p5Y2tpIDxtYWNyb0BsaW51eC1taXBzLm9yZz4KKyAqCisgKiBDcmVkaXRzOgorICogICBJJ2QgbGlrZSB0byB0aGFuayBQYXRyaWNpYSBDcm9zcyBmb3IgaGVscGluZyBtZSBnZXQgc3RhcnRlZCB3aXRoCisgKiAgIExpbnV4LCBEYXZpZCBEYXZpZXMgZm9yIGEgbG90IG9mIGhlbHAgdXBncmFkaW5nIGFuZCBjb25maWd1cmluZworICogICBteSBkZXZlbG9wbWVudCBzeXN0ZW0gYW5kIGZvciBhbnN3ZXJpbmcgbWFueSBPUyBhbmQgZHJpdmVyCisgKiAgIGRldmVsb3BtZW50IHF1ZXN0aW9ucywgYW5kIEFsYW4gQ294IGZvciByZWNvbW1lbmRhdGlvbnMgYW5kCisgKiAgIGludGVncmF0aW9uIGhlbHAgb24gZ2V0dGluZyBGRERJIHN1cHBvcnQgaW50byBMaW51eC4gIExWUworICoKKyAqIERyaXZlciBBcmNoaXRlY3R1cmU6CisgKiAgIFRoZSBkcml2ZXIgYXJjaGl0ZWN0dXJlIGlzIGxhcmdlbHkgYmFzZWQgb24gcHJldmlvdXMgZHJpdmVyIHdvcmsKKyAqICAgZm9yIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLiAgVGhlIHVwcGVyIGVkZ2UgaW50ZXJmYWNlIGFuZAorICogICBmdW5jdGlvbnMgd2VyZSBsYXJnZWx5IHRha2VuIGZyb20gZXhpc3RpbmcgTGludXggZGV2aWNlIGRyaXZlcnMKKyAqICAgc3VjaCBhcyBEYXZpZCBEYXZpZXMnIERFNFg1LkMgZHJpdmVyIGFuZCBEb25hbGQgQmVja2VyJ3MgVFVMSVAuQworICogICBkcml2ZXIuCisgKgorICogICBBZGFwdGVyIFByb2JlIC0KKyAqCQlUaGUgZHJpdmVyIHNjYW5zIGZvciBzdXBwb3J0ZWQgRUlTQSBhZGFwdGVycyBieSByZWFkaW5nIHRoZQorICoJCVNMT1QgSUQgcmVnaXN0ZXIgZm9yIGVhY2ggRUlTQSBzbG90IGFuZCBtYWtpbmcgYSBtYXRjaAorICoJCWFnYWluc3QgdGhlIGV4cGVjdGVkIHZhbHVlLgorICoKKyAqICAgQnVzLVNwZWNpZmljIEluaXRpYWxpemF0aW9uIC0KKyAqCQlUaGlzIGRyaXZlciBjdXJyZW50bHkgc3VwcG9ydHMgYm90aCBFSVNBIGFuZCBQQ0kgY29udHJvbGxlcgorICoJCWZhbWlsaWVzLiAgV2hpbGUgdGhlIGN1c3RvbSBETUEgY2hpcCBhbmQgRkRESSBsb2dpYyBpcyBzaW1pbGFyCisgKgkJb3IgaWRlbnRpY2FsLCB0aGUgYnVzIGxvZ2ljIGlzIHZlcnkgZGlmZmVyZW50LiAgQWZ0ZXIKKyAqCQlpbml0aWFsaXphdGlvbiwgdGhlCW9ubHkgYnVzLXNwZWNpZmljIGRpZmZlcmVuY2VzIGlzIGluIGhvdyB0aGUKKyAqCQlkcml2ZXIgZW5hYmxlcyBhbmQgZGlzYWJsZXMgaW50ZXJydXB0cy4gIE90aGVyIHRoYW4gdGhhdCwgdGhlCisgKgkJcnVuLXRpbWUgY3JpdGljYWwgY29kZSBiZWhhdmVzIHRoZSBzYW1lIG9uIGJvdGggZmFtaWxpZXMuCisgKgkJSXQncyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IGJvdGggYWRhcHRlciBmYW1pbGllcyBhcmUgY29uZmlndXJlZAorICoJCXRvIEkvTyBtYXAsIHJhdGhlciB0aGFuIG1lbW9yeSBtYXAsIHRoZSBhZGFwdGVyIHJlZ2lzdGVycy4KKyAqCisgKiAgIERyaXZlciBPcGVuL0Nsb3NlIC0KKyAqCQlJbiB0aGUgZHJpdmVyIG9wZW4gcm91dGluZSwgdGhlIGRyaXZlciBJU1IgKGludGVycnVwdCBzZXJ2aWNlCisgKgkJcm91dGluZSkgaXMgcmVnaXN0ZXJlZCBhbmQgdGhlIGFkYXB0ZXIgaXMgYnJvdWdodCB0byBhbgorICoJCW9wZXJhdGlvbmFsIHN0YXRlLiAgSW4gdGhlIGRyaXZlciBjbG9zZSByb3V0aW5lLCB0aGUgb3Bwb3NpdGUKKyAqCQlvY2N1cnM7IHRoZSBkcml2ZXIgSVNSIGlzIGRlcmVnaXN0ZXJlZCBhbmQgdGhlIGFkYXB0ZXIgaXMKKyAqCQlicm91Z2h0IHRvIGEgc2FmZSwgYnV0IGNsb3NlZCBzdGF0ZS4gIFVzZXJzIG1heSB1c2UgY29uc2VjdXRpdmUKKyAqCQljb21tYW5kcyB0byBicmluZyB0aGUgYWRhcHRlciB1cCBhbmQgZG93biBhcyBpbiB0aGUgZm9sbG93aW5nCisgKgkJZXhhbXBsZToKKyAqCQkJCQlpZmNvbmZpZyBmZGRpMCB1cAorICoJCQkJCWlmY29uZmlnIGZkZGkwIGRvd24KKyAqCQkJCQlpZmNvbmZpZyBmZGRpMCB1cAorICoKKyAqICAgRHJpdmVyIFNodXRkb3duIC0KKyAqCQlBcHBhcmVudGx5LCB0aGVyZSBpcyBubyBzaHV0ZG93biBvciBoYWx0IHJvdXRpbmUgc3VwcG9ydCB1bmRlcgorICoJCUxpbnV4LiAgVGhpcyByb3V0aW5lIHdvdWxkIGJlIGNhbGxlZCBkdXJpbmcgInJlYm9vdCIgb3IKKyAqCQkic2h1dGRvd24iIHRvIGFsbG93IHRoZSBkcml2ZXIgdG8gcGxhY2UgdGhlIGFkYXB0ZXIgaW4gYSBzYWZlCisgKgkJc3RhdGUgYmVmb3JlIGEgd2FybSByZWJvb3Qgb2NjdXJzLiAgVG8gYmUgcmVhbGx5IHNhZmUsIHRoZSB1c2VyCisgKgkJc2hvdWxkIGNsb3NlIHRoZSBhZGFwdGVyIGJlZm9yZSBzaHV0ZG93biAoZWcuIGlmY29uZmlnIGZkZGkwIGRvd24pCisgKgkJdG8gZW5zdXJlIHRoYXQgdGhlIGFkYXB0ZXIgRE1BIGVuZ2luZSBpcyB0YWtlbiBvZmYtbGluZS4gIEhvd2V2ZXIsCisgKgkJdGhlIGN1cnJlbnQgZHJpdmVyIGNvZGUgYW50aWNpcGF0ZXMgdGhpcyBwcm9ibGVtIGFuZCBhbHdheXMgaXNzdWVzCisgKgkJYSBzb2Z0IHJlc2V0IG9mIHRoZSBhZGFwdGVyCWF0IHRoZSBiZWdpbm5pbmcgb2YgZHJpdmVyIGluaXRpYWxpemF0aW9uLgorICoJCUEgZnV0dXJlIGRyaXZlciBlbmhhbmNlbWVudCBpbiB0aGlzIGFyZWEgbWF5IG9jY3VyIGluIDIuMS5YIHdoZXJlCisgKgkJQWxhbiBpbmRpY2F0ZWQgdGhhdCBhIHNodXRkb3duIGhhbmRsZXIgbWF5IGJlIGltcGxlbWVudGVkLgorICoKKyAqICAgSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZSAtCisgKgkJVGhlIGRyaXZlciBzdXBwb3J0cyBzaGFyZWQgaW50ZXJydXB0cywgc28gdGhlIElTUiBpcyByZWdpc3RlcmVkIGZvcgorICoJCWVhY2ggYm9hcmQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgZmxhZyBhbmQgdGhlIHBvaW50ZXIgdG8gdGhhdCBib2FyZCdzCisgKgkJZGV2aWNlIHN0cnVjdHVyZS4gIFRoaXMgcHJvdmlkZXMgdGhlIGNvbnRleHQgZHVyaW5nIGludGVycnVwdAorICoJCXByb2Nlc3NpbmcgdG8gc3VwcG9ydCBzaGFyZWQgaW50ZXJydXB0cyBhbmQgbXVsdGlwbGUgYm9hcmRzLgorICoKKyAqCQlJbnRlcnJ1cHQgZW5hYmxpbmcvZGlzYWJsaW5nIGNhbiBvY2N1ciBhdCBtYW55IGxldmVscy4gIEF0IHRoZSBob3N0CisgKgkJZW5kLCB5b3UgY2FuIGRpc2FibGUgc3lzdGVtIGludGVycnVwdHMsIG9yIGRpc2FibGUgaW50ZXJydXB0cyBhdCB0aGUKKyAqCQlQSUMgKG9uIEludGVsIHN5c3RlbXMpLiAgQWNyb3NzIHRoZSBidXMsIGJvdGggRUlTQSBhbmQgUENJIGFkYXB0ZXJzCisgKgkJaGF2ZSBhIGJ1cy1sb2dpYyBjaGlwIGludGVycnVwdCBlbmFibGUvZGlzYWJsZSBhcyB3ZWxsIGFzIGEgRE1BCisgKgkJY29udHJvbGxlciBpbnRlcnJ1cHQgZW5hYmxlL2Rpc2FibGUuCisgKgorICoJCVRoZSBkcml2ZXIgY3VycmVudGx5IGVuYWJsZXMgYW5kIGRpc2FibGVzIGFkYXB0ZXIgaW50ZXJydXB0cyBhdCB0aGUKKyAqCQlidXMtbG9naWMgY2hpcCBhbmQgYXNzdW1lcyB0aGF0IExpbnV4IHdpbGwgdGFrZSBjYXJlIG9mIGNsZWFyaW5nIG9yCisgKgkJYWNrbm93bGVkZ2luZyBhbnkgaG9zdC1iYXNlZCBpbnRlcnJ1cHQgY2hpcHMuCisgKgorICogICBDb250cm9sIEZ1bmN0aW9ucyAtCisgKgkJQ29udHJvbCBmdW5jdGlvbnMgYXJlIHRob3NlIHVzZWQgdG8gc3VwcG9ydCBmdW5jdGlvbnMgc3VjaCBhcyBhZGRpbmcKKyAqCQlvciBkZWxldGluZyBtdWx0aWNhc3QgYWRkcmVzc2VzLCBlbmFibGluZyBvciBkaXNhYmxpbmcgcGFja2V0CisgKgkJcmVjZXB0aW9uIGZpbHRlcnMsIG9yIG90aGVyIGN1c3RvbS9wcm9wcmlldGFyeSBjb21tYW5kcy4gIFByZXNlbnRseSwKKyAqCQl0aGUgZHJpdmVyIHN1cHBvcnRzIHRoZSAiZ2V0IHN0YXRpc3RpY3MiLCAic2V0IG11bHRpY2FzdCBsaXN0IiwgYW5kCisgKgkJInNldCBtYWMgYWRkcmVzcyIgZnVuY3Rpb25zIGRlZmluZWQgYnkgTGludXguICBBIGxpc3Qgb2YgcG9zc2libGUKKyAqCQllbmhhbmNlbWVudHMgaW5jbHVkZToKKyAqCisgKgkJCQktIEN1c3RvbSBpb2N0bCBpbnRlcmZhY2UgZm9yIGV4ZWN1dGluZyBwb3J0IGludGVyZmFjZSBjb21tYW5kcworICoJCQkJLSBDdXN0b20gaW9jdGwgaW50ZXJmYWNlIGZvciBhZGRpbmcgdW5pY2FzdCBhZGRyZXNzZXMgdG8KKyAqCQkJCSAgYWRhcHRlciBDQU0gKHRvIHN1cHBvcnQgYnJpZGdlIGZ1bmN0aW9ucykuCisgKgkJCQktIEN1c3RvbSBpb2N0bCBpbnRlcmZhY2UgZm9yIHN1cHBvcnRpbmcgZmlybXdhcmUgdXBncmFkZXMuCisgKgorICogICBIYXJkd2FyZSAocG9ydCBpbnRlcmZhY2UpIFN1cHBvcnQgUm91dGluZXMgLQorICoJCVRoZSBkcml2ZXIgZnVuY3Rpb24gbmFtZXMgdGhhdCBzdGFydCB3aXRoICJkZnhfaHdfIiByZXByZXNlbnQKKyAqCQlsb3ctbGV2ZWwgcG9ydCBpbnRlcmZhY2Ugcm91dGluZXMgdGhhdCBhcmUgY2FsbGVkIGZyZXF1ZW50bHkuICBUaGV5CisgKgkJaW5jbHVkZSBpc3N1aW5nIGEgRE1BIG9yIHBvcnQgY29udHJvbCBjb21tYW5kIHRvIHRoZSBhZGFwdGVyLAorICoJCXJlc2V0dGluZyB0aGUgYWRhcHRlciwgb3IgcmVhZGluZyB0aGUgYWRhcHRlciBzdGF0ZS4gIFNpbmNlIHRoZQorICoJCWRyaXZlciBpbml0aWFsaXphdGlvbiBhbmQgcnVuLXRpbWUgY29kZSBtdXN0IG1ha2UgY2FsbHMgaW50byB0aGUKKyAqCQlwb3J0IGludGVyZmFjZSwgdGhlc2Ugcm91dGluZXMgd2VyZSB3cml0dGVuIHRvIGJlIGFzIGdlbmVyaWMgYW5kCisgKgkJdXNhYmxlIGFzIHBvc3NpYmxlLgorICoKKyAqICAgUmVjZWl2ZSBQYXRoIC0KKyAqCQlUaGUgYWRhcHRlciBETUEgZW5naW5lIHN1cHBvcnRzIGEgMjU2IGVudHJ5IHJlY2VpdmUgZGVzY3JpcHRvciBibG9jaworICoJCW9mIHdoaWNoIHVwIHRvIDI1NSBlbnRyaWVzIGNhbiBiZSB1c2VkIGF0IGFueSBnaXZlbiB0aW1lLiAgVGhlCisgKgkJYXJjaGl0ZWN0dXJlIGlzIGEgc3RhbmRhcmQgcHJvZHVjZXIsIGNvbnN1bWVyLCBjb21wbGV0aW9uIG1vZGVsIGluCisgKgkJd2hpY2ggdGhlIGRyaXZlciAicHJvZHVjZXMiIHJlY2VpdmUgYnVmZmVycyB0byB0aGUgYWRhcHRlciwgdGhlCisgKgkJYWRhcHRlciAiY29uc3VtZXMiIHRoZSByZWNlaXZlIGJ1ZmZlcnMgYnkgRE1BaW5nIGluY29taW5nIHBhY2tldCBkYXRhLAorICoJCWFuZCB0aGUgZHJpdmVyICJjb21wbGV0ZXMiIHRoZSByZWNlaXZlIGJ1ZmZlcnMgYnkgc2VydmljaW5nIHRoZQorICoJCWluY29taW5nIHBhY2tldCwgdGhlbiAicHJvZHVjZXMiIGEgbmV3IGJ1ZmZlciBhbmQgc3RhcnRzIHRoZSBjeWNsZQorICoJCWFnYWluLiAgUmVjZWl2ZSBidWZmZXJzIGNhbiBiZSBmcmFnbWVudGVkIGluIHVwIHRvIDE2IGZyYWdtZW50cworICoJCShkZXNjcmlwdG9yCWVudHJpZXMpLiAgRm9yIHNpbXBsaWNpdHksIHRoaXMgZHJpdmVyIHBvc3RzCisgKgkJc2luZ2xlLWZyYWdtZW50IHJlY2VpdmUgYnVmZmVycyBvZiA0NjA4IGJ5dGVzLCB0aGVuIGFsbG9jYXRlcyBhCisgKgkJc2tfYnVmZiwgY29waWVzIHRoZSBkYXRhLCB0aGVuIHJlcG9zdHMgdGhlIGJ1ZmZlci4gIFRvIHJlZHVjZSBDUFUKKyAqCQl1dGlsaXphdGlvbiwgYSBiZXR0ZXIgYXBwcm9hY2ggd291bGQgYmUgdG8gcGFzcyB1cCB0aGUgcmVjZWl2ZQorICoJCWJ1ZmZlciAobm8gZXh0cmEgY29weSkgdGhlbiBhbGxvY2F0ZSBhbmQgcG9zdCBhIHJlcGxhY2VtZW50IGJ1ZmZlci4KKyAqCQlUaGlzIGlzIGEgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnQgdGhhdCBzaG91bGQgYmUgbG9va2VkIGludG8gYXQKKyAqCQlzb21lIHBvaW50LgorICoKKyAqICAgVHJhbnNtaXQgUGF0aCAtCisgKgkJTGlrZSB0aGUgcmVjZWl2ZSBwYXRoLCB0aGUgYWRhcHRlciBETUEgZW5naW5lIHN1cHBvcnRzIGEgMjU2IGVudHJ5CisgKgkJdHJhbnNtaXQgZGVzY3JpcHRvciBibG9jayBvZiB3aGljaCB1cCB0byAyNTUgZW50cmllcyBjYW4gYmUgdXNlZCBhdAorICoJCWFueQlnaXZlbiB0aW1lLiAgVHJhbnNtaXQgYnVmZmVycyBjYW4gYmUgZnJhZ21lbnRlZAlpbiB1cCB0byAyNTUKKyAqCQlmcmFnbWVudHMgKGRlc2NyaXB0b3IgZW50cmllcykuICBUaGlzIGRyaXZlciBhbHdheXMgcG9zdHMgb25lCisgKgkJZnJhZ21lbnQgcGVyIHRyYW5zbWl0IHBhY2tldCByZXF1ZXN0LgorICoKKyAqCQlUaGUgZnJhZ21lbnQgY29udGFpbnMgdGhlIGVudGlyZSBwYWNrZXQgZnJvbSBGQyB0byBlbmQgb2YgZGF0YS4KKyAqCQlCZWZvcmUgcG9zdGluZyB0aGUgYnVmZmVyIHRvIHRoZSBhZGFwdGVyLCB0aGUgZHJpdmVyIHNldHMgYSB0aHJlZS1ieXRlCisgKgkJcGFja2V0IHJlcXVlc3QgaGVhZGVyIChQUkgpIHdoaWNoIGlzIHJlcXVpcmVkIGJ5IHRoZSBNb3Rvcm9sYSBNQUMgY2hpcAorICoJCXVzZWQgb24gdGhlIGFkYXB0ZXJzLiAgVGhlIFBSSCB0ZWxscyB0aGUgTUFDIHRoZSB0eXBlIG9mIHRva2VuIHRvCisgKgkJcmVjZWl2ZS9zZW5kLCB3aGV0aGVyIG9yIG5vdCB0byBnZW5lcmF0ZSBhbmQgYXBwZW5kIHRoZSBDUkMsIHdoZXRoZXIKKyAqCQlzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMgZnJhbWluZyBpcyB1c2VkLCBldGMuICBTaW5jZSB0aGUgUFJICisgKgkJZGVmaW5pdGlvbiBpcyBub3QgbmVjZXNzYXJpbHkgY29uc2lzdGVudCBhY3Jvc3MgYWxsIEZEREkgY2hpcHNldHMsCisgKgkJdGhlIGRyaXZlciwgcmF0aGVyIHRoYW4gdGhlIGNvbW1vbiBGRERJIHBhY2tldCBoYW5kbGVyIHJvdXRpbmVzLAorICoJCXNldHMgdGhlc2UgYnl0ZXMuCisgKgorICoJCVRvIHJlZHVjZSB0aGUgYW1vdW50IG9mIGRlc2NyaXB0b3IgZmV0Y2hlcyBuZWVkZWQgcGVyIHRyYW5zbWl0IHJlcXVlc3QsCisgKgkJdGhlIGRyaXZlciB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCB0aGVyZSBhcmUgYXQgbGVhc3QgdGhyZWUKKyAqCQlieXRlcyBhdmFpbGFibGUgYmVmb3JlIHRoZSBza2ItPmRhdGEgZmllbGQgb24gdGhlIG91dGdvaW5nIHRyYW5zbWl0CisgKgkJcmVxdWVzdC4gIFRoaXMgaXMgZ3VhcmFudGVlZCBieSBoYXZpbmcgZmRkaV9zZXR1cCgpIGluIG5ldF9pbml0LmMgc2V0CisgKgkJZGV2LT5oYXJkX2hlYWRlcl9sZW4gdG8gMjQgYnl0ZXMuICAyMSBieXRlcyBhY2NvdW50cyBmb3IgdGhlIGxhcmdlc3QKKyAqCQloZWFkZXIgaW4gYW4gODAyLjIgU05BUCBmcmFtZS4gIFRoZSBvdGhlciAzIGJ5dGVzIGFyZSB0aGUgZXh0cmEgInBhZCIKKyAqCQlieXRlcyB3aGljaCB3ZSdsbCB1c2UgdG8gc3RvcmUgdGhlIFBSSC4KKyAqCisgKgkJVGhlcmUncyBhIHN1YnRsZSBhZHZhbnRhZ2UgdG8gYWRkaW5nIHRoZXNlIHBhZCBieXRlcyB0byB0aGUKKyAqCQloYXJkX2hlYWRlcl9sZW4sIGl0IGVuc3VyZXMgdGhhdCB0aGUgZGF0YSBwb3J0aW9uIG9mIHRoZSBwYWNrZXQgZm9yCisgKgkJYW4gODAyLjIgU05BUCBmcmFtZSBpcyBsb25nd29yZCBhbGlnbmVkLiAgT3RoZXIgRkRESSBkcml2ZXIKKyAqCQlpbXBsZW1lbnRhdGlvbnMgbWF5IG5vdCBuZWVkIHRoZSBleHRyYSBwYWRkaW5nIGFuZCBjYW4gc3RhcnQgY29weWluZworICoJCW9yIERNQWluZyBkaXJlY3RseSBmcm9tIHRoZSBGQyBieXRlIHdoaWNoIHN0YXJ0cyBhdCBza2ItPmRhdGEuICBTaG91bGQKKyAqCQlhbm90aGVyIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBuZWVkIEFERElUSU9OQUwgcGFkZGluZywgdGhlIG5ldF9pbml0LmMKKyAqCQltb2R1bGUgc2hvdWxkIGJlIHVwZGF0ZWQgYW5kIGRldi0+aGFyZF9oZWFkZXJfbGVuIHNob3VsZCBiZSBpbmNyZWFzZWQuCisgKgkJTk9URTogVG8gbWFpbnRhaW4gdGhlIGFsaWdubWVudCBvbiB0aGUgZGF0YSBwb3J0aW9uIG9mIHRoZSBwYWNrZXQsCisgKgkJZGV2LT5oYXJkX2hlYWRlcl9sZW4gc2hvdWxkIGFsd2F5cyBiZSBldmVubHkgZGl2aXNpYmxlIGJ5IDQgYW5kIGF0CisgKgkJbGVhc3QgMjQgYnl0ZXMgaW4gc2l6ZS4KKyAqCisgKiBNb2RpZmljYXRpb24gSGlzdG9yeToKKyAqCQlEYXRlCQlOYW1lCURlc2NyaXB0aW9uCisgKgkJMTYtQXVnLTk2CUxWUwkJQ3JlYXRlZC4KKyAqCQkyMC1BdWctOTYJTFZTCQlVcGRhdGVkIGRmeF9wcm9iZSBzbyB0aGF0IHZlcnNpb24gaW5mb3JtYXRpb24KKyAqCQkJCQkJCXN0cmluZyBpcyBvbmx5IGRpc3BsYXllZCBpZiAxIG9yIG1vcmUgY2FyZHMgYXJlCisgKgkJCQkJCQlmb3VuZC4gIENoYW5nZWQgZGZ4X3Jjdl9xdWV1ZV9wcm9jZXNzIHRvIGNvcHkKKyAqCQkJCQkJCTMgTlVMTCBieXRlcyBiZWZvcmUgRkMgdG8gZW5zdXJlIHRoYXQgZGF0YSBpcworICoJCQkJCQkJbG9uZ3dvcmQgYWxpZ25lZCBpbiByZWNlaXZlIGJ1ZmZlci4KKyAqCQkwOS1TZXAtOTYJTFZTCQlVcGRhdGVkIGRmeF9jdGxfc2V0X211bHRpY2FzdF9saXN0IHRvIGVuYWJsZQorICoJCQkJCQkJTExDIGdyb3VwIHByb21pc2N1b3VzIG1vZGUgaWYgbXVsdGljYXN0IGxpc3QKKyAqCQkJCQkJCWlzIHRvbyBsYXJnZS4gIExMQyBpbmRpdmlkdWFsL2dyb3VwIHByb21pc2N1b3VzCisgKgkJCQkJCQltb2RlIGlzIG5vdyBkaXNhYmxlZCBpZiBJRkZfUFJPTUlTQyBmbGFnIG5vdCBzZXQuCisgKgkJCQkJCQlkZnhfeG10X3F1ZXVlX3BrdCBubyBsb25nZXIgY2hlY2tzIGZvciBOVUxMIHNrYgorICoJCQkJCQkJb24gQWxhbiBDb3ggcmVjb21tZW5kYXRpb24uICBBZGRlZCBub2RlIGFkZHJlc3MKKyAqCQkJCQkJCW92ZXJyaWRlIHN1cHBvcnQuCisgKgkJMTItU2VwLTk2CUxWUwkJUmVzZXQgY3VycmVudCBhZGRyZXNzIHRvIGZhY3RvcnkgYWRkcmVzcyBkdXJpbmcKKyAqCQkJCQkJCWRldmljZSBvcGVuLiAgVXBkYXRlZCB0cmFuc21pdCBwYXRoIHRvIHBvc3QgYQorICoJCQkJCQkJc2luZ2xlIGZyYWdtZW50IHdoaWNoIGluY2x1ZGVzIFBSSC0+ZW5kIG9mIGRhdGEuCisgKgkJTWFyIDIwMDAJQUMJCURpZCB2YXJpb3VzIGNsZWFudXBzIGZvciAyLjMueAorICoJCUp1biAyMDAwCWpnYXJ6aWsJCVBDSSBhbmQgcmVzb3VyY2UgYWxsb2MgY2xlYW51cHMKKyAqCQlKdWwgMjAwMAl0amVlcmQJCU11Y2ggY2xlYW51cCBhbmQgc29tZSBidWcgZml4ZXMKKyAqCQlTZXAgMjAwMAl0amVlcmQJCUZpeCBsZWFrIG9uIHVubG9hZCwgY29zbWV0aWMgY29kZSBjbGVhbnVwCisgKgkJRmViIDIwMDEJCQlTa2IgYWxsb2NhdGlvbiBmaXhlcworICoJCUZlYiAyMDAxCWRhdmVqCQlQQ0kgZW5hYmxlIGNsZWFudXBzLgorICoJCTA0IEF1ZyAyMDAzCW1hY3JvCQlDb252ZXJ0ZWQgdG8gdGhlIERNQSBBUEkuCisgKgkJMTQgQXVnIDIwMDQJbWFjcm8JCUZpeCBkZXZpY2UgbmFtZXMgcmVwb3J0ZWQuCisgKi8KKworLyogSW5jbHVkZSBmaWxlcyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmRkaWRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAiZGVmeHguaCIKKworLyogVmVyc2lvbiBpbmZvcm1hdGlvbiBzdHJpbmcgc2hvdWxkIGJlIHVwZGF0ZWQgcHJpb3IgdG8gZWFjaCBuZXcgcmVsZWFzZSEgICovCisjZGVmaW5lIERSVl9OQU1FICJkZWZ4eCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gInYxLjA3IgorI2RlZmluZSBEUlZfUkVMREFURSAiMjAwNC8wOC8xNCIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorCURSVl9OQU1FICI6ICIgRFJWX1ZFUlNJT04gIiAiIERSVl9SRUxEQVRFCisJIiAgTGF3cmVuY2UgVi4gU3RlZmFuaSBhbmQgb3RoZXJzXG4iOworCisjZGVmaW5lIERZTkFNSUNfQlVGRkVSUyAxCisKKyNkZWZpbmUgU0tCVUZGX1JYX0NPUFlCUkVBSyAyMDAKKy8qCisgKiBORVdfU0tCX1NJWkUgPSBQSV9SQ1ZfREFUQV9LX1NJWkVfTUFYKzEyOCB0byBhbGxvdyAxMjggYnl0ZQorICogYWxpZ25tZW50IGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkIEVJU0EgYm9hcmRzLgorICovCisjZGVmaW5lIE5FV19TS0JfU0laRSAoUElfUkNWX0RBVEFfS19TSVpFX01BWCsxMjgpCisKKy8qIERlZmluZSBtb2R1bGUtd2lkZSAoc3RhdGljKSByb3V0aW5lcyAqLworCitzdGF0aWMgdm9pZAkJZGZ4X2J1c19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQJCWRmeF9idXNfY29uZmlnX2NoZWNrKERGWF9ib2FyZF90ICpicCk7CisKK3N0YXRpYyBpbnQJCWRmeF9kcml2ZXJfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpwcmludF9uYW1lKTsKK3N0YXRpYyBpbnQJCWRmeF9hZGFwX2luaXQoREZYX2JvYXJkX3QgKmJwLCBpbnQgZ2V0X2J1ZmZlcnMpOworCitzdGF0aWMgaW50CQlkZnhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJCWRmeF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHZvaWQJCWRmeF9pbnRfcHJfaGFsdF9pZChERlhfYm9hcmRfdCAqYnApOworc3RhdGljIHZvaWQJCWRmeF9pbnRfdHlwZV8wX3Byb2Nlc3MoREZYX2JvYXJkX3QgKmJwKTsKK3N0YXRpYyB2b2lkCQlkZnhfaW50X2NvbW1vbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkCQlkZnhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCitzdGF0aWMgc3RydWN0CQluZXRfZGV2aWNlX3N0YXRzICpkZnhfY3RsX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkCQlkZnhfY3RsX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJCWRmeF9jdGxfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpOworc3RhdGljIGludAkJZGZ4X2N0bF91cGRhdGVfY2FtKERGWF9ib2FyZF90ICpicCk7CitzdGF0aWMgaW50CQlkZnhfY3RsX3VwZGF0ZV9maWx0ZXJzKERGWF9ib2FyZF90ICpicCk7CisKK3N0YXRpYyBpbnQJCWRmeF9od19kbWFfY21kX3JlcShERlhfYm9hcmRfdCAqYnApOworc3RhdGljIGludAkJZGZ4X2h3X3BvcnRfY3RybF9yZXEoREZYX2JvYXJkX3QgKmJwLCBQSV9VSU5UMzIJY29tbWFuZCwgUElfVUlOVDMyIGRhdGFfYSwgUElfVUlOVDMyIGRhdGFfYiwgUElfVUlOVDMyICpob3N0X2RhdGEpOworc3RhdGljIHZvaWQJCWRmeF9od19hZGFwX3Jlc2V0KERGWF9ib2FyZF90ICpicCwgUElfVUlOVDMyIHR5cGUpOworc3RhdGljIGludAkJZGZ4X2h3X2FkYXBfc3RhdGVfcmQoREZYX2JvYXJkX3QgKmJwKTsKK3N0YXRpYyBpbnQJCWRmeF9od19kbWFfdW5pbml0KERGWF9ib2FyZF90ICpicCwgUElfVUlOVDMyIHR5cGUpOworCitzdGF0aWMgaW50CQlkZnhfcmN2X2luaXQoREZYX2JvYXJkX3QgKmJwLCBpbnQgZ2V0X2J1ZmZlcnMpOworc3RhdGljIHZvaWQJCWRmeF9yY3ZfcXVldWVfcHJvY2VzcyhERlhfYm9hcmRfdCAqYnApOworc3RhdGljIHZvaWQJCWRmeF9yY3ZfZmx1c2goREZYX2JvYXJkX3QgKmJwKTsKKworc3RhdGljIGludAkJZGZ4X3htdF9xdWV1ZV9wa3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CQlkZnhfeG10X2RvbmUoREZYX2JvYXJkX3QgKmJwKTsKK3N0YXRpYyB2b2lkCQlkZnhfeG10X2ZsdXNoKERGWF9ib2FyZF90ICpicCk7CisKKy8qIERlZmluZSBtb2R1bGUtd2lkZSAoc3RhdGljKSB2YXJpYWJsZXMgKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpyb290X2RmeF9laXNhX2RldjsKKworDAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09CisgKiA9IGRmeF9wb3J0X3dyaXRlX2J5dGUgPQorICogPSBkZnhfcG9ydF9yZWFkX2J5dGUJID0KKyAqID0gZGZ4X3BvcnRfd3JpdGVfbG9uZyA9CisgKiA9IGRmeF9wb3J0X3JlYWRfbG9uZyAgPQorICogPT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgCisgKiBPdmVydmlldzoKKyAqICAgUm91dGluZXMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgdmFsdWVzIGZyb20vdG8gYWRhcHRlcgorICogIAorICogUmV0dXJuczoKKyAqICAgTm9uZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGJwICAgICAtIHBvaW50ZXIgdG8gYm9hcmQgaW5mb3JtYXRpb24KKyAqICAgb2Zmc2V0IC0gcmVnaXN0ZXIgb2Zmc2V0IGZyb20gYmFzZSBJL08gYWRkcmVzcworICogICBkYXRhICAgLSBmb3IgZGZ4X3BvcnRfd3JpdGVfYnl0ZSBhbmQgZGZ4X3BvcnRfd3JpdGVfbG9uZywgdGhpcworICoJCQkgIGlzIGEgdmFsdWUgdG8gd3JpdGUuCisgKgkJCSAgZm9yIGRmeF9wb3J0X3JlYWRfYnl0ZSBhbmQgZGZ4X3BvcnRfcmVhZF9ieXRlLCB0aGlzCisgKgkJCSAgaXMgYSBwb2ludGVyIHRvIHN0b3JlIHRoZSByZWFkIHZhbHVlLgorICoKKyAqIEZ1bmN0aW9uYWwgRGVzY3JpcHRpb246CisgKiAgIFRoZXNlIHJvdXRpbmVzIHBlcmZvcm0gdGhlIGNvcnJlY3Qgb3BlcmF0aW9uIHRvIHJlYWQgb3Igd3JpdGUKKyAqICAgdGhlIGFkYXB0ZXIgcmVnaXN0ZXIuCisgKiAgIAorICogICBFSVNBIHBvcnQgYmxvY2sgYmFzZSBhZGRyZXNzZXMgYXJlIGJhc2VkIG9uIHRoZSBzbG90IG51bWJlciBpbiB3aGljaCB0aGUKKyAqICAgY29udHJvbGxlciBpcyBpbnN0YWxsZWQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIEVJU0EgY29udHJvbGxlciBpcyBpbnN0YWxsZWQKKyAqICAgaW4gc2xvdCA0LCB0aGUgcG9ydCBibG9jayBiYXNlIGFkZHJlc3MgaXMgMHg0MDAwLiAgSWYgdGhlIGNvbnRyb2xsZXIgaXMKKyAqICAgaW5zdGFsbGVkIGluIHNsb3QgMiwgdGhlIHBvcnQgYmxvY2sgYmFzZSBhZGRyZXNzIGlzIDB4MjAwMCwgYW5kIHNvIG9uLgorICogICBUaGlzIHBvcnQgYmxvY2sgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIFBEUSwgRVNJQywgYW5kIERFRkVBIG9uLWJvYXJkCisgKiAgIHJlZ2lzdGVycyB1c2luZyB0aGUgcmVnaXN0ZXIgb2Zmc2V0cyBkZWZpbmVkIGluIERFRlhYLkguCisgKgorICogICBQQ0kgcG9ydCBibG9jayBiYXNlIGFkZHJlc3NlcyBhcmUgYXNzaWduZWQgYnkgdGhlIFBDSSBCSU9TIG9yIHN5c3RlbQorICoJIGZpcm13YXJlLiAgVGhlcmUgaXMgb25lIDEyOCBieXRlIHBvcnQgYmxvY2sgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkLiAgSXQKKyAqICAgYWxsb3dzIGZvciBJL08gbWFwcGluZyBvZiBib3RoIFBEUSBhbmQgUEZJIHJlZ2lzdGVycyB1c2luZyB0aGUgcmVnaXN0ZXIKKyAqICAgb2Zmc2V0cyBkZWZpbmVkIGluIERFRlhYLkguCisgKgorICogUmV0dXJuIENvZGVzOgorICogICBOb25lCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIGJwLT5iYXNlX2FkZHIgaXMgYSB2YWxpZCBiYXNlIEkvTyBhZGRyZXNzIGZvciB0aGlzIGFkYXB0ZXIuCisgKiAgIG9mZnNldCBpcyBhIHZhbGlkIHJlZ2lzdGVyIG9mZnNldCBmb3IgdGhpcyBhZGFwdGVyLgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgUmF0aGVyIHRoYW4gcHJvZHVjZSBtYWNyb3MgZm9yIHRoZXNlIGZ1bmN0aW9ucywgdGhlc2Ugcm91dGluZXMKKyAqICAgYXJlIGRlZmluZWQgdXNpbmcgImlubGluZSIgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwKKyAqICAgZ2VuZXJhdGUgaW5saW5lIGNvZGUgYW5kIG5vdCB3YXN0ZSBhIHByb2NlZHVyZSBjYWxsIGFuZCByZXR1cm4uCisgKiAgIFRoaXMgcHJvdmlkZXMgYWxsIHRoZSBiZW5lZml0cyBvZiBtYWNyb3MsIGJ1dCB3aXRoIHRoZQorICogICBhZHZhbnRhZ2Ugb2Ygc3RyaWN0IGRhdGEgdHlwZSBjaGVja2luZy4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgZGZ4X3BvcnRfd3JpdGVfYnl0ZSgKKwlERlhfYm9hcmRfdAkqYnAsCisJaW50CQkJb2Zmc2V0LAorCXU4CQkJZGF0YQorCSkKKworCXsKKwl1MTYgcG9ydCA9IGJwLT5iYXNlX2FkZHIgKyBvZmZzZXQ7CisKKwlvdXRiKGRhdGEsIHBvcnQpOworCX0KKworc3RhdGljIGlubGluZSB2b2lkIGRmeF9wb3J0X3JlYWRfYnl0ZSgKKwlERlhfYm9hcmRfdAkqYnAsCisJaW50CQkJb2Zmc2V0LAorCXU4CQkJKmRhdGEKKwkpCisKKwl7CisJdTE2IHBvcnQgPSBicC0+YmFzZV9hZGRyICsgb2Zmc2V0OworCisJKmRhdGEgPSBpbmIocG9ydCk7CisJfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGZ4X3BvcnRfd3JpdGVfbG9uZygKKwlERlhfYm9hcmRfdAkqYnAsCisJaW50CQkJb2Zmc2V0LAorCXUzMgkJCWRhdGEKKwkpCisKKwl7CisJdTE2IHBvcnQgPSBicC0+YmFzZV9hZGRyICsgb2Zmc2V0OworCisJb3V0bChkYXRhLCBwb3J0KTsKKwl9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZnhfcG9ydF9yZWFkX2xvbmcoCisJREZYX2JvYXJkX3QJKmJwLAorCWludAkJCW9mZnNldCwKKwl1MzIJCQkqZGF0YQorCSkKKworCXsKKwl1MTYgcG9ydCA9IGJwLT5iYXNlX2FkZHIgKyBvZmZzZXQ7CisKKwkqZGF0YSA9IGlubChwb3J0KTsKKwl9CisKKwwKKy8qCisgKiA9PT09PT09PT09PT09CisgKiA9IGRmeF9pbml0X29uZV9wY2lfb3JfZWlzYSA9CisgKiA9PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIEluaXRpYWxpemVzIGEgc3VwcG9ydGVkIEZEREkgRUlTQSBvciBQQ0kgY29udHJvbGxlcgorICogIAorICogUmV0dXJuczoKKyAqICAgQ29uZGl0aW9uIGNvZGUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBwZGV2IC0gcG9pbnRlciB0byBwY2kgZGV2aWNlIGluZm9ybWF0aW9uIChOVUxMIGZvciBFSVNBKQorICogICBpb2FkZHIgLSBwb2ludGVyIHRvIHBvcnQgKE5VTEwgZm9yIFBDSSkKKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgMAkJIC0gVGhpcyBkZXZpY2UgKGZkZGkwLCBmZGRpMSwgZXRjKSBjb25maWd1cmVkIHN1Y2Nlc3NmdWxseQorICogICAtRUJVU1kgICAgICAtIEZhaWxlZCB0byBnZXQgcmVzb3VyY2VzLCBvciBkZnhfZHJpdmVyX2luaXQgZmFpbGVkLgorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBJdCBjb21waWxlcyBzbyBpdCBzaG91bGQgd29yayA6LSggKFBDSSBjYXJkcyBkbyA6LSkKKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIERldmljZSBzdHJ1Y3R1cmVzIGZvciBGRERJIGFkYXB0ZXJzIChmZGRpMCwgZmRkaTEsIGV0YykgYXJlCisgKiAgIGluaXRpYWxpemVkIGFuZCB0aGUgYm9hcmQgcmVzb3VyY2VzIGFyZSByZWFkIGFuZCBzdG9yZWQgaW4KKyAqICAgdGhlIGRldmljZSBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGRmeF9pbml0X29uZV9wY2lfb3JfZWlzYShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgbG9uZyBpb2FkZHIpCit7CisJc3RhdGljIGludCB2ZXJzaW9uX2Rpc3A7CisJY2hhciAqcHJpbnRfbmFtZSA9IERSVl9OQU1FOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJREZYX2JvYXJkX3QJICAqYnA7CQkJLyogYm9hcmQgcG9pbnRlciAqLworCWludCBhbGxvY19zaXplOwkJCQkvKiB0b3RhbCBidWZmZXIgc2l6ZSB1c2VkICovCisJaW50IGVycjsKKworCWlmICghdmVyc2lvbl9kaXNwKSB7CS8qIGRpc3BsYXkgdmVyc2lvbiBpbmZvIGlmIGFkYXB0ZXIgaXMgZm91bmQgKi8KKwkJdmVyc2lvbl9kaXNwID0gMTsJLyogc2V0IGRpc3BsYXkgZmxhZyB0byBUUlVFIHNvIHRoYXQgKi8KKwkJcHJpbnRrKHZlcnNpb24pOwkvKiB3ZSBvbmx5IGRpc3BsYXkgdGhpcyBzdHJpbmcgT05DRSAqLworCX0KKworCWlmIChwZGV2ICE9IE5VTEwpCisJCXByaW50X25hbWUgPSBwY2lfbmFtZShwZGV2KTsKKworCWRldiA9IGFsbG9jX2ZkZGlkZXYoc2l6ZW9mKCpicCkpOworCWlmICghZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBmZGRpZGV2LCBhYm9ydGluZ1xuIiwKKwkJICAgICAgIHByaW50X25hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBFbmFibGUgUENJIGRldmljZS4gKi8KKwlpZiAocGRldiAhPSBOVUxMKSB7CisJCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlIChwZGV2KTsKKwkJaWYgKGVycikgZ290byBlcnJfb3V0OworCQlpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDEpOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJYnAgPSBkZXYtPnByaXY7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwKKwkJCSAgICBwZGV2ID8gUEZJX0tfQ1NSX0lPX0xFTiA6IFBJX0VTSUNfS19DU1JfSU9fTEVOLAorCQkJICAgIHByaW50X25hbWUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCByZXNlcnZlIEkvTyByZXNvdXJjZSAiCisJCSAgICAgICAiMHgleCBAIDB4JWx4LCBhYm9ydGluZ1xuIiwgcHJpbnRfbmFtZSwKKwkJICAgICAgIHBkZXYgPyBQRklfS19DU1JfSU9fTEVOIDogUElfRVNJQ19LX0NTUl9JT19MRU4sIGlvYWRkcik7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qIEluaXRpYWxpemUgbmV3IGRldmljZSBzdHJ1Y3R1cmUgKi8KKworCWRldi0+YmFzZV9hZGRyCQkJPSBpb2FkZHI7IC8qIHNhdmUgcG9ydCAoSS9PKSBiYXNlIGFkZHJlc3MgKi8KKworCWRldi0+Z2V0X3N0YXRzCQkJPSBkZnhfY3RsX2dldF9zdGF0czsKKwlkZXYtPm9wZW4JCQk9IGRmeF9vcGVuOworCWRldi0+c3RvcAkJCT0gZGZ4X2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0CQk9IGRmeF94bXRfcXVldWVfcGt0OworCWRldi0+c2V0X211bHRpY2FzdF9saXN0CQk9IGRmeF9jdGxfc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+c2V0X21hY19hZGRyZXNzCQk9IGRmeF9jdGxfc2V0X21hY19hZGRyZXNzOworCisJaWYgKHBkZXYgPT0gTlVMTCkgeworCQkvKiBFSVNBIGJvYXJkICovCisJCWJwLT5idXNfdHlwZSA9IERGWF9CVVNfVFlQRV9FSVNBOworCQlicC0+bmV4dCA9IHJvb3RfZGZ4X2Vpc2FfZGV2OworCQlyb290X2RmeF9laXNhX2RldiA9IGRldjsKKwl9IGVsc2UgeworCQkvKiBQQ0kgYm9hcmQgKi8KKwkJYnAtPmJ1c190eXBlID0gREZYX0JVU19UWVBFX1BDSTsKKwkJYnAtPnBjaV9kZXYgPSBwZGV2OworCQlwY2lfc2V0X2RydmRhdGEgKHBkZXYsIGRldik7CisJCXBjaV9zZXRfbWFzdGVyIChwZGV2KTsKKwl9CisKKwlpZiAoZGZ4X2RyaXZlcl9pbml0KGRldiwgcHJpbnRfbmFtZSkgIT0gREZYX0tfU1VDQ0VTUykgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfcmVnaW9uOworCX0KKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9rZnJlZTsKKworCXByaW50aygiJXM6IHJlZ2lzdGVyZWQgYXMgJXNcbiIsIHByaW50X25hbWUsIGRldi0+bmFtZSk7CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfa2ZyZWU6CisJYWxsb2Nfc2l6ZSA9IHNpemVvZihQSV9ERVNDUl9CTE9DSykgKworCQkgICAgIFBJX0NNRF9SRVFfS19TSVpFX01BWCArIFBJX0NNRF9SU1BfS19TSVpFX01BWCArCisjaWZuZGVmIERZTkFNSUNfQlVGRkVSUworCQkgICAgIChicC0+cmN2X2J1ZnNfdG9fcG9zdCAqIFBJX1JDVl9EQVRBX0tfU0laRV9NQVgpICsKKyNlbmRpZgorCQkgICAgIHNpemVvZihQSV9DT05TVU1FUl9CTE9DSykgKworCQkgICAgIChQSV9BTElHTl9LX0RFU0NfQkxLIC0gMSk7CisJaWYgKGJwLT5rbWFsbG9jZWQpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgYWxsb2Nfc2l6ZSwKKwkJCQkgICAgYnAtPmttYWxsb2NlZCwgYnAtPmttYWxsb2NlZF9kbWEpOworZXJyX291dF9yZWdpb246CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBwZGV2ID8gUEZJX0tfQ1NSX0lPX0xFTiA6IFBJX0VTSUNfS19DU1JfSU9fTEVOKTsKK2Vycl9vdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkZnhfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJcmV0dXJuIGRmeF9pbml0X29uZV9wY2lfb3JfZWlzYShwZGV2LCAwKTsKK30KKworc3RhdGljIGludCBfX2luaXQgZGZ4X2Vpc2FfaW5pdCh2b2lkKQoreworCWludCByYyA9IC1FTk9ERVY7CisJaW50IGk7CQkJLyogdXNlZCBpbiBmb3IgbG9vcHMgKi8KKwl1MTYgcG9ydDsJCS8qIHRlbXBvcmFyeSBJL08gKHBvcnQpIGFkZHJlc3MgKi8KKwl1MzIgc2xvdF9pZDsJCS8qIEVJU0EgaGFyZHdhcmUgKHNsb3QpIElEIHJlYWQgZnJvbSBhZGFwdGVyICovCisKKwlEQkdfcHJpbnRrKCJJbiBkZnhfZWlzYV9pbml0Li4uXG4iKTsKKworCS8qIFNjYW4gZm9yIEZEREkgRUlTQSBjb250cm9sbGVycyAqLworCisJZm9yIChpPTA7IGkgPCBERlhfTUFYX0VJU0FfU0xPVFM7IGkrKykJCS8qIG9ubHkgc2NhbiBmb3IgdXAgdG8gMTYgRUlTQSBzbG90cyAqLworCXsKKwkJcG9ydCA9IChpIDw8IDEyKSArIFBJX0VTSUNfS19TTE9UX0lEOwkvKiBwb3J0ID0gSS9PIGFkZHJlc3MgZm9yIHJlYWRpbmcgc2xvdCBJRCAqLworCQlzbG90X2lkID0gaW5sKHBvcnQpOwkJCQkJLyogcmVhZCBFSVNBIEhXIChzbG90KSBJRCAqLworCQlpZiAoKHNsb3RfaWQgJiAweEYwRkZGRkZGKSA9PSBERUZFQV9QUk9EVUNUX0lEKQorCQl7CisJCQlwb3J0ID0gKGkgPDwgMTIpOwkJCQkJLyogcmVjYWxjIGJhc2UgYWRkciAqLworCisJCQlpZiAoZGZ4X2luaXRfb25lX3BjaV9vcl9laXNhKE5VTEwsIHBvcnQpID09IDApIHJjID0gMDsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisMCisvKgorICogPT09PT09PT09PT09PT09PQorICogPSBkZnhfYnVzX2luaXQgPQorICogPT09PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBJbml0aWFsaXplcyBFSVNBIGFuZCBQQ0kgY29udHJvbGxlciBidXMtc3BlY2lmaWMgbG9naWMuCisgKiAgCisgKiBSZXR1cm5zOgorICogICBOb25lCisgKiAgICAgICAKKyAqIEFyZ3VtZW50czoKKyAqICAgZGV2IC0gcG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBEZXRlcm1pbmUgYW5kIHNhdmUgYWRhcHRlciBJUlEgaW4gZGV2aWNlIHRhYmxlLAorICogICB0aGVuIHBlcmZvcm0gYnVzLXNwZWNpZmljIGxvZ2ljIGluaXRpYWxpemF0aW9uLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgTm9uZQorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBkZXYtPmJhc2VfYWRkciBoYXMgYWxyZWFkeSBiZWVuIHNldCB3aXRoIHRoZSBwcm9wZXIKKyAqCSBiYXNlIEkvTyBhZGRyZXNzIGZvciB0aGlzIGRldmljZS4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIEludGVycnVwdHMgYXJlIGVuYWJsZWQgYXQgdGhlIGFkYXB0ZXIgYnVzLXNwZWNpZmljIGxvZ2ljLgorICogICBOb3RlOiAgSW50ZXJydXB0cyBhdCB0aGUgRE1BIGVuZ2luZSAoUERRIGNoaXApIGFyZSBub3QKKyAqICAgZW5hYmxlZCB5ZXQuCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGRmeF9idXNfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCURGWF9ib2FyZF90ICpicCA9IGRldi0+cHJpdjsKKwl1OAkJCXZhbDsJLyogdXNlZCBmb3IgSS9PIHJlYWQvd3JpdGVzICovCisKKwlEQkdfcHJpbnRrKCJJbiBkZnhfYnVzX2luaXQuLi5cbiIpOworCisJLyoKKwkgKiBJbml0aWFsaXplIGJhc2UgSS9PIGFkZHJlc3MgZmllbGQgaW4gYnAgc3RydWN0dXJlCisJICoKKwkgKiBOb3RlOiBicC0+YmFzZV9hZGRyIGlzIHRoZSBzYW1lIGFzIGRldi0+YmFzZV9hZGRyLgorCSAqCQkgSXQncyB1c2VmdWwgYmVjYXVzZSBvZnRlbiB3ZSdsbCBuZWVkIHRvIHJlYWQKKwkgKgkJIG9yIHdyaXRlIHJlZ2lzdGVycyB3aGVyZSB3ZSBhbHJlYWR5IGhhdmUgdGhlCisJICoJCSBicCBwb2ludGVyIGluc3RlYWQgb2YgdGhlIGRldiBwb2ludGVyLiAgSGF2aW5nCisJICoJCSB0aGUgYmFzZSBhZGRyZXNzIGluIHRoZSBicCBzdHJ1Y3R1cmUgd2lsbAorCSAqCQkgc2F2ZSBhIHBvaW50ZXIgZGVyZWZlcmVuY2UuCisJICoKKwkgKgkJIElNUE9SVEFOVCEhIFRoaXMgZmllbGQgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZQorCSAqCQkgYW55IG9mIHRoZSBkZnhfcG9ydF8qIGlubGluZSBmdW5jdGlvbnMgYXJlCisJICoJCSBjYWxsZWQuCisJICovCisKKwlicC0+YmFzZV9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwkvKiBBbmQgYSBwb2ludGVyIGJhY2sgdG8gdGhlIG5ldF9kZXZpY2Ugc3RydWN0ICovCisJYnAtPmRldiA9IGRldjsKKworCS8qIEluaXRpYWxpemUgYWRhcHRlciBiYXNlZCBvbiBidXMgdHlwZSAqLworCisJaWYgKGJwLT5idXNfdHlwZSA9PSBERlhfQlVTX1RZUEVfRUlTQSkKKwkJeworCQkvKiBHZXQgdGhlIGludGVycnVwdCBsZXZlbCBmcm9tIHRoZSBFU0lDIGNoaXAgKi8KKworCQlkZnhfcG9ydF9yZWFkX2J5dGUoYnAsIFBJX0VTSUNfS19JT19DT05GSUdfU1RBVF8wLCAmdmFsKTsKKwkJc3dpdGNoICgodmFsICYgUElfQ09ORklHX1NUQVRfMF9NX0lSUSkgPj4gUElfQ09ORklHX1NUQVRfMF9WX0lSUSkKKwkJCXsKKwkJCWNhc2UgUElfQ09ORklHX1NUQVRfMF9JUlFfS185OgorCQkJCWRldi0+aXJxID0gOTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBQSV9DT05GSUdfU1RBVF8wX0lSUV9LXzEwOgorCQkJCWRldi0+aXJxID0gMTA7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUElfQ09ORklHX1NUQVRfMF9JUlFfS18xMToKKwkJCQlkZXYtPmlycSA9IDExOworCQkJCWJyZWFrOworCisJCQljYXNlIFBJX0NPTkZJR19TVEFUXzBfSVJRX0tfMTU6CisJCQkJZGV2LT5pcnEgPSAxNTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkvKiBFbmFibGUgYWNjZXNzIHRvIEkvTyBvbiB0aGUgYm9hcmQgYnkgd3JpdGluZyAweDAzIHRvIEZ1bmN0aW9uIENvbnRyb2wgUmVnaXN0ZXIgKi8KKworCQlkZnhfcG9ydF93cml0ZV9ieXRlKGJwLCBQSV9FU0lDX0tfRlVOQ1RJT05fQ05UUkwsIFBJX0VTSUNfS19GVU5DVElPTl9DTlRSTF9JT19FTkIpOworCisJCS8qIFNldCB0aGUgSS9PIGRlY29kZSByYW5nZSBvZiB0aGUgYm9hcmQgKi8KKworCQl2YWwgPSAoKGRldi0+YmFzZV9hZGRyID4+IDEyKSA8PCBQSV9JT19DTVBfVl9TTE9UKTsKKwkJZGZ4X3BvcnRfd3JpdGVfYnl0ZShicCwgUElfRVNJQ19LX0lPX0NNUF8wXzEsIHZhbCk7CisJCWRmeF9wb3J0X3dyaXRlX2J5dGUoYnAsIFBJX0VTSUNfS19JT19DTVBfMV8xLCB2YWwpOworCisJCS8qIEVuYWJsZSBhY2Nlc3MgdG8gcmVzdCBvZiBtb2R1bGUgKGluY2x1ZGluZyBQRFEgYW5kIHBhY2tldCBtZW1vcnkpICovCisKKwkJZGZ4X3BvcnRfd3JpdGVfYnl0ZShicCwgUElfRVNJQ19LX1NMT1RfQ05UUkwsIFBJX1NMT1RfQ05UUkxfTV9FTkIpOworCisJCS8qCisJCSAqIE1hcCBQRFEgcmVnaXN0ZXJzIGludG8gSS9PIHNwYWNlLiAgVGhpcyBpcyBkb25lIGJ5IGNsZWFyaW5nIGEgYml0CisJCSAqIGluIEJ1cnN0IEhvbGRvZmYgcmVnaXN0ZXIuCisJCSAqLworCisJCWRmeF9wb3J0X3JlYWRfYnl0ZShicCwgUElfRVNJQ19LX0JVUlNUX0hPTERPRkYsICZ2YWwpOworCQlkZnhfcG9ydF93cml0ZV9ieXRlKGJwLCBQSV9FU0lDX0tfQlVSU1RfSE9MRE9GRiwgKHZhbCAmIH5QSV9CVVJTVF9IT0xET0ZGX01fTUVNX01BUCkpOworCisJCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGF0IEVJU0EgYnVzIGludGVyZmFjZSBjaGlwIChFU0lDKSAqLworCisJCWRmeF9wb3J0X3JlYWRfYnl0ZShicCwgUElfRVNJQ19LX0lPX0NPTkZJR19TVEFUXzAsICZ2YWwpOworCQlkZnhfcG9ydF93cml0ZV9ieXRlKGJwLCBQSV9FU0lDX0tfSU9fQ09ORklHX1NUQVRfMCwgKHZhbCB8IFBJX0NPTkZJR19TVEFUXzBfTV9JTlRfRU5CKSk7CisJCX0KKwllbHNlCisJCXsKKwkJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBicC0+cGNpX2RldjsKKworCQkvKiBHZXQgdGhlIGludGVycnVwdCBsZXZlbCBmcm9tIHRoZSBQQ0kgQ29uZmlndXJhdGlvbiBUYWJsZSAqLworCisJCWRldi0+aXJxID0gcGRldi0+aXJxOworCisJCS8qIENoZWNrIExhdGVuY3kgVGltZXIgYW5kIHNldCBpZiBsZXNzIHRoYW4gbWluaW1hbCAqLworCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAmdmFsKTsKKwkJaWYgKHZhbCA8IFBGSV9LX0xBVF9USU1FUl9NSU4pCS8qIGlmIGxlc3MgdGhhbiBtaW4sIG92ZXJyaWRlIHdpdGggZGVmYXVsdCAqLworCQkJeworCQkJdmFsID0gUEZJX0tfTEFUX1RJTUVSX0RFRjsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgdmFsKTsKKwkJCX0KKworCQkvKiBFbmFibGUgaW50ZXJydXB0cyBhdCBQQ0kgYnVzIGludGVyZmFjZSBjaGlwIChQRkkpICovCisKKwkJZGZ4X3BvcnRfd3JpdGVfbG9uZyhicCwgUEZJX0tfUkVHX01PREVfQ1RSTCwgKFBGSV9NT0RFX01fUERRX0lOVF9FTkIgfCBQRklfTU9ERV9NX0RNQV9FTkIpKTsKKwkJfQorCX0KKworDAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PQorICogPSBkZnhfYnVzX2NvbmZpZ19jaGVjayA9CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgCisgKiBPdmVydmlldzoKKyAqICAgQ2hlY2tzIHRoZSBjb25maWd1cmF0aW9uIChidXJzdCBzaXplLCBmdWxsLWR1cGxleCwgZXRjLikgIElmIGFueSBwYXJhbWV0ZXJzCisgKiAgIGFyZSBpbGxlZ2FsLCB0aGVuIHRoaXMgcm91dGluZSB3aWxsIHNldCBuZXcgZGVmYXVsdHMuCisgKiAgCisgKiBSZXR1cm5zOgorICogICBOb25lCisgKiAgICAgICAKKyAqIEFyZ3VtZW50czoKKyAqICAgYnAgLSBwb2ludGVyIHRvIGJvYXJkIGluZm9ybWF0aW9uCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgRm9yIFJldmlzaW9uIDEgRkRESSBFSVNBLCBSZXZpc2lvbiAyIG9yIGxhdGVyIEZEREkgRUlTQSB3aXRoIHJldiBFIG9yIGxhdGVyCisgKiAgIFBEUSwgYW5kIGFsbCBGRERJIFBDSSBjb250cm9sbGVycywgYWxsIHZhbHVlcyBhcmUgbGVnYWwuCisgKgorICogUmV0dXJuIENvZGVzOgorICogICBOb25lCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIGRmeF9hZGFwX2luaXQgaGFzIE5PVCBiZWVuIGNhbGxlZCB5ZXQgc28gYnVyc3Qgc2l6ZSBhbmQgb3RoZXIgaXRlbXMgaGF2ZQorICogICBub3QgYmVlbiBzZXQuCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBOb25lCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGRmeF9idXNfY29uZmlnX2NoZWNrKERGWF9ib2FyZF90ICpicCkKK3sKKwlpbnQJc3RhdHVzOwkJCQkvKiByZXR1cm4gY29kZSBmcm9tIGFkYXB0ZXIgcG9ydCBjb250cm9sIGNhbGwgKi8KKwl1MzIJc2xvdF9pZDsJCQkvKiBFSVNBLWJ1cyBoYXJkd2FyZSBpZCAoREVDMzAwMSwgREVDMzAwMiwuLi4pICovCisJdTMyCWhvc3RfZGF0YTsJCQkvKiBMVyBkYXRhIHJldHVybmVkIGZyb20gcG9ydCBjb250cm9sIGNhbGwgKi8KKworCURCR19wcmludGsoIkluIGRmeF9idXNfY29uZmlnX2NoZWNrLi4uXG4iKTsKKworCS8qIENvbmZpZ3VyYXRpb24gY2hlY2sgb25seSB2YWxpZCBmb3IgRUlTQSBhZGFwdGVyICovCisKKwlpZiAoYnAtPmJ1c190eXBlID09IERGWF9CVVNfVFlQRV9FSVNBKQorCQl7CisJCWRmeF9wb3J0X3JlYWRfbG9uZyhicCwgUElfRVNJQ19LX1NMT1RfSUQsICZzbG90X2lkKTsKKworCQkvKgorCQkgKiBGaXJzdCBjaGVjayBpZiByZXZpc2lvbiAyIEVJU0EgY29udHJvbGxlci4gIFJldi4gMSBjYXJkcyB1c2VkCisJCSAqIFBEUSByZXZpc2lvbiBCLCBzbyBubyB3b3JrYXJvdW5kIG5lZWRlZCBpbiB0aGlzIGNhc2UuICBSZXYuIDMKKwkJICogY2FyZHMgdXNlZCBQRFEgcmV2aXNpb24gRSwgc28gbm8gd29ya2Fyb3VuZCBuZWVkZWQgaW4gdGhpcworCQkgKiBjYXNlLCBlaXRoZXIuICBPbmx5IFJldi4gMiBjYXJkcyB1c2VkIGVpdGhlciBSZXYuIEQgb3IgRQorCQkgKiBjaGlwcywgc28gd2UgbXVzdCB2ZXJpZnkgdGhlIGNoaXAgcmV2aXNpb24gb24gUmV2LiAyIGNhcmRzLgorCQkgKi8KKworCQlpZiAoc2xvdF9pZCA9PSBERUZFQV9QUk9EX0lEXzIpCisJCQl7CisJCQkvKgorCQkJICogUmV2aXNpb24gMiBGRERJIEVJU0EgY29udHJvbGxlciBmb3VuZCwgc28gbGV0J3MgY2hlY2sgUERRCisJCQkgKiByZXZpc2lvbiBvZiBhZGFwdGVyLgorCQkJICovCisKKwkJCXN0YXR1cyA9IGRmeF9od19wb3J0X2N0cmxfcmVxKGJwLAorCQkJCQkJCQkJCQlQSV9QQ1RSTF9NX1NVQl9DTUQsCisJCQkJCQkJCQkJCVBJX1NVQl9DTURfS19QRFFfUkVWX0dFVCwKKwkJCQkJCQkJCQkJMCwKKwkJCQkJCQkJCQkJJmhvc3RfZGF0YSk7CisJCQlpZiAoKHN0YXR1cyAhPSBERlhfS19TVUNDRVNTKSB8fCAoaG9zdF9kYXRhID09IDIpKQorCQkJCXsKKwkJCQkvKgorCQkJCSAqIEVpdGhlciB3ZSBjb3VsZG4ndCBkZXRlcm1pbmUgdGhlIFBEUSByZXZpc2lvbiwgb3IKKwkJCQkgKiB3ZSBkZXRlcm1pbmVkIHRoYXQgaXQgaXMgYXQgcmV2aXNpb24gRC4gIEluIGVpdGhlciBjYXNlLAorCQkJCSAqIHdlIG5lZWQgdG8gaW1wbGVtZW50IHRoZSB3b3JrYXJvdW5kLgorCQkJCSAqLworCisJCQkJLyogRW5zdXJlIHRoYXQgdGhlIGJ1cnN0IHNpemUgaXMgc2V0IHRvIDggbG9uZ3dvcmRzIG9yIGxlc3MgKi8KKworCQkJCXN3aXRjaCAoYnAtPmJ1cnN0X3NpemUpCisJCQkJCXsKKwkJCQkJY2FzZSBQSV9QREFUQV9CX0RNQV9CVVJTVF9TSVpFXzMyOgorCQkJCQljYXNlIFBJX1BEQVRBX0JfRE1BX0JVUlNUX1NJWkVfMTY6CisJCQkJCQlicC0+YnVyc3Rfc2l6ZSA9IFBJX1BEQVRBX0JfRE1BX0JVUlNUX1NJWkVfODsKKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJLyogRW5zdXJlIHRoYXQgZnVsbC1kdXBsZXggbW9kZSBpcyBub3QgZW5hYmxlZCAqLworCisJCQkJYnAtPmZ1bGxfZHVwbGV4X2VuYiA9IFBJX1NOTVBfS19GQUxTRTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwwKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09CisgKiA9IGRmeF9kcml2ZXJfaW5pdCA9CisgKiA9PT09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIEluaXRpYWxpemVzIHJlbWFpbmluZyBhZGFwdGVyIGJvYXJkIHN0cnVjdHVyZSBpbmZvcm1hdGlvbgorICogICBhbmQgbWFrZXMgc3VyZSBhZGFwdGVyIGlzIGluIGEgc2FmZSBzdGF0ZSBwcmlvciB0byBkZnhfb3BlbigpLgorICogIAorICogUmV0dXJuczoKKyAqICAgQ29uZGl0aW9uIGNvZGUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBkZXYgLSBwb2ludGVyIHRvIGRldmljZSBpbmZvcm1hdGlvbgorICogICBwcmludF9uYW1lIC0gcHJpbnRhYmxlIGRldmljZSBuYW1lCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYWRkaXRpb25hbCByZXNvdXJjZXMgc3VjaCBhcyB0aGUgaG9zdCBtZW1vcnkKKyAqICAgYmxvY2tzIG5lZWRlZCBieSB0aGUgYWRhcHRlciAoZWcuIGRlc2NyaXB0b3IgYW5kIGNvbnN1bWVyIGJsb2NrcykuCisgKgkgUmVtYWluaW5nIGJ1cyBpbml0aWFsaXphdGlvbiBzdGVwcyBhcmUgYWxzbyBjb21wbGV0ZWQuICBUaGUgYWRhcHRlcgorICogICBpcyBhbHNvIHJlc2V0IHNvIHRoYXQgaXQgaXMgaW4gdGhlIERNQV9VTkFWQUlMQUJMRSBzdGF0ZS4gIFRoZSBPUworICogICBtdXN0IGNhbGwgZGZ4X29wZW4oKSB0byBvcGVuIHRoZSBhZGFwdGVyIGFuZCBicmluZyBpdCBvbi1saW5lLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgREZYX0tfU1VDQ0VTUwktIGluaXRpYWxpemF0aW9uIHN1Y2NlZWRlZAorICogICBERlhfS19GQUlMVVJFCS0gaW5pdGlhbGl6YXRpb24gZmFpbGVkIC0gY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeQorICoJCQkJCQlvciByZWFkIGFkYXB0ZXIgTUFDIGFkZHJlc3MKKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqICAgTWVtb3J5IGFsbG9jYXRlZCBmcm9tIHBjaV9hbGxvY19jb25zaXN0ZW50KCkgY2FsbCBpcyBwaHlzaWNhbGx5CisgKiAgIGNvbnRpZ3VvdXMsIGxvY2tlZCBtZW1vcnkuCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBBZGFwdGVyIGlzIHJlc2V0IGFuZCBzaG91bGQgYmUgaW4gRE1BX1VOQVZBSUxBQkxFIHN0YXRlIGJlZm9yZQorICogICByZXR1cm5pbmcgZnJvbSB0aGlzIHJvdXRpbmUuCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgZGZ4X2RyaXZlcl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICBjb25zdCBjaGFyICpwcmludF9uYW1lKQoreworCURGWF9ib2FyZF90ICpicCA9IGRldi0+cHJpdjsKKwlpbnQJCQlhbGxvY19zaXplOwkJCS8qIHRvdGFsIGJ1ZmZlciBzaXplIG5lZWRlZCAqLworCWNoYXIJCSp0b3BfdiwgKmN1cnJfdjsJLyogdmlydHVhbCBhZGRycyBpbnRvIG1lbW9yeSBibG9jayAqLworCWRtYV9hZGRyX3QJCXRvcF9wLCBjdXJyX3A7CQkvKiBwaHlzaWNhbCBhZGRycyBpbnRvIG1lbW9yeSBibG9jayAqLworCXUzMgkJCWRhdGE7CQkJCS8qIGhvc3QgZGF0YSByZWdpc3RlciB2YWx1ZSAqLworCisJREJHX3ByaW50aygiSW4gZGZ4X2RyaXZlcl9pbml0Li4uXG4iKTsKKworCS8qIEluaXRpYWxpemUgYnVzLXNwZWNpZmljIGhhcmR3YXJlIHJlZ2lzdGVycyAqLworCisJZGZ4X2J1c19pbml0KGRldik7CisKKwkvKgorCSAqIEluaXRpYWxpemUgZGVmYXVsdCB2YWx1ZXMgZm9yIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzCisJICoKKwkgKiBOb3RlOiBBbGwgb2YgdGhlc2UgcGFyYW1ldGVycyBhcmUgb25lcyB0aGF0IGEgdXNlciBtYXkKKwkgKiAgICAgICB3YW50IHRvIGN1c3RvbWl6ZS4gIEl0J2QgYmUgbmljZSB0byBicmVhayB0aGVzZQorCSAqCQkgb3V0IGludG8gU3BhY2UuYyBvciBzb21lcGxhY2UgZWxzZSB0aGF0J3MgbW9yZQorCSAqCQkgYWNjZXNzaWJsZS91bmRlcnN0YW5kYWJsZSB0aGFuIHRoaXMgZmlsZS4KKwkgKi8KKworCWJwLT5mdWxsX2R1cGxleF9lbmIJCT0gUElfU05NUF9LX0ZBTFNFOworCWJwLT5yZXFfdHRydAkJCT0gOCAqIDEyNTAwOwkJLyogOG1zIGluIDgwIG5hbm9zZWMgdW5pdHMgKi8KKwlicC0+YnVyc3Rfc2l6ZQkJCT0gUElfUERBVEFfQl9ETUFfQlVSU1RfU0laRV9ERUY7CisJYnAtPnJjdl9idWZzX3RvX3Bvc3QJPSBSQ1ZfQlVGU19ERUY7CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IEhXIGNvbmZpZ3VyYXRpb24gaXMgT0sKKwkgKgorCSAqIE5vdGU6IERlcGVuZGluZyBvbiB0aGUgaGFyZHdhcmUgcmV2aXNpb24sIHdlIG1heSBuZWVkIHRvIG1vZGlmeQorCSAqICAgICAgIHNvbWUgb2YgdGhlIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzIHRvIHdvcmthcm91bmQgaGFyZHdhcmUKKwkgKiAgICAgICBsaW1pdGF0aW9ucy4gIFdlJ2xsIHBlcmZvcm0gdGhpcyBjb25maWd1cmF0aW9uIGNoZWNrIEFGVEVSCisJICogICAgICAgc2V0dGluZyB0aGUgcGFyYW1ldGVycyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKwkgKi8KKworCWRmeF9idXNfY29uZmlnX2NoZWNrKGJwKTsKKworCS8qIERpc2FibGUgUERRIGludGVycnVwdHMgZmlyc3QgKi8KKworCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19IT1NUX0lOVF9FTkIsIFBJX0hPU1RfSU5UX0tfRElTQUJMRV9BTExfSU5UUyk7CisKKwkvKiBQbGFjZSBhZGFwdGVyIGluIERNQV9VTkFWQUlMQUJMRSBzdGF0ZSBieSByZXNldHRpbmcgYWRhcHRlciAqLworCisJKHZvaWQpIGRmeF9od19kbWFfdW5pbml0KGJwLCBQSV9QREFUQV9BX1JFU0VUX01fU0tJUF9TVCk7CisKKwkvKiAgUmVhZCB0aGUgZmFjdG9yeSBNQUMgYWRkcmVzcyBmcm9tIHRoZSBhZGFwdGVyIHRoZW4gc2F2ZSBpdCAqLworCisJaWYgKGRmeF9od19wb3J0X2N0cmxfcmVxKGJwLCBQSV9QQ1RSTF9NX01MQSwgUElfUERBVEFfQV9NTEFfS19MTywgMCwKKwkJCQkgJmRhdGEpICE9IERGWF9LX1NVQ0NFU1MpIHsKKwkJcHJpbnRrKCIlczogQ291bGQgbm90IHJlYWQgYWRhcHRlciBmYWN0b3J5IE1BQyBhZGRyZXNzIVxuIiwKKwkJICAgICAgIHByaW50X25hbWUpOworCQlyZXR1cm4oREZYX0tfRkFJTFVSRSk7CisJfQorCW1lbWNweSgmYnAtPmZhY3RvcnlfbWFjX2FkZHJbMF0sICZkYXRhLCBzaXplb2YodTMyKSk7CisKKwlpZiAoZGZ4X2h3X3BvcnRfY3RybF9yZXEoYnAsIFBJX1BDVFJMX01fTUxBLCBQSV9QREFUQV9BX01MQV9LX0hJLCAwLAorCQkJCSAmZGF0YSkgIT0gREZYX0tfU1VDQ0VTUykgeworCQlwcmludGsoIiVzOiBDb3VsZCBub3QgcmVhZCBhZGFwdGVyIGZhY3RvcnkgTUFDIGFkZHJlc3MhXG4iLAorCQkgICAgICAgcHJpbnRfbmFtZSk7CisJCXJldHVybihERlhfS19GQUlMVVJFKTsKKwl9CisJbWVtY3B5KCZicC0+ZmFjdG9yeV9tYWNfYWRkcls0XSwgJmRhdGEsIHNpemVvZih1MTYpKTsKKworCS8qCisJICogU2V0IGN1cnJlbnQgYWRkcmVzcyB0byBmYWN0b3J5IGFkZHJlc3MKKwkgKgorCSAqIE5vdGU6IE5vZGUgYWRkcmVzcyBvdmVycmlkZSBzdXBwb3J0IGlzIGhhbmRsZWQgdGhyb3VnaAorCSAqICAgICAgIGRmeF9jdGxfc2V0X21hY19hZGRyZXNzLgorCSAqLworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGJwLT5mYWN0b3J5X21hY19hZGRyLCBGRERJX0tfQUxFTik7CisJaWYgKGJwLT5idXNfdHlwZSA9PSBERlhfQlVTX1RZUEVfRUlTQSkKKwkJcHJpbnRrKCIlczogREVGRUEgYXQgSS9PIGFkZHIgPSAweCVsWCwgSVJRID0gJWQsICIKKwkJICAgICAgICJIYXJkd2FyZSBhZGRyID0gJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlhcbiIsCisJCSAgICAgICBwcmludF9uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEsCisJCSAgICAgICBkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLAorCQkgICAgICAgZGV2LT5kZXZfYWRkclsyXSwgZGV2LT5kZXZfYWRkclszXSwKKwkJICAgICAgIGRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0pOworCWVsc2UKKwkJcHJpbnRrKCIlczogREVGUEEgYXQgSS9PIGFkZHIgPSAweCVsWCwgSVJRID0gJWQsICIKKwkJICAgICAgICJIYXJkd2FyZSBhZGRyID0gJTAyWC0lMDJYLSUwMlgtJTAyWC0lMDJYLSUwMlhcbiIsCisJCSAgICAgICBwcmludF9uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEsCisJCSAgICAgICBkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLAorCQkgICAgICAgZGV2LT5kZXZfYWRkclsyXSwgZGV2LT5kZXZfYWRkclszXSwKKwkJICAgICAgIGRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0pOworCisJLyoKKwkgKiBHZXQgbWVtb3J5IGZvciBkZXNjcmlwdG9yIGJsb2NrLCBjb25zdW1lciBibG9jaywgYW5kIG90aGVyIGJ1ZmZlcnMKKwkgKiB0aGF0IG5lZWQgdG8gYmUgRE1BIHJlYWQgb3Igd3JpdHRlbiB0byBieSB0aGUgYWRhcHRlci4KKwkgKi8KKworCWFsbG9jX3NpemUgPSBzaXplb2YoUElfREVTQ1JfQkxPQ0spICsKKwkJCQkJUElfQ01EX1JFUV9LX1NJWkVfTUFYICsKKwkJCQkJUElfQ01EX1JTUF9LX1NJWkVfTUFYICsKKyNpZm5kZWYgRFlOQU1JQ19CVUZGRVJTCisJCQkJCShicC0+cmN2X2J1ZnNfdG9fcG9zdCAqIFBJX1JDVl9EQVRBX0tfU0laRV9NQVgpICsKKyNlbmRpZgorCQkJCQlzaXplb2YoUElfQ09OU1VNRVJfQkxPQ0spICsKKwkJCQkJKFBJX0FMSUdOX0tfREVTQ19CTEsgLSAxKTsKKwlicC0+a21hbGxvY2VkID0gdG9wX3YgPSBwY2lfYWxsb2NfY29uc2lzdGVudChicC0+cGNpX2RldiwgYWxsb2Nfc2l6ZSwKKwkJCQkJCSAgICAgJmJwLT5rbWFsbG9jZWRfZG1hKTsKKwlpZiAodG9wX3YgPT0gTlVMTCkgeworCQlwcmludGsoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBob3N0IGJ1ZmZlcnMgIgorCQkgICAgICAgImFuZCBzdHJ1Y3R1cmVzIVxuIiwgcHJpbnRfbmFtZSk7CisJCXJldHVybihERlhfS19GQUlMVVJFKTsKKwl9CisJbWVtc2V0KHRvcF92LCAwLCBhbGxvY19zaXplKTsJLyogemVybyBvdXQgbWVtb3J5IGJlZm9yZSBjb250aW51aW5nICovCisJdG9wX3AgPSBicC0+a21hbGxvY2VkX2RtYTsJLyogZ2V0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgYnVmZmVyICovCisKKwkvKgorCSAqICBUbyBndWFyYW50ZWUgdGhlIDhLIGFsaWdubWVudCByZXF1aXJlZCBmb3IgdGhlIGRlc2NyaXB0b3IgYmxvY2ssIDhLIC0gMQorCSAqICBwbHVzIHRoZSBhbW91bnQgb2YgbWVtb3J5IG5lZWRlZCB3YXMgYWxsb2NhdGVkLiAgVGhlIHBoeXNpY2FsIGFkZHJlc3MKKwkgKglpcyBub3cgOEsgYWxpZ25lZC4gIEJ5IGNhcnZpbmcgdXAgdGhlIG1lbW9yeSBpbiBhIHNwZWNpZmljIG9yZGVyLAorCSAqICB3ZSdsbCBndWFyYW50ZWUgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudHMgZm9yIGFsbCBvdGhlciBzdHJ1Y3R1cmVzLgorCSAqCisJICogIE5vdGU6IElmIHRoZSBhc3N1bXB0aW9ucyBjaGFuZ2UgcmVnYXJkaW5nIHRoZSBub24tcGFnZWQsIG5vbi1jYWNoZWQsCisJICoJCSAgcGh5c2ljYWxseSBjb250aWd1b3VzIG5hdHVyZSBvZiB0aGUgbWVtb3J5IGJsb2NrIG9yIHRoZSBhZGRyZXNzCisJICoJCSAgYWxpZ25tZW50cywgdGhlbiB3ZSdsbCBuZWVkIHRvIGltcGxlbWVudCBhIGRpZmZlcmVudCBhbGdvcml0aG0KKwkgKgkJICBmb3IgYWxsb2NhdGluZyB0aGUgbmVlZGVkIG1lbW9yeS4KKwkgKi8KKworCWN1cnJfcCA9IEFMSUdOKHRvcF9wLCBQSV9BTElHTl9LX0RFU0NfQkxLKTsKKwljdXJyX3YgPSB0b3BfdiArIChjdXJyX3AgLSB0b3BfcCk7CisKKwkvKiBSZXNlcnZlIHNwYWNlIGZvciBkZXNjcmlwdG9yIGJsb2NrICovCisKKwlicC0+ZGVzY3JfYmxvY2tfdmlydCA9IChQSV9ERVNDUl9CTE9DSyAqKSBjdXJyX3Y7CisJYnAtPmRlc2NyX2Jsb2NrX3BoeXMgPSBjdXJyX3A7CisJY3Vycl92ICs9IHNpemVvZihQSV9ERVNDUl9CTE9DSyk7CisJY3Vycl9wICs9IHNpemVvZihQSV9ERVNDUl9CTE9DSyk7CisKKwkvKiBSZXNlcnZlIHNwYWNlIGZvciBjb21tYW5kIHJlcXVlc3QgYnVmZmVyICovCisKKwlicC0+Y21kX3JlcV92aXJ0ID0gKFBJX0RNQV9DTURfUkVRICopIGN1cnJfdjsKKwlicC0+Y21kX3JlcV9waHlzID0gY3Vycl9wOworCWN1cnJfdiArPSBQSV9DTURfUkVRX0tfU0laRV9NQVg7CisJY3Vycl9wICs9IFBJX0NNRF9SRVFfS19TSVpFX01BWDsKKworCS8qIFJlc2VydmUgc3BhY2UgZm9yIGNvbW1hbmQgcmVzcG9uc2UgYnVmZmVyICovCisKKwlicC0+Y21kX3JzcF92aXJ0ID0gKFBJX0RNQV9DTURfUlNQICopIGN1cnJfdjsKKwlicC0+Y21kX3JzcF9waHlzID0gY3Vycl9wOworCWN1cnJfdiArPSBQSV9DTURfUlNQX0tfU0laRV9NQVg7CisJY3Vycl9wICs9IFBJX0NNRF9SU1BfS19TSVpFX01BWDsKKworCS8qIFJlc2VydmUgc3BhY2UgZm9yIHRoZSBMTEMgaG9zdCByZWNlaXZlIHF1ZXVlIGJ1ZmZlcnMgKi8KKworCWJwLT5yY3ZfYmxvY2tfdmlydCA9IGN1cnJfdjsKKwlicC0+cmN2X2Jsb2NrX3BoeXMgPSBjdXJyX3A7CisKKyNpZm5kZWYgRFlOQU1JQ19CVUZGRVJTCisJY3Vycl92ICs9IChicC0+cmN2X2J1ZnNfdG9fcG9zdCAqIFBJX1JDVl9EQVRBX0tfU0laRV9NQVgpOworCWN1cnJfcCArPSAoYnAtPnJjdl9idWZzX3RvX3Bvc3QgKiBQSV9SQ1ZfREFUQV9LX1NJWkVfTUFYKTsKKyNlbmRpZgorCisJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIGNvbnN1bWVyIGJsb2NrICovCisKKwlicC0+Y29uc19ibG9ja192aXJ0ID0gKFBJX0NPTlNVTUVSX0JMT0NLICopIGN1cnJfdjsKKwlicC0+Y29uc19ibG9ja19waHlzID0gY3Vycl9wOworCisJLyogRGlzcGxheSB2aXJ0dWFsIGFuZCBwaHlzaWNhbCBhZGRyZXNzZXMgaWYgZGVidWcgZHJpdmVyICovCisKKwlEQkdfcHJpbnRrKCIlczogRGVzY3JpcHRvciBibG9jayB2aXJ0ID0gJTBsWCwgcGh5cyA9ICUwWFxuIiwKKwkJICAgcHJpbnRfbmFtZSwKKwkJICAgKGxvbmcpYnAtPmRlc2NyX2Jsb2NrX3ZpcnQsIGJwLT5kZXNjcl9ibG9ja19waHlzKTsKKwlEQkdfcHJpbnRrKCIlczogQ29tbWFuZCBSZXF1ZXN0IGJ1ZmZlciB2aXJ0ID0gJTBsWCwgcGh5cyA9ICUwWFxuIiwKKwkJICAgcHJpbnRfbmFtZSwgKGxvbmcpYnAtPmNtZF9yZXFfdmlydCwgYnAtPmNtZF9yZXFfcGh5cyk7CisJREJHX3ByaW50aygiJXM6IENvbW1hbmQgUmVzcG9uc2UgYnVmZmVyIHZpcnQgPSAlMGxYLCBwaHlzID0gJTBYXG4iLAorCQkgICBwcmludF9uYW1lLCAobG9uZylicC0+Y21kX3JzcF92aXJ0LCBicC0+Y21kX3JzcF9waHlzKTsKKwlEQkdfcHJpbnRrKCIlczogUmVjZWl2ZSBidWZmZXIgYmxvY2sgdmlydCA9ICUwbFgsIHBoeXMgPSAlMFhcbiIsCisJCSAgIHByaW50X25hbWUsIChsb25nKWJwLT5yY3ZfYmxvY2tfdmlydCwgYnAtPnJjdl9ibG9ja19waHlzKTsKKwlEQkdfcHJpbnRrKCIlczogQ29uc3VtZXIgYmxvY2sgdmlydCA9ICUwbFgsIHBoeXMgPSAlMFhcbiIsCisJCSAgIHByaW50X25hbWUsIChsb25nKWJwLT5jb25zX2Jsb2NrX3ZpcnQsIGJwLT5jb25zX2Jsb2NrX3BoeXMpOworCisJcmV0dXJuKERGWF9LX1NVQ0NFU1MpOworfQorCisMCisvKgorICogPT09PT09PT09PT09PT09PT0KKyAqID0gZGZ4X2FkYXBfaW5pdCA9CisgKiA9PT09PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBCcmluZ3MgdGhlIGFkYXB0ZXIgdG8gdGhlIGxpbmsgYXZhaWwvbGluayB1bmF2YWlsYWJsZSBzdGF0ZS4KKyAqICAKKyAqIFJldHVybnM6CisgKiAgIENvbmRpdGlvbiBjb2RlCisgKiAgICAgICAKKyAqIEFyZ3VtZW50czoKKyAqICAgYnAgLSBwb2ludGVyIHRvIGJvYXJkIGluZm9ybWF0aW9uCisgKiAgIGdldF9idWZmZXJzIC0gbm9uLXplcm8gaWYgYnVmZmVycyB0byBiZSBhbGxvY2F0ZWQKKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBJc3N1ZXMgdGhlIGxvdy1sZXZlbCBmaXJtd2FyZS9oYXJkd2FyZSBjYWxscyBuZWNlc3NhcnkgdG8gYnJpbmcKKyAqICAgdGhlIGFkYXB0ZXIgdXAsIG9yIHRvIHByb3Blcmx5IHJlc2V0IGFuZCByZXN0b3JlIGFkYXB0ZXIgZHVyaW5nCisgKiAgIHJ1bi10aW1lLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgREZYX0tfU1VDQ0VTUyAtIEFkYXB0ZXIgYnJvdWdodCB1cCBzdWNjZXNzZnVsbHkKKyAqICAgREZYX0tfRkFJTFVSRSAtIEFkYXB0ZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIGJwLT5yZXNldF90eXBlIHNob3VsZCBiZSBzZXQgdG8gYSB2YWxpZCByZXNldCB0eXBlIHZhbHVlIGJlZm9yZQorICogICBjYWxsaW5nIHRoaXMgcm91dGluZS4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIEFkYXB0ZXIgc2hvdWxkIGJlIGluIExJTktfQVZBSUxBQkxFIG9yIExJTktfVU5BVkFJTEFCTEUgc3RhdGUKKyAqICAgdXBvbiBhIHN1Y2Nlc3NmdWwgcmV0dXJuIG9mIHRoaXMgcm91dGluZS4KKyAqLworCitzdGF0aWMgaW50IGRmeF9hZGFwX2luaXQoREZYX2JvYXJkX3QgKmJwLCBpbnQgZ2V0X2J1ZmZlcnMpCisJeworCURCR19wcmludGsoIkluIGRmeF9hZGFwX2luaXQuLi5cbiIpOworCisJLyogRGlzYWJsZSBQRFEgaW50ZXJydXB0cyBmaXJzdCAqLworCisJZGZ4X3BvcnRfd3JpdGVfbG9uZyhicCwgUElfUERRX0tfUkVHX0hPU1RfSU5UX0VOQiwgUElfSE9TVF9JTlRfS19ESVNBQkxFX0FMTF9JTlRTKTsKKworCS8qIFBsYWNlIGFkYXB0ZXIgaW4gRE1BX1VOQVZBSUxBQkxFIHN0YXRlIGJ5IHJlc2V0dGluZyBhZGFwdGVyICovCisKKwlpZiAoZGZ4X2h3X2RtYV91bmluaXQoYnAsIGJwLT5yZXNldF90eXBlKSAhPSBERlhfS19TVUNDRVNTKQorCQl7CisJCXByaW50aygiJXM6IENvdWxkIG5vdCB1bmluaXRpYWxpemUvcmVzZXQgYWRhcHRlciFcbiIsIGJwLT5kZXYtPm5hbWUpOworCQlyZXR1cm4oREZYX0tfRkFJTFVSRSk7CisJCX0KKworCS8qCisJICogV2hlbiB0aGUgUERRIGlzIHJlc2V0LCBzb21lIGZhbHNlIFR5cGUgMCBpbnRlcnJ1cHRzIG1heSBiZSBwZW5kaW5nLAorCSAqIHNvIHdlJ2xsIGFja25vd2xlZGdlIGFsbCBUeXBlIDAgaW50ZXJydXB0cyBub3cgYmVmb3JlIGNvbnRpbnVpbmcuCisJICovCisKKwlkZnhfcG9ydF93cml0ZV9sb25nKGJwLCBQSV9QRFFfS19SRUdfVFlQRV8wX1NUQVRVUywgUElfSE9TVF9JTlRfS19BQ0tfQUxMX1RZUEVfMCk7CisKKwkvKgorCSAqIENsZWFyIFR5cGUgMSBhbmQgVHlwZSAyIHJlZ2lzdGVycyBiZWZvcmUgZ29pbmcgdG8gRE1BX0FWQUlMQUJMRSBzdGF0ZQorCSAqCisJICogTm90ZTogV2Ugb25seSBuZWVkIHRvIGNsZWFyIGhvc3QgY29waWVzIG9mIHRoZXNlIHJlZ2lzdGVycy4gIFRoZSBQRFEgcmVzZXQKKwkgKiAgICAgICB0YWtlcyBjYXJlIG9mIHRoZSBvbi1ib2FyZCByZWdpc3RlciB2YWx1ZXMuCisJICovCisKKwlicC0+Y21kX3JlcV9yZWcubHdvcmQJPSAwOworCWJwLT5jbWRfcnNwX3JlZy5sd29yZAk9IDA7CisJYnAtPnJjdl94bXRfcmVnLmx3b3JkCT0gMDsKKworCS8qIENsZWFyIGNvbnN1bWVyIGJsb2NrIGJlZm9yZSBnb2luZyB0byBETUFfQVZBSUxBQkxFIHN0YXRlICovCisKKwltZW1zZXQoYnAtPmNvbnNfYmxvY2tfdmlydCwgMCwgc2l6ZW9mKFBJX0NPTlNVTUVSX0JMT0NLKSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBETUEgQnVyc3QgU2l6ZSAqLworCisJaWYgKGRmeF9od19wb3J0X2N0cmxfcmVxKGJwLAorCQkJCQkJCVBJX1BDVFJMX01fU1VCX0NNRCwKKwkJCQkJCQlQSV9TVUJfQ01EX0tfQlVSU1RfU0laRV9TRVQsCisJCQkJCQkJYnAtPmJ1cnN0X3NpemUsCisJCQkJCQkJTlVMTCkgIT0gREZYX0tfU1VDQ0VTUykKKwkJeworCQlwcmludGsoIiVzOiBDb3VsZCBub3Qgc2V0IGFkYXB0ZXIgYnVyc3Qgc2l6ZSFcbiIsIGJwLT5kZXYtPm5hbWUpOworCQlyZXR1cm4oREZYX0tfRkFJTFVSRSk7CisJCX0KKworCS8qCisJICogU2V0IGJhc2UgYWRkcmVzcyBvZiBDb25zdW1lciBCbG9jaworCSAqCisJICogQXNzdW1wdGlvbjogMzItYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgY29uc3VtZXIgYmxvY2sgaXMgNjQgYnl0ZQorCSAqCQkJICAgYWxpZ25lZC4gIFRoYXQgaXMsIGJpdHMgMC01IG9mIHRoZSBhZGRyZXNzIG11c3QgYmUgemVyby4KKwkgKi8KKworCWlmIChkZnhfaHdfcG9ydF9jdHJsX3JlcShicCwKKwkJCQkJCQlQSV9QQ1RSTF9NX0NPTlNfQkxPQ0ssCisJCQkJCQkJYnAtPmNvbnNfYmxvY2tfcGh5cywKKwkJCQkJCQkwLAorCQkJCQkJCU5VTEwpICE9IERGWF9LX1NVQ0NFU1MpCisJCXsKKwkJcHJpbnRrKCIlczogQ291bGQgbm90IHNldCBjb25zdW1lciBibG9jayBhZGRyZXNzIVxuIiwgYnAtPmRldi0+bmFtZSk7CisJCXJldHVybihERlhfS19GQUlMVVJFKTsKKwkJfQorCisJLyoKKwkgKiBTZXQgYmFzZSBhZGRyZXNzIG9mIERlc2NyaXB0b3IgQmxvY2sgYW5kIGJyaW5nIGFkYXB0ZXIgdG8gRE1BX0FWQUlMQUJMRSBzdGF0ZQorCSAqCisJICogTm90ZTogV2UgYWxzbyBzZXQgdGhlIGxpdGVyYWwgYW5kIGRhdGEgc3dhcHBpbmcgcmVxdWlyZW1lbnRzIGluIHRoaXMKKwkgKgkgICAgIGNvbW1hbmQuICBTaW5jZSB0aGlzIGRyaXZlciBwcmVzZW50bHkgcnVucyBvbiBJbnRlbCBwbGF0Zm9ybXMKKwkgKgkJIHdoaWNoIGFyZSBMaXR0bGUgRW5kaWFuLCB3ZSdsbCB0ZWxsIHRoZSBhZGFwdGVyIHRvIGJ5dGUgc3dhcAorCSAqCQkgZGF0YSBvbmx5LiAgVGhpcyBjb2RlIHdpbGwgbmVlZCB0byBjaGFuZ2Ugd2hlbiB3ZSBzdXBwb3J0CisJICoJCSBCaWcgRW5kaWFuIHN5c3RlbXMgKGVnLiBQb3dlclBDKS4KKwkgKgorCSAqIEFzc3VtcHRpb246IDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIGRlc2NyaXB0b3IgYmxvY2sgaXMgOEtieXRlCisJICogICAgICAgICAgICAgYWxpZ25lZC4gIFRoYXQgaXMsIGJpdHMgMC0xMiBvZiB0aGUgYWRkcmVzcyBtdXN0IGJlIHplcm8uCisJICovCisKKwlpZiAoZGZ4X2h3X3BvcnRfY3RybF9yZXEoYnAsCisJCQkJCQkJUElfUENUUkxfTV9JTklULAorCQkJCQkJCSh1MzIpIChicC0+ZGVzY3JfYmxvY2tfcGh5cyB8IFBJX1BEQVRBX0FfSU5JVF9NX0JTV0FQX0RBVEEpLAorCQkJCQkJCTAsCisJCQkJCQkJTlVMTCkgIT0gREZYX0tfU1VDQ0VTUykKKwkJeworCQlwcmludGsoIiVzOiBDb3VsZCBub3Qgc2V0IGRlc2NyaXB0b3IgYmxvY2sgYWRkcmVzcyFcbiIsIGJwLT5kZXYtPm5hbWUpOworCQlyZXR1cm4oREZYX0tfRkFJTFVSRSk7CisJCX0KKworCS8qIFNldCB0cmFuc21pdCBmbHVzaCB0aW1lb3V0IHZhbHVlICovCisKKwlicC0+Y21kX3JlcV92aXJ0LT5jbWRfdHlwZSA9IFBJX0NNRF9LX0NIQVJTX1NFVDsKKwlicC0+Y21kX3JlcV92aXJ0LT5jaGFyX3NldC5pdGVtWzBdLml0ZW1fY29kZQk9IFBJX0lURU1fS19GTFVTSF9USU1FOworCWJwLT5jbWRfcmVxX3ZpcnQtPmNoYXJfc2V0Lml0ZW1bMF0udmFsdWUJCT0gMzsJLyogMyBzZWNvbmRzICovCisJYnAtPmNtZF9yZXFfdmlydC0+Y2hhcl9zZXQuaXRlbVswXS5pdGVtX2luZGV4CT0gMDsKKwlicC0+Y21kX3JlcV92aXJ0LT5jaGFyX3NldC5pdGVtWzFdLml0ZW1fY29kZQk9IFBJX0lURU1fS19FT0w7CisJaWYgKGRmeF9od19kbWFfY21kX3JlcShicCkgIT0gREZYX0tfU1VDQ0VTUykKKwkJeworCQlwcmludGsoIiVzOiBETUEgY29tbWFuZCByZXF1ZXN0IGZhaWxlZCFcbiIsIGJwLT5kZXYtPm5hbWUpOworCQlyZXR1cm4oREZYX0tfRkFJTFVSRSk7CisJCX0KKworCS8qIFNldCB0aGUgaW5pdGlhbCB2YWx1ZXMgZm9yIGVGRFhFbmFibGUgYW5kIE1BQ1RSZXEgTUlCIG9iamVjdHMgKi8KKworCWJwLT5jbWRfcmVxX3ZpcnQtPmNtZF90eXBlID0gUElfQ01EX0tfU05NUF9TRVQ7CisJYnAtPmNtZF9yZXFfdmlydC0+c25tcF9zZXQuaXRlbVswXS5pdGVtX2NvZGUJPSBQSV9JVEVNX0tfRkRYX0VOQl9ESVM7CisJYnAtPmNtZF9yZXFfdmlydC0+c25tcF9zZXQuaXRlbVswXS52YWx1ZQkJPSBicC0+ZnVsbF9kdXBsZXhfZW5iOworCWJwLT5jbWRfcmVxX3ZpcnQtPnNubXBfc2V0Lml0ZW1bMF0uaXRlbV9pbmRleAk9IDA7CisJYnAtPmNtZF9yZXFfdmlydC0+c25tcF9zZXQuaXRlbVsxXS5pdGVtX2NvZGUJPSBQSV9JVEVNX0tfTUFDX1RfUkVROworCWJwLT5jbWRfcmVxX3ZpcnQtPnNubXBfc2V0Lml0ZW1bMV0udmFsdWUJCT0gYnAtPnJlcV90dHJ0OworCWJwLT5jbWRfcmVxX3ZpcnQtPnNubXBfc2V0Lml0ZW1bMV0uaXRlbV9pbmRleAk9IDA7CisJYnAtPmNtZF9yZXFfdmlydC0+c25tcF9zZXQuaXRlbVsyXS5pdGVtX2NvZGUJPSBQSV9JVEVNX0tfRU9MOworCWlmIChkZnhfaHdfZG1hX2NtZF9yZXEoYnApICE9IERGWF9LX1NVQ0NFU1MpCisJCXsKKwkJcHJpbnRrKCIlczogRE1BIGNvbW1hbmQgcmVxdWVzdCBmYWlsZWQhXG4iLCBicC0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuKERGWF9LX0ZBSUxVUkUpOworCQl9CisKKwkvKiBJbml0aWFsaXplIGFkYXB0ZXIgQ0FNICovCisKKwlpZiAoZGZ4X2N0bF91cGRhdGVfY2FtKGJwKSAhPSBERlhfS19TVUNDRVNTKQorCQl7CisJCXByaW50aygiJXM6IEFkYXB0ZXIgQ0FNIHVwZGF0ZSBmYWlsZWQhXG4iLCBicC0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuKERGWF9LX0ZBSUxVUkUpOworCQl9CisKKwkvKiBJbml0aWFsaXplIGFkYXB0ZXIgZmlsdGVycyAqLworCisJaWYgKGRmeF9jdGxfdXBkYXRlX2ZpbHRlcnMoYnApICE9IERGWF9LX1NVQ0NFU1MpCisJCXsKKwkJcHJpbnRrKCIlczogQWRhcHRlciBmaWx0ZXJzIHVwZGF0ZSBmYWlsZWQhXG4iLCBicC0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuKERGWF9LX0ZBSUxVUkUpOworCQl9CisKKwkvKgorCSAqIFJlbW92ZSBhbnkgZXhpc3RpbmcgZHluYW1pYyBidWZmZXJzIChpLmUuIGlmIHRoZSBhZGFwdGVyIGlzIGJlaW5nCisJICogcmVpbml0aWFsaXplZCkKKwkgKi8KKworCWlmIChnZXRfYnVmZmVycykKKwkJZGZ4X3Jjdl9mbHVzaChicCk7CisKKwkvKiBJbml0aWFsaXplIHJlY2VpdmUgZGVzY3JpcHRvciBibG9jayBhbmQgcHJvZHVjZSBidWZmZXJzICovCisKKwlpZiAoZGZ4X3Jjdl9pbml0KGJwLCBnZXRfYnVmZmVycykpCisJICAgICAgICB7CisJCXByaW50aygiJXM6IFJlY2VpdmUgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iLCBicC0+ZGV2LT5uYW1lKTsKKwkJaWYgKGdldF9idWZmZXJzKQorCQkJZGZ4X3Jjdl9mbHVzaChicCk7CisJCXJldHVybihERlhfS19GQUlMVVJFKTsKKwkJfQorCisJLyogSXNzdWUgU1RBUlQgY29tbWFuZCBhbmQgYnJpbmcgYWRhcHRlciB0byBMSU5LXyhVTilBVkFJTEFCTEUgc3RhdGUgKi8KKworCWJwLT5jbWRfcmVxX3ZpcnQtPmNtZF90eXBlID0gUElfQ01EX0tfU1RBUlQ7CisJaWYgKGRmeF9od19kbWFfY21kX3JlcShicCkgIT0gREZYX0tfU1VDQ0VTUykKKwkJeworCQlwcmludGsoIiVzOiBTdGFydCBjb21tYW5kIGZhaWxlZFxuIiwgYnAtPmRldi0+bmFtZSk7CisJCWlmIChnZXRfYnVmZmVycykKKwkJCWRmeF9yY3ZfZmx1c2goYnApOworCQlyZXR1cm4oREZYX0tfRkFJTFVSRSk7CisJCX0KKworCS8qIEluaXRpYWxpemF0aW9uIHN1Y2NlZWRlZCwgcmVlbmFibGUgUERRIGludGVycnVwdHMgKi8KKworCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19IT1NUX0lOVF9FTkIsIFBJX0hPU1RfSU5UX0tfRU5BQkxFX0RFRl9JTlRTKTsKKwlyZXR1cm4oREZYX0tfU1VDQ0VTUyk7CisJfQorCisMCisvKgorICogPT09PT09PT09PT09CisgKiA9IGRmeF9vcGVuID0KKyAqID09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBPcGVucyB0aGUgYWRhcHRlcgorICogIAorICogUmV0dXJuczoKKyAqICAgQ29uZGl0aW9uIGNvZGUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBkZXYgLSBwb2ludGVyIHRvIGRldmljZSBpbmZvcm1hdGlvbgorICoKKyAqIEZ1bmN0aW9uYWwgRGVzY3JpcHRpb246CisgKiAgIFRoaXMgZnVuY3Rpb24gYnJpbmdzIHRoZSBhZGFwdGVyIHRvIGFuIG9wZXJhdGlvbmFsIHN0YXRlLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgMAkJIC0gQWRhcHRlciB3YXMgc3VjY2Vzc2Z1bGx5IG9wZW5lZAorICogICAtRUFHQUlOIC0gQ291bGQgbm90IHJlZ2lzdGVyIElSUSBvciBhZGFwdGVyIGluaXRpYWxpemF0aW9uIGZhaWxlZAorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBUaGlzIHJvdXRpbmUgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZvciBhIGRldmljZSB0aGF0IHdhcworICogICBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkuCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBBZGFwdGVyIHNob3VsZCBiZSBpbiBMSU5LX0FWQUlMQUJMRSBvciBMSU5LX1VOQVZBSUxBQkxFIHN0YXRlCisgKiAgIGlmIHRoZSBvcGVuIGlzIHN1Y2Nlc3NmdWwuCisgKi8KKworc3RhdGljIGludCBkZnhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXQ7CisJREZYX2JvYXJkX3QJKmJwID0gZGV2LT5wcml2OworCisJREJHX3ByaW50aygiSW4gZGZ4X29wZW4uLi5cbiIpOworCQorCS8qIFJlZ2lzdGVyIElSUSAtIHN1cHBvcnQgc2hhcmVkIGludGVycnVwdHMgYnkgcGFzc2luZyBkZXZpY2UgcHRyICovCisKKwlyZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgKHZvaWQgKilkZnhfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUmVxdWVzdGVkIElSUSAlZCBpcyBidXN5XG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKgorCSAqIFNldCBjdXJyZW50IGFkZHJlc3MgdG8gZmFjdG9yeSBNQUMgYWRkcmVzcworCSAqCisJICogTm90ZTogV2UndmUgYWxyZWFkeSBkb25lIHRoaXMgc3RlcCBpbiBkZnhfZHJpdmVyX2luaXQuCisJICogICAgICAgSG93ZXZlciwgaXQncyBwb3NzaWJsZSB0aGF0IGEgdXNlciBoYXMgc2V0IGEgbm9kZQorCSAqCQkgYWRkcmVzcyBvdmVycmlkZSwgdGhlbiBjbG9zZWQgYW5kIHJlb3BlbmVkIHRoZQorCSAqCQkgYWRhcHRlci4gIFVubGVzcyB3ZSByZXNldCB0aGUgZGV2aWNlIGFkZHJlc3MgZmllbGQKKwkgKgkJIG5vdywgd2UnbGwgY29udGludWUgdG8gdXNlIHRoZSBleGlzdGluZyBtb2RpZmllZAorCSAqCQkgYWRkcmVzcy4KKwkgKi8KKworCW1lbWNweShkZXYtPmRldl9hZGRyLCBicC0+ZmFjdG9yeV9tYWNfYWRkciwgRkRESV9LX0FMRU4pOworCisJLyogQ2xlYXIgbG9jYWwgdW5pY2FzdC9tdWx0aWNhc3QgYWRkcmVzcyB0YWJsZXMgYW5kIGNvdW50cyAqLworCisJbWVtc2V0KGJwLT51Y190YWJsZSwgMCwgc2l6ZW9mKGJwLT51Y190YWJsZSkpOworCW1lbXNldChicC0+bWNfdGFibGUsIDAsIHNpemVvZihicC0+bWNfdGFibGUpKTsKKwlicC0+dWNfY291bnQgPSAwOworCWJwLT5tY19jb3VudCA9IDA7CisKKwkvKiBEaXNhYmxlIHByb21pc2N1b3VzIGZpbHRlciBzZXR0aW5ncyAqLworCisJYnAtPmluZF9ncm91cF9wcm9tCT0gUElfRlNUQVRFX0tfQkxPQ0s7CisJYnAtPmdyb3VwX3Byb20JCT0gUElfRlNUQVRFX0tfQkxPQ0s7CisKKwlzcGluX2xvY2tfaW5pdCgmYnAtPmxvY2spOworCisJLyogUmVzZXQgYW5kIGluaXRpYWxpemUgYWRhcHRlciAqLworCisJYnAtPnJlc2V0X3R5cGUgPSBQSV9QREFUQV9BX1JFU0VUX01fU0tJUF9TVDsJLyogc2tpcCBzZWxmLXRlc3QgKi8KKwlpZiAoZGZ4X2FkYXBfaW5pdChicCwgMSkgIT0gREZYX0tfU1VDQ0VTUykKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEFkYXB0ZXIgb3BlbiBmYWlsZWQhXG4iLCBkZXYtPm5hbWUpOworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJLyogU2V0IGRldmljZSBzdHJ1Y3R1cmUgaW5mbyAqLworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuKDApOworfQorCisMCisvKgorICogPT09PT09PT09PT09PQorICogPSBkZnhfY2xvc2UgPQorICogPT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBDbG9zZXMgdGhlIGRldmljZS9tb2R1bGUuCisgKiAgCisgKiBSZXR1cm5zOgorICogICBDb25kaXRpb24gY29kZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGRldiAtIHBvaW50ZXIgdG8gZGV2aWNlIGluZm9ybWF0aW9uCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyByb3V0aW5lIGNsb3NlcyB0aGUgYWRhcHRlciBhbmQgYnJpbmdzIGl0IHRvIGEgc2FmZSBzdGF0ZS4KKyAqICAgVGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgaXMgZGVyZWdpc3RlcmVkIHdpdGggdGhlIE9TLgorICogICBUaGUgYWRhcHRlciBjYW4gYmUgb3BlbmVkIGFnYWluIHdpdGggYW5vdGhlciBjYWxsIHRvIGRmeF9vcGVuKCkuCisgKgorICogUmV0dXJuIENvZGVzOgorICogICBBbHdheXMgcmV0dXJuIDAuCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIE5vIGZ1cnRoZXIgcmVxdWVzdHMgZm9yIHRoaXMgYWRhcHRlciBhcmUgbWFkZSBhZnRlciB0aGlzIHJvdXRpbmUgaXMKKyAqICAgY2FsbGVkLiAgZGZ4X29wZW4oKSBjYW4gYmUgY2FsbGVkIHRvIHJlc2V0IGFuZCByZWluaXRpYWxpemUgdGhlCisgKiAgIGFkYXB0ZXIuCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBBZGFwdGVyIHNob3VsZCBiZSBpbiBETUFfVU5BVkFJTEFCTEUgc3RhdGUgdXBvbiBjb21wbGV0aW9uIG9mIHRoaXMKKyAqICAgcm91dGluZS4KKyAqLworCitzdGF0aWMgaW50IGRmeF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCURGWF9ib2FyZF90CSpicCA9IGRldi0+cHJpdjsKKworCURCR19wcmludGsoIkluIGRmeF9jbG9zZS4uLlxuIik7CisKKwkvKiBEaXNhYmxlIFBEUSBpbnRlcnJ1cHRzIGZpcnN0ICovCisKKwlkZnhfcG9ydF93cml0ZV9sb25nKGJwLCBQSV9QRFFfS19SRUdfSE9TVF9JTlRfRU5CLCBQSV9IT1NUX0lOVF9LX0RJU0FCTEVfQUxMX0lOVFMpOworCisJLyogUGxhY2UgYWRhcHRlciBpbiBETUFfVU5BVkFJTEFCTEUgc3RhdGUgYnkgcmVzZXR0aW5nIGFkYXB0ZXIgKi8KKworCSh2b2lkKSBkZnhfaHdfZG1hX3VuaW5pdChicCwgUElfUERBVEFfQV9SRVNFVF9NX1NLSVBfU1QpOworCisJLyoKKwkgKiBGbHVzaCBhbnkgcGVuZGluZyB0cmFuc21pdCBidWZmZXJzCisJICoKKwkgKiBOb3RlOiBJdCdzIGltcG9ydGFudCB0aGF0IHdlIGZsdXNoIHRoZSB0cmFuc21pdCBidWZmZXJzCisJICoJCSBCRUZPUkUgd2UgY2xlYXIgb3VyIGNvcHkgb2YgdGhlIFR5cGUgMiByZWdpc3Rlci4KKwkgKgkJIE90aGVyd2lzZSwgd2UnbGwgaGF2ZSBubyBpZGVhIGhvdyBtYW55IGJ1ZmZlcnMKKwkgKgkJIHdlIG5lZWQgdG8gZnJlZS4KKwkgKi8KKworCWRmeF94bXRfZmx1c2goYnApOworCisJLyoKKwkgKiBDbGVhciBUeXBlIDEgYW5kIFR5cGUgMiByZWdpc3RlcnMgYWZ0ZXIgYWRhcHRlciByZXNldAorCSAqCisJICogTm90ZTogRXZlbiB0aG91Z2ggd2UncmUgY2xvc2luZyB0aGUgYWRhcHRlciwgaXQncworCSAqICAgICAgIHBvc3NpYmxlIHRoYXQgYW4gaW50ZXJydXB0IHdpbGwgb2NjdXIgYWZ0ZXIKKwkgKgkJIGRmeF9jbG9zZSBpcyBjYWxsZWQuICBXaXRob3V0IHNvbWUgYXNzdXJhbmNlIHRvCisJICoJCSB0aGUgY29udHJhcnkgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBkb24ndAorCSAqCQkgcHJvY2VzcyByZWNlaXZlIGFuZCB0cmFuc21pdCBMTEMgZnJhbWVzIGFuZCB1cGRhdGUKKwkgKgkJIHRoZSBUeXBlIDIgcmVnaXN0ZXIgd2l0aCBiYWQgaW5mb3JtYXRpb24uCisJICovCisKKwlicC0+Y21kX3JlcV9yZWcubHdvcmQJPSAwOworCWJwLT5jbWRfcnNwX3JlZy5sd29yZAk9IDA7CisJYnAtPnJjdl94bXRfcmVnLmx3b3JkCT0gMDsKKworCS8qIENsZWFyIGNvbnN1bWVyIGJsb2NrIGZvciB0aGUgc2FtZSByZWFzb24gZ2l2ZW4gYWJvdmUgKi8KKworCW1lbXNldChicC0+Y29uc19ibG9ja192aXJ0LCAwLCBzaXplb2YoUElfQ09OU1VNRVJfQkxPQ0spKTsKKworCS8qIFJlbGVhc2UgYWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlIHNrYiBpbiB0aGUgcmVjZWl2ZSByaW5nLiAqLworCisJZGZ4X3Jjdl9mbHVzaChicCk7CisKKwkvKiBDbGVhciBkZXZpY2Ugc3RydWN0dXJlIGZsYWdzICovCisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJLyogRGVyZWdpc3RlciAoZnJlZSkgSVJRICovCisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkKKwlyZXR1cm4oMCk7Cit9CisKKwwKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09CisgKiA9IGRmeF9pbnRfcHJfaGFsdF9pZCA9CisgKiA9PT09PT09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIERpc3BsYXlzIGhhbHQgaWQncyBpbiBzdHJpbmcgZm9ybS4KKyAqICAKKyAqIFJldHVybnM6CisgKiAgIE5vbmUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBicCAtIHBvaW50ZXIgdG8gYm9hcmQgaW5mb3JtYXRpb24KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBEZXRlcm1pbmUgY3VycmVudCBoYWx0IGlkIGFuZCBkaXNwbGF5IGFwcHJvcHJpYXRlIHN0cmluZy4KKyAqCisgKiBSZXR1cm4gQ29kZXM6CisgKiAgIE5vbmUKKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqICAgTm9uZQorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgTm9uZQorICovCisKK3N0YXRpYyB2b2lkIGRmeF9pbnRfcHJfaGFsdF9pZChERlhfYm9hcmRfdAkqYnApCisJeworCVBJX1VJTlQzMglwb3J0X3N0YXR1czsJCQkvKiBQRFEgcG9ydCBzdGF0dXMgcmVnaXN0ZXIgdmFsdWUgKi8KKwlQSV9VSU5UMzIJaGFsdF9pZDsJCQkJLyogUERRIHBvcnQgc3RhdHVzIGhhbHQgSUQgKi8KKworCS8qIFJlYWQgdGhlIGxhdGVzdCBwb3J0IHN0YXR1cyAqLworCisJZGZ4X3BvcnRfcmVhZF9sb25nKGJwLCBQSV9QRFFfS19SRUdfUE9SVF9TVEFUVVMsICZwb3J0X3N0YXR1cyk7CisKKwkvKiBEaXNwbGF5IGhhbHQgc3RhdGUgdHJhbnNpdGlvbiBpbmZvcm1hdGlvbiAqLworCisJaGFsdF9pZCA9IChwb3J0X3N0YXR1cyAmIFBJX1BTVEFUVVNfTV9IQUxUX0lEKSA+PiBQSV9QU1RBVFVTX1ZfSEFMVF9JRDsKKwlzd2l0Y2ggKGhhbHRfaWQpCisJCXsKKwkJY2FzZSBQSV9IQUxUX0lEX0tfU0VMRlRFU1RfVElNRU9VVDoKKwkJCXByaW50aygiJXM6IEhhbHQgSUQ6IFNlbGZ0ZXN0IFRpbWVvdXRcbiIsIGJwLT5kZXYtPm5hbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQSV9IQUxUX0lEX0tfUEFSSVRZX0VSUk9SOgorCQkJcHJpbnRrKCIlczogSGFsdCBJRDogSG9zdCBCdXMgUGFyaXR5IEVycm9yXG4iLCBicC0+ZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUElfSEFMVF9JRF9LX0hPU1RfRElSX0hBTFQ6CisJCQlwcmludGsoIiVzOiBIYWx0IElEOiBIb3N0LURpcmVjdGVkIEhhbHRcbiIsIGJwLT5kZXYtPm5hbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQSV9IQUxUX0lEX0tfU1dfRkFVTFQ6CisJCQlwcmludGsoIiVzOiBIYWx0IElEOiBBZGFwdGVyIFNvZnR3YXJlIEZhdWx0XG4iLCBicC0+ZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUElfSEFMVF9JRF9LX0hXX0ZBVUxUOgorCQkJcHJpbnRrKCIlczogSGFsdCBJRDogQWRhcHRlciBIYXJkd2FyZSBGYXVsdFxuIiwgYnAtPmRldi0+bmFtZSk7CisJCQlicmVhazsKKworCQljYXNlIFBJX0hBTFRfSURfS19QQ19UUkFDRToKKwkJCXByaW50aygiJXM6IEhhbHQgSUQ6IEZEREkgTmV0d29yayBQQyBUcmFjZSBQYXRoIFRlc3RcbiIsIGJwLT5kZXYtPm5hbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQSV9IQUxUX0lEX0tfRE1BX0VSUk9SOgorCQkJcHJpbnRrKCIlczogSGFsdCBJRDogQWRhcHRlciBETUEgRXJyb3JcbiIsIGJwLT5kZXYtPm5hbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQSV9IQUxUX0lEX0tfSU1BR0VfQ1JDX0VSUk9SOgorCQkJcHJpbnRrKCIlczogSGFsdCBJRDogRmlybXdhcmUgSW1hZ2UgQ1JDIEVycm9yXG4iLCBicC0+ZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUElfSEFMVF9JRF9LX0JVU19FWENFUFRJT046CisJCQlwcmludGsoIiVzOiBIYWx0IElEOiA2ODAwMCBCdXMgRXhjZXB0aW9uXG4iLCBicC0+ZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoIiVzOiBIYWx0IElEOiBVbmtub3duIChjb2RlID0gJVgpXG4iLCBicC0+ZGV2LT5uYW1lLCBoYWx0X2lkKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisMCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqID0gZGZ4X2ludF90eXBlXzBfcHJvY2VzcyA9CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBQcm9jZXNzZXMgVHlwZSAwIGludGVycnVwdHMuCisgKiAgCisgKiBSZXR1cm5zOgorICogICBOb25lCisgKiAgICAgICAKKyAqIEFyZ3VtZW50czoKKyAqICAgYnAgLSBwb2ludGVyIHRvIGJvYXJkIGluZm9ybWF0aW9uCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgUHJvY2Vzc2VzIGFsbCBlbmFibGVkIFR5cGUgMCBpbnRlcnJ1cHRzLiAgSWYgdGhlIHJlYXNvbiBmb3IgdGhlIGludGVycnVwdAorICogICBpcyBhIHNlcmlvdXMgZmF1bHQgb24gdGhlIGFkYXB0ZXIsIHRoZW4gYW4gZXJyb3IgbWVzc2FnZSBpcyBkaXNwbGF5ZWQKKyAqICAgYW5kIHRoZSBhZGFwdGVyIGlzIHJlc2V0LgorICoKKyAqICAgT25lIHRyaWNreSBwb3RlbnRpYWwgdGltaW5nIHdpbmRvdyBpcyB0aGUgcmFwaWQgc3VjY2Vzc2lvbiBvZiAibGluayBhdmFpbCIKKyAqICAgImxpbmsgdW5hdmFpbCIgc3RhdGUgY2hhbmdlIGludGVycnVwdHMuICBUaGUgYWNrbm93bGVkZ2VtZW50IG9mIHRoZSBUeXBlIDAKKyAqICAgaW50ZXJydXB0IG11c3QgYmUgZG9uZSBiZWZvcmUgcmVhZGluZyB0aGUgc3RhdGUgZnJvbSB0aGUgUG9ydCBTdGF0dXMKKyAqICAgcmVnaXN0ZXIuICBUaGlzIGlzIHRydWUgYmVjYXVzZSBhIHN0YXRlIGNoYW5nZSBjb3VsZCBvY2N1ciBhZnRlciByZWFkaW5nCisgKiAgIHRoZSBkYXRhLCBidXQgYmVmb3JlIGFja25vd2xlZGdpbmcgdGhlIGludGVycnVwdC4gIElmIHRoaXMgc3RhdGUgY2hhbmdlCisgKiAgIGRvZXMgaGFwcGVuLCBpdCB3b3VsZCBiZSBsb3N0IGJlY2F1c2UgdGhlIGRyaXZlciBpcyB1c2luZyB0aGUgb2xkIHN0YXRlLAorICogICBhbmQgaXQgd2lsbCBuZXZlciBrbm93IGFib3V0IHRoZSBuZXcgc3RhdGUgYmVjYXVzZSBpdCBzdWJzZXF1ZW50bHkKKyAqICAgYWNrbm93bGVkZ2VzIHRoZSBzdGF0ZSBjaGFuZ2UgaW50ZXJydXB0LgorICoKKyAqICAgICAgICAgIElOQ09SUkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09SUkVDVAorICogICAgICByZWFkIHR5cGUgMCBpbnQgcmVhc29ucyAgICAgICAgICAgICAgICAgICByZWFkIHR5cGUgMCBpbnQgcmVhc29ucworICogICAgICByZWFkIGFkYXB0ZXIgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICBhY2sgdHlwZSAwIGludGVycnVwdHMKKyAqICAgICAgYWNrIHR5cGUgMCBpbnRlcnJ1cHRzICAgICAgICAgICAgICAgICAgICAgcmVhZCBhZGFwdGVyIHN0YXRlCisgKiAgICAgIC4uLiBwcm9jZXNzIGludGVycnVwdCAuLi4gICAgICAgICAgICAgICAgIC4uLiBwcm9jZXNzIGludGVycnVwdCAuLi4KKyAqCisgKiBSZXR1cm4gQ29kZXM6CisgKiAgIE5vbmUKKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqICAgTm9uZQorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgQW4gYWRhcHRlciByZXNldCBtYXkgb2NjdXIgaWYgdGhlIGFkYXB0ZXIgaGFzIGFueSBUeXBlIDAgZXJyb3IgaW50ZXJydXB0cworICogICBvciBpZiB0aGUgcG9ydCBzdGF0dXMgaW5kaWNhdGVzIHRoYXQgdGhlIGFkYXB0ZXIgaXMgaGFsdGVkLiAgVGhlIGRyaXZlcgorICogICBpcyByZXNwb25zaWJsZSBmb3IgcmVpbml0aWFsaXppbmcgdGhlIGFkYXB0ZXIgd2l0aCB0aGUgY3VycmVudCBDQU0KKyAqICAgY29udGVudHMgYW5kIGFkYXB0ZXIgZmlsdGVyIHNldHRpbmdzLgorICovCisKK3N0YXRpYyB2b2lkIGRmeF9pbnRfdHlwZV8wX3Byb2Nlc3MoREZYX2JvYXJkX3QJKmJwKQorCisJeworCVBJX1VJTlQzMgl0eXBlXzBfc3RhdHVzOwkJLyogSG9zdCBJbnRlcnJ1cHQgVHlwZSAwIHJlZ2lzdGVyICovCisJUElfVUlOVDMyCXN0YXRlOwkJCQkvKiBjdXJyZW50IGFkYXAgc3RhdGUgKGZyb20gcG9ydCBzdGF0dXMpICovCisKKwkvKgorCSAqIFJlYWQgaG9zdCBpbnRlcnJ1cHQgVHlwZSAwIHJlZ2lzdGVyIHRvIGRldGVybWluZSB3aGljaCBUeXBlIDAKKwkgKiBpbnRlcnJ1cHRzIGFyZSBwZW5kaW5nLiAgSW1tZWRpYXRlbHkgd3JpdGUgaXQgYmFjayBvdXQgdG8gY2xlYXIKKwkgKiB0aG9zZSBpbnRlcnJ1cHRzLgorCSAqLworCisJZGZ4X3BvcnRfcmVhZF9sb25nKGJwLCBQSV9QRFFfS19SRUdfVFlQRV8wX1NUQVRVUywgJnR5cGVfMF9zdGF0dXMpOworCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19UWVBFXzBfU1RBVFVTLCB0eXBlXzBfc3RhdHVzKTsKKworCS8qIENoZWNrIGZvciBUeXBlIDAgZXJyb3IgaW50ZXJydXB0cyAqLworCisJaWYgKHR5cGVfMF9zdGF0dXMgJiAoUElfVFlQRV8wX1NUQVRfTV9OWE0gfAorCQkJCQkJCVBJX1RZUEVfMF9TVEFUX01fUE1fUEFSX0VSUiB8CisJCQkJCQkJUElfVFlQRV8wX1NUQVRfTV9CVVNfUEFSX0VSUikpCisJCXsKKwkJLyogQ2hlY2sgZm9yIE5vbi1FeGlzdGVudCBNZW1vcnkgZXJyb3IgKi8KKworCQlpZiAodHlwZV8wX3N0YXR1cyAmIFBJX1RZUEVfMF9TVEFUX01fTlhNKQorCQkJcHJpbnRrKCIlczogTm9uLUV4aXN0ZW50IE1lbW9yeSBBY2Nlc3MgRXJyb3JcbiIsIGJwLT5kZXYtPm5hbWUpOworCisJCS8qIENoZWNrIGZvciBQYWNrZXQgTWVtb3J5IFBhcml0eSBlcnJvciAqLworCisJCWlmICh0eXBlXzBfc3RhdHVzICYgUElfVFlQRV8wX1NUQVRfTV9QTV9QQVJfRVJSKQorCQkJcHJpbnRrKCIlczogUGFja2V0IE1lbW9yeSBQYXJpdHkgRXJyb3JcbiIsIGJwLT5kZXYtPm5hbWUpOworCisJCS8qIENoZWNrIGZvciBIb3N0IEJ1cyBQYXJpdHkgZXJyb3IgKi8KKworCQlpZiAodHlwZV8wX3N0YXR1cyAmIFBJX1RZUEVfMF9TVEFUX01fQlVTX1BBUl9FUlIpCisJCQlwcmludGsoIiVzOiBIb3N0IEJ1cyBQYXJpdHkgRXJyb3JcbiIsIGJwLT5kZXYtPm5hbWUpOworCisJCS8qIFJlc2V0IGFkYXB0ZXIgYW5kIGJyaW5nIGl0IGJhY2sgb24tbGluZSAqLworCisJCWJwLT5saW5rX2F2YWlsYWJsZSA9IFBJX0tfRkFMU0U7CS8qIGxpbmsgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSAqLworCQlicC0+cmVzZXRfdHlwZSA9IDA7CQkJCQkvKiByZXJ1biBvbi1ib2FyZCBkaWFnbm9zdGljcyAqLworCQlwcmludGsoIiVzOiBSZXNldHRpbmcgYWRhcHRlci4uLlxuIiwgYnAtPmRldi0+bmFtZSk7CisJCWlmIChkZnhfYWRhcF9pbml0KGJwLCAwKSAhPSBERlhfS19TVUNDRVNTKQorCQkJeworCQkJcHJpbnRrKCIlczogQWRhcHRlciByZXNldCBmYWlsZWQhICBEaXNhYmxpbmcgYWRhcHRlciBpbnRlcnJ1cHRzLlxuIiwgYnAtPmRldi0+bmFtZSk7CisJCQlkZnhfcG9ydF93cml0ZV9sb25nKGJwLCBQSV9QRFFfS19SRUdfSE9TVF9JTlRfRU5CLCBQSV9IT1NUX0lOVF9LX0RJU0FCTEVfQUxMX0lOVFMpOworCQkJcmV0dXJuOworCQkJfQorCQlwcmludGsoIiVzOiBBZGFwdGVyIHJlc2V0IHN1Y2Nlc3NmdWwhXG4iLCBicC0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCQl9CisKKwkvKiBDaGVjayBmb3IgdHJhbnNtaXQgZmx1c2ggaW50ZXJydXB0ICovCisKKwlpZiAodHlwZV8wX3N0YXR1cyAmIFBJX1RZUEVfMF9TVEFUX01fWE1UX0ZMVVNIKQorCQl7CisJCS8qIEZsdXNoIGFueSBwZW5kaW5nIHhtdCdzIGFuZCBhY2tub3dsZWRnZSB0aGUgZmx1c2ggaW50ZXJydXB0ICovCisKKwkJYnAtPmxpbmtfYXZhaWxhYmxlID0gUElfS19GQUxTRTsJCS8qIGxpbmsgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSAqLworCQlkZnhfeG10X2ZsdXNoKGJwKTsJCQkJCQkvKiBmbHVzaCBhbnkgb3V0c3RhbmRpbmcgcGFja2V0cyAqLworCQkodm9pZCkgZGZ4X2h3X3BvcnRfY3RybF9yZXEoYnAsCisJCQkJCQkJCQlQSV9QQ1RSTF9NX1hNVF9EQVRBX0ZMVVNIX0RPTkUsCisJCQkJCQkJCQkwLAorCQkJCQkJCQkJMCwKKwkJCQkJCQkJCU5VTEwpOworCQl9CisKKwkvKiBDaGVjayBmb3IgYWRhcHRlciBzdGF0ZSBjaGFuZ2UgKi8KKworCWlmICh0eXBlXzBfc3RhdHVzICYgUElfVFlQRV8wX1NUQVRfTV9TVEFURV9DSEFOR0UpCisJCXsgICAgICAgICAgICAgICAgICAgICAKKwkJLyogR2V0IGxhdGVzdCBhZGFwdGVyIHN0YXRlICovCisKKwkJc3RhdGUgPSBkZnhfaHdfYWRhcF9zdGF0ZV9yZChicCk7CS8qIGdldCBhZGFwdGVyIHN0YXRlICovCisJCWlmIChzdGF0ZSA9PSBQSV9TVEFURV9LX0hBTFRFRCkKKwkJCXsKKwkJCS8qCisJCQkgKiBBZGFwdGVyIGhhcyB0cmFuc2l0aW9uZWQgdG8gSEFMVEVEIHN0YXRlLCB0cnkgdG8gcmVzZXQKKwkJCSAqIGFkYXB0ZXIgdG8gYnJpbmcgaXQgYmFjayBvbi1saW5lLiAgSWYgcmVzZXQgZmFpbHMsCisJCQkgKiBsZWF2ZSB0aGUgYWRhcHRlciBpbiB0aGUgYnJva2VuIHN0YXRlLgorCQkJICovCisKKwkJCXByaW50aygiJXM6IENvbnRyb2xsZXIgaGFzIHRyYW5zaXRpb25lZCB0byBIQUxURUQgc3RhdGUhXG4iLCBicC0+ZGV2LT5uYW1lKTsKKwkJCWRmeF9pbnRfcHJfaGFsdF9pZChicCk7CQkJLyogZGlzcGxheSBoYWx0IGlkIGFzIHN0cmluZyAqLworCisJCQkvKiBSZXNldCBhZGFwdGVyIGFuZCBicmluZyBpdCBiYWNrIG9uLWxpbmUgKi8KKworCQkJYnAtPmxpbmtfYXZhaWxhYmxlID0gUElfS19GQUxTRTsJLyogbGluayBpcyBubyBsb25nZXIgYXZhaWxhYmxlICovCisJCQlicC0+cmVzZXRfdHlwZSA9IDA7CQkJCQkvKiByZXJ1biBvbi1ib2FyZCBkaWFnbm9zdGljcyAqLworCQkJcHJpbnRrKCIlczogUmVzZXR0aW5nIGFkYXB0ZXIuLi5cbiIsIGJwLT5kZXYtPm5hbWUpOworCQkJaWYgKGRmeF9hZGFwX2luaXQoYnAsIDApICE9IERGWF9LX1NVQ0NFU1MpCisJCQkJeworCQkJCXByaW50aygiJXM6IEFkYXB0ZXIgcmVzZXQgZmFpbGVkISAgRGlzYWJsaW5nIGFkYXB0ZXIgaW50ZXJydXB0cy5cbiIsIGJwLT5kZXYtPm5hbWUpOworCQkJCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19IT1NUX0lOVF9FTkIsIFBJX0hPU1RfSU5UX0tfRElTQUJMRV9BTExfSU5UUyk7CisJCQkJcmV0dXJuOworCQkJCX0KKwkJCXByaW50aygiJXM6IEFkYXB0ZXIgcmVzZXQgc3VjY2Vzc2Z1bCFcbiIsIGJwLT5kZXYtPm5hbWUpOworCQkJfQorCQllbHNlIGlmIChzdGF0ZSA9PSBQSV9TVEFURV9LX0xJTktfQVZBSUwpCisJCQl7CisJCQlicC0+bGlua19hdmFpbGFibGUgPSBQSV9LX1RSVUU7CQkvKiBzZXQgbGluayBhdmFpbGFibGUgZmxhZyAqLworCQkJfQorCQl9CisJfQorCisMCisvKgorICogPT09PT09PT09PT09PT09PT09CisgKiA9IGRmeF9pbnRfY29tbW9uID0KKyAqID09PT09PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBJbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIChJU1IpCisgKiAgCisgKiBSZXR1cm5zOgorICogICBOb25lCisgKiAgICAgICAKKyAqIEFyZ3VtZW50czoKKyAqICAgYnAgLSBwb2ludGVyIHRvIGJvYXJkIGluZm9ybWF0aW9uCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyBpcyB0aGUgSVNSIHdoaWNoIHByb2Nlc3NlcyBpbmNvbWluZyBhZGFwdGVyIGludGVycnVwdHMuCisgKgorICogUmV0dXJuIENvZGVzOgorICogICBOb25lCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIFRoaXMgcm91dGluZSBhc3N1bWVzIFBEUSBpbnRlcnJ1cHRzIGhhdmUgbm90IGJlZW4gZGlzYWJsZWQuCisgKiAgIFdoZW4gaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgYXQgdGhlIFBEUSwgdGhlIFBvcnQgU3RhdHVzIHJlZ2lzdGVyCisgKiAgIGlzIGF1dG9tYXRpY2FsbHkgY2xlYXJlZC4gIFRoaXMgcm91dGluZSB1c2VzIHRoZSBQb3J0IFN0YXR1cworICogICByZWdpc3RlciB2YWx1ZSB0byBkZXRlcm1pbmUgd2hldGhlciBhIFR5cGUgMCBpbnRlcnJ1cHQgb2NjdXJyZWQsCisgKiAgIHNvIGl0J3MgaW1wb3J0YW50IHRoYXQgYWRhcHRlciBpbnRlcnJ1cHRzIGFyZSBub3Qgbm9ybWFsbHkKKyAqICAgZW5hYmxlZC9kaXNhYmxlZCBhdCB0aGUgUERRLgorICoKKyAqICAgSXQncyB2aXRhbCB0aGF0IHRoaXMgcm91dGluZSBpcyBOT1QgcmVlbnRlcmVkIGZvciB0aGUKKyAqICAgc2FtZSBib2FyZCBhbmQgdGhhdCB0aGUgT1MgaXMgbm90IGluIGFub3RoZXIgc2VjdGlvbiBvZgorICogICBjb2RlIChlZy4gZGZ4X3htdF9xdWV1ZV9wa3QpIGZvciB0aGUgc2FtZSBib2FyZCBvbiBhCisgKiAgIGRpZmZlcmVudCB0aHJlYWQuCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBQZW5kaW5nIGludGVycnVwdHMgYXJlIHNlcnZpY2VkLiAgRGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mCisgKiAgIGludGVycnVwdCwgYWNrbm93bGVkZ2luZyBhbmQgY2xlYXJpbmcgdGhlIGludGVycnVwdCBhdCB0aGUKKyAqICAgUERRIGludm9sdmVzIHdyaXRpbmcgYSByZWdpc3RlciB0byBjbGVhciB0aGUgaW50ZXJydXB0IGJpdAorICogICBvciB1cGRhdGluZyBjb21wbGV0aW9uIGluZGljZXMuCisgKi8KKworc3RhdGljIHZvaWQgZGZ4X2ludF9jb21tb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlERlhfYm9hcmRfdCAJKmJwID0gZGV2LT5wcml2OworCVBJX1VJTlQzMglwb3J0X3N0YXR1czsJCS8qIFBvcnQgU3RhdHVzIHJlZ2lzdGVyICovCisKKwkvKiBQcm9jZXNzIHhtdCBpbnRlcnJ1cHRzIC0gZnJlcXVlbnQgY2FzZSwgc28gYWx3YXlzIGNhbGwgdGhpcyByb3V0aW5lICovCisKKwlpZihkZnhfeG10X2RvbmUoYnApKQkJCQkvKiBmcmVlIGNvbnN1bWVkIHhtdCBwYWNrZXRzICovCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCS8qIFByb2Nlc3MgcmN2IGludGVycnVwdHMgLSBmcmVxdWVudCBjYXNlLCBzbyBhbHdheXMgY2FsbCB0aGlzIHJvdXRpbmUgKi8KKworCWRmeF9yY3ZfcXVldWVfcHJvY2VzcyhicCk7CQkvKiBzZXJ2aWNlIHJlY2VpdmVkIExMQyBmcmFtZXMgKi8KKworCS8qCisJICogVHJhbnNtaXQgYW5kIHJlY2VpdmUgcHJvZHVjZXIgYW5kIGNvbXBsZXRpb24gaW5kaWNlcyBhcmUgdXBkYXRlZCBvbiB0aGUKKwkgKiBhZGFwdGVyIGJ5IHdyaXRpbmcgdG8gdGhlIFR5cGUgMiBQcm9kdWNlciByZWdpc3Rlci4gIFNpbmNlIHRoZSBmcmVxdWVudAorCSAqIGNhc2UgaXMgdGhhdCB3ZSdsbCBiZSBwcm9jZXNzaW5nIGVpdGhlciBMTEMgdHJhbnNtaXQgb3IgcmVjZWl2ZSBidWZmZXJzLAorCSAqIHdlJ2xsIG9wdGltaXplIEkvTyB3cml0ZXMgYnkgZG9pbmcgYSBzaW5nbGUgcmVnaXN0ZXIgd3JpdGUgaGVyZS4KKwkgKi8KKworCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19UWVBFXzJfUFJPRCwgYnAtPnJjdl94bXRfcmVnLmx3b3JkKTsKKworCS8qIFJlYWQgUERRIFBvcnQgU3RhdHVzIHJlZ2lzdGVyIHRvIGZpbmQgb3V0IHdoaWNoIGludGVycnVwdHMgbmVlZCBwcm9jZXNzaW5nICovCisKKwlkZnhfcG9ydF9yZWFkX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19QT1JUX1NUQVRVUywgJnBvcnRfc3RhdHVzKTsKKworCS8qIFByb2Nlc3MgVHlwZSAwIGludGVycnVwdHMgKGlmIGFueSkgLSBpbmZyZXF1ZW50LCBzbyBvbmx5IGNhbGwgd2hlbiBuZWVkZWQgKi8KKworCWlmIChwb3J0X3N0YXR1cyAmIFBJX1BTVEFUVVNfTV9UWVBFXzBfUEVORElORykKKwkJZGZ4X2ludF90eXBlXzBfcHJvY2VzcyhicCk7CS8qIHByb2Nlc3MgVHlwZSAwIGludGVycnVwdHMgKi8KKwl9CisKKwwKKy8qCisgKiA9PT09PT09PT09PT09PT09PQorICogPSBkZnhfaW50ZXJydXB0ID0KKyAqID09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIEludGVycnVwdCBwcm9jZXNzaW5nIHJvdXRpbmUKKyAqICAKKyAqIFJldHVybnM6CisgKiAgIE5vbmUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBpcnEJLSBpbnRlcnJ1cHQgdmVjdG9yCisgKiAgIGRldl9pZAktIHBvaW50ZXIgdG8gZGV2aWNlIGluZm9ybWF0aW9uCisgKgkgcmVncwktIHBvaW50ZXIgdG8gcmVnaXN0ZXJzIHN0cnVjdHVyZQorICoKKyAqIEZ1bmN0aW9uYWwgRGVzY3JpcHRpb246CisgKiAgIFRoaXMgcm91dGluZSBjYWxscyB0aGUgaW50ZXJydXB0IHByb2Nlc3Npbmcgcm91dGluZSBmb3IgdGhpcyBhZGFwdGVyLiAgSXQKKyAqICAgZGlzYWJsZXMgYW5kIHJlZW5hYmxlcyBhZGFwdGVyIGludGVycnVwdHMsIGFzIGFwcHJvcHJpYXRlLiAgV2UgY2FuIHN1cHBvcnQKKyAqICAgc2hhcmVkIGludGVycnVwdHMgc2luY2UgdGhlIGluY29taW5nIGRldl9pZCBwb2ludGVyIHByb3ZpZGVzIG91ciBkZXZpY2UKKyAqICAgc3RydWN0dXJlIGNvbnRleHQuCisgKgorICogUmV0dXJuIENvZGVzOgorICogICBOb25lCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIFRoZSBpbnRlcnJ1cHQgYWNrbm93bGVkZ2VtZW50IGF0IHRoZSBoYXJkd2FyZSBsZXZlbCAoZWcuIEFDS2luZyB0aGUgUElDCisgKiAgIG9uIEludGVsLWJhc2VkIHN5c3RlbXMpIGlzIGRvbmUgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb3V0c2lkZSB0aGlzCisgKiAgIHJvdXRpbmUuCisgKgorICoJIFN5c3RlbSBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkIHRocm91Z2ggdGhpcyBjYWxsLgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgSW50ZXJydXB0cyBhcmUgZGlzYWJsZWQsIHRoZW4gcmVlbmFibGVkIGF0IHRoZSBhZGFwdGVyLgorICovCisKK3N0YXRpYyB2b2lkIGRmeF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncwkqcmVncykKKwl7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldiA9IGRldl9pZDsKKwlERlhfYm9hcmRfdAkJKmJwOwkvKiBwcml2YXRlIGJvYXJkIHN0cnVjdHVyZSBwb2ludGVyICovCisJdTgJCQkJdG1wOwkvKiB1c2VkIGZvciBkaXNhYmxpbmcvZW5hYmxpbmcgaW50cyAqLworCisJLyogR2V0IGJvYXJkIHBvaW50ZXIgb25seSBpZiBkZXZpY2Ugc3RydWN0dXJlIGlzIHZhbGlkICovCisKKwlicCA9IGRldi0+cHJpdjsKKworCXNwaW5fbG9jaygmYnAtPmxvY2spOworCQorCS8qIFNlZSBpZiB3ZSdyZSBhbHJlYWR5IHNlcnZpY2luZyBhbiBpbnRlcnJ1cHQgKi8KKworCS8qIFNlcnZpY2UgYWRhcHRlciBpbnRlcnJ1cHRzICovCisKKwlpZiAoYnAtPmJ1c190eXBlID09IERGWF9CVVNfVFlQRV9QQ0kpCisJCXsKKwkJLyogRGlzYWJsZSBQRFEtUEZJIGludGVycnVwdHMgYXQgUEZJICovCisKKwkJZGZ4X3BvcnRfd3JpdGVfbG9uZyhicCwgUEZJX0tfUkVHX01PREVfQ1RSTCwgUEZJX01PREVfTV9ETUFfRU5CKTsKKworCQkvKiBDYWxsIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIHRoaXMgYWRhcHRlciAqLworCisJCWRmeF9pbnRfY29tbW9uKGRldik7CisKKwkJLyogQ2xlYXIgUERRIGludGVycnVwdCBzdGF0dXMgYml0IGFuZCByZWVuYWJsZSBpbnRlcnJ1cHRzICovCisKKwkJZGZ4X3BvcnRfd3JpdGVfbG9uZyhicCwgUEZJX0tfUkVHX1NUQVRVUywgUEZJX1NUQVRVU19NX1BEUV9JTlQpOworCQlkZnhfcG9ydF93cml0ZV9sb25nKGJwLCBQRklfS19SRUdfTU9ERV9DVFJMLAorCQkJCQkoUEZJX01PREVfTV9QRFFfSU5UX0VOQiArIFBGSV9NT0RFX01fRE1BX0VOQikpOworCQl9CisJZWxzZQorCQl7CisJCS8qIERpc2FibGUgaW50ZXJydXB0cyBhdCB0aGUgRVNJQyAqLworCisJCWRmeF9wb3J0X3JlYWRfYnl0ZShicCwgUElfRVNJQ19LX0lPX0NPTkZJR19TVEFUXzAsICZ0bXApOworCQl0bXAgJj0gflBJX0NPTkZJR19TVEFUXzBfTV9JTlRfRU5COworCQlkZnhfcG9ydF93cml0ZV9ieXRlKGJwLCBQSV9FU0lDX0tfSU9fQ09ORklHX1NUQVRfMCwgdG1wKTsKKworCQkvKiBDYWxsIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIHRoaXMgYWRhcHRlciAqLworCisJCWRmeF9pbnRfY29tbW9uKGRldik7CisKKwkJLyogUmVlbmFibGUgaW50ZXJydXB0cyBhdCB0aGUgRVNJQyAqLworCisJCWRmeF9wb3J0X3JlYWRfYnl0ZShicCwgUElfRVNJQ19LX0lPX0NPTkZJR19TVEFUXzAsICZ0bXApOworCQl0bXAgfD0gUElfQ09ORklHX1NUQVRfMF9NX0lOVF9FTkI7CisJCWRmeF9wb3J0X3dyaXRlX2J5dGUoYnAsIFBJX0VTSUNfS19JT19DT05GSUdfU1RBVF8wLCB0bXApOworCQl9CisKKwlzcGluX3VubG9jaygmYnAtPmxvY2spOworCX0KKworDAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PQorICogPSBkZnhfY3RsX2dldF9zdGF0cyA9CisgKiA9PT09PT09PT09PT09PT09PT09PT0KKyAqICAgCisgKiBPdmVydmlldzoKKyAqICAgR2V0IHN0YXRpc3RpY3MgZm9yIEZEREkgYWRhcHRlcgorICogIAorICogUmV0dXJuczoKKyAqICAgUG9pbnRlciB0byBGRERJIHN0YXRpc3RpY3Mgc3RydWN0dXJlCisgKiAgICAgICAKKyAqIEFyZ3VtZW50czoKKyAqICAgZGV2IC0gcG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBHZXRzIGN1cnJlbnQgTUlCIG9iamVjdHMgZnJvbSBhZGFwdGVyLCB0aGVuCisgKiAgIHJldHVybnMgRkRESSBzdGF0aXN0aWNzIHN0cnVjdHVyZSBhcyBkZWZpbmVkCisgKiAgIGluIGlmX2ZkZGkuaC4KKyAqCisgKiAgIE5vdGU6IFNpbmNlIHRoZSBGRERJIHN0YXRpc3RpY3Mgc3RydWN0dXJlIGlzCisgKiAgIHN0aWxsIG5ldyBhbmQgdGhlIGRldmljZSBzdHJ1Y3R1cmUgZG9lc24ndAorICogICBoYXZlIGFuIEZEREktc3BlY2lmaWMgZ2V0IHN0YXRpc3RpY3MgaGFuZGxlciwKKyAqICAgd2UnbGwgcmV0dXJuIHRoZSBGRERJIHN0YXRpc3RpY3Mgc3RydWN0dXJlIGFzCisgKiAgIGEgcG9pbnRlciB0byBhbiBFdGhlcm5ldCBzdGF0aXN0aWNzIHN0cnVjdHVyZS4KKyAqICAgVGhhdCB3YXksIGF0IGxlYXN0IHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBzdGF0aXN0aWNzCisgKiAgIHN0cnVjdHVyZSBjYW4gYmUgZGVjb2RlZCBwcm9wZXJseSwgYW5kIGl0IGFsbG93cworICogICAic21hcnQiIGFwcGxpY2F0aW9ucyB0byBwZXJmb3JtIGEgc2Vjb25kIGNhc3QgdG8KKyAqICAgZGVjb2RlIHRoZSBGRERJLXNwZWNpZmljIHN0YXRpc3RpY3MuCisgKgorICogICBXZSdsbCBoYXZlIHRvIHBheSBhdHRlbnRpb24gdG8gdGhpcyByb3V0aW5lIGFzIHRoZQorICogICBkZXZpY2Ugc3RydWN0dXJlIGJlY29tZXMgbW9yZSBtYXR1cmUgYW5kIExBTiBtZWRpYQorICogICBpbmRlcGVuZGVudC4KKyAqCisgKiBSZXR1cm4gQ29kZXM6CisgKiAgIE5vbmUKKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqICAgTm9uZQorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgTm9uZQorICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZGZ4X2N0bF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKwl7CisJREZYX2JvYXJkX3QJKmJwID0gZGV2LT5wcml2OworCisJLyogRmlsbCB0aGUgYnAtPnN0YXRzIHN0cnVjdHVyZSB3aXRoIGRyaXZlci1tYWludGFpbmVkIGNvdW50ZXJzICovCisKKwlicC0+c3RhdHMuZ2VuLnJ4X3BhY2tldHMgPSBicC0+cmN2X3RvdGFsX2ZyYW1lczsKKwlicC0+c3RhdHMuZ2VuLnR4X3BhY2tldHMgPSBicC0+eG10X3RvdGFsX2ZyYW1lczsKKwlicC0+c3RhdHMuZ2VuLnJ4X2J5dGVzICAgPSBicC0+cmN2X3RvdGFsX2J5dGVzOworCWJwLT5zdGF0cy5nZW4udHhfYnl0ZXMgICA9IGJwLT54bXRfdG90YWxfYnl0ZXM7CisJYnAtPnN0YXRzLmdlbi5yeF9lcnJvcnMgID0gYnAtPnJjdl9jcmNfZXJyb3JzICsKKwkJCQkgICBicC0+cmN2X2ZyYW1lX3N0YXR1c19lcnJvcnMgKworCQkJCSAgIGJwLT5yY3ZfbGVuZ3RoX2Vycm9yczsKKwlicC0+c3RhdHMuZ2VuLnR4X2Vycm9ycyAgPSBicC0+eG10X2xlbmd0aF9lcnJvcnM7CisJYnAtPnN0YXRzLmdlbi5yeF9kcm9wcGVkID0gYnAtPnJjdl9kaXNjYXJkczsKKwlicC0+c3RhdHMuZ2VuLnR4X2Ryb3BwZWQgPSBicC0+eG10X2Rpc2NhcmRzOworCWJwLT5zdGF0cy5nZW4ubXVsdGljYXN0ICA9IGJwLT5yY3ZfbXVsdGljYXN0X2ZyYW1lczsKKwlicC0+c3RhdHMuZ2VuLmNvbGxpc2lvbnMgPSAwOwkJLyogYWx3YXlzIHplcm8gKDApIGZvciBGRERJICovCisKKwkvKiBHZXQgRkRESSBTTVQgTUlCIG9iamVjdHMgKi8KKworCWJwLT5jbWRfcmVxX3ZpcnQtPmNtZF90eXBlID0gUElfQ01EX0tfU01UX01JQl9HRVQ7CisJaWYgKGRmeF9od19kbWFfY21kX3JlcShicCkgIT0gREZYX0tfU1VDQ0VTUykKKwkJcmV0dXJuKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKSAmYnAtPnN0YXRzKTsKKworCS8qIEZpbGwgdGhlIGJwLT5zdGF0cyBzdHJ1Y3R1cmUgd2l0aCB0aGUgU01UIE1JQiBvYmplY3QgdmFsdWVzICovCisKKwltZW1jcHkoYnAtPnN0YXRzLnNtdF9zdGF0aW9uX2lkLCAmYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X3N0YXRpb25faWQsIHNpemVvZihicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfc3RhdGlvbl9pZCkpOworCWJwLT5zdGF0cy5zbXRfb3BfdmVyc2lvbl9pZAkJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfb3BfdmVyc2lvbl9pZDsKKwlicC0+c3RhdHMuc210X2hpX3ZlcnNpb25faWQJCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X2hpX3ZlcnNpb25faWQ7CisJYnAtPnN0YXRzLnNtdF9sb192ZXJzaW9uX2lkCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9sb192ZXJzaW9uX2lkOworCW1lbWNweShicC0+c3RhdHMuc210X3VzZXJfZGF0YSwgJmJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF91c2VyX2RhdGEsIHNpemVvZihicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfdXNlcl9kYXRhKSk7CisJYnAtPnN0YXRzLnNtdF9taWJfdmVyc2lvbl9pZAkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9taWJfdmVyc2lvbl9pZDsKKwlicC0+c3RhdHMuc210X21hY19jdHMJCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9tYWNfY3Q7CisJYnAtPnN0YXRzLnNtdF9ub25fbWFzdGVyX2N0cwkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9ub25fbWFzdGVyX2N0OworCWJwLT5zdGF0cy5zbXRfbWFzdGVyX2N0cwkJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfbWFzdGVyX2N0OworCWJwLT5zdGF0cy5zbXRfYXZhaWxhYmxlX3BhdGhzCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X2F2YWlsYWJsZV9wYXRoczsKKwlicC0+c3RhdHMuc210X2NvbmZpZ19jYXBhYmlsaXRpZXMJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9jb25maWdfY2FwYWJpbGl0aWVzOworCWJwLT5zdGF0cy5zbXRfY29uZmlnX3BvbGljeQkJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfY29uZmlnX3BvbGljeTsKKwlicC0+c3RhdHMuc210X2Nvbm5lY3Rpb25fcG9saWN5CQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X2Nvbm5lY3Rpb25fcG9saWN5OworCWJwLT5zdGF0cy5zbXRfdF9ub3RpZnkJCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF90X25vdGlmeTsKKwlicC0+c3RhdHMuc210X3N0YXRfcnB0X3BvbGljeQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9zdGF0X3JwdF9wb2xpY3k7CisJYnAtPnN0YXRzLnNtdF90cmFjZV9tYXhfZXhwaXJhdGlvbgkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X3RyYWNlX21heF9leHBpcmF0aW9uOworCWJwLT5zdGF0cy5zbXRfYnlwYXNzX3ByZXNlbnQJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfYnlwYXNzX3ByZXNlbnQ7CisJYnAtPnN0YXRzLnNtdF9lY21fc3RhdGUJCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9lY21fc3RhdGU7CisJYnAtPnN0YXRzLnNtdF9jZl9zdGF0ZQkJCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X2NmX3N0YXRlOworCWJwLT5zdGF0cy5zbXRfcmVtb3RlX2Rpc2Nvbm5lY3RfZmxhZwkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfcmVtb3RlX2Rpc2Nvbm5lY3RfZmxhZzsKKwlicC0+c3RhdHMuc210X3N0YXRpb25fc3RhdHVzCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X3N0YXRpb25fc3RhdHVzOworCWJwLT5zdGF0cy5zbXRfcGVlcl93cmFwX2ZsYWcJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfcGVlcl93cmFwX2ZsYWc7CisJYnAtPnN0YXRzLnNtdF90aW1lX3N0YW1wCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9tc2dfdGltZV9zdGFtcC5sczsKKwlicC0+c3RhdHMuc210X3RyYW5zaXRpb25fdGltZV9zdGFtcAkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X3RyYW5zaXRpb25fdGltZV9zdGFtcC5sczsKKwlicC0+c3RhdHMubWFjX2ZyYW1lX3N0YXR1c19mdW5jdGlvbnMJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX2ZyYW1lX3N0YXR1c19mdW5jdGlvbnM7CisJYnAtPnN0YXRzLm1hY190X21heF9jYXBhYmlsaXR5CQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX3RfbWF4X2NhcGFiaWxpdHk7CisJYnAtPnN0YXRzLm1hY190dnhfY2FwYWJpbGl0eQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY190dnhfY2FwYWJpbGl0eTsKKwlicC0+c3RhdHMubWFjX2F2YWlsYWJsZV9wYXRocwkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY19hdmFpbGFibGVfcGF0aHM7CisJYnAtPnN0YXRzLm1hY19jdXJyZW50X3BhdGgJCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX2N1cnJlbnRfcGF0aDsKKwltZW1jcHkoYnAtPnN0YXRzLm1hY191cHN0cmVhbV9uYnIsICZicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfdXBzdHJlYW1fbmJyLCBGRERJX0tfQUxFTik7CisJbWVtY3B5KGJwLT5zdGF0cy5tYWNfZG93bnN0cmVhbV9uYnIsICZicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfZG93bnN0cmVhbV9uYnIsIEZERElfS19BTEVOKTsKKwltZW1jcHkoYnAtPnN0YXRzLm1hY19vbGRfdXBzdHJlYW1fbmJyLCAmYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX29sZF91cHN0cmVhbV9uYnIsIEZERElfS19BTEVOKTsKKwltZW1jcHkoYnAtPnN0YXRzLm1hY19vbGRfZG93bnN0cmVhbV9uYnIsICZicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfb2xkX2Rvd25zdHJlYW1fbmJyLCBGRERJX0tfQUxFTik7CisJYnAtPnN0YXRzLm1hY19kdXBfYWRkcmVzc190ZXN0CQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX2R1cF9hZGRyZXNzX3Rlc3Q7CisJYnAtPnN0YXRzLm1hY19yZXF1ZXN0ZWRfcGF0aHMJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfcmVxdWVzdGVkX3BhdGhzOworCWJwLT5zdGF0cy5tYWNfZG93bnN0cmVhbV9wb3J0X3R5cGUJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY19kb3duc3RyZWFtX3BvcnRfdHlwZTsKKwltZW1jcHkoYnAtPnN0YXRzLm1hY19zbXRfYWRkcmVzcywgJmJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY19zbXRfYWRkcmVzcywgRkRESV9LX0FMRU4pOworCWJwLT5zdGF0cy5tYWNfdF9yZXEJCQkJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfdF9yZXE7CisJYnAtPnN0YXRzLm1hY190X25lZwkJCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY190X25lZzsKKwlicC0+c3RhdHMubWFjX3RfbWF4CQkJCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX3RfbWF4OworCWJwLT5zdGF0cy5tYWNfdHZ4X3ZhbHVlCQkJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfdHZ4X3ZhbHVlOworCWJwLT5zdGF0cy5tYWNfZnJhbWVfZXJyb3JfdGhyZXNob2xkCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfZnJhbWVfZXJyb3JfdGhyZXNob2xkOworCWJwLT5zdGF0cy5tYWNfZnJhbWVfZXJyb3JfcmF0aW8JCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfZnJhbWVfZXJyb3JfcmF0aW87CisJYnAtPnN0YXRzLm1hY19ybXRfc3RhdGUJCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY19ybXRfc3RhdGU7CisJYnAtPnN0YXRzLm1hY19kYV9mbGFnCQkJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfZGFfZmxhZzsKKwlicC0+c3RhdHMubWFjX3VuYV9kYV9mbGFnCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY191bmRhX2ZsYWc7CisJYnAtPnN0YXRzLm1hY19mcmFtZV9lcnJvcl9mbGFnCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX2ZyYW1lX2Vycm9yX2ZsYWc7CisJYnAtPnN0YXRzLm1hY19tYV91bml0ZGF0YV9hdmFpbGFibGUJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY19tYV91bml0ZGF0YV9hdmFpbGFibGU7CisJYnAtPnN0YXRzLm1hY19oYXJkd2FyZV9wcmVzZW50CQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX2hhcmR3YXJlX3ByZXNlbnQ7CisJYnAtPnN0YXRzLm1hY19tYV91bml0ZGF0YV9lbmFibGUJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY19tYV91bml0ZGF0YV9lbmFibGU7CisJYnAtPnN0YXRzLnBhdGhfdHZ4X2xvd2VyX2JvdW5kCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucGF0aF90dnhfbG93ZXJfYm91bmQ7CisJYnAtPnN0YXRzLnBhdGhfdF9tYXhfbG93ZXJfYm91bmQJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBhdGhfdF9tYXhfbG93ZXJfYm91bmQ7CisJYnAtPnN0YXRzLnBhdGhfbWF4X3RfcmVxCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBhdGhfbWF4X3RfcmVxOworCW1lbWNweShicC0+c3RhdHMucGF0aF9jb25maWd1cmF0aW9uLCAmYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucGF0aF9jb25maWd1cmF0aW9uLCBzaXplb2YoYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucGF0aF9jb25maWd1cmF0aW9uKSk7CisJYnAtPnN0YXRzLnBvcnRfbXlfdHlwZVswXQkJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X215X3R5cGVbMF07CisJYnAtPnN0YXRzLnBvcnRfbXlfdHlwZVsxXQkJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X215X3R5cGVbMV07CisJYnAtPnN0YXRzLnBvcnRfbmVpZ2hib3JfdHlwZVswXQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbmVpZ2hib3JfdHlwZVswXTsKKwlicC0+c3RhdHMucG9ydF9uZWlnaGJvcl90eXBlWzFdCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9uZWlnaGJvcl90eXBlWzFdOworCWJwLT5zdGF0cy5wb3J0X2Nvbm5lY3Rpb25fcG9saWNpZXNbMF0JCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9jb25uZWN0aW9uX3BvbGljaWVzWzBdOworCWJwLT5zdGF0cy5wb3J0X2Nvbm5lY3Rpb25fcG9saWNpZXNbMV0JCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9jb25uZWN0aW9uX3BvbGljaWVzWzFdOworCWJwLT5zdGF0cy5wb3J0X21hY19pbmRpY2F0ZWRbMF0JCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X21hY19pbmRpY2F0ZWRbMF07CisJYnAtPnN0YXRzLnBvcnRfbWFjX2luZGljYXRlZFsxXQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbWFjX2luZGljYXRlZFsxXTsKKwlicC0+c3RhdHMucG9ydF9jdXJyZW50X3BhdGhbMF0JCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2N1cnJlbnRfcGF0aFswXTsKKwlicC0+c3RhdHMucG9ydF9jdXJyZW50X3BhdGhbMV0JCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2N1cnJlbnRfcGF0aFsxXTsKKwltZW1jcHkoJmJwLT5zdGF0cy5wb3J0X3JlcXVlc3RlZF9wYXRoc1swKjNdLCAmYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9yZXF1ZXN0ZWRfcGF0aHNbMF0sIDMpOworCW1lbWNweSgmYnAtPnN0YXRzLnBvcnRfcmVxdWVzdGVkX3BhdGhzWzEqM10sICZicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X3JlcXVlc3RlZF9wYXRoc1sxXSwgMyk7CisJYnAtPnN0YXRzLnBvcnRfbWFjX3BsYWNlbWVudFswXQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbWFjX3BsYWNlbWVudFswXTsKKwlicC0+c3RhdHMucG9ydF9tYWNfcGxhY2VtZW50WzFdCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9tYWNfcGxhY2VtZW50WzFdOworCWJwLT5zdGF0cy5wb3J0X2F2YWlsYWJsZV9wYXRoc1swXQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9hdmFpbGFibGVfcGF0aHNbMF07CisJYnAtPnN0YXRzLnBvcnRfYXZhaWxhYmxlX3BhdGhzWzFdCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2F2YWlsYWJsZV9wYXRoc1sxXTsKKwlicC0+c3RhdHMucG9ydF9wbWRfY2xhc3NbMF0JCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9wbWRfY2xhc3NbMF07CisJYnAtPnN0YXRzLnBvcnRfcG1kX2NsYXNzWzFdCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfcG1kX2NsYXNzWzFdOworCWJwLT5zdGF0cy5wb3J0X2Nvbm5lY3Rpb25fY2FwYWJpbGl0aWVzWzBdCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9jb25uZWN0aW9uX2NhcGFiaWxpdGllc1swXTsKKwlicC0+c3RhdHMucG9ydF9jb25uZWN0aW9uX2NhcGFiaWxpdGllc1sxXQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfY29ubmVjdGlvbl9jYXBhYmlsaXRpZXNbMV07CisJYnAtPnN0YXRzLnBvcnRfYnNfZmxhZ1swXQkJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2JzX2ZsYWdbMF07CisJYnAtPnN0YXRzLnBvcnRfYnNfZmxhZ1sxXQkJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2JzX2ZsYWdbMV07CisJYnAtPnN0YXRzLnBvcnRfbGVyX2VzdGltYXRlWzBdCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9sZXJfZXN0aW1hdGVbMF07CisJYnAtPnN0YXRzLnBvcnRfbGVyX2VzdGltYXRlWzFdCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9sZXJfZXN0aW1hdGVbMV07CisJYnAtPnN0YXRzLnBvcnRfbGVyX2N1dG9mZlswXQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbGVyX2N1dG9mZlswXTsKKwlicC0+c3RhdHMucG9ydF9sZXJfY3V0b2ZmWzFdCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9sZXJfY3V0b2ZmWzFdOworCWJwLT5zdGF0cy5wb3J0X2xlcl9hbGFybVswXQkJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2xlcl9hbGFybVswXTsKKwlicC0+c3RhdHMucG9ydF9sZXJfYWxhcm1bMV0JCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9sZXJfYWxhcm1bMV07CisJYnAtPnN0YXRzLnBvcnRfY29ubmVjdF9zdGF0ZVswXQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfY29ubmVjdF9zdGF0ZVswXTsKKwlicC0+c3RhdHMucG9ydF9jb25uZWN0X3N0YXRlWzFdCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9jb25uZWN0X3N0YXRlWzFdOworCWJwLT5zdGF0cy5wb3J0X3BjbV9zdGF0ZVswXQkJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X3BjbV9zdGF0ZVswXTsKKwlicC0+c3RhdHMucG9ydF9wY21fc3RhdGVbMV0JCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9wY21fc3RhdGVbMV07CisJYnAtPnN0YXRzLnBvcnRfcGNfd2l0aGhvbGRbMF0JCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X3BjX3dpdGhob2xkWzBdOworCWJwLT5zdGF0cy5wb3J0X3BjX3dpdGhob2xkWzFdCQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9wY193aXRoaG9sZFsxXTsKKwlicC0+c3RhdHMucG9ydF9sZXJfZmxhZ1swXQkJCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2xlcl9mbGFnWzBdOworCWJwLT5zdGF0cy5wb3J0X2xlcl9mbGFnWzFdCQkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbGVyX2ZsYWdbMV07CisJYnAtPnN0YXRzLnBvcnRfaGFyZHdhcmVfcHJlc2VudFswXQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9oYXJkd2FyZV9wcmVzZW50WzBdOworCWJwLT5zdGF0cy5wb3J0X2hhcmR3YXJlX3ByZXNlbnRbMV0JCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfaGFyZHdhcmVfcHJlc2VudFsxXTsKKworCS8qIEdldCBGRERJIGNvdW50ZXJzICovCisKKwlicC0+Y21kX3JlcV92aXJ0LT5jbWRfdHlwZSA9IFBJX0NNRF9LX0NOVFJTX0dFVDsKKwlpZiAoZGZ4X2h3X2RtYV9jbWRfcmVxKGJwKSAhPSBERlhfS19TVUNDRVNTKQorCQlyZXR1cm4oKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopICZicC0+c3RhdHMpOworCisJLyogRmlsbCB0aGUgYnAtPnN0YXRzIHN0cnVjdHVyZSB3aXRoIHRoZSBGRERJIGNvdW50ZXIgdmFsdWVzICovCisKKwlicC0+c3RhdHMubWFjX2ZyYW1lX2N0cwkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPmNudHJzX2dldC5jbnRycy5mcmFtZV9jbnQubHM7CisJYnAtPnN0YXRzLm1hY19jb3BpZWRfY3RzCQkJPSBicC0+Y21kX3JzcF92aXJ0LT5jbnRyc19nZXQuY250cnMuY29waWVkX2NudC5sczsKKwlicC0+c3RhdHMubWFjX3RyYW5zbWl0X2N0cwkJCT0gYnAtPmNtZF9yc3BfdmlydC0+Y250cnNfZ2V0LmNudHJzLnRyYW5zbWl0X2NudC5sczsKKwlicC0+c3RhdHMubWFjX2Vycm9yX2N0cwkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPmNudHJzX2dldC5jbnRycy5lcnJvcl9jbnQubHM7CisJYnAtPnN0YXRzLm1hY19sb3N0X2N0cwkJCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPmNudHJzX2dldC5jbnRycy5sb3N0X2NudC5sczsKKwlicC0+c3RhdHMucG9ydF9sY3RfZmFpbF9jdHNbMF0JCT0gYnAtPmNtZF9yc3BfdmlydC0+Y250cnNfZ2V0LmNudHJzLmxjdF9yZWplY3RzWzBdLmxzOworCWJwLT5zdGF0cy5wb3J0X2xjdF9mYWlsX2N0c1sxXQkJPSBicC0+Y21kX3JzcF92aXJ0LT5jbnRyc19nZXQuY250cnMubGN0X3JlamVjdHNbMV0ubHM7CisJYnAtPnN0YXRzLnBvcnRfbGVtX3JlamVjdF9jdHNbMF0JPSBicC0+Y21kX3JzcF92aXJ0LT5jbnRyc19nZXQuY250cnMubGVtX3JlamVjdHNbMF0ubHM7CisJYnAtPnN0YXRzLnBvcnRfbGVtX3JlamVjdF9jdHNbMV0JPSBicC0+Y21kX3JzcF92aXJ0LT5jbnRyc19nZXQuY250cnMubGVtX3JlamVjdHNbMV0ubHM7CisJYnAtPnN0YXRzLnBvcnRfbGVtX2N0c1swXQkJCT0gYnAtPmNtZF9yc3BfdmlydC0+Y250cnNfZ2V0LmNudHJzLmxpbmtfZXJyb3JzWzBdLmxzOworCWJwLT5zdGF0cy5wb3J0X2xlbV9jdHNbMV0JCQk9IGJwLT5jbWRfcnNwX3ZpcnQtPmNudHJzX2dldC5jbnRycy5saW5rX2Vycm9yc1sxXS5sczsKKworCXJldHVybigoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikgJmJwLT5zdGF0cyk7CisJfQorCisMCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiA9IGRmeF9jdGxfc2V0X211bHRpY2FzdF9saXN0ID0KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBFbmFibGUvRGlzYWJsZSBMTEMgZnJhbWUgcHJvbWlzY3VvdXMgbW9kZSByZWNlcHRpb24KKyAqICAgb24gdGhlIGFkYXB0ZXIgYW5kL29yIHVwZGF0ZSBtdWx0aWNhc3QgYWRkcmVzcyB0YWJsZS4KKyAqICAKKyAqIFJldHVybnM6CisgKiAgIE5vbmUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBkZXYgLSBwb2ludGVyIHRvIGRldmljZSBpbmZvcm1hdGlvbgorICoKKyAqIEZ1bmN0aW9uYWwgRGVzY3JpcHRpb246CisgKiAgIFRoaXMgcm91dGluZSBmb2xsb3dzIGEgZmFpcmx5IHNpbXBsZSBhbGdvcml0aG0gZm9yIHNldHRpbmcgdGhlCisgKiAgIGFkYXB0ZXIgZmlsdGVycyBhbmQgQ0FNOgorICoKKyAqCQlpZiBJRkZfUFJPTUlTQyBmbGFnIGlzIHNldAorICoJCQllbmFibGUgTExDIGluZGl2aWR1YWwvZ3JvdXAgcHJvbWlzY3VvdXMgbW9kZQorICoJCWVsc2UKKyAqCQkJZGlzYWJsZSBMTEMgaW5kaXZpZHVhbC9ncm91cCBwcm9taXNjdW91cyBtb2RlCisgKgkJCWlmIG51bWJlciBvZiBpbmNvbWluZyBtdWx0aWNhc3QgYWRkcmVzc2VzID4KKyAqCQkJCQkoQ0FNIG1heCBzaXplIC0gbnVtYmVyIG9mIHVuaWNhc3QgYWRkcmVzc2VzIGluIENBTSkKKyAqCQkJCWVuYWJsZSBMTEMgZ3JvdXAgcHJvbWlzY3VvdXMgbW9kZQorICoJCQkJc2V0IGRyaXZlci1tYWludGFpbmVkIG11bHRpY2FzdCBhZGRyZXNzIGNvdW50IHRvIHplcm8KKyAqCQkJZWxzZQorICoJCQkJZGlzYWJsZSBMTEMgZ3JvdXAgcHJvbWlzY3VvdXMgbW9kZQorICoJCQkJc2V0IGRyaXZlci1tYWludGFpbmVkIG11bHRpY2FzdCBhZGRyZXNzIGNvdW50IHRvIGluY29taW5nIGNvdW50CisgKgkJCXVwZGF0ZSBhZGFwdGVyIENBTQorICoJCXVwZGF0ZSBhZGFwdGVyIGZpbHRlcnMKKyAqCisgKiBSZXR1cm4gQ29kZXM6CisgKiAgIE5vbmUKKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqICAgTXVsdGljYXN0IGFkZHJlc3NlcyBhcmUgcHJlc2VudGVkIGluIGNhbm9uaWNhbCAoTFNCKSBmb3JtYXQuCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBPbi1ib2FyZCBhZGFwdGVyIENBTSBhbmQgZmlsdGVycyBhcmUgdXBkYXRlZC4KKyAqLworCitzdGF0aWMgdm9pZCBkZnhfY3RsX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorCXsKKwlERlhfYm9hcmRfdAkJCSpicCA9IGRldi0+cHJpdjsKKwlpbnQJCQkJCWk7CQkJLyogdXNlZCBhcyBpbmRleCBpbiBmb3IgbG9vcCAqLworCXN0cnVjdCBkZXZfbWNfbGlzdAkqZG1pOwkJLyogcHRyIHRvIG11bHRpY2FzdCBhZGRyIGVudHJ5ICovCisKKwkvKiBFbmFibGUgTExDIGZyYW1lIHByb21pc2N1b3VzIG1vZGUsIGlmIG5lY2Vzc2FyeSAqLworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJYnAtPmluZF9ncm91cF9wcm9tID0gUElfRlNUQVRFX0tfUEFTUzsJCS8qIEVuYWJsZSBMTEMgaW5kL2dyb3VwIHByb20gbW9kZSAqLworCisJLyogRWxzZSwgdXBkYXRlIG11bHRpY2FzdCBhZGRyZXNzIHRhYmxlICovCisKKwllbHNlCisJCXsKKwkJYnAtPmluZF9ncm91cF9wcm9tID0gUElfRlNUQVRFX0tfQkxPQ0s7CQkvKiBEaXNhYmxlIExMQyBpbmQvZ3JvdXAgcHJvbSBtb2RlICovCisJCS8qCisJCSAqIENoZWNrIHdoZXRoZXIgaW5jb21pbmcgbXVsdGljYXN0IGFkZHJlc3MgY291bnQgZXhjZWVkcyB0YWJsZSBzaXplCisJCSAqCisJCSAqIE5vdGU6IFRoZSBhZGFwdGVycyB1dGlsaXplIGFuIG9uLWJvYXJkIDY0IGVudHJ5IENBTSBmb3IKKwkJICogICAgICAgc3VwcG9ydGluZyBwZXJmZWN0IGZpbHRlcmluZyBvZiBtdWx0aWNhc3QgcGFja2V0cworCQkgKgkJIGFuZCBicmlkZ2UgZnVuY3Rpb25zIHdoZW4gYWRkaW5nIHVuaWNhc3QgYWRkcmVzc2VzLgorCQkgKgkJIFRoZXJlIGlzIG5vIGhhc2ggZnVuY3Rpb24gYXZhaWxhYmxlLiAgVG8gc3VwcG9ydAorCQkgKgkJIGFkZGl0aW9uYWwgbXVsdGljYXN0IGFkZHJlc3NlcywgdGhlIGFsbCBtdWx0aWNhc3QKKwkJICoJCSBmaWx0ZXIgKExMQyBncm91cCBwcm9taXNjdW91cyBtb2RlKSBtdXN0IGJlIGVuYWJsZWQuCisJCSAqCisJCSAqCQkgVGhlIGZpcm13YXJlIHJlc2VydmVzIHR3byBDQU0gZW50cmllcyBmb3IgU01ULXJlbGF0ZWQKKwkJICoJCSBtdWx0aWNhc3QgYWRkcmVzc2VzLCB3aGljaCBsZWF2ZXMgNjIgZW50cmllcyBhdmFpbGFibGUuCisJCSAqCQkgVGhlIGZvbGxvd2luZyBjb2RlIGVuc3VyZXMgdGhhdCB3ZSdyZSBub3QgYmVpbmcgYXNrZWQKKwkJICoJCSB0byBhZGQgbW9yZSB0aGFuIDYyIGFkZHJlc3NlcyB0byB0aGUgQ0FNLiAgSWYgd2UgYXJlLAorCQkgKgkJIHRoZSBkcml2ZXIgd2lsbCBlbmFibGUgdGhlIGFsbCBtdWx0aWNhc3QgZmlsdGVyLgorCQkgKgkJIFNob3VsZCB0aGUgbnVtYmVyIG9mIG11bHRpY2FzdCBhZGRyZXNzZXMgZHJvcCBiZWxvdworCQkgKgkJIHRoZSBoaWdoIHdhdGVyIG1hcmssIHRoZSBmaWx0ZXIgd2lsbCBiZSBkaXNhYmxlZCBhbmQKKwkJICoJCSBwZXJmZWN0IGZpbHRlcmluZyB3aWxsIGJlIHVzZWQuCisJCSAqLworCisJCWlmIChkZXYtPm1jX2NvdW50ID4gKFBJX0NNRF9BRERSX0ZJTFRFUl9LX1NJWkUgLSBicC0+dWNfY291bnQpKQorCQkJeworCQkJYnAtPmdyb3VwX3Byb20JPSBQSV9GU1RBVEVfS19QQVNTOwkJLyogRW5hYmxlIExMQyBncm91cCBwcm9tIG1vZGUgKi8KKwkJCWJwLT5tY19jb3VudAk9IDA7CQkJCQkvKiBEb24ndCBhZGQgbWMgYWRkcnMgdG8gQ0FNICovCisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWJwLT5ncm91cF9wcm9tCT0gUElfRlNUQVRFX0tfQkxPQ0s7CS8qIERpc2FibGUgTExDIGdyb3VwIHByb20gbW9kZSAqLworCQkJYnAtPm1jX2NvdW50CT0gZGV2LT5tY19jb3VudDsJCS8qIEFkZCBtYyBhZGRycyB0byBDQU0gKi8KKwkJCX0KKworCQkvKiBDb3B5IGFkZHJlc3NlcyB0byBtdWx0aWNhc3QgYWRkcmVzcyB0YWJsZSwgdGhlbiB1cGRhdGUgYWRhcHRlciBDQU0gKi8KKworCQlkbWkgPSBkZXYtPm1jX2xpc3Q7CQkJCS8qIHBvaW50IHRvIGZpcnN0IG11bHRpY2FzdCBhZGRyICovCisJCWZvciAoaT0wOyBpIDwgYnAtPm1jX2NvdW50OyBpKyspCisJCQl7CisJCQltZW1jcHkoJmJwLT5tY190YWJsZVtpKkZERElfS19BTEVOXSwgZG1pLT5kbWlfYWRkciwgRkRESV9LX0FMRU4pOworCQkJZG1pID0gZG1pLT5uZXh0OwkJCS8qIHBvaW50IHRvIG5leHQgbXVsdGljYXN0IGFkZHIgKi8KKwkJCX0KKwkJaWYgKGRmeF9jdGxfdXBkYXRlX2NhbShicCkgIT0gREZYX0tfU1VDQ0VTUykKKwkJCXsKKwkJCURCR19wcmludGsoIiVzOiBDb3VsZCBub3QgdXBkYXRlIG11bHRpY2FzdCBhZGRyZXNzIHRhYmxlIVxuIiwgZGV2LT5uYW1lKTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJREJHX3ByaW50aygiJXM6IE11bHRpY2FzdCBhZGRyZXNzIHRhYmxlIHVwZGF0ZWQhICBBZGRlZCAlZCBhZGRyZXNzZXMuXG4iLCBkZXYtPm5hbWUsIGJwLT5tY19jb3VudCk7CisJCQl9CisJCX0KKworCS8qIFVwZGF0ZSBhZGFwdGVyIGZpbHRlcnMgKi8KKworCWlmIChkZnhfY3RsX3VwZGF0ZV9maWx0ZXJzKGJwKSAhPSBERlhfS19TVUNDRVNTKQorCQl7CisJCURCR19wcmludGsoIiVzOiBDb3VsZCBub3QgdXBkYXRlIGFkYXB0ZXIgZmlsdGVycyFcbiIsIGRldi0+bmFtZSk7CisJCX0KKwllbHNlCisJCXsKKwkJREJHX3ByaW50aygiJXM6IEFkYXB0ZXIgZmlsdGVycyB1cGRhdGVkIVxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCX0KKworDAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogPSBkZnhfY3RsX3NldF9tYWNfYWRkcmVzcyA9CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgCisgKiBPdmVydmlldzoKKyAqICAgQWRkIG5vZGUgYWRkcmVzcyBvdmVycmlkZSAodW5pY2FzdCBhZGRyZXNzKSB0byBhZGFwdGVyCisgKiAgIENBTSBhbmQgdXBkYXRlIGRldl9hZGRyIGZpZWxkIGluIGRldmljZSB0YWJsZS4KKyAqICAKKyAqIFJldHVybnM6CisgKiAgIE5vbmUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBkZXYgIC0gcG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24KKyAqICAgYWRkciAtIHBvaW50ZXIgdG8gc29ja2FkZHIgc3RydWN0dXJlIGNvbnRhaW5pbmcgdW5pY2FzdCBhZGRyZXNzIHRvIGFkZAorICoKKyAqIEZ1bmN0aW9uYWwgRGVzY3JpcHRpb246CisgKiAgIFRoZSBhZGFwdGVyIHN1cHBvcnRzIG5vZGUgYWRkcmVzcyBvdmVycmlkZXMgYnkgYWRkaW5nIG9uZSBvciBtb3JlCisgKiAgIHVuaWNhc3QgYWRkcmVzc2VzIHRvIHRoZSBhZGFwdGVyIENBTS4gIFRoaXMgaXMgc2ltaWxhciB0byBhZGRpbmcKKyAqICAgbXVsdGljYXN0IGFkZHJlc3Nlcy4gIEluIHRoaXMgcm91dGluZSB3ZSdsbCB1cGRhdGUgdGhlIGRyaXZlciBhbmQKKyAqICAgZGV2aWNlIHN0cnVjdHVyZXMgd2l0aCB0aGUgbmV3IGFkZHJlc3MsIHRoZW4gdXBkYXRlIHRoZSBhZGFwdGVyIENBTQorICogICB0byBlbnN1cmUgdGhhdCB0aGUgYWRhcHRlciB3aWxsIGNvcHkgYW5kIHN0cmlwIGZyYW1lcyBkZXN0aW5lZCBhbmQKKyAqICAgc291cmNlZCBieSB0aGF0IGFkZHJlc3MuCisgKgorICogUmV0dXJuIENvZGVzOgorICogICBBbHdheXMgcmV0dXJucyB6ZXJvLgorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBUaGUgYWRkcmVzcyBwb2ludGVkIHRvIGJ5IGFkZHItPnNhX2RhdGEgaXMgYSB2YWxpZCB1bmljYXN0CisgKiAgIGFkZHJlc3MgYW5kIGlzIHByZXNlbnRlZCBpbiBjYW5vbmljYWwgKExTQikgZm9ybWF0LgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgT24tYm9hcmQgYWRhcHRlciBDQU0gaXMgdXBkYXRlZC4gIE9uLWJvYXJkIGFkYXB0ZXIgZmlsdGVycworICogICBtYXkgYmUgdXBkYXRlZC4KKyAqLworCitzdGF0aWMgaW50IGRmeF9jdGxfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCisJeworCURGWF9ib2FyZF90CQkqYnAgPSBkZXYtPnByaXY7CisJc3RydWN0IHNvY2thZGRyCSpwX3NvY2thZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKWFkZHI7CisKKwkvKiBDb3B5IHVuaWNhc3QgYWRkcmVzcyB0byBkcml2ZXItbWFpbnRhaW5lZCBzdHJ1Y3RzIGFuZCB1cGRhdGUgY291bnQgKi8KKworCW1lbWNweShkZXYtPmRldl9hZGRyLCBwX3NvY2thZGRyLT5zYV9kYXRhLCBGRERJX0tfQUxFTik7CS8qIHVwZGF0ZSBkZXZpY2Ugc3RydWN0ICovCisJbWVtY3B5KCZicC0+dWNfdGFibGVbMF0sIHBfc29ja2FkZHItPnNhX2RhdGEsIEZERElfS19BTEVOKTsJLyogdXBkYXRlIGRyaXZlciBzdHJ1Y3QgKi8KKwlicC0+dWNfY291bnQgPSAxOworCisJLyoKKwkgKiBWZXJpZnkgd2UncmUgbm90IGV4Y2VlZGluZyB0aGUgQ0FNIHNpemUgYnkgYWRkaW5nIHVuaWNhc3QgYWRkcmVzcworCSAqCisJICogTm90ZTogSXQncyBwb3NzaWJsZSB0aGF0IGJlZm9yZSBlbnRlcmluZyB0aGlzIHJvdXRpbmUgd2UndmUKKwkgKiAgICAgICBhbHJlYWR5IGZpbGxlZCB0aGUgQ0FNIHdpdGggNjIgbXVsdGljYXN0IGFkZHJlc3Nlcy4KKwkgKgkJIFNpbmNlIHdlIG5lZWQgdG8gcGxhY2UgdGhlIG5vZGUgYWRkcmVzcyBvdmVycmlkZSBpbnRvCisJICoJCSB0aGUgQ0FNLCB3ZSBoYXZlIHRvIGNoZWNrIHRvIHNlZSB0aGF0IHdlJ3JlIG5vdAorCSAqCQkgZXhjZWVkaW5nIHRoZSBDQU0gc2l6ZS4gIElmIHdlIGFyZSwgd2UgaGF2ZSB0byBlbmFibGUKKwkgKgkJIHRoZSBMTEMgZ3JvdXAgKG11bHRpY2FzdCkgcHJvbWlzY3VvdXMgbW9kZSBmaWx0ZXIgYXMKKwkgKgkJIGluIGRmeF9jdGxfc2V0X211bHRpY2FzdF9saXN0LgorCSAqLworCisJaWYgKChicC0+dWNfY291bnQgKyBicC0+bWNfY291bnQpID4gUElfQ01EX0FERFJfRklMVEVSX0tfU0laRSkKKwkJeworCQlicC0+Z3JvdXBfcHJvbQk9IFBJX0ZTVEFURV9LX1BBU1M7CQkvKiBFbmFibGUgTExDIGdyb3VwIHByb20gbW9kZSAqLworCQlicC0+bWNfY291bnQJPSAwOwkJCQkJLyogRG9uJ3QgYWRkIG1jIGFkZHJzIHRvIENBTSAqLworCisJCS8qIFVwZGF0ZSBhZGFwdGVyIGZpbHRlcnMgKi8KKworCQlpZiAoZGZ4X2N0bF91cGRhdGVfZmlsdGVycyhicCkgIT0gREZYX0tfU1VDQ0VTUykKKwkJCXsKKwkJCURCR19wcmludGsoIiVzOiBDb3VsZCBub3QgdXBkYXRlIGFkYXB0ZXIgZmlsdGVycyFcbiIsIGRldi0+bmFtZSk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCURCR19wcmludGsoIiVzOiBBZGFwdGVyIGZpbHRlcnMgdXBkYXRlZCFcbiIsIGRldi0+bmFtZSk7CisJCQl9CisJCX0KKworCS8qIFVwZGF0ZSBhZGFwdGVyIENBTSB3aXRoIG5ldyB1bmljYXN0IGFkZHJlc3MgKi8KKworCWlmIChkZnhfY3RsX3VwZGF0ZV9jYW0oYnApICE9IERGWF9LX1NVQ0NFU1MpCisJCXsKKwkJREJHX3ByaW50aygiJXM6IENvdWxkIG5vdCBzZXQgbmV3IE1BQyBhZGRyZXNzIVxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCWVsc2UKKwkJeworCQlEQkdfcHJpbnRrKCIlczogQWRhcHRlciBDQU0gdXBkYXRlZCB3aXRoIG5ldyBNQUMgYWRkcmVzc1xuIiwgZGV2LT5uYW1lKTsKKwkJfQorCXJldHVybigwKTsJCQkvKiBhbHdheXMgcmV0dXJuIHplcm8gKi8KKwl9CisKKwwKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09CisgKiA9IGRmeF9jdGxfdXBkYXRlX2NhbSA9CisgKiA9PT09PT09PT09PT09PT09PT09PT09CisgKgorICogT3ZlcnZpZXc6CisgKiAgIFByb2NlZHVyZSB0byB1cGRhdGUgYWRhcHRlciBDQU0gKENvbnRlbnQgQWRkcmVzc2FibGUgTWVtb3J5KQorICogICB3aXRoIGRlc2lyZWQgdW5pY2FzdCBhbmQgbXVsdGljYXN0IGFkZHJlc3MgZW50cmllcy4KKyAqCisgKiBSZXR1cm5zOgorICogICBDb25kaXRpb24gY29kZQorICoKKyAqIEFyZ3VtZW50czoKKyAqICAgYnAgLSBwb2ludGVyIHRvIGJvYXJkIGluZm9ybWF0aW9uCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgVXBkYXRlcyBhZGFwdGVyIENBTSB3aXRoIGN1cnJlbnQgY29udGVudHMgb2YgYm9hcmQgc3RydWN0dXJlCisgKiAgIHVuaWNhc3QgYW5kIG11bHRpY2FzdCBhZGRyZXNzIHRhYmxlcy4gIFNpbmNlIHRoZXJlIGFyZSBvbmx5IDYyCisgKiAgIGZyZWUgZW50cmllcyBpbiBDQU0sIHRoaXMgcm91dGluZSBlbnN1cmVzIHRoYXQgdGhlIGNvbW1hbmQKKyAqICAgcmVxdWVzdCBidWZmZXIgaXMgbm90IG92ZXJydW4uCisgKgorICogUmV0dXJuIENvZGVzOgorICogICBERlhfS19TVUNDRVNTIC0gUmVxdWVzdCBzdWNjZWVkZWQKKyAqICAgREZYX0tfRkFJTFVSRSAtIFJlcXVlc3QgZmFpbGVkCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIEFsbCBhZGRyZXNzZXMgYmVpbmcgYWRkZWQgKHVuaWNhc3QgYW5kIG11bHRpY2FzdCkgYXJlIGluIGNhbm9uaWNhbAorICogICBvcmRlci4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIE9uLWJvYXJkIGFkYXB0ZXIgQ0FNIGlzIHVwZGF0ZWQuCisgKi8KKworc3RhdGljIGludCBkZnhfY3RsX3VwZGF0ZV9jYW0oREZYX2JvYXJkX3QgKmJwKQorCXsKKwlpbnQJCQlpOwkJCQkvKiB1c2VkIGFzIGluZGV4ICovCisJUElfTEFOX0FERFIJKnBfYWRkcjsJCS8qIHBvaW50ZXIgdG8gQ0FNIGVudHJ5ICovCisKKwkvKgorCSAqIEZpbGwgaW4gY29tbWFuZCByZXF1ZXN0IGluZm9ybWF0aW9uCisJICoKKwkgKiBOb3RlOiBFdmVuIHRob3VnaCBib3RoIHRoZSB1bmljYXN0IGFuZCBtdWx0aWNhc3QgYWRkcmVzcworCSAqICAgICAgIHRhYmxlIGVudHJpZXMgYXJlIHN0b3JlZCBhcyBjb250aWd1b3VzIDYgYnl0ZSBlbnRyaWVzLAorCSAqCQkgdGhlIGZpcm13YXJlIGFkZHJlc3MgZmlsdGVyIHNldCBjb21tYW5kIGV4cGVjdHMgZWFjaAorCSAqCQkgZW50cnkgdG8gYmUgdHdvIGxvbmd3b3JkcyAoOCBieXRlcyB0b3RhbCkuICBXZSBtdXN0IGJlCisJICoJCSBjYXJlZnVsIHRvIG9ubHkgY29weSB0aGUgc2l4IGJ5dGVzIG9mIGVhY2ggdW5pY2FzdCBhbmQKKwkgKgkJIG11bHRpY2FzdCB0YWJsZSBlbnRyeSBpbnRvIGVhY2ggY29tbWFuZCBlbnRyeS4gIFRoaXMKKwkgKgkJIGlzIGFsc28gd2h5IHdlIG11c3QgZmlyc3QgY2xlYXIgdGhlIGVudGlyZSBjb21tYW5kCisJICoJCSByZXF1ZXN0IGJ1ZmZlci4KKwkgKi8KKworCW1lbXNldChicC0+Y21kX3JlcV92aXJ0LCAwLCBQSV9DTURfUkVRX0tfU0laRV9NQVgpOwkvKiBmaXJzdCBjbGVhciBidWZmZXIgKi8KKwlicC0+Y21kX3JlcV92aXJ0LT5jbWRfdHlwZSA9IFBJX0NNRF9LX0FERFJfRklMVEVSX1NFVDsKKwlwX2FkZHIgPSAmYnAtPmNtZF9yZXFfdmlydC0+YWRkcl9maWx0ZXJfc2V0LmVudHJ5WzBdOworCisJLyogTm93IGFkZCB1bmljYXN0IGFkZHJlc3NlcyB0byBjb21tYW5kIHJlcXVlc3QgYnVmZmVyLCBpZiBhbnkgKi8KKworCWZvciAoaT0wOyBpIDwgKGludClicC0+dWNfY291bnQ7IGkrKykKKwkJeworCQlpZiAoaSA8IFBJX0NNRF9BRERSX0ZJTFRFUl9LX1NJWkUpCisJCQl7CisJCQltZW1jcHkocF9hZGRyLCAmYnAtPnVjX3RhYmxlW2kqRkRESV9LX0FMRU5dLCBGRERJX0tfQUxFTik7CisJCQlwX2FkZHIrKzsJCQkvKiBwb2ludCB0byBuZXh0IGNvbW1hbmQgZW50cnkgKi8KKwkJCX0KKwkJfQorCisJLyogTm93IGFkZCBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIGNvbW1hbmQgcmVxdWVzdCBidWZmZXIsIGlmIGFueSAqLworCisJZm9yIChpPTA7IGkgPCAoaW50KWJwLT5tY19jb3VudDsgaSsrKQorCQl7CisJCWlmICgoaSArIGJwLT51Y19jb3VudCkgPCBQSV9DTURfQUREUl9GSUxURVJfS19TSVpFKQorCQkJeworCQkJbWVtY3B5KHBfYWRkciwgJmJwLT5tY190YWJsZVtpKkZERElfS19BTEVOXSwgRkRESV9LX0FMRU4pOworCQkJcF9hZGRyKys7CQkJLyogcG9pbnQgdG8gbmV4dCBjb21tYW5kIGVudHJ5ICovCisJCQl9CisJCX0KKworCS8qIElzc3VlIGNvbW1hbmQgdG8gdXBkYXRlIGFkYXB0ZXIgQ0FNLCB0aGVuIHJldHVybiAqLworCisJaWYgKGRmeF9od19kbWFfY21kX3JlcShicCkgIT0gREZYX0tfU1VDQ0VTUykKKwkJcmV0dXJuKERGWF9LX0ZBSUxVUkUpOworCXJldHVybihERlhfS19TVUNDRVNTKTsKKwl9CisKKwwKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PQorICogPSBkZnhfY3RsX3VwZGF0ZV9maWx0ZXJzID0KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogT3ZlcnZpZXc6CisgKiAgIFByb2NlZHVyZSB0byB1cGRhdGUgYWRhcHRlciBmaWx0ZXJzIHdpdGggZGVzaXJlZAorICogICBmaWx0ZXIgc2V0dGluZ3MuCisgKiAgCisgKiBSZXR1cm5zOgorICogICBDb25kaXRpb24gY29kZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGJwIC0gcG9pbnRlciB0byBib2FyZCBpbmZvcm1hdGlvbgorICoKKyAqIEZ1bmN0aW9uYWwgRGVzY3JpcHRpb246CisgKiAgIEVuYWJsZXMgb3IgZGlzYWJsZXMgZmlsdGVyIHVzaW5nIGN1cnJlbnQgZmlsdGVyIHNldHRpbmdzLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgREZYX0tfU1VDQ0VTUyAtIFJlcXVlc3Qgc3VjY2VlZGVkLgorICogICBERlhfS19GQUlMVVJFIC0gUmVxdWVzdCBmYWlsZWQuCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIFdlIG11c3QgYWx3YXlzIHBhc3MgdXAgcGFja2V0cyBkZXN0aW5lZCB0byB0aGUgYnJvYWRjYXN0CisgKiAgIGFkZHJlc3MgKEZGLUZGLUZGLUZGLUZGLUZGKSwgc28gd2UnbGwgYWx3YXlzIGtlZXAgdGhlCisgKiAgIGJyb2FkY2FzdCBmaWx0ZXIgZW5hYmxlZC4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIE9uLWJvYXJkIGFkYXB0ZXIgZmlsdGVycyBhcmUgdXBkYXRlZC4KKyAqLworCitzdGF0aWMgaW50IGRmeF9jdGxfdXBkYXRlX2ZpbHRlcnMoREZYX2JvYXJkX3QgKmJwKQorCXsKKwlpbnQJaSA9IDA7CQkJCQkvKiB1c2VkIGFzIGluZGV4ICovCisKKwkvKiBGaWxsIGluIGNvbW1hbmQgcmVxdWVzdCBpbmZvcm1hdGlvbiAqLworCisJYnAtPmNtZF9yZXFfdmlydC0+Y21kX3R5cGUgPSBQSV9DTURfS19GSUxURVJTX1NFVDsKKworCS8qIEluaXRpYWxpemUgQnJvYWRjYXN0IGZpbHRlciAtICogQUxXQVlTIEVOQUJMRUQgKiAqLworCisJYnAtPmNtZF9yZXFfdmlydC0+ZmlsdGVyX3NldC5pdGVtW2ldLml0ZW1fY29kZQk9IFBJX0lURU1fS19CUk9BRENBU1Q7CisJYnAtPmNtZF9yZXFfdmlydC0+ZmlsdGVyX3NldC5pdGVtW2krK10udmFsdWUJPSBQSV9GU1RBVEVfS19QQVNTOworCisJLyogSW5pdGlhbGl6ZSBMTEMgSW5kaXZpZHVhbC9Hcm91cCBQcm9taXNjdW91cyBmaWx0ZXIgKi8KKworCWJwLT5jbWRfcmVxX3ZpcnQtPmZpbHRlcl9zZXQuaXRlbVtpXS5pdGVtX2NvZGUJPSBQSV9JVEVNX0tfSU5EX0dST1VQX1BST007CisJYnAtPmNtZF9yZXFfdmlydC0+ZmlsdGVyX3NldC5pdGVtW2krK10udmFsdWUJPSBicC0+aW5kX2dyb3VwX3Byb207CisKKwkvKiBJbml0aWFsaXplIExMQyBHcm91cCBQcm9taXNjdW91cyBmaWx0ZXIgKi8KKworCWJwLT5jbWRfcmVxX3ZpcnQtPmZpbHRlcl9zZXQuaXRlbVtpXS5pdGVtX2NvZGUJPSBQSV9JVEVNX0tfR1JPVVBfUFJPTTsKKwlicC0+Y21kX3JlcV92aXJ0LT5maWx0ZXJfc2V0Lml0ZW1baSsrXS52YWx1ZQk9IGJwLT5ncm91cF9wcm9tOworCisJLyogVGVybWluYXRlIHRoZSBpdGVtIGNvZGUgbGlzdCAqLworCisJYnAtPmNtZF9yZXFfdmlydC0+ZmlsdGVyX3NldC5pdGVtW2ldLml0ZW1fY29kZQk9IFBJX0lURU1fS19FT0w7CisKKwkvKiBJc3N1ZSBjb21tYW5kIHRvIHVwZGF0ZSBhZGFwdGVyIGZpbHRlcnMsIHRoZW4gcmV0dXJuICovCisKKwlpZiAoZGZ4X2h3X2RtYV9jbWRfcmVxKGJwKSAhPSBERlhfS19TVUNDRVNTKQorCQlyZXR1cm4oREZYX0tfRkFJTFVSRSk7CisJcmV0dXJuKERGWF9LX1NVQ0NFU1MpOworCX0KKworDAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT0KKyAqID0gZGZ4X2h3X2RtYV9jbWRfcmVxID0KKyAqID09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgCisgKiBPdmVydmlldzoKKyAqICAgU2VuZHMgUERRIERNQSBjb21tYW5kIHRvIGFkYXB0ZXIgZmlybXdhcmUKKyAqICAKKyAqIFJldHVybnM6CisgKiAgIENvbmRpdGlvbiBjb2RlCisgKiAgICAgICAKKyAqIEFyZ3VtZW50czoKKyAqICAgYnAgLSBwb2ludGVyIHRvIGJvYXJkIGluZm9ybWF0aW9uCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgVGhlIGNvbW1hbmQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgYnVmZmVycyBhcmUgcG9zdGVkIHRvIHRoZSBhZGFwdGVyIGluIHRoZSBtYW5uZXIKKyAqICAgZGVzY3JpYmVkIGluIHRoZSBQRFEgUG9ydCBTcGVjaWZpY2F0aW9uOgorICoKKyAqCQkxLiBDb21tYW5kIFJlc3BvbnNlIEJ1ZmZlciBpcyBwb3N0ZWQgdG8gYWRhcHRlci4KKyAqCQkyLiBDb21tYW5kIFJlcXVlc3QgQnVmZmVyIGlzIHBvc3RlZCB0byBhZGFwdGVyLgorICoJCTMuIENvbW1hbmQgUmVxdWVzdCBjb25zdW1lciBpbmRleCBpcyBwb2xsZWQgdW50aWwgaXQgaW5kaWNhdGVzIHRoYXQgcmVxdWVzdAorICogICAgICAgICBidWZmZXIgaGFzIGJlZW4gRE1BJ2QgdG8gYWRhcHRlci4KKyAqCQk0LiBDb21tYW5kIFJlc3BvbnNlIGNvbnN1bWVyIGluZGV4IGlzIHBvbGxlZCB1bnRpbCBpdCBpbmRpY2F0ZXMgdGhhdCByZXNwb25zZQorICogICAgICAgICBidWZmZXIgaGFzIGJlZW4gRE1BJ2QgZnJvbSBhZGFwdGVyLgorICoKKyAqICAgVGhpcyBvcmRlcmluZyBlbnN1cmVzIHRoYXQgYSByZXNwb25zZSBidWZmZXIgaXMgYWxyZWFkeSBhdmFpbGFibGUgZm9yIHRoZSBmaXJtd2FyZQorICogICB0byB1c2Ugb25jZSBpdCdzIGRvbmUgcHJvY2Vzc2luZyB0aGUgcmVxdWVzdCBidWZmZXIuCisgKgorICogUmV0dXJuIENvZGVzOgorICogICBERlhfS19TVUNDRVNTCSAgLSBETUEgY29tbWFuZCBzdWNjZWVkZWQKKyAqIAkgREZYX0tfT1VUU1RBVEUgICAtIEFkYXB0ZXIgaXMgTk9UIGluIHByb3BlciBzdGF0ZQorICogICBERlhfS19IV19USU1FT1VUIC0gRE1BIGNvbW1hbmQgdGltZWQgb3V0CisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIENvbW1hbmQgcmVxdWVzdCBidWZmZXIgaGFzIGFscmVhZHkgYmVlbiBmaWxsZWQgd2l0aCBkZXNpcmVkIERNQSBjb21tYW5kLgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgTm9uZQorICovCisKK3N0YXRpYyBpbnQgZGZ4X2h3X2RtYV9jbWRfcmVxKERGWF9ib2FyZF90ICpicCkKKwl7CisJaW50IHN0YXR1czsJCQkvKiBhZGFwdGVyIHN0YXR1cyAqLworCWludCB0aW1lb3V0X2NudDsJLyogdXNlZCBpbiBmb3IgbG9vcHMgKi8KKwkKKwkvKiBNYWtlIHN1cmUgdGhlIGFkYXB0ZXIgaXMgaW4gYSBzdGF0ZSB0aGF0IHdlIGNhbiBpc3N1ZSB0aGUgRE1BIGNvbW1hbmQgaW4gKi8KKwkKKwlzdGF0dXMgPSBkZnhfaHdfYWRhcF9zdGF0ZV9yZChicCk7CisJaWYgKChzdGF0dXMgPT0gUElfU1RBVEVfS19SRVNFVCkJCXx8CisJCShzdGF0dXMgPT0gUElfU1RBVEVfS19IQUxURUQpCQl8fAorCQkoc3RhdHVzID09IFBJX1NUQVRFX0tfRE1BX1VOQVZBSUwpCXx8CisJCShzdGF0dXMgPT0gUElfU1RBVEVfS19VUEdSQURFKSkKKwkJcmV0dXJuKERGWF9LX09VVFNUQVRFKTsKKworCS8qIFB1dCByZXNwb25zZSBidWZmZXIgb24gdGhlIGNvbW1hbmQgcmVzcG9uc2UgcXVldWUgKi8KKworCWJwLT5kZXNjcl9ibG9ja192aXJ0LT5jbWRfcnNwW2JwLT5jbWRfcnNwX3JlZy5pbmRleC5wcm9kXS5sb25nXzAgPSAodTMyKSAoUElfUkNWX0RFU0NSX01fU09QIHwKKwkJCSgoUElfQ01EX1JTUF9LX1NJWkVfTUFYIC8gUElfQUxJR05fS19DTURfUlNQX0JVRkYpIDw8IFBJX1JDVl9ERVNDUl9WX1NFR19MRU4pKTsKKwlicC0+ZGVzY3JfYmxvY2tfdmlydC0+Y21kX3JzcFticC0+Y21kX3JzcF9yZWcuaW5kZXgucHJvZF0ubG9uZ18xID0gYnAtPmNtZF9yc3BfcGh5czsKKworCS8qIEJ1bXAgKGFuZCB3cmFwKSB0aGUgcHJvZHVjZXIgaW5kZXggYW5kIHdyaXRlIG91dCB0byByZWdpc3RlciAqLworCisJYnAtPmNtZF9yc3BfcmVnLmluZGV4LnByb2QgKz0gMTsKKwlicC0+Y21kX3JzcF9yZWcuaW5kZXgucHJvZCAmPSBQSV9DTURfUlNQX0tfTlVNX0VOVFJJRVMtMTsKKwlkZnhfcG9ydF93cml0ZV9sb25nKGJwLCBQSV9QRFFfS19SRUdfQ01EX1JTUF9QUk9ELCBicC0+Y21kX3JzcF9yZWcubHdvcmQpOworCisJLyogUHV0IHJlcXVlc3QgYnVmZmVyIG9uIHRoZSBjb21tYW5kIHJlcXVlc3QgcXVldWUgKi8KKwkKKwlicC0+ZGVzY3JfYmxvY2tfdmlydC0+Y21kX3JlcVticC0+Y21kX3JlcV9yZWcuaW5kZXgucHJvZF0ubG9uZ18wID0gKHUzMikgKFBJX1hNVF9ERVNDUl9NX1NPUCB8CisJCQlQSV9YTVRfREVTQ1JfTV9FT1AgfCAoUElfQ01EX1JFUV9LX1NJWkVfTUFYIDw8IFBJX1hNVF9ERVNDUl9WX1NFR19MRU4pKTsKKwlicC0+ZGVzY3JfYmxvY2tfdmlydC0+Y21kX3JlcVticC0+Y21kX3JlcV9yZWcuaW5kZXgucHJvZF0ubG9uZ18xID0gYnAtPmNtZF9yZXFfcGh5czsKKworCS8qIEJ1bXAgKGFuZCB3cmFwKSB0aGUgcHJvZHVjZXIgaW5kZXggYW5kIHdyaXRlIG91dCB0byByZWdpc3RlciAqLworCisJYnAtPmNtZF9yZXFfcmVnLmluZGV4LnByb2QgKz0gMTsKKwlicC0+Y21kX3JlcV9yZWcuaW5kZXgucHJvZCAmPSBQSV9DTURfUkVRX0tfTlVNX0VOVFJJRVMtMTsKKwlkZnhfcG9ydF93cml0ZV9sb25nKGJwLCBQSV9QRFFfS19SRUdfQ01EX1JFUV9QUk9ELCBicC0+Y21kX3JlcV9yZWcubHdvcmQpOworCisJLyoKKwkgKiBIZXJlIHdlIHdhaXQgZm9yIHRoZSBjb21tYW5kIHJlcXVlc3QgY29uc3VtZXIgaW5kZXggdG8gYmUgZXF1YWwKKwkgKiB0byB0aGUgcHJvZHVjZXIsIGluZGljYXRpbmcgdGhhdCB0aGUgYWRhcHRlciBoYXMgRE1BZWQgdGhlIHJlcXVlc3QuCisJICovCisKKwlmb3IgKHRpbWVvdXRfY250ID0gMjAwMDA7IHRpbWVvdXRfY250ID4gMDsgdGltZW91dF9jbnQtLSkKKwkJeworCQlpZiAoYnAtPmNtZF9yZXFfcmVnLmluZGV4LnByb2QgPT0gKHU4KShicC0+Y29uc19ibG9ja192aXJ0LT5jbWRfcmVxKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTAwKTsJCQkvKiB3YWl0IGZvciAxMDAgbWljcm9zZWNvbmRzICovCisJCX0KKwlpZiAodGltZW91dF9jbnQgPT0gMCkgCisJCXJldHVybihERlhfS19IV19USU1FT1VUKTsKKworCS8qIEJ1bXAgKGFuZCB3cmFwKSB0aGUgY29tcGxldGlvbiBpbmRleCBhbmQgd3JpdGUgb3V0IHRvIHJlZ2lzdGVyICovCisKKwlicC0+Y21kX3JlcV9yZWcuaW5kZXguY29tcCArPSAxOworCWJwLT5jbWRfcmVxX3JlZy5pbmRleC5jb21wICY9IFBJX0NNRF9SRVFfS19OVU1fRU5UUklFUy0xOworCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19DTURfUkVRX1BST0QsIGJwLT5jbWRfcmVxX3JlZy5sd29yZCk7CisKKwkvKgorCSAqIEhlcmUgd2Ugd2FpdCBmb3IgdGhlIGNvbW1hbmQgcmVzcG9uc2UgY29uc3VtZXIgaW5kZXggdG8gYmUgZXF1YWwKKwkgKiB0byB0aGUgcHJvZHVjZXIsIGluZGljYXRpbmcgdGhhdCB0aGUgYWRhcHRlciBoYXMgRE1BZWQgdGhlIHJlc3BvbnNlLgorCSAqLworCisJZm9yICh0aW1lb3V0X2NudCA9IDIwMDAwOyB0aW1lb3V0X2NudCA+IDA7IHRpbWVvdXRfY250LS0pCisJCXsKKwkJaWYgKGJwLT5jbWRfcnNwX3JlZy5pbmRleC5wcm9kID09ICh1OCkoYnAtPmNvbnNfYmxvY2tfdmlydC0+Y21kX3JzcCkpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwMCk7CQkJLyogd2FpdCBmb3IgMTAwIG1pY3Jvc2Vjb25kcyAqLworCQl9CisJaWYgKHRpbWVvdXRfY250ID09IDApIAorCQlyZXR1cm4oREZYX0tfSFdfVElNRU9VVCk7CisKKwkvKiBCdW1wIChhbmQgd3JhcCkgdGhlIGNvbXBsZXRpb24gaW5kZXggYW5kIHdyaXRlIG91dCB0byByZWdpc3RlciAqLworCisJYnAtPmNtZF9yc3BfcmVnLmluZGV4LmNvbXAgKz0gMTsKKwlicC0+Y21kX3JzcF9yZWcuaW5kZXguY29tcCAmPSBQSV9DTURfUlNQX0tfTlVNX0VOVFJJRVMtMTsKKwlkZnhfcG9ydF93cml0ZV9sb25nKGJwLCBQSV9QRFFfS19SRUdfQ01EX1JTUF9QUk9ELCBicC0+Y21kX3JzcF9yZWcubHdvcmQpOworCXJldHVybihERlhfS19TVUNDRVNTKTsKKwl9CisKKwwKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT0KKyAqID0gZGZ4X2h3X3BvcnRfY3RybF9yZXEgPQorICogPT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIFNlbmRzIFBEUSBwb3J0IGNvbnRyb2wgY29tbWFuZCB0byBhZGFwdGVyIGZpcm13YXJlCisgKiAgCisgKiBSZXR1cm5zOgorICogICBIb3N0IGRhdGEgcmVnaXN0ZXIgdmFsdWUgaW4gaG9zdF9kYXRhIGlmIHB0ciBpcyBub3QgTlVMTAorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGJwCQkJLSBwb2ludGVyIHRvIGJvYXJkIGluZm9ybWF0aW9uCisgKgkgY29tbWFuZAktIHBvcnQgY29udHJvbCBjb21tYW5kCisgKgkgZGF0YV9hCQktIHBvcnQgZGF0YSBBIHJlZ2lzdGVyIHZhbHVlCisgKgkgZGF0YV9iCQktIHBvcnQgZGF0YSBCIHJlZ2lzdGVyIHZhbHVlCisgKgkgaG9zdF9kYXRhCS0gcHRyIHRvIGhvc3QgZGF0YSByZWdpc3RlciB2YWx1ZQorICoKKyAqIEZ1bmN0aW9uYWwgRGVzY3JpcHRpb246CisgKiAgIFNlbmQgZ2VuZXJpYyBwb3J0IGNvbnRyb2wgY29tbWFuZCB0byBhZGFwdGVyIGJ5IHdyaXRpbmcKKyAqICAgdG8gdmFyaW91cyBQRFEgcG9ydCByZWdpc3RlcnMsIHRoZW4gcG9sbGluZyBmb3IgY29tcGxldGlvbi4KKyAqCisgKiBSZXR1cm4gQ29kZXM6CisgKiAgIERGWF9LX1NVQ0NFU1MJICAtIHBvcnQgY29udHJvbCBjb21tYW5kIHN1Y2NlZWRlZAorICogICBERlhfS19IV19USU1FT1VUIC0gcG9ydCBjb250cm9sIGNvbW1hbmQgdGltZWQgb3V0CisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIE5vbmUKKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIE5vbmUKKyAqLworCitzdGF0aWMgaW50IGRmeF9od19wb3J0X2N0cmxfcmVxKAorCURGWF9ib2FyZF90CSpicCwKKwlQSV9VSU5UMzIJY29tbWFuZCwKKwlQSV9VSU5UMzIJZGF0YV9hLAorCVBJX1VJTlQzMglkYXRhX2IsCisJUElfVUlOVDMyCSpob3N0X2RhdGEKKwkpCisKKwl7CisJUElfVUlOVDMyCXBvcnRfY21kOwkJLyogUG9ydCBDb250cm9sIGNvbW1hbmQgcmVnaXN0ZXIgdmFsdWUgKi8KKwlpbnQJCQl0aW1lb3V0X2NudDsJLyogdXNlZCBpbiBmb3IgbG9vcHMgKi8KKworCS8qIFNldCBDb21tYW5kIEVycm9yIGJpdCBpbiBjb21tYW5kIGxvbmd3b3JkICovCisJCisJcG9ydF9jbWQgPSAoUElfVUlOVDMyKSAoY29tbWFuZCB8IFBJX1BDVFJMX01fQ01EX0VSUk9SKTsKKworCS8qIElzc3VlIHBvcnQgY29tbWFuZCB0byB0aGUgYWRhcHRlciAqLworCisJZGZ4X3BvcnRfd3JpdGVfbG9uZyhicCwgUElfUERRX0tfUkVHX1BPUlRfREFUQV9BLCBkYXRhX2EpOworCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19QT1JUX0RBVEFfQiwgZGF0YV9iKTsKKwlkZnhfcG9ydF93cml0ZV9sb25nKGJwLCBQSV9QRFFfS19SRUdfUE9SVF9DVFJMLCBwb3J0X2NtZCk7CisKKwkvKiBOb3cgd2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZSAqLworCisJaWYgKGNvbW1hbmQgPT0gUElfUENUUkxfTV9CTEFTVF9GTEFTSCkKKwkJdGltZW91dF9jbnQgPSA2MDAwMDA7CS8qIHNldCBjb21tYW5kIHRpbWVvdXQgY291bnQgdG8gNjAgc2Vjb25kcyAqLworCWVsc2UKKwkJdGltZW91dF9jbnQgPSAyMDAwMDsJLyogc2V0IGNvbW1hbmQgdGltZW91dCBjb3VudCB0byAyIHNlY29uZHMgKi8KKworCWZvciAoOyB0aW1lb3V0X2NudCA+IDA7IHRpbWVvdXRfY250LS0pCisJCXsKKwkJZGZ4X3BvcnRfcmVhZF9sb25nKGJwLCBQSV9QRFFfS19SRUdfUE9SVF9DVFJMLCAmcG9ydF9jbWQpOworCQlpZiAoIShwb3J0X2NtZCAmIFBJX1BDVFJMX01fQ01EX0VSUk9SKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTAwKTsJCQkvKiB3YWl0IGZvciAxMDAgbWljcm9zZWNvbmRzICovCisJCX0KKwlpZiAodGltZW91dF9jbnQgPT0gMCkgCisJCXJldHVybihERlhfS19IV19USU1FT1VUKTsKKworCS8qCisJICogSWYgdGhlIGFkZHJlc3Mgb2YgaG9zdF9kYXRhIGlzIG5vbi16ZXJvLCBhc3N1bWUgY2FsbGVyIGhhcyBzdXBwbGllZCBhICAKKwkgKiBub24gTlVMTCBwb2ludGVyLCBhbmQgcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgSE9TVF9EQVRBIHJlZ2lzdGVyIGluIAorCSAqIGl0LgorCSAqLworCisJaWYgKGhvc3RfZGF0YSAhPSBOVUxMKQorCQlkZnhfcG9ydF9yZWFkX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19IT1NUX0RBVEEsIGhvc3RfZGF0YSk7CisJcmV0dXJuKERGWF9LX1NVQ0NFU1MpOworCX0KKworDAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PQorICogPSBkZnhfaHdfYWRhcF9yZXNldCA9CisgKiA9PT09PT09PT09PT09PT09PT09PT0KKyAqICAgCisgKiBPdmVydmlldzoKKyAqICAgUmVzZXRzIGFkYXB0ZXIKKyAqICAKKyAqIFJldHVybnM6CisgKiAgIE5vbmUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBicCAgIC0gcG9pbnRlciB0byBib2FyZCBpbmZvcm1hdGlvbgorICogICB0eXBlIC0gdHlwZSBvZiByZXNldCB0byBwZXJmb3JtCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgSXNzdWUgc29mdCByZXNldCB0byBhZGFwdGVyIGJ5IHdyaXRpbmcgdG8gUERRIFBvcnQgUmVzZXQKKyAqICAgcmVnaXN0ZXIuICBVc2UgaW5jb21pbmcgcmVzZXQgdHlwZSB0byB0ZWxsIGFkYXB0ZXIgd2hhdAorICogICBraW5kIG9mIHJlc2V0IG9wZXJhdGlvbiB0byBwZXJmb3JtLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgTm9uZQorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBUaGlzIHJvdXRpbmUgbWVyZWx5IGlzc3VlcyBhIHNvZnQgcmVzZXQgdG8gdGhlIGFkYXB0ZXIuCisgKiAgIEl0IGlzIGV4cGVjdGVkIHRoYXQgYWZ0ZXIgdGhpcyByb3V0aW5lIHJldHVybnMsIHRoZSBjYWxsZXIKKyAqICAgd2lsbCBhcHByb3ByaWF0ZWx5IHBvbGwgdGhlIFBvcnQgU3RhdHVzIHJlZ2lzdGVyIGZvciB0aGUKKyAqICAgYWRhcHRlciB0byBlbnRlciB0aGUgcHJvcGVyIHN0YXRlLgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgSW50ZXJuYWwgYWRhcHRlciByZWdpc3RlcnMgYXJlIGNsZWFyZWQuCisgKi8KKworc3RhdGljIHZvaWQgZGZ4X2h3X2FkYXBfcmVzZXQoCisJREZYX2JvYXJkX3QJKmJwLAorCVBJX1VJTlQzMgl0eXBlCisJKQorCisJeworCS8qIFNldCBSZXNldCB0eXBlIGFuZCBhc3NlcnQgcmVzZXQgKi8KKworCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19QT1JUX0RBVEFfQSwgdHlwZSk7CS8qIHRlbGwgYWRhcHRlciB0eXBlIG9mIHJlc2V0ICovCisJZGZ4X3BvcnRfd3JpdGVfbG9uZyhicCwgUElfUERRX0tfUkVHX1BPUlRfUkVTRVQsIFBJX1JFU0VUX01fQVNTRVJUX1JFU0VUKTsKKworCS8qIFdhaXQgZm9yIGF0IGxlYXN0IDEgTWljcm9zZWNvbmQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjLiBXZSB3YWl0IDIwIGp1c3QgdG8gYmUgc2FmZSAqLworCisJdWRlbGF5KDIwKTsKKworCS8qIERlYXNzZXJ0IHJlc2V0ICovCisKKwlkZnhfcG9ydF93cml0ZV9sb25nKGJwLCBQSV9QRFFfS19SRUdfUE9SVF9SRVNFVCwgMCk7CisJfQorCisMCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09CisgKiA9IGRmeF9od19hZGFwX3N0YXRlX3JkID0KKyAqID09PT09PT09PT09PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBSZXR1cm5zIGN1cnJlbnQgYWRhcHRlciBzdGF0ZQorICogIAorICogUmV0dXJuczoKKyAqICAgQWRhcHRlciBzdGF0ZSBwZXIgUERRIFBvcnQgU3BlY2lmaWNhdGlvbgorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGJwIC0gcG9pbnRlciB0byBib2FyZCBpbmZvcm1hdGlvbgorICoKKyAqIEZ1bmN0aW9uYWwgRGVzY3JpcHRpb246CisgKiAgIFJlYWRzIFBEUSBQb3J0IFN0YXR1cyByZWdpc3RlciBhbmQgcmV0dXJucyBhZGFwdGVyIHN0YXRlLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgTm9uZQorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBOb25lCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBOb25lCisgKi8KKworc3RhdGljIGludCBkZnhfaHdfYWRhcF9zdGF0ZV9yZChERlhfYm9hcmRfdCAqYnApCisJeworCVBJX1VJTlQzMiBwb3J0X3N0YXR1czsJCS8qIFBvcnQgU3RhdHVzIHJlZ2lzdGVyIHZhbHVlICovCisKKwlkZnhfcG9ydF9yZWFkX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19QT1JUX1NUQVRVUywgJnBvcnRfc3RhdHVzKTsKKwlyZXR1cm4oKHBvcnRfc3RhdHVzICYgUElfUFNUQVRVU19NX1NUQVRFKSA+PiBQSV9QU1RBVFVTX1ZfU1RBVEUpOworCX0KKworDAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PQorICogPSBkZnhfaHdfZG1hX3VuaW5pdCA9CisgKiA9PT09PT09PT09PT09PT09PT09PT0KKyAqICAgCisgKiBPdmVydmlldzoKKyAqICAgQnJpbmdzIGFkYXB0ZXIgdG8gRE1BX1VOQVZBSUxBQkxFIHN0YXRlCisgKiAgCisgKiBSZXR1cm5zOgorICogICBDb25kaXRpb24gY29kZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGJwICAgLSBwb2ludGVyIHRvIGJvYXJkIGluZm9ybWF0aW9uCisgKiAgIHR5cGUgLSB0eXBlIG9mIHJlc2V0IHRvIHBlcmZvcm0KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBCcmluZyBhZGFwdGVyIHRvIERNQV9VTkFWQUlMQUJMRSBzdGF0ZSBieSBwZXJmb3JtaW5nIHRoZSBmb2xsb3dpbmc6CisgKgkJMS4gU2V0IHJlc2V0IHR5cGUgYml0IGluIFBvcnQgRGF0YSBBIFJlZ2lzdGVyIHRoZW4gcmVzZXQgYWRhcHRlci4KKyAqCQkyLiBDaGVjayB0aGF0IGFkYXB0ZXIgaXMgaW4gRE1BX1VOQVZBSUxBQkxFIHN0YXRlLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgREZYX0tfU1VDQ0VTUwkgIC0gYWRhcHRlciBpcyBpbiBETUFfVU5BVkFJTEFCTEUgc3RhdGUKKyAqICAgREZYX0tfSFdfVElNRU9VVCAtIGFkYXB0ZXIgZGlkIG5vdCByZXNldCBwcm9wZXJseQorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBOb25lCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBJbnRlcm5hbCBhZGFwdGVyIHJlZ2lzdGVycyBhcmUgY2xlYXJlZC4KKyAqLworCitzdGF0aWMgaW50IGRmeF9od19kbWFfdW5pbml0KERGWF9ib2FyZF90ICpicCwgUElfVUlOVDMyIHR5cGUpCisJeworCWludCB0aW1lb3V0X2NudDsJLyogdXNlZCBpbiBmb3IgbG9vcHMgKi8KKworCS8qIFNldCByZXNldCB0eXBlIGJpdCBhbmQgcmVzZXQgYWRhcHRlciAqLworCisJZGZ4X2h3X2FkYXBfcmVzZXQoYnAsIHR5cGUpOworCisJLyogTm93IHdhaXQgZm9yIGFkYXB0ZXIgdG8gZW50ZXIgRE1BX1VOQVZBSUxBQkxFIHN0YXRlICovCisKKwlmb3IgKHRpbWVvdXRfY250ID0gMTAwMDAwOyB0aW1lb3V0X2NudCA+IDA7IHRpbWVvdXRfY250LS0pCisJCXsKKwkJaWYgKGRmeF9od19hZGFwX3N0YXRlX3JkKGJwKSA9PSBQSV9TVEFURV9LX0RNQV9VTkFWQUlMKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMDApOwkJCQkJLyogd2FpdCBmb3IgMTAwIG1pY3Jvc2Vjb25kcyAqLworCQl9CisJaWYgKHRpbWVvdXRfY250ID09IDApIAorCQlyZXR1cm4oREZYX0tfSFdfVElNRU9VVCk7CisJcmV0dXJuKERGWF9LX1NVQ0NFU1MpOworCX0KKwwKKy8qCisgKglBbGlnbiBhbiBza19idWZmIHRvIGEgYm91bmRhcnkgcG93ZXIgb2YgMgorICoKKyAqLworIAorc3RhdGljIHZvaWQgbXlfc2tiX2FsaWduKHN0cnVjdCBza19idWZmICpza2IsIGludCBuKQoreworCXVuc2lnbmVkIGxvbmcgeCA9ICh1bnNpZ25lZCBsb25nKXNrYi0+ZGF0YTsKKwl1bnNpZ25lZCBsb25nIHY7CisJCisJdiA9IEFMSUdOKHgsIG4pOwkvKiBXaGVyZSB3ZSB3YW50IHRvIGJlICovCisJCisJc2tiX3Jlc2VydmUoc2tiLCB2IC0geCk7Cit9CisKKwwKKy8qCisgKiA9PT09PT09PT09PT09PT09CisgKiA9IGRmeF9yY3ZfaW5pdCA9CisgKiA9PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIFByb2R1Y2VzIGJ1ZmZlcnMgdG8gYWRhcHRlciBMTEMgSG9zdCByZWNlaXZlIGRlc2NyaXB0b3IgYmxvY2sKKyAqICAKKyAqIFJldHVybnM6CisgKiAgIE5vbmUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBicCAtIHBvaW50ZXIgdG8gYm9hcmQgaW5mb3JtYXRpb24KKyAqICAgZ2V0X2J1ZmZlcnMgLSBub24temVybyBpZiBidWZmZXJzIHRvIGJlIGFsbG9jYXRlZAorICoKKyAqIEZ1bmN0aW9uYWwgRGVzY3JpcHRpb246CisgKiAgIFRoaXMgcm91dGluZSBjYW4gYmUgY2FsbGVkIGR1cmluZyBkZnhfYWRhcF9pbml0KCkgb3IgZHVyaW5nIGFuIGFkYXB0ZXIKKyAqCSByZXNldC4gIEl0IGluaXRpYWxpemVzIHRoZSBkZXNjcmlwdG9yIGJsb2NrIGFuZCBwcm9kdWNlcyBhbGwgYWxsb2NhdGVkCisgKiAgIExMQyBIb3N0IHF1ZXVlIHJlY2VpdmUgYnVmZmVycy4KKyAqCisgKiBSZXR1cm4gQ29kZXM6CisgKiAgIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgLUVOT01FTSBpZiBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWQgKHdoZW4gdXNpbmcKKyAqICAgZHluYW1pYyBidWZmZXIgYWxsb2NhdGlvbikuIElmIHRoZSBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWQsIHRoZQorICogICBhbHJlYWR5IGFsbG9jYXRlZCBidWZmZXJzIHdpbGwgbm90IGJlIHJlbGVhc2VkIGFuZCB0aGUgY2FsbGVyIHNob3VsZCBkbworICogICB0aGlzLgorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBUaGUgUERRIGhhcyBiZWVuIHJlc2V0IGFuZCB0aGUgYWRhcHRlciBhbmQgZHJpdmVyIG1haW50YWluZWQgVHlwZSAyCisgKiAgIHJlZ2lzdGVyIGluZGljZXMgYXJlIGNsZWFyZWQuCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBSZWNlaXZlIGJ1ZmZlcnMgYXJlIHBvc3RlZCB0byB0aGUgYWRhcHRlciBMTEMgcXVldWUgYW5kIHRoZSBhZGFwdGVyCisgKiAgIGlzIG5vdGlmaWVkLgorICovCisKK3N0YXRpYyBpbnQgZGZ4X3Jjdl9pbml0KERGWF9ib2FyZF90ICpicCwgaW50IGdldF9idWZmZXJzKQorCXsKKwlpbnQJaSwgajsJCQkJCS8qIHVzZWQgaW4gZm9yIGxvb3AgKi8KKworCS8qCisJICogIFNpbmNlIGVhY2ggcmVjZWl2ZSBidWZmZXIgaXMgYSBzaW5nbGUgZnJhZ21lbnQgb2Ygc2FtZSBsZW5ndGgsIGluaXRpYWxpemUKKwkgKiAgZmlyc3QgbG9uZ3dvcmQgaW4gZWFjaCByZWNlaXZlIGRlc2NyaXB0b3IgZm9yIGVudGlyZSBMTEMgSG9zdCBkZXNjcmlwdG9yCisJICogIGJsb2NrLiAgQWxzbyBpbml0aWFsaXplIHNlY29uZCBsb25nd29yZCBpbiBlYWNoIHJlY2VpdmUgZGVzY3JpcHRvciB3aXRoCisJICogIHBoeXNpY2FsIGFkZHJlc3Mgb2YgcmVjZWl2ZSBidWZmZXIuICBXZSdsbCBhbHdheXMgYWxsb2NhdGUgcmVjZWl2ZQorCSAqICBidWZmZXJzIGluIHBvd2VycyBvZiAyIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBmaWxsIHRoZSAyNTYgZW50cnkgZGVzY3JpcHRvcgorCSAqICBibG9jayBhbmQgcHJvZHVjZSBuZXcgcmVjZWl2ZSBidWZmZXJzIGJ5IHNpbXBseSB1cGRhdGluZyB0aGUgcmVjZWl2ZQorCSAqICBwcm9kdWNlciBpbmRleC4KKwkgKgorCSAqIAlBc3N1bXB0aW9uczoKKwkgKgkJVG8gc3VwcG9ydCBhbGwgc2hpcHBpbmcgdmVyc2lvbnMgb2YgUERRLCB0aGUgcmVjZWl2ZSBidWZmZXIgc2l6ZQorCSAqCQltdXN0IGJlIG1vZCAxMjggaW4gbGVuZ3RoIGFuZCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBtdXN0IGJlIDEyOCBieXRlCisJICoJCWFsaWduZWQuICBJbiBvdGhlciB3b3JkcywgYml0cyAwLTYgb2YgdGhlIGxlbmd0aCBhbmQgYWRkcmVzcyBtdXN0CisJICoJCWJlIHplcm8gZm9yIHRoZSBmb2xsb3dpbmcgZGVzY3JpcHRvciBmaWVsZCBlbnRyaWVzIHRvIGJlIGNvcnJlY3Qgb24KKwkgKgkJYWxsIFBEUS1iYXNlZCBib2FyZHMuICBXZSBndWFyYW50ZWVkIGJvdGggcmVxdWlyZW1lbnRzIGR1cmluZworCSAqCQlkcml2ZXIgaW5pdGlhbGl6YXRpb24gd2hlbiB3ZSBhbGxvY2F0ZWQgbWVtb3J5IGZvciB0aGUgcmVjZWl2ZSBidWZmZXJzLgorCSAqLworCisJaWYgKGdldF9idWZmZXJzKSB7CisjaWZkZWYgRFlOQU1JQ19CVUZGRVJTCisJZm9yIChpID0gMDsgaSA8IChpbnQpKGJwLT5yY3ZfYnVmc190b19wb3N0KTsgaSsrKQorCQlmb3IgKGogPSAwOyAoaSArIGopIDwgKGludClQSV9SQ1ZfREFUQV9LX05VTV9FTlRSSUVTOyBqICs9IGJwLT5yY3ZfYnVmc190b19wb3N0KQorCQl7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiID0gX19kZXZfYWxsb2Nfc2tiKE5FV19TS0JfU0laRSwgR0ZQX05PSU8pOworCQkJaWYgKCFuZXdza2IpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlicC0+ZGVzY3JfYmxvY2tfdmlydC0+cmN2X2RhdGFbaStqXS5sb25nXzAgPSAodTMyKSAoUElfUkNWX0RFU0NSX01fU09QIHwKKwkJCQkoKFBJX1JDVl9EQVRBX0tfU0laRV9NQVggLyBQSV9BTElHTl9LX1JDVl9EQVRBX0JVRkYpIDw8IFBJX1JDVl9ERVNDUl9WX1NFR19MRU4pKTsKKwkJCS8qCisJCQkgKiBhbGlnbiB0byAxMjggYnl0ZXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAorCQkJICogdGhlIG9sZCBFSVNBIGJvYXJkcy4KKwkJCSAqLworCQkJIAorCQkJbXlfc2tiX2FsaWduKG5ld3NrYiwgMTI4KTsKKwkJCWJwLT5kZXNjcl9ibG9ja192aXJ0LT5yY3ZfZGF0YVtpICsgal0ubG9uZ18xID0KKwkJCQkodTMyKXBjaV9tYXBfc2luZ2xlKGJwLT5wY2lfZGV2LCBuZXdza2ItPmRhdGEsCisJCQkJCQkgICAgTkVXX1NLQl9TSVpFLAorCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkvKgorCQkJICogcF9yY3ZfYnVmZl92YSBpcyBvbmx5IHVzZWQgaW5zaWRlIHRoZQorCQkJICoga2VybmVsIHNvIHdlIHB1dCB0aGUgc2tiIHBvaW50ZXIgaGVyZS4KKwkJCSAqLworCQkJYnAtPnBfcmN2X2J1ZmZfdmFbaStqXSA9IChjaGFyICopIG5ld3NrYjsKKwkJfQorI2Vsc2UKKwlmb3IgKGk9MDsgaSA8IChpbnQpKGJwLT5yY3ZfYnVmc190b19wb3N0KTsgaSsrKQorCQlmb3IgKGo9MDsgKGkgKyBqKSA8IChpbnQpUElfUkNWX0RBVEFfS19OVU1fRU5UUklFUzsgaiArPSBicC0+cmN2X2J1ZnNfdG9fcG9zdCkKKwkJCXsKKwkJCWJwLT5kZXNjcl9ibG9ja192aXJ0LT5yY3ZfZGF0YVtpK2pdLmxvbmdfMCA9ICh1MzIpIChQSV9SQ1ZfREVTQ1JfTV9TT1AgfAorCQkJCSgoUElfUkNWX0RBVEFfS19TSVpFX01BWCAvIFBJX0FMSUdOX0tfUkNWX0RBVEFfQlVGRikgPDwgUElfUkNWX0RFU0NSX1ZfU0VHX0xFTikpOworCQkJYnAtPmRlc2NyX2Jsb2NrX3ZpcnQtPnJjdl9kYXRhW2kral0ubG9uZ18xID0gKHUzMikgKGJwLT5yY3ZfYmxvY2tfcGh5cyArIChpICogUElfUkNWX0RBVEFfS19TSVpFX01BWCkpOworCQkJYnAtPnBfcmN2X2J1ZmZfdmFbaStqXSA9IChjaGFyICopIChicC0+cmN2X2Jsb2NrX3ZpcnQgKyAoaSAqIFBJX1JDVl9EQVRBX0tfU0laRV9NQVgpKTsKKwkJCX0KKyNlbmRpZgorCX0KKworCS8qIFVwZGF0ZSByZWNlaXZlIHByb2R1Y2VyIGFuZCBUeXBlIDIgcmVnaXN0ZXIgKi8KKworCWJwLT5yY3ZfeG10X3JlZy5pbmRleC5yY3ZfcHJvZCA9IGJwLT5yY3ZfYnVmc190b19wb3N0OworCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19UWVBFXzJfUFJPRCwgYnAtPnJjdl94bXRfcmVnLmx3b3JkKTsKKwlyZXR1cm4gMDsKKwl9CisKKwwKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09CisgKiA9IGRmeF9yY3ZfcXVldWVfcHJvY2VzcyA9CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIFByb2Nlc3MgcmVjZWl2ZWQgTExDIGZyYW1lcy4KKyAqICAKKyAqIFJldHVybnM6CisgKiAgIE5vbmUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBicCAtIHBvaW50ZXIgdG8gYm9hcmQgaW5mb3JtYXRpb24KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBSZWNlaXZlZCBMTEMgZnJhbWVzIGFyZSBwcm9jZXNzZWQgdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUgY29uc3VtZWQgZnJhbWVzLgorICogICBPbmNlIGFsbCBmcmFtZXMgYXJlIHByb2Nlc3NlZCwgdGhlIHJlY2VpdmUgYnVmZmVycyBhcmUgcmV0dXJuZWQgdG8gdGhlCisgKiAgIGFkYXB0ZXIuICBOb3RlIHRoYXQgdGhpcyBhbGdvcml0aG0gZml4ZXMgdGhlIGxlbmd0aCBvZiB0aW1lIHRoYXQgY2FuIGJlIHNwZW50CisgKiAgIGluIHRoaXMgcm91dGluZSwgYmVjYXVzZSB0aGVyZSBhcmUgYSBmaXhlZCBudW1iZXIgb2YgcmVjZWl2ZSBidWZmZXJzIHRvCisgKiAgIHByb2Nlc3MgYW5kIGJ1ZmZlcnMgYXJlIG5vdCBwcm9kdWNlZCB1bnRpbCB0aGlzIHJvdXRpbmUgZXhpdHMgYW5kIHJldHVybnMKKyAqICAgdG8gdGhlIElTUi4KKyAqCisgKiBSZXR1cm4gQ29kZXM6CisgKiAgIE5vbmUKKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqICAgTm9uZQorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgTm9uZQorICovCisKK3N0YXRpYyB2b2lkIGRmeF9yY3ZfcXVldWVfcHJvY2VzcygKKwlERlhfYm9hcmRfdCAqYnAKKwkpCisKKwl7CisJUElfVFlQRV8yX0NPTlNVTUVSCSpwX3R5cGVfMl9jb25zOwkJLyogcHRyIHRvIHJjdi94bXQgY29uc3VtZXIgYmxvY2sgcmVnaXN0ZXIgKi8KKwljaGFyCQkJCSpwX2J1ZmY7CQkJLyogcHRyIHRvIHN0YXJ0IG9mIHBhY2tldCByZWNlaXZlIGJ1ZmZlciAoRk1DIGRlc2NyaXB0b3IpICovCisJdTMyCQkJCQlkZXNjciwgcGt0X2xlbjsJCS8qIEZNQyBkZXNjcmlwdG9yIGZpZWxkIGFuZCBwYWNrZXQgbGVuZ3RoICovCisJc3RydWN0IHNrX2J1ZmYJCSpza2I7CQkJCS8qIHBvaW50ZXIgdG8gYSBza19idWZmIHRvIGhvbGQgaW5jb21pbmcgcGFja2V0IGRhdGEgKi8KKworCS8qIFNlcnZpY2UgYWxsIGNvbnN1bWVkIExMQyByZWNlaXZlIGZyYW1lcyAqLworCisJcF90eXBlXzJfY29ucyA9IChQSV9UWVBFXzJfQ09OU1VNRVIgKikoJmJwLT5jb25zX2Jsb2NrX3ZpcnQtPnhtdF9yY3ZfZGF0YSk7CisJd2hpbGUgKGJwLT5yY3ZfeG10X3JlZy5pbmRleC5yY3ZfY29tcCAhPSBwX3R5cGVfMl9jb25zLT5pbmRleC5yY3ZfY29ucykKKwkJeworCQkvKiBQcm9jZXNzIGFueSBlcnJvcnMgKi8KKworCQlpbnQgZW50cnk7CisKKwkJZW50cnkgPSBicC0+cmN2X3htdF9yZWcuaW5kZXgucmN2X2NvbXA7CisjaWZkZWYgRFlOQU1JQ19CVUZGRVJTCisJCXBfYnVmZiA9IChjaGFyICopICgoKHN0cnVjdCBza19idWZmICopYnAtPnBfcmN2X2J1ZmZfdmFbZW50cnldKS0+ZGF0YSk7CisjZWxzZQorCQlwX2J1ZmYgPSAoY2hhciAqKSBicC0+cF9yY3ZfYnVmZl92YVtlbnRyeV07CisjZW5kaWYKKwkJbWVtY3B5KCZkZXNjciwgcF9idWZmICsgUkNWX0JVRkZfS19ERVNDUiwgc2l6ZW9mKHUzMikpOworCisJCWlmIChkZXNjciAmIFBJX0ZNQ19ERVNDUl9NX1JDQ19GTFVTSCkKKwkJCXsKKwkJCWlmIChkZXNjciAmIFBJX0ZNQ19ERVNDUl9NX1JDQ19DUkMpCisJCQkJYnAtPnJjdl9jcmNfZXJyb3JzKys7CisJCQllbHNlCisJCQkJYnAtPnJjdl9mcmFtZV9zdGF0dXNfZXJyb3JzKys7CisJCQl9CisJCWVsc2UKKwkJeworCQkJaW50IHJ4X2luX3BsYWNlID0gMDsKKworCQkJLyogVGhlIGZyYW1lIHdhcyByZWNlaXZlZCB3aXRob3V0IGVycm9ycyAtIHZlcmlmeSBwYWNrZXQgbGVuZ3RoICovCisKKwkJCXBrdF9sZW4gPSAodTMyKSgoZGVzY3IgJiBQSV9GTUNfREVTQ1JfTV9MRU4pID4+IFBJX0ZNQ19ERVNDUl9WX0xFTik7CisJCQlwa3RfbGVuIC09IDQ7CQkJCS8qIHN1YnRyYWN0IDQgYnl0ZSBDUkMgKi8KKwkJCWlmICghSU5fUkFOR0UocGt0X2xlbiwgRkRESV9LX0xMQ19aTEVOLCBGRERJX0tfTExDX0xFTikpCisJCQkJYnAtPnJjdl9sZW5ndGhfZXJyb3JzKys7CisJCQllbHNleworI2lmZGVmIERZTkFNSUNfQlVGRkVSUworCQkJCWlmIChwa3RfbGVuID4gU0tCVUZGX1JYX0NPUFlCUkVBSykgeworCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiOworCisJCQkJCW5ld3NrYiA9IGRldl9hbGxvY19za2IoTkVXX1NLQl9TSVpFKTsKKwkJCQkJaWYgKG5ld3NrYil7CisJCQkJCQlyeF9pbl9wbGFjZSA9IDE7CisJCQkJCQkKKwkJCQkJCW15X3NrYl9hbGlnbihuZXdza2IsIDEyOCk7CisJCQkJCQlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKilicC0+cF9yY3ZfYnVmZl92YVtlbnRyeV07CisJCQkJCQlwY2lfdW5tYXBfc2luZ2xlKGJwLT5wY2lfZGV2LAorCQkJCQkJCWJwLT5kZXNjcl9ibG9ja192aXJ0LT5yY3ZfZGF0YVtlbnRyeV0ubG9uZ18xLAorCQkJCQkJCU5FV19TS0JfU0laRSwKKwkJCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCQkJc2tiX3Jlc2VydmUoc2tiLCBSQ1ZfQlVGRl9LX1BBRERJTkcpOworCQkJCQkJYnAtPnBfcmN2X2J1ZmZfdmFbZW50cnldID0gKGNoYXIgKiluZXdza2I7CisJCQkJCQlicC0+ZGVzY3JfYmxvY2tfdmlydC0+cmN2X2RhdGFbZW50cnldLmxvbmdfMSA9CisJCQkJCQkJKHUzMilwY2lfbWFwX3NpbmdsZShicC0+cGNpX2RldiwKKwkJCQkJCQkJbmV3c2tiLT5kYXRhLAorCQkJCQkJCQlORVdfU0tCX1NJWkUsCisJCQkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJCX0gZWxzZQorCQkJCQkJc2tiID0gTlVMTDsKKwkJCQl9IGVsc2UKKyNlbmRpZgorCQkJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4rMyk7CS8qIGFsbG9jIG5ldyBidWZmZXIgdG8gcGFzcyB1cCwgYWRkIHJvb20gZm9yIFBSSCAqLworCQkJCWlmIChza2IgPT0gTlVMTCkKKwkJCQkJeworCQkJCQlwcmludGsoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgcmVjZWl2ZSBidWZmZXIuICBEcm9wcGluZyBwYWNrZXQuXG4iLCBicC0+ZGV2LT5uYW1lKTsKKwkJCQkJYnAtPnJjdl9kaXNjYXJkcysrOworCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCWVsc2UgeworI2lmbmRlZiBEWU5BTUlDX0JVRkZFUlMKKwkJCQkJaWYgKCEgcnhfaW5fcGxhY2UpCisjZW5kaWYKKwkJCQkJeworCQkJCQkJLyogUmVjZWl2ZSBidWZmZXIgYWxsb2NhdGVkLCBwYXNzIHJlY2VpdmUgcGFja2V0IHVwICovCisKKwkJCQkJCW1lbWNweShza2ItPmRhdGEsIHBfYnVmZiArIFJDVl9CVUZGX0tfUEFERElORywgcGt0X2xlbiszKTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJc2tiX3Jlc2VydmUoc2tiLDMpOwkJLyogYWRqdXN0IGRhdGEgZmllbGQgc28gdGhhdCBpdCBwb2ludHMgdG8gRkMgYnl0ZSAqLworCQkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CQkvKiBwYXNzIHVwIHBhY2tldCBsZW5ndGgsIE5PVCBpbmNsdWRpbmcgQ1JDICovCisJCQkJCXNrYi0+ZGV2ID0gYnAtPmRldjsJCS8qIHBhc3MgdXAgZGV2aWNlIHBvaW50ZXIgKi8KKworCQkJCQlza2ItPnByb3RvY29sID0gZmRkaV90eXBlX3RyYW5zKHNrYiwgYnAtPmRldik7CisJCQkJCWJwLT5yY3ZfdG90YWxfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQkJCW5ldGlmX3J4KHNrYik7CisKKwkJCQkJLyogVXBkYXRlIHRoZSByY3YgY291bnRlcnMgKi8KKwkJCQkJYnAtPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJCWJwLT5yY3ZfdG90YWxfZnJhbWVzKys7CisJCQkJCWlmICgqKHBfYnVmZiArIFJDVl9CVUZGX0tfREEpICYgMHgwMSkKKwkJCQkJCWJwLT5yY3ZfbXVsdGljYXN0X2ZyYW1lcysrOworCQkJCX0KKwkJCX0KKwkJCX0KKworCQkvKgorCQkgKiBBZHZhbmNlIHRoZSBwcm9kdWNlciAoZm9yIHJlY3ljbGluZykgYW5kIGFkdmFuY2UgdGhlIGNvbXBsZXRpb24KKwkJICogKGZvciBzZXJ2aWNpbmcgcmVjZWl2ZWQgZnJhbWVzKS4gIE5vdGUgdGhhdCBpdCBpcyBva2F5IHRvCisJCSAqIGFkdmFuY2UgdGhlIHByb2R1Y2VyIHdpdGhvdXQgY2hlY2tpbmcgdGhhdCBpdCBwYXNzZXMgdGhlCisJCSAqIGNvbXBsZXRpb24gaW5kZXggYmVjYXVzZSB0aGV5IGFyZSBib3RoIGFkdmFuY2VkIGF0IHRoZSBzYW1lCisJCSAqIHJhdGUuCisJCSAqLworCisJCWJwLT5yY3ZfeG10X3JlZy5pbmRleC5yY3ZfcHJvZCArPSAxOworCQlicC0+cmN2X3htdF9yZWcuaW5kZXgucmN2X2NvbXAgKz0gMTsKKwkJfQorCX0KKworDAorLyoKKyAqID09PT09PT09PT09PT09PT09PT09PQorICogPSBkZnhfeG10X3F1ZXVlX3BrdCA9CisgKiA9PT09PT09PT09PT09PT09PT09PT0KKyAqICAgCisgKiBPdmVydmlldzoKKyAqICAgUXVldWVzIHBhY2tldHMgZm9yIHRyYW5zbWlzc2lvbgorICogIAorICogUmV0dXJuczoKKyAqICAgQ29uZGl0aW9uIGNvZGUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBza2IgLSBwb2ludGVyIHRvIHNrX2J1ZmYgdG8gcXVldWUgZm9yIHRyYW5zbWlzc2lvbgorICogICBkZXYgLSBwb2ludGVyIHRvIGRldmljZSBpbmZvcm1hdGlvbgorICoKKyAqIEZ1bmN0aW9uYWwgRGVzY3JpcHRpb246CisgKiAgIEhlcmUgd2UgYXNzdW1lIHRoYXQgYW4gaW5jb21pbmcgc2tiIHRyYW5zbWl0IHJlcXVlc3QKKyAqICAgaXMgY29udGFpbmVkIGluIGEgc2luZ2xlIHBoeXNpY2FsbHkgY29udGlndW91cyBidWZmZXIKKyAqICAgaW4gd2hpY2ggdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgcGFja2V0CisgKiAgIChza2ItPmRhdGEpIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBwaHlzaWNhbCBhZGRyZXNzCisgKiAgIGJ5IHVzaW5nIHBjaV9tYXBfc2luZ2xlKCkuCisgKgorICogICBTaW5jZSB0aGUgYWRhcHRlciBhcmNoaXRlY3R1cmUgcmVxdWlyZXMgYSB0aHJlZSBieXRlCisgKiAgIHBhY2tldCByZXF1ZXN0IGhlYWRlciB0byBwcmVwZW5kIHRoZSBzdGFydCBvZiBwYWNrZXQsCisgKiAgIHdlJ2xsIHdyaXRlIHRoZSB0aHJlZSBieXRlIGZpZWxkIGltbWVkaWF0ZWx5IHByaW9yIHRvCisgKiAgIHRoZSBGQyBieXRlLiAgVGhpcyBhc3N1bXB0aW9uIGlzIHZhbGlkIGJlY2F1c2Ugd2UndmUKKyAqICAgZW5zdXJlZCB0aGF0IGRldi0+aGFyZF9oZWFkZXJfbGVuIGluY2x1ZGVzIHRocmVlIHBhZAorICogICBieXRlcy4gIEJ5IHBvc3RpbmcgYSBzaW5nbGUgZnJhZ21lbnQgdG8gdGhlIGFkYXB0ZXIsCisgKiAgIHdlJ2xsIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGRlc2NyaXB0b3IgZmV0Y2hlcyBhbmQKKyAqICAgYnVzIHRyYWZmaWMgbmVlZGVkIHRvIHNlbmQgdGhlIHJlcXVlc3QuCisgKgorICogICBBbHNvLCB3ZSBjYW4ndCBmcmVlIHRoZSBza2IgdW50aWwgYWZ0ZXIgaXQncyBiZWVuIERNQSdkCisgKiAgIG91dCBieSB0aGUgYWRhcHRlciwgc28gd2UnbGwgcXVldWUgaXQgaW4gdGhlIGRyaXZlciBhbmQKKyAqICAgcmV0dXJuIGl0IGluIGRmeF94bXRfZG9uZS4KKyAqCisgKiBSZXR1cm4gQ29kZXM6CisgKiAgIDAgLSBkcml2ZXIgcXVldWVkIHBhY2tldCwgbGluayBpcyB1bmF2YWlsYWJsZSwgb3Igc2tidWZmIHdhcyBiYWQKKyAqCSAxIC0gY2FsbGVyIHNob3VsZCByZXF1ZXVlIHRoZSBza19idWZmIGZvciBsYXRlciB0cmFuc21pc3Npb24KKyAqCisgKiBBc3N1bXB0aW9uczoKKyAqCSBGaXJzdCBhbmQgZm9yZW1vc3QsIHdlIGFzc3VtZSB0aGUgaW5jb21pbmcgc2tiIHBvaW50ZXIKKyAqICAgaXMgTk9UIE5VTEwgYW5kIGlzIHBvaW50aW5nIHRvIGEgdmFsaWQgc2tfYnVmZiBzdHJ1Y3R1cmUuCisgKgorICogICBUaGUgb3V0Z29pbmcgcGFja2V0IGlzIGNvbXBsZXRlLCBzdGFydGluZyB3aXRoIHRoZQorICogICBmcmFtZSBjb250cm9sIGJ5dGUgaW5jbHVkaW5nIHRoZSBsYXN0IGJ5dGUgb2YgZGF0YSwKKyAqICAgYnV0IE5PVCBpbmNsdWRpbmcgdGhlIDQgYnl0ZSBDUkMuICBXZSdsbCBsZXQgdGhlCisgKiAgIGFkYXB0ZXIgaGFyZHdhcmUgZ2VuZXJhdGUgYW5kIGFwcGVuZCB0aGUgQ1JDLgorICoKKyAqICAgVGhlIGVudGlyZSBwYWNrZXQgaXMgc3RvcmVkIGluIG9uZSBwaHlzaWNhbGx5CisgKiAgIGNvbnRpZ3VvdXMgYnVmZmVyIHdoaWNoIGlzIG5vdCBjYWNoZWQgYW5kIHdob3NlCisgKiAgIDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIGNhbiBiZSBkZXRlcm1pbmVkLgorICoKKyAqICAgSXQncyB2aXRhbCB0aGF0IHRoaXMgcm91dGluZSBpcyBOT1QgcmVlbnRlcmVkIGZvciB0aGUKKyAqICAgc2FtZSBib2FyZCBhbmQgdGhhdCB0aGUgT1MgaXMgbm90IGluIGFub3RoZXIgc2VjdGlvbiBvZgorICogICBjb2RlIChlZy4gZGZ4X2ludF9jb21tb24pIGZvciB0aGUgc2FtZSBib2FyZCBvbiBhCisgKiAgIGRpZmZlcmVudCB0aHJlYWQuCisgKgorICogU2lkZSBFZmZlY3RzOgorICogICBOb25lCisgKi8KKworc3RhdGljIGludCBkZnhfeG10X3F1ZXVlX3BrdCgKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiLAorCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXYKKwkpCisKKwl7CisJREZYX2JvYXJkX3QJCSpicCA9IGRldi0+cHJpdjsKKwl1OAkJCXByb2Q7CQkJCS8qIGxvY2FsIHRyYW5zbWl0IHByb2R1Y2VyIGluZGV4ICovCisJUElfWE1UX0RFU0NSCQkqcF94bXRfZGVzY3I7CQkvKiBwdHIgdG8gdHJhbnNtaXQgZGVzY3JpcHRvciBibG9jayBlbnRyeSAqLworCVhNVF9EUklWRVJfREVTQ1IJKnBfeG10X2Rydl9kZXNjcjsJLyogcHRyIHRvIHRyYW5zbWl0IGRyaXZlciBkZXNjcmlwdG9yICovCisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJLyoKKwkgKiBWZXJpZnkgdGhhdCBpbmNvbWluZyB0cmFuc21pdCByZXF1ZXN0IGlzIE9LCisJICoKKwkgKiBOb3RlOiBUaGUgcGFja2V0IHNpemUgY2hlY2sgaXMgY29uc2lzdGVudCB3aXRoIG90aGVyCisJICoJCSBMaW51eCBkZXZpY2UgZHJpdmVycywgYWx0aG91Z2ggdGhlIGNvcnJlY3QgcGFja2V0CisJICoJCSBzaXplIHNob3VsZCBiZSB2ZXJpZmllZCBiZWZvcmUgY2FsbGluZyB0aGUKKwkgKgkJIHRyYW5zbWl0IHJvdXRpbmUuCisJICovCisKKwlpZiAoIUlOX1JBTkdFKHNrYi0+bGVuLCBGRERJX0tfTExDX1pMRU4sIEZERElfS19MTENfTEVOKSkKKwl7CisJCXByaW50aygiJXM6IEludmFsaWQgcGFja2V0IGxlbmd0aCAtICV1IGJ5dGVzXG4iLCAKKwkJCWRldi0+bmFtZSwgc2tiLT5sZW4pOworCQlicC0+eG10X2xlbmd0aF9lcnJvcnMrKzsJCS8qIGJ1bXAgZXJyb3IgY291bnRlciAqLworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuKDApOwkJCQkvKiByZXR1cm4gInN1Y2Nlc3MiICovCisJfQorCS8qCisJICogU2VlIGlmIGFkYXB0ZXIgbGluayBpcyBhdmFpbGFibGUsIGlmIG5vdCwgZnJlZSBidWZmZXIKKwkgKgorCSAqIE5vdGU6IElmIHRoZSBsaW5rIGlzbid0IGF2YWlsYWJsZSwgZnJlZSBidWZmZXIgYW5kIHJldHVybiAwCisJICoJCSByYXRoZXIgdGhhbiB0ZWxsIHRoZSB1cHBlciBsYXllciB0byByZXF1ZXVlIHRoZSBwYWNrZXQuCisJICoJCSBUaGUgbWV0aG9kb2xvZ3kgaGVyZSBpcyB0aGF0IGJ5IHRoZSB0aW1lIHRoZSBsaW5rCisJICoJCSBiZWNvbWVzIGF2YWlsYWJsZSwgdGhlIHBhY2tldCB0byBiZSBzZW50IHdpbGwgYmUKKwkgKgkJIGZhaXJseSBzdGFsZS4gIEJ5IHNpbXBseSBkcm9wcGluZyB0aGUgcGFja2V0LCB0aGUKKwkgKgkJIGhpZ2hlciBsYXllciBwcm90b2NvbHMgd2lsbCBldmVudHVhbGx5IHRpbWUgb3V0CisJICoJCSB3YWl0aW5nIGZvciByZXNwb25zZSBwYWNrZXRzIHdoaWNoIGl0IHdvbid0IHJlY2VpdmUuCisJICovCisKKwlpZiAoYnAtPmxpbmtfYXZhaWxhYmxlID09IFBJX0tfRkFMU0UpCisJCXsKKwkJaWYgKGRmeF9od19hZGFwX3N0YXRlX3JkKGJwKSA9PSBQSV9TVEFURV9LX0xJTktfQVZBSUwpCS8qIGlzIGxpbmsgcmVhbGx5IGF2YWlsYWJsZT8gKi8KKwkJCWJwLT5saW5rX2F2YWlsYWJsZSA9IFBJX0tfVFJVRTsJCS8qIGlmIHNvLCBzZXQgZmxhZyBhbmQgY29udGludWUgKi8KKwkJZWxzZQorCQkJeworCQkJYnAtPnhtdF9kaXNjYXJkcysrOwkJCQkJLyogYnVtcCBlcnJvciBjb3VudGVyICovCisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CQkvKiBmcmVlIHNrX2J1ZmYgbm93ICovCisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQlyZXR1cm4oMCk7CQkJCQkJCS8qIHJldHVybiAic3VjY2VzcyIgKi8KKwkJCX0KKwkJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJwLT5sb2NrLCBmbGFncyk7CisJCisJLyogR2V0IHRoZSBjdXJyZW50IHByb2R1Y2VyIGFuZCB0aGUgbmV4dCBmcmVlIHhtdCBkYXRhIGRlc2NyaXB0b3IgKi8KKworCXByb2QJCT0gYnAtPnJjdl94bXRfcmVnLmluZGV4LnhtdF9wcm9kOworCXBfeG10X2Rlc2NyID0gJihicC0+ZGVzY3JfYmxvY2tfdmlydC0+eG10X2RhdGFbcHJvZF0pOworCisJLyoKKwkgKiBHZXQgcG9pbnRlciB0byBhdXhpbGlhcnkgcXVldWUgZW50cnkgdG8gY29udGFpbiBpbmZvcm1hdGlvbgorCSAqIGZvciB0aGlzIHBhY2tldC4KKwkgKgorCSAqIE5vdGU6IFRoZSBjdXJyZW50IHhtdCBwcm9kdWNlciBpbmRleCB3aWxsIGJlY29tZSB0aGUKKwkgKgkgY3VycmVudCB4bXQgY29tcGxldGlvbiBpbmRleCB3aGVuIHdlIGNvbXBsZXRlIHRoaXMKKwkgKgkgcGFja2V0IGxhdGVyIG9uLiAgU28sIHdlJ2xsIGdldCB0aGUgcG9pbnRlciB0byB0aGUKKwkgKgkgbmV4dCBhdXhpbGlhcnkgcXVldWUgZW50cnkgbm93IGJlZm9yZSB3ZSBidW1wIHRoZQorCSAqCSBwcm9kdWNlciBpbmRleC4KKwkgKi8KKworCXBfeG10X2Rydl9kZXNjciA9ICYoYnAtPnhtdF9kcnZfZGVzY3JfYmxrW3Byb2QrK10pOwkvKiBhbHNvIGJ1bXAgcHJvZHVjZXIgaW5kZXggKi8KKworCS8qIFdyaXRlIHRoZSB0aHJlZSBQUkggYnl0ZXMgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBGQyBieXRlICovCisKKwlza2JfcHVzaChza2IsMyk7CisJc2tiLT5kYXRhWzBdID0gREZYX1BSSDBfQllURTsJLyogdGhlc2UgYnl0ZSB2YWx1ZXMgYXJlIGRlZmluZWQgKi8KKwlza2ItPmRhdGFbMV0gPSBERlhfUFJIMV9CWVRFOwkvKiBpbiB0aGUgTW90b3JvbGEgRkRESSBNQUMgY2hpcCAqLworCXNrYi0+ZGF0YVsyXSA9IERGWF9QUkgyX0JZVEU7CS8qIHNwZWNpZmljYXRpb24gKi8KKworCS8qCisJICogV3JpdGUgdGhlIGRlc2NyaXB0b3Igd2l0aCBidWZmZXIgaW5mbyBhbmQgYnVtcCBwcm9kdWNlcgorCSAqCisJICogTm90ZTogU2luY2Ugd2UgbmVlZCB0byBzdGFydCBETUEgZnJvbSB0aGUgcGFja2V0IHJlcXVlc3QKKwkgKgkJIGhlYWRlciwgd2UnbGwgYWRkIDMgYnl0ZXMgdG8gdGhlIERNQSBidWZmZXIgbGVuZ3RoLAorCSAqCQkgYW5kIHdlJ2xsIGRldGVybWluZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUKKwkgKgkJIGJ1ZmZlciBmcm9tIHRoZSBQUkgsIG5vdCBza2ItPmRhdGEuCisJICoKKwkgKiBBc3N1bXB0aW9uczoKKwkgKgkJIDEuIFBhY2tldCBzdGFydHMgd2l0aCB0aGUgZnJhbWUgY29udHJvbCAoRkMpIGJ5dGUKKwkgKgkJICAgIGF0IHNrYi0+ZGF0YS4KKwkgKgkJIDIuIFRoZSA0LWJ5dGUgQ1JDIGlzIG5vdCBhcHBlbmRlZCB0byB0aGUgYnVmZmVyIG9yCisJICoJCQlpbmNsdWRlZCBpbiB0aGUgbGVuZ3RoLgorCSAqCQkgMy4gUGFja2V0IGxlbmd0aCAoc2tiLT5sZW4pIGlzIGZyb20gRkMgdG8gZW5kIG9mCisJICoJCQlkYXRhLCBpbmNsdXNpdmUuCisJICoJCSA0LiBUaGUgcGFja2V0IGxlbmd0aCBkb2VzIG5vdCBleGNlZWQgdGhlIG1heGltdW0KKwkgKgkJCUZEREkgTExDIGZyYW1lIGxlbmd0aCBvZiA0NDkxIGJ5dGVzLgorCSAqCQkgNS4gVGhlIGVudGlyZSBwYWNrZXQgaXMgY29udGFpbmVkIGluIGEgcGh5c2ljYWxseQorCSAqCQkJY29udGlndW91cywgbm9uLWNhY2hlZCwgbG9ja2VkIG1lbW9yeSBzcGFjZQorCSAqCQkJY29tcHJpc2VkIG9mIGEgc2luZ2xlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5CisJICoJCQlza2ItPmRhdGEuCisJICoJCSA2LiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgcGFja2V0CisJICoJCQljYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSB2aXJ0dWFsIGFkZHJlc3MKKwkgKgkJCWJ5IHVzaW5nIHBjaV9tYXBfc2luZ2xlKCkgYW5kIGlzIG9ubHkgMzItYml0cworCSAqCQkJd2lkZS4KKwkgKi8KKworCXBfeG10X2Rlc2NyLT5sb25nXzAJPSAodTMyKSAoUElfWE1UX0RFU0NSX01fU09QIHwgUElfWE1UX0RFU0NSX01fRU9QIHwgKChza2ItPmxlbikgPDwgUElfWE1UX0RFU0NSX1ZfU0VHX0xFTikpOworCXBfeG10X2Rlc2NyLT5sb25nXzEgPSAodTMyKXBjaV9tYXBfc2luZ2xlKGJwLT5wY2lfZGV2LCBza2ItPmRhdGEsCisJCQkJCQkgIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCS8qCisJICogVmVyaWZ5IHRoYXQgZGVzY3JpcHRvciBpcyBhY3R1YWxseSBhdmFpbGFibGUKKwkgKgorCSAqIE5vdGU6IElmIGRlc2NyaXB0b3IgaXNuJ3QgYXZhaWxhYmxlLCByZXR1cm4gMSB3aGljaCB0ZWxscworCSAqCSB0aGUgdXBwZXIgbGF5ZXIgdG8gcmVxdWV1ZSB0aGUgcGFja2V0IGZvciBsYXRlcgorCSAqCSB0cmFuc21pc3Npb24uCisJICoKKwkgKiAgICAgICBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBwcm9kdWNlciBuZXZlciByZWFjaGVzIHRoZQorCSAqCSBjb21wbGV0aW9uLCBleGNlcHQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcXVldWUgaXMgZW1wdHkuCisJICovCisKKwlpZiAocHJvZCA9PSBicC0+cmN2X3htdF9yZWcuaW5kZXgueG10X2NvbXApCisJeworCQlza2JfcHVsbChza2IsMyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5sb2NrLCBmbGFncyk7CisJCXJldHVybigxKTsJCQkvKiByZXF1ZXVlIHBhY2tldCBmb3IgbGF0ZXIgKi8KKwl9CisKKwkvKgorCSAqIFNhdmUgaW5mbyBmb3IgdGhpcyBwYWNrZXQgZm9yIHhtdCBkb25lIGluZGljYXRpb24gcm91dGluZQorCSAqCisJICogTm9ybWFsbHksIHdlJ2Qgc2F2ZSB0aGUgcHJvZHVjZXIgaW5kZXggaW4gdGhlIHBfeG10X2Rydl9kZXNjcgorCSAqIHN0cnVjdHVyZSBzbyB0aGF0IHdlJ2QgaGF2ZSBpdCBoYW5keSB3aGVuIHdlIGNvbXBsZXRlIHRoaXMKKwkgKiBwYWNrZXQgbGF0ZXIgKGluIGRmeF94bXRfZG9uZSkuICBIb3dldmVyLCBzaW5jZSB0aGUgY3VycmVudAorCSAqIHRyYW5zbWl0IGFyY2hpdGVjdHVyZSBndWFyYW50ZWVzIGEgc2luZ2xlIGZyYWdtZW50IGZvciB0aGUKKwkgKiBlbnRpcmUgcGFja2V0LCB3ZSBjYW4gc2ltcGx5IGJ1bXAgdGhlIGNvbXBsZXRpb24gaW5kZXggYnkKKwkgKiBvbmUgKDEpIGZvciBlYWNoIGNvbXBsZXRlZCBwYWNrZXQuCisJICoKKwkgKiBOb3RlOiBJZiB0aGlzIGFzc3VtcHRpb24gY2hhbmdlcyBhbmQgd2UncmUgcHJlc2VudGVkIHdpdGgKKwkgKgkgYW4gaW5jb25zaXN0ZW50IG51bWJlciBvZiB0cmFuc21pdCBmcmFnbWVudHMgZm9yIHBhY2tldAorCSAqCSBkYXRhLCB3ZSdsbCBuZWVkIHRvIG1vZGlmeSB0aGlzIGNvZGUgdG8gc2F2ZSB0aGUgY3VycmVudAorCSAqCSB0cmFuc21pdCBwcm9kdWNlciBpbmRleC4KKwkgKi8KKworCXBfeG10X2Rydl9kZXNjci0+cF9za2IgPSBza2I7CisKKwkvKiBVcGRhdGUgVHlwZSAyIHJlZ2lzdGVyICovCisKKwlicC0+cmN2X3htdF9yZWcuaW5kZXgueG10X3Byb2QgPSBwcm9kOworCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBJX1BEUV9LX1JFR19UWVBFXzJfUFJPRCwgYnAtPnJjdl94bXRfcmVnLmx3b3JkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+bG9jaywgZmxhZ3MpOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlyZXR1cm4oMCk7CQkJCQkJCS8qIHBhY2tldCBxdWV1ZWQgdG8gYWRhcHRlciAqLworCX0KKworDAorLyoKKyAqID09PT09PT09PT09PT09PT0KKyAqID0gZGZ4X3htdF9kb25lID0KKyAqID09PT09PT09PT09PT09PT0KKyAqICAgCisgKiBPdmVydmlldzoKKyAqICAgUHJvY2Vzc2VzIGFsbCBmcmFtZXMgdGhhdCBoYXZlIGJlZW4gdHJhbnNtaXR0ZWQuCisgKiAgCisgKiBSZXR1cm5zOgorICogICBOb25lCisgKiAgICAgICAKKyAqIEFyZ3VtZW50czoKKyAqICAgYnAgLSBwb2ludGVyIHRvIGJvYXJkIGluZm9ybWF0aW9uCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgRm9yIGFsbCBjb25zdW1lZCB0cmFuc21pdCBkZXNjcmlwdG9ycyB0aGF0IGhhdmUgbm90CisgKiAgIHlldCBiZWVuIGNvbXBsZXRlZCwgd2UnbGwgZnJlZSB0aGUgc2tiIHdlIHdlcmUgaG9sZGluZworICogICBvbnRvIHVzaW5nIGRldl9rZnJlZV9za2IgYW5kIGJ1bXAgdGhlIGFwcHJvcHJpYXRlCisgKiAgIGNvdW50ZXJzLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgTm9uZQorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBUaGUgVHlwZSAyIHJlZ2lzdGVyIGlzIG5vdCB1cGRhdGVkIGluIHRoaXMgcm91dGluZS4gIEl0IGlzCisgKiAgIGFzc3VtZWQgdGhhdCBpdCB3aWxsIGJlIHVwZGF0ZWQgaW4gdGhlIElTUiB3aGVuIGRmeF94bXRfZG9uZQorICogICByZXR1cm5zLgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgTm9uZQorICovCisKK3N0YXRpYyBpbnQgZGZ4X3htdF9kb25lKERGWF9ib2FyZF90ICpicCkKKwl7CisJWE1UX0RSSVZFUl9ERVNDUgkqcF94bXRfZHJ2X2Rlc2NyOwkvKiBwdHIgdG8gdHJhbnNtaXQgZHJpdmVyIGRlc2NyaXB0b3IgKi8KKwlQSV9UWVBFXzJfQ09OU1VNRVIJKnBfdHlwZV8yX2NvbnM7CQkvKiBwdHIgdG8gcmN2L3htdCBjb25zdW1lciBibG9jayByZWdpc3RlciAqLworCXU4CQkJY29tcDsJCQkvKiBsb2NhbCB0cmFuc21pdCBjb21wbGV0aW9uIGluZGV4ICovCisJaW50IAkJCWZyZWVkID0gMDsJCS8qIGJ1ZmZlcnMgZnJlZWQgKi8KKworCS8qIFNlcnZpY2UgYWxsIGNvbnN1bWVkIHRyYW5zbWl0IGZyYW1lcyAqLworCisJcF90eXBlXzJfY29ucyA9IChQSV9UWVBFXzJfQ09OU1VNRVIgKikoJmJwLT5jb25zX2Jsb2NrX3ZpcnQtPnhtdF9yY3ZfZGF0YSk7CisJd2hpbGUgKGJwLT5yY3ZfeG10X3JlZy5pbmRleC54bXRfY29tcCAhPSBwX3R5cGVfMl9jb25zLT5pbmRleC54bXRfY29ucykKKwkJeworCQkvKiBHZXQgcG9pbnRlciB0byB0aGUgdHJhbnNtaXQgZHJpdmVyIGRlc2NyaXB0b3IgYmxvY2sgaW5mb3JtYXRpb24gKi8KKworCQlwX3htdF9kcnZfZGVzY3IgPSAmKGJwLT54bXRfZHJ2X2Rlc2NyX2Jsa1ticC0+cmN2X3htdF9yZWcuaW5kZXgueG10X2NvbXBdKTsKKworCQkvKiBJbmNyZW1lbnQgdHJhbnNtaXQgY291bnRlcnMgKi8KKworCQlicC0+eG10X3RvdGFsX2ZyYW1lcysrOworCQlicC0+eG10X3RvdGFsX2J5dGVzICs9IHBfeG10X2Rydl9kZXNjci0+cF9za2ItPmxlbjsKKworCQkvKiBSZXR1cm4gc2tiIHRvIG9wZXJhdGluZyBzeXN0ZW0gKi8KKwkJY29tcCA9IGJwLT5yY3ZfeG10X3JlZy5pbmRleC54bXRfY29tcDsKKwkJcGNpX3VubWFwX3NpbmdsZShicC0+cGNpX2RldiwKKwkJCQkgYnAtPmRlc2NyX2Jsb2NrX3ZpcnQtPnhtdF9kYXRhW2NvbXBdLmxvbmdfMSwKKwkJCQkgcF94bXRfZHJ2X2Rlc2NyLT5wX3NrYi0+bGVuLAorCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYl9pcnEocF94bXRfZHJ2X2Rlc2NyLT5wX3NrYik7CisKKwkJLyoKKwkJICogTW92ZSB0byBzdGFydCBvZiBuZXh0IHBhY2tldCBieSB1cGRhdGluZyBjb21wbGV0aW9uIGluZGV4CisJCSAqCisJCSAqIEhlcmUgd2UgYXNzdW1lIHRoYXQgYSB0cmFuc21pdCBwYWNrZXQgcmVxdWVzdCBpcyBhbHdheXMKKwkJICogc2VydmljZWQgYnkgcG9zdGluZyBvbmUgZnJhZ21lbnQuICBXZSBjYW4gdGhlcmVmb3JlCisJCSAqIHNpbXBsaWZ5IHRoZSBjb21wbGV0aW9uIGNvZGUgYnkgaW5jcmVtZW50aW5nIHRoZQorCQkgKiBjb21wbGV0aW9uIGluZGV4IGJ5IG9uZS4gIFRoaXMgY29kZSB3aWxsIG5lZWQgdG8gYmUKKwkJICogbW9kaWZpZWQgaWYgdGhpcyBhc3N1bXB0aW9uIGNoYW5nZXMuICBTZWUgY29tbWVudHMKKwkJICogaW4gZGZ4X3htdF9xdWV1ZV9wa3QgZm9yIG1vcmUgZGV0YWlscy4KKwkJICovCisKKwkJYnAtPnJjdl94bXRfcmVnLmluZGV4LnhtdF9jb21wICs9IDE7CisJCWZyZWVkKys7CisJCX0KKwlyZXR1cm4gZnJlZWQ7CisJfQorCisMCisvKgorICogPT09PT09PT09PT09PT09PT0KKyAqID0gZGZ4X3Jjdl9mbHVzaCA9CisgKiA9PT09PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBSZW1vdmUgYWxsIHNrYidzIGluIHRoZSByZWNlaXZlIHJpbmcuCisgKiAgCisgKiBSZXR1cm5zOgorICogICBOb25lCisgKiAgICAgICAKKyAqIEFyZ3VtZW50czoKKyAqICAgYnAgLSBwb2ludGVyIHRvIGJvYXJkIGluZm9ybWF0aW9uCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgRnJlZSdzIGFsbCB0aGUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHNrYidzIHRoYXQgYXJlCisgKiAgIGN1cnJlbnRseSBhdHRhY2hlZCB0byB0aGUgZGV2aWNlIHJlY2VpdmUgcmluZy4gVGhpcworICogICBmdW5jdGlvbiBpcyB0eXBpY2FsbHkgb25seSB1c2VkIHdoZW4gdGhlIGRldmljZSBpcworICogICBpbml0aWFsaXplZCBvciByZWluaXRpYWxpemVkLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgTm9uZQorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgTm9uZQorICovCisjaWZkZWYgRFlOQU1JQ19CVUZGRVJTCitzdGF0aWMgdm9pZCBkZnhfcmN2X2ZsdXNoKCBERlhfYm9hcmRfdCAqYnAgKQorCXsKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCAoaW50KShicC0+cmN2X2J1ZnNfdG9fcG9zdCk7IGkrKykKKwkJZm9yIChqID0gMDsgKGkgKyBqKSA8IChpbnQpUElfUkNWX0RBVEFfS19OVU1fRU5UUklFUzsgaiArPSBicC0+cmN2X2J1ZnNfdG9fcG9zdCkKKwkJeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKWJwLT5wX3Jjdl9idWZmX3ZhW2kral07CisJCQlpZiAoc2tiKQorCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCWJwLT5wX3Jjdl9idWZmX3ZhW2kral0gPSBOVUxMOworCQl9CisKKwl9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGRmeF9yY3ZfZmx1c2goIERGWF9ib2FyZF90ICpicCApCit7Cit9CisjZW5kaWYgLyogRFlOQU1JQ19CVUZGRVJTICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PQorICogPSBkZnhfeG10X2ZsdXNoID0KKyAqID09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIFByb2Nlc3NlcyBhbGwgZnJhbWVzIHdoZXRoZXIgdGhleSd2ZSBiZWVuIHRyYW5zbWl0dGVkCisgKiAgIG9yIG5vdC4KKyAqICAKKyAqIFJldHVybnM6CisgKiAgIE5vbmUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBicCAtIHBvaW50ZXIgdG8gYm9hcmQgaW5mb3JtYXRpb24KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBGb3IgYWxsIHByb2R1Y2VkIHRyYW5zbWl0IGRlc2NyaXB0b3JzIHRoYXQgaGF2ZSBub3QKKyAqICAgeWV0IGJlZW4gY29tcGxldGVkLCB3ZSdsbCBmcmVlIHRoZSBza2Igd2Ugd2VyZSBob2xkaW5nCisgKiAgIG9udG8gdXNpbmcgZGV2X2tmcmVlX3NrYiBhbmQgYnVtcCB0aGUgYXBwcm9wcmlhdGUKKyAqICAgY291bnRlcnMuICBPZiBjb3Vyc2UsIGl0J3MgcG9zc2libGUgdGhhdCBzb21lIG9mCisgKiAgIHRoZXNlIHRyYW5zbWl0IHJlcXVlc3RzIGFjdHVhbGx5IGRpZCBnbyBvdXQsIGJ1dCB3ZQorICogICB3b24ndCBtYWtlIHRoYXQgZGlzdGluY3Rpb24gaGVyZS4gIEZpbmFsbHksIHdlJ2xsCisgKiAgIHVwZGF0ZSB0aGUgY29uc3VtZXIgaW5kZXggdG8gbWF0Y2ggdGhlIHByb2R1Y2VyLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgTm9uZQorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBUaGlzIHJvdXRpbmUgZG9lcyBOT1QgdXBkYXRlIHRoZSBUeXBlIDIgcmVnaXN0ZXIuICBJdAorICogICBpcyBhc3N1bWVkIHRoYXQgdGhpcyByb3V0aW5lIGlzIGJlaW5nIGNhbGxlZCBkdXJpbmcgYQorICogICB0cmFuc21pdCBmbHVzaCBpbnRlcnJ1cHQsIG9yIGEgc2h1dGRvd24gb3IgY2xvc2Ugcm91dGluZS4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIE5vbmUKKyAqLworCitzdGF0aWMgdm9pZCBkZnhfeG10X2ZsdXNoKCBERlhfYm9hcmRfdCAqYnAgKQorCXsKKwl1MzIJCQlwcm9kX2NvbnM7CQkvKiByY3YveG10IGNvbnN1bWVyIGJsb2NrIGxvbmd3b3JkICovCisJWE1UX0RSSVZFUl9ERVNDUgkqcF94bXRfZHJ2X2Rlc2NyOwkvKiBwdHIgdG8gdHJhbnNtaXQgZHJpdmVyIGRlc2NyaXB0b3IgKi8KKwl1OAkJCWNvbXA7CQkJLyogbG9jYWwgdHJhbnNtaXQgY29tcGxldGlvbiBpbmRleCAqLworCisJLyogRmx1c2ggYWxsIG91dHN0YW5kaW5nIHRyYW5zbWl0IGZyYW1lcyAqLworCisJd2hpbGUgKGJwLT5yY3ZfeG10X3JlZy5pbmRleC54bXRfY29tcCAhPSBicC0+cmN2X3htdF9yZWcuaW5kZXgueG10X3Byb2QpCisJCXsKKwkJLyogR2V0IHBvaW50ZXIgdG8gdGhlIHRyYW5zbWl0IGRyaXZlciBkZXNjcmlwdG9yIGJsb2NrIGluZm9ybWF0aW9uICovCisKKwkJcF94bXRfZHJ2X2Rlc2NyID0gJihicC0+eG10X2Rydl9kZXNjcl9ibGtbYnAtPnJjdl94bXRfcmVnLmluZGV4LnhtdF9jb21wXSk7CisKKwkJLyogUmV0dXJuIHNrYiB0byBvcGVyYXRpbmcgc3lzdGVtICovCisJCWNvbXAgPSBicC0+cmN2X3htdF9yZWcuaW5kZXgueG10X2NvbXA7CisJCXBjaV91bm1hcF9zaW5nbGUoYnAtPnBjaV9kZXYsCisJCQkJIGJwLT5kZXNjcl9ibG9ja192aXJ0LT54bXRfZGF0YVtjb21wXS5sb25nXzEsCisJCQkJIHBfeG10X2Rydl9kZXNjci0+cF9za2ItPmxlbiwKKwkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCWRldl9rZnJlZV9za2IocF94bXRfZHJ2X2Rlc2NyLT5wX3NrYik7CisKKwkJLyogSW5jcmVtZW50IHRyYW5zbWl0IGVycm9yIGNvdW50ZXIgKi8KKworCQlicC0+eG10X2Rpc2NhcmRzKys7CisKKwkJLyoKKwkJICogTW92ZSB0byBzdGFydCBvZiBuZXh0IHBhY2tldCBieSB1cGRhdGluZyBjb21wbGV0aW9uIGluZGV4CisJCSAqCisJCSAqIEhlcmUgd2UgYXNzdW1lIHRoYXQgYSB0cmFuc21pdCBwYWNrZXQgcmVxdWVzdCBpcyBhbHdheXMKKwkJICogc2VydmljZWQgYnkgcG9zdGluZyBvbmUgZnJhZ21lbnQuICBXZSBjYW4gdGhlcmVmb3JlCisJCSAqIHNpbXBsaWZ5IHRoZSBjb21wbGV0aW9uIGNvZGUgYnkgaW5jcmVtZW50aW5nIHRoZQorCQkgKiBjb21wbGV0aW9uIGluZGV4IGJ5IG9uZS4gIFRoaXMgY29kZSB3aWxsIG5lZWQgdG8gYmUKKwkJICogbW9kaWZpZWQgaWYgdGhpcyBhc3N1bXB0aW9uIGNoYW5nZXMuICBTZWUgY29tbWVudHMKKwkJICogaW4gZGZ4X3htdF9xdWV1ZV9wa3QgZm9yIG1vcmUgZGV0YWlscy4KKwkJICovCisKKwkJYnAtPnJjdl94bXRfcmVnLmluZGV4LnhtdF9jb21wICs9IDE7CisJCX0KKworCS8qIFVwZGF0ZSB0aGUgdHJhbnNtaXQgY29uc3VtZXIgaW5kZXggaW4gdGhlIGNvbnN1bWVyIGJsb2NrICovCisKKwlwcm9kX2NvbnMgPSAodTMyKShicC0+Y29uc19ibG9ja192aXJ0LT54bXRfcmN2X2RhdGEgJiB+UElfQ09OU19NX1hNVF9JTkRFWCk7CisJcHJvZF9jb25zIHw9ICh1MzIpKGJwLT5yY3ZfeG10X3JlZy5pbmRleC54bXRfcHJvZCA8PCBQSV9DT05TX1ZfWE1UX0lOREVYKTsKKwlicC0+Y29uc19ibG9ja192aXJ0LT54bXRfcmN2X2RhdGEgPSBwcm9kX2NvbnM7CisJfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZGZ4X3JlbW92ZV9vbmVfcGNpX29yX2Vpc2Eoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJREZYX2JvYXJkX3QJKmJwID0gZGV2LT5wcml2OworCWludAkJYWxsb2Nfc2l6ZTsJCS8qIHRvdGFsIGJ1ZmZlciBzaXplIHVzZWQgKi8KKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsICBwZGV2ID8gUEZJX0tfQ1NSX0lPX0xFTiA6IFBJX0VTSUNfS19DU1JfSU9fTEVOICk7CisKKwlhbGxvY19zaXplID0gc2l6ZW9mKFBJX0RFU0NSX0JMT0NLKSArCisJCSAgICAgUElfQ01EX1JFUV9LX1NJWkVfTUFYICsgUElfQ01EX1JTUF9LX1NJWkVfTUFYICsKKyNpZm5kZWYgRFlOQU1JQ19CVUZGRVJTCisJCSAgICAgKGJwLT5yY3ZfYnVmc190b19wb3N0ICogUElfUkNWX0RBVEFfS19TSVpFX01BWCkgKworI2VuZGlmCisJCSAgICAgc2l6ZW9mKFBJX0NPTlNVTUVSX0JMT0NLKSArCisJCSAgICAgKFBJX0FMSUdOX0tfREVTQ19CTEsgLSAxKTsKKwlpZiAoYnAtPmttYWxsb2NlZCkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBhbGxvY19zaXplLCBicC0+a21hbGxvY2VkLAorCQkJCSAgICBicC0+a21hbGxvY2VkX2RtYSk7CisJZnJlZV9uZXRkZXYoZGV2KTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGRmeF9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJZGZ4X3JlbW92ZV9vbmVfcGNpX29yX2Vpc2EocGRldiwgZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBkZnhfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9ERUMsIFBDSV9ERVZJQ0VfSURfREVDX0ZEREksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyAwLCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGRmeF9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRmeF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImRlZnh4IiwKKwkucHJvYmUJCT0gZGZ4X2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZGZ4X3JlbW92ZV9vbmUpLAorCS5pZF90YWJsZQk9IGRmeF9wY2lfdGJsLAorfTsKKworc3RhdGljIGludCBkZnhfaGF2ZV9wY2k7CitzdGF0aWMgaW50IGRmeF9oYXZlX2Vpc2E7CisKKworc3RhdGljIHZvaWQgX19leGl0IGRmeF9laXNhX2NsZWFudXAodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcm9vdF9kZnhfZWlzYV9kZXY7CisKKwl3aGlsZSAoZGV2KQorCXsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKnRtcDsKKwkJREZYX2JvYXJkX3QgKmJwOworCisJCWJwID0gKERGWF9ib2FyZF90KilkZXYtPnByaXY7CisJCXRtcCA9IGJwLT5uZXh0OworCQlkZnhfcmVtb3ZlX29uZV9wY2lfb3JfZWlzYShOVUxMLCBkZXYpOworCQlkZXYgPSB0bXA7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBkZnhfaW5pdCh2b2lkKQoreworCWludCByY19wY2ksIHJjX2Vpc2E7CisKKwlyY19wY2kgPSBwY2lfbW9kdWxlX2luaXQoJmRmeF9kcml2ZXIpOworCWlmIChyY19wY2kgPj0gMCkgZGZ4X2hhdmVfcGNpID0gMTsKKwkKKwlyY19laXNhID0gZGZ4X2Vpc2FfaW5pdCgpOworCWlmIChyY19laXNhID49IDApIGRmeF9oYXZlX2Vpc2EgPSAxOworCisJcmV0dXJuICgocmNfZWlzYSA8IDApID8gMCA6IHJjX2Vpc2EpICArICgocmNfcGNpIDwgMCkgPyAwIDogcmNfcGNpKTsgCit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkZnhfY2xlYW51cCh2b2lkKQoreworCWlmIChkZnhfaGF2ZV9wY2kpCisJCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZGZ4X2RyaXZlcik7CisJaWYgKGRmeF9oYXZlX2Vpc2EpCisJCWRmeF9laXNhX2NsZWFudXAoKTsKKwkJCit9CQorCittb2R1bGVfaW5pdChkZnhfaW5pdCk7Cittb2R1bGVfZXhpdChkZnhfY2xlYW51cCk7CitNT0RVTEVfQVVUSE9SKCJMYXdyZW5jZSBWLiBTdGVmYW5pIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRFQyBGRERJY29udHJvbGxlciBFSVNBL1BDSSAoREVGRUEvREVGUEEpIGRyaXZlciAiCisJCSAgIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBrZXJuZWwtY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1EX19LRVJORUxfXyAtSS9yb290L2xpbnV4L2luY2x1ZGUgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzIgLXBpcGUgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1zdHJlbmd0aC1yZWR1Y2UgLW00ODYgLW1hbGlnbi1sb29wcz0yIC1tYWxpZ24tanVtcHM9MiAtbWFsaWduLWZ1bmN0aW9ucz0yIC1jIGRlZnh4LmMiCisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlZnh4LmggYi9kcml2ZXJzL25ldC9kZWZ4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ODBiODAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kZWZ4eC5oCkBAIC0wLDAgKzEsMTc3OCBAQAorLyoKKyAqIEZpbGUgTmFtZToKKyAqICAgZGVmeHguaAorICoKKyAqIENvcHlyaWdodCBJbmZvcm1hdGlvbjoKKyAqICAgQ29weXJpZ2h0IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uIDE5OTYuCisgKgorICogICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogQWJzdHJhY3Q6CisgKiAgIENvbnRhaW5zIGFsbCBkZWZpbml0aW9ucyBzcGVjaWZpZWQgYnkgcG9ydCBzcGVjaWZpY2F0aW9uIGFuZCByZXF1aXJlZAorICogICBieSB0aGUgZGVmeHguYyBkcml2ZXIuCisgKgorICogVGhlIG9yaWdpbmFsIGF1dGhvcjoKKyAqICAgTFZTCUxhd3JlbmNlIFYuIFN0ZWZhbmkgPGxzdGVmYW5pQHlhaG9vLmNvbT4KKyAqCisgKiBNYWludGFpbmVyczoKKyAqICAgbWFjcm8JTWFjaWVqIFcuIFJvenlja2kgPG1hY3JvQGxpbnV4LW1pcHMub3JnPgorICoKKyAqIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgorICoJCURhdGUJCU5hbWUJRGVzY3JpcHRpb24KKyAqCQkxNi1BdWctOTYJTFZTCQlDcmVhdGVkLgorICoJCTA5LVNlcC05NglMVlMJCUFkZGVkIGdyb3VwX3Byb20gZmllbGQuICBNb3ZlZCByZWFkL3dyaXRlIEkvTworICoJCQkJCQkJbWFjcm9zIHRvIERFRlhYLkMuCisgKgkJMTItU2VwLTk2CUxWUwkJUmVtb3ZlZCBwYWNrZXQgcmVxdWVzdCBoZWFkZXIgcG9pbnRlcnMuCisgKgkJMDQgQXVnIDIwMDMJbWFjcm8JCUNvbnZlcnRlZCB0byB0aGUgRE1BIEFQSS4KKyAqLworCisjaWZuZGVmIF9ERUZYWF9IXworI2RlZmluZSBfREVGWFhfSF8KKworLyogRGVmaW5lIGJhc2ljIHR5cGVzIGZvciB1bnNpZ25lZCBjaGFycywgc2hvcnRzLCBsb25ncyAqLworCit0eXBlZGVmIHU4CVBJX1VJTlQ4OwordHlwZWRlZiB1MTYJUElfVUlOVDE2OwordHlwZWRlZiB1MzIJUElfVUlOVDMyOworCisvKiBEZWZpbmUgZ2VuZXJhbCBzdHJ1Y3R1cmVzICovCisKK3R5cGVkZWYgc3RydWN0CQkJCQkJCS8qIDY0LWJpdCBjb3VudGVyICovCisJeworCVBJX1VJTlQzMiAgbXM7CisJUElfVUlOVDMyICBsczsKKwl9IFBJX0NOVFI7CisKK3R5cGVkZWYgc3RydWN0CQkJCQkJCS8qIExBTiBhZGRyZXNzICovCisJewkJCQkJCQkJCQkKKwlQSV9VSU5UMzIgIGx3cmRfMDsKKwlQSV9VSU5UMzIgIGx3cmRfMTsKKwl9IFBJX0xBTl9BRERSOworCit0eXBlZGVmIHN0cnVjdAkJCQkJCQkvKiBTdGF0aW9uIElEIGFkZHJlc3MgKi8KKwl7CisJUElfVUlOVDMyICBvY3RldF83XzQ7CisJUElfVUlOVDMyICBvY3RldF8zXzA7CisJfSBQSV9TVEFUSU9OX0lEOworCisKKy8qIERlZmluZSBnZW5lcmFsIGNvbnN0YW50cyAqLworCisjZGVmaW5lIFBJX0FMSUdOX0tfREVTQ19CTEsJICAJCQk4MTkyCS8qIERlc2NyaXB0b3IgYmxvY2sgYm91bmRhcnkJCSovCisjZGVmaW5lIFBJX0FMSUdOX0tfQ09OU19CTEsJICAJIAkJNjQJCS8qIENvbnN1bWVyIGJsb2NrIGJvdW5kYXJ5CQkgIAkqLworI2RlZmluZSBQSV9BTElHTl9LX0NNRF9SRVFfQlVGRiAgCQkxMjgJIAkvKiBYbXQgQ29tbWFuZCBxdWUgYnVmZmVyIGFsaWdubWVudCAqLworI2RlZmluZSBQSV9BTElHTl9LX0NNRF9SU1BfQlVGRgkgCQkxMjgJIAkvKiBSY3YgQ29tbWFuZCBxdWUgYnVmZmVyIGFsaWdubWVudCAqLworI2RlZmluZSBQSV9BTElHTl9LX1VOU09MX0JVRkYJIAkJMTI4CSAJLyogVW5zb2wgcXVlIGJ1ZmZlciBhbGlnbm1lbnQJICAgCSovCisjZGVmaW5lIFBJX0FMSUdOX0tfWE1UX0RBVEFfQlVGRiAJCTAJICAgCS8qIFhtdCBkYXRhIHF1ZSBidWZmZXIgYWxpZ25tZW50CSovCisjZGVmaW5lIFBJX0FMSUdOX0tfUkNWX0RBVEFfQlVGRiAJCTEyOAkgCS8qIFJjdiBxdWUgYnVmZmVyIGFsaWdubWVudAkJCSovCisKKy8qIERlZmluZSBQSFkgaW5kZXggdmFsdWVzICovCisKKyNkZWZpbmUgUElfUEhZX0tfUwkJCQkJCTAJCS8qIEluZGV4IHRvIFMgcGh5ICovCisjZGVmaW5lIFBJX1BIWV9LX0EJCQkJCQkwCQkvKiBJbmRleCB0byBBIHBoeSAqLworI2RlZmluZSBQSV9QSFlfS19CCQkJCQkJMQkJLyogSW5kZXggdG8gQiBwaHkgKi8KKyNkZWZpbmUgUElfUEhZX0tfTUFYCQkJCQkyCQkvKiBNYXggbnVtYmVyIG9mIHBoeXMgKi8KKworLyogRGVmaW5lIEZNQyBkZXNjcmlwdG9yIGZpZWxkcyAqLworCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9WX1NPUAkJCQkzMQorI2RlZmluZSBQSV9GTUNfREVTQ1JfVl9FT1AJCQkJMzAKKyNkZWZpbmUgUElfRk1DX0RFU0NSX1ZfRlNDCQkJCTI3CisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9WX0ZTQl9FUlJPUgkJMjYKKyNkZWZpbmUgUElfRk1DX0RFU0NSX1ZfRlNCX0FERFJfUkVDT0cJMjUKKyNkZWZpbmUgUElfRk1DX0RFU0NSX1ZfRlNCX0FERFJfQ09QSUVECTI0CisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9WX0ZTQgkJCQkyMgorI2RlZmluZSBQSV9GTUNfREVTQ1JfVl9SQ0NfRkxVU0gJCTIxCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9WX1JDQ19DUkMJCQkyMAorI2RlZmluZSBQSV9GTUNfREVTQ1JfVl9SQ0NfUlJSCQkJMTcKKyNkZWZpbmUgUElfRk1DX0RFU0NSX1ZfUkNDX0RECQkJMTUKKyNkZWZpbmUgUElfRk1DX0RFU0NSX1ZfUkNDX1NTCQkJMTMKKyNkZWZpbmUgUElfRk1DX0RFU0NSX1ZfUkNDCQkJCTEzCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9WX0xFTgkJCQkwCisKKyNkZWZpbmUgUElfRk1DX0RFU0NSX01fU09QCQkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgUElfRk1DX0RFU0NSX01fRU9QCQkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgUElfRk1DX0RFU0NSX01fRlNDCQkJCTB4MzgwMDAwMDAKKyNkZWZpbmUgUElfRk1DX0RFU0NSX01fRlNCX0VSUk9SCQkweDA0MDAwMDAwCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9NX0ZTQl9BRERSX1JFQ09HCTB4MDIwMDAwMDAKKyNkZWZpbmUgUElfRk1DX0RFU0NSX01fRlNCX0FERFJfQ09QSUVECTB4MDEwMDAwMDAKKyNkZWZpbmUgUElfRk1DX0RFU0NSX01fRlNCCQkJCTB4MDdDMDAwMDAKKyNkZWZpbmUgUElfRk1DX0RFU0NSX01fUkNDX0ZMVVNICQkweDAwMjAwMDAwCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9NX1JDQ19DUkMJCQkweDAwMTAwMDAwCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9NX1JDQ19SUlIJCQkweDAwMEUwMDAwCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9NX1JDQ19ERAkJCTB4MDAwMTgwMDAKKyNkZWZpbmUgUElfRk1DX0RFU0NSX01fUkNDX1NTCQkJMHgwMDAwNjAwMAorI2RlZmluZSBQSV9GTUNfREVTQ1JfTV9SQ0MJCQkJMHgwMDNGRTAwMAorI2RlZmluZSBQSV9GTUNfREVTQ1JfTV9MRU4JCQkJMHgwMDAwMUZGRgorCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9LX1JDQ19GTUNfSU5UX0VSUgkweDAxQUEKKworI2RlZmluZSBQSV9GTUNfREVTQ1JfS19SUlJfU1VDQ0VTUwkJMHgwMAorI2RlZmluZSBQSV9GTUNfREVTQ1JfS19SUlJfU0FfTUFUQ0gJCTB4MDEKKyNkZWZpbmUgUElfRk1DX0RFU0NSX0tfUlJSX0RBX01BVENICQkweDAyCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9LX1JSUl9GTUNfQUJPUlQJMHgwMworI2RlZmluZSBQSV9GTUNfREVTQ1JfS19SUlJfTEVOR1RIX0JBRAkweDA0CisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9LX1JSUl9GUkFHTUVOVAkJMHgwNQorI2RlZmluZSBQSV9GTUNfREVTQ1JfS19SUlJfRk9STUFUX0VSUgkweDA2CisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9LX1JSUl9NQUNfUkVTRVQJMHgwNworCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9LX0REX05PX01BVENICQkweDAKKyNkZWZpbmUgUElfRk1DX0RFU0NSX0tfRERfUFJPTUlTQ1VPVVMJMHgxCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9LX0REX0NBTV9NQVRDSAkJMHgyCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9LX0REX0xPQ0FMX01BVENICTB4MworCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9LX1NTX05PX01BVENICQkweDAKKyNkZWZpbmUgUElfRk1DX0RFU0NSX0tfU1NfQlJJREdFX01BVENICTB4MQorI2RlZmluZSBQSV9GTUNfREVTQ1JfS19TU19OT1RfUE9TU0lCTEUJMHgyCisjZGVmaW5lIFBJX0ZNQ19ERVNDUl9LX1NTX0xPQ0FMX01BVENICTB4MworCisvKiBEZWZpbmUgc29tZSBtYXggYnVmZmVyIHNpemVzICovCisKKyNkZWZpbmUgUElfQ01EX1JFUV9LX1NJWkVfTUFYCQkJNTEyCisjZGVmaW5lIFBJX0NNRF9SU1BfS19TSVpFX01BWAkJCTUxMgorI2RlZmluZSBQSV9VTlNPTF9LX1NJWkVfTUFYCQkJCTUxMgorI2RlZmluZSBQSV9TTVRfSE9TVF9LX1NJWkVfTUFYCQkJNDYwOAkJLyogNCAxLzIgSyAqLworI2RlZmluZSBQSV9SQ1ZfREFUQV9LX1NJWkVfTUFYCQkJNDYwOAkJLyogNCAxLzIgSyAqLworI2RlZmluZSBQSV9YTVRfREFUQV9LX1NJWkVfTUFYCQkJNDYwOAkJLyogNCAxLzIgSyAqLworCisvKiBEZWZpbmUgYWRhcHRlciBzdGF0ZXMgKi8KKworI2RlZmluZSBQSV9TVEFURV9LX1JFU0VUCQkJCTAKKyNkZWZpbmUgUElfU1RBVEVfS19VUEdSQURFCQkgIAkJMQorI2RlZmluZSBQSV9TVEFURV9LX0RNQV9VTkFWQUlMCQkJMgorI2RlZmluZSBQSV9TVEFURV9LX0RNQV9BVkFJTAkJCTMKKyNkZWZpbmUgUElfU1RBVEVfS19MSU5LX0FWQUlMCQkJNAorI2RlZmluZSBQSV9TVEFURV9LX0xJTktfVU5BVkFJTAkgCQk1CisjZGVmaW5lIFBJX1NUQVRFX0tfSEFMVEVECQkgICAJCTYKKyNkZWZpbmUgUElfU1RBVEVfS19SSU5HX01FTUJFUgkJCTcKKyNkZWZpbmUgUElfU1RBVEVfS19OVU1CRVIJCQkJOCAKKworLyogRGVmaW5lIGNvZGVzIGZvciBjb21tYW5kIHR5cGUgKi8KKworI2RlZmluZSBQSV9DTURfS19TVEFSVAkJCQkJMHgwMAorI2RlZmluZSBQSV9DTURfS19GSUxURVJTX1NFVAkJCTB4MDEKKyNkZWZpbmUgUElfQ01EX0tfRklMVEVSU19HRVQJCQkweDAyCisjZGVmaW5lIFBJX0NNRF9LX0NIQVJTX1NFVAkJCQkweDAzCisjZGVmaW5lIFBJX0NNRF9LX1NUQVRVU19DSEFSU19HRVQJCTB4MDQKKyNkZWZpbmUgUElfQ01EX0tfQ05UUlNfR0VUCQkJCTB4MDUKKyNkZWZpbmUgUElfQ01EX0tfQ05UUlNfU0VUCQkJCTB4MDYKKyNkZWZpbmUgUElfQ01EX0tfQUREUl9GSUxURVJfU0VUCQkweDA3CisjZGVmaW5lIFBJX0NNRF9LX0FERFJfRklMVEVSX0dFVAkJMHgwOAorI2RlZmluZSBQSV9DTURfS19FUlJPUl9MT0dfQ0xFQVIJCTB4MDkKKyNkZWZpbmUgUElfQ01EX0tfRVJST1JfTE9HX0dFVAkJCTB4MEEKKyNkZWZpbmUgUElfQ01EX0tfRkRESV9NSUJfR0VUCQkJMHgwQgorI2RlZmluZSBQSV9DTURfS19ERUNfRVhUX01JQl9HRVQJCTB4MEMKKyNkZWZpbmUgUElfQ01EX0tfREVWSUNFX1NQRUNJRklDX0dFVAkweDBECisjZGVmaW5lIFBJX0NNRF9LX1NOTVBfU0VUCQkJCTB4MEUKKyNkZWZpbmUgUElfQ01EX0tfVU5TT0xfVEVTVAkJCQkweDBGCisjZGVmaW5lIFBJX0NNRF9LX1NNVF9NSUJfR0VUCQkJMHgxMAorI2RlZmluZSBQSV9DTURfS19TTVRfTUlCX1NFVAkJCTB4MTEKKyNkZWZpbmUgUElfQ01EX0tfTUFYCQkJCQkweDExCS8qIE11c3QgbWF0Y2ggbGFzdCAqLworCisvKiBEZWZpbmUgaXRlbSBjb2RlcyBmb3IgQ2hhcnNfU2V0IGFuZCBGaWx0ZXJzX1NldCBjb21tYW5kcyAqLworCisjZGVmaW5lIFBJX0lURU1fS19FT0wJCQkJCTB4MDAgCS8qIEVuZC1vZi1JdGVtIGxpc3QgCQkgICovCisjZGVmaW5lIFBJX0lURU1fS19UX1JFUQkJCQkJMHgwMSAJLyogREVDbmV0IFRfUkVRIAkJCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX1RWWAkJCQkJMHgwMiAJLyogREVDbmV0IFRWWCAJCQkJICAqLworI2RlZmluZSBQSV9JVEVNX0tfUkVTVFJJQ1RFRF9UT0tFTgkJMHgwMyAJLyogREVDbmV0IFJlc3RyaWN0ZWQgVG9rZW4gCSAgKi8JIAorI2RlZmluZSBQSV9JVEVNX0tfTEVNX1RIUkVTSE9MRAkJCTB4MDQgCS8qIERFQ25ldCBMRU0gVGhyZXNob2xkIAkgICovCisjZGVmaW5lIFBJX0lURU1fS19SSU5HX1BVUkdFUgkJCTB4MDUgCS8qIERFQ25ldCBSaW5nIFB1cmdlciBFbmFibGUgICovCQorI2RlZmluZSBQSV9JVEVNX0tfQ05UUl9JTlRFUlZBTAkJCTB4MDYgCS8qIENoYXJzX1NldCAJCQkJICAqLworI2RlZmluZSBQSV9JVEVNX0tfSU5EX0dST1VQX1BST00JCTB4MDcgCS8qIEZpbHRlcnNfU2V0IAkJCQkgICovCisjZGVmaW5lIFBJX0lURU1fS19HUk9VUF9QUk9NCQkJMHgwOCAJLyogRmlsdGVyc19TZXQgCQkJCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX0JST0FEQ0FTVAkJCQkweDA5IAkvKiBGaWx0ZXJzX1NldCAJCQkJICAqLworI2RlZmluZSBQSV9JVEVNX0tfU01UX1BST00JCQkJMHgwQSAJLyogRmlsdGVyc19TZXQJCQkJICAqLworI2RlZmluZSBQSV9JVEVNX0tfU01UX1VTRVIJCQkJMHgwQiAJLyogRmlsdGVyc19TZXQgCQkJCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX1JFU0VSVkVECQkJCTB4MEMgCS8qIEZpbHRlcnNfU2V0IAkJCQkgICovCisjZGVmaW5lIFBJX0lURU1fS19JTVBMRU1FTlRPUgkJCTB4MEQgCS8qIEZpbHRlcnNfU2V0IAkJCQkgICovCisjZGVmaW5lIFBJX0lURU1fS19MT09QQkFDS19NT0RFCQkJMHgwRSAJLyogQ2hhcnNfU2V0IAkJCQkgICovCisjZGVmaW5lIFBJX0lURU1fS19DT05GSUdfUE9MSUNZCQkJMHgxMCAJLyogU01UQ29uZmlnUG9saWN5IAkJCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX0NPTl9QT0xJQ1kJCQkweDExIAkvKiBTTVRDb25uZWN0aW9uUG9saWN5IAkJICAqLworI2RlZmluZSBQSV9JVEVNX0tfVF9OT1RJRlkJCQkJMHgxMiAJLyogU01UVE5vdGlmeSAJCQkJICAqLworI2RlZmluZSBQSV9JVEVNX0tfU1RBVElPTl9BQ1RJT04JCTB4MTMgCS8qIFNNVFN0YXRpb25BY3Rpb24JCQkgICovCisjZGVmaW5lIFBJX0lURU1fS19NQUNfUEFUSFNfUkVRCSAgIAkJMHgxNSAJLyogTUFDUGF0aHNSZXF1ZXN0ZWQgCQkgICovCisjZGVmaW5lIFBJX0lURU1fS19NQUNfQUNUSU9OCQkJMHgxNyAJLyogTUFDQWN0aW9uIAkJCQkgICovCisjZGVmaW5lIFBJX0lURU1fS19DT05fUE9MSUNJRVMJCQkweDE4IAkvKiBQT1JUQ29ubmVjdGlvblBvbGljaWVzCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX1BPUlRfUEFUSFNfUkVRCQkweDE5IAkvKiBQT1JUUGF0aHNSZXF1ZXN0ZWQgCQkgICovCisjZGVmaW5lIFBJX0lURU1fS19NQUNfTE9PUF9USU1FCQkJMHgxQSAJLyogUE9SVE1BQ0xvb3BUaW1lIAkJCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX1RCX01BWAkJCQkweDFCIAkvKiBQT1JUVEJNYXggCQkJCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX0xFUl9DVVRPRkYJCQkweDFDIAkvKiBQT1JUTGVyQ3V0b2ZmIAkJCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX0xFUl9BTEFSTQkJCQkweDFEIAkvKiBQT1JUTGVyQWxhcm0gCQkJICAqLworI2RlZmluZSBQSV9JVEVNX0tfUE9SVF9BQ1RJT04JCQkweDFFIAkvKiBQT1JUQWN0aW9uIAkJCQkgICovCisjZGVmaW5lIFBJX0lURU1fS19GTFVTSF9USU1FCQkJMHgyMCAJLyogQ2hhcnNfU2V0IAkJCQkgICovCisjZGVmaW5lIFBJX0lURU1fS19NQUNfVF9SRVEJCQkJMHgyOSAJLyogTUFDVFJlcSAJCQkJCSAgKi8KKyNkZWZpbmUgUElfSVRFTV9LX0VNQUNfUklOR19QVVJHRVIJCTB4MkEgCS8qIGVNQUNSaW5nUHVyZ2VyRW5hYmxlCQkgICovCisjZGVmaW5lIFBJX0lURU1fS19FTUFDX1JUT0tFTl9USU1FT1VUCTB4MkIgCS8qIGVNQUNSZXN0cmljdGVkVG9rZW5UaW1lb3V0ICovCisjZGVmaW5lIFBJX0lURU1fS19GRFhfRU5CX0RJUwkJCTB4MkMgCS8qIGVGRFhFbmFibGUJCQkJICAqLworI2RlZmluZSBQSV9JVEVNX0tfTUFYCQkJCQkweDJDIAkvKiBNdXN0IGVxdWFsIGhpZ2ggaXRlbQkJICAqLworCisvKiBWYWx1ZXMgZm9yIHNvbWUgb2YgdGhlIGl0ZW1zICovCisKKyNkZWZpbmUgUElfS19GQUxTRQkJCQkJCTAJICAgLyogR2VuZXJpYyBmYWxzZSAqLworI2RlZmluZSBQSV9LX1RSVUUJCQkJCQkxCSAgIC8qIEdlbmVyaWMgdHJ1ZSAgKi8KKworI2RlZmluZSBQSV9TTk1QX0tfVFJVRQkJCQkJMQkgICAvKiBTTk1QIHRydWUvZmFsc2UgdmFsdWVzICovCisjZGVmaW5lIFBJX1NOTVBfS19GQUxTRQkJCQkJMgorCisjZGVmaW5lIFBJX0ZTVEFURV9LX0JMT0NLCQkJCTAJICAgLyogRmlsdGVyIFN0YXRlICovCisjZGVmaW5lIFBJX0ZTVEFURV9LX1BBU1MJCQkJMQorCisvKiBEZWZpbmUgY29tbWFuZCByZXR1cm4gY29kZXMgKi8KKworI2RlZmluZSBQSV9SU1BfS19TVUNDRVNTCQkJCTB4MDAKKyNkZWZpbmUgUElfUlNQX0tfRkFJTFVSRQkJCQkweDAxCisjZGVmaW5lIFBJX1JTUF9LX1dBUk5JTkcJCQkJMHgwMgorI2RlZmluZSBQSV9SU1BfS19MT09QX01PREVfQkFECQkJMHgwMworI2RlZmluZSBQSV9SU1BfS19JVEVNX0NPREVfQkFECQkJMHgwNAorI2RlZmluZSBQSV9SU1BfS19UVlhfQkFECQkJCTB4MDUKKyNkZWZpbmUgUElfUlNQX0tfVFJFUV9CQUQJCQkJMHgwNgorI2RlZmluZSBQSV9SU1BfS19UT0tFTl9CQUQJCQkJMHgwNworI2RlZmluZSBQSV9SU1BfS19OT19FT0wJCQkJCTB4MEMKKyNkZWZpbmUgUElfUlNQX0tfRklMVEVSX1NUQVRFX0JBRAkJMHgwRAorI2RlZmluZSBQSV9SU1BfS19DTURfVFlQRV9CQUQJCQkweDBFCisjZGVmaW5lIFBJX1JTUF9LX0FEQVBURVJfU1RBVEVfQkFECQkweDBGCisjZGVmaW5lIFBJX1JTUF9LX1JJTkdfUFVSR0VSX0JBRAkJMHgxMAorI2RlZmluZSBQSV9SU1BfS19MRU1fVEhSRVNIT0xEX0JBRAkJMHgxMQorI2RlZmluZSBQSV9SU1BfS19MT09QX05PVF9TVVBQT1JURUQJCTB4MTIKKyNkZWZpbmUgUElfUlNQX0tfRkxVU0hfVElNRV9CQUQJCQkweDEzCisjZGVmaW5lIFBJX1JTUF9LX05PVF9JTVBMRU1FTlRFRAkJMHgxNAorI2RlZmluZSBQSV9SU1BfS19DT05GSUdfUE9MSUNZX0JBRAkJMHgxNQorI2RlZmluZSBQSV9SU1BfS19TVEFUSU9OX0FDVElPTl9CQUQJCTB4MTYKKyNkZWZpbmUgUElfUlNQX0tfTUFDX0FDVElPTl9CQUQJCQkweDE3CisjZGVmaW5lIFBJX1JTUF9LX0NPTl9QT0xJQ0lFU19CQUQJCTB4MTgKKyNkZWZpbmUgUElfUlNQX0tfTUFDX0xPT1BfVElNRV9CQUQJCTB4MTkKKyNkZWZpbmUgUElfUlNQX0tfVEJfTUFYX0JBRAkJCQkweDFBCisjZGVmaW5lIFBJX1JTUF9LX0xFUl9DVVRPRkZfQkFECQkJMHgxQgorI2RlZmluZSBQSV9SU1BfS19MRVJfQUxBUk1fQkFECQkJMHgxQworI2RlZmluZSBQSV9SU1BfS19NQUNfUEFUSFNfUkVRX0JBRAkJMHgxRAorI2RlZmluZSBQSV9SU1BfS19NQUNfVF9SRVFfQkFECQkJMHgxRQorI2RlZmluZSBQSV9SU1BfS19FTUFDX1JJTkdfUFVSR0VSX0JBRAkweDFGCisjZGVmaW5lIFBJX1JTUF9LX0VNQUNfUlRPS0VOX1RJTUVfQkFECTB4MjAKKyNkZWZpbmUgUElfUlNQX0tfTk9fU1VDSF9FTlRSWQkJCTB4MjEKKyNkZWZpbmUgUElfUlNQX0tfVF9OT1RJRllfQkFECQkJMHgyMgorI2RlZmluZSBQSV9SU1BfS19UUl9NQVhfRVhQX0JBRAkJCTB4MjMKKyNkZWZpbmUgUElfUlNQX0tfTUFDX0ZSTV9FUlJfVEhSX0JBRAkweDI0CisjZGVmaW5lIFBJX1JTUF9LX01BWF9UX1JFUV9CQUQJCQkweDI1CisjZGVmaW5lIFBJX1JTUF9LX0ZEWF9FTkJfRElTX0JBRAkJMHgyNgorI2RlZmluZSBQSV9SU1BfS19JVEVNX0lOREVYX0JBRAkJCTB4MjcKKyNkZWZpbmUgUElfUlNQX0tfUE9SVF9BQ1RJT05fQkFECQkweDI4CisKKy8qIENvbW1vbmx5IHVzZWQgc3RydWN0dXJlcyAqLworCit0eXBlZGVmIHN0cnVjdAkJCQkJCQkJCS8qIEl0ZW0gbGlzdCAqLworCXsKKwlQSV9VSU5UMzIgIGl0ZW1fY29kZTsKKwlQSV9VSU5UMzIgIHZhbHVlOworCX0gUElfSVRFTV9MSVNUOworCit0eXBlZGVmIHN0cnVjdAkJCQkJCQkJCS8qIFJlc3BvbnNlIGhlYWRlciAqLworCXsKKwlQSV9VSU5UMzIgIHJlc2VydmVkOworCVBJX1VJTlQzMiAgY21kX3R5cGU7CisJUElfVUlOVDMyICBzdGF0dXM7CisJfSBQSV9SU1BfSEVBREVSOworCisKKy8qIFN0YXJ0IENvbW1hbmQgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJUElfVUlOVDMyICBjbWRfdHlwZTsKKwl9IFBJX0NNRF9TVEFSVF9SRVE7CisKKy8qIFN0YXJ0IFJlc3BvbnNlICovCisKK3R5cGVkZWYgc3RydWN0IAorCXsKKwlQSV9SU1BfSEVBREVSICAgaGVhZGVyOwkKKwl9IFBJX0NNRF9TVEFSVF9SU1A7CisKKy8qIEZpbHRlcnNfU2V0IFJlcXVlc3QgKi8KKworI2RlZmluZSBQSV9DTURfRklMVEVSU19TRVRfS19JVEVNU19NQVggIDYzCQkvKiBGaXRzIGluIGEgNTEyIGJ5dGUgYnVmZmVyICovCisKK3R5cGVkZWYgc3RydWN0IAorCXsKKwlQSV9VSU5UMzIJCWNtZF90eXBlOworCVBJX0lURU1fTElTVAlpdGVtW1BJX0NNRF9GSUxURVJTX1NFVF9LX0lURU1TX01BWF07CisJfSBQSV9DTURfRklMVEVSU19TRVRfUkVROworCisvKiBGaWx0ZXJzX1NldCBSZXNwb25zZSAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9SU1BfSEVBREVSICAgaGVhZGVyOwkKKwl9IFBJX0NNRF9GSUxURVJTX1NFVF9SU1A7CisKKy8qIEZpbHRlcnNfR2V0IFJlcXVlc3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJUElfVUlOVDMyCQljbWRfdHlwZTsgICAKKwl9IFBJX0NNRF9GSUxURVJTX0dFVF9SRVE7CisKKy8qIEZpbHRlcnNfR2V0IFJlc3BvbnNlICovCisKK3R5cGVkZWYgc3RydWN0IAorCXsKKwlQSV9SU1BfSEVBREVSICAgaGVhZGVyOwkKKwlQSV9VSU5UMzIJCWluZF9ncm91cF9wcm9tOworCVBJX1VJTlQzMgkJZ3JvdXBfcHJvbTsKKwlQSV9VSU5UMzIJCWJyb2FkY2FzdF9hbGw7CisJUElfVUlOVDMyCQlzbXRfYWxsOworCVBJX1VJTlQzMgkJc210X3VzZXI7CisJUElfVUlOVDMyCQlyZXNlcnZlZF9hbGw7CisJUElfVUlOVDMyCQlpbXBsZW1lbnRvcl9hbGw7CisJfSBQSV9DTURfRklMVEVSU19HRVRfUlNQOworCisKKy8qIENoYXJzX1NldCBSZXF1ZXN0ICovCisKKyNkZWZpbmUgUElfQ01EX0NIQVJTX1NFVF9LX0lURU1TX01BWCA0MgkJLyogRml0cyBpbiBhIDUxMiBieXRlIGJ1ZmZlciAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9VSU5UMzIJCWNtZF90eXBlOworCXN0cnVjdAkJCQkJCQkgIAkJLyogSXRlbSBsaXN0ICovCisJCXsKKwkJUElfVUlOVDMyCWl0ZW1fY29kZTsKKwkJUElfVUlOVDMyCXZhbHVlOworCQlQSV9VSU5UMzIJaXRlbV9pbmRleDsKKwkJfSBpdGVtW1BJX0NNRF9DSEFSU19TRVRfS19JVEVNU19NQVhdOwkKKwl9IFBJX0NNRF9DSEFSU19TRVRfUkVROworCisvKiBDaGFyc19TZXQgUmVzcG9uc2UgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJUElfUlNQX0hFQURFUiAgIGhlYWRlcjsJCisJfSBQSV9DTURfQ0hBUlNfU0VUX1JTUDsKKworCisvKiBTTk1QX1NldCBSZXF1ZXN0ICovCisKKyNkZWZpbmUgUElfQ01EX1NOTVBfU0VUX0tfSVRFTVNfTUFYIDQyCSAgIAkvKiBGaXRzIGluIGEgNTEyIGJ5dGUgYnVmZmVyICovCisKK3R5cGVkZWYgc3RydWN0CisJeworCVBJX1VJTlQzMgkJY21kX3R5cGU7CisJc3RydWN0CQkJCQkJCSAgIAkJLyogSXRlbSBsaXN0ICovCisJCXsKKwkJUElfVUlOVDMyCWl0ZW1fY29kZTsKKwkJUElfVUlOVDMyCXZhbHVlOworCQlQSV9VSU5UMzIJaXRlbV9pbmRleDsKKwkJfSBpdGVtW1BJX0NNRF9TTk1QX1NFVF9LX0lURU1TX01BWF07CQorCX0gUElfQ01EX1NOTVBfU0VUX1JFUTsKKworLyogU05NUF9TZXQgUmVzcG9uc2UgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJUElfUlNQX0hFQURFUiAgIGhlYWRlcjsJCisJfSBQSV9DTURfU05NUF9TRVRfUlNQOworCisKKy8qIFNNVF9NSUJfU2V0IFJlcXVlc3QgKi8KKworI2RlZmluZSBQSV9DTURfU01UX01JQl9TRVRfS19JVEVNU19NQVggNDIJLyogTWF4IG51bWJlciBvZiBpdGVtcyAqLyAKKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJUElfVUlOVDMyCWNtZF90eXBlOworCXN0cnVjdAorCQl7CisJCVBJX1VJTlQzMglpdGVtX2NvZGU7CisJCVBJX1VJTlQzMgl2YWx1ZTsKKwkJUElfVUlOVDMyCWl0ZW1faW5kZXg7CisJCX0gaXRlbVtQSV9DTURfU01UX01JQl9TRVRfS19JVEVNU19NQVhdOworCX0gUElfQ01EX1NNVF9NSUJfU0VUX1JFUTsKKworLyogU01UX01JQl9TZXQgUmVzcG9uc2UgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJUElfUlNQX0hFQURFUiAgIGhlYWRlcjsJCisJfSBQSV9DTURfU01UX01JQl9TRVRfUlNQOworCisvKiBTTVRfTUlCX0dldCBSZXF1ZXN0ICovCisKK3R5cGVkZWYgc3RydWN0CisJeworCVBJX1VJTlQzMiAgY21kX3R5cGU7CisJfSBQSV9DTURfU01UX01JQl9HRVRfUkVROworCisvKiBTTVRfTUlCX0dldCBSZXNwb25zZSAqLworCit0eXBlZGVmIHN0cnVjdAkJCQkJCSAgLyogUmVmZXIgdG8gQU5TSSBGRERJIFNNVCBSZXYuIDcuMyAqLworCXsKKwlQSV9SU1BfSEVBREVSICBoZWFkZXI7CisJCisJLyogU01UIEdST1VQICovCQkJCQkJCQkJCQkJCQkgIAorCisJUElfU1RBVElPTl9JRCAgCXNtdF9zdGF0aW9uX2lkOworCVBJX1VJTlQzMiAJCXNtdF9vcF92ZXJzaW9uX2lkOworCVBJX1VJTlQzMgkgICAJc210X2hpX3ZlcnNpb25faWQ7CisJUElfVUlOVDMyCSAgIAlzbXRfbG9fdmVyc2lvbl9pZDsKKwlQSV9VSU5UMzIJICAgCXNtdF91c2VyX2RhdGFbOF07CisJUElfVUlOVDMyCSAgIAlzbXRfbWliX3ZlcnNpb25faWQ7CisJUElfVUlOVDMyCSAgIAlzbXRfbWFjX2N0OworCVBJX1VJTlQzMgkgICAJc210X25vbl9tYXN0ZXJfY3Q7CisJUElfVUlOVDMyCSAgIAlzbXRfbWFzdGVyX2N0OworCVBJX1VJTlQzMgkgICAJc210X2F2YWlsYWJsZV9wYXRoczsKKwlQSV9VSU5UMzIJICAgCXNtdF9jb25maWdfY2FwYWJpbGl0aWVzOworCVBJX1VJTlQzMgkgICAJc210X2NvbmZpZ19wb2xpY3k7CisJUElfVUlOVDMyCSAgIAlzbXRfY29ubmVjdGlvbl9wb2xpY3k7CisJUElfVUlOVDMyCSAgIAlzbXRfdF9ub3RpZnk7CisJUElfVUlOVDMyCSAgIAlzbXRfc3RhdF9ycHRfcG9saWN5OworCVBJX1VJTlQzMgkgICAJc210X3RyYWNlX21heF9leHBpcmF0aW9uOworCVBJX1VJTlQzMgkgICAJc210X2J5cGFzc19wcmVzZW50OworCVBJX1VJTlQzMgkgIAlzbXRfZWNtX3N0YXRlOworCVBJX1VJTlQzMgkgICAJc210X2NmX3N0YXRlOworCVBJX1VJTlQzMgkgICAJc210X3JlbW90ZV9kaXNjb25uZWN0X2ZsYWc7CisJUElfVUlOVDMyCSAgIAlzbXRfc3RhdGlvbl9zdGF0dXM7CisJUElfVUlOVDMyCSAgIAlzbXRfcGVlcl93cmFwX2ZsYWc7CisJUElfQ05UUgkgICAJCXNtdF9tc2dfdGltZV9zdGFtcDsKKwlQSV9DTlRSCSAgCQlzbXRfdHJhbnNpdGlvbl90aW1lX3N0YW1wOworCisJLyogTUFDIEdST1VQICovCisKKwlQSV9VSU5UMzIJCW1hY19mcmFtZV9zdGF0dXNfZnVuY3Rpb25zOworCVBJX1VJTlQzMgkJbWFjX3RfbWF4X2NhcGFiaWxpdHk7CisJUElfVUlOVDMyCQltYWNfdHZ4X2NhcGFiaWxpdHk7CisJUElfVUlOVDMyCQltYWNfYXZhaWxhYmxlX3BhdGhzOworCVBJX1VJTlQzMgkJbWFjX2N1cnJlbnRfcGF0aDsKKwlQSV9MQU5fQUREUgkJbWFjX3Vwc3RyZWFtX25icjsKKwlQSV9MQU5fQUREUgkJbWFjX2Rvd25zdHJlYW1fbmJyOworCVBJX0xBTl9BRERSCQltYWNfb2xkX3Vwc3RyZWFtX25icjsKKwlQSV9MQU5fQUREUgkJbWFjX29sZF9kb3duc3RyZWFtX25icjsKKwlQSV9VSU5UMzIJICAgCW1hY19kdXBfYWRkcmVzc190ZXN0OworCVBJX1VJTlQzMgkgICAJbWFjX3JlcXVlc3RlZF9wYXRoczsKKwlQSV9VSU5UMzIJICAgCW1hY19kb3duc3RyZWFtX3BvcnRfdHlwZTsKKwlQSV9MQU5fQUREUgkJbWFjX3NtdF9hZGRyZXNzOworCVBJX1VJTlQzMgkJbWFjX3RfcmVxOworCVBJX1VJTlQzMgkJbWFjX3RfbmVnOworCVBJX1VJTlQzMgkJbWFjX3RfbWF4OworCVBJX1VJTlQzMgkJbWFjX3R2eF92YWx1ZTsKKwlQSV9VSU5UMzIJCW1hY19mcmFtZV9lcnJvcl90aHJlc2hvbGQ7CisJUElfVUlOVDMyCQltYWNfZnJhbWVfZXJyb3JfcmF0aW87CisJUElfVUlOVDMyCQltYWNfcm10X3N0YXRlOworCVBJX1VJTlQzMgkJbWFjX2RhX2ZsYWc7CisJUElfVUlOVDMyCQltYWNfdW5kYV9mbGFnOworCVBJX1VJTlQzMgkJbWFjX2ZyYW1lX2Vycm9yX2ZsYWc7CisJUElfVUlOVDMyCQltYWNfbWFfdW5pdGRhdGFfYXZhaWxhYmxlOworCVBJX1VJTlQzMgkJbWFjX2hhcmR3YXJlX3ByZXNlbnQ7CisJUElfVUlOVDMyCQltYWNfbWFfdW5pdGRhdGFfZW5hYmxlOworCisJLyogUEFUSCBHUk9VUCAqLworCisJUElfVUlOVDMyCQlwYXRoX2NvbmZpZ3VyYXRpb25bOF07CisJUElfVUlOVDMyCQlwYXRoX3R2eF9sb3dlcl9ib3VuZDsKKwlQSV9VSU5UMzIJCXBhdGhfdF9tYXhfbG93ZXJfYm91bmQ7CisJUElfVUlOVDMyCQlwYXRoX21heF90X3JlcTsKKworCS8qIFBPUlQgR1JPVVAgKi8KKworCVBJX1VJTlQzMgkJcG9ydF9teV90eXBlW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlwb3J0X25laWdoYm9yX3R5cGVbUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCXBvcnRfY29ubmVjdGlvbl9wb2xpY2llc1tQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcG9ydF9tYWNfaW5kaWNhdGVkW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlwb3J0X2N1cnJlbnRfcGF0aFtQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcG9ydF9yZXF1ZXN0ZWRfcGF0aHNbUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCXBvcnRfbWFjX3BsYWNlbWVudFtQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcG9ydF9hdmFpbGFibGVfcGF0aHNbUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCXBvcnRfcG1kX2NsYXNzW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlwb3J0X2Nvbm5lY3Rpb25fY2FwYWJpbGl0aWVzW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlwb3J0X2JzX2ZsYWdbUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCXBvcnRfbGVyX2VzdGltYXRlW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlwb3J0X2xlcl9jdXRvZmZbUElfUEhZX0tfTUFYXTsJCisJUElfVUlOVDMyCQlwb3J0X2xlcl9hbGFybVtQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcG9ydF9jb25uZWN0X3N0YXRlW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlwb3J0X3BjbV9zdGF0ZVtQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcG9ydF9wY193aXRoaG9sZFtQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcG9ydF9sZXJfZmxhZ1tQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcG9ydF9oYXJkd2FyZV9wcmVzZW50W1BJX1BIWV9LX01BWF07CisKKwkvKiBHUk9VUCBmb3IgdGhpbmdzIHRoYXQgd2VyZSBhZGRlZCBsYXRlciwgc28gbXVzdCBiZSBhdCB0aGUgZW5kLiAqLworCisJUElfQ05UUgkgICAJCXBhdGhfcmluZ19sYXRlbmN5OworCisJfSBQSV9DTURfU01UX01JQl9HRVRfUlNQOyAKKworCisvKgorICogIEl0ZW0gYW5kIGdyb3VwIGNvZGUgZGVmaW5pdGlvbnMgZm9yIFNNVCA3LjMgbWFuZGF0b3J5IG9iamVjdHMuICBUaGVzZQorICogIGRlZmluaXRpb25zIGFyZSB0byBiZSB1c2VkIGFzIGFwcHJvcHJpYXRlIGluIFNNVF9NSUJfU0VUIGNvbW1hbmRzIGFuZAorICogIGNlcnRhaW4gaG9zdC1zZW50IFNNVCBmcmFtZXMgc3VjaCBhcyBQTUYgR2V0IGFuZCBTZXQgcmVxdWVzdHMuICBUaGUKKyAqICBjb2RlcyBoYXZlIGJlZW4gdGFrZW4gZnJvbSB0aGUgTUlCIHN1bW1hcnkgc2VjdGlvbiBvZiBBTlNJIFNNVCA3LjMuCisgKi8KKwkKKyNkZWZpbmUgUElfR1JQX0tfU01UX1NUQVRJT05fSUQJCQkweDEwMEEKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9TVEFUSU9OX0lECQkweDEwMEIKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9PUF9WRVJTX0lECQkweDEwMEQKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9ISV9WRVJTX0lECQkweDEwMEUKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9MT19WRVJTX0lECQkweDEwMEYKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9VU0VSX0RBVEEJCQkweDEwMTEKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9NSUJfVkVSU19JRAkgIAkweDEwMTIKKworI2RlZmluZSBQSV9HUlBfS19TTVRfU1RBVElPTl9DT05GSUcJCTB4MTAxNAorI2RlZmluZSBQSV9JVEVNX0tfU01UX01BQ19DVAkJCTB4MTAxNQorI2RlZmluZSBQSV9JVEVNX0tfU01UX05PTl9NQVNURVJfQ1QJCTB4MTAxNgorI2RlZmluZSBQSV9JVEVNX0tfU01UX01BU1RFUl9DVAkJCTB4MTAxNworI2RlZmluZSBQSV9JVEVNX0tfU01UX0FWQUlMX1BBVEhTCQkweDEwMTgKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9DT05GSUdfQ0FQUwkJMHgxMDE5CisjZGVmaW5lIFBJX0lURU1fS19TTVRfQ09ORklHX1BPTAkJMHgxMDFBCisjZGVmaW5lIFBJX0lURU1fS19TTVRfQ09OTl9QT0wJCQkweDEwMUIKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9UX05PVElGWQkJCTB4MTAxRAorI2RlZmluZSBQSV9JVEVNX0tfU01UX1NUQVRfUE9MCQkJMHgxMDFFCisjZGVmaW5lIFBJX0lURU1fS19TTVRfVFJfTUFYX0VYUAkJMHgxMDFGCisjZGVmaW5lIFBJX0lURU1fS19TTVRfUE9SVF9JTkRFWEVTCQkweDEwMjAKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9NQUNfSU5ERVhFUwkJMHgxMDIxCisjZGVmaW5lIFBJX0lURU1fS19TTVRfQllQQVNTX1BSRVNFTlQJMHgxMDIyCisKKyNkZWZpbmUgUElfR1JQX0tfU01UX1NUQVRVUwkJCQkweDEwMjgKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9FQ01fU1RBVEUJCQkweDEwMjkKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9DRl9TVEFURQkJIAkweDEwMkEKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9SRU1fRElTQ19GTEFHCQkweDEwMkMKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9TVEFUSU9OX1NUQVRVUwkweDEwMkQKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9QRUVSX1dSQVBfRkxBRwkweDEwMkUKKwkKKyNkZWZpbmUgUElfR1JQX0tfU01UX01JQl9PUEVSQVRJT04JIAkweDEwMzIKKyNkZWZpbmUgUElfSVRFTV9LX1NNVF9NU0dfVElNRV9TVEFNUCAJMHgxMDMzCisjZGVmaW5lIFBJX0lURU1fS19TTVRfVFJOX1RJTUVfU1RBTVAgCTB4MTAzNAorCisjZGVmaW5lIFBJX0lURU1fS19TTVRfU1RBVElPTl9BQ1QJCTB4MTAzQworCisjZGVmaW5lIFBJX0dSUF9LX01BQ19DQVBBQklMSVRJRVMJICAJMHgyMDBBCisjZGVmaW5lIFBJX0lURU1fS19NQUNfRlJNX1NUQVRfRlVOQwkJMHgyMDBCCisjZGVmaW5lIFBJX0lURU1fS19NQUNfVF9NQVhfQ0FQCQkJMHgyMDBECisjZGVmaW5lIFBJX0lURU1fS19NQUNfVFZYX0NBUAkJICAJMHgyMDBFCisKKyNkZWZpbmUgUElfR1JQX0tfTUFDX0NPTkZJRwkJCQkweDIwMTQKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19BVkFJTF9QQVRIUwkgIAkweDIwMTYKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19DVVJSRU5UX1BBVEgJIAkweDIwMTcKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19VUF9OQlIJCQkweDIwMTgKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19ET1dOX05CUgkJCTB4MjAxOQorI2RlZmluZSBQSV9JVEVNX0tfTUFDX09MRF9VUF9OQlIJIAkweDIwMUEKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19PTERfRE9XTl9OQlIJIAkweDIwMUIKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19EVVBfQUREUl9URVNUCQkweDIwMUQKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19SRVFfUEFUSFMJCQkweDIwMjAKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19ET1dOX1BPUlRfVFlQRSAgIAkweDIwMjEKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19JTkRFWAkJCQkweDIwMjIKKworI2RlZmluZSBQSV9HUlBfS19NQUNfQUREUkVTUwkJCTB4MjAyOAorI2RlZmluZSBQSV9JVEVNX0tfTUFDX1NNVF9BRERSRVNTCQkweDIwMjkKKworI2RlZmluZSBQSV9HUlBfS19NQUNfT1BFUkFUSU9OCQkJMHgyMDMyCisjZGVmaW5lIFBJX0lURU1fS19NQUNfVFJFUQkJCQkweDIwMzMKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19UTkVHCQkJCTB4MjAzNAorI2RlZmluZSBQSV9JVEVNX0tfTUFDX1RNQVgJCQkJMHgyMDM1CisjZGVmaW5lIFBJX0lURU1fS19NQUNfVFZYX1ZBTFVFCQkJMHgyMDM2CisKKyNkZWZpbmUgUElfR1JQX0tfTUFDX0NPVU5URVJTCQkJMHgyMDQ2CisjZGVmaW5lIFBJX0lURU1fS19NQUNfRlJBTUVfQ1QJCQkweDIwNDcKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19DT1BJRURfQ1QJCQkweDIwNDgKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19UUkFOU01JVF9DVAkJMHgyMDQ5CisjZGVmaW5lIFBJX0lURU1fS19NQUNfRVJST1JfQ1QJCQkweDIwNTEKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19MT1NUX0NUCQkJMHgyMDUyCisKKyNkZWZpbmUgUElfR1JQX0tfTUFDX0ZSTV9FUlJfQ09ORAkJMHgyMDVBCisjZGVmaW5lIFBJX0lURU1fS19NQUNfRlJNX0VSUl9USFIJCTB4MjA1RgorI2RlZmluZSBQSV9JVEVNX0tfTUFDX0ZSTV9FUlJfUkFUCQkweDIwNjAKKworI2RlZmluZSBQSV9HUlBfS19NQUNfU1RBVFVTCQkJCTB4MjA2RQorI2RlZmluZSBQSV9JVEVNX0tfTUFDX1JNVF9TVEFURQkJCTB4MjA2RgorI2RlZmluZSBQSV9JVEVNX0tfTUFDX0RBX0ZMQUcJCQkweDIwNzAKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19VTkRBX0ZMQUcJCQkweDIwNzEKKyNkZWZpbmUgUElfSVRFTV9LX01BQ19GUk1fRVJSX0ZMQUcJCTB4MjA3MgorI2RlZmluZSBQSV9JVEVNX0tfTUFDX01BX1VOSVRfQVZBSUwJCTB4MjA3NAorI2RlZmluZSBQSV9JVEVNX0tfTUFDX0hXX1BSRVNFTlQJCTB4MjA3NQorI2RlZmluZSBQSV9JVEVNX0tfTUFDX01BX1VOSVRfRU5BQgkJMHgyMDc2CisKKyNkZWZpbmUgUElfR1JQX0tfUEFUSF9DT05GSUcJCQkweDMyMEEKKyNkZWZpbmUgUElfSVRFTV9LX1BBVEhfSU5ERVgJCQkweDMyMEIKKyNkZWZpbmUgUElfSVRFTV9LX1BBVEhfQ09ORklHVVJBVElPTiAJMHgzMjEyCisjZGVmaW5lIFBJX0lURU1fS19QQVRIX1RWWF9MQgkJCTB4MzIxNQorI2RlZmluZSBQSV9JVEVNX0tfUEFUSF9UX01BWF9MQgkJCTB4MzIxNgorI2RlZmluZSBQSV9JVEVNX0tfUEFUSF9NQVhfVF9SRVEJCTB4MzIxNworCisjZGVmaW5lIFBJX0dSUF9LX1BPUlRfQ09ORklHCQkJMHg0MDBBCisjZGVmaW5lIFBJX0lURU1fS19QT1JUX01ZX1RZUEUJCQkweDQwMEMKKyNkZWZpbmUgUElfSVRFTV9LX1BPUlRfTkJSX1RZUEUJCQkweDQwMEQKKyNkZWZpbmUgUElfSVRFTV9LX1BPUlRfQ09OTl9QT0xTCQkweDQwMEUKKyNkZWZpbmUgUElfSVRFTV9LX1BPUlRfTUFDX0lORElDQVRFRCAgCTB4NDAwRgorI2RlZmluZSBQSV9JVEVNX0tfUE9SVF9DVVJSRU5UX1BBVEgJCTB4NDAxMAorI2RlZmluZSBQSV9JVEVNX0tfUE9SVF9SRVFfUEFUSFMJCTB4NDAxMQorI2RlZmluZSBQSV9JVEVNX0tfUE9SVF9NQUNfUExBQ0VNRU5UIAkweDQwMTIKKyNkZWZpbmUgUElfSVRFTV9LX1BPUlRfQVZBSUxfUEFUSFMJCTB4NDAxMworI2RlZmluZSBQSV9JVEVNX0tfUE9SVF9QTURfQ0xBU1MJCTB4NDAxNgorI2RlZmluZSBQSV9JVEVNX0tfUE9SVF9DT05OX0NBUFMJCTB4NDAxNworI2RlZmluZSBQSV9JVEVNX0tfUE9SVF9JTkRFWAkJCTB4NDAxRAorCisjZGVmaW5lIFBJX0dSUF9LX1BPUlRfT1BFUkFUSU9OCQkJMHg0MDFFCisjZGVmaW5lIFBJX0lURU1fS19QT1JUX0JTX0ZMQUcJCSAJMHg0MDIxCisKKyNkZWZpbmUgUElfR1JQX0tfUE9SVF9FUlJfQ05UUlMJCQkweDQwMjgKKyNkZWZpbmUgUElfSVRFTV9LX1BPUlRfTENUX0ZBSUxfQ1QJIAkweDQwMkEKKworI2RlZmluZSBQSV9HUlBfS19QT1JUX0xFUgkJCSAgCTB4NDAzMgorI2RlZmluZSBQSV9JVEVNX0tfUE9SVF9MRVJfRVNUSU1BVEUJCTB4NDAzMworI2RlZmluZSBQSV9JVEVNX0tfUE9SVF9MRU1fUkVKX0NUCQkweDQwMzQKKyNkZWZpbmUgUElfSVRFTV9LX1BPUlRfTEVNX0NUCQkJMHg0MDM1CisjZGVmaW5lIFBJX0lURU1fS19QT1JUX0xFUl9DVVRPRkYJCTB4NDAzQQorI2RlZmluZSBQSV9JVEVNX0tfUE9SVF9MRVJfQUxBUk0JCTB4NDAzQgorCisjZGVmaW5lIFBJX0dSUF9LX1BPUlRfU1RBVFVTCQkJMHg0MDNDCisjZGVmaW5lIFBJX0lURU1fS19QT1JUX0NPTk5FQ1RfU1RBVEUJMHg0MDNECisjZGVmaW5lIFBJX0lURU1fS19QT1JUX1BDTV9TVEFURQkJMHg0MDNFCisjZGVmaW5lIFBJX0lURU1fS19QT1JUX1BDX1dJVEhIT0xECQkweDQwM0YKKyNkZWZpbmUgUElfSVRFTV9LX1BPUlRfTEVSX0ZMQUcJCQkweDQwNDAKKyNkZWZpbmUgUElfSVRFTV9LX1BPUlRfSFdfUFJFU0VOVAkJMHg0MDQxCisKKyNkZWZpbmUgUElfSVRFTV9LX1BPUlRfQUNUCQkJCTB4NDA0NgorCisvKiBBZGRyX0ZpbHRlcl9TZXQgUmVxdWVzdCAqLworCisjZGVmaW5lIFBJX0NNRF9BRERSX0ZJTFRFUl9LX1NJWkUgICA2MgorCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9VSU5UMzIJY21kX3R5cGU7CisJUElfTEFOX0FERFIJZW50cnlbUElfQ01EX0FERFJfRklMVEVSX0tfU0laRV07CisJfSBQSV9DTURfQUREUl9GSUxURVJfU0VUX1JFUTsKKworLyogQWRkcl9GaWx0ZXJfU2V0IFJlc3BvbnNlICovCisKK3R5cGVkZWYgc3RydWN0IAorCXsKKwlQSV9SU1BfSEVBREVSICAgaGVhZGVyOwkKKwl9IFBJX0NNRF9BRERSX0ZJTFRFUl9TRVRfUlNQOworCisvKiBBZGRyX0ZpbHRlcl9HZXQgUmVxdWVzdCAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9VSU5UMzIJY21kX3R5cGU7CisJfSBQSV9DTURfQUREUl9GSUxURVJfR0VUX1JFUTsKKworLyogQWRkcl9GaWx0ZXJfR2V0IFJlc3BvbnNlICovCisKK3R5cGVkZWYgc3RydWN0CisJeworCVBJX1JTUF9IRUFERVIgICBoZWFkZXI7CQorCVBJX0xBTl9BRERSCQllbnRyeVtQSV9DTURfQUREUl9GSUxURVJfS19TSVpFXTsKKwl9IFBJX0NNRF9BRERSX0ZJTFRFUl9HRVRfUlNQOworCisvKiBTdGF0dXNfQ2hhcnNfR2V0IFJlcXVlc3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJUElfVUlOVDMyICBjbWRfdHlwZTsKKwl9IFBJX0NNRF9TVEFUVVNfQ0hBUlNfR0VUX1JFUTsKKworLyogU3RhdHVzX0NoYXJzX0dldCBSZXNwb25zZSAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9SU1BfSEVBREVSICAgaGVhZGVyOwkKKwlQSV9TVEFUSU9OX0lEICAgc3RhdGlvbl9pZDsJCQkJCQkvKiBTdGF0aW9uICovCisJUElfVUlOVDMyCQlzdGF0aW9uX3R5cGU7CisJUElfVUlOVDMyCQlzbXRfdmVyX2lkOworCVBJX1VJTlQzMgkJc210X3Zlcl9pZF9tYXg7CisJUElfVUlOVDMyCQlzbXRfdmVyX2lkX21pbjsKKwlQSV9VSU5UMzIJCXN0YXRpb25fc3RhdGU7CisJUElfTEFOX0FERFIJCWxpbmtfYWRkcjsJCQkJCQkvKiBMaW5rICovCisJUElfVUlOVDMyCQl0X3JlcTsKKwlQSV9VSU5UMzIJCXR2eDsKKwlQSV9VSU5UMzIJCXRva2VuX3RpbWVvdXQ7CisJUElfVUlOVDMyCQlwdXJnZXJfZW5iOworCVBJX1VJTlQzMgkJbGlua19zdGF0ZTsKKwlQSV9VSU5UMzIJCXRuZWc7CisJUElfVUlOVDMyCQlkdXBfYWRkcl9mbGFnOworCVBJX0xBTl9BRERSCQl1bmE7CisJUElfTEFOX0FERFIJCXVuYV9vbGQ7CisJUElfVUlOVDMyCQl1bl9kdXBfYWRkcl9mbGFnOworCVBJX0xBTl9BRERSCQlkbmE7CisJUElfTEFOX0FERFIJCWRuYV9vbGQ7CisJUElfVUlOVDMyCQlwdXJnZXJfc3RhdGU7CisJUElfVUlOVDMyCQlmY2lfbW9kZTsKKwlQSV9VSU5UMzIJCWVycm9yX3JlYXNvbjsKKwlQSV9VSU5UMzIJCWxvb3BiYWNrOworCVBJX1VJTlQzMgkJcmluZ19sYXRlbmN5OworCVBJX0xBTl9BRERSCQlsYXN0X2Rpcl9iZWFjb25fc2E7CisJUElfTEFOX0FERFIJCWxhc3RfZGlyX2JlYWNvbl91bmE7CisJUElfVUlOVDMyCQlwaHlfdHlwZVtQSV9QSFlfS19NQVhdOwkJCS8qIFBoeSAqLworCVBJX1VJTlQzMgkJcG1kX3R5cGVbUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCWxlbV90aHJlc2hvbGRbUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCXBoeV9zdGF0ZVtQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJbmJvcl9waHlfdHlwZVtQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJbGlua19lcnJvcl9lc3RbUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCWJyb2tlbl9yZWFzb25bUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCXJlamVjdF9yZWFzb25bUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCWNudHJfaW50ZXJ2YWw7CQkJCQkvKiBNaXNjZWxsYW5lb3VzICovCisJUElfVUlOVDMyCQltb2R1bGVfcmV2OworCVBJX1VJTlQzMgkJZmlybXdhcmVfcmV2OworCVBJX1VJTlQzMgkJbW9wX2RldmljZV90eXBlOworCVBJX1VJTlQzMgkJcGh5X2xlZFtQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJZmx1c2hfdGltZTsKKwl9IFBJX0NNRF9TVEFUVVNfQ0hBUlNfR0VUX1JTUDsKKworLyogRkRESV9NSUJfR2V0IFJlcXVlc3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJUElfVUlOVDMyICBjbWRfdHlwZTsKKwl9IFBJX0NNRF9GRERJX01JQl9HRVRfUkVROworCisvKiBGRERJX01JQl9HZXQgUmVzcG9uc2UgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJUElfUlNQX0hFQURFUiAgIGhlYWRlcjsJCQorCisJLyogU01UIEdST1VQICovCisKKwlQSV9TVEFUSU9OX0lEICAgc210X3N0YXRpb25faWQ7CQkJCisJUElfVUlOVDMyCQlzbXRfb3BfdmVyc2lvbl9pZDsKKwlQSV9VSU5UMzIJCXNtdF9oaV92ZXJzaW9uX2lkOworCVBJX1VJTlQzMgkJc210X2xvX3ZlcnNpb25faWQ7CisJUElfVUlOVDMyCQlzbXRfbWFjX2N0OwkJCQkKKwlQSV9VSU5UMzIJCXNtdF9ub25fbWFzdGVyX2N0OwkJCQorCVBJX1VJTlQzMgkJc210X21hc3Rlcl9jdDsJCQkJCisJUElfVUlOVDMyCQlzbXRfcGF0aHNfYXZhaWxhYmxlOwkJCQorCVBJX1VJTlQzMgkJc210X2NvbmZpZ19jYXBhYmlsaXRpZXM7CQkKKwlQSV9VSU5UMzIJCXNtdF9jb25maWdfcG9saWN5OwkJCisJUElfVUlOVDMyCQlzbXRfY29ubmVjdGlvbl9wb2xpY3k7CQkKKwlQSV9VSU5UMzIJCXNtdF90X25vdGlmeTsJCisJUElfVUlOVDMyCQlzbXRfc3RhdHVzX3JlcG9ydGluZzsKKwlQSV9VSU5UMzIJCXNtdF9lY21fc3RhdGU7CQorCVBJX1VJTlQzMgkJc210X2NmX3N0YXRlOwkKKwlQSV9VSU5UMzIJCXNtdF9ob2xkX3N0YXRlOwkJCisJUElfVUlOVDMyCQlzbXRfcmVtb3RlX2Rpc2Nvbm5lY3RfZmxhZzsKKwlQSV9VSU5UMzIJCXNtdF9zdGF0aW9uX2FjdGlvbjsJCQkKKworCS8qIE1BQyBHUk9VUCAqLworCisJUElfVUlOVDMyCQltYWNfZnJhbWVfc3RhdHVzX2NhcGFiaWxpdGllczsJCisJUElfVUlOVDMyCQltYWNfdF9tYXhfZ3JlYXRlc3RfbG93ZXJfYm91bmQ7CisJUElfVUlOVDMyCQltYWNfdHZ4X2dyZWF0ZXN0X2xvd2VyX2JvdW5kOworCVBJX1VJTlQzMgkJbWFjX3BhdGhzX2F2YWlsYWJsZTsKKwlQSV9VSU5UMzIJCW1hY19jdXJyZW50X3BhdGg7CisJUElfTEFOX0FERFIJCW1hY191cHN0cmVhbV9uYnI7CQkJCisJUElfTEFOX0FERFIJCW1hY19vbGRfdXBzdHJlYW1fbmJyOwkJCisJUElfVUlOVDMyCQltYWNfZHVwX2FkZHJfdGVzdDsJCQkKKwlQSV9VSU5UMzIJCW1hY19wYXRoc19yZXF1ZXN0ZWQ7CisJUElfVUlOVDMyCQltYWNfZG93bnN0cmVhbV9wb3J0X3R5cGU7CisJUElfTEFOX0FERFIJCW1hY19zbXRfYWRkcmVzczsJCQkKKwlQSV9VSU5UMzIJCW1hY190X3JlcTsJCQkJCisJUElfVUlOVDMyCQltYWNfdF9uZWc7CisJUElfVUlOVDMyCQltYWNfdF9tYXg7CQkJCQorCVBJX1VJTlQzMgkJbWFjX3R2eF92YWx1ZTsJCQkKKwlQSV9VSU5UMzIJCW1hY190X21pbjsJCQkJCisJUElfVUlOVDMyCQltYWNfY3VycmVudF9mcmFtZV9zdGF0dXM7CisJLyoJCQkgIAltYWNfZnJhbWVfY3RzIAkJCSovCisJLyogCQkJCW1hY19lcnJvcl9jdHMgCQkJKi8KKwkvKiAJCSAgIAkJbWFjX2xvc3RfY3RzIAkJCSovCisJUElfVUlOVDMyCQltYWNfZnJhbWVfZXJyb3JfdGhyZXNob2xkOwkJCisJUElfVUlOVDMyCQltYWNfZnJhbWVfZXJyb3JfcmF0aW87CQkKKwlQSV9VSU5UMzIJCW1hY19ybXRfc3RhdGU7CisJUElfVUlOVDMyCQltYWNfZGFfZmxhZzsKKwlQSV9VSU5UMzIJCW1hY191bmFfZGFfZmxhZzsJCQkKKwlQSV9VSU5UMzIJCW1hY19mcmFtZV9jb25kaXRpb247CisJUElfVUlOVDMyCQltYWNfY2hpcF9zZXQ7CQkJCisJUElfVUlOVDMyCQltYWNfYWN0aW9uOwkJCQkKKworCS8qIFBBVEggR1JPVVAgPT4gRG9lcyBub3QgbmVlZCB0byBiZSBpbXBsZW1lbnRlZCAqLworCisJLyogUE9SVCBHUk9VUCAqLworCisJUElfVUlOVDMyCQlwb3J0X3BjX3R5cGVbUElfUEhZX0tfTUFYXTsJCQkKKwlQSV9VSU5UMzIJCXBvcnRfcGNfbmVpZ2hib3JbUElfUEhZX0tfTUFYXTsJCQkKKwlQSV9VSU5UMzIJCXBvcnRfY29ubmVjdGlvbl9wb2xpY2llc1tQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcG9ydF9yZW1vdGVfbWFjX2luZGljYXRlZFtQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcG9ydF9jZV9zdGF0ZVtQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcG9ydF9wYXRoc19yZXF1ZXN0ZWRbUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCXBvcnRfbWFjX3BsYWNlbWVudFtQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcG9ydF9hdmFpbGFibGVfcGF0aHNbUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCXBvcnRfbWFjX2xvb3BfdGltZVtQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJcG9ydF90Yl9tYXhbUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCXBvcnRfYnNfZmxhZ1tQSV9QSFlfS19NQVhdOworCS8qCQkJCXBvcnRfbGN0X2ZhaWxfY3RzW1BJX1BIWV9LX01BWF07CSovCisJUElfVUlOVDMyCQlwb3J0X2xlcl9lc3RpbWF0ZVtQSV9QSFlfS19NQVhdOwkJCQkKKwkvKgkJCQlwb3J0X2xlbV9yZWplY3RfY3RzW1BJX1BIWV9LX01BWF07CSovCisJLyoJCQkJcG9ydF9sZW1fY3RzW1BJX1BIWV9LX01BWF07CQkqLworCVBJX1VJTlQzMgkJcG9ydF9sZXJfY3V0b2ZmW1BJX1BIWV9LX01BWF07CQkJCQorCVBJX1VJTlQzMgkJcG9ydF9sZXJfYWxhcm1bUElfUEhZX0tfTUFYXTsJCQkJCisJUElfVUlOVDMyCQlwb3J0X2Nvbm5lY3Rfc3RhdGVbUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCXBvcnRfcGNtX3N0YXRlW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlwb3J0X3BjX3dpdGhob2xkW1BJX1BIWV9LX01BWF07CisJUElfVUlOVDMyCQlwb3J0X2xlcl9jb25kaXRpb25bUElfUEhZX0tfTUFYXTsJCQkJCisJUElfVUlOVDMyCQlwb3J0X2NoaXBfc2V0W1BJX1BIWV9LX01BWF07CQkJCQorCVBJX1VJTlQzMgkJcG9ydF9hY3Rpb25bUElfUEhZX0tfTUFYXTsJCQkJCisKKwkvKiBBVFRBQ0hNRU5UIEdST1VQICovCisKKwlQSV9VSU5UMzIJCWF0dGFjaG1lbnRfY2xhc3M7CisJUElfVUlOVDMyCQlhdHRhY2htZW50X29iX3ByZXNlbnQ7CisJUElfVUlOVDMyCQlhdHRhY2htZW50X2ltYXhfZXhwaXJhdGlvbjsKKwlQSV9VSU5UMzIJCWF0dGFjaG1lbnRfaW5zZXJ0ZWRfc3RhdHVzOworCVBJX1VJTlQzMgkJYXR0YWNobWVudF9pbnNlcnRfcG9saWN5OworCisJLyogQ0hJUCBTRVQgR1JPVVAgPT4gRG9lcyBub3QgbmVlZCB0byBiZSBpbXBsZW1lbnRlZCAqLworCisJfSBQSV9DTURfRkRESV9NSUJfR0VUX1JTUDsKKworLyogREVDX0V4dF9NSUJfR2V0IFJlcXVlc3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJUElfVUlOVDMyICBjbWRfdHlwZTsKKwl9IFBJX0NNRF9ERUNfRVhUX01JQl9HRVRfUkVROworCisvKiBERUNfRXh0X01JQl9HZXQgKGVmZGRpIGFuZCBlZmR4IGdyb3VwcyBvbmx5KSBSZXNwb25zZSAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9SU1BfSEVBREVSICAgaGVhZGVyOwkJCisKKwkvKiBTTVQgR1JPVVAgKi8KKworCVBJX1VJTlQzMgkJZXNtdF9zdGF0aW9uX3R5cGU7CisKKwkvKiBNQUMgR1JPVVAgKi8KKworCVBJX1VJTlQzMgkJZW1hY19saW5rX3N0YXRlOwkJCQorCVBJX1VJTlQzMgkJZW1hY19yaW5nX3B1cmdlcl9zdGF0ZTsKKwlQSV9VSU5UMzIJCWVtYWNfcmluZ19wdXJnZXJfZW5hYmxlOworCVBJX1VJTlQzMgkJZW1hY19mcmFtZV9zdHJpcF9tb2RlOworCVBJX1VJTlQzMgkJZW1hY19yaW5nX2Vycm9yX3JlYXNvbjsKKwlQSV9VSU5UMzIJCWVtYWNfdXBfbmJyX2R1cF9hZGRyX2ZsYWc7CisJUElfVUlOVDMyCQllbWFjX3Jlc3RyaWN0ZWRfdG9rZW5fdGltZW91dDsKKworCS8qIFBPUlQgR1JPVVAgKi8KKworCVBJX1VJTlQzMgkJZXBvcnRfcG1kX3R5cGVbUElfUEhZX0tfTUFYXTsKKwlQSV9VSU5UMzIJCWVwb3J0X3BoeV9zdGF0ZVtQSV9QSFlfS19NQVhdOworCVBJX1VJTlQzMgkJZXBvcnRfcmVqZWN0X3JlYXNvbltQSV9QSFlfS19NQVhdOworCisJLyogRkRYIChGdWxsLUR1cGxleCkgR1JPVVAgKi8KKworCVBJX1VJTlQzMgkJZWZkeF9lbmFibGU7CQkJCS8qIFZhbGlkIG9ubHkgaW4gU01UIDcuMyAqLworCVBJX1VJTlQzMgkJZWZkeF9vcDsJCQkJCS8qIFZhbGlkIG9ubHkgaW4gU01UIDcuMyAqLworCVBJX1VJTlQzMgkJZWZkeF9zdGF0ZTsJCQkJCS8qIFZhbGlkIG9ubHkgaW4gU01UIDcuMyAqLworCisJfSBQSV9DTURfREVDX0VYVF9NSUJfR0VUX1JTUDsKKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJUElfQ05UUgkJdHJhY2VzX3JjdmQ7CQkJCQkvKiBTdGF0aW9uICovCisJUElfQ05UUgkJZnJhbWVfY250OwkJCQkJCS8qIExpbmsgKi8KKwlQSV9DTlRSCQllcnJvcl9jbnQ7CisJUElfQ05UUgkJbG9zdF9jbnQ7CisJUElfQ05UUgkJb2N0ZXRzX3JjdmQ7CisJUElfQ05UUgkJb2N0ZXRzX3NlbnQ7CisJUElfQ05UUgkJcGR1c19yY3ZkOworCVBJX0NOVFIJCXBkdXNfc2VudDsKKwlQSV9DTlRSCQltY2FzdF9vY3RldHNfcmN2ZDsKKwlQSV9DTlRSCQltY2FzdF9vY3RldHNfc2VudDsKKwlQSV9DTlRSCQltY2FzdF9wZHVzX3JjdmQ7CisJUElfQ05UUgkJbWNhc3RfcGR1c19zZW50OworCVBJX0NOVFIJCXhtdF91bmRlcnJ1bnM7CisJUElfQ05UUgkJeG10X2ZhaWx1cmVzOworCVBJX0NOVFIJCWJsb2NrX2NoZWNrX2Vycm9yczsKKwlQSV9DTlRSCQlmcmFtZV9zdGF0dXNfZXJyb3JzOworCVBJX0NOVFIJCXBkdV9sZW5ndGhfZXJyb3JzOworCVBJX0NOVFIJCXJjdl9vdmVycnVuczsKKwlQSV9DTlRSCQl1c2VyX2J1ZmZfdW5hdmFpbGFibGU7CisJUElfQ05UUgkJaW5pdHNfaW5pdGlhdGVkOworCVBJX0NOVFIJCWluaXRzX3JjdmQ7CisJUElfQ05UUgkJYmVhY29uc19pbml0aWF0ZWQ7CisJUElfQ05UUgkJZHVwX2FkZHJzOworCVBJX0NOVFIJCWR1cF90b2tlbnM7CisJUElfQ05UUgkJcHVyZ2VfZXJyb3JzOworCVBJX0NOVFIJCWZjaV9zdHJpcF9lcnJvcnM7CisJUElfQ05UUgkJdHJhY2VzX2luaXRpYXRlZDsKKwlQSV9DTlRSCQlkaXJlY3RlZF9iZWFjb25zX3JjdmQ7CisJUElfQ05UUgkJZW1hY19mcmFtZV9hbGlnbm1lbnRfZXJyb3JzOworCVBJX0NOVFIJCWVidWZmX2Vycm9yc1tQSV9QSFlfS19NQVhdOwkJLyogUGh5ICovCisJUElfQ05UUgkJbGN0X3JlamVjdHNbUElfUEhZX0tfTUFYXTsKKwlQSV9DTlRSCQlsZW1fcmVqZWN0c1tQSV9QSFlfS19NQVhdOworCVBJX0NOVFIJCWxpbmtfZXJyb3JzW1BJX1BIWV9LX01BWF07CisJUElfQ05UUgkJY29ubmVjdGlvbnNbUElfUEhZX0tfTUFYXTsKKwlQSV9DTlRSCQljb3BpZWRfY250OwkJCSAJCQkvKiBWYWxpZCBvbmx5IGlmIHVzaW5nIFNNVCA3LjMgKi8KKwlQSV9DTlRSCQl0cmFuc21pdF9jbnQ7CQkJCQkvKiBWYWxpZCBvbmx5IGlmIHVzaW5nIFNNVCA3LjMgKi8KKwlQSV9DTlRSCQl0b2tlbnM7CisJfSBQSV9DTlRSX0JMSzsKKworLyogQ291bnRlcnNfR2V0IFJlcXVlc3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJUElfVUlOVDMyICBjbWRfdHlwZTsKKwl9IFBJX0NNRF9DTlRSU19HRVRfUkVROworCisvKiBDb3VudGVyc19HZXQgUmVzcG9uc2UgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJUElfUlNQX0hFQURFUiAgIGhlYWRlcjsJCisJUElfQ05UUgkJdGltZV9zaW5jZV9yZXNldDsJCQkKKwlQSV9DTlRSX0JMSwkJY250cnM7CQkJCQorCX0gUElfQ01EX0NOVFJTX0dFVF9SU1A7CisKKy8qIENvdW50ZXJzX1NldCBSZXF1ZXN0ICovCisKK3R5cGVkZWYgc3RydWN0CisJeworCVBJX1VJTlQzMgljbWRfdHlwZTsKKwlQSV9DTlRSX0JMSwljbnRyczsJCQkJCisJfSBQSV9DTURfQ05UUlNfU0VUX1JFUTsKKworLyogQ291bnRlcnNfU2V0IFJlc3BvbnNlICovCisKK3R5cGVkZWYgc3RydWN0IAorCXsKKwlQSV9SU1BfSEVBREVSICAgaGVhZGVyOwkKKwl9IFBJX0NNRF9DTlRSU19TRVRfUlNQOworCisvKiBFcnJvcl9Mb2dfQ2xlYXIgUmVxdWVzdCAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9VSU5UMzIgIGNtZF90eXBlOworCX0gUElfQ01EX0VSUk9SX0xPR19DTEVBUl9SRVE7CisKKy8qIEVycm9yX0xvZ19DbGVhciBSZXNwb25zZSAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9SU1BfSEVBREVSICAgaGVhZGVyOwkKKwl9IFBJX0NNRF9FUlJPUl9MT0dfQ0xFQVJfUlNQOworCisvKiBFcnJvcl9Mb2dfR2V0IFJlcXVlc3QgKi8KKworI2RlZmluZSBQSV9MT0dfRU5UUllfS19JTkRFWF9NSU4JMAkJLyogTWluaW11bSBpbmRleCBmb3IgZW50cnkgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJUElfVUlOVDMyICBjbWRfdHlwZTsKKwlQSV9VSU5UMzIgIGVudHJ5X2luZGV4OworCX0gUElfQ01EX0VSUk9SX0xPR19HRVRfUkVROworCisvKiBFcnJvcl9Mb2dfR2V0IFJlc3BvbnNlICovCisKKyNkZWZpbmUgUElfS19MT0dfRldfU0laRQkJCTExMQkJLyogTWF4IG51bWJlciBvZiBmdyBsb25nd29yZHMgKi8KKyNkZWZpbmUgUElfS19MT0dfRElBR19TSVpFCSAJCTYJCS8qIE1heCBudW1iZXIgb2YgZGlhZyBsb25nd29yZHMgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJc3RydWN0IAorCQl7CisJCVBJX1VJTlQzMglmcnVfaW1wX21hc2s7CisJCVBJX1VJTlQzMgl0ZXN0X2lkOworCQlQSV9VSU5UMzIJcmVzZXJ2ZWRbUElfS19MT0dfRElBR19TSVpFXTsKKwkJfSBkaWFnOworCVBJX1VJTlQzMgkJZndbUElfS19MT0dfRldfU0laRV07CisJfSBQSV9MT0dfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0CisJeworCVBJX1JTUF9IRUFERVIgICBoZWFkZXI7CQorCVBJX1VJTlQzMgkJZXZlbnRfc3RhdHVzOworCVBJX1VJTlQzMgkJY2FsbGVyX2lkOworCVBJX1VJTlQzMgkJdGltZXN0YW1wX2w7CisJUElfVUlOVDMyCQl0aW1lc3RhbXBfaDsKKwlQSV9VSU5UMzIJCXdyaXRlX2NvdW50OworCVBJX0xPR19FTlRSWQllbnRyeV9pbmZvOworCX0gUElfQ01EX0VSUk9SX0xPR19HRVRfUlNQOworCisvKiBEZWZpbmUgZXJyb3IgbG9nIHJlbGF0ZWQgY29uc3RhbnRzIGFuZCB0eXBlcy4JCQkJCSovCisvKiAgIE5vdCBhbGwgb2YgdGhlIGNhbGxlciBpZCdzIGNhbiBvY2N1ci4gIFRoZSBvbmx5IG9uZXMgY3VycmVudGx5ICovCisvKiAgIGltcGxlbWVudGVkIGFyZTogbm9uZSwgc2VsZnRlc3QsIG1mZywgZncsIGNvbnNvbGUJCQkJKi8KKworI2RlZmluZSBQSV9MT0dfRVZFTlRfU1RBVFVTX0tfVkFMSUQJCTAJLyogVmFsaWQgRXZlbnQgU3RhdHVzIAkJKi8KKyNkZWZpbmUgUElfTE9HX0VWRU5UX1NUQVRVU19LX0lOVkFMSUQJMQkvKiBJbnZhbGlkIEV2ZW50IFN0YXR1cyAJKi8KKyNkZWZpbmUgUElfTE9HX0NBTExFUl9JRF9LX05PTkUJCSAJMAkvKiBObyBjYWxsZXIgCQkJCSovCisjZGVmaW5lIFBJX0xPR19DQUxMRVJfSURfS19TRUxGVEVTVAkgCTEJLyogTm9ybWFsIHBvd2VyLXVwIHNlbGZ0ZXN0ICovCQkJCisjZGVmaW5lIFBJX0xPR19DQUxMRVJfSURfS19NRkcJCSAJMgkvKiBNZmcgcG93ZXItdXAgc2VsZnRlc3QgCSovCisjZGVmaW5lIFBJX0xPR19DQUxMRVJfSURfS19PTkxJTkUJCTMJLyogT24tbGluZSBkaWFnbm9zdGljcyAJCSovCisjZGVmaW5lIFBJX0xPR19DQUxMRVJfSURfS19IVwkJCTQJLyogSGFyZHdhcmUgCQkJCSovCisjZGVmaW5lIFBJX0xPR19DQUxMRVJfSURfS19GVwkJCTUJLyogRmlybXdhcmUgCQkJCSovCisjZGVmaW5lIFBJX0xPR19DQUxMRVJfSURfS19DTlNfSFcJCTYJLyogQ05TIGZpcm13YXJlIAkJCSovCisjZGVmaW5lIFBJX0xPR19DQUxMRVJfSURfS19DTlNfRlcJCTcJLyogQ05TIGhhcmR3YXJlIAkJCSovCisjZGVmaW5lIFBJX0xPR19DQUxMRVJfSURfS19DT05TT0xFCSAJOCAgIC8qIENvbnNvbGUgQ2FsbGVyIElkIAkJKi8KKworLyoKKyAqICBQbGFjZSBhbGwgRE1BIGNvbW1hbmRzIGluIHRoZSBmb2xsb3dpbmcgcmVxdWVzdCBhbmQgcmVzcG9uc2Ugc3RydWN0dXJlcworICogIHRvIHNpbXBsaWZ5IGNvZGUuCisgKi8KKwordHlwZWRlZiB1bmlvbgorCXsKKwlQSV9VSU5UMzIJCQkJCWNtZF90eXBlOworCVBJX0NNRF9TVEFSVF9SRVEJCQlzdGFydDsKKwlQSV9DTURfRklMVEVSU19TRVRfUkVRCQlmaWx0ZXJfc2V0OworCVBJX0NNRF9GSUxURVJTX0dFVF9SRVEJCWZpbHRlcl9nZXQ7CisJUElfQ01EX0NIQVJTX1NFVF9SRVEJCWNoYXJfc2V0OworCVBJX0NNRF9BRERSX0ZJTFRFUl9TRVRfUkVRCWFkZHJfZmlsdGVyX3NldDsKKwlQSV9DTURfQUREUl9GSUxURVJfR0VUX1JFUQlhZGRyX2ZpbHRlcl9nZXQ7CisJUElfQ01EX1NUQVRVU19DSEFSU19HRVRfUkVRCXN0YXRfY2hhcl9nZXQ7CisJUElfQ01EX0NOVFJTX0dFVF9SRVEJCWNudHJzX2dldDsKKwlQSV9DTURfQ05UUlNfU0VUX1JFUQkJY250cnNfc2V0OworCVBJX0NNRF9FUlJPUl9MT0dfQ0xFQVJfUkVRCWVycm9yX2xvZ19jbGVhcjsKKwlQSV9DTURfRVJST1JfTE9HX0dFVF9SRVEJZXJyb3JfbG9nX3JlYWQ7CisJUElfQ01EX1NOTVBfU0VUX1JFUQkJCXNubXBfc2V0OworCVBJX0NNRF9GRERJX01JQl9HRVRfUkVRCQlmZGRpX21pYl9nZXQ7CisJUElfQ01EX0RFQ19FWFRfTUlCX0dFVF9SRVEJZGVjX21pYl9nZXQ7CisJUElfQ01EX1NNVF9NSUJfU0VUX1JFUQkJc210X21pYl9zZXQ7CisJUElfQ01EX1NNVF9NSUJfR0VUX1JFUQkJc210X21pYl9nZXQ7CisJY2hhcgkJCQkJCXBhZFtQSV9DTURfUkVRX0tfU0laRV9NQVhdOyAKKwl9IFBJX0RNQV9DTURfUkVROworCit0eXBlZGVmIHVuaW9uCisJeworCVBJX1JTUF9IRUFERVIJCQkJaGVhZGVyOworCVBJX0NNRF9TVEFSVF9SU1AJCQlzdGFydDsKKwlQSV9DTURfRklMVEVSU19TRVRfUlNQCQlmaWx0ZXJfc2V0OworCVBJX0NNRF9GSUxURVJTX0dFVF9SU1AJCWZpbHRlcl9nZXQ7CisJUElfQ01EX0NIQVJTX1NFVF9SU1AJCWNoYXJfc2V0OworCVBJX0NNRF9BRERSX0ZJTFRFUl9TRVRfUlNQCWFkZHJfZmlsdGVyX3NldDsKKwlQSV9DTURfQUREUl9GSUxURVJfR0VUX1JTUAlhZGRyX2ZpbHRlcl9nZXQ7CisJUElfQ01EX1NUQVRVU19DSEFSU19HRVRfUlNQCXN0YXRfY2hhcl9nZXQ7CisJUElfQ01EX0NOVFJTX0dFVF9SU1AJCWNudHJzX2dldDsKKwlQSV9DTURfQ05UUlNfU0VUX1JTUAkJY250cnNfc2V0OworCVBJX0NNRF9FUlJPUl9MT0dfQ0xFQVJfUlNQCWVycm9yX2xvZ19jbGVhcjsKKwlQSV9DTURfRVJST1JfTE9HX0dFVF9SU1AJZXJyb3JfbG9nX2dldDsKKwlQSV9DTURfU05NUF9TRVRfUlNQCQkJc25tcF9zZXQ7CisJUElfQ01EX0ZERElfTUlCX0dFVF9SU1AJCWZkZGlfbWliX2dldDsKKwlQSV9DTURfREVDX0VYVF9NSUJfR0VUX1JTUAlkZWNfbWliX2dldDsKKwlQSV9DTURfU01UX01JQl9TRVRfUlNQCQlzbXRfbWliX3NldDsKKwlQSV9DTURfU01UX01JQl9HRVRfUlNQCQlzbXRfbWliX2dldDsKKwljaGFyCQkJCQkJcGFkW1BJX0NNRF9SU1BfS19TSVpFX01BWF07IAorCX0gUElfRE1BX0NNRF9SU1A7CisKK3R5cGVkZWYgdW5pb24KKwl7CisJUElfRE1BX0NNRF9SRVEJcmVxdWVzdDsKKwlQSV9ETUFfQ01EX1JTUAlyZXNwb25zZTsKKwl9IFBJX0RNQV9DTURfQlVGRkVSOworCisKKy8qIERlZmluZSBmb3JtYXQgb2YgQ29uc3VtZXIgQmxvY2sgKHJlc2lkZW50IGluIGhvc3QgbWVtb3J5KSAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwl2b2xhdGlsZSBQSV9VSU5UMzIJeG10X3Jjdl9kYXRhOworCXZvbGF0aWxlIFBJX1VJTlQzMglyZXNlcnZlZF8xOworCXZvbGF0aWxlIFBJX1VJTlQzMglzbXRfaG9zdDsKKwl2b2xhdGlsZSBQSV9VSU5UMzIJcmVzZXJ2ZWRfMjsKKwl2b2xhdGlsZSBQSV9VSU5UMzIJdW5zb2w7CisJdm9sYXRpbGUgUElfVUlOVDMyCXJlc2VydmVkXzM7CisJdm9sYXRpbGUgUElfVUlOVDMyCWNtZF9yc3A7CisJdm9sYXRpbGUgUElfVUlOVDMyCXJlc2VydmVkXzQ7CisJdm9sYXRpbGUgUElfVUlOVDMyCWNtZF9yZXE7CisJdm9sYXRpbGUgUElfVUlOVDMyCXJlc2VydmVkXzU7CisJfSBQSV9DT05TVU1FUl9CTE9DSzsKKworI2RlZmluZSBQSV9DT05TX01fUkNWX0lOREVYCQkJMHgwMDAwMDBGRgorI2RlZmluZSBQSV9DT05TX01fWE1UX0lOREVYCQkJMHgwMEZGMDAwMAorI2RlZmluZSBQSV9DT05TX1ZfUkNWX0lOREVYCQkJMAorI2RlZmluZSBQSV9DT05TX1ZfWE1UX0lOREVYCQkJMTYKKworLyogT2Zmc2V0cyBpbnRvIGNvbnN1bWVyIGJsb2NrICovCisKKyNkZWZpbmUgUElfQ09OU19CTEtfS19YTVRfUkNWCQkweDAwCisjZGVmaW5lIFBJX0NPTlNfQkxLX0tfU01UX0hPU1QJCTB4MDgKKyNkZWZpbmUgUElfQ09OU19CTEtfS19VTlNPTAkJCTB4MTAKKyNkZWZpbmUgUElfQ09OU19CTEtfS19DTURfUlNQCQkweDE4CisjZGVmaW5lIFBJX0NPTlNfQkxLX0tfQ01EX1JFUQkJMHgyMAorCisvKiBPZmZzZXRzIGludG8gZGVzY3JpcHRvciBibG9jayAqLworCisjZGVmaW5lIFBJX0RFU0NSX0JMS19LX1JDVl9EQVRBCQkweDAwMDAKKyNkZWZpbmUgUElfREVTQ1JfQkxLX0tfWE1UX0RBVEEJCTB4MDgwMAorI2RlZmluZSBQSV9ERVNDUl9CTEtfS19TTVRfSE9TVCAJMHgxMDAwCisjZGVmaW5lIFBJX0RFU0NSX0JMS19LX1VOU09MCQkweDEyMDAKKyNkZWZpbmUgUElfREVTQ1JfQkxLX0tfQ01EX1JTUAkJMHgxMjgwCisjZGVmaW5lIFBJX0RFU0NSX0JMS19LX0NNRF9SRVEJCTB4MTMwMAkKKworLyogRGVmaW5lIGZvcm1hdCBvZiBhIHJjdiBkZXNjciAoUmN2IERhdGEsIENtZCBSc3AsIFVuc29saWNpdGVkLCBTTVQgSG9zdCkgICAqLworLyogICBOb3RlIGEgZmllbGQgaGFzIGJlZW4gYWRkZWQgZm9yIGxhdGVyIHZlcnNpb25zIG9mIHRoZSBQRFEgdG8gYWxsb3cgZm9yICAqLworLyogICBmaW5lciBncmFudWxhcml0eSBvZiB0aGUgcmN2IGJ1ZmZlciBhbGlnbm1lbnQuICBGb3IgYmFja3dhcmRzCQkgCSAqLworLyogICBjb21wYXRpYmlsaXR5LCB0aGUgdHdvIGJpdHMgKHdoaWNoIGFsbG93IHRoZSByY3YgYnVmZmVyIHRvIGJlIGxvbmd3b3JkICAqLworLyogICBhbGlnbmVkKSBoYXZlIGJlZW4gYWRkZWQgYXQgdGhlIE1CWiBiaXRzLiAgVG8gc3VwcG9ydCBwcmV2aW91cyBkcml2ZXJzLCAqLworLyogICB0aGUgTUJaIGRlZmluaXRpb24gaXMgbGVmdCBpbnRhY3QuCQkJCQkJCQkJICAJICovCisKK3R5cGVkZWYgc3RydWN0CisJeworCVBJX1VJTlQzMglsb25nXzA7CisJUElfVUlOVDMyCWxvbmdfMTsKKwl9IFBJX1JDVl9ERVNDUjsKKworI2RlZmluZQlQSV9SQ1ZfREVTQ1JfTV9TT1AJICAJCTB4ODAwMDAwMDAKKyNkZWZpbmUgUElfUkNWX0RFU0NSX01fU0VHX0xFTl9MTyAJMHg2MDAwMDAwMCAKKyNkZWZpbmUgUElfUkNWX0RFU0NSX01fTUJaCSAgCQkweDYwMDAwMDAwIAorI2RlZmluZSBQSV9SQ1ZfREVTQ1JfTV9TRUdfTEVOCQkweDFGODAwMDAwCisjZGVmaW5lIFBJX1JDVl9ERVNDUl9NX1NFR19MRU5fSEkJMHgxRkYwMDAwMAkgIAorI2RlZmluZSBQSV9SQ1ZfREVTQ1JfTV9TRUdfQ05UCSAgCTB4MDAwRjAwMDAKKyNkZWZpbmUgUElfUkNWX0RFU0NSX01fQlVGRl9ISQkgIAkweDAwMDBGRkZGCisKKyNkZWZpbmUJUElfUkNWX0RFU0NSX1ZfU09QCSAgCQkzMQorI2RlZmluZSBQSV9SQ1ZfREVTQ1JfVl9TRUdfTEVOX0xPIAkyOQorI2RlZmluZSBQSV9SQ1ZfREVTQ1JfVl9NQloJICAJCTI5CisjZGVmaW5lIFBJX1JDVl9ERVNDUl9WX1NFR19MRU4JICAJMjMKKyNkZWZpbmUgUElfUkNWX0RFU0NSX1ZfU0VHX0xFTl9ISSAJMjAJICAKKyNkZWZpbmUgUElfUkNWX0RFU0NSX1ZfU0VHX0NOVAkgIAkxNgorI2RlZmluZSBQSV9SQ1ZfREVTQ1JfVl9CVUZGX0hJCSAJMAorCisvKiBEZWZpbmUgdGhlIGZvcm1hdCBvZiBhIHRyYW5zbWl0IGRlc2NyaXB0b3IgKFhtdCBEYXRhLCBDbWQgUmVxKSAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlQSV9VSU5UMzIJbG9uZ18wOworCVBJX1VJTlQzMglsb25nXzE7CisJfSBQSV9YTVRfREVTQ1I7CisKKyNkZWZpbmUJUElfWE1UX0RFU0NSX01fU09QCQkJMHg4MDAwMDAwMAorI2RlZmluZSBQSV9YTVRfREVTQ1JfTV9FT1AJCQkweDQwMDAwMDAwCisjZGVmaW5lIFBJX1hNVF9ERVNDUl9NX01CWgkJCTB4MjAwMDAwMDAgCisjZGVmaW5lIFBJX1hNVF9ERVNDUl9NX1NFR19MRU4JCTB4MUZGRjAwMDAKKyNkZWZpbmUgUElfWE1UX0RFU0NSX01fQlVGRl9ISQkJMHgwMDAwRkZGRgorCisjZGVmaW5lCVBJX1hNVF9ERVNDUl9WX1NPUAkJCTMxCisjZGVmaW5lCVBJX1hNVF9ERVNDUl9WX0VPUAkJCTMwCisjZGVmaW5lIFBJX1hNVF9ERVNDUl9WX01CWgkJCTI5CisjZGVmaW5lIFBJX1hNVF9ERVNDUl9WX1NFR19MRU4JCTE2CisjZGVmaW5lIFBJX1hNVF9ERVNDUl9WX0JVRkZfSEkJCTAKKworLyogRGVmaW5lIGZvcm1hdCBvZiB0aGUgRGVzY3JpcHRvciBCbG9jayAocmVzaWRlbnQgaW4gaG9zdCBtZW1vcnkpICovCisKKyNkZWZpbmUgUElfUkNWX0RBVEFfS19OVU1fRU5UUklFUwkJCTI1NgorI2RlZmluZSBQSV9YTVRfREFUQV9LX05VTV9FTlRSSUVTCQkJMjU2CisjZGVmaW5lIFBJX1NNVF9IT1NUX0tfTlVNX0VOVFJJRVMJCQk2NAorI2RlZmluZSBQSV9VTlNPTF9LX05VTV9FTlRSSUVTCQkJCTE2CisjZGVmaW5lIFBJX0NNRF9SU1BfS19OVU1fRU5UUklFUwkJCTE2CisjZGVmaW5lIFBJX0NNRF9SRVFfS19OVU1fRU5UUklFUwkJCTE2CisKK3R5cGVkZWYgc3RydWN0CisJeworCVBJX1JDVl9ERVNDUiAgcmN2X2RhdGFbUElfUkNWX0RBVEFfS19OVU1fRU5UUklFU107CisJUElfWE1UX0RFU0NSICB4bXRfZGF0YVtQSV9YTVRfREFUQV9LX05VTV9FTlRSSUVTXTsKKwlQSV9SQ1ZfREVTQ1IgIHNtdF9ob3N0W1BJX1NNVF9IT1NUX0tfTlVNX0VOVFJJRVNdOworCVBJX1JDVl9ERVNDUiAgdW5zb2xbUElfVU5TT0xfS19OVU1fRU5UUklFU107CisJUElfUkNWX0RFU0NSICBjbWRfcnNwW1BJX0NNRF9SU1BfS19OVU1fRU5UUklFU107CisJUElfWE1UX0RFU0NSICBjbWRfcmVxW1BJX0NNRF9SRVFfS19OVU1fRU5UUklFU107CisJfSBQSV9ERVNDUl9CTE9DSzsKKworLyogRGVmaW5lIFBvcnQgUmVnaXN0ZXJzIC0gb2Zmc2V0cyBmcm9tIFBEUSBCYXNlIGFkZHJlc3MgKi8KKworI2RlZmluZSBQSV9QRFFfS19SRUdfUE9SVF9SRVNFVAkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgUElfUERRX0tfUkVHX0hPU1RfREFUQQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgUElfUERRX0tfUkVHX1BPUlRfQ1RSTAkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgUElfUERRX0tfUkVHX1BPUlRfREFUQV9BCQkweDAwMDAwMDBDCisjZGVmaW5lIFBJX1BEUV9LX1JFR19QT1JUX0RBVEFfQgkJMHgwMDAwMDAxMAorI2RlZmluZSBQSV9QRFFfS19SRUdfUE9SVF9TVEFUVVMJCTB4MDAwMDAwMTQKKyNkZWZpbmUgUElfUERRX0tfUkVHX1RZUEVfMF9TVEFUVVMgCQkweDAwMDAwMDE4CisjZGVmaW5lIFBJX1BEUV9LX1JFR19IT1NUX0lOVF9FTkIJICAJMHgwMDAwMDAxQworI2RlZmluZSBQSV9QRFFfS19SRUdfVFlQRV8yX1BST0RfTk9JTlQgCTB4MDAwMDAwMjAKKyNkZWZpbmUgUElfUERRX0tfUkVHX1RZUEVfMl9QUk9ECQkweDAwMDAwMDI0CisjZGVmaW5lIFBJX1BEUV9LX1JFR19DTURfUlNQX1BST0QJCTB4MDAwMDAwMjgKKyNkZWZpbmUgUElfUERRX0tfUkVHX0NNRF9SRVFfUFJPRAkJMHgwMDAwMDAyQworI2RlZmluZSBQSV9QRFFfS19SRUdfU01UX0hPU1RfUFJPRCAgIAkweDAwMDAwMDMwCisjZGVmaW5lIFBJX1BEUV9LX1JFR19VTlNPTF9QUk9ECQkJMHgwMDAwMDAzNAorCisvKiBQb3J0IENvbnRyb2wgUmVnaXN0ZXIgLSBDb21tYW5kIGNvZGVzIGZvciBwcmltYXJ5IGNvbW1hbmRzICovCisKKyNkZWZpbmUgUElfUENUUkxfTV9DTURfRVJST1IJCQkweDgwMDAKKyNkZWZpbmUgUElfUENUUkxfTV9CTEFTVF9GTEFTSAkJCTB4NDAwMAorI2RlZmluZSBQSV9QQ1RSTF9NX0hBTFQJCQkJCTB4MjAwMAorI2RlZmluZSBQSV9QQ1RSTF9NX0NPUFlfREFUQQkJCTB4MTAwMAorI2RlZmluZSBQSV9QQ1RSTF9NX0VSUk9SX0xPR19TVEFSVAkJMHgwODAwCisjZGVmaW5lIFBJX1BDVFJMX01fRVJST1JfTE9HX1JFQUQJCTB4MDQwMAorI2RlZmluZSBQSV9QQ1RSTF9NX1hNVF9EQVRBX0ZMVVNIX0RPTkUJMHgwMjAwCisjZGVmaW5lIFBJX1BDVFJMX01fSU5JVAkJCQkJMHgwMTAwCisjZGVmaW5lIFBJX1BDVFJMX01fSU5JVF9TVEFSVAkJICAgIDB4MDA4MAorI2RlZmluZSBQSV9QQ1RSTF9NX0NPTlNfQkxPQ0sJCQkweDAwNDAKKyNkZWZpbmUgUElfUENUUkxfTV9VTklOSVQJCQkJMHgwMDIwCisjZGVmaW5lIFBJX1BDVFJMX01fUklOR19NRU1CRVIJCQkweDAwMTAKKyNkZWZpbmUgUElfUENUUkxfTV9NTEEJCQkJCTB4MDAwOAkJCisjZGVmaW5lIFBJX1BDVFJMX01fRldfUkVWX1JFQUQJCQkweDAwMDQKKyNkZWZpbmUgUElfUENUUkxfTV9ERVZfU1BFQ0lGSUMJCQkweDAwMDIKKyNkZWZpbmUgUElfUENUUkxfTV9TVUJfQ01ECQkJCTB4MDAwMQorCisvKiBEZWZpbmUgc3ViLWNvbW1hbmRzIGFjY2Vzc2VkIHZpYSB0aGUgUElfUENUUkxfTV9TVUJfQ01EIGNvbW1hbmQgKi8KKworI2RlZmluZSBQSV9TVUJfQ01EX0tfTElOS19VTklOSVQJCTB4MDAwMQorI2RlZmluZSBQSV9TVUJfQ01EX0tfQlVSU1RfU0laRV9TRVQJCTB4MDAwMgorI2RlZmluZSBQSV9TVUJfQ01EX0tfUERRX1JFVl9HRVQJCTB4MDAwNAorI2RlZmluZSBQSV9TVUJfQ01EX0tfSFdfUkVWX0dFVAkJCTB4MDAwOAorCisvKiBEZWZpbmUgc29tZSBQb3J0IERhdGEgQiB2YWx1ZXMgKi8KKworI2RlZmluZSBQSV9QREFUQV9CX0RNQV9CVVJTVF9TSVpFXzQJIAkwCQkvKiB2YWxpZCB2YWx1ZXMgZm9yIGNvbW1hbmQgKi8KKyNkZWZpbmUgUElfUERBVEFfQl9ETUFfQlVSU1RfU0laRV84CSAJMQorI2RlZmluZSBQSV9QREFUQV9CX0RNQV9CVVJTVF9TSVpFXzE2CTIKKyNkZWZpbmUgUElfUERBVEFfQl9ETUFfQlVSU1RfU0laRV8zMgkzCQkvKiBub3Qgc3VwcG9ydGVkIG9uIFBDSSAqLworI2RlZmluZSBQSV9QREFUQV9CX0RNQV9CVVJTVF9TSVpFX0RFRglQSV9QREFUQV9CX0RNQV9CVVJTVF9TSVpFXzE2CisKKy8qIFBvcnQgRGF0YSBBIFJlc2V0IHN0YXRlICovCisKKyNkZWZpbmUgUElfUERBVEFfQV9SRVNFVF9NX1VQR1JBREUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgUElfUERBVEFfQV9SRVNFVF9NX1NPRlRfUkVTRVQJMHgwMDAwMDAwMgorI2RlZmluZSBQSV9QREFUQV9BX1JFU0VUX01fU0tJUF9TVAkJMHgwMDAwMDAwNAorCisvKiBSZWFkIGFkYXB0ZXIgTUxBIGFkZHJlc3MgcG9ydCBjb250cm9sIGNvbW1hbmQgY29uc3RhbnRzICovCisKKyNkZWZpbmUgUElfUERBVEFfQV9NTEFfS19MTwkJCQkwCisjZGVmaW5lIFBJX1BEQVRBX0FfTUxBX0tfSEkJCQkJMQorCisvKiBCeXRlIFN3YXAgdmFsdWVzIGZvciBpbml0IGNvbW1hbmQgKi8KKworI2RlZmluZSBQSV9QREFUQV9BX0lOSVRfTV9ERVNDX0JMS19BRERSCQkJMHgwRkZGRkUwMDAKKyNkZWZpbmUgUElfUERBVEFfQV9JTklUX01fUkVTRVJWRUQJCQkJMHgwMDAwMDFGRkMKKyNkZWZpbmUgUElfUERBVEFfQV9JTklUX01fQlNXQVBfREFUQQkJCTB4MDAwMDAwMDAyIAorI2RlZmluZSBQSV9QREFUQV9BX0lOSVRfTV9CU1dBUF9MSVRFUkFMCQkJMHgwMDAwMDAwMDEKKworI2RlZmluZSBQSV9QREFUQV9BX0lOSVRfVl9ERVNDX0JMS19BRERSCQkJMTMKKyNkZWZpbmUgUElfUERBVEFfQV9JTklUX1ZfUkVTRVJWRUQJCQkJMworI2RlZmluZSBQSV9QREFUQV9BX0lOSVRfVl9CU1dBUF9EQVRBCQkJMSAKKyNkZWZpbmUgUElfUERBVEFfQV9JTklUX1ZfQlNXQVBfTElURVJBTAkJCTAKKworLyogUG9ydCBSZXNldCBSZWdpc3RlciAqLworCisjZGVmaW5lIFBJX1JFU0VUX01fQVNTRVJUX1JFU0VUCQkJMQorCisvKiBQb3J0IFN0YXR1cyByZWdpc3RlciAqLworCisjZGVmaW5lIFBJX1BTVEFUVVNfVl9SQ1ZfREFUQV9QRU5ESU5HCTMxCisjZGVmaW5lIFBJX1BTVEFUVVNfVl9YTVRfREFUQV9QRU5ESU5HCTMwCisjZGVmaW5lIFBJX1BTVEFUVVNfVl9TTVRfSE9TVF9QRU5ESU5HCTI5CisjZGVmaW5lIFBJX1BTVEFUVVNfVl9VTlNPTF9QRU5ESU5HCQkyOAorI2RlZmluZSBQSV9QU1RBVFVTX1ZfQ01EX1JTUF9QRU5ESU5HCTI3CisjZGVmaW5lIFBJX1BTVEFUVVNfVl9DTURfUkVRX1BFTkRJTkcJMjYKKyNkZWZpbmUgUElfUFNUQVRVU19WX1RZUEVfMF9QRU5ESU5HCQkyNQorI2RlZmluZSBQSV9QU1RBVFVTX1ZfUkVTRVJWRURfMQkJCTE2CisjZGVmaW5lIFBJX1BTVEFUVVNfVl9SRVNFUlZFRF8yCQkJMTEKKyNkZWZpbmUgUElfUFNUQVRVU19WX1NUQVRFCQkJCTgKKyNkZWZpbmUgUElfUFNUQVRVU19WX0hBTFRfSUQJCQkwCisKKyNkZWZpbmUgUElfUFNUQVRVU19NX1JDVl9EQVRBX1BFTkRJTkcJMHg4MDAwMDAwMAorI2RlZmluZSBQSV9QU1RBVFVTX01fWE1UX0RBVEFfUEVORElORwkweDQwMDAwMDAwCisjZGVmaW5lIFBJX1BTVEFUVVNfTV9TTVRfSE9TVF9QRU5ESU5HCTB4MjAwMDAwMDAKKyNkZWZpbmUgUElfUFNUQVRVU19NX1VOU09MX1BFTkRJTkcJCTB4MTAwMDAwMDAKKyNkZWZpbmUgUElfUFNUQVRVU19NX0NNRF9SU1BfUEVORElORwkweDA4MDAwMDAwCisjZGVmaW5lIFBJX1BTVEFUVVNfTV9DTURfUkVRX1BFTkRJTkcJMHgwNDAwMDAwMAorI2RlZmluZSBQSV9QU1RBVFVTX01fVFlQRV8wX1BFTkRJTkcJCTB4MDIwMDAwMDAKKyNkZWZpbmUgUElfUFNUQVRVU19NX1JFU0VSVkVEXzEJCQkweDAxRkYwMDAwCisjZGVmaW5lIFBJX1BTVEFUVVNfTV9SRVNFUlZFRF8yCQkJMHgwMDAwRjgwMAorI2RlZmluZSBQSV9QU1RBVFVTX01fU1RBVEUJCQkJMHgwMDAwMDcwMAorI2RlZmluZSBQSV9QU1RBVFVTX01fSEFMVF9JRAkJCTB4MDAwMDAwRkYKKworLyogRGVmaW5lIEhhbHQgSWQncwkJCSAJCQkJCSovCisvKiAgIERvIG5vdCBpbnNlcnQgaW50byB0aGlzIGxpc3QsIG9ubHkgYXBwZW5kLiAqLworCisjZGVmaW5lIFBJX0hBTFRfSURfS19TRUxGVEVTVF9USU1FT1VUCTAKKyNkZWZpbmUgUElfSEFMVF9JRF9LX1BBUklUWV9FUlJPUgkJMQorI2RlZmluZSBQSV9IQUxUX0lEX0tfSE9TVF9ESVJfSEFMVAkJMgorI2RlZmluZSBQSV9IQUxUX0lEX0tfU1dfRkFVTFQJCQkzCisjZGVmaW5lIFBJX0hBTFRfSURfS19IV19GQVVMVAkJCTQKKyNkZWZpbmUgUElfSEFMVF9JRF9LX1BDX1RSQUNFCQkJNQorI2RlZmluZSBQSV9IQUxUX0lEX0tfRE1BX0VSUk9SCQkJNgkJCS8qIEhvc3QgRGF0YSBoYXMgZXJyb3IgcmVnICovCisjZGVmaW5lIFBJX0hBTFRfSURfS19JTUFHRV9DUkNfRVJST1IJNyAgIAkJLyogSW1hZ2UgaXMgYmFkLCB1cGRhdGUgaXQgKi8KKyNkZWZpbmUgUElfSEFMVF9JRF9LX0JVU19FWENFUFRJT04JIAk4ICAgCQkvKiA2OEsgYnVzIGV4Y2VwdGlvbgkgICAqLworCisvKiBIb3N0IEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgYXMgc2VlbiBieSBob3N0ICovIAorCisjZGVmaW5lIFBJX0hPU1RfSU5UX01fWE1UX0RBVEFfRU5CCQkweDgwMDAwMDAwCS8qIFR5cGUgMiBFbmFibGVzICovCisjZGVmaW5lIFBJX0hPU1RfSU5UX01fUkNWX0RBVEFfRU5CCQkweDQwMDAwMDAwICAKKyNkZWZpbmUgUElfSE9TVF9JTlRfTV9TTVRfSE9TVF9FTkIJCTB4MTAwMDAwMDAJLyogVHlwZSAxIEVuYWJsZXMgKi8gCisjZGVmaW5lIFBJX0hPU1RfSU5UX01fVU5TT0xfRU5CCQkJMHgyMDAwMDAwMAorI2RlZmluZSBQSV9IT1NUX0lOVF9NX0NNRF9SU1BfRU5CCQkweDA4MDAwMDAwCisjZGVmaW5lIFBJX0hPU1RfSU5UX01fQ01EX1JFUV9FTkIJCTB4MDQwMDAwMDAKKyNkZWZpbmUJUElfSE9TVF9JTlRfTV9UWVBFXzFfUkVTRVJWRUQJMHgwMEZGMDAwMAorI2RlZmluZQlQSV9IT1NUX0lOVF9NX1RZUEVfMF9SRVNFUlZFRAkweDAwMDBGRjAwCS8qIFR5cGUgMCBFbmFibGVzICovCisjZGVmaW5lIFBJX0hPU1RfSU5UX01fMU1TCQkJCTB4MDAwMDAwODAKKyNkZWZpbmUgUElfSE9TVF9JTlRfTV8yME1TCQkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgUElfSE9TVF9JTlRfTV9DU1JfQ01EX0RPTkUJCTB4MDAwMDAwMjAKKyNkZWZpbmUgUElfSE9TVF9JTlRfTV9TVEFURV9DSEFOR0UJCTB4MDAwMDAwMTAKKyNkZWZpbmUgUElfSE9TVF9JTlRfTV9YTVRfRkxVU0gJCQkweDAwMDAwMDA4CisjZGVmaW5lIFBJX0hPU1RfSU5UX01fTlhNCQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgUElfSE9TVF9JTlRfTV9QTV9QQVJfRVJSCQkweDAwMDAwMDAyCisjZGVmaW5lIFBJX0hPU1RfSU5UX01fQlVTX1BBUl9FUlIJCTB4MDAwMDAwMDEKKworI2RlZmluZSBQSV9IT1NUX0lOVF9WX1hNVF9EQVRBX0VOQgkJMzEJCQkvKiBUeXBlIDIgRW5hYmxlcyAqLworI2RlZmluZSBQSV9IT1NUX0lOVF9WX1JDVl9EQVRBX0VOQgkJMzAgIAorI2RlZmluZSBQSV9IT1NUX0lOVF9WX1NNVF9IT1NUX0VOQgkJMjkJCQkvKiBUeXBlIDEgRW5hYmxlcyAqLyAKKyNkZWZpbmUgUElfSE9TVF9JTlRfVl9VTlNPTF9FTkIJCQkyOAorI2RlZmluZSBQSV9IT1NUX0lOVF9WX0NNRF9SU1BfRU5CCQkyNworI2RlZmluZSBQSV9IT1NUX0lOVF9WX0NNRF9SRVFfRU5CCQkyNgorI2RlZmluZQlQSV9IT1NUX0lOVF9WX1RZUEVfMV9SRVNFUlZFRAkxNgorI2RlZmluZQlQSV9IT1NUX0lOVF9WX1RZUEVfMF9SRVNFUlZFRCAgIDgJCQkvKiBUeXBlIDAgRW5hYmxlcyAqLworI2RlZmluZSBQSV9IT1NUX0lOVF9WXzFNU19FTkIJCQk3CisjZGVmaW5lIFBJX0hPU1RfSU5UX1ZfMjBNU19FTkIJCQk2CisjZGVmaW5lIFBJX0hPU1RfSU5UX1ZfQ1NSX0NNRF9ET05FX0VOQgk1CisjZGVmaW5lIFBJX0hPU1RfSU5UX1ZfU1RBVEVfQ0hBTkdFX0VOQgk0CisjZGVmaW5lIFBJX0hPU1RfSU5UX1ZfWE1UX0ZMVVNIX0VOQiAJMworI2RlZmluZSBQSV9IT1NUX0lOVF9WX05YTV9FTkIJCQkyCisjZGVmaW5lIFBJX0hPU1RfSU5UX1ZfUE1fUEFSX0VSUl9FTkIJMQorI2RlZmluZSBQSV9IT1NUX0lOVF9WX0JVU19QQVJfRVJSX0VOQgkwCisKKyNkZWZpbmUgUElfSE9TVF9JTlRfS19BQ0tfQUxMX1RZUEVfMAkweDAwMDAwMEZGCisjZGVmaW5lIFBJX0hPU1RfSU5UX0tfRElTQUJMRV9BTExfSU5UUwkweDAwMDAwMDAwCisjZGVmaW5lIFBJX0hPU1RfSU5UX0tfRU5BQkxFX0FMTF9JTlRTCTB4RkZGRkZGRkYKKyNkZWZpbmUgUElfSE9TVF9JTlRfS19FTkFCTEVfREVGX0lOVFMJMHhDMDAwMDAxRgorCisvKiBUeXBlIDAgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworCisjZGVmaW5lIFBJX1RZUEVfMF9TVEFUX01fMU1TCQkJMHgwMDAwMDA4MAorI2RlZmluZSBQSV9UWVBFXzBfU1RBVF9NXzIwTVMJCQkweDAwMDAwMDQwCisjZGVmaW5lIFBJX1RZUEVfMF9TVEFUX01fQ1NSX0NNRF9ET05FCTB4MDAwMDAwMjAKKyNkZWZpbmUgUElfVFlQRV8wX1NUQVRfTV9TVEFURV9DSEFOR0UJMHgwMDAwMDAxMAorI2RlZmluZSBQSV9UWVBFXzBfU1RBVF9NX1hNVF9GTFVTSAkJMHgwMDAwMDAwOAorI2RlZmluZSBQSV9UWVBFXzBfU1RBVF9NX05YTQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgUElfVFlQRV8wX1NUQVRfTV9QTV9QQVJfRVJSCQkweDAwMDAwMDAyCisjZGVmaW5lIFBJX1RZUEVfMF9TVEFUX01fQlVTX1BBUl9FUlIJMHgwMDAwMDAwMQorCisjZGVmaW5lIFBJX1RZUEVfMF9TVEFUX1ZfMU1TCQkJNwkJCQorI2RlZmluZSBQSV9UWVBFXzBfU1RBVF9WXzIwTVMJCQk2CQorI2RlZmluZSBQSV9UWVBFXzBfU1RBVF9WX0NTUl9DTURfRE9ORQk1CisjZGVmaW5lIFBJX1RZUEVfMF9TVEFUX1ZfU1RBVEVfQ0hBTkdFCTQKKyNkZWZpbmUgUElfVFlQRV8wX1NUQVRfVl9YTVRfRkxVU0gJCTMKKyNkZWZpbmUgUElfVFlQRV8wX1NUQVRfVl9OWE0JCQkyCisjZGVmaW5lIFBJX1RZUEVfMF9TVEFUX1ZfUE1fUEFSX0VSUgkJMQorI2RlZmluZSBQSV9UWVBFXzBfU1RBVF9WX0JVU19QQVJfRVJSCTAKKworLyogUmVnaXN0ZXIgZGVmaW5pdGlvbiBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkIGZvciBib3RoIGJpZyBhbmQgbGl0dGxlIGVuZGlhbiBzeXN0ZW1zICovCisKKyNpZm5kZWYgIEJJR19FTkRJQU4KKworLyogTGl0dGxlIGVuZGlhbiBmb3JtYXQgb2YgVHlwZSAxIFByb2R1Y2VyIHJlZ2lzdGVyICovCisKK3R5cGVkZWYgdW5pb24KKwl7CisJUElfVUlOVDMyCWx3b3JkOworCXN0cnVjdAorCQl7CisJCVBJX1VJTlQ4CXByb2Q7CisJCVBJX1VJTlQ4CWNvbXA7CisJCVBJX1VJTlQ4CW1iel8xOworCQlQSV9VSU5UOAltYnpfMjsKKwkJfSBpbmRleDsKKwl9IFBJX1RZUEVfMV9QUk9EX1JFRzsKKworLyogTGl0dGxlIGVuZGlhbiBmb3JtYXQgb2YgVHlwZSAyIFByb2R1Y2VyIHJlZ2lzdGVyICovCisKK3R5cGVkZWYgdW5pb24KKwl7CisJUElfVUlOVDMyCWx3b3JkOworCXN0cnVjdAorCQl7CisJCVBJX1VJTlQ4CXJjdl9wcm9kOworCQlQSV9VSU5UOAl4bXRfcHJvZDsKKwkJUElfVUlOVDgJcmN2X2NvbXA7CisJCVBJX1VJTlQ4CXhtdF9jb21wOworCQl9IGluZGV4OworCX0gUElfVFlQRV8yX1BST0RfUkVHOworCisvKiBMaXR0bGUgZW5kaWFuIGZvcm1hdCBvZiBUeXBlIDEgQ29uc3VtZXIgQmxvY2sgbG9uZ3dvcmQgKi8KKwordHlwZWRlZiB1bmlvbgorCXsKKwlQSV9VSU5UMzIJbHdvcmQ7CisJc3RydWN0CisJCXsKKwkJUElfVUlOVDgJY29uczsKKwkJUElfVUlOVDgJcmVzMDsKKwkJUElfVUlOVDgJcmVzMTsKKwkJUElfVUlOVDgJcmVzMjsKKwkJfSBpbmRleDsKKwl9IFBJX1RZUEVfMV9DT05TVU1FUjsKKworLyogTGl0dGxlIGVuZGlhbiBmb3JtYXQgb2YgVHlwZSAyIENvbnN1bWVyIEJsb2NrIGxvbmd3b3JkICovCisKK3R5cGVkZWYgdW5pb24KKwl7CisJUElfVUlOVDMyCWx3b3JkOworCXN0cnVjdAorCQl7CisJCVBJX1VJTlQ4CXJjdl9jb25zOworCQlQSV9VSU5UOAlyZXMwOworCQlQSV9VSU5UOAl4bXRfY29uczsKKwkJUElfVUlOVDgJcmVzMTsKKwkJfSBpbmRleDsKKwl9IFBJX1RZUEVfMl9DT05TVU1FUjsKKworI2Vsc2UKKworLyogQmlnIGVuZGlhbiBmb3JtYXQgb2YgVHlwZSAxIFByb2R1Y2VyIHJlZ2lzdGVyICovCisKK3R5cGVkZWYgdW5pb24KKwl7CisJUElfVUlOVDMyCWx3b3JkOworCXN0cnVjdAorCQl7CisJCVBJX1VJTlQ4CW1iel8yOworCQlQSV9VSU5UOAltYnpfMTsKKwkJUElfVUlOVDgJY29tcDsKKwkJUElfVUlOVDgJcHJvZDsKKwkJfSBpbmRleDsKKwl9IFBJX1RZUEVfMV9QUk9EX1JFRzsKKworLyogQmlnIGVuZGlhbiBmb3JtYXQgb2YgVHlwZSAyIFByb2R1Y2VyIHJlZ2lzdGVyICovCisKK3R5cGVkZWYgdW5pb24KKwl7CisJUElfVUlOVDMyCWx3b3JkOworCXN0cnVjdAorCQl7CisJCVBJX1VJTlQ4CXhtdF9jb21wOworCQlQSV9VSU5UOAlyY3ZfY29tcDsKKwkJUElfVUlOVDgJeG10X3Byb2Q7CisJCVBJX1VJTlQ4CXJjdl9wcm9kOworCQl9IGluZGV4OworCX0gUElfVFlQRV8yX1BST0RfUkVHOworCisvKiBCaWcgZW5kaWFuIGZvcm1hdCBvZiBUeXBlIDEgQ29uc3VtZXIgQmxvY2sgbG9uZ3dvcmQgKi8KKwordHlwZWRlZiB1bmlvbgorCXsKKwlQSV9VSU5UMzIJbHdvcmQ7CisJc3RydWN0CisJCXsKKwkJUElfVUlOVDgJcmVzMjsKKwkJUElfVUlOVDgJcmVzMTsKKwkJUElfVUlOVDgJcmVzMDsKKwkJUElfVUlOVDgJY29uczsKKwkJfSBpbmRleDsKKwl9IFBJX1RZUEVfMV9DT05TVU1FUjsKKworLyogQmlnIGVuZGlhbiBmb3JtYXQgb2YgVHlwZSAyIENvbnN1bWVyIEJsb2NrIGxvbmd3b3JkICovCisKK3R5cGVkZWYgdW5pb24KKwl7CisJUElfVUlOVDMyCWx3b3JkOworCXN0cnVjdAorCQl7CisJCVBJX1VJTlQ4CXJlczE7CisJCVBJX1VJTlQ4CXhtdF9jb25zOworCQlQSV9VSU5UOAlyZXMwOworCQlQSV9VSU5UOAlyY3ZfY29uczsKKwkJfSBpbmRleDsKKwl9IFBJX1RZUEVfMl9DT05TVU1FUjsKKworI2VuZGlmCS8qICNpZm5kZWYgQklHX0VORElBTiAqLworCisvKiBEZWZpbmUgRUlTQSBjb250cm9sbGVyIHJlZ2lzdGVyIG9mZnNldHMgKi8KKworI2RlZmluZSBQSV9FU0lDX0tfQlVSU1RfSE9MRE9GRgkJMHgwNDAKKyNkZWZpbmUgUElfRVNJQ19LX1NMT1RfSUQgICAgICAgICAgICAJMHhDODAKKyNkZWZpbmUgUElfRVNJQ19LX1NMT1RfQ05UUkwJCTB4Qzg0CisjZGVmaW5lIFBJX0VTSUNfS19NRU1fQUREX0NNUF8wICAgICAJMHhDODUKKyNkZWZpbmUgUElfRVNJQ19LX01FTV9BRERfQ01QXzEgICAgIAkweEM4NgorI2RlZmluZSBQSV9FU0lDX0tfTUVNX0FERF9DTVBfMiAgICAgCTB4Qzg3CisjZGVmaW5lIFBJX0VTSUNfS19NRU1fQUREX0hJX0NNUF8wICAJMHhDODgKKyNkZWZpbmUgUElfRVNJQ19LX01FTV9BRERfSElfQ01QXzEgIAkweEM4OQorI2RlZmluZSBQSV9FU0lDX0tfTUVNX0FERF9ISV9DTVBfMiAgCTB4QzhBCisjZGVmaW5lIFBJX0VTSUNfS19NRU1fQUREX01BU0tfMCAgICAgCTB4QzhCCisjZGVmaW5lIFBJX0VTSUNfS19NRU1fQUREX01BU0tfMSAgICAgCTB4QzhDCisjZGVmaW5lIFBJX0VTSUNfS19NRU1fQUREX01BU0tfMiAgICAgCTB4QzhECisjZGVmaW5lIFBJX0VTSUNfS19NRU1fQUREX0xPX0NNUF8wICAJMHhDOEUKKyNkZWZpbmUgUElfRVNJQ19LX01FTV9BRERfTE9fQ01QXzEgIAkweEM4RgorI2RlZmluZSBQSV9FU0lDX0tfTUVNX0FERF9MT19DTVBfMiAgCTB4QzkwCisjZGVmaW5lIFBJX0VTSUNfS19JT19DTVBfMF8wCQkweEM5MQorI2RlZmluZSBQSV9FU0lDX0tfSU9fQ01QXzBfMQkJMHhDOTIKKyNkZWZpbmUgUElfRVNJQ19LX0lPX0NNUF8xXzAJCTB4QzkzCisjZGVmaW5lIFBJX0VTSUNfS19JT19DTVBfMV8xCQkweEM5NAorI2RlZmluZSBQSV9FU0lDX0tfSU9fQ01QXzJfMAkJMHhDOTUKKyNkZWZpbmUgUElfRVNJQ19LX0lPX0NNUF8yXzEJCTB4Qzk2CisjZGVmaW5lIFBJX0VTSUNfS19JT19DTVBfM18wCQkweEM5NworI2RlZmluZSBQSV9FU0lDX0tfSU9fQ01QXzNfMQkJMHhDOTgKKyNkZWZpbmUgUElfRVNJQ19LX0lPX0FERF9NQVNLXzBfMCAgICAJMHhDOTkKKyNkZWZpbmUgUElfRVNJQ19LX0lPX0FERF9NQVNLXzBfMSAgICAJMHhDOUEKKyNkZWZpbmUgUElfRVNJQ19LX0lPX0FERF9NQVNLXzFfMCAgICAJMHhDOUIKKyNkZWZpbmUgUElfRVNJQ19LX0lPX0FERF9NQVNLXzFfMSAgICAJMHhDOUMKKyNkZWZpbmUgUElfRVNJQ19LX0lPX0FERF9NQVNLXzJfMCAgICAJMHhDOUQKKyNkZWZpbmUgUElfRVNJQ19LX0lPX0FERF9NQVNLXzJfMSAgICAJMHhDOUUKKyNkZWZpbmUgUElfRVNJQ19LX0lPX0FERF9NQVNLXzNfMCAgICAJMHhDOUYKKyNkZWZpbmUgUElfRVNJQ19LX0lPX0FERF9NQVNLXzNfMSAgICAJMHhDQTAKKyNkZWZpbmUgUElfRVNJQ19LX01PRF9DT05GSUdfMQkJMHhDQTEKKyNkZWZpbmUgUElfRVNJQ19LX01PRF9DT05GSUdfMgkJMHhDQTIKKyNkZWZpbmUgUElfRVNJQ19LX01PRF9DT05GSUdfMwkJMHhDQTMKKyNkZWZpbmUgUElfRVNJQ19LX01PRF9DT05GSUdfNAkJMHhDQTQKKyNkZWZpbmUgUElfRVNJQ19LX01PRF9DT05GSUdfNSAgICAJMHhDQTUKKyNkZWZpbmUgUElfRVNJQ19LX01PRF9DT05GSUdfNgkJMHhDQTYKKyNkZWZpbmUgUElfRVNJQ19LX01PRF9DT05GSUdfNwkJMHhDQTcKKyNkZWZpbmUgUElfRVNJQ19LX0RJUF9TV0lUQ0ggICAgICAgICAJMHhDQTgKKyNkZWZpbmUgUElfRVNJQ19LX0lPX0NPTkZJR19TVEFUXzAgICAJMHhDQTkKKyNkZWZpbmUgUElfRVNJQ19LX0lPX0NPTkZJR19TVEFUXzEgICAJMHhDQUEKKyNkZWZpbmUgUElfRVNJQ19LX0RNQV9DT05GSUcgICAgICAgICAJMHhDQUIKKyNkZWZpbmUgUElfRVNJQ19LX0lOUFVUX1BPUlQgICAgICAgICAJMHhDQUMKKyNkZWZpbmUgUElfRVNJQ19LX09VVFBVVF9QT1JUICAgICAgICAJMHhDQUQKKyNkZWZpbmUgUElfRVNJQ19LX0ZVTkNUSU9OX0NOVFJMCTB4Q0FFCisjZGVmaW5lIFBJX0VTSUNfS19DU1JfSU9fTEVOCQlQSV9FU0lDX0tfRlVOQ1RJT05fQ05UUkwrMQkvKiBhbHdheXMgbGFzdCByZWcgKyAxICovCisKKy8qIERlZmluZSB0aGUgdmFsdWUgYWxsIGRyaXZlcnMgbXVzdCB3cml0ZSB0byB0aGUgZnVuY3Rpb24gY29udHJvbCByZWdpc3Rlci4gKi8KKworI2RlZmluZSBQSV9FU0lDX0tfRlVOQ1RJT05fQ05UUkxfSU9fRU5CCTB4MDMKKworLyogRGVmaW5lIHRoZSBiaXRzIGluIHRoZSBzbG90IGNvbnRyb2wgcmVnaXN0ZXIuICovCisKKyNkZWZpbmUgUElfU0xPVF9DTlRSTF9NX1JFU0VUCQkweDA0CS8qIERvbid0IHVzZS4gICAgICAgKi8KKyNkZWZpbmUgUElfU0xPVF9DTlRSTF9NX0VSUk9SCQkweDAyCS8qIE5vdCBpbXBsZW1lbnRlZC4gKi8KKyNkZWZpbmUgUElfU0xPVF9DTlRSTF9NX0VOQgkJMHgwMQkvKiBNdXN0IGJlIHNldC4gICAgICovCisKKy8qIERlZmluZSB0aGUgYml0cyBpbiB0aGUgYnVyc3QgaG9sZG9mZiByZWdpc3Rlci4gKi8KKworI2RlZmluZSBQSV9CVVJTVF9IT0xET0ZGX01fSE9MRE9GRgkweEZDCisjZGVmaW5lIFBJX0JVUlNUX0hPTERPRkZfTV9SRVNFUlZFRAkweDAyCisjZGVmaW5lIFBJX0JVUlNUX0hPTERPRkZfTV9NRU1fTUFQCTB4MDEKKworI2RlZmluZSBQSV9CVVJTVF9IT0xET0ZGX1ZfSE9MRE9GRgkyCisjZGVmaW5lIFBJX0JVUlNUX0hPTERPRkZfVl9SRVNFUlZFRAkxCisjZGVmaW5lIFBJX0JVUlNUX0hPTERPRkZfVl9NRU1fTUFQCTAKKworLyoKKyAqIERlZmluZSB0aGUgZmllbGRzIGluIHRoZSBJTyBDb21wYXJlIHJlZ2lzdGVycy4KKyAqIFRoZSBkcml2ZXIgbXVzdCBpbml0aWFsaXplIHRoZSBzbG90IGZpZWxkIHdpdGggdGhlIHNsb3QgSUQgc2hpZnRlZCBieSB0aGUKKyAqIGFtb3VudCBzaG93biBiZWxvdy4KKyAqLworCisjZGVmaW5lIFBJX0lPX0NNUF9WX1NMT1QJCTQKKworLyogRGVmaW5lIHRoZSBmaWVsZHMgaW4gdGhlIEludGVycnVwdCBDaGFubmVsIENvbmZpZ3VyYXRpb24gYW5kIFN0YXR1cyByZWcgKi8KKworI2RlZmluZSBQSV9DT05GSUdfU1RBVF8wX01fUEVORAkJCTB4ODAKKyNkZWZpbmUgUElfQ09ORklHX1NUQVRfMF9NX1JFU18xCQkweDQwCisjZGVmaW5lIFBJX0NPTkZJR19TVEFUXzBfTV9JUkVRX09VVAkJMHgyMAorI2RlZmluZSBQSV9DT05GSUdfU1RBVF8wX01fSVJFUV9JTgkJMHgxMAorI2RlZmluZSBQSV9DT05GSUdfU1RBVF8wX01fSU5UX0VOQgkJMHgwOAorI2RlZmluZSBQSV9DT05GSUdfU1RBVF8wX01fUkVTXzAJCTB4MDQKKyNkZWZpbmUgUElfQ09ORklHX1NUQVRfMF9NX0lSUQkJCTB4MDMKKworI2RlZmluZSBQSV9DT05GSUdfU1RBVF8wX1ZfUEVORAkJCTcKKyNkZWZpbmUgUElfQ09ORklHX1NUQVRfMF9WX1JFU18xCQk2CisjZGVmaW5lIFBJX0NPTkZJR19TVEFUXzBfVl9JUkVRX09VVAkJNQorI2RlZmluZSBQSV9DT05GSUdfU1RBVF8wX1ZfSVJFUV9JTgkJNAorI2RlZmluZSBQSV9DT05GSUdfU1RBVF8wX1ZfSU5UX0VOQgkJMworI2RlZmluZSBQSV9DT05GSUdfU1RBVF8wX1ZfUkVTXzAJCTIKKyNkZWZpbmUgUElfQ09ORklHX1NUQVRfMF9WX0lSUQkJCTAKKworI2RlZmluZSBQSV9DT05GSUdfU1RBVF8wX0lSUV9LXzkJCTAKKyNkZWZpbmUgUElfQ09ORklHX1NUQVRfMF9JUlFfS18xMAkJMQorI2RlZmluZSBQSV9DT05GSUdfU1RBVF8wX0lSUV9LXzExCQkyCisjZGVmaW5lIFBJX0NPTkZJR19TVEFUXzBfSVJRX0tfMTUJCTMKKworLyogRGVmaW5lIERFQyBGRERJY29udHJvbGxlci9FSVNBIChERUZFQSkgRUlTQSBoYXJkd2FyZSBJRCdzICovCisKKyNkZWZpbmUgREVGRUFfUFJPRFVDVF9JRAkweDAwMzBBMzEwCQkvKiBERUMgcHJvZHVjdCAzMDAgKG5vIHJldikJKi8KKyNkZWZpbmUgREVGRUFfUFJPRF9JRF8xCQkweDAxMzBBMzEwCQkvKiBERUMgcHJvZHVjdCAzMDAsIHJldiAxCSovCisjZGVmaW5lIERFRkVBX1BST0RfSURfMgkJMHgwMjMwQTMxMAkJLyogREVDIHByb2R1Y3QgMzAwLCByZXYgMgkqLworI2RlZmluZSBERUZFQV9QUk9EX0lEXzMJCTB4MDMzMEEzMTAJCS8qIERFQyBwcm9kdWN0IDMwMCwgcmV2IDMJKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEaWdpdGFsIFBGSSBTcGVjaWZpY2F0aW9uIHYxLjAgRGVmaW5pdGlvbnMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBQQ0kgQ29uZmlndXJhdGlvbiBTcGFjZSBDb25zdGFudHMgKi8KKworI2RlZmluZSBQRklfS19MQVRfVElNRVJfREVGCQkJMHg4OAkvKiBkZWYgbWF4IG1hc3RlciBsYXRlbmN5IHRpbWVyICovCisjZGVmaW5lIFBGSV9LX0xBVF9USU1FUl9NSU4JCQkweDIwCS8qIG1pbiBtYXggbWFzdGVyIGxhdGVuY3kgdGltZXIgKi8KKyNkZWZpbmUgUEZJX0tfQ1NSX01FTV9MRU4JCQkweDgwCS8qIDEyOCBieXRlcyAqLworI2RlZmluZSBQRklfS19DU1JfSU9fTEVOCQkJMHg4MAkvKiAxMjggYnl0ZXMgKi8KKyNkZWZpbmUgUEZJX0tfUEtUX01FTV9MRU4JCQkweDEwMDAwCS8qIDY0SyBieXRlcyAqLworCisvKiBQRkkgUmVnaXN0ZXIgT2Zmc2V0cyAoc3RhcnRpbmcgYXQgUERRIFJlZ2lzdGVyIEJhc2UgQWRkcmVzcykgKi8KKworI2RlZmluZSBQRklfS19SRUdfUkVTRVJWRURfMAkJIDBYMDAwMDAwMzgKKyNkZWZpbmUgUEZJX0tfUkVHX1JFU0VSVkVEXzEJCSAwWDAwMDAwMDNDCisjZGVmaW5lIFBGSV9LX1JFR19NT0RFX0NUUkwJCSAwWDAwMDAwMDQwCisjZGVmaW5lIFBGSV9LX1JFR19TVEFUVVMJCSAwWDAwMDAwMDQ0CisjZGVmaW5lIFBGSV9LX1JFR19GSUZPX1dSSVRFCQkgMFgwMDAwMDA0OAorI2RlZmluZSBQRklfS19SRUdfRklGT19SRUFECQkgMFgwMDAwMDA0QworCisvKiBQRkkgTW9kZSBDb250cm9sIFJlZ2lzdGVyIENvbnN0YW50cyAqLworCisjZGVmaW5lIFBGSV9NT0RFX01fUkVTRVJWRUQJCSAwWEZGRkZGRkYwCisjZGVmaW5lIFBGSV9NT0RFX01fVEdUX0FCT1JUX0VOQgkgMFgwMDAwMDAwOAorI2RlZmluZSBQRklfTU9ERV9NX1BEUV9JTlRfRU5CCQkgMFgwMDAwMDAwNAorI2RlZmluZSBQRklfTU9ERV9NX1BGSV9JTlRfRU5CCQkgMFgwMDAwMDAwMgorI2RlZmluZSBQRklfTU9ERV9NX0RNQV9FTkIJCSAwWDAwMDAwMDAxCisKKyNkZWZpbmUgUEZJX01PREVfVl9SRVNFUlZFRAkJIDQKKyNkZWZpbmUgUEZJX01PREVfVl9UR1RfQUJPUlRfRU5CCSAzCisjZGVmaW5lIFBGSV9NT0RFX1ZfUERRX0lOVF9FTkIJCSAyCisjZGVmaW5lIFBGSV9NT0RFX1ZfUEZJX0lOVF9FTkIJCSAxCisjZGVmaW5lIFBGSV9NT0RFX1ZfRE1BX0VOQgkJIDAKKworI2RlZmluZSBQRklfTU9ERV9LX0FMTF9ESVNBQkxFCQkgMFgwMDAwMDAwMAorCisvKiBQRkkgU3RhdHVzIFJlZ2lzdGVyIENvbnN0YW50cyAqLworCisjZGVmaW5lIFBGSV9TVEFUVVNfTV9SRVNFUlZFRAkJIDBYRkZGRkZGQzAKKyNkZWZpbmUgUEZJX1NUQVRVU19NX1BGSV9FUlJPUgkJIDBYMDAwMDAwMjAJCS8qIG9ubHkgdmFsaWQgaW4gcmV2IDEgb3IgbGF0ZXIgUEZJICovCisjZGVmaW5lIFBGSV9TVEFUVVNfTV9QRFFfSU5UCQkgMFgwMDAwMDAxMAorI2RlZmluZSBQRklfU1RBVFVTX01fUERRX0RNQV9BQk9SVAkgMFgwMDAwMDAwOAorI2RlZmluZSBQRklfU1RBVFVTX01fRklGT19GVUxMCQkgMFgwMDAwMDAwNAorI2RlZmluZSBQRklfU1RBVFVTX01fRklGT19FTVBUWQkJIDBYMDAwMDAwMDIKKyNkZWZpbmUgUEZJX1NUQVRVU19NX0RNQV9JTl9QUk9HUkVTUwkgMFgwMDAwMDAwMQorCisjZGVmaW5lIFBGSV9TVEFUVVNfVl9SRVNFUlZFRAkJIDYKKyNkZWZpbmUgUEZJX1NUQVRVU19WX1BGSV9FUlJPUgkJIDUJCQkvKiBvbmx5IHZhbGlkIGluIHJldiAxIG9yIGxhdGVyIFBGSSAqLworI2RlZmluZSBQRklfU1RBVFVTX1ZfUERRX0lOVAkJIDQKKyNkZWZpbmUgUEZJX1NUQVRVU19WX1BEUV9ETUFfQUJPUlQJIDMKKyNkZWZpbmUgUEZJX1NUQVRVU19WX0ZJRk9fRlVMTAkJIDIKKyNkZWZpbmUgUEZJX1NUQVRVU19WX0ZJRk9fRU1QVFkJCSAxCisjZGVmaW5lIFBGSV9TVEFUVVNfVl9ETUFfSU5fUFJPR1JFU1MgMAorCisjZGVmaW5lIERGWF9NQVhfRUlTQV9TTE9UUwkJMTYJCQkvKiBtYXhpbXVtIG51bWJlciBvZiBFSVNBIHNsb3RzIHRvIHNjYW4gKi8KKyNkZWZpbmUgREZYX01BWF9OVU1fQk9BUkRTCQk4CQkJLyogbWF4aW11bSBudW1iZXIgb2YgYWRhcHRlcnMgc3VwcG9ydGVkICovCisKKyNkZWZpbmUgREZYX0JVU19UWVBFX1BDSQkJMAkJCS8qIHR5cGUgY29kZSBmb3IgREVDIEZEREljb250cm9sbGVyL1BDSSAqLworI2RlZmluZSBERlhfQlVTX1RZUEVfRUlTQQkJMQkJCS8qIHR5cGUgY29kZSBmb3IgREVDIEZEREljb250cm9sbGVyL0VJU0EgKi8KKworI2RlZmluZSBERlhfRkNfUFJIMl9QUkgxX1BSSDAJCTB4NTQwMDM4MjAJLyogUGFja2V0IFJlcXVlc3QgSGVhZGVyIGJ5dGVzICsgRkMgKi8KKyNkZWZpbmUgREZYX1BSSDBfQllURQkJCTB4MjAJCS8qIFBhY2tldCBSZXF1ZXN0IEhlYWRlciBieXRlIDAgKi8KKyNkZWZpbmUgREZYX1BSSDFfQllURQkJCTB4MzgJCS8qIFBhY2tldCBSZXF1ZXN0IEhlYWRlciBieXRlIDEgKi8KKyNkZWZpbmUgREZYX1BSSDJfQllURQkJCTB4MDAJCS8qIFBhY2tldCBSZXF1ZXN0IEhlYWRlciBieXRlIDIgKi8KKworLyogRHJpdmVyIHJvdXRpbmUgc3RhdHVzIChyZXR1cm4pIGNvZGVzICovCisKKyNkZWZpbmUgREZYX0tfU1VDQ0VTUwkJCTAJCQkvKiByb3V0aW5lIHN1Y2NlZWRlZCAqLworI2RlZmluZSBERlhfS19GQUlMVVJFCQkJMQkJCS8qIHJvdXRpbmUgZmFpbGVkICovCisjZGVmaW5lIERGWF9LX09VVFNUQVRFCQkJMgkJCS8qIGJhZCBzdGF0ZSBmb3IgY29tbWFuZCAqLworI2RlZmluZSBERlhfS19IV19USU1FT1VUCQkzCQkJLyogY29tbWFuZCB0aW1lZCBvdXQgKi8KKworLyogRGVmaW5lIExMQyBob3N0IHJlY2VpdmUgYnVmZmVyIG1pbi9tYXgvZGVmYXVsdCB2YWx1ZXMgKi8KKworI2RlZmluZSBSQ1ZfQlVGU19NSU4JMgkJCQkJLyogbWluaW11bSBwcmUtYWxsb2NhdGVkIHJlY2VpdmUgYnVmZmVycyAqLworI2RlZmluZSBSQ1ZfQlVGU19NQVgJMzIJCQkJCS8qIG1heGltdW0gcHJlLWFsbG9jYXRlZCByZWNlaXZlIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgUkNWX0JVRlNfREVGCTgJCQkJCS8qIGRlZmF1bHQgcHJlLWFsbG9jYXRlZCByZWNlaXZlIGJ1ZmZlcnMgKi8KKworLyogRGVmaW5lIG9mZnNldHMgaW50byBGRERJIExMQyBvciBTTVQgcmVjZWl2ZSBmcmFtZSBidWZmZXJzIC0gdXNlZCB3aGVuIGluZGljYXRpbmcgZnJhbWVzICovCisKKyNkZWZpbmUgUkNWX0JVRkZfS19ERVNDUgkwCQkJCS8qIGZvdXIgYnl0ZSBGTUMgZGVzY3JpcHRvciAqLworI2RlZmluZSBSQ1ZfQlVGRl9LX1BBRERJTkcJNAkJCQkvKiB0aHJlZSBudWxsIGJ5dGVzICovCisjZGVmaW5lIFJDVl9CVUZGX0tfRkMJCTcJCQkJLyogb25lIGJ5dGUgZnJhbWUgY29udHJvbCAqLworI2RlZmluZSBSQ1ZfQlVGRl9LX0RBCQk4CQkJCS8qIHNpeCBieXRlIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKyNkZWZpbmUgUkNWX0JVRkZfS19TQQkJMTQJCQkJLyogc2l4IGJ5dGUgc291cmNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUkNWX0JVRkZfS19EQVRBCQkyMAkJCQkvKiBvZmZzZXQgdG8gc3RhcnQgb2YgcGFja2V0IGRhdGEgKi8KKworLyogRGVmaW5lIG9mZnNldHMgaW50byBGRERJIExMQyB0cmFuc21pdCBmcmFtZSBidWZmZXJzIC0gdXNlZCB3aGVuIHNlbmRpbmcgZnJhbWVzICovCisKKyNkZWZpbmUgWE1UX0JVRkZfS19GQwkJMAkJCQkvKiBvbmUgYnl0ZSBmcmFtZSBjb250cm9sICovCisjZGVmaW5lIFhNVF9CVUZGX0tfREEJCTEJCQkJLyogc2l4IGJ5dGUgZGVzdGluYXRpb24gYWRkcmVzcyAqLworI2RlZmluZSBYTVRfQlVGRl9LX1NBCQk3CQkJCS8qIHNpeCBieXRlIHNvdXJjZSBhZGRyZXNzICovCisjZGVmaW5lIFhNVF9CVUZGX0tfREFUQQkJMTMJCQkJLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIHBhY2tldCBkYXRhICovCisKKy8qIE1hY3JvIGZvciBjaGVja2luZyBhICJ2YWx1ZSIgaXMgd2l0aGluIGEgc3BlY2lmaWMgcmFuZ2UgKi8KKworI2RlZmluZSBJTl9SQU5HRSh2YWx1ZSxsb3csaGlnaCkgKCh2YWx1ZSA+PSBsb3cpICYmICh2YWx1ZSA8PSBoaWdoKSkKKworLyogT25seSBleGVjdXRlIHNwZWNpYWwgcHJpbnQgY2FsbCB3aGVuIGRlYnVnIGRyaXZlciB3YXMgYnVpbHQgKi8KKworI2lmZGVmIERFRlhYX0RFQlVHCisjZGVmaW5lIERCR19wcmludGsoYXJncy4uLikgcHJpbnRrKCMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBEQkdfcHJpbnRrKGFyZ3MuLi4pCisjZW5kaWYKKworLyogRGVmaW5lIGNvbnN0YW50cyBmb3IgbWFza2luZy91bm1hc2tpbmcgaW50ZXJydXB0cyAqLworCisjZGVmaW5lIERGWF9NQVNLX0lOVEVSUlVQVFMJCTEKKyNkZWZpbmUgREZYX1VOTUFTS19JTlRFUlJVUFRTCQkwCisKKy8qIERlZmluZSBzdHJ1Y3R1cmUgZm9yIGRyaXZlciB0cmFuc21pdCBkZXNjcmlwdG9yIGJsb2NrICovCisKK3R5cGVkZWYgc3RydWN0CisJeworCXN0cnVjdCBza19idWZmCSpwX3NrYjsJCQkJCS8qIHB0ciB0byBza2IgKi8KKwl9IFhNVF9EUklWRVJfREVTQ1I7CisKK3R5cGVkZWYgc3RydWN0IERGWF9ib2FyZF90YWcKKwl7CisJLyogS2VlcCB2aXJ0dWFsIGFuZCBwaHlzaWNhbCBwb2ludGVycyB0byBsb2NrZWQsIHBoeXNpY2FsbHkgY29udGlndW91cyBtZW1vcnkgKi8KKworCWNoYXIJCQkJKmttYWxsb2NlZDsJCQkJCS8qIHBjaV9mcmVlX2NvbnNpc3RlbnQgdGhpcyBvbiB1bmxvYWQgKi8gCisJZG1hX2FkZHJfdAkJCWttYWxsb2NlZF9kbWE7CisJLyogRE1BIGhhbmRsZSBmb3IgdGhlIGFib3ZlICovCisJUElfREVTQ1JfQkxPQ0sJCQkqZGVzY3JfYmxvY2tfdmlydDsJCQkJLyogUERRIGRlc2NyaXB0b3IgYmxvY2sgdmlydCBhZGRyZXNzICovCisJZG1hX2FkZHJfdAkJCWRlc2NyX2Jsb2NrX3BoeXM7CQkJCS8qIFBEUSBkZXNjcmlwdG9yIGJsb2NrIHBoeXMgYWRkcmVzcyAqLworCVBJX0RNQV9DTURfUkVRCQkJKmNtZF9yZXFfdmlydDsJCQkJCS8qIENvbW1hbmQgcmVxdWVzdCBidWZmZXIgdmlydCBhZGRyZXNzICovCisJZG1hX2FkZHJfdAkJCWNtZF9yZXFfcGh5czsJCQkJCS8qIENvbW1hbmQgcmVxdWVzdCBidWZmZXIgcGh5cyBhZGRyZXNzICovCisJUElfRE1BX0NNRF9SU1AJCQkqY21kX3JzcF92aXJ0OwkJCQkJLyogQ29tbWFuZCByZXNwb25zZSBidWZmZXIgdmlydCBhZGRyZXNzICovCisJZG1hX2FkZHJfdAkJCWNtZF9yc3BfcGh5czsJCQkJCS8qIENvbW1hbmQgcmVzcG9uc2UgYnVmZmVyIHBoeXMgYWRkcmVzcyAqLworCWNoYXIJCQkJKnJjdl9ibG9ja192aXJ0OwkJCQkvKiBMTEMgaG9zdCByZWNlaXZlIHF1ZXVlIGJ1ZiBibGsgdmlydCAqLworCWRtYV9hZGRyX3QJCQlyY3ZfYmxvY2tfcGh5czsJCQkJCS8qIExMQyBob3N0IHJlY2VpdmUgcXVldWUgYnVmIGJsayBwaHlzICovCisJUElfQ09OU1VNRVJfQkxPQ0sJCSpjb25zX2Jsb2NrX3ZpcnQ7CQkJCS8qIFBEUSBjb25zdW1lciBibG9jayB2aXJ0IGFkZHJlc3MgKi8KKwlkbWFfYWRkcl90CQkJY29uc19ibG9ja19waHlzOwkJCQkvKiBQRFEgY29uc3VtZXIgYmxvY2sgcGh5cyBhZGRyZXNzICovCisKKwkvKiBLZWVwIGxvY2FsIGNvcGllcyBvZiBUeXBlIDEgYW5kIFR5cGUgMiByZWdpc3RlciBkYXRhICovCisKKwlQSV9UWVBFXzFfUFJPRF9SRUcJCWNtZF9yZXFfcmVnOwkJCQkJLyogQ29tbWFuZCBSZXF1ZXN0IHJlZ2lzdGVyICovCisJUElfVFlQRV8xX1BST0RfUkVHCQljbWRfcnNwX3JlZzsJCQkJCS8qIENvbW1hbmQgUmVzcG9uc2UgcmVnaXN0ZXIgKi8KKwlQSV9UWVBFXzJfUFJPRF9SRUcJCXJjdl94bXRfcmVnOwkJCQkJLyogVHlwZSAyIChSQ1YvWE1UKSByZWdpc3RlciAqLworCisJLyogU3RvcmFnZSBmb3IgdW5pY2FzdCBhbmQgbXVsdGljYXN0IGFkZHJlc3MgZW50cmllcyBpbiBhZGFwdGVyIENBTSAqLworCisJdTgJCQkJdWNfdGFibGVbMSpGRERJX0tfQUxFTl07CisJdTMyCQkJCXVjX2NvdW50OwkJCQkJCS8qIG51bWJlciBvZiB1bmljYXN0IGFkZHJlc3NlcyAqLworCXU4CQkJCW1jX3RhYmxlW1BJX0NNRF9BRERSX0ZJTFRFUl9LX1NJWkUqRkRESV9LX0FMRU5dOworCXUzMgkJCQltY19jb3VudDsJCQkJCQkvKiBudW1iZXIgb2YgbXVsdGljYXN0IGFkZHJlc3NlcyAqLworCisJLyogQ3VycmVudCBwYWNrZXQgZmlsdGVyIHNldHRpbmdzICovCisKKwl1MzIJCQkJaW5kX2dyb3VwX3Byb207CQkJCQkvKiBMTEMgaW5kaXZpZHVhbCAmIGdyb3VwIGZyYW1lIHByb20gbW9kZSAqLworCXUzMgkJCQlncm91cF9wcm9tOwkJCQkJLyogTExDIGdyb3VwIChtdWx0aWNhc3QpIGZyYW1lIHByb20gbW9kZSAqLworCisJLyogTGluayBhdmFpbGFibGUgZmxhZyBuZWVkZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gZHJvcCBvdXRnb2luZyBwYWNrZXQgcmVxdWVzdHMgKi8KKworCXUzMgkJCQlsaW5rX2F2YWlsYWJsZTsJCQkJCS8qIGlzIGxpbmsgYXZhaWxhYmxlPyAqLworCisJLyogUmVzb3VyY2VzIHRvIGluZGljYXRlIHJlc2V0IHR5cGUgd2hlbiByZXNldHRpbmcgYWRhcHRlciAqLworCisJdTMyCQkJCXJlc2V0X3R5cGU7CQkJCQkvKiBza2lwIG9yIHJlcnVuIGRpYWdub3N0aWNzICovCisKKwkvKiBTdG9yZSBwb2ludGVycyB0byByZWNlaXZlIGJ1ZmZlcnMgZm9yIHF1ZXVlIHByb2Nlc3NpbmcgY29kZSAqLworCisJY2hhcgkJCQkqcF9yY3ZfYnVmZl92YVtQSV9SQ1ZfREFUQV9LX05VTV9FTlRSSUVTXTsKKworCS8qIFN0b3JlIHBvaW50ZXJzIHRvIHRyYW5zbWl0IGJ1ZmZlcnMgZm9yIHRyYW5zbWl0IGNvbXBsZXRpb24gY29kZSAqLworCisJWE1UX0RSSVZFUl9ERVNDUgkJeG10X2Rydl9kZXNjcl9ibGtbUElfWE1UX0RBVEFfS19OVU1fRU5UUklFU107CisJCisJLyogVHJhbnNtaXQgc3BpbmxvY2tzICovCisJCisJc3BpbmxvY2tfdAkJCWxvY2s7CisKKwkvKiBTdG9yZSBkZXZpY2UsIGJ1cy1zcGVjaWZpYywgYW5kIHBhcmFtZXRlciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBhZGFwdGVyICovCisKKwlzdHJ1Y3QgbmV0X2RldmljZQkJKmRldjsJCQkJCQkvKiBwb2ludGVyIHRvIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZQkJKm5leHQ7CisJdTMyCQkJCWJ1c190eXBlOwkJCQkJLyogYnVzIHR5cGUgKDAgPT0gUENJLCAxID09IEVJU0EpICovCisJdTE2CQkJCWJhc2VfYWRkcjsJCQkJCS8qIGJhc2UgSS9PIGFkZHJlc3MgKHNhbWUgYXMgZGV2LT5iYXNlX2FkZHIpICovCisJc3RydWN0IHBjaV9kZXYgKgkJcGNpX2RldjsKKwl1MzIJCQkJZnVsbF9kdXBsZXhfZW5iOwkJCQkvKiBGRERJIEZ1bGwgRHVwbGV4IGVuYWJsZSAoMSA9PSBvbiwgMiA9PSBvZmYpICovCisJdTMyCQkJCXJlcV90dHJ0OwkJCQkJLyogcmVxdWVzdGVkIFRUUlQgdmFsdWUgKGluIDgwbnMgdW5pdHMpICovCisJdTMyCQkJCWJ1cnN0X3NpemU7CQkJCQkvKiBhZGFwdGVyIGJ1cnN0IHNpemUgKGVudW1lcmF0ZWQpICovCisJdTMyCQkJCXJjdl9idWZzX3RvX3Bvc3Q7CQkJCS8qIHJlY2VpdmUgYnVmZmVycyB0byBwb3N0IGZvciBMTEMgaG9zdCBxdWV1ZSAqLworCXU4CQkJCWZhY3RvcnlfbWFjX2FkZHJbRkRESV9LX0FMRU5dOwkJCS8qIGZhY3RvcnkgKG9uLWJvYXJkKSBNQUMgYWRkcmVzcyAqLworCisJLyogQ29tbW9uIEZEREkgc3RhdGlzdGljcyBzdHJ1Y3R1cmUgYW5kIHByaXZhdGUgY291bnRlcnMgKi8KKworCXN0cnVjdCBmZGRpX3N0YXRpc3RpY3MJc3RhdHM7CisKKwl1MzIJCQkJcmN2X2Rpc2NhcmRzOworCXUzMgkJCQlyY3ZfY3JjX2Vycm9yczsKKwl1MzIJCQkJcmN2X2ZyYW1lX3N0YXR1c19lcnJvcnM7CisJdTMyCQkJCXJjdl9sZW5ndGhfZXJyb3JzOworCXUzMgkJCQlyY3ZfdG90YWxfZnJhbWVzOworCXUzMgkJCQlyY3ZfbXVsdGljYXN0X2ZyYW1lczsKKwl1MzIJCQkJcmN2X3RvdGFsX2J5dGVzOworCisJdTMyCQkJCXhtdF9kaXNjYXJkczsKKwl1MzIJCQkJeG10X2xlbmd0aF9lcnJvcnM7CisJdTMyCQkJCXhtdF90b3RhbF9mcmFtZXM7CisJdTMyCQkJCXhtdF90b3RhbF9ieXRlczsKKwl9IERGWF9ib2FyZF90OworCisjZW5kaWYJLyogI2lmbmRlZiBfREVGWFhfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlcGNhLmMgYi9kcml2ZXJzL25ldC9kZXBjYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YWE1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kZXBjYS5jCkBAIC0wLDAgKzEsMjEyMiBAQAorLyogIGRlcGNhLmM6IEEgRElHSVRBTCBERVBDQSAmIEV0aGVyV09SS1MgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eC4KKworICAgIFdyaXR0ZW4gMTk5NCwgMTk5NSBieSBEYXZpZCBDLiBEYXZpZXMuCisKKworICAgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAxOTk0IERhdmlkIEMuIERhdmllcworCQkgICAgICAgICAgICAgICAgICAgYW5kIAorCQkJIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudAorCSAoYXMgcmVwcmVzZW50ZWQgYnkgdGhlIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kpLiAgCisKKyAgICAgICAgICAgICAgIENvcHlyaWdodCAxOTk1ICBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbi4KKworCisgICAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorICAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKyAgICBUaGlzIGRyaXZlciBpcyB3cml0dGVuIGZvciB0aGUgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24gc2VyaWVzCisgICAgb2YgREVQQ0EgYW5kIEV0aGVyV09SS1MgZXRoZXJuZXQgY2FyZHM6CisKKyAgICAgICAgREVQQ0EgICAgICAgKHRoZSBvcmlnaW5hbCkKKyAgICAJREUxMDAKKyAgICAJREUxMDEKKwlERTIwMCBUdXJibworCURFMjAxIFR1cmJvCisJREUyMDIgVHVyYm8gKFRQIEJOQykKKwlERTIxMAorCURFNDIyICAgICAgIChFSVNBKQorCisgICAgVGhlICBkcml2ZXIgaGFzIGJlZW4gdGVzdGVkIG9uIERFMTAwLCBERTIwMCBhbmQgREUyMDIgY2FyZHMgIGluICBhCisgICAgcmVsYXRpdmVseSBidXN5IG5ldHdvcmsuIFRoZSBERTQyMiBoYXMgYmVlbiB0ZXN0ZWQgYSBsaXR0bGUuCisKKyAgICBUaGlzICBkcml2ZXIgd2lsbCBOT1Qgd29yayAgIGZvciB0aGUgREUyMDMsICBERTIwNCAgYW5kIERFMjA1IHNlcmllcyAgb2YKKyAgICBjYXJkcywgIHNpbmNlIHRoZXkgaGF2ZSAgYSAgbmV3IGN1c3RvbSBBU0lDIGluICAgcGxhY2Ugb2YgdGhlIEFNRCAgTEFOQ0UKKyAgICBjaGlwLiAgU2VlIHRoZSAnZXdyazMuYycgICBkcml2ZXIgaW4gdGhlICBMaW51eCAgc291cmNlIHRyZWUgZm9yIHJ1bm5pbmcKKyAgICB0aG9zZSBjYXJkcy4KKworICAgIEkgaGF2ZSBiZW5jaG1hcmtlZCB0aGUgZHJpdmVyIHdpdGggYSAgREUxMDAgYXQgNTk1a0IvcyB0byAoNTQya0IvcyBmcm9tKQorICAgIGEgREVDc3RhdGlvbiA1MDAwLzIwMC4KKworICAgIFRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXQgZGF2aWVzQG1hbmlhYy51bHRyYW5ldC5jb20KKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoZSAgZHJpdmVyIHdhcyBvcmlnaW5hbGx5IGJhc2VkICBvbiAgIHRoZSAnbGFuY2UuYycgZHJpdmVyIGZyb20gIERvbmFsZAorICAgIEJlY2tlciAgIHdoaWNoICBpcyBpbmNsdWRlZCB3aXRoICB0aGUgIHN0YW5kYXJkICBkcml2ZXIgZGlzdHJpYnV0aW9uIGZvcgorICAgIGxpbnV4LiAgVjAuNCAgaXMgIGEgY29tcGxldGUgIHJlLXdyaXRlICB3aXRoIG9ubHkgIHRoZSBrZXJuZWwgIGludGVyZmFjZQorICAgIHJlbWFpbmluZyBmcm9tIHRoZSBvcmlnaW5hbCBjb2RlLgorCisgICAgMSkgTGFuY2UuYyBjb2RlIGluIC9saW51eC9kcml2ZXJzL25ldC8KKyAgICAyKSAiRXRoZXJuZXQvSUVFRSA4MDIuMyBGYW1pbHkuIDE5OTIgV29ybGQgTmV0d29yayBEYXRhIEJvb2svSGFuZGJvb2siLAorICAgICAgIEFNRCwgMTk5MiBbKDgwMCkgMjIyLTkzMjNdLgorICAgIDMpICJBbTc5QzkwIENNT1MgTG9jYWwgQXJlYSBOZXR3b3JrIENvbnRyb2xsZXIgZm9yIEV0aGVybmV0IChDLUxBTkNFKSIsCisgICAgICAgQU1ELCBQdWIuICMxNzg4MSwgTWF5IDE5OTMuCisgICAgNCkgIkFtNzlDOTYwIFBDbmV0LUlTQSh0bSksIFNpbmdsZS1DaGlwIEV0aGVybmV0IENvbnRyb2xsZXIgZm9yIElTQSIsCisgICAgICAgQU1ELCBQdWIuICMxNjkwNywgTWF5IDE5OTIKKyAgICA1KSAiREVDIEV0aGVyV09SS1MgTEMgRXRoZXJuZXQgQ29udHJvbGxlciBPd25lcnMgTWFudWFsIiwKKyAgICAgICBEaWdpdGFsIEVxdWlwbWVudCBjb3Jwb3JhdGlvbiwgMTk5MCwgUHViLiAjRUstREUxMDAtT00uMDAzCisgICAgNikgIkRFQyBFdGhlcldPUktTIFR1cmJvIEV0aGVybmV0IENvbnRyb2xsZXIgT3duZXJzIE1hbnVhbCIsCisgICAgICAgRGlnaXRhbCBFcXVpcG1lbnQgY29ycG9yYXRpb24sIDE5OTAsIFB1Yi4gI0VLLURFMjAwLU9NLjAwMworICAgIDcpICJERVBDQSBIYXJkd2FyZSBSZWZlcmVuY2UgTWFudWFsIiwgUHViLiAjRUstREVQQ0EtUFIKKyAgICAgICBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwgMTk4OQorICAgIDgpICJERUMgRXRoZXJXT1JLUyBUdXJib18oVFAgQk5DKSBFdGhlcm5ldCBDb250cm9sbGVyIE93bmVycyBNYW51YWwiLAorICAgICAgIERpZ2l0YWwgRXF1aXBtZW50IGNvcnBvcmF0aW9uLCAxOTkxLCBQdWIuICNFSy1ERTIwMi1PTS4wMDEKKyAgICAKKworICAgIFBldGVyIEJhdWVyJ3MgZGVwY2EuYyAoVjAuNSkgd2FzIHJlZmVycmVkIHRvIHdoZW4gZGVidWdnaW5nIFYwLjEgb2YgdGhpcworICAgIGRyaXZlci4KKworICAgIFRoZSBvcmlnaW5hbCBERVBDQSAgY2FyZCByZXF1aXJlcyB0aGF0IHRoZSAgZXRoZXJuZXQgUk9NIGFkZHJlc3MgY291bnRlcgorICAgIGJlIGVuYWJsZWQgdG8gY291bnQgYW5kIGhhcyBhbiA4IGJpdCBOSUNTUi4gIFRoZSBST00gY291bnRlciBlbmFibGluZyBpcworICAgIG9ubHkgIGRvbmUgd2hlbiBhICAweDA4IGlzIHJlYWQgYXMgdGhlICBmaXJzdCBhZGRyZXNzIG9jdGV0ICh0byBtaW5pbWlzZQorICAgIHRoZSBjaGFuY2VzICBvZiB3cml0aW5nIG92ZXIgc29tZSAgb3RoZXIgaGFyZHdhcmUncyAgSS9PIHJlZ2lzdGVyKS4gIFRoZQorICAgIE5JQ1NSIGFjY2Vzc2VzICAgaGF2ZSBiZWVuIGNoYW5nZWQgIHRvICBieXRlIGFjY2Vzc2VzICBmb3IgYWxsIHRoZSBjYXJkcworICAgIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciwgc2luY2UgdGhlcmUgaXMgb25seSBvbmUgIHVzZWZ1bCBiaXQgaW4gdGhlIE1TQgorICAgIChyZW1vdGUgYm9vdCB0aW1lb3V0KSBhbmQgaXQgIGlzIG5vdCB1c2VkLiAgQWxzbywgdGhlcmUgIGlzIGEgbWF4aW11bSBvZgorICAgIG9ubHkgNDhrQiBuZXR3b3JrICBSQU0gZm9yIHRoaXMgIGNhcmQuICBNeSB0aGFua3MgIHRvIFRvcmJqb3JuIExpbmRoIGZvcgorICAgIGhlbHAgZGVidWdnaW5nIGFsbCB0aGlzIChhbmQgaG9sZGluZyBteSBmZWV0IHRvICB0aGUgZmlyZSB1bnRpbCBJIGdvdCBpdAorICAgIHJpZ2h0KS4KKworICAgIFRoZSBERTIwMCAgc2VyaWVzICBib2FyZHMgaGF2ZSAgb24tYm9hcmQgNjRrQiAgUkFNIGZvciAgdXNlICBhcyBhIHNoYXJlZAorICAgIG1lbW9yeSBuZXR3b3JrICBidWZmZXIuIE9ubHkgdGhlIERFMTAwICBjYXJkcyBtYWtlIHVzZSAgb2YgYSAgMmtCIGJ1ZmZlcgorICAgIG1vZGUgd2hpY2ggaGFzIG5vdCAgYmVlbiBpbXBsZW1lbnRlZCBpbiAgdGhpcyBkcml2ZXIgKG9ubHkgdGhlIDMya0IgIGFuZAorICAgIDY0a0IgbW9kZXMgYXJlIHN1cHBvcnRlZCBbMTZrQi80OGtCIGZvciB0aGUgb3JpZ2luYWwgREVQQ0FdKS4KKworICAgIEF0IHRoZSBtb3N0IG9ubHkgMiBERVBDQSBjYXJkcyBjYW4gIGJlIHN1cHBvcnRlZCBvbiAgdGhlIElTQSBidXMgYmVjYXVzZQorICAgIHRoZXJlIGlzIG9ubHkgcHJvdmlzaW9uICBmb3IgdHdvIEkvTyBiYXNlIGFkZHJlc3NlcyAgb24gZWFjaCBjYXJkICgweDMwMAorICAgIGFuZCAweDIwMCkuIFRoZSBJL08gYWRkcmVzcyBpcyBkZXRlY3RlZCBieSBzZWFyY2hpbmcgZm9yIGEgYnl0ZSBzZXF1ZW5jZQorICAgIGluIHRoZSBFdGhlcm5ldCBzdGF0aW9uIGFkZHJlc3MgUFJPTSBhdCB0aGUgZXhwZWN0ZWQgSS9PIGFkZHJlc3MgZm9yIHRoZQorICAgIEV0aGVybmV0ICBQUk9NLiAgIFRoZSBzaGFyZWQgbWVtb3J5ICBiYXNlICAgYWRkcmVzcyAgaXMgJ2F1dG9wcm9iZWQnICBieQorICAgIGxvb2tpbmcgIGZvciB0aGUgc2VsZiAgdGVzdCBQUk9NICBhbmQgZGV0ZWN0aW5nIHRoZSAgY2FyZCBuYW1lLiAgIFdoZW4gYQorICAgIHNlY29uZCAgREVQQ0EgaXMgIGRldGVjdGVkLCAgaW5mb3JtYXRpb24gIGlzICAgcGxhY2VkIGluIHRoZSAgIGJhc2VfYWRkcgorICAgIHZhcmlhYmxlIG9mIHRoZSAgbmV4dCBkZXZpY2Ugc3RydWN0dXJlICh3aGljaCAgaXMgY3JlYXRlZCBpZiBuZWNlc3NhcnkpLAorICAgIHRodXMgIGVuYWJsaW5nIGV0aGlmX3Byb2JlICBpbml0aWFsaXphdGlvbiAgZm9yIHRoZSBkZXZpY2UuICBNb3JlIHRoYW4gMgorICAgIEVJU0EgY2FyZHMgY2FuICBiZSAgc3VwcG9ydGVkLCBidXQgIGNhcmUgd2lsbCAgYmUgIG5lZWRlZCBhc3NpZ25pbmcgIHRoZQorICAgIHNoYXJlZCBtZW1vcnkgdG8gZW5zdXJlIHRoYXQgZWFjaCBzbG90IGhhcyB0aGUgIGNvcnJlY3QgSVJRLCBJL08gYWRkcmVzcworICAgIGFuZCBzaGFyZWQgbWVtb3J5IGFkZHJlc3MgYXNzaWduZWQuCisKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgIE5PVEU6IElmIHlvdSBhcmUgdXNpbmcgdHdvICBJU0EgREVQQ0FzLCBpdCBpcyAgaW1wb3J0YW50IHRoYXQgeW91IGFzc2lnbgorICAgIHRoZSBiYXNlIG1lbW9yeSBhZGRyZXNzZXMgY29ycmVjdGx5LiAgIFRoZSAgZHJpdmVyIGF1dG9wcm9iZXMgSS9PICAweDMwMAorICAgIHRoZW4gMHgyMDAuICBUaGUgIGJhc2UgbWVtb3J5IGFkZHJlc3MgZm9yICB0aGUgZmlyc3QgZGV2aWNlIG11c3QgYmUgbGVzcworICAgIHRoYW4gdGhhdCBvZiB0aGUgc2Vjb25kIHNvIHRoYXQgdGhlIGF1dG8gcHJvYmUgd2lsbCBjb3JyZWN0bHkgYXNzaWduIHRoZQorICAgIEkvTyBhbmQgbWVtb3J5IGFkZHJlc3NlcyBvbiB0aGUgc2FtZSBjYXJkLiAgSSBjYW4ndCB0aGluayBvZiBhIHdheSB0byBkbworICAgIHRoaXMgdW5hbWJpZ3VvdXNseSBhdCB0aGUgbW9tZW50LCBzaW5jZSB0aGVyZSBpcyBub3RoaW5nIG9uIHRoZSBjYXJkcyB0bworICAgIHRpZSBJL08gYW5kIG1lbW9yeSBpbmZvcm1hdGlvbiB0b2dldGhlci4KKworICAgIEkgYW0gdW5hYmxlICB0byAgdGVzdCAgMiBjYXJkcyAgIHRvZ2V0aGVyIGZvciBub3csICAgIHNvIHRoaXMgIGNvZGUgICBpcworICAgIHVuY2hlY2tlZC4gQWxsIHJlcG9ydHMsIGdvb2Qgb3IgYmFkLCBhcmUgd2VsY29tZS4KKworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgVGhlIGJvYXJkIElSUSAgIHNldHRpbmcgbXVzdCBiZSAgYXQgYW4gIHVudXNlZCBJUlEgd2hpY2ggIGlzIGF1dG8tcHJvYmVkCisgICAgdXNpbmcgRG9uYWxkIEJlY2tlcidzIGF1dG9wcm9iZSByb3V0aW5lcy4gREVQQ0EgYW5kIERFMTAwIGJvYXJkIElSUXMgYXJlCisgICAgezIsMyw0LDUsN30sIHdoZXJlYXMgdGhlICBERTIwMCBpcyBhdCB7NSw5LDEwLDExLDE1fS4gIE5vdGUgdGhhdCBJUlEyIGlzCisgICAgcmVhbGx5IElSUTkgaW4gbWFjaGluZXMgd2l0aCAxNiBJUlEgbGluZXMuCisKKyAgICBObyAxNk1CIG1lbW9yeSAgbGltaXRhdGlvbiBzaG91bGQgZXhpc3Qgd2l0aCB0aGlzICBkcml2ZXIgYXMgRE1BIGlzICBub3QKKyAgICB1c2VkIGFuZCB0aGUgY29tbW9uIG1lbW9yeSBhcmVhIGlzIGluIGxvdyBtZW1vcnkgb24gdGhlIG5ldHdvcmsgY2FyZCAobXkKKyAgICBjdXJyZW50IHN5c3RlbSBoYXMgMjBNQiBhbmQgSSd2ZSBub3QgaGFkIHByb2JsZW1zIHlldCkuCisKKyAgICBUaGUgYWJpbGl0eSB0byBsb2FkIHRoaXMgZHJpdmVyIGFzIGEgbG9hZGFibGUgbW9kdWxlIGhhcyBiZWVuIGFkZGVkLiBUbworICAgIHV0aWxpc2UgdGhpcyBhYmlsaXR5LCB5b3UgaGF2ZSB0byBkbyA8OCB0aGluZ3M6CisKKyAgICAwKSBoYXZlIGEgY29weSBvZiB0aGUgbG9hZGFibGUgbW9kdWxlcyBjb2RlIGluc3RhbGxlZCBvbiB5b3VyIHN5c3RlbS4KKyAgICAxKSBjb3B5IGRlcGNhLmMgZnJvbSB0aGUgIC9saW51eC9kcml2ZXJzL25ldCBkaXJlY3RvcnkgdG8geW91ciBmYXZvdXJpdGUKKyAgICB0ZW1wb3JhcnkgZGlyZWN0b3J5LgorICAgIDIpIGlmIHlvdSB3aXNoLCBlZGl0IHRoZSAgc291cmNlIGNvZGUgbmVhciAgbGluZSAxNTMwIHRvIHJlZmxlY3QgdGhlIEkvTworICAgIGFkZHJlc3MgYW5kIElSUSB5b3UncmUgdXNpbmcgKHNlZSBhbHNvIDUpLgorICAgIDMpIGNvbXBpbGUgIGRlcGNhLmMsIGJ1dCBpbmNsdWRlIC1ETU9EVUxFIGluICB0aGUgY29tbWFuZCBsaW5lIHRvIGVuc3VyZQorICAgIHRoYXQgdGhlIGNvcnJlY3QgYml0cyBhcmUgY29tcGlsZWQgKHNlZSBlbmQgb2Ygc291cmNlIGNvZGUpLgorICAgIDQpIGlmIHlvdSBhcmUgd2FudGluZyB0byBhZGQgYSBuZXcgIGNhcmQsIGdvdG8gNS4gT3RoZXJ3aXNlLCByZWNvbXBpbGUgYQorICAgIGtlcm5lbCB3aXRoIHRoZSBkZXBjYSBjb25maWd1cmF0aW9uIHR1cm5lZCBvZmYgYW5kIHJlYm9vdC4KKyAgICA1KSBpbnNtb2QgZGVwY2EubyBbaXJxPTddIFtpbz0weDIwMF0gW21lbT0weGQwMDAwXSBbYWRhcHRlcl9uYW1lPURFMTAwXQorICAgICAgIFtBbGFuIENveDogQ2hhbmdlZCB0aGUgY29kZSB0byBhbGxvdyBjb21tYW5kIGxpbmUgaXJxL2lvIGFzc2lnbm1lbnRzXQorICAgICAgIFtEYXZlIERhdmllczogQ2hhbmdlZCB0aGUgY29kZSB0byBhbGxvdyBjb21tYW5kIGxpbmUgbWVtL25hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25tZW50c10KKyAgICA2KSBydW4gdGhlIG5ldCBzdGFydHVwIGJpdHMgZm9yIHlvdXIgZXRoPz8gaW50ZXJmYWNlIG1hbnVhbGx5IAorICAgICh1c3VhbGx5IC9ldGMvcmMuaW5ldFsxMl0gYXQgYm9vdCB0aW1lKS4gCisgICAgNykgZW5qb3khCisKKyAgICBOb3RlIHRoYXQgYXV0b3Byb2JpbmcgaXMgbm90IGFsbG93ZWQgaW4gbG9hZGFibGUgbW9kdWxlcyAtIHRoZSBzeXN0ZW0gaXMKKyAgICBhbHJlYWR5IHVwIGFuZCBydW5uaW5nIGFuZCB5b3UncmUgbWVzc2luZyB3aXRoIGludGVycnVwdHMuCisKKyAgICBUbyB1bmxvYWQgYSBtb2R1bGUsIHR1cm4gb2ZmIHRoZSBhc3NvY2lhdGVkIGludGVyZmFjZSAKKyAgICAnaWZjb25maWcgZXRoPz8gZG93bicgdGhlbiAncm1tb2QgZGVwY2EnLgorCisgICAgVG8gYXNzaWduIGEgYmFzZSBtZW1vcnkgYWRkcmVzcyBmb3IgdGhlIHNoYXJlZCBtZW1vcnkgIHdoZW4gcnVubmluZyBhcyBhCisgICAgbG9hZGFibGUgbW9kdWxlLCBzZWUgNSBhYm92ZS4gIFRvIGluY2x1ZGUgdGhlIGFkYXB0ZXIgIG5hbWUgKGlmIHlvdSBoYXZlCisgICAgbm8gUFJPTSAgYnV0IGtub3cgdGhlIGNhcmQgbmFtZSkgIGFsc28gc2VlIDUgIGFib3ZlLiBOb3RlIHRoYXQgdGhpcyBsYXN0CisgICAgb3B0aW9uICB3aWxsIG5vdCB3b3JrICB3aXRoIGtlcm5lbCAgYnVpbHQtaW4gIGRlcGNhJ3MuIAorCisgICAgVGhlIHNoYXJlZCBtZW1vcnkgYXNzaWdubWVudCBmb3IgYSBsb2FkYWJsZSBtb2R1bGUgIG1ha2VzIHNlbnNlIHRvIGF2b2lkCisgICAgdGhlICdtZW1vcnkgYXV0b3Byb2JlJyBwaWNraW5nIHRoZSB3cm9uZyBzaGFyZWQgbWVtb3J5ICAoZm9yIHRoZSBjYXNlIG9mCisgICAgMiBkZXBjYSdzIGluIGEgUEMpLgorCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgU3VwcG9ydCBmb3IgTUNBIEV0aGVyV09SS1MgY2FyZHMgYWRkZWQgMTEtMy05OC4KKyAgICBWZXJpZmllZCB0byB3b3JrIHdpdGggdXAgdG8gMiBERTIxMiBjYXJkcyBpbiBhIHN5c3RlbSAoYWx0aG91Z2ggbm90CisgICAgICBmdWxseSBzdHJlc3MtdGVzdGVkKS4gIAorCisgICAgQ3VycmVudGx5IGtub3duIGJ1Z3MvbGltaXRhdGlvbnM6CisKKyAgICBOb3RlOiAgd2l0aCB0aGUgTUNBIHN0dWZmIGFzIGEgbW9kdWxlLCBpdCB0cnVzdHMgdGhlIE1DQSBjb25maWd1cmF0aW9uLAorICAgICAgICAgICBub3QgdGhlIGNvbW1hbmQgbGluZSBmb3IgSVJRIGFuZCBtZW1vcnkgYWRkcmVzcy4gIFlvdSBjYW4KKyAgICAgICAgICAgc3BlY2lmeSB0aGVtIGlmIHlvdSB3YW50LCBidXQgaXQgd2lsbCB0aHJvdyB5b3VyIHZhbHVlcyBvdXQuCisgICAgICAgICAgIFlvdSBzdGlsbCBoYXZlIHRvIHBhc3MgdGhlIElPIGFkZHJlc3MgaXQgd2FzIGNvbmZpZ3VyZWQgYXMKKyAgICAgICAgICAgdGhvdWdoLgorCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgVE8gRE86CisgICAgLS0tLS0tCisKKworICAgIFJldmlzaW9uIEhpc3RvcnkKKyAgICAtLS0tLS0tLS0tLS0tLS0tCisKKyAgICBWZXJzaW9uICAgRGF0ZSAgICAgICAgRGVzY3JpcHRpb24KKyAgCisgICAgICAwLjEgICAgIDI1LWphbi05NCAgIEluaXRpYWwgd3JpdGluZy4KKyAgICAgIDAuMiAgICAgMjctamFuLTk0ICAgQWRkZWQgTEFOQ0UgVFggaGFyZHdhcmUgYnVmZmVyIGNoYWluaW5nLgorICAgICAgMC4zICAgICAgMS1mZWItOTQgICBBZGRlZCBtdWx0aXBsZSBERVBDQSBzdXBwb3J0LgorICAgICAgMC4zMSAgICAgNC1mZWItOTQgICBBZGRlZCBERTIwMiByZWNvZ25pdGlvbi4KKyAgICAgIDAuMzIgICAgMTktZmViLTk0ICAgVGlkeSB1cC4gSW1wcm92ZSBtdWx0aS1ERVBDQSBzdXBwb3J0LgorICAgICAgMC4zMyAgICAyNS1mZWItOTQgICBGaXggREVQQ0EgZXRoZXJuZXQgUk9NIGNvdW50ZXIgZW5hYmxlLgorICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgamFiYmVyIHBhY2tldCBmaXggZnJvbSBtdXJmQHBlcmZ0ZWNoLmNvbQorCQkJICBhbmQgYmVja2VyQHN1cGVyLm9yZworICAgICAgMC4zNCAgICAgNy1tYXItOTQgICBGaXggREVQQ0EgbWF4IG5ldHdvcmsgbWVtb3J5IFJBTSAmIE5JQ1NSIGFjY2Vzcy4KKyAgICAgIDAuMzUgICAgIDgtbWFyLTk0ICAgQWRkZWQgREUyMDEgcmVjb2duaXRpb24uIFRpZGllZCB1cC4KKyAgICAgIDAuMzUxICAgMzAtYXByLTk0ICAgQWRkZWQgRUlTQSBzdXBwb3J0LiBBZGRlZCBERTQyMiByZWNvZ25pdGlvbi4KKyAgICAgIDAuMzYgICAgMTYtbWF5LTk0ICAgREU0MjIgZml4IHJlbGVhc2VkLgorICAgICAgMC4zNyAgICAyMi1qdWwtOTQgICBBZGRlZCBNT0RVTEUgc3VwcG9ydAorICAgICAgMC4zOCAgICAxNS1hdWctOTQgICBBZGRlZCBEQlIgUk9NIHN3aXRjaCBpbiBkZXBjYV9jbG9zZSgpLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGkgREVQQ0EgYnVnIGZpeC4KKyAgICAgIDAuMzhheHAgMTUtc2VwLTk0ICAgU3BlY2lhbCB2ZXJzaW9uIGZvciBBbHBoYSBBWFAgTGludXggVjEuMC4KKyAgICAgIDAuMzgxICAgMTItZGVjLTk0ICAgQWRkZWQgREUxMDEgcmVjb2duaXRpb24sIGZpeCBtdWx0aWNhc3QgYnVnLgorICAgICAgMC4zODIgICAgOS1mZWItOTUgICBGaXggcmVjb2duaXRpb24gYnVnIHJlcG9ydGVkIGJ5IDxia21Ac3Rhci5ybC5hYy51az4uCisgICAgICAwLjM4MyAgIDIyLWZlYi05NSAgIEZpeCBmb3IgY29uZmxpY3Qgd2l0aCBWRVNBIFNDU0kgcmVwb3J0ZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9tYWluQGFsZi5kZWMuY29tPgorICAgICAgMC4zODQgICAxNy1tYXItOTUgICBGaXggYSByaW5nIGZ1bGwgYnVnIHJlcG9ydGVkIGJ5IDxia21Ac3Rhci5ybC5hYy51az4KKyAgICAgIDAuMzg1ICAgIDMtYXByLTk1ICAgRml4IGEgcmVjb2duaXRpb24gYnVnIHJlcG9ydGVkIGJ5IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJ5YW4ubmllbWlAbGFzdGZyb250aWVyLmNvbT4KKyAgICAgIDAuMzg2ICAgMjEtYXByLTk1ICAgRml4IHRoZSBsYXN0IGZpeC4uLnNvcnJ5LCBtdXN0IGJlIGdhbGxvcGluZyBzZW5pbGl0eQorICAgICAgMC40MCAgICAyNS1NYXktOTUgICBSZXdyaXRlIGZvciBwb3J0YWJpbGl0eSAmIHVwZGF0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBIHN1cHBvcnQgZnJvbSA8amVzdGFicm9AYW10LnRheTEuZGVjLmNvbT4KKyAgICAgIDAuNDEgICAgMjYtSnVuLTk1ICAgQWRkZWQgdmVyaWZ5X2FyZWEoKSBjYWxscyBpbiBkZXBjYV9pb2N0bCgpIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbiBieSA8aGVpa29AY29sb3NzdXMuZXNjYXBlLmRlPgorICAgICAgMC40MiAgICAyNy1EZWMtOTUgICBBZGQgJ21lbScgc2hhcmVkIG1lbW9yeSBhc3NpZ25tZW50IGZvciBsb2FkYWJsZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkICdhZGFwdGVyX25hbWUnIGZvciBsb2FkYWJsZSBtb2R1bGVzIHdoZW4gbm8gUFJPTS4KKwkJCSAgQm90aCBhYm92ZSBmcm9tIGEgc3VnZ2VzdGlvbiBieSAKKwkJCSAgPHBjaGVuQHdvb2RydWZmczEyMS5yZXNpZGVuY2UuZ2F0ZWNoLmVkdT4uCisJCQkgIEFkZCBuZXcgbXVsdGljYXN0aW5nIGNvZGUuCisgICAgICAwLjQyMSAgIDIyLUFwci05NgkgIEZpeCBhbGxvY19kZXZpY2UoKSBidWcgPGphcmlAbWFya2t1czIuZmltci5maT4KKyAgICAgIDAuNDIyICAgMjktQXByLTk2CSAgRml4IGRlcGNhX2h3X2luaXQoKSBidWcgPGphcmlAbWFya2t1czIuZmltci5maT4KKyAgICAgIDAuNDIzICAgIDctSnVuLTk2ICAgRml4IG1vZHVsZSBsb2FkIGJ1ZyA8a21nQGJhcmNvLmJlPgorICAgICAgMC40MyAgICAxNi1BdWctOTYgICBVcGRhdGUgYWxsb2NfZGV2aWNlKCkgdG8gY29uZm9ybSB0byBkZTR4NS5jCisgICAgICAwLjQ0ICAgICAxLVNlcC05NyAgIEZpeCAqX3Byb2JlKCkgdG8gdGVzdCBjaGVja19yZWdpb24oKSBmaXJzdCAtIGJ1ZworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWQgYnkgPG1tb2dpbHZpQGVsYmVydC51Y2NzLmVkdT4KKyAgICAgIDAuNDUgICAgIDMtTm92LTk4ICAgQWRkZWQgc3VwcG9ydCBmb3IgTUNBIEV0aGVyV09SS1MgKERFMjEwL0RFMjEyKSBjYXJkcworICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPHR5bW1AY29tcHV0ZXIub3JnPiAKKyAgICAgIDAuNDUxICAgIDUtTm92LTk4ICAgRml4ZWQgbWNhIHN0dWZmIGN1eiBJJ20gYSBkdW1teS4gPHR5bW1AY29tcHV0ZXIub3JnPgorICAgICAgMC41ICAgICAxNC1Ob3YtOTggICBSZS1zcGluIGZvciAyLjEueCBrZXJuZWxzLgorICAgICAgMC41MSAgICAyNy1KdW4tOTkgICBDb3JyZWN0IHJlY2VpdmVkIHBhY2tldCBsZW5ndGggZm9yIENSQyBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQgYnkgPHdvcm1AZGtpay5kaz4KKyAgICAgIDAuNTIgICAgMTYtT2N0LTAwICAgRml4ZXMgZm9yIDIuMyBpbyBtZW1vcnkgYWNjZXNzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRml4IHNob3ctc3RvcHBlciAoaW50cyBsZWZ0IG1hc2tlZCkgaW4gZGVwY2FfaW50ZXJydXB0CisJCQkgICBieSA8cGV0ZXJkQHBuZC1wYy5kZW1vbi5jby51az4KKyAgICAgIDAuNTMgICAgMTItSmFuLTAxCSAgUmVsZWFzZSByZXNvdXJjZXMgb24gZmFpbHVyZSwgYnNzIHRpZGJpdHMKKyAgICAgIAkJCSAgIGJ5IGFjbWVAY29uZWN0aXZhLmNvbS5icgorICAgICAgMC41NCAgICAwOC1Ob3YtMDEJICB1c2UgbGlicmFyeSBjcmMzMiBmdW5jdGlvbnMKKyAgICAgIAkJCSAgIGJ5IE1hdHRfRG9tc2NoQGRlbGwuY29tCisgICAgICAwLjU1ICAgIDAxLU1hci0wMyAgIFVzZSBFSVNBL3N5c2ZzIGZyYW1ld29yayA8bWF6QHdpbGQtd2luZC5mci5ldS5vcmc+CisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisjaWZkZWYgQ09ORklHX01DQQorI2luY2x1ZGUgPGxpbnV4L21jYS5oPgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRUlTQQorI2luY2x1ZGUgPGxpbnV4L2Vpc2EuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZGVwY2EuaCIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPSAiZGVwY2EuYzp2MC41MyAyMDAxLzEvMTIgZGF2aWVzQG1hbmlhYy51bHRyYW5ldC5jb21cbiI7CisKKyNpZmRlZiBERVBDQV9ERUJVRworc3RhdGljIGludCBkZXBjYV9kZWJ1ZyA9IERFUENBX0RFQlVHOworI2Vsc2UKK3N0YXRpYyBpbnQgZGVwY2FfZGVidWcgPSAxOworI2VuZGlmCisKKyNkZWZpbmUgREVQQ0FfTkRBIDB4ZmZlMAkvKiBObyBEZXZpY2UgQWRkcmVzcyAqLworCisjZGVmaW5lIFRYX1RJTUVPVVQgKDEqSFopCisKKy8qCisqKiBFdGhlcm5ldCBQUk9NIGRlZmluZXMKKyovCisjZGVmaW5lIFBST0JFX0xFTkdUSCAgICAzMgorI2RlZmluZSBFVEhfUFJPTV9TSUcgICAgMHhBQTU1MDBGRlVMCisKKy8qCisqKiBTZXQgdGhlIG51bWJlciBvZiBUeCBhbmQgUnggYnVmZmVycy4gRW5zdXJlIHRoYXQgdGhlIG1lbW9yeSByZXF1ZXN0ZWQKKyoqIGhlcmUgaXMgPD0gdG8gdGhlIGFtb3VudCBvZiBzaGFyZWQgbWVtb3J5IHNldCB1cCBieSB0aGUgYm9hcmQgc3dpdGNoZXMuCisqKiBUaGUgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIE1VU1QgQkUgQSBQT1dFUiBPRiAyLgorKioKKyoqIHRvdGFsX21lbW9yeSA9IE5VTV9SWF9ERVNDKig4K1JYX0JVRkZfU1opICsgTlVNX1RYX0RFU0MqKDgrVFhfQlVGRl9TWikKKyovCisjZGVmaW5lIE5VTV9SWF9ERVNDICAgICA4CS8qIE51bWJlciBvZiBSWCBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBOVU1fVFhfREVTQyAgICAgOAkvKiBOdW1iZXIgb2YgVFggZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgUlhfQlVGRl9TWgkxNTM2CS8qIEJ1ZmZlciBzaXplIGZvciBlYWNoIFJ4IGJ1ZmZlciAqLworI2RlZmluZSBUWF9CVUZGX1NaCTE1MzYJLyogQnVmZmVyIHNpemUgZm9yIGVhY2ggVHggYnVmZmVyICovCisKKy8qCisqKiBFSVNBIGJ1cyBkZWZpbmVzCisqLworI2RlZmluZSBERVBDQV9FSVNBX0lPX1BPUlRTIDB4MGMwMAkvKiBJL08gcG9ydCBiYXNlIGFkZHJlc3MsIHNsb3QgMCAqLworCisvKgorKiogSVNBIEJ1cyBkZWZpbmVzCisqLworI2RlZmluZSBERVBDQV9SQU1fQkFTRV9BRERSRVNTRVMgezB4YzAwMDAsMHhkMDAwMCwweGUwMDAwLDB4MDAwMDB9CisjZGVmaW5lIERFUENBX1RPVEFMX1NJWkUgMHgxMAorCitzdGF0aWMgc3RydWN0IHsKKwl1X2xvbmcgaW9iYXNlOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZTsKK30gZGVwY2FfaW9fcG9ydHNbXSA9IHsKKwl7IDB4MzAwLCBOVUxMIH0sCisJeyAweDIwMCwgTlVMTCB9LAorCXsgMCAgICAsIE5VTEwgfSwKK307CisKKy8qCisqKiBOYW1lIDwtPiBBZGFwdGVyIG1hcHBpbmcKKyovCisjZGVmaW5lIERFUENBX1NJR05BVFVSRSB7IkRFUENBIixcCisJCQkgIkRFMTAwIiwiREUxMDEiLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiREUyMDAiLCJERTIwMSIsIkRFMjAyIixcCisJCQkgIkRFMjEwIiwiREUyMTIiLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiREU0MjIiLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIn0KKworc3RhdGljIGNoYXIqIF9faW5pdGRhdGEgZGVwY2Ffc2lnbmF0dXJlW10gPSBERVBDQV9TSUdOQVRVUkU7CisKK2VudW0gZGVwY2FfdHlwZSB7CisJREVQQ0EsIGRlMTAwLCBkZTEwMSwgZGUyMDAsIGRlMjAxLCBkZTIwMiwgZGUyMTAsIGRlMjEyLCBkZTQyMiwgdW5rbm93bgorfTsKKworc3RhdGljIGNoYXIgZGVwY2Ffc3RyaW5nW10gPSAiZGVwY2EiOworCitzdGF0aWMgaW50IGRlcGNhX2RldmljZV9yZW1vdmUgKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CisKKyNpZmRlZiBDT05GSUdfRUlTQQorc3RhdGljIHN0cnVjdCBlaXNhX2RldmljZV9pZCBkZXBjYV9laXNhX2lkc1tdID0geworCXsgIkRFQzQyMjAiLCBkZTQyMiB9LAorCXsgIiIgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoZWlzYSwgZGVwY2FfZWlzYV9pZHMpOworCitzdGF0aWMgaW50IGRlcGNhX2Vpc2FfcHJvYmUgIChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOworCitzdGF0aWMgc3RydWN0IGVpc2FfZHJpdmVyIGRlcGNhX2Vpc2FfZHJpdmVyID0geworCS5pZF90YWJsZSA9IGRlcGNhX2Vpc2FfaWRzLAorCS5kcml2ZXIgICA9IHsKKwkJLm5hbWUgICAgPSBkZXBjYV9zdHJpbmcsCisJCS5wcm9iZSAgID0gZGVwY2FfZWlzYV9wcm9iZSwKKwkJLnJlbW92ZSAgPSBfX2RldmV4aXRfcCAoZGVwY2FfZGV2aWNlX3JlbW92ZSkKKwl9Cit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUNBCisvKgorKiogQWRhcHRlciBJRCBmb3IgdGhlIE1DQSBFdGhlcldPUktTIERFMjEwLzIxMiBhZGFwdGVyCisqLworI2RlZmluZSBERTIxMF9JRCAweDYyOGQKKyNkZWZpbmUgREUyMTJfSUQgMHg2ZGVmCisKK3N0YXRpYyBzaG9ydCBkZXBjYV9tY2FfYWRhcHRlcl9pZHNbXSA9IHsKKwlERTIxMF9JRCwKKwlERTIxMl9JRCwKKwkweDAwMDAKK307CisKK3N0YXRpYyBjaGFyICpkZXBjYV9tY2FfYWRhcHRlcl9uYW1lW10gPSB7CisJIkRFQyBFdGhlcldPUktTIE1DIEFkYXB0ZXIgKERFMjEwKSIsCisJIkRFQyBFdGhlcldPUktTIE1DIEFkYXB0ZXIgKERFMjEyKSIsCisJTlVMTAorfTsKKworc3RhdGljIGVudW0gZGVwY2FfdHlwZSBkZXBjYV9tY2FfYWRhcHRlcl90eXBlW10gPSB7CisJZGUyMTAsCisJZGUyMTIsCisJMAorfTsKKworc3RhdGljIGludCBkZXBjYV9tY2FfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKik7CisKK3N0YXRpYyBzdHJ1Y3QgbWNhX2RyaXZlciBkZXBjYV9tY2FfZHJpdmVyID0geworCS5pZF90YWJsZSA9IGRlcGNhX21jYV9hZGFwdGVyX2lkcywKKwkuZHJpdmVyICAgPSB7CisJCS5uYW1lICAgPSBkZXBjYV9zdHJpbmcsCisJCS5idXMgICAgPSAmbWNhX2J1c190eXBlLAorCQkucHJvYmUgID0gZGVwY2FfbWNhX3Byb2JlLAorCQkucmVtb3ZlID0gX19kZXZleGl0X3AoZGVwY2FfZGV2aWNlX3JlbW92ZSksCisJfSwKK307CisjZW5kaWYKKworc3RhdGljIGludCBkZXBjYV9pc2FfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKik7CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkZXBjYV9pc2FfZHJpdmVyID0geworCS5uYW1lICAgPSBkZXBjYV9zdHJpbmcsCisJLmJ1cyAgICA9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUgID0gZGVwY2FfaXNhX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChkZXBjYV9kZXZpY2VfcmVtb3ZlKSwKK307CisJCisvKgorKiogTWlzY2VsbGFuZW91cyBpbmZvLi4uCisqLworI2RlZmluZSBERVBDQV9TVFJMRU4gMTYKKworLyoKKyoqIE1lbW9yeSBBbGlnbm1lbnQuIEVhY2ggZGVzY3JpcHRvciBpcyA0IGxvbmd3b3JkcyBsb25nLiBUbyBmb3JjZSBhCisqKiBwYXJ0aWN1bGFyIGFsaWdubWVudCBvbiB0aGUgVFggZGVzY3JpcHRvciwgYWRqdXN0IERFU0NfU0tJUF9MRU4gYW5kCisqKiBERVNDX0FMSUdOLiBERVBDQV9BTElHTiBhbGlnbnMgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHByaXZhdGUgbWVtb3J5IGFyZWEKKyoqIGFuZCBoZW5jZSB0aGUgUlggZGVzY3JpcHRvciByaW5nJ3MgZmlyc3QgZW50cnkuIAorKi8KKyNkZWZpbmUgREVQQ0FfQUxJR040ICAgICAgKCh1X2xvbmcpNCAtIDEpCS8qIDEgbG9uZ3dvcmQgYWxpZ24gKi8KKyNkZWZpbmUgREVQQ0FfQUxJR044ICAgICAgKCh1X2xvbmcpOCAtIDEpCS8qIDIgbG9uZ3dvcmQgKHF1YWR3b3JkKSBhbGlnbiAqLworI2RlZmluZSBERVBDQV9BTElHTiAgICAgICAgIERFUENBX0FMSUdOOAkvKiBLZWVwIHRoZSBMQU5DRSBoYXBweS4uLiAqLworCisvKgorKiogVGhlIERFUENBIFJ4IGFuZCBUeCByaW5nIGRlc2NyaXB0b3JzLiAKKyovCitzdHJ1Y3QgZGVwY2FfcnhfZGVzYyB7CisJdm9sYXRpbGUgczMyIGJhc2U7CisJczE2IGJ1Zl9sZW5ndGg7CQkvKiBUaGlzIGxlbmd0aCBpcyBuZWdhdGl2ZSAyJ3MgY29tcGxlbWVudCEgKi8KKwlzMTYgbXNnX2xlbmd0aDsJCS8qIFRoaXMgbGVuZ3RoIGlzICJub3JtYWwiLiAqLworfTsKKworc3RydWN0IGRlcGNhX3R4X2Rlc2MgeworCXZvbGF0aWxlIHMzMiBiYXNlOworCXMxNiBsZW5ndGg7CQkvKiBUaGlzIGxlbmd0aCBpcyBuZWdhdGl2ZSAyJ3MgY29tcGxlbWVudCEgKi8KKwlzMTYgbWlzYzsJCS8qIEVycm9ycyBhbmQgVERSIGluZm8gKi8KK307CisKKyNkZWZpbmUgTEFfTUFTSyAweDAwMDBmZmZmCS8qIExBTkNFIGFkZHJlc3MgbWFzayBmb3IgbWFwcGluZyBuZXR3b3JrIFJBTQorCQkJCSAgIHRvIExBTkNFIG1lbW9yeSBhZGRyZXNzIHNwYWNlICovCisKKy8qCisqKiBUaGUgTGFuY2UgaW5pdGlhbGl6YXRpb24gYmxvY2ssIGRlc2NyaWJlZCBpbiBkYXRhYm9vaywgaW4gY29tbW9uIG1lbW9yeS4KKyovCitzdHJ1Y3QgZGVwY2FfaW5pdCB7CisJdTE2IG1vZGU7CQkvKiBNb2RlIHJlZ2lzdGVyICovCisJdTggcGh5c19hZGRyW0VUSF9BTEVOXTsJLyogUGh5c2ljYWwgZXRoZXJuZXQgYWRkcmVzcyAqLworCXU4IG1jYXN0X3RhYmxlWzhdOwkvKiBNdWx0aWNhc3QgSGFzaCBUYWJsZS4gKi8KKwl1MzIgcnhfcmluZzsJCS8qIFJ4IHJpbmcgYmFzZSBwb2ludGVyICYgcmluZyBsZW5ndGggKi8KKwl1MzIgdHhfcmluZzsJCS8qIFR4IHJpbmcgYmFzZSBwb2ludGVyICYgcmluZyBsZW5ndGggKi8KK307CisKKyNkZWZpbmUgREVQQ0FfUEtUX1NUQVRfU1ogMTYKKyNkZWZpbmUgREVQQ0FfUEtUX0JJTl9TWiAgMTI4CS8qIFNob3VsZCBiZSA+PTEwMCB1bmxlc3MgeW91CisJCQkJICAgaW5jcmVhc2UgREVQQ0FfUEtUX1NUQVRfU1ogKi8KK3N0cnVjdCBkZXBjYV9wcml2YXRlIHsKKwljaGFyIGFkYXB0ZXJfbmFtZVtERVBDQV9TVFJMRU5dOwkvKiAvcHJvYy9pb3BvcnRzIHN0cmluZyAgICAgICAgICAgICAgICAgICovCisJZW51bSBkZXBjYV90eXBlIGFkYXB0ZXI7CQkvKiBBZGFwdGVyIHR5cGUgKi8KKwllbnVtIHsKKyAgICAgICAgICAgICAgICBERVBDQV9CVVNfTUNBID0gMSwKKyAgICAgICAgICAgICAgICBERVBDQV9CVVNfSVNBLAorICAgICAgICAgICAgICAgIERFUENBX0JVU19FSVNBLAorICAgICAgICB9IGRlcGNhX2J1czsJICAgICAgICAvKiB0eXBlIG9mIGJ1cyAqLworCXN0cnVjdCBkZXBjYV9pbml0IGluaXRfYmxvY2s7CS8qIFNoYWRvdyBJbml0aWFsaXphdGlvbiBibG9jayAgICAgICAgICAgICovCisvKiBDUFUgYWRkcmVzcyBzcGFjZSBmaWVsZHMgKi8KKwlzdHJ1Y3QgZGVwY2FfcnhfZGVzYyBfX2lvbWVtICpyeF9yaW5nOwkvKiBQb2ludGVyIHRvIHN0YXJ0IG9mIFJYIGRlc2NyaXB0b3IgcmluZyAqLworCXN0cnVjdCBkZXBjYV90eF9kZXNjIF9faW9tZW0gKnR4X3Jpbmc7CS8qIFBvaW50ZXIgdG8gc3RhcnQgb2YgVFggZGVzY3JpcHRvciByaW5nICovCisJdm9pZCBfX2lvbWVtICpyeF9idWZmW05VTV9SWF9ERVNDXTsJLyogQ1BVIHZpcnQgYWRkcmVzcyBvZiBzaCdkIG1lbW9yeSBidWZmcyAgKi8KKwl2b2lkIF9faW9tZW0gKnR4X2J1ZmZbTlVNX1RYX0RFU0NdOwkvKiBDUFUgdmlydCBhZGRyZXNzIG9mIHNoJ2QgbWVtb3J5IGJ1ZmZzICAqLworCXZvaWQgX19pb21lbSAqc2hfbWVtOwkvKiBDUFUgbWFwcGVkIHZpcnQgYWRkcmVzcyBvZiBkZXZpY2UgUkFNICAqLworCXVfbG9uZyBtZW1fc3RhcnQ7CS8qIEJ1cyBhZGRyZXNzIG9mIGRldmljZSBSQU0gKGJlZm9yZSByZW1hcCkgKi8KKwl1X2xvbmcgbWVtX2xlbjsJCS8qIGRldmljZSBtZW1vcnkgc2l6ZSAqLworLyogRGV2aWNlIGFkZHJlc3Mgc3BhY2UgZmllbGRzICovCisJdV9sb25nIGRldmljZV9yYW1fc3RhcnQ7CS8qIFN0YXJ0IG9mIFJBTSBpbiBkZXZpY2UgYWRkciBzcGFjZSAgICAgICovCisvKiBPZmZzZXRzIHVzZWQgaW4gYm90aCBhZGRyZXNzIHNwYWNlcyAqLworCXVfbG9uZyByeF9yaW5nX29mZnNldDsJLyogT2Zmc2V0IGZyb20gc3RhcnQgb2YgUkFNIHRvIHJ4X3JpbmcgICAgKi8KKwl1X2xvbmcgdHhfcmluZ19vZmZzZXQ7CS8qIE9mZnNldCBmcm9tIHN0YXJ0IG9mIFJBTSB0byB0eF9yaW5nICAgICovCisJdV9sb25nIGJ1ZmZzX29mZnNldDsJLyogTEFOQ0UgUnggYW5kIFR4IGJ1ZmZlcnMgc3RhcnQgYWRkcmVzcy4gKi8KKy8qIEtlcm5lbC1vbmx5IChub3QgZGV2aWNlKSBmaWVsZHMgKi8KKwlpbnQgcnhfbmV3LCB0eF9uZXc7CS8qIFRoZSBuZXh0IGZyZWUgcmluZyBlbnRyeSAgICAgICAgICAgICAgICovCisJaW50IHJ4X29sZCwgdHhfb2xkOwkvKiBUaGUgcmluZyBlbnRyaWVzIHRvIGJlIGZyZWUoKWVkLiAgICAgICAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgewkJLyogUHJpdmF0ZSBzdGF0cyBjb3VudGVycyAgICAgICAgICAgICAgICAgKi8KKwkJdTMyIGJpbnNbREVQQ0FfUEtUX1NUQVRfU1pdOworCQl1MzIgdW5pY2FzdDsKKwkJdTMyIG11bHRpY2FzdDsKKwkJdTMyIGJyb2FkY2FzdDsKKwkJdTMyIGV4Y2Vzc2l2ZV9jb2xsaXNpb25zOworCQl1MzIgdHhfdW5kZXJydW5zOworCQl1MzIgZXhjZXNzaXZlX3VuZGVycnVuczsKKwl9IHBrdFN0YXRzOworCWludCB0eFJpbmdNYXNrOwkJLyogVFggcmluZyBtYXNrICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpbnQgcnhSaW5nTWFzazsJCS8qIFJYIHJpbmcgbWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJczMyIHJ4X3JsZW47CQkvKiBsb2cyKHJ4UmluZ01hc2srMSkgZm9yIHRoZSBkZXNjcmlwdG9ycyAqLworCXMzMiB0eF9ybGVuOwkJLyogbG9nMih0eFJpbmdNYXNrKzEpIGZvciB0aGUgZGVzY3JpcHRvcnMgKi8KK307CisKKy8qCisqKiBUaGUgdHJhbnNtaXQgcmluZyBmdWxsIGNvbmRpdGlvbiBpcyBkZXNjcmliZWQgYnkgdGhlIHR4X29sZCBhbmQgdHhfbmV3CisqKiBwb2ludGVycyBieToKKyoqICAgIHR4X29sZCAgICAgICAgICAgID0gdHhfbmV3ICAgIEVtcHR5IHJpbmcKKyoqICAgIHR4X29sZCAgICAgICAgICAgID0gdHhfbmV3KzEgIEZ1bGwgcmluZworKiogICAgdHhfb2xkK3R4UmluZ01hc2sgPSB0eF9uZXcgICAgRnVsbCByaW5nICAod3JhcHBlZCBjb25kaXRpb24pCisqLworI2RlZmluZSBUWF9CVUZGU19BVkFJTCAoKGxwLT50eF9vbGQ8PWxwLT50eF9uZXcpP1wKKwkJCSBscC0+dHhfb2xkK2xwLT50eFJpbmdNYXNrLWxwLT50eF9uZXc6XAorICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT50eF9vbGQgICAgICAgICAgICAgICAtbHAtPnR4X25ldy0xKQorCisvKgorKiogUHVibGljIEZ1bmN0aW9ucworKi8KK3N0YXRpYyBpbnQgZGVwY2Ffb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZGVwY2Ffc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBkZXBjYV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IGRlcGNhX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBkZXBjYV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyB2b2lkIGRlcGNhX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmRlcGNhX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoKKyoqIFByaXZhdGUgZnVuY3Rpb25zCisqLworc3RhdGljIHZvaWQgZGVwY2FfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBkZXBjYV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZGVwY2FfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyB2b2lkIExvYWRDU1JzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBJbml0UmVzdGFydERlcGNhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBEZXBjYVNpZ25hdHVyZShjaGFyICpuYW1lLCB1X2xvbmcgcGFkZHIpOworc3RhdGljIGludCBEZXZpY2VQcmVzZW50KHVfbG9uZyBpb2FkZHIpOworc3RhdGljIGludCBnZXRfaHdfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIFNldE11bHRpY2FzdEZpbHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbG9hZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBkZXBjYV9kYmdfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHVfY2hhciBkZTF4eF9pcnFbXSBfX2luaXRkYXRhID0geyAyLCAzLCA0LCA1LCA3LCA5LCAwIH07CitzdGF0aWMgdV9jaGFyIGRlMnh4X2lycVtdIF9faW5pdGRhdGEgPSB7IDUsIDksIDEwLCAxMSwgMTUsIDAgfTsKK3N0YXRpYyB1X2NoYXIgZGU0MjJfaXJxW10gX19pbml0ZGF0YSA9IHsgNSwgOSwgMTAsIDExLCAwIH07CitzdGF0aWMgdV9jaGFyICpkZXBjYV9pcnE7CisKK3N0YXRpYyBpbnQgaXJxOworc3RhdGljIGludCBpbzsKK3N0YXRpYyBjaGFyICphZGFwdGVyX25hbWU7CitzdGF0aWMgaW50IG1lbTsJCQkvKiBGb3IgbG9hZGFibGUgbW9kdWxlIGFzc2lnbm1lbnQKKwkJCQkgICB1c2UgaW5zbW9kIG1lbT0weD8/Pz8/IC4uLi4gKi8KK21vZHVsZV9wYXJhbSAoaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtIChpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbSAoYWRhcHRlcl9uYW1lLCBjaGFycCwgMCk7Cittb2R1bGVfcGFyYW0gKG1lbSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiREVQQ0EgSVJRIG51bWJlciIpOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkRFUENBIEkvTyBiYXNlIGFkZHJlc3MiKTsKK01PRFVMRV9QQVJNX0RFU0MoYWRhcHRlcl9uYW1lLCAiREVQQ0EgYWRhcHRlciBuYW1lIik7CitNT0RVTEVfUEFSTV9ERVNDKG1lbSwgIkRFUENBIHNoYXJlZCBtZW1vcnkgYWRkcmVzcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorKiogTWlzY2VsbGFuZW91cyBkZWZpbmVzLi4uCisqLworI2RlZmluZSBTVE9QX0RFUENBIFwKKyAgICBvdXR3KENTUjAsIERFUENBX0FERFIpO1wKKyAgICBvdXR3KFNUT1AsIERFUENBX0RBVEEpCisKK3N0YXRpYyBpbnQgX19pbml0IGRlcGNhX2h3X2luaXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqbHA7CisJaW50IGksIGosIG9mZnNldCwgbmV0UkFNLCBtZW1fbGVuLCBzdGF0dXMgPSAwOworCXMxNiBuaWNzcjsKKwl1X2xvbmcgaW9hZGRyOworCXVfbG9uZyBtZW1fc3RhcnQ7CisKKwkvKgorCSAqIFdlIGFyZSBub3cgc3VwcG9zZWQgdG8gZW50ZXIgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZQorCSAqIGZvbGxvd2luZyBmaWVsZHMgZmlsbGVkIHdpdGggcHJvcGVyIHZhbHVlcyA6CisJICoKKwkgKiBkZXYtPmJhc2VfYWRkcgorCSAqIGxwLT5tZW1fc3RhcnQKKwkgKiBscC0+ZGVwY2FfYnVzCisJICogbHAtPmFkYXB0ZXIKKwkgKgorCSAqIGRldi0+aXJxIGNhbiBiZSBzZXQgaWYga25vd24gZnJvbSBkZXZpY2UgY29uZmlndXJhdGlvbiAob24KKwkgKiBNQ0Egb3IgRUlTQSkgb3IgbW9kdWxlIG9wdGlvbi4gT3RoZXJ3aXNlLCBpdCB3aWxsIGJlIGF1dG8KKwkgKiBkZXRlY3RlZC4KKwkgKi8KKworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCQorCVNUT1BfREVQQ0E7CisKKwluaWNzciA9IGluYihERVBDQV9OSUNTUik7CisJbmljc3IgPSAoKG5pY3NyICYgflNIRSAmIH5SQkUgJiB+SUVOKSB8IElNKTsKKwlvdXRiKG5pY3NyLCBERVBDQV9OSUNTUik7CisKKwlpZiAoaW53KERFUENBX0RBVEEpICE9IFNUT1ApIHsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlscCA9IChzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJbWVtX3N0YXJ0ID0gbHAtPm1lbV9zdGFydDsKKworCWlmICghbWVtX3N0YXJ0IHx8IGxwLT5hZGFwdGVyIDwgREVQQ0EgfHwgbHAtPmFkYXB0ZXIgPj11bmtub3duKQorCQlyZXR1cm4gLUVOWElPOworCisJcHJpbnRrICgiJXM6ICVzIGF0IDB4JTA0bHgiLAorCSAgICAgICAgZGV2aWNlLT5idXNfaWQsIGRlcGNhX3NpZ25hdHVyZVtscC0+YWRhcHRlcl0sIGlvYWRkcik7CisJCisJc3dpdGNoIChscC0+ZGVwY2FfYnVzKSB7CisjaWZkZWYgQ09ORklHX01DQQorCWNhc2UgREVQQ0FfQlVTX01DQToKKwkJcHJpbnRrKCIgKE1DQSBzbG90ICVkKSIsIHRvX21jYV9kZXZpY2UoZGV2aWNlKS0+c2xvdCArIDEpOworCQlicmVhazsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0VJU0EKKwljYXNlIERFUENBX0JVU19FSVNBOgorCQlwcmludGsoIiAoRUlTQSBzbG90ICVkKSIsIHRvX2Vpc2FfZGV2aWNlKGRldmljZSktPnNsb3QpOworCQlicmVhazsKKyNlbmRpZgorCisJY2FzZSBERVBDQV9CVVNfSVNBOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50aygiVW5rbm93biBERVBDQSBidXMgJWRcbiIsIGxwLT5kZXBjYV9idXMpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXByaW50aygiLCBoL3cgYWRkcmVzcyAiKTsKKwlzdGF0dXMgPSBnZXRfaHdfYWRkcihkZXYpOworCWlmIChzdGF0dXMgIT0gMCkgeworCQlwcmludGsoIiAgICAgIHdoaWNoIGhhcyBhbiBFdGhlcm5ldCBQUk9NIENSQyBlcnJvci5cbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU4gLSAxOyBpKyspIHsJLyogZ2V0IHRoZSBldGhlcm5ldCBhZGRyZXNzICovCisJCXByaW50aygiJTIuMng6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJfQorCXByaW50aygiJTIuMngiLCBkZXYtPmRldl9hZGRyW2ldKTsKKworCS8qIFNldCB1cCB0aGUgbWF4aW11bSBhbW91bnQgb2YgbmV0d29yayBSQU0oa0IpICovCisJbmV0UkFNID0gKChscC0+YWRhcHRlciAhPSBERVBDQSkgPyA2NCA6IDQ4KTsKKwlpZiAoKG5pY3NyICYgXzEyOEtCKSAmJiAobHAtPmFkYXB0ZXIgPT0gZGU0MjIpKQorCQluZXRSQU0gPSAxMjg7CisKKwkvKiBTaGFyZWQgTWVtb3J5IEJhc2UgQWRkcmVzcyAqLworCWlmIChuaWNzciAmIEJVRikgeworCQluaWNzciAmPSB+QlM7CS8qIERFUENBIFJBTSBpbiB0b3AgMzJrICovCisJCW5ldFJBTSAtPSAzMjsKKworCQkvKiBPbmx5IEVJU0EvSVNBIG5lZWRzIHN0YXJ0IGFkZHJlc3MgdG8gYmUgcmUtY29tcHV0ZWQgKi8KKwkJaWYgKGxwLT5kZXBjYV9idXMgIT0gREVQQ0FfQlVTX01DQSkKKwkJCW1lbV9zdGFydCArPSAweDgwMDA7CisJfQorCQorCWlmICgobWVtX2xlbiA9IChOVU1fUlhfREVTQyAqIChzaXplb2Yoc3RydWN0IGRlcGNhX3J4X2Rlc2MpICsgUlhfQlVGRl9TWikgKyBOVU1fVFhfREVTQyAqIChzaXplb2Yoc3RydWN0IGRlcGNhX3R4X2Rlc2MpICsgVFhfQlVGRl9TWikgKyBzaXplb2Yoc3RydWN0IGRlcGNhX2luaXQpKSkKKwkgICAgPiAobmV0UkFNIDw8IDEwKSkgeworCQlwcmludGsoIixcbiAgICAgICByZXF1ZXN0cyAlZGtCIFJBTTogb25seSAlZGtCIGlzIGF2YWlsYWJsZSFcbiIsIChtZW1fbGVuID4+IDEwKSwgbmV0UkFNKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlwcmludGsoIixcbiAgICAgIGhhcyAlZGtCIFJBTSBhdCAweCUuNWx4IiwgbmV0UkFNLCBtZW1fc3RhcnQpOworCisJLyogRW5hYmxlIHRoZSBzaGFkb3cgUkFNLiAqLworCWlmIChscC0+YWRhcHRlciAhPSBERVBDQSkgeworCQluaWNzciB8PSBTSEU7CisJCW91dGIobmljc3IsIERFUENBX05JQ1NSKTsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCXNwcmludGYobHAtPmFkYXB0ZXJfbmFtZSwgIiVzICglcykiLAorCQlkZXBjYV9zaWduYXR1cmVbbHAtPmFkYXB0ZXJdLCBkZXZpY2UtPmJ1c19pZCk7CisJc3RhdHVzID0gLUVCVVNZOworCisJLyogSW5pdGlhbGlzYXRpb24gQmxvY2sgKi8KKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbiAobWVtX3N0YXJ0LCBtZW1fbGVuLCBscC0+YWRhcHRlcl9uYW1lKSkgeworCQlwcmludGsoS0VSTl9FUlIgImRlcGNhOiBjYW5ub3QgcmVxdWVzdCBJU0EgbWVtb3J5LCBhYm9ydGluZ1xuIik7CisJCWdvdG8gb3V0X3ByaXY7CisJfQorCQkKKwlzdGF0dXMgPSAtRUlPOworCWxwLT5zaF9tZW0gPSBpb3JlbWFwKG1lbV9zdGFydCwgbWVtX2xlbik7CisJaWYgKGxwLT5zaF9tZW0gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImRlcGNhOiBjYW5ub3QgcmVtYXAgSVNBIG1lbW9yeSwgYWJvcnRpbmdcbiIpOworCQlnb3RvIG91dDE7CisJfQorCisJbHAtPm1lbV9zdGFydCA9IG1lbV9zdGFydDsKKwlscC0+bWVtX2xlbiAgID0gbWVtX2xlbjsKKwlscC0+ZGV2aWNlX3JhbV9zdGFydCA9IG1lbV9zdGFydCAmIExBX01BU0s7CisKKwlvZmZzZXQgPSAwOworCW9mZnNldCArPSBzaXplb2Yoc3RydWN0IGRlcGNhX2luaXQpOworCisJLyogVHggJiBSeCBkZXNjcmlwdG9ycyAoYWxpZ25lZCB0byBhIHF1YWR3b3JkIGJvdW5kYXJ5KSAqLworCW9mZnNldCA9IChvZmZzZXQgKyBERVBDQV9BTElHTikgJiB+REVQQ0FfQUxJR047CisJbHAtPnJ4X3JpbmcgPSAoc3RydWN0IGRlcGNhX3J4X2Rlc2MgX19pb21lbSAqKSAobHAtPnNoX21lbSArIG9mZnNldCk7CisJbHAtPnJ4X3Jpbmdfb2Zmc2V0ID0gb2Zmc2V0OworCisJb2Zmc2V0ICs9IChzaXplb2Yoc3RydWN0IGRlcGNhX3J4X2Rlc2MpICogTlVNX1JYX0RFU0MpOworCWxwLT50eF9yaW5nID0gKHN0cnVjdCBkZXBjYV90eF9kZXNjIF9faW9tZW0gKikgKGxwLT5zaF9tZW0gKyBvZmZzZXQpOworCWxwLT50eF9yaW5nX29mZnNldCA9IG9mZnNldDsKKworCW9mZnNldCArPSAoc2l6ZW9mKHN0cnVjdCBkZXBjYV90eF9kZXNjKSAqIE5VTV9UWF9ERVNDKTsKKworCWxwLT5idWZmc19vZmZzZXQgPSBvZmZzZXQ7CisKKwkvKiBGaW5pc2ggaW5pdGlhbGlzaW5nIHRoZSByaW5nIGluZm9ybWF0aW9uLiAqLworCWxwLT5yeFJpbmdNYXNrID0gTlVNX1JYX0RFU0MgLSAxOworCWxwLT50eFJpbmdNYXNrID0gTlVNX1RYX0RFU0MgLSAxOworCisJLyogQ2FsY3VsYXRlIFR4L1J4IFJMRU4gc2l6ZSBmb3IgdGhlIGRlc2NyaXB0b3JzLiAqLworCWZvciAoaSA9IDAsIGogPSBscC0+cnhSaW5nTWFzazsgaiA+IDA7IGkrKykgeworCQlqID4+PSAxOworCX0KKwlscC0+cnhfcmxlbiA9IChzMzIpIChpIDw8IDI5KTsKKwlmb3IgKGkgPSAwLCBqID0gbHAtPnR4UmluZ01hc2s7IGogPiAwOyBpKyspIHsKKwkJaiA+Pj0gMTsKKwl9CisJbHAtPnR4X3JsZW4gPSAoczMyKSAoaSA8PCAyOSk7CisKKwkvKiBMb2FkIHRoZSBpbml0aWFsaXNhdGlvbiBibG9jayAqLworCWRlcGNhX2luaXRfcmluZyhkZXYpOworCisJLyogSW5pdGlhbGlzZSB0aGUgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVycyAqLworCUxvYWRDU1JzKGRldik7CisKKwkvKiBFbmFibGUgREVQQ0EgYm9hcmQgaW50ZXJydXB0cyBmb3IgYXV0b3Byb2JpbmcgKi8KKwluaWNzciA9ICgobmljc3IgJiB+SU0pIHwgSUVOKTsKKwlvdXRiKG5pY3NyLCBERVBDQV9OSUNTUik7CisKKwkvKiBUbyBhdXRvLUlSUSB3ZSBlbmFibGUgdGhlIGluaXRpYWxpemF0aW9uLWRvbmUgYW5kIERNQSBlcnIsCisJICAgaW50ZXJydXB0cy4gRm9yIG5vdyB3ZSB3aWxsIGFsd2F5cyBnZXQgYSBETUEgZXJyb3IuICovCisJaWYgKGRldi0+aXJxIDwgMikgeworCQl1bnNpZ25lZCBjaGFyIGlycW51bTsKKwkJdW5zaWduZWQgbG9uZyBpcnFfbWFzaywgZGVsYXk7CisKKwkJaXJxX21hc2sgPSBwcm9iZV9pcnFfb24oKTsKKworCQkvKiBBc3NpZ24gdGhlIGNvcnJlY3QgaXJxIGxpc3QgKi8KKwkJc3dpdGNoIChscC0+YWRhcHRlcikgeworCQljYXNlIERFUENBOgorCQljYXNlIGRlMTAwOgorCQljYXNlIGRlMTAxOgorCQkJZGVwY2FfaXJxID0gZGUxeHhfaXJxOworCQkJYnJlYWs7CisJCWNhc2UgZGUyMDA6CisJCWNhc2UgZGUyMDE6CisJCWNhc2UgZGUyMDI6CisJCWNhc2UgZGUyMTA6CisJCWNhc2UgZGUyMTI6CisJCQlkZXBjYV9pcnEgPSBkZTJ4eF9pcnE7CisJCQlicmVhazsKKwkJY2FzZSBkZTQyMjoKKwkJCWRlcGNhX2lycSA9IGRlNDIyX2lycTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsJLyogTm90IHJlYWNoZWQgKi8KKwkJfQorCisJCS8qIFRyaWdnZXIgYW4gaW5pdGlhbGl6YXRpb24ganVzdCBmb3IgdGhlIGludGVycnVwdC4gKi8KKwkJb3V0dyhJTkVBIHwgSU5JVCwgREVQQ0FfREFUQSk7CisKKwkJZGVsYXkgPSBqaWZmaWVzICsgSFovNTA7CisJCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBkZWxheSkpCisJCQl5aWVsZCgpOworCisJCWlycW51bSA9IHByb2JlX2lycV9vZmYoaXJxX21hc2spOworCisJCXN0YXR1cyA9IC1FTlhJTzsKKwkJaWYgKCFpcnFudW0pIHsKKwkJCXByaW50aygiIGFuZCBmYWlsZWQgdG8gZGV0ZWN0IElSUSBsaW5lLlxuIik7CisJCQlnb3RvIG91dDI7CisJCX0gZWxzZSB7CisJCQlmb3IgKGRldi0+aXJxID0gMCwgaSA9IDA7IChkZXBjYV9pcnFbaV0pICYmICghZGV2LT5pcnEpOyBpKyspCisJCQkJaWYgKGlycW51bSA9PSBkZXBjYV9pcnFbaV0pIHsKKwkJCQkJZGV2LT5pcnEgPSBpcnFudW07CisJCQkJCXByaW50aygiIGFuZCB1c2VzIElSUSVkLlxuIiwgZGV2LT5pcnEpOworCQkJCX0KKworCQkJaWYgKCFkZXYtPmlycSkgeworCQkJCXByaW50aygiIGJ1dCBpbmNvcnJlY3QgSVJRIGxpbmUgZGV0ZWN0ZWQuXG4iKTsKKwkJCQlnb3RvIG91dDI7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlwcmludGsoIiBhbmQgYXNzaWduZWQgSVJRJWQuXG4iLCBkZXYtPmlycSk7CisJfQorCisJaWYgKGRlcGNhX2RlYnVnID4gMSkgeworCQlwcmludGsodmVyc2lvbik7CisJfQorCisJLyogVGhlIERFUENBLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5vcGVuID0gJmRlcGNhX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmZGVwY2Ffc3RhcnRfeG1pdDsKKwlkZXYtPnN0b3AgPSAmZGVwY2FfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSAmZGVwY2FfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9tdWx0aWNhc3RfbGlzdDsKKwlkZXYtPmRvX2lvY3RsID0gJmRlcGNhX2lvY3RsOworCWRldi0+dHhfdGltZW91dCA9IGRlcGNhX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisKKwlkZXYtPm1lbV9zdGFydCA9IDA7CisKKwlkZXZpY2UtPmRyaXZlcl9kYXRhID0gZGV2OworCVNFVF9ORVRERVZfREVWIChkZXYsIGRldmljZSk7CisJCisJc3RhdHVzID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHN0YXR1cyA9PSAwKQorCQlyZXR1cm4gMDsKK291dDI6CisJaW91bm1hcChscC0+c2hfbWVtKTsKK291dDE6CisJcmVsZWFzZV9tZW1fcmVnaW9uIChtZW1fc3RhcnQsIG1lbV9sZW4pOworb3V0X3ByaXY6CisJcmV0dXJuIHN0YXR1czsKK30KKwwKKworc3RhdGljIGludCBkZXBjYV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlcGNhX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBkZXBjYV9wcml2YXRlICopIGRldi0+cHJpdjsKKwl1X2xvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJczE2IG5pY3NyOworCWludCBzdGF0dXMgPSAwOworCisJU1RPUF9ERVBDQTsKKwluaWNzciA9IGluYihERVBDQV9OSUNTUik7CisKKwkvKiBNYWtlIHN1cmUgdGhlIHNoYWRvdyBSQU0gaXMgZW5hYmxlZCAqLworCWlmIChscC0+YWRhcHRlciAhPSBERVBDQSkgeworCQluaWNzciB8PSBTSEU7CisJCW91dGIobmljc3IsIERFUENBX05JQ1NSKTsKKwl9CisKKwkvKiBSZS1pbml0aWFsaXplIHRoZSBERVBDQS4uLiAqLworCWRlcGNhX2luaXRfcmluZyhkZXYpOworCUxvYWRDU1JzKGRldik7CisKKwlkZXBjYV9kYmdfb3BlbihkZXYpOworCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmZGVwY2FfaW50ZXJydXB0LCAwLCBscC0+YWRhcHRlcl9uYW1lLCBkZXYpKSB7CisJCXByaW50aygiZGVwY2Ffb3BlbigpOiBSZXF1ZXN0ZWQgSVJRJWQgaXMgYnVzeVxuIiwgZGV2LT5pcnEpOworCQlzdGF0dXMgPSAtRUFHQUlOOworCX0gZWxzZSB7CisKKwkJLyogRW5hYmxlIERFUENBIGJvYXJkIGludGVycnVwdHMgYW5kIHR1cm4gb2ZmIExFRCAqLworCQluaWNzciA9ICgobmljc3IgJiB+SU0gJiB+TEVEKSB8IElFTik7CisJCW91dGIobmljc3IsIERFUENBX05JQ1NSKTsKKwkJb3V0dyhDU1IwLCBERVBDQV9BRERSKTsKKworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJCXN0YXR1cyA9IEluaXRSZXN0YXJ0RGVwY2EoZGV2KTsKKworCQlpZiAoZGVwY2FfZGVidWcgPiAxKSB7CisJCQlwcmludGsoIkNTUjA6IDB4JTQuNHhcbiIsIGludyhERVBDQV9EQVRBKSk7CisJCQlwcmludGsoIm5pY3NyOiAweCUwMnhcbiIsIGluYihERVBDQV9OSUNTUikpOworCQl9CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIGxhbmNlIFJ4IGFuZCBUeCBkZXNjcmlwdG9yIHJpbmdzLiAqLworc3RhdGljIHZvaWQgZGVwY2FfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlcGNhX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBkZXBjYV9wcml2YXRlICopIGRldi0+cHJpdjsKKwl1X2ludCBpOworCXVfbG9uZyBvZmZzZXQ7CisKKwkvKiBMb2NrIG91dCBvdGhlciBwcm9jZXNzZXMgd2hpbHN0IHNldHRpbmcgdXAgdGhlIGhhcmR3YXJlICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJbHAtPnJ4X25ldyA9IGxwLT50eF9uZXcgPSAwOworCWxwLT5yeF9vbGQgPSBscC0+dHhfb2xkID0gMDsKKworCS8qIEluaXRpYWxpemUgdGhlIGJhc2UgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIGVhY2ggYnVmZmVyIGluIHRoZSByaW5nICovCisJZm9yIChpID0gMDsgaSA8PSBscC0+cnhSaW5nTWFzazsgaSsrKSB7CisJCW9mZnNldCA9IGxwLT5idWZmc19vZmZzZXQgKyBpICogUlhfQlVGRl9TWjsKKwkJd3JpdGVsKChscC0+ZGV2aWNlX3JhbV9zdGFydCArIG9mZnNldCkgfCBSX09XTiwgJmxwLT5yeF9yaW5nW2ldLmJhc2UpOworCQl3cml0ZXcoLVJYX0JVRkZfU1osICZscC0+cnhfcmluZ1tpXS5idWZfbGVuZ3RoKTsKKwkJbHAtPnJ4X2J1ZmZbaV0gPSBscC0+c2hfbWVtICsgb2Zmc2V0OworCX0KKworCWZvciAoaSA9IDA7IGkgPD0gbHAtPnR4UmluZ01hc2s7IGkrKykgeworCQlvZmZzZXQgPSBscC0+YnVmZnNfb2Zmc2V0ICsgKGkgKyBscC0+cnhSaW5nTWFzayArIDEpICogVFhfQlVGRl9TWjsKKwkJd3JpdGVsKChscC0+ZGV2aWNlX3JhbV9zdGFydCArIG9mZnNldCkgJiAweDAwZmZmZmZmLCAmbHAtPnR4X3JpbmdbaV0uYmFzZSk7CisJCWxwLT50eF9idWZmW2ldID0gbHAtPnNoX21lbSArIG9mZnNldDsKKwl9CisKKwkvKiBTZXQgdXAgdGhlIGluaXRpYWxpemF0aW9uIGJsb2NrICovCisJbHAtPmluaXRfYmxvY2sucnhfcmluZyA9IChscC0+ZGV2aWNlX3JhbV9zdGFydCArIGxwLT5yeF9yaW5nX29mZnNldCkgfCBscC0+cnhfcmxlbjsKKwlscC0+aW5pdF9ibG9jay50eF9yaW5nID0gKGxwLT5kZXZpY2VfcmFtX3N0YXJ0ICsgbHAtPnR4X3Jpbmdfb2Zmc2V0KSB8IGxwLT50eF9ybGVuOworCisJU2V0TXVsdGljYXN0RmlsdGVyKGRldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykgeworCQlscC0+aW5pdF9ibG9jay5waHlzX2FkZHJbaV0gPSBkZXYtPmRldl9hZGRyW2ldOworCX0KKworCWxwLT5pbml0X2Jsb2NrLm1vZGUgPSAweDAwMDA7CS8qIEVuYWJsZSB0aGUgVHggYW5kIFJ4ICovCit9CisKKworc3RhdGljIHZvaWQgZGVwY2FfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVfbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCXByaW50aygiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICUwNHgsIHJlc2V0dGluZy5cbiIsIGRldi0+bmFtZSwgaW53KERFUENBX0RBVEEpKTsKKworCVNUT1BfREVQQ0E7CisJZGVwY2FfaW5pdF9yaW5nKGRldik7CisJTG9hZENTUnMoZGV2KTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJSW5pdFJlc3RhcnREZXBjYShkZXYpOworfQorCisKKy8qIAorKiogV3JpdGVzIGEgc29ja2V0IGJ1ZmZlciB0byBUWCBkZXNjcmlwdG9yIHJpbmcgYW5kIHN0YXJ0cyB0cmFuc21pc3Npb24gCisqLworc3RhdGljIGludCBkZXBjYV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlcGNhX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBkZXBjYV9wcml2YXRlICopIGRldi0+cHJpdjsKKwl1X2xvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IHN0YXR1cyA9IDA7CisKKwkvKiBUcmFuc21pdHRlciB0aW1lb3V0LCBzZXJpb3VzIHByb2JsZW1zLiAqLworCWlmIChza2ItPmxlbiA8IDEpCisJCWdvdG8gb3V0OworCisJaWYgKHNrYi0+bGVuIDwgRVRIX1pMRU4pIHsKKwkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlnb3RvIG91dDsKKwl9CisJCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKFRYX0JVRkZTX0FWQUlMKSB7CS8qIEZpbGwgaW4gYSBUeCByaW5nIGVudHJ5ICovCisJCXN0YXR1cyA9IGxvYWRfcGFja2V0KGRldiwgc2tiKTsKKworCQlpZiAoIXN0YXR1cykgeworCQkJLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgc2VuZCBkZW1hbmQuICovCisJCQlvdXR3KENTUjAsIERFUENBX0FERFIpOworCQkJb3V0dyhJTkVBIHwgVERNRCwgREVQQ0FfREFUQSk7CisKKwkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQl9CisJCWlmIChUWF9CVUZGU19BVkFJTCkKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJfSBlbHNlCisJCXN0YXR1cyA9IC0xOworCisgICAgICBvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyoqIFRoZSBERVBDQSBpbnRlcnJ1cHQgaGFuZGxlci4gCisqLworc3RhdGljIGlycXJldHVybl90IGRlcGNhX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IGRlcGNhX3ByaXZhdGUgKmxwOworCXMxNiBjc3IwLCBuaWNzcjsKKwl1X2xvbmcgaW9hZGRyOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50aygiZGVwY2FfaW50ZXJydXB0KCk6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJbHAgPSAoc3RydWN0IGRlcGNhX3ByaXZhdGUgKikgZGV2LT5wcml2OworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJc3Bpbl9sb2NrKCZscC0+bG9jayk7CisKKwkvKiBtYXNrIHRoZSBERVBDQSBib2FyZCBpbnRlcnJ1cHRzIGFuZCB0dXJuIG9uIHRoZSBMRUQgKi8KKwluaWNzciA9IGluYihERVBDQV9OSUNTUik7CisJbmljc3IgfD0gKElNIHwgTEVEKTsKKwlvdXRiKG5pY3NyLCBERVBDQV9OSUNTUik7CisKKwlvdXR3KENTUjAsIERFUENBX0FERFIpOworCWNzcjAgPSBpbncoREVQQ0FfREFUQSk7CisKKwkvKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMgQVNBUC4gKi8KKwlvdXR3KGNzcjAgJiBJTlRFLCBERVBDQV9EQVRBKTsKKworCWlmIChjc3IwICYgUklOVCkJLyogUnggaW50ZXJydXB0IChwYWNrZXQgYXJyaXZlZCkgKi8KKwkJZGVwY2FfcngoZGV2KTsKKworCWlmIChjc3IwICYgVElOVCkJLyogVHggaW50ZXJydXB0IChwYWNrZXQgc2VudCkgKi8KKwkJZGVwY2FfdHgoZGV2KTsKKworCS8qIEFueSByZXNvdXJjZXMgYXZhaWxhYmxlPyAqLworCWlmICgoVFhfQlVGRlNfQVZBSUwgPj0gMCkgJiYgbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisKKwkvKiBVbm1hc2sgdGhlIERFUENBIGJvYXJkIGludGVycnVwdHMgYW5kIHR1cm4gb2ZmIHRoZSBMRUQgKi8KKwluaWNzciA9IChuaWNzciAmIH5JTSAmIH5MRUQpOworCW91dGIobmljc3IsIERFUENBX05JQ1NSKTsKKworCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBDYWxsZWQgd2l0aCBscC0+bG9jayBoZWxkICovCitzdGF0aWMgaW50IGRlcGNhX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlcGNhX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBkZXBjYV9wcml2YXRlICopIGRldi0+cHJpdjsKKwlpbnQgaSwgZW50cnk7CisJczMyIHN0YXR1czsKKworCWZvciAoZW50cnkgPSBscC0+cnhfbmV3OyAhKHJlYWRsKCZscC0+cnhfcmluZ1tlbnRyeV0uYmFzZSkgJiBSX09XTik7IGVudHJ5ID0gbHAtPnJ4X25ldykgeworCQlzdGF0dXMgPSByZWFkbCgmbHAtPnJ4X3JpbmdbZW50cnldLmJhc2UpID4+IDE2OworCQlpZiAoc3RhdHVzICYgUl9TVFApIHsJLyogUmVtZW1iZXIgc3RhcnQgb2YgZnJhbWUgKi8KKwkJCWxwLT5yeF9vbGQgPSBlbnRyeTsKKwkJfQorCQlpZiAoc3RhdHVzICYgUl9FTlApIHsJLyogVmFsaWQgZnJhbWUgc3RhdHVzICovCisJCQlpZiAoc3RhdHVzICYgUl9FUlIpIHsJLyogVGhlcmUgd2FzIGFuIGVycm9yLiAqLworCQkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsJLyogVXBkYXRlIHRoZSBlcnJvciBzdGF0cy4gKi8KKwkJCQlpZiAoc3RhdHVzICYgUl9GUkFNKQorCQkJCQlscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIFJfT0ZMTykKKwkJCQkJbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIFJfQ1JDKQorCQkJCQlscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiBSX0JVRkYpCisJCQkJCWxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJfSBlbHNlIHsKKwkJCQlzaG9ydCBsZW4sIHBrdF9sZW4gPSByZWFkdygmbHAtPnJ4X3JpbmdbZW50cnldLm1zZ19sZW5ndGgpIC0gNDsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMik7CisJCQkJaWYgKHNrYiAhPSBOVUxMKSB7CisJCQkJCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwkJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCisJCQkJCWJ1ZiA9IHNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKwkJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJCWlmIChlbnRyeSA8IGxwLT5yeF9vbGQpIHsJLyogV3JhcHBlZCBidWZmZXIgKi8KKwkJCQkJCWxlbiA9IChscC0+cnhSaW5nTWFzayAtIGxwLT5yeF9vbGQgKyAxKSAqIFJYX0JVRkZfU1o7CisJCQkJCQltZW1jcHlfZnJvbWlvKGJ1ZiwgbHAtPnJ4X2J1ZmZbbHAtPnJ4X29sZF0sIGxlbik7CisJCQkJCQltZW1jcHlfZnJvbWlvKGJ1ZiArIGxlbiwgbHAtPnJ4X2J1ZmZbMF0sIHBrdF9sZW4gLSBsZW4pOworCQkJCQl9IGVsc2UgewkvKiBMaW5lYXIgYnVmZmVyICovCisJCQkJCQltZW1jcHlfZnJvbWlvKGJ1ZiwgbHAtPnJ4X2J1ZmZbbHAtPnJ4X29sZF0sIHBrdF9sZW4pOworCQkJCQl9CisKKwkJCQkJLyogCisJCQkJCSAgICoqIE5vdGlmeSB0aGUgdXBwZXIgcHJvdG9jb2wgbGF5ZXJzIHRoYXQgdGhlcmUgaXMgYW5vdGhlciAKKwkJCQkJICAgKiogcGFja2V0IHRvIGhhbmRsZQorCQkJCQkgKi8KKwkJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCQkJbmV0aWZfcngoc2tiKTsKKworCQkJCQkvKgorCQkJCQkgICAqKiBVcGRhdGUgc3RhdHMKKwkJCQkJICovCisJCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQkJCQlmb3IgKGkgPSAxOyBpIDwgREVQQ0FfUEtUX1NUQVRfU1ogLSAxOyBpKyspIHsKKwkJCQkJCWlmIChwa3RfbGVuIDwgKGkgKiBERVBDQV9QS1RfQklOX1NaKSkgeworCQkJCQkJCWxwLT5wa3RTdGF0cy5iaW5zW2ldKys7CisJCQkJCQkJaSA9IERFUENBX1BLVF9TVEFUX1NaOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmIChidWZbMF0gJiAweDAxKSB7CS8qIE11bHRpY2FzdC9Ccm9hZGNhc3QgKi8KKwkJCQkJCWlmICgoKihzMTYgKikgJiBidWZbMF0gPT0gLTEpICYmICgqKHMxNiAqKSAmIGJ1ZlsyXSA9PSAtMSkgJiYgKCooczE2ICopICYgYnVmWzRdID09IC0xKSkgeworCQkJCQkJCWxwLT5wa3RTdGF0cy5icm9hZGNhc3QrKzsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJbHAtPnBrdFN0YXRzLm11bHRpY2FzdCsrOworCQkJCQkJfQorCQkJCQl9IGVsc2UgaWYgKCgqKHMxNiAqKSAmIGJ1ZlswXSA9PSAqKHMxNiAqKSAmIGRldi0+ZGV2X2FkZHJbMF0pICYmICgqKHMxNiAqKSAmIGJ1ZlsyXSA9PSAqKHMxNiAqKSAmIGRldi0+ZGV2X2FkZHJbMl0pICYmICgqKHMxNiAqKSAmIGJ1Zls0XSA9PSAqKHMxNiAqKSAmIGRldi0+ZGV2X2FkZHJbNF0pKSB7CisJCQkJCQlscC0+cGt0U3RhdHMudW5pY2FzdCsrOworCQkJCQl9CisKKwkJCQkJbHAtPnBrdFN0YXRzLmJpbnNbMF0rKzsJLyogRHVwbGljYXRlcyBzdGF0cy5yeF9wYWNrZXRzICovCisJCQkJCWlmIChscC0+cGt0U3RhdHMuYmluc1swXSA9PSAwKSB7CS8qIFJlc2V0IGNvdW50ZXJzICovCisJCQkJCQltZW1zZXQoKGNoYXIgKikgJmxwLT5wa3RTdGF0cywgMCwgc2l6ZW9mKGxwLT5wa3RTdGF0cykpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRrKCIlczogTWVtb3J5IHNxdWVlemUsIGRlZmVycmluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCQkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOwkvKiBSZWFsbHksIGRlZmVycmVkLiAqLworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQkvKiBDaGFuZ2UgYnVmZmVyIG93bmVyc2hpcCBmb3IgdGhpcyBsYXN0IGZyYW1lLCBiYWNrIHRvIHRoZSBhZGFwdGVyICovCisJCQlmb3IgKDsgbHAtPnJ4X29sZCAhPSBlbnRyeTsgbHAtPnJ4X29sZCA9ICgrK2xwLT5yeF9vbGQpICYgbHAtPnJ4UmluZ01hc2spIHsKKwkJCQl3cml0ZWwocmVhZGwoJmxwLT5yeF9yaW5nW2xwLT5yeF9vbGRdLmJhc2UpIHwgUl9PV04sICZscC0+cnhfcmluZ1tscC0+cnhfb2xkXS5iYXNlKTsKKwkJCX0KKwkJCXdyaXRlbChyZWFkbCgmbHAtPnJ4X3JpbmdbZW50cnldLmJhc2UpIHwgUl9PV04sICZscC0+cnhfcmluZ1tlbnRyeV0uYmFzZSk7CisJCX0KKworCQkvKgorCQkgICAqKiBVcGRhdGUgZW50cnkgaW5mb3JtYXRpb24KKwkJICovCisJCWxwLT5yeF9uZXcgPSAoKytscC0+cnhfbmV3KSAmIGxwLT5yeFJpbmdNYXNrOworCX0KKworCXJldHVybiAwOworfQorCisvKgorKiogQnVmZmVyIHNlbnQgLSBjaGVjayBmb3IgYnVmZmVyIGVycm9ycy4KKyoqIENhbGxlZCB3aXRoIGxwLT5sb2NrIGhlbGQKKyovCitzdGF0aWMgaW50IGRlcGNhX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlcGNhX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBkZXBjYV9wcml2YXRlICopIGRldi0+cHJpdjsKKwlpbnQgZW50cnk7CisJczMyIHN0YXR1czsKKwl1X2xvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlmb3IgKGVudHJ5ID0gbHAtPnR4X29sZDsgZW50cnkgIT0gbHAtPnR4X25ldzsgZW50cnkgPSBscC0+dHhfb2xkKSB7CisJCXN0YXR1cyA9IHJlYWRsKCZscC0+dHhfcmluZ1tlbnRyeV0uYmFzZSkgPj4gMTY7CisKKwkJaWYgKHN0YXR1cyA8IDApIHsJLyogUGFja2V0IG5vdCB5ZXQgc2VudCEgKi8KKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIFRfRVJSKSB7CS8qIEFuIGVycm9yIG9jY3VycmVkLiAqLworCQkJc3RhdHVzID0gcmVhZGwoJmxwLT50eF9yaW5nW2VudHJ5XS5taXNjKTsKKwkJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBUTUQzX1JUUlkpCisJCQkJbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgVE1EM19MQ0FSKQorCQkJCWxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIFRNRDNfTENPTCkKKwkJCQlscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIFRNRDNfVUZMTykKKwkJCQlscC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiAoVE1EM19CVUZGIHwgVE1EM19VRkxPKSkgeworCQkJCS8qIFRyaWdnZXIgYW4gaW1tZWRpYXRlIHNlbmQgZGVtYW5kLiAqLworCQkJCW91dHcoQ1NSMCwgREVQQ0FfQUREUik7CisJCQkJb3V0dyhJTkVBIHwgVERNRCwgREVQQ0FfREFUQSk7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RhdHVzICYgKFRfTU9SRSB8IFRfT05FKSkgeworCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJfSBlbHNlIHsKKwkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCX0KKworCQkvKiBVcGRhdGUgYWxsIHRoZSBwb2ludGVycyAqLworCQlscC0+dHhfb2xkID0gKCsrbHAtPnR4X29sZCkgJiBscC0+dHhSaW5nTWFzazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZXBjYV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXBjYV9wcml2YXRlICpscCA9IChzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJczE2IG5pY3NyOworCXVfbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCW91dHcoQ1NSMCwgREVQQ0FfQUREUik7CisKKwlpZiAoZGVwY2FfZGVidWcgPiAxKSB7CisJCXByaW50aygiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLCBzdGF0dXMgd2FzICUyLjJ4LlxuIiwgZGV2LT5uYW1lLCBpbncoREVQQ0FfREFUQSkpOworCX0KKworCS8qIAorCSAgICoqIFdlIHN0b3AgdGhlIERFUENBIGhlcmUgLS0gaXQgb2NjYXNpb25hbGx5IHBvbGxzCisJICAgKiogbWVtb3J5IGlmIHdlIGRvbid0LiAKKwkgKi8KKwlvdXR3KFNUT1AsIERFUENBX0RBVEEpOworCisJLyoKKwkgICAqKiBHaXZlIGJhY2sgdGhlIFJPTSBpbiBjYXNlIHRoZSB1c2VyIHdhbnRzIHRvIGdvIHRvIERPUworCSAqLworCWlmIChscC0+YWRhcHRlciAhPSBERVBDQSkgeworCQluaWNzciA9IGluYihERVBDQV9OSUNTUik7CisJCW5pY3NyICY9IH5TSEU7CisJCW91dGIobmljc3IsIERFUENBX05JQ1NSKTsKKwl9CisKKwkvKgorCSAgICoqIEZyZWUgdGhlIGFzc29jaWF0ZWQgaXJxCisJICovCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIExvYWRDU1JzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlcGNhX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBkZXBjYV9wcml2YXRlICopIGRldi0+cHJpdjsKKwl1X2xvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlvdXR3KENTUjEsIERFUENBX0FERFIpOwkvKiBpbml0aWFsaXNhdGlvbiBibG9jayBhZGRyZXNzIExTVyAqLworCW91dHcoKHUxNikgbHAtPmRldmljZV9yYW1fc3RhcnQsIERFUENBX0RBVEEpOworCW91dHcoQ1NSMiwgREVQQ0FfQUREUik7CS8qIGluaXRpYWxpc2F0aW9uIGJsb2NrIGFkZHJlc3MgTVNXICovCisJb3V0dygodTE2KSAobHAtPmRldmljZV9yYW1fc3RhcnQgPj4gMTYpLCBERVBDQV9EQVRBKTsKKwlvdXR3KENTUjMsIERFUENBX0FERFIpOwkvKiBBTEUgY29udHJvbCAqLworCW91dHcoQUNPTiwgREVQQ0FfREFUQSk7CisKKwlvdXR3KENTUjAsIERFUENBX0FERFIpOwkvKiBQb2ludCBiYWNrIHRvIENTUjAgKi8KKworCXJldHVybjsKK30KKworc3RhdGljIGludCBJbml0UmVzdGFydERlcGNhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlcGNhX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBkZXBjYV9wcml2YXRlICopIGRldi0+cHJpdjsKKwl1X2xvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGksIHN0YXR1cyA9IDA7CisKKwkvKiBDb3B5IHRoZSBzaGFkb3cgaW5pdF9ibG9jayB0byBzaGFyZWQgbWVtb3J5ICovCisJbWVtY3B5X3RvaW8obHAtPnNoX21lbSwgJmxwLT5pbml0X2Jsb2NrLCBzaXplb2Yoc3RydWN0IGRlcGNhX2luaXQpKTsKKworCW91dHcoQ1NSMCwgREVQQ0FfQUREUik7CS8qIHBvaW50IGJhY2sgdG8gQ1NSMCAqLworCW91dHcoSU5JVCwgREVQQ0FfREFUQSk7CS8qIGluaXRpYWxpemUgREVQQ0EgKi8KKworCS8qIHdhaXQgZm9yIGxhbmNlIHRvIGNvbXBsZXRlIGluaXRpYWxpc2F0aW9uICovCisJZm9yIChpID0gMDsgKGkgPCAxMDApICYmICEoaW53KERFUENBX0RBVEEpICYgSURPTik7IGkrKyk7CisKKwlpZiAoaSAhPSAxMDApIHsKKwkJLyogY2xlYXIgSURPTiBieSB3cml0aW5nIGEgIjEiLCBlbmFibGUgaW50ZXJydXB0cyBhbmQgc3RhcnQgbGFuY2UgKi8KKwkJb3V0dyhJRE9OIHwgSU5FQSB8IFNUUlQsIERFUENBX0RBVEEpOworCQlpZiAoZGVwY2FfZGVidWcgPiAyKSB7CisJCQlwcmludGsoIiVzOiBERVBDQSBvcGVuIGFmdGVyICVkIHRpY2tzLCBpbml0IGJsb2NrIDB4JTA4bHggY3NyMCAlNC40eC5cbiIsIGRldi0+bmFtZSwgaSwgbHAtPm1lbV9zdGFydCwgaW53KERFUENBX0RBVEEpKTsKKwkJfQorCX0gZWxzZSB7CisJCXByaW50aygiJXM6IERFUENBIHVub3BlbiBhZnRlciAlZCB0aWNrcywgaW5pdCBibG9jayAweCUwOGx4IGNzcjAgJTQuNHguXG4iLCBkZXYtPm5hbWUsIGksIGxwLT5tZW1fc3RhcnQsIGludyhERVBDQV9EQVRBKSk7CisJCXN0YXR1cyA9IC0xOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZGVwY2FfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlcGNhX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBkZXBjYV9wcml2YXRlICopIGRldi0+cHJpdjsKKworCS8qIE51bGwgYm9keSBzaW5jZSB0aGVyZSBpcyBubyBmcmFtaW5nIGVycm9yIGNvdW50ZXIgKi8KKworCXJldHVybiAmbHAtPnN0YXRzOworfQorCisvKgorKiogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisqLworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlcGNhX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBkZXBjYV9wcml2YXRlICopIGRldi0+cHJpdjsKKwl1X2xvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoZGV2KSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJd2hpbGUgKGxwLT50eF9vbGQgIT0gbHAtPnR4X25ldyk7CS8qIFdhaXQgZm9yIHRoZSByaW5nIHRvIGVtcHR5ICovCisKKwkJU1RPUF9ERVBDQTsJLyogVGVtcG9yYXJpbHkgc3RvcCB0aGUgZGVwY2EuICAqLworCQlkZXBjYV9pbml0X3JpbmcoZGV2KTsJLyogSW5pdGlhbGl6ZSB0aGUgZGVzY3JpcHRvciByaW5ncyAqLworCisJCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsJLyogU2V0IHByb21pc2N1b3VzIG1vZGUgKi8KKwkJCWxwLT5pbml0X2Jsb2NrLm1vZGUgfD0gUFJPTTsKKwkJfSBlbHNlIHsKKwkJCVNldE11bHRpY2FzdEZpbHRlcihkZXYpOworCQkJbHAtPmluaXRfYmxvY2subW9kZSAmPSB+UFJPTTsJLyogVW5zZXQgcHJvbWlzY3VvdXMgbW9kZSAqLworCQl9CisKKwkJTG9hZENTUnMoZGV2KTsJLyogUmVsb2FkIENTUjMgKi8KKwkJSW5pdFJlc3RhcnREZXBjYShkZXYpOwkvKiBSZXN1bWUgbm9ybWFsIG9wZXJhdGlvbi4gKi8KKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsJLyogVW5sb2NrIHRoZSBUWCByaW5nICovCisJfQorfQorCisvKgorKiogQ2FsY3VsYXRlIHRoZSBoYXNoIGNvZGUgYW5kIHVwZGF0ZSB0aGUgbG9naWNhbCBhZGRyZXNzIGZpbHRlcgorKiogZnJvbSBhIGxpc3Qgb2YgZXRoZXJuZXQgbXVsdGljYXN0IGFkZHJlc3Nlcy4KKyoqIEJpZyBlbmRpYW4gY3JjIG9uZSBsaW5lciBpcyBtaW5lLCBhbGwgbWluZSwgaGEgaGEgaGEgaGEhCisqKiBMQU5DRSBjYWxjdWxhdGVzIGl0cyBoYXNoIGNvZGVzIGJpZyBlbmRpYW4uCisqLworc3RhdGljIHZvaWQgU2V0TXVsdGljYXN0RmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlcGNhX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBkZXBjYV9wcml2YXRlICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IGRldi0+bWNfbGlzdDsKKwljaGFyICphZGRyczsKKwlpbnQgaSwgaiwgYml0LCBieXRlOworCXUxNiBoYXNoY29kZTsKKwl1MzIgY3JjOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsJLyogU2V0IGFsbCBtdWx0aWNhc3QgYml0cyAqLworCQlmb3IgKGkgPSAwOyBpIDwgKEhBU0hfVEFCTEVfTEVOID4+IDMpOyBpKyspIHsKKwkJCWxwLT5pbml0X2Jsb2NrLm1jYXN0X3RhYmxlW2ldID0gKGNoYXIpIDB4ZmY7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgKEhBU0hfVEFCTEVfTEVOID4+IDMpOyBpKyspIHsJLyogQ2xlYXIgdGhlIG11bHRpY2FzdCB0YWJsZSAqLworCQkJbHAtPmluaXRfYmxvY2subWNhc3RfdGFibGVbaV0gPSAwOworCQl9CisJCS8qIEFkZCBtdWx0aWNhc3QgYWRkcmVzc2VzICovCisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyspIHsJLyogZm9yIGVhY2ggYWRkcmVzcyBpbiB0aGUgbGlzdCAqLworCQkJYWRkcnMgPSBkbWktPmRtaV9hZGRyOworCQkJZG1pID0gZG1pLT5uZXh0OworCQkJaWYgKCgqYWRkcnMgJiAweDAxKSA9PSAxKSB7CS8qIG11bHRpY2FzdCBhZGRyZXNzPyAqLworCQkJCWNyYyA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgYWRkcnMpOworCQkJCWhhc2hjb2RlID0gKGNyYyAmIDEpOwkvKiBoYXNoY29kZSBpcyA2IExTYiBvZiBDUkMgLi4uICovCisJCQkJZm9yIChqID0gMDsgaiA8IDU7IGorKykgewkvKiAuLi4gaW4gcmV2ZXJzZSBvcmRlci4gKi8KKwkJCQkJaGFzaGNvZGUgPSAoaGFzaGNvZGUgPDwgMSkgfCAoKGNyYyA+Pj0gMSkgJiAxKTsKKwkJCQl9CisKKworCQkJCWJ5dGUgPSBoYXNoY29kZSA+PiAzOwkvKiBiaXRbMy01XSAtPiBieXRlIGluIGZpbHRlciAqLworCQkJCWJpdCA9IDEgPDwgKGhhc2hjb2RlICYgMHgwNyk7CS8qIGJpdFswLTJdIC0+IGJpdCBpbiBieXRlICovCisJCQkJbHAtPmluaXRfYmxvY2subWNhc3RfdGFibGVbYnl0ZV0gfD0gYml0OworCQkJfQorCQl9CisJfQorCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkZXBjYV9jb21tb25faW5pdCAodV9sb25nIGlvYWRkciwgc3RydWN0IG5ldF9kZXZpY2UgKipkZXZwKQoreworCWludCBzdGF0dXMgPSAwOworCQorCWlmICghcmVxdWVzdF9yZWdpb24gKGlvYWRkciwgREVQQ0FfVE9UQUxfU0laRSwgZGVwY2Ffc3RyaW5nKSkgeworCQlzdGF0dXMgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKwkKKwlpZiAoRGV2aWNlUHJlc2VudChpb2FkZHIpKSB7CisJCXN0YXR1cyA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3JlbGVhc2U7CisJfQorCisJaWYgKCEoKmRldnAgPSBhbGxvY19ldGhlcmRldiAoc2l6ZW9mIChzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSkpKSkgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIG91dF9yZWxlYXNlOworCX0KKworCXJldHVybiAwOworCQorIG91dF9yZWxlYXNlOgorCXJlbGVhc2VfcmVnaW9uIChpb2FkZHIsIERFUENBX1RPVEFMX1NJWkUpOworIG91dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisjaWZkZWYgQ09ORklHX01DQQorLyoKKyoqIE1pY3JvY2hhbm5lbCBidXMgSS9PIGRldmljZSBwcm9iZQorKi8KK3N0YXRpYyBpbnQgX19pbml0IGRlcGNhX21jYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJdW5zaWduZWQgY2hhciBwb3NbMl07CisJdW5zaWduZWQgY2hhciB3aGVyZTsKKwl1bnNpZ25lZCBsb25nIGlvYmFzZSwgbWVtX3N0YXJ0OworCWludCBpcnEsIGVycjsKKwlzdHJ1Y3QgbWNhX2RldmljZSAqbWRldiA9IHRvX21jYV9kZXZpY2UgKGRldmljZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqbHA7CisKKwkvKgorCSoqIFNlYXJjaCBmb3IgdGhlIGFkYXB0ZXIuICBJZiBhbiBhZGRyZXNzIGhhcyBiZWVuIGdpdmVuLCBzZWFyY2ggCisJKiogc3BlY2lmaWNhbGx5IGZvciB0aGUgY2FyZCBhdCB0aGF0IGFkZHJlc3MuICBPdGhlcndpc2UgZmluZCB0aGUKKwkqKiBmaXJzdCBjYXJkIGluIHRoZSBzeXN0ZW0uCisJKi8KKwkKKwlwb3NbMF0gPSBtY2FfZGV2aWNlX3JlYWRfc3RvcmVkX3BvcyhtZGV2LCAyKTsKKwlwb3NbMV0gPSBtY2FfZGV2aWNlX3JlYWRfc3RvcmVkX3BvcyhtZGV2LCAzKTsKKworCS8qCisJKiogSU8gb2YgY2FyZCBpcyBoYW5kbGVkIGJ5IGJpdHMgMSBhbmQgMiBvZiBwb3MwLiAgICAKKwkqKgorCSoqICAgIGJpdDIgYml0MSAgICBJTworCSoqICAgICAgIDAgICAgMCAgICAweDJjMDAKKwkqKiAgICAgICAwICAgIDEgICAgMHgyYzEwCisJKiogICAgICAgMSAgICAwICAgIDB4MmMyMAorCSoqICAgICAgIDEgICAgMSAgICAweDJjMzAKKwkqLworCXdoZXJlID0gKHBvc1swXSAmIDYpID4+IDE7CisJaW9iYXNlID0gMHgyYzAwICsgKDB4MTAgKiB3aGVyZSk7CisKKwkvKgorCSoqIEZvdW5kIHRoZSBhZGFwdGVyIHdlIHdlcmUgbG9va2luZyBmb3IuIE5vdyBzdGFydCBzZXR0aW5nIGl0IHVwLgorCSoqIAorCSoqIEZpcnN0IHdvcmsgb24gZGVjb2RpbmcgdGhlIElSUS4gIEl0J3Mgc3RvcmVkIGluIHRoZSBsb3dlciA0IGJpdHMKKwkqKiBvZiBwb3MxLiAgQml0cyBhcmUgYXMgZm9sbG93cyAoZnJvbSB0aGUgQURGIGZpbGUpOgorCSoqCisJKiogICAgICBCaXRzICAgICAgICAgICAKKwkqKiAgIDMgICAyICAgMSAgIDAgICAgSVJRIAorCSoqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkqKiAgIDAgICAwICAgMSAgIDAgICAgIDUKKwkqKiAgIDAgICAwICAgMCAgIDEgICAgIDkKKwkqKiAgIDAgICAxICAgMCAgIDAgICAgMTAKKwkqKiAgIDEgICAwICAgMCAgIDAgICAgMTEKKwkqLworCXdoZXJlID0gcG9zWzFdICYgMHgwZjsKKwlzd2l0Y2ggKHdoZXJlKSB7CisJY2FzZSAxOgorCQlpcnEgPSA5OworCQlicmVhazsKKwljYXNlIDI6CisJCWlycSA9IDU7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJaXJxID0gMTA7CisJCWJyZWFrOworCWNhc2UgODoKKwkJaXJxID0gMTE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygiJXM6IG1jYV9wcm9iZSBJUlEgZXJyb3IuICBZb3Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlICglZCkuXG4iLCBkZXYtPm5hbWUsIHdoZXJlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkqKiBTaGFyZWQgbWVtb3J5IGFkZHJlc3Mgb2YgYWRhcHRlciBpcyBzdG9yZWQgaW4gYml0cyAzLTUgb2YgcG9zMC4KKwkqKiBUaGV5IGFyZSBtYXBwZWQgYXMgZm9sbG93czoKKwkqKgorCSoqICAgIEJpdAorCSoqICAgNSAgNCAgMyAgICAgICBNZW1vcnkgQWRkcmVzc2VzCisJKiogICAwICAwICAwICAgICAgIEMwMDAwLUNGRkZGICg2NEspCisJKiogICAxICAwICAwICAgICAgIEM4MDAwLUNGRkZGICgzMkspCisJKiogICAwICAwICAxICAgICAgIEQwMDAwLURGRkZGICg2NEspCisJKiogICAxICAwICAxICAgICAgIEQ4MDAwLURGRkZGICgzMkspCisJKiogICAwICAxICAwICAgICAgIEUwMDAwLUVGRkZGICg2NEspCisJKiogICAxICAxICAwICAgICAgIEU4MDAwLUVGRkZGICgzMkspCisJKi8KKwl3aGVyZSA9IChwb3NbMF0gJiAweDE4KSA+PiAzOworCW1lbV9zdGFydCA9IDB4YzAwMDAgKyAod2hlcmUgKiAweDEwMDAwKTsKKwlpZiAocG9zWzBdICYgMHgyMCkgeworCQltZW1fc3RhcnQgKz0gMHg4MDAwOworCX0KKworCS8qIGNsYWltIHRoZSBzbG90ICovCisJc3RybmNweShtZGV2LT5uYW1lLCBkZXBjYV9tY2FfYWRhcHRlcl9uYW1lW21kZXYtPmluZGV4XSwKKwkJc2l6ZW9mKG1kZXYtPm5hbWUpKTsKKwltY2FfZGV2aWNlX3NldF9jbGFpbShtZGV2LCAxKTsKKwkKKyAgICAgICAgLyoKKwkqKiBHZXQgZXZlcnl0aGluZyBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkLi4uICAoYWxtb3N0IGp1c3QKKwkqKiBsaWtlIHRoZSBJU0EgYW5kIEVJU0EgcHJvYmVzKQorCSovCisJaXJxID0gbWNhX2RldmljZV90cmFuc2Zvcm1faXJxKG1kZXYsIGlycSk7CisJaW9iYXNlID0gbWNhX2RldmljZV90cmFuc2Zvcm1faW9wb3J0KG1kZXYsIGlvYmFzZSk7CisKKwlpZiAoKGVyciA9IGRlcGNhX2NvbW1vbl9pbml0IChpb2Jhc2UsICZkZXYpKSkKKwkJZ290byBvdXRfdW5jbGFpbTsKKworCWRldi0+aXJxID0gaXJxOworCWRldi0+YmFzZV9hZGRyID0gaW9iYXNlOworCWxwID0gZGV2LT5wcml2OworCWxwLT5kZXBjYV9idXMgPSBERVBDQV9CVVNfTUNBOworCWxwLT5hZGFwdGVyID0gZGVwY2FfbWNhX2FkYXB0ZXJfdHlwZVttZGV2LT5pbmRleF07CisJbHAtPm1lbV9zdGFydCA9IG1lbV9zdGFydDsKKwkKKwlpZiAoKGVyciA9IGRlcGNhX2h3X2luaXQoZGV2LCBkZXZpY2UpKSkKKwkJZ290byBvdXRfZnJlZTsKKwkJCQorCXJldHVybiAwOworCisgb3V0X2ZyZWU6CisJZnJlZV9uZXRkZXYgKGRldik7CisJcmVsZWFzZV9yZWdpb24gKGlvYmFzZSwgREVQQ0FfVE9UQUxfU0laRSk7Cisgb3V0X3VuY2xhaW06CisJbWNhX2RldmljZV9zZXRfY2xhaW0obWRldiwgMCk7CisKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKKy8qCisqKiBJU0EgYnVzIEkvTyBkZXZpY2UgcHJvYmUKKyovCisKK3N0YXRpYyB2b2lkIGRlcGNhX3BsYXRmb3JtX3JlbGVhc2UgKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGRldjsKKworCS8qIGZyZWUgZGV2aWNlICovCisJcGxkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UgKGRldmljZSk7CisJa2ZyZWUgKHBsZGV2KTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGRlcGNhX3BsYXRmb3JtX3Byb2JlICh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsZGV2OworCisJZm9yIChpID0gMDsgZGVwY2FfaW9fcG9ydHNbaV0uaW9iYXNlOyBpKyspIHsKKwkJZGVwY2FfaW9fcG9ydHNbaV0uZGV2aWNlID0gTlVMTDsKKwkJCisJCS8qIGlmIGFuIGFkZHJlc3MgaGFzIGJlZW4gc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kCisJCSAqIGxpbmUsIHVzZSBpdCAoaWYgdmFsaWQpICovCisJCWlmIChpbyAmJiBpbyAhPSBkZXBjYV9pb19wb3J0c1tpXS5pb2Jhc2UpCisJCQljb250aW51ZTsKKwkJCisJCWlmICghKHBsZGV2ID0ga21hbGxvYyAoc2l6ZW9mICgqcGxkZXYpLCBHRlBfS0VSTkVMKSkpCisJCQljb250aW51ZTsKKworCQltZW1zZXQgKHBsZGV2LCAwLCBzaXplb2YgKCpwbGRldikpOworCQlwbGRldi0+bmFtZSA9IGRlcGNhX3N0cmluZzsKKwkJcGxkZXYtPmlkICAgPSBpOworCQlwbGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSAodm9pZCAqKSBkZXBjYV9pb19wb3J0c1tpXS5pb2Jhc2U7CisJCXBsZGV2LT5kZXYucmVsZWFzZSAgICAgICA9IGRlcGNhX3BsYXRmb3JtX3JlbGVhc2U7CisJCWRlcGNhX2lvX3BvcnRzW2ldLmRldmljZSA9IHBsZGV2OworCisJCWlmIChwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIgKHBsZGV2KSkgeworCQkJa2ZyZWUgKHBsZGV2KTsKKwkJCWRlcGNhX2lvX3BvcnRzW2ldLmRldmljZSA9IE5VTEw7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghcGxkZXYtPmRldi5kcml2ZXIpIHsKKwkJLyogVGhlIGRyaXZlciB3YXMgbm90IGJvdW5kIHRvIHRoaXMgZGV2aWNlLCB0aGVyZSB3YXMKKwkJICogbm8gaGFyZHdhcmUgYXQgdGhpcyBhZGRyZXNzLiBVbnJlZ2lzdGVyIGl0LCBhcyB0aGUKKwkJICogcmVsZWFzZSBmdWN0aW9uIHdpbGwgdGFrZSBjYXJlIG9mIGZyZWVpbmcgdGhlCisJCSAqIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgKi8KKwkJCQorCQkJZGVwY2FfaW9fcG9ydHNbaV0uZGV2aWNlID0gTlVMTDsKKwkJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyIChwbGRldik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBlbnVtIGRlcGNhX3R5cGUgX19pbml0IGRlcGNhX3NobWVtX3Byb2JlICh1bG9uZyAqbWVtX3N0YXJ0KQoreworCXVfbG9uZyBtZW1fYmFzZVtdID0gREVQQ0FfUkFNX0JBU0VfQUREUkVTU0VTOworCWVudW0gZGVwY2FfdHlwZSBhZGFwdGVyID0gdW5rbm93bjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IG1lbV9iYXNlW2ldOyBpKyspIHsKKwkJKm1lbV9zdGFydCA9IG1lbSA/IG1lbSA6IG1lbV9iYXNlW2ldOworCQlhZGFwdGVyID0gRGVwY2FTaWduYXR1cmUgKGFkYXB0ZXJfbmFtZSwgKm1lbV9zdGFydCk7CisJCWlmIChhZGFwdGVyICE9IHVua25vd24pCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gYWRhcHRlcjsKK30KKworc3RhdGljIGludCBfX2luaXQgZGVwY2FfaXNhX3Byb2JlIChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqbHA7CisJdV9sb25nIGlvYWRkciwgbWVtX3N0YXJ0ID0gMDsKKwllbnVtIGRlcGNhX3R5cGUgYWRhcHRlciA9IHVua25vd247CisJaW50IHN0YXR1cyA9IDA7CisKKwlpb2FkZHIgPSAodV9sb25nKSBkZXZpY2UtPnBsYXRmb3JtX2RhdGE7CisKKwlpZiAoKHN0YXR1cyA9IGRlcGNhX2NvbW1vbl9pbml0IChpb2FkZHIsICZkZXYpKSkKKwkJZ290byBvdXQ7CisKKwlhZGFwdGVyID0gZGVwY2Ffc2htZW1fcHJvYmUgKCZtZW1fc3RhcnQpOworCQorCWlmIChhZGFwdGVyID09IHVua25vd24pIHsKKwkJc3RhdHVzID0gLUVOT0RFVjsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwlkZXYtPmlycSA9IGlycTsJCS8qIFVzZSB3aGF0ZXZlciB2YWx1ZSB0aGUgdXNlciBnYXZlCisJCQkJICogdXMsIGFuZCAwIGlmIGhlIGRpZG4ndC4gKi8KKwlscCA9IGRldi0+cHJpdjsKKwlscC0+ZGVwY2FfYnVzID0gREVQQ0FfQlVTX0lTQTsKKwlscC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbHAtPm1lbV9zdGFydCA9IG1lbV9zdGFydDsKKwkKKwlpZiAoKHN0YXR1cyA9IGRlcGNhX2h3X2luaXQoZGV2LCBkZXZpY2UpKSkKKwkJZ290byBvdXRfZnJlZTsKKwkKKwlyZXR1cm4gMDsKKworIG91dF9mcmVlOgorCWZyZWVfbmV0ZGV2IChkZXYpOworCXJlbGVhc2VfcmVnaW9uIChpb2FkZHIsIERFUENBX1RPVEFMX1NJWkUpOworIG91dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorKiogRUlTQSBjYWxsYmFja3MgZnJvbSBzeXNmcy4KKyovCisKKyNpZmRlZiBDT05GSUdfRUlTQQorc3RhdGljIGludCBfX2luaXQgZGVwY2FfZWlzYV9wcm9iZSAoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBlaXNhX2RldmljZSAqZWRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBkZXBjYV9wcml2YXRlICpscDsKKwl1X2xvbmcgaW9hZGRyLCBtZW1fc3RhcnQ7CisJaW50IHN0YXR1cyA9IDA7CisKKwllZGV2ID0gdG9fZWlzYV9kZXZpY2UgKGRldmljZSk7CisJaW9hZGRyID0gZWRldi0+YmFzZV9hZGRyICsgREVQQ0FfRUlTQV9JT19QT1JUUzsKKworCWlmICgoc3RhdHVzID0gZGVwY2FfY29tbW9uX2luaXQgKGlvYWRkciwgJmRldikpKQorCQlnb3RvIG91dDsKKworCS8qIEl0IHdvdWxkIGhhdmUgYmVlbiBuaWNlIHRvIGdldCBjYXJkIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUKKwkgKiBjYXJkLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIHJlZ2lzdGVyIGlzIHdyaXRlLW9ubHkgKHNoYXJlcworCSAqIGl0J3MgYWRkcmVzcyB3aXRoIHRoZSBldGhlcm5ldCBwcm9tKS4uLiBBcyB3ZSBkb24ndCBwYXJzZQorCSAqIHRoZSBFSVNBIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlcyAoeWV0Li4uIDotKSwganVzdCByZWx5IG9uCisJICogdGhlIElTQSBwcm9iaW5nIHRvIHNvcnQgaXQgb3V0Li4uICovCisJCisJZGVwY2Ffc2htZW1fcHJvYmUgKCZtZW1fc3RhcnQpOworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJZGV2LT5pcnEgPSBpcnE7CisJbHAgPSBkZXYtPnByaXY7CisJbHAtPmRlcGNhX2J1cyA9IERFUENBX0JVU19FSVNBOworCWxwLT5hZGFwdGVyID0gZWRldi0+aWQuZHJpdmVyX2RhdGE7CisJbHAtPm1lbV9zdGFydCA9IG1lbV9zdGFydDsKKwkKKwlpZiAoKHN0YXR1cyA9IGRlcGNhX2h3X2luaXQoZGV2LCBkZXZpY2UpKSkKKwkJZ290byBvdXRfZnJlZTsKKwkKKwlyZXR1cm4gMDsKKworIG91dF9mcmVlOgorCWZyZWVfbmV0ZGV2IChkZXYpOworCXJlbGVhc2VfcmVnaW9uIChpb2FkZHIsIERFUENBX1RPVEFMX1NJWkUpOworIG91dDoKKwlyZXR1cm4gc3RhdHVzOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGRlcGNhX2RldmljZV9yZW1vdmUgKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBkZXBjYV9wcml2YXRlICpscDsKKwlpbnQgYnVzOworCisJZGV2ICA9IGRldmljZS0+ZHJpdmVyX2RhdGE7CisJbHAgICA9IGRldi0+cHJpdjsKKworCXVucmVnaXN0ZXJfbmV0ZGV2IChkZXYpOworCWlvdW5tYXAgKGxwLT5zaF9tZW0pOworCXJlbGVhc2VfbWVtX3JlZ2lvbiAobHAtPm1lbV9zdGFydCwgbHAtPm1lbV9sZW4pOworCXJlbGVhc2VfcmVnaW9uIChkZXYtPmJhc2VfYWRkciwgREVQQ0FfVE9UQUxfU0laRSk7CisJYnVzID0gbHAtPmRlcGNhX2J1czsKKwlmcmVlX25ldGRldiAoZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorKiogTG9vayBmb3IgYSBwYXJ0aWN1bGFyIGJvYXJkIG5hbWUgaW4gdGhlIG9uLWJvYXJkIFJlbW90ZSBEaWFnbm9zdGljcworKiogYW5kIEJvb3QgKHJlYWRiKSBST00uIFRoaXMgd2lsbCBhbHNvIGdpdmUgdXMgYSBjbHVlIHRvIHRoZSBuZXR3b3JrIFJBTQorKiogYmFzZSBhZGRyZXNzLgorKi8KK3N0YXRpYyBpbnQgX19pbml0IERlcGNhU2lnbmF0dXJlKGNoYXIgKm5hbWUsIHVfbG9uZyBiYXNlX2FkZHIpCit7CisJdV9pbnQgaSwgaiwgazsKKwl2b2lkIF9faW9tZW0gKnB0cjsKKwljaGFyIHRtcHN0clsxNl07CisJdV9sb25nIHByb21fYWRkciA9IGJhc2VfYWRkciArIDB4YzAwMDsKKwl1X2xvbmcgbWVtX2FkZHIgPSBiYXNlX2FkZHIgKyAweDgwMDA7IC8qIDMyS0IgKi8KKworCS8qIENhbid0IHJlc2VydmUgdGhlIHByb20gcmVnaW9uLCBpdCBpcyBhbHJlYWR5IG1hcmtlZCBhcworCSAqIHVzZWQsIGF0IGxlYXN0IG9uIHg4Ni4gSW5zdGVhZCwgcmVzZXJ2ZSBhIG1lbW9yeSByZWdpb24gYQorCSAqIGJvYXJkIHdvdWxkIGNlcnRhaW5seSB1c2UuIElmIGl0IHdvcmtzLCBnbyBhaGVhZC4gSWYgbm90LAorCSAqIHJ1biBsaWtlIGhlbGwuLi4gKi8KKwkKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbiAobWVtX2FkZHIsIDE2LCBkZXBjYV9zdHJpbmcpKQorCQlyZXR1cm4gdW5rbm93bjsKKworCS8qIENvcHkgdGhlIGZpcnN0IDE2IGJ5dGVzIG9mIFJPTSAqLworCisJcHRyID0gaW9yZW1hcChwcm9tX2FkZHIsIDE2KTsKKwlpZiAocHRyID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkZXBjYTogSS9PIHJlbWFwIGZhaWxlZCBhdCAlbHhcbiIsIHByb21fYWRkcik7CisJCXJldHVybiB1bmtub3duOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQl0bXBzdHJbaV0gPSByZWFkYihwdHIgKyBpKTsKKwl9CisJaW91bm1hcChwdHIpOworCisJcmVsZWFzZV9tZW1fcmVnaW9uIChtZW1fYWRkciwgMTYpOworCisJLyogQ2hlY2sgaWYgUFJPTSBjb250YWlucyBhIHZhbGlkIHN0cmluZyAqLworCWZvciAoaSA9IDA7ICpkZXBjYV9zaWduYXR1cmVbaV0gIT0gJ1wwJzsgaSsrKSB7CisJCWZvciAoaiA9IDAsIGsgPSAwOyBqIDwgMTYgJiYgayA8IHN0cmxlbihkZXBjYV9zaWduYXR1cmVbaV0pOyBqKyspIHsKKwkJCWlmIChkZXBjYV9zaWduYXR1cmVbaV1ba10gPT0gdG1wc3RyW2pdKSB7CS8qIHRyYWNrIHNpZ25hdHVyZSAqLworCQkJCWsrKzsKKwkJCX0gZWxzZSB7CS8qIGxvc3Qgc2lnbmF0dXJlOyBiZWdpbiBzZWFyY2ggYWdhaW4gKi8KKwkJCQlrID0gMDsKKwkJCX0KKwkJfQorCQlpZiAoayA9PSBzdHJsZW4oZGVwY2Ffc2lnbmF0dXJlW2ldKSkKKwkJCWJyZWFrOworCX0KKworCS8qIENoZWNrIGlmIG5hbWUgc3RyaW5nIGlzIHZhbGlkLCBwcm92aWRlZCB0aGVyZSdzIG5vIFBST00gKi8KKwlpZiAobmFtZSAmJiAqbmFtZSAmJiAoaSA9PSB1bmtub3duKSkgeworCQlmb3IgKGkgPSAwOyAqZGVwY2Ffc2lnbmF0dXJlW2ldICE9ICdcMCc7IGkrKykgeworCQkJaWYgKHN0cmNtcChuYW1lLCBkZXBjYV9zaWduYXR1cmVbaV0pID09IDApCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gaTsKK30KKworLyoKKyoqIExvb2sgZm9yIGEgc3BlY2lhbCBzZXF1ZW5jZSBpbiB0aGUgRXRoZXJuZXQgc3RhdGlvbiBhZGRyZXNzIFBST00gdGhhdAorKiogaXMgY29tbW9uIGFjcm9zcyBhbGwgREVQQ0EgcHJvZHVjdHMuIE5vdGUgdGhhdCB0aGUgb3JpZ2luYWwgREVQQ0EgbmVlZHMKKyoqIGl0cyBST00gYWRkcmVzcyBjb3VudGVyIHRvIGJlIGluaXRpYWxpemVkIGFuZCBlbmFibGVkLiBPbmx5IGVuYWJsZQorKiogaWYgdGhlIGZpcnN0IGFkZHJlc3Mgb2N0ZXQgaXMgYSAweDA4IC0gdGhpcyBtaW5pbWlzZXMgdGhlIGNoYW5jZXMgb2YKKyoqIG1lc3NpbmcgYXJvdW5kIHdpdGggc29tZSBvdGhlciBoYXJkd2FyZSwgYnV0IGl0IGFzc3VtZXMgdGhhdCB0aGlzIERFUENBCisqKiBjYXJkIGluaXRpYWxpemVkIGl0c2VsZiBjb3JyZWN0bHkuCisqKiAKKyoqIFNlYXJjaCB0aGUgRXRoZXJuZXQgYWRkcmVzcyBST00gZm9yIHRoZSBzaWduYXR1cmUuIFNpbmNlIHRoZSBST00gYWRkcmVzcworKiogY291bnRlciBjYW4gc3RhcnQgYXQgYW4gYXJiaXRyYXJ5IHBvaW50LCB0aGUgc2VhcmNoIG11c3QgaW5jbHVkZSB0aGUgZW50aXJlCisqKiBwcm9iZSBzZXF1ZW5jZSBsZW5ndGggcGx1cyB0aGUgKGxlbmd0aF9vZl90aGVfc2lnbmF0dXJlIC0gMSkuCisqKiBTdG9wIHRoZSBzZWFyY2ggSU1NRURJQVRFTFkgYWZ0ZXIgdGhlIHNpZ25hdHVyZSBpcyBmb3VuZCBzbyB0aGF0IHRoZQorKiogUFJPTSBhZGRyZXNzIGNvdW50ZXIgaXMgY29ycmVjdGx5IHBvc2l0aW9uZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZQorKiogZXRoZXJuZXQgYWRkcmVzcyBmb3IgbGF0ZXIgcmVhZCBvdXQuCisqLworc3RhdGljIGludCBfX2luaXQgRGV2aWNlUHJlc2VudCh1X2xvbmcgaW9hZGRyKQoreworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUzMiBhOworCQkJdTMyIGI7CisJCX0gbGxzaWc7CisJCWNoYXIgU2lnW3NpemVvZih1MzIpIDw8IDFdOworCX0KKwlkZXY7CisJc2hvcnQgc2lnTGVuZ3RoID0gMDsKKwlzOCBkYXRhOworCXMxNiBuaWNzcjsKKwlpbnQgaSwgaiwgc3RhdHVzID0gMDsKKworCWRhdGEgPSBpbmIoREVQQ0FfUFJPTSk7CS8qIGNsZWFyIGNvdW50ZXIgb24gREVQQ0EgKi8KKwlkYXRhID0gaW5iKERFUENBX1BST00pOwkvKiByZWFkIGRhdGEgKi8KKworCWlmIChkYXRhID09IDB4MDgpIHsJLyogRW5hYmxlIGNvdW50ZXIgb24gREVQQ0EgKi8KKwkJbmljc3IgPSBpbmIoREVQQ0FfTklDU1IpOworCQluaWNzciB8PSBBQUM7CisJCW91dGIobmljc3IsIERFUENBX05JQ1NSKTsKKwl9CisKKwlkZXYubGxzaWcuYSA9IEVUSF9QUk9NX1NJRzsKKwlkZXYubGxzaWcuYiA9IEVUSF9QUk9NX1NJRzsKKwlzaWdMZW5ndGggPSBzaXplb2YodTMyKSA8PCAxOworCisJZm9yIChpID0gMCwgaiA9IDA7IGogPCBzaWdMZW5ndGggJiYgaSA8IFBST0JFX0xFTkdUSCArIHNpZ0xlbmd0aCAtIDE7IGkrKykgeworCQlkYXRhID0gaW5iKERFUENBX1BST00pOworCQlpZiAoZGV2LlNpZ1tqXSA9PSBkYXRhKSB7CS8qIHRyYWNrIHNpZ25hdHVyZSAqLworCQkJaisrOworCQl9IGVsc2UgewkvKiBsb3N0IHNpZ25hdHVyZTsgYmVnaW4gc2VhcmNoIGFnYWluICovCisJCQlpZiAoZGF0YSA9PSBkZXYuU2lnWzBdKSB7CS8qIHJhcmUgY2FzZS4uLi4gKi8KKwkJCQlqID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJaiA9IDA7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoaiAhPSBzaWdMZW5ndGgpIHsKKwkJc3RhdHVzID0gLUVOT0RFVjsJLyogc2VhcmNoIGZhaWxlZCAqLworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisqKiBUaGUgREUxMDAgYW5kIERFMTAxIFBST00gYWNjZXNzZXMgd2VyZSBtYWRlIG5vbi1zdGFuZGFyZCBmb3Igc29tZSBiaXphcnJlCisqKiByZWFzb246IGFjY2VzcyB0aGUgdXBwZXIgaGFsZiBvZiB0aGUgUFJPTSB3aXRoIHg9MDsgYWNjZXNzIHRoZSBsb3dlciBoYWxmCisqKiB3aXRoIHg9MS4KKyovCitzdGF0aWMgaW50IF9faW5pdCBnZXRfaHdfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVfbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJaW50IGksIGssIHRtcCwgc3RhdHVzID0gMDsKKwl1X3Nob3J0IGosIHgsIGNoa3N1bTsKKworCXggPSAoKChscC0+YWRhcHRlciA9PSBkZTEwMCkgfHwgKGxwLT5hZGFwdGVyID09IGRlMTAxKSkgPyAxIDogMCk7CisKKwlmb3IgKGkgPSAwLCBrID0gMCwgaiA9IDA7IGogPCAzOyBqKyspIHsKKwkJayA8PD0gMTsKKwkJaWYgKGsgPiAweGZmZmYpCisJCQlrIC09IDB4ZmZmZjsKKworCQlrICs9ICh1X2NoYXIpICh0bXAgPSBpbmIoREVQQ0FfUFJPTSArIHgpKTsKKwkJZGV2LT5kZXZfYWRkcltpKytdID0gKHVfY2hhcikgdG1wOworCQlrICs9ICh1X3Nob3J0KSAoKHRtcCA9IGluYihERVBDQV9QUk9NICsgeCkpIDw8IDgpOworCQlkZXYtPmRldl9hZGRyW2krK10gPSAodV9jaGFyKSB0bXA7CisKKwkJaWYgKGsgPiAweGZmZmYpCisJCQlrIC09IDB4ZmZmZjsKKwl9CisJaWYgKGsgPT0gMHhmZmZmKQorCQlrID0gMDsKKworCWNoa3N1bSA9ICh1X2NoYXIpIGluYihERVBDQV9QUk9NICsgeCk7CisJY2hrc3VtIHw9ICh1X3Nob3J0KSAoaW5iKERFUENBX1BST00gKyB4KSA8PCA4KTsKKwlpZiAoayAhPSBjaGtzdW0pCisJCXN0YXR1cyA9IC0xOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyoqIExvYWQgYSBwYWNrZXQgaW50byB0aGUgc2hhcmVkIG1lbW9yeQorKi8KK3N0YXRpYyBpbnQgbG9hZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGRlcGNhX3ByaXZhdGUgKikgZGV2LT5wcml2OworCWludCBpLCBlbnRyeSwgZW5kLCBsZW4sIHN0YXR1cyA9IDA7CisKKwllbnRyeSA9IGxwLT50eF9uZXc7CS8qIFJpbmcgYXJvdW5kIGJ1ZmZlciBudW1iZXIuICovCisJZW5kID0gKGVudHJ5ICsgKHNrYi0+bGVuIC0gMSkgLyBUWF9CVUZGX1NaKSAmIGxwLT50eFJpbmdNYXNrOworCWlmICghKHJlYWRsKCZscC0+dHhfcmluZ1tlbmRdLmJhc2UpICYgVF9PV04pKSB7CS8qIEVub3VnaCByb29tPyAqLworCQkvKiAKKwkJICAgKiogQ2F1dGlvbjogdGhlIHdyaXRlIG9yZGVyIGlzIGltcG9ydGFudCBoZXJlLi4uIGRvbid0IHNldCB1cCB0aGUKKwkJICAgKiogb3duZXJzaGlwIHJpZ2h0cyB1bnRpbCBhbGwgdGhlIG90aGVyIGluZm9ybWF0aW9uIGlzIGluIHBsYWNlLgorCQkgKi8KKwkJaWYgKGVuZCA8IGVudHJ5KSB7CS8qIHdyYXBwZWQgYnVmZmVyICovCisJCQlsZW4gPSAobHAtPnR4UmluZ01hc2sgLSBlbnRyeSArIDEpICogVFhfQlVGRl9TWjsKKwkJCW1lbWNweV90b2lvKGxwLT50eF9idWZmW2VudHJ5XSwgc2tiLT5kYXRhLCBsZW4pOworCQkJbWVtY3B5X3RvaW8obHAtPnR4X2J1ZmZbMF0sIHNrYi0+ZGF0YSArIGxlbiwgc2tiLT5sZW4gLSBsZW4pOworCQl9IGVsc2UgewkvKiBsaW5lYXIgYnVmZmVyICovCisJCQltZW1jcHlfdG9pbyhscC0+dHhfYnVmZltlbnRyeV0sIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQl9CisKKwkJLyogc2V0IHVwIHRoZSBidWZmZXIgZGVzY3JpcHRvcnMgKi8KKwkJbGVuID0gKHNrYi0+bGVuIDwgRVRIX1pMRU4pID8gRVRIX1pMRU4gOiBza2ItPmxlbjsKKwkJZm9yIChpID0gZW50cnk7IGkgIT0gZW5kOyBpID0gKGkrMSkgJiBscC0+dHhSaW5nTWFzaykgeworCQkJLyogY2xlYW4gb3V0IGZsYWdzICovCisJCQl3cml0ZWwocmVhZGwoJmxwLT50eF9yaW5nW2ldLmJhc2UpICYgflRfRkxBR1MsICZscC0+dHhfcmluZ1tpXS5iYXNlKTsKKwkJCXdyaXRldygweDAwMDAsICZscC0+dHhfcmluZ1tpXS5taXNjKTsJLyogY2xlYXJzIG90aGVyIGVycm9yIGZsYWdzICovCisJCQl3cml0ZXcoLVRYX0JVRkZfU1osICZscC0+dHhfcmluZ1tpXS5sZW5ndGgpOwkvKiBwYWNrZXQgbGVuZ3RoIGluIGJ1ZmZlciAqLworCQkJbGVuIC09IFRYX0JVRkZfU1o7CisJCX0KKwkJLyogY2xlYW4gb3V0IGZsYWdzICovCisJCXdyaXRlbChyZWFkbCgmbHAtPnR4X3JpbmdbZW5kXS5iYXNlKSAmIH5UX0ZMQUdTLCAmbHAtPnR4X3JpbmdbZW5kXS5iYXNlKTsKKwkJd3JpdGV3KDB4MDAwMCwgJmxwLT50eF9yaW5nW2VuZF0ubWlzYyk7CS8qIGNsZWFycyBvdGhlciBlcnJvciBmbGFncyAqLworCQl3cml0ZXcoLWxlbiwgJmxwLT50eF9yaW5nW2VuZF0ubGVuZ3RoKTsJLyogcGFja2V0IGxlbmd0aCBpbiBsYXN0IGJ1ZmYgKi8KKworCQkvKiBzdGFydCBvZiBwYWNrZXQgKi8KKwkJd3JpdGVsKHJlYWRsKCZscC0+dHhfcmluZ1tlbnRyeV0uYmFzZSkgfCBUX1NUUCwgJmxwLT50eF9yaW5nW2VudHJ5XS5iYXNlKTsKKwkJLyogZW5kIG9mIHBhY2tldCAqLworCQl3cml0ZWwocmVhZGwoJmxwLT50eF9yaW5nW2VuZF0uYmFzZSkgfCBUX0VOUCwgJmxwLT50eF9yaW5nW2VuZF0uYmFzZSk7CisKKwkJZm9yIChpID0gZW5kOyBpICE9IGVudHJ5OyAtLWkpIHsKKwkJCS8qIG93bmVyc2hpcCBvZiBwYWNrZXQgKi8KKwkJCXdyaXRlbChyZWFkbCgmbHAtPnR4X3JpbmdbaV0uYmFzZSkgfCBUX09XTiwgJmxwLT50eF9yaW5nW2ldLmJhc2UpOworCQkJaWYgKGkgPT0gMCkKKwkJCQlpID0gbHAtPnR4UmluZ01hc2sgKyAxOworCQl9CisJCXdyaXRlbChyZWFkbCgmbHAtPnR4X3JpbmdbZW50cnldLmJhc2UpIHwgVF9PV04sICZscC0+dHhfcmluZ1tlbnRyeV0uYmFzZSk7CisKKwkJbHAtPnR4X25ldyA9ICgrK2VuZCkgJiBscC0+dHhSaW5nTWFzazsJLyogdXBkYXRlIGN1cnJlbnQgcG9pbnRlcnMgKi8KKwl9IGVsc2UgeworCQlzdGF0dXMgPSAtMTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBkZXBjYV9kYmdfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXBjYV9wcml2YXRlICpscCA9IChzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdV9sb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBkZXBjYV9pbml0ICpwID0gJmxwLT5pbml0X2Jsb2NrOworCWludCBpOworCisJaWYgKGRlcGNhX2RlYnVnID4gMSkgeworCQkvKiBEbyBub3QgY29weSB0aGUgc2hhZG93IGluaXQgYmxvY2sgaW50byBzaGFyZWQgbWVtb3J5ICovCisJCS8qIERlYnVnZ2luZyBzaG91bGQgbm90IGFmZmVjdCBub3JtYWwgb3BlcmF0aW9uISAqLworCQkvKiBUaGUgc2hhZG93IGluaXQgYmxvY2sgd2lsbCBnZXQgY29waWVkIGFjcm9zcyBkdXJpbmcgSW5pdFJlc3RhcnREZXBjYSAqLworCQlwcmludGsoIiVzOiBkZXBjYSBvcGVuIHdpdGggaXJxICVkXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJcHJpbnRrKCJEZXNjcmlwdG9yIGhlYWQgYWRkcmVzc2VzIChDUFUpOlxuIik7CisJCXByaW50aygiICAgICAgICAweCVseCAgMHglbHhcbiIsICh1X2xvbmcpIGxwLT5yeF9yaW5nLCAodV9sb25nKSBscC0+dHhfcmluZyk7CisJCXByaW50aygiRGVzY3JpcHRvciBhZGRyZXNzZXMgKENQVSk6XG5SWDogIik7CisJCWZvciAoaSA9IDA7IGkgPCBscC0+cnhSaW5nTWFzazsgaSsrKSB7CisJCQlpZiAoaSA8IDMpIHsKKwkJCQlwcmludGsoIiVwICIsICZscC0+cnhfcmluZ1tpXS5iYXNlKTsKKwkJCX0KKwkJfQorCQlwcmludGsoIi4uLiVwXG4iLCAmbHAtPnJ4X3JpbmdbaV0uYmFzZSk7CisJCXByaW50aygiVFg6ICIpOworCQlmb3IgKGkgPSAwOyBpIDwgbHAtPnR4UmluZ01hc2s7IGkrKykgeworCQkJaWYgKGkgPCAzKSB7CisJCQkJcHJpbnRrKCIlcCAiLCAmbHAtPnR4X3JpbmdbaV0uYmFzZSk7CisJCQl9CisJCX0KKwkJcHJpbnRrKCIuLi4lcFxuIiwgJmxwLT50eF9yaW5nW2ldLmJhc2UpOworCQlwcmludGsoIlxuRGVzY3JpcHRvciBidWZmZXJzIChEZXZpY2UpOlxuUlg6ICIpOworCQlmb3IgKGkgPSAwOyBpIDwgbHAtPnJ4UmluZ01hc2s7IGkrKykgeworCQkJaWYgKGkgPCAzKSB7CisJCQkJcHJpbnRrKCIweCU4Ljh4ICAiLCByZWFkbCgmbHAtPnJ4X3JpbmdbaV0uYmFzZSkpOworCQkJfQorCQl9CisJCXByaW50aygiLi4uMHglOC44eFxuIiwgcmVhZGwoJmxwLT5yeF9yaW5nW2ldLmJhc2UpKTsKKwkJcHJpbnRrKCJUWDogIik7CisJCWZvciAoaSA9IDA7IGkgPCBscC0+dHhSaW5nTWFzazsgaSsrKSB7CisJCQlpZiAoaSA8IDMpIHsKKwkJCQlwcmludGsoIjB4JTguOHggICIsIHJlYWRsKCZscC0+dHhfcmluZ1tpXS5iYXNlKSk7CisJCQl9CisJCX0KKwkJcHJpbnRrKCIuLi4weCU4Ljh4XG4iLCByZWFkbCgmbHAtPnR4X3JpbmdbaV0uYmFzZSkpOworCQlwcmludGsoIkluaXRpYWxpc2F0aW9uIGJsb2NrIGF0IDB4JTguOGx4KFBoeXMpXG4iLCBscC0+bWVtX3N0YXJ0KTsKKwkJcHJpbnRrKCIgICAgICAgIG1vZGU6IDB4JTQuNHhcbiIsIHAtPm1vZGUpOworCQlwcmludGsoIiAgICAgICAgcGh5c2ljYWwgYWRkcmVzczogIik7CisJCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTiAtIDE7IGkrKykgeworCQkJcHJpbnRrKCIlMi4yeDoiLCBwLT5waHlzX2FkZHJbaV0pOworCQl9CisJCXByaW50aygiJTIuMnhcbiIsIHAtPnBoeXNfYWRkcltpXSk7CisJCXByaW50aygiICAgICAgICBtdWx0aWNhc3QgaGFzaCB0YWJsZTogIik7CisJCWZvciAoaSA9IDA7IGkgPCAoSEFTSF9UQUJMRV9MRU4gPj4gMykgLSAxOyBpKyspIHsKKwkJCXByaW50aygiJTIuMng6IiwgcC0+bWNhc3RfdGFibGVbaV0pOworCQl9CisJCXByaW50aygiJTIuMnhcbiIsIHAtPm1jYXN0X3RhYmxlW2ldKTsKKwkJcHJpbnRrKCIgICAgICAgIHJ4X3JpbmcgYXQ6IDB4JTguOHhcbiIsIHAtPnJ4X3JpbmcpOworCQlwcmludGsoIiAgICAgICAgdHhfcmluZyBhdDogMHglOC44eFxuIiwgcC0+dHhfcmluZyk7CisJCXByaW50aygiYnVmZmVycyAoUGh5cyk6IDB4JTguOGx4XG4iLCBscC0+bWVtX3N0YXJ0ICsgbHAtPmJ1ZmZzX29mZnNldCk7CisJCXByaW50aygiUmluZyBzaXplOlxuUlg6ICVkICBMb2cyKHJ4UmluZ01hc2spOiAweCU4Ljh4XG4iLCAoaW50KSBscC0+cnhSaW5nTWFzayArIDEsIGxwLT5yeF9ybGVuKTsKKwkJcHJpbnRrKCJUWDogJWQgIExvZzIodHhSaW5nTWFzayk6IDB4JTguOHhcbiIsIChpbnQpIGxwLT50eFJpbmdNYXNrICsgMSwgbHAtPnR4X3JsZW4pOworCQlvdXR3KENTUjIsIERFUENBX0FERFIpOworCQlwcmludGsoIkNTUjImMTogMHglNC40eCIsIGludyhERVBDQV9EQVRBKSk7CisJCW91dHcoQ1NSMSwgREVQQ0FfQUREUik7CisJCXByaW50aygiJTQuNHhcbiIsIGludyhERVBDQV9EQVRBKSk7CisJCW91dHcoQ1NSMywgREVQQ0FfQUREUik7CisJCXByaW50aygiQ1NSMzogMHglNC40eFxuIiwgaW53KERFUENBX0RBVEEpKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisqKiBQZXJmb3JtIElPQ1RMIGNhbGwgZnVuY3Rpb25zIGhlcmUuIFNvbWUgYXJlIHByaXZpbGVnZWQgb3BlcmF0aW9ucyBhbmQgdGhlCisqKiBlZmZlY3RpdmUgdWlkIGlzIGNoZWNrZWQgaW4gdGhvc2UgY2FzZXMuCisqKiBBbGwgbXVsdGljYXN0IElPQ1RMcyB3aWxsIG5vdCB3b3JrIGhlcmUgYW5kIGFyZSBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LgorKi8KK3N0YXRpYyBpbnQgZGVwY2FfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgZGVwY2FfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGRlcGNhX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXN0cnVjdCBkZXBjYV9pb2N0bCAqaW9jID0gKHN0cnVjdCBkZXBjYV9pb2N0bCAqKSAmcnEtPmlmcl9pZnJ1OworCWludCBpLCBzdGF0dXMgPSAwOworCXVfbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bmlvbiB7CisJCXU4IGFkZHJbKEhBU0hfVEFCTEVfTEVOICogRVRIX0FMRU4pXTsKKwkJdTE2IHN2YWxbKEhBU0hfVEFCTEVfTEVOICogRVRIX0FMRU4pID4+IDFdOworCQl1MzIgbHZhbFsoSEFTSF9UQUJMRV9MRU4gKiBFVEhfQUxFTikgPj4gMl07CisJfSB0bXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkICpidWY7CisKKwlzd2l0Y2ggKGlvYy0+Y21kKSB7CisJY2FzZSBERVBDQV9HRVRfSFdBRERSOgkvKiBHZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3MgKi8KKwkJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKwkJCXRtcC5hZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKwkJfQorCQlpb2MtPmxlbiA9IEVUSF9BTEVOOworCQlpZiAoY29weV90b191c2VyKGlvYy0+ZGF0YSwgdG1wLmFkZHIsIGlvYy0+bGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgREVQQ0FfU0VUX0hXQUREUjoJLyogU2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChjb3B5X2Zyb21fdXNlcih0bXAuYWRkciwgaW9jLT5kYXRhLCBFVEhfQUxFTikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKwkJCWRldi0+ZGV2X2FkZHJbaV0gPSB0bXAuYWRkcltpXTsKKwkJfQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXdoaWxlIChscC0+dHhfb2xkICE9IGxwLT50eF9uZXcpCisJCQljcHVfcmVsYXgoKTsJLyogV2FpdCBmb3IgdGhlIHJpbmcgdG8gZW1wdHkgKi8KKworCQlTVE9QX0RFUENBOwkvKiBUZW1wb3JhcmlseSBzdG9wIHRoZSBkZXBjYS4gICovCisJCWRlcGNhX2luaXRfcmluZyhkZXYpOwkvKiBJbml0aWFsaXplIHRoZSBkZXNjcmlwdG9yIHJpbmdzICovCisJCUxvYWRDU1JzKGRldik7CS8qIFJlbG9hZCBDU1IzICovCisJCUluaXRSZXN0YXJ0RGVwY2EoZGV2KTsJLyogUmVzdW1lIG5vcm1hbCBvcGVyYXRpb24uICovCisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CS8qIFVubG9jayB0aGUgVFggcmluZyAqLworCQlicmVhazsKKworCWNhc2UgREVQQ0FfU0VUX1BST006CS8qIFNldCBQcm9taXNjdW91cyBNb2RlICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJd2hpbGUgKGxwLT50eF9vbGQgIT0gbHAtPnR4X25ldykKKwkJCWNwdV9yZWxheCgpOwkvKiBXYWl0IGZvciB0aGUgcmluZyB0byBlbXB0eSAqLworCisJCVNUT1BfREVQQ0E7CS8qIFRlbXBvcmFyaWx5IHN0b3AgdGhlIGRlcGNhLiAgKi8KKwkJZGVwY2FfaW5pdF9yaW5nKGRldik7CS8qIEluaXRpYWxpemUgdGhlIGRlc2NyaXB0b3IgcmluZ3MgKi8KKwkJbHAtPmluaXRfYmxvY2subW9kZSB8PSBQUk9NOwkvKiBTZXQgcHJvbWlzY3VvdXMgbW9kZSAqLworCisJCUxvYWRDU1JzKGRldik7CS8qIFJlbG9hZCBDU1IzICovCisJCUluaXRSZXN0YXJ0RGVwY2EoZGV2KTsJLyogUmVzdW1lIG5vcm1hbCBvcGVyYXRpb24uICovCisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CS8qIFVubG9jayB0aGUgVFggcmluZyAqLworCQlicmVhazsKKworCWNhc2UgREVQQ0FfQ0xSX1BST006CS8qIENsZWFyIFByb21pc2N1b3VzIE1vZGUgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQl3aGlsZSAobHAtPnR4X29sZCAhPSBscC0+dHhfbmV3KQorCQkJY3B1X3JlbGF4KCk7CS8qIFdhaXQgZm9yIHRoZSByaW5nIHRvIGVtcHR5ICovCisKKwkJU1RPUF9ERVBDQTsJLyogVGVtcG9yYXJpbHkgc3RvcCB0aGUgZGVwY2EuICAqLworCQlkZXBjYV9pbml0X3JpbmcoZGV2KTsJLyogSW5pdGlhbGl6ZSB0aGUgZGVzY3JpcHRvciByaW5ncyAqLworCQlscC0+aW5pdF9ibG9jay5tb2RlICY9IH5QUk9NOwkvKiBDbGVhciBwcm9taXNjdW91cyBtb2RlICovCisKKwkJTG9hZENTUnMoZGV2KTsJLyogUmVsb2FkIENTUjMgKi8KKwkJSW5pdFJlc3RhcnREZXBjYShkZXYpOwkvKiBSZXN1bWUgbm9ybWFsIG9wZXJhdGlvbi4gKi8KKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsJLyogVW5sb2NrIHRoZSBUWCByaW5nICovCisJCWJyZWFrOworCisJY2FzZSBERVBDQV9TQVlfQk9POgkvKiBTYXkgIkJvbyEiIHRvIHRoZSBrZXJuZWwgbG9nIGZpbGUgKi8KKwkJaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlwcmludGsoIiVzOiBCb28hXG4iLCBkZXYtPm5hbWUpOworCQlicmVhazsKKworCWNhc2UgREVQQ0FfR0VUX01DQToJLyogR2V0IHRoZSBtdWx0aWNhc3QgYWRkcmVzcyB0YWJsZSAqLworCQlpb2MtPmxlbiA9IChIQVNIX1RBQkxFX0xFTiA+PiAzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihpb2MtPmRhdGEsIGxwLT5pbml0X2Jsb2NrLm1jYXN0X3RhYmxlLCBpb2MtPmxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisKKwljYXNlIERFUENBX1NFVF9NQ0E6CS8qIFNldCBhIG11bHRpY2FzdCBhZGRyZXNzICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChpb2MtPmxlbiA+PSBIQVNIX1RBQkxFX0xFTikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoY29weV9mcm9tX3VzZXIodG1wLmFkZHIsIGlvYy0+ZGF0YSwgRVRIX0FMRU4gKiBpb2MtPmxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc2V0X211bHRpY2FzdF9saXN0KGRldik7CisJCWJyZWFrOworCisJY2FzZSBERVBDQV9DTFJfTUNBOgkvKiBDbGVhciBhbGwgbXVsdGljYXN0IGFkZHJlc3NlcyAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlzZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsKKwkJYnJlYWs7CisKKwljYXNlIERFUENBX01DQV9FTjoJLyogRW5hYmxlIHBhc3MgYWxsIG11bHRpY2FzdCBhZGRyZXNzaW5nICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCXNldF9tdWx0aWNhc3RfbGlzdChkZXYpOworCQlicmVhazsKKworCWNhc2UgREVQQ0FfR0VUX1NUQVRTOgkvKiBHZXQgdGhlIGRyaXZlciBzdGF0aXN0aWNzICovCisJCWlvYy0+bGVuID0gc2l6ZW9mKGxwLT5wa3RTdGF0cyk7CisJCWJ1ZiA9IGttYWxsb2MoaW9jLT5sZW4sIEdGUF9LRVJORUwpOworCQlpZighYnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCQltZW1jcHkoYnVmLCAmbHAtPnBrdFN0YXRzLCBpb2MtPmxlbik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3B5X3RvX3VzZXIoaW9jLT5kYXRhLCBidWYsIGlvYy0+bGVuKSkKKwkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCWtmcmVlKGJ1Zik7CisJCWJyZWFrOworCisJY2FzZSBERVBDQV9DTFJfU1RBVFM6CS8qIFplcm8gb3V0IHRoZSBkcml2ZXIgc3RhdGlzdGljcyAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwkJbWVtc2V0KCZscC0+cGt0U3RhdHMsIDAsIHNpemVvZihscC0+cGt0U3RhdHMpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIERFUENBX0dFVF9SRUc6CS8qIEdldCB0aGUgREVQQ0EgUmVnaXN0ZXJzICovCisJCWkgPSAwOworCQl0bXAuc3ZhbFtpKytdID0gaW53KERFUENBX05JQ1NSKTsKKwkJb3V0dyhDU1IwLCBERVBDQV9BRERSKTsJLyogc3RhdHVzIHJlZ2lzdGVyICovCisJCXRtcC5zdmFsW2krK10gPSBpbncoREVQQ0FfREFUQSk7CisJCW1lbWNweSgmdG1wLnN2YWxbaV0sICZscC0+aW5pdF9ibG9jaywgc2l6ZW9mKHN0cnVjdCBkZXBjYV9pbml0KSk7CisJCWlvYy0+bGVuID0gaSArIHNpemVvZihzdHJ1Y3QgZGVwY2FfaW5pdCk7CisJCWlmIChjb3B5X3RvX3VzZXIoaW9jLT5kYXRhLCB0bXAuYWRkciwgaW9jLT5sZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRlcGNhX21vZHVsZV9pbml0ICh2b2lkKQoreworICAgICAgICBpbnQgZXJyID0gMDsKKworI2lmZGVmIENPTkZJR19NQ0EKKyAgICAgICAgZXJyID0gbWNhX3JlZ2lzdGVyX2RyaXZlciAoJmRlcGNhX21jYV9kcml2ZXIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0VJU0EKKyAgICAgICAgZXJyIHw9IGVpc2FfZHJpdmVyX3JlZ2lzdGVyICgmZGVwY2FfZWlzYV9kcml2ZXIpOworI2VuZGlmCisJZXJyIHw9IGRyaXZlcl9yZWdpc3RlciAoJmRlcGNhX2lzYV9kcml2ZXIpOworCWRlcGNhX3BsYXRmb3JtX3Byb2JlICgpOworCQorICAgICAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZGVwY2FfbW9kdWxlX2V4aXQgKHZvaWQpCit7CisJaW50IGk7CisjaWZkZWYgQ09ORklHX01DQQorICAgICAgICBtY2FfdW5yZWdpc3Rlcl9kcml2ZXIgKCZkZXBjYV9tY2FfZHJpdmVyKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FSVNBCisgICAgICAgIGVpc2FfZHJpdmVyX3VucmVnaXN0ZXIgKCZkZXBjYV9laXNhX2RyaXZlcik7CisjZW5kaWYKKwlkcml2ZXJfdW5yZWdpc3RlciAoJmRlcGNhX2lzYV9kcml2ZXIpOworCisJZm9yIChpID0gMDsgZGVwY2FfaW9fcG9ydHNbaV0uaW9iYXNlOyBpKyspIHsKKwkJaWYgKGRlcGNhX2lvX3BvcnRzW2ldLmRldmljZSkgeworCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIgKGRlcGNhX2lvX3BvcnRzW2ldLmRldmljZSk7CisJCQlkZXBjYV9pb19wb3J0c1tpXS5kZXZpY2UgPSBOVUxMOworCQl9CisJfQorfQorCittb2R1bGVfaW5pdCAoZGVwY2FfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQgKGRlcGNhX21vZHVsZV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlcGNhLmggYi9kcml2ZXJzL25ldC9kZXBjYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNzg1MjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kZXBjYS5oCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICAgIFdyaXR0ZW4gMTk5NCBieSBEYXZpZCBDLiBEYXZpZXMuCisKKyAgICBDb3B5cmlnaHQgMTk5NCBEYXZpZCBDLiBEYXZpZXMuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkCisgICAgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkKKyAgICByZWZlcmVuY2UuCisqLworCisvKgorKiogSS9PIGFkZHJlc3Nlcy4gTm90ZSB0aGF0IHRoZSAyayBidWZmZXIgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4KKyoqIHRoaXMgZHJpdmVyLgorKi8KKyNkZWZpbmUgREVQQ0FfTklDU1IgaW9hZGRyKzB4MDAgICAvKiBOZXR3b3JrIGludGVyZmFjZSBDU1IgKi8KKyNkZWZpbmUgREVQQ0FfUkJJICAgaW9hZGRyKzB4MDIgICAvKiBSQU0gYnVmZmVyIGluZGV4ICgyayBidWZmZXIgbW9kZSkgKi8KKyNkZWZpbmUgREVQQ0FfREFUQSAgaW9hZGRyKzB4MDQgICAvKiBMQU5DRSByZWdpc3RlcnMnIGRhdGEgcG9ydCAqLworI2RlZmluZSBERVBDQV9BRERSICBpb2FkZHIrMHgwNiAgIC8qIExBTkNFIHJlZ2lzdGVycycgYWRkcmVzcyBwb3J0ICovCisjZGVmaW5lIERFUENBX0hCQVNFIGlvYWRkcisweDA4ICAgLyogRUlTQSBoaWdoIG1lbW9yeSBiYXNlIGFkZHJlc3MgcmVnLiAqLworI2RlZmluZSBERVBDQV9QUk9NICBpb2FkZHIrMHgwYyAgIC8qIEV0aGVybmV0IGFkZHJlc3MgUk9NIGRhdGEgcG9ydCAqLworI2RlZmluZSBERVBDQV9DTkZHICBpb2FkZHIrMHgwYyAgIC8qIEVJU0EgQ29uZmlndXJhdGlvbiBwb3J0ICovCisjZGVmaW5lIERFUENBX1JCU0EgIGlvYWRkcisweDBlICAgLyogUkFNIGJ1ZmZlciBzdGFydGluZyBhZGRyZXNzICgyayBidWZmLikgKi8KKworLyoKKyoqIFRoZXNlIGFyZSBMQU5DRSByZWdpc3RlcnMgYWRkcmVzc2FibGUgdGhyb3VnaCBERVBDQV9BRERSIAorKi8KKyNkZWZpbmUgQ1NSMCAgICAgICAwCisjZGVmaW5lIENTUjEgICAgICAgMQorI2RlZmluZSBDU1IyICAgICAgIDIKKyNkZWZpbmUgQ1NSMyAgICAgICAzCisKKy8qIAorKiogTkVUV09SSyBJTlRFUkZBQ0UgQ1NSIChOSV9DU1IpIGJpdCBkZWZpbml0aW9ucyAKKyovCisgCisjZGVmaW5lIFRPICAgICAgIAkweDAxMDAJLyogVGltZSBPdXQgZm9yIHJlbW90ZSBib290ICovCisjZGVmaW5lIFNIRSAgICAgIAkweDAwODAgIC8qIFNIYWRvdyBtZW1vcnkgRW5hYmxlICovCisjZGVmaW5lIEJTICAgICAgIAkweDAwNDAgIC8qIEJhbmsgU2VsZWN0ICovCisjZGVmaW5lIEJVRiAgICAgIAkweDAwMjAJLyogQlVGZmVyIHNpemUgKDEtPjMyaywgMC0+NjRrKSAqLworI2RlZmluZSBSQkUgICAgICAJMHgwMDEwCS8qIFJlbW90ZSBCb290IEVuYWJsZSAoMS0+bmV0IGJvb3QpICovCisjZGVmaW5lIEFBQyAgICAgIAkweDAwMDggIC8qIEFkZHJlc3MgUk9NIEFkZHJlc3MgQ291bnRlciAoMS0+ZW5hYmxlKSAqLworI2RlZmluZSBfMTI4S0IgICAgICAJMHgwMDA4ICAvKiAxMjhrQiBOZXR3b3JrIFJBTSAoMS0+ZW5hYmxlKSAqLworI2RlZmluZSBJTSAgICAgICAJMHgwMDA0CS8qIEludGVycnVwdCBNYXNrICgxLT5tYXNrKSAqLworI2RlZmluZSBJRU4gICAgICAJMHgwMDAyCS8qIEludGVycnVwdCB0cmlzdGF0ZSBFTmFibGUgKDEtPmVuYWJsZSkgKi8KKyNkZWZpbmUgTEVEICAgICAgCTB4MDAwMQkvKiBMRUQgY29udHJvbCAqLworCisvKiAKKyoqIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlciAwIChDU1IwKSBiaXQgZGVmaW5pdGlvbnMgCisqLworCisjZGVmaW5lIEVSUiAgICAgCTB4ODAwMCAJLyogRXJyb3Igc3VtbWFyeSAqLworI2RlZmluZSBCQUJMICAgIAkweDQwMDAgCS8qIEJhYmJsZSB0cmFuc21pdHRlciB0aW1lb3V0IGVycm9yICAqLworI2RlZmluZSBDRVJSICAgIAkweDIwMDAgCS8qIENvbGxpc2lvbiBFcnJvciAqLworI2RlZmluZSBNSVNTICAgIAkweDEwMDAgCS8qIE1pc3NlZCBwYWNrZXQgKi8KKyNkZWZpbmUgTUVSUiAgICAJMHgwODAwIAkvKiBNZW1vcnkgRXJyb3IgKi8KKyNkZWZpbmUgUklOVCAgICAJMHgwNDAwIAkvKiBSZWNlaXZlciBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgVElOVCAgICAJMHgwMjAwIAkvKiBUcmFuc21pdCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSURPTiAgICAJMHgwMTAwIAkvKiBJbml0aWFsaXphdGlvbiBEb25lICovCisjZGVmaW5lIElOVFIgICAgCTB4MDA4MCAJLyogSW50ZXJydXB0IEZsYWcgKi8KKyNkZWZpbmUgSU5FQSAgICAJMHgwMDQwIAkvKiBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFJYT04gICAgCTB4MDAyMCAJLyogUmVjZWl2ZXIgb24gKi8KKyNkZWZpbmUgVFhPTiAgICAJMHgwMDEwIAkvKiBUcmFuc21pdHRlciBvbiAqLworI2RlZmluZSBURE1EICAgIAkweDAwMDggCS8qIFRyYW5zbWl0IERlbWFuZCAqLworI2RlZmluZSBTVE9QICAgIAkweDAwMDQgCS8qIFN0b3AgKi8KKyNkZWZpbmUgU1RSVCAgICAJMHgwMDAyIAkvKiBTdGFydCAqLworI2RlZmluZSBJTklUICAgIAkweDAwMDEgCS8qIEluaXRpYWxpemUgKi8KKyNkZWZpbmUgSU5UTSAgICAgICAgICAgIDB4ZmYwMCAgLyogSW50ZXJydXB0IE1hc2sgKi8KKyNkZWZpbmUgSU5URSAgICAgICAgICAgIDB4ZmZmMCAgLyogSW50ZXJydXB0IEVuYWJsZSAqLworCisvKgorKiogQ09OVFJPTCBBTkQgU1RBVFVTIFJFR0lTVEVSIDMgKENTUjMpCisqLworCisjZGVmaW5lIEJTV1AgICAgCTB4MDAwNAkvKiBCeXRlIFNXYVAgKi8KKyNkZWZpbmUgQUNPTiAgICAJMHgwMDAyCS8qIEFMRSBjb250cm9sICovCisjZGVmaW5lIEJDT04gICAgCTB4MDAwMQkvKiBCeXRlIENPTnRyb2wgKi8KKworLyoKKyoqIEluaXRpYWxpemF0aW9uIEJsb2NrIE1vZGUgUmVnaXN0ZXIgCisqLworCisjZGVmaW5lIFBST00gICAgICAgCTB4ODAwMCAJLyogUHJvbWlzY3VvdXMgTW9kZSAqLworI2RlZmluZSBFTUJBICAgICAgIAkweDAwODAJLyogRW5hYmxlIE1vZGlmaWVkIEJhY2stb2ZmIEFsZ29yaXRobSAqLworI2RlZmluZSBJTlRMICAgICAgIAkweDAwNDAgCS8qIEludGVybmFsIExvb3BiYWNrICovCisjZGVmaW5lIERSVFkgICAgICAgCTB4MDAyMCAJLyogRGlzYWJsZSBSZXRyeSAqLworI2RlZmluZSBDT0xMICAgICAgIAkweDAwMTAgCS8qIEZvcmNlIENvbGxpc2lvbiAqLworI2RlZmluZSBEVENSICAgICAgIAkweDAwMDggCS8qIERpc2FibGUgVHJhbnNtaXQgQ1JDICovCisjZGVmaW5lIExPT1AgICAgICAgCTB4MDAwNCAJLyogTG9vcGJhY2sgKi8KKyNkZWZpbmUgRFRYICAgICAgICAJMHgwMDAyIAkvKiBEaXNhYmxlIHRoZSBUcmFuc21pdHRlciAqLworI2RlZmluZSBEUlggICAgICAgIAkweDAwMDEgCS8qIERpc2FibGUgdGhlIFJlY2VpdmVyICovCisKKy8qCisqKiBSZWNlaXZlIE1lc3NhZ2UgRGVzY3JpcHRvciAxIChSTUQxKSBiaXQgZGVmaW5pdGlvbnMuIAorKi8KKworI2RlZmluZSBSX09XTiAgICAgICAweDgwMDAwMDAwIAkvKiBPd25lciBiaXQgMCA9IGhvc3QsIDEgPSBsYW5jZSAqLworI2RlZmluZSBSX0VSUiAgICAgCTB4NDAwMCAJLyogRXJyb3IgU3VtbWFyeSAqLworI2RlZmluZSBSX0ZSQU0gICAgCTB4MjAwMCAJLyogRnJhbWluZyBFcnJvciAqLworI2RlZmluZSBSX09GTE8gICAgCTB4MTAwMCAJLyogT3ZlcmZsb3cgRXJyb3IgKi8KKyNkZWZpbmUgUl9DUkMgICAgIAkweDA4MDAgCS8qIENSQyBFcnJvciAqLworI2RlZmluZSBSX0JVRkYgICAgCTB4MDQwMCAJLyogQnVmZmVyIEVycm9yICovCisjZGVmaW5lIFJfU1RQICAgICAJMHgwMjAwIAkvKiBTdGFydCBvZiBQYWNrZXQgKi8KKyNkZWZpbmUgUl9FTlAgICAgIAkweDAxMDAgCS8qIEVuZCBvZiBQYWNrZXQgKi8KKworLyoKKyoqIFRyYW5zbWl0IE1lc3NhZ2UgRGVzY3JpcHRvciAxIChUTUQxKSBiaXQgZGVmaW5pdGlvbnMuIAorKi8KKworI2RlZmluZSBUX09XTiAgICAgICAweDgwMDAwMDAwIAkvKiBPd25lciBiaXQgMCA9IGhvc3QsIDEgPSBsYW5jZSAqLworI2RlZmluZSBUX0VSUiAgICAgCTB4NDAwMCAJLyogRXJyb3IgU3VtbWFyeSAqLworI2RlZmluZSBUX0FERF9GQ1MgCTB4MjAwMCAJLyogTW9yZSB0aGUgMSByZXRyeSBuZWVkZWQgdG8gWG1pdCAqLworI2RlZmluZSBUX01PUkUgICAgCTB4MTAwMAkvKiA+MSByZXRyeSB0byB0cmFuc21pdCBwYWNrZXQgKi8KKyNkZWZpbmUgVF9PTkUgICAgIAkweDA4MDAgCS8qIDEgdHJ5IG5lZWRlZCB0byB0cmFuc21pdCB0aGUgcGFja2V0ICovCisjZGVmaW5lIFRfREVGICAgICAJMHgwNDAwIAkvKiBEZWZlcnJlZCAqLworI2RlZmluZSBUX1NUUCAgICAgICAweDAyMDAwMDAwIAkvKiBTdGFydCBvZiBQYWNrZXQgKi8KKyNkZWZpbmUgVF9FTlAgICAgICAgMHgwMTAwMDAwMAkvKiBFbmQgb2YgUGFja2V0ICovCisjZGVmaW5lIFRfRkxBR1MgICAgIDB4ZmYwMDAwMDAgIC8qIFRYIEZsYWdzIEZpZWxkICovCisKKy8qCisqKiBUcmFuc21pdCBNZXNzYWdlIERlc2NyaXB0b3IgMyAoVE1EMykgYml0IGRlZmluaXRpb25zLgorKi8KKworI2RlZmluZSBUTUQzX0JVRkYgICAgMHg4MDAwCS8qIEJVRkZlciBlcnJvciAqLworI2RlZmluZSBUTUQzX1VGTE8gICAgMHg0MDAwCS8qIFVuZGVyRkxPdyBlcnJvciAqLworI2RlZmluZSBUTUQzX1JFUyAgICAgMHgyMDAwCS8qIFJFU2VydmVkICovCisjZGVmaW5lIFRNRDNfTENPTCAgICAweDEwMDAJLyogTGF0ZSBDT0xsaXNpb24gKi8KKyNkZWZpbmUgVE1EM19MQ0FSICAgIDB4MDgwMAkvKiBMb3NzIG9mIENBUnJpZXIgKi8KKyNkZWZpbmUgVE1EM19SVFJZICAgIDB4MDQwMAkvKiBSZVRSWSBlcnJvciAqLworCisvKiAKKyoqIEVJU0EgY29uZmlndXJhdGlvbiBSZWdpc3RlciAoQ05GRykgYml0IGRlZmluaXRpb25zIAorKi8KKyAKKyNkZWZpbmUgVElNRU9VVCAgICAgICAJMHgwMTAwCS8qIDA6Mi41IG1pbnMsIDE6IDMwIHNlY3MgKi8KKyNkZWZpbmUgUkVNT1RFICAgICAgCTB4MDA4MCAgLyogUmVtb3RlIEJvb3QgRW5hYmxlIC0+IDEgKi8KKyNkZWZpbmUgSVJRMTEgICAgICAgCTB4MDA0MCAgLyogRW5hYmxlIC0+IDEgKi8KKyNkZWZpbmUgSVJRMTAgICAgCTB4MDAyMAkvKiBFbmFibGUgLT4gMSAqLworI2RlZmluZSBJUlE5ICAgIAkweDAwMTAJLyogRW5hYmxlIC0+IDEgKi8KKyNkZWZpbmUgSVJRNSAgICAgIAkweDAwMDggIC8qIEVuYWJsZSAtPiAxICovCisjZGVmaW5lIEJVRkYgICAgIAkweDAwMDQJLyogMDogNjRrQiBvciAxMjhrQiwgMTogMzJrQiAqLworI2RlZmluZSBQQURSMTYgICAJMHgwMDAyCS8qIFJBTSBvbiA2NGtCIGJvdW5kYXJ5ICovCisjZGVmaW5lIFBBRFIxNyAgICAJMHgwMDAxCS8qIFJBTSBvbiAxMjhrQiBib3VuZGFyeSAqLworCisvKgorKiogTWlzY2VsbGFuZW91cworKi8KKyNkZWZpbmUgSEFTSF9UQUJMRV9MRU4gICA2NCAgICAgICAgICAgLyogQml0cyAqLworI2RlZmluZSBIQVNIX0JJVFMgICAgICAgIDB4MDAzZiAgICAgICAvKiA2IExTIGJpdHMgKi8KKworI2RlZmluZSBNQVNLX0lOVEVSUlVQVFMgICAxCisjZGVmaW5lIFVOTUFTS19JTlRFUlJVUFRTIDAKKworI2RlZmluZSBFSVNBX0VOICAgICAgICAgMHgwMDAxICAgICAgICAvKiBFbmFibGUgRUlTQSBidXMgYnVmZmVycyAqLworI2RlZmluZSBFSVNBX0lEICAgICAgICAgaW9iYXNlKzB4MDA4MCAvKiBJRCBsb25nIHdvcmQgZm9yIEVJU0EgY2FyZCAqLworI2RlZmluZSBFSVNBX0NUUkwgICAgICAgaW9iYXNlKzB4MDA4NCAvKiBDb250cm9sIHdvcmQgZm9yIEVJU0EgY2FyZCAqLworCisvKgorKiogSW5jbHVkZSB0aGUgSU9DVEwgc3R1ZmYKKyovCisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorCisjZGVmaW5lCURFUENBSU9DVEwJU0lPQ0RFVlBSSVZBVEUKKworc3RydWN0IGRlcGNhX2lvY3RsIHsKKwl1bnNpZ25lZCBzaG9ydCBjbWQ7ICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgdG8gcnVuICovCisJdW5zaWduZWQgc2hvcnQgbGVuOyAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgdGhlIGRhdGEgYnVmZmVyICovCisJdW5zaWduZWQgY2hhciAgX191c2VyICpkYXRhOyAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciAqLworfTsKKworLyogCisqKiBSZWNvZ25pc2VkIGNvbW1hbmRzIGZvciB0aGUgZHJpdmVyIAorKi8KKyNkZWZpbmUgREVQQ0FfR0VUX0hXQUREUgkweDAxIC8qIEdldCB0aGUgaGFyZHdhcmUgYWRkcmVzcyAqLworI2RlZmluZSBERVBDQV9TRVRfSFdBRERSCTB4MDIgLyogR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzICovCisjZGVmaW5lIERFUENBX1NFVF9QUk9NICAJMHgwMyAvKiBTZXQgUHJvbWlzY3VvdXMgTW9kZSAqLworI2RlZmluZSBERVBDQV9DTFJfUFJPTSAgCTB4MDQgLyogQ2xlYXIgUHJvbWlzY3VvdXMgTW9kZSAqLworI2RlZmluZSBERVBDQV9TQVlfQk9PCSAgICAgICAgMHgwNSAvKiBTYXkgIkJvbyEiIHRvIHRoZSBrZXJuZWwgbG9nIGZpbGUgKi8KKyNkZWZpbmUgREVQQ0FfR0VUX01DQSAgIAkweDA2IC8qIEdldCBhIG11bHRpY2FzdCBhZGRyZXNzICovCisjZGVmaW5lIERFUENBX1NFVF9NQ0EgICAJMHgwNyAvKiBTZXQgYSBtdWx0aWNhc3QgYWRkcmVzcyAqLworI2RlZmluZSBERVBDQV9DTFJfTUNBICAgIAkweDA4IC8qIENsZWFyIGEgbXVsdGljYXN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgREVQQ0FfTUNBX0VOICAgIAkweDA5IC8qIEVuYWJsZSBhIG11bHRpY2FzdCBhZGRyZXNzIGdyb3VwICovCisjZGVmaW5lIERFUENBX0dFVF9TVEFUUyAgCTB4MGEgLyogR2V0IHRoZSBkcml2ZXIgc3RhdGlzdGljcyAqLworI2RlZmluZSBERVBDQV9DTFJfU1RBVFMgCTB4MGIgLyogWmVybyBvdXQgdGhlIGRyaXZlciBzdGF0aXN0aWNzICovCisjZGVmaW5lIERFUENBX0dFVF9SRUcgICAJMHgwYyAvKiBHZXQgdGhlIFJlZ2lzdGVyIGNvbnRlbnRzICovCisjZGVmaW5lIERFUENBX1NFVF9SRUcgICAJMHgwZCAvKiBTZXQgdGhlIFJlZ2lzdGVyIGNvbnRlbnRzICovCisjZGVmaW5lIERFUENBX0RVTVAgICAgICAgICAgICAgIDB4MGYgLyogRHVtcCB0aGUgREVQQ0EgU3RhdHVzICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RncnMuYyBiL2RyaXZlcnMvbmV0L2RncnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODA5ODM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZGdycy5jCkBAIC0wLDAgKzEsMTYxNyBAQAorLyoKKyAqCURpZ2kgUmlnaHRTd2l0Y2ggU0UtWCBsb2FkYWJsZSBkZXZpY2UgZHJpdmVyIGZvciBMaW51eAorICoKKyAqCVRoZSBSaWdodFN3aXRjaCBpcyBhIDQgKEVJU0EpIG9yIDYgKFBDSSkgcG9ydCBldGhlcnN3aXRjaCBhbmQKKyAqCWEgTklDIG9uIGFuIGludGVybmFsIGJvYXJkLgorICoKKyAqCUF1dGhvcjogUmljayBSaWNoYXJkc29uLCByaWNrQHJlbW90ZXBvaW50LmNvbQorICoJRGVyaXZlZCBmcm9tIHRoZSBTVlI0LjIgKFVuaXhXYXJlKSBkcml2ZXIgZm9yIHRoZSBzYW1lIGNhcmQuCisgKgorICoJQ29weXJpZ2h0IDE5OTUtMTk5NiBEaWdpIEludGVybmF0aW9uYWwgSW5jLgorICoKKyAqCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICoJRm9yIGluZm9ybWF0aW9uIG9uIHB1cmNoYXNpbmcgYSBSaWdodFN3aXRjaCBTRS00IG9yIFNFLTYKKyAqCWJvYXJkLCBwbGVhc2UgY29udGFjdCBEaWdpJ3Mgc2FsZXMgZGVwYXJ0bWVudCBhdCAxLTYxMi05MTItMzQ0NAorICoJb3IgMS04MDAtRElHSUJSRC4gIE91dHNpZGUgdGhlIFUuUy4sIHBsZWFzZSBjaGVjayBvdXIgV2ViIHBhZ2UKKyAqCWF0IGh0dHA6Ly93d3cuZGdpaS5jb20gZm9yIHNhbGVzIG9mZmljZXMgd29ybGR3aWRlLgorICoKKyAqCU9QRVJBVElPTjoKKyAqCVdoZW4gY29tcGlsZWQgYXMgYSBsb2FkYWJsZSBtb2R1bGUsIHRoaXMgZHJpdmVyIGNhbiBvcGVyYXRlCisgKgl0aGUgYm9hcmQgYXMgZWl0aGVyIGEgNC82IHBvcnQgc3dpdGNoIHdpdGggYSA1dGggb3IgN3RoIHBvcnQKKyAqCXRoYXQgaXMgYSBjb252ZW50aW9uYWwgTklDIGludGVyZmFjZSBhcyBmYXIgYXMgdGhlIGhvc3QgaXMKKyAqCWNvbmNlcm5lZCwgT1IgYXMgNC82IGluZGVwZW5kZW50IE5JQ3MuICBUbyBzZWxlY3QgbXVsdGktTklDCisgKgltb2RlLCBhZGQgIm5pY21vZGU9MSIgb24gdGhlIGluc21vZCBsb2FkIGxpbmUgZm9yIHRoZSBkcml2ZXIuCisgKgorICoJVGhpcyBkcml2ZXIgdXNlcyB0aGUgImRldiIgY29tbW9uIGV0aGVybmV0IGRldmljZSBzdHJ1Y3R1cmUKKyAqCWFuZCBhIHByaXZhdGUgInByaXYiIChkZXYtPnByaXYpIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCisgKgltb3N0bHkgREdSUy1zcGVjaWZpYyBpbmZvcm1hdGlvbiBhbmQgc3RhdGlzdGljcy4gIFRvIGtlZXAKKyAqCXRoZSBjb2RlIGZvciBib3RoIHRoZSBzd2l0Y2ggbW9kZSBhbmQgdGhlIG11bHRpLU5JQyBtb2RlCisgKglhcyBzaW1pbGFyIGFzIHBvc3NpYmxlLCBJIGhhdmUgaW50cm9kdWNlZCB0aGUgY29uY2VwdCBvZgorICoJImRldjAiLyJwcml2MCIgYW5kICJkZXZOIi8icHJpdk4iICBwb2ludGVyIHBhaXJzIGluIHN1YnJvdXRpbmVzCisgKgl3aGVyZSBuZWVkZWQuICBUaGUgZmlyc3QgcGFpciBvZiBwb2ludGVycyBwb2ludHMgdG8gdGhlCisgKgkiZGV2IiBhbmQgInByaXYiIHN0cnVjdHVyZXMgb2YgdGhlIHplcm90aCAoMHRoKSBkZXZpY2UKKyAqCWludGVyZmFjZSBhc3NvY2lhdGVkIHdpdGggYSBib2FyZC4gIFRoZSBzZWNvbmQgcGFpciBvZgorICoJcG9pbnRlcnMgcG9pbnRzIHRvIHRoZSBjdXJyZW50IChOdGgpIGRldmljZSBpbnRlcmZhY2UKKyAqCWZvciB0aGUgYm9hcmQ6IHRoZSBvbmUgZm9yIHdoaWNoIHdlIGFyZSBwcm9jZXNzaW5nIGRhdGEuCisgKgorICoJSW4gc3dpdGNoIG1vZGUsIHRoZSBwYWlycyBvZiBwb2ludGVycyBhcmUgYWx3YXlzIHRoZSBzYW1lLAorICoJdGhhdCBpcywgZGV2MCA9PSBkZXZOIGFuZCBwcml2MCA9PSBwcml2Ti4gIFRoaXMgaXMganVzdAorICoJbGlrZSBwcmV2aW91cyByZWxlYXNlcyBvZiB0aGlzIGRyaXZlciB3aGljaCBkaWQgbm90IHN1cHBvcnQKKyAqCU5JQyBtb2RlLgorICoKKyAqCUluIG11bHRpLU5JQyBtb2RlLCB0aGUgcGFpcnMgb2YgcG9pbnRlcnMgbWF5IGJlIGRpZmZlcmVudC4KKyAqCVdlIHVzZSB0aGUgZGV2TiBhbmQgcHJpdk4gcG9pbnRlcnMgdG8gcmVmZXJlbmNlIGp1c3QgdGhlCisgKgluYW1lLCBwb3J0IG51bWJlciwgYW5kIHN0YXRpc3RpY3MgZm9yIHRoZSBjdXJyZW50IGludGVyZmFjZS4KKyAqCVdlIHVzZSB0aGUgZGV2MCBhbmQgcHJpdjAgcG9pbnRlcnMgdG8gYWNjZXNzIHRoZSB2YXJpYWJsZXMKKyAqCXRoYXQgY29udHJvbCBhY2Nlc3MgdG8gdGhlIGJvYXJkLCBzdWNoIGFzIGJvYXJkIGFkZHJlc3MKKyAqCWFuZCBzaW11bGF0ZWQgODI1OTYgdmFyaWFibGVzLiAgVGhpcyBpcyBiZWNhdXNlIHRoZXJlIGlzCisgKglvbmx5IG9uZSAiZmFrZSIgODI1OTYgdGhhdCBzZXJ2ZXMgYXMgdGhlIGludGVyZmFjZSB0bworICoJdGhlIGJvYXJkLiAgV2UgZG8gbm90IHdhbnQgdG8gdHJ5IHRvIGtlZXAgdGhlIHZhcmlhYmxlcworICoJYXNzb2NpYXRlZCB3aXRoIHRoaXMgODI1OTYgaW4gc3luYyBhY3Jvc3MgYWxsIGRldmljZXMuCisgKgorICoJVGhpcyBzY2hlbWUgd29ya3Mgd2VsbC4gIEFzIHlvdSB3aWxsIHNlZSwgZXhjZXB0IGZvcgorICoJaW5pdGlhbGl6YXRpb24sIHRoZXJlIGlzIHZlcnkgbGl0dGxlIGRpZmZlcmVuY2UgYmV0d2VlbgorICoJdGhlIHR3byBtb2RlcyBhcyBmYXIgYXMgdGhpcyBkcml2ZXIgaXMgY29uY2VybmVkLiAgT24gdGhlCisgKglyZWNlaXZlIHNpZGUgaW4gTklDIG1vZGUsIHRoZSBpbnRlcnJ1cHQgKmFsd2F5cyogY29tZXMgaW4gb24KKyAqCXRoZSAwdGggaW50ZXJmYWNlIChkZXYwL3ByaXYwKS4gIFdlIHRoZW4gZmlndXJlIG91dCB3aGljaAorICoJcmVhbCA4MjU5NiBwb3J0IGl0IGNhbWUgaW4gb24gZnJvbSBsb29raW5nIGF0IHRoZSAiY2hhbiIKKyAqCW1lbWJlciB0aGF0IHRoZSBib2FyZCBmaXJtd2FyZSBhZGRzIGF0IHRoZSBlbmQgb2YgZWFjaAorICoJUkJEIChhLmsuYS4gVEJEKS4gV2UgZ2V0IHRoZSBjaGFubmVsIG51bWJlciBsaWtlIHRoaXM6CisgKgkJaW50IGNoYW4gPSAoKEk1OTZfUkJEICopIFMySChjYnAtPnhtaXQudGJkcCkpLT5jaGFuOworICoKKyAqCU9uIHRoZSB0cmFuc21pdCBzaWRlIGluIG11bHRpLU5JQyBtb2RlLCB3ZSBzcGVjaWZ5IHRoZQorICoJb3V0cHV0IDgyNTk2IHBvcnQgYnkgc2V0dGluZyB0aGUgbmV3ICJkc3RjaGFuIiBzdHJ1Y3R1cmUKKyAqCW1lbWJlciB0aGF0IGlzIGF0IHRoZSBlbmQgb2YgdGhlIFJGRCwgbGlrZSB0aGlzOgorICoJCXByaXYwLT5yZmRwLT5kc3RjaGFuID0gcHJpdk4tPmNoYW47CisgKgorICoJVE9ETzoKKyAqCS0gTXVsdGktTklDIG1vZGUgaXMgbm90IHlldCBzdXBwb3J0ZWQgd2hlbiB0aGUgZHJpdmVyIGlzIGxpbmtlZAorICoJICBpbnRvIHRoZSBrZXJuZWwuCisgKgktIEJldHRlciBoYW5kbGluZyBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzLgorICoKKyAqCUZpeGVzOgorICoJQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+IC0gMTEvMDEvMjAwMQorICoJLSBmaXggZGdyc19mb3VuZF9kZXZpY2Ugd3J0IGNoZWNraW5nIGttYWxsb2MgcmV0dXJuIGFuZAorICoJcm9sbGJhY2tpbmcgdGhlIHBhcnRpYWwgc3RlcHMgb2YgdGhlIHdob2xlIHByb2Nlc3Mgd2hlbgorICoJb25lIG9mIHRoZSBkZXZpY2VzIGNhbid0IGJlIGFsbG9jYXRlZC4gRml4IFNFVF9NT0RVTEVfT1dORVIKKyAqCW9uIHRoZSBsb29wIHRvIHVzZSBkZXZOIGluc3RlYWQgb2YgcmVwZWF0ZWQgY2FsbHMgdG8gZGV2LgorICoKKyAqCWRhdmVqIDxkYXZlakBzdXNlLmRlPiAtIDkvMi8yMDAxCisgKgktIEVuYWJsZSBQQ0kgZGV2aWNlIGJlZm9yZSByZWFkaW5nIGlvYWRkci9pcnEKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vpc2EuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0KKwkiJElkOiBkZ3JzLmMsdiAxLjEzIDIwMDAvMDYvMDYgMDQ6MDc6MDAgcmljayBFeHAgJCI7CisKKy8qCisgKglER1JTIGluY2x1ZGUgZmlsZXMKKyAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVjaGFyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgYm9vbDsKKyNkZWZpbmUgdm9sIHZvbGF0aWxlCisKKyNpbmNsdWRlICJkZ3JzLmgiCisjaW5jbHVkZSAiZGdyc19lczRoLmgiCisjaW5jbHVkZSAiZGdyc19wbHg5MDYwLmgiCisjaW5jbHVkZSAiZGdyc19pODI1OTYuaCIKKyNpbmNsdWRlICJkZ3JzX2V0aGVyLmgiCisjaW5jbHVkZSAiZGdyc19hc3N0cnVjdC5oIgorI2luY2x1ZGUgImRncnNfYmNvbW0uaCIKKworI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBkZ3JzX3BjaV90YmxbXSA9IHsKKwl7IFNFNl9QQ0lfVkVORE9SX0lELCBTRTZfUENJX0RFVklDRV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IH0JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBkZ3JzX3BjaV90YmwpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRUlTQQorc3RhdGljIHN0cnVjdCBlaXNhX2RldmljZV9pZCBkZ3JzX2Vpc2FfdGJsW10gPSB7CisJeyAiREJJMEEwMSIgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGVpc2EsIGRncnNfZWlzYV90YmwpOworI2VuZGlmCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCisvKgorICoJRmlybXdhcmUuICBDb21waWxlZCBzZXBhcmF0ZWx5IGZvciBsb2NhbCBjb21waWxhdGlvbiwKKyAqCWJ1dCAjaW5jbHVkZWQgZm9yIExpbnV4IGRpc3RyaWJ1dGlvbi4KKyAqLworI2lmbmRlZiBOT0ZXCisJI2luY2x1ZGUgImRncnNfZmlybXdhcmUuYyIKKyNlbHNlCisJZXh0ZXJuIGludAlkZ3JzX2Zpcm1udW07CisJZXh0ZXJuIGNoYXIJZGdyc19maXJtdmVyW107CisJZXh0ZXJuIGNoYXIJZGdyc19maXJtZGF0ZVtdOworCWV4dGVybiB1Y2hhcglkZ3JzX2NvZGVbXTsKKwlleHRlcm4gaW50CWRncnNfbmNvZGU7CisjZW5kaWYKKworLyoKKyAqCUxpbnV4IG91dCooKSBpcyBiYWNrd2FyZHMgZnJvbSBhbGwgb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMKKyAqLworI2RlZmluZQlPVVRCKEFERFIsIFZBTCkJb3V0YihWQUwsIEFERFIpCisjZGVmaW5lCU9VVFcoQUREUiwgVkFMKQlvdXR3KFZBTCwgQUREUikKKyNkZWZpbmUJT1VUTChBRERSLCBWQUwpCW91dGwoVkFMLCBBRERSKQorCisvKgorICoJTWFjcm9zIHRvIGNvbnZlcnQgc3dpdGNoIHRvIGhvc3QgYW5kIGhvc3QgdG8gc3dpdGNoIGFkZHJlc3NlcworICoJKGFzc3VtZXMgYSBsb2NhbCB2YXJpYWJsZSBwcml2IHBvaW50cyB0byBib2FyZCBkZXBlbmRlbnQgc3RydWN0KQorICovCisjZGVmaW5lCVMySChBKQkoICgodW5zaWduZWQgbG9uZykoQSkmMHgwMGZmZmZmZikgKyBwcml2MC0+dm1lbSApCisjZGVmaW5lCVMySE4oQSkJKCAoKHVuc2lnbmVkIGxvbmcpKEEpJjB4MDBmZmZmZmYpICsgcHJpdk4tPnZtZW0gKQorI2RlZmluZQlIMlMoQSkJKCAoKGNoYXIgKikgKEEpIC0gcHJpdjAtPnZtZW0pICsgMHhBMzAwMDAwMCApCisKKy8qCisgKglDb252ZXJ0IGEgc3dpdGNoIGFkZHJlc3MgdG8gYSAic2FmZSIgYWRkcmVzcyBmb3IgdXNlIHdpdGggdGhlCisgKglQTFggOTA2MCBETUEgcmVnaXN0ZXJzIGFuZCB0aGUgYXNzb2NpYXRlZCBIVyBrbHVkZ2UgdGhhdCBhbGxvd3MKKyAqCWZvciBob3N0IGFjY2VzcyBvZiB0aGUgRE1BIHJlZ2lzdGVycy4KKyAqLworI2RlZmluZQlTMkRNQShBKQkoICh1bnNpZ25lZCBsb25nKShBKSAmIDB4MDBmZmZmZmYpCisKKy8qCisgKgkiU3BhY2UuYyIgdmFyaWFibGVzLCBub3cgc2V0dGFibGUgZnJvbSBtb2R1bGUgaW50ZXJmYWNlCisgKglVc2UgdGhlIG5hbWUgYmVsb3csIG1pbnVzIHRoZSAiZGdyc18iIHByZWZpeC4gIFNlZSBpbml0X21vZHVsZSgpLgorICovCitzdGF0aWMgaW50CWRncnNfZGVidWcgPSAxOworc3RhdGljIGludAlkZ3JzX2RtYSA9IDE7CitzdGF0aWMgaW50CWRncnNfc3BhbnRyZWUgPSAtMTsKK3N0YXRpYyBpbnQJZGdyc19oYXNoZXhwaXJlID0gLTE7CitzdGF0aWMgdWNoYXIJZGdyc19pcGFkZHJbNF0gPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9Oworc3RhdGljIHVjaGFyCWRncnNfaXB0cmFwWzRdID0geyAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKK3N0YXRpYyBfX3UzMglkZ3JzX2lweG5ldCA9IC0xOworc3RhdGljIGludAlkZ3JzX25pY21vZGU7CisKKy8qCisgKglQcml2YXRlIHBlci1ib2FyZCBkYXRhIHN0cnVjdHVyZSAoZGV2LT5wcml2KQorICovCit0eXBlZGVmIHN0cnVjdAoreworCS8qCisJICoJU3R1ZmYgZm9yIGdlbmVyaWMgZXRoZXJjYXJkIEkvRgorCSAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOworCisJLyoKKwkgKglER1JTIHNwZWNpZmljIGRhdGEKKwkgKi8KKwljaGFyCQkqdm1lbTsKKworICAgICAgICBzdHJ1Y3QgYmlvc19jb21tICpiY29tbTsgICAgICAgIC8qIEZpcm13YXJlIEJJT1MgY29tbSBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgUE9SVCAgICAgICAgICAgICpwb3J0OyAgICAgICAgICAvKiBQdHIgdG8gUE9SVFswXSBzdHJ1Y3QgaW4gVk0gKi8KKyAgICAgICAgSTU5Nl9TQ0IgICAgICAgICpzY2JwOyAgICAgICAgICAvKiBQdHIgdG8gU0NCIHN0cnVjdCBpbiBWTSAqLworICAgICAgICBJNTk2X1JGRCAgICAgICAgKnJmZHA7ICAgICAgICAgIC8qIEN1cnJlbnQgUkZEIGxpc3QgKi8KKyAgICAgICAgSTU5Nl9SQkQgICAgICAgICpyYmRwOyAgICAgICAgICAvKiBDdXJyZW50IFJCRCBsaXN0ICovCisKKyAgICAgICAgdm9sYXRpbGUgaW50ICAgIGludHJjbnQ7ICAgICAgICAvKiBDb3VudCBvZiBpbnRlcnJ1cHRzICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogICAgICBTRS00IChFSVNBKSBib2FyZCB2YXJpYWJsZXMKKyAgICAgICAgICovCisgICAgICAgIHVjaGFyCQlpc19yZWc7CQkvKiBFSVNBOiBWYWx1ZSBmb3IgRVM0SF9JUyByZWcgKi8KKworICAgICAgICAvKgorICAgICAgICAgKiAgICAgIFNFLTYgKFBDSSkgYm9hcmQgdmFyaWFibGVzCisgICAgICAgICAqCisgICAgICAgICAqICAgICAgVGhlIFBMWCAiZXhwYW5zaW9uIHJvbSIgc3BhY2UgaXMgdXNlZCBmb3IgRE1BIHJlZ2lzdGVyCisgICAgICAgICAqICAgICAgYWNjZXNzIGZyb20gdGhlIGhvc3Qgb24gdGhlIFNFLTYuICBUaGVzZSBhcmUgdGhlIHBoeXNpY2FsCisgICAgICAgICAqICAgICAgYW5kIHZpcnR1YWwgYWRkcmVzc2VzIG9mIHRoYXQgc3BhY2UuCisgICAgICAgICAqLworICAgICAgICB1bG9uZwkJcGx4cmVnOwkJLyogUGh5cyBhZGRyZXNzIG9mIFBMWCBjaGlwICovCisgICAgICAgIGNoYXIgICAgICAgICAgICAqdnBseHJlZzsJLyogVmlydHVhbCBhZGRyZXNzIG9mIFBMWCBjaGlwICovCisgICAgICAgIHVsb25nCQlwbHhkbWE7CQkvKiBQaHlzIGFkZHIgb2YgUExYICJleHBhbnNpb24gcm9tIiAqLworICAgICAgICB1bG9uZyB2b2xhdGlsZSAgKnZwbHhkbWE7CS8qIFZpcnR1YWwgYWRkciBvZiAiZXhwYW5zaW9uIHJvbSIgKi8KKyAgICAgICAgaW50ICAgICAgICAgICAgIHVzZV9kbWE7ICAgICAgICAvKiBGbGFnOiB1c2UgRE1BICovCisJRE1BQ0hBSU4JKmRtYWRlc2NfczsJLyogYXJlYSBmb3IgRE1BIGNoYWlucyAoU1cgYWRkci4pICovCisJRE1BQ0hBSU4JKmRtYWRlc2NfaDsJLyogYXJlYSBmb3IgRE1BIGNoYWlucyAoSG9zdCBWaXJ0dWFsKSAqLworCisJLyoKKwkgKglNdWx0aS1OSUMgbW9kZSB2YXJpYWJsZXMKKwkgKgorCSAqCUFsbCBlbnRyaWVzIG9mIHRoZSBkZXZ0YmxbXSBhcnJheSBhcmUgdmFsaWQgZm9yIHRoZSAwdGgKKwkgKglkZXZpY2UgKGkuZS4gZXRoMCwgYnV0IG5vdCBldGgxLi4uZXRoNSkuICBkZXZ0YmxbMF0gaXMKKwkgKgl2YWxpZCBmb3IgYWxsIGRldmljZXMgKGkuZS4gZXRoMCwgZXRoMSwgLi4uLCBldGg1KS4KKwkgKi8KKwlpbnQJCW5wb3J0czsJCS8qIE51bWJlciBvZiBwaHlzaWNhbCBwb3J0cyAoNCBvciA2KSAqLworCWludAkJY2hhbjsJCS8qIENoYW5uZWwgIyAoMS02KSBmb3IgdGhpcyBkZXZpY2UgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2dGJsWzZdOwkvKiBQdHJzIHRvIE4gZGV2aWNlIHN0cnVjdHMgKi8KKworfSBER1JTX1BSSVY7CisKKworLyoKKyAqCXJlc2V0IG9yIHVuLXJlc2V0IHRoZSBJRFQgcHJvY2Vzc29yCisgKi8KK3N0YXRpYyB2b2lkCitwcm9jX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYwLCBpbnQgcmVzZXQpCit7CisJREdSU19QUklWCSpwcml2MCA9IChER1JTX1BSSVYgKikgZGV2MC0+cHJpdjsKKworCWlmIChwcml2MC0+cGx4cmVnKQorCXsKKwkJdWxvbmcJCXZhbDsKKwkJdmFsID0gaW5sKGRldjAtPmJhc2VfYWRkciArIFBMWF9NSVNDX0NTUik7CisJCWlmIChyZXNldCkKKwkJCXZhbCB8PSBTRTZfUkVTRVQ7CisJCWVsc2UKKwkJCXZhbCAmPSB+U0U2X1JFU0VUOworCQlPVVRMKGRldjAtPmJhc2VfYWRkciArIFBMWF9NSVNDX0NTUiwgdmFsKTsKKwl9CisJZWxzZQorCXsKKwkJT1VUQihkZXYwLT5iYXNlX2FkZHIgKyBFUzRIX1BDLCByZXNldCA/IEVTNEhfUENfUkVTRVQgOiAwKTsKKwl9Cit9CisKKy8qCisgKglTZWUgaWYgdGhlIGJvYXJkIHN1cHBvcnRzIGJ1cyBtYXN0ZXIgRE1BCisgKi8KK3N0YXRpYyBpbnQKK2NoZWNrX2JvYXJkX2RtYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2MCkKK3sKKwlER1JTX1BSSVYJKnByaXYwID0gKERHUlNfUFJJViAqKSBkZXYwLT5wcml2OworCXVsb25nCXg7CisKKwkvKgorCSAqCUlmIFNwYWNlLmMgc2F5cyBub3QgdG8gdXNlIERNQSwgb3IgaWYgaXQncyBub3QgYSBQTFggYmFzZWQKKwkgKglQQ0kgYm9hcmQsIG9yIGlmIHRoZSBleHBhbnNpb24gUk9NIHNwYWNlIGlzIG5vdCBQQ0kKKwkgKgljb25maWd1cmVkLCB0aGVuIHJldHVybiBmYWxzZS4KKwkgKi8KKwlpZiAoIWRncnNfZG1hIHx8ICFwcml2MC0+cGx4cmVnIHx8ICFwcml2MC0+cGx4ZG1hKQorCQlyZXR1cm4gKDApOworCisJLyoKKwkgKglTZXQgdGhlIGxvY2FsIGFkZHJlc3MgcmVtYXAgcmVnaXN0ZXIgb2YgdGhlICJleHBhbnNpb24gcm9tIgorCSAqCWFyZWEgdG8gMHg4MDAwMDAwMCBzbyB0aGF0IHdlIGNhbiB1c2UgaXQgdG8gYWNjZXNzIHRoZSBETUEKKwkgKglyZWdpc3RlcnMgZnJvbSB0aGUgaG9zdCBzaWRlLgorCSAqLworCU9VVEwoZGV2MC0+YmFzZV9hZGRyICsgUExYX1JPTV9CQVNFX0FERFIsIDB4ODAwMDAwMDApOworCisJLyoKKwkgKiBTZXQgdGhlIFBDSSByZWdpb24gZGVzY3JpcHRvciB0bzoKKwkgKiAgICAgIFNwYWNlIDA6CisJICogICAgICAgICAgICAgIGRpc2FibGUgcmVhZC1wcmVmZXRjaAorCSAqICAgICAgICAgICAgICBlbmFibGUgUkVBRFkKKwkgKiAgICAgICAgICAgICAgZW5hYmxlIEJVUlNUCisJICogICAgICAgICAgICAgIDAgaW50ZXJuYWwgd2FpdCBzdGF0ZXMKKwkgKiAgICAgIEV4cGFuc2lvbiBST006ICh1c2VkIGZvciBob3N0IERNQSByZWdpc3RlciBhY2Nlc3MpCisJICogICAgICAgICAgICAgIGRpc2FibGUgcmVhZC1wcmVmZXRjaAorCSAqICAgICAgICAgICAgICBlbmFibGUgUkVBRFkKKwkgKiAgICAgICAgICAgICAgZGlzYWJsZSBCVVJTVAorCSAqICAgICAgICAgICAgICAwIGludGVybmFsIHdhaXQgc3RhdGVzCisJICovCisJT1VUTChkZXYwLT5iYXNlX2FkZHIgKyBQTFhfQlVTX1JFR0lPTiwgMHg0OTQzMDM0Myk7CisKKwkvKgorCSAqCU5vdyBtYXAgdGhlIERNQSByZWdpc3RlcnMgaW50byBvdXIgdmlydHVhbCBzcGFjZQorCSAqLworCXByaXYwLT52cGx4ZG1hID0gKHVsb25nICopIGlvcmVtYXAgKHByaXYwLT5wbHhkbWEsIDI1Nik7CisJaWYgKCFwcml2MC0+dnBseGRtYSkKKwl7CisJCXByaW50aygiJXM6IGNhbid0ICpyZW1hcCgpIHRoZSBETUEgcmVnc1xuIiwgZGV2MC0+bmFtZSk7CisJCXJldHVybiAoMCk7CisJfQorCisJLyoKKwkgKglOb3cgdGVzdCB0byBzZWUgaWYgd2UgY2FuIGFjY2VzcyB0aGUgRE1BIHJlZ2lzdGVycworCSAqCUlmIHdlIHdyaXRlIC0xIGFuZCBnZXQgYmFjayAxRkZGLCB0aGVuIHdlIGFjY2Vzc2VkIHRoZQorCSAqCURNQSByZWdpc3Rlci4gIE90aGVyd2lzZSwgd2UgcHJvYmFibHkgaGF2ZSBhbiBvbGQgYm9hcmQKKwkgKglhbmQgd3JvdGUgaW50byByZWd1bGFyIFJBTS4KKwkgKi8KKwlwcml2MC0+dnBseGRtYVtQTFhfRE1BMF9NT0RFLzRdID0gMHhGRkZGRkZGRjsKKwl4ID0gcHJpdjAtPnZwbHhkbWFbUExYX0RNQTBfTU9ERS80XTsKKwlpZiAoeCAhPSAweDAwMDAxRkZGKSB7CisJCWlvdW5tYXAoKHZvaWQgKilwcml2MC0+dnBseGRtYSk7CisJCXJldHVybiAoMCk7CisJfQorCisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqCUluaXRpYXRlIERNQSB1c2luZyBQTFggcGFydCBvbiBQQ0kgYm9hcmQuICBTcGluIHRoZQorICoJcHJvY2Vzc29yIHVudGlsIGNvbXBsZXRlZC4gIEFsbCBhZGRyZXNzZXMgYXJlIHBoeXNpY2FsIQorICoKKyAqCUlmIHBjaWFkZHIgaXMgTlVMTCwgdGhlbiBpdCdzIGEgY2hhaW5pbmcgRE1BLCBhbmQgbGNsYWRkciBpcworICoJdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IERNQSBkZXNjcmlwdG9yIGluIHRoZSBjaGFpbi4KKyAqCisgKglJZiBwY2lhZGRyIGlzIG5vdCBOVUxMLCB0aGVuIGl0J3MgYSBzaW5nbGUgRE1BLgorICoKKyAqCUluIGVpdGhlciBjYXNlLCAibGNsYWRkciIgbXVzdCBoYXZlIGJlZW4gZml4ZWQgdXAgdG8gbWFrZQorICoJc3VyZSB0aGUgTVNCIGlzbid0IHNldCB1c2luZyB0aGUgUzJETUEgbWFjcm8gYmVmb3JlIHBhc3NpbmcKKyAqCXRoZSBhZGRyZXNzIHRvIHRoaXMgcm91dGluZS4KKyAqLworc3RhdGljIGludAorZG9fcGx4X2RtYSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXVsb25nIHBjaWFkZHIsCisJdWxvbmcgbGNsYWRkciwKKwlpbnQgbGVuLAorCWludCB0b19ob3N0CispCit7CisgICAgICAgIGludCAgICAgCWk7CisgICAgICAgIHVsb25nICAgCWNzciA9IDA7CisJREdSU19QUklWCSpwcml2ID0gKERHUlNfUFJJViAqKSBkZXYtPnByaXY7CisKKwlpZiAocGNpYWRkcikKKwl7CisJCS8qCisJCSAqCURvIGEgc2luZ2xlLCBub24tY2hhaW4gRE1BCisJCSAqLworCQlwcml2LT52cGx4ZG1hW1BMWF9ETUEwX1BDSV9BRERSLzRdID0gcGNpYWRkcjsKKwkJcHJpdi0+dnBseGRtYVtQTFhfRE1BMF9MQ0xfQUREUi80XSA9IGxjbGFkZHI7CisJCXByaXYtPnZwbHhkbWFbUExYX0RNQTBfU0laRS80XSA9IGxlbjsKKwkJcHJpdi0+dnBseGRtYVtQTFhfRE1BMF9ERVNDUklQVE9SLzRdID0gdG9faG9zdAorCQkJCQk/IFBMWF9ETUFfREVTQ19UT19IT1NUCisJCQkJCTogUExYX0RNQV9ERVNDX1RPX0JPQVJEOworCQlwcml2LT52cGx4ZG1hW1BMWF9ETUEwX01PREUvNF0gPQorCQkJCQkgIFBMWF9ETUFfTU9ERV9XSURUSDMyCisJCQkJCXwgUExYX0RNQV9NT0RFX1dBSVRTVEFURVMoMCkKKwkJCQkJfCBQTFhfRE1BX01PREVfUkVBRFkKKwkJCQkJfCBQTFhfRE1BX01PREVfTk9CVEVSTQorCQkJCQl8IFBMWF9ETUFfTU9ERV9CVVJTVAorCQkJCQl8IFBMWF9ETUFfTU9ERV9OT0NIQUlOOworCX0KKwllbHNlCisJeworCQkvKgorCQkgKglEbyBhIGNoYWluaW5nIERNQQorCQkgKi8KKwkJcHJpdi0+dnBseGRtYVtQTFhfRE1BMF9NT0RFLzRdID0KKwkJCQkJICBQTFhfRE1BX01PREVfV0lEVEgzMgorCQkJCQl8IFBMWF9ETUFfTU9ERV9XQUlUU1RBVEVTKDApCisJCQkJCXwgUExYX0RNQV9NT0RFX1JFQURZCisJCQkJCXwgUExYX0RNQV9NT0RFX05PQlRFUk0KKwkJCQkJfCBQTFhfRE1BX01PREVfQlVSU1QKKwkJCQkJfCBQTFhfRE1BX01PREVfQ0hBSU47CisJCXByaXYtPnZwbHhkbWFbUExYX0RNQTBfREVTQ1JJUFRPUi80XSA9IGxjbGFkZHI7CisJfQorCisJcHJpdi0+dnBseGRtYVtQTFhfRE1BX0NTUi80XSA9CisJCQkJUExYX0RNQV9DU1JfMF9FTkFCTEUgfCBQTFhfRE1BX0NTUl8wX1NUQVJUOworCisgICAgICAgIC8qCisJICoJV2FpdCBmb3IgRE1BIHRvIGNvbXBsZXRlCisJICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwMDAwOyArK2kpCisgICAgICAgIHsKKwkJLyoKKwkJICoJU3BpbiB0aGUgaG9zdCBDUFUgZm9yIDEgdXNlYywgc28gd2UgZG9uJ3QgdGhyYXNoCisJCSAqCXRoZSBQQ0kgYnVzIHdoaWxlIHRoZSBQTFggOTA2MCBpcyBkb2luZyBETUEuCisJCSAqLworCQl1ZGVsYXkoMSk7CisKKwkJY3NyID0gKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcpIHByaXYtPnZwbHhkbWFbUExYX0RNQV9DU1IvNF07CisKKyAgICAgICAgICAgICAgICBpZiAoY3NyICYgUExYX0RNQV9DU1JfMF9ET05FKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoICEgKGNzciAmIFBMWF9ETUFfQ1NSXzBfRE9ORSkgKQorICAgICAgICB7CisJCXByaW50aygiJXM6IERNQSBkb25lIG5ldmVyIG9jY3VycmVkLiBETUEgZGlzYWJsZWQuXG4iLAorCQkJZGV2LT5uYW1lKTsKKwkJcHJpdi0+dXNlX2RtYSA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKglkZ3JzX3Jjdl9mcmFtZSgpCisgKgorICoJUHJvY2VzcyBhIHJlY2VpdmVkIGZyYW1lLiAgVGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgaW50ZXJydXB0CisgKglyb3V0aW5lLCBhbmQgd29ya3MgZm9yIGJvdGggc3dpdGNoIG1vZGUgYW5kIG11bHRpLU5JQyBtb2RlLgorICoKKyAqCU5vdGUgdGhhdCB3aGVuIGluIG11bHRpLU5JQyBtb2RlLCB3ZSB3YW50IHRvIGFsd2F5cyBhY2Nlc3MgdGhlCisgKgloYXJkd2FyZSB1c2luZyB0aGUgZGV2IGFuZCBwcml2IHN0cnVjdHVyZXMgb2YgdGhlIGZpcnN0IHBvcnQsCisgKglzbyB0aGF0IHdlIGFyZSB1c2luZyBvbmx5IG9uZSBzZXQgb2YgdmFyaWFibGVzIHRvIG1haW50YWluCisgKgl0aGUgYm9hcmQgaW50ZXJmYWNlIHN0YXR1cywgYnV0IHdlIHdhbnQgdG8gdXNlIHRoZSBOdGggcG9ydAorICoJZGV2IGFuZCBwcml2IHN0cnVjdHVyZXMgdG8gbWFpbnRhaW4gc3RhdGlzdGljcyBhbmQgdG8gcGFzcworICoJdGhlIHBhY2tldCB1cC4KKyAqCisgKglPbmx5IHRoZSBmaXJzdCBkZXZpY2Ugc3RydWN0dXJlIGlzIGF0dGFjaGVkIHRvIHRoZSBpbnRlcnJ1cHQuCisgKglXZSB1c2UgdGhlIHNwZWNpYWwgImNoYW4iIHZhcmlhYmxlIGF0IHRoZSBlbmQgb2YgdGhlIGZpcnN0IFJCRAorICoJdG8gc2VsZWN0IHRoZSBOdGggZGV2aWNlIGluIG11bHRpLU5JQyBtb2RlLgorICoKKyAqCVdlIGN1cnJlbnRseSBkbyBjaGFpbmVkIERNQSBvbiBhIHBlci1wYWNrZXQgYmFzaXMgd2hlbiB0aGUKKyAqCXBhY2tldCBpcyAibG9uZyIsIGFuZCB3ZSBzcGluIHRoZSBDUFUgYSBzaG9ydCB0aW1lIHBvbGxpbmcKKyAqCWZvciBETUEgY29tcGxldGlvbi4gIFRoaXMgYXZvaWRzIGEgc2Vjb25kIGludGVycnVwdCBvdmVyaGVhZCwKKyAqCWFuZCBnaXZlcyB0aGUgYmVzdCBwZXJmb3JtYW5jZSBmb3IgbGlnaHQgdHJhZmZpYyB0byB0aGUgaG9zdC4KKyAqCisgKglIb3dldmVyLCBhIGJldHRlciBzY2hlbWUgdGhhdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCB3b3VsZCBiZQorICoJdG8gc2VlIGhvdyBtYW55IHBhY2tldHMgYXJlIG91dHN0YW5kaW5nIGZvciB0aGUgaG9zdCwgYW5kIGlmCisgKgl0aGUgbnVtYmVyIGlzICJsYXJnZSIsIGNyZWF0ZSBhIGxvbmcgY2hhaW4gdG8gRE1BIHNldmVyYWwKKyAqCXBhY2tldHMgaW50byB0aGUgaG9zdCBpbiBvbmUgZ28uICBJbiB0aGlzIGNhc2UsIHdlIHdvdWxkIHNldAorICoJdXAgc29tZSBzdGF0ZSB2YXJpYWJsZXMgdG8gbGV0IHRoZSBob3N0IENQVSBjb250aW51ZSBkb2luZworICoJb3RoZXIgdGhpbmdzIHVudGlsIGEgRE1BIGNvbXBsZXRpb24gaW50ZXJydXB0IGNvbWVzIGFsb25nLgorICovCitzdGF0aWMgdm9pZAorZGdyc19yY3ZfZnJhbWUoCisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjAsCisJREdSU19QUklWCSpwcml2MCwKKwlJNTk2X0NCCQkqY2JwCispCit7CisJaW50CQlsZW47CisJSTU5Nl9UQkQJKnRiZHA7CisJc3RydWN0IHNrX2J1ZmYJKnNrYjsKKwl1Y2hhcgkJKnB1dHA7CisJdWNoYXIJCSpwOworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXZOOworCURHUlNfUFJJVgkqcHJpdk47CisKKwkvKgorCSAqCURldGVybWluZSBOdGggcHJpdiBhbmQgZGV2IHN0cnVjdHVyZSBwb2ludGVycworCSAqLworCWlmIChkZ3JzX25pY21vZGUpCisJewkvKiBNdWx0aS1OSUMgbW9kZSAqLworCQlpbnQgY2hhbiA9ICgoSTU5Nl9SQkQgKikgUzJIKGNicC0+eG1pdC50YmRwKSktPmNoYW47CisKKwkJZGV2TiA9IHByaXYwLT5kZXZ0YmxbY2hhbi0xXTsKKwkJLyoKKwkJICogSWYgZGV2TiBpcyBudWxsLCB3ZSBnb3QgYW4gaW50ZXJydXB0IGJlZm9yZSB0aGUgSS9GCisJCSAqIGhhcyBiZWVuIGluaXRpYWxpemVkLiAgUGl0Y2ggdGhlIHBhY2tldC4KKwkJICovCisJCWlmIChkZXZOID09IE5VTEwpCisJCQlnb3RvIG91dDsKKwkJcHJpdk4gPSAoREdSU19QUklWICopIGRldk4tPnByaXY7CisJfQorCWVsc2UKKwl7CS8qIFN3aXRjaCBtb2RlICovCisJCWRldk4gPSBkZXYwOworCQlwcml2TiA9IHByaXYwOworCX0KKworCWlmICgwKSBwcmludGsoIiVzOiByY3YgbGVuPSVsZFxuIiwgZGV2Ti0+bmFtZSwgY2JwLT54bWl0LmNvdW50KTsKKworCS8qCisJICoJQWxsb2NhdGUgYSBtZXNzYWdlIGJsb2NrIGJpZyBlbm91Z2ggdG8gaG9sZCB0aGUgd2hvbGUgZnJhbWUKKwkgKi8KKwlsZW4gPSBjYnAtPnhtaXQuY291bnQ7CisJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbis1KSkgPT0gTlVMTCkKKwl7CisJCXByaW50aygiJXM6IGRldl9hbGxvY19za2IgZmFpbGVkIGZvciByY3YgYnVmZmVyXG4iLCBkZXZOLT5uYW1lKTsKKwkJKytwcml2Ti0+c3RhdHMucnhfZHJvcHBlZDsKKwkJLyogZGlzY2FyZGluZyB0aGUgZnJhbWUgKi8KKwkJZ290byBvdXQ7CisJfQorCXNrYi0+ZGV2ID0gZGV2TjsKKwlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBBbGlnbiBJUCBoZWFkZXIgKi8KKworYWdhaW46CisJcHV0cCA9IHAgPSBza2JfcHV0KHNrYiwgbGVuKTsKKworCS8qCisJICoJVGhlcmUgYXJlIHRocmVlIG1vZGVzIGhlcmUgZm9yIGRvaW5nIHRoZSBwYWNrZXQgY29weS4KKwkgKglJZiB3ZSBoYXZlIERNQSwgYW5kIHRoZSBwYWNrZXQgaXMgImxvbmciLCB3ZSB1c2UgdGhlCisJICoJY2hhaW5pbmcgbW9kZSBvZiBETUEuICBJZiBpdCdzIHNob3J0ZXIsIHdlIHVzZSBzaW5nbGUKKwkgKglETUEncy4gIE90aGVyd2lzZSwgd2UgdXNlIG1lbWNweSgpLgorCSAqLworCWlmIChwcml2MC0+dXNlX2RtYSAmJiBwcml2MC0+ZG1hZGVzY19oICYmIGxlbiA+IDY0KQorCXsKKwkJLyoKKwkJICoJSWYgd2UgY2FuIHVzZSBETUEgYW5kIGl0J3MgYSBsb25nIGZyYW1lLCBjb3B5IGl0IHVzaW5nCisJCSAqCURNQSBjaGFpbmluZy4KKwkJICovCisJCURNQUNIQUlOCSpkZHBfaDsJLyogSG9zdCB2aXJ0dWFsIERNQSBkZXNjLiBwb2ludGVyICovCisJCURNQUNIQUlOCSpkZHBfczsJLyogU3dpdGNoIHBoeXNpY2FsIERNQSBkZXNjLiBwb2ludGVyICovCisJCXVjaGFyCQkqcGh5c19wOworCisJCS8qCisJCSAqCUdldCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgU1RSRUFNUyBidWZmZXIuCisJCSAqCU5PVEU6IGFsbG9jYigpIGd1YXJhbnRlZXMgdGhhdCB0aGUgd2hvbGUgYnVmZmVyCisJCSAqCWlzIGluIGEgc2luZ2xlIHBhZ2UgaWYgdGhlIGxlbmd0aCA8IDQwOTYuCisJCSAqLworCQlwaHlzX3AgPSAodWNoYXIgKikgdmlydF90b19waHlzKHB1dHApOworCisJCWRkcF9oID0gcHJpdjAtPmRtYWRlc2NfaDsKKwkJZGRwX3MgPSBwcml2MC0+ZG1hZGVzY19zOworCQl0YmRwID0gKEk1OTZfVEJEICopIFMySChjYnAtPnhtaXQudGJkcCk7CisJCWZvciAoOzspCisJCXsKKwkJCWludAljb3VudDsKKwkJCWludAlhbXQ7CisKKwkJCWNvdW50ID0gdGJkcC0+Y291bnQ7CisJCQlhbXQgPSBjb3VudCAmIDB4M2ZmZjsKKwkJCWlmIChhbXQgPT0gMCkKKwkJCQlicmVhazsgLyogRm9yIHNhZmV0eSAqLworCQkJaWYgKCAocC1wdXRwKSA+PSBsZW4pCisJCQl7CisJCQkJcHJpbnRrKCIlczogY2JwID0gJWx4XG4iLCBkZXZOLT5uYW1lLCAobG9uZykgSDJTKGNicCkpOworCQkJCXByb2NfcmVzZXQoZGV2MCwgMSk7CS8qIEZyZWV6ZSBJRFQgKi8KKwkJCQlicmVhazsgLyogRm9yIFNhZmV0eSAqLworCQkJfQorCisJCQlkZHBfaC0+cGNpYWRkciA9ICh1bG9uZykgcGh5c19wOworCQkJZGRwX2gtPmxjbGFkZHIgPSBTMkRNQSh0YmRwLT5idWYpOworCQkJZGRwX2gtPmxlbiA9IGFtdDsKKworCQkJcGh5c19wICs9IGFtdDsKKwkJCXAgKz0gYW10OworCisJCQlpZiAoY291bnQgJiBJNTk2X1RCRF9FT0YpCisJCQl7CisJCQkJZGRwX2gtPm5leHQgPSBQTFhfRE1BX0RFU0NfVE9fSE9TVAorCQkJCQkJfCBQTFhfRE1BX0RFU0NfRU9DOworCQkJCSsrZGRwX2g7CisJCQkJYnJlYWs7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKytkZHBfczsKKwkJCQlkZHBfaC0+bmV4dCA9IFBMWF9ETUFfREVTQ19UT19IT1NUCisJCQkJCQl8ICh1bG9uZykgZGRwX3M7CisJCQkJdGJkcCA9IChJNTk2X1RCRCAqKSBTMkgodGJkcC0+bmV4dCk7CisJCQkJKytkZHBfaDsKKwkJCX0KKwkJfQorCQlpZiAoZGRwX2ggLSBwcml2MC0+ZG1hZGVzY19oKQorCQl7CisJCQlpbnQJcmM7CisKKwkJCXJjID0gZG9fcGx4X2RtYShkZXYwLAorCQkJCTAsICh1bG9uZykgcHJpdjAtPmRtYWRlc2NfcywgbGVuLCAwKTsKKwkJCWlmIChyYykKKwkJCXsKKwkJCQlwcmludGsoIiVzOiBDaGFpbmVkIERNQSBmYWlsdXJlXG4iLCBkZXZOLT5uYW1lKTsKKwkJCQlnb3RvIGFnYWluOworCQkJfQorCQl9CisJfQorCWVsc2UgaWYgKHByaXYwLT51c2VfZG1hKQorCXsKKwkJLyoKKwkJICoJSWYgd2UgY2FuIHVzZSBETUEgYW5kIGl0J3MgYSBzaG9ydGVyIGZyYW1lLCBjb3B5IGl0CisJCSAqCXVzaW5nIHNpbmdsZSBETUEgdHJhbnNmZXJzLgorCQkgKi8KKwkJdWNoYXIJCSpwaHlzX3A7CisKKwkJLyoKKwkJICoJR2V0IHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBTVFJFQU1TIGJ1ZmZlci4KKwkJICoJTk9URTogYWxsb2NiKCkgZ3VhcmFudGVlcyB0aGF0IHRoZSB3aG9sZSBidWZmZXIKKwkJICoJaXMgaW4gYSBzaW5nbGUgcGFnZSBpZiB0aGUgbGVuZ3RoIDwgNDA5Ni4KKwkJICovCisJCXBoeXNfcCA9ICh1Y2hhciAqKSB2aXJ0X3RvX3BoeXMocHV0cCk7CisKKwkJdGJkcCA9IChJNTk2X1RCRCAqKSBTMkgoY2JwLT54bWl0LnRiZHApOworCQlmb3IgKDs7KQorCQl7CisJCQlpbnQJY291bnQ7CisJCQlpbnQJYW10OworCQkJaW50CXJjOworCisJCQljb3VudCA9IHRiZHAtPmNvdW50OworCQkJYW10ID0gY291bnQgJiAweDNmZmY7CisJCQlpZiAoYW10ID09IDApCisJCQkJYnJlYWs7IC8qIEZvciBzYWZldHkgKi8KKwkJCWlmICggKHAtcHV0cCkgPj0gbGVuKQorCQkJeworCQkJCXByaW50aygiJXM6IGNicCA9ICVseFxuIiwgZGV2Ti0+bmFtZSwgKGxvbmcpIEgyUyhjYnApKTsKKwkJCQlwcm9jX3Jlc2V0KGRldjAsIDEpOwkvKiBGcmVlemUgSURUICovCisJCQkJYnJlYWs7IC8qIEZvciBTYWZldHkgKi8KKwkJCX0KKwkJCXJjID0gZG9fcGx4X2RtYShkZXYwLCAodWxvbmcpIHBoeXNfcCwKKwkJCQkJCVMyRE1BKHRiZHAtPmJ1ZiksIGFtdCwgMSk7CisJCQlpZiAocmMpCisJCQl7CisJCQkJbWVtY3B5KHAsIFMySCh0YmRwLT5idWYpLCBhbXQpOworCQkJCXByaW50aygiJXM6IFNpbmdsZSBETUEgZmFpbGVkXG4iLCBkZXZOLT5uYW1lKTsKKwkJCX0KKwkJCXBoeXNfcCArPSBhbXQ7CisJCQlwICs9IGFtdDsKKwkJCWlmIChjb3VudCAmIEk1OTZfVEJEX0VPRikKKwkJCQlicmVhazsKKwkJCXRiZHAgPSAoSTU5Nl9UQkQgKikgUzJIKHRiZHAtPm5leHQpOworCQl9CisJfQorCWVsc2UKKwl7CisJCS8qCisJCSAqCU90aGVyd2lzZSwgY29weSBpdCBwaWVjZSBieSBwaWVjZSB1c2luZyBtZW1jcHkoKQorCQkgKi8KKwkJdGJkcCA9IChJNTk2X1RCRCAqKSBTMkgoY2JwLT54bWl0LnRiZHApOworCQlmb3IgKDs7KQorCQl7CisJCQlpbnQJY291bnQ7CisJCQlpbnQJYW10OworCisJCQljb3VudCA9IHRiZHAtPmNvdW50OworCQkJYW10ID0gY291bnQgJiAweDNmZmY7CisJCQlpZiAoYW10ID09IDApCisJCQkJYnJlYWs7IC8qIEZvciBzYWZldHkgKi8KKwkJCWlmICggKHAtcHV0cCkgPj0gbGVuKQorCQkJeworCQkJCXByaW50aygiJXM6IGNicCA9ICVseFxuIiwgZGV2Ti0+bmFtZSwgKGxvbmcpIEgyUyhjYnApKTsKKwkJCQlwcm9jX3Jlc2V0KGRldjAsIDEpOwkvKiBGcmVlemUgSURUICovCisJCQkJYnJlYWs7IC8qIEZvciBTYWZldHkgKi8KKwkJCX0KKwkJCW1lbWNweShwLCBTMkgodGJkcC0+YnVmKSwgYW10KTsKKwkJCXAgKz0gYW10OworCQkJaWYgKGNvdW50ICYgSTU5Nl9UQkRfRU9GKQorCQkJCWJyZWFrOworCQkJdGJkcCA9IChJNTk2X1RCRCAqKSBTMkgodGJkcC0+bmV4dCk7CisJCX0KKwl9CisKKwkvKgorCSAqCVBhc3MgdGhlIGZyYW1lIHRvIHVwcGVyIGhhbGYKKwkgKi8KKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXZOKTsKKwluZXRpZl9yeChza2IpOworCWRldk4tPmxhc3RfcnggPSBqaWZmaWVzOworCSsrcHJpdk4tPnN0YXRzLnJ4X3BhY2tldHM7CisJcHJpdk4tPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKworb3V0OgorCWNicC0+eG1pdC5zdGF0dXMgPSBJNTk2X0NCX1NUQVRVU19DIHwgSTU5Nl9DQl9TVEFUVVNfT0s7Cit9CisKKy8qCisgKglTdGFydCB0cmFuc21pc3Npb24gb2YgYSBmcmFtZQorICoKKyAqCVRoZSBpbnRlcmZhY2UgdG8gdGhlIGJvYXJkIGlzIHNpbXBsZTogd2UgcHJldGVuZCB0aGF0IHdlIGFyZQorICoJYSBmaWZ0aCA4MjU5NiBldGhlcm5ldCBjb250cm9sbGVyICdyZWNlaXZpbmcnIGRhdGEsIGFuZCBjb3B5IHRoZQorICoJZGF0YSBpbnRvIHRoZSBzYW1lIHN0cnVjdHVyZXMgdGhhdCBhIHJlYWwgODI1OTYgd291bGQuICBUaGlzIHdheSwKKyAqCXRoZSBib2FyZCBmaXJtd2FyZSBoYW5kbGVzIHRoZSBob3N0ICdwb3J0JyB0aGUgc2FtZSBhcyBhbnkgb3RoZXIuCisgKgorICoJTk9URTogd2UgZG8gbm90IHVzZSBCdXMgbWFzdGVyIERNQSBmb3IgdGhpcyByb3V0aW5lLiAgVHVybnMgb3V0CisgKgl0aGF0IGl0IGlzIG5vdCBuZWVkZWQuICBTbGF2ZSB3cml0ZXMgb3ZlciB0aGUgUENJIGJ1cyBhcmUgYWJvdXQKKyAqCWFzIGZhc3QgYXMgRE1BLCBkdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGUgUExYIHBhcnQgY2FuIGRvIGJ1cnN0CisgKgl3cml0ZXMuICBUaGUgc2FtZSBpcyBub3QgdHJ1ZSBmb3IgZGF0YSBiZWluZyByZWFkIGZyb20gdGhlIGJvYXJkLgorICoKKyAqCUZvciBtdWx0aS1OSUMgbW9kZSwgd2UgdGVsbCB0aGUgZmlybXdhcmUgdGhlIGRlc2lyZWQgODI1OTYKKyAqCW91dHB1dCBwb3J0IGJ5IHNldHRpbmcgdGhlIHNwZWNpYWwgImRzdGNoYW4iIG1lbWJlciBhdCB0aGUKKyAqCWVuZCBvZiB0aGUgdHJhZGl0aW9uYWwgODI1OTYgUkZEIHN0cnVjdHVyZS4KKyAqLworCitzdGF0aWMgaW50IGRncnNfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2TikKK3sKKwlER1JTX1BSSVYJKnByaXZOID0gKERHUlNfUFJJViAqKSBkZXZOLT5wcml2OworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXYwOworCURHUlNfUFJJVgkqcHJpdjA7CisJSTU5Nl9SQkQJKnJiZHA7CisJaW50CQljb3VudDsKKwlpbnQJCWksIGxlbiwgYW10OworCisJLyoKKwkgKglEZXRlcm1pbmUgMHRoIHByaXYgYW5kIGRldiBzdHJ1Y3R1cmUgcG9pbnRlcnMKKwkgKi8KKwlpZiAoZGdyc19uaWNtb2RlKQorCXsKKwkJZGV2MCA9IHByaXZOLT5kZXZ0YmxbMF07CisJCXByaXYwID0gKERHUlNfUFJJViAqKSBkZXYwLT5wcml2OworCX0KKwllbHNlCisJeworCQlkZXYwID0gZGV2TjsKKwkJcHJpdjAgPSBwcml2TjsKKwl9CisKKwlpZiAoZGdyc19kZWJ1ZyA+IDEpCisJCXByaW50aygiJXM6IHhtaXQgbGVuPSVkXG4iLCBkZXZOLT5uYW1lLCAoaW50KSBza2ItPmxlbik7CisKKwlkZXZOLT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2Tik7CisKKwlpZiAocHJpdjAtPnJmZHAtPmNtZCAmIEk1OTZfUkZEX0VMKQorCXsJLyogT3V0IG9mIFJGRCdzICovCisJCWlmICgwKSBwcmludGsoIiVzOiBOTyBSRkQnc1xuIiwgZGV2Ti0+bmFtZSk7CisJCWdvdG8gbm9fcmVzb3VyY2VzOworCX0KKworCXJiZHAgPSBwcml2MC0+cmJkcDsKKwljb3VudCA9IDA7CisJcHJpdjAtPnJmZHAtPnJiZHAgPSAoSTU5Nl9SQkQgKikgSDJTKHJiZHApOworCisJaSA9IDA7IGxlbiA9IHNrYi0+bGVuOworCWZvciAoOzspCisJeworCQlpZiAocmJkcC0+c2l6ZSAmIEk1OTZfUkJEX0VMKQorCQl7CS8qIE91dCBvZiBSQkQncyAqLworCQkJaWYgKDApIHByaW50aygiJXM6IE5PIFJCRCdzXG4iLCBkZXZOLT5uYW1lKTsKKwkJCWdvdG8gbm9fcmVzb3VyY2VzOworCQl9CisKKwkJYW10ID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIHJiZHAtPnNpemUgLSBjb3VudCk7CisJCW1lbWNweSggKGNoYXIgKikgUzJIKHJiZHAtPmJ1ZikgKyBjb3VudCwgc2tiLT5kYXRhICsgaSwgYW10KTsKKwkJaSArPSBhbXQ7CisJCWNvdW50ICs9IGFtdDsKKwkJbGVuIC09IGFtdDsKKwkJaWYgKGxlbiA9PSAwKQorCQl7CisJCQlpZiAoc2tiLT5sZW4gPCA2MCkKKwkJCQlyYmRwLT5jb3VudCA9IDYwIHwgSTU5Nl9SQkRfRU9GOworCQkJZWxzZQorCQkJCXJiZHAtPmNvdW50ID0gY291bnQgfCBJNTk2X1JCRF9FT0Y7CisJCQlyYmRwID0gKEk1OTZfUkJEICopIFMySChyYmRwLT5uZXh0KTsKKwkJCWdvdG8gZnJhbWVfZG9uZTsKKwkJfQorCQllbHNlIGlmIChjb3VudCA8IDMyKQorCQl7CisJCQkvKiBNb3JlIGRhdGEgdG8gY29tZSwgYnV0IHdlIHVzZWQgbGVzcyB0aGFuIDMyCisJCQkgKiBieXRlcyBvZiB0aGlzIFJCRC4gIEtlZXAgZmlsbGluZyB0aGlzIFJCRC4KKwkJCSAqLworCQkJe30JLyogWWVzLCB3ZSBkbyBub3RoaW5nIGhlcmUgKi8KKwkJfQorCQllbHNlCisJCXsKKwkJCXJiZHAtPmNvdW50ID0gY291bnQ7CisJCQlyYmRwID0gKEk1OTZfUkJEICopIFMySChyYmRwLT5uZXh0KTsKKwkJCWNvdW50ID0gMDsKKwkJfQorCX0KKworZnJhbWVfZG9uZToKKwlwcml2MC0+cmJkcCA9IHJiZHA7CisJaWYgKGRncnNfbmljbW9kZSkKKwkJcHJpdjAtPnJmZHAtPmRzdGNoYW4gPSBwcml2Ti0+Y2hhbjsKKwlwcml2MC0+cmZkcC0+c3RhdHVzID0gSTU5Nl9SRkRfQyB8IEk1OTZfUkZEX09LOworCXByaXYwLT5yZmRwID0gKEk1OTZfUkZEICopIFMySChwcml2MC0+cmZkcC0+bmV4dCk7CisKKwkrK3ByaXZOLT5zdGF0cy50eF9wYWNrZXRzOworCisJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKwlyZXR1cm4gKDApOworCitub19yZXNvdXJjZXM6CisJcHJpdjAtPnNjYnAtPnN0YXR1cyB8PSBJNTk2X1NDQl9STlI7CS8qIHNpbXVsYXRlIEk4MjU5NiAqLworCXJldHVybiAoLUVBR0FJTik7Cit9CisKKy8qCisgKglPcGVuIHRoZSBpbnRlcmZhY2UKKyAqLworc3RhdGljIGludAorZGdyc19vcGVuKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKglDbG9zZSB0aGUgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyBpbnQgZGdyc19jbG9zZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKglHZXQgc3RhdGlzdGljcworICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmRncnNfZ2V0X3N0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlER1JTX1BSSVYJKnByaXYgPSAoREdSU19QUklWICopIGRldi0+cHJpdjsKKworCXJldHVybiAoJnByaXYtPnN0YXRzKTsKK30KKworLyoKKyAqCVNldCBtdWx0aWNhc3QgbGlzdCBhbmQvb3IgcHJvbWlzY3VvdXMgbW9kZQorICovCisKK3N0YXRpYyB2b2lkIGRncnNfc2V0X211bHRpY2FzdF9saXN0KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCURHUlNfUFJJVgkqcHJpdiA9IChER1JTX1BSSVYgKikgZGV2LT5wcml2OworCisJcHJpdi0+cG9ydC0+aXNfcHJvbWlzYyA9IChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpID8gMSA6IDA7Cit9CisKKy8qCisgKglVbmlxdWUgaW9jdGwncworICovCitzdGF0aWMgaW50IGRncnNfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldk4sIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCURHUlNfUFJJVgkqcHJpdk4gPSAoREdSU19QUklWICopIGRldk4tPnByaXY7CisJREdSU19JT0NUTAlpb2M7CisJaW50CQlpOworCisJaWYgKGNtZCAhPSBER1JTSU9DVEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYoY29weV9mcm9tX3VzZXIoJmlvYywgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKERHUlNfSU9DVEwpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKGlvYy5jbWQpCisJeworCQljYXNlIERHUlNfR0VUTUVNOgorCQkJaWYgKGlvYy5sZW4gIT0gc2l6ZW9mKHVsb25nKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmKGNvcHlfdG9fdXNlcihpb2MuZGF0YSwgJmRldk4tPm1lbV9zdGFydCwgaW9jLmxlbikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gKDApOworCQljYXNlIERHUlNfU0VURklMVEVSOgorCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJCXJldHVybiAtRVBFUk07CisJCQlpZiAoaW9jLnBvcnQgPiBwcml2Ti0+YmNvbW0tPmJjX25wb3J0cykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChpb2MuZmlsdGVyID49IE5GSUxURVJTKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKGlvYy5sZW4gPiBwcml2Ti0+YmNvbW0tPmJjX2ZpbHRlcl9hcmVhX2xlbikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJLyogV2FpdCBmb3Igb2xkIGNvbW1hbmQgdG8gZmluaXNoICovCisJCQlmb3IgKGkgPSAwOyBpIDwgMTAwMDsgKytpKQorCQkJeworCQkJCWlmICggKHZvbGF0aWxlIGxvbmcpIHByaXZOLT5iY29tbS0+YmNfZmlsdGVyX2NtZCA8PSAwICkKKwkJCQkJYnJlYWs7CisJCQkJdWRlbGF5KDEpOworCQkJfQorCQkJaWYgKGkgPj0gMTAwMCkKKwkJCQlyZXR1cm4gLUVJTzsKKworCQkJcHJpdk4tPmJjb21tLT5iY19maWx0ZXJfcG9ydCA9IGlvYy5wb3J0OworCQkJcHJpdk4tPmJjb21tLT5iY19maWx0ZXJfbnVtID0gaW9jLmZpbHRlcjsKKwkJCXByaXZOLT5iY29tbS0+YmNfZmlsdGVyX2xlbiA9IGlvYy5sZW47CisJCisJCQlpZiAoaW9jLmxlbikKKwkJCXsKKwkJCQlpZihjb3B5X2Zyb21fdXNlcihTMkhOKHByaXZOLT5iY29tbS0+YmNfZmlsdGVyX2FyZWEpLAorCQkJCQlpb2MuZGF0YSwgaW9jLmxlbikpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXByaXZOLT5iY29tbS0+YmNfZmlsdGVyX2NtZCA9IEJDX0ZJTFRFUl9TRVQ7CisJCQl9CisJCQllbHNlCisJCQkJcHJpdk4tPmJjb21tLT5iY19maWx0ZXJfY21kID0gQkNfRklMVEVSX0NMUjsKKwkJCXJldHVybigwKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9Cit9CisKKy8qCisgKglQcm9jZXNzIGludGVycnVwdHMKKyAqCisgKglkZXYsIHByaXYgd2lsbCBhbHdheXMgcmVmZXIgdG8gdGhlIDB0aCBkZXZpY2UgaW4gTXVsdGktTklDIG1vZGUuCisgKi8KKworc3RhdGljIGlycXJldHVybl90IGRncnNfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXYwID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlER1JTX1BSSVYJKnByaXYwID0gKERHUlNfUFJJViAqKSBkZXYwLT5wcml2OworCUk1OTZfQ0IJCSpjYnA7CisJaW50CQljbWQ7CisJaW50CQlpOworCisJKytwcml2MC0+aW50cmNudDsKKwlpZiAoMSkgKytwcml2MC0+YmNvbW0tPmJjX2NudFs0XTsKKwlpZiAoMCkKKwl7CisJCXN0YXRpYyBpbnQgY250ID0gMTAwOworCQlpZiAoLS1jbnQgPiAwKQorCQlwcmludGsoIiVzOiBpbnRlcnJ1cHQ6IGlycSAlZFxuIiwgZGV2MC0+bmFtZSwgaXJxKTsKKwl9CisKKwkvKgorCSAqCUdldCA1OTYgY29tbWFuZAorCSAqLworCWNtZCA9IHByaXYwLT5zY2JwLT5jbWQ7CisKKwkvKgorCSAqCVNlZSBpZiBSVSBoYXMgYmVlbiByZXN0YXJ0ZWQKKwkgKi8KKwlpZiAoIChjbWQgJiBJNTk2X1NDQl9SVUMpID09IEk1OTZfU0NCX1JVQ19TVEFSVCkKKwl7CisJCWlmICgwKSBwcmludGsoIiVzOiBSVUMgc3RhcnRcbiIsIGRldjAtPm5hbWUpOworCQlwcml2MC0+cmZkcCA9IChJNTk2X1JGRCAqKSBTMkgocHJpdjAtPnNjYnAtPnJmZHApOworCQlwcml2MC0+cmJkcCA9IChJNTk2X1JCRCAqKSBTMkgocHJpdjAtPnJmZHAtPnJiZHApOworCQlwcml2MC0+c2NicC0+c3RhdHVzICY9IH4oSTU5Nl9TQ0JfUk5SfEk1OTZfU0NCX1JVUyk7CisJCS8qCisJCSAqIFRlbGwgdXBwZXIgaGFsZiAoaGFsdmVzKQorCQkgKi8KKwkJaWYgKGRncnNfbmljbW9kZSkKKwkJeworCQkJZm9yIChpID0gMDsgaSA8IHByaXYwLT5ucG9ydHM7ICsraSkKKwkJCQluZXRpZl93YWtlX3F1ZXVlIChwcml2MC0+ZGV2dGJsW2ldKTsKKwkJfQorCQllbHNlCisJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYwKTsKKwkJLyogaWYgKGJkLT5mbGFncyAmIFRYX1FVRVVFRCkKKwkJCURMX3NjaGVkKGJkLCBiZGQpOyAqLworCX0KKworCS8qCisJICoJU2VlIGlmIGFueSBDVSBjb21tYW5kcyB0byBwcm9jZXNzCisJICovCisJaWYgKCAoY21kICYgSTU5Nl9TQ0JfQ1VDKSAhPSBJNTk2X1NDQl9DVUNfU1RBUlQpCisJeworCQlwcml2MC0+c2NicC0+Y21kID0gMDsJLyogSWdub3JlIGFsbCBvdGhlciBjb21tYW5kcyAqLworCQlnb3RvIGFja19pbnRyOworCX0KKwlwcml2MC0+c2NicC0+c3RhdHVzICY9IH4oSTU5Nl9TQ0JfQ05BfEk1OTZfU0NCX0NVUyk7CisKKwkvKgorCSAqCVByb2Nlc3MgYSBjb21tYW5kCisJICovCisJY2JwID0gKEk1OTZfQ0IgKikgUzJIKHByaXYwLT5zY2JwLT5jYnApOworCXByaXYwLT5zY2JwLT5jbWQgPSAwOwkvKiBTYWZlIHRvIGNsZWFyIHRoZSBjb21tYW5kICovCisJZm9yICg7OykKKwl7CisJCXN3aXRjaCAoY2JwLT5ub3AuY21kICYgSTU5Nl9DQl9DTUQpCisJCXsKKwkJY2FzZSBJNTk2X0NCX0NNRF9YTUlUOgorCQkJZGdyc19yY3ZfZnJhbWUoZGV2MCwgcHJpdjAsIGNicCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNicC0+bm9wLnN0YXR1cyA9IEk1OTZfQ0JfU1RBVFVTX0MgfCBJNTk2X0NCX1NUQVRVU19PSzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjYnAtPm5vcC5jbWQgJiBJNTk2X0NCX0NNRF9FTCkKKwkJCWJyZWFrOworCQljYnAgPSAoSTU5Nl9DQiAqKSBTMkgoY2JwLT5ub3AubmV4dCk7CisJfQorCXByaXYwLT5zY2JwLT5zdGF0dXMgfD0gSTU5Nl9TQ0JfQ05BOworCisJLyoKKwkgKiBBY2sgdGhlIGludGVycnVwdAorCSAqLworYWNrX2ludHI6CisJaWYgKHByaXYwLT5wbHhyZWcpCisJCU9VVEwoZGV2MC0+YmFzZV9hZGRyICsgUExYX0xDTDJQQ0lfRE9PUkJFTEwsIDEpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICoJRG93bmxvYWQgdGhlIGJvYXJkIGZpcm13YXJlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IAorZGdyc19kb3dubG9hZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2MCkKK3sKKwlER1JTX1BSSVYJKnByaXYwID0gKERHUlNfUFJJViAqKSBkZXYwLT5wcml2OworCWludAkJaXM7CisJdW5zaWduZWQgbG9uZwlpOworCisJc3RhdGljIGludAlpdjJpc1sxNl0gPSB7CisJCQkJMCwgMCwgMCwgRVM0SF9JU19JTlQzLAorCQkJCTAsIEVTNEhfSVNfSU5UNSwgMCwgRVM0SF9JU19JTlQ3LAorCQkJCTAsIDAsIEVTNEhfSVNfSU5UMTAsIEVTNEhfSVNfSU5UMTEsCisJCQkJRVM0SF9JU19JTlQxMiwgMCwgMCwgRVM0SF9JU19JTlQxNSB9OworCisJLyoKKwkgKiBNYXAgaW4gdGhlIGR1YWwgcG9ydCBtZW1vcnkKKwkgKi8KKwlwcml2MC0+dm1lbSA9IGlvcmVtYXAoZGV2MC0+bWVtX3N0YXJ0LCAyMDQ4KjEwMjQpOworCWlmICghcHJpdjAtPnZtZW0pCisJeworCQlwcmludGsoIiVzOiBjYW5ub3QgbWFwIGluIGJvYXJkIG1lbW9yeVxuIiwgZGV2MC0+bmFtZSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJLyoKKwkgKglIb2xkIHRoZSBwcm9jZXNzb3IgYW5kIGNvbmZpZ3VyZSB0aGUgYm9hcmQgYWRkcmVzc2VzCisJICovCisJaWYgKHByaXYwLT5wbHhyZWcpCisJewkvKiBQQ0kgYnVzICovCisJCXByb2NfcmVzZXQoZGV2MCwgMSk7CisJfQorCWVsc2UKKwl7CS8qIEVJU0EgYnVzICovCisJCWlzID0gaXYyaXNbZGV2MC0+aXJxICYgMHgwZl07CisJCWlmICghaXMpCisJCXsKKwkJCXByaW50aygiJXM6IElsbGVnYWwgSVJRICVkXG4iLCBkZXYwLT5uYW1lLCBkZXYwLT5pcnEpOworCQkJaW91bm1hcChwcml2MC0+dm1lbSk7CisJCQlwcml2MC0+dm1lbSA9IE5VTEw7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCU9VVEIoZGV2MC0+YmFzZV9hZGRyICsgRVM0SF9BU18zMV8yNCwKKwkJCSh1Y2hhcikgKGRldjAtPm1lbV9zdGFydCA+PiAyNCkgKTsKKwkJT1VUQihkZXYwLT5iYXNlX2FkZHIgKyBFUzRIX0FTXzIzXzE2LAorCQkJKHVjaGFyKSAoZGV2MC0+bWVtX3N0YXJ0ID4+IDE2KSApOworCQlwcml2MC0+aXNfcmVnID0gRVM0SF9JU19MSU5FQVIgfCBpcyB8CisJCQkoKHVjaGFyKSAoZGV2MC0+bWVtX3N0YXJ0ID4+IDgpICYgRVM0SF9JU19BUzE1KTsKKwkJT1VUQihkZXYwLT5iYXNlX2FkZHIgKyBFUzRIX0lTLCBwcml2MC0+aXNfcmVnKTsKKwkJT1VUQihkZXYwLT5iYXNlX2FkZHIgKyBFUzRIX0VDLCBFUzRIX0VDX0VOQUJMRSk7CisJCU9VVEIoZGV2MC0+YmFzZV9hZGRyICsgRVM0SF9QQywgRVM0SF9QQ19SRVNFVCk7CisJCU9VVEIoZGV2MC0+YmFzZV9hZGRyICsgRVM0SF9NVywgRVM0SF9NV19FTkFCTEUgfCAweDAwKTsKKwl9CisKKwkvKgorCSAqCVNlZSBpZiB3ZSBjYW4gZG8gRE1BIG9uIHRoZSBTRS02CisJICovCisJcHJpdjAtPnVzZV9kbWEgPSBjaGVja19ib2FyZF9kbWEoZGV2MCk7CisJaWYgKHByaXYwLT51c2VfZG1hKQorCQlwcmludGsoIiVzOiBCdXMgTWFzdGVyIERNQSBpcyBlbmFibGVkLlxuIiwgZGV2MC0+bmFtZSk7CisKKwkvKgorCSAqIExvYWQgYW5kIHZlcmlmeSB0aGUgY29kZSBhdCB0aGUgZGVzaXJlZCBhZGRyZXNzCisJICovCisJbWVtY3B5KHByaXYwLT52bWVtLCBkZ3JzX2NvZGUsIGRncnNfbmNvZGUpOwkvKiBMb2FkIGNvZGUgKi8KKwlpZiAobWVtY21wKHByaXYwLT52bWVtLCBkZ3JzX2NvZGUsIGRncnNfbmNvZGUpKQorCXsKKwkJaW91bm1hcChwcml2MC0+dm1lbSk7CisJCXByaXYwLT52bWVtID0gTlVMTDsKKwkJcHJpbnRrKCIlczogZG93bmxvYWQgY29tcGFyZSBmYWlsZWRcbiIsIGRldjAtPm5hbWUpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qCisJICogQ29uZmlndXJhYmxlcworCSAqLworCXByaXYwLT5iY29tbSA9IChzdHJ1Y3QgYmlvc19jb21tICopIChwcml2MC0+dm1lbSArIDB4MDEwMCk7CisJcHJpdjAtPmJjb21tLT5iY19ub3dhaXQgPSAxOwkvKiBUZWxsIGJvYXJkIHRvIG1ha2UgcHJpbnRmIG5vdCB3YWl0ICovCisJcHJpdjAtPmJjb21tLT5iY19zcXVlbGNoID0gMDsJLyogRmxhZyBmcm9tIFNwYWNlLmMgKi8KKwlwcml2MC0+YmNvbW0tPmJjXzE1MG9obSA9IDA7CS8qIEZsYWcgZnJvbSBTcGFjZS5jICovCisKKwlwcml2MC0+YmNvbW0tPmJjX3NwZXcgPSAwOwkvKiBEZWJ1ZyBmbGFnIGZyb20gU3BhY2UuYyAqLworCXByaXYwLT5iY29tbS0+YmNfbWF4cmZkID0gMDsJLyogRGVidWcgZmxhZyBmcm9tIFNwYWNlLmMgKi8KKwlwcml2MC0+YmNvbW0tPmJjX21heHJiZCA9IDA7CS8qIERlYnVnIGZsYWcgZnJvbSBTcGFjZS5jICovCisKKwkvKgorCSAqIFRlbGwgYm9hcmQgd2UgYXJlIG9wZXJhdGluZyBpbiBzd2l0Y2ggbW9kZSAoMSkgb3IgaW4KKwkgKiBtdWx0aS1OSUMgbW9kZSAoMikuCisJICovCisJcHJpdjAtPmJjb21tLT5iY19ob3N0ID0gZGdyc19uaWNtb2RlID8gQkNfTVVMVElOSUMgOiBCQ19TV0lUQ0g7CisKKwkvKgorCSAqIFJlcXVlc3QgbWVtb3J5IHNwYWNlIG9uIGJvYXJkIGZvciBETUEgY2hhaW5zCisJICovCisJaWYgKHByaXYwLT51c2VfZG1hKQorCQlwcml2MC0+YmNvbW0tPmJjX2hvc3RhcmVhX2xlbiA9ICgyMDQ4LzY0KSAqIDE2OworCisJLyoKKwkgKiBOVlJBTSBjb25maWd1cmFibGVzIGZyb20gU3BhY2UuYworCSAqLworCXByaXYwLT5iY29tbS0+YmNfc3BhbnRyZWUgPSBkZ3JzX3NwYW50cmVlOworCXByaXYwLT5iY29tbS0+YmNfaGFzaGV4cGlyZSA9IGRncnNfaGFzaGV4cGlyZTsKKwltZW1jcHkocHJpdjAtPmJjb21tLT5iY19pcGFkZHIsIGRncnNfaXBhZGRyLCA0KTsKKwltZW1jcHkocHJpdjAtPmJjb21tLT5iY19pcHRyYXAsIGRncnNfaXB0cmFwLCA0KTsKKwltZW1jcHkocHJpdjAtPmJjb21tLT5iY19pcHhuZXQsICZkZ3JzX2lweG5ldCwgNCk7CisKKwkvKgorCSAqIFJlbGVhc2UgcHJvY2Vzc29yLCB3YWl0IDggc2Vjb25kcyBmb3IgYm9hcmQgdG8gaW5pdGlhbGl6ZQorCSAqLworCXByb2NfcmVzZXQoZGV2MCwgMCk7CisKKwlmb3IgKGkgPSBqaWZmaWVzICsgOCAqIEhaOyB0aW1lX2FmdGVyKGksIGppZmZpZXMpOyApCisJeworCQliYXJyaWVyKCk7CQkvKiBHY2MgMi45NSBuZWVkcyB0aGlzICovCisJCWlmIChwcml2MC0+YmNvbW0tPmJjX3N0YXR1cyA+PSBCQ19SVU4pCisJCQlicmVhazsKKwl9CisKKwlpZiAocHJpdjAtPmJjb21tLT5iY19zdGF0dXMgPCBCQ19SVU4pCisJeworCQlwcmludGsoIiVzOiBib2FyZCBub3Qgb3BlcmF0aW5nXG4iLCBkZXYwLT5uYW1lKTsKKwkJaW91bm1hcChwcml2MC0+dm1lbSk7CisJCXByaXYwLT52bWVtID0gTlVMTDsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlwcml2MC0+cG9ydCA9IChQT1JUICopIFMySChwcml2MC0+YmNvbW0tPmJjX3BvcnQpOworCXByaXYwLT5zY2JwID0gKEk1OTZfU0NCICopIFMySChwcml2MC0+cG9ydC0+c2NicCk7CisJcHJpdjAtPnJmZHAgPSAoSTU5Nl9SRkQgKikgUzJIKHByaXYwLT5zY2JwLT5yZmRwKTsKKwlwcml2MC0+cmJkcCA9IChJNTk2X1JCRCAqKSBTMkgocHJpdjAtPnJmZHAtPnJiZHApOworCisJcHJpdjAtPnNjYnAtPnN0YXR1cyA9IEk1OTZfU0NCX0NOQTsJLyogQ1UgaXMgaWRsZSAqLworCisJLyoKKwkgKglHZXQgc3dpdGNoIHBoeXNpY2FsIGFuZCBob3N0IHZpcnR1YWwgcG9pbnRlcnMgdG8gRE1BCisJICoJY2hhaW5pbmcgYXJlYS4gIE5PVEU6IHRoZSBNU0Igb2YgdGhlIHN3aXRjaCBwaHlzaWNhbAorCSAqCWFkZHJlc3MgKm11c3QqIGJlIHR1cm5lZCBvZmYuICBPdGhlcndpc2UsIHRoZSBIVyBrbHVkZ2UKKwkgKgl0aGF0IGFsbG93cyBob3N0IGFjY2VzcyBvZiB0aGUgUExYIERNQSByZWdpc3RlcnMgd2lsbAorCSAqCWVycm9uZW91c2x5IHNlbGVjdCB0aGUgUExYIHJlZ2lzdGVycy4KKwkgKi8KKwlwcml2MC0+ZG1hZGVzY19zID0gKERNQUNIQUlOICopIFMyRE1BKHByaXYwLT5iY29tbS0+YmNfaG9zdGFyZWEpOworCWlmIChwcml2MC0+ZG1hZGVzY19zKQorCQlwcml2MC0+ZG1hZGVzY19oID0gKERNQUNIQUlOICopIFMySChwcml2MC0+ZG1hZGVzY19zKTsKKwllbHNlCisJCXByaXYwLT5kbWFkZXNjX2ggPSBOVUxMOworCisJLyoKKwkgKglFbmFibGUgYm9hcmQgaW50ZXJydXB0cworCSAqLworCWlmIChwcml2MC0+cGx4cmVnKQorCXsJLyogUENJIGJ1cyAqLworCQlPVVRMKGRldjAtPmJhc2VfYWRkciArIFBMWF9JTlRfQ1NSLAorCQkJaW5sKGRldjAtPmJhc2VfYWRkciArIFBMWF9JTlRfQ1NSKQorCQkJfCBQTFhfUENJX0RPT1JCRUxMX0lFKTsJLyogRW5hYmxlIGludHIgdG8gaG9zdCAqLworCQlPVVRMKGRldjAtPmJhc2VfYWRkciArIFBMWF9MQ0wyUENJX0RPT1JCRUxMLCAxKTsKKwl9CisJZWxzZQorCXsJLyogRUlTQSBidXMgKi8KKwl9CisKKwlyZXR1cm4gKDApOworfQorCisvKgorICoJUHJvYmUgKGluaXQpIGEgYm9hcmQKKyAqLworc3RhdGljIGludCBfX2luaXQgCitkZ3JzX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCURHUlNfUFJJVgkqcHJpdiA9IChER1JTX1BSSVYgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcJaTsKKwlpbnQJCXJjOworCisJcHJpbnRrKCIlczogRGlnaSBSaWdodFN3aXRjaCBpbz0lbHggbWVtPSVseCBpcnE9JWQgcGx4PSVseCBkbWE9JWx4XG4iLAorCQlkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPm1lbV9zdGFydCwgZGV2LT5pcnEsCisJCXByaXYtPnBseHJlZywgcHJpdi0+cGx4ZG1hKTsKKworCS8qCisJICoJRG93bmxvYWQgdGhlIGZpcm13YXJlIGFuZCBsaWdodCB0aGUgcHJvY2Vzc29yCisJICovCisJcmMgPSBkZ3JzX2Rvd25sb2FkKGRldik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXQ7CisKKwkvKgorCSAqIEdldCBldGhlciBhZGRyZXNzIG9mIGJvYXJkCisJICovCisJcHJpbnRrKCIlczogRXRoZXJuZXQgYWRkcmVzcyIsIGRldi0+bmFtZSk7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHByaXYtPnBvcnQtPmV0aGFkZHIsIDYpOworCWZvciAoaSA9IDA7IGkgPCA2OyArK2kpCisJCXByaW50aygiJWMlMi4yeCIsIGkgPyAnOicgOiAnICcsIGRldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiXG4iKTsKKworCWlmIChkZXYtPmRldl9hZGRyWzBdICYgMSkKKwl7CisJCXByaW50aygiJXM6IElsbGVnYWwgRXRoZXJuZXQgQWRkcmVzc1xuIiwgZGV2LT5uYW1lKTsKKwkJcmMgPSAtRU5YSU87CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKgorCSAqCUFDSyBvdXRzdGFuZGluZyBpbnRlcnJ1cHRzLCBob29rIHRoZSBpbnRlcnJ1cHQsCisJICoJYW5kIHZlcmlmeSB0aGF0IHdlIGFyZSBnZXR0aW5nIGludGVycnVwdHMgZnJvbSB0aGUgYm9hcmQuCisJICovCisJaWYgKHByaXYtPnBseHJlZykKKwkJT1VUTChkZXYtPmJhc2VfYWRkciArIFBMWF9MQ0wyUENJX0RPT1JCRUxMLCAxKTsKKwkKKwlyYyA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmZGdyc19pbnRyLCBTQV9TSElSUSwgIlJpZ2h0U3dpdGNoIiwgZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dDsKKworCXByaXYtPmludHJjbnQgPSAwOworCWZvciAoaSA9IGppZmZpZXMgKyAyKkhaICsgSFovMjsgdGltZV9hZnRlcihpLCBqaWZmaWVzKTsgKQorCXsKKwkJY3B1X3JlbGF4KCk7CisJCWlmIChwcml2LT5pbnRyY250ID49IDIpCisJCQlicmVhazsKKwl9CisJaWYgKHByaXYtPmludHJjbnQgPCAyKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogTm90IGludGVycnVwdGluZyBvbiBJUlEgJWQgKCVkKVxuIiwKKwkJCQlkZXYtPm5hbWUsIGRldi0+aXJxLCBwcml2LT5pbnRyY250KTsKKwkJcmMgPSAtRU5YSU87CisJCWdvdG8gZXJyX2ZyZWVfaXJxOworCX0KKworCS8qCisJICoJRW50cnkgcG9pbnRzLi4uCisJICovCisJZGV2LT5vcGVuID0gJmRncnNfb3BlbjsKKwlkZXYtPnN0b3AgPSAmZGdyc19jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9ICZkZ3JzX2dldF9zdGF0czsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZkZ3JzX3N0YXJ0X3htaXQ7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmZGdyc19zZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT5kb19pb2N0bCA9ICZkZ3JzX2lvY3RsOworCisJcmV0dXJuIHJjOworCitlcnJfZnJlZV9pcnE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CitlcnJfb3V0OgorICAgICAgIAlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IAorZGdyc19pbml0Y2xvbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlER1JTX1BSSVYJKnByaXYgPSAoREdSU19QUklWICopIGRldi0+cHJpdjsKKwlpbnQJCWk7CisKKwlwcmludGsoIiVzOiBEaWdpIFJpZ2h0U3dpdGNoIHBvcnQgJWQgIiwKKwkJZGV2LT5uYW1lLCBwcml2LT5jaGFuKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgKytpKQorCQlwcmludGsoIiVjJTIuMngiLCBpID8gJzonIDogJyAnLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIlxuIik7CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgCitkZ3JzX2ZvdW5kX2RldmljZSgKKwlpbnQJCWlvLAorCXVsb25nCQltZW0sCisJaW50CQlpcnEsCisJdWxvbmcJCXBseHJlZywKKwl1bG9uZwkJcGx4ZG1hLAorCXN0cnVjdCBkZXZpY2UgICAqcGRldgorKQoreworCURHUlNfUFJJViAqcHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpLCByZXQgPSAtRU5PTUVNOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKERHUlNfUFJJVikpOworCWlmICghZGV2KQorCQlnb3RvIGVycjA7CisKKwlwcml2ID0gKERHUlNfUFJJViAqKWRldi0+cHJpdjsKKworCWRldi0+YmFzZV9hZGRyID0gaW87CisJZGV2LT5tZW1fc3RhcnQgPSBtZW07CisJZGV2LT5tZW1fZW5kID0gbWVtICsgMjA0OCAqIDEwMjQgLSAxOworCWRldi0+aXJxID0gaXJxOworCXByaXYtPnBseHJlZyA9IHBseHJlZzsKKwlwcml2LT5wbHhkbWEgPSBwbHhkbWE7CisJcHJpdi0+dnBseGRtYSA9IE5VTEw7CisKKwlwcml2LT5jaGFuID0gMTsKKwlwcml2LT5kZXZ0YmxbMF0gPSBkZXY7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCBwZGV2KTsKKwkKKwlyZXQgPSBkZ3JzX3Byb2JlMShkZXYpOworCWlmIChyZXQpIAorCQlnb3RvIGVycjE7CisKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjI7CisKKwlpZiAoICFkZ3JzX25pY21vZGUgKQorCQlyZXR1cm4gZGV2OwkvKiBTd2l0Y2ggbW9kZSwgd2UgYXJlIGRvbmUgKi8KKworCS8qCisJICogT3BlcmF0aW5nIGNhcmQgYXMgTiBzZXBhcmF0ZSBOSUNzCisJICovCisKKwlwcml2LT5ucG9ydHMgPSBwcml2LT5iY29tbS0+YmNfbnBvcnRzOworCisJZm9yIChpID0gMTsgaSA8IHByaXYtPm5wb3J0czsgKytpKQorCXsKKwkJc3RydWN0IG5ldF9kZXZpY2UJKmRldk47CisJCURHUlNfUFJJVgkqcHJpdk47CisJCQkvKiBBbGxvY2F0ZSBuZXcgZGV2IGFuZCBwcml2IHN0cnVjdHVyZXMgKi8KKwkJZGV2TiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihER1JTX1BSSVYpKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJaWYgKCFkZXZOKSAKKwkJCWdvdG8gZmFpbDsKKworCQkvKiBEb24ndCBjb3B5IHRoZSBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUhICovCisKKwkJLyogY29weSB0aGUgcHJpdiBzdHJ1Y3R1cmUgb2YgZGV2WzBdICovCisJCXByaXZOID0gKERHUlNfUFJJViAqKWRldk4tPnByaXY7CisJCSpwcml2TiA9ICpwcml2OworCisJCQkvKiAuLi4gYW5kIHplcm8gb3V0IFZNIGFyZWFzICovCisJCXByaXZOLT52bWVtID0gTlVMTDsKKwkJcHJpdk4tPnZwbHhkbWEgPSBOVUxMOworCQkJLyogLi4uIGFuZCB6ZXJvIG91dCBJUlEgKi8KKwkJZGV2Ti0+aXJxID0gMDsKKwkJCS8qIC4uLiBhbmQgYmFzZSBNQUMgYWRkcmVzcyBvZmYgYWRkcmVzcyBvZiAxc3QgcG9ydCAqLworCQlkZXZOLT5kZXZfYWRkcls1XSArPSBpOworCisJCXJldCA9IGRncnNfaW5pdGNsb25lKGRldk4pOworCQlpZiAocmV0KQorCQkJZ290byBmYWlsOworCisJCVNFVF9NT0RVTEVfT1dORVIoZGV2Tik7CisJCVNFVF9ORVRERVZfREVWKGRldiwgcGRldik7CisKKwkJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldk4pOworCQlpZiAocmV0KSB7CisJCQlmcmVlX25ldGRldihkZXZOKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlwcml2Ti0+Y2hhbiA9IGkrMTsKKwkJcHJpdi0+ZGV2dGJsW2ldID0gZGV2TjsKKwl9CisJcmV0dXJuIGRldjsKKworIGZhaWw6CQorCXdoaWxlIChpID49IDApIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmQgPSBwcml2LT5kZXZ0YmxbaS0tXTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZCk7CisJCWZyZWVfbmV0ZGV2KGQpOworCX0KKworIGVycjI6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisgZXJyMToKKwlmcmVlX25ldGRldihkZXYpOworIGVycjA6CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGRncnNfcmVtb3ZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJREdSU19QUklWICpwcml2ID0gZGV2LT5wcml2OworCWludCBpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworCWZvciAoaSA9IDE7IGkgPCBwcml2LT5ucG9ydHM7ICsraSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZCA9IHByaXYtPmRldnRibFtpXTsKKwkJaWYgKGQpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGQpOworCQkJZnJlZV9uZXRkZXYoZCk7CisJCX0KKwl9CisKKwlwcm9jX3Jlc2V0KHByaXYtPmRldnRibFswXSwgMSk7CisKKwlpZiAocHJpdi0+dm1lbSkKKwkJaW91bm1hcChwcml2LT52bWVtKTsKKwlpZiAocHJpdi0+dnBseGRtYSkKKwkJaW91bm1hcCgodWNoYXIgKikgcHJpdi0+dnBseGRtYSk7CisKKwlpZiAoZGV2LT5pcnEpCisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJZm9yIChpID0gMTsgaSA8IHByaXYtPm5wb3J0czsgKytpKSB7CisJCWlmIChwcml2LT5kZXZ0YmxbaV0pCisJCQl1bnJlZ2lzdGVyX25ldGRldihwcml2LT5kZXZ0YmxbaV0pOworCX0KK30KKworI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBpbnQgX19pbml0IGRncnNfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGVycjsKKwl1aW50CWlvOworCXVpbnQJbWVtOworCXVpbnQJaXJxOworCXVpbnQJcGx4cmVnOworCXVpbnQJcGx4ZG1hOworCisJLyoKKwkgKiBHZXQgYW5kIGNoZWNrIHRoZSBidXMtbWFzdGVyIGFuZCBsYXRlbmN5IHZhbHVlcy4KKwkgKiBTb21lIFBDSSBCSU9TZXMgZmFpbCB0byBzZXQgdGhlIG1hc3Rlci1lbmFibGUgYml0LAorCSAqIGFuZCB0aGUgbGF0ZW5jeSB0aW1lciBtdXN0IGJlIHNldCB0byB0aGUgbWF4aW11bQorCSAqIHZhbHVlIHRvIGF2b2lkIGRhdGEgY29ycnVwdGlvbiB0aGF0IG9jY3VycyB3aGVuIHRoZQorCSAqIHRpbWVyIGV4cGlyZXMgZHVyaW5nIGEgdHJhbnNmZXIuICBZZXMsIGl0J3MgYSBidWcuCisJICovCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsICJSaWdodFN3aXRjaCIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCXBseHJlZyA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMCk7CisJaW8gPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDEpOworCW1lbSA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMik7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4MzAsICZwbHhkbWEpOworCWlycSA9IHBkZXYtPmlycTsKKwlwbHhkbWEgJj0gfjE1OworCisJLyoKKwkgKiBPbiBzb21lIEJJT1NFUywgdGhlIFBMWCAiZXhwYW5zaW9uIHJvbSIgKHVzZWQgZm9yIERNQSkKKwkgKiBhZGRyZXNzIGNvbWVzIHVwIGFzICIwIi4gIFRoaXMgaXMgcHJvYmFibHkgYmVjYXVzZQorCSAqIHRoZSBCSU9TIGRvZXNuJ3Qgc2VlIGEgdmFsaWQgNTUgQUEgUk9NIHNpZ25hdHVyZSBhdAorCSAqIHRoZSAiUk9NIiBzdGFydCBhbmQgemVyb2VzIHRoZSBhZGRyZXNzLiAgVG8gZ2V0CisJICogYXJvdW5kIHRoaXMgcHJvYmxlbSB0aGUgU0UtNiBpcyBjb25maWd1cmVkIHRvIGFzaworCSAqIGZvciA0IE1CIG9mIHNwYWNlIGZvciB0aGUgZHVhbCBwb3J0IG1lbW9yeS4gIFdlIHRoZW4KKwkgKiBtdXN0IHNldCBpdHMgcmFuZ2UgYmFjayB0byAyIE1CLCBhbmQgdXNlIHRoZSB1cHBlcgorCSAqIGhhbGYgZm9yIERNQSByZWdpc3RlciBhY2Nlc3MKKwkgKi8KKwlPVVRMKGlvICsgUExYX1NQQUNFMF9SQU5HRSwgMHhGRkUwMDAwMEwpOworCWlmIChwbHhkbWEgPT0gMCkKKwkJcGx4ZG1hID0gbWVtICsgKDIwNDhMICogMTAyNEwpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgMHgzMCwgcGx4ZG1hICsgMSk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4MzAsICZwbHhkbWEpOworCXBseGRtYSAmPSB+MTU7CisKKwlkZXYgPSBkZ3JzX2ZvdW5kX2RldmljZShpbywgbWVtLCBpcnEsIHBseHJlZywgcGx4ZG1hLCAmcGRldi0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRldikpIHsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJcmV0dXJuIFBUUl9FUlIoZGV2KTsKKwl9CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGRncnNfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJZGdyc19yZW1vdmUoZGV2KTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkZ3JzX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgPSAiZGdycyIsCisJLmlkX3RhYmxlID0gZGdyc19wY2lfdGJsLAorCS5wcm9iZSA9IGRncnNfcGNpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChkZ3JzX3BjaV9yZW1vdmUpLAorfTsKKyNlbmRpZgorCisKKyNpZmRlZiBDT05GSUdfRUlTQQorc3RhdGljIGludCBpczJpdls4XSBfX2luaXRkYXRhID0geyAwLCAzLCA1LCA3LCAxMCwgMTEsIDEyLCAxNSB9OworCitzdGF0aWMgaW50IF9faW5pdCBkZ3JzX2Vpc2FfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKmdlbmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBlaXNhX2RldmljZSAqZWRldiA9IHRvX2Vpc2FfZGV2aWNlKGdlbmRldik7CisJdWludAlpbyA9IGVkZXYtPmJhc2VfYWRkcjsKKwl1aW50CW1lbTsKKwl1aW50CWlycTsKKwlpbnQgCXJjID0gLUVOT0RFVjsgLyogTm90IEVJU0EgY29uZmlndXJlZCAqLworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpbywgMjU2LCAiUmlnaHRTd2l0Y2giKSkgeworCQlwcmludGsoS0VSTl9FUlIgImRncnM6IGVpc2EgaW8gMHgleCwgd2hpY2ggaXMgYnVzeS5cbiIsIGlvKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoICEgKGluYihpbytFUzRIX0VDKSAmIEVTNEhfRUNfRU5BQkxFKSApIAorCQlnb3RvIGVycl9vdXQ7CisKKwltZW0gPSAoaW5iKGlvK0VTNEhfQVNfMzFfMjQpIDw8IDI0KQorCQkrIChpbmIoaW8rRVM0SF9BU18yM18xNikgPDwgMTYpOworCisJaXJxID0gaXMyaXZbIGluYihpbytFUzRIX0lTKSAmIEVTNEhfSVNfSU5UTUFTSyBdOworCisJZGV2ID0gZGdyc19mb3VuZF9kZXZpY2UoaW8sIG1lbSwgaXJxLCAwTCwgMEwsIGdlbmRldik7CisJaWYgKElTX0VSUihkZXYpKSB7CisJCXJjID0gUFRSX0VSUihkZXYpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJZ2VuZGV2LT5kcml2ZXJfZGF0YSA9IGRldjsKKwlyZXR1cm4gMDsKKyBlcnJfb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvLCAyNTYpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZGdyc19laXNhX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpnZW5kZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGdlbmRldi0+ZHJpdmVyX2RhdGE7CisJCisJZGdyc19yZW1vdmUoZGV2KTsKKworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCAyNTYpOworCQkKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZWlzYV9kcml2ZXIgZGdyc19laXNhX2RyaXZlciA9IHsKKwkuaWRfdGFibGUgPSBkZ3JzX2Vpc2FfdGJsLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImRncnMiLAorCQkucHJvYmUgPSBkZ3JzX2Vpc2FfcHJvYmUsCisJCS5yZW1vdmUgPSBfX2RldmV4aXRfcChkZ3JzX2Vpc2FfcmVtb3ZlKSwKKwl9Cit9OworI2VuZGlmCisKKy8qCisgKglWYXJpYWJsZXMgdGhhdCBjYW4gYmUgb3ZlcnJpZGVuIGZyb20gbW9kdWxlIGNvbW1hbmQgbGluZQorICovCitzdGF0aWMgaW50CWRlYnVnID0gLTE7CitzdGF0aWMgaW50CWRtYSA9IC0xOworc3RhdGljIGludAloYXNoZXhwaXJlID0gLTE7CitzdGF0aWMgaW50CXNwYW50cmVlID0gLTE7CitzdGF0aWMgaW50CWlwYWRkcls0XSA9IHsgLTEgfTsKK3N0YXRpYyBpbnQJaXB0cmFwWzRdID0geyAtMSB9Oworc3RhdGljIF9fdTMyCWlweG5ldCA9IC0xOworc3RhdGljIGludAluaWNtb2RlID0gLTE7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkbWEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaGFzaGV4cGlyZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShzcGFudHJlZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcGFkZHIsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXB0cmFwLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKGlweG5ldCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShuaWNtb2RlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRpZ2kgUmlnaHRTd2l0Y2ggZW5hYmxlIGRlYnVnZ2luZyAoMC0xKSIpOworTU9EVUxFX1BBUk1fREVTQyhkbWEsICJEaWdpIFJpZ2h0U3dpdGNoIGVuYWJsZSBCTSBETUEgKDAtMSkiKTsKK01PRFVMRV9QQVJNX0RFU0MobmljbW9kZSwgIkRpZ2kgUmlnaHRTd2l0Y2ggb3BlcmF0aW5nIG1vZGUgKDE6IHN3aXRjaCwgMjogbXVsdGktTklDKSIpOworCitzdGF0aWMgaW50IF9faW5pdCBkZ3JzX2luaXRfbW9kdWxlICh2b2lkKQoreworCWludAlpOworCWludCBlaXNhY291bnQgPSAwLCBwY2ljb3VudCA9IDA7CisKKwkvKgorCSAqCUNvbW1hbmQgbGluZSB2YXJpYWJsZSBvdmVycmlkZXMKKwkgKgkJZGVidWc9Tk5OCisJICoJCWRtYT0wLzEKKwkgKgkJc3BhbnRyZWU9MC8xCisJICoJCWhhc2hleHBpcmU9Tk5OCisJICoJCWlwYWRkcj1BLEIsQyxECisJICoJCWlwdHJhcD1BLEIsQyxECisJICoJCWlweG5ldD1OTk4KKwkgKgkJbmljbW9kZT1OTk4KKwkgKi8KKwlpZiAoZGVidWcgPj0gMCkKKwkJZGdyc19kZWJ1ZyA9IGRlYnVnOworCWlmIChkbWEgPj0gMCkKKwkJZGdyc19kbWEgPSBkbWE7CisJaWYgKG5pY21vZGUgPj0gMCkKKwkJZGdyc19uaWNtb2RlID0gbmljbW9kZTsKKwlpZiAoaGFzaGV4cGlyZSA+PSAwKQorCQlkZ3JzX2hhc2hleHBpcmUgPSBoYXNoZXhwaXJlOworCWlmIChzcGFudHJlZSA+PSAwKQorCQlkZ3JzX3NwYW50cmVlID0gc3BhbnRyZWU7CisJaWYgKGlwYWRkclswXSAhPSAtMSkKKwkJZm9yIChpID0gMDsgaSA8IDQ7ICsraSkKKwkJCWRncnNfaXBhZGRyW2ldID0gaXBhZGRyW2ldOworCWlmIChpcHRyYXBbMF0gIT0gLTEpCisJCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpCisJCQlkZ3JzX2lwdHJhcFtpXSA9IGlwdHJhcFtpXTsKKwlpZiAoaXB4bmV0ICE9IC0xKQorCQlkZ3JzX2lweG5ldCA9IGh0b25sKCBpcHhuZXQgKTsKKworCWlmIChkZ3JzX2RlYnVnKQorCXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZGdyczogU1c9JXMgRlc9QnVpbGQgJWQgJXNcbkZXIFZlcnNpb249JXNcbiIsCisJCSAgICAgICB2ZXJzaW9uLCBkZ3JzX2Zpcm1udW0sIGRncnNfZmlybWRhdGUsIGRncnNfZmlybXZlcik7CisJfQorCisJLyoKKwkgKglGaW5kIGFuZCBjb25maWd1cmUgYWxsIHRoZSBjYXJkcworCSAqLworI2lmZGVmIENPTkZJR19FSVNBCisJZWlzYWNvdW50ID0gZWlzYV9kcml2ZXJfcmVnaXN0ZXIoJmRncnNfZWlzYV9kcml2ZXIpOworCWlmIChlaXNhY291bnQgPCAwKQorCQlyZXR1cm4gZWlzYWNvdW50OworI2VuZGlmCisjaWZkZWYgQ09ORklHX1BDSQorCXBjaWNvdW50ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZGdyc19wY2lfZHJpdmVyKTsKKwlpZiAocGNpY291bnQpCisJCXJldHVybiBwY2ljb3VudDsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZGdyc19jbGVhbnVwX21vZHVsZSAodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfRUlTQQorCWVpc2FfZHJpdmVyX3VucmVnaXN0ZXIgKCZkZ3JzX2Vpc2FfZHJpdmVyKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QQ0kKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZkZ3JzX3BjaV9kcml2ZXIpOworI2VuZGlmCit9CisKK21vZHVsZV9pbml0KGRncnNfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZGdyc19jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZ3JzLmggYi9kcml2ZXJzL25ldC9kZ3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM0N2NkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2RncnMuaApAQCAtMCwwICsxLDM4IEBACisvKgorICoJaW9jdGwncyBmb3IgdGhlIERpZ2kgSW50bC4gUmlnaHRTd2l0Y2gKKyAqCisgKglUaGVzZSBuZXR3b3JrIGRyaXZlciBpb2N0bCdzIGFyZSBhIGJpdCBvYnR1c2UgY29tcGFyZWQgdG8gdGhlIHVzdWFsCisgKglpb2N0bCdzIGZvciBhICJub3JtYWwiIGRldmljZSBkcml2ZXIuICBIZXksIEkgZGlkbid0IGludmVudCBpdC4KKyAqCisgKglUeXBpY2FsIHVzZToKKyAqCisgKglzdHJ1Y3QgaWZyZXEJaWZyOworICoJREdSU19JT0NUTAlpb2M7CisgKglpbnQJCXg7CisgKgorICoJc3RyY3B5KGlmci5pZnJfbmFtZSwgImV0aDEiKTsKKyAqCWlmci5pZnJfZGF0YSA9IChjYWRkcl90KSAmaW9jOworICoJaW9jLmNtZCA9IERHUlNfR0VUTUVNOworICoJaW9jLmxlbiA9IHNpemVvZih4KTsKKyAqCWlvYy5kYXRhID0gKGNhZGRyX3QpICZ4OworICoJcmMgPSBpb2N0bChmZCwgREdSU0lPQ1RMLCAmaWZyKTsKKyAqCXByaW50ZigicmM9JWQgbWVtPSV4XG4iLCByYywgeCk7CisgKgorICovCisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorCisjZGVmaW5lIERHUlNJT0NUTCAgICAgIFNJT0NERVZQUklWQVRFCisKK3R5cGVkZWYgc3RydWN0IGRncnNfaW9jdGwgeworCXVuc2lnbmVkIHNob3J0IGNtZDsJLyogQ29tbWFuZCB0byBydW4gKi8KKwl1bnNpZ25lZCBzaG9ydCBsZW47CS8qIExlbmd0aCBvZiB0aGUgZGF0YSBidWZmZXIgKi8KKwl1bnNpZ25lZCBjaGFyICBfX3VzZXIgKmRhdGE7CS8qIFBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyICovCisJdW5zaWduZWQgc2hvcnQJcG9ydDsJLyogcG9ydCBudW1iZXIgZm9yIGNvbW1hbmQsIGlmIG5lZWRlZCAqLworCXVuc2lnbmVkIHNob3J0CWZpbHRlcjsJLyogZmlsdGVyIG51bWJlciBmb3IgY29tbWFuZCwgaWYgbmVlZGVkICovCit9IERHUlNfSU9DVEw7CisKKy8qIAorICoJQ29tbWFuZHMgZm9yIHRoZSBkcml2ZXIgCisgKi8KKyNkZWZpbmUJREdSU19HRVRNRU0JCTB4MDEJLyogR2V0IHRoZSBkdWFsIHBvcnQgbWVtb3J5IGFkZHJlc3MgKi8KKyNkZWZpbmUJREdSU19TRVRGSUxURVIJCTB4MDIJLyogU2V0IGEgZmlsdGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZ3JzX2Fzc3RydWN0LmggYi9kcml2ZXJzL25ldC9kZ3JzX2Fzc3RydWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlNWJiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2RncnNfYXNzdHJ1Y3QuaApAQCAtMCwwICsxLDM3IEBACisvKgorICoJRm9yIGRlY2xhcmluZyBzdHJ1Y3R1cmVzIHNoYXJlZCB3aXRoIGFzc2VtYmx5IHJvdXRpbmVzCisgKgorICoJJElkOiBhc3N0cnVjdC5oLHYgMS4xLjEuMSAxOTk0LzEwLzIzIDA1OjA4OjMyIHJpY2sgRXhwICQKKyAqLworCisjaWZkZWYgQVNTRU1CTEVSCisKKyMJZGVmaW5lIE1PKHQsYSkJCShhKQorIwlkZWZpbmUgVk1PKHQsYSkJCShhKQorCisjCWRlZmluZQlCRUdJTl9TVFJVQ1QoeCkJX09mZj0wCisjCWRlZmluZQlTMUEodCx4LG4pCV9PZmY9KF9PZmYrMCkmfjA7IHg9X09mZjsgX09mZj1fT2ZmKygxKm4pCisjCWRlZmluZQlTMkEodCx4LG4pCV9PZmY9KF9PZmYrMSkmfjE7IHg9X09mZjsgX09mZj1fT2ZmKygyKm4pCisjCWRlZmluZQlTNEEodCx4LG4pCV9PZmY9KF9PZmYrMykmfjM7IHg9X09mZjsgX09mZj1fT2ZmKyg0Km4pCisjCWRlZmluZQlXT1JEKHgpCQlfT2ZmPShfT2ZmKzMpJn4zOyB4PV9PZmY7IF9PZmY9X09mZis0CisjCWRlZmluZQlXT1JEQSh4LG4pCV9PZmY9KF9PZmYrMykmfjM7IHg9X09mZjsgX09mZj1fT2ZmKyg0Km4pCisjCWRlZmluZQlWV09SRCh4KQlfT2ZmPShfT2ZmKzMpJn4zOyB4PV9PZmY7IF9PZmY9X09mZis0CisjCWRlZmluZQlTMSh0LHgpCQlfT2ZmPShfT2ZmKzApJn4wOyB4PV9PZmY7IF9PZmY9X09mZisxCisjCWRlZmluZQlTMih0LHgpCQlfT2ZmPShfT2ZmKzEpJn4xOyB4PV9PZmY7IF9PZmY9X09mZisyCisjCWRlZmluZQlTNCh0LHgpCQlfT2ZmPShfT2ZmKzMpJn4zOyB4PV9PZmY7IF9PZmY9X09mZis0CisjCWRlZmluZQlFTkRfU1RSVUNUKHgpCV9PZmY9KF9PZmYrMykmfjM7IHg9X09mZiAKKworI2Vsc2UJLyogQyAqLworCisjZGVmaW5lIFZNTyh0LGEpICAgICAgICAoKih2b2xhdGlsZSB0ICopKGEpKQorCisjCWRlZmluZSBCRUdJTl9TVFJVQ1QoeCkgc3RydWN0IHggeworIwlkZWZpbmUgUzEodCx4KSAgICAgICAgIHQgeCA7CisjCWRlZmluZSBTMUEodCx4LG4pICAgICAgdCB4W25dIDsKKyMJZGVmaW5lIFMyKHQseCkgICAgICAgICB0IHggOworIwlkZWZpbmUgUzJBKHQseCxuKSAgICAgIHQgeFtuXSA7CisjCWRlZmluZSBTNCh0LHgpICAgICAgICAgdCB4IDsKKyMJZGVmaW5lIFM0QSh0LHgsbikgICAgICB0IHhbbl0gOworIwlkZWZpbmUgRU5EX1NUUlVDVCh4KSAgIH0gOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RncnNfYmNvbW0uaCBiL2RyaXZlcnMvbmV0L2RncnNfYmNvbW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjQ2NjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZGdyc19iY29tbS5oCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogVGhlIGJpb3MgbG93LW1lbW9yeSBzdHJ1Y3R1cmUKKyAqCisgKiBTb21lIG9mIHRoZSB2YXJpYWJsZXMgaW4gaGVyZSBjYW4gYmUgdXNlZCB0byBzZXQgcGFyYW1ldGVycyB0aGF0CisgKiBhcmUgc3RvcmVkIGluIE5WUkFNIGFuZCB3aWxsIHJldGFpbiB0aGVpciBvbGQgdmFsdWVzIHRoZSBuZXh0IHRpbWUKKyAqIHRoZSBjYXJkIGlzIGJyb3VnaHQgdXAuICBUbyB1c2UgdGhlIHZhbHVlcyBzdG9yZWQgaW4gTlZSQU0sIHRoZQorICogcGFyYW1ldGVyIHNob3VsZCBiZSBzZXQgdG8gImFsbCBvbmVzIi4gIFRoaXMgdGVsbHMgdGhlIGZpcm13YXJlIHRvCisgKiB1c2UgdGhlIE5WUkFNIHZhbHVlIG9yIGEgc3VpdGFibGUgZGVmYXVsdC4gIFRoZSB2YWx1ZSB0aGF0IGlzIHVzZWQKKyAqIHdpbGwgYmUgc3RvcmVkIGJhY2sgaW50byB0aGlzIHN0cnVjdHVyZSBieSB0aGUgZmlybXdhcmUuICBJZiB0aGUKKyAqIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBpcyBub3QgImFsbCBvbmVzIiwgdGhlbiB0aGF0IHZhbHVlIHdpbGwgYmUKKyAqIHVzZWQgYW5kIHdpbGwgYmUgc3RvcmVkIGludG8gTlZSQU0gaWYgaXQgaXNuJ3QgYWxyZWFkeSB0aGVyZS4KKyAqIFRoZSB2YXJpYWJsZXMgdGhpcyBhcHBsaWVzIHRvIGFyZSB0aGUgZm9sbG93aW5nOgorICoJVmFyaWFibGUJU2V0IHRvOgkJR2V0cyBkZWZhdWx0IG9mOgorICoJYmNfaGFzaGV4cGlyZQktMQkJMzAwCSg1IG1pbnV0ZXMpCisgKgliY19zcGFudHJlZQktMQkJMQkoc3Bhbm5pbmcgdHJlZSBvbikKKyAqCWJjX2lwYWRkcglGRjpGRjpGRjpGRgkwCShubyBTTk1QIElQIGFkZHJlc3MpCisgKgliY19pcHhuZXQJRkY6RkY6RkY6RkYJMAkobm8gU05NUCBJUFggbmV0KQorICoJYmNfaXB0cmFwCUZGOkZGOkZGOkZGCTAJKG5vIFNOTVAgSVAgdHJhcCBhZGRyZXNzKQorICoKKyAqIFNvbWUgdmFyaWFibGVzIE1VU1QgaGF2ZSB0aGVpciB2YWx1ZSBzZXQgYWZ0ZXIgdGhlIGZpcm13YXJlCisgKiBpcyBsb2FkZWQgb250byB0aGUgYm9hcmQsIGJ1dCBiZWZvcmUgdGhlIHByb2Nlc3NvciBpcyByZWxlYXNlZC4KKyAqIFRoZXNlIGFyZToKKyAqCWJjX2hvc3QJCTAgbWVhbnMgbm8gaG9zdCAicG9ydCIsIHJ1biBhcyBzdGFuZGFsb25lIHN3aXRjaC4KKyAqCQkJMSBtZWFucyBydW4gYXMgYSBzd2l0Y2gsIHdpdGggYSBob3N0IHBvcnQuIChub3JtYWwpCisgKgkJCTIgbWVhbnMgcnVuIGFzIG11bHRpcGxlIE5JQ3MsIG5vdCBhcyBhIHN3aXRjaC4KKyAqCQkJLTEgbWVhbnMgcnVuIGluIGRpYWdub3N0aWNzIG1vZGUuCisgKgliY19ub3dhaXQKKyAqCWJjX2hvc3RhcmVhX2xlbgorICoJYmNfZmlsdGVyX2xlbgorICoJCQkKKyAqLworQkVHSU5fU1RSVUNUKGJpb3NfY29tbSkKKwlTNCh1bG9uZywgYmNfaW50ZmxhZykJLyogQ291bnQgb2YgYWxsIGludGVycnVwdHMgKi8KKwlTNCh1bG9uZywgYmNfbGJvbHQpCS8qIENvdW50IG9mIHRpbWVyIGludGVycnVwdHMgKi8KKwlTNCh1bG9uZywgYmNfbWFpbmNudCkJLyogQ291bnQgb2YgbWFpbiBsb29wcyAqLworCVM0KHVsb25nLCBiY19oYXNoY250KQkvKiBDb3VudCBvZiBlbnRyaWVzIGluIGhhc2ggdGFibGUgKi8KKwlTNEEodWxvbmcsIGJjX2NudCwgOCkJLyogTWlzYyBjb3VudGVycywgZm9yIGRlYnVnZ2luZyAqLworCVM0QSh1bG9uZywgYmNfZmxhZywgOCkJLyogTWlzYyBmbGFncywgZm9yIGRlYnVnZ2luZyAqLworCVM0KHVsb25nLCBiY19tZW1zaXplKQkvKiBTaXplIG9mIG1lbW9yeSAqLworCVM0KHVsb25nLCBiY19kY2FjaGUpCS8qIFNpemUgb2Ygd29ya2luZyBkY2FjaGUgKi8KKwlTNCh1bG9uZywgYmNfaWNhY2hlKQkvKiBTaXplIG9mIHdvcmtpbmcgaWNhY2hlICovCisJUzQobG9uZywgYmNfc3RhdHVzKQkvKiBGaXJtd2FyZSBzdGF0dXMgKi8KKwlTMUEoY2hhciwgYmNfZmlsZSwgOCkJLyogRmlsZSBuYW1lIG9mIGFzc2VydGlvbiBmYWlsdXJlICovCisJUzQodWxvbmcsIGJjX2xpbmUpCS8qIExpbmUgIyBvZiBhc3NlcnRpb24gZmFpbHVyZSAqLworCVM0KHVjaGFyICosIGJjX3JhbXN0YXJ0KQorCVM0KHVjaGFyICosIGJjX3JhbWVuZCkKKwlTNCh1Y2hhciAqLCBiY19oZWFwc3RhcnQpIC8qIFN0YXJ0IG9mIGhlYXAgKGVuZCBvZiBsb2FkZWQgbWVtb3J5KSAqLworCVM0KHVjaGFyICosIGJjX2hlYXBlbmQpCS8qIEVuZCBvZiBoZWFwICovCisKKwkvKiBDb25maWd1cmFibGUgUGFyYW1ldGVycyAqLworCVM0KGxvbmcsIGJjX2hvc3QpCS8qIDE9SG9zdCBQb3J0LCAwPU5vIEhvc3QgUG9ydCwgLTE9VGVzdCBNb2RlICovCisJUzQobG9uZywgYmNfbm93YWl0KQkvKiBEb24ndCB3YWl0IGZvciAyaG9zdCBjaXJjIGJ1ZmZlciB0byBlbXB0eSovCisJUzQobG9uZywgYmNfMTUwb2htKQkvKiAwID09IDEwMCBvaG0gVVRQLCAxID09IDE1MCBvaG0gU1RQICovCisJUzQobG9uZywgYmNfc3F1ZWxjaCkJLyogMCA9PSBub3JtYWwgc3F1ZWxjaCwgMSA9PSByZWR1Y2VkIHNxdWVsY2ggKi8KKwlTNCh1bG9uZywgYmNfaGFzaGV4cGlyZSkgLyogRXhwaXJ5IHRpbWUgaW4gc2Vjb25kcyBmb3IgaGFzaCB0YWJsZSAqLworCVM0KGxvbmcsIGJjX3NwYW50cmVlKQkvKiAxID09IGVuYWJsZSBJRUVFIHNwYW5uaW5nIHRyZWUgKi8KKworCVMyQSh1c2hvcnQsIGJjX2VhZGRyLCAzKSAvKiBOZXcgZXRoZXIgYWRkcmVzcyAqLworCVMyKHVzaG9ydCwgYmNfZHVtbXkxKQkvKiBwYWRkaW5nIGZvciBET1MgY29tcGlsZXJzICovCisKKwkvKiBWYXJpb3VzIGRlYnVnZ2luZyBhaWRzICovCisJUzQobG9uZywgYmNfZGVidWcpCS8qIERlYnVnZ2luZyBpcyB0dXJuZWQgb24gKi8KKwlTNChsb25nLCBiY19zcGV3KQkvKiBTcGV3IGRhdGEgb24gcG9ydCA0IGZvciBic19zcGV3IHNlY29uZHMgKi8KKwlTNChsb25nLCBiY19zcGV3bGVuKQkvKiBMZW5ndGggb2Ygc3Bld2VkIGRhdGEgcGFja2V0cyAqLworCVM0KGxvbmcsIGJjX21heHJmZCkJLyogSWYgIT0gMCwgbWF4IG51bWJlciBvZiBSRkQncyB0byBhbGxvY2F0ZSAqLworCVM0KGxvbmcsIGJjX21heHJiZCkJLyogSWYgIT0gMCwgbWF4IG51bWJlciBvZiBSQkQncyB0byBhbGxvY2F0ZSAqLworCisJLyogQ2lyY3VsYXIgYnVmZmVycyBmb3IgbWVzc2FnZXMgdG8vZnJvbSBob3N0ICovCisJUzQodWxvbmcsIGJjXzJob3N0X2hlYWQpCisJUzQodWxvbmcsIGJjXzJob3N0X3RhaWwpCisJUzQodWxvbmcsIGJjXzJob3N0X21hc2spCisJUzFBKGNoYXIsIGJjXzJob3N0LCAweDIwMCkJLyogQ2lyYyBidWZmIHRvIGhvc3QgKi8KKworCVM0KHVsb25nLCBiY18yaWR0X2hlYWQpCisJUzQodWxvbmcsIGJjXzJpZHRfdGFpbCkKKwlTNCh1bG9uZywgYmNfMmlkdF9tYXNrKQorCVMxQShjaGFyLCBiY18yaWR0LCAweDIwMCkJLyogQ2lyYyBidWZmIHRvIGlkdCAqLworCisJLyogUG9pbnRlcnMgdG8gc3RydWN0dXJlcyBmb3IgZHJpdmVyIGFjY2VzcyAqLworCVM0KHVjaGFyICosIGJjX3BvcnQpCS8qIHBvaW50ZXIgdG8gUG9ydFtdIHN0cnVjdHVyZXMgKi8KKwlTNChsb25nLCBiY19ucG9ydHMpCS8qIE51bWJlciBvZiBwb3J0cyAqLworCVM0KGxvbmcsIGJjX3BvcnRsZW4pCS8qIHNpemVvZihQT1JUKSAqLworCVM0KHVjaGFyICosIGJjX2hhc2gpCS8qIFBvaW50ZXIgdG8gaGFzaCB0YWJsZSAqLworCVM0KGxvbmcsIGJjX2hhc2hsZW4pCS8qIHNpemVvZihUYWJsZSkgKi8KKworCS8qIFNOTVAgYWdlbnQgYWRkcmVzc2VzICovCisJUzFBKHVjaGFyLCBiY19pcGFkZHIsIDQpIC8qIElQIGFkZHJlc3MgZm9yIFNOTVAgKi8KKwlTMUEodWNoYXIsIGJjX2lweG5ldCwgNCkgLyogSVBYIG5ldCBhZGRyZXNzIGZvciBTTk1QICovCisKKwlTNChsb25nLCBiY19ub2hvc3RpbnRyKSAvKiBEbyBub3QgY2F1c2UgcGVyaW9kaWMgaG9zdCBpbnRlcnJ1cHRzICovCisKKwlTNCh1Y2hhciAqLCBiY19kbWFhZGRyKSAvKiBQaHlzaWNhbCBhZGRyIG9mIGhvc3QgRE1BIGJ1ZiBmb3IgZGlhZ3MgKi8KKwlTNCh1bG9uZywgYmNfZG1hbGVuKQkvKiBMZW5ndGggb2YgRE1BIGJ1ZmZlciAwLi4yMDQ4ICovCisKKwkvKgorCSAqCUJvYXJkIG1lbW9yeSBhbGxvY2F0ZWQgb24gc3RhcnR1cCBmb3IgdXNlIGJ5IGhvc3QsIHVzdWFsbHkKKwkgKglmb3IgdGhlIHB1cnBvc2VzIG9mIGNyZWF0aW5nIERNQSBjaGFpbiBkZXNjcmlwdG9ycy4gIFRoZQorCSAqCSJsZW4iIG11c3QgYmUgc2V0IGJlZm9yZSB0aGUgcHJvY2Vzc29yIGlzIHJlbGVhc2VkLiAgVGhlCisJICoJYWRkcmVzcyBvZiB0aGUgYXJlYSBpcyByZXR1cm5lZCBpbiBiY19ob3N0YXJlYS4gIFRoZSBhcmVhCisJICoJaXMgZ3VhcmFudGVlZCB0byBiZSBhbGlnbmVkIG9uIGEgMTYgYnl0ZSBib3VuZGFyeS4KKwkgKi8KKwlTNCh1bG9uZywgYmNfaG9zdGFyZWFfbGVuKQkvKiBSVzogTnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlICovCisJUzQodWNoYXIgKiwgYmNfaG9zdGFyZWEpCS8qIFJPOiBBZGRyZXNzIG9mIGFsbG9jYXRlZCBtZW1vcnkgKi8KKworCS8qCisJICoJVmFyaWFibGVzIGZvciBjb21tdW5pY2F0aW5nIGZpbHRlcnMgaW50byB0aGUgYm9hcmQKKwkgKi8KKwlTNCh1bG9uZyAqLCBiY19maWx0ZXJfYXJlYSkJLyogUk86IFNwYWNlIHRvIHB1dCBmaWx0ZXIgaW50byAqLworCVM0KHVsb25nLCBiY19maWx0ZXJfYXJlYV9sZW4pCS8qIFJPOiBMZW5ndGggb2YgYXJlYSwgaW4gYnl0ZXMgKi8KKwlTNChsb25nLCBiY19maWx0ZXJfY21kKQkJLyogUlc6IEZpbHRlciBjb21tYW5kLCBzZWUgYmVsb3cgKi8KKwlTNCh1bG9uZywgYmNfZmlsdGVyX2xlbikJLyogUlc6IEFjdHVhbCBsZW5ndGggb2YgZmlsdGVyICovCisJUzQodWxvbmcsIGJjX2ZpbHRlcl9wb3J0KQkvKiBSVzogUG9ydCAjIGZvciBmaWx0ZXIgMC4uNiAqLworCVM0KHVsb25nLCBiY19maWx0ZXJfbnVtKQkvKiBSVzogRmlsdGVyICMsIDA9aW5wdXQsIDE9b3V0cHV0ICovCisKKwkvKiBtb3JlIFNOTVAgYWdlbnQgYWRkcmVzc2VzICovCisJUzFBKHVjaGFyLCBiY19pcHRyYXAsIDQpIC8qIElQIGFkZHJlc3MgZm9yIFNOTVAgKi8KKworCVM0QShsb25nLCBiY19zcGFyZSwgMikJLyogc3BhcmVzICovCitFTkRfU1RSVUNUKGJpb3NfY29tbSkKKworI2RlZmluZQliYwlWTU8oc3RydWN0IGJpb3NfY29tbSwgMHhhMzAwMDEwMCkKKworLyoKKyAqCWJjX3N0YXR1cyB2YWx1ZXMKKyAqLworI2RlZmluZQlCQ19JTklUCTAKKyNkZWZpbmUJQkNfUlVOCTEwMAorCisvKgorICoJYmNfaG9zdCB2YWx1ZXMKKyAqLworI2RlZmluZQlCQ19ESUFHUwktMQorI2RlZmluZSBCQ19TQVNXSVRDSAkwCisjZGVmaW5lCUJDX1NXSVRDSAkxCisjZGVmaW5lCUJDX01VTFRJTklDCTIKKworLyoKKyAqCVZhbHVlcyBmb3Igc3BldyAoZGVidWdnaW5nKQorICovCisjZGVmaW5lCUJDX1NQRVdfRU5BQkxFCTB4ODAwMDAwMDAKKworLyoKKyAqCWZpbHRlciBjb21tYW5kcworICovCisjZGVmaW5lCUJDX0ZJTFRFUl9FUlIJLTEKKyNkZWZpbmUJQkNfRklMVEVSX09LCTAKKyNkZWZpbmUJQkNfRklMVEVSX1NFVAkxCisjZGVmaW5lCUJDX0ZJTFRFUl9DTFIJMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGdyc19lczRoLmggYi9kcml2ZXJzL25ldC9kZ3JzX2VzNGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTE4ZmJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZGdyc19lczRoLmgKQEAgLTAsMCArMSwxODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCSovCisvKgllczRoLmg6CUhhcmR3YXJlIGRlZmluaXRpb24gb2YgdGhlIEVTLzRoIEV0aGVybmV0IFN3aXRjaCwgZnJvbQkqLworLyoJCWJvdGggdGhlIGhvc3QgYW5kIHRoZSAzMDUxJ3MgcG9pbnQgb2Ygdmlldy4JCSovCisvKgkJTk9URTogdGhpcyBuYW1lIGlzIGEgbWlzbm9tZXIgbm93IHRoYXQgdGhlcmUgaXMgYSBQQ0kJKi8KKy8qCQlib2FyZC4gIEV2ZXJ5dGhpbmcgdGhhdCBzYXlzICJlczRoIiBzaG91bGQgcmVhbGx5IGJlCSovCisvKgkJInNlNCIuICBCdXQgd2UnbGwga2VlcCB0aGUgb2xkIG5hbWUgZm9yIG5vdy4JCSovCisvKgkJCQkJCQkJCSovCisvKgkkSWQ6IGVzNGguaCx2IDEuMTAgMTk5Ni8wOC8yMiAxNzoxNjo1MyByaWNrIEV4cCAkCQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUVJU0EgSS9PIFJlZ2lzdGVycy4gIFRoZXNlIGFyZSBsb2NhdGVkIGF0IDB4MTAwMCAqIHNsb3QtbnVtYmVyCSovCisvKglwbHVzIHRoZSBpbmRpY2F0ZWQgYWRkcmVzcy4gIEkuRS4gMHg0MDAwLTB4NDAwOSBmb3Igc2xvdCA0LgkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZQlFUzRIX01BTlVGbXNiCTB4MDAJCS8qIFJlYWQtb25seSAqLworI2RlZmluZQlFUzRIX01BTlVGbHNiCTB4MDEJCS8qIFJlYWQtb25seSAqLworIwlkZWZpbmUgRVM0SF9NQU5VRl9DT0RFCQkweDEwNDkJLyogPSAiREJJIiAqLworCisjZGVmaW5lCUVTNEhfUFJPRFVDVAkweDAyCQkvKiBSZWFkLW9ubHkgKi8KKyMJZGVmaW5lIEVTNEhfUFJPRFVDVF9DT0RFCTB4MEEKKyMJZGVmaW5lIEVQQ19QUk9EVUNUX0NPREUJCTB4MDMKKworI2RlZmluZQlFUzRIX1JFVklTSU9OCTB4MDMJCS8qIFJlYWQtb25seSAqLworIwlkZWZpbmUgRVM0SF9SRVZJU0lPTl9DT0RFCTB4MDEKKworI2RlZmluZQlFUzRIX0VDCQkweDA0CQkvKiBFSVNBIENvbnRyb2wgKi8KKyMJZGVmaW5lIEVTNEhfRUNfUkVTRVQJCTB4MDQJLyogV08sIEVJU0EgcmVzZXQgKi8KKyMJZGVmaW5lIEVTNEhfRUNfRU5BQkxFCQkweDAxCS8qIFJXLCBFSVNBIGVuYWJsZSAtIHNldCB0byAqLworCQkJCQkJLyogMSBiZWZvcmUgbWVtb3J5IGVuYWJsZSAqLworI2RlZmluZQlFUzRIX1BDCQkweDA1CQkvKiBQcm9jZXNzb3IgQ29udHJvbCAqLworIwlkZWZpbmUgRVM0SF9QQ19SRVNFVAkJMHgwNAkvKiBSVywgMzA1MSByZXNldCAqLworIwlkZWZpbmUgRVM0SF9QQ19JTlQJCTB4MDgJLyogV08sIGFzc2VydCAzMDUxIGludHIuIDMgKi8KKworI2RlZmluZQlFUzRIX01XCQkweDA2CQkvKiBNZW1vcnkgV2luZG93IHNlbGVjdCBhbmQgZW5hYmxlICovCisjCWRlZmluZSBFUzRIX01XX0VOQUJMRQkJMHg4MAkvKiBXTywgZW5hYmxlIG1lbW9yeSAqLworIwlkZWZpbmUgRVM0SF9NV19TRUxFQ1RfTUFTSwkweDFmCS8qIFdPLCAzMmsgd2luZG93IHNlbGVjdGVkICovCisKKyNkZWZpbmUJRVM0SF9JUwkJMHgwNwkJLyogSW50ZXJydXB0LCBhZGRyIHNlbGVjdCAqLworIwlkZWZpbmUgRVM0SF9JU19JTlRNQVNLCQkweDA3CS8qIFdPLCBpbnRlcnJ1cHQgc2VsZWN0ICovCisjCWRlZmluZSBFUzRIX0lTX0lOVE9GRgkJMHgwMAkJLyogTm8gSVJRICovCisjCWRlZmluZSBFUzRIX0lTX0lOVDMJCTB4MDMJCS8qIElSUSAzICovCisjCWRlZmluZSBFUzRIX0lTX0lOVDUJCTB4MDIJCS8qIElSUSA1ICovCisjCWRlZmluZSBFUzRIX0lTX0lOVDcJCTB4MDEJCS8qIElSUSA3ICovCisjCWRlZmluZSBFUzRIX0lTX0lOVDEwCQkweDA0CQkvKiBJUlEgMTAgKi8KKyMJZGVmaW5lIEVTNEhfSVNfSU5UMTEJCTB4MDUJCS8qIElSUSAxMSAqLworIwlkZWZpbmUgRVM0SF9JU19JTlQxMgkJMHgwNgkJLyogSVJRIDEyICovCisjCWRlZmluZSBFUzRIX0lTX0lOVDE1CQkweDA3CQkvKiBJUlEgMTUgKi8KKyMJZGVmaW5lIEVTNEhfSVNfSU5UQUNLCQkweDEwCS8qIFdPLCBpbnRlcnJ1cHQgYWNrICovCisjCWRlZmluZSBFUzRIX0lTX0lOVFBFTkQJCTB4MTAJLyogUk8sIGludGVycnVwdCBwZW5kaW5nICovCisjCWRlZmluZSBFUzRIX0lTX0xJTkVBUgkJMHg0MAkvKiBXTywgbm8gbWVtb3J5IHdpbmRvd2luZyAqLworIwlkZWZpbmUgRVM0SF9JU19BUzE1CQkweDgwCS8qIFJXLCBhZGRyZXNzIHNlbGVjdCBiaXQgMTUgKi8KKworI2RlZmluZQlFUzRIX0FTXzIzXzE2CTB4MDgJCS8qIEFkZHJlc3Mgc2VsZWN0IGJpdHMgMjMtMTYgKi8KKyNkZWZpbmUJRVM0SF9BU18zMV8yNAkweDA5CQkvKiBBZGRyZXNzIHNlbGVjdCBiaXRzIDMxLTI0ICovCisKKyNkZWZpbmUgRVM0SF9JT19NQVgJCTB4MDkJCS8qIFNpemUgb2YgSS9PIHNwYWNlICovCisKKy8qCisgKiBQQ0kKKyAqLworI2RlZmluZSBTRTZfUkVTRVQJCVBMWF9VU0VST1VUCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCSovCisvKgkzMDUxIE1lbW9yeSBNYXAJCQkJCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qCU5vdGU6IDMwNTEgaGFzIDRLIEktY2FjaGUsIDJLIEQtY2FjaGUuICAxIGN5Y2xlIGlzIDUwIG5zZWMuCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlTRTRfTlBPUlRTCQk0CQkvKiAjIG9mIGV0aGVybmV0IHBvcnRzICovCisjZGVmaW5lCVNFNl9OUE9SVFMJCTYJCS8qICMgb2YgZXRoZXJuZXQgcG9ydHMgKi8KKyNkZWZpbmUJU0VfTlBPUlRTCQk2CQkvKiBNYXggIyBvZiBldGhlcm5ldCBwb3J0cyAqLworCisjZGVmaW5lCUVTNEhfUkFNX0JBU0UJCTB4ODMwMDAwMDAJLyogQmFzZSBhZGRyZXNzIG9mIFJBTSAqLworI2RlZmluZQlFUzRIX1JBTV9TSVpFCQkweDAwMjAwMDAwCS8qIFNpemUgb2YgUkFNICgyTUIpICovCisjZGVmaW5lCUVTNEhfUkFNX0lOVEJBU0UJMHg4MzgwMDAwMAkvKiBCYXNlIG9mIGludC1vbi13cml0ZSBSQU0gKi8KKwkJCQkJCS8qIGEuay5hLiBQS1QgUkFNICovCisKKwkJCQkJCS8qIEV0aGVybmV0IGNvbnRyb2xsZXJzICovCisJCQkJCQkvKiBTZWU6IGk4MjU5Ni5oICovCisjZGVmaW5lCUVTNEhfRVRIRVIwX1BPUlQJMHhBMjAwMDAwMAorI2RlZmluZQlFUzRIX0VUSEVSMF9DTUQJCTB4QTIwMDAxMDAKKyNkZWZpbmUJRVM0SF9FVEhFUjFfUE9SVAkweEEyMDAwMjAwCisjZGVmaW5lCUVTNEhfRVRIRVIxX0NNRAkJMHhBMjAwMDMwMAorI2RlZmluZQlFUzRIX0VUSEVSMl9QT1JUCTB4QTIwMDA0MDAKKyNkZWZpbmUJRVM0SF9FVEhFUjJfQ01ECQkweEEyMDAwNTAwCisjZGVmaW5lCUVTNEhfRVRIRVIzX1BPUlQJMHhBMjAwMDYwMAorI2RlZmluZQlFUzRIX0VUSEVSM19DTUQJCTB4QTIwMDA3MDAKKyNkZWZpbmUJRVM0SF9FVEhFUjRfUE9SVAkweEEyMDAwODAwCS8qIFJTIFNFLTYgb25seSAqLworI2RlZmluZQlFUzRIX0VUSEVSNF9DTUQJCTB4QTIwMDA5MDAJLyogUlMgU0UtNiBvbmx5ICovCisjZGVmaW5lCUVTNEhfRVRIRVI1X1BPUlQJMHhBMjAwMEEwMAkvKiBSUyBTRS02IG9ubHkgKi8KKyNkZWZpbmUJRVM0SF9FVEhFUjVfQ01ECQkweEEyMDAwQjAwCS8qIFJTIFNFLTYgb25seSAqLworCisjZGVmaW5lCUVTNEhfSTgyNTQJCTB4QTIwNDAwMDAJLyogODJDNTQgdGltZXJzICovCisJCQkJCQkvKiBTZWU6IGk4MjU0LmggKi8KKworI2RlZmluZQlTRTRfSTgyNTRfSFoJCSgyMzAwMDAwMC80KQkvKiBFSVNBIGNsb2NrIGlucHV0IGZyZXEuICovCisjZGVmaW5lCVNFNF9JRFRfSFoJCSg0NjAwMDAwMCkJLyogRUlTQSBDUFUgZnJlcS4gKi8KKyNkZWZpbmUJU0U2X0k4MjU0X0haCQkoMjAwMDAwMDAvNCkJLyogUENJIGNsb2NrIGlucHV0IGZyZXEuICovCisjZGVmaW5lCVNFNl9JRFRfSFoJCSg1MDAwMDAwMCkJLyogUENJIENQVSBmcmVxLiAqLworI2RlZmluZQlFUzRIX0k4MjU0X0haCQkoMjMwMDAwMDAvNCkJLyogRUlTQSBjbG9jayBpbnB1dCBmcmVxLiAqLworCisjZGVmaW5lCUVTNEhfR1BQCQkweEEyMDUwMDAwCS8qIEdlbmVyYWwgcHVycG9zZSBwb3J0ICovCisJLyoKKwkgKiBTRS00IChFSVNBKSBHUFAgYml0cworCSAqLworIwlkZWZpbmUgRVM0SF9HUFBfQzBfMTAwCQkweDAwMDEJLyogV08sIENoYW4gMDogMTAwIG9obSBUUCAqLworIwlkZWZpbmUgRVM0SF9HUFBfQzBfU1FFCQkweDAwMDIJLyogV08sIENoYW4gMDogbm9ybWFsIHNxdWVsY2ggKi8KKyMJZGVmaW5lIEVTNEhfR1BQX0MxXzEwMAkJMHgwMDA0CS8qIFdPLCBDaGFuIDE6IDEwMCBvaG0gVFAgKi8KKyMJZGVmaW5lIEVTNEhfR1BQX0MxX1NRRQkJMHgwMDA4CS8qIFdPLCBDaGFuIDE6IG5vcm1hbCBzcXVlbGNoICovCisjCWRlZmluZSBFUzRIX0dQUF9DMl8xMDAJCTB4MDAxMAkvKiBXTywgQ2hhbiAyOiAxMDAgb2htIFRQICovCisjCWRlZmluZSBFUzRIX0dQUF9DMl9TUUUJCTB4MDAyMAkvKiBXTywgQ2hhbiAyOiBub3JtYWwgc3F1ZWxjaCAqLworIwlkZWZpbmUgRVM0SF9HUFBfQzNfMTAwCQkweDAwNDAJLyogV08sIENoYW4gMzogMTAwIG9obSBUUCAqLworIwlkZWZpbmUgRVM0SF9HUFBfQzNfU1FFCQkweDAwODAJLyogV08sIENoYW4gMzogbm9ybWFsIHNxdWVsY2ggKi8KKyMJZGVmaW5lIEVTNEhfR1BQX1NRRQkJMHgwMEFBCS8qIFdPLCBBbGw6IG5vcm1hbCBzcXVlbGNoICovCisjCWRlZmluZSBFUzRIX0dQUF8xMDAJCTB4MDA1NQkvKiBXTywgQWxsOiAxMDAgb2htIFRQICovCisjCWRlZmluZSBFUzRIX0dQUF9IT1NUSU5UCQkweDAxMDAJLyogUk8sIGNhdXNlIGludHIuIHRvIGhvc3QgKi8KKwkJCQkJCS8qIEhvbGQgaGlnaCA+IDI1MCBuc2VjICovCisjCWRlZmluZSBTRTRfR1BQX0VFRAkJMHgwMjAwCS8qIFJXLCBFRVBST00gZGF0YSBiaXQgKi8KKyMJZGVmaW5lIFNFNF9HUFBfRUVDUwkJMHgwNDAwCS8qIFJXLCBFRVBST00gY2hpcCBzZWxlY3QgKi8KKyMJZGVmaW5lIFNFNF9HUFBfRUVDSwkJMHgwODAwCS8qIFJXLCBFRVBST00gY2xvY2sgKi8KKworCS8qCisJICogU0UtNiAoUENJKSBHUFAgYml0cworCSAqLworIwlkZWZpbmUgU0U2X0dQUF9FRUQJCTB4MDAwMQkvKiBSVywgRUVQUk9NIGRhdGEgYml0ICovCisjCWRlZmluZSBTRTZfR1BQX0VFQ1MJCTB4MDAwMgkvKiBSVywgRUVQUk9NIGNoaXAgc2VsZWN0ICovCisjCWRlZmluZSBTRTZfR1BQX0VFQ0sJCTB4MDAwNAkvKiBSVywgRUVQUk9NIGNsb2NrICovCisjCWRlZmluZSBTRTZfR1BQX0xJTksJCTB4MDBmYwkvKiBSLCBMaW5rIHN0YXR1cyBMRURzICovCisKKyNkZWZpbmUJRVM0SF9JTlRWRUMJCTB4QTIwNjAwMDAJLyogUk86IEludGVycnVwdCBWZWN0b3IgKi8KKyMJZGVmaW5lIEVTNEhfSVZfRE1BMAkJMHgwMQkvKiBDaGFuIDAgRE1BIGludGVycnVwdCAqLworIwlkZWZpbmUgRVM0SF9JVl9QS1QwCQkweDAyCS8qIENoYW4gMCBQS1QgaW50ZXJydXB0ICovCisjCWRlZmluZSBFUzRIX0lWX0RNQTEJCTB4MDQJLyogQ2hhbiAxIERNQSBpbnRlcnJ1cHQgKi8KKyMJZGVmaW5lIEVTNEhfSVZfUEtUMQkJMHgwOAkvKiBDaGFuIDEgUEtUIGludGVycnVwdCAqLworIwlkZWZpbmUgRVM0SF9JVl9ETUEyCQkweDEwCS8qIENoYW4gMiBETUEgaW50ZXJydXB0ICovCisjCWRlZmluZSBFUzRIX0lWX1BLVDIJCTB4MjAJLyogQ2hhbiAyIFBLVCBpbnRlcnJ1cHQgKi8KKyMJZGVmaW5lIEVTNEhfSVZfRE1BMwkJMHg0MAkvKiBDaGFuIDMgRE1BIGludGVycnVwdCAqLworIwlkZWZpbmUgRVM0SF9JVl9QS1QzCQkweDgwCS8qIENoYW4gMyBQS1QgaW50ZXJydXB0ICovCisKKyNkZWZpbmUJRVM0SF9JTlRBQ0sJCTB4QTIwNjAwMDAJLyogV086IEludGVycnVwdCBBY2sgKi8KKyMJZGVmaW5lIEVTNEhfSU5UQUNLXzgyNTQJCTB4MDEJLyogUmVhbCBUaW1lIENsb2NrIChpbnQgMCkgKi8KKyMJZGVmaW5lIEVTNEhfSU5UQUNLX0hPU1QJCTB4MDIJLyogSG9zdCAoaW50IDEpICovCisjCWRlZmluZSBFUzRIX0lOVEFDS19QS1QwCQkweDA0CS8qIENoYW4gMCBQa3QgKGludCAyKSAqLworIwlkZWZpbmUgRVM0SF9JTlRBQ0tfUEtUMQkJMHgwOAkvKiBDaGFuIDEgUGt0IChpbnQgMykgKi8KKyMJZGVmaW5lIEVTNEhfSU5UQUNLX1BLVDIJCTB4MTAJLyogQ2hhbiAyIFBrdCAoaW50IDQpICovCisjCWRlZmluZSBFUzRIX0lOVEFDS19QS1QzCQkweDIwCS8qIENoYW4gMyBQa3QgKGludCA1KSAqLworCisjZGVmaW5lCVNFNl9QTFgJCQkweEEyMDcwMDAwCS8qIFBMWCA5MDYwLCBTRS02IChQQ0kpIG9ubHkgKi8KKwkJCQkJCS8qIHNlZSBwbHg5MDYwLmggKi8KKworI2RlZmluZQlTRTZfUENJX1ZFTkRPUl9JRAkweDExNEYJCS8qIERpZ2kgUENJIHZlbmRvciBJRCAqLworI2RlZmluZQlTRTZfUENJX0RFVklDRV9JRAkweDAwMDMJCS8qIFJTIFNFLTYgZGV2aWNlIElEICovCisjZGVmaW5lCVNFNl9QQ0lfSUQJCSgoU0U2X1BDSV9ERVZJQ0VfSUQ8PDE2KSB8IFNFNl9QQ0lfVkVORE9SX0lEKQorCisvKgorICoJSURUIEludGVycnVwdHMKKyAqLworI2RlZmluZQlFUzRIX0lOVF84MjU0CQlJRFRfSU5UMAorI2RlZmluZQlFUzRIX0lOVF9IT1NUCQlJRFRfSU5UMQorI2RlZmluZQlFUzRIX0lOVF9FVEhFUjAJCUlEVF9JTlQyCisjZGVmaW5lCUVTNEhfSU5UX0VUSEVSMQkJSURUX0lOVDMKKyNkZWZpbmUJRVM0SF9JTlRfRVRIRVIyCQlJRFRfSU5UNAorI2RlZmluZQlFUzRIX0lOVF9FVEhFUjMJCUlEVF9JTlQ1CisKKy8qCisgKglCZWNhdXNlIHRoZXJlIGFyZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBTRS00IGFuZCB0aGUgU0UtNiwKKyAqCXdlIGFzc3VtZSB0aGF0IHRoZSBmb2xsb3dpbmcgZ2xvYmFscyB3aWxsIGJlIHNldCB1cCBhdCBpbml0CisgKgl0aW1lIGluIG1haW4uYyB0byBjb250YWludCB0aGUgYXBwcm9wcmlhdGUgY29uc3RhbnRzIGZyb20gYWJvdmUKKyAqLworZXh0ZXJuIHVzaG9ydAlHcHA7CQkvKiBTb2Z0Y29weSBvZiBHUFAgcmVnaXN0ZXIgKi8KK2V4dGVybiB1c2hvcnQJRUVjazsJCS8qIENsb2NrIGJpdCAqLworZXh0ZXJuIHVzaG9ydAlFRWNzOwkJLyogQ1MgYml0ICovCitleHRlcm4gdXNob3J0CUVFZDsJCS8qIERhdGEgYml0ICovCitleHRlcm4gdWxvbmcJSTgyNTRfSHo7CS8qIGk4MjU0IGlucHV0IGZyZXF1ZW5jeSAqLworZXh0ZXJuIHVsb25nCUlEVF9IejsJCS8qIElEVCBDUFUgZnJlcXVlbmN5ICovCitleHRlcm4gaW50CU5wb3J0czsJCS8qIE51bWJlciBvZiBldGhlcm5ldCBjb250cm9sbGVycyAqLworZXh0ZXJuIGludAlOY2hhbjsJCS8qIE5wb3J0cysxICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZ3JzX2V0aGVyLmggYi9kcml2ZXJzL25ldC9kZ3JzX2V0aGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE1OTZjZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2RncnNfZXRoZXIuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqCUEgZmlsdGVyaW5nIGZ1bmN0aW9uLiAgVGhlcmUgYXJlIHR3byBmaWx0ZXJzL3BvcnQuICBGaWx0ZXIgIjAiCisgKglpcyB0aGUgaW5wdXQgZmlsdGVyLCBhbmQgZmlsdGVyICIxIiBpcyB0aGUgb3V0cHV0IGZpbHRlci4KKyAqLwordHlwZWRlZiBpbnQgKEZJTFRFUl9GVU5DKSh1Y2hhciAqcGt0cCwgaW50IHBrdGxlbiwgdWxvbmcgKnNjcmF0Y2gsIGludCBwb3J0KTsKKyNkZWZpbmUJTkZJTFRFUlMJMgorCisvKgorICoJVGhlIHBlciBwb3J0IHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdAoreworCWludAkJY2hhbjsJCS8qIENoYW5uZWwgbnVtYmVyICgwLTMpICovCisJdWxvbmcJCXBvcnRhZGRyOwkvKiBhZGRyZXNzIG9mIDU5NiBwb3J0IHJlZ2lzdGVyICovCisJdm9sYXRpbGUgdWxvbmcJKmNhOwkJLyogYWRkcmVzcyBvZiA1OTYgY2hhbiBhdHRlbnRpb24gKi8KKwl1bG9uZwkJaW50bWFzazsJLyogSW50ZXJydXB0IG1hc2sgZm9yIHRoaXMgcG9ydCAqLworCXVsb25nCQlpbnRhY2s7CQkvKiBBY2sgYml0IGZvciB0aGlzIHBvcnQgKi8KKworCXVjaGFyCQlldGhhZGRyWzZdOwkvKiBFdGhlcm5ldCBhZGRyZXNzIG9mIHRoaXMgcG9ydCAqLworCWludAkJaXNfcHJvbWlzYzsJLyogUG9ydCBpcyBwcm9taXNjdW91cyAqLworCisJaW50CQlkZWJ1ZzsJCS8qIERlYnVnZ2luZyB0dXJuZWQgb24gKi8KKworCUk1OTZfSVNDUAkqaXNjcHA7CQkvKiBVbmNhY2hlZCBJU0NQIHBvaW50ZXIgKi8KKwlJNTk2X1NDUAkqc2NwcDsJCS8qIFVuY2FjaGVkIFNDUCBwb2ludGVyICovCisJSTU5Nl9TQ0IJKnNjYnA7CQkvKiBVbmNhY2hlZCBTQ0IgcG9pbnRlciAqLworCisJSTU5Nl9JU0NQCWlzY3A7CisJSTU5Nl9TQ0IJc2NiOworCisJLyogQ29tbWFuZCBRdWV1ZSAqLworCUk1OTZfQ0IJCSpjYjA7CisJSTU5Nl9DQgkJKmNiTjsKKwlJNTk2X0NCCQkqY2JfaGVhZDsKKwlJNTk2X0NCCQkqY2JfdGFpbDsKKworCS8qIFJlY2VpdmUgUXVldWUgKi8KKwlJNTk2X1JGRAkqcmZkMDsKKwlJNTk2X1JGRAkqcmZkTjsKKwlJNTk2X1JGRAkqcmZkX2hlYWQ7CisJSTU5Nl9SRkQJKnJmZF90YWlsOworCisJLyogUmVjZWl2ZSBCdWZmZXJzICovCisJSTU5Nl9SQkQJKnJiZDA7CisJSTU5Nl9SQkQJKnJiZE47CisJSTU5Nl9SQkQJKnJiZF9oZWFkOworCUk1OTZfUkJECSpyYmRfdGFpbDsKKwlpbnQJCWJ1Zl9zaXplOwkvKiBTaXplIG9mIGFuIFJCRCBidWZmZXIgKi8KKwlpbnQJCWJ1Zl9jbnQ7CS8qIFRvdGFsIFJCRCdzIGFsbG9jYXRlZCAqLworCisJLyogUnggU3RhdGlzdGljcyAqLworCXVsb25nCQljbnRfcnhfY250OwkvKiBUb3RhbCBwYWNrZXRzIHJjdmQsIGdvb2QgYW5kIGJhZCAqLyAKKwl1bG9uZwkJY250X3J4X2dvb2Q7CS8qIFRvdGFsIGdvb2QgcGFja2V0cyByY3ZkICovCisJdWxvbmcJCWNudF9yeF9iYWQ7CS8qIFRvdGFsIG9mIGFsbCBiYWQgcGFja2V0cyByY3ZkICovCisJCQkJCS8qIFN1YnRvdGFscyBjYW4gYmUgZ290dGVuIGZyb20gU0NCICovCisJdWxvbmcJCWNudF9yeF9ub3JlczsJLyogTm8gcmVzb3VyY2VzICovCisJdWxvbmcJCWNudF9yeF9ieXRlczsJLyogVG90YWwgYnl0ZXMgcmN2ZCAqLworCisJLyogVHggU3RhdGlzdGljcyAqLworCXVsb25nCQljbnRfdHhfcXVldWVkOworCXVsb25nCQljbnRfdHhfZG9uZTsKKwl1bG9uZwkJY250X3R4X2ZyZWVkOworCXVsb25nCQljbnRfdHhfbm9yZXM7CS8qIE5vIHJlc291cmNlcyAqLworCisJdWxvbmcJCWNudF90eF9iYWQ7CisJdWxvbmcJCWNudF90eF9lcnJfbGF0ZTsKKwl1bG9uZwkJY250X3R4X2Vycl9ub2NyczsKKwl1bG9uZwkJY250X3R4X2Vycl9ub2N0czsKKwl1bG9uZwkJY250X3R4X2Vycl91bmRlcjsKKwl1bG9uZwkJY250X3R4X2Vycl9tYXhjb2w7CisJdWxvbmcJCWNudF90eF9jb2xsaXNpb25zOworCisJLyogU3BlY2lhbCBzdHVmZiBmb3IgaG9zdCAqLworIwlkZWZpbmUJCXJmZF9mcmVlZAljbnRfcnhfY250CisJdWxvbmcJCXJiZF9mcmVlZDsKKwlpbnQJCWhvc3RfdGltZXI7CisKKwkvKiBBZGRlZCBhZnRlciBmaXJzdCBiZXRhICovCisJdWxvbmcJCWNudF90eF9yYWNlczsJLyogQ291bnRzIHJhY2UgY29uZGl0aW9ucyAqLworCWludAkJc3BhbnN0YXRlOworCXVsb25nCQljbnRfc3RfdHg7CS8qIHNlbmQgc3BhbiB0cmVlIHBrdHMgKi8KKwl1bG9uZwkJY250X3N0X2ZhaWxfdHg7CS8qIEZhaWx1cmVzIHRvIHNlbmQgc3BhbiB0cmVlIHBrdHMgKi8KKwl1bG9uZwkJY250X3N0X2ZhaWxfcmJkOy8qIEZhaWx1cmVzIHRvIHNlbmQgc3BhbiB0cmVlIHBrdHMgKi8KKwl1bG9uZwkJY250X3N0X3J4OwkvKiByY3Ygc3BhbiB0cmVlIHBrdHMgKi8KKwl1bG9uZwkJY250X3N0X3J4X2JhZDsJLyogYm9ndXMgc3QgcGFja2V0cyByY3ZkICovCisJdWxvbmcJCWNudF9yeF9md2Q7CS8qIFJjdmQgcGFja2V0cyB0aGF0IHdlcmUgZm9yd2FyZGVkICovCisKKwl1bG9uZwkJY250X3J4X21jYXN0OwkvKiBNdWx0aWNhc3QgcGt0cyByZWNlaXZlZCAqLworCXVsb25nCQljbnRfdHhfbWNhc3Q7CS8qIE11bHRpY2FzdCBwa3RzIHRyYW5zbWl0dGVkICovCisJdWxvbmcJCWNudF90eF9ieXRlczsJLyogQnl0ZXMgdHJhbnNtaXR0ZWQgKi8KKworCS8qCisJICoJUGFja2V0IGZpbHRlcmluZworCSAqCUZpbHRlciAwOiBpbnB1dCBmaWx0ZXIKKwkgKglGaWx0ZXIgMTogb3V0cHV0IGZpbHRlcgorCSAqLworCQorCXVsb25nCQkqZmlsdGVyX3NwYWNlW05GSUxURVJTXTsKKwlGSUxURVJfRlVOQwkqZmlsdGVyX2Z1bmNbTkZJTFRFUlNdOworCXVsb25nCQlmaWx0ZXJfY250W05GSUxURVJTXTsKKwl1bG9uZwkJZmlsdGVyX2xlbltORklMVEVSU107CisKKwl1bG9uZwkJcGFkWyAoNTEyLTMwMCkgLyA0XTsKK30gUE9SVDsKKworLyoKKyAqCVBvcnRbMF0JCQlpcyBob3N0IGludGVyZmFjZQorICoJUG9ydFsxLi5TRV9OUE9SVFNdCWFyZSBleHRlcm5hbCAxMCBCYXNlIFQgcG9ydHMuICBGZXdlciBtYXkgYmUgaW4KKyAqCQkJCXVzZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhpcyBpcyBhbiBTRS00IG9yCisgKgkJCQlhbiBTRS02LgorICoJUG9ydFtTRV9OUE9SVFNdCQlQc2V1ZG8tcG9ydCBmb3IgU3Bhbm5pbmcgdHJlZSBhbmQgU05NUAorICovCitleHRlcm4gUE9SVAlQb3J0WzErU0VfTlBPUlRTKzFdOworCitleHRlcm4gaW50CU5wb3J0czsJCS8qIE51bWJlciBvZiBnZW51aW5lIGV0aGVybmV0IGNvbnRyb2xsZXJzICovCitleHRlcm4gaW50CU5jaGFuOwkJLyogLi4uIHBsdXMgb25lIGZvciBob3N0IGludGVyZmFjZSAqLworCitleHRlcm4gaW50CUZpcnN0Q2hhbjsJLyogMCBvciAxLCBkZXBlZG5pbmcgb24gd2hldGhlciBob3N0IGlzIHVzZWQgKi8KK2V4dGVybiBpbnQJTnVtQ2hhbjsJLyogNCBvciA1ICovCisKKy8qCisgKglBIGZldyBnbG9iYWxzCisgKi8KK2V4dGVybiBpbnQJSXNQcm9taXNjOworZXh0ZXJuIGludAlNdWx0aU5pY01vZGU7CisKKy8qCisgKglGdW5jdGlvbnMKKyAqLworZXh0ZXJuIHZvaWQJZXRoX3htaXRfc3Bld19vbihQT1JUICpwLCBpbnQgY250KTsKK2V4dGVybiB2b2lkCWV0aF94bWl0X3NwZXdfb2ZmKFBPUlQgKnApOworCitleHRlcm4gSTU5Nl9SQkQJKmFsbG9jX3JiZHMoUE9SVCAqcCwgaW50IG51bSk7CisKK2V4dGVybiBJNTk2X0NCICogZXRoX2NiX2FsbG9jKFBPUlQgKnApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGdyc19maXJtd2FyZS5jIGIvZHJpdmVycy9uZXQvZGdyc19maXJtd2FyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNDllMWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kZ3JzX2Zpcm13YXJlLmMKQEAgLTAsMCArMSw5OTY2IEBACitzdGF0aWMgaW50IGRncnNfZmlybW51bSA9IDU1MDsKK3N0YXRpYyBjaGFyIGRncnNfZmlybXZlcltdID0gIiRWZXJzaW9uJCI7CitzdGF0aWMgY2hhciBkZ3JzX2Zpcm1kYXRlW10gPSAiMTEvMTYvOTYgMDM6NDU6MTUiOworc3RhdGljIHVuc2lnbmVkIGNoYXIgZGdyc19jb2RlW10gX19pbml0ZGF0YSA9IHsKKwkyMTMsNSwxOTIsOCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDY0LDQwLDM1LDQxLAorCTEwMSwxMTUsNTIsMTA0LDQ2LDk4LDEwNSwxMTAsMzIsMzIsMzIsMzIsCisJMzIsMzIsNDksNDYsNDgsMzIsNDgsNDgsNDcsNDgsNDgsNDcsCisJNTcsNTIsMCw2NCw0MCwzNSw0MSw2NywxMTEsMTEyLDEyMSwxMTQsCisJMTA1LDEwMywxMDQsMTE2LDMyLDQ5LDU3LDU3LDUzLDQ0LDMyLDY4LAorCTEwNSwxMDMsMTA1LDMyLDczLDExMCwxMTYsMTAxLDExNCwxMTAsOTcsMTE2LAorCTEwNSwxMTEsMTEwLDk3LDEwOCw0NiwzMiwzMiw2NSwxMDgsMTA4LDMyLAorCTgyLDEwNSwxMDMsMTA0LDExNiwxMTUsMzIsODIsMTAxLDExNSwxMDEsMTE0LAorCTExOCwxMDEsMTAwLDQ2LDAsMCwwLDAsOTcsNSwxOTIsOCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwyNTUsMCwxNiwwLDAsMCwwLAorCTAsMCwwLDAsOCwwLDIyNCwzLDAsMCwwLDAsCisJMTQ4LDI1NSwxODksMzksMTYsMCwxNjEsMTc1LDIwLDAsMTYyLDE3NSwKKwkyNCwwLDE2MywxNzUsMjgsMCwxNjQsMTc1LDMyLDAsMTY1LDE3NSwKKwkzNiwwLDE2NiwxNzUsNDAsMCwxNjcsMTc1LDQ0LDAsMTY4LDE3NSwKKwk0OCwwLDE2OSwxNzUsNTIsMCwxNzAsMTc1LDU2LDAsMTcxLDE3NSwKKwk2MCwwLDE3MiwxNzUsNjQsMCwxNzMsMTc1LDY4LDAsMTc0LDE3NSwKKwk3MiwwLDE3NSwxNzUsNzYsMCwxODQsMTc1LDgwLDAsMTg1LDE3NSwKKwk4OCwwLDE5MCwxNzUsOTIsMCwxOTEsMTc1LDAsMTEyLDgsNjQsCisJMTgsNzIsMCwwLDE2LDgwLDAsMCwwLDk2LDExLDY0LAorCTg0LDAsMTY4LDE3NSw5NiwwLDE2OSwxNzUsMTAwLDAsMTcwLDE3NSwKKwkxMDQsMCwxNzEsMTc1LDMzLDU2LDAsMSwwLDEzMSwyNCw2MCwKKwkwLDEsMjQsMzksMCwwLDgsMTQzLDAsMCwwLDAsCisJMSwwLDgsMzMsMCwwLDgsMTc1LDAsMTA0LDUsNjQsCisJMCw5Niw2LDY0LDEyNCwwLDE2OCw0OCwyMTIsMjU1LDAsMjEsCisJMCwwLDAsMCwzNiw2NCwxNjYsMCwwLDI1NSw4LDQ5LAorCTI3LDAsMCwxNywwLDAsMCwwLDEzMCw2NSw4LDAsCisJMiwxMzEsOSw2MCwzMyw3Miw0MCwxLDAsMjIwLDQxLDE0MSwKKwk2Niw2NCw4LDAsMiwxMzEsMTAsNjAsMzMsODAsNzIsMSwKKwkwLDIyNCw3NCwxNDEsMCwwLDAsMCwzOCw4MCw3MCwxLAorCTEsMjU1LDc0LDQ5LDMzLDQwLDE5MiwwLDM4LDQ4LDIwMiwwLAorCTAsOTYsMTM0LDY0LDY2LDY0LDgsMCwyLDEzMSw0LDYwLAorCTMzLDMyLDEzNiwwLDAsMjI2LDEzMiwxNDQsOSwyNDgsMzIsMSwKKwkwLDAsMCwwLDEwNCwwLDE2NiwxNDMsMCwwLDAsMCwKKwkwLDk2LDEzNCw2NCwwLDEwNCw1LDY0LDIyNywyNTUsMCwxNiwKKwkwLDAsMCwwLDEwNCwwLDE2OCwxNDMsOTYsMCwxNjksMTQzLAorCTEwMCwwLDE3MCwxNDMsMCwwLDAsMCwwLDk2LDEzNiw2NCwKKwkxOSwwLDMyLDEsMTcsMCw2NCwxLDIwLDAsMTYyLDE0MywKKwkyNCwwLDE2MywxNDMsMjgsMCwxNjQsMTQzLDMyLDAsMTY1LDE0MywKKwkzNiwwLDE2NiwxNDMsNDAsMCwxNjcsMTQzLDQ0LDAsMTY4LDE0MywKKwk0OCwwLDE2OSwxNDMsNTIsMCwxNzAsMTQzLDU2LDAsMTcxLDE0MywKKwk2MCwwLDE3MiwxNDMsNjQsMCwxNzMsMTQzLDY4LDAsMTc0LDE0MywKKwk3MiwwLDE3NSwxNDMsNzYsMCwxODQsMTQzLDgwLDAsMTg1LDE0MywKKwk4OCwwLDE5MCwxNDMsOTIsMCwxOTEsMTQzLDAsMCwwLDAsCisJODQsMCwxODYsMTQzLDE2LDAsMTYxLDE0MywxMDgsMCwxODksMzksCisJOCwwLDY0LDMsMTYsMCwwLDY2LDAsOTYsMjYsNjQsCisJMCwwLDAsMCwyNTUsMjU1LDI3LDYwLDI1NCwwLDEyMyw1NSwKKwkwLDAsMCwwLDM2LDIwOCw5MSwzLDAsMCwwLDAsCisJMCw5NiwxNTQsNjQsMCwwLDAsMCwwLDExMiwyNiw2NCwKKwkwLDAsMCwwLDE2LDAsMCw2NiwwLDAsMCwwLAorCTgsMCw2NCwzLDAsMCwwLDAsMjU1LDI1NSw4LDM2LAorCTEzMywyNTUsMCwxNywwLDAsMCwwLDEsMCw4LDM3LAorCTEzMCwyNTUsMCwyMSwwLDAsMCwwLDI1NSwyNTUsOCwzNiwKKwkzMyw4LDAsMSwxMjYsMjU1LDQwLDIwLDAsMCwwLDAsCisJMSwwLDMzLDM2LDEyMywyNTUsMzIsMjAsMCwwLDAsMCwKKwkyNTUsMjU1LDIsMzYsMTIwLDI1NSw3MiwyMCwwLDAsMCwwLAorCTEsMCw2NiwzNiwxMTcsMjU1LDY0LDIwLDAsMCwwLDAsCisJMjU1LDI1NSwzLDM2LDExNCwyNTUsMTA0LDIwLDAsMCwwLDAsCisJMSwwLDk5LDM2LDExMSwyNTUsOTYsMjAsMCwwLDAsMCwKKwkyNTUsMjU1LDQsMzYsMTA4LDI1NSwxMzYsMjAsMCwwLDAsMCwKKwkxLDAsMTMyLDM2LDEwNSwyNTUsMTI4LDIwLDAsMCwwLDAsCisJMjU1LDI1NSw1LDM2LDEwMiwyNTUsMTY4LDIwLDAsMCwwLDAsCisJMSwwLDE2NSwzNiw5OSwyNTUsMTYwLDIwLDAsMCwwLDAsCisJMjU1LDI1NSw2LDM2LDk2LDI1NSwyMDAsMjAsMCwwLDAsMCwKKwkxLDAsMTk4LDM2LDkzLDI1NSwxOTIsMjAsMCwwLDAsMCwKKwkyNTUsMjU1LDcsMzYsOTAsMjU1LDIzMiwyMCwwLDAsMCwwLAorCTEsMCwyMzEsMzYsODcsMjU1LDIyNCwyMCwwLDAsMCwwLAorCTI1NSwyNTUsOSwzNiw4NCwyNTUsNDAsMjEsMCwwLDAsMCwKKwkxLDAsNDEsMzcsODEsMjU1LDMyLDIxLDAsMCwwLDAsCisJMjU1LDI1NSwxMCwzNiw3OCwyNTUsNzIsMjEsMCwwLDAsMCwKKwkxLDAsNzQsMzcsNzUsMjU1LDY0LDIxLDAsMCwwLDAsCisJMjU1LDI1NSwxMSwzNiw3MiwyNTUsMTA0LDIxLDAsMCwwLDAsCisJMSwwLDEwNywzNyw2OSwyNTUsOTYsMjEsMCwwLDAsMCwKKwkyNTUsMjU1LDEyLDM2LDY2LDI1NSwxMzYsMjEsMCwwLDAsMCwKKwkxLDAsMTQwLDM3LDYzLDI1NSwxMjgsMjEsMCwwLDAsMCwKKwkyNTUsMjU1LDEzLDM2LDYwLDI1NSwxNjgsMjEsMCwwLDAsMCwKKwkxLDAsMTczLDM3LDU3LDI1NSwxNjAsMjEsMCwwLDAsMCwKKwkyNTUsMjU1LDE0LDM2LDU0LDI1NSwyMDAsMjEsMCwwLDAsMCwKKwkxLDAsMjA2LDM3LDUxLDI1NSwxOTIsMjEsMCwwLDAsMCwKKwkyNTUsMjU1LDE1LDM2LDQ4LDI1NSwyMzIsMjEsMCwwLDAsMCwKKwkxLDAsMjM5LDM3LDQ1LDI1NSwyMjQsMjEsMCwwLDAsMCwKKwkyNTUsMjU1LDI0LDM2LDQyLDI1NSw4LDIzLDAsMCwwLDAsCisJMSwwLDI0LDM5LDM5LDI1NSwwLDIzLDAsMCwwLDAsCisJMjU1LDI1NSwxNiwzNiwzNiwyNTUsOCwyMiwwLDAsMCwwLAorCTEsMCwxNiwzOCwzMywyNTUsMCwyMiwwLDAsMCwwLAorCTI1NSwyNTUsMTcsMzYsMzAsMjU1LDQwLDIyLDAsMCwwLDAsCisJMSwwLDQ5LDM4LDI3LDI1NSwzMiwyMiwwLDAsMCwwLAorCTI1NSwyNTUsMTgsMzYsMjQsMjU1LDcyLDIyLDAsMCwwLDAsCisJMSwwLDgyLDM4LDIxLDI1NSw2NCwyMiwwLDAsMCwwLAorCTI1NSwyNTUsMTksMzYsMTgsMjU1LDEwNCwyMiwwLDAsMCwwLAorCTEsMCwxMTUsMzgsMTUsMjU1LDk2LDIyLDAsMCwwLDAsCisJMjU1LDI1NSwyMCwzNiwxMiwyNTUsMTM2LDIyLDAsMCwwLDAsCisJMSwwLDE0OCwzOCw5LDI1NSwxMjgsMjIsMCwwLDAsMCwKKwkyNTUsMjU1LDIxLDM2LDYsMjU1LDE2OCwyMiwwLDAsMCwwLAorCTEsMCwxODEsMzgsMywyNTUsMTYwLDIyLDAsMCwwLDAsCisJMjU1LDI1NSwyMiwzNiwwLDI1NSwyMDAsMjIsMCwwLDAsMCwKKwkxLDAsMjE0LDM4LDI1MywyNTQsMTkyLDIyLDAsMCwwLDAsCisJMjU1LDI1NSwyMywzNiwyNTAsMjU0LDIzMiwyMiwwLDAsMCwwLAorCTEsMCwyNDcsMzgsMjQ3LDI1NCwyMjQsMjIsMCwwLDAsMCwKKwkyNTUsMjU1LDI2LDM2LDI0NCwyNTQsNzIsMjMsMCwwLDAsMCwKKwkxLDAsOTAsMzksMjQxLDI1NCw2NCwyMywwLDAsMCwwLAorCTI1NSwyNTUsMjcsMzYsMjM4LDI1NCwxMDQsMjMsMCwwLDAsMCwKKwkxLDAsMTIzLDM5LDIzNSwyNTQsOTYsMjMsMCwwLDAsMCwKKwkyNTUsMjU1LDI4LDM2LDIzMiwyNTQsMTM2LDIzLDAsMCwwLDAsCisJMSwwLDE1NiwzOSwyMjksMjU0LDEyOCwyMywwLDAsMCwwLAorCTI1NSwyNTUsMjksMzYsMjI2LDI1NCwxNjgsMjMsMCwwLDAsMCwKKwkxLDAsMTg5LDM5LDIyMywyNTQsMTYwLDIzLDAsMCwwLDAsCisJMjU1LDI1NSwzMCwzNiwyMjAsMjU0LDIwMCwyMywwLDAsMCwwLAorCTEsMCwyMjIsMzksMjE3LDI1NCwxOTIsMjMsMCwwLDAsMCwKKwkyNTUsMjU1LDMxLDM2LDIxNCwyNTQsMjMyLDIzLDAsMCwwLDAsCisJMSwwLDI1NSwzOSwyMTEsMjU0LDIyNCwyMywwLDAsMCwwLAorCTAsMTMxLDI0LDYwLDAsMSwyNCwzOSwwLDMyLDEsNjAsCisJMzcsMTkyLDEsMywwLDk2LDgsNjQsMCwwLDAsMCwKKwkxLDAsMSw2MCwzNyw2NCwxLDEsMCw5NiwxMzYsNjQsCisJMzMsMTYsMCwwLDE2NSwxNjUsMyw2MCwxNjUsMTY1LDk5LDUyLAorCTAsMTI4LDEsNjAsMCwwLDM1LDE3MiwwLDEyOCw5LDYwLAorCTAsMCw0MSwxNDEsMCwwLDAsMCwwLDk2LDEwLDY0LAorCTAsMCwwLDAsOCwwLDEsNjAsMzYsODAsNjUsMSwKKwkyOSwwLDY0LDIxLDAsMCwwLDAsMjcsMCwxMDUsMjAsCisJMCwwLDAsMCwwLDEsMiwzNiwwLDEyOCwxLDYwLAorCTMzLDgsMzQsMCwwLDAsMzIsMTcyLDY0LDE2LDIsMCwKKwkxLDAsMSw2MCwxLDAsMzMsNTIsNDMsOCw2NSwwLAorCTI0OCwyNTUsMzIsMjAsMCwwLDAsMCwyNTUsMjU1LDMsMzYsCisJMCwxMjgsMSw2MCwwLDAsMzUsMTcyLDAsMSwyLDM2LAorCTAsMTI4LDMsNjAsMzMsMjQsOTgsMCwwLDAsOTksMTQwLAorCTAsMCwwLDAsNywwLDk2LDIwLDAsMCwwLDAsCisJNjQsMTYsMiwwLDEsMCwxLDYwLDEsMCwzMyw1MiwKKwk0Myw4LDY1LDAsMjQ1LDI1NSwzMiwyMCwwLDAsMCwwLAorCTAsOTYsMTI4LDY0LDAsMCwwLDAsODQsMCwyLDE3NSwKKwkwLDk2LDgsNjQsMCwwLDAsMCwzLDAsMSw2MCwKKwkzNyw2NCwxLDEsMCw5NiwxMzYsNjQsMzMsMTYsMCwwLAorCTE2NSwxNjUsMyw2MCwxNjUsMTY1LDk5LDUyLDAsMTI4LDEsNjAsCisJMCwwLDM1LDE3MiwwLDEyOCw5LDYwLDAsMCw0MSwxNDEsCisJMCwwLDAsMCwwLDk2LDEwLDY0LDAsMCwwLDAsCisJOCwwLDEsNjAsMzYsODAsNjUsMSwyOSwwLDY0LDIxLAorCTAsMCwwLDAsMjcsMCwxMDUsMjAsMCwwLDAsMCwKKwkwLDEsMiwzNiwwLDEyOCwxLDYwLDMzLDgsMzQsMCwKKwkwLDAsMzIsMTcyLDY0LDE2LDIsMCwxLDAsMSw2MCwKKwkxLDAsMzMsNTIsNDMsOCw2NSwwLDI0OCwyNTUsMzIsMjAsCisJMCwwLDAsMCwyNTUsMjU1LDMsMzYsMCwxMjgsMSw2MCwKKwkwLDAsMzUsMTcyLDAsMSwyLDM2LDAsMTI4LDMsNjAsCisJMzMsMjQsOTgsMCwwLDAsOTksMTQwLDAsMCwwLDAsCisJNywwLDk2LDIwLDAsMCwwLDAsNjQsMTYsMiwwLAorCTEsMCwxLDYwLDEsMCwzMyw1Miw0Myw4LDY1LDAsCisJMjQ1LDI1NSwzMiwyMCwwLDAsMCwwLDAsOTYsMTI4LDY0LAorCTAsMCwwLDAsODgsMCwyLDE3NSw4OCwwLDksMTQzLAorCTAsMCwwLDAsMTcsMCwzMiwxNywwLDAsMCwwLAorCTAsMCwwLDAsMywwLDIsNjAsMCwwLDAsMCwKKwkwLDk2LDEzMCw2NCwwLDEyOCw4LDYwLDM3LDcyLDQwLDEsCisJMCwwLDAsMTYxLDQsMCwwLDE2MSw4LDAsMCwxNjEsCisJMTIsMCwwLDE2MSwxNiwwLDAsMTYxLDIwLDAsMCwxNjEsCisJMjQsMCwwLDE2MSwzMiwwLDgsMzcsMjQ3LDI1NSw5LDIxLAorCTI1MiwyNTUsMCwxNjEsODQsMCw5LDE0MywwLDAsMCwwLAorCTE3LDAsMzIsMTcsMCwwLDAsMCwwLDAsMCwwLAorCTEsMCwyLDYwLDAsMCwwLDAsMCw5NiwxMzAsNjQsCisJMCwxMjgsOCw2MCwzNyw3Miw0MCwxLDAsMCwwLDE2MSwKKwk0LDAsMCwxNjEsOCwwLDAsMTYxLDEyLDAsMCwxNjEsCisJMTYsMCwwLDE2MSwyMCwwLDAsMTYxLDI0LDAsMCwxNjEsCisJMzIsMCw4LDM3LDI0NywyNTUsOSwyMSwyNTIsMjU1LDAsMTYxLAorCTMyLDAsOCw2MCwwLDk2LDEzNiw2NCwwLDEwNCwxMjgsNjQsCisJMCwxMzEsMiw2MCwxNTIsMjgsNjYsMzYsMjU1LDMxLDksNjAsCisJMjU1LDI1NSw0MSw1MywzNiwxNiw3MywwLDAsMTI4LDksNjAsCisJMzcsMTYsNzMsMCw4LDAsNjQsMCwwLDAsMCwwLAorCTIsMTMxLDgsNjAsMjI0LDIxMCw4LDM3LDI1MiwyNTUsMSwzNiwKKwkzNiw2NCwxLDEsMywxMzEsOSw2MCwxMjQsMTgsNDEsMzcsCisJMjUyLDI1NSwxLDM2LDM2LDcyLDMzLDEsMCwwLDEwLDM2LAorCTAsMCwxMCwxNzMsMjU0LDI1NSw5LDIxLDQsMCw4LDM3LAorCTMsMTMxLDgsNjAsMTI4LDE4LDgsMzcsMjUyLDI1NSwxLDM2LAorCTM2LDY0LDEsMSwzMSwxMzEsOSw2MCwyNTIsMjU1LDQxLDUzLAorCTI1MiwyNTUsMSwzNiwzNiw3MiwzMywxLDIzNywyNTQsMTAsNjAsCisJMTc1LDIyMiw3NCw1MywwLDAsMTAsMTczLDI1NCwyNTUsOSwyMSwKKwk0LDAsOCwzNywyLDEzMSw4LDYwLDAsMjEyLDgsMzcsCisJMjUyLDI1NSwxLDM2LDM2LDY0LDEsMSwyLDEzMSw5LDYwLAorCTI1MiwyMTksNDEsMzcsMjUyLDI1NSwxLDM2LDM2LDcyLDMzLDEsCisJMTczLDIyMiwxMCw2MCwyMzksMTkwLDc0LDUzLDAsMCwxMCwxNzMsCisJMjU0LDI1NSw5LDIxLDQsMCw4LDM3LDAsNCw4LDYwLAorCTAsMCwwLDAsMCwyNCwxMzYsNjQsMCwwLDAsMCwKKwkyLDEzMSwyOSw2MCwwLDIyMCwxODksMzksMCwwLDMwLDM2LAorCTIsMTMxLDI4LDYwLDUxLDgsMTkyLDEyLDE2LDc4LDE1NiwzOSwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkyMzIsMjU1LDE4OSwzOSwxNiwwLDE5MSwxNzUsOCwxMjgsMTMyLDM5LAorCTE1LDYzLDE5MiwxMiwwLDAsMCwwLDE2LDAsMTkxLDE0MywKKwkyNCwwLDE4OSwzOSw4LDAsMjI0LDMsMCwwLDAsMCwKKwkyMzIsMjU1LDE4OSwzOSwxNiwwLDE5MSwxNzUsMTIsMTI4LDEzMiwzOSwKKwkxNSw2MywxOTIsMTIsMCwwLDAsMCwxNiwwLDE5MSwxNDMsCisJMjQsMCwxODksMzksOCwwLDIyNCwzLDAsMCwwLDAsCisJMjMyLDI1NSwxODksMzksMTYsMCwxOTEsMTc1LDE2LDEyOCwxMzIsMzksCisJMTUsNjMsMTkyLDEyLDAsMCwwLDAsMTYsMCwxOTEsMTQzLAorCTI0LDAsMTg5LDM5LDgsMCwyMjQsMywwLDAsMCwwLAorCTIzMiwyNTUsMTg5LDM5LDE2LDAsMTkxLDE3NSwyMCwxMjgsMTMyLDM5LAorCTE1LDYzLDE5MiwxMiwwLDAsMCwwLDE2LDAsMTkxLDE0MywKKwkyNCwwLDE4OSwzOSw4LDAsMjI0LDMsMCwwLDAsMCwKKwkyMzIsMjU1LDE4OSwzOSwyNCwxMzMsMTMxLDE0Myw2LDAsMiwzNiwKKwkyMCwwLDE5MSwxNzUsNiwwLDk4LDIwLDE2LDAsMTc2LDE3NSwKKwk3LDE2MiwzLDYwLDIyOCwwLDk5LDUyLDEsMCwyLDM2LAorCTE4NCw3LDE5Miw4LDAsMCw5OCwxNzIsMCwxMjgsMTMwLDE1MSwKKwk1LDE2MiwxNiw2MCwwLDEsNjYsNTIsMTIwLDYzLDE5MiwxMiwKKwkwLDAsMiwxNjYsMCwxMjgsMTMwLDE1MSwwLDAsMCwwLAorCTI1NSwyNTQsNjYsNDgsMCwwLDIsMTY2LDIwLDAsMTkxLDE0MywKKwkxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLDI0LDAsMTg5LDM5LAorCTIzMiwyNTUsMTg5LDM5LDMzLDE2LDEyOCwwLDMsMCw2NCw0LAorCTE2LDAsMTkxLDE3NSwyNTQsMjU1LDIsNjAsMTkyLDI5LDY2LDUyLAorCTAsMTYzLDQsNjAsOTYsMSwxMzIsNTIsMCwxNjMsMSw2MCwKKwk5MiwxLDM0LDE3MiwwLDE2MywxLDYwLDEwNCwxLDM4LDE3MiwKKwkyMDQsNjMsMTkyLDEyLDgsMCw2LDM2LDIyOCw2MywxOTIsMTIsCisJMjU1LDI1NSw0LDM2LDIwNCw3LDE5Miw4LDAsMCwwLDAsCisJMTYsMCwxOTEsMTQzLDI0LDAsMTg5LDM5LDgsMCwyMjQsMywKKwkwLDAsMCwwLDIxNiwyNTUsMTg5LDM5LDEsMCw2LDM2LAorCTMsMTMxLDIsNjAsMTQzLDE4LDY2LDM2LDI0MCwyNTUsMywzNiwKKwkzNiwxNiw2NywwLDAsMTYzLDEsNjAsMTIwLDEsMzQsMTcyLAorCTAsMTYzLDIsNjAsMTIwLDEsNjYsMTQwLDMzLDU2LDAsMCwKKwkzMiwwLDE5MSwxNzUsMjgsMCwxNzcsMTc1LDI0LDAsMTc2LDE3NSwKKwkxNiwwLDE2MCwxNzUsMCwxNjMsMSw2MCwxMTYsMSwzNCwxNzIsCisJMCwxNjMsMyw2MCwxMTIsMSw5OSwxNDAsMCwxNjMsMiw2MCwKKwkxMTYsMSw2NiwxNDAsMCwxNjMsNCw2MCwxMTYsMSwxMzIsMTQwLAorCTM1LDEzNiw5OCwwLDg0LDY0LDE5MiwxMiwzMyw0MCwzMiwyLAorCTEzLDAsNjQsMTYsMCwwLDAsMCwxLDEzMSw0LDYwLAorCTk2LDEyNywxMzIsMzYsMjQsMTI4LDE0NCwzOSwzMyw0MCwwLDIsCisJMSwxMzEsNyw2MCwxMjgsMTI3LDIzMSwzNiwxNSw2MywxOTIsMTIsCisJMTQ4LDAsNiwzNiwxLDAsNCwzNiwzMyw0MCwwLDIsCisJMTg4LDcsMTkyLDEyLDE0OCwwLDYsMzYsMiwwLDMzLDYsCisJMzMsMTYsMzIsMiwzLDAsMzQsMzgsMTMxLDEzNiwyLDAsCisJMCwxNjMsMiw2MCwxMTYsMSw2NiwxNDAsMCwwLDAsMCwKKwk2LDAsMzIsMTgsMjM3LDI1NCwzLDYwLDE3NSwyMjIsOTksNTIsCisJMCwwLDY3LDE3MiwyNTUsMjU1LDQ5LDM4LDI1MywyNTUsMzIsMjIsCisJNCwwLDY2LDM2LDMyLDAsMTkxLDE0MywyOCwwLDE3NywxNDMsCisJMjQsMCwxNzYsMTQzLDgsMCwyMjQsMyw0MCwwLDE4OSwzOSwKKwkyMjQsMjU1LDE4OSwzOSwxNSwwLDEzMiwzNiwyNDAsMjU1LDMsMzYsCisJMjAsMCwxNzcsMTc1LDAsMTYzLDE3LDYwLDEyMCwxLDQ5LDE0MiwKKwkwLDE2MywyLDYwLDEyMCwxLDY2LDE0MCwzNiwzMiwxMzEsMCwKKwkzMywxNiw2OCwwLDAsMTYzLDEsNjAsMTIwLDEsMzQsMTcyLAorCTAsMTYzLDMsNjAsMTIwLDEsOTksMTQwLDAsMTYzLDIsNjAsCisJMTEyLDEsNjYsMTQwLDI0LDAsMTkxLDE3NSw0MywxNiw2NywwLAorCTEzLDAsNjQsMTYsMTYsMCwxNzYsMTc1LDEsMTMxLDQsNjAsCisJOTYsMTI3LDEzMiwzNiwyNCwxMjgsMTQ0LDM5LDMzLDQwLDAsMiwKKwkxLDEzMSw3LDYwLDE3NiwxMjcsMjMxLDM2LDE1LDYzLDE5MiwxMiwKKwkxNzEsMCw2LDM2LDEsMCw0LDM2LDMzLDQwLDAsMiwKKwkxODgsNywxOTIsMTIsMTcxLDAsNiwzNiwzMywxNiwzMiwyLAorCTI0LDAsMTkxLDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywzMiwwLDE4OSwzOSwyMTYsMjU1LDE4OSwzOSwKKwkzLDAsMiw2MCw3LDE2MiwzLDYwLDM2LDAsMTkxLDE3NSwKKwkzMiwwLDE3NiwxNzUsMCwxNjMsMSw2MCw5MiwxLDMyLDE3MiwKKwkwLDAsOTksMTQwLDc5LDE3LDY2LDUyLDMyLDAsOTgsMjAsCisJODcsMCw0LDYwLDc2LDAsOCw2MCw2NCw3NSw4LDUzLAorCTI1MCwyLDcsNjAsMTI4LDI0MCwyMzEsNTIsNywxNjIsNiw2MCwKKwkxNTIsMCwxOTgsNTIsNjcsNzMsMyw2MCw2NywzLDk5LDUyLAorCTcsMTYyLDQsNjAsNDgsMSwxMzIsNTIsNywxNjIsNSw2MCwKKwkwLDEsMTY1LDUyLDYsMCwyLDM2LDI0LDEzMywxMzAsMTc1LAorCTAsMTYzLDEsNjAsMjA0LDUsMzQsMTcyLDQsMCwyLDM2LAorCTUwLDEzMywxMzAsMTY3LDIsMCwyLDM2LDQ4LDEzMywxMzAsMTY3LAorCTEsMCwyLDM2LDIwLDEzMywxMzAsMTY3LDExOSwxMTksMiwzNiwKKwkyOCwxMzMsMTM2LDE3NSwxNiwxMzMsMTM1LDE3NSwwLDAsMTk1LDE3MiwKKwkwLDAsMTMwLDE3Miw2NywxLDIsMzYsMCwwLDE2MiwxNzIsCisJMTA5LDgsMTkyLDgsMzEsMTMxLDQsNjAsMjQwLDE4OCwxMzIsNTIsCisJMTg5LDIsMyw2MCwxMjgsMjMxLDk5LDUyLDQsMCwyLDM2LAorCTI0LDEzMywxMzAsMTc1LDAsMTYzLDEsNjAsMjA0LDUsMzQsMTcyLAorCTAsOCwyLDM2LDUwLDEzMywxMzAsMTY3LDAsNCwyLDM2LAorCTQ4LDEzMywxMzAsMTY3LDAsMiwyLDM2LDIwLDEzMywxMzAsMTY3LAorCTI4LDEzMywxMzIsMTc1LDE2LDEzMywxMzEsMTc1LDMxLDEzMSw0LDYwLAorCTAsMjQwLDEzMiw1MiwyNCwxMzMsMTMxLDE0MywwLDEzMSwyLDYwLAorCTAsMTYzLDEsNjAsMTA4LDEsMzQsMTcyLDAsMTYzLDEsNjAsCisJMTEyLDEsMzYsMTcyLDEsMCw5OSwzNiwzMiwxMzMsMTMxLDE3NSwKKwkyMTAsNywxOTIsMTIsMCwwLDAsMCwwLDE2MywyLDYwLAorCTEzMiwxLDY2LDE0MCwwLDEyOCwxMjgsMTY3LDIsMCw2NCwyMCwKKwk4NSwwLDIsMzYsMCwxMjgsMTMwLDE2NywwLDE2MywyLDYwLAorCTEzNiwxLDY2LDE0MCwwLDAsMCwwLDUsMCw2NCwyMCwKKwkwLDAsMCwwLDAsMTI4LDEzMCwxNTEsMCwwLDAsMCwKKwkxNzAsMCw2Niw1MiwwLDEyOCwxMzAsMTY3LDAsMTI4LDEzMSwxNTEsCisJNSwxNjIsMiw2MCwwLDAsNjcsMTY0LDE4OCw2NCwxOTIsMTIsCisJMSwwLDE2LDM2LDIsMTMxLDQsNjAsMCwyMjAsMTMyLDM2LAorCTIsMTMxLDUsNjAsMCwyMjQsMTY1LDM2LDIsMTMxLDYsNjAsCisJMCwyMjYsMTk4LDM2LDgsMCw3LDM2LDIsMTMxLDIsNjAsCisJMTEyLDE1NCw2NiwzNiwxNiwwLDE2MiwxNzUsMiwxMzEsMiw2MCwKKwkxNDQsMTU0LDY2LDM2LDIwLDAsMTYyLDE3NSwyLDEzMSwyLDYwLAorCTE3NiwxNTQsNjYsMzYsMjQsMCwxNjIsMTc1LDAsMTMxLDIsNjAsCisJMzYsMzAsNjYsMzYsMCwxNjMsMSw2MCw5MiwxLDQ4LDE3MiwKKwkyNDAsNjQsMTkyLDEyLDI4LDAsMTYyLDE3NSwwLDE2MywzLDYwLAorCTEyNCwxLDk5LDE0MCw0MCwxMzMsMTI4LDE3NSwyLDAsOTgsNDAsCisJNywwLDY0LDE2LDIsMCwyLDM2LDE4LDAsOTcsNCwKKwkyNTUsMjU1LDIsMzYsNywwLDk4LDE2LDAsMCwwLDAsCisJMTk2LDgsMTkyLDgsMCwwLDAsMCwxNiwwLDk4LDE2LAorCTAsMCwwLDAsMTk2LDgsMTkyLDgsMCwwLDAsMCwKKwkyNCwxMzMsMTMzLDE0MywxLDEzMSw0LDYwLDE1LDYzLDE5MiwxMiwKKwkyMDgsMTI3LDEzMiwzNiwwLDE2MywxLDYwLDExMiwyNSwxOTIsMTIsCisJMTI0LDEsMzIsMTcyLDIwNyw4LDE5Miw4LDAsMCwwLDAsCisJMjExLDgsMTkyLDEyLDAsMCwwLDAsMjA3LDgsMTkyLDgsCisJMCwwLDAsMCw0MCwxMzMsMTQ0LDE3NSwzMSwxMCwxOTIsMTIsCisJMCwwLDAsMCwyMDcsOCwxOTIsOCwwLDAsMCwwLAorCTEsMTMxLDQsNjAsOTYsMTI3LDEzMiwzNiwyNCwxMjgsMTQ0LDM5LAorCTMzLDQwLDAsMiwzMiwxMjgsMTM1LDM5LDE1LDYzLDE5MiwxMiwKKwk1OCwxLDYsMzYsMSwwLDQsMzYsMzMsNDAsMCwyLAorCTE4OCw3LDE5MiwxMiw1OCwxLDYsMzYsMzYsMCwxOTEsMTQzLAorCTMyLDAsMTc2LDE0Myw4LDAsMjI0LDMsNDAsMCwxODksMzksCisJMTkyLDI1NSwxODksMzksNTYsMCwxOTEsMTc1LDUyLDAsMTgxLDE3NSwKKwk0OCwwLDE4MCwxNzUsNDQsMCwxNzksMTc1LDQwLDAsMTc4LDE3NSwKKwkzNiwwLDE3NywxNzUsMTgwLDEwLDE5MiwxMiwzMiwwLDE3NiwxNzUsCisJMzMsMzIsMCwwLDIsMCwyLDM2LDAsMTYzLDEsNjAsCisJMjQ0LDU3LDE5MiwxMiw5MiwxLDM0LDE3MiwzLDAsMiwzNiwKKwkwLDE2MywxLDYwLDAsMTIsMTkyLDEyLDkyLDEsMzQsMTcyLAorCTEsMCw0LDM2LDQsMCwyLDM2LDAsMTYzLDEsNjAsCisJMzQsMTEsMTkyLDEyLDkyLDEsMzQsMTcyLDUsMCwyLDM2LAorCTAsMTYzLDEsNjAsOTIsMSwzNCwxNzIsMCwxNjMsMTksNjAsCisJMTI0LDEsMTE1LDE0MiwwLDE2MywzLDYwLDE2MCwxLDk5LDE0MCwKKwkxLDAsOTgsNDYsODAsMTMzLDEzMCwxNzUsMCwxMjgsMiw2MCwKKwk1LDAsOTgsMjAsMCwwLDAsMCwzMiwxMzMsMTMwLDE0MywKKwkwLDAsMCwwLDI1Miw4LDE5Miw4LDI1NSwyNTUsNjYsMzYsCisJMzIsMTMzLDEzMCwxNDMsMCwwLDAsMCw4NCwxMzMsMTMwLDE3NSwKKwkxMzAsMTEsMTkyLDEyLDAsMCwwLDAsMzMsMzIsNjQsMCwKKwkyLDAsNSwzNiwyMzIsMyw2LDM2LDAsMTMxLDcsNjAsCisJMTk2LDM3LDIzMSwzNiwxNTYsMTEsMTkyLDEyLDE2LDAsMTYwLDE3NSwKKwkzNSwzNSwxOTIsMTIsMCwwLDAsMCw2LDAsMiwzNiwKKwkwLDE2MywxLDYwLDg0LDM1LDE5MiwxMiw5MiwxLDM0LDE3MiwKKwk3LDAsMiwzNiwwLDE2MywxLDYwLDE0MSw0NywxOTIsMTIsCisJOTIsMSwzNCwxNzIsOCwwLDIsMzYsMCwxNjMsMSw2MCwKKwkxMjAsNTAsMTkyLDEyLDkyLDEsMzQsMTcyLDksMCwyLDM2LAorCTAsMTYzLDEsNjAsOTIsMSwzNCwxNzIsMCwxNjMsMiw2MCwKKwkyNDAsNSw2NiwxNDAsMCwwLDAsMCw4LDAsNjQsMTYsCisJMTAsMCwyLDM2LDAsMTYzLDQsNjAsMjQwLDUsMTMyLDE0MCwKKwkxMyw4LDE5MiwxMiwwLDAsMCwwLDAsMTYzLDEsNjAsCisJMjQ0LDUsMzQsMTcyLDEwLDAsMiwzNiwwLDE2MywxLDYwLAorCTkyLDEsMzQsMTcyLDE1NywxNSwxOTIsMTIsMSwwLDIxLDM2LAorCTIsMTMxLDIsNjAsMTkyLDI0Niw2NiwzNiwzMywxNjAsNjQsMCwKKwk4MCwxMzMsMTMxLDE0MywxMSwwLDIsMzYsMCwxNjMsMSw2MCwKKwk5MiwxLDM0LDE3MiwxMDAsMCwyLDM2LDAsMTYzLDEsNjAsCisJOTIsMSwzNCwxNzIsODQsMTMzLDEzMCwxNDMsNjQsMjYsMywwLAorCTMzLDEzNiwxMTYsMCw2NCwxOCwyLDAsMzMsMTQ0LDg0LDAsCisJMCwxNjMsMiw2MCw4LDEsNjYsMTQwLDAsMCwwLDAsCisJMSwwLDY2LDM2LDAsMTYzLDEsNjAsOCwxLDM0LDE3MiwKKwkwLDE2MywyLDYwLDgsMSw2NiwxNDAsMCwxNjMsMiw2MCwKKwkxMjQsMSw2NiwxNDAsMCwwLDAsMCwxNCwwLDgzLDE2LAorCTAsMCwwLDAsNCwwLDY0LDE2LDMzLDE1Miw2NCwwLAorCTgwLDEzMywxMjgsMTc1LDc2LDksMTkyLDgsMCwwLDAsMCwKKwk4MCwxMzMsMTQ5LDE3NSwyLDEzMSw0LDYwLDE2MywyMywxOTIsMTIsCisJMTkyLDI0NiwxMzIsMzYsODAsMTMzLDEzMCwxNDMsMCwwLDAsMCwKKwk2NCwxOCwyLDAsMzMsMTM2LDg0LDAsMCwxNjMsMiw2MCwKKwkwLDYsNjYsMTQwLDAsMCwwLDAsMywwLDY0LDI0LAorCTMzLDEyOCwzMiwyLDIzOSwxNSwxOTIsMTIsMCwwLDAsMCwKKwk0MywxNiwxOCwyLDExLDAsNjQsMTYsMzMsMzIsMCwyLAorCTE1MSwxOCwxOTIsMTIsMTAsMCw1LDM2LDI3LDIyLDE5MiwxMiwKKwkzMywzMiwwLDIsMTQyLDIyLDE5MiwxMiwzMywzMiwwLDIsCisJMCwyLDE2LDM4LDQzLDE2LDE4LDIsMjQ3LDI1NSw2NCwyMCwKKwkzMywzMiwwLDIsMTg0LDExLDE5MiwxMiwwLDAsMCwwLAorCTU0LDksMTkyLDgsMCwwLDAsMCw1NiwwLDE5MSwxNDMsCisJNTIsMCwxODEsMTQzLDQ4LDAsMTgwLDE0Myw0NCwwLDE3OSwxNDMsCisJNDAsMCwxNzgsMTQzLDM2LDAsMTc3LDE0MywzMiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDY0LDAsMTg5LDM5LDQsMTI4LDEzMCwxNDMsCisJMjMyLDI1NSwxODksMzksMjAsMCwxOTEsMTc1LDE2LDAsMTc2LDE3NSwKKwkxLDAsNjcsMzYsNCwxMjgsMTMxLDE3NSwyNTUsMjU1LDMsMzYsCisJNCwwLDY3LDIwLDI1NSwzMSw0LDYwLDAsMTYzLDEsNjAsCisJOCwxLDMyLDE3MiwyNTUsMzEsNCw2MCwyNTUsMjU1LDEzMiw1MiwKKwkwLDE2MywxNiw2MCwwLDE2MywyLDYwLDgsMSw2NiwxNDAsCisJMjA4LDEzMiwxMzEsMTQzLDIyMCw1LDE2LDU0LDM1LDE2LDY3LDAsCisJMCwxNjMsMSw2MCwxNiwxLDM0LDE3MiwyLDEzMSwyLDYwLAorCTE5MiwyNDYsNjYsMzYsMzYsMTYsNjgsMCwwLDE2MCwzLDYwLAorCTM3LDE2LDY3LDAsMCwxNjMsMyw2MCw4LDEsOTksMTQwLAorCTI4LDAsNjgsMTQwLDAsMCw1LDE0MiwzLDEzMSwyLDYwLAorCTIwLDE4LDY2LDE0MCwyMDgsMTMyLDEzMSwxNzUsMzYsMTMzLDEzMiwxNzUsCisJMTgsMCwxNjIsMTYsMCwxNjMsNCw2MCw5OSw1OSwxOTIsMTIsCisJMjIwLDUsMTMyLDUyLDI1NSwwLDUsNjAsMjU1LDAsMTY1LDUyLAorCTAsMjU1LDYsNjAsMCwwLDQsMTQyLDAsMjU1LDE5OCw1MiwKKwkwLDIwLDQsMCwyLDI4LDQsMCwzNywxNiw2NywwLAorCTIsMjYsMiwwLDM2LDI0LDEwMSwwLDAsMTgsMiwwLAorCTM2LDE2LDcwLDAsMzcsMjQsOTgsMCwxNzYsMTMzLDEzMiwxNzUsCisJMTg0LDEzMywxMzEsMTc1LDAsMTYzLDE2LDYwLDE2LDYsMTYsNTQsCisJMCwwLDMsMTQyLDMsMTMxLDIsNjAsNjgsMTgsNjYsMTQwLAorCTAsMCwwLDAsMTgsMCw5OCwxNiwwLDE2Myw0LDYwLAorCTExOSw1OSwxOTIsMTIsMTYsNiwxMzIsNTIsMjU1LDAsNSw2MCwKKwkyNTUsMCwxNjUsNTIsMCwyNTUsNiw2MCwwLDAsNCwxNDIsCisJMCwyNTUsMTk4LDUyLDAsMjAsNCwwLDIsMjgsNCwwLAorCTM3LDE2LDY3LDAsMiwyNiwyLDAsMzYsMjQsMTAxLDAsCisJMCwxOCwyLDAsMzYsMTYsNzAsMCwzNywyNCw5OCwwLAorCTE5NiwxMzMsMTMyLDE3NSwxOTIsMTMzLDEzMSwxNzUsMCwxNjMsMTYsNjAsCisJMjI0LDUsMTYsNTQsMCwwLDMsMTQyLDMsMTMxLDIsNjAsCisJMjQsMTgsNjYsMTQwLDAsMCwwLDAsMTgsMCw5OCwxNiwKKwkwLDE2Myw0LDYwLDEzOSw1OSwxOTIsMTIsMjI0LDUsMTMyLDUyLAorCTI1NSwwLDUsNjAsMjU1LDAsMTY1LDUyLDAsMjU1LDYsNjAsCisJMCwwLDQsMTQyLDAsMjU1LDE5OCw1MiwwLDIwLDQsMCwKKwkyLDI4LDQsMCwzNywxNiw2NywwLDIsMjYsMiwwLAorCTM2LDI0LDEwMSwwLDAsMTgsMiwwLDM2LDE2LDcwLDAsCisJMzcsMjQsOTgsMCwxODgsMTMzLDEzMiwxNzUsMTgwLDEzMywxMzEsMTc1LAorCTQ0LDEzMywxMzEsMTQzLDAsMTYzLDIsNjAsMTQ0LDEsNjYsMTQwLAorCTAsMCwwLDAsNSwwLDk4LDE2LDAsMCwwLDAsCisJMCwxNjMsNCw2MCwxNDQsMSwxMzIsMTQwLDE1OSw1OSwxOTIsMTIsCisJMCwwLDAsMCwwLDE2MywzLDYwLDE0MCwxLDk5LDE0MCwKKwkzLDEzMSwyLDYwLDY0LDE4LDY2LDE0MCwwLDAsMCwwLAorCTUsMCw5OCwxNiwwLDAsMCwwLDAsMTYzLDQsNjAsCisJMTQwLDEsMTMyLDE0MCw1MSw2MCwxOTIsMTIsMCwwLDAsMCwKKwk0NCwxMzMsMTMwLDE0MywwLDAsMCwwLDMsMCw2NCwxNiwKKwkwLDAsMCwwLDExNiwzOCwxOTIsMTIsMCwwLDAsMCwKKwkxNjQsNywxOTIsMTIsMCwwLDAsMCwzNiwxMjgsMTMwLDE0MywKKwkwLDAsMCwwLDEsMCw2NiwzNiwzNiwxMjgsMTMwLDE3NSwKKwk2MCwwLDY2LDQwLDgsMCw2NCwyMCwwLDAsMCwwLAorCTMsMTMxLDIsNjAsMjQsMTgsNjYsMTQwLDM2LDEyOCwxMjgsMTc1LAorCTMsMCw2NCwxNiwwLDAsMCwwLDIyMiw0OCwxOTIsMTIsCisJMCwwLDAsMCwwLDE2MywyLDYwLDQ4LDEsNjYsMTQwLAorCTAsMCwwLDAsMjAsMCw2NCwxNiwwLDAsMCwwLAorCTAsMTYzLDEsNjAsNDgsMSwzMiwxNzIsMCwxNjMsMSw2MCwKKwkxNiwxLDMyLDE3MiwwLDE2MywxLDYwLDIwLDEsMzIsMTcyLAorCTAsMTYzLDEsNjAsMjQsMSwzMiwxNzIsMCwxNjMsMSw2MCwKKwkyOCwxLDMyLDE3MiwwLDE2MywxLDYwLDMyLDEsMzIsMTcyLAorCTAsMTYzLDEsNjAsMzYsMSwzMiwxNzIsMCwxNjMsMSw2MCwKKwk0MCwxLDMyLDE3MiwwLDE2MywxLDYwLDIwMSwxMywxOTIsMTIsCisJNDQsMSwzMiwxNzIsMjAsMCwxOTEsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsMjQsMCwxODksMzksMjE2LDI1NSwxODksMzksCisJMzYsMCwxOTEsMTc1LDMyLDAsMTc4LDE3NSwyOCwwLDE3NywxNzUsCisJMTgwLDEwLDE5MiwxMiwyNCwwLDE3NiwxNzUsMzMsMzIsMCwwLAorCTIsMCwyLDM2LDAsMTYzLDEsNjAsMjQ0LDU3LDE5MiwxMiwKKwk5MiwxLDM0LDE3MiwzLDAsMiwzNiwwLDE2MywxLDYwLAorCTAsMTIsMTkyLDEyLDkyLDEsMzQsMTcyLDEsMCw0LDM2LAorCTQsMCwyLDM2LDAsMTYzLDEsNjAsMzQsMTEsMTkyLDEyLAorCTkyLDEsMzQsMTcyLDMyLDEzMywxMzEsMTQzLDUsMCwyLDM2LAorCTAsMTYzLDEsNjAsOTIsMSwzNCwxNzIsODAsMTMzLDEyOCwxNzUsCisJODQsMTMzLDEzMSwxNzUsMTMwLDExLDE5MiwxMiwwLDAsMCwwLAorCTMzLDMyLDY0LDAsMiwwLDUsMzYsMjMyLDMsNiwzNiwKKwkwLDEzMSw3LDYwLDE5NiwzNywyMzEsMzYsMTU2LDExLDE5MiwxMiwKKwkxNiwwLDE2MCwxNzUsMCwxNjMsMiw2MCwyNDAsNSw2NiwxNDAsCisJMCwwLDAsMCw4LDAsNjQsMTYsMTAsMCwyLDM2LAorCTAsMTYzLDQsNjAsMjQwLDUsMTMyLDE0MCwxMyw4LDE5MiwxMiwKKwkwLDAsMCwwLDAsMTYzLDEsNjAsMjQ0LDUsMzQsMTcyLAorCTEwLDAsMiwzNiwwLDE2MywxLDYwLDkyLDEsMzQsMTcyLAorCTEwMCwwLDIsMzYsODAsMTMzLDEzMSwxNDMsMiwxMzEsNCw2MCwKKwkxOTIsMjQ2LDEzMiwzNiwwLDE2MywxLDYwLDkyLDEsMzQsMTcyLAorCTg0LDEzMywxMzAsMTQzLDY0LDI2LDMsMCwzMywxNDQsMTAwLDAsCisJNjQsMTgsMiwwLDMzLDEzNiw2OCwwLDAsMTYzLDIsNjAsCisJOCwxLDY2LDE0MCwzMywxMjgsNjQsMiwxLDAsNjYsMzYsCisJMCwxNjMsMSw2MCw4LDEsMzQsMTcyLDAsMTYzLDIsNjAsCisJOCwxLDY2LDE0MCw0MywxNiwxNywyLDExLDAsNjQsMTYsCisJMzMsMzIsMCwyLDE1MSwxOCwxOTIsMTIsMTAsMCw1LDM2LAorCTI3LDIyLDE5MiwxMiwzMywzMiwwLDIsMTQyLDIyLDE5MiwxMiwKKwkzMywzMiwwLDIsMCwyLDE2LDM4LDQzLDE2LDE3LDIsCisJMjQ3LDI1NSw2NCwyMCwzMywzMiwwLDIsMTg0LDExLDE5MiwxMiwKKwkwLDAsMCwwLDkxLDEwLDE5Miw4LDAsMCwwLDAsCisJMzYsMCwxOTEsMTQzLDMyLDAsMTc4LDE0MywyOCwwLDE3NywxNDMsCisJMjQsMCwxNzYsMTQzLDgsMCwyMjQsMyw0MCwwLDE4OSwzOSwKKwk0LDEyOCwxMzAsMTQzLDIzMiwyNTUsMTg5LDM5LDE2LDAsMTkxLDE3NSwKKwkxLDAsNjcsMzYsNCwxMjgsMTMxLDE3NSwyNTUsMjU1LDMsMzYsCisJNCwwLDY3LDIwLDI1NSwzMSw0LDYwLDAsMTYzLDEsNjAsCisJOCwxLDMyLDE3MiwyNTUsMzEsNCw2MCwwLDE2MywyLDYwLAorCTgsMSw2NiwxNDAsMjEyLDEzMiwxMzEsMTQzLDI1NSwyNTUsMTMyLDUyLAorCTM1LDE2LDY3LDAsMCwxNjMsMSw2MCwxNiwxLDM0LDE3MiwKKwkyLDEzMSwyLDYwLDE5MiwyNDYsNjYsMzYsMzYsMTYsNjgsMCwKKwkwLDE2MCwzLDYwLDM3LDE2LDY3LDAsMCwxNjMsMyw2MCwKKwk4LDEsOTksMTQwLDI4LDAsNjYsMTQwLDIxMiwxMzIsMTMxLDE3NSwKKwkzNiwxMzMsMTMwLDE3NSwxNjQsNywxOTIsMTIsMCwwLDAsMCwKKwkwLDE2MywyLDYwLDQ4LDEsNjYsMTQwLDAsMCwwLDAsCisJMjAsMCw2NCwxNiwwLDAsMCwwLDAsMTYzLDEsNjAsCisJNDgsMSwzMiwxNzIsMCwxNjMsMSw2MCwxNiwxLDMyLDE3MiwKKwkwLDE2MywxLDYwLDIwLDEsMzIsMTcyLDAsMTYzLDEsNjAsCisJMjQsMSwzMiwxNzIsMCwxNjMsMSw2MCwyOCwxLDMyLDE3MiwKKwkwLDE2MywxLDYwLDMyLDEsMzIsMTcyLDAsMTYzLDEsNjAsCisJMzYsMSwzMiwxNzIsMCwxNjMsMSw2MCw0MCwxLDMyLDE3MiwKKwkwLDE2MywxLDYwLDIwMSwxMywxOTIsMTIsNDQsMSwzMiwxNzIsCisJMTYsMCwxOTEsMTQzLDI0LDAsMTg5LDM5LDgsMCwyMjQsMywKKwkwLDAsMCwwLDIyNCwyNTUsMTg5LDM5LDI0LDAsMTkxLDE3NSwKKwkyMCwwLDE3NywxNzUsMTIwLDYzLDE5MiwxMiwxNiwwLDE3NiwxNzUsCisJNTIsMCwyLDM2LDQsMTYyLDEsNjAsMTIsMCwzNCwxNjAsCisJMTIwLDYzLDE5MiwxMiwyMzIsMywxNiwzNiwyOCwxMzMsMTMwLDE0MywKKwkwLDAsMCwwLDI3LDAsODAsMCwyLDAsMCwyMiwKKwkwLDAsMCwwLDEzLDAsNywwLDE4LDE2LDAsMCwKKwk0LDE2MiwxNyw2MCwxMjAsNjMsMTkyLDEyLDAsMCwzNCwxNjIsCisJMjgsMTMzLDEzMCwxNDMsMCwwLDAsMCwyNywwLDgwLDAsCisJMiwwLDAsMjIsMCwwLDAsMCwxMywwLDcsMCwKKwkxOCwxNiwwLDAsMzMsNDAsMCwwLDMzLDMyLDAsMCwKKwk2LDE2MiwzLDYwLDIsMTgsMiwwLDAsMCwzNCwxNjIsCisJMSwwLDIsMzYsMCwxNjMsMSw2MCw0LDEsMzIsMTcyLAorCTAsMCw5OCwxNzIsMiwxMzEsMSw2MCwzMyw4LDM2LDAsCisJOCwyNDUsMzIsMTcyLDEsMCwxNjUsMzYsMjIsMCwxNjIsNDQsCisJMjUwLDI1NSw2NCwyMCwyMCwwLDEzMiwzNiwzMSwxMzEsNCw2MCwKKwkwLDI0MCwxMzIsNTIsNTIsMTI4LDEzMSwxNDMsMSwwLDIsMzYsCisJNjgsMTMzLDEyOCwxNzUsNDgsMTI4LDEzMCwxNzUsNjQsMTMzLDEyOCwxNzUsCisJMzIsMTMxLDEsNjAsMjUyLDIzOSwzNiwxNzIsOCwwLDk2LDE2LAorCTMxLDEzMSw1LDYwLDI1MiwyMzksMTY1LDUyLDMxLDEzMSw2LDYwLAorCTEsMTMxLDQsNjAsMjI0LDEyNywxMzIsMzYsMTUsNjMsMTkyLDEyLAorCTAsMjQwLDE5OCw1Miw1MiwxMjgsMTI4LDE3NSwyNCwwLDE5MSwxNDMsCisJMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJMzIsMCwxODksMzksMjMyLDI1NSwxODksMzksMTYsMCwxNzYsMTc1LAorCTExNiwwLDIsMzYsMjAsMCwxOTEsMTc1LDQsMTYyLDEsNjAsCisJMTIsMCwzNCwxNjAsMTMwLDYzLDE5MiwxMiwzMywxMjgsMTI4LDAsCisJNCwxNjIsMSw2MCw0LDAsNDgsMTYwLDEzMCw2MywxOTIsMTIsCisJMywxMzAsMTYsMCw0LDE2MiwxLDYwLDEzMCw2MywxOTIsMTIsCisJNCwwLDQ4LDE2MCwyMCwwLDE5MSwxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywyNCwwLDE4OSwzOSwyMjQsMjU1LDE4OSwzOSwKKwk2NCwwLDIsMzYsMjQsMCwxOTEsMTc1LDIwLDAsMTc3LDE3NSwKKwkxNiwwLDE3NiwxNzUsNCwxNjIsMSw2MCwxMzAsNjMsMTkyLDEyLAorCTEyLDAsMzQsMTYwLDQsMTYyLDE3LDYwLDQsMCw0OSwxNDYsCisJMCwwLDAsMCwxMzAsNjMsMTkyLDEyLDI1NSwwLDQ5LDUwLAorCTQsMTYyLDE2LDYwLDQsMCwxNiwxNDYsMCwwLDAsMCwKKwkxMzAsNjMsMTkyLDEyLDI1NSwwLDE2LDUwLDAsMTMwLDE2LDAsCisJMzcsMTYsMTcsMiwyNCwwLDE5MSwxNDMsMjAsMCwxNzcsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMzIsMCwxODksMzksCisJNDgsMTI4LDEzMCwxNDMsMjMyLDI1NSwxODksMzksMTYsMCwxNzYsMTc1LAorCTMzLDEyOCwxMjgsMCwzLDAsNjQsMjAsMjAsMCwxOTEsMTc1LAorCTE4MCwxMCwxOTIsMTIsMCwwLDAsMCw1LDAsMCwxOCwKKwkwLDAsMCwwLDIzNiw2MywxOTIsMTIsMSw0LDQsMzYsCisJNTAsMTEsMTkyLDgsMCwwLDAsMCwyMjgsNjMsMTkyLDEyLAorCTAsNCw0LDM2LDIwLDAsMTkxLDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDI0LDAsMTg5LDM5LDIxNiwyNTUsMTg5LDM5LAorCTYsMTYyLDMsNjAsMSwwLDIsMzYsMzIsMCwxOTEsMTc1LAorCTI4LDAsMTc3LDE3NSwyNCwwLDE3NiwxNzUsMCwwLDk4LDE3MiwKKwkwLDE2MywyLDYwLDQsMSw2NiwxNDAsMzMsMTM2LDIyNCwwLAorCTEsMCw2NiwzNiwwLDE2MywxLDYwLDQsMSwzNCwxNzIsCisJNTYsMTI4LDEzMCwxNDMsMCwxNjMsMyw2MCw0LDEsOTksMTQwLAorCTEsMCw2NiwzNiw1NiwxMjgsMTMwLDE3NSwyMzIsMyw2Niw0MCwKKwkyMSwwLDY0LDIwLDI1NSwxMjcsMyw2MCw2OCwxMzMsMTMwLDE0MywKKwkyNTQsMjU1LDk5LDUyLDU2LDEyOCwxMjgsMTc1LDEsMCw2NiwzNiwKKwk0MywyNCw5OCwwLDY4LDEzMywxMzAsMTc1LDEzLDAsOTYsMTYsCisJMCwwLDAsMCwyLDEzMSw0LDYwLDI4LDEyOCwxMzIsMzYsCisJNjAsMTI4LDE0NCwzOSwzMyw0MCwwLDIsMiwxMzEsNyw2MCwKKwk2MCwxMjgsMjMxLDM2LDE1LDYzLDE5MiwxMiwxNDQsMCw2LDM2LAorCTEsMCw0LDM2LDMzLDQwLDAsMiwxODgsNywxOTIsMTIsCisJMTQ0LDAsNiwzNiw2NCwxMzMsMTM0LDE0MywwLDAsMCwwLAorCTE0LDAsMTkyLDI0LDMzLDI0LDAsMCwyLDEzMSw1LDYwLAorCTAsMjQ1LDE2NSwzNiwzMywzMiwwLDAsMiwxMzEsMiw2MCwKKwkzMywxNiw2OCwwLDAsMjQ1LDY2LDE0MCwyMCwwLDEzMiwzNiwKKwkxLDAsOTksMzYsMjU1LDI1NSw2NiwzNiwwLDAsMTYyLDE3MiwKKwk0MiwxNiwxMDIsMCwyNDcsMjU1LDY0LDIwLDIwLDAsMTY1LDM2LAorCTMxLDEzMSw0LDYwLDI1MiwyMzksMTMyLDUyLDMxLDEzMSwyLDYwLAorCTAsMCwxMzEsMTQwLDI1NSwyNTUsNjYsNTIsMCwwLDExMywxNzIsCisJNCwwLDk5LDM2LDQzLDE2LDY3LDAsMywwLDY0LDE2LAorCTAsMCwwLDAsMzEsMTMxLDMsNjAsMCwyNDAsOTksNTIsCisJMCwwLDEzMSwxNzIsMzIsMCwxOTEsMTQzLDI4LDAsMTc3LDE0MywKKwkyNCwwLDE3NiwxNDMsOCwwLDIyNCwzLDQwLDAsMTg5LDM5LAorCTY0LDEzMywxMzAsMTQzLDIzMiwyNTUsMTg5LDM5LDIwLDAsMTkxLDE3NSwKKwkyMiwwLDY2LDQwLDEzLDAsNjQsMjAsMTYsMCwxNzYsMTc1LAorCTIsMTMxLDQsNjAsMjgsMTI4LDEzMiwzNiw2MCwxMjgsMTQ0LDM5LAorCTMzLDQwLDAsMiwyLDEzMSw3LDYwLDg0LDEyOCwyMzEsMzYsCisJMTUsNjMsMTkyLDEyLDE3MywwLDYsMzYsMSwwLDQsMzYsCisJMzMsNDAsMCwyLDE4OCw3LDE5MiwxMiwxNzMsMCw2LDM2LAorCTY0LDEzMywxMzAsMTQzLDAsMCwwLDAsMSwwLDY3LDM2LAorCTY0LDEzMywxMzEsMTc1LDIwLDAsMTkxLDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDI0LDAsMTg5LDM5LDEyOCwxNiw0LDAsCisJMzMsMTYsNjgsMCwxNiwwLDE2MywxNDMsMTI4LDE2LDIsMCwKKwkyLDEzMSwxLDYwLDMzLDgsMzQsMCw0LDI0NSwzOCwxNzIsCisJMiwxMzEsMSw2MCwzMyw4LDM0LDAsMTIsMjQ1LDM5LDE3MiwKKwkyLDEzMSwxLDYwLDMzLDgsMzQsMCwwLDI0NSwzOCwxNzIsCisJMiwxMzEsMSw2MCwzMyw4LDM0LDAsOCwyNDUsMzcsMTcyLAorCTIsMTMxLDEsNjAsMzMsOCwzNCwwLDE2LDI0NSwzNSwxNzIsCisJOCwwLDIyNCwzLDMzLDE2LDAsMSwxMjgsMTYsNCwwLAorCTMzLDE2LDY4LDAsMTI4LDE2LDIsMCwyLDEzMSwxLDYwLAorCTMzLDgsMzQsMCw4LDAsMjI0LDMsOCwyNDUsMzIsMTcyLAorCTY0LDEzMywxMzAsMTQzLDE5MiwyNTUsMTg5LDM5LDQwLDAsMTgwLDE3NSwKKwkzMywxNjAsMCwwLDU2LDAsMTkxLDE3NSw1MiwwLDE4MywxNzUsCisJNDgsMCwxODIsMTc1LDQ0LDAsMTgxLDE3NSwzNiwwLDE3OSwxNzUsCisJMzIsMCwxNzgsMTc1LDI4LDAsMTc3LDE3NSw0OCwwLDY0LDI0LAorCTI0LDAsMTc2LDE3NSwxLDAsMjMsMzYsMiwwLDIyLDM2LAorCTIsMTMxLDE2LDYwLDEyLDI0NSwxNiwzOCw0LDAsMTksMzgsCisJMjQ0LDI1NSwxNywzOCwyNTIsMjU1LDE4LDM4LDMzLDE2OCwwLDAsCisJMCwwLDY3LDE0MiwwLDAsMCwwLDcsMCwxMTksMTYsCisJMiwwLDk4LDQwLDI1LDAsNjQsMjAsMCwwLDAsMCwKKwk5LDAsMTE4LDE2LDAsMCwwLDAsMjM2LDExLDE5Miw4LAorCTIwLDAsMTYsMzgsMCwwLDM0LDE0MiwwLDAsMCwwLAorCTE3LDAsNjQsMjgsMCwwLDAsMCwyMzAsMTEsMTkyLDgsCisJMCwwLDY0LDE3NCwwLDAsMzQsMTQyLDAsMCwwLDAsCisJMTEsMCw2NCwyOCwwLDAsMCwwLDIsMTMxLDIsNjAsCisJMzMsMTYsODUsMCw0LDI0NSw2NiwxNDAsMCwwLDAsMCwKKwkwLDAsMzQsMTc0LDAsMCwxMDAsMTQyLDAsMCwyLDE0MiwKKwkwLDAsMCwwLDksMjQ4LDY0LDAsMCwwLDAsMCwKKwkyMCwwLDE2LDM4LDIwLDAsMTE1LDM4LDIwLDAsNDksMzgsCisJMjAsMCw4MiwzOCw2NCwxMzMsMTMwLDE0MywxLDAsMTQ4LDM4LAorCTQyLDE2LDEzMCwyLDIxOCwyNTUsNjQsMjAsMjAsMCwxODEsMzgsCisJNTYsMCwxOTEsMTQzLDUyLDAsMTgzLDE0Myw0OCwwLDE4MiwxNDMsCisJNDQsMCwxODEsMTQzLDQwLDAsMTgwLDE0MywzNiwwLDE3OSwxNDMsCisJMzIsMCwxNzgsMTQzLDI4LDAsMTc3LDE0MywyNCwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDY0LDAsMTg5LDM5LDAsMCwwLDAsCisJMiwxMzEsMyw2MCwxOTIsMjQ2LDk5LDM2LDAsMiwyLDM2LAorCTAsMTYzLDEsNjAsMjAwLDUsMzUsMTcyLDAsMTYzLDEsNjAsCisJMjA4LDUsMzQsMTcyLDAsMTYzLDIsNjAsMTI0LDEsNjYsMTQwLAorCTIxNiwyNTUsMTg5LDM5LDE2LDAsMTc2LDE3NSwzMywxMjgsMCwwLAorCTI4LDAsMTc5LDE3NSwyNTUsMjU1LDE5LDM2LDI0LDAsMTc4LDE3NSwKKwkyMSwwLDExNCwzNiwyMCwwLDE3NywxNzUsMzIsMCwxOTEsMTc1LAorCTEsMCw2Niw0NCw4MCwxMzMsMTMwLDE3NSwxMzksMTQsMTkyLDEyLAorCTIwLDAsMTEzLDM2LDE4NCwyNCwxOTIsMTIsMCwwLDAsMCwKKwkyNyw2NywxOTIsMTIsMzMsMzIsMCwyLDYsMCw4MywyMCwKKwkxLDAsMTYsMzgsMiwxMzEsNCw2MCwxNSw2MywxOTIsMTIsCisJMTEyLDEyOCwxMzIsMzYsMTI2LDEyLDE5Miw4LDEsMCwyLDM2LAorCTAsMCwzNCwxNjIsMywxOCwyLDAsMCwwLDY2LDE2MiwKKwkyLDAsODIsMzgsMywwLDIsNDIsMjQxLDI1NSw2NCwyMCwKKwkyLDAsNDksMzgsMiwxMzEsMTcsNjAsMjEyLDI0Niw0OSwzOCwKKwkzMywzMiwzMiwyLDMzLDQwLDAsMCwyNTUsMTI3LDYsNjAsCisJMjQ3LDI0LDE5MiwxMiwyNTUsMjU1LDE5OCw1MiwyNTUsMzEsMyw2MCwKKwkyNTUsMjU1LDk5LDUyLDIzNiwyNTUsNDgsMzgsMzYsMCwzNCwzOCwKKwkzNiwxNiw2NywwLDAsMTYwLDMsNjAsMzcsMTYsNjcsMCwKKwkwLDMyLDMsMzYsMjM2LDI1NSwzMiwxNzQsMiwxMzEsMSw2MCwKKwkyMjAsMjQ2LDMyLDE3MiwyLDEzMSwxLDYwLDIwNCwyNDYsMzIsMTcyLAorCTIsMTMxLDEsNjAsMjM2LDI0NiwzNCwxNzIsMCwwLDY3LDE2NCwKKwkyMjIsMjEsMTkyLDEyLDMzLDMyLDAsMiwxMjIsMTUsMTkyLDEyLAorCTMzLDMyLDAsMiwyNDIsMjEsMTkyLDEyLDMzLDMyLDAsMiwKKwkzMiwxMzMsMTMwLDE0MywxLDAsMTYsMzYsNDIsMTYsMiwyLAorCTEyLDAsNjQsMTYsMjU1LDMxLDMsNjAsMjM2LDEsNDksMzgsCisJMTMzLDEyLDE5MiwxMiwzMywzMiwwLDIsMjQyLDIxLDE5MiwxMiwKKwkzMywzMiwzMiwyLDMyLDEzMywxMzAsMTQzLDEsMCwxNiwzOCwKKwk0MiwxNiwyLDIsMjQ4LDI1NSw2NCwyMCwwLDIsNDksMzgsCisJMjU1LDMxLDMsNjAsMjU1LDI1NSw5OSw1MiwyLDEzMSwxNiw2MCwKKwkxOTIsNCwxNiwzOCw3LDAsMiwzNiwwLDAsMiwxNzQsCisJNTYsMCwyLDM4LDM2LDE2LDY3LDAsMCwxNjAsMyw2MCwKKwkzNywxNiw2NywwLDAsMzIsMywzNiwyLDEzMSwxLDYwLAorCTIyMCw0LDMyLDE3MiwyLDEzMSwxLDYwLDIwNCw0LDMyLDE3MiwKKwkyLDEzMSwxLDYwLDIzNiw0LDM0LDE3MiwwLDAsNjcsMTY0LAorCTIsMTMxLDIsNjAsMjEyLDI0Niw2NiwxNDAsMiwxMzEsMyw2MCwKKwkyMTYsMjQ2LDk5LDEzMiwyMCwwLDIsMTc0LDI0LDAsMywxNjYsCisJMiwxMzEsMiw2MCwyMTcsNCw2NiwxNDQsMCwwLDAsMCwKKwk3LDAsNjYsMzYsMiwxMzEsMSw2MCwyMTcsNCwzNCwxNjAsCisJMTEyLDE1LDE5MiwxMiwzMywzMiwwLDIsMzMsMzIsMCwyLAorCTE5LDE1LDE5MiwxMiwzMiwwLDUsMzYsMjAsMCwxNiwzOCwKKwkzMywzMiwwLDIsNywwLDUsMzYsMjU1LDEyNyw2LDYwLAorCTI0NywyNCwxOTIsMTIsMjU1LDI1NSwxOTgsNTIsMzMsMTYsMCwwLAorCTMyLDAsMTkxLDE0MywyOCwwLDE3OSwxNDMsMjQsMCwxNzgsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTQwLDAsMTg5LDM5LDIwMCwyNTUsMTg5LDM5LDQ4LDAsMTgwLDE3NSwKKwkzMywxNjAsMTI4LDAsMjU1LDMxLDYsNjAsMjU1LDI1NSwxOTgsNTIsCisJNjQsMjYsMjAsMCwyLDEzMSwyLDYwLDE5MiwyNDYsNjYsMzYsCisJNDAsMCwxNzgsMTc1LDMzLDE0NCw5OCwwLDI1NSwyNTUsMTMyLDM4LAorCTY0LDE4LDQsMCwwLDE2MiwzLDYwLDMzLDE2LDY3LDAsCisJNTIsMCwxOTEsMTc1LDQ0LDAsMTc5LDE3NSwzNiwwLDE3NywxNzUsCisJMzIsMCwxNzYsMTc1LDQsMCw2NiwxNzQsMCwxLDY2LDM2LAorCTgsMCw2NiwxNzQsMCwxNiwyLDM2LDQsMTYsMTMwLDAsCisJMTIsMCw2NiwxNzQsNCwwLDIsMzYsNCwxNiwxMzAsMCwKKwkwLDE2MCw1LDYwLDE2LDAsNjYsMTc0LDQ4LDAsNjYsMzgsCisJMzYsMTYsNzAsMCwzNywxNiw2OSwwLDM2LDAsNjYsMTc0LAorCTY0LDE2LDQsMCwzMywxNiw2OCwwLDEyOCwxNiwyLDAsCisJMiwxMzEsMyw2MCwyNDAsMjMxLDk5LDM2LDMzLDE2LDY3LDAsCisJMzYsMTYsNzAsMCwzNywxNiw2OSwwLDQwLDAsNjYsMTc0LAorCTU2LDAsNjYsMzgsMzYsMTYsNzAsMCwzNywxNiw2OSwwLAorCTAsMCw4NCwxNzQsNDQsMCw2NiwxNzQsMzIsMCw2NCwxNzQsCisJMiwxMzEsMiw2MCwyMTIsMjQ2LDY2LDE0MCwyLDEzMSwzLDYwLAorCTIxNiwyNDYsOTksMTMyLDIwLDAsNjYsMTc0LDI0LDAsNjcsMTY2LAorCTI1LDAsNjYsMTQ2LDAsMCwwLDAsMzMsMzIsODQsMCwKKwkyLDEzMSwyLDYwLDAsMjI3LDY2LDM2LDM2LDE2LDcwLDAsCisJMzcsMTI4LDY5LDAsMiwxMzEsMiw2MCwzMiwyMjcsNjYsMzYsCisJMzYsMTYsNzAsMCwyNSwwLDY4LDE2Miw0MCwxMzMsMTMxLDE0MywKKwkwLDAsMCwwLDMsMCw5NiwxNiwzNywxMzYsNjksMCwKKwkyNTUsMjU1LDEzMCwzNiwyNSwwLDY2LDE2MiwxMiwwLDY4LDE0MiwKKwkyOCwwLDY0LDE3NCwyMjgsNjMsMTkyLDEyLDEsMCwxMzIsNTIsCisJNCwwLDY4LDE0MiwwLDAsMCwwLDc2LDY3LDE5MiwxMiwKKwkzMyw0MCwwLDAsNzYsNjMsMTkyLDEyLDAsMCwwLDAsCisJNzYsNjMsMTkyLDEyLDAsMCwwLDAsMjU1LDI1NSwyLDM2LAorCTQsMCwyLDE3NCw0LDAsMiwxNDIsMCwwLDAsMCwKKwkwLDAsMiwxNzQsNCwwLDY4LDE0MiwwLDAsMCwwLAorCTc2LDY3LDE5MiwxMiwxLDAsNSw1NCw0LDAsNCwzOCwKKwkzMyw0MCwwLDAsMjU1LDI1NSw2LDM2LDIxMSw2NywxOTIsMTIsCisJMjA4LDcsNywzNiw4LDAsNjQsMjAsMjU1LDI1NSwyLDUyLAorCTIsMTMxLDQsNjAsMTg0LDEyOCwxMzIsMzYsNCwwLDYsMTQyLAorCTAsMCwwLDAsMTUsNjMsMTkyLDEyLDMzLDQwLDEyOCwyLAorCTI1NSwyNTUsMiw1Miw0OCwxLDM0LDE3NCw0LDAsNjgsMTQyLAorCTAsMCwwLDAsNzYsNjcsMTkyLDEyLDMsMCwzNyw1NCwKKwk0OCwxLDM2LDM4LDMzLDQwLDAsMCwyNTUsMjU1LDYsNTIsCisJMjExLDY3LDE5MiwxMiwyMDgsNyw3LDM2LDcsMCw2NCwyMCwKKwkwLDAsMCwwLDIsMTMxLDQsNjAsOCwxMjksMTMyLDM2LAorCTQ4LDEsMzgsMTQyLDAsMCwwLDAsMTUsNjMsMTkyLDEyLAorCTMzLDQwLDEyOCwyLDE0Myw2MywxOTIsMTIsMCwwLDAsMCwKKwk0MCwwLDY5LDE0Miw0LDAsNjgsMTQyLDAsMCwwLDAsCisJNzYsNjcsMTkyLDEyLDIsMCwxNjUsNTIsNDQsMCw4MSwxNDIsCisJODQsMTI4LDEzMSwxNDMsODAsMTI4LDEzMiwxNDMsMTAwLDAsMiwzNiwKKwkwLDAsMzIsMTY2LDIsMCwzMiwxNjYsNCwwLDMyLDE3NCwKKwk4LDAsMzIsMTc0LDEyLDAsMzIsMTc0LDE2LDAsMzIsMTc0LAorCTI0LDAsMzIsMTc0LDIwLDAsMzIsMTc0LDI4LDAsMzIsMTc0LAorCTMyLDAsMzIsMTc0LDM2LDAsMzQsMTY2LDM4LDAsMzQsMTY2LAorCTM2LDAsMzUsMTY2LDM4LDAsMzYsMTY2LDM2LDAsODMsMTQyLAorCTEsMCwyLDM2LDAsMCw5OCwxNzQsNDQsMCw2NiwxNDIsCisJMCwwLDAsMCw0LDAsOTgsMTc0LDQwLDAsNjcsMTQyLAorCTExNiwwLDIsNjAsMCwwLDk4LDE3Miw0MCwwLDY3LDE0MiwKKwkzNiwwLDY2LDE0MiwwLDAsMCwwLDgsMCw5OCwxNzIsCisJOCwwLDY2LDE0MiwwLDAsMCwwLDAsMCw2NCwxNzIsCisJMCwwLDk4LDE0MiwwLDAsMCwwLDEwLDAsNjQsMTYsCisJMzMsMTI4LDAsMCwyMDgsNywyLDQyLDcsMCw2NCwxNiwKKwkwLDAsMCwwLDE0Myw2MywxOTIsMTIsMCwwLDAsMCwKKwkwLDAsOTgsMTQyLDAsMCwwLDAsMjQ4LDI1NSw2NCwyMCwKKwkxLDAsMTYsMzgsMCwwLDk4LDE0MiwwLDAsMCwwLAorCTYsMCw2NCwxNiwzMywzMiwzMiwyLDIsMTMxLDQsNjAsCisJNzYsMTI5LDEzMiwzNiwxNSw2MywxOTIsMTIsMzMsNDAsMTI4LDIsCisJMzMsMzIsMzIsMiw4LDAsNSwzNiwwLDAsMzQsMTUwLAorCTgsMCw2LDM2LDAsMjQwLDY2LDQ4LDAsNiw2Niw1MiwKKwkyLDAsMzQsMTY2LDgsMCw2NiwxNDIsMjA4LDcsNywzNiwKKwkxMjksNjcsMTkyLDEyLDAsMCw2NCwxNzIsNiwwLDY0LDIwLAorCTIsMCwzNiwzOCwyLDEzMSw0LDYwLDE2MCwxMjksMTMyLDM2LAorCTE1LDYzLDE5MiwxMiwzMyw0MCwxMjgsMiwyLDAsMzYsMzgsCisJMzMsNDAsMCwwLDAsMCwzNCwxNTAsMzMsNDgsMCwwLAorCTAsMjQwLDY2LDQ4LDIsMCwzNCwxNjYsOCwwLDY2LDE0MiwKKwkyMDgsNyw3LDM2LDEyOSw2NywxOTIsMTIsMCwwLDY0LDE3MiwKKwk0LDAsNjQsMjAsMCwwLDAsMCwyLDEzMSw0LDYwLAorCTE1LDYzLDE5MiwxMiwyNDgsMTI5LDEzMiwzNiwxNDMsNjMsMTkyLDEyLAorCTAsMCwwLDAsMTA4LDAsODAsMTQyLDAsMTI4LDIsNTIsCisJMCwwLDAsMTY2LDIsMCwyLDE2Niw0NCwwLDY2LDE0MiwKKwkwLDMyLDUsMzYsNCwwLDgwLDE3Miw0NCwwLDY3LDE0MiwKKwkwLDI0MSwyLDUyLDIsMCw5OCwxNjQsOCwwLDY2LDE0MiwKKwkwLDMyLDYsMzYsMCwwLDY0LDE3Miw0NCwwLDY4LDE0MiwKKwkwLDAsMCwwLDEyOSw2NywxOTIsMTIsMjA4LDcsNywzNiwKKwkxMiwwLDY0LDIwLDAsMCwwLDAsNDQsMCw2NiwxNDIsCisJMCwwLDAsMCwwLDAsNjksMTQ4LDIsMTMxLDQsNjAsCisJMTUsNjMsMTkyLDEyLDE2LDEzMCwxMzIsMzYsMjU0LDI1NSw0LDM2LAorCTIsMTMxLDUsNjAsNDQsMTMwLDE2NSwzNiwxODgsNywxOTIsMTIsCisJMSwxLDYsMzYsMTA4LDAsODAsMTQyLDIsMTI4LDIsNTIsCisJMCwwLDAsMTY2LDIsMCwyLDE2NiwxNCwwLDIsMzYsCisJOCwwLDIsMTYyLDIwMCwwLDIsMzYsOSwwLDIsMTYyLAorCTY1LDAsMiwzNiwxMCwwLDIsMTYyLDQ2LDAsMiwzNiwKKwkxMSwwLDIsMTYyLDg3LDAsMiwzNiwxMiwwLDAsMTYyLAorCTEzLDAsMiwxNjIsMjQyLDAsMiwzNiwxNCwwLDAsMTYyLAorCTE1LDAsMiwxNjIsMSwwLDIsMzYsMTYsMCwyLDE2MiwKKwk4LDAsMiwzNiwxNywwLDIsMTYyLDg4LDEyOCwxMzAsMTQzLAorCTAsMCwwLDAsNiwwLDY0LDE2LDY0LDAsMiwzNiwKKwkyLDEzMSw0LDYwLDE1LDYzLDE5MiwxMiw1NiwxMzAsMTMyLDM2LAorCTg4LDEyOCwxMjgsMTc1LDY0LDAsMiwzNiwxOCwwLDIsMTYyLAorCTI1NSwwLDIsMzYsMTksMCwyLDE2Miw2MywwLDIsMzYsCisJMjAsMCwwLDE2MiwyMSwwLDIsMTYyLDQ0LDAsNjYsMTQyLAorCTAsMzIsNSwzNiw0LDAsODAsMTcyLDQ0LDAsNjcsMTQyLAorCTAsMzMsMiwzNiwyLDAsOTgsMTY0LDgsMCw2NiwxNDIsCisJMCwzMiw2LDM2LDAsMCw2NCwxNzIsNDQsMCw2OCwxNDIsCisJMCwwLDAsMCwxMjksNjcsMTkyLDEyLDIwOCw3LDcsMzYsCisJMTIsMCw2NCwyMCwwLDAsMCwwLDQ0LDAsNjYsMTQyLAorCTAsMCwwLDAsMCwwLDY5LDE0OCwyLDEzMSw0LDYwLAorCTE1LDYzLDE5MiwxMiwxNiwxMzAsMTMyLDM2LDI1MywyNTUsNCwzNiwKKwkyLDEzMSw1LDYwLDQ0LDEzMCwxNjUsMzYsMTg4LDcsMTkyLDEyLAorCTg1LDEsNiwzNiwyMjIsMjEsMTkyLDEyLDMzLDMyLDY0LDIsCisJMTIyLDE1LDE5MiwxMiwzMywzMiw2NCwyLDUyLDAsMTkxLDE0MywKKwk0OCwwLDE4MCwxNDMsNDQsMCwxNzksMTQzLDQwLDAsMTc4LDE0MywKKwkzNiwwLDE3NywxNDMsMzIsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk1NiwwLDE4OSwzOSwyNDgsMjU1LDE4OSwzOSwzMiwxMzMsMTMzLDE0MywKKwkwLDAsMCwwLDUwLDAsMTYwLDI0LDMzLDMyLDAsMCwKKwkyLDEzMSwzLDYwLDE5MiwyNDYsOTksMzYsNDQsMCw5OCwxNDAsCisJMTUyLDAsOTYsMTcyLDE1NiwwLDk2LDE3MiwxNjAsMCw5NiwxNzIsCisJMTY0LDAsOTYsMTcyLDE2OCwwLDk2LDE3MiwxNzIsMCw5NiwxNzIsCisJMTc2LDAsOTYsMTcyLDE4MCwwLDk2LDE3MiwxODQsMCw5NiwxNzIsCisJMTg4LDAsOTYsMTcyLDE5MiwwLDk2LDE3MiwxOTYsMCw5NiwxNzIsCisJMjAwLDAsOTYsMTcyLDIwNCwwLDk2LDE3MiwyMDgsMCw5NiwxNzIsCisJMjEyLDAsOTYsMTcyLDIxNiwwLDk2LDE3MiwyMjQsMCw5NiwxNzIsCisJMjMyLDAsOTYsMTcyLDIzNiwwLDk2LDE3MiwyNDAsMCw5NiwxNzIsCisJMjQ0LDAsOTYsMTcyLDI0OCwwLDk2LDE3MiwyNTIsMCw5NiwxNzIsCisJMCwxLDk2LDE3Miw0LDEsOTYsMTcyLDgsMSw5NiwxNzIsCisJMTIsMCw2NCwxNzIsNDQsMCw5OCwxNDAsMCwwLDAsMCwKKwkxNiwwLDY0LDE3Miw0NCwwLDk4LDE0MCwwLDAsMCwwLAorCTI0LDAsNjQsMTcyLDQ0LDAsOTgsMTQwLDAsMCwwLDAsCisJMjAsMCw2NCwxNzIsNDQsMCw5OCwxNDAsMSwwLDEzMiwzNiwKKwkyOCwwLDY0LDE3Miw0NCwwLDk4LDE0MCwwLDIsOTksMzYsCisJMzIsMCw2NCwxNzIsNDIsMTYsMTMzLDAsMjEwLDI1NSw2NCwyMCwKKwkwLDAsMCwwLDMzLDMyLDAsMCwwLDE2MywzLDYwLAorCTAsMSw5OSw1MiwzMiwwLDUsMzYsMzMsMTYsMTMxLDAsCisJMTg4LDAsNjksMTYwLDEsMCwxMzIsMzYsMCwyLDEzMCw0NCwKKwkyNTEsMjU1LDY0LDIwLDAsMCwwLDAsOCwwLDIyNCwzLAorCTgsMCwxODksMzksMCwwLDAsMCwxMjQsMTMzLDEzMCwxNDMsCisJMjMyLDI1NSwxODksMzksMjAsMCwxOTEsMTc1LDE3LDAsNjQsMjAsCisJMTYsMCwxNzYsMTc1LDIwOCw3LDE2LDM2LDcsMCwwLDI2LAorCTAsMCwwLDAsMTQzLDYzLDE5MiwxMiwyNTUsMjU1LDE2LDM4LAorCTEyNCwxMzMsMTMwLDE0MywwLDAsMCwwLDI0OSwyNTUsNjQsMTYsCisJMCwwLDAsMCw2LDAsMCwyMiwwLDAsMCwwLAorCTIsMTMxLDQsNjAsMTUsNjMsMTkyLDEyLDgwLDEzMCwxMzIsMzYsCisJNDUsMTQsMTkyLDgsMzMsMTYsMCwwLDIyMCw2MywxOTIsMTIsCisJMzMsMzIsMCwwLDMzLDMyLDY0LDAsMTI0LDEzMywxNDQsMTQzLAorCTEyOCwxMzMsMTMwLDE0Myw0LDAsMywxNDIsMjU1LDI1NSw2NiwzNiwKKwkxMjgsMTMzLDEzMCwxNzUsMTI0LDEzMywxMzEsMTc1LDIyMCw2MywxOTIsMTIsCisJMCwwLDAsMCwzMywxNiwwLDIsMjAsMCwxOTEsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMjQsMCwxODksMzksCisJMjMyLDI1NSwxODksMzksOTYsMTMzLDEzMCwxNDMsMzMsNDAsMTI4LDAsCisJNDMsMTYsMTYyLDAsNiwwLDY0LDIwLDE2LDAsMTkxLDE3NSwKKwkxMDAsMTMzLDEzMCwxNDMsMCwwLDAsMCw0MywxNiwxNjIsMCwKKwk2LDAsNjQsMjAsMCwwLDAsMCwyLDEzMSw0LDYwLAorCTE1LDYzLDE5MiwxMiwxMTYsMTMwLDEzMiwzNiw3MSwxNCwxOTIsOCwKKwkwLDAsMCwwLDEyNCwxMzMsMTMxLDE0MywxMjgsMTMzLDEzMCwxNDMsCisJMTI0LDEzMywxMzMsMTc1LDEsMCw2NiwzNiw0LDAsMTYzLDE3MiwKKwkxMjgsMTMzLDEzMCwxNzUsMTYsMCwxOTEsMTQzLDI0LDAsMTg5LDM5LAorCTgsMCwyMjQsMywwLDAsMCwwLDEwOCwxMzMsMTMwLDE0MywKKwkyMzIsMjU1LDE4OSwzOSwyMCwwLDE5MSwxNzUsMTcsMCw2NCwyMCwKKwkxNiwwLDE3NiwxNzUsMjA4LDcsMTYsMzYsNywwLDAsMjYsCisJMCwwLDAsMCwxNDMsNjMsMTkyLDEyLDI1NSwyNTUsMTYsMzgsCisJMTA4LDEzMywxMzAsMTQzLDAsMCwwLDAsMjQ5LDI1NSw2NCwxNiwKKwkwLDAsMCwwLDYsMCwwLDIyLDAsMCwwLDAsCisJMiwxMzEsNCw2MCwxNSw2MywxOTIsMTIsMTQ4LDEzMCwxMzIsMzYsCisJMTA4LDE0LDE5Miw4LDMzLDE2LDAsMCwyMjAsNjMsMTkyLDEyLAorCTMzLDMyLDAsMCwzMywzMiw2NCwwLDEwOCwxMzMsMTQ0LDE0MywKKwkxMjAsMTMzLDEzMCwxNDMsMCwwLDMsMTQyLDI1NSwyNTUsNjYsMzYsCisJMTIwLDEzMywxMzAsMTc1LDEwOCwxMzMsMTMxLDE3NSwyMjAsNjMsMTkyLDEyLAorCTAsMCwwLDAsMzMsMTYsMCwyLDIwLDAsMTkxLDE0MywKKwkxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLDI0LDAsMTg5LDM5LAorCTIzMiwyNTUsMTg5LDM5LDEwNCwxMzMsMTMwLDE0MywzMyw0MCwxMjgsMCwKKwk0MywxNiwxNjIsMCw2LDAsNjQsMjAsMTYsMCwxOTEsMTc1LAorCTExMiwxMzMsMTMwLDE0MywwLDAsMCwwLDQzLDE2LDE2MiwwLAorCTYsMCw2NCwyMCwwLDAsMCwwLDIsMTMxLDQsNjAsCisJMTUsNjMsMTkyLDEyLDE4NCwxMzAsMTMyLDM2LDEzNSwxNCwxOTIsOCwKKwkwLDAsMCwwLDEwOCwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTAsMCwxNjIsMTcyLDEyMCwxMzMsMTMwLDE0MywxMDgsMTMzLDEzMywxNzUsCisJMSwwLDY2LDM2LDEyMCwxMzMsMTMwLDE3NSwxNiwwLDE5MSwxNDMsCisJMjQsMCwxODksMzksOCwwLDIyNCwzLDAsMCwwLDAsCisJMjMyLDI1NSwxODksMzksMjAsMCwxOTEsMTc1LDE2LDAsMTc2LDE3NSwKKwkxMjQsMTMzLDEyOCwxNzUsMTMsOCwxOTIsMTIsMCwzMiw0LDM2LAorCTI1NSwzMSwzLDYwLDI1NSwyNTUsOTksNTIsMjU1LDEsMTYsMzYsCisJMzYsMTYsNjcsMCwwLDE2MCwzLDYwLDM3LDE2LDY3LDAsCisJOTYsMTMzLDEzMCwxNzUsMCwzMiw2NiwzNiwxMDAsMTMzLDEzMCwxNzUsCisJMCwxNywxNiwwLDk2LDEzMywxMzIsMTQzLDI1NSwyNTUsMTYsMzgsCisJNDksMTQsMTkyLDEyLDMzLDMyLDEzMCwwLDI1MSwyNTUsMSw2LAorCTAsMTcsMTYsMCwwLDIsMiwzNiwxMzIsMTMzLDEzMCwxNzUsCisJMTA4LDEzMywxMjgsMTc1LDEzLDgsMTkyLDEyLDE4LDAsNCw2MCwKKwkyNTUsMzEsMyw2MCwyNTUsMjU1LDk5LDUyLDI1NSwxNywxNiwzNiwKKwkzNiwxNiw2NywwLDAsMTYwLDMsNjAsMzcsMTYsNjcsMCwKKwkxOCwwLDMsNjAsMTA0LDEzMywxMzAsMTc1LDMzLDE2LDY3LDAsCisJMTEyLDEzMywxMzAsMTc1LDAsMTgsMTYsMCwxMDQsMTMzLDEzMiwxNDMsCisJMjU1LDI1NSwxNiwzOCwxMTIsMTQsMTkyLDEyLDMzLDMyLDEzMCwwLAorCTI1MSwyNTUsMSw2LDAsMTgsMTYsMCwwLDE4LDIsMzYsCisJMTE2LDEzMywxMzAsMTc1LDIwLDAsMTkxLDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDI0LDAsMTg5LDM5LDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMTYzLDIsNjAsCisJMTY4LDEsNjYsMTQwLDIxNiwyNTUsMTg5LDM5LDI4LDAsMTc3LDE3NSwKKwkzMywxMzYsMTI4LDAsMzIsMCwxNzgsMTc1LDMzLDE0NCwxNjAsMCwKKwkzNiwwLDE5MSwxNzUsMTcsMCw2NCwxNiwyNCwwLDE3NiwxNzUsCisJMCwxNjMsMiw2MCwxNjgsMSw2NiwxNDAsMCwwLDAsMCwKKwk0MiwxNiw4MiwwLDEyLDAsNjQsMTYsMTI4LDEyOCwxOCwwLAorCTAsMCwzNCwxNDIsMCwxNjMsMTgsNjAsMTY4LDEsODIsMTQyLAorCTAsMCwwLDAsNiwwLDY0LDIwLDEyOCwxMjgsMTgsMCwKKwkyLDEzMSw0LDYwLDIyNCwxMzAsMTMyLDM2LDE1LDYzLDE5MiwxMiwKKwkzMyw0MCw2NCwyLDEyOCwxMjgsMTgsMCwzMywxMjgsMTgsMiwKKwkxMjgsMTI4LDE2LDAsMTMsOCwxOTIsMTIsMzMsMzIsMCwyLAorCTI1NSwzMSwzLDYwLDI1NSwyNTUsOTksNTIsMzMsMzIsMCwwLAorCTM2LDE2LDY3LDAsMCwxNjAsMyw2MCwzNywxNiw2NywwLAorCTExMiwwLDM0LDE3NCwxMTIsMCwzNSwxNDIsMzMsMTYsODAsMCwKKwkxNSwwLDY0LDI2LDExNiwwLDM0LDE3NCw4LDAsNSwzNiwKKwkxLDAsMTMyLDM2LDIwLDAsOTgsMzYsNCwwLDk4LDE3MiwKKwkyLDAsMTAxLDE2NCwwLDAsOTYsMTY0LDgsMCw5NiwxNzIsCisJMTQsMCw5NiwxNjQsMTIsMCw5NiwxNjQsMzMsMjQsNjQsMCwKKwk0MiwxNiwxNDYsMCwyNDYsMjU1LDY0LDIwLDEsMCwxMzIsMzYsCisJMjU1LDI1NSwxMzIsMzYsMTE2LDAsMzUsMTQyLDExMiwwLDM0LDE0MiwKKwkwLDAsMCwwLDI0MCwyNTUsOTgsMTcyLDExNiwwLDM1LDE0MiwKKwkwLDAsMCwwLDIxOCwyNTUsOTgsMTQ4LDAsMCwwLDAsCisJMCwxMjgsNjYsNTIsMjE4LDI1NSw5OCwxNjQsMTE2LDAsMzUsMTQyLAorCTAsMCwwLDAsMjM4LDI1NSw5OCwxNDgsMCwwLDAsMCwKKwkwLDEyOCw2Niw1MiwyMzgsMjU1LDk4LDE2NCwxMTYsMCwzNCwxNDIsCisJMTEyLDAsMzUsMTQyLDIxNiwyNTUsNjYsMzYsMTIwLDAsMzUsMTc0LAorCTEyNCwwLDM0LDE3NCwzNiwwLDE5MSwxNDMsMzIsMCwxNzgsMTQzLAorCTI4LDAsMTc3LDE0MywyNCwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTQwLDAsMTg5LDM5LDIwMCwyNTUsMTg5LDM5LDMyLDAsMTc4LDE3NSwKKwkzMywxNDQsMTI4LDAsMCwxLDIsMzYsNDgsMCwxOTEsMTc1LAorCTQ0LDAsMTgxLDE3NSw0MCwwLDE4MCwxNzUsMzYsMCwxNzksMTc1LAorCTI4LDAsMTc3LDE3NSwyNCwwLDE3NiwxNzUsMTQ0LDAsNjYsMTc0LAorCTAsMTYzLDIsNjAsMTcyLDEsNjYsMTQwLDAsMCwwLDAsCisJMTcsMCw2NCwxNiwzMywxNjAsMTYwLDAsMCwxNjMsMiw2MCwKKwkxNzIsMSw2NiwxNDAsMCwwLDAsMCw0MiwxNiw4NCwwLAorCTEyLDAsNjQsMTYsMTI4LDEyOCwyMCwwLDAsMCw2NiwxNDIsCisJMCwxNjMsMjAsNjAsMTcyLDEsMTQ4LDE0MiwwLDAsMCwwLAorCTYsMCw2NCwyMCwxMjgsMTI4LDIwLDAsMiwxMzEsNCw2MCwKKwkyMzYsMTMwLDEzMiwzNiwxNSw2MywxOTIsMTIsMzMsNDAsMTI4LDIsCisJMTI4LDEyOCwyMCwwLDMzLDEyOCwyMCwyLDEyOCwxMjgsMTYsMCwKKwkzMywzMiwwLDIsMTMsOCwxOTIsMTIsMTQ4LDAsODQsMTc0LAorCTI1NSwzMSwzLDYwLDI1NSwyNTUsOTksNTIsMzMsMTUyLDAsMCwKKwkzNiwxNiw2NywwLDAsMTYwLDMsNjAsMzcsMTYsNjcsMCwKKwkxMjgsMCw2NiwxNzQsMTI4LDAsODEsMTQyLDMzLDE2LDgwLDAsCisJMTUsMCwxMjgsMjYsMTMyLDAsNjYsMTc0LDAsMSwyMSwzNiwKKwkyMCwwLDQ4LDM4LDQsMCw0OCwxNzQsNzUsMTQsMTkyLDEyLAorCTAsMCwzMiwxNzQsOCwwLDM0LDE3NCwxMiwwLDUzLDE3NCwKKwkwLDAsNjYsMTQyLDEsMCwxMTUsMzgsMTYsMCwzNCwxNjIsCisJMTcsMCwzMiwxNjIsNDIsMTYsMTE2LDIsMjQ0LDI1NSw2NCwyMCwKKwkzMywxMzYsMCwyLDEzMiwwLDY3LDE0MiwxMjgsMCw2NiwxNDIsCisJMCwwLDAsMCwyNDAsMjU1LDk4LDE3MiwxMzIsMCw2NywxNDIsCisJMCwwLDAsMCwyMjgsMjU1LDk4LDE0MCwwLDAsMCwwLAorCTAsMTI4LDY2LDUyLDIyOCwyNTUsOTgsMTcyLDEzMiwwLDY3LDE0MiwKKwkwLDAsMCwwLDI0OCwyNTUsOTgsMTQwLDAsMCwwLDAsCisJMCwxMjgsNjYsNTIsMjQ4LDI1NSw5OCwxNzIsMTMyLDAsNjYsMTQyLAorCTEyOCwwLDY3LDE0MiwyMTYsMjU1LDY2LDM2LDEzNiwwLDY3LDE3NCwKKwkxNDAsMCw2NiwxNzQsNDgsMCwxOTEsMTQzLDQ0LDAsMTgxLDE0MywKKwk0MCwwLDE4MCwxNDMsMzYsMCwxNzksMTQzLDMyLDAsMTc4LDE0MywKKwkyOCwwLDE3NywxNDMsMjQsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk1NiwwLDE4OSwzOSwxNTIsMCwxMjgsMTcyLDE1NiwwLDEyOCwxNzIsCisJMTYwLDAsMTI4LDE3MiwxNjQsMCwxMjgsMTcyLDE2OCwwLDEyOCwxNzIsCisJMjUyLDAsMTI4LDE3MiwwLDEsMTI4LDE3MiwxNTIsMCwxMjgsMTcyLAorCTgsMCwyMjQsMywyMTYsMCwxMjgsMTcyLDIzMiwyNTUsMTg5LDM5LAorCTE2LDAsMTc2LDE3NSwyMCwwLDE5MSwxNzUsMTEyLDE1LDE5MiwxMiwKKwkzMywxMjgsMTI4LDAsMzMsMzIsMCwyLDE5MiwxNCwxOTIsMTIsCisJMCw0LDUsMzYsMzMsMzIsMCwyLDE5LDE1LDE5MiwxMiwKKwkxMjgsMiw1LDM2LDEyMCwwLDMsMTQyLDEzNiwwLDIsMTQyLAorCTAsMCwwLDAsOCwwLDk4LDE3Miw0NCwwLDMsMTQyLAorCTEyMCwwLDIsMTQyLDAsMCwwLDAsOCwwLDk4LDE3MiwKKwkwLDAsMiwxNDIsMCwwLDAsMCwyNTUsMjU1LDY2LDM2LAorCTYsMCw2Niw0NCw3LDAsNjQsMTYsMTYsMCwzLDM2LAorCTQ0LDAsMiwxNDIsMCwwLDAsMCwyLDAsNjcsMTY0LAorCTgsMCwyLDE0MiwwLDAsMCwwLDAsMCw2NCwxNzIsCisJMjAsMCwxOTEsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJMjQsMCwxODksMzksMTg0LDI1NSwxODksMzksMCwzMiw2LDM2LAorCTY4LDAsMTkxLDE3NSw2NCwwLDE5MCwxNzUsNjAsMCwxODMsMTc1LAorCTU2LDAsMTgyLDE3NSw1MiwwLDE4MSwxNzUsNDgsMCwxODAsMTc1LAorCTQ0LDAsMTc5LDE3NSw0MCwwLDE3OCwxNzUsMzYsMCwxNzcsMTc1LAorCTMyLDAsMTc2LDE3NSwwLDE2MywxLDYwLDI1Miw1LDM4LDE3MiwKKwkxMyw4LDE5MiwxMiwwLDMyLDQsMzYsMjU1LDMxLDQsNjAsCisJMjU1LDI1NSwxMzIsNTIsMzMsMTY4LDAsMCwyNTUsMzEsNiw2MCwKKwkyNTUsMjU1LDE5OCw1MiwyLDEzMSwzLDYwLDIxMiwyNDcsOTksMzYsCisJMTYsMCwxMDEsMzYsOCwwLDEyNiwzNiwyNDgsMjU1LDExOSwzNiwKKwkzMywxNzYsOTYsMCwzNiwxNiw2OCwwLDAsMTYwLDMsNjAsCisJMzcsMTYsNjcsMCwxNiwwLDE2NiwxNzUsMCwxNjMsMSw2MCwKKwkyNDgsNSwzNCwxNzIsMCwxNjMsMSw2MCwwLDYsMzIsMTcyLAorCTMzLDE2MCwwLDAsMzMsMTI4LDIyNCwyLDMzLDE1MiwxNjAsMCwKKwkzMywxNDQsMTkyLDMsMzMsMTM2LDE5MiwyLDMyLDEzMywxMzAsMTQzLAorCTAsMCwzMiwxNzQsMCwwLDAsMTc0LDAsMCw2NCwxNzQsCisJNDIsMTYsMTYyLDIsMTAsMCw2NCwxNiwwLDAsOTYsMTc0LAorCTAsMzIsNCwzNiwxMyw4LDE5MiwxMiwyNCwwLDE2NSwxNzUsCisJMTYsMCwxNjYsMTQzLDAsMTI4LDMsNjAsMzYsMTYsNzAsMCwKKwkzNywxNiw2NywwLDAsMCwyLDE3NCwyNCwwLDE2NSwxNDMsCisJNCwwLDE2LDM4LDQsMCwxMTUsMzgsNCwwLDgyLDM4LAorCTEsMCwxNDgsMzgsMiwwLDEzMCw0MiwyMzQsMjU1LDY0LDIwLAorCTQsMCw0OSwzOCwwLDIsMTY1LDM2LDAsMiwyMjIsMzksCisJMCwyLDI0NywzOCwxLDAsMTgxLDM4LDcsMCwxNjIsNDIsCisJMjIyLDI1NSw2NCwyMCwwLDIsMjE0LDM4LDY4LDAsMTkxLDE0MywKKwk2NCwwLDE5MCwxNDMsNjAsMCwxODMsMTQzLDU2LDAsMTgyLDE0MywKKwk1MiwwLDE4MSwxNDMsNDgsMCwxODAsMTQzLDQ0LDAsMTc5LDE0MywKKwk0MCwwLDE3OCwxNDMsMzYsMCwxNzcsMTQzLDMyLDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNzIsMCwxODksMzksMCwxNjMsNCw2MCwKKwkwLDYsMTMyLDE0MCwwLDE2MywzLDYwLDgsNiw5OSwxNDAsCisJMzIsMTMzLDEzMCwxNDMsMjI0LDI1NSwxODksMzksMTYsMCwxNzYsMTc1LAorCTAsMTYzLDE2LDYwLDEyLDYsMTYsMTQyLDIwLDAsMTc3LDE3NSwKKwkwLDE2MywxNyw2MCw0LDYsNDksMTQyLDQzLDE2LDk4LDAsCisJNDIsMCw2NCwxNiwyNCwwLDE5MSwxNzUsMiwwLDIsNDYsCisJNDAsMCw2NCwxNiwyNTUsMjU1LDIsMzYsMCwxNjMsMiw2MCwKKwkyNTIsNSw2NiwxNDAsMCwwLDAsMCw0MywxNiw4MSwwLAorCTM0LDAsNjQsMjAsMjU1LDI1NSwyLDM2LDY0LDE4LDMsMCwKKwkyLDEzMSwzLDYwLDE5MiwyNDYsOTksMzYsMzMsMjQsNjcsMCwKKwkxLDAsMiwzNiw1LDAsMTMwLDE2LDIsMCwyLDM2LAorCTE4LDAsMTMwLDE2LDEyOCwxNiwxNiwwLDM2LDE2LDE5Miw4LAorCTAsMCwwLDAsMTI4LDEyOCwxNiwwLDMzLDEyOCwzLDIsCisJMTIsMSw0LDE0MiwwLDE2Myw1LDYwLDI0OCw1LDE2NSwxNDAsCisJMzMsNDgsMzIsMiw4MCw2OCwxOTIsMTIsMzYsMSwxNywxNzQsCisJMTIsMSw0LDE0MiwxMiwxLDIsMTQyLDMzLDQwLDMyLDIsCisJMTE0LDY4LDE5MiwxMiwyMCwxLDIsMTc0LDM2LDE2LDE5Miw4LAorCTAsMCwwLDAsMzMsMTYsNjcsMCwyMCwxLDY0LDE3MiwKKwkzNiwxLDY0LDE3MiwwLDE2MywxLDYwLDQyLDE2LDE5Miw4LAorCTAsNiwzMiwxNzIsMjU1LDI1NSwyLDM2LDAsMTYzLDEsNjAsCisJMCw2LDM0LDE3MiwyNCwwLDE5MSwxNDMsMjAsMCwxNzcsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMzIsMCwxODksMzksCisJMTc2LDEzMywxMzYsMTQzLDE4OCwxMzMsMTM3LDE0MywyMzIsMjU1LDE4OSwzOSwKKwkzLDAsMCwyMSwxNiwwLDE5MSwxNzUsMTI0LDAsMzIsMTcsCisJMCwwLDAsMCwxMiwwLDE5NCwxNDgsMCwwLDAsMCwKKwkwLDI2LDIsMCwyLDE4LDIsMCwzNyw1Niw5OCwwLAorCTI1NSwyNTUsMjI3LDQ4LDIyMSw1LDk4LDQ0LDM2LDAsNjQsMjAsCisJMTcwLDE3MCwyLDUyLDAsOCwyLDM2LDIzLDAsOTgsMjAsCisJNiw4LDIsMzYsMjEsMCwwLDE3LDAsMCwwLDAsCisJMzIsMCwxOTQsMTQ4LDMwLDAsMTk1LDE0OCwwLDIwLDIsMCwKKwkzNyw1Niw2NywwLDM2LDAsMTk1LDE0OCwwLDE2MSwyLDUyLAorCTUsMCw5OCwxNiw4LDAsMiwzNiwzNCwwLDE5NSwxNDgsCisJMCwwLDAsMCw5OCwwLDk4LDIwLDAsMCwwLDAsCisJMywwLDIzMiwxNiwyNTUsMjU1LDIsMzYsOTQsMCwyMjYsMjAsCisJMCwwLDAsMCwyMjYsNDYsMTkyLDEyLDE0LDAsNiwzNiwKKwkxNzcsMTYsMTkyLDgsMCwwLDAsMCw3LDAsOTgsMjAsCisJMjU1LDI1NSwyMjcsNDgsNzEsMCwwLDE3LDU1LDEyOSwyLDUyLAorCTEwOCw0MywxOTIsMTIsMTQsMCw2LDM2LDE3NywxNiwxOTIsOCwKKwkwLDAsMCwwLDE2MiwxNiwxOTIsOCw1NSwxMjksMiw1MiwKKwkxNCwwLDE5NSwxNDgsMCwwLDAsMCw2MSwwLDk4LDIwLAorCTI1NSwyNTUsMiw1MiwxNiwwLDE5NSwxNDQsMywwLDIsMzYsCisJNTUsMCw5OCwyMCwyNTUsMjU1LDIsNTIsMjAsMCwxOTQsMTQ4LAorCTAsMCwwLDAsMCwyNiwyLDAsMiwxOCwyLDAsCisJMzcsNTYsOTgsMCwyNTUsMjU1LDIyNyw0OCwwLDgsMiwzNiwKKwkyMywwLDk4LDIwLDYsOCwyLDM2LDIxLDAsMCwxNywKKwkwLDAsMCwwLDQwLDAsMTk0LDE0OCwzOCwwLDE5NSwxNDgsCisJMCwyMCwyLDAsMzcsNTYsNjcsMCw0NCwwLDE5NSwxNDgsCisJMCwxNjEsMiw1Miw1LDAsOTgsMTYsOCwwLDIsMzYsCisJNDIsMCwxOTUsMTQ4LDAsMCwwLDAsNDksMCw5OCwyMCwKKwkwLDAsMCwwLDMsMCwyMzIsMTYsMjU1LDI1NSwyLDM2LAorCTQ1LDAsMjI2LDIwLDAsMCwwLDAsMjI2LDQ2LDE5MiwxMiwKKwkyMiwwLDYsMzYsMTc3LDE2LDE5Miw4LDAsMCwwLDAsCisJNywwLDk4LDIwLDI1NSwyNTUsMjI3LDQ4LDYsMCwwLDE3LAorCTU1LDEyOSwyLDUyLDEwOCw0MywxOTIsMTIsMjIsMCw2LDM2LAorCTE3NywxNiwxOTIsOCwwLDAsMCwwLDU1LDEyOSwyLDUyLAorCTMwLDAsOTgsMjAsMCwwLDAsMCwyOCwwLDMyLDE3LAorCTE0NCwxNSwzLDM2LDM4LDAsMTk0LDE0OCwyOCwwLDE5OCwxNDAsCisJMjQsMCw2NywyMCwwLDAsMCwwLDMsMCwyMDEsMTYsCisJMCwwLDAsMCwyMCwwLDE5MiwyMCwwLDAsMCwwLAorCTE3NSwxNiwxOTIsOCwyMiwwLDYsMzYsMTQsMCwxOTUsMTQ4LAorCTAsMCwwLDAsMTQsMCw5OCwyMCwwLDAsMCwwLAorCTEyLDAsMzIsMTcsMTQ0LDE1LDMsMzYsMzAsMCwxOTQsMTQ4LAorCTIwLDAsMTk4LDE0MCw4LDAsNjcsMjAsMCwwLDAsMCwKKwkzLDAsMjAxLDE2LDAsMCwwLDAsNCwwLDE5MiwyMCwKKwkwLDAsMCwwLDE0LDAsNiwzNiwxMjYsNDksMTkyLDEyLAorCTAsMCwwLDAsMTYsMCwxOTEsMTQzLDI0LDAsMTg5LDM5LAorCTgsMCwyMjQsMywwLDAsMCwwLDEyOCwyNTUsMTg5LDM5LAorCTExNiwwLDE4MywxNzUsMzMsMTg0LDEyOCwwLDMsMCwzLDM2LAorCTEyNCwwLDE5MSwxNzUsMTIwLDAsMTkwLDE3NSwxMTIsMCwxODIsMTc1LAorCTEwOCwwLDE4MSwxNzUsMTA0LDAsMTgwLDE3NSwxMDAsMCwxNzksMTc1LAorCTk2LDAsMTc4LDE3NSw5MiwwLDE3NywxNzUsODgsMCwxNzYsMTc1LAorCTAsMCwyNDUsMTQyLDgsMCwxNzgsMTQwLDE5MiwxNywyMSwwLAorCTMsMTMxLDQsNjAsMzMsMzIsMTMwLDAsMjAsMTMsMTMyLDE0MCwKKwk4LDAsODQsMTQyLDAsMCwwLDAsNTksMCwxMzEsMTYsCisJNSwwLDEzMCw0NCw1NywwLDY0LDE2LDEyOCwxNiw0LDAsCisJMiwxMzEsMSw2MCwzMyw4LDM0LDAsMTA0LDEzMSwzNCwxNDAsCisJMCwwLDAsMCw4LDAsNjQsMCwwLDAsMCwwLAorCTQ0LDEzMywxMzAsMTQzLDAsMCwwLDAsNDgsMCw2NCwxNiwKKwk2LDAsMTMyLDM4LDQsMCwxMzEsMTUwLDIsMTMxLDIsNjAsCisJNjgsMjA3LDY2LDE0OCwwLDAsMCwwLDYsMCw5OCwyMCwKKwkzMywzMiwwLDAsMCwwLDEzMCwxNDIsNDgsMTI5LDEzMSwxNDMsCisJMCwwLDAsMCwzOCwxNiw2NywwLDEsMCw2OCw0NCwKKwk3MiwxLDEyOCwxNiwzMywzMiwxNjAsMiwxMTQsNDIsMTkyLDEyLAorCTMzLDQwLDEyOCwyLDQ1LDE4LDE5Miw4LDMzLDMyLDY0LDIsCisJNDQsMTMzLDEzMCwxNDMsMCwwLDAsMCwyNywwLDY0LDE2LAorCTYsMCwxMzIsMzgsNCwwLDEzMSwxNTAsMiwxMzEsMiw2MCwKKwk2OCwyMDcsNjYsMTQ4LDAsMCwwLDAsNiwwLDk4LDIwLAorCTMzLDMyLDAsMCwwLDAsMTMwLDE0Miw0OCwxMjksMTMxLDE0MywKKwkwLDAsMCwwLDM4LDE2LDY3LDAsMSwwLDY4LDQ0LAorCTUsMCwxMjgsMTYsMzMsMzIsMTYwLDIsMTE0LDQyLDE5MiwxMiwKKwkzMyw0MCwxMjgsMiw0NSwxOCwxOTIsOCwzMywzMiw2NCwyLAorCTYsMCwxMzIsMzgsMCwxNjMsNiw2MCwxNDAsMSwxOTgsMTQwLAorCTAsMCwwLDAsMjQ3LDI0LDE5MiwxMiwzMyw0MCwxNjAsMiwKKwk0NSwxOCwxOTIsOCwzMywzMiw2NCwyLDYsMCwxMzIsMzgsCisJMCwxNjMsNiw2MCwxNDAsMSwxOTgsMTQwLDAsMCwwLDAsCisJMjQ3LDI0LDE5MiwxMiwzMyw0MCwxNjAsMiwyMDMsMjQsMTkyLDEyLAorCTMzLDMyLDEyOCwyLDIwLDEsMjI3LDE0MiwwLDAsMCwwLAorCTE0LDAsOTYsMTYsMzMsMjQwLDY0LDAsMzMsMzIsMTI4LDIsCisJMTYsMCwxNjYsMzksMTgsMCw2OSwxNTAsMCwwLDAsMCwKKwk5LDI0OCw5NiwwLDMzLDU2LDE5MiwzLDYsMCw2NCwxNiwKKwkzMywzMiw2NCwyLDI4LDEsMjI2LDE0MiwwLDAsMCwwLAorCTEsMCw2NiwzNiw0NSwxOCwxOTIsOCwyOCwxLDIyNiwxNzQsCisJMTMyLDAsMTkzLDcsNywwLDIsMzYsNCwwLDEzMSwxNTAsCisJMiwxMzEsMiw2MCw2OCwyMDcsNjYsMTQ4LDAsMCwwLDAsCisJNiwwLDk4LDIwLDMzLDMyLDAsMCwwLDAsMTMwLDE0MiwKKwk0OCwxMjksMTMxLDE0MywwLDAsMCwwLDM4LDE2LDY3LDAsCisJMSwwLDY4LDQ0LDksMCwxMjgsMTYsMjU1LDI1NSwyLDM2LAorCTQ0LDEzMywxMzAsMTQzLDAsMCwwLDAsMjUxLDAsNjQsMTYsCisJMzMsMzIsMTYwLDIsMTE0LDQyLDE5MiwxMiwzMyw0MCwxMjgsMiwKKwk0NSwxOCwxOTIsOCwzMywzMiw2NCwyLDEwLDAsMTk0LDIzLAorCTAsMCwwLDAsOCwwLDE2MCwxOCwwLDAsMCwwLAorCTM2LDEzMywxMzAsMTQzLDAsMCwwLDAsOCwwLDY0LDE2LAorCTEsMCwxOSwzNiw4MCwxMzMsMTQ3LDE0Myw2OSwxNywxOTIsOCwKKwkwLDAsMCwwLDAsMSwyMjYsMTQyLDgwLDEzMywxNDcsMTQzLAorCTEsMCw2NiwzNiwwLDEsMjI2LDE3NCw4NCwxMzMsMTMwLDE0MywKKwkwLDAsMCwwLDM1LDE2LDgzLDAsMjU1LDI1NSw2NiwzNiwKKwkxNywwLDY2LDE2Miw4NCwxMzMsMTMwLDE0MywzMywxMjgsOTYsMiwKKwk0MiwxNiwyLDIsMTUsMCw2NCwxNiw2NCwxOCwxNiwwLAorCTIsMTMxLDMsNjAsMTkyLDI0Niw5OSwzNiwzMywxMzYsNjcsMCwKKwk1LDAsMjEsMTgsMCwwLDAsMCwyNDcsMjIsMTkyLDEyLAorCTMzLDMyLDMyLDIsMjE3LDAsNjQsMTYsMzMsMTYsMCwwLAorCTg0LDEzMywxMzAsMTQzLDEsMCwxNiwzOCw0MiwxNiwyLDIsCisJMjQ2LDI1NSw2NCwyMCwwLDIsNDksMzgsODQsMTMzLDEzMCwxNDMsCisJMzMsMTI4LDk2LDIsNDIsMTYsMiwyLDU1LDAsNjQsMTYsCisJNjQsMTgsMTYsMCwyLDEzMSwzLDYwLDE5MiwyNDYsOTksMzYsCisJMzMsMTUyLDY3LDAsMzMsMTM2LDY0LDAsMTkyLDE3NywxNiwwLAorCTQxLDAsMjEsMTgsMCwwLDAsMCwyLDEzMSwyLDYwLAorCTMzLDE2LDgxLDAsMjE2LDI0Nyw2NiwxNDAsMCwwLDAsMCwKKwkxNSwwLDY0LDE2LDMzLDMyLDEyOCwyLDE2LDAsMTY2LDM5LAorCTE4LDAsNjksMTUwLDAsMCwwLDAsOSwyNDgsNjQsMCwKKwkzMyw1NiwxNjAsMiw4LDAsNjQsMTYsMCwwLDAsMCwKKwkyLDEzMSwyLDYwLDMzLDE2LDgxLDAsMjI0LDI0Nyw2NiwxNDAsCisJMCwwLDAsMCwxLDAsNjYsMzYsMTQwLDE3LDE5Miw4LAorCTMyLDEsOTgsMTc0LDQ0LDEzMywxMzAsMTQzLDAsMCwwLDAsCisJNywwLDY0LDE2LDMsMCw4LDM2LDMsMTMxLDIsNjAsCisJMzMsMTYsODYsMCwyMCwxMyw2NiwxNDAsMCwwLDAsMCwKKwk2LDAsNzIsMjAsMCwwLDAsMCwzMywzMiw5NiwyLAorCTYsMjMsMTkyLDEyLDMzLDQwLDY0LDIsMTQ2LDE3LDE5Miw4LAorCTAsMiwxMTUsMzgsMTcsMCw2NiwxNDYsMCwwLDAsMCwKKwkyNTUsMjU1LDY2LDM2LDE3LDAsNjYsMTYyLDE3LDAsNjYsMTQ2LAorCTAsMiwxMTUsMzgsMCwyLDQ5LDM4LDg0LDEzMywxMzAsMTQzLAorCTEsMCwxNiwzOCw0MiwxNiwyLDIsMjA4LDI1NSw2NCwyMCwKKwkxMjgsMCwyMTQsMzgsMjU0LDI1NSwyLDM2LDQsMCwxOTQsMjMsCisJMzMsMzIsMjI0LDIsMzMsNDAsNjQsMiw0NywxNiwxOTIsMTIsCisJMzMsNDgsMTI4LDIsMTcsMCw2NiwxNDYsMCwwLDAsMCwKKwkxNDAsMCw2NCwxNiwzMywzMiw2NCwyLDM2LDE4LDE5Miw4LAorCTAsMCwwLDAsMjYsMCwxOTQsMjMsMCwwLDAsMCwKKwkzNiwxMzMsMTMwLDE0MywwLDAsMCwwLDExLDAsNjQsMTYsCisJMzMsMzIsMjI0LDIsOSwwLDE2MCwxOCwxLDAsMiwzNiwKKwkxNywwLDY2LDE2MiwyLDEzMSw0LDYwLDE5MiwyNDYsMTMyLDM2LAorCTYsMjMsMTkyLDEyLDMzLDQwLDY0LDIsMTI2LDAsNjQsMTYsCisJMzMsMTYsMCwwLDMzLDMyLDIyNCwyLDMzLDQwLDY0LDIsCisJNDcsMTYsMTkyLDEyLDMzLDQ4LDEyOCwyLDM2LDEzMywxMzAsMTQzLAorCTAsMCwwLDAsMTE1LDAsNjQsMTYsMzMsMzIsNjQsMiwKKwkxMTYsMCwxNjAsMjIsMSwwLDIsMzYsNDUsMTgsMTkyLDgsCisJMCwwLDAsMCw4NywwLDIxMywxOSw2NCwxMzAsMzAsMCwKKwkyLDEzMSwyLDYwLDMzLDE2LDgwLDAsMjE2LDI0Nyw2NiwxNDAsCisJMCwwLDAsMCwxOCwwLDY0LDE2LDMzLDMyLDEyOCwyLAorCTE2LDAsMTY2LDM5LDE4LDAsNjksMTUwLDAsMCwwLDAsCisJOSwyNDgsNjQsMCwzMyw1NiwxNjAsMiwxMSwwLDY0LDE2LAorCTMzLDMyLDY0LDIsMiwxMzEsMiw2MCwzMywxNiw4MCwwLAorCTIyNCwyNDcsNjYsMTQwLDAsMCwwLDAsMSwwLDY2LDM2LAorCTIsMTMxLDEsNjAsMzMsOCw0OCwwLDIyNCwyNDcsMzQsMTcyLAorCTQ1LDE4LDE5Miw4LDE3LDAsMTI4LDE2MCwzNiwxMzMsMTMwLDE0MywKKwkwLDAsMCwwLDQzLDAsNjQsMTYsMCwwLDAsMCwKKwk0MSwwLDE5MiwxOSwwLDAsMCwwLDM5LDAsMTYwLDE4LAorCTY0LDE4LDMwLDAsMiwxMzEsMTYsNjAsMTkyLDI0NiwxNiwzOCwKKwkzMywxMzYsODAsMCwyNDcsMjIsMTkyLDEyLDMzLDMyLDMyLDIsCisJNzQsMCw2NCwxNiwzMywxNiwwLDAsMjQ3LDIyLDE5MiwxMiwKKwkzMywzMiwwLDIsNjMsMCw2NCwxNiwyLDAsMiwzNiwKKwkxNywwLDY2LDE2Miw0NCwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTcsMCw2NCwxNiwxOTIsMTcsMzAsMCwzLDEzMSwzLDYwLAorCTMzLDI0LDk4LDAsMjAsMTMsOTksMTQwLDMsMCwyLDM2LAorCTYsMCw5OCwyMCwwLDAsMCwwLDMzLDMyLDMyLDIsCisJNiwyMywxOTIsMTIsMzMsNDAsNjQsMiwwLDE4LDE5Miw4LAorCTAsMCwwLDAsMTcsMCw2NiwxNDYsMCwwLDAsMCwKKwkyNTUsMjU1LDY2LDM2LDE3LDAsNjYsMTYyLDE3LDAsNjYsMTQ2LAorCTIsMTMxLDQsNjAsMTkyLDI0NiwxMzIsMzYsNiwyMywxOTIsMTIsCisJMzMsNDAsNjQsMiwzNiwxOCwxOTIsOCwwLDAsMCwwLAorCTQ0LDEzMywxMzAsMTQzLDAsMCwwLDAsNywwLDY0LDE2LAorCTE5MiwxNywzMCwwLDMsMTMxLDMsNjAsMzMsMjQsOTgsMCwKKwkyMCwxMyw5OSwxNDAsMywwLDIsMzYsMjgsMCw5OCwyMCwKKwkwLDAsMCwwLDEsMCwyLDM2LDE3LDAsNjYsMTYyLAorCTY0LDE4LDMwLDAsMiwxMzEsNCw2MCwxOTIsMjQ2LDEzMiwzNiwKKwkzMiwxOCwxOTIsOCwzMywzMiw2OCwwLDM2LDEzMywxMzAsMTQzLAorCTAsMCwwLDAsMTcsMCw2NCwxNiwwLDAsMCwwLAorCTE1LDAsMTkyLDE5LDEsMCwyLDM2LDE3LDAsNjYsMTYyLAorCTIsMTMxLDQsNjAsMTkyLDI0NiwxMzIsMzYsNiwyMywxOTIsMTIsCisJMzMsNDAsNjQsMiwxMywwLDY0LDE2LDMzLDE2LDAsMCwKKwkyNTIsMCwyMjYsMTQyLDAsMCwwLDAsMSwwLDY2LDM2LAorCTQ3LDE4LDE5Miw4LDI1MiwwLDIyNiwxNzQsNDgsMTgsMTkyLDgsCisJMzMsMTYsMCwwLDE3LDAsNjQsMTYyLDMzLDMyLDY0LDIsCisJMTUyLDIxLDE5MiwxMiwwLDAsMCwwLDEsMCwyLDM2LAorCTEyNCwwLDE5MSwxNDMsMTIwLDAsMTkwLDE0MywxMTYsMCwxODMsMTQzLAorCTExMiwwLDE4MiwxNDMsMTA4LDAsMTgxLDE0MywxMDQsMCwxODAsMTQzLAorCTEwMCwwLDE3OSwxNDMsOTYsMCwxNzgsMTQzLDkyLDAsMTc3LDE0MywKKwk4OCwwLDE3NiwxNDMsOCwwLDIyNCwzLDEyOCwwLDE4OSwzOSwKKwkyMTYsMjU1LDE4OSwzOSwyNCwwLDE3OCwxNzUsMzMsMTQ0LDEyOCwwLAorCTMyLDAsMTkxLDE3NSwyOCwwLDE3OSwxNzUsMjAsMCwxNzcsMTc1LAorCTE2LDAsMTc2LDE3NSw4LDAsMTc3LDE0MCwwLDAsNjYsMTQyLAorCTgsMCwzOCwxNDIsMzYsMCw2NCwxNiwwLDAsMCwwLAorCTI4LDAsNjYsMTQyLDAsMCwwLDAsMTgsMCw2NCwyMCwKKwkxLDAsMiwzNiwwLDAsMTk0LDE0NCwwLDAsMCwwLAorCTEsMCw2Niw0OCwxMywwLDY0LDIwLDEsMCwyLDM2LAorCTQsMCwxOTUsMTQ4LDI0LDAsNjYsMTUwLDAsMCwwLDAsCisJNiwwLDk4LDIwLDMzLDMyLDAsMCwwLDAsMTk0LDE0MCwKKwkyMCwwLDY3LDE0MiwwLDAsMCwwLDM4LDE2LDY3LDAsCisJMSwwLDY4LDQ0LDEwLDAsMTI4LDE2LDEsMCwyLDM2LAorCTE3LDAsMzQsMTYyLDIsMTMxLDQsNjAsMTkyLDI0NiwxMzIsMzYsCisJNiwyMywxOTIsMTIsMzMsNDAsMzIsMiw0NSwwLDY0LDE2LAorCTMzLDE2LDAsMCwxMzksMTgsMTkyLDgsMCwwLDAsMCwKKwkxNywwLDMyLDE2MiwxNTIsMjEsMTkyLDEyLDMzLDMyLDMyLDIsCisJMTQ0LDE4LDE5Miw4LDEsMCwyLDM2LDE2LDAsMTc5LDE0MCwKKwkwLDAsMCwwLDYsMCw5NiwyNiwwLDAsMCwwLAorCTMyLDEzMywxMzAsMTQzLDAsMCwwLDAsNDIsMTYsOTgsMiwKKwkxNSwwLDY0LDIwLDEsMCwyLDM2LDIsMTMxLDQsNjAsCisJMjQ4LDEzMCwxMzIsMzYsMiwxMzEsMTYsNjAsMjQsMTMxLDE2LDM4LAorCTMzLDQwLDAsMiwyLDEzMSw3LDYwLDM2LDEzMSwyMzEsMzYsCisJMTUsNjMsMTkyLDEyLDE4OCwyLDYsMzYsMSwwLDQsMzYsCisJMzMsNDAsMCwyLDE4OCw3LDE5MiwxMiwxODgsMiw2LDM2LAorCTEsMCwyLDM2LDE3LDAsMzQsMTYyLDY0LDE4LDE5LDAsCisJMiwxMzEsNCw2MCwxOTIsMjQ2LDEzMiwzNiwzMywzMiw2OCwwLAorCTYsMjMsMTkyLDEyLDMzLDQwLDMyLDIsNiwwLDY0LDE2LAorCTMzLDE2LDAsMCwyNTIsMCw2NiwxNDIsMCwwLDAsMCwKKwkxLDAsNjYsMzYsMjUyLDAsNjYsMTc0LDEsMCwyLDM2LAorCTMyLDAsMTkxLDE0MywyOCwwLDE3OSwxNDMsMjQsMCwxNzgsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTQwLDAsMTg5LDM5LDcyLDI1NSwxODksMzksMTY0LDAsMTgxLDE3NSwKKwkzMywxNjgsMTI4LDAsMTgwLDAsMTkxLDE3NSwxNzYsMCwxOTAsMTc1LAorCTE3MiwwLDE4MywxNzUsMTY4LDAsMTgyLDE3NSwxNjAsMCwxODAsMTc1LAorCTE1NiwwLDE3OSwxNzUsMTUyLDAsMTc4LDE3NSwxNDgsMCwxNzcsMTc1LAorCTE0NCwwLDE3NiwxNzUsODgsMCwxNjUsMTc1LDEyMCwwLDE2MCwxNzUsCisJMTIwLDAsMTY4LDE0MiwwLDAsMCwwLDk2LDAsMTY4LDE3NSwKKwkxMjQsMCwxNjksMTQyLDAsMCwwLDAsMTUsMiwxNjAsMjQsCisJMTA0LDAsMTY5LDE3NSw5NiwwLDE2OCwxNDMsMCwwLDAsMCwKKwkwLDAsNCwxNDksMCwwLDAsMCwwLDEyOCwxMzAsNDgsCisJOSwyLDY0LDE2LDAsMCwwLDAsMTI4LDAsMTYwLDE3NSwKKwk4LDAsMiwxNDEsMTM2LDAsMTY5LDE0MiwyNTUsMjU1LDgsMzYsCisJMTgsMCw3MiwxNiwxMTIsMCwxNjksMTc1LDExMiwwLDE2OSwxNDMsCisJMCwwLDAsMCwwLDAsMzUsMTQxLDQsMCw0MCwxNDEsCisJMTI4LDAsMTY5LDE0MywyNTUsNjMsOTgsNDgsMzMsNzIsMzQsMSwKKwkwLDEyOCw5OSw0OCwxMTIsMCwxNjgsMTc1LDI0NiwyNTUsOTYsMTYsCisJMTI4LDAsMTY5LDE3NSw5NiwwLDE2OCwxNDMsMCwwLDAsMCwKKwk4LDAsMiwxNDEsMTI4LDAsMTY5LDE1MSwwLDAsMCwwLAorCTE4LDAsNzMsMTY0LDAsMzIsMTMwLDQ4LDIwMCwxLDY0LDE2LAorCTAsMCwwLDAsNDAsMTMzLDEzMCwxNDMsMCwwLDAsMCwKKwk3NSwwLDY0LDE2LDMsMCw4LDM2LDk2LDAsMTY4LDE0MywKKwkwLDAsMCwwLDgsMCwxNiwxNDEsMCwwLDE2MiwxNDIsCisJOCwwLDUsMTQyLDMwLDAsNjQsMTYsMCwwLDAsMCwKKwkyOCwwLDE2MiwxNDIsMCwwLDAsMCwxOCwwLDY0LDIwLAorCTEsMCw5LDM2LDAsMCwxNjIsMTQ0LDAsMCwwLDAsCisJMSwwLDY2LDQ4LDEzLDAsNjQsMjAsMCwwLDAsMCwKKwk0LDAsMTYzLDE0OCwyNCwwLDE2MiwxNTAsMCwwLDAsMCwKKwk2LDAsOTgsMjAsMzMsMzIsMCwwLDAsMCwxNjIsMTQwLAorCTIwLDAsMTYzLDE0MiwwLDAsMCwwLDM4LDE2LDY3LDAsCisJMSwwLDY4LDQ0LDYsMCwxMjgsMTYsMSwwLDksMzYsCisJMTcsMCw5LDE2MiwyLDEzMSw0LDYwLDE5MiwyNDYsMTMyLDM2LAorCTE4LDE5LDE5Miw4LDMzLDQwLDAsMiwxNywwLDAsMTYyLAorCTEzMCwyMCwxOTIsOCwzMywzMiwwLDIsMTYsMCwxNywxNDEsCisJMCwwLDAsMCw2LDAsMzIsMjYsMCwwLDAsMCwKKwkzMiwxMzMsMTMwLDE0MywwLDAsMCwwLDQyLDE2LDM0LDIsCisJMTUsMCw2NCwyMCwxLDAsOSwzNiwyLDEzMSw0LDYwLAorCTI0OCwxMzAsMTMyLDM2LDIsMTMxLDUsNjAsMjQsMTMxLDE2NSwzNiwKKwkyLDEzMSw3LDYwLDM2LDEzMSwyMzEsMzYsMTUsNjMsMTkyLDEyLAorCTE4OCwyLDYsMzYsMSwwLDQsMzYsMiwxMzEsNSw2MCwKKwkyNCwxMzEsMTY1LDM2LDE4OCw3LDE5MiwxMiwxODgsMiw2LDM2LAorCTEsMCw5LDM2LDE3LDAsOSwxNjIsNjQsMzQsMTcsMCwKKwkyLDEzMSw4LDYwLDE5MiwyNDYsOCwzNywzMywzMiwxMzYsMCwKKwkzMyw0MCwwLDIsNiwyMywxOTIsMTIsMCwwLDAsMCwKKwkxMTIsMSw2NCwxNiwzMywxNiwwLDAsMjUyLDAsMTYyLDE0MiwKKwkwLDAsMCwwLDEsMCw2NiwzNiwxMzIsMjAsMTkyLDgsCisJMjUyLDAsMTYyLDE3NCwwLDAsMTgyLDE0Miw5NiwwLDE2OSwxNDMsCisJMTkyLDE3LDIyLDAsOCwwLDUwLDE0MSwzLDEzMSwzLDYwLAorCTMzLDI0LDk4LDAsMjAsMTMsOTksMTQwLDgsMCw4NCwxNDIsCisJMCwwLDAsMCw1OSwwLDEwNCwxNiw1LDAsOTgsNDQsCisJNTcsMCw2NCwxNiwxMjgsMTYsMywwLDIsMTMxLDEsNjAsCisJMzMsOCwzNCwwLDEyOCwxMzEsMzQsMTQwLDAsMCwwLDAsCisJOCwwLDY0LDAsMCwwLDAsMCw0NCwxMzMsMTMwLDE0MywKKwkwLDAsMCwwLDQ4LDAsNjQsMTYsNiwwLDEzMiwzOCwKKwk0LDAsMTMxLDE1MCwyLDEzMSwyLDYwLDY4LDIwNyw2NiwxNDgsCisJMCwwLDAsMCw2LDAsOTgsMjAsMzMsMzIsMCwwLAorCTAsMCwxMzAsMTQyLDQ4LDEyOSwxMzEsMTQzLDAsMCwwLDAsCisJMzgsMTYsNjcsMCwxLDAsNjgsNDQsNjcsMSwxMjgsMTYsCisJMzMsMzIsMTkyLDIsMTE0LDQyLDE5MiwxMiwzMyw0MCwxMjgsMiwKKwkxMzAsMjAsMTkyLDgsMzMsMzIsNjQsMiw0NCwxMzMsMTMwLDE0MywKKwkwLDAsMCwwLDI3LDAsNjQsMTYsNiwwLDEzMiwzOCwKKwk0LDAsMTMxLDE1MCwyLDEzMSwyLDYwLDY4LDIwNyw2NiwxNDgsCisJMCwwLDAsMCw2LDAsOTgsMjAsMzMsMzIsMCwwLAorCTAsMCwxMzAsMTQyLDQ4LDEyOSwxMzEsMTQzLDAsMCwwLDAsCisJMzgsMTYsNjcsMCwxLDAsNjgsNDQsNSwwLDEyOCwxNiwKKwkzMywzMiwxOTIsMiwxMTQsNDIsMTkyLDEyLDMzLDQwLDEyOCwyLAorCTEzMCwyMCwxOTIsOCwzMywzMiw2NCwyLDYsMCwxMzIsMzgsCisJMCwxNjMsNiw2MCwxNDAsMSwxOTgsMTQwLDAsMCwwLDAsCisJMjQ3LDI0LDE5MiwxMiwzMyw0MCwxOTIsMiwxMzAsMjAsMTkyLDgsCisJMzMsMzIsNjQsMiw2LDAsMTMyLDM4LDAsMTYzLDYsNjAsCisJMTQwLDEsMTk4LDE0MCwwLDAsMCwwLDI0NywyNCwxOTIsMTIsCisJMzMsNDAsMTkyLDIsMjAzLDI0LDE5MiwxMiwzMywzMiwxMjgsMiwKKwkyMCwxLDE2MywxNDIsMCwwLDAsMCwxNCwwLDk2LDE2LAorCTMzLDI0MCw2NCwwLDMzLDMyLDEyOCwyLDE2LDAsMTY2LDM5LAorCTE4LDAsNjksMTUwLDAsMCwwLDAsOSwyNDgsOTYsMCwKKwkzMyw1NiwxOTIsMyw2LDAsNjQsMTYsMzMsMzIsNjQsMiwKKwkyOCwxLDE2MiwxNDIsMCwwLDAsMCwxLDAsNjYsMzYsCisJMTMwLDIwLDE5Miw4LDI4LDEsMTYyLDE3NCwxMzIsMCwxOTMsNywKKwk3LDAsMiwzNiw0LDAsMTMxLDE1MCwyLDEzMSwyLDYwLAorCTY4LDIwNyw2NiwxNDgsMCwwLDAsMCw2LDAsOTgsMjAsCisJMzMsMzIsMCwwLDAsMCwxMzAsMTQyLDQ4LDEyOSwxMzEsMTQzLAorCTAsMCwwLDAsMzgsMTYsNjcsMCwxLDAsNjgsNDQsCisJOSwwLDEyOCwxNiwyNTUsMjU1LDksMzYsNDQsMTMzLDEzMCwxNDMsCisJMCwwLDAsMCwyNDYsMCw2NCwxNiwzMywzMiwxOTIsMiwKKwkxMTQsNDIsMTkyLDEyLDMzLDQwLDEyOCwyLDEzMCwyMCwxOTIsOCwKKwkzMywzMiw2NCwyLDEwLDAsMjAxLDIzLDAsMCwwLDAsCisJOCwwLDE5MiwxOCwwLDAsMCwwLDM2LDEzMywxMzAsMTQzLAorCTAsMCwwLDAsOCwwLDY0LDE2LDEsMCwxOSwzNiwKKwk4MCwxMzMsMTQ3LDE0MywxNTksMTksMTkyLDgsMCwwLDAsMCwKKwkwLDEsMTYyLDE0Miw4MCwxMzMsMTQ3LDE0MywxLDAsNjYsMzYsCisJMCwxLDE2MiwxNzQsODQsMTMzLDEzMCwxNDMsMCwwLDAsMCwKKwkzNSwxNiw4MywwLDI1NSwyNTUsNjYsMzYsMTcsMCw2NiwxNjIsCisJODQsMTMzLDEzMCwxNDMsMzMsMTM2LDk2LDIsNDIsMTYsMzQsMiwKKwkxNSwwLDY0LDE2LDY0LDE4LDE3LDAsMiwxMzEsOCw2MCwKKwkxOTIsMjQ2LDgsMzcsMzMsMTI4LDcyLDAsNSwwLDU0LDE4LAorCTAsMCwwLDAsMjQ3LDIyLDE5MiwxMiwzMywzMiwwLDIsCisJMjEyLDAsNjQsMTYsMzMsMTYsMCwwLDg0LDEzMywxMzAsMTQzLAorCTEsMCw0OSwzOCw0MiwxNiwzNCwyLDI0NiwyNTUsNjQsMjAsCisJMCwyLDE2LDM4LDg0LDEzMywxMzAsMTQzLDMzLDEzNiw5NiwyLAorCTQyLDE2LDM0LDIsNTUsMCw2NCwxNiw2NCwxOCwxNywwLAorCTIsMTMxLDksNjAsMTkyLDI0Niw0MSwzNywzMywxNTIsNzMsMCwKKwkzMywxMjgsNjQsMCwxOTIsMTg1LDE3LDAsNDEsMCw1NCwxOCwKKwkwLDAsMCwwLDIsMTMxLDIsNjAsMzMsMTYsODAsMCwKKwkyMTYsMjQ3LDY2LDE0MCwwLDAsMCwwLDE1LDAsNjQsMTYsCisJMzMsMzIsMTI4LDIsMTYsMCwxNjYsMzksMTgsMCw2OSwxNTAsCisJMCwwLDAsMCw5LDI0OCw2NCwwLDMzLDU2LDE5MiwyLAorCTgsMCw2NCwxNiwwLDAsMCwwLDIsMTMxLDIsNjAsCisJMzMsMTYsODAsMCwyMjQsMjQ3LDY2LDE0MCwwLDAsMCwwLAorCTEsMCw2NiwzNiwyMzAsMTksMTkyLDgsMzIsMSw5OCwxNzQsCisJNDQsMTMzLDEzMCwxNDMsMCwwLDAsMCw3LDAsNjQsMTYsCisJMywwLDgsMzYsMywxMzEsMiw2MCwzMywxNiw4NywwLAorCTIwLDEzLDY2LDE0MCwwLDAsMCwwLDYsMCw3MiwyMCwKKwkwLDAsMCwwLDMzLDMyLDk2LDIsNiwyMywxOTIsMTIsCisJMzMsNDAsNjQsMiwyMzYsMTksMTkyLDgsMCwyLDExNSwzOCwKKwkxNywwLDY2LDE0NiwwLDAsMCwwLDI1NSwyNTUsNjYsMzYsCisJMTcsMCw2NiwxNjIsMTcsMCw2NiwxNDYsMCwyLDExNSwzOCwKKwkwLDIsMTYsMzgsODQsMTMzLDEzMCwxNDMsMSwwLDQ5LDM4LAorCTQyLDE2LDM0LDIsMjA4LDI1NSw2NCwyMCwxMjgsMCwyNDcsMzgsCisJMjU0LDI1NSwyLDM2LDQsMCwxOTQsMjMsMzMsMzIsMTYwLDIsCisJMzMsNDAsNjQsMiw0NywxNiwxOTIsMTIsMzMsNDgsMTI4LDIsCisJMTcsMCw2NiwxNDYsMCwwLDAsMCwxMzUsMCw2NCwxNiwKKwkzMywzMiw2NCwyLDIyLDE5LDE5Miw4LDAsMCwwLDAsCisJMjYsMCwxOTQsMjMsMCwwLDAsMCwzNiwxMzMsMTMwLDE0MywKKwkwLDAsMCwwLDExLDAsNjQsMTYsMzMsMzIsMTYwLDIsCisJOSwwLDE5MiwxOCwxLDAsOSwzNiwxNywwLDczLDE2MiwKKwkyLDEzMSw0LDYwLDE5MiwyNDYsMTMyLDM2LDYsMjMsMTkyLDEyLAorCTMzLDQwLDY0LDIsMTIxLDAsNjQsMTYsMzMsMTYsMCwwLAorCTMzLDMyLDE2MCwyLDMzLDQwLDY0LDIsNDcsMTYsMTkyLDEyLAorCTMzLDQ4LDEyOCwyLDM2LDEzMywxMzAsMTQzLDAsMCwwLDAsCisJMTEwLDAsNjQsMTYsMzMsMzIsNjQsMiwxMTEsMCwxOTIsMjIsCisJMSwwLDIsMzYsMTMwLDIwLDE5Miw4LDAsMCwwLDAsCisJODksMCwyMTQsMTksNjQsMTMwLDMwLDAsMiwxMzEsMiw2MCwKKwkzMywxNiw4MCwwLDIxNiwyNDcsNjYsMTQwLDAsMCwwLDAsCisJMTgsMCw2NCwxNiwzMywzMiwxMjgsMiwxNiwwLDE2NiwzOSwKKwkxOCwwLDY5LDE1MCwwLDAsMCwwLDksMjQ4LDY0LDAsCisJMzMsNTYsMTkyLDIsMTEsMCw2NCwxNiwzMywzMiw2NCwyLAorCTIsMTMxLDgsNjAsMTkyLDI0Niw4LDM3LDIsMTMxLDIsNjAsCisJMzMsMTYsODAsMCwyMjQsMjQ3LDY2LDE0MCwzMywyNCw4LDIsCisJMSwwLDY2LDM2LDMyLDEsOTgsMTcyLDEzMCwyMCwxOTIsOCwKKwkxNywwLDEyOCwxNjAsMzYsMTMzLDEzMCwxNDMsMCwwLDAsMCwKKwk0NCwwLDY0LDE2LDAsMCwwLDAsNDIsMCwxOTIsMTksCisJMCwwLDAsMCw0MCwwLDE5MiwxOCw2NCwxOCwzMCwwLAorCTIsMTMxLDksNjAsMTkyLDI0Niw0MSwzNywzMywxMjgsNzMsMCwKKwkyNDcsMjIsMTkyLDEyLDMzLDMyLDAsMiw2OSwwLDY0LDE2LAorCTMzLDE2LDAsMCwyLDEzMSw0LDYwLDI0NywyMiwxOTIsMTIsCisJMTkyLDI0NiwxMzIsMzYsNTcsMCw2NCwxNiwyLDAsMiwzNiwKKwkxNywwLDY2LDE2Miw0NCwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTcsMCw2NCwxNiwxOTIsMTcsMzAsMCwzLDEzMSwxLDYwLAorCTMzLDgsMzQsMCwyMCwxMywzNCwxNDAsMywwLDgsMzYsCisJNiwwLDcyLDIwLDAsMCwwLDAsMzMsMzIsMCwyLAorCTYsMjMsMTkyLDEyLDMzLDQwLDY0LDIsOTEsMjAsMTkyLDgsCisJMCwwLDAsMCwxNywwLDY2LDE0NiwwLDAsMCwwLAorCTI1NSwyNTUsNjYsMzYsMTcsMCw2NiwxNjIsMTcsMCw2NiwxNDYsCisJMiwxMzEsNCw2MCwxOTIsMjQ2LDEzMiwzNiw2LDIzLDE5MiwxMiwKKwkzMyw0MCw2NCwyLDIyLDE5LDE5Miw4LDAsMCwwLDAsCisJNDQsMTMzLDEzMCwxNDMsMCwwLDAsMCw3LDAsNjQsMTYsCisJMTkyLDE3LDMwLDAsMywxMzEsMSw2MCwzMyw4LDM0LDAsCisJMjAsMTMsMzQsMTQwLDMsMCw5LDM2LDIyLDAsNzMsMjAsCisJMCwwLDAsMCwxLDAsOCwzNiwxNywwLDcyLDE2MiwKKwk2NCwzNCwzMCwwLDIsMTMxLDksNjAsMTkyLDI0Niw0MSwzNywKKwkzMywzMiwxMzcsMCwxOCwxOSwxOTIsOCwzMyw0MCw2NCwyLAorCTM2LDEzMywxMzAsMTQzLDAsMCwwLDAsMTAsMCw2NCwxNiwKKwkwLDAsMCwwLDgsMCwxOTIsMTksMSwwLDgsMzYsCisJMTcsMCw3MiwxNjIsMiwxMzEsNCw2MCwxOTIsMjQ2LDEzMiwzNiwKKwkxOCwxOSwxOTIsOCwzMyw0MCw2NCwyLDEzMywyMCwxOTIsOCwKKwkzMywxNiwwLDAsMTcsMCw2NCwxNjIsMzMsMzIsNjQsMiwKKwkxNTIsMjEsMTkyLDEyLDAsMCwwLDAsMSwwLDIsMzYsCisJNTIsMCw2NCwxNiwwLDAsMCwwLDE1MiwwLDE2MiwxNDIsCisJMCwwLDAsMCwxLDAsNjYsMzYsMTUyLDAsMTYyLDE3NCwKKwkxNTYsMCwxNjIsMTQyLDE2OCwwLDE2MywxNDIsMSwwLDY2LDM2LAorCTE1NiwwLDE2MiwxNzQsMTI4LDAsMTY5LDE0MywwLDAsMCwwLAorCTMzLDI0LDEwNSwwLDE2MywyMCwxOTIsOCwxNjgsMCwxNjMsMTc0LAorCTE1MiwwLDE2MiwxNDIsMTYwLDAsMTYzLDE0MiwxLDAsNjYsMzYsCisJMSwwLDk5LDM2LDE1MiwwLDE2MiwxNzQsMTYwLDAsMTYzLDE3NCwKKwk5NiwwLDE2OCwxNDMsMCwwLDAsMCw4LDAsMiwxNDEsCisJMjU1LDI1NSw5LDM2LDQsMCw3MywxNiwwLDAsMCwwLAorCTgsMCw0LDE0MSwxNTIsMjEsMTkyLDEyLDAsMCwwLDAsCisJMTIwLDAsMTY4LDE0MywxMTIsMCwxNjksMTQzLDEsMCw4LDM3LAorCTEyMCwwLDE2OCwxNzUsMTM2LDAsMTY5LDE3NCw5NiwwLDE2OCwxNDMsCisJOCwxMjgsMiw1MiwwLDAsMCwxNjUsMiwwLDIsMTY1LAorCTEwNCwwLDE2OSwxNDMsOCwwLDIsMzYsMiwwLDM0LDE2NSwKKwk0LDAsNDAsMTQxLDk2LDAsMTY5LDE0MywxMDQsMCwxNjgsMTc1LAorCTQsMCw0MSwxNDEsMTIwLDAsMTY4LDE0Myw5NiwwLDE2OSwxNzUsCisJODgsMCwxNjksMTQzLDAsMCwwLDAsNDIsMTYsOSwxLAorCTI0MywyNTMsNjQsMjAsMCwwLDAsMCw5NiwwLDE2OCwxNDMsCisJNDQsMCwxNjMsMTQyLDEyMCwwLDE2OCwxNzQsMTA0LDAsMTY5LDE0MywKKwkwLDAsMCwwLDEyNCwwLDE2OSwxNzQsMCwwLDk4LDE0OCwKKwkwLDAsMCwwLDAsMTYsNjYsNDgsNDMsMCw2NCwxNiwKKwkwLDAsMCwwLDIsMCw5OCwxNDgsMCwwLDAsMCwKKwkzOSwwLDY0LDIwLDAsMCwwLDAsMCwwLDIsMTQ5LAorCTAsMCwwLDAsMzUsMCw2NCwyMCwwLDAsMCwwLAorCTIsMCwyLDE0OSw4LDAsMywzNiwyNTUsMjU1LDY2LDQ4LAorCTMwLDAsNjcsMjAsMCwwLDAsMCwxMzYsMCwxNjIsMTQyLAorCTAsMCwwLDAsMTIsMCw2NiwxNDAsMCwwLDAsMCwKKwkwLDEyOCw2Niw0OCwyMywwLDY0LDIwLDAsMCwwLDAsCisJMTY0LDAsMTYyLDE0Miw0NCwwLDE2MywxNDIsMSwwLDY2LDM2LAorCTE2NCwwLDE2MiwxNzQsOCwwLDEwNCwxNzIsMTM2LDAsMTYyLDE0MiwKKwkwLDAsMCwwLDgsMCwyLDE3Myw0NCwwLDE2MywxNDIsCisJMTYsMTYsMiwzNiwyLDAsOTgsMTY0LDAsMCwxNjIsMTQyLAorCTAsMCwwLDAsNSwwLDY0LDIwLDAsMCwwLDAsCisJMTY0LDcsMTkyLDEyLDAsMCwwLDAsMjM5LDIwLDE5Miw4LAorCTAsMCwwLDAsOCwwLDE2MiwxNDIsMCwwLDAsMCwKKwkwLDAsNjQsMTcyLDE4MCwwLDE5MSwxNDMsMTc2LDAsMTkwLDE0MywKKwkxNzIsMCwxODMsMTQzLDE2OCwwLDE4MiwxNDMsMTY0LDAsMTgxLDE0MywKKwkxNjAsMCwxODAsMTQzLDE1NiwwLDE3OSwxNDMsMTUyLDAsMTc4LDE0MywKKwkxNDgsMCwxNzcsMTQzLDE0NCwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTE4NCwwLDE4OSwzOSwyMTYsMjU1LDE4OSwzOSwyOCwwLDE3NywxNzUsCisJMzMsMTM2LDEyOCwwLDMyLDAsMTc4LDE3NSwzMywxNDQsMTYwLDAsCisJOTYsMTI4LDEzMiwzOSw2LDAsMzcsMzgsMjQsMCwxNzYsMTc1LAorCTEwNCwxMjgsMTQ0LDM5LDM2LDAsMTkxLDE3NSwzMSwyMSwxOTIsMTIsCisJMzMsNDgsMCwyLDEwOCwxMjgsMTMyLDM5LDMzLDQwLDMyLDIsCisJMzEsMjEsMTkyLDEyLDMzLDQ4LDAsMiwxMCwwLDY0LDI2LAorCTMzLDEyOCwwLDAsMTE2LDEyOCwxMzIsMzksMzMsMTYsMTcsMiwKKwkxMiwwLDY5LDE0NCwwLDAsMCwwLDE1LDYzLDE5MiwxMiwKKwkxLDAsMTYsMzgsNDIsMTYsMTgsMiwyNDgsMjU1LDY0LDIwLAorCTAsMCwwLDAsMTI0LDEyOCwxMzIsMzksMTUsNjMsMTkyLDEyLAorCTAsMCwwLDAsMzYsMCwxOTEsMTQzLDMyLDAsMTc4LDE0MywKKwkyOCwwLDE3NywxNDMsMjQsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk0MCwwLDE4OSwzOSwyMDgsMjU1LDE4OSwzOSw0MCwwLDE5MSwxNzUsCisJMiwwLDE2MiwxNDQsMCwwLDE2MywxNDQsMSwwLDE2NywxNDQsCisJMTYsMCwxNjIsMTc1LDMsMCwxNjIsMTQ0LDMzLDY0LDEyOCwwLAorCTIwLDAsMTYyLDE3NSw0LDAsMTYyLDE0NCwyLDEzMSw0LDYwLAorCTY4LDEzMSwxMzIsMzYsMjQsMCwxNjIsMTc1LDUsMCwxNjIsMTQ0LAorCTMzLDQwLDAsMSwzMiwwLDE2NiwxNzUsMzMsNDgsOTYsMCwKKwkxNSw2MywxOTIsMTIsMjgsMCwxNjIsMTc1LDQwLDAsMTkxLDE0MywKKwk0OCwwLDE4OSwzOSw4LDAsMjI0LDMsMCwwLDAsMCwKKwkyNDgsMjU1LDE4OSwzOSwxMzYsMCwxMzUsMTQwLDI1NSwyNTUsMTYzLDM2LAorCTEyLDAsMTYwLDE2LDMzLDQ4LDIyNCwwLDI1NSwyNTUsNSwzNiwKKwkxMiwwLDE5NCwxNDAsMCwwLDAsMCwwLDEyOCw2Niw0OCwKKwk4LDAsNjQsMjAsMzMsMTYsMCwwLDI1NSwyNTUsOTksMzYsCisJMCwwLDE5MiwxNzIsNCwwLDE5OCwxNDAsMjQ3LDI1NSwxMDEsMjAsCisJMCwwLDAsMCwxMzYsMCwxMzQsMTcyLDMzLDE2LDIyNCwwLAorCTgsMCwyMjQsMyw4LDAsMTg5LDM5LDIyNCwyNTUsMTg5LDM5LAorCTE2LDAsMTc2LDE3NSwzMywxMjgsMTYwLDAsMjgsMCwxOTEsMTc1LAorCTI0LDAsMTc4LDE3NSwzMywwLDEyOCwyMCwyMCwwLDE3NywxNzUsCisJODQsMTMzLDEzMCwxNDMsODAsMTMzLDEzMSwxNDMsMCwwLDAsMCwKKwkzNSwxNiw2NywwLDE3LDAsMiwxNjIsODAsMTMzLDE0NSwxNDMsCisJODQsMTMzLDEzMCwxNDMsMCwwLDAsMCw0MiwxNiwzNCwyLAorCTE5LDAsNjQsMTYsNjQsMTgsMTcsMCwyLDEzMSwzLDYwLAorCTE5MiwyNDYsOTksMzYsMzMsMTQ0LDY3LDAsMzMsMzIsNjQsMiwKKwk2LDIzLDE5MiwxMiwzMyw0MCwwLDIsNiwwLDY0LDIwLAorCTAsMCwwLDAsMTcsMCwyLDE0NiwwLDAsMCwwLAorCTI1NSwyNTUsNjYsMzYsMTcsMCwyLDE2MiwxNywwLDIsMTQ2LAorCTg0LDEzMywxMzAsMTQzLDEsMCw0OSwzOCw0MiwxNiwzNCwyLAorCTI0MiwyNTUsNjQsMjAsMCwyLDgyLDM4LDE3LDAsMiwxNDYsCisJMTQ0LDIxLDE5Miw4LDAsMCwwLDAsMzYsMTMzLDEzMCwxNDMsCisJMCwwLDAsMCwyNSwwLDY0LDE2LDEsMCwyLDM2LAorCTAsMCwxMzAsMTQwLDAsMCwwLDAsMjAsMCw2NCwxNiwKKwkyLDAsMiwzNiwxNywwLDIsMTYyLDYsMjMsMTkyLDEyLAorCTMzLDQwLDAsMiwxOSwwLDY0LDE2LDMzLDE2LDAsMCwKKwkyLDEzMSw0LDYwLDE5MiwyNDYsMTMyLDM2LDYsMjMsMTkyLDEyLAorCTMzLDQwLDAsMiw3LDAsNjQsMjAsMCwwLDAsMCwKKwkxNywwLDIsMTQ2LDAsMCwwLDAsMjU1LDI1NSw2NiwzNiwKKwkxNywwLDIsMTYyLDE3LDAsMiwxNDYsMCwwLDAsMCwKKwkxNDQsMjEsMTkyLDgsMSwwLDIsMzYsMSwwLDIsMzYsCisJMTcsMCwyLDE2Miw2LDIzLDE5MiwxMiwzMyw0MCwwLDIsCisJMjgsMCwxOTEsMTQzLDI0LDAsMTc4LDE0MywyMCwwLDE3NywxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywzMiwwLDE4OSwzOSwKKwkwLDAsMCwwLDAsMCwwLDAsMCwxMjksOSw1MiwKKwkxNiwwLDEzMCwxNDQsMiwxMzEsMyw2MCwxOTIsMjQ2LDk5LDM2LAorCTY0LDE4LDIsMCwzMyw1Niw2NywwLDE0MCwwLDIzMCwxNDAsCisJMCwxLDgsMzYsNCwwLDE5NywxNDAsMCwwLDEzMSwxNDAsCisJMCwwLDEyOCwxNzIsMTIsMCwxMzcsMTcyLDQsMCwxNjQsMTcyLAorCTEyLDAsMjAwLDE3MiwzMyw0OCwxNjAsMCwyMTYsMCwyMjYsMTQwLAorCTMzLDQwLDEyOCwwLDEsMCw2NiwzNiwwLDEyOCw5OSw0OCwKKwk0LDAsOTYsMjAsMjE2LDAsMjI2LDE3Miw0LDAsMTMyLDE0MCwKKwkxNjEsMjEsMTkyLDgsMCwwLDAsMCw4LDAsMjI0LDMsCisJMTQwLDAsMjMwLDE3MiwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCw4LDAsMjI0LDMsMCwwLDAsMCwKKwkxNzIsMCwxMjgsMTcyLDE3NiwwLDEyOCwxNzIsMTgwLDAsMTI4LDE3MiwKKwkxODQsMCwxMjgsMTcyLDE4OCwwLDEyOCwxNzIsMTkyLDAsMTI4LDE3MiwKKwkxOTYsMCwxMjgsMTcyLDIwMCwwLDEyOCwxNzIsMjA0LDAsMTI4LDE3MiwKKwkyMDgsMCwxMjgsMTcyLDIxMiwwLDEyOCwxNzIsMjI0LDAsMTI4LDE3MiwKKwk4LDEsMTI4LDE3Miw0LDEsMTI4LDE3MiwyMzYsMCwxMjgsMTcyLAorCTI0MCwwLDEyOCwxNzIsMjMyLDAsMTI4LDE3MiwyNDQsMCwxMjgsMTcyLAorCTgsMCwyMjQsMywyNDgsMCwxMjgsMTcyLDIyNCwyNTUsMTg5LDM5LAorCTE2LDAsMTc2LDE3NSwzMywxMjgsMTI4LDAsMjAsMCwxNzcsMTc1LAorCTAsMiwxNywzNiwyNCwwLDE5MSwxNzUsMTMsOCwxOTIsMTIsCisJMCw0OCw0LDM2LDI1NSwzMSwzLDYwLDI1NSwyNTUsOTksNTIsCisJMzMsMzIsMCwwLDM2LDE2LDY3LDAsMCwxMjgsMyw2MCwKKwkzNyw0MCw2NywwLDMzLDI0LDE2MCwwLDAsMTI4LDYsNTIsCisJMSwwLDEzMiwzNiwyNCwwLDk4LDM2LDAsMCw5NiwxNjQsCisJMiwwLDEwMiwxNjQsNCwwLDk4LDE3MiwzMywyNCw2NCwwLAorCTQyLDE2LDE0NSwwLDI0OSwyNTUsNjQsMjAsMSwwLDEzMiwzNiwKKwkyNTUsMjU1LDEzMiwzNiw2NCwxNiwxNywwLDMzLDE2LDgxLDAsCisJMTkyLDE2LDIsMCwzMywxNiw2OSwwLDQ4LDAsMTYzLDM2LAorCTIzNiwyNTUsNjksMTcyLDEwOCwwLDMsMTc0LDEwNCwwLDMsMTc0LAorCTk2LDAsNSwxNzQsMTAwLDAsMiwxNzQsMjQsMCwxOTEsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTMyLDAsMTg5LDM5LDI0OCwyNTUsMTg5LDM5LDAsMzIsMTQsNjAsCisJNCwwLDE3NywxNzUsNywwLDE3LDYwLDAsMCwxNzYsMTc1LAorCTQsMCwxNiw2MCwyLDEzMSwyNSw2MCwxOTIsMjQ2LDU3LDM5LAorCTAsMSwxNSwzNiwxMDgsMCwxNTIsMTQwLDEwNCwwLDEzNywxNDAsCisJMTc2LDAsMTQwLDE0MCwxODAsMCwxNDEsMTQwLDk0LDAsNTYsMTcsCisJMCwwLDAsMCw0LDAsNDMsMTQxLDAsMCwwLDAsCisJMzcsMTYsMTEwLDEsMCwwLDY2LDE0OCwwLDAsMCwwLAorCTAsMTI4LDY2LDQ4LDg2LDAsNjQsMTYsMzcsMTYsNDYsMSwKKwkwLDAsNjcsMTQwLDAsMCwwLDAsMzYsMTYsMTEzLDAsCisJNzYsMCw4MCwyMCwwLDMyLDk4LDQ4LDQxLDAsNjQsMjAsCisJMTUsMCw5OCw0OCwxODgsMCwxMzAsMTQwLDAsMCwwLDAsCisJMSwwLDY2LDM2LDE4OCwwLDEzMCwxNzIsMCw4LDk4LDQ4LAorCTYsMCw2NCwxNiwwLDQsOTgsNDgsMTkyLDAsMTMwLDE0MCwKKwkwLDAsMCwwLDEsMCw2NiwzNiwxOTIsMCwxMzAsMTcyLAorCTAsNCw5OCw0OCw2LDAsNjQsMTYsMCwyLDk4LDQ4LAorCTE5NiwwLDEzMCwxNDAsMCwwLDAsMCwxLDAsNjYsMzYsCisJMTk2LDAsMTMwLDE3MiwwLDIsOTgsNDgsNiwwLDY0LDE2LAorCTAsMSw5OCw0OCwyMDAsMCwxMzAsMTQwLDAsMCwwLDAsCisJMSwwLDY2LDM2LDIwMCwwLDEzMCwxNzIsMCwxLDk4LDQ4LAorCTYsMCw2NCwxNiwzMiwwLDk4LDQ4LDIwNCwwLDEzMCwxNDAsCisJMCwwLDAsMCwxLDAsNjYsMzYsMjA0LDAsMTMwLDE3MiwKKwkzMiwwLDk4LDQ4LDYsMCw2NCwxNiwxNSwwLDk4LDQ4LAorCTIwOCwwLDEzMCwxNDAsMCwwLDAsMCwxLDAsNjYsMzYsCisJMjA4LDAsMTMwLDE3MiwxNSwwLDk4LDQ4LDIxMiwwLDEzMSwxNDAsCisJOCwwLDM3LDE0MSwzMywyNCw5OCwwLDIxMiwwLDEzMSwxNzIsCisJMTcsMCwxNjIsMTQ0LDEsMCwxNDAsMzcsMjU1LDI1NSw2NiwzNiwKKwkxNywwLDE2MiwxNjAsMjUsMCw2NCwyMCwzNywyNCw0NiwxLAorCTE2LDAsMTYyLDE0NCwxLDAsMTczLDM3LDY0LDE4LDIsMCwKKwkzMyw2NCw4OSwwLDE0MCwwLDcsMTQxLDAsMTI5LDEwLDUyLAorCTQsMCwyMzAsMTQwLDAsMCwxNjMsMTQwLDAsMCwxNjAsMTcyLAorCTEyLDAsMTcwLDE3Miw0LDAsMTk3LDE3MiwxMiwwLDIzOSwxNzIsCisJMzMsNTYsMTkyLDAsMjE2LDAsMiwxNDEsMzMsNDgsMTYwLDAsCisJMSwwLDY2LDM2LDAsMTI4LDk5LDQ4LDQsMCw5NiwyMCwKKwkyMTYsMCwyLDE3Myw0LDAsMTY1LDE0MCwxMTQsMjIsMTkyLDgsCisJMCwwLDAsMCwxNDAsMCw3LDE3MywzNywyNCw0NiwxLAorCTAsMTI4LDIsNjAsMCwwLDk4LDE3Miw0MCwyMiwxOTIsOCwKKwkzMyw3Miw5NiwxLDEwNCwwLDEzNywxNzIsMTc2LDAsMTQwLDE3MiwKKwkxODAsMCwxNDEsMTcyLDQsMCwxNzcsMTQzLDAsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw4LDAsMTg5LDM5LDIyNCwyNTUsMTg5LDM5LAorCTE2LDAsMTc2LDE3NSwzMywxMjgsMTI4LDAsMjQsMCwxOTEsMTc1LAorCTIwLDAsMTc3LDE3NSw0NCwwLDE3LDE0MiwwLDAsMCwwLAorCTAsMCwzNCwxNTAsMCwwLDAsMCwwLDMyLDY2LDQ4LAorCTg5LDAsNjQsMTYsMCwwLDAsMCwyLDAsMzQsMTUwLAorCTAsMCwwLDAsMCwxLDY2LDQ4LDg0LDAsNjQsMjAsCisJMCwwLDAsMCwyNywyMiwxOTIsMTIsMCwwLDAsMCwKKwkxMDQsMCw0LDE0MiwwLDAsMCwwLDIsMCwxMzAsMTQ4LAorCTAsMTI4LDMsNTIsMjU1LDI1NSw2Niw0OCw3NSwwLDY3LDE2LAorCTAsMCwwLDAsMjI0LDAsMiwxNDIsMCwwLDAsMCwKKwkxLDAsNjYsMzYsMjI0LDAsMiwxNzQsNCwwLDM2LDE3NCwKKwkwLDAsMTI4LDE2NCw0LDAsMTMwLDE0MCwwLDAsMCwwLAorCTAsMCw2NCwxNjQsMCwwLDIsMTQyLDAsMCwwLDAsCisJNTEsMCw2NCwxNiwwLDMzLDIsMzYsMiwwLDM0LDE1MCwKKwkwLDAsMCwwLDQ3LDAsNjQsMTYsMCwzMywyLDM2LAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTIsMCwzNCwxNTAsMCwwLDAsMCwyMTEsMjU1LDY0LDIwLAorCTAsMzMsMiwzNiwyLDAsMzQsMTY2LDAsMCwyLDE0MiwKKwkwLDAsMCwwLDUsMCw2NCwxNiwwLDAsMCwwLAorCTgsMCwyLDE0MiwwLDAsMCwwLDI0MiwyMiwxOTIsOCwKKwkwLDAsNjQsMTcyLDE2NCw3LDE5MiwxMiwwLDAsMCwwLAorCTI0LDAsMTkxLDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywzMiwwLDE4OSwzOSwxMDgsMCwxMzMsMTQwLAorCTAsMCwwLDAsNCwwLDE2MiwxNDAsMCwwLDAsMCwKKwk0LDAsNjcsMTQwLDEwNCwwLDEzMCwxNDAsMCwwLDAsMCwKKwk1LDAsOTgsMjAsMzMsMTYsMTYwLDAsMTg0LDAsMTMxLDE0MCwKKwkzMywxNiwwLDAsMSwwLDk5LDM2LDE4NCwwLDEzMSwxNzIsCisJOCwwLDIyNCwzLDAsMCwwLDAsMjI0LDI1NSwxODksMzksCisJMTYsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCwyOCwwLDE5MSwxNzUsCisJMjQsMCwxNzgsMTc1LDIwLDAsMTc3LDE3NSwxMDgsMCwxOCwxNDIsCisJOCwxLDYsMTQyLDQ0LDAsMTcsMTQyLDQsMCw2NiwxNDIsCisJMTA0LDAsNywxNDIsNCwwLDY2LDE0MCwxOCwwLDE2MywxNDgsCisJMTcyLDAsNCwxNDIsMCwwLDAsMCw2LDAsNzEsMjAsCisJMjU1LDI1NSw5OSw0OCwxODQsMCwzLDE0MiwzMywxNiwwLDAsCisJMSwwLDk5LDM2LDE1NywyMywxOTIsOCwxODQsMCwzLDE3NCwKKwkzMyw0OCwxOTUsMCwxLDAsMTMwLDM2LDE3MiwwLDIsMTc0LAorCTgsMSw2LDE3NCw4LDAsMTYyLDE0MCw0LDEsMywxNDIsCisJMCwwLDcwLDE0NCwzMywzMiw2NCwyLDgsMCw2OSwxNzQsCisJMTIsMCw2NCwxNzQsMSwwLDE5NCw0OCwyLDAsNjQsMTYsCisJMSwwLDk4LDM2LDQsMSwyLDE3NCwwLDAsMiwxNDIsCisJMCwwLDAsMCwzNSwwLDY0LDIwLDAsMCwwLDAsCisJMTgsMCwxNjIsMTQ4LDAsMCwwLDAsMjU1LDI1NSw2Niw0OCwKKwkxMiwwLDY2LDE3NCwwLDAsMzQsMTUwLDAsMCwwLDAsCisJMCwzMiw2Niw0OCwyNCwwLDY0LDE2LDEyLDAsMiwzNiwKKwkyLDAsMzQsMTUwLDAsMCwwLDAsMCwxLDY2LDQ4LAorCTE5LDAsNjQsMjAsMTIsMCwyLDM2LDQsMCwyNDIsMTYsCisJMCwwLDAsMCwyNywyMiwxOTIsMTIsMzMsMzIsMCwyLAorCTEyLDAsMiwzNiwyLDAsNjYsMTY2LDEwNCwwLDQsMTQyLAorCTAsMCwwLDAsMCwwLDEyOCwxNjQsNCwwLDEzMCwxNDAsCisJMCwwLDAsMCwwLDAsNjQsMTY0LDAsMzMsMiwzNiwKKwk0LDAsMzYsMTc0LDE2NCw3LDE5MiwxMiwyLDAsMzQsMTY2LAorCTE1NCwyMywxOTIsOCwwLDAsMCwwLDE1NCwyMywxOTIsOCwKKwkyLDAsMTMwLDE2NCwwLDAsMzQsMTUwLDAsMCwwLDAsCisJMCwzMiw2Niw0OCw2OSwwLDY0LDE2LDEyLDAsMiwzNiwKKwk0LDAsMjQyLDE2LDAsMCwwLDAsMjcsMjIsMTkyLDEyLAorCTMzLDMyLDAsMiwxMiwwLDIsMzYsMiwwLDY2LDE2NiwKKwkxMDQsMCw0LDE0MiwwLDAsMCwwLDAsMCwxMjgsMTY0LAorCTQsMCwxMzAsMTQwLDAsMCwwLDAsMCwwLDY0LDE2NCwKKwk0LDAsMzYsMTc0LDIsMCwzNCwxNTAsMCwwLDAsMCwKKwk0NywwLDY0LDE2LDAsMzMsMiwzNiwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwyLDAsMzQsMTUwLAorCTAsMCwwLDAsMjExLDI1NSw2NCwyMCwwLDMzLDIsMzYsCisJMiwwLDM0LDE2Niw4LDAsMiwxNDIsMCwwLDAsMCwKKwkxNTQsMjMsMTkyLDgsMCwwLDY0LDE3MiwyLDAsNjYsMTY2LAorCTQsMCw2NywxNDIsMSwwLDIsMzYsMTA4LDAsMywxNzQsCisJMjgsMCwxOTEsMTQzLDI0LDAsMTc4LDE0MywyMCwwLDE3NywxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywzMiwwLDE4OSwzOSwKKwkyMTYsMjU1LDE4OSwzOSwyMCwwLDE3NywxNzUsMzMsMTM2LDEyOCwwLAorCTI0LDAsMTc4LDE3NSwyLDEzMSwxOCw2MCwxOTIsMTMxLDgyLDM4LAorCTI4LDAsMTc5LDE3NSwwLDEsMTksMzYsMzIsMCwxOTEsMTc1LAorCTE2LDAsMTc2LDE3NSwxMDQsMCw0OCwxNDIsMTA4LDAsMzQsMTQyLAorCTAsMCwwLDAsNCwwLDIsMjIsMCwwLDAsMCwKKwkyLDAsMiwxNTAsMjQ1LDIzLDE5Miw4LDAsMCwwLDAsCisJMiwwLDIsMTUwLDAsMCwwLDAsNywwLDY2LDQ4LAorCTExLDAsNjQsMjAsMzMsNDAsNjQsMiwyLDEzMSw0LDYwLAorCTE2MCwxMzEsMTMyLDM2LDIsMTMxLDcsNjAsMjUyLDEzMSwyMzEsMzYsCisJMTUsNjMsMTkyLDEyLDAsMiw2LDM2LDEsMCw0LDM2LAorCTMzLDQwLDY0LDIsMTg4LDcsMTkyLDEyLDAsMiw2LDM2LAorCTIsMCwyLDE1MCw0LDAsMywzNiw3LDAsNjYsNDgsCisJNDAsMCw2NywyMCwwLDEyOCwyLDUyLDgsMCwzLDE0MiwKKwkwLDAsMCwwLDE3LDAsOTgsMTQ0LDAsMCwwLDAsCisJMjU1LDI1NSw2NiwzNiwxNywwLDk4LDE2MCwxNywwLDk4LDE0NCwKKwkwLDAsMCwwLDMwLDAsNjQsMjAsMCwxMjgsMiw1MiwKKwkxODAsMCwzNCwxNDIsMzMsMzIsOTYsMCwxLDAsNjYsMzYsCisJMTgwLDAsMzQsMTc0LDE2LDAsMTMwLDE0NCwyLDEzMSwzLDYwLAorCTE5MiwyNDYsOTksMzYsNjQsMTgsMiwwLDMzLDU2LDY3LDAsCisJMTQwLDAsMjMwLDE0MCwwLDEyOSw4LDUyLDQsMCwxOTcsMTQwLAorCTAsMCwxMzEsMTQwLDAsMCwxMjgsMTcyLDEyLDAsMTM2LDE3MiwKKwk0LDAsMTY0LDE3MiwxMiwwLDIxMSwxNzIsMzMsNDgsMTYwLDAsCisJMjE2LDAsMjI2LDE0MCwzMyw0MCwxMjgsMCwxLDAsNjYsMzYsCisJMCwxMjgsOTksNDgsNCwwLDk2LDIwLDIxNiwwLDIyNiwxNzIsCisJNCwwLDEzMiwxNDAsMjIzLDIzLDE5Miw4LDAsMCwwLDAsCisJMTQwLDAsMjMwLDE3MiwwLDEyOCwyLDUyLDIsMCwyLDE2NiwKKwkwLDAsMCwxNjYsNCwwLDE2LDE0MiwxNzQsMjMsMTkyLDgsCisJMCwwLDAsMCw0NCwwLDM1LDE0MiwxMDQsMCw0OCwxNzQsCisJMCwwLDk4LDE0OCwwLDAsMCwwLDAsMzIsNjYsNTIsCisJMCwwLDk4LDE2NCwzMiwwLDE5MSwxNDMsMjgsMCwxNzksMTQzLAorCTI0LDAsMTc4LDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw0MCwwLDE4OSwzOSwwLDE2MywyLDYwLAorCTAsMSw2Niw1MiwwLDAsNjYsMTQwLDIsMTMxLDMsNjAsCisJMTkyLDYsOTksMzYsMjU1LDMsNjYsNDgsNjAsMCw2NiwzNiwKKwkwLDEyOCw2Niw1Miw4LDAsMjI0LDMsMCwwLDk4LDE3MiwKKwkyMDgsMjU1LDE4OSwzOSwyOCwwLDE3NywxNzUsMzMsMTM2LDEyOCwwLAorCTMyLDAsMTc4LDE3NSwzMywxNDQsMTYwLDAsMjQsMCwxNzYsMTc1LAorCTAsMTYzLDE2LDYwLDAsMTYzLDIsNjAsMTY0LDEsNjYsMTQwLAorCTAsMSwxNiw1NCw0NCwwLDE5MSwxNzUsNDAsMCwxODAsMTc1LAorCTQsMCw2NCwyMCwzNiwwLDE3OSwxNzUsNjAsMCwyLDM2LAorCTAsMTYzLDEsNjAsMTY0LDEsMzQsMTcyLDAsMTYzLDIsNjAsCisJMTY0LDEsNjYsMTQwLDAsMCwwLDAsMjIxLDUsNjYsNDAsCisJMywwLDY0LDIwLDIyMCw1LDIsMzYsMCwxNjMsMSw2MCwKKwkxNjQsMSwzNCwxNzIsMCwxNjMsMyw2MCwxNjQsMSw5OSwxNDAsCisJMjU1LDI1NSwyLDM2LDIxLDAsOTgsMjAsMCwwLDAsMCwKKwkxMjgsMTI4LDEzMCwxNDMsMCwwLDAsMCw1LDAsNjcsMjAsCisJMiwwLDUsMzYsMTMwLDExLDE5MiwxMiwwLDAsMCwwLAorCTEyOCwxMjgsMTMwLDE3NSwyLDAsNSwzNiwxMCwwLDYsMzYsCisJMTI4LDEyOCwxMzIsMTQzLDAsMTMxLDcsNjAsOCw5NiwyMzEsMzYsCisJMTU2LDExLDE5MiwxMiwxNiwwLDE2MCwxNzUsMCwwLDIsMTQyLAorCTIsMTMxLDMsNjAsMTkyLDYsOTksMzYsMjU1LDMsNjYsNDgsCisJNjYsMjQsMTkyLDgsNjQsMCw2NiwzNiwwLDE2MywyLDYwLAorCTE2NCwxLDY2LDE0MCwyLDEzMSwzLDYwLDE5Miw2LDk5LDM2LAorCTAsMTI4LDY2LDUyLDAsMCw5OCwxNzIsMjU1LDMxLDQsNjAsCisJMjU1LDI1NSwxMzIsNTIsMiwxMzEsMiw2MCwyMDgsNiw2NiwzNiwKKwkzNiwxNiw2OCwwLDAsMTYwLDUsNjAsMzcsMTYsNjksMCwKKwkyLDEzMSwzLDYwLDE3NiwxMiw5OSwzNiwyLDEzMSwxLDYwLAorCTE5Niw2LDMyLDE3MiwyLDEzMSwxLDYwLDIwMCw2LDM0LDE3MiwKKwkxMiwwLDIsMzYsMCwwLDk2LDE2NCwyLDEzMSwxLDYwLAorCTE3OCwxMiwzNCwxNjQsNiwwLDY1LDYsMzYsMTYsMTAwLDAsCisJMzcsMTYsNjksMCwyLDEzMSwxLDYwLDE4MCwxMiwzNCwxNzIsCisJOTksMjQsMTkyLDgsMjU1LDMxLDE4LDYwLDIsMTMxLDIsNjAsCisJMTc4LDEyLDY2LDE0OCwwLDAsMCwwLDAsMTI4LDY2LDUyLAorCTIsMTMxLDEsNjAsMTc4LDEyLDM0LDE2NCwyNTUsMzEsMTgsNjAsCisJMjU1LDI1NSw4Miw1NCwyLDEzMSwyLDYwLDE5Miw2LDY2LDM2LAorCTM2LDE2LDgyLDAsMCwxNjAsMjAsNjAsMzcsMTYsODQsMCwKKwkyLDEzMSwxLDYwLDE4NCwxMiwzNCwxNzIsMiwxMzEsMSw2MCwKKwkxODgsMTIsMzIsMTcyLDQ0LDAsMzQsMTQyLDAsMCwwLDAsCisJMCwwLDY2LDE0OCwyLDEzMSwxOSw2MCwxNzYsMTIsMTE1LDM4LAorCTAsMzIsNjYsNDgsMTUsMCw2NCwyMCwzMyw0MCwwLDAsCisJMiwxMzEsNCw2MCwxNjAsMTMxLDEzMiwzNiwyLDEzMSwxNiw2MCwKKwkxOTIsMTMxLDE2LDM4LDMzLDQwLDAsMiwyLDEzMSw3LDYwLAorCTI0LDEzMiwyMzEsMzYsMTUsNjMsMTkyLDEyLDcxLDIsNiwzNiwKKwkxLDAsNCwzNiwzMyw0MCwwLDIsMTg4LDcsMTkyLDEyLAorCTcxLDIsNiwzNiwzMyw0MCwwLDAsMzMsNDgsMCwwLAorCTM2LDE2LDExNCwyLDQ0LDAsMzUsMTQyLDM3LDE2LDg0LDAsCisJNCwwLDk4LDE3Miw0NCwwLDM2LDE0MiwyMDgsNyw3LDM2LAorCTEyOSw2NywxOTIsMTIsMiwwLDEzMiwzNiwxMiwwLDY0LDIwLAorCTAsMCwwLDAsNDQsMCwzNCwxNDIsMCwwLDAsMCwKKwkyLDAsNjksMTQ4LDIsMTMxLDQsNjAsMTUsNjMsMTkyLDEyLAorCTU2LDEzMiwxMzIsMzYsMjU1LDI1NSw0LDM2LDIsMTMxLDUsNjAsCisJMTkyLDEzMSwxNjUsMzYsMTg4LDcsMTkyLDEyLDc5LDIsNiwzNiwKKwk0NCwwLDM0LDE0MiwwLDMzLDMsMzYsMiwwLDY3LDE2NCwKKwk4LDAsMzQsMTQyLDAsMCwwLDAsMCwwLDY0LDE3MiwKKwk0NCwwLDE5MSwxNDMsNDAsMCwxODAsMTQzLDM2LDAsMTc5LDE0MywKKwkzMiwwLDE3OCwxNDMsMjgsMCwxNzcsMTQzLDI0LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNDgsMCwxODksMzksMjMyLDI1NSwxODksMzksCisJMTI4LDEyOCwxMzIsMTQzLDAsMTI4LDIsNTIsMTYsMCwxOTEsMTc1LAorCTIsMTMxLDEsNjAsMywwLDEyOCw0LDE3OCwxMiwzNCwxNjQsCisJMTc3LDExLDE5MiwxMiwwLDAsMCwwLDE2LDAsMTkxLDE0MywKKwkyNCwwLDE4OSwzOSw4LDAsMjI0LDMsMCwwLDAsMCwKKwk4LDAsMjI0LDMsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMjQwLDI1NSwyLDUyLDIsMTMxLDEsNjAsCisJMzMsOCwzNCwwLDIwOCwxMiwzMiwxNzIsMjQwLDI1NSw2NiwzNiwKKwkyNTEsMjU1LDY1LDQsMCwwLDAsMCwyLDEzMSwyLDYwLAorCTIwOCwxMiw2NiwzNiwwLDE2MywxLDYwLDEyLDEsMzIsMTcyLAorCTAsMTYzLDEsNjAsMjEyLDUsMzQsMTcyLDEsMCwyLDYwLAorCTE0OCwxMzMsMTI4LDE3NSwxNDQsMTMzLDEyOCwxNzUsMCwxNjMsMSw2MCwKKwk4LDAsMjI0LDMsMjE2LDUsMzQsMTcyLDAsMCwxMzYsMTQ4LAorCTQsMCwxMzgsMTQ4LDEsMCwyLDQ5LDM0LDAsNjQsMjAsCisJMiwwLDEzNywxNDgsMCwyNSwxMCwwLDM4LDI0LDEwNiwwLAorCTM4LDI0LDEwNSwwLDI0MCwyNTUsOTksNDgsMiwxMzEsMTUsNjAsCisJMjA4LDEyLDIzOSwzNywzMyw0MCwxMTEsMCw2OCwxMzMsMTQyLDE0MywKKwkxMjgsMCwzLDM2LDAsMCwxNjIsMTQwLDQsMCwxNzEsMTQ4LAorCTIzLDAsNjQsMTYsNDMsMTYsMTk0LDEsOSwwLDY0LDE2LAorCTYsMCwxNzIsMTQ4LDcsMCwxMSwyMSw4LDAsMTczLDE0OCwKKwk1LDAsNDQsMjEsMCwwLDAsMCwzLDAsNzcsMjEsCisJMTAsMCwxNjIsMTQ4LDgsMCwyMjQsMywwLDAsMCwwLAorCTI1NSwyNTUsOTksMzYsMTAsMCw5NiwxNiwyNDAsMjU1LDE2NSwzNiwKKwk0MywxNiwxNzUsMCwyMzgsMjU1LDY0LDE2LDAsMCwxNjIsMTQwLAorCTI0OCwxMjcsMjI5LDM3LDI0OCwxMjcsMTY1LDM2LDIxOCwyNCwxOTIsOCwKKwkwLDAsMTYyLDE0MCw4LDAsMjI0LDMsMjU0LDI1NSwyLDM2LAorCTgsMCwyMjQsMywyNTUsMjU1LDIsMzYsOCwwLDIyNCwzLAorCTAsMCwwLDAsMCwwLDEzNiwxNDgsNjgsMTMzLDE0MiwxNDMsCisJMSwwLDIsNDksNTMsMCw2NCwyMCwyLDAsMTM3LDE0OCwKKwkwLDEzMSwyLDYwLDQsMCwxMzgsMTQ4LDEyLDEsODksMTQwLAorCTAsMjUsMTAsMCwzOCwyNCwxMDYsMCwzOCwyNCwxMDUsMCwKKwkyNDAsMjU1LDk5LDQ4LDIsMTMxLDE1LDYwLDIwOCwxMiwyMzksMzcsCisJMzMsNTYsMTExLDAsMTI4LDAsMywzNiwwLDAsMjQ4LDE0MCwKKwk0LDAsMjM1LDE0OCw0MywxNiwyMTYsMSwxNCwwLDY0LDE2LAorCTYsMCwyMzYsMTQ4LDI0LDAsMTEsMjEsOCwwLDIzNywxNDgsCisJMjIsMCw0NCwyMSwyNTUsMTI3LDIsNjAsMjAsMCw3NywyMSwKKwkyNTUsMjU1LDY2LDUyLDQzLDE2LDIsMywyLDAsNjQsMTYsCisJMzMsMTYsMTk4LDEsMCwwLDIyNiwxNzIsMTAsMCwyMjksMTY0LAorCTgsMCwyMjQsMywwLDAsMiwzNiwzLDAsMCwyMywKKwkxLDAsNTcsMzUsMCwxMzEsMiw2MCwxMiwxLDg5LDE3MiwKKwkzMywxNiwxOTgsMSwwLDAsMjI2LDE3MiwxMCwwLDIyOSwxNjQsCisJNCwwLDIzMiwxNjQsNiwwLDIzMywxNjQsOCwwLDIzNCwxNjQsCisJOCwwLDIyNCwzLDEsMCwyLDM2LDI1NSwyNTUsOTksMzYsCisJMTEsMCw5NiwxNiwwLDAsMCwwLDI0MCwyNTUsMjMxLDM2LAorCTQzLDE2LDIzOSwwLDIyMSwyNTUsNjQsMTYsMCwwLDI0OCwxNDAsCisJMjQ4LDEyNywyMzEsMzcsMjQ4LDEyNywyMzEsMzYsOCwyNSwxOTIsOCwKKwkwLDAsMjQ4LDE0MCw4LDAsMjI0LDMsMCwwLDIsMzYsCisJMTQ0LDEzMywxMzAsMTQzLDAsMCwwLDAsMSwwLDY2LDMyLAorCTE0NCwxMzMsMTMwLDE3NSw4LDAsMjI0LDMsMjU1LDI1NSwyLDM2LAorCTgsMCwyMjQsMywwLDAsMCwwLDE2NCwxMjgsMTMwLDE0MywKKwkwLDAsMCwwLDcsMCwxMzAsMjAsMjMyLDI1NSwxODksMzksCisJMTYwLDEyOCwxMzAsMTQzLDIsMTMxLDMsNjAsMjA4LDEyLDk5LDM2LAorCTAsMTcsMiwwLDEwOCwyNSwxOTIsOCwzMywxNiw2NywwLAorCTQyLDE2LDEzMCwwLDMsMCw2NCwxNiwyNTUsMjU1LDIsMzYsCisJMTY0LDEyOCwxMjgsMTc1LDE2MCwxMjgsMTMwLDE3NSwxNjQsMTI4LDEzMCwxNDMsCisJMTYwLDEyOCwxMzEsMTQzLDM1LDQ4LDEzMCwwLDEsMCwxMDEsMzYsCisJMCwxNiwxNjIsNDAsMjUsMCw2NCwxNiwwLDI1LDUsMCwKKwk2OCwxMzMsMTM1LDE0MywyLDEzMSwyLDYwLDMzLDE2LDY3LDAsCisJMjA4LDEyLDY2LDE0MCwwLDAsMCwwLDQzLDE2LDIyNiwwLAorCTQsMCw2NCwxNiwwLDAsMCwwLDI1NSwyNTUsMTk4LDM2LAorCTYsMCwxOTIsMTYsMCwxNiwxNjIsNDAsMSwwLDE2NSwzNiwKKwkwLDE2LDE2Miw0MCwyNDMsMjU1LDY0LDIwLDE2LDAsOTksMzYsCisJMCwxNiwxNjIsNDAsNywwLDY0LDE2LDAsMjUsNSwwLAorCTIsMTMxLDIsNjAsMjA4LDEyLDY2LDM2LDE2MCwxMjgsMTMzLDE3NSwKKwkxNjQsMTI4LDEzMiwxNzUsMTA4LDI1LDE5Miw4LDMzLDE2LDk4LDAsCisJMzMsMTYsMCwwLDI1NSwyNTUsMywzNiwxNjQsMTI4LDEyOCwxNzUsCisJMTYwLDEyOCwxMzEsMTc1LDgsMCwyMjQsMywyNCwwLDE4OSwzOSwKKwkwLDAsMCwwLDAsMCwwLDAsMjQsMjU1LDE4OSwzOSwKKwkyMjgsMCwxOTEsMTc1LDIyNCwwLDE5MCwxNzUsMjIwLDAsMTgzLDE3NSwKKwkyMTYsMCwxODIsMTc1LDIxMiwwLDE4MSwxNzUsMjA4LDAsMTgwLDE3NSwKKwkyMDQsMCwxNzksMTc1LDIwMCwwLDE3OCwxNzUsMTk2LDAsMTc3LDE3NSwKKwkxOTIsMCwxNzYsMTc1LDQ0LDI4LDE5MiwxMiwwLDAsMCwwLAorCTE3NiwxMjgsMTMyLDM5LDE1LDYzLDE5MiwxMiwxLDAsMTcsMzYsCisJMjQsMCwxNzYsMzksMTY0LDY4LDE5MiwxMiwzMywzMiwwLDIsCisJMjQsMCwxNjIsMTMxLDAsMCwwLDAsMTM3LDI1LDE5Miw4LAorCTMyLDAsOCwzNiwwLDAsMiwxMzAsMzIsMCw4LDM2LAorCTI1MywyNTUsNzIsMTYsMSwwLDE2LDM4LDI1NSwyNTUsMTYsMzgsCisJOSwwLDgsMzYsMjQ5LDI1NSw3MiwxNiwxLDAsMTYsMzgsCisJMjU1LDI1NSwxNiwzOCwwLDAsMiwxNDYsMCwwLDAsMCwKKwkyMDgsMjU1LDY2LDM2LDEwLDAsNjYsNDQsMjcsMCw2NCwxNiwKKwkzMywzMiwwLDIsMzMsNDAsMCwwLDIxMiw2OCwxOTIsMTIsCisJMzMsNDgsMCwwLDAsMCwzLDE0NiwwLDAsMCwwLAorCTIwOCwyNTUsOTksMzYsMTAsMCw5OSw0NCw5LDAsOTYsMTYsCisJMzMsMTM2LDY0LDAsMSwwLDE2LDM4LDAsMCwyLDE0NiwKKwkwLDAsMCwwLDIwOCwyNTUsNjYsMzYsMTAsMCw2Niw0NCwKKwkyNTEsMjU1LDY0LDIwLDEsMCwxNiwzOCwyNTUsMjU1LDE2LDM4LAorCTAsMCwyLDEzMCwzMiwwLDgsMzYsMjUzLDI1NSw3MiwxNiwKKwkxLDAsMTYsMzgsMjU1LDI1NSwxNiwzOCw5LDAsOCwzNiwKKwkyNDksMjU1LDcyLDE2LDEsMCwxNiwzOCwyNTUsMjU1LDE2LDM4LAorCTAsMCwyLDEzMCwwLDAsMywxNDYsMCwwLDAsMCwKKwkyMiwwLDY0LDE2LDEwNCwwLDE4MCwzOSwzMiwwLDgsMzYsCisJMTksMCw3MiwxNiw5LDAsOCwzNiwxNywwLDcyLDE2LAorCTMyLDAsNSwzNiw5LDAsNCwzNiwyMDgsMjU1LDk4LDM2LAorCTEwLDAsNjYsNDQsMTIsMCw2NCwyMCwwLDAsMCwwLAorCTEsMCwxNiwzOCwwLDAsMTMxLDE2MiwwLDAsMiwxMzAsCisJMCwwLDMsMTQ2LDAsMCwwLDAsNSwwLDY0LDE2LAorCTEsMCwxNDgsMzgsMywwLDY5LDE2LDAsMCwwLDAsCisJMjQzLDI1NSw2OCwyMCwyMDgsMjU1LDk4LDM2LDAsMCwxMjgsMTYyLAorCTEwNCwwLDE4MCwzOSwwLDAsMiwxMzAsMzIsMCw4LDM2LAorCTI1MywyNTUsNzIsMTYsMSwwLDE2LDM4LDI1NSwyNTUsMTYsMzgsCisJOSwwLDgsMzYsMjQ5LDI1NSw3MiwxNiwxLDAsMTYsMzgsCisJMjU1LDI1NSwxNiwzOCwzMywyNDAsMCwyLDAsMCwxOTYsMTMxLAorCTAsMCwwLDAsMzIsNjksMTkyLDEyLDE0NCwwLDE5MCwxNzUsCisJMTEsMCw2NCwxNiwzMywzMiwxOTIsMywzMyw0MCwwLDAsCisJMjEyLDY4LDE5MiwxMiwzMyw0OCwwLDAsMzMsMTUyLDY0LDAsCisJMzMsMzIsMTkyLDMsMzMsNDAsMCwwLDQ0LDY5LDE5MiwxMiwKKwkxNiwwLDYsMzYsMjMyLDI1LDE5Miw4LDMzLDE0NCw2NCwwLAorCTI1NSwyNTUsMTgsMzYsMjU1LDI1NSwxOSwzNiwwLDAsMywxMzAsCisJMCwwLDIsMTQ2LDAsMCwwLDAsMTcsMCw5NiwxNiwKKwkzMiwwLDgsMzYsMTUsMCwxMDQsMTYsMSwwLDE2LDM4LAorCTI1NSwyNTUsMTYsMzgsMzIsMCw0LDM2LDAsMjIsMiwwLAorCTMsMjIsMiwwLDksMCw4LDM2LDgsMCw3MiwxNiwKKwkwLDAsMCwwLDEsMCwxNiwzOCwwLDAsMywxMzAsCisJMCwwLDIsMTQ2LDMsMCw5NiwxNiwwLDAsMCwwLAorCTI0NiwyNTUsMTAwLDIwLDAsMjIsMiwwLDAsMCwyLDEzMCwKKwkzMiwwLDgsMzYsMjUzLDI1NSw3MiwxNiwxLDAsMTYsMzgsCisJMjU1LDI1NSwxNiwzOCw5LDAsOCwzNiwyNDksMjU1LDcyLDE2LAorCTEsMCwxNiwzOCwyNTUsMjU1LDE2LDM4LDMzLDE4NCwwLDIsCisJMzMsMzIsMjI0LDIsMzMsNDAsMCwwLDIxMiw2OCwxOTIsMTIsCisJMzMsNDgsMCwwLDMzLDMyLDIyNCwyLDMzLDQwLDAsMCwKKwkxNiwwLDYsMzYsNDQsNjksMTkyLDEyLDMzLDE3Niw2NCwwLAorCTAsMCwyMjcsMTMwLDAsMCwwLDAsMTUsMCw5NiwxNiwKKwkzMywxNjgsNjQsMCwzMiwwLDgsMzYsMTIsMCwxMDQsMTYsCisJMzIsMCwzLDM2LDAsMCwyLDEzMCw5LDAsOCwzNiwKKwk4LDAsNzIsMTYsMCwwLDAsMCwxLDAsMTYsMzgsCisJMCwwLDIsMTMwLDAsMCwwLDAsMywwLDY0LDE2LAorCTAsMCwwLDAsMjQ4LDI1NSw2NywyMCwwLDAsMCwwLAorCTAsMCwxMzEsMTMwLDAsMCwwLDAsMTIxLDAsOTgsNDQsCisJMjQ0LDEsNjQsMTYsMTI4LDE2LDMsMCwyLDEzMSwxLDYwLAorCTMzLDgsMzQsMCwxNjAsMTM4LDM0LDE0MCwwLDAsMCwwLAorCTgsMCw2NCwwLDAsMCwwLDAsMSwwLDEzMSwxMzAsCisJMTA0LDAsMiwzNiwyNiwwLDk4LDE2LDEwNSwwLDk4LDQwLAorCTcsMCw2NCwxNiwxMTYsMCwyLDM2LDM0LDAsOTYsMTYsCisJOTgsMCwyLDM2LDExLDAsOTgsMTYsMCwwLDAsMCwKKwkyNiwyOCwxOTIsOCwwLDAsMCwwLDUsMCw5OCwxNiwKKwkxMTksMCw4LDM2LDI3LDAsMTA0LDE2LDMzLDE2LDMyLDIsCisJMjYsMjgsMTkyLDgsMCwwLDAsMCw0LDE2MiwyLDYwLAorCTMzLDE0NCw2NiwyLDIsMCwxMzAsMTMwLDAsMCwwLDAsCisJMjE0LDEsNjQsMjAsMCwwLDAsMCwyLDEzMSw0LDYwLAorCTEwOCwxMzIsMTMyLDM2LDAsMCw3MCwxNDYsODIsMjYsMTkyLDgsCisJMCwwLDAsMCwyLDAsMTMwLDEzMCwwLDAsMCwwLAorCTIwNSwxLDY0LDIwLDAsMCwwLDAsMiwxMzEsNCw2MCwKKwkxMjAsMTMyLDEzMiwzNiwwLDAsNzAsMTUwLDAsMCwwLDAsCisJMTUsNjMsMTkyLDEyLDMzLDQwLDY0LDIsMTI1LDI1LDE5Miw4LAorCTAsMCwwLDAsMzMsMTYsMzIsMiwzNywyNTUsNjQsMTYsCisJMjU1LDI1NSw0OSwzOCwwLDAsODAsMTQyLDIsMTMxLDQsNjAsCisJMTMyLDEzMiwxMzIsMzYsMzMsNDAsNjQsMiw0LDAsODIsMzgsCisJMTUsNjMsMTkyLDEyLDMzLDQ4LDAsMiwzMywxNiwzMiwyLAorCTI0NywyNTUsNjQsMjAsMjU1LDI1NSw0OSwzOCwxMjUsMjUsMTkyLDgsCisJMCwwLDAsMCwxLDAsMTMxLDEzMCwxMDQsMCwyLDM2LAorCTIzLDAsOTgsMTYsMTA1LDAsOTgsNDAsNywwLDY0LDE2LAorCTExNiwwLDIsMzYsMjUsMCw5NiwxNiw5OCwwLDIsMzYsCisJMTEsMCw5OCwxNiwwLDAsMCwwLDI2LDI4LDE5Miw4LAorCTAsMCwwLDAsNSwwLDk4LDE2LDExOSwwLDgsMzYsCisJMTcsMCwxMDQsMTYsMCwwLDAsMCwyNiwyOCwxOTIsOCwKKwkwLDAsMCwwLDQsMTYyLDIsNjAsMzMsMTQ0LDY2LDIsCisJMiwwLDEzMCwxMzAsMCwwLDAsMCwxNTgsMSw2NCwyMCwKKwkwLDAsMCwwLDEyNSwyNSwxOTIsOCwwLDAsODUsMTYyLAorCTIsMCwxMzAsMTMwLDAsMCwwLDAsMTUyLDEsNjQsMjAsCisJMCwwLDAsMCwxMjUsMjUsMTkyLDgsMCwwLDg1LDE2NiwKKwkxMjUsMjUsMTkyLDgsMCwwLDg1LDE3NCwwLDE2MywxNiw2MCwKKwkzMSwxNjMsMTcsNjAsMjU1LDI1NSw0OSw1NCwwLDAsMiwxNDIsCisJMCwwLDAsMCw0LDAsODIsMjAsMCwwLDAsMCwKKwkxODAsMTI4LDEzMiwzOSwxNSw2MywxOTIsMTIsMzMsNDAsMCwyLAorCTQsMCwxNiwzOCw0MywxNiw0OCwyLDI0NiwyNTUsNjQsMTYsCisJMCwwLDAsMCwxMjUsMjUsMTkyLDgsMCwwLDAsMCwKKwkzMywxNiwzMiwyLDIyOCwyNTQsNjQsMTYsMjU1LDI1NSw0OSwzOCwKKwkzMywzMiw5NiwyLDE2NCwzMiwxOTIsMTIsMzMsNDAsMTkyLDIsCisJMzMsMTYsMzIsMiwyNTEsMjU1LDY0LDIwLDI1NSwyNTUsNDksMzgsCisJMTI1LDI1LDE5Miw4LDAsMCwwLDAsMSwwLDEzMCwxMzAsCisJMCwwLDAsMCwxMTcsMSw2NCwyMCwzMywzMiwzMiwyLAorCTEzMywyOSwxOTIsMTIsMzMsNDAsOTYsMiwxMjUsMjUsMTkyLDgsCisJMCwwLDAsMCwzMywzMiw5NiwyLDMzLDQwLDMyLDIsCisJMjM0LDMxLDE5MiwxMiwzMyw0OCwxOTIsMiwxMjUsMjUsMTkyLDgsCisJMCwwLDAsMCwxLDAsMTMwLDEzMCwwLDAsMCwwLAorCTEwMywxLDY0LDIwLDMzLDE2LDMyLDIsMjAwLDI1NCw2NCwxNiwKKwkyNTUsMjU1LDQ5LDM4LDMzLDMyLDk2LDIsMzMsNDAsMTkyLDIsCisJMTgyLDI5LDE5MiwxMiwzMyw0OCwwLDIsMzMsMTYsMzIsMiwKKwkyNTAsMjU1LDY0LDIwLDI1NSwyNTUsNDksMzgsMTI1LDI1LDE5Miw4LAorCTAsMCwwLDAsMzMsMzIsMzIsMiwzMyw0MCw5NiwyLAorCTMzLDQ4LDE5MiwyLDM4LDMwLDE5MiwxMiwzMyw1NiwwLDIsCisJMTI1LDI1LDE5Miw4LDAsMCwwLDAsNSwxNjIsMiw2MCwKKwkwLDAsNjksMTQ0LDIsMTMxLDQsNjAsMTUsNjMsMTkyLDEyLAorCTE0NCwxMzIsMTMyLDM2LDEyNSwyNSwxOTIsOCwwLDAsMCwwLAorCTAsMTYzLDEsNjAsMjAsMSwzMiwxNzIsMTQsMCwzMiwxOCwKKwkzMywxMjgsMCwwLDE2NCw3LDE5MiwxMiwxLDAsMTYsMzgsCisJMTQzLDYzLDE5MiwxMiwwLDAsMCwwLDE0Myw2MywxOTIsMTIsCisJMCwwLDAsMCwxNDMsNjMsMTkyLDEyLDAsMCwwLDAsCisJMTQzLDYzLDE5MiwxMiwwLDAsMCwwLDQzLDE2LDE3LDIsCisJMjQ0LDI1NSw2NCwyMCwwLDAsMCwwLDE4NCw2MywxOTIsMTIsCisJMCwwLDAsMCwwLDE2MywxNiw2MCwyMCwxLDE2LDE0MiwKKwkwLDAsMCwwLDcsMCwxNywyMiwzMyw0MCwzMiwyLAorCTIsMTMxLDQsNjAsMTY0LDEzMiwxMzIsMzYsMTUsNjMsMTkyLDEyLAorCTMzLDQwLDMyLDIsMTI1LDI1LDE5Miw4LDAsMCwwLDAsCisJMiwxMzEsNCw2MCwxODgsMTMyLDEzMiwzNiwxNSw2MywxOTIsMTIsCisJMzMsNDgsMCwyLDEyNSwyNSwxOTIsOCwwLDAsMCwwLAorCTAsMCwyMjYsMTMwLDcsMTYyLDgsNjAsMTYsMCw2NCwxNiwKKwkzMywxNDQsNzIsMiwzMywxNiwzMiwyLDEzNCwyNTQsNjQsMTYsCisJMjU1LDI1NSw0OSwzOCwwLDAsODUsMTc0LDIsMTMxLDQsNjAsCisJMTMyLDEzMiwxMzIsMzYsMzMsNDAsNjQsMiwxNSw2MywxOTIsMTIsCisJMzMsNDgsMTYwLDIsNCwwLDgyLDM4LDMzLDE2LDMyLDIsCisJMjQ3LDI1NSw2NCwyMCwyNTUsMjU1LDQ5LDM4LDEyNSwyNSwxOTIsOCwKKwkwLDAsMCwwLDMzLDE2LDMyLDIsMTE5LDI1NCw2NCwxNiwKKwkyNTUsMjU1LDQ5LDM4LDAsMCw4MCwxNDIsMiwxMzEsNCw2MCwKKwkxMzIsMTMyLDEzMiwzNiwzMyw0MCw2NCwyLDQsMCw4MiwzOCwKKwkxNSw2MywxOTIsMTIsMzMsNDgsMCwyLDMzLDE2LDMyLDIsCisJMjQ3LDI1NSw2NCwyMCwyNTUsMjU1LDQ5LDM4LDEyNSwyNSwxOTIsOCwKKwkwLDAsMCwwLDcsMTYyLDE2LDYwLDY0LDAsMTcsMzgsCisJMiwxMzEsNCw2MCwyMjgsMTMyLDEzMiwzNiwzMyw0MCwwLDIsCisJMCwwLDYsMTQyLDAsMCwwLDAsMTUsNjMsMTkyLDEyLAorCTQsMCwxNiwzOCw0MiwxNiwxNywyLDI0NywyNTUsNjQsMjAsCisJNywxNjIsOCw2MCwxMjgsMCwxNiwzNywxNzYsMCwxNywzNywKKwkyLDEzMSw0LDYwLDIyOCwxMzIsMTMyLDM2LDMzLDQwLDAsMiwKKwkwLDAsNiwxNDIsMCwwLDAsMCwxNSw2MywxOTIsMTIsCisJNCwwLDE2LDM4LDQyLDE2LDE3LDIsMjQ3LDI1NSw2NCwyMCwKKwk3LDE2Miw4LDYwLDE5MiwwLDE2LDM3LDI0MCwwLDE3LDM3LAorCTIsMTMxLDQsNjAsMjI4LDEzMiwxMzIsMzYsMzMsNDAsMCwyLAorCTAsMCw2LDE0MiwwLDAsMCwwLDE1LDYzLDE5MiwxMiwKKwk0LDAsMTYsMzgsNDIsMTYsMTcsMiwyNDcsMjU1LDY0LDIwLAorCTAsMCwwLDAsMTI1LDI1LDE5Miw4LDAsMCwwLDAsCisJMSwwLDEzMCwxMzAsMCwwLDAsMCwyMjIsMCw2NCwyMCwKKwkzMywxNiwzMiwyLDYzLDI1NCw2NCwxNiwyNTUsMjU1LDQ5LDM4LAorCTMzLDMyLDk2LDIsMjEzLDI5LDE5MiwxMiwzMyw0MCwxNjAsMiwKKwkzMywxNiwzMiwyLDI1MSwyNTUsNjQsMjAsMjU1LDI1NSw0OSwzOCwKKwkxMjUsMjUsMTkyLDgsMCwwLDAsMCwxLDAsMTMwLDEzMCwKKwkwLDAsMCwwLDIwOCwwLDY0LDIwLDMzLDE2LDMyLDIsCisJNDksMjU0LDY0LDE2LDI1NSwyNTUsNDksMzgsMzMsMzIsOTYsMiwKKwkxNjEsMzEsMTkyLDEyLDMzLDQwLDE5MiwyLDMzLDE2LDMyLDIsCisJMjUxLDI1NSw2NCwyMCwyNTUsMjU1LDQ5LDM4LDEyNSwyNSwxOTIsOCwKKwkwLDAsMCwwLDMzLDE2LDMyLDIsMzgsMjU0LDY0LDE2LAorCTI1NSwyNTUsNDksMzgsMjA4LDMyLDE5MiwxMiwzMywzMiwwLDAsCisJMzMsMzIsMCwwLDE2NCwzMiwxOTIsMTIsMzMsNDAsMCwwLAorCTQwLDI5LDE5MiwxMiwwLDAsMCwwLDEzMywyOSwxOTIsMTIsCisJMjU1LDI1NSw0LDM2LDMzLDE2LDMyLDIsMjQ1LDI1NSw2NCwyMCwKKwkyNTUsMjU1LDQ5LDM4LDEyNSwyNSwxOTIsOCwwLDAsMCwwLAorCTEsMCwxMzEsMTMwLDg3LDAsMiwzNiwyNywwLDk4LDE2LAorCTg4LDAsOTgsNDAsNywwLDY0LDE2LDExNCwwLDIsMzYsCisJMzcsMCw5NiwxNiw4MiwwLDIsMzYsOSwwLDk4LDE2LAorCTAsMCwwLDAsMTI1LDI1LDE5Miw4LDAsMCwwLDAsCisJNSwwLDk4LDE2LDExOSwwLDgsMzYsMTUsMCwxMDQsMTYsCisJMCwwLDAsMCwxMjUsMjUsMTkyLDgsMCwwLDAsMCwKKwkyLDAsMTMwLDEzMCwwLDAsMCwwLDE1OSwwLDY0LDIwLAorCTAsMCwwLDAsNjAsNjUsMTkyLDEyLDMzLDMyLDk2LDIsCisJMTg0LDEyOCwxMzIsMzksMzMsNDAsOTYsMiwxNSw2MywxOTIsMTIsCisJMzMsNDgsNjQsMCwxMjUsMjUsMTkyLDgsMCwwLDAsMCwKKwkyLDAsMTMwLDEzMCwwLDAsMCwwLDE0NywwLDY0LDIwLAorCTMzLDMyLDk2LDIsMTYyLDY1LDE5MiwxMiwzMyw0MCwxNjAsMiwKKwkyNDIsMjUzLDY0LDIwLDMzLDQwLDE2MCwyLDIsMTMxLDQsNjAsCisJOCwxMzMsMTMyLDM2LDE1LDYzLDE5MiwxMiwzMyw0OCw5NiwyLAorCTEyNSwyNSwxOTIsOCwwLDAsMCwwLDMzLDE2LDMyLDIsCisJMjMzLDI1Myw2NCwxNiwyNTUsMjU1LDQ5LDM4LDQwLDI5LDE5MiwxMiwKKwkwLDAsMCwwLDMzLDE2LDMyLDIsMjUyLDI1NSw2NCwyMCwKKwkyNTUsMjU1LDQ5LDM4LDEyNSwyNSwxOTIsOCwwLDAsMCwwLAorCTEsMCwxMzMsMTMwLDg3LDAsMiwzNiwyOSwwLDE2MiwxNiwKKwk4OCwwLDE2Miw0MCw1LDAsNjQsMTYsODIsMCwyLDM2LAorCTExLDAsMTYyLDE2LDMzLDE2LDMyLDIsMTI1LDI1LDE5Miw4LAorCTAsMCwwLDAsMTE0LDAsMiwzNiw1LDAsMTYyLDE2LAorCTExOSwwLDgsMzYsMTksMCwxNjgsMTYsMzMsMzIsNjQsMiwKKwkxMjUsMjUsMTkyLDgsMCwwLDAsMCwzMywxNiwzMiwyLAorCTIwNiwyNTMsNjQsMTYsMjU1LDI1NSw0OSwzOCwxNjgsNjksMTkyLDEyLAorCTMzLDMyLDY0LDIsMTg0LDEyOCwxMzIsMzksMzMsNDAsNjQsMiwKKwkxNSw2MywxOTIsMTIsMzMsNDgsNjQsMCwxLDAsODIsMzgsCisJMzMsMTYsMzIsMiwyNDcsMjU1LDY0LDIwLDI1NSwyNTUsNDksMzgsCisJMTI1LDI1LDE5Miw4LDAsMCwwLDAsMzMsMzIsNjQsMiwKKwkyOSw3MCwxOTIsMTIsMzMsNDAsMTYwLDIsMTg5LDI1Myw2NCwyMCwKKwkzMyw0MCwxNjAsMiwyLDEzMSw0LDYwLDQwLDEzMywxMzIsMzYsCisJMTUsNjMsMTkyLDEyLDMzLDQ4LDY0LDIsMTI1LDI1LDE5Miw4LAorCTAsMCwwLDAsMTQ0LDAsMTY0LDE0MywxMjIsMjgsMTkyLDEyLAorCTAsMCwwLDAsMTI1LDI1LDE5Miw4LDAsMCwwLDAsCisJMzMsMTYsOTYsMiwxNzUsMjUzLDY0LDE2LDI1NSwyNTUsMTE1LDM4LAorCTE0Myw2MywxOTIsMTIsMCwwLDAsMCwzMywxNiw5NiwyLAorCTI1MiwyNTUsNjQsMjAsMjU1LDI1NSwxMTUsMzgsMTI1LDI1LDE5Miw4LAorCTAsMCwwLDAsMzMsMTYsMzIsMiwxNjUsMjUzLDY0LDE2LAorCTI1NSwyNTUsNDksMzgsMzMsMzIsOTYsMiwyMDgsMzIsMTkyLDEyLAorCTMzLDQwLDE5MiwyLDMzLDE2LDMyLDIsMjUxLDI1NSw2NCwyMCwKKwkyNTUsMjU1LDQ5LDM4LDEyNSwyNSwxOTIsOCwwLDAsMCwwLAorCTEsMCwxMzAsMTQ2LDAsMCwwLDAsMTU5LDI1NSw2NiwzNiwKKwkwLDIyLDIsMCwzLDMwLDIsMCwyNCwwLDk4LDQ0LAorCTI3LDAsNjQsMTYsMTI4LDE2LDMsMCwyLDEzMSwxLDYwLAorCTMzLDgsMzQsMCwxMzYsMTQwLDM0LDE0MCwwLDAsMCwwLAorCTgsMCw2NCwwLDAsMCwwLDAsMTIsMzMsMTkyLDEyLAorCTMzLDMyLDY0LDIsMTI1LDI1LDE5Miw4LDAsMCwwLDAsCisJMTUsMzMsMTkyLDEyLDMzLDMyLDk2LDIsMTI1LDI1LDE5Miw4LAorCTAsMCwwLDAsMTgsMzMsMTkyLDEyLDMzLDMyLDk2LDIsCisJMTI1LDI1LDE5Miw4LDAsMCwwLDAsMjIsMzMsMTkyLDEyLAorCTMzLDMyLDk2LDIsMTI1LDI1LDE5Miw4LDAsMCwwLDAsCisJMjUsMzMsMTkyLDEyLDMzLDMyLDY0LDIsMTI1LDI1LDE5Miw4LAorCTAsMCwwLDAsMzMsMzIsNjQsMiw3LDMzLDE5MiwxMiwKKwkzMyw0MCwxOTIsMiwxMjUsMjUsMTkyLDgsMCwwLDAsMCwKKwkxNiwwLDE4MiwxNzUsMzMsMzIsMzIsMiwzMyw0MCwxOTIsMywKKwkzMyw0OCwyMjQsMiwxNjEsMzMsMTkyLDEyLDMzLDU2LDE2MCwyLAorCTEyNSwyNSwxOTIsOCwwLDAsMCwwLDMzLDEzNiwwLDAsCisJMiwxMzEsNCw2MCw3MiwxMzMsMTMyLDM2LDE1LDYzLDE5MiwxMiwKKwkxLDAsNDksMzgsMzIsMCwzNCw0NiwyNTAsMjU1LDY0LDIwLAorCTAsMCwwLDAsMTI1LDI1LDE5Miw4LDAsMCwwLDAsCisJMiwxMzEsNCw2MCw5MiwxMzMsMTMyLDM2LDE1LDYzLDE5MiwxMiwKKwkzMyw0MCwxMjgsMiwxMjMsMjUsMTkyLDgsMCwwLDAsMCwKKwkyMjgsMCwxOTEsMTQzLDIyNCwwLDE5MCwxNDMsMjIwLDAsMTgzLDE0MywKKwkyMTYsMCwxODIsMTQzLDIxMiwwLDE4MSwxNDMsMjA4LDAsMTgwLDE0MywKKwkyMDQsMCwxNzksMTQzLDIwMCwwLDE3OCwxNDMsMTk2LDAsMTc3LDE0MywKKwkxOTIsMCwxNzYsMTQzLDgsMCwyMjQsMywyMzIsMCwxODksMzksCisJMjMyLDI1NSwxODksMzksMiwxMzEsNSw2MCwxOTIsMTU0LDE2NSwzNiwKKwkyMCwwLDE5MSwxNzUsMTYsMCwxNzYsMTc1LDAsMCwxNjIsMTQwLAorCTAsMCwwLDAsOSwwLDY0LDE2LDMzLDEyOCwxNjAsMCwKKwkwLDAsNSwxNDIsMTkyLDEyOCwxMzIsMzksMTUsNjMsMTkyLDEyLAorCTQsMCwxNiwzOCwwLDAsMiwxNDIsMCwwLDAsMCwKKwkyNDksMjU1LDY0LDIwLDAsMCwwLDAsMjAsMCwxOTEsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMjQsMCwxODksMzksCisJMCwwLDEzMiwxNDQsMCwwLDAsMCwyMDgsMjU1LDEzMCwzNiwKKwkxMCwwLDY2LDQ0LDQsMCw2NCwxNiwwLDIyLDQsMCwKKwkzLDIyLDIsMCw4OSwyOCwxOTIsOCwyMDgsMjU1LDY2LDM2LAorCTE1OSwyNTUsMTMwLDM2LDYsMCw2Niw0NCw0LDAsNjQsMTYsCisJMCwyMiw0LDAsMywyMiwyLDAsODksMjgsMTkyLDgsCisJMTY5LDI1NSw2NiwzNiwxOTEsMjU1LDEzMCwzNiw2LDAsNjYsNDQsCisJMywwLDY0LDIwLDAsMjIsNCwwLDg5LDI4LDE5Miw4LAorCTI1NSwyNTUsMiwzNiwzLDIyLDIsMCwyMDEsMjU1LDY2LDM2LAorCTgsMCwyMjQsMywwLDAsMCwwLDIxNiwyNTUsMTg5LDM5LAorCTI0LDAsMTc4LDE3NSwzMywxNDQsMTI4LDAsMzIsMCwxOTEsMTc1LAorCTI4LDAsMTc5LDE3NSwyMCwwLDE3NywxNzUsMTYsMCwxNzYsMTc1LAorCTAsMCw4MSwxNDIsMCwwLDAsMCw2NSwyOCwxOTIsMTIsCisJMzMsMzIsMzIsMiwzMywyNCw2NCwwLDI1NSwyNTUsMTksMzYsCisJOSwwLDExNSwxNiwwLDEyOSwzLDAsNjUsMjgsMTkyLDEyLAorCTEsMCwzNiwzOCwzMywyNCw2NCwwLDQsMCwxMTUsMTYsCisJMiwwLDM0LDM4LDAsMCw2NiwxNzQsMTE1LDI4LDE5Miw4LAorCTM3LDE2LDMsMiwyNTUsMjU1LDIsMzYsMzIsMCwxOTEsMTQzLAorCTI4LDAsMTc5LDE0MywyNCwwLDE3OCwxNDMsMjAsMCwxNzcsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsNDAsMCwxODksMzksCisJMTc2LDI1NSwxODksMzksNjQsMCwxODAsMTc1LDMzLDE2MCwxMjgsMCwKKwk3MiwwLDE5MSwxNzUsNjgsMCwxODEsMTc1LDYwLDAsMTc5LDE3NSwKKwk1NiwwLDE3OCwxNzUsNTIsMCwxNzcsMTc1LDQ4LDAsMTc2LDE3NSwKKwkwLDAsMTMwLDEzMCwwLDAsMCwwLDUzLDAsNjQsMjAsCisJMzMsMTI4LDAsMCwyNyw2NywxOTIsMTIsMzMsMzIsMCwwLAorCTEsMCw0LDM2LDI3LDY3LDE5MiwxMiwzMywxMjgsNjQsMCwKKwkyLDAsNCwzNiwyNyw2NywxOTIsMTIsMzMsMTM2LDY0LDAsCisJMzMsMjQsNjQsMCwyNTUsMjU1LDIsMzYsNSwwLDIsMTgsCisJMCwwLDAsMCwzLDAsMzQsMTgsMCwwLDAsMCwKKwk2LDAsOTgsMjAsMjU1LDI1NSwyLDUyLDIsMTMxLDQsNjAsCisJMTUsNjMsMTkyLDEyLDYwLDEzNywxMzIsMzYsMjksMjksMTkyLDgsCisJMCwwLDAsMCw1LDAsMiwxOCwwLDAsMCwwLAorCTMsMCwzNCwxOCwwLDAsMCwwLDYsMCw5OCwyMCwKKwkxLDAsMiw1MCwyLDEzMSw0LDYwLDE1LDYzLDE5MiwxMiwKKwkxMDQsMTM3LDEzMiwzNiwyOSwyOSwxOTIsOCwwLDAsMCwwLAorCTYsMCw2NCwxNiwyNTUsMCw1LDUwLDIsMTMxLDQsNjAsCisJMTUsNjMsMTkyLDEyLDEzMiwxMzcsMTMyLDM2LDI5LDI5LDE5Miw4LAorCTAsMCwwLDAsMiwxMzEsNCw2MCwxNzYsMTM3LDEzMiwzNiwKKwkzLDUwLDE2LDAsMywxOCwxNywwLDE2LDAsMTYyLDE3NSwKKwkyNTUsMCw5OCw0OCwyMCwwLDE2MiwxNzUsMywxOCwzLDAsCisJMjU1LDAsMzksNTAsMTUsNjMsMTkyLDEyLDI0LDAsMTYyLDE3NSwKKwkyOSwyOSwxOTIsOCwwLDAsMCwwLDQwLDAsMTgwLDE3NSwKKwk1OCwwLDIxLDM2LDMyLDAsMTksMzYsMjU1LDI1NSwxOCwzNiwKKwkzMiwwLDE3NywzOSw0MCwwLDE2MiwxNDMsMCwwLDAsMCwKKwkwLDAsNjcsMTI4LDAsMCwwLDAsMywwLDExNywxNiwKKwkwLDAsMCwwLDMsMCwxMTUsMjAsMCwwLDAsMCwKKwkxLDAsNjYsMzYsNDAsMCwxNjIsMTc1LDkxLDI4LDE5MiwxMiwKKwk0MCwwLDE2NCwzOSwzMywyNCw2NCwwLDc1LDAsMTE0LDE2LAorCTAsMCwwLDAsNDAsMCwxNjIsMTQzLDAsMCwzNSwxNjYsCisJMCwwLDY3LDEyOCwwLDAsMCwwLDMsMCwxMTcsMTYsCisJMCwwLDAsMCwzLDAsMTE1LDIwLDAsMCwwLDAsCisJMSwwLDY2LDM2LDQwLDAsMTYyLDE3NSw5MSwyOCwxOTIsMTIsCisJNDAsMCwxNjQsMzksMzMsMjQsNjQsMCw2MCwwLDExNCwxNiwKKwkxLDAsMTYsMzgsMCwwLDM0LDE1MCwwLDI2LDMsMCwKKwkzNywxNiw2NywwLDAsMCwzNCwxNjYsMywwLDIsNDIsCisJMjIwLDI1NSw2NCwyMCwyLDAsNDksMzgsMzIsMCwxNjUsMTUxLAorCTAsMCwwLDAsMSwwLDE2Miw0OCw3LDAsNjQsMTYsCisJMCwwLDAsMCwyLDEzMSw0LDYwLDIwOCwxMzcsMTMyLDM2LAorCTE1LDYzLDE5MiwxMiwyNTUsMCwxNjUsNDgsMjUsMjksMTkyLDgsCisJMCwwLDAsMCwzNiwwLDE2MiwxNTEsMCwwLDAsMCwKKwkwLDcsNjYsNDgsNiwwLDY0LDE2LDAsMCwwLDAsCisJMiwxMzEsNCw2MCwxNSw2MywxOTIsMTIsMCwxMzgsMTMyLDM2LAorCTI1LDI5LDE5Miw4LDAsMCwwLDAsMjU1LDY2LDE5MiwxMiwKKwkzMywzMiwwLDAsMSwwLDQsMzYsMzQsMCwxNjUsMTUxLAorCTAsMCwwLDAsMjU1LDY2LDE5MiwxMiwzMywxMjgsMCwwLAorCTM2LDAsMTY1LDE1MSwwLDAsMCwwLDI1NSw2NiwxOTIsMTIsCisJMiwwLDQsMzYsMiwxMzEsNCw2MCwxNSw2MywxOTIsMTIsCisJMzIsMTM4LDEzMiwzNiwyLDEzMSw0LDYwLDgwLDEzOCwxMzIsMzYsCisJMTUsNjMsMTkyLDEyLDMzLDQwLDAsMiwxOTYsMTI4LDEzMiwzOSwKKwkyMDAsMTI4LDEzNCwzOSwzMSwyMSwxOTIsMTIsMzIsMCwxNjUsMzksCisJMzYsMCwxNjIsMTUxLDEsMCwxNiwzOCwwLDEsNjYsMzYsCisJMzYsMCwxNjIsMTY3LDgsMCwyLDQyLDcsMCw2NCwxNiwKKwkwLDAsMCwwLDgsMjksMTkyLDgsMCwwLDAsMCwKKwkyLDEzMSw0LDYwLDExNiwxMzgsMTMyLDM2LDE1LDYzLDE5MiwxMiwKKwkzMyw0MCwxMjgsMiw3MiwwLDE5MSwxNDMsNjgsMCwxODEsMTQzLAorCTY0LDAsMTgwLDE0Myw2MCwwLDE3OSwxNDMsNTYsMCwxNzgsMTQzLAorCTUyLDAsMTc3LDE0Myw0OCwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTgwLDAsMTg5LDM5LDAsMCwwLDAsMCwwLDAsMCwKKwkyMjQsMjU1LDE4OSwzOSwxNiwwLDE3NiwxNzUsMzMsMTI4LDAsMCwKKwkyMCwwLDE3NywxNzUsMzMsMTM2LDAsMCwyNCwwLDE5MSwxNzUsCisJMzMsMzIsMCwyLDE2Miw2NSwxOTIsMTIsMzMsNDAsMCwwLAorCTQzLDAsNjQsMTYsMCwwLDAsMCwxLDAsMTYsMzgsCisJNjQsMCwyLDQyLDI0OSwyNTUsNjQsMjAsMzMsMzIsMCwyLAorCTMzLDEyOCwwLDAsODUsODUsMTcsMzYsMzMsMzIsMCwyLAorCTE2Miw2NSwxOTIsMTIsODUsODUsNSwzNiwzMiwwLDY0LDE2LAorCTAsMCwwLDAsMSwwLDE2LDM4LDY0LDAsMiw0MiwKKwkyNDksMjU1LDY0LDIwLDMzLDMyLDAsMiwzMywxMjgsMCwwLAorCTE3MCwxNzAsMTcsNTIsMzMsMzIsMCwyLDE2Miw2NSwxOTIsMTIsCisJMTcwLDE3MCw1LDUyLDIxLDAsNjQsMTYsMCwwLDAsMCwKKwkxLDAsMTYsMzgsNjQsMCwyLDQyLDI0OSwyNTUsNjQsMjAsCisJMzMsMzIsMCwyLDMzLDEyOCwwLDAsMjU1LDI1NSwxNyw1MiwKKwkzMywzMiwwLDIsMTYyLDY1LDE5MiwxMiwyNTUsMjU1LDUsNTIsCisJMTAsMCw2NCwxNiwwLDAsMCwwLDEsMCwxNiwzOCwKKwk2NCwwLDIsNDIsMjQ5LDI1NSw2NCwyMCwzMywzMiwwLDIsCisJMiwxMzEsNCw2MCwxNSw2MywxOTIsMTIsMjQwLDE0MCwxMzIsMzYsCisJMTAxLDI5LDE5Miw4LDAsMCwwLDAsNjAsNjUsMTkyLDEyLAorCTMzLDMyLDAsMiwyLDEzMSw0LDYwLDQsMTQxLDEzMiwzNiwKKwkzMyw0MCwzMiwyLDMzLDQ4LDAsMiwxNSw2MywxOTIsMTIsCisJMzMsNTYsNjQsMCwyNCwwLDE5MSwxNDMsMjAsMCwxNzcsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMzIsMCwxODksMzksCisJMCwwLDAsMCwwLDAsMCwwLDIzMiwyNTUsMTg5LDM5LAorCTE2LDAsMTkxLDE3NSwyMTAsNywxOTIsMTIsMCwwLDAsMCwKKwkxMzksMTQsMTkyLDEyLDAsMCwwLDAsMTgwLDEwLDE5MiwxMiwKKwkwLDAsMCwwLDMyLDEzMywxMzIsMTQzLDEsMCwyLDM2LAorCTQyLDE2LDY4LDAsOSwwLDY0LDE2LDAsMiwzLDM2LAorCTY0LDM0LDQsMCwyLDEzMSwxLDYwLDMzLDgsMzUsMCwKKwkxOTYsMjQ2LDMyLDE3MiwwLDIsOTksMzYsNDIsMTYsMTAwLDAsCisJMjUwLDI1NSw2NCwyMCwwLDAsMCwwLDE2LDAsMTkxLDE0MywKKwkyNCwwLDE4OSwzOSw4LDAsMjI0LDMsMCwwLDAsMCwKKwkyMDgsMjU1LDE4OSwzOSwyNCwwLDE3OCwxNzUsMzMsMTQ0LDEyOCwwLAorCTMyLDAsMTgwLDE3NSwzMywxNjAsMTYwLDAsNDQsMCwxOTEsMTc1LAorCTQwLDAsMTgyLDE3NSwzNiwwLDE4MSwxNzUsMjgsMCwxNzksMTc1LAorCTIwLDAsMTc3LDE3NSwzLDAsMTI4LDI2LDE2LDAsMTc2LDE3NSwKKwkxNDksMjksMTkyLDgsMSwwLDE0NywzOCwxLDAsMjAsMzYsCisJMzIsMTMzLDE0NywxNDMsMjU1LDI1NSw4MiwzOCwyNTUsMjU1LDIsMzYsCisJMjAsMCw2NiwxOCwyNTUsMjU1LDIxLDM2LDIsMTMxLDIyLDYwLAorCTE5MiwyNDYsMjE0LDM4LDEwOCwyOSwxOTIsMTIsMzMsMTI4LDEyOCwyLAorCTQyLDE2LDE5LDIsMTAsMCw2NCwxNiw2NCwxOCwxNiwwLAorCTMzLDEzNiw4NiwwLDI0MiwyMSwxOTIsMTIsMzMsMzIsMzIsMiwKKwkxMzMsMTIsMTkyLDEyLDMzLDMyLDAsMiwxLDAsMTYsMzgsCisJNDIsMTYsMTksMiwyNDksMjU1LDY0LDIwLDAsMiw0OSwzOCwKKwkyNTUsMjU1LDgyLDM4LDI0MCwyNTUsODUsMjIsMCwwLDAsMCwKKwk0NCwwLDE5MSwxNDMsNDAsMCwxODIsMTQzLDM2LDAsMTgxLDE0MywKKwkzMiwwLDE4MCwxNDMsMjgsMCwxNzksMTQzLDI0LDAsMTc4LDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk0OCwwLDE4OSwzOSwyMTYsMjU1LDE4OSwzOSwyNCwwLDE3OCwxNzUsCisJMzMsMTQ0LDE2MCwwLDI4LDAsMTc5LDE3NSwzMywxNTIsMTkyLDAsCisJMzIsMCwxOTEsMTc1LDIwLDAsMTc3LDE3NSwzLDAsMTI4LDI0LAorCTE2LDAsMTc2LDE3NSwxOTUsMjksMTkyLDgsMSwwLDE0NSwzNiwKKwkxLDAsNCwzNiwzMiwxMzMsMTQ1LDE0MywzMywxMjgsMTI4LDAsCisJNDIsMTYsMTcsMiw4LDAsNjQsMTYsMzMsMzIsMCwyLAorCTMzLDQwLDY0LDIsMjUwLDI5LDE5MiwxMiwzMyw0OCw5NiwyLAorCTEsMCwxNiwzOCw0MiwxNiwxNywyLDI1MCwyNTUsNjQsMjAsCisJMzMsMzIsMCwyLDMyLDAsMTkxLDE0MywyOCwwLDE3OSwxNDMsCisJMjQsMCwxNzgsMTQzLDIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDQwLDAsMTg5LDM5LDIyNCwyNTUsMTg5LDM5LAorCTI0LDAsMTkxLDE3NSwyMCwwLDE3NywxNzUsMywwLDEyOCwyNCwKKwkxNiwwLDE3NiwxNzUsMjIyLDI5LDE5Miw4LDEsMCwxNDUsMzYsCisJMSwwLDQsMzYsMzIsMTMzLDE0NSwxNDMsMzMsMTI4LDEyOCwwLAorCTQyLDE2LDE3LDIsNywwLDY0LDE2LDAsMCwwLDAsCisJMjM3LDI5LDE5MiwxMiwzMywzMiwwLDIsMSwwLDE2LDM4LAorCTQyLDE2LDE3LDIsMjUxLDI1NSw2NCwyMCwwLDAsMCwwLAorCTI0LDAsMTkxLDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywzMiwwLDE4OSwzOSw2NCwzNCw0LDAsCisJMiwxMzEsMiw2MCwxOTIsMjQ2LDY2LDM2LDMzLDMyLDEzMCwwLAorCTQ0LDAsMTMxLDE0MCwxLDAsMiwzNiwzMiwwLDEzMCwxNzIsCisJMTYsMCwyLDM2LDIsMCw5OCwxNjQsOCwwLDEzMCwxNDAsCisJMCwwLDAsMCw4LDAsMjI0LDMsMCwwLDY0LDE3MiwKKwkyMDgsMjU1LDE4OSwzOSwzMyw0OCwxMjgsMCw2NCwxOCw2LDAsCisJMiwxMzEsMyw2MCwxOTIsMjQ2LDk5LDM2LDM2LDAsMTc3LDE3NSwKKwkzMywxMzYsNjcsMCw0MCwwLDE5MSwxNzUsMzIsMCwxNzYsMTc1LAorCTQsMCwzNCwxNDIsMCwwLDAsMCw0LDAsNjQsMjAsCisJMzMsMTI4LDE2MCwwLDEsMCw0LDM2LDEzMywyOSwxOTIsMTIsCisJMzMsNDAsMTkyLDAsMywwLDAsMzAsMjIxLDUsMiw0MiwKKwkxNywzMCwxOTIsOCwxLDAsMTYsMzYsMywwLDY0LDIwLAorCTMzLDMyLDMyLDIsMjIwLDUsMTYsMzYsMzMsMzIsMzIsMiwKKwkyMDgsNyw1LDM2LDEwOCwwLDEzMSwxNDAsMTIsMCwyLDM2LAorCTIsMCw5OCwxNjQsMTYsMCwxNjIsMzksOCwwLDk4LDE3MiwKKwkwLDEyOCwyLDU0LDEyLDAsOTYsMTcyLDE2LDAsMTYyLDE3NSwKKwkyNTUsMjU1LDIsMzYsMjAsMCwxNjIsMTc1LDIsMTMxLDIsNjAsCisJMCwxNTUsNjYsMzYsOTgsMzEsMTkyLDEyLDI0LDAsMTYyLDE3NSwKKwk0MCwwLDE5MSwxNDMsMzYsMCwxNzcsMTQzLDMyLDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNDgsMCwxODksMzksNTYsMjU0LDE4OSwzOSwKKwkxNjAsMSwxNzYsMTc1LDMzLDEyOCwxOTIsMCw0OCwxLDE2NCwxNzUsCisJMzMsMzIsMjI0LDAsNjQsMTgsNSwwLDIsMTMxLDMsNjAsCisJMTkyLDI0Niw5OSwzNiwzMywxNiw2NywwLDU2LDEsMTYyLDE3NSwKKwk2NCwxOCwxNiwwLDMzLDE2LDY3LDAsNDAsMCwxNjgsMzksCisJMTk2LDEsMTkxLDE3NSwxOTIsMSwxOTAsMTc1LDE4OCwxLDE4MywxNzUsCisJMTg0LDEsMTgyLDE3NSwxODAsMSwxODEsMTc1LDE3NiwxLDE4MCwxNzUsCisJMTcyLDEsMTc5LDE3NSwxNjgsMSwxNzgsMTc1LDE2NCwxLDE3NywxNzUsCisJNjQsMSwxNjIsMTc1LDEyLDAsMTYwLDI0LDk2LDEsMTY4LDE3NSwKKwkzMiwxMzMsMTMxLDE0MywwLDAsMCwwLDQyLDE2LDE2MywwLAorCTE5LDEsNjQsMTYsMSwwLDIsMzYsNSwwLDAsMjYsCisJNDIsMTYsMywyLDE1LDEsNjQsMTYsMSwwLDIsMzYsCisJMywwLDE3NiwyMCwzMyw0MCwwLDAsODYsMzEsMTkyLDgsCisJMSwwLDIsMzYsMjEyLDY4LDE5MiwxMiwzMyw0OCwwLDAsCisJNiwwLDY1LDQsMTA0LDEsMTYyLDE3NSwzMyw3Miw2NCwwLAorCTM1LDcyLDksMCwxMDQsMSwxNjksMTc1LDg3LDMwLDE5Miw4LAorCTExMiwxLDE2MCwxNzUsMSwwLDgsMzYsMTEyLDEsMTY4LDE3NSwKKwkxLDAsNCwzNiwxMzMsMjksMTkyLDEyLDMzLDQwLDAsMCwKKwkyMzcsMjksMTkyLDEyLDMzLDMyLDAsMiwyNCwwLDE2OSwzOSwKKwk1NiwxLDE2OCwxNDMsMjU1LDAsMiwzNiw4MCwxLDE2OSwxNzUsCisJMTA4LDAsOCwxNDEsNDMsMSwxNjMsMzksNzIsMSwxNjgsMTc1LAorCTAsMCw5OCwxNjAsMjU1LDI1NSw2NiwzNiwyNTMsMjU1LDY1LDQsCisJMjU1LDI1NSw5OSwzNiw2NCwxLDE2OSwxNDMsMCwwLDAsMCwKKwkxMjAsMCw0MSwxNDEsNjQsMSwxNjgsMTQzLDEyOCwxLDE2OSwxNzUsCisJMTI0LDAsOCwxNDEsNjQsMSwxNjksMTQzLDEzNiwxLDE2OCwxNzUsCisJNDQsMCwzNCwxNDEsMCwwLDAsMCwxMiwwLDY0LDE3MiwKKwk0NCwwLDM0LDE0MSwwLDAsMCwwLDE2LDAsNjQsMTcyLAorCTQ0LDAsMzQsMTQxLDEyMCwxLDE2MCwxNzUsMzIsMCw2NCwxNzIsCisJNDQsMCwzNCwxNDEsODgsMSwxNjAsMTc1LDI0LDAsNjQsMTcyLAorCTQ4LDEsMTY4LDE0MywwLDAsMCwwLDE2OCwwLDAsMjUsCisJNDAsMCwxNjksMzksMTQ0LDEsMTY5LDE3NSw4OCwxLDE2OCwxNDMsCisJMCwwLDAsMCwyNTUsMCwyLDQ5LDQsMCw4NiwzNiwKKwk2MCwwLDE5NCw0MiwyLDAsNjQsMTYsMCwwLDAsMCwKKwk2MCwwLDIyLDM2LDEwNCwxLDE2OSwxNDMsMCwwLDAsMCwKKwkyLDAsMzIsMTcsMCwwLDAsMCwxMDQsMSwxODIsMTQzLAorCTU2LDEsMTY0LDE0Myw3MiwxLDE2OCwxNDMsMTIsMCwyLDM2LAorCTIsMCwyLDE2NSw4MCwxLDE2OSwxNDMsMCwxMjgsMTk0LDU0LAorCTgsMCw5LDE3MywxMiwwLDAsMTczLDAsMCwzNCwxNzMsCisJMjU1LDI1NSw4LDM2LDQsMCw0MCwxNzMsMTQ0LDEsMTY4LDE0MywKKwkwLDAsMCwwLDgsMCw0MCwxNzMsODgsMSwxNjgsMTQzLAorCTk2LDEsMTY5LDE0MywyMDgsNyw1LDM2LDk4LDMxLDE5MiwxMiwKKwkwLDAsNDAsMTczLDAsMTI4LDUsNTIsMCwxMjgsNiw1MiwKKwkxMjgsMSwxNjQsMTQzLDAsMCwwLDAsMTI5LDY3LDE5MiwxMiwKKwkyLDAsNywzNiwxMywwLDY0LDIwLDAsMCwwLDAsCisJODgsMSwxNjUsMTQzLDIsMTMxLDQsNjAsMTUsNjMsMTkyLDEyLAorCTY0LDE0MSwxMzIsMzYsMTIwLDEsMTY5LDE0MywwLDAsMCwwLAorCTEsMCw0MSwzNywyMCwwLDM0LDQxLDExNywwLDY0LDE2LAorCTEyMCwxLDE2OSwxNzUsMzIsMzEsMTkyLDgsMCwwLDAsMCwKKwkxMjgsMSwxNjgsMTQzLDY0LDEsMTY5LDE0Myw4LDAsMiwxNDEsCisJMjU1LDI1NSw4LDM2LDEzNiwwLDUzLDE0MSwwLDAsMCwwLAorCTUwLDAsNzIsMTYsMzMsMTg0LDAsMCwxLDAsNCwzNiwKKwk0LDAsMTgsMzYsNCwwLDMsMzYsMCwwLDE5MCwxNDIsCisJOCwwLDE2NiwxNDIsMTEyLDEsMTY5LDE0MywyNTUsNjMsMjEyLDUxLAorCTMwLDAsMzIsMTcsMzMsMTg0LDI0NCwyLDQyLDE2LDExNiwwLAorCTI3LDAsNjQsMTYsMzMsMTUyLDk2LDAsMTQ0LDEsMTY4LDE0MywKKwkwLDAsMCwwLDMzLDEzNiw3MiwyLDMzLDEyOCwxMDIsMCwKKwkxNSwwLDEyOCwxNiwwLDAsMCwwLDAsMCwyLDE0NiwKKwkwLDAsMzUsMTQ2LDAsMCwwLDAsMTAsMCw2NywxNiwKKwkzMyw0OCwxOTIsMiwyLDEzMSw0LDYwLDkyLDE0MSwxMzIsMzYsCisJODgsMSwxNjUsMTQzLDE2LDAsMTYzLDE3NSwwLDAsMiwxNDYsCisJMzMsNTYsNjQsMiwxNSw2MywxOTIsMTIsMjAsMCwxNjIsMTc1LAorCTMzLDMyLDAsMCwxLDAsMTE1LDM4LDEsMCwxNiwzOCwKKwkxLDAsNDksMzgsNDIsMTYsMTE2LDIsMjM1LDI1NSw2NCwyMCwKKwkxLDAsODIsMzgsMzMsMjQsMCwwLDQsMCwxODEsMTQyLAorCTAsMTI4LDE5NCw1MSwyMTcsMjU1LDY0LDE2LDAsMCwwLDAsCisJMTI4LDEsMTY5LDE0MywwLDAsMCwwLDgsMCwzNCwxNDEsCisJMCwwLDAsMCwyNSwwLDEyOCwxNiwxOCwwLDg3LDE2NCwKKwk5LDAsMjQ2LDE4LDMzLDQ4LDE5MiwyLDIsMTMxLDQsNjAsCisJMTQwLDE0MSwxMzIsMzYsODgsMSwxNjUsMTQzLDAsMCwwLDAsCisJMTUsNjMsMTkyLDEyLDMzLDU2LDIyNCwyLDUsMzEsMTkyLDgsCisJMCwwLDAsMCw2NCwxLDE2OCwxNDMsMCwwLDAsMCwKKwkxMzYsMCwyLDE0MSw5NiwxLDE2OSwxNDMsOCwwLDcwLDE0MCwKKwkwLDAsMzQsMTQxLDAsMCwxOTgsMTQwLDAsMCwwLDAsCisJNywwLDE5NCwxNiwwLDAsMCwwLDg4LDEsMTY1LDE0MywKKwkyLDEzMSw0LDYwLDE1LDYzLDE5MiwxMiwxODQsMTQxLDEzMiwzNiwKKwk2NCwxLDE2OCwxNDMsMCwwLDAsMCwxMzYsMCw0LDE0MSwKKwkxNTIsMjEsMTkyLDEyLDAsMCwwLDAsNjQsMSwxNjksMTQzLAorCTAsMCwwLDAsMTM2LDAsNTMsMTczLDEyOCwxLDE2OCwxNDMsCisJOCwxMjgsMiw1MiwwLDAsMCwxNjUsMiwwLDIsMTY1LAorCTgsMCwwLDE3MywxMiwwLDAsMTY1LDEzNiwxLDE2OSwxNDMsCisJOCwwLDIsMzYsMiwwLDM0LDE2NSw0LDAsNDAsMTQxLAorCTEyOCwxLDE2OSwxNDMsMTM2LDEsMTY4LDE3NSw0LDAsNDEsMTQxLAorCTY0LDEsMTY4LDE0MywxMjgsMSwxNjksMTc1LDEyMCwwLDksMTczLAorCTEzNiwxLDE2OSwxNDMsMCwwLDAsMCwxMjQsMCw5LDE3MywKKwk4OCwxLDE2OCwxNDMsNDgsMSwxNjksMTQzLDEsMCw4LDM3LAorCTQyLDE2LDksMSw5MSwyNTUsNjQsMjAsODgsMSwxNjgsMTc1LAorCTY0LDEsMTY4LDE0MywwLDAsMCwwLDQ0LDAsMywxNDEsCisJMCwwLDAsMCwxMiwwLDk4LDE0MCwwLDAsMCwwLAorCTUsMCw2NCwxNiwwLDAsMCwwLDEyLDAsMTAxLDE0MCwKKwkyLDEzMSw0LDYwLDE1LDYzLDE5MiwxMiwyMTIsMTQxLDEzMiwzNiwKKwk2NCwxLDE2OSwxNDMsMCwwLDAsMCw0NCwwLDM1LDE0MSwKKwkwLDAsMCwwLDE2LDAsOTgsMTQwLDAsMCwwLDAsCisJNSwwLDY0LDE2LDAsMCwwLDAsMTYsMCwxMDEsMTQwLAorCTIsMTMxLDQsNjAsMTUsNjMsMTkyLDEyLDI0MCwxNDEsMTMyLDM2LAorCTY0LDEsMTY4LDE0MywwLDAsMCwwLDQ0LDAsMywxNDEsCisJMCwwLDAsMCwzMiwwLDk4LDE0MCwwLDAsMCwwLAorCTUsMCw2NCwxNiwwLDAsMCwwLDMyLDAsMTAxLDE0MCwKKwkyLDEzMSw0LDYwLDE1LDYzLDE5MiwxMiwxNiwxNDIsMTMyLDM2LAorCTY0LDEsMTY5LDE0MywwLDAsMCwwLDQ0LDAsMzUsMTQxLAorCTAsMCwwLDAsMjQsMCw5OCwxNDAsMCwwLDAsMCwKKwk1LDAsNjQsMTYsMCwwLDAsMCwyNCwwLDEwMSwxNDAsCisJMiwxMzEsNCw2MCwxNSw2MywxOTIsMTIsNDgsMTQyLDEzMiwzNiwKKwkxOTYsMSwxOTEsMTQzLDE5MiwxLDE5MCwxNDMsMTg4LDEsMTgzLDE0MywKKwkxODQsMSwxODIsMTQzLDE4MCwxLDE4MSwxNDMsMTc2LDEsMTgwLDE0MywKKwkxNzIsMSwxNzksMTQzLDE2OCwxLDE3OCwxNDMsMTY0LDEsMTc3LDE0MywKKwkxNjAsMSwxNzYsMTQzLDgsMCwyMjQsMywyMDAsMSwxODksMzksCisJMjI0LDI1NSwxODksMzksMTYsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCwKKwkyNCwwLDE5MSwxNzUsMjAsMCwxNzcsMTc1LDQ0LDAsNCwxNDIsCisJMCwwLDAsMCwwLDAsMTMwLDE0OCwwLDAsMCwwLAorCTAsMzIsNjYsNDgsNywwLDY0LDIwLDMzLDEzNiwxNjAsMCwKKwkwLDAsMTMzLDE0OCwyLDEzMSw0LDYwLDE1LDYzLDE5MiwxMiwKKwk4MCwxNDIsMTMyLDM2LDE1NiwzMSwxOTIsOCwzLDAsMiwzNiwKKwkyLDAsMTMyLDM2LDMzLDQwLDAsMCwzMyw0OCwwLDAsCisJMTI5LDY3LDE5MiwxMiwzMyw1NiwzMiwyLDEzLDAsNjQsMTYsCisJMzMsNDAsMCwwLDQ0LDAsMywxNDIsMCwzMywyLDM2LAorCTIsMCw5OCwxNjQsOCwwLDIsMTQyLDMzLDQ4LDAsMCwKKwkwLDAsNjQsMTcyLDQ0LDAsNCwxNDIsMzMsNTYsMzIsMiwKKwkxMjksNjcsMTkyLDEyLDIsMCwxMzIsMzYsOSwwLDY0LDIwLAorCTAsMzIsNSwzNiw0NCwwLDIsMTQyLDAsMCwwLDAsCisJMiwwLDY5LDE0OCwyLDEzMSw0LDYwLDE1LDYzLDE5MiwxMiwKKwkxMDgsMTQyLDEzMiwzNiwxNTYsMzEsMTkyLDgsMSwwLDIsMzYsCisJNDQsMCw0LDE0MiwwLDMyLDYsMzYsMTI5LDY3LDE5MiwxMiwKKwkzMyw1NiwzMiwyLDgsMCw2NCwyMCwzMywxNiwwLDAsCisJNDQsMCwyLDE0MiwwLDAsMCwwLDAsMCw2OSwxNDgsCisJMiwxMzEsNCw2MCwxNSw2MywxOTIsMTIsMTMyLDE0MiwxMzIsMzYsCisJMiwwLDIsMzYsMjQsMCwxOTEsMTQzLDIwLDAsMTc3LDE0MywKKwkxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLDMyLDAsMTg5LDM5LAorCTIyNCwyNTUsMTg5LDM5LDI0LDAsMTc4LDE3NSwzMywxNDQsMTYwLDAsCisJMjgsMCwxOTEsMTc1LDIwLDAsMTc3LDE3NSw3LDAsMTI4LDQsCisJMTYsMCwxNzYsMTc1LDI0LDEzMywxMzAsMTQzLDAsMCwwLDAsCisJMjU1LDI1NSw2NiwzNiw0MiwxNiw2OCwwLDQsMCw2NCwxNiwKKwkzMywxMzYsMTI4LDAsMjQsMTMzLDEzMCwxNDMsMzMsMzIsMCwwLAorCTI1NSwyNTUsODEsMzYsMzMsMTI4LDEyOCwwLDQyLDE2LDQ4LDIsCisJNywwLDY0LDIwLDMzLDMyLDAsMiwxOTMsMzEsMTkyLDEyLAorCTMzLDQwLDY0LDIsMSwwLDE2LDM4LDQyLDE2LDQ4LDIsCisJMjUxLDI1NSw2NCwxNiwzMywzMiwwLDIsMjgsMCwxOTEsMTQzLAorCTI0LDAsMTc4LDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywzMiwwLDE4OSwzOSw4LDAsMjI0LDMsCisJMCwwLDAsMCwyMzIsMjU1LDE4OSwzOSwxNiwwLDE5MSwxNzUsCisJMjM2LDYzLDE5MiwxMiwxLDE2LDQsMzYsODUsMCwyLDM2LAorCTEzMSwxMzEsMSw2MCwxMjgsMTgsMzQsMTYwLDE2LDAsMTkxLDE0MywKKwkyNCwwLDE4OSwzOSw4LDAsMjI0LDMsMCwwLDAsMCwKKwkyMTYsMjU1LDE4OSwzOSwyOCwwLDE3NywxNzUsMzMsMTM2LDEyOCwwLAorCTMyLDAsMTc4LDE3NSwzMywxNDQsMTYwLDAsMjEyLDEyOCwxMzIsMzksCisJMzYsMCwxOTEsMTc1LDE1LDYzLDE5MiwxMiwyNCwwLDE3NiwxNzUsCisJOSwwLDY0LDI2LDMzLDEyOCwwLDAsMCwwLDM3LDE0NiwKKwkxLDAsNDksMzgsMjIwLDEyOCwxMzIsMzksMTUsNjMsMTkyLDEyLAorCTEsMCwxNiwzOCw0MiwxNiwxOCwyLDI0OSwyNTUsNjQsMjAsCisJMCwwLDAsMCwyMjgsMTI4LDEzMiwzOSwxNSw2MywxOTIsMTIsCisJMCwwLDAsMCwzNiwwLDE5MSwxNDMsMzIsMCwxNzgsMTQzLAorCTI4LDAsMTc3LDE0MywyNCwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTQwLDAsMTg5LDM5LDQ4LDI1NSwxODksMzksMzMsNTYsMTI4LDAsCisJMTkyLDAsMTc4LDE3NSwzMywxNDQsMTYwLDAsMjAwLDAsMTgwLDE3NSwKKwkzMywxNjAsMTkyLDAsMjU1LDI1NSwyMjYsMzYsNiwwLDY2LDQ0LAorCTIwNCwwLDE5MSwxNzUsMTk2LDAsMTc5LDE3NSwxODgsMCwxNzcsMTc1LAorCTIsMCw2NCwyMCwxODQsMCwxNzYsMTc1LDEsMCw3LDM2LAorCTIsMCw2NCwzMCwwLDAsMCwwLDEsMCwxOCwzNiwKKwkyLDAsMTI4LDMwLDY0LDE4LDcsMCw2MCwwLDIwLDM2LAorCTIsMTMxLDMsNjAsMTkyLDI0Niw5OSwzNiwzMywxMzYsNjcsMCwKKwk0LDAsMzQsMTQyLDAsMCwwLDAsNCwwLDY0LDIwLAorCTMzLDE1Miw2NCwyLDEsMCw0LDM2LDEzMywyOSwxOTIsMTIsCisJMzMsNDAsMjI0LDAsMjU1LDMxLDQsNjAsMjU1LDI1NSwxMzIsNTIsCisJMCwxMjgsMTMzLDU0LDEyMCwwLDE2MiwzOSwzNiwxNiw2OCwwLAorCTAsMTYwLDMsNjAsMzcsMTYsNjcsMCwxMDQsMCwxNjUsMTc1LAorCTEwOCwwLDE2MCwxNzUsMTEyLDAsMTYyLDE3NSwxMiwwLDIsMzYsCisJODAsMCwxNjAsMTY3LDgyLDAsMTYyLDE2Nyw4MCwwLDE2MiwzOSwKKwkzNiwxNiw2OCwwLDM3LDEyOCw2NywwLDEwNCwwLDE2MiwzOSwKKwkzNiwxNiw2OCwwLDIzMiwxMjgsMTMyLDE0MywzNywxNiw2NywwLAorCTg0LDAsMTc2LDE3NSw4OCwwLDE2MiwxNzUsOTIsMCwxNjAsMTc1LAorCTUsMCwxMjgsMTYsNCwwLDIsMzYsODIsMCwxNjIsMTY3LAorCTI1NSwyNTUsMiwzNiw5MiwwLDE2NSwxNzUsODgsMCwxNjIsMTc1LAorCTQ0LDAsMzQsMTQyLDAsMCwwLDAsMCwwLDY2LDE0OCwKKwkwLDAsMCwwLDAsMzIsNjYsNDgsNywwLDY0LDIwLAorCTMzLDQwLDAsMCwyNTUsMjU1LDQsMzYsMiwxMzEsNSw2MCwKKwkxODQsMTQyLDE2NSwzNiwxODgsNywxOTIsMTIsMjA4LDEsNiwzNiwKKwkzMyw0MCwwLDAsNDQsMCwzNCwxNDIsMzMsNDgsMCwwLAorCTQsMCw4MCwxNzIsNDQsMCwzNiwxNDIsMjA4LDcsNywzNiwKKwkxMjksNjcsMTkyLDEyLDIsMCwxMzIsMzYsMTIsMCw2NCwyMCwKKwkwLDAsMCwwLDQ0LDAsMzQsMTQyLDAsMCwwLDAsCisJMiwwLDY5LDE0OCwyLDEzMSw0LDYwLDE1LDYzLDE5MiwxMiwKKwkxMDgsMTQyLDEzMiwzNiwyNTUsMjU1LDQsMzYsMiwxMzEsNSw2MCwKKwkxODQsMTQyLDE2NSwzNiwxODgsNywxOTIsMTIsMjE2LDEsNiwzNiwKKwkzNCwxMSwxOTIsMTIsMSwwLDQsMzYsMCwxNjMsMTYsNjAsCisJNCwxLDE2LDE0MiwwLDE2MywyLDYwLDQsMSw2NiwxNDAsCisJMCwwLDAsMCwyNTIsMjU1LDIsMTgsMCwzMywzLDM2LAorCTQ0LDAsMzQsMTQyLDAsMCwwLDAsMiwwLDY3LDE2NCwKKwk4LDAsMzQsMTQyLDAsMCwwLDAsMCwwLDY0LDE3MiwKKwkwLDE2MywxNiw2MCw0LDEsMTYsMTQyLDQ0LDAsMzYsMTQyLAorCTAsMCwwLDAsNCwwLDEzMCwxNDAsMCwwLDAsMCwKKwkwLDAsNjYsMTQ4LDAsMCwwLDAsMCwxMjgsNjYsNDgsCisJMTAsMCw2NCwyMCwwLDAsMCwwLDQ0LDAsMzUsMTQyLAorCTAsMCwwLDAsNCwwLDk4LDE0MCwwLDAsMCwwLAorCTAsMCw2NiwxNDgsMCwwLDAsMCwwLDEyOCw2Niw0OCwKKwkyNTAsMjU1LDY0LDE2LDAsMCwwLDAsMjU1LDI1NSwxMTUsMzgsCisJMTksMCw5NiwxOCwzMyw0MCw2NCwyLDQ0LDAsMzUsMTQyLAorCTAsMCwwLDAsNCwwLDk4LDE0MCwwLDAsMCwwLAorCTAsMCw2NiwxNDgsMCwwLDAsMCwwLDEyOCw2Niw0OCwKKwkyMjksMjU1LDY0LDE2LDAsMCwwLDAsNCwwLDk4LDE0MCwKKwkwLDAsMCwwLDAsMCw2NiwxNDgsMCwwLDAsMCwKKwkwLDEyOCw2Niw0OCwyNTAsMjU1LDY0LDIwLDAsMCwwLDAsCisJODksMzIsMTkyLDgsMCwwLDAsMCwyLDEzMSw0LDYwLAorCTIwMCwxNDIsMTMyLDM2LDMzLDQ4LDEyOCwyLDAsMTYzLDMsNjAsCisJNCwxLDk5LDE0MCwwLDEyOCwyLDUyLDgyLDAsMTYyLDE2NywKKwkzNSwxMjgsMTEyLDAsMTUsNjMsMTkyLDEyLDMzLDU2LDAsMiwKKwkxOSwwLDAsMTgsNjQsNDEsMTgsMCwzNSw0MCwxNzgsMCwKKwkxMjgsNDAsNSwwLDMzLDQwLDE3OCwwLDE5Miw0MCw1LDAsCisJMjYsMCwxNzYsMCwyLDAsMCwyMiwwLDAsMCwwLAorCTEzLDAsNywwLDI1NSwyNTUsMSwzNiw0LDAsMSwyMiwKKwkwLDEyOCwxLDYwLDIsMCwxNjEsMjAsMCwwLDAsMCwKKwkxMywwLDYsMCwxOCw0MCwwLDAsMjM2LDEyOCwxMzIsMzksCisJMTUsNjMsMTkyLDEyLDAsMCwwLDAsMjA0LDAsMTkxLDE0MywKKwkyMDAsMCwxODAsMTQzLDE5NiwwLDE3OSwxNDMsMTkyLDAsMTc4LDE0MywKKwkxODgsMCwxNzcsMTQzLDE4NCwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTIwOCwwLDE4OSwzOSwyMjQsMjU1LDE4OSwzOSwyMCwwLDE3NywxNzUsCisJMzMsMTM2LDEyOCwwLDI0LDAsMTkxLDE3NSwxODAsMTAsMTkyLDEyLAorCTE2LDAsMTc2LDE3NSwzNCwxMSwxOTIsMTIsMSwwLDQsMzYsCisJMTYsMTMzLDEzMiwxNDMsMCwxNjMsMTYsNjAsNCwxLDE2LDE0MiwKKwkxOTMsNjMsMTkyLDEyLDAsMCwwLDAsMCwxNjMsMiw2MCwKKwk0LDEsNjYsMTQwLDAsMCwwLDAsMzUsNDAsODAsMCwKKwk3MywyNTIsMTYyLDM2LDk5LDAsNjYsNDQsNCwwLDY0LDE2LAorCTAsMCwwLDAsMiwxMzEsNCw2MCwxOTYsMzIsMTkyLDgsCisJMCwxNDMsMTMyLDM2LDUsMCwxNjAsMjAsMCwwLDAsMCwKKwkyLDEzMSw0LDYwLDM2LDE0MywxMzIsMzYsMTk2LDMyLDE5Miw4LAorCTMzLDQwLDAsMCwyLDEzMSw0LDYwLDc2LDE0MywxMzIsMzYsCisJMTUsNjMsMTkyLDEyLDEsMCwxNiwzNiwzLDAsNDgsMTgsCisJMCwwLDAsMCwzNCwxMSwxOTIsMTIsMzMsMzIsMCwwLAorCTAsMTI5LDE0NCwxNzUsMjQsMCwxOTEsMTQzLDIwLDAsMTc3LDE0MywKKwkxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLDMyLDAsMTg5LDM5LAorCTIwMCwyNTUsMTg5LDM5LDMyLDAsMTc4LDE3NSwzMywxNDQsMTI4LDAsCisJMzMsNDgsNjQsMiw0NCwwLDE4MSwxNzUsMSwxMzEsMjEsNjAsCisJNjAsMjUyLDE4MSwzOCwzMyw1NiwxNjAsMiw0MCwwLDE4MCwxNzUsCisJMiwxMzEsMjAsNjAsMTQ0LDE0MywxNDgsMzgsMzYsMCwxNzksMTc1LAorCTAsMTYzLDE5LDYwLDEyMCwxLDExNSwxNDIsMCwxNjMsMyw2MCwKKwkxMjAsMSw5OSwxNDAsMzIsMTMxLDIsNjAsNDgsMCwxOTEsMTc1LAorCTI4LDAsMTc3LDE3NSwyNCwwLDE3NiwxNzUsMTYsMCwxODAsMTc1LAorCTMzLDMyLDk2LDIsMzUsMTM2LDY3LDAsODQsNjQsMTkyLDEyLAorCTMzLDQwLDMyLDIsMywwLDY0LDE4LDMzLDEyOCw2NCwwLAorCTEwLDAsMCwyMiwwLDAsMCwwLDE2LDAsMTgwLDE3NSwKKwkzMywzMiw5NiwyLDMzLDQwLDMyLDIsMzMsNDgsNjQsMiwKKwkyNDQsNjMsMTkyLDEyLDMzLDU2LDE2MCwyLDMzLDEyOCwyLDIsCisJNSwwLDAsMTgsMzMsNDAsOTYsMiwyLDEzMSw0LDYwLAorCTE2OCwxNDMsMTMyLDM2LDI1MiwzMiwxOTIsOCwzMyw0MCw5NiwyLAorCTIsMTMxLDQsNjAsMjA0LDE0MywxMzIsMzYsMTUsNjMsMTkyLDEyLAorCTMzLDQ4LDE3NywwLDQ4LDAsMTkxLDE0Myw0NCwwLDE4MSwxNDMsCisJNDAsMCwxODAsMTQzLDM2LDAsMTc5LDE0MywzMiwwLDE3OCwxNDMsCisJMjgsMCwxNzcsMTQzLDI0LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNTYsMCwxODksMzksMCwxNjMsMSw2MCwyMzIsNSwzNiwxNzIsCisJMCwxNjMsMSw2MCw4LDAsMjI0LDMsMjM2LDUsMzcsMTcyLAorCTI4LDEyOSwxMzIsMTc1LDgsMCwyMjQsMywwLDAsMCwwLAorCTE2LDEyOSwxMzIsMTc1LDgsMCwyMjQsMywwLDAsMCwwLAorCTE1LDAsMTMyLDQ4LDIwLDEyOSwxMzIsMTc1LDgsMCwyMjQsMywKKwkwLDAsMCwwLDI0LDEyOSwxMzIsMTc1LDgsMCwyMjQsMywKKwkwLDAsMCwwLDMyLDEyOSwxMzIsMTc1LDgsMCwyMjQsMywKKwkwLDAsMCwwLDMzLDcyLDEyOCwwLDMzLDgwLDE2MCwwLAorCTMzLDg4LDE5MiwwLDcsMTYyLDQsNjAsNDgsMSwxMzIsNTIsCisJNywxNjIsOCw2MCwwLDEsOCw1MywyMCwxMjksMTMwLDE0MywKKwkyNCwxMjksMTMxLDE0MywxMjgsNDgsMiwwLDI4LDEyOSwxMzAsMTQzLAorCTMsMCwxOTcsNTIsMiwwLDk2LDE2LDAsMCwxMzAsMTcyLAorCTY3LDAsMTk3LDUyLDE2LDEyOSwxMzAsMTQzLDAsMCwwLDAsCisJMiwwLDY0LDE2LDMzLDI0LDE2MCwwLDAsMSw5OSw1MiwKKwkzNiwxMjksMTMwLDE0MywwLDAsMCwwLDIsMCw2NCwxNiwKKwkwLDAsMCwwLDAsNCw5OSw1MiwzMiwxMjksMTMwLDE0MywKKwkwLDAsMywxNzMsMywwLDY0LDE2LDcsMTYyLDUsNjAsCisJMCwwLDIsMTczLDcsMTYyLDUsNjAsNCwxLDE2NSw1MiwKKwk3LDE2Miw2LDYwLDgsMSwxOTgsNTIsMjU1LDAsMiw2MCwKKwkyNTUsMjU1LDY2LDUyLDcsMTYyLDMsNjAsMTIsMSw5OSw1MiwKKwk3LDE2Miw0LDYwLDE2LDEsMTMyLDUyLDM2LDE2LDY2LDEsCisJMCwwLDE2OSwxNzIsMCwwLDE5NCwxNzIsNDMsMTYsNywwLAorCTE5MiwxNiwyLDAsMCwwLDEwNywxNzIsOCwwLDIyNCwzLAorCTAsMCwxMzAsMTcyLDcsMTYyLDMsNjAsNDAsMSw5OSw1MiwKKwkzLDAsMiwzNiwwLDE2MywxLDYwLDIwLDEsMzIsMTcyLAorCTgsMCwyMjQsMywwLDAsOTgsMTcyLDIzMiwyNTUsMTg5LDM5LAorCTE2LDAsMTkxLDE3NSwzMywyNCwwLDAsNywxNjIsNiw2MCwKKwk0MCwxLDE5OCw1MiwxNSwwLDQsNjAsNjMsNjYsMTMyLDUyLAorCTAsMCwxOTcsMTQwLDAsMCwwLDAsMTYsMCwxNjIsNDgsCisJNywwLDY0LDIwLDEsMCw5OSwzNiw0MiwxNiwxMzEsMCwKKwkyNDksMjU1LDY0LDE2LDAsMCwwLDAsMiwxMzEsNCw2MCwKKwkxMjIsMzMsMTkyLDgsMjQwLDE0MywxMzIsMzYsMzYsMTI5LDEzMCwxNDMsCisJMCwwLDAsMCwzLDAsNjQsMjAsMzMsMjQsMCwwLAorCTEyNSwzMywxOTIsOCwzMywxNiwwLDAsMSwwLDUsMzYsCisJMTUsMCw0LDYwLDYzLDY2LDEzMiw1MiwwLDE2MywyLDYwLAorCTIwLDEsNjYsMTQwLDAsMCwwLDAsMjQ3LDI1NSw2OSwxNiwKKwkxLDAsOTksMzYsNDIsMTYsMTMxLDAsMjQ5LDI1NSw2NCwxNiwKKwkwLDAsMCwwLDAsMTYzLDUsNjAsMjAsMSwxNjUsMTQwLAorCTIsMTMxLDQsNjAsMjQsMTQ0LDEzMiwzNiwxNSw2MywxOTIsMTIsCisJMCwwLDAsMCwxLDAsMiwzNiwxNiwwLDE5MSwxNDMsCisJMjQsMCwxODksMzksOCwwLDIyNCwzLDAsMCwwLDAsCisJMjI0LDI1NSwxODksMzksMjQsMCwxOTEsMTc1LDMzLDcyLDE5MiwwLAorCTI1NSwzMSwzLDYwLDI1NSwyNTUsOTksNTIsMzMsNjQsMCwwLAorCTM2LDMyLDEzMSwwLDAsMTYwLDIsNjAsMzcsMzIsMTMwLDAsCisJMzYsNDAsMTYzLDAsMTYsMCwzMiwyNSwzNyw0MCwxNjIsMCwKKwkwLDAsMTM0LDE0NCwwLDAsMTY3LDE0NCwwLDAsMCwwLAorCTcsMCwxOTksMTYsMSwwLDE2NSwzNiwyLDEzMSw0LDYwLAorCTcyLDE0NCwxMzIsMzYsMTUsNjMsMTkyLDEyLDMzLDQwLDAsMSwKKwkxNTcsMzMsMTkyLDgsMSwwLDIsMzYsMSwwLDgsMzcsCisJNDIsMTYsOSwxLDI0MiwyNTUsNjQsMjAsMSwwLDEzMiwzNiwKKwkzMywxNiwwLDAsMjQsMCwxOTEsMTQzLDMyLDAsMTg5LDM5LAorCTgsMCwyMjQsMywwLDAsMCwwLDAsMTYzLDIsNjAsCisJMjMyLDUsNjYsMTQwLDE1MiwyNTUsMTg5LDM5LDgwLDAsMTgwLDE3NSwKKwkxMjAsMCwxODAsMTQzLDY0LDAsMTc2LDE3NSwzMywxMjgsMTYwLDAsCisJNjgsMCwxNzcsMTc1LDMzLDEzNiwxOTIsMCw3MiwwLDE3OCwxNzUsCisJMzMsMTQ0LDIyNCwwLDEwMCwwLDE5MSwxNzUsOTYsMCwxOTAsMTc1LAorCTkyLDAsMTgzLDE3NSw4OCwwLDE4MiwxNzUsODQsMCwxODEsMTc1LAorCTc2LDAsMTc5LDE3NSwxMiwwLDY0LDE2LDE2LDAsMTY0LDE3NSwKKwkwLDE2MywyLDYwLDIzNiw1LDY2LDE0MCwwLDAsMCwwLAorCTcsMCw2NCwxNiwwLDAsMCwwLDAsMTYzLDIsNjAsCisJMjM2LDUsNjYsMTQwLDAsMCwwLDAsMSw4LDY2LDQ0LAorCTEwLDAsNjQsMjAsMTYsMCwyLDYwLDAsMTYzLDUsNjAsCisJMjMyLDUsMTY1LDE0MCwwLDE2Myw2LDYwLDIzNiw1LDE5OCwxNDAsCisJMiwxMzEsNCw2MCwxNSw2MywxOTIsMTIsMTI0LDE0NCwxMzIsMzYsCisJNywzNSwxOTIsOCwwLDAsMCwwLDE2LDAsMTY4LDE0MywKKwkwLDAsMCwwLDQzLDE2LDcyLDAsNiwwLDY0LDE2LAorCTAsMCwwLDAsMiwxMzEsNCw2MCwxNSw2MywxOTIsMTIsCisJMTcyLDE0NCwxMzIsMzYsNywzNSwxOTIsOCwwLDAsMCwwLAorCTIyNCwxMzIsMTMwLDE0MywwLDAsMCwwLDExLDAsNjQsMjAsCisJMCwwLDAsMCwwLDE2Myw0LDYwLDIzNiw1LDEzMiwxNDAsCisJMTMsOCwxOTIsMTIsMCwwLDAsMCwyNTUsMzEsMyw2MCwKKwkyNTUsMjU1LDk5LDUyLDM2LDE2LDY3LDAsMCwxNjAsMyw2MCwKKwkzNywxNiw2NywwLDIyNCwxMzIsMTMwLDE3NSwyMjgsMTMyLDEzMCwxNDMsCisJMCwwLDAsMCwxMSwwLDY0LDIwLDAsMCwwLDAsCisJMCwxNjMsNCw2MCwyMzYsNSwxMzIsMTQwLDEzLDgsMTkyLDEyLAorCTAsMCwwLDAsMjU1LDMxLDMsNjAsMjU1LDI1NSw5OSw1MiwKKwkzNiwxNiw2NywwLDAsMTYwLDMsNjAsMzcsMTYsNjcsMCwKKwkyMjgsMTMyLDEzMCwxNzUsMjI0LDEzMiwxMzMsMTQzLDAsMTYzLDYsNjAsCisJMjMyLDUsMTk4LDE0MCwyMjgsMTMyLDEzNSwxNDMsMiwxMzEsNCw2MCwKKwkxNSw2MywxOTIsMTIsMjA4LDE0NCwxMzIsMzYsMTYsMTI5LDEzMywxNDMsCisJMjAsMTI5LDEzNCwxNDMsMiwxMzEsNCw2MCwxNSw2MywxOTIsMTIsCisJOCwxNDUsMTMyLDM2LDcsMTYyLDIsNjAsMjMyLDAsNjYsNTIsCisJMCwwLDgzLDE0MCwxLDAsMywxMzAsMTA1LDAsMiwzNiwKKwk3LDAsOTgsMjAsMjUxLDI1NSwyLDYwLDEsMCwyLDM2LAorCTM2LDEyOSwxMzAsMTc1LDQsMCwyLDYwLDAsOCw2Niw1MiwKKwkxMCwzNCwxOTIsOCwzNywxNTIsOTgsMiwzNiwxMjksMTI4LDE3NSwKKwkyNTUsMjQ3LDY2LDUyLDM2LDE1Miw5OCwyLDcsMTYyLDIsNjAsCisJMjMyLDAsNjYsNTIsMCwwLDgzLDE3MiwwLDAsNSwxMzAsCisJMTE0LDAsMiwzNiwzLDAsMTYyLDE2LDgyLDAsMiwzNiwKKwkzLDAsMTYyLDIwLDExOSwwLDIsMzYsNDIsMzQsMTkyLDgsCisJMzMsMTc2LDAsMCwzLDAsMTYyLDE2LDg3LDAsMiwzNiwKKwkzLDAsMTYyLDIwLDEwOCwwLDIsMzYsNDIsMzQsMTkyLDgsCisJMSwwLDIyLDM2LDMsMCwxNjIsMTYsNzYsMCwyLDM2LAorCTMsMCwxNjIsMjAsMTE2LDAsMiwzNiw0MiwzNCwxOTIsOCwKKwkyLDAsMjIsMzYsMTE4LDAsMTYyLDE2LDg0LDAsMiwzNiwKKwkxMTYsMCwxNjIsMTYsMCwwLDAsMCwyLDEzMSw0LDYwLAorCTE1LDYzLDE5MiwxMiw1MiwxNDUsMTMyLDM2LDcsMzUsMTkyLDgsCisJMCwwLDAsMCwwLDAsMzgsMTMwLDAsMCwwLDAsCisJMTIsMCwxOTIsMTYsOTksMCwyLDM2LDMsMCwxOTQsMTYsCisJNjcsMCwyLDM2LDQsMCwxOTQsMjAsMzMsMTUyLDAsMCwKKwk1LDAsMTksMzYsNjEsMzQsMTkyLDgsNSwwLDIxLDM2LAorCTIsMTMxLDEsNjAsODAsMTU1LDUwLDE2MCw2MSwzNCwxOTIsOCwKKwkzMywxNjgsMCwwLDMzLDE2OCwwLDAsNSwwLDE5LDM2LAorCTIsMTMxLDEsNjAsODAsMTU1LDMyLDE2MCwxNiwwLDE2OCwxNDMsCisJMCwxNjMsMTgsNjAsMjM2LDUsODIsMTQyLDAsMCwwLDAsCisJMTk3LDAsMCwxNywyNTUsMjU1LDIwLDM3LDI1NSwyNTUsMTk0LDM4LAorCTIsMCw4Nyw0NCwyLDAsMzAsMzYsMzMsMTI4LDE2MCwyLAorCTQyLDE2LDExMiwyLDczLDAsNjQsMjAsMCwwLDAsMCwKKwk0MiwwLDIyNCwxOCw1LDAsMiwzNiwxMywwLDIsMjIsCisJMCwwLDAsMCwyNSwwLDY0LDI2LDMzLDEzNiwwLDAsCisJMjI0LDEzMiwxMzAsMTQzLDAsMCwwLDAsMzMsMTYsODEsMCwKKwkwLDAsODEsMTYwLDEsMCw0OSwzOCw0MiwxNiw1MCwyLAorCTI0OSwyNTUsNjQsMjAsMzMsNDgsNjQsMiwxMDUsMzQsMTkyLDgsCisJMCwwLDAsMCwyLDEzMSwzLDYwLDMzLDI0LDExMiwwLAorCTgwLDE1NSw5OSwxNDQsMCwwLDAsMCw5LDAsNjQsMjYsCisJMzMsMTM2LDAsMCwyMjQsMTMyLDEzMCwxNDMsMCwwLDAsMCwKKwkzMywxNiw4MSwwLDEsMCw0OSwzOCwwLDAsNjcsMTYwLAorCTQyLDE2LDUwLDIsMjQ5LDI1NSw2NCwyMCwwLDAsMCwwLAorCTMzLDQ4LDY0LDIsMCwxNjMsNCw2MCwyMzIsNSwxMzIsMTQwLAorCTIyNCwxMzIsMTMzLDE0MywwLDAsMCwwLDI4LDMzLDE5MiwxMiwKKwkxLDAsNywzNiw3NiwzMywxOTIsMTIsMCwwLDAsMCwKKwk4MywzMywxOTIsMTIsMCwwLDAsMCwxNDcsMCw2NCwyMCwKKwkwLDAsMCwwLDMsMCwxOTIsMTgsMzMsNDgsNjQsMiwKKwkyMiwwLDIyMiwyMiwwLDAsMCwwLDAsMTYzLDQsNjAsCisJMjMyLDUsMTMyLDE0MCwyMjgsMTMyLDEzMywxNDMsMCwwLDAsMCwKKwkyOCwzMywxOTIsMTIsMzMsNTYsMCwwLDc2LDMzLDE5MiwxMiwKKwkwLDAsMCwwLDgzLDMzLDE5MiwxMiwwLDAsMCwwLAorCTEzMSwwLDY0LDIwLDAsMCwwLDAsOCwwLDIyMiwyMiwKKwkwLDAsMCwwLDIyNCwxMzIsMTMyLDE0MywyMjgsMTMyLDEzMywxNDMsCisJMCwwLDAsMCwxMjksMzMsMTkyLDEyLDMzLDQ4LDY0LDIsCisJMTIyLDAsNjQsMjAsMCwwLDAsMCwxLDAsMTYsMzgsCisJNDIsMTYsMTEyLDIsMTg1LDI1NSw2NCwxNiwwLDAsMCwwLAorCTI1NSwyNTUsMTQ4LDM4LDI1NSwyNTUsMiwzNiwxNzgsMjU1LDEzMCwyMiwKKwkzMywxMjgsMTYwLDIsNywzNSwxOTIsOCwwLDAsMCwwLAorCTE4MCwxMCwxOTIsMTIsMCwwLDAsMCwzNCwxMSwxOTIsMTIsCisJMSwwLDQsMzYsMCwwLDM0LDEzMCwwLDAsMCwwLAorCTYsMCw2NCwxNiwzMywxODQsMCwwLDI0LDAsMTYwLDE3NSwKKwkyLDEzMSwxLDYwLDg4LDE1NSw1MiwxNjQsMTcxLDM0LDE5Miw4LAorCTMzLDE3NiwwLDAsNiwwLDIzLDM2LDQsMCwyLDM2LAorCTI0LDAsMTYwLDE3NSwyLDEzMSwxLDYwLDg4LDE1NSwzNCwxNjQsCisJMzMsMTc2LDAsMCwwLDgsMzAsMzYsMjQsMCwxNzcsMTQzLAorCTAsMCwwLDAsNDIsMTYsMjQxLDIsODMsMCw2NCwyMCwKKwk2NCwxNiwxNywwLDIsMTMxLDgsNjAsODgsMTU1LDgsMzcsCisJMzMsMTY4LDcyLDAsMCwwLDE3OCwxNTAsMCwwLDAsMCwKKwkyNiwwLDIxMCwzLDIsMCw2NCwyMiwwLDAsMCwwLAorCTEzLDAsNywwLDI1NSwyNTUsMSwzNiw0LDAsNjUsMjIsCisJMCwxMjgsMSw2MCwyLDAsMTkzLDIzLDAsMCwwLDAsCisJMTMsMCw2LDAsMTgsMTYsMCwwLDE2LDAsMTY4LDE0MywKKwkwLDAsMCwwLDI0LDAsNzIsMCwzMyw1NiwxOTIsMiwKKwkzMywxMjgsMCwwLDAsMTYzLDE5LDYwLDQsMSwxMTUsMTQyLAorCTAsMTYzLDQsNjAsMjMyLDUsMTMyLDE0MCwyMjQsMTMyLDEzMywxNDMsCisJMTgsMTYwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMjgsMzMsMTkyLDEyLDMzLDQ4LDY0LDIsMTAsMCwxMjgsMjYsCisJMCwwLDAsMCw3NiwzMywxOTIsMTIsMCwwLDAsMCwKKwk4MywzMywxOTIsMTIsMCwwLDAsMCw0OCwwLDY0LDIwLAorCTEsMCwxNiwzOCw0MiwxNiwyMCwyLDI0OCwyNTUsNjQsMjAsCisJMCwwLDAsMCwyLDEzMSw1LDYwLDE0MCwxNDUsMTY1LDM2LAorCTAsMTYzLDE2LDYwLDQsMSwxNiwxNDIsMywwLDE5MiwxOCwKKwkwLDAsMCwwLDIsMTMxLDUsNjAsMTI4LDE0NSwxNjUsMzYsCisJMiwxMzEsNCw2MCw5NiwxNDUsMTMyLDM2LDE1LDYzLDE5MiwxMiwKKwkzMyw0OCw2NCwyLDE5LDAsMTksMTgsMjQsMCwxNDYsMiwKKwkxOCwyNCwwLDAsMzUsMTYsMTksMiwwLDAsMCwwLAorCTI3LDAsOTgsMCwyLDAsNjQsMjAsMCwwLDAsMCwKKwkxMywwLDcsMCwxOCwxNiwwLDAsMiwxMzEsNCw2MCwKKwkxNTIsMTQ1LDEzMiwzNiw2NCw0MSwyLDAsMzUsNDAsMTYyLDAsCisJMTI4LDQwLDUsMCwzMyw0MCwxNjIsMCwxNSw2MywxOTIsMTIsCisJMTkyLDQwLDUsMCwyNTUsMzQsMTkyLDgsMiwwLDE4MSwzOCwKKwkyLDEzMSw0LDYwLDE2OCwxNDUsMTMyLDM2LDE1LDYzLDE5MiwxMiwKKwkyLDAsMTgxLDM4LDEsMCw0OSwzOCw0MiwxNiwyNDEsMiwKKwkxNzgsMjU1LDY0LDE2LDAsMCwwLDAsMSwwLDIxNCwzOCwKKwkyLDAsMTk0LDQyLDE2NiwyNTUsNjQsMjAsMCwwLDAsMCwKKwkxMDAsMCwxOTEsMTQzLDk2LDAsMTkwLDE0Myw5MiwwLDE4MywxNDMsCisJODgsMCwxODIsMTQzLDg0LDAsMTgxLDE0Myw4MCwwLDE4MCwxNDMsCisJNzYsMCwxNzksMTQzLDcyLDAsMTc4LDE0Myw2OCwwLDE3NywxNDMsCisJNjQsMCwxNzYsMTQzLDgsMCwyMjQsMywxMDQsMCwxODksMzksCisJMCwwLDAsMCw0MywxNiwxMzQsMCwwLDAsMTY0LDE3NSwKKwk0LDAsMTY1LDE3NSw4LDAsMTY2LDE3NSw3LDAsNjQsMjAsCisJMTIsMCwxNjcsMTc1LDQzLDE2LDE5NiwwLDUsMCw2NCwyMCwKKwkxLDAsMiwzNiw0MywxNiwxNjcsMCwyLDAsNjQsMTYsCisJNDMsMTYsMjI5LDAsMjU1LDI1NSwyLDM2LDgsMCwyMjQsMywKKwkwLDAsMCwwLDIzMiwyNTUsMTg5LDM5LDMsMTMxLDQsNjAsCisJMjA4LDEyLDEzMiwzNiwxNzAsMCw1LDM2LDE2LDAsMTkxLDE3NSwKKwkxNDQsNzEsMTkyLDEyLDYwLDAsNiwzNiwyLDEzMSw2LDYwLAorCTExMiwxNTUsMTk4LDM2LDIsMTMxLDIsNjAsMjEyLDI0Niw2NiwxNDAsCisJMiwxMzEsMyw2MCwyMTYsMjQ2LDk5LDEzMiwwLDAsMTk0LDE3MiwKKwk0LDAsMTk1LDE2NCwyLDEzMSwyLDYwLDEzOCwxNTUsNjYsMTQ4LAorCTIsMTMxLDMsNjAsMTMyLDE1NSw5OSwxNDgsMiwxMzEsNCw2MCwKKwkxMzQsMTU1LDEzMiwxNDgsMiwxMzEsNSw2MCwxMzYsMTU1LDE2NSwxNDgsCisJMywxMzEsMSw2MCwyMTYsMTIsMzQsMTY0LDIsMTMxLDIsNjAsCisJMTMwLDE1NSw2NiwxNDgsMywxMzEsMTAsNjAsMjE4LDEyLDc0LDM3LAorCTMsMCwxOTksMTM2LDAsMCwxOTksMTUyLDQsMCwyMDAsMTI4LAorCTUsMCwyMDEsMTI4LDMsMCw3MSwxNjksMCwwLDcxLDE4NSwKKwk0LDAsNzIsMTYxLDUsMCw3MywxNjEsMywxMzEsMSw2MCwKKwkyMzgsMTIsMzUsMTY0LDMsMTMxLDEsNjAsMjQyLDEyLDM2LDE2NCwKKwkzLDEzMSwxLDYwLDI0NiwxMiwzNywxNjQsMywxMzEsMSw2MCwKKwkyNDAsMTIsMzQsMTY0LDE2LDAsMTkxLDE0MywyNCwwLDE4OSwzOSwKKwk4LDAsMjI0LDMsMCwwLDAsMCwzLDEzMSwyLDYwLAorCTIxNiwxMiw2NiwxNDAsMywxMzEsMyw2MCwyMjAsMTIsOTksMTQwLAorCTMsMTMxLDEsNjAsMjA4LDEyLDM0LDE3MiwzLDEzMSwxLDYwLAorCTIxMiwxMiwzNSwxNzIsMywxMzEsMiw2MCwyMzgsMTIsNjYsMTQ4LAorCTMsMTMxLDMsNjAsMjQwLDEyLDk5LDE0OCwzLDEzMSw0LDYwLAorCTI0MiwxMiwxMzIsMTQ4LDIzMiwyNTUsMTg5LDM5LDE2LDAsMTc2LDE3NSwKKwkzLDEzMSwxLDYwLDIzNCwxMiwzNSwxNjQsMjQsMTMzLDEzMSwxNDMsCisJMjAsMCwxOTEsMTc1LDMsMTMxLDEsNjAsMjI0LDEyLDMyLDE3MiwKKwkzLDEzMSwxLDYwLDIyOCwxMiwzMiwxNzIsMywxMzEsMSw2MCwKKwkyNDgsMTIsMzIsMTcyLDMsMTMxLDEsNjAsMjUyLDEyLDMyLDE3MiwKKwkzLDEzMSwxLDYwLDgsMTMsMzIsMTY0LDMsMTMxLDEsNjAsCisJNCwxMywzMiwxNjQsMywxMzEsMSw2MCwyMzIsMTIsMzQsMTY0LAorCTMzLDE2LDY4LDAsMywxMzEsMSw2MCwyMzYsMTIsMzYsMTY0LAorCTMsMTMxLDEsNjAsMjQ0LDEyLDM0LDE2NCw4LDAsOTYsMjQsCisJMSwwLDE2LDM2LDE1MCwzNSwxOTIsMTIsMzMsMzIsMCwyLAorCTI0LDEzMywxMzAsMTQzLDEsMCwxNiwzOCw0MiwxNiw4MCwwLAorCTI1MCwyNTUsNjQsMTYsMCwwLDAsMCwyMDYsMzUsMTkyLDEyLAorCTAsMCwwLDAsNTIsMzYsMTkyLDEyLDAsMCwwLDAsCisJMSwwLDIsMzYsMywxMzEsMSw2MCwwLDEzLDM0LDE2NCwKKwkzLDAsMiwzNiwzLDEzMSwxLDYwLDIsMTMsMzIsMTY0LAorCTMsMTMxLDEsNjAsMjAsMTMsMzQsMTcyLDIsMTMxLDEsNjAsCisJMTY0LDI0NywzNCwxNzIsMjAsMCwxOTEsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsMjQsMCwxODksMzksMjI0LDI1NSwxODksMzksCisJMjAsMCwxNzcsMTc1LDMzLDEzNiwxMjgsMCwxNiwwLDE3NiwxNzUsCisJMTkyLDEyOSwxNywwLDMsMTMxLDQsNjAsMTYsMTMsMTMyLDM2LAorCTMzLDMyLDQsMiwxODcsMCw1LDM2LDI0LDAsMTkxLDE3NSwKKwkxNDQsNzEsMTkyLDEyLDEyOCwwLDYsMzYsMiwxMzEsMiw2MCwKKwkxNDAsMTU1LDY2LDE0OCwxMDAsMCwzLDM2LDMsMTMxLDEsNjAsCisJMzMsOCw0OCwwLDI0LDEzLDM1LDE3MiwwLDE4LDIsMCwKKwkzNywxNiwzNCwyLDMsMTMxLDEsNjAsMzMsOCw0OCwwLAorCTE2LDEzLDM0LDE2NCwyMiwzNiwxOTIsMTIsMzMsMzIsMzIsMiwKKwk0LDAsMiwzNiw2NCwxMzgsMTcsMCwzLDEzMSwxLDYwLAorCTMzLDgsNDgsMCwyMCwxMywzNCwxNzIsMiwxMzEsMSw2MCwKKwkzMyw4LDQ5LDAsMTY0LDI0NywzNCwxNzIsMywxMzEsMSw2MCwKKwkzMyw4LDQ4LDAsNTIsMTMsMzIsMTcyLDMsMTMxLDEsNjAsCisJMzMsOCw0OCwwLDU2LDEzLDMyLDE3MiwzLDEzMSwxLDYwLAorCTMzLDgsNDgsMCwxMDYsMTMsMzIsMTY0LDMsMTMxLDEsNjAsCisJMzMsOCw0OCwwLDExMCwxMywzMiwxNjQsMywxMzEsMSw2MCwKKwkzMyw4LDQ4LDAsMTE0LDEzLDMyLDE2NCwzLDEzMSwxLDYwLAorCTMzLDgsNDgsMCwxMjAsMTMsMzIsMTcyLDI0LDAsMTkxLDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkzMiwwLDE4OSwzOSwyNCwxMzMsMTMwLDE0MywyMTYsMjU1LDE4OSwzOSwKKwkyMCwwLDE3NywxNzUsMSwwLDE3LDM2LDM2LDAsMTkxLDE3NSwKKwkzMiwwLDE4MCwxNzUsMjgsMCwxNzksMTc1LDI0LDAsMTc4LDE3NSwKKwk1NSwwLDY0LDI0LDE2LDAsMTc2LDE3NSwzLDEzMSwyMCw2MCwKKwkyMjgsMTIsMTQ4LDM4LDMsMTMxLDIsNjAsNTYsMTMsNjYsMzYsCisJMTI4LDAsODMsMzYsMTI0LDAsODIsMzYsMTI4LDAsMTYsMzYsCisJMCwwLDEzMCwxNDIsMCwwLDAsMCw2LDAsMzQsMjIsCisJMzMsMzIsMzIsMiwwLDAsNjQsMTc0LDEwMSwzNiwxOTIsMTIsCisJMCwwLDk2LDE3NCw4LDM2LDE5Miw4LDEyOCwwLDExNSwzOCwKKwkzLDEzMSw0LDYwLDMzLDMyLDE0NCwwLDQwLDEzLDEzMiwxNDAsCisJMywxMzEsNSw2MCwzMyw0MCwxNzYsMCw0NCwxMywxNjUsMTQwLAorCTI0NCwyNTUsMTM0LDE0MiwyNDgsMjU1LDEzNSwxNDIsMjAsMzUsMTkyLDEyLAorCTAsMCwwLDAsMTcsMCw2NCwyMCwzMywzMiwzMiwyLAorCTMsMTMxLDMsNjAsMzMsMjQsMTEyLDAsNDgsMTMsOTksMTQ4LAorCTMsMTMxLDIsNjAsMzMsMTYsODAsMCwxNiwxMyw2NiwxNDgsCisJMCwwLDAsMCw4LDAsOTgsMjAsMCwwLDAsMCwKKwkzLDEzMSwxLDYwLDMzLDgsNDgsMCwxMDYsMTMsMzIsMTY0LAorCTEwMSwzNiwxOTIsMTIsMzMsMzIsMzIsMiw4LDM2LDE5Miw4LAorCTEyOCwwLDExNSwzOCwwLDAsNjQsMTc0LDEyNSwzNiwxOTIsMTIsCisJMCwwLDk2LDE3NCwxMjgsMCwxMTUsMzgsMTI4LDAsODIsMzgsCisJMjQsMTMzLDEzMCwxNDMsMSwwLDQ5LDM4LDQyLDE2LDgxLDAsCisJMjEwLDI1NSw2NCwxNiwxMjgsMCwxNiwzOCwzNiwwLDE5MSwxNDMsCisJMzIsMCwxODAsMTQzLDI4LDAsMTc5LDE0MywyNCwwLDE3OCwxNDMsCisJMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNDAsMCwxODksMzksMTkyLDMzLDQsMCwzLDEzMSwyLDYwLAorCTI4LDEzLDY2LDM2LDMzLDI0LDEzMCwwLDMsMTMxLDUsNjAsCisJMjA4LDEyLDE2NSwxNDAsMywxMzEsNiw2MCwyMTIsMTIsMTk4LDE0MCwKKwkwLDAsMTAxLDE3Miw0LDAsMTAyLDE3MiwxMiwwLDY2LDM2LAorCTMsMTMxLDMsNjAsMjI0LDEyLDk5LDE0MCwzMywxNiwxMzAsMCwKKwkzLDEzMSwxLDYwLDMzLDgsMzYsMCwzNiwxMywzNSwxNzIsCisJMywxMzEsMyw2MCwyMTYsMTIsOTksMTQwLDMsMTMxLDUsNjAsCisJMjIwLDEyLDE2NSwxNDAsMCwwLDY3LDE3Miw0LDAsNjksMTcyLAorCTMsMTMxLDIsNjAsMzMsMTYsNjgsMCwxNiwxMyw2NiwxNDgsCisJMywxMzEsMSw2MCwzMyw4LDM2LDAsOCwwLDIyNCwzLAorCTQ4LDEzLDM0LDE2NCwyNCwxMzMsMTMwLDE0MywyMjQsMjU1LDE4OSwzOSwKKwkyMCwwLDE3NywxNzUsMSwwLDE3LDM2LDI0LDAsMTkxLDE3NSwKKwkzOCwwLDY0LDI0LDE2LDAsMTc2LDE3NSwxMjgsMCwxNiwzNiwKKwkzLDEzMSw0LDYwLDMzLDMyLDE0NCwwLDQwLDEzLDEzMiwxNDAsCisJMywxMzEsNSw2MCwzMyw0MCwxNzYsMCw0NCwxMywxNjUsMTQwLAorCTMsMTMxLDYsNjAsMjE2LDEyLDE5OCwxNDAsMywxMzEsNyw2MCwKKwkyMjAsMTIsMjMxLDE0MCwyMCwzNSwxOTIsMTIsMCwwLDAsMCwKKwkxOCwwLDY0LDIwLDAsMCwwLDAsMywxMzEsMyw2MCwKKwkzMywyNCwxMTIsMCw0OCwxMyw5OSwxNDgsMywxMzEsMiw2MCwKKwkzMywxNiw4MCwwLDE2LDEzLDY2LDE0OCwwLDAsMCwwLAorCTksMCw5OCwyMCwwLDAsMCwwLDMsMTMxLDIsNjAsCisJMzMsMTYsODAsMCwyMCwxMyw2NiwxNDAsMCwwLDAsMCwKKwkzLDAsNjQsMTYsMCwwLDAsMCwyMDMsMzYsMTkyLDEyLAorCTMzLDMyLDMyLDIsMjQsMTMzLDEzMCwxNDMsMSwwLDQ5LDM4LAorCTQyLDE2LDgxLDAsMjIxLDI1NSw2NCwxNiwxMjgsMCwxNiwzOCwKKwkyNCwwLDE5MSwxNDMsMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsMzIsMCwxODksMzksMTkyLDQxLDQsMCwKKwkzLDEzMSwzLDYwLDMzLDI0LDEwMSwwLDIwLDEzLDk5LDE0MCwKKwk0LDAsMiwzNiwxNiwwLDk4LDIwLDI0MCwyNTUsMTg5LDM5LAorCTEsMCwyLDM2LDY0LDI2LDQsMCwzLDEzMSwxLDYwLAorCTMzLDgsMzcsMCwyMCwxMywzNCwxNzIsMiwxMzEsMSw2MCwKKwkzMyw4LDM1LDAsMTY0LDI0NywzNCwxNzIsMSwwLDIsMzYsCisJMywxMzEsMSw2MCwzMyw4LDM3LDAsMTEwLDEzLDM0LDE2NCwKKwkzLDEzMSwxLDYwLDMzLDgsMzcsMCwxMTIsMTMsMzIsMTY0LAorCTgsMCwyMjQsMywxNiwwLDE4OSwzOSwyMjQsMjU1LDE4OSwzOSwKKwkyNCwwLDE3OCwxNzUsMzMsMTQ0LDEyOCwwLDE2LDAsMTc2LDE3NSwKKwkxOTIsMTI5LDE4LDAsMjgsMCwxOTEsMTc1LDIwLDAsMTc3LDE3NSwKKwkzLDEzMSwyLDYwLDMzLDE2LDgwLDAsMjAsMTMsNjYsMTQwLAorCTAsMCwwLDAsMTgsMCw2NCwxNiw0LDAsMTcsMzYsCisJMTYsMCw4MSwxNiwyNTQsMjU1LDY2LDM2LDIsMCw2Niw0NCwKKwk0LDAsNjQsMTYsNjQsMTgsMTgsMCwxNjEsMzYsMTkyLDEyLAorCTAsMCwwLDAsNjQsMTgsMTgsMCwzLDEzMSwxLDYwLAorCTMzLDgsNDgsMCwyMCwxMyw0OSwxNzIsMiwxMzEsMSw2MCwKKwkzMyw4LDM0LDAsMTY0LDI0Nyw0OSwxNzIsMywxMzEsMSw2MCwKKwkzMyw4LDQ4LDAsMTEwLDEzLDMyLDE2NCwyOCwwLDE5MSwxNDMsCisJMjQsMCwxNzgsMTQzLDIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDMyLDAsMTg5LDM5LDMsMTMxLDQsNjAsCisJMjA4LDEyLDEzMiwxNDAsMywxMzEsNSw2MCwyMTIsMTIsMTY1LDE0MCwKKwkzLDEzMSw2LDYwLDIxNiwxMiwxOTgsMTQwLDMsMTMxLDcsNjAsCisJMjIwLDEyLDIzMSwxNDAsMjMyLDI1NSwxODksMzksMTYsMCwxOTEsMTc1LAorCTIwLDM1LDE5MiwxMiwwLDAsMCwwLDEwLDAsNjQsMjAsCisJMSwwLDIsMzYsMywxMzEsMSw2MCwyNTIsMTIsMzQsMTcyLAorCTEsMCwyLDM2LDMsMTMxLDEsNjAsNCwxMywzNCwxNjQsCisJMywxMzEsMSw2MCw2LDEzLDMyLDE2NCwxOTcsMzYsMTkyLDgsCisJMSwwLDIsMzYsMywxMzEsMiw2MCwyNDgsMTIsNjYsMTQwLAorCTAsMCwwLDAsOSwwLDY0LDIwLDEsMCwyLDM2LAorCTcyLDM3LDE5MiwxMiwwLDAsMCwwLDEsMCwyLDM2LAorCTMsMTMxLDEsNjAsOCwxMywzNCwxNjQsMywxMzEsMSw2MCwKKwkxMCwxMywzMiwxNjQsMSwwLDIsMzYsMywxMzEsMSw2MCwKKwkyNDgsMTIsMzQsMTcyLDE2LDAsMTkxLDE0MywyNCwwLDE4OSwzOSwKKwk4LDAsMjI0LDMsMCwwLDAsMCwyMjQsMjU1LDE4OSwzOSwKKwkyMCwwLDE3NywxNzUsMzMsMTM2LDEyOCwwLDE2LDAsMTc2LDE3NSwKKwkxOTIsMTI5LDE3LDAsMjQsMCwxOTEsMTc1LDMsMTMxLDIsNjAsCisJMzMsMTYsODAsMCwxMTQsMTMsNjYsMTMyLDAsMCwwLDAsCisJNSwwLDY0LDE2LDEsMCwyLDM2LDMsMTMxLDEsNjAsCisJMzMsOCw0OCwwLDY3LDM3LDE5Miw4LDU2LDEzLDM0LDE3MiwKKwkzLDEzMSw0LDYwLDIwOCwxMiwxMzIsMzYsMywxMzEsMiw2MCwKKwk2NCwxMyw2NiwzNiwzMywyNCwyLDIsMywxMzEsMSw2MCwKKwkzMyw4LDQ4LDAsNjAsMTMsMzIsMTY0LDAsMCwxMzMsMTQwLAorCTQsMCwxMzQsMTQwLDAsMCwxMDEsMTcyLDQsMCwxMDIsMTcyLAorCTEyLDAsNjYsMzYsMywxMzEsMyw2MCwyMjQsMTIsOTksMTQwLAorCTMzLDE2LDIsMiwzLDEzMSwxLDYwLDMzLDgsNDgsMCwKKwk3MiwxMywzNSwxNzIsMywxMzEsMyw2MCwyMTYsMTIsOTksMTQwLAorCTMsMTMxLDUsNjAsMjIwLDEyLDE2NSwxNDAsMCwwLDY3LDE3MiwKKwk0LDAsNjksMTcyLDMsMTMxLDIsNjAsMzMsMTYsODAsMCwKKwkxNiwxMyw2NiwxNDgsMywxMzEsMSw2MCwzMyw4LDQ4LDAsCisJODQsMTMsMzQsMTY0LDAsMCwxMzIsMTQwLDMsMTMxLDUsNjAsCisJMjEyLDEyLDE2NSwxNDAsMywxMzEsNiw2MCwyMTYsMTIsMTk4LDE0MCwKKwkzLDEzMSw3LDYwLDIyMCwxMiwyMzEsMTQwLDIwLDM1LDE5MiwxMiwKKwkwLDAsMCwwLDUsMCw2NCwyMCwwLDAsMCwwLAorCTMsMTMxLDEsNjAsMzMsOCw0OCwwLDIyLDM3LDE5Miw4LAorCTg2LDEzLDMyLDE2NCwzLDEzMSwyLDYwLDIyOCwxMiw2NiwxNDAsCisJMiwxMzEsMyw2MCwxMjgsMTU1LDk5LDE0OCwxOTIsMTcsMiwwLAorCTMsMTMxLDEsNjAsMzMsOCwzNCwwLDEwOCwxMywzNCwxNDgsCisJMCwwLDAsMCwzMywxNiw2NywwLDMsMTMxLDEsNjAsCisJMzMsOCw0OCwwLDg2LDEzLDM0LDE2NCwzLDEzMSwyLDYwLAorCTIzMiwxMiw2NiwxNDgsMTkyLDEyOSwxNywwLDMsMTMxLDEsNjAsCisJMzMsOCw0OCwwLDg4LDEzLDM0LDE2NCwzLDEzMSwyLDYwLAorCTIzNCwxMiw2NiwxNDgsMzMsMzIsMzIsMiwzLDEzMSwxLDYwLAorCTMzLDgsNDgsMCw5MCwxMywzNCwxNjQsMywxMzEsMyw2MCwKKwkyMzYsMTIsOTksMTQ4LDMsMTMxLDIsNjAsMzMsMTYsODAsMCwKKwk1MiwxMyw2NiwxNDAsMywxMzEsNSw2MCw2MCwxMywxNjUsMzYsCisJMywxMzEsMSw2MCwzMyw4LDQ4LDAsNTIsMTMsMzIsMTcyLAorCTMsMTMxLDEsNjAsMzMsOCw0OCwwLDk2LDEzLDM0LDE3MiwKKwkzLDEzMSwxLDYwLDMzLDgsNDgsMCw5MiwxMywzNSwxNjQsCisJMywxMzEsMiw2MCwyNTIsMTIsNjYsMTQwLDMsMTMxLDEsNjAsCisJMzMsOCw0OCwwLDEwMCwxMywzNCwxNzIsODAsNDAsMTkyLDEyLAorCTMzLDQwLDUsMiwxLDAsMiwzNiwzLDEzMSwxLDYwLAorCTMzLDgsNDgsMCw1NiwxMywzMiwxNzIsMywxMzEsMSw2MCwKKwkzMyw4LDQ4LDAsMTE0LDEzLDM0LDE2NCwzLDEzMSwxLDYwLAorCTMzLDgsNDgsMCwxMTYsMTMsMzIsMTY0LDI0LDAsMTkxLDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkzMiwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwxMjgsMCwyLDM2LAorCTMsMTMxLDQsNjAsMjI4LDEyLDEzMiwxNDAsMywxMzEsNSw2MCwKKwkxMDQsMTMsMTY1LDM2LDE2LDAsMTkxLDE3NSwxOTIsMjUsNCwwLAorCTMsMTMxLDEsNjAsMzMsOCwzNSwwLDEwNCwxMywzNCwxNjQsCisJMTUxLDQwLDE5MiwxMiwzMyw0MCwxMDEsMCwyLDEzMSw0LDYwLAorCTE1LDYzLDE5MiwxMiwxMiwxNDYsMTMyLDM2LDE2LDAsMTkxLDE0MywKKwkyNCwwLDE4OSwzOSw4LDAsMjI0LDMsMCwwLDAsMCwKKwkyMzIsMjU1LDE4OSwzOSwxNiwwLDE5MSwxNzUsMTAyLDM3LDE5MiwxMiwKKwkwLDAsMCwwLDEzLDM4LDE5MiwxMiwwLDAsMCwwLAorCTE2LDAsMTkxLDE0MywyNCwwLDE4OSwzOSw4LDAsMjI0LDMsCisJMCwwLDAsMCwyNCwxMzMsMTMwLDE0MywyMDgsMjU1LDE4OSwzOSwKKwkyNCwwLDE3OCwxNzUsMzMsMTQ0LDAsMCwyOCwwLDE3OSwxNzUsCisJMSwwLDE5LDM2LDQ0LDAsMTkxLDE3NSw0MCwwLDE4MiwxNzUsCisJMzYsMCwxODEsMTc1LDMyLDAsMTgwLDE3NSwyMCwwLDE3NywxNzUsCisJMTEwLDAsNjQsMjQsMTYsMCwxNzYsMTc1LDMsMTMxLDIxLDYwLAorCTIxNiwxMiwxODEsMzgsMywxMzEsMjIsNjAsMTYsMTMsMjE0LDM4LAorCTEyOCwwLDIwOCwzOCwxMjgsMCwyMCwzNiwxOTIsMTcsMTgsMCwKKwkzLDEzMSw0LDYwLDMzLDMyLDE0OCwwLDQwLDEzLDEzMiwxNDAsCisJMywxMzEsNSw2MCwzMyw0MCwxODAsMCw0NCwxMywxNjUsMTQwLAorCTAsMCwxNjYsMTQyLDMsMTMxLDcsNjAsMjIwLDEyLDIzMSwxNDAsCisJMCwwLDAsMCwyMCwzNSwxOTIsMTIsMzMsMTM2LDg2LDAsCisJMTAsMCw2NCwyMCwwLDAsMCwwLDMsMTMxLDMsNjAsCisJMzMsMjQsMTE2LDAsNDgsMTMsOTksMTQ4LDMsMTMxLDIsNjAsCisJMzMsMTYsODQsMCwxNiwxMyw2NiwxNDgsMCwwLDAsMCwKKwk3NCwwLDk4LDE2LDAsMCwwLDAsNCwwLDIsMTQyLAorCTAsMCwwLDAsNzAsMCw2NCwxNiwwLDAsMCwwLAorCTEyLDAsNCwxNDIsMTYsMCw1LDE0MiwwLDAsMTY2LDE0MiwKKwkzLDEzMSw3LDYwLDIyMCwxMiwyMzEsMTQwLDIwLDM1LDE5MiwxMiwKKwkwLDAsMCwwLDYxLDAsNjUsNCwwLDAsMCwwLAorCTU4LDAsNjQsMTgsMCwwLDAsMCwxMiwwLDQsMTQyLAorCTE2LDAsNSwxNDIsMTIsMCwzOCwxNDIsMTYsMCwzOSwxNDIsCisJMjAsMzUsMTkyLDEyLDAsMCwwLDAsNTAsMCw2NCw0LAorCTAsMCwwLDAsMTIsMCw0LDE0MiwxNiwwLDUsMTQyLAorCTEyLDAsMzgsMTQyLDE2LDAsMzksMTQyLDIwLDM1LDE5MiwxMiwKKwkwLDAsMCwwLDQzLDAsNjQsMjAsMCwwLDAsMCwKKwkyMCwwLDUsMTQyLDgsMCwzLDE0MiwyMCwwLDM2LDE0MiwKKwk4LDAsMzQsMTQyLDMzLDQwLDE2MywwLDMzLDMyLDEzMCwwLAorCTQzLDE2LDE2NCwwLDMzLDAsNjQsMjAsMCwwLDAsMCwKKwkzMiwwLDE2NCwyMCwwLDAsMCwwLDI0LDAsNCwxNDIsCisJMjgsMCw1LDE0MiwyNCwwLDM4LDE0MiwyOCwwLDM5LDE0MiwKKwkyMCwzNSwxOTIsMTIsMCwwLDAsMCwyMywwLDY0LDQsCisJMCwwLDAsMCwyNCwwLDQsMTQyLDI4LDAsNSwxNDIsCisJMjQsMCwzOCwxNDIsMjgsMCwzOSwxNDIsMjAsMzUsMTkyLDEyLAorCTAsMCwwLDAsMTYsMCw2NCwyMCwwLDAsMCwwLAorCTMyLDAsNCwxNTAsMzIsMCwzNSwxNTAsMCwwLDAsMCwKKwk0MywxNiwxMzEsMCw5LDAsNjQsMjAsMCwwLDAsMCwKKwk4LDAsMTMxLDIwLDAsMCwwLDAsMCwwLDIsMTUwLAorCTAsMCwzNSwxNTAsMCwwLDAsMCw0MywxNiw2NywwLAorCTIsMCw2NCwxNiwwLDAsMCwwLDMzLDE0NCw5NiwyLAorCTEyOCwwLDE2LDM4LDI0LDEzMywxMzAsMTQzLDEsMCwxMTUsMzgsCisJNDIsMTYsODMsMCwxNTQsMjU1LDY0LDE2LDEyOCwwLDE0OCwzOCwKKwkzLDEzMSwxLDYwLDIyOCwxMiw1MCwxNzIsMTIsMCw2NCwyMiwKKwkxOTIsMTcsMTgsMCwzLDEzMSwyLDYwLDIxNiwxMiw2NiwxNDAsCisJMywxMzEsMyw2MCwyMjAsMTIsOTksMTQwLDMsMTMxLDEsNjAsCisJMjA4LDEyLDM0LDE3MiwzLDEzMSwxLDYwLDIxMiwxMiwzNSwxNzIsCisJMywxMzEsMSw2MCwzLDM4LDE5Miw4LDIyNCwxMiwzMiwxNzIsCisJMywxMzEsMyw2MCwzMywyNCw5OCwwLDI4LDEzLDk5LDE0MCwKKwkzLDEzMSw0LDYwLDMzLDMyLDEzMCwwLDMyLDEzLDEzMiwxNDAsCisJMywxMzEsMSw2MCwyMDgsMTIsMzUsMTcyLDMsMTMxLDEsNjAsCisJMjEyLDEyLDM2LDE3MiwzLDEzMSwzLDYwLDMzLDI0LDk4LDAsCisJMzYsMTMsOTksMTQwLDMsMTMxLDEsNjAsMzMsOCwzNCwwLAorCTI0LDEzLDM0LDE0MCwwLDAsMCwwLDMzLDI0LDk4LDAsCisJMywxMzEsMSw2MCwyMjQsMTIsMzUsMTcyLDQ0LDAsMTkxLDE0MywKKwk0MCwwLDE4MiwxNDMsMzYsMCwxODEsMTQzLDMyLDAsMTgwLDE0MywKKwkyOCwwLDE3OSwxNDMsMjQsMCwxNzgsMTQzLDIwLDAsMTc3LDE0MywKKwkxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLDQ4LDAsMTg5LDM5LAorCTI0LDEzMywxMzAsMTQzLDIwOCwyNTUsMTg5LDM5LDM2LDAsMTgxLDE3NSwKKwkxLDAsMjEsMzYsNDQsMCwxOTEsMTc1LDQwLDAsMTgyLDE3NSwKKwkzMiwwLDE4MCwxNzUsMjgsMCwxNzksMTc1LDI0LDAsMTc4LDE3NSwKKwkyMCwwLDE3NywxNzUsODIsMCw2NCwyNCwxNiwwLDE3NiwxNzUsCisJMywxMzEsMjIsNjAsMjE2LDEyLDIxNCwzOCwzLDEzMSwyLDYwLAorCTQ4LDEzLDY2LDM2LDEyOCwwLDg0LDM2LDk2LDAsODMsMzYsCisJMTI0LDAsODIsMzYsMTIwLDAsODEsMzYsMTI4LDAsMTYsMzYsCisJMCwwLDM2LDE0MiwwLDAsNjksMTQyLDAsMCwxOTgsMTQyLAorCTMsMTMxLDcsNjAsMjIwLDEyLDIzMSwxNDAsMjAsMzUsMTkyLDEyLAorCTAsMCwwLDAsNTUsMCw2NCwyMCwwLDAsMCwwLAorCTAsMCwxMzEsMTUwLDAsMCw5OCwxNTAsMCwwLDAsMCwKKwk1MCwwLDk4LDIwLDAsMCwwLDAsMywxMzEsNCw2MCwKKwkzMywzMiwxNDQsMCwyOCwxMywxMzIsMTQwLDMsMTMxLDUsNjAsCisJMzMsNDAsMTc2LDAsMzIsMTMsMTY1LDE0MCwyNDgsMjU1LDE5OCwxNDIsCisJMywxMzEsNyw2MCwyMTIsMTIsMjMxLDE0MCwyMCwzNSwxOTIsMTIsCisJMCwwLDAsMCwzNywwLDY0LDE2LDAsMCwwLDAsCisJOCwwLDE5NiwxNDIsMywxMzEsMyw2MCwzMywyNCwxMTIsMCwKKwkzNiwxMyw5OSwxNDAsMCwwLDAsMCw0MywxNiwxMzEsMCwKKwkyOSwwLDY0LDIwLDAsMCwwLDAsMjcsMCwxMzEsMjAsCisJMCwwLDAsMCwwLDAsMTk2LDE0MiwzLDEzMSw1LDYwLAorCTIyMCwxMiwxNjUsMTQwLDAsMCwzOCwxNDIsMCwwLDcxLDE0MiwKKwkyMCwzNSwxOTIsMTIsMCwwLDAsMCwxNiwwLDY0LDQsCisJMCwwLDAsMCwwLDAsMTk2LDE0MiwzLDEzMSw1LDYwLAorCTIyMCwxMiwxNjUsMTQwLDAsMCwzOCwxNDIsMCwwLDcxLDE0MiwKKwkyMCwzNSwxOTIsMTIsMCwwLDAsMCw5LDAsNjQsMjAsCisJMCwwLDAsMCwwLDAsOTksMTUwLDAsMCwxMzAsMTUwLAorCTAsMCwwLDAsNDMsMTYsNjcsMCwzLDAsNjQsMjAsCisJMCwwLDAsMCwyMiwzNiwxOTIsMTIsMzMsMzIsMTYwLDIsCisJMTI4LDAsMTQ4LDM4LDEyOCwwLDExNSwzOCwxMjgsMCw4MiwzOCwKKwkxMjgsMCw0OSwzOCwyNCwxMzMsMTMwLDE0MywxLDAsMTgxLDM4LAorCTQyLDE2LDg1LDAsMTg1LDI1NSw2NCwxNiwxMjgsMCwxNiwzOCwKKwk0NCwwLDE5MSwxNDMsNDAsMCwxODIsMTQzLDM2LDAsMTgxLDE0MywKKwkzMiwwLDE4MCwxNDMsMjgsMCwxNzksMTQzLDI0LDAsMTc4LDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk0OCwwLDE4OSwzOSwyMTYsMjU1LDE4OSwzOSwzLDEzMSw0LDYwLAorCTAsMTMsMTMyLDM2LDMyLDAsMTkxLDE3NSwyOCwwLDE3OSwxNzUsCisJMjQsMCwxNzgsMTc1LDIwLDAsMTc3LDE3NSwxNiwwLDE3NiwxNzUsCisJMCwwLDEzMCwxMzIsMCwwLDAsMCwxNCwwLDY0LDE2LAorCTAsMCwwLDAsMywxMzEsMiw2MCwyLDEzLDY2LDE0OCwKKwkzLDEzMSwzLDYwLDIzNCwxMiw5OSwxNDgsMSwwLDY2LDM2LAorCTMsMTMxLDEsNjAsMiwxMywzNCwxNjQsMjU1LDI1NSw2Niw0OCwKKwk0MywxNiw2NywwLDMsMCw2NCwyMCwwLDAsMCwwLAorCTExLDM5LDE5MiwxMiwwLDAsMTI4LDE2NCwzLDEzMSw0LDYwLAorCTgsMTMsMTMyLDM2LDAsMCwxMzAsMTMyLDAsMCwwLDAsCisJMTQsMCw2NCwxNiwwLDAsMCwwLDMsMTMxLDIsNjAsCisJMTAsMTMsNjYsMTQ4LDMsMTMxLDMsNjAsMjM0LDEyLDk5LDE0OCwKKwkxLDAsNjYsMzYsMywxMzEsMSw2MCwxMCwxMywzNCwxNjQsCisJMjU1LDI1NSw2Niw0OCw0MywxNiw2NywwLDMsMCw2NCwyMCwKKwkwLDAsMCwwLDI0LDM5LDE5MiwxMiwwLDAsMTI4LDE2NCwKKwkzLDEzMSw0LDYwLDQsMTMsMTMyLDM2LDAsMCwxMzAsMTMyLAorCTAsMCwwLDAsMTQsMCw2NCwxNiwwLDAsMCwwLAorCTMsMTMxLDIsNjAsNiwxMyw2NiwxNDgsMywxMzEsMyw2MCwKKwkyNDQsMTIsOTksMTQ4LDEsMCw2NiwzNiwzLDEzMSwxLDYwLAorCTYsMTMsMzQsMTY0LDI1NSwyNTUsNjYsNDgsNDMsMTYsNjcsMCwKKwkzLDAsNjQsMjAsMCwwLDAsMCwzNywzOSwxOTIsMTIsCisJMCwwLDEyOCwxNjQsMjQsMTMzLDEzMCwxNDMsMCwwLDAsMCwKKwk3OCwwLDY0LDI0LDEsMCwxNywzNiwzLDEzMSwyLDYwLAorCTE2LDEzLDY2LDM2LDIyNiwwLDgzLDM2LDEyOCwwLDgyLDM2LAorCTEyOCwwLDE2LDM2LDMsMTMxLDIsNjAsMzMsMTYsODAsMCwKKwkxMTAsMTMsNjYsMTMyLDAsMCwwLDAsMTgsMCw2NCwxNiwKKwkwLDAsMCwwLDMsMTMxLDIsNjAsMzMsMTYsODAsMCwKKwkxMTIsMTMsNjYsMTQ4LDAsMCwwLDAsMSwwLDY2LDM2LAorCTk2LDAsNjYsMTY2LDMsMTMxLDMsNjAsMjM2LDEyLDk5LDE0OCwKKwkyNTUsMjU1LDY2LDQ4LDQzLDE2LDY3LDAsNiwwLDY0LDIwLAorCTAsMCwwLDAsMywxMzEsMSw2MCwzMyw4LDQ4LDAsCisJMTEwLDEzLDMyLDE2NCw3OSwzOSwxOTIsMTIsMzMsMzIsMzIsMiwKKwkzLDEzMSwyLDYwLDMzLDE2LDgwLDAsMTA2LDEzLDY2LDEzMiwKKwkwLDAsMCwwLDE4LDAsNjQsMTYsMCwwLDAsMCwKKwkzLDEzMSwyLDYwLDMzLDE2LDgwLDAsMTA4LDEzLDY2LDE0OCwKKwkwLDAsMCwwLDEsMCw2NiwzNiw5MiwwLDY2LDE2NiwKKwkzLDEzMSwzLDYwLDIzMiwxMiw5OSwxNDgsMjU1LDI1NSw2Niw0OCwKKwk0MywxNiw2NywwLDYsMCw2NCwyMCwwLDAsMCwwLAorCTMsMTMxLDEsNjAsMzMsOCw0OCwwLDEwNiwxMywzMiwxNjQsCisJMTI5LDM5LDE5MiwxMiwzMywzMiwzMiwyLDAsMCw5OCwxMzQsCisJMCwwLDAsMCwxNiwwLDY0LDE2LDAsMCwwLDAsCisJMywxMzEsMiw2MCwzMywxNiw4MCwwLDExNiwxMyw2NiwxNDgsCisJMCwwLDAsMCwxLDAsNjYsMzYsMTAwLDAsNjYsMTY2LAorCTMsMTMxLDMsNjAsMjQ2LDEyLDk5LDE0OCwyNTUsMjU1LDY2LDQ4LAorCTQzLDE2LDY3LDAsNCwwLDY0LDIwLDAsMCwwLDAsCisJMCwwLDk2LDE2NiwxOTEsMzksMTkyLDEyLDMzLDMyLDMyLDIsCisJMTI4LDAsMTE1LDM4LDEyOCwwLDgyLDM4LDI0LDEzMywxMzAsMTQzLAorCTEsMCw0OSwzOCw0MiwxNiw4MSwwLDE4NSwyNTUsNjQsMTYsCisJMTI4LDAsMTYsMzgsMzIsMCwxOTEsMTQzLDI4LDAsMTc5LDE0MywKKwkyNCwwLDE3OCwxNDMsMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNDAsMCwxODksMzksMjMyLDI1NSwxODksMzksCisJMTYsMCwxOTEsMTc1LDUyLDM2LDE5MiwxMiwwLDAsMCwwLAorCTEsMCwyLDM2LDMsMTMxLDEsNjAsMCwxMywzNCwxNjQsCisJMywxMzEsMSw2MCwyLDEzLDMyLDE2NCwxNiwwLDE5MSwxNDMsCisJMjQsMCwxODksMzksOCwwLDIyNCwzLDAsMCwwLDAsCisJMjMyLDI1NSwxODksMzksMTYsMCwxOTEsMTc1LDcyLDM3LDE5MiwxMiwKKwkwLDAsMCwwLDEsMCwyLDM2LDMsMTMxLDEsNjAsCisJOCwxMywzNCwxNjQsMywxMzEsMSw2MCwxMCwxMywzMiwxNjQsCisJMTYsMCwxOTEsMTQzLDI0LDAsMTg5LDM5LDgsMCwyMjQsMywKKwkwLDAsMCwwLDI0MCwyNTUsMTg5LDM5LDMsMTMxLDEsNjAsCisJMjQ4LDEyLDMyLDE3MiwzLDEzMSwxLDYwLDI1MiwxMiwzMiwxNzIsCisJOCwwLDIyNCwzLDE2LDAsMTg5LDM5LDI0LDEzMywxMzAsMTQzLAorCTIyNCwyNTUsMTg5LDM5LDIwLDAsMTc3LDE3NSwxLDAsMTcsMzYsCisJMjQsMCwxOTEsMTc1LDIzLDAsNjQsMjQsMTYsMCwxNzYsMTc1LAorCTEyOCwwLDE2LDM2LDMsMTMxLDQsNjAsMzMsMzIsMTQ0LDAsCisJNDAsMTMsMTMyLDE0MCwzLDEzMSw1LDYwLDMzLDQwLDE3NiwwLAorCTQ0LDEzLDE2NSwxNDAsMywxMzEsNiw2MCwyMTYsMTIsMTk4LDE0MCwKKwkzLDEzMSw3LDYwLDIyMCwxMiwyMzEsMTQwLDIwLDM1LDE5MiwxMiwKKwkwLDAsMCwwLDMsMCw2NCwyMCwxLDAsNDksMzgsCisJNzQsMzksMTkyLDgsMSwwLDIsMzYsMjQsMTMzLDEzMCwxNDMsCisJMCwwLDAsMCw0MiwxNiw4MSwwLDIzNiwyNTUsNjQsMTYsCisJMTI4LDAsMTYsMzgsMzMsMTYsMCwwLDI0LDAsMTkxLDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkzMiwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwxOTIsNDEsNCwwLAorCTE2LDAsMTkxLDE3NSwzLDEzMSwzLDYwLDMzLDI0LDEwMSwwLAorCTIwLDEzLDk5LDE0MCwxLDAsMiwzNiwxNiwwLDk4LDIwLAorCTIsMCwyLDM2LDY0LDI2LDQsMCwzLDEzMSwxLDYwLAorCTMzLDgsMzcsMCwyMCwxMywzNCwxNzIsMiwxMzEsMSw2MCwKKwkzMyw4LDM1LDAsMTY0LDI0NywzNCwxNzIsMSwwLDIsMzYsCisJMywxMzEsMSw2MCwzMyw4LDM3LDAsMTEwLDEzLDM0LDE2NCwKKwkzLDEzMSwxLDYwLDMzLDgsMzcsMCwxMjUsMzksMTkyLDgsCisJMTEyLDEzLDMyLDE2NCwyMSwwLDk4LDIwLDMsMCwzLDM2LAorCTY0LDE4LDQsMCwzLDEzMSwxLDYwLDMzLDgsMzcsMCwKKwkyMCwxMywzNSwxNzIsMiwxMzEsMSw2MCwzMyw4LDM0LDAsCisJMTY0LDI0NywzNSwxNzIsMywxMzEsMiw2MCwzMywxNiw2OSwwLAorCTEyMCwxMyw2NiwxNDAsMCwwLDAsMCwxLDAsNjYsMzYsCisJMywxMzEsMSw2MCwzMyw4LDM3LDAsNDQsMzksMTkyLDEyLAorCTEyMCwxMywzNCwxNzIsMywwLDY0LDE2LDAsMCwwLDAsCisJMTYxLDM2LDE5MiwxMiwwLDAsMCwwLDE2LDAsMTkxLDE0MywKKwkyNCwwLDE4OSwzOSw4LDAsMjI0LDMsMCwwLDAsMCwKKwkyMjQsMjU1LDE4OSwzOSwxNiwwLDE3NiwxNzUsMzMsMTI4LDEyOCwwLAorCTIwLDAsMTc3LDE3NSwzLDEzMSwxNyw2MCwyMDgsMTIsNDksMzgsCisJMjQsMCwxOTEsMTc1LDAsMCwzNiwxNDIsMywxMzEsNSw2MCwKKwkyMTIsMTIsMTY1LDE0MCwzLDEzMSw2LDYwLDIxNiwxMiwxOTgsMTQwLAorCTMsMTMxLDcsNjAsMjIwLDEyLDIzMSwxNDAsMjAsMzUsMTkyLDEyLAorCTAsMCwwLDAsMzMsMzIsMCwyLDIyLDM2LDE5MiwxMiwKKwkxLDAsODAsNDQsOTIsMzcsMTkyLDEyLDAsMCwwLDAsCisJMjA2LDM1LDE5MiwxMiwwLDAsMCwwLDMzLDAsMCwyMiwKKwkwLDAsMCwwLDAsMCwzNiwxNDIsMywxMzEsNSw2MCwKKwkyMTIsMTIsMTY1LDE0MCwzLDEzMSw2LDYwLDIxNiwxMiwxOTgsMTQwLAorCTMsMTMxLDcsNjAsMjIwLDEyLDIzMSwxNDAsMjAsMzUsMTkyLDEyLAorCTAsMCwwLDAsMjIsMCw2NCwyMCwwLDAsMCwwLAorCTMsMTMxLDIsNjAsMjM4LDEyLDY2LDE0OCwzLDEzMSwzLDYwLAorCTI0MCwxMiw5OSwxNDgsMywxMzEsNCw2MCwyNDIsMTIsMTMyLDE0OCwKKwkzLDEzMSwxLDYwLDIzMiwxMiwzNCwxNjQsMywxMzEsMSw2MCwKKwkyMzQsMTIsMzUsMTY0LDMsMTMxLDEsNjAsMTYxLDM2LDE5MiwxMiwKKwkyMzYsMTIsMzYsMTY0LDMsMTMxLDEsNjAsNTIsMzYsMTkyLDEyLAorCTgsMTMsMzIsMTY0LDEsMCwyLDM2LDMsMTMxLDEsNjAsCisJMCwxMywzNCwxNjQsMywxMzEsMSw2MCwyLDEzLDMyLDE2NCwKKwkyNCwwLDE5MSwxNDMsMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsMzIsMCwxODksMzksMjMyLDI1NSwxODksMzksCisJMTkyLDE3LDQsMCwxNiwwLDE5MSwxNzUsMywxMzEsMSw2MCwKKwkzMyw4LDM0LDAsNTYsMTMsMzQsMTQwLDAsMCwwLDAsCisJMywwLDY0LDE2LDAsMCwwLDAsMjAzLDM2LDE5MiwxMiwKKwkwLDAsMCwwLDE2LDAsMTkxLDE0MywyNCwwLDE4OSwzOSwKKwk4LDAsMjI0LDMsMCwwLDAsMCwzLDEzMSwxLDYwLAorCTI0OCwxMiwzMiwxNzIsMywxMzEsMSw2MCw4LDAsMjI0LDMsCisJOCwxMywzMiwxNjQsMjMyLDI1NSwxODksMzksMTkyLDI1LDQsMCwKKwkxLDAsMiwzNiwxNiwwLDE5MSwxNzUsMywxMzEsMSw2MCwKKwkzMyw4LDM1LDAsMjAzLDM2LDE5MiwxMiw1MiwxMywzNCwxNzIsCisJMTYsMCwxOTEsMTQzLDI0LDAsMTg5LDM5LDgsMCwyMjQsMywKKwkwLDAsMCwwLDE5MiwzMyw0LDAsMywxMzEsMiw2MCwKKwkyOCwxMyw2NiwzNiwzMywyNCwxMzAsMCw0LDAsMTY2LDE0MCwKKwk4LDAsMTY3LDE0MCwwLDAsMTAyLDE3Miw0LDAsMTAzLDE3MiwKKwkxMiwwLDY2LDM2LDEyLDAsMTYzLDE0MCwzMywxNiwxMzAsMCwKKwkzLDEzMSwxLDYwLDMzLDgsMzYsMCwzNiwxMywzNSwxNzIsCisJMTYsMCwxNjMsMTQwLDIwLDAsMTY2LDE0MCwwLDAsNjcsMTcyLAorCTQsMCw3MCwxNzIsMjQsMCwxNjMsMTQ4LDEsMCwyLDM2LAorCTMsMTMxLDEsNjAsMzMsOCwzNiwwLDEwNiwxMywzNCwxNjQsCisJMywxMzEsMSw2MCwzMyw4LDM2LDAsNDgsMTMsMzUsMTY0LAorCTI2LDAsMTYyLDE0OCwzLDEzMSwxLDYwLDMzLDgsMzYsMCwKKwk4LDAsMjI0LDMsMTA4LDEzLDM0LDE2NCwyOCwwLDEzMCwxNDgsCisJMywxMzEsMSw2MCwyMzIsMTIsMzQsMTY0LDMwLDAsMTMwLDE0OCwKKwkzLDEzMSwxLDYwLDIzNCwxMiwzNCwxNjQsMzIsMCwxMzAsMTQ4LAorCTMsMTMxLDEsNjAsMjM2LDEyLDM0LDE2NCw0MCwwLDEzMCwxNDAsCisJMywxMzEsMSw2MCw4LDAsMjI0LDMsMjUyLDEyLDM0LDE3MiwKKwkyMjQsMjU1LDE4OSwzOSwxNiwwLDE3NiwxNzUsMzMsMTI4LDE2MCwwLAorCTE5MiwyNSw0LDAsMywxMzEsMiw2MCwxNiwxMyw2NiwzNiwKKwkyMCwwLDE3NywxNzUsMzMsMTM2LDk4LDAsMjQsMCwxOTEsMTc1LAorCTQsMCw0LDE0Miw4LDAsNSwxNDIsMTIsMCwzOCwxNDIsCisJMTYsMCwzOSwxNDIsMjAsMzUsMTkyLDEyLDAsMCwwLDAsCisJNDgsMCw2NCw0LDEsMCwyLDM2LDQsMCw0LDE0MiwKKwk4LDAsNSwxNDIsMTIsMCwzOCwxNDIsMTYsMCwzOSwxNDIsCisJMjAsMzUsMTkyLDEyLDAsMCwwLDAsNDAsMCw2NCwyMCwKKwkzMywxNiwwLDAsMTIsMCw0LDE0MiwyMCwwLDM1LDE0MiwKKwkwLDAsMCwwLDQzLDE2LDEzMSwwLDM0LDAsNjQsMjAsCisJMSwwLDIsMzYsMzIsMCwxMzEsMjAsMzMsMTYsMCwwLAorCTE2LDAsNCwxNDIsMjAsMCw1LDE0MiwyNCwwLDM4LDE0MiwKKwkyOCwwLDM5LDE0MiwyMCwzNSwxOTIsMTIsMCwwLDAsMCwKKwkyNCwwLDY0LDQsMSwwLDIsMzYsMTYsMCw0LDE0MiwKKwkyMCwwLDUsMTQyLDI0LDAsMzgsMTQyLDI4LDAsMzksMTQyLAorCTIwLDM1LDE5MiwxMiwwLDAsMCwwLDE2LDAsNjQsMjAsCisJMzMsMTYsMCwwLDE2LDAsNCwxNDIsMjAsMCw1LDE0MiwKKwkzLDEzMSw2LDYwLDIxNiwxMiwxOTgsMTQwLDMsMTMxLDcsNjAsCisJMjIwLDEyLDIzMSwxNDAsMjAsMzUsMTkyLDEyLDAsMCwwLDAsCisJNiwwLDY0LDIwLDEsMCwyLDM2LDI0LDAsMywxNTAsCisJMzIsMCwzNCwxNTAsMCwwLDAsMCw0MywxNiw2NywwLAorCTEsMCw2Niw1NiwyNCwwLDE5MSwxNDMsMjAsMCwxNzcsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMzIsMCwxODksMzksCisJNDQsMTMzLDEzMCwxNDMsMjE2LDI1NSwxODksMzksMjAsMCwxNzcsMTc1LAorCTMzLDEzNiwxMjgsMCwzMiwwLDE4MCwxNzUsMzMsMTYwLDE2MCwwLAorCTM2LDAsMTkxLDE3NSwyOCwwLDE3OSwxNzUsMjQsMCwxNzgsMTc1LAorCTUzLDAsNjQsMTYsMTYsMCwxNzYsMTc1LDIsMTMxLDE5LDYwLAorCTE5Miw0LDExNSwzOCwzMywzMiw5NiwyLDU0LDIxLDE5MiwxMiwKKwkxLDAsNSwzNiwzMywxMjgsNjQsMCw4LDAsMCwyMiwKKwk2NCwyNiwxNywwLDIsMTMxLDIsNjAsMzMsMTYsNjcsMCwKKwkxNzYsMjQ3LDY2LDE0MCwzMywyNCw5OSwyLDEsMCw2NiwzNiwKKwkxNDMsNDAsMTkyLDgsMjQwLDI0Miw5OCwxNzIsOCwwLDQsMTQyLAorCTY0LDE0NiwxNywwLDIwLDI0MiwxMDEsMzgsMzMsNDAsNjksMiwKKwkxNzIsNDEsMTkyLDEyLDMzLDQ4LDEyOCwyLDMzLDI0LDY0LDAsCisJNjAsMCw5OCw0MCwyLDAsNjQsMTYsMCwyNDIsOTgsMzgsCisJNjAsMCwzLDM2LDMzLDEzNiw2NiwyLDMzLDMyLDMyLDIsCisJMzMsNDAsMCwyLDEsMCwyLDM2LDE3LDAsMiwxNjIsCisJMCwxMjgsOTgsNTIsMCwwLDIsMTc0LDYsMjMsMTkyLDEyLAorCTE4LDAsMywxNjYsMTAsMCw2NCwyMCwzMywzMiwwLDIsCisJMiwxMzEsMiw2MCwzMywxNiw4MiwwLDE3MiwyNDcsNjYsMTQwLAorCTAsMCwwLDAsMSwwLDY2LDM2LDE1MiwyMSwxOTIsMTIsCisJMjM2LDAsMzQsMTc0LDE0Myw0MCwxOTIsOCwwLDAsMCwwLAorCTIsMTMxLDIsNjAsMzMsMTYsODIsMCwxNjgsMjQ3LDY2LDE0MCwKKwkwLDAsMCwwLDEsMCw2NiwzNiwyMzIsMCwzNCwxNzQsCisJMzYsMCwxOTEsMTQzLDMyLDAsMTgwLDE0MywyOCwwLDE3OSwxNDMsCisJMjQsMCwxNzgsMTQzLDIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDQwLDAsMTg5LDM5LDQ0LDEzMywxMzAsMTQzLAorCTIxNiwyNTUsMTg5LDM5LDIwLDAsMTc3LDE3NSwzMywxMzYsMTI4LDAsCisJMzIsMCwxODAsMTc1LDMzLDE2MCwxNjAsMCwzNiwwLDE5MSwxNzUsCisJMjgsMCwxNzksMTc1LDI0LDAsMTc4LDE3NSw1MywwLDY0LDE2LAorCTE2LDAsMTc2LDE3NSwyLDEzMSwxOSw2MCwxOTIsNCwxMTUsMzgsCisJMzMsMzIsOTYsMiw1NCwyMSwxOTIsMTIsMSwwLDUsMzYsCisJMzMsMTI4LDY0LDAsOCwwLDAsMjIsNjQsMjYsMTcsMCwKKwkyLDEzMSwyLDYwLDMzLDE2LDY3LDAsMTc2LDI0Nyw2NiwxNDAsCisJMzMsMjQsOTksMiwxLDAsNjYsMzYsMjE0LDQwLDE5Miw4LAorCTI0MCwyNDIsOTgsMTcyLDgsMCw0LDE0Miw2NCwxNDYsMTcsMCwKKwkyMCwyNDIsMTAxLDM4LDMzLDQwLDY5LDIsNzQsNDIsMTkyLDEyLAorCTMzLDQ4LDEyOCwyLDMzLDI0LDY0LDAsNjAsMCw5OCw0MCwKKwkyLDAsNjQsMTYsMCwyNDIsOTgsMzgsNjAsMCwzLDM2LAorCTMzLDEzNiw2NiwyLDMzLDMyLDMyLDIsMzMsNDAsMCwyLAorCTEsMCwyLDM2LDE3LDAsMiwxNjIsMCwxMjgsOTgsNTIsCisJMCwwLDIsMTc0LDYsMjMsMTkyLDEyLDE4LDAsMywxNjYsCisJMTAsMCw2NCwyMCwzMywzMiwwLDIsMiwxMzEsMiw2MCwKKwkzMywxNiw4MiwwLDE3MiwyNDcsNjYsMTQwLDAsMCwwLDAsCisJMSwwLDY2LDM2LDE1MiwyMSwxOTIsMTIsMjM2LDAsMzQsMTc0LAorCTIxNCw0MCwxOTIsOCwwLDAsMCwwLDIsMTMxLDIsNjAsCisJMzMsMTYsODIsMCwxNjgsMjQ3LDY2LDE0MCwwLDAsMCwwLAorCTEsMCw2NiwzNiwyMzIsMCwzNCwxNzQsMzYsMCwxOTEsMTQzLAorCTMyLDAsMTgwLDE0MywyOCwwLDE3OSwxNDMsMjQsMCwxNzgsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTQwLDAsMTg5LDM5LDIxNiwyNTUsMTg5LDM5LDI0LDAsMTc4LDE3NSwKKwkzMywxNDQsMTI4LDAsMjAsMCwxNzcsMTc1LDMzLDEzNiwxNjAsMCwKKwkxNiwwLDE3NiwxNzUsMzMsMTI4LDE5MiwwLDM2LDAsMTkxLDE3NSwKKwkzMiwwLDE4MCwxNzUsMjgsMCwxNzksMTc1LDQsMCwzNiwxNDIsCisJOCwwLDM3LDE0MiwxNjAsMTMzLDEzNCwxNDMsMiwxMzEsNyw2MCwKKwkxODAsMjExLDIzMSwxNDAsMjAsMzUsMTkyLDEyLDAsMCwwLDAsCisJMTEsMCw2NCwyMCwwLDAsMCwwLDIsMTMxLDQsNjAsCisJMTQ0LDE0NiwxMzIsMzYsMTUsNjMsMTkyLDEyLDMzLDQwLDAsMiwKKwkxMDAsMTI5LDEzMiwzOSwxMDgsMTI5LDEzNCwzOSwzMSwyMSwxOTIsMTIsCisJNiwwLDUsMzgsOTIsNDEsMTkyLDgsMCwwLDAsMCwKKwkzLDEzMSwyMCw2MCwyMDgsMTIsMTQ4LDM4LDAsMCwxMzIsMTQyLAorCTMsMTMxLDUsNjAsMjEyLDEyLDE2NSwxNDAsMywxMzEsNiw2MCwKKwkyMTYsMTIsMTk4LDE0MCwzLDEzMSw3LDYwLDIyMCwxMiwyMzEsMTQwLAorCTAsMCwwLDAsMjAsMzUsMTkyLDEyLDE5MiwxMjksMTgsMCwKKwkzLDEzMSwzLDYwLDMzLDI0LDExMiwwLDIwLDEzLDk5LDE0MCwKKwkwLDAsMCwwLDgwLDAsOTYsMTYsMSwwLDgzLDQ0LAorCTMzLDMyLDY0LDIsMTEsNDAsMTkyLDEyLDMzLDQwLDMyLDIsCisJNTAsMCw2NCwxNiwzMywzMiw2NCwyLDIyMywzOSwxOTIsMTIsCisJMzMsNDAsMzIsMiw5MiwzNywxOTIsMTIsMCwwLDAsMCwKKwkyMDYsMzUsMTkyLDEyLDAsMCwwLDAsMCwwLDEzMiwxNDIsCisJMywxMzEsNSw2MCwyMTIsMTIsMTY1LDE0MCwzLDEzMSw2LDYwLAorCTIxNiwxMiwxOTgsMTQwLDMsMTMxLDcsNjAsMjIwLDEyLDIzMSwxNDAsCisJMjAsMzUsMTkyLDEyLDAsMCwwLDAsMTYsMCw2NCwxNiwKKwkwLDAsMCwwLDE0LDAsOTYsMTgsMCwwLDAsMCwKKwkzLDEzMSwyLDYwLDI0OCwxMiw2NiwxNDAsMywxMzEsMSw2MCwKKwk5LDAsNjQsMTYsMCwxMywzMiwxNjQsMywxMzEsMSw2MCwKKwk3MiwzNywxOTIsMTIsNCwxMywzMiwxNjQsMSwwLDIsMzYsCisJMywxMzEsMSw2MCw4LDEzLDM0LDE2NCwzLDEzMSwxLDYwLAorCTEwLDEzLDMyLDE2NCwzLDEzMSwyLDYwLDIyOCwxMiw2NiwxNDAsCisJMCwwLDAsMCwzOCwwLDY2LDIyLDAsMCwwLDAsCisJMjU0LDM5LDE5MiwxMiwzMywzMiwzMiwyLDUyLDM2LDE5MiwxMiwKKwkwLDAsMCwwLDM2LDAsMzQsMTQyLDAsMCwwLDAsCisJMzAsMCw2NCwxNiwwLDAsMCwwLDIwNiwzOSwxOTIsMTIsCisJMCwwLDAsMCw5Miw0MSwxOTIsOCwwLDAsMCwwLAorCTMsMTMxLDQsNjAsMzMsMzIsMTQ0LDAsNDAsMTMsMTMyLDE0MCwKKwkzLDEzMSw1LDYwLDMzLDQwLDE3NiwwLDQ0LDEzLDE2NSwxNDAsCisJMywxMzEsNiw2MCwyMTYsMTIsMTk4LDE0MCwzLDEzMSw3LDYwLAorCTIyMCwxMiwyMzEsMTQwLDIwLDM1LDE5MiwxMiwwLDAsMCwwLAorCTEyLDAsNjQsMjAsMCwwLDAsMCwzLDEzMSwzLDYwLAorCTMzLDI0LDExMiwwLDQ4LDEzLDk5LDE0OCwzLDEzMSwyLDYwLAorCTMzLDE2LDgwLDAsMTYsMTMsNjYsMTQ4LDAsMCwwLDAsCisJMywwLDk4LDIwLDAsMCwwLDAsMjAzLDM2LDE5MiwxMiwKKwkzMywzMiw2NCwyLDM2LDAsMTkxLDE0MywzMiwwLDE4MCwxNDMsCisJMjgsMCwxNzksMTQzLDI0LDAsMTc4LDE0MywyMCwwLDE3NywxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMyw0MCwwLDE4OSwzOSwKKwkyMjQsMjU1LDE4OSwzOSwyMCwwLDE3NywxNzUsMzMsMTM2LDEyOCwwLAorCTE2LDAsMTc2LDE3NSwxOTIsMTI5LDE3LDAsMjQsMCwxOTEsMTc1LAorCTMsMTMxLDIsNjAsMzMsMTYsODAsMCwyMCwxMyw2NiwxNDAsCisJMCwwLDAsMCwyOCwwLDY0LDE2LDAsMCwwLDAsCisJMywxMzEsNCw2MCwzMywzMiwxNDQsMCw0MCwxMywxMzIsMTQwLAorCTMsMTMxLDUsNjAsMzMsNDAsMTc2LDAsNDQsMTMsMTY1LDE0MCwKKwkzLDEzMSw2LDYwLDIxNiwxMiwxOTgsMTQwLDMsMTMxLDcsNjAsCisJMjIwLDEyLDIzMSwxNDAsMjAsMzUsMTkyLDEyLDAsMCwwLDAsCisJMTQsMCw2NCwyMCwwLDAsMCwwLDMsMTMxLDMsNjAsCisJMzMsMjQsMTEyLDAsNDgsMTMsOTksMTQ4LDMsMTMxLDIsNjAsCisJMzMsMTYsODAsMCwxNiwxMyw2NiwxNDgsMCwwLDAsMCwKKwk1LDAsOTgsMjAsMCwwLDAsMCwxNjEsMzYsMTkyLDEyLAorCTAsMCwwLDAsMjExLDM5LDE5MiwxMiwzMywzMiwzMiwyLAorCTI0LDAsMTkxLDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywzMiwwLDE4OSwzOSwyLDE4LDUsMCwKKwkwLDAsMTMwLDE2MCw4LDAsMjI0LDMsMSwwLDEzMywxNjAsCisJMiwyMiw1LDAsMCwwLDEzMCwxNjAsMiwyMCw1LDAsCisJMSwwLDEzMCwxNjAsMiwxOCw1LDAsMiwwLDEzMCwxNjAsCisJOCwwLDIyNCwzLDMsMCwxMzMsMTYwLDAsMCwxMzAsMTQ0LAorCTEsMCwxMzEsMTQ0LDAsMTgsMiwwLDgsMCwyMjQsMywKKwkzNywxNiw5OCwwLDAsMCwxMzAsMTQ0LDEsMCwxMzEsMTQ0LAorCTIsMCwxMzMsMTQ0LDAsMjIsMiwwLDAsMjgsMywwLAorCTMzLDE2LDY3LDAsMCw0Miw1LDAsMywwLDEzMSwxNDQsCisJMzMsMTYsNjksMCw4LDAsMjI0LDMsMzcsMTYsNjcsMCwKKwkyMjQsMjU1LDE4OSwzOSwxNiwwLDE3NiwxNzUsMzMsMTI4LDEyOCwwLAorCTI0LDAsMTkxLDE3NSwyMCwwLDE3NywxNzUsNDgsMTI5LDEzNSwzOSwKKwkzLDAsMjI2LDEzNiwwLDAsMjI2LDE1Miw0LDAsMjI3LDEyOCwKKwk1LDAsMjI4LDEyOCwzLDAsMiwxNzAsMCwwLDIsMTg2LAorCTQsMCwzLDE2Miw1LDAsNCwxNjIsMywwLDE2MiwxMzYsCisJMCwwLDE2MiwxNTIsNCwwLDE2MywxMjgsNSwwLDE2NCwxMjgsCisJOSwwLDIsMTcwLDYsMCwyLDE4NiwxMCwwLDMsMTYyLAorCTExLDAsNCwxNjIsMTIsMCw0LDM4LDM4LDAsNSwzNiwKKwkxNDQsNDEsMTkyLDEyLDMzLDEzNiwxOTIsMCwxNCwwLDQsMzgsCisJMTQ0LDQxLDE5MiwxMiw2Niw2Niw1LDM2LDE3LDAsNCwzOCwKKwkzMyw0MCwwLDAsMywwLDIsMzYsMTQ0LDQxLDE5MiwxMiwKKwkxNiwwLDIsMTYyLDE5LDAsMCwxNjIsMjAsMCwwLDE2MiwKKwk0MCwwLDM0LDE0MiwwLDAsMCwwLDQzLDMyLDIsMCwKKwkzNiwwLDM0LDE0MiwwLDAsMCwwLDMsMCw2NCwxNiwKKwkzMywyNCwxMjgsMCwyMTgsNDEsMTkyLDgsMTI4LDAsMTMwLDUyLAorCTMzLDE2LDk2LDAsMjEsMCwyLDE2Miw0LDAsMzcsMTUwLAorCTAsMCwwLDAsMTQ0LDQxLDE5MiwxMiwyMiwwLDQsMzgsCisJOSwwLDM0LDEzOCw2LDAsMzQsMTU0LDEwLDAsMzUsMTMwLAorCTExLDAsMzYsMTMwLDI3LDAsMiwxNzAsMjQsMCwyLDE4NiwKKwkyOCwwLDMsMTYyLDI5LDAsNCwxNjIsMTIsMCwzNywxNDIsCisJMCwwLDAsMCwxNDgsNDEsMTkyLDEyLDMwLDAsNCwzOCwKKwkxNiwwLDM3LDE1MCwwLDAsMCwwLDE0NCw0MSwxOTIsMTIsCisJMzQsMCw0LDM4LDIxLDAsMzQsMTM4LDE4LDAsMzQsMTU0LAorCTIyLDAsMzUsMTMwLDIzLDAsMzYsMTMwLDM5LDAsMiwxNzAsCisJMzYsMCwyLDE4Niw0MCwwLDMsMTYyLDQxLDAsNCwxNjIsCisJMjQsMCwzNywxNTAsMCwwLDAsMCwxNDQsNDEsMTkyLDEyLAorCTQyLDAsNCwzOCwyNiwwLDM3LDE1MCwwLDAsMCwwLAorCTE0NCw0MSwxOTIsMTIsNDQsMCw0LDM4LDI4LDAsMzcsMTUwLAorCTAsMCwwLDAsMTQ0LDQxLDE5MiwxMiw0NiwwLDQsMzgsCisJMzAsMCwzNywxNTAsMCwwLDAsMCwxNDQsNDEsMTkyLDEyLAorCTQ4LDAsNCwzOCwzMiwwLDM3LDE1MCwwLDAsMCwwLAorCTE0NCw0MSwxOTIsMTIsNTAsMCw0LDM4LDUyLDAsMiwzNiwKKwkyNCwwLDE5MSwxNDMsMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsMzIsMCwxODksMzksMjI0LDI1NSwxODksMzksCisJMTYsMCwxNzYsMTc1LDMzLDEyOCwxNjAsMCwyNCwwLDE5MSwxNzUsCisJMjAsMCwxNzcsMTc1LDIxLDAsMiwxNDYsMzMsMTM2LDEyOCwwLAorCTEsMCw2Niw0OCw0MCwwLDM0LDE3NCwyMiwwLDIsMTQ2LAorCTIyLDAsNCwzOCwxMjgsMCw2Niw0OCwxNTYsNDEsMTkyLDEyLAorCTM2LDAsMzQsMTc0LDQsMCwzNCwxNjYsMjcsMCwyLDEzOCwKKwkyNCwwLDIsMTU0LDI4LDAsMywxMzAsMjksMCw0LDEzMCwKKwk5LDAsMzQsMTcwLDYsMCwzNCwxODYsMTAsMCwzNSwxNjIsCisJMTEsMCwzNiwxNjIsMTYxLDQxLDE5MiwxMiwzMCwwLDQsMzgsCisJMzQsMCw0LDM4LDE1Niw0MSwxOTIsMTIsMTIsMCwzNCwxNzQsCisJMTYsMCwzNCwxNjYsMzksMCwyLDEzOCwzNiwwLDIsMTU0LAorCTQwLDAsMywxMzAsNDEsMCw0LDEzMCwyMSwwLDM0LDE3MCwKKwkxOCwwLDM0LDE4NiwyMiwwLDM1LDE2MiwyMywwLDM2LDE2MiwKKwkxNTYsNDEsMTkyLDEyLDQyLDAsNCwzOCw0NCwwLDQsMzgsCisJMTU2LDQxLDE5MiwxMiwyNCwwLDM0LDE2Niw0NiwwLDQsMzgsCisJMTU2LDQxLDE5MiwxMiwyNiwwLDM0LDE2Niw0OCwwLDQsMzgsCisJMTU2LDQxLDE5MiwxMiwyOCwwLDM0LDE2Niw1MCwwLDQsMzgsCisJMTU2LDQxLDE5MiwxMiwzMCwwLDM0LDE2NiwzMiwwLDM0LDE2NiwKKwkyNCwwLDE5MSwxNDMsMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsMzIsMCwxODksMzksMjMyLDI1NSwxODksMzksCisJMTYsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCwyMCwwLDE5MSwxNzUsCisJNDgsMTI5LDEzNCwzOSwzLDAsMTk0LDEzNiwwLDAsMTk0LDE1MiwKKwk0LDAsMTk1LDEyOCw1LDAsMTk2LDEyOCwzLDAsMiwxNzAsCisJMCwwLDIsMTg2LDQsMCwzLDE2Miw1LDAsNCwxNjIsCisJMywwLDE2MiwxMzYsMCwwLDE2MiwxNTIsNCwwLDE2MywxMjgsCisJNSwwLDE2NCwxMjgsOSwwLDIsMTcwLDYsMCwyLDE4NiwKKwkxMCwwLDMsMTYyLDExLDAsNCwxNjIsMTIsMCw0LDM4LAorCTE0NCw0MSwxOTIsMTIsNywwLDUsMzYsMTQsMCw0LDM4LAorCTE0NCw0MSwxOTIsMTIsNjYsNjYsNSwzNiwxNywwLDQsMzgsCisJMzMsNDAsMCwwLDMsMCwyLDM2LDE0NCw0MSwxOTIsMTIsCisJMTYsMCwyLDE2MiwyMSwwLDIsMzYsMTI4LDAsMywzNiwKKwkxOSwwLDAsMTYyLDIwLDAsMywxNjIsMjAsMCwxOTEsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMjQsMCwxODksMzksCisJMTc2LDI1NSwxODksMzksNjgsMCwxNzcsMTc1LDY0LDAsMTc2LDE3NSwKKwkzMywxMjgsMTYwLDAsNzIsMCwxOTEsMTc1LDE0LDAsMywxNDYsCisJNjYsMCwyLDM2LDksMCw5OCwyMCwzMywxMzYsMTI4LDAsCisJMTUsMCwyLDE0NiwwLDAsMCwwLDYsMCw2NywyMCwKKwk2NCwyNiwxNywwLDE2LDAsMywxNDYsMywwLDIsMzYsCisJMTEsMCw5OCwxNiwwLDAsMCwwLDY0LDI2LDE3LDAsCisJMiwxMzEsMiw2MCwzMywxNiw2NywwLDE4NCwyNDcsNjYsMTQwLAorCTAsMCwwLDAsMSwwLDY2LDM2LDIsMTMxLDEsNjAsCisJMzMsOCwzNSwwLDE4Miw0MiwxOTIsOCwxODQsMjQ3LDM0LDE3MiwKKwkyMCwwLDMsMTQ2LDAsMCwwLDAsNSwwLDk2LDE2LAorCTEyOCwwLDIsMzYsMjEsMCw5OCwxNiw2NCwyNiwxNywwLAorCTE3OSw0MiwxOTIsOCwwLDAsMCwwLDE2LDAsMTY0LDM5LAorCTY0LDI2LDE3LDAsMiwxMzEsMiw2MCwzMywxNiw2NywwLAorCTE4MCwyNDcsNjYsMTQwLDAsMCwwLDAsMSwwLDY2LDM2LAorCTIsMTMxLDEsNjAsMzMsOCwzNSwwLDE4MCwyNDcsMzQsMTcyLAorCTE3LDQyLDE5MiwxMiwzMyw0MCwwLDIsMzMsMzIsMzIsMiwKKwkxNiwwLDE2NSwzOSwyMjIsNDAsMTkyLDEyLDMzLDQ4LDAsMiwKKwkxODIsNDIsMTkyLDgsMCwwLDAsMCwyLDEzMSwyLDYwLAorCTMzLDE2LDY3LDAsMTgwLDI0Nyw2NiwxNDAsMCwwLDAsMCwKKwkxLDAsNjYsMzYsMiwxMzEsMSw2MCwzMyw4LDM1LDAsCisJMTgwLDI0NywzNCwxNzIsMTAwLDQxLDE5MiwxMiwzMywzMiwzMiwyLAorCTE4Miw0MiwxOTIsOCwwLDAsMCwwLDExMiwxMjksMTMyLDM5LAorCTE1LDYzLDE5MiwxMiwwLDAsMCwwLDcyLDAsMTkxLDE0MywKKwk2OCwwLDE3NywxNDMsNjQsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk4MCwwLDE4OSwzOSw4LDAsMjI0LDMsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMTYyLDQ4LDgsMCw2NCwxNiwyNTUsMjU1LDE5OCw0OCwKKwk2Nyw0MCw1LDAsNjQsMTYsNSwwLDMzLDE2LDY4LDAsCisJMCwwLDY2LDE0NCwwLDAsMCwwLDIwMyw0MiwxOTIsOCwKKwkzMyw0OCwxOTQsMCw2Nyw0MCw1LDAsMjU1LDI1NSwxNjUsMzYsCisJMjU1LDI1NSwyLDM2LDYsMCwxNjIsMTYsMjU1LDI1NSwzLDM2LAorCTAsMCwxMzAsMTQ4LDIsMCwxMzIsMzYsMjU1LDI1NSwxNjUsMzYsCisJMjUyLDI1NSwxNjMsMjAsMzMsNDgsMTk0LDAsMjU1LDI1NSwxOTUsNDgsCisJMiwyMCw2LDAsMzMsNDgsOTgsMCwyNTUsMjU1LDE5NSw0OCwKKwkyLDIwLDYsMCwzMyw0OCw5OCwwLDgsMCwyMjQsMywKKwkyNTUsMjU1LDE5NCw0OCwyMDgsMjU1LDE4OSwzOSwxNiwwLDE3NiwxNzUsCisJMzMsMTI4LDEyOCwwLDI4LDAsMTc5LDE3NSwzMywxNTIsMTYwLDAsCisJMjQsMCwxNzgsMTc1LDMzLDE0NCwxOTIsMCwzNiwwLDE4MSwxNzUsCisJMzMsMTY4LDAsMiwzMiwwLDE4MCwxNzUsMzMsMTYwLDAsMCwKKwk0MCwwLDE5MSwxNzUsMjAsMCwxNzcsMTc1LDEyLDAsMywxNDIsCisJMCwwLDIsMTQyLDAsMCwwLDAsMzUsMjQsOTgsMCwKKwk0MiwxNiwxMTQsMCwyLDAsNjQsMTYsMzMsMTM2LDY0LDIsCisJMzMsMTM2LDk2LDAsMTMsMCwzMiwxOCwzMyw0MCw5NiwyLAorCTM1LDE0NCw4MSwyLDgsMCwyLDE0MiwwLDAsNCwxNDIsCisJMzMsNDgsMzIsMiw4MCw2OCwxOTIsMTIsMzMsMzIsNjgsMCwKKwk4LDAsMiwxNDIsMCwwLDIsMTQyLDAsMCwyLDE0MiwKKwkzMywxNTIsMTEzLDIsMzMsMTYsODEsMCwwLDAsMiwxNzQsCisJMCwwLDIsMTQyLDAsMCwwLDAsNCwwLDY0LDE4LAorCTMzLDE2MCwxMzAsMiw0LDAsMTYsMTQyLDIzMyw0MiwxOTIsOCwKKwkwLDAsMCwwLDE4LDAsMTgwLDE2NiwzMywxNiwwLDIsCisJNDAsMCwxOTEsMTQzLDM2LDAsMTgxLDE0MywzMiwwLDE4MCwxNDMsCisJMjgsMCwxNzksMTQzLDI0LDAsMTc4LDE0MywyMCwwLDE3NywxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMyw0OCwwLDE4OSwzOSwKKwkyMjQsMjU1LDE4OSwzOSwyNCwwLDE3OCwxNzUsMzMsMTQ0LDEyOCwwLAorCTIsMTMxLDQsNjAsMTkyLDQsMTMyLDM2LDM2LDAsMTY1LDE3NSwKKwkxLDAsNSwzNiwyOCwwLDE5MSwxNzUsMjAsMCwxNzcsMTc1LAorCTU0LDIxLDE5MiwxMiwxNiwwLDE3NiwxNzUsMzMsMTM2LDY0LDAsCisJOCwwLDMyLDIyLDMzLDQwLDAsMCwyLDEzMSwyLDYwLAorCTE3Niw1LDY2LDE0MCwwLDAsMCwwLDEsMCw2NiwzNiwKKwkyLDEzMSwxLDYwLDEwMiw0MywxOTIsOCwxNzYsNSwzNCwxNzIsCisJMCwxLDMsMzYsOCwwLDQ4LDE0Miw4LDAsMiwzNiwKKwkxNiwwLDIsMTY2LDYsMCwyLDM2LDE4LDAsMiwxNjIsCisJNCwwLDIsMzYsMTQsMCwzLDE2NiwxOSwwLDIsMTYyLAorCTIwLDAsMywxNjYsMiwxMzEsNiw2MCwyMTIsNCwxOTgsMzYsCisJMywwLDE5NCwxMzYsMCwwLDE5NCwxNTIsNCwwLDE5NSwxMzIsCisJMjUsMCwyLDE3MCwyMiwwLDIsMTg2LDI2LDAsMywxNjYsCisJMiwxMzEsMSw2MCwxOTUsMjExLDM0LDEzNiwxNzYsMTMzLDEzMCwxNTUsCisJMCwwLDAsMCwzMSwwLDIsMTcwLDI4LDAsMiwxODYsCisJMzIsMCw0LDM4LDE0NCw3MSwxOTIsMTIsNiwwLDYsMzYsCisJMzksMCwxNjIsMTM5LDM2LDAsMTYyLDE1NSwwLDAsMCwwLAorCTQxLDAsMiwxNzAsMzgsMCwyLDE4NiwxMzIsMTI5LDEzMywzOSwKKwkzLDAsMTYyLDEzNiwwLDAsMTYyLDE1Miw0LDAsMTYzLDEyOCwKKwk1LDAsMTY0LDEyOCwzLDAsMiwxNzAsMCwwLDIsMTg2LAorCTQsMCwzLDE2Miw1LDAsNCwxNjIsMiwxMzEsNSw2MCwKKwkyMTIsNCwxNjUsMzYsMywwLDE2MiwxMzYsMCwwLDE2MiwxNTIsCisJNCwwLDE2MywxMjgsNSwwLDE2NCwxMjgsOSwwLDIsMTcwLAorCTYsMCwyLDE4NiwxMCwwLDMsMTYyLDExLDAsNCwxNjIsCisJMzMsMzIsNjQsMiw4LDYsMiwzNiwxMiwwLDIsMTY2LAorCTYwLDEyOCwyLDUyLDAsMCwzNCwxNzQsNjAsMCwyLDM2LAorCTE4LDAsMzQsMTY2LDc0LDIxLDE5MiwxMiwzMyw0MCwzMiwyLAorCTMsMCw2NCwyMCwwLDAsMCwwLDE1MiwyMSwxOTIsMTIsCisJMzMsMzIsMzIsMiwyOCwwLDE5MSwxNDMsMjQsMCwxNzgsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTMyLDAsMTg5LDM5LDIxNiwyNTUsMTg5LDM5LDMyLDAsMTgwLDE3NSwKKwkzMywxNjAsMTI4LDAsMTYsMCwxNzYsMTc1LDMzLDEyOCwxNjAsMCwKKwkzNiwwLDE5MSwxNzUsMjgsMCwxNzksMTc1LDI0LDAsMTc4LDE3NSwKKwkyMCwwLDE3NywxNzUsOCwwLDIsMTQyLDMzLDE1MiwxOTIsMCwKKwkzMywxMzYsODMsMCw2LDAsMzUsMTUwLDAsMSw0LDM2LAorCTUsMCwxMDAsMTYsMCwyLDIsMzYsMTEzLDAsOTgsMTYsCisJMCwwLDAsMCwxNSw0NCwxOTIsOCwwLDAsMCwwLAorCTI0LDAsMzUsMTUwLDE3NiwxMzMsMTMwLDE1MSwwLDAsMCwwLAorCTEzOSwwLDk4LDIwLDAsMCwwLDAsMjYsMCwzNSwxNTAsCisJMiwxMzEsMiw2MCwxOTQsMjExLDY2LDE0OCwwLDAsMCwwLAorCTEzMywwLDk4LDIwLDAsMCwwLDAsMCwwLDM0LDE1MCwKKwkwLDAsMCwwLDEyOSwwLDY4LDIwLDgsMCwyLDM2LAorCTIsMCwzNSwxNTAsMCwwLDAsMCwxMjUsMCw5OCwyMCwKKwk2LDQsMiwzNiw0LDAsMzUsMTUwLDAsMCwwLDAsCisJMTIxLDAsOTgsMjAsMCwwLDAsMCwyLDEzMSw0LDYwLAorCTE5Miw0LDEzMiwzNiw1NCwyMSwxOTIsMTIsMSwwLDUsMzYsCisJMzMsMTQ0LDY0LDAsOCwwLDY0LDIyLDAsMCwwLDAsCisJMiwxMzEsMiw2MCwxNzYsNSw2NiwxNDAsMCwwLDAsMCwKKwkxLDAsNjYsMzYsMiwxMzEsMSw2MCwxNSw0NCwxOTIsOCwKKwkxNzYsNSwzNCwxNzIsOCwwLDUsMTQyLDgsMCw4MCwxNDIsCisJOSwwLDE2MiwxMzYsNiwwLDE2MiwxNTIsMTAsMCwxNjMsMTI4LAorCTExLDAsMTY0LDEyOCwzLDAsMiwxNzAsMCwwLDIsMTg2LAorCTQsMCwzLDE2Miw1LDAsNCwxNjIsMiwxMzEsNiw2MCwKKwkyMTIsNCwxOTgsMzYsMywwLDE5NCwxMzYsMCwwLDE5NCwxNTIsCisJNCwwLDE5NSwxMjgsNSwwLDE5NiwxMjgsOSwwLDIsMTcwLAorCTYsMCwyLDE4NiwxMCwwLDMsMTYyLDExLDAsNCwxNjIsCisJMTIsMCw0LDM4LDEyLDAsMTY1LDM2LDMzLDEyOCwxOSwyLAorCTgwLDY4LDE5MiwxMiwyNDQsMjU1LDEwMiwzOCwwLDEsMiwzNiwKKwkwLDAsMiwxNjYsOCwwLDIsMzYsMiwwLDIsMTY2LAorCTYsMCwyLDM2LDQsMCwyLDE2Miw0LDAsMiwzNiwKKwk1LDAsMiwxNjIsMCwyLDIsMzYsNiwwLDIsMTY2LAorCTIsMTMxLDUsNjAsMjEyLDQsMTY1LDM2LDMsMCwxNjIsMTM2LAorCTAsMCwxNjIsMTUyLDQsMCwxNjMsMTMyLDExLDAsMiwxNzAsCisJOCwwLDIsMTg2LDEyLDAsMywxNjYsMiwxMzEsMSw2MCwKKwkxOTUsMjExLDM0LDEzNiwxNzYsMTMzLDEzMCwxNTUsMCwwLDAsMCwKKwkxNywwLDIsMTcwLDE0LDAsMiwxODYsMTEsMCwzNCwxMzgsCisJOCwwLDM0LDE1NCwxMiwwLDM1LDEzNCwyMSwwLDIsMTcwLAorCTE4LDAsMiwxODYsMjIsMCwzLDE2NiwxNywwLDM0LDEzOCwKKwkxNCwwLDM0LDE1NCwwLDAsMCwwLDI3LDAsMiwxNzAsCisJMjQsMCwyLDE4NiwzMywzMiwxMjgsMiwzMyw0MCw2NCwyLAorCTYwLDEyOCwyLDUyLDAsMCw2NiwxNzQsNjAsMCwyLDM2LAorCTc0LDIxLDE5MiwxMiwxOCwwLDY2LDE2NiwzOCwwLDY0LDIwLAorCTAsMCwwLDAsMTUyLDIxLDE5MiwxMiwzMywzMiw2NCwyLAorCTE1LDQ0LDE5Miw4LDAsMCwwLDAsMTQsMCwzNSwxNTAsCisJMTk2LDEzMywxMzAsMTUxLDAsMCwwLDAsMjksMCw5OCwyMCwKKwkwLDAsMCwwLDE2LDAsMzUsMTUwLDIsMTMxLDIsNjAsCisJMjE0LDIxMSw2NiwxNDgsMCwwLDAsMCwyMywwLDk4LDIwLAorCTAsMCwwLDAsMCwwLDM0LDE1MCwwLDAsMCwwLAorCTE5LDAsNjgsMjAsOCwwLDIsMzYsMiwwLDM1LDE1MCwKKwkwLDAsMCwwLDE1LDAsOTgsMjAsNiw0LDIsMzYsCisJNCwwLDM1LDE1MCwwLDAsMCwwLDExLDAsOTgsMjAsCisJMCwwLDAsMCw2OCwxMzMsMTMwLDE0MywxNDAsMTI5LDEzNCwzOSwKKwkxMSwwLDM1LDEzOCw4LDAsMzUsMTU0LDEyLDAsMzYsMTM0LAorCTMsMCwxOTUsMTY4LDAsMCwxOTUsMTg0LDQsMCwxOTYsMTY0LAorCTIwLDAsNjYsMzYsMTUyLDEyOSwxMzAsMTc1LDM2LDAsMTkxLDE0MywKKwkzMiwwLDE4MCwxNDMsMjgsMCwxNzksMTQzLDI0LDAsMTc4LDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk0MCwwLDE4OSwzOSwxOTIsMjU1LDE4OSwzOSw4MCwwLDE2OSwxNDMsCisJODQsMCwxNjgsMTQzLDU2LDAsMTgwLDE3NSwzMywxNjAsMTI4LDAsCisJNDQsMCwxNzcsMTc1LDg4LDAsMTc3LDE0MywxNiwwLDE2NCwzOSwKKwk1MiwwLDE3OSwxNzUsOTIsMCwxNzksMTQzLDMsMTMxLDMsNjAsCisJMzIsMTcsOTksMzYsNDAsMCwxNzYsMTc1LDMzLDEyOCwxOTIsMCwKKwk2MCwwLDE5MSwxNzUsNDgsMCwxNzgsMTc1LDAsMCw5OCwxNDAsCisJOCwwLDUwLDE0MiwxLDAsNjYsMzYsMCwwLDk4LDE3MiwKKwkzLDAsMTYyLDEzNiwwLDAsMTYyLDE1Miw0LDAsMTYzLDEyOCwKKwk1LDAsMTcwLDEyOCwzLDAsNjYsMTcwLDAsMCw2NiwxODYsCisJNCwwLDY3LDE2Miw1LDAsNzQsMTYyLDIsMTMxLDEwLDYwLAorCTIxMiw0LDc0LDM3LDMsMCw2NiwxMzcsMCwwLDY2LDE1MywKKwk0LDAsNjcsMTI5LDUsMCw2OSwxMjksOSwwLDY2LDE3MCwKKwk2LDAsNjYsMTg2LDEwLDAsNjcsMTYyLDExLDAsNjksMTYyLAorCTY5LDAsMiwzNiwxNiwwLDE2MiwxNjMsMTcsMCwxNjgsMTYzLAorCTE4LDAsMzQsMTUwLDI0MCwxMzIsMTMxLDE0MywzMyw0OCwwLDAsCisJMjUsMCwxNjksMTYzLDIwLDAsNjYsMzYsMCw2NiwyLDAsCisJMjU1LDI1NSw2Niw0OCwyLDE4LDIsMCwzNyw2NCwyLDEsCisJMCw3NCwzLDAsMjU1LDI1NSw5OCw0OCwyLDE4LDIsMCwKKwkzNyw3MiwzNCwxLDMsMTMxLDIsNjAsMCwxNyw2NiwxNDAsCisJMjIsMCwxNjAsMTY3LDI2LDAsMTYwLDE2NywxOCwwLDE2OCwxNjcsCisJMTc2LDEzMywxMzYsMTQzLDEsMCw5OSwzNiwyNDAsMTMyLDEzMSwxNzUsCisJMjAsMCwxNjksMTY3LDI0LDAsMTYyLDE2MywyOCwwLDE2OCwxNzUsCisJMywwLDIyNiwxMzYsMCwwLDIyNiwxNTIsMCwwLDAsMCwKKwkzNSwwLDE2MiwxNzEsMzIsMCwxNjIsMTg3LDE5Miw0MiwxOTIsMTIsCisJMjAsMCw1LDM2LDM5LDE2LDIsMCwyNiwwLDE2MiwxNjcsCisJMTQsMCwyLDM2LDQ0LDAsMiwyMiw4LDAsMiwzNiwKKwkxMiwwLDY2LDE2NiwxOSwwLDE2MiwxMzksMTYsMCwxNjIsMTU1LAorCTIzLDAsMTYzLDEzOSwyMCwwLDE2MywxNTUsMjcsMCwxNjQsMTM5LAorCTI0LDAsMTY0LDE1NSwzMSwwLDE2NSwxMzksMjgsMCwxNjUsMTU1LAorCTE3LDAsNjYsMTcwLDE0LDAsNjYsMTg2LDIxLDAsNjcsMTcwLAorCTE4LDAsNjcsMTg2LDI1LDAsNjgsMTcwLDIyLDAsNjgsMTg2LAorCTI5LDAsNjksMTcwLDI2LDAsNjksMTg2LDM1LDAsMTYyLDEzOSwKKwkzMiwwLDE2MiwxNTUsMCwwLDAsMCwzMywwLDY2LDE3MCwKKwkzMCwwLDY2LDE4NiwzNCwwLDIsMzYsMCwwLDM0LDE3NCwKKwkwLDAsMzUsMTQyLDE4LDAsMzQsMTUwLDAsMCwwLDAsCisJMzMsMTYsNjcsMCwxOCwwLDM0LDE2NiwxOCwwLDM0LDE1MCwKKwkwLDAsMCwwLDYwLDAsNjYsNDQsNjgsMCw2NCwxNiwKKwkzMywzMiwxMjgsMiwwLDAsOTgsMTQyLDE4LDAsMzUsMTUwLAorCTYwLDAsNjYsMzYsMzUsMTYsNjcsMCwwLDAsOTgsMTc0LAorCTYwLDAsMiwzNiwxOCwwLDM0LDE2NiwyMDEsNDQsMTkyLDgsCisJMzMsMzIsMTI4LDIsMTY0LDEyOSwxMzMsMzksMywwLDE2MiwxMzYsCisJMCwwLDE2MiwxNTIsNCwwLDE2MywxMjgsNSwwLDE2NCwxMjgsCisJMTcsMCw2NiwxNzAsMTQsMCw2NiwxODYsMTgsMCw2NywxNjIsCisJMTksMCw2OCwxNjIsOCwwLDIsMzYsMjAsMCw2NiwxNjYsCisJMTksMCwxNjIsMTM5LDE2LDAsMTYyLDE1NSwyMywwLDE2MywxMzksCisJMjAsMCwxNjMsMTU1LDI3LDAsMTY0LDEzOSwyNCwwLDE2NCwxNTUsCisJMzEsMCwxNjUsMTM5LDI4LDAsMTY1LDE1NSwyNSwwLDY2LDE3MCwKKwkyMiwwLDY2LDE4NiwyOSwwLDY3LDE3MCwyNiwwLDY3LDE4NiwKKwkzMywwLDY4LDE3MCwzMCwwLDY4LDE4NiwzNywwLDY5LDE3MCwKKwkzNCwwLDY5LDE4NiwzNSwwLDE2MiwxMzksMzIsMCwxNjIsMTU1LAorCTAsMCwwLDAsNDEsMCw2NiwxNzAsMzgsMCw2NiwxODYsCisJNDIsMCwyLDM2LDAsMCwzNCwxNzQsMCwwLDM1LDE0MiwKKwkxOCwwLDM0LDE1MCwwLDAsMCwwLDMzLDE2LDY3LDAsCisJMTgsMCwzNCwxNjYsMTgsMCwzNCwxNTAsMCwwLDAsMCwKKwk2MCwwLDY2LDQ0LDgsMCw2NCwxNiwwLDAsMCwwLAorCTAsMCw5OCwxNDIsMTgsMCwzNSwxNTAsNjAsMCw2NiwzNiwKKwkzNSwxNiw2NywwLDAsMCw5OCwxNzQsNjAsMCwyLDM2LAorCTE4LDAsMzQsMTY2LDE4LDAsMzQsMTUwLDAsMCwwLDAsCisJMCwyNiwyLDAsMiwxOCwyLDAsMzcsMjQsOTgsMCwKKwkxMiwwLDY3LDE2NiwzMywzMiwxMjgsMiw3NCwyMSwxOTIsMTIsCisJMzMsNDAsMzIsMiw4LDAsNjQsMjAsMzMsMzIsMzIsMiwKKwkzLDEzMSwzLDYwLDM2LDE3LDk5LDM2LDAsMCw5OCwxNDAsCisJMCwwLDAsMCwxLDAsNjYsMzYsMTUyLDIxLDE5MiwxMiwKKwkwLDAsOTgsMTcyLDYwLDAsMTkxLDE0Myw1NiwwLDE4MCwxNDMsCisJNTIsMCwxNzksMTQzLDQ4LDAsMTc4LDE0Myw0NCwwLDE3NywxNDMsCisJNDAsMCwxNzYsMTQzLDgsMCwyMjQsMyw2NCwwLDE4OSwzOSwKKwkxNzYsMjU1LDE4OSwzOSw1NiwwLDE4MCwxNzUsMTEyLDAsMTgwLDE0MywKKwk0OCwwLDE3OCwxNzUsMTAwLDAsMTc4LDE0Myw1MiwwLDE3OSwxNzUsCisJMTA0LDAsMTc5LDE0Myw2NCwwLDE4MiwxNzUsMzMsMTc2LDEyOCwwLAorCTcyLDAsMTkwLDE3NSwzMywyNDAsMTYwLDAsNjAsMCwxODEsMTc1LAorCTMzLDE2OCwyMjQsMCw2OCwwLDE4MywxNzUsMTA4LDAsMTgzLDE0MywKKwkyLDEzMSw0LDYwLDE5Miw0LDEzMiwzNiw3NiwwLDE5MSwxNzUsCisJNDQsMCwxNzcsMTc1LDQwLDAsMTc2LDE3NSwzMiwwLDE2NiwxNzUsCisJNywyLDEzMCwzOCwyLDEzMCwyLDAsNTQsMjEsMTkyLDEyLAorCTMzLDQwLDAsMiwzMywxMzYsNjQsMCw4LDAsMzIsMjIsCisJMCw3NCwxOCwwLDIsMTMxLDQsNjAsMjMyLDE0NiwxMzIsMzYsCisJMzMsNDAsMTI4LDIsMTUsNjMsMTkyLDEyLDMzLDQ4LDAsMiwKKwk3NCw0NSwxOTIsOCwwLDAsMCwwLDI1NSwyNTUsNjYsNTAsCisJMiwxOCwyLDAsMzcsNzIsMzQsMSwwLDY2LDE5LDAsCisJMjU1LDI1NSw5OCw1MCwyLDE4LDIsMCwzNyw2NCwyLDEsCisJOCwwLDEzMCwzOCwwLDU4LDIsMCwyNTUsMjU1LDY2LDQ4LAorCTIsMTgsMiwwLDM3LDU2LDIyNiwwLDAsMTYzLDQsNjAsCisJMjIwLDUsMTMyLDUyLDQsMCw1LDM2LDQsMCwzNCwxNDIsCisJMCwxNyw2LDM2LDgsMCw4MCwxNDAsNCwwLDM1LDE0MiwKKwk4LDAsMiwzNiwwLDAsOTgsMTcyLDAsMCw5LDE2NiwKKwkyLDAsOCwxNjYsNiwwLDAsMTY2LDE5Miw0MiwxOTIsMTIsCisJNCwwLDcsMTY2LDMzLDMyLDE2MCwyLDQsMCw1LDM2LAorCTE5Miw0MiwxOTIsMTIsMjU1LDI1NSw3MCw0OCw0LDAsNCwzOCwKKwkyLDAsNSwzNiwxOTIsNDIsMTkyLDEyLDI1NSwyNTUsNzAsNDgsCisJMzMsMzIsMCwyLDgsMCw1LDM2LDE5Miw0MiwxOTIsMTIsCisJMjU1LDI1NSw3MCw0OCwzMywzMiwyMjQsMiwzMyw0MCwxMjgsMiwKKwkxOTIsNDIsMTkyLDEyLDI1NSwyNTUsNzAsNDgsMzksMjQsMiwwLAorCTI1NSwyNTUsOTgsNDgsMiwwLDY0LDIwLDMzLDQwLDIyNCwyLAorCTI1NSwyNTUsMyw1Miw2LDAsMywxNjYsNCwwLDM2LDE0MiwKKwkwLDAsMCwwLDIyMCw0MiwxOTIsMTIsMzMsNDgsMTI4LDIsCisJMzMsMzIsMTkyLDIsMCwwLDY3LDE0MCwzMyw0MCwxOTIsMywKKwkwLDEyOCw5OSw1MiwwLDAsNjcsMTcyLDQsMCwzNSwxNDIsCisJMzIsMCwxNjYsMTQzLDE4LDAsOTksMTQ4LDMzLDU2LDE2MCwyLAorCTE4LDAsMzUsMTY2LDk2LDAsMTcwLDE0MywxNywwLDMsMzYsCisJMTYsMCwxNjMsMTc1LDI0LDAsMTc3LDE3NSwyOCwwLDE2MiwxNzUsCisJMjMsNDQsMTkyLDEyLDIwLDAsMTcwLDE3NSwzLDEzMSwzLDYwLAorCTEyNCwxNyw5OSwzNiwwLDAsOTgsMTQwLDAsMCwwLDAsCisJMSwwLDY2LDM2LDAsMCw5OCwxNzIsNzYsMCwxOTEsMTQzLAorCTcyLDAsMTkwLDE0Myw2OCwwLDE4MywxNDMsNjQsMCwxODIsMTQzLAorCTYwLDAsMTgxLDE0Myw1NiwwLDE4MCwxNDMsNTIsMCwxNzksMTQzLAorCTQ4LDAsMTc4LDE0Myw0NCwwLDE3NywxNDMsNDAsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw4MCwwLDE4OSwzOSwxMjgsMjU1LDE4OSwzOSwKKwkxMTYsMCwxODMsMTc1LDMzLDE4NCwxMjgsMCwxMTIsMCwxODIsMTc1LAorCTMzLDE3NiwxNjAsMCwxMDQsMCwxODAsMTc1LDMzLDE2MCwxOTIsMCwKKwkxMDgsMCwxODEsMTc1LDMzLDE2OCwyMjQsMCw0MCwwLDE2NCwzOSwKKwk5NiwwLDE3OCwxNzUsMTQ0LDAsMTc4LDE0MywzMyw0MCwwLDAsCisJMTAwLDAsMTc5LDE3NSwxNDgsMCwxNzksMTQzLDE2LDAsNiwzNiwKKwkxMjAsMCwxOTEsMTc1LDkyLDAsMTc3LDE3NSwxNDQsNzEsMTkyLDEyLAorCTg4LDAsMTc2LDE3NSw1NiwwLDE3NywzOSwzMywzMiwzMiwyLAorCTMzLDQwLDAsMCwyLDAsMTYsMzYsNDAsMCwxNzYsMTY3LAorCTIsMCwxNjIsMTUwLDAsMCwwLDAsNDIsMCwxNjIsMTY3LAorCTE5LDAsMTMwLDEzOCwxNiwwLDEzMCwxNTQsMCwwLDAsMCwKKwk0NywwLDE2MiwxNzEsNDQsMCwxNjIsMTg3LDE0NCw3MSwxOTIsMTIsCisJMTYsMCw2LDM2LDMzLDMyLDY0LDIsMzMsNDAsOTYsMiwKKwk0MCwwLDE2NiwzOSwzMyw1NiwzMiwyLDU2LDAsMTc2LDE2NywKKwkwLDAsMTYyLDE1MCwyLDEzMSwxNiw2MCw4LDIzOSwxNiwzOCwKKwk1OCwwLDE2MiwxNjcsMTUsMCwxMzAsMTM4LDEyLDAsMTMwLDE1NCwKKwkwLDAsMCwwLDYzLDAsMTYyLDE3MSw2MCwwLDE2MiwxODcsCisJMjQyLDUsMiwzNiw4NCwwLDE2MiwxNjcsNzIsMCwxNjIsMzksCisJNzIsMCwxNjAsMTY3LDc2LDAsMTc2LDE3NSw4MCwwLDE3NiwxNzUsCisJMjQ3LDcxLDE5MiwxMiwxNiwwLDE2MiwxNzUsMjU1LDI1NSwzLDM2LAorCTIyLDAsNjcsMTYsMTIsMCwxNDUsMzgsMzMsMzIsMjI0LDIsCisJNiwwLDE5NywzOCwzNSw0OCwxNTAsMiwwLDAsMTYzLDE1MCwKKwk0LDAsMiwzNiwxNiwwLDE2MiwxNzUsMTYxLDAsMiwzNiwKKwkyMCwwLDE2MiwxNzUsMjgsMCwxNzYsMTc1LDAsMTgsMywwLAorCTIsMjYsMywwLDM3LDE2LDY3LDAsMjU1LDI1NSw2Niw0OCwKKwkyNCwwLDE2MiwxNzUsODAsMCwxNjIsMTQzLDc2LDAsMTYzLDE0MywKKwkzMyw1NiwzMiwyLDM1LDE2LDY3LDAsMjU1LDI1NSw2Niw0OCwKKwkyMjAsNDQsMTkyLDEyLDMyLDAsMTYyLDE3NSwxMjAsMCwxOTEsMTQzLAorCTExNiwwLDE4MywxNDMsMTEyLDAsMTgyLDE0MywxMDgsMCwxODEsMTQzLAorCTEwNCwwLDE4MCwxNDMsMTAwLDAsMTc5LDE0Myw5NiwwLDE3OCwxNDMsCisJOTIsMCwxNzcsMTQzLDg4LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJMTI4LDAsMTg5LDM5LDE5NiwxMzMsMTMwLDE0MywxODQsMjU1LDE4OSwzOSwKKwk2NCwwLDE5MSwxNzUsNjAsMCwxNzcsMTc1LDEwOSwwLDY0LDE2LAorCTU2LDAsMTc2LDE3NSwyNTUsMjU1LDMsMzYsMTA2LDAsNjcsMTYsCisJMCwwLDAsMCwxNzYsMTMzLDEzMCwxNDMsMTc2LDEzMywxNDUsMzksCisJMTAyLDAsNjQsMTYsMCwwLDAsMCwxMDAsMCw2NywxNiwKKwkwLDAsMCwwLDIsMTMxLDIsNjAsOCwyMzksNjYsMzYsCisJNDQsMCwxNjIsMTc1LDQ4LDAsMTYyLDE3NSwyNDIsNSwyLDM2LAorCTQwLDAsMTYwLDE2Nyw2LDAsMTI4LDE2LDUyLDAsMTYyLDE2NywKKwkxLDAsMiwzNiwyMywwLDEzMCwxNiwwLDAsMCwwLAorCTM2LDQ2LDE5Miw4LDAsMCwwLDAsMiwxMzEsMTYsNjAsCisJMTYwLDIwNCwxNiwzOCwxNTYsNzEsMTkyLDEyLDMzLDMyLDAsMiwKKwkwLDE2Myw0LDYwLDQsMSwxMzIsMTQwLDIwNCwyMDQsMyw2MCwKKwkyMDUsMjA0LDk5LDUyLDI1LDAsMTMxLDAsMzMsNDAsMzIsMiwKKwkzMyw0OCwwLDIsMzMsNTYsNjQsMCw0MCwwLDE2NCwzOSwKKwkxNiw2NCwwLDAsMTk0LDE2LDgsMCwwLDAsMCwwLAorCTEwNCw1NiwxOTIsMTIsMTYsMCwxNjIsMTc1LDI1MSw0NSwxOTIsOCwKKwkzMywyNCw2NCwwLDMsMTMxLDIsNjAsMjgsMTgsNjYsMTQ4LAorCTAsMCwwLDAsMiwwLDY2LDQ4LDYxLDAsNjQsMTYsCisJMCwwLDAsMCwyLDEzMSwxNiw2MCwxNjAsMjA0LDE2LDM4LAorCTE1Niw3MSwxOTIsMTIsMzMsMzIsMCwyLDAsMTYzLDQsNjAsCisJNCwxLDEzMiwxNDAsMjA0LDIwNCwzLDYwLDIwNSwyMDQsOTksNTIsCisJMjUsMCwxMzEsMCwzMyw0MCwzMiwyLDMzLDQ4LDAsMiwKKwkzMyw1Niw2NCwwLDQwLDAsMTY0LDM5LDE2LDY0LDAsMCwKKwkxOTQsMTYsOCwwLDAsMCwwLDAsMTA1LDU3LDE5MiwxMiwKKwkxNiwwLDE2MiwxNzUsMzMsMjQsNjQsMCwyNTUsMjU1LDIsMzYsCisJMzksMCw5OCwxNiwwLDAsMCwwLDE0MCwxMjksMTMwLDE0NywKKwkwLDAsMCwwLDEsMCw2Niw0OCw3LDAsNjQsMjAsCisJMCwwLDAsMCw2OCwxMzMsMTMxLDE0MywxNTIsMTI5LDEzMCwxNDMsCisJMCwwLDAsMCw0MywxNiw2NywwLDExLDAsNjQsMTYsCisJMzMsMzIsMCwwLDY4LDEzMywxMzEsMTQzLDE0OCwxMjksMTMwLDE0MywKKwkwLDAsMCwwLDYsMCw5OCwxNiwzMywzMiwwLDAsCisJMTk2LDEzMywxMzMsMTQzLDE0OCwxMjksMTMxLDE3NSwxNyw0MywxOTIsMTIsCisJMzMsMzIsMCwwLDMzLDMyLDAsMCwxNDAsMTI5LDEzMywzOSwKKwkxNCwwLDYsMzYsNCwwLDIsMzYsMTYsMCwxNjIsMTc1LAorCTE2MiwwLDIsMzYsMjAsMCwxNjIsMTc1LDI0LDAsMTYyLDE3NSwKKwkyLDEzMSwyLDYwLDgsMjM5LDY2LDM2LDI4LDAsMTYyLDE3NSwKKwk0OCwwLDE2MiwxNDMsNDQsMCwxNjMsMTQzLDE5NiwxMzMsMTM1LDM5LAorCTM1LDE2LDY3LDAsMjU1LDI1NSw2Niw0OCwyMjAsNDQsMTkyLDEyLAorCTMyLDAsMTYyLDE3NSw2NCwwLDE5MSwxNDMsNjAsMCwxNzcsMTQzLAorCTU2LDAsMTc2LDE0Myw4LDAsMjI0LDMsNzIsMCwxODksMzksCisJMjA4LDI1NSwxODksMzksMzYsMCwxNzksMTc1LDMzLDE1MiwxMjgsMCwKKwk0MCwwLDE4MCwxNzUsMzMsMTYwLDE2MCwwLDMyLDAsMTc4LDE3NSwKKwkyNCwwLDE3NiwxNzUsMzMsMTI4LDIyNCwwLDQ0LDAsMTkxLDE3NSwKKwkyOCwwLDE3NywxNzUsNiwwLDIsMTUwLDY0LDAsMTc3LDE0MywKKwkwLDAsMCwwLDIwLDAsNjQsMTYsMzMsMTQ0LDE5MiwwLAorCTEyLDAsNjgsMzgsOCwwLDUsMzYsMTkyLDQyLDE5MiwxMiwKKwkwLDE3LDYsMzYsNCwwLDQsMzgsMiwwLDUsMzYsCisJMTkyLDQyLDE5MiwxMiwyNTUsMjU1LDcwLDQ4LDMzLDMyLDAsMiwKKwkzMyw0MCwzMiwyLDE5Miw0MiwxOTIsMTIsMjU1LDI1NSw3MCw0OCwKKwkyNTUsMjU1LDY2LDQ4LDI1NSwyNTUsMyw1Miw0LDAsNjcsMTYsCisJMCwwLDAsMCwzLDEzMSwzLDYwLDExMSw0NiwxOTIsOCwKKwkxMjAsMTcsOTksMzYsNCwwLDIsMTUwLDAsMCwwLDAsCisJMCwyNiwyLDAsMiwxOCwyLDAsMzcsMjQsOTgsMCwKKwkyNTUsMjU1LDk5LDQ4LDQsMCwxMTMsMTYsOCwwLDcsMzgsCisJMywxMzEsMyw2MCwxMTEsNDYsMTkyLDgsMTIwLDE3LDk5LDM2LAorCTIsMCwyLDE1MCwwLDAsMCwwLDAsMjYsMiwwLAorCTIsMTgsMiwwLDM3LDI0LDk4LDAsMjU1LDI1NSw5OSw0OCwKKwkxNjEsMCwyLDM2LDE1LDAsOTgsMjAsMjQ4LDI1NSw0MCwzOCwKKwkzMywzMiw5NiwyLDMzLDQwLDEyOCwyLDMsMTMxLDMsNjAsCisJMTEyLDE3LDk5LDM2LDAsMCw5OCwxNDAsMzMsNDgsNjQsMiwKKwkxNiwwLDE2NywxNzUsMzMsNTYsMCwyLDIwLDAsMTY4LDE3NSwKKwkxLDAsNjYsMzYsODYsNDUsMTkyLDEyLDAsMCw5OCwxNzIsCisJMTE1LDQ2LDE5Miw4LDAsMCwwLDAsMywxMzEsMyw2MCwKKwkxMTYsMTcsOTksMzYsMCwwLDk4LDE0MCwwLDAsMCwwLAorCTEsMCw2NiwzNiwwLDAsOTgsMTcyLDQ0LDAsMTkxLDE0MywKKwk0MCwwLDE4MCwxNDMsMzYsMCwxNzksMTQzLDMyLDAsMTc4LDE0MywKKwkyOCwwLDE3NywxNDMsMjQsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk0OCwwLDE4OSwzOSwxOTIsMjU1LDE4OSwzOSw1MiwwLDE4MSwxNzUsCisJMzMsMTY4LDEyOCwwLDQ0LDAsMTc5LDE3NSwzMywxNTIsMTYwLDAsCisJNDgsMCwxODAsMTc1LDMzLDE2MCwxOTIsMCwzMiwwLDE3NiwxNzUsCisJMzMsMTI4LDIyNCwwLDMzLDMyLDAsMiwzMyw0OCwwLDAsCisJNDAsMCwxNzgsMTc1LDgwLDAsMTc4LDE0MywzLDEzMSwzLDYwLAorCTE0NCwxNiw5OSwzNiw1NiwwLDE5MSwxNzUsMzYsMCwxNzcsMTc1LAorCTAsMCw5OCwxNDAsMzMsNDAsNjQsMiwxLDAsNjYsMzYsCisJMTkyLDQyLDE5MiwxMiwwLDAsOTgsMTcyLDI1NSwyNTUsNjYsNDgsCisJMjU1LDI1NSwzLDUyLDgsMCw2NywxNiw4LDAsMiwzNiwKKwkzLDEzMSwyLDYwLDE0OCwxNiw2NiwxNDAsMCwwLDAsMCwKKwkxLDAsNjYsMzYsMywxMzEsMSw2MCwyMTcsNDYsMTkyLDgsCisJMTQ4LDE2LDM0LDE3MiwwLDAsMywxNTAsMCwwLDAsMCwKKwk1OCwwLDk4LDIwLDI1NSwxLDY5LDM4LDIsMTMxLDQsNjAsCisJMTkyLDQsMTMyLDM2LDMsMTMxLDIsNjAsMTcyLDE2LDY2LDE0MCwKKwkzLDEzMSwzLDYwLDE5NiwxNiw5OSwxNDAsMSwwLDY2LDM2LAorCTEsMCw5OSwzNiwzLDEzMSwxLDYwLDE3MiwxNiwzNCwxNzIsCisJMywxMzEsMSw2MCwxOTYsMTYsMzUsMTcyLDU0LDIxLDE5MiwxMiwKKwkyLDQyLDUsMCwzMywxMzYsNjQsMCw4LDAsMzIsMjIsCisJMzMsMzIsMCwyLDMsMTMxLDIsNjAsMjAwLDE2LDY2LDE0MCwKKwkwLDAsMCwwLDEsMCw2NiwzNiwzLDEzMSwxLDYwLAorCTIxNyw0NiwxOTIsOCwyMDAsMTYsMzQsMTcyLDMzLDQwLDY0LDIsCisJMzMsNDgsMCwwLDAsMCwwLDE2MiwxOTIsNDIsMTkyLDEyLAorCTIsMCwwLDE2NiwzMyw0MCwwLDIsMzksMTYsMiwwLAorCTIsMCwxNjIsMTY0LDQsMCwzNiwxNDIsMCwwLDAsMCwKKwkyMjAsNDIsMTkyLDEyLDMzLDQ4LDY0LDIsMzMsMzIsMTYwLDIsCisJNiwwLDEwMSwzOCwzNSw0OCwxNDcsMiwwLDAsNjcsMTQwLAorCTEyLDAsMTM1LDM4LDAsMTI4LDk5LDUyLDAsMCw2NywxNzIsCisJMSwwLDMsMzYsMTgsMCw1MCwxNjYsMTYsMCwxNjMsMTc1LAorCTQsMCwzLDM2LDIwLDAsMTYzLDE3NSwyNCwwLDE3NywxNzUsCisJMjMsNDQsMTkyLDEyLDI4LDAsMTYyLDE3NSwzLDEzMSwyLDYwLAorCTIyOCwxNiw2NiwxNDAsMCwwLDAsMCwxLDAsNjYsMzYsCisJMywxMzEsMSw2MCwyMjgsMTYsMzQsMTcyLDU2LDAsMTkxLDE0MywKKwk1MiwwLDE4MSwxNDMsNDgsMCwxODAsMTQzLDQ0LDAsMTc5LDE0MywKKwk0MCwwLDE3OCwxNDMsMzYsMCwxNzcsMTQzLDMyLDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNjQsMCwxODksMzksMjAwLDI1NSwxODksMzksCisJNDQsMCwxODEsMTc1LDMzLDE2OCwxMjgsMCwzLDEzMSwzLDYwLAorCTQsMTcsOTksMzYsNDgsMCwxOTEsMTc1LDQwLDAsMTgwLDE3NSwKKwkzNiwwLDE3OSwxNzUsMzIsMCwxNzgsMTc1LDI4LDAsMTc3LDE3NSwKKwkyNCwwLDE3NiwxNzUsMCwwLDk4LDE0MCwzMywxMzYsMTYwLDAsCisJMSwwLDY2LDM2LDAsMCw5OCwxNzIsMTgsMCwzNCwxNTAsCisJMCwwLDAsMCwyNTUsMjU1LDg0LDQ4LDI0Myw1LDEzMCw0NiwKKwk4LDAsNjQsMjAsMzMsMTUyLDE5MiwwLDMsMTMxLDIsNjAsCisJOCwxNyw2NiwxNDAsMCwwLDAsMCwxLDAsNjYsMzYsCisJMywxMzEsMSw2MCwxMzIsNDcsMTkyLDgsOCwxNywzNCwxNzIsCisJMiwxMzEsMTgsNjAsMTgsMjMzLDgyLDM4LDMzLDMyLDY0LDIsCisJMCwwLDQ4LDE0Miw4LDAsMzcsMTQyLDI1NSw2MywxNiw1MCwKKwk4MCw2OCwxOTIsMTIsMzMsNDgsMCwyLDAsMCwzNCwxNDIsCisJMCwwLDAsMCwwLDEyOCw2Niw0OCw1LDAsNjQsMjAsCisJMzMsMTQ0LDgwLDIsNCwwLDQ5LDE0MiwwLDAsMCwwLAorCTEsNDcsMTkyLDgsMzMsMzIsNjQsMiwyLDEzMSwxOCw2MCwKKwkxOCwyMzMsODIsMzgsMzMsMTI4LDExNCwyLDE2LDAsMTcsMzgsCisJMzMsMzIsMzIsMiwxNzYsMTMzLDEzMywzOSwxNjgsNzEsMTkyLDEyLAorCTQsMCw2LDM2LDksMCw2NCwxNiwzMywzMiwzMiwyLAorCTEyOCwxMjksMTMzLDM5LDE2OCw3MSwxOTIsMTIsNCwwLDYsMzYsCisJNCwwLDY0LDE2LDAsMCwwLDAsMywxMzEsMyw2MCwKKwkxMjgsNDcsMTkyLDgsMTIsMTcsOTksMzYsMCwwLDQsMTQ2LAorCTY0LDAsMiwzNiwyNDAsMCwxMzEsNDgsNCwwLDk4LDE2LAorCTE1LDAsMTMwLDQ4LDMsMTMxLDMsNjAsMTI4LDQ3LDE5Miw4LAorCTgsMTcsOTksMzYsMTI4LDEzNiwyLDAsMjAsMCwzNCw0MiwKKwk0LDAsNjQsMTYsMzMsMzIsMCwyLDMsMTMxLDMsNjAsCisJMTI4LDQ3LDE5Miw4LDgsMTcsOTksMzYsMzMsNDAsMzIsMiwKKwkxOTIsNDIsMTkyLDEyLDMzLDQ4LDAsMCwyNTUsMjU1LDY2LDQ4LAorCTI1NSwyNTUsMyw1Miw0LDAsNjcsMTYsMCwwLDAsMCwKKwkzLDEzMSwzLDYwLDEyOCw0NywxOTIsOCw4LDE3LDk5LDM2LAorCTYsMCwyLDE1MCwwLDAsMCwwLDYzLDI1NSw2Niw0OCwKKwkxOCwwLDY0LDE2LDMzLDU2LDE3LDIsMywxMzEsMyw2MCwKKwk0OCwxNyw5OSwzNiwwLDAsOTgsMTQwLDAsMCwwLDAsCisJMSwwLDY2LDM2LDAsMCw5OCwxNzIsMywxMzEsMiw2MCwKKwk1NiwxNyw2NiwxNDAsMywxMzEsMyw2MCwyNCwxNyw5OSwxNDAsCisJMSwwLDY2LDM2LDEsMCw5OSwzNiwzLDEzMSwxLDYwLAorCTU2LDE3LDM0LDE3MiwzLDEzMSwxLDYwLDEzMiw0NywxOTIsOCwKKwkyNCwxNywzNSwxNzIsMiwwLDIsMTUwLDAsMCwwLDAsCisJMCwyNiwyLDAsMiwxOCwyLDAsMzcsMjQsOTgsMCwKKwkyNTUsMjU1LDk5LDQ4LDM1LDY0LDExMywwLDM1LDE2LDI0MiwwLAorCTM1LDE2LDEzMCwyLDQyLDE2LDcyLDAsNCwwLDY0LDE2LAorCTEsMCwyLDM2LDMsMTMxLDMsNjAsMTI4LDQ3LDE5Miw4LAorCTI0LDE3LDk5LDM2LDksMCwzLDE0NiwwLDAsMCwwLAorCTUsMCw5OCwxNiwxNywwLDIsMzYsMTUsMCw5OCwxNiwKKwkzMywzMiwxNjAsMiwxMjYsNDcsMTkyLDgsMCwwLDAsMCwKKwkzMywzMiwxNjAsMiwzMyw0MCw2NCwyLDMsMTMxLDMsNjAsCisJMjgsMTcsOTksMzYsMCwwLDk4LDE0MCwzMyw0OCwwLDIsCisJMTYsMCwxNjgsMTc1LDEsMCw2NiwzNiwxMjMsNDYsMTkyLDEyLAorCTAsMCw5OCwxNzIsMTMyLDQ3LDE5Miw4LDAsMCwwLDAsCisJMzMsNDAsNjQsMiwzLDEzMSwzLDYwLDI4LDE3LDk5LDM2LAorCTAsMCw5OCwxNDAsMzMsNDgsMCwyLDE2LDAsMTY4LDE3NSwKKwkxLDAsNjYsMzYsNDEsNDYsMTkyLDEyLDAsMCw5OCwxNzIsCisJMTMyLDQ3LDE5Miw4LDAsMCwwLDAsMywxMzEsMyw2MCwKKwkyMCwxNyw5OSwzNiwwLDAsOTgsMTQwLDAsMCwwLDAsCisJMSwwLDY2LDM2LDAsMCw5OCwxNzIsNDgsMCwxOTEsMTQzLAorCTQ0LDAsMTgxLDE0Myw0MCwwLDE4MCwxNDMsMzYsMCwxNzksMTQzLAorCTMyLDAsMTc4LDE0MywyOCwwLDE3NywxNDMsMjQsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw1NiwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwKKwkyNTUsMCwxMiw2MCwyNTUsMCwxNDAsNTMsMCwyNTUsMTMsNjAsCisJMCwyNTUsMTczLDUzLDE2LDAsMTc2LDE3NSwzLDEzMSwxNiw2MCwKKwkwLDE3LDE2LDM4LDMzLDMyLDAsMiwzMyw0MCwwLDAsCisJMCwxNjMsOSw2MCwyMjAsNSw0MSwxNDEsMCwxNjMsMTAsNjAsCisJMTYsNiw3NCwxNDEsMCwxNjMsMTEsNjAsMjI0LDUsMTA3LDE0MSwKKwkyMCwwLDE5MSwxNzUsMCwyOCw5LDAsMiwyMCw5LDAsCisJMzcsMjQsOTgsMCwwLDYwLDEwLDAsMiwyMCwxMCwwLAorCTM3LDU2LDIyNiwwLDAsNjgsMTEsMCwyLDIwLDExLDAsCisJMzcsNjQsMiwxLDIsMTgsMywwLDM2LDE2LDc2LDAsCisJMCwyNiwzLDAsMzYsMjQsMTA5LDAsMzcsMTYsNjcsMCwKKwkxODQsMTMzLDEzMCwxNzUsMiwxOCw3LDAsMzYsMTYsNzYsMCwKKwkwLDU4LDcsMCwzNiw1NiwyMzcsMCwzNywxNiw3MSwwLAorCTE5MiwxMzMsMTMwLDE3NSwyLDE4LDgsMCwzNiwxNiw3NiwwLAorCTAsNjYsOCwwLDM2LDY0LDEzLDEsMzcsMTYsNzIsMCwKKwkxNzYsMTMzLDEzNywxNzUsMTk2LDEzMywxMzgsMTc1LDE4OCwxMzMsMTM5LDE3NSwKKwkxODAsMTMzLDEzMCwxNzUsMTQ0LDcxLDE5MiwxMiw3NiwwLDYsMzYsCisJMywxMzEsNCw2MCwxNDQsMTYsMTMyLDM2LDMzLDQwLDAsMCwKKwkzMiwwLDIsMzYsMCwwLDIsMTc0LDEwLDAsMiwzNiwKKwkzLDEzMSwxLDYwLDQ0LDE3LDM0LDE3MiwxNDQsNzEsMTkyLDEyLAorCTEwNCwwLDYsMzYsMywxMzEsNCw2MCwxMTIsMTcsMTMyLDM2LAorCTMzLDQwLDAsMCwxNDQsNzEsMTkyLDEyLDE2LDAsNiwzNiwKKwkzLDEzMSw0LDYwLDgwLDE3LDEzMiwzNiwzMyw0MCwwLDAsCisJMTQ0LDcxLDE5MiwxMiwzMiwwLDYsMzYsMjAsMCwxOTEsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMjQsMCwxODksMzksCisJMTc2LDI1NSwxODksMzksMTAwLDAsMTYyLDE0Myw5NiwwLDE2OSwxNDMsCisJNzIsMCwxODIsMTc1LDMzLDE3NiwxMjgsMCw0OCwwLDE3NiwxNzUsCisJMTA0LDAsMTc2LDE0MywzNCwwLDE2NCwzOSw2MCwwLDE3OSwxNzUsCisJMTA4LDAsMTc5LDE0MywzLDEzMSwzLDYwLDEwNCwxNyw5OSwzNiwKKwk1NiwwLDE3OCwxNzUsMiwxMzEsMTgsNjAsMjEyLDQsODIsMzgsCisJNTIsMCwxNzcsMTc1LDMzLDEzNiwxOTIsMCw2OCwwLDE4MSwxNzUsCisJMTEyLDAsMTgxLDE0Myw0LDAsNiwzNiw3NiwwLDE5MSwxNzUsCisJNjQsMCwxODAsMTc1LDAsNjYsMiwwLDI1NSwyNTUsNjYsNDgsCisJMiwxOCwyLDAsMzcsNjQsMiwxLDAsMCw5OCwxNDAsCisJOCwwLDExNiwxNDIsMSwwLDY2LDM2LDAsMCw5OCwxNzIsCisJMywwLDE2MiwxMzYsMCwwLDE2MiwxNTIsNCwwLDE2MywxMjgsCisJNSwwLDE3MCwxMjgsMywwLDEzMCwxNzAsMCwwLDEzMCwxODYsCisJNCwwLDEzMSwxNjIsNSwwLDEzOCwxNjIsMywwLDY2LDEzOCwKKwkwLDAsNjYsMTU0LDQsMCw2NywxMzAsNSwwLDY5LDEzMCwKKwk5LDAsMTMwLDE3MCw2LDAsMTMwLDE4NiwxMCwwLDEzMSwxNjIsCisJMTEsMCwxMzMsMTYyLDI1NSwyNTUsMiw1MiwxNiwwLDE2MiwxNjcsCisJMTgsMCw5OCwxNTAsMzMsNDAsMCwwLDIwLDAsMTYwLDE2MywKKwkyMSwwLDE2MCwxNjMsMzAsMCw2NiwzNiwwLDI2LDIsMCwKKwkyNTUsMjU1LDY2LDQ4LDIsMTgsMiwwLDM3LDI0LDk4LDAsCisJMTgsMCwxNjMsMTY3LDMsMCwyMjYsMTM2LDAsMCwyMjYsMTUyLAorCTAsMCwwLDAsMjUsMCwxNjIsMTcxLDIyLDAsMTYyLDE4NywKKwkzLDAsMzQsMTM3LDAsMCwzNCwxNTMsNCwwLDM1LDEyOSwKKwk1LDAsMzksMTI5LDI5LDAsMTYyLDE3MSwyNiwwLDE2MiwxODcsCisJMzAsMCwxNjMsMTYzLDMxLDAsMTY3LDE2MywxNDQsNzEsMTkyLDEyLAorCTMyLDAsMTY4LDE2NywzLDAsNjYsMTM4LDAsMCw2NiwxNTQsCisJNCwwLDY3LDEzNCw0MSwwLDE2MiwxNzEsMzgsMCwxNjIsMTg3LAorCTQyLDAsMTYzLDE2NywzMywxNiwwLDIsMCwxMzAsMTYsMCwKKwkyNTUsMjU1LDY2LDQ4LDIsMTgsMiwwLDM3LDEyOCwyLDIsCisJMTQsMCwyLDM2LDU4LDAsMzQsMjIsNDQsMCwxNzYsMTY3LAorCTE4LDAsMTYyLDE1MSwwLDAsMCwwLDEyLDAsMTMwLDE2NiwKKwkxOSwwLDE2MiwxMzksMTYsMCwxNjIsMTU1LDIzLDAsMTYzLDEzOSwKKwkyMCwwLDE2MywxNTUsMjcsMCwxNjQsMTM5LDI0LDAsMTY0LDE1NSwKKwkzMSwwLDE2NSwxMzksMjgsMCwxNjUsMTU1LDE3LDAsMTMwLDE3MCwKKwkxNCwwLDEzMCwxODYsMjEsMCwxMzEsMTcwLDE4LDAsMTMxLDE4NiwKKwkyNSwwLDEzMiwxNzAsMjIsMCwxMzIsMTg2LDI5LDAsMTMzLDE3MCwKKwkyNiwwLDEzMywxODYsMzUsMCwxNjIsMTM5LDMyLDAsMTYyLDE1NSwKKwkzOSwwLDE2MywxMzksMzYsMCwxNjMsMTU1LDQzLDAsMTY0LDEzOSwKKwk0MCwwLDE2NCwxNTUsNDQsMCwxNjUsMTMxLDMzLDAsMTMwLDE3MCwKKwkzMCwwLDEzMCwxODYsMzcsMCwxMzEsMTcwLDM0LDAsMTMxLDE4NiwKKwk0MSwwLDEzMiwxNzAsMzgsMCwxMzIsMTg2LDQyLDAsMTMzLDE2MiwKKwk0NSwwLDE2MiwxMzEsMCwwLDAsMCw0MywwLDEzMCwxNjIsCisJNDQsMCwyLDM2LDAsMCw5OCwxNzQsMCwwLDk5LDE0MiwKKwkxOCwwLDk4LDE1MCwwLDAsMCwwLDMzLDE2LDY3LDAsCisJMTgsMCw5OCwxNjYsMTgsMCw5OCwxNTAsMCwwLDAsMCwKKwk2MCwwLDY2LDQ0LDgwLDAsNjQsMTYsMzMsMzIsMTkyLDIsCisJMCwwLDE2MiwxNDIsMTgsMCw5OSwxNTAsNjAsMCw2NiwzNiwKKwkzNSwxNiw2NywwLDAsMCwxNjIsMTc0LDYwLDAsMiwzNiwKKwkxOCwwLDk4LDE2NiwxNzIsNDgsMTkyLDgsMzMsMzIsMTkyLDIsCisJMjA4LDEyOSwxMzMsMzksMywwLDE2MiwxMzYsMCwwLDE2MiwxNTIsCisJNCwwLDE2MywxMjgsNSwwLDE2NCwxMjgsMTcsMCwxMzAsMTcwLAorCTE0LDAsMTMwLDE4NiwxOCwwLDEzMSwxNjIsMTksMCwxMzIsMTYyLAorCTEyOSw1NSwyLDM2LDIwLDAsMTMwLDE2NiwxOSwwLDE2MiwxMzksCisJMTYsMCwxNjIsMTU1LDIzLDAsMTYzLDEzOSwyMCwwLDE2MywxNTUsCisJMjcsMCwxNjQsMTM5LDI0LDAsMTY0LDE1NSwzMSwwLDE2NSwxMzksCisJMjgsMCwxNjUsMTU1LDI1LDAsMTMwLDE3MCwyMiwwLDEzMCwxODYsCisJMjksMCwxMzEsMTcwLDI2LDAsMTMxLDE4NiwzMywwLDEzMiwxNzAsCisJMzAsMCwxMzIsMTg2LDM3LDAsMTMzLDE3MCwzNCwwLDEzMywxODYsCisJMzUsMCwxNjIsMTM5LDMyLDAsMTYyLDE1NSwzOSwwLDE2MywxMzksCisJMzYsMCwxNjMsMTU1LDQzLDAsMTY0LDEzOSw0MCwwLDE2NCwxNTUsCisJNDQsMCwxNjUsMTMxLDQxLDAsMTMwLDE3MCwzOCwwLDEzMCwxODYsCisJNDUsMCwxMzEsMTcwLDQyLDAsMTMxLDE4Niw0OSwwLDEzMiwxNzAsCisJNDYsMCwxMzIsMTg2LDUwLDAsMTMzLDE2Miw0NSwwLDE2MiwxMzEsCisJMCwwLDAsMCw1MSwwLDEzMCwxNjIsNTIsMCwyLDM2LAorCTAsMCw5OCwxNzQsMCwwLDk5LDE0MiwxOCwwLDk4LDE1MCwKKwkwLDAsMCwwLDMzLDE2LDY3LDAsMTgsMCw5OCwxNjYsCisJMTgsMCw5OCwxNTAsMCwwLDAsMCw2MCwwLDY2LDQ0LAorCTgsMCw2NCwxNiwwLDAsMCwwLDAsMCwxNjIsMTQyLAorCTE4LDAsOTksMTUwLDYwLDAsNjYsMzYsMzUsMTYsNjcsMCwKKwkwLDAsMTYyLDE3NCw2MCwwLDIsMzYsMTgsMCw5OCwxNjYsCisJMTgsMCw5OCwxNTAsMCwwLDAsMCwwLDI2LDIsMCwKKwkyLDE4LDIsMCwzNywyNCw5OCwwLDEyLDAsMTMxLDE2NiwKKwkzMywzMiwxOTIsMiw3NCwyMSwxOTIsMTIsMzMsNDAsOTYsMiwKKwk4LDAsNjQsMjAsMzMsMzIsOTYsMiwzLDEzMSwzLDYwLAorCTEwOCwxNyw5OSwzNiwwLDAsOTgsMTQwLDAsMCwwLDAsCisJMSwwLDY2LDM2LDE1MiwyMSwxOTIsMTIsMCwwLDk4LDE3MiwKKwk3NiwwLDE5MSwxNDMsNzIsMCwxODIsMTQzLDY4LDAsMTgxLDE0MywKKwk2NCwwLDE4MCwxNDMsNjAsMCwxNzksMTQzLDU2LDAsMTc4LDE0MywKKwk1MiwwLDE3NywxNDMsNDgsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk4MCwwLDE4OSwzOSwzMywyNCwwLDAsNSwwLDcsMzYsCisJNTgsMCw2LDM2LDAsMCwxNjIsMTQ0LDAsMCwwLDAsCisJMiwxNywyLDAsMiwxMzEsMSw2MCwzMyw4LDM0LDAsCisJMTc2LDE1NSwzNCwxNDQsMCwwLDAsMCwwLDAsMTMwLDE2MCwKKwkwLDAsMTYyLDE0NCwxLDAsMTMyLDM2LDE1LDAsNjYsNDgsCisJMiwxMzEsMSw2MCwzMyw4LDM0LDAsMTc2LDE1NSwzNCwxNDQsCisJMSwwLDE2NSwzNiwwLDAsMTMwLDE2MCwzLDAsMTAzLDE2LAorCTEsMCwxMzIsMzYsMCwwLDEzNCwxNjAsMSwwLDEzMiwzNiwKKwkxLDAsOTksMzYsNiwwLDk4LDQwLDIzMywyNTUsNjQsMjAsCisJMCwwLDAsMCw4LDAsMjI0LDMsMCwwLDAsMCwKKwkxMjgsMjU1LDE4OSwzOSwyLDEwMSwyLDM2LDAsMiwzLDM2LAorCTExMiwwLDE3NiwxNzUsNDQsMCwxNzYsMzksMzMsMzIsMCwyLAorCTMzLDQwLDAsMCw0OCwwLDYsMzYsMTIwLDAsMTkxLDE3NSwKKwkxMTYsMCwxNzcsMTc1LDQwLDAsMTYyLDE2NywxNDQsNzEsMTkyLDEyLAorCTQyLDAsMTYzLDE2NywzLDEzMSwxNyw2MCw5NiwxOCw0OSwzOCwKKwkyLDEzMSw1LDYwLDIyNCwxNDcsMTY1LDM2LDE4OCw3MSwxOTIsMTIsCisJMzMsMzIsMzIsMiwxOCwwLDY0LDIwLDMzLDMyLDAsMiwKKwkyLDEzMSw1LDYwLDIzNiwxNDcsMTY1LDM2LDAsMCwxNjIsMTQwLAorCTQsMCwxNjMsMTQwLDgsMCwxNjQsMTQwLDQ0LDAsMTYyLDE3NSwKKwk0OCwwLDE2MywxNzUsNTIsMCwxNjQsMTc1LDEyLDAsMTYyLDEyOCwKKwkwLDAsMCwwLDU2LDAsMTYyLDE2MywyLDEzMSw1LDYwLAorCTIxMiw0LDE2NSwzNiwxOTMsNDgsMTkyLDEyLDU2LDAsMTY0LDM5LAorCTgsNDksMTkyLDgsOTIsMCwxNzcsMzksMzMsNDAsMzIsMiwKKwkyMDQsNjMsMTkyLDEyLDQ4LDAsNiwzNiw5MiwwLDE3NywzOSwKKwkzMywzMiwzMiwyLDMzLDQwLDAsMCwxNDQsNzEsMTkyLDEyLAorCTQsMCw2LDM2LDIsMTMxLDQsNjAsMjEyLDQsMTMyLDM2LAorCTAsMCwxMzAsMTQwLDQsMCwxMzEsMTMyLDk2LDAsMTYyLDE3NSwKKwkxMDAsMCwxNjMsMTY3LDQsODIsMiwzNiwwLDEsMywzNiwKKwkyMzYsMjU1LDEzMiwzNiwyLDAsNSwzNiwxMDIsMCwxNjIsMTY3LAorCTU0LDIxLDE5MiwxMiwxMDQsMCwxNjMsMTY3LDMzLDEyOCw2NCwwLAorCTIyLDAsMCwxOCw0MCwwLDE2NSwzOSw0LDAsNCwxNDIsCisJMCwwLDAsMCwyMjAsNDIsMTkyLDEyLDY2LDAsNiwzNiwKKwkzMywzMiwwLDAsMCwwLDY3LDE0MCwxMzIsMTI5LDEzMywzOSwKKwkwLDEyOCw5OSw1MiwwLDAsNjcsMTcyLDQsMCwzLDE0MiwKKwkxNCwwLDYsMzYsMTgsMCw5OSwxNDgsMzMsNTYsMzIsMiwKKwkxOCwwLDMsMTY2LDgyLDQsMywzNiwxNiwwLDE2NSwxNzUsCisJMjAsMCwxNjMsMTc1LDI0LDAsMTYzLDE3NSwyOCwwLDE3NiwxNzUsCisJMjE0LDQ3LDE5MiwxMiwzMiwwLDE2MiwxNzUsMTIwLDAsMTkxLDE0MywKKwkxMTYsMCwxNzcsMTQzLDExMiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTEyOCwwLDE4OSwzOSwxNDQsMjU1LDE4OSwzOSwxMDQsMCwxODAsMTc1LAorCTMzLDE2MCwxMjgsMCwxMDAsMCwxNzksMTc1LDMzLDE1MiwxNjAsMCwKKwk5MiwwLDE3NywxNzUsMzMsMTM2LDE5MiwwLDMzLDMyLDIyNCwwLAorCTQwLDAsMTY2LDM5LDU2LDAsMTY3LDM5LDk2LDAsMTc4LDE3NSwKKwkyLDEzMSwxOCw2MCw4LDIzOSw4MiwzOCw4OCwwLDE3NiwxNzUsCisJMTI4LDAsMTc2LDE0MywyNDIsNSwyLDM2LDg0LDAsMTYyLDE2NywKKwk3MiwwLDE2MiwzOSwxMDgsMCwxOTEsMTc1LDcyLDAsMTYwLDE2NywKKwk3NiwwLDE3OCwxNzUsODAsMCwxNzgsMTc1LDE2LDAsMTYyLDE3NSwKKwkyNDcsNzEsMTkyLDEyLDMzLDQwLDAsMiwyNTUsMjU1LDMsMzYsCisJMzcsMCw2NywxNiwyNTUsMSw1LDM4LDIsMTMxLDQsNjAsCisJMTkyLDQsMTMyLDM2LDU0LDIxLDE5MiwxMiwyLDQyLDUsMCwKKwkzMywxMjgsNjQsMCwzMCwwLDAsMTgsMzMsNDAsNjQsMiwKKwk4MCwwLDE2NiwxNDMsNzYsMCwxNjIsMTQzLDQsMCw0LDE0MiwKKwkzNSw0OCwxOTQsMCwyMjAsNDIsMTkyLDEyLDI1NSwyNTUsMTk4LDQ4LAorCTMzLDMyLDEyOCwyLDAsMCw2NywxNDAsNiwwLDEwMSwzOCwKKwkwLDEyOCw5OSw1MiwwLDAsNjcsMTcyLDQsMCwzLDE0MiwKKwkzNSw0OCw1MSwyLDE4LDAsOTksMTQ4LDE4LDAsMzksMzgsCisJMTgsMCwzLDE2NiwyOCwwLDQwLDE1MCwyMiwwLDM1LDM4LAorCTE2LDAsMTYzLDE3NSwxNSwxNDQsMyw1MiwyNCwwLDE2MywxNzUsCisJMjgsMCwxNzYsMTc1LDMyLDAsMTYyLDE3NSwwLDE4LDgsMCwKKwkyLDY2LDgsMCwzNywxNiw3MiwwLDI1NSwyNTUsNjYsNDgsCisJMjE0LDQ3LDE5MiwxMiwyMCwwLDE2MiwxNzUsMTA4LDAsMTkxLDE0MywKKwkxMDQsMCwxODAsMTQzLDEwMCwwLDE3OSwxNDMsOTYsMCwxNzgsMTQzLAorCTkyLDAsMTc3LDE0Myw4OCwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTExMiwwLDE4OSwzOSwyMDAsMjU1LDE4OSwzOSw0NCwwLDE4MSwxNzUsCisJMzMsMTY4LDEyOCwwLDI4LDAsMTc3LDE3NSwzMywxMzYsMTYwLDAsCisJNDgsMCwxOTEsMTc1LDQwLDAsMTgwLDE3NSwzNiwwLDE3OSwxNzUsCisJMzIsMCwxNzgsMTc1LDI0LDAsMTc2LDE3NSwxOCwwLDM0LDE1MCwKKwkwLDAsMCwwLDI1NSwyNTUsODQsNDgsMjQzLDUsMTMwLDQ2LAorCTQsMCw2NCwyMCwzMywxNTIsMTkyLDAsMywxMzEsMyw2MCwKKwkyNDEsNDksMTkyLDgsODQsMTcsOTksMzYsMiwxMzEsMTgsNjAsCisJMTYsMjMzLDgyLDM4LDMzLDMyLDY0LDIsMCwwLDQ4LDE0MiwKKwk4LDAsMzcsMTQyLDI1NSw2MywxNiw1MCw4MCw2OCwxOTIsMTIsCisJMzMsNDgsMCwyLDAsMCwzNCwxNDIsMCwwLDAsMCwKKwkwLDEyOCw2Niw0OCw1LDAsNjQsMjAsMzMsMTQ0LDgwLDIsCisJNCwwLDQ5LDE0MiwwLDAsMCwwLDE0OCw0OSwxOTIsOCwKKwkzMywzMiw2NCwyLDIsMTMxLDIsNjAsMTYsMjMzLDY2LDM2LAorCTMzLDEyOCw5OCwyLDYsMCwxNywzOCwzMywzMiwzMiwyLAorCTAsMTYzLDUsNjAsMjI0LDUsMTY1LDUyLDE2OCw3MSwxOTIsMTIsCisJNCwwLDYsMzYsOSwwLDY0LDE2LDMzLDMyLDMyLDIsCisJMjI0LDEyOSwxMzMsMzksMTY4LDcxLDE5MiwxMiw0LDAsNiwzNiwKKwk1LDAsNjQsMTYsMTAsMCwxNywzOCwzLDEzMSwzLDYwLAorCTI0MSw0OSwxOTIsOCw4OCwxNyw5OSwzNiwxMCwwLDE3LDM4LAorCTMzLDMyLDMyLDIsMiwxMzEsNSw2MCwyMTIsNCwxNjUsMzYsCisJMTY4LDcxLDE5MiwxMiw2LDAsNiwzNiw5LDAsNjQsMTYsCisJMzMsMzIsMzIsMiwyMjgsMTI5LDEzMywzOSwxNjgsNzEsMTkyLDEyLAorCTYsMCw2LDM2LDQsMCw2NCwxNiwwLDAsMCwwLAorCTMsMTMxLDMsNjAsMjQxLDQ5LDE5Miw4LDg4LDE3LDk5LDM2LAorCTAsMCwzLDE1MCwyNTUsMjU1LDIsNTIsNCwwLDk4LDE2LAorCTMwLDAsNywzOCwzLDEzMSwzLDYwLDI0MSw0OSwxOTIsOCwKKwk4OCwxNyw5OSwzNiwyLDAsMiwxNTAsMiwxMzEsNSw2MCwKKwkxNiwyMzMsMTY1LDM2LDAsMjYsMiwwLDIsMTgsMiwwLAorCTM3LDI0LDk4LDAsMjU1LDI1NSw5OSw0OCwyMjYsMjU1LDEwNCwzNiwKKwkzNSwxNiwyMjksMCwzNSwxNiwxMzAsMiw0MiwxNiw3MiwwLAorCTQsMCw2NCwxNiwwLDAsMCwwLDMsMTMxLDMsNjAsCisJMjQxLDQ5LDE5Miw4LDk2LDE3LDk5LDM2LDE2LDAsMiwxNTAsCisJMCwwLDAsMCwwLDI2LDIsMCwyLDE4LDIsMCwKKwkzNywyNCw5OCwwLDI1NSwyNTUsOTksNDgsMTUsMTQ0LDIsNTIsCisJMTEsMCw5OCwyMCwzMywzMiwxNjAsMiwzLDEzMSwzLDYwLAorCTEwMCwxNyw5OSwzNiwwLDAsOTgsMTQwLDMzLDQ4LDAsMiwKKwkxNiwwLDE2OCwxNzUsMSwwLDY2LDM2LDU0LDQ5LDE5MiwxMiwKKwkwLDAsOTgsMTcyLDI0NSw0OSwxOTIsOCwwLDAsMCwwLAorCTMsMTMxLDMsNjAsOTIsMTcsOTksMzYsMCwwLDk4LDE0MCwKKwkwLDAsMCwwLDEsMCw2NiwzNiwwLDAsOTgsMTcyLAorCTQ4LDAsMTkxLDE0Myw0NCwwLDE4MSwxNDMsNDAsMCwxODAsMTQzLAorCTM2LDAsMTc5LDE0MywzMiwwLDE3OCwxNDMsMjgsMCwxNzcsMTQzLAorCTI0LDAsMTc2LDE0Myw4LDAsMjI0LDMsNTYsMCwxODksMzksCisJMCwwLDAsMCwwLDAsMCwwLDIzMiwyNTUsMTg5LDM5LAorCTE2LDAsMTkxLDE3NSwxMyw4LDE5MiwxMiwwLDgsNCwzNiwKKwk4LDEzMywxMzAsMTc1LDE2LDAsMTkxLDE0MywyNCwwLDE4OSwzOSwKKwk4LDAsMjI0LDMsMCwwLDAsMCwyMzIsMjU1LDE4OSwzOSwKKwk0NSwwLDEyOCwxNiwxNiwwLDE5MSwxNzUsMjQwLDEyOSwxMzMsMTQzLAorCTcsMCwxMzAsMzYsMTk0LDE2LDIsMCwxMCwwLDE2MCwyMCwKKwkxLDAsNzAsMzYsOCwxMzMsMTMzLDE0MywwLDEzMywxMzAsMzksCisJMCwxMzMsMTMzLDE3NSwwLDAsMTYyLDE3MiwwLDgsMiwzNiwKKwkyNDAsMTI5LDEzMywxNzUsMiwxMzEsMSw2MCwyMCwyMTEsMzIsMTcyLAorCTQsMCwxNjIsMTcyLDAsMCwxNjQsMTQwLDAsMCwwLDAsCisJNCwwLDEzMSwxNDAsMCwwLDAsMCw0MywxNiwxMDIsMCwKKwkxNCwwLDY0LDIwLDAsMCwwLDAsNSwwLDEwMiwyMCwKKwkzNSwxNiwxMDIsMCwwLDAsMTMwLDE0MCwwLDAsMCwwLAorCTQzLDUwLDE5Miw4LDAsMCwxNjIsMTcyLDQsMCwxMzAsMTcyLAorCTE5MiwxNiwyLDAsMzMsMzIsMTMwLDAsNCwwLDEzNCwxNzIsCisJMjQwLDEyOSwxMzMsMTc1LDU3LDUwLDE5Miw4LDgsMCwxMzAsMzYsCisJMjQwLDEyOSwxMzAsMTQzLDAsMCwwLDAsNCwwLDEzMCwxNiwKKwkzMyw0MCwxMjgsMCwwLDAsMTMyLDE0MCwyOCw1MCwxOTIsOCwKKwkwLDAsMCwwLDIsMTMxLDQsNjAsMTUsNjMsMTkyLDEyLAorCTY0LDE0OCwxMzIsMzYsMzMsMTYsMCwwLDE2LDAsMTkxLDE0MywKKwkyNCwwLDE4OSwzOSw4LDAsMjI0LDMsMCwwLDAsMCwKKwk1NiwwLDEyOCwxNiwyNDgsMjU1LDEzMiwzNiwyNDAsMTI5LDEzMywxNDMsCisJMCwwLDAsMCw3OCw1MCwxOTIsOCw0MywxNiwxNjQsMCwKKwkwLDAsMTYzLDE0MCwwLDAsMCwwLDQzLDE2LDE2MywwLAorCTUsMCw2NCwyMCw0MywxNiwxNjQsMCwxMiwwLDY0LDIwLAorCTQzLDE2LDEzMSwwLDEwLDAsNjQsMjAsMCwwLDAsMCwKKwkzMyw0MCw5NiwwLDQzLDE2LDE2NCwwLDI0NCwyNTUsNjQsMTYsCisJMCwwLDAsMCwwLDAsMTYyLDE0MCwwLDAsMCwwLAorCTQzLDE2LDEzMCwwLDIzOSwyNTUsNjQsMTYsMCwwLDAsMCwKKwk0LDAsMTM0LDE0MCwwLDAsMTYzLDE0MCwxOTIsMTYsNiwwLAorCTMzLDE2LDEzMCwwLDExLDAsNjcsMjAsMCwwLDAsMCwKKwk0LDAsOTgsMTQwLDAsMCwwLDAsMzMsMTYsMTk0LDAsCisJNCwwLDEzMCwxNzIsMCwwLDE2MiwxNDAsMCwwLDAsMCwKKwkwLDAsNjYsMTQwLDAsMCwwLDAsMTAyLDUwLDE5Miw4LAorCTAsMCwxMzAsMTcyLDAsMCwxMzEsMTcyLDQsMCwxNjMsMTQwLAorCTAsMCwwLDAsMTkyLDE2LDMsMCwzMywxNiwxNjIsMCwKKwk5LDAsNjgsMjAsMCwwLDAsMCw0LDAsMTMwLDE0MCwKKwkwLDAsMCwwLDMzLDE2LDk4LDAsNCwwLDE2MiwxNzIsCisJMCwwLDEzMCwxNDAsMCwwLDAsMCwxMTcsNTAsMTkyLDgsCisJMCwwLDE2MiwxNzIsMCwwLDE2NCwxNzIsMjQwLDEyOSwxMzMsMTc1LAorCTgsMCwyMjQsMywwLDAsMCwwLDIzMiwyNTUsMTg5LDM5LAorCTE2LDAsMTkxLDE3NSwwLDUwLDE5MiwxMiwwLDAsMCwwLAorCTE3OCw0NSwxOTIsMTIsMzMsMzIsMCwwLDE2LDAsMTkxLDE0MywKKwkyNCwwLDE4OSwzOSw4LDAsMjI0LDMsMCwwLDAsMCwKKwkxLDAsMywzNiw1LDAsMTk1LDIwLDI1NSwyNTUsMiwzNiwKKwkwLDAsMjI2LDE0MCwwLDAsMCwwLDQzLDE2LDIsMCwKKwkzNSwxNiwyLDAsOCwwLDIyNCwzLDAsMCwwLDAsCisJMjI0LDI1NSwxODksMzksMTYsMCwxNzYsMTc1LDMzLDEyOCwyMjQsMCwKKwkyMCwwLDE3NywxNzUsNDgsMCwxNzcsMTQzLDEsMCwyLDM2LAorCTUsMCwxNjIsMjAsMjQsMCwxOTEsMTc1LDAsMCwxOTQsMTQwLAorCTAsMCwwLDAsOCwwLDY0LDE2LDAsMCwwLDAsCisJMTEsMCwyLDM2LDMzLDMyLDAsMiwzMyw0MCwzMiwyLAorCTQ4LDcyLDE5MiwxMiw5NiwwLDIsMTc0LDEsMCw2NiwzNiwKKwkxMDAsMCwyLDE3NCwxNywwLDM0LDE0NiwwLDAsMCwwLAorCTEsMCw2Niw1MiwxNywwLDM0LDE2MiwyNCwwLDE5MSwxNDMsCisJMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJMzIsMCwxODksMzksOCwwLDIyNCwzLDAsMCwwLDAsCisJMTYsMCwxNjMsMTQzLDAsMCwwLDAsMTcsMCw5OCwxNDQsCisJMCwwLDAsMCwyLDAsNjYsNTIsOCwwLDIyNCwzLAorCTE3LDAsOTgsMTYwLDgsMCwyMjQsMywwLDAsMCwwLAorCTIyNCwyNTUsMTg5LDM5LDE2LDAsMTc2LDE3NSwzMywxMjgsMTI4LDAsCisJMjQ0LDEyOSwxMzEsMTUxLDI1NSwwLDIsMzYsMjgsMCwxOTEsMTc1LAorCTI0LDAsMTc4LDE3NSwyMCwwLDE3NywxNzUsNCwwLDIsMTc0LAorCTYwLDAsMCwxNzQsMSwwLDk4LDM2LDI0NCwxMjksMTMwLDE2NywKKwkxMCwwLDMsMTY2LDMsMCwxNjIsMTM2LDAsMCwxNjIsMTUyLAorCTcsMCwxNjMsMTM2LDQsMCwxNjMsMTUyLDExLDAsMTY0LDEzNiwKKwk4LDAsMTY0LDE1MiwxNSwwLDE2NywxMzYsMTIsMCwxNjcsMTUyLAorCTE1LDAsMiwxNzAsMTIsMCwyLDE4NiwxOSwwLDMsMTcwLAorCTE2LDAsMywxODYsMjMsMCw0LDE3MCwyMCwwLDQsMTg2LAorCTI3LDAsNywxNzAsMjQsMCw3LDE4NiwzLDAsMTk0LDEzNiwKKwkwLDAsMTk0LDE1Miw3LDAsMTk1LDEzNiw0LDAsMTk1LDE1MiwKKwkxMSwwLDE5NiwxMzYsOCwwLDE5NiwxNTIsMTUsMCwxOTcsMTM2LAorCTEyLDAsMTk3LDE1MiwzMSwwLDIsMTcwLDI4LDAsMiwxODYsCisJMzUsMCwzLDE3MCwzMiwwLDMsMTg2LDM5LDAsNCwxNzAsCisJMzYsMCw0LDE4Niw0MywwLDUsMTcwLDQwLDAsNSwxODYsCisJODAsMCwyLDE0Miw3NiwwLDMsMTQyLDAsMCwwLDAsCisJMzUsMTYsNjcsMCwyNTUsMjU1LDgxLDQ4LDg4LDAsMywxNTAsCisJMywwLDIsMzYsMTMsMCw5OCwxNiwwLDAsMCwwLAorCTIsMTMxLDE4LDYwLDE2MCwyMDQsODIsMzgsMTU2LDcxLDE5MiwxMiwKKwkzMywzMiw2NCwyLDcsMCw4MSwyMCwzMywzMiw2NCwyLAorCTc2LDAsNSwxNDIsMCwwLDAsMCwxNjgsNzEsMTkyLDEyLAorCTMzLDQ4LDMyLDIsMjEsMCw2NCwxNiwzMywxNiwwLDAsCisJMiwxMzEsMTgsNjAsMTkyLDIwNCw4MiwzOCwxNTYsNzEsMTkyLDEyLAorCTMzLDMyLDY0LDIsNywwLDgxLDIwLDMzLDMyLDY0LDIsCisJNzYsMCw1LDE0MiwwLDAsMCwwLDE2OCw3MSwxOTIsMTIsCisJMzMsNDgsMzIsMiw5LDAsNjQsMTYsMzMsMTYsMCwwLAorCTMsMTMxLDMsNjAsMTMyLDE3LDk5LDM2LDAsMCw5OCwxNDAsCisJMSwwLDQsMzYsMSwwLDY2LDM2LDE3OCw0NSwxOTIsMTIsCisJMCwwLDk4LDE3MiwxLDAsMiwzNiwyOCwwLDE5MSwxNDMsCisJMjQsMCwxNzgsMTQzLDIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDMyLDAsMTg5LDM5LDAsMCwwLDAsCisJMCwwLDAsMCwyMjQsMjU1LDE4OSwzOSwyMCwwLDE3NywxNzUsCisJMzMsMTM2LDIyNCwwLDE2LDAsMTc2LDE3NSw0OCwwLDE3NiwxNDMsCisJMjQsMCwxOTEsMTc1LDE1Niw3MSwxOTIsMTIsMzMsMzIsMzIsMiwKKwkwLDAsMiwxNzQsMzMsMTYsMzIsMiwyNCwwLDE5MSwxNDMsCisJMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJMzIsMCwxODksMzksOCwwLDIyNCwzLDMzLDE2LDIyNCwwLAorCTAsMCwyMjcsMTQwLDIwNCwyMDQsMiw2MCwyMDUsMjA0LDY2LDUyLAorCTI1LDAsOTgsMCwxNiwzMiwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDgsMCwyMjQsMywxOTQsMTYsNCwwLAorCTIyNCwyNTUsMTg5LDM5LDE2LDAsMTc2LDE3NSwzMywxMjgsMjI0LDAsCisJMzMsMzIsMCwyLDMzLDQwLDAsMCwyMCwwLDE3NywxNzUsCisJNDgsMCwxNzcsMTQzLDI0LDAsMTkxLDE3NSwyMDgsNzEsMTkyLDEyLAorCTE2LDAsNiwzNiwyLDAsNjQsMjAsMzUsMTYsODAsMCwKKwkxNiwwLDIsMzYsMCwwLDM0LDE3NCwzMywxNiwwLDIsCisJMjQsMCwxOTEsMTQzLDIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDMyLDAsMTg5LDM5LDIzMiwyNTUsMTg5LDM5LAorCTQwLDAsMTY0LDE0Myw0NCwwLDE2NSwxNDMsMTYsMCwxOTEsMTc1LAorCTIwNSw1OSwxOTIsMTIsMCwwLDAsMCwxNiwwLDE5MSwxNDMsCisJMjQsMCwxODksMzksOCwwLDIyNCwzLDAsMCwwLDAsCisJMjMyLDI1NSwxODksMzksNDAsMCwxNjQsMTQzLDQ0LDAsMTY1LDE0MywKKwkxNiwwLDE5MSwxNzUsMjM5LDU5LDE5MiwxMiwwLDAsMCwwLAorCTE2LDAsMTkxLDE0MywyNCwwLDE4OSwzOSw4LDAsMjI0LDMsCisJMCwwLDAsMCwyMzIsMjU1LDE4OSwzOSw0MCwwLDE2NCwxNDMsCisJNDQsMCwxNjUsMTQzLDE2LDAsMTkxLDE3NSwxNyw2MCwxOTIsMTIsCisJMCwwLDAsMCwxNiwwLDE5MSwxNDMsMjQsMCwxODksMzksCisJOCwwLDIyNCwzLDAsMCwwLDAsOCwwLDIyNCwzLAorCTMzLDE2LDIyNCwwLDAsMCwyMjYsMTQwLDgsMCwyMjQsMywKKwkwLDAsMCwwLDIxNiwyNTUsMTg5LDM5LDI0LDAsMTc2LDE3NSwKKwk1NiwwLDE3NiwxNDMsMzIsMCwxOTEsMTc1LDI4LDAsMTc3LDE3NSwKKwkzNiwwLDIsMTQyLDEsMCwzLDM2LDIwLDAsODEsMTQwLAorCTE4NywwLDE2MywyMCwwLDAsMCwwLDAsMCwxOTUsMTQwLAorCTAsMCwwLDAsMTgzLDAsOTYsMTYsMCwwLDAsMCwKKwkzMiwxMzMsMTMwLDE0MywwLDAsMCwwLDQzLDE2LDY3LDAsCisJMTc4LDAsNjQsMjAsMjU1LDI1NSwxMDQsMzYsNjQsMTgsOCwwLAorCTIsMTMxLDMsNjAsMTkyLDI0Niw5OSwzNiwzMyw0MCw2NywwLAorCTI1NSwyNTUsMTMyLDM2LDIyLDAsMTMwLDQ0LDE3MCwwLDY0LDE2LAorCTEyOCwxNiw0LDAsMiwxMzEsMSw2MCwzMyw4LDM0LDAsCisJMTQ0LDE0OCwzNCwxNDAsMCwwLDAsMCw4LDAsNjQsMCwKKwkwLDAsMCwwLDIsMCwyLDM2LDE2LDAsMiwxNjIsCisJMTcsMCwyLDE0NiwwLDAsMTk1LDE0MCwwLDAsMCwwLAorCTE1LDUyLDE5Miw4LDIsMCw2Niw1MiwzMywzMiwzMiwyLAorCTE3LDAsMywxNDYsNCwwLDIsMzYsMTYsMCwyLDE2MiwKKwk0MCwwLDAsMTY2LDQ0LDAsMTcsMTc0LDIsMCw5OSw1MiwKKwkxNTYsNzEsMTkyLDEyLDE3LDAsMywxNjIsMjU1LDI1NSw2Niw0OCwKKwkzMywxNiwzNCwyLDQ4LDAsMiwxNzQsNDAsNTIsMTkyLDgsCisJNTIsMCwwLDE2NiwxNywwLDMsMTQ2LDIsMCwyLDM2LAorCTE2LDAsMiwxNjIsMjQzLDUxLDE5Miw4LDQwLDAsMTcsMTc0LAorCTE3LDAsMywxNDYsMiwwLDIsMzYsMTYsMCwyLDE2MiwKKwkyNDMsNTEsMTkyLDgsNDAsMCwxNywxNzQsNjYsMCwyLDM2LAorCTEzLDAsMCwyMSwxNiwwLDIsMTYyLDI0LDEzMywxMzIsMTQzLAorCTAsMCwwLDAsNjQsMjUsNCwwLDM1LDI0LDEwMCwwLAorCTEyOCwxNywzLDAsMzUsMTYsNjcsMCwxOTIsMTYsMiwwLAorCTMzLDE2LDY4LDAsMTI4LDI0LDIsMCwzMywxNiw2NywwLAorCTE3OCw1MSwxOTIsOCwxOTIsMTcsMiwwLDE1MiwwLDIsNjAsCisJMTI4LDE1MCw2Niw1Miw0MCwwLDIsMTc0LDE3LDAsMiwxNDYsCisJMCwwLDAsMCwxOTksNTEsMTkyLDgsMiwwLDY2LDUyLAorCTE3LDAsMywxNDYsNCwwLDIsMzYsMTYsMCwyLDE2MiwKKwkyMCwwLDE2MiwzNiw0NCwwLDIsMTc0LDI2LDAsMTYyLDM2LAorCTQwLDAsMCwxNjYsNDgsMCwyLDE3NCwyNDMsNTEsMTkyLDgsCisJNTIsMCwwLDE2NiwyLDAsMiwzNiwxNiwwLDIsMTYyLAorCTE3LDAsMiwxNDYsMSwwLDMsMzYsNDAsMCwzLDE3NCwKKwkyLDAsNjYsNTIsNDAsNTIsMTkyLDgsMTcsMCwyLDE2MiwKKwkxNywwLDMsMTQ2LDAsMCwwLDAsMjQxLDUxLDE5Miw4LAorCTY3LDAsMiwzNiw2NSwwLDIsMzYsMTYsMCwyLDE2MiwKKwkxNywwLDIsMTQ2LDE2OCwwLDE2MywxNDAsMCwwLDAsMCwKKwkxNSw1MiwxOTIsOCwyLDAsNjYsNTIsNjUsMCwyLDM2LAorCTE2LDAsMiwxNjIsMTU2LDAsMTYyLDE0MCwwLDEsMTY0LDE0MCwKKwkyMiw1MiwxOTIsOCwwLDAsMCwwLDY1LDAsMiwzNiwKKwkxNiwwLDIsMTYyLDE3LDAsMiwxNDYsMCwxLDE2MywxNDAsCisJMCwwLDAsMCwxNSw1MiwxOTIsOCwyLDAsNjYsNTIsCisJNjUsMCwyLDM2LDE2LDAsMiwxNjIsMTcsMCwyLDE0NiwKKwkxNjQsMCwxNjMsMTQwLDAsMCwwLDAsMTUsNTIsMTkyLDgsCisJMiwwLDY2LDUyLDY1LDAsMiwzNiwxNiwwLDIsMTYyLAorCTE3LDAsMiwxNDYsMTYwLDAsMTYzLDE0MCwwLDAsMCwwLAorCTE1LDUyLDE5Miw4LDIsMCw2Niw1MiwxNywwLDMsMTQ2LAorCTY1LDAsMiwzNiwxNiwwLDIsMTYyLDQwLDAsMCwxNzQsCisJMiwwLDk5LDUyLDQwLDUyLDE5Miw4LDE3LDAsMywxNjIsCisJNjUsMCwyLDM2LDE2LDAsMiwxNjIsMTcyLDAsMTYyLDE0MCwKKwk0LDEsMTY0LDE0MCwyMiw1MiwxOTIsOCwwLDAsMCwwLAorCTY1LDAsMiwzNiwxNiwwLDIsMTYyLDE3LDAsMiwxNDYsCisJNCwxLDE2MywxNDAsMCwwLDAsMCwxNSw1MiwxOTIsOCwKKwkyLDAsNjYsNTIsNjUsMCwyLDM2LDE2LDAsMiwxNjIsCisJMTcsMCwyLDE0NiwxODQsMCwxNjMsMTQwLDAsMCwwLDAsCisJMTUsNTIsMTkyLDgsMiwwLDY2LDUyLDY1LDAsMiwzNiwKKwkxNiwwLDIsMTYyLDE3LDAsMiwxNDYsMTg4LDAsMTYzLDE0MCwKKwkyLDAsNjYsNTIsNDAsMCwzLDE3NCw0MCw1MiwxOTIsOCwKKwkxNywwLDIsMTYyLDY2LDAsMiwzNiwxNiwwLDIsMTYyLAorCTE3MiwwLDE2MiwxNDAsMTc2LDAsMTY0LDE0MCwxNywwLDMsMTQ2LAorCTM1LDE2LDY4LDAsMiwwLDk5LDUyLDQwLDAsMiwxNzQsCisJNDAsNTIsMTkyLDgsMTcsMCwzLDE2MiwxNiwwLDE2MCwxNzUsCisJMzMsMzIsMjI0LDAsMzMsNDAsMCwyLDIsMTMxLDcsNjAsCisJOTYsMjA0LDIzMSwzNiwyMjYsNzYsMTkyLDEyLDIsMCw2LDM2LAorCTQwLDUyLDE5Miw4LDAsMCwwLDAsMzMsMzIsMjI0LDAsCisJMjAwLDc2LDE5MiwxMiwzMyw0MCwwLDIsMzIsMCwxOTEsMTQzLAorCTI4LDAsMTc3LDE0MywyNCwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTQwLDAsMTg5LDM5LDIyNCwyNTUsMTg5LDM5LDE2LDAsMTc2LDE3NSwKKwkzMywxMjgsMjI0LDAsMjAsMCwxNzcsMTc1LDQ4LDAsMTc3LDE0MywKKwkxLDAsMiwzNiwxMCwwLDE2MiwyMCwyNCwwLDE5MSwxNzUsCisJMCwwLDE5OCwxNDAsMCwwLDAsMCw2LDAsMTkyLDE2LAorCTAsMCwwLDAsMzIsMTMzLDEzMCwxNDMsMCwwLDAsMCwKKwk0MywxNiw3MCwwLDUsMCw2NCwxNiw3LDAsMiwzNiwKKwkzMywzMiwwLDIsMzMsNDAsMzIsMiw3MCw1MiwxOTIsOCwKKwkxMSwwLDIsMzYsNywwLDEzMCwxNiwzMywzMiwwLDIsCisJMzMsNDAsMzIsMiwxNywwLDIsMzYsNDgsNzIsMTkyLDEyLAorCTk2LDAsMiwxNzQsMSwwLDY2LDM2LDEwMCwwLDIsMTc0LAorCTE3LDAsMzQsMTQ2LDAsMCwwLDAsMSwwLDY2LDUyLAorCTE3LDAsMzQsMTYyLDI0LDAsMTkxLDE0MywyMCwwLDE3NywxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywzMiwwLDE4OSwzOSwKKwkyMDgsMjU1LDE4OSwzOSwzMiwwLDE3NiwxNzUsNjQsMCwxNzYsMTQzLAorCTM2LDAsMTc3LDE3NSwzMywxMzYsMjI0LDAsNCwwLDE2MCwyMCwKKwk0MCwwLDE5MSwxNzUsMSwwLDIsMzYsMTA2LDUyLDE5Miw4LAorCTI0LDAsMTYyLDE3NSwwLDAsMTk4LDE0MCwzMiwxMzMsMTMwLDE0MywKKwkwLDAsMCwwLDQzLDE2LDE5NCwwLDMsMCw2NCwxNiwKKwkxLDAsMTk0LDM2LDEwNiw1MiwxOTIsOCwyNCwwLDE2MiwxNzUsCisJMTcsMCwyLDE0NiwwLDAsMCwwLDE4LDAsNjYsNTIsCisJMTE2LDUyLDE5Miw4LDE3LDAsMiwxNjIsMTYsMCwxNzYsMTc1LAorCTEsMCw1LDM2LDI0LDAsMTY2LDM5LDk3LDUxLDE5MiwxMiwKKwkzMyw1NiwzMiwyLDMzLDMyLDMyLDIsMzMsNDAsMCwyLAorCTEsMCw2LDM2LDI1Myw3NiwxOTIsMTIsMjQsMCwxNjcsMzksCisJNDAsMCwxOTEsMTQzLDM2LDAsMTc3LDE0MywzMiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDQ4LDAsMTg5LDM5LDE2LDAsMTYzLDE0MywKKwkxLDAsMiwzNiwxMywwLDE2MiwyMCwxNCwwLDIsMzYsCisJMCwwLDE5OCwxNDAsMCwwLDAsMCw5LDAsMTkyLDE2LAorCTAsMCwwLDAsMzIsMTMzLDEzMCwxNDMsMCwwLDAsMCwKKwk0MywxNiw3MCwwLDQsMCw2NCwyMCwxNCwwLDIsMzYsCisJNywwLDIsMzYsMiwwLDEzMCwxNiwxNCwwLDIsMzYsCisJOTYsMCwyMjYsMTcyLDE3LDAsOTgsMTQ0LDAsMCwwLDAsCisJMiwwLDY2LDUyLDgsMCwyMjQsMywxNywwLDk4LDE2MCwKKwkxNiwwLDE2MiwxNDMsMCwwLDAsMCw4LDAsMjI0LDMsCisJMCwwLDIyNiwxNzIsMCwwLDIyNiwxNDAsOCwwLDIyNCwzLAorCTAsMCwwLDAsMjMyLDI1NSwxODksMzksNDAsMCwxNjgsMTQzLAorCTEsMCwyLDM2LDYxLDAsMTYyLDIwLDE2LDAsMTkxLDE3NSwKKwkwLDAsMTk3LDE0MCwwLDAsMCwwLDU3LDAsMTYwLDE2LAorCTAsMCwwLDAsMzIsMTMzLDEzMCwxNDMsMCwwLDAsMCwKKwk0MywxNiw2OSwwLDUyLDAsNjQsMjAsMjU1LDI1NSwxMzIsMzYsCisJNSwwLDEzMCw0NCw0OSwwLDY0LDE2LDEyOCwxNiw0LDAsCisJMiwxMzEsMSw2MCwzMyw4LDM0LDAsMjMyLDE0OCwzNCwxNDAsCisJMCwwLDAsMCw4LDAsNjQsMCwwLDAsMCwwLAorCTY0LDAsMiwzNiwxNiwwLDIsMTYxLDAsMTYzLDUsNjAsCisJMjIwLDUsMTY1LDUyLDMsMCwxNjIsMTM2LDAsMCwxNjIsMTUyLAorCTAsMCwwLDAsNDMsMCwyLDE2OSw0MCwwLDIsMTg1LAorCTE3LDAsMiwxNDUsMCwwLDAsMCwyMTMsNTIsMTkyLDgsCisJMiwwLDY2LDUyLDIsMCwyLDM2LDE2LDAsMiwxNjEsCisJMTcsMCwyLDE0NSwwLDAsMTk1LDE0MCwwLDAsMCwwLAorCTE5OCw1MiwxOTIsOCwyLDAsNjYsNTIsNjQsMCwyLDM2LAorCTE2LDAsMiwxNjEsMTcsMCwyLDE0NSwxMjgsMTMyLDEzMSwxNDMsCisJMiwwLDY2LDUyLDQwLDAsMywxNzMsMjE4LDUyLDE5Miw4LAorCTE3LDAsMiwxNjEsMiwwLDIsMzYsMTYsMCwyLDE2MSwKKwkxNywwLDIsMTQ1LDAsMCwwLDAsMjExLDUyLDE5Miw4LAorCTEsMCwzLDM2LDIsMCwyLDM2LDE2LDAsMiwxNjEsCisJMTcsMCwyLDE0NSwyMjAsNSwzLDM2LDQwLDAsMywxNzMsCisJMiwwLDY2LDUyLDIxOCw1MiwxOTIsOCwxNywwLDIsMTYxLAorCTMzLDMyLDIyNCwwLDIwMCw3NiwxOTIsMTIsMzMsNDAsMCwxLAorCTE2LDAsMTkxLDE0MywyNCwwLDE4OSwzOSw4LDAsMjI0LDMsCisJMCwwLDAsMCwyMDgsMjU1LDE4OSwzOSwzMiwwLDE3NiwxNzUsCisJNjQsMCwxNzYsMTQzLDM2LDAsMTc3LDE3NSwzMywxMzYsMjI0LDAsCisJNCwwLDE2MCwyMCw0MCwwLDE5MSwxNzUsMSwwLDIsMzYsCisJMjQ1LDUyLDE5Miw4LDI0LDAsMTYyLDE3NSwwLDAsMTk4LDE0MCwKKwkzMiwxMzMsMTMwLDE0MywwLDAsMCwwLDQzLDE2LDE5NCwwLAorCTMsMCw2NCwxNiwxLDAsMTk0LDM2LDI0NSw1MiwxOTIsOCwKKwkyNCwwLDE2MiwxNzUsMTcsMCwyLDE0NiwwLDAsMCwwLAorCTE4LDAsNjYsNTIsMjU1LDUyLDE5Miw4LDE3LDAsMiwxNjIsCisJMTYsMCwxNzYsMTc1LDEsMCw1LDM2LDI0LDAsMTY2LDM5LAorCTE1MCw1MiwxOTIsMTIsMzMsNTYsMzIsMiwzMywzMiwzMiwyLAorCTMzLDQwLDAsMiwxLDAsNiwzNiwyNTMsNzYsMTkyLDEyLAorCTI0LDAsMTY3LDM5LDQwLDAsMTkxLDE0MywzNiwwLDE3NywxNDMsCisJMzIsMCwxNzYsMTQzLDgsMCwyMjQsMyw0OCwwLDE4OSwzOSwKKwkyMzIsMjU1LDE4OSwzOSw0MCwwLDE2NSwxNDMsMTYsMCwxOTEsMTc1LAorCTIwMCw3NiwxOTIsMTIsMzMsMzIsMjI0LDAsMTYsMCwxOTEsMTQzLAorCTI0LDAsMTg5LDM5LDgsMCwyMjQsMywwLDAsMCwwLAorCTE2LDAsMTYzLDE0MywxNCwwLDIsMzYsOTYsMCwyMjYsMTcyLAorCTE3LDAsOTgsMTQ0LDAsMCwwLDAsMiwwLDY2LDUyLAorCTgsMCwyMjQsMywxNywwLDk4LDE2MCwyMjQsMjU1LDE4OSwzOSwKKwkxNiwwLDE3NiwxNzUsMzMsMTI4LDIyNCwwLDE3LDAsMiwzNiwKKwkyNCwwLDE5MSwxNzUsMjAsMCwxNzcsMTc1LDk2LDAsMiwxNzQsCisJNDgsMCwxNzcsMTQzLDMzLDMyLDAsMiw0OCw3MiwxOTIsMTIsCisJMzMsNDAsMzIsMiwxLDAsNjYsMzYsMTAwLDAsMiwxNzQsCisJMTcsMCwzNCwxNDYsMCwwLDAsMCwxLDAsNjYsNTIsCisJMTcsMCwzNCwxNjIsMjQsMCwxOTEsMTQzLDIwLDAsMTc3LDE0MywKKwkxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLDMyLDAsMTg5LDM5LAorCTE2LDAsMTYzLDE0MywwLDAsMCwwLDE3LDAsOTgsMTQ0LAorCTAsMCwwLDAsMTgsMCw2Niw1Miw4LDAsMjI0LDMsCisJMTcsMCw5OCwxNjAsOCwwLDIyNCwzLDMzLDE2LDIyNCwwLAorCTIyNCwyNTUsMTg5LDM5LDQ4LDAsMTY4LDE0MywxLDAsMiwzNiwKKwkxMTQsMCwxNjIsMjAsMjQsMCwxOTEsMTc1LDAsMCwxOTUsMTQwLAorCTAsMCwwLDAsMTEwLDAsOTYsMTYsMCwwLDAsMCwKKwkzMiwxMzMsMTMwLDE0MywwLDAsMCwwLDQzLDE2LDY3LDAsCisJMTA1LDAsNjQsMjAsMjU1LDI1NSw5OCwzNiw2NCwxOCwyLDAsCisJMiwxMzEsMyw2MCwxOTIsMjQ2LDk5LDM2LDMzLDI0LDY3LDAsCisJMjU1LDI1NSwxMzIsMzYsMTcsMCwxMzAsNDQsOTcsMCw2NCwxNiwKKwkxMjgsMTYsNCwwLDIsMTMxLDEsNjAsMzMsOCwzNCwwLAorCTAsMTQ5LDM0LDE0MCwwLDAsMCwwLDgsMCw2NCwwLAorCTAsMCwwLDAsMiwwLDIsMzYsMTYsMCwyLDE2MSwKKwkxNywwLDIsMTQ1LDAsMCwxOTUsMTQwLDAsMCwwLDAsCisJMTQwLDUzLDE5Miw4LDIsMCw2Niw1MiwyLDAsMiwzNiwKKwkxNiwwLDIsMTYxLDQ0LDAsOTksMTQwLDE3LDAsMiwxNDUsCisJMTYsMCw5OSwxNDAsMCwwLDAsMCwxMDEsNTMsMTkyLDgsCisJMiwwLDY2LDUyLDIsMCwyLDM2LDE2LDAsMiwxNjEsCisJNDQsMCw5OSwxNDAsMTcsMCwyLDE0NSwxMiwwLDk5LDE0MCwKKwkyLDAsNjYsNTIsMTcsMCwyLDE2MSwxNzMsNTMsMTkyLDgsCisJNDAsMCwzLDE3MywyLDAsMiwzNiwxNiwwLDIsMTYxLAorCTE3LDAsMiwxNDUsMjEyLDAsOTksMTQwLDAsMCwwLDAsCisJMTQwLDUzLDE5Miw4LDIsMCw2Niw1MiwyLDAsMiwzNiwKKwkxNiwwLDIsMTYxLDE3LDAsMiwxNDUsMTkyLDAsOTksMTQwLAorCTAsMCwwLDAsMTQwLDUzLDE5Miw4LDIsMCw2Niw1MiwKKwkyLDAsMiwzNiwxNiwwLDIsMTYxLDE3LDAsMiwxNDUsCisJMjA4LDAsOTksMTQwLDAsMCwwLDAsMTQwLDUzLDE5Miw4LAorCTIsMCw2Niw1MiwyLDAsMiwzNiwxNiwwLDIsMTYxLAorCTIwNCwwLDk4LDE0MCwxODQsMCwxMDAsMTQwLDE3LDAsMywxNDUsCisJMzMsMTYsNjgsMCwyLDAsOTksNTIsNDAsMCwyLDE3MywKKwkxNzMsNTMsMTkyLDgsMTcsMCwzLDE2MSwyLDAsMiwzNiwKKwkxNiwwLDIsMTYxLDE3LDAsMiwxNDUsMTk2LDAsOTksMTQwLAorCTIsMCw2Niw1Miw0MCwwLDMsMTczLDE3Myw1MywxOTIsOCwKKwkxNywwLDIsMTYxLDE3LDAsMywxNDUsMiwwLDIsMzYsCisJMTYsMCwyLDE2MSw0MCwwLDAsMTczLDIsMCw5OSw1MiwKKwkxNzMsNTMsMTkyLDgsMTcsMCwzLDE2MSwyLDAsMiwzNiwKKwkxNiwwLDIsMTYxLDQ0LDAsMTAwLDE0MCwxNywwLDIsMTQ1LAorCTIwLDAsMTMxLDE0MCwyNCwwLDEzMiwxNDAsMiwwLDY2LDUyLAorCTE3LDAsMiwxNjEsMzMsMjQsMTAwLDAsMTczLDUzLDE5Miw4LAorCTQwLDAsMywxNzMsMTYsMCwxNjAsMTc1LDMzLDMyLDIyNCwwLAorCTMzLDQwLDAsMSwyLDEzMSw3LDYwLDEwNCwyMDQsMjMxLDM2LAorCTIyNiw3NiwxOTIsMTIsMTEsMCw2LDM2LDE3Myw1MywxOTIsOCwKKwkwLDAsMCwwLDMzLDMyLDIyNCwwLDIwMCw3NiwxOTIsMTIsCisJMzMsNDAsMCwxLDI0LDAsMTkxLDE0MywzMiwwLDE4OSwzOSwKKwk4LDAsMjI0LDMsMCwwLDAsMCwyMDgsMjU1LDE4OSwzOSwKKwkzMiwwLDE3NiwxNzUsNjQsMCwxNzYsMTQzLDM2LDAsMTc3LDE3NSwKKwkzMywxMzYsMjI0LDAsNCwwLDE2MCwyMCw0MCwwLDE5MSwxNzUsCisJMSwwLDIsMzYsMjAwLDUzLDE5Miw4LDI0LDAsMTYyLDE3NSwKKwkwLDAsMTk4LDE0MCwzMiwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTQzLDE2LDE5NCwwLDMsMCw2NCwxNiwxLDAsMTk0LDM2LAorCTIwMCw1MywxOTIsOCwyNCwwLDE2MiwxNzUsMTcsMCwyLDE0NiwKKwkwLDAsMCwwLDE4LDAsNjYsNTIsMjEwLDUzLDE5Miw4LAorCTE3LDAsMiwxNjIsMTYsMCwxNzYsMTc1LDEsMCw1LDM2LAorCTI0LDAsMTY2LDM5LDUyLDUzLDE5MiwxMiwzMyw1NiwzMiwyLAorCTMzLDMyLDMyLDIsMzMsNDAsMCwyLDEsMCw2LDM2LAorCTI1Myw3NiwxOTIsMTIsMjQsMCwxNjcsMzksNDAsMCwxOTEsMTQzLAorCTM2LDAsMTc3LDE0MywzMiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTQ4LDAsMTg5LDM5LDAsMCwyMjYsMTQwLDgsMCwyMjQsMywKKwkwLDAsMCwwLDMsMTMxLDIsNjAsMjgsMTgsNjYsMTQ4LAorCTAsMCwwLDAsMiwwLDY2LDQ4LDIsMCw2NCwxNiwKKwkyLDAsMywzNiwxLDAsMywzNiw4LDAsMjI0LDMsCisJMzMsMTYsOTYsMCwyMzIsMjU1LDE4OSwzOSw0MCwwLDE2NCwxNDMsCisJMTYsMCwxOTEsMTc1LDEsMCwxMzIsNTYsMTg2LDU5LDE5MiwxMiwKKwkxLDAsMTMyLDQ0LDE2LDAsMTkxLDE0MywyNCwwLDE4OSwzOSwKKwk4LDAsMjI0LDMsMCwwLDAsMCwxNiwwLDE2MywxNDMsCisJNiwwLDIsMzYsMCwwLDk4LDE3Miw4LDAsMjI0LDMsCisJMzMsMTYsMjI0LDAsMjI0LDI1NSwxODksMzksNDgsMCwxNjgsMTQzLAorCTEsMCwyLDM2LDUyLDAsMTYyLDIwLDI0LDAsMTkxLDE3NSwKKwkwLDAsMTk3LDE0MCwwLDAsMCwwLDQ4LDAsMTYwLDE2LAorCTAsMCwwLDAsMjQsMTMzLDEzMCwxNDMsMCwwLDAsMCwKKwk0MywxNiw2OSwwLDQzLDAsNjQsMjAsMjU1LDI1NSwxMzIsMzYsCisJNSwwLDEzMCw0NCw0MCwwLDY0LDE2LDEyOCwxNiw0LDAsCisJMiwxMzEsMSw2MCwzMyw4LDM0LDAsNzIsMTQ5LDM0LDE0MCwKKwkwLDAsMCwwLDgsMCw2NCwwLDAsMCwwLDAsCisJMiwwLDIsMzYsMTYsMCwyLDE2MSwxNywwLDIsMTQ1LAorCTAsMCwxOTUsMTQwLDIsMCw2Niw1Miw0MCwwLDMsMTczLAorCTQ1LDU0LDE5Miw4LDE3LDAsMiwxNjEsMiwwLDIsMzYsCisJMTYsMCwyLDE2MSwwLDAsMTk0LDE0MCwxNywwLDMsMTQ1LAorCTEsMCw2NiwzNiwyLDAsOTksNTIsNDAsMCwyLDE3MywKKwk0NSw1NCwxOTIsOCwxNywwLDMsMTYxLDE2LDAsMTYwLDE3NSwKKwkzMywzMiwyMjQsMCwzMyw0MCwwLDEsMiwxMzEsNyw2MCwKKwkxNDgsMjA0LDIzMSwzNiwyMjYsNzYsMTkyLDEyLDIsMCw2LDM2LAorCTQ1LDU0LDE5Miw4LDAsMCwwLDAsMTcsMCwzLDE0NSwKKwkyLDAsMiwzNiwxNiwwLDIsMTYxLDQwLDAsMCwxNzMsCisJMiwwLDk5LDUyLDQ1LDU0LDE5Miw4LDE3LDAsMywxNjEsCisJMzMsMzIsMjI0LDAsMjAwLDc2LDE5MiwxMiwzMyw0MCwwLDEsCisJMjQsMCwxOTEsMTQzLDMyLDAsMTg5LDM5LDgsMCwyMjQsMywKKwkwLDAsMCwwLDIwOCwyNTUsMTg5LDM5LDMyLDAsMTc2LDE3NSwKKwk2NCwwLDE3NiwxNDMsMzYsMCwxNzcsMTc1LDMzLDEzNiwyMjQsMCwKKwk0LDAsMTYwLDIwLDQwLDAsMTkxLDE3NSwxLDAsMiwzNiwKKwk3Miw1NCwxOTIsOCwyNCwwLDE2MiwxNzUsMCwwLDE5OCwxNDAsCisJMjQsMTMzLDEzMCwxNDMsMCwwLDAsMCw0MywxNiwxOTQsMCwKKwkzLDAsNjQsMTYsMSwwLDE5NCwzNiw3Miw1NCwxOTIsOCwKKwkyNCwwLDE2MiwxNzUsMTcsMCwyLDE0NiwwLDAsMCwwLAorCTE4LDAsNjYsNTIsODIsNTQsMTkyLDgsMTcsMCwyLDE2MiwKKwkxNiwwLDE3NiwxNzUsMSwwLDUsMzYsMjQsMCwxNjYsMzksCisJMjQyLDUzLDE5MiwxMiwzMyw1NiwzMiwyLDMzLDMyLDMyLDIsCisJMzMsNDAsMCwyLDEsMCw2LDM2LDI1Myw3NiwxOTIsMTIsCisJMjQsMCwxNjcsMzksNDAsMCwxOTEsMTQzLDM2LDAsMTc3LDE0MywKKwkzMiwwLDE3NiwxNDMsOCwwLDIyNCwzLDQ4LDAsMTg5LDM5LAorCTAsMCwyMjYsMTQ4LDgsMCwyMjQsMywwLDAsMCwwLAorCTgsMCwyMjQsMywzMywxNiwyMjQsMCwxNiwwLDE2MywxNDMsCisJOCwwLDIsMzYsMCwwLDk4LDE3Miw4LDAsMjI0LDMsCisJMzMsMTYsMjI0LDAsMjI0LDI1NSwxODksMzksMTYsMCwxNzYsMTc1LAorCTQ4LDAsMTc2LDE0MywxLDAsMiwzNiwyNCwwLDE5MSwxNzUsCisJMTI2LDAsMTYyLDIwLDIwLDAsMTc3LDE3NSwwLDAsMTk4LDE0MCwKKwkwLDAsMCwwLDEyMiwwLDE5MiwxNiwwLDAsMCwwLAorCTI0LDEzMywxMzAsMTQzLDAsMCwwLDAsNDMsMTYsNzAsMCwKKwkxMTcsMCw2NCwyMCwxOTIsMTcsNiwwLDMsMTMxLDMsNjAsCisJMTYsMTMsOTksMzYsMzMsMTM2LDY3LDAsMjU1LDI1NSwxMzIsMzYsCisJMTAsMCwxMzAsNDQsMTEwLDAsNjQsMTYsMTI4LDE2LDQsMCwKKwkyLDEzMSwxLDYwLDMzLDgsMzQsMCw5NiwxNDksMzQsMTQwLAorCTAsMCwwLDAsOCwwLDY0LDAsMCwwLDAsMCwKKwkxNywwLDMsMTQ2LDIsMCwyLDM2LDE2LDAsMiwxNjIsCisJMjExLDU0LDE5Miw4LDQwLDAsNiwxNzQsMiwwLDIsMzYsCisJMTYsMCwyLDE2MiwwLDAsMzQsMTUwLDE3LDAsMywxNDYsCisJMCwwLDAsMCwxNDMsNTQsMTkyLDgsMiwxOCwyLDAsCisJMiwwLDIsMzYsMTYsMCwyLDE2Miw0LDAsMzQsMTQyLAorCTE3LDAsMywxNDYsMSwwLDY2LDM2LDIsMCw5OSw1MiwKKwk0MCwwLDIsMTc0LDIzMiw1NCwxOTIsOCwxNywwLDMsMTYyLAorCTIsMCwyLDM2LDE2LDAsMiwxNjIsNCwwLDM0LDE0MiwKKwkwLDAsMCwwLDIsMCw2NCwxNiwyLDAsMywzNiwKKwkxLDAsMywzNiwxNywwLDIsMTQ2LDQwLDAsMywxNzQsCisJMiwwLDY2LDUyLDIzMiw1NCwxOTIsOCwxNywwLDIsMTYyLAorCTIsMCwyLDM2LDE2LDAsMiwxNjIsMTcsMCwyLDE0NiwKKwk4LDAsMzUsMTQyLDAsMCwwLDAsMjI2LDU0LDE5Miw4LAorCTIsMCw2Niw1Miw5LDUwLDE5MiwxMiw4LDAsNCwzNiwKKwkzMyw0OCw2NCwwLDE1LDAsMzQsMTM4LDEyLDAsMzQsMTU0LAorCTE5LDAsMzUsMTM4LDE2LDAsMzUsMTU0LDMsMCwxOTQsMTY4LAorCTAsMCwxOTQsMTg0LDcsMCwxOTUsMTY4LDE5Niw1NCwxOTIsOCwKKwk0LDAsMTk1LDE4NCwyLDAsMiwzNiwxNiwwLDIsMTYyLAorCTE3LDAsMiwxNDYsMjAsMCwzNSwxNDIsMCwwLDAsMCwKKwkyMjYsNTQsMTkyLDgsMiwwLDY2LDUyLDksNTAsMTkyLDEyLAorCTgsMCw0LDM2LDMzLDQ4LDY0LDAsMjcsMCwzNCwxMzgsCisJMjQsMCwzNCwxNTQsMzEsMCwzNSwxMzgsMjgsMCwzNSwxNTQsCisJMywwLDE5NCwxNjgsMCwwLDE5NCwxODQsNywwLDE5NSwxNjgsCisJNCwwLDE5NSwxODQsMCwwLDE5NCwxNDgsMCwwLDAsMCwKKwkwLDI2LDIsMCwyLDE4LDIsMCwzNywyNCw5OCwwLAorCTAsMCwxOTUsMTY0LDE3LDAsMywxNDYsNCwwLDIsMzYsCisJMTYsMCwyLDE2MiwxLDAsMiwzNiw0MCwwLDIsMTY2LAorCTgsMCwxOTQsMzYsNDQsMCw2LDE3NCw0OCwwLDIsMTc0LAorCTUyLDAsMCwxNjYsMiwwLDk5LDUyLDIzMiw1NCwxOTIsOCwKKwkxNywwLDMsMTYyLDIsMCwyLDM2LDE2LDAsMiwxNjIsCisJMTcsMCwyLDE0NiwzMiwwLDM1LDE1MCwwLDAsMCwwLAorCTIyNiw1NCwxOTIsOCwyLDAsNjYsNTIsMiwwLDIsMzYsCisJMTYsMCwyLDE2MiwxNywwLDIsMTQ2LDEwNCwwLDM1LDE0MiwKKwkyLDAsNjYsNTIsNDAsMCwzLDE3NCwyMzIsNTQsMTkyLDgsCisJMTcsMCwyLDE2MiwzMywzMiwyMjQsMCwyMDAsNzYsMTkyLDEyLAorCTMzLDQwLDAsMiwyNCwwLDE5MSwxNDMsMjAsMCwxNzcsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMzIsMCwxODksMzksCisJMjI0LDI1NSwxODksMzksMTYsMCwxNzYsMTc1LDMzLDEyOCwyMjQsMCwKKwkyMCwwLDE3NywxNzUsNDgsMCwxNzcsMTQzLDEsMCwyLDM2LAorCTEwLDAsMTYyLDIwLDI0LDAsMTkxLDE3NSwwLDAsMTk4LDE0MCwKKwkwLDAsMCwwLDYsMCwxOTIsMTYsMCwwLDAsMCwKKwkyNCwxMzMsMTMwLDE0MywwLDAsMCwwLDQzLDE2LDcwLDAsCisJNSwwLDY0LDE2LDIsMCwyLDM2LDMzLDMyLDAsMiwKKwkzMyw0MCwzMiwyLDEzLDU1LDE5Miw4LDExLDAsMiwzNiwKKwkxNCwwLDEzMCwxNiwyLDAsMTMwLDQ0LDUsMCw2NCwyMCwKKwk2LDAsMTMwLDQ0LDMsMCw2NCwxNiw0LDAsMTMwLDQ0LAorCTgsMCw2NCwxNiwwLDAsMCwwLDMzLDMyLDAsMiwKKwkzMyw0MCwzMiwyLDE3LDAsMiwzNiw0OCw3MiwxOTIsMTIsCisJOTYsMCwyLDE3NCwxLDAsNjYsMzYsMTAwLDAsMiwxNzQsCisJMTcsMCwzNCwxNDYsMCwwLDAsMCwxLDAsNjYsNTIsCisJMTcsMCwzNCwxNjIsMjQsMCwxOTEsMTQzLDIwLDAsMTc3LDE0MywKKwkxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLDMyLDAsMTg5LDM5LAorCTIwOCwyNTUsMTg5LDM5LDMyLDAsMTc2LDE3NSw2NCwwLDE3NiwxNDMsCisJMzYsMCwxNzcsMTc1LDMzLDEzNiwyMjQsMCw0LDAsMTYwLDIwLAorCTQwLDAsMTkxLDE3NSwxLDAsMiwzNiw0OSw1NSwxOTIsOCwKKwkyNCwwLDE2MiwxNzUsMCwwLDE5OCwxNDAsMjQsMTMzLDEzMCwxNDMsCisJMCwwLDAsMCw0MywxNiwxOTQsMCwzLDAsNjQsMTYsCisJMSwwLDE5NCwzNiw0OSw1NSwxOTIsOCwyNCwwLDE2MiwxNzUsCisJMTcsMCwyLDE0NiwwLDAsMCwwLDE4LDAsNjYsNTIsCisJNTksNTUsMTkyLDgsMTcsMCwyLDE2MiwxNiwwLDE3NiwxNzUsCisJMSwwLDUsMzYsMjQsMCwxNjYsMzksOTcsNTQsMTkyLDEyLAorCTMzLDU2LDMyLDIsMzMsMzIsMzIsMiwzMyw0MCwwLDIsCisJMSwwLDYsMzYsMjUzLDc2LDE5MiwxMiwyNCwwLDE2NywzOSwKKwk0MCwwLDE5MSwxNDMsMzYsMCwxNzcsMTQzLDMyLDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNDgsMCwxODksMzksMjMyLDI1NSwxODksMzksCisJMzMsNjQsMTI4LDAsMTYsMCwxNzYsMTc1LDQwLDAsMTc2LDE0MywKKwkxLDAsMiwzNiw1NywwLDE2MiwyMCwyMCwwLDE5MSwxNzUsCisJMCwwLDE5NiwxNDAsMCwwLDAsMCw1NCwwLDEyOCwxNiwKKwkxNCwwLDIsMzYsMjQsMTMzLDEzMCwxNDMsMCwwLDAsMCwKKwk0MywxNiw2OCwwLDQ5LDAsNjQsMjAsMTQsMCwyLDM2LAorCTE5MiwxNyw0LDAsMywxMzEsMyw2MCwxNiwxMyw5OSwzNiwKKwkzMyw0OCw2NywwLDQsMCwyLDM2LDIxLDAsMiwxNywKKwk1LDAsMiw0NSw1LDAsNjQsMTYsMiwwLDIsMzYsCisJOCwwLDIsMTcsMTQsMCwyLDM2LDEyOSw1NSwxOTIsOCwKKwk5NiwwLDIyNiwxNzIsNSwwLDIsMzYsMjgsMCwyLDE3LAorCTE0LDAsMiwzNiwxMjksNTUsMTkyLDgsOTYsMCwyMjYsMTcyLAorCTAsMCwxOTUsMTQ0LDAsMCwwLDAsMCwwLDE5NSwxNjQsCisJNDAsMCwyLDE0MiwwLDAsMCwwLDAsMTgsMiwwLAorCTM3LDI0LDk4LDAsMTI5LDU1LDE5Miw4LDAsMCwxOTUsMTY0LAorCTQwLDAsMywxNDIsMCwwLDAsMCw1LDAsMTAxLDE2LAorCTIsMCwyLDM2LDcsMCw5OCwxNiwxNCwwLDIsMzYsCisJMTI5LDU1LDE5Miw4LDk2LDAsMjI2LDE3MiwxODcsNDIsMTkyLDEyLAorCTEsMCw1LDM2LDEyOSw1NSwxOTIsOCwwLDAsMCwwLAorCTE4Nyw0MiwxOTIsMTIsMzMsNDAsMCwwLDEyOSw1NSwxOTIsOCwKKwkwLDAsMCwwLDQwLDAsMiwxNDIsMCwwLDAsMCwKKwkxMjksNTUsMTkyLDgsOCwwLDE5NCwxNzIsMTQsMCwyLDM2LAorCTk2LDAsMjI2LDE3MiwxNywwLDIsMTQ2LDAsMCwwLDAsCisJMiwwLDY2LDUyLDE3LDAsMiwxNjIsMjAsMCwxOTEsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMjQsMCwxODksMzksCisJMjE2LDI1NSwxODksMzksMjAsMCwxNzcsMTc1LDMzLDEzNiwxMjgsMCwKKwkyOCwwLDE3OSwxNzUsMzMsMTUyLDE2MCwwLDI0LDAsMTc4LDE3NSwKKwkzMywxNDQsMjI0LDAsMTYsMCwxNzYsMTc1LDU2LDAsMTc2LDE0MywKKwkxLDAsMiwzNiw0NiwwLDk4LDIyLDMyLDAsMTkxLDE3NSwKKwkwLDAsMTk2LDE0MCwwLDAsMCwwLDQyLDAsMTI4LDE2LAorCTAsMCwwLDAsNTgsMjUsMTkyLDEyLDAsMCwwLDAsCisJMzMsMzIsNjQsMCwzNywwLDEyOCwxNiwyLDAsMiwzNiwKKwkxMSwwLDM0LDE4LDMsMCwzNCw0Niw1LDAsNjQsMTYsCisJMywwLDIsMzYsMTUsMCw1MSwxOCw0LDAsMiwzNiwKKwkxOTUsNTUsMTkyLDgsMzMsMzIsNjQsMiwyMCwwLDM0LDE4LAorCTMzLDMyLDY0LDIsMTk1LDU1LDE5Miw4LDAsMCwwLDAsCisJMiwwLDIsMzYsMTYsMCwyLDE2MiwxNywwLDIsMTQ2LAorCTEwLDAsMTMxLDEzMiwyLDAsNjYsNTIsNDAsMCwzLDE3NCwKKwkxOTcsNTUsMTkyLDgsMTcsMCwyLDE2MiwxNywwLDMsMTQ2LAorCTE2LDAsMiwxNjIsNCwwLDEzMCwzNiw0NCwwLDIsMTc0LAorCTEwLDAsMTMwLDM2LDQwLDAsMCwxNjYsNDgsMCwyLDE3NCwKKwkxOTEsNTUsMTkyLDgsNTIsMCwwLDE2NiwxNywwLDMsMTQ2LAorCTIsMCwyLDM2LDE2LDAsMiwxNjIsNDAsMCwxNywxNzQsCisJMiwwLDk5LDUyLDE5Nyw1NSwxOTIsOCwxNywwLDMsMTYyLAorCTMzLDMyLDY0LDIsMjAwLDc2LDE5MiwxMiwzMyw0MCwwLDIsCisJMzIsMCwxOTEsMTQzLDI4LDAsMTc5LDE0MywyNCwwLDE3OCwxNDMsCisJMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNDAsMCwxODksMzksMjA4LDI1NSwxODksMzksMzIsMCwxNzYsMTc1LAorCTY0LDAsMTc2LDE0Myw0MCwwLDE3OCwxNzUsMzMsMTQ0LDEyOCwwLAorCTM2LDAsMTc3LDE3NSwzMywxMzYsMjI0LDAsMywwLDE2MCwyMCwKKwk0NCwwLDE5MSwxNzUsMjE4LDU1LDE5Miw4LDEsMCwyLDM2LAorCTAsMCwxOTQsMTQwLDAsMCwwLDAsMSwwLDY2LDM2LAorCTI0LDAsMTYyLDE3NSwyNCwwLDE2NCwxNDMsNTgsMjUsMTkyLDEyLAorCTAsMCwwLDAsNiwwLDY0LDIwLDMzLDMyLDY0LDIsCisJMTcsMCwyLDE0NiwwLDAsMCwwLDE4LDAsNjYsNTIsCisJMjM5LDU1LDE5Miw4LDE3LDAsMiwxNjIsMTYsMCwxNzYsMTc1LAorCTEsMCw1LDM2LDI0LDAsMTY2LDM5LDEzNyw1NSwxOTIsMTIsCisJMzMsNTYsMzIsMiwzMywzMiwzMiwyLDMzLDQwLDAsMiwKKwkxLDAsNiwzNiwyNTMsNzYsMTkyLDEyLDI0LDAsMTY3LDM5LAorCTQ0LDAsMTkxLDE0Myw0MCwwLDE3OCwxNDMsMzYsMCwxNzcsMTQzLAorCTMyLDAsMTc2LDE0Myw4LDAsMjI0LDMsNDgsMCwxODksMzksCisJMjMyLDI1NSwxODksMzksNDAsMCwxNjgsMTQzLDEsMCwyLDM2LAorCTYzLDAsMTYyLDIwLDE2LDAsMTkxLDE3NSwwLDAsMTk1LDE0MCwKKwkwLDAsMCwwLDU5LDAsOTYsMTYsMCwwLDAsMCwKKwkyNCwxMzMsMTMwLDE0MywwLDAsMCwwLDQzLDE2LDY3LDAsCisJNTQsMCw2NCwyMCw2NCwxOCwzLDAsMiwxMzEsMyw2MCwKKwkxOTIsMjQ2LDk5LDM2LDMzLDI0LDY3LDAsMjU1LDI1NSwxMzIsMzYsCisJNSwwLDEzMCw0NCw0NywwLDY0LDE2LDEyOCwxNiw0LDAsCisJMiwxMzEsMSw2MCwzMyw4LDM0LDAsMTM2LDE0OSwzNCwxNDAsCisJMCwwLDAsMCw4LDAsNjQsMCwwLDAsMCwwLAorCTIsMCwyLDM2LDE2LDAsMiwxNjEsMTcsMCwyLDE0NSwKKwkwLDAsMTk1LDE0MCwwLDAsMCwwLDQzLDU2LDE5Miw4LAorCTIsMCw2Niw1MiwyLDAsMiwzNiwxNiwwLDIsMTYxLAorCTE3LDAsMiwxNDUsMjIwLDUsMywzNiw0MCwwLDMsMTczLAorCTIsMCw2Niw1Miw1OSw1NiwxOTIsOCwxNywwLDIsMTYxLAorCTY1LDAsMiwzNiwxNiwwLDIsMTYxLDE3LDAsMiwxNDUsCisJMTU2LDAsOTksMTQwLDAsMCwwLDAsNDMsNTYsMTkyLDgsCisJMiwwLDY2LDUyLDY1LDAsMiwzNiwxNiwwLDIsMTYxLAorCTE3LDAsMiwxNDUsMTcyLDAsOTksMTQwLDIsMCw2Niw1MiwKKwk0MCwwLDMsMTczLDU5LDU2LDE5Miw4LDE3LDAsMiwxNjEsCisJNjUsMCwyLDM2LDE2LDAsMiwxNjEsMTU2LDAsOTgsMTQwLAorCTI1MiwwLDEwMCwxNDAsMTcsMCwzLDE0NSwzNSwxNiw2OCwwLAorCTIsMCw5OSw1Miw0MCwwLDIsMTczLDU5LDU2LDE5Miw4LAorCTE3LDAsMywxNjEsMzMsMzIsMjI0LDAsMjAwLDc2LDE5MiwxMiwKKwkzMyw0MCwwLDEsMTYsMCwxOTEsMTQzLDI0LDAsMTg5LDM5LAorCTgsMCwyMjQsMywwLDAsMCwwLDIwOCwyNTUsMTg5LDM5LAorCTMyLDAsMTc2LDE3NSw2NCwwLDE3NiwxNDMsMzYsMCwxNzcsMTc1LAorCTMzLDEzNiwyMjQsMCw0LDAsMTYwLDIwLDQwLDAsMTkxLDE3NSwKKwkxLDAsMiwzNiw4Niw1NiwxOTIsOCwyNCwwLDE2MiwxNzUsCisJMCwwLDE5OCwxNDAsMjQsMTMzLDEzMCwxNDMsMCwwLDAsMCwKKwk0MywxNiwxOTQsMCwzLDAsNjQsMTYsMSwwLDE5NCwzNiwKKwk4Niw1NiwxOTIsOCwyNCwwLDE2MiwxNzUsMTcsMCwyLDE0NiwKKwkwLDAsMCwwLDE4LDAsNjYsNTIsOTYsNTYsMTkyLDgsCisJMTcsMCwyLDE2MiwxNiwwLDE3NiwxNzUsMSwwLDUsMzYsCisJMjQsMCwxNjYsMzksMjQ1LDU1LDE5MiwxMiwzMyw1NiwzMiwyLAorCTMzLDMyLDMyLDIsMzMsNDAsMCwyLDEsMCw2LDM2LAorCTI1Myw3NiwxOTIsMTIsMjQsMCwxNjcsMzksNDAsMCwxOTEsMTQzLAorCTM2LDAsMTc3LDE0MywzMiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTQ4LDAsMTg5LDM5LDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDIwMCwyNTUsMTg5LDM5LDcyLDAsMTYzLDE0MywKKwk0NCwwLDE3NywxNzUsMzMsMTM2LDEyOCwwLDIwLDAsMTY1LDE3NSwKKwkzMyw0MCwyMjQsMCwyLDEzMSwyLDYwLDE3MiwyMTAsNjYsMTQwLAorCTE1MiwxMzIsMTM1LDE0MywzMywzMiwwLDAsNDgsMCwxOTEsMTc1LAorCTQwLDAsMTc2LDE3NSwyNCwwLDE2MCwxNzUsMjgsMCwxNjAsMTc1LAorCTM2LDAsMTYwLDE3NSwxNiwwLDE2MiwxNzUsMTA0LDc3LDE5MiwxMiwKKwkzMiwwLDE2MywxNzUsMzMsMTI4LDY0LDAsMywwLDAsMjIsCisJMzMsMzIsMCwyLDE0Myw1NiwxOTIsOCwzMywxNiwwLDAsCisJMTk3LDgwLDE5MiwxMiwzMyw0MCwzMiwyLDI1NSwyNTUsMywzNiwKKwk1LDAsNjcsMjAsMCwwLDAsMCwxNjcsODMsMTkyLDEyLAorCTMzLDMyLDAsMiwxNDMsNTYsMTkyLDgsMzMsMTYsMCwwLAorCTE2Nyw4MywxOTIsMTIsMzMsMzIsMCwyLDgsMCwzNCwxNDIsCisJNCwwLDM1LDE0MiwwLDAsMCwwLDM1LDE2LDY3LDAsCisJMjU1LDI1NSw2Niw0OCw0OCwwLDE5MSwxNDMsNDQsMCwxNzcsMTQzLAorCTQwLDAsMTc2LDE0Myw4LDAsMjI0LDMsNTYsMCwxODksMzksCisJMjAwLDI1NSwxODksMzksNDQsMCwxNzcsMTc1LDMzLDEzNiwxMjgsMCwKKwk3MiwwLDE2OCwxNDMsMzMsMzIsMCwwLDIwLDAsMTY1LDE3NSwKKwkzMyw0MCwyMjQsMCwyLDEzMSwzLDYwLDE3MiwyMTAsOTksMTQwLAorCTE1MiwxMzIsMTM1LDE0MywxLDAsMiwzNiw0OCwwLDE5MSwxNzUsCisJNDAsMCwxNzYsMTc1LDI0LDAsMTYyLDE3NSwyOCwwLDE2MCwxNzUsCisJMzYsMCwxNjAsMTc1LDE2LDAsMTYzLDE3NSwxMDQsNzcsMTkyLDEyLAorCTMyLDAsMTY4LDE3NSwzMywxMjgsNjQsMCwzLDAsMCwyMiwKKwkzMywzMiwwLDIsMTg4LDU2LDE5Miw4LDMzLDE2LDAsMCwKKwkxOTcsODAsMTkyLDEyLDMzLDQwLDMyLDIsMjU1LDI1NSwzLDM2LAorCTUsMCw2NywyMCwwLDAsMCwwLDE2Nyw4MywxOTIsMTIsCisJMzMsMzIsMCwyLDE4OCw1NiwxOTIsOCwzMywxNiwwLDAsCisJMTY3LDgzLDE5MiwxMiwzMywzMiwwLDIsOCwwLDM0LDE0MiwKKwk0LDAsMzUsMTQyLDAsMCwwLDAsMzUsMTYsNjcsMCwKKwkyNTUsMjU1LDY2LDQ4LDQ4LDAsMTkxLDE0Myw0NCwwLDE3NywxNDMsCisJNDAsMCwxNzYsMTQzLDgsMCwyMjQsMyw1NiwwLDE4OSwzOSwKKwkxNzYsMjU1LDE4OSwzOSw0NCwwLDE3NywxNzUsMTA4LDAsMTc3LDE0MywKKwk2OCwwLDE4MywxNzUsOTYsMCwxODMsMTQzLDcyLDAsMTkwLDE3NSwKKwkxMDAsMCwxOTAsMTQzLDQ4LDAsMTc4LDE3NSwzMywxNDQsMTI4LDAsCisJNTYsMCwxODAsMTc1LDMzLDE2MCwxNjAsMCw1MiwwLDE3OSwxNzUsCisJMzMsMTUyLDE5MiwwLDQwLDAsMTc2LDE3NSwzMywxMjgsMjI0LDAsCisJNjAsMCwxODEsMTc1LDEsMCwyMSwzNiw3NiwwLDE5MSwxNzUsCisJMywwLDUzLDE4LDY0LDAsMTgyLDE3NSw5LDU3LDE5Miw4LAorCTI1NSwyNTUsMiwzNiw0LDAsNiwzNiwyLDEzMSwyMiw2MCwKKwk0OCwyMDUsMjE0LDM4LDE2MCwxMzIsMTMyLDE0MywxMDQsMCwxNjUsMTQzLAorCTEyOCwzMiw0LDAsODAsNjgsMTkyLDEyLDMzLDMyLDE1MCwwLAorCTMzLDMyLDAsMCwzMyw0MCwwLDIsMTUyLDEzMiwxMzUsMTQzLAorCTIsMCwyLDM2LDI0LDAsMTYyLDE3NSwxNjAsMTMyLDEzMCwxNDMsCisJMiwxMzEsMyw2MCwxNzIsMjEwLDk5LDE0MCwzMyw0OCw5NiwyLAorCTIwLDAsMTgwLDE3NSwyOCwwLDE2MCwxNzUsMzIsMCwxODMsMTc1LAorCTM2LDAsMTgxLDE3NSwxLDAsODEsMzYsMTA0LDc3LDE5MiwxMiwKKwkxNiwwLDE2MywxNzUsMzMsMTI4LDY0LDAsMjMsMCwwLDE4LAorCTMzLDQwLDAsMCwxNiwwLDE5MCwxNzUsMzMsMzIsMCwyLAorCTMzLDQ4LDMyLDIsMTA4LDg0LDE5MiwxMiwzMyw1NiwxOTIsMiwKKwkyNTUsMjU1LDE3LDM2LDEzLDAsODEsMTYsMzMsMzIsMCwyLAorCTE5Nyw4MCwxOTIsMTIsMzMsNDAsNjQsMiw5LDAsODEsMTYsCisJMCwwLDAsMCwxNjcsODMsMTkyLDEyLDMzLDMyLDAsMiwKKwk4LDAsNjYsMTQyLDQsMCw2NywxNDIsMCwwLDAsMCwKKwkzNSwxNiw2NywwLDksNTcsMTkyLDgsMjU1LDI1NSw2Niw0OCwKKwkxNjcsODMsMTkyLDEyLDMzLDMyLDAsMiwzMywxNiwwLDAsCisJNzYsMCwxOTEsMTQzLDcyLDAsMTkwLDE0Myw2OCwwLDE4MywxNDMsCisJNjQsMCwxODIsMTQzLDYwLDAsMTgxLDE0Myw1NiwwLDE4MCwxNDMsCisJNTIsMCwxNzksMTQzLDQ4LDAsMTc4LDE0Myw0NCwwLDE3NywxNDMsCisJNDAsMCwxNzYsMTQzLDgsMCwyMjQsMyw4MCwwLDE4OSwzOSwKKwkxNzYsMjU1LDE4OSwzOSw0NCwwLDE3NywxNzUsMTA4LDAsMTc3LDE0MywKKwk2OCwwLDE4MywxNzUsOTYsMCwxODMsMTQzLDcyLDAsMTkwLDE3NSwKKwkxMDAsMCwxOTAsMTQzLDQ4LDAsMTc4LDE3NSwzMywxNDQsMTI4LDAsCisJNTYsMCwxODAsMTc1LDMzLDE2MCwxNjAsMCw1MiwwLDE3OSwxNzUsCisJMzMsMTUyLDE5MiwwLDQwLDAsMTc2LDE3NSwzMywxMjgsMjI0LDAsCisJNjAsMCwxODEsMTc1LDEsMCwyMSwzNiw3NiwwLDE5MSwxNzUsCisJMywwLDUzLDE4LDY0LDAsMTgyLDE3NSw5Myw1NywxOTIsOCwKKwkyNTUsMjU1LDIsMzYsNCwwLDYsMzYsMiwxMzEsMjIsNjAsCisJNDgsMjA1LDIxNCwzOCwxNjAsMTMyLDEzMiwxNDMsMTA0LDAsMTY1LDE0MywKKwkxMjgsMzIsNCwwLDgwLDY4LDE5MiwxMiwzMywzMiwxNTAsMCwKKwkzMywzMiwwLDAsMzMsNDAsMCwyLDE1MiwxMzIsMTM1LDE0MywKKwkzLDAsMiwzNiwyNCwwLDE2MiwxNzUsMTYwLDEzMiwxMzAsMTQzLAorCTIsMTMxLDMsNjAsMTcyLDIxMCw5OSwxNDAsMzMsNDgsOTYsMiwKKwkyMCwwLDE4MCwxNzUsMjgsMCwxNjAsMTc1LDMyLDAsMTgzLDE3NSwKKwkzNiwwLDE4MSwxNzUsMSwwLDgxLDM2LDEwNCw3NywxOTIsMTIsCisJMTYsMCwxNjMsMTc1LDMzLDEyOCw2NCwwLDIzLDAsMCwxOCwKKwkzMyw0MCwwLDAsMTYsMCwxOTAsMTc1LDMzLDMyLDAsMiwKKwkzMyw0OCwzMiwyLDEwOCw4NCwxOTIsMTIsMzMsNTYsMTkyLDIsCisJMjU1LDI1NSwxNywzNiwxMywwLDgxLDE2LDMzLDMyLDAsMiwKKwkxOTcsODAsMTkyLDEyLDMzLDQwLDY0LDIsOSwwLDgxLDE2LAorCTAsMCwwLDAsMTY3LDgzLDE5MiwxMiwzMywzMiwwLDIsCisJOCwwLDY2LDE0Miw0LDAsNjcsMTQyLDAsMCwwLDAsCisJMzUsMTYsNjcsMCw5Myw1NywxOTIsOCwyNTUsMjU1LDY2LDQ4LAorCTE2Nyw4MywxOTIsMTIsMzMsMzIsMCwyLDMzLDE2LDAsMCwKKwk3NiwwLDE5MSwxNDMsNzIsMCwxOTAsMTQzLDY4LDAsMTgzLDE0MywKKwk2NCwwLDE4MiwxNDMsNjAsMCwxODEsMTQzLDU2LDAsMTgwLDE0MywKKwk1MiwwLDE3OSwxNDMsNDgsMCwxNzgsMTQzLDQ0LDAsMTc3LDE0MywKKwk0MCwwLDE3NiwxNDMsOCwwLDIyNCwzLDgwLDAsMTg5LDM5LAorCTIwMCwyNTUsMTg5LDM5LDQ0LDAsMTc3LDE3NSwzMywxMzYsMTI4LDAsCisJNzIsMCwxNjgsMTQzLDMzLDMyLDAsMCwyMCwwLDE2NSwxNzUsCisJMzMsNDAsMjI0LDAsMiwxMzEsMyw2MCwxNzIsMjEwLDk5LDE0MCwKKwkxNTIsMTMyLDEzNSwxNDMsNCwwLDIsMzYsNDgsMCwxOTEsMTc1LAorCTQwLDAsMTc2LDE3NSwyNCwwLDE2MiwxNzUsMjgsMCwxNjAsMTc1LAorCTM2LDAsMTYwLDE3NSwxNiwwLDE2MywxNzUsMTA0LDc3LDE5MiwxMiwKKwkzMiwwLDE2OCwxNzUsMzMsMTI4LDY0LDAsMywwLDAsMjIsCisJMzMsMzIsMCwyLDE0NSw1NywxOTIsOCwzMywxNiwwLDAsCisJMTk3LDgwLDE5MiwxMiwzMyw0MCwzMiwyLDI1NSwyNTUsMywzNiwKKwk1LDAsNjcsMjAsMCwwLDAsMCwxNjcsODMsMTkyLDEyLAorCTMzLDMyLDAsMiwxNDUsNTcsMTkyLDgsMzMsMTYsMCwwLAorCTE2Nyw4MywxOTIsMTIsMzMsMzIsMCwyLDgsMCwzNCwxNDIsCisJNCwwLDM1LDE0MiwwLDAsMCwwLDM1LDE2LDY3LDAsCisJMjU1LDI1NSw2Niw0OCw0OCwwLDE5MSwxNDMsNDQsMCwxNzcsMTQzLAorCTQwLDAsMTc2LDE0Myw4LDAsMjI0LDMsNTYsMCwxODksMzksCisJMjAwLDI1NSwxODksMzksNDQsMCwxNzcsMTc1LDMzLDEzNiwxMjgsMCwKKwk3MiwwLDE2MywxNDMsMzMsMzIsMCwwLDIwLDAsMTY1LDE3NSwKKwkzMyw0MCwyMjQsMCwxNjQsMTMyLDEzNSwxNDMsMiwxMzEsMiw2MCwKKwk5MiwyMDUsNjYsMzYsMTYsMCwxNjIsMTc1LDYsMCwyLDM2LAorCTI0LDAsMTYyLDE3NSwxLDAsMiwzNiw0OCwwLDE5MSwxNzUsCisJNDAsMCwxNzYsMTc1LDI4LDAsMTYyLDE3NSwzNiwwLDE2MCwxNzUsCisJMTA0LDc3LDE5MiwxMiwzMiwwLDE2MywxNzUsMzMsMTI4LDY0LDAsCisJMywwLDAsMjIsMzMsMzIsMCwyLDE5MSw1NywxOTIsOCwKKwkzMywxNiwwLDAsMTk3LDgwLDE5MiwxMiwzMyw0MCwzMiwyLAorCTI1NSwyNTUsMywzNiw1LDAsNjcsMjAsMCwwLDAsMCwKKwkxNjcsODMsMTkyLDEyLDMzLDMyLDAsMiwxOTEsNTcsMTkyLDgsCisJMzMsMTYsMCwwLDE2Nyw4MywxOTIsMTIsMzMsMzIsMCwyLAorCTgsMCwzNCwxNDIsNCwwLDM1LDE0MiwwLDAsMCwwLAorCTM1LDE2LDY3LDAsMjU1LDI1NSw2Niw0OCw0OCwwLDE5MSwxNDMsCisJNDQsMCwxNzcsMTQzLDQwLDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNTYsMCwxODksMzksMjAwLDI1NSwxODksMzksNDQsMCwxNzcsMTc1LAorCTMzLDEzNiwxMjgsMCw3MiwwLDE2MywxNDMsMzMsMzIsMCwwLAorCTIwLDAsMTY1LDE3NSwzMyw0MCwyMjQsMCwxNjQsMTMyLDEzNSwxNDMsCisJMiwxMzEsMiw2MCw5MiwyMDUsNjYsMzYsMTYsMCwxNjIsMTc1LAorCTYsMCwyLDM2LDI0LDAsMTYyLDE3NSwyLDAsMiwzNiwKKwk0OCwwLDE5MSwxNzUsNDAsMCwxNzYsMTc1LDI4LDAsMTYyLDE3NSwKKwkzNiwwLDE2MCwxNzUsMTA0LDc3LDE5MiwxMiwzMiwwLDE2MywxNzUsCisJMzMsMTI4LDY0LDAsMywwLDAsMjIsMzMsMzIsMCwyLAorCTIzNyw1NywxOTIsOCwzMywxNiwwLDAsMTk3LDgwLDE5MiwxMiwKKwkzMyw0MCwzMiwyLDI1NSwyNTUsMywzNiw1LDAsNjcsMjAsCisJMCwwLDAsMCwxNjcsODMsMTkyLDEyLDMzLDMyLDAsMiwKKwkyMzcsNTcsMTkyLDgsMzMsMTYsMCwwLDE2Nyw4MywxOTIsMTIsCisJMzMsMzIsMCwyLDgsMCwzNCwxNDIsNCwwLDM1LDE0MiwKKwkwLDAsMCwwLDM1LDE2LDY3LDAsMjU1LDI1NSw2Niw0OCwKKwk0OCwwLDE5MSwxNDMsNDQsMCwxNzcsMTQzLDQwLDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNTYsMCwxODksMzksMCwwLDAsMCwKKwkwLDAsMCwwLDIyNCwyNTUsMTg5LDM5LDI0LDAsMTc4LDE3NSwKKwkzMywxNDQsMTI4LDAsMjAsMCwxNzcsMTc1LDMsMTMxLDE3LDYwLAorCTAsMTgsNDksMzgsMTYsMCwxNzYsMTc1LDMzLDEyOCwwLDAsCisJMjgsMCwxOTEsMTc1LDIwOCwxMzMsMTI4LDE3NSw2MCw2NSwxOTIsMTIsCisJMzMsMzIsMCwyLDAsMCwzNCwxNjYsMSwwLDE2LDM4LAorCTY0LDAsMiw0MiwyNTAsMjU1LDY0LDIwLDIsMCw0OSwzOCwKKwkzLDEzMSwzLDYwLDE4LDE4LDk5LDE0NCwyNTUsMCwyLDM2LAorCTMsMCw5OCwxNiwwLDAsMCwwLDYsMCw2NCwxOCwKKwkwLDE2Myw0LDYwLDc1LDU5LDE5MiwxMiwzMiwwLDQsMzYsCisJODcsNTksMTkyLDEyLDI1NSwwLDQsMzYsMCwxNjMsNCw2MCwKKwkyMjAsNSwxMzIsNTIsMTc2LDEzMiwxMzMsMzksMTY4LDcxLDE5MiwxMiwKKwk0LDAsNiwzNiwyNSwwLDY0LDIwLDAsMTYzLDQsNjAsCisJMywxMzEsMTYsNjAsMjAsMTgsMTYsMzgsMzMsMzIsMCwyLAorCTE3NiwxMzIsMTMzLDM5LDE2OCw3MSwxOTIsMTIsNCwwLDYsMzYsCisJMywwLDY0LDE2LDAsMTYzLDQsNjAsNywwLDY0LDE4LAorCTAsMCwwLDAsMjIwLDUsMTMyLDUyLDMzLDQwLDAsMCwKKwkxNDQsNzEsMTkyLDEyLDQsMCw2LDM2LDQ3LDU4LDE5Miw4LAorCTAsMTYzLDQsNjAsMCwxNjMsNSw2MCwyMjAsNSwxNjUsNTIsCisJMywwLDIsMTM4LDAsMCwyLDE1NCwwLDAsMCwwLAorCTMsMCwxNjIsMTY4LDAsMCwxNjIsMTg0LDAsMTYzLDQsNjAsCisJOTksNTksMTkyLDEyLDIyMCw1LDEzMiw1MiwwLDE2Myw0LDYwLAorCTE2LDYsMTMyLDUyLDE3NiwxMzIsMTMzLDM5LDE2OCw3MSwxOTIsMTIsCisJNCwwLDYsMzYsMjUsMCw2NCwyMCwwLDE2Myw0LDYwLAorCTMsMTMxLDE2LDYwLDY4LDE4LDE2LDM4LDMzLDMyLDAsMiwKKwkxNzYsMTMyLDEzMywzOSwxNjgsNzEsMTkyLDEyLDQsMCw2LDM2LAorCTMsMCw2NCwxNiwwLDE2Myw0LDYwLDcsMCw2NCwxOCwKKwkwLDAsMCwwLDE2LDYsMTMyLDUyLDMzLDQwLDAsMCwKKwkxNDQsNzEsMTkyLDEyLDQsMCw2LDM2LDgwLDU4LDE5Miw4LAorCTAsMTYzLDQsNjAsMCwxNjMsNSw2MCwxNiw2LDE2NSw1MiwKKwkzLDAsMiwxMzgsMCwwLDIsMTU0LDAsMCwwLDAsCisJMywwLDE2MiwxNjgsMCwwLDE2MiwxODQsMCwxNjMsNCw2MCwKKwkxMTksNTksMTkyLDEyLDE2LDYsMTMyLDUyLDAsMTYzLDQsNjAsCisJMjI0LDUsMTMyLDUyLDE3NiwxMzIsMTMzLDM5LDE2OCw3MSwxOTIsMTIsCisJNCwwLDYsMzYsMjUsMCw2NCwyMCwwLDE2Myw0LDYwLAorCTMsMTMxLDE2LDYwLDI0LDE4LDE2LDM4LDMzLDMyLDAsMiwKKwkxNzYsMTMyLDEzMywzOSwxNjgsNzEsMTkyLDEyLDQsMCw2LDM2LAorCTMsMCw2NCwxNiwwLDE2Myw0LDYwLDcsMCw2NCwxOCwKKwkwLDAsMCwwLDIyNCw1LDEzMiw1MiwzMyw0MCwwLDAsCisJMTQ0LDcxLDE5MiwxMiw0LDAsNiwzNiwxMTMsNTgsMTkyLDgsCisJMCwxNjMsNCw2MCwwLDE2Myw1LDYwLDIyNCw1LDE2NSw1MiwKKwkzLDAsMiwxMzgsMCwwLDIsMTU0LDAsMCwwLDAsCisJMywwLDE2MiwxNjgsMCwwLDE2MiwxODQsMCwxNjMsNCw2MCwKKwkxMzksNTksMTkyLDEyLDIyNCw1LDEzMiw1MiwzLDEzMSwzLDYwLAorCTI4LDE4LDk5LDM2LDAsMCw5OCwxNDgsMCwwLDAsMCwKKwkwLDEyOCw2Niw0OCwzLDAsNjQsMjAsMSwwLDIsMzYsCisJMiwwLDY0LDE4LDAsMCwwLDAsMCwwLDk4LDE2NCwKKwkwLDE2MywyLDYwLDE0NCwxLDY2LDE0MCwwLDAsMCwwLAorCTcsMCw2NCwyMCwwLDAsMCwwLDMsMTMxLDMsNjAsCisJMjgsMTgsOTksMzYsMCwwLDk4LDE0OCwwLDAsMCwwLAorCTE0Niw1OCwxOTIsOCwyNTQsMjU1LDY2LDQ4LDAsMTYzLDIsNjAsCisJMTQ0LDEsNjYsMTQwLDAsMCwwLDAsNywwLDY0LDI0LAorCTAsMCwwLDAsMywxMzEsMyw2MCwyOCwxOCw5OSwzNiwKKwkwLDAsOTgsMTQ4LDAsMCwwLDAsMSwwLDY2LDUyLAorCTAsMCw5OCwxNjQsMywxMzEsNCw2MCwyOCwxOCwxMzIsMTQ4LAorCTAsMCwwLDAsMTU5LDU5LDE5MiwxMiwxLDAsMTMyLDQ4LAorCTMsMTMxLDMsNjAsODAsMTgsOTksMTQ0LDI1NSwwLDIsMzYsCisJMywwLDk4LDE2LDAsMCwwLDAsNSwwLDY0LDE4LAorCTAsMCwwLDAsMiwxMzEsNCw2MCwxNjAsMTQ5LDEzMiwzNiwKKwkyMDUsNTksMTkyLDEyLDE0LDAsNSwzNiwzLDEzMSwzLDYwLAorCTk2LDE4LDk5LDE0NCwyNTUsMCwyLDM2LDMsMCw5OCwxNiwKKwkwLDAsMCwwLDUsMCw2NCwxOCwwLDAsMCwwLAorCTIsMTMxLDQsNjAsMTc2LDE0OSwxMzIsMzYsMjM5LDU5LDE5MiwxMiwKKwkxMSwwLDUsMzYsMywxMzEsMyw2MCwxMTIsMTgsOTksMTQ0LAorCTI1NSwwLDIsMzYsMywwLDk4LDE2LDAsMCwwLDAsCisJNSwwLDY0LDE4LDAsMCwwLDAsMiwxMzEsNCw2MCwKKwkxODgsMTQ5LDEzMiwzNiwxNyw2MCwxOTIsMTIsMTUsMCw1LDM2LAorCTAsMTYzLDIsNjAsMTQwLDEsNjYsMTQwLDAsMCwwLDAsCisJNywwLDY0LDE2LDE1LDAsMiw2MCwwLDE2MywzLDYwLAorCTE0MCwxLDk5LDE0MCw2NCw2Niw2Niw1Miw0MywxNiw2NywwLAorCTI2LDAsNjQsMTYsMCwwLDAsMCwzLDEzMSwzLDYwLAorCTY0LDE4LDk5LDE0MCwyNTUsMjU1LDIsMzYsMywwLDk4LDE2LAorCTQ0LDEsMiwzNiw0LDAsNjQsMTgsMCwwLDAsMCwKKwkwLDE2MywxLDYwLDIyMSw1OCwxOTIsOCwxNDAsMSwzNCwxNzIsCisJNSwwLDk2LDIwLDE1LDAsNCw2MCwxLDAsMiwzNiwKKwkwLDE2MywxLDYwLDIyMSw1OCwxOTIsOCwxNDAsMSwzNCwxNzIsCisJNjQsNjYsMTMyLDUyLDQzLDE2LDEzMSwwLDQsMCw2NCwxNiwKKwkwLDAsMCwwLDAsMTYzLDEsNjAsMjIxLDU4LDE5Miw4LAorCTE0MCwxLDM2LDE3MiwwLDE2MywxLDYwLDE0MCwxLDM1LDE3MiwKKwkwLDE2Myw0LDYwLDE0MCwxLDEzMiwxNDAsNTEsNjAsMTkyLDEyLAorCTAsMCwwLDAsMjgsMCwxOTEsMTQzLDI0LDAsMTc4LDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkzMiwwLDE4OSwzOSwyMDgsMjU1LDE4OSwzOSwyMCwwLDE3NywxNzUsCisJMzMsMTM2LDEyOCwwLDM2LDAsMTgxLDE3NSwzMywxNjgsMTYwLDAsCisJMjgsMCwxNzksMTc1LDMzLDE1MiwxOTIsMCw0NCwwLDE5MSwxNzUsCisJNDAsMCwxODIsMTc1LDMyLDAsMTgwLDE3NSwyNCwwLDE3OCwxNzUsCisJMTY4LDcxLDE5MiwxMiwxNiwwLDE3NiwxNzUsNzYsMCw2NCwxNiwKKwkwLDAsMCwwLDMsMTMxLDIyLDYwLDAsMTgsMjE0LDM4LAorCTM1LDE2LDU0LDIsMTk0LDMxLDIsMCwzMywxNiw2NywwLAorCTY3LDE0NCwyLDAsMSwwLDk4LDM4LDE5NCwzMSwyLDAsCisJMzMsMTYsNjcsMCw2NywxMjgsMiwwLDI1NSwyNTUsMjAsMzgsCisJNjQsMCwxMzAsNDYsMTQsMCw2NCwyMCw2NCwwLDY2LDQ2LAorCTIsMTMxLDQsNjAsMjA0LDE0OSwxMzIsMzYsMTgwLDEzMiwxNDQsMzksCisJMzMsNDAsMCwyLDIsMTMxLDcsNjAsMjM2LDE0OSwyMzEsMzYsCisJMTUsNjMsMTkyLDEyLDE0MywwLDYsMzYsMSwwLDQsMzYsCisJMzMsNDAsMCwyLDE4OCw3LDE5MiwxMiwxNDMsMCw2LDM2LAorCTY0LDAsNjYsNDYsMTQsMCw2NCwyMCwzMywzMiwzMiwyLAorCTIsMTMxLDQsNjAsMjA0LDE0OSwxMzIsMzYsMTgwLDEzMiwxNDQsMzksCisJMzMsNDAsMCwyLDIsMTMxLDcsNjAsMjAsMTUwLDIzMSwzNiwKKwkxNSw2MywxOTIsMTIsMTQ0LDAsNiwzNiwxLDAsNCwzNiwKKwkzMyw0MCwwLDIsMTg4LDcsMTkyLDEyLDE0NCwwLDYsMzYsCisJMzMsMzIsMzIsMiwzMyw0MCwxNjAsMiw4MCw2OCwxOTIsMTIsCisJMzMsNDgsOTYsMiw2NCwxNiwxOCwwLDMzLDEzNiw4NiwwLAorCTMzLDEyOCwxMjgsMiwyNTUsMjU1LDIsMzYsMjUsMCwyLDE4LAorCTI1NSwyNTUsMjAsMzYsMTgwLDEzMiwxNDcsMzksMzMsMzIsNjQsMiwKKwkyMDgsMTMzLDEzMCwxNDMsMSwwLDgyLDM4LDEsMCw2NiwzNiwKKwkyMDgsMTMzLDEzMCwxNzUsMCwwLDM3LDE1MCwwLDAsMCwwLAorCTE2Miw2NSwxOTIsMTIsMiwwLDQ5LDM4LDEwLDAsNjQsMjAsCisJMzMsNDAsOTYsMiwyLDEzMSw0LDYwLDIwNCwxNDksMTMyLDM2LAorCTE4OCwxMzIsMTM1LDM5LDE1LDYzLDE5MiwxMiwxNTksMCw2LDM2LAorCTEsMCw0LDM2LDMzLDQwLDk2LDIsMTg4LDcsMTkyLDEyLAorCTE1OSwwLDYsMzYsMjU1LDI1NSwxNiwzOCwyMzUsMjU1LDIwLDIyLAorCTMzLDMyLDY0LDIsNDQsMCwxOTEsMTQzLDQwLDAsMTgyLDE0MywKKwkzNiwwLDE4MSwxNDMsMzIsMCwxODAsMTQzLDI4LDAsMTc5LDE0MywKKwkyNCwwLDE3OCwxNDMsMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNDgsMCwxODksMzksMjI0LDI1NSwxODksMzksCisJMTYsMCwxNjQsMTYzLDMsMTMxLDQsNjAsMTgsMTgsMTMyLDM2LAorCTE2LDAsMTY1LDM5LDI0LDAsMTkxLDE3NSwyMzEsNTgsMTkyLDEyLAorCTEsMCw2LDM2LDI0LDAsMTkxLDE0MywzMiwwLDE4OSwzOSwKKwk4LDAsMjI0LDMsMCwwLDAsMCwyMjQsMjU1LDE4OSwzOSwKKwkxNiwwLDE2NCwxNjMsMywxMzEsNCw2MCwxOSwxOCwxMzIsMzYsCisJMTYsMCwxNjUsMzksMjQsMCwxOTEsMTc1LDIzMSw1OCwxOTIsMTIsCisJMSwwLDYsMzYsMjQsMCwxOTEsMTQzLDMyLDAsMTg5LDM5LAorCTgsMCwyMjQsMywwLDAsMCwwLDIzMiwyNTUsMTg5LDM5LAorCTMzLDQwLDEyOCwwLDE2LDAsMTc2LDE3NSwzLDEzMSwxNiw2MCwKKwkyMCwxOCwxNiwzOCwzMywzMiwwLDIsMjAsMCwxOTEsMTc1LAorCTIzMSw1OCwxOTIsMTIsNCwwLDYsMzYsMCwxNjMsNSw2MCwKKwkyMjAsNSwxNjUsNTIsMywwLDIsMTM4LDAsMCwyLDE1NCwKKwkwLDAsMCwwLDMsMCwxNjIsMTY4LDAsMCwxNjIsMTg0LAorCTIwLDAsMTkxLDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTI0LDAsMTg5LDM5LDIzMiwyNTUsMTg5LDM5LDMzLDQwLDEyOCwwLAorCTE2LDAsMTc2LDE3NSwzLDEzMSwxNiw2MCw2OCwxOCwxNiwzOCwKKwkzMywzMiwwLDIsMjAsMCwxOTEsMTc1LDIzMSw1OCwxOTIsMTIsCisJNCwwLDYsMzYsMCwxNjMsNSw2MCwxNiw2LDE2NSw1MiwKKwkzLDAsMiwxMzgsMCwwLDIsMTU0LDAsMCwwLDAsCisJMywwLDE2MiwxNjgsMCwwLDE2MiwxODQsMjAsMCwxOTEsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMjQsMCwxODksMzksCisJMjMyLDI1NSwxODksMzksMzMsNDAsMTI4LDAsMTYsMCwxNzYsMTc1LAorCTMsMTMxLDE2LDYwLDI0LDE4LDE2LDM4LDMzLDMyLDAsMiwKKwkyMCwwLDE5MSwxNzUsMjMxLDU4LDE5MiwxMiw0LDAsNiwzNiwKKwkwLDE2Myw1LDYwLDIyNCw1LDE2NSw1MiwzLDAsMiwxMzgsCisJMCwwLDIsMTU0LDAsMCwwLDAsMywwLDE2MiwxNjgsCisJMCwwLDE2MiwxODQsMjAsMCwxOTEsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsMjQsMCwxODksMzksMywxMzEsMiw2MCwKKwkyOCwxOCw2NiwxNDgsMjI0LDI1NSwxODksMzksMjQsMCwxOTEsMTc1LAorCTgsMCwxMjgsMTYsMTYsMCwxNjIsMTY3LDEsMCw2Niw1MiwKKwkxNiwwLDE2MiwxNjcsMSwwLDIsMzYsNDQsMTMzLDEzMCwxNzUsCisJMCwxNjMsMSw2MCwxNzcsNTksMTkyLDgsMTQ0LDEsMzQsMTcyLAorCTI1NCwyNTUsNjYsNDgsMTYsMCwxNjIsMTY3LDQ0LDEzMywxMjgsMTc1LAorCTAsMTYzLDEsNjAsMTQ0LDEsMzIsMTcyLDMsMTMxLDQsNjAsCisJMjgsMTgsMTMyLDM2LDE2LDAsMTY1LDM5LDIzMSw1OCwxOTIsMTIsCisJMiwwLDYsMzYsMjQsMCwxOTEsMTQzLDMyLDAsMTg5LDM5LAorCTgsMCwyMjQsMywwLDAsMCwwLDMsMTMxLDIsNjAsCisJMjgsMTgsNjYsMTQ4LDIyNCwyNTUsMTg5LDM5LDI0LDAsMTkxLDE3NSwKKwkzLDAsMTI4LDE2LDE2LDAsMTYyLDE2NywxOTUsNTksMTkyLDgsCisJMiwwLDY2LDUyLDI1MywyNTUsNjYsNDgsMTYsMCwxNjIsMTY3LAorCTMsMTMxLDQsNjAsMjgsMTgsMTMyLDM2LDE2LDAsMTY1LDM5LAorCTIzMSw1OCwxOTIsMTIsMiwwLDYsMzYsMjQsMCwxOTEsMTQzLAorCTMyLDAsMTg5LDM5LDgsMCwyMjQsMywwLDAsMCwwLAorCTIxNiwyNTUsMTg5LDM5LDMyLDAsMTkxLDE3NSwzMyw1NiwxMjgsMCwKKwkzMyw0OCwxNjAsMCwzLDAsMjI2LDEzNiwwLDAsMjI2LDE1MiwKKwk3LDAsMjI3LDEzNiw0LDAsMjI3LDE1MiwxMSwwLDIyOCwxMzYsCisJOCwwLDIyOCwxNTIsMTUsMCwyMjksMTM2LDEyLDAsMjI5LDE1MiwKKwkxOSwwLDE2MiwxNzEsMTYsMCwxNjIsMTg3LDIzLDAsMTYzLDE3MSwKKwkyMCwwLDE2MywxODcsMjcsMCwxNjQsMTcxLDI0LDAsMTY0LDE4NywKKwkzMSwwLDE2NSwxNzEsMjgsMCwxNjUsMTg3LDE2LDAsMTk0LDQ0LAorCTMsMCw2NCwxNiwxNiwwLDE2MywzOSwzMywxNiwxMDIsMCwKKwkwLDAsNjQsMTYwLDMsMTMxLDQsNjAsODAsMTgsMTMyLDM2LAorCTMzLDQwLDIyNCwwLDIzMSw1OCwxOTIsMTIsMTYsMCw2LDM2LAorCTMyLDAsMTkxLDE0Myw0MCwwLDE4OSwzOSw4LDAsMjI0LDMsCisJMCwwLDAsMCwyMTYsMjU1LDE4OSwzOSwzMiwwLDE5MSwxNzUsCisJMzMsNTYsMTI4LDAsMzMsNDgsMTYwLDAsMywwLDIyNiwxMzYsCisJMCwwLDIyNiwxNTIsNywwLDIyNywxMzYsNCwwLDIyNywxNTIsCisJMTEsMCwyMjgsMTM2LDgsMCwyMjgsMTUyLDE1LDAsMjI5LDEzNiwKKwkxMiwwLDIyOSwxNTIsMTksMCwxNjIsMTcxLDE2LDAsMTYyLDE4NywKKwkyMywwLDE2MywxNzEsMjAsMCwxNjMsMTg3LDI3LDAsMTY0LDE3MSwKKwkyNCwwLDE2NCwxODcsMzEsMCwxNjUsMTcxLDI4LDAsMTY1LDE4NywKKwkxNiwwLDE5NCw0NCwzLDAsNjQsMTYsMTYsMCwxNjMsMzksCisJMzMsMTYsMTAyLDAsMCwwLDY0LDE2MCwzLDEzMSw0LDYwLAorCTk2LDE4LDEzMiwzNiwzMyw0MCwyMjQsMCwyMzEsNTgsMTkyLDEyLAorCTE2LDAsNiwzNiwzMiwwLDE5MSwxNDMsNDAsMCwxODksMzksCisJOCwwLDIyNCwzLDAsMCwwLDAsMjE2LDI1NSwxODksMzksCisJMzIsMCwxOTEsMTc1LDMzLDU2LDEyOCwwLDMzLDQ4LDE2MCwwLAorCTMsMCwyMjYsMTM2LDAsMCwyMjYsMTUyLDcsMCwyMjcsMTM2LAorCTQsMCwyMjcsMTUyLDExLDAsMjI4LDEzNiw4LDAsMjI4LDE1MiwKKwkxNSwwLDIyOSwxMzYsMTIsMCwyMjksMTUyLDE5LDAsMTYyLDE3MSwKKwkxNiwwLDE2MiwxODcsMjMsMCwxNjMsMTcxLDIwLDAsMTYzLDE4NywKKwkyNywwLDE2NCwxNzEsMjQsMCwxNjQsMTg3LDMxLDAsMTY1LDE3MSwKKwkyOCwwLDE2NSwxODcsMTYsMCwxOTQsNDQsMywwLDY0LDE2LAorCTE2LDAsMTYzLDM5LDMzLDE2LDEwMiwwLDAsMCw2NCwxNjAsCisJMywxMzEsNCw2MCwxMTIsMTgsMTMyLDM2LDMzLDQwLDIyNCwwLAorCTIzMSw1OCwxOTIsMTIsMTYsMCw2LDM2LDMyLDAsMTkxLDE0MywKKwk0MCwwLDE4OSwzOSw4LDAsMjI0LDMsMCwwLDAsMCwKKwkyMzIsMjU1LDE4OSwzOSwxNSwwLDIsNjAsNTQsNjYsNjYsNTIsCisJMjQsMCwxNjQsMTc1LDI0NiwyNTUsMTMyLDM2LDQzLDE2LDY4LDAsCisJMywwLDY0LDE2LDE2LDAsMTkxLDE3NSw0NCwxLDIsMzYsCisJMjQsMCwxNjIsMTc1LDMsMTMxLDQsNjAsNjQsMTgsMTMyLDM2LAorCTI0LDAsMTY1LDM5LDIzMSw1OCwxOTIsMTIsNCwwLDYsMzYsCisJMjQsMCwxNjIsMTQzLDAsMTYzLDEsNjAsMTQwLDEsMzQsMTcyLAorCTE2LDAsMTkxLDE0MywyNCwwLDE4OSwzOSw4LDAsMjI0LDMsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwyMzIsMjU1LDE4OSwzOSwxNiwwLDE5MSwxNzUsCisJMCwzOCw0LDAsMTk2LDY0LDE5MiwxMiwzLDM4LDQsMCwKKwkxNiwwLDE5MSwxNDMsMjQsMCwxODksMzksOCwwLDIyNCwzLAorCTAsMCwwLDAsMjMyLDI1NSwxODksMzksMTYsMCwxOTEsMTc1LAorCTAsMzgsNCwwLDE5Niw2NCwxOTIsMTIsMywzOCw0LDAsCisJMTYsMCwxOTEsMTQzLDI0LDAsMTg5LDM5LDgsMCwyMjQsMywKKwkwLDAsMCwwLDE2MCwyNTUsMTg5LDM5LDExMiwwLDE2MiwxNDMsCisJNzIsMCwxNzYsMTc1LDMzLDEyOCwyMjQsMCw4OCwwLDE4MCwxNzUsCisJMzMsMTYwLDAsMCw4NCwwLDE3OSwxNzUsMzMsMTUyLDE5MiwwLAorCTkyLDAsMTkxLDE3NSw4MCwwLDE3OCwxNzUsNywwLDE2MCwxNiwKKwk3NiwwLDE3NywxNzUsNiwwLDY1LDQsNTEsMCwxNzcsMzksCisJNDUsMCwyMCwzNiwzLDAsMCwxOCwzNSwxNiwyLDAsCisJMjU1LDI1NSwxNiwzOCw1MSwwLDE3NywzOSw1MSwwLDE2MCwxNjMsCisJMjcsMCw2OCwwLDIsMCwxMjgsMjAsMCwwLDAsMCwKKwkxMywwLDcsMCwxOCwyNCwwLDAsMTYsMTYsMCwwLAorCTIsMTMxLDEsNjAsMzMsOCwzNCwwLDEyOCwyMDUsMzQsMTQ0LAorCTI1NSwyNTUsNDksMzgsMiwwLDAsMTgsMCwwLDM0LDE2MiwKKwkyNTUsMjU1LDE2LDM4LDMzLDE2LDk2LDAsMjQxLDI1NSw2NCwyMCwKKwkxLDAsMywzNiwwLDIyLDE5LDAsMywyMiwyLDAsCisJMTEsMCw2NywyMCwzMywzMiwxMjgsMiwyNTUsMjU1LDE2LDM4LAorCTI1NSwyNTUsMiwzNiw3LDAsMiwxOCwwLDAsMCwwLAorCTI1NSwyNTUsMTgsMzYsMTk2LDY0LDE5MiwxMiwzMiwwLDQsMzYsCisJMjU1LDI1NSwxNiwzOCwyNTIsMjU1LDE4LDIyLDMzLDMyLDEyOCwyLAorCTQsMCwxMjgsMTYsMCwyMiwxOSwwLDE5Niw2NCwxOTIsMTIsCisJMCwwLDAsMCwwLDIyLDE5LDAsMywyMiwyLDAsCisJMiwwLDMsMzYsMTQsMCw2NywyMCwyNTUsMjU1LDIsMzYsCisJMjU1LDI1NSwxNiwzOCwxMSwwLDIsMTgsMjU1LDI1NSwxOCwzNiwKKwkxOTYsNjQsMTkyLDEyLDQ4LDAsNCwzNiwyNTUsMjU1LDE2LDM4LAorCTYsMCwxOCwxOCwwLDAsMCwwLDE1Niw2MCwxOTIsOCwKKwkwLDAsMCwwLDAsMzgsNCwwLDE5Niw2NCwxOTIsMTIsCisJMywzOCw0LDAsMCwwLDM0LDEzMCwwLDAsMzYsMTQ2LAorCTAsMCwwLDAsMjQ5LDI1NSw2NCwyMCwxLDAsNDksMzgsCisJMjU1LDI1NSw0OSwzOCwwLDIyLDE5LDAsMywyMiwyLDAsCisJMywwLDMsMzYsOSwwLDY3LDIwLDI1NSwyNTUsMTYsMzgsCisJMjU1LDI1NSwyLDM2LDYsMCwyLDE4LDI1NSwyNTUsMTcsMzYsCisJMTk2LDY0LDE5MiwxMiwzMiwwLDQsMzYsMjU1LDI1NSwxNiwzOCwKKwkyNTIsMjU1LDE3LDIyLDAsMCwwLDAsOTIsMCwxOTEsMTQzLAorCTg4LDAsMTgwLDE0Myw4NCwwLDE3OSwxNDMsODAsMCwxNzgsMTQzLAorCTc2LDAsMTc3LDE0Myw3MiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTk2LDAsMTg5LDM5LDIwMCwyNTUsMTg5LDM5LDQwLDAsMTc4LDE3NSwKKwkzMywxNDQsMTI4LDAsMzIsMCwxNzYsMTc1LDMzLDEyOCwxNjAsMCwKKwkzNiwwLDE3NywxNzUsMzMsMTM2LDE5MiwwLDMzLDMyLDMyLDIsCisJNDgsMCwxOTEsMTc1LDE1Niw3MSwxOTIsMTIsNDQsMCwxNzksMTc1LAorCTMzLDMyLDAsMCwzMywyNCw2NCwwLDQyLDE2LDExMiwwLAorCTIsMCw2NCwxNiwzMywxNTIsNjQsMiwzNSwzMiwzLDIsCisJMCwyMiwxOCwwLDMsMjIsMiwwLDEsMCwzLDM2LAorCTExLDAsNjcsMjAsMzMsMTI4LDEyOCwwLDI1NSwyNTUsMTYsMzgsCisJMjU1LDI1NSwyLDM2LDgsMCwyLDE4LDAsMjIsMTksMCwKKwkyNTUsMjU1LDE4LDM2LDE5Niw2NCwxOTIsMTIsMzIsMCw0LDM2LAorCTI1NSwyNTUsMTYsMzgsMjUyLDI1NSwxOCwyMiwwLDAsMCwwLAorCTAsMjIsMTksMCwzLDIyLDIsMCwyLDAsMywzNiwKKwkxNCwwLDY3LDIwLDI1NSwyNTUsMiwzNiwyNTUsMjU1LDE2LDM4LAorCTExLDAsMiwxOCwyNTUsMjU1LDE4LDM2LDE5Niw2NCwxOTIsMTIsCisJNDgsMCw0LDM2LDI1NSwyNTUsMTYsMzgsNiwwLDE4LDE4LAorCTAsMCwwLDAsMjMzLDYwLDE5Miw4LDAsMCwwLDAsCisJMCwzOCw0LDAsMTk2LDY0LDE5MiwxMiwzLDM4LDQsMCwKKwkwLDAsMzQsMTMwLDAsMCwzNiwxNDYsMCwwLDAsMCwKKwkyNDksMjU1LDY0LDIwLDEsMCw0OSwzOCwyNTUsMjU1LDQ5LDM4LAorCTAsMjIsMTksMCwzLDIyLDIsMCwzLDAsMywzNiwKKwk5LDAsNjcsMjAsMjU1LDI1NSwxNiwzOCwyNTUsMjU1LDIsMzYsCisJNiwwLDIsMTgsMjU1LDI1NSwxNywzNiwxOTYsNjQsMTkyLDEyLAorCTMyLDAsNCwzNiwyNTUsMjU1LDE2LDM4LDI1MiwyNTUsMTcsMjIsCisJMCwwLDAsMCw0OCwwLDE5MSwxNDMsNDQsMCwxNzksMTQzLAorCTQwLDAsMTc4LDE0MywzNiwwLDE3NywxNDMsMzIsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw1NiwwLDE4OSwzOSwzMiwyNTUsMTg5LDM5LAorCTE5MiwwLDE3OCwxNzUsMzMsMTQ0LDE2MCwwLDE5NiwwLDE3OSwxNzUsCisJMzMsMTUyLDAsMCwyMjAsMCwxOTEsMTc1LDIxNiwwLDE5MCwxNzUsCisJMjEyLDAsMTgzLDE3NSwyMDgsMCwxODIsMTc1LDIwNCwwLDE4MSwxNzUsCisJMjAwLDAsMTgwLDE3NSwxODgsMCwxNzcsMTc1LDE4NCwwLDE3NiwxNzUsCisJMSwwLDEzMCwxMjgsMCwwLDAsMCwyMjksMSw2NCwxNiwKKwkzMywxMzYsMCwwLDI1NSwyNTUsMjIsMzYsMSwwLDIzLDM2LAorCTIsMCwzMCwzNiwxLDAsMTQ5LDM2LDAsMCwxNjIsMTQ2LAorCTAsMCwwLDAsMjE5LDI1NSw2NiwzNiwwLDIyLDIsMCwKKwkzLDMwLDIsMCw4NCwwLDk4LDQ0LDIxNywxLDY0LDE2LAorCTEyOCwxNiwzLDAsMiwxMzEsMSw2MCwzMyw4LDM0LDAsCisJODAsMTUwLDM0LDE0MCwwLDAsMCwwLDgsMCw2NCwwLAorCTAsMCwwLDAsMjA5LDYxLDE5Miw4LDM3LDAsNCwzNiwKKwkyLDEzMSwxNiw2MCw2NCwxNTAsMTYsMzgsMTU2LDcxLDE5MiwxMiwKKwkzMywzMiwwLDIsNTksNjEsMTkyLDgsMCwwLDAsMCwKKwkwLDM4LDQsMCwxOTYsNjQsMTkyLDEyLDMsMzgsNCwwLAorCTAsMCwyLDEzMCwwLDAsNCwxNDYsMCwwLDAsMCwKKwkyNDksMjU1LDY0LDIwLDEsMCwxNiwzOCwzLDYzLDE5Miw4LAorCTEsMCwxNjIsMzgsMCwzOCwxOCwwLDIwOSw2MSwxOTIsOCwKKwkzLDM4LDQsMCwyLDAsMywzNiwzMywxMjgsMzIsMiwKKwkzMyw0MCw2NCwyLDMzLDE2MCwwLDAsNTEsMCwxNzcsMzksCisJNTEsMCwxNjAsMTYzLDI3LDAsMTYzLDAsMiwwLDk2LDIwLAorCTAsMCwwLDAsMTMsMCw3LDAsMTgsNDAsMCwwLAorCTE2LDE2LDAsMCwyLDEzMSwxLDYwLDMzLDgsMzQsMCwKKwkxMjgsMjA1LDM0LDE0NCwyNTUsMjU1LDQ5LDM4LDIsMCwwLDE4LAorCTAsMCwzNCwxNjIsMjU1LDI1NSwxNiwzOCwyNDIsMjU1LDE2MCwyMCwKKwkwLDAsMCwwLDEwLDAsMTE5LDIyLDAsMjIsMjAsMCwKKwkyNTUsMjU1LDE2LDM4LDgsMCwyMiwxOCwzLDM4LDIsMCwKKwkyNTUsMjU1LDE4LDM2LDE5Niw2NCwxOTIsMTIsMzIsMCw0LDM2LAorCTI1NSwyNTUsMTYsMzgsMjUyLDI1NSwxOCwyMiwwLDIyLDIwLDAsCisJMywzOCwyLDAsMywwLDEyOCwxNiwwLDAsMCwwLAorCTE5Niw2NCwxOTIsMTIsMCwwLDAsMCwxNCwwLDEyNiwyMiwKKwkwLDAsMCwwLDI1NSwyNTUsMTYsMzgsMTEsMCwyMiwxOCwKKwkyNTUsMjU1LDE4LDM2LDE5Niw2NCwxOTIsMTIsNDgsMCw0LDM2LAorCTI1NSwyNTUsMTYsMzgsNiwwLDE4LDE4LDAsMCwwLDAsCisJMTExLDYxLDE5Miw4LDAsMCwwLDAsMCwzOCw0LDAsCisJMTk2LDY0LDE5MiwxMiwzLDM4LDQsMCwwLDAsMzQsMTMwLAorCTAsMCwzNiwxNDYsMCwwLDAsMCwyNDksMjU1LDY0LDIwLAorCTEsMCw0OSwzOCwyNTUsMjU1LDQ5LDM4LDMsMCw2LDM2LAorCTgwLDAsMTAyLDIyLDY2LDAsNCwzNiwyNTUsMjU1LDE2LDM4LAorCTc3LDAsMjIsMTgsMjU1LDI1NSwxNywzNiwxOTYsNjQsMTkyLDEyLAorCTMyLDAsNCwzNiwyNTUsMjU1LDE2LDM4LDI1MiwyNTUsMTcsMjIsCisJNjYsMCw0LDM2LDIwOSw2MSwxOTIsOCwwLDAsMCwwLAorCTgsMCwzLDM2LDMzLDEyOCwzMiwyLDMzLDQwLDY0LDIsCisJMzMsMTYwLDAsMCw1MSwwLDE3NywzOSw1MSwwLDE2MCwxNjMsCisJMjcsMCwxNjMsMCwyLDAsOTYsMjAsMCwwLDAsMCwKKwkxMywwLDcsMCwxOCw0MCwwLDAsMTYsMTYsMCwwLAorCTIsMTMxLDEsNjAsMzMsOCwzNCwwLDEyOCwyMDUsMzQsMTQ0LAorCTI1NSwyNTUsNDksMzgsMiwwLDAsMTgsMCwwLDM0LDE2MiwKKwkyNTUsMjU1LDE2LDM4LDI0MiwyNTUsMTYwLDIwLDAsMCwwLDAsCisJMTAsMCwxMTksMjIsMCwyMiwyMCwwLDI1NSwyNTUsMTYsMzgsCisJOCwwLDIyLDE4LDMsMzgsMiwwLDI1NSwyNTUsMTgsMzYsCisJMTk2LDY0LDE5MiwxMiwzMiwwLDQsMzYsMjU1LDI1NSwxNiwzOCwKKwkyNTIsMjU1LDE4LDIyLDAsMjIsMjAsMCwzLDM4LDIsMCwKKwkzLDAsMTI4LDE2LDAsMCwwLDAsMTk2LDY0LDE5MiwxMiwKKwkwLDAsMCwwLDE0LDAsMTI2LDIyLDAsMCwwLDAsCisJMjU1LDI1NSwxNiwzOCwxMSwwLDIyLDE4LDI1NSwyNTUsMTgsMzYsCisJMTk2LDY0LDE5MiwxMiw0OCwwLDQsMzYsMjU1LDI1NSwxNiwzOCwKKwk2LDAsMTgsMTgsMCwwLDAsMCwxODIsNjEsMTkyLDgsCisJMCwwLDAsMCwwLDM4LDQsMCwxOTYsNjQsMTkyLDEyLAorCTMsMzgsNCwwLDAsMCwzNCwxMzAsMCwwLDM2LDE0NiwKKwkwLDAsMCwwLDI0OSwyNTUsNjQsMjAsMSwwLDQ5LDM4LAorCTI1NSwyNTUsNDksMzgsMywwLDYsMzYsOSwwLDEwMiwyMiwKKwk4MSwwLDQsMzYsMjU1LDI1NSwxNiwzOCw2LDAsMjIsMTgsCisJMjU1LDI1NSwxNywzNiwxOTYsNjQsMTkyLDEyLDMyLDAsNCwzNiwKKwkyNTUsMjU1LDE2LDM4LDI1MiwyNTUsMTcsMjIsODEsMCw0LDM2LAorCTE5Niw2NCwxOTIsMTIsMCwwLDAsMCwzLDYzLDE5Miw4LAorCTEsMCwxNjIsMzgsMzMsMTI4LDMyLDIsMzMsMTYsNjQsMiwKKwkzMywxNjAsMCwwLDUsMCw2NSw2LDEwLDAsNCwzNiwKKwk0NSwwLDIwLDM2LDIsMCwzMiwxOCwzNSwxNiwxOCwwLAorCTI1NSwyNTUsNDgsMzgsNTEsMCwxNzcsMzksNTEsMCwxNjAsMTYzLAorCTI3LDAsNjgsMCwyLDAsMTI4LDIwLDAsMCwwLDAsCisJMTMsMCw3LDAsMTgsMjQsMCwwLDE2LDE2LDAsMCwKKwkyLDEzMSwxLDYwLDMzLDgsMzQsMCwxMjgsMjA1LDM0LDE0NCwKKwkyNTUsMjU1LDQ5LDM4LDIsMCwwLDE4LDAsMCwzNCwxNjIsCisJMjU1LDI1NSwxNiwzOCwzMywxNiw5NiwwLDI0MSwyNTUsNjQsMjAsCisJMCwwLDAsMCwxMCwwLDExOSwyMiwzMywzMiwxMjgsMiwKKwkyNTUsMjU1LDE2LDM4LDcsMCwyMiwxOCwwLDAsMCwwLAorCTI1NSwyNTUsMTgsMzYsMTk2LDY0LDE5MiwxMiwzMiwwLDQsMzYsCisJMjU1LDI1NSwxNiwzOCwyNTIsMjU1LDE4LDIyLDMzLDMyLDEyOCwyLAorCTMsMCwxMjgsMTYsMCwwLDAsMCwxOTYsNjQsMTkyLDEyLAorCTAsMCwwLDAsMTQsMCwxMjYsMjIsMCwwLDAsMCwKKwkyNTUsMjU1LDE2LDM4LDExLDAsMjIsMTgsMjU1LDI1NSwxOCwzNiwKKwkxOTYsNjQsMTkyLDEyLDQ4LDAsNCwzNiwyNTUsMjU1LDE2LDM4LAorCTYsMCwxOCwxOCwwLDAsMCwwLDQsNjIsMTkyLDgsCisJMCwwLDAsMCwwLDM4LDQsMCwxOTYsNjQsMTkyLDEyLAorCTMsMzgsNCwwLDAsMCwzNCwxMzAsMCwwLDM2LDE0NiwKKwkwLDAsMCwwLDI0OSwyNTUsNjQsMjAsMSwwLDQ5LDM4LAorCTI1NSwyNTUsNDksMzgsMywwLDYsMzYsMjM3LDAsMTAyLDIyLAorCTEsMCwxNjIsMzgsMjU1LDI1NSwxNiwzOCwyMzQsMCwyMiwxOCwKKwkyNTUsMjU1LDE3LDM2LDE5Niw2NCwxOTIsMTIsMzIsMCw0LDM2LAorCTI1NSwyNTUsMTYsMzgsMjUyLDI1NSwxNywyMiwxLDAsMTYyLDM4LAorCTMsNjMsMTkyLDgsMCwwLDAsMCwxMCwwLDMsMzYsCisJMzMsMTI4LDMyLDIsMzMsNDAsNjQsMiwzMywxNjAsMCwwLAorCTUxLDAsMTc3LDM5LDUxLDAsMTYwLDE2MywyNywwLDE2MywwLAorCTIsMCw5NiwyMCwwLDAsMCwwLDEzLDAsNywwLAorCTE4LDQwLDAsMCwxNiwxNiwwLDAsMiwxMzEsMSw2MCwKKwkzMyw4LDM0LDAsMTI4LDIwNSwzNCwxNDQsMjU1LDI1NSw0OSwzOCwKKwkyLDAsMCwxOCwwLDAsMzQsMTYyLDI1NSwyNTUsMTYsMzgsCisJMjQyLDI1NSwxNjAsMjAsMCwwLDAsMCwxMCwwLDExOSwyMiwKKwkwLDIyLDIwLDAsMjU1LDI1NSwxNiwzOCw4LDAsMjIsMTgsCisJMywzOCwyLDAsMjU1LDI1NSwxOCwzNiwxOTYsNjQsMTkyLDEyLAorCTMyLDAsNCwzNiwyNTUsMjU1LDE2LDM4LDI1MiwyNTUsMTgsMjIsCisJMCwyMiwyMCwwLDMsMzgsMiwwLDMsMCwxMjgsMTYsCisJMCwwLDAsMCwxOTYsNjQsMTkyLDEyLDAsMCwwLDAsCisJMTQsMCwxMjYsMjIsMCwwLDAsMCwyNTUsMjU1LDE2LDM4LAorCTExLDAsMjIsMTgsMjU1LDI1NSwxOCwzNiwxOTYsNjQsMTkyLDEyLAorCTQ4LDAsNCwzNiwyNTUsMjU1LDE2LDM4LDYsMCwxOCwxOCwKKwkwLDAsMCwwLDc1LDYyLDE5Miw4LDAsMCwwLDAsCisJMCwzOCw0LDAsMTk2LDY0LDE5MiwxMiwzLDM4LDQsMCwKKwkwLDAsMzQsMTMwLDAsMCwzNiwxNDYsMCwwLDAsMCwKKwkyNDksMjU1LDY0LDIwLDEsMCw0OSwzOCwyNTUsMjU1LDQ5LDM4LAorCTMsMCw2LDM2LDE2NiwwLDEwMiwyMiwxLDAsMTYyLDM4LAorCTI1NSwyNTUsMTYsMzgsMTYzLDAsMjIsMTgsMjU1LDI1NSwxNywzNiwKKwkxOTYsNjQsMTkyLDEyLDMyLDAsNCwzNiwyNTUsMjU1LDE2LDM4LAorCTI1MiwyNTUsMTcsMjIsMSwwLDE2MiwzOCwzLDYzLDE5Miw4LAorCTAsMCwwLDAsMTkyLDEzMiwxNDQsMzksMTU2LDcxLDE5MiwxMiwKKwkzMywzMiwwLDIsMTEyLDYyLDE5Miw4LDAsMCwwLDAsCisJMCwzOCw0LDAsMTk2LDY0LDE5MiwxMiwzLDM4LDQsMCwKKwkwLDAsMiwxMzAsMCwwLDQsMTQ2LDAsMCwwLDAsCisJMjQ5LDI1NSw2NCwyMCwxLDAsMTYsMzgsMTYsMCwzLDM2LAorCTMzLDEyOCwzMiwyLDMzLDQwLDY0LDIsMzMsMTYwLDAsMCwKKwk1MSwwLDE3NywzOSw1MSwwLDE2MCwxNjMsMjcsMCwxNjMsMCwKKwkyLDAsOTYsMjAsMCwwLDAsMCwxMywwLDcsMCwKKwkxOCw0MCwwLDAsMTYsMTYsMCwwLDIsMTMxLDEsNjAsCisJMzMsOCwzNCwwLDEyOCwyMDUsMzQsMTQ0LDI1NSwyNTUsNDksMzgsCisJMiwwLDAsMTgsMCwwLDM0LDE2MiwyNTUsMjU1LDE2LDM4LAorCTI0MiwyNTUsMTYwLDIwLDAsMCwwLDAsMTAsMCwxMTksMjIsCisJMCwyMiwyMCwwLDI1NSwyNTUsMTYsMzgsOCwwLDIyLDE4LAorCTMsMzgsMiwwLDI1NSwyNTUsMTgsMzYsMTk2LDY0LDE5MiwxMiwKKwkzMiwwLDQsMzYsMjU1LDI1NSwxNiwzOCwyNTIsMjU1LDE4LDIyLAorCTAsMjIsMjAsMCwzLDM4LDIsMCwzLDAsMTI4LDE2LAorCTAsMCwwLDAsMTk2LDY0LDE5MiwxMiwwLDAsMCwwLAorCTE0LDAsMTI2LDIyLDAsMCwwLDAsMjU1LDI1NSwxNiwzOCwKKwkxMSwwLDIyLDE4LDI1NSwyNTUsMTgsMzYsMTk2LDY0LDE5MiwxMiwKKwk0OCwwLDQsMzYsMjU1LDI1NSwxNiwzOCw2LDAsMTgsMTgsCisJMCwwLDAsMCwxNTksNjIsMTkyLDgsMCwwLDAsMCwKKwkwLDM4LDQsMCwxOTYsNjQsMTkyLDEyLDMsMzgsNCwwLAorCTAsMCwzNCwxMzAsMCwwLDM2LDE0NiwwLDAsMCwwLAorCTI0OSwyNTUsNjQsMjAsMSwwLDQ5LDM4LDI1NSwyNTUsNDksMzgsCisJMywwLDYsMzYsODIsMCwxMDIsMjIsMSwwLDE2MiwzOCwKKwkyNTUsMjU1LDE2LDM4LDc5LDAsMjIsMTgsMjU1LDI1NSwxNywzNiwKKwkxOTYsNjQsMTkyLDEyLDMyLDAsNCwzNiwyNTUsMjU1LDE2LDM4LAorCTI1MiwyNTUsMTcsMjIsMSwwLDE2MiwzOCwzLDYzLDE5Miw4LAorCTAsMCwwLDAsMTU2LDcxLDE5MiwxMiwzMywzMiw2NCwyLAorCTMzLDI0LDY0LDAsNDIsMTYsMTEzLDAsMiwwLDY0LDE2LAorCTMzLDMyLDAsMCwzNSwzMiwzNSwyLDEwLDAsMTE5LDIyLAorCTMzLDEyOCwxMjgsMCwyNTUsMjU1LDE2LDM4LDcsMCwyMiwxOCwKKwkwLDAsMCwwLDI1NSwyNTUsMTcsMzYsMTk2LDY0LDE5MiwxMiwKKwkzMiwwLDQsMzYsMjU1LDI1NSwxNiwzOCwyNTIsMjU1LDE3LDIyLAorCTAsMCwwLDAsMTQsMCwxMjYsMjIsMCwwLDAsMCwKKwkyNTUsMjU1LDE2LDM4LDExLDAsMjIsMTgsMjU1LDI1NSwxNywzNiwKKwkxOTYsNjQsMTkyLDEyLDQ4LDAsNCwzNiwyNTUsMjU1LDE2LDM4LAorCTYsMCwxNywxOCwwLDAsMCwwLDIxMSw2MiwxOTIsOCwKKwkwLDAsMCwwLDAsMzgsNCwwLDE5Niw2NCwxOTIsMTIsCisJMywzOCw0LDAsMCwwLDY2LDEzMCwwLDAsNjgsMTQ2LAorCTAsMCwwLDAsMjQ5LDI1NSw2NCwyMCwxLDAsODIsMzgsCisJMjU1LDI1NSw4MiwzOCwzLDAsNiwzNiwzMCwwLDEwMiwyMiwKKwkxLDAsMTYyLDM4LDI1NSwyNTUsMTYsMzgsMjcsMCwyMiwxOCwKKwkyNTUsMjU1LDE3LDM2LDE5Niw2NCwxOTIsMTIsMzIsMCw0LDM2LAorCTI1NSwyNTUsMTYsMzgsMjUyLDI1NSwxNywyMiwxLDAsMTYyLDM4LAorCTMsNjMsMTkyLDgsMCwwLDAsMCwyNTMsNjIsMTkyLDgsCisJMywwLDE5LDM2LDMsMCw5NiwyMiwxMjgsMTYsMTcsMCwKKwkyLDAsMTksMzYsMTI4LDE2LDE3LDAsMzMsMTYsODEsMCwKKwk2NCwxNiwyLDAsMCwwLDE2MywxMzAsMjA4LDI1NSw2NiwzNiwKKwkyLDAsOTYsMjIsMzMsMTM2LDY3LDAsMSwwLDE5LDM2LAorCTEsMCwxODEsMzgsMCwwLDE2MiwxMzAsMCwwLDAsMCwKKwkzMywyNTQsNjQsMjAsMCwwLDAsMCwxLDAsMTMwLDM2LAorCTIyMCwwLDE5MSwxNDMsMjE2LDAsMTkwLDE0MywyMTIsMCwxODMsMTQzLAorCTIwOCwwLDE4MiwxNDMsMjA0LDAsMTgxLDE0MywyMDAsMCwxODAsMTQzLAorCTE5NiwwLDE3OSwxNDMsMTkyLDAsMTc4LDE0MywxODgsMCwxNzcsMTQzLAorCTE4NCwwLDE3NiwxNDMsOCwwLDIyNCwzLDIyNCwwLDE4OSwzOSwKKwkwLDAsMTY0LDE3NSw0LDAsMTY1LDE3NSw4LDAsMTY2LDE3NSwKKwkxMiwwLDE2NywxNzUsMjAwLDI1NSwxODksMzksNTksMCwxNjIsMzksCisJMjUyLDI1NSwzLDM2LDM2LDE2LDY3LDAsNTIsMCwxOTEsMTc1LAorCTQ4LDAsMTgwLDE3NSw0NCwwLDE3OSwxNzUsNDAsMCwxNzgsMTc1LAorCTM2LDAsMTc3LDE3NSwzMiwwLDE3NiwxNzUsNTYsMCwxNjQsMTc1LAorCTAsMCw4MCwxNDAsNCwwLDgxLDM2LDAsMCwyLDEzMCwKKwkwLDAsMywxNDYsMCwwLDAsMCwzMSwwLDY0LDE2LAorCTM3LDAsMjAsMzYsNjksMCwxOSwzNiwyNTIsMjU1LDE4LDM2LAorCTAsMjIsMywwLDMsMzgsMiwwLDE4LDAsMTQ4LDIwLAorCTAsMCwwLDAsMSwwLDMsMTMwLDAsMCwwLDAsCisJNCwwLDEwMCwxNiwzMywzMiwwLDIsNCwwLDExNSwyMCwKKwkzLDAsMzQsMzgsMzMsMzIsMCwyLDU2LDYzLDE5Miw4LAorCTMzLDQwLDAsMCwzNiwxNiw4MiwwLDQsMCw4MSwzNiwKKwkwLDAsNjksMTQwLDMzLDMyLDAsMiwxMyw2MSwxOTIsMTIsCisJMCwwLDAsMCw2Miw2MywxOTIsOCwzMywxMjgsNjQsMCwKKwkxOTYsNjQsMTkyLDEyLDEsMCwxNiwzOCwwLDAsMiwxMzAsCisJMCwwLDMsMTQ2LDAsMCwwLDAsMjMwLDI1NSw2NCwyMCwKKwkwLDIyLDMsMCw1MiwwLDE5MSwxNDMsNDgsMCwxODAsMTQzLAorCTQ0LDAsMTc5LDE0Myw0MCwwLDE3OCwxNDMsMzYsMCwxNzcsMTQzLAorCTMyLDAsMTc2LDE0Myw4LDAsMjI0LDMsNTYsMCwxODksMzksCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCw4LDAsMjI0LDMsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsOCwwLDIyNCwzLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTgsMCwyMjQsMywwLDAsMCwwLDMzLDcyLDIyNCwzLAorCTE3MCwzLDgsMzYsNzYsNjMsMTkyLDEyLDAsMCwwLDAsCisJMjU1LDI1NSw4LDMzLDI1MiwyNTUsMCwyMSwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCw4LDAsMzIsMSwKKwkwLDAsMCwwLDMzLDg4LDIyNCwzLDIzMiwzLDEwLDM2LAorCTE0Myw2MywxOTIsMTIsMCwwLDAsMCwyNTUsMjU1LDc0LDMzLAorCTI1MiwyNTUsNjQsMjEsMCwwLDAsMCw4LDAsOTYsMSwKKwkwLDAsMCwwLDI1MCwyNTUsMTMyLDMyLDEzMCwzMiw0LDAsCisJMjU1LDI1NSwxMzIsMzIsMCwwLDAsMCwyNTMsMjU1LDEyOCwyMCwKKwkwLDAsMCwwLDgsMCwyMjQsMywwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTI0OCwyNTUsMTg5LDM5LDI1NSwyNTUsMTk1LDM2LDEwLDAsMTkyLDE2LAorCTMzLDU2LDE2MCwwLDI1NSwyNTUsNiwzNiwwLDAsMTYyLDE0NCwKKwkxLDAsMTY1LDM2LDAsMCwxMzAsMTYwLDQsMCw2NCwxNiwKKwkxLDAsMTMyLDM2LDI1NSwyNTUsOTksMzYsMjQ5LDI1NSwxMDIsMjAsCisJMCwwLDAsMCwzMywxNiwyMjQsMCw4LDAsMjI0LDMsCisJOCwwLDE4OSwzOSwwLDk2LDIsNjQsMCwwLDAsMCwKKwkzOCw2NCw2OCwwLDEsMjU1LDgsNDksMzgsNjQsMiwxLAorCTAsOTYsMTM2LDY0LDgsMCwyMjQsMywxLDI1NSw2Niw0OCwKKwkwLDk2LDIsNjQsMCwwLDAsMCwxLDI1NSwxMzIsNDgsCisJMzksMzIsMTI4LDAsMzYsNjQsNjgsMCwwLDk2LDEzNiw2NCwKKwk4LDAsMjI0LDMsMSwyNTUsNjYsNDgsMCw5NiwyLDY0LAorCTAsMCwwLDAsMCwyNTUsMTMyLDQ4LDM3LDY0LDY4LDAsCisJMSwwLDgsNTMsMCw5NiwxMzYsNjQsOCwwLDIyNCwzLAorCTEsMjU1LDY2LDQ4LDE3NiwyNTUsMTg5LDM5LDY0LDAsMTgyLDE3NSwKKwkzMywxNzYsMTI4LDAsNTIsMCwxNzksMTc1LDMzLDE1MiwxNjAsMCwKKwk3MiwwLDE5MCwxNzUsMzMsMjQwLDE5MiwwLDY4LDAsMTgzLDE3NSwKKwkzMywxODQsMjI0LDAsNjAsMCwxODEsMTc1LDMzLDE2OCwwLDAsCisJNTYsMCwxODAsMTc1LDMzLDE2MCwwLDAsNzYsMCwxOTEsMTc1LAorCTQ4LDAsMTc4LDE3NSw0NCwwLDE3NywxNzUsNDAsMCwxNzYsMTc1LAorCTIsMTMxLDYsNjAsMzMsNDgsMjEyLDAsMTYwLDIwNSwxOTgsMTQ0LAorCTAsMCwwLDAsMjgsMCw5NiwyNiwzMywxMjgsMCwwLAorCTMzLDI0LDE5MiwyLDMzLDMyLDExOCwyLDAsMCwxMDIsMTYwLAorCTEsMCw5OSwzNiw0MiwxNiwxMDAsMCwyNTIsMjU1LDY0LDIwLAorCTAsMCwwLDAsMTksMCw5NiwyNiwzMywxMjgsMCwwLAorCTI1NSwwLDIxMCw0OCwzMywxMzYsMTkyLDIsMCwwLDM5LDE0NiwKKwkwLDAsMCwwLDksMCwyNDIsMTYsMCwwLDAsMCwKKwk1LDAsMjI0LDE4LDMzLDQwLDAsMiw5NiwwLDE2NCwxNDMsCisJMCwwLDAsMCw5LDI0OCwyMjQsMiwzMyw0OCw2NCwyLAorCTMyLDAsMTkyLDIzLDEsMCwxODEsMzgsMSwwLDE2LDM4LAorCTQyLDE2LDE5LDIsMjQxLDI1NSw2NCwyMCwxLDAsNDksMzgsCisJMSwwLDE0OCwzOCw0LDAsMTMwLDQ2LDIyMCwyNTUsNjQsMjAsCisJMCwwLDAsMCw3LDAsOTYsMjYsMzMsMTI4LDAsMCwKKwkzMywyNCwxOTIsMiwwLDAsMTEyLDE2MCwxLDAsMTYsMzgsCisJNDIsMTYsMTksMiwyNTIsMjU1LDY0LDIwLDEsMCw5OSwzNiwKKwkyMCwwLDk2LDI2LDMzLDEyOCwwLDAsMzMsMTM2LDE5MiwyLAorCTAsMCwzOSwxNDYsMjU1LDAsNiw1MCwxMSwwLDIzMCwxNiwKKwkwLDAsMCwwLDUsMCwyMjQsMTgsMCwwLDAsMCwKKwk5NiwwLDE2NCwxNDMsMCwwLDAsMCw5LDI0OCwyMjQsMiwKKwkzMyw0MCwwLDIsMywwLDE5MiwxOSwxLDAsMTgxLDM4LAorCTcyLDY0LDE5Miw4LDEsMCwyLDM2LDEsMCwxNiwzOCwKKwk0MiwxNiwxOSwyLDIzOSwyNTUsNjQsMjAsMSwwLDQ5LDM4LAorCTMzLDE2LDE2MCwyLDc2LDAsMTkxLDE0Myw3MiwwLDE5MCwxNDMsCisJNjgsMCwxODMsMTQzLDY0LDAsMTgyLDE0Myw2MCwwLDE4MSwxNDMsCisJNTYsMCwxODAsMTQzLDUyLDAsMTc5LDE0Myw0OCwwLDE3OCwxNDMsCisJNDQsMCwxNzcsMTQzLDQwLDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJODAsMCwxODksMzksMTYwLDI1NSwxODksMzksODgsMCwxOTAsMTc1LAorCTMzLDI0MCwxMjgsMCw2OCwwLDE3OSwxNzUsMzMsMTUyLDE2MCwwLAorCTc2LDAsMTgxLDE3NSwzMywxNjgsMjI0LDAsNzIsMCwxODAsMTc1LAorCTMzLDE2MCwwLDAsMzMsMTYsOTYsMiw5MiwwLDE5MSwxNzUsCisJODQsMCwxODMsMTc1LDgwLDAsMTgyLDE3NSw2NCwwLDE3OCwxNzUsCisJNjAsMCwxNzcsMTc1LDU2LDAsMTc2LDE3NSwyLDAsOTcsNiwKKwkxNiwwLDE2NiwxNzUsMywwLDk4LDM4LDEzMSwxNTIsMiwwLAorCTMzLDE4NCwwLDAsMiwxMzEsMjIsNjAsMTY0LDIwNSwyMTQsMzgsCisJMCwwLDIxMCwxNDIsMCwwLDAsMCw3LDAsOTYsMTgsCisJMzMsMTI4LDAsMCwzMywyNCwxOTIsMywwLDAsMTE0LDE3MiwKKwkxLDAsMTYsMzgsNDMsMTYsMTksMiwyNTIsMjU1LDY0LDIwLAorCTQsMCw5OSwzNiwyMCwwLDk2LDE4LDMzLDEyOCwwLDAsCisJMzMsMTM2LDE5MiwzLDAsMCwzOSwxNDIsMCwwLDAsMCwKKwkxMSwwLDI0MiwxNiwxMjgsNDAsMTYsMCw1LDAsMTYwLDE4LAorCTAsMCwwLDAsMTEyLDAsMTY0LDE0MywwLDAsMCwwLAorCTksMjQ4LDE2MCwyLDMzLDQ4LDY0LDIsMTYsMCwxNjgsMTQzLAorCTAsMCwwLDAsMzQsMCwwLDIxLDEsMCwxNDgsMzgsCisJMSwwLDE2LDM4LDQzLDE2LDE5LDIsMjM5LDI1NSw2NCwyMCwKKwk0LDAsNDksMzgsMSwwLDI0NywzOCw0LDAsMjI2LDQ2LAorCTIyMiwyNTUsNjQsMjAsNCwwLDIxNCwzOCw3LDAsOTYsMTgsCisJMzMsMTI4LDAsMCwzMywyNCwxOTIsMywwLDAsMTEyLDE3MiwKKwkxLDAsMTYsMzgsNDMsMTYsMTksMiwyNTIsMjU1LDY0LDIwLAorCTQsMCw5OSwzNiwyMiwwLDk2LDE4LDMzLDEyOCwwLDAsCisJMzMsMTM2LDE5MiwzLDAsMCwzOSwxNDIsMCwwLDAsMCwKKwkxMywwLDI0MCwxNiwxMjgsNDAsMTYsMCw1LDAsMTYwLDE4LAorCTAsMCwwLDAsMTEyLDAsMTY0LDE0MywwLDAsMCwwLAorCTksMjQ4LDE2MCwyLDMzLDQ4LDAsMiwxNiwwLDE2OCwxNDMsCisJMCwwLDAsMCwzLDAsMCwxNywxLDAsMTQ4LDM4LAorCTE3NCw2NCwxOTIsOCwxLDAsMiwzNiwxLDAsMTYsMzgsCisJNDMsMTYsMTksMiwyMzcsMjU1LDY0LDIwLDQsMCw0OSwzOCwKKwkzMywxNiwxMjgsMiw5MiwwLDE5MSwxNDMsODgsMCwxOTAsMTQzLAorCTg0LDAsMTgzLDE0Myw4MCwwLDE4MiwxNDMsNzYsMCwxODEsMTQzLAorCTcyLDAsMTgwLDE0Myw2OCwwLDE3OSwxNDMsNjQsMCwxNzgsMTQzLAorCTYwLDAsMTc3LDE0Myw1NiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTk2LDAsMTg5LDM5LDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsMSwyLDM2LDAsMTYzLDEsNjAsMTc2LDEsMzIsMTcyLAorCTAsMTYzLDEsNjAsMTgwLDEsMzIsMTcyLDAsMTYzLDEsNjAsCisJOCwwLDIyNCwzLDE4NCwxLDM0LDE3MiwyMzIsMjU1LDE4OSwzOSwKKwkxNiwwLDE3NiwxNzUsMzMsMTI4LDEyOCwwLDIwLDAsMTkxLDE3NSwKKwkyMjAsNjMsMTkyLDEyLDMzLDMyLDAsMCwzMyw0MCw2NCwwLAorCTAsMTYzLDMsNjAsMTgwLDEsOTksMTQwLDAsMTYzLDIsNjAsCisJMTg0LDEsNjYsMTQwLDAsMTYzLDQsNjAsMTI4LDEsMTMyLDE0MCwKKwkxLDAsOTksMzYsMTEsMCwxMjgsMjAsMzYsMjQsOTgsMCwKKwkwLDE2MywyLDYwLDE3NiwxLDY2LDE0MCwwLDAsMCwwLAorCTYsMCw5OCwyMCwwLDAsMCwwLDAsMTYzLDIsNjAsCisJMTI4LDEsNjYsMTQwLDAsMCwwLDAsMjQ3LDI1NSw2NCwxNiwKKwkwLDAsMCwwLDAsMTYzLDIsNjAsMTgwLDEsNjYsMTQwLAorCTMzLDMyLDE2MCwwLDAsMTYzLDEsNjAsMzMsOCwzNCwwLAorCTE4OCwxLDQ4LDE2MCwwLDE2MywxLDYwLDIyMCw2MywxOTIsMTIsCisJMTgwLDEsMzUsMTcyLDIwLDAsMTkxLDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDI0LDAsMTg5LDM5LDgsMCwyMjQsMywKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDE5MiwyNTUsMTg5LDM5LDMzLDgwLDAsMCwKKwk4MCwwLDE4NSwxNDMsODQsMCwxODQsMTQzLDg4LDAsMTc1LDE0MywKKwkxLDAsMiwzNiw2MCwwLDE3NywxNzUsOTIsMCwxNzcsMTQzLAorCTQsMTEyLDIyNiwwLDEyLDAsMjI0LDI0LDU2LDAsMTc2LDE3NSwKKwkxLDAsOSwzNiwzMyw2NCwxNjAsMywzMywyNCwzMiwzLAorCTAsMCw5OCwxNDAsNCwwLDk5LDM2LDEsMCw3NCwzNywKKwk0LDE2LDczLDAsMCwwLDIsMTczLDQyLDE2LDcxLDEsCisJMjQ5LDI1NSw2NCwyMCw0LDAsOCwzNyw0NiwwLDE5MiwyNSwKKwkzMyw4MCwwLDAsMjU1LDAsMTYsMzYsMzMsNzIsMCwwLAorCTAsMCwxNDUsMTcyLDAsMCwxNjAsMTY0LDM0LDAsMjI0LDI0LAorCTAsMCwyMDgsMTYwLDMzLDg4LDEyOCwwLDMzLDk2LDE2MCwwLAorCTMzLDEwNCwxOTIsMCwzMyw2NCwzMiwzLDMzLDI0LDE2MCwzLAorCTAsMCw5OCwxNDAsMCwwLDAsMCwzNiwxNiw2NiwxLAorCTE5LDAsNjQsMTYsMCwwLDAsMCwwLDAsMiwxNDEsCisJMCwwLDAsMCwxMjgsMTYsMiwwLDMzLDE2LDg4LDAsCisJMCwwLDY2LDE0MCwwLDAsMCwwLDAsMCw5OCwxNzMsCisJMCwwLDIsMTQxLDAsMCwwLDAsNjQsMTYsMiwwLAorCTMzLDE2LDc5LDAsMCwwLDY2LDE0OCwwLDAsMCwwLAorCTAsMCwxMzAsMTY1LDAsMCwyLDE0MSwwLDAsMCwwLAorCTQ3LDY1LDE5Miw4LDAsMCwxNjIsMTYxLDQsMCw4LDM3LAorCTEsMCw0MSwzNyw0MiwxNiwzOSwxLDIyOSwyNTUsNjQsMjAsCisJNCwwLDk5LDM2LDEsMCwxOTgsMzYsMiwwLDE2NSwzNiwKKwkxLDAsNzQsMzcsNDIsMTYsNzgsMSwyMTMsMjU1LDY0LDIwLAorCTQsMCwxMzIsMzYsNjAsMCwxNzcsMTQzLDU2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNjQsMCwxODksMzksMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMjE2LDI1NSwxODksMzksCisJNjMsMCwxMzIsNDgsMjgsMCwxNzksMTc1LDEyOCwxLDE0Nyw1MiwKKwk1MCwxMzMsMTMwLDE1MSw0OCwxMzMsMTMyLDE1MSwwLDEyOCwxMzEsMTUxLAorCTIwLDAsMTc3LDE3NSwxNiwwLDE3NiwxNzUsNSwxNjIsMTYsNjAsCisJMzIsMCwxOTEsMTc1LDI0LDAsMTc4LDE3NSwzOSwxNiw2OCwwLAorCTM2LDI0LDk4LDAsMCwxMjgsMTMxLDE2NywwLDAsMywxNjYsCisJNzYsNjMsMTkyLDEyLDAsMSwxNywzNiwwLDEyOCwxMzAsMTUxLAorCTQ4LDEzMywxMzEsMTUxLDUsMTYyLDE4LDYwLDM3LDE2LDY3LDAsCisJMCwxMjgsMTMwLDE2NywwLDAsMiwxNjYsMzYsMTYsNTEsMiwKKwk2LDAsNjQsMTYsMCwwLDAsMCwwLDEyOCwxMzEsMTUxLAorCTIwLDEzMywxMzAsMTUxLDAsMCwwLDAsOTYsNjUsMTkyLDgsCisJMzcsMjQsOTgsMCwyMCwxMzMsMTMwLDE1MSwwLDEyOCwxMzEsMTUxLAorCTM5LDE2LDIsMCwzNiwyNCw5OCwwLDAsMTI4LDEzMSwxNjcsCisJMCwwLDY3LDE2Niw3Niw2MywxOTIsMTIsNjYsMTM2LDE3LDAsCisJMCwxMjgsMTMwLDE1MSw1MCwxMzMsMTMxLDE1MSwwLDAsMCwwLAorCTM3LDE2LDY3LDAsMCwxMjgsMTMwLDE2Nyw3Niw2MywxOTIsMTIsCisJMCwwLDY2LDE2Niw1MCwxMzMsMTMwLDE1MSwwLDEyOCwxMzEsMTUxLAorCTM5LDE2LDIsMCwzNiwyNCw5OCwwLDI1NSwyNTUsMzQsNTAsCisJMCwxMjgsMTMxLDE2NywwLDAsNjcsMTY2LDIyNiwyNTUsNjQsMjAsCisJMzYsMTYsNTEsMiwzMywxMzYsMCwwLDE2LDAsMTYsMzYsCisJNSwxNjIsMTgsNjAsMjU1LDI1NSwxOSwzNiw3Niw2MywxOTIsMTIsCisJMCwwLDAsMCwwLDEyOCwxMzEsMTUxLDUwLDEzMywxMzAsMTUxLAorCTAsMCwwLDAsMzcsMjQsOTgsMCwwLDEyOCwxMzEsMTY3LAorCTc2LDYzLDE5MiwxMiwwLDAsNjcsMTY2LDgsMCwwLDE4LAorCTAsMCwwLDAsMCwwLDY3LDE1MCwyMCwxMzMsMTMwLDE1MSwKKwkwLDAsMCwwLDM2LDE2LDY3LDAsMiwwLDY0LDE2LAorCTY0LDEzNiwxNywwLDEsMCw0OSw1NCw3Niw2MywxOTIsMTIsCisJMjU1LDI1NSwxNiwzOCw1MCwxMzMsMTMwLDE1MSwwLDEyOCwxMzEsMTUxLAorCTM5LDE2LDIsMCwzNiwyNCw5OCwwLDAsMTI4LDEzMSwxNjcsCisJMjMwLDI1NSwxOSwyMiwwLDAsNjcsMTY2LDQ4LDEzMywxMzAsMTUxLAorCTAsMTI4LDEzMSwxNTEsMzksMTYsMiwwLDM2LDI0LDk4LDAsCisJNSwxNjIsMiw2MCwwLDEyOCwxMzEsMTY3LDAsMCw2NywxNjQsCisJMjU1LDI1NSwzNCw1MCwzMiwwLDE5MSwxNDMsMjgsMCwxNzksMTQzLAorCTI0LDAsMTc4LDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw0MCwwLDE4OSwzOSwyMDgsMjU1LDE4OSwzOSwKKwkzNiwwLDE4MSwxNzUsMzMsMTY4LDE2MCwwLDMyLDAsMTgwLDE3NSwKKwk2MywwLDE0OCw0OCwzMywzMiwxMjgsMiw0NCwwLDE5MSwxNzUsCisJNDAsMCwxODIsMTc1LDI4LDAsMTc5LDE3NSwyNCwwLDE3OCwxNzUsCisJMjAsMCwxNzcsMTc1LDYwLDY1LDE5MiwxMiwxNiwwLDE3NiwxNzUsCisJMzMsMTUyLDY0LDAsMjU1LDI1NSwxNjMsNTAsMjU1LDI1NSw5OCw1MCwKKwkzLDAsOTgsMjAsNDgsMSwyMiwzNiwyNDUsNjYsMTkyLDgsCisJMSwwLDIsMzYsNSwxNjIsMTYsNjAsNTAsMTMzLDEzMCwxNTEsCisJNDgsMTMzLDEzMiwxNTEsMCwxMjgsMTMxLDE1MSwzOSwxNiw2OCwwLAorCTM2LDI0LDk4LDAsMCwxMjgsMTMxLDE2NywwLDAsMywxNjYsCisJNzYsNjMsMTkyLDEyLDAsMSwxNywzNiwwLDEyOCwxMzAsMTUxLAorCTQ4LDEzMywxMzEsMTUxLDUsMTYyLDE4LDYwLDM3LDE2LDY3LDAsCisJMCwxMjgsMTMwLDE2NywwLDAsMiwxNjYsMzYsMTYsNTQsMiwKKwk2LDAsNjQsMTYsMCwwLDAsMCwwLDEyOCwxMzEsMTUxLAorCTIwLDEzMywxMzAsMTUxLDAsMCwwLDAsMjEwLDY1LDE5Miw4LAorCTM3LDI0LDk4LDAsMjAsMTMzLDEzMCwxNTEsMCwxMjgsMTMxLDE1MSwKKwkzOSwxNiwyLDAsMzYsMjQsOTgsMCwwLDEyOCwxMzEsMTY3LAorCTAsMCw2NywxNjYsNzYsNjMsMTkyLDEyLDY2LDEzNiwxNywwLAorCTAsMTI4LDEzMCwxNTEsNTAsMTMzLDEzMSwxNTEsMCwwLDAsMCwKKwkzNywxNiw2NywwLDAsMTI4LDEzMCwxNjcsNzYsNjMsMTkyLDEyLAorCTAsMCw2NiwxNjYsNTAsMTMzLDEzMCwxNTEsMCwxMjgsMTMxLDE1MSwKKwkzOSwxNiwyLDAsMzYsMjQsOTgsMCwyNTUsMjU1LDM0LDUwLAorCTAsMTI4LDEzMSwxNjcsMCwwLDY3LDE2NiwyMjYsMjU1LDY0LDIwLAorCTM2LDE2LDU0LDIsMjU1LDI1NSwxNjMsNTAsMjU1LDI1NSw5OCw1MCwKKwkzOSwxNiwyLDAsMzYsMjQsOTgsMCw4NCwwLDk2LDE2LAorCTE5MiwxLDE0Nyw1NCw1LDE2MiwxNiw2MCw1MCwxMzMsMTMwLDE1MSwKKwk0OCwxMzMsMTMyLDE1MSwwLDEyOCwxMzEsMTUxLDM5LDE2LDY4LDAsCisJMzYsMjQsOTgsMCwwLDEyOCwxMzEsMTY3LDAsMCwzLDE2NiwKKwk3Niw2MywxOTIsMTIsMCwxLDE3LDM2LDAsMTI4LDEzMCwxNTEsCisJNDgsMTMzLDEzMSwxNTEsNSwxNjIsMTgsNjAsMzcsMTYsNjcsMCwKKwkwLDEyOCwxMzAsMTY3LDAsMCwyLDE2NiwzNiwxNiw1MSwyLAorCTYsMCw2NCwxNiwwLDAsMCwwLDAsMTI4LDEzMSwxNTEsCisJMjAsMTMzLDEzMCwxNTEsMCwwLDAsMCw4LDY2LDE5Miw4LAorCTM3LDI0LDk4LDAsMjAsMTMzLDEzMCwxNTEsMCwxMjgsMTMxLDE1MSwKKwkzOSwxNiwyLDAsMzYsMjQsOTgsMCwwLDEyOCwxMzEsMTY3LAorCTAsMCw2NywxNjYsNzYsNjMsMTkyLDEyLDY2LDEzNiwxNywwLAorCTAsMTI4LDEzMCwxNTEsNTAsMTMzLDEzMSwxNTEsMCwwLDAsMCwKKwkzNywxNiw2NywwLDAsMTI4LDEzMCwxNjcsNzYsNjMsMTkyLDEyLAorCTAsMCw2NiwxNjYsNTAsMTMzLDEzMCwxNTEsMCwxMjgsMTMxLDE1MSwKKwkzOSwxNiwyLDAsMzYsMjQsOTgsMCwyNTUsMjU1LDM0LDUwLAorCTAsMTI4LDEzMSwxNjcsMCwwLDY3LDE2NiwyMjYsMjU1LDY0LDIwLAorCTM2LDE2LDUxLDIsNSwxNjIsMTYsNjAsNTAsMTMzLDEzMCwxNTEsCisJNDgsMTMzLDEzMiwxNTEsMCwxMjgsMTMxLDE1MSwzOSwxNiw2OCwwLAorCTM2LDI0LDk4LDAsMCwxMjgsMTMxLDE2Nyw3Niw2MywxOTIsMTIsCisJMCwwLDMsMTY2LDAsMTI4LDEzMSwxNTEsNDgsMTMzLDEzMCwxNTEsCisJMCwwLDAsMCwzNywyNCw5OCwwLDAsMCwzLDE2NiwKKwkwLDAsNCwxNTAsMjAsMTMzLDEzMCwxNTEsMCwxMjgsMTMxLDE2NywKKwkzNiwxNiw2OCwwLDksMCw2NCwyMCwwLDAsMCwwLAorCTc2LDYzLDE5MiwxMiwwLDAsMCwwLDAsMCwzLDE1MCwKKwkyMCwxMzMsMTMwLDE1MSwwLDAsMCwwLDM2LDE2LDY3LDAsCisJMjQ5LDI1NSw2NCwxNiwwLDAsMCwwLDQ4LDEzMywxMzAsMTUxLAorCTAsMTI4LDEzMSwxNTEsMzksMTYsMiwwLDM2LDI0LDk4LDAsCisJNSwxNjIsMiw2MCwwLDEyOCwxMzEsMTY3LDAsMCw2NywxNjQsCisJMjU1LDI1NSwxNjMsNTAsMjU1LDI1NSwyLDUyLDEyNSwwLDk4LDE2LAorCTY0LDEsMTQ3LDU0LDUsMTYyLDE2LDYwLDUwLDEzMywxMzAsMTUxLAorCTQ4LDEzMywxMzIsMTUxLDAsMTI4LDEzMSwxNTEsMzksMTYsNjgsMCwKKwkzNiwyNCw5OCwwLDAsMTI4LDEzMSwxNjcsMCwwLDMsMTY2LAorCTc2LDYzLDE5MiwxMiwwLDEsMTcsMzYsMCwxMjgsMTMwLDE1MSwKKwk0OCwxMzMsMTMxLDE1MSw1LDE2MiwxOCw2MCwzNywxNiw2NywwLAorCTAsMTI4LDEzMCwxNjcsMCwwLDIsMTY2LDM2LDE2LDUxLDIsCisJNiwwLDY0LDE2LDAsMCwwLDAsMCwxMjgsMTMxLDE1MSwKKwkyMCwxMzMsMTMwLDE1MSwwLDAsMCwwLDk1LDY2LDE5Miw4LAorCTM3LDI0LDk4LDAsMjAsMTMzLDEzMCwxNTEsMCwxMjgsMTMxLDE1MSwKKwkzOSwxNiwyLDAsMzYsMjQsOTgsMCwwLDEyOCwxMzEsMTY3LAorCTAsMCw2NywxNjYsNzYsNjMsMTkyLDEyLDY2LDEzNiwxNywwLAorCTAsMTI4LDEzMCwxNTEsNTAsMTMzLDEzMSwxNTEsMCwwLDAsMCwKKwkzNywxNiw2NywwLDAsMTI4LDEzMCwxNjcsNzYsNjMsMTkyLDEyLAorCTAsMCw2NiwxNjYsNTAsMTMzLDEzMCwxNTEsMCwxMjgsMTMxLDE1MSwKKwkzOSwxNiwyLDAsMzYsMjQsOTgsMCwyNTUsMjU1LDM0LDUwLAorCTAsMTI4LDEzMSwxNjcsMCwwLDY3LDE2NiwyMjYsMjU1LDY0LDIwLAorCTM2LDE2LDUxLDIsMzMsMTQ0LDE2MCwyLDAsMTI4LDE2LDUyLAorCTAsMTI4LDEzMCwxNTEsNDgsMTMzLDEzMSwxNTEsNSwxNjIsMTcsNjAsCisJMzcsMTYsNjcsMCw1LDE2MiwzLDYwLDAsMTI4LDEzMCwxNjcsCisJMCwwLDk4LDE2NCwzNiwxNiwxOCwyLDYsMCw2NCwxNiwKKwkwLDAsMCwwLDAsMTI4LDEzMSwxNTEsMjAsMTMzLDEzMCwxNTEsCisJMCwwLDAsMCwxMzYsNjYsMTkyLDgsMzcsMjQsOTgsMCwKKwkyMCwxMzMsMTMwLDE1MSwwLDEyOCwxMzEsMTUxLDM5LDE2LDIsMCwKKwkzNiwyNCw5OCwwLDAsMTI4LDEzMSwxNjcsMCwwLDM1LDE2NiwKKwk3Niw2MywxOTIsMTIsNjYsMTI4LDE2LDAsMCwxMjgsMTMwLDE1MSwKKwk1MCwxMzMsMTMxLDE1MSwwLDAsMCwwLDM3LDE2LDY3LDAsCisJMCwxMjgsMTMwLDE2Nyw3Niw2MywxOTIsMTIsMCwwLDM0LDE2NiwKKwk1MCwxMzMsMTMwLDE1MSwwLDEyOCwxMzEsMTUxLDM5LDE2LDIsMCwKKwkzNiwyNCw5OCwwLDI1NSwyNTUsMiw1MCwwLDEyOCwxMzEsMTY3LAorCTAsMCwzNSwxNjYsMjI2LDI1NSw2NCwyMCwzNiwxNiwxOCwyLAorCTUsMTYyLDE2LDYwLDUwLDEzMywxMzAsMTUxLDQ4LDEzMywxMzIsMTUxLAorCTAsMTI4LDEzMSwxNTEsMzksMTYsNjgsMCwzNiwyNCw5OCwwLAorCTAsMTI4LDEzMSwxNjcsNzYsNjMsMTkyLDEyLDAsMCwzLDE2NiwKKwkwLDEyOCwxMzEsMTUxLDQ4LDEzMywxMzAsMTUxLDAsMCwwLDAsCisJMzcsMjQsOTgsMCwwLDAsMywxNjYsMCwwLDQsMTUwLAorCTIwLDEzMywxMzAsMTUxLDAsMTI4LDEzMSwxNjcsMzYsMTYsNjgsMCwKKwk5LDAsNjQsMjAsMCwwLDAsMCw3Niw2MywxOTIsMTIsCisJMCwwLDAsMCwwLDAsMywxNTAsMjAsMTMzLDEzMCwxNTEsCisJMCwwLDAsMCwzNiwxNiw2NywwLDI0OSwyNTUsNjQsMTYsCisJMCwwLDAsMCw0OCwxMzMsMTMwLDE1MSwwLDEyOCwxMzEsMTUxLAorCTM5LDE2LDIsMCwzNiwyNCw5OCwwLDUsMTYyLDIsNjAsCisJMCwxMjgsMTMxLDE2NywwLDAsNjcsMTY0LDAsMSwxOSwzNiwKKwk1LDE2MiwxNiw2MCw1MCwxMzMsMTMwLDE1MSw0OCwxMzMsMTMyLDE1MSwKKwkwLDEyOCwxMzEsMTUxLDM5LDE2LDY4LDAsMzYsMjQsOTgsMCwKKwkwLDEyOCwxMzEsMTY3LDAsMCwzLDE2Niw3Niw2MywxOTIsMTIsCisJMCwxLDE3LDM2LDAsMTI4LDEzMCwxNTEsNDgsMTMzLDEzMSwxNTEsCisJNSwxNjIsMTgsNjAsMzcsMTYsNjcsMCwwLDEyOCwxMzAsMTY3LAorCTAsMCwyLDE2NiwzNiwxNiwxMTMsMiw2LDAsNjQsMTYsCisJMCwwLDAsMCwwLDEyOCwxMzEsMTUxLDIwLDEzMywxMzAsMTUxLAorCTAsMCwwLDAsMjIwLDY2LDE5Miw4LDM3LDI0LDk4LDAsCisJMjAsMTMzLDEzMCwxNTEsMCwxMjgsMTMxLDE1MSwzOSwxNiwyLDAsCisJMzYsMjQsOTgsMCwwLDEyOCwxMzEsMTY3LDAsMCw2NywxNjYsCisJNzYsNjMsMTkyLDEyLDY2LDEzNiwxNywwLDAsMTI4LDEzMCwxNTEsCisJNTAsMTMzLDEzMSwxNTEsMCwwLDAsMCwzNywxNiw2NywwLAorCTAsMTI4LDEzMCwxNjcsNzYsNjMsMTkyLDEyLDAsMCw2NiwxNjYsCisJNTAsMTMzLDEzMCwxNTEsMCwxMjgsMTMxLDE1MSwzOSwxNiwyLDAsCisJMzYsMjQsOTgsMCwyNTUsMjU1LDM0LDUwLDAsMTI4LDEzMSwxNjcsCisJMCwwLDY3LDE2NiwyMjYsMjU1LDY0LDIwLDM2LDE2LDExMywyLAorCTYwLDY1LDE5MiwxMiwzMywzMiwxMjgsMiwzOCwxNiwxNjIsMiwKKwkyNTUsMjU1LDY2LDQ4LDEsMCw2Niw0NCw0NCwwLDE5MSwxNDMsCisJNDAsMCwxODIsMTQzLDM2LDAsMTgxLDE0MywzMiwwLDE4MCwxNDMsCisJMjgsMCwxNzksMTQzLDI0LDAsMTc4LDE0MywyMCwwLDE3NywxNDMsCisJMTYsMCwxNzYsMTQzLDgsMCwyMjQsMyw0OCwwLDE4OSwzOSwKKwkyMjQsMjU1LDE4OSwzOSwyNCwwLDE3OCwxNzUsMzMsMTQ0LDAsMCwKKwk2NCwxNiw0LDAsMTYsMCwxNzYsMTc1LDMzLDEyOCw2OCwwLAorCTMzLDMyLDAsMiwyMCwwLDE3NywxNzUsMjU1LDI1NSwxNzcsNDgsCisJMjgsMCwxOTEsMTc1LDE2Miw2NSwxOTIsMTIsMzMsNDAsMzIsMiwKKwk4LDAsNjQsMTYsMSwwLDQsMzgsMTYyLDY1LDE5MiwxMiwKKwkzMyw0MCwzMiwyLDQsMCw2NCwxNiwyLDAsNCwzOCwKKwkxNjIsNjUsMTkyLDEyLDMzLDQwLDMyLDIsNDMsMTQ0LDIsMCwKKwkzMywxNiw2NCwyLDI4LDAsMTkxLDE0MywyNCwwLDE3OCwxNDMsCisJMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJMzIsMCwxODksMzksMjE2LDI1NSwxODksMzksNjQsMTYsNCwwLAorCTI0LDAsMTc4LDE3NSwzMywxNDQsNjgsMCwzMywzMiw2NCwyLAorCTM2LDAsMTkxLDE3NSwzMiwwLDE4MCwxNzUsMjgsMCwxNzksMTc1LAorCTIwLDAsMTc3LDE3NSw2MCw2NSwxOTIsMTIsMTYsMCwxNzYsMTc1LAorCTEsMCw4NCwzOCwzMywzMiwxMjgsMiw2MCw2NSwxOTIsMTIsCisJMzMsMTM2LDY0LDAsMiwwLDgzLDM4LDMzLDMyLDk2LDIsCisJNjAsNjUsMTkyLDEyLDMzLDEyOCw2NCwwLDI1NSwyNTUsMzUsNTAsCisJMjU1LDI1NSwxNyw1MCw4LDAsMTEzLDIwLDAsMCwwLDAsCisJMjU1LDI1NSw2Niw0OCwzLDAsMzQsMTgsMzMsMzIsOTYsMiwKKwkxNjIsNjUsMTkyLDEyLDMzLDQwLDMyLDIsNjYsNjcsMTkyLDgsCisJMzMsMTYsMzIsMiwyNTUsMjU1LDgwLDQ4LDQsMCwxMTIsMTYsCisJMzMsMzIsMTI4LDIsNSwwLDQ4LDIyLDI1NSwyNTUsMiwzNiwKKwkzMywzMiw2NCwyLDE2Miw2NSwxOTIsMTIsMzMsNDAsMCwyLAorCTMzLDE2LDAsMiwzNiwwLDE5MSwxNDMsMzIsMCwxODAsMTQzLAorCTI4LDAsMTc5LDE0MywyNCwwLDE3OCwxNDMsMjAsMCwxNzcsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsNDAsMCwxODksMzksCisJMCwwLDAsMCwwLDAsMCwwLDAsOTYsOCw2NCwKKwkwLDAsMCwwLDI1NCwyNTUsMSwzNiwzNiw3MiwxLDEsCisJMCw5NiwxMzcsNjQsMCwwLDEzMywxNjQsMiwwLDEzMiwzMiwKKwkyLDQ0LDUsMCwwLDAsMTMzLDE2NCwwLDk2LDEzNiw2NCwKKwk4LDAsMjI0LDMsMCwwLDAsMCwyMDgsMjU1LDE4OSwzOSwKKwkzMiwwLDE3OCwxNzUsMzMsMTQ0LDEyOCwwLDI4LDAsMTc3LDE3NSwKKwkzMywxMzYsMTYwLDAsMzYsMCwxNzksMTc1LDMzLDE1MiwxOTIsMCwKKwk0MCwwLDE4MCwxNzUsMzMsMTYwLDIyNCwwLDQ0LDAsMTkxLDE3NSwKKwkyLDAsMzIsMjIsMjQsMCwxNzYsMTc1LDI1NSwyNTUsMTcsMzYsCisJMCwwLDY2LDE0MiwwLDAsMCwwLDM2LDE2LDgxLDAsCisJMywwLDgzLDIwLDAsMCwwLDAsMTIxLDY3LDE5Miw4LAorCTEsMCwyLDM2LDExLDAsMTI4LDI2LDMzLDEyOCwwLDAsCisJMTQzLDYzLDE5MiwxMiwwLDAsMCwwLDAsMCw2NiwxNDIsCisJMCwwLDAsMCwzNiwxNiw4MSwwLDI0NiwyNTUsODMsMTYsCisJMSwwLDE2LDM4LDQyLDE2LDIwLDIsMjQ3LDI1NSw2NCwyMCwKKwkwLDAsMCwwLDMzLDE2LDAsMCw0NCwwLDE5MSwxNDMsCisJNDAsMCwxODAsMTQzLDM2LDAsMTc5LDE0MywzMiwwLDE3OCwxNDMsCisJMjgsMCwxNzcsMTQzLDI0LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNDgsMCwxODksMzksMjA4LDI1NSwxODksMzksMzIsMCwxNzgsMTc1LAorCTMzLDE0NCwxMjgsMCwyOCwwLDE3NywxNzUsMzMsMTM2LDE2MCwwLAorCTM2LDAsMTc5LDE3NSwzMywxNTIsMTkyLDAsNDAsMCwxODAsMTc1LAorCTMzLDE2MCwyMjQsMCw0NCwwLDE5MSwxNzUsMiwwLDMyLDIyLAorCTI0LDAsMTc2LDE3NSwyNTUsMjU1LDE3LDUyLDAsMCw2NiwxNTAsCisJMCwwLDAsMCwzNiwxNiw4MSwwLDMsMCw4MywyMCwKKwkwLDAsMCwwLDE2Miw2NywxOTIsOCwxLDAsMiwzNiwKKwkxMSwwLDEyOCwyNiwzMywxMjgsMCwwLDE0Myw2MywxOTIsMTIsCisJMCwwLDAsMCwwLDAsNjYsMTUwLDAsMCwwLDAsCisJMzYsMTYsODEsMCwyNDYsMjU1LDgzLDE2LDEsMCwxNiwzOCwKKwk0MiwxNiwyMCwyLDI0NywyNTUsNjQsMjAsMCwwLDAsMCwKKwkzMywxNiwwLDAsNDQsMCwxOTEsMTQzLDQwLDAsMTgwLDE0MywKKwkzNiwwLDE3OSwxNDMsMzIsMCwxNzgsMTQzLDI4LDAsMTc3LDE0MywKKwkyNCwwLDE3NiwxNDMsOCwwLDIyNCwzLDQ4LDAsMTg5LDM5LAorCTIwOCwyNTUsMTg5LDM5LDMyLDAsMTc4LDE3NSwzMywxNDQsMTI4LDAsCisJMjgsMCwxNzcsMTc1LDMzLDEzNiwxNjAsMCwzNiwwLDE3OSwxNzUsCisJMzMsMTUyLDE5MiwwLDQwLDAsMTgwLDE3NSwzMywxNjAsMjI0LDAsCisJNDQsMCwxOTEsMTc1LDIsMCwzMiwyMiwyNCwwLDE3NiwxNzUsCisJMjU1LDAsMTcsMzYsMCwwLDY2LDE0NiwwLDAsMCwwLAorCTM2LDE2LDgxLDAsMywwLDgzLDIwLDAsMCwwLDAsCisJMjAzLDY3LDE5Miw4LDEsMCwyLDM2LDExLDAsMTI4LDI2LAorCTMzLDEyOCwwLDAsMTQzLDYzLDE5MiwxMiwwLDAsMCwwLAorCTAsMCw2NiwxNDYsMCwwLDAsMCwzNiwxNiw4MSwwLAorCTI0NiwyNTUsODMsMTYsMSwwLDE2LDM4LDQyLDE2LDIwLDIsCisJMjQ3LDI1NSw2NCwyMCwwLDAsMCwwLDMzLDE2LDAsMCwKKwk0NCwwLDE5MSwxNDMsNDAsMCwxODAsMTQzLDM2LDAsMTc5LDE0MywKKwkzMiwwLDE3OCwxNDMsMjgsMCwxNzcsMTQzLDI0LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNDgsMCwxODksMzksMjA4LDI1NSwxODksMzksCisJMzIsMCwxNzgsMTc1LDMzLDE0NCwxMjgsMCwyOCwwLDE3NywxNzUsCisJMzMsMTM2LDE2MCwwLDM2LDAsMTc5LDE3NSwzMywxNTIsMTkyLDAsCisJNDAsMCwxODAsMTc1LDMzLDE2MCwyMjQsMCw0NCwwLDE5MSwxNzUsCisJMiwwLDMyLDIyLDI0LDAsMTc2LDE3NSwyNTUsMjU1LDE3LDM2LAorCTAsMCw2NiwxNDIsMCwwLDAsMCwzNiwxNiw4MSwwLAorCTMsMCw4MywyMCwwLDAsMCwwLDI0NCw2NywxOTIsOCwKKwkxLDAsMiwzNiwxMSwwLDEyOCwyNiwzMywxMjgsMCwwLAorCTE0Myw2MywxOTIsMTIsMCwwLDAsMCwwLDAsNjYsMTQyLAorCTAsMCwwLDAsMzYsMTYsODEsMCwyNDYsMjU1LDgzLDIwLAorCTEsMCwxNiwzOCw0MiwxNiwyMCwyLDI0NywyNTUsNjQsMjAsCisJMCwwLDAsMCwzMywxNiwwLDAsNDQsMCwxOTEsMTQzLAorCTQwLDAsMTgwLDE0MywzNiwwLDE3OSwxNDMsMzIsMCwxNzgsMTQzLAorCTI4LDAsMTc3LDE0MywyNCwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTQ4LDAsMTg5LDM5LDIwOCwyNTUsMTg5LDM5LDMyLDAsMTc4LDE3NSwKKwkzMywxNDQsMTI4LDAsMjgsMCwxNzcsMTc1LDMzLDEzNiwxNjAsMCwKKwkzNiwwLDE3OSwxNzUsMzMsMTUyLDE5MiwwLDQwLDAsMTgwLDE3NSwKKwkzMywxNjAsMjI0LDAsNDQsMCwxOTEsMTc1LDIsMCwzMiwyMiwKKwkyNCwwLDE3NiwxNzUsMjU1LDI1NSwxNyw1MiwwLDAsNjYsMTUwLAorCTAsMCwwLDAsMzYsMTYsODEsMCwzLDAsODMsMjAsCisJMCwwLDAsMCwyOSw2OCwxOTIsOCwxLDAsMiwzNiwKKwkxMSwwLDEyOCwyNiwzMywxMjgsMCwwLDE0Myw2MywxOTIsMTIsCisJMCwwLDAsMCwwLDAsNjYsMTUwLDAsMCwwLDAsCisJMzYsMTYsODEsMCwyNDYsMjU1LDgzLDIwLDEsMCwxNiwzOCwKKwk0MiwxNiwyMCwyLDI0NywyNTUsNjQsMjAsMCwwLDAsMCwKKwkzMywxNiwwLDAsNDQsMCwxOTEsMTQzLDQwLDAsMTgwLDE0MywKKwkzNiwwLDE3OSwxNDMsMzIsMCwxNzgsMTQzLDI4LDAsMTc3LDE0MywKKwkyNCwwLDE3NiwxNDMsOCwwLDIyNCwzLDQ4LDAsMTg5LDM5LAorCTIwOCwyNTUsMTg5LDM5LDMyLDAsMTc4LDE3NSwzMywxNDQsMTI4LDAsCisJMjgsMCwxNzcsMTc1LDMzLDEzNiwxNjAsMCwzNiwwLDE3OSwxNzUsCisJMzMsMTUyLDE5MiwwLDQwLDAsMTgwLDE3NSwzMywxNjAsMjI0LDAsCisJNDQsMCwxOTEsMTc1LDIsMCwzMiwyMiwyNCwwLDE3NiwxNzUsCisJMjU1LDAsMTcsMzYsMCwwLDY2LDE0NiwwLDAsMCwwLAorCTM2LDE2LDgxLDAsMywwLDgzLDIwLDAsMCwwLDAsCisJNzAsNjgsMTkyLDgsMSwwLDIsMzYsMTEsMCwxMjgsMjYsCisJMzMsMTI4LDAsMCwxNDMsNjMsMTkyLDEyLDAsMCwwLDAsCisJMCwwLDY2LDE0NiwwLDAsMCwwLDM2LDE2LDgxLDAsCisJMjQ2LDI1NSw4MywyMCwxLDAsMTYsMzgsNDIsMTYsMjAsMiwKKwkyNDcsMjU1LDY0LDIwLDAsMCwwLDAsMzMsMTYsMCwwLAorCTQ0LDAsMTkxLDE0Myw0MCwwLDE4MCwxNDMsMzYsMCwxNzksMTQzLAorCTMyLDAsMTc4LDE0MywyOCwwLDE3NywxNDMsMjQsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw0OCwwLDE4OSwzOSwwLDAsMCwwLAorCTAsMCwwLDAsMjQ4LDI1NSwxODksMzksMjU1LDI1NSwxOTUsMzYsCisJOCwwLDE5MiwxNiwzMyw1NiwxMjgsMCwyNTUsMjU1LDYsMzYsCisJMCwwLDE2MiwxNDQsMSwwLDE2NSwzNiwyNTUsMjU1LDk5LDM2LAorCTAsMCwxMzAsMTYwLDI1MSwyNTUsMTAyLDIwLDEsMCwxMzIsMzYsCisJMzMsMTYsMjI0LDAsOCwwLDIyNCwzLDgsMCwxODksMzksCisJMCwwLDAsMCwwLDAsMCwwLDAsOTYsOCw2NCwKKwkxLDAsOSw2MCwwLDk2LDEzNyw2NCwxNSwwLDEzOCw0OCwKKwkzMyw0MCwxNzAsMCwxOTIsMjU1LDE2NSwzNiwwLDAsMTI4LDE2MCwKKwkxNiwwLDEyOCwxNjAsMzIsMCwxMjgsMTYwLDI1MSwyNTUsMTYwLDI4LAorCTQ4LDAsMTI4LDE2MCw2NCwwLDEzMiwzNiwwLDk2LDEzNiw2NCwKKwkwLDAsMCwwLDAsMCwwLDAsOCwwLDIyNCwzLAorCTAsMCwwLDAsMCwwLDAsMCwxLDEzMSwyLDYwLAorCTIyNCwxNyw2NiwzNiwwLDMyLDksNjAsMzcsMTYsNzMsMCwKKwk4LDAsNjQsMCwwLDAsMCwwLDAsOTYsOCw2NCwKKwkzLDAsOSw2MCwwLDk2LDEzNyw2NCwxNSwwLDEzOCw0OCwKKwkzMyw0MCwxNzAsMCwxOTIsMjU1LDE2NSwzNiwwLDAsMTI4LDE2MCwKKwkxNiwwLDEyOCwxNjAsMzIsMCwxMjgsMTYwLDI1MSwyNTUsMTYwLDI4LAorCTQ4LDAsMTI4LDE2MCw2NCwwLDEzMiwzNiwwLDk2LDEzNiw2NCwKKwkwLDAsMCwwLDAsMCwwLDAsOCwwLDIyNCwzLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwxNjMsMyw2MCwxOTIsMyw5OSwxNDAsCisJMCwxNjMsMiw2MCwxODgsMyw2NiwxNDAsMCwwLDAsMCwKKwkxNiwwLDk4LDE2LDI1NSwyNTUsMiwzNiwwLDE2MywyLDYwLAorCTE4OCwzLDY2LDE0MCwwLDE2MywxLDYwLDMzLDgsMzQsMCwKKwkyMDAsMywzNCwxNDQsMCwxNjMsMyw2MCwxODgsMyw5OSwxNDAsCisJMCwxNjMsNCw2MCwxOTYsMywxMzIsMTQwLDAsMjIsMiwwLAorCTMsMjIsMiwwLDEsMCw5OSwzNiwzNiwyNCwxMDAsMCwKKwkwLDE2MywxLDYwLDE4OCwzLDM1LDE3Miw4LDAsMjI0LDMsCisJMCwwLDAsMCwwLDE2Myw2LDYwLDAsMSwxOTgsNTIsCisJMTAsMCw5LDM2LDI1NSwyNTUsOCwzNiwxMywwLDcsMzYsCisJMCwxNjMsMyw2MCwxOTIsMyw5OSwxNDAsMCwxNjMsMiw2MCwKKwkxODgsMyw2NiwxNDAsMCwwLDAsMCwxNywwLDk4LDE2LAorCTI1NSwyNTUsNSwzNiwwLDE2MywyLDYwLDE4OCwzLDY2LDE0MCwKKwkwLDAsMCwwLDMzLDE2LDcwLDAsMjAwLDIsNjYsMTQ0LAorCTAsMCwwLDAsMCwyMiwyLDAsMyw0NiwyLDAsCisJMCwxNjMsMiw2MCwxODgsMyw2NiwxNDAsMCwxNjMsMyw2MCwKKwkxOTYsMyw5OSwxNDAsMSwwLDY2LDM2LDM2LDE2LDY3LDAsCisJMCwxNjMsMSw2MCwxODgsMywzNCwxNzIsMTEsMCwxNjksMTYsCisJMTEsMCwxNjIsNDAsNSwwLDY0LDE2LDAsMCwwLDAsCisJMjI4LDI1NSwxNjgsMTYsMCwwLDAsMCwyMDYsNjgsMTkyLDgsCisJMCwwLDEzMywxNjAsMjI0LDI1NSwxNjcsMTYsMCwwLDAsMCwKKwkyMDYsNjgsMTkyLDgsMCwwLDEzMywxNjAsMjA4LDY4LDE5Miw4LAorCTAsMCwxMjgsMTYwLDE2OSw2OCwxOTIsOCwxLDAsMTMyLDM2LAorCTgsMCwyMjQsMywwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwyMDgsMjU1LDE4OSwzOSwyNCwwLDE3NiwxNzUsCisJMzMsMTI4LDEyOCwwLDM2LDAsMTc5LDE3NSwzMywxNTIsMTYwLDAsCisJMjgsMCwxNzcsMTc1LDMzLDEzNiwwLDAsMzIsMCwxNzgsMTc1LAorCTMzLDE0NCwwLDIsNSwwLDY0LDIyLDQwLDAsMTkxLDE3NSwKKwk1NCwwLDk2LDIyLDMzLDE2LDAsMCwyMiw2OSwxOTIsOCwKKwkwLDAsMzIsMTc0LDAsMCw2NywxMzAsMCwwLDAsMCwKKwkyMzMsNjgsMTkyLDgsMzIsMCwyLDM2LDAsMCwzLDEzMCwKKwkzMiwwLDIsMzYsMjUzLDI1NSw5OCwxNiwxLDAsMTYsMzgsCisJMjU1LDI1NSwxNiwzOCw5LDAsMiwzNiwyNDksMjU1LDk4LDE2LAorCTEsMCwxNiwzOCwyNTUsMjU1LDE2LDM4LDAsMCwzLDEzMCwKKwk0NSwwLDIsMzYsNCwwLDk4LDIwLDQzLDAsMiwzNiwKKwkxLDAsMTYsMzgsMjUwLDY4LDE5Miw4LDEsMCwxNywzNiwKKwkzLDAsOTgsMjAsMzMsMzIsMCwyLDEsMCwxNiwzOCwKKwkzMywzMiwwLDIsNDQsNjksMTkyLDEyLDE2LDAsMTY1LDM5LAorCTcsMCw5NiwxOCwzMywyNCw2NCwwLDE2LDAsMTYyLDE0MywKKwkwLDAsMCwwLDIsMCw4MCwyMCwwLDAsMCwwLAorCTMzLDE2LDY0LDIsMCwwLDk4LDE3NCw2LDAsMzIsMTgsCisJMCwxMjgsMiw2MCw0MywxNiw2NywwLDUsMCw2NCwyMCwKKwkyNTUsMTI3LDIsNjAsMTksNjksMTkyLDgsMzMsMTYsOTYsMCwKKwk1LDAsOTcsNCwyNTUsMTI3LDIsNjAsNywwLDMyLDE4LAorCTI1NSwyNTUsNjYsNTIsMjIsNjksMTkyLDgsMCwxMjgsMiw2MCwKKwkzMywxNiw5NiwwLDIsMCwzMiwxOCwwLDAsMCwwLAorCTM1LDE2LDIsMCw0MCwwLDE5MSwxNDMsMzYsMCwxNzksMTQzLAorCTMyLDAsMTc4LDE0MywyOCwwLDE3NywxNDMsMjQsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw0OCwwLDE4OSwzOSwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwyMDgsMjU1LDEzMCwzNiwKKwkxMCwwLDY2LDQ0LDcsMCw2NCwyMCwxLDAsMiwzNiwKKwkxOTEsMjU1LDEzMCwzNiw2LDAsNjYsNDQsMywwLDY0LDIwLAorCTEsMCwyLDM2LDE1OSwyNTUsMTMwLDM2LDYsMCw2Niw0NCwKKwk4LDAsMjI0LDMsMCwwLDAsMCwyNDgsMjU1LDE4OSwzOSwKKwkwLDAsMTc2LDE3NSwzMyw1NiwwLDAsMzMsNzIsMCwwLAorCTMzLDgwLDAsMCwzMywxMTIsMCwwLDUsMCwxMjgsMjAsCisJMzMsMjAwLDEyOCwwLDExMCwwLDE2MCwyMCwzMywxNiwwLDAsCisJMTYzLDY5LDE5Miw4LDAsMCwxOTIsMTczLDAsMCwxMzEsMTI4LAorCTMyLDAsMiwzNiwyNTMsMjU1LDk4LDE2LDEsMCwxMzIsMzYsCisJMjU1LDI1NSwxMzIsMzYsOSwwLDIsMzYsMjQ5LDI1NSw5OCwxNiwKKwkxLDAsMTMyLDM2LDI1NSwyNTUsMTMyLDM2LDAsMCwxMzEsMTI4LAorCTQzLDAsMiwzNiwzLDAsOTgsMjAsNDUsMCwyLDM2LAorCTc1LDY5LDE5Miw4LDEsMCwxMzIsMzYsMywwLDk4LDIwLAorCTAsMCwwLDAsMSwwLDEzMiwzNiwxLDAsMTQsMzYsCisJMywwLDE5MiwxNiwxNiwwLDIsMzYsMTYsMCwxOTQsMjAsCisJMCwwLDAsMCwwLDAsMTMxLDEyOCw0OCwwLDIsMzYsCisJOSwwLDk4LDIwLDEwLDAsMiwzNiwxLDAsMTMxLDEyOCwKKwk4OCwwLDIsMzYsMywwLDk4LDE2LDEyMCwwLDIsMzYsCisJMywwLDk4LDIwLDgsMCwyLDM2LDE2LDAsMiwzNiwKKwkyLDAsMTMyLDM2LDIsMCwxOTIsMjAsMCwwLDAsMCwKKwkzMyw0OCw2NCwwLDAsMCwxMzEsMTI4LDI1NSwyNTUsMiwzNiwKKwkyNywwLDcwLDAsMiwwLDE5MiwyMCwwLDAsMCwwLAorCTEzLDAsNywwLDE4LDY0LDAsMCwxNiwxOTIsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCw0MiwwLDk2LDE2LAorCTQ4LDAsOTgsNDQsNDgsMCwyMDcsMzYsMTEsMCwyMDUsNDAsCisJODcsMCwyMDQsMzYsNTUsMCwyMDMsMzYsNSwwLDY0LDIwLAorCTQzLDE2LDExMSwwLDMsMCw2NCwxNiwwLDAsMCwwLAorCTEzMCw2OSwxOTIsOCwyMDgsMjU1LDk5LDM2LDMwLDAsMTYwLDIxLAorCTk3LDAsOTgsNDQsNiwwLDY0LDIwLDY1LDAsOTgsNDQsCisJNDMsMTYsMTA4LDAsMywwLDY0LDE2LDY1LDAsOTgsNDQsCisJMTMwLDY5LDE5Miw4LDE2OSwyNTUsOTksMzYsMjEsMCw2NCwyMCwKKwk0MywxNiwxMDcsMCwxOSwwLDY0LDE2LDAsMCwwLDAsCisJMjAxLDI1NSw5OSwzNiw0MywxNiw3LDEsNiwwLDY0LDIwLAorCTEsMCw5LDM2LDYsMCwyMzIsMjAsMjQsMCwyMzAsMCwKKwk0MywxNiwzLDMsMywwLDY0LDE2LDAsMCwwLDAsCisJMSwwLDEwLDM2LDI0LDAsMjMwLDAsMSwwLDEzMiwzNiwKKwkxOCwxMjgsMCwwLDMzLDU2LDMsMiwwLDAsMTMxLDEyOCwKKwkwLDAsMCwwLDIyMCwyNTUsOTYsMjAsNDgsMCw5OCw0NCwKKwk1LDAsNjQsMTcsMCwwLDAsMCwxMywwLDE2MCwxNiwKKwkyNTUsMjU1LDIsMzYsMTYzLDY5LDE5Miw4LDAsMCwxNjQsMTcyLAorCTYsMCwxNjAsMTYsMCwwLDAsMCwzLDAsMzIsMjEsCisJMCwwLDAsMCwxNjAsNjksMTkyLDgsMCwwLDE4NSwxNzIsCisJMCwwLDE2NCwxNzIsMiwwLDE5MiwxNywzMywxNiwyMjQsMCwKKwkzNSwxNiwyLDAsMCwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTgsMCwxODksMzksMCwwLDAsMCwwLDAsMCwwLAorCTIwMCwyNTUsMTg5LDM5LDE2LDAsMTc2LDE3NSw3LDE2MiwxNiw2MCwKKwkyMzYsMCwxNiw1NCwyNTUsMjQwLDMsNjAsMjU1LDI1NSw5OSw1MiwKKwk2MywwLDEzMiw0OCwzNiwwLDE4MSwxNzUsMTI4LDEsMTQ5LDUyLAorCTI0LDAsMTc4LDE3NSwwLDEsMTgsMzYsMjAsMCwxNzcsMTc1LAorCTcsMTYyLDE3LDYwLDIzNiwwLDQ5LDU0LDQ0LDAsMTgzLDE3NSwKKwkwLDQsMjMsNjAsMzIsMCwxODAsMTc1LDI1NSwyNTEsMjAsNjAsCisJMjU1LDI1NSwxNDgsNTQsNDAsMCwxODIsMTc1LDAsMSwyMiw2MCwKKwkyOCwwLDE3OSwxNzUsMjU1LDI1NCwxOSw2MCw0OCwwLDE5MSwxNzUsCisJMCwwLDIsMTQyLDAsMCwwLDAsMzYsMTYsNjcsMCwKKwkyMjQsMTMzLDEzMCwxNzUsMCwwLDIsMTc0LDc2LDYzLDE5MiwxMiwKKwkyNTUsMjU1LDExNSw1NCwyMjQsMTMzLDEzMCwxNDMsMCwyLDMsNjAsCisJMzcsMTYsNjcsMCwyMjQsMTMzLDEzMCwxNzUsMCwwLDIsMTc0LAorCTM2LDE2LDg1LDIsNSwwLDY0LDE2LDAsMCwwLDAsCisJMjI0LDEzMywxMzAsMTQzLDAsMCwwLDAsMjE0LDY5LDE5Miw4LAorCTM3LDE2LDg3LDAsMjI0LDEzMywxMzAsMTQzLDAsMCwwLDAsCisJMzYsMTYsODQsMCwyMjQsMTMzLDEzMCwxNzUsNzYsNjMsMTkyLDEyLAorCTAsMCwzNCwxNzQsMjI0LDEzMywxMzAsMTQzLDAsMCwwLDAsCisJMzcsMTYsODYsMCwyMjQsMTMzLDEzMCwxNzUsMCwwLDM0LDE3NCwKKwk3Niw2MywxOTIsMTIsNjYsMTQ0LDE4LDAsMjI0LDEzMywxMzAsMTQzLAorCTAsMCwwLDAsMzYsMTYsODMsMCwyMjQsMTMzLDEzMCwxNzUsCisJMCwwLDM0LDE3NCwyNTUsMjU1LDY2LDUwLDIzMCwyNTUsNjQsMjAsCisJMzYsMTYsODUsMiwzMywxMzYsMCwwLDE2LDAsMTYsMzYsCisJNywxNjIsMTgsNjAsMjM2LDAsODIsNTQsMCwxLDIyLDYwLAorCTAsOCwyMSw2MCwyNTUsMjU0LDE5LDYwLDI1NSwyNTUsMTE1LDU0LAorCTI1NSwyNTUsMjAsMzYsNzYsNjMsMTkyLDEyLDAsMCwwLDAsCisJMjI0LDEzMywxMzAsMTQzLDAsMCwwLDAsMzcsMTYsODYsMCwKKwkyMjQsMTMzLDEzMCwxNzUsNzYsNjMsMTkyLDEyLDAsMCw2NiwxNzQsCisJNywwLDAsMTgsMCwwLDAsMCwwLDAsNjYsMTQyLAorCTAsMCwwLDAsMzYsMTYsODUsMCwyLDAsNjQsMTYsCisJNjQsMTM2LDE3LDAsMSwwLDQ5LDU0LDc2LDYzLDE5MiwxMiwKKwkyNTUsMjU1LDE2LDM4LDIyNCwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTM2LDE2LDgzLDAsMjI0LDEzMywxMzAsMTc1LDAsMCw2NiwxNzQsCisJMjMyLDI1NSwyMCwyMiw3LDE2Miw0LDYwLDIzNiwwLDEzMiw1MiwKKwkyNTUsMjUzLDMsNjAsMjI0LDEzMywxMzAsMTQzLDI1NSwyNTUsOTksNTIsCisJMzYsMTYsNjcsMCwyMjQsMTMzLDEzMCwxNzUsMCwwLDEzMCwxNzIsCisJMjU1LDI1NSwzNCw1MCw0OCwwLDE5MSwxNDMsNDQsMCwxODMsMTQzLAorCTQwLDAsMTgyLDE0MywzNiwwLDE4MSwxNDMsMzIsMCwxODAsMTQzLAorCTI4LDAsMTc5LDE0MywyNCwwLDE3OCwxNDMsMjAsMCwxNzcsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsNTYsMCwxODksMzksCisJMjAwLDI1NSwxODksMzksNDgsMCwxOTAsMTc1LDMzLDI0MCwxNjAsMCwKKwk0MCwwLDE4MiwxNzUsNjMsMCwxNTAsNDgsMzMsMzIsMTkyLDIsCisJNTIsMCwxOTEsMTc1LDQ0LDAsMTgzLDE3NSwzNiwwLDE4MSwxNzUsCisJMzIsMCwxODAsMTc1LDI4LDAsMTc5LDE3NSwyNCwwLDE3OCwxNzUsCisJMjAsMCwxNzcsMTc1LDE2OCw2OSwxOTIsMTIsMTYsMCwxNzYsMTc1LAorCTMzLDE1Miw2NCwwLDI1NSwyNTUsMTk1LDUxLDI1NSwyNTUsOTgsNTAsCisJMywwLDk4LDIwLDcsMTYyLDE2LDYwLDEzMSw3MSwxOTIsOCwKKwkxLDAsMiwzNiwyMzYsMCwxNiw1NCwyNTUsMjUyLDMsNjAsCisJMjU1LDI1NSw5OSw1MiwwLDEsMTgsMzYsNywxNjIsMTcsNjAsCisJMjM2LDAsNDksNTQsMjU1LDI1MSwyMSw2MCwyNTUsMjU1LDE4MSw1NCwKKwkwLDEsMjMsNjAsMjU1LDI1NCwyMCw2MCwyMjQsMTMzLDEzMCwxNDMsCisJMCwwLDAsMCwzNiwxNiw2NywwLDIyNCwxMzMsMTMwLDE3NSwKKwkwLDAsMiwxNzQsNzYsNjMsMTkyLDEyLDI1NSwyNTUsMTQ4LDU0LAorCTIyNCwxMzMsMTMwLDE0MywwLDIsMyw2MCwzNywxNiw2NywwLAorCTIyNCwxMzMsMTMwLDE3NSwwLDAsMiwxNzQsNDgsMSw2Niw1MCwKKwk1LDAsNjQsMTYsMCw0LDYsNjAsMjI0LDEzMywxMzAsMTQzLAorCTAsMCwwLDAsODMsNzAsMTkyLDgsMzcsMTYsNzAsMCwKKwkyMjQsMTMzLDEzMCwxNDMsMCwwLDAsMCwzNiwxNiw4NSwwLAorCTIyNCwxMzMsMTMwLDE3NSw3Niw2MywxOTIsMTIsMCwwLDM0LDE3NCwKKwkyMjQsMTMzLDEzMCwxNDMsMCwwLDAsMCwzNywxNiw4NywwLAorCTIyNCwxMzMsMTMwLDE3NSwwLDAsMzQsMTc0LDc2LDYzLDE5MiwxMiwKKwk2NiwxNDQsMTgsMCwyMjQsMTMzLDEzMCwxNDMsMCwwLDAsMCwKKwkzNiwxNiw4NCwwLDIyNCwxMzMsMTMwLDE3NSwwLDAsMzQsMTc0LAorCTI1NSwyNTUsNjYsNTAsMjMwLDI1NSw2NCwyMCw0OCwxLDY2LDUwLAorCTI1NSwyNTUsMTk1LDUxLDI1NSwyNTUsOTgsNTAsMzksMTYsMiwwLAorCTM2LDI0LDk4LDAsODgsMCw5NiwxNiwxOTIsMSwyMTMsNTQsCisJNywxNjIsMTYsNjAsMjM2LDAsMTYsNTQsMjU1LDI1MiwzLDYwLAorCTI1NSwyNTUsOTksNTIsMCwxLDE4LDM2LDcsMTYyLDE3LDYwLAorCTIzNiwwLDQ5LDU0LDI1NSwyNTEsMjAsNjAsMjU1LDI1NSwxNDgsNTQsCisJMCwxLDIzLDYwLDI1NSwyNTQsMTksNjAsMjI0LDEzMywxMzAsMTQzLAorCTAsMCwwLDAsMzYsMTYsNjcsMCwyMjQsMTMzLDEzMCwxNzUsCisJMCwwLDIsMTc0LDc2LDYzLDE5MiwxMiwyNTUsMjU1LDExNSw1NCwKKwkyMjQsMTMzLDEzMCwxNDMsMCwyLDMsNjAsMzcsMTYsNjcsMCwKKwkyMjQsMTMzLDEzMCwxNzUsMCwwLDIsMTc0LDM2LDE2LDg1LDIsCisJNSwwLDY0LDE2LDAsNCw2LDYwLDIyNCwxMzMsMTMwLDE0MywKKwkwLDAsMCwwLDE0MCw3MCwxOTIsOCwzNywxNiw3MCwwLAorCTIyNCwxMzMsMTMwLDE0MywwLDAsMCwwLDM2LDE2LDg0LDAsCisJMjI0LDEzMywxMzAsMTc1LDc2LDYzLDE5MiwxMiwwLDAsMzQsMTc0LAorCTIyNCwxMzMsMTMwLDE0MywwLDAsMCwwLDM3LDE2LDg3LDAsCisJMjI0LDEzMywxMzAsMTc1LDAsMCwzNCwxNzQsNzYsNjMsMTkyLDEyLAorCTY2LDE0NCwxOCwwLDIyNCwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTM2LDE2LDgzLDAsMjI0LDEzMywxMzAsMTc1LDAsMCwzNCwxNzQsCisJMjU1LDI1NSw2Niw1MCwyMzAsMjU1LDY0LDIwLDM2LDE2LDg1LDIsCisJNywxNjIsMTYsNjAsMjM2LDAsMTYsNTQsMjU1LDI1MiwzLDYwLAorCTIyNCwxMzMsMTMwLDE0MywyNTUsMjU1LDk5LDUyLDM2LDE2LDY3LDAsCisJMjI0LDEzMywxMzAsMTc1LDc2LDYzLDE5MiwxMiwwLDAsMiwxNzQsCisJMjI0LDEzMywxMzAsMTQzLDAsMiwzLDYwLDM3LDE2LDY3LDAsCisJMjI0LDEzMywxMzAsMTc1LDAsMCwyLDE3NCwwLDAsMiwxNDIsCisJMCw4LDMsNjAsMzYsMTYsNjcsMCwxMSwwLDY0LDIwLAorCTcsMTYyLDQsNjAsNywxNjIsMTYsNjAsMjM2LDAsMTYsNTQsCisJMCw4LDE3LDYwLDc2LDYzLDE5MiwxMiwwLDAsMCwwLAorCTAsMCwyLDE0MiwwLDAsMCwwLDM2LDE2LDgxLDAsCisJMjUwLDI1NSw2NCwxNiw3LDE2Miw0LDYwLDIzNiwwLDEzMiw1MiwKKwkyNTUsMjUzLDMsNjAsMjI0LDEzMywxMzAsMTQzLDI1NSwyNTUsOTksNTIsCisJMzYsMTYsNjcsMCwyMjQsMTMzLDEzMCwxNzUsMCwwLDEzMCwxNzIsCisJMjU1LDI1NSwxOTUsNTEsMjU1LDI1NSwyLDUyLDEzMywwLDk4LDE2LAorCTY0LDEsMjEzLDU0LDcsMTYyLDE2LDYwLDIzNiwwLDE2LDU0LAorCTI1NSwyNTIsMyw2MCwyNTUsMjU1LDk5LDUyLDAsMSwxOCwzNiwKKwk3LDE2MiwxNyw2MCwyMzYsMCw0OSw1NCwyNTUsMjUxLDIwLDYwLAorCTI1NSwyNTUsMTQ4LDU0LDAsMSwyMyw2MCwyNTUsMjU0LDE5LDYwLAorCTIyNCwxMzMsMTMwLDE0MywwLDAsMCwwLDM2LDE2LDY3LDAsCisJMjI0LDEzMywxMzAsMTc1LDAsMCwyLDE3NCw3Niw2MywxOTIsMTIsCisJMjU1LDI1NSwxMTUsNTQsMjI0LDEzMywxMzAsMTQzLDAsMiwzLDYwLAorCTM3LDE2LDY3LDAsMjI0LDEzMywxMzAsMTc1LDAsMCwyLDE3NCwKKwkzNiwxNiw4NSwyLDUsMCw2NCwxNiwwLDQsNiw2MCwKKwkyMjQsMTMzLDEzMCwxNDMsMCwwLDAsMCwyMzEsNzAsMTkyLDgsCisJMzcsMTYsNzAsMCwyMjQsMTMzLDEzMCwxNDMsMCwwLDAsMCwKKwkzNiwxNiw4NCwwLDIyNCwxMzMsMTMwLDE3NSw3Niw2MywxOTIsMTIsCisJMCwwLDM0LDE3NCwyMjQsMTMzLDEzMCwxNDMsMCwwLDAsMCwKKwkzNywxNiw4NywwLDIyNCwxMzMsMTMwLDE3NSwwLDAsMzQsMTc0LAorCTc2LDYzLDE5MiwxMiw2NiwxNDQsMTgsMCwyMjQsMTMzLDEzMCwxNDMsCisJMCwwLDAsMCwzNiwxNiw4MywwLDIyNCwxMzMsMTMwLDE3NSwKKwkwLDAsMzQsMTc0LDI1NSwyNTUsNjYsNTAsMjMwLDI1NSw2NCwyMCwKKwkzNiwxNiw4NSwyLDMzLDE2MCwxOTIsMyw3LDE2MiwyLDYwLAorCTIzNiwwLDY2LDUyLDAsMTI4LDE3LDUyLDcsMTYyLDE2LDYwLAorCTIzNiwwLDE2LDU0LDAsNCwyMyw2MCwyNTUsMjUxLDE5LDYwLAorCTI1NSwyNTUsMTE1LDU0LDAsMSwyMSw2MCwyNTUsMjU0LDE4LDYwLAorCTI1NSwyNTUsODIsNTQsMjI0LDEzMywxMzEsMTQzLDAsMiw0LDYwLAorCTM3LDI0LDEwMCwwLDIyNCwxMzMsMTMxLDE3NSwwLDAsNjcsMTcyLAorCTM2LDE2LDUyLDIsNSwwLDY0LDE2LDAsMCwwLDAsCisJMjI0LDEzMywxMzAsMTQzLDAsMCwwLDAsMjAsNzEsMTkyLDgsCisJMzcsMTYsODcsMCwyMjQsMTMzLDEzMCwxNDMsMCwwLDAsMCwKKwkzNiwxNiw4MywwLDIyNCwxMzMsMTMwLDE3NSw3Niw2MywxOTIsMTIsCisJMCwwLDIsMTc0LDIyNCwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTM3LDE2LDg1LDAsMjI0LDEzMywxMzAsMTc1LDAsMCwyLDE3NCwKKwk3Niw2MywxOTIsMTIsNjYsMTM2LDE3LDAsMjI0LDEzMywxMzAsMTQzLAorCTAsMCwwLDAsMzYsMTYsODIsMCwyMjQsMTMzLDEzMCwxNzUsCisJMCwwLDIsMTc0LDI1NSwyNTUsMzQsNTAsMjMwLDI1NSw2NCwyMCwKKwkzNiwxNiw1MiwyLDcsMTYyLDE2LDYwLDIzNiwwLDE2LDU0LAorCTI1NSwyNTIsMyw2MCwyMjQsMTMzLDEzMCwxNDMsMjU1LDI1NSw5OSw1MiwKKwkzNiwxNiw2NywwLDIyNCwxMzMsMTMwLDE3NSw3Niw2MywxOTIsMTIsCisJMCwwLDIsMTc0LDIyNCwxMzMsMTMwLDE0MywwLDIsMyw2MCwKKwkzNywxNiw2NywwLDIyNCwxMzMsMTMwLDE3NSwwLDAsMiwxNzQsCisJMCwwLDIsMTQyLDAsOCwzLDYwLDM2LDE2LDY3LDAsCisJMTEsMCw2NCwyMCw3LDE2Miw0LDYwLDcsMTYyLDE2LDYwLAorCTIzNiwwLDE2LDU0LDAsOCwxNyw2MCw3Niw2MywxOTIsMTIsCisJMCwwLDAsMCwwLDAsMiwxNDIsMCwwLDAsMCwKKwkzNiwxNiw4MSwwLDI1MCwyNTUsNjQsMTYsNywxNjIsNCw2MCwKKwkyMzYsMCwxMzIsNTIsMjU1LDI1MywzLDYwLDIyNCwxMzMsMTMwLDE0MywKKwkyNTUsMjU1LDk5LDUyLDM2LDE2LDY3LDAsMjI0LDEzMywxMzAsMTc1LAorCTAsMCwxMzAsMTcyLDcsMTYyLDE2LDYwLDIzNiwwLDE2LDU0LAorCTI1NSwyNTIsMyw2MCwyNTUsMjU1LDk5LDUyLDAsMSwxOCwzNiwKKwk3LDE2MiwxNyw2MCwyMzYsMCw0OSw1NCwwLDQsMjMsNjAsCisJMjU1LDI1MSwyMCw2MCwyNTUsMjU1LDE0OCw1NCwwLDEsMjEsNjAsCisJMjU1LDI1NCwxOSw2MCwyMjQsMTMzLDEzMCwxNDMsMCwwLDAsMCwKKwkzNiwxNiw2NywwLDIyNCwxMzMsMTMwLDE3NSwwLDAsMiwxNzQsCisJNzYsNjMsMTkyLDEyLDI1NSwyNTUsMTE1LDU0LDIyNCwxMzMsMTMwLDE0MywKKwkwLDIsMyw2MCwzNywxNiw2NywwLDIyNCwxMzMsMTMwLDE3NSwKKwkwLDAsMiwxNzQsMCwxLDY2LDUwLDUsMCw2NCwxNiwKKwkwLDAsMCwwLDIyNCwxMzMsMTMwLDE0MywwLDAsMCwwLAorCTEwOCw3MSwxOTIsOCwzNywxNiw4NywwLDIyNCwxMzMsMTMwLDE0MywKKwkwLDAsMCwwLDM2LDE2LDg0LDAsMjI0LDEzMywxMzAsMTc1LAorCTc2LDYzLDE5MiwxMiwwLDAsMzQsMTc0LDIyNCwxMzMsMTMwLDE0MywKKwkwLDAsMCwwLDM3LDE2LDg1LDAsMjI0LDEzMywxMzAsMTc1LAorCTAsMCwzNCwxNzQsNzYsNjMsMTkyLDEyLDY2LDE0NCwxOCwwLAorCTIyNCwxMzMsMTMwLDE0MywwLDAsMCwwLDM2LDE2LDgzLDAsCisJMjI0LDEzMywxMzAsMTc1LDAsMCwzNCwxNzQsMjU1LDI1NSw2Niw1MCwKKwkyMzAsMjU1LDY0LDIwLDAsMSw2Niw1MCwxNjgsNjksMTkyLDEyLAorCTMzLDMyLDE5MiwyLDM4LDE2LDE5NCwzLDI1NSwyNTUsNjYsNDgsCisJMSwwLDY2LDQ0LDUyLDAsMTkxLDE0Myw0OCwwLDE5MCwxNDMsCisJNDQsMCwxODMsMTQzLDQwLDAsMTgyLDE0MywzNiwwLDE4MSwxNDMsCisJMzIsMCwxODAsMTQzLDI4LDAsMTc5LDE0MywyNCwwLDE3OCwxNDMsCisJMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNTYsMCwxODksMzksMCwwLDAsMCwyNDgsMjU1LDE4OSwzOSwKKwkyNTUsMjU1LDE5NSwzNiw2LDAsMTkyLDE2LDMzLDE2LDEyOCwwLAorCTI1NSwyNTUsNiwzNiwwLDAsMTMzLDE2MCwyNTUsMjU1LDk5LDM2LAorCTI1MywyNTUsMTAyLDIwLDEsMCwxMzIsMzYsOCwwLDE4OSwzOSwKKwk4LDAsMjI0LDMsMCwwLDAsMCwxNTksNzEsMTkyLDgsCisJMzMsMjQsMCwwLDEsMCw5OSwzNiwwLDAsMTMwLDEyOCwKKwkwLDAsMCwwLDI1MiwyNTUsNjQsMjAsMSwwLDEzMiwzNiwKKwk4LDAsMjI0LDMsMzMsMTYsOTYsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMjU1LDE5OCwzNiwKKwkxMCwwLDE5MiwxNiwwLDAsMCwwLDAsMCwxMzEsMTI4LAorCTAsMCwxNjIsMTI4LDAsMCwwLDAsNSwwLDk4LDIwLAorCTAsMCwwLDAsMSwwLDEzMiwzNiwyNTUsMjU1LDE5OCwzNiwKKwkyNDgsMjU1LDE5MiwyMCwxLDAsMTY1LDM2LDAsMCwxMzEsMTQ0LAorCTAsMCwxNjIsMTQ0LDAsMCwwLDAsOCwwLDIyNCwzLAorCTM1LDE2LDk4LDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMTk2LDcxLDE5Miw4LDI0MCwyNTUsMTg5LDM5LAorCTAsMCwxNjMsMTI4LDMsMjIsMiwwLDgsMCw2NywyMCwKKwkwLDAsMCwwLDEsMCwxMzIsMzYsMSwwLDE2NSwzNiwKKwkwLDAsMTMwLDEyOCwwLDAsMTMxLDE0NCwwLDAsMCwwLAorCTI0NiwyNTUsNjQsMjAsMCwyMiwzLDAsMCwwLDEzMSwxNDQsCisJMCwwLDE2MiwxNDQsMCwwLDAsMCwzNSwxNiw5OCwwLAorCTgsMCwyMjQsMywxNiwwLDE4OSwzOSwwLDAsMCwwLAorCTI1NSwyNTUsMTk4LDM2LDksMCwxOTIsNCwzMywxNiwwLDAsCisJMCwwLDEzMCwxNDQsMCwwLDAsMCw1LDAsNjksMTYsCisJMzMsMTYsMTI4LDAsMjU1LDI1NSwxOTgsMzYsMjUwLDI1NSwxOTMsNCwKKwkxLDAsMTMyLDM2LDMzLDE2LDAsMCw4LDAsMjI0LDMsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwyLDAsMTkyLDIwLDI1NSwyNTUsMiwzNiwKKwkxLDAsMiwzNiw4LDAsMjI0LDMsMCwwLDIyNiwxNzIsCisJMjMyLDI1NSwxODksMzksMjAsMCwxOTEsMTc1LDE2LDAsMTc2LDE3NSwKKwk0MCwwLDE3NiwxNDMsMzMsMzIsMTkyLDAsNCwwLDUsMTQyLAorCTAsMCwwLDAsMTUsODYsMTkyLDEyLDI1NSwyNTUsMjMwLDQ4LAorCTMsMCw2NCwxNiwyNTUsMjU1LDIsMzYsMjQzLDcxLDE5Miw4LAorCTAsMCwyLDE3NCwwLDAsMCwxNzQsMjAsMCwxOTEsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsMjQsMCwxODksMzksCisJMjA4LDI1NSwxODksMzksNDAsMCwxOTEsMTc1LDMzLDI0LDEyOCwwLAorCTY0LDAsMTYyLDE0MywzMiwwLDE2MCwxNzUsMzYsMCwxNjIsMTc1LAorCTEyLDAsNjYsMTQ4LDAsMCwwLDAsMiwwLDY0LDIwLAorCTMzLDMyLDE2MCwwLDEyMCw1LDIsMzYsMjU1LDI1NSw2Niw0OCwKKwkxNiwwLDE2MiwxNzUsMSwxMzEsMiw2MCwxNDgsMzEsNjYsMzYsCisJMjAsMCwxNjIsMTc1LDEsMTMxLDIsNjAsMTI4LDMxLDY2LDM2LAorCTI0LDAsMTYyLDE3NSwzMiwwLDE2MiwzOSwyOCwwLDE2MiwxNzUsCisJMTY2LDg1LDE5MiwxMiwzMyw0MCw5NiwwLDMyLDAsMTYyLDE0MywKKwk0MCwwLDE5MSwxNDMsNDgsMCwxODksMzksOCwwLDIyNCwzLAorCTAsMCwwLDAsMCwwLDAsMCw4OCwwLDEzMSwxNDgsCisJNCwwLDIsMzYsOSwwLDk4LDIwLDAsMCwwLDAsCisJMzMsNzIsMTkyLDgsMTE2LDAsMTMyLDM2LDMzLDE2LDY5LDAsCisJMTI4LDE2LDIsMCw4LDAsMTMxLDE0MCwwLDAsMCwwLAorCTQ2LDcyLDE5Miw4LDMzLDE2LDY3LDAsMTA0LDAsMTMyLDM2LAorCTEyLDAsMTI4LDE2LDMzLDE2LDAsMCw0LDAsMTMwLDE0MCwKKwkwLDAsMCwwLDQyLDE2LDE2MiwwLDI0MywyNTUsNjQsMjAsCisJMCwxNyw1LDAsNCwwLDEzMCwxNDAsMTIsMCwxMzIsMTQwLAorCTAsMCwwLDAsMjQ3LDI1NSwxMjgsMjAsMzUsNDAsMTYyLDAsCisJMzMsMTYsMCwwLDgsMCwyMjQsMywwLDAsMCwwLAorCTg4LDAsMTMxLDE0OCw0LDAsMiwzNiwzLDAsOTgsMjAsCisJMzMsNDgsMCwwLDU1LDcyLDE5Miw4LDExNiwwLDEzMiwzNiwKKwkxMDQsMCwxMzIsMzYsOCwwLDEzMCwxNDAsMCwwLDAsMCwKKwk0MywxNiwxNjIsMCwxNCwwLDY0LDE2LDI1NSwyNTUsMiwzNiwKKwk5Miw3MiwxOTIsOCwwLDAsMCwwLDM1LDI0LDE2MywwLAorCTAsMTcsMywwLDM1LDE2LDY3LDAsMCwyNiwyLDAsCisJMzMsMTYsNjcsMCwwLDI4LDIsMCwzMywxNiw2NywwLAorCTM1LDE2LDIsMCwxMzEsMTYsMiwwLDkyLDcyLDE5Miw4LAorCTMzLDE2LDE5NCwwLDE4LDAsMTI4LDE2LDAsMCwwLDAsCisJNCwwLDEzMSwxNDAsMCwwLDAsMCwwLDE3LDMsMCwKKwkzMywxNiw2NywwLDEyOCwxNiwyLDAsOCwwLDEzMSwxNDAsCisJMCwwLDAsMCwzMywxNiw2NywwLDQzLDE2LDE2MiwwLAorCTIzMywyNTUsNjQsMjAsMCwwLDAsMCw0LDAsMTMwLDE0MCwKKwkxMiwwLDEzMiwxNDAsMCwwLDAsMCwyNDEsMjU1LDEyOCwyMCwKKwkzMyw0OCwxOTQsMCwyNTUsMjU1LDIsMzYsOCwwLDIyNCwzLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTgsMCwxMzAsMzYsMTQ0LDAsMTYzLDE0MCwxMjAsMTMyLDEzNSwzOSwKKwkyLDAsOTYsMTYsMjAsMCwxMzcsMzYsMzMsNTYsOTYsMCwKKwkwLDAsNzIsMTQwLDQsMCw2OCwxNDAsMTMyLDcyLDE5Miw4LAorCTAsMCwwLDAsMzAsMCwwLDI1LDAsMCwwLDAsCisJNCwwLDIyNywxNDAsMCwwLDAsMCw0LDAsOTgsMTQwLAorCTAsMCwwLDAsNTUsMCw2NCwxNiwyNTUsMjU1LDIsMzYsCisJMCwwLDEzNSwxNDAsMCwwLDk4LDE0MCwwLDAsMCwwLAorCTgsMCw3MSwxNiwwLDAsMCwwLDgsMCw5OSwzNiwKKwk0LDAsOTgsMTQwLDAsMCwwLDAsMjQ4LDI1NSw2NCwyMCwKKwkyNTUsMjU1LDIsMzYsMTY4LDcyLDE5Miw4LDAsMCwwLDAsCisJMCwwLDEzMCwxNDAsMCwwLDAsMCw0LDAsMzQsMTczLAorCTQsMCwxMDMsMTQwLDI1NSwyNTUsOCwzNyw0LDAsMTMyLDM2LAorCTAsMCwyMjYsMTQ4LDAsMCwwLDAsMSwwLDY2LDQ4LAorCTIyNiwyNTUsNjQsMTYsMCwwLDAsMCwwLDAsMjI2LDE0OCwKKwkwLDAsMCwwLDY0LDAsNjYsNDgsMjcsMCw2NCwyMCwKKwkyNTUsMjU1LDIsMzYsMCwwLDIyNiwxNDgsMCwwLDAsMCwKKwkxLDAsNjYsNDgsMTcsMCw2NCwxNiwwLDAsMCwwLAorCTEzLDAsMTkyLDE2LDEsMCwyLDM2LDY0LDAsMTYyLDE0MCwKKwkwLDAsMCwwLDksMCw2NCwyMCwxLDAsMiwzNiwKKwkyOCwwLDIyNiwxNDAsNCwwLDE2MywxNDAsMCwwLDAsMCwKKwkzNiwxNiw2NywwLDMsMCw2NCwyMCwxLDAsMiwzNiwKKwkxNjgsNzIsMTkyLDgsMjU1LDI1NSwyLDM2LDE2NCw3MiwxOTIsOCwKKwkwLDAsMzQsMTY1LDAsMCwzMiwxNjUsOCwwLDQwLDE3MywKKwkxMiwwLDM2LDE3MywxNiwwLDM5LDE3MywzMywxNiwwLDAsCisJOCwwLDIyNCwzLDAsMCwwLDAsMjAwLDI1NSwxODksMzksCisJNDgsMCwxOTEsMTc1LDQ0LDAsMTc5LDE3NSw0MCwwLDE3OCwxNzUsCisJMzYsMCwxNzcsMTc1LDMyLDAsMTc2LDE3NSwzMywxNTIsMTI4LDAsCisJMzMsMTI4LDE2MCwwLDMzLDE0NCwxOTIsMCwwLDAsNCwxNDIsCisJMCwwLDAsMCw0OCwwLDEzMCw0MCwyLDAsNjQsMTYsCisJOCwwLDExMywzOCw0OCwwLDQsMzYsMCwwLDM2LDE3NCwKKwk5LDUwLDE5MiwxMiwxMjgsMzIsNCwwLDMsMCw2NCwyMCwKKwk0LDAsMzQsMTc0LDIxNCw3MiwxOTIsOCwyNTUsMjU1LDIsMzYsCisJMTQ0LDAsNjYsMTQyLDEyMCwxMzIsMTMyLDM5LDIsMCw2NCwxNiwKKwkwLDAsMCwwLDMzLDMyLDY0LDAsMTYsMCwxNjAsMTc1LAorCTIwLDAsMTc5LDE3NSwyNCwwLDE3OCwxNzUsMCwwLDUsMTQyLAorCTQsMCw2LDE0MiwwLDAsMCwwLDIyMSw3MiwxOTIsMTIsCisJMzMsNTYsMzIsMiwzMywxMjgsNjQsMCw0LDAsMCwyNiwKKwkwLDAsMCwwLDAsMCwzNCwxNDIsMjE0LDcyLDE5Miw4LAorCTAsMCwwLDAsMTEwLDg2LDE5MiwxMiwzMywzMiwzMiwyLAorCTMzLDE2LDAsMiw0OCwwLDE5MSwxNDMsNDQsMCwxNzksMTQzLAorCTQwLDAsMTc4LDE0MywzNiwwLDE3NywxNDMsMzIsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw1NiwwLDE4OSwzOSwxODQsMjU1LDE4OSwzOSwKKwk2OCwwLDE5MSwxNzUsNjQsMCwxOTAsMTc1LDYwLDAsMTgzLDE3NSwKKwk1NiwwLDE4MiwxNzUsNTIsMCwxODEsMTc1LDQ4LDAsMTgwLDE3NSwKKwk0NCwwLDE3OSwxNzUsNDAsMCwxNzgsMTc1LDM2LDAsMTc3LDE3NSwKKwkzMiwwLDE3NiwxNzUsMzMsMTQ0LDEyOCwwLDMzLDE3NiwxNjAsMCwKKwkzMywxMzYsMjI0LDAsODgsMCwxODMsMTQzLDkyLDAsMTc5LDE0MywKKwk5NiwwLDE5MCwxNDMsMzIsMCwyMjYsMzgsMCwwLDM2LDE0MiwKKwkwLDAsMCwwLDQyLDE2LDEzMCwwLDIyLDAsNjQsMTYsCisJMzMsMTYwLDE5MiwwLDQsMCwxMzIsMzYsOSw1MCwxOTIsMTIsCisJMTI4LDMyLDQsMCwzMywxMjgsNjQsMCwzLDAsMCwyMiwKKwkzMywzMiwwLDIsMTUzLDczLDE5Miw4LDI1NSwyNTUsMiwzNiwKKwkwLDAsMzgsMTQyLDQsMCwzNywxNDIsMCwwLDAsMCwKKwk4MCw2OCwxOTIsMTIsMTI4LDQ4LDYsMCw0LDAsMzYsMTQyLAorCTYxLDUwLDE5MiwxMiwwLDAsMCwwLDQsMCw0OCwxNzQsCisJMCwwLDM0LDE0MiwwLDAsMCwwLDQsMCw2NiwzNiwKKwkwLDAsMzQsMTc0LDAsMCw2NiwxNTAsMCwwLDAsMCwKKwkxLDAsNjYsNDgsOTYsMCw2NCwyMCwwLDAsMCwwLAorCTMzLDAsMTkyLDMwLDAsMCwwLDAsNCwwLDgwLDE0MiwKKwkwLDAsMCwwLDQsMCwyLDE0MiwwLDAsMCwwLAorCTEwOCwwLDY0LDE2LDEyOCwxNjAsMjMsMCwxLDAsMjQyLDM4LAorCTQsMCwzNCwxNDIsMCwwLDAsMCwzMywxNiwxMzAsMiwKKwkwLDAsMywxNDIsMCwwLDAsMCwwLDAsNjcsMTcyLAorCTAsMCwyLDE0MiwwLDAsMCwwLDI0LDAsOTgsMTc0LAorCTE2LDAsMTc4LDE3NSwyMCwwLDE3OSwxNzUsMjQsMCwxOTAsMTc1LAorCTQsMCw0LDE0MiwzMyw0MCwwLDAsMzMsNDgsMCwwLAorCTIyMSw3MiwxOTIsMTIsMzMsNTYsMzIsMiwxMTIsMCw2NCwyMCwKKwk4LDAsMTYsMzgsNCwwLDIsMTQyLDAsMCwwLDAsCisJMjM0LDI1NSw2NCwyMCwzMywxNiwwLDAsMTUzLDczLDE5Miw4LAorCTAsMCwwLDAsNCwwLDgwLDE0MiwwLDAsMCwwLAorCTQsMCwyLDE0MiwwLDAsMCwwLDc2LDAsNjQsMTYsCisJMTI4LDE2OCwyMywwLDEsMCwyNDIsMzgsMCwwLDMsMTQyLAorCTAsMCwxMzIsMTQyLDAsMCwwLDAsNDMsMTYsMTAwLDAsCisJNDIsMCw2NCwyMCwwLDAsMCwwLDE5LDAsMTAwLDIwLAorCTI1NSwyNTUsMTk3LDM4LDQsMCwzNCwxNDIsMCwwLDAsMCwKKwkzMywxNiwxNjIsMiwwLDAsNjcsMTcyLDAsMCwyLDE0MiwKKwkwLDAsMCwwLDI0LDAsOTgsMTc0LDE2LDAsMTc4LDE3NSwKKwkyMCwwLDE3OSwxNzUsMjQsMCwxOTAsMTc1LDQsMCw0LDE0MiwKKwk0LDAsMTM0LDM4LDIyMSw3MiwxOTIsMTIsMzMsNTYsMzIsMiwKKwkyNSwwLDY0LDE2LDgsMCwxNiwzOCwxNTMsNzMsMTkyLDgsCisJMCwwLDAsMCwwLDAsMTMwLDE0MiwwLDAsMCwwLAorCTQzLDE2LDY3LDAsMTcsMCw2NCwxNiwzMyw0MCwwLDAsCisJNCwwLDM0LDE0MiwwLDAsMCwwLDMzLDE2LDE2MiwyLAorCTAsMCw2NywxNzIsMCwwLDIsMTQyLDAsMCwwLDAsCisJMjQsMCw5OCwxNzQsMTYsMCwxNzgsMTc1LDIwLDAsMTc5LDE3NSwKKwkyNCwwLDE5MCwxNzUsNCwwLDQsMTQyLDMzLDQ4LDAsMCwKKwkyMjEsNzIsMTkyLDEyLDMzLDU2LDMyLDIsNTIsMCw2NCwyMCwKKwkwLDAsMCwwLDgsMCwxNiwzOCw0LDAsMiwxNDIsCisJMCwwLDAsMCwyMDUsMjU1LDY0LDIwLDMzLDE2LDAsMCwKKwkxNTMsNzMsMTkyLDgsMCwwLDAsMCwwLDAsNjYsMTUwLAorCTAsMCwwLDAsNjQsMCw2Niw0OCw0MCwwLDY0LDIwLAorCTMzLDE2LDAsMCwzLDAsNjYsMTQ2LDAsMCwwLDAsCisJMSwwLDY2LDQ4LDExLDAsNjQsMTYsMzMsMjQsNjQsMiwKKwk2NCwwLDE5NCwxNDMsMCwwLDAsMCw5LDAsNjQsMjAsCisJMCwwLDAsMCwyOCwwLDk4LDE0MCw0LDAsMTk1LDE0MywKKwkwLDAsMCwwLDM2LDE2LDY3LDAsMywwLDY0LDIwLAorCTAsMCwwLDAsMTUzLDczLDE5Miw4LDMzLDE2LDAsMCwKKwkxNCwwLDE5MiwyNiwzMywxNiwyNDYsMiwwLDAsMzQsMTc0LAorCTQsMCwzNiwxNDIsMTI4LDEyOCwyMywwLDMzLDMyLDQsMiwKKwkzMyw0MCwxMjgsMiw4MCw2OCwxOTIsMTIsMTI4LDQ4LDIyLDAsCisJMjgsMCwxMTgsMTc0LDQsMCwzNCwxNDIsMCwwLDAsMCwKKwkzMywxMjgsMiwyLDE0OSw3MywxOTIsOCwzMiwwLDExMiwxNzQsCisJMCwwLDU1LDE3NCwyOCwwLDk2LDE3NCwzMiwwLDk2LDE3NCwKKwkzNiwwLDExNCwxNzQsMSwwLDIsMzYsMjAsMCw5OCwxNjYsCisJMSwwLDIsMzYsNjgsMCwxOTEsMTQzLDY0LDAsMTkwLDE0MywKKwk2MCwwLDE4MywxNDMsNTYsMCwxODIsMTQzLDUyLDAsMTgxLDE0MywKKwk0OCwwLDE4MCwxNDMsNDQsMCwxNzksMTQzLDQwLDAsMTc4LDE0MywKKwkzNiwwLDE3NywxNDMsMzIsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk3MiwwLDE4OSwzOSwzLDAsMTYwLDI4LDMzLDE2LDAsMCwKKwkwLDAsMjI0LDE3MiwxLDAsMiwzNiw4LDAsMjI0LDMsCisJMCwwLDAsMCwyMDgsMjU1LDE4OSwzOSw0NCwwLDE5MSwxNzUsCisJNDAsMCwxNzgsMTc1LDM2LDAsMTc3LDE3NSwzMiwwLDE3NiwxNzUsCisJMzMsMTQ0LDEyOCwwLDMzLDEzNiwyMjQsMCw2NCwwLDE3NiwxNDMsCisJMCwwLDAsMCw2LDAsMTYwLDI0LDI0LDAsMTYwLDE3NSwKKwkxNywwLDIsMTQ2LDAsMCwwLDAsMTgsMCw2Niw1MiwKKwkyMDAsNzMsMTkyLDgsMTcsMCwyLDE2MiwzMywzMiwzMiwyLAorCTMzLDQwLDAsMiwxLDAsNiwzNiwyNTMsNzYsMTkyLDEyLAorCTI0LDAsMTY3LDM5LDM2LDAsMiwxNDIsMTYsMCwxNzYsMTc1LAorCTgsMCw2NiwxNDAsMzMsMzIsNjQsMiwxLDAsNSwzNiwKKwkyNCwwLDE2NiwzOSw5LDI0OCw2NCwwLDMzLDU2LDMyLDIsCisJNDQsMCwxOTEsMTQzLDQwLDAsMTc4LDE0MywzNiwwLDE3NywxNDMsCisJMzIsMCwxNzYsMTQzLDgsMCwyMjQsMyw0OCwwLDE4OSwzOSwKKwkyMjQsMjU1LDE4OSwzOSwyOCwwLDE5MSwxNzUsMjQsMCwxNzgsMTc1LAorCTIwLDAsMTc3LDE3NSwzMywxNDQsMTI4LDAsMzMsMTM2LDE2MCwwLAorCTMxLDAsODEsMTgsMTYsMCwxNzYsMTc1LDQsMCw4MCwxNDIsCisJMCwwLDAsMCw0LDAsMiwxNDIsMCwwLDAsMCwKKwkxMCwwLDY0LDE2LDAsMCwwLDAsNCwwLDQsMTQyLAorCTAsMCwwLDAsMjA2LDczLDE5MiwxMiwzMyw0MCwzMiwyLAorCTgsMCwxNiwzOCw0LDAsMiwxNDIsMCwwLDAsMCwKKwkyNDgsMjU1LDY0LDIwLDAsMCwwLDAsMCwwLDY2LDE1MCwKKwkwLDAsMCwwLDMyLDAsNjYsNDgsNCwwLDY0LDE2LAorCTAsMCwwLDAsNCwwLDY4LDE0Miw2MSw1MCwxOTIsMTIsCisJMCwwLDAsMCwwLDAsNjYsMTUwLDAsMCwwLDAsCisJMTYsMCw2Niw0OCwzLDAsNjQsMTYsMCwwLDAsMCwKKwk2MSw1MCwxOTIsMTIsMzMsMzIsNjQsMiwyOCwwLDE5MSwxNDMsCisJMjQsMCwxNzgsMTQzLDIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDMyLDAsMTg5LDM5LDEyMCwxMzIsMTMxLDM5LAorCTIsMCwxMjgsMTYsMCwwLDAsMCwzMywyNCwxMjgsMCwKKwkwLDAsMTY3LDE0MCw0LDAsMTY1LDE0MCwyNiw3NCwxOTIsOCwKKwkwLDAsMCwwLDI4LDAsMjI0LDI0LDAsMCwwLDAsCisJNCwwLDk5LDE0MCwwLDAsMCwwLDQsMCw5OCwxNDAsCisJMCwwLDAsMCwxMSwwLDY0LDE2LDAsMCwwLDAsCisJMCwwLDE2NCwxNDAsMCwwLDk4LDE0MCwwLDAsMCwwLAorCTksMCw2OCwxNiwwLDAsMCwwLDgsMCw5OSwzNiwKKwk0LDAsOTgsMTQwLDAsMCwwLDAsMjQ4LDI1NSw2NCwyMCwKKwkwLDAsMCwwLDAsMCwxOTIsMTcyLDMzLDc0LDE5Miw4LAorCTIsMCwyLDM2LDQsMCw5OSwxNDAsMjU1LDI1NSwyMzEsMzYsCisJNCwwLDE2NSwzNiwwLDAsOTgsMTQ4LDAsMCwwLDAsCisJMSwwLDY2LDQ4LDIyOCwyNTUsNjQsMTYsMCwwLDAsMCwKKwkwLDAsMTk1LDE3Miw0MiwxNiw3LDAsOCwwLDIyNCwzLAorCTAsMCwwLDAsMjA4LDI1NSwxODksMzksNDQsMCwxOTEsMTc1LAorCTQwLDAsMTgyLDE3NSwzNiwwLDE4MSwxNzUsMzIsMCwxODAsMTc1LAorCTI4LDAsMTc5LDE3NSwyNCwwLDE3OCwxNzUsMjAsMCwxNzcsMTc1LAorCTE2LDAsMTc2LDE3NSwzMywxNjgsMTkyLDAsMCwwLDE2MiwxNDAsCisJMCwwLDAsMCwzLDAsNjQsMjgsMzMsNDgsMCwwLAorCTIyMCw3NCwxOTIsOCw1LDAsMiwzNiwxMjAsMTMyLDE0NywzOSwKKwkyLDAsMTI4LDE2LDAsMCwyMjQsMTcyLDMzLDE1MiwxMjgsMCwKKwkwLDAsMTc3LDE0MCw0LDAsMTgwLDE0MCw4NCw3NCwxOTIsOCwKKwkwLDAsMCwwLDI5LDAsMzIsMjYsMCwwLDAsMCwKKwk0LDAsMTAyLDE0MiwwLDAsMCwwLDQsMCwxOTQsMTQwLAorCTAsMCwwLDAsMjMsMCw2NCwxNiwwLDAsMCwwLAorCTAsMCwxMzEsMTQyLDAsMCwxOTQsMTQwLDAsMCwwLDAsCisJNiwwLDY3LDE2LDAsMCwwLDAsOCwwLDE5OCwzNiwKKwk0LDAsMTk0LDE0MCwwLDAsMCwwLDI0OCwyNTUsNjQsMjAsCisJMCwwLDAsMCw0LDAsMTk0LDE0MCwwLDAsMCwwLAorCTksMCw2NCwxNiwwLDAsMCwwLDI1NSwyNTUsNDksMzgsCisJNCwwLDE0OCwzOCwzMywxNTIsNjQsMCwwLDAsOTgsMTUwLAorCTAsMCwwLDAsMSwwLDY2LDQ4LDIyNywyNTUsNjQsMTYsCisJMCwwLDAsMCwyOSwwLDMyLDIyLDAsMCwwLDAsCisJMCwwLDk5LDE1MCwwLDAsMCwwLDEsMCw5OCw0OCwKKwkxMSwwLDY0LDE2LDQsMCw5OCw0OCwxMjMsMCw2NCwxNiwKKwkzLDAsMiwzNiwwLDAsMTYyLDE1MCwwLDAsMCwwLAorCTEsMCw2Niw0OCwxMTgsMCw2NCwxNiw0LDAsMiwzNiwKKwkwLDAsMjQzLDE3MiwyMTksNzQsMTkyLDgsNCwwLDIxMywxNzIsCisJMCwwLDk4LDE1MCwwLDAsMCwwLDQsMCw2Niw0OCwKKwkxMTAsMCw2NCwxNiwzLDAsMiwzNiwwLDAsMTYyLDE1MCwKKwkwLDAsMCwwLDEsMCw2Niw0OCwxMDUsMCw2NCwyMCwKKwk0LDAsMiwzNiwwLDAsMjQzLDE3MiwyMTksNzQsMTkyLDgsCisJNCwwLDIxMywxNzIsMCwwLDk4LDE1MCwwLDAsMCwwLAorCTEsMCw2Niw0OCw5NywwLDY0LDIwLDIsMCwyLDM2LAorCTIsMCwzNCw0MiwyMywwLDY0LDIwLDMzLDE0NCwxNjAsMiwKKwk1NiwwLDIyLDM2LDksNTAsMTkyLDEyLDE2LDAsNCwzNiwKKwkzMywxMjgsNjQsMCw0MCwwLDAsMTgsMTI4LDE2LDE3LDAsCisJMzMsMTYsODQsMCwyNTIsMjU1LDY2LDE0MCwwLDAsMCwwLAorCTAsMCwyLDE3NCw0LDAsMTgsMTc0LDgsMCwwLDE3NCwKKwkxMiwwLDAsMTc0LDksNTAsMTkyLDEyLDgsMCw0LDM2LAorCTMzLDE0NCw2NCwwLDI0LDAsNjQsMTgsMjU1LDI1NSw0OSwzOCwKKwkwLDAsODYsMTY2LDIsMCwzNCw0MiwyMzYsMjU1LDY0LDE2LAorCTQsMCw4MCwxNzQsNCwwLDEwMiwxNDIsMCwwLDAsMCwKKwk0LDAsMTk0LDE0MCwwLDAsMCwwLDYsMCw2NCwxNiwKKwkxLDAsMTcsMzYsOCwwLDE5OCwzNiw0LDAsMTk0LDE0MCwKKwkwLDAsMCwwLDI1MiwyNTUsNjQsMjAsMSwwLDQ5LDM4LAorCTEsMCwzNiwzOCw5LDUwLDE5MiwxMiwxOTIsMzIsNCwwLAorCTMzLDEyOCw2NCwwLDEyLDAsMCwyMiwzMywzMiw2NCwyLAorCTE3Myw3NCwxOTIsOCwwLDAsMCwwLDAsMCwxOCwxNDIsCisJMCwwLDAsMCw2MSw1MCwxOTIsMTIsMzMsMzIsMCwyLAorCTMzLDMyLDY0LDIsMjA2LDczLDE5MiwxMiwzMyw0MCwxNjAsMiwKKwkyMjAsNzQsMTkyLDgsMSwwLDIsMzYsNCwwLDEwMiwxNDIsCisJMCwwLDAsMCwxOTIsNzQsMTkyLDgsMzMsMTY4LDAsMiwKKwk0LDAsMTk0LDE0MCwwLDAsMCwwLDE0LDAsNjQsMTYsCisJMCwwLDAsMCwwLDAsMTk0LDE0MCw0LDAsMTk1LDE0MCwKKwkwLDAsMiwxNzQsNCwwLDMsMTc0LDgsMCwxOTgsMzYsCisJOCwwLDE2LDM4LDI1NSwyNTUsNDksMzgsMCwwLDE5NCwxNDAsCisJMCwwLDEzMSwxNDIsMCwwLDAsMCw0MywxNiw2NywwLAorCTI0MCwyNTUsNjQsMjAsMCwwLDAsMCwwLDAsMTMwLDE0MiwKKwkwLDAsMCwwLDAsMCwyLDE3NCw0LDAsMTgsMTc0LAorCTgsMCw0LDM4LDMzLDQwLDE5MiwwLDgwLDY4LDE5MiwxMiwKKwkxOTIsNDgsMTcsMCw0LDAsMTAyLDE0Miw0LDAsMTE3LDE3NCwKKwkwLDAsOTgsMTUwLDAsMCwwLDAsMzIsMCw2Niw0OCwKKwkzLDAsNjQsMTYsMCwwLDAsMCw2MSw1MCwxOTIsMTIsCisJMzMsMzIsMTkyLDAsMCwwLDk4LDE1MCwwLDAsMCwwLAorCTMyLDAsNjYsNTIsMCwwLDk4LDE2NiwzMywxNiwwLDAsCisJNDQsMCwxOTEsMTQzLDQwLDAsMTgyLDE0MywzNiwwLDE4MSwxNDMsCisJMzIsMCwxODAsMTQzLDI4LDAsMTc5LDE0MywyNCwwLDE3OCwxNDMsCisJMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNDgsMCwxODksMzksMjMyLDI1NSwxODksMzksMjAsMCwxOTEsMTc1LAorCTE2LDAsMTc2LDE3NSwwLDAsMTYyLDE0MCwwLDAsMCwwLAorCTg1LDAsNjQsMjQsMzMsMTYsMCwwLDEyMCwxMzIsMTQ0LDM5LAorCTIsMCwxMjgsMTYsMCwwLDAsMCwzMywxMjgsMTI4LDAsCisJMCwwLDE2NCwxNDAsNCwwLDE2NSwxNDAsMCwwLDAsMCwKKwkwLDAsMTY4LDE0MCwwLDAsMiwxNTAsMCwwLDAsMCwKKwkzMywyNCw2NCwwLDEsMCw2Niw0OCwzNCwwLDY0LDIwLAorCTMzLDU2LDAsMiwzMiwwLDEyOCwyNCw4LDAsOTgsNDgsCisJNCwwLDYsMTQyLDUsMCw2NCwxNiwwLDAsMCwwLAorCTEyLDAsMTk0LDE0MCwwLDAsMCwwLDMsMCw2NCwxNiwKKwkwLDAsMCwwLDMzLDU2LDAsMiwwLDAsMTY4LDE0MCwKKwkwLDAsMTk1LDE0MCwwLDAsMTYyLDE0MCwwLDAsMCwwLAorCTEwLDAsOTgsMTYsMCwwLDAsMCwwLDAsMTYzLDE0MCwKKwk0LDAsMTk0LDE0MCwwLDAsMCwwLDIwLDAsNjQsMTYsCisJOCwwLDE5OCwzNiwwLDAsMTk0LDE0MCwwLDAsMCwwLAorCTI0OSwyNTUsNjcsMjAsMCwwLDAsMCwyNTUsMjU1LDEzMiwzNiwKKwk0LDAsMjA4LDE0MCwwLDAsMCwwLDAsMCwzLDE1MCwKKwkwLDAsMCwwLDEsMCw5OCw0OCwyMjQsMjU1LDY0LDE2LAorCTQsMCwxNjUsMzYsMzYsMCwxMjgsMjAsMzMsMTYsMCwwLAorCTAsMCwyLDE1MCwwLDAsMCwwLDIsMCw2Niw0OCwKKwkzLDAsNjQsMjAsMCwwLDAsMCw2NSw3NSwxOTIsOCwKKwkzMywxNiwwLDAsNCwwLDIzMCwxNDAsMCwwLDAsMCwKKwkwLDAsMTk0LDE0MCwwLDAsMCwwLDcsMCw3MiwxNiwKKwkwLDAsMCwwLDgsMCwxOTgsMzYsMCwwLDE5NCwxNDAsCisJMCwwLDAsMCwyNTMsMjU1LDcyLDIwLDgsMCwxOTgsMzYsCisJMjQ4LDI1NSwxOTgsMzYsNCwwLDE5OSwxNDAsMCwwLDAsMCwKKwkxMCwwLDIyNCwxNiwzMywzMiwyMjQsMCw4LDAsMTk0LDE0MCwKKwkxMiwwLDE5NSwxNDAsMCwwLDE5NCwxNzIsNCwwLDE5NSwxNzIsCisJOCwwLDE5OCwzNiw0LDAsMTk0LDE0MCwwLDAsMCwwLAorCTI0OCwyNTUsNjQsMjAsMzMsMzIsMjI0LDAsMjA2LDczLDE5MiwxMiwKKwkzMyw0MCwwLDIsMzMsMTYsMCwyLDIwLDAsMTkxLDE0MywKKwkxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLDI0LDAsMTg5LDM5LAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTE5MiwyNTUsMTg5LDM5LDU2LDAsMTkxLDE3NSw1MiwwLDE4MSwxNzUsCisJNDgsMCwxODAsMTc1LDQ0LDAsMTc5LDE3NSw0MCwwLDE3OCwxNzUsCisJMzYsMCwxNzcsMTc1LDMyLDAsMTc2LDE3NSwzMywxMzYsMTI4LDAsCisJMzMsMTQ0LDE2MCwwLDMzLDE1MiwxOTIsMCwzMywxNjAsMjI0LDAsCisJODAsMCwxODEsMTQzLDAsMCwwLDAsMzYsMCwxNjIsMTQyLAorCTAsMCwwLDAsMjAsMCw4MCwxNDAsMzMsMzIsMTI4LDIsCisJNDgsNzIsMTkyLDEyLDMzLDQwLDE2MCwyLDE2LDAsMywxNDIsCisJMCwwLDAsMCwxNiwwLDE2MywxNzUsMjAsMCwxODAsMTc1LAorCTI0LDAsMTYyLDE3NSwwLDAsMiwxNDIsMSwwLDQsMzYsCisJMzMsNDAsMzIsMiwzMyw0OCw2NCwyLDksMjQ4LDY0LDAsCisJMzMsNTYsOTYsMiw2LDAsNjQsMjAsMzMsMzIsMTI4LDIsCisJMTcsMCwxNjIsMTQ2LDAsMCwwLDAsMSwwLDY2LDUyLAorCTExMyw3NSwxOTIsOCwxNywwLDE2MiwxNjIsMzMsNDAsMTYwLDIsCisJNTksNzcsMTkyLDEyLDMzLDQ4LDY0LDAsNTYsMCwxOTEsMTQzLAorCTUyLDAsMTgxLDE0Myw0OCwwLDE4MCwxNDMsNDQsMCwxNzksMTQzLAorCTQwLDAsMTc4LDE0MywzNiwwLDE3NywxNDMsMzIsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw2NCwwLDE4OSwzOSwxOTIsMjU1LDE4OSwzOSwKKwk2MCwwLDE5MSwxNzUsNTYsMCwxNzgsMTc1LDUyLDAsMTc3LDE3NSwKKwk0OCwwLDE3NiwxNzUsMzMsMTM2LDIyNCwwLDgwLDAsMTc4LDE0MywKKwkzNiwwLDE2MCwxNzUsMzYsMCw2NiwxNDIsMCwwLDAsMCwKKwkyMCwwLDY3LDE0MCwyLDAsODAsMTQ0LDAsMCwwLDAsCisJMjU1LDAsMiw1MCwyNTQsMjU1LDcxLDM2LDcwLDAsMjI2LDQ0LAorCTExMCwwLDY0LDE2LDEyOCwxNiw3LDAsMiwxMzEsMSw2MCwKKwkzMyw4LDM0LDAsMTYwLDE1MSwzNCwxNDAsMCwwLDAsMCwKKwk4LDAsNjQsMCwwLDAsMCwwLDE2LDAsMTc3LDE3NSwKKwk4LDAsOTgsMTQwLDE2LDAsMTAzLDE0MCw5LDI0OCw2NCwwLAorCTAsMCwwLDAsMiwwLDMsMzYsMTYsMCw2NywxNjIsCisJMjUxLDc1LDE5Miw4LDQwLDAsNjYsMTc0LDE2LDAsMTc3LDE3NSwKKwk4LDAsOTgsMTQwLDE2LDAsMTAzLDE0MCw5LDI0OCw2NCwwLAorCTAsMCwwLDAsNDAsMCwxNjIsMTc1LDE2LDAsODAsMTYyLAorCTQwLDAsMTYyLDE0MywwLDAsMCwwLDI1MSw3NSwxOTIsOCwKKwk0MCwwLDY2LDE3NCwzMiwwLDE2MiwzOSwxNiwwLDE2MiwxNzUsCisJMjAsMCwxNzcsMTc1LDM2LDAsMTYyLDM5LDI0LDAsMTYyLDE3NSwKKwk4LDAsOTgsMTQwLDE2LDAsMTAzLDE0MCw5LDI0OCw2NCwwLAorCTAsMCwwLDAsMzMsNDgsNjQsMCwxNiwwLDgwLDE2MiwKKwkxNywwLDY2LDE0NiwwLDAsMCwwLDIsMCw2Niw1MiwKKwkxNywwLDY2LDE2MiwzNiwwLDE2MiwxNDMsMCwwLDAsMCwKKwk0MywxNiwyLDAsNDAsMCw2NiwxNjYsNDQsMCw3MCwxNzQsCisJMzIsMCwxNjIsMTUxLDAsMCwwLDAsMzMsMTYsMTk0LDAsCisJNDgsMCw2NiwxNzQsMjU1LDc1LDE5Miw4LDUyLDAsNjQsMTY2LAorCTE2LDAsMTc3LDE3NSwzNiwwLDE2MiwzOSwyMCwwLDE2MiwxNzUsCisJOCwwLDk4LDE0MCwxNiwwLDEwMywxNDAsOSwyNDgsNjQsMCwKKwkwLDAsMCwwLDMzLDEyOCw2NCwwLDgsMCwwLDIyLAorCTMzLDMyLDMyLDIsMTYsMCwxNjAsMTc1LDMzLDQwLDY0LDIsCisJMzMsNDgsMCwwLDIyNiw3NiwxOTIsMTIsMzMsNTYsMCwwLAorCTI1NSw3NSwxOTIsOCwwLDAsMCwwLDM2LDAsMTYyLDE0MywKKwkwLDAsMCwwLDE2LDAsMTYyLDE3NSwwLDAsNiwxNDIsCisJNCwwLDcsMTQyLDAsMCwwLDAsMjI2LDc2LDE5MiwxMiwKKwkzMyw0MCw2NCwyLDM2LDAsMTYyLDE0MywwLDAsMCwwLAorCTM1LDAsNjQsMTYsMCwwLDAsMCw2MSw1MCwxOTIsMTIsCisJMzMsMzIsMCwyLDI1NSw3NSwxOTIsOCwwLDAsMCwwLAorCTUsMCwyLDM2LDI1MSw3NSwxOTIsOCwxNiwwLDY2LDE2MiwKKwkxNiwwLDE3NywxNzUsNDAsMCwxNjIsMzksMjAsMCwxNjIsMTc1LAorCTgsMCw5OCwxNDAsMTYsMCwxMDMsMTQwLDksMjQ4LDY0LDAsCisJMCwwLDAsMCwzMyw0OCw2NCwwLDcsMCwxOTIsMTYsCisJNjQsMCwyLDM2LDMsMCwxOTQsMTM2LDAsMCwxOTQsMTUyLAorCTAsMCwwLDAsNDMsMCwxNjIsMTcxLDQwLDAsMTYyLDE4NywKKwk2NCwwLDIsMzYsMTYsMCw2NiwxNjIsNDAsMCwxNjIsMTQzLAorCTAsMCwwLDAsMjUxLDc1LDE5Miw4LDQwLDAsNjYsMTc0LAorCTUsMCwyLDM2LDk2LDAsMzQsMTc0LDE3LDAsNjYsMTQ2LAorCTAsMCwwLDAsMiwwLDY2LDUyLDE3LDAsNjYsMTYyLAorCTYwLDAsMTkxLDE0Myw1NiwwLDE3OCwxNDMsNTIsMCwxNzcsMTQzLAorCTQ4LDAsMTc2LDE0Myw4LDAsMjI0LDMsNjQsMCwxODksMzksCisJODAsMjU1LDE4OSwzOSwxNjgsMCwxOTEsMTc1LDE2NCwwLDE3OSwxNzUsCisJMTYwLDAsMTc4LDE3NSwxNTYsMCwxNzcsMTc1LDE1MiwwLDE3NiwxNzUsCisJMzMsMTUyLDEyOCwwLDMzLDEzNiwyMjQsMCwxOTIsMCwxNzgsMTQzLAorCTAsMCwwLDAsMzYsMCw2NiwxNDIsMCwwLDAsMCwKKwkyMCwwLDY3LDE0MCwwLDAsMCwwLDE2LDAsOTgsMTQwLAorCTAsMCwwLDAsMTYsMCwxNjIsMTc1LDIwLDAsMTc3LDE3NSwKKwk0LDAsOTgsMTQwLDAsMCwwLDAsOSwyNDgsNjQsMCwKKwkyNCwwLDE2NywzOSwzMywxMjgsNjQsMCw2LDAsMCwyMiwKKwkzMywzMiwzMiwyLDE3LDAsNjYsMTQ2LDAsMCwwLDAsCisJMTgsMCw2Niw1Miw0NSw3NiwxOTIsOCwxNywwLDY2LDE2MiwKKwkzMyw0MCw2NCwyLDMzLDQ4LDAsMiwyNTMsNzYsMTkyLDEyLAorCTI0LDAsMTY3LDM5LDE2LDAsMTc4LDE3NSwzMywzMiw5NiwyLAorCTMzLDQwLDAsMiwyNCwwLDE2NiwzOSwxMjIsNzUsMTkyLDEyLAorCTMzLDU2LDMyLDIsMTY4LDAsMTkxLDE0MywxNjQsMCwxNzksMTQzLAorCTE2MCwwLDE3OCwxNDMsMTU2LDAsMTc3LDE0MywxNTIsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywxNzYsMCwxODksMzksMTkyLDI1NSwxODksMzksCisJNTYsMCwxOTEsMTc1LDUyLDAsMTgxLDE3NSw0OCwwLDE4MCwxNzUsCisJNDQsMCwxNzksMTc1LDQwLDAsMTc4LDE3NSwzNiwwLDE3NywxNzUsCisJMzIsMCwxNzYsMTc1LDMzLDE1MiwxMjgsMCwzMywxNjAsMTYwLDAsCisJMzMsMTY4LDE5MiwwLDMzLDEzNiwyMjQsMCw4MCwwLDE3OCwxNDMsCisJMCwwLDAsMCwzNiwwLDY2LDE0MiwwLDAsMCwwLAorCTIwLDAsODAsMTQwLDMzLDMyLDMyLDIsNDgsNzIsMTkyLDEyLAorCTMzLDQwLDY0LDIsMTYsMCwzLDE0MiwwLDAsMCwwLAorCTE2LDAsMTYzLDE3NSwyMCwwLDE3NywxNzUsMjQsMCwxNjIsMTc1LAorCTAsMCwyLDE0MiwzMywzMiwwLDAsMzMsNDAsOTYsMiwKKwkzMyw0OCwxMjgsMiw5LDI0OCw2NCwwLDMzLDU2LDE2MCwyLAorCTUsMCw2NCwxNiwzMywzMiwzMiwyLDIwMCw3NiwxOTIsMTIsCisJMzMsNDAsNjQsMiw5NSw3NiwxOTIsOCwwLDAsMCwwLAorCTE2LDAsMTc4LDE3NSwzMywzMiw5NiwyLDMzLDQwLDEyOCwyLAorCTMzLDQ4LDE2MCwyLDEyMiw3NSwxOTIsMTIsMzMsNTYsMzIsMiwKKwk1NiwwLDE5MSwxNDMsNTIsMCwxODEsMTQzLDQ4LDAsMTgwLDE0MywKKwk0NCwwLDE3OSwxNDMsNDAsMCwxNzgsMTQzLDM2LDAsMTc3LDE0MywKKwkzMiwwLDE3NiwxNDMsOCwwLDIyNCwzLDY0LDAsMTg5LDM5LAorCTE5MiwyNTUsMTg5LDM5LDU2LDAsMTkxLDE3NSw1MiwwLDE4MSwxNzUsCisJNDgsMCwxODAsMTc1LDQ0LDAsMTc5LDE3NSw0MCwwLDE3OCwxNzUsCisJMzYsMCwxNzcsMTc1LDMyLDAsMTc2LDE3NSwzMywxNTIsMTI4LDAsCisJMzMsMTYwLDE2MCwwLDMzLDE2OCwxOTIsMCw4MCwwLDE3NywxNDMsCisJMCwwLDAsMCwzNiwwLDM0LDE0MiwwLDAsMCwwLAorCTIwLDAsODIsMTQwLDIsMCw2NiwxNDQsMCwwLDAsMCwKKwkyNTQsMjU1LDY3LDM2LDcwLDAsOTgsNDQsNTcsMCw2NCwxNiwKKwkzMywxMjgsMjI0LDAsMTI4LDE2LDMsMCwyLDEzMSwxLDYwLAorCTMzLDgsMzQsMCwxODQsMTUyLDM0LDE0MCwwLDAsMCwwLAorCTgsMCw2NCwwLDAsMCwwLDAsMzMsMzIsMCwyLAorCTQ4LDcyLDE5MiwxMiwzMyw0MCwzMiwyLDQwLDAsMzUsMTQyLAorCTAsMCwwLDAsMTYsMCwxNjMsMTc1LDIwLDAsMTc2LDE3NSwKKwkxNzMsNzYsMTkyLDgsMjQsMCwxNjIsMTc1LDMzLDMyLDAsMiwKKwk0OCw3MiwxOTIsMTIsMzMsNDAsMzIsMiw0NCwwLDM1LDE0MiwKKwkwLDAsMCwwLDE2LDAsMTYzLDE3NSw0OCwwLDM1LDE0MiwKKwk0NCwwLDM2LDE0MiwwLDAsMCwwLDM1LDI0LDEwMCwwLAorCTE3MCw3NiwxOTIsOCwyNTUsMjU1LDk5LDQ4LDMzLDMyLDAsMiwKKwk0OCw3MiwxOTIsMTIsMzMsNDAsMzIsMiw0MCwwLDM1LDE0MiwKKwkwLDAsMCwwLDE2LDAsMTYzLDE3NSw0NCwwLDM1LDE0MiwKKwkwLDAsMCwwLDE3MSw3NiwxOTIsOCwyMCwwLDE2MywxNzUsCisJMzMsMzIsMCwyLDQ4LDcyLDE5MiwxMiwzMyw0MCwzMiwyLAorCTQwLDAsMzUsMzgsMTYsMCwxNjMsMTc1LDQsMCwzLDM2LAorCTIwLDAsMTYzLDE3NSwyNCwwLDE3NiwxNzUsMjgsMCwxNjIsMTc1LAorCTEyLDAsNjYsMTQyLDMzLDMyLDk2LDIsMzMsNDAsMTI4LDIsCisJMTYsMCw3MSwxNDIsMCwwLDAsMCw5LDI0OCw2NCwwLAorCTMzLDQ4LDE2MCwyLDE4NCw3NiwxOTIsOCwwLDAsMCwwLAorCTUsMCwyLDM2LDk2LDAsMiwxNzQsMTcsMCwzNCwxNDYsCisJMCwwLDAsMCwyLDAsNjYsNTIsMTcsMCwzNCwxNjIsCisJNTYsMCwxOTEsMTQzLDUyLDAsMTgxLDE0Myw0OCwwLDE4MCwxNDMsCisJNDQsMCwxNzksMTQzLDQwLDAsMTc4LDE0MywzNiwwLDE3NywxNDMsCisJMzIsMCwxNzYsMTQzLDgsMCwyMjQsMyw2NCwwLDE4OSwzOSwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkyMjQsMjU1LDE4OSwzOSwyNCwwLDE5MSwxNzUsMjAsMCwxNzcsMTc1LAorCTE2LDAsMTc2LDE3NSwzMywxMjgsMTI4LDAsNjQsMCwyLDE0MiwKKwkwLDAsMCwwLDcsMCw2NCwyMCwzMywxMzYsMTYwLDAsCisJMiwwLDIsMzYsNDgsNzIsMTkyLDEyLDk2LDAsMiwxNzQsCisJMSwwLDY2LDM2LDIxNyw3NiwxOTIsOCwxMDAsMCwyLDE3NCwKKwkxMjksMCwyLDM2LDE2LDAsMzQsMTYyLDE3LDAsMzQsMTQ2LAorCTAsMCwwLDAsMiwwLDY2LDUyLDE3LDAsMzQsMTYyLAorCTI0LDAsMTkxLDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywzMiwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwKKwkyMCwwLDE5MSwxNzUsMTYsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCwKKwkzMyw2NCwxNjAsMCwzMywzMiwxOTIsMCwzMyw0MCwyMjQsMCwKKwk0MCwwLDE2MiwxNDMsMTcsMCwzLDE0NSwwLDAsMCwwLAorCTIsMCw5OSw1MiwxNywwLDMsMTYxLDYsMCwzLDM2LAorCTQsMCw2NCwxNiwxNiwwLDMsMTYxLDQwLDAsNCwxNzMsCisJMjQ5LDc2LDE5Miw4LDQ0LDAsNSwxNzMsODAsODYsMTkyLDEyLAorCTQwLDAsNiwzNywyLDAsNjQsMTYsNSwwLDIsMzYsCisJOTYsMCwyLDE3NCwyMCwwLDE5MSwxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywyNCwwLDE4OSwzOSwyMDAsMjU1LDE4OSwzOSwKKwk0OCwwLDE5MSwxNzUsNDQsMCwxODMsMTc1LDQwLDAsMTgyLDE3NSwKKwkzNiwwLDE4MSwxNzUsMzIsMCwxODAsMTc1LDI4LDAsMTc5LDE3NSwKKwkyNCwwLDE3OCwxNzUsMjAsMCwxNzcsMTc1LDE2LDAsMTc2LDE3NSwKKwkzMywxNzYsMTI4LDAsMzMsMTQ0LDE2MCwwLDMzLDE1MiwxOTIsMCwKKwkzNywwLDk2LDE4LDMzLDE4NCwyMjQsMCwyOCwwLDg0LDM4LAorCTgsMCw2NywxNDIsMjgsMCw2NiwxNDIsMCwwLDAsMCwKKwkzNSwxMjgsOTgsMCw0MiwxNiw4MywwLDIzLDAsNjQsMTYsCisJMzMsMTY4LDE5LDIsOSw1MCwxOTIsMTIsMTI4LDMyLDIxLDAsCisJMzMsMTM2LDY0LDAsOCwwLDMyLDIyLDEyOCwxMjgsMTYsMCwKKwk1LDAsMiwzNiw5NiwwLDE5NCwxNzQsMTcsMCw2NiwxNDYsCisJMCwwLDAsMCwyLDAsNjYsNTIsNDgsNzcsMTkyLDgsCisJMTcsMCw2NiwxNjIsMzMsMzIsMzIsMiwxMiwwLDY5LDE0MiwKKwkwLDAsMCwwLDgwLDY4LDE5MiwxMiwzMyw0OCwwLDIsCisJMTEwLDg2LDE5MiwxMiw4LDAsNjgsMzgsMTIsMCw4MSwxNzQsCisJMzMsMTI4LDQ4LDIsNCwwLDE0NCwxNzQsNCwwLDEzMiwxNDIsCisJMzMsNDAsMjI0LDIsODAsNjgsMTkyLDEyLDEyOCw0OCwxOSwwLAorCTAsMCwxNDcsMTc0LDgsMCw4NSwxNzQsNDgsMCwxOTEsMTQzLAorCTQ0LDAsMTgzLDE0Myw0MCwwLDE4MiwxNDMsMzYsMCwxODEsMTQzLAorCTMyLDAsMTgwLDE0MywyOCwwLDE3OSwxNDMsMjQsMCwxNzgsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTU2LDAsMTg5LDM5LDIyNCwyNTUsMTg5LDM5LDI0LDAsMTkxLDE3NSwKKwkyMCwwLDE3NywxNzUsMTYsMCwxNzYsMTc1LDMzLDEzNiwxMjgsMCwKKwk1LDAsMTkyLDI0LDMzLDEyOCwxNjAsMCwzLDAsMiwzNiwKKwk5NiwwLDM0LDE3NCw5NSw3NywxOTIsOCwxMDAsMCwzOCwxNzQsCisJMTksMCwxOTUsMzYsMTksMCw5OCw0NCw5LDAsNjQsMTYsCisJMTI4LDE2LDMsMCwyLDEzMSwxLDYwLDMzLDgsMzQsMCwKKwkyMDgsMTUzLDM0LDE0MCwwLDAsMCwwLDgsMCw2NCwwLAorCTAsMCwwLDAsODksNzcsMTkyLDgsMiwwLDYsMzYsCisJODksNzcsMTkyLDgsNSwwLDYsMzYsODksNzcsMTkyLDgsCisJMywwLDYsMzYsODksNzcsMTkyLDgsMSwwLDYsMzYsCisJMzUsNDgsNiwwLDk2LDAsMzgsMTc0LDMzLDMyLDMyLDIsCisJNDgsNzIsMTkyLDEyLDMzLDQwLDAsMiwxLDAsNjYsMzYsCisJMTAwLDAsMzQsMTc0LDE3LDAsMiwxNDYsMCwwLDAsMCwKKwkxLDAsNjYsNTIsMTcsMCwyLDE2MiwyNCwwLDE5MSwxNDMsCisJMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJMzIsMCwxODksMzksMjAwLDI1NSwxODksMzksNTIsMCwxOTEsMTc1LAorCTQ4LDAsMTkwLDE3NSw0NCwwLDE4MywxNzUsNDAsMCwxODIsMTc1LAorCTM2LDAsMTgxLDE3NSwzMiwwLDE4MCwxNzUsMjgsMCwxNzksMTc1LAorCTI0LDAsMTc4LDE3NSwyMCwwLDE3NywxNzUsMTYsMCwxNzYsMTc1LAorCTMzLDE1MiwxMjgsMCwzMywxNjgsMTYwLDAsMzMsMTYwLDE5MiwwLAorCTc2LDAsMTgyLDE0Myw4MCwwLDE4MywxNDMsODQsMCwxOTAsMTQzLAorCTkyLDAsMTc3LDE0MywwLDAsMCwwLDIwOSw4MywxOTIsMTIsCisJMzMsMTQ0LDIyNCwwLDMzLDEyOCw2NCwwLDMsMCwwLDIyLAorCTQsMCwyLDM2LDE2OCw3NywxOTIsOCwzMywxNiwwLDAsCisJODgsMCwyLDE2Niw2NCwwLDE5LDE3NCwzMywzMiw2NCwyLAorCTcyLDAsMTY1LDE0MywwLDAsMCwwLDgwLDg2LDE5MiwxMiwKKwk5MiwwLDYsMzgsMjU1LDI1NSwzLDM2LDIzLDAsNjcsMTYsCisJMCwwLDAsMCwzLDAsMTk0LDEzOCwwLDAsMTk0LDE1NCwKKwkwLDAsMCwwLDEwMywwLDIsMTcwLDEwMCwwLDIsMTg2LAorCTEwNCwwLDIzLDE3NCwxMDgsMCwzMCwxNzQsODgsMCwxNjgsMTQzLAorCTAsMCwwLDAsMTEyLDAsOCwxNzQsNzIsMCwwLDE2NiwKKwk3NiwwLDIwLDE3NCwyNTUsMjU1LDE2Miw1MCwzMywxNiwxMzAsMiwKKwk4MCwwLDIsMTc0LDg0LDAsMCwxNjYsOSwwLDMyLDE4LAorCTEyMCwwLDE3LDE3NCwyMjQsODMsMTkyLDEyLDMzLDMyLDMyLDIsCisJNiwwLDY0LDIwLDEyNCwwLDIsMTc0LDE2Nyw4MywxOTIsMTIsCisJMzMsMzIsMCwyLDE2OCw3NywxOTIsOCwzMywxNiwwLDAsCisJMTI0LDAsMCwxNzQsMzMsMTYsMCwyLDUyLDAsMTkxLDE0MywKKwk0OCwwLDE5MCwxNDMsNDQsMCwxODMsMTQzLDQwLDAsMTgyLDE0MywKKwkzNiwwLDE4MSwxNDMsMzIsMCwxODAsMTQzLDI4LDAsMTc5LDE0MywKKwkyNCwwLDE3OCwxNDMsMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNTYsMCwxODksMzksMjI0LDI1NSwxODksMzksCisJMjgsMCwxOTEsMTc1LDI0LDAsMTc4LDE3NSwyMCwwLDE3NywxNzUsCisJMTYsMCwxNzYsMTc1LDMzLDE0NCwxMjgsMCw5MiwwLDY4LDE0MiwKKwkxMjgsODYsMTkyLDEyLDAsMCwwLDAsOTYsMCw2OCwxNDIsCisJMCwwLDAsMCwxMjgsODYsMTkyLDEyLDMzLDEyOCw2NCwwLAorCTEwMCwwLDY4LDE0MiwwLDAsMCwwLDEyOCw4NiwxOTIsMTIsCisJMzMsMTM2LDY0LDAsMzMsMTI4LDE3LDIsNiwwLDE2LDM4LAorCTMzLDE2LDgwLDAsOTAsMCw2NiwxNjYsMTkxLDc5LDE5MiwxMiwKKwkxMDQsMCw2OCwzOCwyNTUsMjU1LDY3LDQ4LDkwLDAsNjgsMTUwLAorCTEyOCwwLDk4LDQ0LDUsMCw2NCwyMCwyLDAsMTMwLDM2LAorCTAsMSw5OCw0NCwyLDAsNjQsMjAsMywwLDEzMCwzNiwKKwk0LDAsMTMwLDM2LDMzLDE2LDY3LDAsOTAsMCw2NiwxNjYsCisJODAsMCw2NiwxNDIsNzYsMCw2NywxNDIsOTAsMCw4MCwxNTAsCisJNjQsMCw2OCwxNDIsMCwwLDAsMCwxMjgsODYsMTkyLDEyLAorCTM1LDEzNiw2NywwLDI1NSwyNTUsNjcsNDgsOTAsMCw2OCwxNTAsCisJMCwwLDAsMCwxMjgsMCwxMzAsNDQsOSwwLDY0LDIwLAorCTAsMSwxMzAsNDQsNCwwLDY0LDE2LDAsMCwwLDAsCisJMzMsMjQsMTEyLDAsMjM3LDc3LDE5Miw4LDYsMCw5OSwzNiwKKwkzMywyNCwxMTIsMCwyMzcsNzcsMTkyLDgsNywwLDk5LDM2LAorCTMzLDI0LDExMiwwLDUsMCw5OSwzNiwyNTUsMjU1LDM2LDUwLAorCTEyOCwwLDEzMCw0NCw1LDAsNjQsMjAsMSwwLDEzMCwzNiwKKwkwLDEsMTMwLDQ0LDIsMCw2NCwyMCwyLDAsMTMwLDM2LAorCTMsMCwxMzAsMzYsMzMsMTYsOTgsMCwyLDAsNjYsMTY2LAorCTIsMCw2NywxNTAsMiwwLDY4LDE1MCwwLDAsMCwwLAorCTEyOCwwLDEzMCw0NCw2LDAsNjQsMjAsMSwwLDk5LDM2LAorCTAsMSwxMzAsNDQsNCwwLDY0LDIwLDIsMCw5OCwzNiwKKwkzLDc4LDE5Miw4LDMsMCw5OCwzNiwxLDAsOTgsMzYsCisJMCwwLDY2LDE2NiwwLDAsNjYsMTUwLDI4LDAsMTkxLDE0MywKKwkyNCwwLDE3OCwxNDMsMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsMzIsMCwxODksMzksMjE2LDI1NSwxODksMzksCisJMzIsMCwxOTEsMTc1LDI4LDAsMTc5LDE3NSwyNCwwLDE3OCwxNzUsCisJMjAsMCwxNzcsMTc1LDE2LDAsMTc2LDE3NSwzMywxNTIsMTI4LDAsCisJMTcxLDg2LDE5MiwxMiw5MiwwLDEwMCwzOCwxMDQsMCwxMDAsMTQyLAorCTAsMCwwLDAsMTI4LDg2LDE5MiwxMiwzMywxNDQsNjQsMCwKKwkxMDgsMCwxMDAsMTQyLDAsMCwwLDAsMTI4LDg2LDE5MiwxMiwKKwkzMywxMzYsNjQsMCwxMTIsMCwxMDAsMTQyLDAsMCwwLDAsCisJMTUzLDg2LDE5MiwxMiwzMywxMjgsNjQsMCwxMCwwLDgyLDM4LAorCTMzLDEzNiw1MCwyLDMzLDEyOCwxNywyLDQsMCwxNiwzOCwKKwkzMywxNiw4MCwwLDkwLDAsOTgsMTY2LDE5MSw3OSwxOTIsMTIsCisJMTE2LDAsMTAwLDM4LDI1NSwyNTUsNjcsNDgsOTAsMCwxMDAsMTUwLAorCTEyOCwwLDk4LDQ0LDUsMCw2NCwyMCwyLDAsMTMwLDM2LAorCTAsMSw5OCw0NCwyLDAsNjQsMjAsMywwLDEzMCwzNiwKKwk0LDAsMTMwLDM2LDMzLDE2LDY3LDAsOTAsMCw5OCwxNjYsCisJODAsMCw5OCwxNDIsNzYsMCw5OSwxNDIsOTAsMCwxMTMsMTUwLAorCTY0LDAsMTAwLDE0MiwwLDAsMCwwLDEyOCw4NiwxOTIsMTIsCisJMzUsMTI4LDY3LDAsMjU1LDI1NSw2Nyw0OCw5MCwwLDEwMCwxNTAsCisJMCwwLDAsMCwxMjgsMCwxMzAsNDQsOSwwLDY0LDIwLAorCTAsMSwxMzAsNDQsNCwwLDY0LDE2LDAsMCwwLDAsCisJMzMsMjQsMTEzLDAsNzQsNzgsMTkyLDgsNiwwLDk5LDM2LAorCTMzLDI0LDExMywwLDc0LDc4LDE5Miw4LDcsMCw5OSwzNiwKKwkzMywyNCwxMTMsMCw1LDAsOTksMzYsMjU1LDI1NSw0LDUwLAorCTEyOCwwLDEzMCw0NCw1LDAsNjQsMjAsMSwwLDEzMCwzNiwKKwkwLDEsMTMwLDQ0LDIsMCw2NCwyMCwyLDAsMTMwLDM2LAorCTMsMCwxMzAsMzYsMzMsMTYsOTgsMCwyLDAsOTgsMTY2LAorCTIsMCw5OSwxNTAsMiwwLDEwMCwxNTAsMCwwLDAsMCwKKwkxMjgsMCwxMzAsNDQsNiwwLDY0LDIwLDEsMCw5OSwzNiwKKwkwLDEsMTMwLDQ0LDQsMCw2NCwyMCwyLDAsMTEyLDM2LAorCTk2LDc4LDE5Miw4LDMsMCwxMTIsMzYsMSwwLDExMiwzNiwKKwkyNTUsMjU1LDIsNTAsMzIsMCwxOTEsMTQzLDI4LDAsMTc5LDE0MywKKwkyNCwwLDE3OCwxNDMsMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNDAsMCwxODksMzksMjA4LDI1NSwxODksMzksCisJNDAsMCwxOTEsMTc1LDM2LDAsMTc5LDE3NSwzMiwwLDE3OCwxNzUsCisJMjgsMCwxNzcsMTc1LDI0LDAsMTc2LDE3NSwzMywxMjgsMTI4LDAsCisJMzMsMTUyLDE5MiwwLDMzLDE0NCwyMjQsMCwzMywxMzYsMTYwLDAsCisJMTYsMCw0LDM2LDMyLDAsNSwzNiwxLDEzMSw2LDYwLAorCTU2LDk3LDE5OCwzNiwyNDIsODYsMTkyLDEyLDMzLDU2LDAsMiwKKwkyNTUsMjU1LDM2LDUwLDEsMTMxLDUsNjAsNTYsOTcsMTY1LDM2LAorCTQ0LDg3LDE5MiwxMiwzMyw0OCwwLDIsMTYsMCwxNzYsMTc1LAorCTIsMCw0LDM2LDMzLDQwLDAsMCwxLDEzMSw3LDYwLAorCTU2LDk3LDIzMSwzNiw5NCw4NywxOTIsMTIsMzMsNDgsOTYsMiwKKwk4LDAsNzEsMTQyLDQsMCw2NiwxNDIsMCwwLDAsMCwKKwkzNSw1NiwyMjYsMCwxLDEzMSwyLDYwLDU2LDk3LDY2LDM2LAorCTE2LDAsMTYyLDE3NSwyMCwwLDE3NiwxNzUsNCwwLDQsMzYsCisJMzMsNDAsMCwwLDQsMCw3MCwxNDIsMCwwLDAsMCwKKwkxOTQsODcsMTkyLDEyLDI1NSwyNTUsMjMxLDQ4LDQwLDAsMTkxLDE0MywKKwkzNiwwLDE3OSwxNDMsMzIsMCwxNzgsMTQzLDI4LDAsMTc3LDE0MywKKwkyNCwwLDE3NiwxNDMsOCwwLDIyNCwzLDQ4LDAsMTg5LDM5LAorCTIxNiwyNTUsMTg5LDM5LDM2LDAsMTkxLDE3NSwzMiwwLDE3OCwxNzUsCisJMjgsMCwxNzcsMTc1LDI0LDAsMTc2LDE3NSwzMywxMjgsMTI4LDAsCisJMzMsMTM2LDE2MCwwLDg4LDAsNCwxNTAsMTYwLDAsNSwzNiwKKwkxLDEzMSw2LDYwLDU2LDk3LDE5OCwzNiwyNDIsODYsMTkyLDEyLAorCTMzLDU2LDMyLDIsOTAsMCw0LDE1MCwxLDEzMSw1LDYwLAorCTU2LDk3LDE2NSwzNiw0NCw4NywxOTIsMTIsMzMsNDgsMzIsMiwKKwkxNiwwLDE3NywxNzUsNiwwLDQsMzYsMzMsNDAsMCwwLAorCTEsMTMxLDcsNjAsNTYsOTcsMjMxLDM2LDE1LDg4LDE5MiwxMiwKKwk5MiwwLDYsMzgsMSwxMzEsMTgsNjAsNTYsOTcsODIsMzgsCisJMTYsMCwxNzgsMTc1LDIwLDAsMTc3LDE3NSwzMywzMiwwLDAsCisJNjQsMCw1LDM2LDEwMCwwLDYsMzgsMTk0LDg3LDE5MiwxMiwKKwk0LDAsNywzNiwxNiwwLDE3NywxNzUsMiwwLDQsMzYsCisJMzMsNDAsMCwwLDEwNCwwLDYsMTQyLDAsMCwwLDAsCisJOTQsODcsMTkyLDEyLDMzLDU2LDY0LDIsMTYsMCwxNzcsMTc1LAorCTIsMCw0LDM2LDMzLDQwLDAsMCwxMDgsMCw2LDE0MiwKKwkwLDAsMCwwLDk0LDg3LDE5MiwxMiwzMyw1Niw2NCwyLAorCTE2LDAsMTc3LDE3NSwzLDAsNCwzNiw2NCwwLDUsMzYsCisJMTEyLDAsNiwxNDIsMCwwLDAsMCwxNDMsODcsMTkyLDEyLAorCTMzLDU2LDY0LDIsMTE2LDAsNCwzOCw3LDc5LDE5MiwxMiwKKwkzMyw0MCwzMiwyLDM2LDAsMTkxLDE0MywzMiwwLDE3OCwxNDMsCisJMjgsMCwxNzcsMTQzLDI0LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNDAsMCwxODksMzksMjE2LDI1NSwxODksMzksMzIsMCwxOTEsMTc1LAorCTI4LDAsMTc3LDE3NSwyNCwwLDE3NiwxNzUsMzMsMTI4LDEyOCwwLAorCTMzLDEzNiwxNjAsMCw4OCwwLDQsMTUwLDE2MCwwLDUsMzYsCisJMSwxMzEsNiw2MCw1Niw5NywxOTgsMzYsMjQyLDg2LDE5MiwxMiwKKwkzMyw1NiwzMiwyLDkwLDAsNCwxNTAsMSwxMzEsNSw2MCwKKwk1Niw5NywxNjUsMzYsNDQsODcsMTkyLDEyLDMzLDQ4LDMyLDIsCisJMTYsMCwxNzcsMTc1LDIsMCw0LDM2LDkyLDAsNiwxNDIsCisJMSwxMzEsNyw2MCw1Niw5NywyMzEsMzYsOTQsODcsMTkyLDEyLAorCTMzLDQwLDAsMCwxNiwwLDE3NywxNzUsMiwwLDQsMzYsCisJOTYsMCw2LDE0MiwxLDEzMSw3LDYwLDU2LDk3LDIzMSwzNiwKKwk5NCw4NywxOTIsMTIsMzMsNDAsMCwwLDE2LDAsMTc3LDE3NSwKKwkyLDAsNCwzNiwxMDAsMCw2LDE0MiwxLDEzMSw3LDYwLAorCTU2LDk3LDIzMSwzNiw5NCw4NywxOTIsMTIsMzMsNDAsMCwwLAorCTEwNCwwLDQsMzgsNyw3OSwxOTIsMTIsMzMsNDAsMzIsMiwKKwkzMiwwLDE5MSwxNDMsMjgsMCwxNzcsMTQzLDI0LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNDAsMCwxODksMzksMjAwLDI1NSwxODksMzksCisJNTIsMCwxOTEsMTc1LDQ4LDAsMTgwLDE3NSw0NCwwLDE3OSwxNzUsCisJNDAsMCwxNzgsMTc1LDM2LDAsMTc3LDE3NSwzMiwwLDE3NiwxNzUsCisJMzMsMTQ0LDEyOCwwLDMzLDEzNiwxNjAsMCwxNiwwLDQsMzYsCisJMzIsMCw1LDM2LDEsMTMxLDYsNjAsNTYsOTcsMTk4LDM2LAorCTI0Miw4NiwxOTIsMTIsMzMsNTYsMzIsMiwwLDAsNjgsMTUwLAorCTEsMTMxLDUsNjAsNTYsOTcsMTY1LDM2LDQ0LDg3LDE5MiwxMiwKKwkzMyw0OCwzMiwyLDE1NSwwLDY0LDE4LDAsMCwwLDAsCisJMSwxMzEsMjAsNjAsNTYsOTcsMTQ4LDM4LDgsMCw4MCwxNDIsCisJMCwwLDAsMCwxNDUsMCwwLDE4LDAsMCwwLDAsCisJNCwwLDY2LDE0MiwwLDAsMCwwLDE0MSwwLDY0LDI0LAorCTMzLDE1MiwwLDAsMTYsMCw0LDM2LDMyLDAsNSwzNiwKKwkzMyw0OCwxMjgsMiwyNDIsODYsMTkyLDEyLDMzLDU2LDMyLDIsCisJNCwwLDQsMTUwLDMzLDQwLDEyOCwyLDQ0LDg3LDE5MiwxMiwKKwkzMyw0OCwzMiwyLDE2LDAsMTc3LDE3NSw2LDAsNCwzNiwKKwkzMyw0MCwwLDAsOCwwLDYsMzgsMTUsODgsMTkyLDEyLAorCTMzLDU2LDEyOCwyLDE2LDAsMywxNDYsNjUsMCwyLDM2LAorCTQ3LDAsOTgsMTYsNjYsMCw5OCw0MCwxOCwwLDY0LDE2LAorCTUsMCwyLDM2LDg4LDAsOTgsMTYsNiwwLDk4LDQwLAorCTcsMCw2NCwxNiwyLDAsMiwzNiwzMCwwLDk4LDE2LAorCTQsMCwyLDM2LDUxLDAsOTgsMTYsNCwwLDQsMzYsCisJMTc0LDc5LDE5Miw4LDEsMCwxMTUsMzgsNiwwLDIsMzYsCisJNjgsMCw5OCwxNiw2NCwwLDIsMzYsNzgsMCw5OCwxNiwKKwkzMywzMiwwLDAsMTc0LDc5LDE5Miw4LDEsMCwxMTUsMzgsCisJNjgsMCwyLDM2LDQ3LDAsOTgsMTYsNjksMCw5OCw0MCwKKwk3LDAsNjQsMTYsNjYsMCwyLDM2LDI0LDAsOTgsMTYsCisJNjcsMCwyLDM2LDI1LDAsOTgsMTYsMywwLDQsMzYsCisJMTc0LDc5LDE5Miw4LDEsMCwxMTUsMzgsMTMxLDAsOTgsNDAsCisJODMsMCw2NCwxNiwxMjgsMCw5OCw0MCw2OCwwLDY0LDE2LAorCTAsMCwwLDAsMTc0LDc5LDE5Miw4LDEsMCwxMTUsMzgsCisJMTYsMCwxNzcsMTc1LDIsMCw0LDM2LDQwLDAsNiwxNDIsCisJMSwxMzEsNyw2MCw1Niw5NywyMzEsMzYsOTQsODcsMTkyLDEyLAorCTMzLDQwLDAsMCwxNzQsNzksMTkyLDgsMSwwLDExNSwzOCwKKwkxNiwwLDE3NywxNzUsMTExLDc5LDE5Miw4LDEsMCw0LDM2LAorCTE2LDAsMTc3LDE3NSwxMTEsNzksMTkyLDgsMiwwLDQsMzYsCisJMTYsMCwxNzcsMTc1LDQwLDAsNiwxNDIsMSwxMzEsNyw2MCwKKwk1Niw5NywyMzEsMzYsMTQzLDg3LDE5MiwxMiw2NCwwLDUsMzYsCisJMTc0LDc5LDE5Miw4LDEsMCwxMTUsMzgsNDgsMCw3LDE0MiwKKwk0NCwwLDIsMTQyLDAsMCwwLDAsMzUsNTYsMjI2LDAsCisJMTYsMCwxODAsMTc1LDIwLDAsMTc3LDE3NSwxMzQsNzksMTkyLDgsCisJMzMsNDAsMCwwLDQ4LDAsNywxNDIsNDQsMCwyLDE0MiwKKwkwLDAsMCwwLDM1LDU2LDIyNiwwLDE2LDAsMTgwLDE3NSwKKwkyMCwwLDE3NywxNzUsNCwwLDQsMzYsNjQsMCw1LDM2LAorCTQ0LDAsNiwxNDIsMCwwLDAsMCwxOTQsODcsMTkyLDEyLAorCTI1NSwyNTUsMjMxLDQ4LDE3NCw3OSwxOTIsOCwxLDAsMTE1LDM4LAorCTE2LDAsMTc3LDE3NSw2LDAsNCwzNiwzMyw0MCwwLDAsCisJMSwxMzEsNyw2MCw1Niw5NywyMzEsMzYsMTUsODgsMTkyLDEyLAorCTQwLDAsNiwzOCwxNzQsNzksMTkyLDgsMSwwLDExNSwzOCwKKwk1LDAsNCwzNiwxNjQsNzksMTkyLDgsMzMsNDAsMCwwLAorCTE2LDAsMTgwLDE3NSwyMCwwLDE3NywxNzUsNjQsMCw1LDM2LAorCTQwLDAsNiwzOCwxOTQsODcsMTkyLDEyLDQsMCw3LDM2LAorCTE3NCw3OSwxOTIsOCwxLDAsMTE1LDM4LDE2LDAsNCwxNDYsCisJMTYsMCw1LDE0NiwzMSwwLDEzMiw0OCwyMjQsMCwxNjUsNDgsCisJMSwxMzEsNiw2MCw1Niw5NywxOTgsMzYsMjQyLDg2LDE5MiwxMiwKKwkzMyw1NiwzMiwyLDMzLDMyLDAsMCwxLDEzMSw1LDYwLAorCTU2LDk3LDE2NSwzNiw0NCw4NywxOTIsMTIsMzMsNDgsMzIsMiwKKwkxLDAsMTE1LDM4LDQsMCw2NiwxNDIsMCwwLDAsMCwKKwk0MiwxNiw5OCwyLDExNywyNTUsNjQsMjAsNjgsMCwxNiwzOCwKKwkxMiwwLDgyLDE0MiwwLDAsMCwwLDEwNSwyNTUsNjQsMjIsCisJMCwwLDAsMCw1MiwwLDE5MSwxNDMsNDgsMCwxODAsMTQzLAorCTQ0LDAsMTc5LDE0Myw0MCwwLDE3OCwxNDMsMzYsMCwxNzcsMTQzLAorCTMyLDAsMTc2LDE0Myw4LDAsMjI0LDMsNTYsMCwxODksMzksCisJMjAwLDI1NSwxODksMzksNTIsMCwxOTEsMTc1LDQ4LDAsMTgyLDE3NSwKKwk0NCwwLDE4MSwxNzUsNDAsMCwxODAsMTc1LDM2LDAsMTc5LDE3NSwKKwkzMiwwLDE3OCwxNzUsMjgsMCwxNzcsMTc1LDI0LDAsMTc2LDE3NSwKKwkzMywxNjgsMTI4LDAsMzMsMTUyLDE2MCwyLDExMywwLDE2MCwxOCwKKwkzMywxNDQsMCwwLDQsMCwyMiwzNiw4LDAsMTEyLDE0MiwKKwkwLDAsMCwwLDEwNCwwLDAsMTgsMCwwLDAsMCwKKwk0LDAsOTgsMTQyLDAsMCwwLDAsMTAwLDAsNjQsMjQsCisJMzMsMTYwLDAsMCwxNzEsODYsMTkyLDEyLDgsMCw0LDM4LAorCTI1NSwyNTUsNjcsNDgsMTI4LDAsOTgsNDQsNSwwLDY0LDIwLAorCTIsMCwxMTMsMzYsMCwxLDk4LDQ0LDIsMCw2NCwyMCwKKwkzLDAsMTEzLDM2LDQsMCwxMTMsMzYsMTYsMCwzLDE0NiwKKwk2NCwwLDIsMzYsNTAsMCw5OCwxNiw2NSwwLDk4LDQwLAorCTE2LDAsNjQsMTYsNjgsMCwyLDM2LDM0LDAsMTE4LDE2LAorCTUsMCw5OCw0MCw1LDAsNjQsMTYsMiwwLDIsMzYsCisJMjAsMCw5OCwxNiwyNTUsMjU1LDM2LDUwLDIyLDgwLDE5Miw4LAorCTAsMCwwLDAsNSwwLDIsMzYsMzUsMCw5OCwxNiwKKwk2LDAsMiwzNiwyOSwwLDk4LDE2LDI1NSwyNTUsMzYsNTAsCisJMjIsODAsMTkyLDgsMCwwLDAsMCwxOSwwLDk4LDE2LAorCTY4LDAsOTgsNDAsMTIsMCw2NCwyMCwxMzEsMCw5OCw0MCwKKwkyOCwwLDY0LDE2LDEyOCwwLDk4LDQwLDI3LDAsNjQsMjAsCisJMjU1LDI1NSwzNiw1MCwyMiw4MCwxOTIsOCwxOCwwLDAsMTY2LAorCTQwLDAsNCwxNDIsMTI4LDg2LDE5MiwxMiwwLDAsMCwwLAorCTIxLDgwLDE5Miw4LDE4LDAsMiwxNjYsNDAsMCw0LDE0MiwKKwkxNTMsODYsMTkyLDEyLDAsMCwwLDAsMjEsODAsMTkyLDgsCisJMTgsMCwyLDE2Niw0OCwwLDIsMTQyLDQ0LDAsMywxNDIsCisJMCwwLDAsMCwzNSwxNiw2NywwLDIxLDgwLDE5Miw4LAorCTE4LDAsMiwxNjYsMTcxLDg2LDE5MiwxMiw0MCwwLDQsMzgsCisJMjEsODAsMTkyLDgsMTgsMCwyLDE2NiwyMSw4MCwxOTIsOCwKKwkxOCwwLDAsMTY2LDE4LDAsMjIsMTY2LDI1NSwyNTUsMzYsNTAsCisJMTgsMCwzLDE1MCwwLDAsMCwwLDEyOCwwLDk4LDQ0LAorCTYsMCw2NCwyMCwxLDAsMTMyLDM2LDAsMSw5OCw0NCwKKwk0LDAsNjQsMjAsMiwwLDk4LDM2LDMzLDgwLDE5Miw4LAorCTMsMCw5OCwzNiwxLDAsOTgsMzYsMzMsMTYsMTMwLDAsCisJNCwwLDIsMTY2LDQsMCw0LDE1MCwwLDAsMCwwLAorCTEsMCwxMzIsMzYsNCwwLDMsMTUwLDAsMCwwLDAsCisJMTI4LDAsOTgsNDQsNiwwLDY0LDIwLDI1NSwyNTUsNjksNTAsCisJMCwxLDk4LDQ0LDQsMCw2NCwyMCwyLDAsMTYyLDM2LAorCTQ5LDgwLDE5Miw4LDMsMCwxNjIsMzYsMSwwLDE2MiwzNiwKKwkzMywxNDQsNjgsMCwxLDAsMTQ4LDM4LDQsMCw5OCwxNDIsCisJMCwwLDAsMCw0MiwxNiwxMzAsMiwxNTgsMjU1LDY0LDIwLAorCTY4LDAsMTYsMzgsMTIsMCwxMTUsMTQyLDAsMCwwLDAsCisJMTQ2LDI1NSw5NiwyMiwwLDAsMCwwLDAsMCwxNzgsMTY2LAorCTI1NSwyNTUsNjYsNTAsNTIsMCwxOTEsMTQzLDQ4LDAsMTgyLDE0MywKKwk0NCwwLDE4MSwxNDMsNDAsMCwxODAsMTQzLDM2LDAsMTc5LDE0MywKKwkzMiwwLDE3OCwxNDMsMjgsMCwxNzcsMTQzLDI0LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNTYsMCwxODksMzksMjI0LDI1NSwxODksMzksCisJMjQsMCwxOTEsMTc1LDIwLDAsMTc3LDE3NSwxNiwwLDE3NiwxNzUsCisJMzMsMTI4LDEyOCwwLDE3MSw4NiwxOTIsMTIsOCwwLDQsMzgsCisJMjU1LDI1NSw2Nyw0OCwxMjgsMCw5OCw0NCw1LDAsNjQsMjAsCisJMiwwLDExMywzNiwwLDEsOTgsNDQsMiwwLDY0LDIwLAorCTMsMCwxMTMsMzYsNCwwLDExMywzNiwxNiwwLDMsMTQ2LAorCTY0LDAsMiwzNiw1MiwwLDk4LDE2LDY1LDAsOTgsNDAsCisJMTcsMCw2NCwxNiw0LDAsMiwzNiwzNywwLDk4LDE2LAorCTAsMCwwLDAsNSwwLDk4LDQwLDUsMCw2NCwxNiwKKwkyLDAsMiwzNiwyMiwwLDk4LDE2LDI1NSwyNTUsMzYsNTAsCisJMTQ1LDgwLDE5Miw4LDAsMCwwLDAsNSwwLDIsMzYsCisJMzYsMCw5OCwxNiw2LDAsMiwzNiwzMCwwLDk4LDE2LAorCTI1NSwyNTUsMzYsNTAsMTQ1LDgwLDE5Miw4LDAsMCwwLDAsCisJNjgsMCwyLDM2LDIwLDAsOTgsMTYsMCwwLDAsMCwKKwk2OCwwLDk4LDQwLDEyLDAsNjQsMjAsMTMxLDAsOTgsNDAsCisJMjgsMCw2NCwxNiwxMjgsMCw5OCw0MCwyNywwLDY0LDIwLAorCTI1NSwyNTUsMzYsNTAsMTQ1LDgwLDE5Miw4LDE4LDAsMCwxNjYsCisJNDAsMCw0LDE0MiwxMjgsODYsMTkyLDEyLDAsMCwwLDAsCisJMTQ0LDgwLDE5Miw4LDE4LDAsMiwxNjYsNDAsMCw0LDE0MiwKKwkxNTMsODYsMTkyLDEyLDAsMCwwLDAsMTQ0LDgwLDE5Miw4LAorCTE4LDAsMiwxNjYsNDgsMCwyLDE0Miw0NCwwLDMsMTQyLAorCTAsMCwwLDAsMTQzLDgwLDE5Miw4LDM1LDE2LDY3LDAsCisJMTcxLDg2LDE5MiwxMiw0MCwwLDQsMzgsMTQ0LDgwLDE5Miw4LAorCTE4LDAsMiwxNjYsMTQ0LDgwLDE5Miw4LDE4LDAsMCwxNjYsCisJNCwwLDIsMzYsMTgsMCwyLDE2NiwyNTUsMjU1LDM2LDUwLAorCTE4LDAsMywxNTAsMCwwLDAsMCwxMjgsMCw5OCw0NCwKKwk2LDAsNjQsMjAsMSwwLDEzMiwzNiwwLDEsOTgsNDQsCisJNCwwLDY0LDIwLDIsMCw5OCwzNiwxNTYsODAsMTkyLDgsCisJMywwLDk4LDM2LDEsMCw5OCwzNiwzMywxNiwxMzAsMCwKKwk0LDAsMiwxNjYsNCwwLDMsMTUwLDQsMCw0LDE1MCwKKwkwLDAsMCwwLDEyOCwwLDEzMCw0NCw2LDAsNjQsMjAsCisJMSwwLDk5LDM2LDAsMSwxMzAsNDQsNCwwLDY0LDIwLAorCTIsMCw5OCwzNiwxNzAsODAsMTkyLDgsMywwLDk4LDM2LAorCTEsMCw5OCwzNiwyNTUsMjU1LDY2LDQ4LDI0LDAsMTkxLDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkzMiwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwxNiwwLDE5MSwxNzUsCisJNjQsMCwxMzAsMTQwLDAsMCwwLDAsMTIsMCw2NCwyMCwKKwkzMywxNiwwLDAsODgsMCwxMzEsMTQ4LDQsMCwyLDM2LAorCTUsMCw5OCwxNiwwLDAsMCwwLDE4MCw3NywxOTIsMTIsCisJMCwwLDAsMCwxOTMsODAsMTkyLDgsMjU1LDI1NSw2Niw0OCwKKwkxMSw3OCwxOTIsMTIsMCwwLDAsMCwyNTUsMjU1LDY2LDQ4LAorCTE2LDAsMTkxLDE0MywyNCwwLDE4OSwzOSw4LDAsMjI0LDMsCisJMCwwLDAsMCwyMjQsMjU1LDE4OSwzOSwyNCwwLDE5MSwxNzUsCisJMjAsMCwxNzcsMTc1LDE2LDAsMTc2LDE3NSwzMywxMjgsMTI4LDAsCisJMTc2LDgwLDE5MiwxMiwzMywxMzYsMTYwLDAsMzMsMzIsMCwyLAorCTMzLDQwLDMyLDIsMjEzLDgwLDE5MiwxMiwyNTUsMjU1LDcwLDQ4LAorCTI0LDAsMTkxLDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywzMiwwLDE4OSwzOSwyMjQsMjU1LDE4OSwzOSwKKwkyOCwwLDE5MSwxNzUsMjQsMCwxNzgsMTc1LDIwLDAsMTc3LDE3NSwKKwkxNiwwLDE3NiwxNzUsMzMsMTQ0LDEyOCwwLDMzLDEzNiwxOTIsMCwKKwkyNTUsMjU1LDM0LDUwLDQxLDAsNjQsMTYsMzMsMTI4LDE2MCwwLAorCTQsMCwyLDE0MiwwLDAsMCwwLDExLDAsNjQsMjAsCisJMjU1LDI1NSwzNSw1MCw5LDUwLDE5MiwxMiwyNTUsMjU1LDM2LDUwLAorCTMzLDI0LDY0LDAsMzIsMCw5NiwxNiwxLDAsMiwzNiwKKwkwLDAsMiwxNjYsNCwwLDMsMTc0LDgsMCwzLDE3NCwKKwkyNDIsODAsMTkyLDgsMTIsMCwxNywxNjYsMTIsMCwyLDE1MCwKKwkwLDAsMCwwLDQzLDE2LDY3LDAsMjMsMCw2NCwyMCwKKwkyNTUsMjU1LDIsMzYsNjQsMCw2NiwxNDIsMCwwLDAsMCwKKwkxOSwwLDY0LDIwLDI1NSwyNTUsMiwzNiwzMywzMiwwLDIsCisJMiwwLDY5LDE1MCwzMyw0OCwwLDAsMTA0LDc4LDE5MiwxMiwKKwk3MiwwLDcxLDM4LDg4LDAsNjcsMTUwLDQsMCwyLDM2LAorCTUsMCw5OCwxNiwzMywzMiw2NCwyLDIxNyw3OCwxOTIsMTIsCisJMzMsNDAsMCwyLDgsODEsMTkyLDgsMzMsMTYsMCwwLAorCTE1Myw3OCwxOTIsMTIsMzMsNDAsMCwyLDgsODEsMTkyLDgsCisJMzMsMTYsMCwwLDI1NSwyNTUsMiwzNiwyOCwwLDE5MSwxNDMsCisJMjQsMCwxNzgsMTQzLDIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDMyLDAsMTg5LDM5LDAsMCwwLDAsCisJMCwwLDAsMCwxNjgsMjU1LDE4OSwzOSw4MCwwLDE5MSwxNzUsCisJNzYsMCwxODMsMTc1LDcyLDAsMTgyLDE3NSw2OCwwLDE4MSwxNzUsCisJNjQsMCwxODAsMTc1LDYwLDAsMTc5LDE3NSw1NiwwLDE3OCwxNzUsCisJNTIsMCwxNzcsMTc1LDQ4LDAsMTc2LDE3NSwzMywyNCwxMjgsMCwKKwkzMywxNTIsMTYwLDAsMzMsMTc2LDE5MiwwLDMzLDE4NCwyMjQsMCwKKwkxMDQsMCwxNjIsMTQzLDAsMCwwLDAsMiwwLDY0LDIwLAorCTQ0LDAsMTYwLDE3NSw0MCwwLDE2MiwzOSwwLDAsNjQsMTcyLAorCTI0LDAsMTY0LDM5LDMzLDQwLDk2LDAsMTU2LDg4LDE5MiwxMiwKKwkzMyw0OCw5NiwyLDMzLDEzNiw2NCwwLDgyLDAsMzIsMTgsCisJMzMsMTYsMCwwLDIwOSw4MywxOTIsMTIsMCwwLDAsMCwKKwkzMywxNDQsNjQsMCw1LDAsNjQsMjIsMSwwLDIsMzYsCisJMTgzLDg4LDE5MiwxMiwzMywzMiwzMiwyLDEyNCw4MSwxOTIsOCwKKwkzMywxNiwwLDAsMTQ4LDAsNjYsMTYyLDE5Niw4OCwxOTIsMTIsCisJMzMsMzIsMzIsMiwyMjQsMCw4NSw0OCw0NCwwLDE3NiwzOSwKKwkzMywzMiwzMiwyLDEyNCw4OSwxOTIsMTIsMzMsNDAsMCwyLAorCTMzLDE2MCw2NCwwLDMzLDMyLDMyLDIsMTk4LDg5LDE5MiwxMiwKKwkzMyw0MCwwLDIsMiwwLDY2LDE2Niw0NCwwLDE2MiwxNDMsCisJMCwwLDAsMCwxNCwwLDY0LDIwLDAsMCwwLDAsCisJOCwwLDM1LDE0Miw0LDAsMzQsMTQyLDAsMCwwLDAsCisJMzUsMTI4LDk4LDAsMiwwLDY2LDE1MCwwLDAsMCwwLAorCTMzLDEyOCwyLDIsNDIsMTYsMTksMiwxNiwwLDY0LDIwLAorCTMzLDMyLDMyLDIsNDIsMTYsMTEyLDIsMTYsMCw2NCwxNiwKKwkwLDAsMCwwLDE2Nyw4MywxOTIsMTIsMzMsMzIsNjQsMiwKKwkxODMsODgsMTkyLDEyLDMzLDMyLDMyLDIsMywxMzEsMyw2MCwKKwkxNDAsMTcsOTksMzYsMCwwLDk4LDE0MCwwLDAsMCwwLAorCTEsMCw2NiwzNiwwLDAsOTgsMTcyLDEyNCw4MSwxOTIsOCwKKwkzMywxNiwwLDAsMzMsNDAsMCwyLDQyLDg5LDE5MiwxMiwKKwkzMyw0OCwwLDAsMjU1LDAsMTYyLDUwLDI1NSwyNTUsMTMxLDUwLAorCTM3LDE2LDY3LDAsNDgsMCwzLDM2LDgsMCw2NywyMCwKKwkzMywzMiw2NCwyLDE2LDAsMTc2LDE3NSwzMyw0MCwzMiwyLAorCTMzLDQ4LDE5MiwyLDEzNSw4MSwxOTIsMTIsMzMsNTYsMjI0LDIsCisJMTE3LDgxLDE5Miw4LDMzLDEyOCw2NCwwLDMsMTMxLDMsNjAsCisJMTQwLDE3LDk5LDM2LDAsMCw5OCwxNDAsMCwwLDAsMCwKKwkxLDAsNjYsMzYsMCwwLDk4LDE3MiwzMywxMjgsMCwwLAorCTMsMCwwLDIyLDAsMCwwLDAsMTY3LDgzLDE5MiwxMiwKKwkzMywzMiw2NCwyLDE4Myw4OCwxOTIsMTIsMzMsMzIsMzIsMiwKKwkzMywxNiwwLDIsODAsMCwxOTEsMTQzLDc2LDAsMTgzLDE0MywKKwk3MiwwLDE4MiwxNDMsNjgsMCwxODEsMTQzLDY0LDAsMTgwLDE0MywKKwk2MCwwLDE3OSwxNDMsNTYsMCwxNzgsMTQzLDUyLDAsMTc3LDE0MywKKwk0OCwwLDE3NiwxNDMsOCwwLDIyNCwzLDg4LDAsMTg5LDM5LAorCTE3NiwyNTUsMTg5LDM5LDc2LDAsMTkxLDE3NSw3MiwwLDE4MiwxNzUsCisJNjgsMCwxODEsMTc1LDY0LDAsMTgwLDE3NSw2MCwwLDE3OSwxNzUsCisJNTYsMCwxNzgsMTc1LDUyLDAsMTc3LDE3NSw0OCwwLDE3NiwxNzUsCisJMzMsMTI4LDEyOCwwLDMzLDEzNiwxNjAsMCwzMywxNjAsMTkyLDAsCisJMzMsMTY4LDIyNCwwLDk2LDAsMTgyLDE0MywyNCwwLDE2MCwxNzUsCisJMzMsMzIsMzIsMiwyNCwwLDE2NSwzOSwyLDAsNiwzNiwKKwkyMzksOTAsMTkyLDEyLDMzLDU2LDAsMCw2NCwwLDIsMTc0LAorCTI0LDAsMTYyLDE0MywwLDAsMCwwLDE1NSwwLDY0LDIwLAorCTAsMCwwLDAsNjQsMCwyLDE0MiwwLDAsMCwwLAorCTQsMCw2NCwxNiwzMywzMiwzMiwyLDMsMTMxLDMsNjAsCisJNjAsODIsMTkyLDgsMTQ4LDE3LDk5LDM2LDE2LDAsMTYwLDE3NSwKKwk3MiwwLDUsMzgsMjQsMCwxNjYsMzksMTEwLDkwLDE5MiwxMiwKKwk0LDAsNywzNiwyNCwwLDE2MiwxNDMsMCwwLDAsMCwKKwkxMzksMCw2NCwyMCwwLDAsMCwwLDE5Niw4OCwxOTIsMTIsCisJMzMsMzIsMzIsMiwyMjQsMCw2Niw0OCwxNjAsMCwzLDM2LAorCTEzMywwLDY3LDIwLDMzLDMyLDMyLDIsMTI0LDg5LDE5MiwxMiwKKwkyNCwwLDE2NSwzOSwzMywxNDQsNjQsMCwzMywzMiwzMiwyLAorCTE5OCw4OSwxOTIsMTIsMjQsMCwxNjUsMzksMzMsMTUyLDY0LDAsCisJMjQsMCwxNjIsMTQzLDAsMCwwLDAsMTIyLDAsNjQsMjAsCisJMCwwLDAsMCwyNTUsMjU1LDY2LDUwLDUsMCw2Niw0NCwKKwkxMTgsMCw2NCwxNiwwLDAsMCwwLDgsMCwzNCwxNDIsCisJNCwwLDM1LDE0MiwwLDAsMCwwLDM1LDE2LDY3LDAsCisJMjU1LDI1NSw5OSw1MCwzMywxNiw2NywwLDExMCwwLDE5NCwyMiwKKwkzMywzMiwwLDIsODgsMCwxOCwxNjYsOTAsMCwxOSwxNjYsCisJMzMsNDAsMTI4LDIsMTc4LDUwLDE5MiwxMiwzMyw0OCwxNjAsMiwKKwkxMTgsMCw2NCwyMCwzMywxNiwwLDAsMjU1LDI1NSw2Nyw1MCwKKwk0LDAsMiwzNiwyNCwwLDk4LDE2LDMzLDMyLDMyLDIsCisJMjQsMCwxNjUsMzksMiwwLDYsMzYsMjM5LDkwLDE5MiwxMiwKKwkzMyw1NiwwLDAsOTIsMCwyLDE3NCwzMywzMiwzMiwyLAorCTI0LDAsMTY1LDM5LDIsMCw2LDM2LDIzOSw5MCwxOTIsMTIsCisJMzMsNTYsMCwwLDk2LDAsMiwxNzQsMzMsMzIsMzIsMiwKKwkyNCwwLDE2NSwzOSwyLDAsNiwzNiwyMzksOTAsMTkyLDEyLAorCTMzLDU2LDAsMCwxMDAsMCwyLDE3NCwyNCwwLDE2MiwxNDMsCisJMCwwLDAsMCw3OCwwLDY0LDIwLDMzLDMyLDMyLDIsCisJNjcsODIsMTkyLDgsMTA0LDAsNSwzOCw0LDAsMiwzNiwKKwk4OCwwLDIsMTY2LDkwLDAsMTksMTY2LDEyNCwwLDAsMTc0LAorCTE2LDAsMTYwLDE3NSw5MiwwLDUsMzgsMjQsMCwxNjYsMzksCisJMTg2LDkxLDE5MiwxMiw2LDAsNywzNiwyNCwwLDE2MiwxNDMsCisJMCwwLDAsMCw2MywwLDY0LDIwLDEwMCwwLDQsMzgsCisJMzMsNDAsMCwwLDE0NCw3MSwxOTIsMTIsNCwwLDYsMzYsCisJMzIsMCwxNjAsMTY3LDQwLDAsMTYwLDE3NSwzNiwwLDE2MCwxNzUsCisJNDQsMCwxNjAsMTY3LDMyLDAsMTc4LDM5LDY0LDAsMiwzNiwKKwkxNiwwLDE2MiwxNzUsMzMsMzIsMzIsMiwzMyw0MCw2NCwyLAorCTI0LDAsMTY2LDM5LDExMCw5MCwxOTIsMTIsMzMsNTYsMCwwLAorCTI0LDAsMTYyLDE0MywwLDAsMCwwLDUsMCw2NCwxNiwKKwkwLDAsMCwwLDI0LDkyLDE5MiwxMiwzMywzMiw2NCwyLAorCTU4LDgyLDE5Miw4LDAsMCwwLDAsNDAsMCwxNjIsMTQzLAorCTM2LDAsMTYzLDE0MywwLDAsMCwwLDM1LDE2LDY3LDAsCisJMjU1LDI1NSw3MCw0OCw1LDAsMTk0LDQ0LDIsMCw2NCwyMCwKKwkwLDAsMCwwLDQsMCw2LDM2LDgsMCwxOTIsMTYsCisJMzMsMzIsMzIsMiwzNiwwLDE2NSwxNDMsMCwwLDAsMCwKKwk4MCw2OCwxOTIsMTIsMTAwLDAsNCwzOCwyNCw5MiwxOTIsMTIsCisJMzIsMCwxNjQsMzksMzMsMzIsMzIsMiwyNCwwLDE2NSwzOSwKKwkyLDAsNiwzNiwyMzksOTAsMTkyLDEyLDMzLDU2LDAsMCwKKwkxMDQsMCwyLDE3NCwzMywzMiwzMiwyLDI0LDAsMTY1LDM5LAorCTIsMCw2LDM2LDIzOSw5MCwxOTIsMTIsMzMsNTYsMCwwLAorCTEwOCwwLDIsMTc0LDMzLDMyLDMyLDIsMjQsMCwxNjUsMzksCisJMywwLDYsMzYsMjM5LDkwLDE5MiwxMiw2NCwwLDcsMzYsCisJMTEyLDAsMiwxNzQsMjQsMCwxNjIsMTQzLDAsMCwwLDAsCisJOSwwLDY0LDE2LDMzLDMyLDMyLDIsMywxMzEsMyw2MCwKKwkxNDAsMTcsOTksMzYsMCwwLDk4LDE0MCwwLDAsMCwwLAorCTEsMCw2NiwzNiwwLDAsOTgsMTcyLDczLDgyLDE5Miw4LAorCTMzLDE2LDAsMCwxMTYsMCw1LDM4LDMzLDQ4LDE5MiwyLAorCTE2Myw4MiwxOTIsMTIsMzMsNTYsMCwyLDI1NSwyNTUsMywzNiwKKwkyNDgsMjU1LDY3LDE2LDMzLDE2LDAsMiw3NiwwLDE5MSwxNDMsCisJNzIsMCwxODIsMTQzLDY4LDAsMTgxLDE0Myw2NCwwLDE4MCwxNDMsCisJNjAsMCwxNzksMTQzLDU2LDAsMTc4LDE0Myw1MiwwLDE3NywxNDMsCisJNDgsMCwxNzYsMTQzLDgsMCwyMjQsMyw4MCwwLDE4OSwzOSwKKwkxODQsMjU1LDE4OSwzOSw2NCwwLDE5MSwxNzUsNjAsMCwxODMsMTc1LAorCTU2LDAsMTgyLDE3NSw1MiwwLDE4MSwxNzUsNDgsMCwxODAsMTc1LAorCTQ0LDAsMTc5LDE3NSw0MCwwLDE3OCwxNzUsMzYsMCwxNzcsMTc1LAorCTMyLDAsMTc2LDE3NSwzMywxMjgsMTI4LDAsMTYsMCwxNjAsMTc1LAorCTgsMCwyLDE0Miw0LDAsMywxNDIsMCwwLDAsMCwKKwkzNSwxODQsNjcsMCwzMywxNDQsMCwwLDI1NSwyNTUsMTYyLDQ4LAorCTQ1LDAsNjQsMTYsMzMsMTM2LDAsMCwzLDEzMSwxOSw2MCwKKwkxNDAsMTcsMTE1LDM4LDI1NSwyNTUsMjIsMzYsMjU1LDI1NSwxODEsNDgsCisJOCwwLDMsMTQyLDQsMCwyLDE0MiwwLDAsMCwwLAorCTM1LDE2MCw5OCwwLDAsMCwyLDE0NiwwLDAsMCwwLAorCTEyOCwwLDY2LDQ4LDMyLDAsNjQsMjAsMzMsMzIsMCwyLAorCTEyNCw4OSwxOTIsMTIsMTYsMCwxNjUsMzksMzMsMzIsMCwyLAorCTE5OCw4OSwxOTIsMTIsMTYsMCwxNjUsMzksMzMsNDAsNjQsMCwKKwkxNiwwLDE2MiwxNDMsMCwwLDAsMCw2LDAsNjQsMjAsCisJMzMsMzIsMCwyLDI1NSwyNTUsMTY1LDQ4LDI1MSw4OCwxOTIsMTIsCisJMSwwLDYsMzYsNywwLDg2LDIwLDAsMCwwLDAsCisJMCwwLDk4LDE0MiwwLDAsMCwwLDEsMCw2NiwzNiwKKwkwLDAsOTgsMTc0LDE0Nyw4MiwxOTIsOCwyNTUsMjU1LDE3LDM2LAorCTgsMCwyLDE0Miw0LDAsMywxNDIsMCwwLDAsMCwKKwkzNSwxNiw2NywwLDMzLDE2LDY2LDIsMzUsMTQ0LDg0LDAsCisJMjU1LDI1NSw2Niw1MCw0MywxNiw4NSwwLDIxNywyNTUsNjQsMjAsCisJMSwwLDQ5LDM4LDMzLDMyLDAsMiwzMyw0MCwyMjQsMiwKKwkyNTEsODgsMTkyLDEyLDMzLDQ4LDAsMCwzMywxNiwzMiwyLAorCTY0LDAsMTkxLDE0Myw2MCwwLDE4MywxNDMsNTYsMCwxODIsMTQzLAorCTUyLDAsMTgxLDE0Myw0OCwwLDE4MCwxNDMsNDQsMCwxNzksMTQzLAorCTQwLDAsMTc4LDE0MywzNiwwLDE3NywxNDMsMzIsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw3MiwwLDE4OSwzOSwxOTIsMjU1LDE4OSwzOSwKKwk1NiwwLDE5MSwxNzUsNTIsMCwxODEsMTc1LDQ4LDAsMTgwLDE3NSwKKwk0NCwwLDE3OSwxNzUsNDAsMCwxNzgsMTc1LDM2LDAsMTc3LDE3NSwKKwkzMiwwLDE3NiwxNzUsMzMsMTQ0LDEyOCwwLDMzLDE1MiwxNjAsMCwKKwkzMywxNjgsMjI0LDAsMTYsMCwxNjAsMTc1LDEyNCw4OSwxOTIsMTIsCisJMTYsMCwxNjUsMzksMzMsMzIsNjQsMiwxOTgsODksMTkyLDEyLAorCTE2LDAsMTY1LDM5LDAsMCw5OCwxNjYsMTYsMCwxNjIsMTQzLAorCTAsMCwwLDAsMjgsMCw2NCwyMCwwLDAsMCwwLAorCTEyLDAsNjYsMTQyLDgsMCw2NywxNDIsMCwwLDAsMCwKKwkzNSwxNiw2NywwLDAsMCw5OSwxNTAsMjU1LDI1NSw2Niw0OCwKKwkyMCwwLDk4LDIwLDAsMCwwLDAsNCwwLDk2LDE3NCwKKwkwLDAsMTAxLDE1MCwwLDAsMCwwLDgzLDgyLDE5MiwxMiwKKwkzMywzMiw2NCwyLDMzLDMyLDY0LDAsMjU1LDI1NSwyLDM2LAorCTQ2LDAsMTMwLDE2LDAsMCwwLDAsMywwLDEyOCwyMCwKKwkwLDAsMCwwLDI0Niw4MiwxOTIsOCw4LDAsOTYsMTc0LAorCTIyNCw4MywxOTIsMTIsNCwwLDEwMCwxNzQsMTAsMCw2NCwyMCwKKwk4LDAsOTgsMTc0LDI0Nyw4MiwxOTIsOCwyNTUsMjU1LDIsMzYsCisJMywxMzEsMyw2MCwxNDAsMTcsOTksMzYsMCwwLDk4LDE0MCwKKwkwLDAsMCwwLDEsMCw2NiwzNiwyMTAsODIsMTkyLDgsCisJMCwwLDk4LDE3Miw4LDAsMTEyLDE0Miw0LDAsOTgsMTQyLAorCTAsMCwwLDAsMjMsMCw2NCwyNCwzMywxMzYsMCwwLAorCTI1NSwyNTUsMjAsMzYsMzMsMzIsNjQsMiwxMjQsODksMTkyLDEyLAorCTE2LDAsMTY1LDM5LDMzLDMyLDY0LDIsMTk4LDg5LDE5MiwxMiwKKwkxNiwwLDE2NSwzOSw0LDAsMiwxNjYsMTYsMCwxNjIsMTQzLAorCTAsMCwwLDAsMjMzLDI1NSw2NCwyMCwzMywzMiw2NCwyLAorCTMzLDQwLDAsMiwwLDgzLDE5MiwxMiwzMyw0OCwxNjAsMiwKKwkyMjYsMjU1LDg0LDE2LDEsMCw0OSwzOCw0LDAsOTgsMTQyLAorCTAsMCwwLDAsNDIsMTYsMzQsMiwyMzYsMjU1LDY0LDIwLAorCTY4LDAsMTYsMzgsMzMsMTYsMCwwLDU2LDAsMTkxLDE0MywKKwk1MiwwLDE4MSwxNDMsNDgsMCwxODAsMTQzLDQ0LDAsMTc5LDE0MywKKwk0MCwwLDE3OCwxNDMsMzYsMCwxNzcsMTQzLDMyLDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNjQsMCwxODksMzksMTg0LDI1NSwxODksMzksCisJNjgsMCwxOTEsMTc1LDY0LDAsMTgwLDE3NSw2MCwwLDE3OSwxNzUsCisJNTYsMCwxNzgsMTc1LDUyLDAsMTc3LDE3NSw0OCwwLDE3NiwxNzUsCisJMzMsMTI4LDEyOCwwLDMzLDE0NCwxNjAsMCwyNCwwLDE2MCwxNzUsCisJMTYsMCwxNjAsMTc1LDgsMCw2OSwzOCwyNCwwLDE2NiwzOSwKKwkxODYsOTEsMTkyLDEyLDYsMCw3LDM2LDI0LDAsMTYyLDE0MywKKwkwLDAsMCwwLDEwMywwLDY0LDIwLDAsMCwwLDAsCisJMTk2LDg4LDE5MiwxMiwzMywzMiwwLDIsMjI0LDAsODQsNDgsCisJMzMsMzIsMCwyLDEyNCw4OSwxOTIsMTIsMjQsMCwxNjUsMzksCisJMzMsMTUyLDY0LDAsMzMsMzIsMCwyLDE5OCw4OSwxOTIsMTIsCisJMjQsMCwxNjUsMzksMzMsMTM2LDY0LDAsMjQsMCwxNjIsMTQzLAorCTAsMCwwLDAsODgsMCw2NCwyMCwzNywxNiwxMTYsMiwKKwkxOCwwLDgxLDE2NiwxNiwwLDY2LDE2MiwxNiwwLDY3LDE0NiwKKwk2NCwwLDIsMzYsNDgsMCw5OCwxNiw2NSwwLDk4LDQwLAorCTE2LDAsNjQsMTYsNCwwLDIsMzYsMzEsMCw5OCwxNiwKKwk1LDAsOTgsNDAsNSwwLDY0LDE2LDIsMCwyLDM2LAorCTIyLDAsOTgsMTYsMzMsMzIsMCwyLDEyMSw4MywxOTIsOCwKKwkwLDAsMCwwLDUsMCwyLDM2LDY1LDAsOTgsMTYsCisJNiwwLDIsMzYsMjcsMCw5OCwxNiwzMywzMiwwLDIsCisJMTIxLDgzLDE5Miw4LDAsMCwwLDAsNjgsMCwyLDM2LAorCTE1LDAsOTgsMTYsNjgsMCw5OCw0MCw4LDAsNjQsMjAsCisJMzMsMzIsMCwyLDEzMSwwLDk4LDQwLDU3LDAsNjQsMTYsCisJMTI4LDAsOTgsNDAsNTEsMCw2NCwxNiwwLDAsMCwwLAorCTEyMSw4MywxOTIsOCwwLDAsMCwwLDI1NSwyNTUsMzcsNTAsCisJMTY0LDkwLDE5MiwxMiwyNCwwLDE2NiwzOSwxMTcsODMsMTkyLDgsCisJNDAsMCw2NiwxNzQsMzMsMzIsMCwyLDI1NSwyNTUsMzcsNTAsCisJNDAsMCw3MCwzOCwxOSw5MCwxOTIsMTIsMjQsMCwxNjcsMzksCisJMTE3LDgzLDE5Miw4LDAsMCwwLDAsMjU1LDI1NSwzNyw1MCwKKwk0MCwwLDcwLDM4LDI0LDkxLDE5MiwxMiwyNCwwLDE2NywzOSwKKwkxMTcsODMsMTkyLDgsMCwwLDAsMCw0MCwwLDY4LDM4LAorCTMzLDQwLDAsMCwxNDQsNzEsMTkyLDEyLDQsMCw2LDM2LAorCTMyLDAsMTYwLDE2Nyw0MCwwLDE2MCwxNzUsMzYsMCwxNjAsMTc1LAorCTQ0LDAsMTYwLDE2NywzMywzMiwwLDIsMjU1LDI1NSwzNyw1MCwKKwkzMiwwLDE2NiwzOSwxOSw5MCwxOTIsMTIsMjQsMCwxNjcsMzksCisJNDAsMCwxNjIsMTQzLDM2LDAsMTYzLDE0MywwLDAsMCwwLAorCTM1LDE2LDY3LDAsMjU1LDI1NSw3MCw0OCw1LDAsMTk0LDQ0LAorCTIsMCw2NCwyMCwwLDAsMCwwLDQsMCw2LDM2LAorCTcsMCwxOTIsMTYsMCwwLDAsMCwzNiwwLDE2NSwxNDMsCisJMCwwLDAsMCw4MCw2OCwxOTIsMTIsNDAsMCw2OCwzOCwKKwkyNCw5MiwxOTIsMTIsMzIsMCwxNjQsMzksMjQsMCwxNjIsMTQzLAorCTAsMCwwLDAsOCwwLDY0LDE2LDMzLDE2LDAsMCwKKwkzLDEzMSwzLDYwLDE0MCwxNyw5OSwzNiwwLDAsOTgsMTQwLAorCTAsMCwwLDAsMSwwLDY2LDM2LDAsMCw5OCwxNzIsCisJMjU1LDI1NSwyLDM2LDY4LDAsMTkxLDE0Myw2NCwwLDE4MCwxNDMsCisJNjAsMCwxNzksMTQzLDU2LDAsMTc4LDE0Myw1MiwwLDE3NywxNDMsCisJNDgsMCwxNzYsMTQzLDgsMCwyMjQsMyw3MiwwLDE4OSwzOSwKKwkyMzIsMjU1LDE4OSwzOSwyMCwwLDE5MSwxNzUsMTYsMCwxNzYsMTc1LAorCTMzLDEyOCwxMjgsMCw3NiwwLDIsMTQyLDAsMCwwLDAsCisJMywwLDY0LDE2LDAsMCwwLDAsMjQsOTIsMTkyLDEyLAorCTcyLDAsNCwzOCw4OCwwLDMsMTUwLDQsMCwyLDM2LAorCTUsMCw5OCwyMCwwLDAsMCwwLDExMCw4NiwxOTIsMTIsCisJOTIsMCw0LDM4LDE1Nyw4MywxOTIsOCwxMTYsMCw0LDM4LAorCTEzLDg0LDE5MiwxMiwxMDQsMCw0LDM4LDEyMCwwLDQsMzgsCisJMTMsODQsMTkyLDEyLDAsMCwwLDAsMTQ4LDAsMywxNDYsCisJMCwwLDAsMCwyNDgsODMsMTkyLDEyLDMzLDMyLDAsMiwKKwkyMCwwLDE5MSwxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkyNCwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwyMCwwLDE5MSwxNzUsCisJMTYsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCw1LDAsMCwxOCwKKwkwLDAsMCwwLDEzNiw4MywxOTIsMTIsMCwwLDAsMCwKKwk2MSw1MCwxOTIsMTIsMzMsMzIsMCwyLDIwLDAsMTkxLDE0MywKKwkxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLDI0LDAsMTg5LDM5LAorCTIyNCwyNTUsMTg5LDM5LDI0LDAsMTkxLDE3NSwyMCwwLDE3NywxNzUsCisJMTYsMCwxNzYsMTc1LDMzLDEzNiwxMjgsMCw5LDUwLDE5MiwxMiwKKwkxNiwwLDQsMzYsMzMsMTI4LDY0LDAsMTEsMCwwLDE4LAorCTMzLDMyLDAsMiwzMyw0MCwwLDAsMTQ0LDcxLDE5MiwxMiwKKwkxNiwwLDYsMzYsMjI0LDgzLDE5MiwxMiwzMywzMiwzMiwyLAorCTQsMCw2NCwxNiw4LDAsMiwxNzQsNCwwLDE3LDE3NCwKKwkyMDQsODMsMTkyLDgsMzMsMTYsMCwyLDYxLDUwLDE5MiwxMiwKKwkzMywzMiwwLDIsMzMsMTYsMCwwLDI0LDAsMTkxLDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkzMiwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwyMCwwLDE5MSwxNzUsCisJMTYsMCwxNzYsMTc1LDksNTAsMTkyLDEyLDE1MiwwLDQsMzYsCisJMzMsMTI4LDY0LDAsNCwwLDAsMTgsMzMsMTYsMCwwLAorCTI0OCw4MywxOTIsMTIsMzMsMzIsMCwyLDMzLDE2LDAsMiwKKwkyMCwwLDE5MSwxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkyNCwwLDE4OSwzOSwyMjQsMjU1LDE4OSwzOSwyNCwwLDE5MSwxNzUsCisJMjAsMCwxNzcsMTc1LDAsMTcsNCwwLDMzLDE2LDY4LDAsCisJMTI4LDEzNiwyLDAsMTEsMCwzMiwxOCwxNiwwLDE3NiwxNzUsCisJOSw1MCwxOTIsMTIsMzMsMzIsMzIsMiwzMywxMjgsNjQsMCwKKwk0LDAsMCwxOCwzMywzMiwwLDIsMzMsNDAsMCwwLAorCTE0NCw3MSwxOTIsMTIsMzMsNDgsMzIsMiwyNDMsODMsMTkyLDgsCisJMzMsMTYsMCwyLDMzLDE2LDAsMCwyNCwwLDE5MSwxNDMsCisJMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJMzIsMCwxODksMzksMjMyLDI1NSwxODksMzksMjAsMCwxOTEsMTc1LAorCTE2LDAsMTc2LDE3NSwzMywxMjgsMTI4LDAsMzMsNDAsMCwwLAorCTE0NCw3MSwxOTIsMTIsMTUyLDAsNiwzNiwyNTUsMCwyLDM2LAorCTg4LDAsMiwxNjYsMTIwLDUsMiwzNiw1OCwwLDIsMTY2LAorCTcyLDAsMCwxNjYsODAsMCwwLDE3NCw3NiwwLDAsMTc0LAorCTg0LDAsMCwxNjYsMTQ4LDAsMCwxNjIsMTQ5LDAsMCwxNjIsCisJMjAsMCwxOTEsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJMjQsMCwxODksMzksMjA4LDI1NSwxODksMzksNDAsMCwxOTEsMTc1LAorCTM2LDAsMTc5LDE3NSwzMiwwLDE3OCwxNzUsMjgsMCwxNzcsMTc1LAorCTI0LDAsMTc2LDE3NSwzMywxMjgsMTI4LDAsMzEsMCwwLDE4LAorCTEsMCwxOSwzNiw4LDAsMTgsMTQyLDAsMCwwLDAsCisJMTYsMCw2NCwxOCwwLDAsMCwwLDQsMCwyLDE0MiwKKwkwLDAsMCwwLDksMCw2NCwyNCwzMywxMzYsMCwwLAorCTU5LDg0LDE5MiwxMiwzMywzMiw2NCwyLDEsMCw0OSwzOCwKKwk0LDAsMiwxNDIsMCwwLDAsMCw0MiwxNiwzNCwyLAorCTI0OSwyNTUsNjQsMjAsNjgsMCw4MiwzOCw4LDAsNCwxNDIsCisJNjEsNTAsMTkyLDEyLDAsMCwwLDAsMTIsMCwxNywxNDIsCisJNCwwLDk2LDE4LDAsMCwwLDAsMzMsMTUyLDAsMCwKKwk0OSw4NCwxOTIsOCw0LDAsMCwxNzQsNjEsNTAsMTkyLDEyLAorCTMzLDMyLDAsMiwzMywxMjgsMzIsMiwyMjcsMjU1LDAsMjIsCisJMCwwLDAsMCw0MCwwLDE5MSwxNDMsMzYsMCwxNzksMTQzLAorCTMyLDAsMTc4LDE0MywyOCwwLDE3NywxNDMsMjQsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw0OCwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwKKwkyMCwwLDE5MSwxNzUsMTYsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCwKKwk2MCwwLDIsMTQyLDAsMCwwLDAsNCwwLDY0LDE2LAorCTAsMCwwLDAsOSwyNDgsNjQsMCwwLDAsMCwwLAorCTYwLDAsMCwxNzQsMTEwLDg2LDE5MiwxMiw4LDAsNCwzOCwKKwk3OCw4NCwxOTIsMTIsMzMsMzIsMCwyLDIwLDAsMTkxLDE0MywKKwkxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLDI0LDAsMTg5LDM5LAorCTIzMiwyNTUsMTg5LDM5LDE2LDAsMTkxLDE3NSwxNiwwLDEzMSwxNDQsCisJNiwwLDIsMzYsMTgsMCw5OCwxNiw3LDAsOTgsNDAsCisJNSwwLDY0LDE2LDQsMCwyLDM2LDYsMCw5OCwxNiwKKwkwLDAsMCwwLDEwMyw4NCwxOTIsOCwwLDAsMCwwLAorCTY4LDAsMiwzNiwxMSwwLDk4LDIwLDAsMCwwLDAsCisJNDQsMCwxMzAsMTQwLDAsMCwwLDAsNywwLDY0LDE2LAorCTAsMCwwLDAsMjQsOTIsMTkyLDEyLDQwLDAsMTMyLDM2LAorCTEwMyw4NCwxOTIsOCwwLDAsMCwwLDExMCw4NiwxOTIsMTIsCisJNDAsMCwxMzIsMzYsMTYsMCwxOTEsMTQzLDI0LDAsMTg5LDM5LAorCTgsMCwyMjQsMywwLDAsMCwwLDAsMCwwLDAsCisJMjE2LDI1NSwxODksMzksMzIsMCwxOTEsMTc1LDI4LDAsMTc5LDE3NSwKKwkyNCwwLDE3OCwxNzUsMjAsMCwxNzcsMTc1LDE2LDAsMTc2LDE3NSwKKwkzMywxMzYsMTkyLDAsNTYsMCwxNzksMTQzLDAsMCwwLDAsCisJMjAsNzIsMTkyLDEyLDMzLDE0NCwyMjQsMCwzMywxMjgsNjQsMCwKKwkxMSwwLDAsMTgsMzMsMzIsMzIsMiwzMyw0MCw2NCwyLAorCTgwLDg2LDE5MiwxMiw4LDAsNiwzOCwyNTUsMjU1LDMsMzYsCisJNSwwLDY3LDE2LDIsMCwyLDM2LDE2LDAsMiwxNjIsCisJNDAsMCwxOSwxNzQsMTMzLDg0LDE5Miw4LDMzLDE2LDAsMCwKKwkyNTUsMjU1LDIsMzYsMzIsMCwxOTEsMTQzLDI4LDAsMTc5LDE0MywKKwkyNCwwLDE3OCwxNDMsMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNDAsMCwxODksMzksMjE2LDI1NSwxODksMzksCisJMzIsMCwxOTEsMTc1LDI4LDAsMTc3LDE3NSwyNCwwLDE3NiwxNzUsCisJMzMsMTI4LDEyOCwwLDk2LDAsNSwxNzQsMTAwLDAsNiwxNzQsCisJMTI4LDAsMiwxNDIsMCwwLDAsMCwxMSwwLDY0LDE2LAorCTAsMCwwLDAsMTMsODQsMTkyLDEyLDEwNCwwLDQsMzgsCisJMTI0LDAsMiwxNDIsMCwwLDAsMCwxMDgsMCwyLDE3NCwKKwkxMjgsMCwyLDE0MiwwLDAsMCwwLDExMiwwLDIsMTc0LAorCTEyOCwwLDAsMTc0LDEyNCwwLDAsMTc0LDg4LDAsMTcsMTUwLAorCTIsMCwyLDM2LDg4LDAsMiwxNjYsMTc2LDgwLDE5MiwxMiwKKwkzMywzMiwwLDIsMzMsNTYsNjQsMCw2NCwwLDIsMTQyLAorCTAsMCwwLDAsMzUsMCw2NCwyMCwyNTUsMjU1LDM1LDUwLAorCTMsMCwyLDM2LDE0LDAsOTgsMTYsMjU1LDI1NSwyMjcsNDgsCisJNTgsMCwyLDE1MCwwLDAsMCwwLDQzLDE2LDY3LDAsCisJOSwwLDY0LDE2LDEyLDAsNCwzOCw0OCwwLDIsMTQyLAorCTI4LDAsNSwzOCw1MiwwLDcsMTQyLDAsMCwwLDAsCisJOSwyNDgsNjQsMCwxLDAsNiwzNiwyMTQsODQsMTkyLDgsCisJMCwwLDAsMCw5NiwwLDIsMTQyLDAsMCwwLDAsCisJMjUwLDI1NSw2NywzNiwxMywwLDk4LDQ0LDEzLDAsNjQsMTYsCisJMTI4LDE2LDMsMCwyLDEzMSwxLDYwLDMzLDgsMzQsMCwKKwkzMiwxNTQsMzQsMTQwLDAsMCwwLDAsOCwwLDY0LDAsCisJMCwwLDAsMCwyMDQsODQsMTkyLDgsMiwwLDIsMzYsCisJMjA0LDg0LDE5Miw4LDMsMCwyLDM2LDUsMCwyLDM2LAorCTk2LDAsMiwxNzQsNTIsMCwyLDE0MiwwLDAsMCwwLAorCTE2LDAsMTYyLDE3NSw0NCwwLDIsMTQyLDEyLDAsNCwzOCwKKwkyOCwwLDUsMzgsMzMsNDgsMCwyLDksMjQ4LDY0LDAsCisJMjU1LDI1NSwyMzEsNDgsMzIsMCwxOTEsMTQzLDI4LDAsMTc3LDE0MywKKwkyNCwwLDE3NiwxNDMsOCwwLDIyNCwzLDQwLDAsMTg5LDM5LAorCTIyNCwyNTUsMTg5LDM5LDI4LDAsMTkxLDE3NSwyNCwwLDE3NiwxNzUsCisJMzMsMTI4LDEyOCwwLDk2LDAsNSwxNDIsMCwwLDAsMCwKKwk2LDAsMTYwLDE2LDAsMCwwLDAsMTAwLDAsNiwxNDIsCisJMTQwLDg0LDE5MiwxMiwwLDAsMCwwLDU2LDg1LDE5Miw4LAorCTAsMCwwLDAsMTc2LDgwLDE5MiwxMiwzMywzMiwwLDIsCisJMzMsNTYsNjQsMCw4OCwwLDIsMTUwLDAsMCwwLDAsCisJMiwwLDY2LDQ0LDExLDAsNjQsMTYsMjU1LDI1NSwyMjcsNDgsCisJNTgsMCwyLDE1MCwwLDAsMCwwLDQzLDE2LDY3LDAsCisJNiwwLDY0LDE2LDMzLDMyLDAsMiwxLDAsNSwzNiwKKwkxNDAsODQsMTkyLDEyLDMzLDQ4LDAsMCw1Niw4NSwxOTIsOCwKKwkwLDAsMCwwLDk2LDAsMiwxNDIsMCwwLDAsMCwKKwk0OSwwLDY0LDIwLDIsMCwyLDM2LDg4LDAsMywxNTAsCisJMywwLDIsMzYsMzMsMCw5OCwxNiw0LDAsOTgsNDAsCisJNywwLDY0LDE2LDIsMCw5OCw0MCw0MSwwLDY0LDE2LAorCTIsMCwyLDM2LDM5LDAsOTYsNCwwLDAsMCwwLAorCTEzLDg1LDE5Miw4LDAsMCwwLDAsNSwwLDIsMzYsCisJMzQsMCw5OCwyMCwyLDAsMiwzNiwzLDEzMSwzLDYwLAorCTIzNiwxNyw5OSwzNiwwLDAsOTgsMTQwLDAsMCwwLDAsCisJMSwwLDY2LDM2LDEwNCwwLDQsMzgsMjUsMCwxMjgsMTYsCisJMCwwLDk4LDE3MiwzLDEzMSw1LDYwLDE3NiwxNywxNjUsMzYsCisJMCwwLDE2MiwxNDAsMTA4LDAsMywxNDIsMCwwLDAsMCwKKwkzMywxNiw2NywwLDAsMCwxNjIsMTcyLDEyLDAsMTMyLDE0MCwKKwkwLDAsMCwwLDI0OCwyNTUsMTI4LDIwLDIsMCwyLDM2LAorCTQ3LDg1LDE5Miw4LDg4LDAsMiwxNjYsMywxMzEsNCw2MCwKKwkyMzYsMTcsMTMyLDM2LDAsMCwxMzAsMTQwLDAsMCwwLDAsCisJMSwwLDY2LDM2LDAsMCwxMzAsMTcyLDIwMCwyNTUsMTMwLDE0MCwKKwkxMDgsMCwzLDE0MiwwLDAsMCwwLDMzLDE2LDY3LDAsCisJMjAwLDI1NSwxMzAsMTcyLDIsMCwyLDM2LDg4LDAsMiwxNjYsCisJNTIsMCwyLDE0MiwwLDAsMCwwLDE2LDAsMTYyLDE3NSwKKwk0NCwwLDIsMTQyLDEyLDAsNCwzOCwyOCwwLDUsMzgsCisJMzMsNDgsMCwyLDksMjQ4LDY0LDAsMjU1LDI1NSwyMzEsNDgsCisJMjgsMCwxOTEsMTQzLDI0LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJMzIsMCwxODksMzksMjMyLDI1NSwxODksMzksMjAsMCwxOTEsMTc1LAorCTE2LDAsMTc2LDE3NSwzMywxMjgsMTI4LDAsODgsMCwzLDE1MCwKKwkxLDAsMiwzNiwyNSwwLDk4LDE2LDIsMCw5OCw0MCwKKwk1LDAsNjQsMTYsMywwLDIsMzYsNywwLDk2LDE2LAorCTAsMCwwLDAsMTE2LDg1LDE5Miw4LDAsMCwwLDAsCisJMzcsMCw5OCwxNiwwLDAsMCwwLDExNiw4NSwxOTIsOCwKKwkwLDAsMCwwLDExMiwwLDQsMTQyLDEwOCwwLDMsMTQyLAorCTAsMCwwLDAsMzQsMCw5NiwxNiwwLDAsMCwwLAorCTE3LDAsMTMwLDE0NCwwLDAsMCwwLDIsMCw2Niw0OCwKKwkzMywwLDY0LDE2LDI1NSwyNTUsOTksMzYsMjUwLDI1NSw5NiwyMCwKKwk2OCwwLDEzMiwzNiwxMTYsODUsMTkyLDgsMCwwLDAsMCwKKwkxMTIsMCw0LDE0MiwxMDgsMCwzLDE0MiwwLDAsMCwwLAorCTgsMCw5NiwxNiwwLDAsMCwwLDE3LDAsMTMwLDE0NCwKKwkwLDAsMCwwLDIsMCw2Niw0OCwxOSwwLDY0LDE2LAorCTI1NSwyNTUsOTksMzYsMjUwLDI1NSw5NiwyMCw2OCwwLDEzMiwzNiwKKwkxMTgsOTMsMTkyLDEyLDMzLDMyLDAsMiwyNDEsMjU1LDY0LDI4LAorCTI1NSwyNTUsNjYsNDAsNywwLDY0LDE2LDAsMCwwLDAsCisJOTIsODUsMTkyLDgsMCwwLDAsMCwxMjAsOTQsMTkyLDEyLAorCTMzLDMyLDAsMiw1LDAsNjQsMjAsMCwwLDAsMCwKKwkyMTksODQsMTkyLDEyLDMzLDMyLDAsMiwxNjcsODMsMTkyLDEyLAorCTMzLDMyLDAsMiwyMCwwLDE5MSwxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywyNCwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwKKwkyMCwwLDE5MSwxNzUsMTYsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCwKKwk4OCwwLDMsMTUwLDEsMCwyLDM2LDE3LDAsOTgsMTYsCisJMiwwLDk4LDQwLDUsMCw2NCwxNiwzLDAsMiwzNiwKKwk5LDAsOTYsMTYsMCwwLDAsMCwxNTYsODUsMTkyLDgsCisJMCwwLDAsMCwxMywwLDk4LDE2LDUsMCwyLDM2LAorCTcsMCw5OCwxNiwwLDAsMCwwLDE1Niw4NSwxOTIsOCwKKwkwLDAsMCwwLDYwLDk1LDE5MiwxMiwzMywzMiwwLDIsCisJMTU0LDg1LDE5Miw4LDAsMCwwLDAsMCw5MywxOTIsMTIsCisJMzMsMzIsMCwyLDE1NCw4NSwxOTIsOCwwLDAsMCwwLAorCTI1Miw5MywxOTIsMTIsMzMsMzIsMCwyLDUsMCw2NCwyMCwKKwkwLDAsMCwwLDYwLDg1LDE5MiwxMiwzMywzMiwwLDIsCisJMTYyLDg1LDE5Miw4LDAsMCwwLDAsMTY3LDgzLDE5MiwxMiwKKwkzMywzMiwwLDIsMjAsMCwxOTEsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsMjQsMCwxODksMzksMTkyLDI1NSwxODksMzksCisJNjAsMCwxOTEsMTc1LDU2LDAsMTgyLDE3NSw1MiwwLDE4MSwxNzUsCisJNDgsMCwxODAsMTc1LDQ0LDAsMTc5LDE3NSw0MCwwLDE3OCwxNzUsCisJMzYsMCwxNzcsMTc1LDMyLDAsMTc2LDE3NSwzMyw2NCwxMjgsMCwKKwkzMywxMzYsMTkyLDAsMzMsMTUyLDIyNCwwLDg0LDAsMTgyLDE0MywKKwk4OCwwLDE4MSwxNDMsOTIsMCwxODAsMTQzLDgwLDAsMTc4LDE1MSwKKwkzLDEzMSwzLDYwLDEyOCwxNyw5OSwzNiwwLDAsOTgsMTQwLAorCTAsMCwwLDAsMSwwLDY2LDM2LDAsMCw5OCwxNzIsCisJMjQsMCwxNjIsMzksMTYsMCwxNjIsMTc1LDMzLDMyLDE2MCwwLAorCTE2LDgxLDE5MiwxMiwzMyw0MCwwLDEsMzMsMTI4LDY0LDAsCisJNTcsMCwwLDE4LDI1NSwyNTUsNjYsNTAsNTgsMCwzLDE1MCwKKwkwLDAsMCwwLDQzLDE2LDY3LDAsMiwwLDY0LDE2LAorCTAsMCwwLDAsNTgsMCwxOCwxNjYsNDQsMCwyMiwxNzQsCisJNDgsMCwyMSwxNzQsNTIsMCwyMCwxNzQsMjQsMCwxNjIsMTQzLAorCTAsMCwwLDAsNywwLDY0LDE2LDEsMCwyLDM2LAorCTIxOSw4NCwxOTIsMTIsMzMsMzIsMCwyLDE2Nyw4MywxOTIsMTIsCisJMzMsMzIsMCwyLDUsODYsMTkyLDgsMCwwLDAsMCwKKwk4OCwwLDMsMTUwLDAsMCwwLDAsMTYsMCw5OCwxNiwKKwkyLDAsOTgsNDAsNSwwLDY0LDE2LDMsMCwyLDM2LAorCTksMCw5NiwxNiwwLDAsMCwwLDI0NCw4NSwxOTIsOCwKKwkwLDAsMCwwLDExLDAsOTgsMTYsNSwwLDIsMzYsCisJMzEsMCw5OCwxNiwwLDAsMCwwLDI0NCw4NSwxOTIsOCwKKwkwLDAsMCwwLDMsMTMxLDMsNjAsMjM5LDg1LDE5Miw4LAorCTE4NCwxNyw5OSwzNiwzLDEzMSwzLDYwLDIzOSw4NSwxOTIsOCwKKwkxODgsMTcsOTksMzYsMywxMzEsMyw2MCwxOTIsMTcsOTksMzYsCisJMCwwLDk4LDE0MCwwLDAsMCwwLDEsMCw2NiwzNiwKKwkzLDg2LDE5Miw4LDAsMCw5OCwxNzIsMywxMzEsMyw2MCwKKwkxNDAsMTcsOTksMzYsMCwwLDk4LDE0MCwwLDAsMCwwLAorCTEsMCw2NiwzNiwwLDAsOTgsMTcyLDE2Nyw4MywxOTIsMTIsCisJMzMsMzIsMCwyLDMzLDMyLDMyLDIsMzMsNDAsOTYsMiwKKwkxLDAsNiwzNiw5LDI0OCwxNjAsMiwzMyw1NiwxMjgsMiwKKwk1LDg2LDE5Miw4LDAsMCwwLDAsMTI0LDg1LDE5MiwxMiwKKwkzMywzMiwwLDIsNjAsMCwxOTEsMTQzLDU2LDAsMTgyLDE0MywKKwk1MiwwLDE4MSwxNDMsNDgsMCwxODAsMTQzLDQ0LDAsMTc5LDE0MywKKwk0MCwwLDE3OCwxNDMsMzYsMCwxNzcsMTQzLDMyLDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNjQsMCwxODksMzksMjMyLDI1NSwxODksMzksCisJMjAsMCwxOTEsMTc1LDE2LDAsMTc2LDE3NSwzMywxMjgsMTI4LDAsCisJMjEzLDgwLDE5MiwxMiwyNTUsMjU1LDE5OCw0OCw1MywwLDY0LDIwLAorCTI1NSwyNTUsMiwzNiwzLDEzMSwzLDYwLDE0NCwxNyw5OSwzNiwKKwkwLDAsOTgsMTQwLDAsMCwwLDAsMSwwLDY2LDM2LAorCTAsMCw5OCwxNzIsOTYsMCwyLDE0MiwwLDAsMCwwLAorCTMyLDAsNjQsMTYsNCwwLDIsMzYsOTIsMCw5OCwxNDAsCisJMCwwLDAsMCwxLDAsNjYsMzYsOTIsMCw5OCwxNzIsCisJOTYsMCwyLDE0MiwwLDAsMCwwLDI1NSwyNTUsNjcsMzYsCisJNSwwLDk4LDQ0LDMyLDAsNjQsMTYsMTI4LDE2LDMsMCwKKwkyLDEzMSwxLDYwLDMzLDgsMzQsMCw4OCwxNTQsMzQsMTQwLAorCTAsMCwwLDAsOCwwLDY0LDAsMCwwLDAsMCwKKwkzLDEzMSwzLDYwLDcwLDg2LDE5Miw4LDIwNCwxNyw5OSwzNiwKKwkzLDEzMSwzLDYwLDcwLDg2LDE5Miw4LDIxMiwxNyw5OSwzNiwKKwkzLDEzMSwzLDYwLDcwLDg2LDE5Miw4LDIxNiwxNyw5OSwzNiwKKwkzLDEzMSwzLDYwLDcwLDg2LDE5Miw4LDIwOCwxNyw5OSwzNiwKKwkzLDEzMSwzLDYwLDcwLDg2LDE5Miw4LDIyMCwxNyw5OSwzNiwKKwk4OCwwLDMsMTUwLDAsMCwwLDAsOCwwLDk4LDIwLAorCTMzLDE2LDAsMCwzLDEzMSwzLDYwLDI0MCwxNyw5OSwzNiwKKwkwLDAsOTgsMTQwLDAsMCwwLDAsMSwwLDY2LDM2LAorCTAsMCw5OCwxNzIsMzMsMTYsMCwwLDIwLDAsMTkxLDE0MywKKwkxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLDI0LDAsMTg5LDM5LAorCTAsMCwwLDAsMjI0LDI1NSwxODksMzksMjgsMCwxOTEsMTc1LAorCTI0LDAsMTc4LDE3NSwyMCwwLDE3NywxNzUsMTYsMCwxNzYsMTc1LAorCTMzLDE0NCwxNjAsMCwzMywxMjgsMTkyLDAsNCwwLDAsMTc0LAorCTE0LDAsMTI4LDE2LDAsMCw0LDE3NCwxMjgsMTM2LDQsMCwKKwk5LDUwLDE5MiwxMiwzMywzMiwzMiwyLDMsMCw2NCwyMCwKKwk0LDAsMiwxNzQsMTA0LDg2LDE5Miw4LDI1NSwyNTUsMiwzNiwKKwk1LDAsMzIsMTgsMzMsNDAsNjQsMiw0LDAsNCwxNDIsCisJMCwwLDAsMCw4MCw2OCwxOTIsMTIsMzMsNDgsMzIsMiwKKwkzMywxNiwwLDAsMjgsMCwxOTEsMTQzLDI0LDAsMTc4LDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkzMiwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwyMCwwLDE5MSwxNzUsCisJMTYsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCw0LDAsNCwxNDIsCisJMCwwLDAsMCw0LDAsMTI4LDE2LDAsMCwwLDAsCisJNjEsNTAsMTkyLDEyLDAsMCwwLDAsNCwwLDAsMTc0LAorCTAsMCwwLDE3NCwyMCwwLDE5MSwxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywyNCwwLDE4OSwzOSwwLDAsMCwwLAorCTAsMCwwLDAsMTEsMCwxMjgsNCwxMjgsMCwxMzAsNDAsCisJMjAsMCw2NCwyMCwxLDAsMywzNiwyNTUsMTI3LDIsMzYsCisJNDIsMTYsNjgsMCwxNiwwLDY0LDE2LDIsMCwzLDM2LAorCTEyNywwLDIsNjAsMjU1LDI1NSw2Niw1MiwxNDgsODYsMTkyLDgsCisJNDIsMTYsNjgsMCwxMjgsMjU1LDEzMCw0MCw5LDAsNjQsMTYsCisJMSwwLDMsMzYsMCwxMjgsMTMwLDQwLDYsMCw2NCwxNiwKKwkyLDAsMywzNiwxMjgsMjU1LDIsNjAsNDIsMTYsMTMwLDAsCisJMiwwLDY0LDIwLDQsMCwzLDM2LDMsMCwzLDM2LAorCTgsMCwyMjQsMywzMywxNiw5NiwwLDEyOCwwLDEzMCw0NCwKKwkxNCwwLDY0LDIwLDEsMCwyLDM2LDI1NSwxMjcsMiwzNiwKKwk0MywxNiw2OCwwLDksMCw2NCwxNiwxMjcsMCwyLDYwLAorCTI1NSwyNTUsNjYsNTIsNDMsMTYsNjgsMCw2LDAsNjQsMTYsCisJMywwLDIsMzYsNCwwLDEyOCw0LDUsMCwyLDM2LAorCTE2OSw4NiwxOTIsOCw0LDAsMiwzNiwyLDAsMiwzNiwKKwk4LDAsMjI0LDMsMCwwLDAsMCw0LDAsMTM1LDE0MCwKKwkwLDAsMTMwLDE0MCwwLDAsMCwwLDY1LDAsNjQsMTYsCisJMzMsMTYsMCwwLDAsMCwyMjcsMTQwLDQsMCwyMzEsMzYsCisJMTI4LDE2LDMsMCwzMywxNiw2NywwLDE5MiwxNiwyLDAsCisJMCwwLDIyNywxNDAsMCwwLDAsMCwzMywyNCw2NywwLAorCTEyOCwwLDk4LDQ0LDE3LDAsNjQsMjAsNCwwLDIzMSwzNiwKKwkwLDY0LDk4LDQ0LDE1LDAsNjQsMjAsMiwwLDUsMzYsCisJMzEsMCwyLDYwLDI1NSwyNTUsNjYsNTIsNDMsMTYsNjcsMCwKKwk3LDAsNjQsMTYsMjU1LDE1LDIsNjAsMjU1LDI1NSw2Niw1MiwKKwk0MywxNiw2NywwLDYsMCw2NCwyMCw1LDAsNSwzNiwKKwkyMDQsODYsMTkyLDgsNCwwLDUsMzYsMjA0LDg2LDE5Miw4LAorCTMsMCw1LDM2LDEsMCw1LDM2LDIsMCw2LDM2LAorCTAsMCwxMzAsMTQwLDAsMCwwLDAsNDIsMTYsMTk0LDAsCisJMzEsMCw2NCwxNiwyNTUsMjU1LDE2Miw0OCwzMSwwLDksNjAsCisJMjU1LDI1NSw0MSw1MywyNTUsMTUsOCw2MCwyNTUsMjU1LDgsNTMsCisJMCwwLDEzMiwxNDAsMCwwLDIyNywxNDAsNCwwLDIzMSwzNiwKKwkxMjgsMCw5OCw0NCwxNiwwLDY0LDIwLDI1NSwyNTUsMTY1LDQ4LAorCTAsNjQsOTgsNDQsMTEsMCw2NCwyMCw0MywxNiwzNSwxLAorCTcsMCw2NCwxNiw0MywxNiwzLDEsMywwLDY0LDIwLAorCTAsMCwwLDAsMjM2LDg2LDE5Miw4LDQsMCwxNjUsMzYsCisJMjM2LDg2LDE5Miw4LDUsMCwxNjUsMzYsMjM2LDg2LDE5Miw4LAorCTMsMCwxNjUsMzYsMjM2LDg2LDE5Miw4LDIsMCwxNjUsMzYsCisJMSwwLDE2NSwzNiwxLDAsMTk4LDM2LDQyLDE2LDE5NiwwLAorCTIzMiwyNTUsNjQsMjAsMjU1LDI1NSwxNjIsNDgsOCwwLDIyNCwzLAorCTAsMCwwLDAsMjA4LDI1NSwxODksMzksNDAsMCwxOTEsMTc1LAorCTMzLDcyLDE5MiwwLDIyNCwwLDE2NSw0OCwyNTUsMjU1LDEzMCw0OCwKKwkzMSwwLDY2LDQ0LDcsMCw2NCwxNiwzMyw0OCwxNjAsMCwKKwkzNywxNiwxMzMsMCwxNiwwLDE2MiwxNjMsMzMsMzIsMjI0LDAsCisJMTYsMCwxNjUsMzksMzgsODcsMTkyLDgsMSwwLDYsMzYsCisJMzIsMCwxNjMsMzksMzMsNDAsMCwwLDMxLDAsMTk0LDUyLAorCTI0LDAsMTYyLDE2MywyNTUsMjU1LDEzMCw0OCw4LDAsNjQsMTYsCisJMjUsMCwxNjgsMzksMTI3LDAsMTMwLDQ4LDAsMCw5OCwxNjAsCisJMSwwLDk5LDM2LDI1NSwyNTUsMTMwLDQ4LDE5NCwzMywyLDAsCisJMjUwLDI1NSwxMjgsMjAsMSwwLDE2NSwzNiwxLDAsMTY2LDM2LAorCTMzLDE2LDE2MCwwLDI1NSwyNTUsNjYsNDgsMiwwLDY2LDQ0LAorCTEzLDAsNjQsMjAsMjU1LDI1NSwxNjUsMzYsMjU1LDI1NSw0LDUyLAorCTI1NSwyNTUsOTksMzYsMCwwLDk4LDE0NCwwLDAsMCwwLAorCTEyOCwwLDY2LDUyLDAsMCwyLDE2MSwxLDAsOCwzNywKKwkzMywxNiwxNjAsMCwyNTUsMjU1LDY2LDQ4LDIsMCw2Niw0NCwKKwkyNDYsMjU1LDY0LDE2LDMzLDQwLDE2NCwwLDI1NSwyNTUsOTgsMTQ0LAorCTAsMCwwLDAsMCwwLDIsMTYxLDMzLDMyLDIyNCwwLAorCTI0LDAsMTY1LDM5LDI1NSwyNTUsMTk4LDQ4LDksMjQ4LDMyLDEsCisJMCwwLDAsMCw0MCwwLDE5MSwxNDMsNDgsMCwxODksMzksCisJOCwwLDIyNCwzLDAsMCwwLDAsMjA4LDI1NSwxODksMzksCisJNDAsMCwxOTEsMTc1LDMzLDcyLDE2MCwwLDI1NSwyNTUsMTMwLDQ4LAorCTEyOCwwLDY2LDQ0LDYsMCw2NCwxNiwzMyw2NCwxOTIsMCwKKwkxNiwwLDE2NCwxNjMsMzMsMzIsMCwxLDE2LDAsMTY1LDM5LAorCTg4LDg3LDE5Miw4LDEsMCw2LDM2LDI0LDAsMTY3LDM5LAorCTMyLDAsMTY1LDM5LDI1NSwyNTUsMTMwLDQ4LDcsMCw2NCwxNiwKKwkzMywyNCwwLDAsMCwwLDE2NCwxNjAsMSwwLDE2NSwzNiwKKwkyNTUsMjU1LDEzMCw0OCwyLDM0LDIsMCwyNTEsMjU1LDEyOCwyMCwKKwkxLDAsOTksMzYsMTI4LDAsOTgsNTIsMCwwLDIyNiwxNjAsCisJMSwwLDIzMSwzNiwxLDAsMTAyLDM2LDMzLDE2LDk2LDAsCisJMjU1LDI1NSw2Niw0OCwxMSwwLDY0LDE2LDI1NSwyNTUsOTksMzYsCisJMjU1LDI1NSw0LDUyLDI1NSwyNTUsMTY1LDM2LDAsMCwxNjIsMTQ0LAorCTAsMCwwLDAsMCwwLDIyNiwxNjAsMSwwLDIzMSwzNiwKKwkzMywxNiw5NiwwLDI1NSwyNTUsNjYsNDgsMjQ4LDI1NSw2NCwyMCwKKwkzMywyNCwxMDAsMCwzMywzMiwwLDEsMjQsMCwxNjUsMzksCisJMjU1LDI1NSwxOTgsNDgsOSwyNDgsMzIsMSwwLDAsMCwwLAorCTQwLDAsMTkxLDE0Myw0OCwwLDE4OSwzOSw4LDAsMjI0LDMsCisJMCwwLDAsMCwyMDAsMjU1LDE4OSwzOSw0OCwwLDE5MSwxNzUsCisJNDQsMCwxODEsMTc1LDQwLDAsMTgwLDE3NSwzNiwwLDE3OSwxNzUsCisJMzIsMCwxNzgsMTc1LDI4LDAsMTc3LDE3NSwyNCwwLDE3NiwxNzUsCisJMzMsMTM2LDE2MCwwLDMzLDE0NCwxOTIsMCwzMywxNTIsMjI0LDAsCisJNzIsMCwxODAsMTQzLDMzLDEyOCwxMjgsMCwxMjgsODYsMTkyLDEyLAorCTMzLDMyLDY0LDIsMzMsMTY4LDY0LDAsMjU1LDI1NSw0LDUwLAorCTE5MiwwLDM3LDUwLDMzLDQ4LDk2LDIsMjQyLDg2LDE5MiwxMiwKKwkzMyw1NiwxMjgsMiwyNTUsMjU1LDE3Niw1MCwzMywzMiwwLDIsCisJMzMsNDAsOTYsMiw0NCw4NywxOTIsMTIsMzMsNDgsMTI4LDIsCisJMTYsMCwxNjIsMzksMzMsMjQsODAsMCwyNTUsMjU1LDk5LDM2LAorCTYsMCw5OCwxNiwwLDAsMTE0LDE2MCwxNiwwLDE2MiwzOSwKKwkzLDE0NiwxOCwwLDI1NSwyNTUsOTksMzYsMjUzLDI1NSw5OCwyMCwKKwkwLDAsMTE0LDE2MCwzMywzMiwxMjgsMiwxNiwwLDE2NSwzOSwKKwk5LDI0OCw5NiwyLDI1NSwyNTUsMTY2LDUwLDQ4LDAsMTkxLDE0MywKKwk0NCwwLDE4MSwxNDMsNDAsMCwxODAsMTQzLDM2LDAsMTc5LDE0MywKKwkzMiwwLDE3OCwxNDMsMjgsMCwxNzcsMTQzLDI0LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNTYsMCwxODksMzksMjAwLDI1NSwxODksMzksCisJNDgsMCwxOTEsMTc1LDQ0LDAsMTgxLDE3NSw0MCwwLDE4MCwxNzUsCisJMzYsMCwxNzksMTc1LDMyLDAsMTc4LDE3NSwyOCwwLDE3NywxNzUsCisJMjQsMCwxNzYsMTc1LDMzLDEzNiwxNjAsMCwzMywxNDQsMTkyLDAsCisJMzMsMTYwLDIyNCwwLDcyLDAsMTgxLDE0MywzMywxMjgsMTI4LDAsCisJMTUzLDg2LDE5MiwxMiwzMywzMiw2NCwyLDMzLDE1Miw2NCwwLAorCTI1NSwyNTUsNCw1MCwxOTIsMCwzNyw1MCwzMyw0OCwxMjgsMiwKKwkyNDIsODYsMTkyLDEyLDMzLDU2LDE2MCwyLDI1NSwyNTUsMTEyLDUwLAorCTMzLDMyLDAsMiwzMyw0MCwxMjgsMiw0NCw4NywxOTIsMTIsCisJMzMsNDgsMTYwLDIsMTYsMCwxNjIsMzksMzMsMzIsODAsMCwKKwk5LDAsMCwxOCwyNTUsMjU1LDk5LDM4LDI1NSwyNTUsNSw1MiwKKwkyNTUsMjU1LDEzMiwzNiwwLDAsMTQ2LDE2MCwyLDE0NiwxOCwwLAorCTMzLDE2LDk2LDAsMjU1LDI1NSw2Niw0OCwyNTAsMjU1LDY0LDIwLAorCTMzLDI0LDEwMSwwLDMzLDMyLDE2MCwyLDE2LDAsMTY1LDM5LAorCTksMjQ4LDEyOCwyLDI1NSwyNTUsMTAyLDUwLDQ4LDAsMTkxLDE0MywKKwk0NCwwLDE4MSwxNDMsNDAsMCwxODAsMTQzLDM2LDAsMTc5LDE0MywKKwkzMiwwLDE3OCwxNDMsMjgsMCwxNzcsMTQzLDI0LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNTYsMCwxODksMzksMjE2LDI1NSwxODksMzksCisJMzIsMCwxOTEsMTc1LDI4LDAsMTc5LDE3NSwyNCwwLDE3OCwxNzUsCisJMjAsMCwxNzcsMTc1LDE2LDAsMTc2LDE3NSwzMywxNTIsMTkyLDAsCisJNTYsMCwxNzgsMTQzLDYwLDAsMTc3LDE0MywzMywxMjgsMjI0LDAsCisJMjU1LDI1NSwxMzIsNDgsMTkyLDAsMTY1LDQ4LDMzLDQ4LDY0LDIsCisJMjQyLDg2LDE5MiwxMiwzMyw1NiwzMiwyLDI1NSwyNTUsMTYsNTAsCisJMzMsMzIsMCwyLDMzLDQwLDY0LDIsNDQsODcsMTkyLDEyLAorCTMzLDQ4LDMyLDIsNCwwLDAsMTgsMzMsMzIsMzIsMiwKKwkzMyw0MCw5NiwyLDksMjQ4LDY0LDIsMzMsNDgsMCwyLAorCTMyLDAsMTkxLDE0MywyOCwwLDE3OSwxNDMsMjQsMCwxNzgsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTQwLDAsMTg5LDM5LDIyNCwyNTUsMTg5LDM5LDI0LDAsMTkxLDE3NSwKKwkzMyw3MiwxNjAsMCwxMjgsMCwxMzAsNDQsMTgsMCw2NCwyMCwKKwkzMyw2NCwxOTIsMCwwLDY0LDEzMCw0NCwxMywwLDY0LDIwLAorCTMxLDAsMiw2MCwyNTUsMjU1LDY2LDUyLDQzLDE2LDY4LDAsCisJNywwLDY0LDE2LDI1NSwxNSwyLDYwLDI1NSwyNTUsNjYsNTIsCisJNDMsMTYsNjgsMCw4LDAsNjQsMjAsNSwwLDYsMzYsCisJMjUwLDg3LDE5Miw4LDQsMCw2LDM2LDI1MCw4NywxOTIsOCwKKwkzLDAsNiwzNiwyNTAsODcsMTkyLDgsMiwwLDYsMzYsCisJMSwwLDYsMzYsMjU1LDI1NSwxOTQsNDgsMTYsMCwxNjMsMzksCisJMzMsNDAsOTgsMCw5LDAsMTYzLDE2LDMzLDU2LDAsMCwKKwkxNiwwLDE2MywzOSwyNTUsMjU1LDE2NSwzNiwxMjcsMCwxMzAsNDgsCisJMzcsMTYsMjI2LDAsMCwwLDE2MiwxNjAsMTk0LDMzLDQsMCwKKwkyNTAsMjU1LDE2MywyMCwxMjgsMCw3LDM2LDMzLDMyLDAsMSwKKwkxNiwwLDE2NSwzOSw5LDI0OCwzMiwxLDI1NSwyNTUsMTk4LDQ4LAorCTI0LDAsMTkxLDE0MywzMiwwLDE4OSwzOSw4LDAsMjI0LDMsCisJMCwwLDAsMCwyMDgsMjU1LDE4OSwzOSw0NCwwLDE5MSwxNzUsCisJNDAsMCwxODIsMTc1LDM2LDAsMTgxLDE3NSwzMiwwLDE4MCwxNzUsCisJMjgsMCwxNzksMTc1LDI0LDAsMTc4LDE3NSwyMCwwLDE3NywxNzUsCisJMTYsMCwxNzYsMTc1LDMzLDE0NCwxNjAsMCwzMywxNjgsMTkyLDAsCisJMzMsMTYwLDIyNCwwLDY0LDAsMTgyLDE0MywzMywxMzYsMTI4LDAsCisJNCwwLDE3OSwxNDIsMCwwLDAsMCwxNzEsODYsMTkyLDEyLAorCTMzLDMyLDE2MCwyLDMzLDEyOCw2NCwwLDI1NSwyNTUsMzYsNTAsCisJMTkyLDAsNjksNTAsMzMsNDgsMTI4LDIsMjQyLDg2LDE5MiwxMiwKKwkzMyw1NiwxOTIsMiwyNTUsMjU1LDE2LDUwLDMzLDMyLDAsMiwKKwkzMyw0MCwxMjgsMiw0NCw4NywxOTIsMTIsMzMsNDgsMTkyLDIsCisJMjMsMCwwLDE4LDMzLDQwLDEyOCwyLDAsMCw5OCwxNDIsCisJNCwwLDExNSwzOCwxMjgsMzIsMiwwLDMzLDMyLDEzMCwwLAorCTE5MiwzMiw0LDAsMCwwLDk4LDE0Miw0LDAsMTE1LDM4LAorCTMzLDMyLDEzMCwwLDIyNiw4NywxOTIsMTIsMzMsNDgsMTkyLDIsCisJNjMsODgsMTkyLDgsMiwwLDE2LDM2LDAsMCwxMDAsMTQyLAorCTQsMCwxMTUsMzgsMjI2LDg3LDE5MiwxMiwzMyw0OCwxOTIsMiwKKwkxLDAsMTYsMzgsMCwwLDE2MiwxNDIsMCwwLDAsMCwKKwk0MiwxNiwyLDIsMjQ3LDI1NSw2NCwyMCwzMyw0MCwxMjgsMiwKKwk0NCwwLDE5MSwxNDMsNDAsMCwxODIsMTQzLDM2LDAsMTgxLDE0MywKKwkzMiwwLDE4MCwxNDMsMjgsMCwxNzksMTQzLDI0LDAsMTc4LDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk0OCwwLDE4OSwzOSwyMjQsMjU1LDE4OSwzOSwyOCwwLDE5MSwxNzUsCisJMjQsMCwxNzgsMTc1LDIwLDAsMTc3LDE3NSwxNiwwLDE3NiwxNzUsCisJMzMsMTM2LDEyOCwwLDMzLDE0NCwxOTIsMCwyNTUsMjU1LDY3LDUwLAorCTEyLDAsMzQsMTUwLDAsMCwwLDAsNDMsMTYsNjcsMCwKKwk0LDAsNjQsMTYsMSwwLDIsMzYsMTIsMCw1MCwxNTAsCisJMCwwLDAsMCwyNTUsMjU1LDY3LDUwLDExLDAsOTgsMTYsCisJMiwwLDk4LDQwLDUsMCw2NCwxNiwyLDAsMiwzNiwKKwk1MCwwLDk2LDE2LDI1NSwyNTUsODAsNTAsMTM3LDg4LDE5Miw4LAorCTAsMCwwLDAsMTUsMCw5OCwxNiwyNTUsMjU1LDgwLDUwLAorCTEzNyw4OCwxOTIsOCwwLDAsMCwwLDgsMCwzNSwxNDIsCisJMCwwLDAsMCwxLDAsOTgsMzYsOCwwLDM0LDE3NCwKKwkwLDAsMTYyLDE0NCwwLDAsMCwwLDAsMCw5OCwxNjAsCisJMTIsMCwzNCwxNTAsMCwwLDAsMCwyNTUsMjU1LDY2LDM2LAorCTE0OSw4OCwxOTIsOCwxMiwwLDM0LDE2Niw4LDAsMzUsMTQyLAorCTAsMCwwLDAsMSwwLDk4LDM2LDgsMCwzNCwxNzQsCisJMCwwLDE2MiwxNDQsMCwwLDAsMCwwLDAsOTgsMTYwLAorCTgsMCwzNSwxNDIsMCwwLDAsMCwxLDAsOTgsMzYsCisJOCwwLDM0LDE3NCwxLDAsMTYyLDE0NCwwLDAsMCwwLAorCTAsMCw5OCwxNjAsMTIsMCwzNCwxNTAsMCwwLDAsMCwKKwkyNTQsMjU1LDY2LDM2LDE0OSw4OCwxOTIsOCwxMiwwLDM0LDE2NiwKKwk4LDAsMzYsMTQyLDAsMCwwLDAsODAsNjgsMTkyLDEyLAorCTMzLDQ4LDAsMiwxMiwwLDM0LDE1MCwwLDAsMCwwLAorCTM1LDE2LDgyLDAsMTIsMCwzNCwxNjYsOCwwLDM0LDE0MiwKKwkwLDAsMCwwLDMzLDEyOCwyLDIsOCwwLDQ4LDE3NCwKKwkyNTUsMjU1LDY2LDUwLDI4LDAsMTkxLDE0MywyNCwwLDE3OCwxNDMsCisJMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJMzIsMCwxODksMzksMjI0LDI1NSwxODksMzksMjQsMCwxOTEsMTc1LAorCTIwLDAsMTc3LDE3NSwxNiwwLDE3NiwxNzUsMzMsMTI4LDE2MCwwLAorCTEwLDAsMTI4LDIwLDMzLDEzNiwxOTIsMCw5LDUwLDE5MiwxMiwKKwkxNiwwLDQsMzYsMzMsMzIsNjQsMCwzLDAsMTI4LDIwLAorCTEsMCwyLDM2LDE3OCw4OCwxOTIsOCwzMywxNiwwLDAsCisJMTczLDg4LDE5Miw4LDAsMCwxMzAsMTYwLDAsMCwxMjgsMTYwLAorCTQsMCwxNDQsMTcyLDgsMCwxNDQsMTcyLDMzLDE2LDE3LDIsCisJMTIsMCwxMzAsMTcyLDMzLDE2LDEyOCwwLDI0LDAsMTkxLDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwkzMiwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwxNiwwLDE5MSwxNzUsCisJMCwwLDEzMCwxNDQsMCwwLDAsMCwxLDAsNjYsNDgsCisJMywwLDY0LDE2LDAsMCwwLDAsNjEsNTAsMTkyLDEyLAorCTAsMCwwLDAsMTYsMCwxOTEsMTQzLDI0LDAsMTg5LDM5LAorCTgsMCwyMjQsMywwLDAsMCwwLDAsMCwxMzAsMTQ0LAorCTAsMCwwLDAsMTI4LDAsNjYsNDgsMTYsMCw2NCwyMCwKKwkyNTUsMjU1LDIsMzYsOCwwLDEzMCwxNDAsMTIsMCwxMzEsMTQwLAorCTAsMCwwLDAsNDMsMTYsNjcsMCw3LDAsNjQsMjAsCisJMCwwLDAsMCwwLDAsMTMwLDE0NCwwLDAsMCwwLAorCTEyOCwwLDY2LDUyLDAsMCwxMzAsMTYwLDIxNiw4OCwxOTIsOCwKKwkyNTUsMjU1LDIsMzYsOCwwLDEzMCwxNDAsMCwwLDAsMCwKKwkwLDAsNjYsMTQ0LDgsMCwyMjQsMywwLDAsMCwwLAorCTMwLDAsMTkyLDI0LDMzLDU2LDE5MiwwLDAsMCwxMzAsMTQ0LAorCTAsMCwwLDAsMTI4LDAsNjYsNDgsMTYsMCw2NCwyMCwKKwkyNTUsMCwzLDM2LDgsMCwxMzEsMTQwLDEyLDAsMTMwLDE0MCwKKwkwLDAsMCwwLDQzLDE2LDk4LDAsNSwwLDY0LDE2LAorCTEsMCw5OCwzNiw4LDAsMTMwLDE3MiwwLDAsOTksMTQ0LAorCTI0MCw4OCwxOTIsOCwwLDAsMCwwLDAsMCwxMzAsMTQ0LAorCTAsMCwwLDAsMTI4LDAsNjYsNTIsMCwwLDEzMCwxNjAsCisJMjU1LDAsMywzNiwwLDAsMTMwLDE0NCwwLDAsMCwwLAorCTEyOCwwLDY2LDQ4LDUsMCw2NCwyMCwwLDAsMCwwLAorCTAsMCwxNjMsMTYwLDI1NSwyNTUsMTk4LDM2LDIyOCwyNTUsMTkyLDI4LAorCTEsMCwxNjUsMzYsOCwwLDIyNCwzLDM1LDE2LDIzMCwwLAorCTEsMCwyLDM2LDE1LDAsMTk0LDE2LDIsMCwxOTQsNDAsCisJNSwwLDY0LDE2LDIsMCwyLDM2LDcsMCwxOTIsMTYsCisJMjU1LDI1NSwyLDM2LDQwLDg5LDE5Miw4LDAsMCwwLDAsCisJMTEsMCwxOTQsMTYsMjU1LDI1NSwyLDM2LDQwLDg5LDE5Miw4LAorCTAsMCwwLDAsNCwwLDEzMCwxNDAsMCwwLDAsMCwKKwkyMSw4OSwxOTIsOCwzMyw0MCwxNjIsMCw4LDAsMTMwLDE0MCwKKwkwLDAsMCwwLDE5LDg5LDE5Miw4LDMzLDQwLDE2MiwwLAorCTEyLDAsMTMwLDE0MCwwLDAsMCwwLDM1LDQwLDY5LDAsCisJNCwwLDEzMCwxNDAsMCwwLDAsMCw0MywxNiwxNjIsMCwKKwkxNywwLDY0LDIwLDI1NSwyNTUsMiwzNiwxMiwwLDEzMCwxNDAsCisJMCwwLDAsMCw0MywxNiw2OSwwLDEyLDAsNjQsMjAsCisJMjU1LDI1NSwyLDM2LDEyLDAsMTMwLDE0MCwwLDAsMCwwLAorCTQzLDE2LDE2MiwwLDUsMCw2NCwxNiwwLDAsMCwwLAorCTAsMCwxMzAsMTQ0LDAsMCwwLDAsMTI3LDAsNjYsNDgsCisJMCwwLDEzMCwxNjAsOCwwLDEzMywxNzIsMzMsMTYsMCwwLAorCTgsMCwyMjQsMywwLDAsMCwwLDEyLDAsMTMwLDE0MCwKKwk0LDAsMTMxLDE0MCwwLDAsMCwwLDM1LDU2LDY3LDAsCisJMSwwLDIsMzYsMTUsMCwxOTQsMTYsMiwwLDE5NCw0MCwKKwk1LDAsNjQsMTYsMiwwLDIsMzYsNywwLDE5MiwxNiwKKwkyNTUsMjU1LDIsMzYsODcsODksMTkyLDgsMCwwLDAsMCwKKwkxMiwwLDE5NCwxNiwyNTUsMjU1LDIsMzYsODcsODksMTkyLDgsCisJMCwwLDAsMCw0LDAsMTMwLDE0MCwwLDAsMCwwLAorCTY2LDg5LDE5Miw4LDMzLDE2LDE2MiwwLDgsMCwxMzAsMTQwLAorCTAsMCwwLDAsMzMsMTYsMTYyLDAsNzIsODksMTkyLDgsCisJMTIsMCwxMzAsMTcyLDEyLDAsMTMwLDE0MCwwLDAsMCwwLAorCTM1LDE2LDY5LDAsMTIsMCwxMzAsMTcyLDgsMCwxMzAsMTQwLAorCTEyLDAsMTMxLDE0MCwwLDAsMCwwLDQzLDE2LDY3LDAsCisJNSwwLDY0LDE2LDAsMCwwLDAsMCwwLDEzMCwxNDQsCisJMCwwLDAsMCw4NSw4OSwxOTIsOCwxMjcsMCw2Niw0OCwKKwkwLDAsMTMwLDE0NCwwLDAsMCwwLDEyOCwwLDY2LDUyLAorCTAsMCwxMzAsMTYwLDMzLDE2LDIyNCwwLDgsMCwyMjQsMywKKwkwLDAsMCwwLDIzMiwyNTUsMTg5LDM5LDIwLDAsMTkxLDE3NSwKKwkxNiwwLDE3NiwxNzUsMTIsMCwxMjgsMjAsMzMsMTI4LDE2MCwwLAorCTksNTAsMTkyLDEyLDE2LDAsNCwzNiwzMywzMiw2NCwwLAorCTMsMCwxMjgsMjAsMCwwLDAsMCwxMTksODksMTkyLDgsCisJMzMsMTYsMCwwLDAsMCwyLDE0NiwwLDAsMCwwLAorCTEwOCw4OSwxOTIsOCwxLDAsNjYsNTIsMCwwLDIsMTQ2LAorCTAsMCwwLDAsMjU0LDAsNjYsNDgsMCwwLDEzMCwxNjAsCisJNCwwLDIsMTQyLDAsMCwwLDAsNCwwLDEzMCwxNzIsCisJOCwwLDIsMTQyLDAsMCwwLDAsOCwwLDEzMCwxNzIsCisJMTIsMCwyLDE0MiwwLDAsMCwwLDEyLDAsMTMwLDE3MiwKKwkzMywxNiwxMjgsMCwyMCwwLDE5MSwxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywyNCwwLDE4OSwzOSwwLDAsMCwwLAorCTAsMCwxMzAsMTQ0LDAsMCwwLDAsMTI4LDAsNjYsNDgsCisJMTcsMCw2NCwyMCwzMSwwLDMsMzYsOCwwLDEzMSwxNDAsCisJMTIsMCwxMzAsMTQwLDAsMCwwLDAsNDMsMTYsOTgsMCwKKwk2LDAsNjQsMTYsMSwwLDk4LDM2LDgsMCwxMzAsMTcyLAorCTAsMCw5OCwxNDQsMCwwLDAsMCwxNDUsODksMTkyLDgsCisJMzEsMCw2Nyw0OCwwLDAsMTMwLDE0NCwwLDAsMCwwLAorCTEyOCwwLDY2LDUyLDAsMCwxMzAsMTYwLDMxLDAsMywzNiwKKwkwLDAsMTMwLDE0NCwwLDAsMCwwLDEyOCwwLDY2LDQ4LAorCTQsMCw2NCwxNiwxLDAsMiwzNiwwLDAsMTYyLDE3MiwKKwkxOTYsODksMTkyLDgsMzMsMTYsMCwwLDI1NSwwLDk5LDQ4LAorCTMxLDAsMiwzNiw2LDAsOTgsMTYsMzMsMTYsOTYsMCwKKwkxOTYsODksMTkyLDgsMCwwLDAsMCwxLDAsMiwzNiwKKwkxOTUsODksMTkyLDgsMCwwLDE2MiwxNzIsMzMsNDgsMCwwLAorCTAsMCwxMzAsMTQ0LDAsMCwwLDAsMTI4LDAsNjYsNDgsCisJMTYsMCw2NCwyMCwyNTUsMCwzLDM2LDgsMCwxMzEsMTQwLAorCTEyLDAsMTMwLDE0MCwwLDAsMCwwLDQzLDE2LDk4LDAsCisJNSwwLDY0LDE2LDEsMCw5OCwzNiw4LDAsMTMwLDE3MiwKKwkwLDAsOTksMTQ0LDE4Myw4OSwxOTIsOCwwLDAsMCwwLAorCTAsMCwxMzAsMTQ0LDAsMCwwLDAsMTI4LDAsNjYsNTIsCisJMCwwLDEzMCwxNjAsMjU1LDAsMywzNiwwLDAsMTMwLDE0NCwKKwkwLDAsMCwwLDEyOCwwLDY2LDQ4LDIyOCwyNTUsNjQsMjAsCisJMTI4LDAsOTgsNDgsNCwwLDY0LDE2LDEyNywwLDk4LDQ4LAorCTM3LDE2LDE5NCwwLDE2Myw4OSwxOTIsOCwxOTIsNDksMiwwLAorCTI1NSwwLDk4LDQ4LDM3LDQ4LDcwLDAsMjU1LDI1NSwxOTQsNDgsCisJOCwwLDIyNCwzLDAsMCwwLDAsMCwwLDEzMCwxNDQsCisJMCwwLDAsMCwxMjgsMCw2Niw0OCwxNiwwLDY0LDIwLAorCTI1NSwwLDYsMzYsOCwwLDEzMSwxNDAsMTIsMCwxMzAsMTQwLAorCTAsMCwwLDAsNDMsMTYsOTgsMCw1LDAsNjQsMTYsCisJMSwwLDk4LDM2LDgsMCwxMzAsMTcyLDAsMCwxMDIsMTQ0LAorCTIxOCw4OSwxOTIsOCwwLDAsMCwwLDAsMCwxMzAsMTQ0LAorCTAsMCwwLDAsMTI4LDAsNjYsNTIsMCwwLDEzMCwxNjAsCisJMjU1LDAsNiwzNiwwLDAsMTMwLDE0NCwwLDAsMCwwLAorCTEyOCwwLDY2LDQ4LDEzLDAsNjQsMjAsMSwwLDIsMzYsCisJMjU1LDAsMTk1LDQ4LDEyOCwwLDIsMzYsNCwwLDk4LDIwLAorCTIsMCwyLDM2LDAsMCwxNjIsMTcyLDE3LDkwLDE5Miw4LAorCTI1NSwyNTUsMiw1MiwxMjgsMCwxOTQsNDgsNiwwLDY0LDIwLAorCTMzLDI0LDAsMCwxNyw5MCwxOTIsOCwyNTUsMCwxOTQsNDgsCisJMCwwLDE2MiwxNzIsMTcsOTAsMTkyLDgsMzMsMTYsMCwwLAorCTEyNywwLDE5NCw0OCwzMiwwLDY0LDE2LDI1NSwyNTUsNzEsMzYsCisJMCwyNiwzLDAsMCwwLDEzMCwxNDQsMCwwLDAsMCwKKwkxMjgsMCw2Niw0OCwxNiwwLDY0LDIwLDI1NSwyNTUsMTAyLDQ4LAorCTgsMCwxMzEsMTQwLDEyLDAsMTMwLDE0MCwwLDAsMCwwLAorCTQzLDE2LDk4LDAsNiwwLDY0LDE2LDEsMCw5OCwzNiwKKwk4LDAsMTMwLDE3MiwwLDAsOTgsMTQ0LDAsMCwwLDAsCisJNyw5MCwxOTIsOCwzNywyNCwxOTQsMCwwLDAsMTMwLDE0NCwKKwkwLDAsMCwwLDEyOCwwLDY2LDUyLDAsMCwxMzAsMTYwLAorCTI1NSwwLDE5NSw1MiwwLDAsMTMwLDE0NCwwLDAsMCwwLAorCTEyOCwwLDY2LDQ4LDIyNCwyNTUsNjQsMjAsMSwwLDIsMzYsCisJMzMsMTYsMjI0LDAsMjU1LDAsNjYsNDgsMjI2LDI1NSw2NCwyMCwKKwkyNTUsMjU1LDIzMSwzNiwyNTUsMjU1LDk4LDQ4LDgsMCwyMjQsMywKKwkwLDAsMCwwLDIxNiwyNTUsMTg5LDM5LDM2LDAsMTkxLDE3NSwKKwkzMiwwLDE4MCwxNzUsMjgsMCwxNzksMTc1LDI0LDAsMTc4LDE3NSwKKwkyMCwwLDE3NywxNzUsMTYsMCwxNzYsMTc1LDMzLDE1MiwxMjgsMCwKKwkzMywxMjgsMTkyLDAsMzMsMTQ0LDE2MCwwLDI1NSwyNTUsODEsNTAsCisJMzMsMCwzMiwxOCwzMywxNjAsMjI0LDAsMjU1LDI1NSwyLDUyLAorCTMwLDAsMzQsMTgsMCwwLDAsMCw5LDUwLDE5MiwxMiwKKwkzMywzMiwzMiwyLDMzLDI0LDY0LDAsMjksMCw5NiwxNiwKKwkxLDAsMiwzNiwwLDAsMiwxNjYsNCwwLDMsMTc0LAorCTgsMCwzLDE3NCwxMiwwLDE4LDE2NiwzMywzMiw5NiwyLAorCTgsMCw1LDE0MiwwLDAsMCwwLDIxOCw4OCwxOTIsMTIsCisJMzMsNDgsMzIsMiwzMywyNCw2NCwwLDI1NSwyNTUsMTAwLDQ4LAorCTEwLDAsMTQ1LDIwLDEsMCwyLDM2LDEyLDAsMiwxNTAsCisJMCwwLDAsMCwzNSwxNiw2NywwLDEyLDAsMiwxNjYsCisJOCwwLDIsMTQyLDAsMCwwLDAsMzMsMTYsMTMwLDAsCisJNjgsOTAsMTkyLDgsOCwwLDIsMTc0LDY4LDkwLDE5Miw4LAorCTAsMCwxMzAsMTc0LDAsMCwwLDE2Niw0LDAsMCwxNzQsCisJOCwwLDAsMTc0LDEyLDAsMCwxNjYsMzYsMCwxOTEsMTQzLAorCTMyLDAsMTgwLDE0MywyOCwwLDE3OSwxNDMsMjQsMCwxNzgsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTQwLDAsMTg5LDM5LDIyNCwyNTUsMTg5LDM5LDI4LDAsMTkxLDE3NSwKKwkyNCwwLDE3OCwxNzUsMjAsMCwxNzcsMTc1LDE2LDAsMTc2LDE3NSwKKwkzMywxNDQsMTI4LDAsMzMsMTM2LDE2MCwwLDMzLDEyOCwxOTIsMCwKKwkxMjQsODksMTkyLDEyLDMzLDQwLDAsMiwzMywzMiw2NCwyLAorCTE5OCw4OSwxOTIsMTIsMzMsNDAsMCwyLDMzLDQwLDY0LDAsCisJMCwwLDIsMTQyLDAsMCwwLDAsNywwLDY0LDIwLAorCTMzLDMyLDY0LDIsMjU1LDI1NSwxNjUsNDgsMzMsNDgsMzIsMiwKKwkxOSw5MCwxOTIsMTIsMzMsNTYsMCwyLDEwNCw5MCwxOTIsOCwKKwkwLDAsMCwwLDAsMCwzMiwxNjYsNCwwLDMyLDE3NCwKKwk4LDAsMzIsMTc0LDEyLDAsMzIsMTY2LDI4LDAsMTkxLDE0MywKKwkyNCwwLDE3OCwxNDMsMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsMzIsMCwxODksMzksMjE2LDI1NSwxODksMzksCisJMzYsMCwxOTEsMTc1LDMyLDAsMTgwLDE3NSwyOCwwLDE3OSwxNzUsCisJMjQsMCwxNzgsMTc1LDIwLDAsMTc3LDE3NSwxNiwwLDE3NiwxNzUsCisJMzMsMTUyLDEyOCwwLDMzLDEzNiwxNjAsMCwzMywxNDQsMTkyLDAsCisJNTYsMCwxNzYsMTQ3LDAsMCwwLDAsMTk2LDg4LDE5MiwxMiwKKwkzMywxNjAsMjI0LDAsMjI0LDAsNjYsNDgsNywwLDgwLDIwLAorCTMzLDMyLDk2LDIsMTI0LDg5LDE5MiwxMiwzMyw0MCw2NCwyLAorCTI1NSwyNTUsNjYsNDgsMjU1LDI1NSwxMzEsNTAsNywwLDY3LDE2LAorCTMzLDMyLDk2LDIsMCwwLDY2LDE0MiwwLDAsMCwwLAorCTE2LDAsNjQsMjAsNCwwLDIsMzYsMTUyLDkwLDE5Miw4LAorCTAsMCw2NiwxNzQsMTk4LDg5LDE5MiwxMiwzMyw0MCw2NCwyLAorCTMzLDQwLDY0LDAsMCwwLDY2LDE0MiwwLDAsMCwwLAorCTcsMCw2NCwyMCwzMywzMiw5NiwyLDI1NSwyNTUsMTY1LDQ4LAorCTMzLDQ4LDMyLDIsMTksOTAsMTkyLDEyLDMzLDU2LDY0LDIsCisJMTU2LDkwLDE5Miw4LDAsMCwwLDAsMCwwLDMyLDE2NiwKKwk0LDAsMzIsMTc0LDgsMCwzMiwxNzQsMTIsMCwzMiwxNjYsCisJMzYsMCwxOTEsMTQzLDMyLDAsMTgwLDE0MywyOCwwLDE3OSwxNDMsCisJMjQsMCwxNzgsMTQzLDIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsCisJOCwwLDIyNCwzLDQwLDAsMTg5LDM5LDMzLDU2LDAsMCwKKwkyNTUsMjU1LDE2OCwzNiwyNTUsMjU1LDE2NSw0OCw1MCwwLDE2MCwxNiwKKwkxLDAsOSwzNiwxLDAsMTIsMzYsNCwwLDEwLDM2LAorCTMsMCwxMSwzNiwyNTUsMjU1LDUsNTIsMCwwLDEzMCwxNDQsCisJMCwwLDAsMCwxMjgsMCw2Niw0OCwxNiwwLDY0LDIwLAorCTI1NSwwLDMsMzYsOCwwLDEzMSwxNDAsMTIsMCwxMzAsMTQwLAorCTAsMCwwLDAsNDMsMTYsOTgsMCw1LDAsNjQsMTYsCisJMSwwLDk4LDM2LDgsMCwxMzAsMTcyLDAsMCw5OSwxNDQsCisJMTkzLDkwLDE5Miw4LDAsMCwwLDAsMCwwLDEzMCwxNDQsCisJMCwwLDAsMCwxMjgsMCw2Niw1MiwwLDAsMTMwLDE2MCwKKwkyNTUsMCwzLDM2LDAsMCwxMzAsMTQ0LDAsMCwwLDAsCisJMTI4LDAsNjYsNDgsMywwLDY0LDE2LDAsMCwwLDAsCisJMjE4LDkwLDE5Miw4LDAsMCwyMDQsMTcyLDExLDAsMzIsMTcsCisJMjU1LDI1NSwyLDQ5LDUsMCw3NCwyMCwzMyw3MiwwLDAsCisJMywwLDk2LDE2LDAsMCwwLDAsMjE4LDkwLDE5Miw4LAorCTAsMCwyMDMsMTcyLDEyOCwwLDk4LDQ4LDMsMCw2NCwxNiwKKwkwLDE4LDcsMCwyNTUsMjU1LDcsMzYsMCwxOCw3LDAsCisJMzcsNTYsNjcsMCwzMywxNiwwLDEsMjU1LDI1NSw2Niw0OCwKKwkyMTIsMjU1LDY0LDIwLDMzLDY0LDUsMSw4LDAsMjI0LDMsCisJMzMsMTYsMjI0LDAsMjI0LDI1NSwxODksMzksMjQsMCwxOTEsMTc1LAorCTIwLDAsMTc3LDE3NSwxNiwwLDE3NiwxNzUsMzMsMTI4LDEyOCwwLAorCTEyNCw4OSwxOTIsMTIsMzMsMTM2LDE2MCwwLDMzLDMyLDAsMiwKKwkxOTgsODksMTkyLDEyLDMzLDQwLDMyLDIsMzMsMzIsMCwyLAorCTI1NSwyNTUsNjksNDgsMTY0LDkwLDE5MiwxMiwzMyw0OCwzMiwyLAorCTI0LDAsMTkxLDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMywzMiwwLDE4OSwzOSwyMTYsMjU1LDE4OSwzOSwKKwkzMiwwLDE5MSwxNzUsMjgsMCwxNzksMTc1LDI0LDAsMTc4LDE3NSwKKwkyMCwwLDE3NywxNzUsMTYsMCwxNzYsMTc1LDMzLDE0NCwxMjgsMCwKKwkzMywxMzYsMTYwLDAsMzMsMTUyLDE5MiwwLDE5Niw4OCwxOTIsMTIsCisJMzMsMTI4LDIyNCwwLDIyNCwwLDY2LDQ4LDI1NSwwLDE2LDUwLAorCTcsMCw4MCwyMCwzMywzMiw2NCwyLDEyNCw4OSwxOTIsMTIsCisJMzMsNDAsMzIsMiwyNTUsMjU1LDY2LDQ4LDI1NSwyNTUsOTksNTAsCisJOCwwLDY3LDE2LDMzLDMyLDY0LDIsMCwwLDM0LDE0MiwKKwkwLDAsMCwwLDIsMCw2NCwyMCw0LDAsMiwzNiwKKwkwLDAsMzQsMTc0LDE3LDkxLDE5Miw4LDMzLDE2LDAsMCwKKwkxOTgsODksMTkyLDEyLDMzLDQwLDMyLDIsMzMsMzIsNjQsMiwKKwkyNTUsMjU1LDY5LDQ4LDE2NCw5MCwxOTIsMTIsMzMsNDgsMzIsMiwKKwkzMiwwLDE5MSwxNDMsMjgsMCwxNzksMTQzLDI0LDAsMTc4LDE0MywKKwkyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk0MCwwLDE4OSwzOSwyMDgsMjU1LDE4OSwzOSw0NCwwLDE5MSwxNzUsCisJNDAsMCwxODAsMTc1LDM2LDAsMTc5LDE3NSwzMiwwLDE3OCwxNzUsCisJMjgsMCwxNzcsMTc1LDI0LDAsMTc2LDE3NSwzMywxMjgsMTI4LDAsCisJMzMsMTUyLDE5MiwwLDMzLDE2MCwyMjQsMCwwLDAsOTYsMTc0LAorCTQsMCw5NiwxNzQsOCwwLDMsMTQyLDQsMCwyLDE0MiwKKwkwLDAsMCwwLDM1LDI0LDk4LDAsMjU1LDI1NSwxNjUsNDgsCisJMzUsMCwxNjAsMjQsMzMsMTQ0LDAsMCwxLDAsNiwzNiwKKwkwLDAsMiwxNDYsMCwwLDAsMCwxMjgsMCw2Niw0OCwKKwkxNiwwLDY0LDIwLDI1NSwwLDQsMzYsOCwwLDQsMTQyLAorCTEyLDAsMiwxNDIsMCwwLDAsMCw0MywxNiwxMzAsMCwKKwk1LDAsNjQsMTYsMSwwLDEzMCwzNiw4LDAsMiwxNzQsCisJMCwwLDEzMiwxNDQsNjQsOTEsMTkyLDgsMCwwLDAsMCwKKwkwLDAsMiwxNDYsMCwwLDAsMCwxMjgsMCw2Niw1MiwKKwkwLDAsMiwxNjIsMjU1LDAsNCwzNiwwLDAsMiwxNDYsCisJMCwwLDAsMCwxMjgsMCw2Niw0OCwzLDAsNjQsMTYsCisJMTI4LDAsMTMwLDQ4LDE1MCw5MSwxOTIsOCwwLDAsMTM0LDE3NCwKKwkyLDAsNjQsMjAsMCwwLDAsMCwxLDAsODIsMzgsCisJMjU1LDI1NSwxNjUsMzYsMjI0LDI1NSwxNjAsMjgsMCwwLDAsMCwKKwkzMywzMiwwLDIsMzMsNDAsOTYsMCwyNTEsODgsMTkyLDEyLAorCTMzLDQ4LDAsMCw2OCwwLDY0LDE4LDEsMCw4MSwzOCwKKwk5LDUwLDE5MiwxMiwxMjgsMzIsMTcsMCwzMyw0MCw2NCwwLAorCTYzLDAsMTYwLDE2LDAsMCwwLDAsMCwwLDExMywxNzQsCisJNCwwLDEwMSwxNzQsNTksMCw2NCwyNiwzMyw1NiwwLDAsCisJMSwwLDgsMzYsMzMsNDgsMCwwLDAsMCwyLDE0NiwKKwkwLDAsMCwwLDEyOCwwLDY2LDQ4LDE2LDAsNjQsMjAsCisJMjU1LDAsNCwzNiw4LDAsMywxNDIsMTIsMCwyLDE0MiwKKwkwLDAsMCwwLDQzLDE2LDk4LDAsNSwwLDY0LDE2LAorCTEsMCw5OCwzNiw4LDAsMiwxNzQsMCwwLDEwMCwxNDQsCisJMTE0LDkxLDE5Miw4LDAsMCwwLDAsMCwwLDIsMTQ2LAorCTAsMCwwLDAsMTI4LDAsNjYsNTIsMCwwLDIsMTYyLAorCTI1NSwwLDQsMzYsMCwwLDIsMTQ2LDAsMCwwLDAsCisJMTI4LDAsNjYsNDgsMywwLDY0LDE2LDE5Miw0OSw2LDAsCisJMTUwLDkxLDE5Miw4LDAsMCwxMzYsMTc0LDEyNywwLDEzMCw0OCwKKwkzNyw0OCwxOTQsMCwxMjgsMCwxMzAsNDgsMjI1LDI1NSw2NCwyMCwKKwkwLDAsMCwwLDE4LDAsMjI0LDIwLDQwLDAsMTk0LDQ0LAorCTQsMCw2NCwxNiw4MCwwLDE5NCw0NCwwLDAsMTYwLDE3MiwKKwkxNDUsOTEsMTkyLDgsNCwwLDE2NSwzNiw1LDAsNjQsMTYsCisJMjE2LDI1NSwxOTQsMzYsMCwwLDE2OCwxNzIsNCwwLDE2NSwzNiwKKwkxNDYsOTEsMTkyLDgsMCwwLDE2MiwxNzIsMiwwLDIsMzYsCisJMCwwLDE2MiwxNzIsNCwwLDE2NSwzNiwxNzYsMjU1LDE5NCwzNiwKKwkxNDYsOTEsMTkyLDgsMCwwLDE2MiwxNzIsMCwwLDE2NiwxNzIsCisJMSwwLDIzMSwzNiw0MiwxNiwyNDIsMCwyMDAsMjU1LDY0LDIwLAorCTQsMCwxNjUsMzYsNDQsMCwxOTEsMTQzLDQwLDAsMTgwLDE0MywKKwkzNiwwLDE3OSwxNDMsMzIsMCwxNzgsMTQzLDI4LDAsMTc3LDE0MywKKwkyNCwwLDE3NiwxNDMsOCwwLDIyNCwzLDQ4LDAsMTg5LDM5LAorCTIyNCwyNTUsMTg5LDM5LDI4LDAsMTkxLDE3NSwyNCwwLDE3OCwxNzUsCisJMjAsMCwxNzcsMTc1LDE2LDAsMTc2LDE3NSwzMywxMzYsMTI4LDAsCisJMzMsMTQ0LDE2MCwwLDMzLDEyOCwxOTIsMCwxMjQsODksMTkyLDEyLAorCTMzLDQwLDAsMiwzMywzMiwzMiwyLDE5OCw4OSwxOTIsMTIsCisJMzMsNDAsMCwyLDMzLDQwLDY0LDAsMCwwLDIsMTQyLAorCTAsMCwwLDAsNSwwLDY0LDIwLDMzLDMyLDMyLDIsCisJMjU1LDI1NSwxNjUsNDgsMzMsNDgsNjQsMiwyNCw5MSwxOTIsMTIsCisJMzMsNTYsMCwyLDI4LDAsMTkxLDE0MywyNCwwLDE3OCwxNDMsCisJMjAsMCwxNzcsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJMzIsMCwxODksMzksMjE2LDI1NSwxODksMzksMzYsMCwxOTEsMTc1LAorCTMyLDAsMTgwLDE3NSwyOCwwLDE3OSwxNzUsMjQsMCwxNzgsMTc1LAorCTIwLDAsMTc3LDE3NSwxNiwwLDE3NiwxNzUsMzMsMTQ0LDEyOCwwLAorCTMzLDE2MCwxNjAsMCwzMywxMzYsMTkyLDAsNTYsMCwxNzYsMTQ3LAorCTAsMCwwLDAsMTk2LDg4LDE5MiwxMiwzMywxNTIsMjI0LDAsCisJMjI0LDAsNjYsNDgsNywwLDgwLDIwLDMzLDMyLDY0LDIsCisJMTI0LDg5LDE5MiwxMiwzMyw0MCwzMiwyLDI1NSwyNTUsNjYsNDgsCisJMjU1LDI1NSw5OSw1MCw3LDAsNjcsMTYsMzMsMzIsNjQsMiwKKwkwLDAsMzQsMTQyLDAsMCwwLDAsMTQsMCw2NCwyMCwKKwk0LDAsMiwzNiwyMjYsOTEsMTkyLDgsMCwwLDM0LDE3NCwKKwkxOTgsODksMTkyLDEyLDMzLDQwLDMyLDIsMzMsNDAsNjQsMCwKKwkwLDAsMzQsMTQyLDAsMCwwLDAsNSwwLDY0LDIwLAorCTMzLDMyLDY0LDIsMjU1LDI1NSwxNjUsNDgsMzMsNDgsMTI4LDIsCisJMjQsOTEsMTkyLDEyLDMzLDU2LDMyLDIsMzYsMCwxOTEsMTQzLAorCTMyLDAsMTgwLDE0MywyOCwwLDE3OSwxNDMsMjQsMCwxNzgsMTQzLAorCTIwLDAsMTc3LDE0MywxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLAorCTQwLDAsMTg5LDM5LDAsMCwwLDAsMCwwLDAsMCwKKwkyMTYsMjU1LDE4OSwzOSwzMiwwLDE5MSwxNzUsMjgsMCwxNzksMTc1LAorCTI0LDAsMTc4LDE3NSwyMCwwLDE3NywxNzUsMTYsMCwxNzYsMTc1LAorCTMzLDE1MiwxMjgsMCw4LDAsOTksMTQyLDQsMCw5OCwxNDIsCisJMCwwLDAsMCwzNSwxMjgsOTgsMCwyNTUsMjU1LDQsNTAsCisJMTksMCwxMjgsMTYsMzMsMTM2LDE2MCwwLDksNTAsMTkyLDEyLAorCTAsMCwwLDAsMzMsMTQ0LDY0LDAsMywwLDY0LDIyLAorCTI1NSwyNTUsMTYsNTAsMTcsOTIsMTkyLDgsMjU1LDI1NSwyLDM2LAorCTMzLDMyLDY0LDIsNCwwLDEwMSwxNDIsMCwwLDAsMCwKKwk4MCw2OCwxOTIsMTIsMzMsNDgsMCwyLDEsMCwyLDM2LAorCTAsMCwzNCwxNjYsNCwwLDUwLDE3NCwzMywxMjgsODAsMiwKKwkxNSw5MiwxOTIsOCw4LDAsNDgsMTc0LDAsMCwzMiwxNjYsCisJNCwwLDMyLDE3NCw4LDAsMzIsMTc0LDEyLDAsMzIsMTY2LAorCTMzLDE2LDAsMCwzMiwwLDE5MSwxNDMsMjgsMCwxNzksMTQzLAorCTI0LDAsMTc4LDE0MywyMCwwLDE3NywxNDMsMTYsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw0MCwwLDE4OSwzOSwyMzIsMjU1LDE4OSwzOSwKKwkyMCwwLDE5MSwxNzUsMTYsMCwxNzYsMTc1LDMzLDEyOCwxMjgsMCwKKwkwLDAsMiwxNTAsMCwwLDAsMCwxLDAsNjYsNDgsCisJNywwLDY0LDE2LDAsMCwwLDAsNCwwLDQsMTQyLAorCTAsMCwwLDAsMywwLDEyOCwxNiwwLDAsMCwwLAorCTYxLDUwLDE5MiwxMiwwLDAsMCwwLDAsMCwwLDE2NiwKKwk4LDAsMCwxNzQsNCwwLDAsMTc0LDEyLDAsMCwxNjYsCisJMjAsMCwxOTEsMTQzLDE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJMjQsMCwxODksMzksMjI0LDI1NSwxODksMzksMjQsMCwxOTEsMTc1LAorCTIwLDAsMTc3LDE3NSwxNiwwLDE3NiwxNzUsMzMsMTI4LDEyOCwwLAorCTgsMCwxNjMsMTQwLDQsMCwxNjIsMTQwLDAsMCwwLDAsCisJMzUsMTM2LDk4LDAsMjU1LDI1NSwzNSw1MCwxMiwwLDIsMTUwLAorCTAsMCwwLDAsNDMsMTYsNjcsMCw0LDAsNjQsMTYsCisJMjU1LDI1NSwzOCw1MCwxMiwwLDE3LDE1MCwwLDAsMCwwLAorCTI1NSwyNTUsMzgsNTAsNiwwLDE5MiwxNiwyNTUsMjU1LDM0LDUwLAorCTgsMCw0LDE0Miw0LDAsMTY1LDE0MCw4MCw2OCwxOTIsMTIsCisJMCwwLDAsMCwyNTUsMjU1LDM0LDUwLDgsMCwzLDE0MiwKKwkwLDAsMCwwLDMzLDE2LDY3LDAsOCwwLDIsMTc0LAorCTEyLDAsMiwxNTAsMCwwLDAsMCwzNSwxNiw4MSwwLAorCTEyLDAsMiwxNjYsMjQsMCwxOTEsMTQzLDIwLDAsMTc3LDE0MywKKwkxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLDMyLDAsMTg5LDM5LAorCTEsMCwyLDM2LDIzLDAsMTk0LDE2LDIsMCwxOTQsNDAsCisJNSwwLDY0LDE2LDIsMCwyLDM2LDcsMCwxOTIsMTYsCisJMjU1LDI1NSwyLDM2LDEzMiw5MiwxOTIsOCwwLDAsMCwwLAorCTIzLDAsMTk0LDE2LDI1NSwyNTUsMiwzNiwxMzIsOTIsMTkyLDgsCisJMCwwLDAsMCwyNTUsMjU1LDE2Miw0OCw0LDAsMTMxLDE0MCwKKwkwLDAsMCwwLDMzLDQ4LDY3LDAsOCwwLDEzMCwxNDAsCisJMCwwLDAsMCwzNSwxNiw2NywwLDEyLDAsMTMxLDE0OCwKKwkwLDAsMCwwLDMzLDE2LDY3LDAsMTI0LDkyLDE5Miw4LAorCTM1LDQwLDY5LDAsMjU1LDI1NSwxNjIsNDgsOCwwLDEzMSwxNDAsCisJMCwwLDAsMCwzMyw0OCw2NywwLDEyLDAsMTMwLDE0OCwKKwkwLDAsMCwwLDEyNCw5MiwxOTIsOCwzNSw0MCw2OSwwLAorCTEyLDAsMTMwLDE0OCw4LDAsMTMxLDE0MCwwLDAsMCwwLAorCTMzLDQ4LDY3LDAsMjU1LDI1NSwxNjIsNDgsMzUsNDgsMTk0LDAsCisJNCwwLDEzMCwxNDAsMCwwLDAsMCw0MywxNiwxOTQsMCwKKwk0LDAsNjQsMjAsMjU1LDI1NSwyLDM2LDgsMCwxMzQsMTcyLAorCTEyLDAsMTMzLDE2NCwzMywxNiwwLDAsOCwwLDIyNCwzLAorCTAsMCwwLDAsMjE2LDI1NSwxODksMzksMzIsMCwxOTEsMTc1LAorCTI4LDAsMTc5LDE3NSwyNCwwLDE3OCwxNzUsMjAsMCwxNzcsMTc1LAorCTE2LDAsMTc2LDE3NSwzMywxMjgsMTI4LDAsMzMsMTUyLDE2MCwwLAorCTgsMCwzLDE0Miw0LDAsMiwxNDIsMCwwLDAsMCwKKwkzNSwxNDQsOTgsMCwyNTUsMjU1LDY2LDUwLDEyLDAsMywxNTAsCisJMCwwLDAsMCwzMywxNiw2NywwLDI1NSwyNTUsOTksNTAsCisJNDIsMTYsNjcsMCwzNSwwLDY0LDE2LDEsMCwyLDM2LAorCTAsMCwzLDE1MCwwLDAsMCwwLDMyLDAsOTgsMjAsCisJMjU1LDI1NSwyLDM2LDksNTAsMTkyLDEyLDI1NSwyNTUsMTAwLDUwLAorCTMzLDEzNiw2NCwwLDMsMCwzMiwyMiwyNTUsMjU1LDcwLDUwLAorCTE4OSw5MiwxOTIsOCwyNTUsMjU1LDIsMzYsNSwwLDE5MiwxNiwKKwkwLDAsMCwwLDQsMCw1LDE0MiwwLDAsMCwwLAorCTgwLDY4LDE5MiwxMiwzMywzMiwzMiwyLDAsMCwyLDE1MCwKKwkwLDAsMCwwLDEsMCw2Niw0OCw3LDAsNjQsMTYsCisJMCwwLDAsMCw0LDAsNCwxNDIsMCwwLDAsMCwKKwkzLDAsMTI4LDE2LDAsMCwwLDAsNjEsNTAsMTkyLDEyLAorCTAsMCwwLDAsNCwwLDE3LDE3NCwyNTUsMjU1LDY2LDUwLAorCTMzLDE2LDM0LDIsOCwwLDIsMTc0LDM1LDE2LDExNCwyLAorCTEyLDAsMiwxNjYsMzMsMTYsMCwwLDMyLDAsMTkxLDE0MywKKwkyOCwwLDE3OSwxNDMsMjQsMCwxNzgsMTQzLDIwLDAsMTc3LDE0MywKKwkxNiwwLDE3NiwxNDMsOCwwLDIyNCwzLDQwLDAsMTg5LDM5LAorCTIxNiwyNTUsMTg5LDM5LDMyLDAsMTkxLDE3NSwyOCwwLDE3OSwxNzUsCisJMjQsMCwxNzgsMTc1LDIwLDAsMTc3LDE3NSwxNiwwLDE3NiwxNzUsCisJMzMsMTI4LDEyOCwwLDMzLDEzNiwxOTIsMCwyNTUsMjU1LDM2LDUwLAorCTM1LDAsMTI4LDE2LDMzLDE1MiwxNjAsMCw4LDAsMiwxNDIsCisJNCwwLDMsMTQyLDAsMCwwLDAsMzUsMTYsNjcsMCwKKwkyNTUsMjU1LDY2LDQ4LDEyLDAsMywxNTAsMCwwLDAsMCwKKwkzMywxNiw2NywwLDQyLDE2LDY4LDAsMjAsMCw2NCwxNiwKKwkwLDAsMCwwLDksNTAsMTkyLDEyLDAsMCwwLDAsCisJMzMsMTQ0LDY0LDAsMjQsMCw2NCwxOCwyNTUsMjU1LDIsMzYsCisJMCwwLDIsMTUwLDAsMCwwLDAsMSwwLDY2LDQ4LAorCTgsMCw2NCwxNiwxLDAsMiwzNiw0LDAsNCwxNDIsCisJMCwwLDAsMCw0LDAsMTI4LDE2LDAsMCwwLDAsCisJNjEsNTAsMTkyLDEyLDAsMCwwLDAsMSwwLDIsMzYsCisJMCwwLDIsMTY2LDQsMCwxOCwxNzQsNCwwLDQsMTQyLAorCTMzLDQwLDk2LDIsODAsNjgsMTkyLDEyLDI1NSwyNTUsMzgsNTAsCisJMzMsMzIsMCwyLDI1NSwyNTUsMzcsNTAsODUsOTIsMTkyLDEyLAorCTMzLDQ4LDAsMCwzMywxNiwwLDAsMzIsMCwxOTEsMTQzLAorCTI4LDAsMTc5LDE0MywyNCwwLDE3OCwxNDMsMjAsMCwxNzcsMTQzLAorCTE2LDAsMTc2LDE0Myw4LDAsMjI0LDMsNDAsMCwxODksMzksCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMTg0LDI1NSwxODksMzksNjQsMCwxOTEsMTc1LDYwLDAsMTgzLDE3NSwKKwk1NiwwLDE4MiwxNzUsNTIsMCwxODEsMTc1LDQ4LDAsMTgwLDE3NSwKKwk0NCwwLDE3OSwxNzUsNDAsMCwxNzgsMTc1LDM2LDAsMTc3LDE3NSwKKwkzMiwwLDE3NiwxNzUsMzMsMTQ0LDEyOCwwLDExMiwwLDg0LDE0MiwKKwkwLDAsMCwwLDkyLDAsMTI4LDE4LDEsMCwyLDM2LAorCTEwOCwwLDgxLDE0MiwwLDAsMCwwLDg4LDAsMzIsMTgsCisJMCwwLDAsMCw5NiwwLDg3LDM4LDEzNiwwLDY2LDE3NCwKKwkxNDAsMCw2NCwxNzQsOTYsMCw2NCwxNzQsMTAwLDAsNjQsMTc0LAorCTIyNCw4MywxOTIsMTIsMzMsMzIsMzIsMiwzMywxNjgsNjQsMCwKKwkyNSwwLDE2MCwxOCwzMywxMjgsMTYwLDIsMTA4LDAsNjYsMTQyLAorCTAsMCwwLDAsMTI0LDAsNjYsMTc0LDEyOCwwLDg0LDE3NCwKKwkxMDgsMCw4MSwxNzQsMTEyLDAsODUsMTc0LDI5LDAsMzIsMjYsCisJMzMsMTUyLDAsMCwyNTUsMjU1LDIyLDM2LDMzLDMyLDAsMiwKKwk4LDAsMTMzLDM4LDMzLDQ4LDY0LDIsMTcwLDcyLDE5MiwxMiwKKwkxLDAsNywzNiwxMCwwLDg2LDE2LDMzLDMyLDY0LDIsCisJMTQsMCw2NCwyMCwwLDAsMCwwLDY0LDAsNjYsMTQyLAorCTAsMCwwLDAsMTAsMCw2NCwyMCwyLDAsNSwzNiwKKwk1Niw5MywxOTIsOCwxLDAsMTAyLDM4LDMzLDMyLDY0LDIsCisJNSwwLDUsMzYsMzMsNDgsMCwwLDE0MCw4NCwxOTIsMTIsCisJMCwwLDAsMCwxMDcsOTMsMTkyLDgsMSwwLDIsMzYsCisJMSwwLDExNSwzOCw2OCwwLDE2LDM4LDQyLDE2LDExMywyLAorCTIzMCwyNTUsNjQsMjAsNjgsMCwxNDgsMzgsNDAsMCwzMiwxOCwKKwkzMywxMjgsMTYwLDIsMTcsMCwyLDE0NiwwLDAsMCwwLAorCTM0LDAsNjYsNDgsMzIsMCw2NCwyMCwwLDAsMCwwLAorCTM2LDAsMiwxNDIsMTYsMCwxNzYsMTc1LDE2LDAsNjYsMTQwLAorCTI0LDAsNCwxNDIsMjgsMCw1LDE0MiwzMiwwLDYsMTQyLAorCTAsMCwwLDAsOSwyNDgsNjQsMCwzMyw1Niw2NCwyLAorCTE3LDAsMiwxNDYsMCwwLDAsMCwzMiwwLDY2LDUyLAorCTE3LDAsMiwxNjIsMCwwLDIyNiwxNDIsMCwwLDAsMCwKKwkxNSwwLDY0LDE2LDAsMCwwLDAsMjU1LDI1NSw0OSwzOCwKKwkxNSwwLDMyLDE4LDY4LDAsMTYsMzgsMTcsMCwzLDE0NiwKKwkwLDAsMCwwLDMyLDAsOTgsNDgsMiwwLDY0LDIwLAorCTM0LDAsOTgsNTIsMTcsMCwyLDE2MiwyNTUsMjU1LDQ5LDM4LAorCTI0OCwyNTUsMzIsMjIsNjgsMCwxNiwzOCwxMDcsOTMsMTkyLDgsCisJMzMsMTYsMCwwLDI1NSwyNTUsNDksMzgsMjE4LDI1NSwzMiwyMiwKKwk2OCwwLDE2LDM4LDMzLDE2LDAsMCw2NCwwLDE5MSwxNDMsCisJNjAsMCwxODMsMTQzLDU2LDAsMTgyLDE0Myw1MiwwLDE4MSwxNDMsCisJNDgsMCwxODAsMTQzLDQ0LDAsMTc5LDE0Myw0MCwwLDE3OCwxNDMsCisJMzYsMCwxNzcsMTQzLDMyLDAsMTc2LDE0Myw4LDAsMjI0LDMsCisJNzIsMCwxODksMzksMTY4LDI1NSwxODksMzksODAsMCwxOTEsMTc1LAorCTc2LDAsMTgzLDE3NSw3MiwwLDE4MiwxNzUsNjgsMCwxODEsMTc1LAorCTY0LDAsMTgwLDE3NSw2MCwwLDE3OSwxNzUsNTYsMCwxNzgsMTc1LAorCTUyLDAsMTc3LDE3NSw0OCwwLDE3NiwxNzUsMzMsMTQ0LDEyOCwwLAorCTk2LDAsNjYsMTQyLDAsMCwwLDAsMywwLDY0LDE2LAorCTMzLDMyLDAsMCwyNDAsOTMsMTkyLDgsMjU1LDI1NSwyLDM2LAorCTExNiwwLDY2LDE0MiwwLDAsMCwwLDcsMCw2NCwxNiwKKwkxMDQsMCw2NywzOCwxMiwwLDk5LDE0MCwwLDAsMCwwLAorCTEyLDAsOTgsMTQwLDAsMCwwLDAsMjUxLDI1NSw2NCwyMCwKKwkwLDAsMCwwLDgsMCwxMTYsMTQwLDAsMCwwLDAsCisJOTIsMCwxMjgsMTgsMzMsMTYsMCwwLDQsMCwxMTUsMTQwLAorCTAsMCwwLDAsODgsMCw5NiwxOCwwLDAsMCwwLAorCTY0LDAsNjYsMTQyLDAsMCwwLDAsNTUsMCw2NCwyMCwKKwkwLDAsMCwwLDMzLDEyOCwxMjgsMiw1MiwwLDk2LDI2LAorCTMzLDEzNiwwLDAsMjU1LDI1NSwyMywzNiwyLDAsMjIsMzYsCisJNSwwLDIxLDM2LDE3LDAsMiwxNDYsMCwwLDAsMCwKKwkxNiwwLDY2LDQ4LDQwLDAsNjQsMTYsMjQsMCwxNjUsMzksCisJOCwwLDMsMTQyLDI4LDAsMiwxNDIsMCwwLDAsMCwKKwkzNSwyNCw5OCwwLDI0LDAsMTYzLDE3NSwxMiwwLDIsMTQyLAorCTAsMCwwLDAsMjgsMCwxNjIsMTc1LDEyOCwyNCwzLDAsCisJMzMsMjQsOTgsMCwyNTIsMjU1LDk4LDE0MCwwLDAsMCwwLAorCTEsMCw2NiwzNiwyNTIsMjU1LDk4LDE3MiwxMiwwLDAsMTc0LAorCTgsMCwwLDE3NCwzMywzMiwwLDIsMzMsNDgsNjQsMiwKKwkxNzAsNzIsMTkyLDEyLDEsMCw3LDM2LDYsMCw4NywxNiwKKwkwLDAsMCwwLDksMCw2NCwyMCwxLDAsMzQsMzgsCisJOTYsMCw4NiwxNzQsMTk2LDkzLDE5Miw4LDEwMCwwLDY2LDE3NCwKKwk5NiwwLDg1LDE3NCwxMTAsODYsMTkyLDEyLDI0LDAsMTY0LDM5LAorCTI0MCw5MywxOTIsOCwyNTUsMjU1LDIsMzYsMTEwLDg2LDE5MiwxMiwKKwkyNCwwLDE2NCwzOSwxNywwLDIsMTQ2LDAsMCwwLDAsCisJMTIsMCw2Niw0OCwxNywwLDIsMTYyLDEsMCw0LDM2LAorCTEsMCw0OSwzOCw0MiwxNiw1MSwyLDIwOSwyNTUsNjQsMjAsCisJNjgsMCwxNiwzOCwyNywwLDEyOCwxNiwzMywxMjgsMTI4LDIsCisJMjMsMCw5NiwyNiwzMywxMzYsMCwwLDE3LDAsMiwxNDYsCisJMCwwLDAsMCwzNCwwLDY2LDQ4LDE0LDAsNjQsMjAsCisJMCwwLDAsMCwzNiwwLDIsMTQyLDE2LDAsMTc2LDE3NSwKKwkxNiwwLDY2LDE0MCwyNCwwLDQsMTQyLDI4LDAsNSwxNDIsCisJMzIsMCw2LDE0MiwwLDAsMCwwLDksMjQ4LDY0LDAsCisJMzMsNTYsNjQsMiwxNywwLDIsMTQ2LDAsMCwwLDAsCisJMzIsMCw2Niw1MiwxNywwLDIsMTYyLDEsMCw0OSwzOCwKKwk0MiwxNiw1MSwyLDIzNSwyNTUsNjQsMjAsNjgsMCwxNiwzOCwKKwkyNDAsOTMsMTkyLDgsMSwwLDIsMzYsMzMsMTYsMCwwLAorCTgwLDAsMTkxLDE0Myw3NiwwLDE4MywxNDMsNzIsMCwxODIsMTQzLAorCTY4LDAsMTgxLDE0Myw2NCwwLDE4MCwxNDMsNjAsMCwxNzksMTQzLAorCTU2LDAsMTc4LDE0Myw1MiwwLDE3NywxNDMsNDgsMCwxNzYsMTQzLAorCTgsMCwyMjQsMyw4OCwwLDE4OSwzOSwwLDAsMCwwLAorCTIwMCwyNTUsMTg5LDM5LDQ4LDAsMTkxLDE3NSw0NCwwLDE3OSwxNzUsCisJNDAsMCwxNzgsMTc1LDM2LDAsMTc3LDE3NSwzMiwwLDE3NiwxNzUsCisJMzMsMTQ0LDEyOCwwLDk2LDAsNjQsMTc0LDEwMCwwLDY0LDE3NCwKKwkxMTIsMCw4MCwxNDIsMCwwLDAsMCwxMDUsMCwwLDE4LAorCTMzLDE2LDAsMCwxMDgsMCw4MSwxNDIsMCwwLDAsMCwKKwkxMDEsMCwzMiwxOCwwLDAsMCwwLDY0LDAsNjYsMTQyLAorCTAsMCwwLDAsNDMsMCw2NCwyMCwzMywzMiw2NCwyLAorCTUwLDAsMzIsMjYsMzMsMTUyLDAsMCwzMywzMiwwLDIsCisJMzMsNDAsNjQsMiw5Niw3MiwxOTIsMTIsMSwwLDYsMzYsCisJMTMsMCw2NCwyMCwzMywzMiw2NCwyLDIwLDAsMiwxNTAsCisJMCwwLDAsMCwxLDAsNjYsNDgsMzQsMCw2NCwxNiwKKwkyLDAsNSwzNiwzNiwwLDIsMTQyLDAsMCwwLDAsCisJMywwLDY2LDE0NCwwLDAsMCwwLDIsMCw2Niw0OCwKKwkzLDAsNjQsMjAsMCwwLDAsMCw2Myw5NCwxOTIsOCwKKwkyLDAsNSwzNiwzNiwwLDIsMTQyLDAsMCwwLDAsCisJMzIsMCw2NiwxNDAsNCwwLDY3LDE0MiwwLDAsMCwwLAorCTM2LDE2LDY3LDAsMTYsMCw2NCwxNiwzMywzMiw2NCwyLAorCTM2LDAsMiwxNDIsMTYsMCwzLDE0NiwyLDAsNjYsMTQ0LAorCTAsMCwwLDAsMTEsMCw5OCwyMCwzLDAsNSwzNiwKKwkxLDAsMTE1LDM4LDQyLDE2LDExMywyLDIxOSwyNTUsNjQsMjAsCisJNjgsMCwxNiwzOCw2OSw5NCwxOTIsOCw5NiwwLDgzLDM4LAorCTUsMCw1LDM2LDY0LDk0LDE5Miw4LDMzLDQ4LDAsMCwKKwkyLDAsNSwzNiwxLDAsMTAyLDM4LDE0MCw4NCwxOTIsMTIsCisJMCwwLDAsMCwxMTMsOTQsMTkyLDgsMSwwLDIsMzYsCisJOTYsMCw4MywzOCwxMTIsMCw4MCwxNDIsMCwwLDAsMCwKKwk0MSwwLDMyLDE4LDMzLDE2LDAsMCwxNywwLDIsMTQ2LAorCTAsMCwwLDAsMTcsMCw2Niw0OCwzMiwwLDY0LDIwLAorCTAsMCwwLDAsMzYsMCwyLDE0MiwxNiwwLDE3NiwxNzUsCisJNCwwLDY2LDE0MCwyNCwwLDQsMTQyLDI4LDAsNSwxNDIsCisJMzIsMCw2LDE0MiwwLDAsMCwwLDksMjQ4LDY0LDAsCisJMzMsNTYsNjQsMiwxNywwLDIsMTQ2LDAsMCwwLDAsCisJMTYsMCw2Niw1MiwxNywwLDIsMTYyLDAsMCw5OCwxNDIsCisJMCwwLDAsMCwxNSwwLDY0LDE2LDAsMCwwLDAsCisJMjU1LDI1NSw0OSwzOCwxNSwwLDMyLDE4LDY4LDAsMTYsMzgsCisJMTcsMCwzLDE0NiwwLDAsMCwwLDE2LDAsOTgsNDgsCisJMiwwLDY0LDIwLDE3LDAsOTgsNTIsMTcsMCwyLDE2MiwKKwkyNTUsMjU1LDQ5LDM4LDI0OCwyNTUsMzIsMjIsNjgsMCwxNiwzOCwKKwkxMTMsOTQsMTkyLDgsMzMsMTYsMCwwLDI1NSwyNTUsNDksMzgsCisJMjE4LDI1NSwzMiwyMiw2OCwwLDE2LDM4LDMzLDE2LDAsMCwKKwk0OCwwLDE5MSwxNDMsNDQsMCwxNzksMTQzLDQwLDAsMTc4LDE0MywKKwkzNiwwLDE3NywxNDMsMzIsMCwxNzYsMTQzLDgsMCwyMjQsMywKKwk1NiwwLDE4OSwzOSwxOTIsMjU1LDE4OSwzOSw1NiwwLDE5MSwxNzUsCisJNTIsMCwxODMsMTc1LDQ4LDAsMTgyLDE3NSw0NCwwLDE4MSwxNzUsCisJNDAsMCwxODAsMTc1LDM2LDAsMTc5LDE3NSwzMiwwLDE3OCwxNzUsCisJMjgsMCwxNzcsMTc1LDI0LDAsMTc2LDE3NSwzMywxNDQsMTI4LDAsCisJMTEyLDAsODQsMTQyLDAsMCwwLDAsMTcxLDAsMTI4LDE4LAorCTMzLDE2LDAsMCwxMDgsMCw4NSwxNDIsMCwwLDAsMCwKKwkxNjYsMCwxNjAsMTgsMzIsMCwyLDM2LDU2LDAsNjcsMTQ2LAorCTAsMCwwLDAsNzUsMCw5OCwxNiw5NiwwLDgzLDM4LAorCTMzLDAsOTgsNDAsNSwwLDY0LDE2LDY0LDAsMiwzNiwKKwk5LDAsOTYsMTYsMzMsMTYsMCwwLDQ5LDk1LDE5Miw4LAorCTAsMCwwLDAsODUsMCw5OCwxNiwxMjgsMCwyLDM2LAorCTEzNywwLDk4LDE2LDMzLDE2LDAsMCw0OSw5NSwxOTIsOCwKKwkwLDAsMCwwLDMzLDEzNiwxNjAsMiw4LDAsMzIsMTgsCisJMzMsMTI4LDEyOCwyLDE3LDAsMiwxNDYsMCwwLDAsMCwKKwkxLDAsNjYsNDgsMTM5LDAsNjQsMTYsMjU1LDI1NSw0OSwzOCwKKwkyNTAsMjU1LDMyLDIyLDY4LDAsMTYsMzgsMCwwLDk4LDE0MiwKKwkwLDAsMCwwLDEzNiwwLDY0LDIwLDMzLDE2LDAsMCwKKwkzMywxMzYsMTYwLDIsNDMsMCwzMiwxOCwzMywxMjgsMTI4LDIsCisJMTQsMCwyMiwzNiw2NCwwLDIzLDM2LDE3LDAsMiwxNDYsCisJMCwwLDAsMCwzNCwwLDY2LDQ4LDMzLDAsNjQsMjAsCisJMCwwLDAsMCwzNiwwLDIsMTQyLDE2LDAsMTc2LDE3NSwKKwkxMiwwLDY2LDE0MCwyNCwwLDQsMTQyLDI4LDAsNSwxNDIsCisJMzIsMCw2LDE0MiwwLDAsMCwwLDksMjQ4LDY0LDAsCisJMzMsNTYsNjQsMiwxNywwLDIsMTQ2LDAsMCwwLDAsCisJMzIsMCw2Niw1MiwxNywwLDIsMTYyLDAsMCw5OCwxNDIsCisJMCwwLDAsMCwxNiwwLDY0LDE2LDAsMCwwLDAsCisJMjU1LDI1NSw0OSwzOCwxMCwwLDMyLDE4LDY4LDAsMTYsMzgsCisJMTcsMCwzLDE0NiwwLDAsMCwwLDMyLDAsOTgsNDgsCisJMiwwLDY0LDIwLDE5MiwwLDk4LDUyLDE3LDAsMiwxNjIsCisJMjU1LDI1NSw0OSwzOCwyNDgsMjU1LDMyLDIyLDY4LDAsMTYsMzgsCisJMCwwLDExOCwxNzQsMjM2LDk0LDE5Miw4LDU2LDAsODcsMTYyLAorCTI1NSwyNTUsNDksMzgsMjE3LDI1NSwzMiwyMiw2OCwwLDE2LDM4LAorCTMyLDAsMiwzNiw1NiwwLDY2LDE2MiwwLDAsOTgsMTQyLAorCTAsMCwwLDAsMTMsMCw2NCwyMCw2NCwwLDIsMzYsCisJMzMsMTM2LDE2MCwyLDgxLDAsMzIsMTgsMzMsMTI4LDEyOCwyLAorCTE3LDAsMiwxNDYsMCwwLDAsMCwyLDAsNjYsNDgsCisJNzQsMCw2NCwxNiwyNTUsMjU1LDQ5LDM4LDI1MCwyNTUsMzIsMjIsCisJNjgsMCwxNiwzOCw0OSw5NSwxOTIsOCwzMywxNiwwLDAsCisJNTYsMCw2NiwxNjIsMTQsMCwyLDM2LDAsMCw5OCwxNzQsCisJMzMsMTM2LDE2MCwyLDUzLDAsMzIsMTgsMzMsMTI4LDEyOCwyLAorCTIsMCwyMywzNiwxNSwwLDIyLDM2LDE3LDAsMiwxNDYsCisJMCwwLDAsMCwxOTQsMCw2Niw0OCw1LDAsNjQsMTYsCisJMCwwLDAsMCwxOSwwLDg3LDE2LDAsMCwwLDAsCisJMzIsOTUsMTkyLDgsMjU1LDI1NSw0OSwzOCw2NCwwLDIsMTQyLAorCTAsMCwwLDAsMzQsMCw2NCwxNiwwLDAsMCwwLAorCTE2LDAsMTc2LDE3NSw2NCwwLDIsMTQyLDI0LDAsNCwxNDIsCisJMjgsMCw1LDE0MiwzMiwwLDYsMTQyLDAsMCwwLDAsCisJOSwyNDgsNjQsMCwzMyw1Niw2NCwyLDE3LDAsMiwxNDYsCisJMCwwLDAsMCwzMCw5NSwxOTIsOCw2NCwwLDY2LDUyLAorCTY0LDAsMiwxNDIsMCwwLDAsMCwxMywwLDY0LDE2LAorCTAsMCwwLDAsMTYsMCwxNzYsMTc1LDY0LDAsMiwxNDIsCisJMjQsMCw0LDE0MiwyOCwwLDUsMTQyLDMyLDAsNiwxNDIsCisJMCwwLDAsMCw5LDI0OCw2NCwwLDMzLDU2LDY0LDIsCisJMTcsMCwyLDE0NiwwLDAsMCwwLDMwLDk1LDE5Miw4LAorCTY0LDAsNjYsNTIsMCwwLDExOCwxNzQsMTcsMCwyLDE0NiwKKwkwLDAsMCwwLDEyOCwwLDY2LDUyLDE3LDAsMiwxNjIsCisJMjU1LDI1NSw0OSwzOCwyMDgsMjU1LDMyLDIyLDY4LDAsMTYsMzgsCisJMzMsMTM2LDE2MCwyLDEyLDAsMzIsMTgsMzMsMTI4LDEyOCwyLAorCTE3LDAsMiwxNDYsMCwwLDAsMCwxMjgsMCw2Niw0OCwKKwk1LDAsNjQsMTYsMjU1LDI1NSw0OSwzOCwyNTAsMjU1LDMyLDIyLAorCTY4LDAsMTYsMzgsNDksOTUsMTkyLDgsMzMsMTYsMCwwLAorCTQ5LDk1LDE5Miw4LDEsMCwyLDM2LDMzLDE2LDAsMCwKKwk1NiwwLDE5MSwxNDMsNTIsMCwxODMsMTQzLDQ4LDAsMTgyLDE0MywKKwk0NCwwLDE4MSwxNDMsNDAsMCwxODAsMTQzLDM2LDAsMTc5LDE0MywKKwkzMiwwLDE3OCwxNDMsMjgsMCwxNzcsMTQzLDI0LDAsMTc2LDE0MywKKwk4LDAsMjI0LDMsNjQsMCwxODksMzksMTg0LDI1NSwxODksMzksCisJNjQsMCwxOTEsMTc1LDYwLDAsMTgzLDE3NSw1NiwwLDE4MiwxNzUsCisJNTIsMCwxODEsMTc1LDQ4LDAsMTgwLDE3NSw0NCwwLDE3OSwxNzUsCisJNDAsMCwxNzgsMTc1LDM2LDAsMTc3LDE3NSwzMiwwLDE3NiwxNzUsCisJMzMsMTYwLDEyOCwwLDExMiwwLDE0NywxNDIsMCwwLDAsMCwKKwkxMjksMCw5NiwxOCwzMywxNiwwLDAsMTA4LDAsMTQ2LDE0MiwKKwkwLDAsMCwwLDEyNSwwLDY0LDE4LDk2LDAsMTUxLDM4LAorCTk2LDAsMTI4LDE3NCwxMDAsMCwxMjgsMTc0LDIyNCw4MywxOTIsMTIsCisJMzMsMzIsNjQsMiwzMywxNjgsNjQsMCw1LDAsMTYwLDIyLAorCTMzLDEzNiw2NCwyLDMzLDMyLDEyOCwyLDUsMCw1LDM2LAorCTEyMyw5NSwxOTIsOCwzMyw0OCwwLDAsMzYsMCw2NCwxOCwKKwkzMywxMjgsMTYwLDIsNSwwLDIyLDM2LDE2LDAsMjIsMTYyLAorCTgsMCwxMDAsMTQyLDEyLDAsMTAxLDE0MiwwLDAsMCwwLAorCTgwLDg2LDE5MiwxMiw4LDAsNiwzOCw1LDAsNjQsMjAsCisJMCwwLDAsMCwyNTUsMjU1LDQ5LDM4LDY4LDAsMTE1LDM4LAorCTI0NSwyNTUsMzIsMjIsNjgsMCwxNiwzOCwyMSwwLDMyLDE4LAorCTQyLDE2LDUwLDIsNywwLDY0LDE2LDMzLDEyOCwxNjAsMiwKKwk1OSw4NCwxOTIsMTIsMzMsMzIsMCwyLDEsMCw0OSwzOCwKKwk0MiwxNiw1MCwyLDI1MSwyNTUsNjQsMjAsNjgsMCwxNiwzOCwKKwk2MSw1MCwxOTIsMTIsMzMsMzIsMTYwLDIsMzMsMzIsMTI4LDIsCisJNSwwLDUsMzYsMTIzLDk1LDE5Miw4LDMzLDQ4LDAsMCwKKwkyLDAsNSwzNiwxLDAsMzgsMzgsMTQwLDg0LDE5MiwxMiwKKwkwLDAsMCwwLDIwMyw5NSwxOTIsOCwxLDAsMiwzNiwKKwkxMjQsMCwxNDYsMTc0LDExMiwwLDEzMCwxNDIsMCwwLDAsMCwKKwkxMjgsMCwxMzAsMTc0LDExMiwwLDE0OSwxNzQsMzMsMTI4LDE2MCwyLAorCTI3LDAsNjQsMjYsMzMsMTM2LDAsMCwzMywzMiwwLDIsCisJMzMsNDAsMTI4LDIsOTYsNzIsMTkyLDEyLDEsMCw2LDM2LAorCTEzLDAsNjQsMjAsMCwwLDAsMCwyMCwwLDIsMTUwLAorCTAsMCwwLDAsMSwwLDY2LDQ4LDgsMCw2NCwxNiwKKwkwLDAsMCwwLDM2LDAsMiwxNDIsMCwwLDAsMCwKKwkzLDAsNjYsMTQ0LDAsMCwwLDAsMSwwLDY2LDQ4LAorCTUsMCw2NCwyMCwwLDAsMCwwLDY0LDAsMTMwLDE0MiwKKwkwLDAsMCwwLDIyMSwyNTUsNjQsMTYsMzMsMzIsMTI4LDIsCisJMSwwLDQ5LDM4LDQyLDE2LDUwLDIsMjMxLDI1NSw2NCwyMCwKKwk2OCwwLDE2LDM4LDQwLDAsNjQsMTgsMzMsMTI4LDE2MCwyLAorCTE3LDAsMiwxNDYsMCwwLDAsMCwzNCwwLDY2LDQ4LAorCTMyLDAsNjQsMjAsMCwwLDAsMCwzNiwwLDIsMTQyLAorCTE2LDAsMTc2LDE3NSw4LDAsNjYsMTQwLDI0LDAsNCwxNDIsCisJMjgsMCw1LDE0MiwzMiwwLDYsMTQyLDAsMCwwLDAsCisJOSwyNDgsNjQsMCwzMyw1NiwxMjgsMiwxNywwLDIsMTQ2LAorCTAsMCwwLDAsMzIsMCw2Niw1MiwxNywwLDIsMTYyLAorCTAsMCwyMjYsMTQyLDAsMCwwLDAsMTUsMCw2NCwxNiwKKwkwLDAsMCwwLDI1NSwyNTUsODIsMzgsMTUsMCw2NCwxOCwKKwk2OCwwLDE2LDM4LDE3LDAsMywxNDYsMCwwLDAsMCwKKwkzMiwwLDk4LDQ4LDIsMCw2NCwyMCwzNCwwLDk4LDUyLAorCTE3LDAsMiwxNjIsMjU1LDI1NSw4MiwzOCwyNDgsMjU1LDY0LDIyLAorCTY4LDAsMTYsMzgsMjAzLDk1LDE5Miw4LDMzLDE2LDAsMCwKKwkyNTUsMjU1LDgyLDM4LDIxOCwyNTUsNjQsMjIsNjgsMCwxNiwzOCwKKwkzMywxNiwwLDAsNjQsMCwxOTEsMTQzLDYwLDAsMTgzLDE0MywKKwk1NiwwLDE4MiwxNDMsNTIsMCwxODEsMTQzLDQ4LDAsMTgwLDE0MywKKwk0NCwwLDE3OSwxNDMsNDAsMCwxNzgsMTQzLDM2LDAsMTc3LDE0MywKKwkzMiwwLDE3NiwxNDMsOCwwLDIyNCwzLDcyLDAsMTg5LDM5LAorCTAsMCwwLDAsMCwwLDAsMCwzNywxMTUsNTgsMzcsCisJMTAwLDU4LDMyLDEwMiw5NywxMDUsMTA4LDEwMSwxMDAsMzIsOTcsMTE1LAorCTExNSwxMDEsMTE0LDExNiwxMDUsMTExLDExMCwzMiw5NiwzNywxMTUsMzksCisJMTAsMCwwLDAsMTE0LDk3LDEwOSwxMTYsMTAxLDExNSwxMTYsMTAwLAorCTExOSw0MCw5OCw5OSw0Niw5OCw5OSw5NSwxMDQsMTAxLDk3LDExMiwKKwkxMTUsMTE2LDk3LDExNCwxMTYsNDQsMzIsMTA4LDEwMSwxMTAsNDQsMzIsCisJNDksNDQsMzIsNDgsNDQsMzIsNDgsNDEsMzIsNjEsNjEsMzIsCisJNDgsMCwwLDAsOTgsOTksNDYsOTgsOTksOTUsMTA0LDEwMSwKKwk5NywxMTIsMTAxLDExMCwxMDAsMzIsNjAsNjEsMzIsOTgsOTksNDYsCisJOTgsOTksOTUsMTE0LDk3LDEwOSwxMDEsMTEwLDEwMCwwLDAsMCwKKwkzNSwzMiwxMTIsMTExLDExNCwxMTYsMTE1LDU4LDMyLDM3LDEwMCwxMCwKKwkwLDAsMCwwLDQyLDQyLDQyLDgwLDExNCwxMTEsMTAyLDEwNSwKKwkxMDgsMTA1LDExMCwxMDMsMzIsNjQsMzIsMzcsMTIwLDQ0LDMyLDM3LAorCTEyMCwxMCwwLDAsMTAzLDExMSwxMTYsMzIsMTA0LDEwMSwxMTQsMTAxLAorCTMyLDk5LDk3LDExNywxMTUsMTAxLDYxLDM3LDEyMCwzMiwxMTUsMTE2LAorCTk3LDExNiwxMTcsMTE1LDYxLDM3LDEyMCwzMiwxMTgsMTAxLDk5LDYxLAorCTM3LDEyMCwxMCwwLDM3LDExNSw1OCwzNywxMDAsNTgsMzIsMTAyLAorCTk3LDEwNSwxMDgsMTAxLDEwMCwzMiw5NywxMTUsMTE1LDEwMSwxMTQsMTE2LAorCTEwNSwxMTEsMTEwLDMyLDk2LDM3LDExNSwzOSwxMCwwLDAsMCwKKwk4MywxMDEsOTksMTExLDExMCwxMDAsMTE1LDMyLDYwLDMyLDQ4LDEyMCwKKwk1NSw3MCw3MCw3MCwxMDIsMTAyLDEwMiwxMDIsMCwwLDAsMCwKKwk4NCwxMDUsMTA5LDEwMSwxMTQsMTE1LDg1LDExNSwxMDEsMTAwLDMyLDYwLAorCTMyLDc4LDg0LDczLDc3LDY5LDgyLDgzLDAsMCwwLDAsCisJMCwwLDAsMCw2OSw2OSw4MCw4Miw3OSw3NywzMiwxMDUsCisJMTE1LDMyLDk4LDk3LDEwMCwxMCwwLDAsODAsMTExLDExNCwxMTYsCisJMzIsMzcsMTAwLDMyLDEwMSwxMTYsMTA0LDEwMSwxMTQsMzIsOTcsMTAwLAorCTEwMCwxMTQsMTAxLDExNSwxMTUsNTgsMzIsMzcsNDgsNTAsODgsNTgsCisJMzcsNDgsNTAsODgsNTgsMzcsNDgsNTAsODgsNTgsMzcsNDgsCisJNTAsODgsNTgsMzcsNDgsNTAsODgsNTgsMzcsNDgsNTAsODgsCisJMTAsMCwwLDAsMzUsMzUsMzUsMzIsNTYsNTAsNTMsNTcsCisJNTQsMzIsNjcsMTA0LDk3LDExMCwzMiwzNywxMDAsNTgsMzIsMTE1LAorCTEwMSwxMDgsMTAyLDExNiwxMDEsMTE1LDExNiwzMiwxMDIsOTcsMTA1LDEwOCwKKwkxMDEsMTAwLDMyLDQwLDM3LDEyMCw0MSwxMCwwLDAsMCwwLAorCTQyLDQyLDQyLDMyLDU2LDUwLDUzLDU3LDU0LDMyLDgwLDExMSwKKwkxMTQsMTE2LDMyLDM3LDEwMCw1OCwzMiwxMTUsMTAxLDEwOCwxMDIsMTE2LAorCTEwMSwxMTUsMTE2LDMyLDExMiw5NywxMTUsMTE1LDEwMSwxMDAsMTAsMCwKKwk1Niw1MCw1Myw1Nyw1NCwzMiw4MCwxMTEsMTE0LDExNiwzMiwzNywKKwkxMDAsNTgsMzIsMTAwLDExNywxMDksMTEyLDMyLDEwMiw5NywxMDUsMTA4LAorCTEwMSwxMDAsMzIsNDAsMzcsMTIwLDQxLDEwLDAsMCwwLDAsCisJNDIsNDIsNDIsMzIsNTYsNTAsNTMsNTcsNTQsMzIsODAsMTExLAorCTExNCwxMTYsMzIsMzcsMTAwLDU4LDMyLDEwMCwxMTcsMTA5LDExMiwzMiwKKwkxMTIsOTcsMTE1LDExNSwxMDEsMTAwLDEwLDAsMzUsMzUsMzUsMzIsCisJNTYsNTAsNTMsNTcsNTQsMzIsODAsMTExLDExNCwxMTYsMzIsMzcsCisJMTAwLDU4LDMyLDgzLDY3LDgwLDMyLDEwMiwxMDEsMTE2LDk5LDEwNCwKKwkzMiwxMDIsOTcsMTA1LDEwOCwxMDEsMTAwLDEwLDAsMCwwLDAsCisJNDIsNDIsNDIsMzIsNTYsNTAsNTMsNTcsNTQsMzIsODAsMTExLAorCTExNCwxMTYsMzIsMzcsMTAwLDU4LDMyLDgzLDY3LDgwLDMyLDEwMiwKKwkxMDEsMTE2LDk5LDEwNCwzMiwxMTIsOTcsMTE1LDExNSwxMDEsMTAwLDMyLAorCTM3LDEyMCwzMiwxMCwwLDAsMCwwLDM1LDM1LDM1LDMyLAorCTU2LDUwLDUzLDU3LDU0LDMyLDgwLDExMSwxMTQsMTE2LDMyLDM3LAorCTEwMCw1OCwzMiw2Niw4NSw4Myw4NCw3Myw3Nyw2OSw4Miw4MywKKwkzMiwxMDgsMTExLDk3LDEwMCwzMiwxMDIsOTcsMTA1LDEwOCwxMDEsMTAwLAorCTEwLDAsMCwwLDQyLDQyLDQyLDMyLDU2LDUwLDUzLDU3LAorCTU0LDMyLDgwLDExMSwxMTQsMTE2LDMyLDM3LDEwMCw1OCwzMiw2NiwKKwk4NSw4Myw4NCw3Myw3Nyw2OSw4Miw4MywzMiwxMDgsMTExLDk3LAorCTEwMCwzMiwxMTIsOTcsMTE1LDExNSwxMDEsMTAwLDEwLDAsMCwwLAorCTM1LDM1LDM1LDMyLDY1LDY3LDc1LDMyLDEwMCwxMDUsMTAwLDMyLAorCTExMCwxMTEsMTE2LDMyLDExMSw5OSw5OSwxMTcsMTE0LDEwLDAsMCwKKwkzNSwzNSwzNSwzMiwxMTUsMTE2LDk3LDExNiwxMTcsMTE1LDMyLDExNSwKKwkxMTYsMTA1LDEwOCwxMDgsMzIsOTgsMTE3LDExNSwxMjEsNTgsMzIsMzcsCisJMTIwLDEwLDAsMCwxMDEsMTE2LDEwNCw5NSwxMDUsMTEwLDEwNSwxMTYsCisJNDYsOTksMCwwLDQyLDQyLDQyLDc2LDQ5LDg3LDY1LDEwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMzUsMzUsMzUsMzIsODQsNjYsNjgsMzIsCisJOTgsMTA4LDExMSw5OSwxMDcsMTE1LDMyLDk3LDExNCwxMDEsMTEwLDM5LAorCTExNiwzMiw5OCwxMDEsMTA1LDExMCwxMDMsMzIsMTAyLDExNCwxMDEsMTAxLAorCTEwMCwxMCwwLDAsNjUsMTE2LDExNiwxMDEsMTA5LDExMiwxMTYsMzIsCisJMTE2LDExMSwzMiwxMDIsMTE0LDEwMSwxMDEsMzIsOTgsMTExLDEwMywxMTcsCisJMTE1LDMyLDg0LDY2LDY4LDMyLDM3LDEyMCwxMCwwLDAsMCwKKwkzNSwzNSwzNSwzMiw2Niw4NSw3MCwzMiw5OCwxMDgsMTExLDk5LAorCTEwNywxMTUsMzIsOTcsMTE0LDEwMSwxMTAsMzksMTE2LDMyLDk4LDEwMSwKKwkxMDUsMTEwLDEwMywzMiwxMDIsMTE0LDEwMSwxMDEsMTAwLDEwLDAsMCwKKwk2NSwxMTYsMTE2LDEwMSwxMDksMTEyLDExNiwzMiwxMTYsMTExLDMyLDEwMiwKKwkxMTQsMTAxLDEwMSwzMiw5OCwxMTEsMTAzLDExNywxMTUsMzIsNjYsODUsCisJNzAsMzIsMzcsMTIwLDEwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCw4Miw3MCw2OCwxMTUsMzIsMzcsMTAwLDMyLAorCTEwLDAsMCwwLDgyLDY2LDY4LDExNSwzMiwzNywxMDAsMzIsCisJMTAsMCwwLDAsMzcsMTE1LDU4LDM3LDEwMCw1OCwzMiwxMDIsCisJOTcsMTA1LDEwOCwxMDEsMTAwLDMyLDk3LDExNSwxMTUsMTAxLDExNCwxMTYsCisJMTA1LDExMSwxMTAsMzIsOTYsMzcsMTE1LDM5LDEwLDAsMCwwLAorCTEwMSwxMTYsMTA0LDk1LDExNCw5OSwxMTgsNDYsOTksMCwwLDAsCisJMTAwLDExNSwxMTYsOTksMTA0LDk3LDExMCwzMiw2Miw2MSwzMiw0OSwKKwkzMiwzOCwzOCwzMiwxMDAsMTE1LDExNiw5OSwxMDQsOTcsMTEwLDMyLAorCTYwLDMyLDc4LDk5LDEwNCw5NywxMTAsMCwzNywxMTUsMzcsNDgsCisJNTAsODgsNTgsMzcsNDgsNTAsODgsNTgsMzcsNDgsNTAsODgsCisJNTgsMzcsNDgsNTAsODgsNTgsMzcsNDgsNTAsODgsNTgsMzcsCisJNDgsNTAsODgsMzcsMTE1LDAsMCwwLDE3Niw3MiwwLDEzMSwKKwk4MCw2NywwLDEzMSwxNjQsNjcsMCwxMzEsMjQsNjgsMCwxMzEsCisJODAsNjcsMCwxMzEsMCwwLDAsMCw0LDgyLDAsMTMxLAorCTE4NCw3NiwwLDEzMSwxMiw3NywwLDEzMSwxMjgsNzcsMCwxMzEsCisJMTg0LDc2LDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDM3LDExNSw1OCwzNywxMDAsNTgsMzIsMTAyLAorCTk3LDEwNSwxMDgsMTAxLDEwMCwzMiw5NywxMTUsMTE1LDEwMSwxMTQsMTE2LAorCTEwNSwxMTEsMTEwLDMyLDk2LDM3LDExNSwzOSwxMCwwLDAsMCwKKwkxMDEsMTE2LDEwNCw5NSwxMjAsMTA5LDEwNSwxMTYsNDYsOTksMCwwLAorCTk5LDk4LDExMiw0NSw2MiwxMTAsMTExLDExMiw0Niw5OSwxMDksMTAwLAorCTMyLDYxLDYxLDMyLDczLDUzLDU3LDU0LDk1LDY3LDY2LDk1LAorCTY3LDc3LDY4LDk1LDc4LDc5LDgwLDEyNCw3Myw1Myw1Nyw1NCwKKwk5NSw2Nyw2Niw5NSw2Nyw3Nyw2OCw5NSw2OSw3NiwwLDAsCisJOTksOTgsMTEyLDQ1LDYyLDExMCwxMTEsMTEyLDQ2LDk5LDEwOSwxMDAsCisJMzIsMzgsMzIsNzMsNTMsNTcsNTQsOTUsNjcsNjYsOTUsNjcsCisJNzcsNjgsMCwwLDExMiw0NSw2MiwxMTUsOTksOTgsMTEyLDQ1LAorCTYyLDExNSwxMTYsOTcsMTE2LDExNywxMTUsMzIsMzgsMzIsNzMsNTMsCisJNTcsNTQsOTUsODMsNjcsNjYsOTUsNjcsNzgsNjUsMCwwLAorCTM1LDM1LDM1LDMyLDk5LDEwOSwxMDAsMzIsMTE1LDExNiwxMDUsMTA4LAorCTEwOCwzMiw5OCwxMTcsMTE1LDEyMSw1OCwzMiwzNywxMjAsMTAsMCwKKwkzNywxMDAsNjEsMzcsMTAwLDQ0LDM3LDEyMCw0NCwzNywxMDAsMTAsCisJMCwwLDAsMCwzOSwzNywxMTUsMzksMzIsMzcsMTIwLDMyLAorCTM3LDEyMCwxMCwwLDM3LDQ4LDU2LDEyMCw1OCwzMiwzNyw0OCwKKwk1MCwxMjAsMTAsMCwzNyw0OCw1NiwxMjAsNTgsMzIsMzcsNDgsCisJNTIsMTIwLDEwLDAsMzcsNDgsNTYsMTIwLDU4LDMyLDM3LDQ4LAorCTU2LDEyMCwxMCwwLDEwOCwxMDUsMTEwLDEwNywzMiwxMTUsMTE2LDk3LAorCTExNiwxMDEsMzIsMzcsNDgsNTAsMTIwLDEwLDAsMCwwLDAsCisJNDIsNDIsNDIsMzIsMTAzLDExMSwxMTYsMzIsMzcsMTAwLDMyLDEwNSwKKwkxMTAsMTE2LDEwMSwxMTQsMTE0LDExNywxMTIsMTE2LDExNSwxMCwwLDAsCisJMzUsMzUsMzUsMzIsNjksMTIwLDExMiwxMDEsOTksMTE2LDEwMSwxMDAsCisJMzIsMzcsMTAwLDMyLDk4LDExNywxMTYsMzIsMTAzLDExMSwxMTYsMzIsCisJMzcsMTAwLDMyLDEwNSwxMTAsMTE2LDEwMSwxMTQsMTE0LDExNywxMTIsMTE2LAorCTExNSwxMCwwLDAsODAsNzYsODgsNTcsNDgsNTQsNDgsMzIsCisJNjUsMTAwLDEwMCwxMTQsMTAxLDExNSwxMTUsMzIsNjEsMzIsMzcsODgsCisJMzIsNjgsNjUsODQsNjUsMzIsNjEsMzIsMzcsODgsMzIsMTAsCisJMCwwLDAsMCw0Miw0Miw0MiwzMiw4NywxMTQsMTA1LDExNiwKKwkxMDEsMzIsMTExLDEwMiwzMiwzNywxMjAsMzIsMTE2LDExMSwzMiwzNywKKwkxMDAsMzIsMTAyLDk3LDEwNSwxMDgsMTAxLDEwMCwxMCwwLDAsMCwKKwk0Miw0Miw0MiwzMiw4NywxMTQsMTA1LDExNiwxMDEsMzIsMTExLDEwMiwKKwkzMiwzNywxMjAsMzIsMTE2LDExMSwzMiwzNywxMjAsMzIsMTAyLDk3LAorCTEwNSwxMDgsMTAxLDEwMCwxMCwwLDAsMCw0Miw0Miw0Miw0MiwKKwk0Miw0Miw0Miw0Miw0Miw0Miw0Miw0Miw0Miw0Miw0Miw0MiwKKwkwLDAsMCwwLDQyLDQyLDQyLDMyLDczLDEwOCwxMDgsMTAxLAorCTEwMyw5NywxMDgsMzIsOTksMTExLDEwOSwxMDksOTcsMTEwLDEwMCwzMiwKKwkzOSwzNywxMTUsMzksMTAsMCwwLDAsNDUsNDUsNDUsMzIsCisJOTksMTExLDEwOSwxMDksOTcsMTEwLDEwMCwxMTUsMzIsMTA5LDQ0LDExNiwKKwk0NCwxMDEsNDQsNjksNDQsOTcsNDQsMTIwLDQ0LDEwOCw0NCwxMTUsCisJNDQsMTEyLDMyLDk5LDk3LDExMCwzMiw5OCwxMDEsMzIsMTEyLDExNCwKKwkxMDEsMTAyLDEwNSwxMjAsMTAxLDEwMCwzMiwxMTksMTA1LDExNiwxMDQsMzIsCisJOTcsMzIsMTE0LDEwMSwxMTIsMTAxLDk3LDExNiwzMiw5OSwxMTEsMTE3LAorCTExMCwxMTYsMCwwLDEwOCwzMiwxMjAsMTEyLDExMSwxMTQsMTE2LDMyLAorCTExNCwxMTIsMTExLDExNCwxMTYsMzIsOTEsMTA4LDEwMSwxMTAsOTMsMzIsCisJMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzYsMTExLDExMSwKKwkxMTIsOTgsOTcsOTksMTA3LDMyLDExNiwxMDEsMTE1LDExNiwzMiwxMDIsCisJMTE0LDExMSwxMDksMzIsMTIwLDExMiwxMTEsMTE0LDExNiwzMiw0MCw0OSwKKwk0NSw1NCw0MSwzMiwxMTYsMTExLDMyLDExNCwxMTIsMTExLDExNCwxMTYsCisJMzIsNDAsNDksNDUsNTQsNDEsMCwwLDEwNSwzMiwzMiwzMiwKKwkzMiwzMiwzMiwzMiwzMiwzMiw3MywxMTAsMTE2LDEwMSwxMTQsMTE0LAorCTExNywxMTIsMTE2LDMyLDcyLDExMSwxMTUsMTE2LDMyLDMyLDEyNCwzMiwKKwkzMiwxMTUsMzIsOTEsMTEyLDExMSwxMTQsMTE2LDkzLDMyLDkxLDEwOCwKKwkxMDEsMTEwLDkzLDMyLDY2LDk3LDk5LDEwNyw1MCw5OCw5Nyw5OSwKKwkxMDcsMzIsMTIwLDEwOSwxMDUsMTE2LDMyLDk5LDExMCwxMTYsMzIsMTEyLAorCTk3LDk5LDEwNywxMDEsMTE2LDExNSwwLDAsODAsMzIsMzIsMzIsCisJMzIsMzIsMzIsMzIsMzIsMzIsODQsMTAxLDExNSwxMTYsMzIsODAsCisJNzYsODgsMzIsNTcsNDgsNTQsNDgsMzIsMzIsMzIsMTI0LDMyLAorCTMyLDEwMCwzMiw5MSwxMTQsMTI0LDExOSwxMjQsMTA4LDEyNCwxMTYsOTMsCisJMzIsOTEsMTE4LDk3LDEwOCwxMjQsMzksOTksMzksOTMsMzIsMzIsCisJODIsMTAxLDk3LDEwMCw0Nyw4NywxMTQsMTA1LDExNiwxMDEsNDcsNzYsCisJMTExLDExMSwxMTIsNDcsODQsMTA1LDEwOSwxMDEsMzIsNjgsNzcsNjUsCisJMCwwLDAsMCw3NiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKKwkzMiwzMiw4MiwxMDEsOTcsMTAwLDMyLDc2LDEwNSwxMTAsMTA3LDMyLAorCTc2LDY5LDY4LDExNSwzMiwzMiwxMjQsMzIsMzIsMTEyLDMyLDExNCwKKwkxMDEsMTAzLDExMCwxMTEsMzIsOTEsMTE4LDk3LDEwOCw5MywzMiwzMiwKKwk4MiwxMDEsOTcsMTAwLDQ3LDkxLDExOSwxMTQsMTA1LDExNiwxMDEsOTMsCisJMzIsODAsNzYsODgsMzIsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTAxLAorCTExNCwwLDAsMCw2NSwzMiw5NywxMDAsMTAwLDExNCwzMiwzMiwKKwkzMiwzMiw4MywxMDEsMTE2LDMyLDEwMSwxMTYsMTA0LDEwMSwxMTQsMzIsCisJOTcsMTAwLDEwMCwxMTQsMzIsMzIsMTI0LDMyLDMyLDM2LDMyLDExNSwKKwk5OSwxMTQsMTA1LDExMiwxMTYsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCisJODIsMTAxLDk3LDEwMCwzMiw5OSwxMDksMTAwLDExNSwzMiwxMDIsMTE0LAorCTExMSwxMDksMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDM5LDExNSw5OSwxMTQsCisJMTA1LDExMiwxMTYsMzksMCwwLDAsMCwxMjAsMzIsOTEsMTEyLAorCTExMSwxMTQsMTE2LDkzLDMyLDMyLDg0LDEyMCwzMiwxMDEsMTE2LDEwNCwKKwkxMDEsMTE0LDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDEyNCwzMiwKKwkzMiw4MiwzMiw5MSwxMTIsMTExLDExNCwxMTYsOTMsMzIsMzIsMzIsCisJMzIsMzIsMzIsMzIsODIsMTIwLDMyLDEwMSwxMTYsMTA0LDEwMSwxMTQsCisJMzIsOTEsMTExLDExMCwzMiwxMTIsMTExLDExNCwxMTYsMzIsNDksNDUsCisJNTQsOTMsMCwwLDcyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorCTMyLDMyLDg0LDExMSwxMDMsMTAzLDEwOCwxMDEsMzIsNzAsNjcsNjcsCisJMzIsMTE2LDEwMSwxMTUsMTE2LDMyLDEyNCwzMiwzMiwxMTMsNDQsOTQsCisJNjgsNDQsOTQsOTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCisJODEsMTE3LDEwNSwxMTYsMCwwLDAsMCw5NywzMiwzMiwzMiwKKwkzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDEsMTE1LDExNiwzMiw5NywKKwkxMDgsMTA4LDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDEyNCwzMiwKKwkzMiw5MCwzMiwxMDksMTE1LDEwMSw5OSwxMTUsMzIsMzIsMzIsMzIsCisJMzIsMzIsMzIsMzIsODAsOTcsMTE3LDExNSwxMDEsMzIsMTAyLDExMSwKKwkxMTQsMzIsOTcsMzIsMTE5LDEwNCwxMDUsMTA4LDEwMSwwLDAsMCwKKwk2OSwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDEsCisJMTE1LDExNiwzMiw2OSw2OSw4MCw4Miw3OSw3NywzMiwzMiwzMiwKKwkzMiwzMiwxMjQsMzIsMzIsODMsMTE0LDMyLDk3LDEwMCwxMDAsMTE0LAorCTU5LDMyLDgzLDExOSwzMiw5NywxMDAsMTAwLDExNCwzMiwxMTgsOTcsCisJMTA4LDU5LDMyLDMyLDgyLDEwMSw5NywxMDAsNDcsODcsMTE0LDEwNSwKKwkxMTYsMTAxLDMyLDgwLDc2LDg4LDMyLDY5LDUwLDMyLDExNCwxMDEsCisJMTAzLDAsMCwwLDEwMSwzMiw5MSwxMTIsMTExLDExNCwxMTYsOTMsCisJMzIsMzIsODQsMTAxLDExNSwxMTYsMzIsMTAxLDExNiwxMDQsMTAxLDExNCwKKwkxMTAsMTAxLDExNiwzMiwzMiwzMiwxMjQsMzIsMzIsNjksMTE0LDMyLAorCTk3LDEwMCwxMDAsMTE0LDU5LDMyLDY5LDExOSwzMiw5NywxMDAsMTAwLAorCTExNCwzMiwxMTgsOTcsMTA4LDU5LDMyLDMyLDgyLDEwMSw5NywxMDAsCisJNDcsODcsMTE0LDEwNSwxMTYsMTAxLDMyLDY5LDY5LDgwLDgyLDc5LAorCTc3LDMyLDExNCwxMDEsMTAzLDAsMCwwLDExNiwzMiwzMiwzMiwKKwkzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDEsMTE1LDExNiwzMiwxMTYsCisJMTA1LDEwOSwxMDEsMTE0LDExNSwzMiwzMiwzMiwzMiwzMiwxMjQsMzIsCisJMzIsMTE5LDkxLDQyLDkzLDMyLDk3LDEwMCwxMDAsMTE0LDMyLDExOCwKKwk5NywxMDgsMzIsMzIsODcsMTE0LDEwNSwxMTYsMTAxLDMyLDEwOSwxMDEsCisJMTA5LDExMSwxMTQsMTIxLDU4LDMyLDExOSw5OCwzMiwxMTksMTA0LDQ0LAorCTMyLDExOSwxMTksNDQsMzIsMTE5LDExNiwwLDEwOSwzMiwzMiwzMiwKKwkzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDEsMTE1LDExNiwzMiwxMDksCisJMTAxLDEwOSwxMTEsMTE0LDEyMSwzMiwzMiwzMiwzMiwzMiwxMjQsMzIsCisJMzIsMTE0LDkxLDQyLDkzLDMyLDk3LDEwMCwxMDAsMTE0LDMyLDMyLAorCTMyLDMyLDMyLDMyLDgyLDEwMSw5NywxMDAsMzIsMTA5LDEwMSwxMDksCisJMTExLDExNCwxMjEsNTgsMzIsMTE0LDk4LDMyLDExNCwxMDQsNDQsMzIsCisJMTE0LDExOSw0NCwzMiwxMTQsMTE2LDAsMCw0Miw0Miw0MiwzMiwKKwk4MiwxMDUsMTAzLDEwNCwxMTYsODMsMTE5LDEwNSwxMTYsOTksMTA0LDMyLAorCTY4LDEwNSw5NywxMDMsMTEwLDExMSwxMTUsMTE2LDEwNSw5OSwxMTUsMzIsCisJMTA5LDEwMSwxMTAsMTE3LDMyLDQyLDQyLDQyLDAsMCwwLDAsCisJNDUsNDUsNDUsMzIsODQsMTA0LDExNCwxMDEsMTAxLDMyLDk5LDExMSwKKwkxMTIsMTA1LDEwMSwxMTUsMzIsMTExLDEwMiwzMiw5NywxMDAsMTAwLDExNCwKKwkxMDEsMTE1LDExNSwzMiwxMDAsMTExLDMyLDExMCwxMTEsMTE2LDMyLDk3LAorCTEwMywxMTQsMTAxLDEwMSwzMywxMCwwLDAsNDUsNDUsNDUsMzIsCisJNjksMTE2LDEwNCwxMDEsMTE0LDMyLDY1LDEwMCwxMDAsMTE0LDEwMSwxMTUsCisJMTE1LDMyLDc4LDExMSwxMTYsMzIsODMsMTAxLDExNiwzMywxMCwwLAorCTQ1LDQ1LDQ1LDMyLDY5LDExNiwxMDQsMTAxLDExNCwzMiw2NSwxMDAsCisJMTAwLDExNCwxMDEsMTE1LDExNSwzMiwxMDUsMTE1LDMyLDk3LDMyLDEwOSwKKwkxMTcsMTA4LDExNiwxMDUsOTksOTcsMTE1LDExNiwzMiw5NywxMDAsMTAwLAorCTExNCwxMDEsMTE1LDExNSwzMywxMCwwLDAsNDIsNDIsNDIsMzIsCisJMzcsNDgsNTAsODgsMzcsNDgsNTAsODgsMzcsNDgsNTAsODgsCisJNTgsMzcsNDgsNTAsODgsNTgsMzcsNDgsNTAsODgsMzcsNDgsCisJNTAsODgsMTAsMCw0NSw0NSw0NSwzMiw3MCwxMDUsMTE0LDExNSwKKwkxMTYsMzIsOTgsMTIxLDExNiwxMDEsMzIsNDAsMzcsNDgsNTAsODgsCisJNDEsMzIsMTA1LDExNSwzMiw5NywzMiw5OCwxMTQsMTExLDk3LDEwMCwKKwk5OSw5NywxMTUsMTE2LDMyLDk3LDEwMCwxMDAsMTE0LDEwMSwxMTUsMTE1LAorCTEwLDAsMCwwLDQ1LDQ1LDQ1LDMyLDc2LDk3LDExNSwxMTYsCisJMzIsMTAwLDEwNSwxMDMsMTA1LDExNiwzMiwxMDksMTE3LDExNSwxMTYsMzIsCisJOTgsMTAxLDMyLDQ4LDMyLDExMSwxMTQsMzIsNTYsMTAsMCwwLAorCTQyLDQyLDQyLDMyLDY5LDEwNSwxMDMsMTA0LDExNiwzMiwxMDEsMTE2LAorCTEwNCwxMDEsMTE0LDExMCwxMDEsMTE2LDMyLDk3LDEwMCwxMDAsMTE0LDEwMSwKKwkxMTUsMTE1LDEwMSwxMTUsMzIsMTA0LDk3LDExOCwxMDEsMzIsOTgsMTAxLAorCTEwMSwxMTAsMzIsMTE3LDExNSwxMDEsMTAwLDU4LDEwLDAsMCwwLAorCTQyLDQyLDQyLDMyLDgwLDExMSwxMTQsMTE2LDMyLDM3LDEwMCwzMiwKKwkxMDEsMTE2LDEwNCwxMDEsMTE0LDExMCwxMDEsMTE2LDMyLDk3LDEwMCwxMDAsCisJMTE0LDEwMSwxMTUsMTE1LDMyLDEwNSwxMTUsMzIsMCwwLDAsMCwKKwk0NSw0NSw0NSwzMiw2Niw5NywxMDAsMzIsMTAxLDExNiwxMDQsMTAxLAorCTExNCwzMiw5NywxMDAsMTAwLDExNCwxMDEsMTE1LDExNSwzMiwzOSwzNywKKwkxMTUsMzksMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLDEwMCwKKwkxMCwwLDAsMCwwLDAsMCwwLDI0NCwxMDEsMCwxMzEsCisJMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsCisJMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsCisJMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsCisJMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsCisJMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsCisJMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsCisJMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsCisJMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsCisJMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsCisJMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsCisJMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsCisJMTA0LDExMiwwLDEzMSwyNDQsMTAxLDAsMTMxLDEwNCwxMTIsMCwxMzEsCisJMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsCisJMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLDY0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDI4LDExMSwwLDEzMSwxMDQsMTEyLDAsMTMxLAorCTEwNCwxMTIsMCwxMzEsMTMyLDExMSwwLDEzMSwxNTIsMTA5LDAsMTMxLAorCTEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwyNDQsMTAxLDAsMTMxLAorCTEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLAorCTI0LDEwNywwLDEzMSwxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsCisJMTA0LDExMiwwLDEzMSw3NiwxMDgsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkyMjgsMTA4LDAsMTMxLDExMiwxMTAsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkyOCwxMDksMCwxMzEsMTA0LDExMiwwLDEzMSw0OCwxMTEsMCwxMzEsCisJMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsCisJMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsCisJODQsMTA5LDAsMTMxLDEwNCwxMTIsMCwxMzEsMTA0LDExMiwwLDEzMSwKKwkzMiwxMTIsMCwxMzEsMTM2LDEwNiwwLDEzMSwyOCwxMDYsMCwxMzEsCisJMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLDUyLDEwNywwLDEzMSwKKwkxMDQsMTEyLDAsMTMxLDEwNCwxMTIsMCwxMzEsMjUyLDEwNiwwLDEzMSwKKwk4OCwxMTEsMCwxMzEsMTA0LDExMiwwLDEzMSwxMDQsMTEyLDAsMTMxLAorCTE5NiwxMDcsMCwxMzEsMTA0LDExMiwwLDEzMSwxODAsMTA0LDAsMTMxLAorCTE2OCwxMDYsMCwxMzEsOTIsMTA2LDAsMTMxLDEwNCwxMTIsMCwxMzEsCisJMTA0LDExMiwwLDEzMSwxNDgsMTA1LDAsMTMxLDE5MiwxMDYsMCwxMzEsCisJMCwwLDAsMCwxODgsMTExLDAsMTMxLDIwNCwxMTEsMCwxMzEsCisJMTIsMTEyLDAsMTMxLDEyLDExMiwwLDEzMSwxMiwxMTIsMCwxMzEsCisJMTIsMTEyLDAsMTMxLDEyLDExMiwwLDEzMSwxMiwxMTIsMCwxMzEsCisJMTIsMTEyLDAsMTMxLDEyLDExMiwwLDEzMSwxMiwxMTIsMCwxMzEsCisJMTIsMTEyLDAsMTMxLDI1MiwxMTEsMCwxMzEsMTIsMTEyLDAsMTMxLAorCTEyLDExMiwwLDEzMSwxMiwxMTIsMCwxMzEsMTIsMTEyLDAsMTMxLAorCTIzNiwxMTEsMCwxMzEsMTIsMTEyLDAsMTMxLDEyLDExMiwwLDEzMSwKKwkxMiwxMTIsMCwxMzEsMTIsMTEyLDAsMTMxLDIyMCwxMTEsMCwxMzEsCisJMjUyLDExMSwwLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJNDIsNDIsNDIsMzIsNjksNjksODAsODIsNzksNzcsMzIsODAsCisJOTcsMTE1LDExNSwxMDEsMTAwLDEwLDAsMCwzMywzMywzMywzMiwKKwk2OSw2OSw4MCw4Miw3OSw3NywzMiw3MCw5NywxMDUsMTA4LDExNywKKwkxMTQsMTAxLDU4LDMyLDg3LDExNCwxMTEsMTE2LDEwMSwzMiwzNyw0OCwKKwk1MiwxMjAsMzIsOTcsMTE2LDMyLDM3LDEwMCw0NCwzMiwxMDMsMTExLAorCTExNiwzMiwzNyw0OCw1MiwxMjAsMTAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwzNSwzNSwzNSw3MCwKKwkxMTQsOTcsMTA5LDEwMSwzMiwzNywxMDAsMzIsMTAwLDEwNSwxMDAsMzIsCisJMTEwLDExMSwxMTYsMzIsOTcsMTE0LDExNCwxMDUsMTE4LDEwMSwxMCwwLAorCTM1LDM1LDM1LDMyLDcwLDExNCw5NywxMDksMTAxLDMyLDM3LDEwMCwKKwk0NCwzMiwxMDgsMTAxLDExMCwzMiwzNywxMDAsNDQsMzIsOTgsMTIxLAorCTExNiwxMDEsMzIsMzcsMTAwLDQ0LDMyLDExOSw5NywxMTAsMTE2LDMyLAorCTM3LDEyMCwzMiwxMDMsMTExLDExNiwzMiwzNywxMjAsMTAsMCwwLAorCTM1LDM1LDM1LDcwLDExNCw5NywxMDksMTAxLDMyLDM3LDEwMCwzMiwKKwkxMTksMTE0LDExMSwxMTAsMTAzLDMyLDEwOCwxMDEsMTEwLDEwMywxMTYsMTA0LAorCTMyLDQwLDExOSw5NywxMTAsMTE2LDMyLDM3LDEwMCwzMiwxMDMsMTExLAorCTExNiwzMiwzNywxMDAsNDEsMTAsMCwwLDM1LDM1LDM1LDcwLAorCTExNCw5NywxMDksMTAxLDMyLDM3LDEwMCw1OCwzMiwxMDMsMTExLDExNiwKKwkzMiwxMTUsMTAxLDExMywzMiwzNywxMDAsMTAsMCwwLDAsMCwKKwkzNSwzNSwzNSwzMiwzNywxMDAsMzIsNjcsODIsNjcsMzIsMTAxLAorCTExNCwxMTQsMTExLDExNCwxMTUsMzIsMTExLDk5LDk5LDExNywxMTQsMTAxLAorCTEwMCwxMCwwLDAsMzUsMzUsMzUsMzIsMzcsMTAwLDMyLDY1LAorCTEwOCwxMDUsMTAzLDExMCwzMiwxMDEsMTE0LDExNCwxMTEsMTE0LDExNSwzMiwKKwkxMTEsOTksOTksMTE3LDExNCwxMDEsMTAwLDEwLDAsMCwwLDAsCisJMzUsMzUsMzUsMzIsMzcsMTAwLDMyLDgzLDEwNCwxMTEsMTE0LDExNiwKKwkzMiwxMDEsMTE0LDExNCwxMTEsMTE0LDExNSwzMiwxMTEsOTksOTksMTE3LAorCTExNCwxMDEsMTAwLDEwLDAsMCwwLDAsMzUsMzUsMzUsMzIsCisJMzcsMTAwLDMyLDc5LDExOCwxMDEsMTE0LDExNCwxMTcsMTEwLDMyLDEwMSwKKwkxMTQsMTE0LDExMSwxMTQsMTE1LDMyLDExMSw5OSw5OSwxMTcsMTE0LDEwMSwKKwkxMDAsMTAsMCwwLDM1LDM1LDM1LDMyLDY3LDg1LDMyLDExNSwKKwkxMTYsMTA1LDEwOCwxMDgsMzIsMTE0LDExNywxMTAsMTEwLDEwNSwxMTAsMTAzLAorCTU4LDMyLDM3LDEyMCwxMCwwLDAsMCwzNSwzNSwzNSwzMiwKKwk5OSwxMDksMTAwLDMyLDExNSwxMTYsMTA1LDEwOCwxMDgsMzIsOTgsMTE3LAorCTExNSwxMjEsNTgsMzIsMzcsMTIwLDEwLDAsMzUsMzUsMzUsMzIsCisJMTE1LDExNiw5NywxMTYsMTE3LDExNSwzMiwxMTUsMTE2LDEwNSwxMDgsMTA4LAorCTMyLDk4LDExNywxMTUsMTIxLDU4LDMyLDM3LDEyMCwxMCwwLDAsCisJNjcsNjYsNjEsMzcsMTIwLDQ0LDMyLDg0LDY2LDY4LDYxLDM3LAorCTEyMCw0NCwzMiw2Niw4NSw3MCw2MSwzNywxMjAsMTAsMCwwLAorCTExNiwxMDEsMTE1LDExNiw5NSwxMDEsMTE2LDEwNCwxMDEsMTE0LDQ2LDk5LAorCTAsMCwwLDAsMzcsMTAwLDMyLDEwMiwxMTQsOTcsMTA5LDEwMSwKKwkxMTUsMzIsMTExLDEwMiwzMiwxMDgsMTAxLDExMCwxMDMsMTE2LDEwNCwzMiwKKwkzNywxMDAsMzIsMTE1LDEwMSwxMTAsMTE2LDMyLDEwNSwxMTAsMzIsMzcsCisJMTAwLDMyLDEwOSwxMTUsMTAxLDk5LDExNSwxMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTQyLDQyLDQyLDMyLDU2LDUwLDUzLDUyLDMyLDg0LDEwNSwxMDksCisJMTAxLDExNCwzMiw0OCwzMiw3OSw3NSw0NCwzMiw5OSwxMTEsMTE3LAorCTExMCwxMTYsMzIsMTE5LDk3LDExNSwzMiwzNywxMDAsMTAsMCwwLAorCTQyLDQyLDQyLDMyLDU2LDUwLDUzLDUyLDMyLDg0LDEwNSwxMDksCisJMTAxLDExNCwzMiw0OCwzMiwxMTAsMTExLDExNiwzMiwxMDUsMTEwLDExNiwKKwkxMDEsMTE0LDExNCwxMTcsMTEyLDExNiwxMDUsMTEwLDEwMywzMiwzNywxMDAsCisJMTAsMCwwLDAsNDIsNDIsNDIsMzIsNTYsNTAsNTMsNTIsCisJMzIsODQsMTA1LDEwOSwxMDEsMTE0LDMyLDQ4LDMyLDExNSwxMTIsMTAxLAorCTEwMSwxMDAsMzIsMTE5LDExNCwxMTEsMTEwLDEwMyw0NCwzMiwxMDMsMTExLAorCTExNiwzMiwzNywxMDAsMzIsMTE1LDEwNCwxMTEsMTE3LDEwOCwxMDAsMzIsCisJOTgsMTAxLDMyLDQ5LDQ4LDQ4LDQ4LDEwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJOSwzNywxMjAsNTgsMzIsMTE5LDk3LDExMCwxMTYsMzIsMzcsMTIwLAorCTMyLDEwMywxMTEsMTE2LDMyLDM3LDEyMCwxMCwwLDAsMCwwLAorCTQ1LDQ1LDQ1LDMyLDgyLDY1LDc3LDMyLDg0LDEwMSwxMTUsMTE2LAorCTMyLDExMSwxMDIsMzIsMzcsMTIwLDMyLDExNiwxMTEsMzIsMzcsMTIwLAorCTMyLDEwMiw5NywxMDUsMTA4LDEwMSwxMDAsMTAsMCwwLDAsMCwKKwk0Miw0Miw0MiwzMiw4Miw2NSw3NywzMiw4NCwxMDEsMTE1LDExNiwKKwkzMiwxMTEsMTAyLDMyLDM3LDEyMCwzMiwxMTYsMTExLDMyLDM3LDEyMCwKKwkzMiwxMTIsOTcsMTE1LDExNSwxMDEsMTAwLDEwLDAsMCwwLDAsCisJMzUsMzUsMzUsMzIsNjgsNzcsNjUsMzIsNjgsNzksNzgsNjksCisJMzIsMTEwLDEwMSwxMTgsMTAxLDExNCwzMiwxMTEsOTksOTksMTE3LDExNCwKKwkxMTQsMTAxLDEwMCw0NiwzMiwzMiw5OSwxMTUsMTE0LDMyLDYxLDMyLAorCTM3LDEyMCwxMCwwLDM1LDM1LDM1LDMyLDcyLDExMSwxMTUsMTE2LAorCTMyLDExMCwxMDEsMTE4LDEwMSwxMTQsMzIsMTAzLDExMSwxMTYsMzIsNjgsCisJNzcsNjUsMzIsMTA1LDExMCwxMTYsMTAxLDExNCwxMTQsMTE3LDExMiwxMTYsCisJNDYsMzIsOTgsOTksOTUsOTksMTEwLDExNiwzMiw2MSwzMiwzNywKKwkxMDAsMTAsMCwwLDM1LDM1LDM1LDMyLDY4LDc3LDY1LDMyLAorCTEwMSwxMTQsMTE0LDExMSwxMTQsMzIsOTcsMTE2LDMyLDEwNSwxMTAsMTAwLAorCTEwMSwxMjAsMzIsMzcsMTAwLDU4LDMyLDExOSw5NywxMTAsMTE2LDEwMSwKKwkxMDAsMzIsMzcsNDgsNTAsMTIwLDMyLDEwMywxMTEsMTE2LDMyLDM3LAorCTQ4LDUwLDEyMCwxMCwwLDAsMCwwLDM1LDM1LDM1LDMyLAorCTczLDEwOCwxMDgsMTAxLDEwMyw5NywxMDgsMzIsNzIsMTExLDExNSwxMTYsCisJMzIsOTcsMTAwLDEwMCwxMTQsMzIsNDAsNjEsMzcsMTIwLDQxLDMyLAorCTExMSwxMTQsMzIsMTA4LDEwMSwxMTAsMTAzLDExNiwxMDQsMzIsNDAsNjEsCisJMzcsMTAwLDQxLDEwLDAsMCwwLDAsMzUsMzUsMzUsMzIsCisJNjcsMTExLDExNywxMTAsMTE2LDMyLDk5LDk3LDExMCwxMTAsMTExLDExNiwKKwkzMiw5OCwxMDEsMzIsNjIsMzIsNDksNDgsNTAsNTIsNDIsNDksCisJNDgsNTAsNTIsMTAsMCwwLDAsMCw0Miw0Miw0MiwzMiwKKwkxMDgsOTksMTA4LDQ2LDY2LDExNywxMDIsNDksMzIsNjEsMzIsMzcsCisJMTIwLDMyLDQ1LDQ1LDYyLDMyLDEwNCwxMTEsMTE1LDExNiw0Niw2NiwKKwkxMTcsMTAyLDMyLDYxLDMyLDM3LDEyMCwzMiw0NSw0NSw2MiwzMiwKKwkxMDgsOTksMTA4LDQ2LDY2LDExNywxMDIsNTAsMzIsNjEsMzIsMzcsCisJMTIwLDEwLDAsMCw0Miw0Miw0MiwzMiw2MiwzMiw2OCw5OCwKKwkzMiwzNywxMDAsMzIsNDAsOTgsMTE3LDExNCwxMTUsMTE2LDQxLDU5LAorCTMyLDYyLDMyLDY4LDExOSwzMiwzNywxMDAsMzIsNDAsMTE5LDk3LAorCTEwNSwxMTYsMTE1LDExNiw5NywxMTYsMTAxLDExNSw0MSwxMCwwLDAsCisJMzUsMzUsMzUsMzIsODMsMTAxLDk5LDExMSwxMTAsMTAwLDMyLDk3LAorCTExNCwxMDMsMzIsMTA5LDExNywxMTUsMTE2LDMyLDk4LDEwMSwzMiwzOSwKKwkxMTQsMzksMzIsMTExLDExNCwzMiwzOSwxMTksMzksMzIsMTExLDExNCwKKwkzMiwzOSwxMDgsMzksMTAsMCwwLDAsNDIsNDIsNDIsMzIsCisJNjgsNzcsNjUsMzIsMzcsMTE1LDMyLDEwNSwxMTAsMzIsMzcsNTIsCisJMTAwLDMyLDk4LDEyMSwxMTYsMTAxLDMyLDk5LDEwNCwxMTcsMTEwLDEwNywKKwkxMTUsNTgsMzIsMCwzMiwzMiwxMTYsMTExLDMyLDEwNCwxMTEsMTE1LAorCTExNiwwLDAsMCwxMDIsMTE0LDExMSwxMDksMzIsMTA0LDExMSwxMTUsCisJMTE2LDAsMCwwLDM3LDU2LDEwMCwzMiw5OCwxMjEsMTE2LDEwMSwKKwkxMTUsNDcsMTE1LDEwMSw5OSw0NiwxMCwwLDExNiwxMDUsMTA5LDEwMSwKKwkzMiwxMTYsMTExLDExMSwzMiwxMTUsMTA0LDExMSwxMTQsMTE2LDMyLDExNiwKKwkxMTEsMzIsMTA5LDEwMSw5NywxMTUsMTE3LDExNCwxMDEsMTAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTgwLDM3LDEwMCw0NSw2MiwzNywxMTUsMzIsMTAsMCwwLDAsCisJMTE2LDExNCw5NywxMTAsMTE1LDEwOSwxMDUsMTE2LDMyLDExMiwxMDEsMTEwLAorCTEwMCwxMDUsMTEwLDEwMywzMiwxMTEsMTEwLDMyLDM3LDEwMCwxMCwwLAorCTExNiwxMTQsOTcsMTEwLDExNSwxMDksMTA1LDExNiwzMiw5OSwxMTEsMTEwLAorCTEwMiwxMDUsMTAzLDMyLDExMSwxMTAsMzIsMzcsMTAwLDEwLDAsMCwKKwkxMTYsMTE0LDk3LDExMCwxMTUsMTA5LDEwNSwxMTYsMzIsMTE2LDk5LDExMCwKKwkxMCwwLDAsMCwxMTYsOTksMTEwLDMyLDEwMSwxMjAsMTEyLDEwLAorCTAsMCwwLDAsMTAyLDExMSwxMTQsMTE5LDk3LDExNCwxMDAsOTUsCisJMTAwLDEwMSwxMDgsOTcsMTIxLDMyLDEwMSwxMjAsMTEyLDMyLDM3LDEwMCwKKwkxMCwwLDAsMCwxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSw5NSwKKwk5NywxMDMsMTAxLDMyLDEwMSwxMjAsMTEyLDMyLDM3LDEwMCwxMCwwLAorCTEwNCwxMTEsMTA4LDEwMCwzMiwxMDEsMTIwLDExMiwzMiwzNywxMDAsMTAsCisJMCwwLDAsMCw4NCwxMjAsNjcsNzksNzgsNzAsNzMsNzEsCisJMzcsMTAwLDEwLDAsODQsMTIwLDg0LDY3LDc4LDM3LDEwMCwxMCwKKwkwLDAsMCwwLDExNCw5OSwxMTgsMzIsOTksMTExLDExMCwxMDIsCisJMTA1LDEwMywzMiwxMTEsMTEwLDMyLDM3LDEwMCwxMCwwLDAsMCwKKwk5MCw2OSw4Miw3OSwzMiwxMTQsMTExLDExMSwxMTYsMzMsMzIsOTcsCisJMTE2LDMyLDM3LDEyMCwzMiwwLDAsMCwxMTUsMTE3LDExMiwxMDEsCisJMTE0LDk5LDEwMSwxMDAsMTAxLDExNSwzMiwzNywxMDAsMTAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTY1LDgyLDgwLDgyLDY5LDgxLDMyLDM3LDEyMCwzMywxMCwwLAorCTY1LDgyLDgwLDgyLDY5LDgwLDMyLDM3LDEyMCwzMywxMCwwLAorCTgzLDEwMSwxMTAsMTAwLDMyLDg1LDY4LDgwLDMyLDM3LDEwMCwxMCwKKwkwLDAsMCwwLDc4LDExMSwzMiw4Miw2Niw2OCwzOSwxMTUsCisJMzIsMTA1LDExMCwzMiw4NSw2OCw4MCwzMiw0MCwzNywxMDAsMzIsCisJMzcsMTAwLDQxLDEwLDAsMCwwLDAsODMsMTAxLDExMCwxMTYsCisJMzIsODUsNjgsODAsMzIsMzcsMTAwLDEwLDAsMCwwLDAsCisJODMsNzgsNzcsODAsMzIsMzksMzcsOTksMzksMzIsMTA4LDEwMSwKKwkxMTAsMzIsMzcsMTAwLDEwLDAsMCwwLDY5LDExMCwxMTgsMTExLAorCTEyMSwzMiwxMTQsOTksNjEsMzcsMTAwLDEwLDAsMCwwLDAsCisJNzEsMTAxLDExMCwzMiwxMTYsMTE0LDk3LDExMiwzMiwzNywxMDAsMzIsCisJMTE0LDk5LDYxLDM3LDEwMCwxMCwwLDAsNjYsOTcsMTAwLDMyLAorCTg1LDY4LDgwLDMyLDk5LDEwNCwxMDEsOTksMTA3LDExNSwxMTcsMTA5LAorCTMyLDM3LDEyMCwzMiwxMDgsMTAxLDExMCwzMiwzNywxMDAsMTAsMCwKKwk2Niw5NywxMDAsMzIsODUsNjgsODAsMzIsMTA4LDEwMSwxMTAsMTAzLAorCTExNiwxMDQsMzIsMTE5LDk3LDExMCwxMTYsMzIsMzcsMTAwLDMyLDEwMywKKwkxMTEsMTE2LDMyLDM3LDEwMCwxMCwwLDAsNjYsOTcsMTAwLDMyLAorCTczLDY3LDc3LDgwLDMyLDk5LDEwNCwxMDEsOTksMTA3LDExNSwxMTcsCisJMTA5LDEwLDAsMCw3OCwxMTEsMzIsODIsNjYsNjgsMzksMTE1LAorCTMyLDEwNSwxMTAsMzIsNzMsNjcsNzcsODAsMTAsMCwwLDAsCisJNjYsOTcsMTAwLDMyLDczLDgwLDMyLDk5LDEwNCwxMDEsOTksMTA3LAorCTExNSwxMTcsMTA5LDEwLDAsMCwwLDAsODQsMTE0LDExNywxMTAsCisJOTksOTcsMTE2LDEwMSwxMDAsMzIsNzMsODAsMTAsMCwwLDAsCisJODMsNjksNzgsODQsMzIsNzMsODAsODgsMzMsMTAsMCwwLAorCTExMCwxMTEsMzIsMTE1LDEyMSwxMTUsNzgsOTcsMTA5LDEwMSwwLDAsCisJMTE0LDEwNSwxMDMsMTA0LDExNiwxMTUsMTE5LDEwNSwxMTYsOTksMTA0LDQ1LAorCTAsMCwwLDAsNzgsMTExLDMyLDgyLDY2LDY4LDM5LDExNSwKKwkzMiwxMDUsMTEwLDMyLDExNSwxMDEsMTEwLDEwMCw5NSwxMTUsOTcsMTEyLAorCTEwLDAsMCwwLDc4LDExMSwzMiw4Miw2Niw2OCwzOSwxMTUsCisJMzIsMTA1LDExMCwzMiw3Myw4MCw4OCwxMCwwLDAsMCwwLAorCTg0LDExNCwxMTcsMTEwLDk5LDk3LDExNiwxMDEsMTAwLDMyLDczLDgwLAorCTg4LDEwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJNzcsOTcsMTA4LDEwOCwxMTEsOTksMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwKKwkxMTAsMTE1LDMyLDc4LDg1LDc2LDc2LDMzLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDY4LDEwNSwxMDMsMTA1LAorCTMyLDczLDExMCwxMTYsMTA4LDQ2LDMyLDgyLDEwNSwxMDMsMTA0LDExNiwKKwk4MywxMTksMTA1LDExNiw5OSwxMDQsMzIsODMsNjksNDUsODgsMCwKKwk3MywxMTAsMTE2LDEwMSwxMDgsMzIsNTYsNTAsNTMsNTcsNTQsMCwKKwkwLDAsMCwwLDAsMCwwLDAsOCwyMDYsMCwxMzEsCisJMzYsMjA2LDAsMTMxLDkyLDIwNiwwLDEzMSwxMTIsMjA2LDAsMTMxLAorCTEzMiwyMDYsMCwxMzEsMjIwLDIwNiwwLDEzMSw0LDIwNywwLDEzMSwKKwk0LDIwNywwLDEzMSwzNiwyMDcsMCwxMzEsNTIsMjA3LDAsMTMxLAorCTgwLDIwNywwLDEzMSwxMDQsMjA3LDAsMTMxLDEzMiwyMDcsMCwxMzEsCisJMTYwLDIwNywwLDEzMSwxODgsMjA3LDAsMTMxLDE4OCwyMDcsMCwxMzEsCisJMjE2LDIwNywwLDEzMSwyNDAsMjA3LDAsMTMxLDEyLDIwOCwwLDEzMSwKKwk0MCwyMDgsMCwxMzEsNzIsMjA4LDAsMTMxLDExMiwyMDgsMCwxMzEsCisJMTgwLDIxMCwwLDEzMSwyMzIsMjEwLDAsMTMxLDQsMjExLDAsMTMxLAorCTM2LDIxMSwwLDEzMSw2MCwyMTEsMCwxMzEsMCwwLDAsMCwKKwk2NCwyMTMsMCwxMzEsOTIsMjEzLDAsMTMxLDEyNCwyMTMsMCwxMzEsCisJMTYwLDIxMywwLDEzMSw2MCwyMTQsMCwxMzEsNjAsMjE0LDAsMTMxLAorCTYwLDIxNCwwLDEzMSwxODgsMjEzLDAsMTMxLDIxNiwyMTMsMCwxMzEsCisJMjQ0LDIxMywwLDEzMSwyOCwyMTQsMCwxMzEsMTY4LDIxNCwwLDEzMSwKKwk2MCwyMTQsMCwxMzEsMTY4LDIxNCwwLDEzMSwxNjgsMjE0LDAsMTMxLAorCTg4LDIxNCwwLDEzMSwxMzIsMjE0LDAsMTMxLDAsMCwwLDAsCisJMzYsMjE2LDAsMTMxLDY4LDIxNiwwLDEzMSwxMDQsMjE2LDAsMTMxLAorCTE0MCwyMTYsMCwxMzEsMTQwLDIxNiwwLDEzMSwwLDAsMCwwLAorCTI0OCwyMTcsMCwxMzEsMTIsMjE4LDAsMTMxLDQwLDIxOCwwLDEzMSwKKwk3NiwyMTgsMCwxMzEsMTI0LDIxOCwwLDEzMSwxNTIsMjE4LDAsMTMxLAorCTIwMCwyMTgsMCwxMzEsMjI4LDIxOCwwLDEzMSw4OCwyMTksMCwxMzEsCisJMTE2LDIxOSwwLDEzMSw2NCwyMjQsMCwxMzEsOTIsMjI0LDAsMTMxLAorCTEyNCwyMjQsMCwxMzEsMTUyLDIyNCwwLDEzMSwxODQsMjI0LDAsMTMxLAorCTAsMCwwLDAsMTEwLDExMSwzMiwxMTUsMTIxLDExNSw2NywxMTEsCisJMTEwLDExNiw5Nyw5OSwxMTYsMCwwLDAsMTEwLDExMSwzMiwxMTUsCisJMTIxLDExNSw3OCw5NywxMDksMTAxLDAsMCwxMTAsMTExLDMyLDExNSwKKwkxMjEsMTE1LDc2LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMCwwLAorCTM3LDExNSw1OCwzNywxMDAsNTgsMzIsMTAyLDk3LDEwNSwxMDgsMTAxLAorCTEwMCwzMiw5NywxMTUsMTE1LDEwMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDMyLAorCTk2LDM3LDExNSwzOSwxMCwwLDAsMCwxMTAsMTE3LDEwOSwxMTQsCisJMTAxLDEwMywxMTUsMzIsNjAsNjEsMzIsNzgsODYsODIsNjUsNzcsCisJOTUsNzgsODIsNjksNzEsODMsMzIsMzgsMzgsMzIsMTEwLDExNywKKwkxMDksMTE0LDEwMSwxMDMsMTE1LDMyLDYyLDMyLDQ4LDAsMCwwLAorCTEwMiwxMDUsMTE0LDExNSwxMTYsMTE0LDEwMSwxMDMsMzIsNjAsMzIsNzgsCisJODYsODIsNjUsNzcsOTUsNzgsODIsNjksNzEsODMsMzIsMzgsCisJMzgsMzIsMTAyLDEwNSwxMTQsMTE1LDExNiwxMTQsMTAxLDEwMywzMiw2MiwKKwk2MSwzMiw0OCwwLDAsMCwwLDAsMTAsMTMsNjksODIsCisJODIsNzksODIsMzIsNDUsMCwwLDAsMCwwLDAsMCwKKwkxOTIsMjQ0LDAsMTMxLDgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLAorCTgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLAorCTgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLDE5MiwyNTEsMCwxMzEsCisJOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsMjAwLDI1MSwwLDEzMSwKKwkyMTIsMjUxLDAsMTMxLDIxMiwyNTEsMCwxMzEsMjEyLDI1MSwwLDEzMSwKKwkyMTIsMjUxLDAsMTMxLDIxMiwyNTEsMCwxMzEsMjEyLDI1MSwwLDEzMSwKKwkyMTIsMjUxLDAsMTMxLDIxMiwyNTEsMCwxMzEsMjEyLDI1MSwwLDEzMSwKKwk4LDI1MiwwLDEzMSw4LDI1MiwwLDEzMSw4LDI1MiwwLDEzMSwKKwk4LDI1MiwwLDEzMSw4LDI1MiwwLDEzMSw4LDI1MiwwLDEzMSwKKwk4LDI1MiwwLDEzMSw4LDI1MiwwLDEzMSw4LDI1MiwwLDEzMSwKKwk4LDI1MiwwLDEzMSw4LDI1MiwwLDEzMSwyMDAsMjQ0LDAsMTMxLAorCTgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLAorCTgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLAorCTgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLAorCTgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLAorCTgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLAorCTgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLAorCTIxMiwyNDksMCwxMzEsOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsCisJOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsCisJOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsCisJOCwyNTIsMCwxMzEsMjAsMjQ1LDAsMTMxLDgsMjQ1LDAsMTMxLAorCTg0LDI0NywwLDEzMSw4LDI1MiwwLDEzMSw4LDI1MiwwLDEzMSwKKwk4LDI1MiwwLDEzMSw4LDI1MiwwLDEzMSw4LDI1MiwwLDEzMSwKKwk4LDI1MiwwLDEzMSw4LDI1MiwwLDEzMSwyNDQsMjUxLDAsMTMxLAorCTgsMjUyLDAsMTMxLDgsMjUyLDAsMTMxLDQ4LDI0NiwwLDEzMSwKKwk4LDI1MiwwLDEzMSw4LDI1MiwwLDEzMSw4LDI1MiwwLDEzMSwKKwkyNDAsMjUwLDAsMTMxLDgsMjUyLDAsMTMxLDEzMiwyNDgsMCwxMzEsCisJOCwyNTIsMCwxMzEsOCwyNTIsMCwxMzEsMTYwLDI0OSwwLDEzMSwKKwk3Miw0NiwxLDEzMSwyMjgsNDcsMSwxMzEsMTUyLDQ2LDEsMTMxLAorCTEzMiw0NywxLDEzMSwwLDQ3LDEsMTMxLDIyOCw0NywxLDEzMSwKKwkyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLDIyOCw0NywxLDEzMSwKKwkyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLDIyOCw0NywxLDEzMSwKKwkyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLDIyOCw0NywxLDEzMSwKKwkyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLDIyOCw0NywxLDEzMSwKKwkyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLDIyOCw0NywxLDEzMSwKKwkyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLDIyOCw0NywxLDEzMSwKKwkyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLDIyOCw0NywxLDEzMSwKKwkyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLDIyOCw0NywxLDEzMSwKKwkyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLDIyOCw0NywxLDEzMSwKKwkyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLDIyOCw0NywxLDEzMSwKKwkyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLDIyOCw0NywxLDEzMSwKKwkyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLDIyOCw0NywxLDEzMSwKKwkyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLDIyOCw0NywxLDEzMSwKKwkyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLDIyOCw0NywxLDEzMSwKKwkyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLDIyOCw0NywxLDEzMSwKKwkyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLDIyOCw0NywxLDEzMSwKKwkyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLDIyOCw0NywxLDEzMSwKKwkyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLDIyOCw0NywxLDEzMSwKKwkyMjgsNDcsMSwxMzEsMjI4LDQ3LDEsMTMxLDE0NCw0NywxLDEzMSwKKwkxMDgsNDYsMSwxMzEsMTA4LDQ2LDEsMTMxLDEwOCw0NiwxLDEzMSwKKwkxNTIsNDYsMSwxMzEsMTUyLDQ2LDEsMTMxLDIyOCw0NywxLDEzMSwKKwkxMDgsNDYsMSwxMzEsMjAsNTAsMSwxMzEsMjE2LDUwLDEsMTMxLAorCTU2LDUwLDEsMTMxLDIyNCw1MCwxLDEzMSwxMDQsNTAsMSwxMzEsCisJMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwyMTYsNTAsMSwxMzEsCisJMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwyMTYsNTAsMSwxMzEsCisJMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwyMTYsNTAsMSwxMzEsCisJMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwyMTYsNTAsMSwxMzEsCisJMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwyMTYsNTAsMSwxMzEsCisJMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwyMTYsNTAsMSwxMzEsCisJMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwyMTYsNTAsMSwxMzEsCisJMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwyMTYsNTAsMSwxMzEsCisJMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwyMTYsNTAsMSwxMzEsCisJMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwyMTYsNTAsMSwxMzEsCisJMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwyMTYsNTAsMSwxMzEsCisJMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwyMTYsNTAsMSwxMzEsCisJMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwyMTYsNTAsMSwxMzEsCisJMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwyMTYsNTAsMSwxMzEsCisJMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwyMTYsNTAsMSwxMzEsCisJMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwyMTYsNTAsMSwxMzEsCisJMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwyMTYsNTAsMSwxMzEsCisJMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwyMTYsNTAsMSwxMzEsCisJMjE2LDUwLDEsMTMxLDIxNiw1MCwxLDEzMSwyMTYsNTAsMSwxMzEsCisJMTQ0LDUwLDEsMTMxLDIwLDUwLDEsMTMxLDIwLDUwLDEsMTMxLAorCTIwLDUwLDEsMTMxLDU2LDUwLDEsMTMxLDU2LDUwLDEsMTMxLAorCTIxNiw1MCwxLDEzMSwyMCw1MCwxLDEzMSwxMjQsNTMsMSwxMzEsCisJOTYsNTMsMSwxMzEsOTYsNTMsMSwxMzEsOTYsNTMsMSwxMzEsCisJOTYsNTMsMSwxMzEsOTYsNTMsMSwxMzEsOTYsNTMsMSwxMzEsCisJOTYsNTMsMSwxMzEsOTYsNTMsMSwxMzEsOTYsNTMsMSwxMzEsCisJOTYsNTMsMSwxMzEsOTYsNTMsMSwxMzEsOTYsNTMsMSwxMzEsCisJOTYsNTMsMSwxMzEsODgsNTMsMSwxMzEsNjQsNTMsMSwxMzEsCisJODAsNTMsMSwxMzEsNzIsNTMsMSwxMzEsNjQsNTMsMSwxMzEsCisJMCwwLDAsMCwyOCw4MywxLDEzMSwzNiw4MywxLDEzMSwKKwkzNiw4MywxLDEzMSwzNiw4MywxLDEzMSwzNiw4MywxLDEzMSwKKwkyOCw4MywxLDEzMSw0NCw4MywxLDEzMSw0NCw4MywxLDEzMSwKKwk0NCw4MywxLDEzMSw0NCw4MywxLDEzMSw0NCw4MywxLDEzMSwKKwkyOCw4MywxLDEzMSw0NCw4MywxLDEzMSwwLDAsMCwwLAorCTE5Niw4OCwxLDEzMSwyMzIsODgsMSwxMzEsMjA4LDg4LDEsMTMxLAorCTIyMCw4OCwxLDEzMSwyNDQsODgsMSwxMzEsMCwwLDAsMCwKKwk0LDAsMCwwLDUsMCwwLDAsNiwwLDAsMCwKKwk3LDAsMCwwLDIsMCwwLDAsMywwLDAsMCwKKwkwLDAsMCwwLDEsMCwwLDAsNzIsMzAsMCwxMzEsCisJNzIsMzAsMCwxMzEsMjE2LDQ0LDAsMTMxLDAsMzAsMCwxMzEsCisJMTA4LDMwLDAsMTMxLDEwOCwzMCwwLDEzMSwxMDgsMzAsMCwxMzEsCisJMTA4LDMwLDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMjAsMTM3LDEsMTMxLAorCTIwNCwxMzYsMSwxMzEsMTMyLDEzNiwxLDEzMSw1NiwxMzYsMSwxMzEsCisJMjM2LDEzNSwxLDEzMSwxNzIsMTM1LDEsMTMxLDEyMCwxMzUsMSwxMzEsCisJNTIsMTM1LDEsMTMxLDIzMiwxMzQsMSwxMzEsMTYwLDEzNCwxLDEzMSwKKwk4MCwxMzQsMSwxMzEsOCwxMzQsMSwxMzEsMTg4LDEzMywxLDEzMSwKKwkxMjAsMTMzLDEsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwk3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3MiwKKwk3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3MiwKKwk3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3MiwKKwk3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3MiwKKwk3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3MiwKKwk3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3Miw3MiwKKwk3Miw3Miw3Miw3Miw3MiwwLDAsMCwwLDI1NSw4NSwxNzAsCisJMCwwLDAsMCw0LDAsOCwwLDE2LDAsMzIsMCwKKwk2NCwwLDAsMSwwLDgsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDQsMywyLDEsMCwwLDAsCisJNywwLDAsMCwxLDAsMSwwLDEsMCwyLDAsCisJMjAsMCwxNSwwLDEsMCwwLDEyOCwxMjgsMCwwLDAsCisJMTAwLDAsMCwwLDk2LDIwNywxLDEzMSw5MiwyMDcsMSwxMzEsCisJODgsMjA3LDEsMTMxLDg0LDIwNywxLDEzMSw4MCwyMDcsMSwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDQ4LDQ5LDUwLDUxLAorCTUyLDUzLDU0LDU1LDU2LDU3LDY1LDY2LDY3LDY4LDY5LDcwLAorCTAsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsNjQsMjA0LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJOTYsMTQ4LDEsMTMxLDEsMCw0LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwkyMDAsMTU1LDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSwxMjQsMjA0LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMTY4LDIxMCwxLDEzMSwxLDAsNiwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJNCwxNTYsMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDEzMiwyMDQsMCwxMzEsMTU2LDIwMiwwLDEzMSwKKwk0LDEsMCwxNjMsMSwwLDY3LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwk2NCwxNTYsMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDE2OCwyMDQsMCwxMzEsMjQ4LDIwNCwwLDEzMSwKKwk4MCwxOCwzLDEzMSwxLDAsNCwzLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJMTI0LDE1NiwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsMTY4LDIwNCwwLDEzMSwzMiwyMDUsMCwxMzEsCisJOTYsMTgsMywxMzEsMSwwLDQsMywzMiw0NSwxLDEzMSwKKwkyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLAorCTE4NCwxNTYsMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDE2OCwyMDQsMCwxMzEsNzIsMjA1LDAsMTMxLAorCTExMiwxOCwzLDEzMSwxLDAsNCwzLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJMjQ0LDE1NiwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsMTEyLDIwNSwwLDEzMSwxNTYsMjAyLDAsMTMxLAorCTIsMCwwLDAsMSwwLDIsMSwzMiw0NSwxLDEzMSwKKwkyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLAorCTQ4LDE1NywxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAorCTIyMCwxNTUsMSwxMzEsMiwwLDAsMCwyNCwxNTYsMSwxMzEsCisJMywwLDAsMCw4NCwxNTYsMSwxMzEsNCwwLDAsMCwKKwkxNDQsMTU2LDEsMTMxLDUsMCwwLDAsMjA0LDE1NiwxLDEzMSwKKwk2LDAsMCwwLDgsMTU3LDEsMTMxLDcsMCwwLDAsCisJNjgsMTU3LDEsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsMTIwLDIwNSwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDQ4LDIxMSwxLDEzMSwxLDAsMiwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMTcyLDE1NywxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMiwxLDE4MCwyMDgsMCwxMzEsMTMyLDIwNSwwLDEzMSwKKwkxNjQsMjAyLDAsMTMxLDc2LDIwOSwwLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDEsMCw0LDEsMTgwLDIwOCwwLDEzMSwKKwkxMzIsMjA1LDAsMTMxLDE2NCwyMDIsMCwxMzEsNzYsMjA5LDAsMTMxLAorCTEyNCwxNDgsMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDIsMSwKKwkxODAsMjA4LDAsMTMxLDEzMiwyMDUsMCwxMzEsMTY0LDIwMiwwLDEzMSwKKwk3NiwyMDksMCwxMzEsNiwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMiwxLDE4MCwyMDgsMCwxMzEsMTMyLDIwNSwwLDEzMSwKKwkxNjQsMjAyLDAsMTMxLDc2LDIwOSwwLDEzMSwyMjAsNSwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDY2LDEsMTgwLDIwOCwwLDEzMSwKKwkxMzIsMjA1LDAsMTMxLDE2NCwyMDIsMCwxMzEsNzYsMjA5LDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDQsMSwKKwkxODAsMjA4LDAsMTMxLDEzMiwyMDUsMCwxMzEsMTY0LDIwMiwwLDEzMSwKKwk3NiwyMDksMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMiwzLDE4MCwyMDgsMCwxMzEsMTMyLDIwNSwwLDEzMSwKKwkyMjgsMjA5LDAsMTMxLDc2LDIwOSwwLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDEsMCwyLDEsMTgwLDIwOCwwLDEzMSwKKwkxMzIsMjA1LDAsMTMxLDE2NCwyMDIsMCwxMzEsNzYsMjA5LDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDY3LDEsCisJMTgwLDIwOCwwLDEzMSwxMzIsMjA1LDAsMTMxLDE2NCwyMDIsMCwxMzEsCisJNzYsMjA5LDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDY1LDEsMTgwLDIwOCwwLDEzMSwxMzIsMjA1LDAsMTMxLAorCTE2NCwyMDIsMCwxMzEsNzYsMjA5LDAsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDY1LDEsMTgwLDIwOCwwLDEzMSwKKwkxMzIsMjA1LDAsMTMxLDE2NCwyMDIsMCwxMzEsNzYsMjA5LDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDY1LDEsCisJMTgwLDIwOCwwLDEzMSwxMzIsMjA1LDAsMTMxLDE2NCwyMDIsMCwxMzEsCisJNzYsMjA5LDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDY1LDEsMTgwLDIwOCwwLDEzMSwxMzIsMjA1LDAsMTMxLAorCTE2NCwyMDIsMCwxMzEsNzYsMjA5LDAsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDY1LDEsMTgwLDIwOCwwLDEzMSwKKwkxMzIsMjA1LDAsMTMxLDE2NCwyMDIsMCwxMzEsNzYsMjA5LDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDY1LDEsCisJMTgwLDIwOCwwLDEzMSwxMzIsMjA1LDAsMTMxLDE2NCwyMDIsMCwxMzEsCisJNzYsMjA5LDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDY1LDEsMTgwLDIwOCwwLDEzMSwxMzIsMjA1LDAsMTMxLAorCTE2NCwyMDIsMCwxMzEsNzYsMjA5LDAsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDY1LDEsMTgwLDIwOCwwLDEzMSwKKwkxMzIsMjA1LDAsMTMxLDE2NCwyMDIsMCwxMzEsNzYsMjA5LDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDY1LDEsCisJMTgwLDIwOCwwLDEzMSwxMzIsMjA1LDAsMTMxLDE2NCwyMDIsMCwxMzEsCisJNzYsMjA5LDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDY1LDEsMTgwLDIwOCwwLDEzMSwxMzIsMjA1LDAsMTMxLAorCTE2NCwyMDIsMCwxMzEsNzYsMjA5LDAsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDY1LDEsMTgwLDIwOCwwLDEzMSwKKwkxMzIsMjA1LDAsMTMxLDE2NCwyMDIsMCwxMzEsNzYsMjA5LDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDY2LDEsCisJMTgwLDIwOCwwLDEzMSwxMzIsMjA1LDAsMTMxLDE2NCwyMDIsMCwxMzEsCisJNzYsMjA5LDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDYsMSwxODAsMjA4LDAsMTMxLDEzMiwyMDUsMCwxMzEsCisJMTY0LDIwMiwwLDEzMSw3NiwyMDksMCwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsMCwwLDIzMiwxNTcsMSwxMzEsCisJMiwwLDAsMCwxNiwxNTgsMSwxMzEsMywwLDAsMCwKKwk1NiwxNTgsMSwxMzEsNCwwLDAsMCw5NiwxNTgsMSwxMzEsCisJNSwwLDAsMCwxMzYsMTU4LDEsMTMxLDYsMCwwLDAsCisJMTc2LDE1OCwxLDEzMSw3LDAsMCwwLDIxNiwxNTgsMSwxMzEsCisJOCwwLDAsMCwwLDE1OSwxLDEzMSw5LDAsMCwwLAorCTQwLDE1OSwxLDEzMSwxMCwwLDAsMCw4MCwxNTksMSwxMzEsCisJMTEsMCwwLDAsMTIwLDE1OSwxLDEzMSwxMiwwLDAsMCwKKwkxNjAsMTU5LDEsMTMxLDEzLDAsMCwwLDIwMCwxNTksMSwxMzEsCisJMTQsMCwwLDAsMjQwLDE1OSwxLDEzMSwxNSwwLDAsMCwKKwkyNCwxNjAsMSwxMzEsMTYsMCwwLDAsNjQsMTYwLDEsMTMxLAorCTE3LDAsMCwwLDEwNCwxNjAsMSwxMzEsMTgsMCwwLDAsCisJMTQ0LDE2MCwxLDEzMSwxOSwwLDAsMCwxODQsMTYwLDEsMTMxLAorCTIwLDAsMCwwLDIyNCwxNjAsMSwxMzEsMjEsMCwwLDAsCisJOCwxNjEsMSwxMzEsMjIsMCwwLDAsNDgsMTYxLDEsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAorCTMyLDIwOCwxLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJMSwwLDAsMCwxOTIsMTU3LDEsMTMxLDIsMCwwLDAsCisJNDAsMjA4LDEsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsMTEyLDIwNSwwLDEzMSwKKwk2MCwyMTAsMCwxMzEsMiwwLDAsMCwxLDAsMiwzLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsNTYsMTYyLDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSwxMjAsMjA1LDAsMTMxLAorCTYwLDIxMCwwLDEzMSwwLDE3LDMsMTMxLDEsMCwyLDMsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxMTYsMTYyLDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSw0LDE3LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMTc2LDE2MiwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsOCwxNywzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDIzNiwxNjIsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDEyLDE3LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsNDAsMTYzLDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwxNiwxNywzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDEwMCwxNjMsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDIwLDE3LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMTYwLDE2MywxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMjQsMTcsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwyMjAsMTYzLDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwyOCwxNywzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDI0LDE2NCwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMzIsMTcsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSw4NCwxNjQsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDM2LDE3LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMTQ0LDE2NCwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsNDAsMTcsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwyMDQsMTY0LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSwxMjAsMjA1LDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsNDQsMTcsMywxMzEsMSwwLDIsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDgsMTY1LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSw0OCwxNywzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDY4LDE2NSwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsNTIsMTcsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxMjgsMTY1LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSw1NiwxNywzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDE4OCwxNjUsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDYwLDE3LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMjQ4LDE2NSwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsNjQsMTcsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSw1MiwxNjYsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDY4LDE3LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMTEyLDE2NiwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsNjQsMSw0NCwyMDIsMCwxMzEsODgsMjEwLDAsMTMxLAorCTE2NCwyMDIsMCwxMzEsMTIwLDIxMSwwLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDEsMCwyLDEsNDQsMjAyLDAsMTMxLAorCTg4LDIxMCwwLDEzMSwxNjQsMjAyLDAsMTMxLDEyMCwyMTEsMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsNjQsMSwKKwk0NCwyMDIsMCwxMzEsODgsMjEwLDAsMTMxLDE2NCwyMDIsMCwxMzEsCisJMTIwLDIxMSwwLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTEsMCwyLDEsNDQsMjAyLDAsMTMxLDg4LDIxMCwwLDEzMSwKKwkxNjQsMjAyLDAsMTMxLDEyMCwyMTEsMCwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsMiwxLDQ0LDIwMiwwLDEzMSwKKwk4OCwyMTAsMCwxMzEsMTY0LDIwMiwwLDEzMSwxMjAsMjExLDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKKwkxNzIsMTY2LDEsMTMxLDIsMCwwLDAsMjEyLDE2NiwxLDEzMSwKKwkzLDAsMCwwLDI1MiwxNjYsMSwxMzEsNCwwLDAsMCwKKwkzNiwxNjcsMSwxMzEsNSwwLDAsMCw3NiwxNjcsMSwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisJNTYsMjA4LDEsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkxLDAsNjQsMyw4NCwyMTIsMCwxMzEsMTYsMjEyLDAsMTMxLAorCTUyLDIxMiwwLDEzMSwxNzIsMjEyLDAsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDIsMyw4NCwyMTIsMCwxMzEsCisJMTYsMjEyLDAsMTMxLDUyLDIxMiwwLDEzMSwxNzIsMjEyLDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDIsMywKKwk4NCwyMTIsMCwxMzEsMTYsMjEyLDAsMTMxLDUyLDIxMiwwLDEzMSwKKwkxNzIsMjEyLDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDIsMyw4NCwyMTIsMCwxMzEsMTYsMjEyLDAsMTMxLAorCTUyLDIxMiwwLDEzMSwxNzIsMjEyLDAsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDIsMyw4NCwyMTIsMCwxMzEsCisJMTYsMjEyLDAsMTMxLDUyLDIxMiwwLDEzMSwxNzIsMjEyLDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDIsMywKKwk4NCwyMTIsMCwxMzEsMTYsMjEyLDAsMTMxLDUyLDIxMiwwLDEzMSwKKwkxNzIsMjEyLDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDY0LDMsODQsMjEyLDAsMTMxLDE2LDIxMiwwLDEzMSwKKwk1MiwyMTIsMCwxMzEsMTcyLDIxMiwwLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDEsMCwyLDMsODQsMjEyLDAsMTMxLAorCTE2LDIxMiwwLDEzMSw1MiwyMTIsMCwxMzEsMTcyLDIxMiwwLDEzMSwKKwkwLDAsMCwwLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDEsMCwyLDEsCisJODQsMjEyLDAsMTMxLDE2LDIxMiwwLDEzMSwxNjQsMjAyLDAsMTMxLAorCTE3MiwyMTIsMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMiwzLDg0LDIxMiwwLDEzMSwxNiwyMTIsMCwxMzEsCisJNTIsMjEyLDAsMTMxLDE3MiwyMTIsMCwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsNjQsMyw4NCwyMTIsMCwxMzEsCisJMTYsMjEyLDAsMTMxLDUyLDIxMiwwLDEzMSwxNzIsMjEyLDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDIsMywKKwk4NCwyMTIsMCwxMzEsMTYsMjEyLDAsMTMxLDUyLDIxMiwwLDEzMSwKKwkxNzIsMjEyLDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDYsMSw4NCwyMTIsMCwxMzEsMTYsMjEyLDAsMTMxLAorCTE2NCwyMDIsMCwxMzEsMTcyLDIxMiwwLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDEsMCwwLDAsMTgwLDE2NywxLDEzMSwKKwkyLDAsMCwwLDIyMCwxNjcsMSwxMzEsMywwLDAsMCwKKwk0LDE2OCwxLDEzMSw0LDAsMCwwLDQ0LDE2OCwxLDEzMSwKKwk1LDAsMCwwLDg0LDE2OCwxLDEzMSw2LDAsMCwwLAorCTEyNCwxNjgsMSwxMzEsNywwLDAsMCwxNjQsMTY4LDEsMTMxLAorCTgsMCwwLDAsMjA0LDE2OCwxLDEzMSw5LDAsMCwwLAorCTI0NCwxNjgsMSwxMzEsMTAsMCwwLDAsMjgsMTY5LDEsMTMxLAorCTExLDAsMCwwLDY4LDE2OSwxLDEzMSwxMiwwLDAsMCwKKwkxMDgsMTY5LDEsMTMxLDEzLDAsMCwwLDE0OCwxNjksMSwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisJNzIsMjA4LDEsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMiwzLDg0LDIxMiwwLDEzMSwxNiwyMTIsMCwxMzEsCisJNTIsMjEyLDAsMTMxLDE3MiwyMTIsMCwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsNCwzLDg0LDIxMiwwLDEzMSwKKwkxNiwyMTIsMCwxMzEsNTIsMjEyLDAsMTMxLDE3MiwyMTIsMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsNjQsMywKKwk4NCwyMTIsMCwxMzEsMTYsMjEyLDAsMTMxLDUyLDIxMiwwLDEzMSwKKwkxNzIsMjEyLDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDIsMyw4NCwyMTIsMCwxMzEsMTYsMjEyLDAsMTMxLAorCTUyLDIxMiwwLDEzMSwxNzIsMjEyLDAsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDAsMCw2MCwxNzAsMSwxMzEsCisJMiwwLDAsMCwxMDAsMTcwLDEsMTMxLDMsMCwwLDAsCisJMTQwLDE3MCwxLDEzMSw0LDAsMCwwLDE4MCwxNzAsMSwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisJODgsMjA4LDEsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsNzIsMTcsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwyMCwxNzEsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDAsMCw3NiwxNjIsMSwxMzEsMiwwLDAsMCwKKwkxMzYsMTYyLDEsMTMxLDMsMCwwLDAsMTk2LDE2MiwxLDEzMSwKKwk0LDAsMCwwLDAsMTYzLDEsMTMxLDUsMCwwLDAsCisJNjAsMTYzLDEsMTMxLDYsMCwwLDAsMTIwLDE2MywxLDEzMSwKKwk3LDAsMCwwLDE4MCwxNjMsMSwxMzEsOCwwLDAsMCwKKwkyNDAsMTYzLDEsMTMxLDksMCwwLDAsNDQsMTY0LDEsMTMxLAorCTEwLDAsMCwwLDEwNCwxNjQsMSwxMzEsMTEsMCwwLDAsCisJMTY0LDE2NCwxLDEzMSwxMiwwLDAsMCwyMjQsMTY0LDEsMTMxLAorCTEzLDAsMCwwLDI4LDE2NSwxLDEzMSwxNCwwLDAsMCwKKwk4OCwxNjUsMSwxMzEsMTUsMCwwLDAsMTQ4LDE2NSwxLDEzMSwKKwkxNiwwLDAsMCwyMDgsMTY1LDEsMTMxLDE3LDAsMCwwLAorCTEyLDE2NiwxLDEzMSwxOCwwLDAsMCw3MiwxNjYsMSwxMzEsCisJMTksMCwwLDAsMTMyLDE2NiwxLDEzMSwyMCwwLDAsMCwKKwk2NCwyMDgsMSwxMzEsMjEsMCwwLDAsODAsMjA4LDEsMTMxLAorCTIyLDAsMCwwLDk2LDIwOCwxLDEzMSwyMywwLDAsMCwKKwk0MCwxNzEsMSwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwxNDQsMTYsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxNiwxNzIsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDE0OCwxNiwzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDc2LDE3MiwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMTUyLDE2LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMTM2LDE3MiwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMTU2LDE2LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMTk2LDE3MiwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMTYwLDE2LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMCwxNzMsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDE2NCwxNiwzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDYwLDE3MywxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMTY4LDE2LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMTIwLDE3MywxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMTcyLDE2LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMTgwLDE3MywxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMTc2LDE2LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMjQwLDE3MywxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMTgwLDE2LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsNDQsMTc0LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwxODQsMTYsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxMDQsMTc0LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwxODgsMTYsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwxNjQsMTc0LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwxOTIsMTYsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwyMjQsMTc0LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwxOTYsMTYsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSwyOCwxNzUsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDIwMCwxNiwzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDg4LDE3NSwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMjA0LDE2LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMTQ4LDE3NSwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMjA4LDE2LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMjA4LDE3NSwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMjEyLDE2LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMTIsMTc2LDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSw3NiwyMTAsMCwxMzEsCisJMTU2LDIwMiwwLDEzMSwyMTYsMTYsMywxMzEsMSwwLDY1LDEsCisJMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwKKwkyMCw0OCwxLDEzMSw3MiwxNzYsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDIyMCwxNiwzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDEzMiwxNzYsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDIyNCwxNiwzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDE5MiwxNzYsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDIyOCwxNiwzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDI1MiwxNzYsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDIzMiwxNiwzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDU2LDE3NywxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMjM2LDE2LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMTE2LDE3NywxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMjQwLDE2LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMTc2LDE3NywxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMjQ0LDE2LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMjM2LDE3NywxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMCwwLDM2LDE3MiwxLDEzMSwyLDAsMCwwLAorCTk2LDE3MiwxLDEzMSwzLDAsMCwwLDE1NiwxNzIsMSwxMzEsCisJNCwwLDAsMCwyMTYsMTcyLDEsMTMxLDUsMCwwLDAsCisJMjAsMTczLDEsMTMxLDYsMCwwLDAsODAsMTczLDEsMTMxLAorCTcsMCwwLDAsMTQwLDE3MywxLDEzMSw4LDAsMCwwLAorCTIwMCwxNzMsMSwxMzEsOSwwLDAsMCw0LDE3NCwxLDEzMSwKKwkxMCwwLDAsMCw2NCwxNzQsMSwxMzEsMTEsMCwwLDAsCisJMTI0LDE3NCwxLDEzMSwxMiwwLDAsMCwxODQsMTc0LDEsMTMxLAorCTEzLDAsMCwwLDI0NCwxNzQsMSwxMzEsMTQsMCwwLDAsCisJNDgsMTc1LDEsMTMxLDE1LDAsMCwwLDEwOCwxNzUsMSwxMzEsCisJMTYsMCwwLDAsMTY4LDE3NSwxLDEzMSwxNywwLDAsMCwKKwkyMjgsMTc1LDEsMTMxLDE4LDAsMCwwLDMyLDE3NiwxLDEzMSwKKwkxOSwwLDAsMCw5MiwxNzYsMSwxMzEsMjAsMCwwLDAsCisJMTUyLDE3NiwxLDEzMSwyMSwwLDAsMCwyMTIsMTc2LDEsMTMxLAorCTIyLDAsMCwwLDE2LDE3NywxLDEzMSwyMywwLDAsMCwKKwk3NiwxNzcsMSwxMzEsMjQsMCwwLDAsMTM2LDE3NywxLDEzMSwKKwkyNSwwLDAsMCwxOTYsMTc3LDEsMTMxLDI2LDAsMCwwLAorCTAsMTc4LDEsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMTEyLDE3LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMCwxNzksMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDExNiwxNywzLDEzMSwxLDAsNjUsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDYwLDE3OSwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMTIwLDE3LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMTIwLDE3OSwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsNzYsMjEwLDAsMTMxLAorCTE1NiwyMDIsMCwxMzEsMTI0LDE3LDMsMTMxLDEsMCw2NSwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMTgwLDE3OSwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsMjAwLDIxMiwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDIyMCw1LDAsMTYzLDEsMCw2NCwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMjQwLDE3OSwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsMTEyLDIwNSwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDE2MSwwLDAsMCwxLDAsMiwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsNDQsMTgwLDEsMTMxLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTEsMCwwLDAsNCwxODAsMSwxMzEsMiwwLDAsMCwKKwk2NCwxODAsMSwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTEsMCwwLDAsMTIwLDIwOCwxLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMSwwLDAsMCwyMCwxNzksMSwxMzEsCisJMiwwLDAsMCw4MCwxNzksMSwxMzEsMywwLDAsMCwKKwkxNDAsMTc5LDEsMTMxLDQsMCwwLDAsMjAwLDE3OSwxLDEzMSwKKwk1LDAsMCwwLDEyOCwyMDgsMSwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDEsMCwyLDEsNDQsMjAyLDAsMTMxLAorCTIwOCwyMTIsMCwxMzEsMTY0LDIwMiwwLDEzMSwxOTYsMjE0LDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDY1LDEsCisJNDQsMjAyLDAsMTMxLDIwOCwyMTIsMCwxMzEsMTY0LDIwMiwwLDEzMSwKKwkxOTYsMjE0LDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDY1LDEsNDQsMjAyLDAsMTMxLDIwOCwyMTIsMCwxMzEsCisJMTY0LDIwMiwwLDEzMSwxOTYsMjE0LDAsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDY1LDEsNDQsMjAyLDAsMTMxLAorCTIwOCwyMTIsMCwxMzEsMTY0LDIwMiwwLDEzMSwxOTYsMjE0LDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDY1LDEsCisJNDQsMjAyLDAsMTMxLDIwOCwyMTIsMCwxMzEsMTY0LDIwMiwwLDEzMSwKKwkxOTYsMjE0LDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDY1LDEsNDQsMjAyLDAsMTMxLDIwOCwyMTIsMCwxMzEsCisJMTY0LDIwMiwwLDEzMSwxOTYsMjE0LDAsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDY1LDEsNDQsMjAyLDAsMTMxLAorCTIwOCwyMTIsMCwxMzEsMTY0LDIwMiwwLDEzMSwxOTYsMjE0LDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDY1LDEsCisJNDQsMjAyLDAsMTMxLDIwOCwyMTIsMCwxMzEsMTY0LDIwMiwwLDEzMSwKKwkxOTYsMjE0LDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDY1LDEsNDQsMjAyLDAsMTMxLDIwOCwyMTIsMCwxMzEsCisJMTY0LDIwMiwwLDEzMSwxOTYsMjE0LDAsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDY1LDEsNDQsMjAyLDAsMTMxLAorCTIwOCwyMTIsMCwxMzEsMTY0LDIwMiwwLDEzMSwxOTYsMjE0LDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDY1LDEsCisJNDQsMjAyLDAsMTMxLDIwOCwyMTIsMCwxMzEsMTY0LDIwMiwwLDEzMSwKKwkxOTYsMjE0LDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDY1LDEsNDQsMjAyLDAsMTMxLDIwOCwyMTIsMCwxMzEsCisJMTY0LDIwMiwwLDEzMSwxOTYsMjE0LDAsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDY1LDEsNDQsMjAyLDAsMTMxLAorCTIwOCwyMTIsMCwxMzEsMTY0LDIwMiwwLDEzMSwxOTYsMjE0LDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDYsMSwKKwk0NCwyMDIsMCwxMzEsMjA4LDIxMiwwLDEzMSwxNjQsMjAyLDAsMTMxLAorCTE5NiwyMTQsMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMCwwLDE5MiwxODAsMSwxMzEsMiwwLDAsMCwKKwkyMzIsMTgwLDEsMTMxLDMsMCwwLDAsMTYsMTgxLDEsMTMxLAorCTQsMCwwLDAsNTYsMTgxLDEsMTMxLDUsMCwwLDAsCisJOTYsMTgxLDEsMTMxLDYsMCwwLDAsMTM2LDE4MSwxLDEzMSwKKwk3LDAsMCwwLDE3NiwxODEsMSwxMzEsOCwwLDAsMCwKKwkyMTYsMTgxLDEsMTMxLDksMCwwLDAsMCwxODIsMSwxMzEsCisJMTAsMCwwLDAsNDAsMTgyLDEsMTMxLDExLDAsMCwwLAorCTgwLDE4MiwxLDEzMSwxMywwLDAsMCwxMjAsMTgyLDEsMTMxLAorCTE2LDAsMCwwLDE2MCwxODIsMSwxMzEsMTcsMCwwLDAsCisJMjAwLDE4MiwxLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJMSwwLDAsMCwxNDQsMjA4LDEsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisJMTYwLDIwOCwxLDEzMSwyLDAsMCwwLDE2OCwyMDgsMSwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMSwwLDAsMCwxODQsMjA4LDEsMTMxLDIsMCwwLDAsCisJMTkyLDIwOCwxLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMSwwLDAsMCwyMDgsMjA4LDEsMTMxLDIsMCwwLDAsCisJMjE2LDIwOCwxLDEzMSwzLDAsMCwwLDIyNCwyMDgsMSwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMSwwLDAsMCwyNDAsMjA4LDEsMTMxLDIsMCwwLDAsCisJMjQ4LDIwOCwxLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisJOCwyMDksMSwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMSwwLDAsMCwyNCwyMDksMSwxMzEsCisJMiwwLDAsMCwzMiwyMDksMSwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMCwwLDQ4LDIwOSwxLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTEsMCwwLDAsNjQsMjA5LDEsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwxLDAsMCwwLDIzMiwyMDgsMSwxMzEsCisJMiwwLDAsMCwwLDIwOSwxLDEzMSwzLDAsMCwwLAorCTE2LDIwOSwxLDEzMSw0LDAsMCwwLDQwLDIwOSwxLDEzMSwKKwk1LDAsMCwwLDU2LDIwOSwxLDEzMSw2LDAsMCwwLAorCTcyLDIwOSwxLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJMiwwLDAsMCwxNTIsMjA4LDEsMTMxLDYsMCwwLDAsCisJMTc2LDIwOCwxLDEzMSw3LDAsMCwwLDIwMCwyMDgsMSwxMzEsCisJOCwwLDAsMCw4MCwyMDksMSwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDcsMCwwLDAsODgsMjA5LDEsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsOTIsMjE1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMTI4LDE3LDMsMTMxLDEsMCw2NSwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJOCwxODUsMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDkyLDIxNSwwLDEzMSwxNTYsMjAyLDAsMTMxLAorCTE0NCwxNywzLDEzMSwxLDAsNjUsMSwzMiw0NSwxLDEzMSwKKwkyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLAorCTY4LDE4NSwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsOTIsMjE1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMTQ4LDE3LDMsMTMxLDEsMCw2NSwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJMTI4LDE4NSwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsOTIsMjE1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMTMyLDE3LDMsMTMxLDEsMCw2NSwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJMTg4LDE4NSwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsOTIsMjE1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMTM2LDE3LDMsMTMxLDEsMCw2NSwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJMjQ4LDE4NSwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsOTIsMjE1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMTQwLDE3LDMsMTMxLDEsMCw2NSwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJNTIsMTg2LDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSw5MiwyMTUsMCwxMzEsMTU2LDIwMiwwLDEzMSwKKwkxNTYsMTcsMywxMzEsMSwwLDY1LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwkxMTIsMTg2LDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSw5MiwyMTUsMCwxMzEsMTU2LDIwMiwwLDEzMSwKKwkxNjAsMTcsMywxMzEsMSwwLDY1LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwkxNzIsMTg2LDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSw5MiwyMTUsMCwxMzEsMTU2LDIwMiwwLDEzMSwKKwkxNjQsMTcsMywxMzEsMSwwLDY1LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwkyMzIsMTg2LDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSw5MiwyMTUsMCwxMzEsMTU2LDIwMiwwLDEzMSwKKwkxNjgsMTcsMywxMzEsMSwwLDY1LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwkzNiwxODcsMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDkyLDIxNSwwLDEzMSwxNTYsMjAyLDAsMTMxLAorCTE3MiwxNywzLDEzMSwxLDAsNjUsMSwzMiw0NSwxLDEzMSwKKwkyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLAorCTk2LDE4NywxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsOTIsMjE1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMTc2LDE3LDMsMTMxLDEsMCw2NSwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJMTU2LDE4NywxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsOTIsMjE1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMTgwLDE3LDMsMTMxLDEsMCw2NSwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJMjE2LDE4NywxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsOTIsMjE1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMTg0LDE3LDMsMTMxLDEsMCw2NSwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJMjAsMTg4LDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSw5MiwyMTUsMCwxMzEsMTU2LDIwMiwwLDEzMSwKKwkxODgsMTcsMywxMzEsMSwwLDY1LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwk4MCwxODgsMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDkyLDIxNSwwLDEzMSwxNTYsMjAyLDAsMTMxLAorCTE5MiwxNywzLDEzMSwxLDAsNjUsMSwzMiw0NSwxLDEzMSwKKwkyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLAorCTE0MCwxODgsMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDkyLDIxNSwwLDEzMSwxNTYsMjAyLDAsMTMxLAorCTE5NiwxNywzLDEzMSwxLDAsNjUsMSwzMiw0NSwxLDEzMSwKKwkyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLAorCTIwMCwxODgsMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDkyLDIxNSwwLDEzMSwxNTYsMjAyLDAsMTMxLAorCTIwMCwxNywzLDEzMSwxLDAsNjUsMSwzMiw0NSwxLDEzMSwKKwkyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLAorCTQsMTg5LDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSw5MiwyMTUsMCwxMzEsMTU2LDIwMiwwLDEzMSwKKwkyMDQsMTcsMywxMzEsMSwwLDY1LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwk2NCwxODksMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDkyLDIxNSwwLDEzMSwxNTYsMjAyLDAsMTMxLAorCTIwOCwxNywzLDEzMSwxLDAsNjUsMSwzMiw0NSwxLDEzMSwKKwkyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLAorCTEyNCwxODksMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDkyLDIxNSwwLDEzMSwxNTYsMjAyLDAsMTMxLAorCTIxMiwxNywzLDEzMSwxLDAsNjUsMSwzMiw0NSwxLDEzMSwKKwkyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLAorCTE4NCwxODksMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDkyLDIxNSwwLDEzMSwxNTYsMjAyLDAsMTMxLAorCTIyMCwxNywzLDEzMSwxLDAsNjUsMSwzMiw0NSwxLDEzMSwKKwkyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLAorCTI0NCwxODksMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDkyLDIxNSwwLDEzMSwxNTYsMjAyLDAsMTMxLAorCTIyNCwxNywzLDEzMSwxLDAsNjUsMSwzMiw0NSwxLDEzMSwKKwkyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLAorCTQ4LDE5MCwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsOTIsMjE1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMjI4LDE3LDMsMTMxLDEsMCw2NSwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJMTA4LDE5MCwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsOTIsMjE1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMjMyLDE3LDMsMTMxLDEsMCw2NSwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJMTY4LDE5MCwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsOTIsMjE1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMjM2LDE3LDMsMTMxLDEsMCw2NSwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJMjI4LDE5MCwxLDEzMSwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCw4LDIwMiwwLDEzMSwKKwkxNDgsMzgsMSwxMzEsOTIsMjE1LDAsMTMxLDE1NiwyMDIsMCwxMzEsCisJMjQwLDE3LDMsMTMxLDEsMCw2NSwxLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJMzIsMTkxLDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDgsMjAyLDAsMTMxLAorCTE0OCwzOCwxLDEzMSwxMDQsMjE1LDAsMTMxLDE0MCwyMTUsMCwxMzEsCisJMCwwLDAsMCwxLDAsMiwzLDMyLDQ1LDEsMTMxLAorCTIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsCisJOTIsMTkxLDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisJMjgsMTg1LDEsMTMxLDIsMCwwLDAsODgsMTg1LDEsMTMxLAorCTMsMCwwLDAsMTQ4LDE4NSwxLDEzMSw0LDAsMCwwLAorCTIwOCwxODUsMSwxMzEsNSwwLDAsMCwxMiwxODYsMSwxMzEsCisJNiwwLDAsMCw3MiwxODYsMSwxMzEsOCwwLDAsMCwKKwkxMzIsMTg2LDEsMTMxLDksMCwwLDAsMTkyLDE4NiwxLDEzMSwKKwkxMCwwLDAsMCwyNTIsMTg2LDEsMTMxLDExLDAsMCwwLAorCTU2LDE4NywxLDEzMSwxMiwwLDAsMCwxMTYsMTg3LDEsMTMxLAorCTEzLDAsMCwwLDE3NiwxODcsMSwxMzEsMTQsMCwwLDAsCisJMjM2LDE4NywxLDEzMSwxNSwwLDAsMCw0MCwxODgsMSwxMzEsCisJMTYsMCwwLDAsMTAwLDE4OCwxLDEzMSwxNywwLDAsMCwKKwkxNjAsMTg4LDEsMTMxLDE4LDAsMCwwLDIyMCwxODgsMSwxMzEsCisJMTksMCwwLDAsMjQsMTg5LDEsMTMxLDIwLDAsMCwwLAorCTg0LDE4OSwxLDEzMSwyMSwwLDAsMCwxNDQsMTg5LDEsMTMxLAorCTIyLDAsMCwwLDIwNCwxODksMSwxMzEsMjQsMCwwLDAsCisJOCwxOTAsMSwxMzEsMjUsMCwwLDAsNjgsMTkwLDEsMTMxLAorCTI2LDAsMCwwLDEyOCwxOTAsMSwxMzEsMjcsMCwwLDAsCisJMTg4LDE5MCwxLDEzMSwyOCwwLDAsMCwyNDgsMTkwLDEsMTMxLAorCTI5LDAsMCwwLDUyLDE5MSwxLDEzMSwzMCwwLDAsMCwKKwkxMTIsMTkxLDEsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsMTgwLDIxNSwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDIxOCwxMiwzLDEzMSwxLDAsNCwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMTI4LDE5MiwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsMTIwLDIwNSwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDQwLDIxMSwxLDEzMSwxLDAsMiwxLAorCTMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwxNjAsNDksMSwxMzEsCisJMjAsNDgsMSwxMzEsMTg4LDE5MiwxLDEzMSwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwk4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsMTEyLDIwNSwwLDEzMSwKKwkxNTYsMjAyLDAsMTMxLDIsMCwwLDAsMSwwLDIsMSwKKwkzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsMTYwLDQ5LDEsMTMxLAorCTIwLDQ4LDEsMTMxLDI0OCwxOTIsMSwxMzEsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDIsMSw0NCwyMDIsMCwxMzEsMjAwLDIxNSwwLDEzMSwKKwkxNjQsMjAyLDAsMTMxLDE5NiwyMTYsMCwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsMiwxLDQ0LDIwMiwwLDEzMSwKKwkyMDAsMjE1LDAsMTMxLDE2NCwyMDIsMCwxMzEsMTk2LDIxNiwwLDEzMSwKKwkwLDAsMCwwLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDEsMCw2LDEsCisJNDQsMjAyLDAsMTMxLDIwMCwyMTUsMCwxMzEsMTY0LDIwMiwwLDEzMSwKKwkxOTYsMjE2LDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDY1LDEsNDQsMjAyLDAsMTMxLDIwMCwyMTUsMCwxMzEsCisJMTY0LDIwMiwwLDEzMSwxOTYsMjE2LDAsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDY1LDEsNDQsMjAyLDAsMTMxLAorCTIwMCwyMTUsMCwxMzEsMTY0LDIwMiwwLDEzMSwxOTYsMjE2LDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKKwk1MiwxOTMsMSwxMzEsMiwwLDAsMCw5MiwxOTMsMSwxMzEsCisJMywwLDAsMCwxMzIsMTkzLDEsMTMxLDQsMCwwLDAsCisJMTcyLDE5MywxLDEzMSw1LDAsMCwwLDIxMiwxOTMsMSwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisJMTEyLDIwOSwxLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJMSwwLDAsMCwxNDgsMTkyLDEsMTMxLDIsMCwwLDAsCisJMjA4LDE5MiwxLDEzMSwzLDAsMCwwLDEyLDE5MywxLDEzMSwKKwk0LDAsMCwwLDEyMCwyMDksMSwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSwKKwkxMTIsMjA1LDAsMTMxLDE1NiwyMDIsMCwxMzEsMywwLDAsMCwKKwkxLDAsMiwxLDMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwKKwkxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsMTAwLDE5NCwxLDEzMSwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCw4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsCisJOTIsMjE3LDAsMTMxLDYwLDIxMCwwLDEzMSwyMTYsMTIsMywxMzEsCisJMSwwLDIsMywzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsCisJMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLDE2MCwxOTQsMSwxMzEsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLAorCTEwNCwyMTcsMCwxMzEsMTU2LDIwMiwwLDEzMSwwLDAsMCwwLAorCTEsMCw2NywxLDMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwKKwkxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsMjIwLDE5NCwxLDEzMSwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCw4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsCisJMTA0LDIxNywwLDEzMSwxNTYsMjAyLDAsMTMxLDAsMCwwLDAsCisJMSwwLDY1LDEsMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLAorCTE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwyNCwxOTUsMSwxMzEsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLAorCTExMiwyMTcsMCwxMzEsMTU2LDIwMiwwLDEzMSwyMTYsMTIsMywxMzEsCisJMSwwLDQsMSwzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsCisJMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLDg0LDE5NSwxLDEzMSwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCw4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsCisJMTIwLDIwNSwwLDEzMSwxNTYsMjAyLDAsMTMxLDIyNCwxMiwzLDEzMSwKKwkxLDAsMiwxLDMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwKKwkxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsMTQ0LDE5NSwxLDEzMSwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCw4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsCisJMTIwLDIwNSwwLDEzMSwxNTYsMjAyLDAsMTMxLDIyOCwxMiwzLDEzMSwKKwkxLDAsMiwxLDMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwKKwkxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsMjA0LDE5NSwxLDEzMSwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCw4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsCisJOTIsMjE3LDAsMTMxLDE1NiwyMDIsMCwxMzEsMjMyLDEyLDMsMTMxLAorCTEsMCwyLDEsMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLAorCTE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSw4LDE5NiwxLDEzMSwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCw4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsCisJOTIsMjE3LDAsMTMxLDE1NiwyMDIsMCwxMzEsMjM0LDEyLDMsMTMxLAorCTEsMCwyLDEsMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLAorCTE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSw2OCwxOTYsMSwxMzEsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsOCwyMDIsMCwxMzEsMTQ4LDM4LDEsMTMxLAorCTkyLDIxNywwLDEzMSwxNTYsMjAyLDAsMTMxLDI0NiwxMiwzLDEzMSwKKwkxLDAsMiwxLDMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwKKwkxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsMTI4LDE5NiwxLDEzMSwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCw4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsCisJOTIsMjE3LDAsMTMxLDE1NiwyMDIsMCwxMzEsMjM2LDEyLDMsMTMxLAorCTEsMCwyLDEsMzIsNDUsMSwxMzEsMjA4LDQ4LDEsMTMxLAorCTE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwxODgsMTk2LDEsMTMxLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDgsMjAyLDAsMTMxLDE0OCwzOCwxLDEzMSwKKwk5MiwyMTcsMCwxMzEsNjAsMjEwLDAsMTMxLDIzOCwxMiwzLDEzMSwKKwkxLDAsMiwzLDMyLDQ1LDEsMTMxLDIwOCw0OCwxLDEzMSwKKwkxNjAsNDksMSwxMzEsMjAsNDgsMSwxMzEsMjQ4LDE5NiwxLDEzMSwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCw4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsCisJOTIsMjE3LDAsMTMxLDYwLDIxMCwwLDEzMSwyNDAsMTIsMywxMzEsCisJMSwwLDIsMywzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsCisJMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLDUyLDE5NywxLDEzMSwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCw4LDIwMiwwLDEzMSwxNDgsMzgsMSwxMzEsCisJOTIsMjE3LDAsMTMxLDYwLDIxMCwwLDEzMSwyNDIsMTIsMywxMzEsCisJMSwwLDIsMywzMiw0NSwxLDEzMSwyMDgsNDgsMSwxMzEsCisJMTYwLDQ5LDEsMTMxLDIwLDQ4LDEsMTMxLDExMiwxOTcsMSwxMzEsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDIsMSwxODAsMjE5LDAsMTMxLAorCTEzMiwyMTcsMCwxMzEsMTY0LDIwMiwwLDEzMSwxMDQsMjIwLDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDIsMywKKwkxODAsMjE5LDAsMTMxLDEzMiwyMTcsMCwxMzEsMCwyMjEsMCwxMzEsCisJMTA0LDIyMCwwLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTEsMCwyLDEsMTgwLDIxOSwwLDEzMSwxMzIsMjE3LDAsMTMxLAorCTE2NCwyMDIsMCwxMzEsMTA0LDIyMCwwLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDEsMCwyLDMsMTgwLDIxOSwwLDEzMSwKKwkxMzIsMjE3LDAsMTMxLDAsMjIxLDAsMTMxLDEwNCwyMjAsMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsMiwzLAorCTE4MCwyMTksMCwxMzEsMTMyLDIxNywwLDEzMSwwLDIyMSwwLDEzMSwKKwkxMDQsMjIwLDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDQsMSwxODAsMjE5LDAsMTMxLDEzMiwyMTcsMCwxMzEsCisJMTY0LDIwMiwwLDEzMSwxMDQsMjIwLDAsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDIsMSwxODAsMjE5LDAsMTMxLAorCTEzMiwyMTcsMCwxMzEsMTY0LDIwMiwwLDEzMSwxMDQsMjIwLDAsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsMSwwLDQsMSwKKwkxODAsMjE5LDAsMTMxLDEzMiwyMTcsMCwxMzEsMTY0LDIwMiwwLDEzMSwKKwkxMDQsMjIwLDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDQsMSwxODAsMjE5LDAsMTMxLDEzMiwyMTcsMCwxMzEsCisJMTY0LDIwMiwwLDEzMSwxMDQsMjIwLDAsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMCwwLDAsMjU1LDAsMCwwLAorCTAsMCwwLDAsMSwwLDY1LDEsMTgwLDIxOSwwLDEzMSwKKwkxMzIsMjE3LDAsMTMxLDE2NCwyMDIsMCwxMzEsMTA0LDIyMCwwLDEzMSwKKwkwLDAsMCwwLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisJMTcyLDE5NywxLDEzMSwyLDAsMCwwLDIxMiwxOTcsMSwxMzEsCisJMywwLDAsMCwyNTIsMTk3LDEsMTMxLDQsMCwwLDAsCisJMzYsMTk4LDEsMTMxLDUsMCwwLDAsNzYsMTk4LDEsMTMxLAorCTYsMCwwLDAsMTE2LDE5OCwxLDEzMSw3LDAsMCwwLAorCTE1NiwxOTgsMSwxMzEsOCwwLDAsMCwxOTYsMTk4LDEsMTMxLAorCTksMCwwLDAsMjM2LDE5OCwxLDEzMSwxMCwwLDAsMCwKKwkyMCwxOTksMSwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTEsMCwwLDAsMTM2LDIwOSwxLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMSwwLDAsMCwxMjAsMTk0LDEsMTMxLAorCTIsMCwwLDAsMTgwLDE5NCwxLDEzMSwzLDAsMCwwLAorCTI0MCwxOTQsMSwxMzEsNCwwLDAsMCw0NCwxOTUsMSwxMzEsCisJNSwwLDAsMCwxMDQsMTk1LDEsMTMxLDYsMCwwLDAsCisJMTY0LDE5NSwxLDEzMSw3LDAsMCwwLDIyNCwxOTUsMSwxMzEsCisJOCwwLDAsMCwyOCwxOTYsMSwxMzEsOSwwLDAsMCwKKwk4OCwxOTYsMSwxMzEsMTAsMCwwLDAsMTQ4LDE5NiwxLDEzMSwKKwkxMSwwLDAsMCwyMDgsMTk2LDEsMTMxLDEyLDAsMCwwLAorCTEyLDE5NywxLDEzMSwxMywwLDAsMCw3MiwxOTcsMSwxMzEsCisJMTQsMCwwLDAsMTMyLDE5NywxLDEzMSwxNSwwLDAsMCwKKwkxNDQsMjA5LDEsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDc2LDIxMCwwLDEzMSwxNTYsMjAyLDAsMTMxLAorCTE2MCwyMTEsMSwxMzEsMSwwLDY1LDEsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwk0NCwyMDAsMSwxMzEsMCwwLDAsMCwyNTUsMCwwLDAsCisJMjU1LDAsMCwwLDAsMCwwLDAsOCwyMDIsMCwxMzEsCisJMTQ4LDM4LDEsMTMxLDEyMCwyMDUsMCwxMzEsNjAsMjEwLDAsMTMxLAorCTE0MCwxLDAsMTYzLDEsMCwyLDMsMzIsNDUsMSwxMzEsCisJMjA4LDQ4LDEsMTMxLDE2MCw0OSwxLDEzMSwyMCw0OCwxLDEzMSwKKwkxMDQsMjAwLDEsMTMxLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDEsMCw0LDEsCisJNDQsMjAyLDAsMTMxLDM2LDIyMiwwLDEzMSwxNjQsMjAyLDAsMTMxLAorCTQ4LDIyMywwLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJMjU1LDAsMCwwLDI1NSwwLDAsMCwwLDAsMCwwLAorCTEsMCwyLDEsNDQsMjAyLDAsMTMxLDM2LDIyMiwwLDEzMSwKKwkxNjQsMjAyLDAsMTMxLDQ4LDIyMywwLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMjU1LDAsMCwwLDI1NSwwLDAsMCwKKwkwLDAsMCwwLDEsMCwyLDEsNDQsMjAyLDAsMTMxLAorCTM2LDIyMiwwLDEzMSwxNjQsMjAyLDAsMTMxLDQ4LDIyMywwLDEzMSwKKwkwLDAsMCwwLDAsMCwwLDAsMjU1LDAsMCwwLAorCTI1NSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisJMTY0LDIwMCwxLDEzMSwyLDAsMCwwLDIwNCwyMDAsMSwxMzEsCisJMywwLDAsMCwyNDQsMjAwLDEsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwxLDAsMCwwLDE2OCwyMDksMSwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDEsMCwyLDEsCisJNDQsMjAyLDAsMTMxLDIxMiwyMjMsMCwxMzEsMTY0LDIwMiwwLDEzMSwKKwkyNTIsMjI0LDAsMTMxLDAsMCwwLDAsMCwwLDAsMCwKKwkyNTUsMCwwLDAsMjU1LDAsMCwwLDAsMCwwLDAsCisJMSwwLDIsMSw0NCwyMDIsMCwxMzEsMjEyLDIyMywwLDEzMSwKKwkxNjQsMjAyLDAsMTMxLDI1MiwyMjQsMCwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsNjUsMSw0NCwyMDIsMCwxMzEsCisJMjEyLDIyMywwLDEzMSwxNjQsMjAyLDAsMTMxLDI1MiwyMjQsMCwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwwLDAsMCwKKwkyNTUsMCwwLDAsMCwwLDAsMCwxLDAsNjUsMSwKKwk0NCwyMDIsMCwxMzEsMjEyLDIyMywwLDEzMSwxNjQsMjAyLDAsMTMxLAorCTI1MiwyMjQsMCwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTI1NSwwLDAsMCwyNTUsMCwwLDAsMCwwLDAsMCwKKwkxLDAsNjUsMSw0NCwyMDIsMCwxMzEsMjEyLDIyMywwLDEzMSwKKwkxNjQsMjAyLDAsMTMxLDI1MiwyMjQsMCwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwwLDAsMCwyNTUsMCwwLDAsCisJMCwwLDAsMCwxLDAsMCwwLDc2LDIwMSwxLDEzMSwKKwkyLDAsMCwwLDExNiwyMDEsMSwxMzEsMywwLDAsMCwKKwkxNTYsMjAxLDEsMTMxLDQsMCwwLDAsMTk2LDIwMSwxLDEzMSwKKwk1LDAsMCwwLDIzNiwyMDEsMSwxMzEsMCwwLDAsMCwKKwkwLDAsMCwwLDEsMCwwLDAsMTg0LDIwOSwxLDEzMSwKKwkwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKKwk2NCwyMDAsMSwxMzEsMiwwLDAsMCwxMjQsMjAwLDEsMTMxLAorCTMsMCwwLDAsMTc2LDIwOSwxLDEzMSw0LDAsMCwwLAorCTE5MiwyMDksMSwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTEsMCwwLDAsMTI4LDIwOSwxLDEzMSwyLDAsMCwwLAorCTE1MiwyMDksMSwxMzEsMywwLDAsMCwxNjAsMjA5LDEsMTMxLAorCTQsMCwwLDAsMjAwLDIwOSwxLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMSwwLDAsMCwyNCwyMDgsMSwxMzEsCisJMiwwLDAsMCw0OCwyMDgsMSwxMzEsNCwwLDAsMCwKKwkxMDQsMjA4LDEsMTMxLDUsMCwwLDAsMTEyLDIwOCwxLDEzMSwKKwk3LDAsMCwwLDEzNiwyMDgsMSwxMzEsMTAsMCwwLDAsCisJOTYsMjA5LDEsMTMxLDExLDAsMCwwLDEwNCwyMDksMSwxMzEsCisJMTcsMCwwLDAsMjA4LDIwOSwxLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMSwwLDAsMCwyMTYsMjA5LDEsMTMxLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTEsMCwwLDAsMjQwLDIwOSwxLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMSwwLDAsMCw4LDIxMCwxLDEzMSwKKwkyLDAsMCwwLDE2LDIxMCwxLDEzMSwzLDAsMCwwLAorCTI0LDIxMCwxLDEzMSw0LDAsMCwwLDMyLDIxMCwxLDEzMSwKKwk1LDAsMCwwLDQwLDIxMCwxLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAorCTU2LDIxMCwxLDEzMSwyLDAsMCwwLDY0LDIxMCwxLDEzMSwKKwkwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKKwk3MiwyMTAsMSwxMzEsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAorCTQ4LDIxMCwxLDEzMSwyLDAsMCwwLDgwLDIxMCwxLDEzMSwKKwkzLDAsMCwwLDg4LDIxMCwxLDEzMSwwLDAsMCwwLAorCTAsMCwwLDAsMSwwLDAsMCwxNiwyMDgsMSwxMzEsCisJMiwwLDAsMCwyMjQsMjA5LDEsMTMxLDMsMCwwLDAsCisJMjMyLDIwOSwxLDEzMSw0LDAsMCwwLDI0OCwyMDksMSwxMzEsCisJNSwwLDAsMCwwLDIxMCwxLDEzMSw2LDAsMCwwLAorCTk2LDIxMCwxLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJMSwwLDAsMCwxMDQsMjEwLDEsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCw2LDAsMCwwLDExMiwyMTAsMSwxMzEsCisJMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsCisJMTIwLDIxMCwxLDEzMSwwLDAsMCwwLDAsMCwwLDAsCisJMSwwLDAsMCwxMjgsMjEwLDEsMTMxLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMSwwLDAsMCwzLDAsMCwwLDYsMCwwLDAsCisJMSwwLDAsMCwyLDAsMCwwLDEsMCwwLDAsCisJMTAsMCwwLDAsNywwLDAsMCw4LDAsMCwwLAorCTIsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwxMTIsMTE3LDk4LDEwOCwKKwkxMDUsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDExMiwxMTQsMTA1LDExOCw5NywxMTYsMTAxLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJODMsNzgsNzcsODAsOTUsMTE2LDExNCw5NywxMTIsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisJMywwLDAsMCw2LDAsMCwwLDEsMCwwLDAsCisJNCwwLDAsMCwxLDAsMCwwLDc2LDEsMCwwLAorCTUsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAorCTMsMCwwLDAsNiwwLDAsMCwxLDAsMCwwLAorCTIsMCwwLDAsMSwwLDAsMCwyLDAsMCwwLAorCTIsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLAorCTAsMCwwLDAsMSwwLDAsMCwzLDAsMCwwLAorCTYsMCwwLDAsMSwwLDAsMCwyLDAsMCwwLAorCTEsMCwwLDAsMTcsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LAorCTU2LDU3LDY1LDY2LDY3LDY4LDY5LDcwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMjU1LDg1LDE3MCwwLDI1NSwyNTUsMjU1LDI1NSw4NSw4NSw4NSw4NSwKKwkxNzAsMTcwLDE3MCwxNzAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCw2NCw0MCwzNSw0MSwKKwkzMiw2NywxMTEsMTEyLDEyMSwxMTQsMTA1LDEwMywxMDQsMTE2LDMyLDQwLAorCTk5LDQxLDMyLDQ5LDU3LDU2LDU0LDMyLDQ1LDMyLDQ5LDU3LAorCTU3LDUzLDMyLDMyLDY5LDExMiwxMDUsMTA4LDExMSwxMDMsMTE3LDEwMSwKKwkzMiw4NCwxMDEsOTksMTA0LDExMCwxMTEsMTA4LDExMSwxMDMsMTIxLDMyLAorCTY3LDExMSwxMTQsMTEyLDExMSwxMTQsOTcsMTE2LDEwNSwxMTEsMTEwLDEwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwyNTUsMjU1LDI1NSwyNTUsCisJNzIsMTAsMCwwLDc4LDEwLDAsMCw4MywxMCwwLDAsCisJNjksMTAsMCwwLDEwOSw5NywxMDUsMTEwLDQ2LDk5LDAsMCwKKwk0OCwwLDAsMCw1NSwwLDAsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAorCTAsMCwwLDAsMTE2LDEwNSwxMDksMTAxLDExNCw0Niw5OSwwLAorCTAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorCTEwMCwwLDAsMCwxMDAsMCwwLDAsMSwwLDAsMCwKKwkwLDAsMCwwLDExNSwxMTQsOTksMzIsMCwwLDAsMCwKKwkzMiwwLDAsMCwxMDAsMTE1LDExNiwzMiwwLDAsMCwwLAorCTMyLDM3LDQ4LDUwLDg4LDAsMCwwLDEwLDAsMCwwLAorCTI1NSwyNTUsMjU1LDI1NSw0OCw0OCw0OCw0OCw0OCw0OCwwLDAsCisJNDgsNDgsNDgsNDgsNDgsNDksMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDI1NSwyNTUsMjU1LDI1NSwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwk2MiwzMiwwLDAsMzcsMTIwLDEwLDAsMzcsMTIwLDU4LDksCisJMzcsMTIwLDEwLDAsMzcsMTE1LDEwLDAsMCwwLDAsMCwKKwkxMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJNjgsODUsNzcsODAsMTAsMCwwLDAsMzcsNDgsNTAsMTIwLAorCTMyLDAsMCwwLDEwLDAsMCwwLDAsMCwwLDAsCisJMzcsMTAwLDMyLDExMiwxMTIsMTE1LDEwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKwkxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKKwkxMTksMTE5LDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDEsMTI4LDE5NCwwLAorCTAsMCwwLDAsMSwxMjgsMTk0LDAsMCwxNiwwLDAsCisJNjYsNzYsNzUsMCw3MCw4Nyw2OCwwLDc2LDgyLDc4LDAsCisJNzYsNzMsODMsMCw2OCw3Myw4MywwLDcyLDY5LDc2LDc2LAorCTc5LDEwLDAsMCwxMTYsOTksMzIsMTAxLDEyMCwxMTIsMTAsMCwKKwkxMDIsMTE0LDExMSwxMDksMzIsMCwwLDAsMTAsMCwwLDAsCisJODcsMTAxLDEwNSwxMTQsMTAwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAorCTI1NSwyNTUsMCwwLDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDAsMCwKKwkwLDAsMCwwLDAsMCwwLDAsODAsNjUsNjgsMzcsCisJMTAwLDEwLDAsMCwxNzAsMTcwLDMsMCwwLDAsMCwwLAorCTgzLDY5LDc4LDg0LDMzLDEwLDAsMCw4NSw2OCw4MCwxMCwKKwkwLDAsMCwwLDczLDY3LDc3LDgwLDEwLDAsMCwwLAorCTY5LDY3LDcyLDc5LDEwLDAsMCwwLDczLDgwLDEwLDAsCisJMTcwLDE3MCwzLDAsMCwwLDAsMCw3Myw4MCw4OCwzMywKKwkxMCwwLDAsMCwwLDAsMCwwLDI1NSwyNTUsMjU1LDI1NSwKKwkyNTUsMjU1LDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisJMCwwLDAsMCwxOTIsMTU1LDEsMTMxLDAsMCwwLDAsCisJMTA4LDE1NywxLDEzMSwwLDAsMCwwLDg4LDE2MSwxLDEzMSwKKwkwLDAsMCwwLDE2LDE2MiwxLDEzMSwwLDAsMCwwLAorCTMyLDE2MiwxLDEzMSwwLDAsMCwwLDExNiwxNjcsMSwxMzEsCisJMCwwLDAsMCwxNjQsMTY3LDEsMTMxLDAsMCwwLDAsCisJMTg4LDE2OSwxLDEzMSwwLDAsMCwwLDQ0LDE3MCwxLDEzMSwKKwkwLDAsMCwwLDIyMCwxNzAsMSwxMzEsMCwwLDAsMCwKKwk0LDE3MSwxLDEzMSwwLDAsMCwwLDgwLDE3MSwxLDEzMSwKKwkwLDAsMCwwLDQwLDE3OCwxLDEzMSwwLDAsMCwwLAorCTEwNCwxODAsMSwxMzEsMCwwLDAsMCwxMjgsMTgwLDEsMTMxLAorCTAsMCwwLDAsMTQ0LDE4MCwxLDEzMSwwLDAsMCwwLAorCTI0MCwxODIsMSwxMzEsMCwwLDAsMCwxMDQsMTgzLDEsMTMxLAorCTAsMCwwLDAsMTIwLDE4MywxLDEzMSwwLDAsMCwwLAorCTEyOCwxODMsMSwxMzEsMCwwLDAsMCwxMzYsMTgzLDEsMTMxLAorCTAsMCwwLDAsMTYwLDE4MywxLDEzMSwwLDAsMCwwLAorCTE2OCwxODMsMSwxMzEsMCwwLDAsMCwxNzYsMTgzLDEsMTMxLAorCTAsMCwwLDAsMjAwLDE4MywxLDEzMSwwLDAsMCwwLAorCTIwOCwxODMsMSwxMzEsMCwwLDAsMCwyMTYsMTgzLDEsMTMxLAorCTAsMCwwLDAsMjI0LDE4MywxLDEzMSwwLDAsMCwwLAorCTAsMTg0LDEsMTMxLDAsMCwwLDAsOCwxODQsMSwxMzEsCisJMCwwLDAsMCwxNiwxODQsMSwxMzEsMCwwLDAsMCwKKwk0MCwxODQsMSwxMzEsMCwwLDAsMCw0OCwxODQsMSwxMzEsCisJMCwwLDAsMCw2NCwxODQsMSwxMzEsMCwwLDAsMCwKKwk3MiwxODQsMSwxMzEsMCwwLDAsMCw4MCwxODQsMSwxMzEsCisJMCwwLDAsMCwxMDQsMTg0LDEsMTMxLDAsMCwwLDAsCisJMTEyLDE4NCwxLDEzMSwwLDAsMCwwLDEyOCwxODQsMSwxMzEsCisJMCwwLDAsMCwxMzYsMTg0LDEsMTMxLDAsMCwwLDAsCisJMTUyLDE4NCwxLDEzMSwwLDAsMCwwLDIwOCwxODQsMSwxMzEsCisJMCwwLDAsMCwyNDgsMTg0LDEsMTMxLDAsMCwwLDAsCisJMTUyLDE5MSwxLDEzMSwwLDAsMCwwLDI1MiwxOTMsMSwxMzEsCisJMCwwLDAsMCw0NCwxOTQsMSwxMzEsMCwwLDAsMCwKKwk2MCwxOTQsMSwxMzEsMCwwLDAsMCw2MCwxOTksMSwxMzEsCisJMCwwLDAsMCwxNDgsMTk5LDEsMTMxLDAsMCwwLDAsCisJMTY0LDE5OSwxLDEzMSwwLDAsMCwwLDM2LDIwMCwxLDEzMSwKKwkwLDAsMCwwLDI4LDIwMSwxLDEzMSwwLDAsMCwwLAorCTYwLDIwMSwxLDEzMSwwLDAsMCwwLDIwLDIwMiwxLDEzMSwKKwkwLDAsMCwwLDY4LDIwMiwxLDEzMSwwLDAsMCwwLAorCTg0LDIwMiwxLDEzMSwwLDAsMCwwLDEyNCwyMDIsMSwxMzEsCisJMCwwLDAsMCwxNjQsMjAyLDEsMTMxLDAsMCwwLDAsCisJMjM2LDIwMiwxLDEzMSwwLDAsMCwwLDI1MiwyMDIsMSwxMzEsCisJMCwwLDAsMCw0LDIwMywxLDEzMSwwLDAsMCwwLAorCTEyLDIwMywxLDEzMSwwLDAsMCwwLDI4LDIwMywxLDEzMSwKKwkwLDAsMCwwLDM2LDIwMywxLDEzMSwwLDAsMCwwLAorCTQ0LDIwMywxLDEzMSwwLDAsMCwwLDUyLDIwMywxLDEzMSwKKwkwLDAsMCwwLDYwLDIwMywxLDEzMSwwLDAsMCwwLAorCTY4LDIwMywxLDEzMSwwLDAsMCwwLDc2LDIwMywxLDEzMSwKKwkwLDAsMCwwLDEyNCwyMDMsMSwxMzEsMCwwLDAsMCwKKwkxMzIsMjAzLDEsMTMxLDAsMCwwLDAsMTQwLDIwMywxLDEzMSwKKwkwLDAsMCwwLDE2NCwyMDMsMSwxMzEsMCwwLDAsMCwKKwkxODAsMjAzLDEsMTMxLDAsMCwwLDAsMTg4LDIwMywxLDEzMSwKKwkwLDAsMCwwLDIyMCwyMDMsMSwxMzEsMCwwLDAsMCwKKwkyMCwyMDQsMSwxMzEsMCwwLDAsMCwzNiwyMDQsMSwxMzEsCisJMCwwLDAsMCw1MiwyMDQsMSwxMzEsMCwwLDAsMCwKKwk2OCwyMDQsMSwxMzEsMjU1LDI1NSwyNTUsMCwwLDAsMCwwLAorCTAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAorCTEwLDAsMCwwLDEwLDAsMCwwLDAsMjA1LDEsMTMxLAorCTEwLDAsMCwwLDcsMCwwLDAsMCwwLDAsMCwKKwkwLDAsMCwwLDI1NSwyNTUsMjU1LDI1NSwxMTAsMTE4LDExNCw5NywKKwkxMDksNDYsOTksMCwxMTQsOTksMCwwLDQ4LDEyMCwwLDAsCisJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAKKwl9IDsKK3N0YXRpYyBpbnQgZGdyc19uY29kZSA9IDExOTUyMCA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZ3JzX2k4MjU5Ni5oIGIvZHJpdmVycy9uZXQvZGdyc19pODI1OTYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2EzOGMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZGdyc19pODI1OTYuaApAQCAtMCwwICsxLDQ3MyBAQAorLyoKKyAqCWk4MjU5NiBldGhlcm5ldCBjb250cm9sbGVyIGJpdHMgYW5kIHN0cnVjdHVyZXMgKGxpdHRsZSBlbmRpYW4pCisgKgorICoJJElkOiBpODI1OTYuaCx2IDEuOCAxOTk2LzA5LzAzIDExOjE5OjAzIHJpY2sgRXhwICQKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJUE9SVCBjb21tYW5kcyAocC4gNC0yMCkuICBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQgbmliYmxlIGlzIG9uZQkqLworLyoJb2YgdGhlc2UgY29tbWFuZHMsIHRoZSByZXN0IG9mIHRoZSBjb21tYW5kIGlzIGEgbWVtb3J5IGFkZHJlc3MJKi8KKy8qCWFsaWduZWQgb24gYSAxNiBieXRlIGJvdW5kYXJ5LiAgTm90ZSB0aGF0IHBvcnQgY29tbWFuZHMgbXVzdAkqLworLyoJYmUgd3JpdHRlbiB0byB0aGUgUE9SVCBhZGRyZXNzIGFuZCB0aGUgUE9SVCBhZGRyZXNzKzIgd2l0aCB0d28JKi8KKy8qCWhhbGZ3b3JkIHdyaXRlcy4gIFdyaXRlIHRoZSBMU0ggZmlyc3QgdG8gUE9SVCwgdGhlbiB0aGUgTVNIIHRvCSovCisvKglQT1JUKzIuICBCbGFtZSBJbnRlbC4JCQkJCQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJSTU5Nl9QT1JUX1JFU0VUCQkweDAJLyogUmVzZXQuIFdhaXQgNSBTeXNDbGtzICYgMTAgVHhDbGtzICovCisjZGVmaW5lCUk1OTZfUE9SVF9TRUxGVEVTVAkweDEJLyogRG8gYSBzZWxmdGVzdCAqLworI2RlZmluZQlJNTk2X1BPUlRfU0NQX0FERFIJMHgyCS8qIFNldCBuZXcgU0NQIGFkZHJlc3MgKi8KKyNkZWZpbmUJSTU5Nl9QT1JUX0RVTVAJCTB4MwkvKiBEdW1wIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLworCisvKgorICoJSTU5Nl9TVDoJU2VsZnRlc3QgcmVzdWx0cyAocC4gNC0yMSkKKyAqLwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QKK3sKKwl1bG9uZwlzaWduYXR1cmU7CS8qIFJPTSBjaGVja3N1bSAqLworCXVsb25nCXJlc3VsdDsJCS8qIFNlbGZ0ZXN0IHJlc3VsdHM6IG5vbi16ZXJvIGlzIGEgZmFpbHVyZSAqLworfSBJNTk2X1NUOworCisjZGVmaW5lCUk1OTZfU1RfU0VMRlRFU1RfRkFJTAkweDEwMDAJLyogU2VsZnRlc3QgRmFpbGVkICovCisjZGVmaW5lCUk1OTZfU1RfRElBR05PU0VfRkFJTAkweDAwMjAJLyogRGlhZ25vc2UgRmFpbGVkICovCisjZGVmaW5lCUk1OTZfU1RfQlVTVElNRVJfRkFJTAkweDAwMTAJLyogQnVzIFRpbWVyIEZhaWxlZCAqLworI2RlZmluZQlJNTk2X1NUX1JFR0lTVEVSX0ZBSUwJMHgwMDA4CS8qIFJlZ2lzdGVyIEZhaWxlZCAqLworI2RlZmluZQlJNTk2X1NUX1JPTV9GQUlMCTB4MDAwNAkvKiBST00gRmFpbGVkICovCisKKy8qCisgKglJNTk2X0RVTVA6CUR1bXAgcmVzdWx0cworICovCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdAoreworCXVsb25nCWR1bXBbNzddOworfSBJNTk2X0RVTVA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCSovCisvKglJNTk2X1RCRDoJVHJhbnNtaXQgQnVmZmVyIERlc2NyaXB0b3IgKHAuIDQtNTkpCQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgdm9sYXRpbGUgc3RydWN0IF9JNTk2X1RCRAoreworCXVsb25nCQkJY291bnQ7CisJdm9sIHN0cnVjdCBfSTU5Nl9UQkQJKm5leHQ7CisJdWNoYXIJCQkqYnVmOworCXVzaG9ydAkJCXVudXNlZDE7CisJdXNob3J0CQkJdW51c2VkMjsKK30gSTU5Nl9UQkQ7CisKKyNkZWZpbmUJSTU5Nl9UQkRfTk9MSU5LCQkoKEk1OTZfVEJEICopIDB4ZmZmZmZmZmYpCisjZGVmaW5lCUk1OTZfVEJEX0VPRgkJMHg4MDAwCisjZGVmaW5lIEk1OTZfVEJEX0NPVU5UX01BU0sJMHgzZmZmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCSovCisvKglJNTk2X1RGRDoJVHJhbnNtaXQgRnJhbWUgRGVzY3JpcHRvciAocC4gNC01NikJCSovCisvKgkJCWEuay5hLiBJNTk2X0NCX1hNSVQJCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdAoreworCXVzaG9ydAkJCXN0YXR1czsKKwl1c2hvcnQJCQljbWQ7CisJdW5pb24gX0k1OTZfQ0IJCSpuZXh0OworCUk1OTZfVEJECQkqdGJkcDsKKwl1bG9uZwkJCWNvdW50OwkvKiBmb3Igc3BlZWQgKi8KKworCS8qIEFwcGxpY2F0aW9uIGRlZmluZWQgZGF0YSBmb2xsb3dzIHN0cnVjdHVyZS4uLiAqLworCisjaWYgMAkvKiBXZSBkb24ndCB1c2UgdGhlc2UgaW50ZWwgZGVmaW5lZCBvbmVzICovCisJCXVjaGFyCQkJYWRkcls2XTsKKwkJdXNob3J0CQkJbGVuOworCQl1Y2hhcgkJCWRhdGFbMV07CisjZWxzZQorCQl1bG9uZwkJZHN0Y2hhbjsvKiBVc2VkIGJ5IG11bHRpLU5JQyBtb2RlICovCisjZW5kaWYKK30gSTU5Nl9URkQ7CisKKyNkZWZpbmUJSTU5Nl9URkRfTk9DUkMJMHgwMDEwCS8qIGNtZDogTm8gQ1JDIGluc2VydGlvbiAqLworI2RlZmluZQlJNTk2X1RGRF9GTEVYCTB4MDAwOAkvKiBjbWQ6IEZsZXhpYmxlIG1vZGUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUk1OTZfUkJEOglSZWNlaXZlIEJ1ZmZlciBEZXNjcmlwdG9yIChwLiA0LTg0KQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCBfSTU5Nl9SQkQKK3sKKyNpZmRlZiBJTlRFTF9SRVRFTlRJVkUKKwl1c2hvcnQJCQljb3VudDsJLyogTGVuZ3RoIG9mIGRhdGEgaW4gYnVmICovCisJdXNob3J0CQkJb2Zmc2V0OworI2Vsc2UKKwl1bG9uZwkJCWNvdW50OwkvKiBMZW5ndGggb2YgZGF0YSBpbiBidWYgKi8KKyNlbmRpZgorCXZvbCBzdHJ1Y3QgX0k1OTZfUkJECSpuZXh0OwkvKiBOZXh0IGJ1ZmZlciBkZXNjcmlwdG9yIGluIGxpc3QgKi8KKwl1Y2hhcgkJCSpidWY7CS8qIERhdGEgYnVmZmVyICovCisjaWZkZWYgSU5URUxfUkVURU5USVZFCisJdXNob3J0CQkJc2l6ZTsJLyogU2l6ZSBvZiBidWYgKGNvbnN0YW50KSAqLworCXVzaG9ydAkJCXplcm87CisjZWxzZQorCXVsb25nCQkJc2l6ZTsJLyogU2l6ZSBvZiBidWYgKGNvbnN0YW50KSAqLworI2VuZGlmCisKKwkvKiBBcHBsaWNhdGlvbiBkZWZpbmVkIGRhdGEgZm9sbG93cyBzdHJ1Y3R1cmUuLi4gKi8KKworCXVjaGFyCQkJY2hhbjsKKwl1Y2hhcgkJCXJlZmNudDsKKwl1c2hvcnQJCQlsZW47Cit9IEk1OTZfUkJEOworCisjZGVmaW5lCUk1OTZfUkJEX05PTElOSwkJKChJNTk2X1JCRCAqKSAweGZmZmZmZmZmKQorI2RlZmluZQlJNTk2X1JCRF9FT0YJCTB4ODAwMAkvKiBUaGlzIGlzIGxhc3QgYnVmZmVyIGluIGEgZnJhbWUgKi8KKyNkZWZpbmUJSTU5Nl9SQkRfRgkJMHg0MDAwCS8qIFRoZSBhY3R1YWwgY291bnQgaXMgdmFsaWQgKi8KKworI2RlZmluZQlJNTk2X1JCRF9FTAkJMHg4MDAwCS8qIExhc3QgYnVmZmVyIGluIGxpc3QgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUk1OTZfUkZEOglSZWNlaXZlIEZyYW1lIERlc2NyaXB0b3IgKHAuIDQtNzkpCQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgdm9sYXRpbGUgc3RydWN0IF9JNTk2X1JGRAoreworCXVzaG9ydAkJCXN0YXR1czsKKwl1c2hvcnQJCQljbWQ7CisJdm9sIHN0cnVjdCBfSTU5Nl9SRkQJKm5leHQ7CisJdm9sIHN0cnVjdCBfSTU5Nl9SQkQJKnJiZHA7CisJdXNob3J0CQkJY291bnQ7CS8qIExlbiBvZiBkYXRhIGluIFJGRDogYWx3YXlzIDAgKi8KKwl1c2hvcnQJCQlzaXplOwkvKiBTaXplIG9mIFJGRCBidWZmZXI6IGFsd2F5cyAwICovCisKKwkvKiBBcHBsaWNhdGlvbiBkZWZpbmVkIGRhdGEgZm9sbG93cyBzdHJ1Y3R1cmUuLi4gKi8KKworIwlpZiAwCS8qIFdlIGRvbid0IHVzZSB0aGVzZSBpbnRlbCBkZWZpbmVkIG9uZXMgKi8KKwkJdWNoYXIJCWFkZHJbNl07CisJCXVzaG9ydAkJbGVuOworCQl1Y2hhcgkJZGF0YVsxXTsKKyMJZWxzZQorCQl1bG9uZwkJZHN0Y2hhbjsvKiBVc2VkIGJ5IG11bHRpLW5pYyBtb2RlICovCisjCWVuZGlmCit9IEk1OTZfUkZEOworCisjZGVmaW5lCUk1OTZfUkZEX0MJCTB4ODAwMAkvKiBzdGF0dXM6IGZyYW1lIGNvbXBsZXRlICovCisjZGVmaW5lCUk1OTZfUkZEX0IJCTB4NDAwMAkvKiBzdGF0dXM6IGZyYW1lIGJ1c3kgb3Igd2FpdGluZyAqLworI2RlZmluZQlJNTk2X1JGRF9PSwkJMHgyMDAwCS8qIHN0YXR1czogZnJhbWUgT0sgKi8KKyNkZWZpbmUJSTU5Nl9SRkRfRVJSX0xFTkdUSAkweDEwMDAJLyogc3RhdHVzOiBsZW5ndGggZXJyb3IgKi8KKyNkZWZpbmUJSTU5Nl9SRkRfRVJSX0NSQwkweDA4MDAJLyogc3RhdHVzOiBDUkMgZXJyb3IgKi8KKyNkZWZpbmUJSTU5Nl9SRkRfRVJSX0FMSUdOCTB4MDQwMAkvKiBzdGF0dXM6IGFsaWdubWVudCBlcnJvciAqLworI2RlZmluZQlJNTk2X1JGRF9FUlJfTk9CVUZTCTB4MDIwMAkvKiBzdGF0dXM6IHJlc291cmNlIGVycm9yICovCisjZGVmaW5lCUk1OTZfUkZEX0VSUl9ETUEJMHgwMTAwCS8qIHN0YXR1czogRE1BIGVycm9yICovCisjZGVmaW5lCUk1OTZfUkZEX0VSUl9TSE9SVAkweDAwODAJLyogc3RhdHVzOiB0b28gc2hvcnQgZXJyb3IgKi8KKyNkZWZpbmUJSTU5Nl9SRkRfTk9NQVRDSAkweDAwMDIJLyogc3RhdHVzOiBJQSB3YXMgbm90IG1hdGNoZWQgKi8KKyNkZWZpbmUJSTU5Nl9SRkRfQ09MTElTSU9OCTB4MDAwMQkvKiBzdGF0dXM6IGNvbGxpc2lvbiBkdXJpbmcgcmVjZWl2ZSAqLworCisjZGVmaW5lCUk1OTZfUkZEX0VMCQkweDgwMDAJLyogY21kOiBlbmQgb2YgUkZEIGxpc3QgKi8KKyNkZWZpbmUJSTU5Nl9SRkRfRkxFWAkJMHgwMDA4CS8qIGNtZDogRmxleGlibGUgbW9kZSAqLworI2RlZmluZQlJNTk2X1JGRF9FT0YJCTB4ODAwMAkvKiBjb3VudDogbGFzdCBidWZmZXIgaW4gdGhlIGZyYW1lICovCisjZGVmaW5lCUk1OTZfUkZEX0YJCTB4NDAwMAkvKiBjb3VudDogVGhlIGFjdHVhbCBjb3VudCBpcyB2YWxpZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoJCQkJCQkJCQkqLworLyoJQ29tbWFuZHMJCQkJCQkJKi8KKy8qCQkJCQkJCQkJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKiB2YWx1ZXMgZm9yIGNtZCBoYWxmd29yZCBpbiBhbGwgdGhlIHN0cnVjdHMgYmVsb3cgKi8KKyNkZWZpbmUgSTU5Nl9DQl9DTUQJCTB4MDcJLyogQ0IgQ09NTUFORFMgKi8KKyNkZWZpbmUgSTU5Nl9DQl9DTURfTk9QCQkwCisjZGVmaW5lIEk1OTZfQ0JfQ01EX0lBCQkxCisjZGVmaW5lIEk1OTZfQ0JfQ01EX0NPTkYJMgorI2RlZmluZSBJNTk2X0NCX0NNRF9NQ0FTVAkzCisjZGVmaW5lIEk1OTZfQ0JfQ01EX1hNSVQJNAorI2RlZmluZSBJNTk2X0NCX0NNRF9URFIJCTUKKyNkZWZpbmUgSTU5Nl9DQl9DTURfRFVNUAk2CisjZGVmaW5lIEk1OTZfQ0JfQ01EX0RJQUcJNworCisjZGVmaW5lCUk1OTZfQ0JfQ01EX0VMCQkweDgwMDAJLyogQ0IgaXMgbGFzdCBpbiBsaW5rZWQgbGlzdCAqLworI2RlZmluZQlJNTk2X0NCX0NNRF9TCQkweDQwMDAJLyogU3VzcGVuZCBhZnRlciBleGVjdXRpb24gKi8KKyNkZWZpbmUJSTU5Nl9DQl9DTURfSQkJMHgyMDAwCS8qIGNhdXNlIGludGVycnVwdCAqLworCisJLyogdmFsdWVzIGZvciB0aGUgc3RhdHVzIGhhbGZ3b3JkIGluIGFsbCB0aGUgc3RydWN0IGJlbG93ICovCisjZGVmaW5lCUk1OTZfQ0JfU1RBVFVTCQkweEYwMDAJLyogQWxsIGZvdXIgc3RhdHVzIGJpdHMgKi8KKyNkZWZpbmUJSTU5Nl9DQl9TVEFUVVNfQwkweDgwMDAJLyogQ29tbWFuZCBjb21wbGV0ZSAqLworI2RlZmluZQlJNTk2X0NCX1NUQVRVU19CCTB4NDAwMAkvKiBDb21tYW5kIGJ1c3kgZXhlY3V0aW5nICovCisjZGVmaW5lCUk1OTZfQ0JfU1RBVFVTX0NfT1JfQgkweEMwMDAJLyogQ29tbWFuZCBjb21wbGV0ZSBvciBidXN5ICovCisjZGVmaW5lCUk1OTZfQ0JfU1RBVFVTX09LCTB4MjAwMAkvKiBDb21tYW5kIGNvbXBsZXRlLCBubyBlcnJvcnMgKi8KKyNkZWZpbmUJSTU5Nl9DQl9TVEFUVVNfQQkweDEwMDAJLyogQ29tbWFuZCBidXN5IGV4ZWN1dGluZyAqLworCisjZGVmaW5lCUk1OTZfQ0JfTk9MSU5LCQkoKEk1OTZfQ0IgKikgMHhmZmZmZmZmZikKKworLyoKKyAqCUk1OTZfQ0JfTk9QOglOT1AgQ29tbWFuZCAocC4gNC0zNCkKKyAqLwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QKK3sKKwl1c2hvcnQJCQlzdGF0dXM7CisJdXNob3J0CQkJY21kOworCXVuaW9uIF9JNTk2X0NCCQkqbmV4dDsKK30gSTU5Nl9DQl9OT1A7CisKKy8qCisgKglTYW1lIGFzIGFib3ZlLCBidXQgY29tbWFuZCBhbmQgc3RhdHVzIGluIG9uZSB1bG9uZyBmb3Igc3BlZWQKKyAqLwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QKK3sKKwl1bG9uZwkJCWNzcjsKKwl1bmlvbiBfSTU5Nl9DQgkJKm5leHQ7Cit9IEk1OTZfQ0JfRkFTVDsKKyNkZWZpbmUJRkFTVHMoWCkJKFgpCisjZGVmaW5lCUZBU1RjKFgpCSgoWCk8PDE2KQorCisvKgorICoJSTU5Nl9DQl9JQToJSW5kaXZpZHVhbCAoTUFDKSBBZGRyZXNzIENvbW1hbmQgKHAuIDQtMzUpCisgKi8KK3R5cGVkZWYgdm9sYXRpbGUgc3RydWN0Cit7CisJdXNob3J0CQkJc3RhdHVzOworCXVzaG9ydAkJCWNtZDsKKwl1bmlvbiBfSTU5Nl9DQgkJKm5leHQ7CisJdWNoYXIJCQlhZGRyWzZdOworfSBJNTk2X0NCX0lBOworCisvKgorICoJSTU5Nl9DQl9DT05GOglDb25maWd1cmUgQ29tbWFuZCAocC4gNC0zNykKKyAqLwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QKK3sKKwl1c2hvcnQJCQlzdGF0dXM7CisJdXNob3J0CQkJY21kOworCXVuaW9uIF9JNTk2X0NCCQkqbmV4dDsKKwl1Y2hhcgkJCWNvbmZbMTRdOworfSBJNTk2X0NCX0NPTkY7CisKKyNkZWZpbmUJSTU5Nl9DT05GMF9QCQkweDgwCS8qIEVuYWJsZSBSQkQgUHJlZmV0Y2ggQml0ICovCisjZGVmaW5lCUk1OTZfQ09ORjBfQ09VTlQJMTQJLyogQ291bnQgb2YgY29uZmlndXJhdGlvbiBieXRlcyAqLworCisjZGVmaW5lCUk1OTZfQ09ORjFfTU9OX09GRgkweEMwCS8qIE1vbml0b3IgbW9kZTogTW9uaXRvciBvZmYgKi8KKyNkZWZpbmUJSTU5Nl9DT05GMV9NT05fT04JMHg4MAkvKiBNb25pdG9yIG1vZGU6IE1vbml0b3Igb24gKi8KKyNkZWZpbmUJSTU5Nl9DT05GMV9UeEZJRk8oVykJKFcpCS8qIFR4RklGTyB0cmlnZ2VyLCBpbiB3b3JkcyAqLworCisjZGVmaW5lCUk1OTZfQ09ORjJfU0FWRUJGCTB4ODAJLyogU2F2ZSBiYWQgZnJhbWVzICovCisKKyNkZWZpbmUJSTU5Nl9DT05GM19BRERSTEVOKEIpCShCKQkvKiBBZGRyZXNzIGxlbmd0aCAqLworI2RlZmluZQlJNTk2X0NPTkYzX05PU1JDSU5TRVJUCTB4MDgJLyogRG8gbm90IGluc2VydCBzb3VyY2UgYWRkcmVzcyAqLworI2RlZmluZQlJNTk2X0NPTkYzX1BSRUFNQkxFOAkweDIwCS8qIDggYnl0ZSBwcmVhbWJsZSAqLworI2RlZmluZQlJNTk2X0NPTkYzX0xPT1BPRkYJMHgwMAkvKiBMb29wYmFjazogT2ZmICovCisjZGVmaW5lCUk1OTZfQ09ORjNfTE9PUElOVAkweDQwCS8qIExvb3BiYWNrOiBpbnRlcm5hbCAqLworI2RlZmluZQlJNTk2X0NPTkYzX0xPT1BFWFQJMHhDMAkvKiBMb29wYmFjazogZXh0ZXJuYWwgKi8KKworI2RlZmluZQlJNTk2X0NPTkY0X0xJTlBSSShTVCkJKFNUKQkvKiBMaW5lYXIgcHJpb3JpdHk6IHNsb3QgdGltZXMgKi8KKyNkZWZpbmUJSTU5Nl9DT05GNF9FWFBQUkkoU1QpCShTVCkJLyogRXhwb25lbnRpYWwgcHJpb3JpdHk6IHNsb3QgdGltZXMgKi8KKyNkZWZpbmUJSTU5Nl9DT05GNF9JRUVFX0JPTQkwCS8qIElFRUUgODAyLjMgYmFja29mZiBtZXRob2QgKi8KKworI2RlZmluZQlJNTk2X0NPTkY1X0lGUyhYKQkoWCkJLyogSW50ZXJmcmFtZSBzcGFjaW5nIGluIGNsb2NrcyAqLworCisjZGVmaW5lCUk1OTZfQ09ORjZfU1RfTE9XKFgpCShYJjI1NSkJLyogU2xvdCB0aW1lLCBsb3cgYnl0ZSAqLworCisjZGVmaW5lCUk1OTZfQ09ORjdfU1RfSEkoWCkJKFg+PjgpCS8qIFNsb3QgdGltZSwgaGlnaCBiaXRzICovCisjZGVmaW5lCUk1OTZfQ09ORjdfUkVUUlkoWCkJKFg8PDQpCS8qIE1heCByZXRyeSBudW1iZXIgKi8KKworI2RlZmluZQlJNTk2X0NPTkY4X1BST01JU0MJMHgwMQkvKiBSY3YgYWxsIGZyYW1lcyAqLworI2RlZmluZQlJNTk2X0NPTkY4X05PQlJPQUQJMHgwMgorI2RlZmluZQlJNTk2X0NPTkY4X01BTkNIRVNURVIJMHgwNAorI2RlZmluZQlJNTk2X0NPTkY4X1R4Tk9DUlMJMHgwOAorI2RlZmluZQlJNTk2X0NPTkY4X05PQ1JDCTB4MTAKKyNkZWZpbmUJSTU5Nl9DT05GOF9DUkNfQ0NJVFQJMHgyMAorI2RlZmluZQlJNTk2X0NPTkY4X0JJVFNUVUZGSU5HCTB4NDAKKyNkZWZpbmUJSTU5Nl9DT05GOF9QQURESU5HCTB4ODAKKworI2RlZmluZQlJNTk2X0NPTkY5X0NTRklMVEVSKFgpCShYKQorI2RlZmluZQlJNTk2X0NPTkY5X0NTSU5UKFgpCTB4MDgKKyNkZWZpbmUJSTU5Nl9DT05GOV9DREZJTFRFUihYKQkoWDw8NCkKKyNkZWZpbmUJSTU5Nl9DT05GOV9DRElOVChYKQkweDgwCisKKyNkZWZpbmUJSTU5Nl9DT05GMTBfTUlOTEVOKFgpCShYKQkvKiBNaW5pbXVtIGZyYW1lIGxlbmd0aCAqLworCisjZGVmaW5lCUk1OTZfQ09ORjExX1BSRUNSU18JMHgwMQkvKiBQcmVhbWJsZSBiZWZvcmUgY2FycmllciBzZW5zZSAqLworI2RlZmluZQlJNTk2X0NPTkYxMV9MTkdGTERfCTB4MDIJLyogUGFkZGluZyBpbiBFbmQgb2YgQ2FycmllciAqLworI2RlZmluZQlJNTk2X0NPTkYxMV9DUkNJTk1fCTB4MDQJLyogQ1JDIGluIG1lbW9yeSAqLworI2RlZmluZQlJNTk2X0NPTkYxMV9BVVRPVFgJMHgwOAkvKiBBdXRvIHJldHJhbnNtaXQgKi8KKyNkZWZpbmUJSTU5Nl9DT05GMTFfQ1NCU0FDXwkweDEwCS8qIENvbGxpc2lvbiBkZXRlY3QgYnkgc3JjIGFkZHIgY21wLiAqLworI2RlZmluZQlJNTk2X0NPTkYxMV9NQ0FMTF8JMHgyMAkvKiBNdWx0aWNhc3QgYWxsICovCisKKyNkZWZpbmUgSTU5Nl9DT05GMTNfUkVTRVJWRUQJMHgzZgkvKiBSZXNlcnZlZDogbXVzdCBiZSBvbmVzICovCisjZGVmaW5lIEk1OTZfQ09ORjEzX01VTFRJQQkweDQwCS8qIEVuYWJsZSBtdWx0aXBsZSBhZGRyLiByZWNlcHRpb24gKi8KKyNkZWZpbmUgSTU5Nl9DT05GMTNfRElTQk9GCTB4ODAJLyogRGlzYWJsZSBiYWNrb2ZmIGFsZ29yaXRobSAqLworLyoKKyAqCUk1OTZfQ0JfTUNBU1Q6CU11bHRpY2FzdC1TZXR1cCBDb21tYW5kIChwLiA0LTU0KQorICovCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdAoreworCXVzaG9ydAkJCXN0YXR1czsKKwl1c2hvcnQJCQljbWQ7CisJdW5pb24gX0k1OTZfQ0IJCSpuZXh0OworCXVzaG9ydAkJCWNvdW50OwkJLyogTnVtYmVyIG9mIDYtYnl0ZSBhZGRycyB0aGF0IGZvbGxvdyAqLworCXVjaGFyCQkJYWRkcls2XVsxXTsKK30gSTU5Nl9DQl9NQ0FTVDsKKworLyoKKyAqCUk1OTZfQ0JfWE1JVDoJVHJhbnNtaXQgQ29tbWFuZCAocC4gNC01NikKKyAqLwordHlwZWRlZglJNTk2X1RGRAlJNTk2X0NCX1hNSVQ7CisKKyNkZWZpbmUJSTU5Nl9DQl9YTUlUX05PQ1JDCTB4MDAxMAkvKiBjbWQ6IE5vIENSQyBpbnNlcnRpb24gKi8KKyNkZWZpbmUJSTU5Nl9DQl9YTUlUX0ZMRVgJMHgwMDA4CS8qIGNtZDogRmxleGlibGUgbWVtb3J5IG1vZGUgKi8KKworI2RlZmluZQlJNTk2X0NCX1hNSVRfRVJSX0xBVEUJMHgwODAwCS8qIHN0YXR1czogZXJyb3I6IGxhdGUgY29sbGlzaW9uICovCisjZGVmaW5lCUk1OTZfQ0JfWE1JVF9FUlJfTk9DUlMJMHgwNDAwCS8qIHN0YXR1czogZXJyb3I6IG5vIGNhcnJpZXJzIHNlbnNlICovCisjZGVmaW5lCUk1OTZfQ0JfWE1JVF9FUlJfTk9DVFMJMHgwMjAwCS8qIHN0YXR1czogZXJyb3I6IGxvc3Mgb2YgQ1RTICovCisjZGVmaW5lCUk1OTZfQ0JfWE1JVF9FUlJfVU5ERVIJMHgwMTAwCS8qIHN0YXR1czogZXJyb3I6IERNQSB1bmRlcnJ1biAqLworI2RlZmluZQlJNTk2X0NCX1hNSVRfRVJSX01BWENPTAkweDAwMjAJLyogc3RhdHVzOiBlcnJvcjogbWF4aW11bSBjb2xsaXNpb25zICovCisjZGVmaW5lCUk1OTZfQ0JfWE1JVF9DT0xMSVNJT05TCTB4MDAwZgkvKiBzdGF0dXM6IG51bWJlciBvZiBjb2xsaXNpb25zICovCisKKy8qCisgKglJNTk2X0NCX1REUjoJVGltZSBEb21haW4gUmVmbGVjdG9tZXRyeSBDb21tYW5kIChwLiA0LTYzKQorICovCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdAoreworCXVzaG9ydAkJCXN0YXR1czsKKwl1c2hvcnQJCQljbWQ7CisJdW5pb24gX0k1OTZfQ0IJCSpuZXh0OworCXVzaG9ydAkJCXRpbWU7Cit9IEk1OTZfQ0JfVERSOworCisvKgorICoJSTU5Nl9DQl9EVU1QOglEdW1wIENvbW1hbmQgKHAuIDQtNjUpCisgKi8KK3R5cGVkZWYgdm9sYXRpbGUgc3RydWN0Cit7CisJdXNob3J0CQkJc3RhdHVzOworCXVzaG9ydAkJCWNtZDsKKwl1bmlvbiBfSTU5Nl9DQgkJKm5leHQ7CisJdWNoYXIJCQkqYnVmOworfSBJNTk2X0NCX0RVTVA7CisKKy8qCisgKglJNTk2X0NCX0RJQUc6CURpYWdub3NlIENvbW1hbmQgKHAuIDQtNzcpCisgKi8KK3R5cGVkZWYgdm9sYXRpbGUgc3RydWN0Cit7CisJdXNob3J0CQkJc3RhdHVzOworCXVzaG9ydAkJCWNtZDsKKwl1bmlvbiBfSTU5Nl9DQgkJKm5leHQ7Cit9IEk1OTZfQ0JfRElBRzsKKworLyoKKyAqCUk1OTZfQ0I6CUNvbW1hbmQgQmxvY2sKKyAqLwordHlwZWRlZiB1bmlvbiBfSTU5Nl9DQgoreworCUk1OTZfQ0JfTk9QCQlub3A7CisJSTU5Nl9DQl9JQQkJaWE7CisJSTU5Nl9DQl9DT05GCQljb25mOworCUk1OTZfQ0JfTUNBU1QJCW1jYXN0OworCUk1OTZfQ0JfWE1JVAkJeG1pdDsKKwlJNTk2X0NCX1REUgkJdGRyOworCUk1OTZfQ0JfRFVNUAkJZHVtcDsKKwlJNTk2X0NCX0RJQUcJCWRpYWc7CisKKwkvKiBjb21tYW5kIGFuZCBzdGF0dXMgaW4gb25lIHVsb25nIGZvciBzcGVlZC4uLiAqLworCUk1OTZfQ0JfRkFTVAkJZmFzdDsKK30gSTU5Nl9DQjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUk1OTZfU0NCOglTeXN0ZW0gQ29uZmlndXJhdGlvbiBCbG9jayAocC4gNC0yNikJCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QKK3sKKwl2b2xhdGlsZSB1c2hvcnQJCXN0YXR1czsJCS8qIFN0YXR1cyB3b3JkICovCisJdm9sYXRpbGUgdXNob3J0CQljbWQ7CQkvKiBDb21tYW5kIHdvcmQgKi8KKwlJNTk2X0NCCQkqY2JwOworCUk1OTZfUkZECSpyZmRwOworCXVsb25nCQljcmNfZXJyczsKKwl1bG9uZwkJYWxpZ25fZXJyczsKKwl1bG9uZwkJcmVzb3VyY2VfZXJyczsKKwl1bG9uZwkJb3ZlcnJ1bl9lcnJzOworCXVsb25nCQlyY3ZjZHRfZXJyczsKKwl1bG9uZwkJc2hvcnRfZXJyczsKKwl1c2hvcnQJCXRvZmY7CisJdXNob3J0CQl0b247Cit9IEk1OTZfU0NCOworCisJLyogY21kIGhhbGZ3b3JkIHZhbHVlcyAqLworI2RlZmluZQlJNTk2X1NDQl9BQ0sJCTB4RjAwMAkvKiBBQ0tOT1dMRURHTUVOVFMgKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfQUNLX0NYCQkweDgwMDAJLyogQWNrIGNvbW1hbmQgY29tcGxldGlvbiAqLworI2RlZmluZQlJNTk2X1NDQl9BQ0tfRlIJCTB4NDAwMAkvKiBBY2sgcmVjZWl2ZWQgZnJhbWUgKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfQUNLX0NOQQkweDIwMDAJLyogQWNrIGNvbW1hbmQgdW5pdCBub3QgYWN0aXZlICovCisjZGVmaW5lCUk1OTZfU0NCX0FDS19STlIJMHgxMDAwCS8qIEFjayByY3YgdW5pdCBub3QgcmVhZHkgKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfQUNLX0FMTAkweEYwMDAJLyogQWNrIGV2ZXJ5dGhpbmcgKi8KKworI2RlZmluZQlJNTk2X1NDQl9DVUMJCTB4MDcwMAkvKiBDT01NQU5EIFVOSVQgQ09NTUFORFMgKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfQ1VDX05PUAkweDAwMDAJLyogTm8gb3BlcmF0aW9uICovCisjZGVmaW5lCUk1OTZfU0NCX0NVQ19TVEFSVAkweDAxMDAJLyogU3RhcnQgZXhlY3V0aW9uIG9mIGZpcnN0IENCICovCisjZGVmaW5lCUk1OTZfU0NCX0NVQ19SRVNVTUUJMHgwMjAwCS8qIFJlc3VtZSBleGVjdXRpb24gKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfQ1VDX1NVU1BFTkQJMHgwMzAwCS8qIFN1c3BlbmQgYWZ0ZXIgY3VycmVudCBDQiAqLworI2RlZmluZQlJNTk2X1NDQl9DVUNfQUJPUlQJMHgwNDAwCS8qIEFib3J0IGN1cnJlbnQgQ0IgaW1tZWRpYXRlbHkgKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfQ1VDX0xPQUQJMHgwNTAwCS8qIExvYWQgQnVzIHRocm90dGxlIHRpbWVycyAqLworI2RlZmluZQlJNTk2X1NDQl9DVUNfTE9BRElNTQkweDA2MDAJLyogTG9hZCBCdXMgdGhyb3R0bGUgdGltZXJzLCBub3cgKi8KKworI2RlZmluZQlJNTk2X1NDQl9SVUMJCTB4MDA3MAkvKiBSRUNFSVZFIFVOSVQgQ09NTUFORFMgKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfUlVDX05PUAkweDAwMDAJLyogTm8gb3BlcmF0aW9uICovCisjZGVmaW5lCUk1OTZfU0NCX1JVQ19TVEFSVAkweDAwMTAJLyogU3RhcnQgcmVjZXB0aW9uICovCisjZGVmaW5lCUk1OTZfU0NCX1JVQ19SRVNVTUUJMHgwMDIwCS8qIFJlc3VtZSByZWNlcHRpb24gKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfUlVDX1NVU1BFTkQJMHgwMDMwCS8qIFN1c3BlbmQgcmVjZXB0aW9uICovCisjZGVmaW5lCUk1OTZfU0NCX1JVQ19BQk9SVAkweDAwNDAJLyogQWJvcnQgcmVjZXB0aW9uICovCisKKyNkZWZpbmUJSTU5Nl9TQ0JfUkVTRVQJCTB4MDA4MAkvKiBIYXJkIHJlc2V0IGNoaXAgKi8KKworCS8qIHN0YXR1cyBoYWxmd29yZCB2YWx1ZXMgKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfU1RBVAkJMHhGMDAwCS8qIFNUQVRVUyAqLworI2RlZmluZQlJNTk2X1NDQl9DWAkJMHg4MDAwCS8qIGNvbW1hbmQgY29tcGxldGlvbiAqLworI2RlZmluZQlJNTk2X1NDQl9GUgkJMHg0MDAwCS8qIHJlY2VpdmVkIGZyYW1lICovCisjZGVmaW5lCUk1OTZfU0NCX0NOQQkJMHgyMDAwCS8qIGNvbW1hbmQgdW5pdCBub3QgYWN0aXZlICovCisjZGVmaW5lCUk1OTZfU0NCX1JOUgkJMHgxMDAwCS8qIHJjdiB1bml0IG5vdCByZWFkeSAqLworCisjZGVmaW5lCUk1OTZfU0NCX0NVUwkJMHgwNzAwCS8qIENPTU1BTkQgVU5JVCBTVEFUVVMgKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfQ1VTX0lETEUJMHgwMDAwCS8qIElkbGUgKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfQ1VTX1NVU1BFTkRFRAkweDAxMDAJLyogU3VzcGVuZGVkICovCisjZGVmaW5lCUk1OTZfU0NCX0NVU19BQ1RJVkUJMHgwMjAwCS8qIEFjdGl2ZSAqLworCisjZGVmaW5lCUk1OTZfU0NCX1JVUwkJMHgwMEYwCS8qIFJFQ0VJVkUgVU5JVCBTVEFUVVMgKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfUlVTX0lETEUJMHgwMDAwCS8qIElkbGUgKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfUlVTX1NVU1BFTkRFRAkweDAwMTAJLyogU3VzcGVuZGVkICovCisjZGVmaW5lCUk1OTZfU0NCX1JVU19OT1JFUwkweDAwMjAJLyogTm8gUmVzb3VyY2VzICovCisjZGVmaW5lCUk1OTZfU0NCX1JVU19SRUFEWQkweDAwNDAJLyogUmVhZHkgKi8KKyNkZWZpbmUJSTU5Nl9TQ0JfUlVTX05PUkJEUwkweDAwODAJLyogTm8gbW9yZSBSQkRzIG1vZGlmaWVyICovCisKKyNkZWZpbmUJSTU5Nl9TQ0JfTE9BREVECQkweDAwMDgJLyogQnVzIHRpbWVycyBsb2FkZWQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCQkJCQkJCQkJKi8KKy8qCUk1OTZfSVNDUDoJSW50ZXJtZWRpYXRlIFN5c3RlbSBDb25maWd1cmF0aW9uIFB0ciAocCA0LTI2KQkqLworLyoJCQkJCQkJCQkqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgdm9sYXRpbGUgc3RydWN0Cit7CisJdWxvbmcJCWJ1c3k7CS8qIFNldCB0byAxOyBJNTk2IGNsZWFycyBpdCB3aGVuIHNjYnAgaXMgcmVhZCAqLworCUk1OTZfU0NCCSpzY2JwOworfSBJNTk2X0lTQ1A7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkJCQkJCQkJCSovCisvKglJNTk2X1NDUDoJU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciAocC4gNC0yMykJCSovCisvKgkJCQkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QKK3sKKwl1bG9uZwkJc3lzYnVzOwkKKwl1bG9uZwkJZHVtbXk7CisJSTU5Nl9JU0NQCSppc2NwcDsKK30gSTU5Nl9TQ1A7CisKKwkvKiAuc3lzYnVzIHZhbHVlcyAqLworI2RlZmluZSBJNTk2X1NDUF9SRVNFUlZFRAkweDQwMDAwMAkvKiBSZXNlcnZlZCBiaXRzIG11c3QgYmUgc2V0ICovCisjZGVmaW5lIEk1OTZfU0NQX0lOVExPVwkJMHgyMDAwMDAJLyogSW50ci4gUG9sYXJpdHkgYWN0aXZlIGxvdyAqLworI2RlZmluZSBJNTk2X1NDUF9JTlRISUdICTAJCS8qIEludHIuIFBvbGFyaXR5IGFjdGl2ZSBoaWdoICovCisjZGVmaW5lIEk1OTZfU0NQX0xPQ0tESVMJMHgxMDAwMDAJLyogTG9jayBGdW5jdGlvbiBkaXNhYmxlZCAqLworI2RlZmluZSBJNTk2X1NDUF9MT0NLRU4JCTAJCS8qIExvY2sgRnVuY3Rpb24gZW5hYmxlZCAqLworI2RlZmluZSBJNTk2X1NDUF9FVEhST1RUTEUJMHgwODAwMDAJLyogRXh0ZXJuYWwgQnVzIFRocm90dGxlICovCisjZGVmaW5lIEk1OTZfU0NQX0lUSFJPVFRMRQkwCQkvKiBJbnRlcm5hbCBCdXMgVGhyb3R0bGUgKi8KKyNkZWZpbmUgSTU5Nl9TQ1BfTElORUFSCQkweDA0MDAwMAkvKiBMaW5lYXIgTW9kZSAqLworI2RlZmluZSBJNTk2X1NDUF9TRUdNRU5URUQJMHgwMjAwMDAJLyogU2VnbWVudGVkIE1vZGUgKi8KKyNkZWZpbmUgSTU5Nl9TQ1BfODI1ODYJCTB4MDAwMDAwCS8qIDgyNTg2IE1vZGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RncnNfcGx4OTA2MC5oIGIvZHJpdmVycy9uZXQvZGdyc19wbHg5MDYwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg4OGFlMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2RncnNfcGx4OTA2MC5oCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICoJUExYIDkwNjAgUENJIEludGVyZmFjZSBjaGlwCisgKi8KKworLyoKKyAqCVBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycywgc2FtZSBvZmZzZXQgb24gbG9jYWwgYW5kIFBDSSBzaWRlcywKKyAqCWJ1dCBvbiBQQ0kgc2lkZSwgbXVzdCB1c2UgUENJIEJJT1MgY2FsbHMgdG8gcmVhZC93cml0ZS4KKyAqLworI2RlZmluZQlQQ0lfUExYUkVHU19CQVNFX0FERFIJMHgxMAorCisjZGVmaW5lCVBDSV9QTFhSRUdTX0lPX0FERFIJMHgxNAorCisjZGVmaW5lCVBDSV9TUEFDRTBfQkFTRV9BRERSCTB4MTgKKworI2RlZmluZQlQQ0lfUk9NX0JBU0VfQUREUgkweDMwCisjCWRlZmluZSBQQ0lfUk9NX0VOQUJMRUQJCTB4MDAwMDAwMDEKKworI2RlZmluZQlQQ0lfSU5UX0xJTkUJCTB4M0MKKworLyoKKyAqCVJlZ2lzdGVycyBhY2Nlc3NpYmxlIGRpcmVjdGx5IGZyb20gUENJIGFuZCBsb2NhbCBzaWRlLgorICoJT2Zmc2V0IGlzIGZyb20gUENJIHNpZGUuICBBZGQgUExYX0xDTF9PRkZTRVQgZm9yIGxvY2FsIGFkZHJlc3MuCisgKi8KKyNkZWZpbmUJUExYX0xDTF9PRkZTRVQJMHg4MAkvKiBPZmZzZXQgb2YgcmVncyBmcm9tIGxvY2FsIHNpZGUgKi8KKworLyoKKyAqCUxvY2FsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUJUExYX1NQQUNFMF9SQU5HRQkweDAwCS8qIFJhbmdlIGZvciBQQ0kgdG8gTGNsIEFkZHIgU3BhY2UgMCAqLworI2RlZmluZQlQTFhfU1BBQ0UwX0JBU0VfQUREUgkweDA0CS8qIExjbCBCYXNlIGFkZHJlc3MgcmVtYXAgKi8KKworI2RlZmluZQlQTFhfUk9NX1JBTkdFCQkweDEwCS8qIFJhbmdlIGZvciBleHBhbnNpb24gUk9NIChETUEpICovCisjZGVmaW5lCVBMWF9ST01fQkFTRV9BRERSCTB4MTQJLyogTGNsIGJhc2UgYWRkcmVzcyByZW1hcCBmb3IgUk9NICovCisKKyNkZWZpbmUJUExYX0JVU19SRUdJT04JCTB4MTgJLyogQnVzIFJlZ2lvbiBEZXNjcmlwdG9ycyAqLworCisvKgorICoJU2hhcmVkIFJ1biBUaW1lIFJlZ2lzdGVycworICovCisjZGVmaW5lCVBMWF9NQk9YMAkJMHg0MAorI2RlZmluZQlQTFhfTUJPWDEJCTB4NDQKKyNkZWZpbmUJUExYX01CT1gyCQkweDQ4CisjZGVmaW5lCVBMWF9NQk9YMwkJMHg0QworI2RlZmluZQlQTFhfTUJPWDQJCTB4NTAKKyNkZWZpbmUJUExYX01CT1g1CQkweDU0CisjZGVmaW5lCVBMWF9NQk9YNgkJMHg1OAorI2RlZmluZQlQTFhfTUJPWDcJCTB4NUMKKworI2RlZmluZQlQTFhfUENJMkxDTF9ET09SQkVMTAkweDYwCisKKyNkZWZpbmUJUExYX0xDTDJQQ0lfRE9PUkJFTEwJMHg2NAorCisjZGVmaW5lCVBMWF9JTlRfQ1NSCQkweDY4CS8qIEludGVycnVwdCBDb250cm9sL1N0YXR1cyAqLworIwlkZWZpbmUJUExYX0xTRVJSX0VOQUJMRQkweDAwMDAwMDAxCisjCWRlZmluZQlQTFhfTFNFUlJfUEUJCTB4MDAwMDAwMDIKKyMJZGVmaW5lCVBMWF9TRVJSCQkweDAwMDAwMDA0CisjCXVuZGVmICBQTFhfVU5VU0VEIC8qCQkweDAwMDAwMDA4CQkJKi8KKyMJdW5kZWYgIFBMWF9VTlVTRUQgLyoJCTB4MDAwMDAwMTAJCQkqLworIwl1bmRlZiAgUExYX1VOVVNFRCAvKgkJMHgwMDAwMDAyMAkJCSovCisjCXVuZGVmICBQTFhfVU5VU0VEIC8qCQkweDAwMDAwMDQwCQkJKi8KKyMJdW5kZWYgIFBMWF9VTlVTRUQgLyoJCTB4MDAwMDAwODAJCQkqLworIwlkZWZpbmUgUExYX1BDSV9JRQkJMHgwMDAwMDEwMAorIwlkZWZpbmUJUExYX1BDSV9ET09SQkVMTF9JRQkweDAwMDAwMjAwCisjCWRlZmluZQlQTFhfUENJX0FCT1JUX0lFCTB4MDAwMDA0MDAKKyMJZGVmaW5lCVBMWF9QQ0lfTE9DQUxfSUUJMHgwMDAwMDgwMAorIwlkZWZpbmUJUExYX1JFVFJZX0FCT1JUX0VOQUJMRQkweDAwMDAxMDAwCisjCWRlZmluZQlQTFhfUENJX0RPT1JCRUxMX0lOVAkweDAwMDAyMDAwCisjCWRlZmluZQlQTFhfUENJX0FCT1JUX0lOVAkweDAwMDA0MDAwCisjCWRlZmluZQlQTFhfUENJX0xPQ0FMX0lOVAkweDAwMDA4MDAwCisjCWRlZmluZQlQTFhfTENMX0lFCQkweDAwMDEwMDAwCisjCWRlZmluZQlQTFhfTENMX0RPT1JCRUxMX0lFCTB4MDAwMjAwMDAKKyMJZGVmaW5lCVBMWF9MQ0xfRE1BMF9JRQkJMHgwMDA0MDAwMAorIwlkZWZpbmUJUExYX0xDTF9ETUExX0lFCQkweDAwMDgwMDAwCisjCWRlZmluZQlQTFhfTENMX0RPT1JCRUxMX0lOVAkweDAwMTAwMDAwCisjCWRlZmluZQlQTFhfTENMX0RNQTBfSU5UCTB4MDAyMDAwMDAKKyMJZGVmaW5lCVBMWF9MQ0xfRE1BMV9JTlQJMHgwMDQwMDAwMAorIwlkZWZpbmUJUExYX0xDTF9CSVNUX0lOVAkweDAwODAwMDAwCisjCWRlZmluZQlQTFhfQk1fRElSRUNUXwkJMHgwMTAwMDAwMAorIwlkZWZpbmUJUExYX0JNX0RNQTBfCQkweDAyMDAwMDAwCisjCWRlZmluZQlQTFhfQk1fRE1BMV8JCTB4MDQwMDAwMDAKKyMJZGVmaW5lCVBMWF9CTV9BQk9SVF8JCTB4MDgwMDAwMDAKKyMJdW5kZWYgIFBMWF9VTlVTRUQgLyoJCTB4MTAwMDAwMDAJCQkqLworIwl1bmRlZiAgUExYX1VOVVNFRCAvKgkJMHgyMDAwMDAwMAkJCSovCisjCXVuZGVmICBQTFhfVU5VU0VEIC8qCQkweDQwMDAwMDAwCQkJKi8KKyMJdW5kZWYgIFBMWF9VTlVTRUQgLyoJCTB4ODAwMDAwMDAJCQkqLworCisjZGVmaW5lCVBMWF9NSVNDX0NTUgkJMHg2YwkvKiBFRVBST00sUENJLFVzZXIsSW5pdCBDb250cm9sL1N0YXR1cyovCisjCWRlZmluZSBQTFhfVVNFUk9VVAkJMHgwMDAxMDAwMAorIwlkZWZpbmUgUExYX1VTRVJJTgkJMHgwMDAyMDAwMAorIwlkZWZpbmUgUExYX0VFQ0sJCQkweDAxMDAwMDAwCisjCWRlZmluZSBQTFhfRUVDUwkJCTB4MDIwMDAwMDAKKyMJZGVmaW5lIFBMWF9FRVdECQkJMHgwNDAwMDAwMAorIwlkZWZpbmUgUExYX0VFUkQJCQkweDA4MDAwMDAwCisKKy8qCisgKglETUEgcmVnaXN0ZXJzLiAgT2Zmc2V0IGlzIGZyb20gbG9jYWwgc2lkZQorICovCisjZGVmaW5lCVBMWF9ETUEwX01PREUJCTB4MTAwCisjCWRlZmluZSBQTFhfRE1BX01PREVfV0lEVEgzMgkweDAwMDAwMDAzCisjCWRlZmluZSBQTFhfRE1BX01PREVfV0FJVFNUQVRFUyhYKQkoKFgpPDwyKQorIwlkZWZpbmUgUExYX0RNQV9NT0RFX05PUkVBRFkJMHgwMDAwMDAwMAorIwlkZWZpbmUgUExYX0RNQV9NT0RFX1JFQURZCTB4MDAwMDAwNDAKKyMJZGVmaW5lIFBMWF9ETUFfTU9ERV9OT0JURVJNCTB4MDAwMDAwMDAKKyMJZGVmaW5lIFBMWF9ETUFfTU9ERV9CVEVSTQkweDAwMDAwMDgwCisjCWRlZmluZSBQTFhfRE1BX01PREVfTk9CVVJTVAkweDAwMDAwMDAwCisjCWRlZmluZSBQTFhfRE1BX01PREVfQlVSU1QJMHgwMDAwMDEwMAorIwlkZWZpbmUgUExYX0RNQV9NT0RFX05PQ0hBSU4JMHgwMDAwMDAwMAorIwlkZWZpbmUgUExYX0RNQV9NT0RFX0NIQUlOCTB4MDAwMDAyMDAKKyMJZGVmaW5lIFBMWF9ETUFfTU9ERV9ET05FX0lFCTB4MDAwMDA0MDAKKyMJZGVmaW5lIFBMWF9ETUFfTU9ERV9BRERSX0hPTEQJMHgwMDAwMDgwMAorCisjZGVmaW5lCVBMWF9ETUEwX1BDSV9BRERSCTB4MTA0CisJCQkJCS8qIG5vbi1jaGFpbmluZyBtb2RlIFBDSSBhZGRyZXNzICovCisKKyNkZWZpbmUJUExYX0RNQTBfTENMX0FERFIJMHgxMDgKKwkJCQkJLyogbm9uLWNoYWluaW5nIG1vZGUgbG9jYWwgYWRkcmVzcyAqLworCisjZGVmaW5lCVBMWF9ETUEwX1NJWkUJCTB4MTBDCisJCQkJCS8qIG5vbi1jaGFpbmluZyBtb2RlIGxlbmd0aCAqLworCisjZGVmaW5lCVBMWF9ETUEwX0RFU0NSSVBUT1IJMHgxMTAKKyMJZGVmaW5lCVBMWF9ETUFfREVTQ19FT0MJMHgwMDAwMDAwMgorIwlkZWZpbmUJUExYX0RNQV9ERVNDX1RDX0lFCTB4MDAwMDAwMDQKKyMJZGVmaW5lCVBMWF9ETUFfREVTQ19UT19IT1NUCTB4MDAwMDAwMDgKKyMJZGVmaW5lCVBMWF9ETUFfREVTQ19UT19CT0FSRAkweDAwMDAwMDAwCisjCWRlZmluZQlQTFhfRE1BX0RFU0NfTkVYVEFERFIJMHhGRkZGZmZmMAorCisjZGVmaW5lCVBMWF9ETUExX01PREUJCTB4MTE0CisjZGVmaW5lCVBMWF9ETUExX1BDSV9BRERSCTB4MTE4CisjZGVmaW5lCVBMWF9ETUExX0xDTF9BRERSCTB4MTFDCisjZGVmaW5lCVBMWF9ETUExX1NJWkUJCTB4MTEwCisjZGVmaW5lCVBMWF9ETUExX0RFU0NSSVBUT1IJMHgxMjQKKworI2RlZmluZQlQTFhfRE1BX0NTUgkJMHgxMjgKKyMJZGVmaW5lIFBMWF9ETUFfQ1NSXzBfRU5BQkxFCTB4MDAwMDAwMDEKKyMJZGVmaW5lIFBMWF9ETUFfQ1NSXzBfU1RBUlQJMHgwMDAwMDAwMgorIwlkZWZpbmUgUExYX0RNQV9DU1JfMF9BQk9SVAkweDAwMDAwMDA0CisjCWRlZmluZSBQTFhfRE1BX0NTUl8wX0NMUl9JTlRSCTB4MDAwMDAwMDgKKyMJZGVmaW5lIFBMWF9ETUFfQ1NSXzBfRE9ORQkweDAwMDAwMDEwCisjCWRlZmluZSBQTFhfRE1BX0NTUl8xX0VOQUJMRQkweDAwMDAwMTAwCisjCWRlZmluZSBQTFhfRE1BX0NTUl8xX1NUQVJUCTB4MDAwMDAyMDAKKyMJZGVmaW5lIFBMWF9ETUFfQ1NSXzFfQUJPUlQJMHgwMDAwMDQwMAorIwlkZWZpbmUgUExYX0RNQV9DU1JfMV9DTFJfSU5UUgkweDAwMDAwODAwCisjCWRlZmluZSBQTFhfRE1BX0NTUl8xX0RPTkUJMHgwMDAwMTAwMAorCisjZGVmaW5lCVBMWF9ETUFfQVJCMAkJMHgxMkMKKyMJZGVmaW5lIFBMWF9ETUFfQVJCMF9MQVRFTkNZX1QJMHgwMDAwMDBGRgorIwlkZWZpbmUgUExYX0RNQV9BUkIwX1BBVVNFX1QJMHgwMDAwRkYwMAorIwlkZWZpbmUgUExYX0RNQV9BUkIwX0xBVEVOQ1lfRU4JMHgwMDAxMDAwMAorIwlkZWZpbmUgUExYX0RNQV9BUkIwX1BBVVNFX0VOCTB4MDAwMjAwMDAKKyMJZGVmaW5lIFBMWF9ETUFfQVJCMF9CUkVRX0VOCTB4MDAwNDAwMDAKKyMJZGVmaW5lIFBMWF9ETUFfQVJCMF9QUkkJCTB4MDAxODAwMDAKKyMJZGVmaW5lIFBMWF9ETUFfQVJCMF9QUklfUk9VTkQJMHgwMDAwMDAwMAorIwlkZWZpbmUgUExYX0RNQV9BUkIwX1BSSV8wCTB4MDAwODAwMDAKKyMJZGVmaW5lIFBMWF9ETUFfQVJCMF9QUklfMQkweDAwMTAwMDAwCisKKyNkZWZpbmUJUExYX0RNQV9BUkIxCQkweDEzMAorCQkJCQkJLyogQ2hhbiAwOiBGSUZPIERFUFRIPTE2ICovCisjCWRlZmluZSBQTFhfRE1BX0FSQjFfMF9QMkxfTFdfVFJJRyhYKQkoICgoWCkmMTUpIDw8ICAwICkKKyMJZGVmaW5lIFBMWF9ETUFfQVJCMV8wX0wyUF9MUl9UUklHKFgpCSggKChYKSYxNSkgPDwgIDQgKQorIwlkZWZpbmUgUExYX0RNQV9BUkIxXzBfTDJQX1BXX1RSSUcoWCkJKCAoKFgpJjE1KSA8PCAgOCApCisjCWRlZmluZSBQTFhfRE1BX0FSQjFfMF9QMkxfUFJfVFJJRyhYKQkoICgoWCkmMTUpIDw8IDEyICkKKwkJCQkJCS8qIENoYW4gMTogRklGTyBERVBUSD04ICovCisjCWRlZmluZSBQTFhfRE1BX0FSQjFfMV9QMkxfTFdfVFJJRyhYKQkoICgoWCkmIDcpIDw8IDE2ICkKKyMJZGVmaW5lIFBMWF9ETUFfQVJCMV8xX0wyUF9MUl9UUklHKFgpCSggKChYKSYgNykgPDwgMjAgKQorIwlkZWZpbmUgUExYX0RNQV9BUkIxXzFfTDJQX1BXX1RSSUcoWCkJKCAoKFgpJiA3KSA8PCAyNCApCisjCWRlZmluZSBQTFhfRE1BX0FSQjFfMV9QMkxfUFJfVFJJRyhYKQkoICgoWCkmIDcpIDw8IDI4ICkKKwordHlwZWRlZiBzdHJ1Y3QgX2RtYWNoYWluCit7CisJdWxvbmcJCXBjaWFkZHI7CisJdWxvbmcJCWxjbGFkZHI7CisJdWxvbmcJCWxlbjsKKwl1bG9uZwkJbmV4dDsKK30gRE1BQ0hBSU47CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kbDJrLmMgYi9kcml2ZXJzL25ldC9kbDJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE0MmI3YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2RsMmsuYwpAQCAtMCwwICsxLDE4NzIgQEAKKy8qICBELUxpbmsgREwyMDAwLWJhc2VkIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlciBMaW51eCBkcml2ZXIgKi8KKy8qCisgICAgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyIGJ5IEQtTGluayBDb3Jwb3JhdGlvbgorICAgIFdyaXR0ZW4gYnkgRWR3YXJkIFBlbmcuPGVkd2FyZF9wZW5nQGRsaW5rLmNvbS50dz4KKyAgICBDcmVhdGVkIDAzLU1heS0yMDAxLCBiYXNlIG9uIExpbnV4JyBzdW5kYW5jZS5jLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyovCisvKgorICAgIFJldgkJRGF0ZQkJRGVzY3JpcHRpb24KKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIDAuMDEJMjAwMS8wNS8wMwlDcmVhdGVkIERMMjAwMC1iYXNlZCBsaW51eCBkcml2ZXIKKyAgICAwLjAyCTIwMDEvMDUvMjEJQWRkZWQgVkxBTiBhbmQgaGFyZHdhcmUgY2hlY2tzdW0gc3VwcG9ydC4KKyAgICAxLjAwCTIwMDEvMDYvMjYJQWRkZWQganVtYm8gZnJhbWUgc3VwcG9ydC4KKyAgICAxLjAxCTIwMDEvMDgvMjEJQWRkZWQgdHdvIHBhcmFtZXRlcnMsIHJ4X2NvYWxlc2NlIGFuZCByeF90aW1lb3V0LgorICAgIDEuMDIJMjAwMS8xMC8wOAlTdXBwb3J0ZWQgZmliZXIgbWVkaWEuCisgICAgCQkJCUFkZGVkIGZsb3cgY29udHJvbCBwYXJhbWV0ZXJzLgorICAgIDEuMDMJMjAwMS8xMC8xMglDaGFuZ2VkIHRoZSBkZWZhdWx0IG1lZGlhIHRvIDEwMDBtYnBzX2ZkIGZvciAKKyAgICAJCQkJdGhlIGZpYmVyIGRldmljZXMuCisgICAgMS4wNAkyMDAxLzExLzA4CUZpeGVkIFR4IHN0b3BwZWQgd2hlbiB0eCB2ZXJ5IGJ1c3kuCisgICAgMS4wNQkyMDAxLzExLzIyCUZpeGVkIFR4IHN0b3BwZWQgd2hlbiB1bmlkaXJlY3Rpb25hbCB0eCBidXN5LgorICAgIDEuMDYJMjAwMS8xMi8xMwlGaXhlZCBkaXNjb25uZWN0IGJ1ZyBhdCAxME1icHMgbW9kZS4KKyAgICAJCQkJRml4ZWQgdHhfZnVsbCBmbGFnIGluY29ycmVjdC4KKwkJCQlBZGRlZCB0eF9jb2FsZXNjZSBwYXJhbXRlci4KKyAgICAxLjA3CTIwMDIvMDEvMDMJRml4ZWQgbWlzY291bnQgb2YgUlggZnJhbWUgZXJyb3IuCisgICAgMS4wOAkyMDAyLzAxLzE3CUZpeGVkIHRoZSBtdWx0aWNhc3QgYnVnLgorICAgIDEuMDkJMjAwMi8wMy8wNwlNb3ZlIHJ4LXBvbGwtbm93IHRvIHJlLWZpbGwgbG9vcC4JCisgICAgCQkJCUFkZGVkIHJpb190aW1lcigpIHRvIHdhdGNoIHJ4IGJ1ZmZlcnMuIAorICAgIDEuMTAJMjAwMi8wNC8xNglGaXhlZCBtaXNjb3VudCBvZiBjYXJyaWVyIGVycm9yLgorICAgIDEuMTEJMjAwMi8wNS8yMwlBZGRlZCBJU1Igc2NoZWR1bGUgc2NoZW1lCisgICAgCQkJCUZpeGVkIG1pc2NvdW50IG9mIHJ4IGZyYW1lIGVycm9yIGZvciBER0UtNTUwU1guCisgICAgCQkJCUZpeGVkIFZMQU4gYnVnLgorICAgIDEuMTIJMjAwMi8wNi8xMwlMb2NrIHR4X2NvYWxlc2NlPTEgb24gMTAvMTAwTWJwcyBtb2RlLgorICAgIDEuMTMJMjAwMi8wOC8xMwkxLiBGaXggZGlzY29ubmVjdGlvbiAobWFueSB0eDpjYXJyaWVyL3J4OmZyYW1lCisgICAgCQkJCSAgIGVycnMpIHdpdGggc29tZSBtYWluYm9hcmRzLgorICAgIAkJCQkyLiBVc2UgZGVmaW5pdGlvbiAiRFJWX05BTUUiICJEUlZfVkVSU0lPTiIgCisJCQkJICAgIkRSVl9SRUxEQVRFIiBmb3IgZmxleGliaWxpdHkuCQorICAgIDEuMTQJMjAwMi8wOC8xNAlTdXBwb3J0IGV0aHRvb2wuCQorICAgIDEuMTUJMjAwMi8wOC8yNwlDaGFuZ2VkIHRoZSBkZWZhdWx0IG1lZGlhIHRvIEF1dG8tTmVnb3RpYXRpb24KKwkJCQlmb3IgdGhlIGZpYmVyIGRldmljZXMuICAgIAorICAgIDEuMTYJMjAwMi8wOS8wNCAgICAgIE1vcmUgcG93ZXIgZG93biB0aW1lIGZvciBmaWJlciBkZXZpY2VzIGF1dG8tCisgICAgCQkJCW5lZ290aWF0aW9uLgorCQkJCUZpeCBkaXNjb25uZWN0IGJ1ZyBhZnRlciBpZnVwIGFuZCBpZmRvd24uCisgICAgMS4xNwkyMDAyLzEwLzAzCUZpeCBSTU9OIHN0YXRpc3RpY3Mgb3ZlcmZsb3cuIAorCQkJICAgICAJQWx3YXlzIHVzZSBJL08gbWFwcGluZyB0byBhY2Nlc3MgZWVwcm9tLCAKKwkJCQlhdm9pZCBzeXN0ZW0gZnJlZXppbmcgd2l0aCBzb21lIGNoaXBzZXRzLgorCisqLworI2RlZmluZSBEUlZfTkFNRQkiRC1MaW5rIERMMjAwMC1iYXNlZCBsaW51eCBkcml2ZXIiCisjZGVmaW5lIERSVl9WRVJTSU9OCSJ2MS4xN2EiCisjZGVmaW5lIERSVl9SRUxEQVRFCSIyMDAyLzEwLzA0IgorI2luY2x1ZGUgImRsMmsuaCIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorICAgICAgS0VSTl9JTkZPIERSVl9OQU1FICIgIiBEUlZfVkVSU0lPTiAiICIgRFJWX1JFTERBVEUgIlxuIjsJCisjZGVmaW5lIE1BWF9VTklUUyA4CitzdGF0aWMgaW50IG10dVtNQVhfVU5JVFNdOworc3RhdGljIGludCB2bGFuW01BWF9VTklUU107CitzdGF0aWMgaW50IGp1bWJvW01BWF9VTklUU107CitzdGF0aWMgY2hhciAqbWVkaWFbTUFYX1VOSVRTXTsKK3N0YXRpYyBpbnQgdHhfZmxvdz0tMTsKK3N0YXRpYyBpbnQgcnhfZmxvdz0tMTsKK3N0YXRpYyBpbnQgY29weV90aHJlc2g7CitzdGF0aWMgaW50IHJ4X2NvYWxlc2NlPTEwOwkvKiBSeCBmcmFtZSBjb3VudCBlYWNoIGludGVycnVwdCAqLworc3RhdGljIGludCByeF90aW1lb3V0PTIwMDsJLyogUnggRE1BIHdhaXQgdGltZSBpbiA2NDBucyBpbmNyZW1lbnRzICovCitzdGF0aWMgaW50IHR4X2NvYWxlc2NlPTE2OwkvKiBIVyB4bWl0IGNvdW50IGVhY2ggVHhETUFDb21wbGV0ZSAqLworCisKK01PRFVMRV9BVVRIT1IgKCJFZHdhcmQgUGVuZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OICgiRC1MaW5rIERMMjAwMC1iYXNlZCBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9wYXJhbV9hcnJheShtdHUsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkobWVkaWEsIGNoYXJwLCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheSh2bGFuLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGp1bWJvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKHR4X2Zsb3csIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocnhfZmxvdywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjb3B5X3RocmVzaCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyeF9jb2FsZXNjZSwgaW50LCAwKTsJLyogUnggZnJhbWUgY291bnQgZWFjaCBpbnRlcnJ1cHQgKi8KK21vZHVsZV9wYXJhbShyeF90aW1lb3V0LCBpbnQsIDApOwkvKiBSeCBETUEgd2FpdCB0aW1lIGluIDY0bnMgaW5jcmVtZW50cyAqLworbW9kdWxlX3BhcmFtKHR4X2NvYWxlc2NlLCBpbnQsIDApOyAvKiBIVyB4bWl0IGNvdW50IGVhY2ggVHhETUFDb21wbGV0ZSAqLworCisKKy8qIEVuYWJsZSB0aGUgZGVmYXVsdCBpbnRlcnJ1cHRzICovCisjZGVmaW5lIERFRkFVTFRfSU5UUiAoUnhETUFDb21wbGV0ZSB8IEhvc3RFcnJvciB8IEludFJlcXVlc3RlZCB8IFR4RE1BQ29tcGxldGV8IFwKKyAgICAgICBVcGRhdGVTdGF0cyB8IExpbmtFdmVudCkKKyNkZWZpbmUgRW5hYmxlSW50KCkgXAord3JpdGV3KERFRkFVTFRfSU5UUiwgaW9hZGRyICsgSW50RW5hYmxlKQorCitzdGF0aWMgaW50IG1heF9pbnRybG9vcCA9IDUwOworc3RhdGljIGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gMHg0MDsKKworc3RhdGljIGludCByaW9fb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCByaW9fdGltZXIgKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCByaW9fdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBhbGxvY19saXN0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc3RhcnRfeG1pdCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgcmlvX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCByaW9fZnJlZV90eCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlycSk7CitzdGF0aWMgdm9pZCB0eF9lcnJvciAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHR4X3N0YXR1cyk7CitzdGF0aWMgaW50IHJlY2VpdmVfcGFja2V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJpb19lcnJvciAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGludF9zdGF0dXMpOworc3RhdGljIGludCBjaGFuZ2VfbXR1IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSk7CitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZ2V0X3N0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgY2xlYXJfc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCByaW9faW9jdGwgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIGludCByaW9fY2xvc2UgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBmaW5kX21paXBoeSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHBhcnNlX2VlcHJvbSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHJlYWRfZWVwcm9tIChsb25nIGlvYWRkciwgaW50IGVlcF9hZGRyKTsKK3N0YXRpYyBpbnQgbWlpX3dhaXRfbGluayAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHdhaXQpOworc3RhdGljIGludCBtaWlfc2V0X21lZGlhIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbWlpX2dldF9tZWRpYSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG1paV9zZXRfbWVkaWFfcGNzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbWlpX2dldF9tZWRpYV9wY3MgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBtaWlfcmVhZCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyLCBpbnQgcmVnX251bSk7CitzdGF0aWMgaW50IG1paV93cml0ZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9hZGRyLCBpbnQgcmVnX251bSwKKwkJICAgICAgdTE2IGRhdGEpOworCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzOworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorcmlvX3Byb2JlMSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wOworCXN0YXRpYyBpbnQgY2FyZF9pZHg7CisJaW50IGNoaXBfaWR4ID0gZW50LT5kcml2ZXJfZGF0YTsKKwlpbnQgZXJyLCBpcnE7CisJbG9uZyBpb2FkZHI7CisJc3RhdGljIGludCB2ZXJzaW9uX3ByaW50ZWQ7CisJdm9pZCAqcmluZ19zcGFjZTsKKwlkbWFfYWRkcl90IHJpbmdfZG1hOworCisJaWYgKCF2ZXJzaW9uX3ByaW50ZWQrKykKKwkJcHJpbnRrICgiJXMiLCB2ZXJzaW9uKTsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlIChwZGV2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaXJxID0gcGRldi0+aXJxOworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMgKHBkZXYsICJkbDJrIik7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X2Rpc2FibGU7CisKKwlwY2lfc2V0X21hc3RlciAocGRldik7CisJZGV2ID0gYWxsb2NfZXRoZXJkZXYgKHNpemVvZiAoKm5wKSk7CisJaWYgKCFkZXYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X3JlczsKKwl9CisJU0VUX01PRFVMRV9PV05FUiAoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisjaWZkZWYgTUVNX01BUFBJTkcKKwlpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDEpOworCWlvYWRkciA9IChsb25nKSBpb3JlbWFwIChpb2FkZHIsIFJJT19JT19TSVpFKTsKKwlpZiAoIWlvYWRkcikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfZGV2OworCX0KKyNlbHNlCisJaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAwKTsKKyNlbmRpZgorCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCWRldi0+aXJxID0gaXJxOworCW5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlucC0+Y2hpcF9pZCA9IGNoaXBfaWR4OworCW5wLT5wZGV2ID0gcGRldjsKKwlzcGluX2xvY2tfaW5pdCAoJm5wLT50eF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCAoJm5wLT5yeF9sb2NrKTsKKworCS8qIFBhcnNlIG1hbnVhbCBjb25maWd1cmF0aW9uICovCisJbnAtPmFuX2VuYWJsZSA9IDE7CisJbnAtPnR4X2NvYWxlc2NlID0gMTsKKwlpZiAoY2FyZF9pZHggPCBNQVhfVU5JVFMpIHsKKwkJaWYgKG1lZGlhW2NhcmRfaWR4XSAhPSBOVUxMKSB7CisJCQlucC0+YW5fZW5hYmxlID0gMDsKKwkJCWlmIChzdHJjbXAgKG1lZGlhW2NhcmRfaWR4XSwgImF1dG8iKSA9PSAwIHx8CisJCQkgICAgc3RyY21wIChtZWRpYVtjYXJkX2lkeF0sICJhdXRvc2Vuc2UiKSA9PSAwIHx8IAorCQkJICAgIHN0cmNtcCAobWVkaWFbY2FyZF9pZHhdLCAiMCIpID09IDAgKSB7CisJCQkJbnAtPmFuX2VuYWJsZSA9IDI7IAorCQkJfSBlbHNlIGlmIChzdHJjbXAgKG1lZGlhW2NhcmRfaWR4XSwgIjEwMG1icHNfZmQiKSA9PSAwIHx8CisJCQkgICAgc3RyY21wIChtZWRpYVtjYXJkX2lkeF0sICI0IikgPT0gMCkgeworCQkJCW5wLT5zcGVlZCA9IDEwMDsKKwkJCQlucC0+ZnVsbF9kdXBsZXggPSAxOworCQkJfSBlbHNlIGlmIChzdHJjbXAgKG1lZGlhW2NhcmRfaWR4XSwgIjEwMG1icHNfaGQiKSA9PSAwCisJCQkJICAgfHwgc3RyY21wIChtZWRpYVtjYXJkX2lkeF0sICIzIikgPT0gMCkgeworCQkJCW5wLT5zcGVlZCA9IDEwMDsKKwkJCQlucC0+ZnVsbF9kdXBsZXggPSAwOworCQkJfSBlbHNlIGlmIChzdHJjbXAgKG1lZGlhW2NhcmRfaWR4XSwgIjEwbWJwc19mZCIpID09IDAgfHwKKwkJCQkgICBzdHJjbXAgKG1lZGlhW2NhcmRfaWR4XSwgIjIiKSA9PSAwKSB7CisJCQkJbnAtPnNwZWVkID0gMTA7CisJCQkJbnAtPmZ1bGxfZHVwbGV4ID0gMTsKKwkJCX0gZWxzZSBpZiAoc3RyY21wIChtZWRpYVtjYXJkX2lkeF0sICIxMG1icHNfaGQiKSA9PSAwIHx8CisJCQkJICAgc3RyY21wIChtZWRpYVtjYXJkX2lkeF0sICIxIikgPT0gMCkgeworCQkJCW5wLT5zcGVlZCA9IDEwOworCQkJCW5wLT5mdWxsX2R1cGxleCA9IDA7CisJCQl9IGVsc2UgaWYgKHN0cmNtcCAobWVkaWFbY2FyZF9pZHhdLCAiMTAwMG1icHNfZmQiKSA9PSAwIHx8CisJCQkJIHN0cmNtcCAobWVkaWFbY2FyZF9pZHhdLCAiNiIpID09IDApIHsKKwkJCQlucC0+c3BlZWQ9MTAwMDsKKwkJCQlucC0+ZnVsbF9kdXBsZXg9MTsKKwkJCX0gZWxzZSBpZiAoc3RyY21wIChtZWRpYVtjYXJkX2lkeF0sICIxMDAwbWJwc19oZCIpID09IDAgfHwKKwkJCQkgc3RyY21wIChtZWRpYVtjYXJkX2lkeF0sICI1IikgPT0gMCkgeworCQkJCW5wLT5zcGVlZCA9IDEwMDA7CisJCQkJbnAtPmZ1bGxfZHVwbGV4ID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJbnAtPmFuX2VuYWJsZSA9IDE7CisJCQl9CisJCX0KKwkJaWYgKGp1bWJvW2NhcmRfaWR4XSAhPSAwKSB7CisJCQlucC0+anVtYm8gPSAxOworCQkJZGV2LT5tdHUgPSBNQVhfSlVNQk87CisJCX0gZWxzZSB7CisJCQlucC0+anVtYm8gPSAwOworCQkJaWYgKG10dVtjYXJkX2lkeF0gPiAwICYmIG10dVtjYXJkX2lkeF0gPCBQQUNLRVRfU0laRSkKKwkJCQlkZXYtPm10dSA9IG10dVtjYXJkX2lkeF07CisJCX0KKwkJbnAtPnZsYW4gPSAodmxhbltjYXJkX2lkeF0gPiAwICYmIHZsYW5bY2FyZF9pZHhdIDwgNDA5NikgPworCQkgICAgdmxhbltjYXJkX2lkeF0gOiAwOworCQlpZiAocnhfY29hbGVzY2UgPiAwICYmIHJ4X3RpbWVvdXQgPiAwKSB7CisJCQlucC0+cnhfY29hbGVzY2UgPSByeF9jb2FsZXNjZTsKKwkJCW5wLT5yeF90aW1lb3V0ID0gcnhfdGltZW91dDsKKwkJCW5wLT5jb2FsZXNjZSA9IDE7CisJCX0KKwkJbnAtPnR4X2Zsb3cgPSAodHhfZmxvdyA9PSAwKSA/IDAgOiAxOworCQlucC0+cnhfZmxvdyA9IChyeF9mbG93ID09IDApID8gMCA6IDE7CisKKwkJaWYgKHR4X2NvYWxlc2NlIDwgMSkKKwkJCXR4X2NvYWxlc2NlID0gMTsKKwkJZWxzZSBpZiAodHhfY29hbGVzY2UgPiBUWF9SSU5HX1NJWkUtMSkKKwkJCXR4X2NvYWxlc2NlID0gVFhfUklOR19TSVpFIC0gMTsKKwl9CisJZGV2LT5vcGVuID0gJnJpb19vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJnN0YXJ0X3htaXQ7CisJZGV2LT5zdG9wID0gJnJpb19jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9ICZnZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdDsKKwlkZXYtPmRvX2lvY3RsID0gJnJpb19pb2N0bDsKKwlkZXYtPnR4X3RpbWVvdXQgPSAmcmlvX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisJZGV2LT5jaGFuZ2VfbXR1ID0gJmNoYW5nZV9tdHU7CisJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmV0aHRvb2xfb3BzKTsKKyNpZiAwCisJZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfSVBfQ1NVTTsKKyNlbmRpZgorCXBjaV9zZXRfZHJ2ZGF0YSAocGRldiwgZGV2KTsKKworCXJpbmdfc3BhY2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudCAocGRldiwgVFhfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKKwlpZiAoIXJpbmdfc3BhY2UpCisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCW5wLT50eF9yaW5nID0gKHN0cnVjdCBuZXRkZXZfZGVzYyAqKSByaW5nX3NwYWNlOworCW5wLT50eF9yaW5nX2RtYSA9IHJpbmdfZG1hOworCisJcmluZ19zcGFjZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50IChwZGV2LCBSWF9UT1RBTF9TSVpFLCAmcmluZ19kbWEpOworCWlmICghcmluZ19zcGFjZSkKKwkJZ290byBlcnJfb3V0X3VubWFwX3R4OworCW5wLT5yeF9yaW5nID0gKHN0cnVjdCBuZXRkZXZfZGVzYyAqKSByaW5nX3NwYWNlOworCW5wLT5yeF9yaW5nX2RtYSA9IHJpbmdfZG1hOworCisJLyogUGFyc2UgZWVwcm9tIGRhdGEgKi8KKwlwYXJzZV9lZXByb20gKGRldik7CisKKwkvKiBGaW5kIFBIWSBhZGRyZXNzICovCisJZXJyID0gZmluZF9taWlwaHkgKGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X3VubWFwX3J4OworCQorCS8qIEZpYmVyIGRldmljZT8gKi8KKwlucC0+cGh5X21lZGlhID0gKHJlYWR3KGlvYWRkciArIEFTSUNDdHJsKSAmIFBoeU1lZGlhKSA/IDEgOiAwOworCW5wLT5saW5rX3N0YXR1cyA9IDA7CisJLyogU2V0IG1lZGlhIGFuZCByZXNldCBQSFkgKi8KKwlpZiAobnAtPnBoeV9tZWRpYSkgeworCQkvKiBkZWZhdWx0IEF1dG8tTmVnb3RpYXRpb24gZm9yIGZpYmVyIGRlaXZpY2VzICovCisJIAlpZiAobnAtPmFuX2VuYWJsZSA9PSAyKSB7CisJCQlucC0+YW5fZW5hYmxlID0gMTsKKwkJfQorCQltaWlfc2V0X21lZGlhX3BjcyAoZGV2KTsKKwl9IGVsc2UgeworCQkvKiBBdXRvLU5lZ290aWF0aW9uIGlzIG1hbmRhdG9yeSBmb3IgMTAwMEJBU0UtVCwKKwkJICAgSUVFRSA4MDIuM2FiIEFubmV4IDI4RCBwYWdlIDE0ICovCisJCWlmIChucC0+c3BlZWQgPT0gMTAwMCkKKwkJCW5wLT5hbl9lbmFibGUgPSAxOworCQltaWlfc2V0X21lZGlhIChkZXYpOworCX0KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZucC0+cGNpX3Jldl9pZCk7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYgKGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X3VubWFwX3J4OworCisJY2FyZF9pZHgrKzsKKworCXByaW50ayAoS0VSTl9JTkZPICIlczogJXMsICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LCBJUlEgJWRcbiIsCisJCWRldi0+bmFtZSwgbnAtPm5hbWUsCisJCWRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sIGRldi0+ZGV2X2FkZHJbMl0sCisJCWRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0sIGlycSk7CisJaWYgKHR4X2NvYWxlc2NlID4gMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAidHhfY29hbGVzY2U6XHQlZCBwYWNrZXRzXG4iLCAKKwkJCQl0eF9jb2FsZXNjZSk7CisJaWYgKG5wLT5jb2FsZXNjZSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAicnhfY29hbGVzY2U6XHQlZCBwYWNrZXRzXG4iCisJCSAgICAgICBLRVJOX0lORk8gInJ4X3RpbWVvdXQ6IFx0JWQgbnNcbiIsIAorCQkJCW5wLT5yeF9jb2FsZXNjZSwgbnAtPnJ4X3RpbWVvdXQqNjQwKTsKKwlpZiAobnAtPnZsYW4pCisJCXByaW50ayhLRVJOX0lORk8gInZsYW4oaWQpOlx0JWRcbiIsIG5wLT52bGFuKTsKKwlyZXR1cm4gMDsKKworICAgICAgZXJyX291dF91bm1hcF9yeDoKKwlwY2lfZnJlZV9jb25zaXN0ZW50IChwZGV2LCBSWF9UT1RBTF9TSVpFLCBucC0+cnhfcmluZywgbnAtPnJ4X3JpbmdfZG1hKTsKKyAgICAgIGVycl9vdXRfdW5tYXBfdHg6CisJcGNpX2ZyZWVfY29uc2lzdGVudCAocGRldiwgVFhfVE9UQUxfU0laRSwgbnAtPnR4X3JpbmcsIG5wLT50eF9yaW5nX2RtYSk7CisgICAgICBlcnJfb3V0X2lvdW5tYXA6CisjaWZkZWYgTUVNX01BUFBJTkcKKwlpb3VubWFwICgodm9pZCAqKSBpb2FkZHIpOworCisgICAgICBlcnJfb3V0X2RldjoKKyNlbmRpZgorCWZyZWVfbmV0ZGV2IChkZXYpOworCisgICAgICBlcnJfb3V0X3JlczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zIChwZGV2KTsKKworICAgICAgZXJyX291dF9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZSAocGRldik7CisJcmV0dXJuIGVycjsKK30KKworaW50CitmaW5kX21paXBoeSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaSwgcGh5X2ZvdW5kID0gMDsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wOworCWxvbmcgaW9hZGRyOworCW5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlucC0+cGh5X2FkZHIgPSAxOworCisJZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisJCWludCBtaWlfc3RhdHVzID0gbWlpX3JlYWQgKGRldiwgaSwgMSk7CisJCWlmIChtaWlfc3RhdHVzICE9IDB4ZmZmZiAmJiBtaWlfc3RhdHVzICE9IDB4MDAwMCkgeworCQkJbnAtPnBoeV9hZGRyID0gaTsKKwkJCXBoeV9mb3VuZCsrOworCQl9CisJfQorCWlmICghcGh5X2ZvdW5kKSB7CisJCXByaW50ayAoS0VSTl9FUlIgIiVzOiBObyBNSUkgUEhZIGZvdW5kIVxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworfQorCitpbnQKK3BhcnNlX2VlcHJvbSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaSwgajsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXU4IHNyb21kYXRhWzI1Nl07CisJdTggKnBzaWI7CisJdTMyIGNyYzsKKwlQU1JPTV90IHBzcm9tID0gKFBTUk9NX3QpIHNyb21kYXRhOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaW50IGNpZCwgbmV4dDsKKworI2lmZGVmCU1FTV9NQVBQSU5HCisJaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0IChucC0+cGRldiwgMCk7CisjZW5kaWYKKwkvKiBSZWFkIGVlcHJvbSAqLworCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgeworCQkoKHUxNiAqKSBzcm9tZGF0YSlbaV0gPSBsZTE2X3RvX2NwdSAocmVhZF9lZXByb20gKGlvYWRkciwgaSkpOworCX0KKyNpZmRlZglNRU1fTUFQUElORworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworI2VuZGlmCQorCS8qIENoZWNrIENSQyAqLworCWNyYyA9IH5ldGhlcl9jcmNfbGUgKDI1NiAtIDQsIHNyb21kYXRhKTsKKwlpZiAocHNyb20tPmNyYyAhPSBjcmMpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IEVFUFJPTSBkYXRhIENSQyBlcnJvci5cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBTZXQgTUFDIGFkZHJlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gcHNyb20tPm1hY19hZGRyW2ldOworCisJLyogUGFyc2UgU29mdHdhcmUgSW5mb21hdGlvbiBCbG9jayAqLworCWkgPSAweDMwOworCXBzaWIgPSAodTggKikgc3JvbWRhdGE7CisJZG8geworCQljaWQgPSBwc2liW2krK107CisJCW5leHQgPSBwc2liW2krK107CisJCWlmICgoY2lkID09IDAgJiYgbmV4dCA9PSAwKSB8fCAoY2lkID09IDB4ZmYgJiYgbmV4dCA9PSAweGZmKSkgeworCQkJcHJpbnRrIChLRVJOX0VSUiAiQ2VsbCBkYXRhIGVycm9yXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlzd2l0Y2ggKGNpZCkgeworCQljYXNlIDA6CS8qIEZvcm1hdCB2ZXJzaW9uICovCisJCQlicmVhazsKKwkJY2FzZSAxOgkvKiBFbmQgb2YgY2VsbCAqLworCQkJcmV0dXJuIDA7CisJCWNhc2UgMjoJLyogRHVwbGV4IFBvbGFyaXR5ICovCisJCQlucC0+ZHVwbGV4X3BvbGFyaXR5ID0gcHNpYltpXTsKKwkJCXdyaXRlYiAocmVhZGIgKGlvYWRkciArIFBoeUN0cmwpIHwgcHNpYltpXSwKKwkJCQlpb2FkZHIgKyBQaHlDdHJsKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CS8qIFdha2UgUG9sYXJpdHkgKi8KKwkJCW5wLT53YWtlX3BvbGFyaXR5ID0gcHNpYltpXTsKKwkJCWJyZWFrOworCQljYXNlIDk6CS8qIEFkYXB0ZXIgZGVzY3JpcHRpb24gKi8KKwkJCWogPSAobmV4dCAtIGkgPiAyNTUpID8gMjU1IDogbmV4dCAtIGk7CisJCQltZW1jcHkgKG5wLT5uYW1lLCAmKHBzaWJbaV0pLCBqKTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCWNhc2UgNToKKwkJY2FzZSA2OgorCQljYXNlIDc6CisJCWNhc2UgODoJLyogUmV2ZXJzZWQgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgkvKiBVbmtub3duIGNlbGwgKi8KKwkJCXJldHVybiAtMTsKKwkJfQorCQlpID0gbmV4dDsKKwl9IHdoaWxlICgxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CityaW9fb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpOworCXUxNiBtYWNjdHJsOworCQorCWkgPSByZXF1ZXN0X2lycSAoZGV2LT5pcnEsICZyaW9faW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChpKQorCQlyZXR1cm4gaTsKKwkKKwkvKiBSZXNldCBhbGwgbG9naWMgZnVuY3Rpb25zICovCisJd3JpdGV3IChHbG9iYWxSZXNldCB8IERNQVJlc2V0IHwgRklGT1Jlc2V0IHwgTmV0d29ya1Jlc2V0IHwgSG9zdFJlc2V0LAorCQlpb2FkZHIgKyBBU0lDQ3RybCArIDIpOworCW1kZWxheSgxMCk7CisJCisJLyogRGVidWdDdHJsIGJpdCA0LCA1LCA5IG11c3Qgc2V0ICovCisJd3JpdGVsIChyZWFkbCAoaW9hZGRyICsgRGVidWdDdHJsKSB8IDB4MDIzMCwgaW9hZGRyICsgRGVidWdDdHJsKTsKKworCS8qIEp1bWJvIGZyYW1lICovCisJaWYgKG5wLT5qdW1ibyAhPSAwKQorCQl3cml0ZXcgKE1BWF9KVU1CTysxNCwgaW9hZGRyICsgTWF4RnJhbWVTaXplKTsKKworCWFsbG9jX2xpc3QgKGRldik7CisKKwkvKiBHZXQgc3RhdGlvbiBhZGRyZXNzICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJd3JpdGViIChkZXYtPmRldl9hZGRyW2ldLCBpb2FkZHIgKyBTdGF0aW9uQWRkcjAgKyBpKTsKKworCXNldF9tdWx0aWNhc3QgKGRldik7CisJaWYgKG5wLT5jb2FsZXNjZSkgeworCQl3cml0ZWwgKG5wLT5yeF9jb2FsZXNjZSB8IG5wLT5yeF90aW1lb3V0IDw8IDE2LAorCQkJaW9hZGRyICsgUnhETUFJbnRDdHJsKTsKKwl9CisJLyogU2V0IFJJTyB0byBwb2xsIGV2ZXJ5IE4qMzIwbnNlYy4gKi8KKwl3cml0ZWIgKDB4MjAsIGlvYWRkciArIFJ4RE1BUG9sbFBlcmlvZCk7CisJd3JpdGViICgweGZmLCBpb2FkZHIgKyBUeERNQVBvbGxQZXJpb2QpOworCXdyaXRlYiAoMHgzMCwgaW9hZGRyICsgUnhETUFCdXJzdFRocmVzaCk7CisJd3JpdGViICgweDMwLCBpb2FkZHIgKyBSeERNQVVyZ2VudFRocmVzaCk7CisJd3JpdGVsICgweDAwMDdmZmZmLCBpb2FkZHIgKyBSbW9uU3RhdE1hc2spOworCS8qIGNsZWFyIHN0YXRpc3RpY3MgKi8KKwljbGVhcl9zdGF0cyAoZGV2KTsKKworCS8qIFZMQU4gc3VwcG9ydGVkICovCisJaWYgKG5wLT52bGFuKSB7CisJCS8qIHByaW9yaXR5IGZpZWxkIGluIFJ4RE1BSW50Q3RybCAgKi8KKwkJd3JpdGVsIChyZWFkbChpb2FkZHIgKyBSeERNQUludEN0cmwpIHwgMHg3IDw8IDEwLCAKKwkJCWlvYWRkciArIFJ4RE1BSW50Q3RybCk7CisJCS8qIFZMQU5JZCAqLworCQl3cml0ZXcgKG5wLT52bGFuLCBpb2FkZHIgKyBWTEFOSWQpOworCQkvKiBMZW5ndGgvVHlwZSBzaG91bGQgYmUgMHg4MTAwICovCisJCXdyaXRlbCAoMHg4MTAwIDw8IDE2IHwgbnAtPnZsYW4sIGlvYWRkciArIFZMQU5UYWcpOworCQkvKiBFbmFibGUgQXV0b1ZMQU51bnRhZ2dpbmcsIGJ1dCBkaXNhYmxlIEF1dG9WTEFOdGFnZ2luZy4KKwkJICAgVkxBTiBpbmZvcm1hdGlvbiB0YWdnZWQgYnkgVEZDJyBWSUQsIENGSSBmaWVsZHMuICovCisJCXdyaXRlbCAocmVhZGwgKGlvYWRkciArIE1BQ0N0cmwpIHwgQXV0b1ZMQU51bnRhZ2dpbmcsCisJCQlpb2FkZHIgKyBNQUNDdHJsKTsKKwl9CisKKwlpbml0X3RpbWVyICgmbnAtPnRpbWVyKTsKKwlucC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAxKkhaOworCW5wLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKwlucC0+dGltZXIuZnVuY3Rpb24gPSAmcmlvX3RpbWVyOworCWFkZF90aW1lciAoJm5wLT50aW1lcik7CisKKwkvKiBTdGFydCBUeC9SeCAqLworCXdyaXRlbCAocmVhZGwgKGlvYWRkciArIE1BQ0N0cmwpIHwgU3RhdHNFbmFibGUgfCBSeEVuYWJsZSB8IFR4RW5hYmxlLCAKKwkJCWlvYWRkciArIE1BQ0N0cmwpOworCQorCW1hY2N0cmwgPSAwOworCW1hY2N0cmwgfD0gKG5wLT52bGFuKSA/IEF1dG9WTEFOdW50YWdnaW5nIDogMDsKKwltYWNjdHJsIHw9IChucC0+ZnVsbF9kdXBsZXgpID8gRHVwbGV4U2VsZWN0IDogMDsKKwltYWNjdHJsIHw9IChucC0+dHhfZmxvdykgPyBUeEZsb3dDb250cm9sRW5hYmxlIDogMDsKKwltYWNjdHJsIHw9IChucC0+cnhfZmxvdykgPyBSeEZsb3dDb250cm9sRW5hYmxlIDogMDsKKwl3cml0ZXcobWFjY3RybCwJaW9hZGRyICsgTUFDQ3RybCk7CisKKwluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKwkKKwkvKiBFbmFibGUgZGVmYXVsdCBpbnRlcnJ1cHRzICovCisJRW5hYmxlSW50ICgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCAKK3Jpb190aW1lciAodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBlbnRyeTsKKwlpbnQgbmV4dF90aWNrID0gMSpIWjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5wLT5yeF9sb2NrLCBmbGFncyk7CisJLyogUmVjb3ZlciByeCByaW5nIGV4aGF1c3RlZCBlcnJvciAqLworCWlmIChucC0+Y3VyX3J4IC0gbnAtPm9sZF9yeCA+PSBSWF9SSU5HX1NJWkUpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVHJ5IHRvIHJlY292ZXIgcnggcmluZyBleGhhdXN0ZWQuLi5cbiIpOworCQkvKiBSZS1hbGxvY2F0ZSBza2J1ZmZzIHRvIGZpbGwgdGhlIGRlc2NyaXB0b3IgcmluZyAqLworCQlmb3IgKDsgbnAtPmN1cl9yeCAtIG5wLT5vbGRfcnggPiAwOyBucC0+b2xkX3J4KyspIHsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisJCQllbnRyeSA9IG5wLT5vbGRfcnggJSBSWF9SSU5HX1NJWkU7CisJCQkvKiBEcm9wcGVkIHBhY2tldHMgZG9uJ3QgbmVlZCB0byByZS1hbGxvY2F0ZSAqLworCQkJaWYgKG5wLT5yeF9za2J1ZmZbZW50cnldID09IE5VTEwpIHsKKwkJCQlza2IgPSBkZXZfYWxsb2Nfc2tiIChucC0+cnhfYnVmX3N6KTsKKwkJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQkJbnAtPnJ4X3JpbmdbZW50cnldLmZyYWdpbmZvID0gMDsKKwkJCQkJcHJpbnRrIChLRVJOX0lORk8KKwkJCQkJCSIlczogU3RpbGwgdW5hYmxlIHRvIHJlLWFsbG9jYXRlIFJ4IHNrYnVmZi4jJWRcbiIsCisJCQkJCQlkZXYtPm5hbWUsIGVudHJ5KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW5wLT5yeF9za2J1ZmZbZW50cnldID0gc2tiOworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLworCQkJCXNrYl9yZXNlcnZlIChza2IsIDIpOworCQkJCW5wLT5yeF9yaW5nW2VudHJ5XS5mcmFnaW5mbyA9CisJCQkJICAgIGNwdV90b19sZTY0IChwY2lfbWFwX3NpbmdsZQorCQkJCQkgKG5wLT5wZGV2LCBza2ItPnRhaWwsIG5wLT5yeF9idWZfc3osCisJCQkJCSAgUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCQl9CisJCQlucC0+cnhfcmluZ1tlbnRyeV0uZnJhZ2luZm8gfD0KKwkJCSAgICBjcHVfdG9fbGU2NCAobnAtPnJ4X2J1Zl9zeikgPDwgNDg7CisJCQlucC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzID0gMDsKKwkJfSAvKiBlbmQgZm9yICovCisJfSAvKiBlbmQgaWYgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmbnAtPnJ4X2xvY2ssIGZsYWdzKTsKKwlucC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBuZXh0X3RpY2s7CisJYWRkX3RpbWVyKCZucC0+dGltZXIpOworfQorCQorc3RhdGljIHZvaWQKK3Jpb190eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlwcmludGsgKEtFUk5fSU5GTyAiJXM6IFR4IHRpbWVkIG91dCAoJTQuNHgpLCBpcyBidWZmZXIgZnVsbD9cbiIsCisJCWRldi0+bmFtZSwgcmVhZGwgKGlvYWRkciArIFR4U3RhdHVzKSk7CisJcmlvX2ZyZWVfdHgoZGV2LCAwKTsKKwlkZXYtPmlmX3BvcnQgPSAwOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworfQorCisgLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgVHggYW5kIFJ4IGRlc2NyaXB0b3JzICovCitzdGF0aWMgdm9pZAorYWxsb2NfbGlzdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCW5wLT5jdXJfcnggPSBucC0+Y3VyX3R4ID0gMDsKKwlucC0+b2xkX3J4ID0gbnAtPm9sZF90eCA9IDA7CisJbnAtPnJ4X2J1Zl9zeiA9IChkZXYtPm10dSA8PSAxNTAwID8gUEFDS0VUX1NJWkUgOiBkZXYtPm10dSArIDMyKTsKKworCS8qIEluaXRpYWxpemUgVHggZGVzY3JpcHRvcnMsIFRGRExpc3RQdHIgbGVhdmVzIGluIHN0YXJ0X3htaXQoKS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJbnAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCW5wLT50eF9yaW5nW2ldLnN0YXR1cyA9IGNwdV90b19sZTY0IChURkREb25lKTsKKwkJbnAtPnR4X3JpbmdbaV0ubmV4dF9kZXNjID0gY3B1X3RvX2xlNjQgKG5wLT50eF9yaW5nX2RtYSArCisJCQkJCSAgICAgICgoaSsxKSVUWF9SSU5HX1NJWkUpICoKKwkJCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgbmV0ZGV2X2Rlc2MpKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIFJ4IGRlc2NyaXB0b3JzICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCW5wLT5yeF9yaW5nW2ldLm5leHRfZGVzYyA9IGNwdV90b19sZTY0IChucC0+cnhfcmluZ19kbWEgKworCQkJCQkJKChpICsgMSkgJSBSWF9SSU5HX1NJWkUpICoKKwkJCQkJCXNpemVvZiAoc3RydWN0IG5ldGRldl9kZXNjKSk7CisJCW5wLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJCW5wLT5yeF9yaW5nW2ldLmZyYWdpbmZvID0gMDsKKwkJbnAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJfQorCisJLyogQWxsb2NhdGUgdGhlIHJ4IGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJLyogQWxsb2NhdGVkIGZpeGVkIHNpemUgb2Ygc2tidWZmICovCisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiIChucC0+cnhfYnVmX3N6KTsKKwkJbnAtPnJ4X3NrYnVmZltpXSA9IHNrYjsKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQlwcmludGsgKEtFUk5fRVJSCisJCQkJIiVzOiBhbGxvY19saXN0OiBhbGxvY2F0ZSBSeCBidWZmZXIgZXJyb3IhICIsCisJCQkJZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQl9CisJCXNrYi0+ZGV2ID0gZGV2OwkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCXNrYl9yZXNlcnZlIChza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIuICovCisJCS8qIFJ1Ymljb24gbm93IHN1cHBvcnRzIDQwIGJpdHMgb2YgYWRkcmVzc2luZyBzcGFjZS4gKi8KKwkJbnAtPnJ4X3JpbmdbaV0uZnJhZ2luZm8gPQorCQkgICAgY3B1X3RvX2xlNjQgKCBwY2lfbWFwX3NpbmdsZSAoCisJCQkgCSAgbnAtPnBkZXYsIHNrYi0+dGFpbCwgbnAtPnJ4X2J1Zl9zeiwKKwkJCQkgIFBDSV9ETUFfRlJPTURFVklDRSkpOworCQlucC0+cnhfcmluZ1tpXS5mcmFnaW5mbyB8PSBjcHVfdG9fbGU2NCAobnAtPnJ4X2J1Zl9zeikgPDwgNDg7CisJfQorCisJLyogU2V0IFJGRExpc3RQdHIgKi8KKwl3cml0ZWwgKGNwdV90b19sZTMyIChucC0+cnhfcmluZ19kbWEpLCBkZXYtPmJhc2VfYWRkciArIFJGRExpc3RQdHIwKTsKKwl3cml0ZWwgKDAsIGRldi0+YmFzZV9hZGRyICsgUkZETGlzdFB0cjEpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50CitzdGFydF94bWl0IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRkZXZfZGVzYyAqdHhkZXNjOworCXVuc2lnbmVkIGVudHJ5OworCXUzMiBpb2FkZHI7CisJdTY0IHRmY192bGFuX3RhZyA9IDA7CisKKwlpZiAobnAtPmxpbmtfc3RhdHVzID09IDApIHsJLyogTGluayBEb3duICovCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWVudHJ5ID0gbnAtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKKwlucC0+dHhfc2tidWZmW2VudHJ5XSA9IHNrYjsKKwl0eGRlc2MgPSAmbnAtPnR4X3JpbmdbZW50cnldOworCisjaWYgMAorCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQl0eGRlc2MtPnN0YXR1cyB8PQorCQkgICAgY3B1X3RvX2xlNjQgKFRDUENoZWNrc3VtRW5hYmxlIHwgVURQQ2hlY2tzdW1FbmFibGUgfAorCQkJCSBJUENoZWNrc3VtRW5hYmxlKTsKKwl9CisjZW5kaWYKKwlpZiAobnAtPnZsYW4pIHsKKwkJdGZjX3ZsYW5fdGFnID0KKwkJICAgIGNwdV90b19sZTY0IChWTEFOVGFnSW5zZXJ0KSB8CisJCSAgICAoY3B1X3RvX2xlNjQgKG5wLT52bGFuKSA8PCAzMikgfAorCQkgICAgKGNwdV90b19sZTY0IChza2ItPnByaW9yaXR5KSA8PCA0NSk7CisJfQorCXR4ZGVzYy0+ZnJhZ2luZm8gPSBjcHVfdG9fbGU2NCAocGNpX21hcF9zaW5nbGUgKG5wLT5wZGV2LCBza2ItPmRhdGEsCisJCQkJCQkJc2tiLT5sZW4sCisJCQkJCQkJUENJX0RNQV9UT0RFVklDRSkpOworCXR4ZGVzYy0+ZnJhZ2luZm8gfD0gY3B1X3RvX2xlNjQgKHNrYi0+bGVuKSA8PCA0ODsKKworCS8qIERMMksgYnVnOiBETUEgZmFpbHMgdG8gZ2V0IG5leHQgZGVzY3JpcHRvciBwdHIgaW4gMTBNYnBzIG1vZGUKKwkgKiBXb3JrIGFyb3VuZDogQWx3YXlzIHVzZSAxIGRlc2NyaXB0b3IgaW4gMTBNYnBzIG1vZGUgKi8KKwlpZiAoZW50cnkgJSBucC0+dHhfY29hbGVzY2UgPT0gMCB8fCBucC0+c3BlZWQgPT0gMTApCisJCXR4ZGVzYy0+c3RhdHVzID0gY3B1X3RvX2xlNjQgKGVudHJ5IHwgdGZjX3ZsYW5fdGFnIHwKKwkJCQkJICAgICAgV29yZEFsaWduRGlzYWJsZSB8IAorCQkJCQkgICAgICBUeERNQUluZGljYXRlIHwKKwkJCQkJICAgICAgKDEgPDwgRnJhZ0NvdW50U2hpZnQpKTsKKwllbHNlCisJCXR4ZGVzYy0+c3RhdHVzID0gY3B1X3RvX2xlNjQgKGVudHJ5IHwgdGZjX3ZsYW5fdGFnIHwKKwkJCQkJICAgICAgV29yZEFsaWduRGlzYWJsZSB8IAorCQkJCQkgICAgICAoMSA8PCBGcmFnQ291bnRTaGlmdCkpOworCisJLyogVHhETUFQb2xsTm93ICovCisJd3JpdGVsIChyZWFkbCAoaW9hZGRyICsgRE1BQ3RybCkgfCAweDAwMDAxMDAwLCBpb2FkZHIgKyBETUFDdHJsKTsKKwkvKiBTY2hlZHVsZSBJU1IgKi8KKwl3cml0ZWwoMTAwMDAsIGlvYWRkciArIENvdW50RG93bik7CisJbnAtPmN1cl90eCA9IChucC0+Y3VyX3R4ICsgMSkgJSBUWF9SSU5HX1NJWkU7CisJaWYgKChucC0+Y3VyX3R4IC0gbnAtPm9sZF90eCArIFRYX1JJTkdfU0laRSkgJSBUWF9SSU5HX1NJWkUKKwkJCTwgVFhfUVVFVUVfTEVOIC0gMSAmJiBucC0+c3BlZWQgIT0gMTApIHsKKwkJLyogZG8gbm90aGluZyAqLworCX0gZWxzZSBpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgeworCQluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCX0KKworCS8qIFRoZSBmaXJzdCBURkRMaXN0UHRyICovCisJaWYgKHJlYWRsIChkZXYtPmJhc2VfYWRkciArIFRGRExpc3RQdHIwKSA9PSAwKSB7CisJCXdyaXRlbCAobnAtPnR4X3JpbmdfZG1hICsgZW50cnkgKiBzaXplb2YgKHN0cnVjdCBuZXRkZXZfZGVzYyksCisJCQlkZXYtPmJhc2VfYWRkciArIFRGRExpc3RQdHIwKTsKKwkJd3JpdGVsICgwLCBkZXYtPmJhc2VfYWRkciArIFRGRExpc3RQdHIxKTsKKwl9CisJCisJLyogTkVUREVWIFdBVENIRE9HIHRpbWVyICovCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorcmlvX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucDsKKwl1bnNpZ25lZCBpbnRfc3RhdHVzOworCWxvbmcgaW9hZGRyOworCWludCBjbnQgPSBtYXhfaW50cmxvb3A7CisJaW50IGhhbmRsZWQgPSAwOworCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXdoaWxlICgxKSB7CisJCWludF9zdGF0dXMgPSByZWFkdyAoaW9hZGRyICsgSW50U3RhdHVzKTsgCisJCXdyaXRldyAoaW50X3N0YXR1cywgaW9hZGRyICsgSW50U3RhdHVzKTsKKwkJaW50X3N0YXR1cyAmPSBERUZBVUxUX0lOVFI7CisJCWlmIChpbnRfc3RhdHVzID09IDAgfHwgLS1jbnQgPCAwKQorCQkJYnJlYWs7CisJCWhhbmRsZWQgPSAxOworCQkvKiBQcm9jZXNzaW5nIHJlY2VpdmVkIHBhY2tldHMgKi8KKwkJaWYgKGludF9zdGF0dXMgJiBSeERNQUNvbXBsZXRlKQorCQkJcmVjZWl2ZV9wYWNrZXQgKGRldik7CisJCS8qIFR4RE1BQ29tcGxldGUgaW50ZXJydXB0ICovCisJCWlmICgoaW50X3N0YXR1cyAmIChUeERNQUNvbXBsZXRlfEludFJlcXVlc3RlZCkpKSB7CisJCQlpbnQgdHhfc3RhdHVzOworCQkJdHhfc3RhdHVzID0gcmVhZGwgKGlvYWRkciArIFR4U3RhdHVzKTsKKwkJCWlmICh0eF9zdGF0dXMgJiAweDAxKQorCQkJCXR4X2Vycm9yIChkZXYsIHR4X3N0YXR1cyk7CisJCQkvKiBGcmVlIHVzZWQgdHggc2tidWZmcyAqLworCQkJcmlvX2ZyZWVfdHggKGRldiwgMSk7CQkKKwkJfQorCisJCS8qIEhhbmRsZSB1bmNvbW1vbiBldmVudHMgKi8KKwkJaWYgKGludF9zdGF0dXMgJgorCQkgICAgKEhvc3RFcnJvciB8IExpbmtFdmVudCB8IFVwZGF0ZVN0YXRzKSkKKwkJCXJpb19lcnJvciAoZGV2LCBpbnRfc3RhdHVzKTsKKwl9CisJaWYgKG5wLT5jdXJfdHggIT0gbnAtPm9sZF90eCkKKwkJd3JpdGVsICgxMDAsIGlvYWRkciArIENvdW50RG93bik7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKK3N0YXRpYyB2b2lkIAorcmlvX2ZyZWVfdHggKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpcnEpIAoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlbnRyeSA9IG5wLT5vbGRfdHggJSBUWF9SSU5HX1NJWkU7CisJaW50IHR4X3VzZSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnID0gMDsKKwkKKwlpZiAoaXJxKQorCQlzcGluX2xvY2soJm5wLT50eF9sb2NrKTsKKwllbHNlCisJCXNwaW5fbG9ja19pcnFzYXZlKCZucC0+dHhfbG9jaywgZmxhZyk7CisJCQkKKwkvKiBGcmVlIHVzZWQgdHggc2tidWZmcyAqLworCXdoaWxlIChlbnRyeSAhPSBucC0+Y3VyX3R4KSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJaWYgKCEobnAtPnR4X3JpbmdbZW50cnldLnN0YXR1cyAmIFRGRERvbmUpKQorCQkJYnJlYWs7CisJCXNrYiA9IG5wLT50eF9za2J1ZmZbZW50cnldOworCQlwY2lfdW5tYXBfc2luZ2xlIChucC0+cGRldiwKKwkJCQkgIG5wLT50eF9yaW5nW2VudHJ5XS5mcmFnaW5mbywKKwkJCQkgIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJaWYgKGlycSkKKwkJCWRldl9rZnJlZV9za2JfaXJxIChza2IpOworCQllbHNlCisJCQlkZXZfa2ZyZWVfc2tiIChza2IpOworCisJCW5wLT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJZW50cnkgPSAoZW50cnkgKyAxKSAlIFRYX1JJTkdfU0laRTsKKwkJdHhfdXNlKys7CisJfQorCWlmIChpcnEpCisJCXNwaW5fdW5sb2NrKCZucC0+dHhfbG9jayk7CisJZWxzZQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+dHhfbG9jaywgZmxhZyk7CisJbnAtPm9sZF90eCA9IGVudHJ5OworCisJLyogSWYgdGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwsIGNsZWFyIHR4X2Z1bGwgYW5kIAorCSAgIGNhbGwgbmV0aWZfd2FrZV9xdWV1ZSgpICovCisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCisJICAgICgobnAtPmN1cl90eCAtIG5wLT5vbGRfdHggKyBUWF9SSU5HX1NJWkUpICUgVFhfUklOR19TSVpFIAorCSAgICA8IFRYX1FVRVVFX0xFTiAtIDEgfHwgbnAtPnNwZWVkID09IDEwKSkgeworCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCX0KK30KKworc3RhdGljIHZvaWQKK3R4X2Vycm9yIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdHhfc3RhdHVzKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnA7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgZnJhbWVfaWQ7CisJaW50IGk7CisKKwlucCA9IG5ldGRldl9wcml2KGRldik7CisKKwlmcmFtZV9pZCA9ICh0eF9zdGF0dXMgJiAweGZmZmYwMDAwKTsKKwlwcmludGsgKEtFUk5fRVJSICIlczogVHJhbnNtaXQgZXJyb3IsIFR4U3RhdHVzICU0LjR4LCBGcmFtZUlkICVkLlxuIiwKKwkJZGV2LT5uYW1lLCB0eF9zdGF0dXMsIGZyYW1lX2lkKTsKKwlucC0+c3RhdHMudHhfZXJyb3JzKys7CisJLyogVHRyYW5zbWl0IFVuZGVycnVuICovCisJaWYgKHR4X3N0YXR1cyAmIDB4MTApIHsKKwkJbnAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCXdyaXRldyAocmVhZHcgKGlvYWRkciArIFR4U3RhcnRUaHJlc2gpICsgMHgxMCwKKwkJCWlvYWRkciArIFR4U3RhcnRUaHJlc2gpOworCQkvKiBUcmFuc21pdCBVbmRlcnJ1biBuZWVkIHRvIHNldCBUeFJlc2V0LCBETUFSZXN0LCBGSUZPUmVzZXQgKi8KKwkJd3JpdGV3IChUeFJlc2V0IHwgRE1BUmVzZXQgfCBGSUZPUmVzZXQgfCBOZXR3b3JrUmVzZXQsCisJCQlpb2FkZHIgKyBBU0lDQ3RybCArIDIpOworCQkvKiBXYWl0IGZvciBSZXNldEJ1c3kgYml0IGNsZWFyICovCisJCWZvciAoaSA9IDUwOyBpID4gMDsgaS0tKSB7CisJCQlpZiAoKHJlYWR3IChpb2FkZHIgKyBBU0lDQ3RybCArIDIpICYgUmVzZXRCdXN5KSA9PSAwKQorCQkJCWJyZWFrOworCQkJbWRlbGF5ICgxKTsKKwkJfQorCQlyaW9fZnJlZV90eCAoZGV2LCAxKTsKKwkJLyogUmVzZXQgVEZETGlzdFB0ciAqLworCQl3cml0ZWwgKG5wLT50eF9yaW5nX2RtYSArCisJCQlucC0+b2xkX3R4ICogc2l6ZW9mIChzdHJ1Y3QgbmV0ZGV2X2Rlc2MpLAorCQkJZGV2LT5iYXNlX2FkZHIgKyBURkRMaXN0UHRyMCk7CisJCXdyaXRlbCAoMCwgZGV2LT5iYXNlX2FkZHIgKyBURkRMaXN0UHRyMSk7CisKKwkJLyogTGV0IFR4U3RhcnRUaHJlc2ggc3RheSBkZWZhdWx0IHZhbHVlICovCisJfQorCS8qIExhdGUgQ29sbGlzaW9uICovCisJaWYgKHR4X3N0YXR1cyAmIDB4MDQpIHsKKwkJbnAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCS8qIFR4UmVzZXQgYW5kIGNsZWFyIEZJRk8gKi8KKwkJd3JpdGV3IChUeFJlc2V0IHwgRklGT1Jlc2V0LCBpb2FkZHIgKyBBU0lDQ3RybCArIDIpOworCQkvKiBXYWl0IHJlc2V0IGRvbmUgKi8KKwkJZm9yIChpID0gNTA7IGkgPiAwOyBpLS0pIHsKKwkJCWlmICgocmVhZHcgKGlvYWRkciArIEFTSUNDdHJsICsgMikgJiBSZXNldEJ1c3kpID09IDApCisJCQkJYnJlYWs7CisJCQltZGVsYXkgKDEpOworCQl9CisJCS8qIExldCBUeFN0YXJ0VGhyZXNoIHN0YXkgZGVmYXVsdCB2YWx1ZSAqLworCX0KKwkvKiBNYXhpbXVtIENvbGxpc2lvbnMgKi8KKyNpZmRlZiBFVEhFUl9TVEFUUwkKKwlpZiAodHhfc3RhdHVzICYgMHgwOCkgCisJCW5wLT5zdGF0cy5jb2xsaXNpb25zMTYrKzsKKyNlbHNlCisJaWYgKHR4X3N0YXR1cyAmIDB4MDgpIAorCQlucC0+c3RhdHMuY29sbGlzaW9ucysrOworI2VuZGlmCisJLyogUmVzdGFydCB0aGUgVHggKi8KKwl3cml0ZWwgKHJlYWR3IChkZXYtPmJhc2VfYWRkciArIE1BQ0N0cmwpIHwgVHhFbmFibGUsIGlvYWRkciArIE1BQ0N0cmwpOworfQorCitzdGF0aWMgaW50CityZWNlaXZlX3BhY2tldCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZW50cnkgPSBucC0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOworCWludCBjbnQgPSAzMDsKKworCS8qIElmIFJGRERvbmUsIEZyYW1lU3RhcnQgYW5kIEZyYW1lRW5kIHNldCwgdGhlcmUgaXMgYSBuZXcgcGFja2V0IGluLiAqLworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBuZXRkZXZfZGVzYyAqZGVzYyA9ICZucC0+cnhfcmluZ1tlbnRyeV07CisJCWludCBwa3RfbGVuOworCQl1NjQgZnJhbWVfc3RhdHVzOworCisJCWlmICghKGRlc2MtPnN0YXR1cyAmIFJGRERvbmUpIHx8CisJCSAgICAhKGRlc2MtPnN0YXR1cyAmIEZyYW1lU3RhcnQpIHx8ICEoZGVzYy0+c3RhdHVzICYgRnJhbWVFbmQpKQorCQkJYnJlYWs7CisKKwkJLyogQ2hpcCBvbWl0cyB0aGUgQ1JDLiAqLworCQlwa3RfbGVuID0gbGU2NF90b19jcHUgKGRlc2MtPnN0YXR1cyAmIDB4ZmZmZik7CisJCWZyYW1lX3N0YXR1cyA9IGxlNjRfdG9fY3B1IChkZXNjLT5zdGF0dXMpOworCQlpZiAoLS1jbnQgPCAwKQorCQkJYnJlYWs7CisJCS8qIFVwZGF0ZSByeCBlcnJvciBzdGF0aXN0aWNzLCBkcm9wIHBhY2tldC4gKi8KKwkJaWYgKGZyYW1lX3N0YXR1cyAmIFJGU19FcnJvcnMpIHsKKwkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChmcmFtZV9zdGF0dXMgJiAoUnhSdW50RnJhbWUgfCBSeExlbmd0aEVycm9yKSkKKwkJCQlucC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIFJ4RkNTRXJyb3IpCisJCQkJbnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChmcmFtZV9zdGF0dXMgJiBSeEFsaWdubWVudEVycm9yICYmIG5wLT5zcGVlZCAhPSAxMDAwKQorCQkJCW5wLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChmcmFtZV9zdGF0dXMgJiBSeEZJRk9PdmVycnVuKQorCSAJCQlucC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCS8qIFNtYWxsIHNrYnVmZnMgZm9yIHNob3J0IHBhY2tldHMgKi8KKwkJCWlmIChwa3RfbGVuID4gY29weV90aHJlc2gpIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlIChucC0+cGRldiwgZGVzYy0+ZnJhZ2luZm8sCisJCQkJCQkgIG5wLT5yeF9idWZfc3osCisJCQkJCQkgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJc2tiX3B1dCAoc2tiID0gbnAtPnJ4X3NrYnVmZltlbnRyeV0sIHBrdF9sZW4pOworCQkJCW5wLT5yeF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoKHNrYiA9IGRldl9hbGxvY19za2IgKHBrdF9sZW4gKyAyKSkgIT0gTlVMTCkgeworCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShucC0+cGRldiwKKwkJCQkJCQkgICAgZGVzYy0+ZnJhZ2luZm8sCisJCQkJCQkJICAgIG5wLT5yeF9idWZfc3osCisJCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCisJCQkJc2tiX3Jlc2VydmUgKHNrYiwgMik7CisJCQkJZXRoX2NvcHlfYW5kX3N1bSAoc2tiLAorCQkJCQkJICBucC0+cnhfc2tidWZmW2VudHJ5XS0+dGFpbCwKKwkJCQkJCSAgcGt0X2xlbiwgMCk7CisJCQkJc2tiX3B1dCAoc2tiLCBwa3RfbGVuKTsKKwkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UobnAtPnBkZXYsCisJCQkJCQkJICAgICAgIGRlc2MtPmZyYWdpbmZvLAorCQkJCQkJCSAgICAgICBucC0+cnhfYnVmX3N6LAorCQkJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJfQorCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zIChza2IsIGRldik7CisjaWYgMAkJCQorCQkJLyogQ2hlY2tzdW0gZG9uZSBieSBodywgYnV0IGNzdW0gdmFsdWUgdW5hdmFpbGFibGUuICovCisJCQlpZiAobnAtPnBjaV9yZXZfaWQgPj0gMHgwYyAmJiAKKwkJCQkhKGZyYW1lX3N0YXR1cyAmIChUQ1BFcnJvciB8IFVEUEVycm9yIHwgSVBFcnJvcikpKSB7CisJCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJCX0gCisjZW5kaWYKKwkJCW5ldGlmX3J4IChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJfQorCQllbnRyeSA9IChlbnRyeSArIDEpICUgUlhfUklOR19TSVpFOworCX0KKwlzcGluX2xvY2soJm5wLT5yeF9sb2NrKTsKKwlucC0+Y3VyX3J4ID0gZW50cnk7CisJLyogUmUtYWxsb2NhdGUgc2tidWZmcyB0byBmaWxsIHRoZSBkZXNjcmlwdG9yIHJpbmcgKi8KKwllbnRyeSA9IG5wLT5vbGRfcng7CisJd2hpbGUgKGVudHJ5ICE9IG5wLT5jdXJfcngpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJLyogRHJvcHBlZCBwYWNrZXRzIGRvbid0IG5lZWQgdG8gcmUtYWxsb2NhdGUgKi8KKwkJaWYgKG5wLT5yeF9za2J1ZmZbZW50cnldID09IE5VTEwpIHsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IgKG5wLT5yeF9idWZfc3opOworCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJbnAtPnJ4X3JpbmdbZW50cnldLmZyYWdpbmZvID0gMDsKKwkJCQlwcmludGsgKEtFUk5fSU5GTworCQkJCQkiJXM6IHJlY2VpdmVfcGFja2V0OiAiCisJCQkJCSJVbmFibGUgdG8gcmUtYWxsb2NhdGUgUnggc2tidWZmLiMlZFxuIiwKKwkJCQkJZGV2LT5uYW1lLCBlbnRyeSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlucC0+cnhfc2tidWZmW2VudHJ5XSA9IHNrYjsKKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCisJCQlza2JfcmVzZXJ2ZSAoc2tiLCAyKTsKKwkJCW5wLT5yeF9yaW5nW2VudHJ5XS5mcmFnaW5mbyA9CisJCQkgICAgY3B1X3RvX2xlNjQgKHBjaV9tYXBfc2luZ2xlCisJCQkJCSAobnAtPnBkZXYsIHNrYi0+dGFpbCwgbnAtPnJ4X2J1Zl9zeiwKKwkJCQkJICBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKKwkJfQorCQlucC0+cnhfcmluZ1tlbnRyeV0uZnJhZ2luZm8gfD0KKwkJICAgIGNwdV90b19sZTY0IChucC0+cnhfYnVmX3N6KSA8PCA0ODsKKwkJbnAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyA9IDA7CisJCWVudHJ5ID0gKGVudHJ5ICsgMSkgJSBSWF9SSU5HX1NJWkU7CisJfQorCW5wLT5vbGRfcnggPSBlbnRyeTsKKwlzcGluX3VubG9jaygmbnAtPnJ4X2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorcmlvX2Vycm9yIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW50X3N0YXR1cykKK3sKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNiBtYWNjdHJsOworCisJLyogTGluayBjaGFuZ2UgZXZlbnQgKi8KKwlpZiAoaW50X3N0YXR1cyAmIExpbmtFdmVudCkgeworCQlpZiAobWlpX3dhaXRfbGluayAoZGV2LCAxMCkgPT0gMCkgeworCQkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBMaW5rIHVwXG4iLCBkZXYtPm5hbWUpOworCQkJaWYgKG5wLT5waHlfbWVkaWEpCisJCQkJbWlpX2dldF9tZWRpYV9wY3MgKGRldik7CisJCQllbHNlCisJCQkJbWlpX2dldF9tZWRpYSAoZGV2KTsKKwkJCWlmIChucC0+c3BlZWQgPT0gMTAwMCkKKwkJCQlucC0+dHhfY29hbGVzY2UgPSB0eF9jb2FsZXNjZTsKKwkJCWVsc2UgCisJCQkJbnAtPnR4X2NvYWxlc2NlID0gMTsKKwkJCW1hY2N0cmwgPSAwOworCQkJbWFjY3RybCB8PSAobnAtPnZsYW4pID8gQXV0b1ZMQU51bnRhZ2dpbmcgOiAwOworCQkJbWFjY3RybCB8PSAobnAtPmZ1bGxfZHVwbGV4KSA/IER1cGxleFNlbGVjdCA6IDA7CisJCQltYWNjdHJsIHw9IChucC0+dHhfZmxvdykgPyAKKwkJCQlUeEZsb3dDb250cm9sRW5hYmxlIDogMDsKKwkJCW1hY2N0cmwgfD0gKG5wLT5yeF9mbG93KSA/IAorCQkJCVJ4Rmxvd0NvbnRyb2xFbmFibGUgOiAwOworCQkJd3JpdGV3KG1hY2N0cmwsCWlvYWRkciArIE1BQ0N0cmwpOworCQkJbnAtPmxpbmtfc3RhdHVzID0gMTsKKwkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayAoS0VSTl9JTkZPICIlczogTGluayBvZmZcbiIsIGRldi0+bmFtZSk7CisJCQlucC0+bGlua19zdGF0dXMgPSAwOworCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJfQorCX0KKworCS8qIFVwZGF0ZVN0YXRzIHN0YXRpc3RpY3MgcmVnaXN0ZXJzICovCisJaWYgKGludF9zdGF0dXMgJiBVcGRhdGVTdGF0cykgeworCQlnZXRfc3RhdHMgKGRldik7CisJfQorCisJLyogUENJIEVycm9yLCBhIGNhdGFzdHJvbnBoaWMgZXJyb3IgcmVsYXRlZCB0byB0aGUgYnVzIGludGVyZmFjZSAKKwkgICBvY2N1cnMsIHNldCBHbG9iYWxSZXNldCBhbmQgSG9zdFJlc2V0IHRvIHJlc2V0LiAqLworCWlmIChpbnRfc3RhdHVzICYgSG9zdEVycm9yKSB7CisJCXByaW50ayAoS0VSTl9FUlIgIiVzOiBIb3N0RXJyb3IhIEludFN0YXR1cyAlNC40eC5cbiIsCisJCQlkZXYtPm5hbWUsIGludF9zdGF0dXMpOworCQl3cml0ZXcgKEdsb2JhbFJlc2V0IHwgSG9zdFJlc2V0LCBpb2FkZHIgKyBBU0lDQ3RybCArIDIpOworCQltZGVsYXkgKDUwMCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgorZ2V0X3N0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisjaWZkZWYgTUVNX01BUFBJTkcKKwlpbnQgaTsKKyNlbmRpZgorCXVuc2lnbmVkIGludCBzdGF0X3JlZzsKKworCS8qIEFsbCBzdGF0aXN0aWNzIHJlZ2lzdGVycyBuZWVkIHRvIGJlIGFja25vd2xlZGdlZCwKKwkgICBlbHNlIHN0YXRpc3RpYyBvdmVyZmxvdyBjb3VsZCBjYXVzZSBwcm9ibGVtcyAqLworCQorCW5wLT5zdGF0cy5yeF9wYWNrZXRzICs9IHJlYWRsIChpb2FkZHIgKyBGcmFtZXNSY3ZPayk7CisJbnAtPnN0YXRzLnR4X3BhY2tldHMgKz0gcmVhZGwgKGlvYWRkciArIEZyYW1lc1htdE9rKTsKKwlucC0+c3RhdHMucnhfYnl0ZXMgKz0gcmVhZGwgKGlvYWRkciArIE9jdGV0UmN2T2spOworCW5wLT5zdGF0cy50eF9ieXRlcyArPSByZWFkbCAoaW9hZGRyICsgT2N0ZXRYbXRPayk7CisKKwlucC0+c3RhdHMubXVsdGljYXN0ID0gcmVhZGwgKGlvYWRkciArIE1jc3RGcmFtZXNSY3ZkT2spOworCW5wLT5zdGF0cy5jb2xsaXNpb25zICs9IHJlYWRsIChpb2FkZHIgKyBTaW5nbGVDb2xGcmFtZXMpIAorCQkJICAgICArICByZWFkbCAoaW9hZGRyICsgTXVsdGlDb2xGcmFtZXMpOyAKKwkKKwkvKiBkZXRhaWxlZCB0eCBlcnJvcnMgKi8KKwlzdGF0X3JlZyA9IHJlYWR3IChpb2FkZHIgKyBGcmFtZXNBYm9ydFhTQ29sbHMpOworCW5wLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyArPSBzdGF0X3JlZzsKKwlucC0+c3RhdHMudHhfZXJyb3JzICs9IHN0YXRfcmVnOworCisJc3RhdF9yZWcgPSByZWFkdyAoaW9hZGRyICsgQ2FycmllclNlbnNlRXJyb3JzKTsKKwlucC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMgKz0gc3RhdF9yZWc7CisJbnAtPnN0YXRzLnR4X2Vycm9ycyArPSBzdGF0X3JlZzsKKworCS8qIENsZWFyIGFsbCBvdGhlciBzdGF0aXN0aWMgcmVnaXN0ZXIuICovCisJcmVhZGwgKGlvYWRkciArIE1jc3RPY3RldFhtdE9rKTsKKwlyZWFkdyAoaW9hZGRyICsgQmNzdEZyYW1lc1htdGRPayk7CisJcmVhZGwgKGlvYWRkciArIE1jc3RGcmFtZXNYbXRkT2spOworCXJlYWR3IChpb2FkZHIgKyBCY3N0RnJhbWVzUmN2ZE9rKTsKKwlyZWFkdyAoaW9hZGRyICsgTWFjQ29udHJvbEZyYW1lc1JjdmQpOworCXJlYWR3IChpb2FkZHIgKyBGcmFtZVRvb0xvbmdFcnJvcnMpOworCXJlYWR3IChpb2FkZHIgKyBJblJhbmdlTGVuZ3RoRXJyb3JzKTsKKwlyZWFkdyAoaW9hZGRyICsgRnJhbWVzQ2hlY2tTZXFFcnJvcnMpOworCXJlYWR3IChpb2FkZHIgKyBGcmFtZXNMb3N0UnhFcnJvcnMpOworCXJlYWRsIChpb2FkZHIgKyBNY3N0T2N0ZXRYbXRPayk7CisJcmVhZGwgKGlvYWRkciArIEJjc3RPY3RldFhtdE9rKTsKKwlyZWFkbCAoaW9hZGRyICsgTWNzdEZyYW1lc1htdGRPayk7CisJcmVhZGwgKGlvYWRkciArIEZyYW1lc1dEZWZlcnJlZFhtdCk7CisJcmVhZGwgKGlvYWRkciArIExhdGVDb2xsaXNpb25zKTsKKwlyZWFkdyAoaW9hZGRyICsgQmNzdEZyYW1lc1htdGRPayk7CisJcmVhZHcgKGlvYWRkciArIE1hY0NvbnRyb2xGcmFtZXNYbXRkKTsKKwlyZWFkdyAoaW9hZGRyICsgRnJhbWVzV0VYRGVmZXJhbCk7CisKKyNpZmRlZiBNRU1fTUFQUElORworCWZvciAoaSA9IDB4MTAwOyBpIDw9IDB4MTUwOyBpICs9IDQpCisJCXJlYWRsIChpb2FkZHIgKyBpKTsKKyNlbmRpZgorCXJlYWR3IChpb2FkZHIgKyBUeEp1bWJvRnJhbWVzKTsKKwlyZWFkdyAoaW9hZGRyICsgUnhKdW1ib0ZyYW1lcyk7CisJcmVhZHcgKGlvYWRkciArIFRDUENoZWNrU3VtRXJyb3JzKTsKKwlyZWFkdyAoaW9hZGRyICsgVURQQ2hlY2tTdW1FcnJvcnMpOworCXJlYWR3IChpb2FkZHIgKyBJUENoZWNrU3VtRXJyb3JzKTsKKwlyZXR1cm4gJm5wLT5zdGF0czsKK30KKworc3RhdGljIGludAorY2xlYXJfc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyNpZmRlZiBNRU1fTUFQUElORworCWludCBpOworI2VuZGlmIAorCisJLyogQWxsIHN0YXRpc3RpY3MgcmVnaXN0ZXJzIG5lZWQgdG8gYmUgYWNrbm93bGVkZ2VkLAorCSAgIGVsc2Ugc3RhdGlzdGljIG92ZXJmbG93IGNvdWxkIGNhdXNlIHByb2JsZW1zICovCisJcmVhZGwgKGlvYWRkciArIEZyYW1lc1Jjdk9rKTsKKwlyZWFkbCAoaW9hZGRyICsgRnJhbWVzWG10T2spOworCXJlYWRsIChpb2FkZHIgKyBPY3RldFJjdk9rKTsKKwlyZWFkbCAoaW9hZGRyICsgT2N0ZXRYbXRPayk7CisKKwlyZWFkbCAoaW9hZGRyICsgTWNzdEZyYW1lc1JjdmRPayk7CisJcmVhZGwgKGlvYWRkciArIFNpbmdsZUNvbEZyYW1lcyk7CisJcmVhZGwgKGlvYWRkciArIE11bHRpQ29sRnJhbWVzKTsKKwlyZWFkbCAoaW9hZGRyICsgTGF0ZUNvbGxpc2lvbnMpOworCS8qIGRldGFpbGVkIHJ4IGVycm9ycyAqLwkJCisJcmVhZHcgKGlvYWRkciArIEZyYW1lVG9vTG9uZ0Vycm9ycyk7CisJcmVhZHcgKGlvYWRkciArIEluUmFuZ2VMZW5ndGhFcnJvcnMpOworCXJlYWR3IChpb2FkZHIgKyBGcmFtZXNDaGVja1NlcUVycm9ycyk7CisJcmVhZHcgKGlvYWRkciArIEZyYW1lc0xvc3RSeEVycm9ycyk7CisKKwkvKiBkZXRhaWxlZCB0eCBlcnJvcnMgKi8KKwlyZWFkdyAoaW9hZGRyICsgRnJhbWVzQWJvcnRYU0NvbGxzKTsKKwlyZWFkdyAoaW9hZGRyICsgQ2FycmllclNlbnNlRXJyb3JzKTsKKworCS8qIENsZWFyIGFsbCBvdGhlciBzdGF0aXN0aWMgcmVnaXN0ZXIuICovCisJcmVhZGwgKGlvYWRkciArIE1jc3RPY3RldFhtdE9rKTsKKwlyZWFkdyAoaW9hZGRyICsgQmNzdEZyYW1lc1htdGRPayk7CisJcmVhZGwgKGlvYWRkciArIE1jc3RGcmFtZXNYbXRkT2spOworCXJlYWR3IChpb2FkZHIgKyBCY3N0RnJhbWVzUmN2ZE9rKTsKKwlyZWFkdyAoaW9hZGRyICsgTWFjQ29udHJvbEZyYW1lc1JjdmQpOworCXJlYWRsIChpb2FkZHIgKyBNY3N0T2N0ZXRYbXRPayk7CisJcmVhZGwgKGlvYWRkciArIEJjc3RPY3RldFhtdE9rKTsKKwlyZWFkbCAoaW9hZGRyICsgTWNzdEZyYW1lc1htdGRPayk7CisJcmVhZGwgKGlvYWRkciArIEZyYW1lc1dEZWZlcnJlZFhtdCk7CisJcmVhZHcgKGlvYWRkciArIEJjc3RGcmFtZXNYbXRkT2spOworCXJlYWR3IChpb2FkZHIgKyBNYWNDb250cm9sRnJhbWVzWG10ZCk7CisJcmVhZHcgKGlvYWRkciArIEZyYW1lc1dFWERlZmVyYWwpOworI2lmZGVmIE1FTV9NQVBQSU5HCisJZm9yIChpID0gMHgxMDA7IGkgPD0gMHgxNTA7IGkgKz0gNCkKKwkJcmVhZGwgKGlvYWRkciArIGkpOworI2VuZGlmIAorCXJlYWR3IChpb2FkZHIgKyBUeEp1bWJvRnJhbWVzKTsKKwlyZWFkdyAoaW9hZGRyICsgUnhKdW1ib0ZyYW1lcyk7CisJcmVhZHcgKGlvYWRkciArIFRDUENoZWNrU3VtRXJyb3JzKTsKKwlyZWFkdyAoaW9hZGRyICsgVURQQ2hlY2tTdW1FcnJvcnMpOworCXJlYWR3IChpb2FkZHIgKyBJUENoZWNrU3VtRXJyb3JzKTsKKwlyZXR1cm4gMDsKK30KKworCitpbnQKK2NoYW5nZV9tdHUgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBtYXggPSAobnAtPmp1bWJvKSA/IE1BWF9KVU1CTyA6IDE1MzY7CisKKwlpZiAoKG5ld19tdHUgPCA2OCkgfHwgKG5ld19tdHUgPiBtYXgpKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldi0+bXR1ID0gbmV3X210dTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorc2V0X211bHRpY2FzdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXUzMiBoYXNoX3RhYmxlWzJdOworCXUxNiByeF9tb2RlID0gMDsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwloYXNoX3RhYmxlWzBdID0gaGFzaF90YWJsZVsxXSA9IDA7CisJLyogUnhGbG93Y29udHJvbCBEQTogMDEtODAtQzItMDAtMDAtMDEuIEhhc2ggaW5kZXg9MHgzOSAqLworCWhhc2hfdGFibGVbMV0gfD0gY3B1X3RvX2xlMzIoMHgwMjAwMDAwMCk7CisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQkvKiBSZWNlaXZlIGFsbCBmcmFtZXMgcHJvbWlzY3VvdXNseS4gKi8KKwkJcnhfbW9kZSA9IFJlY2VpdmVBbGxGcmFtZXM7CisJfSBlbHNlIGlmICgoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgfHwgCisJCQkoZGV2LT5tY19jb3VudCA+IG11bHRpY2FzdF9maWx0ZXJfbGltaXQpKSB7CisJCS8qIFJlY2VpdmUgYnJvYWRjYXN0IGFuZCBtdWx0aWNhc3QgZnJhbWVzICovCisJCXJ4X21vZGUgPSBSZWNlaXZlQnJvYWRjYXN0IHwgUmVjZWl2ZU11bHRpY2FzdCB8IFJlY2VpdmVVbmljYXN0OworCX0gZWxzZSBpZiAoZGV2LT5tY19jb3VudCA+IDApIHsKKwkJaW50IGk7CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCQkvKiBSZWNlaXZlIGJyb2FkY2FzdCBmcmFtZXMgYW5kIG11bHRpY2FzdCBmcmFtZXMgZmlsdGVyaW5nIAorCQkgICBieSBIYXNodGFibGUgKi8KKwkJcnhfbW9kZSA9CisJCSAgICBSZWNlaXZlQnJvYWRjYXN0IHwgUmVjZWl2ZU11bHRpY2FzdEhhc2ggfCBSZWNlaXZlVW5pY2FzdDsKKwkJZm9yIChpPTAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OyAKKwkJCQlpKyssIG1jbGlzdD1tY2xpc3QtPm5leHQpIAorCQl7CisJCQlpbnQgYml0LCBpbmRleCA9IDA7CisJCQlpbnQgY3JjID0gZXRoZXJfY3JjX2xlIChFVEhfQUxFTiwgbWNsaXN0LT5kbWlfYWRkcik7CisJCQkvKiBUaGUgaW52ZXJ0ZWQgaGlnaCBzaWduaWZpY2FudCA2IGJpdHMgb2YgQ1JDIGFyZQorCQkJICAgdXNlZCBhcyBhbiBpbmRleCB0byBoYXNodGFibGUgKi8KKwkJCWZvciAoYml0ID0gMDsgYml0IDwgNjsgYml0KyspCisJCQkJaWYgKGNyYyAmICgxIDw8ICgzMSAtIGJpdCkpKQorCQkJCQlpbmRleCB8PSAoMSA8PCBiaXQpOworCQkJaGFzaF90YWJsZVtpbmRleCAvIDMyXSB8PSAoMSA8PCAoaW5kZXggJSAzMikpOworCQl9CisJfSBlbHNlIHsKKwkJcnhfbW9kZSA9IFJlY2VpdmVCcm9hZGNhc3QgfCBSZWNlaXZlVW5pY2FzdDsKKwl9CisJaWYgKG5wLT52bGFuKSB7CisJCS8qIFJlY2VpdmVWTEFOTWF0Y2ggZmllbGQgaW4gUmVjZWl2ZU1vZGUgKi8KKwkJcnhfbW9kZSB8PSBSZWNlaXZlVkxBTk1hdGNoOworCX0KKworCXdyaXRlbCAoaGFzaF90YWJsZVswXSwgaW9hZGRyICsgSGFzaFRhYmxlMCk7CisJd3JpdGVsIChoYXNoX3RhYmxlWzFdLCBpb2FkZHIgKyBIYXNoVGFibGUxKTsKKwl3cml0ZXcgKHJ4X21vZGUsIGlvYWRkciArIFJlY2VpdmVNb2RlKTsKK30KKworc3RhdGljIHZvaWQgcmlvX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgImRsMmsiKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobnAtPnBkZXYpKTsKK30JCisKK3N0YXRpYyBpbnQgcmlvX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpZiAobnAtPnBoeV9tZWRpYSkgeworCQkvKiBmaWJlciBkZXZpY2UgKi8KKwkJY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfQXV0b25lZyB8IFNVUFBPUlRFRF9GSUJSRTsKKwkJY21kLT5hZHZlcnRpc2luZz0gQURWRVJUSVNFRF9BdXRvbmVnIHwgQURWRVJUSVNFRF9GSUJSRTsKKwkJY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKKwkJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CQorCX0gZWxzZSB7CisJCS8qIGNvcHBlciBkZXZpY2UgKi8KKwkJY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgCisJCQlTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYKKwkJCXwgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfAorCQkJU1VQUE9SVEVEX0F1dG9uZWcgfCBTVVBQT1JURURfTUlJOworCQljbWQtPmFkdmVydGlzaW5nID0gQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgfAorCQkJQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfCBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgfAorCQkJQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsIHwgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbHwKKwkJCUFEVkVSVElTRURfQXV0b25lZyB8IEFEVkVSVElTRURfTUlJOworCQljbWQtPnBvcnQgPSBQT1JUX01JSTsKKwkJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisJfQorCWlmICggbnAtPmxpbmtfc3RhdHVzICkgeyAKKwkJY21kLT5zcGVlZCA9IG5wLT5zcGVlZDsKKwkJY21kLT5kdXBsZXggPSBucC0+ZnVsbF9kdXBsZXggPyBEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOworCX0gZWxzZSB7CisJCWNtZC0+c3BlZWQgPSAtMTsKKwkJY21kLT5kdXBsZXggPSAtMTsKKwl9CisJaWYgKCBucC0+YW5fZW5hYmxlKQorCQljbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKKwllbHNlCisJCWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKwkKKwljbWQtPnBoeV9hZGRyZXNzID0gbnAtPnBoeV9hZGRyOworCXJldHVybiAwOwkJCQkgICAKK30KKworc3RhdGljIGludCByaW9fc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQlpZiAobnAtPmFuX2VuYWJsZSkKKwkJCXJldHVybiAwOworCQllbHNlIHsKKwkJCW5wLT5hbl9lbmFibGUgPSAxOworCQkJbWlpX3NldF9tZWRpYShkZXYpOworCQkJcmV0dXJuIDA7CQorCQl9CQorCX0gZWxzZSB7CisJCW5wLT5hbl9lbmFibGUgPSAwOworCQlpZiAobnAtPnNwZWVkID09IDEwMDApIHsKKwkJCWNtZC0+c3BlZWQgPSBTUEVFRF8xMDA7CQkJCisJCQljbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQkJcHJpbnRrKCJXYXJuaW5nISEgQ2FuJ3QgZGlzYWJsZSBBdXRvIG5lZ290aWF0aW9uIGluIDEwMDBNYnBzLCBjaGFuZ2UgdG8gTWFudWFsIDEwME1icHMsIEZ1bGwgZHVwbGV4LlxuIik7CisJCX0KKwkJc3dpdGNoKGNtZC0+c3BlZWQgKyBjbWQtPmR1cGxleCkgeworCQkKKwkJY2FzZSBTUEVFRF8xMCArIERVUExFWF9IQUxGOgorCQkJbnAtPnNwZWVkID0gMTA7CisJCQlucC0+ZnVsbF9kdXBsZXggPSAwOworCQkJYnJlYWs7CisJCQorCQljYXNlIFNQRUVEXzEwICsgRFVQTEVYX0ZVTEw6CisJCQlucC0+c3BlZWQgPSAxMDsKKwkJCW5wLT5mdWxsX2R1cGxleCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBTUEVFRF8xMDAgKyBEVVBMRVhfSEFMRjoKKwkJCW5wLT5zcGVlZCA9IDEwMDsKKwkJCW5wLT5mdWxsX2R1cGxleCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBTUEVFRF8xMDAgKyBEVVBMRVhfRlVMTDoKKwkJCW5wLT5zcGVlZCA9IDEwMDsKKwkJCW5wLT5mdWxsX2R1cGxleCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBTUEVFRF8xMDAwICsgRFVQTEVYX0hBTEY6Lyogbm90IHN1cHBvcnRlZCAqLworCQljYXNlIFNQRUVEXzEwMDAgKyBEVVBMRVhfRlVMTDovKiBub3Qgc3VwcG9ydGVkICovCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsJCisJCX0KKwkJbWlpX3NldF9tZWRpYShkZXYpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiByaW9fZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbnAtPmxpbmtfc3RhdHVzOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbyA9IHJpb19nZXRfZHJ2aW5mbywKKwkuZ2V0X3NldHRpbmdzID0gcmlvX2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzID0gcmlvX3NldF9zZXR0aW5ncywKKwkuZ2V0X2xpbmsgPSByaW9fZ2V0X2xpbmssCit9OworCitzdGF0aWMgaW50CityaW9faW9jdGwgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJaW50IHBoeV9hZGRyOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtaWlfZGF0YSAqbWlpZGF0YSA9IChzdHJ1Y3QgbWlpX2RhdGEgKikgJnJxLT5pZnJfaWZydTsKKwkKKwlzdHJ1Y3QgbmV0ZGV2X2Rlc2MgKmRlc2M7CisJaW50IGk7CisKKwlwaHlfYWRkciA9IG5wLT5waHlfYWRkcjsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0RFVlBSSVZBVEU6CisJCWJyZWFrOworCQorCWNhc2UgU0lPQ0RFVlBSSVZBVEUgKyAxOgorCQltaWlkYXRhLT5vdXRfdmFsdWUgPSBtaWlfcmVhZCAoZGV2LCBwaHlfYWRkciwgbWlpZGF0YS0+cmVnX251bSk7CisJCWJyZWFrOworCWNhc2UgU0lPQ0RFVlBSSVZBVEUgKyAyOgorCQltaWlfd3JpdGUgKGRldiwgcGh5X2FkZHIsIG1paWRhdGEtPnJlZ19udW0sIG1paWRhdGEtPmluX3ZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DREVWUFJJVkFURSArIDM6CisJCWJyZWFrOworCWNhc2UgU0lPQ0RFVlBSSVZBVEUgKyA0OgorCQlicmVhazsKKwljYXNlIFNJT0NERVZQUklWQVRFICsgNToKKwkJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DREVWUFJJVkFURSArIDY6CisJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJCWJyZWFrOworCWNhc2UgU0lPQ0RFVlBSSVZBVEUgKyA3OgorCQlwcmludGsKKwkJICAgICgidHhfZnVsbD0leCBjdXJfdHg9JWx4IG9sZF90eD0lbHggY3VyX3J4PSVseCBvbGRfcng9JWx4XG4iLAorCQkgICAgIG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSwgbnAtPmN1cl90eCwgbnAtPm9sZF90eCwgbnAtPmN1cl9yeCwKKwkJICAgICBucC0+b2xkX3J4KTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DREVWUFJJVkFURSArIDg6CisJCXByaW50aygiVFggcmluZzpcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJCWRlc2MgPSAmbnAtPnR4X3JpbmdbaV07CisJCQlwcmludGsKKwkJCSAgICAoIiUwMng6Y3VyOiUwOHggbmV4dDolMDh4IHN0YXR1czolMDh4IGZyYWcxOiUwOHggZnJhZzA6JTA4eCIsCisJCQkgICAgIGksCisJCQkgICAgICh1MzIpIChucC0+dHhfcmluZ19kbWEgKyBpICogc2l6ZW9mICgqZGVzYykpLAorCQkJICAgICAodTMyKSBkZXNjLT5uZXh0X2Rlc2MsCisJCQkgICAgICh1MzIpIGRlc2MtPnN0YXR1cywgKHUzMikgKGRlc2MtPmZyYWdpbmZvID4+IDMyKSwKKwkJCSAgICAgKHUzMikgZGVzYy0+ZnJhZ2luZm8pOworCQkJcHJpbnRrICgiXG4iKTsKKwkJfQorCQlwcmludGsgKCJcbiIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRUVQX1JFQUQgMHgwMjAwCisjZGVmaW5lIEVFUF9CVVNZIDB4ODAwMAorLyogUmVhZCB0aGUgRUVQUk9NIHdvcmQgKi8KKy8qIFdlIHVzZSBJL08gaW5zdHJ1Y3Rpb24gdG8gcmVhZC93cml0ZSBlZXByb20gdG8gYXZvaWQgZmFpbCBvbiBzb21lIG1hY2hpbmVzICovCitpbnQKK3JlYWRfZWVwcm9tIChsb25nIGlvYWRkciwgaW50IGVlcF9hZGRyKQoreworCWludCBpID0gMTAwMDsKKwlvdXR3IChFRVBfUkVBRCB8IChlZXBfYWRkciAmIDB4ZmYpLCBpb2FkZHIgKyBFZXByb21DdHJsKTsKKwl3aGlsZSAoaS0tID4gMCkgeworCQlpZiAoIShpbncgKGlvYWRkciArIEVlcHJvbUN0cmwpICYgRUVQX0JVU1kpKSB7CisJCQlyZXR1cm4gaW53IChpb2FkZHIgKyBFZXByb21EYXRhKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworZW51bSBwaHlfY3RybF9iaXRzIHsKKwlNSUlfUkVBRCA9IDB4MDAsIE1JSV9DTEsgPSAweDAxLCBNSUlfREFUQTEgPSAweDAyLCBNSUlfV1JJVEUgPSAweDA0LAorCU1JSV9EVVBMRVggPSAweDA4LAorfTsKKworI2RlZmluZSBtaWlfZGVsYXkoKSByZWFkYihpb2FkZHIpCitzdGF0aWMgdm9pZAorbWlpX3NlbmRiaXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIgKyBQaHlDdHJsOworCWRhdGEgPSAoZGF0YSkgPyBNSUlfREFUQTEgOiAwOworCWRhdGEgfD0gTUlJX1dSSVRFOworCWRhdGEgfD0gKHJlYWRiIChpb2FkZHIpICYgMHhmOCkgfCBNSUlfV1JJVEU7CisJd3JpdGViIChkYXRhLCBpb2FkZHIpOworCW1paV9kZWxheSAoKTsKKwl3cml0ZWIgKGRhdGEgfCBNSUlfQ0xLLCBpb2FkZHIpOworCW1paV9kZWxheSAoKTsKK30KKworc3RhdGljIGludAorbWlpX2dldGJpdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyICsgUGh5Q3RybDsKKwl1OCBkYXRhOworCisJZGF0YSA9IChyZWFkYiAoaW9hZGRyKSAmIDB4ZjgpIHwgTUlJX1JFQUQ7CisJd3JpdGViIChkYXRhLCBpb2FkZHIpOworCW1paV9kZWxheSAoKTsKKwl3cml0ZWIgKGRhdGEgfCBNSUlfQ0xLLCBpb2FkZHIpOworCW1paV9kZWxheSAoKTsKKwlyZXR1cm4gKChyZWFkYiAoaW9hZGRyKSA+PiAxKSAmIDEpOworfQorCitzdGF0aWMgdm9pZAorbWlpX3NlbmRfYml0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEsIGludCBsZW4pCit7CisJaW50IGk7CisJZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJbWlpX3NlbmRiaXQgKGRldiwgZGF0YSAmICgxIDw8IGkpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK21paV9yZWFkIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2FkZHIsIGludCByZWdfbnVtKQoreworCXUzMiBjbWQ7CisJaW50IGk7CisJdTMyIHJldHZhbCA9IDA7CisKKwkvKiBQcmVhbWJsZSAqLworCW1paV9zZW5kX2JpdHMgKGRldiwgMHhmZmZmZmZmZiwgMzIpOworCS8qIFNUKDIpLCBPUCgyKSwgQUREUig1KSwgUkVHIyg1KSwgVEEoMiksIERhdGEoMTYpIHRvdGFsIDMyIGJpdHMgKi8KKwkvKiBTVCxPUCA9IDAxMTAnYiBmb3IgcmVhZCBvcGVyYXRpb24gKi8KKwljbWQgPSAoMHgwNiA8PCAxMCB8IHBoeV9hZGRyIDw8IDUgfCByZWdfbnVtKTsKKwltaWlfc2VuZF9iaXRzIChkZXYsIGNtZCwgMTQpOworCS8qIFR1cm5hcm91bmQgKi8KKwlpZiAobWlpX2dldGJpdCAoZGV2KSkKKwkJZ290byBlcnJfb3V0OworCS8qIFJlYWQgZGF0YSAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCXJldHZhbCB8PSBtaWlfZ2V0Yml0IChkZXYpOworCQlyZXR2YWwgPDw9IDE7CisJfQorCS8qIEVuZCBjeWNsZSAqLworCW1paV9nZXRiaXQgKGRldik7CisJcmV0dXJuIChyZXR2YWwgPj4gMSkgJiAweGZmZmY7CisKKyAgICAgIGVycl9vdXQ6CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50CittaWlfd3JpdGUgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfYWRkciwgaW50IHJlZ19udW0sIHUxNiBkYXRhKQoreworCXUzMiBjbWQ7CisKKwkvKiBQcmVhbWJsZSAqLworCW1paV9zZW5kX2JpdHMgKGRldiwgMHhmZmZmZmZmZiwgMzIpOworCS8qIFNUKDIpLCBPUCgyKSwgQUREUig1KSwgUkVHIyg1KSwgVEEoMiksIERhdGEoMTYpIHRvdGFsIDMyIGJpdHMgKi8KKwkvKiBTVCxPUCxBQUFBQSxSUlJSUixUQSA9IDAxMDF4eHh4eHh4eHh4MTAnYiA9IDB4NTAwMiBmb3Igd3JpdGUgKi8KKwljbWQgPSAoMHg1MDAyIDw8IDE2KSB8IChwaHlfYWRkciA8PCAyMykgfCAocmVnX251bSA8PCAxOCkgfCBkYXRhOworCW1paV9zZW5kX2JpdHMgKGRldiwgY21kLCAzMik7CisJLyogRW5kIGN5Y2xlICovCisJbWlpX2dldGJpdCAoZGV2KTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQKK21paV93YWl0X2xpbmsgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB3YWl0KQoreworCUJNU1JfdCBibXNyOworCWludCBwaHlfYWRkcjsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wOworCisJbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXBoeV9hZGRyID0gbnAtPnBoeV9hZGRyOworCisJZG8geworCQlibXNyLmltYWdlID0gbWlpX3JlYWQgKGRldiwgcGh5X2FkZHIsIE1JSV9CTVNSKTsKKwkJaWYgKGJtc3IuYml0cy5saW5rX3N0YXR1cykKKwkJCXJldHVybiAwOworCQltZGVsYXkgKDEpOworCX0gd2hpbGUgKC0td2FpdCA+IDApOworCXJldHVybiAtMTsKK30KK3N0YXRpYyBpbnQKK21paV9nZXRfbWVkaWEgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJQU5BUl90IG5lZ290aWF0ZTsKKwlCTVNSX3QgYm1zcjsKKwlCTUNSX3QgYm1jcjsKKwlNU0NSX3QgbXNjcjsKKwlNU1NSX3QgbXNzcjsKKwlpbnQgcGh5X2FkZHI7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucDsKKworCW5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwaHlfYWRkciA9IG5wLT5waHlfYWRkcjsKKworCWJtc3IuaW1hZ2UgPSBtaWlfcmVhZCAoZGV2LCBwaHlfYWRkciwgTUlJX0JNU1IpOworCWlmIChucC0+YW5fZW5hYmxlKSB7CisJCWlmICghYm1zci5iaXRzLmFuX2NvbXBsZXRlKSB7CisJCQkvKiBBdXRvLU5lZ290aWF0aW9uIG5vdCBjb21wbGV0ZWQgKi8KKwkJCXJldHVybiAtMTsKKwkJfQorCQluZWdvdGlhdGUuaW1hZ2UgPSBtaWlfcmVhZCAoZGV2LCBwaHlfYWRkciwgTUlJX0FOQVIpICYgCisJCQltaWlfcmVhZCAoZGV2LCBwaHlfYWRkciwgTUlJX0FOTFBBUik7CisJCW1zY3IuaW1hZ2UgPSBtaWlfcmVhZCAoZGV2LCBwaHlfYWRkciwgTUlJX01TQ1IpOworCQltc3NyLmltYWdlID0gbWlpX3JlYWQgKGRldiwgcGh5X2FkZHIsIE1JSV9NU1NSKTsKKwkJaWYgKG1zY3IuYml0cy5tZWRpYV8xMDAwQlRfRkQgJiBtc3NyLmJpdHMubHBfMTAwMEJUX0ZEKSB7CisJCQlucC0+c3BlZWQgPSAxMDAwOworCQkJbnAtPmZ1bGxfZHVwbGV4ID0gMTsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJBdXRvIDEwMDAgTWJwcywgRnVsbCBkdXBsZXhcbiIpOworCQl9IGVsc2UgaWYgKG1zY3IuYml0cy5tZWRpYV8xMDAwQlRfSEQgJiBtc3NyLmJpdHMubHBfMTAwMEJUX0hEKSB7CisJCQlucC0+c3BlZWQgPSAxMDAwOworCQkJbnAtPmZ1bGxfZHVwbGV4ID0gMDsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJBdXRvIDEwMDAgTWJwcywgSGFsZiBkdXBsZXhcbiIpOworCQl9IGVsc2UgaWYgKG5lZ290aWF0ZS5iaXRzLm1lZGlhXzEwMEJYX0ZEKSB7CisJCQlucC0+c3BlZWQgPSAxMDA7CisJCQlucC0+ZnVsbF9kdXBsZXggPSAxOworCQkJcHJpbnRrIChLRVJOX0lORk8gIkF1dG8gMTAwIE1icHMsIEZ1bGwgZHVwbGV4XG4iKTsKKwkJfSBlbHNlIGlmIChuZWdvdGlhdGUuYml0cy5tZWRpYV8xMDBCWF9IRCkgeworCQkJbnAtPnNwZWVkID0gMTAwOworCQkJbnAtPmZ1bGxfZHVwbGV4ID0gMDsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJBdXRvIDEwMCBNYnBzLCBIYWxmIGR1cGxleFxuIik7CisJCX0gZWxzZSBpZiAobmVnb3RpYXRlLmJpdHMubWVkaWFfMTBCVF9GRCkgeworCQkJbnAtPnNwZWVkID0gMTA7CisJCQlucC0+ZnVsbF9kdXBsZXggPSAxOworCQkJcHJpbnRrIChLRVJOX0lORk8gIkF1dG8gMTAgTWJwcywgRnVsbCBkdXBsZXhcbiIpOworCQl9IGVsc2UgaWYgKG5lZ290aWF0ZS5iaXRzLm1lZGlhXzEwQlRfSEQpIHsKKwkJCW5wLT5zcGVlZCA9IDEwOworCQkJbnAtPmZ1bGxfZHVwbGV4ID0gMDsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJBdXRvIDEwIE1icHMsIEhhbGYgZHVwbGV4XG4iKTsKKwkJfQorCQlpZiAobmVnb3RpYXRlLmJpdHMucGF1c2UpIHsKKwkJCW5wLT50eF9mbG93ICY9IDE7CisJCQlucC0+cnhfZmxvdyAmPSAxOworCQl9IGVsc2UgaWYgKG5lZ290aWF0ZS5iaXRzLmFzeW1tZXRyaWMpIHsKKwkJCW5wLT50eF9mbG93ID0gMDsKKwkJCW5wLT5yeF9mbG93ICY9IDE7CisJCX0KKwkJLyogZWxzZSB0eF9mbG93LCByeF9mbG93ID0gdXNlciBzZWxlY3QgICovCisJfSBlbHNlIHsKKwkJYm1jci5pbWFnZSA9IG1paV9yZWFkIChkZXYsIHBoeV9hZGRyLCBNSUlfQk1DUik7CisJCWlmIChibWNyLmJpdHMuc3BlZWQxMDAgPT0gMSAmJiBibWNyLmJpdHMuc3BlZWQxMDAwID09IDApIHsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJPcGVyYXRpbmcgYXQgMTAwIE1icHMsICIpOworCQl9IGVsc2UgaWYgKGJtY3IuYml0cy5zcGVlZDEwMCA9PSAwICYmIGJtY3IuYml0cy5zcGVlZDEwMDAgPT0gMCkgeworCQkJcHJpbnRrIChLRVJOX0lORk8gIk9wZXJhdGluZyBhdCAxMCBNYnBzLCAiKTsKKwkJfSBlbHNlIGlmIChibWNyLmJpdHMuc3BlZWQxMDAgPT0gMCAmJiBibWNyLmJpdHMuc3BlZWQxMDAwID09IDEpIHsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJPcGVyYXRpbmcgYXQgMTAwMCBNYnBzLCAiKTsKKwkJfQorCQlpZiAoYm1jci5iaXRzLmR1cGxleF9tb2RlKSB7CisJCQlwcmludGsgKCJGdWxsIGR1cGxleFxuIik7CisJCX0gZWxzZSB7CisJCQlwcmludGsgKCJIYWxmIGR1cGxleFxuIik7CisJCX0KKwl9CisJaWYgKG5wLT50eF9mbG93KSAKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRW5hYmxlIFR4IEZsb3cgQ29udHJvbFxuIik7CisJZWxzZQkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRGlzYWJsZSBUeCBGbG93IENvbnRyb2xcbiIpOworCWlmIChucC0+cnhfZmxvdykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRW5hYmxlIFJ4IEZsb3cgQ29udHJvbFxuIik7CisJZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJEaXNhYmxlIFJ4IEZsb3cgQ29udHJvbFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbWlpX3NldF9tZWRpYSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlQSFlfU0NSX3QgcHNjcjsKKwlCTUNSX3QgYm1jcjsKKwlCTVNSX3QgYm1zcjsKKwlBTkFSX3QgYW5hcjsKKwlpbnQgcGh5X2FkZHI7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucDsKKwlucCA9IG5ldGRldl9wcml2KGRldik7CisJcGh5X2FkZHIgPSBucC0+cGh5X2FkZHI7CisKKwkvKiBEb2VzIHVzZXIgc2V0IHNwZWVkPyAqLworCWlmIChucC0+YW5fZW5hYmxlKSB7CisJCS8qIEFkdmVydGlzZSBjYXBhYmlsaXRpZXMgKi8KKwkJYm1zci5pbWFnZSA9IG1paV9yZWFkIChkZXYsIHBoeV9hZGRyLCBNSUlfQk1TUik7CisJCWFuYXIuaW1hZ2UgPSBtaWlfcmVhZCAoZGV2LCBwaHlfYWRkciwgTUlJX0FOQVIpOworCQlhbmFyLmJpdHMubWVkaWFfMTAwQlhfRkQgPSBibXNyLmJpdHMubWVkaWFfMTAwQlhfRkQ7CisJCWFuYXIuYml0cy5tZWRpYV8xMDBCWF9IRCA9IGJtc3IuYml0cy5tZWRpYV8xMDBCWF9IRDsKKwkJYW5hci5iaXRzLm1lZGlhXzEwMEJUNCA9IGJtc3IuYml0cy5tZWRpYV8xMDBCVDQ7CisJCWFuYXIuYml0cy5tZWRpYV8xMEJUX0ZEID0gYm1zci5iaXRzLm1lZGlhXzEwQlRfRkQ7CisJCWFuYXIuYml0cy5tZWRpYV8xMEJUX0hEID0gYm1zci5iaXRzLm1lZGlhXzEwQlRfSEQ7CisJCWFuYXIuYml0cy5wYXVzZSA9IDE7CisJCWFuYXIuYml0cy5hc3ltbWV0cmljID0gMTsKKwkJbWlpX3dyaXRlIChkZXYsIHBoeV9hZGRyLCBNSUlfQU5BUiwgYW5hci5pbWFnZSk7CisKKwkJLyogRW5hYmxlIEF1dG8gY3Jvc3NvdmVyICovCisJCXBzY3IuaW1hZ2UgPSBtaWlfcmVhZCAoZGV2LCBwaHlfYWRkciwgTUlJX1BIWV9TQ1IpOworCQlwc2NyLmJpdHMubWRpX2Nyb3Nzb3Zlcl9tb2RlID0gMzsJLyogMTEnYiAqLworCQltaWlfd3JpdGUgKGRldiwgcGh5X2FkZHIsIE1JSV9QSFlfU0NSLCBwc2NyLmltYWdlKTsKKwkJCisJCS8qIFNvZnQgcmVzZXQgUEhZICovCisJCW1paV93cml0ZSAoZGV2LCBwaHlfYWRkciwgTUlJX0JNQ1IsIE1JSV9CTUNSX1JFU0VUKTsKKwkJYm1jci5pbWFnZSA9IDA7CisJCWJtY3IuYml0cy5hbl9lbmFibGUgPSAxOworCQlibWNyLmJpdHMucmVzdGFydF9hbiA9IDE7CisJCWJtY3IuYml0cy5yZXNldCA9IDE7CisJCW1paV93cml0ZSAoZGV2LCBwaHlfYWRkciwgTUlJX0JNQ1IsIGJtY3IuaW1hZ2UpOworCQltZGVsYXkoMSk7CisJfSBlbHNlIHsKKwkJLyogRm9yY2Ugc3BlZWQgc2V0dGluZyAqLworCQkvKiAxKSBEaXNhYmxlIEF1dG8gY3Jvc3NvdmVyICovCisJCXBzY3IuaW1hZ2UgPSBtaWlfcmVhZCAoZGV2LCBwaHlfYWRkciwgTUlJX1BIWV9TQ1IpOworCQlwc2NyLmJpdHMubWRpX2Nyb3Nzb3Zlcl9tb2RlID0gMDsKKwkJbWlpX3dyaXRlIChkZXYsIHBoeV9hZGRyLCBNSUlfUEhZX1NDUiwgcHNjci5pbWFnZSk7CisKKwkJLyogMikgUEhZIFJlc2V0ICovCisJCWJtY3IuaW1hZ2UgPSBtaWlfcmVhZCAoZGV2LCBwaHlfYWRkciwgTUlJX0JNQ1IpOworCQlibWNyLmJpdHMucmVzZXQgPSAxOworCQltaWlfd3JpdGUgKGRldiwgcGh5X2FkZHIsIE1JSV9CTUNSLCBibWNyLmltYWdlKTsKKworCQkvKiAzKSBQb3dlciBEb3duICovCisJCWJtY3IuaW1hZ2UgPSAweDE5NDA7CS8qIG11c3QgYmUgMHgxOTQwICovCisJCW1paV93cml0ZSAoZGV2LCBwaHlfYWRkciwgTUlJX0JNQ1IsIGJtY3IuaW1hZ2UpOworCQltZGVsYXkgKDEwMCk7CS8qIHdhaXQgYSBjZXJ0YWluIHRpbWUgKi8KKworCQkvKiA0KSBBZHZlcnRpc2Ugbm90aGluZyAqLworCQltaWlfd3JpdGUgKGRldiwgcGh5X2FkZHIsIE1JSV9BTkFSLCAwKTsKKworCQkvKiA1KSBTZXQgbWVkaWEgYW5kIFBvd2VyIFVwICovCisJCWJtY3IuaW1hZ2UgPSAwOworCQlibWNyLmJpdHMucG93ZXJfZG93biA9IDE7CisJCWlmIChucC0+c3BlZWQgPT0gMTAwKSB7CisJCQlibWNyLmJpdHMuc3BlZWQxMDAgPSAxOworCQkJYm1jci5iaXRzLnNwZWVkMTAwMCA9IDA7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiTWFudWFsIDEwMCBNYnBzLCAiKTsKKwkJfSBlbHNlIGlmIChucC0+c3BlZWQgPT0gMTApIHsKKwkJCWJtY3IuYml0cy5zcGVlZDEwMCA9IDA7CisJCQlibWNyLmJpdHMuc3BlZWQxMDAwID0gMDsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJNYW51YWwgMTAgTWJwcywgIik7CisJCX0KKwkJaWYgKG5wLT5mdWxsX2R1cGxleCkgeworCQkJYm1jci5iaXRzLmR1cGxleF9tb2RlID0gMTsKKwkJCXByaW50ayAoIkZ1bGwgZHVwbGV4XG4iKTsKKwkJfSBlbHNlIHsKKwkJCWJtY3IuYml0cy5kdXBsZXhfbW9kZSA9IDA7CisJCQlwcmludGsgKCJIYWxmIGR1cGxleFxuIik7CisJCX0KKyNpZiAwCisJCS8qIFNldCAxMDAwQmFzZVQgTWFzdGVyL1NsYXZlIHNldHRpbmcgKi8KKwkJbXNjci5pbWFnZSA9IG1paV9yZWFkIChkZXYsIHBoeV9hZGRyLCBNSUlfTVNDUik7CisJCW1zY3IuYml0cy5jZmdfZW5hYmxlID0gMTsKKwkJbXNjci5iaXRzLmNmZ192YWx1ZSA9IDA7CisjZW5kaWYKKwkJbWlpX3dyaXRlIChkZXYsIHBoeV9hZGRyLCBNSUlfQk1DUiwgYm1jci5pbWFnZSk7CisJCW1kZWxheSgxMCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CittaWlfZ2V0X21lZGlhX3BjcyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlBTkFSX1BDU190IG5lZ290aWF0ZTsKKwlCTVNSX3QgYm1zcjsKKwlCTUNSX3QgYm1jcjsKKwlpbnQgcGh5X2FkZHI7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucDsKKworCW5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwaHlfYWRkciA9IG5wLT5waHlfYWRkcjsKKworCWJtc3IuaW1hZ2UgPSBtaWlfcmVhZCAoZGV2LCBwaHlfYWRkciwgUENTX0JNU1IpOworCWlmIChucC0+YW5fZW5hYmxlKSB7CisJCWlmICghYm1zci5iaXRzLmFuX2NvbXBsZXRlKSB7CisJCQkvKiBBdXRvLU5lZ290aWF0aW9uIG5vdCBjb21wbGV0ZWQgKi8KKwkJCXJldHVybiAtMTsKKwkJfQorCQluZWdvdGlhdGUuaW1hZ2UgPSBtaWlfcmVhZCAoZGV2LCBwaHlfYWRkciwgUENTX0FOQVIpICYgCisJCQltaWlfcmVhZCAoZGV2LCBwaHlfYWRkciwgUENTX0FOTFBBUik7CisJCW5wLT5zcGVlZCA9IDEwMDA7CisJCWlmIChuZWdvdGlhdGUuYml0cy5mdWxsX2R1cGxleCkgeworCQkJcHJpbnRrIChLRVJOX0lORk8gIkF1dG8gMTAwMCBNYnBzLCBGdWxsIGR1cGxleFxuIik7CisJCQlucC0+ZnVsbF9kdXBsZXggPSAxOworCQl9IGVsc2UgeworCQkJcHJpbnRrIChLRVJOX0lORk8gIkF1dG8gMTAwMCBNYnBzLCBoYWxmIGR1cGxleFxuIik7CisJCQlucC0+ZnVsbF9kdXBsZXggPSAwOworCQl9CisJCWlmIChuZWdvdGlhdGUuYml0cy5wYXVzZSkgeworCQkJbnAtPnR4X2Zsb3cgJj0gMTsKKwkJCW5wLT5yeF9mbG93ICY9IDE7CisJCX0gZWxzZSBpZiAobmVnb3RpYXRlLmJpdHMuYXN5bW1ldHJpYykgeworCQkJbnAtPnR4X2Zsb3cgPSAwOworCQkJbnAtPnJ4X2Zsb3cgJj0gMTsKKwkJfQorCQkvKiBlbHNlIHR4X2Zsb3csIHJ4X2Zsb3cgPSB1c2VyIHNlbGVjdCAgKi8KKwl9IGVsc2UgeworCQlibWNyLmltYWdlID0gbWlpX3JlYWQgKGRldiwgcGh5X2FkZHIsIFBDU19CTUNSKTsKKwkJcHJpbnRrIChLRVJOX0lORk8gIk9wZXJhdGluZyBhdCAxMDAwIE1icHMsICIpOworCQlpZiAoYm1jci5iaXRzLmR1cGxleF9tb2RlKSB7CisJCQlwcmludGsgKCJGdWxsIGR1cGxleFxuIik7CisJCX0gZWxzZSB7CisJCQlwcmludGsgKCJIYWxmIGR1cGxleFxuIik7CisJCX0KKwl9CisJaWYgKG5wLT50eF9mbG93KSAKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRW5hYmxlIFR4IEZsb3cgQ29udHJvbFxuIik7CisJZWxzZQkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRGlzYWJsZSBUeCBGbG93IENvbnRyb2xcbiIpOworCWlmIChucC0+cnhfZmxvdykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRW5hYmxlIFJ4IEZsb3cgQ29udHJvbFxuIik7CisJZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJEaXNhYmxlIFJ4IEZsb3cgQ29udHJvbFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbWlpX3NldF9tZWRpYV9wY3MgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJQk1DUl90IGJtY3I7CisJRVNSX3QgZXNyOworCUFOQVJfUENTX3QgYW5hcjsKKwlpbnQgcGh5X2FkZHI7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucDsKKwlucCA9IG5ldGRldl9wcml2KGRldik7CisJcGh5X2FkZHIgPSBucC0+cGh5X2FkZHI7CisKKwkvKiBBdXRvLU5lZ290aWF0aW9uPyAqLworCWlmIChucC0+YW5fZW5hYmxlKSB7CisJCS8qIEFkdmVydGlzZSBjYXBhYmlsaXRpZXMgKi8KKwkJZXNyLmltYWdlID0gbWlpX3JlYWQgKGRldiwgcGh5X2FkZHIsIFBDU19FU1IpOworCQlhbmFyLmltYWdlID0gbWlpX3JlYWQgKGRldiwgcGh5X2FkZHIsIE1JSV9BTkFSKTsKKwkJYW5hci5iaXRzLmhhbGZfZHVwbGV4ID0gCisJCQllc3IuYml0cy5tZWRpYV8xMDAwQlRfSEQgfCBlc3IuYml0cy5tZWRpYV8xMDAwQlhfSEQ7CisJCWFuYXIuYml0cy5mdWxsX2R1cGxleCA9IAorCQkJZXNyLmJpdHMubWVkaWFfMTAwMEJUX0ZEIHwgZXNyLmJpdHMubWVkaWFfMTAwMEJYX0ZEOworCQlhbmFyLmJpdHMucGF1c2UgPSAxOworCQlhbmFyLmJpdHMuYXN5bW1ldHJpYyA9IDE7CisJCW1paV93cml0ZSAoZGV2LCBwaHlfYWRkciwgTUlJX0FOQVIsIGFuYXIuaW1hZ2UpOworCisJCS8qIFNvZnQgcmVzZXQgUEhZICovCisJCW1paV93cml0ZSAoZGV2LCBwaHlfYWRkciwgTUlJX0JNQ1IsIE1JSV9CTUNSX1JFU0VUKTsKKwkJYm1jci5pbWFnZSA9IDA7CisJCWJtY3IuYml0cy5hbl9lbmFibGUgPSAxOworCQlibWNyLmJpdHMucmVzdGFydF9hbiA9IDE7CisJCWJtY3IuYml0cy5yZXNldCA9IDE7CisJCW1paV93cml0ZSAoZGV2LCBwaHlfYWRkciwgTUlJX0JNQ1IsIGJtY3IuaW1hZ2UpOworCQltZGVsYXkoMSk7CisJfSBlbHNlIHsKKwkJLyogRm9yY2Ugc3BlZWQgc2V0dGluZyAqLworCQkvKiBQSFkgUmVzZXQgKi8KKwkJYm1jci5pbWFnZSA9IDA7CisJCWJtY3IuYml0cy5yZXNldCA9IDE7CisJCW1paV93cml0ZSAoZGV2LCBwaHlfYWRkciwgTUlJX0JNQ1IsIGJtY3IuaW1hZ2UpOworCQltZGVsYXkoMTApOworCQlibWNyLmltYWdlID0gMDsKKwkJYm1jci5iaXRzLmFuX2VuYWJsZSA9IDA7CisJCWlmIChucC0+ZnVsbF9kdXBsZXgpIHsKKwkJCWJtY3IuYml0cy5kdXBsZXhfbW9kZSA9IDE7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiTWFudWFsIGZ1bGwgZHVwbGV4XG4iKTsKKwkJfSBlbHNlIHsKKwkJCWJtY3IuYml0cy5kdXBsZXhfbW9kZSA9IDA7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiTWFudWFsIGhhbGYgZHVwbGV4XG4iKTsKKwkJfQorCQltaWlfd3JpdGUgKGRldiwgcGh5X2FkZHIsIE1JSV9CTUNSLCBibWNyLmltYWdlKTsKKwkJbWRlbGF5KDEwKTsKKworCQkvKiAgQWR2ZXJ0aXNlIG5vdGhpbmcgKi8KKwkJbWlpX3dyaXRlIChkZXYsIHBoeV9hZGRyLCBNSUlfQU5BUiwgMCk7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK3Jpb19jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGk7CisKKwluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJd3JpdGV3ICgwLCBpb2FkZHIgKyBJbnRFbmFibGUpOworCisJLyogU3RvcCBUeCBhbmQgUnggbG9naWNzICovCisJd3JpdGVsIChUeERpc2FibGUgfCBSeERpc2FibGUgfCBTdGF0c0Rpc2FibGUsIGlvYWRkciArIE1BQ0N0cmwpOworCXN5bmNocm9uaXplX2lycSAoZGV2LT5pcnEpOworCWZyZWVfaXJxIChkZXYtPmlycSwgZGV2KTsKKwlkZWxfdGltZXJfc3luYyAoJm5wLT50aW1lcik7CisJCisJLyogRnJlZSBhbGwgdGhlIHNrYnVmZnMgaW4gdGhlIHF1ZXVlLiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlucC0+cnhfcmluZ1tpXS5zdGF0dXMgPSAwOworCQlucC0+cnhfcmluZ1tpXS5mcmFnaW5mbyA9IDA7CisJCXNrYiA9IG5wLT5yeF9za2J1ZmZbaV07CisJCWlmIChza2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUgKG5wLT5wZGV2LCBucC0+cnhfcmluZ1tpXS5mcmFnaW5mbywKKwkJCQkJICBza2ItPmxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IgKHNrYik7CisJCQlucC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJc2tiID0gbnAtPnR4X3NrYnVmZltpXTsKKwkJaWYgKHNrYikgeworCQkJcGNpX3VubWFwX3NpbmdsZSAobnAtPnBkZXYsIG5wLT50eF9yaW5nW2ldLmZyYWdpbmZvLAorCQkJCQkgIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IgKHNrYik7CisJCQlucC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQKK3Jpb19yZW1vdmUxIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKworCWlmIChkZXYpIHsKKwkJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwkJdW5yZWdpc3Rlcl9uZXRkZXYgKGRldik7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQgKHBkZXYsIFJYX1RPVEFMX1NJWkUsIG5wLT5yeF9yaW5nLAorCQkJCSAgICAgbnAtPnJ4X3JpbmdfZG1hKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCAocGRldiwgVFhfVE9UQUxfU0laRSwgbnAtPnR4X3JpbmcsCisJCQkJICAgICBucC0+dHhfcmluZ19kbWEpOworI2lmZGVmIE1FTV9NQVBQSU5HCisJCWlvdW5tYXAgKChjaGFyICopIChkZXYtPmJhc2VfYWRkcikpOworI2VuZGlmCisJCWZyZWVfbmV0ZGV2IChkZXYpOworCQlwY2lfcmVsZWFzZV9yZWdpb25zIChwZGV2KTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlIChwZGV2KTsKKwl9CisJcGNpX3NldF9kcnZkYXRhIChwZGV2LCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHJpb19kcml2ZXIgPSB7CisJLm5hbWUJCT0gImRsMmsiLAorCS5pZF90YWJsZQk9IHJpb19wY2lfdGJsLAorCS5wcm9iZQkJPSByaW9fcHJvYmUxLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocmlvX3JlbW92ZTEpLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK3Jpb19pbml0ICh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZyaW9fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0CityaW9fZXhpdCAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZyaW9fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQgKHJpb19pbml0KTsKK21vZHVsZV9leGl0IChyaW9fZXhpdCk7CisKKy8qCisgCitDb21waWxlIGNvbW1hbmQ6IAorIAorZ2NjIC1EX19LRVJORUxfXyAtRE1PRFVMRSAtSS91c3Ivc3JjL2xpbnV4L2luY2x1ZGUgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzIgLWMgZGwyay5jCisKK1JlYWQgRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RsMmsudHh0IGZvciBkZXRhaWxzLgorCisqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kbDJrLmggYi9kcml2ZXJzL25ldC9kbDJrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU3NTQ4MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2RsMmsuaApAQCAtMCwwICsxLDcxMSBAQAorLyogIEQtTGluayBETDIwMDAtYmFzZWQgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyIExpbnV4IGRyaXZlciAqLworLyogIAorICAgIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiBieSBELUxpbmsgQ29ycG9yYXRpb24KKyAgICBXcml0dGVuIGJ5IEVkd2FyZCBQZW5nLjxlZHdhcmRfcGVuZ0BkbGluay5jb20udHc+CisgICAgQ3JlYXRlZCAwMy1NYXktMjAwMSwgYmFzZSBvbiBMaW51eCcgc3VuZGFuY2UuYy4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqLworCisjaWZuZGVmIF9fREwyS19IX18KKyNkZWZpbmUgX19ETDJLX0hfXworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CS8qIFByb2Nlc3NvciB0eXBlIGZvciBjYWNoZSBhbGlnbm1lbnQuICovCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2RlZmluZSBUWF9SSU5HX1NJWkUJMjU2CisjZGVmaW5lIFRYX1FVRVVFX0xFTgkoVFhfUklOR19TSVpFIC0gMSkgLyogTGltaXQgcmluZyBlbnRyaWVzIGFjdHVhbGx5IHVzZWQuKi8KKyNkZWZpbmUgUlhfUklOR19TSVpFIAkyNTYKKyNkZWZpbmUgVFhfVE9UQUxfU0laRQlUWF9SSU5HX1NJWkUqc2l6ZW9mKHN0cnVjdCBuZXRkZXZfZGVzYykKKyNkZWZpbmUgUlhfVE9UQUxfU0laRQlSWF9SSU5HX1NJWkUqc2l6ZW9mKHN0cnVjdCBuZXRkZXZfZGVzYykKKworLyogVGhpcyBkcml2ZXIgd2FzIHdyaXR0ZW4gdG8gdXNlIFBDSSBtZW1vcnkgc3BhY2UsIGhvd2V2ZXIgeDg2LW9yaWVudGVkCisgICBoYXJkd2FyZSBvZnRlbiB1c2VzIEkvTyBzcGFjZSBhY2Nlc3Nlcy4gKi8KKyNpZm5kZWYgTUVNX01BUFBJTkcKKyN1bmRlZiByZWFkYgorI3VuZGVmIHJlYWR3CisjdW5kZWYgcmVhZGwKKyN1bmRlZiB3cml0ZWIKKyN1bmRlZiB3cml0ZXcKKyN1bmRlZiB3cml0ZWwKKyNkZWZpbmUgcmVhZGIgaW5iCisjZGVmaW5lIHJlYWR3IGludworI2RlZmluZSByZWFkbCBpbmwKKyNkZWZpbmUgd3JpdGViIG91dGIKKyNkZWZpbmUgd3JpdGV3IG91dHcKKyNkZWZpbmUgd3JpdGVsIG91dGwKKyNlbmRpZgorCisvKiBPZmZzZXRzIHRvIHRoZSBkZXZpY2UgcmVnaXN0ZXJzLgorICAgVW5saWtlIHNvZnR3YXJlLW9ubHkgc3lzdGVtcywgZGV2aWNlIGRyaXZlcnMgaW50ZXJhY3Qgd2l0aCBjb21wbGV4IGhhcmR3YXJlLgorICAgSXQncyBub3QgdXNlZnVsIHRvIGRlZmluZSBzeW1ib2xpYyBuYW1lcyBmb3IgZXZlcnkgcmVnaXN0ZXIgYml0IGluIHRoZQorICAgZGV2aWNlLiAgVGhlIG5hbWUgY2FuIG9ubHkgcGFydGlhbGx5IGRvY3VtZW50IHRoZSBzZW1hbnRpY3MgYW5kIG1ha2UKKyAgIHRoZSBkcml2ZXIgbG9uZ2VyIGFuZCBtb3JlIGRpZmZpY3VsdCB0byByZWFkLgorICAgSW4gZ2VuZXJhbCwgb25seSB0aGUgaW1wb3J0YW50IGNvbmZpZ3VyYXRpb24gdmFsdWVzIG9yIGJpdHMgY2hhbmdlZAorICAgbXVsdGlwbGUgdGltZXMgc2hvdWxkIGJlIGRlZmluZWQgc3ltYm9saWNhbGx5LgorKi8KK2VudW0gZGwyeF9vZmZzZXRzIHsKKwkvKiBJL08gcmVnaXN0ZXIgb2Zmc2V0cyAqLworCURNQUN0cmwgPSAweDAwLAorCVJ4RE1BU3RhdHVzID0gMHgwOCwKKwlURkRMaXN0UHRyMCA9IDB4MTAsCisJVEZETGlzdFB0cjEgPSAweDE0LAorCVR4RE1BQnVyc3RUaHJlc2ggPSAweDE4LAorCVR4RE1BVXJnZW50VGhyZXNoID0gMHgxOSwKKwlUeERNQVBvbGxQZXJpb2QgPSAweDFhLAorCVJGRExpc3RQdHIwID0gMHgxYywKKwlSRkRMaXN0UHRyMSA9IDB4MjAsCisJUnhETUFCdXJzdFRocmVzaCA9IDB4MjQsCisJUnhETUFVcmdlbnRUaHJlc2ggPSAweDI1LAorCVJ4RE1BUG9sbFBlcmlvZCA9IDB4MjYsCisJUnhETUFJbnRDdHJsID0gMHgyOCwKKwlEZWJ1Z0N0cmwgPSAweDJjLAorCUFTSUNDdHJsID0gMHgzMCwKKwlGaWZvQ3RybCA9IDB4MzgsCisJUnhFYXJseVRocmVzaCA9IDB4M2EsCisJRmxvd09mZlRocmVzaCA9IDB4M2MsCisJRmxvd09uVGhyZXNoID0gMHgzZSwKKwlUeFN0YXJ0VGhyZXNoID0gMHg0NCwKKwlFZXByb21EYXRhID0gMHg0OCwKKwlFZXByb21DdHJsID0gMHg0YSwKKwlFeHByb21BZGRyID0gMHg0YywKKwlFeHByb2RhdGEgPSAweDUwLAorCVdha2VFdmVudCA9IDB4NTEsCisJQ291bnREb3duID0gMHg1NCwKKwlJbnRTdGF0dXNBY2sgPSAweDVhLAorCUludEVuYWJsZSA9IDB4NWMsCisJSW50U3RhdHVzID0gMHg1ZSwKKwlUeFN0YXR1cyA9IDB4NjAsCisJTUFDQ3RybCA9IDB4NmMsCisJVkxBTlRhZyA9IDB4NzAsCisJUGh5Q3RybCA9IDB4NzYsCisJU3RhdGlvbkFkZHIwID0gMHg3OCwKKwlTdGF0aW9uQWRkcjEgPSAweDdhLAorCVN0YXRpb25BZGRyMiA9IDB4N2MsCisJVkxBTklkID0gMHg4MCwKKwlNYXhGcmFtZVNpemUgPSAweDg2LAorCVJlY2VpdmVNb2RlID0gMHg4OCwKKwlIYXNoVGFibGUwID0gMHg4YywKKwlIYXNoVGFibGUxID0gMHg5MCwKKwlSbW9uU3RhdE1hc2sgPSAweDk4LAorCVN0YXRNYXNrID0gMHg5YywKKwlSeEp1bWJvRnJhbWVzID0gMHhiYywKKwlUQ1BDaGVja1N1bUVycm9ycyA9IDB4YzAsCisJSVBDaGVja1N1bUVycm9ycyA9IDB4YzIsCisJVURQQ2hlY2tTdW1FcnJvcnMgPSAweGM0LAorCVR4SnVtYm9GcmFtZXMgPSAweGY0LAorCS8qIEV0aGVybmV0IE1JQiBzdGF0aXN0aWMgcmVnaXN0ZXIgb2Zmc2V0cyAqLworCU9jdGV0UmN2T2sgPSAweGE4LAorCU1jc3RPY3RldFJjdk9rID0gMHhhYywKKwlCY3N0T2N0ZXRSY3ZPayA9IDB4YjAsCisJRnJhbWVzUmN2T2sgPSAweGI0LAorCU1jc3RGcmFtZXNSY3ZkT2sgPSAweGI4LAorCUJjc3RGcmFtZXNSY3ZkT2sgPSAweGJlLAorCU1hY0NvbnRyb2xGcmFtZXNSY3ZkID0gMHhjNiwKKwlGcmFtZVRvb0xvbmdFcnJvcnMgPSAweGM4LAorCUluUmFuZ2VMZW5ndGhFcnJvcnMgPSAweGNhLAorCUZyYW1lc0NoZWNrU2VxRXJyb3JzID0gMHhjYywKKwlGcmFtZXNMb3N0UnhFcnJvcnMgPSAweGNlLAorCU9jdGV0WG10T2sgPSAweGQwLAorCU1jc3RPY3RldFhtdE9rID0gMHhkNCwKKwlCY3N0T2N0ZXRYbXRPayA9IDB4ZDgsCisJRnJhbWVzWG10T2sgPSAweGRjLAorCU1jc3RGcmFtZXNYbXRkT2sgPSAweGUwLAorCUZyYW1lc1dEZWZlcnJlZFhtdCA9IDB4ZTQsCisJTGF0ZUNvbGxpc2lvbnMgPSAweGU4LAorCU11bHRpQ29sRnJhbWVzID0gMHhlYywKKwlTaW5nbGVDb2xGcmFtZXMgPSAweGYwLAorCUJjc3RGcmFtZXNYbXRkT2sgPSAweGY2LAorCUNhcnJpZXJTZW5zZUVycm9ycyA9IDB4ZjgsCisJTWFjQ29udHJvbEZyYW1lc1htdGQgPSAweGZhLAorCUZyYW1lc0Fib3J0WFNDb2xscyA9IDB4ZmMsCisJRnJhbWVzV0VYRGVmZXJhbCA9IDB4ZmUsCisJLyogUk1PTiBzdGF0aXN0aWMgcmVnaXN0ZXIgb2Zmc2V0cyAqLworCUV0aGVyU3RhdHNDb2xsaXNpb25zID0gMHgxMDAsCisJRXRoZXJTdGF0c09jdGV0c1RyYW5zbWl0ID0gMHgxMDQsCisJRXRoZXJTdGF0c1BrdHNUcmFuc21pdCA9IDB4MTA4LAorCUV0aGVyU3RhdHNQa3RzNjRPY3RldFRyYW5zbWl0ID0gMHgxMGMsCisJRXRoZXJTdGF0czY1dG8xMjdPY3RldHNUcmFuc21pdCA9IDB4MTEwLAorCUV0aGVyU3RhdHNQa3RzMTI4dG8yNTVPY3RldHNUcmFuc21pdCA9IDB4MTE0LAorCUV0aGVyU3RhdHNQa3RzMjU2dG81MTFPY3RldHNUcmFuc21pdCA9IDB4MTE4LAorCUV0aGVyU3RhdHNQa3RzNTEydG8xMDIzT2N0ZXRzVHJhbnNtaXQgPSAweDExYywKKwlFdGhlclN0YXRzUGt0czEwMjR0bzE1MThPY3RldHNUcmFuc21pdCA9IDB4MTIwLAorCUV0aGVyU3RhdHNDUkNBbGlnbkVycm9ycyA9IDB4MTI0LAorCUV0aGVyU3RhdHNVbmRlcnNpemVQa3RzID0gMHgxMjgsCisJRXRoZXJTdGF0c0ZyYWdtZW50cyA9IDB4MTJjLAorCUV0aGVyU3RhdHNKYWJiZXJzID0gMHgxMzAsCisJRXRoZXJTdGF0c09jdGV0cyA9IDB4MTM0LAorCUV0aGVyU3RhdHNQa3RzID0gMHgxMzgsCisJRXRoZXJTdGF0czY0T2N0ZXRzID0gMHgxM2MsCisJRXRoZXJTdGF0c1BrdHM2NXRvMTI3T2N0ZXRzID0gMHgxNDAsCisJRXRoZXJTdGF0c1BrdHMxMjh0bzI1NU9jdGV0cyA9IDB4MTQ0LAorCUV0aGVyU3RhdHNQa3RzMjU2dG81MTFPY3RldHMgPSAweDE0OCwKKwlFdGhlclN0YXRzUGt0czUxMnRvMTAyM09jdGV0cyA9IDB4MTRjLAorCUV0aGVyU3RhdHNQa3RzMTAyNHRvMTUxOE9jdGV0cyA9IDB4MTUwLAorfTsKKworLyogQml0cyBpbiB0aGUgaW50ZXJydXB0IHN0YXR1cy9tYXNrIHJlZ2lzdGVycy4gKi8KK2VudW0gSW50U3RhdHVzX2JpdHMgeworCUludGVycnVwdFN0YXR1cyA9IDB4MDAwMSwKKwlIb3N0RXJyb3IgPSAweDAwMDIsCisJTUFDQ3RybEZyYW1lID0gMHgwMDA4LAorCVR4Q29tcGxldGUgPSAweDAwMDQsCisJUnhDb21wbGV0ZSA9IDB4MDAxMCwKKwlSeEVhcmx5ID0gMHgwMDIwLAorCUludFJlcXVlc3RlZCA9IDB4MDA0MCwKKwlVcGRhdGVTdGF0cyA9IDB4MDA4MCwKKwlMaW5rRXZlbnQgPSAweDAxMDAsCisJVHhETUFDb21wbGV0ZSA9IDB4MDIwMCwKKwlSeERNQUNvbXBsZXRlID0gMHgwNDAwLAorCVJGRExpc3RFbmQgPSAweDA4MDAsCisJUnhETUFQcmlvcml0eSA9IDB4MTAwMCwKK307CisKKy8qIEJpdHMgaW4gdGhlIFJlY2VpdmVNb2RlIHJlZ2lzdGVyLiAqLworZW51bSBSZWNlaXZlTW9kZV9iaXRzIHsKKwlSZWNlaXZlVW5pY2FzdCA9IDB4MDAwMSwKKwlSZWNlaXZlTXVsdGljYXN0ID0gMHgwMDAyLAorCVJlY2VpdmVCcm9hZGNhc3QgPSAweDAwMDQsCisJUmVjZWl2ZUFsbEZyYW1lcyA9IDB4MDAwOCwKKwlSZWNlaXZlTXVsdGljYXN0SGFzaCA9IDB4MDAxMCwKKwlSZWNlaXZlSVBNdWx0aWNhc3QgPSAweDAwMjAsCisJUmVjZWl2ZVZMQU5NYXRjaCA9IDB4MDEwMCwKKwlSZWNlaXZlVkxBTkhhc2ggPSAweDAyMDAsCit9OworLyogQml0cyBpbiBNQUNDdHJsLiAqLworZW51bSBNQUNDdHJsX2JpdHMgeworCUR1cGxleFNlbGVjdCA9IDB4MjAsCisJVHhGbG93Q29udHJvbEVuYWJsZSA9IDB4ODAsCisJUnhGbG93Q29udHJvbEVuYWJsZSA9IDB4MDEwMCwKKwlSY3ZGQ1MgPSAweDIwMCwKKwlBdXRvVkxBTnRhZ2dpbmcgPSAweDEwMDAsCisJQXV0b1ZMQU51bnRhZ2dpbmcgPSAweDIwMDAsCisJU3RhdHNFbmFibGUgPSAweDAwMjAwMDAwLAorCVN0YXRzRGlzYWJsZSA9IDB4MDA0MDAwMDAsCisJU3RhdHNFbmFibGVkID0gMHgwMDgwMDAwMCwKKwlUeEVuYWJsZSA9IDB4MDEwMDAwMDAsCisJVHhEaXNhYmxlID0gMHgwMjAwMDAwMCwKKwlUeEVuYWJsZWQgPSAweDA0MDAwMDAwLAorCVJ4RW5hYmxlID0gMHgwODAwMDAwMCwKKwlSeERpc2FibGUgPSAweDEwMDAwMDAwLAorCVJ4RW5hYmxlZCA9IDB4MjAwMDAwMDAsCit9OworCitlbnVtIEFTSUNDdHJsX0xvV29yZF9iaXRzIHsKKwlQaHlNZWRpYSA9IDB4MDA4MCwKK307CisJCitlbnVtIEFTSUNDdHJsX0hpV29yZF9iaXRzIHsKKwlHbG9iYWxSZXNldCA9IDB4MDAwMSwKKwlSeFJlc2V0ID0gMHgwMDAyLAorCVR4UmVzZXQgPSAweDAwMDQsCisJRE1BUmVzZXQgPSAweDAwMDgsCisJRklGT1Jlc2V0ID0gMHgwMDEwLAorCU5ldHdvcmtSZXNldCA9IDB4MDAyMCwKKwlIb3N0UmVzZXQgPSAweDAwNDAsCisJUmVzZXRCdXN5ID0gMHgwNDAwLAorfTsKKworLyogVHJhbnNtaXQgRnJhbWUgQ29udHJvbCBiaXRzICovCitlbnVtIFRGQ19iaXRzIHsKKwlEd29yZEFsaWduID0gMHgwMDAwMDAwMCwKKwlXb3JkQWxpZ25EaXNhYmxlID0gMHgwMDAzMDAwMCwKKwlXb3JkQWxpZ24gPSAweDAwMDIwMDAwLAorCVRDUENoZWNrc3VtRW5hYmxlID0gMHgwMDA0MDAwMCwKKwlVRFBDaGVja3N1bUVuYWJsZSA9IDB4MDAwODAwMDAsCisJSVBDaGVja3N1bUVuYWJsZSA9IDB4MDAxMDAwMDAsCisJRkNTQXBwZW5kRGlzYWJsZSA9IDB4MDAyMDAwMDAsCisJVHhJbmRpY2F0ZSA9IDB4MDA0MDAwMDAsCisJVHhETUFJbmRpY2F0ZSA9IDB4MDA4MDAwMDAsCisJRnJhZ0NvdW50U2hpZnQgPSAyNCwKKwlWTEFOVGFnSW5zZXJ0ID0gMHgwMDAwMDAwMDEwMDAwMDAwLAorCVRGRERvbmUgPSAweDgwMDAwMDAwLAorCVZJRFNoaWZ0ID0gMzIsCisJVXNlUHJpb3JpdHlTaGlmdCA9IDQ4LAorfTsKKworLyogUmVjZWl2ZSBGcmFtZXMgU3RhdHVzIGJpdHMgKi8KK2VudW0gUkZTX2JpdHMgeworCVJ4RklGT092ZXJydW4gPSAweDAwMDEwMDAwLAorCVJ4UnVudEZyYW1lID0gMHgwMDAyMDAwMCwKKwlSeEFsaWdubWVudEVycm9yID0gMHgwMDA0MDAwMCwKKwlSeEZDU0Vycm9yID0gMHgwMDA4MDAwMCwKKwlSeE92ZXJTaXplZEZyYW1lID0gMHgwMDEwMDAwMCwKKwlSeExlbmd0aEVycm9yID0gMHgwMDIwMDAwMCwKKwlWTEFORGV0ZWN0ZWQgPSAweDAwNDAwMDAwLAorCVRDUERldGVjdGVkID0gMHgwMDgwMDAwMCwKKwlUQ1BFcnJvciA9IDB4MDEwMDAwMDAsCisJVURQRGV0ZWN0ZWQgPSAweDAyMDAwMDAwLAorCVVEUEVycm9yID0gMHgwNDAwMDAwMCwKKwlJUERldGVjdGVkID0gMHgwODAwMDAwMCwKKwlJUEVycm9yID0gMHgxMDAwMDAwMCwKKwlGcmFtZVN0YXJ0ID0gMHgyMDAwMDAwMCwKKwlGcmFtZUVuZCA9IDB4NDAwMDAwMDAsCisJUkZERG9uZSA9IDB4ODAwMDAwMDAsCisJVENJU2hpZnQgPSAzMiwKKwlSRlNfRXJyb3JzID0gMHgwMDNmMDAwMCwKK307CisKKyNkZWZpbmUgTUlJX1JFU0VUX1RJTUVfT1VUCQkxMDAwMAorLyogTUlJIHJlZ2lzdGVyICovCitlbnVtIF9taWlfcmVnIHsKKwlNSUlfQk1DUiA9IDAsCisJTUlJX0JNU1IgPSAxLAorCU1JSV9QSFlfSUQxID0gMiwKKwlNSUlfUEhZX0lEMiA9IDMsCisJTUlJX0FOQVIgPSA0LAorCU1JSV9BTkxQQVIgPSA1LAorCU1JSV9BTkVSID0gNiwKKwlNSUlfQU5OUFQgPSA3LAorCU1JSV9BTkxQUk5QID0gOCwKKwlNSUlfTVNDUiA9IDksCisJTUlJX01TU1IgPSAxMCwKKwlNSUlfRVNSID0gMTUsCisJTUlJX1BIWV9TQ1IgPSAxNiwKK307CisvKiBQQ1MgcmVnaXN0ZXIgKi8KK2VudW0gX3Bjc19yZWcgeworCVBDU19CTUNSID0gMCwKKwlQQ1NfQk1TUiA9IDEsCisJUENTX0FOQVIgPSA0LAorCVBDU19BTkxQQVIgPSA1LAorCVBDU19BTkVSID0gNiwKKwlQQ1NfQU5OUFQgPSA3LAorCVBDU19BTkxQUk5QID0gOCwKKwlQQ1NfRVNSID0gMTUsCit9OworCisvKiBCYXNpYyBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgKi8KK3R5cGVkZWYgdW5pb24gdF9NSUlfQk1DUiB7CisJdTE2IGltYWdlOworCXN0cnVjdCB7CisJCXUxNiBfYml0XzVfMDo2OwkvLyBiaXQgNTowCisJCXUxNiBzcGVlZDEwMDA6MTsJLy8gYml0IDYKKwkJdTE2IGNvbF90ZXN0X2VuYWJsZToxOwkvLyBiaXQgNworCQl1MTYgZHVwbGV4X21vZGU6MTsJLy8gYml0IDgKKwkJdTE2IHJlc3RhcnRfYW46MTsJLy8gYml0IDkKKwkJdTE2IGlzb2xhdGU6MTsJLy8gYml0IDEwCisJCXUxNiBwb3dlcl9kb3duOjE7CS8vIGJpdCAxMQorCQl1MTYgYW5fZW5hYmxlOjE7CS8vIGJpdCAxMgorCQl1MTYgc3BlZWQxMDA6MTsJLy8gYml0IDEzCisJCXUxNiBsb29wYmFjazoxOwkvLyBiaXQgMTQKKwkJdTE2IHJlc2V0OjE7CS8vIGJpdCAxNQorCX0gYml0czsKK30gQk1DUl90LCAqUEJNQ1JfdDsKKworZW51bSBfbWlpX2JtY3IgeworCU1JSV9CTUNSX1JFU0VUID0gMHg4MDAwLAorCU1JSV9CTUNSX0xPT1BfQkFDSyA9IDB4NDAwMCwKKwlNSUlfQk1DUl9TUEVFRF9MU0IgPSAweDIwMDAsCisJTUlJX0JNQ1JfQU5fRU5BQkxFID0gMHgxMDAwLAorCU1JSV9CTUNSX1BPV0VSX0RPV04gPSAweDA4MDAsCisJTUlJX0JNQ1JfSVNPTEFURSA9IDB4MDQwMCwKKwlNSUlfQk1DUl9SRVNUQVJUX0FOID0gMHgwMjAwLAorCU1JSV9CTUNSX0RVUExFWF9NT0RFID0gMHgwMTAwLAorCU1JSV9CTUNSX0NPTF9URVNUID0gMHgwMDgwLAorCU1JSV9CTUNSX1NQRUVEX01TQiA9IDB4MDA0MCwKKwlNSUlfQk1DUl9TUEVFRF9SRVNFUlZFRCA9IDB4MDAzZiwKKwlNSUlfQk1DUl9TUEVFRF8xMCA9IDAsCisJTUlJX0JNQ1JfU1BFRURfMTAwID0gTUlJX0JNQ1JfU1BFRURfTFNCLAorCU1JSV9CTUNSX1NQRUVEXzEwMDAgPSBNSUlfQk1DUl9TUEVFRF9NU0IsCit9OworCisvKiBCYXNpYyBNb2RlIFN0YXR1cyBSZWdpc3RlciAqLwordHlwZWRlZiB1bmlvbiB0X01JSV9CTVNSIHsKKwl1MTYgaW1hZ2U7CisJc3RydWN0IHsKKwkJdTE2IGV4dF9jYXBhYmlsaXR5OjE7CS8vIGJpdCAwCisJCXUxNiBqYXBwZXJfZGV0ZWN0OjE7CS8vIGJpdCAxCisJCXUxNiBsaW5rX3N0YXR1czoxOwkvLyBiaXQgMgorCQl1MTYgYW5fYWJpbGl0eToxOwkvLyBiaXQgMworCQl1MTYgcmVtb3RlX2ZhdWx0OjE7CS8vIGJpdCA0CisJCXUxNiBhbl9jb21wbGV0ZToxOwkvLyBiaXQgNQorCQl1MTYgcHJlYW1ibGVfc3VwcDoxOwkvLyBiaXQgNgorCQl1MTYgX2JpdF83OjE7CS8vIGJpdCA3CisJCXUxNiBleHRfc3RhdHVzOjE7CS8vIGJpdCA4CisJCXUxNiBtZWRpYV8xMDBCVDJfSEQ6MTsJLy8gYml0IDkKKwkJdTE2IG1lZGlhXzEwMEJUMl9GRDoxOwkvLyBiaXQgMTAKKwkJdTE2IG1lZGlhXzEwQlRfSEQ6MTsJLy8gYml0IDExCisJCXUxNiBtZWRpYV8xMEJUX0ZEOjE7CS8vIGJpdCAxMgorCQl1MTYgbWVkaWFfMTAwQlhfSEQ6MTsJLy8gYml0IDEzCisJCXUxNiBtZWRpYV8xMDBCWF9GRDoxOwkvLyBiaXQgMTQKKwkJdTE2IG1lZGlhXzEwMEJUNDoxOwkvLyBiaXQgMTUKKwl9IGJpdHM7Cit9IEJNU1JfdCwgKlBCTVNSX3Q7CisKK2VudW0gX21paV9ibXNyIHsKKwlNSUlfQk1TUl8xMDBCVDQgPSAweDgwMDAsCisJTUlJX0JNU1JfMTAwQlhfRkQgPSAweDQwMDAsCisJTUlJX0JNU1JfMTAwQlhfSEQgPSAweDIwMDAsCisJTUlJX0JNU1JfMTBCVF9GRCA9IDB4MTAwMCwKKwlNSUlfQk1TUl8xMEJUX0hEID0gMHgwODAwLAorCU1JSV9CTVNSXzEwMEJUMl9GRCA9IDB4MDQwMCwKKwlNSUlfQk1TUl8xMDBCVDJfSEQgPSAweDAyMDAsCisJTUlJX0JNU1JfRVhUX1NUQVRVUyA9IDB4MDEwMCwKKwlNSUlfQk1TUl9QUkVBTUJMRV9TVVBQID0gMHgwMDQwLAorCU1JSV9CTVNSX0FOX0NPTVBMRVRFID0gMHgwMDIwLAorCU1JSV9CTVNSX1JFTU9URV9GQVVMVCA9IDB4MDAxMCwKKwlNSUlfQk1TUl9BTl9BQklMSVRZID0gMHgwMDA4LAorCU1JSV9CTVNSX0xJTktfU1RBVFVTID0gMHgwMDA0LAorCU1JSV9CTVNSX0pBQkJFUl9ERVRFQ1QgPSAweDAwMDIsCisJTUlJX0JNU1JfRVhUX0NBUCA9IDB4MDAwMSwKK307CisKKy8qIEFOQVIgKi8KK3R5cGVkZWYgdW5pb24gdF9NSUlfQU5BUiB7CisJdTE2IGltYWdlOworCXN0cnVjdCB7CisJCXUxNiBzZWxlY3Rvcjo1OwkvLyBiaXQgNDowCisJCXUxNiBtZWRpYV8xMEJUX0hEOjE7CS8vIGJpdCA1CisJCXUxNiBtZWRpYV8xMEJUX0ZEOjE7CS8vIGJpdCA2CisJCXUxNiBtZWRpYV8xMDBCWF9IRDoxOwkvLyBiaXQgNworCQl1MTYgbWVkaWFfMTAwQlhfRkQ6MTsJLy8gYml0IDgKKwkJdTE2IG1lZGlhXzEwMEJUNDoxOwkvLyBiaXQgOQorCQl1MTYgcGF1c2U6MTsJLy8gYml0IDEwCisJCXUxNiBhc3ltbWV0cmljOjE7CS8vIGJpdCAxMQorCQl1MTYgX2JpdDEyOjE7CS8vIGJpdCAxMgorCQl1MTYgcmVtb3RlX2ZhdWx0OjE7CS8vIGJpdCAxMworCQl1MTYgX2JpdDE0OjE7CS8vIGJpdCAxNAorCQl1MTYgbmV4dF9wYWdlOjE7CS8vIGJpdCAxNQorCX0gYml0czsKK30gQU5BUl90LCAqUEFOQVJfdDsKKworZW51bSBfbWlpX2FuYXIgeworCU1JSV9BTkFSX05FWFRfUEFHRSA9IDB4ODAwMCwKKwlNSUlfQU5BUl9SRU1PVEVfRkFVTFQgPSAweDQwMDAsCisJTUlJX0FOQVJfQVNZTU1FVFJJQyA9IDB4MDgwMCwKKwlNSUlfQU5BUl9QQVVTRSA9IDB4MDQwMCwKKwlNSUlfQU5BUl8xMDBCVDQgPSAweDAyMDAsCisJTUlJX0FOQVJfMTAwQlhfRkQgPSAweDAxMDAsCisJTUlJX0FOQVJfMTAwQlhfSEQgPSAweDAwODAsCisJTUlJX0FOQVJfMTBCVF9GRCA9IDB4MDAyMCwKKwlNSUlfQU5BUl8xMEJUX0hEID0gMHgwMDEwLAorCU1JSV9BTkFSX1NFTEVDVE9SID0gMHgwMDFmLAorCU1JSV9JRUVFODAyM19DU01BQ0QgPSAweDAwMDEsCit9OworCisvKiBBTkxQQVIgKi8KK3R5cGVkZWYgdW5pb24gdF9NSUlfQU5MUEFSIHsKKwl1MTYgaW1hZ2U7CisJc3RydWN0IHsKKwkJdTE2IHNlbGVjdG9yOjU7CS8vIGJpdCA0OjAKKwkJdTE2IG1lZGlhXzEwQlRfSEQ6MTsJLy8gYml0IDUKKwkJdTE2IG1lZGlhXzEwQlRfRkQ6MTsJLy8gYml0IDYKKwkJdTE2IG1lZGlhXzEwMEJYX0hEOjE7CS8vIGJpdCA3CisJCXUxNiBtZWRpYV8xMDBCWF9GRDoxOwkvLyBiaXQgOAorCQl1MTYgbWVkaWFfMTAwQlQ0OjE7CS8vIGJpdCA5CisJCXUxNiBwYXVzZToxOwkvLyBiaXQgMTAKKwkJdTE2IGFzeW1tZXRyaWM6MTsJLy8gYml0IDExCisJCXUxNiBfYml0MTI6MTsJLy8gYml0IDEyCisJCXUxNiByZW1vdGVfZmF1bHQ6MTsJLy8gYml0IDEzCisJCXUxNiBfYml0MTQ6MTsJLy8gYml0IDE0CisJCXUxNiBuZXh0X3BhZ2U6MTsJLy8gYml0IDE1CisJfSBiaXRzOworfSBBTkxQQVJfdCwgKlBBTkxQQVJfdDsKKworZW51bSBfbWlpX2FubHBhciB7CisJTUlJX0FOTFBBUl9ORVhUX1BBR0UgPSBNSUlfQU5BUl9ORVhUX1BBR0UsCisJTUlJX0FOTFBBUl9SRU1PVEVfRkFVTFQgPSBNSUlfQU5BUl9SRU1PVEVfRkFVTFQsCisJTUlJX0FOTFBBUl9BU1lNTUVUUklDID0gTUlJX0FOQVJfQVNZTU1FVFJJQywKKwlNSUlfQU5MUEFSX1BBVVNFID0gTUlJX0FOQVJfUEFVU0UsCisJTUlJX0FOTFBBUl8xMDBCVDQgPSBNSUlfQU5BUl8xMDBCVDQsCisJTUlJX0FOTFBBUl8xMDBCWF9GRCA9IE1JSV9BTkFSXzEwMEJYX0ZELAorCU1JSV9BTkxQQVJfMTAwQlhfSEQgPSBNSUlfQU5BUl8xMDBCWF9IRCwKKwlNSUlfQU5MUEFSXzEwQlRfRkQgPSBNSUlfQU5BUl8xMEJUX0ZELAorCU1JSV9BTkxQQVJfMTBCVF9IRCA9IE1JSV9BTkFSXzEwQlRfSEQsCisJTUlJX0FOTFBBUl9TRUxFQ1RPUiA9IE1JSV9BTkFSX1NFTEVDVE9SLAorfTsKKworLyogQXV0by1OZWdvdGlhdGlvbiBFeHBhbnNpb24gUmVnaXN0ZXIgKi8KK3R5cGVkZWYgdW5pb24gdF9NSUlfQU5FUiB7CisJdTE2IGltYWdlOworCXN0cnVjdCB7CisJCXUxNiBscF9uZWdvdGlhYmxlOjE7CS8vIGJpdCAwCisJCXUxNiBwYWdlX3JlY2VpdmVkOjE7CS8vIGJpdCAxCisJCXUxNiBuZXh0cGFnYWJsZToxOwkvLyBiaXQgMgorCQl1MTYgbHBfbmV4dHBhZ2FibGU6MTsJLy8gYml0IDMKKwkJdTE2IHBkZXRlY3RfZmF1bHQ6MTsJLy8gYml0IDQKKwkJdTE2IF9iaXQxNV81OjExOwkvLyBiaXQgMTU6NQorCX0gYml0czsKK30gQU5FUl90LCAqUEFORVJfdDsKKworZW51bSBfbWlpX2FuZXIgeworCU1JSV9BTkVSX1BBUl9ERVRFQ1RfRkFVTFQgPSAweDAwMTAsCisJTUlJX0FORVJfTFBfTkVYVFBBR0FCTEUgPSAweDAwMDgsCisJTUlJX0FORVJfTkVUWFRQQUdBQkxFID0gMHgwMDA0LAorCU1JSV9BTkVSX1BBR0VfUkVDRUlWRUQgPSAweDAwMDIsCisJTUlJX0FORVJfTFBfTkVHT1RJQUJMRSA9IDB4MDAwMSwKK307CisKKy8qIE1BU1RFUi1TTEFWRSBDb250cm9sIFJlZ2lzdGVyICovCit0eXBlZGVmIHVuaW9uIHRfTUlJX01TQ1IgeworCXUxNiBpbWFnZTsKKwlzdHJ1Y3QgeworCQl1MTYgX2JpdF83XzA6ODsJLy8gYml0IDc6MAorCQl1MTYgbWVkaWFfMTAwMEJUX0hEOjE7CS8vIGJpdCA4CisJCXUxNiBtZWRpYV8xMDAwQlRfRkQ6MTsJLy8gYml0IDkKKwkJdTE2IHBvcnRfdHlwZToxOwkvLyBiaXQgMTAKKwkJdTE2IGNmZ192YWx1ZToxOwkvLyBiaXQgMTEKKwkJdTE2IGNmZ19lbmFibGU6MTsJLy8gYml0IDEyCisJCXUxNiB0ZXN0X21vZGU6MzsJLy8gYml0IDE1OjEzCisJfSBiaXRzOworfSBNU0NSX3QsICpQTVNDUl90OworCitlbnVtIF9taWlfbXNjciB7CisJTUlJX01TQ1JfVEVTVF9NT0RFID0gMHhlMDAwLAorCU1JSV9NU0NSX0NGR19FTkFCTEUgPSAweDEwMDAsCisJTUlJX01TQ1JfQ0ZHX1ZBTFVFID0gMHgwODAwLAorCU1JSV9NU0NSX1BPUlRfVkFMVUUgPSAweDA0MDAsCisJTUlJX01TQ1JfMTAwMEJUX0ZEID0gMHgwMjAwLAorCU1JSV9NU0NSXzEwMDBCVF9IRCA9IDBYMDEwMCwKK307CisKKy8qIE1BU1RFUi1TTEFWRSBTdGF0dXMgUmVnaXN0ZXIgKi8KK3R5cGVkZWYgdW5pb24gdF9NSUlfTVNTUiB7CisJdTE2IGltYWdlOworCXN0cnVjdCB7CisJCXUxNiBpZGxlX2Vycl9jb3VudDo4OwkvLyBiaXQgNzowCisJCXUxNiBfYml0XzlfODoyOwkvLyBiaXQgOTo4CisJCXUxNiBscF8xMDAwQlRfSEQ6MTsJLy8gYml0IDEwCisJCXUxNiBscF8xMDAwQlRfRkQ6MTsJLy8gYml0IDExCisJCXUxNiByZW1vdGVfcmN2X3N0YXR1czoxOwkvLyBiaXQgMTIKKwkJdTE2IGxvY2FsX3Jjdl9zdGF0dXM6MTsJLy8gYml0IDEzCisJCXUxNiBjZmdfcmVzb2x1dGlvbjoxOwkvLyBiaXQgMTQKKwkJdTE2IGNmZ19mYXVsdDoxOwkvLyBiaXQgMTUKKwl9IGJpdHM7Cit9IE1TU1JfdCwgKlBNU1NSX3Q7CisKK2VudW0gX21paV9tc3NyIHsKKwlNSUlfTVNTUl9DRkdfRkFVTFQgPSAweDgwMDAsCisJTUlJX01TU1JfQ0ZHX1JFUyA9IDB4NDAwMCwKKwlNSUlfTVNTUl9MT0NBTF9SQ1ZfU1RBVFVTID0gMHgyMDAwLAorCU1JSV9NU1NSX1JFTU9URV9SQ1ZSID0gMHgxMDAwLAorCU1JSV9NU1NSX0xQXzEwMDBCVF9IRCA9IDB4MDgwMCwKKwlNSUlfTVNTUl9MUF8xMDAwQlRfRkQgPSAweDA0MDAsCisJTUlJX01TU1JfSURMRV9FUlJfQ09VTlQgPSAweDAwZmYsCit9OworCisvKiBJRUVFIEV4dGVuZWQgU3RhdHVzIFJlZ2lzdGVyICovCit0eXBlZGVmIHVuaW9uIHRfTUlJX0VTUiB7CisJdTE2IGltYWdlOworCXN0cnVjdCB7CisJCXUxNiBfYml0XzExXzA6MTI7CS8vIGJpdCAxMTowCisJCXUxNiBtZWRpYV8xMDAwQlRfSEQ6MjsJLy8gYml0IDEyCisJCXUxNiBtZWRpYV8xMDAwQlRfRkQ6MTsJLy8gYml0IDEzCisJCXUxNiBtZWRpYV8xMDAwQlhfSEQ6MTsJLy8gYml0IDE0CisJCXUxNiBtZWRpYV8xMDAwQlhfRkQ6MTsJLy8gYml0IDE1CisJfSBiaXRzOworfSBFU1JfdCwgKlBFU1JfdDsKKworZW51bSBfbWlpX2VzciB7CisJTUlJX0VTUl8xMDAwQlhfRkQgPSAweDgwMDAsCisJTUlJX0VTUl8xMDAwQlhfSEQgPSAweDQwMDAsCisJTUlJX0VTUl8xMDAwQlRfRkQgPSAweDIwMDAsCisJTUlJX0VTUl8xMDAwQlRfSEQgPSAweDEwMDAsCit9OworLyogUEhZIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIgKi8KK3R5cGVkZWYgdW5pb24gdF9NSUlfUEhZX1NDUiB7CisJdTE2IGltYWdlOworCXN0cnVjdCB7CisJCXUxNiBkaXNhYmxlX2phYmJlcjoxOwkvLyBiaXQgMAorCQl1MTYgcG9sYXJpdHlfcmV2ZXJzYWw6MTsJLy8gYml0IDEKKwkJdTE2IFNFUV90ZXN0OjE7CS8vIGJpdCAyCisJCXUxNiBfYml0XzM6MTsJLy8gYml0IDMKKwkJdTE2IGRpc2FibGVfQ0xLMTI1OjE7CS8vIGJpdCA0CisJCXUxNiBtZGlfY3Jvc3NvdmVyX21vZGU6MjsJLy8gYml0IDY6NQorCQl1MTYgZW5hYmxlX2V4dF9kaXN0OjE7CS8vIGJpdCA3CisJCXUxNiBfYml0XzhfOToyOwkvLyBiaXQgOTo4CisJCXUxNiBmb3JjZV9saW5rOjE7CS8vIGJpdCAxMAorCQl1MTYgYXNzZXJ0X0NSUzoxOwkvLyBiaXQgMTEKKwkJdTE2IHJjdl9maWZvX2RlcHRoOjI7CS8vIGJpdCAxMzoxMgorCQl1MTYgeG1pdF9maWZvX2RlcHRoOjI7CS8vIGJpdCAxNToxNAorCX0gYml0czsKK30gUEhZX1NDUl90LCAqUFBIWV9TQ1JfdDsKKwordHlwZWRlZiBlbnVtIHRfTUlJX0FETUlOX1NUQVRVUyB7CisJYWRtX3Jlc2V0LAorCWFkbV9vcGVyYXRpb25hbCwKKwlhZG1fbG9vcGJhY2ssCisJYWRtX3Bvd2VyX2Rvd24sCisJYWRtX2lzb2xhdGUKK30gTUlJX0FETUlOX3QsICpQTUlJX0FETUlOX3Q7CisKKy8qIFBoeXNpY2FsIENvZGluZyBTdWJsYXllciBNYW5hZ2VtZW50IChQQ1MpICovCisvKiBQQ1MgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVycyBiaXRtYXAgYXMgdGhlIHNhbWUgYXMgTUlJICovCisvKiBQQ1MgRXh0ZW5kZWQgU3RhdHVzIHJlZ2lzdGVyIGJpdG1hcCBhcyB0aGUgc2FtZSBhcyBNSUkgKi8KKy8qIFBDUyBBTkFSICovCit0eXBlZGVmIHVuaW9uIHRfUENTX0FOQVIgeworCXUxNiBpbWFnZTsKKwlzdHJ1Y3QgeworCQl1MTYgX2JpdF80XzA6NTsJCS8vIGJpdCA0OjAKKwkJdTE2IGZ1bGxfZHVwbGV4OjE7CS8vIGJpdCA1CisJCXUxNiBoYWxmX2R1cGxleDoxOwkvLyBiaXQgNgorCQl1MTYgYXN5bW1ldHJpYzoxOwkvLyBiaXQgNworCQl1MTYgcGF1c2U6MTsJCS8vIGJpdCA4CisJCXUxNiBfYml0XzExXzk6MzsJLy8gYml0IDExOjkKKwkJdTE2IHJlbW90ZV9mYXVsdDoyOwkvLyBiaXQgMTM6MTIKKwkJdTE2IF9iaXRfMTQ6MTsJCS8vIGJpdCAxNAorCQl1MTYgbmV4dF9wYWdlOjE7CS8vIGJpdCAxNQorCX0gYml0czsKK30gQU5BUl9QQ1NfdCwgKlBBTkFSX1BDU190OworCitlbnVtIF9wY3NfYW5hciB7CisJUENTX0FOQVJfTkVYVF9QQUdFID0gMHg4MDAwLAorCVBDU19BTkFSX1JFTU9URV9GQVVMVCA9IDB4MzAwMCwKKwlQQ1NfQU5BUl9BU1lNTUVUUklDID0gMHgwMTAwLAorCVBDU19BTkFSX1BBVVNFID0gMHgwMDgwLAorCVBDU19BTkFSX0hBTEZfRFVQTEVYID0gMHgwMDQwLAorCVBDU19BTkFSX0ZVTExfRFVQTEVYID0gMHgwMDIwLAorfTsKKy8qIFBDUyBBTkxQQVIgKi8KK3R5cGVkZWYgdW5pb24gdF9QQ1NfQU5MUEFSIHsKKwl1MTYgaW1hZ2U7CisJc3RydWN0IHsKKwkJdTE2IF9iaXRfNF8wOjU7CQkvLyBiaXQgNDowCisJCXUxNiBmdWxsX2R1cGxleDoxOwkvLyBiaXQgNQorCQl1MTYgaGFsZl9kdXBsZXg6MTsJLy8gYml0IDYKKwkJdTE2IGFzeW1tZXRyaWM6MTsJLy8gYml0IDcKKwkJdTE2IHBhdXNlOjE7CQkvLyBiaXQgOAorCQl1MTYgX2JpdF8xMV85OjM7CS8vIGJpdCAxMTo5CisJCXUxNiByZW1vdGVfZmF1bHQ6MjsJLy8gYml0IDEzOjEyCisJCXUxNiBfYml0XzE0OjE7CQkvLyBiaXQgMTQKKwkJdTE2IG5leHRfcGFnZToxOwkvLyBiaXQgMTUKKwl9IGJpdHM7Cit9IEFOTFBBUl9QQ1NfdCwgKlBBTkxQQVJfUENTX3Q7CisKK2VudW0gX3Bjc19hbmxwYXIgeworCVBDU19BTkxQQVJfTkVYVF9QQUdFID0gUENTX0FOQVJfTkVYVF9QQUdFLCAKKwlQQ1NfQU5MUEFSX1JFTU9URV9GQVVMVCA9IFBDU19BTkFSX1JFTU9URV9GQVVMVCwKKwlQQ1NfQU5MUEFSX0FTWU1NRVRSSUMgPSBQQ1NfQU5BUl9BU1lNTUVUUklDLAorCVBDU19BTkxQQVJfUEFVU0UgPSBQQ1NfQU5BUl9QQVVTRSwKKwlQQ1NfQU5MUEFSX0hBTEZfRFVQTEVYID0gUENTX0FOQVJfSEFMRl9EVVBMRVgsCisJUENTX0FOTFBBUl9GVUxMX0RVUExFWCA9IFBDU19BTkFSX0ZVTExfRFVQTEVYLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgdF9TUk9NIHsKKwl1MTYgY29uZmlnX3BhcmFtOwkvKiAweDAwICovCisJdTE2IGFzaWNfY3RybDsJCS8qIDB4MDIgKi8KKwl1MTYgc3ViX3ZlbmRvcl9pZDsJLyogMHgwNCAqLworCXUxNiBzdWJfc3lzdGVtX2lkOwkvKiAweDA2ICovCisJdTE2IHJlc2VydmVkMVsxMl07CS8qIDB4MDgtMHgxZiAqLworCXU4IG1hY19hZGRyWzZdOwkJLyogMHgyMC0weDI1ICovCisJdTggcmVzZXJ2ZWQyWzEwXTsJLyogMHgyNi0weDJmICovCisJdTggc2liWzIwNF07CQkvKiAweDMwLTB4ZmIgKi8KKwl1MzIgY3JjOwkJLyogMHhmYy0weGZmICovCit9IFNST01fdCwgKlBTUk9NX3Q7CisKKy8qIElvY3RsIGN1c3RvbSBkYXRhICovCitzdHJ1Y3QgaW9jdGxfZGF0YSB7CisJY2hhciBzaWduYXR1cmVbMTBdOworCWludCBjbWQ7CisJaW50IGxlbjsKKwljaGFyICpkYXRhOworfTsKKworc3RydWN0IG1paV9kYXRhIHsKKwlfX3UxNiByZXNlcnZlZDsKKwlfX3UxNiByZWdfbnVtOworCV9fdTE2IGluX3ZhbHVlOworCV9fdTE2IG91dF92YWx1ZTsKK307CisKKy8qIFRoZSBSeCBhbmQgVHggYnVmZmVyIGRlc2NyaXB0b3JzLiAqLworc3RydWN0IG5ldGRldl9kZXNjIHsKKwl1NjQgbmV4dF9kZXNjOworCXU2NCBzdGF0dXM7CisJdTY0IGZyYWdpbmZvOworfTsKKworI2RlZmluZSBQUklWX0FMSUdOCTE1CS8qIFJlcXVpcmVkIGFsaWdubWVudCBtYXNrICovCisvKiBVc2UgIF9fYXR0cmlidXRlX18oKGFsaWduZWQgKEwxX0NBQ0hFX0JZVEVTKSkpICB0byBtYWludGFpbiBhbGlnbm1lbnQKKyAgIHdpdGhpbiB0aGUgc3RydWN0dXJlLiAqLworc3RydWN0IG5ldGRldl9wcml2YXRlIHsKKwkvKiBEZXNjcmlwdG9yIHJpbmdzIGZpcnN0IGZvciBhbGlnbm1lbnQuICovCisJc3RydWN0IG5ldGRldl9kZXNjICpyeF9yaW5nOworCXN0cnVjdCBuZXRkZXZfZGVzYyAqdHhfcmluZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tidWZmW1JYX1JJTkdfU0laRV07CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYnVmZltUWF9SSU5HX1NJWkVdOworCWRtYV9hZGRyX3QgdHhfcmluZ19kbWE7CisJZG1hX2FkZHJfdCByeF9yaW5nX2RtYTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzcGlubG9ja190IHR4X2xvY2s7CisJc3BpbmxvY2tfdCByeF9sb2NrOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXVuc2lnbmVkIGludCByeF9idWZfc3o7CQkvKiBCYXNlZCBvbiBNVFUrc2xhY2suICovCisJdW5zaWduZWQgaW50IHNwZWVkOwkJLyogT3BlcmF0aW5nIHNwZWVkICovCisJdW5zaWduZWQgaW50IHZsYW47CQkvKiBWTEFOIElkICovCisJdW5zaWduZWQgaW50IGNoaXBfaWQ7CQkvKiBQQ0kgdGFibGUgY2hpcCBpZCAqLworCXVuc2lnbmVkIGludCByeF9jb2FsZXNjZTsgCS8qIE1heGltdW0gZnJhbWVzIGVhY2ggUnhETUFDb21wbGV0ZSBpbnRyICovCisJdW5zaWduZWQgaW50IHJ4X3RpbWVvdXQ7IAkvKiBXYWl0IHRpbWUgYmV0d2VlbiBSeERNQUNvbXBsZXRlIGludHIgKi8KKwl1bnNpZ25lZCBpbnQgdHhfY29hbGVzY2U7CS8qIE1heGltdW0gZnJhbWVzIGVhY2ggdHggaW50ZXJydXB0ICovCisJdW5zaWduZWQgaW50IGZ1bGxfZHVwbGV4OjE7CS8qIEZ1bGwtZHVwbGV4IG9wZXJhdGlvbiByZXF1ZXN0ZWQuICovCisJdW5zaWduZWQgaW50IGFuX2VuYWJsZToyOwkvKiBBdXRvLU5lZ290aWF0ZWQgRW5hYmxlICovCisJdW5zaWduZWQgaW50IGp1bWJvOjE7CQkvKiBKdW1ibyBmcmFtZSBlbmFibGUgKi8KKwl1bnNpZ25lZCBpbnQgY29hbGVzY2U6MTsJLyogUnggY29hbGVzY2luZyBlbmFibGUgKi8KKwl1bnNpZ25lZCBpbnQgdHhfZmxvdzoxOwkJLyogVHggZmxvdyBjb250cm9sIGVuYWJsZSAqLworCXVuc2lnbmVkIGludCByeF9mbG93OjE7CQkvKiBSeCBmbG93IGNvbnRyb2wgZW5hYmxlICovCisJdW5zaWduZWQgaW50IHBoeV9tZWRpYToxOwkvKiAxOiBmaWJlciwgMDogY29wcGVyICovCisJdW5zaWduZWQgaW50IGxpbmtfc3RhdHVzOjE7CS8qIEN1cnJlbnQgbGluayBzdGF0dXMgKi8KKwl1bnNpZ25lZCBjaGFyIHBjaV9yZXZfaWQ7CS8qIFBDSSByZXZpc2lvbiBJRCAqLworCXN0cnVjdCBuZXRkZXZfZGVzYyAqbGFzdF90eDsJLyogTGFzdCBUeCBkZXNjcmlwdG9yIHVzZWQuICovCisJdW5zaWduZWQgbG9uZyBjdXJfcngsIG9sZF9yeDsJLyogUHJvZHVjZXIvY29uc3VtZXIgcmluZyBpbmRpY2VzICovCisJdW5zaWduZWQgbG9uZyBjdXJfdHgsIG9sZF90eDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwlpbnQgd2FrZV9wb2xhcml0eTsKKwljaGFyIG5hbWVbMjU2XTsJCS8qIG5ldCBkZXZpY2UgZGVzY3JpcHRpb24gKi8KKwl1OCBkdXBsZXhfcG9sYXJpdHk7CisJdTE2IG1jYXN0X2ZpbHRlcls0XTsKKwl1MTYgYWR2ZXJ0aXNpbmc7CS8qIE5XYXkgbWVkaWEgYWR2ZXJ0aXNlbWVudCAqLworCXUxNiBuZWdvdGlhdGU7CQkvKiBOZWdvdGlhdGVkIG1lZGlhICovCisJaW50IHBoeV9hZGRyOwkJLyogUEhZIGFkZHJlc3Nlcy4gKi8KK307CisKKy8qIFRoZSBzdGF0aW9uIGFkZHJlc3MgbG9jYXRpb24gaW4gdGhlIEVFUFJPTS4gKi8KKyNpZmRlZiBNRU1fTUFQUElORworI2RlZmluZSBQQ0lfSU9UWVBFIChQQ0lfVVNFU19NQVNURVIgfCBQQ0lfVVNFU19NRU0gfCBQQ0lfQUREUjEpCisjZWxzZQorI2RlZmluZSBQQ0lfSU9UWVBFIChQQ0lfVVNFU19NQVNURVIgfCBQQ0lfVVNFU19JTyAgfCBQQ0lfQUREUjApCisjZW5kaWYKKy8qIFRoZSBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjb25zaXN0IG9mOgorICAgICAgICB2ZW5kb3IsIGRldmljZSAgICAgICAgICBWZW5kb3IgYW5kIGRldmljZSBJRCB0byBtYXRjaCAob3IgUENJX0FOWV9JRCkKKyAgICAgICAgc3VidmVuZG9yLCBzdWJkZXZpY2UgICAgU3Vic3lzdGVtIHZlbmRvciBhbmQgZGV2aWNlIElEIHRvIG1hdGNoIChvciBQQ0lfQU5ZX0lEKQorICAgICAgICBjbGFzcyAgICAgICAgICAgICAgICAgICBEZXZpY2UgY2xhc3MgdG8gbWF0Y2guIFRoZSBjbGFzc19tYXNrIHRlbGxzIHdoaWNoIGJpdHMKKyAgICAgICAgY2xhc3NfbWFzayAgICAgICAgICAgICAgb2YgdGhlIGNsYXNzIGFyZSBob25vcmVkIGR1cmluZyB0aGUgY29tcGFyaXNvbi4KKyAgICAgICAgZHJpdmVyX2RhdGEgICAgICAgICAgICAgRGF0YSBwcml2YXRlIHRvIHRoZSBkcml2ZXIuCisqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJpb19wY2lfdGJsW10gPSB7CisJezB4MTE4NiwgMHg0MDAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7MCx9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCByaW9fcGNpX3RibCk7CisjZGVmaW5lIFRYX1RJTUVPVVQgICg0KkhaKQorI2RlZmluZSBQQUNLRVRfU0laRQkJMTUzNgorI2RlZmluZSBNQVhfSlVNQk8JCTgwMDAKKyNkZWZpbmUgUklPX0lPX1NJWkUgICAgICAgICAgICAgMzQwCisjZGVmaW5lIERFRkFVTFRfUlhDCQk1CisjZGVmaW5lIERFRkFVTFRfUlhUCQk3NTAKKyNkZWZpbmUgREVGQVVMVF9UWEMJCTEKKyNkZWZpbmUgTUFYX1RYQwkJCTgKKyNlbmRpZgkJCQkvKiBfX0RMMktfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kdW1teS5jIGIvZHJpdmVycy9uZXQvZHVtbXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDhjMTVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZHVtbXkuYwpAQCAtMCwwICsxLDE1MiBAQAorLyogZHVtbXkuYzogYSBkdW1teSBuZXQgZHJpdmVyCisKKwlUaGUgcHVycG9zZSBvZiB0aGlzIGRyaXZlciBpcyB0byBwcm92aWRlIGEgZGV2aWNlIHRvIHBvaW50IGEKKwlyb3V0ZSB0aHJvdWdoLCBidXQgbm90IHRvIGFjdHVhbGx5IHRyYW5zbWl0IHBhY2tldHMuCisKKwlXaHk/ICBJZiB5b3UgaGF2ZSBhIG1hY2hpbmUgd2hvc2Ugb25seSBjb25uZWN0aW9uIGlzIGFuIG9jY2FzaW9uYWwKKwlQUFAvU0xJUC9QTElQIGxpbmssIHlvdSBjYW4gb25seSBjb25uZWN0IHRvIHlvdXIgb3duIGhvc3RuYW1lCisJd2hlbiB0aGUgbGluayBpcyB1cC4gIE90aGVyd2lzZSB5b3UgaGF2ZSB0byB1c2UgbG9jYWxob3N0LgorCVRoaXMgaXNuJ3QgdmVyeSBjb25zaXN0ZW50LgorCisJT25lIHNvbHV0aW9uIGlzIHRvIHNldCB1cCBhIGR1bW15IGxpbmsgdXNpbmcgUFBQL1NMSVAvUExJUCwKKwlidXQgdGhpcyBzZWVtcyAodG8gbWUpIHRvbyBtdWNoIG92ZXJoZWFkIGZvciB0b28gbGl0dGxlIGdhaW4uCisJVGhpcyBkcml2ZXIgcHJvdmlkZXMgYSBzbWFsbCBhbHRlcm5hdGl2ZS4gVGh1cyB5b3UgY2FuIGRvCisJCisJW3doZW4gbm90IHJ1bm5pbmcgc2xpcF0KKwkJaWZjb25maWcgZHVtbXkgc2xpcC5hZGRyLmVzcy5oZXJlIHVwCisJW3RvIGdvIHRvIHNsaXBdCisJCWlmY29uZmlnIGR1bW15IGRvd24KKwkJZGlwIHdoYXRldmVyCisKKwlUaGlzIHdhcyB3cml0dGVuIGJ5IGxvb2tpbmcgYXQgRG9uYWxkIEJlY2tlcidzIHNrZWxldG9uIGRyaXZlcgorCWFuZCB0aGUgbG9vcGJhY2sgZHJpdmVyLiAgSSB0aGVuIHRocmV3IGF3YXkgYW55dGhpbmcgdGhhdCBkaWRuJ3QKKwlhcHBseSEJVGhhbmtzIHRvIEFsYW4gQ294IGZvciB0aGUga2V5IGNsdWUgb24gd2hhdCB0byBkbyB3aXRoCisJbWlzZ3VpZGVkIHBhY2tldHMuCisKKwkJCU5pY2sgSG9sbG93YXksIDI3dGggTWF5IDE5OTQKKwlbSSB0d2Vha2VkIHRoaXMgZXhwbGFuYXRpb24gYSBsaXR0bGUgYnV0IHRoYXQncyBhbGxdCisJCQlBbGFuIENveCwgMzB0aCBNYXkgMTk5NAorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisKK3N0YXRpYyBpbnQgbnVtZHVtbWllcyA9IDE7CisKK3N0YXRpYyBpbnQgZHVtbXlfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZHVtbXlfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgaW50IGR1bW15X3NldF9hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCit7CisJc3RydWN0IHNvY2thZGRyICpzYSA9IHA7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoc2EtPnNhX2RhdGEpKSAKKwkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCQkKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgc2EtPnNhX2RhdGEsIEVUSF9BTEVOKTsKKwlyZXR1cm4gMDsKK30KKworLyogZmFrZSBtdWx0aWNhc3QgYWJpbGl0eSAqLworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBkdW1teV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIEluaXRpYWxpemUgdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5nZXRfc3RhdHMgPSBkdW1teV9nZXRfc3RhdHM7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBkdW1teV94bWl0OworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+c2V0X21hY19hZGRyZXNzID0gZHVtbXlfc2V0X2FkZHJlc3M7CisKKwkvKiBGaWxsIGluIGRldmljZSBzdHJ1Y3R1cmUgd2l0aCBldGhlcm5ldC1nZW5lcmljIHZhbHVlcy4gKi8KKwlldGhlcl9zZXR1cChkZXYpOworCWRldi0+dHhfcXVldWVfbGVuID0gMDsKKwlkZXYtPmNoYW5nZV9tdHUgPSBOVUxMOworCWRldi0+ZmxhZ3MgfD0gSUZGX05PQVJQOworCWRldi0+ZmxhZ3MgJj0gfklGRl9NVUxUSUNBU1Q7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCXJhbmRvbV9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpOworfQorCitzdGF0aWMgaW50IGR1bW15X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RhdHMtPnR4X3BhY2tldHMrKzsKKwlzdGF0cy0+dHhfYnl0ZXMrPXNrYi0+bGVuOworCisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmR1bW15X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBuZXRkZXZfcHJpdihkZXYpOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKipkdW1taWVzOworCisvKiBOdW1iZXIgb2YgZHVtbXkgZGV2aWNlcyB0byBiZSBzZXQgdXAgYnkgdGhpcyBtb2R1bGUuICovCittb2R1bGVfcGFyYW0obnVtZHVtbWllcywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobnVtZHVtbWllcywgIk51bWJlciBvZiBkdW1teSBwc2V1ZG8gZGV2aWNlcyIpOworCitzdGF0aWMgaW50IF9faW5pdCBkdW1teV9pbml0X29uZShpbnQgaW5kZXgpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldl9kdW1teTsKKwlpbnQgZXJyOworCisJZGV2X2R1bW15ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyksCisJCQkJICJkdW1teSVkIiwgZHVtbXlfc2V0dXApOworCisJaWYgKCFkZXZfZHVtbXkpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKChlcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2X2R1bW15KSkpIHsKKwkJZnJlZV9uZXRkZXYoZGV2X2R1bW15KTsKKwkJZGV2X2R1bW15ID0gTlVMTDsKKwl9IGVsc2UgeworCQlkdW1taWVzW2luZGV4XSA9IGRldl9kdW1teTsgCisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgZHVtbXlfZnJlZV9vbmUoaW50IGluZGV4KQoreworCXVucmVnaXN0ZXJfbmV0ZGV2KGR1bW1pZXNbaW5kZXhdKTsKKwlmcmVlX25ldGRldihkdW1taWVzW2luZGV4XSk7Cit9IAorCitzdGF0aWMgaW50IF9faW5pdCBkdW1teV9pbml0X21vZHVsZSh2b2lkKQoreyAKKwlpbnQgaSwgZXJyID0gMDsKKwlkdW1taWVzID0ga21hbGxvYyhudW1kdW1taWVzICogc2l6ZW9mKHZvaWQgKiksIEdGUF9LRVJORUwpOyAKKwlpZiAoIWR1bW1pZXMpCisJCXJldHVybiAtRU5PTUVNOyAKKwlmb3IgKGkgPSAwOyBpIDwgbnVtZHVtbWllcyAmJiAhZXJyOyBpKyspCisJCWVyciA9IGR1bW15X2luaXRfb25lKGkpOyAKKwlpZiAoZXJyKSB7IAorCQl3aGlsZSAoLS1pID49IDApCisJCQlkdW1teV9mcmVlX29uZShpKTsKKwl9CisJcmV0dXJuIGVycjsKK30gCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkdW1teV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBudW1kdW1taWVzOyBpKyspIAorCQlkdW1teV9mcmVlX29uZShpKTsgCisJa2ZyZWUoZHVtbWllcyk7CQorfQorCittb2R1bGVfaW5pdChkdW1teV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkdW1teV9jbGVhbnVwX21vZHVsZSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwLmMgYi9kcml2ZXJzL25ldC9lMTAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI2OGRkNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAuYwpAQCAtMCwwICsxLDIzNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IAorICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSAKKyAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSAKKyAgYW55IGxhdGVyIHZlcnNpb24uCisgIAorICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciAKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciAKKyAgbW9yZSBkZXRhaWxzLgorICAKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgCisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICAKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgIAorICBDb250YWN0IEluZm9ybWF0aW9uOgorICBMaW51eCBOSUNTIDxsaW51eC5uaWNzQGludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJZTEwMC5jOiBJbnRlbChSKSBQUk8vMTAwIGV0aGVybmV0IGRyaXZlcgorICoKKyAqCShSZSl3cml0dGVuIDIwMDMgYnkgc2NvdHQuZmVsZG1hbkBpbnRlbC5jb20uICBCYXNlZCBsb29zZWx5IG9uCisgKglvcmlnaW5hbCBlMTAwIGRyaXZlciwgYnV0IGJldHRlciBkZXNjcmliZWQgYXMgYSBtdW5naW5nIG9mCisgKgllMTAwLCBlMTAwMCwgZWVwcm8xMDAsIHRnMywgODEzOWNwLCBhbmQgb3RoZXIgZHJpdmVycy4KKyAqCisgKglSZWZlcmVuY2VzOgorICoJCUludGVsIDgyNTV4IDEwLzEwMCBNYnBzIEV0aGVybmV0IENvbnRyb2xsZXIgRmFtaWx5LAorICoJCU9wZW4gU291cmNlIFNvZnR3YXJlIERldmVsb3BlcnMgTWFudWFsLAorICoJCWh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZTEwMDAKKyAqCisgKgorICoJICAgICAgICAgICAgICAgICAgICAgIFRoZW9yeSBvZiBPcGVyYXRpb24KKyAqCisgKglJLiAgIEdlbmVyYWwKKyAqCisgKglUaGUgZHJpdmVyIHN1cHBvcnRzIEludGVsKFIpIDEwLzEwMCBNYnBzIFBDSSBGYXN0IEV0aGVybmV0CisgKgljb250cm9sbGVyIGZhbWlseSwgd2hpY2ggaW5jbHVkZXMgdGhlIDgyNTU3LCA4MjU1OCwgODI1NTksIDgyNTUwLAorICoJODI1NTEsIGFuZCA4MjU2MiBkZXZpY2VzLiAgODI1NTggYW5kIGdyZWF0ZXIgY29udHJvbGxlcnMKKyAqCWludGVncmF0ZSB0aGUgSW50ZWwgODI1NTUgUEhZLiAgVGhlIGNvbnRyb2xsZXJzIGFyZSB1c2VkIGluCisgKglzZXJ2ZXIgYW5kIGNsaWVudCBuZXR3b3JrIGludGVyZmFjZSBjYXJkcywgYXMgd2VsbCBhcyBpbgorICoJTEFOLU9uLU1vdGhlcmJvYXJkIChMT00pLCBDYXJkQnVzLCBNaW5pUENJLCBhbmQgSUNIeAorICoJY29uZmlndXJhdGlvbnMuICA4MjU1eCBzdXBwb3J0cyBhIDMyLWJpdCBsaW5lYXIgYWRkcmVzc2luZworICoJbW9kZSBhbmQgb3BlcmF0ZXMgYXQgMzNNaHogUENJIGNsb2NrIHJhdGUuCisgKgorICoJSUkuICBEcml2ZXIgT3BlcmF0aW9uCisgKgorICoJTWVtb3J5LW1hcHBlZCBtb2RlIGlzIHVzZWQgZXhjbHVzaXZlbHkgdG8gYWNjZXNzIHRoZSBkZXZpY2UncworICoJc2hhcmVkLW1lbW9yeSBzdHJ1Y3R1cmUsIHRoZSBDb250cm9sL1N0YXR1cyBSZWdpc3RlcnMgKENTUikuIEFsbAorICoJc2V0dXAsIGNvbmZpZ3VyYXRpb24sIGFuZCBjb250cm9sIG9mIHRoZSBkZXZpY2UsIGluY2x1ZGluZyBxdWV1aW5nCisgKglvZiBUeCwgUngsIGFuZCBjb25maWd1cmF0aW9uIGNvbW1hbmRzIGlzIHRocm91Z2ggdGhlIENTUi4KKyAqCWNtZF9sb2NrIHNlcmlhbGl6ZXMgYWNjZXNzZXMgdG8gdGhlIENTUiBjb21tYW5kIHJlZ2lzdGVyLiAgY2JfbG9jaworICoJcHJvdGVjdHMgdGhlIHNoYXJlZCBDb21tYW5kIEJsb2NrIExpc3QgKENCTCkuCisgKgorICoJODI1NXggaXMgaGlnaGx5IE1JSS1jb21wbGlhbnQgYW5kIGFsbCBhY2Nlc3MgdG8gdGhlIFBIWSBnbworICoJdGhyb3VnaCB0aGUgTWFuYWdlbWVudCBEYXRhIEludGVyZmFjZSAoTURJKS4gIENvbnNlcXVlbnRseSwgdGhlCisgKglkcml2ZXIgbGV2ZXJhZ2VzIHRoZSBtaWkuYyBsaWJyYXJ5IHNoYXJlZCB3aXRoIG90aGVyIE1JSS1jb21wbGlhbnQKKyAqCWRldmljZXMuCisgKgorICoJQmlnLSBhbmQgTGl0dGxlLUVuZGlhbiBieXRlIG9yZGVyIGFzIHdlbGwgYXMgMzItIGFuZCA2NC1iaXQKKyAqCWFyY2hzIGFyZSBzdXBwb3J0ZWQuICBXZWFrLW9yZGVyZWQgbWVtb3J5IGFuZCBub24tY2FjaGUtY29oZXJlbnQKKyAqCWFyY2hzIGFyZSBzdXBwb3J0ZWQuCisgKgorICoJSUlJLiBUcmFuc21pdAorICoKKyAqCUEgVHggc2tiIGlzIG1hcHBlZCBhbmQgaGFuZ3Mgb2ZmIG9mIGEgVENCLiAgVENCcyBhcmUgbGlua2VkCisgKgl0b2dldGhlciBpbiBhIGZpeGVkLXNpemUgcmluZyAoQ0JMKSB0aHVzIGZvcm1pbmcgdGhlIGZsZXhpYmxlIG1vZGUKKyAqCW1lbW9yeSBzdHJ1Y3R1cmUuICBBIFRDQiBtYXJrZWQgd2l0aCB0aGUgc3VzcGVuZC1iaXQgaW5kaWNhdGVzCisgKgl0aGUgZW5kIG9mIHRoZSByaW5nLiAgVGhlIGxhc3QgVENCIHByb2Nlc3NlZCBzdXNwZW5kcyB0aGUKKyAqCWNvbnRyb2xsZXIsIGFuZCB0aGUgY29udHJvbGxlciBjYW4gYmUgcmVzdGFydGVkIGJ5IGlzc3VlIGEgQ1UKKyAqCXJlc3VtZSBjb21tYW5kIHRvIGNvbnRpbnVlIGZyb20gdGhlIHN1c3BlbmQgcG9pbnQsIG9yIGEgQ1Ugc3RhcnQKKyAqCWNvbW1hbmQgdG8gc3RhcnQgYXQgYSBnaXZlbiBwb3NpdGlvbiBpbiB0aGUgcmluZy4KKyAqCisgKglOb24tVHggY29tbWFuZHMgKGNvbmZpZywgbXVsdGljYXN0IHNldHVwLCBldGMpIGFyZSBsaW5rZWQKKyAqCWludG8gdGhlIENCTCByaW5nIGFsb25nIHdpdGggVHggY29tbWFuZHMuICBUaGUgY29tbW9uIHN0cnVjdHVyZQorICoJdXNlZCBmb3IgYm90aCBUeCBhbmQgbm9uLVR4IGNvbW1hbmRzIGlzIHRoZSBDb21tYW5kIEJsb2NrIChDQikuCisgKgorICoJY2JfdG9fdXNlIGlzIHRoZSBuZXh0IENCIHRvIHVzZSBmb3IgcXVldWluZyBhIGNvbW1hbmQ7IGNiX3RvX2NsZWFuCisgKglpcyB0aGUgbmV4dCBDQiB0byBjaGVjayBmb3IgY29tcGxldGlvbjsgY2JfdG9fc2VuZCBpcyB0aGUgZmlyc3QKKyAqCUNCIHRvIHN0YXJ0IG9uIGluIGNhc2Ugb2YgYSBwcmV2aW91cyBmYWlsdXJlIHRvIHJlc3VtZS4gIENCIGNsZWFuCisgKgl1cCBoYXBwZW5zIGluIGludGVycnVwdCBjb250ZXh0IGluIHJlc3BvbnNlIHRvIGEgQ1UgaW50ZXJydXB0LgorICoJY2JzX2F2YWlsIGtlZXBzIHRyYWNrIG9mIG51bWJlciBvZiBmcmVlIENCIHJlc291cmNlcyBhdmFpbGFibGUuCisgKgorICogCUhhcmR3YXJlIHBhZGRpbmcgb2Ygc2hvcnQgcGFja2V0cyB0byBtaW5pbXVtIHBhY2tldCBzaXplIGlzCisgKiAJZW5hYmxlZC4gIDgyNTU3IHBhZHMgd2l0aCA3RWgsIHdoaWxlIHRoZSBsYXRlciBjb250cm9sbGVycyBwYWQKKyAqIAl3aXRoIDAwaC4KKyAqCisgKglJVi4gIFJlY2lldmUKKyAqCisgKglUaGUgUmVjZWl2ZSBGcmFtZSBBcmVhIChSRkEpIGNvbXByaXNlcyBhIHJpbmcgb2YgUmVjZWl2ZSBGcmFtZQorICoJRGVzY3JpcHRvcnMgKFJGRCkgKyBkYXRhIGJ1ZmZlciwgdGh1cyBmb3JtaW5nIHRoZSBzaW1wbGlmaWVkIG1vZGUKKyAqCW1lbW9yeSBzdHJ1Y3R1cmUuICBSeCBza2JzIGFyZSBhbGxvY2F0ZWQgdG8gY29udGFpbiBib3RoIHRoZSBSRkQKKyAqCWFuZCB0aGUgZGF0YSBidWZmZXIsIGJ1dCB0aGUgUkZEIGlzIHB1bGxlZCBvZmYgYmVmb3JlIHRoZSBza2IgaXMKKyAqCWluZGljYXRlZC4gIFRoZSBkYXRhIGJ1ZmZlciBpcyBhbGlnbmVkIHN1Y2ggdGhhdCBlbmNhcHN1bGF0ZWQKKyAqCXByb3RvY29sIGhlYWRlcnMgYXJlIHUzMi1hbGlnbmVkLiAgU2luY2UgdGhlIFJGRCBpcyBwYXJ0IG9mIHRoZQorICoJbWFwcGVkIHNoYXJlZCBtZW1vcnksIGFuZCBjb21wbGV0aW9uIHN0YXR1cyBpcyBjb250YWluZWQgd2l0aGluCisgKgl0aGUgUkZELCB0aGUgUkZEIG11c3QgYmUgZG1hX3N5bmMnZWQgdG8gbWFpbnRhaW4gYSBjb25zaXN0ZW50CisgKgl2aWV3IGZyb20gc29mdHdhcmUgYW5kIGhhcmR3YXJlLgorICoKKyAqCVVuZGVyIHR5cGljYWwgb3BlcmF0aW9uLCB0aGUgIHJlY2VpdmUgdW5pdCAoUlUpIGlzIHN0YXJ0IG9uY2UsCisgKglhbmQgdGhlIGNvbnRyb2xsZXIgaGFwcGlseSBmaWxscyBSRkRzIGFzIGZyYW1lcyBhcnJpdmUuICBJZgorICoJcmVwbGFjZW1lbnQgUkZEcyBjYW5ub3QgYmUgYWxsb2NhdGVkLCBvciB0aGUgUlUgZ29lcyBub24tYWN0aXZlLAorICoJdGhlIFJVIG11c3QgYmUgcmVzdGFydGVkLiAgRnJhbWUgYXJyaXZhbCBnZW5lcmF0ZXMgYW4gaW50ZXJydXB0LAorICoJYW5kIFJ4IGluZGljYXRpb24gYW5kIHJlLWFsbG9jYXRpb24gaGFwcGVuIGluIHRoZSBzYW1lIGNvbnRleHQsCisgKgl0aGVyZWZvcmUgbm8gbG9ja2luZyBpcyByZXF1aXJlZC4gIEEgc29mdHdhcmUtZ2VuZXJhdGVkIGludGVycnVwdAorICoJaXMgZ2VuZXJhdGVkIGZyb20gdGhlIHdhdGNoZG9nIHRvIHJlY292ZXIgZnJvbSBhIGZhaWxlZCBhbGxvY2F0aW9uCisgKglzZW5hcmlvIHdoZXJlIGFsbCBSeCByZXNvdXJjZXMgaGF2ZSBiZWVuIGluZGljYXRlZCBhbmQgbm9uZSByZS0KKyAqCXBsYWNlZC4KKyAqCisgKglWLiAgIE1pc2NlbGxhbmVvdXMKKyAqCisgKiAJVkxBTiBvZmZsb2FkaW5nIG9mIHRhZ2dpbmcsIHN0cmlwcGluZyBhbmQgZmlsdGVyaW5nIGlzIG5vdAorICogCXN1cHBvcnRlZCwgYnV0IGRyaXZlciB3aWxsIGFjY29tbW9kYXRlIHRoZSBleHRyYSA0LWJ5dGUgVkxBTiB0YWcKKyAqIAlmb3IgcHJvY2Vzc2luZyBieSB1cHBlciBsYXllcnMuICBUeC9SeCBDaGVja3N1bSBvZmZsb2FkaW5nIGlzIG5vdAorICogCXN1cHBvcnRlZC4gIFR4IFNjYXR0ZXIvR2F0aGVyIGlzIG5vdCBzdXBwb3J0ZWQuICBKdW1ibyBGcmFtZXMgaXMKKyAqIAlub3Qgc3VwcG9ydGVkIChoYXJkd2FyZSBsaW1pdGF0aW9uKS4KKyAqCisgKiAJTWFnaWNQYWNrZXQodG0pIFdvTCBzdXBwb3J0IGlzIGVuYWJsZWQvZGlzYWJsZWQgdmlhIGV0aHRvb2wuCisgKgorICogCVRoYW5rcyB0byBKQyAoamNoYXBtYW5Aa2F0YWxpeC5jb20pIGZvciBoZWxwaW5nIHdpdGgKKyAqIAl0ZXN0aW5nL3Ryb3VibGVzaG9vdGluZyB0aGUgZGV2ZWxvcG1lbnQgZHJpdmVyLgorICoKKyAqIAlUT0RPOgorICogCW8gc2V2ZXJhbCBlbnRyeSBwb2ludHMgcmFjZSB3aXRoIGRldi0+Y2xvc2UKKyAqIAlvIGNoZWNrIGZvciB0eC1uby1yZXNvdXJjZXMvc3RvcCBRIHJhY2VzIHdpdGggdHggY2xlYW4vd2FrZSBRCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworCisjZGVmaW5lIERSVl9OQU1FCQkiZTEwMCIKKyNkZWZpbmUgRFJWX0VYVAkJIi1OQVBJIgorI2RlZmluZSBEUlZfVkVSU0lPTgkJIjMuMy42LWsyIkRSVl9FWFQKKyNkZWZpbmUgRFJWX0RFU0NSSVBUSU9OCQkiSW50ZWwoUikgUFJPLzEwMCBOZXR3b3JrIERyaXZlciIKKyNkZWZpbmUgRFJWX0NPUFlSSUdIVAkJIkNvcHlyaWdodChjKSAxOTk5LTIwMDQgSW50ZWwgQ29ycG9yYXRpb24iCisjZGVmaW5lIFBGWAkJCURSVl9OQU1FICI6ICIKKworI2RlZmluZSBFMTAwX1dBVENIRE9HX1BFUklPRAkoMiAqIEhaKQorI2RlZmluZSBFMTAwX05BUElfV0VJR0hUCTE2CisKK01PRFVMRV9ERVNDUklQVElPTihEUlZfREVTQ1JJUFRJT04pOworTU9EVUxFX0FVVEhPUihEUlZfQ09QWVJJR0hUKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKworc3RhdGljIGludCBkZWJ1ZyA9IDM7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgKDA9bm9uZSwuLi4sMTY9YWxsKSIpOworI2RlZmluZSBEUFJJTlRLKG5sZXZlbCwga2xldmVsLCBmbXQsIGFyZ3MuLi4pIFwKKwkodm9pZCkoKE5FVElGX01TR18jI25sZXZlbCAmIG5pYy0+bXNnX2VuYWJsZSkgJiYgXAorCXByaW50ayhLRVJOXyMja2xldmVsIFBGWCAiJXM6ICVzOiAiIGZtdCwgbmljLT5uZXRkZXYtPm5hbWUsIFwKKwkJX19GVU5DVElPTl9fICwgIyMgYXJncykpCisKKyNkZWZpbmUgSU5URUxfODI1NVhfRVRIRVJORVRfREVWSUNFKGRldmljZV9pZCwgaWNoKSB7XAorCVBDSV9WRU5ET1JfSURfSU5URUwsIGRldmljZV9pZCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgXAorCVBDSV9DTEFTU19ORVRXT1JLX0VUSEVSTkVUIDw8IDgsIDB4RkZGRjAwLCBpY2ggfQorc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGUxMDBfaWRfdGFibGVbXSA9IHsKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDI5LCAwKSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDMwLCAwKSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDMxLCAzKSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDMyLCAzKSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDMzLCAzKSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDM0LCAzKSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDM4LCAzKSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDM5LCA0KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDNBLCA0KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDNCLCA0KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDNDLCA0KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDNELCA0KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDNFLCA0KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDUwLCA1KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDUxLCA1KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDUyLCA1KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDUzLCA1KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDU0LCA1KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDU1LCA1KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDU2LCA1KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDU3LCA1KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDU5LCAwKSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDY0LCA2KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDY1LCA2KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDY2LCA2KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDY3LCA2KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDY4LCA2KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDY5LCA2KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDZBLCA2KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDZCLCA2KSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMjA5LCAwKSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgxMjI5LCAwKSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgyNDQ5LCAyKSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgyNDU5LCAyKSwKKwlJTlRFTF84MjU1WF9FVEhFUk5FVF9ERVZJQ0UoMHgyNDVELCAyKSwKKwl7IDAsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZTEwMF9pZF90YWJsZSk7CisKK2VudW0gbWFjIHsKKwltYWNfODI1NTdfRDEwMF9BICA9IDAsCisJbWFjXzgyNTU3X0QxMDBfQiAgPSAxLAorCW1hY184MjU1N19EMTAwX0MgID0gMiwKKwltYWNfODI1NThfRDEwMV9BNCA9IDQsCisJbWFjXzgyNTU4X0QxMDFfQjAgPSA1LAorCW1hY184MjU1OV9EMTAxTSAgID0gOCwKKwltYWNfODI1NTlfRDEwMVMgICA9IDksCisJbWFjXzgyNTUwX0QxMDIgICAgPSAxMiwKKwltYWNfODI1NTBfRDEwMl9DICA9IDEzLAorCW1hY184MjU1MV9FICAgICAgID0gMTQsCisJbWFjXzgyNTUxX0YgICAgICAgPSAxNSwKKwltYWNfODI1NTFfMTAgICAgICA9IDE2LAorCW1hY191bmtub3duICAgICAgID0gMHhGRiwKK307CisKK2VudW0gcGh5IHsKKwlwaHlfMTAwYSAgICAgPSAweDAwMDAwM0UwLAorCXBoeV8xMDBjICAgICA9IDB4MDM1MDAyQTgsCisJcGh5XzgyNTU1X3R4ID0gMHgwMTUwMDJBOCwKKwlwaHlfbnNjX3R4ICAgPSAweDVDMDAyMDAwLAorCXBoeV84MjU2Ml9ldCA9IDB4MDMzMDAyQTgsCisJcGh5XzgyNTYyX2VtID0gMHgwMzIwMDJBOCwKKwlwaHlfODI1NjJfZWsgPSAweDAzMTAwMkE4LAorCXBoeV84MjU2Ml9laCA9IDB4MDE3MDAyQTgsCisJcGh5X3Vua25vd24gID0gMHhGRkZGRkZGRiwKK307CisKKy8qIENTUiAoQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXJzKSAqLworc3RydWN0IGNzciB7CisJc3RydWN0IHsKKwkJdTggc3RhdHVzOworCQl1OCBzdGF0X2FjazsKKwkJdTggY21kX2xvOworCQl1OCBjbWRfaGk7CisJCXUzMiBnZW5fcHRyOworCX0gc2NiOworCXUzMiBwb3J0OworCXUxNiBmbGFzaF9jdHJsOworCXU4IGVlcHJvbV9jdHJsX2xvOworCXU4IGVlcHJvbV9jdHJsX2hpOworCXUzMiBtZGlfY3RybDsKKwl1MzIgcnhfZG1hX2NvdW50OworfTsKKworZW51bSBzY2Jfc3RhdHVzIHsKKwlydXNfcmVhZHkgICAgICAgID0gMHgxMCwKKwlydXNfbWFzayAgICAgICAgID0gMHgzQywKK307CisKK2VudW0gc2NiX3N0YXRfYWNrIHsKKwlzdGF0X2Fja19ub3Rfb3VycyAgICA9IDB4MDAsCisJc3RhdF9hY2tfc3dfZ2VuICAgICAgPSAweDA0LAorCXN0YXRfYWNrX3JuciAgICAgICAgID0gMHgxMCwKKwlzdGF0X2Fja19jdV9pZGxlICAgICA9IDB4MjAsCisJc3RhdF9hY2tfZnJhbWVfcnggICAgPSAweDQwLAorCXN0YXRfYWNrX2N1X2NtZF9kb25lID0gMHg4MCwKKwlzdGF0X2Fja19ub3RfcHJlc2VudCA9IDB4RkYsCisJc3RhdF9hY2tfcnggPSAoc3RhdF9hY2tfc3dfZ2VuIHwgc3RhdF9hY2tfcm5yIHwgc3RhdF9hY2tfZnJhbWVfcngpLAorCXN0YXRfYWNrX3R4ID0gKHN0YXRfYWNrX2N1X2lkbGUgfCBzdGF0X2Fja19jdV9jbWRfZG9uZSksCit9OworCitlbnVtIHNjYl9jbWRfaGkgeworCWlycV9tYXNrX25vbmUgPSAweDAwLAorCWlycV9tYXNrX2FsbCAgPSAweDAxLAorCWlycV9zd19nZW4gICAgPSAweDAyLAorfTsKKworZW51bSBzY2JfY21kX2xvIHsKKwljdWNfbm9wICAgICAgICA9IDB4MDAsCisJcnVjX3N0YXJ0ICAgICAgPSAweDAxLAorCXJ1Y19sb2FkX2Jhc2UgID0gMHgwNiwKKwljdWNfc3RhcnQgICAgICA9IDB4MTAsCisJY3VjX3Jlc3VtZSAgICAgPSAweDIwLAorCWN1Y19kdW1wX2FkZHIgID0gMHg0MCwKKwljdWNfZHVtcF9zdGF0cyA9IDB4NTAsCisJY3VjX2xvYWRfYmFzZSAgPSAweDYwLAorCWN1Y19kdW1wX3Jlc2V0ID0gMHg3MCwKK307CisKK2VudW0gY3VjX2R1bXAgeworCWN1Y19kdW1wX2NvbXBsZXRlICAgICAgID0gMHgwMDAwQTAwNSwKKwljdWNfZHVtcF9yZXNldF9jb21wbGV0ZSA9IDB4MDAwMEEwMDcsCit9OworCQkKK2VudW0gcG9ydCB7CisJc29mdHdhcmVfcmVzZXQgID0gMHgwMDAwLAorCXNlbGZ0ZXN0ICAgICAgICA9IDB4MDAwMSwKKwlzZWxlY3RpdmVfcmVzZXQgPSAweDAwMDIsCit9OworCitlbnVtIGVlcHJvbV9jdHJsX2xvIHsKKwllZXNrID0gMHgwMSwKKwllZWNzID0gMHgwMiwKKwllZWRpID0gMHgwNCwKKwllZWRvID0gMHgwOCwKK307CisKK2VudW0gbWRpX2N0cmwgeworCW1kaV93cml0ZSA9IDB4MDQwMDAwMDAsCisJbWRpX3JlYWQgID0gMHgwODAwMDAwMCwKKwltZGlfcmVhZHkgPSAweDEwMDAwMDAwLAorfTsKKworZW51bSBlZXByb21fb3AgeworCW9wX3dyaXRlID0gMHgwNSwKKwlvcF9yZWFkICA9IDB4MDYsCisJb3BfZXdkcyAgPSAweDEwLAorCW9wX2V3ZW4gID0gMHgxMywKK307CisKK2VudW0gZWVwcm9tX29mZnNldHMgeworCWVlcHJvbV9jbmZnX21kaXggID0gMHgwMywKKwllZXByb21faWQgICAgICAgICA9IDB4MEEsCisJZWVwcm9tX2NvbmZpZ19hc2YgPSAweDBELAorCWVlcHJvbV9zbWJ1c19hZGRyID0gMHg5MCwKK307CisKK2VudW0gZWVwcm9tX2NuZmdfbWRpeCB7CisJZWVwcm9tX21kaXhfZW5hYmxlZCA9IDB4MDA4MCwKK307CisKK2VudW0gZWVwcm9tX2lkIHsKKwllZXByb21faWRfd29sID0gMHgwMDIwLAorfTsKKworZW51bSBlZXByb21fY29uZmlnX2FzZiB7CisJZWVwcm9tX2FzZiA9IDB4ODAwMCwKKwllZXByb21fZ2NsID0gMHg0MDAwLAorfTsKKworZW51bSBjYl9zdGF0dXMgeworCWNiX2NvbXBsZXRlID0gMHg4MDAwLAorCWNiX29rICAgICAgID0gMHgyMDAwLAorfTsKKworZW51bSBjYl9jb21tYW5kIHsKKwljYl9ub3AgICAgPSAweDAwMDAsCisJY2JfaWFhZGRyID0gMHgwMDAxLAorCWNiX2NvbmZpZyA9IDB4MDAwMiwKKwljYl9tdWx0aSAgPSAweDAwMDMsCisJY2JfdHggICAgID0gMHgwMDA0LAorCWNiX3Vjb2RlICA9IDB4MDAwNSwKKwljYl9kdW1wICAgPSAweDAwMDYsCisJY2JfdHhfc2YgID0gMHgwMDA4LAorCWNiX2NpZCAgICA9IDB4MWYwMCwKKwljYl9pICAgICAgPSAweDIwMDAsCisJY2JfcyAgICAgID0gMHg0MDAwLAorCWNiX2VsICAgICA9IDB4ODAwMCwKK307CisKK3N0cnVjdCByZmQgeworCXUxNiBzdGF0dXM7CisJdTE2IGNvbW1hbmQ7CisJdTMyIGxpbms7CisJdTMyIHJiZDsKKwl1MTYgYWN0dWFsX3NpemU7CisJdTE2IHNpemU7Cit9OworCitzdHJ1Y3QgcnggeworCXN0cnVjdCByeCAqbmV4dCwgKnByZXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworfTsKKworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorI2RlZmluZSBYKGEsYikJYixhCisjZWxzZQorI2RlZmluZSBYKGEsYikJYSxiCisjZW5kaWYKK3N0cnVjdCBjb25maWcgeworLyowKi8JdTggWChieXRlX2NvdW50OjYsIHBhZDA6Mik7CisvKjEqLwl1OCBYKFgocnhfZmlmb19saW1pdDo0LCB0eF9maWZvX2xpbWl0OjMpLCBwYWQxOjEpOworLyoyKi8JdTggYWRhcHRpdmVfaWZzOworLyozKi8JdTggWChYKFgoWChtd2lfZW5hYmxlOjEsIHR5cGVfZW5hYmxlOjEpLCByZWFkX2FsaWduX2VuYWJsZToxKSwKKwkgICB0ZXJtX3dyaXRlX2NhY2hlX2xpbmU6MSksIHBhZDM6NCk7CisvKjQqLwl1OCBYKHJ4X2RtYV9tYXhfY291bnQ6NywgcGFkNDoxKTsKKy8qNSovCXU4IFgodHhfZG1hX21heF9jb3VudDo3LCBkbWFfbWF4X2NvdW50X2VuYWJsZToxKTsKKy8qNiovCXU4IFgoWChYKFgoWChYKFgobGF0ZV9zY2JfdXBkYXRlOjEsIGRpcmVjdF9yeF9kbWE6MSksCisJICAgdG5vX2ludHI6MSksIGNuYV9pbnRyOjEpLCBzdGFuZGFyZF90Y2I6MSksIHN0YW5kYXJkX3N0YXRfY291bnRlcjoxKSwKKwkgICByeF9kaXNjYXJkX292ZXJydW5zOjEpLCByeF9zYXZlX2JhZF9mcmFtZXM6MSk7CisvKjcqLwl1OCBYKFgoWChYKFgocnhfZGlzY2FyZF9zaG9ydF9mcmFtZXM6MSwgdHhfdW5kZXJydW5fcmV0cnk6MiksCisJICAgcGFkNzoyKSwgcnhfZXh0ZW5kZWRfcmZkOjEpLCB0eF90d29fZnJhbWVzX2luX2ZpZm86MSksCisJICAgdHhfZHluYW1pY190YmQ6MSk7CisvKjgqLwl1OCBYKFgobWlpX21vZGU6MSwgcGFkODo2KSwgY3NtYV9kaXNhYmxlZDoxKTsKKy8qOSovCXU4IFgoWChYKFgoWChyeF90Y3B1ZHBfY2hlY2tzdW06MSwgcGFkOTozKSwgdmxhbl9hcnBfdGNvOjEpLAorCSAgIGxpbmtfc3RhdHVzX3dha2U6MSksIGFycF93YWtlOjEpLCBtY21hdGNoX3dha2U6MSk7CisvKjEwKi8JdTggWChYKFgocGFkMTA6Mywgbm9fc291cmNlX2FkZHJfaW5zZXJ0aW9uOjEpLCBwcmVhbWJsZV9sZW5ndGg6MiksCisJICAgbG9vcGJhY2s6Mik7CisvKjExKi8JdTggWChsaW5lYXJfcHJpb3JpdHk6MywgcGFkMTE6NSk7CisvKjEyKi8JdTggWChYKGxpbmVhcl9wcmlvcml0eV9tb2RlOjEsIHBhZDEyOjMpLCBpZnM6NCk7CisvKjEzKi8JdTggaXBfYWRkcl9sbzsKKy8qMTQqLwl1OCBpcF9hZGRyX2hpOworLyoxNSovCXU4IFgoWChYKFgoWChYKFgocHJvbWlzY3VvdXNfbW9kZToxLCBicm9hZGNhc3RfZGlzYWJsZWQ6MSksCisJICAgd2FpdF9hZnRlcl93aW46MSksIHBhZDE1XzE6MSksIGlnbm9yZV91bF9iaXQ6MSksIGNyY18xNl9iaXQ6MSksCisJICAgcGFkMTVfMjoxKSwgY3JzX29yX2NkdDoxKTsKKy8qMTYqLwl1OCBmY19kZWxheV9sbzsKKy8qMTcqLwl1OCBmY19kZWxheV9oaTsKKy8qMTgqLwl1OCBYKFgoWChYKFgocnhfc3RyaXBwaW5nOjEsIHR4X3BhZGRpbmc6MSksIHJ4X2NyY190cmFuc2ZlcjoxKSwKKwkgICByeF9sb25nX29rOjEpLCBmY19wcmlvcml0eV90aHJlc2hvbGQ6MyksIHBhZDE4OjEpOworLyoxOSovCXU4IFgoWChYKFgoWChYKFgoYWRkcl93YWtlOjEsIG1hZ2ljX3BhY2tldF9kaXNhYmxlOjEpLAorCSAgIGZjX2Rpc2FibGU6MSksIGZjX3Jlc3RvcDoxKSwgZmNfcmVzdGFydDoxKSwgZmNfcmVqZWN0OjEpLAorCSAgIGZ1bGxfZHVwbGV4X2ZvcmNlOjEpLCBmdWxsX2R1cGxleF9waW46MSk7CisvKjIwKi8JdTggWChYKFgocGFkMjBfMTo1LCBmY19wcmlvcml0eV9sb2NhdGlvbjoxKSwgbXVsdGlfaWE6MSksIHBhZDIwXzI6MSk7CisvKjIxKi8JdTggWChYKHBhZDIxXzE6MywgbXVsdGljYXN0X2FsbDoxKSwgcGFkMjFfMjo0KTsKKy8qMjIqLwl1OCBYKFgocnhfZDEwMl9tb2RlOjEsIHJ4X3ZsYW5fZHJvcDoxKSwgcGFkMjI6Nik7CisJdTggcGFkX2QxMDJbOV07Cit9OworCisjZGVmaW5lIEUxMDBfTUFYX01VTFRJQ0FTVF9BRERSUwk2NAorc3RydWN0IG11bHRpIHsKKwl1MTYgY291bnQ7CisJdTggYWRkcltFMTAwX01BWF9NVUxUSUNBU1RfQUREUlMgKiBFVEhfQUxFTiArIDIvKnBhZCovXTsKK307CisKKy8qIEltcG9ydGFudDoga2VlcCB0b3RhbCBzdHJ1Y3QgdTMyLWFsaWduZWQgKi8KKyNkZWZpbmUgVUNPREVfU0laRQkJCTEzNAorc3RydWN0IGNiIHsKKwl1MTYgc3RhdHVzOworCXUxNiBjb21tYW5kOworCXUzMiBsaW5rOworCXVuaW9uIHsKKwkJdTggaWFhZGRyW0VUSF9BTEVOXTsKKwkJdTMyIHVjb2RlW1VDT0RFX1NJWkVdOworCQlzdHJ1Y3QgY29uZmlnIGNvbmZpZzsKKwkJc3RydWN0IG11bHRpIG11bHRpOworCQlzdHJ1Y3QgeworCQkJdTMyIHRiZF9hcnJheTsKKwkJCXUxNiB0Y2JfYnl0ZV9jb3VudDsKKwkJCXU4IHRocmVzaG9sZDsKKwkJCXU4IHRiZF9jb3VudDsKKwkJCXN0cnVjdCB7CisJCQkJdTMyIGJ1Zl9hZGRyOworCQkJCXUxNiBzaXplOworCQkJCXUxNiBlb2w7CisJCQl9IHRiZDsKKwkJfSB0Y2I7CisJCXUzMiBkdW1wX2J1ZmZlcl9hZGRyOworCX0gdTsKKwlzdHJ1Y3QgY2IgKm5leHQsICpwcmV2OworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKK307CisKK2VudW0gbG9vcGJhY2sgeworCWxiX25vbmUgPSAwLCBsYl9tYWMgPSAxLCBsYl9waHkgPSAzLAorfTsKKworc3RydWN0IHN0YXRzIHsKKwl1MzIgdHhfZ29vZF9mcmFtZXMsIHR4X21heF9jb2xsaXNpb25zLCB0eF9sYXRlX2NvbGxpc2lvbnMsCisJCXR4X3VuZGVycnVucywgdHhfbG9zdF9jcnMsIHR4X2RlZmVycmVkLCB0eF9zaW5nbGVfY29sbGlzaW9ucywKKwkJdHhfbXVsdGlwbGVfY29sbGlzaW9ucywgdHhfdG90YWxfY29sbGlzaW9uczsKKwl1MzIgcnhfZ29vZF9mcmFtZXMsIHJ4X2NyY19lcnJvcnMsIHJ4X2FsaWdubWVudF9lcnJvcnMsCisJCXJ4X3Jlc291cmNlX2Vycm9ycywgcnhfb3ZlcnJ1bl9lcnJvcnMsIHJ4X2NkdF9lcnJvcnMsCisJCXJ4X3Nob3J0X2ZyYW1lX2Vycm9yczsKKwl1MzIgZmNfeG10X3BhdXNlLCBmY19yY3ZfcGF1c2UsIGZjX3Jjdl91bnN1cHBvcnRlZDsKKwl1MTYgeG10X3Rjb19mcmFtZXMsIHJjdl90Y29fZnJhbWVzOworCXUzMiBjb21wbGV0ZTsKK307CisKK3N0cnVjdCBtZW0geworCXN0cnVjdCB7CisJCXUzMiBzaWduYXR1cmU7CisJCXUzMiByZXN1bHQ7CisJfSBzZWxmdGVzdDsKKwlzdHJ1Y3Qgc3RhdHMgc3RhdHM7CisJdTggZHVtcF9idWZbNTk2XTsKK307CisKK3N0cnVjdCBwYXJhbV9yYW5nZSB7CisJdTMyIG1pbjsKKwl1MzIgbWF4OworCXUzMiBjb3VudDsKK307CisKK3N0cnVjdCBwYXJhbXMgeworCXN0cnVjdCBwYXJhbV9yYW5nZSByZmRzOworCXN0cnVjdCBwYXJhbV9yYW5nZSBjYnM7Cit9OworCitzdHJ1Y3QgbmljIHsKKwkvKiBCZWdpbjogZnJlcXVlbnRseSB1c2VkIHZhbHVlczoga2VlcCBhZGphY2VudCBmb3IgY2FjaGUgZWZmZWN0ICovCisJdTMyIG1zZ19lbmFibGUJCQkJX19fX2NhY2hlbGluZV9hbGlnbmVkOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisKKwlzdHJ1Y3QgcnggKnJ4cwkJCQlfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisJc3RydWN0IHJ4ICpyeF90b191c2U7CisJc3RydWN0IHJ4ICpyeF90b19jbGVhbjsKKwlzdHJ1Y3QgcmZkIGJsYW5rX3JmZDsKKwlpbnQgcnVfcnVubmluZzsKKworCXNwaW5sb2NrX3QgY2JfbG9jawkJCV9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKwlzcGlubG9ja190IGNtZF9sb2NrOworCXN0cnVjdCBjc3IgX19pb21lbSAqY3NyOworCWVudW0gc2NiX2NtZF9sbyBjdWNfY21kOworCXVuc2lnbmVkIGludCBjYnNfYXZhaWw7CisJc3RydWN0IGNiICpjYnM7CisJc3RydWN0IGNiICpjYl90b191c2U7CisJc3RydWN0IGNiICpjYl90b19zZW5kOworCXN0cnVjdCBjYiAqY2JfdG9fY2xlYW47CisJdTE2IHR4X2NvbW1hbmQ7CisJLyogRW5kOiBmcmVxdWVudGx5IHVzZWQgdmFsdWVzOiBrZWVwIGFkamFjZW50IGZvciBjYWNoZSBlZmZlY3QgKi8KKworCWVudW0geworCQlpY2ggICAgICAgICAgICAgICAgPSAoMSA8PCAwKSwKKwkJcHJvbWlzY3VvdXMgICAgICAgID0gKDEgPDwgMSksCisJCW11bHRpY2FzdF9hbGwgICAgICA9ICgxIDw8IDIpLAorCQl3b2xfbWFnaWMgICAgICAgICAgPSAoMSA8PCAzKSwKKwkJaWNoXzEwaF93b3JrYXJvdW5kID0gKDEgPDwgNCksCisJfSBmbGFncwkJCQkJX19fX2NhY2hlbGluZV9hbGlnbmVkOworCisJZW51bSBtYWMgbWFjOworCWVudW0gcGh5IHBoeTsKKwlzdHJ1Y3QgcGFyYW1zIHBhcmFtczsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBuZXRfc3RhdHM7CisJc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hkb2c7CisJc3RydWN0IHRpbWVyX2xpc3QgYmxpbmtfdGltZXI7CisJc3RydWN0IG1paV9pZl9pbmZvIG1paTsKKwllbnVtIGxvb3BiYWNrIGxvb3BiYWNrOworCisJc3RydWN0IG1lbSAqbWVtOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisKKwlkbWFfYWRkcl90IGNic19kbWFfYWRkcjsKKwl1OCBhZGFwdGl2ZV9pZnM7CisJdTggdHhfdGhyZXNob2xkOworCXUzMiB0eF9mcmFtZXM7CisJdTMyIHR4X2NvbGxpc2lvbnM7CisJdTMyIHR4X2RlZmVycmVkOworCXUzMiB0eF9zaW5nbGVfY29sbGlzaW9uczsKKwl1MzIgdHhfbXVsdGlwbGVfY29sbGlzaW9uczsKKwl1MzIgdHhfZmNfcGF1c2U7CisJdTMyIHR4X3Rjb19mcmFtZXM7CisKKwl1MzIgcnhfZmNfcGF1c2U7CisJdTMyIHJ4X2ZjX3Vuc3VwcG9ydGVkOworCXUzMiByeF90Y29fZnJhbWVzOworCXUzMiByeF9vdmVyX2xlbmd0aF9lcnJvcnM7CisKKwl1OCByZXZfaWQ7CisJdTE2IGxlZHM7CisJdTE2IGVlcHJvbV93YzsKKwl1MTYgZWVwcm9tWzI1Nl07Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgZTEwMF93cml0ZV9mbHVzaChzdHJ1Y3QgbmljICpuaWMpCit7CisJLyogRmx1c2ggcHJldmlvdXMgUENJIHdyaXRlcyB0aHJvdWdoIGludGVybWVkaWF0ZSBicmlkZ2VzCisJICogYnkgZG9pbmcgYSBiZW5pZ24gcmVhZCAqLworCSh2b2lkKXJlYWRiKCZuaWMtPmNzci0+c2NiLnN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlMTAwX2VuYWJsZV9pcnEoc3RydWN0IG5pYyAqbmljKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbmljLT5jbWRfbG9jaywgZmxhZ3MpOworCXdyaXRlYihpcnFfbWFza19ub25lLCAmbmljLT5jc3ItPnNjYi5jbWRfaGkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5pYy0+Y21kX2xvY2ssIGZsYWdzKTsKKwllMTAwX3dyaXRlX2ZsdXNoKG5pYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlMTAwX2Rpc2FibGVfaXJxKHN0cnVjdCBuaWMgKm5pYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5pYy0+Y21kX2xvY2ssIGZsYWdzKTsKKwl3cml0ZWIoaXJxX21hc2tfYWxsLCAmbmljLT5jc3ItPnNjYi5jbWRfaGkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5pYy0+Y21kX2xvY2ssIGZsYWdzKTsKKwllMTAwX3dyaXRlX2ZsdXNoKG5pYyk7Cit9CisKK3N0YXRpYyB2b2lkIGUxMDBfaHdfcmVzZXQoc3RydWN0IG5pYyAqbmljKQoreworCS8qIFB1dCBDVSBhbmQgUlUgaW50byBpZGxlIHdpdGggYSBzZWxlY3RpdmUgcmVzZXQgdG8gZ2V0CisJICogZGV2aWNlIG9mZiBvZiBQQ0kgYnVzICovCisJd3JpdGVsKHNlbGVjdGl2ZV9yZXNldCwgJm5pYy0+Y3NyLT5wb3J0KTsKKwllMTAwX3dyaXRlX2ZsdXNoKG5pYyk7IHVkZWxheSgyMCk7CisKKwkvKiBOb3cgZnVsbHkgcmVzZXQgZGV2aWNlICovCisJd3JpdGVsKHNvZnR3YXJlX3Jlc2V0LCAmbmljLT5jc3ItPnBvcnQpOworCWUxMDBfd3JpdGVfZmx1c2gobmljKTsgdWRlbGF5KDIwKTsKKworCS8qIE1hc2sgb2ZmIG91ciBpbnRlcnJ1cHQgbGluZSAtIGl0J3MgdW5tYXNrZWQgYWZ0ZXIgcmVzZXQgKi8KKwllMTAwX2Rpc2FibGVfaXJxKG5pYyk7Cit9CisKK3N0YXRpYyBpbnQgZTEwMF9zZWxmX3Rlc3Qoc3RydWN0IG5pYyAqbmljKQoreworCXUzMiBkbWFfYWRkciA9IG5pYy0+ZG1hX2FkZHIgKyBvZmZzZXRvZihzdHJ1Y3QgbWVtLCBzZWxmdGVzdCk7CisKKwkvKiBQYXNzaW5nIHRoZSBzZWxmLXRlc3QgaXMgYSBwcmV0dHkgZ29vZCBpbmRpY2F0aW9uCisJICogdGhhdCB0aGUgZGV2aWNlIGNhbiBETUEgdG8vZnJvbSBob3N0IG1lbW9yeSAqLworCisJbmljLT5tZW0tPnNlbGZ0ZXN0LnNpZ25hdHVyZSA9IDA7CisJbmljLT5tZW0tPnNlbGZ0ZXN0LnJlc3VsdCA9IDB4RkZGRkZGRkY7CisKKwl3cml0ZWwoc2VsZnRlc3QgfCBkbWFfYWRkciwgJm5pYy0+Y3NyLT5wb3J0KTsKKwllMTAwX3dyaXRlX2ZsdXNoKG5pYyk7CisJLyogV2FpdCAxMCBtc2VjIGZvciBzZWxmLXRlc3QgdG8gY29tcGxldGUgKi8KKwltc2xlZXAoMTApOworCisJLyogSW50ZXJydXB0cyBhcmUgZW5hYmxlZCBhZnRlciBzZWxmLXRlc3QgKi8KKwllMTAwX2Rpc2FibGVfaXJxKG5pYyk7CisKKwkvKiBDaGVjayByZXN1bHRzIG9mIHNlbGYtdGVzdCAqLworCWlmKG5pYy0+bWVtLT5zZWxmdGVzdC5yZXN1bHQgIT0gMCkgeworCQlEUFJJTlRLKEhXLCBFUlIsICJTZWxmLXRlc3QgZmFpbGVkOiByZXN1bHQ9MHglMDhYXG4iLAorCQkJbmljLT5tZW0tPnNlbGZ0ZXN0LnJlc3VsdCk7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKwlpZihuaWMtPm1lbS0+c2VsZnRlc3Quc2lnbmF0dXJlID09IDApIHsKKwkJRFBSSU5USyhIVywgRVJSLCAiU2VsZi10ZXN0IGZhaWxlZDogdGltZWQgb3V0XG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGUxMDBfZWVwcm9tX3dyaXRlKHN0cnVjdCBuaWMgKm5pYywgdTE2IGFkZHJfbGVuLCB1MTYgYWRkciwgdTE2IGRhdGEpCit7CisJdTMyIGNtZF9hZGRyX2RhdGFbM107CisJdTggY3RybDsKKwlpbnQgaSwgajsKKworCS8qIFRocmVlIGNtZHM6IHdyaXRlL2VyYXNlIGVuYWJsZSwgd3JpdGUgZGF0YSwgd3JpdGUvZXJhc2UgZGlzYWJsZSAqLworCWNtZF9hZGRyX2RhdGFbMF0gPSBvcF9ld2VuIDw8IChhZGRyX2xlbiAtIDIpOworCWNtZF9hZGRyX2RhdGFbMV0gPSAoKChvcF93cml0ZSA8PCBhZGRyX2xlbikgfCBhZGRyKSA8PCAxNikgfAorCQljcHVfdG9fbGUxNihkYXRhKTsKKwljbWRfYWRkcl9kYXRhWzJdID0gb3BfZXdkcyA8PCAoYWRkcl9sZW4gLSAyKTsKKworCS8qIEJpdC1iYW5nIGNtZHMgdG8gd3JpdGUgd29yZCB0byBlZXByb20gKi8KKwlmb3IoaiA9IDA7IGogPCAzOyBqKyspIHsKKworCQkvKiBDaGlwIHNlbGVjdCAqLworCQl3cml0ZWIoZWVjcyB8IGVlc2ssICZuaWMtPmNzci0+ZWVwcm9tX2N0cmxfbG8pOworCQllMTAwX3dyaXRlX2ZsdXNoKG5pYyk7IHVkZWxheSg0KTsKKworCQlmb3IoaSA9IDMxOyBpID49IDA7IGktLSkgeworCQkJY3RybCA9IChjbWRfYWRkcl9kYXRhW2pdICYgKDEgPDwgaSkpID8KKwkJCQllZWNzIHwgZWVkaSA6IGVlY3M7CisJCQl3cml0ZWIoY3RybCwgJm5pYy0+Y3NyLT5lZXByb21fY3RybF9sbyk7CisJCQllMTAwX3dyaXRlX2ZsdXNoKG5pYyk7IHVkZWxheSg0KTsKKworCQkJd3JpdGViKGN0cmwgfCBlZXNrLCAmbmljLT5jc3ItPmVlcHJvbV9jdHJsX2xvKTsKKwkJCWUxMDBfd3JpdGVfZmx1c2gobmljKTsgdWRlbGF5KDQpOworCQl9CisJCS8qIFdhaXQgMTAgbXNlYyBmb3IgY21kIHRvIGNvbXBsZXRlICovCisJCW1zbGVlcCgxMCk7CisKKwkJLyogQ2hpcCBkZXNlbGVjdCAqLworCQl3cml0ZWIoMCwgJm5pYy0+Y3NyLT5lZXByb21fY3RybF9sbyk7CisJCWUxMDBfd3JpdGVfZmx1c2gobmljKTsgdWRlbGF5KDQpOworCX0KK307CisKKy8qIEdlbmVyYWwgdGVjaG5pcXVlIHN0b2xlbiBmcm9tIHRoZSBlZXBybzEwMCBkcml2ZXIgLSB2ZXJ5IGNsZXZlciAqLworc3RhdGljIHUxNiBlMTAwX2VlcHJvbV9yZWFkKHN0cnVjdCBuaWMgKm5pYywgdTE2ICphZGRyX2xlbiwgdTE2IGFkZHIpCit7CisJdTMyIGNtZF9hZGRyX2RhdGE7CisJdTE2IGRhdGEgPSAwOworCXU4IGN0cmw7CisJaW50IGk7CisKKwljbWRfYWRkcl9kYXRhID0gKChvcF9yZWFkIDw8ICphZGRyX2xlbikgfCBhZGRyKSA8PCAxNjsKKworCS8qIENoaXAgc2VsZWN0ICovCisJd3JpdGViKGVlY3MgfCBlZXNrLCAmbmljLT5jc3ItPmVlcHJvbV9jdHJsX2xvKTsKKwllMTAwX3dyaXRlX2ZsdXNoKG5pYyk7IHVkZWxheSg0KTsKKworCS8qIEJpdC1iYW5nIHRvIHJlYWQgd29yZCBmcm9tIGVlcHJvbSAqLworCWZvcihpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisJCWN0cmwgPSAoY21kX2FkZHJfZGF0YSAmICgxIDw8IGkpKSA/IGVlY3MgfCBlZWRpIDogZWVjczsKKwkJd3JpdGViKGN0cmwsICZuaWMtPmNzci0+ZWVwcm9tX2N0cmxfbG8pOworCQllMTAwX3dyaXRlX2ZsdXNoKG5pYyk7IHVkZWxheSg0KTsKKwkJCisJCXdyaXRlYihjdHJsIHwgZWVzaywgJm5pYy0+Y3NyLT5lZXByb21fY3RybF9sbyk7CisJCWUxMDBfd3JpdGVfZmx1c2gobmljKTsgdWRlbGF5KDQpOworCQkKKwkJLyogRWVwcm9tIGRyaXZlcyBhIGR1bW15IHplcm8gdG8gRUVETyBhZnRlciByZWNlaXZpbmcKKwkJICogY29tcGxldGUgYWRkcmVzcy4gIFVzZSB0aGlzIHRvIGFkanVzdCBhZGRyX2xlbi4gKi8KKwkJY3RybCA9IHJlYWRiKCZuaWMtPmNzci0+ZWVwcm9tX2N0cmxfbG8pOworCQlpZighKGN0cmwgJiBlZWRvKSAmJiBpID4gMTYpIHsKKwkJCSphZGRyX2xlbiAtPSAoaSAtIDE2KTsKKwkJCWkgPSAxNzsKKwkJfQorCQkKKwkJZGF0YSA9IChkYXRhIDw8IDEpIHwgKGN0cmwgJiBlZWRvID8gMSA6IDApOworCX0KKworCS8qIENoaXAgZGVzZWxlY3QgKi8KKwl3cml0ZWIoMCwgJm5pYy0+Y3NyLT5lZXByb21fY3RybF9sbyk7CisJZTEwMF93cml0ZV9mbHVzaChuaWMpOyB1ZGVsYXkoNCk7CisKKwlyZXR1cm4gbGUxNl90b19jcHUoZGF0YSk7Cit9OworCisvKiBMb2FkIGVudGlyZSBFRVBST00gaW1hZ2UgaW50byBkcml2ZXIgY2FjaGUgYW5kIHZhbGlkYXRlIGNoZWNrc3VtICovCitzdGF0aWMgaW50IGUxMDBfZWVwcm9tX2xvYWQoc3RydWN0IG5pYyAqbmljKQoreworCXUxNiBhZGRyLCBhZGRyX2xlbiA9IDgsIGNoZWNrc3VtID0gMDsKKworCS8qIFRyeSByZWFkaW5nIHdpdGggYW4gOC1iaXQgYWRkciBsZW4gdG8gZGlzY292ZXIgYWN0dWFsIGFkZHIgbGVuICovCisJZTEwMF9lZXByb21fcmVhZChuaWMsICZhZGRyX2xlbiwgMCk7CisJbmljLT5lZXByb21fd2MgPSAxIDw8IGFkZHJfbGVuOworCisJZm9yKGFkZHIgPSAwOyBhZGRyIDwgbmljLT5lZXByb21fd2M7IGFkZHIrKykgeworCQluaWMtPmVlcHJvbVthZGRyXSA9IGUxMDBfZWVwcm9tX3JlYWQobmljLCAmYWRkcl9sZW4sIGFkZHIpOworCQlpZihhZGRyIDwgbmljLT5lZXByb21fd2MgLSAxKQorCQkJY2hlY2tzdW0gKz0gY3B1X3RvX2xlMTYobmljLT5lZXByb21bYWRkcl0pOworCX0KKworCS8qIFRoZSBjaGVja3N1bSwgc3RvcmVkIGluIHRoZSBsYXN0IHdvcmQsIGlzIGNhbGN1bGF0ZWQgc3VjaCB0aGF0CisJICogdGhlIHN1bSBvZiB3b3JkcyBzaG91bGQgYmUgMHhCQUJBICovCisJY2hlY2tzdW0gPSBsZTE2X3RvX2NwdSgweEJBQkEgLSBjaGVja3N1bSk7CisJaWYoY2hlY2tzdW0gIT0gbmljLT5lZXByb21bbmljLT5lZXByb21fd2MgLSAxXSkgeworCQlEUFJJTlRLKFBST0JFLCBFUlIsICJFRVBST00gY29ycnVwdGVkXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFNhdmUgKHBvcnRpb24gb2YpIGRyaXZlciBFRVBST00gY2FjaGUgdG8gZGV2aWNlIGFuZCB1cGRhdGUgY2hlY2tzdW0gKi8KK3N0YXRpYyBpbnQgZTEwMF9lZXByb21fc2F2ZShzdHJ1Y3QgbmljICpuaWMsIHUxNiBzdGFydCwgdTE2IGNvdW50KQoreworCXUxNiBhZGRyLCBhZGRyX2xlbiA9IDgsIGNoZWNrc3VtID0gMDsKKworCS8qIFRyeSByZWFkaW5nIHdpdGggYW4gOC1iaXQgYWRkciBsZW4gdG8gZGlzY292ZXIgYWN0dWFsIGFkZHIgbGVuICovCisJZTEwMF9lZXByb21fcmVhZChuaWMsICZhZGRyX2xlbiwgMCk7CisJbmljLT5lZXByb21fd2MgPSAxIDw8IGFkZHJfbGVuOworCisJaWYoc3RhcnQgKyBjb3VudCA+PSBuaWMtPmVlcHJvbV93YykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IoYWRkciA9IHN0YXJ0OyBhZGRyIDwgc3RhcnQgKyBjb3VudDsgYWRkcisrKQorCQllMTAwX2VlcHJvbV93cml0ZShuaWMsIGFkZHJfbGVuLCBhZGRyLCBuaWMtPmVlcHJvbVthZGRyXSk7CisKKwkvKiBUaGUgY2hlY2tzdW0sIHN0b3JlZCBpbiB0aGUgbGFzdCB3b3JkLCBpcyBjYWxjdWxhdGVkIHN1Y2ggdGhhdAorCSAqIHRoZSBzdW0gb2Ygd29yZHMgc2hvdWxkIGJlIDB4QkFCQSAqLworCWZvcihhZGRyID0gMDsgYWRkciA8IG5pYy0+ZWVwcm9tX3djIC0gMTsgYWRkcisrKQorCQljaGVja3N1bSArPSBjcHVfdG9fbGUxNihuaWMtPmVlcHJvbVthZGRyXSk7CisJbmljLT5lZXByb21bbmljLT5lZXByb21fd2MgLSAxXSA9IGxlMTZfdG9fY3B1KDB4QkFCQSAtIGNoZWNrc3VtKTsKKwllMTAwX2VlcHJvbV93cml0ZShuaWMsIGFkZHJfbGVuLCBuaWMtPmVlcHJvbV93YyAtIDEsCisJCW5pYy0+ZWVwcm9tW25pYy0+ZWVwcm9tX3djIC0gMV0pOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRTEwMF9XQUlUX1NDQl9USU1FT1VUIDQwCitzdGF0aWMgaW5saW5lIGludCBlMTAwX2V4ZWNfY21kKHN0cnVjdCBuaWMgKm5pYywgdTggY21kLCBkbWFfYWRkcl90IGRtYV9hZGRyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGVyciA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbmljLT5jbWRfbG9jaywgZmxhZ3MpOworCisJLyogUHJldmlvdXMgY29tbWFuZCBpcyBhY2NlcHRlZCB3aGVuIFNDQiBjbGVhcnMgKi8KKwlmb3IoaSA9IDA7IGkgPCBFMTAwX1dBSVRfU0NCX1RJTUVPVVQ7IGkrKykgeworCQlpZihsaWtlbHkoIXJlYWRiKCZuaWMtPmNzci0+c2NiLmNtZF9sbykpKQorCQkJYnJlYWs7CisJCWNwdV9yZWxheCgpOworCQlpZih1bmxpa2VseShpID4gKEUxMDBfV0FJVF9TQ0JfVElNRU9VVCA+PiAxKSkpCisJCQl1ZGVsYXkoNSk7CisJfQorCWlmKHVubGlrZWx5KGkgPT0gRTEwMF9XQUlUX1NDQl9USU1FT1VUKSkgeworCQllcnIgPSAtRUFHQUlOOworCQlnb3RvIGVycl91bmxvY2s7CisJfQorCisJaWYodW5saWtlbHkoY21kICE9IGN1Y19yZXN1bWUpKQorCQl3cml0ZWwoZG1hX2FkZHIsICZuaWMtPmNzci0+c2NiLmdlbl9wdHIpOworCXdyaXRlYihjbWQsICZuaWMtPmNzci0+c2NiLmNtZF9sbyk7CisKK2Vycl91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmljLT5jbWRfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBpbnQgZTEwMF9leGVjX2NiKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwl2b2lkICgqY2JfcHJlcGFyZSkoc3RydWN0IG5pYyAqLCBzdHJ1Y3QgY2IgKiwgc3RydWN0IHNrX2J1ZmYgKikpCit7CisJc3RydWN0IGNiICpjYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnIgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5pYy0+Y2JfbG9jaywgZmxhZ3MpOworCisJaWYodW5saWtlbHkoIW5pYy0+Y2JzX2F2YWlsKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl91bmxvY2s7CisJfQorCisJY2IgPSBuaWMtPmNiX3RvX3VzZTsKKwluaWMtPmNiX3RvX3VzZSA9IGNiLT5uZXh0OworCW5pYy0+Y2JzX2F2YWlsLS07CisJY2ItPnNrYiA9IHNrYjsKKworCWlmKHVubGlrZWx5KCFuaWMtPmNic19hdmFpbCkpCisJCWVyciA9IC1FTk9TUEM7CisKKwljYl9wcmVwYXJlKG5pYywgY2IsIHNrYik7CisKKwkvKiBPcmRlciBpcyBpbXBvcnRhbnQgb3RoZXJ3aXNlIHdlJ2xsIGJlIGluIGEgcmFjZSB3aXRoIGgvdzoKKwkgKiBzZXQgUy1iaXQgaW4gY3VycmVudCBmaXJzdCwgdGhlbiBjbGVhciBTLWJpdCBpbiBwcmV2aW91cy4gKi8KKwljYi0+Y29tbWFuZCB8PSBjcHVfdG9fbGUxNihjYl9zKTsKKwl3bWIoKTsKKwljYi0+cHJldi0+Y29tbWFuZCAmPSBjcHVfdG9fbGUxNih+Y2Jfcyk7CisKKwl3aGlsZShuaWMtPmNiX3RvX3NlbmQgIT0gbmljLT5jYl90b191c2UpIHsKKwkJaWYodW5saWtlbHkoZTEwMF9leGVjX2NtZChuaWMsIG5pYy0+Y3VjX2NtZCwKKwkJCW5pYy0+Y2JfdG9fc2VuZC0+ZG1hX2FkZHIpKSkgeworCQkJLyogT2ssIGhlcmUncyB3aGVyZSB0aGluZ3MgZ2V0IHN0aWNreS4gIEl0J3MKKwkJCSAqIHBvc3NpYmxlIHRoYXQgd2UgY2FuJ3Qgc2NoZWR1bGUgdGhlIGNvbW1hbmQKKwkJCSAqIGJlY2F1c2UgdGhlIGNvbnRyb2xsZXIgaXMgdG9vIGJ1c3ksIHNvCisJCQkgKiBsZXQncyBqdXN0IHF1ZXVlIHRoZSBjb21tYW5kIGFuZCB0cnkgYWdhaW4KKwkJCSAqIHdoZW4gYW5vdGhlciBjb21tYW5kIGlzIHNjaGVkdWxlZC4gKi8KKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJbmljLT5jdWNfY21kID0gY3VjX3Jlc3VtZTsKKwkJCW5pYy0+Y2JfdG9fc2VuZCA9IG5pYy0+Y2JfdG9fc2VuZC0+bmV4dDsKKwkJfQorCX0KKworZXJyX3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuaWMtPmNiX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB1MTYgbWRpb19jdHJsKHN0cnVjdCBuaWMgKm5pYywgdTMyIGFkZHIsIHUzMiBkaXIsIHUzMiByZWcsIHUxNiBkYXRhKQoreworCXUzMiBkYXRhX291dCA9IDA7CisJdW5zaWduZWQgaW50IGk7CisKKwl3cml0ZWwoKHJlZyA8PCAxNikgfCAoYWRkciA8PCAyMSkgfCBkaXIgfCBkYXRhLCAmbmljLT5jc3ItPm1kaV9jdHJsKTsKKworCWZvcihpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCXVkZWxheSgyMCk7CisJCWlmKChkYXRhX291dCA9IHJlYWRsKCZuaWMtPmNzci0+bWRpX2N0cmwpKSAmIG1kaV9yZWFkeSkKKwkJCWJyZWFrOworCX0KKworCURQUklOVEsoSFcsIERFQlVHLAorCQkiJXM6YWRkcj0lZCwgcmVnPSVkLCBkYXRhX2luPTB4JTA0WCwgZGF0YV9vdXQ9MHglMDRYXG4iLAorCQlkaXIgPT0gbWRpX3JlYWQgPyAiUkVBRCIgOiAiV1JJVEUiLCBhZGRyLCByZWcsIGRhdGEsIGRhdGFfb3V0KTsKKwlyZXR1cm4gKHUxNilkYXRhX291dDsKK30KKworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IGFkZHIsIGludCByZWcpCit7CisJcmV0dXJuIG1kaW9fY3RybChuZXRkZXZfcHJpdihuZXRkZXYpLCBhZGRyLCBtZGlfcmVhZCwgcmVnLCAwKTsKK30KKworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgYWRkciwgaW50IHJlZywgaW50IGRhdGEpCit7CisJbWRpb19jdHJsKG5ldGRldl9wcml2KG5ldGRldiksIGFkZHIsIG1kaV93cml0ZSwgcmVnLCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQgZTEwMF9nZXRfZGVmYXVsdHMoc3RydWN0IG5pYyAqbmljKQoreworCXN0cnVjdCBwYXJhbV9yYW5nZSByZmRzID0geyAubWluID0gNjQsIC5tYXggPSAyNTYsIC5jb3VudCA9IDY0IH07CisJc3RydWN0IHBhcmFtX3JhbmdlIGNicyAgPSB7IC5taW4gPSA2NCwgLm1heCA9IDI1NiwgLmNvdW50ID0gNjQgfTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKG5pYy0+cGRldiwgUENJX1JFVklTSU9OX0lELCAmbmljLT5yZXZfaWQpOworCS8qIE1BQyB0eXBlIGlzIGVuY29kZWQgYXMgcmV2IElEOyBleGNlcHRpb246IElDSCBpcyB0cmVhdGVkIGFzIDgyNTU5ICovCisJbmljLT5tYWMgPSAobmljLT5mbGFncyAmIGljaCkgPyBtYWNfODI1NTlfRDEwMU0gOiBuaWMtPnJldl9pZDsKKwlpZihuaWMtPm1hYyA9PSBtYWNfdW5rbm93bikKKwkJbmljLT5tYWMgPSBtYWNfODI1NTdfRDEwMF9BOworCisJbmljLT5wYXJhbXMucmZkcyA9IHJmZHM7CisJbmljLT5wYXJhbXMuY2JzID0gY2JzOworCisJLyogUXVhZHdvcmRzIHRvIERNQSBpbnRvIEZJRk8gYmVmb3JlIHN0YXJ0aW5nIGZyYW1lIHRyYW5zbWl0ICovCisJbmljLT50eF90aHJlc2hvbGQgPSAweEUwOworCisJbmljLT50eF9jb21tYW5kID0gY3B1X3RvX2xlMTYoY2JfdHggfCBjYl9pIHwgY2JfdHhfc2YgfAorCQkoKG5pYy0+bWFjID49IG1hY184MjU1OF9EMTAxX0E0KSA/IGNiX2NpZCA6IDApKTsKKworCS8qIFRlbXBsYXRlIGZvciBhIGZyZXNobHkgYWxsb2NhdGVkIFJGRCAqLworCW5pYy0+YmxhbmtfcmZkLmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjYl9lbCk7CisJbmljLT5ibGFua19yZmQucmJkID0gMHhGRkZGRkZGRjsKKwluaWMtPmJsYW5rX3JmZC5zaXplID0gY3B1X3RvX2xlMTYoVkxBTl9FVEhfRlJBTUVfTEVOKTsKKworCS8qIE1JSSBzZXR1cCAqLworCW5pYy0+bWlpLnBoeV9pZF9tYXNrID0gMHgxRjsKKwluaWMtPm1paS5yZWdfbnVtX21hc2sgPSAweDFGOworCW5pYy0+bWlpLmRldiA9IG5pYy0+bmV0ZGV2OworCW5pYy0+bWlpLm1kaW9fcmVhZCA9IG1kaW9fcmVhZDsKKwluaWMtPm1paS5tZGlvX3dyaXRlID0gbWRpb193cml0ZTsKK30KKworc3RhdGljIHZvaWQgZTEwMF9jb25maWd1cmUoc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgY2IgKmNiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBjb25maWcgKmNvbmZpZyA9ICZjYi0+dS5jb25maWc7CisJdTggKmMgPSAodTggKiljb25maWc7CisKKwljYi0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNiX2NvbmZpZyk7CisKKwltZW1zZXQoY29uZmlnLCAwLCBzaXplb2Yoc3RydWN0IGNvbmZpZykpOworCisJY29uZmlnLT5ieXRlX2NvdW50ID0gMHgxNjsJCS8qIGJ5dGVzIGluIHRoaXMgc3RydWN0ICovCisJY29uZmlnLT5yeF9maWZvX2xpbWl0ID0gMHg4OwkJLyogYnl0ZXMgaW4gRklGTyBiZWZvcmUgRE1BICovCisJY29uZmlnLT5kaXJlY3RfcnhfZG1hID0gMHgxOwkJLyogcmVzZXJ2ZWQgKi8KKwljb25maWctPnN0YW5kYXJkX3RjYiA9IDB4MTsJCS8qIDE9c3RhbmRhcmQsIDA9ZXh0ZW5kZWQgKi8KKwljb25maWctPnN0YW5kYXJkX3N0YXRfY291bnRlciA9IDB4MTsJLyogMT1zdGFuZGFyZCwgMD1leHRlbmRlZCAqLworCWNvbmZpZy0+cnhfZGlzY2FyZF9zaG9ydF9mcmFtZXMgPSAweDE7CS8qIDE9ZGlzY2FyZCwgMD1wYXNzICovCisJY29uZmlnLT50eF91bmRlcnJ1bl9yZXRyeSA9IDB4MzsJLyogIyBvZiB1bmRlcnJ1biByZXRyaWVzICovCisJY29uZmlnLT5taWlfbW9kZSA9IDB4MTsJCQkvKiAxPU1JSSBtb2RlLCAwPTUwMyBtb2RlICovCisJY29uZmlnLT5wYWQxMCA9IDB4NjsKKwljb25maWctPm5vX3NvdXJjZV9hZGRyX2luc2VydGlvbiA9IDB4MTsJLyogMT1ubywgMD15ZXMgKi8KKwljb25maWctPnByZWFtYmxlX2xlbmd0aCA9IDB4MjsJCS8qIDA9MSwgMT0zLCAyPTcsIDM9MTUgYnl0ZXMgKi8KKwljb25maWctPmlmcyA9IDB4NjsJCQkvKiB4MTYgPSBpbnRlciBmcmFtZSBzcGFjaW5nICovCisJY29uZmlnLT5pcF9hZGRyX2hpID0gMHhGMjsJCS8qIEFSUCBJUCBmaWx0ZXIgLSBub3QgdXNlZCAqLworCWNvbmZpZy0+cGFkMTVfMSA9IDB4MTsKKwljb25maWctPnBhZDE1XzIgPSAweDE7CisJY29uZmlnLT5jcnNfb3JfY2R0ID0gMHgwOwkJLyogMD1DUlMgb25seSwgMT1DUlMgb3IgQ0RUICovCisJY29uZmlnLT5mY19kZWxheV9oaSA9IDB4NDA7CQkvKiB0aW1lIGRlbGF5IGZvciBmYyBmcmFtZSAqLworCWNvbmZpZy0+dHhfcGFkZGluZyA9IDB4MTsJCS8qIDE9cGFkIHNob3J0IGZyYW1lcyAqLworCWNvbmZpZy0+ZmNfcHJpb3JpdHlfdGhyZXNob2xkID0gMHg3OwkvKiA3PXByaW9yaXR5IGZjIGRpc2FibGVkICovCisJY29uZmlnLT5wYWQxOCA9IDB4MTsKKwljb25maWctPmZ1bGxfZHVwbGV4X3BpbiA9IDB4MTsJCS8qIDE9ZXhhbWluZSBGRFgjIHBpbiAqLworCWNvbmZpZy0+cGFkMjBfMSA9IDB4MUY7CisJY29uZmlnLT5mY19wcmlvcml0eV9sb2NhdGlvbiA9IDB4MTsJLyogMT1ieXRlIzMxLCAwPWJ5dGUjMTkgKi8KKwljb25maWctPnBhZDIxXzEgPSAweDU7CisKKwljb25maWctPmFkYXB0aXZlX2lmcyA9IG5pYy0+YWRhcHRpdmVfaWZzOworCWNvbmZpZy0+bG9vcGJhY2sgPSBuaWMtPmxvb3BiYWNrOworCisJaWYobmljLT5taWkuZm9yY2VfbWVkaWEgJiYgbmljLT5taWkuZnVsbF9kdXBsZXgpCisJCWNvbmZpZy0+ZnVsbF9kdXBsZXhfZm9yY2UgPSAweDE7CS8qIDE9Zm9yY2UsIDA9YXV0byAqLworCisJaWYobmljLT5mbGFncyAmIHByb21pc2N1b3VzIHx8IG5pYy0+bG9vcGJhY2spIHsKKwkJY29uZmlnLT5yeF9zYXZlX2JhZF9mcmFtZXMgPSAweDE7CS8qIDE9c2F2ZSwgMD1kaXNjYXJkICovCisJCWNvbmZpZy0+cnhfZGlzY2FyZF9zaG9ydF9mcmFtZXMgPSAweDA7CS8qIDE9ZGlzY2FyZCwgMD1zYXZlICovCisJCWNvbmZpZy0+cHJvbWlzY3VvdXNfbW9kZSA9IDB4MTsJCS8qIDE9b24sIDA9b2ZmICovCisJfQorCisJaWYobmljLT5mbGFncyAmIG11bHRpY2FzdF9hbGwpCisJCWNvbmZpZy0+bXVsdGljYXN0X2FsbCA9IDB4MTsJCS8qIDE9YWNjZXB0LCAwPW5vICovCisKKwlpZighKG5pYy0+ZmxhZ3MgJiB3b2xfbWFnaWMpKQorCQljb25maWctPm1hZ2ljX3BhY2tldF9kaXNhYmxlID0gMHgxOwkvKiAxPW9mZiwgMD1vbiAqLworCisJaWYobmljLT5tYWMgPj0gbWFjXzgyNTU4X0QxMDFfQTQpIHsKKwkJY29uZmlnLT5mY19kaXNhYmxlID0gMHgxOwkvKiAxPVR4IGZjIG9mZiwgMD1UeCBmYyBvbiAqLworCQljb25maWctPm13aV9lbmFibGUgPSAweDE7CS8qIDE9ZW5hYmxlLCAwPWRpc2FibGUgKi8KKwkJY29uZmlnLT5zdGFuZGFyZF90Y2IgPSAweDA7CS8qIDE9c3RhbmRhcmQsIDA9ZXh0ZW5kZWQgKi8KKwkJY29uZmlnLT5yeF9sb25nX29rID0gMHgxOwkvKiAxPVZMQU5zIG9rLCAwPXN0YW5kYXJkICovCisJCWlmKG5pYy0+bWFjID49IG1hY184MjU1OV9EMTAxTSkKKwkJCWNvbmZpZy0+dG5vX2ludHIgPSAweDE7CQkvKiBUQ08gc3RhdHMgZW5hYmxlICovCisJCWVsc2UKKwkJCWNvbmZpZy0+c3RhbmRhcmRfc3RhdF9jb3VudGVyID0gMHgwOworCX0KKworCURQUklOVEsoSFcsIERFQlVHLCAiWzAwLTA3XT0lMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJCWNbMF0sIGNbMV0sIGNbMl0sIGNbM10sIGNbNF0sIGNbNV0sIGNbNl0sIGNbN10pOworCURQUklOVEsoSFcsIERFQlVHLCAiWzA4LTE1XT0lMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJCWNbOF0sIGNbOV0sIGNbMTBdLCBjWzExXSwgY1sxMl0sIGNbMTNdLCBjWzE0XSwgY1sxNV0pOworCURQUklOVEsoSFcsIERFQlVHLCAiWzE2LTIzXT0lMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJCWNbMTZdLCBjWzE3XSwgY1sxOF0sIGNbMTldLCBjWzIwXSwgY1syMV0sIGNbMjJdLCBjWzIzXSk7Cit9CisKK3N0YXRpYyB2b2lkIGUxMDBfbG9hZF91Y29kZShzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBjYiAqY2IsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGk7CisJc3RhdGljIGNvbnN0IHUzMiB1Y29kZVtVQ09ERV9TSVpFXSA9IHsKKwkJLyogTkZTIHBhY2tldHMgYXJlIG1pc2ludGVycHJldGVkIGFzIFRDTyBwYWNrZXRzIGFuZAorCQkgKiBpbmNvcnJlY3RseSByb3V0ZWQgdG8gdGhlIEJNQyBvdmVyIFNNQnVzLiAgVGhpcworCQkgKiBtaWNyb2NvZGUgcGF0Y2ggY2hlY2tzIHRoZSBmcmFnbWVudGVkIElQIGJpdCBpbiB0aGUKKwkJICogTkZTL1VEUCBoZWFkZXIgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBORlMgYW5kIFRDTy4gKi8KKwkJMHgwRUY3MEUzNiwgMHgxRkZGMUZGRiwgMHgxRkZGMUZGRiwgMHgxRkZGMUZGRiwgMHgxRkZGMUZGRiwKKwkJMHgxRkZGMUZGRiwgMHgwMDkwNkU0MSwgMHgwMDgwMEUzQywgMHgwMEUwMEUzOSwgMHgwMDAwMDAwMCwKKwkJMHgwMDkwNkVGRCwgMHgwMDkwMEVGRCwJMHgwMEUwMEVGOCwKKwl9OworCisJaWYobmljLT5tYWMgPT0gbWFjXzgyNTUxX0YgfHwgbmljLT5tYWMgPT0gbWFjXzgyNTUxXzEwKSB7CisJCWZvcihpID0gMDsgaSA8IFVDT0RFX1NJWkU7IGkrKykKKwkJCWNiLT51LnVjb2RlW2ldID0gY3B1X3RvX2xlMzIodWNvZGVbaV0pOworCQljYi0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNiX3Vjb2RlKTsKKwl9IGVsc2UKKwkJY2ItPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjYl9ub3ApOworfQorCitzdGF0aWMgdm9pZCBlMTAwX3NldHVwX2lhYWRkcihzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBjYiAqY2IsCisJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwljYi0+Y29tbWFuZCA9IGNwdV90b19sZTE2KGNiX2lhYWRkcik7CisJbWVtY3B5KGNiLT51LmlhYWRkciwgbmljLT5uZXRkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Cit9CisKK3N0YXRpYyB2b2lkIGUxMDBfZHVtcChzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBjYiAqY2IsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJY2ItPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihjYl9kdW1wKTsKKwljYi0+dS5kdW1wX2J1ZmZlcl9hZGRyID0gY3B1X3RvX2xlMzIobmljLT5kbWFfYWRkciArCisJCW9mZnNldG9mKHN0cnVjdCBtZW0sIGR1bXBfYnVmKSk7Cit9CisKKyNkZWZpbmUgTkNPTkZJR19BVVRPX1NXSVRDSAkweDAwODAKKyNkZWZpbmUgTUlJX05TQ19DT05HCQlNSUlfUkVTVjEKKyNkZWZpbmUgTlNDX0NPTkdfRU5BQkxFCQkweDAxMDAKKyNkZWZpbmUgTlNDX0NPTkdfVFhSRUFEWQkweDA0MDAKKyNkZWZpbmUgQURWRVJUSVNFX0ZDX1NVUFBPUlRFRAkweDA0MDAKK3N0YXRpYyBpbnQgZTEwMF9waHlfaW5pdChzdHJ1Y3QgbmljICpuaWMpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IG5pYy0+bmV0ZGV2OworCXUzMiBhZGRyOworCXUxNiBibWNyLCBzdGF0LCBpZF9sbywgaWRfaGksIGNvbmc7CisKKwkvKiBEaXNjb3ZlciBwaHkgYWRkciBieSBzZWFyY2hpbmcgYWRkcnMgaW4gb3JkZXIgezEsMCwyLC4uLiwgMzF9ICovCisJZm9yKGFkZHIgPSAwOyBhZGRyIDwgMzI7IGFkZHIrKykgeworCQluaWMtPm1paS5waHlfaWQgPSAoYWRkciA9PSAwKSA/IDEgOiAoYWRkciA9PSAxKSA/IDAgOiBhZGRyOworCQlibWNyID0gbWRpb19yZWFkKG5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfQk1DUik7CisJCXN0YXQgPSBtZGlvX3JlYWQobmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIE1JSV9CTVNSKTsKKwkJc3RhdCA9IG1kaW9fcmVhZChuZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX0JNU1IpOworCQlpZighKChibWNyID09IDB4RkZGRikgfHwgKChzdGF0ID09IDApICYmIChibWNyID09IDApKSkpCisJCQlicmVhazsKKwl9CisJRFBSSU5USyhIVywgREVCVUcsICJwaHlfYWRkciA9ICVkXG4iLCBuaWMtPm1paS5waHlfaWQpOworCWlmKGFkZHIgPT0gMzIpCisJCXJldHVybiAtRUFHQUlOOworCisJLyogU2VsZWN0ZWQgdGhlIHBoeSBhbmQgaXNvbGF0ZSB0aGUgcmVzdCAqLworCWZvcihhZGRyID0gMDsgYWRkciA8IDMyOyBhZGRyKyspIHsKKwkJaWYoYWRkciAhPSBuaWMtPm1paS5waHlfaWQpIHsKKwkJCW1kaW9fd3JpdGUobmV0ZGV2LCBhZGRyLCBNSUlfQk1DUiwgQk1DUl9JU09MQVRFKTsKKwkJfSBlbHNlIHsKKwkJCWJtY3IgPSBtZGlvX3JlYWQobmV0ZGV2LCBhZGRyLCBNSUlfQk1DUik7CisJCQltZGlvX3dyaXRlKG5ldGRldiwgYWRkciwgTUlJX0JNQ1IsCisJCQkJYm1jciAmIH5CTUNSX0lTT0xBVEUpOworCQl9CisJfQorCisJLyogR2V0IHBoeSBJRCAqLworCWlkX2xvID0gbWRpb19yZWFkKG5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfUEhZU0lEMSk7CisJaWRfaGkgPSBtZGlvX3JlYWQobmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIE1JSV9QSFlTSUQyKTsKKwluaWMtPnBoeSA9ICh1MzIpaWRfaGkgPDwgMTYgfCAodTMyKWlkX2xvOworCURQUklOVEsoSFcsIERFQlVHLCAicGh5IElEID0gMHglMDhYXG4iLCBuaWMtPnBoeSk7CisKKwkvKiBIYW5kbGUgTmF0aW9uYWwgdHggcGh5cyAqLworI2RlZmluZSBOQ1NfUEhZX01PREVMX01BU0sJMHhGRkYwRkZGRgorCWlmKChuaWMtPnBoeSAmIE5DU19QSFlfTU9ERUxfTUFTSykgPT0gcGh5X25zY190eCkgeworCQkvKiBEaXNhYmxlIGNvbmdlc3Rpb24gY29udHJvbCAqLworCQljb25nID0gbWRpb19yZWFkKG5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfTlNDX0NPTkcpOworCQljb25nIHw9IE5TQ19DT05HX1RYUkVBRFk7CisJCWNvbmcgJj0gfk5TQ19DT05HX0VOQUJMRTsKKwkJbWRpb193cml0ZShuZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX05TQ19DT05HLCBjb25nKTsKKwl9CisKKwlpZigobmljLT5tYWMgPj0gbWFjXzgyNTUwX0QxMDIpIHx8ICgobmljLT5mbGFncyAmIGljaCkgJiYgCisJCShtZGlvX3JlYWQobmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIE1JSV9UUElTVEFUVVMpICYgMHg4MDAwKSAmJiAKKwkJKG5pYy0+ZWVwcm9tW2VlcHJvbV9jbmZnX21kaXhdICYgZWVwcm9tX21kaXhfZW5hYmxlZCkpKQorCQkvKiBlbmFibGUvZGlzYWJsZSBNREkvTURJLVggYXV0by1zd2l0Y2hpbmcgKi8KKwkJbWRpb193cml0ZShuZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX05DT05GSUcsCisJCQluaWMtPm1paS5mb3JjZV9tZWRpYSA/IDAgOiBOQ09ORklHX0FVVE9fU1dJVENIKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGUxMDBfaHdfaW5pdChzdHJ1Y3QgbmljICpuaWMpCit7CisJaW50IGVycjsKKworCWUxMDBfaHdfcmVzZXQobmljKTsKKworCURQUklOVEsoSFcsIEVSUiwgImUxMDBfaHdfaW5pdFxuIik7CisJaWYoIWluX2ludGVycnVwdCgpICYmIChlcnIgPSBlMTAwX3NlbGZfdGVzdChuaWMpKSkKKwkJcmV0dXJuIGVycjsKKworCWlmKChlcnIgPSBlMTAwX3BoeV9pbml0KG5pYykpKQorCQlyZXR1cm4gZXJyOworCWlmKChlcnIgPSBlMTAwX2V4ZWNfY21kKG5pYywgY3VjX2xvYWRfYmFzZSwgMCkpKQorCQlyZXR1cm4gZXJyOworCWlmKChlcnIgPSBlMTAwX2V4ZWNfY21kKG5pYywgcnVjX2xvYWRfYmFzZSwgMCkpKQorCQlyZXR1cm4gZXJyOworCWlmKChlcnIgPSBlMTAwX2V4ZWNfY2IobmljLCBOVUxMLCBlMTAwX2xvYWRfdWNvZGUpKSkKKwkJcmV0dXJuIGVycjsKKwlpZigoZXJyID0gZTEwMF9leGVjX2NiKG5pYywgTlVMTCwgZTEwMF9jb25maWd1cmUpKSkKKwkJcmV0dXJuIGVycjsKKwlpZigoZXJyID0gZTEwMF9leGVjX2NiKG5pYywgTlVMTCwgZTEwMF9zZXR1cF9pYWFkZHIpKSkKKwkJcmV0dXJuIGVycjsKKwlpZigoZXJyID0gZTEwMF9leGVjX2NtZChuaWMsIGN1Y19kdW1wX2FkZHIsCisJCW5pYy0+ZG1hX2FkZHIgKyBvZmZzZXRvZihzdHJ1Y3QgbWVtLCBzdGF0cykpKSkKKwkJcmV0dXJuIGVycjsKKwlpZigoZXJyID0gZTEwMF9leGVjX2NtZChuaWMsIGN1Y19kdW1wX3Jlc2V0LCAwKSkpCisJCXJldHVybiBlcnI7CisKKwllMTAwX2Rpc2FibGVfaXJxKG5pYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZTEwMF9tdWx0aShzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBjYiAqY2IsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IG5pYy0+bmV0ZGV2OworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbGlzdCA9IG5ldGRldi0+bWNfbGlzdDsKKwl1MTYgaSwgY291bnQgPSBtaW4obmV0ZGV2LT5tY19jb3VudCwgRTEwMF9NQVhfTVVMVElDQVNUX0FERFJTKTsKKworCWNiLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY2JfbXVsdGkpOworCWNiLT51Lm11bHRpLmNvdW50ID0gY3B1X3RvX2xlMTYoY291bnQgKiBFVEhfQUxFTik7CisJZm9yKGkgPSAwOyBsaXN0ICYmIGkgPCBjb3VudDsgaSsrLCBsaXN0ID0gbGlzdC0+bmV4dCkKKwkJbWVtY3B5KCZjYi0+dS5tdWx0aS5hZGRyW2kqRVRIX0FMRU5dLCAmbGlzdC0+ZG1pX2FkZHIsCisJCQlFVEhfQUxFTik7Cit9CisKK3N0YXRpYyB2b2lkIGUxMDBfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCURQUklOVEsoSFcsIERFQlVHLCAibWNfY291bnQ9JWQsIGZsYWdzPTB4JTA0WFxuIiwKKwkJbmV0ZGV2LT5tY19jb3VudCwgbmV0ZGV2LT5mbGFncyk7CisKKwlpZihuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCW5pYy0+ZmxhZ3MgfD0gcHJvbWlzY3VvdXM7CisJZWxzZQorCQluaWMtPmZsYWdzICY9IH5wcm9taXNjdW91czsKKworCWlmKG5ldGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgfHwKKwkJbmV0ZGV2LT5tY19jb3VudCA+IEUxMDBfTUFYX01VTFRJQ0FTVF9BRERSUykKKwkJbmljLT5mbGFncyB8PSBtdWx0aWNhc3RfYWxsOworCWVsc2UKKwkJbmljLT5mbGFncyAmPSB+bXVsdGljYXN0X2FsbDsKKworCWUxMDBfZXhlY19jYihuaWMsIE5VTEwsIGUxMDBfY29uZmlndXJlKTsKKwllMTAwX2V4ZWNfY2IobmljLCBOVUxMLCBlMTAwX211bHRpKTsKK30KKworc3RhdGljIHZvaWQgZTEwMF91cGRhdGVfc3RhdHMoc3RydWN0IG5pYyAqbmljKQoreworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpucyA9ICZuaWMtPm5ldF9zdGF0czsKKwlzdHJ1Y3Qgc3RhdHMgKnMgPSAmbmljLT5tZW0tPnN0YXRzOworCXUzMiAqY29tcGxldGUgPSAobmljLT5tYWMgPCBtYWNfODI1NThfRDEwMV9BNCkgPyAmcy0+ZmNfeG10X3BhdXNlIDoKKwkJKG5pYy0+bWFjIDwgbWFjXzgyNTU5X0QxMDFNKSA/ICh1MzIgKikmcy0+eG10X3Rjb19mcmFtZXMgOgorCQkmcy0+Y29tcGxldGU7CisKKwkvKiBEZXZpY2UncyBzdGF0cyByZXBvcnRpbmcgbWF5IHRha2Ugc2V2ZXJhbCBtaWNyb3NlY29uZHMgdG8KKwkgKiBjb21wbGV0ZSwgc28gd2hlcmUgYWx3YXlzIHdhaXRpbmcgZm9yIHJlc3VsdHMgb2YgdGhlCisJICogcHJldmlvdXMgY29tbWFuZC4gKi8KKworCWlmKCpjb21wbGV0ZSA9PSBsZTMyX3RvX2NwdShjdWNfZHVtcF9yZXNldF9jb21wbGV0ZSkpIHsKKwkJKmNvbXBsZXRlID0gMDsKKwkJbmljLT50eF9mcmFtZXMgPSBsZTMyX3RvX2NwdShzLT50eF9nb29kX2ZyYW1lcyk7CisJCW5pYy0+dHhfY29sbGlzaW9ucyA9IGxlMzJfdG9fY3B1KHMtPnR4X3RvdGFsX2NvbGxpc2lvbnMpOworCQlucy0+dHhfYWJvcnRlZF9lcnJvcnMgKz0gbGUzMl90b19jcHUocy0+dHhfbWF4X2NvbGxpc2lvbnMpOworCQlucy0+dHhfd2luZG93X2Vycm9ycyArPSBsZTMyX3RvX2NwdShzLT50eF9sYXRlX2NvbGxpc2lvbnMpOworCQlucy0+dHhfY2Fycmllcl9lcnJvcnMgKz0gbGUzMl90b19jcHUocy0+dHhfbG9zdF9jcnMpOworCQlucy0+dHhfZmlmb19lcnJvcnMgKz0gbGUzMl90b19jcHUocy0+dHhfdW5kZXJydW5zKTsKKwkJbnMtPmNvbGxpc2lvbnMgKz0gbmljLT50eF9jb2xsaXNpb25zOworCQlucy0+dHhfZXJyb3JzICs9IGxlMzJfdG9fY3B1KHMtPnR4X21heF9jb2xsaXNpb25zKSArCisJCQlsZTMyX3RvX2NwdShzLT50eF9sb3N0X2Nycyk7CisJCW5zLT5yeF9kcm9wcGVkICs9IGxlMzJfdG9fY3B1KHMtPnJ4X3Jlc291cmNlX2Vycm9ycyk7CisJCW5zLT5yeF9sZW5ndGhfZXJyb3JzICs9IGxlMzJfdG9fY3B1KHMtPnJ4X3Nob3J0X2ZyYW1lX2Vycm9ycykgKworCQkJbmljLT5yeF9vdmVyX2xlbmd0aF9lcnJvcnM7CisJCW5zLT5yeF9jcmNfZXJyb3JzICs9IGxlMzJfdG9fY3B1KHMtPnJ4X2NyY19lcnJvcnMpOworCQlucy0+cnhfZnJhbWVfZXJyb3JzICs9IGxlMzJfdG9fY3B1KHMtPnJ4X2FsaWdubWVudF9lcnJvcnMpOworCQlucy0+cnhfb3Zlcl9lcnJvcnMgKz0gbGUzMl90b19jcHUocy0+cnhfb3ZlcnJ1bl9lcnJvcnMpOworCQlucy0+cnhfZmlmb19lcnJvcnMgKz0gbGUzMl90b19jcHUocy0+cnhfb3ZlcnJ1bl9lcnJvcnMpOworCQlucy0+cnhfZXJyb3JzICs9IGxlMzJfdG9fY3B1KHMtPnJ4X2NyY19lcnJvcnMpICsKKwkJCWxlMzJfdG9fY3B1KHMtPnJ4X2FsaWdubWVudF9lcnJvcnMpICsKKwkJCWxlMzJfdG9fY3B1KHMtPnJ4X3Nob3J0X2ZyYW1lX2Vycm9ycykgKworCQkJbGUzMl90b19jcHUocy0+cnhfY2R0X2Vycm9ycyk7CisJCW5pYy0+dHhfZGVmZXJyZWQgKz0gbGUzMl90b19jcHUocy0+dHhfZGVmZXJyZWQpOworCQluaWMtPnR4X3NpbmdsZV9jb2xsaXNpb25zICs9CisJCQlsZTMyX3RvX2NwdShzLT50eF9zaW5nbGVfY29sbGlzaW9ucyk7CisJCW5pYy0+dHhfbXVsdGlwbGVfY29sbGlzaW9ucyArPQorCQkJbGUzMl90b19jcHUocy0+dHhfbXVsdGlwbGVfY29sbGlzaW9ucyk7CisJCWlmKG5pYy0+bWFjID49IG1hY184MjU1OF9EMTAxX0E0KSB7CisJCQluaWMtPnR4X2ZjX3BhdXNlICs9IGxlMzJfdG9fY3B1KHMtPmZjX3htdF9wYXVzZSk7CisJCQluaWMtPnJ4X2ZjX3BhdXNlICs9IGxlMzJfdG9fY3B1KHMtPmZjX3Jjdl9wYXVzZSk7CisJCQluaWMtPnJ4X2ZjX3Vuc3VwcG9ydGVkICs9CisJCQkJbGUzMl90b19jcHUocy0+ZmNfcmN2X3Vuc3VwcG9ydGVkKTsKKwkJCWlmKG5pYy0+bWFjID49IG1hY184MjU1OV9EMTAxTSkgeworCQkJCW5pYy0+dHhfdGNvX2ZyYW1lcyArPQorCQkJCQlsZTE2X3RvX2NwdShzLT54bXRfdGNvX2ZyYW1lcyk7CisJCQkJbmljLT5yeF90Y29fZnJhbWVzICs9CisJCQkJCWxlMTZfdG9fY3B1KHMtPnJjdl90Y29fZnJhbWVzKTsKKwkJCX0KKwkJfQorCX0KKworCWUxMDBfZXhlY19jbWQobmljLCBjdWNfZHVtcF9yZXNldCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGUxMDBfYWRqdXN0X2FkYXB0aXZlX2lmcyhzdHJ1Y3QgbmljICpuaWMsIGludCBzcGVlZCwgaW50IGR1cGxleCkKK3sKKwkvKiBBZGp1c3QgaW50ZXItZnJhbWUtc3BhY2luZyAoSUZTKSBiZXR3ZWVuIHR3byB0cmFuc21pdHMgaWYKKwkgKiB3ZSdyZSBnZXR0aW5nIGNvbGxpc2lvbnMgb24gYSBoYWxmLWR1cGxleCBjb25uZWN0aW9uLiAqLworCisJaWYoZHVwbGV4ID09IERVUExFWF9IQUxGKSB7CisJCXUzMiBwcmV2ID0gbmljLT5hZGFwdGl2ZV9pZnM7CisJCXUzMiBtaW5fZnJhbWVzID0gKHNwZWVkID09IFNQRUVEXzEwMCkgPyAxMDAwIDogMTAwOworCisJCWlmKChuaWMtPnR4X2ZyYW1lcyAvIDMyIDwgbmljLT50eF9jb2xsaXNpb25zKSAmJgorCQkgICAobmljLT50eF9mcmFtZXMgPiBtaW5fZnJhbWVzKSkgeworCQkJaWYobmljLT5hZGFwdGl2ZV9pZnMgPCA2MCkKKwkJCQluaWMtPmFkYXB0aXZlX2lmcyArPSA1OworCQl9IGVsc2UgaWYgKG5pYy0+dHhfZnJhbWVzIDwgbWluX2ZyYW1lcykgeworCQkJaWYobmljLT5hZGFwdGl2ZV9pZnMgPj0gNSkKKwkJCQluaWMtPmFkYXB0aXZlX2lmcyAtPSA1OworCQl9CisJCWlmKG5pYy0+YWRhcHRpdmVfaWZzICE9IHByZXYpCisJCQllMTAwX2V4ZWNfY2IobmljLCBOVUxMLCBlMTAwX2NvbmZpZ3VyZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlMTAwX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSAoc3RydWN0IG5pYyAqKWRhdGE7CisJc3RydWN0IGV0aHRvb2xfY21kIGNtZDsKKworCURQUklOVEsoVElNRVIsIERFQlVHLCAicmlnaHQgbm93ID0gJWxkXG4iLCBqaWZmaWVzKTsKKworCS8qIG1paSBsaWJyYXJ5IGhhbmRsZXMgbGluayBtYWludGVuYW5jZSB0YXNrcyAqLworCisJbWlpX2V0aHRvb2xfZ3NldCgmbmljLT5taWksICZjbWQpOworCisJaWYobWlpX2xpbmtfb2soJm5pYy0+bWlpKSAmJiAhbmV0aWZfY2Fycmllcl9vayhuaWMtPm5ldGRldikpIHsKKwkJRFBSSU5USyhMSU5LLCBJTkZPLCAibGluayB1cCwgJXNNYnBzLCAlcy1kdXBsZXhcbiIsCisJCQljbWQuc3BlZWQgPT0gU1BFRURfMTAwID8gIjEwMCIgOiAiMTAiLAorCQkJY21kLmR1cGxleCA9PSBEVVBMRVhfRlVMTCA/ICJmdWxsIiA6ICJoYWxmIik7CisJfSBlbHNlIGlmKCFtaWlfbGlua19vaygmbmljLT5taWkpICYmIG5ldGlmX2NhcnJpZXJfb2sobmljLT5uZXRkZXYpKSB7CisJCURQUklOVEsoTElOSywgSU5GTywgImxpbmsgZG93blxuIik7CisJfQorCisJbWlpX2NoZWNrX2xpbmsoJm5pYy0+bWlpKTsKKworCS8qIFNvZnR3YXJlIGdlbmVyYXRlZCBpbnRlcnJ1cHQgdG8gcmVjb3ZlciBmcm9tIChyYXJlKSBSeAorCSogYWxsb2NhdGlvbiBmYWlsdXJlLgorCSogVW5mb3J0dW5hdGVseSBoYXZlIHRvIHVzZSBhIHNwaW5sb2NrIHRvIG5vdCByZS1lbmFibGUgaW50ZXJydXB0cworCSogYWNjaWRlbnRhbGx5LCBkdWUgdG8gaGFyZHdhcmUgdGhhdCBzaGFyZXMgYSByZWdpc3RlciBiZXR3ZWVuIHRoZQorCSogaW50ZXJydXB0IG1hc2sgYml0IGFuZCB0aGUgU1cgSW50ZXJydXB0IGdlbmVyYXRpb24gYml0ICovCisJc3Bpbl9sb2NrX2lycSgmbmljLT5jbWRfbG9jayk7CisJd3JpdGViKHJlYWRiKCZuaWMtPmNzci0+c2NiLmNtZF9oaSkgfCBpcnFfc3dfZ2VuLCZuaWMtPmNzci0+c2NiLmNtZF9oaSk7CisJc3Bpbl91bmxvY2tfaXJxKCZuaWMtPmNtZF9sb2NrKTsKKwllMTAwX3dyaXRlX2ZsdXNoKG5pYyk7CisKKwllMTAwX3VwZGF0ZV9zdGF0cyhuaWMpOworCWUxMDBfYWRqdXN0X2FkYXB0aXZlX2lmcyhuaWMsIGNtZC5zcGVlZCwgY21kLmR1cGxleCk7CisKKwlpZihuaWMtPm1hYyA8PSBtYWNfODI1NTdfRDEwMF9DKQorCQkvKiBJc3N1ZSBhIG11bHRpY2FzdCBjb21tYW5kIHRvIHdvcmthcm91bmQgYSA1NTcgbG9jayB1cCAqLworCQllMTAwX3NldF9tdWx0aWNhc3RfbGlzdChuaWMtPm5ldGRldik7CisKKwlpZihuaWMtPmZsYWdzICYgaWNoICYmIGNtZC5zcGVlZD09U1BFRURfMTAgJiYgY21kLmR1cGxleD09RFVQTEVYX0hBTEYpCisJCS8qIE5lZWQgU1cgd29ya2Fyb3VuZCBmb3IgSUNIW3hdIDEwTWJwcy9oYWxmIGR1cGxleCBUeCBoYW5nLiAqLworCQluaWMtPmZsYWdzIHw9IGljaF8xMGhfd29ya2Fyb3VuZDsKKwllbHNlCisJCW5pYy0+ZmxhZ3MgJj0gfmljaF8xMGhfd29ya2Fyb3VuZDsKKworCW1vZF90aW1lcigmbmljLT53YXRjaGRvZywgamlmZmllcyArIEUxMDBfV0FUQ0hET0dfUEVSSU9EKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGUxMDBfeG1pdF9wcmVwYXJlKHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IGNiICpjYiwKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWNiLT5jb21tYW5kID0gbmljLT50eF9jb21tYW5kOworCWNiLT51LnRjYi50YmRfYXJyYXkgPSBjYi0+ZG1hX2FkZHIgKyBvZmZzZXRvZihzdHJ1Y3QgY2IsIHUudGNiLnRiZCk7CisJY2ItPnUudGNiLnRjYl9ieXRlX2NvdW50ID0gMDsKKwljYi0+dS50Y2IudGhyZXNob2xkID0gbmljLT50eF90aHJlc2hvbGQ7CisJY2ItPnUudGNiLnRiZF9jb3VudCA9IDE7CisJY2ItPnUudGNiLnRiZC5idWZfYWRkciA9IGNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKG5pYy0+cGRldiwKKwkJc2tiLT5kYXRhLCBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSkpOworCWNiLT51LnRjYi50YmQuc2l6ZSA9IGNwdV90b19sZTE2KHNrYi0+bGVuKTsKK30KKworc3RhdGljIGludCBlMTAwX3htaXRfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBlcnI7CisKKwlpZihuaWMtPmZsYWdzICYgaWNoXzEwaF93b3JrYXJvdW5kKSB7CisJCS8qIFNXIHdvcmthcm91bmQgZm9yIElDSFt4XSAxME1icHMvaGFsZiBkdXBsZXggVHggaGFuZy4KKwkJICAgSXNzdWUgYSBOT1AgY29tbWFuZCBmb2xsb3dlZCBieSBhIDF1cyBkZWxheSBiZWZvcmUKKwkJICAgaXNzdWluZyB0aGUgVHggY29tbWFuZC4gKi8KKwkJZTEwMF9leGVjX2NtZChuaWMsIGN1Y19ub3AsIDApOworCQl1ZGVsYXkoMSk7CisJfQorCisJZXJyID0gZTEwMF9leGVjX2NiKG5pYywgc2tiLCBlMTAwX3htaXRfcHJlcGFyZSk7CisKKwlzd2l0Y2goZXJyKSB7CisJY2FzZSAtRU5PU1BDOgorCQkvKiBXZSBxdWV1ZWQgdGhlIHNrYiwgYnV0IG5vdyB3ZSdyZSBvdXQgb2Ygc3BhY2UuICovCisJCURQUklOVEsoVFhfRVJSLCBERUJVRywgIk5vIHNwYWNlIGZvciBDQlxuIik7CisJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwkJYnJlYWs7CisJY2FzZSAtRU5PTUVNOgorCQkvKiBUaGlzIGlzIGEgaGFyZCBlcnJvciAtIGxvZyBpdC4gKi8KKwkJRFBSSU5USyhUWF9FUlIsIERFQlVHLCAiT3V0IG9mIFR4IHJlc291cmNlcywgcmV0dXJuaW5nIHNrYlxuIik7CisJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwkJcmV0dXJuIDE7CisJfQorCisJbmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGUxMDBfdHhfY2xlYW4oc3RydWN0IG5pYyAqbmljKQoreworCXN0cnVjdCBjYiAqY2I7CisJaW50IHR4X2NsZWFuZWQgPSAwOworCisJc3Bpbl9sb2NrKCZuaWMtPmNiX2xvY2spOworCisJRFBSSU5USyhUWF9ET05FLCBERUJVRywgImNiLT5zdGF0dXMgPSAweCUwNFhcbiIsCisJCW5pYy0+Y2JfdG9fY2xlYW4tPnN0YXR1cyk7CisKKwkvKiBDbGVhbiBDQnMgbWFya2VkIGNvbXBsZXRlICovCisJZm9yKGNiID0gbmljLT5jYl90b19jbGVhbjsKKwkgICAgY2ItPnN0YXR1cyAmIGNwdV90b19sZTE2KGNiX2NvbXBsZXRlKTsKKwkgICAgY2IgPSBuaWMtPmNiX3RvX2NsZWFuID0gY2ItPm5leHQpIHsKKwkJaWYobGlrZWx5KGNiLT5za2IgIT0gTlVMTCkpIHsKKwkJCW5pYy0+bmV0X3N0YXRzLnR4X3BhY2tldHMrKzsKKwkJCW5pYy0+bmV0X3N0YXRzLnR4X2J5dGVzICs9IGNiLT5za2ItPmxlbjsKKworCQkJcGNpX3VubWFwX3NpbmdsZShuaWMtPnBkZXYsCisJCQkJbGUzMl90b19jcHUoY2ItPnUudGNiLnRiZC5idWZfYWRkciksCisJCQkJbGUxNl90b19jcHUoY2ItPnUudGNiLnRiZC5zaXplKSwKKwkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KGNiLT5za2IpOworCQkJY2ItPnNrYiA9IE5VTEw7CisJCQl0eF9jbGVhbmVkID0gMTsKKwkJfQorCQljYi0+c3RhdHVzID0gMDsKKwkJbmljLT5jYnNfYXZhaWwrKzsKKwl9CisKKwlzcGluX3VubG9jaygmbmljLT5jYl9sb2NrKTsKKworCS8qIFJlY292ZXIgZnJvbSBydW5uaW5nIG91dCBvZiBUeCByZXNvdXJjZXMgaW4geG1pdF9mcmFtZSAqLworCWlmKHVubGlrZWx5KHR4X2NsZWFuZWQgJiYgbmV0aWZfcXVldWVfc3RvcHBlZChuaWMtPm5ldGRldikpKQorCQluZXRpZl93YWtlX3F1ZXVlKG5pYy0+bmV0ZGV2KTsKKworCXJldHVybiB0eF9jbGVhbmVkOworfQorCitzdGF0aWMgdm9pZCBlMTAwX2NsZWFuX2NicyhzdHJ1Y3QgbmljICpuaWMpCit7CisJaWYobmljLT5jYnMpIHsKKwkJd2hpbGUobmljLT5jYnNfYXZhaWwgIT0gbmljLT5wYXJhbXMuY2JzLmNvdW50KSB7CisJCQlzdHJ1Y3QgY2IgKmNiID0gbmljLT5jYl90b19jbGVhbjsKKwkJCWlmKGNiLT5za2IpIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwKKwkJCQkJbGUzMl90b19jcHUoY2ItPnUudGNiLnRiZC5idWZfYWRkciksCisJCQkJCWxlMTZfdG9fY3B1KGNiLT51LnRjYi50YmQuc2l6ZSksCisJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCWRldl9rZnJlZV9za2IoY2ItPnNrYik7CisJCQl9CisJCQluaWMtPmNiX3RvX2NsZWFuID0gbmljLT5jYl90b19jbGVhbi0+bmV4dDsKKwkJCW5pYy0+Y2JzX2F2YWlsKys7CisJCX0KKwkJcGNpX2ZyZWVfY29uc2lzdGVudChuaWMtPnBkZXYsCisJCQlzaXplb2Yoc3RydWN0IGNiKSAqIG5pYy0+cGFyYW1zLmNicy5jb3VudCwKKwkJCW5pYy0+Y2JzLCBuaWMtPmNic19kbWFfYWRkcik7CisJCW5pYy0+Y2JzID0gTlVMTDsKKwkJbmljLT5jYnNfYXZhaWwgPSAwOworCX0KKwluaWMtPmN1Y19jbWQgPSBjdWNfc3RhcnQ7CisJbmljLT5jYl90b191c2UgPSBuaWMtPmNiX3RvX3NlbmQgPSBuaWMtPmNiX3RvX2NsZWFuID0KKwkJbmljLT5jYnM7Cit9CisKK3N0YXRpYyBpbnQgZTEwMF9hbGxvY19jYnMoc3RydWN0IG5pYyAqbmljKQoreworCXN0cnVjdCBjYiAqY2I7CisJdW5zaWduZWQgaW50IGksIGNvdW50ID0gbmljLT5wYXJhbXMuY2JzLmNvdW50OworCisJbmljLT5jdWNfY21kID0gY3VjX3N0YXJ0OworCW5pYy0+Y2JfdG9fdXNlID0gbmljLT5jYl90b19zZW5kID0gbmljLT5jYl90b19jbGVhbiA9IE5VTEw7CisJbmljLT5jYnNfYXZhaWwgPSAwOworCisJbmljLT5jYnMgPSBwY2lfYWxsb2NfY29uc2lzdGVudChuaWMtPnBkZXYsCisJCXNpemVvZihzdHJ1Y3QgY2IpICogY291bnQsICZuaWMtPmNic19kbWFfYWRkcik7CisJaWYoIW5pYy0+Y2JzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvcihjYiA9IG5pYy0+Y2JzLCBpID0gMDsgaSA8IGNvdW50OyBjYisrLCBpKyspIHsKKwkJY2ItPm5leHQgPSAoaSArIDEgPCBjb3VudCkgPyBjYiArIDEgOiBuaWMtPmNiczsKKwkJY2ItPnByZXYgPSAoaSA9PSAwKSA/IG5pYy0+Y2JzICsgY291bnQgLSAxIDogY2IgLSAxOworCisJCWNiLT5kbWFfYWRkciA9IG5pYy0+Y2JzX2RtYV9hZGRyICsgaSAqIHNpemVvZihzdHJ1Y3QgY2IpOworCQljYi0+bGluayA9IGNwdV90b19sZTMyKG5pYy0+Y2JzX2RtYV9hZGRyICsKKwkJCSgoaSsxKSAlIGNvdW50KSAqIHNpemVvZihzdHJ1Y3QgY2IpKTsKKwkJY2ItPnNrYiA9IE5VTEw7CisJfQorCisJbmljLT5jYl90b191c2UgPSBuaWMtPmNiX3RvX3NlbmQgPSBuaWMtPmNiX3RvX2NsZWFuID0gbmljLT5jYnM7CisJbmljLT5jYnNfYXZhaWwgPSBjb3VudDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZTEwMF9zdGFydF9yZWNlaXZlcihzdHJ1Y3QgbmljICpuaWMpCit7CisJLyogKFJlKXN0YXJ0IFJVIGlmIHN1c3BlbmRlZCBvciBpZGxlIGFuZCBSRkEgaXMgbm9uLU5VTEwgKi8KKwlpZighbmljLT5ydV9ydW5uaW5nICYmIG5pYy0+cnhfdG9fY2xlYW4tPnNrYikgeworCQllMTAwX2V4ZWNfY21kKG5pYywgcnVjX3N0YXJ0LCBuaWMtPnJ4X3RvX2NsZWFuLT5kbWFfYWRkcik7CisJCW5pYy0+cnVfcnVubmluZyA9IDE7CisJfQorfQorCisjZGVmaW5lIFJGRF9CVUZfTEVOIChzaXplb2Yoc3RydWN0IHJmZCkgKyBWTEFOX0VUSF9GUkFNRV9MRU4pCitzdGF0aWMgaW5saW5lIGludCBlMTAwX3J4X2FsbG9jX3NrYihzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCByeCAqcngpCit7CisJaWYoIShyeC0+c2tiID0gZGV2X2FsbG9jX3NrYihSRkRfQlVGX0xFTiArIE5FVF9JUF9BTElHTikpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEFsaWduLCBpbml0LCBhbmQgbWFwIHRoZSBSRkQuICovCisJcngtPnNrYi0+ZGV2ID0gbmljLT5uZXRkZXY7CisJc2tiX3Jlc2VydmUocngtPnNrYiwgTkVUX0lQX0FMSUdOKTsKKwltZW1jcHkocngtPnNrYi0+ZGF0YSwgJm5pYy0+YmxhbmtfcmZkLCBzaXplb2Yoc3RydWN0IHJmZCkpOworCXJ4LT5kbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKG5pYy0+cGRldiwgcngtPnNrYi0+ZGF0YSwKKwkJUkZEX0JVRl9MRU4sIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisKKwkvKiBMaW5rIHRoZSBSRkQgdG8gZW5kIG9mIFJGQSBieSBsaW5raW5nIHByZXZpb3VzIFJGRCB0bworCSAqIHRoaXMgb25lLCBhbmQgY2xlYXJpbmcgRUwgYml0IG9mIHByZXZpb3VzLiAgKi8KKwlpZihyeC0+cHJldi0+c2tiKSB7CisJCXN0cnVjdCByZmQgKnByZXZfcmZkID0gKHN0cnVjdCByZmQgKilyeC0+cHJldi0+c2tiLT5kYXRhOworCQlwdXRfdW5hbGlnbmVkKGNwdV90b19sZTMyKHJ4LT5kbWFfYWRkciksCisJCQkodTMyICopJnByZXZfcmZkLT5saW5rKTsKKwkJd21iKCk7CisJCXByZXZfcmZkLT5jb21tYW5kICY9IH5jcHVfdG9fbGUxNihjYl9lbCk7CisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShuaWMtPnBkZXYsIHJ4LT5wcmV2LT5kbWFfYWRkciwKKwkJCXNpemVvZihzdHJ1Y3QgcmZkKSwgUENJX0RNQV9UT0RFVklDRSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGUxMDBfcnhfaW5kaWNhdGUoc3RydWN0IG5pYyAqbmljLCBzdHJ1Y3QgcnggKnJ4LAorCXVuc2lnbmVkIGludCAqd29ya19kb25lLCB1bnNpZ25lZCBpbnQgd29ya190b19kbykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcngtPnNrYjsKKwlzdHJ1Y3QgcmZkICpyZmQgPSAoc3RydWN0IHJmZCAqKXNrYi0+ZGF0YTsKKwl1MTYgcmZkX3N0YXR1cywgYWN0dWFsX3NpemU7CisKKwlpZih1bmxpa2VseSh3b3JrX2RvbmUgJiYgKndvcmtfZG9uZSA+PSB3b3JrX3RvX2RvKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwkvKiBOZWVkIHRvIHN5bmMgYmVmb3JlIHRha2luZyBhIHBlZWsgYXQgY2JfY29tcGxldGUgYml0ICovCisJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KG5pYy0+cGRldiwgcngtPmRtYV9hZGRyLAorCQlzaXplb2Yoc3RydWN0IHJmZCksIFBDSV9ETUFfRlJPTURFVklDRSk7CisJcmZkX3N0YXR1cyA9IGxlMTZfdG9fY3B1KHJmZC0+c3RhdHVzKTsKKworCURQUklOVEsoUlhfU1RBVFVTLCBERUJVRywgInN0YXR1cz0weCUwNFhcbiIsIHJmZF9zdGF0dXMpOworCisJLyogSWYgZGF0YSBpc24ndCByZWFkeSwgbm90aGluZyB0byBpbmRpY2F0ZSAqLworCWlmKHVubGlrZWx5KCEocmZkX3N0YXR1cyAmIGNiX2NvbXBsZXRlKSkpCisJCXJldHVybiAtRUFHQUlOOworCisJLyogR2V0IGFjdHVhbCBkYXRhIHNpemUgKi8KKwlhY3R1YWxfc2l6ZSA9IGxlMTZfdG9fY3B1KHJmZC0+YWN0dWFsX3NpemUpICYgMHgzRkZGOworCWlmKHVubGlrZWx5KGFjdHVhbF9zaXplID4gUkZEX0JVRl9MRU4gLSBzaXplb2Yoc3RydWN0IHJmZCkpKQorCQlhY3R1YWxfc2l6ZSA9IFJGRF9CVUZfTEVOIC0gc2l6ZW9mKHN0cnVjdCByZmQpOworCisJLyogR2V0IGRhdGEgKi8KKwlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwgcngtPmRtYV9hZGRyLAorCQlSRkRfQlVGX0xFTiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCS8qIFB1bGwgb2ZmIHRoZSBSRkQgYW5kIHB1dCB0aGUgYWN0dWFsIGRhdGEgKG1pbnVzIGV0aCBoZHIpICovCisJc2tiX3Jlc2VydmUoc2tiLCBzaXplb2Yoc3RydWN0IHJmZCkpOworCXNrYl9wdXQoc2tiLCBhY3R1YWxfc2l6ZSk7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmljLT5uZXRkZXYpOworCisJaWYodW5saWtlbHkoIShyZmRfc3RhdHVzICYgY2Jfb2spKSkgeworCQkvKiBEb24ndCBpbmRpY2F0ZSBpZiBoYXJkd2FyZSBpbmRpY2F0ZXMgZXJyb3JzICovCisJCW5pYy0+bmV0X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwl9IGVsc2UgaWYoYWN0dWFsX3NpemUgPiBuaWMtPm5ldGRldi0+bXR1ICsgVkxBTl9FVEhfSExFTikgeworCQkvKiBEb24ndCBpbmRpY2F0ZSBvdmVyc2l6ZWQgZnJhbWVzICovCisJCW5pYy0+cnhfb3Zlcl9sZW5ndGhfZXJyb3JzKys7CisJCW5pYy0+bmV0X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwl9IGVsc2UgeworCQluaWMtPm5ldF9zdGF0cy5yeF9wYWNrZXRzKys7CisJCW5pYy0+bmV0X3N0YXRzLnJ4X2J5dGVzICs9IGFjdHVhbF9zaXplOworCQluaWMtPm5ldGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisJCWlmKHdvcmtfZG9uZSkKKwkJCSgqd29ya19kb25lKSsrOworCX0KKworCXJ4LT5za2IgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlMTAwX3J4X2NsZWFuKHN0cnVjdCBuaWMgKm5pYywgdW5zaWduZWQgaW50ICp3b3JrX2RvbmUsCisJdW5zaWduZWQgaW50IHdvcmtfdG9fZG8pCit7CisJc3RydWN0IHJ4ICpyeDsKKworCS8qIEluZGljYXRlIG5ld2x5IGFycml2ZWQgcGFja2V0cyAqLworCWZvcihyeCA9IG5pYy0+cnhfdG9fY2xlYW47IHJ4LT5za2I7IHJ4ID0gbmljLT5yeF90b19jbGVhbiA9IHJ4LT5uZXh0KSB7CisJCWlmKGUxMDBfcnhfaW5kaWNhdGUobmljLCByeCwgd29ya19kb25lLCB3b3JrX3RvX2RvKSkKKwkJCWJyZWFrOyAvKiBObyBtb3JlIHRvIGNsZWFuICovCisJfQorCisJLyogQWxsb2MgbmV3IHNrYnMgdG8gcmVmaWxsIGxpc3QgKi8KKwlmb3IocnggPSBuaWMtPnJ4X3RvX3VzZTsgIXJ4LT5za2I7IHJ4ID0gbmljLT5yeF90b191c2UgPSByeC0+bmV4dCkgeworCQlpZih1bmxpa2VseShlMTAwX3J4X2FsbG9jX3NrYihuaWMsIHJ4KSkpCisJCQlicmVhazsgLyogQmV0dGVyIGx1Y2sgbmV4dCB0aW1lIChzZWUgd2F0Y2hkb2cpICovCisJfQorCisJZTEwMF9zdGFydF9yZWNlaXZlcihuaWMpOworfQorCitzdGF0aWMgdm9pZCBlMTAwX3J4X2NsZWFuX2xpc3Qoc3RydWN0IG5pYyAqbmljKQoreworCXN0cnVjdCByeCAqcng7CisJdW5zaWduZWQgaW50IGksIGNvdW50ID0gbmljLT5wYXJhbXMucmZkcy5jb3VudDsKKworCWlmKG5pYy0+cnhzKSB7CisJCWZvcihyeCA9IG5pYy0+cnhzLCBpID0gMDsgaSA8IGNvdW50OyByeCsrLCBpKyspIHsKKwkJCWlmKHJ4LT5za2IpIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwgcngtPmRtYV9hZGRyLAorCQkJCQlSRkRfQlVGX0xFTiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlkZXZfa2ZyZWVfc2tiKHJ4LT5za2IpOworCQkJfQorCQl9CisJCWtmcmVlKG5pYy0+cnhzKTsKKwkJbmljLT5yeHMgPSBOVUxMOworCX0KKworCW5pYy0+cnhfdG9fdXNlID0gbmljLT5yeF90b19jbGVhbiA9IE5VTEw7CisJbmljLT5ydV9ydW5uaW5nID0gMDsKK30KKworc3RhdGljIGludCBlMTAwX3J4X2FsbG9jX2xpc3Qoc3RydWN0IG5pYyAqbmljKQoreworCXN0cnVjdCByeCAqcng7CisJdW5zaWduZWQgaW50IGksIGNvdW50ID0gbmljLT5wYXJhbXMucmZkcy5jb3VudDsKKworCW5pYy0+cnhfdG9fdXNlID0gbmljLT5yeF90b19jbGVhbiA9IE5VTEw7CisKKwlpZighKG5pYy0+cnhzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJ4KSAqIGNvdW50LCBHRlBfQVRPTUlDKSkpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChuaWMtPnJ4cywgMCwgc2l6ZW9mKHN0cnVjdCByeCkgKiBjb3VudCk7CisKKwlmb3IocnggPSBuaWMtPnJ4cywgaSA9IDA7IGkgPCBjb3VudDsgcngrKywgaSsrKSB7CisJCXJ4LT5uZXh0ID0gKGkgKyAxIDwgY291bnQpID8gcnggKyAxIDogbmljLT5yeHM7CisJCXJ4LT5wcmV2ID0gKGkgPT0gMCkgPyBuaWMtPnJ4cyArIGNvdW50IC0gMSA6IHJ4IC0gMTsKKwkJaWYoZTEwMF9yeF9hbGxvY19za2IobmljLCByeCkpIHsKKwkJCWUxMDBfcnhfY2xlYW5fbGlzdChuaWMpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwluaWMtPnJ4X3RvX3VzZSA9IG5pYy0+cnhfdG9fY2xlYW4gPSBuaWMtPnJ4czsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZTEwMF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXU4IHN0YXRfYWNrID0gcmVhZGIoJm5pYy0+Y3NyLT5zY2Iuc3RhdF9hY2spOworCisJRFBSSU5USyhJTlRSLCBERUJVRywgInN0YXRfYWNrID0gMHglMDJYXG4iLCBzdGF0X2Fjayk7CisKKwlpZihzdGF0X2FjayA9PSBzdGF0X2Fja19ub3Rfb3VycyB8fAkvKiBOb3Qgb3VyIGludGVycnVwdCAqLworCSAgIHN0YXRfYWNrID09IHN0YXRfYWNrX25vdF9wcmVzZW50KQkvKiBIYXJkd2FyZSBpcyBlamVjdGVkICovCisJCXJldHVybiBJUlFfTk9ORTsKKworCS8qIEFjayBpbnRlcnJ1cHQocykgKi8KKwl3cml0ZWIoc3RhdF9hY2ssICZuaWMtPmNzci0+c2NiLnN0YXRfYWNrKTsKKworCS8qIFdlIGhpdCBSZWNlaXZlIE5vIFJlc291cmNlIChSTlIpOyByZXN0YXJ0IFJVIGFmdGVyIGNsZWFuaW5nICovCisJaWYoc3RhdF9hY2sgJiBzdGF0X2Fja19ybnIpCisJCW5pYy0+cnVfcnVubmluZyA9IDA7CisKKwllMTAwX2Rpc2FibGVfaXJxKG5pYyk7CisJbmV0aWZfcnhfc2NoZWR1bGUobmV0ZGV2KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBlMTAwX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50ICpidWRnZXQpCit7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1bnNpZ25lZCBpbnQgd29ya190b19kbyA9IG1pbihuZXRkZXYtPnF1b3RhLCAqYnVkZ2V0KTsKKwl1bnNpZ25lZCBpbnQgd29ya19kb25lID0gMDsKKwlpbnQgdHhfY2xlYW5lZDsKKworCWUxMDBfcnhfY2xlYW4obmljLCAmd29ya19kb25lLCB3b3JrX3RvX2RvKTsKKwl0eF9jbGVhbmVkID0gZTEwMF90eF9jbGVhbihuaWMpOworCisJLyogSWYgbm8gUnggYW5kIFR4IGNsZWFudXAgd29yayB3YXMgZG9uZSwgZXhpdCBwb2xsaW5nIG1vZGUuICovCisJaWYoKCF0eF9jbGVhbmVkICYmICh3b3JrX2RvbmUgPT0gMCkpIHx8ICFuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKKwkJbmV0aWZfcnhfY29tcGxldGUobmV0ZGV2KTsKKwkJZTEwMF9lbmFibGVfaXJxKG5pYyk7CisJCXJldHVybiAwOworCX0KKworCSpidWRnZXQgLT0gd29ya19kb25lOworCW5ldGRldi0+cXVvdGEgLT0gd29ya19kb25lOworCisJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgZTEwMF9uZXRwb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwllMTAwX2Rpc2FibGVfaXJxKG5pYyk7CisJZTEwMF9pbnRyKG5pYy0+cGRldi0+aXJxLCBuZXRkZXYsIE5VTEwpOworCWUxMDBfdHhfY2xlYW4obmljKTsKKwllMTAwX2VuYWJsZV9pcnEobmljKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmUxMDBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlyZXR1cm4gJm5pYy0+bmV0X3N0YXRzOworfQorCitzdGF0aWMgaW50IGUxMDBfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHZvaWQgKnApCit7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKQorCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisKKwltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgbmV0ZGV2LT5hZGRyX2xlbik7CisJZTEwMF9leGVjX2NiKG5pYywgTlVMTCwgZTEwMF9zZXR1cF9pYWFkZHIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZTEwMF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBuZXdfbXR1KQoreworCWlmKG5ld19tdHUgPCBFVEhfWkxFTiB8fCBuZXdfbXR1ID4gRVRIX0RBVEFfTEVOKQorCQlyZXR1cm4gLUVJTlZBTDsKKwluZXRkZXYtPm10dSA9IG5ld19tdHU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZTEwMF9hc2Yoc3RydWN0IG5pYyAqbmljKQoreworCS8qIEFTRiBjYW4gYmUgZW5hYmxlZCBmcm9tIGVlcHJvbSAqLworCXJldHVybigobmljLT5wZGV2LT5kZXZpY2UgPj0gMHgxMDUwKSAmJiAobmljLT5wZGV2LT5kZXZpY2UgPD0gMHgxMDU3KSAmJgorCSAgIChuaWMtPmVlcHJvbVtlZXByb21fY29uZmlnX2FzZl0gJiBlZXByb21fYXNmKSAmJgorCSAgICEobmljLT5lZXByb21bZWVwcm9tX2NvbmZpZ19hc2ZdICYgZWVwcm9tX2djbCkgJiYKKwkgICAoKG5pYy0+ZWVwcm9tW2VlcHJvbV9zbWJ1c19hZGRyXSAmIDB4RkYpICE9IDB4RkUpKTsKK30KKworc3RhdGljIGludCBlMTAwX3VwKHN0cnVjdCBuaWMgKm5pYykKK3sKKwlpbnQgZXJyOworCisJaWYoKGVyciA9IGUxMDBfcnhfYWxsb2NfbGlzdChuaWMpKSkKKwkJcmV0dXJuIGVycjsKKwlpZigoZXJyID0gZTEwMF9hbGxvY19jYnMobmljKSkpCisJCWdvdG8gZXJyX3J4X2NsZWFuX2xpc3Q7CisJaWYoKGVyciA9IGUxMDBfaHdfaW5pdChuaWMpKSkKKwkJZ290byBlcnJfY2xlYW5fY2JzOworCWUxMDBfc2V0X211bHRpY2FzdF9saXN0KG5pYy0+bmV0ZGV2KTsKKwllMTAwX3N0YXJ0X3JlY2VpdmVyKG5pYyk7CisJbW9kX3RpbWVyKCZuaWMtPndhdGNoZG9nLCBqaWZmaWVzKTsKKwlpZigoZXJyID0gcmVxdWVzdF9pcnEobmljLT5wZGV2LT5pcnEsIGUxMDBfaW50ciwgU0FfU0hJUlEsCisJCW5pYy0+bmV0ZGV2LT5uYW1lLCBuaWMtPm5ldGRldikpKQorCQlnb3RvIGVycl9ub19pcnE7CisJZTEwMF9lbmFibGVfaXJxKG5pYyk7CisJbmV0aWZfd2FrZV9xdWV1ZShuaWMtPm5ldGRldik7CisJcmV0dXJuIDA7CisKK2Vycl9ub19pcnE6CisJZGVsX3RpbWVyX3N5bmMoJm5pYy0+d2F0Y2hkb2cpOworZXJyX2NsZWFuX2NiczoKKwllMTAwX2NsZWFuX2NicyhuaWMpOworZXJyX3J4X2NsZWFuX2xpc3Q6CisJZTEwMF9yeF9jbGVhbl9saXN0KG5pYyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgZTEwMF9kb3duKHN0cnVjdCBuaWMgKm5pYykKK3sKKwllMTAwX2h3X3Jlc2V0KG5pYyk7CisJZnJlZV9pcnEobmljLT5wZGV2LT5pcnEsIG5pYy0+bmV0ZGV2KTsKKwlkZWxfdGltZXJfc3luYygmbmljLT53YXRjaGRvZyk7CisJbmV0aWZfY2Fycmllcl9vZmYobmljLT5uZXRkZXYpOworCW5ldGlmX3N0b3BfcXVldWUobmljLT5uZXRkZXYpOworCWUxMDBfY2xlYW5fY2JzKG5pYyk7CisJZTEwMF9yeF9jbGVhbl9saXN0KG5pYyk7Cit9CisKK3N0YXRpYyB2b2lkIGUxMDBfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlEUFJJTlRLKFRYX0VSUiwgREVCVUcsICJzY2Iuc3RhdHVzPTB4JTAyWFxuIiwKKwkJcmVhZGIoJm5pYy0+Y3NyLT5zY2Iuc3RhdHVzKSk7CisJZTEwMF9kb3duKG5ldGRldl9wcml2KG5ldGRldikpOworCWUxMDBfdXAobmV0ZGV2X3ByaXYobmV0ZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgZTEwMF9sb29wYmFja190ZXN0KHN0cnVjdCBuaWMgKm5pYywgZW51bSBsb29wYmFjayBsb29wYmFja19tb2RlKQoreworCWludCBlcnI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCS8qIFVzZSBkcml2ZXIgcmVzb3VyY2VzIHRvIHBlcmZvcm0gaW50ZXJuYWwgTUFDIG9yIFBIWQorCSAqIGxvb3BiYWNrIHRlc3QuICBBIHNpbmdsZSBwYWNrZXQgaXMgcHJlcGFyZWQgYW5kIHRyYW5zbWl0dGVkCisJICogaW4gbG9vcGJhY2sgbW9kZSwgYW5kIHRoZSB0ZXN0IHBhc3NlcyBpZiB0aGUgcmVjZWl2ZWQKKwkgKiBwYWNrZXQgY29tcGFyZXMgYnl0ZS1mb3ItYnl0ZSB0byB0aGUgdHJhbnNtaXR0ZWQgcGFja2V0LiAqLworCisJaWYoKGVyciA9IGUxMDBfcnhfYWxsb2NfbGlzdChuaWMpKSkKKwkJcmV0dXJuIGVycjsKKwlpZigoZXJyID0gZTEwMF9hbGxvY19jYnMobmljKSkpCisJCWdvdG8gZXJyX2NsZWFuX3J4OworCisJLyogSUNIIFBIWSBsb29wYmFjayBpcyBicm9rZW4gc28gZG8gTUFDIGxvb3BiYWNrIGluc3RlYWQgKi8KKwlpZihuaWMtPmZsYWdzICYgaWNoICYmIGxvb3BiYWNrX21vZGUgPT0gbGJfcGh5KQorCQlsb29wYmFja19tb2RlID0gbGJfbWFjOworCisJbmljLT5sb29wYmFjayA9IGxvb3BiYWNrX21vZGU7CisJaWYoKGVyciA9IGUxMDBfaHdfaW5pdChuaWMpKSkKKwkJZ290byBlcnJfbG9vcGJhY2tfbm9uZTsKKworCWlmKGxvb3BiYWNrX21vZGUgPT0gbGJfcGh5KQorCQltZGlvX3dyaXRlKG5pYy0+bmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIE1JSV9CTUNSLAorCQkJQk1DUl9MT09QQkFDSyk7CisKKwllMTAwX3N0YXJ0X3JlY2VpdmVyKG5pYyk7CisKKwlpZighKHNrYiA9IGRldl9hbGxvY19za2IoRVRIX0RBVEFfTEVOKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfbG9vcGJhY2tfbm9uZTsKKwl9CisJc2tiX3B1dChza2IsIEVUSF9EQVRBX0xFTik7CisJbWVtc2V0KHNrYi0+ZGF0YSwgMHhGRiwgRVRIX0RBVEFfTEVOKTsKKwllMTAwX3htaXRfZnJhbWUoc2tiLCBuaWMtPm5ldGRldik7CisKKwltc2xlZXAoMTApOworCisJaWYobWVtY21wKG5pYy0+cnhfdG9fY2xlYW4tPnNrYi0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgcmZkKSwKKwkgICBza2ItPmRhdGEsIEVUSF9EQVRBX0xFTikpCisJCWVyciA9IC1FQUdBSU47CisKK2Vycl9sb29wYmFja19ub25lOgorCW1kaW9fd3JpdGUobmljLT5uZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX0JNQ1IsIDApOworCW5pYy0+bG9vcGJhY2sgPSBsYl9ub25lOworCWUxMDBfaHdfaW5pdChuaWMpOworCWUxMDBfY2xlYW5fY2JzKG5pYyk7CitlcnJfY2xlYW5fcng6CisJZTEwMF9yeF9jbGVhbl9saXN0KG5pYyk7CisJcmV0dXJuIGVycjsKK30KKworI2RlZmluZSBNSUlfTEVEX0NPTlRST0wJMHgxQgorc3RhdGljIHZvaWQgZTEwMF9ibGlua19sZWQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuaWMgKm5pYyA9IChzdHJ1Y3QgbmljICopZGF0YTsKKwllbnVtIGxlZF9zdGF0ZSB7CisJCWxlZF9vbiAgICAgPSAweDAxLAorCQlsZWRfb2ZmICAgID0gMHgwNCwKKwkJbGVkX29uXzU1OSA9IDB4MDUsCisJCWxlZF9vbl81NTcgPSAweDA3LAorCX07CisKKwluaWMtPmxlZHMgPSAobmljLT5sZWRzICYgbGVkX29uKSA/IGxlZF9vZmYgOgorCQkobmljLT5tYWMgPCBtYWNfODI1NTlfRDEwMU0pID8gbGVkX29uXzU1NyA6IGxlZF9vbl81NTk7CisJbWRpb193cml0ZShuaWMtPm5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfTEVEX0NPTlRST0wsIG5pYy0+bGVkcyk7CisJbW9kX3RpbWVyKCZuaWMtPmJsaW5rX3RpbWVyLCBqaWZmaWVzICsgSFogLyA0KTsKK30KKworc3RhdGljIGludCBlMTAwX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXJldHVybiBtaWlfZXRodG9vbF9nc2V0KCZuaWMtPm1paSwgY21kKTsKK30KKworc3RhdGljIGludCBlMTAwX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBlcnI7CisKKwltZGlvX3dyaXRlKG5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7CisJZXJyID0gbWlpX2V0aHRvb2xfc3NldCgmbmljLT5taWksIGNtZCk7CisJZTEwMF9leGVjX2NiKG5pYywgTlVMTCwgZTEwMF9jb25maWd1cmUpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgZTEwMF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCXN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzdHJjcHkoaW5mby0+ZndfdmVyc2lvbiwgIk4vQSIpOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobmljLT5wZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgZTEwMF9nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworI2RlZmluZSBFMTAwX1BIWV9SRUdTCQkweDFDCisjZGVmaW5lIEUxMDBfUkVHU19MRU4JCTEgKyBFMTAwX1BIWV9SRUdTICsgXAorCXNpemVvZihuaWMtPm1lbS0+ZHVtcF9idWYpIC8gc2l6ZW9mKHUzMikKKwlyZXR1cm4gRTEwMF9SRUdTX0xFTiAqIHNpemVvZih1MzIpOworfQorCitzdGF0aWMgdm9pZCBlMTAwX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXUzMiAqYnVmZiA9IHA7CisJaW50IGk7CisKKwlyZWdzLT52ZXJzaW9uID0gKDEgPDwgMjQpIHwgbmljLT5yZXZfaWQ7CisJYnVmZlswXSA9IHJlYWRiKCZuaWMtPmNzci0+c2NiLmNtZF9oaSkgPDwgMjQgfAorCQlyZWFkYigmbmljLT5jc3ItPnNjYi5jbWRfbG8pIDw8IDE2IHwKKwkJcmVhZHcoJm5pYy0+Y3NyLT5zY2Iuc3RhdHVzKTsKKwlmb3IoaSA9IEUxMDBfUEhZX1JFR1M7IGkgPj0gMDsgaS0tKQorCQlidWZmWzEgKyBFMTAwX1BIWV9SRUdTIC0gaV0gPQorCQkJbWRpb19yZWFkKG5ldGRldiwgbmljLT5taWkucGh5X2lkLCBpKTsKKwltZW1zZXQobmljLT5tZW0tPmR1bXBfYnVmLCAwLCBzaXplb2YobmljLT5tZW0tPmR1bXBfYnVmKSk7CisJZTEwMF9leGVjX2NiKG5pYywgTlVMTCwgZTEwMF9kdW1wKTsKKwltc2xlZXAoMTApOworCW1lbWNweSgmYnVmZlsyICsgRTEwMF9QSFlfUkVHU10sIG5pYy0+bWVtLT5kdW1wX2J1ZiwKKwkJc2l6ZW9mKG5pYy0+bWVtLT5kdW1wX2J1ZikpOworfQorCitzdGF0aWMgdm9pZCBlMTAwX2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJd29sLT5zdXBwb3J0ZWQgPSAobmljLT5tYWMgPj0gbWFjXzgyNTU4X0QxMDFfQTQpID8gIFdBS0VfTUFHSUMgOiAwOworCXdvbC0+d29sb3B0cyA9IChuaWMtPmZsYWdzICYgd29sX21hZ2ljKSA/IFdBS0VfTUFHSUMgOiAwOworfQorCitzdGF0aWMgaW50IGUxMDBfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWlmKHdvbC0+d29sb3B0cyAhPSBXQUtFX01BR0lDICYmIHdvbC0+d29sb3B0cyAhPSAwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZih3b2wtPndvbG9wdHMpCisJCW5pYy0+ZmxhZ3MgfD0gd29sX21hZ2ljOworCWVsc2UKKwkJbmljLT5mbGFncyAmPSB+d29sX21hZ2ljOworCisJcGNpX2VuYWJsZV93YWtlKG5pYy0+cGRldiwgMCwgbmljLT5mbGFncyAmICh3b2xfbWFnaWMgfCBlMTAwX2FzZihuaWMpKSk7CisJZTEwMF9leGVjX2NiKG5pYywgTlVMTCwgZTEwMF9jb25maWd1cmUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgZTEwMF9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXJldHVybiBuaWMtPm1zZ19lbmFibGU7Cit9CisKK3N0YXRpYyB2b2lkIGUxMDBfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCW5pYy0+bXNnX2VuYWJsZSA9IHZhbHVlOworfQorCitzdGF0aWMgaW50IGUxMDBfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJcmV0dXJuIG1paV9ud2F5X3Jlc3RhcnQoJm5pYy0+bWlpKTsKK30KKworc3RhdGljIHUzMiBlMTAwX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlyZXR1cm4gbWlpX2xpbmtfb2soJm5pYy0+bWlpKTsKK30KKworc3RhdGljIGludCBlMTAwX2dldF9lZXByb21fbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlyZXR1cm4gbmljLT5lZXByb21fd2MgPDwgMTsKK30KKworI2RlZmluZSBFMTAwX0VFUFJPTV9NQUdJQwkweDEyMzQKK3N0YXRpYyBpbnQgZTEwMF9nZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpieXRlcykKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJZWVwcm9tLT5tYWdpYyA9IEUxMDBfRUVQUk9NX01BR0lDOworCW1lbWNweShieXRlcywgJigodTggKiluaWMtPmVlcHJvbSlbZWVwcm9tLT5vZmZzZXRdLCBlZXByb20tPmxlbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlMTAwX3NldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwlzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmJ5dGVzKQoreworCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlpZihlZXByb20tPm1hZ2ljICE9IEUxMDBfRUVQUk9NX01BR0lDKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbWNweSgmKCh1OCAqKW5pYy0+ZWVwcm9tKVtlZXByb20tPm9mZnNldF0sIGJ5dGVzLCBlZXByb20tPmxlbik7CisKKwlyZXR1cm4gZTEwMF9lZXByb21fc2F2ZShuaWMsIGVlcHJvbS0+b2Zmc2V0ID4+IDEsCisJCShlZXByb20tPmxlbiA+PiAxKSArIDEpOworfQorCitzdGF0aWMgdm9pZCBlMTAwX2dldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwlzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJpbmcpCit7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgcGFyYW1fcmFuZ2UgKnJmZHMgPSAmbmljLT5wYXJhbXMucmZkczsKKwlzdHJ1Y3QgcGFyYW1fcmFuZ2UgKmNicyA9ICZuaWMtPnBhcmFtcy5jYnM7CisKKwlyaW5nLT5yeF9tYXhfcGVuZGluZyA9IHJmZHMtPm1heDsKKwlyaW5nLT50eF9tYXhfcGVuZGluZyA9IGNicy0+bWF4OworCXJpbmctPnJ4X21pbmlfbWF4X3BlbmRpbmcgPSAwOworCXJpbmctPnJ4X2p1bWJvX21heF9wZW5kaW5nID0gMDsKKwlyaW5nLT5yeF9wZW5kaW5nID0gcmZkcy0+Y291bnQ7CisJcmluZy0+dHhfcGVuZGluZyA9IGNicy0+Y291bnQ7CisJcmluZy0+cnhfbWluaV9wZW5kaW5nID0gMDsKKwlyaW5nLT5yeF9qdW1ib19wZW5kaW5nID0gMDsKK30KKworc3RhdGljIGludCBlMTAwX3NldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwlzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJpbmcpCit7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgcGFyYW1fcmFuZ2UgKnJmZHMgPSAmbmljLT5wYXJhbXMucmZkczsKKwlzdHJ1Y3QgcGFyYW1fcmFuZ2UgKmNicyA9ICZuaWMtPnBhcmFtcy5jYnM7CisKKwlpZiAoKHJpbmctPnJ4X21pbmlfcGVuZGluZykgfHwgKHJpbmctPnJ4X2p1bWJvX3BlbmRpbmcpKSAKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZihuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCWUxMDBfZG93bihuaWMpOworCXJmZHMtPmNvdW50ID0gbWF4KHJpbmctPnJ4X3BlbmRpbmcsIHJmZHMtPm1pbik7CisJcmZkcy0+Y291bnQgPSBtaW4ocmZkcy0+Y291bnQsIHJmZHMtPm1heCk7CisJY2JzLT5jb3VudCA9IG1heChyaW5nLT50eF9wZW5kaW5nLCBjYnMtPm1pbik7CisJY2JzLT5jb3VudCA9IG1pbihjYnMtPmNvdW50LCBjYnMtPm1heCk7CisJRFBSSU5USyhEUlYsIElORk8sICJSaW5nIFBhcmFtIHNldHRpbmdzOiByeDogJWQsIHR4ICVkXG4iLAorCSAgICAgICAgcmZkcy0+Y291bnQsIGNicy0+Y291bnQpOworCWlmKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJZTEwMF91cChuaWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGUxMDBfZ3N0cmluZ3NfdGVzdFtdW0VUSF9HU1RSSU5HX0xFTl0gPSB7CisJIkxpbmsgdGVzdCAgICAgKG9uL29mZmxpbmUpIiwKKwkiRWVwcm9tIHRlc3QgICAob24vb2ZmbGluZSkiLAorCSJTZWxmIHRlc3QgICAgICAgIChvZmZsaW5lKSIsCisJIk1hYyBsb29wYmFjayAgICAgKG9mZmxpbmUpIiwKKwkiUGh5IGxvb3BiYWNrICAgICAob2ZmbGluZSkiLAorfTsKKyNkZWZpbmUgRTEwMF9URVNUX0xFTglzaXplb2YoZTEwMF9nc3RyaW5nc190ZXN0KSAvIEVUSF9HU1RSSU5HX0xFTgorCitzdGF0aWMgaW50IGUxMDBfZGlhZ190ZXN0X2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJcmV0dXJuIEUxMDBfVEVTVF9MRU47Cit9CisKK3N0YXRpYyB2b2lkIGUxMDBfZGlhZ190ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJc3RydWN0IGV0aHRvb2xfdGVzdCAqdGVzdCwgdTY0ICpkYXRhKQoreworCXN0cnVjdCBldGh0b29sX2NtZCBjbWQ7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgaSwgZXJyOworCisJbWVtc2V0KGRhdGEsIDAsIEUxMDBfVEVTVF9MRU4gKiBzaXplb2YodTY0KSk7CisJZGF0YVswXSA9ICFtaWlfbGlua19vaygmbmljLT5taWkpOworCWRhdGFbMV0gPSBlMTAwX2VlcHJvbV9sb2FkKG5pYyk7CisJaWYodGVzdC0+ZmxhZ3MgJiBFVEhfVEVTVF9GTF9PRkZMSU5FKSB7CisKKwkJLyogc2F2ZSBzcGVlZCwgZHVwbGV4ICYgYXV0b25lZyBzZXR0aW5ncyAqLworCQllcnIgPSBtaWlfZXRodG9vbF9nc2V0KCZuaWMtPm1paSwgJmNtZCk7CisKKwkJaWYobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQkJZTEwMF9kb3duKG5pYyk7CisJCWRhdGFbMl0gPSBlMTAwX3NlbGZfdGVzdChuaWMpOworCQlkYXRhWzNdID0gZTEwMF9sb29wYmFja190ZXN0KG5pYywgbGJfbWFjKTsKKwkJZGF0YVs0XSA9IGUxMDBfbG9vcGJhY2tfdGVzdChuaWMsIGxiX3BoeSk7CisKKwkJLyogcmVzdG9yZSBzcGVlZCwgZHVwbGV4ICYgYXV0b25lZyBzZXR0aW5ncyAqLworCQllcnIgPSBtaWlfZXRodG9vbF9zc2V0KCZuaWMtPm1paSwgJmNtZCk7CisKKwkJaWYobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQkJZTEwMF91cChuaWMpOworCX0KKwlmb3IoaSA9IDA7IGkgPCBFMTAwX1RFU1RfTEVOOyBpKyspCisJCXRlc3QtPmZsYWdzIHw9IGRhdGFbaV0gPyBFVEhfVEVTVF9GTF9GQUlMRUQgOiAwOworfQorCitzdGF0aWMgaW50IGUxMDBfcGh5c19pZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYoIWRhdGEgfHwgZGF0YSA+ICh1MzIpKE1BWF9TQ0hFRFVMRV9USU1FT1VUIC8gSFopKQorCQlkYXRhID0gKHUzMikoTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWik7CisJbW9kX3RpbWVyKCZuaWMtPmJsaW5rX3RpbWVyLCBqaWZmaWVzKTsKKwltc2xlZXBfaW50ZXJydXB0aWJsZShkYXRhICogMTAwMCk7CisJZGVsX3RpbWVyX3N5bmMoJm5pYy0+YmxpbmtfdGltZXIpOworCW1kaW9fd3JpdGUobmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIE1JSV9MRURfQ09OVFJPTCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgZTEwMF9nc3RyaW5nc19zdGF0c1tdW0VUSF9HU1RSSU5HX0xFTl0gPSB7CisJInJ4X3BhY2tldHMiLCAidHhfcGFja2V0cyIsICJyeF9ieXRlcyIsICJ0eF9ieXRlcyIsICJyeF9lcnJvcnMiLAorCSJ0eF9lcnJvcnMiLCAicnhfZHJvcHBlZCIsICJ0eF9kcm9wcGVkIiwgIm11bHRpY2FzdCIsICJjb2xsaXNpb25zIiwKKwkicnhfbGVuZ3RoX2Vycm9ycyIsICJyeF9vdmVyX2Vycm9ycyIsICJyeF9jcmNfZXJyb3JzIiwKKwkicnhfZnJhbWVfZXJyb3JzIiwgInJ4X2ZpZm9fZXJyb3JzIiwgInJ4X21pc3NlZF9lcnJvcnMiLAorCSJ0eF9hYm9ydGVkX2Vycm9ycyIsICJ0eF9jYXJyaWVyX2Vycm9ycyIsICJ0eF9maWZvX2Vycm9ycyIsCisJInR4X2hlYXJ0YmVhdF9lcnJvcnMiLCAidHhfd2luZG93X2Vycm9ycyIsCisJLyogZGV2aWNlLXNwZWNpZmljIHN0YXRzICovCisJInR4X2RlZmVycmVkIiwgInR4X3NpbmdsZV9jb2xsaXNpb25zIiwgInR4X211bHRpX2NvbGxpc2lvbnMiLAorCSJ0eF9mbG93X2NvbnRyb2xfcGF1c2UiLCAicnhfZmxvd19jb250cm9sX3BhdXNlIiwKKwkicnhfZmxvd19jb250cm9sX3Vuc3VwcG9ydGVkIiwgInR4X3Rjb19wYWNrZXRzIiwgInJ4X3Rjb19wYWNrZXRzIiwKK307CisjZGVmaW5lIEUxMDBfTkVUX1NUQVRTX0xFTgkyMQorI2RlZmluZSBFMTAwX1NUQVRTX0xFTglzaXplb2YoZTEwMF9nc3RyaW5nc19zdGF0cykgLyBFVEhfR1NUUklOR19MRU4KKworc3RhdGljIGludCBlMTAwX2dldF9zdGF0c19jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXJldHVybiBFMTAwX1NUQVRTX0xFTjsKK30KKworc3RhdGljIHZvaWQgZTEwMF9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCXN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywgdTY0ICpkYXRhKQoreworCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IGk7CisKKwlmb3IoaSA9IDA7IGkgPCBFMTAwX05FVF9TVEFUU19MRU47IGkrKykKKwkJZGF0YVtpXSA9ICgodW5zaWduZWQgbG9uZyAqKSZuaWMtPm5ldF9zdGF0cylbaV07CisKKwlkYXRhW2krK10gPSBuaWMtPnR4X2RlZmVycmVkOworCWRhdGFbaSsrXSA9IG5pYy0+dHhfc2luZ2xlX2NvbGxpc2lvbnM7CisJZGF0YVtpKytdID0gbmljLT50eF9tdWx0aXBsZV9jb2xsaXNpb25zOworCWRhdGFbaSsrXSA9IG5pYy0+dHhfZmNfcGF1c2U7CisJZGF0YVtpKytdID0gbmljLT5yeF9mY19wYXVzZTsKKwlkYXRhW2krK10gPSBuaWMtPnJ4X2ZjX3Vuc3VwcG9ydGVkOworCWRhdGFbaSsrXSA9IG5pYy0+dHhfdGNvX2ZyYW1lczsKKwlkYXRhW2krK10gPSBuaWMtPnJ4X3Rjb19mcmFtZXM7Cit9CisKK3N0YXRpYyB2b2lkIGUxMDBfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIHN0cmluZ3NldCwgdTggKmRhdGEpCit7CisJc3dpdGNoKHN0cmluZ3NldCkgeworCWNhc2UgRVRIX1NTX1RFU1Q6CisJCW1lbWNweShkYXRhLCAqZTEwMF9nc3RyaW5nc190ZXN0LCBzaXplb2YoZTEwMF9nc3RyaW5nc190ZXN0KSk7CisJCWJyZWFrOworCWNhc2UgRVRIX1NTX1NUQVRTOgorCQltZW1jcHkoZGF0YSwgKmUxMDBfZ3N0cmluZ3Nfc3RhdHMsIHNpemVvZihlMTAwX2dzdHJpbmdzX3N0YXRzKSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBlMTAwX2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MJCT0gZTEwMF9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSBlMTAwX3NldF9zZXR0aW5ncywKKwkuZ2V0X2RydmluZm8JCT0gZTEwMF9nZXRfZHJ2aW5mbywKKwkuZ2V0X3JlZ3NfbGVuCQk9IGUxMDBfZ2V0X3JlZ3NfbGVuLAorCS5nZXRfcmVncwkJPSBlMTAwX2dldF9yZWdzLAorCS5nZXRfd29sCQk9IGUxMDBfZ2V0X3dvbCwKKwkuc2V0X3dvbAkJPSBlMTAwX3NldF93b2wsCisJLmdldF9tc2dsZXZlbAkJPSBlMTAwX2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCQk9IGUxMDBfc2V0X21zZ2xldmVsLAorCS5ud2F5X3Jlc2V0CQk9IGUxMDBfbndheV9yZXNldCwKKwkuZ2V0X2xpbmsJCT0gZTEwMF9nZXRfbGluaywKKwkuZ2V0X2VlcHJvbV9sZW4JCT0gZTEwMF9nZXRfZWVwcm9tX2xlbiwKKwkuZ2V0X2VlcHJvbQkJPSBlMTAwX2dldF9lZXByb20sCisJLnNldF9lZXByb20JCT0gZTEwMF9zZXRfZWVwcm9tLAorCS5nZXRfcmluZ3BhcmFtCQk9IGUxMDBfZ2V0X3JpbmdwYXJhbSwKKwkuc2V0X3JpbmdwYXJhbQkJPSBlMTAwX3NldF9yaW5ncGFyYW0sCisJLnNlbGZfdGVzdF9jb3VudAk9IGUxMDBfZGlhZ190ZXN0X2NvdW50LAorCS5zZWxmX3Rlc3QJCT0gZTEwMF9kaWFnX3Rlc3QsCisJLmdldF9zdHJpbmdzCQk9IGUxMDBfZ2V0X3N0cmluZ3MsCisJLnBoeXNfaWQJCT0gZTEwMF9waHlzX2lkLAorCS5nZXRfc3RhdHNfY291bnQJPSBlMTAwX2dldF9zdGF0c19jb3VudCwKKwkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBlMTAwX2dldF9ldGh0b29sX3N0YXRzLAorfTsKKworc3RhdGljIGludCBlMTAwX2RvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlyZXR1cm4gZ2VuZXJpY19taWlfaW9jdGwoJm5pYy0+bWlpLCBpZl9taWkoaWZyKSwgY21kLCBOVUxMKTsKK30KKworc3RhdGljIGludCBlMTAwX2FsbG9jKHN0cnVjdCBuaWMgKm5pYykKK3sKKwluaWMtPm1lbSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KG5pYy0+cGRldiwgc2l6ZW9mKHN0cnVjdCBtZW0pLAorCQkmbmljLT5kbWFfYWRkcik7CisJcmV0dXJuIG5pYy0+bWVtID8gMCA6IC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIGUxMDBfZnJlZShzdHJ1Y3QgbmljICpuaWMpCit7CisJaWYobmljLT5tZW0pIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChuaWMtPnBkZXYsIHNpemVvZihzdHJ1Y3QgbWVtKSwKKwkJCW5pYy0+bWVtLCBuaWMtPmRtYV9hZGRyKTsKKwkJbmljLT5tZW0gPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBlMTAwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBlcnIgPSAwOworCisJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwlpZigoZXJyID0gZTEwMF91cChuaWMpKSkKKwkJRFBSSU5USyhJRlVQLCBFUlIsICJDYW5ub3Qgb3BlbiBpbnRlcmZhY2UsIGFib3J0aW5nLlxuIik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBlMTAwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJZTEwMF9kb3duKG5ldGRldl9wcml2KG5ldGRldikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlMTAwX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgbmljICpuaWM7CisJaW50IGVycjsKKworCWlmKCEobmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuaWMpKSkpIHsKKwkJaWYoKCgxIDw8IGRlYnVnKSAtIDEpICYgTkVUSUZfTVNHX1BST0JFKQorCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRXRoZXJkZXYgYWxsb2MgZmFpbGVkLCBhYm9ydC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwluZXRkZXYtPm9wZW4gPSBlMTAwX29wZW47CisJbmV0ZGV2LT5zdG9wID0gZTEwMF9jbG9zZTsKKwluZXRkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGUxMDBfeG1pdF9mcmFtZTsKKwluZXRkZXYtPmdldF9zdGF0cyA9IGUxMDBfZ2V0X3N0YXRzOworCW5ldGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gZTEwMF9zZXRfbXVsdGljYXN0X2xpc3Q7CisJbmV0ZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBlMTAwX3NldF9tYWNfYWRkcmVzczsKKwluZXRkZXYtPmNoYW5nZV9tdHUgPSBlMTAwX2NoYW5nZV9tdHU7CisJbmV0ZGV2LT5kb19pb2N0bCA9IGUxMDBfZG9faW9jdGw7CisJU0VUX0VUSFRPT0xfT1BTKG5ldGRldiwgJmUxMDBfZXRodG9vbF9vcHMpOworCW5ldGRldi0+dHhfdGltZW91dCA9IGUxMDBfdHhfdGltZW91dDsKKwluZXRkZXYtPndhdGNoZG9nX3RpbWVvID0gRTEwMF9XQVRDSERPR19QRVJJT0Q7CisJbmV0ZGV2LT5wb2xsID0gZTEwMF9wb2xsOworCW5ldGRldi0+d2VpZ2h0ID0gRTEwMF9OQVBJX1dFSUdIVDsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCW5ldGRldi0+cG9sbF9jb250cm9sbGVyID0gZTEwMF9uZXRwb2xsOworI2VuZGlmCisJc3RyY3B5KG5ldGRldi0+bmFtZSwgcGNpX25hbWUocGRldikpOworCisJbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwluaWMtPm5ldGRldiA9IG5ldGRldjsKKwluaWMtPnBkZXYgPSBwZGV2OworCW5pYy0+bXNnX2VuYWJsZSA9ICgxIDw8IGRlYnVnKSAtIDE7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIG5ldGRldik7CisKKwlpZigoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldikpKSB7CisJCURQUklOVEsoUFJPQkUsIEVSUiwgIkNhbm5vdCBlbmFibGUgUENJIGRldmljZSwgYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfZGV2OworCX0KKworCWlmKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApICYgSU9SRVNPVVJDRV9NRU0pKSB7CisJCURQUklOVEsoUFJPQkUsIEVSUiwgIkNhbm5vdCBmaW5kIHByb3BlciBQQ0kgZGV2aWNlICIKKwkJCSJiYXNlIGFkZHJlc3MsIGFib3J0aW5nLlxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9kaXNhYmxlX3BkZXY7CisJfQorCisJaWYoKGVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpKSkgeworCQlEUFJJTlRLKFBST0JFLCBFUlIsICJDYW5ub3Qgb2J0YWluIFBDSSByZXNvdXJjZXMsIGFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9kaXNhYmxlX3BkZXY7CisJfQorCisJaWYoKGVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhGRkZGRkZGRlVMTCkpKSB7CisJCURQUklOVEsoUFJPQkUsIEVSUiwgIk5vIHVzYWJsZSBETUEgY29uZmlndXJhdGlvbiwgYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIobmV0ZGV2KTsKKwlTRVRfTkVUREVWX0RFVihuZXRkZXYsICZwZGV2LT5kZXYpOworCisJbmljLT5jc3IgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwgc2l6ZW9mKHN0cnVjdCBjc3IpKTsKKwlpZighbmljLT5jc3IpIHsKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAiQ2Fubm90IG1hcCBkZXZpY2UgcmVnaXN0ZXJzLCBhYm9ydGluZy5cbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJfQorCisJaWYoZW50LT5kcml2ZXJfZGF0YSkKKwkJbmljLT5mbGFncyB8PSBpY2g7CisJZWxzZQorCQluaWMtPmZsYWdzICY9IH5pY2g7CisKKwllMTAwX2dldF9kZWZhdWx0cyhuaWMpOworCisJc3Bpbl9sb2NrX2luaXQoJm5pYy0+Y2JfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJm5pYy0+Y21kX2xvY2spOworCisJLyogUmVzZXQgdGhlIGRldmljZSBiZWZvcmUgcGNpX3NldF9tYXN0ZXIoKSBpbiBjYXNlIGRldmljZSBpcyBpbiBzb21lCisJICogZnVua3kgc3RhdGUgYW5kIGhhcyBhbiBpbnRlcnJ1cHQgcGVuZGluZyAtIGhpbnQ6IHdlIGRvbid0IGhhdmUgdGhlCisJICogaW50ZXJydXB0IGhhbmRsZXIgcmVnaXN0ZXJlZCB5ZXQuICovCisJZTEwMF9od19yZXNldChuaWMpOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlpbml0X3RpbWVyKCZuaWMtPndhdGNoZG9nKTsKKwluaWMtPndhdGNoZG9nLmZ1bmN0aW9uID0gZTEwMF93YXRjaGRvZzsKKwluaWMtPndhdGNoZG9nLmRhdGEgPSAodW5zaWduZWQgbG9uZyluaWM7CisJaW5pdF90aW1lcigmbmljLT5ibGlua190aW1lcik7CisJbmljLT5ibGlua190aW1lci5mdW5jdGlvbiA9IGUxMDBfYmxpbmtfbGVkOworCW5pYy0+YmxpbmtfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKW5pYzsKKworCWlmKChlcnIgPSBlMTAwX2FsbG9jKG5pYykpKSB7CisJCURQUklOVEsoUFJPQkUsIEVSUiwgIkNhbm5vdCBhbGxvYyBkcml2ZXIgbWVtb3J5LCBhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisKKwllMTAwX3BoeV9pbml0KG5pYyk7CisKKwlpZigoZXJyID0gZTEwMF9lZXByb21fbG9hZChuaWMpKSkKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisKKwltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgbmljLT5lZXByb20sIEVUSF9BTEVOKTsKKwlpZighaXNfdmFsaWRfZXRoZXJfYWRkcihuZXRkZXYtPmRldl9hZGRyKSkgeworCQlEUFJJTlRLKFBST0JFLCBFUlIsICJJbnZhbGlkIE1BQyBhZGRyZXNzIGZyb20gIgorCQkJIkVFUFJPTSwgYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVBR0FJTjsKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisJfQorCisJLyogV29sIG1hZ2ljIHBhY2tldCBjYW4gYmUgZW5hYmxlZCBmcm9tIGVlcHJvbSAqLworCWlmKChuaWMtPm1hYyA+PSBtYWNfODI1NThfRDEwMV9BNCkgJiYKKwkgICAobmljLT5lZXByb21bZWVwcm9tX2lkXSAmIGVlcHJvbV9pZF93b2wpKQorCQluaWMtPmZsYWdzIHw9IHdvbF9tYWdpYzsKKworCXBjaV9lbmFibGVfd2FrZShwZGV2LCAwLCBuaWMtPmZsYWdzICYgKHdvbF9tYWdpYyB8IGUxMDBfYXNmKG5pYykpKTsKKworCXN0cmNweShuZXRkZXYtPm5hbWUsICJldGglZCIpOworCWlmKChlcnIgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KSkpIHsKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAiQ2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UsIGFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9mcmVlOworCX0KKworCURQUklOVEsoUFJPQkUsIElORk8sICJhZGRyIDB4JWx4LCBpcnEgJWQsICIKKwkJIk1BQyBhZGRyICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCQlwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksIHBkZXYtPmlycSwKKwkJbmV0ZGV2LT5kZXZfYWRkclswXSwgbmV0ZGV2LT5kZXZfYWRkclsxXSwgbmV0ZGV2LT5kZXZfYWRkclsyXSwKKwkJbmV0ZGV2LT5kZXZfYWRkclszXSwgbmV0ZGV2LT5kZXZfYWRkcls0XSwgbmV0ZGV2LT5kZXZfYWRkcls1XSk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9mcmVlOgorCWUxMDBfZnJlZShuaWMpOworZXJyX291dF9pb3VubWFwOgorCWlvdW5tYXAobmljLT5jc3IpOworZXJyX291dF9mcmVlX3JlczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX291dF9kaXNhYmxlX3BkZXY6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworZXJyX291dF9mcmVlX2RldjoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJZnJlZV9uZXRkZXYobmV0ZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZTEwMF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmKG5ldGRldikgeworCQlzdHJ1Y3QgbmljICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCQl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCQllMTAwX2ZyZWUobmljKTsKKwkJaW91bm1hcChuaWMtPmNzcik7CisJCWZyZWVfbmV0ZGV2KG5ldGRldik7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCX0KK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBlMTAwX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlpZihuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCWUxMDBfZG93bihuaWMpOworCWUxMDBfaHdfcmVzZXQobmljKTsKKwluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7CisKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSksIG5pYy0+ZmxhZ3MgJiAod29sX21hZ2ljIHwgZTEwMF9hc2YobmljKSkpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGUxMDBfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKwllMTAwX2h3X2luaXQobmljKTsKKworCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKKwlpZihuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCWUxMDBfdXAobmljKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBlMTAwX2RyaXZlciA9IHsKKwkubmFtZSA9ICAgICAgICAgRFJWX05BTUUsCisJLmlkX3RhYmxlID0gICAgIGUxMDBfaWRfdGFibGUsCisJLnByb2JlID0gICAgICAgIGUxMDBfcHJvYmUsCisJLnJlbW92ZSA9ICAgICAgIF9fZGV2ZXhpdF9wKGUxMDBfcmVtb3ZlKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCA9ICAgICAgZTEwMF9zdXNwZW5kLAorCS5yZXN1bWUgPSAgICAgICBlMTAwX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBfX2luaXQgZTEwMF9pbml0X21vZHVsZSh2b2lkKQoreworCWlmKCgoMSA8PCBkZWJ1ZykgLSAxKSAmIE5FVElGX01TR19EUlYpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzLCAlc1xuIiwgRFJWX0RFU0NSSVBUSU9OLCBEUlZfVkVSU0lPTik7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICIlc1xuIiwgRFJWX0NPUFlSSUdIVCk7CisJfQorCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmUxMDBfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGUxMDBfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmUxMDBfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZTEwMF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChlMTAwX2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL0xJQ0VOU0UgYi9kcml2ZXJzL25ldC9lMTAwMC9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMjk3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lMTAwMC9MSUNFTlNFCkBAIC0wLDAgKzEsMzM5IEBACisKKyJUaGlzIHNvZnR3YXJlIHByb2dyYW0gaXMgbGljZW5zZWQgc3ViamVjdCB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisoR1BMKS4gVmVyc2lvbiAyLCBKdW5lIDE5OTEsIGF2YWlsYWJsZSBhdCAKKzxodHRwOi8vd3d3LmZzZi5vcmcvY29weWxlZnQvZ3BsLmh0bWw+IgorCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKworVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAgCis1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQQorCitFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhpcyBsaWNlbnNlCitkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCitQcmVhbWJsZQorCitUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyIGZyZWVkb20gdG8gCitzaGFyZSBhbmQgY2hhbmdlIGl0LiBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkCit0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIAordGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuIFRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIAordG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIAord2hvc2UgYXV0aG9ycyBjb21taXQgdG8gdXNpbmcgaXQuIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiAKK3NvZnR3YXJlIGlzIGNvdmVyZWQgYnkgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pIFlvdSAKK2NhbiBhcHBseSBpdCB0byB5b3VyIHByb2dyYW1zLCB0b28uCisKK1doZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QgcHJpY2UuIE91cgorR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHRoZSBmcmVlZG9tIAordG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IgdGhpcyBzZXJ2aWNlIGlmIHlvdSAKK3dpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IAorY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdCBpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgCit5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZCBhbnlvbmUgdG8gCitkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gVGhlc2UgCityZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdSBkaXN0cmlidXRlCitjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCitGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyIGdyYXRpcyBvciAKK2ZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHlvdSBoYXZlLiBZb3UgCittdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UgY29kZS4gQW5kIHlvdSAKK211c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpciByaWdodHMuCisgCitXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kICgyKSAKK29mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSAKK2FuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLiAKKworQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4gdGhhdCAKK2V2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZSBzb2Z0d2FyZS4gSWYgCit0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlIHdhbnQgaXRzIAorcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28gdGhhdCBhbnkgCitwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbCBhdXRob3JzJyAKK3JlcHV0YXRpb25zLiAKKworRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUgcGF0ZW50cy4gV2UgCit3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUgcHJvZ3JhbSB3aWxsIAoraW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlIHByb2dyYW0gCitwcm9wcmlldGFyeS4gVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUgCitsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLiAKKworVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIAorZm9sbG93LiAKKworVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKzAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMgYSBub3RpY2UKKyAgIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSAKKyAgIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gVGhlICJQcm9ncmFtIiwgYmVsb3csIHJlZmVycyB0byBhbnkKKyAgIHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIgbWVhbnMgZWl0aGVyIHRoZSAKKyAgIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSAKKyAgIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIAorICAgbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuIChIZXJlaW5hZnRlciwgCisgICB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAKKyAgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLiAKKworICAgQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QgCisgICBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuIFRoZSBhY3Qgb2YgcnVubmluZyAKKyAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtIGlzIGNvdmVyZWQgCisgICBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSAoaW5kZXBlbmRlbnQgCisgICBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLiBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzCisgICBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuIAorCisxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3Mgc291cmNlIGNvZGUgCisgICBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UgY29uc3BpY3VvdXNseSBhbmQgCisgICBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIAorICAgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyAKKyAgIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsgYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgCisgICBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIFByb2dyYW0uIAorCisgICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQgeW91IAorICAgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLiAKKworMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbiBvZiBpdCwgCisgICB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQgZGlzdHJpYnV0ZSBzdWNoIAorICAgbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEgYWJvdmUsIHByb3ZpZGVkIHRoYXQgCisgICB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOiAKKworICAgKiBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyAKKyAgICAgICAgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIAorCisgICAqIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbiAKKyAgICAgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55IHBhcnQgCisgICAgICAgIHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzCisgICAgICAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIAorCisgICAqIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkgd2hlbiAKKyAgICAgICAgcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2ggaW50ZXJhY3RpdmUgCisgICAgICAgIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4gYW5ub3VuY2VtZW50IAorICAgICAgICBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYSBub3RpY2UgdGhhdCB0aGVyZSBpcworICAgICAgICBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUgYSB3YXJyYW50eSkgYW5kIHRoYXQgCisgICAgICAgIHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIgdGhlc2UgY29uZGl0aW9ucywgYW5kIAorICAgICAgICB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuIChFeGNlcHRpb246IGlmIAorICAgICAgICB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0IGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggCisgICAgICAgIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byAKKyAgICAgICAgcHJpbnQgYW4gYW5ub3VuY2VtZW50LikgCisKKyAgIFRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiBJZiBpZGVudGlmaWFibGUgCisgICBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sIGFuZCBjYW4gYmUgCisgICByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluIHRoZW1zZWx2ZXMsIHRoZW4gCisgICB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZSBzZWN0aW9ucyB3aGVuIHlvdSAKKyAgIGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gQnV0IHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlIHNhbWUgCisgICBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCB0aGUgCisgICBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgd2hvc2UgCisgICBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUgZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byAKKyAgIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuIAorCisgICBUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QgCisgICB5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8gCisgICBleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IgCisgICBjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLiAKKworICAgSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbSAKKyAgIHdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZiBhIAorICAgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyIHRoZSAKKyAgIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4gCisKKzMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LCB1bmRlciAKKyAgIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAKKyAgIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzogCisKKyAgICogYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgCisgICAgICAgIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgCisgICAgICAgIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwgCisKKyAgICogYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUgeWVhcnMsIAorICAgICAgICB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyIGNvc3Qgb2YgCisgICAgICAgIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlIG1hY2hpbmUtCisgICAgICAgIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlIGRpc3RyaWJ1dGVkIAorICAgICAgICB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSAKKyAgICAgICAgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLCAKKworICAgKiBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlciB0byAKKyAgICAgICAgZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAoVGhpcyBhbHRlcm5hdGl2ZSBpcyBhbGxvd2VkIAorICAgICAgICBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UgcmVjZWl2ZWQgdGhlIAorICAgICAgICBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2ggYW4gb2ZmZXIsIGluIAorICAgICAgICBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKSAKKworICAgVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvciAKKyAgIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UgY29kZSAKKyAgIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSAKKyAgIGFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIAorICAgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gSG93ZXZlciwgYXMgYSBzcGVjaWFsIAorICAgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzIAorICAgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yIAorICAgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaAorICAgdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcyB0aGUgCisgICBleGVjdXRhYmxlLiAKKworICAgSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgCisgICB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgCisgICB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMgZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgCisgICBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QgY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSAKKyAgIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLiAKKworNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGV4Y2VwdCBhcworICAgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gQW55IGF0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIAorICAgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMgdm9pZCwgYW5kIHdpbGwgCisgICBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuIEhvd2V2ZXIsIHBhcnRpZXMgCisgICB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90CisgICBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgCisgICBjb21wbGlhbmNlLiAKKworNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90IHNpZ25lZCAKKyAgIGl0LiBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvciBkaXN0cmlidXRlIAorICAgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuIFRoZXNlIGFjdGlvbnMgYXJlIHByb2hpYml0ZWQgYnkgbGF3IAorICAgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiBUaGVyZWZvcmUsIGJ5IG1vZGlmeWluZyBvciAKKyAgIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pLCB5b3UgCisgICBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQgYWxsIGl0cyB0ZXJtcyBhbmQKKyAgIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcgdGhlIFByb2dyYW0gb3Igd29ya3MgCisgICBiYXNlZCBvbiBpdC4gCisKKzYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUgCisgICBQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZSAKKyAgIG9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8gCisgICB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyIHJlc3RyaWN0aW9ucyAKKyAgIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLiBZb3UgYXJlIG5vdCAKKyAgIHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvIHRoaXMgTGljZW5zZS4gCisKKzcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQgCisgICBpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLCAKKyAgIGNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IgCisgICBvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90IAorICAgZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gSWYgeW91IGNhbm5vdCBkaXN0cmlidXRlIAorICAgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgCisgICBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91IG1heSBub3QgCisgICBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50IGxpY2Vuc2Ugd291bGQgCisgICBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieSBhbGwgdGhvc2Ugd2hvIAorICAgcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbiB0aGUgb25seSB3YXkgeW91IAorICAgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8gcmVmcmFpbiBlbnRpcmVseSBmcm9tIAorICAgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLiAKKworICAgSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFueQorICAgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvIGFwcGx5CisgICBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLiAKKworICAgSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueSAKKyAgIHBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55IAorICAgc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZSAKKyAgIGludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcyBpbXBsZW1lbnRlZCAKKyAgIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gTWFueSBwZW9wbGUgaGF2ZSBtYWRlIGdlbmVyb3VzIGNvbnRyaWJ1dGlvbnMKKyAgIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHRocm91Z2ggdGhhdCBzeXN0ZW0gaW4gCisgICByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQgc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgCisgICBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nIHRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgCisgICB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90IGltcG9zZSB0aGF0IGNob2ljZS4gCisKKyAgIFRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0byBiZSAKKyAgIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLiAKKworOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4gY2VydGFpbiAKKyAgIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUgb3JpZ2luYWwgCisgICBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQgYW4gCisgICBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nIHRob3NlIGNvdW50cmllcywgCisgICBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMgCisgICBleGNsdWRlZC4gSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmIAorICAgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuIAorCis5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZiAKKyAgIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIAorICAgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIAorICAgYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuIAorCisgICBFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gSWYgdGhlIFByb2dyYW0gCisgICBzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueSAKKyAgIGxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIAorICAgY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSAKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIAorICAgbnVtYmVyIG9mIHRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIAorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAKKworMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZSBwcm9ncmFtcworICAgIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIAorICAgIGZvciBwZXJtaXNzaW9uLiBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgCisgICAgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UgCisgICAgZXhjZXB0aW9ucyBmb3IgdGhpcy4gT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgCisgICAgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCAKKyAgICBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4gCisKKyAgIE5PIFdBUlJBTlRZCisKKzExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWSAKKyAgICBGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiBFWENFUFQgV0hFTiAKKyAgICBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTIAorICAgIFBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgCisgICAgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCAKKyAgICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFRIRSAKKyAgICBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCAKKyAgICBZT1UuIFNIT1VMRCBUSEUgUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIAorICAgIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiAKKworMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORyAKKyAgICBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SIAorICAgIFJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIAorICAgIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIAorICAgIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIAorICAgIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIAorICAgIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgCisgICAgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgCisgICAgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiAKKworRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKK0hvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCitJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0IAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdCBmcmVlIAorc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLiAKKworVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uIEl0IGlzIHNhZmVzdCB0byAKK2F0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkgY29udmV5IHRoZQorZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZSAiY29weXJpZ2h0IiAKK2xpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuIAorCitvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYW4gaWRlYSBvZiB3aGF0IGl0IGRvZXMuCitDb3B5cmlnaHQgKEMpIHl5eXkgIG5hbWUgb2YgYXV0aG9yCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IAordW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAorYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCAKK0FOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciAKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgCittb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKK3RoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSAKK1RlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4gCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMgd2hlbiAKK2l0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOiAKKworR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyIG5hbWUgb2YgYXV0aG9yIEdub21vdmlzaW9uIGNvbWVzIAord2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlICdzaG93IHcnLiAgVGhpcyBpcyBmcmVlIAorc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0IHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgCit0eXBlICdzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzICdzaG93IHcnIGFuZCAnc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUgCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkgYmUgCitjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gJ3Nob3cgdycgYW5kICdzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUgCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLiAKKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIgCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZiAKK25lY2Vzc2FyeS4gSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOiAKKworWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbSAKKydHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCitzaWduYXR1cmUgb2YgVHkgQ29vbiwgMSBBcHJpbCAxOTg5CitUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8gCitwcm9wcmlldGFyeSBwcm9ncmFtcy4gSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5IAorY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlIAorbGlicmFyeS4gSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIAorTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZTEwMDAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5Zjg5NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL01ha2VmaWxlCkBAIC0wLDAgKzEsMzUgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIAorIyBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDMgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCAKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgCisjIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgCisjIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIAorIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgCisjIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyMgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IAorIyBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyMgCisjIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorIyBmaWxlIGNhbGxlZCBMSUNFTlNFLgorIyAKKyMgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyMgTGludXggTklDUyA8bGludXgubmljc0BpbnRlbC5jb20+CisjIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBJbnRlbChSKSBQUk8vMTAwMCBldGhlcm5ldCBkcml2ZXIKKyMKKworb2JqLSQoQ09ORklHX0UxMDAwKSArPSBlMTAwMC5vCisKK2UxMDAwLW9ianMgOj0gZTEwMDBfbWFpbi5vIGUxMDAwX2h3Lm8gZTEwMDBfZXRodG9vbC5vIGUxMDAwX3BhcmFtLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmggYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ODkzMGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMC5oCkBAIC0wLDAgKzEsMjYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIAorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIAorICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCAKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgCisgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgCisgIGFueSBsYXRlciB2ZXJzaW9uLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgCisgIG1vcmUgZGV0YWlscy4KKyAgCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IAorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAgCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICAKKyAgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAgTGludXggTklDUyA8bGludXgubmljc0BpbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBMaW51eCBQUk8vMTAwMCBFdGhlcm5ldCBEcml2ZXIgbWFpbiBoZWFkZXIgZmlsZSAqLworCisjaWZuZGVmIF9FMTAwMF9IXworI2RlZmluZSBfRTEwMDBfSF8KKworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2lmZGVmIE5FVElGX0ZfVFNPCisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorCisjZGVmaW5lIEJBUl8wCQkwCisjZGVmaW5lIEJBUl8xCQkxCisjZGVmaW5lIEJBUl81CQk1CisKKyNkZWZpbmUgSU5URUxfRTEwMDBfRVRIRVJORVRfREVWSUNFKGRldmljZV9pZCkge1wKKwlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIGRldmljZV9pZCl9CisKK3N0cnVjdCBlMTAwMF9hZGFwdGVyOworCisjaW5jbHVkZSAiZTEwMDBfaHcuaCIKKworI2lmZGVmIERCRworI2RlZmluZSBFMTAwMF9EQkcoYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgImUxMDAwOiAiIGFyZ3MpCisjZWxzZQorI2RlZmluZSBFMTAwMF9EQkcoYXJncy4uLikKKyNlbmRpZgorCisjZGVmaW5lIEUxMDAwX0VSUihhcmdzLi4uKSBwcmludGsoS0VSTl9FUlIgImUxMDAwOiAiIGFyZ3MpCisKKyNkZWZpbmUgUEZYICJlMTAwMDogIgorI2RlZmluZSBEUFJJTlRLKG5sZXZlbCwga2xldmVsLCBmbXQsIGFyZ3MuLi4pIFwKKwkodm9pZCkoKE5FVElGX01TR18jI25sZXZlbCAmIGFkYXB0ZXItPm1zZ19lbmFibGUpICYmIFwKKwlwcmludGsoS0VSTl8jI2tsZXZlbCBQRlggIiVzOiAlczogIiBmbXQsIGFkYXB0ZXItPm5ldGRldi0+bmFtZSwgXAorCQlfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKSkKKworI2RlZmluZSBFMTAwMF9NQVhfSU5UUiAxMAorCisvKiBUWC9SWCBkZXNjcmlwdG9yIGRlZmluZXMgKi8KKyNkZWZpbmUgRTEwMDBfREVGQVVMVF9UWEQgICAgICAgICAgICAgICAgICAyNTYKKyNkZWZpbmUgRTEwMDBfTUFYX1RYRCAgICAgICAgICAgICAgICAgICAgICAyNTYKKyNkZWZpbmUgRTEwMDBfTUlOX1RYRCAgICAgICAgICAgICAgICAgICAgICAgODAKKyNkZWZpbmUgRTEwMDBfTUFYXzgyNTQ0X1RYRCAgICAgICAgICAgICAgIDQwOTYKKworI2RlZmluZSBFMTAwMF9ERUZBVUxUX1JYRCAgICAgICAgICAgICAgICAgIDI1NgorI2RlZmluZSBFMTAwMF9NQVhfUlhEICAgICAgICAgICAgICAgICAgICAgIDI1NgorI2RlZmluZSBFMTAwMF9NSU5fUlhEICAgICAgICAgICAgICAgICAgICAgICA4MAorI2RlZmluZSBFMTAwMF9NQVhfODI1NDRfUlhEICAgICAgICAgICAgICAgNDA5NgorCisvKiBTdXBwb3J0ZWQgUnggQnVmZmVyIFNpemVzICovCisjZGVmaW5lIEUxMDAwX1JYQlVGRkVSXzIwNDggIDIwNDgKKyNkZWZpbmUgRTEwMDBfUlhCVUZGRVJfNDA5NiAgNDA5NgorI2RlZmluZSBFMTAwMF9SWEJVRkZFUl84MTkyICA4MTkyCisjZGVmaW5lIEUxMDAwX1JYQlVGRkVSXzE2Mzg0IDE2Mzg0CisKKy8qIFNtYXJ0U3BlZWQgZGVsaW1pdGVycyAqLworI2RlZmluZSBFMTAwMF9TTUFSVFNQRUVEX0RPV05TSElGVCAzCisjZGVmaW5lIEUxMDAwX1NNQVJUU1BFRURfTUFYICAgICAgIDE1CisKKy8qIFBhY2tldCBCdWZmZXIgYWxsb2NhdGlvbnMgKi8KKyNkZWZpbmUgRTEwMDBfUEJBX0JZVEVTX1NISUZUIDB4QQorI2RlZmluZSBFMTAwMF9UWF9IRUFEX0FERFJfU0hJRlQgNworI2RlZmluZSBFMTAwMF9QQkFfVFhfTUFTSyAweEZGRkYwMDAwCisKKy8qIEZsb3cgQ29udHJvbCBXYXRlcm1hcmtzICovCisjZGVmaW5lIEUxMDAwX0ZDX0hJR0hfRElGRiAweDE2MzggIC8qIEhpZ2g6IDU2ODggYnl0ZXMgYmVsb3cgUnggRklGTyBzaXplICovCisjZGVmaW5lIEUxMDAwX0ZDX0xPV19ESUZGIDB4MTY0MCAgIC8qIExvdzogIDU2OTYgYnl0ZXMgYmVsb3cgUnggRklGTyBzaXplICovCisKKyNkZWZpbmUgRTEwMDBfRkNfUEFVU0VfVElNRSAweDA2ODAgLyogODU4IHVzZWMgKi8KKworLyogSG93IG1hbnkgVHggRGVzY3JpcHRvcnMgZG8gd2UgbmVlZCB0byBjYWxsIG5ldGlmX3dha2VfcXVldWUgPyAqLworI2RlZmluZSBFMTAwMF9UWF9RVUVVRV9XQUtFCTE2CisvKiBIb3cgbWFueSBSeCBCdWZmZXJzIGRvIHdlIGJ1bmRsZSBpbnRvIG9uZSB3cml0ZSB0byB0aGUgaGFyZHdhcmUgPyAqLworI2RlZmluZSBFMTAwMF9SWF9CVUZGRVJfV1JJVEUJMTYJLyogTXVzdCBiZSBwb3dlciBvZiAyICovCisKKyNkZWZpbmUgQVVUT19BTExfTU9ERVMgICAgICAgMAorI2RlZmluZSBFMTAwMF9FRVBST01fODI1NDRfQVBNIDB4MDAwNAorI2RlZmluZSBFMTAwMF9FRVBST01fQVBNRSAgICAweDA0MDAKKworI2lmbmRlZiBFMTAwMF9NQVNURVJfU0xBVkUKKy8qIFN3aXRjaCB0byBvdmVycmlkZSBQSFkgbWFzdGVyL3NsYXZlIHNldHRpbmcgKi8KKyNkZWZpbmUgRTEwMDBfTUFTVEVSX1NMQVZFCWUxMDAwX21zX2h3X2RlZmF1bHQKKyNlbmRpZgorCisvKiBvbmx5IHdvcmtzIGZvciBzaXplcyB0aGF0IGFyZSBwb3dlcnMgb2YgMiAqLworI2RlZmluZSBFMTAwMF9ST1VORFVQKGksIHNpemUpICgoaSkgPSAoKChpKSArIChzaXplKSAtIDEpICYgfigoc2l6ZSkgLSAxKSkpCisKKy8qIHdyYXBwZXIgYXJvdW5kIGEgcG9pbnRlciB0byBhIHNvY2tldCBidWZmZXIsCisgKiBzbyBhIERNQSBoYW5kbGUgY2FuIGJlIHN0b3JlZCBhbG9uZyB3aXRoIHRoZSBidWZmZXIgKi8KK3N0cnVjdCBlMTAwMF9idWZmZXIgeworCXN0cnVjdCBza19idWZmICpza2I7CisJdWludDY0X3QgZG1hOworCXVuc2lnbmVkIGxvbmcgdGltZV9zdGFtcDsKKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDE2X3QgbmV4dF90b193YXRjaDsKK307CisKK3N0cnVjdCBlMTAwMF9kZXNjX3JpbmcgeworCS8qIHBvaW50ZXIgdG8gdGhlIGRlc2NyaXB0b3IgcmluZyBtZW1vcnkgKi8KKwl2b2lkICpkZXNjOworCS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGRlc2NyaXB0b3IgcmluZyAqLworCWRtYV9hZGRyX3QgZG1hOworCS8qIGxlbmd0aCBvZiBkZXNjcmlwdG9yIHJpbmcgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwkvKiBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gdGhlIHJpbmcgKi8KKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJLyogbmV4dCBkZXNjcmlwdG9yIHRvIGFzc29jaWF0ZSBhIGJ1ZmZlciB3aXRoICovCisJdW5zaWduZWQgaW50IG5leHRfdG9fdXNlOworCS8qIG5leHQgZGVzY3JpcHRvciB0byBjaGVjayBmb3IgREQgc3RhdHVzIGJpdCAqLworCXVuc2lnbmVkIGludCBuZXh0X3RvX2NsZWFuOworCS8qIGFycmF5IG9mIGJ1ZmZlciBpbmZvcm1hdGlvbiBzdHJ1Y3RzICovCisJc3RydWN0IGUxMDAwX2J1ZmZlciAqYnVmZmVyX2luZm87Cit9OworCisjZGVmaW5lIEUxMDAwX0RFU0NfVU5VU0VEKFIpIFwKKwkoKCgoUiktPm5leHRfdG9fY2xlYW4gPiAoUiktPm5leHRfdG9fdXNlKSA/IDAgOiAoUiktPmNvdW50KSArIFwKKwkoUiktPm5leHRfdG9fY2xlYW4gLSAoUiktPm5leHRfdG9fdXNlIC0gMSkKKworI2RlZmluZSBFMTAwMF9HRVRfREVTQyhSLCBpLCB0eXBlKQkoJigoKHN0cnVjdCB0eXBlICopKChSKS5kZXNjKSlbaV0pKQorI2RlZmluZSBFMTAwMF9SWF9ERVNDKFIsIGkpCQlFMTAwMF9HRVRfREVTQyhSLCBpLCBlMTAwMF9yeF9kZXNjKQorI2RlZmluZSBFMTAwMF9UWF9ERVNDKFIsIGkpCQlFMTAwMF9HRVRfREVTQyhSLCBpLCBlMTAwMF90eF9kZXNjKQorI2RlZmluZSBFMTAwMF9DT05URVhUX0RFU0MoUiwgaSkJRTEwMDBfR0VUX0RFU0MoUiwgaSwgZTEwMDBfY29udGV4dF9kZXNjKQorCisvKiBib2FyZCBzcGVjaWZpYyBwcml2YXRlIGRhdGEgc3RydWN0dXJlICovCisKK3N0cnVjdCBlMTAwMF9hZGFwdGVyIHsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0eF9maWZvX3N0YWxsX3RpbWVyOworCXN0cnVjdCB0aW1lcl9saXN0IHdhdGNoZG9nX3RpbWVyOworCXN0cnVjdCB0aW1lcl9saXN0IHBoeV9pbmZvX3RpbWVyOworCXN0cnVjdCB2bGFuX2dyb3VwICp2bGdycDsKKwl1aW50MzJfdCBiZF9udW1iZXI7CisJdWludDMyX3QgcnhfYnVmZmVyX2xlbjsKKwl1aW50MzJfdCBwYXJ0X251bTsKKwl1aW50MzJfdCB3b2w7CisJdWludDMyX3Qgc21hcnRzcGVlZDsKKwl1aW50MzJfdCBlbl9tbmdfcHQ7CisJdWludDE2X3QgbGlua19zcGVlZDsKKwl1aW50MTZfdCBsaW5rX2R1cGxleDsKKwlzcGlubG9ja190IHN0YXRzX2xvY2s7CisJYXRvbWljX3QgaXJxX3NlbTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhfdGltZW91dF90YXNrOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3YXRjaGRvZ190YXNrOworCXVpbnQ4X3QgZmNfYXV0b25lZzsKKworCXN0cnVjdCB0aW1lcl9saXN0IGJsaW5rX3RpbWVyOworCXVuc2lnbmVkIGxvbmcgbGVkX3N0YXR1czsKKworCS8qIFRYICovCisJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyB0eF9yaW5nOworCXN0cnVjdCBlMTAwMF9idWZmZXIgcHJldmlvdXNfYnVmZmVyX2luZm87CisJc3BpbmxvY2tfdCB0eF9sb2NrOworCXVpbnQzMl90IHR4ZF9jbWQ7CisJdWludDMyX3QgdHhfaW50X2RlbGF5OworCXVpbnQzMl90IHR4X2Fic19pbnRfZGVsYXk7CisJdWludDMyX3QgZ290Y2w7CisJdWludDY0X3QgZ290Y2xfb2xkOworCXVpbnQ2NF90IHRwdF9vbGQ7CisJdWludDY0X3QgY29sY19vbGQ7CisJdWludDMyX3QgdHhfZmlmb19oZWFkOworCXVpbnQzMl90IHR4X2hlYWRfYWRkcjsKKwl1aW50MzJfdCB0eF9maWZvX3NpemU7CisJYXRvbWljX3QgdHhfZmlmb19zdGFsbDsKKwlib29sZWFuX3QgcGNpeF84MjU0NDsKKwlib29sZWFuX3QgZGV0ZWN0X3R4X2h1bmc7CisKKwkvKiBSWCAqLworCXN0cnVjdCBlMTAwMF9kZXNjX3JpbmcgcnhfcmluZzsKKwl1aW50NjRfdCBod19jc3VtX2VycjsKKwl1aW50NjRfdCBod19jc3VtX2dvb2Q7CisJdWludDMyX3QgcnhfaW50X2RlbGF5OworCXVpbnQzMl90IHJ4X2Fic19pbnRfZGVsYXk7CisJYm9vbGVhbl90IHJ4X2NzdW07CisJdWludDMyX3QgZ29yY2w7CisJdWludDY0X3QgZ29yY2xfb2xkOworCisJLyogSW50ZXJydXB0IFRocm90dGxlIFJhdGUgKi8KKwl1aW50MzJfdCBpdHI7CisKKwkvKiBPUyBkZWZpbmVkIHN0cnVjdHMgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsKKworCS8qIHN0cnVjdHMgZGVmaW5lZCBpbiBlMTAwMF9ody5oICovCisJc3RydWN0IGUxMDAwX2h3IGh3OworCXN0cnVjdCBlMTAwMF9od19zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgZTEwMDBfcGh5X2luZm8gcGh5X2luZm87CisJc3RydWN0IGUxMDAwX3BoeV9zdGF0cyBwaHlfc3RhdHM7CisKKwl1aW50MzJfdCB0ZXN0X2ljcjsKKwlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nIHRlc3RfdHhfcmluZzsKKwlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nIHRlc3RfcnhfcmluZzsKKworCisJaW50IG1zZ19lbmFibGU7Cit9OworI2VuZGlmIC8qIF9FMTAwMF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfZXRodG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMmNhN2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ldGh0b29sLmMKQEAgLTAsMCArMSwxNjczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIAorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIAorICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCAKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgCisgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgCisgIGFueSBsYXRlciB2ZXJzaW9uLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgCisgIG1vcmUgZGV0YWlscy4KKyAgCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IAorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAgCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICAKKyAgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAgTGludXggTklDUyA8bGludXgubmljc0BpbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZXRodG9vbCBzdXBwb3J0IGZvciBlMTAwMCAqLworCisjaW5jbHVkZSAiZTEwMDAuaCIKKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK2V4dGVybiBjaGFyIGUxMDAwX2RyaXZlcl9uYW1lW107CitleHRlcm4gY2hhciBlMTAwMF9kcml2ZXJfdmVyc2lvbltdOworCitleHRlcm4gaW50IGUxMDAwX3VwKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKK2V4dGVybiB2b2lkIGUxMDAwX2Rvd24oc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworZXh0ZXJuIHZvaWQgZTEwMDBfcmVzZXQoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworZXh0ZXJuIGludCBlMTAwMF9zZXRfc3BkX2RwbHgoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsIHVpbnQxNl90IHNwZGRwbHgpOworZXh0ZXJuIGludCBlMTAwMF9zZXR1cF9yeF9yZXNvdXJjZXMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworZXh0ZXJuIGludCBlMTAwMF9zZXR1cF90eF9yZXNvdXJjZXMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworZXh0ZXJuIHZvaWQgZTEwMDBfZnJlZV9yeF9yZXNvdXJjZXMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworZXh0ZXJuIHZvaWQgZTEwMDBfZnJlZV90eF9yZXNvdXJjZXMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworZXh0ZXJuIHZvaWQgZTEwMDBfdXBkYXRlX3N0YXRzKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKKworc3RydWN0IGUxMDAwX3N0YXRzIHsKKwljaGFyIHN0YXRfc3RyaW5nW0VUSF9HU1RSSU5HX0xFTl07CisJaW50IHNpemVvZl9zdGF0OworCWludCBzdGF0X29mZnNldDsKK307CisKKyNkZWZpbmUgRTEwMDBfU1RBVChtKSBzaXplb2YoKChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqKTApLT5tKSwgXAorCQkgICAgICBvZmZzZXRvZihzdHJ1Y3QgZTEwMDBfYWRhcHRlciwgbSkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZTEwMDBfc3RhdHMgZTEwMDBfZ3N0cmluZ3Nfc3RhdHNbXSA9IHsKKwl7ICJyeF9wYWNrZXRzIiwgRTEwMDBfU1RBVChuZXRfc3RhdHMucnhfcGFja2V0cykgfSwKKwl7ICJ0eF9wYWNrZXRzIiwgRTEwMDBfU1RBVChuZXRfc3RhdHMudHhfcGFja2V0cykgfSwKKwl7ICJyeF9ieXRlcyIsIEUxMDAwX1NUQVQobmV0X3N0YXRzLnJ4X2J5dGVzKSB9LAorCXsgInR4X2J5dGVzIiwgRTEwMDBfU1RBVChuZXRfc3RhdHMudHhfYnl0ZXMpIH0sCisJeyAicnhfZXJyb3JzIiwgRTEwMDBfU1RBVChuZXRfc3RhdHMucnhfZXJyb3JzKSB9LAorCXsgInR4X2Vycm9ycyIsIEUxMDAwX1NUQVQobmV0X3N0YXRzLnR4X2Vycm9ycykgfSwKKwl7ICJyeF9kcm9wcGVkIiwgRTEwMDBfU1RBVChuZXRfc3RhdHMucnhfZHJvcHBlZCkgfSwKKwl7ICJ0eF9kcm9wcGVkIiwgRTEwMDBfU1RBVChuZXRfc3RhdHMudHhfZHJvcHBlZCkgfSwKKwl7ICJtdWx0aWNhc3QiLCBFMTAwMF9TVEFUKG5ldF9zdGF0cy5tdWx0aWNhc3QpIH0sCisJeyAiY29sbGlzaW9ucyIsIEUxMDAwX1NUQVQobmV0X3N0YXRzLmNvbGxpc2lvbnMpIH0sCisJeyAicnhfbGVuZ3RoX2Vycm9ycyIsIEUxMDAwX1NUQVQobmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMpIH0sCisJeyAicnhfb3Zlcl9lcnJvcnMiLCBFMTAwMF9TVEFUKG5ldF9zdGF0cy5yeF9vdmVyX2Vycm9ycykgfSwKKwl7ICJyeF9jcmNfZXJyb3JzIiwgRTEwMDBfU1RBVChuZXRfc3RhdHMucnhfY3JjX2Vycm9ycykgfSwKKwl7ICJyeF9mcmFtZV9lcnJvcnMiLCBFMTAwMF9TVEFUKG5ldF9zdGF0cy5yeF9mcmFtZV9lcnJvcnMpIH0sCisJeyAicnhfZmlmb19lcnJvcnMiLCBFMTAwMF9TVEFUKG5ldF9zdGF0cy5yeF9maWZvX2Vycm9ycykgfSwKKwl7ICJyeF9taXNzZWRfZXJyb3JzIiwgRTEwMDBfU1RBVChuZXRfc3RhdHMucnhfbWlzc2VkX2Vycm9ycykgfSwKKwl7ICJ0eF9hYm9ydGVkX2Vycm9ycyIsIEUxMDAwX1NUQVQobmV0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKSB9LAorCXsgInR4X2NhcnJpZXJfZXJyb3JzIiwgRTEwMDBfU1RBVChuZXRfc3RhdHMudHhfY2Fycmllcl9lcnJvcnMpIH0sCisJeyAidHhfZmlmb19lcnJvcnMiLCBFMTAwMF9TVEFUKG5ldF9zdGF0cy50eF9maWZvX2Vycm9ycykgfSwKKwl7ICJ0eF9oZWFydGJlYXRfZXJyb3JzIiwgRTEwMDBfU1RBVChuZXRfc3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycykgfSwKKwl7ICJ0eF93aW5kb3dfZXJyb3JzIiwgRTEwMDBfU1RBVChuZXRfc3RhdHMudHhfd2luZG93X2Vycm9ycykgfSwKKwl7ICJ0eF9hYm9ydF9sYXRlX2NvbGwiLCBFMTAwMF9TVEFUKHN0YXRzLmxhdGVjb2wpIH0sCisJeyAidHhfZGVmZXJyZWRfb2siLCBFMTAwMF9TVEFUKHN0YXRzLmRjKSB9LAorCXsgInR4X3NpbmdsZV9jb2xsX29rIiwgRTEwMDBfU1RBVChzdGF0cy5zY2MpIH0sCisJeyAidHhfbXVsdGlfY29sbF9vayIsIEUxMDAwX1NUQVQoc3RhdHMubWNjKSB9LAorCXsgInJ4X2xvbmdfbGVuZ3RoX2Vycm9ycyIsIEUxMDAwX1NUQVQoc3RhdHMucm9jKSB9LAorCXsgInJ4X3Nob3J0X2xlbmd0aF9lcnJvcnMiLCBFMTAwMF9TVEFUKHN0YXRzLnJ1YykgfSwKKwl7ICJyeF9hbGlnbl9lcnJvcnMiLCBFMTAwMF9TVEFUKHN0YXRzLmFsZ25lcnJjKSB9LAorCXsgInR4X3RjcF9zZWdfZ29vZCIsIEUxMDAwX1NUQVQoc3RhdHMudHNjdGMpIH0sCisJeyAidHhfdGNwX3NlZ19mYWlsZWQiLCBFMTAwMF9TVEFUKHN0YXRzLnRzY3RmYykgfSwKKwl7ICJyeF9mbG93X2NvbnRyb2xfeG9uIiwgRTEwMDBfU1RBVChzdGF0cy54b25yeGMpIH0sCisJeyAicnhfZmxvd19jb250cm9sX3hvZmYiLCBFMTAwMF9TVEFUKHN0YXRzLnhvZmZyeGMpIH0sCisJeyAidHhfZmxvd19jb250cm9sX3hvbiIsIEUxMDAwX1NUQVQoc3RhdHMueG9udHhjKSB9LAorCXsgInR4X2Zsb3dfY29udHJvbF94b2ZmIiwgRTEwMDBfU1RBVChzdGF0cy54b2ZmdHhjKSB9LAorCXsgInJ4X2xvbmdfYnl0ZV9jb3VudCIsIEUxMDAwX1NUQVQoc3RhdHMuZ29yY2wpIH0sCisJeyAicnhfY3N1bV9vZmZsb2FkX2dvb2QiLCBFMTAwMF9TVEFUKGh3X2NzdW1fZ29vZCkgfSwKKwl7ICJyeF9jc3VtX29mZmxvYWRfZXJyb3JzIiwgRTEwMDBfU1RBVChod19jc3VtX2VycikgfQorfTsKKyNkZWZpbmUgRTEwMDBfU1RBVFNfTEVOCVwKKwlzaXplb2YoZTEwMDBfZ3N0cmluZ3Nfc3RhdHMpIC8gc2l6ZW9mKHN0cnVjdCBlMTAwMF9zdGF0cykKK3N0YXRpYyBjb25zdCBjaGFyIGUxMDAwX2dzdHJpbmdzX3Rlc3RbXVtFVEhfR1NUUklOR19MRU5dID0geworCSJSZWdpc3RlciB0ZXN0ICAob2ZmbGluZSkiLCAiRWVwcm9tIHRlc3QgICAgKG9mZmxpbmUpIiwKKwkiSW50ZXJydXB0IHRlc3QgKG9mZmxpbmUpIiwgIkxvb3BiYWNrIHRlc3QgIChvZmZsaW5lKSIsCisJIkxpbmsgdGVzdCAgIChvbi9vZmZsaW5lKSIKK307CisjZGVmaW5lIEUxMDAwX1RFU1RfTEVOIHNpemVvZihlMTAwMF9nc3RyaW5nc190ZXN0KSAvIEVUSF9HU1RSSU5HX0xFTgorCitzdGF0aWMgaW50CitlMTAwMF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisKKwlpZihody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgeworCisJCWVjbWQtPnN1cHBvcnRlZCA9IChTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkJICAgICAgICAgICAgICAgICAgIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAorCQkgICAgICAgICAgICAgICAgICAgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfAorCQkgICAgICAgICAgICAgICAgICAgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfAorCQkgICAgICAgICAgICAgICAgICAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsfAorCQkgICAgICAgICAgICAgICAgICAgU1VQUE9SVEVEX0F1dG9uZWcgfAorCQkgICAgICAgICAgICAgICAgICAgU1VQUE9SVEVEX1RQKTsKKworCQllY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfVFA7CisKKwkJaWYoaHctPmF1dG9uZWcgPT0gMSkgeworCQkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9BdXRvbmVnOworCisJCQkvKiB0aGUgZTEwMDAgYXV0b25lZyBzZWVtcyB0byBtYXRjaCBldGh0b29sIG5pY2VseSAqLworCisJCQllY21kLT5hZHZlcnRpc2luZyB8PSBody0+YXV0b25lZ19hZHZlcnRpc2VkOworCQl9CisKKwkJZWNtZC0+cG9ydCA9IFBPUlRfVFA7CisJCWVjbWQtPnBoeV9hZGRyZXNzID0gaHctPnBoeV9hZGRyOworCisJCWlmKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MykKKwkJCWVjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9FWFRFUk5BTDsKKwkJZWxzZQorCQkJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCisJfSBlbHNlIHsKKwkJZWNtZC0+c3VwcG9ydGVkICAgPSAoU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwKKwkJCQkgICAgIFNVUFBPUlRFRF9GSUJSRSB8CisJCQkJICAgICBTVVBQT1JURURfQXV0b25lZyk7CisKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgPSAoU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwKKwkJCQkgICAgIFNVUFBPUlRFRF9GSUJSRSB8CisJCQkJICAgICBTVVBQT1JURURfQXV0b25lZyk7CisKKwkJZWNtZC0+cG9ydCA9IFBPUlRfRklCUkU7CisKKwkJaWYoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQ1KQorCQkJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCQllbHNlCisJCQllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CisJfQorCisJaWYobmV0aWZfY2Fycmllcl9vayhhZGFwdGVyLT5uZXRkZXYpKSB7CisKKwkJZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoaHcsICZhZGFwdGVyLT5saW5rX3NwZWVkLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZGFwdGVyLT5saW5rX2R1cGxleCk7CisJCWVjbWQtPnNwZWVkID0gYWRhcHRlci0+bGlua19zcGVlZDsKKworCQkvKiB1bmZvcnR1bmF0bHkgRlVMTF9EVVBMRVggIT0gRFVQTEVYX0ZVTEwKKwkJICogICAgICAgICAgYW5kIEhBTEZfRFVQTEVYICE9IERVUExFWF9IQUxGICovCisKKwkJaWYoYWRhcHRlci0+bGlua19kdXBsZXggPT0gRlVMTF9EVVBMRVgpCisJCQllY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJZWxzZQorCQkJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJfSBlbHNlIHsKKwkJZWNtZC0+c3BlZWQgPSAtMTsKKwkJZWNtZC0+ZHVwbGV4ID0gLTE7CisJfQorCisJZWNtZC0+YXV0b25lZyA9ICgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgfHwKKwkJCSBody0+YXV0b25lZykgPyBBVVRPTkVHX0VOQUJMRSA6IEFVVE9ORUdfRElTQUJMRTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZTEwMDBfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCisJaWYoZWNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQlody0+YXV0b25lZyA9IDE7CisJCWh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPSAweDAwMkY7CisJCWVjbWQtPmFkdmVydGlzaW5nID0gMHgwMDJGOworCX0gZWxzZQorCQlpZihlMTAwMF9zZXRfc3BkX2RwbHgoYWRhcHRlciwgZWNtZC0+c3BlZWQgKyBlY21kLT5kdXBsZXgpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiByZXNldCB0aGUgbGluayAqLworCisJaWYobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKSB7CisJCWUxMDAwX2Rvd24oYWRhcHRlcik7CisJCWUxMDAwX3Jlc2V0KGFkYXB0ZXIpOworCQllMTAwMF91cChhZGFwdGVyKTsKKwl9IGVsc2UKKwkJZTEwMDBfcmVzZXQoYWRhcHRlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2UxMDAwX2dldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICpwYXVzZSkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCisJcGF1c2UtPmF1dG9uZWcgPSAKKwkJKGFkYXB0ZXItPmZjX2F1dG9uZWcgPyBBVVRPTkVHX0VOQUJMRSA6IEFVVE9ORUdfRElTQUJMRSk7CisJCisJaWYoaHctPmZjID09IGUxMDAwX2ZjX3J4X3BhdXNlKQorCQlwYXVzZS0+cnhfcGF1c2UgPSAxOworCWVsc2UgaWYoaHctPmZjID09IGUxMDAwX2ZjX3R4X3BhdXNlKQorCQlwYXVzZS0+dHhfcGF1c2UgPSAxOworCWVsc2UgaWYoaHctPmZjID09IGUxMDAwX2ZjX2Z1bGwpIHsKKwkJcGF1c2UtPnJ4X3BhdXNlID0gMTsKKwkJcGF1c2UtPnR4X3BhdXNlID0gMTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2UxMDAwX3NldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICpwYXVzZSkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCQorCWFkYXB0ZXItPmZjX2F1dG9uZWcgPSBwYXVzZS0+YXV0b25lZzsKKworCWlmKHBhdXNlLT5yeF9wYXVzZSAmJiBwYXVzZS0+dHhfcGF1c2UpCisJCWh3LT5mYyA9IGUxMDAwX2ZjX2Z1bGw7CisJZWxzZSBpZihwYXVzZS0+cnhfcGF1c2UgJiYgIXBhdXNlLT50eF9wYXVzZSkKKwkJaHctPmZjID0gZTEwMDBfZmNfcnhfcGF1c2U7CisJZWxzZSBpZighcGF1c2UtPnJ4X3BhdXNlICYmIHBhdXNlLT50eF9wYXVzZSkKKwkJaHctPmZjID0gZTEwMDBfZmNfdHhfcGF1c2U7CisJZWxzZSBpZighcGF1c2UtPnJ4X3BhdXNlICYmICFwYXVzZS0+dHhfcGF1c2UpCisJCWh3LT5mYyA9IGUxMDAwX2ZjX25vbmU7CisKKwlody0+b3JpZ2luYWxfZmMgPSBody0+ZmM7CisKKwlpZihhZGFwdGVyLT5mY19hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCWlmKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgeworCQkJZTEwMDBfZG93bihhZGFwdGVyKTsKKwkJCWUxMDAwX3VwKGFkYXB0ZXIpOworCQl9IGVsc2UKKwkJCWUxMDAwX3Jlc2V0KGFkYXB0ZXIpOworCX0KKwllbHNlCisJCXJldHVybiAoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpID8KKwkJCWUxMDAwX3NldHVwX2xpbmsoaHcpIDogZTEwMDBfZm9yY2VfbWFjX2ZjKGh3KSk7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50MzJfdAorZTEwMDBfZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlyZXR1cm4gYWRhcHRlci0+cnhfY3N1bTsKK30KKworc3RhdGljIGludAorZTEwMDBfc2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDMyX3QgZGF0YSkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlhZGFwdGVyLT5yeF9jc3VtID0gZGF0YTsKKworCWlmKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCQllMTAwMF9kb3duKGFkYXB0ZXIpOworCQllMTAwMF91cChhZGFwdGVyKTsKKwl9IGVsc2UKKwkJZTEwMDBfcmVzZXQoYWRhcHRlcik7CisJcmV0dXJuIDA7Cit9CisJCitzdGF0aWMgdWludDMyX3QKK2UxMDAwX2dldF90eF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJcmV0dXJuIChuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19DU1VNKSAhPSAwOworfQorCitzdGF0aWMgaW50CitlMTAwMF9zZXRfdHhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MzJfdCBkYXRhKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCisJaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU0MykgeworCQlpZiAoIWRhdGEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRhdGEpCisJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19DU1VNOworCWVsc2UKKwkJbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9IV19DU1VNOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBORVRJRl9GX1RTTworc3RhdGljIGludAorZTEwMDBfc2V0X3RzbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MzJfdCBkYXRhKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCWlmICgoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU0NCkgfHwKKwkgICAgKGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTQ3KSkgCisJCXJldHVybiBkYXRhID8gLUVJTlZBTCA6IDA7CisKKwlpZiAoZGF0YSkKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsKKwllbHNlCisJCW5ldGRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfVFNPOworCXJldHVybiAwOworfSAKKyNlbmRpZiAvKiBORVRJRl9GX1RTTyAqLworCitzdGF0aWMgdWludDMyX3QKK2UxMDAwX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXJldHVybiBhZGFwdGVyLT5tc2dfZW5hYmxlOworfQorCitzdGF0aWMgdm9pZAorZTEwMDBfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQzMl90IGRhdGEpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJYWRhcHRlci0+bXNnX2VuYWJsZSA9IGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgCitlMTAwMF9nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKyNkZWZpbmUgRTEwMDBfUkVHU19MRU4gMzIKKwlyZXR1cm4gRTEwMDBfUkVHU19MRU4gKiBzaXplb2YodWludDMyX3QpOworfQorCitzdGF0aWMgdm9pZAorZTEwMDBfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkgICAgICAgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXVpbnQzMl90ICpyZWdzX2J1ZmYgPSBwOworCXVpbnQxNl90IHBoeV9kYXRhOworCisJbWVtc2V0KHAsIDAsIEUxMDAwX1JFR1NfTEVOICogc2l6ZW9mKHVpbnQzMl90KSk7CisKKwlyZWdzLT52ZXJzaW9uID0gKDEgPDwgMjQpIHwgKGh3LT5yZXZpc2lvbl9pZCA8PCAxNikgfCBody0+ZGV2aWNlX2lkOworCisJcmVnc19idWZmWzBdICA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKwlyZWdzX2J1ZmZbMV0gID0gRTEwMDBfUkVBRF9SRUcoaHcsIFNUQVRVUyk7CisKKwlyZWdzX2J1ZmZbMl0gID0gRTEwMDBfUkVBRF9SRUcoaHcsIFJDVEwpOworCXJlZ3NfYnVmZlszXSAgPSBFMTAwMF9SRUFEX1JFRyhodywgUkRMRU4pOworCXJlZ3NfYnVmZls0XSAgPSBFMTAwMF9SRUFEX1JFRyhodywgUkRIKTsKKwlyZWdzX2J1ZmZbNV0gID0gRTEwMDBfUkVBRF9SRUcoaHcsIFJEVCk7CisJcmVnc19idWZmWzZdICA9IEUxMDAwX1JFQURfUkVHKGh3LCBSRFRSKTsKKworCXJlZ3NfYnVmZls3XSAgPSBFMTAwMF9SRUFEX1JFRyhodywgVENUTCk7CisJcmVnc19idWZmWzhdICA9IEUxMDAwX1JFQURfUkVHKGh3LCBURExFTik7CisJcmVnc19idWZmWzldICA9IEUxMDAwX1JFQURfUkVHKGh3LCBUREgpOworCXJlZ3NfYnVmZlsxMF0gPSBFMTAwMF9SRUFEX1JFRyhodywgVERUKTsKKwlyZWdzX2J1ZmZbMTFdID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRJRFYpOworCisJcmVnc19idWZmWzEyXSA9IGFkYXB0ZXItPmh3LnBoeV90eXBlOyAgLyogUEhZIHR5cGUgKElHUD0xLCBNODg9MCkgKi8KKwlpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkgeworCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwKKwkJCQkgICAgSUdQMDFFMTAwMF9QSFlfQUdDX0EpOworCQllMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX0FHQ19BICYKKwkJCQkgICBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgJnBoeV9kYXRhKTsKKwkJcmVnc19idWZmWzEzXSA9ICh1aW50MzJfdClwaHlfZGF0YTsgLyogY2FibGUgbGVuZ3RoICovCisJCWUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULAorCQkJCSAgICBJR1AwMUUxMDAwX1BIWV9BR0NfQik7CisJCWUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfQUdDX0IgJgorCQkJCSAgIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULCAmcGh5X2RhdGEpOworCQlyZWdzX2J1ZmZbMTRdID0gKHVpbnQzMl90KXBoeV9kYXRhOyAvKiBjYWJsZSBsZW5ndGggKi8KKwkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsCisJCQkJICAgIElHUDAxRTEwMDBfUEhZX0FHQ19DKTsKKwkJZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9BR0NfQyAmCisJCQkJICAgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsICZwaHlfZGF0YSk7CisJCXJlZ3NfYnVmZlsxNV0gPSAodWludDMyX3QpcGh5X2RhdGE7IC8qIGNhYmxlIGxlbmd0aCAqLworCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwKKwkJCQkgICAgSUdQMDFFMTAwMF9QSFlfQUdDX0QpOworCQllMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX0FHQ19EICYKKwkJCQkgICBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgJnBoeV9kYXRhKTsKKwkJcmVnc19idWZmWzE2XSA9ICh1aW50MzJfdClwaHlfZGF0YTsgLyogY2FibGUgbGVuZ3RoICovCisJCXJlZ3NfYnVmZlsxN10gPSAwOyAvKiBleHRlbmRlZCAxMGJ0IGRpc3RhbmNlIChub3QgbmVlZGVkKSAqLworCQllMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgMHgwKTsKKwkJZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX1NUQVRVUyAmCisJCQkJICAgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsICZwaHlfZGF0YSk7CisJCXJlZ3NfYnVmZlsxOF0gPSAodWludDMyX3QpcGh5X2RhdGE7IC8qIGNhYmxlIHBvbGFyaXR5ICovCisJCWUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULAorCQkJCSAgICBJR1AwMUUxMDAwX1BIWV9QQ1NfSU5JVF9SRUcpOworCQllMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BDU19JTklUX1JFRyAmCisJCQkJICAgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsICZwaHlfZGF0YSk7CisJCXJlZ3NfYnVmZlsxOV0gPSAodWludDMyX3QpcGh5X2RhdGE7IC8qIGNhYmxlIHBvbGFyaXR5ICovCisJCXJlZ3NfYnVmZlsyMF0gPSAwOyAvKiBwb2xhcml0eSBjb3JyZWN0aW9uIGVuYWJsZWQgKGFsd2F5cykgKi8KKwkJcmVnc19idWZmWzIyXSA9IDA7IC8qIHBoeSByZWNlaXZlIGVycm9ycyAodW5hdmFpbGFibGUpICovCisJCXJlZ3NfYnVmZlsyM10gPSByZWdzX2J1ZmZbMThdOyAvKiBtZGl4IG1vZGUgKi8KKwkJZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsIDB4MCk7CisJfSBlbHNlIHsKKyAgICAgICAgCWUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfU1RBVFVTLCAmcGh5X2RhdGEpOworCQlyZWdzX2J1ZmZbMTNdID0gKHVpbnQzMl90KXBoeV9kYXRhOyAvKiBjYWJsZSBsZW5ndGggKi8KKwkJcmVnc19idWZmWzE0XSA9IDA7ICAvKiBEdW1teSAodG8gYWxpZ24gdy8gSUdQIHBoeSByZWcgZHVtcCkgKi8KKwkJcmVnc19idWZmWzE1XSA9IDA7ICAvKiBEdW1teSAodG8gYWxpZ24gdy8gSUdQIHBoeSByZWcgZHVtcCkgKi8KKwkJcmVnc19idWZmWzE2XSA9IDA7ICAvKiBEdW1teSAodG8gYWxpZ24gdy8gSUdQIHBoeSByZWcgZHVtcCkgKi8KKyAgICAgICAgCWUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgJnBoeV9kYXRhKTsKKwkJcmVnc19idWZmWzE3XSA9ICh1aW50MzJfdClwaHlfZGF0YTsgLyogZXh0ZW5kZWQgMTBidCBkaXN0YW5jZSAqLworCQlyZWdzX2J1ZmZbMThdID0gcmVnc19idWZmWzEzXTsgLyogY2FibGUgcG9sYXJpdHkgKi8KKwkJcmVnc19idWZmWzE5XSA9IDA7ICAvKiBEdW1teSAodG8gYWxpZ24gdy8gSUdQIHBoeSByZWcgZHVtcCkgKi8KKwkJcmVnc19idWZmWzIwXSA9IHJlZ3NfYnVmZlsxN107IC8qIHBvbGFyaXR5IGNvcnJlY3Rpb24gKi8KKwkJLyogcGh5IHJlY2VpdmUgZXJyb3JzICovCisJCXJlZ3NfYnVmZlsyMl0gPSBhZGFwdGVyLT5waHlfc3RhdHMucmVjZWl2ZV9lcnJvcnM7CisJCXJlZ3NfYnVmZlsyM10gPSByZWdzX2J1ZmZbMTNdOyAvKiBtZGl4IG1vZGUgKi8KKwl9CisJcmVnc19idWZmWzIxXSA9IGFkYXB0ZXItPnBoeV9zdGF0cy5pZGxlX2Vycm9yczsgIC8qIHBoeSBpZGxlIGVycm9ycyAqLworCWUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZXzEwMDBUX1NUQVRVUywgJnBoeV9kYXRhKTsKKwlyZWdzX2J1ZmZbMjRdID0gKHVpbnQzMl90KXBoeV9kYXRhOyAgLyogcGh5IGxvY2FsIHJlY2VpdmVyIHN0YXR1cyAqLworCXJlZ3NfYnVmZlsyNV0gPSByZWdzX2J1ZmZbMjRdOyAgLyogcGh5IHJlbW90ZSByZWNlaXZlciBzdGF0dXMgKi8KKwlpZihody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDAgJiYKKwkgICBody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgeworCQlyZWdzX2J1ZmZbMjZdID0gRTEwMDBfUkVBRF9SRUcoaHcsIE1BTkMpOworCX0KK30KKworc3RhdGljIGludAorZTEwMDBfZ2V0X2VlcHJvbV9sZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlyZXR1cm4gYWRhcHRlci0+aHcuZWVwcm9tLndvcmRfc2l6ZSAqIDI7Cit9CisKK3N0YXRpYyBpbnQKK2UxMDAwX2dldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdWludDhfdCAqYnl0ZXMpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1aW50MTZfdCAqZWVwcm9tX2J1ZmY7CisJaW50IGZpcnN0X3dvcmQsIGxhc3Rfd29yZDsKKwlpbnQgcmV0X3ZhbCA9IDA7CisJdWludDE2X3QgaTsKKworCWlmKGVlcHJvbS0+bGVuID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZWVwcm9tLT5tYWdpYyA9IGh3LT52ZW5kb3JfaWQgfCAoaHctPmRldmljZV9pZCA8PCAxNik7CisKKwlmaXJzdF93b3JkID0gZWVwcm9tLT5vZmZzZXQgPj4gMTsKKwlsYXN0X3dvcmQgPSAoZWVwcm9tLT5vZmZzZXQgKyBlZXByb20tPmxlbiAtIDEpID4+IDE7CisKKwllZXByb21fYnVmZiA9IGttYWxsb2Moc2l6ZW9mKHVpbnQxNl90KSAqCisJCQkobGFzdF93b3JkIC0gZmlyc3Rfd29yZCArIDEpLCBHRlBfS0VSTkVMKTsKKwlpZighZWVwcm9tX2J1ZmYpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYoaHctPmVlcHJvbS50eXBlID09IGUxMDAwX2VlcHJvbV9zcGkpCisJCXJldF92YWwgPSBlMTAwMF9yZWFkX2VlcHJvbShodywgZmlyc3Rfd29yZCwKKwkJCQkJICAgIGxhc3Rfd29yZCAtIGZpcnN0X3dvcmQgKyAxLAorCQkJCQkgICAgZWVwcm9tX2J1ZmYpOworCWVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgbGFzdF93b3JkIC0gZmlyc3Rfd29yZCArIDE7IGkrKykKKwkJCWlmKChyZXRfdmFsID0gZTEwMDBfcmVhZF9lZXByb20oaHcsIGZpcnN0X3dvcmQgKyBpLCAxLAorCQkJCQkJCSZlZXByb21fYnVmZltpXSkpKQorCQkJCWJyZWFrOworCX0KKworCS8qIERldmljZSdzIGVlcHJvbSBpcyBhbHdheXMgbGl0dGxlLWVuZGlhbiwgd29yZCBhZGRyZXNzYWJsZSAqLworCWZvciAoaSA9IDA7IGkgPCBsYXN0X3dvcmQgLSBmaXJzdF93b3JkICsgMTsgaSsrKQorCQlsZTE2X3RvX2NwdXMoJmVlcHJvbV9idWZmW2ldKTsKKworCW1lbWNweShieXRlcywgKHVpbnQ4X3QgKillZXByb21fYnVmZiArIChlZXByb20tPm9mZnNldCAmIDEpLAorCQkJZWVwcm9tLT5sZW4pOworCWtmcmVlKGVlcHJvbV9idWZmKTsKKworCXJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgaW50CitlMTAwMF9zZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHVpbnQ4X3QgKmJ5dGVzKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdWludDE2X3QgKmVlcHJvbV9idWZmOworCXZvaWQgKnB0cjsKKwlpbnQgbWF4X2xlbiwgZmlyc3Rfd29yZCwgbGFzdF93b3JkLCByZXRfdmFsID0gMDsKKwl1aW50MTZfdCBpOworCisJaWYoZWVwcm9tLT5sZW4gPT0gMCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYoZWVwcm9tLT5tYWdpYyAhPSAoaHctPnZlbmRvcl9pZCB8IChody0+ZGV2aWNlX2lkIDw8IDE2KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJbWF4X2xlbiA9IGh3LT5lZXByb20ud29yZF9zaXplICogMjsKKworCWZpcnN0X3dvcmQgPSBlZXByb20tPm9mZnNldCA+PiAxOworCWxhc3Rfd29yZCA9IChlZXByb20tPm9mZnNldCArIGVlcHJvbS0+bGVuIC0gMSkgPj4gMTsKKwllZXByb21fYnVmZiA9IGttYWxsb2MobWF4X2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYoIWVlcHJvbV9idWZmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXB0ciA9ICh2b2lkICopZWVwcm9tX2J1ZmY7CisKKwlpZihlZXByb20tPm9mZnNldCAmIDEpIHsKKwkJLyogbmVlZCByZWFkL21vZGlmeS93cml0ZSBvZiBmaXJzdCBjaGFuZ2VkIEVFUFJPTSB3b3JkICovCisJCS8qIG9ubHkgdGhlIHNlY29uZCBieXRlIG9mIHRoZSB3b3JkIGlzIGJlaW5nIG1vZGlmaWVkICovCisJCXJldF92YWwgPSBlMTAwMF9yZWFkX2VlcHJvbShodywgZmlyc3Rfd29yZCwgMSwKKwkJCQkJICAgICZlZXByb21fYnVmZlswXSk7CisJCXB0cisrOworCX0KKwlpZigoKGVlcHJvbS0+b2Zmc2V0ICsgZWVwcm9tLT5sZW4pICYgMSkgJiYgKHJldF92YWwgPT0gMCkpIHsKKwkJLyogbmVlZCByZWFkL21vZGlmeS93cml0ZSBvZiBsYXN0IGNoYW5nZWQgRUVQUk9NIHdvcmQgKi8KKwkJLyogb25seSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgd29yZCBpcyBiZWluZyBtb2RpZmllZCAqLworCQlyZXRfdmFsID0gZTEwMDBfcmVhZF9lZXByb20oaHcsIGxhc3Rfd29yZCwgMSwKKwkJICAgICAgICAgICAgICAgICAgJmVlcHJvbV9idWZmW2xhc3Rfd29yZCAtIGZpcnN0X3dvcmRdKTsKKwl9CisKKwkvKiBEZXZpY2UncyBlZXByb20gaXMgYWx3YXlzIGxpdHRsZS1lbmRpYW4sIHdvcmQgYWRkcmVzc2FibGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGFzdF93b3JkIC0gZmlyc3Rfd29yZCArIDE7IGkrKykKKwkJbGUxNl90b19jcHVzKCZlZXByb21fYnVmZltpXSk7CisKKwltZW1jcHkocHRyLCBieXRlcywgZWVwcm9tLT5sZW4pOworCisJZm9yIChpID0gMDsgaSA8IGxhc3Rfd29yZCAtIGZpcnN0X3dvcmQgKyAxOyBpKyspCisJCWVlcHJvbV9idWZmW2ldID0gY3B1X3RvX2xlMTYoZWVwcm9tX2J1ZmZbaV0pOworCisJcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX2VlcHJvbShodywgZmlyc3Rfd29yZCwKKwkJCQkgICAgIGxhc3Rfd29yZCAtIGZpcnN0X3dvcmQgKyAxLCBlZXByb21fYnVmZik7CisKKwkvKiBVcGRhdGUgdGhlIGNoZWNrc3VtIG92ZXIgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIEVFUFJPTSBpZiBuZWVkZWQgKi8KKwlpZigocmV0X3ZhbCA9PSAwKSAmJiBmaXJzdF93b3JkIDw9IEVFUFJPTV9DSEVDS1NVTV9SRUcpCisJCWUxMDAwX3VwZGF0ZV9lZXByb21fY2hlY2tzdW0oaHcpOworCisJa2ZyZWUoZWVwcm9tX2J1ZmYpOworCXJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgdm9pZAorZTEwMDBfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKworCXN0cm5jcHkoZHJ2aW5mby0+ZHJpdmVyLCAgZTEwMDBfZHJpdmVyX25hbWUsIDMyKTsKKwlzdHJuY3B5KGRydmluZm8tPnZlcnNpb24sIGUxMDAwX2RyaXZlcl92ZXJzaW9uLCAzMik7CisJc3RybmNweShkcnZpbmZvLT5md192ZXJzaW9uLCAiTi9BIiwgMzIpOworCXN0cm5jcHkoZHJ2aW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpLCAzMik7CisJZHJ2aW5mby0+bl9zdGF0cyA9IEUxMDAwX1NUQVRTX0xFTjsKKwlkcnZpbmZvLT50ZXN0aW5mb19sZW4gPSBFMTAwMF9URVNUX0xFTjsKKwlkcnZpbmZvLT5yZWdkdW1wX2xlbiA9IGUxMDAwX2dldF9yZWdzX2xlbihuZXRkZXYpOworCWRydmluZm8tPmVlZHVtcF9sZW4gPSBlMTAwMF9nZXRfZWVwcm9tX2xlbihuZXRkZXYpOworfQorCitzdGF0aWMgdm9pZAorZTEwMDBfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJpbmcpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJZTEwMDBfbWFjX3R5cGUgbWFjX3R5cGUgPSBhZGFwdGVyLT5ody5tYWNfdHlwZTsKKwlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nICp0eGRyID0gJmFkYXB0ZXItPnR4X3Jpbmc7CisJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyAqcnhkciA9ICZhZGFwdGVyLT5yeF9yaW5nOworCisJcmluZy0+cnhfbWF4X3BlbmRpbmcgPSAobWFjX3R5cGUgPCBlMTAwMF84MjU0NCkgPyBFMTAwMF9NQVhfUlhEIDoKKwkJRTEwMDBfTUFYXzgyNTQ0X1JYRDsKKwlyaW5nLT50eF9tYXhfcGVuZGluZyA9IChtYWNfdHlwZSA8IGUxMDAwXzgyNTQ0KSA/IEUxMDAwX01BWF9UWEQgOgorCQlFMTAwMF9NQVhfODI1NDRfVFhEOworCXJpbmctPnJ4X21pbmlfbWF4X3BlbmRpbmcgPSAwOworCXJpbmctPnJ4X2p1bWJvX21heF9wZW5kaW5nID0gMDsKKwlyaW5nLT5yeF9wZW5kaW5nID0gcnhkci0+Y291bnQ7CisJcmluZy0+dHhfcGVuZGluZyA9IHR4ZHItPmNvdW50OworCXJpbmctPnJ4X21pbmlfcGVuZGluZyA9IDA7CisJcmluZy0+cnhfanVtYm9fcGVuZGluZyA9IDA7Cit9CisKK3N0YXRpYyBpbnQgCitlMTAwMF9zZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcmluZykKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwllMTAwMF9tYWNfdHlwZSBtYWNfdHlwZSA9IGFkYXB0ZXItPmh3Lm1hY190eXBlOworCXN0cnVjdCBlMTAwMF9kZXNjX3JpbmcgKnR4ZHIgPSAmYWRhcHRlci0+dHhfcmluZzsKKwlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nICpyeGRyID0gJmFkYXB0ZXItPnJ4X3Jpbmc7CisJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyB0eF9vbGQsIHR4X25ldywgcnhfb2xkLCByeF9uZXc7CisJaW50IGVycjsKKworCXR4X29sZCA9IGFkYXB0ZXItPnR4X3Jpbmc7CisJcnhfb2xkID0gYWRhcHRlci0+cnhfcmluZzsKKworCWlmICgocmluZy0+cnhfbWluaV9wZW5kaW5nKSB8fCAocmluZy0+cnhfanVtYm9fcGVuZGluZykpIAorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkKKwkJZTEwMDBfZG93bihhZGFwdGVyKTsKKworCXJ4ZHItPmNvdW50ID0gbWF4KHJpbmctPnJ4X3BlbmRpbmcsKHVpbnQzMl90KUUxMDAwX01JTl9SWEQpOworCXJ4ZHItPmNvdW50ID0gbWluKHJ4ZHItPmNvdW50LCh1aW50MzJfdCkobWFjX3R5cGUgPCBlMTAwMF84MjU0NCA/CisJCUUxMDAwX01BWF9SWEQgOiBFMTAwMF9NQVhfODI1NDRfUlhEKSk7CisJRTEwMDBfUk9VTkRVUChyeGRyLT5jb3VudCwgUkVRX1JYX0RFU0NSSVBUT1JfTVVMVElQTEUpOyAKKworCXR4ZHItPmNvdW50ID0gbWF4KHJpbmctPnR4X3BlbmRpbmcsKHVpbnQzMl90KUUxMDAwX01JTl9UWEQpOworCXR4ZHItPmNvdW50ID0gbWluKHR4ZHItPmNvdW50LCh1aW50MzJfdCkobWFjX3R5cGUgPCBlMTAwMF84MjU0NCA/CisJCUUxMDAwX01BWF9UWEQgOiBFMTAwMF9NQVhfODI1NDRfVFhEKSk7CisJRTEwMDBfUk9VTkRVUCh0eGRyLT5jb3VudCwgUkVRX1RYX0RFU0NSSVBUT1JfTVVMVElQTEUpOyAKKworCWlmKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgeworCQkvKiBUcnkgdG8gZ2V0IG5ldyByZXNvdXJjZXMgYmVmb3JlIGRlbGV0aW5nIG9sZCAqLworCQlpZigoZXJyID0gZTEwMDBfc2V0dXBfcnhfcmVzb3VyY2VzKGFkYXB0ZXIpKSkKKwkJCWdvdG8gZXJyX3NldHVwX3J4OworCQlpZigoZXJyID0gZTEwMDBfc2V0dXBfdHhfcmVzb3VyY2VzKGFkYXB0ZXIpKSkKKwkJCWdvdG8gZXJyX3NldHVwX3R4OworCisJCS8qIHNhdmUgdGhlIG5ldywgcmVzdG9yZSB0aGUgb2xkIGluIG9yZGVyIHRvIGZyZWUgaXQsCisJCSAqIHRoZW4gcmVzdG9yZSB0aGUgbmV3IGJhY2sgYWdhaW4gKi8KKworCQlyeF9uZXcgPSBhZGFwdGVyLT5yeF9yaW5nOworCQl0eF9uZXcgPSBhZGFwdGVyLT50eF9yaW5nOworCQlhZGFwdGVyLT5yeF9yaW5nID0gcnhfb2xkOworCQlhZGFwdGVyLT50eF9yaW5nID0gdHhfb2xkOworCQllMTAwMF9mcmVlX3J4X3Jlc291cmNlcyhhZGFwdGVyKTsKKwkJZTEwMDBfZnJlZV90eF9yZXNvdXJjZXMoYWRhcHRlcik7CisJCWFkYXB0ZXItPnJ4X3JpbmcgPSByeF9uZXc7CisJCWFkYXB0ZXItPnR4X3JpbmcgPSB0eF9uZXc7CisJCWlmKChlcnIgPSBlMTAwMF91cChhZGFwdGVyKSkpCisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworZXJyX3NldHVwX3R4OgorCWUxMDAwX2ZyZWVfcnhfcmVzb3VyY2VzKGFkYXB0ZXIpOworZXJyX3NldHVwX3J4OgorCWFkYXB0ZXItPnJ4X3JpbmcgPSByeF9vbGQ7CisJYWRhcHRlci0+dHhfcmluZyA9IHR4X29sZDsKKwllMTAwMF91cChhZGFwdGVyKTsKKwlyZXR1cm4gZXJyOworfQorCisjZGVmaW5lIFJFR19QQVRURVJOX1RFU1QoUiwgTSwgVykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl1aW50MzJfdCBwYXQsIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl1aW50MzJfdCB0ZXN0W10gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJezB4NUE1QTVBNUEsIDB4QTVBNUE1QTUsIDB4MDAwMDAwMDAsIDB4RkZGRkZGRkZ9OyAgICAgICAgICAgICAgXAorCWZvcihwYXQgPSAwOyBwYXQgPCBzaXplb2YodGVzdCkvc2l6ZW9mKHRlc3RbMF0pOyBwYXQrKykgeyAgICAgICAgICAgICAgXAorCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSLCAodGVzdFtwYXRdICYgVykpOyAgICAgICAgICAgICBcCisJCXZhbHVlID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJaWYodmFsdWUgIT0gKHRlc3RbcGF0XSAmIFcgJiBNKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJKmRhdGEgPSAoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU0MykgPyAgICAgICAgIFwKKwkJCQlFMTAwMF84MjU0Ml8jI1IgOiBFMTAwMF8jI1I7ICAgICAgICAgICAgICAgICAgIFwKKwkJCXJldHVybiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBSRUdfU0VUX0FORF9DSEVDSyhSLCBNLCBXKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJdWludDMyX3QgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUiwgVyAmIE0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJdmFsdWUgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKChXICYgTSkgIT0gKHZhbHVlICYgTSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCSpkYXRhID0gKGFkYXB0ZXItPmh3Lm1hY190eXBlIDwgZTEwMDBfODI1NDMpID8gICAgICAgICAgICAgICAgIFwKKwkJCUUxMDAwXzgyNTQyXyMjUiA6IEUxMDAwXyMjUjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXJldHVybiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworc3RhdGljIGludAorZTEwMDBfcmVnX3Rlc3Qoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsIHVpbnQ2NF90ICpkYXRhKQoreworCXVpbnQzMl90IHZhbHVlOworCXVpbnQzMl90IGk7CisKKwkvKiBUaGUgc3RhdHVzIHJlZ2lzdGVyIGlzIFJlYWQgT25seSwgc28gYSB3cml0ZSBzaG91bGQgZmFpbC4KKwkgKiBTb21lIGJpdHMgdGhhdCBnZXQgdG9nZ2xlZCBhcmUgaWdub3JlZC4KKwkgKi8KKwl2YWx1ZSA9IChFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNUQVRVUykgJiAoMHhGRkZGRjgzMykpOworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFNUQVRVUywgKDB4RkZGRkZGRkYpKTsKKwlpZih2YWx1ZSAhPSAoRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBTVEFUVVMpICYgKDB4RkZGRkY4MzMpKSkgeworCQkqZGF0YSA9IDE7CisJCXJldHVybiAxOworCX0KKworCVJFR19QQVRURVJOX1RFU1QoRkNBTCwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRik7CisJUkVHX1BBVFRFUk5fVEVTVChGQ0FILCAweDAwMDBGRkZGLCAweEZGRkZGRkZGKTsKKwlSRUdfUEFUVEVSTl9URVNUKEZDVCwgMHgwMDAwRkZGRiwgMHhGRkZGRkZGRik7CisJUkVHX1BBVFRFUk5fVEVTVChWRVQsIDB4MDAwMEZGRkYsIDB4RkZGRkZGRkYpOworCVJFR19QQVRURVJOX1RFU1QoUkRUUiwgMHgwMDAwRkZGRiwgMHhGRkZGRkZGRik7CisJUkVHX1BBVFRFUk5fVEVTVChSREJBSCwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRik7CisJUkVHX1BBVFRFUk5fVEVTVChSRExFTiwgMHgwMDBGRkY4MCwgMHgwMDBGRkZGRik7CisJUkVHX1BBVFRFUk5fVEVTVChSREgsIDB4MDAwMEZGRkYsIDB4MDAwMEZGRkYpOworCVJFR19QQVRURVJOX1RFU1QoUkRULCAweDAwMDBGRkZGLCAweDAwMDBGRkZGKTsKKwlSRUdfUEFUVEVSTl9URVNUKEZDUlRILCAweDAwMDBGRkY4LCAweDAwMDBGRkY4KTsKKwlSRUdfUEFUVEVSTl9URVNUKEZDVFRWLCAweDAwMDBGRkZGLCAweDAwMDBGRkZGKTsKKwlSRUdfUEFUVEVSTl9URVNUKFRJUEcsIDB4M0ZGRkZGRkYsIDB4M0ZGRkZGRkYpOworCVJFR19QQVRURVJOX1RFU1QoVERCQUgsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYpOworCVJFR19QQVRURVJOX1RFU1QoVERMRU4sIDB4MDAwRkZGODAsIDB4MDAwRkZGRkYpOworCisJUkVHX1NFVF9BTkRfQ0hFQ0soUkNUTCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCk7CisJUkVHX1NFVF9BTkRfQ0hFQ0soUkNUTCwgMHgwNkRGQjNGRSwgMHgwMDNGRkZGQik7CisJUkVHX1NFVF9BTkRfQ0hFQ0soVENUTCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCk7CisKKwlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgeworCisJCVJFR19TRVRfQU5EX0NIRUNLKFJDVEwsIDB4MDZERkIzRkUsIDB4RkZGRkZGRkYpOworCQlSRUdfUEFUVEVSTl9URVNUKFJEQkFMLCAweEZGRkZGRkYwLCAweEZGRkZGRkZGKTsKKwkJUkVHX1BBVFRFUk5fVEVTVChUWENXLCAweEMwMDBGRkZGLCAweDAwMDBGRkZGKTsKKwkJUkVHX1BBVFRFUk5fVEVTVChUREJBTCwgMHhGRkZGRkZGMCwgMHhGRkZGRkZGRik7CisJCVJFR19QQVRURVJOX1RFU1QoVElEViwgMHgwMDAwRkZGRiwgMHgwMDAwRkZGRik7CisKKwkJZm9yKGkgPSAwOyBpIDwgRTEwMDBfUkFSX0VOVFJJRVM7IGkrKykgeworCQkJUkVHX1BBVFRFUk5fVEVTVChSQSArICgoaSA8PCAxKSA8PCAyKSwgMHhGRkZGRkZGRiwKKwkJCQkJIDB4RkZGRkZGRkYpOworCQkJUkVHX1BBVFRFUk5fVEVTVChSQSArICgoKGkgPDwgMSkgKyAxKSA8PCAyKSwgMHg4MDAzRkZGRiwKKwkJCQkJIDB4RkZGRkZGRkYpOworCQl9CisKKwl9IGVsc2UgeworCisJCVJFR19TRVRfQU5EX0NIRUNLKFJDVEwsIDB4RkZGRkZGRkYsIDB4MDFGRkZGRkYpOworCQlSRUdfUEFUVEVSTl9URVNUKFJEQkFMLCAweEZGRkZGMDAwLCAweEZGRkZGRkZGKTsKKwkJUkVHX1BBVFRFUk5fVEVTVChUWENXLCAweDAwMDBGRkZGLCAweDAwMDBGRkZGKTsKKwkJUkVHX1BBVFRFUk5fVEVTVChUREJBTCwgMHhGRkZGRjAwMCwgMHhGRkZGRkZGRik7CisKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCBFMTAwMF9NQ19UQkxfU0laRTsgaSsrKQorCQlSRUdfUEFUVEVSTl9URVNUKE1UQSArIChpIDw8IDIpLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGKTsKKworCSpkYXRhID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZTEwMDBfZWVwcm9tX3Rlc3Qoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsIHVpbnQ2NF90ICpkYXRhKQoreworCXVpbnQxNl90IHRlbXA7CisJdWludDE2X3QgY2hlY2tzdW0gPSAwOworCXVpbnQxNl90IGk7CisKKwkqZGF0YSA9IDA7CisJLyogUmVhZCBhbmQgYWRkIHVwIHRoZSBjb250ZW50cyBvZiB0aGUgRUVQUk9NICovCisJZm9yKGkgPSAwOyBpIDwgKEVFUFJPTV9DSEVDS1NVTV9SRUcgKyAxKTsgaSsrKSB7CisJCWlmKChlMTAwMF9yZWFkX2VlcHJvbSgmYWRhcHRlci0+aHcsIGksIDEsICZ0ZW1wKSkgPCAwKSB7CisJCQkqZGF0YSA9IDE7CisJCQlicmVhazsKKwkJfQorCQljaGVja3N1bSArPSB0ZW1wOworCX0KKworCS8qIElmIENoZWNrc3VtIGlzIG5vdCBDb3JyZWN0IHJldHVybiBlcnJvciBlbHNlIHRlc3QgcGFzc2VkICovCisJaWYoKGNoZWNrc3VtICE9ICh1aW50MTZfdCkgRUVQUk9NX1NVTSkgJiYgISgqZGF0YSkpCisJCSpkYXRhID0gMjsKKworCXJldHVybiAqZGF0YTsKK30KKworc3RhdGljIGlycXJldHVybl90CitlMTAwMF90ZXN0X2ludHIoaW50IGlycSwKKwkJdm9pZCAqZGF0YSwKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkYXRhOworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCisJYWRhcHRlci0+dGVzdF9pY3IgfD0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBJQ1IpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50CitlMTAwMF9pbnRyX3Rlc3Qoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsIHVpbnQ2NF90ICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisgCXVpbnQzMl90IG1hc2ssIGk9MCwgc2hhcmVkX2ludCA9IFRSVUU7CisgCXVpbnQzMl90IGlycSA9IGFkYXB0ZXItPnBkZXYtPmlycTsKKworCSpkYXRhID0gMDsKKworCS8qIEhvb2sgdXAgdGVzdCBpbnRlcnJ1cHQgaGFuZGxlciBqdXN0IGZvciB0aGlzIHRlc3QgKi8KKyAJaWYoIXJlcXVlc3RfaXJxKGlycSwgJmUxMDAwX3Rlc3RfaW50ciwgMCwgbmV0ZGV2LT5uYW1lLCBuZXRkZXYpKSB7CisgCQlzaGFyZWRfaW50ID0gRkFMU0U7CisgCX0gZWxzZSBpZihyZXF1ZXN0X2lycShpcnEsICZlMTAwMF90ZXN0X2ludHIsIFNBX1NISVJRLCAKKwkJCW5ldGRldi0+bmFtZSwgbmV0ZGV2KSl7CisJCSpkYXRhID0gMTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIERpc2FibGUgYWxsIHRoZSBpbnRlcnJ1cHRzICovCisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSU1DLCAweEZGRkZGRkZGKTsKKwltc2VjX2RlbGF5KDEwKTsKKworCS8qIFRlc3QgZWFjaCBpbnRlcnJ1cHQgKi8KKwlmb3IoOyBpIDwgMTA7IGkrKykgeworCisJCS8qIEludGVycnVwdCB0byB0ZXN0ICovCisJCW1hc2sgPSAxIDw8IGk7CisKKyAJCWlmKCFzaGFyZWRfaW50KSB7CisgCQkJLyogRGlzYWJsZSB0aGUgaW50ZXJydXB0IHRvIGJlIHJlcG9ydGVkIGluCisgCQkJICogdGhlIGNhdXNlIHJlZ2lzdGVyIGFuZCB0aGVuIGZvcmNlIHRoZSBzYW1lCisgCQkJICogaW50ZXJydXB0IGFuZCBzZWUgaWYgb25lIGdldHMgcG9zdGVkLiAgSWYKKyAJCQkgKiBhbiBpbnRlcnJ1cHQgd2FzIHBvc3RlZCB0byB0aGUgYnVzLCB0aGUKKyAJCQkgKiB0ZXN0IGZhaWxlZC4KKyAJCQkgKi8KKyAJCQlhZGFwdGVyLT50ZXN0X2ljciA9IDA7CisgCQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSU1DLCBtYXNrKTsKKyAJCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJQ1MsIG1hc2spOworIAkJCW1zZWNfZGVsYXkoMTApOworIAorIAkJCWlmKGFkYXB0ZXItPnRlc3RfaWNyICYgbWFzaykgeworIAkJCQkqZGF0YSA9IDM7CisgCQkJCWJyZWFrOworIAkJCX0KKwkJfQorCisJCS8qIEVuYWJsZSB0aGUgaW50ZXJydXB0IHRvIGJlIHJlcG9ydGVkIGluCisJCSAqIHRoZSBjYXVzZSByZWdpc3RlciBhbmQgdGhlbiBmb3JjZSB0aGUgc2FtZQorCQkgKiBpbnRlcnJ1cHQgYW5kIHNlZSBpZiBvbmUgZ2V0cyBwb3N0ZWQuICBJZgorCQkgKiBhbiBpbnRlcnJ1cHQgd2FzIG5vdCBwb3N0ZWQgdG8gdGhlIGJ1cywgdGhlCisJCSAqIHRlc3QgZmFpbGVkLgorCQkgKi8KKwkJYWRhcHRlci0+dGVzdF9pY3IgPSAwOworCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJTVMsIG1hc2spOworCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJQ1MsIG1hc2spOworCQltc2VjX2RlbGF5KDEwKTsKKworCQlpZighKGFkYXB0ZXItPnRlc3RfaWNyICYgbWFzaykpIHsKKwkJCSpkYXRhID0gNDsKKwkJCWJyZWFrOworCQl9CisKKyAJCWlmKCFzaGFyZWRfaW50KSB7CisJCQkvKiBEaXNhYmxlIHRoZSBvdGhlciBpbnRlcnJ1cHRzIHRvIGJlIHJlcG9ydGVkIGluCisJCQkgKiB0aGUgY2F1c2UgcmVnaXN0ZXIgYW5kIHRoZW4gZm9yY2UgdGhlIG90aGVyCisJCQkgKiBpbnRlcnJ1cHRzIGFuZCBzZWUgaWYgYW55IGdldCBwb3N0ZWQuICBJZgorCQkJICogYW4gaW50ZXJydXB0IHdhcyBwb3N0ZWQgdG8gdGhlIGJ1cywgdGhlCisJCQkgKiB0ZXN0IGZhaWxlZC4KKwkJCSAqLworCQkJYWRhcHRlci0+dGVzdF9pY3IgPSAwOworCQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSU1DLCAKKwkJCQkJKH5tYXNrICYgMHgwMDAwN0ZGRikpOworCQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSUNTLCAKKwkJCQkJKH5tYXNrICYgMHgwMDAwN0ZGRikpOworCQkJbXNlY19kZWxheSgxMCk7CisKKwkJCWlmKGFkYXB0ZXItPnRlc3RfaWNyKSB7CisJCQkJKmRhdGEgPSA1OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLyogRGlzYWJsZSBhbGwgdGhlIGludGVycnVwdHMgKi8KKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJTUMsIDB4RkZGRkZGRkYpOworCW1zZWNfZGVsYXkoMTApOworCisJLyogVW5ob29rIHRlc3QgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlmcmVlX2lycShpcnEsIG5ldGRldik7CisKKwlyZXR1cm4gKmRhdGE7Cit9CisKK3N0YXRpYyB2b2lkCitlMTAwMF9mcmVlX2Rlc2NfcmluZ3Moc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyAqdHhkciA9ICZhZGFwdGVyLT50ZXN0X3R4X3Jpbmc7CisJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyAqcnhkciA9ICZhZGFwdGVyLT50ZXN0X3J4X3Jpbmc7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCWludCBpOworCisJaWYodHhkci0+ZGVzYyAmJiB0eGRyLT5idWZmZXJfaW5mbykgeworCQlmb3IoaSA9IDA7IGkgPCB0eGRyLT5jb3VudDsgaSsrKSB7CisJCQlpZih0eGRyLT5idWZmZXJfaW5mb1tpXS5kbWEpCisJCQkJcGNpX3VubWFwX3NpbmdsZShwZGV2LCB0eGRyLT5idWZmZXJfaW5mb1tpXS5kbWEsCisJCQkJCQkgdHhkci0+YnVmZmVyX2luZm9baV0ubGVuZ3RoLAorCQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJaWYodHhkci0+YnVmZmVyX2luZm9baV0uc2tiKQorCQkJCWRldl9rZnJlZV9za2IodHhkci0+YnVmZmVyX2luZm9baV0uc2tiKTsKKwkJfQorCX0KKworCWlmKHJ4ZHItPmRlc2MgJiYgcnhkci0+YnVmZmVyX2luZm8pIHsKKwkJZm9yKGkgPSAwOyBpIDwgcnhkci0+Y291bnQ7IGkrKykgeworCQkJaWYocnhkci0+YnVmZmVyX2luZm9baV0uZG1hKQorCQkJCXBjaV91bm1hcF9zaW5nbGUocGRldiwgcnhkci0+YnVmZmVyX2luZm9baV0uZG1hLAorCQkJCQkJIHJ4ZHItPmJ1ZmZlcl9pbmZvW2ldLmxlbmd0aCwKKwkJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJaWYocnhkci0+YnVmZmVyX2luZm9baV0uc2tiKQorCQkJCWRldl9rZnJlZV9za2Iocnhkci0+YnVmZmVyX2luZm9baV0uc2tiKTsKKwkJfQorCX0KKworCWlmKHR4ZHItPmRlc2MpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgdHhkci0+c2l6ZSwgdHhkci0+ZGVzYywgdHhkci0+ZG1hKTsKKwlpZihyeGRyLT5kZXNjKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHJ4ZHItPnNpemUsIHJ4ZHItPmRlc2MsIHJ4ZHItPmRtYSk7CisKKwlpZih0eGRyLT5idWZmZXJfaW5mbykKKwkJa2ZyZWUodHhkci0+YnVmZmVyX2luZm8pOworCWlmKHJ4ZHItPmJ1ZmZlcl9pbmZvKQorCQlrZnJlZShyeGRyLT5idWZmZXJfaW5mbyk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKK2UxMDAwX3NldHVwX2Rlc2NfcmluZ3Moc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyAqdHhkciA9ICZhZGFwdGVyLT50ZXN0X3R4X3Jpbmc7CisJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyAqcnhkciA9ICZhZGFwdGVyLT50ZXN0X3J4X3Jpbmc7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCXVpbnQzMl90IHJjdGw7CisJaW50IHNpemUsIGksIHJldF92YWw7CisKKwkvKiBTZXR1cCBUeCBkZXNjcmlwdG9yIHJpbmcgYW5kIFR4IGJ1ZmZlcnMgKi8KKworCXR4ZHItPmNvdW50ID0gODA7CisKKwlzaXplID0gdHhkci0+Y291bnQgKiBzaXplb2Yoc3RydWN0IGUxMDAwX2J1ZmZlcik7CisJaWYoISh0eGRyLT5idWZmZXJfaW5mbyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCkpKSB7CisJCXJldF92YWwgPSAxOworCQlnb3RvIGVycl9ub21lbTsKKwl9CisJbWVtc2V0KHR4ZHItPmJ1ZmZlcl9pbmZvLCAwLCBzaXplKTsKKworCXR4ZHItPnNpemUgPSB0eGRyLT5jb3VudCAqIHNpemVvZihzdHJ1Y3QgZTEwMDBfdHhfZGVzYyk7CisJRTEwMDBfUk9VTkRVUCh0eGRyLT5zaXplLCA0MDk2KTsKKwlpZighKHR4ZHItPmRlc2MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCB0eGRyLT5zaXplLCAmdHhkci0+ZG1hKSkpIHsKKwkJcmV0X3ZhbCA9IDI7CisJCWdvdG8gZXJyX25vbWVtOworCX0KKwltZW1zZXQodHhkci0+ZGVzYywgMCwgdHhkci0+c2l6ZSk7CisJdHhkci0+bmV4dF90b191c2UgPSB0eGRyLT5uZXh0X3RvX2NsZWFuID0gMDsKKworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFREQkFMLAorCQkJKCh1aW50NjRfdCkgdHhkci0+ZG1hICYgMHgwMDAwMDAwMEZGRkZGRkZGKSk7CisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgVERCQUgsICgodWludDY0X3QpIHR4ZHItPmRtYSA+PiAzMikpOworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFRETEVOLAorCQkJdHhkci0+Y291bnQgKiBzaXplb2Yoc3RydWN0IGUxMDAwX3R4X2Rlc2MpKTsKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBUREgsIDApOworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFREVCwgMCk7CisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgVENUTCwKKwkJCUUxMDAwX1RDVExfUFNQIHwgRTEwMDBfVENUTF9FTiB8CisJCQlFMTAwMF9DT0xMSVNJT05fVEhSRVNIT0xEIDw8IEUxMDAwX0NUX1NISUZUIHwKKwkJCUUxMDAwX0ZEWF9DT0xMSVNJT05fRElTVEFOQ0UgPDwgRTEwMDBfQ09MRF9TSElGVCk7CisKKwlmb3IoaSA9IDA7IGkgPCB0eGRyLT5jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBlMTAwMF90eF9kZXNjICp0eF9kZXNjID0gRTEwMDBfVFhfREVTQygqdHhkciwgaSk7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXVuc2lnbmVkIGludCBzaXplID0gMTAyNDsKKworCQlpZighKHNrYiA9IGFsbG9jX3NrYihzaXplLCBHRlBfS0VSTkVMKSkpIHsKKwkJCXJldF92YWwgPSAzOworCQkJZ290byBlcnJfbm9tZW07CisJCX0KKwkJc2tiX3B1dChza2IsIHNpemUpOworCQl0eGRyLT5idWZmZXJfaW5mb1tpXS5za2IgPSBza2I7CisJCXR4ZHItPmJ1ZmZlcl9pbmZvW2ldLmxlbmd0aCA9IHNrYi0+bGVuOworCQl0eGRyLT5idWZmZXJfaW5mb1tpXS5kbWEgPQorCQkJcGNpX21hcF9zaW5nbGUocGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwKKwkJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisJCXR4X2Rlc2MtPmJ1ZmZlcl9hZGRyID0gY3B1X3RvX2xlNjQodHhkci0+YnVmZmVyX2luZm9baV0uZG1hKTsKKwkJdHhfZGVzYy0+bG93ZXIuZGF0YSA9IGNwdV90b19sZTMyKHNrYi0+bGVuKTsKKwkJdHhfZGVzYy0+bG93ZXIuZGF0YSB8PSBjcHVfdG9fbGUzMihFMTAwMF9UWERfQ01EX0VPUCB8CisJCQkJCQkgICBFMTAwMF9UWERfQ01EX0lGQ1MgfAorCQkJCQkJICAgRTEwMDBfVFhEX0NNRF9SUFMpOworCQl0eF9kZXNjLT51cHBlci5kYXRhID0gMDsKKwl9CisKKwkvKiBTZXR1cCBSeCBkZXNjcmlwdG9yIHJpbmcgYW5kIFJ4IGJ1ZmZlcnMgKi8KKworCXJ4ZHItPmNvdW50ID0gODA7CisKKwlzaXplID0gcnhkci0+Y291bnQgKiBzaXplb2Yoc3RydWN0IGUxMDAwX2J1ZmZlcik7CisJaWYoIShyeGRyLT5idWZmZXJfaW5mbyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCkpKSB7CisJCXJldF92YWwgPSA0OworCQlnb3RvIGVycl9ub21lbTsKKwl9CisJbWVtc2V0KHJ4ZHItPmJ1ZmZlcl9pbmZvLCAwLCBzaXplKTsKKworCXJ4ZHItPnNpemUgPSByeGRyLT5jb3VudCAqIHNpemVvZihzdHJ1Y3QgZTEwMDBfcnhfZGVzYyk7CisJaWYoIShyeGRyLT5kZXNjID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgcnhkci0+c2l6ZSwgJnJ4ZHItPmRtYSkpKSB7CisJCXJldF92YWwgPSA1OworCQlnb3RvIGVycl9ub21lbTsKKwl9CisJbWVtc2V0KHJ4ZHItPmRlc2MsIDAsIHJ4ZHItPnNpemUpOworCXJ4ZHItPm5leHRfdG9fdXNlID0gcnhkci0+bmV4dF90b19jbGVhbiA9IDA7CisKKwlyY3RsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMKTsKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMLCByY3RsICYgfkUxMDAwX1JDVExfRU4pOworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJEQkFMLAorCQkJKCh1aW50NjRfdCkgcnhkci0+ZG1hICYgMHhGRkZGRkZGRikpOworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJEQkFILCAoKHVpbnQ2NF90KSByeGRyLT5kbWEgPj4gMzIpKTsKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSRExFTiwgcnhkci0+c2l6ZSk7CisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkRILCAwKTsKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSRFQsIDApOworCXJjdGwgPSBFMTAwMF9SQ1RMX0VOIHwgRTEwMDBfUkNUTF9CQU0gfCBFMTAwMF9SQ1RMX1NaXzIwNDggfAorCQlFMTAwMF9SQ1RMX0xCTV9OTyB8IEUxMDAwX1JDVExfUkRNVFNfSEFMRiB8CisJCShhZGFwdGVyLT5ody5tY19maWx0ZXJfdHlwZSA8PCBFMTAwMF9SQ1RMX01PX1NISUZUKTsKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMLCByY3RsKTsKKworCWZvcihpID0gMDsgaSA8IHJ4ZHItPmNvdW50OyBpKyspIHsKKwkJc3RydWN0IGUxMDAwX3J4X2Rlc2MgKnJ4X2Rlc2MgPSBFMTAwMF9SWF9ERVNDKCpyeGRyLCBpKTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlpZighKHNrYiA9IGFsbG9jX3NrYihFMTAwMF9SWEJVRkZFUl8yMDQ4ICsgTkVUX0lQX0FMSUdOLCAKKwkJCQlHRlBfS0VSTkVMKSkpIHsKKwkJCXJldF92YWwgPSA2OworCQkJZ290byBlcnJfbm9tZW07CisJCX0KKwkJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOworCQlyeGRyLT5idWZmZXJfaW5mb1tpXS5za2IgPSBza2I7CisJCXJ4ZHItPmJ1ZmZlcl9pbmZvW2ldLmxlbmd0aCA9IEUxMDAwX1JYQlVGRkVSXzIwNDg7CisJCXJ4ZHItPmJ1ZmZlcl9pbmZvW2ldLmRtYSA9CisJCQlwY2lfbWFwX3NpbmdsZShwZGV2LCBza2ItPmRhdGEsIEUxMDAwX1JYQlVGRkVSXzIwNDgsCisJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCXJ4X2Rlc2MtPmJ1ZmZlcl9hZGRyID0gY3B1X3RvX2xlNjQocnhkci0+YnVmZmVyX2luZm9baV0uZG1hKTsKKwkJbWVtc2V0KHNrYi0+ZGF0YSwgMHgwMCwgc2tiLT5sZW4pOworCX0KKworCXJldHVybiAwOworCitlcnJfbm9tZW06CisJZTEwMDBfZnJlZV9kZXNjX3JpbmdzKGFkYXB0ZXIpOworCXJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgdm9pZAorZTEwMDBfcGh5X2Rpc2FibGVfcmVjZWl2ZXIoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJLyogV3JpdGUgb3V0IHRvIFBIWSByZWdpc3RlcnMgMjkgYW5kIDMwIHRvIGRpc2FibGUgdGhlIFJlY2VpdmVyLiAqLworCWUxMDAwX3dyaXRlX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCAyOSwgMHgwMDFGKTsKKwllMTAwMF93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgMzAsIDB4OEZGQyk7CisJZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIDI5LCAweDAwMUEpOworCWUxMDAwX3dyaXRlX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCAzMCwgMHg4RkYwKTsKK30KKworc3RhdGljIHZvaWQKK2UxMDAwX3BoeV9yZXNldF9jbGtfYW5kX2NycyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1aW50MTZfdCBwaHlfcmVnOworCisJLyogQmVjYXVzZSB3ZSByZXNldCB0aGUgUEhZIGFib3ZlLCB3ZSBuZWVkIHRvIHJlLWZvcmNlIFRYX0NMSyBpbiB0aGUKKwkgKiBFeHRlbmRlZCBQSFkgU3BlY2lmaWMgQ29udHJvbCBSZWdpc3RlciB0byAyNU1IeiBjbG9jay4gIFRoaXMKKwkgKiB2YWx1ZSBkZWZhdWx0cyBiYWNrIHRvIGEgMi41TUh6IGNsb2NrIHdoZW4gdGhlIFBIWSBpcyByZXNldC4KKwkgKi8KKwllMTAwMF9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBNODhFMTAwMF9FWFRfUEhZX1NQRUNfQ1RSTCwgJnBoeV9yZWcpOworCXBoeV9yZWcgfD0gTTg4RTEwMDBfRVBTQ1JfVFhfQ0xLXzI1OworCWUxMDAwX3dyaXRlX3BoeV9yZWcoJmFkYXB0ZXItPmh3LAorCQlNODhFMTAwMF9FWFRfUEhZX1NQRUNfQ1RSTCwgcGh5X3JlZyk7CisKKwkvKiBJbiBhZGRpdGlvbiwgYmVjYXVzZSBvZiB0aGUgcy93IHJlc2V0IGFib3ZlLCB3ZSBuZWVkIHRvIGVuYWJsZQorCSAqIENSUyBvbiBUWC4gIFRoaXMgbXVzdCBiZSBzZXQgZm9yIGJvdGggZnVsbCBhbmQgaGFsZiBkdXBsZXgKKwkgKiBvcGVyYXRpb24uCisJICovCisJZTEwMDBfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgJnBoeV9yZWcpOworCXBoeV9yZWcgfD0gTTg4RTEwMDBfUFNDUl9BU1NFUlRfQ1JTX09OX1RYOworCWUxMDAwX3dyaXRlX3BoeV9yZWcoJmFkYXB0ZXItPmh3LAorCQlNODhFMTAwMF9QSFlfU1BFQ19DVFJMLCBwaHlfcmVnKTsKK30KKworc3RhdGljIGludAorZTEwMDBfbm9uaW50ZWdyYXRlZF9waHlfbG9vcGJhY2soc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdWludDMyX3QgY3RybF9yZWc7CisJdWludDE2X3QgcGh5X3JlZzsKKworCS8qIFNldHVwIHRoZSBEZXZpY2UgQ29udHJvbCBSZWdpc3RlciBmb3IgUEhZIGxvb3BiYWNrIHRlc3QuICovCisKKwljdHJsX3JlZyA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgQ1RSTCk7CisJY3RybF9yZWcgfD0gKEUxMDAwX0NUUkxfSUxPUyB8CQkvKiBJbnZlcnQgTG9zcy1PZi1TaWduYWwgKi8KKwkJICAgICBFMTAwMF9DVFJMX0ZSQ1NQRCB8CS8qIFNldCB0aGUgRm9yY2UgU3BlZWQgQml0ICovCisJCSAgICAgRTEwMDBfQ1RSTF9GUkNEUFggfAkvKiBTZXQgdGhlIEZvcmNlIER1cGxleCBCaXQgKi8KKwkJICAgICBFMTAwMF9DVFJMX1NQRF8xMDAwIHwJLyogRm9yY2UgU3BlZWQgdG8gMTAwMCAqLworCQkgICAgIEUxMDAwX0NUUkxfRkQpOwkJLyogRm9yY2UgRHVwbGV4IHRvIEZVTEwgKi8KKworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIENUUkwsIGN0cmxfcmVnKTsKKworCS8qIFJlYWQgdGhlIFBIWSBTcGVjaWZpYyBDb250cm9sIFJlZ2lzdGVyICgweDEwKSAqLworCWUxMDAwX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsICZwaHlfcmVnKTsKKworCS8qIENsZWFyIEF1dG8tQ3Jvc3NvdmVyIGJpdHMgaW4gUEhZIFNwZWNpZmljIENvbnRyb2wgUmVnaXN0ZXIKKwkgKiAoYml0cyA2OjUpLgorCSAqLworCXBoeV9yZWcgJj0gfk04OEUxMDAwX1BTQ1JfQVVUT19YX01PREU7CisJZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsIHBoeV9yZWcpOworCisJLyogUGVyZm9ybSBzb2Z0d2FyZSByZXNldCBvbiB0aGUgUEhZICovCisJZTEwMDBfcGh5X3Jlc2V0KCZhZGFwdGVyLT5odyk7CisKKwkvKiBIYXZlIHRvIHNldHVwIFRYX0NMSyBhbmQgVFhfQ1JTIGFmdGVyIHNvZnR3YXJlIHJlc2V0ICovCisJZTEwMDBfcGh5X3Jlc2V0X2Nsa19hbmRfY3JzKGFkYXB0ZXIpOworCisJZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIFBIWV9DVFJMLCAweDgxMDApOworCisJLyogV2FpdCBmb3IgcmVzZXQgdG8gY29tcGxldGUuICovCisJdWRlbGF5KDUwMCk7CisKKwkvKiBIYXZlIHRvIHNldHVwIFRYX0NMSyBhbmQgVFhfQ1JTIGFmdGVyIHNvZnR3YXJlIHJlc2V0ICovCisJZTEwMDBfcGh5X3Jlc2V0X2Nsa19hbmRfY3JzKGFkYXB0ZXIpOworCisJLyogV3JpdGUgb3V0IHRvIFBIWSByZWdpc3RlcnMgMjkgYW5kIDMwIHRvIGRpc2FibGUgdGhlIFJlY2VpdmVyLiAqLworCWUxMDAwX3BoeV9kaXNhYmxlX3JlY2VpdmVyKGFkYXB0ZXIpOworCisJLyogU2V0IHRoZSBsb29wYmFjayBiaXQgaW4gdGhlIFBIWSBjb250cm9sIHJlZ2lzdGVyLiAqLworCWUxMDAwX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIFBIWV9DVFJMLCAmcGh5X3JlZyk7CisJcGh5X3JlZyB8PSBNSUlfQ1JfTE9PUEJBQ0s7CisJZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIFBIWV9DVFJMLCBwaHlfcmVnKTsKKworCS8qIFNldHVwIFRYX0NMSyBhbmQgVFhfQ1JTIG9uZSBtb3JlIHRpbWUuICovCisJZTEwMDBfcGh5X3Jlc2V0X2Nsa19hbmRfY3JzKGFkYXB0ZXIpOworCisJLyogQ2hlY2sgUGh5IENvbmZpZ3VyYXRpb24gKi8KKwllMTAwMF9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBQSFlfQ1RSTCwgJnBoeV9yZWcpOworCWlmKHBoeV9yZWcgIT0gMHg0MTAwKQorCQkgcmV0dXJuIDk7CisKKwllMTAwMF9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBNODhFMTAwMF9FWFRfUEhZX1NQRUNfQ1RSTCwgJnBoeV9yZWcpOworCWlmKHBoeV9yZWcgIT0gMHgwMDcwKQorCQlyZXR1cm4gMTA7CisKKwllMTAwMF9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCAyOSwgJnBoeV9yZWcpOworCWlmKHBoeV9yZWcgIT0gMHgwMDFBKQorCQlyZXR1cm4gMTE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZTEwMDBfaW50ZWdyYXRlZF9waHlfbG9vcGJhY2soc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdWludDMyX3QgY3RybF9yZWcgPSAwOworCXVpbnQzMl90IHN0YXRfcmVnID0gMDsKKworCWFkYXB0ZXItPmh3LmF1dG9uZWcgPSBGQUxTRTsKKworCWlmKGFkYXB0ZXItPmh3LnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpIHsKKwkJLyogQXV0by1NREkvTURJWCBPZmYgKi8KKwkJZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsCisJCQkJICAgIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsIDB4MDgwOCk7CisJCS8qIHJlc2V0IHRvIHVwZGF0ZSBBdXRvLU1ESS9NRElYICovCisJCWUxMDAwX3dyaXRlX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBQSFlfQ1RSTCwgMHg5MTQwKTsKKwkJLyogYXV0b25lZyBvZmYgKi8KKwkJZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIFBIWV9DVFJMLCAweDgxNDApOworCX0KKwkvKiBmb3JjZSAxMDAwLCBzZXQgbG9vcGJhY2sgKi8KKwllMTAwMF93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZX0NUUkwsIDB4NDE0MCk7CisKKwkvKiBOb3cgc2V0IHVwIHRoZSBNQUMgdG8gdGhlIHNhbWUgc3BlZWQvZHVwbGV4IGFzIHRoZSBQSFkuICovCisJY3RybF9yZWcgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIENUUkwpOworCWN0cmxfcmVnICY9IH5FMTAwMF9DVFJMX1NQRF9TRUw7IC8qIENsZWFyIHRoZSBzcGVlZCBzZWwgYml0cyAqLworCWN0cmxfcmVnIHw9IChFMTAwMF9DVFJMX0ZSQ1NQRCB8IC8qIFNldCB0aGUgRm9yY2UgU3BlZWQgQml0ICovCisJCSAgICAgRTEwMDBfQ1RSTF9GUkNEUFggfCAvKiBTZXQgdGhlIEZvcmNlIER1cGxleCBCaXQgKi8KKwkJICAgICBFMTAwMF9DVFJMX1NQRF8xMDAwIHwvKiBGb3JjZSBTcGVlZCB0byAxMDAwICovCisJCSAgICAgRTEwMDBfQ1RSTF9GRCk7CSAvKiBGb3JjZSBEdXBsZXggdG8gRlVMTCAqLworCisJaWYoYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlciAmJgorCSAgIGFkYXB0ZXItPmh3LnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpIHsKKwkJY3RybF9yZWcgfD0gRTEwMDBfQ1RSTF9JTE9TOyAvKiBJbnZlcnQgTG9zcyBvZiBTaWduYWwgKi8KKwl9IGVsc2UgeworCQkvKiBTZXQgdGhlIElMT1MgYml0IG9uIHRoZSBmaWJlciBOaWMgaXMgaGFsZgorCQkgKiBkdXBsZXggbGluayBpcyBkZXRlY3RlZC4gKi8KKwkJc3RhdF9yZWcgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNUQVRVUyk7CisJCWlmKChzdGF0X3JlZyAmIEUxMDAwX1NUQVRVU19GRCkgPT0gMCkKKwkJCWN0cmxfcmVnIHw9IChFMTAwMF9DVFJMX0lMT1MgfCBFMTAwMF9DVFJMX1NMVSk7CisJfQorCisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgQ1RSTCwgY3RybF9yZWcpOworCisJLyogRGlzYWJsZSB0aGUgcmVjZWl2ZXIgb24gdGhlIFBIWSBzbyB3aGVuIGEgY2FibGUgaXMgcGx1Z2dlZCBpbiwgdGhlCisJICogUEhZIGRvZXMgbm90IGJlZ2luIHRvIGF1dG9uZWcgd2hlbiBhIGNhYmxlIGlzIHJlY29ubmVjdGVkIHRvIHRoZSBOSUMuCisJICovCisJaWYoYWRhcHRlci0+aHcucGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkKKwkJZTEwMDBfcGh5X2Rpc2FibGVfcmVjZWl2ZXIoYWRhcHRlcik7CisKKwl1ZGVsYXkoNTAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitlMTAwMF9zZXRfcGh5X2xvb3BiYWNrKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCXVpbnQxNl90IHBoeV9yZWcgPSAwOworCXVpbnQxNl90IGNvdW50ID0gMDsKKworCXN3aXRjaCAoYWRhcHRlci0+aHcubWFjX3R5cGUpIHsKKwljYXNlIGUxMDAwXzgyNTQzOgorCQlpZihhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CisJCQkvKiBBdHRlbXB0IHRvIHNldHVwIExvb3BiYWNrIG1vZGUgb24gTm9uLWludGVncmF0ZWQgUEhZLgorCQkJICogU29tZSBQSFkgcmVnaXN0ZXJzIGdldCBjb3JydXB0ZWQgYXQgcmFuZG9tLCBzbworCQkJICogYXR0ZW1wdCB0aGlzIDEwIHRpbWVzLgorCQkJICovCisJCQl3aGlsZShlMTAwMF9ub25pbnRlZ3JhdGVkX3BoeV9sb29wYmFjayhhZGFwdGVyKSAmJgorCQkJICAgICAgY291bnQrKyA8IDEwKTsKKwkJCWlmKGNvdW50IDwgMTEpCisJCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGUxMDAwXzgyNTQ0OgorCWNhc2UgZTEwMDBfODI1NDA6CisJY2FzZSBlMTAwMF84MjU0NToKKwljYXNlIGUxMDAwXzgyNTQ1X3Jldl8zOgorCWNhc2UgZTEwMDBfODI1NDY6CisJY2FzZSBlMTAwMF84MjU0Nl9yZXZfMzoKKwljYXNlIGUxMDAwXzgyNTQxOgorCWNhc2UgZTEwMDBfODI1NDFfcmV2XzI6CisJY2FzZSBlMTAwMF84MjU0NzoKKwljYXNlIGUxMDAwXzgyNTQ3X3Jldl8yOgorCQlyZXR1cm4gZTEwMDBfaW50ZWdyYXRlZF9waHlfbG9vcGJhY2soYWRhcHRlcik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogRGVmYXVsdCBQSFkgbG9vcGJhY2sgd29yayBpcyB0byByZWFkIHRoZSBNSUkKKwkJICogY29udHJvbCByZWdpc3RlciBhbmQgYXNzZXJ0IGJpdCAxNCAobG9vcGJhY2sgbW9kZSkuCisJCSAqLworCQllMTAwMF9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBQSFlfQ1RSTCwgJnBoeV9yZWcpOworCQlwaHlfcmVnIHw9IE1JSV9DUl9MT09QQkFDSzsKKwkJZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIFBIWV9DVFJMLCBwaHlfcmVnKTsKKwkJcmV0dXJuIDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiA4OworfQorCitzdGF0aWMgaW50CitlMTAwMF9zZXR1cF9sb29wYmFja190ZXN0KHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCXVpbnQzMl90IHJjdGw7CisKKwlpZihhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIgfHwKKwkgICBhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSB7CisJCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTQ1IHx8CisJCSAgIGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTQ2IHx8CisJCSAgIGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTQ1X3Jldl8zIHx8CisJCSAgIGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTQ2X3Jldl8zKQorCQkJcmV0dXJuIGUxMDAwX3NldF9waHlfbG9vcGJhY2soYWRhcHRlcik7CisJCWVsc2UgeworCQkJcmN0bCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkNUTCk7CisJCQlyY3RsIHw9IEUxMDAwX1JDVExfTEJNX1RDVlI7CisJCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMLCByY3RsKTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIGlmKGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpCisJCXJldHVybiBlMTAwMF9zZXRfcGh5X2xvb3BiYWNrKGFkYXB0ZXIpOworCisJcmV0dXJuIDc7Cit9CisKK3N0YXRpYyB2b2lkCitlMTAwMF9sb29wYmFja19jbGVhbnVwKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCXVpbnQzMl90IHJjdGw7CisJdWludDE2X3QgcGh5X3JlZzsKKworCXJjdGwgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJDVEwpOworCXJjdGwgJj0gfihFMTAwMF9SQ1RMX0xCTV9UQ1ZSIHwgRTEwMDBfUkNUTF9MQk1fTUFDKTsKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMLCByY3RsKTsKKworCWlmKGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIgfHwKKwkgICAoKGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlciB8fAorCSAgICAgYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykgJiYKKwkgICAgKGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTQ1IHx8CisJICAgICBhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NiB8fAorCSAgICAgYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NDVfcmV2XzMgfHwKKwkgICAgIGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTQ2X3Jldl8zKSkpIHsKKwkJYWRhcHRlci0+aHcuYXV0b25lZyA9IFRSVUU7CisJCWUxMDAwX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIFBIWV9DVFJMLCAmcGh5X3JlZyk7CisJCWlmKHBoeV9yZWcgJiBNSUlfQ1JfTE9PUEJBQ0spIHsKKwkJCXBoeV9yZWcgJj0gfk1JSV9DUl9MT09QQkFDSzsKKwkJCWUxMDAwX3dyaXRlX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBQSFlfQ1RSTCwgcGh5X3JlZyk7CisJCQllMTAwMF9waHlfcmVzZXQoJmFkYXB0ZXItPmh3KTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK2UxMDAwX2NyZWF0ZV9sYnRlc3RfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGZyYW1lX3NpemUpCit7CisJbWVtc2V0KHNrYi0+ZGF0YSwgMHhGRiwgZnJhbWVfc2l6ZSk7CisJZnJhbWVfc2l6ZSA9IChmcmFtZV9zaXplICUgMikgPyAoZnJhbWVfc2l6ZSAtIDEpIDogZnJhbWVfc2l6ZTsKKwltZW1zZXQoJnNrYi0+ZGF0YVtmcmFtZV9zaXplIC8gMl0sIDB4QUEsIGZyYW1lX3NpemUgLyAyIC0gMSk7CisJbWVtc2V0KCZza2ItPmRhdGFbZnJhbWVfc2l6ZSAvIDIgKyAxMF0sIDB4QkUsIDEpOworCW1lbXNldCgmc2tiLT5kYXRhW2ZyYW1lX3NpemUgLyAyICsgMTJdLCAweEFGLCAxKTsKK30KKworc3RhdGljIGludAorZTEwMDBfY2hlY2tfbGJ0ZXN0X2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBmcmFtZV9zaXplKQoreworCWZyYW1lX3NpemUgPSAoZnJhbWVfc2l6ZSAlIDIpID8gKGZyYW1lX3NpemUgLSAxKSA6IGZyYW1lX3NpemU7CisJaWYoKihza2ItPmRhdGEgKyAzKSA9PSAweEZGKSB7CisJCWlmKCgqKHNrYi0+ZGF0YSArIGZyYW1lX3NpemUgLyAyICsgMTApID09IDB4QkUpICYmCisJCSAgICgqKHNrYi0+ZGF0YSArIGZyYW1lX3NpemUgLyAyICsgMTIpID09IDB4QUYpKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gMTM7Cit9CisKK3N0YXRpYyBpbnQKK2UxMDAwX3J1bl9sb29wYmFja190ZXN0KHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBlMTAwMF9kZXNjX3JpbmcgKnR4ZHIgPSAmYWRhcHRlci0+dGVzdF90eF9yaW5nOworCXN0cnVjdCBlMTAwMF9kZXNjX3JpbmcgKnJ4ZHIgPSAmYWRhcHRlci0+dGVzdF9yeF9yaW5nOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKwlpbnQgaSwgcmV0X3ZhbDsKKworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJEVCwgcnhkci0+Y291bnQgLSAxKTsKKworCWZvcihpID0gMDsgaSA8IDY0OyBpKyspIHsKKwkJZTEwMDBfY3JlYXRlX2xidGVzdF9mcmFtZSh0eGRyLT5idWZmZXJfaW5mb1tpXS5za2IsIDEwMjQpOworCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UocGRldiwgdHhkci0+YnVmZmVyX2luZm9baV0uZG1hLAorCQkJCQkgICAgdHhkci0+YnVmZmVyX2luZm9baV0ubGVuZ3RoLAorCQkJCQkgICAgUENJX0RNQV9UT0RFVklDRSk7CisJfQorCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFREVCwgaSk7CisKKwltc2VjX2RlbGF5KDIwMCk7CisKKwlpID0gMDsKKwlkbyB7CisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShwZGV2LCByeGRyLT5idWZmZXJfaW5mb1tpXS5kbWEsCisJCQkJCSAgICByeGRyLT5idWZmZXJfaW5mb1tpXS5sZW5ndGgsCisJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCXJldF92YWwgPSBlMTAwMF9jaGVja19sYnRlc3RfZnJhbWUocnhkci0+YnVmZmVyX2luZm9baV0uc2tiLAorCQkJCQkJICAgMTAyNCk7CisJCWkrKzsKKwl9IHdoaWxlIChyZXRfdmFsICE9IDAgJiYgaSA8IDY0KTsKKworCXJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgaW50CitlMTAwMF9sb29wYmFja190ZXN0KHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLCB1aW50NjRfdCAqZGF0YSkKK3sKKwlpZigoKmRhdGEgPSBlMTAwMF9zZXR1cF9kZXNjX3JpbmdzKGFkYXB0ZXIpKSkgZ290byBlcnJfbG9vcGJhY2s7CisJaWYoKCpkYXRhID0gZTEwMDBfc2V0dXBfbG9vcGJhY2tfdGVzdChhZGFwdGVyKSkpIGdvdG8gZXJyX2xvb3BiYWNrOworCSpkYXRhID0gZTEwMDBfcnVuX2xvb3BiYWNrX3Rlc3QoYWRhcHRlcik7CisJZTEwMDBfbG9vcGJhY2tfY2xlYW51cChhZGFwdGVyKTsKKwllMTAwMF9mcmVlX2Rlc2NfcmluZ3MoYWRhcHRlcik7CitlcnJfbG9vcGJhY2s6CisJcmV0dXJuICpkYXRhOworfQorCitzdGF0aWMgaW50CitlMTAwMF9saW5rX3Rlc3Qoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsIHVpbnQ2NF90ICpkYXRhKQoreworCSpkYXRhID0gMDsKKworCWlmIChhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSB7CisJCWludCBpID0gMDsKKwkJYWRhcHRlci0+aHcuc2VyZGVzX2xpbmtfZG93biA9IFRSVUU7CisKKwkJLyogb24gc29tZSBibGFkZSBzZXJ2ZXIgZGVzaWducyBsaW5rIGVzdGFibGlzaG1lbnQgKi8KKwkJLyogY291bGQgdGFrZSBhcyBsb25nIGFzIDItMyBtaW51dGVzLiAgICAgICAgICAgICAgKi8KKwkJZG8geworCQkJZTEwMDBfY2hlY2tfZm9yX2xpbmsoJmFkYXB0ZXItPmh3KTsKKwkJCWlmIChhZGFwdGVyLT5ody5zZXJkZXNfbGlua19kb3duID09IEZBTFNFKQorCQkJCXJldHVybiAqZGF0YTsKKwkJCW1zZWNfZGVsYXkoMjApOworCQl9IHdoaWxlIChpKysgPCAzNzUwKTsKKworCQkqZGF0YSA9IDE7IAorCX0gZWxzZSB7CisJCWUxMDAwX2NoZWNrX2Zvcl9saW5rKCZhZGFwdGVyLT5odyk7CisKKwkJaWYoIShFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfTFUpKSB7CisJCQkqZGF0YSA9IDE7CisJCX0KKwl9CisJcmV0dXJuICpkYXRhOworfQorCitzdGF0aWMgaW50IAorZTEwMDBfZGlhZ190ZXN0X2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJcmV0dXJuIEUxMDAwX1RFU1RfTEVOOworfQorCitzdGF0aWMgdm9pZAorZTEwMDBfZGlhZ190ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCSAgIHN0cnVjdCBldGh0b29sX3Rlc3QgKmV0aF90ZXN0LCB1aW50NjRfdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlib29sZWFuX3QgaWZfcnVubmluZyA9IG5ldGlmX3J1bm5pbmcobmV0ZGV2KTsKKworCWlmKGV0aF90ZXN0LT5mbGFncyA9PSBFVEhfVEVTVF9GTF9PRkZMSU5FKSB7CisJCS8qIE9mZmxpbmUgdGVzdHMgKi8KKworCQkvKiBzYXZlIHNwZWVkLCBkdXBsZXgsIGF1dG9uZWcgc2V0dGluZ3MgKi8KKwkJdWludDE2X3QgYXV0b25lZ19hZHZlcnRpc2VkID0gYWRhcHRlci0+aHcuYXV0b25lZ19hZHZlcnRpc2VkOworCQl1aW50OF90IGZvcmNlZF9zcGVlZF9kdXBsZXggPSBhZGFwdGVyLT5ody5mb3JjZWRfc3BlZWRfZHVwbGV4OworCQl1aW50OF90IGF1dG9uZWcgPSBhZGFwdGVyLT5ody5hdXRvbmVnOworCisJCS8qIExpbmsgdGVzdCBwZXJmb3JtZWQgYmVmb3JlIGhhcmR3YXJlIHJlc2V0IHNvIGF1dG9uZWcgZG9lc24ndAorCQkgKiBpbnRlcmZlcmUgd2l0aCB0ZXN0IHJlc3VsdCAqLworCQlpZihlMTAwMF9saW5rX3Rlc3QoYWRhcHRlciwgJmRhdGFbNF0pKQorCQkJZXRoX3Rlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKKworCQlpZihpZl9ydW5uaW5nKQorCQkJZTEwMDBfZG93bihhZGFwdGVyKTsKKwkJZWxzZQorCQkJZTEwMDBfcmVzZXQoYWRhcHRlcik7CisKKwkJaWYoZTEwMDBfcmVnX3Rlc3QoYWRhcHRlciwgJmRhdGFbMF0pKQorCQkJZXRoX3Rlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKKworCQllMTAwMF9yZXNldChhZGFwdGVyKTsKKwkJaWYoZTEwMDBfZWVwcm9tX3Rlc3QoYWRhcHRlciwgJmRhdGFbMV0pKQorCQkJZXRoX3Rlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKKworCQllMTAwMF9yZXNldChhZGFwdGVyKTsKKwkJaWYoZTEwMDBfaW50cl90ZXN0KGFkYXB0ZXIsICZkYXRhWzJdKSkKKwkJCWV0aF90ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CisKKwkJZTEwMDBfcmVzZXQoYWRhcHRlcik7CisJCWlmKGUxMDAwX2xvb3BiYWNrX3Rlc3QoYWRhcHRlciwgJmRhdGFbM10pKQorCQkJZXRoX3Rlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKKworCQkvKiByZXN0b3JlIHNwZWVkLCBkdXBsZXgsIGF1dG9uZWcgc2V0dGluZ3MgKi8KKwkJYWRhcHRlci0+aHcuYXV0b25lZ19hZHZlcnRpc2VkID0gYXV0b25lZ19hZHZlcnRpc2VkOworCQlhZGFwdGVyLT5ody5mb3JjZWRfc3BlZWRfZHVwbGV4ID0gZm9yY2VkX3NwZWVkX2R1cGxleDsKKwkJYWRhcHRlci0+aHcuYXV0b25lZyA9IGF1dG9uZWc7CisKKwkJZTEwMDBfcmVzZXQoYWRhcHRlcik7CisJCWlmKGlmX3J1bm5pbmcpCisJCQllMTAwMF91cChhZGFwdGVyKTsKKwl9IGVsc2UgeworCQkvKiBPbmxpbmUgdGVzdHMgKi8KKwkJaWYoZTEwMDBfbGlua190ZXN0KGFkYXB0ZXIsICZkYXRhWzRdKSkKKwkJCWV0aF90ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CisKKwkJLyogT2ZmbGluZSB0ZXN0cyBhcmVuJ3QgcnVuOyBwYXNzIGJ5IGRlZmF1bHQgKi8KKwkJZGF0YVswXSA9IDA7CisJCWRhdGFbMV0gPSAwOworCQlkYXRhWzJdID0gMDsKKwkJZGF0YVszXSA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZAorZTEwMDBfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKworCXN3aXRjaChhZGFwdGVyLT5ody5kZXZpY2VfaWQpIHsKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0MjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0M0dDX0ZJQkVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQzR0NfQ09QUEVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ0RUlfRklCRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZFQl9RVUFEX0NPUFBFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NUVNX0ZJQkVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ1RU1fQ09QUEVSOgorCQl3b2wtPnN1cHBvcnRlZCA9IDA7CisJCXdvbC0+d29sb3B0cyAgID0gMDsKKwkJcmV0dXJuOworCisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZFQl9GSUJFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkdCX0ZJQkVSOgorCQkvKiBXYWtlIGV2ZW50cyBvbmx5IHN1cHBvcnRlZCBvbiBwb3J0IEEgZm9yIGR1YWwgZmliZXIgKi8KKwkJaWYoRTEwMDBfUkVBRF9SRUcoaHcsIFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfRlVOQ18xKSB7CisJCQl3b2wtPnN1cHBvcnRlZCA9IDA7CisJCQl3b2wtPndvbG9wdHMgICA9IDA7CisJCQlyZXR1cm47CisJCX0KKwkJLyogRmFsbCBUaHJvdWdoICovCisKKwlkZWZhdWx0OgorCQl3b2wtPnN1cHBvcnRlZCA9IFdBS0VfVUNBU1QgfCBXQUtFX01DQVNUIHwKKwkJCQkgV0FLRV9CQ0FTVCB8IFdBS0VfTUFHSUM7CisKKwkJd29sLT53b2xvcHRzID0gMDsKKwkJaWYoYWRhcHRlci0+d29sICYgRTEwMDBfV1VGQ19FWCkKKwkJCXdvbC0+d29sb3B0cyB8PSBXQUtFX1VDQVNUOworCQlpZihhZGFwdGVyLT53b2wgJiBFMTAwMF9XVUZDX01DKQorCQkJd29sLT53b2xvcHRzIHw9IFdBS0VfTUNBU1Q7CisJCWlmKGFkYXB0ZXItPndvbCAmIEUxMDAwX1dVRkNfQkMpCisJCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9CQ0FTVDsKKwkJaWYoYWRhcHRlci0+d29sICYgRTEwMDBfV1VGQ19NQUcpCisJCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9NQUdJQzsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIGludAorZTEwMDBfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKworCXN3aXRjaChhZGFwdGVyLT5ody5kZXZpY2VfaWQpIHsKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0MjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0M0dDX0ZJQkVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQzR0NfQ09QUEVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ0RUlfRklCRVI6CisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZFQl9RVUFEX0NPUFBFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NUVNX0ZJQkVSOgorCWNhc2UgRTEwMDBfREVWX0lEXzgyNTQ1RU1fQ09QUEVSOgorCQlyZXR1cm4gd29sLT53b2xvcHRzID8gLUVPUE5PVFNVUFAgOiAwOworCisJY2FzZSBFMTAwMF9ERVZfSURfODI1NDZFQl9GSUJFUjoKKwljYXNlIEUxMDAwX0RFVl9JRF84MjU0NkdCX0ZJQkVSOgorCQkvKiBXYWtlIGV2ZW50cyBvbmx5IHN1cHBvcnRlZCBvbiBwb3J0IEEgZm9yIGR1YWwgZmliZXIgKi8KKwkJaWYoRTEwMDBfUkVBRF9SRUcoaHcsIFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfRlVOQ18xKQorCQkJcmV0dXJuIHdvbC0+d29sb3B0cyA/IC1FT1BOT1RTVVBQIDogMDsKKwkJLyogRmFsbCBUaHJvdWdoICovCisKKwlkZWZhdWx0OgorCQlpZih3b2wtPndvbG9wdHMgJiAoV0FLRV9QSFkgfCBXQUtFX0FSUCB8IFdBS0VfTUFHSUNTRUNVUkUpKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJCWFkYXB0ZXItPndvbCA9IDA7CisKKwkJaWYod29sLT53b2xvcHRzICYgV0FLRV9VQ0FTVCkKKwkJCWFkYXB0ZXItPndvbCB8PSBFMTAwMF9XVUZDX0VYOworCQlpZih3b2wtPndvbG9wdHMgJiBXQUtFX01DQVNUKQorCQkJYWRhcHRlci0+d29sIHw9IEUxMDAwX1dVRkNfTUM7CisJCWlmKHdvbC0+d29sb3B0cyAmIFdBS0VfQkNBU1QpCisJCQlhZGFwdGVyLT53b2wgfD0gRTEwMDBfV1VGQ19CQzsKKwkJaWYod29sLT53b2xvcHRzICYgV0FLRV9NQUdJQykKKwkJCWFkYXB0ZXItPndvbCB8PSBFMTAwMF9XVUZDX01BRzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogdG9nZ2xlIExFRCA0IHRpbWVzIHBlciBzZWNvbmQgPSAyICJibGlua3MiIHBlciBzZWNvbmQgKi8KKyNkZWZpbmUgRTEwMDBfSURfSU5URVJWQUwJKEhaLzQpCisKKy8qIGJpdCBkZWZpbmVzIGZvciBhZGFwdGVyLT5sZWRfc3RhdHVzICovCisjZGVmaW5lIEUxMDAwX0xFRF9PTgkJMAorCitzdGF0aWMgdm9pZAorZTEwMDBfbGVkX2JsaW5rX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqKSBkYXRhOworCisJaWYodGVzdF9hbmRfY2hhbmdlX2JpdChFMTAwMF9MRURfT04sICZhZGFwdGVyLT5sZWRfc3RhdHVzKSkKKwkJZTEwMDBfbGVkX29mZigmYWRhcHRlci0+aHcpOworCWVsc2UKKwkJZTEwMDBfbGVkX29uKCZhZGFwdGVyLT5odyk7CisKKwltb2RfdGltZXIoJmFkYXB0ZXItPmJsaW5rX3RpbWVyLCBqaWZmaWVzICsgRTEwMDBfSURfSU5URVJWQUwpOworfQorCitzdGF0aWMgaW50CitlMTAwMF9waHlzX2lkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQzMl90IGRhdGEpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisKKwlpZighZGF0YSB8fCBkYXRhID4gKHVpbnQzMl90KShNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKSkKKwkJZGF0YSA9ICh1aW50MzJfdCkoTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWik7CisKKwlpZighYWRhcHRlci0+YmxpbmtfdGltZXIuZnVuY3Rpb24pIHsKKwkJaW5pdF90aW1lcigmYWRhcHRlci0+YmxpbmtfdGltZXIpOworCQlhZGFwdGVyLT5ibGlua190aW1lci5mdW5jdGlvbiA9IGUxMDAwX2xlZF9ibGlua19jYWxsYmFjazsKKwkJYWRhcHRlci0+YmxpbmtfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBhZGFwdGVyOworCX0KKworCWUxMDAwX3NldHVwX2xlZCgmYWRhcHRlci0+aHcpOworCW1vZF90aW1lcigmYWRhcHRlci0+YmxpbmtfdGltZXIsIGppZmZpZXMpOworCisJbXNsZWVwX2ludGVycnVwdGlibGUoZGF0YSAqIDEwMDApOworCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT5ibGlua190aW1lcik7CisJZTEwMDBfbGVkX29mZigmYWRhcHRlci0+aHcpOworCWNsZWFyX2JpdChFMTAwMF9MRURfT04sICZhZGFwdGVyLT5sZWRfc3RhdHVzKTsKKwllMTAwMF9jbGVhbnVwX2xlZCgmYWRhcHRlci0+aHcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2UxMDAwX253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlpZihuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKKwkJZTEwMDBfZG93bihhZGFwdGVyKTsKKwkJZTEwMDBfdXAoYWRhcHRlcik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IAorZTEwMDBfZ2V0X3N0YXRzX2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJcmV0dXJuIEUxMDAwX1NUQVRTX0xFTjsKK30KKworc3RhdGljIHZvaWQgCitlMTAwMF9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCAKKwkJc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1aW50NjRfdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlpbnQgaTsKKworCWUxMDAwX3VwZGF0ZV9zdGF0cyhhZGFwdGVyKTsKKwlmb3IoaSA9IDA7IGkgPCBFMTAwMF9TVEFUU19MRU47IGkrKykgeworCQljaGFyICpwID0gKGNoYXIgKilhZGFwdGVyK2UxMDAwX2dzdHJpbmdzX3N0YXRzW2ldLnN0YXRfb2Zmc2V0OwkKKwkJZGF0YVtpXSA9IChlMTAwMF9nc3RyaW5nc19zdGF0c1tpXS5zaXplb2Zfc3RhdCA9PSAKKwkJCXNpemVvZih1aW50NjRfdCkpID8gKih1aW50NjRfdCAqKXAgOiAqKHVpbnQzMl90ICopcDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIAorZTEwMDBfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDMyX3Qgc3RyaW5nc2V0LCB1aW50OF90ICpkYXRhKQoreworCWludCBpOworCisJc3dpdGNoKHN0cmluZ3NldCkgeworCWNhc2UgRVRIX1NTX1RFU1Q6CisJCW1lbWNweShkYXRhLCAqZTEwMDBfZ3N0cmluZ3NfdGVzdCwgCisJCQlFMTAwMF9URVNUX0xFTipFVEhfR1NUUklOR19MRU4pOworCQlicmVhazsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJZm9yIChpPTA7IGkgPCBFMTAwMF9TVEFUU19MRU47IGkrKykgeworCQkJbWVtY3B5KGRhdGEgKyBpICogRVRIX0dTVFJJTkdfTEVOLCAKKwkJCWUxMDAwX2dzdHJpbmdzX3N0YXRzW2ldLnN0YXRfc3RyaW5nLAorCQkJRVRIX0dTVFJJTkdfTEVOKTsKKwkJfQorCQlicmVhazsKKwl9Cit9CisKK3N0cnVjdCBldGh0b29sX29wcyBlMTAwMF9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzICAgICAgICAgICA9IGUxMDAwX2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzICAgICAgICAgICA9IGUxMDAwX3NldF9zZXR0aW5ncywKKwkuZ2V0X2RydmluZm8gICAgICAgICAgICA9IGUxMDAwX2dldF9kcnZpbmZvLAorCS5nZXRfcmVnc19sZW4gICAgICAgICAgID0gZTEwMDBfZ2V0X3JlZ3NfbGVuLAorCS5nZXRfcmVncyAgICAgICAgICAgICAgID0gZTEwMDBfZ2V0X3JlZ3MsCisJLmdldF93b2wgICAgICAgICAgICAgICAgPSBlMTAwMF9nZXRfd29sLAorCS5zZXRfd29sICAgICAgICAgICAgICAgID0gZTEwMDBfc2V0X3dvbCwKKwkuZ2V0X21zZ2xldmVsCSAgICAgICAgPSBlMTAwMF9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkgICAgICAgID0gZTEwMDBfc2V0X21zZ2xldmVsLAorCS5ud2F5X3Jlc2V0ICAgICAgICAgICAgID0gZTEwMDBfbndheV9yZXNldCwKKwkuZ2V0X2xpbmsgICAgICAgICAgICAgICA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9lZXByb21fbGVuICAgICAgICAgPSBlMTAwMF9nZXRfZWVwcm9tX2xlbiwKKwkuZ2V0X2VlcHJvbSAgICAgICAgICAgICA9IGUxMDAwX2dldF9lZXByb20sCisJLnNldF9lZXByb20gICAgICAgICAgICAgPSBlMTAwMF9zZXRfZWVwcm9tLAorCS5nZXRfcmluZ3BhcmFtICAgICAgICAgID0gZTEwMDBfZ2V0X3JpbmdwYXJhbSwKKwkuc2V0X3JpbmdwYXJhbSAgICAgICAgICA9IGUxMDAwX3NldF9yaW5ncGFyYW0sCisJLmdldF9wYXVzZXBhcmFtCQk9IGUxMDAwX2dldF9wYXVzZXBhcmFtLAorCS5zZXRfcGF1c2VwYXJhbQkJPSBlMTAwMF9zZXRfcGF1c2VwYXJhbSwKKwkuZ2V0X3J4X2NzdW0JCT0gZTEwMDBfZ2V0X3J4X2NzdW0sCisJLnNldF9yeF9jc3VtCQk9IGUxMDAwX3NldF9yeF9jc3VtLAorCS5nZXRfdHhfY3N1bQkJPSBlMTAwMF9nZXRfdHhfY3N1bSwKKwkuc2V0X3R4X2NzdW0JCT0gZTEwMDBfc2V0X3R4X2NzdW0sCisJLmdldF9zZwkJCT0gZXRodG9vbF9vcF9nZXRfc2csCisJLnNldF9zZwkJCT0gZXRodG9vbF9vcF9zZXRfc2csCisjaWZkZWYgTkVUSUZfRl9UU08KKwkuZ2V0X3RzbwkJPSBldGh0b29sX29wX2dldF90c28sCisJLnNldF90c28JCT0gZTEwMDBfc2V0X3RzbywKKyNlbmRpZgorCS5zZWxmX3Rlc3RfY291bnQgICAgICAgID0gZTEwMDBfZGlhZ190ZXN0X2NvdW50LAorCS5zZWxmX3Rlc3QgICAgICAgICAgICAgID0gZTEwMDBfZGlhZ190ZXN0LAorCS5nZXRfc3RyaW5ncyAgICAgICAgICAgID0gZTEwMDBfZ2V0X3N0cmluZ3MsCisJLnBoeXNfaWQgICAgICAgICAgICAgICAgPSBlMTAwMF9waHlzX2lkLAorCS5nZXRfc3RhdHNfY291bnQgICAgICAgID0gZTEwMDBfZ2V0X3N0YXRzX2NvdW50LAorCS5nZXRfZXRodG9vbF9zdGF0cyAgICAgID0gZTEwMDBfZ2V0X2V0aHRvb2xfc3RhdHMsCit9OworCit2b2lkIGUxMDAwX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZlMTAwMF9ldGh0b29sX29wcyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODZhOWI5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuYwpAQCAtMCwwICsxLDU0MDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IAorICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSAKKyAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSAKKyAgYW55IGxhdGVyIHZlcnNpb24uCisgIAorICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciAKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciAKKyAgbW9yZSBkZXRhaWxzLgorICAKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgCisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICAKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgIAorICBDb250YWN0IEluZm9ybWF0aW9uOgorICBMaW51eCBOSUNTIDxsaW51eC5uaWNzQGludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBlMTAwMF9ody5jCisgKiBTaGFyZWQgZnVuY3Rpb25zIGZvciBhY2Nlc3NpbmcgYW5kIGNvbmZpZ3VyaW5nIHRoZSBNQUMKKyAqLworCisjaW5jbHVkZSAiZTEwMDBfaHcuaCIKKworc3RhdGljIGludDMyX3QgZTEwMDBfc2V0X3BoeV90eXBlKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIHZvaWQgZTEwMDBfcGh5X2luaXRfc2NyaXB0KHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludDMyX3QgZTEwMDBfc2V0dXBfY29wcGVyX2xpbmsoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9zZXR1cF9maWJlcl9zZXJkZXNfbGluayhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX2FkanVzdF9zZXJkZXNfYW1wbGl0dWRlKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludDMyX3QgZTEwMDBfcGh5X2ZvcmNlX3NwZWVkX2R1cGxleChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX2NvbmZpZ19tYWNfdG9fcGh5KHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIHZvaWQgZTEwMDBfcmFpc2VfbWRpX2NsayhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCAqY3RybCk7CitzdGF0aWMgdm9pZCBlMTAwMF9sb3dlcl9tZGlfY2xrKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90ICpjdHJsKTsKK3N0YXRpYyB2b2lkIGUxMDAwX3NoaWZ0X291dF9tZGlfYml0cyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvdW50KTsKK3N0YXRpYyB1aW50MTZfdCBlMTAwMF9zaGlmdF9pbl9tZGlfYml0cyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3BoeV9yZXNldF9kc3Aoc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF93cml0ZV9lZXByb21fc3BpKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQxNl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd29yZHMsIHVpbnQxNl90ICpkYXRhKTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3dyaXRlX2VlcHJvbV9taWNyb3dpcmUoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgb2Zmc2V0LCB1aW50MTZfdCB3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKmRhdGEpOworc3RhdGljIGludDMyX3QgZTEwMDBfc3BpX2VlcHJvbV9yZWFkeShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyB2b2lkIGUxMDAwX3JhaXNlX2VlX2NsayhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCAqZWVjZCk7CitzdGF0aWMgdm9pZCBlMTAwMF9sb3dlcl9lZV9jbGsoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgKmVlY2QpOworc3RhdGljIHZvaWQgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDE2X3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvdW50KTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3dyaXRlX3BoeV9yZWdfZXgoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgcmVnX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBoeV9kYXRhKTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3JlYWRfcGh5X3JlZ19leChzdHJ1Y3QgZTEwMDBfaHcgKmh3LHVpbnQzMl90IHJlZ19hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpwaHlfZGF0YSk7CitzdGF0aWMgdWludDE2X3QgZTEwMDBfc2hpZnRfaW5fZWVfYml0cyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MTZfdCBjb3VudCk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9hY3F1aXJlX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyB2b2lkIGUxMDAwX3JlbGVhc2VfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIHZvaWQgZTEwMDBfc3RhbmRieV9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodyk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9pZF9sZWRfaW5pdChzdHJ1Y3QgZTEwMDBfaHcgKiBodyk7CitzdGF0aWMgaW50MzJfdCBlMTAwMF9zZXRfdmNvX3NwZWVkKHN0cnVjdCBlMTAwMF9odyAqaHcpOworc3RhdGljIGludDMyX3QgZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfd29ya2Fyb3VuZChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3N0YXRpYyBpbnQzMl90IGUxMDAwX3NldF9waHlfbW9kZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKKworLyogSUdQIGNhYmxlIGxlbmd0aCB0YWJsZSAqLworc3RhdGljIGNvbnN0Cit1aW50MTZfdCBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoX3RhYmxlW0lHUDAxRTEwMDBfQUdDX0xFTkdUSF9UQUJMRV9TSVpFXSA9CisgICAgeyA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LAorICAgICAgNSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjUsIDI1LCAyNSwKKyAgICAgIDI1LCAyNSwgMjUsIDI1LCAzMCwgMzAsIDMwLCAzMCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLAorICAgICAgNDAsIDUwLCA1MCwgNTAsIDUwLCA1MCwgNTAsIDUwLCA2MCwgNjAsIDYwLCA2MCwgNjAsIDYwLCA2MCwgNjAsCisgICAgICA2MCwgNzAsIDcwLCA3MCwgNzAsIDcwLCA3MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgOTAsIDkwLCA5MCwKKyAgICAgIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDEwMCwgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwKKyAgICAgIDEwMCwgMTAwLCAxMDAsIDEwMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMTAsIDExMCwKKyAgICAgIDExMCwgMTEwLCAxMTAsIDExMCwgMTEwLCAxMTAsIDEyMCwgMTIwLCAxMjAsIDEyMCwgMTIwLCAxMjAsIDEyMCwgMTIwLCAxMjAsIDEyMH07CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2V0IHRoZSBwaHkgdHlwZSBtZW1iZXIgaW4gdGhlIGh3IHN0cnVjdC4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfc2V0X3BoeV90eXBlKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgREVCVUdGVU5DKCJlMTAwMF9zZXRfcGh5X3R5cGUiKTsKKworICAgIHN3aXRjaChody0+cGh5X2lkKSB7CisgICAgY2FzZSBNODhFMTAwMF9FX1BIWV9JRDoKKyAgICBjYXNlIE04OEUxMDAwX0lfUEhZX0lEOgorICAgIGNhc2UgTTg4RTEwMTFfSV9QSFlfSUQ6CisgICAgICAgIGh3LT5waHlfdHlwZSA9IGUxMDAwX3BoeV9tODg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSUdQMDFFMTAwMF9JX1BIWV9JRDoKKyAgICAgICAgaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxIHx8CisgICAgICAgICAgIGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MV9yZXZfMiB8fAorICAgICAgICAgICBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcgfHwKKyAgICAgICAgICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3X3Jldl8yKSB7CisgICAgICAgICAgICBody0+cGh5X3R5cGUgPSBlMTAwMF9waHlfaWdwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogRmFsbCBUaHJvdWdoICovCisgICAgZGVmYXVsdDoKKyAgICAgICAgLyogU2hvdWxkIG5ldmVyIGhhdmUgbG9hZGVkIG9uIHRoaXMgZGV2aWNlICovCisgICAgICAgIGh3LT5waHlfdHlwZSA9IGUxMDAwX3BoeV91bmRlZmluZWQ7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1BIWV9UWVBFOworICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJR1AgcGh5IGluaXQgc2NyaXB0IC0gaW5pdGlhbGl6ZXMgdGhlIEdiRSBQSFkKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX3BoeV9pbml0X3NjcmlwdChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3QgcGh5X3NhdmVkX2RhdGE7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3BoeV9pbml0X3NjcmlwdCIpOworCisKKyAgICBpZihody0+cGh5X2luaXRfc2NyaXB0KSB7CisgICAgICAgIG1zZWNfZGVsYXkoMjApOworCisgICAgICAgIC8qIFNhdmUgb2ZmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHJlZ2lzdGVyIDB4MkY1QiB0byBiZSByZXN0b3JlZCBhdAorICAgICAgICAgKiB0aGUgZW5kIG9mIHRoaXMgcm91dGluZS4gKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgMHgyRjVCLCAmcGh5X3NhdmVkX2RhdGEpOworCisgICAgICAgIC8qIERpc2FibGVkIHRoZSBQSFkgdHJhbnNtaXR0ZXIgKi8KKyAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyRjVCLCAweDAwMDMpOworCisgICAgICAgIG1zZWNfZGVsYXkoMjApOworCisgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsMHgwMDAwLDB4MDE0MCk7CisKKyAgICAgICAgbXNlY19kZWxheSg1KTsKKworICAgICAgICBzd2l0Y2goaHctPm1hY190eXBlKSB7CisgICAgICAgIGNhc2UgZTEwMDBfODI1NDE6CisgICAgICAgIGNhc2UgZTEwMDBfODI1NDc6CisgICAgICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDFGOTUsIDB4MDAwMSk7CisKKyAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MUY3MSwgMHhCRDIxKTsKKworICAgICAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjc5LCAweDAwMTgpOworCisgICAgICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDFGMzAsIDB4MTYwMCk7CisKKyAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MUYzMSwgMHgwMDE0KTsKKworICAgICAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgxRjMyLCAweDE2MUMpOworCisgICAgICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDFGOTQsIDB4MDAwMyk7CisKKyAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MUY5NiwgMHgwMDNGKTsKKworICAgICAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyMDEwLCAweDAwMDgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0N19yZXZfMjoKKyAgICAgICAgICAgIGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MUY3MywgMHgwMDk5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDAwMDAsIDB4MzMwMCk7CisKKyAgICAgICAgbXNlY19kZWxheSgyMCk7CisKKyAgICAgICAgLyogTm93IGVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIgKi8KKyAgICAgICAgZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyRjVCLCBwaHlfc2F2ZWRfZGF0YSk7CisKKyAgICAgICAgaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3KSB7CisgICAgICAgICAgICB1aW50MTZfdCBmdXNlZCwgZmluZSwgY29hcnNlOworCisgICAgICAgICAgICAvKiBNb3ZlIHRvIGFuYWxvZyByZWdpc3RlcnMgcGFnZSAqLworICAgICAgICAgICAgZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX0FOQUxPR19TUEFSRV9GVVNFX1NUQVRVUywgJmZ1c2VkKTsKKworICAgICAgICAgICAgaWYoIShmdXNlZCAmIElHUDAxRTEwMDBfQU5BTE9HX1NQQVJFX0ZVU0VfRU5BQkxFRCkpIHsKKyAgICAgICAgICAgICAgICBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfU1RBVFVTLCAmZnVzZWQpOworCisgICAgICAgICAgICAgICAgZmluZSA9IGZ1c2VkICYgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9GSU5FX01BU0s7CisgICAgICAgICAgICAgICAgY29hcnNlID0gZnVzZWQgJiBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV9NQVNLOworCisgICAgICAgICAgICAgICAgaWYoY29hcnNlID4gSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9DT0FSU0VfVEhSRVNIKSB7CisgICAgICAgICAgICAgICAgICAgIGNvYXJzZSAtPSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPQVJTRV8xMDsKKyAgICAgICAgICAgICAgICAgICAgZmluZSAtPSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0ZJTkVfMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYoY29hcnNlID09IElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQ09BUlNFX1RIUkVTSCkKKyAgICAgICAgICAgICAgICAgICAgZmluZSAtPSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0ZJTkVfMTA7CisKKyAgICAgICAgICAgICAgICBmdXNlZCA9IChmdXNlZCAmIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfUE9MWV9NQVNLKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAoZmluZSAmIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfRklORV9NQVNLKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAoY29hcnNlICYgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9DT0FSU0VfTUFTSyk7CisKKyAgICAgICAgICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0NPTlRST0wsIGZ1c2VkKTsKKyAgICAgICAgICAgICAgICBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX0JZUEFTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfRU5BQkxFX1NXX0NPTlRST0wpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTZXQgdGhlIG1hYyB0eXBlIG1lbWJlciBpbiB0aGUgaHcgc3RydWN0LgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9zZXRfbWFjX3R5cGUoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBERUJVR0ZVTkMoImUxMDAwX3NldF9tYWNfdHlwZSIpOworCisgICAgc3dpdGNoIChody0+ZGV2aWNlX2lkKSB7CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDI6CisgICAgICAgIHN3aXRjaCAoaHctPnJldmlzaW9uX2lkKSB7CisgICAgICAgIGNhc2UgRTEwMDBfODI1NDJfMl8wX1JFVl9JRDoKKyAgICAgICAgICAgIGh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQyX3JldjJfMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEUxMDAwXzgyNTQyXzJfMV9SRVZfSUQ6CisgICAgICAgICAgICBody0+bWFjX3R5cGUgPSBlMTAwMF84MjU0Ml9yZXYyXzE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8qIEludmFsaWQgODI1NDIgcmV2aXNpb24gSUQgKi8KKyAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX01BQ19UWVBFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQzR0NfRklCRVI6CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDNHQ19DT1BQRVI6CisgICAgICAgIGh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0NEVJX0NPUFBFUjoKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0NEVJX0ZJQkVSOgorICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQ0R0NfQ09QUEVSOgorICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQ0R0NfTE9NOgorICAgICAgICBody0+bWFjX3R5cGUgPSBlMTAwMF84MjU0NDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDBFTToKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0MEVNX0xPTToKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0MEVQOgorICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQwRVBfTE9NOgorICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQwRVBfTFA6CisgICAgICAgIGh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0NUVNX0NPUFBFUjoKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0NUVNX0ZJQkVSOgorICAgICAgICBody0+bWFjX3R5cGUgPSBlMTAwMF84MjU0NTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDVHTV9DT1BQRVI6CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDVHTV9GSUJFUjoKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0NUdNX1NFUkRFUzoKKyAgICAgICAgaHctPm1hY190eXBlID0gZTEwMDBfODI1NDVfcmV2XzM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2RUJfQ09QUEVSOgorICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2RUJfRklCRVI6CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDZFQl9RVUFEX0NPUFBFUjoKKyAgICAgICAgaHctPm1hY190eXBlID0gZTEwMDBfODI1NDY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2R0JfQ09QUEVSOgorICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2R0JfRklCRVI6CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9TRVJERVM6CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDZHQl9QQ0lFOgorICAgICAgICBody0+bWFjX3R5cGUgPSBlMTAwMF84MjU0Nl9yZXZfMzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDFFSToKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0MUVJX01PQklMRToKKyAgICAgICAgaHctPm1hY190eXBlID0gZTEwMDBfODI1NDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQxRVI6CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDFHSToKKyAgICBjYXNlIEUxMDAwX0RFVl9JRF84MjU0MUdJX0xGOgorICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQxR0lfTU9CSUxFOgorICAgICAgICBody0+bWFjX3R5cGUgPSBlMTAwMF84MjU0MV9yZXZfMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFMTAwMF9ERVZfSURfODI1NDdFSToKKyAgICAgICAgaHctPm1hY190eXBlID0gZTEwMDBfODI1NDc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQ3R0k6CisgICAgICAgIGh3LT5tYWNfdHlwZSA9IGUxMDAwXzgyNTQ3X3Jldl8yOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAvKiBTaG91bGQgbmV2ZXIgaGF2ZSBsb2FkZWQgb24gdGhpcyBkZXZpY2UgKi8KKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfTUFDX1RZUEU7CisgICAgfQorCisgICAgc3dpdGNoKGh3LT5tYWNfdHlwZSkgeworICAgIGNhc2UgZTEwMDBfODI1NDE6CisgICAgY2FzZSBlMTAwMF84MjU0NzoKKyAgICBjYXNlIGUxMDAwXzgyNTQxX3Jldl8yOgorICAgIGNhc2UgZTEwMDBfODI1NDdfcmV2XzI6CisgICAgICAgIGh3LT5hc2ZfZmlybXdhcmVfcHJlc2VudCA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNldCBtZWRpYSB0eXBlIGFuZCBUQkkgY29tcGF0aWJpbGl0eS4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitlMTAwMF9zZXRfbWVkaWFfdHlwZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IHN0YXR1czsKKworICAgIERFQlVHRlVOQygiZTEwMDBfc2V0X21lZGlhX3R5cGUiKTsKKworICAgIGlmKGh3LT5tYWNfdHlwZSAhPSBlMTAwMF84MjU0MykgeworICAgICAgICAvKiB0YmlfY29tcGF0aWJpbGl0eSBpcyBvbmx5IHZhbGlkIG9uIDgyNTQzICovCisgICAgICAgIGh3LT50YmlfY29tcGF0aWJpbGl0eV9lbiA9IEZBTFNFOworICAgIH0KKworICAgIHN3aXRjaCAoaHctPmRldmljZV9pZCkgeworICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQ1R01fU0VSREVTOgorICAgIGNhc2UgRTEwMDBfREVWX0lEXzgyNTQ2R0JfU0VSREVTOgorICAgICAgICBody0+bWVkaWFfdHlwZSA9IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBpZihody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpOworICAgICAgICAgICAgaWYoc3RhdHVzICYgRTEwMDBfU1RBVFVTX1RCSU1PREUpIHsKKyAgICAgICAgICAgICAgICBody0+bWVkaWFfdHlwZSA9IGUxMDAwX21lZGlhX3R5cGVfZmliZXI7CisgICAgICAgICAgICAgICAgLyogdGJpX2NvbXBhdGliaWxpdHkgbm90IHZhbGlkIG9uIGZpYmVyICovCisgICAgICAgICAgICAgICAgaHctPnRiaV9jb21wYXRpYmlsaXR5X2VuID0gRkFMU0U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGh3LT5tZWRpYV90eXBlID0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBUaGlzIGlzIGFuIDgyNTQyIChmaWJlciBvbmx5KSAqLworICAgICAgICAgICAgaHctPm1lZGlhX3R5cGUgPSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyOworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZXNldCB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgdW5pdHM7IG1hc2sgYW5kIGNsZWFyIGFsbCBpbnRlcnJ1cHRzLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9yZXNldF9odyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IGN0cmw7CisgICAgdWludDMyX3QgY3RybF9leHQ7CisgICAgdWludDMyX3QgaWNyOworICAgIHVpbnQzMl90IG1hbmM7CisgICAgdWludDMyX3QgbGVkX2N0cmw7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3Jlc2V0X2h3Iik7CisKKyAgICAvKiBGb3IgODI1NDIgKHJldiAyLjApLCBkaXNhYmxlIE1XSSBiZWZvcmUgaXNzdWluZyBhIGRldmljZSByZXNldCAqLworICAgIGlmKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApIHsKKyAgICAgICAgREVCVUdPVVQoIkRpc2FibGluZyBNV0kgb24gODI1NDIgcmV2IDIuMFxuIik7CisgICAgICAgIGUxMDAwX3BjaV9jbGVhcl9td2koaHcpOworICAgIH0KKworICAgIC8qIENsZWFyIGludGVycnVwdCBtYXNrIHRvIHN0b3AgYm9hcmQgZnJvbSBnZW5lcmF0aW5nIGludGVycnVwdHMgKi8KKyAgICBERUJVR09VVCgiTWFza2luZyBvZmYgYWxsIGludGVycnVwdHNcbiIpOworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgSU1DLCAweGZmZmZmZmZmKTsKKworICAgIC8qIERpc2FibGUgdGhlIFRyYW5zbWl0IGFuZCBSZWNlaXZlIHVuaXRzLiAgVGhlbiBkZWxheSB0byBhbGxvdworICAgICAqIGFueSBwZW5kaW5nIHRyYW5zYWN0aW9ucyB0byBjb21wbGV0ZSBiZWZvcmUgd2UgaGl0IHRoZSBNQUMgd2l0aAorICAgICAqIHRoZSBnbG9iYWwgcmVzZXQuCisgICAgICovCisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBSQ1RMLCAwKTsKKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIFRDVEwsIEUxMDAwX1RDVExfUFNQKTsKKyAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisKKyAgICAvKiBUaGUgdGJpX2NvbXBhdGliaWxpdHlfb24gRmxhZyBtdXN0IGJlIGNsZWFyZWQgd2hlbiBSY3RsIGlzIGNsZWFyZWQuICovCisgICAgaHctPnRiaV9jb21wYXRpYmlsaXR5X29uID0gRkFMU0U7CisKKyAgICAvKiBEZWxheSB0byBhbGxvdyBhbnkgb3V0c3RhbmRpbmcgUENJIHRyYW5zYWN0aW9ucyB0byBjb21wbGV0ZSBiZWZvcmUKKyAgICAgKiByZXNldHRpbmcgdGhlIGRldmljZQorICAgICAqLworICAgIG1zZWNfZGVsYXkoMTApOworCisgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKworICAgIC8qIE11c3QgcmVzZXQgdGhlIFBIWSBiZWZvcmUgcmVzZXR0aW5nIHRoZSBNQUMgKi8KKyAgICBpZigoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxKSB8fCAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3KSkgeworICAgICAgICBFMTAwMF9XUklURV9SRUdfSU8oaHcsIENUUkwsIChjdHJsIHwgRTEwMDBfQ1RSTF9QSFlfUlNUKSk7CisgICAgICAgIG1zZWNfZGVsYXkoNSk7CisgICAgfQorCisgICAgLyogSXNzdWUgYSBnbG9iYWwgcmVzZXQgdG8gdGhlIE1BQy4gIFRoaXMgd2lsbCByZXNldCB0aGUgY2hpcCdzCisgICAgICogdHJhbnNtaXQsIHJlY2VpdmUsIERNQSwgYW5kIGxpbmsgdW5pdHMuICBJdCB3aWxsIG5vdCBlZmZlY3QKKyAgICAgKiB0aGUgY3VycmVudCBQQ0kgY29uZmlndXJhdGlvbi4gIFRoZSBnbG9iYWwgcmVzZXQgYml0IGlzIHNlbGYtCisgICAgICogY2xlYXJpbmcsIGFuZCBzaG91bGQgY2xlYXIgd2l0aGluIGEgbWljcm9zZWNvbmQuCisgICAgICovCisgICAgREVCVUdPVVQoIklzc3VpbmcgYSBnbG9iYWwgcmVzZXQgdG8gTUFDXG4iKTsKKworICAgIHN3aXRjaChody0+bWFjX3R5cGUpIHsKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0NDoKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0MDoKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0NToKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0NjoKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0MToKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKKyAgICAgICAgICAgIC8qIFRoZXNlIGNvbnRyb2xsZXJzIGNhbid0IGFjayB0aGUgNjQtYml0IHdyaXRlIHdoZW4gaXNzdWluZyB0aGUKKyAgICAgICAgICAgICAqIHJlc2V0LCBzbyB1c2UgSU8tbWFwcGluZyBhcyBhIHdvcmthcm91bmQgdG8gaXNzdWUgdGhlIHJlc2V0ICovCisgICAgICAgICAgICBFMTAwMF9XUklURV9SRUdfSU8oaHcsIENUUkwsIChjdHJsIHwgRTEwMDBfQ1RSTF9SU1QpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGUxMDAwXzgyNTQ1X3Jldl8zOgorICAgICAgICBjYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgorICAgICAgICAgICAgLyogUmVzZXQgaXMgcGVyZm9ybWVkIG9uIGEgc2hhZG93IG9mIHRoZSBjb250cm9sIHJlZ2lzdGVyICovCisgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkxfRFVQLCAoY3RybCB8IEUxMDAwX0NUUkxfUlNUKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgKGN0cmwgfCBFMTAwMF9DVFJMX1JTVCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogQWZ0ZXIgTUFDIHJlc2V0LCBmb3JjZSByZWxvYWQgb2YgRUVQUk9NIHRvIHJlc3RvcmUgcG93ZXItb24gc2V0dGluZ3MgdG8KKyAgICAgKiBkZXZpY2UuICBMYXRlciBjb250cm9sbGVycyByZWxvYWQgdGhlIEVFUFJPTSBhdXRvbWF0aWNhbGx5LCBzbyBqdXN0IHdhaXQKKyAgICAgKiBmb3IgcmVsb2FkIHRvIGNvbXBsZXRlLgorICAgICAqLworICAgIHN3aXRjaChody0+bWFjX3R5cGUpIHsKKyAgICAgICAgY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzA6CisgICAgICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgorICAgICAgICBjYXNlIGUxMDAwXzgyNTQzOgorICAgICAgICBjYXNlIGUxMDAwXzgyNTQ0OgorICAgICAgICAgICAgLyogV2FpdCBmb3IgcmVzZXQgdG8gY29tcGxldGUgKi8KKyAgICAgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgICAgICBjdHJsX2V4dCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMX0VYVCk7CisgICAgICAgICAgICBjdHJsX2V4dCB8PSBFMTAwMF9DVFJMX0VYVF9FRV9SU1Q7CisgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkxfRVhULCBjdHJsX2V4dCk7CisgICAgICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgICAgICAgICAvKiBXYWl0IGZvciBFRVBST00gcmVsb2FkICovCisgICAgICAgICAgICBtc2VjX2RlbGF5KDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZTEwMDBfODI1NDE6CisgICAgICAgIGNhc2UgZTEwMDBfODI1NDFfcmV2XzI6CisgICAgICAgIGNhc2UgZTEwMDBfODI1NDc6CisgICAgICAgIGNhc2UgZTEwMDBfODI1NDdfcmV2XzI6CisgICAgICAgICAgICAvKiBXYWl0IGZvciBFRVBST00gcmVsb2FkICovCisgICAgICAgICAgICBtc2VjX2RlbGF5KDIwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogV2FpdCBmb3IgRUVQUk9NIHJlbG9hZCAoaXQgaGFwcGVucyBhdXRvbWF0aWNhbGx5KSAqLworICAgICAgICAgICAgbXNlY19kZWxheSg1KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIERpc2FibGUgSFcgQVJQcyBvbiBBU0YgZW5hYmxlZCBhZGFwdGVycyAqLworICAgIGlmKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MCkgeworICAgICAgICBtYW5jID0gRTEwMDBfUkVBRF9SRUcoaHcsIE1BTkMpOworICAgICAgICBtYW5jICY9IH4oRTEwMDBfTUFOQ19BUlBfRU4pOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIE1BTkMsIG1hbmMpOworICAgIH0KKworICAgIGlmKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEpIHx8IChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSB7CisgICAgICAgIGUxMDAwX3BoeV9pbml0X3NjcmlwdChodyk7CisKKyAgICAgICAgLyogQ29uZmlndXJlIGFjdGl2aXR5IExFRCBhZnRlciBQSFkgcmVzZXQgKi8KKyAgICAgICAgbGVkX2N0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgTEVEQ1RMKTsKKyAgICAgICAgbGVkX2N0cmwgJj0gSUdQX0FDVElWSVRZX0xFRF9NQVNLOworICAgICAgICBsZWRfY3RybCB8PSAoSUdQX0FDVElWSVRZX0xFRF9FTkFCTEUgfCBJR1BfTEVEM19NT0RFKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBMRURDVEwsIGxlZF9jdHJsKTsKKyAgICB9CisKKyAgICAvKiBDbGVhciBpbnRlcnJ1cHQgbWFzayB0byBzdG9wIGJvYXJkIGZyb20gZ2VuZXJhdGluZyBpbnRlcnJ1cHRzICovCisgICAgREVCVUdPVVQoIk1hc2tpbmcgb2ZmIGFsbCBpbnRlcnJ1cHRzXG4iKTsKKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIElNQywgMHhmZmZmZmZmZik7CisKKyAgICAvKiBDbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHQgZXZlbnRzLiAqLworICAgIGljciA9IEUxMDAwX1JFQURfUkVHKGh3LCBJQ1IpOworCisgICAgLyogSWYgTVdJIHdhcyBwcmV2aW91c2x5IGVuYWJsZWQsIHJlZW5hYmxlIGl0LiAqLworICAgIGlmKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApIHsKKyAgICAgICAgaWYoaHctPnBjaV9jbWRfd29yZCAmIENNRF9NRU1fV1JUX0lOVkFMSURBVEUpCisgICAgICAgICAgICBlMTAwMF9wY2lfc2V0X213aShodyk7CisgICAgfQorCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBlcmZvcm1zIGJhc2ljIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGFkYXB0ZXIuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBBc3N1bWVzIHRoYXQgdGhlIGNvbnRyb2xsZXIgaGFzIHByZXZpb3VzbHkgYmVlbiByZXNldCBhbmQgaXMgaW4gYQorICogcG9zdC1yZXNldCB1bmluaXRpYWxpemVkIHN0YXRlLiBJbml0aWFsaXplcyB0aGUgcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVycywKKyAqIG11bHRpY2FzdCB0YWJsZSwgYW5kIFZMQU4gZmlsdGVyIHRhYmxlLiBDYWxscyByb3V0aW5lcyB0byBzZXR1cCBsaW5rCisgKiBjb25maWd1cmF0aW9uIGFuZCBmbG93IGNvbnRyb2wgc2V0dGluZ3MuIENsZWFycyBhbGwgb24tY2hpcCBjb3VudGVycy4gTGVhdmVzCisgKiB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgdW5pdHMgZGlzYWJsZWQgYW5kIHVuaW5pdGlhbGl6ZWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9pbml0X2h3KHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgY3RybDsKKyAgICB1aW50MzJfdCBpOworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwY2l4X2NtZF93b3JkOworICAgIHVpbnQxNl90IHBjaXhfc3RhdF9oaV93b3JkOworICAgIHVpbnQxNl90IGNtZF9tbXJiYzsKKyAgICB1aW50MTZfdCBzdGF0X21tcmJjOworICAgIERFQlVHRlVOQygiZTEwMDBfaW5pdF9odyIpOworCisgICAgLyogSW5pdGlhbGl6ZSBJZGVudGlmaWNhdGlvbiBMRUQgKi8KKyAgICByZXRfdmFsID0gZTEwMDBfaWRfbGVkX2luaXQoaHcpOworICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgREVCVUdPVVQoIkVycm9yIEluaXRpYWxpemluZyBJZGVudGlmaWNhdGlvbiBMRURcbiIpOworICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIG1lZGlhIHR5cGUgYW5kIFRCSSBjb21wYXRpYmlsaXR5ICovCisgICAgZTEwMDBfc2V0X21lZGlhX3R5cGUoaHcpOworCisgICAgLyogRGlzYWJsaW5nIFZMQU4gZmlsdGVyaW5nLiAqLworICAgIERFQlVHT1VUKCJJbml0aWFsaXppbmcgdGhlIElFRUUgVkxBTlxuIik7CisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBWRVQsIDApOworCisgICAgZTEwMDBfY2xlYXJfdmZ0YShodyk7CisKKyAgICAvKiBGb3IgODI1NDIgKHJldiAyLjApLCBkaXNhYmxlIE1XSSBhbmQgcHV0IHRoZSByZWNlaXZlciBpbnRvIHJlc2V0ICovCisgICAgaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkgeworICAgICAgICBERUJVR09VVCgiRGlzYWJsaW5nIE1XSSBvbiA4MjU0MiByZXYgMi4wXG4iKTsKKyAgICAgICAgZTEwMDBfcGNpX2NsZWFyX213aShodyk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgUkNUTCwgRTEwMDBfUkNUTF9SU1QpOworICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgICAgIG1zZWNfZGVsYXkoNSk7CisgICAgfQorCisgICAgLyogU2V0dXAgdGhlIHJlY2VpdmUgYWRkcmVzcy4gVGhpcyBpbnZvbHZlcyBpbml0aWFsaXppbmcgYWxsIG9mIHRoZSBSZWNlaXZlCisgICAgICogQWRkcmVzcyBSZWdpc3RlcnMgKFJBUnMgMCAtIDE1KS4KKyAgICAgKi8KKyAgICBlMTAwMF9pbml0X3J4X2FkZHJzKGh3KTsKKworICAgIC8qIEZvciA4MjU0MiAocmV2IDIuMCksIHRha2UgdGhlIHJlY2VpdmVyIG91dCBvZiByZXNldCBhbmQgZW5hYmxlIE1XSSAqLworICAgIGlmKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApIHsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBSQ1RMLCAwKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgICAgICBtc2VjX2RlbGF5KDEpOworICAgICAgICBpZihody0+cGNpX2NtZF93b3JkICYgQ01EX01FTV9XUlRfSU5WQUxJREFURSkKKyAgICAgICAgICAgIGUxMDAwX3BjaV9zZXRfbXdpKGh3KTsKKyAgICB9CisKKyAgICAvKiBaZXJvIG91dCB0aGUgTXVsdGljYXN0IEhBU0ggdGFibGUgKi8KKyAgICBERUJVR09VVCgiWmVyb2luZyB0aGUgTVRBXG4iKTsKKyAgICBmb3IoaSA9IDA7IGkgPCBFMTAwMF9NQ19UQkxfU0laRTsgaSsrKQorICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIE1UQSwgaSwgMCk7CisKKyAgICAvKiBTZXQgdGhlIFBDSSBwcmlvcml0eSBiaXQgY29ycmVjdGx5IGluIHRoZSBDVFJMIHJlZ2lzdGVyLiAgVGhpcworICAgICAqIGRldGVybWluZXMgaWYgdGhlIGFkYXB0ZXIgZ2l2ZXMgcHJpb3JpdHkgdG8gcmVjZWl2ZXMsIG9yIGlmIGl0CisgICAgICogZ2l2ZXMgZXF1YWwgcHJpb3JpdHkgdG8gdHJhbnNtaXRzIGFuZCByZWNlaXZlcy4KKyAgICAgKi8KKyAgICBpZihody0+ZG1hX2ZhaXJuZXNzKSB7CisgICAgICAgIGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCB8IEUxMDAwX0NUUkxfUFJJT1IpOworICAgIH0KKworICAgIHN3aXRjaChody0+bWFjX3R5cGUpIHsKKyAgICBjYXNlIGUxMDAwXzgyNTQ1X3Jldl8zOgorICAgIGNhc2UgZTEwMDBfODI1NDZfcmV2XzM6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIFdvcmthcm91bmQgZm9yIFBDSS1YIHByb2JsZW0gd2hlbiBCSU9TIHNldHMgTU1SQkMgaW5jb3JyZWN0bHkuICovCisgICAgICAgIGlmKGh3LT5idXNfdHlwZSA9PSBlMTAwMF9idXNfdHlwZV9wY2l4KSB7CisgICAgICAgICAgICBlMTAwMF9yZWFkX3BjaV9jZmcoaHcsIFBDSVhfQ09NTUFORF9SRUdJU1RFUiwgJnBjaXhfY21kX3dvcmQpOworICAgICAgICAgICAgZTEwMDBfcmVhZF9wY2lfY2ZnKGh3LCBQQ0lYX1NUQVRVU19SRUdJU1RFUl9ISSwKKyAgICAgICAgICAgICAgICAmcGNpeF9zdGF0X2hpX3dvcmQpOworICAgICAgICAgICAgY21kX21tcmJjID0gKHBjaXhfY21kX3dvcmQgJiBQQ0lYX0NPTU1BTkRfTU1SQkNfTUFTSykgPj4KKyAgICAgICAgICAgICAgICBQQ0lYX0NPTU1BTkRfTU1SQkNfU0hJRlQ7CisgICAgICAgICAgICBzdGF0X21tcmJjID0gKHBjaXhfc3RhdF9oaV93b3JkICYgUENJWF9TVEFUVVNfSElfTU1SQkNfTUFTSykgPj4KKyAgICAgICAgICAgICAgICBQQ0lYX1NUQVRVU19ISV9NTVJCQ19TSElGVDsKKyAgICAgICAgICAgIGlmKHN0YXRfbW1yYmMgPT0gUENJWF9TVEFUVVNfSElfTU1SQkNfNEspCisgICAgICAgICAgICAgICAgc3RhdF9tbXJiYyA9IFBDSVhfU1RBVFVTX0hJX01NUkJDXzJLOworICAgICAgICAgICAgaWYoY21kX21tcmJjID4gc3RhdF9tbXJiYykgeworICAgICAgICAgICAgICAgIHBjaXhfY21kX3dvcmQgJj0gflBDSVhfQ09NTUFORF9NTVJCQ19NQVNLOworICAgICAgICAgICAgICAgIHBjaXhfY21kX3dvcmQgfD0gc3RhdF9tbXJiYyA8PCBQQ0lYX0NPTU1BTkRfTU1SQkNfU0hJRlQ7CisgICAgICAgICAgICAgICAgZTEwMDBfd3JpdGVfcGNpX2NmZyhodywgUENJWF9DT01NQU5EX1JFR0lTVEVSLAorICAgICAgICAgICAgICAgICAgICAmcGNpeF9jbWRfd29yZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogQ2FsbCBhIHN1YnJvdXRpbmUgdG8gY29uZmlndXJlIHRoZSBsaW5rIGFuZCBzZXR1cCBmbG93IGNvbnRyb2wuICovCisgICAgcmV0X3ZhbCA9IGUxMDAwX3NldHVwX2xpbmsoaHcpOworCisgICAgLyogU2V0IHRoZSB0cmFuc21pdCBkZXNjcmlwdG9yIHdyaXRlLWJhY2sgcG9saWN5ICovCisgICAgaWYoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDQpIHsKKyAgICAgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBUWERDVEwpOworICAgICAgICBjdHJsID0gKGN0cmwgJiB+RTEwMDBfVFhEQ1RMX1dUSFJFU0gpIHwgRTEwMDBfVFhEQ1RMX0ZVTExfVFhfREVTQ19XQjsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBUWERDVEwsIGN0cmwpOworICAgIH0KKworICAgIC8qIENsZWFyIGFsbCBvZiB0aGUgc3RhdGlzdGljcyByZWdpc3RlcnMgKGNsZWFyIG9uIHJlYWQpLiAgSXQgaXMKKyAgICAgKiBpbXBvcnRhbnQgdGhhdCB3ZSBkbyB0aGlzIGFmdGVyIHdlIGhhdmUgdHJpZWQgdG8gZXN0YWJsaXNoIGxpbmsKKyAgICAgKiBiZWNhdXNlIHRoZSBzeW1ib2wgZXJyb3IgY291bnQgd2lsbCBpbmNyZW1lbnQgd2lsZGx5IGlmIHRoZXJlCisgICAgICogaXMgbm8gbGluay4KKyAgICAgKi8KKyAgICBlMTAwMF9jbGVhcl9od19jbnRycyhodyk7CisKKyAgICByZXR1cm4gcmV0X3ZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWRqdXN0IFNFUkRFUyBvdXRwdXQgYW1wbGl0dWRlIGJhc2VkIG9uIEVFUFJPTSBzZXR0aW5nLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX2FkanVzdF9zZXJkZXNfYW1wbGl0dWRlKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDE2X3QgZWVwcm9tX2RhdGE7CisgICAgaW50MzJfdCAgcmV0X3ZhbDsKKworICAgIERFQlVHRlVOQygiZTEwMDBfYWRqdXN0X3NlcmRlc19hbXBsaXR1ZGUiKTsKKworICAgIGlmKGh3LT5tZWRpYV90eXBlICE9IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKQorICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKworICAgIHN3aXRjaChody0+bWFjX3R5cGUpIHsKKyAgICBjYXNlIGUxMDAwXzgyNTQ1X3Jldl8zOgorICAgIGNhc2UgZTEwMDBfODI1NDZfcmV2XzM6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworICAgIH0KKworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX2VlcHJvbShodywgRUVQUk9NX1NFUkRFU19BTVBMSVRVREUsIDEsICZlZXByb21fZGF0YSk7CisgICAgaWYgKHJldF92YWwpIHsKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgfQorCisgICAgaWYoZWVwcm9tX2RhdGEgIT0gRUVQUk9NX1JFU0VSVkVEX1dPUkQpIHsKKyAgICAgICAgLyogQWRqdXN0IFNFUkRFUyBvdXRwdXQgYW1wbGl0dWRlIG9ubHkuICovCisgICAgICAgIGVlcHJvbV9kYXRhICY9IEVFUFJPTV9TRVJERVNfQU1QTElUVURFX01BU0s7IAorICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0VYVF9DVFJMLCBlZXByb21fZGF0YSk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29uZmlndXJlcyBmbG93IGNvbnRyb2wgYW5kIGxpbmsgc2V0dGluZ3MuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBEZXRlcm1pbmVzIHdoaWNoIGZsb3cgY29udHJvbCBzZXR0aW5ncyB0byB1c2UuIENhbGxzIHRoZSBhcHJvcHJpYXRlIG1lZGlhLQorICogc3BlY2lmaWMgbGluayBjb25maWd1cmF0aW9uIGZ1bmN0aW9uLiBDb25maWd1cmVzIHRoZSBmbG93IGNvbnRyb2wgc2V0dGluZ3MuCisgKiBBc3N1bWluZyB0aGUgYWRhcHRlciBoYXMgYSB2YWxpZCBsaW5rIHBhcnRuZXIsIGEgdmFsaWQgbGluayBzaG91bGQgYmUKKyAqIGVzdGFibGlzaGVkLiBBc3N1bWVzIHRoZSBoYXJkd2FyZSBoYXMgcHJldmlvdXNseSBiZWVuIHJlc2V0IGFuZCB0aGUKKyAqIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlciBhcmUgbm90IGVuYWJsZWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9zZXR1cF9saW5rKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgY3RybF9leHQ7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IGVlcHJvbV9kYXRhOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9zZXR1cF9saW5rIik7CisKKyAgICAvKiBSZWFkIGFuZCBzdG9yZSB3b3JkIDB4MEYgb2YgdGhlIEVFUFJPTS4gVGhpcyB3b3JkIGNvbnRhaW5zIGJpdHMKKyAgICAgKiB0aGF0IGRldGVybWluZSB0aGUgaGFyZHdhcmUncyBkZWZhdWx0IFBBVVNFIChmbG93IGNvbnRyb2wpIG1vZGUsCisgICAgICogYSBiaXQgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIEhXIGRlZmF1bHRzIHRvIGVuYWJsaW5nIG9yCisgICAgICogZGlzYWJsaW5nIGF1dG8tbmVnb3RpYXRpb24sIGFuZCB0aGUgZGlyZWN0aW9uIG9mIHRoZQorICAgICAqIFNXIGRlZmluZWQgcGlucy4gSWYgdGhlcmUgaXMgbm8gU1cgb3Zlci1yaWRlIG9mIHRoZSBmbG93CisgICAgICogY29udHJvbCBzZXR0aW5nLCB0aGVuIHRoZSB2YXJpYWJsZSBody0+ZmMgd2lsbAorICAgICAqIGJlIGluaXRpYWxpemVkIGJhc2VkIG9uIGEgdmFsdWUgaW4gdGhlIEVFUFJPTS4KKyAgICAgKi8KKyAgICBpZihlMTAwMF9yZWFkX2VlcHJvbShodywgRUVQUk9NX0lOSVRfQ09OVFJPTDJfUkVHLCAxLCAmZWVwcm9tX2RhdGEpIDwgMCkgeworICAgICAgICBERUJVR09VVCgiRUVQUk9NIFJlYWQgRXJyb3JcbiIpOworICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisgICAgfQorCisgICAgaWYoaHctPmZjID09IGUxMDAwX2ZjX2RlZmF1bHQpIHsKKyAgICAgICAgaWYoKGVlcHJvbV9kYXRhICYgRUVQUk9NX1dPUkQwRl9QQVVTRV9NQVNLKSA9PSAwKQorICAgICAgICAgICAgaHctPmZjID0gZTEwMDBfZmNfbm9uZTsKKyAgICAgICAgZWxzZSBpZigoZWVwcm9tX2RhdGEgJiBFRVBST01fV09SRDBGX1BBVVNFX01BU0spID09CisgICAgICAgICAgICAgICAgRUVQUk9NX1dPUkQwRl9BU01fRElSKQorICAgICAgICAgICAgaHctPmZjID0gZTEwMDBfZmNfdHhfcGF1c2U7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGh3LT5mYyA9IGUxMDAwX2ZjX2Z1bGw7CisgICAgfQorCisgICAgLyogV2Ugd2FudCB0byBzYXZlIG9mZiB0aGUgb3JpZ2luYWwgRmxvdyBDb250cm9sIGNvbmZpZ3VyYXRpb24ganVzdAorICAgICAqIGluIGNhc2Ugd2UgZ2V0IGRpc2Nvbm5lY3RlZCBhbmQgdGhlbiByZWNvbm5lY3RlZCBpbnRvIGEgZGlmZmVyZW50CisgICAgICogaHViIG9yIHN3aXRjaCB3aXRoIGRpZmZlcmVudCBGbG93IENvbnRyb2wgY2FwYWJpbGl0aWVzLgorICAgICAqLworICAgIGlmKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0Ml9yZXYyXzApCisgICAgICAgIGh3LT5mYyAmPSAofmUxMDAwX2ZjX3R4X3BhdXNlKTsKKworICAgIGlmKChody0+bWFjX3R5cGUgPCBlMTAwMF84MjU0MykgJiYgKGh3LT5yZXBvcnRfdHhfZWFybHkgPT0gMSkpCisgICAgICAgIGh3LT5mYyAmPSAofmUxMDAwX2ZjX3J4X3BhdXNlKTsKKworICAgIGh3LT5vcmlnaW5hbF9mYyA9IGh3LT5mYzsKKworICAgIERFQlVHT1VUMSgiQWZ0ZXIgZml4LXVwcyBGbG93Q29udHJvbCBpcyBub3cgPSAleFxuIiwgaHctPmZjKTsKKworICAgIC8qIFRha2UgdGhlIDQgYml0cyBmcm9tIEVFUFJPTSB3b3JkIDB4MEYgdGhhdCBkZXRlcm1pbmUgdGhlIGluaXRpYWwKKyAgICAgKiBwb2xhcml0eSB2YWx1ZSBmb3IgdGhlIFNXIGNvbnRyb2xsZWQgcGlucywgYW5kIHNldHVwIHRoZQorICAgICAqIEV4dGVuZGVkIERldmljZSBDb250cm9sIHJlZyB3aXRoIHRoYXQgaW5mby4KKyAgICAgKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIG9uZSBvZiB0aGUgU1cgY29udHJvbGxlZCBwaW5zIGlzIHVzZWQgZm9yCisgICAgICogc2lnbmFsIGRldGVjdGlvbi4gIFNvIHRoaXMgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIGUxMDAwX3NldHVwX3Bjc19saW5rKCkKKyAgICAgKiBvciBlMTAwMF9waHlfc2V0dXAoKSBpcyBjYWxsZWQuCisgICAgICovCisgICAgaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQzKSB7CisgICAgICAgIGN0cmxfZXh0ID0gKChlZXByb21fZGF0YSAmIEVFUFJPTV9XT1JEMEZfU1dQRElPX0VYVCkgPDwKKyAgICAgICAgICAgICAgICAgICAgU1dEUElPX19FWFRfU0hJRlQpOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkxfRVhULCBjdHJsX2V4dCk7CisgICAgfQorCisgICAgLyogQ2FsbCB0aGUgbmVjZXNzYXJ5IHN1YnJvdXRpbmUgdG8gY29uZmlndXJlIHRoZSBsaW5rLiAqLworICAgIHJldF92YWwgPSAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpID8KKyAgICAgICAgICAgICAgZTEwMDBfc2V0dXBfY29wcGVyX2xpbmsoaHcpIDoKKyAgICAgICAgICAgICAgZTEwMDBfc2V0dXBfZmliZXJfc2VyZGVzX2xpbmsoaHcpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgZmxvdyBjb250cm9sIGFkZHJlc3MsIHR5cGUsIGFuZCBQQVVTRSB0aW1lcgorICAgICAqIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4gIFRoaXMgaXMgZG9uZSBldmVuIGlmIGZsb3cKKyAgICAgKiBjb250cm9sIGlzIGRpc2FibGVkLCBiZWNhdXNlIGl0IGRvZXMgbm90IGh1cnQgYW55dGhpbmcgdG8KKyAgICAgKiBpbml0aWFsaXplIHRoZXNlIHJlZ2lzdGVycy4KKyAgICAgKi8KKyAgICBERUJVR09VVCgiSW5pdGlhbGl6aW5nIHRoZSBGbG93IENvbnRyb2wgYWRkcmVzcywgdHlwZSBhbmQgdGltZXIgcmVnc1xuIik7CisKKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIEZDQUwsIEZMT1dfQ09OVFJPTF9BRERSRVNTX0xPVyk7CisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ0FILCBGTE9XX0NPTlRST0xfQUREUkVTU19ISUdIKTsKKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIEZDVCwgRkxPV19DT05UUk9MX1RZUEUpOworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRkNUVFYsIGh3LT5mY19wYXVzZV90aW1lKTsKKworICAgIC8qIFNldCB0aGUgZmxvdyBjb250cm9sIHJlY2VpdmUgdGhyZXNob2xkIHJlZ2lzdGVycy4gIE5vcm1hbGx5LAorICAgICAqIHRoZXNlIHJlZ2lzdGVycyB3aWxsIGJlIHNldCB0byBhIGRlZmF1bHQgdGhyZXNob2xkIHRoYXQgbWF5IGJlCisgICAgICogYWRqdXN0ZWQgbGF0ZXIgYnkgdGhlIGRyaXZlcidzIHJ1bnRpbWUgY29kZS4gIEhvd2V2ZXIsIGlmIHRoZQorICAgICAqIGFiaWxpdHkgdG8gdHJhbnNtaXQgcGF1c2UgZnJhbWVzIGluIG5vdCBlbmFibGVkLCB0aGVuIHRoZXNlCisgICAgICogcmVnaXN0ZXJzIHdpbGwgYmUgc2V0IHRvIDAuCisgICAgICovCisgICAgaWYoIShody0+ZmMgJiBlMTAwMF9mY190eF9wYXVzZSkpIHsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ1JUTCwgMCk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRkNSVEgsIDApOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFdlIG5lZWQgdG8gc2V0IHVwIHRoZSBSZWNlaXZlIFRocmVzaG9sZCBoaWdoIGFuZCBsb3cgd2F0ZXIgbWFya3MKKyAgICAgICAgICogYXMgd2VsbCBhcyAob3B0aW9uYWxseSkgZW5hYmxpbmcgdGhlIHRyYW5zbWlzc2lvbiBvZiBYT04gZnJhbWVzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYoaHctPmZjX3NlbmRfeG9uKSB7CisgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEZDUlRMLCAoaHctPmZjX2xvd193YXRlciB8IEUxMDAwX0ZDUlRMX1hPTkUpKTsKKyAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRkNSVEgsIGh3LT5mY19oaWdoX3dhdGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRkNSVEwsIGh3LT5mY19sb3dfd2F0ZXIpOworICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBGQ1JUSCwgaHctPmZjX2hpZ2hfd2F0ZXIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXRfdmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTZXRzIHVwIGxpbmsgZm9yIGEgZmliZXIgYmFzZWQgb3Igc2VyZGVzIGJhc2VkIGFkYXB0ZXIKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIE1hbmlwdWxhdGVzIFBoeXNpY2FsIENvZGluZyBTdWJsYXllciBmdW5jdGlvbnMgaW4gb3JkZXIgdG8gY29uZmlndXJlCisgKiBsaW5rLiBBc3N1bWVzIHRoZSBoYXJkd2FyZSBoYXMgYmVlbiBwcmV2aW91c2x5IHJlc2V0IGFuZCB0aGUgdHJhbnNtaXR0ZXIKKyAqIGFuZCByZWNlaXZlciBhcmUgbm90IGVuYWJsZWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfc2V0dXBfZmliZXJfc2VyZGVzX2xpbmsoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBjdHJsOworICAgIHVpbnQzMl90IHN0YXR1czsKKyAgICB1aW50MzJfdCB0eGN3ID0gMDsKKyAgICB1aW50MzJfdCBpOworICAgIHVpbnQzMl90IHNpZ25hbCA9IDA7CisgICAgaW50MzJfdCByZXRfdmFsOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9zZXR1cF9maWJlcl9zZXJkZXNfbGluayIpOworCisgICAgLyogT24gYWRhcHRlcnMgd2l0aCBhIE1BQyBuZXdlciB0aGFuIDgyNTQ0LCBTVyBEZWZpbmVhYmxlIHBpbiAxIHdpbGwgYmUKKyAgICAgKiBzZXQgd2hlbiB0aGUgb3B0aWNzIGRldGVjdCBhIHNpZ25hbC4gT24gb2xkZXIgYWRhcHRlcnMsIGl0IHdpbGwgYmUKKyAgICAgKiBjbGVhcmVkIHdoZW4gdGhlcmUgaXMgYSBzaWduYWwuICBUaGlzIGFwcGxpZXMgdG8gZmliZXIgbWVkaWEgb25seS4KKyAgICAgKiBJZiB3ZSdyZSBvbiBzZXJkZXMgbWVkaWEsIGFkanVzdCB0aGUgb3V0cHV0IGFtcGxpdHVkZSB0byB2YWx1ZSBzZXQgaW4KKyAgICAgKiB0aGUgRUVQUk9NLgorICAgICAqLworICAgIGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisgICAgaWYoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikKKyAgICAgICAgc2lnbmFsID0gKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KSA/IEUxMDAwX0NUUkxfU1dEUElOMSA6IDA7CisKKyAgICByZXRfdmFsID0gZTEwMDBfYWRqdXN0X3NlcmRlc19hbXBsaXR1ZGUoaHcpOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgLyogVGFrZSB0aGUgbGluayBvdXQgb2YgcmVzZXQgKi8KKyAgICBjdHJsICY9IH4oRTEwMDBfQ1RSTF9MUlNUKTsKKworICAgIC8qIEFkanVzdCBWQ08gc3BlZWQgdG8gaW1wcm92ZSBCRVIgcGVyZm9ybWFuY2UgKi8KKyAgICByZXRfdmFsID0gZTEwMDBfc2V0X3Zjb19zcGVlZChodyk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICBlMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QoaHcpOworCisgICAgLyogQ2hlY2sgZm9yIGEgc29mdHdhcmUgb3ZlcnJpZGUgb2YgdGhlIGZsb3cgY29udHJvbCBzZXR0aW5ncywgYW5kIHNldHVwCisgICAgICogdGhlIGRldmljZSBhY2NvcmRpbmdseS4gIElmIGF1dG8tbmVnb3RpYXRpb24gaXMgZW5hYmxlZCwgdGhlbiBzb2Z0d2FyZQorICAgICAqIHdpbGwgaGF2ZSB0byBzZXQgdGhlICJQQVVTRSIgYml0cyB0byB0aGUgY29ycmVjdCB2YWx1ZSBpbiB0aGUgVHJhbm1zaXQKKyAgICAgKiBDb25maWcgV29yZCBSZWdpc3RlciAoVFhDVykgYW5kIHJlLXN0YXJ0IGF1dG8tbmVnb3RpYXRpb24uICBIb3dldmVyLCBpZgorICAgICAqIGF1dG8tbmVnb3RpYXRpb24gaXMgZGlzYWJsZWQsIHRoZW4gc29mdHdhcmUgd2lsbCBoYXZlIHRvIG1hbnVhbGx5CisgICAgICogY29uZmlndXJlIHRoZSB0d28gZmxvdyBjb250cm9sIGVuYWJsZSBiaXRzIGluIHRoZSBDVFJMIHJlZ2lzdGVyLgorICAgICAqCisgICAgICogVGhlIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgImZjIiBwYXJhbWV0ZXIgYXJlOgorICAgICAqICAgICAgMDogIEZsb3cgY29udHJvbCBpcyBjb21wbGV0ZWx5IGRpc2FibGVkCisgICAgICogICAgICAxOiAgUnggZmxvdyBjb250cm9sIGlzIGVuYWJsZWQgKHdlIGNhbiByZWNlaXZlIHBhdXNlIGZyYW1lcywgYnV0CisgICAgICogICAgICAgICAgbm90IHNlbmQgcGF1c2UgZnJhbWVzKS4KKyAgICAgKiAgICAgIDI6ICBUeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHNlbmQgcGF1c2UgZnJhbWVzIGJ1dCB3ZSBkbworICAgICAqICAgICAgICAgIG5vdCBzdXBwb3J0IHJlY2VpdmluZyBwYXVzZSBmcmFtZXMpLgorICAgICAqICAgICAgMzogIEJvdGggUnggYW5kIFRYIGZsb3cgY29udHJvbCAoc3ltbWV0cmljKSBhcmUgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBzd2l0Y2ggKGh3LT5mYykgeworICAgIGNhc2UgZTEwMDBfZmNfbm9uZToKKyAgICAgICAgLyogRmxvdyBjb250cm9sIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQgYnkgYSBzb2Z0d2FyZSBvdmVyLXJpZGUuICovCisgICAgICAgIHR4Y3cgPSAoRTEwMDBfVFhDV19BTkUgfCBFMTAwMF9UWENXX0ZEKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF9mY19yeF9wYXVzZToKKyAgICAgICAgLyogUlggRmxvdyBjb250cm9sIGlzIGVuYWJsZWQgYW5kIFRYIEZsb3cgY29udHJvbCBpcyBkaXNhYmxlZCBieSBhCisgICAgICAgICAqIHNvZnR3YXJlIG92ZXItcmlkZS4gU2luY2UgdGhlcmUgcmVhbGx5IGlzbid0IGEgd2F5IHRvIGFkdmVydGlzZQorICAgICAgICAgKiB0aGF0IHdlIGFyZSBjYXBhYmxlIG9mIFJYIFBhdXNlIE9OTFksIHdlIHdpbGwgYWR2ZXJ0aXNlIHRoYXQgd2UKKyAgICAgICAgICogc3VwcG9ydCBib3RoIHN5bW1ldHJpYyBhbmQgYXN5bW1ldHJpYyBSWCBQQVVTRS4gTGF0ZXIsIHdlIHdpbGwKKyAgICAgICAgICogIGRpc2FibGUgdGhlIGFkYXB0ZXIncyBhYmlsaXR5IHRvIHNlbmQgUEFVU0UgZnJhbWVzLgorICAgICAgICAgKi8KKyAgICAgICAgdHhjdyA9IChFMTAwMF9UWENXX0FORSB8IEUxMDAwX1RYQ1dfRkQgfCBFMTAwMF9UWENXX1BBVVNFX01BU0spOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGUxMDAwX2ZjX3R4X3BhdXNlOgorICAgICAgICAvKiBUWCBGbG93IGNvbnRyb2wgaXMgZW5hYmxlZCwgYW5kIFJYIEZsb3cgY29udHJvbCBpcyBkaXNhYmxlZCwgYnkgYQorICAgICAgICAgKiBzb2Z0d2FyZSBvdmVyLXJpZGUuCisgICAgICAgICAqLworICAgICAgICB0eGN3ID0gKEUxMDAwX1RYQ1dfQU5FIHwgRTEwMDBfVFhDV19GRCB8IEUxMDAwX1RYQ1dfQVNNX0RJUik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfZmNfZnVsbDoKKyAgICAgICAgLyogRmxvdyBjb250cm9sIChib3RoIFJYIGFuZCBUWCkgaXMgZW5hYmxlZCBieSBhIHNvZnR3YXJlIG92ZXItcmlkZS4gKi8KKyAgICAgICAgdHhjdyA9IChFMTAwMF9UWENXX0FORSB8IEUxMDAwX1RYQ1dfRkQgfCBFMTAwMF9UWENXX1BBVVNFX01BU0spOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBERUJVR09VVCgiRmxvdyBjb250cm9sIHBhcmFtIHNldCBpbmNvcnJlY3RseVxuIik7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogU2luY2UgYXV0by1uZWdvdGlhdGlvbiBpcyBlbmFibGVkLCB0YWtlIHRoZSBsaW5rIG91dCBvZiByZXNldCAodGhlIGxpbmsKKyAgICAgKiB3aWxsIGJlIGluIHJlc2V0LCBiZWNhdXNlIHdlIHByZXZpb3VzbHkgcmVzZXQgdGhlIGNoaXApLiBUaGlzIHdpbGwKKyAgICAgKiByZXN0YXJ0IGF1dG8tbmVnb3RpYXRpb24uICBJZiBhdXRvLW5lb2d0aWF0aW9uIGlzIHN1Y2Nlc3NmdWwgdGhlbiB0aGUKKyAgICAgKiBsaW5rLXVwIHN0YXR1cyBiaXQgd2lsbCBiZSBzZXQgYW5kIHRoZSBmbG93IGNvbnRyb2wgZW5hYmxlIGJpdHMgKFJGQ0UKKyAgICAgKiBhbmQgVEZDRSkgd2lsbCBiZSBzZXQgYWNjb3JkaW5nIHRvIHRoZWlyIG5lZ290aWF0ZWQgdmFsdWUuCisgICAgICovCisgICAgREVCVUdPVVQoIkF1dG8tbmVnb3RpYXRpb24gZW5hYmxlZFxuIik7CisKKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIFRYQ1csIHR4Y3cpOworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCk7CisgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworCisgICAgaHctPnR4Y3cgPSB0eGN3OworICAgIG1zZWNfZGVsYXkoMSk7CisKKyAgICAvKiBJZiB3ZSBoYXZlIGEgc2lnbmFsICh0aGUgY2FibGUgaXMgcGx1Z2dlZCBpbikgdGhlbiBwb2xsIGZvciBhICJMaW5rLVVwIgorICAgICAqIGluZGljYXRpb24gaW4gdGhlIERldmljZSBTdGF0dXMgUmVnaXN0ZXIuICBUaW1lLW91dCBpZiBhIGxpbmsgaXNuJ3QKKyAgICAgKiBzZWVuIGluIDUwMCBtaWxsaXNlY29uZHMgc2Vjb25kcyAoQXV0by1uZWdvdGlhdGlvbiBzaG91bGQgY29tcGxldGUgaW4KKyAgICAgKiBsZXNzIHRoYW4gNTAwIG1pbGxpc2Vjb25kcyBldmVuIGlmIHRoZSBvdGhlciBlbmQgaXMgZG9pbmcgaXQgaW4gU1cpLgorICAgICAqIEZvciBpbnRlcm5hbCBzZXJkZXMsIHdlIGp1c3QgYXNzdW1lIGEgc2lnbmFsIGlzIHByZXNlbnQsIHRoZW4gcG9sbC4KKyAgICAgKi8KKyAgICBpZihody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcyB8fAorICAgICAgIChFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCkgJiBFMTAwMF9DVFJMX1NXRFBJTjEpID09IHNpZ25hbCkgeworICAgICAgICBERUJVR09VVCgiTG9va2luZyBmb3IgTGlua1xuIik7CisgICAgICAgIGZvcihpID0gMDsgaSA8IChMSU5LX1VQX1RJTUVPVVQgLyAxMCk7IGkrKykgeworICAgICAgICAgICAgbXNlY19kZWxheSgxMCk7CisgICAgICAgICAgICBzdGF0dXMgPSBFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKTsKKyAgICAgICAgICAgIGlmKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19MVSkgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYoaSA9PSAoTElOS19VUF9USU1FT1VUIC8gMTApKSB7CisgICAgICAgICAgICBERUJVR09VVCgiTmV2ZXIgZ290IGEgdmFsaWQgbGluayBmcm9tIGF1dG8tbmVnISEhXG4iKTsKKyAgICAgICAgICAgIGh3LT5hdXRvbmVnX2ZhaWxlZCA9IDE7CisgICAgICAgICAgICAvKiBBdXRvTmVnIGZhaWxlZCB0byBhY2hpZXZlIGEgbGluaywgc28gd2UnbGwgY2FsbAorICAgICAgICAgICAgICogZTEwMDBfY2hlY2tfZm9yX2xpbmsuIFRoaXMgcm91dGluZSB3aWxsIGZvcmNlIHRoZSBsaW5rIHVwIGlmCisgICAgICAgICAgICAgKiB3ZSBkZXRlY3QgYSBzaWduYWwuIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBjb21tdW5pY2F0ZSB3aXRoCisgICAgICAgICAgICAgKiBub24tYXV0b25lZ290aWF0aW5nIGxpbmsgcGFydG5lcnMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9jaGVja19mb3JfbGluayhodyk7CisgICAgICAgICAgICBpZihyZXRfdmFsKSB7CisgICAgICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIHdoaWxlIGNoZWNraW5nIGZvciBsaW5rXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGh3LT5hdXRvbmVnX2ZhaWxlZCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBody0+YXV0b25lZ19mYWlsZWQgPSAwOworICAgICAgICAgICAgREVCVUdPVVQoIlZhbGlkIExpbmsgRm91bmRcbiIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVCVUdPVVQoIk5vIFNpZ25hbCBEZXRlY3RlZFxuIik7CisgICAgfQorICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERldGVjdHMgd2hpY2ggUEhZIGlzIHByZXNlbnQgYW5kIHRoZSBzcGVlZCBhbmQgZHVwbGV4CisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfc2V0dXBfY29wcGVyX2xpbmsoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBjdHJsOworICAgIHVpbnQzMl90IGxlZF9jdHJsOworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBpOworICAgIHVpbnQxNl90IHBoeV9kYXRhOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9zZXR1cF9jb3BwZXJfbGluayIpOworCisgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKyAgICAvKiBXaXRoIDgyNTQzLCB3ZSBuZWVkIHRvIGZvcmNlIHNwZWVkIGFuZCBkdXBsZXggb24gdGhlIE1BQyBlcXVhbCB0byB3aGF0CisgICAgICogdGhlIFBIWSBzcGVlZCBhbmQgZHVwbGV4IGNvbmZpZ3VyYXRpb24gaXMuIEluIGFkZGl0aW9uLCB3ZSBuZWVkIHRvCisgICAgICogcGVyZm9ybSBhIGhhcmR3YXJlIHJlc2V0IG9uIHRoZSBQSFkgdG8gdGFrZSBpdCBvdXQgb2YgcmVzZXQuCisgICAgICovCisgICAgaWYoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDMpIHsKKyAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NMVTsKKyAgICAgICAgY3RybCAmPSB+KEUxMDAwX0NUUkxfRlJDU1BEIHwgRTEwMDBfQ1RSTF9GUkNEUFgpOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIGN0cmwpOworICAgIH0gZWxzZSB7CisgICAgICAgIGN0cmwgfD0gKEUxMDAwX0NUUkxfRlJDU1BEIHwgRTEwMDBfQ1RSTF9GUkNEUFggfCBFMTAwMF9DVFJMX1NMVSk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCk7CisgICAgICAgIGUxMDAwX3BoeV9od19yZXNldChodyk7CisgICAgfQorCisgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBQSFkgKi8KKyAgICByZXRfdmFsID0gZTEwMDBfZGV0ZWN0X2dpZ19waHkoaHcpOworICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgREVCVUdPVVQoIkVycm9yLCBkaWQgbm90IGRldGVjdCB2YWxpZCBwaHkuXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgfQorICAgIERFQlVHT1VUMSgiUGh5IElEID0gJXggXG4iLCBody0+cGh5X2lkKTsKKworICAgIC8qIFNldCBQSFkgdG8gY2xhc3MgQSBtb2RlIChpZiBuZWNlc3NhcnkpICovCisgICAgcmV0X3ZhbCA9IGUxMDAwX3NldF9waHlfbW9kZShodyk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICBpZigoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ1X3Jldl8zKSB8fAorICAgICAgIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDZfcmV2XzMpKSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsICZwaHlfZGF0YSk7CisgICAgICAgIHBoeV9kYXRhIHw9IDB4MDAwMDAwMDg7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19DVFJMLCBwaHlfZGF0YSk7CisgICAgfQorCisgICAgaWYoaHctPm1hY190eXBlIDw9IGUxMDAwXzgyNTQzIHx8CisgICAgICAgaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxIHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NyB8fAorICAgICAgIGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MV9yZXZfMiB8fCBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDdfcmV2XzIpCisgICAgICAgIGh3LT5waHlfcmVzZXRfZGlzYWJsZSA9IEZBTFNFOworCisgICAgaWYoIWh3LT5waHlfcmVzZXRfZGlzYWJsZSkgeworICAgICAgICBpZiAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9pZ3ApIHsKKworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3BoeV9yZXNldChodyk7CisgICAgICAgICAgICBpZihyZXRfdmFsKSB7CisgICAgICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIFJlc2V0dGluZyB0aGUgUEhZXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogV2FpdCAxMG1zIGZvciBNQUMgdG8gY29uZmlndXJlIFBIWSBmcm9tIGVlcHJvbSBzZXR0aW5ncyAqLworICAgICAgICAgICAgbXNlY19kZWxheSgxNSk7CisKKyAgICAgICAgICAgIC8qIENvbmZpZ3VyZSBhY3Rpdml0eSBMRUQgYWZ0ZXIgUEhZIHJlc2V0ICovCisgICAgICAgICAgICBsZWRfY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBMRURDVEwpOworICAgICAgICAgICAgbGVkX2N0cmwgJj0gSUdQX0FDVElWSVRZX0xFRF9NQVNLOworICAgICAgICAgICAgbGVkX2N0cmwgfD0gKElHUF9BQ1RJVklUWV9MRURfRU5BQkxFIHwgSUdQX0xFRDNfTU9ERSk7CisgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIExFRENUTCwgbGVkX2N0cmwpOworCisgICAgICAgICAgICAvKiBkaXNhYmxlIGxwbHUgZDMgZHVyaW5nIGRyaXZlciBpbml0ICovCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfc2V0X2QzX2xwbHVfc3RhdGUoaHcsIEZBTFNFKTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgRGlzYWJsaW5nIExQTFUgRDNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDb25maWd1cmUgbWRpLW1kaXggc2V0dGluZ3MgKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ1RSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgIGlmKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEpIHx8IChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSB7CisgICAgICAgICAgICAgICAgaHctPmRzcF9jb25maWdfc3RhdGUgPSBlMTAwMF9kc3BfY29uZmlnX2Rpc2FibGVkOworICAgICAgICAgICAgICAgIC8qIEZvcmNlIE1ESSBmb3IgZWFybGllciByZXZzIG9mIHRoZSBJR1AgUEhZICovCisgICAgICAgICAgICAgICAgcGh5X2RhdGEgJj0gfihJR1AwMUUxMDAwX1BTQ1JfQVVUT19NRElYIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUFNDUl9GT1JDRV9NRElfTURJWCk7CisgICAgICAgICAgICAgICAgaHctPm1kaXggPSAxOworCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGh3LT5kc3BfY29uZmlnX3N0YXRlID0gZTEwMDBfZHNwX2NvbmZpZ19lbmFibGVkOworICAgICAgICAgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ1JfQVVUT19NRElYOworCisgICAgICAgICAgICAgICAgc3dpdGNoIChody0+bWRpeCkgeworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDUl9GT1JDRV9NRElfTURJWDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSB8PSBJR1AwMUUxMDAwX1BTQ1JfRk9SQ0VfTURJX01ESVg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSB8PSBJR1AwMUUxMDAwX1BTQ1JfQVVUT19NRElYOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DVFJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgLyogc2V0IGF1dG8tbWFzdGVyIHNsYXZlIHJlc29sdXRpb24gc2V0dGluZ3MgKi8KKyAgICAgICAgICAgIGlmKGh3LT5hdXRvbmVnKSB7CisgICAgICAgICAgICAgICAgZTEwMDBfbXNfdHlwZSBwaHlfbXNfc2V0dGluZyA9IGh3LT5tYXN0ZXJfc2xhdmU7CisKKyAgICAgICAgICAgICAgICBpZihody0+ZmZlX2NvbmZpZ19zdGF0ZSA9PSBlMTAwMF9mZmVfY29uZmlnX2FjdGl2ZSkKKyAgICAgICAgICAgICAgICAgICAgaHctPmZmZV9jb25maWdfc3RhdGUgPSBlMTAwMF9mZmVfY29uZmlnX2VuYWJsZWQ7CisKKyAgICAgICAgICAgICAgICBpZihody0+ZHNwX2NvbmZpZ19zdGF0ZSA9PSBlMTAwMF9kc3BfY29uZmlnX2FjdGl2YXRlZCkKKyAgICAgICAgICAgICAgICAgICAgaHctPmRzcF9jb25maWdfc3RhdGUgPSBlMTAwMF9kc3BfY29uZmlnX2VuYWJsZWQ7CisKKyAgICAgICAgICAgICAgICAvKiB3aGVuIGF1dG9uZWdvdGlhdGlvbiBhZHZlcnRpc21lbnQgaXMgb25seSAxMDAwTWJwcyB0aGVuIHdlCisgICAgICAgICAgICAgICAgICogc2hvdWxkIGRpc2FibGUgU21hcnRTcGVlZCBhbmQgZW5hYmxlIEF1dG8gTWFzdGVyU2xhdmUKKyAgICAgICAgICAgICAgICAgKiByZXNvbHV0aW9uIGFzIGhhcmR3YXJlIGRlZmF1bHQuICovCisgICAgICAgICAgICAgICAgaWYoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9PSBBRFZFUlRJU0VfMTAwMF9GVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIERpc2FibGUgU21hcnRTcGVlZCAqLworICAgICAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOworICAgICAgICAgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ0ZSX1NNQVJUX1NQRUVEOworICAgICAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgICAgICAgICAvKiBTZXQgYXV0byBNYXN0ZXIvU2xhdmUgcmVzb2x1dGlvbiBwcm9jZXNzICovCisgICAgICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9DVFJMLCAmcGh5X2RhdGEpOworICAgICAgICAgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhICY9IH5DUl8xMDAwVF9NU19FTkFCTEU7CisgICAgICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBQSFlfMTAwMFRfQ1RSTCwgcGh5X2RhdGEpOworICAgICAgICAgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZXzEwMDBUX0NUUkwsICZwaHlfZGF0YSk7CisgICAgICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgICAgICAvKiBsb2FkIGRlZmF1bHRzIGZvciBmdXR1cmUgdXNlICovCisgICAgICAgICAgICAgICAgaHctPm9yaWdpbmFsX21hc3Rlcl9zbGF2ZSA9IChwaHlfZGF0YSAmIENSXzEwMDBUX01TX0VOQUJMRSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBoeV9kYXRhICYgQ1JfMTAwMFRfTVNfVkFMVUUpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUxMDAwX21zX2ZvcmNlX21hc3RlciA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlMTAwMF9tc19mb3JjZV9zbGF2ZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEwMDBfbXNfYXV0bzsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAocGh5X21zX3NldHRpbmcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGUxMDAwX21zX2ZvcmNlX21hc3RlcjoKKyAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEgfD0gKENSXzEwMDBUX01TX0VOQUJMRSB8IENSXzEwMDBUX01TX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBlMTAwMF9tc19mb3JjZV9zbGF2ZToKKyAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEgfD0gQ1JfMTAwMFRfTVNfRU5BQkxFOworICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSAmPSB+KENSXzEwMDBUX01TX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBlMTAwMF9tc19hdXRvOgorICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSAmPSB+Q1JfMTAwMFRfTVNfRU5BQkxFOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZXzEwMDBUX0NUUkwsIHBoeV9kYXRhKTsKKyAgICAgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEVuYWJsZSBDUlMgb24gVFguIFRoaXMgbXVzdCBiZSBzZXQgZm9yIGhhbGYtZHVwbGV4IG9wZXJhdGlvbi4gKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICBwaHlfZGF0YSB8PSBNODhFMTAwMF9QU0NSX0FTU0VSVF9DUlNfT05fVFg7CisKKyAgICAgICAgICAgIC8qIE9wdGlvbnM6CisgICAgICAgICAgICAgKiAgIE1ESS9NREktWCA9IDAgKGRlZmF1bHQpCisgICAgICAgICAgICAgKiAgIDAgLSBBdXRvIGZvciBhbGwgc3BlZWRzCisgICAgICAgICAgICAgKiAgIDEgLSBNREkgbW9kZQorICAgICAgICAgICAgICogICAyIC0gTURJLVggbW9kZQorICAgICAgICAgICAgICogICAzIC0gQXV0byBmb3IgMTAwMEJhc2UtVCBvbmx5IChNREktWCBmb3IgMTAvMTAwQmFzZS1UIG1vZGVzKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwaHlfZGF0YSAmPSB+TTg4RTEwMDBfUFNDUl9BVVRPX1hfTU9ERTsKKworICAgICAgICAgICAgc3dpdGNoIChody0+bWRpeCkgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHBoeV9kYXRhIHw9IE04OEUxMDAwX1BTQ1JfTURJX01BTlVBTF9NT0RFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHBoeV9kYXRhIHw9IE04OEUxMDAwX1BTQ1JfTURJWF9NQU5VQUxfTU9ERTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBwaHlfZGF0YSB8PSBNODhFMTAwMF9QU0NSX0FVVE9fWF8xMDAwVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9BVVRPX1hfTU9ERTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogT3B0aW9uczoKKyAgICAgICAgICAgICAqICAgZGlzYWJsZV9wb2xhcml0eV9jb3JyZWN0aW9uID0gMCAoZGVmYXVsdCkKKyAgICAgICAgICAgICAqICAgICAgIEF1dG9tYXRpYyBDb3JyZWN0aW9uIGZvciBSZXZlcnNlZCBDYWJsZSBQb2xhcml0eQorICAgICAgICAgICAgICogICAwIC0gRGlzYWJsZWQKKyAgICAgICAgICAgICAqICAgMSAtIEVuYWJsZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcGh5X2RhdGEgJj0gfk04OEUxMDAwX1BTQ1JfUE9MQVJJVFlfUkVWRVJTQUw7CisgICAgICAgICAgICBpZihody0+ZGlzYWJsZV9wb2xhcml0eV9jb3JyZWN0aW9uID09IDEpCisgICAgICAgICAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfUFNDUl9QT0xBUklUWV9SRVZFUlNBTDsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19DVFJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgLyogRm9yY2UgVFhfQ0xLIGluIHRoZSBFeHRlbmRlZCBQSFkgU3BlY2lmaWMgQ29udHJvbCBSZWdpc3RlcgorICAgICAgICAgICAgICogdG8gMjVNSHogY2xvY2suCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX0VYVF9QSFlfU1BFQ19DVFJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgcGh5X2RhdGEgfD0gTTg4RTEwMDBfRVBTQ1JfVFhfQ0xLXzI1OworCisgICAgICAgICAgICBpZiAoaHctPnBoeV9yZXZpc2lvbiA8IE04OEUxMDExX0lfUkVWXzQpIHsKKyAgICAgICAgICAgICAgICAvKiBDb25maWd1cmUgTWFzdGVyIGFuZCBTbGF2ZSBkb3duc2hpZnQgdmFsdWVzICovCisgICAgICAgICAgICAgICAgcGh5X2RhdGEgJj0gfihNODhFMTAwMF9FUFNDUl9NQVNURVJfRE9XTlNISUZUX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTg4RTEwMDBfRVBTQ1JfU0xBVkVfRE9XTlNISUZUX01BU0spOworICAgICAgICAgICAgICAgIHBoeV9kYXRhIHw9IChNODhFMTAwMF9FUFNDUl9NQVNURVJfRE9XTlNISUZUXzFYIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTg4RTEwMDBfRVBTQ1JfU0xBVkVfRE9XTlNISUZUXzFYKTsKKyAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfRVhUX1BIWV9TUEVDX0NUUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOworICAgICAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTVyBSZXNldCB0aGUgUEhZIHNvIGFsbCBjaGFuZ2VzIHRha2UgZWZmZWN0ICovCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcGh5X3Jlc2V0KGh3KTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgUmVzZXR0aW5nIHRoZSBQSFlcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogT3B0aW9uczoKKyAgICAgICAgICogICBhdXRvbmVnID0gMSAoZGVmYXVsdCkKKyAgICAgICAgICogICAgICBQSFkgd2lsbCBhZHZlcnRpc2UgdmFsdWUocykgcGFyc2VkIGZyb20KKyAgICAgICAgICogICAgICBhdXRvbmVnX2FkdmVydGlzZWQgYW5kIGZjCisgICAgICAgICAqICAgYXV0b25lZyA9IDAKKyAgICAgICAgICogICAgICBQSFkgd2lsbCBiZSBzZXQgdG8gMTBILCAxMEYsIDEwMEgsIG9yIDEwMEYKKyAgICAgICAgICogICAgICBkZXBlbmRpbmcgb24gdmFsdWUgcGFyc2VkIGZyb20gZm9yY2VkX3NwZWVkX2R1cGxleC4KKyAgICAgICAgICovCisKKyAgICAgICAgLyogSXMgYXV0b25lZyBlbmFibGVkPyAgVGhpcyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgb3IgYnkgc29mdHdhcmUKKyAgICAgICAgICogb3ZlcnJpZGUuICBJZiBzbywgY2FsbCBlMTAwMF9waHlfc2V0dXBfYXV0b25lZyByb3V0aW5lIHRvIHBhcnNlIHRoZQorICAgICAgICAgKiBhdXRvbmVnX2FkdmVydGlzZWQgYW5kIGZjIG9wdGlvbnMuIElmIGF1dG9uZWcgaXMgTk9UIGVuYWJsZWQsIHRoZW4KKyAgICAgICAgICogdGhlIHVzZXIgc2hvdWxkIGhhdmUgcHJvdmlkZWQgYSBzcGVlZC9kdXBsZXggb3ZlcnJpZGUuICBJZiBzbywgdGhlbgorICAgICAgICAgKiBjYWxsIGUxMDAwX3BoeV9mb3JjZV9zcGVlZF9kdXBsZXggdG8gcGFyc2UgYW5kIHNldCB0aGlzIHVwLgorICAgICAgICAgKi8KKyAgICAgICAgaWYoaHctPmF1dG9uZWcpIHsKKyAgICAgICAgICAgIC8qIFBlcmZvcm0gc29tZSBib3VuZHMgY2hlY2tpbmcgb24gdGhlIGh3LT5hdXRvbmVnX2FkdmVydGlzZWQKKyAgICAgICAgICAgICAqIHBhcmFtZXRlci4gIElmIHRoaXMgdmFyaWFibGUgaXMgemVybywgdGhlbiBzZXQgaXQgdG8gdGhlIGRlZmF1bHQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgJj0gQVVUT05FR19BRFZFUlRJU0VfU1BFRURfREVGQVVMVDsKKworICAgICAgICAgICAgLyogSWYgYXV0b25lZ19hZHZlcnRpc2VkIGlzIHplcm8sIHdlIGFzc3VtZSBpdCB3YXMgbm90IGRlZmF1bHRlZAorICAgICAgICAgICAgICogYnkgdGhlIGNhbGxpbmcgY29kZSBzbyB3ZSBzZXQgdG8gYWR2ZXJ0aXNlIGZ1bGwgY2FwYWJpbGl0eS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9PSAwKQorICAgICAgICAgICAgICAgIGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPSBBVVRPTkVHX0FEVkVSVElTRV9TUEVFRF9ERUZBVUxUOworCisgICAgICAgICAgICBERUJVR09VVCgiUmVjb25maWd1cmluZyBhdXRvLW5lZyBhZHZlcnRpc2VtZW50IHBhcmFtc1xuIik7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcGh5X3NldHVwX2F1dG9uZWcoaHcpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBTZXR0aW5nIHVwIEF1dG8tTmVnb3RpYXRpb25cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREVCVUdPVVQoIlJlc3RhcnRpbmcgQXV0by1OZWdcbiIpOworCisgICAgICAgICAgICAvKiBSZXN0YXJ0IGF1dG8tbmVnb3RpYXRpb24gYnkgc2V0dGluZyB0aGUgQXV0byBOZWcgRW5hYmxlIGJpdCBhbmQKKyAgICAgICAgICAgICAqIHRoZSBBdXRvIE5lZyBSZXN0YXJ0IGJpdCBpbiB0aGUgUEhZIGNvbnRyb2wgcmVnaXN0ZXIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9DVFJMLCAmcGh5X2RhdGEpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgcGh5X2RhdGEgfD0gKE1JSV9DUl9BVVRPX05FR19FTiB8IE1JSV9DUl9SRVNUQVJUX0FVVE9fTkVHKTsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBQSFlfQ1RSTCwgcGh5X2RhdGEpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgLyogRG9lcyB0aGUgdXNlciB3YW50IHRvIHdhaXQgZm9yIEF1dG8tTmVnIHRvIGNvbXBsZXRlIGhlcmUsIG9yCisgICAgICAgICAgICAgKiBjaGVjayBhdCBhIGxhdGVyIHRpbWUgKGZvciBleGFtcGxlLCBjYWxsYmFjayByb3V0aW5lKS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYoaHctPndhaXRfYXV0b25lZ19jb21wbGV0ZSkgeworICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93YWl0X2F1dG9uZWcoaHcpOworICAgICAgICAgICAgICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIHdoaWxlIHdhaXRpbmcgZm9yIGF1dG9uZWcgdG8gY29tcGxldGVcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBody0+Z2V0X2xpbmtfc3RhdHVzID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIERFQlVHT1VUKCJGb3JjaW5nIHNwZWVkIGFuZCBkdXBsZXhcbiIpOworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3BoeV9mb3JjZV9zcGVlZF9kdXBsZXgoaHcpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBGb3JjaW5nIFNwZWVkIGFuZCBEdXBsZXhcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAvKiAhaHctPnBoeV9yZXNldF9kaXNhYmxlICovCisKKyAgICAvKiBDaGVjayBsaW5rIHN0YXR1cy4gV2FpdCB1cCB0byAxMDAgbWljcm9zZWNvbmRzIGZvciBsaW5rIHRvIGJlY29tZQorICAgICAqIHZhbGlkLgorICAgICAqLworICAgIGZvcihpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgaWYocGh5X2RhdGEgJiBNSUlfU1JfTElOS19TVEFUVVMpIHsKKyAgICAgICAgICAgIC8qIFdlIGhhdmUgbGluaywgc28gd2UgbmVlZCB0byBmaW5pc2ggdGhlIGNvbmZpZyBwcm9jZXNzOgorICAgICAgICAgICAgICogICAxKSBTZXQgdXAgdGhlIE1BQyB0byB0aGUgY3VycmVudCBQSFkgc3BlZWQvZHVwbGV4CisgICAgICAgICAgICAgKiAgICAgIGlmIHdlIGFyZSBvbiA4MjU0My4gIElmIHdlCisgICAgICAgICAgICAgKiAgICAgIGFyZSBvbiBuZXdlciBzaWxpY29uLCB3ZSBvbmx5IG5lZWQgdG8gY29uZmlndXJlCisgICAgICAgICAgICAgKiAgICAgIGNvbGxpc2lvbiBkaXN0YW5jZSBpbiB0aGUgVHJhbnNtaXQgQ29udHJvbCBSZWdpc3Rlci4KKyAgICAgICAgICAgICAqICAgMikgU2V0IHVwIGZsb3cgY29udHJvbCBvbiB0aGUgTUFDIHRvIHRoYXQgZXN0YWJsaXNoZWQgd2l0aAorICAgICAgICAgICAgICogICAgICB0aGUgbGluayBwYXJ0bmVyLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZihody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDQpIHsKKyAgICAgICAgICAgICAgICBlMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QoaHcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfY29uZmlnX21hY190b19waHkoaHcpOworICAgICAgICAgICAgICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIGNvbmZpZ3VyaW5nIE1BQyB0byBQSFkgc2V0dGluZ3NcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfY29uZmlnX2ZjX2FmdGVyX2xpbmtfdXAoaHcpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBDb25maWd1cmluZyBGbG93IENvbnRyb2xcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREVCVUdPVVQoIlZhbGlkIGxpbmsgZXN0YWJsaXNoZWQhISFcbiIpOworCisgICAgICAgICAgICBpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkgeworICAgICAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9jb25maWdfZHNwX2FmdGVyX2xpbmtfY2hhbmdlKGh3LCBUUlVFKTsKKyAgICAgICAgICAgICAgICBpZihyZXRfdmFsKSB7CisgICAgICAgICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBDb25maWd1cmluZyBEU1AgYWZ0ZXIgbGluayB1cFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERFQlVHT1VUKCJWYWxpZCBsaW5rIGVzdGFibGlzaGVkISEhXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworICAgICAgICB9CisgICAgICAgIHVkZWxheSgxMCk7CisgICAgfQorCisgICAgREVCVUdPVVQoIlVuYWJsZSB0byBlc3RhYmxpc2ggbGluayEhIVxuIik7CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29uZmlndXJlcyBQSFkgYXV0b25lZyBhbmQgZmxvdyBjb250cm9sIGFkdmVydGlzZW1lbnQgc2V0dGluZ3MKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX3BoeV9zZXR1cF9hdXRvbmVnKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IG1paV9hdXRvbmVnX2Fkdl9yZWc7CisgICAgdWludDE2X3QgbWlpXzEwMDB0X2N0cmxfcmVnOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9waHlfc2V0dXBfYXV0b25lZyIpOworCisgICAgLyogUmVhZCB0aGUgTUlJIEF1dG8tTmVnIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIgKEFkZHJlc3MgNCkuICovCisgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0FVVE9ORUdfQURWLCAmbWlpX2F1dG9uZWdfYWR2X3JlZyk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAvKiBSZWFkIHRoZSBNSUkgMTAwMEJhc2UtVCBDb250cm9sIFJlZ2lzdGVyIChBZGRyZXNzIDkpLiAqLworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9DVFJMLCAmbWlpXzEwMDB0X2N0cmxfcmVnKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIC8qIE5lZWQgdG8gcGFyc2UgYm90aCBhdXRvbmVnX2FkdmVydGlzZWQgYW5kIGZjIGFuZCBzZXQgdXAKKyAgICAgKiB0aGUgYXBwcm9wcmlhdGUgUEhZIHJlZ2lzdGVycy4gIEZpcnN0IHdlIHdpbGwgcGFyc2UgZm9yCisgICAgICogYXV0b25lZ19hZHZlcnRpc2VkIHNvZnR3YXJlIG92ZXJyaWRlLiAgU2luY2Ugd2UgY2FuIGFkdmVydGlzZQorICAgICAqIGEgcGxldGhvcmEgb2YgY29tYmluYXRpb25zLCB3ZSBuZWVkIHRvIGNoZWNrIGVhY2ggYml0CisgICAgICogaW5kaXZpZHVhbGx5LgorICAgICAqLworCisgICAgLyogRmlyc3Qgd2UgY2xlYXIgYWxsIHRoZSAxMC8xMDAgbWIgc3BlZWQgYml0cyBpbiB0aGUgQXV0by1OZWcKKyAgICAgKiBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyIChBZGRyZXNzIDQpIGFuZCB0aGUgMTAwMCBtYiBzcGVlZCBiaXRzIGluCisgICAgICogdGhlICAxMDAwQmFzZS1UIENvbnRyb2wgUmVnaXN0ZXIgKEFkZHJlc3MgOSkuCisgICAgICovCisgICAgbWlpX2F1dG9uZWdfYWR2X3JlZyAmPSB+UkVHNF9TUEVFRF9NQVNLOworICAgIG1paV8xMDAwdF9jdHJsX3JlZyAmPSB+UkVHOV9TUEVFRF9NQVNLOworCisgICAgREVCVUdPVVQxKCJhdXRvbmVnX2FkdmVydGlzZWQgJXhcbiIsIGh3LT5hdXRvbmVnX2FkdmVydGlzZWQpOworCisgICAgLyogRG8gd2Ugd2FudCB0byBhZHZlcnRpc2UgMTAgTWIgSGFsZiBEdXBsZXg/ICovCisgICAgaWYoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCAmIEFEVkVSVElTRV8xMF9IQUxGKSB7CisgICAgICAgIERFQlVHT1VUKCJBZHZlcnRpc2UgMTBtYiBIYWxmIGR1cGxleFxuIik7CisgICAgICAgIG1paV9hdXRvbmVnX2Fkdl9yZWcgfD0gTldBWV9BUl8xMFRfSERfQ0FQUzsKKyAgICB9CisKKyAgICAvKiBEbyB3ZSB3YW50IHRvIGFkdmVydGlzZSAxMCBNYiBGdWxsIER1cGxleD8gKi8KKyAgICBpZihody0+YXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwX0ZVTEwpIHsKKyAgICAgICAgREVCVUdPVVQoIkFkdmVydGlzZSAxMG1iIEZ1bGwgZHVwbGV4XG4iKTsKKyAgICAgICAgbWlpX2F1dG9uZWdfYWR2X3JlZyB8PSBOV0FZX0FSXzEwVF9GRF9DQVBTOworICAgIH0KKworICAgIC8qIERvIHdlIHdhbnQgdG8gYWR2ZXJ0aXNlIDEwMCBNYiBIYWxmIER1cGxleD8gKi8KKyAgICBpZihody0+YXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwMF9IQUxGKSB7CisgICAgICAgIERFQlVHT1VUKCJBZHZlcnRpc2UgMTAwbWIgSGFsZiBkdXBsZXhcbiIpOworICAgICAgICBtaWlfYXV0b25lZ19hZHZfcmVnIHw9IE5XQVlfQVJfMTAwVFhfSERfQ0FQUzsKKyAgICB9CisKKyAgICAvKiBEbyB3ZSB3YW50IHRvIGFkdmVydGlzZSAxMDAgTWIgRnVsbCBEdXBsZXg/ICovCisgICAgaWYoaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCAmIEFEVkVSVElTRV8xMDBfRlVMTCkgeworICAgICAgICBERUJVR09VVCgiQWR2ZXJ0aXNlIDEwMG1iIEZ1bGwgZHVwbGV4XG4iKTsKKyAgICAgICAgbWlpX2F1dG9uZWdfYWR2X3JlZyB8PSBOV0FZX0FSXzEwMFRYX0ZEX0NBUFM7CisgICAgfQorCisgICAgLyogV2UgZG8gbm90IGFsbG93IHRoZSBQaHkgdG8gYWR2ZXJ0aXNlIDEwMDAgTWIgSGFsZiBEdXBsZXggKi8KKyAgICBpZihody0+YXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwMDBfSEFMRikgeworICAgICAgICBERUJVR09VVCgiQWR2ZXJ0aXNlIDEwMDBtYiBIYWxmIGR1cGxleCByZXF1ZXN0ZWQsIHJlcXVlc3QgZGVuaWVkIVxuIik7CisgICAgfQorCisgICAgLyogRG8gd2Ugd2FudCB0byBhZHZlcnRpc2UgMTAwMCBNYiBGdWxsIER1cGxleD8gKi8KKyAgICBpZihody0+YXV0b25lZ19hZHZlcnRpc2VkICYgQURWRVJUSVNFXzEwMDBfRlVMTCkgeworICAgICAgICBERUJVR09VVCgiQWR2ZXJ0aXNlIDEwMDBtYiBGdWxsIGR1cGxleFxuIik7CisgICAgICAgIG1paV8xMDAwdF9jdHJsX3JlZyB8PSBDUl8xMDAwVF9GRF9DQVBTOworICAgIH0KKworICAgIC8qIENoZWNrIGZvciBhIHNvZnR3YXJlIG92ZXJyaWRlIG9mIHRoZSBmbG93IGNvbnRyb2wgc2V0dGluZ3MsIGFuZAorICAgICAqIHNldHVwIHRoZSBQSFkgYWR2ZXJ0aXNlbWVudCByZWdpc3RlcnMgYWNjb3JkaW5nbHkuICBJZgorICAgICAqIGF1dG8tbmVnb3RpYXRpb24gaXMgZW5hYmxlZCwgdGhlbiBzb2Z0d2FyZSB3aWxsIGhhdmUgdG8gc2V0IHRoZQorICAgICAqICJQQVVTRSIgYml0cyB0byB0aGUgY29ycmVjdCB2YWx1ZSBpbiB0aGUgQXV0by1OZWdvdGlhdGlvbgorICAgICAqIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIgKFBIWV9BVVRPTkVHX0FEVikgYW5kIHJlLXN0YXJ0IGF1dG8tbmVnb3RpYXRpb24uCisgICAgICoKKyAgICAgKiBUaGUgcG9zc2libGUgdmFsdWVzIG9mIHRoZSAiZmMiIHBhcmFtZXRlciBhcmU6CisgICAgICogICAgICAwOiAgRmxvdyBjb250cm9sIGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQKKyAgICAgKiAgICAgIDE6ICBSeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHJlY2VpdmUgcGF1c2UgZnJhbWVzCisgICAgICogICAgICAgICAgYnV0IG5vdCBzZW5kIHBhdXNlIGZyYW1lcykuCisgICAgICogICAgICAyOiAgVHggZmxvdyBjb250cm9sIGlzIGVuYWJsZWQgKHdlIGNhbiBzZW5kIHBhdXNlIGZyYW1lcworICAgICAqICAgICAgICAgIGJ1dCB3ZSBkbyBub3Qgc3VwcG9ydCByZWNlaXZpbmcgcGF1c2UgZnJhbWVzKS4KKyAgICAgKiAgICAgIDM6ICBCb3RoIFJ4IGFuZCBUWCBmbG93IGNvbnRyb2wgKHN5bW1ldHJpYykgYXJlIGVuYWJsZWQuCisgICAgICogIG90aGVyOiAgTm8gc29mdHdhcmUgb3ZlcnJpZGUuICBUaGUgZmxvdyBjb250cm9sIGNvbmZpZ3VyYXRpb24KKyAgICAgKiAgICAgICAgICBpbiB0aGUgRUVQUk9NIGlzIHVzZWQuCisgICAgICovCisgICAgc3dpdGNoIChody0+ZmMpIHsKKyAgICBjYXNlIGUxMDAwX2ZjX25vbmU6IC8qIDAgKi8KKyAgICAgICAgLyogRmxvdyBjb250cm9sIChSWCAmIFRYKSBpcyBjb21wbGV0ZWx5IGRpc2FibGVkIGJ5IGEKKyAgICAgICAgICogc29mdHdhcmUgb3Zlci1yaWRlLgorICAgICAgICAgKi8KKyAgICAgICAgbWlpX2F1dG9uZWdfYWR2X3JlZyAmPSB+KE5XQVlfQVJfQVNNX0RJUiB8IE5XQVlfQVJfUEFVU0UpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGUxMDAwX2ZjX3J4X3BhdXNlOiAvKiAxICovCisgICAgICAgIC8qIFJYIEZsb3cgY29udHJvbCBpcyBlbmFibGVkLCBhbmQgVFggRmxvdyBjb250cm9sIGlzCisgICAgICAgICAqIGRpc2FibGVkLCBieSBhIHNvZnR3YXJlIG92ZXItcmlkZS4KKyAgICAgICAgICovCisgICAgICAgIC8qIFNpbmNlIHRoZXJlIHJlYWxseSBpc24ndCBhIHdheSB0byBhZHZlcnRpc2UgdGhhdCB3ZSBhcmUKKyAgICAgICAgICogY2FwYWJsZSBvZiBSWCBQYXVzZSBPTkxZLCB3ZSB3aWxsIGFkdmVydGlzZSB0aGF0IHdlCisgICAgICAgICAqIHN1cHBvcnQgYm90aCBzeW1tZXRyaWMgYW5kIGFzeW1tZXRyaWMgUlggUEFVU0UuICBMYXRlcgorICAgICAgICAgKiAoaW4gZTEwMDBfY29uZmlnX2ZjX2FmdGVyX2xpbmtfdXApIHdlIHdpbGwgZGlzYWJsZSB0aGUKKyAgICAgICAgICpodydzIGFiaWxpdHkgdG8gc2VuZCBQQVVTRSBmcmFtZXMuCisgICAgICAgICAqLworICAgICAgICBtaWlfYXV0b25lZ19hZHZfcmVnIHw9IChOV0FZX0FSX0FTTV9ESVIgfCBOV0FZX0FSX1BBVVNFKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF9mY190eF9wYXVzZTogLyogMiAqLworICAgICAgICAvKiBUWCBGbG93IGNvbnRyb2wgaXMgZW5hYmxlZCwgYW5kIFJYIEZsb3cgY29udHJvbCBpcworICAgICAgICAgKiBkaXNhYmxlZCwgYnkgYSBzb2Z0d2FyZSBvdmVyLXJpZGUuCisgICAgICAgICAqLworICAgICAgICBtaWlfYXV0b25lZ19hZHZfcmVnIHw9IE5XQVlfQVJfQVNNX0RJUjsKKyAgICAgICAgbWlpX2F1dG9uZWdfYWR2X3JlZyAmPSB+TldBWV9BUl9QQVVTRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF9mY19mdWxsOiAvKiAzICovCisgICAgICAgIC8qIEZsb3cgY29udHJvbCAoYm90aCBSWCBhbmQgVFgpIGlzIGVuYWJsZWQgYnkgYSBzb2Z0d2FyZQorICAgICAgICAgKiBvdmVyLXJpZGUuCisgICAgICAgICAqLworICAgICAgICBtaWlfYXV0b25lZ19hZHZfcmVnIHw9IChOV0FZX0FSX0FTTV9ESVIgfCBOV0FZX0FSX1BBVVNFKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgREVCVUdPVVQoIkZsb3cgY29udHJvbCBwYXJhbSBzZXQgaW5jb3JyZWN0bHlcbiIpOworICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9DT05GSUc7CisgICAgfQorCisgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIFBIWV9BVVRPTkVHX0FEViwgbWlpX2F1dG9uZWdfYWR2X3JlZyk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICBERUJVR09VVDEoIkF1dG8tTmVnIEFkdmVydGlzaW5nICV4XG4iLCBtaWlfYXV0b25lZ19hZHZfcmVnKTsKKworICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBQSFlfMTAwMFRfQ1RSTCwgbWlpXzEwMDB0X2N0cmxfcmVnKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZvcmNlIFBIWSBzcGVlZCBhbmQgZHVwbGV4IHNldHRpbmdzIHRvIGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4CisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfcGh5X2ZvcmNlX3NwZWVkX2R1cGxleChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IGN0cmw7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IG1paV9jdHJsX3JlZzsKKyAgICB1aW50MTZfdCBtaWlfc3RhdHVzX3JlZzsKKyAgICB1aW50MTZfdCBwaHlfZGF0YTsKKyAgICB1aW50MTZfdCBpOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9waHlfZm9yY2Vfc3BlZWRfZHVwbGV4Iik7CisKKyAgICAvKiBUdXJuIG9mZiBGbG93IGNvbnRyb2wgaWYgd2UgYXJlIGZvcmNpbmcgc3BlZWQgYW5kIGR1cGxleC4gKi8KKyAgICBody0+ZmMgPSBlMTAwMF9mY19ub25lOworCisgICAgREVCVUdPVVQxKCJody0+ZmMgPSAlZFxuIiwgaHctPmZjKTsKKworICAgIC8qIFJlYWQgdGhlIERldmljZSBDb250cm9sIFJlZ2lzdGVyLiAqLworICAgIGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisKKyAgICAvKiBTZXQgdGhlIGJpdHMgdG8gRm9yY2UgU3BlZWQgYW5kIER1cGxleCBpbiB0aGUgRGV2aWNlIEN0cmwgUmVnLiAqLworICAgIGN0cmwgfD0gKEUxMDAwX0NUUkxfRlJDU1BEIHwgRTEwMDBfQ1RSTF9GUkNEUFgpOworICAgIGN0cmwgJj0gfihERVZJQ0VfU1BFRURfTUFTSyk7CisKKyAgICAvKiBDbGVhciB0aGUgQXV0byBTcGVlZCBEZXRlY3QgRW5hYmxlIGJpdC4gKi8KKyAgICBjdHJsICY9IH5FMTAwMF9DVFJMX0FTREU7CisKKyAgICAvKiBSZWFkIHRoZSBNSUkgQ29udHJvbCBSZWdpc3Rlci4gKi8KKyAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfQ1RSTCwgJm1paV9jdHJsX3JlZyk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAvKiBXZSBuZWVkIHRvIGRpc2FibGUgYXV0b25lZyBpbiBvcmRlciB0byBmb3JjZSBsaW5rIGFuZCBkdXBsZXguICovCisKKyAgICBtaWlfY3RybF9yZWcgJj0gfk1JSV9DUl9BVVRPX05FR19FTjsKKworICAgIC8qIEFyZSB3ZSBmb3JjaW5nIEZ1bGwgb3IgSGFsZiBEdXBsZXg/ICovCisgICAgaWYoaHctPmZvcmNlZF9zcGVlZF9kdXBsZXggPT0gZTEwMDBfMTAwX2Z1bGwgfHwKKyAgICAgICBody0+Zm9yY2VkX3NwZWVkX2R1cGxleCA9PSBlMTAwMF8xMF9mdWxsKSB7CisgICAgICAgIC8qIFdlIHdhbnQgdG8gZm9yY2UgZnVsbCBkdXBsZXggc28gd2UgU0VUIHRoZSBmdWxsIGR1cGxleCBiaXRzIGluIHRoZQorICAgICAgICAgKiBEZXZpY2UgYW5kIE1JSSBDb250cm9sIFJlZ2lzdGVycy4KKyAgICAgICAgICovCisgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9GRDsKKyAgICAgICAgbWlpX2N0cmxfcmVnIHw9IE1JSV9DUl9GVUxMX0RVUExFWDsKKyAgICAgICAgREVCVUdPVVQoIkZ1bGwgRHVwbGV4XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBXZSB3YW50IHRvIGZvcmNlIGhhbGYgZHVwbGV4IHNvIHdlIENMRUFSIHRoZSBmdWxsIGR1cGxleCBiaXRzIGluCisgICAgICAgICAqIHRoZSBEZXZpY2UgYW5kIE1JSSBDb250cm9sIFJlZ2lzdGVycy4KKyAgICAgICAgICovCisgICAgICAgIGN0cmwgJj0gfkUxMDAwX0NUUkxfRkQ7CisgICAgICAgIG1paV9jdHJsX3JlZyAmPSB+TUlJX0NSX0ZVTExfRFVQTEVYOworICAgICAgICBERUJVR09VVCgiSGFsZiBEdXBsZXhcbiIpOworICAgIH0KKworICAgIC8qIEFyZSB3ZSBmb3JjaW5nIDEwME1icHM/Pz8gKi8KKyAgICBpZihody0+Zm9yY2VkX3NwZWVkX2R1cGxleCA9PSBlMTAwMF8xMDBfZnVsbCB8fAorICAgICAgIGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwMF9oYWxmKSB7CisgICAgICAgIC8qIFNldCB0aGUgMTAwTWIgYml0IGFuZCB0dXJuIG9mZiB0aGUgMTAwME1iIGFuZCAxME1iIGJpdHMuICovCisgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TUERfMTAwOworICAgICAgICBtaWlfY3RybF9yZWcgfD0gTUlJX0NSX1NQRUVEXzEwMDsKKyAgICAgICAgbWlpX2N0cmxfcmVnICY9IH4oTUlJX0NSX1NQRUVEXzEwMDAgfCBNSUlfQ1JfU1BFRURfMTApOworICAgICAgICBERUJVR09VVCgiRm9yY2luZyAxMDBtYiAiKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBTZXQgdGhlIDEwTWIgYml0IGFuZCB0dXJuIG9mZiB0aGUgMTAwME1iIGFuZCAxMDBNYiBiaXRzLiAqLworICAgICAgICBjdHJsICY9IH4oRTEwMDBfQ1RSTF9TUERfMTAwMCB8IEUxMDAwX0NUUkxfU1BEXzEwMCk7CisgICAgICAgIG1paV9jdHJsX3JlZyB8PSBNSUlfQ1JfU1BFRURfMTA7CisgICAgICAgIG1paV9jdHJsX3JlZyAmPSB+KE1JSV9DUl9TUEVFRF8xMDAwIHwgTUlJX0NSX1NQRUVEXzEwMCk7CisgICAgICAgIERFQlVHT1VUKCJGb3JjaW5nIDEwbWIgIik7CisgICAgfQorCisgICAgZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KGh3KTsKKworICAgIC8qIFdyaXRlIHRoZSBjb25maWd1cmVkIHZhbHVlcyBiYWNrIHRvIHRoZSBEZXZpY2UgQ29udHJvbCBSZWcuICovCisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKworICAgIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkgeworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19DVFJMLCAmcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgLyogQ2xlYXIgQXV0by1Dcm9zc292ZXIgdG8gZm9yY2UgTURJIG1hbnVhbGx5LiBNODhFMTAwMCByZXF1aXJlcyBNREkKKyAgICAgICAgICogZm9yY2VkIHdoZW5ldmVyIHNwZWVkIGFyZSBkdXBsZXggYXJlIGZvcmNlZC4KKyAgICAgICAgICovCisgICAgICAgIHBoeV9kYXRhICY9IH5NODhFMTAwMF9QU0NSX0FVVE9fWF9NT0RFOworICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfQ1RSTCwgcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgREVCVUdPVVQxKCJNODhFMTAwMCBQU0NSOiAleCBcbiIsIHBoeV9kYXRhKTsKKworICAgICAgICAvKiBOZWVkIHRvIHJlc2V0IHRoZSBQSFkgb3IgdGhlc2UgY2hhbmdlcyB3aWxsIGJlIGlnbm9yZWQgKi8KKyAgICAgICAgbWlpX2N0cmxfcmVnIHw9IE1JSV9DUl9SRVNFVDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBDbGVhciBBdXRvLUNyb3Nzb3ZlciB0byBmb3JjZSBNREkgbWFudWFsbHkuICBJR1AgcmVxdWlyZXMgTURJCisgICAgICAgICAqIGZvcmNlZCB3aGVuZXZlciBzcGVlZCBvciBkdXBsZXggYXJlIGZvcmNlZC4KKyAgICAgICAgICovCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ1RSTCwgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ1JfQVVUT19NRElYOworICAgICAgICBwaHlfZGF0YSAmPSB+SUdQMDFFMTAwMF9QU0NSX0ZPUkNFX01ESV9NRElYOworCisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NUUkwsIHBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgIH0KKworICAgIC8qIFdyaXRlIGJhY2sgdGhlIG1vZGlmaWVkIFBIWSBNSUkgY29udHJvbCByZWdpc3Rlci4gKi8KKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZX0NUUkwsIG1paV9jdHJsX3JlZyk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICB1ZGVsYXkoMSk7CisKKyAgICAvKiBUaGUgd2FpdF9hdXRvbmVnX2NvbXBsZXRlIGZsYWcgbWF5IGJlIGEgbGl0dGxlIG1pc2xlYWRpbmcgaGVyZS4KKyAgICAgKiBTaW5jZSB3ZSBhcmUgZm9yY2luZyBzcGVlZCBhbmQgZHVwbGV4LCBBdXRvLU5lZyBpcyBub3QgZW5hYmxlZC4KKyAgICAgKiBCdXQgd2UgZG8gd2FudCB0byBkZWxheSBmb3IgYSBwZXJpb2Qgd2hpbGUgZm9yY2luZyBvbmx5IHNvIHdlCisgICAgICogZG9uJ3QgZ2VuZXJhdGUgZmFsc2UgTm8gTGluayBtZXNzYWdlcy4gIFNvIHdlIHdpbGwgd2FpdCBoZXJlCisgICAgICogb25seSBpZiB0aGUgdXNlciBoYXMgc2V0IHdhaXRfYXV0b25lZ19jb21wbGV0ZSB0byAxLCB3aGljaCBpcworICAgICAqIHRoZSBkZWZhdWx0LgorICAgICAqLworICAgIGlmKGh3LT53YWl0X2F1dG9uZWdfY29tcGxldGUpIHsKKyAgICAgICAgLyogV2Ugd2lsbCB3YWl0IGZvciBhdXRvbmVnIHRvIGNvbXBsZXRlLiAqLworICAgICAgICBERUJVR09VVCgiV2FpdGluZyBmb3IgZm9yY2VkIHNwZWVkL2R1cGxleCBsaW5rLlxuIik7CisgICAgICAgIG1paV9zdGF0dXNfcmVnID0gMDsKKworICAgICAgICAvKiBXZSB3aWxsIHdhaXQgZm9yIGF1dG9uZWcgdG8gY29tcGxldGUgb3IgNC41IHNlY29uZHMgdG8gZXhwaXJlLiAqLworICAgICAgICBmb3IoaSA9IFBIWV9GT1JDRV9USU1FOyBpID4gMDsgaS0tKSB7CisgICAgICAgICAgICAvKiBSZWFkIHRoZSBNSUkgU3RhdHVzIFJlZ2lzdGVyIGFuZCB3YWl0IGZvciBBdXRvLU5lZyBDb21wbGV0ZSBiaXQKKyAgICAgICAgICAgICAqIHRvIGJlIHNldC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJm1paV9zdGF0dXNfcmVnKTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZtaWlfc3RhdHVzX3JlZyk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICBpZihtaWlfc3RhdHVzX3JlZyAmIE1JSV9TUl9MSU5LX1NUQVRVUykgYnJlYWs7CisgICAgICAgICAgICBtc2VjX2RlbGF5KDEwMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYoKGkgPT0gMCkgJiYKKyAgICAgICAgICAgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfbTg4KSkgeworICAgICAgICAgICAgLyogV2UgZGlkbid0IGdldCBsaW5rLiAgUmVzZXQgdGhlIERTUCBhbmQgd2FpdCBhZ2FpbiBmb3IgbGluay4gKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9waHlfcmVzZXRfZHNwKGh3KTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgUmVzZXR0aW5nIFBIWSBEU1BcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIFRoaXMgbG9vcCB3aWxsIGVhcmx5LW91dCBpZiB0aGUgbGluayBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiAgKi8KKyAgICAgICAgZm9yKGkgPSBQSFlfRk9SQ0VfVElNRTsgaSA+IDA7IGktLSkgeworICAgICAgICAgICAgaWYobWlpX3N0YXR1c19yZWcgJiBNSUlfU1JfTElOS19TVEFUVVMpIGJyZWFrOworICAgICAgICAgICAgbXNlY19kZWxheSgxMDApOworICAgICAgICAgICAgLyogUmVhZCB0aGUgTUlJIFN0YXR1cyBSZWdpc3RlciBhbmQgd2FpdCBmb3IgQXV0by1OZWcgQ29tcGxldGUgYml0CisgICAgICAgICAgICAgKiB0byBiZSBzZXQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZtaWlfc3RhdHVzX3JlZyk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkgeworICAgICAgICAvKiBCZWNhdXNlIHdlIHJlc2V0IHRoZSBQSFkgYWJvdmUsIHdlIG5lZWQgdG8gcmUtZm9yY2UgVFhfQ0xLIGluIHRoZQorICAgICAgICAgKiBFeHRlbmRlZCBQSFkgU3BlY2lmaWMgQ29udHJvbCBSZWdpc3RlciB0byAyNU1IeiBjbG9jay4gIFRoaXMgdmFsdWUKKyAgICAgICAgICogZGVmYXVsdHMgYmFjayB0byBhIDIuNU1IeiBjbG9jayB3aGVuIHRoZSBQSFkgaXMgcmVzZXQuCisgICAgICAgICAqLworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9FWFRfUEhZX1NQRUNfQ1RSTCwgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIHBoeV9kYXRhIHw9IE04OEUxMDAwX0VQU0NSX1RYX0NMS18yNTsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX0VYVF9QSFlfU1BFQ19DVFJMLCBwaHlfZGF0YSk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAvKiBJbiBhZGRpdGlvbiwgYmVjYXVzZSBvZiB0aGUgcy93IHJlc2V0IGFib3ZlLCB3ZSBuZWVkIHRvIGVuYWJsZSBDUlMgb24KKyAgICAgICAgICogVFguICBUaGlzIG11c3QgYmUgc2V0IGZvciBib3RoIGZ1bGwgYW5kIGhhbGYgZHVwbGV4IG9wZXJhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9TUEVDX0NUUkwsICZwaHlfZGF0YSk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICBwaHlfZGF0YSB8PSBNODhFMTAwMF9QU0NSX0FTU0VSVF9DUlNfT05fVFg7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19DVFJMLCBwaHlfZGF0YSk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICBpZigoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ0IHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0MykgJiYKKyAgICAgICAgICAgKCFody0+YXV0b25lZykgJiYKKyAgICAgICAgICAgKGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwX2Z1bGwgfHwKKyAgICAgICAgICAgIGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwX2hhbGYpKSB7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfd29ya2Fyb3VuZChodyk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNldHMgdGhlIGNvbGxpc2lvbiBkaXN0YW5jZSBpbiB0aGUgVHJhbnNtaXQgQ29udHJvbCByZWdpc3RlcgorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKgorKiBMaW5rIHNob3VsZCBoYXZlIGJlZW4gZXN0YWJsaXNoZWQgcHJldmlvdXNseS4gUmVhZHMgdGhlIHNwZWVkIGFuZCBkdXBsZXgKKyogaW5mb3JtYXRpb24gZnJvbSB0aGUgRGV2aWNlIFN0YXR1cyByZWdpc3Rlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2UxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IHRjdGw7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdCIpOworCisgICAgdGN0bCA9IEUxMDAwX1JFQURfUkVHKGh3LCBUQ1RMKTsKKworICAgIHRjdGwgJj0gfkUxMDAwX1RDVExfQ09MRDsKKyAgICB0Y3RsIHw9IEUxMDAwX0NPTExJU0lPTl9ESVNUQU5DRSA8PCBFMTAwMF9DT0xEX1NISUZUOworCisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBUQ1RMLCB0Y3RsKTsKKyAgICBFMTAwMF9XUklURV9GTFVTSChodyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU2V0cyBNQUMgc3BlZWQgYW5kIGR1cGxleCBzZXR0aW5ncyB0byByZWZsZWN0IHRoZSB0aG9zZSBpbiB0aGUgUEhZCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqIG1paV9yZWcgLSBkYXRhIHRvIHdyaXRlIHRvIHRoZSBNSUkgY29udHJvbCByZWdpc3RlcgorKgorKiBUaGUgY29udGVudHMgb2YgdGhlIFBIWSByZWdpc3RlciBjb250YWluaW5nIHRoZSBuZWVkZWQgaW5mb3JtYXRpb24gbmVlZCB0bworKiBiZSBwYXNzZWQgaW4uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfY29uZmlnX21hY190b19waHkoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBjdHJsOworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfY29uZmlnX21hY190b19waHkiKTsKKworICAgIC8qIFJlYWQgdGhlIERldmljZSBDb250cm9sIFJlZ2lzdGVyIGFuZCBzZXQgdGhlIGJpdHMgdG8gRm9yY2UgU3BlZWQKKyAgICAgKiBhbmQgRHVwbGV4LgorICAgICAqLworICAgIGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisgICAgY3RybCB8PSAoRTEwMDBfQ1RSTF9GUkNTUEQgfCBFMTAwMF9DVFJMX0ZSQ0RQWCk7CisgICAgY3RybCAmPSB+KEUxMDAwX0NUUkxfU1BEX1NFTCB8IEUxMDAwX0NUUkxfSUxPUyk7CisKKyAgICAvKiBTZXQgdXAgZHVwbGV4IGluIHRoZSBEZXZpY2UgQ29udHJvbCBhbmQgVHJhbnNtaXQgQ29udHJvbAorICAgICAqIHJlZ2lzdGVycyBkZXBlbmRpbmcgb24gbmVnb3RpYXRlZCB2YWx1ZXMuCisgICAgICovCisgICAgaWYgKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfU1RBVFVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICBpZihwaHlfZGF0YSAmIElHUDAxRTEwMDBfUFNTUl9GVUxMX0RVUExFWCkgY3RybCB8PSBFMTAwMF9DVFJMX0ZEOworICAgICAgICBlbHNlIGN0cmwgJj0gfkUxMDAwX0NUUkxfRkQ7CisKKyAgICAgICAgZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KGh3KTsKKworICAgICAgICAvKiBTZXQgdXAgc3BlZWQgaW4gdGhlIERldmljZSBDb250cm9sIHJlZ2lzdGVyIGRlcGVuZGluZyBvbgorICAgICAgICAgKiBuZWdvdGlhdGVkIHZhbHVlcy4KKyAgICAgICAgICovCisgICAgICAgIGlmKChwaHlfZGF0YSAmIElHUDAxRTEwMDBfUFNTUl9TUEVFRF9NQVNLKSA9PQorICAgICAgICAgICBJR1AwMUUxMDAwX1BTU1JfU1BFRURfMTAwME1CUFMpCisgICAgICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1BEXzEwMDA7CisgICAgICAgIGVsc2UgaWYoKHBoeV9kYXRhICYgSUdQMDFFMTAwMF9QU1NSX1NQRUVEX01BU0spID09CisgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9QU1NSX1NQRUVEXzEwME1CUFMpCisgICAgICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1BEXzEwMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19TVEFUVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIGlmKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9EUExYKSBjdHJsIHw9IEUxMDAwX0NUUkxfRkQ7CisgICAgICAgIGVsc2UgY3RybCAmPSB+RTEwMDBfQ1RSTF9GRDsKKworICAgICAgICBlMTAwMF9jb25maWdfY29sbGlzaW9uX2Rpc3QoaHcpOworCisgICAgICAgIC8qIFNldCB1cCBzcGVlZCBpbiB0aGUgRGV2aWNlIENvbnRyb2wgcmVnaXN0ZXIgZGVwZW5kaW5nIG9uCisgICAgICAgICAqIG5lZ290aWF0ZWQgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYoKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9TUEVFRCkgPT0gTTg4RTEwMDBfUFNTUl8xMDAwTUJTKQorICAgICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NQRF8xMDAwOworICAgICAgICBlbHNlIGlmKChwaHlfZGF0YSAmIE04OEUxMDAwX1BTU1JfU1BFRUQpID09IE04OEUxMDAwX1BTU1JfMTAwTUJTKQorICAgICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NQRF8xMDA7CisgICAgfQorICAgIC8qIFdyaXRlIHRoZSBjb25maWd1cmVkIHZhbHVlcyBiYWNrIHRvIHRoZSBEZXZpY2UgQ29udHJvbCBSZWcuICovCisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRm9yY2VzIHRoZSBNQUMncyBmbG93IGNvbnRyb2wgc2V0dGluZ3MuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBTZXRzIHRoZSBURkNFIGFuZCBSRkNFIGJpdHMgaW4gdGhlIGRldmljZSBjb250cm9sIHJlZ2lzdGVyIHRvIHJlZmxlY3QKKyAqIHRoZSBhZGFwdGVyIHNldHRpbmdzLiBURkNFIGFuZCBSRkNFIG5lZWQgdG8gYmUgZXhwbGljaXRseSBzZXQgYnkKKyAqIHNvZnR3YXJlIHdoZW4gYSBDb3BwZXIgUEhZIGlzIHVzZWQgYmVjYXVzZSBhdXRvbmVnb3RpYXRpb24gaXMgbWFuYWdlZAorICogYnkgdGhlIFBIWSByYXRoZXIgdGhhbiB0aGUgTUFDLiBTb2Z0d2FyZSBtdXN0IGFsc28gY29uZmlndXJlIHRoZXNlCisgKiBiaXRzIHdoZW4gbGluayBpcyBmb3JjZWQgb24gYSBmaWJlciBjb25uZWN0aW9uLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfZm9yY2VfbWFjX2ZjKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgY3RybDsKKworICAgIERFQlVHRlVOQygiZTEwMDBfZm9yY2VfbWFjX2ZjIik7CisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiB0aGUgRGV2aWNlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgICBjdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkwpOworCisgICAgLyogQmVjYXVzZSB3ZSBkaWRuJ3QgZ2V0IGxpbmsgdmlhIHRoZSBpbnRlcm5hbCBhdXRvLW5lZ290aWF0aW9uCisgICAgICogbWVjaGFuaXNtICh3ZSBlaXRoZXIgZm9yY2VkIGxpbmsgb3Igd2UgZ290IGxpbmsgdmlhIFBIWQorICAgICAqIGF1dG8tbmVnKSwgd2UgaGF2ZSB0byBtYW51YWxseSBlbmFibGUvZGlzYWJsZSB0cmFuc21pdCBhbgorICAgICAqIHJlY2VpdmUgZmxvdyBjb250cm9sLgorICAgICAqCisgICAgICogVGhlICJDYXNlIiBzdGF0ZW1lbnQgYmVsb3cgZW5hYmxlcy9kaXNhYmxlIGZsb3cgY29udHJvbAorICAgICAqIGFjY29yZGluZyB0byB0aGUgImh3LT5mYyIgcGFyYW1ldGVyLgorICAgICAqCisgICAgICogVGhlIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgImZjIiBwYXJhbWV0ZXIgYXJlOgorICAgICAqICAgICAgMDogIEZsb3cgY29udHJvbCBpcyBjb21wbGV0ZWx5IGRpc2FibGVkCisgICAgICogICAgICAxOiAgUnggZmxvdyBjb250cm9sIGlzIGVuYWJsZWQgKHdlIGNhbiByZWNlaXZlIHBhdXNlCisgICAgICogICAgICAgICAgZnJhbWVzIGJ1dCBub3Qgc2VuZCBwYXVzZSBmcmFtZXMpLgorICAgICAqICAgICAgMjogIFR4IGZsb3cgY29udHJvbCBpcyBlbmFibGVkICh3ZSBjYW4gc2VuZCBwYXVzZSBmcmFtZXMKKyAgICAgKiAgICAgICAgICBmcmFtZXMgYnV0IHdlIGRvIG5vdCByZWNlaXZlIHBhdXNlIGZyYW1lcykuCisgICAgICogICAgICAzOiAgQm90aCBSeCBhbmQgVFggZmxvdyBjb250cm9sIChzeW1tZXRyaWMpIGlzIGVuYWJsZWQuCisgICAgICogIG90aGVyOiAgTm8gb3RoZXIgdmFsdWVzIHNob3VsZCBiZSBwb3NzaWJsZSBhdCB0aGlzIHBvaW50LgorICAgICAqLworCisgICAgc3dpdGNoIChody0+ZmMpIHsKKyAgICBjYXNlIGUxMDAwX2ZjX25vbmU6CisgICAgICAgIGN0cmwgJj0gKH4oRTEwMDBfQ1RSTF9URkNFIHwgRTEwMDBfQ1RSTF9SRkNFKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfZmNfcnhfcGF1c2U6CisgICAgICAgIGN0cmwgJj0gKH5FMTAwMF9DVFJMX1RGQ0UpOworICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfUkZDRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF9mY190eF9wYXVzZToKKyAgICAgICAgY3RybCAmPSAofkUxMDAwX0NUUkxfUkZDRSk7CisgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9URkNFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGUxMDAwX2ZjX2Z1bGw6CisgICAgICAgIGN0cmwgfD0gKEUxMDAwX0NUUkxfVEZDRSB8IEUxMDAwX0NUUkxfUkZDRSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIERFQlVHT1VUKCJGbG93IGNvbnRyb2wgcGFyYW0gc2V0IGluY29ycmVjdGx5XG4iKTsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfQ09ORklHOworICAgIH0KKworICAgIC8qIERpc2FibGUgVFggRmxvdyBDb250cm9sIGZvciA4MjU0MiAocmV2IDIuMCkgKi8KKyAgICBpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKQorICAgICAgICBjdHJsICY9ICh+RTEwMDBfQ1RSTF9URkNFKTsKKworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCk7CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvbmZpZ3VyZXMgZmxvdyBjb250cm9sIHNldHRpbmdzIGFmdGVyIGxpbmsgaXMgZXN0YWJsaXNoZWQKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFNob3VsZCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSB2YWxpZCBsaW5rIGhhcyBiZWVuIGVzdGFibGlzaGVkLgorICogRm9yY2VzIE1BQyBmbG93IGNvbnRyb2wgc2V0dGluZ3MgaWYgbGluayB3YXMgZm9yY2VkLiBXaGVuIGluIE1JSS9HTUlJIG1vZGUKKyAqIGFuZCBhdXRvbmVnb3RpYXRpb24gaXMgZW5hYmxlZCwgdGhlIE1BQyBmbG93IGNvbnRyb2wgc2V0dGluZ3Mgd2lsbCBiZSBzZXQKKyAqIGJhc2VkIG9uIHRoZSBmbG93IGNvbnRyb2wgbmVnb3RpYXRlZCBieSB0aGUgUEhZLiBJbiBUQkkgbW9kZSwgdGhlIFRGQ0UKKyAqIGFuZCBSRkNFIGJpdHMgd2lsbCBiZSBhdXRvbWF0aWNhbHkgc2V0IHRvIHRoZSBuZWdvdGlhdGVkIGZsb3cgY29udHJvbCBtb2RlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfY29uZmlnX2ZjX2FmdGVyX2xpbmtfdXAoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3QgbWlpX3N0YXR1c19yZWc7CisgICAgdWludDE2X3QgbWlpX253YXlfYWR2X3JlZzsKKyAgICB1aW50MTZfdCBtaWlfbndheV9scF9hYmlsaXR5X3JlZzsKKyAgICB1aW50MTZfdCBzcGVlZDsKKyAgICB1aW50MTZfdCBkdXBsZXg7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2NvbmZpZ19mY19hZnRlcl9saW5rX3VwIik7CisKKyAgICAvKiBDaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBmaWJlciBtZWRpYSBhbmQgYXV0by1uZWcgZmFpbGVkCisgICAgICogc28gd2UgaGFkIHRvIGZvcmNlIGxpbmsuICBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gZm9yY2UgdGhlCisgICAgICogY29uZmlndXJhdGlvbiBvZiB0aGUgTUFDIHRvIG1hdGNoIHRoZSAiZmMiIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBpZigoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpICYmIChody0+YXV0b25lZ19mYWlsZWQpKSB8fAorICAgICAgICgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpICYmIChody0+YXV0b25lZ19mYWlsZWQpKSB8fAorICAgICAgICgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpICYmICghaHctPmF1dG9uZWcpKSkgeworICAgICAgICByZXRfdmFsID0gZTEwMDBfZm9yY2VfbWFjX2ZjKGh3KTsKKyAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIGZvcmNpbmcgZmxvdyBjb250cm9sIHNldHRpbmdzXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgY29wcGVyIG1lZGlhIGFuZCBhdXRvLW5lZyBpcworICAgICAqIGVuYWJsZWQuICBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gY2hlY2sgYW5kIHNlZSBpZiBBdXRvLU5lZworICAgICAqIGhhcyBjb21wbGV0ZWQsIGFuZCBpZiBzbywgaG93IHRoZSBQSFkgYW5kIGxpbmsgcGFydG5lciBoYXMKKyAgICAgKiBmbG93IGNvbnRyb2wgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBpZigoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpICYmIGh3LT5hdXRvbmVnKSB7CisgICAgICAgIC8qIFJlYWQgdGhlIE1JSSBTdGF0dXMgUmVnaXN0ZXIgYW5kIGNoZWNrIHRvIHNlZSBpZiBBdXRvTmVnCisgICAgICAgICAqIGhhcyBjb21wbGV0ZWQuICBXZSByZWFkIHRoaXMgdHdpY2UgYmVjYXVzZSB0aGlzIHJlZyBoYXMKKyAgICAgICAgICogc29tZSAic3RpY2t5IiAobGF0Y2hlZCkgYml0cy4KKyAgICAgICAgICovCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZtaWlfc3RhdHVzX3JlZyk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJm1paV9zdGF0dXNfcmVnKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIGlmKG1paV9zdGF0dXNfcmVnICYgTUlJX1NSX0FVVE9ORUdfQ09NUExFVEUpIHsKKyAgICAgICAgICAgIC8qIFRoZSBBdXRvTmVnIHByb2Nlc3MgaGFzIGNvbXBsZXRlZCwgc28gd2Ugbm93IG5lZWQgdG8KKyAgICAgICAgICAgICAqIHJlYWQgYm90aCB0aGUgQXV0byBOZWdvdGlhdGlvbiBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyCisgICAgICAgICAgICAgKiAoQWRkcmVzcyA0KSBhbmQgdGhlIEF1dG9fTmVnb3RpYXRpb24gQmFzZSBQYWdlIEFiaWxpdHkKKyAgICAgICAgICAgICAqIFJlZ2lzdGVyIChBZGRyZXNzIDUpIHRvIGRldGVybWluZSBob3cgZmxvdyBjb250cm9sIHdhcworICAgICAgICAgICAgICogbmVnb3RpYXRlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0FVVE9ORUdfQURWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlpX253YXlfYWR2X3JlZyk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0xQX0FCSUxJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWlfbndheV9scF9hYmlsaXR5X3JlZyk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICAvKiBUd28gYml0cyBpbiB0aGUgQXV0byBOZWdvdGlhdGlvbiBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyCisgICAgICAgICAgICAgKiAoQWRkcmVzcyA0KSBhbmQgdHdvIGJpdHMgaW4gdGhlIEF1dG8gTmVnb3RpYXRpb24gQmFzZQorICAgICAgICAgICAgICogUGFnZSBBYmlsaXR5IFJlZ2lzdGVyIChBZGRyZXNzIDUpIGRldGVybWluZSBmbG93IGNvbnRyb2wKKyAgICAgICAgICAgICAqIGZvciBib3RoIHRoZSBQSFkgYW5kIHRoZSBsaW5rIHBhcnRuZXIuICBUaGUgZm9sbG93aW5nCisgICAgICAgICAgICAgKiB0YWJsZSwgdGFrZW4gb3V0IG9mIHRoZSBJRUVFIDgwMi4zYWIvRDYuMCBkYXRlZCBNYXJjaCAyNSwKKyAgICAgICAgICAgICAqIDE5OTksIGRlc2NyaWJlcyB0aGVzZSBQQVVTRSByZXNvbHV0aW9uIGJpdHMgYW5kIGhvdyBmbG93CisgICAgICAgICAgICAgKiBjb250cm9sIGlzIGRldGVybWluZWQgYmFzZWQgdXBvbiB0aGVzZSBzZXR0aW5ncy4KKyAgICAgICAgICAgICAqIE5PVEU6ICBEQyA9IERvbid0IENhcmUKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiAgIExPQ0FMIERFVklDRSAgfCAgIExJTksgUEFSVE5FUgorICAgICAgICAgICAgICogUEFVU0UgfCBBU01fRElSIHwgUEFVU0UgfCBBU01fRElSIHwgTklDIFJlc29sdXRpb24KKyAgICAgICAgICAgICAqLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAqICAgMCAgIHwgICAgMCAgICB8ICBEQyAgIHwgICBEQyAgICB8IGUxMDAwX2ZjX25vbmUKKyAgICAgICAgICAgICAqICAgMCAgIHwgICAgMSAgICB8ICAgMCAgIHwgICBEQyAgICB8IGUxMDAwX2ZjX25vbmUKKyAgICAgICAgICAgICAqICAgMCAgIHwgICAgMSAgICB8ICAgMSAgIHwgICAgMCAgICB8IGUxMDAwX2ZjX25vbmUKKyAgICAgICAgICAgICAqICAgMCAgIHwgICAgMSAgICB8ICAgMSAgIHwgICAgMSAgICB8IGUxMDAwX2ZjX3R4X3BhdXNlCisgICAgICAgICAgICAgKiAgIDEgICB8ICAgIDAgICAgfCAgIDAgICB8ICAgREMgICAgfCBlMTAwMF9mY19ub25lCisgICAgICAgICAgICAgKiAgIDEgICB8ICAgREMgICAgfCAgIDEgICB8ICAgREMgICAgfCBlMTAwMF9mY19mdWxsCisgICAgICAgICAgICAgKiAgIDEgICB8ICAgIDEgICAgfCAgIDAgICB8ICAgIDAgICAgfCBlMTAwMF9mY19ub25lCisgICAgICAgICAgICAgKiAgIDEgICB8ICAgIDEgICAgfCAgIDAgICB8ICAgIDEgICAgfCBlMTAwMF9mY19yeF9wYXVzZQorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogQXJlIGJvdGggUEFVU0UgYml0cyBzZXQgdG8gMT8gIElmIHNvLCB0aGlzIGltcGxpZXMKKyAgICAgICAgICAgICAqIFN5bW1ldHJpYyBGbG93IENvbnRyb2wgaXMgZW5hYmxlZCBhdCBib3RoIGVuZHMuICBUaGUKKyAgICAgICAgICAgICAqIEFTTV9ESVIgYml0cyBhcmUgaXJyZWxldmFudCBwZXIgdGhlIHNwZWMuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogRm9yIFN5bW1ldHJpYyBGbG93IENvbnRyb2w6CisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogICBMT0NBTCBERVZJQ0UgIHwgICBMSU5LIFBBUlRORVIKKyAgICAgICAgICAgICAqIFBBVVNFIHwgQVNNX0RJUiB8IFBBVVNFIHwgQVNNX0RJUiB8IFJlc3VsdAorICAgICAgICAgICAgICotLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICogICAxICAgfCAgIERDICAgIHwgICAxICAgfCAgIERDICAgIHwgZTEwMDBfZmNfZnVsbAorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYoKG1paV9ud2F5X2Fkdl9yZWcgJiBOV0FZX0FSX1BBVVNFKSAmJgorICAgICAgICAgICAgICAgKG1paV9ud2F5X2xwX2FiaWxpdHlfcmVnICYgTldBWV9MUEFSX1BBVVNFKSkgeworICAgICAgICAgICAgICAgIC8qIE5vdyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSB1c2VyIHNlbGVjdGVkIFJYIE9OTFkKKyAgICAgICAgICAgICAgICAgKiBvZiBwYXVzZSBmcmFtZXMuICBJbiB0aGlzIGNhc2UsIHdlIGhhZCB0byBhZHZlcnRpc2UKKyAgICAgICAgICAgICAgICAgKiBGVUxMIGZsb3cgY29udHJvbCBiZWNhdXNlIHdlIGNvdWxkIG5vdCBhZHZlcnRpc2UgUlgKKyAgICAgICAgICAgICAgICAgKiBPTkxZLiBIZW5jZSwgd2UgbXVzdCBub3cgY2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8KKyAgICAgICAgICAgICAgICAgKiB0dXJuIE9GRiAgdGhlIFRSQU5TTUlTU0lPTiBvZiBQQVVTRSBmcmFtZXMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYoaHctPm9yaWdpbmFsX2ZjID09IGUxMDAwX2ZjX2Z1bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaHctPmZjID0gZTEwMDBfZmNfZnVsbDsKKyAgICAgICAgICAgICAgICAgICAgREVCVUdPVVQoIkZsb3cgQ29udHJvbCA9IEZVTEwuXHJcbiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGh3LT5mYyA9IGUxMDAwX2ZjX3J4X3BhdXNlOworICAgICAgICAgICAgICAgICAgICBERUJVR09VVCgiRmxvdyBDb250cm9sID0gUlggUEFVU0UgZnJhbWVzIG9ubHkuXHJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEZvciByZWNlaXZpbmcgUEFVU0UgZnJhbWVzIE9OTFkuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogICBMT0NBTCBERVZJQ0UgIHwgICBMSU5LIFBBUlRORVIKKyAgICAgICAgICAgICAqIFBBVVNFIHwgQVNNX0RJUiB8IFBBVVNFIHwgQVNNX0RJUiB8IFJlc3VsdAorICAgICAgICAgICAgICotLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICogICAwICAgfCAgICAxICAgIHwgICAxICAgfCAgICAxICAgIHwgZTEwMDBfZmNfdHhfcGF1c2UKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGVsc2UgaWYoIShtaWlfbndheV9hZHZfcmVnICYgTldBWV9BUl9QQVVTRSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1paV9ud2F5X2Fkdl9yZWcgJiBOV0FZX0FSX0FTTV9ESVIpICYmCisgICAgICAgICAgICAgICAgICAgIChtaWlfbndheV9scF9hYmlsaXR5X3JlZyAmIE5XQVlfTFBBUl9QQVVTRSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1paV9ud2F5X2xwX2FiaWxpdHlfcmVnICYgTldBWV9MUEFSX0FTTV9ESVIpKSB7CisgICAgICAgICAgICAgICAgaHctPmZjID0gZTEwMDBfZmNfdHhfcGF1c2U7CisgICAgICAgICAgICAgICAgREVCVUdPVVQoIkZsb3cgQ29udHJvbCA9IFRYIFBBVVNFIGZyYW1lcyBvbmx5LlxyXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEZvciB0cmFuc21pdHRpbmcgUEFVU0UgZnJhbWVzIE9OTFkuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogICBMT0NBTCBERVZJQ0UgIHwgICBMSU5LIFBBUlRORVIKKyAgICAgICAgICAgICAqIFBBVVNFIHwgQVNNX0RJUiB8IFBBVVNFIHwgQVNNX0RJUiB8IFJlc3VsdAorICAgICAgICAgICAgICotLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICogICAxICAgfCAgICAxICAgIHwgICAwICAgfCAgICAxICAgIHwgZTEwMDBfZmNfcnhfcGF1c2UKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGVsc2UgaWYoKG1paV9ud2F5X2Fkdl9yZWcgJiBOV0FZX0FSX1BBVVNFKSAmJgorICAgICAgICAgICAgICAgICAgICAobWlpX253YXlfYWR2X3JlZyAmIE5XQVlfQVJfQVNNX0RJUikgJiYKKyAgICAgICAgICAgICAgICAgICAgIShtaWlfbndheV9scF9hYmlsaXR5X3JlZyAmIE5XQVlfTFBBUl9QQVVTRSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1paV9ud2F5X2xwX2FiaWxpdHlfcmVnICYgTldBWV9MUEFSX0FTTV9ESVIpKSB7CisgICAgICAgICAgICAgICAgaHctPmZjID0gZTEwMDBfZmNfcnhfcGF1c2U7CisgICAgICAgICAgICAgICAgREVCVUdPVVQoIkZsb3cgQ29udHJvbCA9IFJYIFBBVVNFIGZyYW1lcyBvbmx5LlxyXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFBlciB0aGUgSUVFRSBzcGVjLCBhdCB0aGlzIHBvaW50IGZsb3cgY29udHJvbCBzaG91bGQgYmUKKyAgICAgICAgICAgICAqIGRpc2FibGVkLiAgSG93ZXZlciwgd2Ugd2FudCB0byBjb25zaWRlciB0aGF0IHdlIGNvdWxkCisgICAgICAgICAgICAgKiBiZSBjb25uZWN0ZWQgdG8gYSBsZWdhY3kgc3dpdGNoIHRoYXQgZG9lc24ndCBhZHZlcnRpc2UKKyAgICAgICAgICAgICAqIGRlc2lyZWQgZmxvdyBjb250cm9sLCBidXQgY2FuIGJlIGZvcmNlZCBvbiB0aGUgbGluaworICAgICAgICAgICAgICogcGFydG5lci4gIFNvIGlmIHdlIGFkdmVydGlzZWQgbm8gZmxvdyBjb250cm9sLCB0aGF0IGlzCisgICAgICAgICAgICAgKiB3aGF0IHdlIHdpbGwgcmVzb2x2ZSB0by4gIElmIHdlIGFkdmVydGlzZWQgc29tZSBraW5kIG9mCisgICAgICAgICAgICAgKiByZWNlaXZlIGNhcGFiaWxpdHkgKFJ4IFBhdXNlIE9ubHkgb3IgRnVsbCBGbG93IENvbnRyb2wpCisgICAgICAgICAgICAgKiBhbmQgdGhlIGxpbmsgcGFydG5lciBhZHZlcnRpc2VkIG5vbmUsIHdlIHdpbGwgY29uZmlndXJlCisgICAgICAgICAgICAgKiBvdXJzZWx2ZXMgdG8gZW5hYmxlIFJ4IEZsb3cgQ29udHJvbCBvbmx5LiAgV2UgY2FuIGRvCisgICAgICAgICAgICAgKiB0aGlzIHNhZmVseSBmb3IgdHdvIHJlYXNvbnM6ICBJZiB0aGUgbGluayBwYXJ0bmVyIHJlYWxseQorICAgICAgICAgICAgICogZGlkbid0IHdhbnQgZmxvdyBjb250cm9sIGVuYWJsZWQsIGFuZCB3ZSBlbmFibGUgUngsIG5vCisgICAgICAgICAgICAgKiBoYXJtIGRvbmUgc2luY2Ugd2Ugd29uJ3QgYmUgcmVjZWl2aW5nIGFueSBQQVVTRSBmcmFtZXMKKyAgICAgICAgICAgICAqIGFueXdheS4gIElmIHRoZSBpbnRlbnQgb24gdGhlIGxpbmsgcGFydG5lciB3YXMgdG8gaGF2ZQorICAgICAgICAgICAgICogZmxvdyBjb250cm9sIGVuYWJsZWQsIHRoZW4gYnkgdXMgZW5hYmxpbmcgUlggb25seSwgd2UKKyAgICAgICAgICAgICAqIGNhbiBhdCBsZWFzdCByZWNlaXZlIHBhdXNlIGZyYW1lcyBhbmQgcHJvY2VzcyB0aGVtLgorICAgICAgICAgICAgICogVGhpcyBpcyBhIGdvb2QgaWRlYSBiZWNhdXNlIGluIG1vc3QgY2FzZXMsIHNpbmNlIHdlIGFyZQorICAgICAgICAgICAgICogcHJlZG9taW5hbnRseSBhIHNlcnZlciBOSUMsIG1vcmUgdGltZXMgdGhhbiBub3Qgd2Ugd2lsbAorICAgICAgICAgICAgICogYmUgYXNrZWQgdG8gZGVsYXkgdHJhbnNtaXNzaW9uIG9mIHBhY2tldHMgdGhhbiBhc2tpbmcKKyAgICAgICAgICAgICAqIG91ciBsaW5rIHBhcnRuZXIgdG8gcGF1c2UgdHJhbnNtaXNzaW9uIG9mIGZyYW1lcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZWxzZSBpZigoaHctPm9yaWdpbmFsX2ZjID09IGUxMDAwX2ZjX25vbmUgfHwKKyAgICAgICAgICAgICAgICAgICAgIGh3LT5vcmlnaW5hbF9mYyA9PSBlMTAwMF9mY190eF9wYXVzZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgaHctPmZjX3N0cmljdF9pZWVlKSB7CisgICAgICAgICAgICAgICAgaHctPmZjID0gZTEwMDBfZmNfbm9uZTsKKyAgICAgICAgICAgICAgICBERUJVR09VVCgiRmxvdyBDb250cm9sID0gTk9ORS5cclxuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGh3LT5mYyA9IGUxMDAwX2ZjX3J4X3BhdXNlOworICAgICAgICAgICAgICAgIERFQlVHT1VUKCJGbG93IENvbnRyb2wgPSBSWCBQQVVTRSBmcmFtZXMgb25seS5cclxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIE5vdyB3ZSBuZWVkIHRvIGRvIG9uZSBsYXN0IGNoZWNrLi4uICBJZiB3ZSBhdXRvLQorICAgICAgICAgICAgICogbmVnb3RpYXRlZCB0byBIQUxGIERVUExFWCwgZmxvdyBjb250cm9sIHNob3VsZCBub3QgYmUKKyAgICAgICAgICAgICAqIGVuYWJsZWQgcGVyIElFRUUgODAyLjMgc3BlYy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2dldF9zcGVlZF9hbmRfZHVwbGV4KGh3LCAmc3BlZWQsICZkdXBsZXgpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBnZXR0aW5nIGxpbmsgc3BlZWQgYW5kIGR1cGxleFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKGR1cGxleCA9PSBIQUxGX0RVUExFWCkKKyAgICAgICAgICAgICAgICBody0+ZmMgPSBlMTAwMF9mY19ub25lOworCisgICAgICAgICAgICAvKiBOb3cgd2UgY2FsbCBhIHN1YnJvdXRpbmUgdG8gYWN0dWFsbHkgZm9yY2UgdGhlIE1BQworICAgICAgICAgICAgICogY29udHJvbGxlciB0byB1c2UgdGhlIGNvcnJlY3QgZmxvdyBjb250cm9sIHNldHRpbmdzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfZm9yY2VfbWFjX2ZjKGh3KTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgICAgICAgICBERUJVR09VVCgiRXJyb3IgZm9yY2luZyBmbG93IGNvbnRyb2wgc2V0dGluZ3NcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgREVCVUdPVVQoIkNvcHBlciBQSFkgYW5kIEF1dG8gTmVnIGhhcyBub3QgY29tcGxldGVkLlxyXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgbGluayBzdGF0dXMgb2YgdGhlIGhhcmR3YXJlIGhhcyBjaGFuZ2VkLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogQ2FsbGVkIGJ5IGFueSBmdW5jdGlvbiB0aGF0IG5lZWRzIHRvIGNoZWNrIHRoZSBsaW5rIHN0YXR1cyBvZiB0aGUgYWRhcHRlci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX2NoZWNrX2Zvcl9saW5rKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgcnhjdyA9IDA7CisgICAgdWludDMyX3QgY3RybDsKKyAgICB1aW50MzJfdCBzdGF0dXM7CisgICAgdWludDMyX3QgcmN0bDsKKyAgICB1aW50MzJfdCBpY3I7CisgICAgdWludDMyX3Qgc2lnbmFsID0gMDsKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3QgcGh5X2RhdGE7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2NoZWNrX2Zvcl9saW5rIik7CisKKyAgICBjdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkwpOworICAgIHN0YXR1cyA9IEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpOworCisgICAgLyogT24gYWRhcHRlcnMgd2l0aCBhIE1BQyBuZXdlciB0aGFuIDgyNTQ0LCBTVyBEZWZpbmVhYmxlIHBpbiAxIHdpbGwgYmUKKyAgICAgKiBzZXQgd2hlbiB0aGUgb3B0aWNzIGRldGVjdCBhIHNpZ25hbC4gT24gb2xkZXIgYWRhcHRlcnMsIGl0IHdpbGwgYmUKKyAgICAgKiBjbGVhcmVkIHdoZW4gdGhlcmUgaXMgYSBzaWduYWwuICBUaGlzIGFwcGxpZXMgdG8gZmliZXIgbWVkaWEgb25seS4KKyAgICAgKi8KKyAgICBpZigoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgfHwKKyAgICAgICAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpKSB7CisgICAgICAgIHJ4Y3cgPSBFMTAwMF9SRUFEX1JFRyhodywgUlhDVyk7CisKKyAgICAgICAgaWYoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgeworICAgICAgICAgICAgc2lnbmFsID0gKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KSA/IEUxMDAwX0NUUkxfU1dEUElOMSA6IDA7CisgICAgICAgICAgICBpZihzdGF0dXMgJiBFMTAwMF9TVEFUVVNfTFUpCisgICAgICAgICAgICAgICAgaHctPmdldF9saW5rX3N0YXR1cyA9IEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSWYgd2UgaGF2ZSBhIGNvcHBlciBQSFkgdGhlbiB3ZSBvbmx5IHdhbnQgdG8gZ28gb3V0IHRvIHRoZSBQSFkKKyAgICAgKiByZWdpc3RlcnMgdG8gc2VlIGlmIEF1dG8tTmVnIGhhcyBjb21wbGV0ZWQgYW5kL29yIGlmIG91ciBsaW5rCisgICAgICogc3RhdHVzIGhhcyBjaGFuZ2VkLiAgVGhlIGdldF9saW5rX3N0YXR1cyBmbGFnIHdpbGwgYmUgc2V0IGlmIHdlCisgICAgICogcmVjZWl2ZSBhIExpbmsgU3RhdHVzIENoYW5nZSBpbnRlcnJ1cHQgb3Igd2UgaGF2ZSBSeCBTZXF1ZW5jZQorICAgICAqIEVycm9ycy4KKyAgICAgKi8KKyAgICBpZigoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpICYmIGh3LT5nZXRfbGlua19zdGF0dXMpIHsKKyAgICAgICAgLyogRmlyc3Qgd2Ugd2FudCB0byBzZWUgaWYgdGhlIE1JSSBTdGF0dXMgUmVnaXN0ZXIgcmVwb3J0cworICAgICAgICAgKiBsaW5rLiAgSWYgc28sIHRoZW4gd2Ugd2FudCB0byBnZXQgdGhlIGN1cnJlbnQgc3BlZWQvZHVwbGV4CisgICAgICAgICAqIG9mIHRoZSBQSFkuCisgICAgICAgICAqIFJlYWQgdGhlIHJlZ2lzdGVyIHR3aWNlIHNpbmNlIHRoZSBsaW5rIGJpdCBpcyBzdGlja3kuCisgICAgICAgICAqLworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICBpZihwaHlfZGF0YSAmIE1JSV9TUl9MSU5LX1NUQVRVUykgeworICAgICAgICAgICAgaHctPmdldF9saW5rX3N0YXR1cyA9IEZBTFNFOworICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlcmUgd2FzIERvd25TaGlmdCwgbXVzdCBiZSBjaGVja2VkIGltbWVkaWF0ZWx5IGFmdGVyCisgICAgICAgICAgICAgKiBsaW5rLXVwICovCisgICAgICAgICAgICBlMTAwMF9jaGVja19kb3duc2hpZnQoaHcpOworCisgICAgICAgICAgICAvKiBJZiB3ZSBhcmUgb24gODI1NDQgb3IgODI1NDMgc2lsaWNvbiBhbmQgc3BlZWQvZHVwbGV4CisgICAgICAgICAgICAgKiBhcmUgZm9yY2VkIHRvIDEwSCBvciAxMEYsIHRoZW4gd2Ugd2lsbCBpbXBsZW1lbnQgdGhlIHBvbGFyaXR5CisgICAgICAgICAgICAgKiByZXZlcnNhbCB3b3JrYXJvdW5kLiAgV2UgZGlzYWJsZSBpbnRlcnJ1cHRzIGZpcnN0LCBhbmQgdXBvbgorICAgICAgICAgICAgICogcmV0dXJuaW5nLCBwbGFjZSB0aGUgZGV2aWNlcyBpbnRlcnJ1cHQgc3RhdGUgdG8gaXRzIHByZXZpb3VzCisgICAgICAgICAgICAgKiB2YWx1ZSBleGNlcHQgZm9yIHRoZSBsaW5rIHN0YXR1cyBjaGFuZ2UgaW50ZXJydXB0IHdoaWNoIHdpbGwKKyAgICAgICAgICAgICAqIGhhcHBlbiBkdWUgdG8gdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIHdvcmthcm91bmQuCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgaWYoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NCB8fCBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDMpICYmCisgICAgICAgICAgICAgICAoIWh3LT5hdXRvbmVnKSAmJgorICAgICAgICAgICAgICAgKGh3LT5mb3JjZWRfc3BlZWRfZHVwbGV4ID09IGUxMDAwXzEwX2Z1bGwgfHwKKyAgICAgICAgICAgICAgICBody0+Zm9yY2VkX3NwZWVkX2R1cGxleCA9PSBlMTAwMF8xMF9oYWxmKSkgeworICAgICAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgSU1DLCAweGZmZmZmZmZmKTsKKyAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfd29ya2Fyb3VuZChodyk7CisgICAgICAgICAgICAgICAgaWNyID0gRTEwMDBfUkVBRF9SRUcoaHcsIElDUik7CisgICAgICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBJQ1MsIChpY3IgJiB+RTEwMDBfSUNTX0xTQykpOworICAgICAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgSU1TLCBJTVNfRU5BQkxFX01BU0spOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBObyBsaW5rIGRldGVjdGVkICovCisgICAgICAgICAgICBlMTAwMF9jb25maWdfZHNwX2FmdGVyX2xpbmtfY2hhbmdlKGh3LCBGQUxTRSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIHdlIGFyZSBmb3JjaW5nIHNwZWVkL2R1cGxleCwgdGhlbiB3ZSBzaW1wbHkgcmV0dXJuIHNpbmNlCisgICAgICAgICAqIHdlIGhhdmUgYWxyZWFkeSBkZXRlcm1pbmVkIHdoZXRoZXIgd2UgaGF2ZSBsaW5rIG9yIG5vdC4KKyAgICAgICAgICovCisgICAgICAgIGlmKCFody0+YXV0b25lZykgcmV0dXJuIC1FMTAwMF9FUlJfQ09ORklHOworCisgICAgICAgIC8qIG9wdGltaXplIHRoZSBkc3Agc2V0dGluZ3MgZm9yIHRoZSBpZ3AgcGh5ICovCisgICAgICAgIGUxMDAwX2NvbmZpZ19kc3BfYWZ0ZXJfbGlua19jaGFuZ2UoaHcsIFRSVUUpOworCisgICAgICAgIC8qIFdlIGhhdmUgYSBNODhFMTAwMCBQSFkgYW5kIEF1dG8tTmVnIGlzIGVuYWJsZWQuICBJZiB3ZQorICAgICAgICAgKiBoYXZlIFNpIG9uIGJvYXJkIHRoYXQgaXMgODI1NDQgb3IgbmV3ZXIsIEF1dG8KKyAgICAgICAgICogU3BlZWQgRGV0ZWN0aW9uIHRha2VzIGNhcmUgb2YgTUFDIHNwZWVkL2R1cGxleAorICAgICAgICAgKiBjb25maWd1cmF0aW9uLiAgU28gd2Ugb25seSBuZWVkIHRvIGNvbmZpZ3VyZSBDb2xsaXNpb24KKyAgICAgICAgICogRGlzdGFuY2UgaW4gdGhlIE1BQy4gIE90aGVyd2lzZSwgd2UgbmVlZCB0byBmb3JjZQorICAgICAgICAgKiBzcGVlZC9kdXBsZXggb24gdGhlIE1BQyB0byB0aGUgY3VycmVudCBQSFkgc3BlZWQvZHVwbGV4CisgICAgICAgICAqIHNldHRpbmdzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQ0KQorICAgICAgICAgICAgZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KGh3KTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfY29uZmlnX21hY190b19waHkoaHcpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBjb25maWd1cmluZyBNQUMgdG8gUEhZIHNldHRpbmdzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbmZpZ3VyZSBGbG93IENvbnRyb2wgbm93IHRoYXQgQXV0by1OZWcgaGFzIGNvbXBsZXRlZC4gRmlyc3QsIHdlCisgICAgICAgICAqIG5lZWQgdG8gcmVzdG9yZSB0aGUgZGVzaXJlZCBmbG93IGNvbnRyb2wgc2V0dGluZ3MgYmVjYXVzZSB3ZSBtYXkKKyAgICAgICAgICogaGF2ZSBoYWQgdG8gcmUtYXV0b25lZyB3aXRoIGEgZGlmZmVyZW50IGxpbmsgcGFydG5lci4KKyAgICAgICAgICovCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9jb25maWdfZmNfYWZ0ZXJfbGlua191cChodyk7CisgICAgICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBjb25maWd1cmluZyBmbG93IGNvbnRyb2xcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0KKworICAgICAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCB3ZSBhcmUgb24gY29wcGVyIGFuZCB3ZSBoYXZlCisgICAgICAgICAqIGF1dG8tbmVnb3RpYXRlZCBsaW5rLiAgVGhlc2UgYXJlIGNvbmRpdGlvbnMgZm9yIGNoZWNraW5nIHRoZSBsaW5rCisgICAgICAgICAqIHBhcnRuZXIgY2FwYWJpbGl0eSByZWdpc3Rlci4gIFdlIHVzZSB0aGUgbGluayBzcGVlZCB0byBkZXRlcm1pbmUgaWYKKyAgICAgICAgICogVEJJIGNvbXBhdGliaWxpdHkgbmVlZHMgdG8gYmUgdHVybmVkIG9uIG9yIG9mZi4gIElmIHRoZSBsaW5rIGlzIG5vdAorICAgICAgICAgKiBhdCBnaWdhYml0IHNwZWVkLCB0aGVuIFRCSSBjb21wYXRpYmlsaXR5IGlzIG5vdCBuZWVkZWQuICBJZiB3ZSBhcmUKKyAgICAgICAgICogYXQgZ2lnYWJpdCBzcGVlZCwgd2UgdHVybiBvbiBUQkkgY29tcGF0aWJpbGl0eS4KKyAgICAgICAgICovCisgICAgICAgIGlmKGh3LT50YmlfY29tcGF0aWJpbGl0eV9lbikgeworICAgICAgICAgICAgdWludDE2X3Qgc3BlZWQsIGR1cGxleDsKKyAgICAgICAgICAgIGUxMDAwX2dldF9zcGVlZF9hbmRfZHVwbGV4KGh3LCAmc3BlZWQsICZkdXBsZXgpOworICAgICAgICAgICAgaWYoc3BlZWQgIT0gU1BFRURfMTAwMCkgeworICAgICAgICAgICAgICAgIC8qIElmIGxpbmsgc3BlZWQgaXMgbm90IHNldCB0byBnaWdhYml0IHNwZWVkLCB3ZSBkbyBub3QgbmVlZAorICAgICAgICAgICAgICAgICAqIHRvIGVuYWJsZSBUQkkgY29tcGF0aWJpbGl0eS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZihody0+dGJpX2NvbXBhdGliaWxpdHlfb24pIHsKKyAgICAgICAgICAgICAgICAgICAgLyogSWYgd2UgcHJldmlvdXNseSB3ZXJlIGluIHRoZSBtb2RlLCB0dXJuIGl0IG9mZi4gKi8KKyAgICAgICAgICAgICAgICAgICAgcmN0bCA9IEUxMDAwX1JFQURfUkVHKGh3LCBSQ1RMKTsKKyAgICAgICAgICAgICAgICAgICAgcmN0bCAmPSB+RTEwMDBfUkNUTF9TQlA7CisgICAgICAgICAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgUkNUTCwgcmN0bCk7CisgICAgICAgICAgICAgICAgICAgIGh3LT50YmlfY29tcGF0aWJpbGl0eV9vbiA9IEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogSWYgVEJJIGNvbXBhdGliaWxpdHkgaXMgd2FzIHByZXZpb3VzbHkgb2ZmLCB0dXJuIGl0IG9uLiBGb3IKKyAgICAgICAgICAgICAgICAgKiBjb21wYXRpYmlsaXR5IHdpdGggYSBUQkkgbGluayBwYXJ0bmVyLCB3ZSB3aWxsIHN0b3JlIGJhZAorICAgICAgICAgICAgICAgICAqIHBhY2tldHMuIFNvbWUgZnJhbWVzIGhhdmUgYW4gYWRkaXRpb25hbCBieXRlIG9uIHRoZSBlbmQgYW5kCisgICAgICAgICAgICAgICAgICogd2lsbCBsb29rIGxpa2UgQ1JDIGVycm9ycyB0byB0byB0aGUgaGFyZHdhcmUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYoIWh3LT50YmlfY29tcGF0aWJpbGl0eV9vbikgeworICAgICAgICAgICAgICAgICAgICBody0+dGJpX2NvbXBhdGliaWxpdHlfb24gPSBUUlVFOworICAgICAgICAgICAgICAgICAgICByY3RsID0gRTEwMDBfUkVBRF9SRUcoaHcsIFJDVEwpOworICAgICAgICAgICAgICAgICAgICByY3RsIHw9IEUxMDAwX1JDVExfU0JQOworICAgICAgICAgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIFJDVEwsIHJjdGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBJZiB3ZSBkb24ndCBoYXZlIGxpbmsgKGF1dG8tbmVnb3RpYXRpb24gZmFpbGVkIG9yIGxpbmsgcGFydG5lciBjYW5ub3QKKyAgICAgKiBhdXRvLW5lZ290aWF0ZSksIHRoZSBjYWJsZSBpcyBwbHVnZ2VkIGluICh3ZSBoYXZlIHNpZ25hbCksIGFuZCBvdXIKKyAgICAgKiBsaW5rIHBhcnRuZXIgaXMgbm90IHRyeWluZyB0byBhdXRvLW5lZ290aWF0ZSB3aXRoIHVzICh3ZSBhcmUgcmVjZWl2aW5nCisgICAgICogaWRsZXMgb3IgZGF0YSksIHdlIG5lZWQgdG8gZm9yY2UgbGluayB1cC4gV2UgYWxzbyBuZWVkIHRvIGdpdmUKKyAgICAgKiBhdXRvLW5lZ290aWF0aW9uIHRpbWUgdG8gY29tcGxldGUsIGluIGNhc2UgdGhlIGNhYmxlIHdhcyBqdXN0IHBsdWdnZWQKKyAgICAgKiBpbi4gVGhlIGF1dG9uZWdfZmFpbGVkIGZsYWcgZG9lcyB0aGlzLgorICAgICAqLworICAgIGVsc2UgaWYoKCgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgJiYKKyAgICAgICAgICAgICAgKChjdHJsICYgRTEwMDBfQ1RSTF9TV0RQSU4xKSA9PSBzaWduYWwpKSB8fAorICAgICAgICAgICAgIChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykpICYmCisgICAgICAgICAgICAoIShzdGF0dXMgJiBFMTAwMF9TVEFUVVNfTFUpKSAmJgorICAgICAgICAgICAgKCEocnhjdyAmIEUxMDAwX1JYQ1dfQykpKSB7CisgICAgICAgIGlmKGh3LT5hdXRvbmVnX2ZhaWxlZCA9PSAwKSB7CisgICAgICAgICAgICBody0+YXV0b25lZ19mYWlsZWQgPSAxOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgREVCVUdPVVQoIk5PVCBSWGluZyAvQy8sIGRpc2FibGUgQXV0b05lZyBhbmQgZm9yY2UgbGluay5cclxuIik7CisKKyAgICAgICAgLyogRGlzYWJsZSBhdXRvLW5lZ290aWF0aW9uIGluIHRoZSBUWENXIHJlZ2lzdGVyICovCisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgVFhDVywgKGh3LT50eGN3ICYgfkUxMDAwX1RYQ1dfQU5FKSk7CisKKyAgICAgICAgLyogRm9yY2UgbGluay11cCBhbmQgYWxzbyBmb3JjZSBmdWxsLWR1cGxleC4gKi8KKyAgICAgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKyAgICAgICAgY3RybCB8PSAoRTEwMDBfQ1RSTF9TTFUgfCBFMTAwMF9DVFJMX0ZEKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKworICAgICAgICAvKiBDb25maWd1cmUgRmxvdyBDb250cm9sIGFmdGVyIGZvcmNpbmcgbGluayB1cC4gKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2NvbmZpZ19mY19hZnRlcl9saW5rX3VwKGh3KTsKKyAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICAgICAgREVCVUdPVVQoIkVycm9yIGNvbmZpZ3VyaW5nIGZsb3cgY29udHJvbFxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBJZiB3ZSBhcmUgZm9yY2luZyBsaW5rIGFuZCB3ZSBhcmUgcmVjZWl2aW5nIC9DLyBvcmRlcmVkIHNldHMsIHJlLWVuYWJsZQorICAgICAqIGF1dG8tbmVnb3RpYXRpb24gaW4gdGhlIFRYQ1cgcmVnaXN0ZXIgYW5kIGRpc2FibGUgZm9yY2VkIGxpbmsgaW4gdGhlCisgICAgICogRGV2aWNlIENvbnRyb2wgcmVnaXN0ZXIgaW4gYW4gYXR0ZW1wdCB0byBhdXRvLW5lZ290aWF0ZSB3aXRoIG91ciBsaW5rCisgICAgICogcGFydG5lci4KKyAgICAgKi8KKyAgICBlbHNlIGlmKCgoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgfHwKKyAgICAgICAgICAgICAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpKSAmJgorICAgICAgICAgICAgKGN0cmwgJiBFMTAwMF9DVFJMX1NMVSkgJiYgKHJ4Y3cgJiBFMTAwMF9SWENXX0MpKSB7CisgICAgICAgIERFQlVHT1VUKCJSWGluZyAvQy8sIGVuYWJsZSBBdXRvTmVnIGFuZCBzdG9wIGZvcmNpbmcgbGluay5cclxuIik7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgVFhDVywgaHctPnR4Y3cpOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsIChjdHJsICYgfkUxMDAwX0NUUkxfU0xVKSk7CisKKyAgICAgICAgaHctPnNlcmRlc19saW5rX2Rvd24gPSBGQUxTRTsKKyAgICB9CisgICAgLyogSWYgd2UgZm9yY2UgbGluayBmb3Igbm9uLWF1dG8tbmVnb3RpYXRpb24gc3dpdGNoLCBjaGVjayBsaW5rIHN0YXR1cworICAgICAqIGJhc2VkIG9uIE1BQyBzeW5jaHJvbml6YXRpb24gZm9yIGludGVybmFsIHNlcmRlcyBtZWRpYSB0eXBlLgorICAgICAqLworICAgIGVsc2UgaWYoKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSAmJgorICAgICAgICAgICAgIShFMTAwMF9UWENXX0FORSAmIEUxMDAwX1JFQURfUkVHKGh3LCBUWENXKSkpIHsKKyAgICAgICAgLyogU1lOQ0ggYml0IGFuZCBJViBiaXQgYXJlIHN0aWNreS4gKi8KKyAgICAgICAgdWRlbGF5KDEwKTsKKyAgICAgICAgaWYoRTEwMDBfUlhDV19TWU5DSCAmIEUxMDAwX1JFQURfUkVHKGh3LCBSWENXKSkgeworICAgICAgICAgICAgaWYoIShyeGN3ICYgRTEwMDBfUlhDV19JVikpIHsKKyAgICAgICAgICAgICAgICBody0+c2VyZGVzX2xpbmtfZG93biA9IEZBTFNFOworICAgICAgICAgICAgICAgIERFQlVHT1VUKCJTRVJERVM6IExpbmsgaXMgdXAuXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGh3LT5zZXJkZXNfbGlua19kb3duID0gVFJVRTsKKyAgICAgICAgICAgIERFQlVHT1VUKCJTRVJERVM6IExpbmsgaXMgZG93bi5cbiIpOworICAgICAgICB9CisgICAgfQorICAgIGlmKChody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykgJiYKKyAgICAgICAoRTEwMDBfVFhDV19BTkUgJiBFMTAwMF9SRUFEX1JFRyhodywgVFhDVykpKSB7CisgICAgICAgIGh3LT5zZXJkZXNfbGlua19kb3duID0gIShFMTAwMF9TVEFUVVNfTFUgJiBFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKSk7CisgICAgfQorICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZXRlY3RzIHRoZSBjdXJyZW50IHNwZWVkIGFuZCBkdXBsZXggc2V0dGluZ3Mgb2YgdGhlIGhhcmR3YXJlLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBzcGVlZCAtIFNwZWVkIG9mIHRoZSBjb25uZWN0aW9uCisgKiBkdXBsZXggLSBEdXBsZXggc2V0dGluZyBvZiB0aGUgY29ubmVjdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpzcGVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpkdXBsZXgpCit7CisgICAgdWludDMyX3Qgc3RhdHVzOworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgiKTsKKworICAgIGlmKGh3LT5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgeworICAgICAgICBzdGF0dXMgPSBFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKTsKKyAgICAgICAgaWYoc3RhdHVzICYgRTEwMDBfU1RBVFVTX1NQRUVEXzEwMDApIHsKKyAgICAgICAgICAgICpzcGVlZCA9IFNQRUVEXzEwMDA7CisgICAgICAgICAgICBERUJVR09VVCgiMTAwMCBNYnMsICIpOworICAgICAgICB9IGVsc2UgaWYoc3RhdHVzICYgRTEwMDBfU1RBVFVTX1NQRUVEXzEwMCkgeworICAgICAgICAgICAgKnNwZWVkID0gU1BFRURfMTAwOworICAgICAgICAgICAgREVCVUdPVVQoIjEwMCBNYnMsICIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKnNwZWVkID0gU1BFRURfMTA7CisgICAgICAgICAgICBERUJVR09VVCgiMTAgTWJzLCAiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19GRCkgeworICAgICAgICAgICAgKmR1cGxleCA9IEZVTExfRFVQTEVYOworICAgICAgICAgICAgREVCVUdPVVQoIkZ1bGwgRHVwbGV4XHJcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmR1cGxleCA9IEhBTEZfRFVQTEVYOworICAgICAgICAgICAgREVCVUdPVVQoIiBIYWxmIER1cGxleFxyXG4iKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIERFQlVHT1VUKCIxMDAwIE1icywgRnVsbCBEdXBsZXhcclxuIik7CisgICAgICAgICpzcGVlZCA9IFNQRUVEXzEwMDA7CisgICAgICAgICpkdXBsZXggPSBGVUxMX0RVUExFWDsKKyAgICB9CisKKyAgICAvKiBJR1AwMSBQSFkgbWF5IGFkdmVydGlzZSBmdWxsIGR1cGxleCBvcGVyYXRpb24gYWZ0ZXIgc3BlZWQgZG93bmdyYWRlIGV2ZW4KKyAgICAgKiBpZiBpdCBpcyBvcGVyYXRpbmcgYXQgaGFsZiBkdXBsZXguICBIZXJlIHdlIHNldCB0aGUgZHVwbGV4IHNldHRpbmdzIHRvCisgICAgICogbWF0Y2ggdGhlIGR1cGxleCBpbiB0aGUgbGluayBwYXJ0bmVyJ3MgY2FwYWJpbGl0aWVzLgorICAgICAqLworICAgIGlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwICYmIGh3LT5zcGVlZF9kb3duZ3JhZGVkKSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9BVVRPTkVHX0VYUCwgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIGlmKCEocGh5X2RhdGEgJiBOV0FZX0VSX0xQX05XQVlfQ0FQUykpCisgICAgICAgICAgICAqZHVwbGV4ID0gSEFMRl9EVVBMRVg7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0xQX0FCSUxJVFksICZwaHlfZGF0YSk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgaWYoKCpzcGVlZCA9PSBTUEVFRF8xMDAgJiYgIShwaHlfZGF0YSAmIE5XQVlfTFBBUl8xMDBUWF9GRF9DQVBTKSkgfHwKKyAgICAgICAgICAgICAgICgqc3BlZWQgPT0gU1BFRURfMTAgJiYgIShwaHlfZGF0YSAmIE5XQVlfTFBBUl8xMFRfRkRfQ0FQUykpKQorICAgICAgICAgICAgICAgICpkdXBsZXggPSBIQUxGX0RVUExFWDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEJsb2NrcyB1bnRpbCBhdXRvbmVnIGNvbXBsZXRlcyBvciB0aW1lcyBvdXQgKH40LjUgc2Vjb25kcykKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX3dhaXRfYXV0b25lZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBpOworICAgIHVpbnQxNl90IHBoeV9kYXRhOworCisgICAgREVCVUdGVU5DKCJlMTAwMF93YWl0X2F1dG9uZWciKTsKKyAgICBERUJVR09VVCgiV2FpdGluZyBmb3IgQXV0by1OZWcgdG8gY29tcGxldGUuXG4iKTsKKworICAgIC8qIFdlIHdpbGwgd2FpdCBmb3IgYXV0b25lZyB0byBjb21wbGV0ZSBvciA0LjUgc2Vjb25kcyB0byBleHBpcmUuICovCisgICAgZm9yKGkgPSBQSFlfQVVUT19ORUdfVElNRTsgaSA+IDA7IGktLSkgeworICAgICAgICAvKiBSZWFkIHRoZSBNSUkgU3RhdHVzIFJlZ2lzdGVyIGFuZCB3YWl0IGZvciBBdXRvLU5lZworICAgICAgICAgKiBDb21wbGV0ZSBiaXQgdG8gYmUgc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIGlmKHBoeV9kYXRhICYgTUlJX1NSX0FVVE9ORUdfQ09NUExFVEUpIHsKKyAgICAgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworICAgICAgICB9CisgICAgICAgIG1zZWNfZGVsYXkoMTAwKTsKKyAgICB9CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUmFpc2VzIHRoZSBNYW5hZ2VtZW50IERhdGEgQ2xvY2sKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyogY3RybCAtIERldmljZSBjb250cm9sIHJlZ2lzdGVyJ3MgY3VycmVudCB2YWx1ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX3JhaXNlX21kaV9jbGsoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmN0cmwpCit7CisgICAgLyogUmFpc2UgdGhlIGNsb2NrIGlucHV0IHRvIHRoZSBNYW5hZ2VtZW50IERhdGEgQ2xvY2sgKGJ5IHNldHRpbmcgdGhlIE1EQworICAgICAqIGJpdCksIGFuZCB0aGVuIGRlbGF5IDEwIG1pY3Jvc2Vjb25kcy4KKyAgICAgKi8KKyAgICBFMTAwMF9XUklURV9SRUcoaHcsIENUUkwsICgqY3RybCB8IEUxMDAwX0NUUkxfTURDKSk7CisgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgIHVkZWxheSgxMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTG93ZXJzIHRoZSBNYW5hZ2VtZW50IERhdGEgQ2xvY2sKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyogY3RybCAtIERldmljZSBjb250cm9sIHJlZ2lzdGVyJ3MgY3VycmVudCB2YWx1ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX2xvd2VyX21kaV9jbGsoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmN0cmwpCit7CisgICAgLyogTG93ZXIgdGhlIGNsb2NrIGlucHV0IHRvIHRoZSBNYW5hZ2VtZW50IERhdGEgQ2xvY2sgKGJ5IGNsZWFyaW5nIHRoZSBNREMKKyAgICAgKiBiaXQpLCBhbmQgdGhlbiBkZWxheSAxMCBtaWNyb3NlY29uZHMuCisgICAgICovCisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCAoKmN0cmwgJiB+RTEwMDBfQ1RSTF9NREMpKTsKKyAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgdWRlbGF5KDEwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTaGlmdHMgZGF0YSBiaXRzIG91dCB0byB0aGUgUEhZCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqIGRhdGEgLSBEYXRhIHRvIHNlbmQgb3V0IHRvIHRoZSBQSFkKKyogY291bnQgLSBOdW1iZXIgb2YgYml0cyB0byBzaGlmdCBvdXQKKyoKKyogQml0cyBhcmUgc2hpZnRlZCBvdXQgaW4gTVNCIHRvIExTQiBvcmRlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitlMTAwMF9zaGlmdF9vdXRfbWRpX2JpdHMoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvdW50KQoreworICAgIHVpbnQzMl90IGN0cmw7CisgICAgdWludDMyX3QgbWFzazsKKworICAgIC8qIFdlIG5lZWQgdG8gc2hpZnQgImNvdW50IiBudW1iZXIgb2YgYml0cyBvdXQgdG8gdGhlIFBIWS4gU28sIHRoZSB2YWx1ZQorICAgICAqIGluIHRoZSAiZGF0YSIgcGFyYW1ldGVyIHdpbGwgYmUgc2hpZnRlZCBvdXQgdG8gdGhlIFBIWSBvbmUgYml0IGF0IGEKKyAgICAgKiB0aW1lLiBJbiBvcmRlciB0byBkbyB0aGlzLCAiZGF0YSIgbXVzdCBiZSBicm9rZW4gZG93biBpbnRvIGJpdHMuCisgICAgICovCisgICAgbWFzayA9IDB4MDE7CisgICAgbWFzayA8PD0gKGNvdW50IC0gMSk7CisKKyAgICBjdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkwpOworCisgICAgLyogU2V0IE1ESU9fRElSIGFuZCBNRENfRElSIGRpcmVjdGlvbiBiaXRzIHRvIGJlIHVzZWQgYXMgb3V0cHV0IHBpbnMuICovCisgICAgY3RybCB8PSAoRTEwMDBfQ1RSTF9NRElPX0RJUiB8IEUxMDAwX0NUUkxfTURDX0RJUik7CisKKyAgICB3aGlsZShtYXNrKSB7CisgICAgICAgIC8qIEEgIjEiIGlzIHNoaWZ0ZWQgb3V0IHRvIHRoZSBQSFkgYnkgc2V0dGluZyB0aGUgTURJTyBiaXQgdG8gIjEiIGFuZAorICAgICAgICAgKiB0aGVuIHJhaXNpbmcgYW5kIGxvd2VyaW5nIHRoZSBNYW5hZ2VtZW50IERhdGEgQ2xvY2suIEEgIjAiIGlzCisgICAgICAgICAqIHNoaWZ0ZWQgb3V0IHRvIHRoZSBQSFkgYnkgc2V0dGluZyB0aGUgTURJTyBiaXQgdG8gIjAiIGFuZCB0aGVuCisgICAgICAgICAqIHJhaXNpbmcgYW5kIGxvd2VyaW5nIHRoZSBjbG9jay4KKyAgICAgICAgICovCisgICAgICAgIGlmKGRhdGEgJiBtYXNrKSBjdHJsIHw9IEUxMDAwX0NUUkxfTURJTzsKKyAgICAgICAgZWxzZSBjdHJsICY9IH5FMTAwMF9DVFJMX01ESU87CisKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworCisgICAgICAgIHVkZWxheSgxMCk7CisKKyAgICAgICAgZTEwMDBfcmFpc2VfbWRpX2NsayhodywgJmN0cmwpOworICAgICAgICBlMTAwMF9sb3dlcl9tZGlfY2xrKGh3LCAmY3RybCk7CisKKyAgICAgICAgbWFzayA9IG1hc2sgPj4gMTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU2hpZnRzIGRhdGEgYml0cyBpbiBmcm9tIHRoZSBQSFkKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoKKyogQml0cyBhcmUgc2hpZnRlZCBpbiBpbiBNU0IgdG8gTFNCIG9yZGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVpbnQxNl90CitlMTAwMF9zaGlmdF9pbl9tZGlfYml0cyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IGN0cmw7CisgICAgdWludDE2X3QgZGF0YSA9IDA7CisgICAgdWludDhfdCBpOworCisgICAgLyogSW4gb3JkZXIgdG8gcmVhZCBhIHJlZ2lzdGVyIGZyb20gdGhlIFBIWSwgd2UgbmVlZCB0byBzaGlmdCBpbiBhIHRvdGFsCisgICAgICogb2YgMTggYml0cyBmcm9tIHRoZSBQSFkuIFRoZSBmaXJzdCB0d28gYml0ICh0dXJuYXJvdW5kKSB0aW1lcyBhcmUgdXNlZAorICAgICAqIHRvIGF2b2lkIGNvbnRlbnRpb24gb24gdGhlIE1ESU8gcGluIHdoZW4gYSByZWFkIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuCisgICAgICogVGhlc2UgdHdvIGJpdHMgYXJlIGlnbm9yZWQgYnkgdXMgYW5kIHRocm93biBhd2F5LiBCaXRzIGFyZSAic2hpZnRlZCBpbiIKKyAgICAgKiBieSByYWlzaW5nIHRoZSBpbnB1dCB0byB0aGUgTWFuYWdlbWVudCBEYXRhIENsb2NrIChzZXR0aW5nIHRoZSBNREMgYml0KSwKKyAgICAgKiBhbmQgdGhlbiByZWFkaW5nIHRoZSB2YWx1ZSBvZiB0aGUgTURJTyBiaXQuCisgICAgICovCisgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKworICAgIC8qIENsZWFyIE1ESU9fRElSIChTV0RQSU8xKSB0byBpbmRpY2F0ZSB0aGlzIGJpdCBpcyB0byBiZSB1c2VkIGFzIGlucHV0LiAqLworICAgIGN0cmwgJj0gfkUxMDAwX0NUUkxfTURJT19ESVI7CisgICAgY3RybCAmPSB+RTEwMDBfQ1RSTF9NRElPOworCisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKyAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisKKyAgICAvKiBSYWlzZSBhbmQgTG93ZXIgdGhlIGNsb2NrIGJlZm9yZSByZWFkaW5nIGluIHRoZSBkYXRhLiBUaGlzIGFjY291bnRzIGZvcgorICAgICAqIHRoZSB0dXJuYXJvdW5kIGJpdHMuIFRoZSBmaXJzdCBjbG9jayBvY2N1cnJlZCB3aGVuIHdlIGNsb2NrZWQgb3V0IHRoZQorICAgICAqIGxhc3QgYml0IG9mIHRoZSBSZWdpc3RlciBBZGRyZXNzLgorICAgICAqLworICAgIGUxMDAwX3JhaXNlX21kaV9jbGsoaHcsICZjdHJsKTsKKyAgICBlMTAwMF9sb3dlcl9tZGlfY2xrKGh3LCAmY3RybCk7CisKKyAgICBmb3IoZGF0YSA9IDAsIGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICBkYXRhID0gZGF0YSA8PCAxOworICAgICAgICBlMTAwMF9yYWlzZV9tZGlfY2xrKGh3LCAmY3RybCk7CisgICAgICAgIGN0cmwgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTCk7CisgICAgICAgIC8qIENoZWNrIHRvIHNlZSBpZiB3ZSBzaGlmdGVkIGluIGEgIjEiLiAqLworICAgICAgICBpZihjdHJsICYgRTEwMDBfQ1RSTF9NRElPKSBkYXRhIHw9IDE7CisgICAgICAgIGUxMDAwX2xvd2VyX21kaV9jbGsoaHcsICZjdHJsKTsKKyAgICB9CisKKyAgICBlMTAwMF9yYWlzZV9tZGlfY2xrKGh3LCAmY3RybCk7CisgICAgZTEwMDBfbG93ZXJfbWRpX2NsayhodywgJmN0cmwpOworCisgICAgcmV0dXJuIGRhdGE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBSZWFkcyB0aGUgdmFsdWUgZnJvbSBhIFBIWSByZWdpc3RlciwgaWYgdGhlIHZhbHVlIGlzIG9uIGEgc3BlY2lmaWMgbm9uIHplcm8KKyogcGFnZSwgc2V0cyB0aGUgcGFnZSBmaXJzdC4KKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyogcmVnX2FkZHIgLSBhZGRyZXNzIG9mIHRoZSBQSFkgcmVnaXN0ZXIgdG8gcmVhZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfcmVhZF9waHlfcmVnKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVnX2FkZHIsCisgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKnBoeV9kYXRhKQoreworICAgIHVpbnQzMl90IHJldF92YWw7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3JlYWRfcGh5X3JlZyIpOworCisKKyAgICBpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCAmJgorICAgICAgIChyZWdfYWRkciA+IE1BWF9QSFlfTVVMVElfUEFHRV9SRUcpKSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnX2V4KGh3LCBJR1AwMUUxMDAwX1BIWV9QQUdFX1NFTEVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KXJlZ19hZGRyKTsKKyAgICAgICAgaWYocmV0X3ZhbCkgeworICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnX2V4KGh3LCBNQVhfUEhZX1JFR19BRERSRVNTICYgcmVnX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7CisKKyAgICByZXR1cm4gcmV0X3ZhbDsKK30KKworaW50MzJfdAorZTEwMDBfcmVhZF9waHlfcmVnX2V4KHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVnX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKnBoeV9kYXRhKQoreworICAgIHVpbnQzMl90IGk7CisgICAgdWludDMyX3QgbWRpYyA9IDA7CisgICAgY29uc3QgdWludDMyX3QgcGh5X2FkZHIgPSAxOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9yZWFkX3BoeV9yZWdfZXgiKTsKKworICAgIGlmKHJlZ19hZGRyID4gTUFYX1BIWV9SRUdfQUREUkVTUykgeworICAgICAgICBERUJVR09VVDEoIlBIWSBBZGRyZXNzICVkIGlzIG91dCBvZiByYW5nZVxuIiwgcmVnX2FkZHIpOworICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9QQVJBTTsKKyAgICB9CisKKyAgICBpZihody0+bWFjX3R5cGUgPiBlMTAwMF84MjU0MykgeworICAgICAgICAvKiBTZXQgdXAgT3AtY29kZSwgUGh5IEFkZHJlc3MsIGFuZCByZWdpc3RlciBhZGRyZXNzIGluIHRoZSBNREkKKyAgICAgICAgICogQ29udHJvbCByZWdpc3Rlci4gIFRoZSBNQUMgd2lsbCB0YWtlIGNhcmUgb2YgaW50ZXJmYWNpbmcgd2l0aCB0aGUKKyAgICAgICAgICogUEhZIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIGRhdGEuCisgICAgICAgICAqLworICAgICAgICBtZGljID0gKChyZWdfYWRkciA8PCBFMTAwMF9NRElDX1JFR19TSElGVCkgfAorICAgICAgICAgICAgICAgIChwaHlfYWRkciA8PCBFMTAwMF9NRElDX1BIWV9TSElGVCkgfAorICAgICAgICAgICAgICAgIChFMTAwMF9NRElDX09QX1JFQUQpKTsKKworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIE1ESUMsIG1kaWMpOworCisgICAgICAgIC8qIFBvbGwgdGhlIHJlYWR5IGJpdCB0byBzZWUgaWYgdGhlIE1ESSByZWFkIGNvbXBsZXRlZCAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgICAgICB1ZGVsYXkoNTApOworICAgICAgICAgICAgbWRpYyA9IEUxMDAwX1JFQURfUkVHKGh3LCBNRElDKTsKKyAgICAgICAgICAgIGlmKG1kaWMgJiBFMTAwMF9NRElDX1JFQURZKSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZighKG1kaWMgJiBFMTAwMF9NRElDX1JFQURZKSkgeworICAgICAgICAgICAgREVCVUdPVVQoIk1ESSBSZWFkIGRpZCBub3QgY29tcGxldGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUEhZOworICAgICAgICB9CisgICAgICAgIGlmKG1kaWMgJiBFMTAwMF9NRElDX0VSUk9SKSB7CisgICAgICAgICAgICBERUJVR09VVCgiTURJIEVycm9yXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1BIWTsKKyAgICAgICAgfQorICAgICAgICAqcGh5X2RhdGEgPSAodWludDE2X3QpIG1kaWM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogV2UgbXVzdCBmaXJzdCBzZW5kIGEgcHJlYW1ibGUgdGhyb3VnaCB0aGUgTURJTyBwaW4gdG8gc2lnbmFsIHRoZQorICAgICAgICAgKiBiZWdpbm5pbmcgb2YgYW4gTUlJIGluc3RydWN0aW9uLiAgVGhpcyBpcyBkb25lIGJ5IHNlbmRpbmcgMzIKKyAgICAgICAgICogY29uc2VjdXRpdmUgIjEiIGJpdHMuCisgICAgICAgICAqLworICAgICAgICBlMTAwMF9zaGlmdF9vdXRfbWRpX2JpdHMoaHcsIFBIWV9QUkVBTUJMRSwgUEhZX1BSRUFNQkxFX1NJWkUpOworCisgICAgICAgIC8qIE5vdyBjb21iaW5lIHRoZSBuZXh0IGZldyBmaWVsZHMgdGhhdCBhcmUgcmVxdWlyZWQgZm9yIGEgcmVhZAorICAgICAgICAgKiBvcGVyYXRpb24uICBXZSB1c2UgdGhpcyBtZXRob2QgaW5zdGVhZCBvZiBjYWxsaW5nIHRoZQorICAgICAgICAgKiBlMTAwMF9zaGlmdF9vdXRfbWRpX2JpdHMgcm91dGluZSBmaXZlIGRpZmZlcmVudCB0aW1lcy4gVGhlIGZvcm1hdCBvZgorICAgICAgICAgKiBhIE1JSSByZWFkIGluc3RydWN0aW9uIGNvbnNpc3RzIG9mIGEgc2hpZnQgb3V0IG9mIDE0IGJpdHMgYW5kIGlzCisgICAgICAgICAqIGRlZmluZWQgYXMgZm9sbG93czoKKyAgICAgICAgICogICAgPFByZWFtYmxlPjxTT0Y+PE9wIENvZGU+PFBoeSBBZGRyPjxSZWcgQWRkcj4KKyAgICAgICAgICogZm9sbG93ZWQgYnkgYSBzaGlmdCBpbiBvZiAxOCBiaXRzLiAgVGhpcyBmaXJzdCB0d28gYml0cyBzaGlmdGVkIGluCisgICAgICAgICAqIGFyZSBUdXJuQXJvdW5kIGJpdHMgdXNlZCB0byBhdm9pZCBjb250ZW50aW9uIG9uIHRoZSBNRElPIHBpbiB3aGVuIGEKKyAgICAgICAgICogUkVBRCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkLiAgVGhlc2UgdHdvIGJpdHMgYXJlIHRocm93biBhd2F5CisgICAgICAgICAqIGZvbGxvd2VkIGJ5IGEgc2hpZnQgaW4gb2YgMTYgYml0cyB3aGljaCBjb250YWlucyB0aGUgZGVzaXJlZCBkYXRhLgorICAgICAgICAgKi8KKyAgICAgICAgbWRpYyA9ICgocmVnX2FkZHIpIHwgKHBoeV9hZGRyIDw8IDUpIHwKKyAgICAgICAgICAgICAgICAoUEhZX09QX1JFQUQgPDwgMTApIHwgKFBIWV9TT0YgPDwgMTIpKTsKKworICAgICAgICBlMTAwMF9zaGlmdF9vdXRfbWRpX2JpdHMoaHcsIG1kaWMsIDE0KTsKKworICAgICAgICAvKiBOb3cgdGhhdCB3ZSd2ZSBzaGlmdGVkIG91dCB0aGUgcmVhZCBjb21tYW5kIHRvIHRoZSBNSUksIHdlIG5lZWQgdG8KKyAgICAgICAgICogInNoaWZ0IGluIiB0aGUgMTYtYml0IHZhbHVlICgxOCB0b3RhbCBiaXRzKSBvZiB0aGUgcmVxdWVzdGVkIFBIWQorICAgICAgICAgKiByZWdpc3RlciBhZGRyZXNzLgorICAgICAgICAgKi8KKyAgICAgICAgKnBoeV9kYXRhID0gZTEwMDBfc2hpZnRfaW5fbWRpX2JpdHMoaHcpOworICAgIH0KKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBXcml0ZXMgYSB2YWx1ZSB0byBhIFBIWSByZWdpc3RlcgorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKiByZWdfYWRkciAtIGFkZHJlc3Mgb2YgdGhlIFBIWSByZWdpc3RlciB0byB3cml0ZQorKiBkYXRhIC0gZGF0YSB0byB3cml0ZSB0byB0aGUgUEhZCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF93cml0ZV9waHlfcmVnKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlZ19hZGRyLAorICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBwaHlfZGF0YSkKK3sKKyAgICB1aW50MzJfdCByZXRfdmFsOworCisgICAgREVCVUdGVU5DKCJlMTAwMF93cml0ZV9waHlfcmVnIik7CisKKworICAgIGlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwICYmCisgICAgICAgKHJlZ19hZGRyID4gTUFYX1BIWV9NVUxUSV9QQUdFX1JFRykpIHsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWdfZXgoaHcsIElHUDAxRTEwMDBfUEhZX1BBR0VfU0VMRUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpcmVnX2FkZHIpOworICAgICAgICBpZihyZXRfdmFsKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnX2V4KGh3LCBNQVhfUEhZX1JFR19BRERSRVNTICYgcmVnX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEpOworCisgICAgcmV0dXJuIHJldF92YWw7Cit9CisKK2ludDMyX3QKK2UxMDAwX3dyaXRlX3BoeV9yZWdfZXgoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVnX2FkZHIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHBoeV9kYXRhKQoreworICAgIHVpbnQzMl90IGk7CisgICAgdWludDMyX3QgbWRpYyA9IDA7CisgICAgY29uc3QgdWludDMyX3QgcGh5X2FkZHIgPSAxOworCisgICAgREVCVUdGVU5DKCJlMTAwMF93cml0ZV9waHlfcmVnX2V4Iik7CisKKyAgICBpZihyZWdfYWRkciA+IE1BWF9QSFlfUkVHX0FERFJFU1MpIHsKKyAgICAgICAgREVCVUdPVVQxKCJQSFkgQWRkcmVzcyAlZCBpcyBvdXQgb2YgcmFuZ2VcbiIsIHJlZ19hZGRyKTsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfUEFSQU07CisgICAgfQorCisgICAgaWYoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDMpIHsKKyAgICAgICAgLyogU2V0IHVwIE9wLWNvZGUsIFBoeSBBZGRyZXNzLCByZWdpc3RlciBhZGRyZXNzLCBhbmQgZGF0YSBpbnRlbmRlZAorICAgICAgICAgKiBmb3IgdGhlIFBIWSByZWdpc3RlciBpbiB0aGUgTURJIENvbnRyb2wgcmVnaXN0ZXIuICBUaGUgTUFDIHdpbGwgdGFrZQorICAgICAgICAgKiBjYXJlIG9mIGludGVyZmFjaW5nIHdpdGggdGhlIFBIWSB0byBzZW5kIHRoZSBkZXNpcmVkIGRhdGEuCisgICAgICAgICAqLworICAgICAgICBtZGljID0gKCgodWludDMyX3QpIHBoeV9kYXRhKSB8CisgICAgICAgICAgICAgICAgKHJlZ19hZGRyIDw8IEUxMDAwX01ESUNfUkVHX1NISUZUKSB8CisgICAgICAgICAgICAgICAgKHBoeV9hZGRyIDw8IEUxMDAwX01ESUNfUEhZX1NISUZUKSB8CisgICAgICAgICAgICAgICAgKEUxMDAwX01ESUNfT1BfV1JJVEUpKTsKKworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIE1ESUMsIG1kaWMpOworCisgICAgICAgIC8qIFBvbGwgdGhlIHJlYWR5IGJpdCB0byBzZWUgaWYgdGhlIE1ESSByZWFkIGNvbXBsZXRlZCAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCA2NDA7IGkrKykgeworICAgICAgICAgICAgdWRlbGF5KDUpOworICAgICAgICAgICAgbWRpYyA9IEUxMDAwX1JFQURfUkVHKGh3LCBNRElDKTsKKyAgICAgICAgICAgIGlmKG1kaWMgJiBFMTAwMF9NRElDX1JFQURZKSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZighKG1kaWMgJiBFMTAwMF9NRElDX1JFQURZKSkgeworICAgICAgICAgICAgREVCVUdPVVQoIk1ESSBXcml0ZSBkaWQgbm90IGNvbXBsZXRlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX1BIWTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFdlJ2xsIG5lZWQgdG8gdXNlIHRoZSBTVyBkZWZpbmVkIHBpbnMgdG8gc2hpZnQgdGhlIHdyaXRlIGNvbW1hbmQKKyAgICAgICAgICogb3V0IHRvIHRoZSBQSFkuIFdlIGZpcnN0IHNlbmQgYSBwcmVhbWJsZSB0byB0aGUgUEhZIHRvIHNpZ25hbCB0aGUKKyAgICAgICAgICogYmVnaW5uaW5nIG9mIHRoZSBNSUkgaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGRvbmUgYnkgc2VuZGluZyAzMgorICAgICAgICAgKiBjb25zZWN1dGl2ZSAiMSIgYml0cy4KKyAgICAgICAgICovCisgICAgICAgIGUxMDAwX3NoaWZ0X291dF9tZGlfYml0cyhodywgUEhZX1BSRUFNQkxFLCBQSFlfUFJFQU1CTEVfU0laRSk7CisKKyAgICAgICAgLyogTm93IGNvbWJpbmUgdGhlIHJlbWFpbmluZyByZXF1aXJlZCBmaWVsZHMgdGhhdCB3aWxsIGluZGljYXRlIGEKKyAgICAgICAgICogd3JpdGUgb3BlcmF0aW9uLiBXZSB1c2UgdGhpcyBtZXRob2QgaW5zdGVhZCBvZiBjYWxsaW5nIHRoZQorICAgICAgICAgKiBlMTAwMF9zaGlmdF9vdXRfbWRpX2JpdHMgcm91dGluZSBmb3IgZWFjaCBmaWVsZCBpbiB0aGUgY29tbWFuZC4gVGhlCisgICAgICAgICAqIGZvcm1hdCBvZiBhIE1JSSB3cml0ZSBpbnN0cnVjdGlvbiBpcyBhcyBmb2xsb3dzOgorICAgICAgICAgKiA8UHJlYW1ibGU+PFNPRj48T3AgQ29kZT48UGh5IEFkZHI+PFJlZyBBZGRyPjxUdXJuYXJvdW5kPjxEYXRhPi4KKyAgICAgICAgICovCisgICAgICAgIG1kaWMgPSAoKFBIWV9UVVJOQVJPVU5EKSB8IChyZWdfYWRkciA8PCAyKSB8IChwaHlfYWRkciA8PCA3KSB8CisgICAgICAgICAgICAgICAgKFBIWV9PUF9XUklURSA8PCAxMikgfCAoUEhZX1NPRiA8PCAxNCkpOworICAgICAgICBtZGljIDw8PSAxNjsKKyAgICAgICAgbWRpYyB8PSAodWludDMyX3QpIHBoeV9kYXRhOworCisgICAgICAgIGUxMDAwX3NoaWZ0X291dF9tZGlfYml0cyhodywgbWRpYywgMzIpOworICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFJldHVybnMgdGhlIFBIWSB0byB0aGUgcG93ZXItb24gcmVzZXQgc3RhdGUKKyoKKyogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2UxMDAwX3BoeV9od19yZXNldChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IGN0cmwsIGN0cmxfZXh0OworICAgIHVpbnQzMl90IGxlZF9jdHJsOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9waHlfaHdfcmVzZXQiKTsKKworICAgIERFQlVHT1VUKCJSZXNldHRpbmcgUGh5Li4uXG4iKTsKKworICAgIGlmKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQzKSB7CisgICAgICAgIC8qIFJlYWQgdGhlIGRldmljZSBjb250cm9sIHJlZ2lzdGVyIGFuZCBhc3NlcnQgdGhlIEUxMDAwX0NUUkxfUEhZX1JTVAorICAgICAgICAgKiBiaXQuIFRoZW4sIHRha2UgaXQgb3V0IG9mIHJlc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgY3RybCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDVFJMKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsIHwgRTEwMDBfQ1RSTF9QSFlfUlNUKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgICAgICBtc2VjX2RlbGF5KDEwKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFJlYWQgdGhlIEV4dGVuZGVkIERldmljZSBDb250cm9sIFJlZ2lzdGVyLCBhc3NlcnQgdGhlIFBIWV9SRVNFVF9ESVIKKyAgICAgICAgICogYml0IHRvIHB1dCB0aGUgUEhZIGludG8gcmVzZXQuIFRoZW4sIHRha2UgaXQgb3V0IG9mIHJlc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgY3RybF9leHQgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1RSTF9FWFQpOworICAgICAgICBjdHJsX2V4dCB8PSBFMTAwMF9DVFJMX0VYVF9TRFA0X0RJUjsKKyAgICAgICAgY3RybF9leHQgJj0gfkUxMDAwX0NUUkxfRVhUX1NEUDRfREFUQTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMX0VYVCwgY3RybF9leHQpOworICAgICAgICBFMTAwMF9XUklURV9GTFVTSChodyk7CisgICAgICAgIG1zZWNfZGVsYXkoMTApOworICAgICAgICBjdHJsX2V4dCB8PSBFMTAwMF9DVFJMX0VYVF9TRFA0X0RBVEE7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTF9FWFQsIGN0cmxfZXh0KTsKKyAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgIH0KKyAgICB1ZGVsYXkoMTUwKTsKKworICAgIGlmKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDEpIHx8IChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSB7CisgICAgICAgIC8qIENvbmZpZ3VyZSBhY3Rpdml0eSBMRUQgYWZ0ZXIgUEhZIHJlc2V0ICovCisgICAgICAgIGxlZF9jdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIExFRENUTCk7CisgICAgICAgIGxlZF9jdHJsICY9IElHUF9BQ1RJVklUWV9MRURfTUFTSzsKKyAgICAgICAgbGVkX2N0cmwgfD0gKElHUF9BQ1RJVklUWV9MRURfRU5BQkxFIHwgSUdQX0xFRDNfTU9ERSk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgTEVEQ1RMLCBsZWRfY3RybCk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFJlc2V0cyB0aGUgUEhZCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqCisqIFNldHMgYml0IDE1IG9mIHRoZSBNSUkgQ29udHJvbCByZWdpc2VyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9waHlfcmVzZXQoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3QgcGh5X2RhdGE7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3BoeV9yZXNldCIpOworCisgICAgaWYoaHctPm1hY190eXBlICE9IGUxMDAwXzgyNTQxX3Jldl8yKSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9DVFJMLCAmcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgcGh5X2RhdGEgfD0gTUlJX0NSX1JFU0VUOworICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgUEhZX0NUUkwsIHBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIHVkZWxheSgxKTsKKyAgICB9IGVsc2UgZTEwMDBfcGh5X2h3X3Jlc2V0KGh3KTsKKworICAgIGlmKGh3LT5waHlfdHlwZSA9PSBlMTAwMF9waHlfaWdwKQorICAgICAgICBlMTAwMF9waHlfaW5pdF9zY3JpcHQoaHcpOworCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUHJvYmVzIHRoZSBleHBlY3RlZCBQSFkgYWRkcmVzcyBmb3Iga25vd24gUEhZIElEcworKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfZGV0ZWN0X2dpZ19waHkoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBpbnQzMl90IHBoeV9pbml0X3N0YXR1cywgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfaWRfaGlnaCwgcGh5X2lkX2xvdzsKKyAgICBib29sZWFuX3QgbWF0Y2ggPSBGQUxTRTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfZGV0ZWN0X2dpZ19waHkiKTsKKworICAgIC8qIFJlYWQgdGhlIFBIWSBJRCBSZWdpc3RlcnMgdG8gaWRlbnRpZnkgd2hpY2ggUEhZIGlzIG9uYm9hcmQuICovCisgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX0lEMSwgJnBoeV9pZF9oaWdoKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIGh3LT5waHlfaWQgPSAodWludDMyX3QpIChwaHlfaWRfaGlnaCA8PCAxNik7CisgICAgdWRlbGF5KDIwKTsKKyAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfSUQyLCAmcGh5X2lkX2xvdyk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICBody0+cGh5X2lkIHw9ICh1aW50MzJfdCkgKHBoeV9pZF9sb3cgJiBQSFlfUkVWSVNJT05fTUFTSyk7CisgICAgaHctPnBoeV9yZXZpc2lvbiA9ICh1aW50MzJfdCkgcGh5X2lkX2xvdyAmIH5QSFlfUkVWSVNJT05fTUFTSzsKKworICAgIHN3aXRjaChody0+bWFjX3R5cGUpIHsKKyAgICBjYXNlIGUxMDAwXzgyNTQzOgorICAgICAgICBpZihody0+cGh5X2lkID09IE04OEUxMDAwX0VfUEhZX0lEKSBtYXRjaCA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfODI1NDQ6CisgICAgICAgIGlmKGh3LT5waHlfaWQgPT0gTTg4RTEwMDBfSV9QSFlfSUQpIG1hdGNoID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBlMTAwMF84MjU0MDoKKyAgICBjYXNlIGUxMDAwXzgyNTQ1OgorICAgIGNhc2UgZTEwMDBfODI1NDVfcmV2XzM6CisgICAgY2FzZSBlMTAwMF84MjU0NjoKKyAgICBjYXNlIGUxMDAwXzgyNTQ2X3Jldl8zOgorICAgICAgICBpZihody0+cGh5X2lkID09IE04OEUxMDExX0lfUEhZX0lEKSBtYXRjaCA9IFRSVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfODI1NDE6CisgICAgY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKKyAgICBjYXNlIGUxMDAwXzgyNTQ3OgorICAgIGNhc2UgZTEwMDBfODI1NDdfcmV2XzI6CisgICAgICAgIGlmKGh3LT5waHlfaWQgPT0gSUdQMDFFMTAwMF9JX1BIWV9JRCkgbWF0Y2ggPSBUUlVFOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBERUJVR09VVDEoIkludmFsaWQgTUFDIHR5cGUgJWRcbiIsIGh3LT5tYWNfdHlwZSk7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKyAgICB9CisgICAgcGh5X2luaXRfc3RhdHVzID0gZTEwMDBfc2V0X3BoeV90eXBlKGh3KTsKKworICAgIGlmICgobWF0Y2gpICYmIChwaHlfaW5pdF9zdGF0dXMgPT0gRTEwMDBfU1VDQ0VTUykpIHsKKyAgICAgICAgREVCVUdPVVQxKCJQSFkgSUQgMHglWCBkZXRlY3RlZFxuIiwgaHctPnBoeV9pZCk7CisgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworICAgIH0KKyAgICBERUJVR09VVDEoIkludmFsaWQgUEhZIElEIDB4JVhcbiIsIGh3LT5waHlfaWQpOworICAgIHJldHVybiAtRTEwMDBfRVJSX1BIWTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBSZXNldHMgdGhlIFBIWSdzIERTUAorKgorKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX3BoeV9yZXNldF9kc3Aoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgREVCVUdGVU5DKCJlMTAwMF9waHlfcmVzZXRfZHNwIik7CisKKyAgICBkbyB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAyOSwgMHgwMDFkKTsKKyAgICAgICAgaWYocmV0X3ZhbCkgYnJlYWs7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAzMCwgMHgwMGMxKTsKKyAgICAgICAgaWYocmV0X3ZhbCkgYnJlYWs7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAzMCwgMHgwMDAwKTsKKyAgICAgICAgaWYocmV0X3ZhbCkgYnJlYWs7CisgICAgICAgIHJldF92YWwgPSBFMTAwMF9TVUNDRVNTOworICAgIH0gd2hpbGUoMCk7CisKKyAgICByZXR1cm4gcmV0X3ZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBHZXQgUEhZIGluZm9ybWF0aW9uIGZyb20gdmFyaW91cyBQSFkgcmVnaXN0ZXJzIGZvciBpZ3AgUEhZIG9ubHkuCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqIHBoeV9pbmZvIC0gUEhZIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfcGh5X2lncF9nZXRfaW5mbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZTEwMDBfcGh5X2luZm8gKnBoeV9pbmZvKQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YSwgcG9sYXJpdHksIG1pbl9sZW5ndGgsIG1heF9sZW5ndGgsIGF2ZXJhZ2U7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3BoeV9pZ3BfZ2V0X2luZm8iKTsKKworICAgIC8qIFRoZSBkb3duc2hpZnQgc3RhdHVzIGlzIGNoZWNrZWQgb25seSBvbmNlLCBhZnRlciBsaW5rIGlzIGVzdGFibGlzaGVkLAorICAgICAqIGFuZCBpdCBzdG9yZWQgaW4gdGhlIGh3LT5zcGVlZF9kb3duZ3JhZGVkIHBhcmFtZXRlci4gKi8KKyAgICBwaHlfaW5mby0+ZG93bnNoaWZ0ID0gaHctPnNwZWVkX2Rvd25ncmFkZWQ7CisKKyAgICAvKiBJR1AwMUUxMDAwIGRvZXMgbm90IG5lZWQgdG8gc3VwcG9ydCBpdC4gKi8KKyAgICBwaHlfaW5mby0+ZXh0ZW5kZWRfMTBidF9kaXN0YW5jZSA9IGUxMDAwXzEwYnRfZXh0X2Rpc3RfZW5hYmxlX25vcm1hbDsKKworICAgIC8qIElHUDAxRTEwMDAgYWx3YXlzIGNvcnJlY3QgcG9sYXJpdHkgcmV2ZXJzYWwgKi8KKyAgICBwaHlfaW5mby0+cG9sYXJpdHlfY29ycmVjdGlvbiA9IGUxMDAwX3BvbGFyaXR5X3JldmVyc2FsX2VuYWJsZWQ7CisKKyAgICAvKiBDaGVjayBwb2xhcml0eSBzdGF0dXMgKi8KKyAgICByZXRfdmFsID0gZTEwMDBfY2hlY2tfcG9sYXJpdHkoaHcsICZwb2xhcml0eSk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICBwaHlfaW5mby0+Y2FibGVfcG9sYXJpdHkgPSBwb2xhcml0eTsKKworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfU1RBVFVTLCAmcGh5X2RhdGEpOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgcGh5X2luZm8tPm1kaXhfbW9kZSA9IChwaHlfZGF0YSAmIElHUDAxRTEwMDBfUFNTUl9NRElYKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX1BTU1JfTURJWF9TSElGVDsKKworICAgIGlmKChwaHlfZGF0YSAmIElHUDAxRTEwMDBfUFNTUl9TUEVFRF9NQVNLKSA9PQorICAgICAgIElHUDAxRTEwMDBfUFNTUl9TUEVFRF8xMDAwTUJQUykgeworICAgICAgICAvKiBMb2NhbC9SZW1vdGUgUmVjZWl2ZXIgSW5mb3JtYXRpb24gYXJlIG9ubHkgdmFsaWQgYXQgMTAwMCBNYnBzICovCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV8xMDAwVF9TVEFUVVMsICZwaHlfZGF0YSk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICBwaHlfaW5mby0+bG9jYWxfcnggPSAocGh5X2RhdGEgJiBTUl8xMDAwVF9MT0NBTF9SWF9TVEFUVVMpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNSXzEwMDBUX0xPQ0FMX1JYX1NUQVRVU19TSElGVDsKKyAgICAgICAgcGh5X2luZm8tPnJlbW90ZV9yeCA9IChwaHlfZGF0YSAmIFNSXzEwMDBUX1JFTU9URV9SWF9TVEFUVVMpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUl8xMDAwVF9SRU1PVEVfUlhfU1RBVFVTX1NISUZUOworCisgICAgICAgIC8qIEdldCBjYWJsZSBsZW5ndGggKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX2dldF9jYWJsZV9sZW5ndGgoaHcsICZtaW5fbGVuZ3RoLCAmbWF4X2xlbmd0aCk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAvKiB0cmFuc2FsdGUgdG8gb2xkIG1ldGhvZCAqLworICAgICAgICBhdmVyYWdlID0gKG1heF9sZW5ndGggKyBtaW5fbGVuZ3RoKSAvIDI7CisKKyAgICAgICAgaWYoYXZlcmFnZSA8PSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzUwKQorICAgICAgICAgICAgcGh5X2luZm8tPmNhYmxlX2xlbmd0aCA9IGUxMDAwX2NhYmxlX2xlbmd0aF81MDsKKyAgICAgICAgZWxzZSBpZihhdmVyYWdlIDw9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfODApCisgICAgICAgICAgICBwaHlfaW5mby0+Y2FibGVfbGVuZ3RoID0gZTEwMDBfY2FibGVfbGVuZ3RoXzUwXzgwOworICAgICAgICBlbHNlIGlmKGF2ZXJhZ2UgPD0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xMTApCisgICAgICAgICAgICBwaHlfaW5mby0+Y2FibGVfbGVuZ3RoID0gZTEwMDBfY2FibGVfbGVuZ3RoXzgwXzExMDsKKyAgICAgICAgZWxzZSBpZihhdmVyYWdlIDw9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTQwKQorICAgICAgICAgICAgcGh5X2luZm8tPmNhYmxlX2xlbmd0aCA9IGUxMDAwX2NhYmxlX2xlbmd0aF8xMTBfMTQwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwaHlfaW5mby0+Y2FibGVfbGVuZ3RoID0gZTEwMDBfY2FibGVfbGVuZ3RoXzE0MDsKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBHZXQgUEhZIGluZm9ybWF0aW9uIGZyb20gdmFyaW91cyBQSFkgcmVnaXN0ZXJzIGZvdCBtODggUEhZIG9ubHkuCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqIHBoeV9pbmZvIC0gUEhZIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfcGh5X204OF9nZXRfaW5mbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZTEwMDBfcGh5X2luZm8gKnBoeV9pbmZvKQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YSwgcG9sYXJpdHk7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3BoeV9tODhfZ2V0X2luZm8iKTsKKworICAgIC8qIFRoZSBkb3duc2hpZnQgc3RhdHVzIGlzIGNoZWNrZWQgb25seSBvbmNlLCBhZnRlciBsaW5rIGlzIGVzdGFibGlzaGVkLAorICAgICAqIGFuZCBpdCBzdG9yZWQgaW4gdGhlIGh3LT5zcGVlZF9kb3duZ3JhZGVkIHBhcmFtZXRlci4gKi8KKyAgICBwaHlfaW5mby0+ZG93bnNoaWZ0ID0gaHctPnNwZWVkX2Rvd25ncmFkZWQ7CisKKyAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19DVFJMLCAmcGh5X2RhdGEpOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgcGh5X2luZm8tPmV4dGVuZGVkXzEwYnRfZGlzdGFuY2UgPQorICAgICAgICAocGh5X2RhdGEgJiBNODhFMTAwMF9QU0NSXzEwQlRfRVhUX0RJU1RfRU5BQkxFKSA+PgorICAgICAgICBNODhFMTAwMF9QU0NSXzEwQlRfRVhUX0RJU1RfRU5BQkxFX1NISUZUOworICAgIHBoeV9pbmZvLT5wb2xhcml0eV9jb3JyZWN0aW9uID0KKyAgICAgICAgKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNDUl9QT0xBUklUWV9SRVZFUlNBTCkgPj4KKyAgICAgICAgTTg4RTEwMDBfUFNDUl9QT0xBUklUWV9SRVZFUlNBTF9TSElGVDsKKworICAgIC8qIENoZWNrIHBvbGFyaXR5IHN0YXR1cyAqLworICAgIHJldF92YWwgPSBlMTAwMF9jaGVja19wb2xhcml0eShodywgJnBvbGFyaXR5KTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsgCisgICAgcGh5X2luZm8tPmNhYmxlX3BvbGFyaXR5ID0gcG9sYXJpdHk7CisKKyAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19TVEFUVVMsICZwaHlfZGF0YSk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICBwaHlfaW5mby0+bWRpeF9tb2RlID0gKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9NRElYKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICBNODhFMTAwMF9QU1NSX01ESVhfU0hJRlQ7CisKKyAgICBpZiAoKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9TUEVFRCkgPT0gTTg4RTEwMDBfUFNTUl8xMDAwTUJTKSB7CisgICAgICAgIC8qIENhYmxlIExlbmd0aCBFc3RpbWF0aW9uIGFuZCBMb2NhbC9SZW1vdGUgUmVjZWl2ZXIgSW5mb3JtYXRpb24KKyAgICAgICAgICogYXJlIG9ubHkgdmFsaWQgYXQgMTAwMCBNYnBzLgorICAgICAgICAgKi8KKyAgICAgICAgcGh5X2luZm8tPmNhYmxlX2xlbmd0aCA9ICgocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX0NBQkxFX0xFTkdUSCkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNODhFMTAwMF9QU1NSX0NBQkxFX0xFTkdUSF9TSElGVCk7CisKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZXzEwMDBUX1NUQVRVUywgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIHBoeV9pbmZvLT5sb2NhbF9yeCA9IChwaHlfZGF0YSAmIFNSXzEwMDBUX0xPQ0FMX1JYX1NUQVRVUykgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1JfMTAwMFRfTE9DQUxfUlhfU1RBVFVTX1NISUZUOworCisgICAgICAgIHBoeV9pbmZvLT5yZW1vdGVfcnggPSAocGh5X2RhdGEgJiBTUl8xMDAwVF9SRU1PVEVfUlhfU1RBVFVTKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1JfMTAwMFRfUkVNT1RFX1JYX1NUQVRVU19TSElGVDsKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBHZXQgUEhZIGluZm9ybWF0aW9uIGZyb20gdmFyaW91cyBQSFkgcmVnaXN0ZXJzCisqCisqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisqIHBoeV9pbmZvIC0gUEhZIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfcGh5X2dldF9pbmZvKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IGUxMDAwX3BoeV9pbmZvICpwaHlfaW5mbykKK3sKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3QgcGh5X2RhdGE7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3BoeV9nZXRfaW5mbyIpOworCisgICAgcGh5X2luZm8tPmNhYmxlX2xlbmd0aCA9IGUxMDAwX2NhYmxlX2xlbmd0aF91bmRlZmluZWQ7CisgICAgcGh5X2luZm8tPmV4dGVuZGVkXzEwYnRfZGlzdGFuY2UgPSBlMTAwMF8xMGJ0X2V4dF9kaXN0X2VuYWJsZV91bmRlZmluZWQ7CisgICAgcGh5X2luZm8tPmNhYmxlX3BvbGFyaXR5ID0gZTEwMDBfcmV2X3BvbGFyaXR5X3VuZGVmaW5lZDsKKyAgICBwaHlfaW5mby0+ZG93bnNoaWZ0ID0gZTEwMDBfZG93bnNoaWZ0X3VuZGVmaW5lZDsKKyAgICBwaHlfaW5mby0+cG9sYXJpdHlfY29ycmVjdGlvbiA9IGUxMDAwX3BvbGFyaXR5X3JldmVyc2FsX3VuZGVmaW5lZDsKKyAgICBwaHlfaW5mby0+bWRpeF9tb2RlID0gZTEwMDBfYXV0b194X21vZGVfdW5kZWZpbmVkOworICAgIHBoeV9pbmZvLT5sb2NhbF9yeCA9IGUxMDAwXzEwMDB0X3J4X3N0YXR1c191bmRlZmluZWQ7CisgICAgcGh5X2luZm8tPnJlbW90ZV9yeCA9IGUxMDAwXzEwMDB0X3J4X3N0YXR1c191bmRlZmluZWQ7CisKKyAgICBpZihody0+bWVkaWFfdHlwZSAhPSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgeworICAgICAgICBERUJVR09VVCgiUEhZIGluZm8gaXMgb25seSB2YWxpZCBmb3IgY29wcGVyIG1lZGlhXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfQ09ORklHOworICAgIH0KKworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZwaHlfZGF0YSk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmcGh5X2RhdGEpOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgaWYoKHBoeV9kYXRhICYgTUlJX1NSX0xJTktfU1RBVFVTKSAhPSBNSUlfU1JfTElOS19TVEFUVVMpIHsKKyAgICAgICAgREVCVUdPVVQoIlBIWSBpbmZvIGlzIG9ubHkgdmFsaWQgaWYgbGluayBpcyB1cFxuIik7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKyAgICB9CisKKyAgICBpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkKKyAgICAgICAgcmV0dXJuIGUxMDAwX3BoeV9pZ3BfZ2V0X2luZm8oaHcsIHBoeV9pbmZvKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBlMTAwMF9waHlfbTg4X2dldF9pbmZvKGh3LCBwaHlfaW5mbyk7Cit9CisKK2ludDMyX3QKK2UxMDAwX3ZhbGlkYXRlX21kaV9zZXR0aW5nKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgREVCVUdGVU5DKCJlMTAwMF92YWxpZGF0ZV9tZGlfc2V0dGluZ3MiKTsKKworICAgIGlmKCFody0+YXV0b25lZyAmJiAoaHctPm1kaXggPT0gMCB8fCBody0+bWRpeCA9PSAzKSkgeworICAgICAgICBERUJVR09VVCgiSW52YWxpZCBNREkgc2V0dGluZyBkZXRlY3RlZFxuIik7CisgICAgICAgIGh3LT5tZGl4ID0gMTsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfQ09ORklHOworICAgIH0KKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTZXRzIHVwIGVlcHJvbSB2YXJpYWJsZXMgaW4gdGhlIGh3IHN0cnVjdC4gIE11c3QgYmUgY2FsbGVkIGFmdGVyIG1hY190eXBlCisgKiBpcyBjb25maWd1cmVkLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitlMTAwMF9pbml0X2VlcHJvbV9wYXJhbXMoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gKmVlcHJvbSA9ICZody0+ZWVwcm9tOworICAgIHVpbnQzMl90IGVlY2QgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVDRCk7CisgICAgdWludDE2X3QgZWVwcm9tX3NpemU7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2luaXRfZWVwcm9tX3BhcmFtcyIpOworCisgICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKKyAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMDoKKyAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMToKKyAgICBjYXNlIGUxMDAwXzgyNTQzOgorICAgIGNhc2UgZTEwMDBfODI1NDQ6CisgICAgICAgIGVlcHJvbS0+dHlwZSA9IGUxMDAwX2VlcHJvbV9taWNyb3dpcmU7CisgICAgICAgIGVlcHJvbS0+d29yZF9zaXplID0gNjQ7CisgICAgICAgIGVlcHJvbS0+b3Bjb2RlX2JpdHMgPSAzOworICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyA9IDY7CisgICAgICAgIGVlcHJvbS0+ZGVsYXlfdXNlYyA9IDUwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGUxMDAwXzgyNTQwOgorICAgIGNhc2UgZTEwMDBfODI1NDU6CisgICAgY2FzZSBlMTAwMF84MjU0NV9yZXZfMzoKKyAgICBjYXNlIGUxMDAwXzgyNTQ2OgorICAgIGNhc2UgZTEwMDBfODI1NDZfcmV2XzM6CisgICAgICAgIGVlcHJvbS0+dHlwZSA9IGUxMDAwX2VlcHJvbV9taWNyb3dpcmU7CisgICAgICAgIGVlcHJvbS0+b3Bjb2RlX2JpdHMgPSAzOworICAgICAgICBlZXByb20tPmRlbGF5X3VzZWMgPSA1MDsKKyAgICAgICAgaWYoZWVjZCAmIEUxMDAwX0VFQ0RfU0laRSkgeworICAgICAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSAyNTY7CisgICAgICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyA9IDg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlZXByb20tPndvcmRfc2l6ZSA9IDY0OworICAgICAgICAgICAgZWVwcm9tLT5hZGRyZXNzX2JpdHMgPSA2OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfODI1NDE6CisgICAgY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKKyAgICBjYXNlIGUxMDAwXzgyNTQ3OgorICAgIGNhc2UgZTEwMDBfODI1NDdfcmV2XzI6CisgICAgICAgIGlmIChlZWNkICYgRTEwMDBfRUVDRF9UWVBFKSB7CisgICAgICAgICAgICBlZXByb20tPnR5cGUgPSBlMTAwMF9lZXByb21fc3BpOworICAgICAgICAgICAgZWVwcm9tLT5vcGNvZGVfYml0cyA9IDg7CisgICAgICAgICAgICBlZXByb20tPmRlbGF5X3VzZWMgPSAxOworICAgICAgICAgICAgaWYgKGVlY2QgJiBFMTAwMF9FRUNEX0FERFJfQklUUykgeworICAgICAgICAgICAgICAgIGVlcHJvbS0+cGFnZV9zaXplID0gMzI7CisgICAgICAgICAgICAgICAgZWVwcm9tLT5hZGRyZXNzX2JpdHMgPSAxNjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZWVwcm9tLT5wYWdlX3NpemUgPSA4OworICAgICAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzID0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVlcHJvbS0+dHlwZSA9IGUxMDAwX2VlcHJvbV9taWNyb3dpcmU7CisgICAgICAgICAgICBlZXByb20tPm9wY29kZV9iaXRzID0gMzsKKyAgICAgICAgICAgIGVlcHJvbS0+ZGVsYXlfdXNlYyA9IDUwOworICAgICAgICAgICAgaWYgKGVlY2QgJiBFMTAwMF9FRUNEX0FERFJfQklUUykgeworICAgICAgICAgICAgICAgIGVlcHJvbS0+d29yZF9zaXplID0gMjU2OworICAgICAgICAgICAgICAgIGVlcHJvbS0+YWRkcmVzc19iaXRzID0gODsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSA2NDsKKyAgICAgICAgICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyA9IDY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fc3BpKSB7CisgICAgICAgIGVlcHJvbS0+d29yZF9zaXplID0gNjQ7CisgICAgICAgIGlmIChlMTAwMF9yZWFkX2VlcHJvbShodywgRUVQUk9NX0NGRywgMSwgJmVlcHJvbV9zaXplKSA9PSAwKSB7CisgICAgICAgICAgICBlZXByb21fc2l6ZSAmPSBFRVBST01fU0laRV9NQVNLOworCisgICAgICAgICAgICBzd2l0Y2ggKGVlcHJvbV9zaXplKSB7CisgICAgICAgICAgICBjYXNlIEVFUFJPTV9TSVpFXzE2S0I6CisgICAgICAgICAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSA4MTkyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFRVBST01fU0laRV84S0I6CisgICAgICAgICAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSA0MDk2OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFRVBST01fU0laRV80S0I6CisgICAgICAgICAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSAyMDQ4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFRVBST01fU0laRV8yS0I6CisgICAgICAgICAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSAxMDI0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFRVBST01fU0laRV8xS0I6CisgICAgICAgICAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSA1MTI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVFUFJPTV9TSVpFXzUxMkI6CisgICAgICAgICAgICAgICAgZWVwcm9tLT53b3JkX3NpemUgPSAyNTY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVFUFJPTV9TSVpFXzEyOEI6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGVlcHJvbS0+d29yZF9zaXplID0gNjQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhaXNlcyB0aGUgRUVQUk9NJ3MgY2xvY2sgaW5wdXQuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIGVlY2QgLSBFRUNEJ3MgY3VycmVudCB2YWx1ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX3JhaXNlX2VlX2NsayhzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICplZWNkKQoreworICAgIC8qIFJhaXNlIHRoZSBjbG9jayBpbnB1dCB0byB0aGUgRUVQUk9NIChieSBzZXR0aW5nIHRoZSBTSyBiaXQpLCBhbmQgdGhlbgorICAgICAqIHdhaXQgPGRlbGF5PiBtaWNyb3NlY29uZHMuCisgICAgICovCisgICAgKmVlY2QgPSAqZWVjZCB8IEUxMDAwX0VFQ0RfU0s7CisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCAqZWVjZCk7CisgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgIHVkZWxheShody0+ZWVwcm9tLmRlbGF5X3VzZWMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMb3dlcnMgdGhlIEVFUFJPTSdzIGNsb2NrIGlucHV0LgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBlZWNkIC0gRUVDRCdzIGN1cnJlbnQgdmFsdWUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitlMTAwMF9sb3dlcl9lZV9jbGsoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZWVjZCkKK3sKKyAgICAvKiBMb3dlciB0aGUgY2xvY2sgaW5wdXQgdG8gdGhlIEVFUFJPTSAoYnkgY2xlYXJpbmcgdGhlIFNLIGJpdCksIGFuZCB0aGVuCisgICAgICogd2FpdCA1MCBtaWNyb3NlY29uZHMuCisgICAgICovCisgICAgKmVlY2QgPSAqZWVjZCAmIH5FMTAwMF9FRUNEX1NLOworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgKmVlY2QpOworICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICB1ZGVsYXkoaHctPmVlcHJvbS5kZWxheV91c2VjKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2hpZnQgZGF0YSBiaXRzIG91dCB0byB0aGUgRUVQUk9NLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBkYXRhIC0gZGF0YSB0byBzZW5kIHRvIHRoZSBFRVBST00KKyAqIGNvdW50IC0gbnVtYmVyIG9mIGJpdHMgdG8gc2hpZnQgb3V0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb3VudCkKK3sKKyAgICBzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gKmVlcHJvbSA9ICZody0+ZWVwcm9tOworICAgIHVpbnQzMl90IGVlY2Q7CisgICAgdWludDMyX3QgbWFzazsKKworICAgIC8qIFdlIG5lZWQgdG8gc2hpZnQgImNvdW50IiBiaXRzIG91dCB0byB0aGUgRUVQUk9NLiBTbywgdmFsdWUgaW4gdGhlCisgICAgICogImRhdGEiIHBhcmFtZXRlciB3aWxsIGJlIHNoaWZ0ZWQgb3V0IHRvIHRoZSBFRVBST00gb25lIGJpdCBhdCBhIHRpbWUuCisgICAgICogSW4gb3JkZXIgdG8gZG8gdGhpcywgImRhdGEiIG11c3QgYmUgYnJva2VuIGRvd24gaW50byBiaXRzLgorICAgICAqLworICAgIG1hc2sgPSAweDAxIDw8IChjb3VudCAtIDEpOworICAgIGVlY2QgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVDRCk7CisgICAgaWYgKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fbWljcm93aXJlKSB7CisgICAgICAgIGVlY2QgJj0gfkUxMDAwX0VFQ0RfRE87CisgICAgfSBlbHNlIGlmIChlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX3NwaSkgeworICAgICAgICBlZWNkIHw9IEUxMDAwX0VFQ0RfRE87CisgICAgfQorICAgIGRvIHsKKyAgICAgICAgLyogQSAiMSIgaXMgc2hpZnRlZCBvdXQgdG8gdGhlIEVFUFJPTSBieSBzZXR0aW5nIGJpdCAiREkiIHRvIGEgIjEiLAorICAgICAgICAgKiBhbmQgdGhlbiByYWlzaW5nIGFuZCB0aGVuIGxvd2VyaW5nIHRoZSBjbG9jayAodGhlIFNLIGJpdCBjb250cm9scworICAgICAgICAgKiB0aGUgY2xvY2sgaW5wdXQgdG8gdGhlIEVFUFJPTSkuICBBICIwIiBpcyBzaGlmdGVkIG91dCB0byB0aGUgRUVQUk9NCisgICAgICAgICAqIGJ5IHNldHRpbmcgIkRJIiB0byAiMCIgYW5kIHRoZW4gcmFpc2luZyBhbmQgdGhlbiBsb3dlcmluZyB0aGUgY2xvY2suCisgICAgICAgICAqLworICAgICAgICBlZWNkICY9IH5FMTAwMF9FRUNEX0RJOworCisgICAgICAgIGlmKGRhdGEgJiBtYXNrKQorICAgICAgICAgICAgZWVjZCB8PSBFMTAwMF9FRUNEX0RJOworCisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKworICAgICAgICB1ZGVsYXkoZWVwcm9tLT5kZWxheV91c2VjKTsKKworICAgICAgICBlMTAwMF9yYWlzZV9lZV9jbGsoaHcsICZlZWNkKTsKKyAgICAgICAgZTEwMDBfbG93ZXJfZWVfY2xrKGh3LCAmZWVjZCk7CisKKyAgICAgICAgbWFzayA9IG1hc2sgPj4gMTsKKworICAgIH0gd2hpbGUobWFzayk7CisKKyAgICAvKiBXZSBsZWF2ZSB0aGUgIkRJIiBiaXQgc2V0IHRvICIwIiB3aGVuIHdlIGxlYXZlIHRoaXMgcm91dGluZS4gKi8KKyAgICBlZWNkICY9IH5FMTAwMF9FRUNEX0RJOworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNoaWZ0IGRhdGEgYml0cyBpbiBmcm9tIHRoZSBFRVBST00KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVpbnQxNl90CitlMTAwMF9zaGlmdF9pbl9lZV9iaXRzKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvdW50KQoreworICAgIHVpbnQzMl90IGVlY2Q7CisgICAgdWludDMyX3QgaTsKKyAgICB1aW50MTZfdCBkYXRhOworCisgICAgLyogSW4gb3JkZXIgdG8gcmVhZCBhIHJlZ2lzdGVyIGZyb20gdGhlIEVFUFJPTSwgd2UgbmVlZCB0byBzaGlmdCAnY291bnQnCisgICAgICogYml0cyBpbiBmcm9tIHRoZSBFRVBST00uIEJpdHMgYXJlICJzaGlmdGVkIGluIiBieSByYWlzaW5nIHRoZSBjbG9jaworICAgICAqIGlucHV0IHRvIHRoZSBFRVBST00gKHNldHRpbmcgdGhlIFNLIGJpdCksIGFuZCB0aGVuIHJlYWRpbmcgdGhlIHZhbHVlIG9mCisgICAgICogdGhlICJETyIgYml0LiAgRHVyaW5nIHRoaXMgInNoaWZ0aW5nIGluIiBwcm9jZXNzIHRoZSAiREkiIGJpdCBzaG91bGQKKyAgICAgKiBhbHdheXMgYmUgY2xlYXIuCisgICAgICovCisKKyAgICBlZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOworCisgICAgZWVjZCAmPSB+KEUxMDAwX0VFQ0RfRE8gfCBFMTAwMF9FRUNEX0RJKTsKKyAgICBkYXRhID0gMDsKKworICAgIGZvcihpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgZGF0YSA9IGRhdGEgPDwgMTsKKyAgICAgICAgZTEwMDBfcmFpc2VfZWVfY2xrKGh3LCAmZWVjZCk7CisKKyAgICAgICAgZWVjZCA9IEUxMDAwX1JFQURfUkVHKGh3LCBFRUNEKTsKKworICAgICAgICBlZWNkICY9IH4oRTEwMDBfRUVDRF9ESSk7CisgICAgICAgIGlmKGVlY2QgJiBFMTAwMF9FRUNEX0RPKQorICAgICAgICAgICAgZGF0YSB8PSAxOworCisgICAgICAgIGUxMDAwX2xvd2VyX2VlX2NsayhodywgJmVlY2QpOworICAgIH0KKworICAgIHJldHVybiBkYXRhOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcmVwYXJlcyBFRVBST00gZm9yIGFjY2VzcworICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogTG93ZXJzIEVFUFJPTSBjbG9jay4gQ2xlYXJzIGlucHV0IHBpbi4gU2V0cyB0aGUgY2hpcCBzZWxlY3QgcGluLiBUaGlzCisgKiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBpc3N1aW5nIGEgY29tbWFuZCB0byB0aGUgRUVQUk9NLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludDMyX3QKK2UxMDAwX2FjcXVpcmVfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgc3RydWN0IGUxMDAwX2VlcHJvbV9pbmZvICplZXByb20gPSAmaHctPmVlcHJvbTsKKyAgICB1aW50MzJfdCBlZWNkLCBpPTA7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2FjcXVpcmVfZWVwcm9tIik7CisKKyAgICBlZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOworCisgICAgLyogUmVxdWVzdCBFRVBST00gQWNjZXNzICovCisgICAgaWYoaHctPm1hY190eXBlID4gZTEwMDBfODI1NDQpIHsKKyAgICAgICAgZWVjZCB8PSBFMTAwMF9FRUNEX1JFUTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKyAgICAgICAgZWVjZCA9IEUxMDAwX1JFQURfUkVHKGh3LCBFRUNEKTsKKyAgICAgICAgd2hpbGUoKCEoZWVjZCAmIEUxMDAwX0VFQ0RfR05UKSkgJiYKKyAgICAgICAgICAgICAgKGkgPCBFMTAwMF9FRVBST01fR1JBTlRfQVRURU1QVFMpKSB7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB1ZGVsYXkoNSk7CisgICAgICAgICAgICBlZWNkID0gRTEwMDBfUkVBRF9SRUcoaHcsIEVFQ0QpOworICAgICAgICB9CisgICAgICAgIGlmKCEoZWVjZCAmIEUxMDAwX0VFQ0RfR05UKSkgeworICAgICAgICAgICAgZWVjZCAmPSB+RTEwMDBfRUVDRF9SRVE7CisgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworICAgICAgICAgICAgREVCVUdPVVQoIkNvdWxkIG5vdCBhY3F1aXJlIEVFUFJPTSBncmFudFxuIik7CisgICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTZXR1cCBFRVBST00gZm9yIFJlYWQvV3JpdGUgKi8KKworICAgIGlmIChlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSkgeworICAgICAgICAvKiBDbGVhciBTSyBhbmQgREkgKi8KKyAgICAgICAgZWVjZCAmPSB+KEUxMDAwX0VFQ0RfREkgfCBFMTAwMF9FRUNEX1NLKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKworICAgICAgICAvKiBTZXQgQ1MgKi8KKyAgICAgICAgZWVjZCB8PSBFMTAwMF9FRUNEX0NTOworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworICAgIH0gZWxzZSBpZiAoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9zcGkpIHsKKyAgICAgICAgLyogQ2xlYXIgU0sgYW5kIENTICovCisgICAgICAgIGVlY2QgJj0gfihFMTAwMF9FRUNEX0NTIHwgRTEwMDBfRUVDRF9TSyk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisgICAgICAgIHVkZWxheSgxKTsKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmV0dXJucyBFRVBST00gdG8gYSAic3RhbmRieSIgc3RhdGUKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2UxMDAwX3N0YW5kYnlfZWVwcm9tKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgc3RydWN0IGUxMDAwX2VlcHJvbV9pbmZvICplZXByb20gPSAmaHctPmVlcHJvbTsKKyAgICB1aW50MzJfdCBlZWNkOworCisgICAgZWVjZCA9IEUxMDAwX1JFQURfUkVHKGh3LCBFRUNEKTsKKworICAgIGlmKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fbWljcm93aXJlKSB7CisgICAgICAgIGVlY2QgJj0gfihFMTAwMF9FRUNEX0NTIHwgRTEwMDBfRUVDRF9TSyk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICAgICAgdWRlbGF5KGVlcHJvbS0+ZGVsYXlfdXNlYyk7CisKKyAgICAgICAgLyogQ2xvY2sgaGlnaCAqLworICAgICAgICBlZWNkIHw9IEUxMDAwX0VFQ0RfU0s7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICAgICAgdWRlbGF5KGVlcHJvbS0+ZGVsYXlfdXNlYyk7CisKKyAgICAgICAgLyogU2VsZWN0IEVFUFJPTSAqLworICAgICAgICBlZWNkIHw9IEUxMDAwX0VFQ0RfQ1M7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICAgICAgdWRlbGF5KGVlcHJvbS0+ZGVsYXlfdXNlYyk7CisKKyAgICAgICAgLyogQ2xvY2sgbG93ICovCisgICAgICAgIGVlY2QgJj0gfkUxMDAwX0VFQ0RfU0s7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICAgICAgdWRlbGF5KGVlcHJvbS0+ZGVsYXlfdXNlYyk7CisgICAgfSBlbHNlIGlmKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fc3BpKSB7CisgICAgICAgIC8qIFRvZ2dsZSBDUyB0byBmbHVzaCBjb21tYW5kcyAqLworICAgICAgICBlZWNkIHw9IEUxMDAwX0VFQ0RfQ1M7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICAgICAgdWRlbGF5KGVlcHJvbS0+ZGVsYXlfdXNlYyk7CisgICAgICAgIGVlY2QgJj0gfkUxMDAwX0VFQ0RfQ1M7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZCk7CisgICAgICAgIEUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKKyAgICAgICAgdWRlbGF5KGVlcHJvbS0+ZGVsYXlfdXNlYyk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUZXJtaW5hdGVzIGEgY29tbWFuZCBieSBpbnZlcnRpbmcgdGhlIEVFUFJPTSdzIGNoaXAgc2VsZWN0IHBpbgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorZTEwMDBfcmVsZWFzZV9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBlZWNkOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9yZWxlYXNlX2VlcHJvbSIpOworCisgICAgZWVjZCA9IEUxMDAwX1JFQURfUkVHKGh3LCBFRUNEKTsKKworICAgIGlmIChody0+ZWVwcm9tLnR5cGUgPT0gZTEwMDBfZWVwcm9tX3NwaSkgeworICAgICAgICBlZWNkIHw9IEUxMDAwX0VFQ0RfQ1M7ICAvKiBQdWxsIENTIGhpZ2ggKi8KKyAgICAgICAgZWVjZCAmPSB+RTEwMDBfRUVDRF9TSzsgLyogTG93ZXIgU0NLICovCisKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKworICAgICAgICB1ZGVsYXkoaHctPmVlcHJvbS5kZWxheV91c2VjKTsKKyAgICB9IGVsc2UgaWYoaHctPmVlcHJvbS50eXBlID09IGUxMDAwX2VlcHJvbV9taWNyb3dpcmUpIHsKKyAgICAgICAgLyogY2xlYW51cCBlZXByb20gKi8KKworICAgICAgICAvKiBDUyBvbiBNaWNyb3dpcmUgaXMgYWN0aXZlLWhpZ2ggKi8KKyAgICAgICAgZWVjZCAmPSB+KEUxMDAwX0VFQ0RfQ1MgfCBFMTAwMF9FRUNEX0RJKTsKKworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworCisgICAgICAgIC8qIFJpc2luZyBlZGdlIG9mIGNsb2NrICovCisgICAgICAgIGVlY2QgfD0gRTEwMDBfRUVDRF9TSzsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgICAgICB1ZGVsYXkoaHctPmVlcHJvbS5kZWxheV91c2VjKTsKKworICAgICAgICAvKiBGYWxsaW5nIGVkZ2Ugb2YgY2xvY2sgKi8KKyAgICAgICAgZWVjZCAmPSB+RTEwMDBfRUVDRF9TSzsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfRkxVU0goaHcpOworICAgICAgICB1ZGVsYXkoaHctPmVlcHJvbS5kZWxheV91c2VjKTsKKyAgICB9CisKKyAgICAvKiBTdG9wIHJlcXVlc3RpbmcgRUVQUk9NIGFjY2VzcyAqLworICAgIGlmKGh3LT5tYWNfdHlwZSA+IGUxMDAwXzgyNTQ0KSB7CisgICAgICAgIGVlY2QgJj0gfkUxMDAwX0VFQ0RfUkVROworICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2QpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVhZHMgYSAxNiBiaXQgd29yZCBmcm9tIHRoZSBFRVBST00uCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX3NwaV9lZXByb21fcmVhZHkoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MTZfdCByZXRyeV9jb3VudCA9IDA7CisgICAgdWludDhfdCBzcGlfc3RhdF9yZWc7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3NwaV9lZXByb21fcmVhZHkiKTsKKworICAgIC8qIFJlYWQgIlN0YXR1cyBSZWdpc3RlciIgcmVwZWF0ZWRseSB1bnRpbCB0aGUgTFNCIGlzIGNsZWFyZWQuICBUaGUKKyAgICAgKiBFRVBST00gd2lsbCBzaWduYWwgdGhhdCB0aGUgY29tbWFuZCBoYXMgYmVlbiBjb21wbGV0ZWQgYnkgY2xlYXJpbmcKKyAgICAgKiBiaXQgMCBvZiB0aGUgaW50ZXJuYWwgc3RhdHVzIHJlZ2lzdGVyLiAgSWYgaXQncyBub3QgY2xlYXJlZCB3aXRoaW4KKyAgICAgKiA1IG1pbGxpc2Vjb25kcywgdGhlbiBlcnJvciBvdXQuCisgICAgICovCisgICAgcmV0cnlfY291bnQgPSAwOworICAgIGRvIHsKKyAgICAgICAgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsIEVFUFJPTV9SRFNSX09QQ09ERV9TUEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5lZXByb20ub3Bjb2RlX2JpdHMpOworICAgICAgICBzcGlfc3RhdF9yZWcgPSAodWludDhfdCllMTAwMF9zaGlmdF9pbl9lZV9iaXRzKGh3LCA4KTsKKyAgICAgICAgaWYgKCEoc3BpX3N0YXRfcmVnICYgRUVQUk9NX1NUQVRVU19SRFlfU1BJKSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHVkZWxheSg1KTsKKyAgICAgICAgcmV0cnlfY291bnQgKz0gNTsKKworICAgICAgICBlMTAwMF9zdGFuZGJ5X2VlcHJvbShodyk7CisgICAgfSB3aGlsZShyZXRyeV9jb3VudCA8IEVFUFJPTV9NQVhfUkVUUllfU1BJKTsKKworICAgIC8qIEFUTUVMIFNQSSB3cml0ZSB0aW1lIGNvdWxkIHZhcnkgZnJvbSAwLTIwbVNlYyBvbiAzLjNWIGRldmljZXMgKGFuZAorICAgICAqIG9ubHkgMC01bVNlYyBvbiA1ViBkZXZpY2VzKQorICAgICAqLworICAgIGlmKHJldHJ5X2NvdW50ID49IEVFUFJPTV9NQVhfUkVUUllfU1BJKSB7CisgICAgICAgIERFQlVHT1VUKCJTUEkgRUVQUk9NIFN0YXR1cyBlcnJvclxuIik7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVhZHMgYSAxNiBiaXQgd29yZCBmcm9tIHRoZSBFRVBST00uCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIG9mZnNldCAtIG9mZnNldCBvZiAgd29yZCBpbiB0aGUgRUVQUk9NIHRvIHJlYWQKKyAqIGRhdGEgLSB3b3JkIHJlYWQgZnJvbSB0aGUgRUVQUk9NCisgKiB3b3JkcyAtIG51bWJlciBvZiB3b3JkcyB0byByZWFkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9yZWFkX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgdWludDE2X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd29yZHMsCisgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqZGF0YSkKK3sKKyAgICBzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gKmVlcHJvbSA9ICZody0+ZWVwcm9tOworICAgIHVpbnQzMl90IGkgPSAwOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9yZWFkX2VlcHJvbSIpOworICAgIC8qIEEgY2hlY2sgZm9yIGludmFsaWQgdmFsdWVzOiAgb2Zmc2V0IHRvbyBsYXJnZSwgdG9vIG1hbnkgd29yZHMsIGFuZCBub3QKKyAgICAgKiBlbm91Z2ggd29yZHMuCisgICAgICovCisgICAgaWYoKG9mZnNldCA+PSBlZXByb20tPndvcmRfc2l6ZSkgfHwgKHdvcmRzID4gZWVwcm9tLT53b3JkX3NpemUgLSBvZmZzZXQpIHx8CisgICAgICAgKHdvcmRzID09IDApKSB7CisgICAgICAgIERFQlVHT1VUKCJcIndvcmRzXCIgcGFyYW1ldGVyIG91dCBvZiBib3VuZHNcbiIpOworICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisgICAgfQorCisgICAgLyogUHJlcGFyZSB0aGUgRUVQUk9NIGZvciByZWFkaW5nICAqLworICAgIGlmKGUxMDAwX2FjcXVpcmVfZWVwcm9tKGh3KSAhPSBFMTAwMF9TVUNDRVNTKQorICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisKKyAgICBpZihlZXByb20tPnR5cGUgPT0gZTEwMDBfZWVwcm9tX3NwaSkgeworICAgICAgICB1aW50MTZfdCB3b3JkX2luOworICAgICAgICB1aW50OF90IHJlYWRfb3Bjb2RlID0gRUVQUk9NX1JFQURfT1BDT0RFX1NQSTsKKworICAgICAgICBpZihlMTAwMF9zcGlfZWVwcm9tX3JlYWR5KGh3KSkgeworICAgICAgICAgICAgZTEwMDBfcmVsZWFzZV9lZXByb20oaHcpOworICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworICAgICAgICB9CisKKyAgICAgICAgZTEwMDBfc3RhbmRieV9lZXByb20oaHcpOworCisgICAgICAgIC8qIFNvbWUgU1BJIGVlcHJvbXMgdXNlIHRoZSA4dGggYWRkcmVzcyBiaXQgZW1iZWRkZWQgaW4gdGhlIG9wY29kZSAqLworICAgICAgICBpZigoZWVwcm9tLT5hZGRyZXNzX2JpdHMgPT0gOCkgJiYgKG9mZnNldCA+PSAxMjgpKQorICAgICAgICAgICAgcmVhZF9vcGNvZGUgfD0gRUVQUk9NX0E4X09QQ09ERV9TUEk7CisKKyAgICAgICAgLyogU2VuZCB0aGUgUkVBRCBjb21tYW5kIChvcGNvZGUgKyBhZGRyKSAgKi8KKyAgICAgICAgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsIHJlYWRfb3Bjb2RlLCBlZXByb20tPm9wY29kZV9iaXRzKTsKKyAgICAgICAgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsICh1aW50MTZfdCkob2Zmc2V0KjIpLCBlZXByb20tPmFkZHJlc3NfYml0cyk7CisKKyAgICAgICAgLyogUmVhZCB0aGUgZGF0YS4gIFRoZSBhZGRyZXNzIG9mIHRoZSBlZXByb20gaW50ZXJuYWxseSBpbmNyZW1lbnRzIHdpdGgKKyAgICAgICAgICogZWFjaCBieXRlIChzcGkpIGJlaW5nIHJlYWQsIHNhdmluZyBvbiB0aGUgb3ZlcmhlYWQgb2YgZWVwcm9tIHNldHVwCisgICAgICAgICAqIGFuZCB0ZWFyLWRvd24uICBUaGUgYWRkcmVzcyBjb3VudGVyIHdpbGwgcm9sbCBvdmVyIGlmIHJlYWRpbmcgYmV5b25kCisgICAgICAgICAqIHRoZSBzaXplIG9mIHRoZSBlZXByb20sIHRodXMgYWxsb3dpbmcgdGhlIGVudGlyZSBtZW1vcnkgdG8gYmUgcmVhZAorICAgICAgICAgKiBzdGFydGluZyBmcm9tIGFueSBvZmZzZXQuICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3b3JkczsgaSsrKSB7CisgICAgICAgICAgICB3b3JkX2luID0gZTEwMDBfc2hpZnRfaW5fZWVfYml0cyhodywgMTYpOworICAgICAgICAgICAgZGF0YVtpXSA9ICh3b3JkX2luID4+IDgpIHwgKHdvcmRfaW4gPDwgOCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYoZWVwcm9tLT50eXBlID09IGUxMDAwX2VlcHJvbV9taWNyb3dpcmUpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKyspIHsKKyAgICAgICAgICAgIC8qIFNlbmQgdGhlIFJFQUQgY29tbWFuZCAob3Bjb2RlICsgYWRkcikgICovCisgICAgICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgRUVQUk9NX1JFQURfT1BDT0RFX01JQ1JPV0lSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlcHJvbS0+b3Bjb2RlX2JpdHMpOworICAgICAgICAgICAgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsICh1aW50MTZfdCkob2Zmc2V0ICsgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyk7CisKKyAgICAgICAgICAgIC8qIFJlYWQgdGhlIGRhdGEuICBGb3IgbWljcm93aXJlLCBlYWNoIHdvcmQgcmVxdWlyZXMgdGhlIG92ZXJoZWFkCisgICAgICAgICAgICAgKiBvZiBlZXByb20gc2V0dXAgYW5kIHRlYXItZG93bi4gKi8KKyAgICAgICAgICAgIGRhdGFbaV0gPSBlMTAwMF9zaGlmdF9pbl9lZV9iaXRzKGh3LCAxNik7CisgICAgICAgICAgICBlMTAwMF9zdGFuZGJ5X2VlcHJvbShodyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBFbmQgdGhpcyByZWFkIG9wZXJhdGlvbiAqLworICAgIGUxMDAwX3JlbGVhc2VfZWVwcm9tKGh3KTsKKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWZXJpZmllcyB0aGF0IHRoZSBFRVBST00gaGFzIGEgdmFsaWQgY2hlY2tzdW0KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFJlYWRzIHRoZSBmaXJzdCA2NCAxNiBiaXQgd29yZHMgb2YgdGhlIEVFUFJPTSBhbmQgc3VtcyB0aGUgdmFsdWVzIHJlYWQuCisgKiBJZiB0aGUgdGhlIHN1bSBvZiB0aGUgNjQgMTYgYml0IHdvcmRzIGlzIDB4QkFCQSwgdGhlIEVFUFJPTSdzIGNoZWNrc3VtIGlzCisgKiB2YWxpZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX3ZhbGlkYXRlX2VlcHJvbV9jaGVja3N1bShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQxNl90IGNoZWNrc3VtID0gMDsKKyAgICB1aW50MTZfdCBpLCBlZXByb21fZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfdmFsaWRhdGVfZWVwcm9tX2NoZWNrc3VtIik7CisKKyAgICBmb3IoaSA9IDA7IGkgPCAoRUVQUk9NX0NIRUNLU1VNX1JFRyArIDEpOyBpKyspIHsKKyAgICAgICAgaWYoZTEwMDBfcmVhZF9lZXByb20oaHcsIGksIDEsICZlZXByb21fZGF0YSkgPCAwKSB7CisgICAgICAgICAgICBERUJVR09VVCgiRUVQUk9NIFJlYWQgRXJyb3JcbiIpOworICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworICAgICAgICB9CisgICAgICAgIGNoZWNrc3VtICs9IGVlcHJvbV9kYXRhOworICAgIH0KKworICAgIGlmKGNoZWNrc3VtID09ICh1aW50MTZfdCkgRUVQUk9NX1NVTSkKKyAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisgICAgZWxzZSB7CisgICAgICAgIERFQlVHT1VUKCJFRVBST00gQ2hlY2tzdW0gSW52YWxpZFxuIik7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENhbGN1bGF0ZXMgdGhlIEVFUFJPTSBjaGVja3N1bSBhbmQgd3JpdGVzIGl0IHRvIHRoZSBFRVBST00KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFN1bXMgdGhlIGZpcnN0IDYzIDE2IGJpdCB3b3JkcyBvZiB0aGUgRUVQUk9NLiBTdWJ0cmFjdHMgdGhlIHN1bSBmcm9tIDB4QkFCQS4KKyAqIFdyaXRlcyB0aGUgZGlmZmVyZW5jZSB0byB3b3JkIG9mZnNldCA2MyBvZiB0aGUgRUVQUk9NLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfdXBkYXRlX2VlcHJvbV9jaGVja3N1bShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQxNl90IGNoZWNrc3VtID0gMDsKKyAgICB1aW50MTZfdCBpLCBlZXByb21fZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfdXBkYXRlX2VlcHJvbV9jaGVja3N1bSIpOworCisgICAgZm9yKGkgPSAwOyBpIDwgRUVQUk9NX0NIRUNLU1VNX1JFRzsgaSsrKSB7CisgICAgICAgIGlmKGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBpLCAxLCAmZWVwcm9tX2RhdGEpIDwgMCkgeworICAgICAgICAgICAgREVCVUdPVVQoIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICAgICAgfQorICAgICAgICBjaGVja3N1bSArPSBlZXByb21fZGF0YTsKKyAgICB9CisgICAgY2hlY2tzdW0gPSAodWludDE2X3QpIEVFUFJPTV9TVU0gLSBjaGVja3N1bTsKKyAgICBpZihlMTAwMF93cml0ZV9lZXByb20oaHcsIEVFUFJPTV9DSEVDS1NVTV9SRUcsIDEsICZjaGVja3N1bSkgPCAwKSB7CisgICAgICAgIERFQlVHT1VUKCJFRVBST00gV3JpdGUgRXJyb3JcbiIpOworICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9FRVBST007CisgICAgfQorICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQYXJlbnQgZnVuY3Rpb24gZm9yIHdyaXRpbmcgd29yZHMgdG8gdGhlIGRpZmZlcmVudCBFRVBST00gdHlwZXMuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIG9mZnNldCAtIG9mZnNldCB3aXRoaW4gdGhlIEVFUFJPTSB0byBiZSB3cml0dGVuIHRvCisgKiB3b3JkcyAtIG51bWJlciBvZiB3b3JkcyB0byB3cml0ZQorICogZGF0YSAtIDE2IGJpdCB3b3JkIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIEVFUFJPTQorICoKKyAqIElmIGUxMDAwX3VwZGF0ZV9lZXByb21fY2hlY2tzdW0gaXMgbm90IGNhbGxlZCBhZnRlciB0aGlzIGZ1bmN0aW9uLCB0aGUKKyAqIEVFUFJPTSB3aWxsIG1vc3QgbGlrZWx5IGNvbnRhaW4gYW4gaW52YWxpZCBjaGVja3N1bS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX3dyaXRlX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB3b3JkcywKKyAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqZGF0YSkKK3sKKyAgICBzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gKmVlcHJvbSA9ICZody0+ZWVwcm9tOworICAgIGludDMyX3Qgc3RhdHVzID0gMDsKKworICAgIERFQlVHRlVOQygiZTEwMDBfd3JpdGVfZWVwcm9tIik7CisKKyAgICAvKiBBIGNoZWNrIGZvciBpbnZhbGlkIHZhbHVlczogIG9mZnNldCB0b28gbGFyZ2UsIHRvbyBtYW55IHdvcmRzLCBhbmQgbm90CisgICAgICogZW5vdWdoIHdvcmRzLgorICAgICAqLworICAgIGlmKChvZmZzZXQgPj0gZWVwcm9tLT53b3JkX3NpemUpIHx8ICh3b3JkcyA+IGVlcHJvbS0+d29yZF9zaXplIC0gb2Zmc2V0KSB8fAorICAgICAgICh3b3JkcyA9PSAwKSkgeworICAgICAgICBERUJVR09VVCgiXCJ3b3Jkc1wiIHBhcmFtZXRlciBvdXQgb2YgYm91bmRzXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworICAgIH0KKworICAgIC8qIFByZXBhcmUgdGhlIEVFUFJPTSBmb3Igd3JpdGluZyAgKi8KKyAgICBpZiAoZTEwMDBfYWNxdWlyZV9lZXByb20oaHcpICE9IEUxMDAwX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKworICAgIGlmKGVlcHJvbS0+dHlwZSA9PSBlMTAwMF9lZXByb21fbWljcm93aXJlKSB7CisgICAgICAgIHN0YXR1cyA9IGUxMDAwX3dyaXRlX2VlcHJvbV9taWNyb3dpcmUoaHcsIG9mZnNldCwgd29yZHMsIGRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IGUxMDAwX3dyaXRlX2VlcHJvbV9zcGkoaHcsIG9mZnNldCwgd29yZHMsIGRhdGEpOworICAgICAgICBtc2VjX2RlbGF5KDEwKTsKKyAgICB9CisKKyAgICAvKiBEb25lIHdpdGggd3JpdGluZyAqLworICAgIGUxMDAwX3JlbGVhc2VfZWVwcm9tKGh3KTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFdyaXRlcyBhIDE2IGJpdCB3b3JkIHRvIGEgZ2l2ZW4gb2Zmc2V0IGluIGFuIFNQSSBFRVBST00uCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIG9mZnNldCAtIG9mZnNldCB3aXRoaW4gdGhlIEVFUFJPTSB0byBiZSB3cml0dGVuIHRvCisgKiB3b3JkcyAtIG51bWJlciBvZiB3b3JkcyB0byB3cml0ZQorICogZGF0YSAtIHBvaW50ZXIgdG8gYXJyYXkgb2YgOCBiaXQgd29yZHMgdG8gYmUgd3JpdHRlbiB0byB0aGUgRUVQUk9NCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfd3JpdGVfZWVwcm9tX3NwaShzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqZGF0YSkKK3sKKyAgICBzdHJ1Y3QgZTEwMDBfZWVwcm9tX2luZm8gKmVlcHJvbSA9ICZody0+ZWVwcm9tOworICAgIHVpbnQxNl90IHdpZHggPSAwOworCisgICAgREVCVUdGVU5DKCJlMTAwMF93cml0ZV9lZXByb21fc3BpIik7CisKKyAgICB3aGlsZSAod2lkeCA8IHdvcmRzKSB7CisgICAgICAgIHVpbnQ4X3Qgd3JpdGVfb3Bjb2RlID0gRUVQUk9NX1dSSVRFX09QQ09ERV9TUEk7CisKKyAgICAgICAgaWYoZTEwMDBfc3BpX2VlcHJvbV9yZWFkeShodykpIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKworICAgICAgICBlMTAwMF9zdGFuZGJ5X2VlcHJvbShodyk7CisKKyAgICAgICAgLyogIFNlbmQgdGhlIFdSSVRFIEVOQUJMRSBjb21tYW5kICg4IGJpdCBvcGNvZGUgKSAgKi8KKyAgICAgICAgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsIEVFUFJPTV9XUkVOX09QQ09ERV9TUEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb20tPm9wY29kZV9iaXRzKTsKKworICAgICAgICBlMTAwMF9zdGFuZGJ5X2VlcHJvbShodyk7CisKKyAgICAgICAgLyogU29tZSBTUEkgZWVwcm9tcyB1c2UgdGhlIDh0aCBhZGRyZXNzIGJpdCBlbWJlZGRlZCBpbiB0aGUgb3Bjb2RlICovCisgICAgICAgIGlmKChlZXByb20tPmFkZHJlc3NfYml0cyA9PSA4KSAmJiAob2Zmc2V0ID49IDEyOCkpCisgICAgICAgICAgICB3cml0ZV9vcGNvZGUgfD0gRUVQUk9NX0E4X09QQ09ERV9TUEk7CisKKyAgICAgICAgLyogU2VuZCB0aGUgV3JpdGUgY29tbWFuZCAoOC1iaXQgb3Bjb2RlICsgYWRkcikgKi8KKyAgICAgICAgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsIHdyaXRlX29wY29kZSwgZWVwcm9tLT5vcGNvZGVfYml0cyk7CisKKyAgICAgICAgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsICh1aW50MTZfdCkoKG9mZnNldCArIHdpZHgpKjIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb20tPmFkZHJlc3NfYml0cyk7CisKKyAgICAgICAgLyogU2VuZCB0aGUgZGF0YSAqLworCisgICAgICAgIC8qIExvb3AgdG8gYWxsb3cgZm9yIHVwIHRvIHdob2xlIHBhZ2Ugd3JpdGUgKDMyIGJ5dGVzKSBvZiBlZXByb20gKi8KKyAgICAgICAgd2hpbGUgKHdpZHggPCB3b3JkcykgeworICAgICAgICAgICAgdWludDE2X3Qgd29yZF9vdXQgPSBkYXRhW3dpZHhdOworICAgICAgICAgICAgd29yZF9vdXQgPSAod29yZF9vdXQgPj4gOCkgfCAod29yZF9vdXQgPDwgOCk7CisgICAgICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgd29yZF9vdXQsIDE2KTsKKyAgICAgICAgICAgIHdpZHgrKzsKKworICAgICAgICAgICAgLyogU29tZSBsYXJnZXIgZWVwcm9tIHNpemVzIGFyZSBjYXBhYmxlIG9mIGEgMzItYnl0ZSBQQUdFIFdSSVRFCisgICAgICAgICAgICAgKiBvcGVyYXRpb24sIHdoaWxlIHRoZSBzbWFsbGVyIGVlcHJvbXMgYXJlIGNhcGFibGUgb2YgYW4gOC1ieXRlCisgICAgICAgICAgICAgKiBQQUdFIFdSSVRFIG9wZXJhdGlvbi4gIEJyZWFrIHRoZSBpbm5lciBsb29wIHRvIHBhc3MgbmV3IGFkZHJlc3MKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYoKCgob2Zmc2V0ICsgd2lkeCkqMikgJSBlZXByb20tPnBhZ2Vfc2l6ZSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGUxMDAwX3N0YW5kYnlfZWVwcm9tKGh3KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBXcml0ZXMgYSAxNiBiaXQgd29yZCB0byBhIGdpdmVuIG9mZnNldCBpbiBhIE1pY3Jvd2lyZSBFRVBST00uCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIG9mZnNldCAtIG9mZnNldCB3aXRoaW4gdGhlIEVFUFJPTSB0byBiZSB3cml0dGVuIHRvCisgKiB3b3JkcyAtIG51bWJlciBvZiB3b3JkcyB0byB3cml0ZQorICogZGF0YSAtIHBvaW50ZXIgdG8gYXJyYXkgb2YgMTYgYml0IHdvcmRzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIEVFUFJPTQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX3dyaXRlX2VlcHJvbV9taWNyb3dpcmUoc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKmRhdGEpCit7CisgICAgc3RydWN0IGUxMDAwX2VlcHJvbV9pbmZvICplZXByb20gPSAmaHctPmVlcHJvbTsKKyAgICB1aW50MzJfdCBlZWNkOworICAgIHVpbnQxNl90IHdvcmRzX3dyaXR0ZW4gPSAwOworICAgIHVpbnQxNl90IGkgPSAwOworCisgICAgREVCVUdGVU5DKCJlMTAwMF93cml0ZV9lZXByb21fbWljcm93aXJlIik7CisKKyAgICAvKiBTZW5kIHRoZSB3cml0ZSBlbmFibGUgY29tbWFuZCB0byB0aGUgRUVQUk9NICgzLWJpdCBvcGNvZGUgcGx1cworICAgICAqIDYvOC1iaXQgZHVtbXkgYWRkcmVzcyBiZWdpbm5pbmcgd2l0aCAxMSkuICBJdCdzIGxlc3Mgd29yayB0byBpbmNsdWRlCisgICAgICogdGhlIDExIG9mIHRoZSBkdW1teSBhZGRyZXNzIGFzIHBhcnQgb2YgdGhlIG9wY29kZSB0aGFuIGl0IGlzIHRvIHNoaWZ0CisgICAgICogaXQgb3ZlciB0aGUgY29ycmVjdCBudW1iZXIgb2YgYml0cyBmb3IgdGhlIGFkZHJlc3MuICBUaGlzIHB1dHMgdGhlCisgICAgICogRUVQUk9NIGludG8gd3JpdGUvZXJhc2UgbW9kZS4KKyAgICAgKi8KKyAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgRUVQUk9NX0VXRU5fT1BDT0RFX01JQ1JPV0lSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpKGVlcHJvbS0+b3Bjb2RlX2JpdHMgKyAyKSk7CisKKyAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgMCwgKHVpbnQxNl90KShlZXByb20tPmFkZHJlc3NfYml0cyAtIDIpKTsKKworICAgIC8qIFByZXBhcmUgdGhlIEVFUFJPTSAqLworICAgIGUxMDAwX3N0YW5kYnlfZWVwcm9tKGh3KTsKKworICAgIHdoaWxlICh3b3Jkc193cml0dGVuIDwgd29yZHMpIHsKKyAgICAgICAgLyogU2VuZCB0aGUgV3JpdGUgY29tbWFuZCAoMy1iaXQgb3Bjb2RlICsgYWRkcikgKi8KKyAgICAgICAgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsIEVFUFJPTV9XUklURV9PUENPREVfTUlDUk9XSVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZXByb20tPm9wY29kZV9iaXRzKTsKKworICAgICAgICBlMTAwMF9zaGlmdF9vdXRfZWVfYml0cyhodywgKHVpbnQxNl90KShvZmZzZXQgKyB3b3Jkc193cml0dGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWVwcm9tLT5hZGRyZXNzX2JpdHMpOworCisgICAgICAgIC8qIFNlbmQgdGhlIGRhdGEgKi8KKyAgICAgICAgZTEwMDBfc2hpZnRfb3V0X2VlX2JpdHMoaHcsIGRhdGFbd29yZHNfd3JpdHRlbl0sIDE2KTsKKworICAgICAgICAvKiBUb2dnbGUgdGhlIENTIGxpbmUuICBUaGlzIGluIGVmZmVjdCB0ZWxscyB0aGUgRUVQUk9NIHRvIGV4ZWN1dGUKKyAgICAgICAgICogdGhlIHByZXZpb3VzIGNvbW1hbmQuCisgICAgICAgICAqLworICAgICAgICBlMTAwMF9zdGFuZGJ5X2VlcHJvbShodyk7CisKKyAgICAgICAgLyogUmVhZCBETyByZXBlYXRlZGx5IHVudGlsIGl0IGlzIGhpZ2ggKGVxdWFsIHRvICcxJykuICBUaGUgRUVQUk9NIHdpbGwKKyAgICAgICAgICogc2lnbmFsIHRoYXQgdGhlIGNvbW1hbmQgaGFzIGJlZW4gY29tcGxldGVkIGJ5IHJhaXNpbmcgdGhlIERPIHNpZ25hbC4KKyAgICAgICAgICogSWYgRE8gZG9lcyBub3QgZ28gaGlnaCBpbiAxMCBtaWxsaXNlY29uZHMsIHRoZW4gZXJyb3Igb3V0LgorICAgICAgICAgKi8KKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgMjAwOyBpKyspIHsKKyAgICAgICAgICAgIGVlY2QgPSBFMTAwMF9SRUFEX1JFRyhodywgRUVDRCk7CisgICAgICAgICAgICBpZihlZWNkICYgRTEwMDBfRUVDRF9ETykgYnJlYWs7CisgICAgICAgICAgICB1ZGVsYXkoNTApOworICAgICAgICB9CisgICAgICAgIGlmKGkgPT0gMjAwKSB7CisgICAgICAgICAgICBERUJVR09VVCgiRUVQUk9NIFdyaXRlIGRpZCBub3QgY29tcGxldGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworICAgICAgICB9CisKKyAgICAgICAgLyogUmVjb3ZlciBmcm9tIHdyaXRlICovCisgICAgICAgIGUxMDAwX3N0YW5kYnlfZWVwcm9tKGh3KTsKKworICAgICAgICB3b3Jkc193cml0dGVuKys7CisgICAgfQorCisgICAgLyogU2VuZCB0aGUgd3JpdGUgZGlzYWJsZSBjb21tYW5kIHRvIHRoZSBFRVBST00gKDMtYml0IG9wY29kZSBwbHVzCisgICAgICogNi84LWJpdCBkdW1teSBhZGRyZXNzIGJlZ2lubmluZyB3aXRoIDEwKS4gIEl0J3MgbGVzcyB3b3JrIHRvIGluY2x1ZGUKKyAgICAgKiB0aGUgMTAgb2YgdGhlIGR1bW15IGFkZHJlc3MgYXMgcGFydCBvZiB0aGUgb3Bjb2RlIHRoYW4gaXQgaXMgdG8gc2hpZnQKKyAgICAgKiBpdCBvdmVyIHRoZSBjb3JyZWN0IG51bWJlciBvZiBiaXRzIGZvciB0aGUgYWRkcmVzcy4gIFRoaXMgdGFrZXMgdGhlCisgICAgICogRUVQUk9NIG91dCBvZiB3cml0ZS9lcmFzZSBtb2RlLgorICAgICAqLworICAgIGUxMDAwX3NoaWZ0X291dF9lZV9iaXRzKGh3LCBFRVBST01fRVdEU19PUENPREVfTUlDUk9XSVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCkoZWVwcm9tLT5vcGNvZGVfYml0cyArIDIpKTsKKworICAgIGUxMDAwX3NoaWZ0X291dF9lZV9iaXRzKGh3LCAwLCAodWludDE2X3QpKGVlcHJvbS0+YWRkcmVzc19iaXRzIC0gMikpOworCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlYWRzIHRoZSBhZGFwdGVyJ3MgcGFydCBudW1iZXIgZnJvbSB0aGUgRUVQUk9NCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIHBhcnRfbnVtIC0gQWRhcHRlcidzIHBhcnQgbnVtYmVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9yZWFkX3BhcnRfbnVtKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwYXJ0X251bSkKK3sKKyAgICB1aW50MTZfdCBvZmZzZXQgPSBFRVBST01fUEJBX0JZVEVfMTsKKyAgICB1aW50MTZfdCBlZXByb21fZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfcmVhZF9wYXJ0X251bSIpOworCisgICAgLyogR2V0IHdvcmQgMCBmcm9tIEVFUFJPTSAqLworICAgIGlmKGUxMDAwX3JlYWRfZWVwcm9tKGh3LCBvZmZzZXQsIDEsICZlZXByb21fZGF0YSkgPCAwKSB7CisgICAgICAgIERFQlVHT1VUKCJFRVBST00gUmVhZCBFcnJvclxuIik7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICB9CisgICAgLyogU2F2ZSB3b3JkIDAgaW4gdXBwZXIgaGFsZiBvZiBwYXJ0X251bSAqLworICAgICpwYXJ0X251bSA9ICh1aW50MzJfdCkgKGVlcHJvbV9kYXRhIDw8IDE2KTsKKworICAgIC8qIEdldCB3b3JkIDEgZnJvbSBFRVBST00gKi8KKyAgICBpZihlMTAwMF9yZWFkX2VlcHJvbShodywgKytvZmZzZXQsIDEsICZlZXByb21fZGF0YSkgPCAwKSB7CisgICAgICAgIERFQlVHT1VUKCJFRVBST00gUmVhZCBFcnJvclxuIik7CisgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICB9CisgICAgLyogU2F2ZSB3b3JkIDEgaW4gbG93ZXIgaGFsZiBvZiBwYXJ0X251bSAqLworICAgICpwYXJ0X251bSB8PSBlZXByb21fZGF0YTsKKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWFkcyB0aGUgYWRhcHRlcidzIE1BQyBhZGRyZXNzIGZyb20gdGhlIEVFUFJPTSBhbmQgaW52ZXJ0cyB0aGUgTFNCIGZvciB0aGUKKyAqIHNlY29uZCBmdW5jdGlvbiBvZiBkdWFsIGZ1bmN0aW9uIGRldmljZXMKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfcmVhZF9tYWNfYWRkcihzdHJ1Y3QgZTEwMDBfaHcgKiBodykKK3sKKyAgICB1aW50MTZfdCBvZmZzZXQ7CisgICAgdWludDE2X3QgZWVwcm9tX2RhdGEsIGk7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3JlYWRfbWFjX2FkZHIiKTsKKworICAgIGZvcihpID0gMDsgaSA8IE5PREVfQUREUkVTU19TSVpFOyBpICs9IDIpIHsKKyAgICAgICAgb2Zmc2V0ID0gaSA+PiAxOworICAgICAgICBpZihlMTAwMF9yZWFkX2VlcHJvbShodywgb2Zmc2V0LCAxLCAmZWVwcm9tX2RhdGEpIDwgMCkgeworICAgICAgICAgICAgREVCVUdPVVQoIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtRTEwMDBfRVJSX0VFUFJPTTsKKyAgICAgICAgfQorICAgICAgICBody0+cGVybV9tYWNfYWRkcltpXSA9ICh1aW50OF90KSAoZWVwcm9tX2RhdGEgJiAweDAwRkYpOworICAgICAgICBody0+cGVybV9tYWNfYWRkcltpKzFdID0gKHVpbnQ4X3QpIChlZXByb21fZGF0YSA+PiA4KTsKKyAgICB9CisgICAgaWYoKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDYpIHx8IChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDZfcmV2XzMpKSAmJgorICAgICAgIChFMTAwMF9SRUFEX1JFRyhodywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19GVU5DXzEpKQorICAgICAgICAgICAgaHctPnBlcm1fbWFjX2FkZHJbNV0gXj0gMHgwMTsKKworICAgIGZvcihpID0gMDsgaSA8IE5PREVfQUREUkVTU19TSVpFOyBpKyspCisgICAgICAgIGh3LT5tYWNfYWRkcltpXSA9IGh3LT5wZXJtX21hY19hZGRyW2ldOworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbml0aWFsaXplcyByZWNlaXZlIGFkZHJlc3MgZmlsdGVycy4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFBsYWNlcyB0aGUgTUFDIGFkZHJlc3MgaW4gcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVyIDAgYW5kIGNsZWFycyB0aGUgcmVzdAorICogb2YgdGhlIHJlY2VpdmUgYWRkcmVzc3MgcmVnaXN0ZXJzLiBDbGVhcnMgdGhlIG11bHRpY2FzdCB0YWJsZS4gQXNzdW1lcworICogdGhlIHJlY2VpdmVyIGlzIGluIHJlc2V0IHdoZW4gdGhlIHJvdXRpbmUgaXMgY2FsbGVkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZTEwMDBfaW5pdF9yeF9hZGRycyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIHVpbnQzMl90IGk7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2luaXRfcnhfYWRkcnMiKTsKKworICAgIC8qIFNldHVwIHRoZSByZWNlaXZlIGFkZHJlc3MuICovCisgICAgREVCVUdPVVQoIlByb2dyYW1taW5nIE1BQyBBZGRyZXNzIGludG8gUkFSWzBdXG4iKTsKKworICAgIGUxMDAwX3Jhcl9zZXQoaHcsIGh3LT5tYWNfYWRkciwgMCk7CisKKyAgICAvKiBaZXJvIG91dCB0aGUgb3RoZXIgMTUgcmVjZWl2ZSBhZGRyZXNzZXMuICovCisgICAgREVCVUdPVVQoIkNsZWFyaW5nIFJBUlsxLTE1XVxuIik7CisgICAgZm9yKGkgPSAxOyBpIDwgRTEwMDBfUkFSX0VOVFJJRVM7IGkrKykgeworICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFJBLCAoaSA8PCAxKSwgMCk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgUkEsICgoaSA8PCAxKSArIDEpLCAwKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFVwZGF0ZXMgdGhlIE1BQydzIGxpc3Qgb2YgbXVsdGljYXN0IGFkZHJlc3Nlcy4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogbWNfYWRkcl9saXN0IC0gdGhlIGxpc3Qgb2YgbmV3IG11bHRpY2FzdCBhZGRyZXNzZXMKKyAqIG1jX2FkZHJfY291bnQgLSBudW1iZXIgb2YgYWRkcmVzc2VzCisgKiBwYWQgLSBudW1iZXIgb2YgYnl0ZXMgYmV0d2VlbiBhZGRyZXNzZXMgaW4gdGhlIGxpc3QKKyAqIHJhcl91c2VkX2NvdW50IC0gb2Zmc2V0IHdoZXJlIHRvIHN0YXJ0IGFkZGluZyBtYyBhZGRyZXNzZXMgaW50byB0aGUgUkFSJ3MKKyAqCisgKiBUaGUgZ2l2ZW4gbGlzdCByZXBsYWNlcyBhbnkgZXhpc3RpbmcgbGlzdC4gQ2xlYXJzIHRoZSBsYXN0IDE1IHJlY2VpdmUKKyAqIGFkZHJlc3MgcmVnaXN0ZXJzIGFuZCB0aGUgbXVsdGljYXN0IHRhYmxlLiBVc2VzIHJlY2VpdmUgYWRkcmVzcyByZWdpc3RlcnMKKyAqIGZvciB0aGUgZmlyc3QgMTUgbXVsdGljYXN0IGFkZHJlc3NlcywgYW5kIGhhc2hlcyB0aGUgcmVzdCBpbnRvIHRoZQorICogbXVsdGljYXN0IHRhYmxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZTEwMDBfbWNfYWRkcl9saXN0X3VwZGF0ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICptY19hZGRyX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1jX2FkZHJfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmFyX3VzZWRfY291bnQpCit7CisgICAgdWludDMyX3QgaGFzaF92YWx1ZTsKKyAgICB1aW50MzJfdCBpOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9tY19hZGRyX2xpc3RfdXBkYXRlIik7CisKKyAgICAvKiBTZXQgdGhlIG5ldyBudW1iZXIgb2YgTUMgYWRkcmVzc2VzIHRoYXQgd2UgYXJlIGJlaW5nIHJlcXVlc3RlZCB0byB1c2UuICovCisgICAgaHctPm51bV9tY19hZGRycyA9IG1jX2FkZHJfY291bnQ7CisKKyAgICAvKiBDbGVhciBSQVJbMS0xNV0gKi8KKyAgICBERUJVR09VVCgiIENsZWFyaW5nIFJBUlsxLTE1XVxuIik7CisgICAgZm9yKGkgPSByYXJfdXNlZF9jb3VudDsgaSA8IEUxMDAwX1JBUl9FTlRSSUVTOyBpKyspIHsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBSQSwgKGkgPDwgMSksIDApOworICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFJBLCAoKGkgPDwgMSkgKyAxKSwgMCk7CisgICAgfQorCisgICAgLyogQ2xlYXIgdGhlIE1UQSAqLworICAgIERFQlVHT1VUKCIgQ2xlYXJpbmcgTVRBXG4iKTsKKyAgICBmb3IoaSA9IDA7IGkgPCBFMTAwMF9OVU1fTVRBX1JFR0lTVEVSUzsgaSsrKSB7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgTVRBLCBpLCAwKTsKKyAgICB9CisKKyAgICAvKiBBZGQgdGhlIG5ldyBhZGRyZXNzZXMgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBtY19hZGRyX2NvdW50OyBpKyspIHsKKyAgICAgICAgREVCVUdPVVQoIiBBZGRpbmcgdGhlIG11bHRpY2FzdCBhZGRyZXNzZXM6XG4iKTsKKyAgICAgICAgREVCVUdPVVQ3KCIgTUMgQWRkciAjJWQgPSUuMlggJS4yWCAlLjJYICUuMlggJS4yWCAlLjJYXG4iLCBpLAorICAgICAgICAgICAgICAgICAgbWNfYWRkcl9saXN0W2kgKiAoRVRIX0xFTkdUSF9PRl9BRERSRVNTICsgcGFkKV0sCisgICAgICAgICAgICAgICAgICBtY19hZGRyX2xpc3RbaSAqIChFVEhfTEVOR1RIX09GX0FERFJFU1MgKyBwYWQpICsgMV0sCisgICAgICAgICAgICAgICAgICBtY19hZGRyX2xpc3RbaSAqIChFVEhfTEVOR1RIX09GX0FERFJFU1MgKyBwYWQpICsgMl0sCisgICAgICAgICAgICAgICAgICBtY19hZGRyX2xpc3RbaSAqIChFVEhfTEVOR1RIX09GX0FERFJFU1MgKyBwYWQpICsgM10sCisgICAgICAgICAgICAgICAgICBtY19hZGRyX2xpc3RbaSAqIChFVEhfTEVOR1RIX09GX0FERFJFU1MgKyBwYWQpICsgNF0sCisgICAgICAgICAgICAgICAgICBtY19hZGRyX2xpc3RbaSAqIChFVEhfTEVOR1RIX09GX0FERFJFU1MgKyBwYWQpICsgNV0pOworCisgICAgICAgIGhhc2hfdmFsdWUgPSBlMTAwMF9oYXNoX21jX2FkZHIoaHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWNfYWRkcl9saXN0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSAqIChFVEhfTEVOR1RIX09GX0FERFJFU1MgKyBwYWQpKSk7CisKKyAgICAgICAgREVCVUdPVVQxKCIgSGFzaCB2YWx1ZSA9IDB4JTAzWFxuIiwgaGFzaF92YWx1ZSk7CisKKyAgICAgICAgLyogUGxhY2UgdGhpcyBtdWx0aWNhc3QgYWRkcmVzcyBpbiB0aGUgUkFSIGlmIHRoZXJlIGlzIHJvb20sICoKKyAgICAgICAgICogZWxzZSBwdXQgaXQgaW4gdGhlIE1UQQorICAgICAgICAgKi8KKyAgICAgICAgaWYocmFyX3VzZWRfY291bnQgPCBFMTAwMF9SQVJfRU5UUklFUykgeworICAgICAgICAgICAgZTEwMDBfcmFyX3NldChodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWNfYWRkcl9saXN0ICsgKGkgKiAoRVRIX0xFTkdUSF9PRl9BRERSRVNTICsgcGFkKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJhcl91c2VkX2NvdW50KTsKKyAgICAgICAgICAgIHJhcl91c2VkX2NvdW50Kys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlMTAwMF9tdGFfc2V0KGh3LCBoYXNoX3ZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBERUJVR09VVCgiTUMgVXBkYXRlIENvbXBsZXRlXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSGFzaGVzIGFuIGFkZHJlc3MgdG8gZGV0ZXJtaW5lIGl0cyBsb2NhdGlvbiBpbiB0aGUgbXVsdGljYXN0IHRhYmxlCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIG1jX2FkZHIgLSB0aGUgbXVsdGljYXN0IGFkZHJlc3MgdG8gaGFzaAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMyX3QKK2UxMDAwX2hhc2hfbWNfYWRkcihzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm1jX2FkZHIpCit7CisgICAgdWludDMyX3QgaGFzaF92YWx1ZSA9IDA7CisKKyAgICAvKiBUaGUgcG9ydGlvbiBvZiB0aGUgYWRkcmVzcyB0aGF0IGlzIHVzZWQgZm9yIHRoZSBoYXNoIHRhYmxlIGlzCisgICAgICogZGV0ZXJtaW5lZCBieSB0aGUgbWNfZmlsdGVyX3R5cGUgc2V0dGluZy4KKyAgICAgKi8KKyAgICBzd2l0Y2ggKGh3LT5tY19maWx0ZXJfdHlwZSkgeworICAgIC8qIFswXSBbMV0gWzJdIFszXSBbNF0gWzVdCisgICAgICogMDEgIEFBICAwMCAgMTIgIDM0ICA1NgorICAgICAqIExTQiAgICAgICAgICAgICAgICAgTVNCCisgICAgICovCisgICAgY2FzZSAwOgorICAgICAgICAvKiBbNDc6MzZdIGkuZS4gMHg1NjMgZm9yIGFib3ZlIGV4YW1wbGUgYWRkcmVzcyAqLworICAgICAgICBoYXNoX3ZhbHVlID0gKChtY19hZGRyWzRdID4+IDQpIHwgKCgodWludDE2X3QpIG1jX2FkZHJbNV0pIDw8IDQpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICAvKiBbNDY6MzVdIGkuZS4gMHhBQzYgZm9yIGFib3ZlIGV4YW1wbGUgYWRkcmVzcyAqLworICAgICAgICBoYXNoX3ZhbHVlID0gKChtY19hZGRyWzRdID4+IDMpIHwgKCgodWludDE2X3QpIG1jX2FkZHJbNV0pIDw8IDUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICAvKiBbNDU6MzRdIGkuZS4gMHg1RDggZm9yIGFib3ZlIGV4YW1wbGUgYWRkcmVzcyAqLworICAgICAgICBoYXNoX3ZhbHVlID0gKChtY19hZGRyWzRdID4+IDIpIHwgKCgodWludDE2X3QpIG1jX2FkZHJbNV0pIDw8IDYpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICAvKiBbNDM6MzJdIGkuZS4gMHg2MzQgZm9yIGFib3ZlIGV4YW1wbGUgYWRkcmVzcyAqLworICAgICAgICBoYXNoX3ZhbHVlID0gKChtY19hZGRyWzRdKSB8ICgoKHVpbnQxNl90KSBtY19hZGRyWzVdKSA8PCA4KSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGhhc2hfdmFsdWUgJj0gMHhGRkY7CisgICAgcmV0dXJuIGhhc2hfdmFsdWU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNldHMgdGhlIGJpdCBpbiB0aGUgbXVsdGljYXN0IHRhYmxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGhhc2ggdmFsdWUuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIGhhc2hfdmFsdWUgLSBNdWx0aWNhc3QgYWRkcmVzcyBoYXNoIHZhbHVlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitlMTAwMF9tdGFfc2V0KHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgIHVpbnQzMl90IGhhc2hfdmFsdWUpCit7CisgICAgdWludDMyX3QgaGFzaF9iaXQsIGhhc2hfcmVnOworICAgIHVpbnQzMl90IG10YTsKKyAgICB1aW50MzJfdCB0ZW1wOworCisgICAgLyogVGhlIE1UQSBpcyBhIHJlZ2lzdGVyIGFycmF5IG9mIDEyOCAzMi1iaXQgcmVnaXN0ZXJzLgorICAgICAqIEl0IGlzIHRyZWF0ZWQgbGlrZSBhbiBhcnJheSBvZiA0MDk2IGJpdHMuICBXZSB3YW50IHRvIHNldAorICAgICAqIGJpdCBCaXRBcnJheVtoYXNoX3ZhbHVlXS4gU28gd2UgZmlndXJlIG91dCB3aGF0IHJlZ2lzdGVyCisgICAgICogdGhlIGJpdCBpcyBpbiwgcmVhZCBpdCwgT1IgaW4gdGhlIG5ldyBiaXQsIHRoZW4gd3JpdGUKKyAgICAgKiBiYWNrIHRoZSBuZXcgdmFsdWUuICBUaGUgcmVnaXN0ZXIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKKyAgICAgKiB1cHBlciA3IGJpdHMgb2YgdGhlIGhhc2ggdmFsdWUgYW5kIHRoZSBiaXQgd2l0aGluIHRoYXQKKyAgICAgKiByZWdpc3RlciBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbG93ZXIgNSBiaXRzIG9mIHRoZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBoYXNoX3JlZyA9IChoYXNoX3ZhbHVlID4+IDUpICYgMHg3RjsKKyAgICBoYXNoX2JpdCA9IGhhc2hfdmFsdWUgJiAweDFGOworCisgICAgbXRhID0gRTEwMDBfUkVBRF9SRUdfQVJSQVkoaHcsIE1UQSwgaGFzaF9yZWcpOworCisgICAgbXRhIHw9ICgxIDw8IGhhc2hfYml0KTsKKworICAgIC8qIElmIHdlIGFyZSBvbiBhbiA4MjU0NCBhbmQgd2UgYXJlIHRyeWluZyB0byB3cml0ZSBhbiBvZGQgb2Zmc2V0CisgICAgICogaW4gdGhlIE1UQSwgc2F2ZSBvZmYgdGhlIHByZXZpb3VzIGVudHJ5IGJlZm9yZSB3cml0aW5nIGFuZAorICAgICAqIHJlc3RvcmUgdGhlIG9sZCB2YWx1ZSBhZnRlciB3cml0aW5nLgorICAgICAqLworICAgIGlmKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDQpICYmICgoaGFzaF9yZWcgJiAweDEpID09IDEpKSB7CisgICAgICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFR19BUlJBWShodywgTVRBLCAoaGFzaF9yZWcgLSAxKSk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgTVRBLCBoYXNoX3JlZywgbXRhKTsKKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBNVEEsIChoYXNoX3JlZyAtIDEpLCB0ZW1wKTsKKyAgICB9IGVsc2UgeworICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIE1UQSwgaGFzaF9yZWcsIG10YSk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQdXRzIGFuIGV0aGVybmV0IGFkZHJlc3MgaW50byBhIHJlY2VpdmUgYWRkcmVzcyByZWdpc3Rlci4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogYWRkciAtIEFkZHJlc3MgdG8gcHV0IGludG8gcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVyCisgKiBpbmRleCAtIFJlY2VpdmUgYWRkcmVzcyByZWdpc3RlciB0byB3cml0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZTEwMDBfcmFyX3NldChzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICB1aW50OF90ICphZGRyLAorICAgICAgICAgICAgICB1aW50MzJfdCBpbmRleCkKK3sKKyAgICB1aW50MzJfdCByYXJfbG93LCByYXJfaGlnaDsKKworICAgIC8qIEhXIGV4cGVjdHMgdGhlc2UgaW4gbGl0dGxlIGVuZGlhbiBzbyB3ZSByZXZlcnNlIHRoZSBieXRlIG9yZGVyCisgICAgICogZnJvbSBuZXR3b3JrIG9yZGVyIChiaWcgZW5kaWFuKSB0byBsaXR0bGUgZW5kaWFuCisgICAgICovCisgICAgcmFyX2xvdyA9ICgodWludDMyX3QpIGFkZHJbMF0gfAorICAgICAgICAgICAgICAgKCh1aW50MzJfdCkgYWRkclsxXSA8PCA4KSB8CisgICAgICAgICAgICAgICAoKHVpbnQzMl90KSBhZGRyWzJdIDw8IDE2KSB8ICgodWludDMyX3QpIGFkZHJbM10gPDwgMjQpKTsKKworICAgIHJhcl9oaWdoID0gKCh1aW50MzJfdCkgYWRkcls0XSB8ICgodWludDMyX3QpIGFkZHJbNV0gPDwgOCkgfCBFMTAwMF9SQUhfQVYpOworCisgICAgRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBSQSwgKGluZGV4IDw8IDEpLCByYXJfbG93KTsKKyAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFJBLCAoKGluZGV4IDw8IDEpICsgMSksIHJhcl9oaWdoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV3JpdGVzIGEgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBvZmZzZXQgaW4gdGhlIFZMQU4gZmlsdGVyIHRhYmxlLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBvZmZzZXQgLSBPZmZzZXQgaW4gVkxBTiBmaWxlciB0YWJsZSB0byB3cml0ZQorICogdmFsdWUgLSBWYWx1ZSB0byB3cml0ZSBpbnRvIFZMQU4gZmlsdGVyIHRhYmxlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitlMTAwMF93cml0ZV92ZnRhKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpCit7CisgICAgdWludDMyX3QgdGVtcDsKKworICAgIGlmKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDQpICYmICgob2Zmc2V0ICYgMHgxKSA9PSAxKSkgeworICAgICAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUdfQVJSQVkoaHcsIFZGVEEsIChvZmZzZXQgLSAxKSk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgVkZUQSwgb2Zmc2V0LCB2YWx1ZSk7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgVkZUQSwgKG9mZnNldCAtIDEpLCB0ZW1wKTsKKyAgICB9IGVsc2UgeworICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFZGVEEsIG9mZnNldCwgdmFsdWUpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2xlYXJzIHRoZSBWTEFOIGZpbGVyIHRhYmxlCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2UxMDAwX2NsZWFyX3ZmdGEoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBvZmZzZXQ7CisKKyAgICBmb3Iob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgRTEwMDBfVkxBTl9GSUxURVJfVEJMX1NJWkU7IG9mZnNldCsrKQorICAgICAgICBFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIFZGVEEsIG9mZnNldCwgMCk7Cit9CisKK3N0YXRpYyBpbnQzMl90CitlMTAwMF9pZF9sZWRfaW5pdChzdHJ1Y3QgZTEwMDBfaHcgKiBodykKK3sKKyAgICB1aW50MzJfdCBsZWRjdGw7CisgICAgY29uc3QgdWludDMyX3QgbGVkY3RsX21hc2sgPSAweDAwMDAwMEZGOworICAgIGNvbnN0IHVpbnQzMl90IGxlZGN0bF9vbiA9IEUxMDAwX0xFRENUTF9NT0RFX0xFRF9PTjsKKyAgICBjb25zdCB1aW50MzJfdCBsZWRjdGxfb2ZmID0gRTEwMDBfTEVEQ1RMX01PREVfTEVEX09GRjsKKyAgICB1aW50MTZfdCBlZXByb21fZGF0YSwgaSwgdGVtcDsKKyAgICBjb25zdCB1aW50MTZfdCBsZWRfbWFzayA9IDB4MEY7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2lkX2xlZF9pbml0Iik7CisKKyAgICBpZihody0+bWFjX3R5cGUgPCBlMTAwMF84MjU0MCkgeworICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCisgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworICAgIH0KKworICAgIGxlZGN0bCA9IEUxMDAwX1JFQURfUkVHKGh3LCBMRURDVEwpOworICAgIGh3LT5sZWRjdGxfZGVmYXVsdCA9IGxlZGN0bDsKKyAgICBody0+bGVkY3RsX21vZGUxID0gaHctPmxlZGN0bF9kZWZhdWx0OworICAgIGh3LT5sZWRjdGxfbW9kZTIgPSBody0+bGVkY3RsX2RlZmF1bHQ7CisKKyAgICBpZihlMTAwMF9yZWFkX2VlcHJvbShodywgRUVQUk9NX0lEX0xFRF9TRVRUSU5HUywgMSwgJmVlcHJvbV9kYXRhKSA8IDApIHsKKyAgICAgICAgREVCVUdPVVQoIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FMTAwMF9FUlJfRUVQUk9NOworICAgIH0KKyAgICBpZigoZWVwcm9tX2RhdGE9PSBJRF9MRURfUkVTRVJWRURfMDAwMCkgfHwKKyAgICAgICAoZWVwcm9tX2RhdGEgPT0gSURfTEVEX1JFU0VSVkVEX0ZGRkYpKSBlZXByb21fZGF0YSA9IElEX0xFRF9ERUZBVUxUOworICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICB0ZW1wID0gKGVlcHJvbV9kYXRhID4+IChpIDw8IDIpKSAmIGxlZF9tYXNrOworICAgICAgICBzd2l0Y2godGVtcCkgeworICAgICAgICBjYXNlIElEX0xFRF9PTjFfREVGMjoKKyAgICAgICAgY2FzZSBJRF9MRURfT04xX09OMjoKKyAgICAgICAgY2FzZSBJRF9MRURfT04xX09GRjI6CisgICAgICAgICAgICBody0+bGVkY3RsX21vZGUxICY9IH4obGVkY3RsX21hc2sgPDwgKGkgPDwgMykpOworICAgICAgICAgICAgaHctPmxlZGN0bF9tb2RlMSB8PSBsZWRjdGxfb24gPDwgKGkgPDwgMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJRF9MRURfT0ZGMV9ERUYyOgorICAgICAgICBjYXNlIElEX0xFRF9PRkYxX09OMjoKKyAgICAgICAgY2FzZSBJRF9MRURfT0ZGMV9PRkYyOgorICAgICAgICAgICAgaHctPmxlZGN0bF9tb2RlMSAmPSB+KGxlZGN0bF9tYXNrIDw8IChpIDw8IDMpKTsKKyAgICAgICAgICAgIGh3LT5sZWRjdGxfbW9kZTEgfD0gbGVkY3RsX29mZiA8PCAoaSA8PCAzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogRG8gbm90aGluZyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoKHRlbXApIHsKKyAgICAgICAgY2FzZSBJRF9MRURfREVGMV9PTjI6CisgICAgICAgIGNhc2UgSURfTEVEX09OMV9PTjI6CisgICAgICAgIGNhc2UgSURfTEVEX09GRjFfT04yOgorICAgICAgICAgICAgaHctPmxlZGN0bF9tb2RlMiAmPSB+KGxlZGN0bF9tYXNrIDw8IChpIDw8IDMpKTsKKyAgICAgICAgICAgIGh3LT5sZWRjdGxfbW9kZTIgfD0gbGVkY3RsX29uIDw8IChpIDw8IDMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSURfTEVEX0RFRjFfT0ZGMjoKKyAgICAgICAgY2FzZSBJRF9MRURfT04xX09GRjI6CisgICAgICAgIGNhc2UgSURfTEVEX09GRjFfT0ZGMjoKKyAgICAgICAgICAgIGh3LT5sZWRjdGxfbW9kZTIgJj0gfihsZWRjdGxfbWFzayA8PCAoaSA8PCAzKSk7CisgICAgICAgICAgICBody0+bGVkY3RsX21vZGUyIHw9IGxlZGN0bF9vZmYgPDwgKGkgPDwgMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8qIERvIG5vdGhpbmcgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcmVwYXJlcyBTVyBjb250cm9sYWJsZSBMRUQgZm9yIHVzZSBhbmQgc2F2ZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIExFRC4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdAorZTEwMDBfc2V0dXBfbGVkKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3QgbGVkY3RsOworICAgIGludDMyX3QgcmV0X3ZhbCA9IEUxMDAwX1NVQ0NFU1M7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3NldHVwX2xlZCIpOworCisgICAgc3dpdGNoKGh3LT5tYWNfdHlwZSkgeworICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8wOgorICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgorICAgIGNhc2UgZTEwMDBfODI1NDM6CisgICAgY2FzZSBlMTAwMF84MjU0NDoKKyAgICAgICAgLyogTm8gc2V0dXAgbmVjZXNzYXJ5ICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfODI1NDE6CisgICAgY2FzZSBlMTAwMF84MjU0NzoKKyAgICBjYXNlIGUxMDAwXzgyNTQxX3Jldl8yOgorICAgIGNhc2UgZTEwMDBfODI1NDdfcmV2XzI6CisgICAgICAgIC8qIFR1cm4gb2ZmIFBIWSBTbWFydCBQb3dlciBEb3duIChpZiBlbmFibGVkKSAqLworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX0dNSUlfRklGTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaHctPnBoeV9zcGRfZGVmYXVsdCk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfR01JSV9GSUZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpKGh3LT5waHlfc3BkX2RlZmF1bHQgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+SUdQMDFFMTAwMF9HTUlJX1NQRCkpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgIC8qIEZhbGwgVGhyb3VnaCAqLworICAgIGRlZmF1bHQ6CisgICAgICAgIGlmKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHsKKyAgICAgICAgICAgIGxlZGN0bCA9IEUxMDAwX1JFQURfUkVHKGh3LCBMRURDVEwpOworICAgICAgICAgICAgLyogU2F2ZSBjdXJyZW50IExFRENUTCBzZXR0aW5ncyAqLworICAgICAgICAgICAgaHctPmxlZGN0bF9kZWZhdWx0ID0gbGVkY3RsOworICAgICAgICAgICAgLyogVHVybiBvZmYgTEVEMCAqLworICAgICAgICAgICAgbGVkY3RsICY9IH4oRTEwMDBfTEVEQ1RMX0xFRDBfSVZSVCB8CisgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9MRURDVExfTEVEMF9CTElOSyB8CisgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9MRURDVExfTEVEMF9NT0RFX01BU0spOworICAgICAgICAgICAgbGVkY3RsIHw9IChFMTAwMF9MRURDVExfTU9ERV9MRURfT0ZGIDw8CisgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX0xFRENUTF9MRUQwX01PREVfU0hJRlQpOworICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBMRURDVEwsIGxlZGN0bCk7CisgICAgICAgIH0gZWxzZSBpZihody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikKKyAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgTEVEQ1RMLCBody0+bGVkY3RsX21vZGUxKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlc3RvcmVzIHRoZSBzYXZlZCBzdGF0ZSBvZiB0aGUgU1cgY29udHJvbGFibGUgTEVELgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9jbGVhbnVwX2xlZChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcmV0X3ZhbCA9IEUxMDAwX1NVQ0NFU1M7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX2NsZWFudXBfbGVkIik7CisKKyAgICBzd2l0Y2goaHctPm1hY190eXBlKSB7CisgICAgY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzA6CisgICAgY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzE6CisgICAgY2FzZSBlMTAwMF84MjU0MzoKKyAgICBjYXNlIGUxMDAwXzgyNTQ0OgorICAgICAgICAvKiBObyBjbGVhbnVwIG5lY2Vzc2FyeSAqLworICAgICAgICBicmVhazsKKyAgICBjYXNlIGUxMDAwXzgyNTQxOgorICAgIGNhc2UgZTEwMDBfODI1NDc6CisgICAgY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKKyAgICBjYXNlIGUxMDAwXzgyNTQ3X3Jldl8yOgorICAgICAgICAvKiBUdXJuIG9uIFBIWSBTbWFydCBQb3dlciBEb3duIChpZiBwcmV2aW91c2x5IGVuYWJsZWQpICovCisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX0dNSUlfRklGTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHctPnBoeV9zcGRfZGVmYXVsdCk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgLyogRmFsbCBUaHJvdWdoICovCisgICAgZGVmYXVsdDoKKyAgICAgICAgLyogUmVzdG9yZSBMRURDVEwgc2V0dGluZ3MgKi8KKyAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBMRURDVEwsIGh3LT5sZWRjdGxfZGVmYXVsdCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUdXJucyBvbiB0aGUgc29mdHdhcmUgY29udHJvbGxhYmxlIExFRAorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9sZWRfb24oc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBjdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkwpOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9sZWRfb24iKTsKKworICAgIHN3aXRjaChody0+bWFjX3R5cGUpIHsKKyAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMDoKKyAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMToKKyAgICBjYXNlIGUxMDAwXzgyNTQzOgorICAgICAgICAvKiBTZXQgU1cgRGVmaW5lYWJsZSBQaW4gMCB0byB0dXJuIG9uIHRoZSBMRUQgKi8KKyAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTjA7CisgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU8wOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGUxMDAwXzgyNTQ0OgorICAgICAgICBpZihody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSB7CisgICAgICAgICAgICAvKiBTZXQgU1cgRGVmaW5lYWJsZSBQaW4gMCB0byB0dXJuIG9uIHRoZSBMRUQgKi8KKyAgICAgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU4wOworICAgICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTzA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBDbGVhciBTVyBEZWZpbmVhYmxlIFBpbiAwIHRvIHR1cm4gb24gdGhlIExFRCAqLworICAgICAgICAgICAgY3RybCAmPSB+RTEwMDBfQ1RSTF9TV0RQSU4wOworICAgICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTzA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcikgeworICAgICAgICAgICAgLyogQ2xlYXIgU1cgRGVmaW5lYWJsZSBQaW4gMCB0byB0dXJuIG9uIHRoZSBMRUQgKi8KKyAgICAgICAgICAgIGN0cmwgJj0gfkUxMDAwX0NUUkxfU1dEUElOMDsKKyAgICAgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU8wOworICAgICAgICB9IGVsc2UgaWYoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKKyAgICAgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgTEVEQ1RMLCBody0+bGVkY3RsX21vZGUyKTsKKyAgICAgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQ1RSTCwgY3RybCk7CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVHVybnMgb2ZmIHRoZSBzb2Z0d2FyZSBjb250cm9sbGFibGUgTEVECisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX2xlZF9vZmYoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICB1aW50MzJfdCBjdHJsID0gRTEwMDBfUkVBRF9SRUcoaHcsIENUUkwpOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9sZWRfb2ZmIik7CisKKyAgICBzd2l0Y2goaHctPm1hY190eXBlKSB7CisgICAgY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzA6CisgICAgY2FzZSBlMTAwMF84MjU0Ml9yZXYyXzE6CisgICAgY2FzZSBlMTAwMF84MjU0MzoKKyAgICAgICAgLyogQ2xlYXIgU1cgRGVmaW5lYWJsZSBQaW4gMCB0byB0dXJuIG9mZiB0aGUgTEVEICovCisgICAgICAgIGN0cmwgJj0gfkUxMDAwX0NUUkxfU1dEUElOMDsKKyAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTzA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgZTEwMDBfODI1NDQ6CisgICAgICAgIGlmKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHsKKyAgICAgICAgICAgIC8qIENsZWFyIFNXIERlZmluZWFibGUgUGluIDAgdG8gdHVybiBvZmYgdGhlIExFRCAqLworICAgICAgICAgICAgY3RybCAmPSB+RTEwMDBfQ1RSTF9TV0RQSU4wOworICAgICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTzA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBTZXQgU1cgRGVmaW5lYWJsZSBQaW4gMCB0byB0dXJuIG9mZiB0aGUgTEVEICovCisgICAgICAgICAgICBjdHJsIHw9IEUxMDAwX0NUUkxfU1dEUElOMDsKKyAgICAgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU8wOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGlmKGh3LT5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIpIHsKKyAgICAgICAgICAgIC8qIFNldCBTVyBEZWZpbmVhYmxlIFBpbiAwIHRvIHR1cm4gb2ZmIHRoZSBMRUQgKi8KKyAgICAgICAgICAgIGN0cmwgfD0gRTEwMDBfQ1RSTF9TV0RQSU4wOworICAgICAgICAgICAgY3RybCB8PSBFMTAwMF9DVFJMX1NXRFBJTzA7CisgICAgICAgIH0gZWxzZSBpZihody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgeworICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBMRURDVEwsIGh3LT5sZWRjdGxfbW9kZTEpOworICAgICAgICAgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBDVFJMLCBjdHJsKTsKKworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDbGVhcnMgYWxsIGhhcmR3YXJlIHN0YXRpc3RpY3MgY291bnRlcnMuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2UxMDAwX2NsZWFyX2h3X2NudHJzKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdm9sYXRpbGUgdWludDMyX3QgdGVtcDsKKworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgQ1JDRVJSUyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBTWU1FUlJTKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIE1QQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBTQ0MpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgRUNPTCk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBNQ0MpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgTEFURUNPTCk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDT0xDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIERDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFNFQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBSTEVDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFhPTlJYQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBYT05UWEMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgWE9GRlJYQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBYT0ZGVFhDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIEZDUlVDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFBSQzY0KTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFBSQzEyNyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBQUkMyNTUpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUFJDNTExKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFBSQzEwMjMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUFJDMTUyMik7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBHUFJDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIEJQUkMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgTVBSQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBHUFRDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIEdPUkNMKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIEdPUkNIKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIEdPVENMKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIEdPVENIKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFJOQkMpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUlVDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFJGQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBST0MpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUkpDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRPUkwpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgVE9SSCk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBUT1RMKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRPVEgpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgVFBSKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRQVCk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBQVEM2NCk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBQVEMxMjcpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgUFRDMjU1KTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFBUQzUxMSk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBQVEMxMDIzKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFBUQzE1MjIpOworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgTVBUQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBCUFRDKTsKKworICAgIGlmKGh3LT5tYWNfdHlwZSA8IGUxMDAwXzgyNTQzKSByZXR1cm47CisKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIEFMR05FUlJDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFJYRVJSQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBUTkNSUyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBDRVhURVJSKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRTQ1RDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRTQ1RGQyk7CisKKyAgICBpZihody0+bWFjX3R5cGUgPD0gZTEwMDBfODI1NDQpIHJldHVybjsKKworICAgIHRlbXAgPSBFMTAwMF9SRUFEX1JFRyhodywgTUdUUFJDKTsKKyAgICB0ZW1wID0gRTEwMDBfUkVBRF9SRUcoaHcsIE1HVFBEQyk7CisgICAgdGVtcCA9IEUxMDAwX1JFQURfUkVHKGh3LCBNR1RQVEMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZXNldHMgQWRhcHRpdmUgSUZTIHRvIGl0cyBkZWZhdWx0IHN0YXRlLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogQ2FsbCB0aGlzIGFmdGVyIGUxMDAwX2luaXRfaHcuIFlvdSBtYXkgb3ZlcnJpZGUgdGhlIElGUyBkZWZhdWx0cyBieSBzZXR0aW5nCisgKiBody0+aWZzX3BhcmFtc19mb3JjZWQgdG8gVFJVRS4gSG93ZXZlciwgeW91IG11c3QgaW5pdGlhbGl6ZSBody0+CisgKiBjdXJyZW50X2lmc192YWwsIGlmc19taW5fdmFsLCBpZnNfbWF4X3ZhbCwgaWZzX3N0ZXBfc2l6ZSwgYW5kIGlmc19yYXRpbworICogYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2UxMDAwX3Jlc2V0X2FkYXB0aXZlKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgREVCVUdGVU5DKCJlMTAwMF9yZXNldF9hZGFwdGl2ZSIpOworCisgICAgaWYoaHctPmFkYXB0aXZlX2lmcykgeworICAgICAgICBpZighaHctPmlmc19wYXJhbXNfZm9yY2VkKSB7CisgICAgICAgICAgICBody0+Y3VycmVudF9pZnNfdmFsID0gMDsKKyAgICAgICAgICAgIGh3LT5pZnNfbWluX3ZhbCA9IElGU19NSU47CisgICAgICAgICAgICBody0+aWZzX21heF92YWwgPSBJRlNfTUFYOworICAgICAgICAgICAgaHctPmlmc19zdGVwX3NpemUgPSBJRlNfU1RFUDsKKyAgICAgICAgICAgIGh3LT5pZnNfcmF0aW8gPSBJRlNfUkFUSU87CisgICAgICAgIH0KKyAgICAgICAgaHctPmluX2lmc19tb2RlID0gRkFMU0U7CisgICAgICAgIEUxMDAwX1dSSVRFX1JFRyhodywgQUlULCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERUJVR09VVCgiTm90IGluIEFkYXB0aXZlIElGUyBtb2RlIVxuIik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDYWxsZWQgZHVyaW5nIHRoZSBjYWxsYmFjay93YXRjaGRvZyByb3V0aW5lIHRvIHVwZGF0ZSBJRlMgdmFsdWUgYmFzZWQgb24KKyAqIHRoZSByYXRpbyBvZiB0cmFuc21pdHMgdG8gY29sbGlzaW9ucy4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogdHhfcGFja2V0cyAtIE51bWJlciBvZiB0cmFuc21pdHMgc2luY2UgbGFzdCBjYWxsYmFjaworICogdG90YWxfY29sbGlzaW9ucyAtIE51bWJlciBvZiBjb2xsaXNpb25zIHNpbmNlIGxhc3QgY2FsbGJhY2sKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2UxMDAwX3VwZGF0ZV9hZGFwdGl2ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIERFQlVHRlVOQygiZTEwMDBfdXBkYXRlX2FkYXB0aXZlIik7CisKKyAgICBpZihody0+YWRhcHRpdmVfaWZzKSB7CisgICAgICAgIGlmKChody0+Y29sbGlzaW9uX2RlbHRhICogaHctPmlmc19yYXRpbykgPiBody0+dHhfcGFja2V0X2RlbHRhKSB7CisgICAgICAgICAgICBpZihody0+dHhfcGFja2V0X2RlbHRhID4gTUlOX05VTV9YTUlUUykgeworICAgICAgICAgICAgICAgIGh3LT5pbl9pZnNfbW9kZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgaWYoaHctPmN1cnJlbnRfaWZzX3ZhbCA8IGh3LT5pZnNfbWF4X3ZhbCkgeworICAgICAgICAgICAgICAgICAgICBpZihody0+Y3VycmVudF9pZnNfdmFsID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBody0+Y3VycmVudF9pZnNfdmFsID0gaHctPmlmc19taW5fdmFsOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBody0+Y3VycmVudF9pZnNfdmFsICs9IGh3LT5pZnNfc3RlcF9zaXplOworICAgICAgICAgICAgICAgICAgICBFMTAwMF9XUklURV9SRUcoaHcsIEFJVCwgaHctPmN1cnJlbnRfaWZzX3ZhbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYoaHctPmluX2lmc19tb2RlICYmIChody0+dHhfcGFja2V0X2RlbHRhIDw9IE1JTl9OVU1fWE1JVFMpKSB7CisgICAgICAgICAgICAgICAgaHctPmN1cnJlbnRfaWZzX3ZhbCA9IDA7CisgICAgICAgICAgICAgICAgaHctPmluX2lmc19tb2RlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgRTEwMDBfV1JJVEVfUkVHKGh3LCBBSVQsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgREVCVUdPVVQoIk5vdCBpbiBBZGFwdGl2ZSBJRlMgbW9kZSFcbiIpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQWRqdXN0cyB0aGUgc3RhdGlzdGljIGNvdW50ZXJzIHdoZW4gYSBmcmFtZSBpcyBhY2NlcHRlZCBieSBUQklfQUNDRVBUCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIGZyYW1lX2xlbiAtIFRoZSBsZW5ndGggb2YgdGhlIGZyYW1lIGluIHF1ZXN0aW9uCisgKiBtYWNfYWRkciAtIFRoZSBFdGhlcm5ldCBkZXN0aW5hdGlvbiBhZGRyZXNzIG9mIHRoZSBmcmFtZSBpbiBxdWVzdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZTEwMDBfdGJpX2FkanVzdF9zdGF0cyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZTEwMDBfaHdfc3RhdHMgKnN0YXRzLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmcmFtZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm1hY19hZGRyKQoreworICAgIHVpbnQ2NF90IGNhcnJ5X2JpdDsKKworICAgIC8qIEZpcnN0IGFkanVzdCB0aGUgZnJhbWUgbGVuZ3RoLiAqLworICAgIGZyYW1lX2xlbi0tOworICAgIC8qIFdlIG5lZWQgdG8gYWRqdXN0IHRoZSBzdGF0aXN0aWNzIGNvdW50ZXJzLCBzaW5jZSB0aGUgaGFyZHdhcmUKKyAgICAgKiBjb3VudGVycyBvdmVyY291bnQgdGhpcyBwYWNrZXQgYXMgYSBDUkMgZXJyb3IgYW5kIHVuZGVyY291bnQKKyAgICAgKiB0aGUgcGFja2V0IGFzIGEgZ29vZCBwYWNrZXQKKyAgICAgKi8KKyAgICAvKiBUaGlzIHBhY2tldCBzaG91bGQgbm90IGJlIGNvdW50ZWQgYXMgYSBDUkMgZXJyb3IuICAgICovCisgICAgc3RhdHMtPmNyY2VycnMtLTsKKyAgICAvKiBUaGlzIHBhY2tldCBkb2VzIGNvdW50IGFzIGEgR29vZCBQYWNrZXQgUmVjZWl2ZWQuICAgICovCisgICAgc3RhdHMtPmdwcmMrKzsKKworICAgIC8qIEFkanVzdCB0aGUgR29vZCBPY3RldHMgcmVjZWl2ZWQgY291bnRlcnMgICAgICAgICAgICAgKi8KKyAgICBjYXJyeV9iaXQgPSAweDgwMDAwMDAwICYgc3RhdHMtPmdvcmNsOworICAgIHN0YXRzLT5nb3JjbCArPSBmcmFtZV9sZW47CisgICAgLyogSWYgdGhlIGhpZ2ggYml0IG9mIEdvcmNsICh0aGUgbG93IDMyIGJpdHMgb2YgdGhlIEdvb2QgT2N0ZXRzCisgICAgICogUmVjZWl2ZWQgQ291bnQpIHdhcyBvbmUgYmVmb3JlIHRoZSBhZGRpdGlvbiwKKyAgICAgKiBBTkQgaXQgaXMgemVybyBhZnRlciwgdGhlbiB3ZSBsb3N0IHRoZSBjYXJyeSBvdXQsCisgICAgICogbmVlZCB0byBhZGQgb25lIHRvIEdvcmNoIChHb29kIE9jdGV0cyBSZWNlaXZlZCBDb3VudCBIaWdoKS4KKyAgICAgKiBUaGlzIGNvdWxkIGJlIHNpbXBsaWZpZWQgaWYgYWxsIGVudmlyb25tZW50cyBzdXBwb3J0ZWQKKyAgICAgKiA2NC1iaXQgaW50ZWdlcnMuCisgICAgICovCisgICAgaWYoY2FycnlfYml0ICYmICgoc3RhdHMtPmdvcmNsICYgMHg4MDAwMDAwMCkgPT0gMCkpCisgICAgICAgIHN0YXRzLT5nb3JjaCsrOworICAgIC8qIElzIHRoaXMgYSBicm9hZGNhc3Qgb3IgbXVsdGljYXN0PyAgQ2hlY2sgYnJvYWRjYXN0IGZpcnN0LAorICAgICAqIHNpbmNlIHRoZSB0ZXN0IGZvciBhIG11bHRpY2FzdCBmcmFtZSB3aWxsIHRlc3QgcG9zaXRpdmUgb24KKyAgICAgKiBhIGJyb2FkY2FzdCBmcmFtZS4KKyAgICAgKi8KKyAgICBpZigobWFjX2FkZHJbMF0gPT0gKHVpbnQ4X3QpIDB4ZmYpICYmIChtYWNfYWRkclsxXSA9PSAodWludDhfdCkgMHhmZikpCisgICAgICAgIC8qIEJyb2FkY2FzdCBwYWNrZXQgKi8KKyAgICAgICAgc3RhdHMtPmJwcmMrKzsKKyAgICBlbHNlIGlmKCptYWNfYWRkciAmIDB4MDEpCisgICAgICAgIC8qIE11bHRpY2FzdCBwYWNrZXQgKi8KKyAgICAgICAgc3RhdHMtPm1wcmMrKzsKKworICAgIGlmKGZyYW1lX2xlbiA9PSBody0+bWF4X2ZyYW1lX3NpemUpIHsKKyAgICAgICAgLyogSW4gdGhpcyBjYXNlLCB0aGUgaGFyZHdhcmUgaGFzIG92ZXJjb3VudGVkIHRoZSBudW1iZXIgb2YKKyAgICAgICAgICogb3ZlcnNpemUgZnJhbWVzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYoc3RhdHMtPnJvYyA+IDApCisgICAgICAgICAgICBzdGF0cy0+cm9jLS07CisgICAgfQorCisgICAgLyogQWRqdXN0IHRoZSBiaW4gY291bnRlcnMgd2hlbiB0aGUgZXh0cmEgYnl0ZSBwdXQgdGhlIGZyYW1lIGluIHRoZQorICAgICAqIHdyb25nIGJpbi4gUmVtZW1iZXIgdGhhdCB0aGUgZnJhbWVfbGVuIHdhcyBhZGp1c3RlZCBhYm92ZS4KKyAgICAgKi8KKyAgICBpZihmcmFtZV9sZW4gPT0gNjQpIHsKKyAgICAgICAgc3RhdHMtPnByYzY0Kys7CisgICAgICAgIHN0YXRzLT5wcmMxMjctLTsKKyAgICB9IGVsc2UgaWYoZnJhbWVfbGVuID09IDEyNykgeworICAgICAgICBzdGF0cy0+cHJjMTI3Kys7CisgICAgICAgIHN0YXRzLT5wcmMyNTUtLTsKKyAgICB9IGVsc2UgaWYoZnJhbWVfbGVuID09IDI1NSkgeworICAgICAgICBzdGF0cy0+cHJjMjU1Kys7CisgICAgICAgIHN0YXRzLT5wcmM1MTEtLTsKKyAgICB9IGVsc2UgaWYoZnJhbWVfbGVuID09IDUxMSkgeworICAgICAgICBzdGF0cy0+cHJjNTExKys7CisgICAgICAgIHN0YXRzLT5wcmMxMDIzLS07CisgICAgfSBlbHNlIGlmKGZyYW1lX2xlbiA9PSAxMDIzKSB7CisgICAgICAgIHN0YXRzLT5wcmMxMDIzKys7CisgICAgICAgIHN0YXRzLT5wcmMxNTIyLS07CisgICAgfSBlbHNlIGlmKGZyYW1lX2xlbiA9PSAxNTIyKSB7CisgICAgICAgIHN0YXRzLT5wcmMxNTIyKys7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHZXRzIHRoZSBjdXJyZW50IFBDSSBidXMgdHlwZSwgc3BlZWQsIGFuZCB3aWR0aCBvZiB0aGUgaGFyZHdhcmUKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorZTEwMDBfZ2V0X2J1c19pbmZvKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisgICAgdWludDMyX3Qgc3RhdHVzOworCisgICAgc3dpdGNoIChody0+bWFjX3R5cGUpIHsKKyAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMDoKKyAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMToKKyAgICAgICAgaHctPmJ1c190eXBlID0gZTEwMDBfYnVzX3R5cGVfdW5rbm93bjsKKyAgICAgICAgaHctPmJ1c19zcGVlZCA9IGUxMDAwX2J1c19zcGVlZF91bmtub3duOworICAgICAgICBody0+YnVzX3dpZHRoID0gZTEwMDBfYnVzX3dpZHRoX3Vua25vd247CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHN0YXR1cyA9IEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpOworICAgICAgICBody0+YnVzX3R5cGUgPSAoc3RhdHVzICYgRTEwMDBfU1RBVFVTX1BDSVhfTU9ERSkgPworICAgICAgICAgICAgICAgICAgICAgICBlMTAwMF9idXNfdHlwZV9wY2l4IDogZTEwMDBfYnVzX3R5cGVfcGNpOworCisgICAgICAgIGlmKGh3LT5kZXZpY2VfaWQgPT0gRTEwMDBfREVWX0lEXzgyNTQ2RUJfUVVBRF9DT1BQRVIpIHsKKyAgICAgICAgICAgIGh3LT5idXNfc3BlZWQgPSAoaHctPmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUxMDAwX2J1c19zcGVlZF82NiA6IGUxMDAwX2J1c19zcGVlZF8xMjA7CisgICAgICAgIH0gZWxzZSBpZihody0+YnVzX3R5cGUgPT0gZTEwMDBfYnVzX3R5cGVfcGNpKSB7CisgICAgICAgICAgICBody0+YnVzX3NwZWVkID0gKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19QQ0k2NikgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUxMDAwX2J1c19zcGVlZF82NiA6IGUxMDAwX2J1c19zcGVlZF8zMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc3RhdHVzICYgRTEwMDBfU1RBVFVTX1BDSVhfU1BFRUQpIHsKKyAgICAgICAgICAgIGNhc2UgRTEwMDBfU1RBVFVTX1BDSVhfU1BFRURfNjY6CisgICAgICAgICAgICAgICAgaHctPmJ1c19zcGVlZCA9IGUxMDAwX2J1c19zcGVlZF82NjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRTEwMDBfU1RBVFVTX1BDSVhfU1BFRURfMTAwOgorICAgICAgICAgICAgICAgIGh3LT5idXNfc3BlZWQgPSBlMTAwMF9idXNfc3BlZWRfMTAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFMTAwMF9TVEFUVVNfUENJWF9TUEVFRF8xMzM6CisgICAgICAgICAgICAgICAgaHctPmJ1c19zcGVlZCA9IGUxMDAwX2J1c19zcGVlZF8xMzM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGh3LT5idXNfc3BlZWQgPSBlMTAwMF9idXNfc3BlZWRfcmVzZXJ2ZWQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaHctPmJ1c193aWR0aCA9IChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfQlVTNjQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIGUxMDAwX2J1c193aWR0aF82NCA6IGUxMDAwX2J1c193aWR0aF8zMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVhZHMgYSB2YWx1ZSBmcm9tIG9uZSBvZiB0aGUgZGV2aWNlcyByZWdpc3RlcnMgdXNpbmcgcG9ydCBJL08gKGFzIG9wcG9zZWQKKyAqIG1lbW9yeSBtYXBwZWQgSS9PKS4gT25seSA4MjU0NCBhbmQgbmV3ZXIgZGV2aWNlcyBzdXBwb3J0IHBvcnQgSS9PLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBvZmZzZXQgLSBvZmZzZXQgdG8gcmVhZCBmcm9tCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdAorZTEwMDBfcmVhZF9yZWdfaW8oc3RydWN0IGUxMDAwX2h3ICpodywKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGlvX2FkZHIgPSBody0+aW9fYmFzZTsKKyAgICB1bnNpZ25lZCBsb25nIGlvX2RhdGEgPSBody0+aW9fYmFzZSArIDQ7CisKKyAgICBlMTAwMF9pb193cml0ZShodywgaW9fYWRkciwgb2Zmc2V0KTsKKyAgICByZXR1cm4gZTEwMDBfaW9fcmVhZChodywgaW9fZGF0YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFdyaXRlcyBhIHZhbHVlIHRvIG9uZSBvZiB0aGUgZGV2aWNlcyByZWdpc3RlcnMgdXNpbmcgcG9ydCBJL08gKGFzIG9wcG9zZWQgdG8KKyAqIG1lbW9yeSBtYXBwZWQgSS9PKS4gT25seSA4MjU0NCBhbmQgbmV3ZXIgZGV2aWNlcyBzdXBwb3J0IHBvcnQgSS9PLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBvZmZzZXQgLSBvZmZzZXQgdG8gd3JpdGUgdG8KKyAqIHZhbHVlIC0gdmFsdWUgdG8gd3JpdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2UxMDAwX3dyaXRlX3JlZ19pbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGlvX2FkZHIgPSBody0+aW9fYmFzZTsKKyAgICB1bnNpZ25lZCBsb25nIGlvX2RhdGEgPSBody0+aW9fYmFzZSArIDQ7CisKKyAgICBlMTAwMF9pb193cml0ZShodywgaW9fYWRkciwgb2Zmc2V0KTsKKyAgICBlMTAwMF9pb193cml0ZShodywgaW9fZGF0YSwgdmFsdWUpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEVzdGltYXRlcyB0aGUgY2FibGUgbGVuZ3RoLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBtaW5fbGVuZ3RoIC0gVGhlIGVzdGltYXRlZCBtaW5pbXVtIGxlbmd0aAorICogbWF4X2xlbmd0aCAtIFRoZSBlc3RpbWF0ZWQgbWF4aW11bSBsZW5ndGgKKyAqCisgKiByZXR1cm5zOiAtIEUxMDAwX0VSUl9YWFgKKyAqICAgICAgICAgICAgRTEwMDBfU1VDQ0VTUworICoKKyAqIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgYSByYW5nZWQgbGVuZ3RoIChtaW5pbXVtICYgbWF4aW11bSkuCisgKiBTbyBmb3IgTTg4IHBoeSdzLCB0aGlzIGZ1bmN0aW9uIGludGVycHJldHMgdGhlIG9uZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoZQorICogcmVnaXN0ZXIgdG8gdGhlIG1pbmltdW0gYW5kIG1heGltdW0gcmFuZ2UuCisgKiBGb3IgSUdQIHBoeSdzLCB0aGUgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgcmFuZ2UgYnkgdGhlIEFHQyByZWdpc3RlcnMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90CitlMTAwMF9nZXRfY2FibGVfbGVuZ3RoKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICptaW5fbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqbWF4X2xlbmd0aCkKK3sKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3QgYWdjX3ZhbHVlID0gMDsKKyAgICB1aW50MTZfdCBjdXJfYWdjLCBtaW5fYWdjID0gSUdQMDFFMTAwMF9BR0NfTEVOR1RIX1RBQkxFX1NJWkU7CisgICAgdWludDE2X3QgaSwgcGh5X2RhdGE7CisgICAgdWludDE2X3QgY2FibGVfbGVuZ3RoOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9nZXRfY2FibGVfbGVuZ3RoIik7CisKKyAgICAqbWluX2xlbmd0aCA9ICptYXhfbGVuZ3RoID0gMDsKKworICAgIC8qIFVzZSBvbGQgbWV0aG9kIGZvciBQaHkgb2xkZXIgdGhhbiBJR1AgKi8KKyAgICBpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkgeworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19TVEFUVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICBjYWJsZV9sZW5ndGggPSAocGh5X2RhdGEgJiBNODhFMTAwMF9QU1NSX0NBQkxFX0xFTkdUSCkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgTTg4RTEwMDBfUFNTUl9DQUJMRV9MRU5HVEhfU0hJRlQ7CisKKyAgICAgICAgLyogQ29udmVydCB0aGUgZW51bSB2YWx1ZSB0byByYW5nZWQgdmFsdWVzICovCisgICAgICAgIHN3aXRjaCAoY2FibGVfbGVuZ3RoKSB7CisgICAgICAgIGNhc2UgZTEwMDBfY2FibGVfbGVuZ3RoXzUwOgorICAgICAgICAgICAgKm1pbl9sZW5ndGggPSAwOworICAgICAgICAgICAgKm1heF9sZW5ndGggPSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzUwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZTEwMDBfY2FibGVfbGVuZ3RoXzUwXzgwOgorICAgICAgICAgICAgKm1pbl9sZW5ndGggPSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzUwOworICAgICAgICAgICAgKm1heF9sZW5ndGggPSBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzgwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZTEwMDBfY2FibGVfbGVuZ3RoXzgwXzExMDoKKyAgICAgICAgICAgICptaW5fbGVuZ3RoID0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF84MDsKKyAgICAgICAgICAgICptYXhfbGVuZ3RoID0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xMTA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlMTAwMF9jYWJsZV9sZW5ndGhfMTEwXzE0MDoKKyAgICAgICAgICAgICptaW5fbGVuZ3RoID0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xMTA7CisgICAgICAgICAgICAqbWF4X2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTQwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZTEwMDBfY2FibGVfbGVuZ3RoXzE0MDoKKyAgICAgICAgICAgICptaW5fbGVuZ3RoID0gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xNDA7CisgICAgICAgICAgICAqbWF4X2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMTcwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9QSFk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkgeyAvKiBGb3IgSUdQIFBIWSAqLworICAgICAgICB1aW50MTZfdCBhZ2NfcmVnX2FycmF5W0lHUDAxRTEwMDBfUEhZX0NIQU5ORUxfTlVNXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7SUdQMDFFMTAwMF9QSFlfQUdDX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9QSFlfQUdDX0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9QSFlfQUdDX0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9QSFlfQUdDX0R9OworICAgICAgICAvKiBSZWFkIHRoZSBBR0MgcmVnaXN0ZXJzIGZvciBhbGwgY2hhbm5lbHMgKi8KKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgSUdQMDFFMTAwMF9QSFlfQ0hBTk5FTF9OVU07IGkrKykgeworCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBhZ2NfcmVnX2FycmF5W2ldLCAmcGh5X2RhdGEpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgY3VyX2FnYyA9IHBoeV9kYXRhID4+IElHUDAxRTEwMDBfQUdDX0xFTkdUSF9TSElGVDsKKworICAgICAgICAgICAgLyogQXJyYXkgYm91bmQgY2hlY2suICovCisgICAgICAgICAgICBpZigoY3VyX2FnYyA+PSBJR1AwMUUxMDAwX0FHQ19MRU5HVEhfVEFCTEVfU0laRSAtIDEpIHx8CisgICAgICAgICAgICAgICAoY3VyX2FnYyA9PSAwKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUUxMDAwX0VSUl9QSFk7CisKKyAgICAgICAgICAgIGFnY192YWx1ZSArPSBjdXJfYWdjOworCisgICAgICAgICAgICAvKiBVcGRhdGUgbWluaW1hbCBBR0MgdmFsdWUuICovCisgICAgICAgICAgICBpZihtaW5fYWdjID4gY3VyX2FnYykKKyAgICAgICAgICAgICAgICBtaW5fYWdjID0gY3VyX2FnYzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJlbW92ZSB0aGUgbWluaW1hbCBBR0MgcmVzdWx0IGZvciBsZW5ndGggPCA1MG0gKi8KKyAgICAgICAgaWYoYWdjX3ZhbHVlIDwgSUdQMDFFMTAwMF9QSFlfQ0hBTk5FTF9OVU0gKiBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzUwKSB7CisgICAgICAgICAgICBhZ2NfdmFsdWUgLT0gbWluX2FnYzsKKworICAgICAgICAgICAgLyogR2V0IHRoZSBhdmVyYWdlIGxlbmd0aCBvZiB0aGUgcmVtYWluaW5nIDMgY2hhbm5lbHMgKi8KKyAgICAgICAgICAgIGFnY192YWx1ZSAvPSAoSUdQMDFFMTAwMF9QSFlfQ0hBTk5FTF9OVU0gLSAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEdldCB0aGUgYXZlcmFnZSBsZW5ndGggb2YgYWxsIHRoZSA0IGNoYW5uZWxzLiAqLworICAgICAgICAgICAgYWdjX3ZhbHVlIC89IElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfTlVNOworICAgICAgICB9CisKKyAgICAgICAgLyogU2V0IHRoZSByYW5nZSBvZiB0aGUgY2FsY3VsYXRlZCBsZW5ndGguICovCisgICAgICAgICptaW5fbGVuZ3RoID0gKChlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoX3RhYmxlW2FnY192YWx1ZV0gLQorICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX0FHQ19SQU5HRSkgPiAwKSA/CisgICAgICAgICAgICAgICAgICAgICAgIChlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoX3RhYmxlW2FnY192YWx1ZV0gLQorICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX0FHQ19SQU5HRSkgOiAwOworICAgICAgICAqbWF4X2xlbmd0aCA9IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfdGFibGVbYWdjX3ZhbHVlXSArCisgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9BR0NfUkFOR0U7CisgICAgfQorCisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENoZWNrIHRoZSBjYWJsZSBwb2xhcml0eQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBwb2xhcml0eSAtIG91dHB1dCBwYXJhbWV0ZXIgOiAwIC0gUG9sYXJpdHkgaXMgbm90IHJldmVyc2VkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gUG9sYXJpdHkgaXMgcmV2ZXJzZWQuCisgKgorICogcmV0dXJuczogLSBFMTAwMF9FUlJfWFhYCisgKiAgICAgICAgICAgIEUxMDAwX1NVQ0NFU1MKKyAqCisgKiBGb3IgcGh5J3Mgb2xkZXIgdGhlbiBJR1AsIHRoaXMgZnVuY3Rpb24gc2ltcGx5IHJlYWRzIHRoZSBwb2xhcml0eSBiaXQgaW4gdGhlCisgKiBQaHkgU3RhdHVzIHJlZ2lzdGVyLiAgRm9yIElHUCBwaHkncywgdGhpcyBiaXQgaXMgdmFsaWQgb25seSBpZiBsaW5rIHNwZWVkIGlzCisgKiAxMCBNYnBzLiAgSWYgdGhlIGxpbmsgc3BlZWQgaXMgMTAwIE1icHMgdGhlcmUgaXMgbm8gcG9sYXJpdHkgc28gdGhpcyBiaXQgd2lsbAorICogcmV0dXJuIDAuICBJZiB0aGUgbGluayBzcGVlZCBpcyAxMDAwIE1icHMgdGhlIHBvbGFyaXR5IHN0YXR1cyBpcyBpbiB0aGUKKyAqIElHUDAxRTEwMDBfUEhZX1BDU19JTklUX1JFRy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX2NoZWNrX3BvbGFyaXR5KHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqcG9sYXJpdHkpCit7CisgICAgaW50MzJfdCByZXRfdmFsOworICAgIHVpbnQxNl90IHBoeV9kYXRhOworCisgICAgREVCVUdGVU5DKCJlMTAwMF9jaGVja19wb2xhcml0eSIpOworCisgICAgaWYoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpIHsKKyAgICAgICAgLyogcmV0dXJuIHRoZSBQb2xhcml0eSBiaXQgaW4gdGhlIFN0YXR1cyByZWdpc3Rlci4gKi8KKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1NQRUNfU1RBVFVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgKnBvbGFyaXR5ID0gKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9SRVZfUE9MQVJJVFkpID4+CisgICAgICAgICAgICAgICAgICAgIE04OEUxMDAwX1BTU1JfUkVWX1BPTEFSSVRZX1NISUZUOworICAgIH0gZWxzZSBpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkgeworICAgICAgICAvKiBSZWFkIHRoZSBTdGF0dXMgcmVnaXN0ZXIgdG8gY2hlY2sgdGhlIHNwZWVkICovCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfU1RBVFVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAvKiBJZiBzcGVlZCBpcyAxMDAwIE1icHMsIG11c3QgcmVhZCB0aGUgSUdQMDFFMTAwMF9QSFlfUENTX0lOSVRfUkVHIHRvCisgICAgICAgICAqIGZpbmQgdGhlIHBvbGFyaXR5IHN0YXR1cyAqLworICAgICAgICBpZigocGh5X2RhdGEgJiBJR1AwMUUxMDAwX1BTU1JfU1BFRURfTUFTSykgPT0KKyAgICAgICAgICAgSUdQMDFFMTAwMF9QU1NSX1NQRUVEXzEwMDBNQlBTKSB7CisKKyAgICAgICAgICAgIC8qIFJlYWQgdGhlIEdJRyBpbml0aWFsaXphdGlvbiBQQ1MgcmVnaXN0ZXIgKDB4MDBCNCkgKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BDU19JTklUX1JFRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgIC8qIENoZWNrIHRoZSBwb2xhcml0eSBiaXRzICovCisgICAgICAgICAgICAqcG9sYXJpdHkgPSAocGh5X2RhdGEgJiBJR1AwMUUxMDAwX1BIWV9QT0xBUklUWV9NQVNLKSA/IDEgOiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogRm9yIDEwIE1icHMsIHJlYWQgdGhlIHBvbGFyaXR5IGJpdCBpbiB0aGUgc3RhdHVzIHJlZ2lzdGVyLiAoZm9yCisgICAgICAgICAgICAgKiAxMDAgTWJwcyB0aGlzIGJpdCBpcyBhbHdheXMgMCkgKi8KKyAgICAgICAgICAgICpwb2xhcml0eSA9IHBoeV9kYXRhICYgSUdQMDFFMTAwMF9QU1NSX1BPTEFSSVRZX1JFVkVSU0VEOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDaGVjayBpZiBEb3duc2hpZnQgb2NjdXJlZAorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBkb3duc2hpZnQgLSBvdXRwdXQgcGFyYW1ldGVyIDogMCAtIE5vIERvd25zaGlmdCBvY3VyZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtIERvd25zaGlmdCBvY3VyZWQuCisgKgorICogcmV0dXJuczogLSBFMTAwMF9FUlJfWFhYCisgKiAgICAgICAgICAgIEUxMDAwX1NVQ0NFU1MgCisgKgorICogRm9yIHBoeSdzIG9sZGVyIHRoZW4gSUdQLCB0aGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBEb3duc2hpZnQgYml0IGluIHRoZSBQaHkKKyAqIFNwZWNpZmljIFN0YXR1cyByZWdpc3Rlci4gIEZvciBJR1AgcGh5J3MsIGl0IHJlYWRzIHRoZSBEb3duZ3JhZGUgYml0IGluIHRoZQorICogTGluayBIZWFsdGggcmVnaXN0ZXIuICBJbiBJR1AgdGhpcyBiaXQgaXMgbGF0Y2hlZCBoaWdoLCBzbyB0aGUgZHJpdmVyIG11c3QKKyAqIHJlYWQgaXQgaW1tZWRpYXRlbHkgYWZ0ZXIgbGluayBpcyBlc3RhYmxpc2hlZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QKK2UxMDAwX2NoZWNrX2Rvd25zaGlmdChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfY2hlY2tfZG93bnNoaWZ0Iik7CisKKyAgICBpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X2lncCkgeworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9MSU5LX0hFQUxUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgaHctPnNwZWVkX2Rvd25ncmFkZWQgPSAocGh5X2RhdGEgJiBJR1AwMUUxMDAwX1BMSFJfU1NfRE9XTkdSQURFKSA/IDEgOiAwOworICAgIH0gZWxzZSBpZihody0+cGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkgeworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfU1BFQ19TVEFUVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIGh3LT5zcGVlZF9kb3duZ3JhZGVkID0gKHBoeV9kYXRhICYgTTg4RTEwMDBfUFNTUl9ET1dOU0hJRlQpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTg4RTEwMDBfUFNTUl9ET1dOU0hJRlRfU0hJRlQ7CisgICAgfQorICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiA4MjU0MV9yZXZfMiAmIDgyNTQ3X3Jldl8yIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gY29uZmlndXJlIHRoZSBEU1Agd2hlbiBhCisgKiBnaWdhYml0IGxpbmsgaXMgYWNoaWV2ZWQgdG8gaW1wcm92ZSBsaW5rIHF1YWxpdHkuCisgKgorICogaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIHJldHVybnM6IC0gRTEwMDBfRVJSX1BIWSBpZiBmYWlsIHRvIHJlYWQvd3JpdGUgdGhlIFBIWQorICogICAgICAgICAgICBFMTAwMF9TVUNDRVNTIGF0IGFueSBvdGhlciBjYXNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQzMl90CitlMTAwMF9jb25maWdfZHNwX2FmdGVyX2xpbmtfY2hhbmdlKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5fdCBsaW5rX3VwKQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YSwgcGh5X3NhdmVkX2RhdGEsIHNwZWVkLCBkdXBsZXgsIGk7CisgICAgdWludDE2X3QgZHNwX3JlZ19hcnJheVtJR1AwMUUxMDAwX1BIWV9DSEFOTkVMX05VTV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtJR1AwMUUxMDAwX1BIWV9BR0NfUEFSQU1fQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX1BIWV9BR0NfUEFSQU1fQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX1BIWV9BR0NfUEFSQU1fQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX1BIWV9BR0NfUEFSQU1fRH07CisgICAgdWludDE2X3QgbWluX2xlbmd0aCwgbWF4X2xlbmd0aDsKKworICAgIERFQlVHRlVOQygiZTEwMDBfY29uZmlnX2RzcF9hZnRlcl9saW5rX2NoYW5nZSIpOworCisgICAgaWYoaHctPnBoeV90eXBlICE9IGUxMDAwX3BoeV9pZ3ApCisgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCisgICAgaWYobGlua191cCkgeworICAgICAgICByZXRfdmFsID0gZTEwMDBfZ2V0X3NwZWVkX2FuZF9kdXBsZXgoaHcsICZzcGVlZCwgJmR1cGxleCk7CisgICAgICAgIGlmKHJldF92YWwpIHsKKyAgICAgICAgICAgIERFQlVHT1VUKCJFcnJvciBnZXR0aW5nIGxpbmsgc3BlZWQgYW5kIGR1cGxleFxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHNwZWVkID09IFNQRUVEXzEwMDApIHsKKworICAgICAgICAgICAgZTEwMDBfZ2V0X2NhYmxlX2xlbmd0aChodywgJm1pbl9sZW5ndGgsICZtYXhfbGVuZ3RoKTsKKworICAgICAgICAgICAgaWYoKGh3LT5kc3BfY29uZmlnX3N0YXRlID09IGUxMDAwX2RzcF9jb25maWdfZW5hYmxlZCkgJiYKKyAgICAgICAgICAgICAgICBtaW5fbGVuZ3RoID49IGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNTApIHsKKworICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfTlVNOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgZHNwX3JlZ19hcnJheVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOworICAgICAgICAgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgICAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUEhZX0VEQUNfTVVfSU5ERVg7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIGRzcF9yZWdfYXJyYXlbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBody0+ZHNwX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2RzcF9jb25maWdfYWN0aXZhdGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZigoaHctPmZmZV9jb25maWdfc3RhdGUgPT0gZTEwMDBfZmZlX2NvbmZpZ19lbmFibGVkKSAmJgorICAgICAgICAgICAgICAgKG1pbl9sZW5ndGggPCBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzUwKSkgeworCisgICAgICAgICAgICAgICAgdWludDE2X3QgZmZlX2lkbGVfZXJyX3RpbWVvdXQgPSBGRkVfSURMRV9FUlJfQ09VTlRfVElNRU9VVF8yMDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpZGxlX2VycnMgPSAwOworCisgICAgICAgICAgICAgICAgLyogY2xlYXIgcHJldmlvdXMgaWRsZSBlcnJvciBjb3VudHMgKi8KKyAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfU1RBVFVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKyAgICAgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IGZmZV9pZGxlX2Vycl90aW1lb3V0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdWRlbGF5KDEwMDApOworICAgICAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfMTAwMFRfU1RBVFVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgICAgICAgICBpZGxlX2VycnMgKz0gKHBoeV9kYXRhICYgU1JfMTAwMFRfSURMRV9FUlJPUl9DTlQpOworICAgICAgICAgICAgICAgICAgICBpZihpZGxlX2VycnMgPiBTUl8xMDAwVF9QSFlfRVhDRVNTSVZFX0lETEVfRVJSX0NPVU5UKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBody0+ZmZlX2NvbmZpZ19zdGF0ZSA9IGUxMDAwX2ZmZV9jb25maWdfYWN0aXZlOworCisgICAgICAgICAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX0RTUF9GRkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR1AwMUUxMDAwX1BIWV9EU1BfRkZFX0NNX0NQKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKGlkbGVfZXJycykKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmZV9pZGxlX2Vycl90aW1lb3V0ID0gRkZFX0lETEVfRVJSX0NPVU5UX1RJTUVPVVRfMTAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmKGh3LT5kc3BfY29uZmlnX3N0YXRlID09IGUxMDAwX2RzcF9jb25maWdfYWN0aXZhdGVkKSB7CisgICAgICAgICAgICAvKiBTYXZlIG9mZiB0aGUgY3VycmVudCB2YWx1ZSBvZiByZWdpc3RlciAweDJGNUIgdG8gYmUgcmVzdG9yZWQgYXQKKyAgICAgICAgICAgICAqIHRoZSBlbmQgb2YgdGhlIHJvdXRpbmVzLiAqLworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgMHgyRjVCLCAmcGh5X3NhdmVkX2RhdGEpOworCisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBQSFkgdHJhbnNtaXR0ZXIgKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDJGNUIsIDB4MDAwMyk7CisKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgIG1zZWNfZGVsYXkoMjApOworCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9JRUVFX0ZPUkNFX0dJR0EpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfTlVNOyBpKyspIHsKKyAgICAgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBkc3BfcmVnX2FycmF5W2ldLCAmcGh5X2RhdGEpOworICAgICAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUEhZX0VEQUNfTVVfSU5ERVg7CisgICAgICAgICAgICAgICAgcGh5X2RhdGEgfD0gIElHUDAxRTEwMDBfUEhZX0VEQUNfU0lHTl9FWFRfOV9CSVRTOworCisgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsZHNwX3JlZ19hcnJheVtpXSwgcGh5X2RhdGEpOworICAgICAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9JRUVFX1JFU1RBUlRfQVVUT05FRyk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICBtc2VjX2RlbGF5KDIwKTsKKworICAgICAgICAgICAgLyogTm93IGVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIgKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDJGNUIsIHBoeV9zYXZlZF9kYXRhKTsKKworICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgaHctPmRzcF9jb25maWdfc3RhdGUgPSBlMTAwMF9kc3BfY29uZmlnX2VuYWJsZWQ7CisgICAgICAgIH0KKworICAgICAgICBpZihody0+ZmZlX2NvbmZpZ19zdGF0ZSA9PSBlMTAwMF9mZmVfY29uZmlnX2FjdGl2ZSkgeworICAgICAgICAgICAgLyogU2F2ZSBvZmYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgcmVnaXN0ZXIgMHgyRjVCIHRvIGJlIHJlc3RvcmVkIGF0CisgICAgICAgICAgICAgKiB0aGUgZW5kIG9mIHRoZSByb3V0aW5lcy4gKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIDB4MkY1QiwgJnBoeV9zYXZlZF9kYXRhKTsKKworICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgLyogRGlzYWJsZSB0aGUgUEhZIHRyYW5zbWl0dGVyICovCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgyRjVCLCAweDAwMDMpOworCisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICBtc2VjX2RlbGF5KDIwKTsKKworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIDB4MDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfSUVFRV9GT1JDRV9HSUdBKTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfRFNQX0ZGRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHUDAxRTEwMDBfUEhZX0RTUF9GRkVfREVGQVVMVCk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgMHgwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdQMDFFMTAwMF9JRUVFX1JFU1RBUlRfQVVUT05FRyk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgICAgICBtc2VjX2RlbGF5KDIwKTsKKworICAgICAgICAgICAgLyogTm93IGVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIgKi8KKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCAweDJGNUIsIHBoeV9zYXZlZF9kYXRhKTsKKworICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgaHctPmZmZV9jb25maWdfc3RhdGUgPSBlMTAwMF9mZmVfY29uZmlnX2VuYWJsZWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2V0IFBIWSB0byBjbGFzcyBBIG1vZGUKKyAqIEFzc3VtZXMgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIHdpbGwgZm9sbG93IHRvIGVuYWJsZSB0aGUgbmV3IGNsYXNzIG1vZGUuCisgKiAgMS4gRG8gYSBQSFkgc29mdCByZXNldAorICogIDIuIFJlc3RhcnQgYXV0by1uZWdvdGlhdGlvbiBvciBmb3JjZSBsaW5rLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQzMl90CitlMTAwMF9zZXRfcGh5X21vZGUoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3QgZWVwcm9tX2RhdGE7CisKKyAgICBERUJVR0ZVTkMoImUxMDAwX3NldF9waHlfbW9kZSIpOworCisgICAgaWYoKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NV9yZXZfMykgJiYKKyAgICAgICAoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpKSB7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX2VlcHJvbShodywgRUVQUk9NX1BIWV9DTEFTU19XT1JELCAxLCAmZWVwcm9tX2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKChlZXByb21fZGF0YSAhPSBFRVBST01fUkVTRVJWRURfV09SRCkgJiYKKyAgICAgICAgICAgKGVlcHJvbV9kYXRhICYgRUVQUk9NX1BIWV9DTEFTU19BKSkgeworICAgICAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgMHgwMDBCKTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0dFTl9DT05UUk9MLCAweDgxMDQpOworICAgICAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgaHctPnBoeV9yZXNldF9kaXNhYmxlID0gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBscGx1IHN0YXRlIGFjY29yZGluZyB0byB0aGUgYWN0aXZlIGZsYWcuICBXaGVuCisgKiBhY3RpdmF0aW5nIGxwbHUgdGhpcyBmdW5jdGlvbiBhbHNvIGRpc2FibGVzIHNtYXJ0IHNwZWVkIGFuZCB2aXNlIHZlcnNhLgorICogbHBsdSB3aWxsIG5vdCBiZSBhY3RpdmF0ZWQgdW5sZXNzIHRoZSBkZXZpY2UgYXV0b25lZ290aWF0aW9uIGFkdmVydGlzbWVudAorICogbWVldHMgc3RhbmRhcmRzIG9mIGVpdGhlciAxMCBvciAxMC8xMDAgb3IgMTAvMTAwLzEwMDAgYXQgYWxsIGR1cGxleGVzLgorICogaHc6IFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogYWN0aXZlIC0gdHJ1ZSB0byBlbmFibGUgbHBsdSBmYWxzZSB0byBkaXNhYmxlIGxwbHUuCisgKgorICogcmV0dXJuczogLSBFMTAwMF9FUlJfUEhZIGlmIGZhaWwgdG8gcmVhZC93cml0ZSB0aGUgUEhZCisgKiAgICAgICAgICAgIEUxMDAwX1NVQ0NFU1MgYXQgYW55IG90aGVyIGNhc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludDMyX3QKK2UxMDAwX3NldF9kM19scGx1X3N0YXRlKHN0cnVjdCBlMTAwMF9odyAqaHcsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuX3QgYWN0aXZlKQoreworICAgIGludDMyX3QgcmV0X3ZhbDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YTsKKyAgICBERUJVR0ZVTkMoImUxMDAwX3NldF9kM19scGx1X3N0YXRlIik7CisKKyAgICBpZighKChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDFfcmV2XzIpIHx8CisgICAgICAgICAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3X3Jldl8yKSkpCisgICAgICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworCisgICAgLyogRHVyaW5nIGRyaXZlciBhY3Rpdml0eSBMUExVIHNob3VsZCBub3QgYmUgdXNlZCBvciBpdCB3aWxsIGF0dGFpbiBsaW5rCisgICAgICogZnJvbSB0aGUgbG93ZXN0IHNwZWVkcyBzdGFydGluZyBmcm9tIDEwTWJwcy4gVGhlIGNhcGFiaWxpdHkgaXMgdXNlZCBmb3IKKyAgICAgKiBEeCB0cmFuc2l0aW9ucyBhbmQgc3RhdGVzICovCisgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9HTUlJX0ZJRk8sICZwaHlfZGF0YSk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICBpZighYWN0aXZlKSB7CisgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX0dNSUlfRkxFWF9TUEQ7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX0dNSUlfRklGTywgcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgLyogTFBMVSBhbmQgU21hcnRTcGVlZCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAgTFBMVSBpcyB1c2VkIGR1cmluZworICAgICAgICAgKiBEeCBzdGF0ZXMgd2hlcmUgdGhlIHBvd2VyIGNvbnNlcnZhdGlvbiBpcyBtb3N0IGltcG9ydGFudC4gIER1cmluZworICAgICAgICAgKiBkcml2ZXIgYWN0aXZpdHkgd2Ugc2hvdWxkIGVuYWJsZSBTbWFydFNwZWVkLCBzbyBwZXJmb3JtYW5jZSBpcworICAgICAgICAgKiBtYWludGFpbmVkLiAqLworICAgICAgICBpZiAoaHctPnNtYXJ0X3NwZWVkID09IGUxMDAwX3NtYXJ0X3NwZWVkX29uKSB7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeV9kYXRhKTsKKyAgICAgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgICAgIHBoeV9kYXRhIHw9IElHUDAxRTEwMDBfUFNDRlJfU01BUlRfU1BFRUQ7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9IGVsc2UgaWYgKGh3LT5zbWFydF9zcGVlZCA9PSBlMTAwMF9zbWFydF9zcGVlZF9vZmYpIHsKKyAgICAgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5X2RhdGEpOworCSAgICBpZiAocmV0X3ZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICAgICAgcGh5X2RhdGEgJj0gfklHUDAxRTEwMDBfUFNDRlJfU01BUlRfU1BFRUQ7CisgICAgICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlfZGF0YSk7CisgICAgICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworICAgICAgICB9CisKKyAgICB9IGVsc2UgaWYoKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPT0gQVVUT05FR19BRFZFUlRJU0VfU1BFRURfREVGQVVMVCkgfHwKKyAgICAgICAgICAgICAgKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPT0gQVVUT05FR19BRFZFUlRJU0VfMTBfQUxMICkgfHwKKyAgICAgICAgICAgICAgKGh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPT0gQVVUT05FR19BRFZFUlRJU0VfMTBfMTAwX0FMTCkpIHsKKworICAgICAgICBwaHlfZGF0YSB8PSBJR1AwMUUxMDAwX0dNSUlfRkxFWF9TUEQ7CisgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX0dNSUlfRklGTywgcGh5X2RhdGEpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgLyogV2hlbiBMUExVIGlzIGVuYWJsZWQgd2Ugc2hvdWxkIGRpc2FibGUgU21hcnRTcGVlZCAqLworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBJR1AwMUUxMDAwX1BIWV9QT1JUX0NPTkZJRywgJnBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIHBoeV9kYXRhICY9IH5JR1AwMUUxMDAwX1BTQ0ZSX1NNQVJUX1NQRUVEOworICAgICAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgSUdQMDFFMTAwMF9QSFlfUE9SVF9DT05GSUcsIHBoeV9kYXRhKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgfQorICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDaGFuZ2UgVkNPIHNwZWVkIHJlZ2lzdGVyIHRvIGltcHJvdmUgQml0IEVycm9yIFJhdGUgcGVyZm9ybWFuY2Ugb2YgU0VSREVTLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50MzJfdAorZTEwMDBfc2V0X3Zjb19zcGVlZChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworICAgIGludDMyX3QgIHJldF92YWw7CisgICAgdWludDE2X3QgZGVmYXVsdF9wYWdlID0gMDsKKyAgICB1aW50MTZfdCBwaHlfZGF0YTsKKworICAgIERFQlVHRlVOQygiZTEwMDBfc2V0X3Zjb19zcGVlZCIpOworCisgICAgc3dpdGNoKGh3LT5tYWNfdHlwZSkgeworICAgIGNhc2UgZTEwMDBfODI1NDVfcmV2XzM6CisgICAgY2FzZSBlMTAwMF84MjU0Nl9yZXZfMzoKKyAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKyAgICB9CisKKyAgICAvKiBTZXQgUEhZIHJlZ2lzdGVyIDMwLCBwYWdlIDUsIGJpdCA4IHRvIDAgKi8KKworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgJmRlZmF1bHRfcGFnZSk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNULCAweDAwMDUpOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0dFTl9DT05UUk9MLCAmcGh5X2RhdGEpOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgcGh5X2RhdGEgJj0gfk04OEUxMDAwX1BIWV9WQ09fUkVHX0JJVDg7CisgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9HRU5fQ09OVFJPTCwgcGh5X2RhdGEpOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgLyogU2V0IFBIWSByZWdpc3RlciAzMCwgcGFnZSA0LCBiaXQgMTEgdG8gMSAqLworCisgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgMHgwMDA0KTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9HRU5fQ09OVFJPTCwgJnBoeV9kYXRhKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHBoeV9kYXRhIHw9IE04OEUxMDAwX1BIWV9WQ09fUkVHX0JJVDExOworICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfR0VOX0NPTlRST0wsIHBoeV9kYXRhKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsIGRlZmF1bHRfcGFnZSk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKworc3RhdGljIGludDMyX3QKK2UxMDAwX3BvbGFyaXR5X3JldmVyc2FsX3dvcmthcm91bmQoc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKyAgICBpbnQzMl90IHJldF92YWw7CisgICAgdWludDE2X3QgbWlpX3N0YXR1c19yZWc7CisgICAgdWludDE2X3QgaTsKKworICAgIC8qIFBvbGFyaXR5IHJldmVyc2FsIHdvcmthcm91bmQgZm9yIGZvcmNlZCAxMEYvMTBIIGxpbmtzLiAqLworCisgICAgLyogRGlzYWJsZSB0aGUgdHJhbnNtaXR0ZXIgb24gdGhlIFBIWSAqLworCisgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgMHgwMDE5KTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICByZXRfdmFsID0gZTEwMDBfd3JpdGVfcGh5X3JlZyhodywgTTg4RTEwMDBfUEhZX0dFTl9DT05UUk9MLCAweEZGRkYpOworICAgIGlmKHJldF92YWwpCisgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgMHgwMDAwKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIC8qIFRoaXMgbG9vcCB3aWxsIGVhcmx5LW91dCBpZiB0aGUgTk8gbGluayBjb25kaXRpb24gaGFzIGJlZW4gbWV0LiAqLworICAgIGZvcihpID0gUEhZX0ZPUkNFX1RJTUU7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgLyogUmVhZCB0aGUgTUlJIFN0YXR1cyBSZWdpc3RlciBhbmQgd2FpdCBmb3IgTGluayBTdGF0dXMgYml0CisgICAgICAgICAqIHRvIGJlIGNsZWFyLgorICAgICAgICAgKi8KKworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgcmV0X3ZhbCA9IGUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZX1NUQVRVUywgJm1paV9zdGF0dXNfcmVnKTsKKyAgICAgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXRfdmFsOworCisgICAgICAgIGlmKChtaWlfc3RhdHVzX3JlZyAmIH5NSUlfU1JfTElOS19TVEFUVVMpID09IDApIGJyZWFrOworICAgICAgICBtc2VjX2RlbGF5X2lycSgxMDApOworICAgIH0KKworICAgIC8qIFJlY29tbWVuZGVkIGRlbGF5IHRpbWUgYWZ0ZXIgbGluayBoYXMgYmVlbiBsb3N0ICovCisgICAgbXNlY19kZWxheV9pcnEoMTAwMCk7CisKKyAgICAvKiBOb3cgd2Ugd2lsbCByZS1lbmFibGUgdGggdHJhbnNtaXR0ZXIgb24gdGhlIFBIWSAqLworCisgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9QQUdFX1NFTEVDVCwgMHgwMDE5KTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICBtc2VjX2RlbGF5X2lycSg1MCk7CisgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9HRU5fQ09OVFJPTCwgMHhGRkYwKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICBtc2VjX2RlbGF5X2lycSg1MCk7CisgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9HRU5fQ09OVFJPTCwgMHhGRjAwKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKyAgICBtc2VjX2RlbGF5X2lycSg1MCk7CisgICAgcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWcoaHcsIE04OEUxMDAwX1BIWV9HRU5fQ09OVFJPTCwgMHgwMDAwKTsKKyAgICBpZihyZXRfdmFsKQorICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBNODhFMTAwMF9QSFlfUEFHRV9TRUxFQ1QsIDB4MDAwMCk7CisgICAgaWYocmV0X3ZhbCkKKyAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAvKiBUaGlzIGxvb3Agd2lsbCBlYXJseS1vdXQgaWYgdGhlIGxpbmsgY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4gKi8KKyAgICBmb3IoaSA9IFBIWV9GT1JDRV9USU1FOyBpID4gMDsgaS0tKSB7CisgICAgICAgIC8qIFJlYWQgdGhlIE1JSSBTdGF0dXMgUmVnaXN0ZXIgYW5kIHdhaXQgZm9yIExpbmsgU3RhdHVzIGJpdAorICAgICAgICAgKiB0byBiZSBzZXQuCisgICAgICAgICAqLworCisgICAgICAgIHJldF92YWwgPSBlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIFBIWV9TVEFUVVMsICZtaWlfc3RhdHVzX3JlZyk7CisgICAgICAgIGlmKHJldF92YWwpCisgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKKworICAgICAgICByZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnKGh3LCBQSFlfU1RBVFVTLCAmbWlpX3N0YXR1c19yZWcpOworICAgICAgICBpZihyZXRfdmFsKQorICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7CisKKyAgICAgICAgaWYobWlpX3N0YXR1c19yZWcgJiBNSUlfU1JfTElOS19TVEFUVVMpIGJyZWFrOworICAgICAgICBtc2VjX2RlbGF5X2lycSgxMDApOworICAgIH0KKyAgICByZXR1cm4gRTEwMDBfU1VDQ0VTUzsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuaCBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5N2U2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmgKQEAgLTAsMCArMSwyMTQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIAorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIAorICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCAKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgCisgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgCisgIGFueSBsYXRlciB2ZXJzaW9uLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgCisgIG1vcmUgZGV0YWlscy4KKyAgCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IAorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAgCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICAKKyAgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAgTGludXggTklDUyA8bGludXgubmljc0BpbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZTEwMDBfaHcuaAorICogU3RydWN0dXJlcywgZW51bXMsIGFuZCBtYWNyb3MgZm9yIHRoZSBNQUMKKyAqLworCisjaWZuZGVmIF9FMTAwMF9IV19IXworI2RlZmluZSBfRTEwMDBfSFdfSF8KKworI2luY2x1ZGUgImUxMDAwX29zZGVwLmgiCisKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2Ygc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBzaGFyZWQgY29kZSAqLworc3RydWN0IGUxMDAwX2h3Oworc3RydWN0IGUxMDAwX2h3X3N0YXRzOworCisvKiBFbnVtZXJhdGVkIHR5cGVzIHNwZWNpZmljIHRvIHRoZSBlMTAwMCBoYXJkd2FyZSAqLworLyogTWVkaWEgQWNjZXNzIENvbnRyb2xlcnMgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfdW5kZWZpbmVkID0gMCwKKyAgICBlMTAwMF84MjU0Ml9yZXYyXzAsCisgICAgZTEwMDBfODI1NDJfcmV2Ml8xLAorICAgIGUxMDAwXzgyNTQzLAorICAgIGUxMDAwXzgyNTQ0LAorICAgIGUxMDAwXzgyNTQwLAorICAgIGUxMDAwXzgyNTQ1LAorICAgIGUxMDAwXzgyNTQ1X3Jldl8zLAorICAgIGUxMDAwXzgyNTQ2LAorICAgIGUxMDAwXzgyNTQ2X3Jldl8zLAorICAgIGUxMDAwXzgyNTQxLAorICAgIGUxMDAwXzgyNTQxX3Jldl8yLAorICAgIGUxMDAwXzgyNTQ3LAorICAgIGUxMDAwXzgyNTQ3X3Jldl8yLAorICAgIGUxMDAwX251bV9tYWNzCit9IGUxMDAwX21hY190eXBlOworCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX2VlcHJvbV91bmluaXRpYWxpemVkID0gMCwKKyAgICBlMTAwMF9lZXByb21fc3BpLAorICAgIGUxMDAwX2VlcHJvbV9taWNyb3dpcmUsCisgICAgZTEwMDBfbnVtX2VlcHJvbV90eXBlcworfSBlMTAwMF9lZXByb21fdHlwZTsKKworLyogTWVkaWEgVHlwZXMgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIgPSAwLAorICAgIGUxMDAwX21lZGlhX3R5cGVfZmliZXIgPSAxLAorICAgIGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzID0gMiwKKyAgICBlMTAwMF9udW1fbWVkaWFfdHlwZXMKK30gZTEwMDBfbWVkaWFfdHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF8xMF9oYWxmID0gMCwKKyAgICBlMTAwMF8xMF9mdWxsID0gMSwKKyAgICBlMTAwMF8xMDBfaGFsZiA9IDIsCisgICAgZTEwMDBfMTAwX2Z1bGwgPSAzCit9IGUxMDAwX3NwZWVkX2R1cGxleF90eXBlOworCisvKiBGbG93IENvbnRyb2wgU2V0dGluZ3MgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfZmNfbm9uZSA9IDAsCisgICAgZTEwMDBfZmNfcnhfcGF1c2UgPSAxLAorICAgIGUxMDAwX2ZjX3R4X3BhdXNlID0gMiwKKyAgICBlMTAwMF9mY19mdWxsID0gMywKKyAgICBlMTAwMF9mY19kZWZhdWx0ID0gMHhGRgorfSBlMTAwMF9mY190eXBlOworCisvKiBQQ0kgYnVzIHR5cGVzICovCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX2J1c190eXBlX3Vua25vd24gPSAwLAorICAgIGUxMDAwX2J1c190eXBlX3BjaSwKKyAgICBlMTAwMF9idXNfdHlwZV9wY2l4LAorICAgIGUxMDAwX2J1c190eXBlX3Jlc2VydmVkCit9IGUxMDAwX2J1c190eXBlOworCisvKiBQQ0kgYnVzIHNwZWVkcyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF9idXNfc3BlZWRfdW5rbm93biA9IDAsCisgICAgZTEwMDBfYnVzX3NwZWVkXzMzLAorICAgIGUxMDAwX2J1c19zcGVlZF82NiwKKyAgICBlMTAwMF9idXNfc3BlZWRfMTAwLAorICAgIGUxMDAwX2J1c19zcGVlZF8xMjAsCisgICAgZTEwMDBfYnVzX3NwZWVkXzEzMywKKyAgICBlMTAwMF9idXNfc3BlZWRfcmVzZXJ2ZWQKK30gZTEwMDBfYnVzX3NwZWVkOworCisvKiBQQ0kgYnVzIHdpZHRocyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF9idXNfd2lkdGhfdW5rbm93biA9IDAsCisgICAgZTEwMDBfYnVzX3dpZHRoXzMyLAorICAgIGUxMDAwX2J1c193aWR0aF82NCwKKyAgICBlMTAwMF9idXNfd2lkdGhfcmVzZXJ2ZWQKK30gZTEwMDBfYnVzX3dpZHRoOworCisvKiBQSFkgc3RhdHVzIGluZm8gc3RydWN0dXJlIGFuZCBzdXBwb3J0aW5nIGVudW1zICovCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX2NhYmxlX2xlbmd0aF81MCA9IDAsCisgICAgZTEwMDBfY2FibGVfbGVuZ3RoXzUwXzgwLAorICAgIGUxMDAwX2NhYmxlX2xlbmd0aF84MF8xMTAsCisgICAgZTEwMDBfY2FibGVfbGVuZ3RoXzExMF8xNDAsCisgICAgZTEwMDBfY2FibGVfbGVuZ3RoXzE0MCwKKyAgICBlMTAwMF9jYWJsZV9sZW5ndGhfdW5kZWZpbmVkID0gMHhGRgorfSBlMTAwMF9jYWJsZV9sZW5ndGg7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xMCAgPSAxMCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzIwICA9IDIwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfMzAgID0gMzAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF80MCAgPSA0MCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzUwICA9IDUwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfNjAgID0gNjAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF83MCAgPSA3MCwKKyAgICBlMTAwMF9pZ3BfY2FibGVfbGVuZ3RoXzgwICA9IDgwLAorICAgIGUxMDAwX2lncF9jYWJsZV9sZW5ndGhfOTAgID0gOTAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xMDAgPSAxMDAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xMTAgPSAxMTAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xMjAgPSAxMjAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xMzAgPSAxMzAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xNDAgPSAxNDAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xNTAgPSAxNTAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xNjAgPSAxNjAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xNzAgPSAxNzAsCisgICAgZTEwMDBfaWdwX2NhYmxlX2xlbmd0aF8xODAgPSAxODAKK30gZTEwMDBfaWdwX2NhYmxlX2xlbmd0aDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF8xMGJ0X2V4dF9kaXN0X2VuYWJsZV9ub3JtYWwgPSAwLAorICAgIGUxMDAwXzEwYnRfZXh0X2Rpc3RfZW5hYmxlX2xvd2VyLAorICAgIGUxMDAwXzEwYnRfZXh0X2Rpc3RfZW5hYmxlX3VuZGVmaW5lZCA9IDB4RkYKK30gZTEwMDBfMTBidF9leHRfZGlzdF9lbmFibGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfcmV2X3BvbGFyaXR5X25vcm1hbCA9IDAsCisgICAgZTEwMDBfcmV2X3BvbGFyaXR5X3JldmVyc2VkLAorICAgIGUxMDAwX3Jldl9wb2xhcml0eV91bmRlZmluZWQgPSAweEZGCit9IGUxMDAwX3Jldl9wb2xhcml0eTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF9kb3duc2hpZnRfbm9ybWFsID0gMCwKKyAgICBlMTAwMF9kb3duc2hpZnRfYWN0aXZhdGVkLAorICAgIGUxMDAwX2Rvd25zaGlmdF91bmRlZmluZWQgPSAweEZGCit9IGUxMDAwX2Rvd25zaGlmdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF9zbWFydF9zcGVlZF9kZWZhdWx0ID0gMCwKKyAgICBlMTAwMF9zbWFydF9zcGVlZF9vbiwKKyAgICBlMTAwMF9zbWFydF9zcGVlZF9vZmYKK30gZTEwMDBfc21hcnRfc3BlZWQ7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfZW5hYmxlZCA9IDAsCisgICAgZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfZGlzYWJsZWQsCisgICAgZTEwMDBfcG9sYXJpdHlfcmV2ZXJzYWxfdW5kZWZpbmVkID0gMHhGRgorfSBlMTAwMF9wb2xhcml0eV9yZXZlcnNhbDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF9hdXRvX3hfbW9kZV9tYW51YWxfbWRpID0gMCwKKyAgICBlMTAwMF9hdXRvX3hfbW9kZV9tYW51YWxfbWRpeCwKKyAgICBlMTAwMF9hdXRvX3hfbW9kZV9hdXRvMSwKKyAgICBlMTAwMF9hdXRvX3hfbW9kZV9hdXRvMiwKKyAgICBlMTAwMF9hdXRvX3hfbW9kZV91bmRlZmluZWQgPSAweEZGCit9IGUxMDAwX2F1dG9feF9tb2RlOworCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwXzEwMDB0X3J4X3N0YXR1c19ub3Rfb2sgPSAwLAorICAgIGUxMDAwXzEwMDB0X3J4X3N0YXR1c19vaywKKyAgICBlMTAwMF8xMDAwdF9yeF9zdGF0dXNfdW5kZWZpbmVkID0gMHhGRgorfSBlMTAwMF8xMDAwdF9yeF9zdGF0dXM7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfcGh5X204OCA9IDAsCisgICAgZTEwMDBfcGh5X2lncCwKKyAgICBlMTAwMF9waHlfdW5kZWZpbmVkID0gMHhGRgorfSBlMTAwMF9waHlfdHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBlMTAwMF9tc19od19kZWZhdWx0ID0gMCwKKyAgICBlMTAwMF9tc19mb3JjZV9tYXN0ZXIsCisgICAgZTEwMDBfbXNfZm9yY2Vfc2xhdmUsCisgICAgZTEwMDBfbXNfYXV0bworfSBlMTAwMF9tc190eXBlOworCit0eXBlZGVmIGVudW0geworICAgIGUxMDAwX2ZmZV9jb25maWdfZW5hYmxlZCA9IDAsCisgICAgZTEwMDBfZmZlX2NvbmZpZ19hY3RpdmUsCisgICAgZTEwMDBfZmZlX2NvbmZpZ19ibG9ja2VkCit9IGUxMDAwX2ZmZV9jb25maWc7CisKK3R5cGVkZWYgZW51bSB7CisgICAgZTEwMDBfZHNwX2NvbmZpZ19kaXNhYmxlZCA9IDAsCisgICAgZTEwMDBfZHNwX2NvbmZpZ19lbmFibGVkLAorICAgIGUxMDAwX2RzcF9jb25maWdfYWN0aXZhdGVkLAorICAgIGUxMDAwX2RzcF9jb25maWdfdW5kZWZpbmVkID0gMHhGRgorfSBlMTAwMF9kc3BfY29uZmlnOworCitzdHJ1Y3QgZTEwMDBfcGh5X2luZm8geworICAgIGUxMDAwX2NhYmxlX2xlbmd0aCBjYWJsZV9sZW5ndGg7CisgICAgZTEwMDBfMTBidF9leHRfZGlzdF9lbmFibGUgZXh0ZW5kZWRfMTBidF9kaXN0YW5jZTsKKyAgICBlMTAwMF9yZXZfcG9sYXJpdHkgY2FibGVfcG9sYXJpdHk7CisgICAgZTEwMDBfZG93bnNoaWZ0IGRvd25zaGlmdDsKKyAgICBlMTAwMF9wb2xhcml0eV9yZXZlcnNhbCBwb2xhcml0eV9jb3JyZWN0aW9uOworICAgIGUxMDAwX2F1dG9feF9tb2RlIG1kaXhfbW9kZTsKKyAgICBlMTAwMF8xMDAwdF9yeF9zdGF0dXMgbG9jYWxfcng7CisgICAgZTEwMDBfMTAwMHRfcnhfc3RhdHVzIHJlbW90ZV9yeDsKK307CisKK3N0cnVjdCBlMTAwMF9waHlfc3RhdHMgeworICAgIHVpbnQzMl90IGlkbGVfZXJyb3JzOworICAgIHVpbnQzMl90IHJlY2VpdmVfZXJyb3JzOworfTsKKworc3RydWN0IGUxMDAwX2VlcHJvbV9pbmZvIHsKKyAgICBlMTAwMF9lZXByb21fdHlwZSB0eXBlOworICAgIHVpbnQxNl90IHdvcmRfc2l6ZTsKKyAgICB1aW50MTZfdCBvcGNvZGVfYml0czsKKyAgICB1aW50MTZfdCBhZGRyZXNzX2JpdHM7CisgICAgdWludDE2X3QgZGVsYXlfdXNlYzsKKyAgICB1aW50MTZfdCBwYWdlX3NpemU7Cit9OworCisKKworLyogRXJyb3IgQ29kZXMgKi8KKyNkZWZpbmUgRTEwMDBfU1VDQ0VTUyAgICAgIDAKKyNkZWZpbmUgRTEwMDBfRVJSX0VFUFJPTSAgIDEKKyNkZWZpbmUgRTEwMDBfRVJSX1BIWSAgICAgIDIKKyNkZWZpbmUgRTEwMDBfRVJSX0NPTkZJRyAgIDMKKyNkZWZpbmUgRTEwMDBfRVJSX1BBUkFNICAgIDQKKyNkZWZpbmUgRTEwMDBfRVJSX01BQ19UWVBFIDUKKyNkZWZpbmUgRTEwMDBfRVJSX1BIWV9UWVBFIDYKKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLworLyogSW5pdGlhbGl6YXRpb24gKi8KK2ludDMyX3QgZTEwMDBfcmVzZXRfaHcoc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX2luaXRfaHcoc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX3NldF9tYWNfdHlwZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3ZvaWQgZTEwMDBfc2V0X21lZGlhX3R5cGUoc3RydWN0IGUxMDAwX2h3ICpodyk7CisKKy8qIExpbmsgQ29uZmlndXJhdGlvbiAqLworaW50MzJfdCBlMTAwMF9zZXR1cF9saW5rKHN0cnVjdCBlMTAwMF9odyAqaHcpOworaW50MzJfdCBlMTAwMF9waHlfc2V0dXBfYXV0b25lZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3ZvaWQgZTEwMDBfY29uZmlnX2NvbGxpc2lvbl9kaXN0KHN0cnVjdCBlMTAwMF9odyAqaHcpOworaW50MzJfdCBlMTAwMF9jb25maWdfZmNfYWZ0ZXJfbGlua191cChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfY2hlY2tfZm9yX2xpbmsoc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX2dldF9zcGVlZF9hbmRfZHVwbGV4KHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQxNl90ICogc3BlZWQsIHVpbnQxNl90ICogZHVwbGV4KTsKK2ludDMyX3QgZTEwMDBfd2FpdF9hdXRvbmVnKHN0cnVjdCBlMTAwMF9odyAqaHcpOworaW50MzJfdCBlMTAwMF9mb3JjZV9tYWNfZmMoc3RydWN0IGUxMDAwX2h3ICpodyk7CisKKy8qIFBIWSAqLworaW50MzJfdCBlMTAwMF9yZWFkX3BoeV9yZWcoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgcmVnX2FkZHIsIHVpbnQxNl90ICpwaHlfZGF0YSk7CitpbnQzMl90IGUxMDAwX3dyaXRlX3BoeV9yZWcoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgcmVnX2FkZHIsIHVpbnQxNl90IGRhdGEpOwordm9pZCBlMTAwMF9waHlfaHdfcmVzZXQoc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX3BoeV9yZXNldChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfZGV0ZWN0X2dpZ19waHkoc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX3BoeV9nZXRfaW5mbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBzdHJ1Y3QgZTEwMDBfcGh5X2luZm8gKnBoeV9pbmZvKTsKK2ludDMyX3QgZTEwMDBfcGh5X204OF9nZXRfaW5mbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBzdHJ1Y3QgZTEwMDBfcGh5X2luZm8gKnBoeV9pbmZvKTsKK2ludDMyX3QgZTEwMDBfcGh5X2lncF9nZXRfaW5mbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBzdHJ1Y3QgZTEwMDBfcGh5X2luZm8gKnBoeV9pbmZvKTsKK2ludDMyX3QgZTEwMDBfZ2V0X2NhYmxlX2xlbmd0aChzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MTZfdCAqbWluX2xlbmd0aCwgdWludDE2X3QgKm1heF9sZW5ndGgpOworaW50MzJfdCBlMTAwMF9jaGVja19wb2xhcml0eShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MTZfdCAqcG9sYXJpdHkpOworaW50MzJfdCBlMTAwMF9jaGVja19kb3duc2hpZnQoc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX3ZhbGlkYXRlX21kaV9zZXR0aW5nKHN0cnVjdCBlMTAwMF9odyAqaHcpOworCisvKiBFRVBST00gRnVuY3Rpb25zICovCit2b2lkIGUxMDAwX2luaXRfZWVwcm9tX3BhcmFtcyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfcmVhZF9lZXByb20oc3RydWN0IGUxMDAwX2h3ICpodywgdWludDE2X3QgcmVnLCB1aW50MTZfdCB3b3JkcywgdWludDE2X3QgKmRhdGEpOworaW50MzJfdCBlMTAwMF92YWxpZGF0ZV9lZXByb21fY2hlY2tzdW0oc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX3VwZGF0ZV9lZXByb21fY2hlY2tzdW0oc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX3dyaXRlX2VlcHJvbShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MTZfdCByZWcsIHVpbnQxNl90IHdvcmRzLCB1aW50MTZfdCAqZGF0YSk7CitpbnQzMl90IGUxMDAwX3JlYWRfcGFydF9udW0oc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3QgKiBwYXJ0X251bSk7CitpbnQzMl90IGUxMDAwX3JlYWRfbWFjX2FkZHIoc3RydWN0IGUxMDAwX2h3ICogaHcpOworCisvKiBGaWx0ZXJzIChtdWx0aWNhc3QsIHZsYW4sIHJlY2VpdmUpICovCit2b2lkIGUxMDAwX2luaXRfcnhfYWRkcnMoc3RydWN0IGUxMDAwX2h3ICpodyk7Cit2b2lkIGUxMDAwX21jX2FkZHJfbGlzdF91cGRhdGUoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDhfdCAqIG1jX2FkZHJfbGlzdCwgdWludDMyX3QgbWNfYWRkcl9jb3VudCwgdWludDMyX3QgcGFkLCB1aW50MzJfdCByYXJfdXNlZF9jb3VudCk7Cit1aW50MzJfdCBlMTAwMF9oYXNoX21jX2FkZHIoc3RydWN0IGUxMDAwX2h3ICpodywgdWludDhfdCAqIG1jX2FkZHIpOwordm9pZCBlMTAwMF9tdGFfc2V0KHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IGhhc2hfdmFsdWUpOwordm9pZCBlMTAwMF9yYXJfc2V0KHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQ4X3QgKiBtY19hZGRyLCB1aW50MzJfdCByYXJfaW5kZXgpOwordm9pZCBlMTAwMF93cml0ZV92ZnRhKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgdmFsdWUpOwordm9pZCBlMTAwMF9jbGVhcl92ZnRhKHN0cnVjdCBlMTAwMF9odyAqaHcpOworCisvKiBMRUQgZnVuY3Rpb25zICovCitpbnQzMl90IGUxMDAwX3NldHVwX2xlZChzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfY2xlYW51cF9sZWQoc3RydWN0IGUxMDAwX2h3ICpodyk7CitpbnQzMl90IGUxMDAwX2xlZF9vbihzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK2ludDMyX3QgZTEwMDBfbGVkX29mZihzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKKworLyogQWRhcHRpdmUgSUZTIEZ1bmN0aW9ucyAqLworCisvKiBFdmVyeXRoaW5nIGVsc2UgKi8KK3VpbnQzMl90IGUxMDAwX2VuYWJsZV9tbmdfcGFzc190aHJ1KHN0cnVjdCBlMTAwMF9odyAqaHcpOwordm9pZCBlMTAwMF9jbGVhcl9od19jbnRycyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3ZvaWQgZTEwMDBfcmVzZXRfYWRhcHRpdmUoc3RydWN0IGUxMDAwX2h3ICpodyk7Cit2b2lkIGUxMDAwX3VwZGF0ZV9hZGFwdGl2ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3ZvaWQgZTEwMDBfdGJpX2FkanVzdF9zdGF0cyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBzdHJ1Y3QgZTEwMDBfaHdfc3RhdHMgKnN0YXRzLCB1aW50MzJfdCBmcmFtZV9sZW4sIHVpbnQ4X3QgKiBtYWNfYWRkcik7Cit2b2lkIGUxMDAwX2dldF9idXNfaW5mbyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKK3ZvaWQgZTEwMDBfcGNpX3NldF9td2koc3RydWN0IGUxMDAwX2h3ICpodyk7Cit2b2lkIGUxMDAwX3BjaV9jbGVhcl9td2koc3RydWN0IGUxMDAwX2h3ICpodyk7Cit2b2lkIGUxMDAwX3JlYWRfcGNpX2NmZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCByZWcsIHVpbnQxNl90ICogdmFsdWUpOwordm9pZCBlMTAwMF93cml0ZV9wY2lfY2ZnKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IHJlZywgdWludDE2X3QgKiB2YWx1ZSk7CisvKiBQb3J0IEkvTyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MjU0NCBhbmQgbmV3ZXIgKi8KK3VpbnQzMl90IGUxMDAwX2lvX3JlYWQoc3RydWN0IGUxMDAwX2h3ICpodywgdW5zaWduZWQgbG9uZyBwb3J0KTsKK3VpbnQzMl90IGUxMDAwX3JlYWRfcmVnX2lvKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IG9mZnNldCk7Cit2b2lkIGUxMDAwX2lvX3dyaXRlKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVuc2lnbmVkIGxvbmcgcG9ydCwgdWludDMyX3QgdmFsdWUpOwordm9pZCBlMTAwMF93cml0ZV9yZWdfaW8oc3RydWN0IGUxMDAwX2h3ICpodywgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCB2YWx1ZSk7CitpbnQzMl90IGUxMDAwX2NvbmZpZ19kc3BfYWZ0ZXJfbGlua19jaGFuZ2Uoc3RydWN0IGUxMDAwX2h3ICpodywgYm9vbGVhbl90IGxpbmtfdXApOworaW50MzJfdCBlMTAwMF9zZXRfZDNfbHBsdV9zdGF0ZShzdHJ1Y3QgZTEwMDBfaHcgKmh3LCBib29sZWFuX3QgYWN0aXZlKTsKKworI2RlZmluZSBFMTAwMF9SRUFEX1JFR19JTyhhLCByZWcpIFwKKyAgICBlMTAwMF9yZWFkX3JlZ19pbygoYSksIEUxMDAwXyMjcmVnKQorI2RlZmluZSBFMTAwMF9XUklURV9SRUdfSU8oYSwgcmVnLCB2YWwpIFwKKyAgICBlMTAwMF93cml0ZV9yZWdfaW8oKGEpLCBFMTAwMF8jI3JlZywgdmFsKQorCisvKiBQQ0kgRGV2aWNlIElEcyAqLworI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDIgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQzR0NfRklCRVIgICAgICAgMHgxMDAxCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0M0dDX0NPUFBFUiAgICAgIDB4MTAwNAorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDRFSV9DT1BQRVIgICAgICAweDEwMDgKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ0RUlfRklCRVIgICAgICAgMHgxMDA5CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NEdDX0NPUFBFUiAgICAgIDB4MTAwQworI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDRHQ19MT00gICAgICAgICAweDEwMEQKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQwRU0gICAgICAgICAgICAgMHgxMDBFCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0MEVNX0xPTSAgICAgICAgIDB4MTAxNQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDBFUF9MT00gICAgICAgICAweDEwMTYKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQwRVAgICAgICAgICAgICAgMHgxMDE3CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0MEVQX0xQICAgICAgICAgIDB4MTAxRQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDVFTV9DT1BQRVIgICAgICAweDEwMEYKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ1RU1fRklCRVIgICAgICAgMHgxMDExCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NUdNX0NPUFBFUiAgICAgIDB4MTAyNgorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDVHTV9GSUJFUiAgICAgICAweDEwMjcKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ1R01fU0VSREVTICAgICAgMHgxMDI4CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NkVCX0NPUFBFUiAgICAgIDB4MTAxMAorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDZFQl9GSUJFUiAgICAgICAweDEwMTIKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ2RUJfUVVBRF9DT1BQRVIgMHgxMDFECisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0MUVJICAgICAgICAgICAgIDB4MTAxMworI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDFFSV9NT0JJTEUgICAgICAweDEwMTgKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQxRVIgICAgICAgICAgICAgMHgxMDc4CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0N0dJICAgICAgICAgICAgIDB4MTA3NQorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDFHSSAgICAgICAgICAgICAweDEwNzYKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQxR0lfTU9CSUxFICAgICAgMHgxMDc3CisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0MUdJX0xGICAgICAgICAgIDB4MTA3QworI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDZHQl9DT1BQRVIgICAgICAweDEwNzkKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ2R0JfRklCRVIgICAgICAgMHgxMDdBCisjZGVmaW5lIEUxMDAwX0RFVl9JRF84MjU0NkdCX1NFUkRFUyAgICAgIDB4MTA3QgorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NDZHQl9QQ0lFICAgICAgICAweDEwOEEKKyNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTQ3RUkgICAgICAgICAgICAgMHgxMDE5CisKKyNkZWZpbmUgTk9ERV9BRERSRVNTX1NJWkUgNgorI2RlZmluZSBFVEhfTEVOR1RIX09GX0FERFJFU1MgNgorCisvKiBNQUMgZGVjb2RlIHNpemUgaXMgMTI4SyAtIFRoaXMgaXMgdGhlIHNpemUgb2YgQkFSMCAqLworI2RlZmluZSBNQUNfREVDT0RFX1NJWkUgKDEyOCAqIDEwMjQpCisKKyNkZWZpbmUgRTEwMDBfODI1NDJfMl8wX1JFVl9JRCAyCisjZGVmaW5lIEUxMDAwXzgyNTQyXzJfMV9SRVZfSUQgMworI2RlZmluZSBFMTAwMF9SRVZJU0lPTl8wICAgICAgIDAKKyNkZWZpbmUgRTEwMDBfUkVWSVNJT05fMSAgICAgICAxCisjZGVmaW5lIEUxMDAwX1JFVklTSU9OXzIgICAgICAgMgorCisjZGVmaW5lIFNQRUVEXzEwICAgIDEwCisjZGVmaW5lIFNQRUVEXzEwMCAgIDEwMAorI2RlZmluZSBTUEVFRF8xMDAwICAxMDAwCisjZGVmaW5lIEhBTEZfRFVQTEVYIDEKKyNkZWZpbmUgRlVMTF9EVVBMRVggMgorCisvKiBUaGUgc2l6ZXMgKGluIGJ5dGVzKSBvZiBhIGV0aGVybmV0IHBhY2tldCAqLworI2RlZmluZSBFTkVUX0hFQURFUl9TSVpFICAgICAgICAgICAgIDE0CisjZGVmaW5lIE1BWElNVU1fRVRIRVJORVRfRlJBTUVfU0laRSAgMTUxOCAvKiBXaXRoIEZDUyAqLworI2RlZmluZSBNSU5JTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkUgIDY0ICAgLyogV2l0aCBGQ1MgKi8KKyNkZWZpbmUgRVRIRVJORVRfRkNTX1NJWkUgICAgICAgICAgICA0CisjZGVmaW5lIE1BWElNVU1fRVRIRVJORVRfUEFDS0VUX1NJWkUgXAorICAgIChNQVhJTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkUgLSBFVEhFUk5FVF9GQ1NfU0laRSkKKyNkZWZpbmUgTUlOSU1VTV9FVEhFUk5FVF9QQUNLRVRfU0laRSBcCisgICAgKE1JTklNVU1fRVRIRVJORVRfRlJBTUVfU0laRSAtIEVUSEVSTkVUX0ZDU19TSVpFKQorI2RlZmluZSBDUkNfTEVOR1RIICAgICAgICAgICAgICAgICAgIEVUSEVSTkVUX0ZDU19TSVpFCisjZGVmaW5lIE1BWF9KVU1CT19GUkFNRV9TSVpFICAgICAgICAgMHgzRjAwCisKKworLyogODAyLjFxIFZMQU4gUGFja2V0IFNpemVzICovCisjZGVmaW5lIFZMQU5fVEFHX1NJWkUgICAgICAgICAgICAgICAgICAgICA0ICAgICAvKiA4MDIuM2FjIHRhZyAobm90IERNQWVkKSAqLworCisvKiBFdGhlcnR5cGUgZmllbGQgdmFsdWVzICovCisjZGVmaW5lIEVUSEVSTkVUX0lFRUVfVkxBTl9UWVBFIDB4ODEwMCAgLyogODAyLjNhYyBwYWNrZXQgKi8KKyNkZWZpbmUgRVRIRVJORVRfSVBfVFlQRSAgICAgICAgMHgwODAwICAvKiBJUCBwYWNrZXRzICovCisjZGVmaW5lIEVUSEVSTkVUX0FSUF9UWVBFICAgICAgIDB4MDgwNiAgLyogQWRkcmVzcyBSZXNvbHV0aW9uIFByb3RvY29sIChBUlApICovCisKKy8qIFBhY2tldCBIZWFkZXIgZGVmaW5lcyAqLworI2RlZmluZSBJUF9QUk9UT0NPTF9UQ1AgICAgNgorI2RlZmluZSBJUF9QUk9UT0NPTF9VRFAgICAgMHgxMQorCisvKiBUaGlzIGRlZmluZXMgdGhlIGJpdHMgdGhhdCBhcmUgc2V0IGluIHRoZSBJbnRlcnJ1cHQgTWFzaworICogU2V0L1JlYWQgUmVnaXN0ZXIuICBFYWNoIGJpdCBpcyBkb2N1bWVudGVkIGJlbG93OgorICogICBvIFJYRE1UMCA9IFJlY2VpdmUgRGVzY3JpcHRvciBNaW5pbXVtIFRocmVzaG9sZCBoaXQgKHJpbmcgMCkKKyAqICAgbyBSWFNFUSAgPSBSZWNlaXZlIFNlcXVlbmNlIEVycm9yCisgKi8KKyNkZWZpbmUgUE9MTF9JTVNfRU5BQkxFX01BU0sgKCBcCisgICAgRTEwMDBfSU1TX1JYRE1UMCB8ICAgICAgICAgXAorICAgIEUxMDAwX0lNU19SWFNFUSkKKworLyogVGhpcyBkZWZpbmVzIHRoZSBiaXRzIHRoYXQgYXJlIHNldCBpbiB0aGUgSW50ZXJydXB0IE1hc2sKKyAqIFNldC9SZWFkIFJlZ2lzdGVyLiAgRWFjaCBiaXQgaXMgZG9jdW1lbnRlZCBiZWxvdzoKKyAqICAgbyBSWFQwICAgPSBSZWNlaXZlciBUaW1lciBJbnRlcnJ1cHQgKHJpbmcgMCkKKyAqICAgbyBUWERXICAgPSBUcmFuc21pdCBEZXNjcmlwdG9yIFdyaXR0ZW4gQmFjaworICogICBvIFJYRE1UMCA9IFJlY2VpdmUgRGVzY3JpcHRvciBNaW5pbXVtIFRocmVzaG9sZCBoaXQgKHJpbmcgMCkKKyAqICAgbyBSWFNFUSAgPSBSZWNlaXZlIFNlcXVlbmNlIEVycm9yCisgKiAgIG8gTFNDICAgID0gTGluayBTdGF0dXMgQ2hhbmdlCisgKi8KKyNkZWZpbmUgSU1TX0VOQUJMRV9NQVNLICggXAorICAgIEUxMDAwX0lNU19SWFQwICAgfCAgICBcCisgICAgRTEwMDBfSU1TX1RYRFcgICB8ICAgIFwKKyAgICBFMTAwMF9JTVNfUlhETVQwIHwgICAgXAorICAgIEUxMDAwX0lNU19SWFNFUSAgfCAgICBcCisgICAgRTEwMDBfSU1TX0xTQykKKworLyogTnVtYmVyIG9mIGhpZ2gvbG93IHJlZ2lzdGVyIHBhaXJzIGluIHRoZSBSQVIuIFRoZSBSQVIgKFJlY2VpdmUgQWRkcmVzcworICogUmVnaXN0ZXJzKSBob2xkcyB0aGUgZGlyZWN0ZWQgYW5kIG11bHRpY2FzdCBhZGRyZXNzZXMgdGhhdCB3ZSBtb25pdG9yLiBXZQorICogcmVzZXJ2ZSBvbmUgb2YgdGhlc2Ugc3BvdHMgZm9yIG91ciBkaXJlY3RlZCBhZGRyZXNzLCBhbGxvd2luZyB1cyByb29tIGZvcgorICogRTEwMDBfUkFSX0VOVFJJRVMgLSAxIG11bHRpY2FzdCBhZGRyZXNzZXMuCisgKi8KKyNkZWZpbmUgRTEwMDBfUkFSX0VOVFJJRVMgMTUKKworI2RlZmluZSBNSU5fTlVNQkVSX09GX0RFU0NSSVBUT1JTIDgKKyNkZWZpbmUgTUFYX05VTUJFUl9PRl9ERVNDUklQVE9SUyAweEZGRjgKKworLyogUmVjZWl2ZSBEZXNjcmlwdG9yICovCitzdHJ1Y3QgZTEwMDBfcnhfZGVzYyB7CisgICAgdWludDY0X3QgYnVmZmVyX2FkZHI7IC8qIEFkZHJlc3Mgb2YgdGhlIGRlc2NyaXB0b3IncyBkYXRhIGJ1ZmZlciAqLworICAgIHVpbnQxNl90IGxlbmd0aDsgICAgIC8qIExlbmd0aCBvZiBkYXRhIERNQWVkIGludG8gZGF0YSBidWZmZXIgKi8KKyAgICB1aW50MTZfdCBjc3VtOyAgICAgICAvKiBQYWNrZXQgY2hlY2tzdW0gKi8KKyAgICB1aW50OF90IHN0YXR1czsgICAgICAvKiBEZXNjcmlwdG9yIHN0YXR1cyAqLworICAgIHVpbnQ4X3QgZXJyb3JzOyAgICAgIC8qIERlc2NyaXB0b3IgRXJyb3JzICovCisgICAgdWludDE2X3Qgc3BlY2lhbDsKK307CisKKy8qIFJlY2VpdmUgRGVjcmlwdG9yIGJpdCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBFMTAwMF9SWERfU1RBVF9ERCAgICAgICAweDAxICAgIC8qIERlc2NyaXB0b3IgRG9uZSAqLworI2RlZmluZSBFMTAwMF9SWERfU1RBVF9FT1AgICAgICAweDAyICAgIC8qIEVuZCBvZiBQYWNrZXQgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfSVhTTSAgICAgMHgwNCAgICAvKiBJZ25vcmUgY2hlY2tzdW0gKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfVlAgICAgICAgMHgwOCAgICAvKiBJRUVFIFZMQU4gUGFja2V0ICovCisjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX1RDUENTICAgIDB4MjAgICAgLyogVENQIHhzdW0gY2FsY3VsYXRlZCAqLworI2RlZmluZSBFMTAwMF9SWERfU1RBVF9JUENTICAgICAweDQwICAgIC8qIElQIHhzdW0gY2FsY3VsYXRlZCAqLworI2RlZmluZSBFMTAwMF9SWERfU1RBVF9QSUYgICAgICAweDgwICAgIC8qIHBhc3NlZCBpbi1leGFjdCBmaWx0ZXIgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX0VSUl9DRSAgICAgICAgMHgwMSAgICAvKiBDUkMgRXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX0VSUl9TRSAgICAgICAgMHgwMiAgICAvKiBTeW1ib2wgRXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX0VSUl9TRVEgICAgICAgMHgwNCAgICAvKiBTZXF1ZW5jZSBFcnJvciAqLworI2RlZmluZSBFMTAwMF9SWERfRVJSX0NYRSAgICAgICAweDEwICAgIC8qIENhcnJpZXIgRXh0ZW5zaW9uIEVycm9yICovCisjZGVmaW5lIEUxMDAwX1JYRF9FUlJfVENQRSAgICAgIDB4MjAgICAgLyogVENQL1VEUCBDaGVja3N1bSBFcnJvciAqLworI2RlZmluZSBFMTAwMF9SWERfRVJSX0lQRSAgICAgICAweDQwICAgIC8qIElQIENoZWNrc3VtIEVycm9yICovCisjZGVmaW5lIEUxMDAwX1JYRF9FUlJfUlhFICAgICAgIDB4ODAgICAgLyogUnggRGF0YSBFcnJvciAqLworI2RlZmluZSBFMTAwMF9SWERfU1BDX1ZMQU5fTUFTSyAweDBGRkYgIC8qIFZMQU4gSUQgaXMgaW4gbG93ZXIgMTIgYml0cyAqLworI2RlZmluZSBFMTAwMF9SWERfU1BDX1BSSV9NQVNLICAweEUwMDAgIC8qIFByaW9yaXR5IGlzIGluIHVwcGVyIDMgYml0cyAqLworI2RlZmluZSBFMTAwMF9SWERfU1BDX1BSSV9TSElGVCAweDAwMEQgIC8qIFByaW9yaXR5IGlzIGluIHVwcGVyIDMgb2YgMTYgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NQQ19DRklfTUFTSyAgMHgxMDAwICAvKiBDRkkgaXMgYml0IDEyICovCisjZGVmaW5lIEUxMDAwX1JYRF9TUENfQ0ZJX1NISUZUIDB4MDAwQyAgLyogQ0ZJIGlzIGJpdCAxMiAqLworCisvKiBtYXNrIHRvIGRldGVybWluZSBpZiBwYWNrZXRzIHNob3VsZCBiZSBkcm9wcGVkIGR1ZSB0byBmcmFtZSBlcnJvcnMgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX0VSUl9GUkFNRV9FUlJfTUFTSyAoIFwKKyAgICBFMTAwMF9SWERfRVJSX0NFICB8ICAgICAgICAgICAgICAgIFwKKyAgICBFMTAwMF9SWERfRVJSX1NFICB8ICAgICAgICAgICAgICAgIFwKKyAgICBFMTAwMF9SWERfRVJSX1NFUSB8ICAgICAgICAgICAgICAgIFwKKyAgICBFMTAwMF9SWERfRVJSX0NYRSB8ICAgICAgICAgICAgICAgIFwKKyAgICBFMTAwMF9SWERfRVJSX1JYRSkKKworLyogVHJhbnNtaXQgRGVzY3JpcHRvciAqLworc3RydWN0IGUxMDAwX3R4X2Rlc2MgeworICAgIHVpbnQ2NF90IGJ1ZmZlcl9hZGRyOyAgICAgICAvKiBBZGRyZXNzIG9mIHRoZSBkZXNjcmlwdG9yJ3MgZGF0YSBidWZmZXIgKi8KKyAgICB1bmlvbiB7CisgICAgICAgIHVpbnQzMl90IGRhdGE7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGg7ICAgIC8qIERhdGEgYnVmZmVyIGxlbmd0aCAqLworICAgICAgICAgICAgdWludDhfdCBjc287ICAgICAgICAvKiBDaGVja3N1bSBvZmZzZXQgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgY21kOyAgICAgICAgLyogRGVzY3JpcHRvciBjb250cm9sICovCisgICAgICAgIH0gZmxhZ3M7CisgICAgfSBsb3dlcjsKKyAgICB1bmlvbiB7CisgICAgICAgIHVpbnQzMl90IGRhdGE7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50OF90IHN0YXR1czsgICAgIC8qIERlc2NyaXB0b3Igc3RhdHVzICovCisgICAgICAgICAgICB1aW50OF90IGNzczsgICAgICAgIC8qIENoZWNrc3VtIHN0YXJ0ICovCisgICAgICAgICAgICB1aW50MTZfdCBzcGVjaWFsOworICAgICAgICB9IGZpZWxkczsKKyAgICB9IHVwcGVyOworfTsKKworLyogVHJhbnNtaXQgRGVzY3JpcHRvciBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0RUWVBfRCAgICAgMHgwMDEwMDAwMCAvKiBEYXRhIERlc2NyaXB0b3IgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0RUWVBfQyAgICAgMHgwMDAwMDAwMCAvKiBDb250ZXh0IERlc2NyaXB0b3IgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX1BPUFRTX0lYU00gMHgwMSAgICAgICAvKiBJbnNlcnQgSVAgY2hlY2tzdW0gKi8KKyNkZWZpbmUgRTEwMDBfVFhEX1BPUFRTX1RYU00gMHgwMiAgICAgICAvKiBJbnNlcnQgVENQL1VEUCBjaGVja3N1bSAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX0VPUCAgICAweDAxMDAwMDAwIC8qIEVuZCBvZiBQYWNrZXQgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9JRkNTICAgMHgwMjAwMDAwMCAvKiBJbnNlcnQgRkNTIChFdGhlcm5ldCBDUkMpICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfSUMgICAgIDB4MDQwMDAwMDAgLyogSW5zZXJ0IENoZWNrc3VtICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfUlMgICAgIDB4MDgwMDAwMDAgLyogUmVwb3J0IFN0YXR1cyAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX1JQUyAgICAweDEwMDAwMDAwIC8qIFJlcG9ydCBQYWNrZXQgU2VudCAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX0RFWFQgICAweDIwMDAwMDAwIC8qIERlc2NyaXB0b3IgZXh0ZW5zaW9uICgwID0gbGVnYWN5KSAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX1ZMRSAgICAweDQwMDAwMDAwIC8qIEFkZCBWTEFOIHRhZyAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX0lERSAgICAweDgwMDAwMDAwIC8qIEVuYWJsZSBUaWR2IHJlZ2lzdGVyICovCisjZGVmaW5lIEUxMDAwX1RYRF9TVEFUX0REICAgIDB4MDAwMDAwMDEgLyogRGVzY3JpcHRvciBEb25lICovCisjZGVmaW5lIEUxMDAwX1RYRF9TVEFUX0VDICAgIDB4MDAwMDAwMDIgLyogRXhjZXNzIENvbGxpc2lvbnMgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX1NUQVRfTEMgICAgMHgwMDAwMDAwNCAvKiBMYXRlIENvbGxpc2lvbnMgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX1NUQVRfVFUgICAgMHgwMDAwMDAwOCAvKiBUcmFuc21pdCB1bmRlcnJ1biAqLworI2RlZmluZSBFMTAwMF9UWERfQ01EX1RDUCAgICAweDAxMDAwMDAwIC8qIFRDUCBwYWNrZXQgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9JUCAgICAgMHgwMjAwMDAwMCAvKiBJUCBwYWNrZXQgKi8KKyNkZWZpbmUgRTEwMDBfVFhEX0NNRF9UU0UgICAgMHgwNDAwMDAwMCAvKiBUQ1AgU2VnIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9UWERfU1RBVF9UQyAgICAweDAwMDAwMDA0IC8qIFR4IFVuZGVycnVuICovCisKKy8qIE9mZmxvYWQgQ29udGV4dCBEZXNjcmlwdG9yICovCitzdHJ1Y3QgZTEwMDBfY29udGV4dF9kZXNjIHsKKyAgICB1bmlvbiB7CisgICAgICAgIHVpbnQzMl90IGlwX2NvbmZpZzsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQ4X3QgaXBjc3M7ICAgICAgLyogSVAgY2hlY2tzdW0gc3RhcnQgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgaXBjc287ICAgICAgLyogSVAgY2hlY2tzdW0gb2Zmc2V0ICovCisgICAgICAgICAgICB1aW50MTZfdCBpcGNzZTsgICAgIC8qIElQIGNoZWNrc3VtIGVuZCAqLworICAgICAgICB9IGlwX2ZpZWxkczsKKyAgICB9IGxvd2VyX3NldHVwOworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDMyX3QgdGNwX2NvbmZpZzsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdHVjc3M7ICAgICAgLyogVENQIGNoZWNrc3VtIHN0YXJ0ICovCisgICAgICAgICAgICB1aW50OF90IHR1Y3NvOyAgICAgIC8qIFRDUCBjaGVja3N1bSBvZmZzZXQgKi8KKyAgICAgICAgICAgIHVpbnQxNl90IHR1Y3NlOyAgICAgLyogVENQIGNoZWNrc3VtIGVuZCAqLworICAgICAgICB9IHRjcF9maWVsZHM7CisgICAgfSB1cHBlcl9zZXR1cDsKKyAgICB1aW50MzJfdCBjbWRfYW5kX2xlbmd0aDsgICAgLyogKi8KKyAgICB1bmlvbiB7CisgICAgICAgIHVpbnQzMl90IGRhdGE7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50OF90IHN0YXR1czsgICAgIC8qIERlc2NyaXB0b3Igc3RhdHVzICovCisgICAgICAgICAgICB1aW50OF90IGhkcl9sZW47ICAgIC8qIEhlYWRlciBsZW5ndGggKi8KKyAgICAgICAgICAgIHVpbnQxNl90IG1zczsgICAgICAgLyogTWF4aW11bSBzZWdtZW50IHNpemUgKi8KKyAgICAgICAgfSBmaWVsZHM7CisgICAgfSB0Y3Bfc2VnX3NldHVwOworfTsKKworLyogT2ZmbG9hZCBkYXRhIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBlMTAwMF9kYXRhX2Rlc2MgeworICAgIHVpbnQ2NF90IGJ1ZmZlcl9hZGRyOyAgICAgICAvKiBBZGRyZXNzIG9mIHRoZSBkZXNjcmlwdG9yJ3MgYnVmZmVyIGFkZHJlc3MgKi8KKyAgICB1bmlvbiB7CisgICAgICAgIHVpbnQzMl90IGRhdGE7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50MTZfdCBsZW5ndGg7ICAgIC8qIERhdGEgYnVmZmVyIGxlbmd0aCAqLworICAgICAgICAgICAgdWludDhfdCB0eXBfbGVuX2V4dDsgICAgICAgIC8qICovCisgICAgICAgICAgICB1aW50OF90IGNtZDsgICAgICAgIC8qICovCisgICAgICAgIH0gZmxhZ3M7CisgICAgfSBsb3dlcjsKKyAgICB1bmlvbiB7CisgICAgICAgIHVpbnQzMl90IGRhdGE7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50OF90IHN0YXR1czsgICAgIC8qIERlc2NyaXB0b3Igc3RhdHVzICovCisgICAgICAgICAgICB1aW50OF90IHBvcHRzOyAgICAgIC8qIFBhY2tldCBPcHRpb25zICovCisgICAgICAgICAgICB1aW50MTZfdCBzcGVjaWFsOyAgIC8qICovCisgICAgICAgIH0gZmllbGRzOworICAgIH0gdXBwZXI7Cit9OworCisvKiBGaWx0ZXJzICovCisjZGVmaW5lIEUxMDAwX05VTV9VTklDQVNUICAgICAgICAgIDE2ICAgLyogVW5pY2FzdCBmaWx0ZXIgZW50cmllcyAqLworI2RlZmluZSBFMTAwMF9NQ19UQkxfU0laRSAgICAgICAgICAxMjggIC8qIE11bHRpY2FzdCBGaWx0ZXIgVGFibGUgKDQwOTYgYml0cykgKi8KKyNkZWZpbmUgRTEwMDBfVkxBTl9GSUxURVJfVEJMX1NJWkUgMTI4ICAvKiBWTEFOIEZpbHRlciBUYWJsZSAoNDA5NiBiaXRzKSAqLworCisKKy8qIFJlY2VpdmUgQWRkcmVzcyBSZWdpc3RlciAqLworc3RydWN0IGUxMDAwX3JhciB7CisgICAgdm9sYXRpbGUgdWludDMyX3QgbG93OyAgICAgIC8qIHJlY2VpdmUgYWRkcmVzcyBsb3cgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCBoaWdoOyAgICAgLyogcmVjZWl2ZSBhZGRyZXNzIGhpZ2ggKi8KK307CisKKy8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBNdWx0aWNhc3QgVGFibGUgQXJyYXkgKE1UQSkuICovCisjZGVmaW5lIEUxMDAwX05VTV9NVEFfUkVHSVNURVJTIDEyOAorCisvKiBJUHY0IEFkZHJlc3MgVGFibGUgRW50cnkgKi8KK3N0cnVjdCBlMTAwMF9pcHY0X2F0X2VudHJ5IHsKKyAgICB2b2xhdGlsZSB1aW50MzJfdCBpcHY0X2FkZHI7ICAgICAgICAvKiBJUCBBZGRyZXNzIChSVykgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZDsKK307CisKKy8qIEZvdXIgd2FrZXVwIElQIGFkZHJlc3NlcyBhcmUgc3VwcG9ydGVkICovCisjZGVmaW5lIEUxMDAwX1dBS0VVUF9JUF9BRERSRVNTX0NPVU5UX01BWCA0CisjZGVmaW5lIEUxMDAwX0lQNEFUX1NJWkUgICAgICAgICAgICAgICAgICBFMTAwMF9XQUtFVVBfSVBfQUREUkVTU19DT1VOVF9NQVgKKyNkZWZpbmUgRTEwMDBfSVA2QVRfU0laRSAgICAgICAgICAgICAgICAgIDEKKworLyogSVB2NiBBZGRyZXNzIFRhYmxlIEVudHJ5ICovCitzdHJ1Y3QgZTEwMDBfaXB2Nl9hdF9lbnRyeSB7CisgICAgdm9sYXRpbGUgdWludDhfdCBpcHY2X2FkZHJbMTZdOworfTsKKworLyogRmxleGlibGUgRmlsdGVyIExlbmd0aCBUYWJsZSBFbnRyeSAqLworc3RydWN0IGUxMDAwX2ZmbHRfZW50cnkgeworICAgIHZvbGF0aWxlIHVpbnQzMl90IGxlbmd0aDsgICAvKiBGbGV4aWJsZSBGaWx0ZXIgTGVuZ3RoIChSVykgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZDsKK307CisKKy8qIEZsZXhpYmxlIEZpbHRlciBNYXNrIFRhYmxlIEVudHJ5ICovCitzdHJ1Y3QgZTEwMDBfZmZtdF9lbnRyeSB7CisgICAgdm9sYXRpbGUgdWludDMyX3QgbWFzazsgICAgIC8qIEZsZXhpYmxlIEZpbHRlciBNYXNrIChSVykgKi8KKyAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZDsKK307CisKKy8qIEZsZXhpYmxlIEZpbHRlciBWYWx1ZSBUYWJsZSBFbnRyeSAqLworc3RydWN0IGUxMDAwX2ZmdnRfZW50cnkgeworICAgIHZvbGF0aWxlIHVpbnQzMl90IHZhbHVlOyAgICAvKiBGbGV4aWJsZSBGaWx0ZXIgVmFsdWUgKFJXKSAqLworICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkOworfTsKKworLyogRm91ciBGbGV4aWJsZSBGaWx0ZXJzIGFyZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgRTEwMDBfRkxFWElCTEVfRklMVEVSX0NPVU5UX01BWCA0CisKKy8qIEVhY2ggRmxleGlibGUgRmlsdGVyIGlzIGF0IG1vc3QgMTI4ICgweDgwKSBieXRlcyBpbiBsZW5ndGggKi8KKyNkZWZpbmUgRTEwMDBfRkxFWElCTEVfRklMVEVSX1NJWkVfTUFYICAxMjgKKworI2RlZmluZSBFMTAwMF9GRkxUX1NJWkUgRTEwMDBfRkxFWElCTEVfRklMVEVSX0NPVU5UX01BWAorI2RlZmluZSBFMTAwMF9GRk1UX1NJWkUgRTEwMDBfRkxFWElCTEVfRklMVEVSX1NJWkVfTUFYCisjZGVmaW5lIEUxMDAwX0ZGVlRfU0laRSBFMTAwMF9GTEVYSUJMRV9GSUxURVJfU0laRV9NQVgKKworLyogUmVnaXN0ZXIgU2V0LiAoODI1NDMsIDgyNTQ0KQorICoKKyAqIFJlZ2lzdGVycyBhcmUgZGVmaW5lZCB0byBiZSAzMiBiaXRzIGFuZCAgc2hvdWxkIGJlIGFjY2Vzc2VkIGFzIDMyIGJpdCB2YWx1ZXMuCisgKiBUaGVzZSByZWdpc3RlcnMgYXJlIHBoeXNpY2FsbHkgbG9jYXRlZCBvbiB0aGUgTklDLCBidXQgYXJlIG1hcHBlZCBpbnRvIHRoZQorICogaG9zdCBtZW1vcnkgYWRkcmVzcyBzcGFjZS4KKyAqCisgKiBSVyAtIHJlZ2lzdGVyIGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlCisgKiBSTyAtIHJlZ2lzdGVyIGlzIHJlYWQgb25seQorICogV08gLSByZWdpc3RlciBpcyB3cml0ZSBvbmx5CisgKiBSL2NsciAtIHJlZ2lzdGVyIGlzIHJlYWQgb25seSBhbmQgaXMgY2xlYXJlZCB3aGVuIHJlYWQKKyAqIEEgLSByZWdpc3RlciBhcnJheQorICovCisjZGVmaW5lIEUxMDAwX0NUUkwgICAgIDB4MDAwMDAgIC8qIERldmljZSBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9EVVAgMHgwMDAwNCAgLyogRGV2aWNlIENvbnRyb2wgRHVwbGljYXRlIChTaGFkb3cpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTICAgMHgwMDAwOCAgLyogRGV2aWNlIFN0YXR1cyAtIFJPICovCisjZGVmaW5lIEUxMDAwX0VFQ0QgICAgIDB4MDAwMTAgIC8qIEVFUFJPTS9GbGFzaCBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRUVSRCAgICAgMHgwMDAxNCAgLyogRUVQUk9NIFJlYWQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVCAweDAwMDE4ICAvKiBFeHRlbmRlZCBEZXZpY2UgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX0ZMQSAgICAgIDB4MDAwMUMgIC8qIEZsYXNoIEFjY2VzcyAtIFJXICovCisjZGVmaW5lIEUxMDAwX01ESUMgICAgIDB4MDAwMjAgIC8qIE1ESSBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRkNBTCAgICAgMHgwMDAyOCAgLyogRmxvdyBDb250cm9sIEFkZHJlc3MgTG93IC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRkNBSCAgICAgMHgwMDAyQyAgLyogRmxvdyBDb250cm9sIEFkZHJlc3MgSGlnaCAtUlcgKi8KKyNkZWZpbmUgRTEwMDBfRkNUICAgICAgMHgwMDAzMCAgLyogRmxvdyBDb250cm9sIFR5cGUgLSBSVyAqLworI2RlZmluZSBFMTAwMF9WRVQgICAgICAweDAwMDM4ICAvKiBWTEFOIEV0aGVyIFR5cGUgLSBSVyAqLworI2RlZmluZSBFMTAwMF9JQ1IgICAgICAweDAwMEMwICAvKiBJbnRlcnJ1cHQgQ2F1c2UgUmVhZCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0lUUiAgICAgIDB4MDAwQzQgIC8qIEludGVycnVwdCBUaHJvdHRsaW5nIFJhdGUgLSBSVyAqLworI2RlZmluZSBFMTAwMF9JQ1MgICAgICAweDAwMEM4ICAvKiBJbnRlcnJ1cHQgQ2F1c2UgU2V0IC0gV08gKi8KKyNkZWZpbmUgRTEwMDBfSU1TICAgICAgMHgwMDBEMCAgLyogSW50ZXJydXB0IE1hc2sgU2V0IC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfSU1DICAgICAgMHgwMDBEOCAgLyogSW50ZXJydXB0IE1hc2sgQ2xlYXIgLSBXTyAqLworI2RlZmluZSBFMTAwMF9SQ1RMICAgICAweDAwMTAwICAvKiBSWCBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRkNUVFYgICAgMHgwMDE3MCAgLyogRmxvdyBDb250cm9sIFRyYW5zbWl0IFRpbWVyIFZhbHVlIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVFhDVyAgICAgMHgwMDE3OCAgLyogVFggQ29uZmlndXJhdGlvbiBXb3JkIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUlhDVyAgICAgMHgwMDE4MCAgLyogUlggQ29uZmlndXJhdGlvbiBXb3JkIC0gUk8gKi8KKyNkZWZpbmUgRTEwMDBfVENUTCAgICAgMHgwMDQwMCAgLyogVFggQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RJUEcgICAgIDB4MDA0MTAgIC8qIFRYIEludGVyLXBhY2tldCBnYXAgLVJXICovCisjZGVmaW5lIEUxMDAwX1RCVCAgICAgIDB4MDA0NDggIC8qIFRYIEJ1cnN0IFRpbWVyIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfQUlUICAgICAgMHgwMDQ1OCAgLyogQWRhcHRpdmUgSW50ZXJmcmFtZSBTcGFjaW5nIFRocm90dGxlIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfTEVEQ1RMICAgMHgwMEUwMCAgLyogTEVEIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9QQkEgICAgICAweDAxMDAwICAvKiBQYWNrZXQgQnVmZmVyIEFsbG9jYXRpb24gLSBSVyAqLworI2RlZmluZSBFMTAwMF9GQ1JUTCAgICAweDAyMTYwICAvKiBGbG93IENvbnRyb2wgUmVjZWl2ZSBUaHJlc2hvbGQgTG93IC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRkNSVEggICAgMHgwMjE2OCAgLyogRmxvdyBDb250cm9sIFJlY2VpdmUgVGhyZXNob2xkIEhpZ2ggLSBSVyAqLworI2RlZmluZSBFMTAwMF9SREJBTCAgICAweDAyODAwICAvKiBSWCBEZXNjcmlwdG9yIEJhc2UgQWRkcmVzcyBMb3cgLSBSVyAqLworI2RlZmluZSBFMTAwMF9SREJBSCAgICAweDAyODA0ICAvKiBSWCBEZXNjcmlwdG9yIEJhc2UgQWRkcmVzcyBIaWdoIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfUkRMRU4gICAgMHgwMjgwOCAgLyogUlggRGVzY3JpcHRvciBMZW5ndGggLSBSVyAqLworI2RlZmluZSBFMTAwMF9SREggICAgICAweDAyODEwICAvKiBSWCBEZXNjcmlwdG9yIEhlYWQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9SRFQgICAgICAweDAyODE4ICAvKiBSWCBEZXNjcmlwdG9yIFRhaWwgLSBSVyAqLworI2RlZmluZSBFMTAwMF9SRFRSICAgICAweDAyODIwICAvKiBSWCBEZWxheSBUaW1lciAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JYRENUTCAgIDB4MDI4MjggIC8qIFJYIERlc2NyaXB0b3IgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JBRFYgICAgIDB4MDI4MkMgIC8qIFJYIEludGVycnVwdCBBYnNvbHV0ZSBEZWxheSBUaW1lciAtIFJXICovCisjZGVmaW5lIEUxMDAwX1JTUlBEICAgIDB4MDJDMDAgIC8qIFJYIFNtYWxsIFBhY2tldCBEZXRlY3QgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UWERNQUMgICAweDAzMDAwICAvKiBUWCBETUEgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RERkggICAgIDB4MDM0MTAgIC8qIFRYIERhdGEgRklGTyBIZWFkIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERGVCAgICAgMHgwMzQxOCAgLyogVFggRGF0YSBGSUZPIFRhaWwgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UREZIUyAgICAweDAzNDIwICAvKiBUWCBEYXRhIEZJRk8gSGVhZCBTYXZlZCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RERlRTICAgIDB4MDM0MjggIC8qIFRYIERhdGEgRklGTyBUYWlsIFNhdmVkIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfVERGUEMgICAgMHgwMzQzMCAgLyogVFggRGF0YSBGSUZPIFBhY2tldCBDb3VudCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1REQkFMICAgIDB4MDM4MDAgIC8qIFRYIERlc2NyaXB0b3IgQmFzZSBBZGRyZXNzIExvdyAtIFJXICovCisjZGVmaW5lIEUxMDAwX1REQkFIICAgIDB4MDM4MDQgIC8qIFRYIERlc2NyaXB0b3IgQmFzZSBBZGRyZXNzIEhpZ2ggLSBSVyAqLworI2RlZmluZSBFMTAwMF9URExFTiAgICAweDAzODA4ICAvKiBUWCBEZXNjcmlwdG9yIExlbmd0aCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RESCAgICAgIDB4MDM4MTAgIC8qIFRYIERlc2NyaXB0b3IgSGVhZCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1REVCAgICAgIDB4MDM4MTggIC8qIFRYIERlc2NyaXBvdHIgVGFpbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RJRFYgICAgIDB4MDM4MjAgIC8qIFRYIEludGVycnVwdCBEZWxheSBWYWx1ZSAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RYRENUTCAgIDB4MDM4MjggIC8qIFRYIERlc2NyaXB0b3IgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1RBRFYgICAgIDB4MDM4MkMgIC8qIFRYIEludGVycnVwdCBBYnNvbHV0ZSBEZWxheSBWYWwgLSBSVyAqLworI2RlZmluZSBFMTAwMF9UU1BNVCAgICAweDAzODMwICAvKiBUQ1AgU2VnbWVudGF0aW9uIFBBRCAmIE1pbiBUaHJlc2hvbGQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9DUkNFUlJTICAweDA0MDAwICAvKiBDUkMgRXJyb3IgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9BTEdORVJSQyAweDA0MDA0ICAvKiBBbGlnbm1lbnQgRXJyb3IgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9TWU1FUlJTICAweDA0MDA4ICAvKiBTeW1ib2wgRXJyb3IgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9SWEVSUkMgICAweDA0MDBDICAvKiBSZWNlaXZlIEVycm9yIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfTVBDICAgICAgMHgwNDAxMCAgLyogTWlzc2VkIFBhY2tldCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1NDQyAgICAgIDB4MDQwMTQgIC8qIFNpbmdsZSBDb2xsaXNpb24gQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9FQ09MICAgICAweDA0MDE4ICAvKiBFeGNlc3NpdmUgQ29sbGlzaW9uIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfTUNDICAgICAgMHgwNDAxQyAgLyogTXVsdGlwbGUgQ29sbGlzaW9uIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfTEFURUNPTCAgMHgwNDAyMCAgLyogTGF0ZSBDb2xsaXNpb24gQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9DT0xDICAgICAweDA0MDI4ICAvKiBDb2xsaXNpb24gQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9EQyAgICAgICAweDA0MDMwICAvKiBEZWZlciBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1ROQ1JTICAgIDB4MDQwMzQgIC8qIFRYLU5vIENSUyAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1NFQyAgICAgIDB4MDQwMzggIC8qIFNlcXVlbmNlIEVycm9yIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfQ0VYVEVSUiAgMHgwNDAzQyAgLyogQ2FycmllciBFeHRlbnNpb24gRXJyb3IgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9STEVDICAgICAweDA0MDQwICAvKiBSZWNlaXZlIExlbmd0aCBFcnJvciBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1hPTlJYQyAgIDB4MDQwNDggIC8qIFhPTiBSWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1hPTlRYQyAgIDB4MDQwNEMgIC8qIFhPTiBUWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1hPRkZSWEMgIDB4MDQwNTAgIC8qIFhPRkYgUlggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9YT0ZGVFhDICAweDA0MDU0ICAvKiBYT0ZGIFRYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfRkNSVUMgICAgMHgwNDA1OCAgLyogRmxvdyBDb250cm9sIFJYIFVuc3VwcG9ydGVkIENvdW50LSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9QUkM2NCAgICAweDA0MDVDICAvKiBQYWNrZXRzIFJYICg2NCBieXRlcykgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9QUkMxMjcgICAweDA0MDYwICAvKiBQYWNrZXRzIFJYICg2NS0xMjcgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFJDMjU1ICAgMHgwNDA2NCAgLyogUGFja2V0cyBSWCAoMTI4LTI1NSBieXRlcykgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9QUkM1MTEgICAweDA0MDY4ICAvKiBQYWNrZXRzIFJYICgyNTUtNTExIGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BSQzEwMjMgIDB4MDQwNkMgIC8qIFBhY2tldHMgUlggKDUxMi0xMDIzIGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BSQzE1MjIgIDB4MDQwNzAgIC8qIFBhY2tldHMgUlggKDEwMjQtMTUyMiBieXRlcykgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9HUFJDICAgICAweDA0MDc0ICAvKiBHb29kIFBhY2tldHMgUlggQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9CUFJDICAgICAweDA0MDc4ICAvKiBCcm9hZGNhc3QgUGFja2V0cyBSWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX01QUkMgICAgIDB4MDQwN0MgIC8qIE11bHRpY2FzdCBQYWNrZXRzIFJYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfR1BUQyAgICAgMHgwNDA4MCAgLyogR29vZCBQYWNrZXRzIFRYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfR09SQ0wgICAgMHgwNDA4OCAgLyogR29vZCBPY3RldHMgUlggQ291bnQgTG93IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfR09SQ0ggICAgMHgwNDA4QyAgLyogR29vZCBPY3RldHMgUlggQ291bnQgSGlnaCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0dPVENMICAgIDB4MDQwOTAgIC8qIEdvb2QgT2N0ZXRzIFRYIENvdW50IExvdyAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0dPVENIICAgIDB4MDQwOTQgIC8qIEdvb2QgT2N0ZXRzIFRYIENvdW50IEhpZ2ggLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9STkJDICAgICAweDA0MEEwICAvKiBSWCBObyBCdWZmZXJzIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUlVDICAgICAgMHgwNDBBNCAgLyogUlggVW5kZXJzaXplIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUkZDICAgICAgMHgwNDBBOCAgLyogUlggRnJhZ21lbnQgQ291bnQgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9ST0MgICAgICAweDA0MEFDICAvKiBSWCBPdmVyc2l6ZSBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1JKQyAgICAgIDB4MDQwQjAgIC8qIFJYIEphYmJlciBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX01HVFBSQyAgIDB4MDQwQjQgIC8qIE1hbmFnZW1lbnQgUGFja2V0cyBSWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX01HVFBEQyAgIDB4MDQwQjggIC8qIE1hbmFnZW1lbnQgUGFja2V0cyBEcm9wcGVkIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfTUdUUFRDICAgMHgwNDBCQyAgLyogTWFuYWdlbWVudCBQYWNrZXRzIFRYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfVE9STCAgICAgMHgwNDBDMCAgLyogVG90YWwgT2N0ZXRzIFJYIExvdyAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1RPUkggICAgIDB4MDQwQzQgIC8qIFRvdGFsIE9jdGV0cyBSWCBIaWdoIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfVE9UTCAgICAgMHgwNDBDOCAgLyogVG90YWwgT2N0ZXRzIFRYIExvdyAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1RPVEggICAgIDB4MDQwQ0MgIC8qIFRvdGFsIE9jdGV0cyBUWCBIaWdoIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfVFBSICAgICAgMHgwNDBEMCAgLyogVG90YWwgUGFja2V0cyBSWCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1RQVCAgICAgIDB4MDQwRDQgIC8qIFRvdGFsIFBhY2tldHMgVFggLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9QVEM2NCAgICAweDA0MEQ4ICAvKiBQYWNrZXRzIFRYICg2NCBieXRlcykgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9QVEMxMjcgICAweDA0MERDICAvKiBQYWNrZXRzIFRYICg2NS0xMjcgYnl0ZXMpIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfUFRDMjU1ICAgMHgwNDBFMCAgLyogUGFja2V0cyBUWCAoMTI4LTI1NSBieXRlcykgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9QVEM1MTEgICAweDA0MEU0ICAvKiBQYWNrZXRzIFRYICgyNTYtNTExIGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BUQzEwMjMgIDB4MDQwRTggIC8qIFBhY2tldHMgVFggKDUxMi0xMDIzIGJ5dGVzKSAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX1BUQzE1MjIgIDB4MDQwRUMgIC8qIFBhY2tldHMgVFggKDEwMjQtMTUyMiBCeXRlcykgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9NUFRDICAgICAweDA0MEYwICAvKiBNdWx0aWNhc3QgUGFja2V0cyBUWCBDb3VudCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0JQVEMgICAgIDB4MDQwRjQgIC8qIEJyb2FkY2FzdCBQYWNrZXRzIFRYIENvdW50IC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfVFNDVEMgICAgMHgwNDBGOCAgLyogVENQIFNlZ21lbnRhdGlvbiBDb250ZXh0IFRYIC0gUi9jbHIgKi8KKyNkZWZpbmUgRTEwMDBfVFNDVEZDICAgMHgwNDBGQyAgLyogVENQIFNlZ21lbnRhdGlvbiBDb250ZXh0IFRYIEZhaWwgLSBSL2NsciAqLworI2RlZmluZSBFMTAwMF9SWENTVU0gICAweDA1MDAwICAvKiBSWCBDaGVja3N1bSBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfTVRBICAgICAgMHgwNTIwMCAgLyogTXVsdGljYXN0IFRhYmxlIEFycmF5IC0gUlcgQXJyYXkgKi8KKyNkZWZpbmUgRTEwMDBfUkEgICAgICAgMHgwNTQwMCAgLyogUmVjZWl2ZSBBZGRyZXNzIC0gUlcgQXJyYXkgKi8KKyNkZWZpbmUgRTEwMDBfVkZUQSAgICAgMHgwNTYwMCAgLyogVkxBTiBGaWx0ZXIgVGFibGUgQXJyYXkgLSBSVyBBcnJheSAqLworI2RlZmluZSBFMTAwMF9XVUMgICAgICAweDA1ODAwICAvKiBXYWtldXAgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1dVRkMgICAgIDB4MDU4MDggIC8qIFdha2V1cCBGaWx0ZXIgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIEUxMDAwX1dVUyAgICAgIDB4MDU4MTAgIC8qIFdha2V1cCBTdGF0dXMgLSBSTyAqLworI2RlZmluZSBFMTAwMF9NQU5DICAgICAweDA1ODIwICAvKiBNYW5hZ2VtZW50IENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBFMTAwMF9JUEFWICAgICAweDA1ODM4ICAvKiBJUCBBZGRyZXNzIFZhbGlkIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfSVA0QVQgICAgMHgwNTg0MCAgLyogSVB2NCBBZGRyZXNzIFRhYmxlIC0gUlcgQXJyYXkgKi8KKyNkZWZpbmUgRTEwMDBfSVA2QVQgICAgMHgwNTg4MCAgLyogSVB2NiBBZGRyZXNzIFRhYmxlIC0gUlcgQXJyYXkgKi8KKyNkZWZpbmUgRTEwMDBfV1VQTCAgICAgMHgwNTkwMCAgLyogV2FrZXVwIFBhY2tldCBMZW5ndGggLSBSVyAqLworI2RlZmluZSBFMTAwMF9XVVBNICAgICAweDA1QTAwICAvKiBXYWtldXAgUGFja2V0IE1lbW9yeSAtIFJPIEEgKi8KKyNkZWZpbmUgRTEwMDBfRkZMVCAgICAgMHgwNUYwMCAgLyogRmxleGlibGUgRmlsdGVyIExlbmd0aCBUYWJsZSAtIFJXIEFycmF5ICovCisjZGVmaW5lIEUxMDAwX0hPU1RfSUYgIDB4MDg4MDAgIC8qIEhvc3QgSW50ZXJmYWNlICovCisjZGVmaW5lIEUxMDAwX0ZGTVQgICAgIDB4MDkwMDAgIC8qIEZsZXhpYmxlIEZpbHRlciBNYXNrIFRhYmxlIC0gUlcgQXJyYXkgKi8KKyNkZWZpbmUgRTEwMDBfRkZWVCAgICAgMHgwOTgwMCAgLyogRmxleGlibGUgRmlsdGVyIFZhbHVlIFRhYmxlIC0gUlcgQXJyYXkgKi8KKworLyogUmVnaXN0ZXIgU2V0ICg4MjU0MikKKyAqCisgKiBTb21lIG9mIHRoZSA4MjU0MiByZWdpc3RlcnMgYXJlIGxvY2F0ZWQgYXQgZGlmZmVyZW50IG9mZnNldHMgdGhhbiB0aGV5IGFyZQorICogaW4gbW9yZSBjdXJyZW50IHZlcnNpb25zIG9mIHRoZSA4MjU0eC4gRGVzcGl0ZSB0aGUgZGlmZmVyZW5jZSBpbiBsb2NhdGlvbiwKKyAqIHRoZSByZWdpc3RlcnMgZnVuY3Rpb24gaW4gdGhlIHNhbWUgbWFubmVyLgorICovCisjZGVmaW5lIEUxMDAwXzgyNTQyX0NUUkwgICAgIEUxMDAwX0NUUkwKKyNkZWZpbmUgRTEwMDBfODI1NDJfQ1RSTF9EVVAgRTEwMDBfQ1RSTF9EVVAKKyNkZWZpbmUgRTEwMDBfODI1NDJfU1RBVFVTICAgRTEwMDBfU1RBVFVTCisjZGVmaW5lIEUxMDAwXzgyNTQyX0VFQ0QgICAgIEUxMDAwX0VFQ0QKKyNkZWZpbmUgRTEwMDBfODI1NDJfRUVSRCAgICAgRTEwMDBfRUVSRAorI2RlZmluZSBFMTAwMF84MjU0Ml9DVFJMX0VYVCBFMTAwMF9DVFJMX0VYVAorI2RlZmluZSBFMTAwMF84MjU0Ml9GTEEgICAgICBFMTAwMF9GTEEKKyNkZWZpbmUgRTEwMDBfODI1NDJfTURJQyAgICAgRTEwMDBfTURJQworI2RlZmluZSBFMTAwMF84MjU0Ml9GQ0FMICAgICBFMTAwMF9GQ0FMCisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZDQUggICAgIEUxMDAwX0ZDQUgKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkNUICAgICAgRTEwMDBfRkNUCisjZGVmaW5lIEUxMDAwXzgyNTQyX1ZFVCAgICAgIEUxMDAwX1ZFVAorI2RlZmluZSBFMTAwMF84MjU0Ml9SQSAgICAgICAweDAwMDQwCisjZGVmaW5lIEUxMDAwXzgyNTQyX0lDUiAgICAgIEUxMDAwX0lDUgorI2RlZmluZSBFMTAwMF84MjU0Ml9JVFIgICAgICBFMTAwMF9JVFIKKyNkZWZpbmUgRTEwMDBfODI1NDJfSUNTICAgICAgRTEwMDBfSUNTCisjZGVmaW5lIEUxMDAwXzgyNTQyX0lNUyAgICAgIEUxMDAwX0lNUworI2RlZmluZSBFMTAwMF84MjU0Ml9JTUMgICAgICBFMTAwMF9JTUMKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkNUTCAgICAgRTEwMDBfUkNUTAorI2RlZmluZSBFMTAwMF84MjU0Ml9SRFRSICAgICAweDAwMTA4CisjZGVmaW5lIEUxMDAwXzgyNTQyX1JEQkFMICAgIDB4MDAxMTAKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRCQUggICAgMHgwMDExNAorI2RlZmluZSBFMTAwMF84MjU0Ml9SRExFTiAgICAweDAwMTE4CisjZGVmaW5lIEUxMDAwXzgyNTQyX1JESCAgICAgIDB4MDAxMjAKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkRUICAgICAgMHgwMDEyOAorI2RlZmluZSBFMTAwMF84MjU0Ml9GQ1JUSCAgICAweDAwMTYwCisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZDUlRMICAgIDB4MDAxNjgKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkNUVFYgICAgRTEwMDBfRkNUVFYKKyNkZWZpbmUgRTEwMDBfODI1NDJfVFhDVyAgICAgRTEwMDBfVFhDVworI2RlZmluZSBFMTAwMF84MjU0Ml9SWENXICAgICBFMTAwMF9SWENXCisjZGVmaW5lIEUxMDAwXzgyNTQyX01UQSAgICAgIDB4MDAyMDAKKyNkZWZpbmUgRTEwMDBfODI1NDJfVENUTCAgICAgRTEwMDBfVENUTAorI2RlZmluZSBFMTAwMF84MjU0Ml9USVBHICAgICBFMTAwMF9USVBHCisjZGVmaW5lIEUxMDAwXzgyNTQyX1REQkFMICAgIDB4MDA0MjAKKyNkZWZpbmUgRTEwMDBfODI1NDJfVERCQUggICAgMHgwMDQyNAorI2RlZmluZSBFMTAwMF84MjU0Ml9URExFTiAgICAweDAwNDI4CisjZGVmaW5lIEUxMDAwXzgyNTQyX1RESCAgICAgIDB4MDA0MzAKKyNkZWZpbmUgRTEwMDBfODI1NDJfVERUICAgICAgMHgwMDQzOAorI2RlZmluZSBFMTAwMF84MjU0Ml9USURWICAgICAweDAwNDQwCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RCVCAgICAgIEUxMDAwX1RCVAorI2RlZmluZSBFMTAwMF84MjU0Ml9BSVQgICAgICBFMTAwMF9BSVQKKyNkZWZpbmUgRTEwMDBfODI1NDJfVkZUQSAgICAgMHgwMDYwMAorI2RlZmluZSBFMTAwMF84MjU0Ml9MRURDVEwgICBFMTAwMF9MRURDVEwKKyNkZWZpbmUgRTEwMDBfODI1NDJfUEJBICAgICAgRTEwMDBfUEJBCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JYRENUTCAgIEUxMDAwX1JYRENUTAorI2RlZmluZSBFMTAwMF84MjU0Ml9SQURWICAgICBFMTAwMF9SQURWCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JTUlBEICAgIEUxMDAwX1JTUlBECisjZGVmaW5lIEUxMDAwXzgyNTQyX1RYRE1BQyAgIEUxMDAwX1RYRE1BQworI2RlZmluZSBFMTAwMF84MjU0Ml9UREZIUyAgICBFMTAwMF9UREZIUworI2RlZmluZSBFMTAwMF84MjU0Ml9UREZUUyAgICBFMTAwMF9UREZUUworI2RlZmluZSBFMTAwMF84MjU0Ml9UREZQQyAgICBFMTAwMF9UREZQQworI2RlZmluZSBFMTAwMF84MjU0Ml9UWERDVEwgICBFMTAwMF9UWERDVEwKKyNkZWZpbmUgRTEwMDBfODI1NDJfVEFEViAgICAgRTEwMDBfVEFEVgorI2RlZmluZSBFMTAwMF84MjU0Ml9UU1BNVCAgICBFMTAwMF9UU1BNVAorI2RlZmluZSBFMTAwMF84MjU0Ml9DUkNFUlJTICBFMTAwMF9DUkNFUlJTCisjZGVmaW5lIEUxMDAwXzgyNTQyX0FMR05FUlJDIEUxMDAwX0FMR05FUlJDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1NZTUVSUlMgIEUxMDAwX1NZTUVSUlMKKyNkZWZpbmUgRTEwMDBfODI1NDJfUlhFUlJDICAgRTEwMDBfUlhFUlJDCisjZGVmaW5lIEUxMDAwXzgyNTQyX01QQyAgICAgIEUxMDAwX01QQworI2RlZmluZSBFMTAwMF84MjU0Ml9TQ0MgICAgICBFMTAwMF9TQ0MKKyNkZWZpbmUgRTEwMDBfODI1NDJfRUNPTCAgICAgRTEwMDBfRUNPTAorI2RlZmluZSBFMTAwMF84MjU0Ml9NQ0MgICAgICBFMTAwMF9NQ0MKKyNkZWZpbmUgRTEwMDBfODI1NDJfTEFURUNPTCAgRTEwMDBfTEFURUNPTAorI2RlZmluZSBFMTAwMF84MjU0Ml9DT0xDICAgICBFMTAwMF9DT0xDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0RDICAgICAgIEUxMDAwX0RDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1ROQ1JTICAgIEUxMDAwX1ROQ1JTCisjZGVmaW5lIEUxMDAwXzgyNTQyX1NFQyAgICAgIEUxMDAwX1NFQworI2RlZmluZSBFMTAwMF84MjU0Ml9DRVhURVJSICBFMTAwMF9DRVhURVJSCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JMRUMgICAgIEUxMDAwX1JMRUMKKyNkZWZpbmUgRTEwMDBfODI1NDJfWE9OUlhDICAgRTEwMDBfWE9OUlhDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1hPTlRYQyAgIEUxMDAwX1hPTlRYQworI2RlZmluZSBFMTAwMF84MjU0Ml9YT0ZGUlhDICBFMTAwMF9YT0ZGUlhDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1hPRkZUWEMgIEUxMDAwX1hPRkZUWEMKKyNkZWZpbmUgRTEwMDBfODI1NDJfRkNSVUMgICAgRTEwMDBfRkNSVUMKKyNkZWZpbmUgRTEwMDBfODI1NDJfUFJDNjQgICAgRTEwMDBfUFJDNjQKKyNkZWZpbmUgRTEwMDBfODI1NDJfUFJDMTI3ICAgRTEwMDBfUFJDMTI3CisjZGVmaW5lIEUxMDAwXzgyNTQyX1BSQzI1NSAgIEUxMDAwX1BSQzI1NQorI2RlZmluZSBFMTAwMF84MjU0Ml9QUkM1MTEgICBFMTAwMF9QUkM1MTEKKyNkZWZpbmUgRTEwMDBfODI1NDJfUFJDMTAyMyAgRTEwMDBfUFJDMTAyMworI2RlZmluZSBFMTAwMF84MjU0Ml9QUkMxNTIyICBFMTAwMF9QUkMxNTIyCisjZGVmaW5lIEUxMDAwXzgyNTQyX0dQUkMgICAgIEUxMDAwX0dQUkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfQlBSQyAgICAgRTEwMDBfQlBSQworI2RlZmluZSBFMTAwMF84MjU0Ml9NUFJDICAgICBFMTAwMF9NUFJDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0dQVEMgICAgIEUxMDAwX0dQVEMKKyNkZWZpbmUgRTEwMDBfODI1NDJfR09SQ0wgICAgRTEwMDBfR09SQ0wKKyNkZWZpbmUgRTEwMDBfODI1NDJfR09SQ0ggICAgRTEwMDBfR09SQ0gKKyNkZWZpbmUgRTEwMDBfODI1NDJfR09UQ0wgICAgRTEwMDBfR09UQ0wKKyNkZWZpbmUgRTEwMDBfODI1NDJfR09UQ0ggICAgRTEwMDBfR09UQ0gKKyNkZWZpbmUgRTEwMDBfODI1NDJfUk5CQyAgICAgRTEwMDBfUk5CQworI2RlZmluZSBFMTAwMF84MjU0Ml9SVUMgICAgICBFMTAwMF9SVUMKKyNkZWZpbmUgRTEwMDBfODI1NDJfUkZDICAgICAgRTEwMDBfUkZDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JPQyAgICAgIEUxMDAwX1JPQworI2RlZmluZSBFMTAwMF84MjU0Ml9SSkMgICAgICBFMTAwMF9SSkMKKyNkZWZpbmUgRTEwMDBfODI1NDJfTUdUUFJDICAgRTEwMDBfTUdUUFJDCisjZGVmaW5lIEUxMDAwXzgyNTQyX01HVFBEQyAgIEUxMDAwX01HVFBEQworI2RlZmluZSBFMTAwMF84MjU0Ml9NR1RQVEMgICBFMTAwMF9NR1RQVEMKKyNkZWZpbmUgRTEwMDBfODI1NDJfVE9STCAgICAgRTEwMDBfVE9STAorI2RlZmluZSBFMTAwMF84MjU0Ml9UT1JIICAgICBFMTAwMF9UT1JICisjZGVmaW5lIEUxMDAwXzgyNTQyX1RPVEwgICAgIEUxMDAwX1RPVEwKKyNkZWZpbmUgRTEwMDBfODI1NDJfVE9USCAgICAgRTEwMDBfVE9USAorI2RlZmluZSBFMTAwMF84MjU0Ml9UUFIgICAgICBFMTAwMF9UUFIKKyNkZWZpbmUgRTEwMDBfODI1NDJfVFBUICAgICAgRTEwMDBfVFBUCisjZGVmaW5lIEUxMDAwXzgyNTQyX1BUQzY0ICAgIEUxMDAwX1BUQzY0CisjZGVmaW5lIEUxMDAwXzgyNTQyX1BUQzEyNyAgIEUxMDAwX1BUQzEyNworI2RlZmluZSBFMTAwMF84MjU0Ml9QVEMyNTUgICBFMTAwMF9QVEMyNTUKKyNkZWZpbmUgRTEwMDBfODI1NDJfUFRDNTExICAgRTEwMDBfUFRDNTExCisjZGVmaW5lIEUxMDAwXzgyNTQyX1BUQzEwMjMgIEUxMDAwX1BUQzEwMjMKKyNkZWZpbmUgRTEwMDBfODI1NDJfUFRDMTUyMiAgRTEwMDBfUFRDMTUyMgorI2RlZmluZSBFMTAwMF84MjU0Ml9NUFRDICAgICBFMTAwMF9NUFRDCisjZGVmaW5lIEUxMDAwXzgyNTQyX0JQVEMgICAgIEUxMDAwX0JQVEMKKyNkZWZpbmUgRTEwMDBfODI1NDJfVFNDVEMgICAgRTEwMDBfVFNDVEMKKyNkZWZpbmUgRTEwMDBfODI1NDJfVFNDVEZDICAgRTEwMDBfVFNDVEZDCisjZGVmaW5lIEUxMDAwXzgyNTQyX1JYQ1NVTSAgIEUxMDAwX1JYQ1NVTQorI2RlZmluZSBFMTAwMF84MjU0Ml9XVUMgICAgICBFMTAwMF9XVUMKKyNkZWZpbmUgRTEwMDBfODI1NDJfV1VGQyAgICAgRTEwMDBfV1VGQworI2RlZmluZSBFMTAwMF84MjU0Ml9XVVMgICAgICBFMTAwMF9XVVMKKyNkZWZpbmUgRTEwMDBfODI1NDJfTUFOQyAgICAgRTEwMDBfTUFOQworI2RlZmluZSBFMTAwMF84MjU0Ml9JUEFWICAgICBFMTAwMF9JUEFWCisjZGVmaW5lIEUxMDAwXzgyNTQyX0lQNEFUICAgIEUxMDAwX0lQNEFUCisjZGVmaW5lIEUxMDAwXzgyNTQyX0lQNkFUICAgIEUxMDAwX0lQNkFUCisjZGVmaW5lIEUxMDAwXzgyNTQyX1dVUEwgICAgIEUxMDAwX1dVUEwKKyNkZWZpbmUgRTEwMDBfODI1NDJfV1VQTSAgICAgRTEwMDBfV1VQTQorI2RlZmluZSBFMTAwMF84MjU0Ml9GRkxUICAgICBFMTAwMF9GRkxUCisjZGVmaW5lIEUxMDAwXzgyNTQyX1RERkggICAgIDB4MDgwMTAKKyNkZWZpbmUgRTEwMDBfODI1NDJfVERGVCAgICAgMHgwODAxOAorI2RlZmluZSBFMTAwMF84MjU0Ml9GRk1UICAgICBFMTAwMF9GRk1UCisjZGVmaW5lIEUxMDAwXzgyNTQyX0ZGVlQgICAgIEUxMDAwX0ZGVlQKKyNkZWZpbmUgRTEwMDBfODI1NDJfSE9TVF9JRiAgRTEwMDBfSE9TVF9JRgorCisvKiBTdGF0aXN0aWNzIGNvdW50ZXJzIGNvbGxlY3RlZCBieSB0aGUgTUFDICovCitzdHJ1Y3QgZTEwMDBfaHdfc3RhdHMgeworICAgIHVpbnQ2NF90IGNyY2VycnM7CisgICAgdWludDY0X3QgYWxnbmVycmM7CisgICAgdWludDY0X3Qgc3ltZXJyczsKKyAgICB1aW50NjRfdCByeGVycmM7CisgICAgdWludDY0X3QgbXBjOworICAgIHVpbnQ2NF90IHNjYzsKKyAgICB1aW50NjRfdCBlY29sOworICAgIHVpbnQ2NF90IG1jYzsKKyAgICB1aW50NjRfdCBsYXRlY29sOworICAgIHVpbnQ2NF90IGNvbGM7CisgICAgdWludDY0X3QgZGM7CisgICAgdWludDY0X3QgdG5jcnM7CisgICAgdWludDY0X3Qgc2VjOworICAgIHVpbnQ2NF90IGNleHRlcnI7CisgICAgdWludDY0X3QgcmxlYzsKKyAgICB1aW50NjRfdCB4b25yeGM7CisgICAgdWludDY0X3QgeG9udHhjOworICAgIHVpbnQ2NF90IHhvZmZyeGM7CisgICAgdWludDY0X3QgeG9mZnR4YzsKKyAgICB1aW50NjRfdCBmY3J1YzsKKyAgICB1aW50NjRfdCBwcmM2NDsKKyAgICB1aW50NjRfdCBwcmMxMjc7CisgICAgdWludDY0X3QgcHJjMjU1OworICAgIHVpbnQ2NF90IHByYzUxMTsKKyAgICB1aW50NjRfdCBwcmMxMDIzOworICAgIHVpbnQ2NF90IHByYzE1MjI7CisgICAgdWludDY0X3QgZ3ByYzsKKyAgICB1aW50NjRfdCBicHJjOworICAgIHVpbnQ2NF90IG1wcmM7CisgICAgdWludDY0X3QgZ3B0YzsKKyAgICB1aW50NjRfdCBnb3JjbDsKKyAgICB1aW50NjRfdCBnb3JjaDsKKyAgICB1aW50NjRfdCBnb3RjbDsKKyAgICB1aW50NjRfdCBnb3RjaDsKKyAgICB1aW50NjRfdCBybmJjOworICAgIHVpbnQ2NF90IHJ1YzsKKyAgICB1aW50NjRfdCByZmM7CisgICAgdWludDY0X3Qgcm9jOworICAgIHVpbnQ2NF90IHJqYzsKKyAgICB1aW50NjRfdCBtZ3ByYzsKKyAgICB1aW50NjRfdCBtZ3BkYzsKKyAgICB1aW50NjRfdCBtZ3B0YzsKKyAgICB1aW50NjRfdCB0b3JsOworICAgIHVpbnQ2NF90IHRvcmg7CisgICAgdWludDY0X3QgdG90bDsKKyAgICB1aW50NjRfdCB0b3RoOworICAgIHVpbnQ2NF90IHRwcjsKKyAgICB1aW50NjRfdCB0cHQ7CisgICAgdWludDY0X3QgcHRjNjQ7CisgICAgdWludDY0X3QgcHRjMTI3OworICAgIHVpbnQ2NF90IHB0YzI1NTsKKyAgICB1aW50NjRfdCBwdGM1MTE7CisgICAgdWludDY0X3QgcHRjMTAyMzsKKyAgICB1aW50NjRfdCBwdGMxNTIyOworICAgIHVpbnQ2NF90IG1wdGM7CisgICAgdWludDY0X3QgYnB0YzsKKyAgICB1aW50NjRfdCB0c2N0YzsKKyAgICB1aW50NjRfdCB0c2N0ZmM7Cit9OworCisvKiBTdHJ1Y3R1cmUgY29udGFpbmluZyB2YXJpYWJsZXMgdXNlZCBieSB0aGUgc2hhcmVkIGNvZGUgKGUxMDAwX2h3LmMpICovCitzdHJ1Y3QgZTEwMDBfaHcgeworICAgIHVpbnQ4X3QgX19pb21lbSAqaHdfYWRkcjsKKyAgICBlMTAwMF9tYWNfdHlwZSBtYWNfdHlwZTsKKyAgICBlMTAwMF9waHlfdHlwZSBwaHlfdHlwZTsKKyAgICB1aW50MzJfdCBwaHlfaW5pdF9zY3JpcHQ7CisgICAgZTEwMDBfbWVkaWFfdHlwZSBtZWRpYV90eXBlOworICAgIHZvaWQgKmJhY2s7CisgICAgZTEwMDBfZmNfdHlwZSBmYzsKKyAgICBlMTAwMF9idXNfc3BlZWQgYnVzX3NwZWVkOworICAgIGUxMDAwX2J1c193aWR0aCBidXNfd2lkdGg7CisgICAgZTEwMDBfYnVzX3R5cGUgYnVzX3R5cGU7CisgICAgc3RydWN0IGUxMDAwX2VlcHJvbV9pbmZvIGVlcHJvbTsKKyAgICBlMTAwMF9tc190eXBlIG1hc3Rlcl9zbGF2ZTsKKyAgICBlMTAwMF9tc190eXBlIG9yaWdpbmFsX21hc3Rlcl9zbGF2ZTsKKyAgICBlMTAwMF9mZmVfY29uZmlnIGZmZV9jb25maWdfc3RhdGU7CisgICAgdWludDMyX3QgYXNmX2Zpcm13YXJlX3ByZXNlbnQ7CisgICAgdW5zaWduZWQgbG9uZyBpb19iYXNlOworICAgIHVpbnQzMl90IHBoeV9pZDsKKyAgICB1aW50MzJfdCBwaHlfcmV2aXNpb247CisgICAgdWludDMyX3QgcGh5X2FkZHI7CisgICAgdWludDMyX3Qgb3JpZ2luYWxfZmM7CisgICAgdWludDMyX3QgdHhjdzsKKyAgICB1aW50MzJfdCBhdXRvbmVnX2ZhaWxlZDsKKyAgICB1aW50MzJfdCBtYXhfZnJhbWVfc2l6ZTsKKyAgICB1aW50MzJfdCBtaW5fZnJhbWVfc2l6ZTsKKyAgICB1aW50MzJfdCBtY19maWx0ZXJfdHlwZTsKKyAgICB1aW50MzJfdCBudW1fbWNfYWRkcnM7CisgICAgdWludDMyX3QgY29sbGlzaW9uX2RlbHRhOworICAgIHVpbnQzMl90IHR4X3BhY2tldF9kZWx0YTsKKyAgICB1aW50MzJfdCBsZWRjdGxfZGVmYXVsdDsKKyAgICB1aW50MzJfdCBsZWRjdGxfbW9kZTE7CisgICAgdWludDMyX3QgbGVkY3RsX21vZGUyOworICAgIHVpbnQxNl90IHBoeV9zcGRfZGVmYXVsdDsKKyAgICB1aW50MTZfdCBhdXRvbmVnX2FkdmVydGlzZWQ7CisgICAgdWludDE2X3QgcGNpX2NtZF93b3JkOworICAgIHVpbnQxNl90IGZjX2hpZ2hfd2F0ZXI7CisgICAgdWludDE2X3QgZmNfbG93X3dhdGVyOworICAgIHVpbnQxNl90IGZjX3BhdXNlX3RpbWU7CisgICAgdWludDE2X3QgY3VycmVudF9pZnNfdmFsOworICAgIHVpbnQxNl90IGlmc19taW5fdmFsOworICAgIHVpbnQxNl90IGlmc19tYXhfdmFsOworICAgIHVpbnQxNl90IGlmc19zdGVwX3NpemU7CisgICAgdWludDE2X3QgaWZzX3JhdGlvOworICAgIHVpbnQxNl90IGRldmljZV9pZDsKKyAgICB1aW50MTZfdCB2ZW5kb3JfaWQ7CisgICAgdWludDE2X3Qgc3Vic3lzdGVtX2lkOworICAgIHVpbnQxNl90IHN1YnN5c3RlbV92ZW5kb3JfaWQ7CisgICAgdWludDhfdCByZXZpc2lvbl9pZDsKKyAgICB1aW50OF90IGF1dG9uZWc7CisgICAgdWludDhfdCBtZGl4OworICAgIHVpbnQ4X3QgZm9yY2VkX3NwZWVkX2R1cGxleDsKKyAgICB1aW50OF90IHdhaXRfYXV0b25lZ19jb21wbGV0ZTsKKyAgICB1aW50OF90IGRtYV9mYWlybmVzczsKKyAgICB1aW50OF90IG1hY19hZGRyW05PREVfQUREUkVTU19TSVpFXTsKKyAgICB1aW50OF90IHBlcm1fbWFjX2FkZHJbTk9ERV9BRERSRVNTX1NJWkVdOworICAgIGJvb2xlYW5fdCBkaXNhYmxlX3BvbGFyaXR5X2NvcnJlY3Rpb247CisgICAgYm9vbGVhbl90IHNwZWVkX2Rvd25ncmFkZWQ7CisgICAgZTEwMDBfc21hcnRfc3BlZWQgc21hcnRfc3BlZWQ7CisgICAgZTEwMDBfZHNwX2NvbmZpZyBkc3BfY29uZmlnX3N0YXRlOworICAgIGJvb2xlYW5fdCBnZXRfbGlua19zdGF0dXM7CisgICAgYm9vbGVhbl90IHNlcmRlc19saW5rX2Rvd247CisgICAgYm9vbGVhbl90IHRiaV9jb21wYXRpYmlsaXR5X2VuOworICAgIGJvb2xlYW5fdCB0YmlfY29tcGF0aWJpbGl0eV9vbjsKKyAgICBib29sZWFuX3QgcGh5X3Jlc2V0X2Rpc2FibGU7CisgICAgYm9vbGVhbl90IGZjX3NlbmRfeG9uOworICAgIGJvb2xlYW5fdCBmY19zdHJpY3RfaWVlZTsKKyAgICBib29sZWFuX3QgcmVwb3J0X3R4X2Vhcmx5OworICAgIGJvb2xlYW5fdCBhZGFwdGl2ZV9pZnM7CisgICAgYm9vbGVhbl90IGlmc19wYXJhbXNfZm9yY2VkOworICAgIGJvb2xlYW5fdCBpbl9pZnNfbW9kZTsKK307CisKKworI2RlZmluZSBFMTAwMF9FRVBST01fU1dEUElOMCAgIDB4MDAwMSAgIC8qIFNXRFBJTiAwIEVFUFJPTSBWYWx1ZSAqLworI2RlZmluZSBFMTAwMF9FRVBST01fTEVEX0xPR0lDIDB4MDAyMCAgIC8qIExlZCBMb2dpYyBXb3JkICovCisvKiBSZWdpc3RlciBCaXQgTWFza3MgKi8KKy8qIERldmljZSBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRkQgICAgICAgMHgwMDAwMDAwMSAgLyogRnVsbCBkdXBsZXguMD1oYWxmOyAxPWZ1bGwgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9CRU0gICAgICAweDAwMDAwMDAyICAvKiBFbmRpYW4gTW9kZS4wPWxpdHRsZSwxPWJpZyAqLworI2RlZmluZSBFMTAwMF9DVFJMX1BSSU9SICAgIDB4MDAwMDAwMDQgIC8qIFByaW9yaXR5IG9uIFBDSS4gMD1yeCwxPWZhaXIgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9MUlNUICAgICAweDAwMDAwMDA4ICAvKiBMaW5rIHJlc2V0LiAwPW5vcm1hbCwxPXJlc2V0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfVE1FICAgICAgMHgwMDAwMDAxMCAgLyogVGVzdCBtb2RlLiAwPW5vcm1hbCwxPXRlc3QgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TTEUgICAgICAweDAwMDAwMDIwICAvKiBTZXJpYWwgTGluayBvbiAwPWRpcywxPWVuICovCisjZGVmaW5lIEUxMDAwX0NUUkxfQVNERSAgICAgMHgwMDAwMDAyMCAgLyogQXV0by1zcGVlZCBkZXRlY3QgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU0xVICAgICAgMHgwMDAwMDA0MCAgLyogU2V0IGxpbmsgdXAgKEZvcmNlIExpbmspICovCisjZGVmaW5lIEUxMDAwX0NUUkxfSUxPUyAgICAgMHgwMDAwMDA4MCAgLyogSW52ZXJ0IExvc3MtT2YgU2lnbmFsICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1BEX1NFTCAgMHgwMDAwMDMwMCAgLyogU3BlZWQgU2VsZWN0IE1hc2sgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TUERfMTAgICAweDAwMDAwMDAwICAvKiBGb3JjZSAxME1iICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1BEXzEwMCAgMHgwMDAwMDEwMCAgLyogRm9yY2UgMTAwTWIgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TUERfMTAwMCAweDAwMDAwMjAwICAvKiBGb3JjZSAxR2IgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9CRU0zMiAgICAweDAwMDAwNDAwICAvKiBCaWcgRW5kaWFuIDMyIG1vZGUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9GUkNTUEQgICAweDAwMDAwODAwICAvKiBGb3JjZSBTcGVlZCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0ZSQ0RQWCAgIDB4MDAwMDEwMDAgIC8qIEZvcmNlIER1cGxleCAqLworI2RlZmluZSBFMTAwMF9DVFJMX1NXRFBJTjAgIDB4MDAwNDAwMDAgIC8qIFNXRFBJTiAwIHZhbHVlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1dEUElOMSAgMHgwMDA4MDAwMCAgLyogU1dEUElOIDEgdmFsdWUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9TV0RQSU4yICAweDAwMTAwMDAwICAvKiBTV0RQSU4gMiB2YWx1ZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX1NXRFBJTjMgIDB4MDAyMDAwMDAgIC8qIFNXRFBJTiAzIHZhbHVlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1dEUElPMCAgMHgwMDQwMDAwMCAgLyogU1dEUElOIDAgSW5wdXQgb3Igb3V0cHV0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1dEUElPMSAgMHgwMDgwMDAwMCAgLyogU1dEUElOIDEgaW5wdXQgb3Igb3V0cHV0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1dEUElPMiAgMHgwMTAwMDAwMCAgLyogU1dEUElOIDIgaW5wdXQgb3Igb3V0cHV0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfU1dEUElPMyAgMHgwMjAwMDAwMCAgLyogU1dEUElOIDMgaW5wdXQgb3Igb3V0cHV0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfUlNUICAgICAgMHgwNDAwMDAwMCAgLyogR2xvYmFsIHJlc2V0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfUkZDRSAgICAgMHgwODAwMDAwMCAgLyogUmVjZWl2ZSBGbG93IENvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfVEZDRSAgICAgMHgxMDAwMDAwMCAgLyogVHJhbnNtaXQgZmxvdyBjb250cm9sIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX1JURSAgICAgIDB4MjAwMDAwMDAgIC8qIFJvdXRpbmcgdGFnIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX1ZNRSAgICAgIDB4NDAwMDAwMDAgIC8qIElFRUUgVkxBTiBtb2RlIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9DVFJMX1BIWV9SU1QgIDB4ODAwMDAwMDAgIC8qIFBIWSBSZXNldCAqLworCisvKiBEZXZpY2UgU3RhdHVzICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19GRCAgICAgICAgIDB4MDAwMDAwMDEgICAgICAvKiBGdWxsIGR1cGxleC4wPWhhbGYsMT1mdWxsICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19MVSAgICAgICAgIDB4MDAwMDAwMDIgICAgICAvKiBMaW5rIHVwLjA9bm8sMT1saW5rICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19GVU5DX01BU0sgIDB4MDAwMDAwMEMgICAgICAvKiBQQ0kgRnVuY3Rpb24gTWFzayAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfRlVOQ18wICAgICAweDAwMDAwMDAwICAgICAgLyogRnVuY3Rpb24gMCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfRlVOQ18xICAgICAweDAwMDAwMDA0ICAgICAgLyogRnVuY3Rpb24gMSAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfVFhPRkYgICAgICAweDAwMDAwMDEwICAgICAgLyogdHJhbnNtaXNzaW9uIHBhdXNlZCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfVEJJTU9ERSAgICAweDAwMDAwMDIwICAgICAgLyogVEJJIG1vZGUgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1NQRUVEX01BU0sgMHgwMDAwMDBDMAorI2RlZmluZSBFMTAwMF9TVEFUVVNfU1BFRURfMTAgICAweDAwMDAwMDAwICAgICAgLyogU3BlZWQgMTBNYi9zICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19TUEVFRF8xMDAgIDB4MDAwMDAwNDAgICAgICAvKiBTcGVlZCAxMDBNYi9zICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19TUEVFRF8xMDAwIDB4MDAwMDAwODAgICAgICAvKiBTcGVlZCAxMDAwTWIvcyAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfQVNEViAgICAgICAweDAwMDAwMzAwICAgICAgLyogQXV0byBzcGVlZCBkZXRlY3QgdmFsdWUgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX01UWENLT0sgICAgMHgwMDAwMDQwMCAgICAgIC8qIE1UWCBjbG9jayBydW5uaW5nIE9LICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19QQ0k2NiAgICAgIDB4MDAwMDA4MDAgICAgICAvKiBJbiA2Nk1oeiBzbG90ICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19CVVM2NCAgICAgIDB4MDAwMDEwMDAgICAgICAvKiBJbiA2NCBiaXQgc2xvdCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfUENJWF9NT0RFICAweDAwMDAyMDAwICAgICAgLyogUENJLVggbW9kZSAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfUENJWF9TUEVFRCAweDAwMDBDMDAwICAgICAgLyogUENJLVggYnVzIHNwZWVkICovCisKKy8qIENvbnN0YW50cyB1c2VkIHRvIGludHJlcHJldCB0aGUgbWFza2VkIFBDSS1YIGJ1cyBzcGVlZC4gKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1BDSVhfU1BFRURfNjYgIDB4MDAwMDAwMDAgLyogUENJLVggYnVzIHNwZWVkICA1MC02NiBNSHogKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX1BDSVhfU1BFRURfMTAwIDB4MDAwMDQwMDAgLyogUENJLVggYnVzIHNwZWVkICA2Ni0xMDAgTUh6ICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19QQ0lYX1NQRUVEXzEzMyAweDAwMDA4MDAwIC8qIFBDSS1YIGJ1cyBzcGVlZCAxMDAtMTMzIE1IeiAqLworCisvKiBFRVBST00vRmxhc2ggQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9FRUNEX1NLICAgICAgICAweDAwMDAwMDAxIC8qIEVFUFJPTSBDbG9jayAqLworI2RlZmluZSBFMTAwMF9FRUNEX0NTICAgICAgICAweDAwMDAwMDAyIC8qIEVFUFJPTSBDaGlwIFNlbGVjdCAqLworI2RlZmluZSBFMTAwMF9FRUNEX0RJICAgICAgICAweDAwMDAwMDA0IC8qIEVFUFJPTSBEYXRhIEluICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfRE8gICAgICAgIDB4MDAwMDAwMDggLyogRUVQUk9NIERhdGEgT3V0ICovCisjZGVmaW5lIEUxMDAwX0VFQ0RfRldFX01BU0sgIDB4MDAwMDAwMzAKKyNkZWZpbmUgRTEwMDBfRUVDRF9GV0VfRElTICAgMHgwMDAwMDAxMCAvKiBEaXNhYmxlIEZMQVNIIHdyaXRlcyAqLworI2RlZmluZSBFMTAwMF9FRUNEX0ZXRV9FTiAgICAweDAwMDAwMDIwIC8qIEVuYWJsZSBGTEFTSCB3cml0ZXMgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9GV0VfU0hJRlQgNAorI2RlZmluZSBFMTAwMF9FRUNEX1JFUSAgICAgICAweDAwMDAwMDQwIC8qIEVFUFJPTSBBY2Nlc3MgUmVxdWVzdCAqLworI2RlZmluZSBFMTAwMF9FRUNEX0dOVCAgICAgICAweDAwMDAwMDgwIC8qIEVFUFJPTSBBY2Nlc3MgR3JhbnQgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9QUkVTICAgICAgMHgwMDAwMDEwMCAvKiBFRVBST00gUHJlc2VudCAqLworI2RlZmluZSBFMTAwMF9FRUNEX1NJWkUgICAgICAweDAwMDAwMjAwIC8qIEVFUFJPTSBTaXplICgwPTY0IHdvcmQgMT0yNTYgd29yZCkgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9BRERSX0JJVFMgMHgwMDAwMDQwMCAvKiBFRVBST00gQWRkcmVzc2luZyBiaXRzIGJhc2VkIG9uIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoMC1zbWFsbCwgMS1sYXJnZSkgKi8KKyNkZWZpbmUgRTEwMDBfRUVDRF9UWVBFICAgICAgMHgwMDAwMjAwMCAvKiBFRVBST00gVHlwZSAoMS1TUEksIDAtTWljcm93aXJlKSAqLworI2lmbmRlZiBFMTAwMF9FRVBST01fR1JBTlRfQVRURU1QVFMKKyNkZWZpbmUgRTEwMDBfRUVQUk9NX0dSQU5UX0FUVEVNUFRTIDEwMDAgLyogRUVQUk9NICMgYXR0ZW1wdHMgdG8gZ2FpbiBncmFudCAqLworI2VuZGlmCisKKy8qIEVFUFJPTSBSZWFkICovCisjZGVmaW5lIEUxMDAwX0VFUkRfU1RBUlQgICAgICAweDAwMDAwMDAxIC8qIFN0YXJ0IFJlYWQgKi8KKyNkZWZpbmUgRTEwMDBfRUVSRF9ET05FICAgICAgIDB4MDAwMDAwMTAgLyogUmVhZCBEb25lICovCisjZGVmaW5lIEUxMDAwX0VFUkRfQUREUl9TSElGVCA4CisjZGVmaW5lIEUxMDAwX0VFUkRfQUREUl9NQVNLICAweDAwMDBGRjAwIC8qIFJlYWQgQWRkcmVzcyAqLworI2RlZmluZSBFMTAwMF9FRVJEX0RBVEFfU0hJRlQgMTYKKyNkZWZpbmUgRTEwMDBfRUVSRF9EQVRBX01BU0sgIDB4RkZGRjAwMDAgLyogUmVhZCBEYXRhICovCisKKy8qIFNQSSBFRVBST00gU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIEVFUFJPTV9TVEFUVVNfUkRZX1NQSSAgMHgwMQorI2RlZmluZSBFRVBST01fU1RBVFVTX1dFTl9TUEkgIDB4MDIKKyNkZWZpbmUgRUVQUk9NX1NUQVRVU19CUDBfU1BJICAweDA0CisjZGVmaW5lIEVFUFJPTV9TVEFUVVNfQlAxX1NQSSAgMHgwOAorI2RlZmluZSBFRVBST01fU1RBVFVTX1dQRU5fU1BJIDB4ODAKKworLyogRXh0ZW5kZWQgRGV2aWNlIENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfR1BJMF9FTiAgIDB4MDAwMDAwMDEgLyogTWFwcyBTRFA0IHRvIEdQSTAgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfR1BJMV9FTiAgIDB4MDAwMDAwMDIgLyogTWFwcyBTRFA1IHRvIEdQSTEgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfUEhZSU5UX0VOIEUxMDAwX0NUUkxfRVhUX0dQSTFfRU4KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfR1BJMl9FTiAgIDB4MDAwMDAwMDQgLyogTWFwcyBTRFA2IHRvIEdQSTIgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfR1BJM19FTiAgIDB4MDAwMDAwMDggLyogTWFwcyBTRFA3IHRvIEdQSTMgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfU0RQNF9EQVRBIDB4MDAwMDAwMTAgLyogVmFsdWUgb2YgU1cgRGVmaW5lYWJsZSBQaW4gNCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TRFA1X0RBVEEgMHgwMDAwMDAyMCAvKiBWYWx1ZSBvZiBTVyBEZWZpbmVhYmxlIFBpbiA1ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1BIWV9JTlQgICBFMTAwMF9DVFJMX0VYVF9TRFA1X0RBVEEKKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfU0RQNl9EQVRBIDB4MDAwMDAwNDAgLyogVmFsdWUgb2YgU1cgRGVmaW5lYWJsZSBQaW4gNiAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TRFA3X0RBVEEgMHgwMDAwMDA4MCAvKiBWYWx1ZSBvZiBTVyBEZWZpbmVhYmxlIFBpbiA3ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NEUDRfRElSICAweDAwMDAwMTAwIC8qIERpcmVjdGlvbiBvZiBTRFA0IDA9aW4gMT1vdXQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfU0RQNV9ESVIgIDB4MDAwMDAyMDAgLyogRGlyZWN0aW9uIG9mIFNEUDUgMD1pbiAxPW91dCAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9TRFA2X0RJUiAgMHgwMDAwMDQwMCAvKiBEaXJlY3Rpb24gb2YgU0RQNiAwPWluIDE9b3V0ICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1NEUDdfRElSICAweDAwMDAwODAwIC8qIERpcmVjdGlvbiBvZiBTRFA3IDA9aW4gMT1vdXQgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfQVNEQ0hLICAgIDB4MDAwMDEwMDAgLyogSW5pdGlhdGUgYW4gQVNEIHNlcXVlbmNlICovCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0VFX1JTVCAgICAweDAwMDAyMDAwIC8qIFJlaW5pdGlhbGl6ZSBmcm9tIEVFUFJPTSAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9JUFMgICAgICAgMHgwMDAwNDAwMCAvKiBJbnZlcnQgUG93ZXIgU3RhdGUgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfU1BEX0JZUFMgIDB4MDAwMDgwMDAgLyogU3BlZWQgU2VsZWN0IEJ5cGFzcyAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9MSU5LX01PREVfTUFTSyAweDAwQzAwMDAwCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX0xJTktfTU9ERV9HTUlJIDB4MDAwMDAwMDAKKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfTElOS19NT0RFX1RCSSAgMHgwMEMwMDAwMAorI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9XUl9XTUFSS19NQVNLICAweDAzMDAwMDAwCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1dSX1dNQVJLXzI1NiAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRTEwMDBfQ1RSTF9FWFRfV1JfV01BUktfMzIwICAgMHgwMTAwMDAwMAorI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9XUl9XTUFSS18zODQgICAweDAyMDAwMDAwCisjZGVmaW5lIEUxMDAwX0NUUkxfRVhUX1dSX1dNQVJLXzQ0OCAgIDB4MDMwMDAwMDAKKworLyogTURJIENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfTURJQ19EQVRBX01BU0sgMHgwMDAwRkZGRgorI2RlZmluZSBFMTAwMF9NRElDX1JFR19NQVNLICAweDAwMUYwMDAwCisjZGVmaW5lIEUxMDAwX01ESUNfUkVHX1NISUZUIDE2CisjZGVmaW5lIEUxMDAwX01ESUNfUEhZX01BU0sgIDB4MDNFMDAwMDAKKyNkZWZpbmUgRTEwMDBfTURJQ19QSFlfU0hJRlQgMjEKKyNkZWZpbmUgRTEwMDBfTURJQ19PUF9XUklURSAgMHgwNDAwMDAwMAorI2RlZmluZSBFMTAwMF9NRElDX09QX1JFQUQgICAweDA4MDAwMDAwCisjZGVmaW5lIEUxMDAwX01ESUNfUkVBRFkgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgRTEwMDBfTURJQ19JTlRfRU4gICAgMHgyMDAwMDAwMAorI2RlZmluZSBFMTAwMF9NRElDX0VSUk9SICAgICAweDQwMDAwMDAwCisKKy8qIExFRCBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQwX01PREVfTUFTSyAgICAgICAweDAwMDAwMDBGCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQwX01PREVfU0hJRlQgICAgICAwCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQwX0lWUlQgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQwX0JMSU5LICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQxX01PREVfTUFTSyAgICAgICAweDAwMDAwRjAwCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQxX01PREVfU0hJRlQgICAgICA4CisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQxX0lWUlQgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQxX0JMSU5LICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQyX01PREVfTUFTSyAgICAgICAweDAwMEYwMDAwCisjZGVmaW5lIEUxMDAwX0xFRENUTF9MRUQyX01PREVfU0hJRlQgICAgICAxNgorI2RlZmluZSBFMTAwMF9MRURDVExfTEVEMl9JVlJUICAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBFMTAwMF9MRURDVExfTEVEMl9CTElOSyAgICAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBFMTAwMF9MRURDVExfTEVEM19NT0RFX01BU0sgICAgICAgMHgwRjAwMDAwMAorI2RlZmluZSBFMTAwMF9MRURDVExfTEVEM19NT0RFX1NISUZUICAgICAgMjQKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDNfSVZSVCAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgRTEwMDBfTEVEQ1RMX0xFRDNfQkxJTksgICAgICAgICAgIDB4ODAwMDAwMDAKKworI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9MSU5LXzEwXzEwMDAgIDB4MAorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9MSU5LXzEwMF8xMDAwIDB4MQorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9MSU5LX1VQICAgICAgIDB4MgorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9BQ1RJVklUWSAgICAgIDB4MworI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9MSU5LX0FDVElWSVRZIDB4NAorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9MSU5LXzEwICAgICAgIDB4NQorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9MSU5LXzEwMCAgICAgIDB4NgorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9MSU5LXzEwMDAgICAgIDB4NworI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9QQ0lYX01PREUgICAgIDB4OAorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9GVUxMX0RVUExFWCAgIDB4OQorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9DT0xMSVNJT04gICAgIDB4QQorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9CVVNfU1BFRUQgICAgIDB4QgorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9CVVNfU0laRSAgICAgIDB4QworI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9QQVVTRUQgICAgICAgIDB4RAorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9MRURfT04gICAgICAgIDB4RQorI2RlZmluZSBFMTAwMF9MRURDVExfTU9ERV9MRURfT0ZGICAgICAgIDB4RgorCisvKiBSZWNlaXZlIEFkZHJlc3MgKi8KKyNkZWZpbmUgRTEwMDBfUkFIX0FWICAweDgwMDAwMDAwICAgICAgICAvKiBSZWNlaXZlIGRlc2NyaXB0b3IgdmFsaWQgKi8KKworLyogSW50ZXJydXB0IENhdXNlIFJlYWQgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX1RYRFcgICAgICAgICAgMHgwMDAwMDAwMSAvKiBUcmFuc21pdCBkZXNjIHdyaXR0ZW4gYmFjayAqLworI2RlZmluZSBFMTAwMF9JQ1JfVFhRRSAgICAgICAgICAweDAwMDAwMDAyIC8qIFRyYW5zbWl0IFF1ZXVlIGVtcHR5ICovCisjZGVmaW5lIEUxMDAwX0lDUl9MU0MgICAgICAgICAgIDB4MDAwMDAwMDQgLyogTGluayBTdGF0dXMgQ2hhbmdlICovCisjZGVmaW5lIEUxMDAwX0lDUl9SWFNFUSAgICAgICAgIDB4MDAwMDAwMDggLyogcnggc2VxdWVuY2UgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX1JYRE1UMCAgICAgICAgMHgwMDAwMDAxMCAvKiByeCBkZXNjIG1pbi4gdGhyZXNob2xkICgwKSAqLworI2RlZmluZSBFMTAwMF9JQ1JfUlhPICAgICAgICAgICAweDAwMDAwMDQwIC8qIHJ4IG92ZXJydW4gKi8KKyNkZWZpbmUgRTEwMDBfSUNSX1JYVDAgICAgICAgICAgMHgwMDAwMDA4MCAvKiByeCB0aW1lciBpbnRyIChyaW5nIDApICovCisjZGVmaW5lIEUxMDAwX0lDUl9NREFDICAgICAgICAgIDB4MDAwMDAyMDAgLyogTURJTyBhY2Nlc3MgY29tcGxldGUgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX1JYQ0ZHICAgICAgICAgMHgwMDAwMDQwMCAvKiBSWCAvYy8gb3JkZXJlZCBzZXQgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX0dQSV9FTjAgICAgICAgMHgwMDAwMDgwMCAvKiBHUCBJbnQgMCAqLworI2RlZmluZSBFMTAwMF9JQ1JfR1BJX0VOMSAgICAgICAweDAwMDAxMDAwIC8qIEdQIEludCAxICovCisjZGVmaW5lIEUxMDAwX0lDUl9HUElfRU4yICAgICAgIDB4MDAwMDIwMDAgLyogR1AgSW50IDIgKi8KKyNkZWZpbmUgRTEwMDBfSUNSX0dQSV9FTjMgICAgICAgMHgwMDAwNDAwMCAvKiBHUCBJbnQgMyAqLworI2RlZmluZSBFMTAwMF9JQ1JfVFhEX0xPVyAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIEUxMDAwX0lDUl9TUlBEICAgICAgICAgIDB4MDAwMTAwMDAKKworLyogSW50ZXJydXB0IENhdXNlIFNldCAqLworI2RlZmluZSBFMTAwMF9JQ1NfVFhEVyAgICAgIEUxMDAwX0lDUl9UWERXICAgICAgLyogVHJhbnNtaXQgZGVzYyB3cml0dGVuIGJhY2sgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX1RYUUUgICAgICBFMTAwMF9JQ1JfVFhRRSAgICAgIC8qIFRyYW5zbWl0IFF1ZXVlIGVtcHR5ICovCisjZGVmaW5lIEUxMDAwX0lDU19MU0MgICAgICAgRTEwMDBfSUNSX0xTQyAgICAgICAvKiBMaW5rIFN0YXR1cyBDaGFuZ2UgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX1JYU0VRICAgICBFMTAwMF9JQ1JfUlhTRVEgICAgIC8qIHJ4IHNlcXVlbmNlIGVycm9yICovCisjZGVmaW5lIEUxMDAwX0lDU19SWERNVDAgICAgRTEwMDBfSUNSX1JYRE1UMCAgICAvKiByeCBkZXNjIG1pbi4gdGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX0lDU19SWE8gICAgICAgRTEwMDBfSUNSX1JYTyAgICAgICAvKiByeCBvdmVycnVuICovCisjZGVmaW5lIEUxMDAwX0lDU19SWFQwICAgICAgRTEwMDBfSUNSX1JYVDAgICAgICAvKiByeCB0aW1lciBpbnRyICovCisjZGVmaW5lIEUxMDAwX0lDU19NREFDICAgICAgRTEwMDBfSUNSX01EQUMgICAgICAvKiBNRElPIGFjY2VzcyBjb21wbGV0ZSAqLworI2RlZmluZSBFMTAwMF9JQ1NfUlhDRkcgICAgIEUxMDAwX0lDUl9SWENGRyAgICAgLyogUlggL2MvIG9yZGVyZWQgc2V0ICovCisjZGVmaW5lIEUxMDAwX0lDU19HUElfRU4wICAgRTEwMDBfSUNSX0dQSV9FTjAgICAvKiBHUCBJbnQgMCAqLworI2RlZmluZSBFMTAwMF9JQ1NfR1BJX0VOMSAgIEUxMDAwX0lDUl9HUElfRU4xICAgLyogR1AgSW50IDEgKi8KKyNkZWZpbmUgRTEwMDBfSUNTX0dQSV9FTjIgICBFMTAwMF9JQ1JfR1BJX0VOMiAgIC8qIEdQIEludCAyICovCisjZGVmaW5lIEUxMDAwX0lDU19HUElfRU4zICAgRTEwMDBfSUNSX0dQSV9FTjMgICAvKiBHUCBJbnQgMyAqLworI2RlZmluZSBFMTAwMF9JQ1NfVFhEX0xPVyAgIEUxMDAwX0lDUl9UWERfTE9XCisjZGVmaW5lIEUxMDAwX0lDU19TUlBEICAgICAgRTEwMDBfSUNSX1NSUEQKKworLyogSW50ZXJydXB0IE1hc2sgU2V0ICovCisjZGVmaW5lIEUxMDAwX0lNU19UWERXICAgICAgRTEwMDBfSUNSX1RYRFcgICAgICAvKiBUcmFuc21pdCBkZXNjIHdyaXR0ZW4gYmFjayAqLworI2RlZmluZSBFMTAwMF9JTVNfVFhRRSAgICAgIEUxMDAwX0lDUl9UWFFFICAgICAgLyogVHJhbnNtaXQgUXVldWUgZW1wdHkgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX0xTQyAgICAgICBFMTAwMF9JQ1JfTFNDICAgICAgIC8qIExpbmsgU3RhdHVzIENoYW5nZSAqLworI2RlZmluZSBFMTAwMF9JTVNfUlhTRVEgICAgIEUxMDAwX0lDUl9SWFNFUSAgICAgLyogcnggc2VxdWVuY2UgZXJyb3IgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX1JYRE1UMCAgICBFMTAwMF9JQ1JfUlhETVQwICAgIC8qIHJ4IGRlc2MgbWluLiB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX1JYTyAgICAgICBFMTAwMF9JQ1JfUlhPICAgICAgIC8qIHJ4IG92ZXJydW4gKi8KKyNkZWZpbmUgRTEwMDBfSU1TX1JYVDAgICAgICBFMTAwMF9JQ1JfUlhUMCAgICAgIC8qIHJ4IHRpbWVyIGludHIgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX01EQUMgICAgICBFMTAwMF9JQ1JfTURBQyAgICAgIC8qIE1ESU8gYWNjZXNzIGNvbXBsZXRlICovCisjZGVmaW5lIEUxMDAwX0lNU19SWENGRyAgICAgRTEwMDBfSUNSX1JYQ0ZHICAgICAvKiBSWCAvYy8gb3JkZXJlZCBzZXQgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX0dQSV9FTjAgICBFMTAwMF9JQ1JfR1BJX0VOMCAgIC8qIEdQIEludCAwICovCisjZGVmaW5lIEUxMDAwX0lNU19HUElfRU4xICAgRTEwMDBfSUNSX0dQSV9FTjEgICAvKiBHUCBJbnQgMSAqLworI2RlZmluZSBFMTAwMF9JTVNfR1BJX0VOMiAgIEUxMDAwX0lDUl9HUElfRU4yICAgLyogR1AgSW50IDIgKi8KKyNkZWZpbmUgRTEwMDBfSU1TX0dQSV9FTjMgICBFMTAwMF9JQ1JfR1BJX0VOMyAgIC8qIEdQIEludCAzICovCisjZGVmaW5lIEUxMDAwX0lNU19UWERfTE9XICAgRTEwMDBfSUNSX1RYRF9MT1cKKyNkZWZpbmUgRTEwMDBfSU1TX1NSUEQgICAgICBFMTAwMF9JQ1JfU1JQRAorCisvKiBJbnRlcnJ1cHQgTWFzayBDbGVhciAqLworI2RlZmluZSBFMTAwMF9JTUNfVFhEVyAgICAgIEUxMDAwX0lDUl9UWERXICAgICAgLyogVHJhbnNtaXQgZGVzYyB3cml0dGVuIGJhY2sgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX1RYUUUgICAgICBFMTAwMF9JQ1JfVFhRRSAgICAgIC8qIFRyYW5zbWl0IFF1ZXVlIGVtcHR5ICovCisjZGVmaW5lIEUxMDAwX0lNQ19MU0MgICAgICAgRTEwMDBfSUNSX0xTQyAgICAgICAvKiBMaW5rIFN0YXR1cyBDaGFuZ2UgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX1JYU0VRICAgICBFMTAwMF9JQ1JfUlhTRVEgICAgIC8qIHJ4IHNlcXVlbmNlIGVycm9yICovCisjZGVmaW5lIEUxMDAwX0lNQ19SWERNVDAgICAgRTEwMDBfSUNSX1JYRE1UMCAgICAvKiByeCBkZXNjIG1pbi4gdGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX0lNQ19SWE8gICAgICAgRTEwMDBfSUNSX1JYTyAgICAgICAvKiByeCBvdmVycnVuICovCisjZGVmaW5lIEUxMDAwX0lNQ19SWFQwICAgICAgRTEwMDBfSUNSX1JYVDAgICAgICAvKiByeCB0aW1lciBpbnRyICovCisjZGVmaW5lIEUxMDAwX0lNQ19NREFDICAgICAgRTEwMDBfSUNSX01EQUMgICAgICAvKiBNRElPIGFjY2VzcyBjb21wbGV0ZSAqLworI2RlZmluZSBFMTAwMF9JTUNfUlhDRkcgICAgIEUxMDAwX0lDUl9SWENGRyAgICAgLyogUlggL2MvIG9yZGVyZWQgc2V0ICovCisjZGVmaW5lIEUxMDAwX0lNQ19HUElfRU4wICAgRTEwMDBfSUNSX0dQSV9FTjAgICAvKiBHUCBJbnQgMCAqLworI2RlZmluZSBFMTAwMF9JTUNfR1BJX0VOMSAgIEUxMDAwX0lDUl9HUElfRU4xICAgLyogR1AgSW50IDEgKi8KKyNkZWZpbmUgRTEwMDBfSU1DX0dQSV9FTjIgICBFMTAwMF9JQ1JfR1BJX0VOMiAgIC8qIEdQIEludCAyICovCisjZGVmaW5lIEUxMDAwX0lNQ19HUElfRU4zICAgRTEwMDBfSUNSX0dQSV9FTjMgICAvKiBHUCBJbnQgMyAqLworI2RlZmluZSBFMTAwMF9JTUNfVFhEX0xPVyAgIEUxMDAwX0lDUl9UWERfTE9XCisjZGVmaW5lIEUxMDAwX0lNQ19TUlBEICAgICAgRTEwMDBfSUNSX1NSUEQKKworLyogUmVjZWl2ZSBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX1JDVExfUlNUICAgICAgICAgICAgMHgwMDAwMDAwMSAgICAvKiBTb2Z0d2FyZSByZXNldCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX0VOICAgICAgICAgICAgIDB4MDAwMDAwMDIgICAgLyogZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1JDVExfU0JQICAgICAgICAgICAgMHgwMDAwMDAwNCAgICAvKiBzdG9yZSBiYWQgcGFja2V0ICovCisjZGVmaW5lIEUxMDAwX1JDVExfVVBFICAgICAgICAgICAgMHgwMDAwMDAwOCAgICAvKiB1bmljYXN0IHByb21pc2N1b3VzIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX01QRSAgICAgICAgICAgIDB4MDAwMDAwMTAgICAgLyogbXVsdGljYXN0IHByb21pc2N1b3VzIGVuYWIgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9MUEUgICAgICAgICAgICAweDAwMDAwMDIwICAgIC8qIGxvbmcgcGFja2V0IGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX0xCTV9OTyAgICAgICAgIDB4MDAwMDAwMDAgICAgLyogbm8gbG9vcGJhY2sgbW9kZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX0xCTV9NQUMgICAgICAgIDB4MDAwMDAwNDAgICAgLyogTUFDIGxvb3BiYWNrIG1vZGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9MQk1fU0xQICAgICAgICAweDAwMDAwMDgwICAgIC8qIHNlcmlhbCBsaW5rIGxvb3BiYWNrIG1vZGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9MQk1fVENWUiAgICAgICAweDAwMDAwMEMwICAgIC8qIHRjdnIgbG9vcGJhY2sgbW9kZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1JETVRTX0hBTEYgICAgIDB4MDAwMDAwMDAgICAgLyogcnggZGVzYyBtaW4gdGhyZXNob2xkIHNpemUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9SRE1UU19RVUFUICAgICAweDAwMDAwMTAwICAgIC8qIHJ4IGRlc2MgbWluIHRocmVzaG9sZCBzaXplICovCisjZGVmaW5lIEUxMDAwX1JDVExfUkRNVFNfRUlHVEggICAgMHgwMDAwMDIwMCAgICAvKiByeCBkZXNjIG1pbiB0aHJlc2hvbGQgc2l6ZSAqLworI2RlZmluZSBFMTAwMF9SQ1RMX01PX1NISUZUICAgICAgIDEyICAgICAgICAgICAgLyogbXVsdGljYXN0IG9mZnNldCBzaGlmdCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX01PXzAgICAgICAgICAgIDB4MDAwMDAwMDAgICAgLyogbXVsdGljYXN0IG9mZnNldCAxMTowICovCisjZGVmaW5lIEUxMDAwX1JDVExfTU9fMSAgICAgICAgICAgMHgwMDAwMTAwMCAgICAvKiBtdWx0aWNhc3Qgb2Zmc2V0IDEyOjEgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9NT18yICAgICAgICAgICAweDAwMDAyMDAwICAgIC8qIG11bHRpY2FzdCBvZmZzZXQgMTM6MiAqLworI2RlZmluZSBFMTAwMF9SQ1RMX01PXzMgICAgICAgICAgIDB4MDAwMDMwMDAgICAgLyogbXVsdGljYXN0IG9mZnNldCAxNTo0ICovCisjZGVmaW5lIEUxMDAwX1JDVExfTURSICAgICAgICAgICAgMHgwMDAwNDAwMCAgICAvKiBtdWx0aWNhc3QgZGVzYyByaW5nIDAgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9CQU0gICAgICAgICAgICAweDAwMDA4MDAwICAgIC8qIGJyb2FkY2FzdCBlbmFibGUgKi8KKy8qIHRoZXNlIGJ1ZmZlciBzaXplcyBhcmUgdmFsaWQgaWYgRTEwMDBfUkNUTF9CU0VYIGlzIDAgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9TWl8yMDQ4ICAgICAgICAweDAwMDAwMDAwICAgIC8qIHJ4IGJ1ZmZlciBzaXplIDIwNDggKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9TWl8xMDI0ICAgICAgICAweDAwMDEwMDAwICAgIC8qIHJ4IGJ1ZmZlciBzaXplIDEwMjQgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9TWl81MTIgICAgICAgICAweDAwMDIwMDAwICAgIC8qIHJ4IGJ1ZmZlciBzaXplIDUxMiAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NaXzI1NiAgICAgICAgIDB4MDAwMzAwMDAgICAgLyogcnggYnVmZmVyIHNpemUgMjU2ICovCisvKiB0aGVzZSBidWZmZXIgc2l6ZXMgYXJlIHZhbGlkIGlmIEUxMDAwX1JDVExfQlNFWCBpcyAxICovCisjZGVmaW5lIEUxMDAwX1JDVExfU1pfMTYzODQgICAgICAgMHgwMDAxMDAwMCAgICAvKiByeCBidWZmZXIgc2l6ZSAxNjM4NCAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NaXzgxOTIgICAgICAgIDB4MDAwMjAwMDAgICAgLyogcnggYnVmZmVyIHNpemUgODE5MiAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1NaXzQwOTYgICAgICAgIDB4MDAwMzAwMDAgICAgLyogcnggYnVmZmVyIHNpemUgNDA5NiAqLworI2RlZmluZSBFMTAwMF9SQ1RMX1ZGRSAgICAgICAgICAgIDB4MDAwNDAwMDAgICAgLyogdmxhbiBmaWx0ZXIgZW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1JDVExfQ0ZJRU4gICAgICAgICAgMHgwMDA4MDAwMCAgICAvKiBjYW5vbmljYWwgZm9ybSBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9DRkkgICAgICAgICAgICAweDAwMTAwMDAwICAgIC8qIGNhbm9uaWNhbCBmb3JtIGluZGljYXRvciAqLworI2RlZmluZSBFMTAwMF9SQ1RMX0RQRiAgICAgICAgICAgIDB4MDA0MDAwMDAgICAgLyogZGlzY2FyZCBwYXVzZSBmcmFtZXMgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9QTUNGICAgICAgICAgICAweDAwODAwMDAwICAgIC8qIHBhc3MgTUFDIGNvbnRyb2wgZnJhbWVzICovCisjZGVmaW5lIEUxMDAwX1JDVExfQlNFWCAgICAgICAgICAgMHgwMjAwMDAwMCAgICAvKiBCdWZmZXIgc2l6ZSBleHRlbnNpb24gKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9TRUNSQyAgICAgICAgICAweDA0MDAwMDAwICAgIC8qIFN0cmlwIEV0aGVybmV0IENSQyAqLworCisvKiBSZWNlaXZlIERlc2NyaXB0b3IgKi8KKyNkZWZpbmUgRTEwMDBfUkRUX0RFTEFZIDB4MDAwMGZmZmYgICAgICAvKiBEZWxheSB0aW1lciAoMT0xMDI0dXMpICovCisjZGVmaW5lIEUxMDAwX1JEVF9GUERCICAweDgwMDAwMDAwICAgICAgLyogRmx1c2ggZGVzY3JpcHRvciBibG9jayAqLworI2RlZmluZSBFMTAwMF9SRExFTl9MRU4gMHgwMDA3ZmY4MCAgICAgIC8qIGRlc2NyaXB0b3IgbGVuZ3RoICovCisjZGVmaW5lIEUxMDAwX1JESF9SREggICAweDAwMDBmZmZmICAgICAgLyogcmVjZWl2ZSBkZXNjcmlwdG9yIGhlYWQgKi8KKyNkZWZpbmUgRTEwMDBfUkRUX1JEVCAgIDB4MDAwMGZmZmYgICAgICAvKiByZWNlaXZlIGRlc2NyaXB0b3IgdGFpbCAqLworCisvKiBGbG93IENvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfRkNSVEhfUlRIICAweDAwMDBGRkY4ICAgICAvKiBNYXNrIEJpdHNbMTU6M10gZm9yIFJUSCAqLworI2RlZmluZSBFMTAwMF9GQ1JUSF9YRkNFIDB4ODAwMDAwMDAgICAgIC8qIEV4dGVybmFsIEZsb3cgQ29udHJvbCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfRkNSVExfUlRMICAweDAwMDBGRkY4ICAgICAvKiBNYXNrIEJpdHNbMTU6M10gZm9yIFJUTCAqLworI2RlZmluZSBFMTAwMF9GQ1JUTF9YT05FIDB4ODAwMDAwMDAgICAgIC8qIEVuYWJsZSBYT04gZnJhbWUgdHJhbnNtaXNzaW9uICovCisKKy8qIFJlY2VpdmUgRGVzY3JpcHRvciBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX1JYRENUTF9QVEhSRVNIIDB4MDAwMDAwM0YgLyogUlhEQ1RMIFByZWZldGNoIFRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9SWERDVExfSFRIUkVTSCAweDAwMDAzRjAwIC8qIFJYRENUTCBIb3N0IFRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9SWERDVExfV1RIUkVTSCAweDAwM0YwMDAwIC8qIFJYRENUTCBXcml0ZWJhY2sgVGhyZXNob2xkICovCisjZGVmaW5lIEUxMDAwX1JYRENUTF9HUkFOICAgIDB4MDEwMDAwMDAgLyogUlhEQ1RMIEdyYW51bGFyaXR5ICovCisKKy8qIFRyYW5zbWl0IERlc2NyaXB0b3IgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9UWERDVExfUFRIUkVTSCAweDAwMDAwMEZGIC8qIFRYRENUTCBQcmVmZXRjaCBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgRTEwMDBfVFhEQ1RMX0hUSFJFU0ggMHgwMDAwRkYwMCAvKiBUWERDVEwgSG9zdCBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgRTEwMDBfVFhEQ1RMX1dUSFJFU0ggMHgwMEZGMDAwMCAvKiBUWERDVEwgV3JpdGViYWNrIFRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9UWERDVExfR1JBTiAgICAweDAxMDAwMDAwIC8qIFRYRENUTCBHcmFudWxhcml0eSAqLworI2RlZmluZSBFMTAwMF9UWERDVExfTFdUSFJFU0ggMHhGRTAwMDAwMCAvKiBUWERDVEwgTG93IFRocmVzaG9sZCAqLworI2RlZmluZSBFMTAwMF9UWERDVExfRlVMTF9UWF9ERVNDX1dCIDB4MDEwMTAwMDAgLyogR1JBTj0xLCBXVEhSRVNIPTEgKi8KKworLyogVHJhbnNtaXQgQ29uZmlndXJhdGlvbiBXb3JkICovCisjZGVmaW5lIEUxMDAwX1RYQ1dfRkQgICAgICAgICAweDAwMDAwMDIwICAgICAgICAvKiBUWENXIGZ1bGwgZHVwbGV4ICovCisjZGVmaW5lIEUxMDAwX1RYQ1dfSEQgICAgICAgICAweDAwMDAwMDQwICAgICAgICAvKiBUWENXIGhhbGYgZHVwbGV4ICovCisjZGVmaW5lIEUxMDAwX1RYQ1dfUEFVU0UgICAgICAweDAwMDAwMDgwICAgICAgICAvKiBUWENXIHN5bSBwYXVzZSByZXF1ZXN0ICovCisjZGVmaW5lIEUxMDAwX1RYQ1dfQVNNX0RJUiAgICAweDAwMDAwMTAwICAgICAgICAvKiBUWENXIGFzdG0gcGF1c2UgZGlyZWN0aW9uICovCisjZGVmaW5lIEUxMDAwX1RYQ1dfUEFVU0VfTUFTSyAweDAwMDAwMTgwICAgICAgICAvKiBUWENXIHBhdXNlIHJlcXVlc3QgbWFzayAqLworI2RlZmluZSBFMTAwMF9UWENXX1JGICAgICAgICAgMHgwMDAwMzAwMCAgICAgICAgLyogVFhDVyByZW1vdGUgZmF1bHQgKi8KKyNkZWZpbmUgRTEwMDBfVFhDV19OUCAgICAgICAgIDB4MDAwMDgwMDAgICAgICAgIC8qIFRYQ1cgbmV4dCBwYWdlICovCisjZGVmaW5lIEUxMDAwX1RYQ1dfQ1cgICAgICAgICAweDAwMDBmZmZmICAgICAgICAvKiBUeENvbmZpZ1dvcmQgbWFzayAqLworI2RlZmluZSBFMTAwMF9UWENXX1RYQyAgICAgICAgMHg0MDAwMDAwMCAgICAgICAgLyogVHJhbnNtaXQgQ29uZmlnIGNvbnRyb2wgKi8KKyNkZWZpbmUgRTEwMDBfVFhDV19BTkUgICAgICAgIDB4ODAwMDAwMDAgICAgICAgIC8qIEF1dG8tbmVnIGVuYWJsZSAqLworCisvKiBSZWNlaXZlIENvbmZpZ3VyYXRpb24gV29yZCAqLworI2RlZmluZSBFMTAwMF9SWENXX0NXICAgIDB4MDAwMGZmZmYgICAgIC8qIFJ4Q29uZmlnV29yZCBtYXNrICovCisjZGVmaW5lIEUxMDAwX1JYQ1dfTkMgICAgMHgwNDAwMDAwMCAgICAgLyogUmVjZWl2ZSBjb25maWcgbm8gY2FycmllciAqLworI2RlZmluZSBFMTAwMF9SWENXX0lWICAgIDB4MDgwMDAwMDAgICAgIC8qIFJlY2VpdmUgY29uZmlnIGludmFsaWQgKi8KKyNkZWZpbmUgRTEwMDBfUlhDV19DQyAgICAweDEwMDAwMDAwICAgICAvKiBSZWNlaXZlIGNvbmZpZyBjaGFuZ2UgKi8KKyNkZWZpbmUgRTEwMDBfUlhDV19DICAgICAweDIwMDAwMDAwICAgICAvKiBSZWNlaXZlIGNvbmZpZyAqLworI2RlZmluZSBFMTAwMF9SWENXX1NZTkNIIDB4NDAwMDAwMDAgICAgIC8qIFJlY2VpdmUgY29uZmlnIHN5bmNoICovCisjZGVmaW5lIEUxMDAwX1JYQ1dfQU5DICAgMHg4MDAwMDAwMCAgICAgLyogQXV0by1uZWcgY29tcGxldGUgKi8KKworLyogVHJhbnNtaXQgQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9UQ1RMX1JTVCAgICAweDAwMDAwMDAxICAgIC8qIHNvZnR3YXJlIHJlc2V0ICovCisjZGVmaW5lIEUxMDAwX1RDVExfRU4gICAgIDB4MDAwMDAwMDIgICAgLyogZW5hYmxlIHR4ICovCisjZGVmaW5lIEUxMDAwX1RDVExfQkNFICAgIDB4MDAwMDAwMDQgICAgLyogYnVzeSBjaGVjayBlbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfVENUTF9QU1AgICAgMHgwMDAwMDAwOCAgICAvKiBwYWQgc2hvcnQgcGFja2V0cyAqLworI2RlZmluZSBFMTAwMF9UQ1RMX0NUICAgICAweDAwMDAwZmYwICAgIC8qIGNvbGxpc2lvbiB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgRTEwMDBfVENUTF9DT0xEICAgMHgwMDNmZjAwMCAgICAvKiBjb2xsaXNpb24gZGlzdGFuY2UgKi8KKyNkZWZpbmUgRTEwMDBfVENUTF9TV1hPRkYgMHgwMDQwMDAwMCAgICAvKiBTVyBYb2ZmIHRyYW5zbWlzc2lvbiAqLworI2RlZmluZSBFMTAwMF9UQ1RMX1BCRSAgICAweDAwODAwMDAwICAgIC8qIFBhY2tldCBCdXJzdCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfVENUTF9SVExDICAgMHgwMTAwMDAwMCAgICAvKiBSZS10cmFuc21pdCBvbiBsYXRlIGNvbGxpc2lvbiAqLworI2RlZmluZSBFMTAwMF9UQ1RMX05SVFUgICAweDAyMDAwMDAwICAgIC8qIE5vIFJlLXRyYW5zbWl0IG9uIHVuZGVycnVuICovCisKKy8qIFJlY2VpdmUgQ2hlY2tzdW0gQ29udHJvbCAqLworI2RlZmluZSBFMTAwMF9SWENTVU1fUENTU19NQVNLIDB4MDAwMDAwRkYgICAvKiBQYWNrZXQgQ2hlY2tzdW0gU3RhcnQgKi8KKyNkZWZpbmUgRTEwMDBfUlhDU1VNX0lQT0ZMICAgICAweDAwMDAwMTAwICAgLyogSVB2NCBjaGVja3N1bSBvZmZsb2FkICovCisjZGVmaW5lIEUxMDAwX1JYQ1NVTV9UVU9GTCAgICAgMHgwMDAwMDIwMCAgIC8qIFRDUCAvIFVEUCBjaGVja3N1bSBvZmZsb2FkICovCisjZGVmaW5lIEUxMDAwX1JYQ1NVTV9JUFY2T0ZMICAgMHgwMDAwMDQwMCAgIC8qIElQdjYgY2hlY2tzdW0gb2ZmbG9hZCAqLworCisvKiBEZWZpbml0aW9ucyBmb3IgcG93ZXIgbWFuYWdlbWVudCBhbmQgd2FrZXVwIHJlZ2lzdGVycyAqLworLyogV2FrZSBVcCBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX1dVQ19BUE1FICAgICAgIDB4MDAwMDAwMDEgLyogQVBNIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUNfUE1FX0VOICAgICAweDAwMDAwMDAyIC8qIFBNRSBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VDX1BNRV9TVEFUVVMgMHgwMDAwMDAwNCAvKiBQTUUgU3RhdHVzICovCisjZGVmaW5lIEUxMDAwX1dVQ19BUE1QTUUgICAgIDB4MDAwMDAwMDggLyogQXNzZXJ0IFBNRSBvbiBBUE0gV2FrZXVwICovCisjZGVmaW5lIEUxMDAwX1dVQ19TUE0gICAgICAgIDB4ODAwMDAwMDAgLyogRW5hYmxlIFNQTSAqLworCisvKiBXYWtlIFVwIEZpbHRlciBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX1dVRkNfTE5LQyAweDAwMDAwMDAxIC8qIExpbmsgU3RhdHVzIENoYW5nZSBXYWtldXAgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfTUFHICAweDAwMDAwMDAyIC8qIE1hZ2ljIFBhY2tldCBXYWtldXAgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfRVggICAweDAwMDAwMDA0IC8qIERpcmVjdGVkIEV4YWN0IFdha2V1cCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19NQyAgIDB4MDAwMDAwMDggLyogRGlyZWN0ZWQgTXVsdGljYXN0IFdha2V1cCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19CQyAgIDB4MDAwMDAwMTAgLyogQnJvYWRjYXN0IFdha2V1cCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19BUlAgIDB4MDAwMDAwMjAgLyogQVJQIFJlcXVlc3QgUGFja2V0IFdha2V1cCBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19JUFY0IDB4MDAwMDAwNDAgLyogRGlyZWN0ZWQgSVB2NCBQYWNrZXQgV2FrZXVwIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUZDX0lQVjYgMHgwMDAwMDA4MCAvKiBEaXJlY3RlZCBJUHY2IFBhY2tldCBXYWtldXAgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfRkxYMCAweDAwMDEwMDAwIC8qIEZsZXhpYmxlIEZpbHRlciAwIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUZDX0ZMWDEgMHgwMDAyMDAwMCAvKiBGbGV4aWJsZSBGaWx0ZXIgMSBFbmFibGUgKi8KKyNkZWZpbmUgRTEwMDBfV1VGQ19GTFgyIDB4MDAwNDAwMDAgLyogRmxleGlibGUgRmlsdGVyIDIgRW5hYmxlICovCisjZGVmaW5lIEUxMDAwX1dVRkNfRkxYMyAweDAwMDgwMDAwIC8qIEZsZXhpYmxlIEZpbHRlciAzIEVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9XVUZDX0FMTF9GSUxURVJTIDB4MDAwRjAwRkYgLyogTWFzayBmb3IgYWxsIHdha2V1cCBmaWx0ZXJzICovCisjZGVmaW5lIEUxMDAwX1dVRkNfRkxYX09GRlNFVCAxNiAgICAgICAvKiBPZmZzZXQgdG8gdGhlIEZsZXhpYmxlIEZpbHRlcnMgYml0cyAqLworI2RlZmluZSBFMTAwMF9XVUZDX0ZMWF9GSUxURVJTIDB4MDAwRjAwMDAgLyogTWFzayBmb3IgdGhlIDQgZmxleGlibGUgZmlsdGVycyAqLworCisvKiBXYWtlIFVwIFN0YXR1cyAqLworI2RlZmluZSBFMTAwMF9XVVNfTE5LQyAweDAwMDAwMDAxIC8qIExpbmsgU3RhdHVzIENoYW5nZWQgKi8KKyNkZWZpbmUgRTEwMDBfV1VTX01BRyAgMHgwMDAwMDAwMiAvKiBNYWdpYyBQYWNrZXQgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0VYICAgMHgwMDAwMDAwNCAvKiBEaXJlY3RlZCBFeGFjdCBSZWNlaXZlZCAqLworI2RlZmluZSBFMTAwMF9XVVNfTUMgICAweDAwMDAwMDA4IC8qIERpcmVjdGVkIE11bHRpY2FzdCBSZWNlaXZlZCAqLworI2RlZmluZSBFMTAwMF9XVVNfQkMgICAweDAwMDAwMDEwIC8qIEJyb2FkY2FzdCBSZWNlaXZlZCAqLworI2RlZmluZSBFMTAwMF9XVVNfQVJQICAweDAwMDAwMDIwIC8qIEFSUCBSZXF1ZXN0IFBhY2tldCBSZWNlaXZlZCAqLworI2RlZmluZSBFMTAwMF9XVVNfSVBWNCAweDAwMDAwMDQwIC8qIERpcmVjdGVkIElQdjQgUGFja2V0IFdha2V1cCBSZWNlaXZlZCAqLworI2RlZmluZSBFMTAwMF9XVVNfSVBWNiAweDAwMDAwMDgwIC8qIERpcmVjdGVkIElQdjYgUGFja2V0IFdha2V1cCBSZWNlaXZlZCAqLworI2RlZmluZSBFMTAwMF9XVVNfRkxYMCAweDAwMDEwMDAwIC8qIEZsZXhpYmxlIEZpbHRlciAwIE1hdGNoICovCisjZGVmaW5lIEUxMDAwX1dVU19GTFgxIDB4MDAwMjAwMDAgLyogRmxleGlibGUgRmlsdGVyIDEgTWF0Y2ggKi8KKyNkZWZpbmUgRTEwMDBfV1VTX0ZMWDIgMHgwMDA0MDAwMCAvKiBGbGV4aWJsZSBGaWx0ZXIgMiBNYXRjaCAqLworI2RlZmluZSBFMTAwMF9XVVNfRkxYMyAweDAwMDgwMDAwIC8qIEZsZXhpYmxlIEZpbHRlciAzIE1hdGNoICovCisjZGVmaW5lIEUxMDAwX1dVU19GTFhfRklMVEVSUyAweDAwMEYwMDAwIC8qIE1hc2sgZm9yIHRoZSA0IGZsZXhpYmxlIGZpbHRlcnMgKi8KKworLyogTWFuYWdlbWVudCBDb250cm9sICovCisjZGVmaW5lIEUxMDAwX01BTkNfU01CVVNfRU4gICAgICAweDAwMDAwMDAxIC8qIFNNQnVzIEVuYWJsZWQgLSBSTyAqLworI2RlZmluZSBFMTAwMF9NQU5DX0FTRl9FTiAgICAgICAgMHgwMDAwMDAwMiAvKiBBU0YgRW5hYmxlZCAtIFJPICovCisjZGVmaW5lIEUxMDAwX01BTkNfUl9PTl9GT1JDRSAgICAweDAwMDAwMDA0IC8qIFJlc2V0IG9uIEZvcmNlIFRDTyAtIFJPICovCisjZGVmaW5lIEUxMDAwX01BTkNfUk1DUF9FTiAgICAgICAweDAwMDAwMTAwIC8qIEVuYWJsZSBSQ01QIDAyNkZoIEZpbHRlcmluZyAqLworI2RlZmluZSBFMTAwMF9NQU5DXzAyOThfRU4gICAgICAgMHgwMDAwMDIwMCAvKiBFbmFibGUgUkNNUCAwMjk4aCBGaWx0ZXJpbmcgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19JUFY0X0VOICAgICAgIDB4MDAwMDA0MDAgLyogRW5hYmxlIElQdjQgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19JUFY2X0VOICAgICAgIDB4MDAwMDA4MDAgLyogRW5hYmxlIElQdjYgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19TTkFQX0VOICAgICAgIDB4MDAwMDEwMDAgLyogQWNjZXB0IExMQy9TTkFQICovCisjZGVmaW5lIEUxMDAwX01BTkNfQVJQX0VOICAgICAgICAweDAwMDAyMDAwIC8qIEVuYWJsZSBBUlAgUmVxdWVzdCBGaWx0ZXJpbmcgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19ORUlHSEJPUl9FTiAgIDB4MDAwMDQwMDAgLyogRW5hYmxlIE5laWdoYm9yIERpc2NvdmVyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBGaWx0ZXJpbmcgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19UQ09fUkVTRVQgICAgIDB4MDAwMTAwMDAgLyogVENPIFJlc2V0IE9jY3VycmVkICovCisjZGVmaW5lIEUxMDAwX01BTkNfUkNWX1RDT19FTiAgICAweDAwMDIwMDAwIC8qIFJlY2VpdmUgVENPIFBhY2tldHMgRW5hYmxlZCAqLworI2RlZmluZSBFMTAwMF9NQU5DX1JFUE9SVF9TVEFUVVMgMHgwMDA0MDAwMCAvKiBTdGF0dXMgUmVwb3J0aW5nIEVuYWJsZWQgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19FTl9NQUNfQUREUl9GSUxURVIgICAweDAwMTAwMDAwIC8qIEVuYWJsZSBNQUMgYWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZmlsdGVyaW5nICovCisjZGVmaW5lIEUxMDAwX01BTkNfRU5fTU5HMkhPU1QgICAweDAwMjAwMDAwIC8qIEVuYWJsZSBNTkcgcGFja2V0cyB0byBob3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1lbW9yeSAqLworI2RlZmluZSBFMTAwMF9NQU5DX1NNQl9SRVEgICAgICAgMHgwMTAwMDAwMCAvKiBTTUJ1cyBSZXF1ZXN0ICovCisjZGVmaW5lIEUxMDAwX01BTkNfU01CX0dOVCAgICAgICAweDAyMDAwMDAwIC8qIFNNQnVzIEdyYW50ICovCisjZGVmaW5lIEUxMDAwX01BTkNfU01CX0NMS19JTiAgICAweDA0MDAwMDAwIC8qIFNNQnVzIENsb2NrIEluICovCisjZGVmaW5lIEUxMDAwX01BTkNfU01CX0RBVEFfSU4gICAweDA4MDAwMDAwIC8qIFNNQnVzIERhdGEgSW4gKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfREFUQV9PVVQgIDB4MTAwMDAwMDAgLyogU01CdXMgRGF0YSBPdXQgKi8KKyNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfQ0xLX09VVCAgIDB4MjAwMDAwMDAgLyogU01CdXMgQ2xvY2sgT3V0ICovCisKKyNkZWZpbmUgRTEwMDBfTUFOQ19TTUJfREFUQV9PVVRfU0hJRlQgIDI4IC8qIFNNQnVzIERhdGEgT3V0IFNoaWZ0ICovCisjZGVmaW5lIEUxMDAwX01BTkNfU01CX0NMS19PVVRfU0hJRlQgICAyOSAvKiBTTUJ1cyBDbG9jayBPdXQgU2hpZnQgKi8KKworLyogV2FrZSBVcCBQYWNrZXQgTGVuZ3RoICovCisjZGVmaW5lIEUxMDAwX1dVUExfTEVOR1RIX01BU0sgMHgwRkZGICAgLyogT25seSB0aGUgbG93ZXIgMTIgYml0cyBhcmUgdmFsaWQgKi8KKworI2RlZmluZSBFMTAwMF9NREFMSUdOICAgICAgICAgIDQwOTYKKworLyogRUVQUk9NIENvbW1hbmRzIC0gTWljcm93aXJlICovCisjZGVmaW5lIEVFUFJPTV9SRUFEX09QQ09ERV9NSUNST1dJUkUgIDB4NiAgLyogRUVQUk9NIHJlYWQgb3Bjb2RlICovCisjZGVmaW5lIEVFUFJPTV9XUklURV9PUENPREVfTUlDUk9XSVJFIDB4NSAgLyogRUVQUk9NIHdyaXRlIG9wY29kZSAqLworI2RlZmluZSBFRVBST01fRVJBU0VfT1BDT0RFX01JQ1JPV0lSRSAweDcgIC8qIEVFUFJPTSBlcmFzZSBvcGNvZGUgKi8KKyNkZWZpbmUgRUVQUk9NX0VXRU5fT1BDT0RFX01JQ1JPV0lSRSAgMHgxMyAvKiBFRVBST00gZXJhc2Uvd3JpdGUgZW5hYmxlICovCisjZGVmaW5lIEVFUFJPTV9FV0RTX09QQ09ERV9NSUNST1dJUkUgIDB4MTAgLyogRUVQUk9NIGVyYXN0L3dyaXRlIGRpc2FibGUgKi8KKworLyogRUVQUk9NIENvbW1hbmRzIC0gU1BJICovCisjZGVmaW5lIEVFUFJPTV9NQVhfUkVUUllfU1BJICAgIDUwMDAgLyogTWF4IHdhaXQgb2YgNW1zLCBmb3IgUkRZIHNpZ25hbCAqLworI2RlZmluZSBFRVBST01fUkVBRF9PUENPREVfU1BJICAweDMgIC8qIEVFUFJPTSByZWFkIG9wY29kZSAqLworI2RlZmluZSBFRVBST01fV1JJVEVfT1BDT0RFX1NQSSAweDIgIC8qIEVFUFJPTSB3cml0ZSBvcGNvZGUgKi8KKyNkZWZpbmUgRUVQUk9NX0E4X09QQ09ERV9TUEkgICAgMHg4ICAvKiBvcGNvZGUgYml0LTMgPSBhZGRyZXNzIGJpdC04ICovCisjZGVmaW5lIEVFUFJPTV9XUkVOX09QQ09ERV9TUEkgIDB4NiAgLyogRUVQUk9NIHNldCBXcml0ZSBFbmFibGUgbGF0Y2ggKi8KKyNkZWZpbmUgRUVQUk9NX1dSRElfT1BDT0RFX1NQSSAgMHg0ICAvKiBFRVBST00gcmVzZXQgV3JpdGUgRW5hYmxlIGxhdGNoICovCisjZGVmaW5lIEVFUFJPTV9SRFNSX09QQ09ERV9TUEkgIDB4NSAgLyogRUVQUk9NIHJlYWQgU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIEVFUFJPTV9XUlNSX09QQ09ERV9TUEkgIDB4MSAgLyogRUVQUk9NIHdyaXRlIFN0YXR1cyByZWdpc3RlciAqLworCisvKiBFRVBST00gU2l6ZSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBFRVBST01fU0laRV8xNktCICAgICAgICAweDE4MDAKKyNkZWZpbmUgRUVQUk9NX1NJWkVfOEtCICAgICAgICAgMHgxNDAwCisjZGVmaW5lIEVFUFJPTV9TSVpFXzRLQiAgICAgICAgIDB4MTAwMAorI2RlZmluZSBFRVBST01fU0laRV8yS0IgICAgICAgICAweDBDMDAKKyNkZWZpbmUgRUVQUk9NX1NJWkVfMUtCICAgICAgICAgMHgwODAwCisjZGVmaW5lIEVFUFJPTV9TSVpFXzUxMkIgICAgICAgIDB4MDQwMAorI2RlZmluZSBFRVBST01fU0laRV8xMjhCICAgICAgICAweDAwMDAKKyNkZWZpbmUgRUVQUk9NX1NJWkVfTUFTSyAgICAgICAgMHgxQzAwCisKKy8qIEVFUFJPTSBXb3JkIE9mZnNldHMgKi8KKyNkZWZpbmUgRUVQUk9NX0NPTVBBVCAgICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIEVFUFJPTV9JRF9MRURfU0VUVElOR1MgICAgICAgIDB4MDAwNAorI2RlZmluZSBFRVBST01fU0VSREVTX0FNUExJVFVERSAgICAgICAweDAwMDYgLyogRm9yIFNFUkRFUyBvdXRwdXQgYW1wbGl0dWRlIGFkanVzdG1lbnQuICovCisjZGVmaW5lIEVFUFJPTV9QSFlfQ0xBU1NfV09SRCAgICAgICAgIDB4MDAwNworI2RlZmluZSBFRVBST01fSU5JVF9DT05UUk9MMV9SRUcgICAgICAweDAwMEEKKyNkZWZpbmUgRUVQUk9NX0lOSVRfQ09OVFJPTDJfUkVHICAgICAgMHgwMDBGCisjZGVmaW5lIEVFUFJPTV9JTklUX0NPTlRST0wzX1BPUlRfQiAgIDB4MDAxNAorI2RlZmluZSBFRVBST01fSU5JVF9DT05UUk9MM19QT1JUX0EgICAweDAwMjQKKyNkZWZpbmUgRUVQUk9NX0NGRyAgICAgICAgICAgICAgICAgICAgMHgwMDEyCisjZGVmaW5lIEVFUFJPTV9GTEFTSF9WRVJTSU9OICAgICAgICAgIDB4MDAzMgorI2RlZmluZSBFRVBST01fQ0hFQ0tTVU1fUkVHICAgICAgICAgICAweDAwM0YKKworLyogV29yZCBkZWZpbml0aW9ucyBmb3IgSUQgTEVEIFNldHRpbmdzICovCisjZGVmaW5lIElEX0xFRF9SRVNFUlZFRF8wMDAwIDB4MDAwMAorI2RlZmluZSBJRF9MRURfUkVTRVJWRURfRkZGRiAweEZGRkYKKyNkZWZpbmUgSURfTEVEX0RFRkFVTFQgICAgICAgKChJRF9MRURfT0ZGMV9PTjIgPDwgMTIpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEX0xFRF9PRkYxX09GRjIgPDwgOCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSURfTEVEX0RFRjFfREVGMiA8PCA0KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRF9MRURfREVGMV9ERUYyKSkKKyNkZWZpbmUgSURfTEVEX0RFRjFfREVGMiAgICAgMHgxCisjZGVmaW5lIElEX0xFRF9ERUYxX09OMiAgICAgIDB4MgorI2RlZmluZSBJRF9MRURfREVGMV9PRkYyICAgICAweDMKKyNkZWZpbmUgSURfTEVEX09OMV9ERUYyICAgICAgMHg0CisjZGVmaW5lIElEX0xFRF9PTjFfT04yICAgICAgIDB4NQorI2RlZmluZSBJRF9MRURfT04xX09GRjIgICAgICAweDYKKyNkZWZpbmUgSURfTEVEX09GRjFfREVGMiAgICAgMHg3CisjZGVmaW5lIElEX0xFRF9PRkYxX09OMiAgICAgIDB4OAorI2RlZmluZSBJRF9MRURfT0ZGMV9PRkYyICAgICAweDkKKworI2RlZmluZSBJR1BfQUNUSVZJVFlfTEVEX01BU0sgICAweEZGRkZGMEZGCisjZGVmaW5lIElHUF9BQ1RJVklUWV9MRURfRU5BQkxFIDB4MDMwMAorI2RlZmluZSBJR1BfTEVEM19NT0RFICAgICAgICAgICAweDA3MDAwMDAwCisKKworLyogTWFzayBiaXRzIGZvciBTRVJERVMgYW1wbGl0dWRlIGFkanVzdG1lbnQgaW4gV29yZCA2IG9mIHRoZSBFRVBST00gKi8KKyNkZWZpbmUgRUVQUk9NX1NFUkRFU19BTVBMSVRVREVfTUFTSyAgMHgwMDBGCisKKy8qIE1hc2sgYml0IGZvciBQSFkgY2xhc3MgaW4gV29yZCA3IG9mIHRoZSBFRVBST00gKi8KKyNkZWZpbmUgRUVQUk9NX1BIWV9DTEFTU19BICAgMHg4MDAwCisKKy8qIE1hc2sgYml0cyBmb3IgZmllbGRzIGluIFdvcmQgMHgwYSBvZiB0aGUgRUVQUk9NICovCisjZGVmaW5lIEVFUFJPTV9XT1JEMEFfSUxPUyAgIDB4MDAxMAorI2RlZmluZSBFRVBST01fV09SRDBBX1NXRFBJTyAweDAxRTAKKyNkZWZpbmUgRUVQUk9NX1dPUkQwQV9MUlNUICAgMHgwMjAwCisjZGVmaW5lIEVFUFJPTV9XT1JEMEFfRkQgICAgIDB4MDQwMAorI2RlZmluZSBFRVBST01fV09SRDBBXzY2TUhaICAweDA4MDAKKworLyogTWFzayBiaXRzIGZvciBmaWVsZHMgaW4gV29yZCAweDBmIG9mIHRoZSBFRVBST00gKi8KKyNkZWZpbmUgRUVQUk9NX1dPUkQwRl9QQVVTRV9NQVNLIDB4MzAwMAorI2RlZmluZSBFRVBST01fV09SRDBGX1BBVVNFICAgICAgMHgxMDAwCisjZGVmaW5lIEVFUFJPTV9XT1JEMEZfQVNNX0RJUiAgICAweDIwMDAKKyNkZWZpbmUgRUVQUk9NX1dPUkQwRl9BTkUgICAgICAgIDB4MDgwMAorI2RlZmluZSBFRVBST01fV09SRDBGX1NXUERJT19FWFQgMHgwMEYwCisKKy8qIEZvciBjaGVja3N1bW1pbmcsIHRoZSBzdW0gb2YgYWxsIHdvcmRzIGluIHRoZSBFRVBST00gc2hvdWxkIGVxdWFsIDB4QkFCQS4gKi8KKyNkZWZpbmUgRUVQUk9NX1NVTSAweEJBQkEKKworLyogRUVQUk9NIE1hcCBkZWZpbmVzIChXT1JEIE9GRlNFVFMpKi8KKyNkZWZpbmUgRUVQUk9NX05PREVfQUREUkVTU19CWVRFXzAgMAorI2RlZmluZSBFRVBST01fUEJBX0JZVEVfMSAgICAgICAgICA4CisKKyNkZWZpbmUgRUVQUk9NX1JFU0VSVkVEX1dPUkQgICAgICAgICAgMHhGRkZGCisKKy8qIEVFUFJPTSBNYXAgU2l6ZXMgKEJ5dGUgQ291bnRzKSAqLworI2RlZmluZSBQQkFfU0laRSA0CisKKy8qIENvbGxpc2lvbiByZWxhdGVkIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLworI2RlZmluZSBFMTAwMF9DT0xMSVNJT05fVEhSRVNIT0xEICAgICAgIDE1CisjZGVmaW5lIEUxMDAwX0NUX1NISUZUICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBFMTAwMF9DT0xMSVNJT05fRElTVEFOQ0UgICAgICAgIDY0CisjZGVmaW5lIEUxMDAwX0ZEWF9DT0xMSVNJT05fRElTVEFOQ0UgICAgRTEwMDBfQ09MTElTSU9OX0RJU1RBTkNFCisjZGVmaW5lIEUxMDAwX0hEWF9DT0xMSVNJT05fRElTVEFOQ0UgICAgRTEwMDBfQ09MTElTSU9OX0RJU1RBTkNFCisjZGVmaW5lIEUxMDAwX0NPTERfU0hJRlQgICAgICAgICAgICAgICAgMTIKKworLyogTnVtYmVyIG9mIFRyYW5zbWl0IGFuZCBSZWNlaXZlIERlc2NyaXB0b3JzIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4ICovCisjZGVmaW5lIFJFUV9UWF9ERVNDUklQVE9SX01VTFRJUExFICA4CisjZGVmaW5lIFJFUV9SWF9ERVNDUklQVE9SX01VTFRJUExFICA4CisKKy8qIERlZmF1bHQgdmFsdWVzIGZvciB0aGUgdHJhbnNtaXQgSVBHIHJlZ2lzdGVyICovCisjZGVmaW5lIERFRkFVTFRfODI1NDJfVElQR19JUEdUICAgICAgICAxMAorI2RlZmluZSBERUZBVUxUXzgyNTQzX1RJUEdfSVBHVF9GSUJFUiAgOQorI2RlZmluZSBERUZBVUxUXzgyNTQzX1RJUEdfSVBHVF9DT1BQRVIgOAorCisjZGVmaW5lIEUxMDAwX1RJUEdfSVBHVF9NQVNLICAweDAwMDAwM0ZGCisjZGVmaW5lIEUxMDAwX1RJUEdfSVBHUjFfTUFTSyAweDAwMEZGQzAwCisjZGVmaW5lIEUxMDAwX1RJUEdfSVBHUjJfTUFTSyAweDNGRjAwMDAwCisKKyNkZWZpbmUgREVGQVVMVF84MjU0Ml9USVBHX0lQR1IxIDIKKyNkZWZpbmUgREVGQVVMVF84MjU0M19USVBHX0lQR1IxIDgKKyNkZWZpbmUgRTEwMDBfVElQR19JUEdSMV9TSElGVCAgMTAKKworI2RlZmluZSBERUZBVUxUXzgyNTQyX1RJUEdfSVBHUjIgMTAKKyNkZWZpbmUgREVGQVVMVF84MjU0M19USVBHX0lQR1IyIDYKKyNkZWZpbmUgRTEwMDBfVElQR19JUEdSMl9TSElGVCAgMjAKKworI2RlZmluZSBFMTAwMF9UWERNQUNfRFBQIDB4MDAwMDAwMDEKKworLyogQWRhcHRpdmUgSUZTIGRlZmluZXMgKi8KKyNkZWZpbmUgVFhfVEhSRVNIT0xEX1NUQVJUICAgICA4CisjZGVmaW5lIFRYX1RIUkVTSE9MRF9JTkNSRU1FTlQgMTAKKyNkZWZpbmUgVFhfVEhSRVNIT0xEX0RFQ1JFTUVOVCAxCisjZGVmaW5lIFRYX1RIUkVTSE9MRF9TVE9QICAgICAgMTkwCisjZGVmaW5lIFRYX1RIUkVTSE9MRF9ESVNBQkxFICAgMAorI2RlZmluZSBUWF9USFJFU0hPTERfVElNRVJfTVMgIDEwMDAwCisjZGVmaW5lIE1JTl9OVU1fWE1JVFMgICAgICAgICAgMTAwMAorI2RlZmluZSBJRlNfTUFYICAgICAgICAgICAgICAgIDgwCisjZGVmaW5lIElGU19TVEVQICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgSUZTX01JTiAgICAgICAgICAgICAgICA0MAorI2RlZmluZSBJRlNfUkFUSU8gICAgICAgICAgICAgIDQKKworLyogUEJBIGNvbnN0YW50cyAqLworI2RlZmluZSBFMTAwMF9QQkFfMTZLIDB4MDAxMCAgICAvKiAxNktCLCBkZWZhdWx0IFRYIGFsbG9jYXRpb24gKi8KKyNkZWZpbmUgRTEwMDBfUEJBXzIySyAweDAwMTYKKyNkZWZpbmUgRTEwMDBfUEJBXzI0SyAweDAwMTgKKyNkZWZpbmUgRTEwMDBfUEJBXzMwSyAweDAwMUUKKyNkZWZpbmUgRTEwMDBfUEJBXzQwSyAweDAwMjgKKyNkZWZpbmUgRTEwMDBfUEJBXzQ4SyAweDAwMzAgICAgLyogNDhLQiwgZGVmYXVsdCBSWCBhbGxvY2F0aW9uICovCisKKy8qIEZsb3cgQ29udHJvbCBDb25zdGFudHMgKi8KKyNkZWZpbmUgRkxPV19DT05UUk9MX0FERFJFU1NfTE9XICAweDAwQzI4MDAxCisjZGVmaW5lIEZMT1dfQ09OVFJPTF9BRERSRVNTX0hJR0ggMHgwMDAwMDEwMAorI2RlZmluZSBGTE9XX0NPTlRST0xfVFlQRSAgICAgICAgIDB4ODgwOAorCisvKiBUaGUgaGlzdG9yaWNhbCBkZWZhdWx0cyBmb3IgdGhlIGZsb3cgY29udHJvbCB2YWx1ZXMgYXJlIGdpdmVuIGJlbG93LiAqLworI2RlZmluZSBGQ19ERUZBVUxUX0hJX1RIUkVTSCAgICAgICAgKDB4ODAwMCkgICAgLyogMzJLQiAqLworI2RlZmluZSBGQ19ERUZBVUxUX0xPX1RIUkVTSCAgICAgICAgKDB4NDAwMCkgICAgLyogMTZLQiAqLworI2RlZmluZSBGQ19ERUZBVUxUX1RYX1RJTUVSICAgICAgICAgKDB4MTAwKSAgICAgLyogfjEzMCB1cyAqLworCisvKiBQQ0lYIENvbmZpZyBzcGFjZSAqLworI2RlZmluZSBQQ0lYX0NPTU1BTkRfUkVHSVNURVIgICAgMHhFNgorI2RlZmluZSBQQ0lYX1NUQVRVU19SRUdJU1RFUl9MTyAgMHhFOAorI2RlZmluZSBQQ0lYX1NUQVRVU19SRUdJU1RFUl9ISSAgMHhFQQorCisjZGVmaW5lIFBDSVhfQ09NTUFORF9NTVJCQ19NQVNLICAgICAgMHgwMDBDCisjZGVmaW5lIFBDSVhfQ09NTUFORF9NTVJCQ19TSElGVCAgICAgMHgyCisjZGVmaW5lIFBDSVhfU1RBVFVTX0hJX01NUkJDX01BU0sgICAgMHgwMDYwCisjZGVmaW5lIFBDSVhfU1RBVFVTX0hJX01NUkJDX1NISUZUICAgMHg1CisjZGVmaW5lIFBDSVhfU1RBVFVTX0hJX01NUkJDXzRLICAgICAgMHgzCisjZGVmaW5lIFBDSVhfU1RBVFVTX0hJX01NUkJDXzJLICAgICAgMHgyCisKKworLyogTnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gc2hpZnQgcmlnaHQgdGhlICJwYXVzZSIgYml0cyBmcm9tIHRoZQorICogRUVQUk9NIChiaXRzIDEzOjEyKSB0byB0aGUgInBhdXNlIiAoYml0cyA4OjcpIGZpZWxkIGluIHRoZSBUWENXIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFBBVVNFX1NISUZUIDUKKworLyogTnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gc2hpZnQgbGVmdCB0aGUgIlNXRFBJTyIgYml0cyBmcm9tIHRoZQorICogRUVQUk9NIChiaXRzIDg6NSkgdG8gdGhlICJTV0RQSU8iIChiaXRzIDI1OjIyKSBmaWVsZCBpbiB0aGUgQ1RSTCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBTV0RQSU9fU0hJRlQgMTcKKworLyogTnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gc2hpZnQgbGVmdCB0aGUgIlNXRFBJT19FWFQiIGJpdHMgZnJvbSB0aGUKKyAqIEVFUFJPTSB3b3JkIEYgKGJpdHMgNzo0KSB0byB0aGUgYml0cyAxMTo4IG9mIFRoZSBFeHRlbmRlZCBDVFJMIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFNXRFBJT19fRVhUX1NISUZUIDQKKworLyogTnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gc2hpZnQgbGVmdCB0aGUgIklMT1MiIGJpdCBmcm9tIHRoZSBFRVBST00KKyAqIChiaXQgNCkgdG8gdGhlICJJTE9TIiAoYml0IDcpIGZpZWxkIGluIHRoZSBDVFJMIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIElMT1NfU0hJRlQgIDMKKworCisjZGVmaW5lIFJFQ0VJVkVfQlVGRkVSX0FMSUdOX1NJWkUgICgyNTYpCisKKy8qIE51bWJlciBvZiBtaWxsaXNlY29uZHMgd2Ugd2FpdCBmb3IgYXV0by1uZWdvdGlhdGlvbiB0byBjb21wbGV0ZSAqLworI2RlZmluZSBMSU5LX1VQX1RJTUVPVVQgICAgICAgICAgICAgNTAwCisKKyNkZWZpbmUgRTEwMDBfVFhfQlVGRkVSX1NJWkUgKCh1aW50MzJfdCkxNTE0KQorCisvKiBUaGUgY2FycmllciBleHRlbnNpb24gc3ltYm9sLCBhcyByZWNlaXZlZCBieSB0aGUgTklDLiAqLworI2RlZmluZSBDQVJSSUVSX0VYVEVOU0lPTiAgIDB4MEYKKworLyogVEJJX0FDQ0VQVCBtYWNybyBkZWZpbml0aW9uOgorICoKKyAqIFRoaXMgbWFjcm8gcmVxdWlyZXM6CisgKiAgICAgIGFkYXB0ZXIgPSBhIHBvaW50ZXIgdG8gc3RydWN0IGUxMDAwX2h3CisgKiAgICAgIHN0YXR1cyA9IHRoZSA4IGJpdCBzdGF0dXMgZmllbGQgb2YgdGhlIFJYIGRlc2NyaXB0b3Igd2l0aCBFT1Agc2V0CisgKiAgICAgIGVycm9yID0gdGhlIDggYml0IGVycm9yIGZpZWxkIG9mIHRoZSBSWCBkZXNjcmlwdG9yIHdpdGggRU9QIHNldAorICogICAgICBsZW5ndGggPSB0aGUgc3VtIG9mIGFsbCB0aGUgbGVuZ3RoIGZpZWxkcyBvZiB0aGUgUlggZGVzY3JpcHRvcnMgdGhhdAorICogICAgICAgICAgICAgICBtYWtlIHVwIHRoZSBjdXJyZW50IGZyYW1lCisgKiAgICAgIGxhc3RfYnl0ZSA9IHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGZyYW1lIERNQWVkIGJ5IHRoZSBoYXJkd2FyZQorICogICAgICBtYXhfZnJhbWVfbGVuZ3RoID0gdGhlIG1heGltdW0gZnJhbWUgbGVuZ3RoIHdlIHdhbnQgdG8gYWNjZXB0LgorICogICAgICBtaW5fZnJhbWVfbGVuZ3RoID0gdGhlIG1pbmltdW0gZnJhbWUgbGVuZ3RoIHdlIHdhbnQgdG8gYWNjZXB0LgorICoKKyAqIFRoaXMgbWFjcm8gaXMgYSBjb25kaXRpb25hbCB0aGF0IHNob3VsZCBiZSB1c2VkIGluIHRoZSBpbnRlcnJ1cHQKKyAqIGhhbmRsZXIncyBSeCBwcm9jZXNzaW5nIHJvdXRpbmUgd2hlbiBSeEVycm9ycyBoYXZlIGJlZW4gZGV0ZWN0ZWQuCisgKgorICogVHlwaWNhbCB1c2U6CisgKiAgLi4uCisgKiAgaWYgKFRCSV9BQ0NFUFQpIHsKKyAqICAgICAgYWNjZXB0X2ZyYW1lID0gVFJVRTsKKyAqICAgICAgZTEwMDBfdGJpX2FkanVzdF9zdGF0cyhhZGFwdGVyLCBNYWNBZGRyZXNzKTsKKyAqICAgICAgZnJhbWVfbGVuZ3RoLS07CisgKiAgfSBlbHNlIHsKKyAqICAgICAgYWNjZXB0X2ZyYW1lID0gRkFMU0U7CisgKiAgfQorICogIC4uLgorICovCisKKyNkZWZpbmUgVEJJX0FDQ0VQVChhZGFwdGVyLCBzdGF0dXMsIGVycm9ycywgbGVuZ3RoLCBsYXN0X2J5dGUpIFwKKyAgICAoKGFkYXB0ZXIpLT50YmlfY29tcGF0aWJpbGl0eV9vbiAmJiBcCisgICAgICgoKGVycm9ycykgJiBFMTAwMF9SWERfRVJSX0ZSQU1FX0VSUl9NQVNLKSA9PSBFMTAwMF9SWERfRVJSX0NFKSAmJiBcCisgICAgICgobGFzdF9ieXRlKSA9PSBDQVJSSUVSX0VYVEVOU0lPTikgJiYgXAorICAgICAoKChzdGF0dXMpICYgRTEwMDBfUlhEX1NUQVRfVlApID8gXAorICAgICAgICAgICgoKGxlbmd0aCkgPiAoKGFkYXB0ZXIpLT5taW5fZnJhbWVfc2l6ZSAtIFZMQU5fVEFHX1NJWkUpKSAmJiBcCisgICAgICAgICAgICgobGVuZ3RoKSA8PSAoKGFkYXB0ZXIpLT5tYXhfZnJhbWVfc2l6ZSArIDEpKSkgOiBcCisgICAgICAgICAgKCgobGVuZ3RoKSA+IChhZGFwdGVyKS0+bWluX2ZyYW1lX3NpemUpICYmIFwKKyAgICAgICAgICAgKChsZW5ndGgpIDw9ICgoYWRhcHRlciktPm1heF9mcmFtZV9zaXplICsgVkxBTl9UQUdfU0laRSArIDEpKSkpKQorCisKKy8qIFN0cnVjdHVyZXMsIGVudW1zLCBhbmQgbWFjcm9zIGZvciB0aGUgUEhZICovCisKKy8qIEJpdCBkZWZpbml0aW9ucyBmb3IgdGhlIE1hbmFnZW1lbnQgRGF0YSBJTyAoTURJTykgYW5kIE1hbmFnZW1lbnQgRGF0YQorICogQ2xvY2sgKE1EQykgcGlucyBpbiB0aGUgRGV2aWNlIENvbnRyb2wgUmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgRTEwMDBfQ1RSTF9QSFlfUkVTRVRfRElSICBFMTAwMF9DVFJMX1NXRFBJTzAKKyNkZWZpbmUgRTEwMDBfQ1RSTF9QSFlfUkVTRVQgICAgICBFMTAwMF9DVFJMX1NXRFBJTjAKKyNkZWZpbmUgRTEwMDBfQ1RSTF9NRElPX0RJUiAgICAgICBFMTAwMF9DVFJMX1NXRFBJTzIKKyNkZWZpbmUgRTEwMDBfQ1RSTF9NRElPICAgICAgICAgICBFMTAwMF9DVFJMX1NXRFBJTjIKKyNkZWZpbmUgRTEwMDBfQ1RSTF9NRENfRElSICAgICAgICBFMTAwMF9DVFJMX1NXRFBJTzMKKyNkZWZpbmUgRTEwMDBfQ1RSTF9NREMgICAgICAgICAgICBFMTAwMF9DVFJMX1NXRFBJTjMKKyNkZWZpbmUgRTEwMDBfQ1RSTF9QSFlfUkVTRVRfRElSNCBFMTAwMF9DVFJMX0VYVF9TRFA0X0RJUgorI2RlZmluZSBFMTAwMF9DVFJMX1BIWV9SRVNFVDQgICAgIEUxMDAwX0NUUkxfRVhUX1NEUDRfREFUQQorCisvKiBQSFkgMTAwMCBNSUkgUmVnaXN0ZXIvQml0IERlZmluaXRpb25zICovCisvKiBQSFkgUmVnaXN0ZXJzIGRlZmluZWQgYnkgSUVFRSAqLworI2RlZmluZSBQSFlfQ1RSTCAgICAgICAgIDB4MDAgLyogQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfU1RBVFVTICAgICAgIDB4MDEgLyogU3RhdHVzIFJlZ2lzZXIgKi8KKyNkZWZpbmUgUEhZX0lEMSAgICAgICAgICAweDAyIC8qIFBoeSBJZCBSZWcgKHdvcmQgMSkgKi8KKyNkZWZpbmUgUEhZX0lEMiAgICAgICAgICAweDAzIC8qIFBoeSBJZCBSZWcgKHdvcmQgMikgKi8KKyNkZWZpbmUgUEhZX0FVVE9ORUdfQURWICAweDA0IC8qIEF1dG9uZWcgQWR2ZXJ0aXNlbWVudCAqLworI2RlZmluZSBQSFlfTFBfQUJJTElUWSAgIDB4MDUgLyogTGluayBQYXJ0bmVyIEFiaWxpdHkgKEJhc2UgUGFnZSkgKi8KKyNkZWZpbmUgUEhZX0FVVE9ORUdfRVhQICAweDA2IC8qIEF1dG9uZWcgRXhwYW5zaW9uIFJlZyAqLworI2RlZmluZSBQSFlfTkVYVF9QQUdFX1RYIDB4MDcgLyogTmV4dCBQYWdlIFRYICovCisjZGVmaW5lIFBIWV9MUF9ORVhUX1BBR0UgMHgwOCAvKiBMaW5rIFBhcnRuZXIgTmV4dCBQYWdlICovCisjZGVmaW5lIFBIWV8xMDAwVF9DVFJMICAgMHgwOSAvKiAxMDAwQmFzZS1UIENvbnRyb2wgUmVnICovCisjZGVmaW5lIFBIWV8xMDAwVF9TVEFUVVMgMHgwQSAvKiAxMDAwQmFzZS1UIFN0YXR1cyBSZWcgKi8KKyNkZWZpbmUgUEhZX0VYVF9TVEFUVVMgICAweDBGIC8qIEV4dGVuZGVkIFN0YXR1cyBSZWcgKi8KKworI2RlZmluZSBNQVhfUEhZX1JFR19BRERSRVNTICAgICAgICAweDFGICAvKiA1IGJpdCBhZGRyZXNzIGJ1cyAoMC0weDFGKSAqLworI2RlZmluZSBNQVhfUEhZX01VTFRJX1BBR0VfUkVHICAgICAweEYgICAvKiBSZWdpc3RlcnMgZXF1YWwgb24gYWxsIHBhZ2VzICovCisKKy8qIE04OEUxMDAwIFNwZWNpZmljIFJlZ2lzdGVycyAqLworI2RlZmluZSBNODhFMTAwMF9QSFlfU1BFQ19DVFJMICAgICAweDEwICAvKiBQSFkgU3BlY2lmaWMgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBNODhFMTAwMF9QSFlfU1BFQ19TVEFUVVMgICAweDExICAvKiBQSFkgU3BlY2lmaWMgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE04OEUxMDAwX0lOVF9FTkFCTEUgICAgICAgIDB4MTIgIC8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfSU5UX1NUQVRVUyAgICAgICAgMHgxMyAgLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNODhFMTAwMF9FWFRfUEhZX1NQRUNfQ1RSTCAweDE0ICAvKiBFeHRlbmRlZCBQSFkgU3BlY2lmaWMgQ29udHJvbCAqLworI2RlZmluZSBNODhFMTAwMF9SWF9FUlJfQ05UUiAgICAgICAweDE1ICAvKiBSZWNlaXZlIEVycm9yIENvdW50ZXIgKi8KKworI2RlZmluZSBNODhFMTAwMF9QSFlfRVhUX0NUUkwgICAgICAweDFBICAvKiBQSFkgZXh0ZW5kIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUEhZX1BBR0VfU0VMRUNUICAgMHgxRCAgLyogUmVnIDI5IGZvciBwYWdlIG51bWJlciBzZXR0aW5nICovCisjZGVmaW5lIE04OEUxMDAwX1BIWV9HRU5fQ09OVFJPTCAgIDB4MUUgIC8qIEl0cyBtZWFuaW5nIGRlcGVuZHMgb24gcmVnIDI5ICovCisjZGVmaW5lIE04OEUxMDAwX1BIWV9WQ09fUkVHX0JJVDggIDB4MTAwIC8qIEJpdHMgOCAmIDExIGFyZSBhZGp1c3RlZCBmb3IgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUEhZX1ZDT19SRUdfQklUMTEgMHg4MDAgICAgLyogaW1wcm92ZWQgQkVSIHBlcmZvcm1hbmNlICovCisKKyNkZWZpbmUgSUdQMDFFMTAwMF9JRUVFX1JFR1NfUEFHRSAgMHgwMDAwCisjZGVmaW5lIElHUDAxRTEwMDBfSUVFRV9SRVNUQVJUX0FVVE9ORUcgMHgzMzAwCisjZGVmaW5lIElHUDAxRTEwMDBfSUVFRV9GT1JDRV9HSUdBICAgICAgMHgwMTQwCisKKy8qIElHUDAxRTEwMDAgU3BlY2lmaWMgUmVnaXN0ZXJzICovCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX1BPUlRfQ09ORklHIDB4MTAgLyogUEhZIFNwZWNpZmljIFBvcnQgQ29uZmlnIFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX1BPUlRfU1RBVFVTIDB4MTEgLyogUEhZIFNwZWNpZmljIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9QT1JUX0NUUkwgICAweDEyIC8qIFBIWSBTcGVjaWZpYyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0xJTktfSEVBTFRIIDB4MTMgLyogUEhZIExpbmsgSGVhbHRoIFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfR01JSV9GSUZPICAgICAgIDB4MTQgLyogR01JSSBGSUZPIFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfUVVBTElUWSAweDE1IC8qIFBIWSBDaGFubmVsIFF1YWxpdHkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfUEFHRV9TRUxFQ1QgICAgIDB4MUYgLyogUEhZIFBhZ2UgU2VsZWN0IENvcmUgUmVnaXN0ZXIgKi8KKworLyogSUdQMDFFMTAwMCBBR0MgUmVnaXN0ZXJzIC0gc3RvcmVzIHRoZSBjYWJsZSBsZW5ndGggdmFsdWVzKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQUdDX0EgICAgICAgIDB4MTE3MgorI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9BR0NfQiAgICAgICAgMHgxMjcyCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0FHQ19DICAgICAgICAweDE0NzIKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQUdDX0QgICAgICAgIDB4MTg3MgorCisvKiBJR1AwMUUxMDAwIERTUCBSZXNldCBSZWdpc3RlciAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9EU1BfUkVTRVQgICAweDFGMzMKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfRFNQX1NFVCAgICAgMHgxRjcxCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0RTUF9GRkUgICAgIDB4MUYzNQorCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0NIQU5ORUxfTlVNICAgIDQKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQUdDX1BBUkFNX0EgICAgMHgxMTcxCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0FHQ19QQVJBTV9CICAgIDB4MTI3MQorI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9BR0NfUEFSQU1fQyAgICAweDE0NzEKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfQUdDX1BBUkFNX0QgICAgMHgxODcxCisKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfRURBQ19NVV9JTkRFWCAgICAgICAgMHhDMDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0VEQUNfU0lHTl9FWFRfOV9CSVRTIDB4ODAwMAorCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0FOQUxPR19UWF9TVEFURSAgICAgIDB4Mjg5MAorI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9BTkFMT0dfQ0xBU1NfQSAgICAgICAweDIwMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfRk9SQ0VfQU5BTE9HX0VOQUJMRSAgMHgwMDA0CisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0RTUF9GRkVfQ01fQ1AgICAgICAgIDB4MDA2OQorCisjZGVmaW5lIElHUDAxRTEwMDBfUEhZX0RTUF9GRkVfREVGQVVMVCAgICAgIDB4MDAyQQorLyogSUdQMDFFMTAwMCBQQ1MgSW5pdGlhbGl6YXRpb24gcmVnaXN0ZXIgLSBzdG9yZXMgdGhlIHBvbGFyaXR5IHN0YXR1cyB3aGVuCisgKiBzcGVlZCA9IDEwMDAgTWJwcy4gKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfUENTX0lOSVRfUkVHICAweDAwQjQKKyNkZWZpbmUgSUdQMDFFMTAwMF9QSFlfUENTX0NUUkxfUkVHICAweDAwQjUKKworI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19SRUdTX1BBR0UgIDB4MjBDMAorCisKKy8qIFBIWSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9DUl9TUEVFRF9TRUxFQ1RfTVNCIDB4MDA0MCAgLyogYml0cyA2LDEzOiAxMD0xMDAwLCAwMT0xMDAsIDAwPTEwICovCisjZGVmaW5lIE1JSV9DUl9DT0xMX1RFU1RfRU5BQkxFIDB4MDA4MCAgLyogQ29sbGlzaW9uIHRlc3QgZW5hYmxlICovCisjZGVmaW5lIE1JSV9DUl9GVUxMX0RVUExFWCAgICAgIDB4MDEwMCAgLyogRkRYID0xLCBoYWxmIGR1cGxleCA9MCAqLworI2RlZmluZSBNSUlfQ1JfUkVTVEFSVF9BVVRPX05FRyAweDAyMDAgIC8qIFJlc3RhcnQgYXV0byBuZWdvdGlhdGlvbiAqLworI2RlZmluZSBNSUlfQ1JfSVNPTEFURSAgICAgICAgICAweDA0MDAgIC8qIElzb2xhdGUgUEhZIGZyb20gTUlJICovCisjZGVmaW5lIE1JSV9DUl9QT1dFUl9ET1dOICAgICAgIDB4MDgwMCAgLyogUG93ZXIgZG93biAqLworI2RlZmluZSBNSUlfQ1JfQVVUT19ORUdfRU4gICAgICAweDEwMDAgIC8qIEF1dG8gTmVnIEVuYWJsZSAqLworI2RlZmluZSBNSUlfQ1JfU1BFRURfU0VMRUNUX0xTQiAweDIwMDAgIC8qIGJpdHMgNiwxMzogMTA9MTAwMCwgMDE9MTAwLCAwMD0xMCAqLworI2RlZmluZSBNSUlfQ1JfTE9PUEJBQ0sgICAgICAgICAweDQwMDAgIC8qIDAgPSBub3JtYWwsIDEgPSBsb29wYmFjayAqLworI2RlZmluZSBNSUlfQ1JfUkVTRVQgICAgICAgICAgICAweDgwMDAgIC8qIDAgPSBub3JtYWwsIDEgPSBQSFkgcmVzZXQgKi8KKworLyogUEhZIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfU1JfRVhURU5ERURfQ0FQUyAgICAgMHgwMDAxIC8qIEV4dGVuZGVkIHJlZ2lzdGVyIGNhcGFiaWxpdGllcyAqLworI2RlZmluZSBNSUlfU1JfSkFCQkVSX0RFVEVDVCAgICAgMHgwMDAyIC8qIEphYmJlciBEZXRlY3RlZCAqLworI2RlZmluZSBNSUlfU1JfTElOS19TVEFUVVMgICAgICAgMHgwMDA0IC8qIExpbmsgU3RhdHVzIDEgPSBsaW5rICovCisjZGVmaW5lIE1JSV9TUl9BVVRPTkVHX0NBUFMgICAgICAweDAwMDggLyogQXV0byBOZWcgQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfUkVNT1RFX0ZBVUxUICAgICAgMHgwMDEwIC8qIFJlbW90ZSBGYXVsdCBEZXRlY3QgKi8KKyNkZWZpbmUgTUlJX1NSX0FVVE9ORUdfQ09NUExFVEUgIDB4MDAyMCAvKiBBdXRvIE5lZyBDb21wbGV0ZSAqLworI2RlZmluZSBNSUlfU1JfUFJFQU1CTEVfU1VQUFJFU1MgMHgwMDQwIC8qIFByZWFtYmxlIG1heSBiZSBzdXBwcmVzc2VkICovCisjZGVmaW5lIE1JSV9TUl9FWFRFTkRFRF9TVEFUVVMgICAweDAxMDAgLyogRXh0LiBzdGF0dXMgaW5mbyBpbiBSZWcgMHgwRiAqLworI2RlZmluZSBNSUlfU1JfMTAwVDJfSERfQ0FQUyAgICAgMHgwMjAwIC8qIDEwMFQyIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSXzEwMFQyX0ZEX0NBUFMgICAgIDB4MDQwMCAvKiAxMDBUMiBGdWxsIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl8xMFRfSERfQ0FQUyAgICAgICAweDA4MDAgLyogMTBUICAgSGFsZiBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfMTBUX0ZEX0NBUFMgICAgICAgMHgxMDAwIC8qIDEwVCAgIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSXzEwMFhfSERfQ0FQUyAgICAgIDB4MjAwMCAvKiAxMDBYICBIYWxmIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl8xMDBYX0ZEX0NBUFMgICAgICAweDQwMDAgLyogMTAwWCAgRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfMTAwVDRfQ0FQUyAgICAgICAgMHg4MDAwIC8qIDEwMFQ0IENhcGFibGUgKi8KKworLyogQXV0b25lZyBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyICovCisjZGVmaW5lIE5XQVlfQVJfU0VMRUNUT1JfRklFTEQgMHgwMDAxICAgLyogaW5kaWNhdGVzIElFRUUgODAyLjMgQ1NNQS9DRCAqLworI2RlZmluZSBOV0FZX0FSXzEwVF9IRF9DQVBTICAgIDB4MDAyMCAgIC8qIDEwVCAgIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9BUl8xMFRfRkRfQ0FQUyAgICAweDAwNDAgICAvKiAxMFQgICBGdWxsIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfQVJfMTAwVFhfSERfQ0FQUyAgMHgwMDgwICAgLyogMTAwVFggSGFsZiBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0FSXzEwMFRYX0ZEX0NBUFMgIDB4MDEwMCAgIC8qIDEwMFRYIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9BUl8xMDBUNF9DQVBTICAgICAweDAyMDAgICAvKiAxMDBUNCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfQVJfUEFVU0UgICAgICAgICAgMHgwNDAwICAgLyogUGF1c2Ugb3BlcmF0aW9uIGRlc2lyZWQgKi8KKyNkZWZpbmUgTldBWV9BUl9BU01fRElSICAgICAgICAweDA4MDAgICAvKiBBc3ltbWV0cmljIFBhdXNlIERpcmVjdGlvbiBiaXQgKi8KKyNkZWZpbmUgTldBWV9BUl9SRU1PVEVfRkFVTFQgICAweDIwMDAgICAvKiBSZW1vdGUgRmF1bHQgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgTldBWV9BUl9ORVhUX1BBR0UgICAgICAweDgwMDAgICAvKiBOZXh0IFBhZ2UgYWJpbGl0eSBzdXBwb3J0ZWQgKi8KKworLyogTGluayBQYXJ0bmVyIEFiaWxpdHkgUmVnaXN0ZXIgKEJhc2UgUGFnZSkgKi8KKyNkZWZpbmUgTldBWV9MUEFSX1NFTEVDVE9SX0ZJRUxEIDB4MDAwMCAvKiBMUCBwcm90b2NvbCBzZWxlY3RvciBmaWVsZCAqLworI2RlZmluZSBOV0FZX0xQQVJfMTBUX0hEX0NBUFMgICAgMHgwMDIwIC8qIExQIGlzIDEwVCAgIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9MUEFSXzEwVF9GRF9DQVBTICAgIDB4MDA0MCAvKiBMUCBpcyAxMFQgICBGdWxsIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfTFBBUl8xMDBUWF9IRF9DQVBTICAweDAwODAgLyogTFAgaXMgMTAwVFggSGFsZiBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0xQQVJfMTAwVFhfRkRfQ0FQUyAgMHgwMTAwIC8qIExQIGlzIDEwMFRYIEZ1bGwgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9MUEFSXzEwMFQ0X0NBUFMgICAgIDB4MDIwMCAvKiBMUCBpcyAxMDBUNCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfTFBBUl9QQVVTRSAgICAgICAgICAweDA0MDAgLyogTFAgUGF1c2Ugb3BlcmF0aW9uIGRlc2lyZWQgKi8KKyNkZWZpbmUgTldBWV9MUEFSX0FTTV9ESVIgICAgICAgIDB4MDgwMCAvKiBMUCBBc3ltbWV0cmljIFBhdXNlIERpcmVjdGlvbiBiaXQgKi8KKyNkZWZpbmUgTldBWV9MUEFSX1JFTU9URV9GQVVMVCAgIDB4MjAwMCAvKiBMUCBoYXMgZGV0ZWN0ZWQgUmVtb3RlIEZhdWx0ICovCisjZGVmaW5lIE5XQVlfTFBBUl9BQ0tOT1dMRURHRSAgICAweDQwMDAgLyogTFAgaGFzIHJ4J2QgbGluayBjb2RlIHdvcmQgKi8KKyNkZWZpbmUgTldBWV9MUEFSX05FWFRfUEFHRSAgICAgIDB4ODAwMCAvKiBOZXh0IFBhZ2UgYWJpbGl0eSBzdXBwb3J0ZWQgKi8KKworLyogQXV0b25lZyBFeHBhbnNpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTldBWV9FUl9MUF9OV0FZX0NBUFMgICAgICAweDAwMDEgLyogTFAgaGFzIEF1dG8gTmVnIENhcGFiaWxpdHkgKi8KKyNkZWZpbmUgTldBWV9FUl9QQUdFX1JYRCAgICAgICAgICAweDAwMDIgLyogTFAgaXMgMTBUICAgSGFsZiBEdXBsZXggQ2FwYWJsZSAqLworI2RlZmluZSBOV0FZX0VSX05FWFRfUEFHRV9DQVBTICAgIDB4MDAwNCAvKiBMUCBpcyAxMFQgICBGdWxsIER1cGxleCBDYXBhYmxlICovCisjZGVmaW5lIE5XQVlfRVJfTFBfTkVYVF9QQUdFX0NBUFMgMHgwMDA4IC8qIExQIGlzIDEwMFRYIEhhbGYgRHVwbGV4IENhcGFibGUgKi8KKyNkZWZpbmUgTldBWV9FUl9QQVJfREVURUNUX0ZBVUxUICAweDAwMTAgLyogTFAgaXMgMTAwVFggRnVsbCBEdXBsZXggQ2FwYWJsZSAqLworCisvKiBOZXh0IFBhZ2UgVFggUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTlBUWF9NU0dfQ09ERV9GSUVMRCAweDAwMDEgLyogTlAgbXNnIGNvZGUgb3IgdW5mb3JtYXR0ZWQgZGF0YSAqLworI2RlZmluZSBOUFRYX1RPR0dMRSAgICAgICAgIDB4MDgwMCAvKiBUb2dnbGVzIGJldHdlZW4gZXhjaGFuZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9mIGRpZmZlcmVudCBOUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTlBUWF9BQ0tOT1dMREdFMiAgICAweDEwMDAgLyogMSA9IHdpbGwgY29tcGx5IHdpdGggbXNnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDAgPSBjYW5ub3QgY29tcGx5IHdpdGggbXNnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBOUFRYX01TR19QQUdFICAgICAgIDB4MjAwMCAvKiBmb3JtYXR0ZWQoMSkvdW5mb3JtYXR0ZWQoMCkgcGcgKi8KKyNkZWZpbmUgTlBUWF9ORVhUX1BBR0UgICAgICAweDgwMDAgLyogMSA9IGFkZGl0aW9uIE5QIHdpbGwgZm9sbG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDAgPSBzZW5kaW5nIGxhc3QgTlAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIExpbmsgUGFydG5lciBOZXh0IFBhZ2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTFBfUk5QUl9NU0dfQ09ERV9GSUVMRCAweDAwMDEgLyogTlAgbXNnIGNvZGUgb3IgdW5mb3JtYXR0ZWQgZGF0YSAqLworI2RlZmluZSBMUF9STlBSX1RPR0dMRSAgICAgICAgIDB4MDgwMCAvKiBUb2dnbGVzIGJldHdlZW4gZXhjaGFuZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9mIGRpZmZlcmVudCBOUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFBfUk5QUl9BQ0tOT1dMREdFMiAgICAweDEwMDAgLyogMSA9IHdpbGwgY29tcGx5IHdpdGggbXNnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDAgPSBjYW5ub3QgY29tcGx5IHdpdGggbXNnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMUF9STlBSX01TR19QQUdFICAgICAgIDB4MjAwMCAgLyogZm9ybWF0dGVkKDEpL3VuZm9ybWF0dGVkKDApIHBnICovCisjZGVmaW5lIExQX1JOUFJfQUNLTk9XTERHRSAgICAgMHg0MDAwICAvKiAxID0gQUNLIC8gMCA9IE5PIEFDSyAqLworI2RlZmluZSBMUF9STlBSX05FWFRfUEFHRSAgICAgIDB4ODAwMCAgLyogMSA9IGFkZGl0aW9uIE5QIHdpbGwgZm9sbG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwID0gc2VuZGluZyBsYXN0IE5QCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogMTAwMEJBU0UtVCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIENSXzEwMDBUX0FTWU1fUEFVU0UgICAgICAweDAwODAgLyogQWR2ZXJ0aXNlIGFzeW1tZXRyaWMgcGF1c2UgYml0ICovCisjZGVmaW5lIENSXzEwMDBUX0hEX0NBUFMgICAgICAgICAweDAxMDAgLyogQWR2ZXJ0aXNlIDEwMDBUIEhEIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUgQ1JfMTAwMFRfRkRfQ0FQUyAgICAgICAgIDB4MDIwMCAvKiBBZHZlcnRpc2UgMTAwMFQgRkQgY2FwYWJpbGl0eSAgKi8KKyNkZWZpbmUgQ1JfMTAwMFRfUkVQRUFURVJfRFRFICAgIDB4MDQwMCAvKiAxPVJlcGVhdGVyL3N3aXRjaCBkZXZpY2UgcG9ydCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA9RFRFIGRldmljZSAqLworI2RlZmluZSBDUl8xMDAwVF9NU19WQUxVRSAgICAgICAgMHgwODAwIC8qIDE9Q29uZmlndXJlIFBIWSBhcyBNYXN0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwPUNvbmZpZ3VyZSBQSFkgYXMgU2xhdmUgKi8KKyNkZWZpbmUgQ1JfMTAwMFRfTVNfRU5BQkxFICAgICAgIDB4MTAwMCAvKiAxPU1hc3Rlci9TbGF2ZSBtYW51YWwgY29uZmlnIHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMD1BdXRvbWF0aWMgTWFzdGVyL1NsYXZlIGNvbmZpZyAqLworI2RlZmluZSBDUl8xMDAwVF9URVNUX01PREVfTk9STUFMIDB4MDAwMCAvKiBOb3JtYWwgT3BlcmF0aW9uICovCisjZGVmaW5lIENSXzEwMDBUX1RFU1RfTU9ERV8xICAgICAweDIwMDAgLyogVHJhbnNtaXQgV2F2ZWZvcm0gdGVzdCAqLworI2RlZmluZSBDUl8xMDAwVF9URVNUX01PREVfMiAgICAgMHg0MDAwIC8qIE1hc3RlciBUcmFuc21pdCBKaXR0ZXIgdGVzdCAqLworI2RlZmluZSBDUl8xMDAwVF9URVNUX01PREVfMyAgICAgMHg2MDAwIC8qIFNsYXZlIFRyYW5zbWl0IEppdHRlciB0ZXN0ICovCisjZGVmaW5lIENSXzEwMDBUX1RFU1RfTU9ERV80ICAgICAweDgwMDAgLyogVHJhbnNtaXR0ZXIgRGlzdG9ydGlvbiB0ZXN0ICovCisKKy8qIDEwMDBCQVNFLVQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFNSXzEwMDBUX0lETEVfRVJST1JfQ05UICAgMHgwMEZGIC8qIE51bSBpZGxlIGVycm9ycyBzaW5jZSBsYXN0IHJlYWQgKi8KKyNkZWZpbmUgU1JfMTAwMFRfQVNZTV9QQVVTRV9ESVIgICAweDAxMDAgLyogTFAgYXN5bW1ldHJpYyBwYXVzZSBkaXJlY3Rpb24gYml0ICovCisjZGVmaW5lIFNSXzEwMDBUX0xQX0hEX0NBUFMgICAgICAgMHgwNDAwIC8qIExQIGlzIDEwMDBUIEhEIGNhcGFibGUgKi8KKyNkZWZpbmUgU1JfMTAwMFRfTFBfRkRfQ0FQUyAgICAgICAweDA4MDAgLyogTFAgaXMgMTAwMFQgRkQgY2FwYWJsZSAqLworI2RlZmluZSBTUl8xMDAwVF9SRU1PVEVfUlhfU1RBVFVTIDB4MTAwMCAvKiBSZW1vdGUgcmVjZWl2ZXIgT0sgKi8KKyNkZWZpbmUgU1JfMTAwMFRfTE9DQUxfUlhfU1RBVFVTICAweDIwMDAgLyogTG9jYWwgcmVjZWl2ZXIgT0sgKi8KKyNkZWZpbmUgU1JfMTAwMFRfTVNfQ09ORklHX1JFUyAgICAweDQwMDAgLyogMT1Mb2NhbCBUWCBpcyBNYXN0ZXIsIDA9U2xhdmUgKi8KKyNkZWZpbmUgU1JfMTAwMFRfTVNfQ09ORklHX0ZBVUxUICAweDgwMDAgLyogTWFzdGVyL1NsYXZlIGNvbmZpZyBmYXVsdCAqLworI2RlZmluZSBTUl8xMDAwVF9SRU1PVEVfUlhfU1RBVFVTX1NISUZUICAgICAgICAgIDEyCisjZGVmaW5lIFNSXzEwMDBUX0xPQ0FMX1JYX1NUQVRVU19TSElGVCAgICAgICAgICAgMTMKKyNkZWZpbmUgU1JfMTAwMFRfUEhZX0VYQ0VTU0lWRV9JRExFX0VSUl9DT1VOVCAgICA1CisjZGVmaW5lIEZGRV9JRExFX0VSUl9DT1VOVF9USU1FT1VUXzIwICAgICAgICAgICAgMjAKKyNkZWZpbmUgRkZFX0lETEVfRVJSX0NPVU5UX1RJTUVPVVRfMTAwICAgICAgICAgICAxMDAKKworLyogRXh0ZW5kZWQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIElFRUVfRVNSXzEwMDBUX0hEX0NBUFMgMHgxMDAwIC8qIDEwMDBUIEhEIGNhcGFibGUgKi8KKyNkZWZpbmUgSUVFRV9FU1JfMTAwMFRfRkRfQ0FQUyAweDIwMDAgLyogMTAwMFQgRkQgY2FwYWJsZSAqLworI2RlZmluZSBJRUVFX0VTUl8xMDAwWF9IRF9DQVBTIDB4NDAwMCAvKiAxMDAwWCBIRCBjYXBhYmxlICovCisjZGVmaW5lIElFRUVfRVNSXzEwMDBYX0ZEX0NBUFMgMHg4MDAwIC8qIDEwMDBYIEZEIGNhcGFibGUgKi8KKworI2RlZmluZSBQSFlfVFhfUE9MQVJJVFlfTUFTSyAgIDB4MDEwMCAvKiByZWdpc3RlciAxMGggYml0IDggKHBvbGFyaXR5IGJpdCkgKi8KKyNkZWZpbmUgUEhZX1RYX05PUk1BTF9QT0xBUklUWSAwICAgICAgLyogcmVnaXN0ZXIgMTBoIGJpdCA4IChub3JtYWwgcG9sYXJpdHkpICovCisKKyNkZWZpbmUgQVVUT19QT0xBUklUWV9ESVNBQkxFICAweDAwMTAgLyogcmVnaXN0ZXIgMTFoIGJpdCA0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICgwPWVuYWJsZSwgMT1kaXNhYmxlKSAqLworCisvKiBNODhFMTAwMCBQSFkgU3BlY2lmaWMgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX0pBQkJFUl9ESVNBQkxFICAgIDB4MDAwMSAvKiAxPUphYmJlciBGdW5jdGlvbiBkaXNhYmxlZCAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX1BPTEFSSVRZX1JFVkVSU0FMIDB4MDAwMiAvKiAxPVBvbGFyaXR5IFJldmVyc2FsIGVuYWJsZWQgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9TUUVfVEVTVCAgICAgICAgICAweDAwMDQgLyogMT1TUUUgVGVzdCBlbmFibGVkICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfQ0xLMTI1X0RJU0FCTEUgICAgMHgwMDEwIC8qIDE9Q0xLMTI1IGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMD1DTEsxMjUgdG9nZ2xpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfTURJX01BTlVBTF9NT0RFICAweDAwMDAgIC8qIE1ESSBDcm9zc292ZXIgTW9kZSBiaXRzIDY6NSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYW51YWwgTURJIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9NRElYX01BTlVBTF9NT0RFIDB4MDAyMCAgLyogTWFudWFsIE1ESVggY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBNODhFMTAwMF9QU0NSX0FVVE9fWF8xMDAwVCAgICAgMHgwMDQwICAvKiAxMDAwQkFTRS1UOiBBdXRvIGNyb3Nzb3ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIDEwMEJBU0UtVFgvMTBCQVNFLVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBNREkgTW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9BVVRPX1hfTU9ERSAgICAgIDB4MDA2MCAgLyogQXV0byBjcm9zc292ZXIgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbGwgc3BlZWRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl8xMEJUX0VYVF9ESVNUX0VOQUJMRSAweDAwODAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxPUVuYWJsZSBFeHRlbmRlZCAxMEJBU0UtVCBkaXN0YW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChMb3dlciAxMEJBU0UtVCBSWCBUaHJlc2hvbGQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMD1Ob3JtYWwgMTBCQVNFLVQgUlggVGhyZXNob2xkICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfTUlJXzVCSVRfRU5BQkxFICAgICAgMHgwMTAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMT01LUJpdCBpbnRlcmZhY2UgaW4gMTAwQkFTRS1UWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDA9TUlJIGludGVyZmFjZSBpbiAxMDBCQVNFLVRYICovCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfU0NSQU1CTEVSX0RJU0FCTEUgICAgMHgwMjAwIC8qIDE9U2NyYW1ibGVyIGRpc2FibGUgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9GT1JDRV9MSU5LX0dPT0QgICAgICAweDA0MDAgLyogMT1Gb3JjZSBsaW5rIGdvb2QgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9BU1NFUlRfQ1JTX09OX1RYICAgICAweDA4MDAgLyogMT1Bc3NlcnQgQ1JTIG9uIFRyYW5zbWl0ICovCisKKyNkZWZpbmUgTTg4RTEwMDBfUFNDUl9QT0xBUklUWV9SRVZFUlNBTF9TSElGVCAgICAxCisjZGVmaW5lIE04OEUxMDAwX1BTQ1JfQVVUT19YX01PREVfU0hJRlQgICAgICAgICAgNQorI2RlZmluZSBNODhFMTAwMF9QU0NSXzEwQlRfRVhUX0RJU1RfRU5BQkxFX1NISUZUIDcKKworLyogTTg4RTEwMDAgUEhZIFNwZWNpZmljIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSX0pBQkJFUiAgICAgICAgICAgICAweDAwMDEgLyogMT1KYWJiZXIgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9SRVZfUE9MQVJJVFkgICAgICAgMHgwMDAyIC8qIDE9UG9sYXJpdHkgcmV2ZXJzZWQgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9ET1dOU0hJRlQgICAgICAgICAgMHgwMDIwIC8qIDE9RG93bnNoaWZ0ZWQgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9NRElYICAgICAgICAgICAgICAgMHgwMDQwIC8qIDE9TURJWDsgMD1NREkgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9DQUJMRV9MRU5HVEggICAgICAgMHgwMzgwIC8qIDA9PDUwTTsxPTUwLTgwTTsyPTgwLTExME07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMz0xMTAtMTQwTTs0PT4xNDBNICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfTElOSyAgICAgICAgICAgICAgIDB4MDQwMCAvKiAxPUxpbmsgdXAsIDA9TGluayBkb3duICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfU1BEX0RQTFhfUkVTT0xWRUQgIDB4MDgwMCAvKiAxPVNwZWVkICYgRHVwbGV4IHJlc29sdmVkICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfUEFHRV9SQ1ZEICAgICAgICAgIDB4MTAwMCAvKiAxPVBhZ2UgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9EUExYICAgICAgICAgICAgICAgMHgyMDAwIC8qIDE9RHVwbGV4IDA9SGFsZiBEdXBsZXggKi8KKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9TUEVFRCAgICAgICAgICAgICAgMHhDMDAwIC8qIFNwZWVkLCBiaXRzIDE0OjE1ICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfMTBNQlMgICAgICAgICAgICAgIDB4MDAwMCAvKiAwMD0xME1icyAqLworI2RlZmluZSBNODhFMTAwMF9QU1NSXzEwME1CUyAgICAgICAgICAgICAweDQwMDAgLyogMDE9MTAwTWJzICovCisjZGVmaW5lIE04OEUxMDAwX1BTU1JfMTAwME1CUyAgICAgICAgICAgIDB4ODAwMCAvKiAxMD0xMDAwTWJzICovCisKKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9SRVZfUE9MQVJJVFlfU0hJRlQgMQorI2RlZmluZSBNODhFMTAwMF9QU1NSX0RPV05TSElGVF9TSElGVCAgICA1CisjZGVmaW5lIE04OEUxMDAwX1BTU1JfTURJWF9TSElGVCAgICAgICAgIDYKKyNkZWZpbmUgTTg4RTEwMDBfUFNTUl9DQUJMRV9MRU5HVEhfU0hJRlQgNworCisvKiBNODhFMTAwMCBFeHRlbmRlZCBQSFkgU3BlY2lmaWMgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBNODhFMTAwMF9FUFNDUl9GSUJFUl9MT09QQkFDSyAweDQwMDAgLyogMT1GaWJlciBsb29wYmFjayAqLworI2RlZmluZSBNODhFMTAwMF9FUFNDUl9ET1dOX05PX0lETEUgICAweDgwMDAgLyogMT1Mb3N0IGxvY2sgZGV0ZWN0IGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBXaWxsIGFzc2VydCBsb3N0IGxvY2sgYW5kIGJyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBsaW5rIGRvd24gaWYgaWRsZSBub3Qgc2VlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd2l0aGluIDFtcyBpbiAxMDAwQkFTRS1UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE51bWJlciBvZiB0aW1lcyB3ZSB3aWxsIGF0dGVtcHQgdG8gYXV0b25lZ290aWF0ZSBiZWZvcmUgZG93bnNoaWZ0aW5nIGlmIHdlCisgKiBhcmUgdGhlIG1hc3RlciAqLworI2RlZmluZSBNODhFMTAwMF9FUFNDUl9NQVNURVJfRE9XTlNISUZUX01BU0sgMHgwQzAwCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX01BU1RFUl9ET1dOU0hJRlRfMVggICAweDAwMDAKKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfTUFTVEVSX0RPV05TSElGVF8yWCAgIDB4MDQwMAorI2RlZmluZSBNODhFMTAwMF9FUFNDUl9NQVNURVJfRE9XTlNISUZUXzNYICAgMHgwODAwCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX01BU1RFUl9ET1dOU0hJRlRfNFggICAweDBDMDAKKy8qIE51bWJlciBvZiB0aW1lcyB3ZSB3aWxsIGF0dGVtcHQgdG8gYXV0b25lZ290aWF0ZSBiZWZvcmUgZG93bnNoaWZ0aW5nIGlmIHdlCisgKiBhcmUgdGhlIHNsYXZlICovCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX1NMQVZFX0RPV05TSElGVF9NQVNLICAweDAzMDAKKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfU0xBVkVfRE9XTlNISUZUX0RJUyAgIDB4MDAwMAorI2RlZmluZSBNODhFMTAwMF9FUFNDUl9TTEFWRV9ET1dOU0hJRlRfMVggICAgMHgwMTAwCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX1NMQVZFX0RPV05TSElGVF8yWCAgICAweDAyMDAKKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfU0xBVkVfRE9XTlNISUZUXzNYICAgIDB4MDMwMAorI2RlZmluZSBNODhFMTAwMF9FUFNDUl9UWF9DTEtfMl81ICAgICAweDAwNjAgLyogMi41IE1IeiBUWF9DTEsgKi8KKyNkZWZpbmUgTTg4RTEwMDBfRVBTQ1JfVFhfQ0xLXzI1ICAgICAgMHgwMDcwIC8qIDI1ICBNSHogVFhfQ0xLICovCisjZGVmaW5lIE04OEUxMDAwX0VQU0NSX1RYX0NMS18wICAgICAgIDB4MDAwMCAvKiBOTyAgVFhfQ0xLICovCisKKy8qIElHUDAxRTEwMDAgU3BlY2lmaWMgUG9ydCBDb25maWcgUmVnaXN0ZXIgLSBSL1cgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QU0NGUl9BVVRPX01ESVhfUEFSX0RFVEVDVCAgMHgwMDEwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNDRlJfUFJFX0VOICAgICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBJR1AwMUUxMDAwX1BTQ0ZSX1NNQVJUX1NQRUVEICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU0NGUl9ESVNBQkxFX1RQTE9PUEJBQ0sgICAgMHgwMTAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNDRlJfRElTQUJMRV9KQUJCRVIgICAgICAgIDB4MDQwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BTQ0ZSX0RJU0FCTEVfVFJBTlNNSVQgICAgICAweDIwMDAKKworLyogSUdQMDFFMTAwMCBTcGVjaWZpYyBQb3J0IFN0YXR1cyBSZWdpc3RlciAtIFIvTyAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfQVVUT05FR19GQUlMRUQgICAgICAgICAweDAwMDEgLyogUk8gTEggU0MgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX1BPTEFSSVRZX1JFVkVSU0VEICAgICAgMHgwMDAyCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9DQUJMRV9MRU5HVEggICAgICAgICAgIDB4MDA3QworI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfRlVMTF9EVVBMRVggICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX0xJTktfVVAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9NRElYICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfU1BFRURfTUFTSyAgICAgICAgICAgICAweEMwMDAgLyogc3BlZWQgYml0cyBtYXNrICovCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9TUEVFRF8xME1CUFMgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BTU1JfU1BFRURfMTAwTUJQUyAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU1NSX1NQRUVEXzEwMDBNQlBTICAgICAgICAgMHhDMDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9DQUJMRV9MRU5HVEhfU0hJRlQgICAgIDB4MDAwMiAvKiBzaGlmdCByaWdodCAyICovCisjZGVmaW5lIElHUDAxRTEwMDBfUFNTUl9NRElYX1NISUZUICAgICAgICAgICAgIDB4MDAwQiAvKiBzaGlmdCByaWdodCAxMSAqLworCisvKiBJR1AwMUUxMDAwIFNwZWNpZmljIFBvcnQgQ29udHJvbCBSZWdpc3RlciAtIFIvVyAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BTQ1JfVFBfTE9PUEJBQ0sgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU0NSX0NPUlJFQ1RfTkNfU0NNQkxSICAgICAgMHgwMjAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNDUl9URU5fQ1JTX1NFTEVDVCAgICAgICAgIDB4MDQwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BTQ1JfRkxJUF9DSElQICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QU0NSX0FVVE9fTURJWCAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUFNDUl9GT1JDRV9NRElfTURJWCAgICAgICAgIDB4MjAwMCAvKiAwLU1ESSwgMS1NRElYICovCisKKy8qIElHUDAxRTEwMDAgU3BlY2lmaWMgUG9ydCBMaW5rIEhlYWx0aCBSZWdpc3RlciAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfU1NfRE9XTkdSQURFICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX0dJR19TQ1JBTUJMRVJfRVJST1IgICAgMHg0MDAwCisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9NQVNURVJfRkFVTFQgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfTUFTVEVSX1JFU09MVVRJT04gICAgICAweDEwMDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX0dJR19SRU1fUkNWUl9OT0sgICAgICAgMHgwODAwIC8qIExIICovCisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9JRExFX0VSUk9SX0NOVF9PRkxPVyAgIDB4MDQwMCAvKiBMSCAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfREFUQV9FUlJfMSAgICAgICAgICAgICAweDAyMDAgLyogTEggKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX0RBVEFfRVJSXzAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9BVVRPTkVHX0ZBVUxUICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfQVVUT05FR19BQ1RJVkUgICAgICAgICAweDAwMTAKKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX1ZBTElEX0NIQU5ORUxfRCAgICAgICAgMHgwMDA4CisjZGVmaW5lIElHUDAxRTEwMDBfUExIUl9WQUxJRF9DSEFOTkVMX0MgICAgICAgIDB4MDAwNAorI2RlZmluZSBJR1AwMUUxMDAwX1BMSFJfVkFMSURfQ0hBTk5FTF9CICAgICAgICAweDAwMDIKKyNkZWZpbmUgSUdQMDFFMTAwMF9QTEhSX1ZBTElEX0NIQU5ORUxfQSAgICAgICAgMHgwMDAxCisKKy8qIElHUDAxRTEwMDAgQ2hhbm5lbCBRdWFsaXR5IFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfTVNFX0NIQU5ORUxfRCAgICAgICAgMHgwMDBGCisjZGVmaW5lIElHUDAxRTEwMDBfTVNFX0NIQU5ORUxfQyAgICAgICAgMHgwMEYwCisjZGVmaW5lIElHUDAxRTEwMDBfTVNFX0NIQU5ORUxfQiAgICAgICAgMHgwRjAwCisjZGVmaW5lIElHUDAxRTEwMDBfTVNFX0NIQU5ORUxfQSAgICAgICAgMHhGMDAwCisKKy8qIElHUDAxRTEwMDAgRFNQIHJlc2V0IG1hY3JvcyAqLworI2RlZmluZSBEU1BfUkVTRVRfRU5BQkxFICAgICAweDAKKyNkZWZpbmUgRFNQX1JFU0VUX0RJU0FCTEUgICAgMHgyCisjZGVmaW5lIEUxMDAwX01BWF9EU1BfUkVTRVRTIDEwCisKKy8qIElHUDAxRTEwMDAgQUdDIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIElHUDAxRTEwMDBfQUdDX0xFTkdUSF9TSElGVCA3ICAgICAgICAgLyogQ29hcnNlIC0gMTM6MTEsIEZpbmUgLSAxMDo3ICovCisKKy8qIDcgYml0cyAoMyBDb2Fyc2UgKyA0IEZpbmUpIC0tPiAxMjggb3B0aW9uYWwgdmFsdWVzICovCisjZGVmaW5lIElHUDAxRTEwMDBfQUdDX0xFTkdUSF9UQUJMRV9TSVpFIDEyOAorCisvKiBUaGUgcHJlY2lzaW9uIG9mIHRoZSBsZW5ndGggaXMgKy8tIDEwIG1ldGVycyAqLworI2RlZmluZSBJR1AwMUUxMDAwX0FHQ19SQU5HRSAgICAxMAorCisvKiBJR1AwMUUxMDAwIFBDUyBJbml0aWFsaXphdGlvbiByZWdpc3RlciAqLworLyogYml0cyAzOjYgaW4gdGhlIFBDUyByZWdpc3RlcnMgc3RvcmVzIHRoZSBjaGFubmVscyBwb2xhcml0eSAqLworI2RlZmluZSBJR1AwMUUxMDAwX1BIWV9QT0xBUklUWV9NQVNLICAgIDB4MDA3OAorCisvKiBJR1AwMUUxMDAwIEdNSUkgRklGTyBSZWdpc3RlciAqLworI2RlZmluZSBJR1AwMUUxMDAwX0dNSUlfRkxFWF9TUEQgICAgICAgICAgICAgICAweDEwIC8qIEVuYWJsZSBmbGV4aWJsZSBzcGVlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9uIExpbmstVXAgKi8KKyNkZWZpbmUgSUdQMDFFMTAwMF9HTUlJX1NQRCAgICAgICAgICAgICAgICAgICAgMHgyMCAvKiBFbmFibGUgU1BEICovCisKKy8qIElHUDAxRTEwMDAgQW5hbG9nIFJlZ2lzdGVyICovCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX1NQQVJFX0ZVU0VfU1RBVFVTICAgICAgIDB4MjBEMQorI2RlZmluZSBJR1AwMUUxMDAwX0FOQUxPR19GVVNFX1NUQVRVUyAgICAgICAgICAgICAweDIwRDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9DT05UUk9MICAgICAgICAgICAgMHgyMERDCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQllQQVNTICAgICAgICAgICAgIDB4MjBERQorCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfUE9MWV9NQVNLICAgICAgICAgICAgMHhGMDAwCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfRklORV9NQVNLICAgICAgICAgICAgMHgwRjgwCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfQ09BUlNFX01BU0sgICAgICAgICAgMHgwMDcwCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX1NQQVJFX0ZVU0VfRU5BQkxFRCAgICAgICAgMHgwMTAwCisjZGVmaW5lIElHUDAxRTEwMDBfQU5BTE9HX0ZVU0VfRU5BQkxFX1NXX0NPTlRST0wgICAgMHgwMDAyCisKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9DT0FSU0VfVEhSRVNIICAgICAgICAweDAwNDAKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9DT0FSU0VfMTAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9GSU5FXzEgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgSUdQMDFFMTAwMF9BTkFMT0dfRlVTRV9GSU5FXzEwICAgICAgICAgICAgICAweDA1MDAKKworCisvKiBCaXQgZGVmaW5pdGlvbnMgZm9yIHZhbGlkIFBIWSBJRHMuICovCisvKiBJID0gSW50ZWdyYXRlZAorICogRSA9IEV4dGVybmFsCisgKi8KKyNkZWZpbmUgTTg4RTEwMDBfRV9QSFlfSUQgIDB4MDE0MTBDNTAKKyNkZWZpbmUgTTg4RTEwMDBfSV9QSFlfSUQgIDB4MDE0MTBDMzAKKyNkZWZpbmUgTTg4RTEwMTFfSV9QSFlfSUQgIDB4MDE0MTBDMjAKKyNkZWZpbmUgSUdQMDFFMTAwMF9JX1BIWV9JRCAgMHgwMkE4MDM4MAorI2RlZmluZSBNODhFMTAwMF8xMl9QSFlfSUQgTTg4RTEwMDBfRV9QSFlfSUQKKyNkZWZpbmUgTTg4RTEwMDBfMTRfUEhZX0lEIE04OEUxMDAwX0VfUEhZX0lECisjZGVmaW5lIE04OEUxMDExX0lfUkVWXzQgICAweDA0CisKKy8qIE1pc2NlbGxhbmVvdXMgUEhZIGJpdCBkZWZpbml0aW9ucy4gKi8KKyNkZWZpbmUgUEhZX1BSRUFNQkxFICAgICAgICAweEZGRkZGRkZGCisjZGVmaW5lIFBIWV9TT0YgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBQSFlfT1BfUkVBRCAgICAgICAgIDB4MDIKKyNkZWZpbmUgUEhZX09QX1dSSVRFICAgICAgICAweDAxCisjZGVmaW5lIFBIWV9UVVJOQVJPVU5EICAgICAgMHgwMgorI2RlZmluZSBQSFlfUFJFQU1CTEVfU0laRSAgIDMyCisjZGVmaW5lIE1JSV9DUl9TUEVFRF8xMDAwICAgMHgwMDQwCisjZGVmaW5lIE1JSV9DUl9TUEVFRF8xMDAgICAgMHgyMDAwCisjZGVmaW5lIE1JSV9DUl9TUEVFRF8xMCAgICAgMHgwMDAwCisjZGVmaW5lIEUxMDAwX1BIWV9BRERSRVNTICAgMHgwMQorI2RlZmluZSBQSFlfQVVUT19ORUdfVElNRSAgIDQ1ICAvKiA0LjUgU2Vjb25kcyAqLworI2RlZmluZSBQSFlfRk9SQ0VfVElNRSAgICAgIDIwICAvKiAyLjAgU2Vjb25kcyAqLworI2RlZmluZSBQSFlfUkVWSVNJT05fTUFTSyAgIDB4RkZGRkZGRjAKKyNkZWZpbmUgREVWSUNFX1NQRUVEX01BU0sgICAweDAwMDAwMzAwICAvKiBEZXZpY2UgQ3RybCBSZWcgU3BlZWQgTWFzayAqLworI2RlZmluZSBSRUc0X1NQRUVEX01BU0sgICAgIDB4MDFFMAorI2RlZmluZSBSRUc5X1NQRUVEX01BU0sgICAgIDB4MDMwMAorI2RlZmluZSBBRFZFUlRJU0VfMTBfSEFMRiAgIDB4MDAwMQorI2RlZmluZSBBRFZFUlRJU0VfMTBfRlVMTCAgIDB4MDAwMgorI2RlZmluZSBBRFZFUlRJU0VfMTAwX0hBTEYgIDB4MDAwNAorI2RlZmluZSBBRFZFUlRJU0VfMTAwX0ZVTEwgIDB4MDAwOAorI2RlZmluZSBBRFZFUlRJU0VfMTAwMF9IQUxGIDB4MDAxMAorI2RlZmluZSBBRFZFUlRJU0VfMTAwMF9GVUxMIDB4MDAyMAorI2RlZmluZSBBVVRPTkVHX0FEVkVSVElTRV9TUEVFRF9ERUZBVUxUIDB4MDAyRiAgLyogRXZlcnl0aGluZyBidXQgMTAwMC1IYWxmICovCisjZGVmaW5lIEFVVE9ORUdfQURWRVJUSVNFXzEwXzEwMF9BTEwgICAgMHgwMDBGIC8qIEFsbCAxMC8xMDAgc3BlZWRzKi8KKyNkZWZpbmUgQVVUT05FR19BRFZFUlRJU0VfMTBfQUxMICAgICAgICAweDAwMDMgLyogMTBNYnBzIEZ1bGwgJiBIYWxmIHNwZWVkcyovCisKKyNlbmRpZiAvKiBfRTEwMDBfSFdfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjU0OWE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jCkBAIC0wLDAgKzEsMzE2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAKKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIAorICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAorICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCAKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIAorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIAorICBtb3JlIGRldGFpbHMuCisgIAorICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSAKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgIAorICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAgCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJlMTAwMC5oIgorCisvKiBDaGFuZ2UgTG9nCisgKiA1LjMuMTIJNi83LzA0CisgKiAtIGtjb21wYXQgTkVUSUZfTVNHIGZvciBvbGRlciBrZXJuZWxzICgyLjQuOSkgPHNlYW4ucC5tY2Rlcm1vdHRAaW50ZWwuY29tPgorICogLSBpZl9taWkgc3VwcG9ydCBhbmQgYXNzb2NpYXRlZCBrY29tcGF0IGZvciBvbGRlciBrZXJuZWxzCisgKiAtIE1vcmUgZXJybG9nZ2luZyBzdXBwb3J0IGZyb20gSm9uIE1hc29uIDxqb25tYXNvbkB1cy5pYm0uY29tPgorICogLSBGaXggVFNPIGlzc3VlcyBvbiBQUEM2NCBtYWNoaW5lcyAtLSBKb24gTWFzb24gPGpvbm1hc29uQHVzLmlibS5jb20+CisgKgorICogNS43LjEJMTIvMTYvMDQKKyAqIC0gUmVzdXJyZWN0IDgyNTQ3RUkvR0kgcmVsYXRlZCBmaXggaW4gZTEwMDBfaW50ciB0byBhdm9pZCBkZWFkbG9ja3MuIFRoaXMKKyAqICAgZml4IHdhcyByZW1vdmVkIGFzIGl0IGNhdXNlZCBzeXN0ZW0gaW5zdGFiaWxpdHkuIFRoZSBzdXNwZWN0ZWQgY2F1c2Ugb2YgCisgKiAgIHRoaXMgaXMgdGhlIGNhbGxlZCB0byBlMTAwMF9pcnFfZGlzYWJsZSBpbiBlMTAwMF9pbnRyLiBJbmxpbmVkIHRoZSAKKyAqICAgcmVxdWlyZWQgcGllY2Ugb2YgZTEwMDBfaXJxX2Rpc2FibGUgaW50byBlMTAwMF9pbnRyIC0gQW50b24gQmxhbmNoYXJkCisgKiA1LjcuMAkxMi8xMC8wNAorICogLSBpbmNsdWRlIGZpeCB0byB0aGUgY29uZGl0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGVuIHRvIHF1aXQgTkFQSSAtIFJvYmVydCBPbHNzb24KKyAqIC0gdXNlIG5ldGlmX3BvbGxfe2Rpc2FibGUvZW5hYmxlfSB0byBzeW5jaHJvbml6ZSBiZXR3ZWVuIE5BUEkgYW5kIGkvZiB1cC9kb3duCisgKiA1LjYuNSAJMTEvMDEvMDQKKyAqIC0gRW5hYmxpbmcgTkVUSUZfRl9TRyB3aXRob3V0IGNoZWNrc3VtIG9mZmxvYWQgaXMgaWxsZWdhbCAtIAorICAgICBKb2huIE1hc29uIDxqZG1hc29uQHVzLmlibS5jb20+CisgKiA1LjYuMyAgICAgICAgMTAvMjYvMDQKKyAqIC0gUmVtb3ZlIHJlZHVuZGFudCBpbml0aWFsaXphdGlvbiAtIEphbWFsIEhhZGkKKyAqIC0gUmVzZXQgYnVmZmVyX2luZm8tPmRtYSBpbiB0eCByZXNvdXJjZSBjbGVhbnVwIGxvZ2ljCisgKiA1LjYuMgkxMC8xMi8wNAorICogLSBBdm9pZCBmaWxsaW5nIHR4X3JpbmcgY29tcGxldGVseSAtIHNoZW1taW5nZXJAb3NkbC5vcmcKKyAqIC0gUmVwbGFjZSBzY2hlZHVsZV90aW1lb3V0KCkgd2l0aCBtc2xlZXAoKS9tc2xlZXBfaW50ZXJydXB0aWJsZSgpIC0KKyAqICAgbmFjY0B1cy5pYm0uY29tCisgKiAtIFNwYXJzZSBjbGVhbnVwIC0gc2hlbW1pbmdlckBvc2RsLm9yZworICogLSBGaXggdHggcmVzb3VyY2UgY2xlYW51cCBsb2dpYworICogLSBMTFRYIHN1cHBvcnQgLSBha0BzdXNlLmRlIGFuZCBoYWRpQGN5YmVydXMuY2EKKyAqLworCitjaGFyIGUxMDAwX2RyaXZlcl9uYW1lW10gPSAiZTEwMDAiOworY2hhciBlMTAwMF9kcml2ZXJfc3RyaW5nW10gPSAiSW50ZWwoUikgUFJPLzEwMDAgTmV0d29yayBEcml2ZXIiOworI2lmbmRlZiBDT05GSUdfRTEwMDBfTkFQSQorI2RlZmluZSBEUklWRVJOQVBJCisjZWxzZQorI2RlZmluZSBEUklWRVJOQVBJICItTkFQSSIKKyNlbmRpZgorI2RlZmluZSBEUlZfVkVSU0lPTiAiNS43LjYtazIiRFJJVkVSTkFQSQorY2hhciBlMTAwMF9kcml2ZXJfdmVyc2lvbltdID0gRFJWX1ZFUlNJT047CitjaGFyIGUxMDAwX2NvcHlyaWdodFtdID0gIkNvcHlyaWdodCAoYykgMTk5OS0yMDA0IEludGVsIENvcnBvcmF0aW9uLiI7CisKKy8qIGUxMDAwX3BjaV90YmwgLSBQQ0kgRGV2aWNlIElEIFRhYmxlCisgKgorICogTGFzdCBlbnRyeSBtdXN0IGJlIGFsbCAwcworICoKKyAqIE1hY3JvIGV4cGFuZHMgdG8uLi4KKyAqICAge1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgZGV2aWNlX2lkKX0KKyAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGUxMDAwX3BjaV90YmxbXSA9IHsKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDAwKSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDAxKSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDA0KSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDA4KSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDA5KSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDBDKSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDBEKSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDBFKSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDBGKSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDEwKSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDExKSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDEyKSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDEzKSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDE0KSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDE1KSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDE2KSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDE3KSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDE4KSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDE5KSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDFEKSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDFFKSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDI2KSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDI3KSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDI4KSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDc1KSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDc2KSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDc3KSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDc4KSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDc5KSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDdBKSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDdCKSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDdDKSwKKwlJTlRFTF9FMTAwMF9FVEhFUk5FVF9ERVZJQ0UoMHgxMDhBKSwKKwkvKiByZXF1aXJlZCBsYXN0IGVudHJ5ICovCisJezAsfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGUxMDAwX3BjaV90YmwpOworCitpbnQgZTEwMDBfdXAoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBlMTAwMF9kb3duKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgZTEwMDBfcmVzZXQoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworaW50IGUxMDAwX3NldF9zcGRfZHBseChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwgdWludDE2X3Qgc3BkZHBseCk7CitpbnQgZTEwMDBfc2V0dXBfdHhfcmVzb3VyY2VzKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKK2ludCBlMTAwMF9zZXR1cF9yeF9yZXNvdXJjZXMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBlMTAwMF9mcmVlX3R4X3Jlc291cmNlcyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7Cit2b2lkIGUxMDAwX2ZyZWVfcnhfcmVzb3VyY2VzKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgZTEwMDBfdXBkYXRlX3N0YXRzKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKKworLyogTG9jYWwgRnVuY3Rpb24gUHJvdG90eXBlcyAqLworCitzdGF0aWMgaW50IGUxMDAwX2luaXRfbW9kdWxlKHZvaWQpOworc3RhdGljIHZvaWQgZTEwMDBfZXhpdF9tb2R1bGUodm9pZCk7CitzdGF0aWMgaW50IGUxMDAwX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBlMTAwMF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworc3RhdGljIGludCBlMTAwMF9zd19pbml0KHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgZTEwMDBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKK3N0YXRpYyBpbnQgZTEwMDBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgdm9pZCBlMTAwMF9jb25maWd1cmVfdHgoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgZTEwMDBfY29uZmlndXJlX3J4KHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyB2b2lkIGUxMDAwX3NldHVwX3JjdGwoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgZTEwMDBfY2xlYW5fdHhfcmluZyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgdm9pZCBlMTAwMF9jbGVhbl9yeF9yaW5nKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyB2b2lkIGUxMDAwX3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKK3N0YXRpYyB2b2lkIGUxMDAwX3VwZGF0ZV9waHlfaW5mbyh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgZTEwMDBfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGUxMDAwX3dhdGNoZG9nX3Rhc2soc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgZTEwMDBfODI1NDdfdHhfZmlmb19zdGFsbCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIGludCBlMTAwMF94bWl0X2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogZTEwMDBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworc3RhdGljIGludCBlMTAwMF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBuZXdfbXR1KTsKK3N0YXRpYyBpbnQgZTEwMDBfc2V0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpwKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBlMTAwMF9pbnRyKGludCBpcnEsIHZvaWQgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBib29sZWFuX3QgZTEwMDBfY2xlYW5fdHhfaXJxKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKKyNpZmRlZiBDT05GSUdfRTEwMDBfTkFQSQorc3RhdGljIGludCBlMTAwMF9jbGVhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgKmJ1ZGdldCk7CitzdGF0aWMgYm9vbGVhbl90IGUxMDAwX2NsZWFuX3J4X2lycShzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqd29ya19kb25lLCBpbnQgd29ya190b19kbyk7CisjZWxzZQorc3RhdGljIGJvb2xlYW5fdCBlMTAwMF9jbGVhbl9yeF9pcnEoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworI2VuZGlmCitzdGF0aWMgdm9pZCBlMTAwMF9hbGxvY19yeF9idWZmZXJzKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgZTEwMDBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOworc3RhdGljIGludCBlMTAwMF9taWlfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlmcmVxICppZnIsCisJCQkgICBpbnQgY21kKTsKK3ZvaWQgZTEwMDBfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworc3RhdGljIHZvaWQgZTEwMDBfZW50ZXJfODI1NDJfcnN0KHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyB2b2lkIGUxMDAwX2xlYXZlXzgyNTQyX3JzdChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgdm9pZCBlMTAwMF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZTEwMDBfdHhfdGltZW91dF90YXNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZTEwMDBfc21hcnRzcGVlZChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW5saW5lIGludCBlMTAwMF84MjU0N19maWZvX3dvcmthcm91bmQoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpOworCitzdGF0aWMgdm9pZCBlMTAwMF92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApOworc3RhdGljIHZvaWQgZTEwMDBfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQxNl90IHZpZCk7CitzdGF0aWMgdm9pZCBlMTAwMF92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQxNl90IHZpZCk7CitzdGF0aWMgdm9pZCBlMTAwMF9yZXN0b3JlX3ZsYW4oc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworCitzdGF0aWMgaW50IGUxMDAwX25vdGlmeV9yZWJvb3Qoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cik7CitzdGF0aWMgaW50IGUxMDAwX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVpbnQzMl90IHN0YXRlKTsKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgZTEwMDBfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKy8qIGZvciBuZXRkdW1wIC8gbmV0IGNvbnNvbGUgKi8KK3N0YXRpYyB2b2lkIGUxMDAwX25ldHBvbGwgKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworI2VuZGlmCisKK3N0cnVjdCBub3RpZmllcl9ibG9jayBlMTAwMF9ub3RpZmllcl9yZWJvb3QgPSB7CisJLm5vdGlmaWVyX2NhbGwJPSBlMTAwMF9ub3RpZnlfcmVib290LAorCS5uZXh0CQk9IE5VTEwsCisJLnByaW9yaXR5CT0gMAorfTsKKworLyogRXhwb3J0ZWQgZnJvbSBvdGhlciBtb2R1bGVzICovCisKK2V4dGVybiB2b2lkIGUxMDAwX2NoZWNrX29wdGlvbnMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZTEwMDBfZHJpdmVyID0geworCS5uYW1lICAgICA9IGUxMDAwX2RyaXZlcl9uYW1lLAorCS5pZF90YWJsZSA9IGUxMDAwX3BjaV90YmwsCisJLnByb2JlICAgID0gZTEwMDBfcHJvYmUsCisJLnJlbW92ZSAgID0gX19kZXZleGl0X3AoZTEwMDBfcmVtb3ZlKSwKKwkvKiBQb3dlciBNYW5hZ21lbnQgSG9va3MgKi8KKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCAgPSBlMTAwMF9zdXNwZW5kLAorCS5yZXN1bWUgICA9IGUxMDAwX3Jlc3VtZQorI2VuZGlmCit9OworCitNT0RVTEVfQVVUSE9SKCJJbnRlbCBDb3Jwb3JhdGlvbiwgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbChSKSBQUk8vMTAwMCBOZXR3b3JrIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworCitzdGF0aWMgaW50IGRlYnVnID0gTkVUSUZfTVNHX0RSViB8IE5FVElGX01TR19QUk9CRTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbCAoMD1ub25lLC4uLiwxNj1hbGwpIik7CisKKy8qKgorICogZTEwMDBfaW5pdF9tb2R1bGUgLSBEcml2ZXIgUmVnaXN0cmF0aW9uIFJvdXRpbmUKKyAqCisgKiBlMTAwMF9pbml0X21vZHVsZSBpcyB0aGUgZmlyc3Qgcm91dGluZSBjYWxsZWQgd2hlbiB0aGUgZHJpdmVyIGlzCisgKiBsb2FkZWQuIEFsbCBpdCBkb2VzIGlzIHJlZ2lzdGVyIHdpdGggdGhlIFBDSSBzdWJzeXN0ZW0uCisgKiovCisKK3N0YXRpYyBpbnQgX19pbml0CitlMTAwMF9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXQ7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgLSB2ZXJzaW9uICVzXG4iLAorCSAgICAgICBlMTAwMF9kcml2ZXJfc3RyaW5nLCBlMTAwMF9kcml2ZXJfdmVyc2lvbik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgZTEwMDBfY29weXJpZ2h0KTsKKworCXJldCA9IHBjaV9tb2R1bGVfaW5pdCgmZTEwMDBfZHJpdmVyKTsKKwlpZihyZXQgPj0gMCkgeworCQlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmUxMDAwX25vdGlmaWVyX3JlYm9vdCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK21vZHVsZV9pbml0KGUxMDAwX2luaXRfbW9kdWxlKTsKKworLyoqCisgKiBlMTAwMF9leGl0X21vZHVsZSAtIERyaXZlciBFeGl0IENsZWFudXAgUm91dGluZQorICoKKyAqIGUxMDAwX2V4aXRfbW9kdWxlIGlzIGNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgZHJpdmVyIGlzIHJlbW92ZWQKKyAqIGZyb20gbWVtb3J5LgorICoqLworCitzdGF0aWMgdm9pZCBfX2V4aXQKK2UxMDAwX2V4aXRfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmUxMDAwX25vdGlmaWVyX3JlYm9vdCk7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZlMTAwMF9kcml2ZXIpOworfQorCittb2R1bGVfZXhpdChlMTAwMF9leGl0X21vZHVsZSk7CisKKy8qKgorICogZTEwMDBfaXJxX2Rpc2FibGUgLSBNYXNrIG9mZiBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBvbiB0aGUgTklDCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqKi8KKworc3RhdGljIGlubGluZSB2b2lkCitlMTAwMF9pcnFfZGlzYWJsZShzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlhdG9taWNfaW5jKCZhZGFwdGVyLT5pcnFfc2VtKTsKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJTUMsIH4wKTsKKwlFMTAwMF9XUklURV9GTFVTSCgmYWRhcHRlci0+aHcpOworCXN5bmNocm9uaXplX2lycShhZGFwdGVyLT5wZGV2LT5pcnEpOworfQorCisvKioKKyAqIGUxMDAwX2lycV9lbmFibGUgLSBFbmFibGUgZGVmYXVsdCBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBzZXR0aW5ncworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZTEwMDBfaXJxX2VuYWJsZShzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZihsaWtlbHkoYXRvbWljX2RlY19hbmRfdGVzdCgmYWRhcHRlci0+aXJxX3NlbSkpKSB7CisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElNUywgSU1TX0VOQUJMRV9NQVNLKTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goJmFkYXB0ZXItPmh3KTsKKwl9Cit9CisKK2ludAorZTEwMDBfdXAoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlpbnQgZXJyOworCisJLyogaGFyZHdhcmUgaGFzIGJlZW4gcmVzZXQsIHdlIG5lZWQgdG8gcmVsb2FkIHNvbWUgdGhpbmdzICovCisKKwkvKiBSZXNldCB0aGUgUEhZIGlmIGl0IHdhcyBwcmV2aW91c2x5IHBvd2VyZWQgZG93biAqLworCWlmKGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKKwkJdWludDE2X3QgbWlpX3JlZzsKKwkJZTEwMDBfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZX0NUUkwsICZtaWlfcmVnKTsKKwkJaWYobWlpX3JlZyAmIE1JSV9DUl9QT1dFUl9ET1dOKQorCQkJZTEwMDBfcGh5X3Jlc2V0KCZhZGFwdGVyLT5odyk7CisJfQorCisJZTEwMDBfc2V0X211bHRpKG5ldGRldik7CisKKwllMTAwMF9yZXN0b3JlX3ZsYW4oYWRhcHRlcik7CisKKwllMTAwMF9jb25maWd1cmVfdHgoYWRhcHRlcik7CisJZTEwMDBfc2V0dXBfcmN0bChhZGFwdGVyKTsKKwllMTAwMF9jb25maWd1cmVfcngoYWRhcHRlcik7CisJZTEwMDBfYWxsb2NfcnhfYnVmZmVycyhhZGFwdGVyKTsKKworCWlmKChlcnIgPSByZXF1ZXN0X2lycShhZGFwdGVyLT5wZGV2LT5pcnEsICZlMTAwMF9pbnRyLAorCQkgICAgICAgICAgICAgIFNBX1NISVJRIHwgU0FfU0FNUExFX1JBTkRPTSwKKwkJICAgICAgICAgICAgICBuZXRkZXYtPm5hbWUsIG5ldGRldikpKQorCQlyZXR1cm4gZXJyOworCisJbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgamlmZmllcyk7CisJZTEwMDBfaXJxX2VuYWJsZShhZGFwdGVyKTsKKworI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCisJbmV0aWZfcG9sbF9lbmFibGUobmV0ZGV2KTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCit2b2lkCitlMTAwMF9kb3duKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisKKwllMTAwMF9pcnFfZGlzYWJsZShhZGFwdGVyKTsKKwlmcmVlX2lycShhZGFwdGVyLT5wZGV2LT5pcnEsIG5ldGRldik7CisJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPnR4X2ZpZm9fc3RhbGxfdGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPnBoeV9pbmZvX3RpbWVyKTsKKworI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCisJbmV0aWZfcG9sbF9kaXNhYmxlKG5ldGRldik7CisjZW5kaWYKKwlhZGFwdGVyLT5saW5rX3NwZWVkID0gMDsKKwlhZGFwdGVyLT5saW5rX2R1cGxleCA9IDA7CisJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwllMTAwMF9yZXNldChhZGFwdGVyKTsKKwllMTAwMF9jbGVhbl90eF9yaW5nKGFkYXB0ZXIpOworCWUxMDAwX2NsZWFuX3J4X3JpbmcoYWRhcHRlcik7CisKKwkvKiBJZiBXb0wgaXMgbm90IGVuYWJsZWQKKwkgKiBQb3dlciBkb3duIHRoZSBQSFkgc28gbm8gbGluayBpcyBpbXBsaWVkIHdoZW4gaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZighYWRhcHRlci0+d29sICYmIGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKKwkJdWludDE2X3QgbWlpX3JlZzsKKwkJZTEwMDBfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZX0NUUkwsICZtaWlfcmVnKTsKKwkJbWlpX3JlZyB8PSBNSUlfQ1JfUE9XRVJfRE9XTjsKKwkJZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIFBIWV9DVFJMLCBtaWlfcmVnKTsKKwl9Cit9CisKK3ZvaWQKK2UxMDAwX3Jlc2V0KHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCXVpbnQzMl90IHBiYTsKKworCS8qIFJlcGFydGl0aW9uIFBiYSBmb3IgZ3JlYXRlciB0aGFuIDlrIG10dQorCSAqIFRvIHRha2UgZWZmZWN0IENUUkwuUlNUIGlzIHJlcXVpcmVkLgorCSAqLworCisJaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU0NykgeworCQlpZihhZGFwdGVyLT5yeF9idWZmZXJfbGVuID4gRTEwMDBfUlhCVUZGRVJfODE5MikKKwkJCXBiYSA9IEUxMDAwX1BCQV80MEs7CisJCWVsc2UKKwkJCXBiYSA9IEUxMDAwX1BCQV80OEs7CisJfSBlbHNlIHsKKwkJaWYoYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA+IEUxMDAwX1JYQlVGRkVSXzgxOTIpCisJCQlwYmEgPSBFMTAwMF9QQkFfMjJLOworCQllbHNlCisJCQlwYmEgPSBFMTAwMF9QQkFfMzBLOworCQlhZGFwdGVyLT50eF9maWZvX2hlYWQgPSAwOworCQlhZGFwdGVyLT50eF9oZWFkX2FkZHIgPSBwYmEgPDwgRTEwMDBfVFhfSEVBRF9BRERSX1NISUZUOworCQlhZGFwdGVyLT50eF9maWZvX3NpemUgPQorCQkJKEUxMDAwX1BCQV80MEsgLSBwYmEpIDw8IEUxMDAwX1BCQV9CWVRFU19TSElGVDsKKwkJYXRvbWljX3NldCgmYWRhcHRlci0+dHhfZmlmb19zdGFsbCwgMCk7CisJfQorCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFBCQSwgcGJhKTsKKworCS8qIGZsb3cgY29udHJvbCBzZXR0aW5ncyAqLworCWFkYXB0ZXItPmh3LmZjX2hpZ2hfd2F0ZXIgPSAocGJhIDw8IEUxMDAwX1BCQV9CWVRFU19TSElGVCkgLQorCQkJCSAgICBFMTAwMF9GQ19ISUdIX0RJRkY7CisJYWRhcHRlci0+aHcuZmNfbG93X3dhdGVyID0gKHBiYSA8PCBFMTAwMF9QQkFfQllURVNfU0hJRlQpIC0KKwkJCQkgICBFMTAwMF9GQ19MT1dfRElGRjsKKwlhZGFwdGVyLT5ody5mY19wYXVzZV90aW1lID0gRTEwMDBfRkNfUEFVU0VfVElNRTsKKwlhZGFwdGVyLT5ody5mY19zZW5kX3hvbiA9IDE7CisJYWRhcHRlci0+aHcuZmMgPSBhZGFwdGVyLT5ody5vcmlnaW5hbF9mYzsKKworCWUxMDAwX3Jlc2V0X2h3KCZhZGFwdGVyLT5odyk7CisJaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDQpCisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFdVQywgMCk7CisJaWYoZTEwMDBfaW5pdF9odygmYWRhcHRlci0+aHcpKQorCQlEUFJJTlRLKFBST0JFLCBFUlIsICJIYXJkd2FyZSBFcnJvclxuIik7CisKKwkvKiBFbmFibGUgaC93IHRvIHJlY29nbml6ZSBhbiA4MDIuMVEgVkxBTiBFdGhlcm5ldCBwYWNrZXQgKi8KKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBWRVQsIEVUSEVSTkVUX0lFRUVfVkxBTl9UWVBFKTsKKworCWUxMDAwX3Jlc2V0X2FkYXB0aXZlKCZhZGFwdGVyLT5odyk7CisJZTEwMDBfcGh5X2dldF9pbmZvKCZhZGFwdGVyLT5odywgJmFkYXB0ZXItPnBoeV9pbmZvKTsKK30KKworLyoqCisgKiBlMTAwMF9wcm9iZSAtIERldmljZSBJbml0aWFsaXphdGlvbiBSb3V0aW5lCisgKiBAcGRldjogUENJIGRldmljZSBpbmZvcm1hdGlvbiBzdHJ1Y3QKKyAqIEBlbnQ6IGVudHJ5IGluIGUxMDAwX3BjaV90YmwKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICoKKyAqIGUxMDAwX3Byb2JlIGluaXRpYWxpemVzIGFuIGFkYXB0ZXIgaWRlbnRpZmllZCBieSBhIHBjaV9kZXYgc3RydWN0dXJlLgorICogVGhlIE9TIGluaXRpYWxpemF0aW9uLCBjb25maWd1cmluZyBvZiB0aGUgYWRhcHRlciBwcml2YXRlIHN0cnVjdHVyZSwKKyAqIGFuZCBhIGhhcmR3YXJlIHJlc2V0IG9jY3VyLgorICoqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorZTEwMDBfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXI7CisJc3RhdGljIGludCBjYXJkc19mb3VuZCA9IDA7CisJdW5zaWduZWQgbG9uZyBtbWlvX3N0YXJ0OworCWludCBtbWlvX2xlbjsKKwlpbnQgcGNpX3VzaW5nX2RhYzsKKwlpbnQgaTsKKwlpbnQgZXJyOworCXVpbnQxNl90IGVlcHJvbV9kYXRhOworCXVpbnQxNl90IGVlcHJvbV9hcG1lX21hc2sgPSBFMTAwMF9FRVBST01fQVBNRTsKKworCWlmKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkpCisJCXJldHVybiBlcnI7CisKKwlpZighKGVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spKSkgeworCQlwY2lfdXNpbmdfZGFjID0gMTsKKwl9IGVsc2UgeworCQlpZigoZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykpKSB7CisJCQlFMTAwMF9FUlIoIk5vIHVzYWJsZSBETUEgY29uZmlndXJhdGlvbiwgYWJvcnRpbmdcbiIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlwY2lfdXNpbmdfZGFjID0gMDsKKwl9CisKKwlpZigoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBlMTAwMF9kcml2ZXJfbmFtZSkpKQorCQlyZXR1cm4gZXJyOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGUxMDAwX2FkYXB0ZXIpKTsKKwlpZighbmV0ZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2FsbG9jX2V0aGVyZGV2OworCX0KKworCVNFVF9NT0RVTEVfT1dORVIobmV0ZGV2KTsKKwlTRVRfTkVUREVWX0RFVihuZXRkZXYsICZwZGV2LT5kZXYpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIG5ldGRldik7CisJYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlhZGFwdGVyLT5uZXRkZXYgPSBuZXRkZXY7CisJYWRhcHRlci0+cGRldiA9IHBkZXY7CisJYWRhcHRlci0+aHcuYmFjayA9IGFkYXB0ZXI7CisJYWRhcHRlci0+bXNnX2VuYWJsZSA9ICgxIDw8IGRlYnVnKSAtIDE7CisKKwltbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIEJBUl8wKTsKKwltbWlvX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgQkFSXzApOworCisJYWRhcHRlci0+aHcuaHdfYWRkciA9IGlvcmVtYXAobW1pb19zdGFydCwgbW1pb19sZW4pOworCWlmKCFhZGFwdGVyLT5ody5od19hZGRyKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX2lvcmVtYXA7CisJfQorCisJZm9yKGkgPSBCQVJfMTsgaSA8PSBCQVJfNTsgaSsrKSB7CisJCWlmKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZihwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgaSkgJiBJT1JFU09VUkNFX0lPKSB7CisJCQlhZGFwdGVyLT5ody5pb19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGkpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwluZXRkZXYtPm9wZW4gPSAmZTEwMDBfb3BlbjsKKwluZXRkZXYtPnN0b3AgPSAmZTEwMDBfY2xvc2U7CisJbmV0ZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmZTEwMDBfeG1pdF9mcmFtZTsKKwluZXRkZXYtPmdldF9zdGF0cyA9ICZlMTAwMF9nZXRfc3RhdHM7CisJbmV0ZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmZTEwMDBfc2V0X211bHRpOworCW5ldGRldi0+c2V0X21hY19hZGRyZXNzID0gJmUxMDAwX3NldF9tYWM7CisJbmV0ZGV2LT5jaGFuZ2VfbXR1ID0gJmUxMDAwX2NoYW5nZV9tdHU7CisJbmV0ZGV2LT5kb19pb2N0bCA9ICZlMTAwMF9pb2N0bDsKKwllMTAwMF9zZXRfZXRodG9vbF9vcHMobmV0ZGV2KTsKKwluZXRkZXYtPnR4X3RpbWVvdXQgPSAmZTEwMDBfdHhfdGltZW91dDsKKwluZXRkZXYtPndhdGNoZG9nX3RpbWVvID0gNSAqIEhaOworI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCisJbmV0ZGV2LT5wb2xsID0gJmUxMDAwX2NsZWFuOworCW5ldGRldi0+d2VpZ2h0ID0gNjQ7CisjZW5kaWYKKwluZXRkZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPSBlMTAwMF92bGFuX3J4X3JlZ2lzdGVyOworCW5ldGRldi0+dmxhbl9yeF9hZGRfdmlkID0gZTEwMDBfdmxhbl9yeF9hZGRfdmlkOworCW5ldGRldi0+dmxhbl9yeF9raWxsX3ZpZCA9IGUxMDAwX3ZsYW5fcnhfa2lsbF92aWQ7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwluZXRkZXYtPnBvbGxfY29udHJvbGxlciA9IGUxMDAwX25ldHBvbGw7CisjZW5kaWYKKwlzdHJjcHkobmV0ZGV2LT5uYW1lLCBwY2lfbmFtZShwZGV2KSk7CisKKwluZXRkZXYtPm1lbV9zdGFydCA9IG1taW9fc3RhcnQ7CisJbmV0ZGV2LT5tZW1fZW5kID0gbW1pb19zdGFydCArIG1taW9fbGVuOworCW5ldGRldi0+YmFzZV9hZGRyID0gYWRhcHRlci0+aHcuaW9fYmFzZTsKKworCWFkYXB0ZXItPmJkX251bWJlciA9IGNhcmRzX2ZvdW5kOworCisJLyogc2V0dXAgdGhlIHByaXZhdGUgc3RydWN0dXJlICovCisKKwlpZigoZXJyID0gZTEwMDBfc3dfaW5pdChhZGFwdGVyKSkpCisJCWdvdG8gZXJyX3N3X2luaXQ7CisKKwlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgeworCQluZXRkZXYtPmZlYXR1cmVzID0gTkVUSUZfRl9TRyB8CisJCQkJICAgTkVUSUZfRl9IV19DU1VNIHwKKwkJCQkgICBORVRJRl9GX0hXX1ZMQU5fVFggfAorCQkJCSAgIE5FVElGX0ZfSFdfVkxBTl9SWCB8CisJCQkJICAgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUjsKKwl9CisKKyNpZmRlZiBORVRJRl9GX1RTTworCWlmKChhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0NCkgJiYKKwkgICAoYWRhcHRlci0+aHcubWFjX3R5cGUgIT0gZTEwMDBfODI1NDcpKQorCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOworI2VuZGlmCisJaWYocGNpX3VzaW5nX2RhYykKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CisKKyAJLyogaGFyZF9zdGFydF94bWl0IGlzIHNhZmUgYWdhaW5zdCBwYXJhbGxlbCBsb2NraW5nICovCisgCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9MTFRYOyAKKyAKKwkvKiBiZWZvcmUgcmVhZGluZyB0aGUgRUVQUk9NLCByZXNldCB0aGUgY29udHJvbGxlciB0byAKKwkgKiBwdXQgdGhlIGRldmljZSBpbiBhIGtub3duIGdvb2Qgc3RhcnRpbmcgc3RhdGUgKi8KKwkKKwllMTAwMF9yZXNldF9odygmYWRhcHRlci0+aHcpOworCisJLyogbWFrZSBzdXJlIHRoZSBFRVBST00gaXMgZ29vZCAqLworCisJaWYoZTEwMDBfdmFsaWRhdGVfZWVwcm9tX2NoZWNrc3VtKCZhZGFwdGVyLT5odykgPCAwKSB7CisJCURQUklOVEsoUFJPQkUsIEVSUiwgIlRoZSBFRVBST00gQ2hlY2tzdW0gSXMgTm90IFZhbGlkXG4iKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBlcnJfZWVwcm9tOworCX0KKworCS8qIGNvcHkgdGhlIE1BQyBhZGRyZXNzIG91dCBvZiB0aGUgRUVQUk9NICovCisKKwlpZiAoZTEwMDBfcmVhZF9tYWNfYWRkcigmYWRhcHRlci0+aHcpKQorCQlEUFJJTlRLKFBST0JFLCBFUlIsICJFRVBST00gUmVhZCBFcnJvclxuIik7CisJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkYXB0ZXItPmh3Lm1hY19hZGRyLCBuZXRkZXYtPmFkZHJfbGVuKTsKKworCWlmKCFpc192YWxpZF9ldGhlcl9hZGRyKG5ldGRldi0+ZGV2X2FkZHIpKSB7CisJCURQUklOVEsoUFJPQkUsIEVSUiwgIkludmFsaWQgTUFDIEFkZHJlc3NcbiIpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9lZXByb207CisJfQorCisJZTEwMDBfcmVhZF9wYXJ0X251bSgmYWRhcHRlci0+aHcsICYoYWRhcHRlci0+cGFydF9udW0pKTsKKworCWUxMDAwX2dldF9idXNfaW5mbygmYWRhcHRlci0+aHcpOworCisJaW5pdF90aW1lcigmYWRhcHRlci0+dHhfZmlmb19zdGFsbF90aW1lcik7CisJYWRhcHRlci0+dHhfZmlmb19zdGFsbF90aW1lci5mdW5jdGlvbiA9ICZlMTAwMF84MjU0N190eF9maWZvX3N0YWxsOworCWFkYXB0ZXItPnR4X2ZpZm9fc3RhbGxfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBhZGFwdGVyOworCisJaW5pdF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIpOworCWFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLmZ1bmN0aW9uID0gJmUxMDAwX3dhdGNoZG9nOworCWFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgYWRhcHRlcjsKKworCUlOSVRfV09SSygmYWRhcHRlci0+d2F0Y2hkb2dfdGFzaywKKwkJKHZvaWQgKCopKHZvaWQgKikpZTEwMDBfd2F0Y2hkb2dfdGFzaywgYWRhcHRlcik7CisKKwlpbml0X3RpbWVyKCZhZGFwdGVyLT5waHlfaW5mb190aW1lcik7CisJYWRhcHRlci0+cGh5X2luZm9fdGltZXIuZnVuY3Rpb24gPSAmZTEwMDBfdXBkYXRlX3BoeV9pbmZvOworCWFkYXB0ZXItPnBoeV9pbmZvX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgYWRhcHRlcjsKKworCUlOSVRfV09SSygmYWRhcHRlci0+dHhfdGltZW91dF90YXNrLAorCQkodm9pZCAoKikodm9pZCAqKSllMTAwMF90eF90aW1lb3V0X3Rhc2ssIG5ldGRldik7CisKKwkvKiB3ZSdyZSBnb2luZyB0byByZXNldCwgc28gYXNzdW1lIHdlIGhhdmUgbm8gbGluayBmb3Igbm93ICovCisKKwluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKworCWUxMDAwX2NoZWNrX29wdGlvbnMoYWRhcHRlcik7CisKKwkvKiBJbml0aWFsIFdha2Ugb24gTEFOIHNldHRpbmcKKwkgKiBJZiBBUE0gd2FrZSBpcyBlbmFibGVkIGluIHRoZSBFRVBST00sCisJICogZW5hYmxlIHRoZSBBQ1BJIE1hZ2ljIFBhY2tldCBmaWx0ZXIKKwkgKi8KKworCXN3aXRjaChhZGFwdGVyLT5ody5tYWNfdHlwZSkgeworCWNhc2UgZTEwMDBfODI1NDJfcmV2Ml8wOgorCWNhc2UgZTEwMDBfODI1NDJfcmV2Ml8xOgorCWNhc2UgZTEwMDBfODI1NDM6CisJCWJyZWFrOworCWNhc2UgZTEwMDBfODI1NDQ6CisJCWUxMDAwX3JlYWRfZWVwcm9tKCZhZGFwdGVyLT5odywKKwkJCUVFUFJPTV9JTklUX0NPTlRST0wyX1JFRywgMSwgJmVlcHJvbV9kYXRhKTsKKwkJZWVwcm9tX2FwbWVfbWFzayA9IEUxMDAwX0VFUFJPTV84MjU0NF9BUE07CisJCWJyZWFrOworCWNhc2UgZTEwMDBfODI1NDY6CisJY2FzZSBlMTAwMF84MjU0Nl9yZXZfMzoKKwkJaWYoKEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19GVU5DXzEpCisJCSAgICYmIChhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSkgeworCQkJZTEwMDBfcmVhZF9lZXByb20oJmFkYXB0ZXItPmh3LAorCQkJCUVFUFJPTV9JTklUX0NPTlRST0wzX1BPUlRfQiwgMSwgJmVlcHJvbV9kYXRhKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIEZhbGwgVGhyb3VnaCAqLworCWRlZmF1bHQ6CisJCWUxMDAwX3JlYWRfZWVwcm9tKCZhZGFwdGVyLT5odywKKwkJCUVFUFJPTV9JTklUX0NPTlRST0wzX1BPUlRfQSwgMSwgJmVlcHJvbV9kYXRhKTsKKwkJYnJlYWs7CisJfQorCWlmKGVlcHJvbV9kYXRhICYgZWVwcm9tX2FwbWVfbWFzaykKKwkJYWRhcHRlci0+d29sIHw9IEUxMDAwX1dVRkNfTUFHOworCisJLyogcmVzZXQgdGhlIGhhcmR3YXJlIHdpdGggdGhlIG5ldyBzZXR0aW5ncyAqLworCWUxMDAwX3Jlc2V0KGFkYXB0ZXIpOworCisJc3RyY3B5KG5ldGRldi0+bmFtZSwgImV0aCVkIik7CisJaWYoKGVyciA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpKSkKKwkJZ290byBlcnJfcmVnaXN0ZXI7CisKKwlEUFJJTlRLKFBST0JFLCBJTkZPLCAiSW50ZWwoUikgUFJPLzEwMDAgTmV0d29yayBDb25uZWN0aW9uXG4iKTsKKworCWNhcmRzX2ZvdW5kKys7CisJcmV0dXJuIDA7CisKK2Vycl9yZWdpc3RlcjoKK2Vycl9zd19pbml0OgorZXJyX2VlcHJvbToKKwlpb3VubWFwKGFkYXB0ZXItPmh3Lmh3X2FkZHIpOworZXJyX2lvcmVtYXA6CisJZnJlZV9uZXRkZXYobmV0ZGV2KTsKK2Vycl9hbGxvY19ldGhlcmRldjoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogZTEwMDBfcmVtb3ZlIC0gRGV2aWNlIFJlbW92YWwgUm91dGluZQorICogQHBkZXY6IFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gc3RydWN0CisgKgorICogZTEwMDBfcmVtb3ZlIGlzIGNhbGxlZCBieSB0aGUgUENJIHN1YnN5c3RlbSB0byBhbGVydCB0aGUgZHJpdmVyCisgKiB0aGF0IGl0IHNob3VsZCByZWxlYXNlIGEgUENJIGRldmljZS4gIFRoZSBjb3VsZCBiZSBjYXVzZWQgYnkgYQorICogSG90LVBsdWcgZXZlbnQsIG9yIGJlY2F1c2UgdGhlIGRyaXZlciBpcyBnb2luZyB0byBiZSByZW1vdmVkIGZyb20KKyAqIG1lbW9yeS4KKyAqKi8KKworc3RhdGljIHZvaWQgX19kZXZleGl0CitlMTAwMF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwl1aW50MzJfdCBtYW5jOworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQwICYmCisJICAgYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgeworCQltYW5jID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBNQU5DKTsKKwkJaWYobWFuYyAmIEUxMDAwX01BTkNfU01CVVNfRU4pIHsKKwkJCW1hbmMgfD0gRTEwMDBfTUFOQ19BUlBfRU47CisJCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBNQU5DLCBtYW5jKTsKKwkJfQorCX0KKworCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisKKwllMTAwMF9waHlfaHdfcmVzZXQoJmFkYXB0ZXItPmh3KTsKKworCWlvdW5tYXAoYWRhcHRlci0+aHcuaHdfYWRkcik7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworCWZyZWVfbmV0ZGV2KG5ldGRldik7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKKy8qKgorICogZTEwMDBfc3dfaW5pdCAtIEluaXRpYWxpemUgZ2VuZXJhbCBzb2Z0d2FyZSBzdHJ1Y3R1cmVzIChzdHJ1Y3QgZTEwMDBfYWRhcHRlcikKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZSB0byBpbml0aWFsaXplCisgKgorICogZTEwMDBfc3dfaW5pdCBpbml0aWFsaXplcyB0aGUgQWRhcHRlciBwcml2YXRlIGRhdGEgc3RydWN0dXJlLgorICogRmllbGRzIGFyZSBpbml0aWFsaXplZCBiYXNlZCBvbiBQQ0kgZGV2aWNlIGluZm9ybWF0aW9uIGFuZAorICogT1MgbmV0d29yayBkZXZpY2Ugc2V0dGluZ3MgKE1UVSBzaXplKS4KKyAqKi8KKworc3RhdGljIGludCBfX2RldmluaXQKK2UxMDAwX3N3X2luaXQoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKworCS8qIFBDSSBjb25maWcgc3BhY2UgaW5mbyAqLworCisJaHctPnZlbmRvcl9pZCA9IHBkZXYtPnZlbmRvcjsKKwlody0+ZGV2aWNlX2lkID0gcGRldi0+ZGV2aWNlOworCWh3LT5zdWJzeXN0ZW1fdmVuZG9yX2lkID0gcGRldi0+c3Vic3lzdGVtX3ZlbmRvcjsKKwlody0+c3Vic3lzdGVtX2lkID0gcGRldi0+c3Vic3lzdGVtX2RldmljZTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJmh3LT5yZXZpc2lvbl9pZCk7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJmh3LT5wY2lfY21kX3dvcmQpOworCisJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA9IEUxMDAwX1JYQlVGRkVSXzIwNDg7CisJaHctPm1heF9mcmFtZV9zaXplID0gbmV0ZGV2LT5tdHUgKworCQkJICAgICBFTkVUX0hFQURFUl9TSVpFICsgRVRIRVJORVRfRkNTX1NJWkU7CisJaHctPm1pbl9mcmFtZV9zaXplID0gTUlOSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFOworCisJLyogaWRlbnRpZnkgdGhlIE1BQyAqLworCisJaWYoZTEwMDBfc2V0X21hY190eXBlKGh3KSkgeworCQlEUFJJTlRLKFBST0JFLCBFUlIsICJVbmtub3duIE1BQyBUeXBlXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogaW5pdGlhbGl6ZSBlZXByb20gcGFyYW1ldGVycyAqLworCisJZTEwMDBfaW5pdF9lZXByb21fcGFyYW1zKGh3KTsKKworCXN3aXRjaChody0+bWFjX3R5cGUpIHsKKwlkZWZhdWx0OgorCQlicmVhazsKKwljYXNlIGUxMDAwXzgyNTQxOgorCWNhc2UgZTEwMDBfODI1NDc6CisJY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKKwljYXNlIGUxMDAwXzgyNTQ3X3Jldl8yOgorCQlody0+cGh5X2luaXRfc2NyaXB0ID0gMTsKKwkJYnJlYWs7CisJfQorCisJZTEwMDBfc2V0X21lZGlhX3R5cGUoaHcpOworCisJaHctPndhaXRfYXV0b25lZ19jb21wbGV0ZSA9IEZBTFNFOworCWh3LT50YmlfY29tcGF0aWJpbGl0eV9lbiA9IFRSVUU7CisJaHctPmFkYXB0aXZlX2lmcyA9IFRSVUU7CisKKwkvKiBDb3BwZXIgb3B0aW9ucyAqLworCisJaWYoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKKwkJaHctPm1kaXggPSBBVVRPX0FMTF9NT0RFUzsKKwkJaHctPmRpc2FibGVfcG9sYXJpdHlfY29ycmVjdGlvbiA9IEZBTFNFOworCQlody0+bWFzdGVyX3NsYXZlID0gRTEwMDBfTUFTVEVSX1NMQVZFOworCX0KKworCWF0b21pY19zZXQoJmFkYXB0ZXItPmlycV9zZW0sIDEpOworCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5zdGF0c19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+dHhfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBlMTAwMF9vcGVuIC0gQ2FsbGVkIHdoZW4gYSBuZXR3b3JrIGludGVyZmFjZSBpcyBtYWRlIGFjdGl2ZQorICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlCisgKgorICogVGhlIG9wZW4gZW50cnkgcG9pbnQgaXMgY2FsbGVkIHdoZW4gYSBuZXR3b3JrIGludGVyZmFjZSBpcyBtYWRlCisgKiBhY3RpdmUgYnkgdGhlIHN5c3RlbSAoSUZGX1VQKS4gIEF0IHRoaXMgcG9pbnQgYWxsIHJlc291cmNlcyBuZWVkZWQKKyAqIGZvciB0cmFuc21pdCBhbmQgcmVjZWl2ZSBvcGVyYXRpb25zIGFyZSBhbGxvY2F0ZWQsIHRoZSBpbnRlcnJ1cHQKKyAqIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBPUywgdGhlIHdhdGNoZG9nIHRpbWVyIGlzIHN0YXJ0ZWQsCisgKiBhbmQgdGhlIHN0YWNrIGlzIG5vdGlmaWVkIHRoYXQgdGhlIGludGVyZmFjZSBpcyByZWFkeS4KKyAqKi8KKworc3RhdGljIGludAorZTEwMDBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCWludCBlcnI7CisKKwkvKiBhbGxvY2F0ZSB0cmFuc21pdCBkZXNjcmlwdG9ycyAqLworCisJaWYoKGVyciA9IGUxMDAwX3NldHVwX3R4X3Jlc291cmNlcyhhZGFwdGVyKSkpCisJCWdvdG8gZXJyX3NldHVwX3R4OworCisJLyogYWxsb2NhdGUgcmVjZWl2ZSBkZXNjcmlwdG9ycyAqLworCisJaWYoKGVyciA9IGUxMDAwX3NldHVwX3J4X3Jlc291cmNlcyhhZGFwdGVyKSkpCisJCWdvdG8gZXJyX3NldHVwX3J4OworCisJaWYoKGVyciA9IGUxMDAwX3VwKGFkYXB0ZXIpKSkKKwkJZ290byBlcnJfdXA7CisKKwlyZXR1cm4gRTEwMDBfU1VDQ0VTUzsKKworZXJyX3VwOgorCWUxMDAwX2ZyZWVfcnhfcmVzb3VyY2VzKGFkYXB0ZXIpOworZXJyX3NldHVwX3J4OgorCWUxMDAwX2ZyZWVfdHhfcmVzb3VyY2VzKGFkYXB0ZXIpOworZXJyX3NldHVwX3R4OgorCWUxMDAwX3Jlc2V0KGFkYXB0ZXIpOworCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBlMTAwMF9jbG9zZSAtIERpc2FibGVzIGEgbmV0d29yayBpbnRlcmZhY2UKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAsIHRoaXMgaXMgbm90IGFsbG93ZWQgdG8gZmFpbAorICoKKyAqIFRoZSBjbG9zZSBlbnRyeSBwb2ludCBpcyBjYWxsZWQgd2hlbiBhbiBpbnRlcmZhY2UgaXMgZGUtYWN0aXZhdGVkCisgKiBieSB0aGUgT1MuICBUaGUgaGFyZHdhcmUgaXMgc3RpbGwgdW5kZXIgdGhlIGRyaXZlcnMgY29udHJvbCwgYnV0CisgKiBuZWVkcyB0byBiZSBkaXNhYmxlZC4gIEEgZ2xvYmFsIE1BQyByZXNldCBpcyBpc3N1ZWQgdG8gc3RvcCB0aGUKKyAqIGhhcmR3YXJlLCBhbmQgYWxsIHRyYW5zbWl0IGFuZCByZWNlaXZlIHJlc291cmNlcyBhcmUgZnJlZWQuCisgKiovCisKK3N0YXRpYyBpbnQKK2UxMDAwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisKKwllMTAwMF9kb3duKGFkYXB0ZXIpOworCisJZTEwMDBfZnJlZV90eF9yZXNvdXJjZXMoYWRhcHRlcik7CisJZTEwMDBfZnJlZV9yeF9yZXNvdXJjZXMoYWRhcHRlcik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBlMTAwMF9jaGVja182NGtfYm91bmQgLSBjaGVjayB0aGF0IG1lbW9yeSBkb2Vzbid0IGNyb3NzIDY0a0IgYm91bmRhcnkKKyAqIEBhZGFwdGVyOiBhZGRyZXNzIG9mIGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiBAYmVnaW46IGFkZHJlc3Mgb2YgYmVnaW5uaW5nIG9mIG1lbW9yeQorICogQGVuZDogYWRkcmVzcyBvZiBlbmQgb2YgbWVtb3J5CisgKiovCitzdGF0aWMgaW5saW5lIGJvb2xlYW5fdAorZTEwMDBfY2hlY2tfNjRrX2JvdW5kKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLAorCQkgICAgICB2b2lkICpzdGFydCwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJdW5zaWduZWQgbG9uZyBiZWdpbiA9ICh1bnNpZ25lZCBsb25nKSBzdGFydDsKKwl1bnNpZ25lZCBsb25nIGVuZCA9IGJlZ2luICsgbGVuOworCisJLyogZmlyc3QgcmV2IDgyNTQ1IGFuZCA4MjU0NiBuZWVkIHRvIG5vdCBhbGxvdyBhbnkgbWVtb3J5CisJICogd3JpdGUgbG9jYXRpb24gdG8gY3Jvc3MgYSA2NGsgYm91bmRhcnkgZHVlIHRvIGVycmF0YSAyMyAqLworCWlmIChhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NSB8fAorCSAgICBhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NiApIHsKKworCQkvKiBjaGVjayBidWZmZXIgZG9lc24ndCBjcm9zcyA2NGtCICovCisJCXJldHVybiAoKGJlZ2luIF4gKGVuZCAtIDEpKSA+PiAxNikgIT0gMCA/IEZBTFNFIDogVFJVRTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBlMTAwMF9zZXR1cF90eF9yZXNvdXJjZXMgLSBhbGxvY2F0ZSBUeCByZXNvdXJjZXMgKERlc2NyaXB0b3JzKQorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICoqLworCitpbnQKK2UxMDAwX3NldHVwX3R4X3Jlc291cmNlcyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nICp0eGRyID0gJmFkYXB0ZXItPnR4X3Jpbmc7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCWludCBzaXplOworCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfYnVmZmVyKSAqIHR4ZHItPmNvdW50OworCXR4ZHItPmJ1ZmZlcl9pbmZvID0gdm1hbGxvYyhzaXplKTsKKwlpZighdHhkci0+YnVmZmVyX2luZm8pIHsKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAKKwkJIlVuYWJsZSB0byBBbGxvY2F0ZSBNZW1vcnkgZm9yIHRoZSBUcmFuc21pdCBkZXNjcmlwdG9yIHJpbmdcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHR4ZHItPmJ1ZmZlcl9pbmZvLCAwLCBzaXplKTsKKworCS8qIHJvdW5kIHVwIHRvIG5lYXJlc3QgNEsgKi8KKworCXR4ZHItPnNpemUgPSB0eGRyLT5jb3VudCAqIHNpemVvZihzdHJ1Y3QgZTEwMDBfdHhfZGVzYyk7CisJRTEwMDBfUk9VTkRVUCh0eGRyLT5zaXplLCA0MDk2KTsKKworCXR4ZHItPmRlc2MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCB0eGRyLT5zaXplLCAmdHhkci0+ZG1hKTsKKwlpZighdHhkci0+ZGVzYykgeworc2V0dXBfdHhfZGVzY19kaWU6CisJCURQUklOVEsoUFJPQkUsIEVSUiwgCisJCSJVbmFibGUgdG8gQWxsb2NhdGUgTWVtb3J5IGZvciB0aGUgVHJhbnNtaXQgZGVzY3JpcHRvciByaW5nXG4iKTsKKwkJdmZyZWUodHhkci0+YnVmZmVyX2luZm8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBmaXggZm9yIGVycmF0YSAyMywgY2FudCBjcm9zcyA2NGtCIGJvdW5kYXJ5ICovCisJaWYgKCFlMTAwMF9jaGVja182NGtfYm91bmQoYWRhcHRlciwgdHhkci0+ZGVzYywgdHhkci0+c2l6ZSkpIHsKKwkJdm9pZCAqb2xkZGVzYyA9IHR4ZHItPmRlc2M7CisJCWRtYV9hZGRyX3Qgb2xkZG1hID0gdHhkci0+ZG1hOworCQlEUFJJTlRLKFRYX0VSUixFUlIsInR4ZHIgYWxpZ24gY2hlY2sgZmFpbGVkOiAldSBieXRlcyBhdCAlcFxuIiwKKwkJICAgICAgICB0eGRyLT5zaXplLCB0eGRyLT5kZXNjKTsKKwkJLyogdHJ5IGFnYWluLCB3aXRob3V0IGZyZWVpbmcgdGhlIHByZXZpb3VzICovCisJCXR4ZHItPmRlc2MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCB0eGRyLT5zaXplLCAmdHhkci0+ZG1hKTsKKwkJLyogZmFpbGVkIGFsbG9jYXRpb24sIGNyaXRpYWwgZmFpbHVyZSAqLworCQlpZighdHhkci0+ZGVzYykgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCB0eGRyLT5zaXplLCBvbGRkZXNjLCBvbGRkbWEpOworCQkJZ290byBzZXR1cF90eF9kZXNjX2RpZTsKKwkJfQorCisJCWlmICghZTEwMDBfY2hlY2tfNjRrX2JvdW5kKGFkYXB0ZXIsIHR4ZHItPmRlc2MsIHR4ZHItPnNpemUpKSB7CisJCQkvKiBnaXZlIHVwICovCisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHR4ZHItPnNpemUsCisJCQkgICAgIHR4ZHItPmRlc2MsIHR4ZHItPmRtYSk7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHR4ZHItPnNpemUsIG9sZGRlc2MsIG9sZGRtYSk7CisJCQlEUFJJTlRLKFBST0JFLCBFUlIsCisJCQkgIlVuYWJsZSB0byBBbGxvY2F0ZSBhbGlnbmVkIE1lbW9yeSBmb3IgdGhlIFRyYW5zbWl0IgorCQkgICAgICAgICAiIGRlc2NyaXB0b3IgcmluZ1xuIik7CisJCQl2ZnJlZSh0eGRyLT5idWZmZXJfaW5mbyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfSBlbHNlIHsKKwkJCS8qIGZyZWUgb2xkLCBtb3ZlIG9uIHdpdGggdGhlIG5ldyBvbmUgc2luY2UgaXRzIG9rYXkgKi8KKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgdHhkci0+c2l6ZSwgb2xkZGVzYywgb2xkZG1hKTsKKwkJfQorCX0KKwltZW1zZXQodHhkci0+ZGVzYywgMCwgdHhkci0+c2l6ZSk7CisKKwl0eGRyLT5uZXh0X3RvX3VzZSA9IDA7CisJdHhkci0+bmV4dF90b19jbGVhbiA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBlMTAwMF9jb25maWd1cmVfdHggLSBDb25maWd1cmUgODI1NHggVHJhbnNtaXQgVW5pdCBhZnRlciBSZXNldAorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogQ29uZmlndXJlIHRoZSBUeCB1bml0IG9mIHRoZSBNQUMgYWZ0ZXIgYSByZXNldC4KKyAqKi8KKworc3RhdGljIHZvaWQKK2UxMDAwX2NvbmZpZ3VyZV90eChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1aW50NjRfdCB0ZGJhID0gYWRhcHRlci0+dHhfcmluZy5kbWE7CisJdWludDMyX3QgdGRsZW4gPSBhZGFwdGVyLT50eF9yaW5nLmNvdW50ICogc2l6ZW9mKHN0cnVjdCBlMTAwMF90eF9kZXNjKTsKKwl1aW50MzJfdCB0Y3RsLCB0aXBnOworCisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgVERCQUwsICh0ZGJhICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKSk7CisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgVERCQUgsICh0ZGJhID4+IDMyKSk7CisKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBURExFTiwgdGRsZW4pOworCisJLyogU2V0dXAgdGhlIEhXIFR4IEhlYWQgYW5kIFRhaWwgZGVzY3JpcHRvciBwb2ludGVycyAqLworCisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgVERILCAwKTsKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBURFQsIDApOworCisJLyogU2V0IHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIFR4IEludGVyIFBhY2tldCBHYXAgdGltZXIgKi8KKworCXN3aXRjaCAoYWRhcHRlci0+aHcubWFjX3R5cGUpIHsKKwljYXNlIGUxMDAwXzgyNTQyX3JldjJfMDoKKwljYXNlIGUxMDAwXzgyNTQyX3JldjJfMToKKwkJdGlwZyA9IERFRkFVTFRfODI1NDJfVElQR19JUEdUOworCQl0aXBnIHw9IERFRkFVTFRfODI1NDJfVElQR19JUEdSMSA8PCBFMTAwMF9USVBHX0lQR1IxX1NISUZUOworCQl0aXBnIHw9IERFRkFVTFRfODI1NDJfVElQR19JUEdSMiA8PCBFMTAwMF9USVBHX0lQR1IyX1NISUZUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZihhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfZmliZXIgfHwKKwkJICAgYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykKKwkJCXRpcGcgPSBERUZBVUxUXzgyNTQzX1RJUEdfSVBHVF9GSUJFUjsKKwkJZWxzZQorCQkJdGlwZyA9IERFRkFVTFRfODI1NDNfVElQR19JUEdUX0NPUFBFUjsKKwkJdGlwZyB8PSBERUZBVUxUXzgyNTQzX1RJUEdfSVBHUjEgPDwgRTEwMDBfVElQR19JUEdSMV9TSElGVDsKKwkJdGlwZyB8PSBERUZBVUxUXzgyNTQzX1RJUEdfSVBHUjIgPDwgRTEwMDBfVElQR19JUEdSMl9TSElGVDsKKwl9CisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgVElQRywgdGlwZyk7CisKKwkvKiBTZXQgdGhlIFR4IEludGVycnVwdCBEZWxheSByZWdpc3RlciAqLworCisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgVElEViwgYWRhcHRlci0+dHhfaW50X2RlbGF5KTsKKwlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MCkKKwkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgVEFEViwgYWRhcHRlci0+dHhfYWJzX2ludF9kZWxheSk7CisKKwkvKiBQcm9ncmFtIHRoZSBUcmFuc21pdCBDb250cm9sIFJlZ2lzdGVyICovCisKKwl0Y3RsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBUQ1RMKTsKKworCXRjdGwgJj0gfkUxMDAwX1RDVExfQ1Q7CisJdGN0bCB8PSBFMTAwMF9UQ1RMX0VOIHwgRTEwMDBfVENUTF9QU1AgfAorCQkoRTEwMDBfQ09MTElTSU9OX1RIUkVTSE9MRCA8PCBFMTAwMF9DVF9TSElGVCk7CisKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBUQ1RMLCB0Y3RsKTsKKworCWUxMDAwX2NvbmZpZ19jb2xsaXNpb25fZGlzdCgmYWRhcHRlci0+aHcpOworCisJLyogU2V0dXAgVHJhbnNtaXQgRGVzY3JpcHRvciBTZXR0aW5ncyBmb3IgZW9wIGRlc2NyaXB0b3IgKi8KKwlhZGFwdGVyLT50eGRfY21kID0gRTEwMDBfVFhEX0NNRF9JREUgfCBFMTAwMF9UWERfQ01EX0VPUCB8CisJCUUxMDAwX1RYRF9DTURfSUZDUzsKKworCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlIDwgZTEwMDBfODI1NDMpCisJCWFkYXB0ZXItPnR4ZF9jbWQgfD0gRTEwMDBfVFhEX0NNRF9SUFM7CisJZWxzZQorCQlhZGFwdGVyLT50eGRfY21kIHw9IEUxMDAwX1RYRF9DTURfUlM7CisKKwkvKiBDYWNoZSBpZiB3ZSdyZSA4MjU0NCBydW5uaW5nIGluIFBDSS1YIGJlY2F1c2Ugd2UnbGwKKwkgKiBuZWVkIHRoaXMgdG8gYXBwbHkgYSB3b3JrYXJvdW5kIGxhdGVyIGluIHRoZSBzZW5kIHBhdGguICovCisJaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NDQgJiYKKwkgICBhZGFwdGVyLT5ody5idXNfdHlwZSA9PSBlMTAwMF9idXNfdHlwZV9wY2l4KQorCQlhZGFwdGVyLT5wY2l4XzgyNTQ0ID0gMTsKK30KKworLyoqCisgKiBlMTAwMF9zZXR1cF9yeF9yZXNvdXJjZXMgLSBhbGxvY2F0ZSBSeCByZXNvdXJjZXMgKERlc2NyaXB0b3JzKQorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqKi8KKworaW50CitlMTAwMF9zZXR1cF9yeF9yZXNvdXJjZXMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyAqcnhkciA9ICZhZGFwdGVyLT5yeF9yaW5nOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKwlpbnQgc2l6ZTsKKworCXNpemUgPSBzaXplb2Yoc3RydWN0IGUxMDAwX2J1ZmZlcikgKiByeGRyLT5jb3VudDsKKwlyeGRyLT5idWZmZXJfaW5mbyA9IHZtYWxsb2Moc2l6ZSk7CisJaWYoIXJ4ZHItPmJ1ZmZlcl9pbmZvKSB7CisJCURQUklOVEsoUFJPQkUsIEVSUiwgCisJCSJVbmFibGUgdG8gQWxsb2NhdGUgTWVtb3J5IGZvciB0aGUgUmVjaWV2ZSBkZXNjcmlwdG9yIHJpbmdcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHJ4ZHItPmJ1ZmZlcl9pbmZvLCAwLCBzaXplKTsKKworCS8qIFJvdW5kIHVwIHRvIG5lYXJlc3QgNEsgKi8KKworCXJ4ZHItPnNpemUgPSByeGRyLT5jb3VudCAqIHNpemVvZihzdHJ1Y3QgZTEwMDBfcnhfZGVzYyk7CisJRTEwMDBfUk9VTkRVUChyeGRyLT5zaXplLCA0MDk2KTsKKworCXJ4ZHItPmRlc2MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCByeGRyLT5zaXplLCAmcnhkci0+ZG1hKTsKKworCWlmKCFyeGRyLT5kZXNjKSB7CitzZXR1cF9yeF9kZXNjX2RpZToKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAKKwkJIlVuYmxlIHRvIEFsbG9jYXRlIE1lbW9yeSBmb3IgdGhlIFJlY2lldmUgZGVzY3JpcHRvciByaW5nXG4iKTsKKwkJdmZyZWUocnhkci0+YnVmZmVyX2luZm8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBmaXggZm9yIGVycmF0YSAyMywgY2FudCBjcm9zcyA2NGtCIGJvdW5kYXJ5ICovCisJaWYgKCFlMTAwMF9jaGVja182NGtfYm91bmQoYWRhcHRlciwgcnhkci0+ZGVzYywgcnhkci0+c2l6ZSkpIHsKKwkJdm9pZCAqb2xkZGVzYyA9IHJ4ZHItPmRlc2M7CisJCWRtYV9hZGRyX3Qgb2xkZG1hID0gcnhkci0+ZG1hOworCQlEUFJJTlRLKFJYX0VSUixFUlIsCisJCQkicnhkciBhbGlnbiBjaGVjayBmYWlsZWQ6ICV1IGJ5dGVzIGF0ICVwXG4iLAorCQkJcnhkci0+c2l6ZSwgcnhkci0+ZGVzYyk7CisJCS8qIHRyeSBhZ2Fpbiwgd2l0aG91dCBmcmVlaW5nIHRoZSBwcmV2aW91cyAqLworCQlyeGRyLT5kZXNjID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgcnhkci0+c2l6ZSwgJnJ4ZHItPmRtYSk7CisJCS8qIGZhaWxlZCBhbGxvY2F0aW9uLCBjcml0aWFsIGZhaWx1cmUgKi8KKwkJaWYoIXJ4ZHItPmRlc2MpIHsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgcnhkci0+c2l6ZSwgb2xkZGVzYywgb2xkZG1hKTsKKwkJCWdvdG8gc2V0dXBfcnhfZGVzY19kaWU7CisJCX0KKworCQlpZiAoIWUxMDAwX2NoZWNrXzY0a19ib3VuZChhZGFwdGVyLCByeGRyLT5kZXNjLCByeGRyLT5zaXplKSkgeworCQkJLyogZ2l2ZSB1cCAqLworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCByeGRyLT5zaXplLAorCQkJICAgICByeGRyLT5kZXNjLCByeGRyLT5kbWEpOworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCByeGRyLT5zaXplLCBvbGRkZXNjLCBvbGRkbWEpOworCQkJRFBSSU5USyhQUk9CRSwgRVJSLCAKKwkJCQkiVW5hYmxlIHRvIEFsbG9jYXRlIGFsaWduZWQgTWVtb3J5IGZvciB0aGUiCisJCQkJIiBSZWNlaXZlIGRlc2NyaXB0b3IgcmluZ1xuIik7CisJCQl2ZnJlZShyeGRyLT5idWZmZXJfaW5mbyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfSBlbHNlIHsKKwkJCS8qIGZyZWUgb2xkLCBtb3ZlIG9uIHdpdGggdGhlIG5ldyBvbmUgc2luY2UgaXRzIG9rYXkgKi8KKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgcnhkci0+c2l6ZSwgb2xkZGVzYywgb2xkZG1hKTsKKwkJfQorCX0KKwltZW1zZXQocnhkci0+ZGVzYywgMCwgcnhkci0+c2l6ZSk7CisKKwlyeGRyLT5uZXh0X3RvX2NsZWFuID0gMDsKKwlyeGRyLT5uZXh0X3RvX3VzZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBlMTAwMF9zZXR1cF9yY3RsIC0gY29uZmlndXJlIHRoZSByZWNlaXZlIGNvbnRyb2wgcmVnaXN0ZXIKKyAqIEBhZGFwdGVyOiBCb2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoqLworCitzdGF0aWMgdm9pZAorZTEwMDBfc2V0dXBfcmN0bChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1aW50MzJfdCByY3RsOworCisJcmN0bCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkNUTCk7CisKKwlyY3RsICY9IH4oMyA8PCBFMTAwMF9SQ1RMX01PX1NISUZUKTsKKworCXJjdGwgfD0gRTEwMDBfUkNUTF9FTiB8IEUxMDAwX1JDVExfQkFNIHwKKwkJRTEwMDBfUkNUTF9MQk1fTk8gfCBFMTAwMF9SQ1RMX1JETVRTX0hBTEYgfAorCQkoYWRhcHRlci0+aHcubWNfZmlsdGVyX3R5cGUgPDwgRTEwMDBfUkNUTF9NT19TSElGVCk7CisKKwlpZihhZGFwdGVyLT5ody50YmlfY29tcGF0aWJpbGl0eV9vbiA9PSAxKQorCQlyY3RsIHw9IEUxMDAwX1JDVExfU0JQOworCWVsc2UKKwkJcmN0bCAmPSB+RTEwMDBfUkNUTF9TQlA7CisKKwkvKiBTZXR1cCBidWZmZXIgc2l6ZXMgKi8KKwlyY3RsICY9IH4oRTEwMDBfUkNUTF9TWl80MDk2KTsKKwlyY3RsIHw9IChFMTAwMF9SQ1RMX0JTRVggfCBFMTAwMF9SQ1RMX0xQRSk7CisJc3dpdGNoIChhZGFwdGVyLT5yeF9idWZmZXJfbGVuKSB7CisJY2FzZSBFMTAwMF9SWEJVRkZFUl8yMDQ4OgorCWRlZmF1bHQ6CisJCXJjdGwgfD0gRTEwMDBfUkNUTF9TWl8yMDQ4OworCQlyY3RsICY9IH4oRTEwMDBfUkNUTF9CU0VYIHwgRTEwMDBfUkNUTF9MUEUpOworCQlicmVhazsKKwljYXNlIEUxMDAwX1JYQlVGRkVSXzQwOTY6CisJCXJjdGwgfD0gRTEwMDBfUkNUTF9TWl80MDk2OworCQlicmVhazsKKwljYXNlIEUxMDAwX1JYQlVGRkVSXzgxOTI6CisJCXJjdGwgfD0gRTEwMDBfUkNUTF9TWl84MTkyOworCQlicmVhazsKKwljYXNlIEUxMDAwX1JYQlVGRkVSXzE2Mzg0OgorCQlyY3RsIHw9IEUxMDAwX1JDVExfU1pfMTYzODQ7CisJCWJyZWFrOworCX0KKworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJDVEwsIHJjdGwpOworfQorCisvKioKKyAqIGUxMDAwX2NvbmZpZ3VyZV9yeCAtIENvbmZpZ3VyZSA4MjU0eCBSZWNlaXZlIFVuaXQgYWZ0ZXIgUmVzZXQKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIENvbmZpZ3VyZSB0aGUgUnggdW5pdCBvZiB0aGUgTUFDIGFmdGVyIGEgcmVzZXQuCisgKiovCisKK3N0YXRpYyB2b2lkCitlMTAwMF9jb25maWd1cmVfcngoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdWludDY0X3QgcmRiYSA9IGFkYXB0ZXItPnJ4X3JpbmcuZG1hOworCXVpbnQzMl90IHJkbGVuID0gYWRhcHRlci0+cnhfcmluZy5jb3VudCAqIHNpemVvZihzdHJ1Y3QgZTEwMDBfcnhfZGVzYyk7CisJdWludDMyX3QgcmN0bDsKKwl1aW50MzJfdCByeGNzdW07CisKKwkvKiBkaXNhYmxlIHJlY2VpdmVzIHdoaWxlIHNldHRpbmcgdXAgdGhlIGRlc2NyaXB0b3JzICovCisJcmN0bCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkNUTCk7CisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkNUTCwgcmN0bCAmIH5FMTAwMF9SQ1RMX0VOKTsKKworCS8qIHNldCB0aGUgUmVjZWl2ZSBEZWxheSBUaW1lciBSZWdpc3RlciAqLworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJEVFIsIGFkYXB0ZXItPnJ4X2ludF9kZWxheSk7CisKKwlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MCkgeworCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSQURWLCBhZGFwdGVyLT5yeF9hYnNfaW50X2RlbGF5KTsKKwkJaWYoYWRhcHRlci0+aXRyID4gMSkKKwkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElUUiwKKwkJCQkxMDAwMDAwMDAwIC8gKGFkYXB0ZXItPml0ciAqIDI1NikpOworCX0KKworCS8qIFNldHVwIHRoZSBCYXNlIGFuZCBMZW5ndGggb2YgdGhlIFJ4IERlc2NyaXB0b3IgUmluZyAqLworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJEQkFMLCAocmRiYSAmIDB4MDAwMDAwMDBmZmZmZmZmZlVMTCkpOworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJEQkFILCAocmRiYSA+PiAzMikpOworCisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkRMRU4sIHJkbGVuKTsKKworCS8qIFNldHVwIHRoZSBIVyBSeCBIZWFkIGFuZCBUYWlsIERlc2NyaXB0b3IgUG9pbnRlcnMgKi8KKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSREgsIDApOworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJEVCwgMCk7CisKKwkvKiBFbmFibGUgODI1NDMgUmVjZWl2ZSBDaGVja3N1bSBPZmZsb2FkIGZvciBUQ1AgYW5kIFVEUCAqLworCWlmKChhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0MykgJiYKKwkgICAoYWRhcHRlci0+cnhfY3N1bSA9PSBUUlVFKSkgeworCQlyeGNzdW0gPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJYQ1NVTSk7CisJCXJ4Y3N1bSB8PSBFMTAwMF9SWENTVU1fVFVPRkw7CisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJYQ1NVTSwgcnhjc3VtKTsKKwl9CisKKwkvKiBFbmFibGUgUmVjZWl2ZXMgKi8KKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMLCByY3RsKTsKK30KKworLyoqCisgKiBlMTAwMF9mcmVlX3R4X3Jlc291cmNlcyAtIEZyZWUgVHggUmVzb3VyY2VzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBGcmVlIGFsbCB0cmFuc21pdCBzb2Z0d2FyZSByZXNvdXJjZXMKKyAqKi8KKwordm9pZAorZTEwMDBfZnJlZV90eF9yZXNvdXJjZXMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCisJZTEwMDBfY2xlYW5fdHhfcmluZyhhZGFwdGVyKTsKKworCXZmcmVlKGFkYXB0ZXItPnR4X3JpbmcuYnVmZmVyX2luZm8pOworCWFkYXB0ZXItPnR4X3JpbmcuYnVmZmVyX2luZm8gPSBOVUxMOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBhZGFwdGVyLT50eF9yaW5nLnNpemUsCisJICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLT50eF9yaW5nLmRlc2MsIGFkYXB0ZXItPnR4X3JpbmcuZG1hKTsKKworCWFkYXB0ZXItPnR4X3JpbmcuZGVzYyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZTEwMDBfdW5tYXBfYW5kX2ZyZWVfdHhfcmVzb3VyY2Uoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQlzdHJ1Y3QgZTEwMDBfYnVmZmVyICpidWZmZXJfaW5mbykKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisKKwlpZihidWZmZXJfaW5mby0+ZG1hKSB7CisJCXBjaV91bm1hcF9wYWdlKHBkZXYsCisJCQkgICAgICAgYnVmZmVyX2luZm8tPmRtYSwKKwkJCSAgICAgICBidWZmZXJfaW5mby0+bGVuZ3RoLAorCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlidWZmZXJfaW5mby0+ZG1hID0gMDsKKwl9CisJaWYoYnVmZmVyX2luZm8tPnNrYikgeworCQlkZXZfa2ZyZWVfc2tiX2FueShidWZmZXJfaW5mby0+c2tiKTsKKwkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7CisJfQorfQorCisvKioKKyAqIGUxMDAwX2NsZWFuX3R4X3JpbmcgLSBGcmVlIFR4IEJ1ZmZlcnMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoqLworCitzdGF0aWMgdm9pZAorZTEwMDBfY2xlYW5fdHhfcmluZyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nICp0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3Jpbmc7CisJc3RydWN0IGUxMDAwX2J1ZmZlciAqYnVmZmVyX2luZm87CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGludCBpOworCisJLyogRnJlZSBhbGwgdGhlIFR4IHJpbmcgc2tfYnVmZnMgKi8KKworCWlmIChsaWtlbHkoYWRhcHRlci0+cHJldmlvdXNfYnVmZmVyX2luZm8uc2tiICE9IE5VTEwpKSB7CisJCWUxMDAwX3VubWFwX2FuZF9mcmVlX3R4X3Jlc291cmNlKGFkYXB0ZXIsIAorCQkJCSZhZGFwdGVyLT5wcmV2aW91c19idWZmZXJfaW5mbyk7CisJfQorCisJZm9yKGkgPSAwOyBpIDwgdHhfcmluZy0+Y291bnQ7IGkrKykgeworCQlidWZmZXJfaW5mbyA9ICZ0eF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKwkJZTEwMDBfdW5tYXBfYW5kX2ZyZWVfdHhfcmVzb3VyY2UoYWRhcHRlciwgYnVmZmVyX2luZm8pOworCX0KKworCXNpemUgPSBzaXplb2Yoc3RydWN0IGUxMDAwX2J1ZmZlcikgKiB0eF9yaW5nLT5jb3VudDsKKwltZW1zZXQodHhfcmluZy0+YnVmZmVyX2luZm8sIDAsIHNpemUpOworCisJLyogWmVybyBvdXQgdGhlIGRlc2NyaXB0b3IgcmluZyAqLworCisJbWVtc2V0KHR4X3JpbmctPmRlc2MsIDAsIHR4X3JpbmctPnNpemUpOworCisJdHhfcmluZy0+bmV4dF90b191c2UgPSAwOworCXR4X3JpbmctPm5leHRfdG9fY2xlYW4gPSAwOworCisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgVERILCAwKTsKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBURFQsIDApOworfQorCisvKioKKyAqIGUxMDAwX2ZyZWVfcnhfcmVzb3VyY2VzIC0gRnJlZSBSeCBSZXNvdXJjZXMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIEZyZWUgYWxsIHJlY2VpdmUgc29mdHdhcmUgcmVzb3VyY2VzCisgKiovCisKK3ZvaWQKK2UxMDAwX2ZyZWVfcnhfcmVzb3VyY2VzKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBlMTAwMF9kZXNjX3JpbmcgKnJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZzsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisKKwllMTAwMF9jbGVhbl9yeF9yaW5nKGFkYXB0ZXIpOworCisJdmZyZWUocnhfcmluZy0+YnVmZmVyX2luZm8pOworCXJ4X3JpbmctPmJ1ZmZlcl9pbmZvID0gTlVMTDsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgcnhfcmluZy0+c2l6ZSwgcnhfcmluZy0+ZGVzYywgcnhfcmluZy0+ZG1hKTsKKworCXJ4X3JpbmctPmRlc2MgPSBOVUxMOworfQorCisvKioKKyAqIGUxMDAwX2NsZWFuX3J4X3JpbmcgLSBGcmVlIFJ4IEJ1ZmZlcnMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoqLworCitzdGF0aWMgdm9pZAorZTEwMDBfY2xlYW5fcnhfcmluZyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nICpyeF9yaW5nID0gJmFkYXB0ZXItPnJ4X3Jpbmc7CisJc3RydWN0IGUxMDAwX2J1ZmZlciAqYnVmZmVyX2luZm87CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIEZyZWUgYWxsIHRoZSBSeCByaW5nIHNrX2J1ZmZzICovCisKKwlmb3IoaSA9IDA7IGkgPCByeF9yaW5nLT5jb3VudDsgaSsrKSB7CisJCWJ1ZmZlcl9pbmZvID0gJnJ4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOworCQlpZihidWZmZXJfaW5mby0+c2tiKSB7CisKKwkJCXBjaV91bm1hcF9zaW5nbGUocGRldiwKKwkJCQkJIGJ1ZmZlcl9pbmZvLT5kbWEsCisJCQkJCSBidWZmZXJfaW5mby0+bGVuZ3RoLAorCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJZGV2X2tmcmVlX3NrYihidWZmZXJfaW5mby0+c2tiKTsKKwkJCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOworCQl9CisJfQorCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfYnVmZmVyKSAqIHJ4X3JpbmctPmNvdW50OworCW1lbXNldChyeF9yaW5nLT5idWZmZXJfaW5mbywgMCwgc2l6ZSk7CisKKwkvKiBaZXJvIG91dCB0aGUgZGVzY3JpcHRvciByaW5nICovCisKKwltZW1zZXQocnhfcmluZy0+ZGVzYywgMCwgcnhfcmluZy0+c2l6ZSk7CisKKwlyeF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gMDsKKwlyeF9yaW5nLT5uZXh0X3RvX3VzZSA9IDA7CisKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSREgsIDApOworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJEVCwgMCk7Cit9CisKKy8qIFRoZSA4MjU0MiAyLjAgKHJldmlzaW9uIDIpIG5lZWRzIHRvIGhhdmUgdGhlIHJlY2VpdmUgdW5pdCBpbiByZXNldAorICogYW5kIG1lbW9yeSB3cml0ZSBhbmQgaW52YWxpZGF0ZSBkaXNhYmxlZCBmb3IgY2VydGFpbiBvcGVyYXRpb25zCisgKi8KK3N0YXRpYyB2b2lkCitlMTAwMF9lbnRlcl84MjU0Ml9yc3Qoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwl1aW50MzJfdCByY3RsOworCisJZTEwMDBfcGNpX2NsZWFyX213aSgmYWRhcHRlci0+aHcpOworCisJcmN0bCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkNUTCk7CisJcmN0bCB8PSBFMTAwMF9SQ1RMX1JTVDsKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMLCByY3RsKTsKKwlFMTAwMF9XUklURV9GTFVTSCgmYWRhcHRlci0+aHcpOworCW1kZWxheSg1KTsKKworCWlmKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJZTEwMDBfY2xlYW5fcnhfcmluZyhhZGFwdGVyKTsKK30KKworc3RhdGljIHZvaWQKK2UxMDAwX2xlYXZlXzgyNTQyX3JzdChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXVpbnQzMl90IHJjdGw7CisKKwlyY3RsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMKTsKKwlyY3RsICY9IH5FMTAwMF9SQ1RMX1JTVDsKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMLCByY3RsKTsKKwlFMTAwMF9XUklURV9GTFVTSCgmYWRhcHRlci0+aHcpOworCW1kZWxheSg1KTsKKworCWlmKGFkYXB0ZXItPmh3LnBjaV9jbWRfd29yZCAmIFBDSV9DT01NQU5EX0lOVkFMSURBVEUpCisJCWUxMDAwX3BjaV9zZXRfbXdpKCZhZGFwdGVyLT5odyk7CisKKwlpZihuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKKwkJZTEwMDBfY29uZmlndXJlX3J4KGFkYXB0ZXIpOworCQllMTAwMF9hbGxvY19yeF9idWZmZXJzKGFkYXB0ZXIpOworCX0KK30KKworLyoqCisgKiBlMTAwMF9zZXRfbWFjIC0gQ2hhbmdlIHRoZSBFdGhlcm5ldCBBZGRyZXNzIG9mIHRoZSBOSUMKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBwOiBwb2ludGVyIHRvIGFuIGFkZHJlc3Mgc3RydWN0dXJlCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqKi8KKworc3RhdGljIGludAorZTEwMDBfc2V0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpwKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisKKwlpZighaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkKKwkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCisJLyogODI1NDIgMi4wIG5lZWRzIHRvIGJlIGluIHJlc2V0IHRvIHdyaXRlIHJlY2VpdmUgYWRkcmVzcyByZWdpc3RlcnMgKi8KKworCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlID09IGUxMDAwXzgyNTQyX3JldjJfMCkKKwkJZTEwMDBfZW50ZXJfODI1NDJfcnN0KGFkYXB0ZXIpOworCisJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIG5ldGRldi0+YWRkcl9sZW4pOworCW1lbWNweShhZGFwdGVyLT5ody5tYWNfYWRkciwgYWRkci0+c2FfZGF0YSwgbmV0ZGV2LT5hZGRyX2xlbik7CisKKwllMTAwMF9yYXJfc2V0KCZhZGFwdGVyLT5odywgYWRhcHRlci0+aHcubWFjX2FkZHIsIDApOworCisJaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKQorCQllMTAwMF9sZWF2ZV84MjU0Ml9yc3QoYWRhcHRlcik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBlMTAwMF9zZXRfbXVsdGkgLSBNdWx0aWNhc3QgYW5kIFByb21pc2N1b3VzIG1vZGUgc2V0CisgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogVGhlIHNldF9tdWx0aSBlbnRyeSBwb2ludCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIG11bHRpY2FzdCBhZGRyZXNzCisgKiBsaXN0IG9yIHRoZSBuZXR3b3JrIGludGVyZmFjZSBmbGFncyBhcmUgdXBkYXRlZC4gIFRoaXMgcm91dGluZSBpcworICogcmVzcG9uc2libGUgZm9yIGNvbmZpZ3VyaW5nIHRoZSBoYXJkd2FyZSBmb3IgcHJvcGVyIG11bHRpY2FzdCwKKyAqIHByb21pc2N1b3VzIG1vZGUsIGFuZCBhbGwtbXVsdGkgYmVoYXZpb3IuCisgKiovCisKK3N0YXRpYyB2b2lkCitlMTAwMF9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNfcHRyOworCXVpbnQzMl90IHJjdGw7CisJdWludDMyX3QgaGFzaF92YWx1ZTsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogQ2hlY2sgZm9yIFByb21pc2N1b3VzIGFuZCBBbGwgTXVsdGljYXN0IG1vZGVzICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+dHhfbG9jaywgZmxhZ3MpOworCisJcmN0bCA9IEUxMDAwX1JFQURfUkVHKGh3LCBSQ1RMKTsKKworCWlmKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQlyY3RsIHw9IChFMTAwMF9SQ1RMX1VQRSB8IEUxMDAwX1JDVExfTVBFKTsKKwl9IGVsc2UgaWYobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQlyY3RsIHw9IEUxMDAwX1JDVExfTVBFOworCQlyY3RsICY9IH5FMTAwMF9SQ1RMX1VQRTsKKwl9IGVsc2UgeworCQlyY3RsICY9IH4oRTEwMDBfUkNUTF9VUEUgfCBFMTAwMF9SQ1RMX01QRSk7CisJfQorCisJRTEwMDBfV1JJVEVfUkVHKGh3LCBSQ1RMLCByY3RsKTsKKworCS8qIDgyNTQyIDIuMCBuZWVkcyB0byBiZSBpbiByZXNldCB0byB3cml0ZSByZWNlaXZlIGFkZHJlc3MgcmVnaXN0ZXJzICovCisKKwlpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKQorCQllMTAwMF9lbnRlcl84MjU0Ml9yc3QoYWRhcHRlcik7CisKKwkvKiBsb2FkIHRoZSBmaXJzdCAxNCBtdWx0aWNhc3QgYWRkcmVzcyBpbnRvIHRoZSBleGFjdCBmaWx0ZXJzIDEtMTQKKwkgKiBSQVIgMCBpcyB1c2VkIGZvciB0aGUgc3RhdGlvbiBNQUMgYWRkZHJlc3MKKwkgKiBpZiB0aGVyZSBhcmUgbm90IDE0IGFkZHJlc3NlcywgZ28gYWhlYWQgYW5kIGNsZWFyIHRoZSBmaWx0ZXJzCisJICovCisJbWNfcHRyID0gbmV0ZGV2LT5tY19saXN0OworCisJZm9yKGkgPSAxOyBpIDwgRTEwMDBfUkFSX0VOVFJJRVM7IGkrKykgeworCQlpZihtY19wdHIpIHsKKwkJCWUxMDAwX3Jhcl9zZXQoaHcsIG1jX3B0ci0+ZG1pX2FkZHIsIGkpOworCQkJbWNfcHRyID0gbWNfcHRyLT5uZXh0OworCQl9IGVsc2UgeworCQkJRTEwMDBfV1JJVEVfUkVHX0FSUkFZKGh3LCBSQSwgaSA8PCAxLCAwKTsKKwkJCUUxMDAwX1dSSVRFX1JFR19BUlJBWShodywgUkEsIChpIDw8IDEpICsgMSwgMCk7CisJCX0KKwl9CisKKwkvKiBjbGVhciB0aGUgb2xkIHNldHRpbmdzIGZyb20gdGhlIG11bHRpY2FzdCBoYXNoIHRhYmxlICovCisKKwlmb3IoaSA9IDA7IGkgPCBFMTAwMF9OVU1fTVRBX1JFR0lTVEVSUzsgaSsrKQorCQlFMTAwMF9XUklURV9SRUdfQVJSQVkoaHcsIE1UQSwgaSwgMCk7CisKKwkvKiBsb2FkIGFueSByZW1haW5pbmcgYWRkcmVzc2VzIGludG8gdGhlIGhhc2ggdGFibGUgKi8KKworCWZvcig7IG1jX3B0cjsgbWNfcHRyID0gbWNfcHRyLT5uZXh0KSB7CisJCWhhc2hfdmFsdWUgPSBlMTAwMF9oYXNoX21jX2FkZHIoaHcsIG1jX3B0ci0+ZG1pX2FkZHIpOworCQllMTAwMF9tdGFfc2V0KGh3LCBoYXNoX3ZhbHVlKTsKKwl9CisKKwlpZihody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDJfcmV2Ml8wKQorCQllMTAwMF9sZWF2ZV84MjU0Ml9yc3QoYWRhcHRlcik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT50eF9sb2NrLCBmbGFncyk7Cit9CisKKy8qIE5lZWQgdG8gd2FpdCBhIGZldyBzZWNvbmRzIGFmdGVyIGxpbmsgdXAgdG8gZ2V0IGRpYWdub3N0aWMgaW5mb3JtYXRpb24gZnJvbQorICogdGhlIHBoeSAqLworCitzdGF0aWMgdm9pZAorZTEwMDBfdXBkYXRlX3BoeV9pbmZvKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqKSBkYXRhOworCWUxMDAwX3BoeV9nZXRfaW5mbygmYWRhcHRlci0+aHcsICZhZGFwdGVyLT5waHlfaW5mbyk7Cit9CisKKy8qKgorICogZTEwMDBfODI1NDdfdHhfZmlmb19zdGFsbCAtIFRpbWVyIENhbGwtYmFjaworICogQGRhdGE6IHBvaW50ZXIgdG8gYWRhcHRlciBjYXN0IGludG8gYW4gdW5zaWduZWQgbG9uZworICoqLworCitzdGF0aWMgdm9pZAorZTEwMDBfODI1NDdfdHhfZmlmb19zdGFsbCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKikgZGF0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXVpbnQzMl90IHRjdGw7CisKKwlpZihhdG9taWNfcmVhZCgmYWRhcHRlci0+dHhfZmlmb19zdGFsbCkpIHsKKwkJaWYoKEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVERUKSA9PQorCQkgICAgRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBUREgpKSAmJgorCQkgICAoRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBUREZUKSA9PQorCQkgICAgRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBUREZIKSkgJiYKKwkJICAgKEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVERGVFMpID09CisJCSAgICBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFRERkhTKSkpIHsKKwkJCXRjdGwgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFRDVEwpOworCQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgVENUTCwKKwkJCQkJdGN0bCAmIH5FMTAwMF9UQ1RMX0VOKTsKKwkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFRERlQsCisJCQkJCWFkYXB0ZXItPnR4X2hlYWRfYWRkcik7CisJCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBUREZILAorCQkJCQlhZGFwdGVyLT50eF9oZWFkX2FkZHIpOworCQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgVERGVFMsCisJCQkJCWFkYXB0ZXItPnR4X2hlYWRfYWRkcik7CisJCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBUREZIUywKKwkJCQkJYWRhcHRlci0+dHhfaGVhZF9hZGRyKTsKKwkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFRDVEwsIHRjdGwpOworCQkJRTEwMDBfV1JJVEVfRkxVU0goJmFkYXB0ZXItPmh3KTsKKworCQkJYWRhcHRlci0+dHhfZmlmb19oZWFkID0gMDsKKwkJCWF0b21pY19zZXQoJmFkYXB0ZXItPnR4X2ZpZm9fc3RhbGwsIDApOworCQkJbmV0aWZfd2FrZV9xdWV1ZShuZXRkZXYpOworCQl9IGVsc2UgeworCQkJbW9kX3RpbWVyKCZhZGFwdGVyLT50eF9maWZvX3N0YWxsX3RpbWVyLCBqaWZmaWVzICsgMSk7CisJCX0KKwl9Cit9CisKKy8qKgorICogZTEwMDBfd2F0Y2hkb2cgLSBUaW1lciBDYWxsLWJhY2sKKyAqIEBkYXRhOiBwb2ludGVyIHRvIGFkYXB0ZXIgY2FzdCBpbnRvIGFuIHVuc2lnbmVkIGxvbmcKKyAqKi8KK3N0YXRpYyB2b2lkCitlMTAwMF93YXRjaGRvZyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKikgZGF0YTsKKworCS8qIERvIHRoZSByZXN0IG91dHNpZGUgb2YgaW50ZXJydXB0IGNvbnRleHQgKi8KKwlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT53YXRjaGRvZ190YXNrKTsKK30KKworc3RhdGljIHZvaWQKK2UxMDAwX3dhdGNoZG9nX3Rhc2soc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nICp0eGRyID0gJmFkYXB0ZXItPnR4X3Jpbmc7CisJdWludDMyX3QgbGluazsKKworCWUxMDAwX2NoZWNrX2Zvcl9saW5rKCZhZGFwdGVyLT5odyk7CisKKwlpZigoYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlcykgJiYKKwkgICAhKEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVFhDVykgJiBFMTAwMF9UWENXX0FORSkpCisJCWxpbmsgPSAhYWRhcHRlci0+aHcuc2VyZGVzX2xpbmtfZG93bjsKKwllbHNlCisJCWxpbmsgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfTFU7CisKKwlpZihsaW5rKSB7CisJCWlmKCFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKKwkJCWUxMDAwX2dldF9zcGVlZF9hbmRfZHVwbGV4KCZhZGFwdGVyLT5odywKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZGFwdGVyLT5saW5rX3NwZWVkLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkYXB0ZXItPmxpbmtfZHVwbGV4KTsKKworCQkJRFBSSU5USyhMSU5LLCBJTkZPLCAiTklDIExpbmsgaXMgVXAgJWQgTWJwcyAlc1xuIiwKKwkJCSAgICAgICBhZGFwdGVyLT5saW5rX3NwZWVkLAorCQkJICAgICAgIGFkYXB0ZXItPmxpbmtfZHVwbGV4ID09IEZVTExfRFVQTEVYID8KKwkJCSAgICAgICAiRnVsbCBEdXBsZXgiIDogIkhhbGYgRHVwbGV4Iik7CisKKwkJCW5ldGlmX2NhcnJpZXJfb24obmV0ZGV2KTsKKwkJCW5ldGlmX3dha2VfcXVldWUobmV0ZGV2KTsKKwkJCW1vZF90aW1lcigmYWRhcHRlci0+cGh5X2luZm9fdGltZXIsIGppZmZpZXMgKyAyICogSFopOworCQkJYWRhcHRlci0+c21hcnRzcGVlZCA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlpZihuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKKwkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSAwOworCQkJYWRhcHRlci0+bGlua19kdXBsZXggPSAwOworCQkJRFBSSU5USyhMSU5LLCBJTkZPLCAiTklDIExpbmsgaXMgRG93blxuIik7CisJCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCQkJbW9kX3RpbWVyKCZhZGFwdGVyLT5waHlfaW5mb190aW1lciwgamlmZmllcyArIDIgKiBIWik7CisJCX0KKworCQllMTAwMF9zbWFydHNwZWVkKGFkYXB0ZXIpOworCX0KKworCWUxMDAwX3VwZGF0ZV9zdGF0cyhhZGFwdGVyKTsKKworCWFkYXB0ZXItPmh3LnR4X3BhY2tldF9kZWx0YSA9IGFkYXB0ZXItPnN0YXRzLnRwdCAtIGFkYXB0ZXItPnRwdF9vbGQ7CisJYWRhcHRlci0+dHB0X29sZCA9IGFkYXB0ZXItPnN0YXRzLnRwdDsKKwlhZGFwdGVyLT5ody5jb2xsaXNpb25fZGVsdGEgPSBhZGFwdGVyLT5zdGF0cy5jb2xjIC0gYWRhcHRlci0+Y29sY19vbGQ7CisJYWRhcHRlci0+Y29sY19vbGQgPSBhZGFwdGVyLT5zdGF0cy5jb2xjOworCisJYWRhcHRlci0+Z29yY2wgPSBhZGFwdGVyLT5zdGF0cy5nb3JjbCAtIGFkYXB0ZXItPmdvcmNsX29sZDsKKwlhZGFwdGVyLT5nb3JjbF9vbGQgPSBhZGFwdGVyLT5zdGF0cy5nb3JjbDsKKwlhZGFwdGVyLT5nb3RjbCA9IGFkYXB0ZXItPnN0YXRzLmdvdGNsIC0gYWRhcHRlci0+Z290Y2xfb2xkOworCWFkYXB0ZXItPmdvdGNsX29sZCA9IGFkYXB0ZXItPnN0YXRzLmdvdGNsOworCisJZTEwMDBfdXBkYXRlX2FkYXB0aXZlKCZhZGFwdGVyLT5odyk7CisKKwlpZighbmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CisJCWlmKEUxMDAwX0RFU0NfVU5VU0VEKHR4ZHIpICsgMSA8IHR4ZHItPmNvdW50KSB7CisJCQkvKiBXZSd2ZSBsb3N0IGxpbmssIHNvIHRoZSBjb250cm9sbGVyIHN0b3BzIERNQSwKKwkJCSAqIGJ1dCB3ZSd2ZSBnb3QgcXVldWVkIFR4IHdvcmsgdGhhdCdzIG5ldmVyIGdvaW5nCisJCQkgKiB0byBnZXQgZG9uZSwgc28gcmVzZXQgY29udHJvbGxlciB0byBmbHVzaCBUeC4KKwkJCSAqIChEbyB0aGUgcmVzZXQgb3V0c2lkZSBvZiBpbnRlcnJ1cHQgY29udGV4dCkuICovCisJCQlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT50eF90aW1lb3V0X3Rhc2spOworCQl9CisJfQorCisJLyogRHluYW1pYyBtb2RlIGZvciBJbnRlcnJ1cHQgVGhyb3R0bGUgUmF0ZSAoSVRSKSAqLworCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQwICYmIGFkYXB0ZXItPml0ciA9PSAxKSB7CisJCS8qIFN5bW1ldHJpYyBUeC9SeCBnZXRzIGEgcmVkdWNlZCBJVFI9MjAwMDsgVG90YWwKKwkJICogYXN5bW1ldHJpY2FsIFR4IG9yIFJ4IGdldHMgSVRSPTgwMDA7IGV2ZXJ5b25lCisJCSAqIGVsc2UgaXMgYmV0d2VlbiAyMDAwLTgwMDAuICovCisJCXVpbnQzMl90IGdvYyA9IChhZGFwdGVyLT5nb3RjbCArIGFkYXB0ZXItPmdvcmNsKSAvIDEwMDAwOworCQl1aW50MzJfdCBkaWYgPSAoYWRhcHRlci0+Z290Y2wgPiBhZGFwdGVyLT5nb3JjbCA/IAorCQkJYWRhcHRlci0+Z290Y2wgLSBhZGFwdGVyLT5nb3JjbCA6CisJCQlhZGFwdGVyLT5nb3JjbCAtIGFkYXB0ZXItPmdvdGNsKSAvIDEwMDAwOworCQl1aW50MzJfdCBpdHIgPSBnb2MgPiAwID8gKGRpZiAqIDYwMDAgLyBnb2MgKyAyMDAwKSA6IDgwMDA7CisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElUUiwgMTAwMDAwMDAwMCAvIChpdHIgKiAyNTYpKTsKKwl9CisKKwkvKiBDYXVzZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgdG8gZW5zdXJlIHJ4IHJpbmcgaXMgY2xlYW5lZCAqLworCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElDUywgRTEwMDBfSUNTX1JYRE1UMCk7CisKKwkvKiBGb3JjZSBkZXRlY3Rpb24gb2YgaHVuZyBjb250cm9sbGVyIGV2ZXJ5IHdhdGNoZG9nIHBlcmlvZCovCisJYWRhcHRlci0+ZGV0ZWN0X3R4X2h1bmcgPSBUUlVFOworCisJLyogUmVzZXQgdGhlIHRpbWVyICovCisJbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgamlmZmllcyArIDIgKiBIWik7Cit9CisKKyNkZWZpbmUgRTEwMDBfVFhfRkxBR1NfQ1NVTQkJMHgwMDAwMDAwMQorI2RlZmluZSBFMTAwMF9UWF9GTEFHU19WTEFOCQkweDAwMDAwMDAyCisjZGVmaW5lIEUxMDAwX1RYX0ZMQUdTX1RTTwkJMHgwMDAwMDAwNAorI2RlZmluZSBFMTAwMF9UWF9GTEFHU19WTEFOX01BU0sJMHhmZmZmMDAwMAorI2RlZmluZSBFMTAwMF9UWF9GTEFHU19WTEFOX1NISUZUCTE2CisKK3N0YXRpYyBpbmxpbmUgaW50CitlMTAwMF90c28oc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IpCit7CisjaWZkZWYgTkVUSUZfRl9UU08KKwlzdHJ1Y3QgZTEwMDBfY29udGV4dF9kZXNjICpjb250ZXh0X2Rlc2M7CisJdW5zaWduZWQgaW50IGk7CisJdWludDMyX3QgY21kX2xlbmd0aCA9IDA7CisJdWludDE2X3QgaXBjc2UsIHR1Y3NlLCBtc3M7CisJdWludDhfdCBpcGNzcywgaXBjc28sIHR1Y3NzLCB0dWNzbywgaGRyX2xlbjsKKwlpbnQgZXJyOworCisJaWYoc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSkgeworCQlpZiAoc2tiX2hlYWRlcl9jbG9uZWQoc2tiKSkgeworCQkJZXJyID0gcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJaGRyX2xlbiA9ICgoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSkgKyAoc2tiLT5oLnRoLT5kb2ZmIDw8IDIpKTsKKwkJbXNzID0gc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZTsKKwkJc2tiLT5uaC5pcGgtPnRvdF9sZW4gPSAwOworCQlza2ItPm5oLmlwaC0+Y2hlY2sgPSAwOworCQlza2ItPmgudGgtPmNoZWNrID0gfmNzdW1fdGNwdWRwX21hZ2ljKHNrYi0+bmguaXBoLT5zYWRkciwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2ItPm5oLmlwaC0+ZGFkZHIsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUFBST1RPX1RDUCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKwkJaXBjc3MgPSBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YTsKKwkJaXBjc28gPSAodm9pZCAqKSYoc2tiLT5uaC5pcGgtPmNoZWNrKSAtICh2b2lkICopc2tiLT5kYXRhOworCQlpcGNzZSA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGEgLSAxOworCQl0dWNzcyA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGE7CisJCXR1Y3NvID0gKHZvaWQgKikmKHNrYi0+aC50aC0+Y2hlY2spIC0gKHZvaWQgKilza2ItPmRhdGE7CisJCXR1Y3NlID0gMDsKKworCQljbWRfbGVuZ3RoIHw9IChFMTAwMF9UWERfQ01EX0RFWFQgfCBFMTAwMF9UWERfQ01EX1RTRSB8CisJCQkgICAgICAgRTEwMDBfVFhEX0NNRF9JUCB8IEUxMDAwX1RYRF9DTURfVENQIHwKKwkJCSAgICAgICAoc2tiLT5sZW4gLSAoaGRyX2xlbikpKTsKKworCQlpID0gYWRhcHRlci0+dHhfcmluZy5uZXh0X3RvX3VzZTsKKwkJY29udGV4dF9kZXNjID0gRTEwMDBfQ09OVEVYVF9ERVNDKGFkYXB0ZXItPnR4X3JpbmcsIGkpOworCisJCWNvbnRleHRfZGVzYy0+bG93ZXJfc2V0dXAuaXBfZmllbGRzLmlwY3NzICA9IGlwY3NzOworCQljb250ZXh0X2Rlc2MtPmxvd2VyX3NldHVwLmlwX2ZpZWxkcy5pcGNzbyAgPSBpcGNzbzsKKwkJY29udGV4dF9kZXNjLT5sb3dlcl9zZXR1cC5pcF9maWVsZHMuaXBjc2UgID0gY3B1X3RvX2xlMTYoaXBjc2UpOworCQljb250ZXh0X2Rlc2MtPnVwcGVyX3NldHVwLnRjcF9maWVsZHMudHVjc3MgPSB0dWNzczsKKwkJY29udGV4dF9kZXNjLT51cHBlcl9zZXR1cC50Y3BfZmllbGRzLnR1Y3NvID0gdHVjc287CisJCWNvbnRleHRfZGVzYy0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50dWNzZSA9IGNwdV90b19sZTE2KHR1Y3NlKTsKKwkJY29udGV4dF9kZXNjLT50Y3Bfc2VnX3NldHVwLmZpZWxkcy5tc3MgICAgID0gY3B1X3RvX2xlMTYobXNzKTsKKwkJY29udGV4dF9kZXNjLT50Y3Bfc2VnX3NldHVwLmZpZWxkcy5oZHJfbGVuID0gaGRyX2xlbjsKKwkJY29udGV4dF9kZXNjLT5jbWRfYW5kX2xlbmd0aCA9IGNwdV90b19sZTMyKGNtZF9sZW5ndGgpOworCisJCWlmKCsraSA9PSBhZGFwdGVyLT50eF9yaW5nLmNvdW50KSBpID0gMDsKKwkJYWRhcHRlci0+dHhfcmluZy5uZXh0X3RvX3VzZSA9IGk7CisKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBib29sZWFuX3QKK2UxMDAwX3R4X2NzdW0oc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGUxMDAwX2NvbnRleHRfZGVzYyAqY29udGV4dF9kZXNjOworCXVuc2lnbmVkIGludCBpOworCXVpbnQ4X3QgY3NzOworCisJaWYobGlrZWx5KHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSkgeworCQljc3MgPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhOworCisJCWkgPSBhZGFwdGVyLT50eF9yaW5nLm5leHRfdG9fdXNlOworCQljb250ZXh0X2Rlc2MgPSBFMTAwMF9DT05URVhUX0RFU0MoYWRhcHRlci0+dHhfcmluZywgaSk7CisKKwkJY29udGV4dF9kZXNjLT51cHBlcl9zZXR1cC50Y3BfZmllbGRzLnR1Y3NzID0gY3NzOworCQljb250ZXh0X2Rlc2MtPnVwcGVyX3NldHVwLnRjcF9maWVsZHMudHVjc28gPSBjc3MgKyBza2ItPmNzdW07CisJCWNvbnRleHRfZGVzYy0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50dWNzZSA9IDA7CisJCWNvbnRleHRfZGVzYy0+dGNwX3NlZ19zZXR1cC5kYXRhID0gMDsKKwkJY29udGV4dF9kZXNjLT5jbWRfYW5kX2xlbmd0aCA9IGNwdV90b19sZTMyKEUxMDAwX1RYRF9DTURfREVYVCk7CisKKwkJaWYodW5saWtlbHkoKytpID09IGFkYXB0ZXItPnR4X3JpbmcuY291bnQpKSBpID0gMDsKKwkJYWRhcHRlci0+dHhfcmluZy5uZXh0X3RvX3VzZSA9IGk7CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJcmV0dXJuIEZBTFNFOworfQorCisjZGVmaW5lIEUxMDAwX01BWF9UWERfUFdSCTEyCisjZGVmaW5lIEUxMDAwX01BWF9EQVRBX1BFUl9UWEQJKDE8PEUxMDAwX01BWF9UWERfUFdSKQorCitzdGF0aWMgaW5saW5lIGludAorZTEwMDBfdHhfbWFwKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCXVuc2lnbmVkIGludCBmaXJzdCwgdW5zaWduZWQgaW50IG1heF9wZXJfdHhkLAorCXVuc2lnbmVkIGludCBucl9mcmFncywgdW5zaWduZWQgaW50IG1zcykKK3sKKwlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nICp0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3Jpbmc7CisJc3RydWN0IGUxMDAwX2J1ZmZlciAqYnVmZmVyX2luZm87CisJdW5zaWduZWQgaW50IGxlbiA9IHNrYi0+bGVuOworCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwLCBzaXplLCBjb3VudCA9IDAsIGk7CisJdW5zaWduZWQgaW50IGY7CisJbGVuIC09IHNrYi0+ZGF0YV9sZW47CisKKwlpID0gdHhfcmluZy0+bmV4dF90b191c2U7CisKKwl3aGlsZShsZW4pIHsKKwkJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+YnVmZmVyX2luZm9baV07CisJCXNpemUgPSBtaW4obGVuLCBtYXhfcGVyX3R4ZCk7CisjaWZkZWYgTkVUSUZfRl9UU08KKwkJLyogV29ya2Fyb3VuZCBmb3IgcHJlbWF0dXJlIGRlc2Mgd3JpdGUtYmFja3MKKwkJICogaW4gVFNPIG1vZGUuICBBcHBlbmQgNC1ieXRlIHNlbnRpbmVsIGRlc2MgKi8KKwkJaWYodW5saWtlbHkobXNzICYmICFucl9mcmFncyAmJiBzaXplID09IGxlbiAmJiBzaXplID4gOCkpCisJCQlzaXplIC09IDQ7CisjZW5kaWYKKwkJLyogV29ya2Fyb3VuZCBmb3IgcG90ZW50aWFsIDgyNTQ0IGhhbmcgaW4gUENJLVguICBBdm9pZAorCQkgKiB0ZXJtaW5hdGluZyBidWZmZXJzIHdpdGhpbiBldmVubHktYWxpZ25lZCBkd29yZHMuICovCisJCWlmKHVubGlrZWx5KGFkYXB0ZXItPnBjaXhfODI1NDQgJiYKKwkJICAgISgodW5zaWduZWQgbG9uZykoc2tiLT5kYXRhICsgb2Zmc2V0ICsgc2l6ZSAtIDEpICYgNCkgJiYKKwkJICAgc2l6ZSA+IDQpKQorCQkJc2l6ZSAtPSA0OworCisJCWJ1ZmZlcl9pbmZvLT5sZW5ndGggPSBzaXplOworCQlidWZmZXJfaW5mby0+ZG1hID0KKwkJCXBjaV9tYXBfc2luZ2xlKGFkYXB0ZXItPnBkZXYsCisJCQkJc2tiLT5kYXRhICsgb2Zmc2V0LAorCQkJCXNpemUsCisJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCWJ1ZmZlcl9pbmZvLT50aW1lX3N0YW1wID0gamlmZmllczsKKworCQlsZW4gLT0gc2l6ZTsKKwkJb2Zmc2V0ICs9IHNpemU7CisJCWNvdW50Kys7CisJCWlmKHVubGlrZWx5KCsraSA9PSB0eF9yaW5nLT5jb3VudCkpIGkgPSAwOworCX0KKworCWZvcihmID0gMDsgZiA8IG5yX2ZyYWdzOyBmKyspIHsKKwkJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZzsKKworCQlmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbZl07CisJCWxlbiA9IGZyYWctPnNpemU7CisJCW9mZnNldCA9IGZyYWctPnBhZ2Vfb2Zmc2V0OworCisJCXdoaWxlKGxlbikgeworCQkJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+YnVmZmVyX2luZm9baV07CisJCQlzaXplID0gbWluKGxlbiwgbWF4X3Blcl90eGQpOworI2lmZGVmIE5FVElGX0ZfVFNPCisJCQkvKiBXb3JrYXJvdW5kIGZvciBwcmVtYXR1cmUgZGVzYyB3cml0ZS1iYWNrcworCQkJICogaW4gVFNPIG1vZGUuICBBcHBlbmQgNC1ieXRlIHNlbnRpbmVsIGRlc2MgKi8KKwkJCWlmKHVubGlrZWx5KG1zcyAmJiBmID09IChucl9mcmFncy0xKSAmJiBzaXplID09IGxlbiAmJiBzaXplID4gOCkpCisJCQkJc2l6ZSAtPSA0OworI2VuZGlmCisJCQkvKiBXb3JrYXJvdW5kIGZvciBwb3RlbnRpYWwgODI1NDQgaGFuZyBpbiBQQ0ktWC4KKwkJCSAqIEF2b2lkIHRlcm1pbmF0aW5nIGJ1ZmZlcnMgd2l0aGluIGV2ZW5seS1hbGlnbmVkCisJCQkgKiBkd29yZHMuICovCisJCQlpZih1bmxpa2VseShhZGFwdGVyLT5wY2l4XzgyNTQ0ICYmCisJCQkgICAhKCh1bnNpZ25lZCBsb25nKShmcmFnLT5wYWdlK29mZnNldCtzaXplLTEpICYgNCkgJiYKKwkJCSAgIHNpemUgPiA0KSkKKwkJCQlzaXplIC09IDQ7CisKKwkJCWJ1ZmZlcl9pbmZvLT5sZW5ndGggPSBzaXplOworCQkJYnVmZmVyX2luZm8tPmRtYSA9CisJCQkJcGNpX21hcF9wYWdlKGFkYXB0ZXItPnBkZXYsCisJCQkJCWZyYWctPnBhZ2UsCisJCQkJCW9mZnNldCwKKwkJCQkJc2l6ZSwKKwkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCQlidWZmZXJfaW5mby0+dGltZV9zdGFtcCA9IGppZmZpZXM7CisKKwkJCWxlbiAtPSBzaXplOworCQkJb2Zmc2V0ICs9IHNpemU7CisJCQljb3VudCsrOworCQkJaWYodW5saWtlbHkoKytpID09IHR4X3JpbmctPmNvdW50KSkgaSA9IDA7CisJCX0KKwl9CisKKwlpID0gKGkgPT0gMCkgPyB0eF9yaW5nLT5jb3VudCAtIDEgOiBpIC0gMTsKKwl0eF9yaW5nLT5idWZmZXJfaW5mb1tpXS5za2IgPSBza2I7CisJdHhfcmluZy0+YnVmZmVyX2luZm9bZmlyc3RdLm5leHRfdG9fd2F0Y2ggPSBpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2UxMDAwX3R4X3F1ZXVlKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLCBpbnQgY291bnQsIGludCB0eF9mbGFncykKK3sKKwlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nICp0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3Jpbmc7CisJc3RydWN0IGUxMDAwX3R4X2Rlc2MgKnR4X2Rlc2MgPSBOVUxMOworCXN0cnVjdCBlMTAwMF9idWZmZXIgKmJ1ZmZlcl9pbmZvOworCXVpbnQzMl90IHR4ZF91cHBlciA9IDAsIHR4ZF9sb3dlciA9IEUxMDAwX1RYRF9DTURfSUZDUzsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmKGxpa2VseSh0eF9mbGFncyAmIEUxMDAwX1RYX0ZMQUdTX1RTTykpIHsKKwkJdHhkX2xvd2VyIHw9IEUxMDAwX1RYRF9DTURfREVYVCB8IEUxMDAwX1RYRF9EVFlQX0QgfAorCQkgICAgICAgICAgICAgRTEwMDBfVFhEX0NNRF9UU0U7CisJCXR4ZF91cHBlciB8PSAoRTEwMDBfVFhEX1BPUFRTX0lYU00gfCBFMTAwMF9UWERfUE9QVFNfVFhTTSkgPDwgODsKKwl9CisKKwlpZihsaWtlbHkodHhfZmxhZ3MgJiBFMTAwMF9UWF9GTEFHU19DU1VNKSkgeworCQl0eGRfbG93ZXIgfD0gRTEwMDBfVFhEX0NNRF9ERVhUIHwgRTEwMDBfVFhEX0RUWVBfRDsKKwkJdHhkX3VwcGVyIHw9IEUxMDAwX1RYRF9QT1BUU19UWFNNIDw8IDg7CisJfQorCisJaWYodW5saWtlbHkodHhfZmxhZ3MgJiBFMTAwMF9UWF9GTEFHU19WTEFOKSkgeworCQl0eGRfbG93ZXIgfD0gRTEwMDBfVFhEX0NNRF9WTEU7CisJCXR4ZF91cHBlciB8PSAodHhfZmxhZ3MgJiBFMTAwMF9UWF9GTEFHU19WTEFOX01BU0spOworCX0KKworCWkgPSB0eF9yaW5nLT5uZXh0X3RvX3VzZTsKKworCXdoaWxlKGNvdW50LS0pIHsKKwkJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+YnVmZmVyX2luZm9baV07CisJCXR4X2Rlc2MgPSBFMTAwMF9UWF9ERVNDKCp0eF9yaW5nLCBpKTsKKwkJdHhfZGVzYy0+YnVmZmVyX2FkZHIgPSBjcHVfdG9fbGU2NChidWZmZXJfaW5mby0+ZG1hKTsKKwkJdHhfZGVzYy0+bG93ZXIuZGF0YSA9CisJCQljcHVfdG9fbGUzMih0eGRfbG93ZXIgfCBidWZmZXJfaW5mby0+bGVuZ3RoKTsKKwkJdHhfZGVzYy0+dXBwZXIuZGF0YSA9IGNwdV90b19sZTMyKHR4ZF91cHBlcik7CisJCWlmKHVubGlrZWx5KCsraSA9PSB0eF9yaW5nLT5jb3VudCkpIGkgPSAwOworCX0KKworCXR4X2Rlc2MtPmxvd2VyLmRhdGEgfD0gY3B1X3RvX2xlMzIoYWRhcHRlci0+dHhkX2NtZCk7CisKKwkvKiBGb3JjZSBtZW1vcnkgd3JpdGVzIHRvIGNvbXBsZXRlIGJlZm9yZSBsZXR0aW5nIGgvdworCSAqIGtub3cgdGhlcmUgYXJlIG5ldyBkZXNjcmlwdG9ycyB0byBmZXRjaC4gIChPbmx5CisJICogYXBwbGljYWJsZSBmb3Igd2Vhay1vcmRlcmVkIG1lbW9yeSBtb2RlbCBhcmNocywKKwkgKiBzdWNoIGFzIElBLTY0KS4gKi8KKwl3bWIoKTsKKworCXR4X3JpbmctPm5leHRfdG9fdXNlID0gaTsKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBURFQsIGkpOworfQorCisvKioKKyAqIDgyNTQ3IHdvcmthcm91bmQgdG8gYXZvaWQgY29udHJvbGxlciBoYW5nIGluIGhhbGYtZHVwbGV4IGVudmlyb25tZW50LgorICogVGhlIHdvcmthcm91bmQgaXMgdG8gYXZvaWQgcXVldWluZyBhIGxhcmdlIHBhY2tldCB0aGF0IHdvdWxkIHNwYW4KKyAqIHRoZSBpbnRlcm5hbCBUeCBGSUZPIHJpbmcgYm91bmRhcnkgYnkgbm90aWZ5aW5nIHRoZSBzdGFjayB0byByZXNlbmQKKyAqIHRoZSBwYWNrZXQgYXQgYSBsYXRlciB0aW1lLiAgVGhpcyBnaXZlcyB0aGUgVHggRklGTyBhbiBvcHBvcnR1bml0eSB0bworICogZmx1c2ggYWxsIHBhY2tldHMuICBXaGVuIHRoYXQgb2NjdXJzLCB3ZSByZXNldCB0aGUgVHggRklGTyBwb2ludGVycworICogdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgVHggRklGTy4KKyAqKi8KKworI2RlZmluZSBFMTAwMF9GSUZPX0hEUgkJCTB4MTAKKyNkZWZpbmUgRTEwMDBfODI1NDdfUEFEX0xFTgkJMHgzRTAKKworc3RhdGljIGlubGluZSBpbnQKK2UxMDAwXzgyNTQ3X2ZpZm9fd29ya2Fyb3VuZChzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1aW50MzJfdCBmaWZvX3NwYWNlID0gYWRhcHRlci0+dHhfZmlmb19zaXplIC0gYWRhcHRlci0+dHhfZmlmb19oZWFkOworCXVpbnQzMl90IHNrYl9maWZvX2xlbiA9IHNrYi0+bGVuICsgRTEwMDBfRklGT19IRFI7CisKKwlFMTAwMF9ST1VORFVQKHNrYl9maWZvX2xlbiwgRTEwMDBfRklGT19IRFIpOworCisJaWYoYWRhcHRlci0+bGlua19kdXBsZXggIT0gSEFMRl9EVVBMRVgpCisJCWdvdG8gbm9fZmlmb19zdGFsbF9yZXF1aXJlZDsKKworCWlmKGF0b21pY19yZWFkKCZhZGFwdGVyLT50eF9maWZvX3N0YWxsKSkKKwkJcmV0dXJuIDE7CisKKwlpZihza2JfZmlmb19sZW4gPj0gKEUxMDAwXzgyNTQ3X1BBRF9MRU4gKyBmaWZvX3NwYWNlKSkgeworCQlhdG9taWNfc2V0KCZhZGFwdGVyLT50eF9maWZvX3N0YWxsLCAxKTsKKwkJcmV0dXJuIDE7CisJfQorCitub19maWZvX3N0YWxsX3JlcXVpcmVkOgorCWFkYXB0ZXItPnR4X2ZpZm9faGVhZCArPSBza2JfZmlmb19sZW47CisJaWYoYWRhcHRlci0+dHhfZmlmb19oZWFkID49IGFkYXB0ZXItPnR4X2ZpZm9fc2l6ZSkKKwkJYWRhcHRlci0+dHhfZmlmb19oZWFkIC09IGFkYXB0ZXItPnR4X2ZpZm9fc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBUWERfVVNFX0NPVU5UKFMsIFgpICgoKFMpID4+IChYKSkgKyAxICkKK3N0YXRpYyBpbnQKK2UxMDAwX3htaXRfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwl1bnNpZ25lZCBpbnQgZmlyc3QsIG1heF9wZXJfdHhkID0gRTEwMDBfTUFYX0RBVEFfUEVSX1RYRDsKKwl1bnNpZ25lZCBpbnQgbWF4X3R4ZF9wd3IgPSBFMTAwMF9NQVhfVFhEX1BXUjsKKwl1bnNpZ25lZCBpbnQgdHhfZmxhZ3MgPSAwOworCXVuc2lnbmVkIGludCBsZW4gPSBza2ItPmxlbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBucl9mcmFncyA9IDA7CisJdW5zaWduZWQgaW50IG1zcyA9IDA7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgdHNvOworCXVuc2lnbmVkIGludCBmOworCWxlbiAtPSBza2ItPmRhdGFfbGVuOworCisJaWYodW5saWtlbHkoc2tiLT5sZW4gPD0gMCkpIHsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKwl9CisKKyNpZmRlZiBORVRJRl9GX1RTTworCW1zcyA9IHNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemU7CisJLyogVGhlIGNvbnRyb2xsZXIgZG9lcyBhIHNpbXBsZSBjYWxjdWxhdGlvbiB0bworCSAqIG1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggcm9vbSBpbiB0aGUgRklGTyBiZWZvcmUKKwkgKiBpbml0aWF0aW5nIHRoZSBETUEgZm9yIGVhY2ggYnVmZmVyLiAgVGhlIGNhbGMgaXM6CisJICogNCA9IGNlaWwoYnVmZmVyIGxlbi9tc3MpLiAgVG8gbWFrZSBzdXJlIHdlIGRvbid0CisJICogb3ZlcnJ1biB0aGUgRklGTywgYWRqdXN0IHRoZSBtYXggYnVmZmVyIGxlbiBpZiBtc3MKKwkgKiBkcm9wcy4gKi8KKwlpZihtc3MpIHsKKwkJbWF4X3Blcl90eGQgPSBtaW4obXNzIDw8IDIsIG1heF9wZXJfdHhkKTsKKwkJbWF4X3R4ZF9wd3IgPSBmbHMobWF4X3Blcl90eGQpIC0gMTsKKwl9CisKKwlpZigobXNzKSB8fCAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpKQorCQljb3VudCsrOworCWNvdW50Kys7CS8qIGZvciBzZW50aW5lbCBkZXNjICovCisjZWxzZQorCWlmKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKQorCQljb3VudCsrOworI2VuZGlmCisJY291bnQgKz0gVFhEX1VTRV9DT1VOVChsZW4sIG1heF90eGRfcHdyKTsKKworCWlmKGFkYXB0ZXItPnBjaXhfODI1NDQpCisJCWNvdW50Kys7CisKKwlucl9mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJZm9yKGYgPSAwOyBmIDwgbnJfZnJhZ3M7IGYrKykKKwkJY291bnQgKz0gVFhEX1VTRV9DT1VOVChza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ZdLnNpemUsCisJCQkJICAgICAgIG1heF90eGRfcHdyKTsKKwlpZihhZGFwdGVyLT5wY2l4XzgyNTQ0KQorCQljb3VudCArPSBucl9mcmFnczsKKworIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7IAorIAlpZiAoIXNwaW5fdHJ5bG9jaygmYWRhcHRlci0+dHhfbG9jaykpIHsgCisgCQkvKiBDb2xsaXNpb24gLSB0ZWxsIHVwcGVyIGxheWVyIHRvIHJlcXVldWUgKi8gCisgCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IAorIAkJcmV0dXJuIE5FVERFVl9UWF9MT0NLRUQ7IAorIAl9IAorCisJLyogbmVlZDogY291bnQgKyAyIGRlc2MgZ2FwIHRvIGtlZXAgdGFpbCBmcm9tIHRvdWNoaW5nCisJICogaGVhZCwgb3RoZXJ3aXNlIHRyeSBuZXh0IHRpbWUgKi8KKwlpZih1bmxpa2VseShFMTAwMF9ERVNDX1VOVVNFRCgmYWRhcHRlci0+dHhfcmluZykgPCBjb3VudCArIDIpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+dHhfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CisJfQorCisJaWYodW5saWtlbHkoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSB7CisJCWlmKHVubGlrZWx5KGUxMDAwXzgyNTQ3X2ZpZm9fd29ya2Fyb3VuZChhZGFwdGVyLCBza2IpKSkgeworCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCQkJbW9kX3RpbWVyKCZhZGFwdGVyLT50eF9maWZvX3N0YWxsX3RpbWVyLCBqaWZmaWVzKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnR4X2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwkJfQorCX0KKworCWlmKHVubGlrZWx5KGFkYXB0ZXItPnZsZ3JwICYmIHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkpIHsKKwkJdHhfZmxhZ3MgfD0gRTEwMDBfVFhfRkxBR1NfVkxBTjsKKwkJdHhfZmxhZ3MgfD0gKHZsYW5fdHhfdGFnX2dldChza2IpIDw8IEUxMDAwX1RYX0ZMQUdTX1ZMQU5fU0hJRlQpOworCX0KKworCWZpcnN0ID0gYWRhcHRlci0+dHhfcmluZy5uZXh0X3RvX3VzZTsKKwkKKwl0c28gPSBlMTAwMF90c28oYWRhcHRlciwgc2tiKTsKKwlpZiAodHNvIDwgMCkgeworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlyZXR1cm4gTkVUREVWX1RYX09LOworCX0KKworCWlmIChsaWtlbHkodHNvKSkKKwkJdHhfZmxhZ3MgfD0gRTEwMDBfVFhfRkxBR1NfVFNPOworCWVsc2UgaWYobGlrZWx5KGUxMDAwX3R4X2NzdW0oYWRhcHRlciwgc2tiKSkpCisJCXR4X2ZsYWdzIHw9IEUxMDAwX1RYX0ZMQUdTX0NTVU07CisKKwllMTAwMF90eF9xdWV1ZShhZGFwdGVyLAorCQllMTAwMF90eF9tYXAoYWRhcHRlciwgc2tiLCBmaXJzdCwgbWF4X3Blcl90eGQsIG5yX2ZyYWdzLCBtc3MpLAorCQl0eF9mbGFncyk7CisKKwluZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzcGFjZSBpbiB0aGUgcmluZyBmb3IgdGhlIG5leHQgc2VuZC4gKi8KKwlpZih1bmxpa2VseShFMTAwMF9ERVNDX1VOVVNFRCgmYWRhcHRlci0+dHhfcmluZykgPCBNQVhfU0tCX0ZSQUdTICsgMikpCisJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnR4X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gTkVUREVWX1RYX09LOworfQorCisvKioKKyAqIGUxMDAwX3R4X3RpbWVvdXQgLSBSZXNwb25kIHRvIGEgVHggSGFuZworICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoqLworCitzdGF0aWMgdm9pZAorZTEwMDBfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCisJLyogRG8gdGhlIHJlc2V0IG91dHNpZGUgb2YgaW50ZXJydXB0IGNvbnRleHQgKi8KKwlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT50eF90aW1lb3V0X3Rhc2spOworfQorCitzdGF0aWMgdm9pZAorZTEwMDBfdHhfdGltZW91dF90YXNrKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisKKwllMTAwMF9kb3duKGFkYXB0ZXIpOworCWUxMDAwX3VwKGFkYXB0ZXIpOworfQorCisvKioKKyAqIGUxMDAwX2dldF9zdGF0cyAtIEdldCBTeXN0ZW0gTmV0d29yayBTdGF0aXN0aWNzCisgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHN0YXRpc3RpY3Mgc3RydWN0dXJlLgorICogVGhlIHN0YXRpc3RpY3MgYXJlIGFjdHVhbGx5IHVwZGF0ZWQgZnJvbSB0aGUgdGltZXIgY2FsbGJhY2suCisgKiovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCitlMTAwMF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKworCWUxMDAwX3VwZGF0ZV9zdGF0cyhhZGFwdGVyKTsKKwlyZXR1cm4gJmFkYXB0ZXItPm5ldF9zdGF0czsKK30KKworLyoqCisgKiBlMTAwMF9jaGFuZ2VfbXR1IC0gQ2hhbmdlIHRoZSBNYXhpbXVtIFRyYW5zZmVyIFVuaXQKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBuZXdfbXR1OiBuZXcgdmFsdWUgZm9yIG1heGltdW0gZnJhbWUgc2l6ZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKiovCisKK3N0YXRpYyBpbnQKK2UxMDAwX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJaW50IG9sZF9tdHUgPSBhZGFwdGVyLT5yeF9idWZmZXJfbGVuOworCWludCBtYXhfZnJhbWUgPSBuZXdfbXR1ICsgRU5FVF9IRUFERVJfU0laRSArIEVUSEVSTkVUX0ZDU19TSVpFOworCisJaWYoKG1heF9mcmFtZSA8IE1JTklNVU1fRVRIRVJORVRfRlJBTUVfU0laRSkgfHwKKwkJKG1heF9mcmFtZSA+IE1BWF9KVU1CT19GUkFNRV9TSVpFKSkgeworCQkJRFBSSU5USyhQUk9CRSwgRVJSLCAiSW52YWxpZCBNVFUgc2V0dGluZ1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZihtYXhfZnJhbWUgPD0gTUFYSU1VTV9FVEhFUk5FVF9GUkFNRV9TSVpFKSB7CisJCWFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gPSBFMTAwMF9SWEJVRkZFUl8yMDQ4OworCisJfSBlbHNlIGlmKGFkYXB0ZXItPmh3Lm1hY190eXBlIDwgZTEwMDBfODI1NDMpIHsKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAiSnVtYm8gRnJhbWVzIG5vdCBzdXBwb3J0ZWQgb24gODI1NDJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKworCX0gZWxzZSBpZihtYXhfZnJhbWUgPD0gRTEwMDBfUlhCVUZGRVJfNDA5NikgeworCQlhZGFwdGVyLT5yeF9idWZmZXJfbGVuID0gRTEwMDBfUlhCVUZGRVJfNDA5NjsKKworCX0gZWxzZSBpZihtYXhfZnJhbWUgPD0gRTEwMDBfUlhCVUZGRVJfODE5MikgeworCQlhZGFwdGVyLT5yeF9idWZmZXJfbGVuID0gRTEwMDBfUlhCVUZGRVJfODE5MjsKKworCX0gZWxzZSB7CisJCWFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gPSBFMTAwMF9SWEJVRkZFUl8xNjM4NDsKKwl9CisKKwlpZihvbGRfbXR1ICE9IGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gJiYgbmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCWUxMDAwX2Rvd24oYWRhcHRlcik7CisJCWUxMDAwX3VwKGFkYXB0ZXIpOworCX0KKworCW5ldGRldi0+bXR1ID0gbmV3X210dTsKKwlhZGFwdGVyLT5ody5tYXhfZnJhbWVfc2l6ZSA9IG1heF9mcmFtZTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGUxMDAwX3VwZGF0ZV9zdGF0cyAtIFVwZGF0ZSB0aGUgYm9hcmQgc3RhdGlzdGljcyBjb3VudGVycworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiovCisKK3ZvaWQKK2UxMDAwX3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdWludDE2X3QgcGh5X3RtcDsKKworI2RlZmluZSBQSFlfSURMRV9FUlJPUl9DT1VOVF9NQVNLIDB4MDBGRgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPnN0YXRzX2xvY2ssIGZsYWdzKTsKKworCS8qIHRoZXNlIGNvdW50ZXJzIGFyZSBtb2RpZmllZCBmcm9tIGUxMDAwX2FkanVzdF90Ymlfc3RhdHMsCisJICogY2FsbGVkIGZyb20gdGhlIGludGVycnVwdCBjb250ZXh0LCBzbyB0aGV5IG11c3Qgb25seQorCSAqIGJlIHdyaXR0ZW4gd2hpbGUgaG9sZGluZyBhZGFwdGVyLT5zdGF0c19sb2NrCisJICovCisKKwlhZGFwdGVyLT5zdGF0cy5jcmNlcnJzICs9IEUxMDAwX1JFQURfUkVHKGh3LCBDUkNFUlJTKTsKKwlhZGFwdGVyLT5zdGF0cy5ncHJjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBHUFJDKTsKKwlhZGFwdGVyLT5zdGF0cy5nb3JjbCArPSBFMTAwMF9SRUFEX1JFRyhodywgR09SQ0wpOworCWFkYXB0ZXItPnN0YXRzLmdvcmNoICs9IEUxMDAwX1JFQURfUkVHKGh3LCBHT1JDSCk7CisJYWRhcHRlci0+c3RhdHMuYnByYyArPSBFMTAwMF9SRUFEX1JFRyhodywgQlBSQyk7CisJYWRhcHRlci0+c3RhdHMubXByYyArPSBFMTAwMF9SRUFEX1JFRyhodywgTVBSQyk7CisJYWRhcHRlci0+c3RhdHMucm9jICs9IEUxMDAwX1JFQURfUkVHKGh3LCBST0MpOworCWFkYXB0ZXItPnN0YXRzLnByYzY0ICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQUkM2NCk7CisJYWRhcHRlci0+c3RhdHMucHJjMTI3ICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQUkMxMjcpOworCWFkYXB0ZXItPnN0YXRzLnByYzI1NSArPSBFMTAwMF9SRUFEX1JFRyhodywgUFJDMjU1KTsKKwlhZGFwdGVyLT5zdGF0cy5wcmM1MTEgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBSQzUxMSk7CisJYWRhcHRlci0+c3RhdHMucHJjMTAyMyArPSBFMTAwMF9SRUFEX1JFRyhodywgUFJDMTAyMyk7CisJYWRhcHRlci0+c3RhdHMucHJjMTUyMiArPSBFMTAwMF9SRUFEX1JFRyhodywgUFJDMTUyMik7CisKKwlhZGFwdGVyLT5zdGF0cy5zeW1lcnJzICs9IEUxMDAwX1JFQURfUkVHKGh3LCBTWU1FUlJTKTsKKwlhZGFwdGVyLT5zdGF0cy5tcGMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIE1QQyk7CisJYWRhcHRlci0+c3RhdHMuc2NjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBTQ0MpOworCWFkYXB0ZXItPnN0YXRzLmVjb2wgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIEVDT0wpOworCWFkYXB0ZXItPnN0YXRzLm1jYyArPSBFMTAwMF9SRUFEX1JFRyhodywgTUNDKTsKKwlhZGFwdGVyLT5zdGF0cy5sYXRlY29sICs9IEUxMDAwX1JFQURfUkVHKGh3LCBMQVRFQ09MKTsKKwlhZGFwdGVyLT5zdGF0cy5kYyArPSBFMTAwMF9SRUFEX1JFRyhodywgREMpOworCWFkYXB0ZXItPnN0YXRzLnNlYyArPSBFMTAwMF9SRUFEX1JFRyhodywgU0VDKTsKKwlhZGFwdGVyLT5zdGF0cy5ybGVjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBSTEVDKTsKKwlhZGFwdGVyLT5zdGF0cy54b25yeGMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFhPTlJYQyk7CisJYWRhcHRlci0+c3RhdHMueG9udHhjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBYT05UWEMpOworCWFkYXB0ZXItPnN0YXRzLnhvZmZyeGMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFhPRkZSWEMpOworCWFkYXB0ZXItPnN0YXRzLnhvZmZ0eGMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFhPRkZUWEMpOworCWFkYXB0ZXItPnN0YXRzLmZjcnVjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBGQ1JVQyk7CisJYWRhcHRlci0+c3RhdHMuZ3B0YyArPSBFMTAwMF9SRUFEX1JFRyhodywgR1BUQyk7CisJYWRhcHRlci0+c3RhdHMuZ290Y2wgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIEdPVENMKTsKKwlhZGFwdGVyLT5zdGF0cy5nb3RjaCArPSBFMTAwMF9SRUFEX1JFRyhodywgR09UQ0gpOworCWFkYXB0ZXItPnN0YXRzLnJuYmMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFJOQkMpOworCWFkYXB0ZXItPnN0YXRzLnJ1YyArPSBFMTAwMF9SRUFEX1JFRyhodywgUlVDKTsKKwlhZGFwdGVyLT5zdGF0cy5yZmMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFJGQyk7CisJYWRhcHRlci0+c3RhdHMucmpjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBSSkMpOworCWFkYXB0ZXItPnN0YXRzLnRvcmwgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFRPUkwpOworCWFkYXB0ZXItPnN0YXRzLnRvcmggKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFRPUkgpOworCWFkYXB0ZXItPnN0YXRzLnRvdGwgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFRPVEwpOworCWFkYXB0ZXItPnN0YXRzLnRvdGggKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFRPVEgpOworCWFkYXB0ZXItPnN0YXRzLnRwciArPSBFMTAwMF9SRUFEX1JFRyhodywgVFBSKTsKKwlhZGFwdGVyLT5zdGF0cy5wdGM2NCArPSBFMTAwMF9SRUFEX1JFRyhodywgUFRDNjQpOworCWFkYXB0ZXItPnN0YXRzLnB0YzEyNyArPSBFMTAwMF9SRUFEX1JFRyhodywgUFRDMTI3KTsKKwlhZGFwdGVyLT5zdGF0cy5wdGMyNTUgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBUQzI1NSk7CisJYWRhcHRlci0+c3RhdHMucHRjNTExICs9IEUxMDAwX1JFQURfUkVHKGh3LCBQVEM1MTEpOworCWFkYXB0ZXItPnN0YXRzLnB0YzEwMjMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBUQzEwMjMpOworCWFkYXB0ZXItPnN0YXRzLnB0YzE1MjIgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFBUQzE1MjIpOworCWFkYXB0ZXItPnN0YXRzLm1wdGMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIE1QVEMpOworCWFkYXB0ZXItPnN0YXRzLmJwdGMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIEJQVEMpOworCisJLyogdXNlZCBmb3IgYWRhcHRpdmUgSUZTICovCisKKwlody0+dHhfcGFja2V0X2RlbHRhID0gRTEwMDBfUkVBRF9SRUcoaHcsIFRQVCk7CisJYWRhcHRlci0+c3RhdHMudHB0ICs9IGh3LT50eF9wYWNrZXRfZGVsdGE7CisJaHctPmNvbGxpc2lvbl9kZWx0YSA9IEUxMDAwX1JFQURfUkVHKGh3LCBDT0xDKTsKKwlhZGFwdGVyLT5zdGF0cy5jb2xjICs9IGh3LT5jb2xsaXNpb25fZGVsdGE7CisKKwlpZihody0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpIHsKKwkJYWRhcHRlci0+c3RhdHMuYWxnbmVycmMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIEFMR05FUlJDKTsKKwkJYWRhcHRlci0+c3RhdHMucnhlcnJjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBSWEVSUkMpOworCQlhZGFwdGVyLT5zdGF0cy50bmNycyArPSBFMTAwMF9SRUFEX1JFRyhodywgVE5DUlMpOworCQlhZGFwdGVyLT5zdGF0cy5jZXh0ZXJyICs9IEUxMDAwX1JFQURfUkVHKGh3LCBDRVhURVJSKTsKKwkJYWRhcHRlci0+c3RhdHMudHNjdGMgKz0gRTEwMDBfUkVBRF9SRUcoaHcsIFRTQ1RDKTsKKwkJYWRhcHRlci0+c3RhdHMudHNjdGZjICs9IEUxMDAwX1JFQURfUkVHKGh3LCBUU0NURkMpOworCX0KKworCS8qIEZpbGwgb3V0IHRoZSBPUyBzdGF0aXN0aWNzIHN0cnVjdHVyZSAqLworCisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X3BhY2tldHMgPSBhZGFwdGVyLT5zdGF0cy5ncHJjOworCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9wYWNrZXRzID0gYWRhcHRlci0+c3RhdHMuZ3B0YzsKKwlhZGFwdGVyLT5uZXRfc3RhdHMucnhfYnl0ZXMgPSBhZGFwdGVyLT5zdGF0cy5nb3JjbDsKKwlhZGFwdGVyLT5uZXRfc3RhdHMudHhfYnl0ZXMgPSBhZGFwdGVyLT5zdGF0cy5nb3RjbDsKKwlhZGFwdGVyLT5uZXRfc3RhdHMubXVsdGljYXN0ID0gYWRhcHRlci0+c3RhdHMubXByYzsKKwlhZGFwdGVyLT5uZXRfc3RhdHMuY29sbGlzaW9ucyA9IGFkYXB0ZXItPnN0YXRzLmNvbGM7CisKKwkvKiBSeCBFcnJvcnMgKi8KKworCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9lcnJvcnMgPSBhZGFwdGVyLT5zdGF0cy5yeGVycmMgKworCQlhZGFwdGVyLT5zdGF0cy5jcmNlcnJzICsgYWRhcHRlci0+c3RhdHMuYWxnbmVycmMgKworCQlhZGFwdGVyLT5zdGF0cy5ybGVjICsgYWRhcHRlci0+c3RhdHMucm5iYyArCisJCWFkYXB0ZXItPnN0YXRzLm1wYyArIGFkYXB0ZXItPnN0YXRzLmNleHRlcnI7CisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2Ryb3BwZWQgPSBhZGFwdGVyLT5zdGF0cy5ybmJjOworCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gYWRhcHRlci0+c3RhdHMucmxlYzsKKwlhZGFwdGVyLT5uZXRfc3RhdHMucnhfY3JjX2Vycm9ycyA9IGFkYXB0ZXItPnN0YXRzLmNyY2VycnM7CisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IGFkYXB0ZXItPnN0YXRzLmFsZ25lcnJjOworCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9maWZvX2Vycm9ycyA9IGFkYXB0ZXItPnN0YXRzLm1wYzsKKwlhZGFwdGVyLT5uZXRfc3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IGFkYXB0ZXItPnN0YXRzLm1wYzsKKworCS8qIFR4IEVycm9ycyAqLworCisJYWRhcHRlci0+bmV0X3N0YXRzLnR4X2Vycm9ycyA9IGFkYXB0ZXItPnN0YXRzLmVjb2wgKworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLT5zdGF0cy5sYXRlY29sOworCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9IGFkYXB0ZXItPnN0YXRzLmVjb2w7CisJYWRhcHRlci0+bmV0X3N0YXRzLnR4X3dpbmRvd19lcnJvcnMgPSBhZGFwdGVyLT5zdGF0cy5sYXRlY29sOworCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyA9IGFkYXB0ZXItPnN0YXRzLnRuY3JzOworCisJLyogVHggRHJvcHBlZCBuZWVkcyB0byBiZSBtYWludGFpbmVkIGVsc2V3aGVyZSAqLworCisJLyogUGh5IFN0YXRzICovCisKKwlpZihody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgeworCQlpZigoYWRhcHRlci0+bGlua19zcGVlZCA9PSBTUEVFRF8xMDAwKSAmJgorCQkgICAoIWUxMDAwX3JlYWRfcGh5X3JlZyhodywgUEhZXzEwMDBUX1NUQVRVUywgJnBoeV90bXApKSkgeworCQkJcGh5X3RtcCAmPSBQSFlfSURMRV9FUlJPUl9DT1VOVF9NQVNLOworCQkJYWRhcHRlci0+cGh5X3N0YXRzLmlkbGVfZXJyb3JzICs9IHBoeV90bXA7CisJCX0KKworCQlpZigoaHctPm1hY190eXBlIDw9IGUxMDAwXzgyNTQ2KSAmJgorCQkgICAoaHctPnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpICYmCisJCSAgICFlMTAwMF9yZWFkX3BoeV9yZWcoaHcsIE04OEUxMDAwX1JYX0VSUl9DTlRSLCAmcGh5X3RtcCkpCisJCQlhZGFwdGVyLT5waHlfc3RhdHMucmVjZWl2ZV9lcnJvcnMgKz0gcGh5X3RtcDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5zdGF0c19sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogZTEwMDBfaW50ciAtIEludGVycnVwdCBIYW5kbGVyCisgKiBAaXJxOiBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAZGF0YTogcG9pbnRlciB0byBhIG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBwdF9yZWdzOiBDUFUgcmVnaXN0ZXJzIHN0cnVjdHVyZQorICoqLworCitzdGF0aWMgaXJxcmV0dXJuX3QKK2UxMDAwX2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGRhdGE7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1aW50MzJfdCBpY3IgPSBFMTAwMF9SRUFEX1JFRyhodywgSUNSKTsKKyNpZm5kZWYgQ09ORklHX0UxMDAwX05BUEkKKwl1bnNpZ25lZCBpbnQgaTsKKyNlbmRpZgorCisJaWYodW5saWtlbHkoIWljcikpCisJCXJldHVybiBJUlFfTk9ORTsgIC8qIE5vdCBvdXIgaW50ZXJydXB0ICovCisKKwlpZih1bmxpa2VseShpY3IgJiAoRTEwMDBfSUNSX1JYU0VRIHwgRTEwMDBfSUNSX0xTQykpKSB7CisJCWh3LT5nZXRfbGlua19zdGF0dXMgPSAxOworCQltb2RfdGltZXIoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLCBqaWZmaWVzKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfRTEwMDBfTkFQSQorCWlmKGxpa2VseShuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKG5ldGRldikpKSB7CisKKwkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCByZWdpc3RlciBmb3IgcG9sbC4gVGhlIGZsdXNoIAorCQkgIG9mIHRoZSBwb3N0ZWQgd3JpdGUgaXMgaW50ZW50aW9uYWxseSBsZWZ0IG91dC4KKwkJKi8KKworCQlhdG9taWNfaW5jKCZhZGFwdGVyLT5pcnFfc2VtKTsKKwkJRTEwMDBfV1JJVEVfUkVHKGh3LCBJTUMsIH4wKTsKKwkJX19uZXRpZl9yeF9zY2hlZHVsZShuZXRkZXYpOworCX0KKyNlbHNlCisJLyogV3JpdGluZyBJTUMgYW5kIElNUyBpcyBuZWVkZWQgZm9yIDgyNTQ3LgorCSAgIER1ZSB0byBIdWIgTGluayBidXMgYmVpbmcgb2NjdXBpZWQsIGFuIGludGVycnVwdAorCSAgIGRlLWFzc2VydGlvbiBtZXNzYWdlIGlzIG5vdCBhYmxlIHRvIGJlIHNlbnQuCisJICAgV2hlbiBhbiBpbnRlcnJ1cHQgYXNzZXJ0aW9uIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkIGxhdGVyLAorCSAgIHR3byBtZXNzYWdlcyBhcmUgcmUtb3JkZXJlZCBhbmQgc2VudCBvdXQuCisJICAgVGhhdCBjYXVzZXMgQVBJQyB0byB0aGluayA4MjU0NyBpcyBpbiBkZS1hc3NlcnRpb24KKwkgICBzdGF0ZSwgd2hpbGUgODI1NDcgaXMgaW4gYXNzZXJ0aW9uIHN0YXRlLCByZXN1bHRpbmcKKwkgICBpbiBkZWFkIGxvY2suIFdyaXRpbmcgSU1DIGZvcmNlcyA4MjU0NyBpbnRvCisJICAgZGUtYXNzZXJ0aW9uIHN0YXRlLgorCSovCisJaWYoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3IHx8IGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0N19yZXZfMil7CisJCWF0b21pY19pbmMoJmFkYXB0ZXItPmlycV9zZW0pOworCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJTUMsIH4wKTsKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCBFMTAwMF9NQVhfSU5UUjsgaSsrKQorCQlpZih1bmxpa2VseSghZTEwMDBfY2xlYW5fcnhfaXJxKGFkYXB0ZXIpICYKKwkJICAgIWUxMDAwX2NsZWFuX3R4X2lycShhZGFwdGVyKSkpCisJCQlicmVhazsKKworCWlmKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF84MjU0NyB8fCBody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDdfcmV2XzIpCisJCWUxMDAwX2lycV9lbmFibGUoYWRhcHRlcik7CisjZW5kaWYKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCisvKioKKyAqIGUxMDAwX2NsZWFuIC0gTkFQSSBSeCBwb2xsaW5nIGNhbGxiYWNrCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqKi8KKworc3RhdGljIGludAorZTEwMDBfY2xlYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50ICpidWRnZXQpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJaW50IHdvcmtfdG9fZG8gPSBtaW4oKmJ1ZGdldCwgbmV0ZGV2LT5xdW90YSk7CisJaW50IHR4X2NsZWFuZWQ7CisJaW50IHdvcmtfZG9uZSA9IDA7CisJCisJdHhfY2xlYW5lZCA9IGUxMDAwX2NsZWFuX3R4X2lycShhZGFwdGVyKTsKKwllMTAwMF9jbGVhbl9yeF9pcnEoYWRhcHRlciwgJndvcmtfZG9uZSwgd29ya190b19kbyk7CisKKwkqYnVkZ2V0IC09IHdvcmtfZG9uZTsKKwluZXRkZXYtPnF1b3RhIC09IHdvcmtfZG9uZTsKKwkKKwkvKiBpZiBubyBUeCBhbmQgbm90IGVub3VnaCBSeCB3b3JrIGRvbmUsIGV4aXQgdGhlIHBvbGxpbmcgbW9kZSAqLworCWlmKCghdHhfY2xlYW5lZCAmJiAod29ya19kb25lIDwgd29ya190b19kbykpIHx8IAorCQkJCSFuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKKwkJbmV0aWZfcnhfY29tcGxldGUobmV0ZGV2KTsKKwkJZTEwMDBfaXJxX2VuYWJsZShhZGFwdGVyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKyNlbmRpZgorLyoqCisgKiBlMTAwMF9jbGVhbl90eF9pcnEgLSBSZWNsYWltIHJlc291cmNlcyBhZnRlciB0cmFuc21pdCBjb21wbGV0ZXMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoqLworCitzdGF0aWMgYm9vbGVhbl90CitlMTAwMF9jbGVhbl90eF9pcnEoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyAqdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJc3RydWN0IGUxMDAwX3R4X2Rlc2MgKnR4X2Rlc2MsICplb3BfZGVzYzsKKwlzdHJ1Y3QgZTEwMDBfYnVmZmVyICpidWZmZXJfaW5mbzsKKwl1bnNpZ25lZCBpbnQgaSwgZW9wOworCWJvb2xlYW5fdCBjbGVhbmVkID0gRkFMU0U7CisKKwlpID0gdHhfcmluZy0+bmV4dF90b19jbGVhbjsKKwllb3AgPSB0eF9yaW5nLT5idWZmZXJfaW5mb1tpXS5uZXh0X3RvX3dhdGNoOworCWVvcF9kZXNjID0gRTEwMDBfVFhfREVTQygqdHhfcmluZywgZW9wKTsKKworCXdoaWxlKGVvcF9kZXNjLT51cHBlci5kYXRhICYgY3B1X3RvX2xlMzIoRTEwMDBfVFhEX1NUQVRfREQpKSB7CisJCS8qIHByZS1tYXR1cmUgd3JpdGViYWNrIG9mIFR4IGRlc2NyaXB0b3JzICAgICAqLworCQkvKiBjbGVhciAoZnJlZSBidWZmZXJzIGFuZCB1bm1hcCBwY2lfbWFwcGluZykgKi8KKwkJLyogcHJldmlvdXNfYnVmZmVyX2luZm8gICAgICAgICAgICAgICAgICAgICAgICovCisJCWlmIChsaWtlbHkoYWRhcHRlci0+cHJldmlvdXNfYnVmZmVyX2luZm8uc2tiICE9IE5VTEwpKSB7CisJCQllMTAwMF91bm1hcF9hbmRfZnJlZV90eF9yZXNvdXJjZShhZGFwdGVyLCAKKwkJCQkJJmFkYXB0ZXItPnByZXZpb3VzX2J1ZmZlcl9pbmZvKTsKKwkJfQorCisJCWZvcihjbGVhbmVkID0gRkFMU0U7ICFjbGVhbmVkOyApIHsKKwkJCXR4X2Rlc2MgPSBFMTAwMF9UWF9ERVNDKCp0eF9yaW5nLCBpKTsKKwkJCWJ1ZmZlcl9pbmZvID0gJnR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOworCQkJY2xlYW5lZCA9IChpID09IGVvcCk7CisKKwkJCS8qIHByZS1tYXR1cmUgd3JpdGViYWNrIG9mIFR4IGRlc2NyaXB0b3JzICovCisJCQkvKiBzYXZlIHRoZSBjbGVhbmluZyBvZiB0aGUgdGhpcyBmb3IgdGhlICAqLworCQkJLyogbmV4dCBpdGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJCWlmIChjbGVhbmVkKSB7CisJCQkJbWVtY3B5KCZhZGFwdGVyLT5wcmV2aW91c19idWZmZXJfaW5mbywKKwkJCQkJYnVmZmVyX2luZm8sCisJCQkJCXNpemVvZihzdHJ1Y3QgZTEwMDBfYnVmZmVyKSk7CisJCQkJbWVtc2V0KGJ1ZmZlcl9pbmZvLAorCQkJCQkwLAorCQkJCQlzaXplb2Yoc3RydWN0IGUxMDAwX2J1ZmZlcikpOworCQkJfSBlbHNlIHsKKwkJCQllMTAwMF91bm1hcF9hbmRfZnJlZV90eF9yZXNvdXJjZShhZGFwdGVyLCAKKwkJCQkJCQlidWZmZXJfaW5mbyk7CisJCQl9CisKKwkJCXR4X2Rlc2MtPmJ1ZmZlcl9hZGRyID0gMDsKKwkJCXR4X2Rlc2MtPmxvd2VyLmRhdGEgPSAwOworCQkJdHhfZGVzYy0+dXBwZXIuZGF0YSA9IDA7CisKKwkJCWNsZWFuZWQgPSAoaSA9PSBlb3ApOworCQkJaWYodW5saWtlbHkoKytpID09IHR4X3JpbmctPmNvdW50KSkgaSA9IDA7CisJCX0KKwkJCisJCWVvcCA9IHR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldLm5leHRfdG9fd2F0Y2g7CisJCWVvcF9kZXNjID0gRTEwMDBfVFhfREVTQygqdHhfcmluZywgZW9wKTsKKwl9CisKKwl0eF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gaTsKKworCXNwaW5fbG9jaygmYWRhcHRlci0+dHhfbG9jayk7CisKKwlpZih1bmxpa2VseShjbGVhbmVkICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KSAmJgorCQkgICAgbmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShuZXRkZXYpOworCisJc3Bpbl91bmxvY2soJmFkYXB0ZXItPnR4X2xvY2spOworIAorCWlmKGFkYXB0ZXItPmRldGVjdF90eF9odW5nKSB7CisJCS8qIGRldGVjdCBhIHRyYW5zbWl0IGhhbmcgaW4gaGFyZHdhcmUsIHRoaXMgc2VyaWFsaXplcyB0aGUKKwkJICogY2hlY2sgd2l0aCB0aGUgY2xlYXJpbmcgb2YgdGltZV9zdGFtcCBhbmQgbW92ZW1lbnQgb2YgaSAqLworCQlhZGFwdGVyLT5kZXRlY3RfdHhfaHVuZyA9IEZBTFNFOworCQlpZih0eF9yaW5nLT5idWZmZXJfaW5mb1tpXS5kbWEgJiYKKwkJICAgdGltZV9hZnRlcihqaWZmaWVzLCB0eF9yaW5nLT5idWZmZXJfaW5mb1tpXS50aW1lX3N0YW1wICsgSFopICYmCisJCSAgICEoRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBTVEFUVVMpICYgRTEwMDBfU1RBVFVTX1RYT0ZGKSkKKwkJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwl9CisKKwlyZXR1cm4gY2xlYW5lZDsKK30KKworLyoqCisgKiBlMTAwMF9yeF9jaGVja3N1bSAtIFJlY2VpdmUgQ2hlY2tzdW0gT2ZmbG9hZCBmb3IgODI1NDMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICogQHJ4X2Rlc2M6IHJlY2VpdmUgZGVzY3JpcHRvcgorICogQHNrX2J1ZmY6IHNvY2tldCBidWZmZXIgd2l0aCByZWNlaXZlZCBkYXRhCisgKiovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZTEwMDBfcnhfY2hlY2tzdW0oc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZTEwMDBfcnhfZGVzYyAqcnhfZGVzYywKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJLyogODI1NDMgb3IgbmV3ZXIgb25seSAqLworCWlmKHVubGlrZWx5KChhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTQzKSB8fAorCS8qIElnbm9yZSBDaGVja3N1bSBiaXQgaXMgc2V0ICovCisJKHJ4X2Rlc2MtPnN0YXR1cyAmIEUxMDAwX1JYRF9TVEFUX0lYU00pIHx8CisJLyogVENQIENoZWNrc3VtIGhhcyBub3QgYmVlbiBjYWxjdWxhdGVkICovCisJKCEocnhfZGVzYy0+c3RhdHVzICYgRTEwMDBfUlhEX1NUQVRfVENQQ1MpKSkpIHsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQlyZXR1cm47CisJfQorCisJLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoZSBoYXJkd2FyZSBkaWQgdGhlIFRDUCBjaGVja3N1bSAqLworCS8qIG5vdyBsb29rIGF0IHRoZSBUQ1AgY2hlY2tzdW0gZXJyb3IgYml0ICovCisJaWYocnhfZGVzYy0+ZXJyb3JzICYgRTEwMDBfUlhEX0VSUl9UQ1BFKSB7CisJCS8qIGxldCB0aGUgc3RhY2sgdmVyaWZ5IGNoZWNrc3VtIGVycm9ycyAqLworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCWFkYXB0ZXItPmh3X2NzdW1fZXJyKys7CisJfSBlbHNlIHsKKwkJLyogVENQIGNoZWNrc3VtIGlzIGdvb2QgKi8KKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJYWRhcHRlci0+aHdfY3N1bV9nb29kKys7CisJfQorfQorCisvKioKKyAqIGUxMDAwX2NsZWFuX3J4X2lycSAtIFNlbmQgcmVjZWl2ZWQgZGF0YSB1cCB0aGUgbmV0d29yayBzdGFjaworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiovCisKK3N0YXRpYyBib29sZWFuX3QKKyNpZmRlZiBDT05GSUdfRTEwMDBfTkFQSQorZTEwMDBfY2xlYW5fcnhfaXJxKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLCBpbnQgKndvcmtfZG9uZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgd29ya190b19kbykKKyNlbHNlCitlMTAwMF9jbGVhbl9yeF9pcnEoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCisjZW5kaWYKK3sKKwlzdHJ1Y3QgZTEwMDBfZGVzY19yaW5nICpyeF9yaW5nID0gJmFkYXB0ZXItPnJ4X3Jpbmc7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJc3RydWN0IGUxMDAwX3J4X2Rlc2MgKnJ4X2Rlc2M7CisJc3RydWN0IGUxMDAwX2J1ZmZlciAqYnVmZmVyX2luZm87CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVpbnQzMl90IGxlbmd0aDsKKwl1aW50OF90IGxhc3RfYnl0ZTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlib29sZWFuX3QgY2xlYW5lZCA9IEZBTFNFOworCisJaSA9IHJ4X3JpbmctPm5leHRfdG9fY2xlYW47CisJcnhfZGVzYyA9IEUxMDAwX1JYX0RFU0MoKnJ4X3JpbmcsIGkpOworCisJd2hpbGUocnhfZGVzYy0+c3RhdHVzICYgRTEwMDBfUlhEX1NUQVRfREQpIHsKKwkJYnVmZmVyX2luZm8gPSAmcnhfcmluZy0+YnVmZmVyX2luZm9baV07CisjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKKwkJaWYoKndvcmtfZG9uZSA+PSB3b3JrX3RvX2RvKQorCQkJYnJlYWs7CisJCSgqd29ya19kb25lKSsrOworI2VuZGlmCisJCWNsZWFuZWQgPSBUUlVFOworCisJCXBjaV91bm1hcF9zaW5nbGUocGRldiwKKwkJICAgICAgICAgICAgICAgICBidWZmZXJfaW5mby0+ZG1hLAorCQkgICAgICAgICAgICAgICAgIGJ1ZmZlcl9pbmZvLT5sZW5ndGgsCisJCSAgICAgICAgICAgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQlza2IgPSBidWZmZXJfaW5mby0+c2tiOworCQlsZW5ndGggPSBsZTE2X3RvX2NwdShyeF9kZXNjLT5sZW5ndGgpOworCisJCWlmKHVubGlrZWx5KCEocnhfZGVzYy0+c3RhdHVzICYgRTEwMDBfUlhEX1NUQVRfRU9QKSkpIHsKKwkJCS8qIEFsbCByZWNlaXZlcyBtdXN0IGZpdCBpbnRvIGEgc2luZ2xlIGJ1ZmZlciAqLworCQkJRTEwMDBfREJHKCIlczogUmVjZWl2ZSBwYWNrZXQgY29uc3VtZWQgbXVsdGlwbGUiCisJCQkJCSIgYnVmZmVyc1xuIiwgbmV0ZGV2LT5uYW1lKTsKKwkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQlnb3RvIG5leHRfZGVzYzsKKwkJfQorCisJCWlmKHVubGlrZWx5KHJ4X2Rlc2MtPmVycm9ycyAmIEUxMDAwX1JYRF9FUlJfRlJBTUVfRVJSX01BU0spKSB7CisJCQlsYXN0X2J5dGUgPSAqKHNrYi0+ZGF0YSArIGxlbmd0aCAtIDEpOworCQkJaWYoVEJJX0FDQ0VQVCgmYWRhcHRlci0+aHcsIHJ4X2Rlc2MtPnN0YXR1cywKKwkJCSAgICAgICAgICAgICAgcnhfZGVzYy0+ZXJyb3JzLCBsZW5ndGgsIGxhc3RfYnl0ZSkpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+c3RhdHNfbG9jaywgZmxhZ3MpOworCQkJCWUxMDAwX3RiaV9hZGp1c3Rfc3RhdHMoJmFkYXB0ZXItPmh3LAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgJmFkYXB0ZXItPnN0YXRzLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLCBza2ItPmRhdGEpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnN0YXRzX2xvY2ssCisJCQkJICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisJCQkJbGVuZ3RoLS07CisJCQl9IGVsc2UgeworCQkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQkJZ290byBuZXh0X2Rlc2M7CisJCQl9CisJCX0KKworCQkvKiBHb29kIFJlY2VpdmUgKi8KKwkJc2tiX3B1dChza2IsIGxlbmd0aCAtIEVUSEVSTkVUX0ZDU19TSVpFKTsKKworCQkvKiBSZWNlaXZlIENoZWNrc3VtIE9mZmxvYWQgKi8KKwkJZTEwMDBfcnhfY2hlY2tzdW0oYWRhcHRlciwgcnhfZGVzYywgc2tiKTsKKworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBuZXRkZXYpOworI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCisJCWlmKHVubGlrZWx5KGFkYXB0ZXItPnZsZ3JwICYmCisJCQkgICAgKHJ4X2Rlc2MtPnN0YXR1cyAmIEUxMDAwX1JYRF9TVEFUX1ZQKSkpIHsKKwkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIGFkYXB0ZXItPnZsZ3JwLAorCQkJCQlsZTE2X3RvX2NwdShyeF9kZXNjLT5zcGVjaWFsKSAmCisJCQkJCUUxMDAwX1JYRF9TUENfVkxBTl9NQVNLKTsKKwkJfSBlbHNlIHsKKwkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisJCX0KKyNlbHNlIC8qIENPTkZJR19FMTAwMF9OQVBJICovCisJCWlmKHVubGlrZWx5KGFkYXB0ZXItPnZsZ3JwICYmCisJCQkgICAgKHJ4X2Rlc2MtPnN0YXR1cyAmIEUxMDAwX1JYRF9TVEFUX1ZQKSkpIHsKKwkJCXZsYW5faHdhY2NlbF9yeChza2IsIGFkYXB0ZXItPnZsZ3JwLAorCQkJCQlsZTE2X3RvX2NwdShyeF9kZXNjLT5zcGVjaWFsKSAmCisJCQkJCUUxMDAwX1JYRF9TUENfVkxBTl9NQVNLKTsKKwkJfSBlbHNlIHsKKwkJCW5ldGlmX3J4KHNrYik7CisJCX0KKyNlbmRpZiAvKiBDT05GSUdfRTEwMDBfTkFQSSAqLworCQluZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCituZXh0X2Rlc2M6CisJCXJ4X2Rlc2MtPnN0YXR1cyA9IDA7CisJCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOworCQlpZih1bmxpa2VseSgrK2kgPT0gcnhfcmluZy0+Y291bnQpKSBpID0gMDsKKworCQlyeF9kZXNjID0gRTEwMDBfUlhfREVTQygqcnhfcmluZywgaSk7CisJfQorCisJcnhfcmluZy0+bmV4dF90b19jbGVhbiA9IGk7CisKKwllMTAwMF9hbGxvY19yeF9idWZmZXJzKGFkYXB0ZXIpOworCisJcmV0dXJuIGNsZWFuZWQ7Cit9CisKKy8qKgorICogZTEwMDBfYWxsb2NfcnhfYnVmZmVycyAtIFJlcGxhY2UgdXNlZCByZWNlaXZlIGJ1ZmZlcnMKKyAqIEBhZGFwdGVyOiBhZGRyZXNzIG9mIGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiovCisKK3N0YXRpYyB2b2lkCitlMTAwMF9hbGxvY19yeF9idWZmZXJzKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBlMTAwMF9kZXNjX3JpbmcgKnJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKwlzdHJ1Y3QgZTEwMDBfcnhfZGVzYyAqcnhfZGVzYzsKKwlzdHJ1Y3QgZTEwMDBfYnVmZmVyICpidWZmZXJfaW5mbzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGludCBpLCBidWZzejsKKworCWkgPSByeF9yaW5nLT5uZXh0X3RvX3VzZTsKKwlidWZmZXJfaW5mbyA9ICZyeF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKworCXdoaWxlKCFidWZmZXJfaW5mby0+c2tiKSB7CisJCWJ1ZnN6ID0gYWRhcHRlci0+cnhfYnVmZmVyX2xlbiArIE5FVF9JUF9BTElHTjsKKworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGJ1ZnN6KTsKKwkJaWYodW5saWtlbHkoIXNrYikpIHsKKwkJCS8qIEJldHRlciBsdWNrIG5leHQgcm91bmQgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJLyogZml4IGZvciBlcnJhdGEgMjMsIGNhbnQgY3Jvc3MgNjRrQiBib3VuZGFyeSAqLworCQlpZiAoIWUxMDAwX2NoZWNrXzY0a19ib3VuZChhZGFwdGVyLCBza2ItPmRhdGEsIGJ1ZnN6KSkgeworCQkJc3RydWN0IHNrX2J1ZmYgKm9sZHNrYiA9IHNrYjsKKwkJCURQUklOVEsoUlhfRVJSLEVSUiwKKwkJCQkic2tiIGFsaWduIGNoZWNrIGZhaWxlZDogJXUgYnl0ZXMgYXQgJXBcbiIsCisJCQkJYnVmc3osIHNrYi0+ZGF0YSk7CisJCQkvKiB0cnkgYWdhaW4sIHdpdGhvdXQgZnJlZWluZyB0aGUgcHJldmlvdXMgKi8KKwkJCXNrYiA9IGRldl9hbGxvY19za2IoYnVmc3opOworCQkJaWYgKCFza2IpIHsKKwkJCQlkZXZfa2ZyZWVfc2tiKG9sZHNrYik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIWUxMDAwX2NoZWNrXzY0a19ib3VuZChhZGFwdGVyLCBza2ItPmRhdGEsIGJ1ZnN6KSkgeworCQkJCS8qIGdpdmUgdXAgKi8KKwkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQkJZGV2X2tmcmVlX3NrYihvbGRza2IpOworCQkJCWJyZWFrOyAvKiB3aGlsZSAhYnVmZmVyX2luZm8tPnNrYiAqLworCQkJfSBlbHNlIHsKKwkJCQkvKiBtb3ZlIG9uIHdpdGggdGhlIG5ldyBvbmUgKi8KKwkJCQlkZXZfa2ZyZWVfc2tiKG9sZHNrYik7CisJCQl9CisJCX0KKworCQkvKiBNYWtlIGJ1ZmZlciBhbGlnbm1lbnQgMiBiZXlvbmQgYSAxNiBieXRlIGJvdW5kYXJ5CisJCSAqIHRoaXMgd2lsbCByZXN1bHQgaW4gYSAxNiBieXRlIGFsaWduZWQgSVAgaGVhZGVyIGFmdGVyCisJCSAqIHRoZSAxNCBieXRlIE1BQyBoZWFkZXIgaXMgcmVtb3ZlZAorCQkgKi8KKwkJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOworCisJCXNrYi0+ZGV2ID0gbmV0ZGV2OworCisJCWJ1ZmZlcl9pbmZvLT5za2IgPSBza2I7CisJCWJ1ZmZlcl9pbmZvLT5sZW5ndGggPSBhZGFwdGVyLT5yeF9idWZmZXJfbGVuOworCQlidWZmZXJfaW5mby0+ZG1hID0gcGNpX21hcF9zaW5nbGUocGRldiwKKwkJCQkJCSAgc2tiLT5kYXRhLAorCQkJCQkJICBhZGFwdGVyLT5yeF9idWZmZXJfbGVuLAorCQkJCQkJICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCS8qIGZpeCBmb3IgZXJyYXRhIDIzLCBjYW50IGNyb3NzIDY0a0IgYm91bmRhcnkgKi8KKwkJaWYoIWUxMDAwX2NoZWNrXzY0a19ib3VuZChhZGFwdGVyLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWJ1ZmZlcl9pbmZvLT5kbWEsCisJCQkgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4pKSB7CisJCQlEUFJJTlRLKFJYX0VSUixFUlIsCisJCQkJImRtYSBhbGlnbiBjaGVjayBmYWlsZWQ6ICV1IGJ5dGVzIGF0ICVsZFxuIiwKKwkJCQlhZGFwdGVyLT5yeF9idWZmZXJfbGVuLCAodW5zaWduZWQgbG9uZylidWZmZXJfaW5mby0+ZG1hKTsKKworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7CisKKwkJCXBjaV91bm1hcF9zaW5nbGUocGRldiwKKwkJCQkJIGJ1ZmZlcl9pbmZvLT5kbWEsCisJCQkJCSBhZGFwdGVyLT5yeF9idWZmZXJfbGVuLAorCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJYnJlYWs7IC8qIHdoaWxlICFidWZmZXJfaW5mby0+c2tiICovCisJCX0KKworCQlyeF9kZXNjID0gRTEwMDBfUlhfREVTQygqcnhfcmluZywgaSk7CisJCXJ4X2Rlc2MtPmJ1ZmZlcl9hZGRyID0gY3B1X3RvX2xlNjQoYnVmZmVyX2luZm8tPmRtYSk7CisKKwkJaWYodW5saWtlbHkoKGkgJiB+KEUxMDAwX1JYX0JVRkZFUl9XUklURSAtIDEpKSA9PSBpKSkgeworCQkJLyogRm9yY2UgbWVtb3J5IHdyaXRlcyB0byBjb21wbGV0ZSBiZWZvcmUgbGV0dGluZyBoL3cKKwkJCSAqIGtub3cgdGhlcmUgYXJlIG5ldyBkZXNjcmlwdG9ycyB0byBmZXRjaC4gIChPbmx5CisJCQkgKiBhcHBsaWNhYmxlIGZvciB3ZWFrLW9yZGVyZWQgbWVtb3J5IG1vZGVsIGFyY2hzLAorCQkJICogc3VjaCBhcyBJQS02NCkuICovCisJCQl3bWIoKTsKKworCQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkRULCBpKTsKKwkJfQorCisJCWlmKHVubGlrZWx5KCsraSA9PSByeF9yaW5nLT5jb3VudCkpIGkgPSAwOworCQlidWZmZXJfaW5mbyA9ICZyeF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKwl9CisKKwlyeF9yaW5nLT5uZXh0X3RvX3VzZSA9IGk7Cit9CisKKy8qKgorICogZTEwMDBfc21hcnRzcGVlZCAtIFdvcmthcm91bmQgZm9yIFNtYXJ0U3BlZWQgb24gODI1NDEgYW5kIDgyNTQ3IGNvbnRyb2xsZXJzLgorICogQGFkYXB0ZXI6CisgKiovCisKK3N0YXRpYyB2b2lkCitlMTAwMF9zbWFydHNwZWVkKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCXVpbnQxNl90IHBoeV9zdGF0dXM7CisJdWludDE2X3QgcGh5X2N0cmw7CisKKwlpZigoYWRhcHRlci0+aHcucGh5X3R5cGUgIT0gZTEwMDBfcGh5X2lncCkgfHwgIWFkYXB0ZXItPmh3LmF1dG9uZWcgfHwKKwkgICAhKGFkYXB0ZXItPmh3LmF1dG9uZWdfYWR2ZXJ0aXNlZCAmIEFEVkVSVElTRV8xMDAwX0ZVTEwpKQorCQlyZXR1cm47CisKKwlpZihhZGFwdGVyLT5zbWFydHNwZWVkID09IDApIHsKKwkJLyogSWYgTWFzdGVyL1NsYXZlIGNvbmZpZyBmYXVsdCBpcyBhc3NlcnRlZCB0d2ljZSwKKwkJICogd2UgYXNzdW1lIGJhY2stdG8tYmFjayAqLworCQllMTAwMF9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBQSFlfMTAwMFRfU1RBVFVTLCAmcGh5X3N0YXR1cyk7CisJCWlmKCEocGh5X3N0YXR1cyAmIFNSXzEwMDBUX01TX0NPTkZJR19GQVVMVCkpIHJldHVybjsKKwkJZTEwMDBfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZXzEwMDBUX1NUQVRVUywgJnBoeV9zdGF0dXMpOworCQlpZighKHBoeV9zdGF0dXMgJiBTUl8xMDAwVF9NU19DT05GSUdfRkFVTFQpKSByZXR1cm47CisJCWUxMDAwX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIFBIWV8xMDAwVF9DVFJMLCAmcGh5X2N0cmwpOworCQlpZihwaHlfY3RybCAmIENSXzEwMDBUX01TX0VOQUJMRSkgeworCQkJcGh5X2N0cmwgJj0gfkNSXzEwMDBUX01TX0VOQUJMRTsKKwkJCWUxMDAwX3dyaXRlX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBQSFlfMTAwMFRfQ1RSTCwKKwkJCQkJICAgIHBoeV9jdHJsKTsKKwkJCWFkYXB0ZXItPnNtYXJ0c3BlZWQrKzsKKwkJCWlmKCFlMTAwMF9waHlfc2V0dXBfYXV0b25lZygmYWRhcHRlci0+aHcpICYmCisJCQkgICAhZTEwMDBfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZX0NUUkwsCisJCQkJICAgCSAgICAgICAmcGh5X2N0cmwpKSB7CisJCQkJcGh5X2N0cmwgfD0gKE1JSV9DUl9BVVRPX05FR19FTiB8CisJCQkJCSAgICAgTUlJX0NSX1JFU1RBUlRfQVVUT19ORUcpOworCQkJCWUxMDAwX3dyaXRlX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBQSFlfQ1RSTCwKKwkJCQkJCSAgICBwaHlfY3RybCk7CisJCQl9CisJCX0KKwkJcmV0dXJuOworCX0gZWxzZSBpZihhZGFwdGVyLT5zbWFydHNwZWVkID09IEUxMDAwX1NNQVJUU1BFRURfRE9XTlNISUZUKSB7CisJCS8qIElmIHN0aWxsIG5vIGxpbmssIHBlcmhhcHMgdXNpbmcgMi8zIHBhaXIgY2FibGUgKi8KKwkJZTEwMDBfcmVhZF9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZXzEwMDBUX0NUUkwsICZwaHlfY3RybCk7CisJCXBoeV9jdHJsIHw9IENSXzEwMDBUX01TX0VOQUJMRTsKKwkJZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIFBIWV8xMDAwVF9DVFJMLCBwaHlfY3RybCk7CisJCWlmKCFlMTAwMF9waHlfc2V0dXBfYXV0b25lZygmYWRhcHRlci0+aHcpICYmCisJCSAgICFlMTAwMF9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBQSFlfQ1RSTCwgJnBoeV9jdHJsKSkgeworCQkJcGh5X2N0cmwgfD0gKE1JSV9DUl9BVVRPX05FR19FTiB8CisJCQkJICAgICBNSUlfQ1JfUkVTVEFSVF9BVVRPX05FRyk7CisJCQllMTAwMF93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgUEhZX0NUUkwsIHBoeV9jdHJsKTsKKwkJfQorCX0KKwkvKiBSZXN0YXJ0IHByb2Nlc3MgYWZ0ZXIgRTEwMDBfU01BUlRTUEVFRF9NQVggaXRlcmF0aW9ucyAqLworCWlmKGFkYXB0ZXItPnNtYXJ0c3BlZWQrKyA9PSBFMTAwMF9TTUFSVFNQRUVEX01BWCkKKwkJYWRhcHRlci0+c21hcnRzcGVlZCA9IDA7Cit9CisKKy8qKgorICogZTEwMDBfaW9jdGwgLQorICogQG5ldGRldjoKKyAqIEBpZnJlcToKKyAqIEBjbWQ6CisgKiovCisKK3N0YXRpYyBpbnQKK2UxMDAwX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR01JSVBIWToKKwljYXNlIFNJT0NHTUlJUkVHOgorCWNhc2UgU0lPQ1NNSUlSRUc6CisJCXJldHVybiBlMTAwMF9taWlfaW9jdGwobmV0ZGV2LCBpZnIsIGNtZCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKworLyoqCisgKiBlMTAwMF9taWlfaW9jdGwgLQorICogQG5ldGRldjoKKyAqIEBpZnJlcToKKyAqIEBjbWQ6CisgKiovCisKK3N0YXRpYyBpbnQKK2UxMDAwX21paV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkoaWZyKTsKKwlpbnQgcmV0dmFsOworCXVpbnQxNl90IG1paV9yZWc7CisJdWludDE2X3Qgc3BkZHBseDsKKworCWlmKGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgIT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR01JSVBIWToKKwkJZGF0YS0+cGh5X2lkID0gYWRhcHRlci0+aHcucGh5X2FkZHI7CisJCWJyZWFrOworCWNhc2UgU0lPQ0dNSUlSRUc6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChlMTAwMF9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBkYXRhLT5yZWdfbnVtICYgMHgxRiwKKwkJCQkgICAmZGF0YS0+dmFsX291dCkpCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisJY2FzZSBTSU9DU01JSVJFRzoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGRhdGEtPnJlZ19udW0gJiB+KDB4MUYpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCW1paV9yZWcgPSBkYXRhLT52YWxfaW47CisJCWlmIChlMTAwMF93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgZGF0YS0+cmVnX251bSwKKwkJCQkJbWlpX3JlZykpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKGFkYXB0ZXItPmh3LnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpIHsKKwkJCXN3aXRjaCAoZGF0YS0+cmVnX251bSkgeworCQkJY2FzZSBQSFlfQ1RSTDoKKwkJCQlpZihtaWlfcmVnICYgTUlJX0NSX1BPV0VSX0RPV04pCisJCQkJCWJyZWFrOworCQkJCWlmKG1paV9yZWcgJiBNSUlfQ1JfQVVUT19ORUdfRU4pIHsKKwkJCQkJYWRhcHRlci0+aHcuYXV0b25lZyA9IDE7CisJCQkJCWFkYXB0ZXItPmh3LmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IDB4MkY7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKG1paV9yZWcgJiAweDQwKQorCQkJCQkJc3BkZHBseCA9IFNQRUVEXzEwMDA7CisJCQkJCWVsc2UgaWYgKG1paV9yZWcgJiAweDIwMDApCisJCQkJCQlzcGRkcGx4ID0gU1BFRURfMTAwOworCQkJCQllbHNlCisJCQkJCQlzcGRkcGx4ID0gU1BFRURfMTA7CisJCQkJCXNwZGRwbHggKz0gKG1paV9yZWcgJiAweDEwMCkKKwkJCQkJCSAgID8gRlVMTF9EVVBMRVggOgorCQkJCQkJICAgSEFMRl9EVVBMRVg7CisJCQkJCXJldHZhbCA9IGUxMDAwX3NldF9zcGRfZHBseChhZGFwdGVyLAorCQkJCQkJCQkgICAgc3BkZHBseCk7CisJCQkJCWlmKHJldHZhbCkKKwkJCQkJCXJldHVybiByZXR2YWw7CisJCQkJfQorCQkJCWlmKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgeworCQkJCQllMTAwMF9kb3duKGFkYXB0ZXIpOworCQkJCQllMTAwMF91cChhZGFwdGVyKTsKKwkJCQl9IGVsc2UKKwkJCQkJZTEwMDBfcmVzZXQoYWRhcHRlcik7CisJCQkJYnJlYWs7CisJCQljYXNlIE04OEUxMDAwX1BIWV9TUEVDX0NUUkw6CisJCQljYXNlIE04OEUxMDAwX0VYVF9QSFlfU1BFQ19DVFJMOgorCQkJCWlmIChlMTAwMF9waHlfcmVzZXQoJmFkYXB0ZXItPmh3KSkKKwkJCQkJcmV0dXJuIC1FSU87CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKGRhdGEtPnJlZ19udW0pIHsKKwkJCWNhc2UgUEhZX0NUUkw6CisJCQkJaWYobWlpX3JlZyAmIE1JSV9DUl9QT1dFUl9ET1dOKQorCQkJCQlicmVhazsKKwkJCQlpZihuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsKKwkJCQkJZTEwMDBfZG93bihhZGFwdGVyKTsKKwkJCQkJZTEwMDBfdXAoYWRhcHRlcik7CisJCQkJfSBlbHNlCisJCQkJCWUxMDAwX3Jlc2V0KGFkYXB0ZXIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIEUxMDAwX1NVQ0NFU1M7Cit9CisKK3ZvaWQKK2UxMDAwX3BjaV9zZXRfbXdpKHN0cnVjdCBlMTAwMF9odyAqaHcpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBody0+YmFjazsKKworCWludCByZXQ7CisJcmV0ID0gcGNpX3NldF9td2koYWRhcHRlci0+cGRldik7Cit9CisKK3ZvaWQKK2UxMDAwX3BjaV9jbGVhcl9td2koc3RydWN0IGUxMDAwX2h3ICpodykKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IGh3LT5iYWNrOworCisJcGNpX2NsZWFyX213aShhZGFwdGVyLT5wZGV2KTsKK30KKwordm9pZAorZTEwMDBfcmVhZF9wY2lfY2ZnKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVpbnQzMl90IHJlZywgdWludDE2X3QgKnZhbHVlKQoreworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gaHctPmJhY2s7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChhZGFwdGVyLT5wZGV2LCByZWcsIHZhbHVlKTsKK30KKwordm9pZAorZTEwMDBfd3JpdGVfcGNpX2NmZyhzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1aW50MzJfdCByZWcsIHVpbnQxNl90ICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IGh3LT5iYWNrOworCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGFkYXB0ZXItPnBkZXYsIHJlZywgKnZhbHVlKTsKK30KKwordWludDMyX3QKK2UxMDAwX2lvX3JlYWQoc3RydWN0IGUxMDAwX2h3ICpodywgdW5zaWduZWQgbG9uZyBwb3J0KQoreworCXJldHVybiBpbmwocG9ydCk7Cit9CisKK3ZvaWQKK2UxMDAwX2lvX3dyaXRlKHN0cnVjdCBlMTAwMF9odyAqaHcsIHVuc2lnbmVkIGxvbmcgcG9ydCwgdWludDMyX3QgdmFsdWUpCit7CisJb3V0bCh2YWx1ZSwgcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkCitlMTAwMF92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJdWludDMyX3QgY3RybCwgcmN0bDsKKworCWUxMDAwX2lycV9kaXNhYmxlKGFkYXB0ZXIpOworCWFkYXB0ZXItPnZsZ3JwID0gZ3JwOworCisJaWYoZ3JwKSB7CisJCS8qIGVuYWJsZSBWTEFOIHRhZyBpbnNlcnQvc3RyaXAgKi8KKwkJY3RybCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgQ1RSTCk7CisJCWN0cmwgfD0gRTEwMDBfQ1RSTF9WTUU7CisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIENUUkwsIGN0cmwpOworCisJCS8qIGVuYWJsZSBWTEFOIHJlY2VpdmUgZmlsdGVyaW5nICovCisJCXJjdGwgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJDVEwpOworCQlyY3RsIHw9IEUxMDAwX1JDVExfVkZFOworCQlyY3RsICY9IH5FMTAwMF9SQ1RMX0NGSUVOOworCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMLCByY3RsKTsKKwl9IGVsc2UgeworCQkvKiBkaXNhYmxlIFZMQU4gdGFnIGluc2VydC9zdHJpcCAqLworCQljdHJsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMKTsKKwkJY3RybCAmPSB+RTEwMDBfQ1RSTF9WTUU7CisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIENUUkwsIGN0cmwpOworCisJCS8qIGRpc2FibGUgVkxBTiBmaWx0ZXJpbmcgKi8KKwkJcmN0bCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkNUTCk7CisJCXJjdGwgJj0gfkUxMDAwX1JDVExfVkZFOworCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMLCByY3RsKTsKKwl9CisKKwllMTAwMF9pcnFfZW5hYmxlKGFkYXB0ZXIpOworfQorCitzdGF0aWMgdm9pZAorZTEwMDBfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQxNl90IHZpZCkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwl1aW50MzJfdCB2ZnRhLCBpbmRleDsKKworCS8qIGFkZCBWSUQgdG8gZmlsdGVyIHRhYmxlICovCisJaW5kZXggPSAodmlkID4+IDUpICYgMHg3RjsKKwl2ZnRhID0gRTEwMDBfUkVBRF9SRUdfQVJSQVkoJmFkYXB0ZXItPmh3LCBWRlRBLCBpbmRleCk7CisJdmZ0YSB8PSAoMSA8PCAodmlkICYgMHgxRikpOworCWUxMDAwX3dyaXRlX3ZmdGEoJmFkYXB0ZXItPmh3LCBpbmRleCwgdmZ0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitlMTAwMF92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQxNl90IHZpZCkKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwl1aW50MzJfdCB2ZnRhLCBpbmRleDsKKworCWUxMDAwX2lycV9kaXNhYmxlKGFkYXB0ZXIpOworCisJaWYoYWRhcHRlci0+dmxncnApCisJCWFkYXB0ZXItPnZsZ3JwLT52bGFuX2RldmljZXNbdmlkXSA9IE5VTEw7CisKKwllMTAwMF9pcnFfZW5hYmxlKGFkYXB0ZXIpOworCisJLyogcmVtb3ZlIFZJRCBmcm9tIGZpbHRlciB0YWJsZSAqLworCWluZGV4ID0gKHZpZCA+PiA1KSAmIDB4N0Y7CisJdmZ0YSA9IEUxMDAwX1JFQURfUkVHX0FSUkFZKCZhZGFwdGVyLT5odywgVkZUQSwgaW5kZXgpOworCXZmdGEgJj0gfigxIDw8ICh2aWQgJiAweDFGKSk7CisJZTEwMDBfd3JpdGVfdmZ0YSgmYWRhcHRlci0+aHcsIGluZGV4LCB2ZnRhKTsKK30KKworc3RhdGljIHZvaWQKK2UxMDAwX3Jlc3RvcmVfdmxhbihzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKK3sKKwllMTAwMF92bGFuX3J4X3JlZ2lzdGVyKGFkYXB0ZXItPm5ldGRldiwgYWRhcHRlci0+dmxncnApOworCisJaWYoYWRhcHRlci0+dmxncnApIHsKKwkJdWludDE2X3QgdmlkOworCQlmb3IodmlkID0gMDsgdmlkIDwgVkxBTl9HUk9VUF9BUlJBWV9MRU47IHZpZCsrKSB7CisJCQlpZighYWRhcHRlci0+dmxncnAtPnZsYW5fZGV2aWNlc1t2aWRdKQorCQkJCWNvbnRpbnVlOworCQkJZTEwMDBfdmxhbl9yeF9hZGRfdmlkKGFkYXB0ZXItPm5ldGRldiwgdmlkKTsKKwkJfQorCX0KK30KKworaW50CitlMTAwMF9zZXRfc3BkX2RwbHgoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIsIHVpbnQxNl90IHNwZGRwbHgpCit7CisJYWRhcHRlci0+aHcuYXV0b25lZyA9IDA7CisKKwlzd2l0Y2goc3BkZHBseCkgeworCWNhc2UgU1BFRURfMTAgKyBEVVBMRVhfSEFMRjoKKwkJYWRhcHRlci0+aHcuZm9yY2VkX3NwZWVkX2R1cGxleCA9IGUxMDAwXzEwX2hhbGY7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAgKyBEVVBMRVhfRlVMTDoKKwkJYWRhcHRlci0+aHcuZm9yY2VkX3NwZWVkX2R1cGxleCA9IGUxMDAwXzEwX2Z1bGw7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwICsgRFVQTEVYX0hBTEY6CisJCWFkYXB0ZXItPmh3LmZvcmNlZF9zcGVlZF9kdXBsZXggPSBlMTAwMF8xMDBfaGFsZjsKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMDAgKyBEVVBMRVhfRlVMTDoKKwkJYWRhcHRlci0+aHcuZm9yY2VkX3NwZWVkX2R1cGxleCA9IGUxMDAwXzEwMF9mdWxsOworCQlicmVhazsKKwljYXNlIFNQRUVEXzEwMDAgKyBEVVBMRVhfRlVMTDoKKwkJYWRhcHRlci0+aHcuYXV0b25lZyA9IDE7CisJCWFkYXB0ZXItPmh3LmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IEFEVkVSVElTRV8xMDAwX0ZVTEw7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwMCArIERVUExFWF9IQUxGOiAvKiBub3Qgc3VwcG9ydGVkICovCisJZGVmYXVsdDoKKwkJRFBSSU5USyhQUk9CRSwgRVJSLCAKKwkJCSJVbnN1cHBvcnRlZCBTcGVlZC9EdXBsZXhpdHkgY29uZmlndXJhdGlvblxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZTEwMDBfbm90aWZ5X3JlYm9vdChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKworCXN3aXRjaChldmVudCkgeworCWNhc2UgU1lTX0RPV046CisJY2FzZSBTWVNfSEFMVDoKKwljYXNlIFNZU19QT1dFUl9PRkY6CisJCXdoaWxlKChwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBkZXYpKSkgeworCQkJaWYocGNpX2Rldl9kcml2ZXIocGRldikgPT0gJmUxMDAwX2RyaXZlcikKKwkJCQllMTAwMF9zdXNwZW5kKHBkZXYsIDMpOworCQl9CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIGludAorZTEwMDBfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdWludDMyX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwl1aW50MzJfdCBjdHJsLCBjdHJsX2V4dCwgcmN0bCwgbWFuYywgc3RhdHVzOworCXVpbnQzMl90IHd1ZmMgPSBhZGFwdGVyLT53b2w7CisKKwluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7CisKKwlpZihuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCWUxMDAwX2Rvd24oYWRhcHRlcik7CisKKwlzdGF0dXMgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNUQVRVUyk7CisJaWYoc3RhdHVzICYgRTEwMDBfU1RBVFVTX0xVKQorCQl3dWZjICY9IH5FMTAwMF9XVUZDX0xOS0M7CisKKwlpZih3dWZjKSB7CisJCWUxMDAwX3NldHVwX3JjdGwoYWRhcHRlcik7CisJCWUxMDAwX3NldF9tdWx0aShuZXRkZXYpOworCisJCS8qIHR1cm4gb24gYWxsLW11bHRpIG1vZGUgaWYgd2FrZSBvbiBtdWx0aWNhc3QgaXMgZW5hYmxlZCAqLworCQlpZihhZGFwdGVyLT53b2wgJiBFMTAwMF9XVUZDX01DKSB7CisJCQlyY3RsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMKTsKKwkJCXJjdGwgfD0gRTEwMDBfUkNUTF9NUEU7CisJCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMLCByY3RsKTsKKwkJfQorCisJCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQwKSB7CisJCQljdHJsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMKTsKKwkJCS8qIGFkdmVydGlzZSB3YWtlIGZyb20gRDNDb2xkICovCisJCQkjZGVmaW5lIEUxMDAwX0NUUkxfQURWRDNXVUMgMHgwMDEwMDAwMAorCQkJLyogcGh5IHBvd2VyIG1hbmFnZW1lbnQgZW5hYmxlICovCisJCQkjZGVmaW5lIEUxMDAwX0NUUkxfRU5fUEhZX1BXUl9NR01UIDB4MDAyMDAwMDAKKwkJCWN0cmwgfD0gRTEwMDBfQ1RSTF9BRFZEM1dVQyB8CisJCQkJRTEwMDBfQ1RSTF9FTl9QSFlfUFdSX01HTVQ7CisJCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMLCBjdHJsKTsKKwkJfQorCisJCWlmKGFkYXB0ZXItPmh3Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9maWJlciB8fAorCQkgICBhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzKSB7CisJCQkvKiBrZWVwIHRoZSBsYXNlciBydW5uaW5nIGluIEQzICovCisJCQljdHJsX2V4dCA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgQ1RSTF9FWFQpOworCQkJY3RybF9leHQgfD0gRTEwMDBfQ1RSTF9FWFRfU0RQN19EQVRBOworCQkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgQ1RSTF9FWFQsIGN0cmxfZXh0KTsKKwkJfQorCisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFdVQywgRTEwMDBfV1VDX1BNRV9FTik7CisJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFdVRkMsIHd1ZmMpOworCQlwY2lfZW5hYmxlX3dha2UocGRldiwgMywgMSk7CisJCXBjaV9lbmFibGVfd2FrZShwZGV2LCA0LCAxKTsgLyogNCA9PSBEMyBjb2xkICovCisJfSBlbHNlIHsKKwkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgV1VDLCAwKTsKKwkJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgV1VGQywgMCk7CisJCXBjaV9lbmFibGVfd2FrZShwZGV2LCAzLCAwKTsKKwkJcGNpX2VuYWJsZV93YWtlKHBkZXYsIDQsIDApOyAvKiA0ID09IEQzIGNvbGQgKi8KKwl9CisKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKworCWlmKGFkYXB0ZXItPmh3Lm1hY190eXBlID49IGUxMDAwXzgyNTQwICYmCisJICAgYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikgeworCQltYW5jID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBNQU5DKTsKKwkJaWYobWFuYyAmIEUxMDAwX01BTkNfU01CVVNfRU4pIHsKKwkJCW1hbmMgfD0gRTEwMDBfTUFOQ19BUlBfRU47CisJCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBNQU5DLCBtYW5jKTsKKwkJCXBjaV9lbmFibGVfd2FrZShwZGV2LCAzLCAxKTsKKwkJCXBjaV9lbmFibGVfd2FrZShwZGV2LCA0LCAxKTsgLyogNCA9PSBEMyBjb2xkICovCisJCX0KKwl9CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlzdGF0ZSA9IChzdGF0ZSA+IDApID8gMyA6IDA7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBzdGF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludAorZTEwMDBfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJdWludDMyX3QgbWFuYywgcmV0OworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCAwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKwlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocGRldi0+aXNfYnVzbWFzdGVyKQorCQlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCXBjaV9lbmFibGVfd2FrZShwZGV2LCAzLCAwKTsKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgNCwgMCk7IC8qIDQgPT0gRDMgY29sZCAqLworCisJZTEwMDBfcmVzZXQoYWRhcHRlcik7CisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgV1VTLCB+MCk7CisKKwlpZihuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCWUxMDAwX3VwKGFkYXB0ZXIpOworCisJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOworCisJaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NDAgJiYKKwkgICBhZGFwdGVyLT5ody5tZWRpYV90eXBlID09IGUxMDAwX21lZGlhX3R5cGVfY29wcGVyKSB7CisJCW1hbmMgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIE1BTkMpOworCQltYW5jICY9IH4oRTEwMDBfTUFOQ19BUlBfRU4pOworCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBNQU5DLCBtYW5jKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKy8qCisgKiBQb2xsaW5nICdpbnRlcnJ1cHQnIC0gdXNlZCBieSB0aGluZ3MgbGlrZSBuZXRjb25zb2xlIHRvIHNlbmQgc2ticworICogd2l0aG91dCBoYXZpbmcgdG8gcmUtZW5hYmxlIGludGVycnVwdHMuIEl0J3Mgbm90IGNhbGxlZCB3aGlsZQorICogdGhlIGludGVycnVwdCByb3V0aW5lIGlzIGV4ZWN1dGluZy4KKyAqLworc3RhdGljIHZvaWQKK2UxMDAwX25ldHBvbGwgKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJZGlzYWJsZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxKTsKKwllMTAwMF9pbnRyKGFkYXB0ZXItPnBkZXYtPmlycSwgbmV0ZGV2LCBOVUxMKTsKKwllbmFibGVfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSk7Cit9CisjZW5kaWYKKworLyogZTEwMDBfbWFpbi5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9vc2RlcC5oIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfb3NkZXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzBjNjU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfb3NkZXAuaApAQCAtMCwwICsxLDEwMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAKKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIAorICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAorICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCAKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIAorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIAorICBtb3JlIGRldGFpbHMuCisgIAorICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSAKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgIAorICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAgCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogZ2x1ZSBmb3IgdGhlIE9TIGluZGVwZW5kZW50IHBhcnQgb2YgZTEwMDAKKyAqIGluY2x1ZGVzIHJlZ2lzdGVyIGFjY2VzcyBtYWNyb3MKKyAqLworCisjaWZuZGVmIF9FMTAwMF9PU0RFUF9IXworI2RlZmluZSBfRTEwMDBfT1NERVBfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaWZuZGVmIG1zZWNfZGVsYXkKKyNkZWZpbmUgbXNlY19kZWxheSh4KSBtc2xlZXAoeCkKKworLyogU29tZSB3b3JrYXJvdW5kcyByZXF1aXJlIG1pbGxpc2Vjb25kIGRlbGF5cyBhbmQgYXJlIHJ1biBkdXJpbmcgaW50ZXJydXB0CisgKiBjb250ZXh0LiAgTW9zdCBub3RhYmx5LCB3aGVuIGVzdGFibGlzaGluZyBsaW5rLCB0aGUgcGh5IG1heSBuZWVkIHR3ZWFraW5nCisgKiBidXQgY2Fubm90IHByb2Nlc3MgcGh5IHJlZ2lzdGVyIHJlYWRzL3dyaXRlcyBmYXN0ZXIgdGhhbiBtaWxsaXNlY29uZAorICogaW50ZXJ2YWxzLi4uYW5kIHdlIGVzdGFibGlzaCBsaW5rIGR1ZSB0byBhICJsaW5rIHN0YXR1cyBjaGFuZ2UiIGludGVycnVwdC4KKyAqLworI2RlZmluZSBtc2VjX2RlbGF5X2lycSh4KSBtZGVsYXkoeCkKKyNlbmRpZgorCisjZGVmaW5lIFBDSV9DT01NQU5EX1JFR0lTVEVSICAgUENJX0NPTU1BTkQKKyNkZWZpbmUgQ01EX01FTV9XUlRfSU5WQUxJREFURSBQQ0lfQ09NTUFORF9JTlZBTElEQVRFCisKK3R5cGVkZWYgZW51bSB7CisjdW5kZWYgRkFMU0UKKyAgICBGQUxTRSA9IDAsCisjdW5kZWYgVFJVRQorICAgIFRSVUUgPSAxCit9IGJvb2xlYW5fdDsKKworI2RlZmluZSBNU0dPVVQoUywgQSwgQikJcHJpbnRrKEtFUk5fREVCVUcgUyAiXG4iLCBBLCBCKQorCisjaWZkZWYgREJHCisjZGVmaW5lIERFQlVHT1VUKFMpCQlwcmludGsoS0VSTl9ERUJVRyBTICJcbiIpCisjZGVmaW5lIERFQlVHT1VUMShTLCBBLi4uKQlwcmludGsoS0VSTl9ERUJVRyBTICJcbiIsIEEpCisjZWxzZQorI2RlZmluZSBERUJVR09VVChTKQorI2RlZmluZSBERUJVR09VVDEoUywgQS4uLikKKyNlbmRpZgorCisjZGVmaW5lIERFQlVHRlVOQyhGKSBERUJVR09VVChGKQorI2RlZmluZSBERUJVR09VVDIgREVCVUdPVVQxCisjZGVmaW5lIERFQlVHT1VUMyBERUJVR09VVDIKKyNkZWZpbmUgREVCVUdPVVQ3IERFQlVHT1VUMworCisKKyNkZWZpbmUgRTEwMDBfV1JJVEVfUkVHKGEsIHJlZywgdmFsdWUpICggXAorICAgIHdyaXRlbCgodmFsdWUpLCAoKGEpLT5od19hZGRyICsgXAorICAgICAgICAoKChhKS0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpID8gRTEwMDBfIyNyZWcgOiBFMTAwMF84MjU0Ml8jI3JlZykpKSkKKworI2RlZmluZSBFMTAwMF9SRUFEX1JFRyhhLCByZWcpICggXAorICAgIHJlYWRsKChhKS0+aHdfYWRkciArIFwKKyAgICAgICAgKCgoYSktPm1hY190eXBlID49IGUxMDAwXzgyNTQzKSA/IEUxMDAwXyMjcmVnIDogRTEwMDBfODI1NDJfIyNyZWcpKSkKKworI2RlZmluZSBFMTAwMF9XUklURV9SRUdfQVJSQVkoYSwgcmVnLCBvZmZzZXQsIHZhbHVlKSAoIFwKKyAgICB3cml0ZWwoKHZhbHVlKSwgKChhKS0+aHdfYWRkciArIFwKKyAgICAgICAgKCgoYSktPm1hY190eXBlID49IGUxMDAwXzgyNTQzKSA/IEUxMDAwXyMjcmVnIDogRTEwMDBfODI1NDJfIyNyZWcpICsgXAorICAgICAgICAoKG9mZnNldCkgPDwgMikpKSkKKworI2RlZmluZSBFMTAwMF9SRUFEX1JFR19BUlJBWShhLCByZWcsIG9mZnNldCkgKCBcCisgICAgcmVhZGwoKGEpLT5od19hZGRyICsgXAorICAgICAgICAoKChhKS0+bWFjX3R5cGUgPj0gZTEwMDBfODI1NDMpID8gRTEwMDBfIyNyZWcgOiBFMTAwMF84MjU0Ml8jI3JlZykgKyBcCisgICAgICAgICgob2Zmc2V0KSA8PCAyKSkpCisKKyNkZWZpbmUgRTEwMDBfV1JJVEVfRkxVU0goYSkgRTEwMDBfUkVBRF9SRUcoYSwgU1RBVFVTKQorCisjZW5kaWYgLyogX0UxMDAwX09TREVQX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9wYXJhbS5jIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfcGFyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTE0ZDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfcGFyYW0uYwpAQCAtMCwwICsxLDc0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAKKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIAorICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAorICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCAKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIAorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIAorICBtb3JlIGRldGFpbHMuCisgIAorICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSAKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgIAorICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAgCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJlMTAwMC5oIgorCisvKiBUaGlzIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgY2hhbmdlZCB0byBhZGp1c3QgdGhlCisgKiBtYXhpbXVtIG51bWJlciBvZiBwb3J0cyB0aGF0IHRoZSBkcml2ZXIgY2FuIG1hbmFnZS4KKyAqLworCisjZGVmaW5lIEUxMDAwX01BWF9OSUMgMzIKKworI2RlZmluZSBPUFRJT05fVU5TRVQgICAtMQorI2RlZmluZSBPUFRJT05fRElTQUJMRUQgMAorI2RlZmluZSBPUFRJT05fRU5BQkxFRCAgMQorCisvKiBBbGwgcGFyYW1ldGVycyBhcmUgdHJlYXRlZCB0aGUgc2FtZSwgYXMgYW4gaW50ZWdlciBhcnJheSBvZiB2YWx1ZXMuCisgKiBUaGlzIG1hY3JvIGp1c3QgcmVkdWNlcyB0aGUgbmVlZCB0byByZXBlYXQgdGhlIHNhbWUgZGVjbGFyYXRpb24gY29kZQorICogb3ZlciBhbmQgb3ZlciAocGx1cyB0aGlzIGhlbHBzIHRvIGF2b2lkIHR5cG8gYnVncykuCisgKi8KKworI2RlZmluZSBFMTAwMF9QQVJBTV9JTklUIHsgWzAgLi4uIEUxMDAwX01BWF9OSUNdID0gT1BUSU9OX1VOU0VUIH0KKyNkZWZpbmUgRTEwMDBfUEFSQU0oWCwgZGVzYykgXAorCXN0YXRpYyBpbnQgX19kZXZpbml0ZGF0YSBYW0UxMDAwX01BWF9OSUMrMV0gPSBFMTAwMF9QQVJBTV9JTklUOyBcCisJc3RhdGljIGludCBudW1fIyNYID0gMDsgXAorCW1vZHVsZV9wYXJhbV9hcnJheV9uYW1lZChYLCBYLCBpbnQsICZudW1fIyNYLCAwKTsgXAorCU1PRFVMRV9QQVJNX0RFU0MoWCwgZGVzYyk7CisKKy8qIFRyYW5zbWl0IERlc2NyaXB0b3IgQ291bnQKKyAqCisgKiBWYWxpZCBSYW5nZTogODAtMjU2IGZvciA4MjU0MiBhbmQgODI1NDMgZ2lnYWJpdCBldGhlcm5ldCBjb250cm9sbGVycworICogVmFsaWQgUmFuZ2U6IDgwLTQwOTYgZm9yIDgyNTQ0IGFuZCBuZXdlcgorICoKKyAqIERlZmF1bHQgVmFsdWU6IDI1NgorICovCisKK0UxMDAwX1BBUkFNKFR4RGVzY3JpcHRvcnMsICJOdW1iZXIgb2YgdHJhbnNtaXQgZGVzY3JpcHRvcnMiKTsKKworLyogUmVjZWl2ZSBEZXNjcmlwdG9yIENvdW50CisgKgorICogVmFsaWQgUmFuZ2U6IDgwLTI1NiBmb3IgODI1NDIgYW5kIDgyNTQzIGdpZ2FiaXQgZXRoZXJuZXQgY29udHJvbGxlcnMKKyAqIFZhbGlkIFJhbmdlOiA4MC00MDk2IGZvciA4MjU0NCBhbmQgbmV3ZXIKKyAqCisgKiBEZWZhdWx0IFZhbHVlOiAyNTYKKyAqLworCitFMTAwMF9QQVJBTShSeERlc2NyaXB0b3JzLCAiTnVtYmVyIG9mIHJlY2VpdmUgZGVzY3JpcHRvcnMiKTsKKworLyogVXNlciBTcGVjaWZpZWQgU3BlZWQgT3ZlcnJpZGUKKyAqCisgKiBWYWxpZCBSYW5nZTogMCwgMTAsIDEwMCwgMTAwMAorICogIC0gMCAgICAtIGF1dG8tbmVnb3RpYXRlIGF0IGFsbCBzdXBwb3J0ZWQgc3BlZWRzCisgKiAgLSAxMCAgIC0gb25seSBsaW5rIGF0IDEwIE1icHMKKyAqICAtIDEwMCAgLSBvbmx5IGxpbmsgYXQgMTAwIE1icHMKKyAqICAtIDEwMDAgLSBvbmx5IGxpbmsgYXQgMTAwMCBNYnBzCisgKgorICogRGVmYXVsdCBWYWx1ZTogMAorICovCisKK0UxMDAwX1BBUkFNKFNwZWVkLCAiU3BlZWQgc2V0dGluZyIpOworCisvKiBVc2VyIFNwZWNpZmllZCBEdXBsZXggT3ZlcnJpZGUKKyAqCisgKiBWYWxpZCBSYW5nZTogMC0yCisgKiAgLSAwIC0gYXV0by1uZWdvdGlhdGUgZm9yIGR1cGxleAorICogIC0gMSAtIG9ubHkgbGluayBhdCBoYWxmIGR1cGxleAorICogIC0gMiAtIG9ubHkgbGluayBhdCBmdWxsIGR1cGxleAorICoKKyAqIERlZmF1bHQgVmFsdWU6IDAKKyAqLworCitFMTAwMF9QQVJBTShEdXBsZXgsICJEdXBsZXggc2V0dGluZyIpOworCisvKiBBdXRvLW5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgT3ZlcnJpZGUKKyAqCisgKiBWYWxpZCBSYW5nZTogMHgwMS0weDBGLCAweDIwLTB4MkYgKGNvcHBlcik7IDB4MjAgKGZpYmVyKQorICoKKyAqIFRoZSBBdXRvTmVnIHZhbHVlIGlzIGEgYml0IG1hc2sgZGVzY3JpYmluZyB3aGljaCBzcGVlZCBhbmQgZHVwbGV4CisgKiBjb21iaW5hdGlvbnMgc2hvdWxkIGJlIGFkdmVydGlzZWQgZHVyaW5nIGF1dG8tbmVnb3RpYXRpb24uCisgKiBUaGUgc3VwcG9ydGVkIHNwZWVkIGFuZCBkdXBsZXggbW9kZXMgYXJlIGxpc3RlZCBiZWxvdworICoKKyAqIEJpdCAgICAgICAgICAgNyAgICAgNiAgICAgNSAgICAgIDQgICAgICAzICAgICAyICAgICAxICAgICAgMAorICogU3BlZWQgKE1icHMpICBOL0EgICBOL0EgICAxMDAwICAgTi9BICAgIDEwMCAgIDEwMCAgIDEwICAgICAxMAorICogRHVwbGV4ICAgICAgICAgICAgICAgICAgICBGdWxsICAgICAgICAgIEZ1bGwgIEhhbGYgIEZ1bGwgICBIYWxmCisgKgorICogRGVmYXVsdCBWYWx1ZTogMHgyRiAoY29wcGVyKTsgMHgyMCAoZmliZXIpCisgKi8KKworRTEwMDBfUEFSQU0oQXV0b05lZywgIkFkdmVydGlzZWQgYXV0by1uZWdvdGlhdGlvbiBzZXR0aW5nIik7CisKKy8qIFVzZXIgU3BlY2lmaWVkIEZsb3cgQ29udHJvbCBPdmVycmlkZQorICoKKyAqIFZhbGlkIFJhbmdlOiAwLTMKKyAqICAtIDAgLSBObyBGbG93IENvbnRyb2wKKyAqICAtIDEgLSBSeCBvbmx5LCByZXNwb25kIHRvIFBBVVNFIGZyYW1lcyBidXQgZG8gbm90IGdlbmVyYXRlIHRoZW0KKyAqICAtIDIgLSBUeCBvbmx5LCBnZW5lcmF0ZSBQQVVTRSBmcmFtZXMgYnV0IGlnbm9yZSB0aGVtIG9uIHJlY2VpdmUKKyAqICAtIDMgLSBGdWxsIEZsb3cgQ29udHJvbCBTdXBwb3J0CisgKgorICogRGVmYXVsdCBWYWx1ZTogUmVhZCBmbG93IGNvbnRyb2wgc2V0dGluZ3MgZnJvbSB0aGUgRUVQUk9NCisgKi8KKworRTEwMDBfUEFSQU0oRmxvd0NvbnRyb2wsICJGbG93IENvbnRyb2wgc2V0dGluZyIpOworCisvKiBYc3VtUlggLSBSZWNlaXZlIENoZWNrc3VtIE9mZmxvYWQgRW5hYmxlL0Rpc2FibGUKKyAqCisgKiBWYWxpZCBSYW5nZTogMCwgMQorICogIC0gMCAtIGRpc2FibGVzIGFsbCBjaGVja3N1bSBvZmZsb2FkCisgKiAgLSAxIC0gZW5hYmxlcyByZWNlaXZlIElQL1RDUC9VRFAgY2hlY2tzdW0gb2ZmbG9hZAorICogICAgICAgIG9uIDgyNTQzIGFuZCBuZXdlciAtYmFzZWQgTklDcworICoKKyAqIERlZmF1bHQgVmFsdWU6IDEKKyAqLworCitFMTAwMF9QQVJBTShYc3VtUlgsICJEaXNhYmxlIG9yIGVuYWJsZSBSZWNlaXZlIENoZWNrc3VtIG9mZmxvYWQiKTsKKworLyogVHJhbnNtaXQgSW50ZXJydXB0IERlbGF5IGluIHVuaXRzIG9mIDEuMDI0IG1pY3Jvc2Vjb25kcworICoKKyAqIFZhbGlkIFJhbmdlOiAwLTY1NTM1CisgKgorICogRGVmYXVsdCBWYWx1ZTogNjQKKyAqLworCitFMTAwMF9QQVJBTShUeEludERlbGF5LCAiVHJhbnNtaXQgSW50ZXJydXB0IERlbGF5Iik7CisKKy8qIFRyYW5zbWl0IEFic29sdXRlIEludGVycnVwdCBEZWxheSBpbiB1bml0cyBvZiAxLjAyNCBtaWNyb3NlY29uZHMKKyAqCisgKiBWYWxpZCBSYW5nZTogMC02NTUzNQorICoKKyAqIERlZmF1bHQgVmFsdWU6IDAKKyAqLworCitFMTAwMF9QQVJBTShUeEFic0ludERlbGF5LCAiVHJhbnNtaXQgQWJzb2x1dGUgSW50ZXJydXB0IERlbGF5Iik7CisKKy8qIFJlY2VpdmUgSW50ZXJydXB0IERlbGF5IGluIHVuaXRzIG9mIDEuMDI0IG1pY3Jvc2Vjb25kcworICoKKyAqIFZhbGlkIFJhbmdlOiAwLTY1NTM1CisgKgorICogRGVmYXVsdCBWYWx1ZTogMAorICovCisKK0UxMDAwX1BBUkFNKFJ4SW50RGVsYXksICJSZWNlaXZlIEludGVycnVwdCBEZWxheSIpOworCisvKiBSZWNlaXZlIEFic29sdXRlIEludGVycnVwdCBEZWxheSBpbiB1bml0cyBvZiAxLjAyNCBtaWNyb3NlY29uZHMKKyAqCisgKiBWYWxpZCBSYW5nZTogMC02NTUzNQorICoKKyAqIERlZmF1bHQgVmFsdWU6IDEyOAorICovCisKK0UxMDAwX1BBUkFNKFJ4QWJzSW50RGVsYXksICJSZWNlaXZlIEFic29sdXRlIEludGVycnVwdCBEZWxheSIpOworCisvKiBJbnRlcnJ1cHQgVGhyb3R0bGUgUmF0ZSAoaW50ZXJydXB0cy9zZWMpCisgKgorICogVmFsaWQgUmFuZ2U6IDEwMC0xMDAwMDAgKDA9b2ZmLCAxPWR5bmFtaWMpCisgKgorICogRGVmYXVsdCBWYWx1ZTogMQorICovCisKK0UxMDAwX1BBUkFNKEludGVycnVwdFRocm90dGxlUmF0ZSwgIkludGVycnVwdCBUaHJvdHRsaW5nIFJhdGUiKTsKKworI2RlZmluZSBBVVRPTkVHX0FEVl9ERUZBVUxUICAweDJGCisjZGVmaW5lIEFVVE9ORUdfQURWX01BU0sgICAgIDB4MkYKKyNkZWZpbmUgRkxPV19DT05UUk9MX0RFRkFVTFQgRkxPV19DT05UUk9MX0ZVTEwKKworI2RlZmluZSBERUZBVUxUX1JEVFIgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNQVhfUlhERUxBWSAgICAgICAgICAgICAgIDB4RkZGRgorI2RlZmluZSBNSU5fUlhERUxBWSAgICAgICAgICAgICAgICAgICAgMAorCisjZGVmaW5lIERFRkFVTFRfUkFEViAgICAgICAgICAgICAgICAgMTI4CisjZGVmaW5lIE1BWF9SWEFCU0RFTEFZICAgICAgICAgICAgMHhGRkZGCisjZGVmaW5lIE1JTl9SWEFCU0RFTEFZICAgICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgREVGQVVMVF9USURWICAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgTUFYX1RYREVMQVkgICAgICAgICAgICAgICAweEZGRkYKKyNkZWZpbmUgTUlOX1RYREVMQVkgICAgICAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBERUZBVUxUX1RBRFYgICAgICAgICAgICAgICAgICA2NAorI2RlZmluZSBNQVhfVFhBQlNERUxBWSAgICAgICAgICAgIDB4RkZGRgorI2RlZmluZSBNSU5fVFhBQlNERUxBWSAgICAgICAgICAgICAgICAgMAorCisjZGVmaW5lIERFRkFVTFRfSVRSICAgICAgICAgICAgICAgICA4MDAwCisjZGVmaW5lIE1BWF9JVFIgICAgICAgICAgICAgICAgICAgMTAwMDAwCisjZGVmaW5lIE1JTl9JVFIgICAgICAgICAgICAgICAgICAgICAgMTAwCisKK3N0cnVjdCBlMTAwMF9vcHRpb24geworCWVudW0geyBlbmFibGVfb3B0aW9uLCByYW5nZV9vcHRpb24sIGxpc3Rfb3B0aW9uIH0gdHlwZTsKKwljaGFyICpuYW1lOworCWNoYXIgKmVycjsKKwlpbnQgIGRlZjsKKwl1bmlvbiB7CisJCXN0cnVjdCB7IC8qIHJhbmdlX29wdGlvbiBpbmZvICovCisJCQlpbnQgbWluOworCQkJaW50IG1heDsKKwkJfSByOworCQlzdHJ1Y3QgeyAvKiBsaXN0X29wdGlvbiBpbmZvICovCisJCQlpbnQgbnI7CisJCQlzdHJ1Y3QgZTEwMDBfb3B0X2xpc3QgeyBpbnQgaTsgY2hhciAqc3RyOyB9ICpwOworCQl9IGw7CisJfSBhcmc7Cit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorZTEwMDBfdmFsaWRhdGVfb3B0aW9uKGludCAqdmFsdWUsIHN0cnVjdCBlMTAwMF9vcHRpb24gKm9wdCwKKwkJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYoKnZhbHVlID09IE9QVElPTl9VTlNFVCkgeworCQkqdmFsdWUgPSBvcHQtPmRlZjsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChvcHQtPnR5cGUpIHsKKwljYXNlIGVuYWJsZV9vcHRpb246CisJCXN3aXRjaCAoKnZhbHVlKSB7CisJCWNhc2UgT1BUSU9OX0VOQUJMRUQ6CisJCQlEUFJJTlRLKFBST0JFLCBJTkZPLCAiJXMgRW5hYmxlZFxuIiwgb3B0LT5uYW1lKTsKKwkJCXJldHVybiAwOworCQljYXNlIE9QVElPTl9ESVNBQkxFRDoKKwkJCURQUklOVEsoUFJPQkUsIElORk8sICIlcyBEaXNhYmxlZFxuIiwgb3B0LT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCWNhc2UgcmFuZ2Vfb3B0aW9uOgorCQlpZigqdmFsdWUgPj0gb3B0LT5hcmcuci5taW4gJiYgKnZhbHVlIDw9IG9wdC0+YXJnLnIubWF4KSB7CisJCQlEUFJJTlRLKFBST0JFLCBJTkZPLAorCQkJCQkiJXMgc2V0IHRvICVpXG4iLCBvcHQtPm5hbWUsICp2YWx1ZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIGxpc3Rfb3B0aW9uOiB7CisJCWludCBpOworCQlzdHJ1Y3QgZTEwMDBfb3B0X2xpc3QgKmVudDsKKworCQlmb3IoaSA9IDA7IGkgPCBvcHQtPmFyZy5sLm5yOyBpKyspIHsKKwkJCWVudCA9ICZvcHQtPmFyZy5sLnBbaV07CisJCQlpZigqdmFsdWUgPT0gZW50LT5pKSB7CisJCQkJaWYoZW50LT5zdHJbMF0gIT0gJ1wwJykKKwkJCQkJRFBSSU5USyhQUk9CRSwgSU5GTywgIiVzXG4iLCBlbnQtPnN0cik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCURQUklOVEsoUFJPQkUsIElORk8sICJJbnZhbGlkICVzIHNwZWNpZmllZCAoJWkpICVzXG4iLAorCSAgICAgICBvcHQtPm5hbWUsICp2YWx1ZSwgb3B0LT5lcnIpOworCSp2YWx1ZSA9IG9wdC0+ZGVmOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgZTEwMDBfY2hlY2tfZmliZXJfb3B0aW9ucyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgdm9pZCBlMTAwMF9jaGVja19jb3BwZXJfb3B0aW9ucyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcik7CisKKy8qKgorICogZTEwMDBfY2hlY2tfb3B0aW9ucyAtIFJhbmdlIENoZWNraW5nIGZvciBDb21tYW5kIExpbmUgUGFyYW1ldGVycworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogVGhpcyByb3V0aW5lIGNoZWNrcyBhbGwgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgZm9yIHZhbGlkIHVzZXIKKyAqIGlucHV0LiAgSWYgYW4gaW52YWxpZCB2YWx1ZSBpcyBnaXZlbiwgb3IgaWYgbm8gdXNlciBzcGVjaWZpZWQKKyAqIHZhbHVlIGV4aXN0cywgYSBkZWZhdWx0IHZhbHVlIGlzIHVzZWQuICBUaGUgZmluYWwgdmFsdWUgaXMgc3RvcmVkCisgKiBpbiBhIHZhcmlhYmxlIGluIHRoZSBhZGFwdGVyIHN0cnVjdHVyZS4KKyAqKi8KKwordm9pZCBfX2RldmluaXQKK2UxMDAwX2NoZWNrX29wdGlvbnMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGJkID0gYWRhcHRlci0+YmRfbnVtYmVyOworCWlmKGJkID49IEUxMDAwX01BWF9OSUMpIHsKKwkJRFBSSU5USyhQUk9CRSwgTk9USUNFLAorCQkgICAgICAgIldhcm5pbmc6IG5vIGNvbmZpZ3VyYXRpb24gZm9yIGJvYXJkICMlaVxuIiwgYmQpOworCQlEUFJJTlRLKFBST0JFLCBOT1RJQ0UsICJVc2luZyBkZWZhdWx0cyBmb3IgYWxsIHZhbHVlc1xuIik7CisJfQorCisJeyAvKiBUcmFuc21pdCBEZXNjcmlwdG9yIENvdW50ICovCisJCXN0cnVjdCBlMTAwMF9vcHRpb24gb3B0ID0geworCQkJLnR5cGUgPSByYW5nZV9vcHRpb24sCisJCQkubmFtZSA9ICJUcmFuc21pdCBEZXNjcmlwdG9ycyIsCisJCQkuZXJyICA9ICJ1c2luZyBkZWZhdWx0IG9mICIKKwkJCQlfX01PRFVMRV9TVFJJTkcoRTEwMDBfREVGQVVMVF9UWEQpLAorCQkJLmRlZiAgPSBFMTAwMF9ERUZBVUxUX1RYRCwKKwkJCS5hcmcgID0geyAuciA9IHsgLm1pbiA9IEUxMDAwX01JTl9UWEQgfX0KKwkJfTsKKwkJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyAqdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nOworCQllMTAwMF9tYWNfdHlwZSBtYWNfdHlwZSA9IGFkYXB0ZXItPmh3Lm1hY190eXBlOworCQlvcHQuYXJnLnIubWF4ID0gbWFjX3R5cGUgPCBlMTAwMF84MjU0NCA/CisJCQlFMTAwMF9NQVhfVFhEIDogRTEwMDBfTUFYXzgyNTQ0X1RYRDsKKworCQlpZiAobnVtX1R4RGVzY3JpcHRvcnMgPiBiZCkgeworCQkJdHhfcmluZy0+Y291bnQgPSBUeERlc2NyaXB0b3JzW2JkXTsKKwkJCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigmdHhfcmluZy0+Y291bnQsICZvcHQsIGFkYXB0ZXIpOworCQkJRTEwMDBfUk9VTkRVUCh0eF9yaW5nLT5jb3VudCwgCisJCQkJCQlSRVFfVFhfREVTQ1JJUFRPUl9NVUxUSVBMRSk7CisJCX0gZWxzZSB7CisJCQl0eF9yaW5nLT5jb3VudCA9IG9wdC5kZWY7CisJCX0KKwl9CisJeyAvKiBSZWNlaXZlIERlc2NyaXB0b3IgQ291bnQgKi8KKwkJc3RydWN0IGUxMDAwX29wdGlvbiBvcHQgPSB7CisJCQkudHlwZSA9IHJhbmdlX29wdGlvbiwKKwkJCS5uYW1lID0gIlJlY2VpdmUgRGVzY3JpcHRvcnMiLAorCQkJLmVyciAgPSAidXNpbmcgZGVmYXVsdCBvZiAiCisJCQkJX19NT0RVTEVfU1RSSU5HKEUxMDAwX0RFRkFVTFRfUlhEKSwKKwkJCS5kZWYgID0gRTEwMDBfREVGQVVMVF9SWEQsCisJCQkuYXJnICA9IHsgLnIgPSB7IC5taW4gPSBFMTAwMF9NSU5fUlhEIH19CisJCX07CisJCXN0cnVjdCBlMTAwMF9kZXNjX3JpbmcgKnJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZzsKKwkJZTEwMDBfbWFjX3R5cGUgbWFjX3R5cGUgPSBhZGFwdGVyLT5ody5tYWNfdHlwZTsKKwkJb3B0LmFyZy5yLm1heCA9IG1hY190eXBlIDwgZTEwMDBfODI1NDQgPyBFMTAwMF9NQVhfUlhEIDoKKwkJCUUxMDAwX01BWF84MjU0NF9SWEQ7CisKKwkJaWYgKG51bV9SeERlc2NyaXB0b3JzID4gYmQpIHsKKwkJCXJ4X3JpbmctPmNvdW50ID0gUnhEZXNjcmlwdG9yc1tiZF07CisJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJnJ4X3JpbmctPmNvdW50LCAmb3B0LCBhZGFwdGVyKTsKKwkJCUUxMDAwX1JPVU5EVVAocnhfcmluZy0+Y291bnQsIAorCQkJCQkJUkVRX1JYX0RFU0NSSVBUT1JfTVVMVElQTEUpOworCQl9IGVsc2UgeworCQkJcnhfcmluZy0+Y291bnQgPSBvcHQuZGVmOworCQl9CisJfQorCXsgLyogQ2hlY2tzdW0gT2ZmbG9hZCBFbmFibGUvRGlzYWJsZSAqLworCQlzdHJ1Y3QgZTEwMDBfb3B0aW9uIG9wdCA9IHsKKwkJCS50eXBlID0gZW5hYmxlX29wdGlvbiwKKwkJCS5uYW1lID0gIkNoZWNrc3VtIE9mZmxvYWQiLAorCQkJLmVyciAgPSAiZGVmYXVsdGluZyB0byBFbmFibGVkIiwKKwkJCS5kZWYgID0gT1BUSU9OX0VOQUJMRUQKKwkJfTsKKworCQlpZiAobnVtX1hzdW1SWCA+IGJkKSB7CisJCQlpbnQgcnhfY3N1bSA9IFhzdW1SWFtiZF07CisJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJnJ4X2NzdW0sICZvcHQsIGFkYXB0ZXIpOworCQkJYWRhcHRlci0+cnhfY3N1bSA9IHJ4X2NzdW07CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5yeF9jc3VtID0gb3B0LmRlZjsKKwkJfQorCX0KKwl7IC8qIEZsb3cgQ29udHJvbCAqLworCisJCXN0cnVjdCBlMTAwMF9vcHRfbGlzdCBmY19saXN0W10gPQorCQkJe3sgZTEwMDBfZmNfbm9uZSwgICAgIkZsb3cgQ29udHJvbCBEaXNhYmxlZCIgfSwKKwkJCSB7IGUxMDAwX2ZjX3J4X3BhdXNlLCJGbG93IENvbnRyb2wgUmVjZWl2ZSBPbmx5IiB9LAorCQkJIHsgZTEwMDBfZmNfdHhfcGF1c2UsIkZsb3cgQ29udHJvbCBUcmFuc21pdCBPbmx5IiB9LAorCQkJIHsgZTEwMDBfZmNfZnVsbCwgICAgIkZsb3cgQ29udHJvbCBFbmFibGVkIiB9LAorCQkJIHsgZTEwMDBfZmNfZGVmYXVsdCwgIkZsb3cgQ29udHJvbCBIYXJkd2FyZSBEZWZhdWx0IiB9fTsKKworCQlzdHJ1Y3QgZTEwMDBfb3B0aW9uIG9wdCA9IHsKKwkJCS50eXBlID0gbGlzdF9vcHRpb24sCisJCQkubmFtZSA9ICJGbG93IENvbnRyb2wiLAorCQkJLmVyciAgPSAicmVhZGluZyBkZWZhdWx0IHNldHRpbmdzIGZyb20gRUVQUk9NIiwKKwkJCS5kZWYgID0gZTEwMDBfZmNfZGVmYXVsdCwKKwkJCS5hcmcgID0geyAubCA9IHsgLm5yID0gQVJSQVlfU0laRShmY19saXN0KSwKKwkJCQkJIC5wID0gZmNfbGlzdCB9fQorCQl9OworCisJCWlmIChudW1fRmxvd0NvbnRyb2wgPiBiZCkgeworCQkJaW50IGZjID0gRmxvd0NvbnRyb2xbYmRdOworCQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZmYywgJm9wdCwgYWRhcHRlcik7CisJCQlhZGFwdGVyLT5ody5mYyA9IGFkYXB0ZXItPmh3Lm9yaWdpbmFsX2ZjID0gZmM7CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5ody5mYyA9IG9wdC5kZWY7CisJCX0KKwl9CisJeyAvKiBUcmFuc21pdCBJbnRlcnJ1cHQgRGVsYXkgKi8KKwkJc3RydWN0IGUxMDAwX29wdGlvbiBvcHQgPSB7CisJCQkudHlwZSA9IHJhbmdlX29wdGlvbiwKKwkJCS5uYW1lID0gIlRyYW5zbWl0IEludGVycnVwdCBEZWxheSIsCisJCQkuZXJyICA9ICJ1c2luZyBkZWZhdWx0IG9mICIgX19NT0RVTEVfU1RSSU5HKERFRkFVTFRfVElEViksCisJCQkuZGVmICA9IERFRkFVTFRfVElEViwKKwkJCS5hcmcgID0geyAuciA9IHsgLm1pbiA9IE1JTl9UWERFTEFZLAorCQkJCQkgLm1heCA9IE1BWF9UWERFTEFZIH19CisJCX07CisKKwkJaWYgKG51bV9UeEludERlbGF5ID4gYmQpIHsKKwkJCWFkYXB0ZXItPnR4X2ludF9kZWxheSA9IFR4SW50RGVsYXlbYmRdOworCQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZhZGFwdGVyLT50eF9pbnRfZGVsYXksICZvcHQsIAorCQkJCQkJCQlhZGFwdGVyKTsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXItPnR4X2ludF9kZWxheSA9IG9wdC5kZWY7CisJCX0KKwl9CisJeyAvKiBUcmFuc21pdCBBYnNvbHV0ZSBJbnRlcnJ1cHQgRGVsYXkgKi8KKwkJc3RydWN0IGUxMDAwX29wdGlvbiBvcHQgPSB7CisJCQkudHlwZSA9IHJhbmdlX29wdGlvbiwKKwkJCS5uYW1lID0gIlRyYW5zbWl0IEFic29sdXRlIEludGVycnVwdCBEZWxheSIsCisJCQkuZXJyICA9ICJ1c2luZyBkZWZhdWx0IG9mICIgX19NT0RVTEVfU1RSSU5HKERFRkFVTFRfVEFEViksCisJCQkuZGVmICA9IERFRkFVTFRfVEFEViwKKwkJCS5hcmcgID0geyAuciA9IHsgLm1pbiA9IE1JTl9UWEFCU0RFTEFZLAorCQkJCQkgLm1heCA9IE1BWF9UWEFCU0RFTEFZIH19CisJCX07CisKKwkJaWYgKG51bV9UeEFic0ludERlbGF5ID4gYmQpIHsKKwkJCWFkYXB0ZXItPnR4X2Fic19pbnRfZGVsYXkgPSBUeEFic0ludERlbGF5W2JkXTsKKwkJCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigmYWRhcHRlci0+dHhfYWJzX2ludF9kZWxheSwgJm9wdCwgCisJCQkJCQkJCWFkYXB0ZXIpOworCQl9IGVsc2UgeworCQkJYWRhcHRlci0+dHhfYWJzX2ludF9kZWxheSA9IG9wdC5kZWY7CisJCX0KKwl9CisJeyAvKiBSZWNlaXZlIEludGVycnVwdCBEZWxheSAqLworCQlzdHJ1Y3QgZTEwMDBfb3B0aW9uIG9wdCA9IHsKKwkJCS50eXBlID0gcmFuZ2Vfb3B0aW9uLAorCQkJLm5hbWUgPSAiUmVjZWl2ZSBJbnRlcnJ1cHQgRGVsYXkiLAorCQkJLmVyciAgPSAidXNpbmcgZGVmYXVsdCBvZiAiIF9fTU9EVUxFX1NUUklORyhERUZBVUxUX1JEVFIpLAorCQkJLmRlZiAgPSBERUZBVUxUX1JEVFIsCisJCQkuYXJnICA9IHsgLnIgPSB7IC5taW4gPSBNSU5fUlhERUxBWSwKKwkJCQkJIC5tYXggPSBNQVhfUlhERUxBWSB9fQorCQl9OworCisJCWlmIChudW1fUnhJbnREZWxheSA+IGJkKSB7CisJCQlhZGFwdGVyLT5yeF9pbnRfZGVsYXkgPSBSeEludERlbGF5W2JkXTsKKwkJCWUxMDAwX3ZhbGlkYXRlX29wdGlvbigmYWRhcHRlci0+cnhfaW50X2RlbGF5LCAmb3B0LCAKKwkJCQkJCQkJYWRhcHRlcik7CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5yeF9pbnRfZGVsYXkgPSBvcHQuZGVmOworCQl9CisJfQorCXsgLyogUmVjZWl2ZSBBYnNvbHV0ZSBJbnRlcnJ1cHQgRGVsYXkgKi8KKwkJc3RydWN0IGUxMDAwX29wdGlvbiBvcHQgPSB7CisJCQkudHlwZSA9IHJhbmdlX29wdGlvbiwKKwkJCS5uYW1lID0gIlJlY2VpdmUgQWJzb2x1dGUgSW50ZXJydXB0IERlbGF5IiwKKwkJCS5lcnIgID0gInVzaW5nIGRlZmF1bHQgb2YgIiBfX01PRFVMRV9TVFJJTkcoREVGQVVMVF9SQURWKSwKKwkJCS5kZWYgID0gREVGQVVMVF9SQURWLAorCQkJLmFyZyAgPSB7IC5yID0geyAubWluID0gTUlOX1JYQUJTREVMQVksCisJCQkJCSAubWF4ID0gTUFYX1JYQUJTREVMQVkgfX0KKwkJfTsKKworCQlpZiAobnVtX1J4QWJzSW50RGVsYXkgPiBiZCkgeworCQkJYWRhcHRlci0+cnhfYWJzX2ludF9kZWxheSA9IFJ4QWJzSW50RGVsYXlbYmRdOworCQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZhZGFwdGVyLT5yeF9hYnNfaW50X2RlbGF5LCAmb3B0LCAKKwkJCQkJCQkJYWRhcHRlcik7CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5yeF9hYnNfaW50X2RlbGF5ID0gb3B0LmRlZjsKKwkJfQorCX0KKwl7IC8qIEludGVycnVwdCBUaHJvdHRsaW5nIFJhdGUgKi8KKwkJc3RydWN0IGUxMDAwX29wdGlvbiBvcHQgPSB7CisJCQkudHlwZSA9IHJhbmdlX29wdGlvbiwKKwkJCS5uYW1lID0gIkludGVycnVwdCBUaHJvdHRsaW5nIFJhdGUgKGludHMvc2VjKSIsCisJCQkuZXJyICA9ICJ1c2luZyBkZWZhdWx0IG9mICIgX19NT0RVTEVfU1RSSU5HKERFRkFVTFRfSVRSKSwKKwkJCS5kZWYgID0gREVGQVVMVF9JVFIsCisJCQkuYXJnICA9IHsgLnIgPSB7IC5taW4gPSBNSU5fSVRSLAorCQkJCQkgLm1heCA9IE1BWF9JVFIgfX0KKwkJfTsKKworCQlpZiAobnVtX0ludGVycnVwdFRocm90dGxlUmF0ZSA+IGJkKSB7CisJCQlhZGFwdGVyLT5pdHIgPSBJbnRlcnJ1cHRUaHJvdHRsZVJhdGVbYmRdOworCQkJc3dpdGNoKGFkYXB0ZXItPml0cikgeworCQkJY2FzZSAwOgorCQkJCURQUklOVEsoUFJPQkUsIElORk8sICIlcyB0dXJuZWQgb2ZmXG4iLCAKKwkJCQkJb3B0Lm5hbWUpOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCURQUklOVEsoUFJPQkUsIElORk8sICIlcyBzZXQgdG8gZHluYW1pYyBtb2RlXG4iLCAKKwkJCQkJb3B0Lm5hbWUpOworCQkJCWJyZWFrOworCQkJY2FzZSAtMToKKwkJCWRlZmF1bHQ6CisJCQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZhZGFwdGVyLT5pdHIsICZvcHQsIAorCQkJCQlhZGFwdGVyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXItPml0ciA9IG9wdC5kZWY7CisJCX0KKwl9CisKKwlzd2l0Y2goYWRhcHRlci0+aHcubWVkaWFfdHlwZSkgeworCWNhc2UgZTEwMDBfbWVkaWFfdHlwZV9maWJlcjoKKwljYXNlIGUxMDAwX21lZGlhX3R5cGVfaW50ZXJuYWxfc2VyZGVzOgorCQllMTAwMF9jaGVja19maWJlcl9vcHRpb25zKGFkYXB0ZXIpOworCQlicmVhazsKKwljYXNlIGUxMDAwX21lZGlhX3R5cGVfY29wcGVyOgorCQllMTAwMF9jaGVja19jb3BwZXJfb3B0aW9ucyhhZGFwdGVyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCisvKioKKyAqIGUxMDAwX2NoZWNrX2ZpYmVyX29wdGlvbnMgLSBSYW5nZSBDaGVja2luZyBmb3IgTGluayBPcHRpb25zLCBGaWJlciBWZXJzaW9uCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBIYW5kbGVzIHNwZWVkIGFuZCBkdXBsZXggb3B0aW9ucyBvbiBmaWJlciBhZGFwdGVycworICoqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQKK2UxMDAwX2NoZWNrX2ZpYmVyX29wdGlvbnMoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGJkID0gYWRhcHRlci0+YmRfbnVtYmVyOworCWlmKG51bV9TcGVlZCA+IGJkKSB7CisJCURQUklOVEsoUFJPQkUsIElORk8sICJTcGVlZCBub3QgdmFsaWQgZm9yIGZpYmVyIGFkYXB0ZXJzLCAiCisJCSAgICAgICAicGFyYW1ldGVyIGlnbm9yZWRcbiIpOworCX0KKworCWlmKG51bV9EdXBsZXggPiBiZCkgeworCQlEUFJJTlRLKFBST0JFLCBJTkZPLCAiRHVwbGV4IG5vdCB2YWxpZCBmb3IgZmliZXIgYWRhcHRlcnMsICIKKwkJICAgICAgICJwYXJhbWV0ZXIgaWdub3JlZFxuIik7CisJfQorCisJaWYoKG51bV9BdXRvTmVnID4gYmQpICYmIChBdXRvTmVnW2JkXSAhPSAweDIwKSkgeworCQlEUFJJTlRLKFBST0JFLCBJTkZPLCAiQXV0b05lZyBvdGhlciB0aGFuIDEwMDAvRnVsbCBpcyAiCisJCQkJICJub3QgdmFsaWQgZm9yIGZpYmVyIGFkYXB0ZXJzLCAiCisJCQkJICJwYXJhbWV0ZXIgaWdub3JlZFxuIik7CisJfQorfQorCisvKioKKyAqIGUxMDAwX2NoZWNrX2NvcHBlcl9vcHRpb25zIC0gUmFuZ2UgQ2hlY2tpbmcgZm9yIExpbmsgT3B0aW9ucywgQ29wcGVyIFZlcnNpb24KKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIEhhbmRsZXMgc3BlZWQgYW5kIGR1cGxleCBvcHRpb25zIG9uIGNvcHBlciBhZGFwdGVycworICoqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQKK2UxMDAwX2NoZWNrX2NvcHBlcl9vcHRpb25zKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBzcGVlZCwgZHBseDsKKwlpbnQgYmQgPSBhZGFwdGVyLT5iZF9udW1iZXI7CisKKwl7IC8qIFNwZWVkICovCisJCXN0cnVjdCBlMTAwMF9vcHRfbGlzdCBzcGVlZF9saXN0W10gPSB7eyAgICAgICAgICAwLCAiIiB9LAorCQkJCQkJICAgICAgeyAgIFNQRUVEXzEwLCAiIiB9LAorCQkJCQkJICAgICAgeyAgU1BFRURfMTAwLCAiIiB9LAorCQkJCQkJICAgICAgeyBTUEVFRF8xMDAwLCAiIiB9fTsKKworCQlzdHJ1Y3QgZTEwMDBfb3B0aW9uIG9wdCA9IHsKKwkJCS50eXBlID0gbGlzdF9vcHRpb24sCisJCQkubmFtZSA9ICJTcGVlZCIsCisJCQkuZXJyICA9ICJwYXJhbWV0ZXIgaWdub3JlZCIsCisJCQkuZGVmICA9IDAsCisJCQkuYXJnICA9IHsgLmwgPSB7IC5uciA9IEFSUkFZX1NJWkUoc3BlZWRfbGlzdCksCisJCQkJCSAucCA9IHNwZWVkX2xpc3QgfX0KKwkJfTsKKworCQlpZiAobnVtX1NwZWVkID4gYmQpIHsKKwkJCXNwZWVkID0gU3BlZWRbYmRdOworCQkJZTEwMDBfdmFsaWRhdGVfb3B0aW9uKCZzcGVlZCwgJm9wdCwgYWRhcHRlcik7CisJCX0gZWxzZSB7CisJCQlzcGVlZCA9IG9wdC5kZWY7CisJCX0KKwl9CisJeyAvKiBEdXBsZXggKi8KKwkJc3RydWN0IGUxMDAwX29wdF9saXN0IGRwbHhfbGlzdFtdID0ge3sgICAgICAgICAgIDAsICIiIH0sCisJCQkJCQkgICAgIHsgSEFMRl9EVVBMRVgsICIiIH0sCisJCQkJCQkgICAgIHsgRlVMTF9EVVBMRVgsICIiIH19OworCisJCXN0cnVjdCBlMTAwMF9vcHRpb24gb3B0ID0geworCQkJLnR5cGUgPSBsaXN0X29wdGlvbiwKKwkJCS5uYW1lID0gIkR1cGxleCIsCisJCQkuZXJyICA9ICJwYXJhbWV0ZXIgaWdub3JlZCIsCisJCQkuZGVmICA9IDAsCisJCQkuYXJnICA9IHsgLmwgPSB7IC5uciA9IEFSUkFZX1NJWkUoZHBseF9saXN0KSwKKwkJCQkJIC5wID0gZHBseF9saXN0IH19CisJCX07CisKKwkJaWYgKG51bV9EdXBsZXggPiBiZCkgeworCQkJZHBseCA9IER1cGxleFtiZF07CisJCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmRwbHgsICZvcHQsIGFkYXB0ZXIpOworCQl9IGVsc2UgeworCQkJZHBseCA9IG9wdC5kZWY7CisJCX0KKwl9CisKKwlpZigobnVtX0F1dG9OZWcgPiBiZCkgJiYgKHNwZWVkICE9IDAgfHwgZHBseCAhPSAwKSkgeworCQlEUFJJTlRLKFBST0JFLCBJTkZPLAorCQkgICAgICAgIkF1dG9OZWcgc3BlY2lmaWVkIGFsb25nIHdpdGggU3BlZWQgb3IgRHVwbGV4LCAiCisJCSAgICAgICAicGFyYW1ldGVyIGlnbm9yZWRcbiIpOworCQlhZGFwdGVyLT5ody5hdXRvbmVnX2FkdmVydGlzZWQgPSBBVVRPTkVHX0FEVl9ERUZBVUxUOworCX0gZWxzZSB7IC8qIEF1dG9uZWcgKi8KKwkJc3RydWN0IGUxMDAwX29wdF9saXN0IGFuX2xpc3RbXSA9CisJCQkjZGVmaW5lIEFBICJBdXRvTmVnIGFkdmVydGlzaW5nICIKKwkJCXt7IDB4MDEsIEFBICIxMC9IRCIgfSwKKwkJCSB7IDB4MDIsIEFBICIxMC9GRCIgfSwKKwkJCSB7IDB4MDMsIEFBICIxMC9GRCwgMTAvSEQiIH0sCisJCQkgeyAweDA0LCBBQSAiMTAwL0hEIiB9LAorCQkJIHsgMHgwNSwgQUEgIjEwMC9IRCwgMTAvSEQiIH0sCisJCQkgeyAweDA2LCBBQSAiMTAwL0hELCAxMC9GRCIgfSwKKwkJCSB7IDB4MDcsIEFBICIxMDAvSEQsIDEwL0ZELCAxMC9IRCIgfSwKKwkJCSB7IDB4MDgsIEFBICIxMDAvRkQiIH0sCisJCQkgeyAweDA5LCBBQSAiMTAwL0ZELCAxMC9IRCIgfSwKKwkJCSB7IDB4MGEsIEFBICIxMDAvRkQsIDEwL0ZEIiB9LAorCQkJIHsgMHgwYiwgQUEgIjEwMC9GRCwgMTAvRkQsIDEwL0hEIiB9LAorCQkJIHsgMHgwYywgQUEgIjEwMC9GRCwgMTAwL0hEIiB9LAorCQkJIHsgMHgwZCwgQUEgIjEwMC9GRCwgMTAwL0hELCAxMC9IRCIgfSwKKwkJCSB7IDB4MGUsIEFBICIxMDAvRkQsIDEwMC9IRCwgMTAvRkQiIH0sCisJCQkgeyAweDBmLCBBQSAiMTAwL0ZELCAxMDAvSEQsIDEwL0ZELCAxMC9IRCIgfSwKKwkJCSB7IDB4MjAsIEFBICIxMDAwL0ZEIiB9LAorCQkJIHsgMHgyMSwgQUEgIjEwMDAvRkQsIDEwL0hEIiB9LAorCQkJIHsgMHgyMiwgQUEgIjEwMDAvRkQsIDEwL0ZEIiB9LAorCQkJIHsgMHgyMywgQUEgIjEwMDAvRkQsIDEwL0ZELCAxMC9IRCIgfSwKKwkJCSB7IDB4MjQsIEFBICIxMDAwL0ZELCAxMDAvSEQiIH0sCisJCQkgeyAweDI1LCBBQSAiMTAwMC9GRCwgMTAwL0hELCAxMC9IRCIgfSwKKwkJCSB7IDB4MjYsIEFBICIxMDAwL0ZELCAxMDAvSEQsIDEwL0ZEIiB9LAorCQkJIHsgMHgyNywgQUEgIjEwMDAvRkQsIDEwMC9IRCwgMTAvRkQsIDEwL0hEIiB9LAorCQkJIHsgMHgyOCwgQUEgIjEwMDAvRkQsIDEwMC9GRCIgfSwKKwkJCSB7IDB4MjksIEFBICIxMDAwL0ZELCAxMDAvRkQsIDEwL0hEIiB9LAorCQkJIHsgMHgyYSwgQUEgIjEwMDAvRkQsIDEwMC9GRCwgMTAvRkQiIH0sCisJCQkgeyAweDJiLCBBQSAiMTAwMC9GRCwgMTAwL0ZELCAxMC9GRCwgMTAvSEQiIH0sCisJCQkgeyAweDJjLCBBQSAiMTAwMC9GRCwgMTAwL0ZELCAxMDAvSEQiIH0sCisJCQkgeyAweDJkLCBBQSAiMTAwMC9GRCwgMTAwL0ZELCAxMDAvSEQsIDEwL0hEIiB9LAorCQkJIHsgMHgyZSwgQUEgIjEwMDAvRkQsIDEwMC9GRCwgMTAwL0hELCAxMC9GRCIgfSwKKwkJCSB7IDB4MmYsIEFBICIxMDAwL0ZELCAxMDAvRkQsIDEwMC9IRCwgMTAvRkQsIDEwL0hEIiB9fTsKKworCQlzdHJ1Y3QgZTEwMDBfb3B0aW9uIG9wdCA9IHsKKwkJCS50eXBlID0gbGlzdF9vcHRpb24sCisJCQkubmFtZSA9ICJBdXRvTmVnIiwKKwkJCS5lcnIgID0gInBhcmFtZXRlciBpZ25vcmVkIiwKKwkJCS5kZWYgID0gQVVUT05FR19BRFZfREVGQVVMVCwKKwkJCS5hcmcgID0geyAubCA9IHsgLm5yID0gQVJSQVlfU0laRShhbl9saXN0KSwKKwkJCQkJIC5wID0gYW5fbGlzdCB9fQorCQl9OworCisJCWludCBhbiA9IEF1dG9OZWdbYmRdOworCQllMTAwMF92YWxpZGF0ZV9vcHRpb24oJmFuLCAmb3B0LCBhZGFwdGVyKTsKKwkJYWRhcHRlci0+aHcuYXV0b25lZ19hZHZlcnRpc2VkID0gYW47CisJfQorCisJc3dpdGNoIChzcGVlZCArIGRwbHgpIHsKKwljYXNlIDA6CisJCWFkYXB0ZXItPmh3LmF1dG9uZWcgPSBhZGFwdGVyLT5mY19hdXRvbmVnID0gMTsKKwkJaWYoKG51bV9TcGVlZCA+IGJkKSAmJiAoc3BlZWQgIT0gMCB8fCBkcGx4ICE9IDApKQorCQkJRFBSSU5USyhQUk9CRSwgSU5GTywKKwkJCSAgICAgICAiU3BlZWQgYW5kIGR1cGxleCBhdXRvbmVnb3RpYXRpb24gZW5hYmxlZFxuIik7CisJCWJyZWFrOworCWNhc2UgSEFMRl9EVVBMRVg6CisJCURQUklOVEsoUFJPQkUsIElORk8sICJIYWxmIER1cGxleCBzcGVjaWZpZWQgd2l0aG91dCBTcGVlZFxuIik7CisJCURQUklOVEsoUFJPQkUsIElORk8sICJVc2luZyBBdXRvbmVnb3RpYXRpb24gYXQgIgorCQkJIkhhbGYgRHVwbGV4IG9ubHlcbiIpOworCQlhZGFwdGVyLT5ody5hdXRvbmVnID0gYWRhcHRlci0+ZmNfYXV0b25lZyA9IDE7CisJCWFkYXB0ZXItPmh3LmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IEFEVkVSVElTRV8xMF9IQUxGIHwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURWRVJUSVNFXzEwMF9IQUxGOworCQlicmVhazsKKwljYXNlIEZVTExfRFVQTEVYOgorCQlEUFJJTlRLKFBST0JFLCBJTkZPLCAiRnVsbCBEdXBsZXggc3BlY2lmaWVkIHdpdGhvdXQgU3BlZWRcbiIpOworCQlEUFJJTlRLKFBST0JFLCBJTkZPLCAiVXNpbmcgQXV0b25lZ290aWF0aW9uIGF0ICIKKwkJCSJGdWxsIER1cGxleCBvbmx5XG4iKTsKKwkJYWRhcHRlci0+aHcuYXV0b25lZyA9IGFkYXB0ZXItPmZjX2F1dG9uZWcgPSAxOworCQlhZGFwdGVyLT5ody5hdXRvbmVnX2FkdmVydGlzZWQgPSBBRFZFUlRJU0VfMTBfRlVMTCB8CisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEVkVSVElTRV8xMDBfRlVMTCB8CisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEVkVSVElTRV8xMDAwX0ZVTEw7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTA6CisJCURQUklOVEsoUFJPQkUsIElORk8sICIxMCBNYnBzIFNwZWVkIHNwZWNpZmllZCAiCisJCQkid2l0aG91dCBEdXBsZXhcbiIpOworCQlEUFJJTlRLKFBST0JFLCBJTkZPLCAiVXNpbmcgQXV0b25lZ290aWF0aW9uIGF0IDEwIE1icHMgb25seVxuIik7CisJCWFkYXB0ZXItPmh3LmF1dG9uZWcgPSBhZGFwdGVyLT5mY19hdXRvbmVnID0gMTsKKwkJYWRhcHRlci0+aHcuYXV0b25lZ19hZHZlcnRpc2VkID0gQURWRVJUSVNFXzEwX0hBTEYgfAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRFZFUlRJU0VfMTBfRlVMTDsKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMCArIEhBTEZfRFVQTEVYOgorCQlEUFJJTlRLKFBST0JFLCBJTkZPLCAiRm9yY2luZyB0byAxMCBNYnBzIEhhbGYgRHVwbGV4XG4iKTsKKwkJYWRhcHRlci0+aHcuYXV0b25lZyA9IGFkYXB0ZXItPmZjX2F1dG9uZWcgPSAwOworCQlhZGFwdGVyLT5ody5mb3JjZWRfc3BlZWRfZHVwbGV4ID0gZTEwMDBfMTBfaGFsZjsKKwkJYWRhcHRlci0+aHcuYXV0b25lZ19hZHZlcnRpc2VkID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMCArIEZVTExfRFVQTEVYOgorCQlEUFJJTlRLKFBST0JFLCBJTkZPLCAiRm9yY2luZyB0byAxMCBNYnBzIEZ1bGwgRHVwbGV4XG4iKTsKKwkJYWRhcHRlci0+aHcuYXV0b25lZyA9IGFkYXB0ZXItPmZjX2F1dG9uZWcgPSAwOworCQlhZGFwdGVyLT5ody5mb3JjZWRfc3BlZWRfZHVwbGV4ID0gZTEwMDBfMTBfZnVsbDsKKwkJYWRhcHRlci0+aHcuYXV0b25lZ19hZHZlcnRpc2VkID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMDA6CisJCURQUklOVEsoUFJPQkUsIElORk8sICIxMDAgTWJwcyBTcGVlZCBzcGVjaWZpZWQgIgorCQkJIndpdGhvdXQgRHVwbGV4XG4iKTsKKwkJRFBSSU5USyhQUk9CRSwgSU5GTywgIlVzaW5nIEF1dG9uZWdvdGlhdGlvbiBhdCAiCisJCQkiMTAwIE1icHMgb25seVxuIik7CisJCWFkYXB0ZXItPmh3LmF1dG9uZWcgPSBhZGFwdGVyLT5mY19hdXRvbmVnID0gMTsKKwkJYWRhcHRlci0+aHcuYXV0b25lZ19hZHZlcnRpc2VkID0gQURWRVJUSVNFXzEwMF9IQUxGIHwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURWRVJUSVNFXzEwMF9GVUxMOworCQlicmVhazsKKwljYXNlIFNQRUVEXzEwMCArIEhBTEZfRFVQTEVYOgorCQlEUFJJTlRLKFBST0JFLCBJTkZPLCAiRm9yY2luZyB0byAxMDAgTWJwcyBIYWxmIER1cGxleFxuIik7CisJCWFkYXB0ZXItPmh3LmF1dG9uZWcgPSBhZGFwdGVyLT5mY19hdXRvbmVnID0gMDsKKwkJYWRhcHRlci0+aHcuZm9yY2VkX3NwZWVkX2R1cGxleCA9IGUxMDAwXzEwMF9oYWxmOworCQlhZGFwdGVyLT5ody5hdXRvbmVnX2FkdmVydGlzZWQgPSAwOworCQlicmVhazsKKwljYXNlIFNQRUVEXzEwMCArIEZVTExfRFVQTEVYOgorCQlEUFJJTlRLKFBST0JFLCBJTkZPLCAiRm9yY2luZyB0byAxMDAgTWJwcyBGdWxsIER1cGxleFxuIik7CisJCWFkYXB0ZXItPmh3LmF1dG9uZWcgPSBhZGFwdGVyLT5mY19hdXRvbmVnID0gMDsKKwkJYWRhcHRlci0+aHcuZm9yY2VkX3NwZWVkX2R1cGxleCA9IGUxMDAwXzEwMF9mdWxsOworCQlhZGFwdGVyLT5ody5hdXRvbmVnX2FkdmVydGlzZWQgPSAwOworCQlicmVhazsKKwljYXNlIFNQRUVEXzEwMDA6CisJCURQUklOVEsoUFJPQkUsIElORk8sICIxMDAwIE1icHMgU3BlZWQgc3BlY2lmaWVkIHdpdGhvdXQgIgorCQkJIkR1cGxleFxuIik7CisJCURQUklOVEsoUFJPQkUsIElORk8sCisJCQkiVXNpbmcgQXV0b25lZ290aWF0aW9uIGF0IDEwMDAgTWJwcyAiCisJCQkiRnVsbCBEdXBsZXggb25seVxuIik7CisJCWFkYXB0ZXItPmh3LmF1dG9uZWcgPSBhZGFwdGVyLT5mY19hdXRvbmVnID0gMTsKKwkJYWRhcHRlci0+aHcuYXV0b25lZ19hZHZlcnRpc2VkID0gQURWRVJUSVNFXzEwMDBfRlVMTDsKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMDAwICsgSEFMRl9EVVBMRVg6CisJCURQUklOVEsoUFJPQkUsIElORk8sCisJCQkiSGFsZiBEdXBsZXggaXMgbm90IHN1cHBvcnRlZCBhdCAxMDAwIE1icHNcbiIpOworCQlEUFJJTlRLKFBST0JFLCBJTkZPLAorCQkJIlVzaW5nIEF1dG9uZWdvdGlhdGlvbiBhdCAxMDAwIE1icHMgIgorCQkJIkZ1bGwgRHVwbGV4IG9ubHlcbiIpOworCQlhZGFwdGVyLT5ody5hdXRvbmVnID0gYWRhcHRlci0+ZmNfYXV0b25lZyA9IDE7CisJCWFkYXB0ZXItPmh3LmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IEFEVkVSVElTRV8xMDAwX0ZVTEw7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwMCArIEZVTExfRFVQTEVYOgorCQlEUFJJTlRLKFBST0JFLCBJTkZPLAorCQkgICAgICAgIlVzaW5nIEF1dG9uZWdvdGlhdGlvbiBhdCAxMDAwIE1icHMgRnVsbCBEdXBsZXggb25seVxuIik7CisJCWFkYXB0ZXItPmh3LmF1dG9uZWcgPSBhZGFwdGVyLT5mY19hdXRvbmVnID0gMTsKKwkJYWRhcHRlci0+aHcuYXV0b25lZ19hZHZlcnRpc2VkID0gQURWRVJUSVNFXzEwMDBfRlVMTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJLyogU3BlZWQsIEF1dG9OZWcgYW5kIE1ESS9NREktWCBtdXN0IGFsbCBwbGF5IG5pY2UgKi8KKwlpZiAoZTEwMDBfdmFsaWRhdGVfbWRpX3NldHRpbmcoJihhZGFwdGVyLT5odykpIDwgMCkgeworCQlEUFJJTlRLKFBST0JFLCBJTkZPLAorCQkJIlNwZWVkLCBBdXRvTmVnIGFuZCBNREktWCBzcGVjaWZpY2F0aW9ucyBhcmUgIgorCQkJImluY29tcGF0aWJsZS4gU2V0dGluZyBNREktWCB0byBhIGNvbXBhdGlibGUgdmFsdWUuXG4iKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UyMTAwLmMgYi9kcml2ZXJzL25ldC9lMjEwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYzlmYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lMjEwMC5jCkBAIC0wLDAgKzEsNDg1IEBACisvKiBlMjEwMC5jOiBBIENhYmxldHJvbiBFMjEwMCBzZXJpZXMgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eC4gKi8KKy8qCisJV3JpdHRlbiAxOTkzLTE5OTQgYnkgRG9uYWxkIEJlY2tlci4KKworCUNvcHlyaWdodCAxOTk0IGJ5IERvbmFsZCBCZWNrZXIuCisJQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorCURpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZAorCWRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorCWluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIENhYmxldHJvbiBFMjEwMCBzZXJpZXMgZXRoZXJjYXJkcy4KKworCVRoZSBBdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisJNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKwlBbm5hcG9saXMgTUQgMjE0MDMKKworCVRoZSBFMjEwMCBzZXJpZXMgZXRoZXJjYXJkIGlzIGEgZmFpcmx5IGdlbmVyaWMgc2hhcmVkIG1lbW9yeSA4MzkwCisJaW1wbGVtZW50YXRpb24uICBUaGUgb25seSB1bnVzdWFsIGFzcGVjdCBpcyB0aGUgd2F5IHRoZSBzaGFyZWQgbWVtb3J5CisJcmVnaXN0ZXJzIGFyZSBzZXQ6IGZpcnN0IHlvdSBkbyBhbiBpbmIoKSBpbiB3aGF0IGlzIG5vcm1hbGx5IHRoZQorCXN0YXRpb24gYWRkcmVzcyByZWdpb24sIGFuZCB0aGUgbG93IHRocmVlIGJpdHMgb2YgbmV4dCBvdXRiKCkgKmFkZHJlc3MqCisJaXMgdXNlZAlhcyB0aGUgd3JpdGUgdmFsdWUgZm9yIHRoYXQgcmVnaXN0ZXIuICBFaXRoZXIgc29tZW9uZSB3YXNuJ3QKKwl0b28gdXNlZCB0byBkZW0gYml0IGVuIGJpdGVzLCBvciB0aGV5IHdlcmUgdHJ5aW5nIHRvIG9iZnVzY2F0ZSB0aGUKKwlwcm9ncmFtbWluZyBpbnRlcmZhY2UuCisKKwlUaGVyZSBpcyBhbiBhZGRpdGlvbmFsIGNvbXBsaWNhdGlvbiB3aGVuIHNldHRpbmcgdGhlIHdpbmRvdyBvbiB0aGUgcGFja2V0CisJYnVmZmVyLiAgWW91IG11c3QgZmlyc3QgZG8gYSByZWFkIGludG8gdGhlIHBhY2tldCBidWZmZXIgcmVnaW9uIHdpdGggdGhlCisJbG93IDggYWRkcmVzcyBiaXRzIHRoZSBhZGRyZXNzIHNldHRpbmcgdGhlIHBhZ2UgZm9yIHRoZSBzdGFydCBvZiB0aGUgcGFja2V0CisJYnVmZmVyIHdpbmRvdywgYW5kIHRoZW4gZG8gdGhlIGFib3ZlIG9wZXJhdGlvbi4gIFNlZSBtZW1fb24oKSBmb3IgZGV0YWlscy4KKworCU9uZSBidWcgb24gdGhlIGNoaXAgaXMgdGhhdCBldmVuIGEgaGFyZCByZXNldCB3b24ndCBkaXNhYmxlIHRoZSBtZW1vcnkKKwl3aW5kb3csIHVzdWFsbHkgcmVzdWx0aW5nIGluIGEgaHVuZyBtYWNoaW5lIGlmIG1lbV9vZmYoKSBpc24ndCBjYWxsZWQuCisJSWYgdGhpcyBoYXBwZW5zLCB5b3UgbXVzdCBwb3dlciBkb3duIHRoZSBtYWNoaW5lIGZvciBhYm91dCAzMCBzZWNvbmRzLgorKi8KKworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0KKwkiZTIxMDAuYzp2MS4wMSA3LzIxLzk0IERvbmFsZCBCZWNrZXIgKGJlY2tlckBjZXNkaXMuZ3NmYy5uYXNhLmdvdilcbiI7CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICI4MzkwLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgImUyMTAwIgorCitzdGF0aWMgaW50IGUyMV9wcm9iZV9saXN0W10gPSB7MHgzMDAsIDB4MjgwLCAweDM4MCwgMHgyMjAsIDB9OworCisvKiBPZmZzZXRzIGZyb20gdGhlIGJhc2VfYWRkci4KKyAgIFJlYWQgZnJvbSB0aGUgQVNJQyByZWdpc3RlciwgYW5kIHRoZSBsb3cgdGhyZWUgYml0cyBvZiB0aGUgbmV4dCBvdXRiKCkKKyAgIGFkZHJlc3MgaXMgdXNlZCB0byBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXIuICovCisjZGVmaW5lIEUyMV9OSUNfT0ZGU0VUICAwCQkvKiBPZmZzZXQgdG8gdGhlIDgzOTAgTklDLiAqLworI2RlZmluZSBFMjFfQVNJQwkJMHgxMAorI2RlZmluZSBFMjFfTUVNX0VOQUJMRQkweDEwCisjZGVmaW5lICBFMjFfTUVNX09OCQkweDA1CS8qIEVuYWJsZSBtZW1vcnkgaW4gMTYgYml0IG1vZGUuICovCisjZGVmaW5lICBFMjFfTUVNX09OXzgJMHgwNwkvKiBFbmFibGUgbWVtb3J5IGluICA4IGJpdCBtb2RlLiAqLworI2RlZmluZSBFMjFfTUVNX0JBU0UJMHgxMQorI2RlZmluZSBFMjFfSVJRX0xPVwkJMHgxMgkvKiBUaGUgbG93IHRocmVlIGJpdHMgb2YgdGhlIElSUSBudW1iZXIuICovCisjZGVmaW5lIEUyMV9JUlFfSElHSAkweDE0CS8qIFRoZSBoaWdoIElSUSBiaXQgYW5kIG1lZGlhIHNlbGVjdCAuLi4gICovCisjZGVmaW5lIEUyMV9NRURJQQkJMHgxNAkvKiAoYWxpYXMpLiAqLworI2RlZmluZSAgRTIxX0FMVF9JRlBPUlQgMHgwMgkvKiBTZXQgdG8gdXNlIHRoZSBvdGhlciAoQk5DLEFVSSkgcG9ydC4gKi8KKyNkZWZpbmUgIEUyMV9CSUdfTUVNCTB4MDQJLyogVXNlIGEgYmlnZ2VyICg2NEspIGJ1ZmZlciAod2UgZG9uJ3QpICovCisjZGVmaW5lIEUyMV9TQVBST00JCTB4MTAJLyogT2Zmc2V0IHRvIHN0YXRpb24gYWRkcmVzcyBkYXRhLiAqLworI2RlZmluZSBFMjFfSU9fRVhURU5UCSAweDIwCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1fb24oc2hvcnQgcG9ydCwgdm9sYXRpbGUgY2hhciBfX2lvbWVtICptZW1fYmFzZSwKKwkJCQkJCSAgdW5zaWduZWQgY2hhciBzdGFydF9wYWdlICkKK3sKKwkvKiBUaGlzIGlzIGEgbGl0dGxlIHdlaXJkOiBzZXQgdGhlIHNoYXJlZCBtZW1vcnkgd2luZG93IGJ5IGRvaW5nIGEKKwkgICByZWFkLiAgVGhlIGxvdyBhZGRyZXNzIGJpdHMgc3BlY2lmeSB0aGUgc3RhcnRpbmcgcGFnZS4gKi8KKwlyZWFkYihtZW1fYmFzZStzdGFydF9wYWdlKTsKKwlpbmIocG9ydCArIEUyMV9NRU1fRU5BQkxFKTsKKwlvdXRiKEUyMV9NRU1fT04sIHBvcnQgKyBFMjFfTUVNX0VOQUJMRSArIEUyMV9NRU1fT04pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWVtX29mZihzaG9ydCBwb3J0KQoreworCWluYihwb3J0ICsgRTIxX01FTV9FTkFCTEUpOworCW91dGIoMHgwMCwgcG9ydCArIEUyMV9NRU1fRU5BQkxFKTsKK30KKworLyogSW4gb3RoZXIgZHJpdmVycyBJIHB1dCB0aGUgVFggcGFnZXMgZmlyc3QsIGJ1dCB0aGUgRTIxMDAgd2luZG93IGNpcmN1aXRyeQorICAgaXMgZGVzaWduZWQgdG8gaGF2ZSBhIDRLIFR4IHJlZ2lvbiBsYXN0LiBUaGUgd2luZG93aW5nIGNpcmN1aXRyeSB3cmFwcyB0aGUKKyAgIHdpbmRvdyBhdCAweDJmZmYtPjB4MDAwMCBzbyB0aGF0IHRoZSBwYWNrZXRzIGF0IGUuZy4gMHgyZjAwIGluIHRoZSBSWCByaW5nCisgICBhcHBlYXIgY29udGlndW91c2x5IGluIHRoZSB3aW5kb3cuICovCisjZGVmaW5lIEUyMV9SWF9TVEFSVF9QRwkJMHgwMAkvKiBGaXJzdCBwYWdlIG9mIFJYIGJ1ZmZlciAqLworI2RlZmluZSBFMjFfUlhfU1RPUF9QRwkJMHgzMAkvKiBMYXN0IHBhZ2UgKzEgb2YgUlggcmluZyAqLworI2RlZmluZSBFMjFfQklHX1JYX1NUT1BfUEcJMHhGMAkvKiBMYXN0IHBhZ2UgKzEgb2YgUlggcmluZyAqLworI2RlZmluZSBFMjFfVFhfU1RBUlRfUEcJCUUyMV9SWF9TVE9QX1BHCS8qIEZpcnN0IHBhZ2Ugb2YgVFggYnVmZmVyICovCisKK3N0YXRpYyBpbnQgZTIxX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKTsKKworc3RhdGljIGludCBlMjFfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGUyMV9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZTIxX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCk7CitzdGF0aWMgdm9pZCBlMjFfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RhcnRfcGFnZSk7CitzdGF0aWMgdm9pZCBlMjFfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsCisJCQkJCQkJaW50IHJpbmdfcGFnZSk7CisKK3N0YXRpYyBpbnQgZTIxX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisMCisvKiAgUHJvYmUgZm9yIHRoZSBFMjEwMCBzZXJpZXMgZXRoZXJjYXJkcy4gIFRoZXNlIGNhcmRzIGhhdmUgYW4gODM5MCBhdCB0aGUKKwliYXNlIGFkZHJlc3MgYW5kIHRoZSBzdGF0aW9uIGFkZHJlc3MgYXQgYm90aCBvZmZzZXQgMHgxMCBhbmQgMHgxOC4gIEkgcmVhZAorCXRoZSBzdGF0aW9uIGFkZHJlc3MgZnJvbSBvZmZzZXQgMHgxOCB0byBhdm9pZCB0aGUgZGF0YXBvcnQgb2YgTkUyMDAwCisJZXRoZXJjYXJkcywgYW5kIGxvb2sgZm9yIEN0cm9uJ3MgdW5pcXVlIElEIChmaXJzdCB0aHJlZSBvY3RldHMgb2YgdGhlCisJc3RhdGlvbiBhZGRyZXNzKS4KKyAqLworCitzdGF0aWMgaW50ICBfX2luaXQgZG9fZTIxMDBfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgKnBvcnQ7CisJaW50IGJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpcnEgPSBkZXYtPmlycTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWlmIChiYXNlX2FkZHIgPiAweDFmZikJCS8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KKwkJcmV0dXJuIGUyMV9wcm9iZTEoZGV2LCBiYXNlX2FkZHIpOworCWVsc2UgaWYgKGJhc2VfYWRkciAhPSAwKQkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCXJldHVybiAtRU5YSU87CisKKwlmb3IgKHBvcnQgPSBlMjFfcHJvYmVfbGlzdDsgKnBvcnQ7IHBvcnQrKykgeworCQlkZXYtPmlycSA9IGlycTsKKwkJaWYgKGUyMV9wcm9iZTEoZGV2LCAqcG9ydCkgPT0gMCkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBOQjogZTIxX2Nsb3NlKCkgaGFuZGxlcyBmcmVlX2lycSAqLworCWlvdW5tYXAoZWlfc3RhdHVzLm1lbSk7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEUyMV9JT19FWFRFTlQpOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgZTIxMDBfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2VpX25ldGRldigpOworCWludCBlcnI7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKworCWVyciA9IGRvX2UyMTAwX3Byb2JlKGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCWNsZWFudXBfY2FyZChkZXYpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBlMjFfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpCit7CisJaW50IGksIHN0YXR1cywgcmV0dmFsOworCXVuc2lnbmVkIGNoYXIgKnN0YXRpb25fYWRkciA9IGRldi0+ZGV2X2FkZHI7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBFMjFfSU9fRVhURU5ULCBEUlZfTkFNRSkpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBGaXJzdCBjaGVjayB0aGUgc3RhdGlvbiBhZGRyZXNzIGZvciB0aGUgQ3Ryb24gcHJlZml4LiAqLworCWlmIChpbmIoaW9hZGRyICsgRTIxX1NBUFJPTSArIDApICE9IDB4MDAKKwkJfHwgaW5iKGlvYWRkciArIEUyMV9TQVBST00gKyAxKSAhPSAweDAwCisJCXx8IGluYihpb2FkZHIgKyBFMjFfU0FQUk9NICsgMikgIT0gMHgxZCkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBWZXJpZnkgYnkgbWFraW5nIGNlcnRhaW4gdGhhdCB0aGVyZSBpcyBhIDgzOTAgYXQgdGhlcmUuICovCisJb3V0YihFODM5MF9OT0RNQSArIEU4MzkwX1NUT1AsIGlvYWRkcik7CisJdWRlbGF5KDEpOwkvKiB3ZSB3YW50IHRvIGRlbGF5IG9uZSBJL08gY3ljbGUgLSB3aGljaCBpcyAyTUh6ICovCisJc3RhdHVzID0gaW5iKGlvYWRkcik7CisJaWYgKHN0YXR1cyAhPSAweDIxICYmIHN0YXR1cyAhPSAweDIzKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFJlYWQgdGhlIHN0YXRpb24gYWRkcmVzcyBQUk9NLiAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlzdGF0aW9uX2FkZHJbaV0gPSBpbmIoaW9hZGRyICsgRTIxX1NBUFJPTSArIGkpOworCisJaW5iKGlvYWRkciArIEUyMV9NRURJQSk7IAkJLyogUG9pbnQgdG8gbWVkaWEgc2VsZWN0aW9uLiAqLworCW91dGIoMCwgaW9hZGRyICsgRTIxX0FTSUMpOyAJLyogYW5kIGRpc2FibGUgdGhlIHNlY29uZGFyeSBpbnRlcmZhY2UuICovCisKKwlpZiAoZWlfZGVidWcgICYmICB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsodmVyc2lvbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiAlMDJYIiwgc3RhdGlvbl9hZGRyW2ldKTsKKworCWlmIChkZXYtPmlycSA8IDIpIHsKKwkJaW50IGlycWxpc3RbXSA9IHsxNSwxMSwxMCwxMiw1LDksMyw0fSwgaTsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCWlmIChyZXF1ZXN0X2lycSAoaXJxbGlzdFtpXSwgTlVMTCwgMCwgImJvZ3VzIiwgTlVMTCkgIT0gLUVCVVNZKSB7CisJCQkJZGV2LT5pcnEgPSBpcnFsaXN0W2ldOworCQkJCWJyZWFrOworCQkJfQorCQlpZiAoaSA+PSA4KSB7CisJCQlwcmludGsoIiB1bmFibGUgdG8gZ2V0IElSUSAlZC5cbiIsIGRldi0+aXJxKTsKKwkJCXJldHZhbCA9IC1FQUdBSU47CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZSBpZiAoZGV2LT5pcnEgPT0gMikJLyogRml4dXAgbHVzZXIgYm9nb3NpdHk6IElSUTIgaXMgcmVhbGx5IElSUTkgKi8KKwkJZGV2LT5pcnEgPSA5OworCisJLyogVGhlIDgzOTAgaXMgYXQgdGhlIGJhc2UgYWRkcmVzcy4gKi8KKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKworCWVpX3N0YXR1cy5uYW1lID0gIkUyMTAwIjsKKwllaV9zdGF0dXMud29yZDE2ID0gMTsKKwllaV9zdGF0dXMudHhfc3RhcnRfcGFnZSA9IEUyMV9UWF9TVEFSVF9QRzsKKwllaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IEUyMV9SWF9TVEFSVF9QRzsKKwllaV9zdGF0dXMuc3RvcF9wYWdlID0gRTIxX1JYX1NUT1BfUEc7CisJZWlfc3RhdHVzLnNhdmVkX2lycSA9IGRldi0+aXJxOworCisJLyogQ2hlY2sgdGhlIG1lZGlhIHBvcnQgdXNlZC4gIFRoZSBwb3J0IGNhbiBiZSBwYXNzZWQgaW4gb24gdGhlCisJICAgbG93IG1lbV9lbmQgYml0cy4gKi8KKwlpZiAoZGV2LT5tZW1fZW5kICYgMTUpCisJCWRldi0+aWZfcG9ydCA9IGRldi0+bWVtX2VuZCAmIDc7CisJZWxzZSB7CisJCWRldi0+aWZfcG9ydCA9IDA7CisJCWluYihpb2FkZHIgKyBFMjFfTUVESUEpOyAJLyogVHVybiBhdXRvbWF0aWMgbWVkaWEgZGV0ZWN0aW9uIG9uLiAqLworCQlmb3IoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlpZiAoc3RhdGlvbl9hZGRyW2ldICE9IGluYihpb2FkZHIgKyBFMjFfU0FQUk9NICsgOCArIGkpKSB7CisJCQkJZGV2LT5pZl9wb3J0ID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwl9CisKKwkvKiBOZXZlciBtYXAgaW4gdGhlIEUyMSBzaGFyZWQgbWVtb3J5IHVubGVzcyB5b3UgYXJlIGFjdGl2ZWx5IHVzaW5nIGl0LgorCSAgIEFsc28sIHRoZSBzaGFyZWQgbWVtb3J5IGhhcyBlZmZlY3RpdmUgb25seSBvbmUgc2V0dGluZyAtLSBzcHJlYWQgYWxsCisJICAgb3ZlciB0aGUgMTI4SyByZWdpb24hICovCisJaWYgKGRldi0+bWVtX3N0YXJ0ID09IDApCisJCWRldi0+bWVtX3N0YXJ0ID0gMHhkMDAwMDsKKworCWVpX3N0YXR1cy5tZW0gPSBpb3JlbWFwKGRldi0+bWVtX3N0YXJ0LCAyKjEwMjQpOworCWlmICghZWlfc3RhdHVzLm1lbSkgeworCQlwcmludGsoInVuYWJsZSB0byByZW1hcCBtZW1vcnlcbiIpOworCQlyZXR2YWwgPSAtRUFHQUlOOworCQlnb3RvIG91dDsKKwl9CisKKyNpZmRlZiBub3RkZWYKKwkvKiBUaGVzZSB2YWx1ZXMgYXJlIHVudXNlZC4gIFRoZSBFMjEwMCBoYXMgYSAySyB3aW5kb3cgaW50byB0aGUgcGFja2V0CisJICAgYnVmZmVyLiAgVGhlIHdpbmRvdyBjYW4gYmUgc2V0IHRvIHN0YXJ0IG9uIGFueSBwYWdlIGJvdW5kYXJ5LiAqLworCWVpX3N0YXR1cy5ybWVtX3N0YXJ0ID0gZGV2LT5tZW1fc3RhcnQgKyBUWF9QQUdFUyoyNTY7CisJZGV2LT5tZW1fZW5kID0gZWlfc3RhdHVzLnJtZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyAyKjEwMjQ7CisjZW5kaWYKKworCXByaW50aygiLCBJUlEgJWQsICVzIG1lZGlhLCBtZW1vcnkgQCAlI2x4LlxuIiwgZGV2LT5pcnEsCisJCSAgIGRldi0+aWZfcG9ydCA/ICJzZWNvbmRhcnkiIDogInByaW1hcnkiLCBkZXYtPm1lbV9zdGFydCk7CisKKwllaV9zdGF0dXMucmVzZXRfODM5MCA9ICZlMjFfcmVzZXRfODM5MDsKKwllaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmZTIxX2Jsb2NrX2lucHV0OworCWVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmZTIxX2Jsb2NrX291dHB1dDsKKwllaV9zdGF0dXMuZ2V0XzgzOTBfaGRyID0gJmUyMV9nZXRfODM5MF9oZHI7CisJZGV2LT5vcGVuID0gJmUyMV9vcGVuOworCWRldi0+c3RvcCA9ICZlMjFfY2xvc2U7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CisjZW5kaWYKKwlOUzgzOTBfaW5pdChkZXYsIDApOworCisJcmV0dXJuIDA7CitvdXQ6CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBFMjFfSU9fRVhURU5UKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitlMjFfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCByZXR2YWw7CisKKwlpZiAoKHJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBlaV9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSkpCisJCXJldHVybiByZXR2YWw7CisKKwkvKiBTZXQgdGhlIGludGVycnVwdCBsaW5lIGFuZCBtZW1vcnkgYmFzZSBvbiB0aGUgaGFyZHdhcmUuICovCisJaW5iKGlvYWRkciArIEUyMV9JUlFfTE9XKTsKKwlvdXRiKDAsIGlvYWRkciArIEUyMV9BU0lDICsgKGRldi0+aXJxICYgNykpOworCWluYihpb2FkZHIgKyBFMjFfSVJRX0hJR0gpOyAJCQkvKiBIaWdoIElSUSBiaXQsIGFuZCBpZl9wb3J0LiAqLworCW91dGIoMCwgaW9hZGRyICsgRTIxX0FTSUMgKyAoZGV2LT5pcnEgPiA3ID8gMTowKQorCQkgICArIChkZXYtPmlmX3BvcnQgPyBFMjFfQUxUX0lGUE9SVCA6IDApKTsKKwlpbmIoaW9hZGRyICsgRTIxX01FTV9CQVNFKTsKKwlvdXRiKDAsIGlvYWRkciArIEUyMV9BU0lDICsgKChkZXYtPm1lbV9zdGFydCA+PiAxNykgJiA3KSk7CisKKwllaV9vcGVuKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitlMjFfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJb3V0YigweDAxLCBpb2FkZHIpOworCWlmIChlaV9kZWJ1ZyA+IDEpIHByaW50aygicmVzZXR0aW5nIHRoZSBFMjE4MHgzIHQ9JWxkLi4uIiwgamlmZmllcyk7CisJZWlfc3RhdHVzLnR4aW5nID0gMDsKKworCS8qIFNldCB1cCB0aGUgQVNJQyByZWdpc3RlcnMsIGp1c3QgaW4gY2FzZSBzb21ldGhpbmcgY2hhbmdlZCB0aGVtLiAqLworCisJaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCJyZXNldCBkb25lXG4iKTsKKwlyZXR1cm47Cit9CisKKy8qIEdyYWIgdGhlIDgzOTAgc3BlY2lmaWMgaGVhZGVyLiBXZSBwdXQgdGhlIDJrIHdpbmRvdyBzbyB0aGUgaGVhZGVyIHBhZ2UKKyAgIGFwcGVhcnMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzaGFyZWQgbWVtb3J5LiAqLworCitzdGF0aWMgdm9pZAorZTIxX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQoreworCisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJY2hhciBfX2lvbWVtICpzaGFyZWRfbWVtID0gZWlfc3RhdHVzLm1lbTsKKworCW1lbV9vbihpb2FkZHIsIHNoYXJlZF9tZW0sIHJpbmdfcGFnZSk7CisKKyNpZmRlZiBub3RkZWYKKwkvKiBPZmZpY2lhbGx5IHRoaXMgaXMgd2hhdCB3ZSBhcmUgZG9pbmcsIGJ1dCB0aGUgcmVhZGwoKSBpcyBmYXN0ZXIgKi8KKwltZW1jcHlfZnJvbWlvKGhkciwgc2hhcmVkX21lbSwgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSk7CisjZWxzZQorCSgodW5zaWduZWQgaW50KiloZHIpWzBdID0gcmVhZGwoc2hhcmVkX21lbSk7CisjZW5kaWYKKworCS8qIFR1cm4gb2ZmIG1lbW9yeSBhY2Nlc3M6IHdlIHdvdWxkIG5lZWQgdG8gcmVwcm9ncmFtIHRoZSB3aW5kb3cgYW55d2F5LiAqLworCW1lbV9vZmYoaW9hZGRyKTsKKworfQorCisvKiAgQmxvY2sgaW5wdXQgYW5kIG91dHB1dCBhcmUgZWFzeSBvbiBzaGFyZWQgbWVtb3J5IGV0aGVyY2FyZHMuCisJVGhlIEUyMXh4IG1ha2VzIGJsb2NrX2lucHV0KCkgZXNwZWNpYWxseSBlYXN5IGJ5IHdyYXBwaW5nIHRoZSB0b3AKKwlyaW5nIGJ1ZmZlciB0byB0aGUgYm90dG9tIGF1dG9tYXRpY2FsbHkuICovCitzdGF0aWMgdm9pZAorZTIxX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KQoreworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWNoYXIgX19pb21lbSAqc2hhcmVkX21lbSA9IGVpX3N0YXR1cy5tZW07CisKKwltZW1fb24oaW9hZGRyLCBzaGFyZWRfbWVtLCAocmluZ19vZmZzZXQ+PjgpKTsKKworCS8qIFBhY2tldCBpcyBhbHdheXMgaW4gb25lIGNodW5rIC0tIHdlIGNhbiBjb3B5ICsgY2tzdW0uICovCisJZXRoX2lvX2NvcHlfYW5kX3N1bShza2IsIGVpX3N0YXR1cy5tZW0gKyAocmluZ19vZmZzZXQgJiAweGZmKSwgY291bnQsIDApOworCisJbWVtX29mZihpb2FkZHIpOworfQorCitzdGF0aWMgdm9pZAorZTIxX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCQkgaW50IHN0YXJ0X3BhZ2UpCit7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdm9sYXRpbGUgY2hhciBfX2lvbWVtICpzaGFyZWRfbWVtID0gZWlfc3RhdHVzLm1lbTsKKworCS8qIFNldCB0aGUgc2hhcmVkIG1lbW9yeSB3aW5kb3cgc3RhcnQgYnkgZG9pbmcgYSByZWFkLCB3aXRoIHRoZSBsb3cgYWRkcmVzcworCSAgIGJpdHMgc3BlY2lmeWluZyB0aGUgc3RhcnRpbmcgcGFnZS4gKi8KKwlyZWFkYihzaGFyZWRfbWVtICsgc3RhcnRfcGFnZSk7CisJbWVtX29uKGlvYWRkciwgc2hhcmVkX21lbSwgc3RhcnRfcGFnZSk7CisKKwltZW1jcHlfdG9pbyhzaGFyZWRfbWVtLCBidWYsIGNvdW50KTsKKwltZW1fb2ZmKGlvYWRkcik7Cit9CisKK3N0YXRpYyBpbnQKK2UyMV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKGVpX2RlYnVnID4gMSkKKwkJcHJpbnRrKCIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQuXG4iLCBkZXYtPm5hbWUpOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJZGV2LT5pcnEgPSBlaV9zdGF0dXMuc2F2ZWRfaXJxOworCisJLyogU2h1dCBvZmYgdGhlIGludGVycnVwdCBsaW5lIGFuZCBzZWNvbmRhcnkgaW50ZXJmYWNlLiAqLworCWluYihpb2FkZHIgKyBFMjFfSVJRX0xPVyk7CisJb3V0YigwLCBpb2FkZHIgKyBFMjFfQVNJQyk7CisJaW5iKGlvYWRkciArIEUyMV9JUlFfSElHSCk7IAkJCS8qIEhpZ2ggSVJRIGJpdCwgYW5kIGlmX3BvcnQuICovCisJb3V0YigwLCBpb2FkZHIgKyBFMjFfQVNJQyk7CisKKwllaV9jbG9zZShkZXYpOworCisJLyogRG91YmxlLWNoZWNrIHRoYXQgdGhlIG1lbW9yeSBoYXMgYmVlbiB0dXJuZWQgb2ZmLCBiZWNhdXNlIHJlYWxseQorCSAgIHJlYWxseSBiYWQgdGhpbmdzIGhhcHBlbiBpZiBpdCBpc24ndC4gKi8KKwltZW1fb2ZmKGlvYWRkcik7CisKKwlyZXR1cm4gMDsKK30KKworDAorI2lmZGVmIE1PRFVMRQorI2RlZmluZSBNQVhfRTIxX0NBUkRTCTQJLyogTWF4IG51bWJlciBvZiBFMjEgY2FyZHMgcGVyIG1vZHVsZSAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfZTIxW01BWF9FMjFfQ0FSRFNdOworc3RhdGljIGludCBpb1tNQVhfRTIxX0NBUkRTXTsKK3N0YXRpYyBpbnQgaXJxW01BWF9FMjFfQ0FSRFNdOworc3RhdGljIGludCBtZW1bTUFYX0UyMV9DQVJEU107CitzdGF0aWMgaW50IHhjdnJbTUFYX0UyMV9DQVJEU107CQkvKiBjaG9vc2UgaW50LiBvciBleHQuIHhjdnIgKi8KKworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShtZW0sIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoeGN2ciwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJJL08gYmFzZSBhZGRyZXNzKGVzKSIpOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJJUlEgbnVtYmVyKHMpIik7CitNT0RVTEVfUEFSTV9ERVNDKG1lbSwgIiBtZW1vcnkgYmFzZSBhZGRyZXNzKGVzKSIpOworTU9EVUxFX1BBUk1fREVTQyh4Y3ZyLCAidHJhbnNjZWl2ZXIocykgKDA9aW50ZXJuYWwsIDE9ZXh0ZXJuYWwpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNhYmxldHJvbiBFMjEwMCBJU0EgZXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIFRoaXMgaXMgc2V0IHVwIHNvIHRoYXQgb25seSBhIHNpbmdsZSBhdXRvcHJvYmUgdGFrZXMgcGxhY2UgcGVyIGNhbGwuCitJU0EgZGV2aWNlIGF1dG9wcm9iZXMgb24gYSBydW5uaW5nIG1hY2hpbmUgYXJlIG5vdCByZWNvbW1lbmRlZC4gKi8KK2ludAoraW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCB0aGlzX2RldiwgZm91bmQgPSAwOworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX0UyMV9DQVJEUzsgdGhpc19kZXYrKykgeworCQlpZiAoaW9bdGhpc19kZXZdID09IDApICB7CisJCQlpZiAodGhpc19kZXYgIT0gMCkgYnJlYWs7IC8qIG9ubHkgYXV0b3Byb2JlIDFzdCBvbmUgKi8KKwkJCXByaW50ayhLRVJOX05PVElDRSAiZTIxMDAuYzogUHJlc2VudGx5IGF1dG9wcm9iaW5nIChub3QgcmVjb21tZW5kZWQpIGZvciBhIHNpbmdsZSBjYXJkLlxuIik7CisJCX0KKwkJZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisJCWRldi0+aXJxID0gaXJxW3RoaXNfZGV2XTsKKwkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07CisJCWRldi0+bWVtX3N0YXJ0ID0gbWVtW3RoaXNfZGV2XTsKKwkJZGV2LT5tZW1fZW5kID0geGN2clt0aGlzX2Rldl07CS8qIGxvdyA0Yml0cyA9IHhjdnIgc2VsLiAqLworCQlpZiAoZG9fZTIxMDBfcHJvYmUoZGV2KSA9PSAwKSB7CisJCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgeworCQkJCWRldl9lMjFbZm91bmQrK10gPSBkZXY7CisJCQkJY29udGludWU7CisJCQl9CisJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJfQorCQlmcmVlX25ldGRldihkZXYpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJlMjEwMC5jOiBObyBFMjEwMCBjYXJkIGZvdW5kIChpL28gPSAweCV4KS5cbiIsIGlvW3RoaXNfZGV2XSk7CisJCWJyZWFrOworCX0KKwlpZiAoZm91bmQpCisJCXJldHVybiAwOworCXJldHVybiAtRU5YSU87Cit9CisKK3ZvaWQKK2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IHRoaXNfZGV2OworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX0UyMV9DQVJEUzsgdGhpc19kZXYrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2UyMVt0aGlzX2Rldl07CisJCWlmIChkZXYpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lZXByby5jIGIvZHJpdmVycy9uZXQvZWVwcm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDI0NzU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZWVwcm8uYwpAQCAtMCwwICsxLDE4NjUgQEAKKy8qIGVlcHJvLmM6IEludGVsIEV0aGVyRXhwcmVzcyBQcm8vMTAgZGV2aWNlIGRyaXZlciBmb3IgTGludXguICovCisvKgorCVdyaXR0ZW4gMTk5NCwgMTk5NSwxOTk2IGJ5IEJhbyBDLiBIYS4KKworCUNvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwxOTk2IGJ5IEJhbyBDLiBIYS4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkCisJYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisJaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGF0IGJhby5oYUBzcnMuZ292CisJb3IgNDE4IEhhc3RpbmdzIFBsYWNlLCBNYXJ0aW5leiwgR0EgMzA5MDcuCisKKwlUaGluZ3MgcmVtYWluaW5nIHRvIGRvOgorCUJldHRlciByZWNvcmQga2VlcGluZyBvZiBlcnJvcnMuCisJRWxpbWluYXRlIHRyYW5zbWl0IGludGVycnVwdCB0byByZWR1Y2Ugb3ZlcmhlYWQuCisJSW1wbGVtZW50ICJjb25jdXJyZW50IHByb2Nlc3NpbmciLiBJIHdvbid0IGJlIGRvaW5nIGl0IQorCisJQnVnczoKKworCUlmIHlvdSBoYXZlIGEgcHJvYmxlbSBvZiBub3QgZGV0ZWN0aW5nIHRoZSA4MjU5NSBkdXJpbmcgYQorCXJlYm9vdCAod2FybSByZXNldCksIGRpc2FibGUgdGhlIEZMQVNIIG1lbW9yeSBzaG91bGQgZml4IGl0LgorCVRoaXMgaXMgYSBjb21wYXRpYmlsaXR5IGhhcmR3YXJlIHByb2JsZW0uCisKKwlWZXJzaW9uczoKKwkwLjEzYgliYXNpYyBldGh0b29sIHN1cHBvcnQgKGFyaXMsIDA5LzEzLzIwMDQpCisJMC4xM2EgICBpbiBtZW1vcnkgc2hvcnRhZ2UsIGRyb3AgcGFja2V0cyBhbHNvIGluIGJvYXJkCisJCShNaWNoYWVsIFdlc3Rlcm1hbm4gPG13QG1pY3JvZGF0YS1wb3MuZGU+LCAwNy8zMC8yMDAyKQorCTAuMTMgICAgaXJxIHNoYXJpbmcsIHJld3JvdGUgcHJvYmUgZnVuY3Rpb24sIGZpeGVkIGEgbmFzdHkgYnVnIGluCisJCWhhcmR3YXJlX3NlbmRfcGFja2V0IGFuZCBhIG1ham9yIGNsZWFudXAgKGFyaXMsIDExLzA4LzIwMDEpCisJMC4xMmQJZml4aW5nIGEgcHJvYmxlbSB3aXRoIHNpbmdsZSBjYXJkIGRldGVjdGVkIGFzIGVpZ2h0IGV0aCBkZXZpY2VzCisJCWZpeGluZyBhIHByb2JsZW0gd2l0aCBzdWRkZW4gZHJvcCBpbiBjYXJkIHBlcmZvcm1hbmNlCisJCShjaHJpcyAoYXNkbkBnbzIucGwpLCAxMC8yOS8yMDAxKQorCTAuMTJjCWZpeGluZyBzb21lIHByb2JsZW1zIHdpdGggb2xkIGNhcmRzIChhcmlzLCAwMS8wOC8yMDAxKQorCTAuMTJiCW1pc2MgZml4ZXMgKGFyaXMsIDA2LzI2LzIwMDApCisJMC4xMmEgICBwb3J0IG9mIHZlcnNpb24gMC4xMmEgb2YgMi4yLngga2VybmVscyB0byAyLjMueAorCQkoYXJpcyAoYXJpc0Bjb25lY3RpdmEuY29tLmJyKSwgMDUvMTkvMjAwMCkKKwkwLjExZSAgIHNvbWUgdHdlYWtzIGFib3V0IG11bHRpcGxlIGNhcmRzIHN1cHBvcnQgKFBkUCwganVsL2F1ZyAxOTk5KQorCTAuMTFkCWFkZGVkIF9faW5pdGRhdGEsIF9faW5pdCBzdHVmZjsgY2FsbCBzcGluX2xvY2tfaW5pdAorCSAgICAgICAgaW4gZWVwcm9fcHJvYmUxLiBSZXBsYWNlZCAiZWVwcm8iIGJ5IGRldi0+bmFtZS4gQXVnbWVudGVkCisJCXRoZSBjb2RlIHByb3RlY3RlZCBieSBzcGluX2xvY2sgaW4gaW50ZXJydXB0IHJvdXRpbmUKKwkJKFBkUCwgMTIvMTIvMTk5OCkKKwkwLjExYyAgIG1pbm9yIGNsZWFudXAgKFBkUCwgUk1DLCAwOS8xMi8xOTk4KQorCTAuMTFiICAgUGFzY2FsIER1cHVpcyAoZHVwdWlzQGxlaS51Y2wuYWMuYmUpOiB3b3JrcyBhcyBhIG1vZHVsZQorCSAgICAgICAgdW5kZXIgMi4xLnh4LiBEZWJ1ZyBtZXNzYWdlcyBhcmUgZmxhZ2dlZCBhcyBLRVJOX0RFQlVHIHRvCisJCWF2b2lkIGNvbnNvbGUgZmxvb2RpbmcuIEFkZGVkIGxvY2tpbmcgYXQgY3JpdGljYWwgcGFydHMuIE5vdworCQl0aGUgZGF3biB0aGluZyBpcyBTTVAgc2FmZS4KKwkwLjExYSAgIEF0dGVtcHQgdG8gZ2V0IDIuMS54eCBzdXBwb3J0IHVwIChSTUMpCisJMC4xMQlCcmlhbiBDYW5kbGVyIGFkZGVkIHN1cHBvcnQgZm9yIG11bHRpcGxlIGNhcmRzLiBUZXN0ZWQgYXMKKwkJYSBtb2R1bGUsIG5vIGlkZWEgaWYgaXQgd29ya3Mgd2hlbiBjb21waWxlZCBpbnRvIGtlcm5lbC4KKworCTAuMTBlCVJpY2sgQnJlc3NsZXIgbm90aWZpZWQgbWUgdGhhdCBpZmNvbmZpZyB1cDtpZmNvbmZpZyBkb3duIGZhaWxzCisJCWJlY2F1c2UgdGhlIGlycSBpcyBsb3N0IHNvbWV3aGVyZS4gRml4ZWQgdGhhdCBieSBtb3ZpbmcKKwkJcmVxdWVzdF9pcnEgYW5kIGZyZWVfaXJxIHRvIGVlcHJvX29wZW4gYW5kIGVlcHJvX2Nsb3NlIHJlc3BlY3RpdmVseS4KKwkwLjEwZAlVZ2ghIE5vdyBXYWtldXAgd29ya3MuIFdhcyBzZXJpb3VzbHkgYnJva2VuIGluIG15IGZpcnN0IGF0dGVtcHQuCisJCUknbGwgbmVlZCB0byBmaW5kIGEgd2F5IHRvIHNwZWNpZnkgYW4gaW9wb3J0IG90aGVyIHRoYW4KKwkJdGhlIGRlZmF1bHQgb25lIGluIHRoZSBQblAgY2FzZS4gUG5QIGRlZmluaXRpdmVseSBzdWNrcy4KKwkJQW5kLCB5ZXMsIHRoaXMgaXMgbm90IHRoZSBvbmx5IHJlYXNvbi4KKwkwLjEwYwlQblAgV2FrZXVwIFRlc3QgZm9yIDU5NUZYLiB1bmNvbW1lbnQgI2RlZmluZSBQblBXYWtldXA7CisJCXRvIHVzZS4KKwkwLjEwYglTaG91bGQgd29yayBub3cgd2l0aCAoc29tZSkgUHJvLzEwKy4gQXQgbGVhc3QgZm9yCisJCW1lIChhbmQgbXkgdHdvIGNhcmRzKSBpdCBkb2VzLiBfTm9fIGd1YXJhbnRlZSBmb3IKKwkJZnVuY3Rpb24gd2l0aCBub24tUHJvLzEwKyBjYXJkcyEgKGRvbid0IGhhdmUgYW55KQorCQkoUk1DLCA5LzExLzk2KQorCisJMC4xMAlBZGRlZCBzdXBwb3J0IGZvciB0aGUgRXRoZXJleHByZXNzIFByby8xMCsuICBUaGUKKwkJSVJRIG1hcCB3YXMgY2hhbmdlZCBzaWduaWZpY2FudGx5IGZyb20gdGhlIG9sZAorCQlwcm8vMTAuICBUaGUgbmV3IGludGVycnVwdCBtYXAgd2FzIHByb3ZpZGVkIGJ5CisJCVJhaW5lciBNLiBDYW5hdmFuIChDYW5hdmFuQFpldXMuY3MuYm9ubi5lZHUpLgorCQkoQkNILCA5LzMvOTYpCisKKwkwLjA5CUZpeGVkIGEgcmFjZSBjb25kaXRpb24gaW4gdGhlIHRyYW5zbWl0IGFsZ29yaXRobSwKKwkJd2hpY2ggY2F1c2VzIGNyYXNoZXMgdW5kZXIgaGVhdnkgbG9hZCB3aXRoIGZhc3QKKwkJcGVudGl1bSBjb21wdXRlcnMuICBUaGUgcGVyZm9ybWFuY2Ugc2hvdWxkIGFsc28KKwkJaW1wcm92ZSBhIGJpdC4gIFRoZSBzaXplIG9mIFJYIGJ1ZmZlciwgYW5kIGhlbmNlCisJCVRYIGJ1ZmZlciwgY2FuIGFsc28gYmUgY2hhbmdlZCB2aWEgbGlsbyBvciBpbnNtb2QuCisJCShCQ0gsIDcvMzEvOTYpCisKKwkwLjA4CUltcGxlbWVudCAzMi1iaXQgSS9PIGZvciB0aGUgODI1OTVUWCBhbmQgODI1OTVGWAorCQliYXNlZCBsYW4gY2FyZHMuICBEaXNhYmxlIGZ1bGwtZHVwbGV4IG1vZGUgaWYgVFBFCisJCWlzIG5vdCB1c2VkLiAgKEJDSCwgNC84Lzk2KQorCisJMC4wN2EJRml4IGEgc3RhdCByZXBvcnQgd2hpY2ggY291bnRzIGV2ZXJ5IHBhY2tldCBhcyBhCisJCWhlYXJ0LWJlYXQgZmFpbHVyZS4gKEJDSCwgNi8zLzk1KQorCisJMC4wNwlNb2RpZmllZCB0byBzdXBwb3J0IGFsbCBvdGhlciA4MjU5NS1iYXNlZCBsYW4gY2FyZHMuCisJCVRoZSBJUlEgdmVjdG9yIG9mIHRoZSBFdGhlckV4cHJlc3MgUHJvIHdpbGwgYmUgc2V0CisJCWFjY29yZGluZyB0byB0aGUgdmFsdWUgc2F2ZWQgaW4gdGhlIEVFUFJPTS4gIEZvciBvdGhlcgorCQljYXJkcywgSSB3aWxsIGRvIGF1dG9pcnFfcmVxdWVzdCgpIHRvIGdyYWIgdGhlIG5leHQKKwkJYXZhaWxhYmxlIGludGVycnVwdCB2ZWN0b3IuIChCQ0gsIDMvMTcvOTUpCisKKwkwLjA2YSxiCUludGVyaW0gcmVsZWFzZWQuICBNaW5vciBjaGFuZ2VzIGluIHRoZSBjb21tZW50cyBhbmQKKwkJcHJpbnQgb3V0IGZvcm1hdC4gKEJDSCwgMy85Lzk1IGFuZCAzLzE0Lzk1KQorCisJMC4wNglGaXJzdCBzdGFibGUgcmVsZWFzZSB0aGF0IEkgYW0gY29tZm9ydGFibGUgd2l0aC4gKEJDSCwKKwkJMy8yLzk1KQorCisJMC4wNQlDb21wbGV0ZSB0ZXN0aW5nIG9mIG11bHRpY2FzdC4gKEJDSCwgMi8yMy85NSkKKworCTAuMDQJQWRkaW5nIG11bHRpY2FzdCBzdXBwb3J0LiAoQkNILCAyLzE0Lzk1KQorCisJMC4wMwlGaXJzdCB3aWRlbHkgYWxwaGEgcmVsZWFzZSBmb3IgcHVibGljIHRlc3RpbmcuCisJCShCQ0gsIDIvMTQvOTUpCisKKyovCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9CisJImVlcHJvLmM6IHYwLjEzYiAwOS8xMy8yMDA0IGFyaXNAY2F0aGVkcmFsbGFicy5vcmdcbiI7CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworLyoKKyAgU291cmNlczoKKworCVRoaXMgZHJpdmVyIHdvdWxkbid0IGhhdmUgYmVlbiB3cml0dGVuIHdpdGhvdXQgdGhlIGF2YWlsYWJpbGl0eQorCW9mIHRoZSBDcnlud3IncyBMYW41OTUgZHJpdmVyIHNvdXJjZSBjb2RlLiAgSXQgaGVscHMgbWUgdG8KKwlmYW1pbGlhcml6ZSB3aXRoIHRoZSA4MjU5NSBjaGlwc2V0IHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBJbnRlbAorCWRvY3VtZW50YXRpb24uICBJIGFsc28gbGVhcm5lZCBob3cgdG8gZGV0ZWN0IHRoZSA4MjU5NSB1c2luZworCXRoZSBwYWNrZXQgZHJpdmVyJ3MgdGVjaG5pcXVlLgorCisJVGhpcyBkcml2ZXIgaXMgd3JpdHRlbiBieSBjdXR0aW5nIGFuZCBwYXN0aW5nIHRoZSBza2VsZXRvbi5jIGRyaXZlcgorCXByb3ZpZGVkIGJ5IERvbmFsZCBCZWNrZXIuICBJIGFsc28gYm9ycm93ZWQgdGhlIEVFUFJPTSByb3V0aW5lIGZyb20KKwlEb25hbGQgQmVja2VyJ3MgODI1ODYgZHJpdmVyLgorCisJRGF0YXNoZWV0IGZvciB0aGUgSW50ZWwgODI1OTUgKGluY2x1ZGluZyB0aGUgVFggYW5kIEZYIHZlcnNpb24pLiBJdAorCXByb3ZpZGVzIGp1c3QgZW5vdWdoIGluZm8gdGhhdCB0aGUgY2FzdWFsIHJlYWRlciBtaWdodCB0aGluayB0aGF0IGl0CisJZG9jdW1lbnRzIHRoZSBpODI1OTUuCisKKwlUaGUgVXNlciBNYW51YWwgZm9yIHRoZSA4MjU5NS4gIEl0IHByb3ZpZGVzIGEgbG90IG9mIHRoZSBtaXNzaW5nCisJaW5mb3JtYXRpb24uCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2RlZmluZSBEUlZfTkFNRSAiZWVwcm8iCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjEzYiIKKworI2RlZmluZSBjb21wYXRfZGV2X2tmcmVlX3NrYiggc2tiLCBtb2RlICkgZGV2X2tmcmVlX3NrYiggKHNrYikgKQorLyogSSBoYWQgcmVwb3J0cyBvZiBsb29vbmcgZGVsYXlzIHdpdGggU0xPV19ET1dOIGRlZmluZWQgYXMgdWRlbGF5KDIpICovCisjZGVmaW5lIFNMT1dfRE9XTiBpbmIoMHg4MCkKKy8qIHVkZWxheSgyKSAqLworI2RlZmluZSBjb21wYXRfaW5pdF9kYXRhICAgICBfX2luaXRkYXRhCitlbnVtIGlmdHlwZSB7IEFVST0wLCBCTkM9MSwgVFBFPTIgfTsKKworLyogRmlyc3QsIGEgZmV3IGRlZmluaXRpb25zIHRoYXQgdGhlIGJyYXZlIG1pZ2h0IGNoYW5nZS4gKi8KKy8qIEEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgSS9PIGFkZHJlc3NlcyB0byBiZSBwcm9iZWQuICovCitzdGF0aWMgdW5zaWduZWQgaW50IGVlcHJvX3BvcnRsaXN0W10gY29tcGF0X2luaXRfZGF0YSA9CisgICB7IDB4MzAwLCAweDIxMCwgMHgyNDAsIDB4MjgwLCAweDJDMCwgMHgyMDAsIDB4MzIwLCAweDM0MCwgMHgzNjAsIDB9OworLyogbm90ZTogMHgzMDAgaXMgZGVmYXVsdCwgdGhlIDU5NUZYIHN1cHBvcnRzIEFMTCBJTyBQb3J0cworICBmcm9tIDB4MDAwIHRvIDB4M0YwLCBzb21lIG9mIHdoaWNoIGFyZSByZXNlcnZlZCBpbiBQQ3MgKi8KKworLyogVG8gdHJ5IHRoZSAobm90LXJlYWxseSBQblAgV2FrZXVwOiAqLworLyoKKyNkZWZpbmUgUG5QV2FrZXVwCisqLworCisvKiB1c2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgdmVyaWZpY2F0aW9uLCA+MiBmb3IgZGVidWcgKi8KKyNpZm5kZWYgTkVUX0RFQlVHCisjZGVmaW5lIE5FVF9ERUJVRyAwCisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmV0X2RlYnVnID0gTkVUX0RFQlVHOworCisvKiBUaGUgbnVtYmVyIG9mIGxvdyBJL08gcG9ydHMgdXNlZCBieSB0aGUgZXRoZXJjYXJkLiAqLworI2RlZmluZSBFRVBST19JT19FWFRFTlQJMTYKKworLyogRGlmZmVyZW50IDgyNTk1IGNoaXBzICovCisjZGVmaW5lCUxBTjU5NQkJMAorI2RlZmluZQlMQU41OTVUWAkxCisjZGVmaW5lCUxBTjU5NUZYCTIKKyNkZWZpbmUJTEFONTk1RlhfMTBJU0EJMworCisvKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4gKi8KK3N0cnVjdCBlZXByb19sb2NhbCB7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJdW5zaWduZWQgcnhfc3RhcnQ7CisJdW5zaWduZWQgdHhfc3RhcnQ7IC8qIHN0YXJ0IG9mIHRoZSB0cmFuc21pdCBjaGFpbiAqLworCWludCB0eF9sYXN0OyAgLyogcG9pbnRlciB0byBsYXN0IHBhY2tldCBpbiB0aGUgdHJhbnNtaXQgY2hhaW4gKi8KKwl1bnNpZ25lZCB0eF9lbmQ7ICAgLyogZW5kIG9mIHRoZSB0cmFuc21pdCBjaGFpbiAocGx1cyAxKSAqLworCWludCBlZXBybzsJLyogMSBmb3IgdGhlIEV0aGVyRXhwcmVzcyBQcm8vMTAsCisJCQkgICAyIGZvciB0aGUgRXRoZXJFeHByZXNzIFByby8xMCssCisJCQkgICAzIGZvciB0aGUgRXRoZXJFeHByZXNzIDEwIChibHVlIGNhcmRzKSwKKwkJCSAgIDAgZm9yIG90aGVyIDgyNTk1LWJhc2VkIGxhbiBjYXJkcy4gKi8KKwlpbnQgdmVyc2lvbjsJLyogYSBmbGFnIHRvIGluZGljYXRlIGlmIHRoaXMgaXMgYSBUWCBvciBGWAorCQkJCSAgIHZlcnNpb24gb2YgdGhlIDgyNTk1IGNoaXAuICovCisJaW50IHN0ZXBwaW5nOworCisJc3BpbmxvY2tfdCBsb2NrOyAvKiBTZXJpYWxpemluZyBsb2NrICAqLworCisJdW5zaWduZWQgcmN2X3JhbTsJLyogcHJlLWNhbGN1bGF0ZWQgc3BhY2UgZm9yIHJ4ICovCisJdW5zaWduZWQgeG10X3JhbTsJLyogcHJlLWNhbGN1bGF0ZWQgc3BhY2UgZm9yIHR4ICovCisJdW5zaWduZWQgY2hhciB4bXRfYmFyOworCXVuc2lnbmVkIGNoYXIgeG10X2xvd2VyX2xpbWl0X3JlZzsKKwl1bnNpZ25lZCBjaGFyIHhtdF91cHBlcl9saW1pdF9yZWc7CisJc2hvcnQgeG10X2xvd2VyX2xpbWl0OworCXNob3J0IHhtdF91cHBlcl9saW1pdDsKKwlzaG9ydCByY3ZfbG93ZXJfbGltaXQ7CisJc2hvcnQgcmN2X3VwcGVyX2xpbWl0OworCXVuc2lnbmVkIGNoYXIgZWVwcm9tX3JlZzsKKwl1bnNpZ25lZCBzaG9ydCB3b3JkWzhdOworfTsKKworLyogVGhlIHN0YXRpb24gKGV0aGVybmV0KSBhZGRyZXNzIHByZWZpeCwgdXNlZCBmb3IgSURpbmcgdGhlIGJvYXJkLiAqLworI2RlZmluZSBTQV9BRERSMCAweDAwCS8qIEV0aGVyZXhwcmVzcyBQcm8vMTAgKi8KKyNkZWZpbmUgU0FfQUREUjEgMHhhYQorI2RlZmluZSBTQV9BRERSMiAweDAwCisKKyNkZWZpbmUgR2V0Qml0KHgseSkgKCh4ICYgKDE8PHkpKT4+eSkKKworLyogRUVQUk9NIFdvcmQgMDogKi8KKyNkZWZpbmUgZWVfUG5QICAgICAgIDAgIC8qIFBsdWcgJ24gUGxheSBlbmFibGUgYml0ICovCisjZGVmaW5lIGVlX1dvcmQxICAgICAxICAvKiBXb3JkIDE/ICovCisjZGVmaW5lIGVlX0J1c1dpZHRoICAyICAvKiA4LzE2IGJpdCAqLworI2RlZmluZSBlZV9GbGFzaEFkZHIgMyAgLyogRmxhc2ggQWRkcmVzcyAqLworI2RlZmluZSBlZV9GbGFzaE1hc2sgMHg3ICAgLyogTWFzayAqLworI2RlZmluZSBlZV9BdXRvSU8gICAgNiAgLyogKi8KKyNkZWZpbmUgZWVfcmVzZXJ2ZWQwIDcgIC8qID0wISAqLworI2RlZmluZSBlZV9GbGFzaCAgICAgOCAgLyogRmxhc2ggdGhlcmU/ICovCisjZGVmaW5lIGVlX0F1dG9OZWcgICA5ICAvKiBBdXRvIE5lZ290aWF0aW9uIGVuYWJsZWQ/ICovCisjZGVmaW5lIGVlX0lPMCAgICAgICAxMCAvKiBJTyBBZGRyZXNzIExTQiAqLworI2RlZmluZSBlZV9JTzBNYXNrICAgMHggLyouLi4qLworI2RlZmluZSBlZV9JTzEgICAgICAgMTUgLyogSU8gTVNCICovCisKKy8qIEVFUFJPTSBXb3JkIDE6ICovCisjZGVmaW5lIGVlX0ludFNlbCAgICAwICAgLyogSW50ZXJydXB0ICovCisjZGVmaW5lIGVlX0ludE1hc2sgICAweDcKKyNkZWZpbmUgZWVfTEkgICAgICAgIDMgICAvKiBMaW5rIEludGVncml0eSAwPSBlbmFibGVkICovCisjZGVmaW5lIGVlX1BDICAgICAgICA0ICAgLyogUG9sYXJpdHkgQ29ycmVjdGlvbiAwPSBlbmFibGVkICovCisjZGVmaW5lIGVlX1RQRV9BVUkgICA1ICAgLyogUG9ydFNlbGVjdGlvbiAxPVRQRSAqLworI2RlZmluZSBlZV9KYWJiZXIgICAgNiAgIC8qIEphYmJlciBwcmV2ZW50aW9uIDA9IGVuYWJsZWQgKi8KKyNkZWZpbmUgZWVfQXV0b1BvcnQgIDcgICAvKiBBdXRvIFBvcnQgU2VsZWN0aW9uIDE9IERpc2FibGVkICovCisjZGVmaW5lIGVlX1NNT1VUICAgICA4ICAgLyogU01vdXQgUGluIENvbnRyb2wgMD0gSW5wdXQgKi8KKyNkZWZpbmUgZWVfUFJPTSAgICAgIDkgICAvKiBGbGFzaCBFUFJPTSAvIFBST00gMD1GbGFzaCAqLworI2RlZmluZSBlZV9yZXNlcnZlZDEgMTAgIC8qIC4uIDEyID0wISAqLworI2RlZmluZSBlZV9BbHRSZWFkeSAgMTMgIC8qIEFsdGVybmF0ZSBSZWFkeSwgMD1ub3JtYWwgKi8KKyNkZWZpbmUgZWVfcmVzZXJ2ZWQyIDE0ICAvKiA9MCEgKi8KKyNkZWZpbmUgZWVfRHVwbGV4ICAgIDE1CisKKy8qIFdvcmQyLDMsNDogKi8KKyNkZWZpbmUgZWVfSUE1ICAgICAgIDAgLypiaXQgc3RhcnQgZm9yIGluZGl2aWR1YWwgQWRkciBCeXRlIDUgKi8KKyNkZWZpbmUgZWVfSUE0ICAgICAgIDggLypiaXQgc3RhcnQgZm9yIGluZGl2aWR1YWwgQWRkciBCeXRlIDUgKi8KKyNkZWZpbmUgZWVfSUEzICAgICAgIDAgLypiaXQgc3RhcnQgZm9yIGluZGl2aWR1YWwgQWRkciBCeXRlIDUgKi8KKyNkZWZpbmUgZWVfSUEyICAgICAgIDggLypiaXQgc3RhcnQgZm9yIGluZGl2aWR1YWwgQWRkciBCeXRlIDUgKi8KKyNkZWZpbmUgZWVfSUExICAgICAgIDAgLypiaXQgc3RhcnQgZm9yIGluZGl2aWR1YWwgQWRkciBCeXRlIDUgKi8KKyNkZWZpbmUgZWVfSUEwICAgICAgIDggLypiaXQgc3RhcnQgZm9yIGluZGl2aWR1YWwgQWRkciBCeXRlIDUgKi8KKworLyogV29yZCA1OiAqLworI2RlZmluZSBlZV9CTkNfVFBFICAgMCAvKiAwPVRQRSAqLworI2RlZmluZSBlZV9Cb290VHlwZSAgMSAvKiAwMD1Ob25lLCAwMT1JUFgsIDEwPU9ESSwgMTE9TkRJUyAqLworI2RlZmluZSBlZV9Cb290VHlwZU1hc2sgMHgzCisjZGVmaW5lIGVlX051bUNvbm4gICAzICAvKiBOdW1iZXIgb2YgQ29ubmVjdGlvbnMgMD0gT25lIG9yIFR3byAqLworI2RlZmluZSBlZV9GbGFzaFNvY2sgNCAgLyogUHJlc2VuY2Ugb2YgRmxhc2ggU29ja2V0IDA9IFByZXNlbnQgKi8KKyNkZWZpbmUgZWVfUG9ydFRQRSAgIDUKKyNkZWZpbmUgZWVfUG9ydEJOQyAgIDYKKyNkZWZpbmUgZWVfUG9ydEFVSSAgIDcKKyNkZWZpbmUgZWVfUG93ZXJNZ3QgIDEwIC8qIDA9IGRpc2FibGVkICovCisjZGVmaW5lIGVlX0NQICAgICAgICAxMyAvKiBDb25jdXJyZW50IFByb2Nlc3NpbmcgKi8KKyNkZWZpbmUgZWVfQ1BNYXNrICAgIDB4NworCisvKiBXb3JkIDY6ICovCisjZGVmaW5lIGVlX1N0ZXBwaW5nICAwIC8qIFN0ZXBwaW5nIGluZm8gKi8KKyNkZWZpbmUgZWVfU3RlcE1hc2sgIDB4MEYKKyNkZWZpbmUgZWVfQm9hcmRJRCAgIDQgLyogTWFudWNhdHVyZXIgQm9hcmQgSUQsIHJlc2VydmVkICovCisjZGVmaW5lIGVlX0JvYXJkTWFzayAweDBGRkYKKworLyogV29yZCA3OiAqLworI2RlZmluZSBlZV9JTlRfVE9fSVJRIDAgLyogaW50IHRvIElSUSBNYXBwaW5nICA9IDB4MUVCOCBmb3IgUHJvLzEwKyAqLworI2RlZmluZSBlZV9GWF9JTlQySVJRIDB4MUVCOCAvKiB0aGUgX29ubHlfIG1hcHBpbmcgYWxsb3dlZCBmb3IgRlggY2hpcHMgKi8KKworLyouLiovCisjZGVmaW5lIGVlX1NJWkUgMHg0MCAvKiB0b3RhbCBFRXByb20gU2l6ZSAqLworI2RlZmluZSBlZV9DaGVja3N1bSAweEJBQkEgLyogaW5pdGlhbCBhbmQgZmluYWwgdmFsdWUgZm9yIGFkZGluZyBjaGVja3N1bSAqLworCisKKy8qIENhcmQgaWRlbnRpZmljYXRpb24gdmlhIEVFcHJvbTogICAqLworI2RlZmluZSBlZV9hZGRyX3ZlbmRvciAweDEwICAvKiBXb3JkIG9mZnNldCBmb3IgRUlTQSBWZW5kb3IgSUQgKi8KKyNkZWZpbmUgZWVfYWRkcl9pZCAweDExICAgICAgLyogV29yZCBvZmZzZXQgZm9yIENhcmQgSUQgKi8KKyNkZWZpbmUgZWVfYWRkcl9TTiAweDEyICAgICAgLyogU2VyaWFsIE51bWJlciAqLworI2RlZmluZSBlZV9hZGRyX0NSQ184IDB4MTQgICAvKiBDUkMgb3ZlciBsYXN0IHRoZWUgQnl0ZXMgKi8KKworCisjZGVmaW5lIGVlX3ZlbmRvcl9pbnRlbDAgMHgyNSAgLyogVmVuZG9yIElEIEludGVsICovCisjZGVmaW5lIGVlX3ZlbmRvcl9pbnRlbDEgMHhENAorI2RlZmluZSBlZV9pZF9lZXBybzEwcDAgMHgxMCAgIC8qIElEIGZvciBlZXByby8xMCsgKi8KKyNkZWZpbmUgZWVfaWRfZWVwcm8xMHAxIDB4MzEKKworI2RlZmluZSBUWF9USU1FT1VUIDQwCisKKy8qIEluZGV4IHRvIGZ1bmN0aW9ucywgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4gKi8KKworc3RhdGljIGludAllZXByb19wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGF1dG9wcm9iZSk7CitzdGF0aWMgaW50CWVlcHJvX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CWVlcHJvX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGVlcHJvX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIAllZXByb19yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIAllZXByb190cmFuc21pdF9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CWVlcHJvX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICplZXByb19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICAgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgIGVlcHJvX3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgaW50IHJlYWRfZWVwcm9tKGludCBpb2FkZHIsIGludCBsb2NhdGlvbiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CWhhcmR3YXJlX3NlbmRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmJ1Ziwgc2hvcnQgbGVuZ3RoKTsKK3N0YXRpYyBpbnQJZWVwcm9fZ3JhYl9pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qCisJCQlEZXRhaWxzIG9mIHRoZSBpODI1OTUuCisKK1lvdSB3aWxsIG5lZWQgZWl0aGVyIHRoZSBkYXRhc2hlZXQgb3IgdGhlIHVzZXIgbWFudWFsIHRvIHVuZGVyc3RhbmQgd2hhdAoraXMgZ29pbmcgb24gaGVyZS4gIFRoZSA4MjU5NSBpcyB2ZXJ5IGRpZmZlcmVudCBmcm9tIHRoZSA4MjU4NiwgODI1OTMuCisKK1RoZSByZWNlaXZlIGFsZ29yaXRobSBpbiBlZXByb19yeCgpIGlzIGp1c3QgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlCitSQ1YgcmluZyBzdHJ1Y3R1cmUgdGhhdCB0aGUgSW50ZWwgODI1OTUgaW1wb3NlcyBhdCB0aGUgaGFyZHdhcmUgbGV2ZWwuCitUaGUgcmVjZWl2ZSBidWZmZXIgaXMgc2V0IGF0IDI0SywgYW5kIHRoZSB0cmFuc21pdCBidWZmZXIgaXMgOEsuICBJCithbSBhc3N1bWluZyB0aGF0IHRoZSB0b3RhbCBidWZmZXIgbWVtb3J5IGlzIDMySywgd2hpY2ggaXMgdHJ1ZSBmb3IgdGhlCitJbnRlbCBFdGhlckV4cHJlc3MgUHJvLzEwLiAgSWYgaXQgaXMgbGVzcyB0aGFuIHRoYXQgb24gYSBnZW5lcmljIGNhcmQsCit0aGUgZHJpdmVyIHdpbGwgYmUgYnJva2VuLgorCitUaGUgdHJhbnNtaXQgYWxnb3JpdGhtIGluIHRoZSBoYXJkd2FyZV9zZW5kX3BhY2tldCgpIGlzIHNpbWlsYXIgdG8gdGhlCitvbmUgaW4gdGhlIGVlcHJvX3J4KCkuICBUaGUgdHJhbnNtaXQgYnVmZmVyIGlzIGEgcmluZyBsaW5rZWQgbGlzdC4KK0kganVzdCBxdWV1ZSB0aGUgbmV4dCBhdmFpbGFibGUgcGFja2V0IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuICBJbiBteQorc3lzdGVtLCB0aGUgODI1OTUgaXMgc28gZmFzdCB0aGF0IHRoZSBsaXN0IHNlZW1zIHRvIGFsd2F5cyBjb250YWluIGEKK3NpbmdsZSBwYWNrZXQuICBJbiBvdGhlciBzeXN0ZW1zIHdpdGggZmFzdGVyIGNvbXB1dGVycyBhbmQgbW9yZSBjb25nZXN0ZWQKK25ldHdvcmsgdHJhZmZpY3MsIHRoZSByaW5nIGxpbmtlZCBsaXN0IHNob3VsZCBpbXByb3ZlIHBlcmZvcm1hbmNlIGJ5CithbGxvd2luZyB1cCB0byA4SyB3b3J0aCBvZiBwYWNrZXRzIHRvIGJlIHF1ZXVlZC4KKworVGhlIHNpemVzIG9mIHRoZSByZWNlaXZlIGFuZCB0cmFuc21pdCBidWZmZXJzIGNhbiBub3cgYmUgY2hhbmdlZCB2aWEgbGlsbworb3IgaW5zbW9kLiAgTGlsbyB1c2VzIHRoZSBhcHBlbmRlZCBsaW5lICJldGhlcj1pbyxpcnEsZGVidWcscngtYnVmZmVyLGV0aDAiCit3aGVyZSByeC1idWZmZXIgaXMgaW4gS0IgdW5pdC4gIE1vZHVsZXMgdXNlcyB0aGUgcGFyYW1ldGVyIG1lbSB3aGljaCBpcworYWxzbyBpbiBLQiB1bml0LCBmb3IgZXhhbXBsZSAiaW5zbW9kIGlvPWlvLWFkZHJlc3MgaXJxPTAgbWVtPXJ4LWJ1ZmZlci4iCitUaGUgcmVjZWl2ZSBidWZmZXIgaGFzIHRvIGJlIG1vcmUgdGhhbiAzSyBvciBsZXNzIHRoYW4gMjlLLiAgT3RoZXJ3aXNlLAoraXQgaXMgcmVzZXQgdG8gdGhlIGRlZmF1bHQgb2YgMjRLLCBhbmQsIGhlbmNlLCA4SyBmb3IgdGhlIHRyYXNubWl0CitidWZmZXIgKHRyYW5zbWl0LWJ1ZmZlciA9IDMySyAtIHJlY2VpdmUtYnVmZmVyKS4KKworKi8KKyNkZWZpbmUgUkFNX1NJWkUgICAgICAgIDB4ODAwMAorCisjZGVmaW5lIFJDVl9IRUFERVIgICAgICA4CisjZGVmaW5lIFJDVl9ERUZBVUxUX1JBTSAweDYwMDAKKworI2RlZmluZSBYTVRfSEVBREVSICAgICAgOAorI2RlZmluZSBYTVRfREVGQVVMVF9SQU0JKFJBTV9TSVpFIC0gUkNWX0RFRkFVTFRfUkFNKQorCisjZGVmaW5lIFhNVF9TVEFSVF9QUk8JUkNWX0RFRkFVTFRfUkFNCisjZGVmaW5lIFhNVF9TVEFSVF8xMAkweDAwMDAKKyNkZWZpbmUgUkNWX1NUQVJUX1BSTwkweDAwMDAKKyNkZWZpbmUgUkNWX1NUQVJUXzEwCVhNVF9ERUZBVUxUX1JBTQorCisjZGVmaW5lCVJDVl9ET05FCTB4MDAwOAorI2RlZmluZQlSWF9PSwkJMHgyMDAwCisjZGVmaW5lCVJYX0VSUk9SCTB4MGQ4MQorCisjZGVmaW5lCVRYX0RPTkVfQklUCTB4MDA4MAorI2RlZmluZQlUWF9PSwkJMHgyMDAwCisjZGVmaW5lCUNIQUlOX0JJVAkweDgwMDAKKyNkZWZpbmUJWE1UX1NUQVRVUwkweDAyCisjZGVmaW5lCVhNVF9DSEFJTgkweDA0CisjZGVmaW5lCVhNVF9DT1VOVAkweDA2CisKKyNkZWZpbmUJQkFOSzBfU0VMRUNUCTB4MDAKKyNkZWZpbmUJQkFOSzFfU0VMRUNUCTB4NDAKKyNkZWZpbmUJQkFOSzJfU0VMRUNUCTB4ODAKKworLyogQmFuayAwIHJlZ2lzdGVycyAqLworI2RlZmluZQlDT01NQU5EX1JFRwkweDAwCS8qIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJTUNfU0VUVVAJMHgwMworI2RlZmluZQlYTVRfQ01ECQkweDA0CisjZGVmaW5lCURJQUdOT1NFX0NNRAkweDA3CisjZGVmaW5lCVJDVl9FTkFCTEVfQ01ECTB4MDgKKyNkZWZpbmUJUkNWX0RJU0FCTEVfQ01ECTB4MGEKKyNkZWZpbmUJU1RPUF9SQ1ZfQ01ECTB4MGIKKyNkZWZpbmUJUkVTRVRfQ01ECTB4MGUKKyNkZWZpbmUJUE9XRVJfRE9XTl9DTUQJMHgxOAorI2RlZmluZQlSRVNVTUVfWE1UX0NNRAkweDFjCisjZGVmaW5lCVNFTF9SRVNFVF9DTUQJMHgxZQorI2RlZmluZQlTVEFUVVNfUkVHCTB4MDEJLyogUmVnaXN0ZXIgMSAqLworI2RlZmluZQlSWF9JTlQJCTB4MDIKKyNkZWZpbmUJVFhfSU5UCQkweDA0CisjZGVmaW5lCUVYRUNfU1RBVFVTCTB4MzAKKyNkZWZpbmUJSURfUkVHCQkweDAyCS8qIFJlZ2lzdGVyIDIJKi8KKyNkZWZpbmUJUl9ST0JJTl9CSVRTCTB4YzAJLyogcm91bmQgcm9iaW4gY291bnRlciAqLworI2RlZmluZQlJRF9SRUdfTUFTSwkweDJjCisjZGVmaW5lCUlEX1JFR19TSUcJMHgyNAorI2RlZmluZQlBVVRPX0VOQUJMRQkweDEwCisjZGVmaW5lCUlOVF9NQVNLX1JFRwkweDAzCS8qIFJlZ2lzdGVyIDMJKi8KKyNkZWZpbmUJUlhfU1RPUF9NQVNLCTB4MDEKKyNkZWZpbmUJUlhfTUFTSwkJMHgwMgorI2RlZmluZQlUWF9NQVNLCQkweDA0CisjZGVmaW5lCUVYRUNfTUFTSwkweDA4CisjZGVmaW5lCUFMTF9NQVNLCTB4MGYKKyNkZWZpbmUJSU9fMzJfQklUCTB4MTAKKyNkZWZpbmUJUkNWX0JBUgkJMHgwNAkvKiBUaGUgZm9sbG93aW5nIGFyZSB3b3JkICgxNi1iaXQpIHJlZ2lzdGVycyAqLworI2RlZmluZQlSQ1ZfU1RPUAkweDA2CisKKyNkZWZpbmUJWE1UX0JBUl9QUk8JMHgwYQorI2RlZmluZQlYTVRfQkFSXzEwCTB4MGIKKworI2RlZmluZQlIT1NUX0FERFJFU1NfUkVHCTB4MGMKKyNkZWZpbmUJSU9fUE9SVAkJMHgwZQorI2RlZmluZQlJT19QT1JUXzMyX0JJVAkweDBjCisKKy8qIEJhbmsgMSByZWdpc3RlcnMgKi8KKyNkZWZpbmUJUkVHMQkweDAxCisjZGVmaW5lCVdPUkRfV0lEVEgJMHgwMgorI2RlZmluZQlJTlRfRU5BQkxFCTB4ODAKKyNkZWZpbmUgSU5UX05PX1JFRwkweDAyCisjZGVmaW5lCVJDVl9MT1dFUl9MSU1JVF9SRUcJMHgwOAorI2RlZmluZQlSQ1ZfVVBQRVJfTElNSVRfUkVHCTB4MDkKKworI2RlZmluZQlYTVRfTE9XRVJfTElNSVRfUkVHX1BSTyAweDBhCisjZGVmaW5lCVhNVF9VUFBFUl9MSU1JVF9SRUdfUFJPIDB4MGIKKyNkZWZpbmUJWE1UX0xPV0VSX0xJTUlUX1JFR18xMCAgMHgwYgorI2RlZmluZQlYTVRfVVBQRVJfTElNSVRfUkVHXzEwICAweDBhCisKKy8qIEJhbmsgMiByZWdpc3RlcnMgKi8KKyNkZWZpbmUJWE1UX0NoYWluX0ludAkweDIwCS8qIEludGVycnVwdCBhdCB0aGUgZW5kIG9mIHRoZSB0cmFuc21pdCBjaGFpbiAqLworI2RlZmluZQlYTVRfQ2hhaW5fRXJyU3RvcAkweDQwIC8qIEludGVycnVwdCBhdCB0aGUgZW5kIG9mIHRoZSBjaGFpbiBldmVuIGlmIHRoZXJlIGFyZSBlcnJvcnMgKi8KKyNkZWZpbmUJUkNWX0Rpc2NhcmRfQmFkRnJhbWUJMHg4MCAvKiBUaHJvdyBiYWQgZnJhbWVzIGF3YXksIGFuZCBjb250aW51ZSB0byByZWNlaXZlIG90aGVycyAqLworI2RlZmluZQlSRUcyCQkweDAyCisjZGVmaW5lCVBSTVNDX01vZGUJMHgwMQorI2RlZmluZQlNdWx0aV9JQQkweDIwCisjZGVmaW5lCVJFRzMJCTB4MDMKKyNkZWZpbmUJVFBFX0JJVAkJMHgwNAorI2RlZmluZQlCTkNfQklUCQkweDIwCisjZGVmaW5lCVJFRzEzCQkweDBkCisjZGVmaW5lCUZEWAkJMHgwMAorI2RlZmluZQlBX05fRU5BQkxFCTB4MDIKKworI2RlZmluZQlJX0FERF9SRUcwCTB4MDQKKyNkZWZpbmUJSV9BRERfUkVHMQkweDA1CisjZGVmaW5lCUlfQUREX1JFRzIJMHgwNgorI2RlZmluZQlJX0FERF9SRUczCTB4MDcKKyNkZWZpbmUJSV9BRERfUkVHNAkweDA4CisjZGVmaW5lCUlfQUREX1JFRzUJMHgwOQorCisjZGVmaW5lCUVFUFJPTV9SRUdfUFJPIDB4MGEKKyNkZWZpbmUJRUVQUk9NX1JFR18xMCAgMHgwYgorCisjZGVmaW5lIEVFU0sgMHgwMQorI2RlZmluZSBFRUNTIDB4MDIKKyNkZWZpbmUgRUVESSAweDA0CisjZGVmaW5lIEVFRE8gMHgwOAorCisvKiBkbyBhIGZ1bGwgcmVzZXQgKi8KKyNkZWZpbmUgZWVwcm9fcmVzZXQoaW9hZGRyKSBvdXRiKFJFU0VUX0NNRCwgaW9hZGRyKQorCisvKiBkbyBhIG5pY2UgcmVzZXQgKi8KKyNkZWZpbmUgZWVwcm9fc2VsX3Jlc2V0KGlvYWRkcikgCXsgXAorCQkJCQlvdXRiKFNFTF9SRVNFVF9DTUQsIGlvYWRkcik7IFwKKwkJCQkJU0xPV19ET1dOOyBcCisJCQkJCVNMT1dfRE9XTjsgXAorCQkJCQl9CisKKy8qIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKyNkZWZpbmUgZWVwcm9fZGlzX2ludChpb2FkZHIpIG91dGIoQUxMX01BU0ssIGlvYWRkciArIElOVF9NQVNLX1JFRykKKworLyogY2xlYXIgYWxsIGludGVycnVwdHMgKi8KKyNkZWZpbmUgZWVwcm9fY2xlYXJfaW50KGlvYWRkcikgb3V0YihBTExfTUFTSywgaW9hZGRyICsgU1RBVFVTX1JFRykKKworLyogZW5hYmxlIHR4L3J4ICovCisjZGVmaW5lIGVlcHJvX2VuX2ludChpb2FkZHIpIG91dGIoQUxMX01BU0sgJiB+KFJYX01BU0sgfCBUWF9NQVNLKSwgXAorCQkJCQkJCWlvYWRkciArIElOVF9NQVNLX1JFRykKKworLyogZW5hYmxlIGV4ZWMgZXZlbnQgaW50ZXJydXB0ICovCisjZGVmaW5lIGVlcHJvX2VuX2ludGV4ZWMoaW9hZGRyKSBvdXRiKEFMTF9NQVNLICYgfihFWEVDX01BU0spLCBpb2FkZHIgKyBJTlRfTUFTS19SRUcpCisKKy8qIGVuYWJsZSByeCAqLworI2RlZmluZSBlZXByb19lbl9yeChpb2FkZHIpIG91dGIoUkNWX0VOQUJMRV9DTUQsIGlvYWRkcikKKworLyogZGlzYWJsZSByeCAqLworI2RlZmluZSBlZXByb19kaXNfcngoaW9hZGRyKSBvdXRiKFJDVl9ESVNBQkxFX0NNRCwgaW9hZGRyKQorCisvKiBzd2l0Y2ggYmFuayAqLworI2RlZmluZSBlZXByb19zdzJiYW5rMChpb2FkZHIpIG91dGIoQkFOSzBfU0VMRUNULCBpb2FkZHIpCisjZGVmaW5lIGVlcHJvX3N3MmJhbmsxKGlvYWRkcikgb3V0YihCQU5LMV9TRUxFQ1QsIGlvYWRkcikKKyNkZWZpbmUgZWVwcm9fc3cyYmFuazIoaW9hZGRyKSBvdXRiKEJBTksyX1NFTEVDVCwgaW9hZGRyKQorCisvKiBlbmFibGUgaW50ZXJydXB0IGxpbmUgKi8KKyNkZWZpbmUgZWVwcm9fZW5faW50bGluZShpb2FkZHIpIG91dGIoaW5iKGlvYWRkciArIFJFRzEpIHwgSU5UX0VOQUJMRSxcCisJCQkJaW9hZGRyICsgUkVHMSkKKworLyogZGlzYWJsZSBpbnRlcnJ1cHQgbGluZSAqLworI2RlZmluZSBlZXByb19kaXNfaW50bGluZShpb2FkZHIpIG91dGIoaW5iKGlvYWRkciArIFJFRzEpICYgMHg3ZiwgXAorCQkJCWlvYWRkciArIFJFRzEpOworCisvKiBzZXQgZGlhZ25vc2UgZmxhZyAqLworI2RlZmluZSBlZXByb19kaWFnKGlvYWRkcikgb3V0YihESUFHTk9TRV9DTUQsIGlvYWRkcikKKworLyogYWNrIGZvciByeCBpbnQgKi8KKyNkZWZpbmUgZWVwcm9fYWNrX3J4KGlvYWRkcikgb3V0YiAoUlhfSU5ULCBpb2FkZHIgKyBTVEFUVVNfUkVHKQorCisvKiBhY2sgZm9yIHR4IGludCAqLworI2RlZmluZSBlZXByb19hY2tfdHgoaW9hZGRyKSBvdXRiIChUWF9JTlQsIGlvYWRkciArIFNUQVRVU19SRUcpCisKKy8qIGEgY29tcGxldGUgc2VsIHJlc2V0ICovCisjZGVmaW5lIGVlcHJvX2NvbXBsZXRlX3NlbHJlc2V0KGlvYWRkcikgeyBcCisJCQkJCQlscC0+c3RhdHMudHhfZXJyb3JzKys7XAorCQkJCQkJZWVwcm9fc2VsX3Jlc2V0KGlvYWRkcik7XAorCQkJCQkJbHAtPnR4X2VuZCA9IFwKKwkJCQkJCQlscC0+eG10X2xvd2VyX2xpbWl0O1wKKwkJCQkJCWxwLT50eF9zdGFydCA9IGxwLT50eF9lbmQ7XAorCQkJCQkJbHAtPnR4X2xhc3QgPSAwO1wKKwkJCQkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzO1wKKwkJCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTtcCisJCQkJCQllZXByb19lbl9yeChpb2FkZHIpO1wKKwkJCQkJfQorCisvKiBDaGVjayBmb3IgYSBuZXR3b3JrIGFkYXB0b3Igb2YgdGhpcyB0eXBlLCBhbmQgcmV0dXJuICcwJyBpZiBvbmUgZXhpc3RzLgorICAgSWYgZGV2LT5iYXNlX2FkZHIgPT0gMCwgcHJvYmUgYWxsIGxpa2VseSBsb2NhdGlvbnMuCisgICBJZiBkZXYtPmJhc2VfYWRkciA9PSAxLCBhbHdheXMgcmV0dXJuIGZhaWx1cmUuCisgICBJZiBkZXYtPmJhc2VfYWRkciA9PSAyLCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGRldmljZSBhbmQgcmV0dXJuIHN1Y2Nlc3MKKyAgIChkZXRhY2hhYmxlIGRldmljZXMgb25seSkuCisgICAqLworc3RhdGljIGludCBfX2luaXQgZG9fZWVwcm9fcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwlpbnQgYmFzZV9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGlycSA9IGRldi0+aXJxOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisjaWZkZWYgUG5QV2FrZXVwCisJLyogWFhYWCBmb3IgbXVsdGlwbGUgY2FyZHMgc2hvdWxkIHRoaXMgb25seSBiZSBydW4gb25jZT8gKi8KKworCS8qIFdha2V1cDogKi8KKwkjZGVmaW5lIFdha2V1cFBvcnQgMHgyNzkKKwkjZGVmaW5lIFdha2V1cFNlcSAgICB7MHg2QSwgMHhCNSwgMHhEQSwgMHhFRCwgMHhGNiwgMHhGQiwgMHg3RCwgMHhCRSxcCisJICAgICAgICAgICAgICAgICAgICAgIDB4REYsIDB4NkYsIDB4MzcsIDB4MUIsIDB4MEQsIDB4ODYsIDB4QzMsIDB4NjEsXAorCSAgICAgICAgICAgICAgICAgICAgICAweEIwLCAweDU4LCAweDJDLCAweDE2LCAweDhCLCAweDQ1LCAweEEyLCAweEQxLFwKKwkgICAgICAgICAgICAgICAgICAgICAgMHhFOCwgMHg3NCwgMHgzQSwgMHg5RCwgMHhDRSwgMHhFNywgMHg3MywgMHg0M30KKworCXsKKwkJdW5zaWduZWQgc2hvcnQgaW50IFdTWzMyXT1XYWtldXBTZXE7CisKKwkJaWYgKGNoZWNrX3JlZ2lvbihXYWtldXBQb3J0LCAyKT09MCkgeworCisJCQlpZiAobmV0X2RlYnVnPjUpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIldha2luZyBVUFxuIik7CisKKwkJCW91dGJfcCgwLFdha2V1cFBvcnQpOworCQkJb3V0Yl9wKDAsV2FrZXVwUG9ydCk7CisJCQlmb3IgKGk9MDsgaTwzMjsgaSsrKSB7CisJCQkJb3V0Yl9wKFdTW2ldLFdha2V1cFBvcnQpOworCQkJCWlmIChuZXRfZGVidWc+NSkgcHJpbnRrKEtFUk5fREVCVUcgIjogJSN4ICIsV1NbaV0pOworCQkJfQorCQl9IGVsc2UgcHJpbnRrKEtFUk5fV0FSTklORyAiQ2hlY2tyZWdpb24gRmFpbGVkIVxuIik7CisJfQorI2VuZGlmCisKKwlpZiAoYmFzZV9hZGRyID4gMHgxZmYpCQkvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCXJldHVybiBlZXByb19wcm9iZTEoZGV2LCAwKTsKKworCWVsc2UgaWYgKGJhc2VfYWRkciAhPSAwKQkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCXJldHVybiAtRU5YSU87CisKKwlmb3IgKGkgPSAwOyBlZXByb19wb3J0bGlzdFtpXTsgaSsrKSB7CisJCWRldi0+YmFzZV9hZGRyID0gZWVwcm9fcG9ydGxpc3RbaV07CisJCWRldi0+aXJxID0gaXJxOworCQlpZiAoZWVwcm9fcHJvYmUxKGRldiwgMSkgPT0gMCkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRU5PREVWOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgZWVwcm9fcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgZWVwcm9fbG9jYWwpKTsKKwlpbnQgZXJyOworCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisKKwllcnIgPSBkb19lZXByb19wcm9iZShkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlyZXR1cm4gZGV2Oworb3V0MToKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRUVQUk9fSU9fRVhURU5UKTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgX19pbml0IHByaW50RUVQUk9NSW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlZXByb19sb2NhbCAqbHAgPSAoc3RydWN0IGVlcHJvX2xvY2FsICopZGV2LT5wcml2OworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBzaG9ydCBXb3JkOworCWludCBpLGo7CisKKwlqID0gZWVfQ2hlY2tzdW07CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJaiArPSBscC0+d29yZFtpXTsKKwlmb3IgKCA7IGkgPCBlZV9TSVpFOyBpKyspCisJCWogKz0gcmVhZF9lZXByb20oaW9hZGRyLCBpLCBkZXYpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIkNoZWNrc3VtOiAlI3hcbiIsaiYweGZmZmYpOworCisJV29yZCA9IGxwLT53b3JkWzBdOworCXByaW50ayhLRVJOX0RFQlVHICJXb3JkMDpcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICIgUGx1ZyAnbiBQcmF5OiAlZFxuIixHZXRCaXQoV29yZCxlZV9QblApKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiIEJ1c3dpZHRoOiAlZFxuIiwoR2V0Qml0KFdvcmQsZWVfQnVzV2lkdGgpKzEpKjggKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiIEF1dG9OZWdvdGlhdGlvbjogJWRcbiIsR2V0Qml0KFdvcmQsZWVfQXV0b05lZykpOworCXByaW50ayhLRVJOX0RFQlVHICIgSU8gQWRkcmVzczogJSN4XG4iLCAoV29yZD4+ZWVfSU8wKTw8NCk7CisKKwlpZiAobmV0X2RlYnVnPjQpICB7CisJCVdvcmQgPSBscC0+d29yZFsxXTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIldvcmQxOlxuIik7CisJCXByaW50ayhLRVJOX0RFQlVHICIgSU5UOiAlZFxuIiwgV29yZCAmIGVlX0ludE1hc2spOworCQlwcmludGsoS0VSTl9ERUJVRyAiIExJOiAlZFxuIiwgR2V0Qml0KFdvcmQsZWVfTEkpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiBQQzogJWRcbiIsIEdldEJpdChXb3JkLGVlX1BDKSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIgVFBFL0FVSTogJWRcbiIsIEdldEJpdChXb3JkLGVlX1RQRV9BVUkpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiBKYWJiZXI6ICVkXG4iLCBHZXRCaXQoV29yZCxlZV9KYWJiZXIpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiBBdXRvUG9ydDogJWRcbiIsIEdldEJpdCghV29yZCxlZV9KYWJiZXIpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiBEdXBsZXg6ICVkXG4iLCBHZXRCaXQoV29yZCxlZV9EdXBsZXgpKTsKKwl9CisKKwlXb3JkID0gbHAtPndvcmRbNV07CisJcHJpbnRrKEtFUk5fREVCVUcgIldvcmQ1OlxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBCTkM6ICVkXG4iLEdldEJpdChXb3JkLGVlX0JOQ19UUEUpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiIE51bUNvbm5lY3RvcnM6ICVkXG4iLEdldEJpdChXb3JkLGVlX051bUNvbm4pKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiIEhhcyAiKTsKKwlpZiAoR2V0Qml0KFdvcmQsZWVfUG9ydFRQRSkpIHByaW50ayhLRVJOX0RFQlVHICJUUEUgIik7CisJaWYgKEdldEJpdChXb3JkLGVlX1BvcnRCTkMpKSBwcmludGsoS0VSTl9ERUJVRyAiQk5DICIpOworCWlmIChHZXRCaXQoV29yZCxlZV9Qb3J0QVVJKSkgcHJpbnRrKEtFUk5fREVCVUcgIkFVSSAiKTsKKwlwcmludGsoS0VSTl9ERUJVRyAicG9ydChzKSBcbiIpOworCisJV29yZCA9IGxwLT53b3JkWzZdOworCXByaW50ayhLRVJOX0RFQlVHICJXb3JkNjpcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICIgU3RlcHBpbmc6ICVkXG4iLFdvcmQgJiBlZV9TdGVwTWFzayk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBCb2FyZElEOiAlZFxuIixXb3JkPj5lZV9Cb2FyZElEKTsKKworCVdvcmQgPSBscC0+d29yZFs3XTsKKwlwcmludGsoS0VSTl9ERUJVRyAiV29yZDc6XG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiIElOVCB0byBJUlE6XG4iKTsKKworCWZvciAoaT0wLCBqPTA7IGk8MTU7IGkrKykKKwkJaWYgKEdldEJpdChXb3JkLGkpKSBwcmludGsoS0VSTl9ERUJVRyAiIElOVCVkIC0+IElSUSAlZDsiLGorKyxpKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOworfQorCisvKiBmdW5jdGlvbiB0byByZWNhbGN1bGF0ZSB0aGUgbGltaXRzIG9mIGJ1ZmZlciBiYXNlZCBvbiByY3ZfcmFtICovCitzdGF0aWMgdm9pZCBlZXByb19yZWNhbGMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVlcHJvX2xvY2FsICoJbHA7CisKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisJbHAtPnhtdF9yYW0gPSBSQU1fU0laRSAtIGxwLT5yY3ZfcmFtOworCisJaWYgKGxwLT5lZXBybyA9PSBMQU41OTVGWF8xMElTQSkgeworCQlscC0+eG10X2xvd2VyX2xpbWl0ID0gWE1UX1NUQVJUXzEwOworCQlscC0+eG10X3VwcGVyX2xpbWl0ID0gKGxwLT54bXRfcmFtIC0gMik7CisJCWxwLT5yY3ZfbG93ZXJfbGltaXQgPSBscC0+eG10X3JhbTsKKwkJbHAtPnJjdl91cHBlcl9saW1pdCA9IChSQU1fU0laRSAtIDIpOworCX0KKwllbHNlIHsKKwkJbHAtPnJjdl9sb3dlcl9saW1pdCA9IFJDVl9TVEFSVF9QUk87CisJCWxwLT5yY3ZfdXBwZXJfbGltaXQgPSAobHAtPnJjdl9yYW0gLSAyKTsKKwkJbHAtPnhtdF9sb3dlcl9saW1pdCA9IGxwLT5yY3ZfcmFtOworCQlscC0+eG10X3VwcGVyX2xpbWl0ID0gKFJBTV9TSVpFIC0gMik7CisJfQorfQorCisvKiBwcmludHMgYm9vdC10aW1lIGluZm8gKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBlZXByb19wcmludF9pbmZvIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlZXByb19sb2NhbCAqCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQJCQlpOworCWNvbnN0IGNoYXIgKgkJaWZtYXBbXSA9IHsiQVVJIiwgIjEwQmFzZTIiLCAiMTBCYXNlVCJ9OworCisJaSA9IGluYihkZXYtPmJhc2VfYWRkciArIElEX1JFRyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBpZDogJSN4ICIsaSk7CisJcHJpbnRrKCIgaW86ICUjeCAiLCAodW5zaWduZWQpZGV2LT5iYXNlX2FkZHIpOworCisJc3dpdGNoIChscC0+ZWVwcm8pIHsKKwkJY2FzZSBMQU41OTVGWF8xMElTQToKKwkJCXByaW50aygiJXM6IEludGVsIEV0aGVyRXhwcmVzcyAxMCBJU0FcbiBhdCAlI3gsIiwKKwkJCQkJZGV2LT5uYW1lLCAodW5zaWduZWQpZGV2LT5iYXNlX2FkZHIpOworCQkJYnJlYWs7CisJCWNhc2UgTEFONTk1Rlg6CisJCQlwcmludGsoIiVzOiBJbnRlbCBFdGhlckV4cHJlc3MgUHJvLzEwKyBJU0FcbiBhdCAlI3gsIiwgCisJCQkJCWRldi0+bmFtZSwgKHVuc2lnbmVkKWRldi0+YmFzZV9hZGRyKTsKKwkJCWJyZWFrOworCQljYXNlIExBTjU5NVRYOgorCQkJcHJpbnRrKCIlczogSW50ZWwgRXRoZXJFeHByZXNzIFByby8xMCBJU0EgYXQgJSN4LCIsCisJCQkJCWRldi0+bmFtZSwgKHVuc2lnbmVkKWRldi0+YmFzZV9hZGRyKTsKKwkJCWJyZWFrOworCQljYXNlIExBTjU5NToKKwkJCXByaW50aygiJXM6IEludGVsIDgyNTk1LWJhc2VkIGxhbiBjYXJkIGF0ICUjeCwiLCAKKwkJCQkJZGV2LT5uYW1lLCAodW5zaWduZWQpZGV2LT5iYXNlX2FkZHIpOworCX0KKworCWZvciAoaT0wOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiVjJTAyeCIsIGkgPyAnOicgOiAnICcsIGRldi0+ZGV2X2FkZHJbaV0pOworCisJaWYgKG5ldF9kZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIsICVkSyBSQ1YgYnVmZmVyIiwKKwkJCQkoaW50KShscC0+cmN2X3JhbSkvMTAyNCk7CisKKwlpZiAoZGV2LT5pcnEgPiAyKQorCQlwcmludGsoIiwgSVJRICVkLCAlcy5cbiIsIGRldi0+aXJxLCBpZm1hcFtkZXYtPmlmX3BvcnRdKTsKKwllbHNlIAorCQlwcmludGsoIiwgJXMuXG4iLCBpZm1hcFtkZXYtPmlmX3BvcnRdKTsKKworCWlmIChuZXRfZGVidWcgPiAzKSB7CisJCWkgPSBscC0+d29yZFs1XTsKKwkJaWYgKGkgJiAweDIwMDApIC8qIGJpdCAxMyBvZiBFRVBST00gd29yZCA1ICovCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IENvbmN1cnJlbnQgUHJvY2Vzc2luZyBpcyAiCisJCQkJImVuYWJsZWQgYnV0IG5vdCB1c2VkIVxuIiwgZGV2LT5uYW1lKTsKKwl9CisKKwkvKiBDaGVjayB0aGUgc3RhdGlvbiBhZGRyZXNzIGZvciB0aGUgbWFudWZhY3R1cmVyJ3MgY29kZSAqLworCWlmIChuZXRfZGVidWc+MykKKwkJcHJpbnRFRVBST01JbmZvKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZWVwcm9fZXRodG9vbF9vcHM7CisKKy8qIFRoaXMgaXMgdGhlIHJlYWwgcHJvYmUgcm91dGluZS4gIExpbnV4IGhhcyBhIGhpc3Rvcnkgb2YgZnJpZW5kbHkgZGV2aWNlCisgICBwcm9iZXMgb24gdGhlIElTQSBidXMuICBBIGdvb2QgZGV2aWNlIHByb2JlIGF2b2lkcyBkb2luZyB3cml0ZXMsIGFuZAorICAgdmVyaWZpZXMgdGhhdCB0aGUgY29ycmVjdCBkZXZpY2UgZXhpc3RzIGFuZCBmdW5jdGlvbnMuICAqLworCitzdGF0aWMgaW50IF9faW5pdCBlZXByb19wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGF1dG9wcm9iZSkKK3sKKwl1bnNpZ25lZCBzaG9ydCBzdGF0aW9uX2FkZHJbM10sIGlkLCBjb3VudGVyOworCWludCBpOworCXN0cnVjdCBlZXByb19sb2NhbCAqbHA7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJLyogR3JhYiB0aGUgcmVnaW9uIHNvIHdlIGNhbiBmaW5kIGFub3RoZXIgYm9hcmQgaWYgYXV0b0lSUSBmYWlscy4gKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgRUVQUk9fSU9fRVhURU5ULCBEUlZfTkFNRSkpIHsgCisJCWlmICghYXV0b3Byb2JlKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRUVQUk86IGlvLXBvcnQgMHglMDR4IGluIHVzZSBcbiIsCisJCQkJaW9hZGRyKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBOb3csIHdlIGFyZSBnb2luZyB0byBjaGVjayBmb3IgdGhlIHNpZ25hdHVyZSBvZiB0aGUKKwkgICBJRF9SRUcgKHJlZ2lzdGVyIDIgb2YgYmFuayAwKSAqLworCisJaWQgPSBpbmIoaW9hZGRyICsgSURfUkVHKTsKKworCWlmICgoaWQgJiBJRF9SRUdfTUFTSykgIT0gSURfUkVHX1NJRykKKwkJZ290byBleGl0OworCisJLyogV2Ugc2VlbSB0byBoYXZlIHRoZSA4MjU5NSBzaWduYXR1cmUsIGxldCdzCisJICAgcGxheSB3aXRoIGl0cyBjb3VudGVyIChsYXN0IDIgYml0cyBvZgorCSAgIHJlZ2lzdGVyIDIgb2YgYmFuayAwKSB0byBiZSBzdXJlLiAqLworCisJY291bnRlciA9IGlkICYgUl9ST0JJTl9CSVRTOworCisJaWYgKChpbmIoaW9hZGRyICsgSURfUkVHKSAmIFJfUk9CSU5fQklUUykgIT0gKGNvdW50ZXIgKyAweDQwKSkKKwkJZ290byBleGl0OworCisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCW1lbXNldChscCwgMCwgc2l6ZW9mKHN0cnVjdCBlZXByb19sb2NhbCkpOworCWxwLT54bXRfYmFyID0gWE1UX0JBUl9QUk87CisJbHAtPnhtdF9sb3dlcl9saW1pdF9yZWcgPSBYTVRfTE9XRVJfTElNSVRfUkVHX1BSTzsKKwlscC0+eG10X3VwcGVyX2xpbWl0X3JlZyA9IFhNVF9VUFBFUl9MSU1JVF9SRUdfUFJPOworCWxwLT5lZXByb21fcmVnID0gRUVQUk9NX1JFR19QUk87CisJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKworCS8qIE5vdywgZ2V0IHRoZSBldGhlcm5ldCBoYXJkd2FyZSBhZGRyZXNzIGZyb20KKwkgICB0aGUgRUVQUk9NICovCisJc3RhdGlvbl9hZGRyWzBdID0gcmVhZF9lZXByb20oaW9hZGRyLCAyLCBkZXYpOworCisJLyogRklYTUUgLSBmaW5kIGFub3RoZXIgd2F5IHRvIGtub3cgdGhhdCB3ZSd2ZSBmb3VuZAorCSAqIGFuIEV0aGVyZXhwcmVzcyAxMAorCSAqLworCWlmIChzdGF0aW9uX2FkZHJbMF0gPT0gMHgwMDAwIHx8IHN0YXRpb25fYWRkclswXSA9PSAweGZmZmYpIHsKKwkJbHAtPmVlcHJvID0gTEFONTk1RlhfMTBJU0E7CisJCWxwLT5lZXByb21fcmVnID0gRUVQUk9NX1JFR18xMDsKKwkJbHAtPnhtdF9sb3dlcl9saW1pdF9yZWcgPSBYTVRfTE9XRVJfTElNSVRfUkVHXzEwOworCQlscC0+eG10X3VwcGVyX2xpbWl0X3JlZyA9IFhNVF9VUFBFUl9MSU1JVF9SRUdfMTA7CisJCWxwLT54bXRfYmFyID0gWE1UX0JBUl8xMDsKKwkJc3RhdGlvbl9hZGRyWzBdID0gcmVhZF9lZXByb20oaW9hZGRyLCAyLCBkZXYpOworCX0KKworCS8qIGdldCBhbGwgd29yZHMgYXQgb25jZS4gd2lsbCBiZSB1c2VkIGhlcmUgYW5kIGZvciBldGh0b29sICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlscC0+d29yZFtpXSA9IHJlYWRfZWVwcm9tKGlvYWRkciwgaSwgZGV2KTsKKwl9CisJc3RhdGlvbl9hZGRyWzFdID0gbHAtPndvcmRbM107CisJc3RhdGlvbl9hZGRyWzJdID0gbHAtPndvcmRbNF07CisKKwlpZiAoIWxwLT5lZXBybykgeworCQlpZiAobHAtPndvcmRbN10gPT0gZWVfRlhfSU5UMklSUSkKKwkJCWxwLT5lZXBybyA9IDI7CisJCWVsc2UgaWYgKHN0YXRpb25fYWRkclsyXSA9PSBTQV9BRERSMSkKKwkJCWxwLT5lZXBybyA9IDE7CisJfQorCisJLyogRmlsbCBpbiB0aGUgJ2RldicgZmllbGRzLiAqLworCWZvciAoaT0wOyBpIDwgNjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gKCh1bnNpZ25lZCBjaGFyICopIHN0YXRpb25fYWRkcilbNS1pXTsKKworCS8qIFJYIGJ1ZmZlciBtdXN0IGJlIG1vcmUgdGhhbiAzSyBhbmQgbGVzcyB0aGFuIDI5SyAqLworCWlmIChkZXYtPm1lbV9lbmQgPCAzMDcyIHx8IGRldi0+bWVtX2VuZCA+IDI5Njk2KQorCQlscC0+cmN2X3JhbSA9IFJDVl9ERUZBVUxUX1JBTTsKKworCS8qIGNhbGN1bGF0ZSB7eG10LHJjdn1fe2xvd2VyLHVwcGVyfV9saW1pdCAqLworCWVlcHJvX3JlY2FsYyhkZXYpOworCisJaWYgKEdldEJpdChscC0+d29yZFs1XSwgZWVfQk5DX1RQRSkpCisJCWRldi0+aWZfcG9ydCA9IEJOQzsKKwllbHNlCisJCWRldi0+aWZfcG9ydCA9IFRQRTsKKworIAlpZiAoZGV2LT5pcnEgPCAyICYmIGxwLT5lZXBybyAhPSAwKSB7CisgCQkvKiBNYXNrIG9mZiBJTlQgbnVtYmVyICovCisgCQlpbnQgY291bnQgPSBscC0+d29yZFsxXSAmIDc7CisgCQl1bnNpZ25lZCBpcnFNYXNrID0gbHAtPndvcmRbN107CisgCisgCQl3aGlsZSAoY291bnQtLSkKKyAJCQlpcnFNYXNrICY9IGlycU1hc2sgLSAxOworIAorIAkJY291bnQgPSBmZnMoaXJxTWFzayk7CisgCisgCQlpZiAoY291bnQpCisgCQkJZGV2LT5pcnEgPSBjb3VudCAtIDE7CisgCisgCQlpZiAoZGV2LT5pcnEgPCAyKSB7CisgCQkJcHJpbnRrKEtFUk5fRVJSICIgRHVoISBpbGxlZ2FsIGludGVycnVwdCB2ZWN0b3Igc3RvcmVkIGluIEVFUFJPTS5cbiIpOworIAkJCWdvdG8gZXhpdDsKKyAJCX0gZWxzZSBpZiAoZGV2LT5pcnEgPT0gMikgeworIAkJCWRldi0+aXJxID0gOTsKKyAJCX0KKyAJfQorIAorIAlkZXYtPm9wZW4gICAgICAgICAgICAgICA9IGVlcHJvX29wZW47CisgCWRldi0+c3RvcCAgICAgICAgICAgICAgID0gZWVwcm9fY2xvc2U7CisgCWRldi0+aGFyZF9zdGFydF94bWl0ICAgID0gZWVwcm9fc2VuZF9wYWNrZXQ7CisgCWRldi0+Z2V0X3N0YXRzICAgICAgICAgID0gZWVwcm9fZ2V0X3N0YXRzOworIAlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7CisgCWRldi0+dHhfdGltZW91dAkJPSBlZXByb190eF90aW1lb3V0OworIAlkZXYtPndhdGNoZG9nX3RpbWVvCT0gVFhfVElNRU9VVDsKKwlkZXYtPmV0aHRvb2xfb3BzCT0gJmVlcHJvX2V0aHRvb2xfb3BzOworIAorCS8qIHByaW50IGJvb3QgdGltZSBpbmZvICovCisJZWVwcm9fcHJpbnRfaW5mbyhkZXYpOworCisJLyogcmVzZXQgODI1OTUgKi8KKwllZXByb19yZXNldChpb2FkZHIpOworCXJldHVybiAwOworZXhpdDoKKyAJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVFUFJPX0lPX0VYVEVOVCk7CisgCXJldHVybiAtRU5PREVWOworfQorCisvKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiAgVGhpcyBpcyBjYWxsZWQgKGluIHRoZSBjdXJyZW50IGtlcm5lbCkKKyAgIHNvbWV0aW1lIGFmdGVyIGJvb3Rpbmcgd2hlbiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KKworICAgVGhpcyByb3V0aW5lIHNob3VsZCBzZXQgZXZlcnl0aGluZyB1cCBhbmV3IGF0IGVhY2ggb3BlbiwgZXZlbgorICAgcmVnaXN0ZXJzIHRoYXQgInNob3VsZCIgb25seSBuZWVkIHRvIGJlIHNldCBvbmNlIGF0IGJvb3QsIHNvIHRoYXQKKyAgIHRoZXJlIGlzIG5vbi1yZWJvb3Qgd2F5IHRvIHJlY292ZXIgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuCisgICAqLworCitzdGF0aWMgY2hhciBpcnFybWFwW10gPSB7LTEsLTEsMCwxLC0xLDIsLTEsLTEsLTEsMCwzLDQsLTEsLTEsLTEsLTF9Oworc3RhdGljIGNoYXIgaXJxcm1hcDJbXSA9IHstMSwtMSw0LDAsMSwyLC0xLDMsLTEsNCw1LDYsNywtMSwtMSwtMX07CitzdGF0aWMgaW50CWVlcHJvX2dyYWJfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlycWxpc3RbXSA9IHsgMywgNCwgNSwgNywgOSwgMTAsIDExLCAxMiwgMCB9OworCWludCAqaXJxcCA9IGlycWxpc3QsIHRlbXBfcmVnLCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWVlcHJvX3N3MmJhbmsxKGlvYWRkcik7IC8qIGJlIENBUkVGVUwsIEJBTksgMSBub3cgKi8KKworCS8qIEVuYWJsZSB0aGUgaW50ZXJydXB0IGxpbmUuICovCisJZWVwcm9fZW5faW50bGluZShpb2FkZHIpOworCisJLyogYmUgQ0FSRUZVTCwgQkFOSyAwIG5vdyAqLworCWVlcHJvX3N3MmJhbmswKGlvYWRkcik7CisKKwkvKiBjbGVhciBhbGwgaW50ZXJydXB0cyAqLworCWVlcHJvX2NsZWFyX2ludChpb2FkZHIpOworCisJLyogTGV0IEVYRUMgZXZlbnQgdG8gaW50ZXJydXB0ICovCisJZWVwcm9fZW5faW50ZXhlYyhpb2FkZHIpOworCisJZG8geworCQllZXByb19zdzJiYW5rMShpb2FkZHIpOyAvKiBiZSBDQVJFRlVMLCBCQU5LIDEgbm93ICovCisKKwkJdGVtcF9yZWcgPSBpbmIoaW9hZGRyICsgSU5UX05PX1JFRyk7CisJCW91dGIoKHRlbXBfcmVnICYgMHhmOCkgfCBpcnFybWFwWyppcnFwXSwgaW9hZGRyICsgSU5UX05PX1JFRyk7CisKKwkJZWVwcm9fc3cyYmFuazAoaW9hZGRyKTsgLyogU3dpdGNoIGJhY2sgdG8gQmFuayAwICovCisKKwkJaWYgKHJlcXVlc3RfaXJxICgqaXJxcCwgTlVMTCwgU0FfU0hJUlEsICJib2d1cyIsIGRldikgIT0gRUJVU1kpIHsKKwkJCXVuc2lnbmVkIGxvbmcgaXJxX21hc2s7CisJCQkvKiBUd2lua2xlIHRoZSBpbnRlcnJ1cHQsIGFuZCBjaGVjayBpZiBpdCdzIHNlZW4gKi8KKwkJCWlycV9tYXNrID0gcHJvYmVfaXJxX29uKCk7CisKKwkJCWVlcHJvX2RpYWcoaW9hZGRyKTsgLyogUkVTRVQgdGhlIDgyNTk1ICovCisJCQltZGVsYXkoMjApOworCisJCQlpZiAoKmlycXAgPT0gcHJvYmVfaXJxX29mZihpcnFfbWFzaykpICAvKiBJdCdzIGEgZ29vZCBJUlEgbGluZSAqLworCQkJCWJyZWFrOworCisJCQkvKiBjbGVhciBhbGwgaW50ZXJydXB0cyAqLworCQkJZWVwcm9fY2xlYXJfaW50KGlvYWRkcik7CisJCX0KKwl9IHdoaWxlICgqKytpcnFwKTsKKworCWVlcHJvX3N3MmJhbmsxKGlvYWRkcik7IC8qIFN3aXRjaCBiYWNrIHRvIEJhbmsgMSAqLworCisJLyogRGlzYWJsZSB0aGUgcGh5c2ljYWwgaW50ZXJydXB0IGxpbmUuICovCisJZWVwcm9fZGlzX2ludGxpbmUoaW9hZGRyKTsKKworCWVlcHJvX3N3MmJhbmswKGlvYWRkcik7IC8qIFN3aXRjaCBiYWNrIHRvIEJhbmsgMCAqLworCisJLyogTWFzayBhbGwgdGhlIGludGVycnVwdHMuICovCisJZWVwcm9fZGlzX2ludChpb2FkZHIpOworCisJLyogY2xlYXIgYWxsIGludGVycnVwdHMgKi8KKwllZXByb19jbGVhcl9pbnQoaW9hZGRyKTsKKworCXJldHVybiBkZXYtPmlycTsKK30KKworc3RhdGljIGludCBlZXByb19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgc2hvcnQgdGVtcF9yZWcsIG9sZDgsIG9sZDk7CisJaW50IGlycU1hc2s7CisJaW50IGksIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBlZXByb19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKG5ldF9kZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZW50ZXJpbmcgZWVwcm9fb3BlbiByb3V0aW5lLlxuIiwgZGV2LT5uYW1lKTsKKworCWlycU1hc2sgPSBscC0+d29yZFs3XTsKKworCWlmIChscC0+ZWVwcm8gPT0gTEFONTk1RlhfMTBJU0EpIHsKKwkJaWYgKG5ldF9kZWJ1ZyA+IDMpIHByaW50ayhLRVJOX0RFQlVHICJwLT5lZXBybyA9IDM7XG4iKTsKKwl9CisJZWxzZSBpZiAoaXJxTWFzayA9PSBlZV9GWF9JTlQySVJRKSAvKiBJTlQgdG8gSVJRIE1hc2sgKi8KKwkJeworCQkJbHAtPmVlcHJvID0gMjsgLyogWWVzLCBhbiBJbnRlbCBFdGhlckV4cHJlc3MgUHJvLzEwKyAqLworCQkJaWYgKG5ldF9kZWJ1ZyA+IDMpIHByaW50ayhLRVJOX0RFQlVHICJwLT5lZXBybyA9IDI7XG4iKTsKKwkJfQorCisJZWxzZSBpZiAoKGRldi0+ZGV2X2FkZHJbMF0gPT0gU0FfQUREUjAgJiYKKwkJCWRldi0+ZGV2X2FkZHJbMV0gPT0gU0FfQUREUjEgJiYKKwkJCWRldi0+ZGV2X2FkZHJbMl0gPT0gU0FfQUREUjIpKQorCQl7CisJCQlscC0+ZWVwcm8gPSAxOworCQkJaWYgKG5ldF9kZWJ1ZyA+IDMpIHByaW50ayhLRVJOX0RFQlVHICJwLT5lZXBybyA9IDE7XG4iKTsKKwkJfSAgLyogWWVzLCBhbiBJbnRlbCBFdGhlckV4cHJlc3MgUHJvLzEwICovCisKKwllbHNlIGxwLT5lZXBybyA9IDA7IC8qIE5vLCBpdCBpcyBhIGdlbmVyaWMgODI1ODUgbGFuIGNhcmQgKi8KKworCS8qIEdldCB0aGUgaW50ZXJydXB0IHZlY3RvciBmb3IgdGhlIDgyNTk1ICovCisJaWYgKGRldi0+aXJxIDwgMiAmJiBlZXByb19ncmFiX2lycShkZXYpID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGdldCBJUlEgJWQuXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxICwgJmVlcHJvX2ludGVycnVwdCwgMCwgZGV2LT5uYW1lLCBkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkLlxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworI2lmZGVmIGlycTJkZXZfbWFwCisJaWYgICgoKGlycTJkZXZfbWFwW2Rldi0+aXJxXSAhPSAwKQorCQl8fCAoaXJxMmRldl9tYXBbZGV2LT5pcnFdID0gZGV2KSA9PSAwKSAmJgorCQkoaXJxMmRldl9tYXBbZGV2LT5pcnFdIT1kZXYpKSB7CisJCS8qIHByaW50aygiJXM6IElSUSBtYXAgd3JvbmdcbiIsIGRldi0+bmFtZSk7ICovCisJICAgICAgICBmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorI2VuZGlmCisKKwkvKiBJbml0aWFsaXplIHRoZSA4MjU5NS4gKi8KKworCWVlcHJvX3N3MmJhbmsyKGlvYWRkcik7IC8qIGJlIENBUkVGVUwsIEJBTksgMiBub3cgKi8KKwl0ZW1wX3JlZyA9IGluYihpb2FkZHIgKyBscC0+ZWVwcm9tX3JlZyk7CisKKwlscC0+c3RlcHBpbmcgPSB0ZW1wX3JlZyA+PiA1OwkvKiBHZXQgdGhlIHN0ZXBwaW5nIG51bWJlciBvZiB0aGUgNTk1ICovCisKKwlpZiAobmV0X2RlYnVnID4gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlRoZSBzdGVwcGluZyBvZiB0aGUgODI1OTUgaXMgJWRcbiIsIGxwLT5zdGVwcGluZyk7CisKKwlpZiAodGVtcF9yZWcgJiAweDEwKSAvKiBDaGVjayB0aGUgVHVybk9mZiBFbmFibGUgYml0ICovCisJCW91dGIodGVtcF9yZWcgJiAweGVmLCBpb2FkZHIgKyBscC0+ZWVwcm9tX3JlZyk7CisJZm9yIChpPTA7IGkgPCA2OyBpKyspCisJCW91dGIoZGV2LT5kZXZfYWRkcltpXSAsIGlvYWRkciArIElfQUREX1JFRzAgKyBpKTsKKworCXRlbXBfcmVnID0gaW5iKGlvYWRkciArIFJFRzEpOyAgICAvKiBTZXR1cCBUcmFuc21pdCBDaGFpbmluZyAqLworCW91dGIodGVtcF9yZWcgfCBYTVRfQ2hhaW5fSW50IHwgWE1UX0NoYWluX0VyclN0b3AgLyogYW5kIGRpc2NhcmQgYmFkIFJDViBmcmFtZXMgKi8KKwkJfCBSQ1ZfRGlzY2FyZF9CYWRGcmFtZSwgaW9hZGRyICsgUkVHMSk7CisKKwl0ZW1wX3JlZyA9IGluYihpb2FkZHIgKyBSRUcyKTsgLyogTWF0Y2ggYnJvYWRjYXN0ICovCisJb3V0Yih0ZW1wX3JlZyB8IDB4MTQsIGlvYWRkciArIFJFRzIpOworCisJdGVtcF9yZWcgPSBpbmIoaW9hZGRyICsgUkVHMyk7CisJb3V0Yih0ZW1wX3JlZyAmIDB4M2YsIGlvYWRkciArIFJFRzMpOyAvKiBjbGVhciB0ZXN0IG1vZGUgKi8KKworCS8qIFNldCB0aGUgcmVjZWl2aW5nIG1vZGUgKi8KKwllZXByb19zdzJiYW5rMShpb2FkZHIpOyAvKiBiZSBDQVJFRlVMLCBCQU5LIDEgbm93ICovCisKKwkvKiBTZXQgdGhlIGludGVycnVwdCB2ZWN0b3IgKi8KKwl0ZW1wX3JlZyA9IGluYihpb2FkZHIgKyBJTlRfTk9fUkVHKTsKKwlpZiAobHAtPmVlcHJvID09IExBTjU5NUZYIHx8IGxwLT5lZXBybyA9PSBMQU41OTVGWF8xMElTQSkKKwkJb3V0YigodGVtcF9yZWcgJiAweGY4KSB8IGlycXJtYXAyW2Rldi0+aXJxXSwgaW9hZGRyICsgSU5UX05PX1JFRyk7CisJZWxzZSBvdXRiKCh0ZW1wX3JlZyAmIDB4ZjgpIHwgaXJxcm1hcFtkZXYtPmlycV0sIGlvYWRkciArIElOVF9OT19SRUcpOworCisKKwl0ZW1wX3JlZyA9IGluYihpb2FkZHIgKyBJTlRfTk9fUkVHKTsKKwlpZiAobHAtPmVlcHJvID09IExBTjU5NUZYIHx8IGxwLT5lZXBybyA9PSBMQU41OTVGWF8xMElTQSkKKwkJb3V0YigodGVtcF9yZWcgJiAweGYwKSB8IGlycXJtYXAyW2Rldi0+aXJxXSB8IDB4MDgsaW9hZGRyK0lOVF9OT19SRUcpOworCWVsc2Ugb3V0YigodGVtcF9yZWcgJiAweGY4KSB8IGlycXJtYXBbZGV2LT5pcnFdLCBpb2FkZHIgKyBJTlRfTk9fUkVHKTsKKworCWlmIChuZXRfZGVidWcgPiAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiZWVwcm9fb3BlbjogY29udGVudCBvZiBJTlQgUmVnIGlzICV4XG4iLCB0ZW1wX3JlZyk7CisKKworCS8qIEluaXRpYWxpemUgdGhlIFJDViBhbmQgWE1UIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMgKi8KKwlvdXRiKGxwLT5yY3ZfbG93ZXJfbGltaXQgPj4gOCwgaW9hZGRyICsgUkNWX0xPV0VSX0xJTUlUX1JFRyk7IAorCW91dGIobHAtPnJjdl91cHBlcl9saW1pdCA+PiA4LCBpb2FkZHIgKyBSQ1ZfVVBQRVJfTElNSVRfUkVHKTsgCisJb3V0YihscC0+eG10X2xvd2VyX2xpbWl0ID4+IDgsIGlvYWRkciArIGxwLT54bXRfbG93ZXJfbGltaXRfcmVnKTsKKwlvdXRiKGxwLT54bXRfdXBwZXJfbGltaXQgPj4gOCwgaW9hZGRyICsgbHAtPnhtdF91cHBlcl9saW1pdF9yZWcpOworCisJLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHQgbGluZS4gKi8KKwllZXByb19lbl9pbnRsaW5lKGlvYWRkcik7CisKKwkvKiBTd2l0Y2ggYmFjayB0byBCYW5rIDAgKi8KKwllZXByb19zdzJiYW5rMChpb2FkZHIpOworCisJLyogTGV0IFJYIGFuZCBUWCBldmVudHMgdG8gaW50ZXJydXB0ICovCisJZWVwcm9fZW5faW50KGlvYWRkcik7CisKKwkvKiBjbGVhciBhbGwgaW50ZXJydXB0cyAqLworCWVlcHJvX2NsZWFyX2ludChpb2FkZHIpOworCisJLyogSW5pdGlhbGl6ZSBSQ1YgKi8KKwlvdXR3KGxwLT5yY3ZfbG93ZXJfbGltaXQsIGlvYWRkciArIFJDVl9CQVIpOyAKKwlscC0+cnhfc3RhcnQgPSBscC0+cmN2X2xvd2VyX2xpbWl0OworCW91dHcobHAtPnJjdl91cHBlcl9saW1pdCB8IDB4ZmUsIGlvYWRkciArIFJDVl9TVE9QKTsgCisKKwkvKiBJbml0aWFsaXplIFhNVCAqLworCW91dHcobHAtPnhtdF9sb3dlcl9saW1pdCwgaW9hZGRyICsgbHAtPnhtdF9iYXIpOyAKKwlscC0+dHhfc3RhcnQgPSBscC0+dHhfZW5kID0gbHAtPnhtdF9sb3dlcl9saW1pdDsKKwlscC0+dHhfbGFzdCA9IDA7CisKKwkvKiBDaGVjayBmb3IgdGhlIGk4MjU5NVRYIGFuZCBpODI1OTVGWCAqLworCW9sZDggPSBpbmIoaW9hZGRyICsgOCk7CisJb3V0Yih+b2xkOCwgaW9hZGRyICsgOCk7CisKKwlpZiAoKHRlbXBfcmVnID0gaW5iKGlvYWRkciArIDgpKSA9PSBvbGQ4KSB7CisJCWlmIChuZXRfZGVidWcgPiAzKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImk4MjU5NSBkZXRlY3RlZCFcbiIpOworCQlscC0+dmVyc2lvbiA9IExBTjU5NTsKKwl9CisJZWxzZSB7CisJCWxwLT52ZXJzaW9uID0gTEFONTk1VFg7CisJCW91dGIob2xkOCwgaW9hZGRyICsgOCk7CisJCW9sZDkgPSBpbmIoaW9hZGRyICsgOSk7CisKKwkJaWYgKGlycU1hc2s9PWVlX0ZYX0lOVDJJUlEpIHsKKwkJCWlmIChuZXRfZGVidWcgPiAzKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIklycU1hc2s6ICUjeFxuIixpcnFNYXNrKTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiaTgyNTk1RlggZGV0ZWN0ZWQhXG4iKTsKKwkJCX0KKwkJCWxwLT52ZXJzaW9uID0gTEFONTk1Rlg7CisJCQlvdXRiKG9sZDksIGlvYWRkciArIDkpOworCQkJaWYgKGRldi0+aWZfcG9ydCAhPSBUUEUpIHsJLyogSG9wZWZ1bGx5LCB0aGlzIHdpbGwgZml4IHRoZQorCQkJCQkJCXByb2JsZW0gb2YgdXNpbmcgUGVudGl1bXMgYW5kCisJCQkJCQkJcHJvLzEwIHcvIEJOQy4gKi8KKwkJCQllZXByb19zdzJiYW5rMihpb2FkZHIpOyAvKiBiZSBDQVJFRlVMLCBCQU5LIDIgbm93ICovCisJCQkJdGVtcF9yZWcgPSBpbmIoaW9hZGRyICsgUkVHMTMpOworCQkJCS8qIGRpc2FibGUgdGhlIGZ1bGwgZHVwbGV4IG1vZGUgc2luY2UgaXQgaXMgbm90CisJCQkJYXBwbGljYWJsZSB3aXRoIHRoZSAxMEJhc2UyIGNhYmxlLiAqLworCQkJCW91dGIodGVtcF9yZWcgJiB+KEZEWCB8IEFfTl9FTkFCTEUpLCBSRUcxMyk7CisJCQkJZWVwcm9fc3cyYmFuazAoaW9hZGRyKTsgLyogYmUgQ0FSRUZVTCwgQkFOSyAwIG5vdyAqLworCQkJfQorCQl9CisJCWVsc2UgaWYgKG5ldF9kZWJ1ZyA+IDMpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJ0ZW1wX3JlZzogJSN4ICB+b2xkOTogJSN4XG4iLHRlbXBfcmVnLCgofm9sZDkpJjB4ZmYpKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJpODI1OTVUWCBkZXRlY3RlZCFcbiIpOworCQl9CisJfQorCisJZWVwcm9fc2VsX3Jlc2V0KGlvYWRkcik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJaWYgKG5ldF9kZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBlZXByb19vcGVuIHJvdXRpbmUuXG4iLCBkZXYtPm5hbWUpOworCisJLyogZW5hYmxpbmcgcnggKi8KKwllZXByb19lbl9yeChpb2FkZHIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVlcHJvX3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVlcHJvX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJLyogaWYgKG5ldF9kZWJ1ZyA+IDEpICovCisJcHJpbnRrIChLRVJOX0VSUiAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgJXM/XG4iLCBkZXYtPm5hbWUsCisJCSJuZXR3b3JrIGNhYmxlIHByb2JsZW0iKTsKKwkvKiBUaGlzIGlzIG5vdCBhIGR1cGxpY2F0ZS4gT25lIG1lc3NhZ2UgZm9yIHRoZSBjb25zb2xlLAorCSAgIG9uZSBmb3IgdGhlIHRoZSBsb2cgZmlsZSAgKi8KKwlwcmludGsgKEtFUk5fREVCVUcgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsICVzP1xuIiwgZGV2LT5uYW1lLAorCQkibmV0d29yayBjYWJsZSBwcm9ibGVtIik7CisJZWVwcm9fY29tcGxldGVfc2VscmVzZXQoaW9hZGRyKTsKK30KKworCitzdGF0aWMgaW50IGVlcHJvX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVlcHJvX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc2hvcnQgbGVuZ3RoID0gc2tiLT5sZW47CisKKwlpZiAobmV0X2RlYnVnID4gNSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgICIlczogZW50ZXJpbmcgZWVwcm9fc2VuZF9wYWNrZXQgcm91dGluZS5cbiIsIGRldi0+bmFtZSk7CisKKwlpZiAobGVuZ3RoIDwgRVRIX1pMRU4pIHsKKwkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJbGVuZ3RoID0gRVRIX1pMRU47CisJfQorCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisKKwllZXByb19kaXNfaW50KGlvYWRkcik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwl7CisJCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKKworCQlpZiAoaGFyZHdhcmVfc2VuZF9wYWNrZXQoZGV2LCBidWYsIGxlbmd0aCkpCisJCQkvKiB3ZSB3b24ndCB3YWtlIHF1ZXVlIGhlcmUgYmVjYXVzZSB3ZSdyZSBvdXQgb2Ygc3BhY2UgKi8KKwkJCWxwLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCWVsc2UgeworCQlscC0+c3RhdHMudHhfYnl0ZXMrPXNrYi0+bGVuOworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfQorCisJfQorCisJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKworCS8qIFlvdSBtaWdodCBuZWVkIHRvIGNsZWFuIHVwIGFuZCByZWNvcmQgVHggc3RhdGlzdGljcyBoZXJlLiAqLworCS8qIGxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOyAqLworCisJaWYgKG5ldF9kZWJ1ZyA+IDUpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBlZXByb19zZW5kX3BhY2tldCByb3V0aW5lLlxuIiwgZGV2LT5uYW1lKTsKKworCWVlcHJvX2VuX2ludChpb2FkZHIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKglUaGUgdHlwaWNhbCB3b3JrbG9hZCBvZiB0aGUgZHJpdmVyOgorCUhhbmRsZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaW50ZXJydXB0cy4gKi8KKworc3RhdGljIGlycXJldHVybl90CitlZXByb19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9ICAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisJICAgICAgICAgICAgICAgICAgICAgIC8qIChzdHJ1Y3QgbmV0X2RldmljZSAqKShpcnEyZGV2X21hcFtpcnFdKTsqLworCXN0cnVjdCBlZXByb19sb2NhbCAqbHA7CisJaW50IGlvYWRkciwgc3RhdHVzLCBib2d1c2NvdW50ID0gMjA7CisJaW50IGhhbmRsZWQgPSAwOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrIChLRVJOX0VSUiAiZWVwcm9faW50ZXJydXB0KCk6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXFxuIiwgaXJxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSVJRX05PTkU7CisgICAgICAgIH0KKworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICBzcGluX2xvY2soJmxwLT5sb2NrKTsKKworCWlmIChuZXRfZGVidWcgPiA1KQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVudGVyaW5nIGVlcHJvX2ludGVycnVwdCByb3V0aW5lLlxuIiwgZGV2LT5uYW1lKTsKKworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJd2hpbGUgKCgoc3RhdHVzID0gaW5iKGlvYWRkciArIFNUQVRVU19SRUcpKSAmIChSWF9JTlR8VFhfSU5UKSkgJiYgKGJvZ3VzY291bnQtLSkpCisJeworCQloYW5kbGVkID0gMTsKKwkJaWYgKHN0YXR1cyAmIFJYX0lOVCkgeworCQkJaWYgKG5ldF9kZWJ1ZyA+IDQpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBwYWNrZXQgcmVjZWl2ZWQgaW50ZXJydXB0LlxuIiwgZGV2LT5uYW1lKTsKKworCQkJZWVwcm9fZGlzX2ludChpb2FkZHIpOworCisJCQkvKiBHZXQgdGhlIHJlY2VpdmVkIHBhY2tldHMgKi8KKwkJCWVlcHJvX2Fja19yeChpb2FkZHIpOworCQkJZWVwcm9fcngoZGV2KTsKKworCQkJZWVwcm9fZW5faW50KGlvYWRkcik7CisJCX0KKwkJaWYgKHN0YXR1cyAmIFRYX0lOVCkgeworCQkJaWYgKG5ldF9kZWJ1ZyA+IDQpCisgCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogcGFja2V0IHRyYW5zbWl0IGludGVycnVwdC5cbiIsIGRldi0+bmFtZSk7CisKKworCQkJZWVwcm9fZGlzX2ludChpb2FkZHIpOworCisJCQkvKiBQcm9jZXNzIHRoZSBzdGF0dXMgb2YgdHJhbnNtaXR0ZWQgcGFja2V0cyAqLworCQkJZWVwcm9fYWNrX3R4KGlvYWRkcik7CisJCQllZXByb190cmFuc21pdF9pbnRlcnJ1cHQoZGV2KTsKKworCQkJZWVwcm9fZW5faW50KGlvYWRkcik7CisJCX0KKwl9CisKKwlpZiAobmV0X2RlYnVnID4gNSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleGl0aW5nIGVlcHJvX2ludGVycnVwdCByb3V0aW5lLlxuIiwgZGV2LT5uYW1lKTsKKworCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKK3N0YXRpYyBpbnQgZWVwcm9fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWVwcm9fbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc2hvcnQgdGVtcF9yZWc7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwllZXByb19zdzJiYW5rMShpb2FkZHIpOyAvKiBTd2l0Y2ggYmFjayB0byBCYW5rIDEgKi8KKworCS8qIERpc2FibGUgdGhlIHBoeXNpY2FsIGludGVycnVwdCBsaW5lLiAqLworCXRlbXBfcmVnID0gaW5iKGlvYWRkciArIFJFRzEpOworCW91dGIodGVtcF9yZWcgJiAweDdmLCBpb2FkZHIgKyBSRUcxKTsKKworCWVlcHJvX3N3MmJhbmswKGlvYWRkcik7IC8qIFN3aXRjaCBiYWNrIHRvIEJhbmsgMCAqLworCisJLyogRmx1c2ggdGhlIFR4IGFuZCBkaXNhYmxlIFJ4LiAqLworCW91dGIoU1RPUF9SQ1ZfQ01ELCBpb2FkZHIpOworCWxwLT50eF9zdGFydCA9IGxwLT50eF9lbmQgPSBscC0+eG10X2xvd2VyX2xpbWl0OworCWxwLT50eF9sYXN0ID0gMDsKKworCS8qIE1hc2sgYWxsIHRoZSBpbnRlcnJ1cHRzLiAqLworCWVlcHJvX2Rpc19pbnQoaW9hZGRyKTsKKworCS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHRzICovCisJZWVwcm9fY2xlYXJfaW50KGlvYWRkcik7CisKKwkvKiBSZXNldCB0aGUgODI1OTUgKi8KKwllZXByb19yZXNldChpb2FkZHIpOworCisJLyogcmVsZWFzZSB0aGUgaW50ZXJydXB0ICovCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKyNpZmRlZiBpcnEyZGV2X21hcAorCWlycTJkZXZfbWFwW2Rldi0+aXJxXSA9IDA7CisjZW5kaWYKKworCS8qIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyBoZXJlLiBXaGF0IHN0YXRpc3RpY3M/ICovCisKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCVRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IKKyAgIGNsb3NlZC4gKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCitlZXByb19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWVwcm9fbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiAmbHAtPnN0YXRzOworfQorCisvKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAqLworc3RhdGljIHZvaWQKK3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlZXByb19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIHNob3J0IG1vZGU7CisJc3RydWN0IGRldl9tY19saXN0ICpkbWk9ZGV2LT5tY19saXN0OworCisJaWYgKGRldi0+ZmxhZ3MmKElGRl9BTExNVUxUSXxJRkZfUFJPTUlTQykgfHwgZGV2LT5tY19jb3VudCA+IDYzKQorCXsKKwkJLyoKKwkJICoJV2UgbXVzdCBtYWtlIHRoZSBrZXJuZWwgcmVhbGlzZSB3ZSBoYWQgdG8gbW92ZQorCQkgKglpbnRvIHByb21pc2MgbW9kZSBvciB3ZSBzdGFydCBhbGwgb3V0IHdhciBvbgorCQkgKgl0aGUgY2FibGUuIElmIGl0IHdhcyBhIHByb21pc2MgcmVxdWVzdCB0aGUKKwkJICoJZmxhZyBpcyBhbHJlYWR5IHNldC4gSWYgbm90IHdlIGFzc2VydCBpdC4KKwkJICovCisJCWRldi0+ZmxhZ3N8PUlGRl9QUk9NSVNDOworCisJCWVlcHJvX3N3MmJhbmsyKGlvYWRkcik7IC8qIGJlIENBUkVGVUwsIEJBTksgMiBub3cgKi8KKwkJbW9kZSA9IGluYihpb2FkZHIgKyBSRUcyKTsKKwkJb3V0Yihtb2RlIHwgUFJNU0NfTW9kZSwgaW9hZGRyICsgUkVHMik7CisJCW1vZGUgPSBpbmIoaW9hZGRyICsgUkVHMyk7CisJCW91dGIobW9kZSwgaW9hZGRyICsgUkVHMyk7IC8qIHdyaXRpbmcgcmVnLiAzIHRvIGNvbXBsZXRlIHRoZSB1cGRhdGUgKi8KKwkJZWVwcm9fc3cyYmFuazAoaW9hZGRyKTsgLyogUmV0dXJuIHRvIEJBTksgMCBub3cgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CisJfQorCisJZWxzZSBpZiAoZGV2LT5tY19jb3VudD09MCApCisJeworCQllZXByb19zdzJiYW5rMihpb2FkZHIpOyAvKiBiZSBDQVJFRlVMLCBCQU5LIDIgbm93ICovCisJCW1vZGUgPSBpbmIoaW9hZGRyICsgUkVHMik7CisJCW91dGIobW9kZSAmIDB4ZDYsIGlvYWRkciArIFJFRzIpOyAvKiBUdXJuIG9mZiBNdWx0aS1JQSBhbmQgUFJNU0NfTW9kZSBiaXRzICovCisJCW1vZGUgPSBpbmIoaW9hZGRyICsgUkVHMyk7CisJCW91dGIobW9kZSwgaW9hZGRyICsgUkVHMyk7IC8qIHdyaXRpbmcgcmVnLiAzIHRvIGNvbXBsZXRlIHRoZSB1cGRhdGUgKi8KKwkJZWVwcm9fc3cyYmFuazAoaW9hZGRyKTsgLyogUmV0dXJuIHRvIEJBTksgMCBub3cgKi8KKwl9CisKKwllbHNlCisJeworCQl1bnNpZ25lZCBzaG9ydCBzdGF0dXMsICplYWRkcnM7CisJCWludCBpLCBib2d1c2NvdW50ID0gMDsKKworCQkvKiBEaXNhYmxlIFJYIGFuZCBUWCBpbnRlcnJ1cHRzLiAgTmVjZXNzYXJ5IHRvIGF2b2lkCisJCSAgIGNvcnJ1cHRpb24gb2YgdGhlIEhPU1RfQUREUkVTU19SRUcgYnkgaW50ZXJydXB0CisJCSAgIHNlcnZpY2Ugcm91dGluZXMuICovCisJCWVlcHJvX2Rpc19pbnQoaW9hZGRyKTsKKworCQllZXByb19zdzJiYW5rMihpb2FkZHIpOyAvKiBiZSBDQVJFRlVMLCBCQU5LIDIgbm93ICovCisJCW1vZGUgPSBpbmIoaW9hZGRyICsgUkVHMik7CisJCW91dGIobW9kZSB8IE11bHRpX0lBLCBpb2FkZHIgKyBSRUcyKTsKKwkJbW9kZSA9IGluYihpb2FkZHIgKyBSRUczKTsKKwkJb3V0Yihtb2RlLCBpb2FkZHIgKyBSRUczKTsgLyogd3JpdGluZyByZWcuIDMgdG8gY29tcGxldGUgdGhlIHVwZGF0ZSAqLworCQllZXByb19zdzJiYW5rMChpb2FkZHIpOyAvKiBSZXR1cm4gdG8gQkFOSyAwIG5vdyAqLworCQlvdXR3KGxwLT50eF9lbmQsIGlvYWRkciArIEhPU1RfQUREUkVTU19SRUcpOworCQlvdXR3KE1DX1NFVFVQLCBpb2FkZHIgKyBJT19QT1JUKTsKKwkJb3V0dygwLCBpb2FkZHIgKyBJT19QT1JUKTsKKwkJb3V0dygwLCBpb2FkZHIgKyBJT19QT1JUKTsKKwkJb3V0dyg2KihkZXYtPm1jX2NvdW50ICsgMSksIGlvYWRkciArIElPX1BPUlQpOworCisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyspCisJCXsKKwkJCWVhZGRycz0odW5zaWduZWQgc2hvcnQgKilkbWktPmRtaV9hZGRyOworCQkJZG1pPWRtaS0+bmV4dDsKKwkJCW91dHcoKmVhZGRycysrLCBpb2FkZHIgKyBJT19QT1JUKTsKKwkJCW91dHcoKmVhZGRycysrLCBpb2FkZHIgKyBJT19QT1JUKTsKKwkJCW91dHcoKmVhZGRycysrLCBpb2FkZHIgKyBJT19QT1JUKTsKKwkJfQorCisJCWVhZGRycyA9ICh1bnNpZ25lZCBzaG9ydCAqKSBkZXYtPmRldl9hZGRyOworCQlvdXR3KGVhZGRyc1swXSwgaW9hZGRyICsgSU9fUE9SVCk7CisJCW91dHcoZWFkZHJzWzFdLCBpb2FkZHIgKyBJT19QT1JUKTsKKwkJb3V0dyhlYWRkcnNbMl0sIGlvYWRkciArIElPX1BPUlQpOworCQlvdXR3KGxwLT50eF9lbmQsIGlvYWRkciArIGxwLT54bXRfYmFyKTsKKwkJb3V0YihNQ19TRVRVUCwgaW9hZGRyKTsKKworCQkvKiBVcGRhdGUgdGhlIHRyYW5zbWl0IHF1ZXVlICovCisJCWkgPSBscC0+dHhfZW5kICsgWE1UX0hFQURFUiArIDYqKGRldi0+bWNfY291bnQgKyAxKTsKKworCQlpZiAobHAtPnR4X3N0YXJ0ICE9IGxwLT50eF9lbmQpCisJCXsKKwkJCS8qIHVwZGF0ZSB0aGUgbmV4dCBhZGRyZXNzIGFuZCB0aGUgY2hhaW4gYml0IGluIHRoZQorCQkJICAgbGFzdCBwYWNrZXQgKi8KKwkJCW91dHcobHAtPnR4X2xhc3QgKyBYTVRfQ0hBSU4sIGlvYWRkciArIEhPU1RfQUREUkVTU19SRUcpOworCQkJb3V0dyhpLCBpb2FkZHIgKyBJT19QT1JUKTsKKwkJCW91dHcobHAtPnR4X2xhc3QgKyBYTVRfQ09VTlQsIGlvYWRkciArIEhPU1RfQUREUkVTU19SRUcpOworCQkJc3RhdHVzID0gaW53KGlvYWRkciArIElPX1BPUlQpOworCQkJb3V0dyhzdGF0dXMgfCBDSEFJTl9CSVQsIGlvYWRkciArIElPX1BPUlQpOworCQkJbHAtPnR4X2VuZCA9IGkgOworCQl9CisJCWVsc2UgeworCQkJbHAtPnR4X3N0YXJ0ID0gbHAtPnR4X2VuZCA9IGkgOworCQl9CisKKwkJLyogQWNrbm93bGVkZ2UgdGhhdCB0aGUgTUMgc2V0dXAgaXMgZG9uZSAqLworCQlkbyB7IC8qIFdlIHNob3VsZCBiZSBkb2luZyB0aGlzIGluIHRoZSBlZXByb19pbnRlcnJ1cHQoKSEgKi8KKwkJCVNMT1dfRE9XTjsKKwkJCVNMT1dfRE9XTjsKKwkJCWlmIChpbmIoaW9hZGRyICsgU1RBVFVTX1JFRykgJiAweDA4KQorCQkJeworCQkJCWkgPSBpbmIoaW9hZGRyKTsKKwkJCQlvdXRiKDB4MDgsIGlvYWRkciArIFNUQVRVU19SRUcpOworCisJCQkJaWYgKGkgJiAweDIwKSB7IC8qIGNvbW1hbmQgQUJPUlRlZCAqLworCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBtdWx0aWNhc3Qgc2V0dXAgZmFpbGVkLlxuIiwgCisJCQkJCQlkZXYtPm5hbWUpOworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgaWYgKChpICYgMHgwZikgPT0gMHgwMykJeyAvKiBNQy1Eb25lICovCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogc2V0IFJ4IG1vZGUgdG8gJWQgYWRkcmVzcyVzLlxuIiwKKwkJCQkJCWRldi0+bmFtZSwgZGV2LT5tY19jb3VudCwKKwkJCQkJCWRldi0+bWNfY291bnQgPiAxID8gImVzIjoiIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSB3aGlsZSAoKytib2d1c2NvdW50IDwgMTAwKTsKKworCQkvKiBSZS1lbmFibGUgUlggYW5kIFRYIGludGVycnVwdHMgKi8KKwkJZWVwcm9fZW5faW50KGlvYWRkcik7CisJfQorCWlmIChscC0+ZWVwcm8gPT0gTEFONTk1RlhfMTBJU0EpIHsKKwkJZWVwcm9fY29tcGxldGVfc2VscmVzZXQoaW9hZGRyKTsKKwl9CisJZWxzZQorCQllZXByb19lbl9yeChpb2FkZHIpOworfQorCisvKiBUaGUgaG9ycmlibGUgcm91dGluZSB0byByZWFkIGEgd29yZCBmcm9tIHRoZSBzZXJpYWwgRUVQUk9NLiAqLworLyogSU1QT1JUQU5UIC0gdGhlIDgyNTk1IHdpbGwgYmUgc2V0IHRvIEJhbmsgMCBhZnRlciB0aGUgZWVwcm9tIGlzIHJlYWQgKi8KKworLyogVGhlIGRlbGF5IGJldHdlZW4gRUVQUk9NIGNsb2NrIHRyYW5zaXRpb25zLiAqLworI2RlZmluZSBlZXByb21fZGVsYXkoKSB7IHVkZWxheSg0MCk7IH0KKyNkZWZpbmUgRUVfUkVBRF9DTUQgKDYgPDwgNikKKworaW50CityZWFkX2VlcHJvbShpbnQgaW9hZGRyLCBpbnQgbG9jYXRpb24sIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJdW5zaWduZWQgc2hvcnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgZWVwcm9fbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzaG9ydCBlZV9hZGRyID0gaW9hZGRyICsgbHAtPmVlcHJvbV9yZWc7CisJaW50IHJlYWRfY21kID0gbG9jYXRpb24gfCBFRV9SRUFEX0NNRDsKKwlzaG9ydCBjdHJsX3ZhbCA9IEVFQ1MgOworCisJLyogWFhYWCAtIGJsYWNrIG1hZ2ljICovCisJCWVlcHJvX3N3MmJhbmsxKGlvYWRkcik7CisJCW91dGIoMHgwMCwgaW9hZGRyICsgU1RBVFVTX1JFRyk7CisJLyogWFhYWCAtIGJsYWNrIG1hZ2ljICovCisKKwllZXByb19zdzJiYW5rMihpb2FkZHIpOworCW91dGIoY3RybF92YWwsIGVlX2FkZHIpOworCisJLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSA4OyBpID49IDA7IGktLSkgeworCQlzaG9ydCBvdXR2YWwgPSAocmVhZF9jbWQgJiAoMSA8PCBpKSkgPyBjdHJsX3ZhbCB8IEVFREkKKwkJCTogY3RybF92YWw7CisJCW91dGIob3V0dmFsLCBlZV9hZGRyKTsKKwkJb3V0YihvdXR2YWwgfCBFRVNLLCBlZV9hZGRyKTsJLyogRUVQUk9NIGNsb2NrIHRpY2suICovCisJCWVlcHJvbV9kZWxheSgpOworCQlvdXRiKG91dHZhbCwgZWVfYWRkcik7CS8qIEZpbmlzaCBFRVBST00gYSBjbG9jayB0aWNrLiAqLworCQllZXByb21fZGVsYXkoKTsKKwl9CisJb3V0YihjdHJsX3ZhbCwgZWVfYWRkcik7CisKKwlmb3IgKGkgPSAxNjsgaSA+IDA7IGktLSkgeworCQlvdXRiKGN0cmxfdmFsIHwgRUVTSywgZWVfYWRkcik7CSBlZXByb21fZGVsYXkoKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW5iKGVlX2FkZHIpICYgRUVETykgPyAxIDogMCk7CisJCW91dGIoY3RybF92YWwsIGVlX2FkZHIpOyAgZWVwcm9tX2RlbGF5KCk7CisJfQorCisJLyogVGVybWluYXRlIHRoZSBFRVBST00gYWNjZXNzLiAqLworCWN0cmxfdmFsICY9IH5FRUNTOworCW91dGIoY3RybF92YWwgfCBFRVNLLCBlZV9hZGRyKTsKKwllZXByb21fZGVsYXkoKTsKKwlvdXRiKGN0cmxfdmFsLCBlZV9hZGRyKTsKKwllZXByb21fZGVsYXkoKTsKKwllZXByb19zdzJiYW5rMChpb2FkZHIpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK2hhcmR3YXJlX3NlbmRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmJ1Ziwgc2hvcnQgbGVuZ3RoKQoreworCXN0cnVjdCBlZXByb19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIHN0YXR1cywgdHhfYXZhaWxhYmxlLCBsYXN0LCBlbmQ7CisKKwlpZiAobmV0X2RlYnVnID4gNSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlbnRlcmluZyBoYXJkd2FyZV9zZW5kX3BhY2tldCByb3V0aW5lLlxuIiwgZGV2LT5uYW1lKTsKKworCQkvKiBkZXRlcm1pbmUgaG93IG11Y2ggb2YgdGhlIHRyYW5zbWl0IGJ1ZmZlciBzcGFjZSBpcyBhdmFpbGFibGUgKi8KKwkJaWYgKGxwLT50eF9lbmQgPiBscC0+dHhfc3RhcnQpCisJCXR4X2F2YWlsYWJsZSA9IGxwLT54bXRfcmFtIC0gKGxwLT50eF9lbmQgLSBscC0+dHhfc3RhcnQpOworCQllbHNlIGlmIChscC0+dHhfZW5kIDwgbHAtPnR4X3N0YXJ0KQorCQkJdHhfYXZhaWxhYmxlID0gbHAtPnR4X3N0YXJ0IC0gbHAtPnR4X2VuZDsKKwllbHNlIHR4X2F2YWlsYWJsZSA9IGxwLT54bXRfcmFtOworCisJaWYgKCgoKChsZW5ndGggKyAzKSA+PiAxKSA8PCAxKSArIDIqWE1UX0hFQURFUikgPj0gdHhfYXZhaWxhYmxlKSB7CisJCS8qIE5vIHNwYWNlIGF2YWlsYWJsZSA/Pz8gKi8KKwkJcmV0dXJuIDE7CisJCX0KKworCQlsYXN0ID0gbHAtPnR4X2VuZDsKKwkJZW5kID0gbGFzdCArICgoKGxlbmd0aCArIDMpID4+IDEpIDw8IDEpICsgWE1UX0hFQURFUjsKKworCWlmIChlbmQgPj0gbHAtPnhtdF91cHBlcl9saW1pdCArIDIpIHsgLyogdGhlIHRyYW5zbWl0IGJ1ZmZlciBpcyB3cmFwcGVkIGFyb3VuZCAqLworCQlpZiAoKGxwLT54bXRfdXBwZXJfbGltaXQgKyAyIC0gbGFzdCkgPD0gWE1UX0hFQURFUikgewkKKwkJCQkvKiBBcnJyciEhISwgbXVzdCBrZWVwIHRoZSB4bXQgaGVhZGVyIHRvZ2V0aGVyLAorCQkJCXNldmVyYWwgZGF5cyB3ZXJlIGxvc3QgdG8gY2hhc2UgdGhpcyBvbmUgZG93bi4gKi8KKwkJCWxhc3QgPSBscC0+eG10X2xvd2VyX2xpbWl0OworCQkJCWVuZCA9IGxhc3QgKyAoKChsZW5ndGggKyAzKSA+PiAxKSA8PCAxKSArIFhNVF9IRUFERVI7CisJCQl9CisJCWVsc2UgZW5kID0gbHAtPnhtdF9sb3dlcl9saW1pdCArIChlbmQgLQorCQkJCQkJbHAtPnhtdF91cHBlcl9saW1pdCArIDIpOworCQl9CisKKwkJb3V0dyhsYXN0LCBpb2FkZHIgKyBIT1NUX0FERFJFU1NfUkVHKTsKKwkJb3V0dyhYTVRfQ01ELCBpb2FkZHIgKyBJT19QT1JUKTsKKwkJb3V0dygwLCBpb2FkZHIgKyBJT19QT1JUKTsKKwkJb3V0dyhlbmQsIGlvYWRkciArIElPX1BPUlQpOworCQlvdXR3KGxlbmd0aCwgaW9hZGRyICsgSU9fUE9SVCk7CisKKwkJaWYgKGxwLT52ZXJzaW9uID09IExBTjU5NSkKKwkJCW91dHN3KGlvYWRkciArIElPX1BPUlQsIGJ1ZiwgKGxlbmd0aCArIDMpID4+IDEpOworCQllbHNlIHsJLyogTEFONTk1VFggb3IgTEFONTk1RlgsIGNhcGFibGUgb2YgMzItYml0IEkvTyBwcm9jZXNzaW5nICovCisJCQl1bnNpZ25lZCBzaG9ydCB0ZW1wID0gaW5iKGlvYWRkciArIElOVF9NQVNLX1JFRyk7CisJCQlvdXRiKHRlbXAgfCBJT18zMl9CSVQsIGlvYWRkciArIElOVF9NQVNLX1JFRyk7CisJCQlvdXRzbChpb2FkZHIgKyBJT19QT1JUXzMyX0JJVCwgYnVmLCAobGVuZ3RoICsgMykgPj4gMik7CisJCQlvdXRiKHRlbXAgJiB+KElPXzMyX0JJVCksIGlvYWRkciArIElOVF9NQVNLX1JFRyk7CisJCX0KKworCQkvKiBBIGR1bW15IHJlYWQgdG8gZmx1c2ggdGhlIERSQU0gd3JpdGUgcGlwZWxpbmUgKi8KKwkJc3RhdHVzID0gaW53KGlvYWRkciArIElPX1BPUlQpOworCisJCWlmIChscC0+dHhfc3RhcnQgPT0gbHAtPnR4X2VuZCkgeworCQlvdXR3KGxhc3QsIGlvYWRkciArIGxwLT54bXRfYmFyKTsKKwkJCW91dGIoWE1UX0NNRCwgaW9hZGRyKTsKKwkJCWxwLT50eF9zdGFydCA9IGxhc3Q7ICAgLyogSSBkb24ndCBsaWtlIHRvIGNoYW5nZSB0eF9zdGFydCBoZXJlICovCisJCX0KKwkJZWxzZSB7CisJCQkvKiB1cGRhdGUgdGhlIG5leHQgYWRkcmVzcyBhbmQgdGhlIGNoYWluIGJpdCBpbiB0aGUKKwkJCWxhc3QgcGFja2V0ICovCisKKwkJCWlmIChscC0+dHhfZW5kICE9IGxhc3QpIHsKKwkJCQlvdXR3KGxwLT50eF9sYXN0ICsgWE1UX0NIQUlOLCBpb2FkZHIgKyBIT1NUX0FERFJFU1NfUkVHKTsKKwkJCQlvdXR3KGxhc3QsIGlvYWRkciArIElPX1BPUlQpOworCQkJfQorCisJCQlvdXR3KGxwLT50eF9sYXN0ICsgWE1UX0NPVU5ULCBpb2FkZHIgKyBIT1NUX0FERFJFU1NfUkVHKTsKKwkJCXN0YXR1cyA9IGludyhpb2FkZHIgKyBJT19QT1JUKTsKKwkJCW91dHcoc3RhdHVzIHwgQ0hBSU5fQklULCBpb2FkZHIgKyBJT19QT1JUKTsKKworCQkJLyogQ29udGludWUgdGhlIHRyYW5zbWl0IGNvbW1hbmQgKi8KKwkJCW91dGIoUkVTVU1FX1hNVF9DTUQsIGlvYWRkcik7CisJCX0KKworCQlscC0+dHhfbGFzdCA9IGxhc3Q7CisJCWxwLT50eF9lbmQgPSBlbmQ7CisKKwkJaWYgKG5ldF9kZWJ1ZyA+IDUpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4aXRpbmcgaGFyZHdhcmVfc2VuZF9wYWNrZXQgcm91dGluZS5cbiIsIGRldi0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2VlcHJvX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVlcHJvX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc2hvcnQgYm9ndXNjb3VudCA9IDIwOworCXNob3J0IHJjdl9jYXIgPSBscC0+cnhfc3RhcnQ7CisJdW5zaWduZWQgcmN2X2V2ZW50LCByY3Zfc3RhdHVzLCByY3ZfbmV4dF9mcmFtZSwgcmN2X3NpemU7CisKKwlpZiAobmV0X2RlYnVnID4gNSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlbnRlcmluZyBlZXByb19yeCByb3V0aW5lLlxuIiwgZGV2LT5uYW1lKTsKKworCS8qIFNldCB0aGUgcmVhZCBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgUkNWICovCisJb3V0dyhyY3ZfY2FyLCBpb2FkZHIgKyBIT1NUX0FERFJFU1NfUkVHKTsKKworCXJjdl9ldmVudCA9IGludyhpb2FkZHIgKyBJT19QT1JUKTsKKworCXdoaWxlIChyY3ZfZXZlbnQgPT0gUkNWX0RPTkUpIHsKKworCQlyY3Zfc3RhdHVzID0gaW53KGlvYWRkciArIElPX1BPUlQpOworCQlyY3ZfbmV4dF9mcmFtZSA9IGludyhpb2FkZHIgKyBJT19QT1JUKTsKKwkJcmN2X3NpemUgPSBpbncoaW9hZGRyICsgSU9fUE9SVCk7CisKKwkJaWYgKChyY3Zfc3RhdHVzICYgKFJYX09LIHwgUlhfRVJST1IpKSA9PSBSWF9PSykgeworCisJCQkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlci4gKi8KKwkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCWxwLT5zdGF0cy5yeF9ieXRlcys9cmN2X3NpemU7CisJCQlyY3Zfc2l6ZSAmPSAweDNmZmY7CisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHJjdl9zaXplKzUpOworCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsIGRldi0+bmFtZSk7CisJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlyY3ZfY2FyID0gbHAtPnJ4X3N0YXJ0ICsgUkNWX0hFQURFUiArIHJjdl9zaXplOworCQkJCWxwLT5yeF9zdGFydCA9IHJjdl9uZXh0X2ZyYW1lOworCQkJCW91dHcocmN2X25leHRfZnJhbWUsIGlvYWRkciArIEhPU1RfQUREUkVTU19SRUcpOworCisJCQkJYnJlYWs7CisJCQl9CisJCQlza2ItPmRldiA9IGRldjsKKwkJCXNrYl9yZXNlcnZlKHNrYiwyKTsKKworCQkJaWYgKGxwLT52ZXJzaW9uID09IExBTjU5NSkKKwkJCQlpbnN3KGlvYWRkcitJT19QT1JULCBza2JfcHV0KHNrYixyY3Zfc2l6ZSksIChyY3Zfc2l6ZSArIDMpID4+IDEpOworCQkJZWxzZSB7IC8qIExBTjU5NVRYIG9yIExBTjU5NUZYLCBjYXBhYmxlIG9mIDMyLWJpdCBJL08gcHJvY2Vzc2luZyAqLworCQkJCXVuc2lnbmVkIHNob3J0IHRlbXAgPSBpbmIoaW9hZGRyICsgSU5UX01BU0tfUkVHKTsKKwkJCQlvdXRiKHRlbXAgfCBJT18zMl9CSVQsIGlvYWRkciArIElOVF9NQVNLX1JFRyk7CisJCQkJaW5zbChpb2FkZHIrSU9fUE9SVF8zMl9CSVQsIHNrYl9wdXQoc2tiLHJjdl9zaXplKSwKKwkJCQkJKHJjdl9zaXplICsgMykgPj4gMik7CisJCQkJb3V0Yih0ZW1wICYgfihJT18zMl9CSVQpLCBpb2FkZHIgKyBJTlRfTUFTS19SRUcpOworCQkJfQorCisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCX0KKworCQllbHNlIHsgLyogTm90IHN1cmUgd2lsbCBldmVyIHJlYWNoIGhlcmUsCisJCQlJIHNldCB0aGUgNTk1IHRvIGRpc2NhcmQgYmFkIHJlY2VpdmVkIGZyYW1lcyAqLworCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCisJCQlpZiAocmN2X3N0YXR1cyAmIDB4MDEwMCkKKwkJCQlscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKworCQkJZWxzZSBpZiAocmN2X3N0YXR1cyAmIDB4MDQwMCkKKwkJCQlscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisKKwkJCWVsc2UgaWYgKHJjdl9zdGF0dXMgJiAweDA4MDApCisJCQkJbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBldmVudCA9ICUjeCwgc3RhdHVzID0gJSN4LCBuZXh0ID0gJSN4LCBzaXplID0gJSN4XG4iLCAKKwkJCQlkZXYtPm5hbWUsIHJjdl9ldmVudCwgcmN2X3N0YXR1cywgcmN2X25leHRfZnJhbWUsIHJjdl9zaXplKTsKKwkJfQorCisJCWlmIChyY3Zfc3RhdHVzICYgMHgxMDAwKQorCQkJbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKworCQlyY3ZfY2FyID0gbHAtPnJ4X3N0YXJ0ICsgUkNWX0hFQURFUiArIHJjdl9zaXplOworCQlscC0+cnhfc3RhcnQgPSByY3ZfbmV4dF9mcmFtZTsKKworCQlpZiAoLS1ib2d1c2NvdW50ID09IDApCisJCQlicmVhazsKKworCQlvdXR3KHJjdl9uZXh0X2ZyYW1lLCBpb2FkZHIgKyBIT1NUX0FERFJFU1NfUkVHKTsKKwkJcmN2X2V2ZW50ID0gaW53KGlvYWRkciArIElPX1BPUlQpOworCisJfQorCWlmIChyY3ZfY2FyID09IDApCisJCXJjdl9jYXIgPSBscC0+cmN2X3VwcGVyX2xpbWl0IHwgMHhmZjsKKworCW91dHcocmN2X2NhciAtIDEsIGlvYWRkciArIFJDVl9TVE9QKTsKKworCWlmIChuZXRfZGVidWcgPiA1KQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4aXRpbmcgZWVwcm9fcnggcm91dGluZS5cbiIsIGRldi0+bmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkCitlZXByb190cmFuc21pdF9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWVwcm9fbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzaG9ydCBib2d1c2NvdW50ID0gMjU7IAorCXNob3J0IHhtdF9zdGF0dXM7CisKKwl3aGlsZSAoKGxwLT50eF9zdGFydCAhPSBscC0+dHhfZW5kKSAmJiBib2d1c2NvdW50LS0pIHsgCisKKwkJb3V0dyhscC0+dHhfc3RhcnQsIGlvYWRkciArIEhPU1RfQUREUkVTU19SRUcpOworCQl4bXRfc3RhdHVzID0gaW53KGlvYWRkcitJT19QT1JUKTsKKworCQlpZiAoISh4bXRfc3RhdHVzICYgVFhfRE9ORV9CSVQpKQorCQkJCWJyZWFrOworCisJCXhtdF9zdGF0dXMgPSBpbncoaW9hZGRyK0lPX1BPUlQpOworCQlscC0+dHhfc3RhcnQgPSBpbncoaW9hZGRyK0lPX1BPUlQpOworCisJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisKKwkJaWYgKHhtdF9zdGF0dXMgJiBUWF9PSykKKwkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCWVsc2UgeworCQkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJaWYgKHhtdF9zdGF0dXMgJiAweDA0MDApIHsKKwkJCQlscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNhcnJpZXIgZXJyb3JcbiIsCisJCQkJCWRldi0+bmFtZSk7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBYTVQgc3RhdHVzID0gJSN4XG4iLAorCQkJCQlkZXYtPm5hbWUsIHhtdF9zdGF0dXMpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBYTVQgc3RhdHVzID0gJSN4XG4iLAorCQkJCQlkZXYtPm5hbWUsIHhtdF9zdGF0dXMpOworCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogWE1UIHN0YXR1cyA9ICUjeFxuIiwKKwkJCQkJZGV2LT5uYW1lLCB4bXRfc3RhdHVzKTsKKwkJCX0KKwkJfQorCQlpZiAoeG10X3N0YXR1cyAmIDB4MDAwZikgeworCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKHhtdF9zdGF0dXMgJiAweDAwMGYpOworCQl9CisKKwkJaWYgKCh4bXRfc3RhdHVzICYgMHgwMDQwKSA9PSAweDApIHsKKwkJCWxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgZWVwcm9fZXRodG9vbF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IGVlcHJvX2xvY2FsCSpscCA9IChzdHJ1Y3QgZWVwcm9fbG9jYWwgKilkZXYtPnByaXY7CisKKwljbWQtPnN1cHBvcnRlZCA9IAlTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgCisJCQkJU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CisJCQkJU1VQUE9SVEVEX0F1dG9uZWc7CisJY21kLT5hZHZlcnRpc2luZyA9CUFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwKKwkJCQlBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB8CisJCQkJQURWRVJUSVNFRF9BdXRvbmVnOworCisJaWYgKEdldEJpdChscC0+d29yZFs1XSwgZWVfUG9ydFRQRSkpIHsKKwkJY21kLT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX1RQOworCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfVFA7CisJfQorCWlmIChHZXRCaXQobHAtPndvcmRbNV0sIGVlX1BvcnRCTkMpKSB7CisJCWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9CTkM7CisJCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9CTkM7CisJfQorCWlmIChHZXRCaXQobHAtPndvcmRbNV0sIGVlX1BvcnRBVUkpKSB7CisJCWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9BVUk7CisJCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9BVUk7CisJfQorCisJY21kLT5zcGVlZCA9IFNQRUVEXzEwOworCisJaWYgKGRldi0+aWZfcG9ydCA9PSBUUEUgJiYgbHAtPndvcmRbMV0gJiBlZV9EdXBsZXgpIHsKKwkJY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwl9CisJZWxzZSB7CisJCWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJfQorCisJY21kLT5wb3J0ID0gZGV2LT5pZl9wb3J0OworCWNtZC0+cGh5X2FkZHJlc3MgPSBkZXYtPmJhc2VfYWRkcjsKKwljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsKKworCWlmIChscC0+d29yZFswXSAmIGVlX0F1dG9OZWcpIHsKKwkJY21kLT5hdXRvbmVnID0gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZWVwcm9fZXRodG9vbF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICpkcnZpbmZvKQoreworCXN0cmNweShkcnZpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoZHJ2aW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXNwcmludGYoZHJ2aW5mby0+YnVzX2luZm8sICJJU0EgMHglbHgiLCBkZXYtPmJhc2VfYWRkcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZWVwcm9fZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncwk9IGVlcHJvX2V0aHRvb2xfZ2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbyAJPSBlZXByb19ldGh0b29sX2dldF9kcnZpbmZvLAorfTsKKworI2lmZGVmIE1PRFVMRQorCisjZGVmaW5lIE1BWF9FRVBSTyA4CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9lZXByb1tNQVhfRUVQUk9dOworCitzdGF0aWMgaW50IGlvW01BWF9FRVBST10gPSB7CisgIFswIC4uLiBNQVhfRUVQUk8tMV0gPSAtMQorfTsKK3N0YXRpYyBpbnQgaXJxW01BWF9FRVBST107CitzdGF0aWMgaW50IG1lbVtNQVhfRUVQUk9dID0gewkvKiBTaXplIG9mIHRoZSByeCBidWZmZXIgaW4gS0IgKi8KKyAgWzAgLi4uIE1BWF9FRVBSTy0xXSA9IFJDVl9ERUZBVUxUX1JBTS8xMDI0Cit9Oworc3RhdGljIGludCBhdXRvZGV0ZWN0OworCitzdGF0aWMgaW50IG5fZWVwcm87CisvKiBGb3IgbGludXggMi4xLnh4ICovCisKK01PRFVMRV9BVVRIT1IoIlBhc2NhbCBEdXB1aXMgYW5kIG90aGVycyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCBpODI1OTUgSVNBIEV0aGVyRXhwcmVzc1BybzEwLzEwKyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBudW1fcGFyYW1zOworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsICZudW1fcGFyYW1zLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgJm51bV9wYXJhbXMsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG1lbSwgaW50LCAmbnVtX3BhcmFtcywgMCk7Cittb2R1bGVfcGFyYW0oYXV0b2RldGVjdCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJFdGhlckV4cHJlc3MgUHJvLzEwIEkvTyBiYXNlIGFkZHJlcyhlcykiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiRXRoZXJFeHByZXNzIFByby8xMCBJUlEgbnVtYmVyKHMpIik7CitNT0RVTEVfUEFSTV9ERVNDKG1lbSwgIkV0aGVyRXhwcmVzcyBQcm8vMTAgUnggYnVmZmVyIHNpemUoZXMpIGluIGtCICgzLTI5KSIpOworTU9EVUxFX1BBUk1fREVTQyhhdXRvZGV0ZWN0LCAiRXRoZXJFeHByZXNzIFByby8xMCBmb3JjZSBib2FyZChzKSBkZXRlY3Rpb24gKDAtMSkiKTsKKworaW50Citpbml0X21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGk7CisJaWYgKGlvWzBdID09IC0xICYmIGF1dG9kZXRlY3QgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJlZXByb19pbml0X21vZHVsZTogUHJvYmUgaXMgdmVyeSBkYW5nZXJvdXMgaW4gSVNBIGJvYXJkcyFcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJlZXByb19pbml0X21vZHVsZTogUGxlYXNlIGFkZCBcImF1dG9kZXRlY3Q9MVwiIHRvIGZvcmNlIHByb2JlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWVsc2UgaWYgKGF1dG9kZXRlY3QpIHsKKwkJLyogaWYgYXV0b2RldGVjdCBpcyBzZXQgdGhlbiB3ZSBtdXN0IGZvcmNlIGRldGVjdGlvbiAqLworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0VFUFJPOyBpKyspIHsKKwkJCWlvW2ldID0gMDsKKwkJfQorCisJCXByaW50ayhLRVJOX0lORk8gImVlcHJvX2luaXRfbW9kdWxlOiBBdXRvLWRldGVjdGluZyBib2FyZHMgKE1heSBHb2QgcHJvdGVjdCB1cy4uLilcbiIpOworCX0KKworCWZvciAoaSA9IDA7IGlvW2ldICE9IC0xICYmIGkgPCBNQVhfRUVQUk87IGkrKykgeworCQlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGVlcHJvX2xvY2FsKSk7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisKKwkJZGV2LT5tZW1fZW5kID0gbWVtW2ldOworCQlkZXYtPmJhc2VfYWRkciA9IGlvW2ldOworCQlkZXYtPmlycSA9IGlycVtpXTsKKworCQlpZiAoZG9fZWVwcm9fcHJvYmUoZGV2KSA9PSAwKSB7CisJCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgeworCQkJCWRldl9lZXByb1tuX2VlcHJvKytdID0gZGV2OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVFUFJPX0lPX0VYVEVOVCk7CisJCX0KKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJYnJlYWs7CisJfQorCisJaWYgKG5fZWVwcm8pCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisKKwlyZXR1cm4gbl9lZXBybyA/IDAgOiAtRU5PREVWOworfQorCit2b2lkCitjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWludCBpOworCisJZm9yIChpPTA7IGk8bl9lZXBybzsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZWVwcm9baV07CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBFRVBST19JT19FWFRFTlQpOworCQlmcmVlX25ldGRldihkZXYpOworCX0KK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VlcHJvMTAwLmMgYi9kcml2ZXJzL25ldC9lZXBybzEwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YjNhMmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lZXBybzEwMC5jCkBAIC0wLDAgKzEsMjQxMiBAQAorLyogZHJpdmVycy9uZXQvZWVwcm8xMDAuYzogQW4gSW50ZWwgaTgyNTU3LTU1OSBFdGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LiAqLworLyoKKwlXcml0dGVuIDE5OTYtMTk5OSBieSBEb25hbGQgQmVja2VyLgorCisJVGhlIGRyaXZlciBhbHNvIGNvbnRhaW5zIHVwZGF0ZXMgYnkgZGlmZmVyZW50IGtlcm5lbCBkZXZlbG9wZXJzCisJKHNlZSBpbmNvbXBsZXRlIGxpc3QgYmVsb3cpLgorCUN1cnJlbnQgbWFpbnRhaW5lciBpcyBBbmRyZXkgVi4gU2F2b2Noa2luIDxzYXdAc2F3LnN3LmNvbS5zZz4uCisJUGxlYXNlIHVzZSB0aGlzIGVtYWlsIGFkZHJlc3MgYW5kIGxpbnV4LWtlcm5lbCBtYWlsaW5nIGxpc3QgZm9yIGJ1ZyByZXBvcnRzLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlUaGlzIGRyaXZlciBpcyBmb3IgdGhlIEludGVsIEV0aGVyRXhwcmVzcyBQcm8xMDAgKFNwZWVkbzMpIGRlc2lnbi4KKwlJdCBzaG91bGQgd29yayB3aXRoIGFsbCBpODI1NTcvNTU4LzU1OSBib2FyZHMuCisKKwlWZXJzaW9uIGhpc3Rvcnk6CisJMTk5OCBBcHIgLSAyMDAwIEZlYiAgQW5kcmV5IFYuIFNhdm9jaGtpbiA8c2F3QHNhdy5zdy5jb20uc2c+CisJCVNlcmlvdXMgZml4ZXMgZm9yIG11bHRpY2FzdCBmaWx0ZXIgbGlzdCBzZXR0aW5nLCBUWCB0aW1lb3V0IHJvdXRpbmU7CisJCVJYIHJpbmcgcmVmaWxsaW5nIGxvZ2ljOyAgb3RoZXIgc3R1ZmYKKwkyMDAwIEZlYiAgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorCQlDb252ZXJ0IHRvIG5ldyBQQ0kgZHJpdmVyIGludGVyZmFjZQorCTIwMDAgTWFyIDI0ICBEcmFnYW4gU3RhbmNldmljIDx2aXNpdG9yQHZhbGludXguY29tPgorCQlEaXNhYmxlZCBGQyBhbmQgRVIsIHRvIGF2b2lkIGxvY2t1cHMgd2hlbiB3aGVuIHdlIGdldCBGQ1AgaW50ZXJydXB0cy4KKwkyMDAwIEp1bCAxNyBHb3V0aGFtIFJhbyA8Z291dGhhbS5yYW9AaW50ZWwuY29tPgorCQlQQ0kgRE1BIEFQSSBmaXhlcywgYWRkaW5nIHBjaV9kbWFfc3luY19zaW5nbGUgY2FsbHMgd2hlcmUgbmVjY2VzYXJ5CisJMjAwMCBBdWcgMzEgRGF2aWQgTW9zYmVyZ2VyIDxkYXZpZG1AaHBsLmhwLmNvbT4KKwkJcnhfYWxpZ24gc3VwcG9ydDogZW5hYmxlcyByeCBETUEgd2l0aG91dCBjYXVzaW5nIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KKyovCisKK3N0YXRpYyBjb25zdCBjaGFyICp2ZXJzaW9uID0KKyJlZXBybzEwMC5jOnYxLjA5ai10IDkvMjkvOTkgRG9uYWxkIEJlY2tlciBodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL2VlcHJvMTAwLmh0bWxcbiIKKyJlZXBybzEwMC5jOiAkUmV2aXNpb246IDEuMzYgJCAyMDAwLzExLzE3IE1vZGlmaWVkIGJ5IEFuZHJleSBWLiBTYXZvY2hraW4gPHNhd0BzYXcuc3cuY29tLnNnPiBhbmQgb3RoZXJzXG4iOworCisvKiBBIGZldyB1c2VyLWNvbmZpZ3VyYWJsZSB2YWx1ZXMgdGhhdCBhcHBseSB0byBhbGwgYm9hcmRzLgorICAgRmlyc3Qgc2V0IGlzIHVuZG9jdW1lbnRlZCBhbmQgc3BlbGxlZCBwZXIgSW50ZWwgcmVjb21tZW5kYXRpb25zLiAqLworCitzdGF0aWMgaW50IGNvbmdlbmIgLyogPSAwICovOyAvKiBFbmFibGUgY29uZ2VzdGlvbiBjb250cm9sIGluIHRoZSBEUDgzODQwLiAqLworc3RhdGljIGludCB0eGZpZm8gPSA4OwkJLyogVHggRklGTyB0aHJlc2hvbGQgaW4gNCBieXRlIHVuaXRzLCAwLTE1ICovCitzdGF0aWMgaW50IHJ4ZmlmbyA9IDg7CQkvKiBSeCBGSUZPIHRocmVzaG9sZCwgZGVmYXVsdCAzMiBieXRlcy4gKi8KKy8qIFR4L1J4IERNQSBidXJzdCBsZW5ndGgsIDAtMTI3LCAwID09IG5vIHByZWVtcHRpb24sIHR4PT0xMjggLT4gZGlzYWJsZWQuICovCitzdGF0aWMgaW50IHR4ZG1hY291bnQgPSAxMjg7CitzdGF0aWMgaW50IHJ4ZG1hY291bnQgLyogPSAwICovOworCisjaWYgZGVmaW5lZChfX2lhNjRfXykgfHwgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9fbWlwc19fKSB8fCBcCisJZGVmaW5lZChfX2FybV9fKQorICAvKiBhbGlnbiByeCBidWZmZXJzIHRvIDIgYnl0ZXMgc28gdGhhdCBJUCBoZWFkZXIgaXMgYWxpZ25lZCAqLworIyBkZWZpbmUgcnhfYWxpZ24oc2tiKQkJc2tiX3Jlc2VydmUoKHNrYiksIDIpCisjIGRlZmluZSBSeEZEX0FMSUdOTUVOVAkJX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDIpLCBwYWNrZWQpKQorI2Vsc2UKKyMgZGVmaW5lIHJ4X2FsaWduKHNrYikKKyMgZGVmaW5lIFJ4RkRfQUxJR05NRU5UCisjZW5kaWYKKworLyogU2V0IHRoZSBjb3B5IGJyZWFrcG9pbnQgZm9yIHRoZSBjb3B5LW9ubHktdGlueS1idWZmZXIgUnggbWV0aG9kLgorICAgTG93ZXIgdmFsdWVzIHVzZSBtb3JlIG1lbW9yeSwgYnV0IGFyZSBmYXN0ZXIuICovCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhayA9IDIwMDsKKworLyogTWF4aW11bSBldmVudHMgKFJ4IHBhY2tldHMsIGV0Yy4pIHRvIGhhbmRsZSBhdCBlYWNoIGludGVycnVwdC4gKi8KK3N0YXRpYyBpbnQgbWF4X2ludGVycnVwdF93b3JrID0gMjA7CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIG11bHRpY2FzdCBhZGRyZXNzZXMgdG8gZmlsdGVyICh2cy4gcngtYWxsLW11bHRpY2FzdCkgKi8KK3N0YXRpYyBpbnQgbXVsdGljYXN0X2ZpbHRlcl9saW1pdCA9IDY0OworCisvKiAnb3B0aW9ucycgaXMgdXNlZCB0byBwYXNzIGEgdHJhbnNjZWl2ZXIgb3ZlcnJpZGUgb3IgZnVsbC1kdXBsZXggZmxhZworICAgZS5nLiAib3B0aW9ucz0xNiIgZm9yIEZELCAib3B0aW9ucz0zMiIgZm9yIDEwMG1icHMtb25seS4gKi8KK3N0YXRpYyBpbnQgZnVsbF9kdXBsZXhbXSA9IHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9Oworc3RhdGljIGludCBvcHRpb25zW10gPSB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKKworLyogQSBmZXcgdmFsdWVzIHRoYXQgbWF5IGJlIHR3ZWFrZWQuICovCisvKiBUaGUgcmluZyBzaXplcyBzaG91bGQgYmUgYSBwb3dlciBvZiB0d28gZm9yIGVmZmljaWVuY3kuICovCisjZGVmaW5lIFRYX1JJTkdfU0laRQk2NAorI2RlZmluZSBSWF9SSU5HX1NJWkUJNjQKKy8qIEhvdyBtdWNoIHNsb3RzIG11bHRpY2FzdCBmaWx0ZXIgc2V0dXAgbWF5IHRha2UuCisgICBEbyBub3QgZGVzY3JlYXNlIHdpdGhvdXQgY2hhbmdpbmcgc2V0X3J4X21vZGUoKSBpbXBsZW1lbnRhaW9uLiAqLworI2RlZmluZSBUWF9NVUxUSUNBU1RfU0laRSAgIDIKKyNkZWZpbmUgVFhfTVVMVElDQVNUX1JFU0VSViAoVFhfTVVMVElDQVNUX1NJWkUqMikKKy8qIEFjdHVhbCBudW1iZXIgb2YgVFggcGFja2V0cyBxdWV1ZWQsIG11c3QgYmUKKyAgIDw9IFRYX1JJTkdfU0laRS1UWF9NVUxUSUNBU1RfUkVTRVJWLiAqLworI2RlZmluZSBUWF9RVUVVRV9MSU1JVCAgKFRYX1JJTkdfU0laRS1UWF9NVUxUSUNBU1RfUkVTRVJWKQorLyogSHlzdGVyZXNpcyBtYXJraW5nIHF1ZXVlIGFzIG5vIGxvbmdlciBmdWxsLiAqLworI2RlZmluZSBUWF9RVUVVRV9VTkZVTEwgKFRYX1FVRVVFX0xJTUlULTQpCisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCB1c3VhbGx5IGFyZSBub3QgY2hhbmdlZC4gKi8KKworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUCQkoMipIWikKKy8qIFNpemUgb2YgYW4gcHJlLWFsbG9jYXRlZCBSeCBidWZmZXI6IDxFdGhlcm5ldCBNVFU+ICsgc2xhY2suKi8KKyNkZWZpbmUgUEtUX0JVRl9TWgkJMTUzNgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorCitzdGF0aWMgaW50IHVzZV9pbzsKK3N0YXRpYyBpbnQgZGVidWcgPSAtMTsKKyNkZWZpbmUgREVCVUdfREVGQVVMVAkJKE5FVElGX01TR19EUlYJCXwgXAorCQkJCSBORVRJRl9NU0dfSFcJCXwgXAorCQkJCSBORVRJRl9NU0dfUlhfRVJSCXwgXAorCQkJCSBORVRJRl9NU0dfVFhfRVJSKQorI2RlZmluZSBERUJVRwkJCSgoZGVidWcgPj0gMCkgPyAoMTw8ZGVidWcpLTEgOiBERUJVR19ERUZBVUxUKQorCisKK01PRFVMRV9BVVRIT1IoIk1haW50YWluZXI6IEFuZHJleSBWLiBTYXZvY2hraW4gPHNhd0BzYXcuc3cuY29tLnNnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCBpODI1NTcvaTgyNTU4L2k4MjU1OSBQQ0kgRXRoZXJFeHByZXNzUHJvIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX3BhcmFtKHVzZV9pbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShvcHRpb25zLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGZ1bGxfZHVwbGV4LCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKGNvbmdlbmIsIGludCwgMCk7Cittb2R1bGVfcGFyYW0odHhmaWZvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJ4ZmlmbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh0eGRtYWNvdW50LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJ4ZG1hY291bnQsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocnhfY29weWJyZWFrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShtdWx0aWNhc3RfZmlsdGVyX2xpbWl0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImRlYnVnIGxldmVsICgwLTYpIik7CitNT0RVTEVfUEFSTV9ERVNDKG9wdGlvbnMsICJCaXRzIDAtMzogdHJhbnNjZWl2ZXIgdHlwZSwgYml0IDQ6IGZ1bGwgZHVwbGV4LCBiaXQgNTogMTAwTWJwcyIpOworTU9EVUxFX1BBUk1fREVTQyhmdWxsX2R1cGxleCwgImZ1bGwgZHVwbGV4IHNldHRpbmcocykgKDEpIik7CitNT0RVTEVfUEFSTV9ERVNDKGNvbmdlbmIsICJFbmFibGUgY29uZ2VzdGlvbiBjb250cm9sICgxKSIpOworTU9EVUxFX1BBUk1fREVTQyh0eGZpZm8sICJUeCBGSUZPIHRocmVzaG9sZCBpbiA0IGJ5dGUgdW5pdHMsICgwLTE1KSIpOworTU9EVUxFX1BBUk1fREVTQyhyeGZpZm8sICJSeCBGSUZPIHRocmVzaG9sZCBpbiA0IGJ5dGUgdW5pdHMsICgwLTE1KSIpOworTU9EVUxFX1BBUk1fREVTQyh0eGRtYWNvdW50LCAiVHggRE1BIGJ1cnN0IGxlbmd0aDsgMTI4IC0gZGlzYWJsZSAoMC0xMjgpIik7CitNT0RVTEVfUEFSTV9ERVNDKHJ4ZG1hY291bnQsICJSeCBETUEgYnVyc3QgbGVuZ3RoOyAxMjggLSBkaXNhYmxlICgwLTEyOCkiKTsKK01PRFVMRV9QQVJNX0RFU0MocnhfY29weWJyZWFrLCAiY29weSBicmVha3BvaW50IGZvciBjb3B5LW9ubHktdGlueS1mcmFtZXMiKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2ludGVycnVwdF93b3JrLCAibWF4aW11bSBldmVudHMgaGFuZGxlZCBwZXIgaW50ZXJydXB0Iik7CitNT0RVTEVfUEFSTV9ERVNDKG11bHRpY2FzdF9maWx0ZXJfbGltaXQsICJtYXhpbXVtIG51bWJlciBvZiBmaWx0ZXJlZCBtdWx0aWNhc3QgYWRkcmVzc2VzIik7CisKKyNkZWZpbmUgUlVOX0FUKHgpIChqaWZmaWVzICsgKHgpKQorCisjZGVmaW5lIG5ldGRldmljZV9zdGFydChkZXYpCisjZGVmaW5lIG5ldGRldmljZV9zdG9wKGRldikKKyNkZWZpbmUgbmV0aWZfc2V0X3R4X3RpbWVvdXQoZGV2LCB0ZiwgdG0pIFwKKwkJCQkJCQkJZG8geyBcCisJCQkJCQkJCQkoZGV2KS0+dHhfdGltZW91dCA9ICh0Zik7IFwKKwkJCQkJCQkJCShkZXYpLT53YXRjaGRvZ190aW1lbyA9ICh0bSk7IFwKKwkJCQkJCQkJfSB3aGlsZSgwKQorCisKKworLyoKKwkJCQlUaGVvcnkgb2YgT3BlcmF0aW9uCisKK0kuIEJvYXJkIENvbXBhdGliaWxpdHkKKworVGhpcyBkZXZpY2UgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciB0aGUgSW50ZWwgaTgyNTU3ICJTcGVlZG8zIiBjaGlwLCBJbnRlbCdzCitzaW5nbGUtY2hpcCBmYXN0IEV0aGVybmV0IGNvbnRyb2xsZXIgZm9yIFBDSSwgYXMgdXNlZCBvbiB0aGUgSW50ZWwKK0V0aGVyRXhwcmVzcyBQcm8gMTAwIGFkYXB0ZXIuCisKK0lJLiBCb2FyZC1zcGVjaWZpYyBzZXR0aW5ncworCitQQ0kgYnVzIGRldmljZXMgYXJlIGNvbmZpZ3VyZWQgYnkgdGhlIHN5c3RlbSBhdCBib290IHRpbWUsIHNvIG5vIGp1bXBlcnMKK25lZWQgdG8gYmUgc2V0IG9uIHRoZSBib2FyZC4gIFRoZSBzeXN0ZW0gQklPUyBzaG91bGQgYmUgc2V0IHRvIGFzc2lnbiB0aGUKK1BDSSBJTlRBIHNpZ25hbCB0byBhbiBvdGhlcndpc2UgdW51c2VkIHN5c3RlbSBJUlEgbGluZS4gIFdoaWxlIGl0J3MKK3Bvc3NpYmxlIHRvIHNoYXJlIFBDSSBpbnRlcnJ1cHQgbGluZXMsIGl0IG5lZ2F0aXZlbHkgaW1wYWN0cyBwZXJmb3JtYW5jZSBhbmQKK29ubHkgcmVjZW50IGtlcm5lbHMgc3VwcG9ydCBpdC4KKworSUlJLiBEcml2ZXIgb3BlcmF0aW9uCisKK0lJSUEuIEdlbmVyYWwKK1RoZSBTcGVlZG8zIGlzIHZlcnkgc2ltaWxhciB0byBvdGhlciBJbnRlbCBuZXR3b3JrIGNoaXBzLCB0aGF0IGlzIHRvIHNheQorImFwcGFyZW50bHkgZGVzaWduZWQgb24gYSBkaWZmZXJlbnQgcGxhbmV0Ii4gIFRoaXMgY2hpcHMgcmV0YWlucyB0aGUgY29tcGxleAorUnggYW5kIFR4IGRlc2NyaXB0b3JzIGFuZCBtdWx0aXBsZSBidWZmZXJzIHBvaW50ZXJzIGFzIHByZXZpb3VzIGNoaXBzLCBidXQKK2Fsc28gaGFzIHNpbXBsaWZpZWQgVHggYW5kIFJ4IGJ1ZmZlciBtb2Rlcy4gIFRoaXMgZHJpdmVyIHVzZXMgdGhlICJmbGV4aWJsZSIKK1R4IG1vZGUsIGJ1dCBpbiBhIHNpbXBsaWZpZWQgbG93ZXItb3ZlcmhlYWQgbWFubmVyOiBpdCBhc3NvY2lhdGVzIG9ubHkgYQorc2luZ2xlIGJ1ZmZlciBkZXNjcmlwdG9yIHdpdGggZWFjaCBmcmFtZSBkZXNjcmlwdG9yLgorCitEZXNwaXRlIHRoZSBleHRyYSBzcGFjZSBvdmVyaGVhZCBpbiBlYWNoIHJlY2VpdmUgc2tidWZmLCB0aGUgZHJpdmVyIG11c3QgdXNlCit0aGUgc2ltcGxpZmllZCBSeCBidWZmZXIgbW9kZSB0byBhc3N1cmUgdGhhdCBvbmx5IGEgc2luZ2xlIGRhdGEgYnVmZmVyIGlzCithc3NvY2lhdGVkIHdpdGggZWFjaCBSeEZELiBUaGUgZHJpdmVyIGltcGxlbWVudHMgdGhpcyBieSByZXNlcnZpbmcgc3BhY2UKK2ZvciB0aGUgUnggZGVzY3JpcHRvciBhdCB0aGUgaGVhZCBvZiBlYWNoIFJ4IHNrYnVmZi4KKworVGhlIFNwZWVkby0zIGhhcyByZWNlaXZlIGFuZCBjb21tYW5kIHVuaXQgYmFzZSBhZGRyZXNzZXMgdGhhdCBhcmUgYWRkZWQgdG8KK2FsbW9zdCBhbGwgZGVzY3JpcHRvciBwb2ludGVycy4gIFRoZSBkcml2ZXIgc2V0cyB0aGVzZSB0byB6ZXJvLCBzbyB0aGF0IGFsbAorcG9pbnRlciBmaWVsZHMgYXJlIGFic29sdXRlIGFkZHJlc3Nlcy4KKworVGhlIFN5c3RlbSBDb250cm9sIEJsb2NrIChTQ0IpIG9mIHNvbWUgcHJldmlvdXMgSW50ZWwgY2hpcHMgZXhpc3RzIG9uIHRoZQorY2hpcCBpbiBib3RoIFBDSSBJL08gYW5kIG1lbW9yeSBzcGFjZS4gIFRoaXMgZHJpdmVyIHVzZXMgdGhlIEkvTyBzcGFjZQorcmVnaXN0ZXJzLCBidXQgbWlnaHQgc3dpdGNoIHRvIG1lbW9yeSBtYXBwZWQgbW9kZSB0byBiZXR0ZXIgc3VwcG9ydCBub24teDg2Citwcm9jZXNzb3JzLgorCitJSUlCLiBUcmFuc21pdCBzdHJ1Y3R1cmUKKworVGhlIGRyaXZlciBtdXN0IHVzZSB0aGUgY29tcGxleCBUeCBjb21tYW5kK2Rlc2NyaXB0b3IgbW9kZSBpbiBvcmRlciB0bworaGF2ZSBhIGluZGlyZWN0IHBvaW50ZXIgdG8gdGhlIHNrYnVmZiBkYXRhIHNlY3Rpb24uICBFYWNoIFR4IGNvbW1hbmQgYmxvY2sKKyhUeENCKSBpcyBhc3NvY2lhdGVkIHdpdGggdHdvIGltbWVkaWF0ZWx5IGFwcGVuZGVkIFR4IEJ1ZmZlciBEZXNjcmlwdG9yCisoVHhCRCkuICBBIGZpeGVkIHJpbmcgb2YgdGhlc2UgVHhDQitUeEJEIHBhaXJzIGFyZSBrZXB0IGFzIHBhcnQgb2YgdGhlCitzcGVlZG9fcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSBmb3IgZWFjaCBhZGFwdGVyIGluc3RhbmNlLgorCitUaGUgbmV3ZXIgaTgyNTU4IGV4cGxpY2l0bHkgc3VwcG9ydHMgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBjYW4gcmVhZCB0aGUgdHdvCitUeEJEcyBpbiB0aGUgc2FtZSBQQ0kgYnVyc3QgYXMgdGhlIFR4Q0IuCisKK1RoaXMgcmluZyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgYWxsIG5vcm1hbCB0cmFuc21pdCBwYWNrZXRzLCBidXQgdGhlCit0cmFuc21pdCBwYWNrZXQgZGVzY3JpcHRvcnMgYXJlbid0IGxvbmcgZW5vdWdoIGZvciBtb3N0IG5vbi1UeCBjb21tYW5kcyBzdWNoCithcyBDbWRDb25maWd1cmUuICBUaGlzIGlzIGNvbXBsaWNhdGVkIGJ5IHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBjaGlwIGhhcworYWxyZWFkeSBsb2FkZWQgdGhlIGxpbmsgYWRkcmVzcyBpbiB0aGUgcHJldmlvdXMgZGVzY3JpcHRvci4gIFNvIGZvciB0aGVzZQorY29tbWFuZHMgd2UgY29udmVydCB0aGUgbmV4dCBmcmVlIGRlc2NyaXB0b3Igb24gdGhlIHJpbmcgdG8gYSBOb09wLCBhbmQgcG9pbnQKK3RoYXQgZGVzY3JpcHRvcidzIGxpbmsgdG8gdGhlIGNvbXBsZXggY29tbWFuZC4KKworQW4gYWRkaXRpb25hbCBjb21wbGV4aXR5IG9mIHRoZXNlIG5vbi10cmFuc21pdCBjb21tYW5kcyBhcmUgdGhhdCB0aGV5IG1heSBiZQorYWRkZWQgYXN5bmNocm9ub3VzIHRvIHRoZSBub3JtYWwgdHJhbnNtaXQgcXVldWUsIHNvIHdlIGRpc2FibGUgaW50ZXJydXB0cword2hlbmV2ZXIgdGhlIFR4IGRlc2NyaXB0b3IgcmluZyBpcyBtYW5pcHVsYXRlZC4KKworQSBub3RhYmxlIGFzcGVjdCBvZiB0aGVzZSBzcGVjaWFsIGNvbmZpZ3VyZSBjb21tYW5kcyBpcyB0aGF0IHRoZXkgZG8KK3dvcmsgd2l0aCB0aGUgbm9ybWFsIFR4IHJpbmcgZW50cnkgc2NhdmVuZ2UgbWV0aG9kLiAgVGhlIFR4IHJpbmcgc2NhdmVuZ2UKK2lzIGRvbmUgYXQgaW50ZXJydXB0IHRpbWUgdXNpbmcgdGhlICdkaXJ0eV90eCcgaW5kZXgsIGFuZCBjaGVja2luZyBmb3IgdGhlCitjb21tYW5kLWNvbXBsZXRlIGJpdC4gIFdoaWxlIHRoZSBzZXR1cCBmcmFtZXMgbWF5IGhhdmUgdGhlIE5vT3AgY29tbWFuZCBvbiB0aGUKK1R4IHJpbmcgbWFya2VkIGFzIGNvbXBsZXRlLCBidXQgbm90IGhhdmUgY29tcGxldGVkIHRoZSBzZXR1cCBjb21tYW5kLCB0aGlzCitpcyBub3QgYSBwcm9ibGVtLiAgVGhlIHR4X3JpbmcgZW50cnkgY2FuIGJlIHN0aWxsIHNhZmVseSByZXVzZWQsIGFzIHRoZQordHhfc2tidWZmW10gZW50cnkgaXMgYWx3YXlzIGVtcHR5IGZvciBjb25maWdfY21kIGFuZCBtY19zZXR1cCBmcmFtZXMuCisKK0NvbW1hbmRzIG1heSBoYXZlIGJpdHMgc2V0IGUuZy4gQ21kU3VzcGVuZCBpbiB0aGUgY29tbWFuZCB3b3JkIHRvIGVpdGhlcgorc3VzcGVuZCBvciBzdG9wIHRoZSB0cmFuc21pdC9jb21tYW5kIHVuaXQuICBUaGlzIGRyaXZlciBhbHdheXMgZmxhZ3MgdGhlIGxhc3QKK2NvbW1hbmQgd2l0aCBDbWRTdXNwZW5kLCBlcmFzZXMgdGhlIENtZFN1c3BlbmQgaW4gdGhlIHByZXZpb3VzIGNvbW1hbmQsIGFuZAordGhlbiBpc3N1ZXMgYSBDVV9SRVNVTUUuCitOb3RlOiBXYXRjaCBvdXQgZm9yIHRoZSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24gaGVyZTogaW1hZ2luZQorCWVyYXNpbmcgdGhlIHByZXZpb3VzIHN1c3BlbmQKKwkJdGhlIGNoaXAgcHJvY2Vzc2VzIHRoZSBwcmV2aW91cyBjb21tYW5kCisJCXRoZSBjaGlwIHByb2Nlc3NlcyB0aGUgZmluYWwgY29tbWFuZCwgYW5kIHN1c3BlbmRzCisJZG9pbmcgdGhlIENVX1JFU1VNRQorCQl0aGUgY2hpcCBwcm9jZXNzZXMgdGhlIG5leHQteWV0LXZhbGlkIHBvc3QtZmluYWwtY29tbWFuZC4KK1NvIGJsaW5kbHkgc2VuZGluZyBhIENVX1JFU1VNRSBpcyBvbmx5IHNhZmUgaWYgd2UgZG8gaXQgaW1tZWRpYXRlbHkgYWZ0ZXIKK2FmdGVyIGVyYXNpbmcgdGhlIHByZXZpb3VzIENtZFN1c3BlbmQsIHdpdGhvdXQgdGhlIHBvc3NpYmlsaXR5IG9mIGFuCitpbnRlcnZlbmluZyBkZWxheS4gIFRodXMgdGhlIHJlc3VtZSBjb21tYW5kIGlzIGFsd2F5cyB3aXRoaW4gdGhlCitpbnRlcnJ1cHRzLWRpc2FibGVkIHJlZ2lvbi4gIFRoaXMgaXMgYSB0aW1pbmcgZGVwZW5kZW5jZSwgYnV0IGhhbmRsaW5nIHRoaXMKK2NvbmRpdGlvbiBpbiBhIHRpbWluZy1pbmRlcGVuZGVudCB3YXkgd291bGQgY29uc2lkZXJhYmx5IGNvbXBsaWNhdGUgdGhlIGNvZGUuCisKK05vdGU6IEluIHByZXZpb3VzIGdlbmVyYXRpb24gSW50ZWwgY2hpcHMsIHJlc3RhcnRpbmcgdGhlIGNvbW1hbmQgdW5pdCB3YXMgYQorbm90b3Jpb3VzbHkgc2xvdyBwcm9jZXNzLiAgVGhpcyBpcyBwcmVzdW1hYmx5IG5vIGxvbmdlciB0cnVlLgorCitJSUlDLiBSZWNlaXZlIHN0cnVjdHVyZQorCitCZWNhdXNlIG9mIHRoZSBidXMtbWFzdGVyIHN1cHBvcnQgb24gdGhlIFNwZWVkbzMgdGhpcyBkcml2ZXIgdXNlcyB0aGUgbmV3CitTS0JVRkZfUlhfQ09QWUJSRUFLIHNjaGVtZSwgcmF0aGVyIHRoYW4gYSBmaXhlZCBpbnRlcm1lZGlhdGUgcmVjZWl2ZSBidWZmZXIuCitUaGlzIHNjaGVtZSBhbGxvY2F0ZXMgZnVsbC1zaXplZCBza2J1ZmZzIGFzIHJlY2VpdmUgYnVmZmVycy4gIFRoZSB2YWx1ZQorU0tCVUZGX1JYX0NPUFlCUkVBSyBpcyB1c2VkIGFzIHRoZSBjb3B5aW5nIGJyZWFrcG9pbnQ6IGl0IGlzIGNob3NlbiB0bwordHJhZGUtb2ZmIHRoZSBtZW1vcnkgd2FzdGVkIGJ5IHBhc3NpbmcgdGhlIGZ1bGwtc2l6ZWQgc2tidWZmIHRvIHRoZSBxdWV1ZQorbGF5ZXIgZm9yIGFsbCBmcmFtZXMgdnMuIHRoZSBjb3B5aW5nIGNvc3Qgb2YgY29weWluZyBhIGZyYW1lIHRvIGEKK2NvcnJlY3RseS1zaXplZCBza2J1ZmYuCisKK0ZvciBzbWFsbCBmcmFtZXMgdGhlIGNvcHlpbmcgY29zdCBpcyBuZWdsaWdpYmxlIChlc3AuIGNvbnNpZGVyaW5nIHRoYXQgd2UKK2FyZSBwcmUtbG9hZGluZyB0aGUgY2FjaGUgd2l0aCBpbW1lZGlhdGVseSB1c2VmdWwgaGVhZGVyIGluZm9ybWF0aW9uKSwgc28gd2UKK2FsbG9jYXRlIGEgbmV3LCBtaW5pbWFsbHktc2l6ZWQgc2tidWZmLiAgRm9yIGxhcmdlIGZyYW1lcyB0aGUgY29weWluZyBjb3N0CitpcyBub24tdHJpdmlhbCwgYW5kIHRoZSBsYXJnZXIgY29weSBtaWdodCBmbHVzaCB0aGUgY2FjaGUgb2YgdXNlZnVsIGRhdGEsIHNvCit3ZSBwYXNzIHVwIHRoZSBza2J1ZmYgdGhlIHBhY2tldCB3YXMgcmVjZWl2ZWQgaW50by4KKworSVYuIE5vdGVzCisKK1RoYW5rcyB0byBTdGV2ZSBXaWxsaWFtcyBvZiBJbnRlbCBmb3IgYXJyYW5naW5nIHRoZSBub24tZGlzY2xvc3VyZSBhZ3JlZW1lbnQKK3RoYXQgc3RhdGVkIHRoYXQgSSBjb3VsZCBkaXNjbG9zZSB0aGUgaW5mb3JtYXRpb24uICBCdXQgSSBzdGlsbCByZXNlbnQKK2hhdmluZyB0byBzaWduIGFuIEludGVsIE5EQSB3aGVuIEknbSBoZWxwaW5nIEludGVsIHNlbGwgdGhlaXIgb3duIHByb2R1Y3QhCisKKyovCisKK3N0YXRpYyBpbnQgc3BlZWRvX2ZvdW5kMShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBmbmRfY250LCBpbnQgYWNwaV9pZGxlX3N0YXRlKTsKKworZW51bSBwY2lfZmxhZ3NfYml0IHsKKwlQQ0lfVVNFU19JTz0xLCBQQ0lfVVNFU19NRU09MiwgUENJX1VTRVNfTUFTVEVSPTQsCisJUENJX0FERFIwPTB4MTA8PDAsIFBDSV9BRERSMT0weDEwPDwxLCBQQ0lfQUREUjI9MHgxMDw8MiwgUENJX0FERFIzPTB4MTA8PDMsCit9OworCisvKiBPZmZzZXRzIHRvIHRoZSB2YXJpb3VzIHJlZ2lzdGVycy4KKyAgIEFsbCBhY2Nlc3NlcyBuZWVkIG5vdCBiZSBsb25nd29yZCBhbGlnbmVkLiAqLworZW51bSBzcGVlZG9fb2Zmc2V0cyB7CisJU0NCU3RhdHVzID0gMCwgU0NCQ21kID0gMiwJLyogUngvQ29tbWFuZCBVbml0IGNvbW1hbmQgYW5kIHN0YXR1cy4gKi8KKwlTQ0JJbnRtYXNrID0gMywKKwlTQ0JQb2ludGVyID0gNCwJCQkJLyogR2VuZXJhbCBwdXJwb3NlIHBvaW50ZXIuICovCisJU0NCUG9ydCA9IDgsCQkJCS8qIE1pc2MuIGNvbW1hbmRzIGFuZCBvcGVyYW5kcy4gICovCisJU0NCZmxhc2ggPSAxMiwgU0NCZWVwcm9tID0gMTQsIC8qIEVFUFJPTSBhbmQgZmxhc2ggbWVtb3J5IGNvbnRyb2wuICovCisJU0NCQ3RybE1ESSA9IDE2LAkJCS8qIE1ESSBpbnRlcmZhY2UgY29udHJvbC4gKi8KKwlTQ0JFYXJseVJ4ID0gMjAsCQkJLyogRWFybHkgcmVjZWl2ZSBieXRlIGNvdW50LiAqLworfTsKKy8qIENvbW1hbmRzIHRoYXQgY2FuIGJlIHB1dCBpbiBhIGNvbW1hbmQgbGlzdCBlbnRyeS4gKi8KK2VudW0gY29tbWFuZHMgeworCUNtZE5PcCA9IDAsIENtZElBU2V0dXAgPSAweDEwMDAwLCBDbWRDb25maWd1cmUgPSAweDIwMDAwLAorCUNtZE11bHRpY2FzdExpc3QgPSAweDMwMDAwLCBDbWRUeCA9IDB4NDAwMDAsIENtZFREUiA9IDB4NTAwMDAsCisJQ21kRHVtcCA9IDB4NjAwMDAsIENtZERpYWdub3NlID0gMHg3MDAwMCwKKwlDbWRTdXNwZW5kID0gMHg0MDAwMDAwMCwJLyogU3VzcGVuZCBhZnRlciBjb21wbGV0aW9uLiAqLworCUNtZEludHIgPSAweDIwMDAwMDAwLAkJLyogSW50ZXJydXB0IGFmdGVyIGNvbXBsZXRpb24uICovCisJQ21kVHhGbGV4ID0gMHgwMDA4MDAwMCwJCS8qIFVzZSAiRmxleGlibGUgbW9kZSIgZm9yIENtZFR4IGNvbW1hbmQuICovCit9OworLyogQ2xlYXIgQ21kU3VzcGVuZCAoMTw8MzApIGF2b2lkaW5nIGludGVyZmVyZW5jZSB3aXRoIHRoZSBjYXJkIGFjY2VzcyB0byB0aGUKKyAgIHN0YXR1cyBiaXRzLiAgUHJldmlvdXMgZHJpdmVyIHZlcnNpb25zIHVzZWQgc2VwYXJhdGUgMTYgYml0IGZpZWxkcyBmb3IKKyAgIGNvbW1hbmRzIGFuZCBzdGF0dXNlcy4gIC0tU0FXCisgKi8KKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykKKyMgZGVmaW5lIGNsZWFyX3N1c3BlbmQoY21kKSAgY2xlYXJfYml0KDMwLCAmKGNtZCktPmNtZF9zdGF0dXMpOworI2Vsc2UKKyMgaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisjICBkZWZpbmUgY2xlYXJfc3VzcGVuZChjbWQpICAoKF9fdTE2ICopJihjbWQpLT5jbWRfc3RhdHVzKVsxXSAmPSB+MHg0MDAwCisjIGVsaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisjICBkZWZpbmUgY2xlYXJfc3VzcGVuZChjbWQpICAoKF9fdTE2ICopJihjbWQpLT5jbWRfc3RhdHVzKVsxXSAmPSB+MHgwMDQwCisjIGVsc2UKKyMgIGVycm9yIFVuc3VwcG9ydGVkIGJ5dGVvcmRlcgorIyBlbmRpZgorI2VuZGlmCisKK2VudW0gU0NCQ21kQml0cyB7CisJU0NCTWFza0NtZERvbmU9MHg4MDAwLCBTQ0JNYXNrUnhEb25lPTB4NDAwMCwgU0NCTWFza0NtZElkbGU9MHgyMDAwLAorCVNDQk1hc2tSeFN1c3BlbmQ9MHgxMDAwLCBTQ0JNYXNrRWFybHlSeD0weDA4MDAsIFNDQk1hc2tGbG93Q3RsPTB4MDQwMCwKKwlTQ0JUcmlnZ2VySW50cj0weDAyMDAsIFNDQk1hc2tBbGw9MHgwMTAwLAorCS8qIFRoZSByZXN0IGFyZSBSeCBhbmQgVHggY29tbWFuZHMuICovCisJQ1VTdGFydD0weDAwMTAsIENVUmVzdW1lPTB4MDAyMCwgQ1VTdGF0c0FkZHI9MHgwMDQwLCBDVVNob3dTdGF0cz0weDAwNTAsCisJQ1VDbWRCYXNlPTB4MDA2MCwJLyogQ1UgQmFzZSBhZGRyZXNzIChzZXQgdG8gemVybykgLiAqLworCUNVRHVtcFN0YXRzPTB4MDA3MCwgLyogRHVtcCB0aGVuIHJlc2V0IHN0YXRzIGNvdW50ZXJzLiAqLworCVJ4U3RhcnQ9MHgwMDAxLCBSeFJlc3VtZT0weDAwMDIsIFJ4QWJvcnQ9MHgwMDA0LCBSeEFkZHJMb2FkPTB4MDAwNiwKKwlSeFJlc3VtZU5vUmVzb3VyY2VzPTB4MDAwNywKK307CisKK2VudW0gU0NCUG9ydF9jbWRzIHsKKwlQb3J0UmVzZXQ9MCwgUG9ydFNlbGZUZXN0PTEsIFBvcnRQYXJ0aWFsUmVzZXQ9MiwgUG9ydER1bXA9MywKK307CisKKy8qIFRoZSBTcGVlZG8zIFJ4IGFuZCBUeCBmcmFtZS9idWZmZXIgZGVzY3JpcHRvcnMuICovCitzdHJ1Y3QgZGVzY3JpcHRvciB7CQkJICAgIC8qIEEgZ2VuZXJpYyBkZXNjcmlwdG9yLiAqLworCXZvbGF0aWxlIHMzMiBjbWRfc3RhdHVzOwkvKiBBbGwgY29tbWFuZCBhbmQgc3RhdHVzIGZpZWxkcy4gKi8KKwl1MzIgbGluazsJCQkJICAgIC8qIHN0cnVjdCBkZXNjcmlwdG9yICogICovCisJdW5zaWduZWQgY2hhciBwYXJhbXNbMF07Cit9OworCisvKiBUaGUgU3BlZWRvMyBSeCBhbmQgVHggYnVmZmVyIGRlc2NyaXB0b3JzLiAqLworc3RydWN0IFJ4RkQgewkJCQkJLyogUmVjZWl2ZSBmcmFtZSBkZXNjcmlwdG9yLiAqLworCXZvbGF0aWxlIHMzMiBzdGF0dXM7CisJdTMyIGxpbms7CQkJCQkvKiBzdHJ1Y3QgUnhGRCAqICovCisJdTMyIHJ4X2J1Zl9hZGRyOwkJCS8qIHZvaWQgKiAqLworCXUzMiBjb3VudDsKK30gUnhGRF9BTElHTk1FTlQ7CisKKy8qIFNlbGVjdGVkIGVsZW1lbnRzIG9mIHRoZSBUeC9SeEZELnN0YXR1cyB3b3JkLiAqLworZW51bSBSeEZEX2JpdHMgeworCVJ4Q29tcGxldGU9MHg4MDAwLCBSeE9LPTB4MjAwMCwKKwlSeEVyckNSQz0weDA4MDAsIFJ4RXJyQWxpZ249MHgwNDAwLCBSeEVyclRvb0JpZz0weDAyMDAsIFJ4RXJyU3ltYm9sPTB4MDAxMCwKKwlSeEV0aDJUeXBlPTB4MDAyMCwgUnhOb01hdGNoPTB4MDAwNCwgUnhOb0lBTWF0Y2g9MHgwMDAyLAorCVR4VW5kZXJydW49MHgxMDAwLCAgU3RhdHVzQ29tcGxldGU9MHg4MDAwLAorfTsKKworI2RlZmluZSBDT05GSUdfREFUQV9TSVpFIDIyCitzdHJ1Y3QgVHhGRCB7CQkJCQkvKiBUcmFuc21pdCBmcmFtZSBkZXNjcmlwdG9yIHNldC4gKi8KKwlzMzIgc3RhdHVzOworCXUzMiBsaW5rOwkJCQkJLyogdm9pZCAqICovCisJdTMyIHR4X2Rlc2NfYWRkcjsJCQkvKiBBbHdheXMgcG9pbnRzIHRvIHRoZSB0eF9idWZfYWRkciBlbGVtZW50LiAqLworCXMzMiBjb3VudDsJCQkJCS8qICMgb2YgVEJEICg9MSksIFR4IHN0YXJ0IHRocmVzaC4sIGV0Yy4gKi8KKwkvKiBUaGlzIGNvbnN0aXR1dGVzIHR3byAiVEJEIiBlbnRyaWVzIC0tIHdlIG9ubHkgdXNlIG9uZS4gKi8KKyNkZWZpbmUgVFhfREVTQ1JfQlVGX09GRlNFVCAxNgorCXUzMiB0eF9idWZfYWRkcjA7CQkJLyogdm9pZCAqLCBmcmFtZSB0byBiZSB0cmFuc21pdHRlZC4gICovCisJczMyIHR4X2J1Zl9zaXplMDsJCQkvKiBMZW5ndGggb2YgVHggZnJhbWUuICovCisJdTMyIHR4X2J1Zl9hZGRyMTsJCQkvKiB2b2lkICosIGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkLiAgKi8KKwlzMzIgdHhfYnVmX3NpemUxOwkJCS8qIExlbmd0aCBvZiBUeCBmcmFtZS4gKi8KKwkvKiB0aGUgc3RydWN0dXJlIG11c3QgaGF2ZSBzcGFjZSBmb3IgYXQgbGVhc3QgQ09ORklHX0RBVEFfU0laRSBzdGFydGluZworCSAqIGZyb20gdHhfZGVzY19hZGRyIGZpZWxkICovCit9OworCisvKiBNdWx0aWNhc3QgZmlsdGVyIHNldHRpbmcgYmxvY2suICAtLVNBVyAqLworc3RydWN0IHNwZWVkb19tY19ibG9jayB7CisJc3RydWN0IHNwZWVkb19tY19ibG9jayAqbmV4dDsKKwl1bnNpZ25lZCBpbnQgdHg7CisJZG1hX2FkZHJfdCBmcmFtZV9kbWE7CisJdW5zaWduZWQgaW50IGxlbjsKKwlzdHJ1Y3QgZGVzY3JpcHRvciBmcmFtZSBfX2F0dHJpYnV0ZV9fICgoX19hbGlnbmVkX18oMTYpKSk7Cit9OworCisvKiBFbGVtZW50cyBvZiB0aGUgZHVtcF9zdGF0aXN0aWNzIGJsb2NrLiBUaGlzIGJsb2NrIG11c3QgYmUgbHdvcmQgYWxpZ25lZC4gKi8KK3N0cnVjdCBzcGVlZG9fc3RhdHMgeworCXUzMiB0eF9nb29kX2ZyYW1lczsKKwl1MzIgdHhfY29sbDE2X2VycnM7CisJdTMyIHR4X2xhdGVfY29sbHM7CisJdTMyIHR4X3VuZGVycnVuczsKKwl1MzIgdHhfbG9zdF9jYXJyaWVyOworCXUzMiB0eF9kZWZlcnJlZDsKKwl1MzIgdHhfb25lX2NvbGxzOworCXUzMiB0eF9tdWx0aV9jb2xsczsKKwl1MzIgdHhfdG90YWxfY29sbHM7CisJdTMyIHJ4X2dvb2RfZnJhbWVzOworCXUzMiByeF9jcmNfZXJyczsKKwl1MzIgcnhfYWxpZ25fZXJyczsKKwl1MzIgcnhfcmVzb3VyY2VfZXJyczsKKwl1MzIgcnhfb3ZlcnJ1bl9lcnJzOworCXUzMiByeF9jb2xsc19lcnJzOworCXUzMiByeF9ydW50X2VycnM7CisJdTMyIGRvbmVfbWFya2VyOworfTsKKworZW51bSBSeF9yaW5nX3N0YXRlX2JpdHMgeworCVJyTm9NZW09MSwgUnJQb3N0cG9uZWQ9MiwgUnJOb1Jlc291cmNlcz00LCBSck9PTVJlcG9ydGVkPTgsCit9OworCisvKiBEbyBub3QgY2hhbmdlIHRoZSBwb3NpdGlvbiAoYWxpZ25tZW50KSBvZiB0aGUgZmlyc3QgZmV3IGVsZW1lbnRzIQorICAgVGhlIGxhdGVyIGVsZW1lbnRzIGFyZSBncm91cGVkIGZvciBjYWNoZSBsb2NhbGl0eS4KKworICAgVW5mb3J0dW5hdGVseSwgYWxsIHRoZSBwb3NpdGlvbnMgaGF2ZSBiZWVuIHNoaWZ0ZWQgc2luY2UgdGhlcmUuCisgICBBIG5ldyByZS1hbGlnbm1lbnQgaXMgcmVxdWlyZWQuICAyMDAwLzAzLzA2ICBTQVcgKi8KK3N0cnVjdCBzcGVlZG9fcHJpdmF0ZSB7CisgICAgdm9pZCBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBUeEZECSp0eF9yaW5nOwkJLyogQ29tbWFuZHMgKHVzdWFsbHkgQ21kVHhQYWNrZXQpLiAqLworCXN0cnVjdCBSeEZEICpyeF9yaW5ncFtSWF9SSU5HX1NJWkVdOwkvKiBSeCBkZXNjcmlwdG9yLCB1c2VkIGFzIHJpbmcuICovCisJLyogVGhlIGFkZHJlc3NlcyBvZiBhIFR4L1J4LWluLXBsYWNlIHBhY2tldHMvYnVmZmVycy4gKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tidWZmW1RYX1JJTkdfU0laRV07CisJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYnVmZltSWF9SSU5HX1NJWkVdOworCS8qIE1hcHBlZCBhZGRyZXNzZXMgb2YgdGhlIHJpbmdzLiAqLworCWRtYV9hZGRyX3QgdHhfcmluZ19kbWE7CisjZGVmaW5lIFRYX1JJTkdfRUxFTV9ETUEoc3AsIG4pICgoc3ApLT50eF9yaW5nX2RtYSArIChuKSpzaXplb2Yoc3RydWN0IFR4RkQpKQorCWRtYV9hZGRyX3QgcnhfcmluZ19kbWFbUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3QgZGVzY3JpcHRvciAqbGFzdF9jbWQ7CQkvKiBMYXN0IGNvbW1hbmQgc2VudC4gKi8KKwl1bnNpZ25lZCBpbnQgY3VyX3R4LCBkaXJ0eV90eDsJCS8qIFRoZSByaW5nIGVudHJpZXMgdG8gYmUgZnJlZSgpZWQuICovCisJc3BpbmxvY2tfdCBsb2NrOwkJCS8qIEdyb3VwIHdpdGggVHggY29udHJvbCBjYWNoZSBsaW5lLiAqLworCXUzMiB0eF90aHJlc2hvbGQ7CQkJLyogVGhlIHZhbHVlIGZvciB0eGRlc2MuY291bnQuICovCisJc3RydWN0IFJ4RkQgKmxhc3RfcnhmOwkJCS8qIExhc3QgZmlsbGVkIFJYIGJ1ZmZlci4gKi8KKwlkbWFfYWRkcl90IGxhc3RfcnhmX2RtYTsKKwl1bnNpZ25lZCBpbnQgY3VyX3J4LCBkaXJ0eV9yeDsJCS8qIFRoZSBuZXh0IGZyZWUgcmluZyBlbnRyeSAqLworCWxvbmcgbGFzdF9yeF90aW1lOwkJCS8qIExhc3QgUngsIGluIGppZmZpZXMsIHRvIGhhbmRsZSBSeCBoYW5nLiAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBzcGVlZG9fc3RhdHMgKmxzdGF0czsKKwlkbWFfYWRkcl90IGxzdGF0c19kbWE7CisJaW50IGNoaXBfaWQ7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CQkvKiBNZWRpYSBzZWxlY3Rpb24gdGltZXIuICovCisJc3RydWN0IHNwZWVkb19tY19ibG9jayAqbWNfc2V0dXBfaGVhZDsJLyogTXVsdGljYXN0IHNldHVwIGZyYW1lIGxpc3QgaGVhZC4gKi8KKwlzdHJ1Y3Qgc3BlZWRvX21jX2Jsb2NrICptY19zZXR1cF90YWlsOwkvKiBNdWx0aWNhc3Qgc2V0dXAgZnJhbWUgbGlzdCB0YWlsLiAqLworCWxvbmcgaW5faW50ZXJydXB0OwkJCS8qIFdvcmQtYWxpZ25lZCBkZXYtPmludGVycnVwdCAqLworCXVuc2lnbmVkIGNoYXIgYWNwaV9wd3I7CisJc2lnbmVkIGNoYXIgcnhfbW9kZTsJCQkvKiBDdXJyZW50IFBST01JU0MvQUxMTVVMVEkgc2V0dGluZy4gKi8KKwl1bnNpZ25lZCBpbnQgdHhfZnVsbDoxOwkJCS8qIFRoZSBUeCBxdWV1ZSBpcyBmdWxsLiAqLworCXVuc2lnbmVkIGludCBmbG93X2N0cmw6MTsJCS8qIFVzZSA4MDIuM3ggZmxvdyBjb250cm9sLiAqLworCXVuc2lnbmVkIGludCByeF9idWc6MTsJCQkvKiBXb3JrIGFyb3VuZCByZWNlaXZlciBoYW5nIGVycmF0YS4gKi8KKwl1bnNpZ25lZCBjaGFyIGRlZmF1bHRfcG9ydDo4OwkJLyogTGFzdCBkZXYtPmlmX3BvcnQgdmFsdWUuICovCisJdW5zaWduZWQgY2hhciByeF9yaW5nX3N0YXRlOwkJLyogUlggcmluZyBzdGF0dXMgZmxhZ3MuICovCisJdW5zaWduZWQgc2hvcnQgcGh5WzJdOwkJCS8qIFBIWSBtZWRpYSBpbnRlcmZhY2VzIGF2YWlsYWJsZS4gKi8KKwl1bnNpZ25lZCBzaG9ydCBwYXJ0bmVyOwkJCS8qIExpbmsgcGFydG5lciBjYXBzLiAqLworCXN0cnVjdCBtaWlfaWZfaW5mbyBtaWlfaWY7CQkvKiBNSUkgQVBJIGhvb2tzLCBpbmZvICovCisJdTMyIG1zZ19lbmFibGU7CQkJCS8qIGRlYnVnIG1lc3NhZ2UgbGV2ZWwgKi8KK307CisKKy8qIFRoZSBwYXJhbWV0ZXJzIGZvciBhIENtZENvbmZpZ3VyZSBvcGVyYXRpb24uCisgICBUaGVyZSBhcmUgc28gbWFueSBvcHRpb25zIHRoYXQgaXQgd291bGQgYmUgZGlmZmljdWx0IHRvIGRvY3VtZW50IGVhY2ggYml0LgorICAgV2UgbW9zdGx5IHVzZSB0aGUgZGVmYXVsdCBvciByZWNvbW1lbmRlZCBzZXR0aW5ncy4gKi8KK3N0YXRpYyBjb25zdCBjaGFyIGk4MjU1N19jb25maWdfY21kW0NPTkZJR19EQVRBX1NJWkVdID0geworCTIyLCAweDA4LCAwLCAwLCAgMCwgMCwgMHgzMiwgMHgwMywgIDEsIC8qIDE9VXNlIE1JSSAgMD1Vc2UgQVVJICovCisJMCwgMHgyRSwgMCwgIDB4NjAsIDAsCisJMHhmMiwgMHg0OCwgICAwLCAweDQwLCAweGYyLCAweDgwLCAJCS8qIDB4NDA9Rm9yY2UgZnVsbC1kdXBsZXggKi8KKwkweDNmLCAweDA1LCB9Oworc3RhdGljIGNvbnN0IGNoYXIgaTgyNTU4X2NvbmZpZ19jbWRbQ09ORklHX0RBVEFfU0laRV0gPSB7CisJMjIsIDB4MDgsIDAsIDEsICAwLCAwLCAweDIyLCAweDAzLCAgMSwgLyogMT1Vc2UgTUlJICAwPVVzZSBBVUkgKi8KKwkwLCAweDJFLCAwLCAgMHg2MCwgMHgwOCwgMHg4OCwKKwkweDY4LCAwLCAweDQwLCAweGYyLCAweDg0LAkJLyogRGlzYWJsZSBGQyAqLworCTB4MzEsIDB4MDUsIH07CisKKy8qIFBIWSBtZWRpYSBpbnRlcmZhY2UgY2hpcHMuICovCitzdGF0aWMgY29uc3QgY2hhciAqcGh5c1tdID0geworCSJOb25lIiwgImk4MjU1My1BL0IiLCAiaTgyNTUzLUMiLCAiaTgyNTAzIiwKKwkiRFA4Mzg0MCIsICI4MGMyNDAiLCAiODBjMjQiLCAiaTgyNTU1IiwKKwkidW5rbm93bi04IiwgInVua25vd24tOSIsICJEUDgzODQwQSIsICJ1bmtub3duLTExIiwKKwkidW5rbm93bi0xMiIsICJ1bmtub3duLTEzIiwgInVua25vd24tMTQiLCAidW5rbm93bi0xNSIsIH07CitlbnVtIHBoeV9jaGlwcyB7IE5vblN1Y2hQaHk9MCwgSTgyNTUzQUIsIEk4MjU1M0MsIEk4MjUwMywgRFA4Mzg0MCwgUzgwQzI0MCwKKwkJCQkJIFM4MEMyNCwgSTgyNTU1LCBEUDgzODQwQT0xMCwgfTsKK3N0YXRpYyBjb25zdCBjaGFyIGlzX21paVtdID0geyAwLCAxLCAxLCAwLCAxLCAxLCAwLCAxIH07CisjZGVmaW5lIEVFX1JFQURfQ01ECQkoNikKKworc3RhdGljIGludCBlZXBybzEwMF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CisKK3N0YXRpYyBpbnQgZG9fZWVwcm9tX2NtZCh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IGNtZCwgaW50IGNtZF9sZW4pOworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpOworc3RhdGljIGludCBzcGVlZG9fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNwZWVkb19yZXN1bWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzcGVlZG9fdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHNwZWVkb19pbml0X3J4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzcGVlZG9fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc3BlZWRvX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzcGVlZG9fcmVmaWxsX3J4X2J1ZmZlcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZvcmNlKTsKK3N0YXRpYyBpbnQgc3BlZWRvX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc3BlZWRvX3R4X2J1ZmZlcl9nYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBzcGVlZG9faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCBzcGVlZG9fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNwZWVkb19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNwZWVkb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc3BlZWRvX3Nob3dfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzOworCisMCisKKyNpZmRlZiBob25vcl9kZWZhdWx0X3BvcnQKKy8qIE9wdGlvbmFsIGRyaXZlciBmZWF0dXJlIHRvIGFsbG93IGZvcmNpbmcgdGhlIHRyYW5zY2VpdmVyIHNldHRpbmcuCisgICBOb3QgcmVjb21tZW5kZWQuICovCitzdGF0aWMgaW50IG1paV9jdHJsWzhdID0geyAweDMzMDAsIDB4MzEwMCwgMHgwMDAwLCAweDAxMDAsCisJCQkJCQkgICAweDIwMDAsIDB4MjEwMCwgMHgwNDAwLCAweDMxMDB9OworI2VuZGlmCisKKy8qIEhvdyB0byB3YWl0IGZvciB0aGUgY29tbWFuZCB1bml0IHRvIGFjY2VwdCBhIGNvbW1hbmQuCisgICBUeXBpY2FsbHkgdGhpcyB0YWtlcyAwIHRpY2tzLiAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHdhaXRfZm9yX2NtZF9kb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkJCQkJCSAgCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3ApCit7CisJaW50IHdhaXQgPSAxMDAwOworCXZvaWQgX19pb21lbSAqY21kX2lvYWRkciA9IHNwLT5yZWdzICsgU0NCQ21kOworCXVuc2lnbmVkIGNoYXIgcjsKKworCWRvICB7CisJCXVkZWxheSgxKTsKKwkJciA9IGlvcmVhZDgoY21kX2lvYWRkcik7CisJfSB3aGlsZShyICYmIC0td2FpdCA+PSAwKTsKKworCWlmICh3YWl0IDwgMCkKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiB3YWl0X2Zvcl9jbWRfZG9uZSB0aW1lb3V0IVxuIiwgZGV2LT5uYW1lKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZWVwcm8xMDBfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCWludCBpcnEsIHBjaV9iYXI7CisJaW50IGFjcGlfaWRsZV9zdGF0ZSA9IDAsIHBtOworCXN0YXRpYyBpbnQgY2FyZHNfZm91bmQgLyogPSAwICovOworCXVuc2lnbmVkIGxvbmcgcGNpX2Jhc2U7CisKKyNpZm5kZWYgTU9EVUxFCisJLyogd2hlbiBidWlsdC1pbiwgd2Ugb25seSBwcmludCB2ZXJzaW9uIGlmIGRldmljZSBpcyBmb3VuZCAqLworCXN0YXRpYyBpbnQgZGlkX3ZlcnNpb247CisJaWYgKGRpZF92ZXJzaW9uKysgPT0gMCkKKwkJcHJpbnRrKHZlcnNpb24pOworI2VuZGlmCisKKwkvKiBzYXZlIHBvd2VyIHN0YXRlIGJlZm9yZSBwY2lfZW5hYmxlX2RldmljZSBvdmVyd3JpdGVzIGl0ICovCisJcG0gPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfUE0pOworCWlmIChwbSkgeworCQl1MTYgcHdyX2NvbW1hbmQ7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIHBtICsgUENJX1BNX0NUUkwsICZwd3JfY29tbWFuZCk7CisJCWFjcGlfaWRsZV9zdGF0ZSA9IHB3cl9jb21tYW5kICYgUENJX1BNX0NUUkxfU1RBVEVfTUFTSzsKKwl9CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCWdvdG8gZXJyX291dF9mcmVlX21taW9fcmVnaW9uOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKSwKKwkJCXBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSksICJlZXBybzEwMCIpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgImVlcHJvMTAwOiBjYW5ub3QgcmVzZXJ2ZSBJL08gcG9ydHNcbiIpOworCQlnb3RvIGVycl9vdXRfbm9uZTsKKwl9CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAorCQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSwgImVlcHJvMTAwIikpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiZWVwcm8xMDA6IGNhbm5vdCByZXNlcnZlIE1NSU8gcmVnaW9uXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfcGlvX3JlZ2lvbjsKKwl9CisKKwlpcnEgPSBwZGV2LT5pcnE7CisJcGNpX2JhciA9IHVzZV9pbyA/IDEgOiAwOworCXBjaV9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIHBjaV9iYXIpOworCWlmIChERUJVRyAmIE5FVElGX01TR19QUk9CRSkKKwkJcHJpbnRrKCJGb3VuZCBJbnRlbCBpODI1NTcgUENJIFNwZWVkbyBhdCAlI2x4LCBJUlEgJWQuXG4iLAorCQkgICAgICAgcGNpX2Jhc2UsIGlycSk7CisKKwlpb2FkZHIgPSBwY2lfaW9tYXAocGRldiwgcGNpX2JhciwgMCk7CisJaWYgKCFpb2FkZHIpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiZWVwcm8xMDA6IGNhbm5vdCByZW1hcCBJT1xuIik7CisJCWdvdG8gZXJyX291dF9mcmVlX21taW9fcmVnaW9uOworCX0KKworCWlmIChzcGVlZG9fZm91bmQxKHBkZXYsIGlvYWRkciwgY2FyZHNfZm91bmQsIGFjcGlfaWRsZV9zdGF0ZSkgPT0gMCkKKwkJY2FyZHNfZm91bmQrKzsKKwllbHNlCisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfaW91bm1hcDogOworCXBjaV9pb3VubWFwKHBkZXYsIGlvYWRkcik7CitlcnJfb3V0X2ZyZWVfbW1pb19yZWdpb246CisJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7CitlcnJfb3V0X2ZyZWVfcGlvX3JlZ2lvbjoKKwlyZWxlYXNlX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSksIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkpOworZXJyX291dF9ub25lOgorCXJldHVybiAtRU5PREVWOworfQorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKy8qCisgKiBQb2xsaW5nICdpbnRlcnJ1cHQnIC0gdXNlZCBieSB0aGluZ3MgbGlrZSBuZXRjb25zb2xlIHRvIHNlbmQgc2ticworICogd2l0aG91dCBoYXZpbmcgdG8gcmUtZW5hYmxlIGludGVycnVwdHMuIEl0J3Mgbm90IGNhbGxlZCB3aGlsZQorICogdGhlIGludGVycnVwdCByb3V0aW5lIGlzIGV4ZWN1dGluZy4KKyAqLworCitzdGF0aWMgdm9pZCBwb2xsX3NwZWVkbyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBkaXNhYmxlX2lycSBpcyBub3QgdmVyeSBuaWNlLCBidXQgd2l0aCB0aGUgZnVubnkgbG9ja2xlc3MgZGVzaWduCisJICAgd2UgaGF2ZSBubyBvdGhlciBjaG9pY2UuICovCisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCXNwZWVkb19pbnRlcnJ1cHQgKGRldi0+aXJxLCBkZXYsIE5VTEwpOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNwZWVkb19mb3VuZDEoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCXZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgY2FyZF9pZHgsIGludCBhY3BpX2lkbGVfc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwOworCWNvbnN0IGNoYXIgKnByb2R1Y3Q7CisJaW50IGksIG9wdGlvbjsKKwl1MTYgZWVwcm9tWzB4MTAwXTsKKwlpbnQgc2l6ZTsKKwl2b2lkICp0eF9yaW5nX3NwYWNlOworCWRtYV9hZGRyX3QgdHhfcmluZ19kbWE7CisKKwlzaXplID0gVFhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCBUeEZEKSArIHNpemVvZihzdHJ1Y3Qgc3BlZWRvX3N0YXRzKTsKKwl0eF9yaW5nX3NwYWNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZSwgJnR4X3JpbmdfZG1hKTsKKwlpZiAodHhfcmluZ19zcGFjZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHNwZWVkb19wcml2YXRlKSk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZWVwcm8xMDA6IENvdWxkIG5vdCBhbGxvY2F0ZSBldGhlcm5ldCBkZXZpY2UuXG4iKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplLCB0eF9yaW5nX3NwYWNlLCB0eF9yaW5nX2RtYSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWlmIChkZXYtPm1lbV9zdGFydCA+IDApCisJCW9wdGlvbiA9IGRldi0+bWVtX3N0YXJ0OworCWVsc2UgaWYgKGNhcmRfaWR4ID49IDAgICYmICBvcHRpb25zW2NhcmRfaWR4XSA+PSAwKQorCQlvcHRpb24gPSBvcHRpb25zW2NhcmRfaWR4XTsKKwllbHNlCisJCW9wdGlvbiA9IDA7CisKKwlydG5sX2xvY2soKTsKKwlpZiAoZGV2X2FsbG9jX25hbWUoZGV2LCBkZXYtPm5hbWUpIDwgMCkgCisJCWdvdG8gZXJyX2ZyZWVfdW5sb2NrOworCisJLyogUmVhZCB0aGUgc3RhdGlvbiBhZGRyZXNzIEVFUFJPTSBiZWZvcmUgZG9pbmcgdGhlIHJlc2V0LgorCSAgIE5vbWluYWxseSBoaXMgc2hvdWxkIGV2ZW4gYmUgZG9uZSBiZWZvcmUgYWNjZXB0aW5nIHRoZSBkZXZpY2UsIGJ1dAorCSAgIHRoZW4gd2Ugd291bGRuJ3QgaGF2ZSBhIGRldmljZSBuYW1lIHdpdGggd2hpY2ggdG8gcmVwb3J0IHRoZSBlcnJvci4KKwkgICBUaGUgc2l6ZSB0ZXN0IGlzIGZvciA2IGJpdCB2cy4gOCBiaXQgYWRkcmVzcyBzZXJpYWwgRUVQUk9Ncy4KKwkqLworCXsKKwkJdm9pZCBfX2lvbWVtICppb2Jhc2U7CisJCWludCByZWFkX2NtZCwgZWVfc2l6ZTsKKwkJdTE2IHN1bTsKKwkJaW50IGo7CisKKwkJLyogVXNlIElPIG9ubHkgdG8gYXZvaWQgcG9zdHBvbmVkIHdyaXRlcyBhbmQgc2F0aXNmeSBFRVBST00gdGltaW5nCisJCSAgIHJlcXVpcmVtZW50cy4gKi8KKwkJaW9iYXNlID0gcGNpX2lvbWFwKHBkZXYsIDEsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkpOworCQlpZiAoIWlvYmFzZSkKKwkJCWdvdG8gZXJyX2ZyZWVfdW5sb2NrOworCQlpZiAoKGRvX2VlcHJvbV9jbWQoaW9iYXNlLCBFRV9SRUFEX0NNRCA8PCAyNCwgMjcpICYgMHhmZmUwMDAwKQorCQkJPT0gMHhmZmUwMDAwKSB7CisJCQllZV9zaXplID0gMHgxMDA7CisJCQlyZWFkX2NtZCA9IEVFX1JFQURfQ01EIDw8IDI0OworCQl9IGVsc2UgeworCQkJZWVfc2l6ZSA9IDB4NDA7CisJCQlyZWFkX2NtZCA9IEVFX1JFQURfQ01EIDw8IDIyOworCQl9CisKKwkJZm9yIChqID0gMCwgaSA9IDAsIHN1bSA9IDA7IGkgPCBlZV9zaXplOyBpKyspIHsKKwkJCXUxNiB2YWx1ZSA9IGRvX2VlcHJvbV9jbWQoaW9iYXNlLCByZWFkX2NtZCB8IChpIDw8IDE2KSwgMjcpOworCQkJZWVwcm9tW2ldID0gdmFsdWU7CisJCQlzdW0gKz0gdmFsdWU7CisJCQlpZiAoaSA8IDMpIHsKKwkJCQlkZXYtPmRldl9hZGRyW2orK10gPSB2YWx1ZTsKKwkJCQlkZXYtPmRldl9hZGRyW2orK10gPSB2YWx1ZSA+PiA4OworCQkJfQorCQl9CisJCWlmIChzdW0gIT0gMHhCQUJBKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEludmFsaWQgRUVQUk9NIGNoZWNrc3VtICUjNC40eCwgIgorCQkJCSAgICJjaGVjayBzZXR0aW5ncyBiZWZvcmUgYWN0aXZhdGluZyB0aGlzIGRldmljZSFcbiIsCisJCQkJICAgZGV2LT5uYW1lLCBzdW0pOworCQkvKiBEb24ndCAgdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsgIGFzIHRoZSBFRVBybyBtYXkgYWN0dWFsbHkgYmUKKwkJICAgdXNhYmxlLCBlc3BlY2lhbGx5IGlmIHRoZSBNQUMgYWRkcmVzcyBpcyBzZXQgbGF0ZXIuCisJCSAgIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBtYXkgYmUgdW51c2FibGUgaWYgTURJIGRhdGEgaXMgY29ycnVwdGVkLiAqLworCisJCXBjaV9pb3VubWFwKHBkZXYsIGlvYmFzZSk7CisJfQorCisJLyogUmVzZXQgdGhlIGNoaXA6IHN0b3AgVHggYW5kIFJ4IHByb2Nlc3NlcyBhbmQgY2xlYXIgY291bnRlcnMuCisJICAgVGhpcyB0YWtlcyBsZXNzIHRoYW4gMTB1c2VjIGFuZCB3aWxsIGVhc2lseSBmaW5pc2ggYmVmb3JlIHRoZSBuZXh0CisJICAgYWN0aW9uLiAqLworCWlvd3JpdGUzMihQb3J0UmVzZXQsIGlvYWRkciArIFNDQlBvcnQpOworCWlvcmVhZDMyKGlvYWRkciArIFNDQlBvcnQpOworCXVkZWxheSgxMCk7CisKKwlpZiAoZWVwcm9tWzNdICYgMHgwMTAwKQorCQlwcm9kdWN0ID0gIk9FTSBpODI1NTcvaTgyNTU4IDEwLzEwMCBFdGhlcm5ldCI7CisJZWxzZQorCQlwcm9kdWN0ID0gcGNpX25hbWUocGRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMsICIsIGRldi0+bmFtZSwgcHJvZHVjdCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlwcmludGsoIiUyLjJYOiIsIGRldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiJTIuMlgsICIsIGRldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiSVJRICVkLlxuIiwgcGRldi0+aXJxKTsKKworCXNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIHdlIG11c3QgaW5pdGlhbGl6ZSB0aGlzIGVhcmx5LCBmb3IgbWRpb197cmVhZCx3cml0ZX0gKi8KKwlzcC0+cmVncyA9IGlvYWRkcjsKKworI2lmIDEgfHwgZGVmaW5lZChrZXJuZWxfYmxvYXQpCisJLyogT0ssIHRoaXMgaXMgcHVyZSBrZXJuZWwgYmxvYXQuICBJIGRvbid0IGxpa2UgaXQgd2hlbiBvdGhlciBkcml2ZXJzCisJICAgd2FzdGUgbm9uLXBhZ2VhYmxlIGtlcm5lbCBzcGFjZSB0byBlbWl0IHNpbWlsYXIgbWVzc2FnZXMsIGJ1dCBJIG5lZWQKKwkgICB0aGVtIGZvciBidWcgcmVwb3J0cy4gKi8KKwl7CisJCWNvbnN0IGNoYXIgKmNvbm5lY3RvcnNbXSA9IHsiIFJKNDUiLCAiIEJOQyIsICIgQVVJIiwgIiBNSUkifTsKKwkJLyogVGhlIHNlbGYtdGVzdCByZXN1bHRzIG11c3QgYmUgcGFyYWdyYXBoIGFsaWduZWQuICovCisJCXZvbGF0aWxlIHMzMiAqc2VsZl90ZXN0X3Jlc3VsdHM7CisJCWludCBib2d1c2NudCA9IDE2MDAwOwkvKiBUaW1lb3V0IGZvciBzZXQtdGVzdC4gKi8KKwkJaWYgKChlZXByb21bM10gJiAweDAzKSAhPSAweDAzKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiICBSZWNlaXZlciBsb2NrLXVwIGJ1ZyBleGlzdHMgLS0gZW5hYmxpbmciCisJCQkJICAgIiB3b3JrLWFyb3VuZC5cbiIpOworCQlwcmludGsoS0VSTl9JTkZPICIgIEJvYXJkIGFzc2VtYmx5ICU0LjR4JTIuMngtJTMuM2QsIFBoeXNpY2FsIgorCQkJICAgIiBjb25uZWN0b3JzIHByZXNlbnQ6IiwKKwkJCSAgIGVlcHJvbVs4XSwgZWVwcm9tWzldPj44LCBlZXByb21bOV0gJiAweGZmKTsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCWlmIChlZXByb21bNV0gJiAoMTw8aSkpCisJCQkJcHJpbnRrKGNvbm5lY3RvcnNbaV0pOworCQlwcmludGsoIlxuIktFUk5fSU5GTyIgIFByaW1hcnkgaW50ZXJmYWNlIGNoaXAgJXMgUEhZICMlZC5cbiIsCisJCQkgICBwaHlzWyhlZXByb21bNl0+PjgpJjE1XSwgZWVwcm9tWzZdICYgMHgxZik7CisJCWlmIChlZXByb21bN10gJiAweDA3MDApCisJCQlwcmludGsoS0VSTl9JTkZPICIgICAgU2Vjb25kYXJ5IGludGVyZmFjZSBjaGlwICVzLlxuIiwKKwkJCQkgICBwaHlzWyhlZXByb21bN10+PjgpJjddKTsKKwkJaWYgKCgoZWVwcm9tWzZdPj44KSAmIDB4M2YpID09IERQODM4NDAKKwkJCXx8ICAoKGVlcHJvbVs2XT4+OCkgJiAweDNmKSA9PSBEUDgzODQwQSkgeworCQkJaW50IG1kaV9yZWcyMyA9IG1kaW9fcmVhZChkZXYsIGVlcHJvbVs2XSAmIDB4MWYsIDIzKSB8IDB4MDQyMjsKKwkJCWlmIChjb25nZW5iKQorCQkJICBtZGlfcmVnMjMgfD0gMHgwMTAwOworCQkJcHJpbnRrKEtFUk5fSU5GTyIgIERQODM4NDAgc3BlY2lmaWMgc2V0dXAsIHNldHRpbmcgcmVnaXN0ZXIgMjMgdG8gJTQuNHguXG4iLAorCQkJCSAgIG1kaV9yZWcyMyk7CisJCQltZGlvX3dyaXRlKGRldiwgZWVwcm9tWzZdICYgMHgxZiwgMjMsIG1kaV9yZWcyMyk7CisJCX0KKwkJaWYgKChvcHRpb24gPj0gMCkgJiYgKG9wdGlvbiAmIDB4NzApKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIgIEZvcmNpbmcgJWRNYnMgJXMtZHVwbGV4IG9wZXJhdGlvbi5cbiIsCisJCQkJICAgKG9wdGlvbiAmIDB4MjAgPyAxMDAgOiAxMCksCisJCQkJICAgKG9wdGlvbiAmIDB4MTAgPyAiZnVsbCIgOiAiaGFsZiIpKTsKKwkJCW1kaW9fd3JpdGUoZGV2LCBlZXByb21bNl0gJiAweDFmLCBNSUlfQk1DUiwKKwkJCQkJICAgKChvcHRpb24gJiAweDIwKSA/IDB4MjAwMCA6IDApIHwgCS8qIDEwMG1icHM/ICovCisJCQkJCSAgICgob3B0aW9uICYgMHgxMCkgPyAweDAxMDAgOiAwKSk7IC8qIEZ1bGwgZHVwbGV4PyAqLworCQl9CisKKwkJLyogUGVyZm9ybSBhIHN5c3RlbSBzZWxmLXRlc3QuICovCisJCXNlbGZfdGVzdF9yZXN1bHRzID0gKHMzMiopICgoKChsb25nKSB0eF9yaW5nX3NwYWNlKSArIDE1KSAmIH4weGYpOworCQlzZWxmX3Rlc3RfcmVzdWx0c1swXSA9IDA7CisJCXNlbGZfdGVzdF9yZXN1bHRzWzFdID0gLTE7CisJCWlvd3JpdGUzMih0eF9yaW5nX2RtYSB8IFBvcnRTZWxmVGVzdCwgaW9hZGRyICsgU0NCUG9ydCk7CisJCWRvIHsKKwkJCXVkZWxheSgxMCk7CisJCX0gd2hpbGUgKHNlbGZfdGVzdF9yZXN1bHRzWzFdID09IC0xICAmJiAgLS1ib2d1c2NudCA+PSAwKTsKKworCQlpZiAoYm9ndXNjbnQgPCAwKSB7CQkvKiBUZXN0IG9wdGltaXplZCBvdXQuICovCisJCQlwcmludGsoS0VSTl9FUlIgIlNlbGYgdGVzdCBmYWlsZWQsIHN0YXR1cyAlOC44eDpcbiIKKwkJCQkgICBLRVJOX0VSUiAiIEZhaWx1cmUgdG8gaW5pdGlhbGl6ZSB0aGUgaTgyNTU3LlxuIgorCQkJCSAgIEtFUk5fRVJSICIgVmVyaWZ5IHRoYXQgdGhlIGNhcmQgaXMgYSBidXMtbWFzdGVyIgorCQkJCSAgICIgY2FwYWJsZSBzbG90LlxuIiwKKwkJCQkgICBzZWxmX3Rlc3RfcmVzdWx0c1sxXSk7CisJCX0gZWxzZQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiICBHZW5lcmFsIHNlbGYtdGVzdDogJXMuXG4iCisJCQkJICAgS0VSTl9JTkZPICIgIFNlcmlhbCBzdWItc3lzdGVtIHNlbGYtdGVzdDogJXMuXG4iCisJCQkJICAgS0VSTl9JTkZPICIgIEludGVybmFsIHJlZ2lzdGVycyBzZWxmLXRlc3Q6ICVzLlxuIgorCQkJCSAgIEtFUk5fSU5GTyAiICBST00gY2hlY2tzdW0gc2VsZi10ZXN0OiAlcyAoJSM4Ljh4KS5cbiIsCisJCQkJICAgc2VsZl90ZXN0X3Jlc3VsdHNbMV0gJiAweDEwMDAgPyAiZmFpbGVkIiA6ICJwYXNzZWQiLAorCQkJCSAgIHNlbGZfdGVzdF9yZXN1bHRzWzFdICYgMHgwMDIwID8gImZhaWxlZCIgOiAicGFzc2VkIiwKKwkJCQkgICBzZWxmX3Rlc3RfcmVzdWx0c1sxXSAmIDB4MDAwOCA/ICJmYWlsZWQiIDogInBhc3NlZCIsCisJCQkJICAgc2VsZl90ZXN0X3Jlc3VsdHNbMV0gJiAweDAwMDQgPyAiZmFpbGVkIiA6ICJwYXNzZWQiLAorCQkJCSAgIHNlbGZfdGVzdF9yZXN1bHRzWzBdKTsKKwl9CisjZW5kaWYgIC8qIGtlcm5lbF9ibG9hdCAqLworCisJaW93cml0ZTMyKFBvcnRSZXNldCwgaW9hZGRyICsgU0NCUG9ydCk7CisJaW9yZWFkMzIoaW9hZGRyICsgU0NCUG9ydCk7CisJdWRlbGF5KDEwKTsKKworCS8qIFJldHVybiB0aGUgY2hpcCB0byBpdHMgb3JpZ2luYWwgcG93ZXIgc3RhdGUuICovCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBhY3BpX2lkbGVfc3RhdGUpOworCisJcGNpX3NldF9kcnZkYXRhIChwZGV2LCBkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKworCXNwLT5wZGV2ID0gcGRldjsKKwlzcC0+bXNnX2VuYWJsZSA9IERFQlVHOworCXNwLT5hY3BpX3B3ciA9IGFjcGlfaWRsZV9zdGF0ZTsKKwlzcC0+dHhfcmluZyA9IHR4X3Jpbmdfc3BhY2U7CisJc3AtPnR4X3JpbmdfZG1hID0gdHhfcmluZ19kbWE7CisJc3AtPmxzdGF0cyA9IChzdHJ1Y3Qgc3BlZWRvX3N0YXRzICopKHNwLT50eF9yaW5nICsgVFhfUklOR19TSVpFKTsKKwlzcC0+bHN0YXRzX2RtYSA9IFRYX1JJTkdfRUxFTV9ETUEoc3AsIFRYX1JJTkdfU0laRSk7CisJaW5pdF90aW1lcigmc3AtPnRpbWVyKTsgLyogdXNlZCBpbiBpb2N0bCgpICovCisJc3Bpbl9sb2NrX2luaXQoJnNwLT5sb2NrKTsKKworCXNwLT5taWlfaWYuZnVsbF9kdXBsZXggPSBvcHRpb24gPj0gMCAmJiAob3B0aW9uICYgMHgxMCkgPyAxIDogMDsKKwlpZiAoY2FyZF9pZHggPj0gMCkgeworCQlpZiAoZnVsbF9kdXBsZXhbY2FyZF9pZHhdID49IDApCisJCQlzcC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gZnVsbF9kdXBsZXhbY2FyZF9pZHhdOworCX0KKwlzcC0+ZGVmYXVsdF9wb3J0ID0gb3B0aW9uID49IDAgPyAob3B0aW9uICYgMHgwZikgOiAwOworCisJc3AtPnBoeVswXSA9IGVlcHJvbVs2XTsKKwlzcC0+cGh5WzFdID0gZWVwcm9tWzddOworCisJc3AtPm1paV9pZi5waHlfaWQgPSBlZXByb21bNl0gJiAweDFmOworCXNwLT5taWlfaWYucGh5X2lkX21hc2sgPSAweDFmOworCXNwLT5taWlfaWYucmVnX251bV9tYXNrID0gMHgxZjsKKwlzcC0+bWlpX2lmLmRldiA9IGRldjsKKwlzcC0+bWlpX2lmLm1kaW9fcmVhZCA9IG1kaW9fcmVhZDsKKwlzcC0+bWlpX2lmLm1kaW9fd3JpdGUgPSBtZGlvX3dyaXRlOworCQorCXNwLT5yeF9idWcgPSAoZWVwcm9tWzNdICYgMHgwMykgPT0gMyA/IDAgOiAxOworCWlmICgoKHBkZXYtPmRldmljZSA+IDB4MTAzMCAmJiAocGRldi0+ZGV2aWNlIDwgMHgxMDNGKSkpIAorCSAgICB8fCAocGRldi0+ZGV2aWNlID09IDB4MjQ0OSkgfHwgKHBkZXYtPmRldmljZSA9PSAweDI0NTkpIAorICAgICAgICAgICAgfHwgKHBkZXYtPmRldmljZSA9PSAweDI0NUQpKSB7CisJICAgIAlzcC0+Y2hpcF9pZCA9IDE7CisJfQorCisJaWYgKHNwLT5yeF9idWcpCisJCXByaW50ayhLRVJOX0lORk8gIiAgUmVjZWl2ZXIgbG9jay11cCB3b3JrYXJvdW5kIGFjdGl2YXRlZC5cbiIpOworCisJLyogVGhlIFNwZWVkby1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9ICZzcGVlZG9fb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZzcGVlZG9fc3RhcnRfeG1pdDsKKwluZXRpZl9zZXRfdHhfdGltZW91dChkZXYsICZzcGVlZG9fdHhfdGltZW91dCwgVFhfVElNRU9VVCk7CisJZGV2LT5zdG9wID0gJnNwZWVkb19jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9ICZzcGVlZG9fZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOworCWRldi0+ZG9faW9jdGwgPSAmc3BlZWRvX2lvY3RsOworCVNFVF9FVEhUT09MX09QUyhkZXYsICZldGh0b29sX29wcyk7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9ICZwb2xsX3NwZWVkbzsKKyNlbmRpZgorCisJaWYgKHJlZ2lzdGVyX25ldGRldmljZShkZXYpKQorCQlnb3RvIGVycl9mcmVlX3VubG9jazsKKwlydG5sX3VubG9jaygpOworCisJcmV0dXJuIDA7CisKKyBlcnJfZnJlZV91bmxvY2s6CisJcnRubF91bmxvY2soKTsKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgZG9fc2xvd19jb21tYW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AsIGludCBjbWQpCit7CisJdm9pZCBfX2lvbWVtICpjbWRfaW9hZGRyID0gc3AtPnJlZ3MgKyBTQ0JDbWQ7CisJaW50IHdhaXQgPSAwOworCWRvCisJCWlmIChpb3JlYWQ4KGNtZF9pb2FkZHIpID09IDApIGJyZWFrOworCXdoaWxlKCsrd2FpdCA8PSAyMDApOworCWlmICh3YWl0ID4gMTAwKQorCQlwcmludGsoS0VSTl9FUlIgIkNvbW1hbmQgJTQuNHggbmV2ZXIgYWNjZXB0ZWQgKCVkIHBvbGxzKSFcbiIsCisJCSAgICAgICBpb3JlYWQ4KGNtZF9pb2FkZHIpLCB3YWl0KTsKKworCWlvd3JpdGU4KGNtZCwgY21kX2lvYWRkcik7CisKKwlmb3IgKHdhaXQgPSAwOyB3YWl0IDw9IDEwMDsgd2FpdCsrKQorCQlpZiAoaW9yZWFkOChjbWRfaW9hZGRyKSA9PSAwKSByZXR1cm47CisJZm9yICg7IHdhaXQgPD0gMjAwMDA7IHdhaXQrKykKKwkJaWYgKGlvcmVhZDgoY21kX2lvYWRkcikgPT0gMCkgcmV0dXJuOworCQllbHNlIHVkZWxheSgxKTsKKwlwcmludGsoS0VSTl9FUlIgIkNvbW1hbmQgJTQuNHggd2FzIG5vdCBhY2NlcHRlZCBhZnRlciAlZCBwb2xscyEiCisJICAgICAgICIgIEN1cnJlbnQgc3RhdHVzICU4Ljh4LlxuIiwKKwkgICAgICAgY21kLCB3YWl0LCBpb3JlYWQzMihzcC0+cmVncyArIFNDQlN0YXR1cykpOworfQorCisvKiBTZXJpYWwgRUVQUk9NIHNlY3Rpb24uCisgICBBICJiaXQiIGdydW5neSwgYnV0IHdlIHdvcmsgb3VyIHdheSB0aHJvdWdoIGJpdC1ieS1iaXQgOi0+LiAqLworLyogIEVFUFJPTV9DdHJsIGJpdHMuICovCisjZGVmaW5lIEVFX1NISUZUX0NMSwkweDAxCS8qIEVFUFJPTSBzaGlmdCBjbG9jay4gKi8KKyNkZWZpbmUgRUVfQ1MJCQkweDAyCS8qIEVFUFJPTSBjaGlwIHNlbGVjdC4gKi8KKyNkZWZpbmUgRUVfREFUQV9XUklURQkweDA0CS8qIEVFUFJPTSBjaGlwIGRhdGEgaW4uICovCisjZGVmaW5lIEVFX0RBVEFfUkVBRAkweDA4CS8qIEVFUFJPTSBjaGlwIGRhdGEgb3V0LiAqLworI2RlZmluZSBFRV9FTkIJCQkoMHg0ODAwIHwgRUVfQ1MpCisjZGVmaW5lIEVFX1dSSVRFXzAJCTB4NDgwMgorI2RlZmluZSBFRV9XUklURV8xCQkweDQ4MDYKKyNkZWZpbmUgRUVfT0ZGU0VUCQlTQ0JlZXByb20KKworLyogVGhlIGZpeGVzIGZvciB0aGUgY29kZSB3ZXJlIGtpbmRseSBwcm92aWRlZCBieSBEcmFnYW4gU3RhbmNldmljCisgICA8dmlzaXRvckB2YWxpbnV4LmNvbT4gdG8gc3RyaWN0bHkgZm9sbG93IEludGVsIHNwZWNpZmljYXRpb25zIG9mIEVFUFJPTQorICAgYWNjZXNzIHRpbWluZy4KKyAgIFRoZSBwdWJsaWNseSBhdmFpbGFibGUgc2hlZXQgNjQ0ODYzMDIgKHNlYy4gMy4xKSBzcGVjaWZpZXMgMXVzIGFjY2VzcworICAgaW50ZXJ2YWwgZm9yIHNlcmlhbCBFRVBST00uICBIb3dldmVyLCBpdCBsb29rcyBsaWtlIHRoYXQgdGhlcmUgaXMgYW4KKyAgIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnQgZGljdGF0aW5nIGxhcmdlciB1ZGVsYXkncyBpbiB0aGUgY29kZSBiZWxvdy4KKyAgIDIwMDAvMDUvMjQgIFNBVyAqLworc3RhdGljIGludCBfX2RldmluaXQgZG9fZWVwcm9tX2NtZCh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IGNtZCwgaW50IGNtZF9sZW4pCit7CisJdW5zaWduZWQgcmV0dmFsID0gMDsKKwl2b2lkIF9faW9tZW0gKmVlX2FkZHIgPSBpb2FkZHIgKyBTQ0JlZXByb207CisKKwlpb3dyaXRlMTYoRUVfRU5CLCBlZV9hZGRyKTsgdWRlbGF5KDIpOworCWlvd3JpdGUxNihFRV9FTkIgfCBFRV9TSElGVF9DTEssIGVlX2FkZHIpOyB1ZGVsYXkoMik7CisKKwkvKiBTaGlmdCB0aGUgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlkbyB7CisJCXNob3J0IGRhdGF2YWwgPSAoY21kICYgKDEgPDwgY21kX2xlbikpID8gRUVfV1JJVEVfMSA6IEVFX1dSSVRFXzA7CisJCWlvd3JpdGUxNihkYXRhdmFsLCBlZV9hZGRyKTsgdWRlbGF5KDIpOworCQlpb3dyaXRlMTYoZGF0YXZhbCB8IEVFX1NISUZUX0NMSywgZWVfYWRkcik7IHVkZWxheSgyKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW9yZWFkMTYoZWVfYWRkcikgJiBFRV9EQVRBX1JFQUQpID8gMSA6IDApOworCX0gd2hpbGUgKC0tY21kX2xlbiA+PSAwKTsKKwlpb3dyaXRlMTYoRUVfRU5CLCBlZV9hZGRyKTsgdWRlbGF5KDIpOworCisJLyogVGVybWluYXRlIHRoZSBFRVBST00gYWNjZXNzLiAqLworCWlvd3JpdGUxNihFRV9FTkIgJiB+RUVfQ1MsIGVlX2FkZHIpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKK3sKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHNwLT5yZWdzOworCWludCB2YWwsIGJvZ3VzY250ID0gNjQqMTA7CQkvKiA8NjQgdXNlYy4gdG8gY29tcGxldGUsIHR5cCAyNyB0aWNrcyAqLworCWlvd3JpdGUzMigweDA4MDAwMDAwIHwgKGxvY2F0aW9uPDwxNikgfCAocGh5X2lkPDwyMSksIGlvYWRkciArIFNDQkN0cmxNREkpOworCWRvIHsKKwkJdmFsID0gaW9yZWFkMzIoaW9hZGRyICsgU0NCQ3RybE1ESSk7CisJCWlmICgtLWJvZ3VzY250IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIgbWRpb19yZWFkKCkgdGltZWQgb3V0IHdpdGggdmFsID0gJTguOHguXG4iLCB2YWwpOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICghICh2YWwgJiAweDEwMDAwMDAwKSk7CisJcmV0dXJuIHZhbCAmIDB4ZmZmZjsKK30KKworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHNwLT5yZWdzOworCWludCB2YWwsIGJvZ3VzY250ID0gNjQqMTA7CQkvKiA8NjQgdXNlYy4gdG8gY29tcGxldGUsIHR5cCAyNyB0aWNrcyAqLworCWlvd3JpdGUzMigweDA0MDAwMDAwIHwgKGxvY2F0aW9uPDwxNikgfCAocGh5X2lkPDwyMSkgfCB2YWx1ZSwKKwkJIGlvYWRkciArIFNDQkN0cmxNREkpOworCWRvIHsKKwkJdmFsID0gaW9yZWFkMzIoaW9hZGRyICsgU0NCQ3RybE1ESSk7CisJCWlmICgtLWJvZ3VzY250IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIiBtZGlvX3dyaXRlKCkgdGltZWQgb3V0IHdpdGggdmFsID0gJTguOHguXG4iLCB2YWwpOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICghICh2YWwgJiAweDEwMDAwMDAwKSk7Cit9CisKK3N0YXRpYyBpbnQKK3NwZWVkb19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBzcC0+cmVnczsKKwlpbnQgcmV0dmFsOworCisJaWYgKG5ldGlmX21zZ19pZnVwKHNwKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzcGVlZG9fb3BlbigpIGlycSAlZC5cbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShzcC0+cGRldiwgUENJX0QwKTsKKworCS8qIFNldCB1cCB0aGUgVHggcXVldWUgZWFybHkuLiAqLworCXNwLT5jdXJfdHggPSAwOworCXNwLT5kaXJ0eV90eCA9IDA7CisJc3AtPmxhc3RfY21kID0gTlVMTDsKKwlzcC0+dHhfZnVsbCA9IDA7CisJc3AtPmluX2ludGVycnVwdCA9IDA7CisKKwkvKiAuLiB3ZSBjYW4gc2FmZWx5IHRha2UgaGFuZGxlciBjYWxscyBkdXJpbmcgaW5pdC4gKi8KKwlyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJnNwZWVkb19pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJldHZhbCkgeworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWRldi0+aWZfcG9ydCA9IHNwLT5kZWZhdWx0X3BvcnQ7CisKKyNpZmRlZiBvaF9ub195b3VfZG9udF91bmxlc3NfeW91X2hvbm91cl90aGVfb3B0aW9uc19wYXNzZWRfaW5fdG9fdXMKKwkvKiBSZXRyaWdnZXIgbmVnb3RpYXRpb24gdG8gcmVzZXQgcHJldmlvdXMgZXJyb3JzLiAqLworCWlmICgoc3AtPnBoeVswXSAmIDB4ODAwMCkgPT0gMCkgeworCQlpbnQgcGh5X2FkZHIgPSBzcC0+cGh5WzBdICYgMHgxZiA7CisJCS8qIFVzZSAweDMzMDAgZm9yIHJlc3RhcnRpbmcgTldheSwgb3RoZXIgdmFsdWVzIHRvIGZvcmNlIHhjdnI6CisJCSAgIDB4MDAwMCAxMC1IRAorCQkgICAweDAxMDAgMTAtRkQKKwkJICAgMHgyMDAwIDEwMC1IRAorCQkgICAweDIxMDAgMTAwLUZECisJCSovCisjaWZkZWYgaG9ub3JfZGVmYXVsdF9wb3J0CisJCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgTUlJX0JNQ1IsIG1paV9jdHJsW2Rldi0+ZGVmYXVsdF9wb3J0ICYgN10pOworI2Vsc2UKKwkJbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQk1DUiwgMHgzMzAwKTsKKyNlbmRpZgorCX0KKyNlbmRpZgorCisJc3BlZWRvX2luaXRfcnhfcmluZyhkZXYpOworCisJLyogRmlyZSB1cCB0aGUgaGFyZHdhcmUuICovCisJaW93cml0ZTE2KFNDQk1hc2tBbGwsIGlvYWRkciArIFNDQkNtZCk7CisJc3BlZWRvX3Jlc3VtZShkZXYpOworCisJbmV0ZGV2aWNlX3N0YXJ0KGRldik7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCS8qIFNldHVwIHRoZSBjaGlwIGFuZCBjb25maWd1cmUgdGhlIG11bHRpY2FzdCBsaXN0LiAqLworCXNwLT5tY19zZXR1cF9oZWFkID0gTlVMTDsKKwlzcC0+bWNfc2V0dXBfdGFpbCA9IE5VTEw7CisJc3AtPmZsb3dfY3RybCA9IHNwLT5wYXJ0bmVyID0gMDsKKwlzcC0+cnhfbW9kZSA9IC0xOwkJCS8qIEludmFsaWQgLT4gYWx3YXlzIHJlc2V0IHRoZSBtb2RlLiAqLworCXNldF9yeF9tb2RlKGRldik7CisJaWYgKChzcC0+cGh5WzBdICYgMHg4MDAwKSA9PSAwKQorCQlzcC0+bWlpX2lmLmFkdmVydGlzaW5nID0gbWRpb19yZWFkKGRldiwgc3AtPnBoeVswXSAmIDB4MWYsIE1JSV9BRFZFUlRJU0UpOworCisJbWlpX2NoZWNrX2xpbmsoJnNwLT5taWlfaWYpOworCisJaWYgKG5ldGlmX21zZ19pZnVwKHNwKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERvbmUgc3BlZWRvX29wZW4oKSwgc3RhdHVzICU4Ljh4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW9yZWFkMTYoaW9hZGRyICsgU0NCU3RhdHVzKSk7CisJfQorCisJLyogU2V0IHRoZSB0aW1lci4gIFRoZSB0aW1lciBzZXJ2ZXMgYSBkdWFsIHB1cnBvc2U6CisJICAgMSkgdG8gbW9uaXRvciB0aGUgbWVkaWEgaW50ZXJmYWNlIChlLmcuIGxpbmsgYmVhdCkgYW5kIHBlcmhhcHMgc3dpdGNoCisJICAgdG8gYW4gYWx0ZXJuYXRlIG1lZGlhIHR5cGUKKwkgICAyKSB0byBtb25pdG9yIFJ4IGFjdGl2aXR5LCBhbmQgcmVzdGFydCB0aGUgUnggcHJvY2VzcyBpZiB0aGUgcmVjZWl2ZXIKKwkgICBoYW5ncy4gKi8KKwlzcC0+dGltZXIuZXhwaXJlcyA9IFJVTl9BVCgoMjQqSFopLzEwKTsgCQkJLyogMi40IHNlYy4gKi8KKwlzcC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlzcC0+dGltZXIuZnVuY3Rpb24gPSAmc3BlZWRvX3RpbWVyOwkJCQkJLyogdGltZXIgaGFuZGxlciAqLworCWFkZF90aW1lcigmc3AtPnRpbWVyKTsKKworCS8qIE5vIG5lZWQgdG8gd2FpdCBmb3IgdGhlIGNvbW1hbmQgdW5pdCB0byBhY2NlcHQgaGVyZS4gKi8KKwlpZiAoKHNwLT5waHlbMF0gJiAweDgwMDApID09IDApCisJCW1kaW9fcmVhZChkZXYsIHNwLT5waHlbMF0gJiAweDFmLCBNSUlfQk1DUik7CisKKwlyZXR1cm4gMDsKK30KKworLyogU3RhcnQgdGhlIGNoaXAgaGFyZHdhcmUgYWZ0ZXIgYSBmdWxsIHJlc2V0LiAqLworc3RhdGljIHZvaWQgc3BlZWRvX3Jlc3VtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gc3AtPnJlZ3M7CisKKwkvKiBTdGFydCB3aXRoIGEgVHggdGhyZXNob2xkIG9mIDI1NiAoMHguLjIwLi4uLiA4IGJ5dGUgdW5pdHMpLiAqLworCXNwLT50eF90aHJlc2hvbGQgPSAweDAxMjA4MDAwOworCisJLyogU2V0IHRoZSBzZWdtZW50IHJlZ2lzdGVycyB0byAnMCcuICovCisJaWYgKHdhaXRfZm9yX2NtZF9kb25lKGRldiwgc3ApICE9IDApIHsKKwkJaW93cml0ZTMyKFBvcnRQYXJ0aWFsUmVzZXQsIGlvYWRkciArIFNDQlBvcnQpOworCQl1ZGVsYXkoMTApOworCX0KKworICAgICAgICBpb3dyaXRlMzIoMCwgaW9hZGRyICsgU0NCUG9pbnRlcik7CisgICAgICAgIGlvcmVhZDMyKGlvYWRkciArIFNDQlBvaW50ZXIpOwkJCS8qIEZsdXNoIHRvIFBDSS4gKi8KKyAgICAgICAgdWRlbGF5KDEwKTsJCQkvKiBCb2d1cywgYnV0IGl0IGF2b2lkcyB0aGUgYnVnLiAqLworCisgICAgICAgIC8qIE5vdGU6IHRoZXNlIG5leHQgdHdvIG9wZXJhdGlvbnMgY2FuIHRha2UgYSB3aGlsZS4gKi8KKyAgICAgICAgZG9fc2xvd19jb21tYW5kKGRldiwgc3AsIFJ4QWRkckxvYWQpOworICAgICAgICBkb19zbG93X2NvbW1hbmQoZGV2LCBzcCwgQ1VDbWRCYXNlKTsKKworCS8qIExvYWQgdGhlIHN0YXRpc3RpY3MgYmxvY2sgYW5kIHJ4IHJpbmcgYWRkcmVzc2VzLiAqLworCWlvd3JpdGUzMihzcC0+bHN0YXRzX2RtYSwgaW9hZGRyICsgU0NCUG9pbnRlcik7CisJaW9yZWFkMzIoaW9hZGRyICsgU0NCUG9pbnRlcik7CQkJLyogRmx1c2ggdG8gUENJICovCisKKwlpb3dyaXRlOChDVVN0YXRzQWRkciwgaW9hZGRyICsgU0NCQ21kKTsKKwlzcC0+bHN0YXRzLT5kb25lX21hcmtlciA9IDA7CisJd2FpdF9mb3JfY21kX2RvbmUoZGV2LCBzcCk7CisKKwlpZiAoc3AtPnJ4X3JpbmdwW3NwLT5jdXJfcnggJSBSWF9SSU5HX1NJWkVdID09IE5VTEwpIHsKKwkJaWYgKG5ldGlmX21zZ19yeF9lcnIoc3ApKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBOVUxMIGN1cl9yeCBpbiBzcGVlZG9fcmVzdW1lKCkuXG4iLAorCQkJCQlkZXYtPm5hbWUpOworCX0gZWxzZSB7CisJCWlvd3JpdGUzMihzcC0+cnhfcmluZ19kbWFbc3AtPmN1cl9yeCAlIFJYX1JJTkdfU0laRV0sCisJCQkgaW9hZGRyICsgU0NCUG9pbnRlcik7CisJCWlvcmVhZDMyKGlvYWRkciArIFNDQlBvaW50ZXIpOwkJLyogRmx1c2ggdG8gUENJICovCisJfQorCisJLyogTm90ZTogUnhTdGFydCBzaG91bGQgY29tcGxldGUgaW5zdGFudGx5LiAqLworCWRvX3Nsb3dfY29tbWFuZChkZXYsIHNwLCBSeFN0YXJ0KTsKKwlkb19zbG93X2NvbW1hbmQoZGV2LCBzcCwgQ1VEdW1wU3RhdHMpOworCisJLyogRmlsbCB0aGUgZmlyc3QgY29tbWFuZCB3aXRoIG91ciBwaHlzaWNhbCBhZGRyZXNzLiAqLworCXsKKwkJc3RydWN0IGRlc2NyaXB0b3IgKmlhc19jbWQ7CisKKwkJaWFzX2NtZCA9CisJCQkoc3RydWN0IGRlc2NyaXB0b3IgKikmc3AtPnR4X3Jpbmdbc3AtPmN1cl90eCsrICUgVFhfUklOR19TSVpFXTsKKwkJLyogQXZvaWQgYSBidWcoPyEpIGhlcmUgYnkgbWFya2luZyB0aGUgY29tbWFuZCBhbHJlYWR5IGNvbXBsZXRlZC4gKi8KKwkJaWFzX2NtZC0+Y21kX3N0YXR1cyA9IGNwdV90b19sZTMyKChDbWRTdXNwZW5kIHwgQ21kSUFTZXR1cCkgfCAweGEwMDApOworCQlpYXNfY21kLT5saW5rID0KKwkJCWNwdV90b19sZTMyKFRYX1JJTkdfRUxFTV9ETUEoc3AsIHNwLT5jdXJfdHggJSBUWF9SSU5HX1NJWkUpKTsKKwkJbWVtY3B5KGlhc19jbWQtPnBhcmFtcywgZGV2LT5kZXZfYWRkciwgNik7CisJCWlmIChzcC0+bGFzdF9jbWQpCisJCQljbGVhcl9zdXNwZW5kKHNwLT5sYXN0X2NtZCk7CisJCXNwLT5sYXN0X2NtZCA9IGlhc19jbWQ7CisJfQorCisJLyogU3RhcnQgdGhlIGNoaXAncyBUeCBwcm9jZXNzIGFuZCB1bm1hc2sgaW50ZXJydXB0cy4gKi8KKwlpb3dyaXRlMzIoVFhfUklOR19FTEVNX0RNQShzcCwgc3AtPmRpcnR5X3R4ICUgVFhfUklOR19TSVpFKSwKKwkJIGlvYWRkciArIFNDQlBvaW50ZXIpOworCS8qIFdlIGFyZSBub3QgQUNLLWluZyBGQ1AgYW5kIEVSIGluIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB5ZXQgc28gdGhleSBzaG91bGQKKwkgICByZW1haW4gbWFza2VkIC0tRHJhZ2FuICovCisJaW93cml0ZTE2KENVU3RhcnQgfCBTQ0JNYXNrRWFybHlSeCB8IFNDQk1hc2tGbG93Q3RsLCBpb2FkZHIgKyBTQ0JDbWQpOworfQorCisvKgorICogU29tZXRpbWVzIHRoZSByZWNlaXZlciBzdG9wcyBtYWtpbmcgcHJvZ3Jlc3MuICBUaGlzIHJvdXRpbmUga25vd3MgaG93IHRvCisgKiBnZXQgaXQgZ29pbmcgYWdhaW4sIHdpdGhvdXQgbG9zaW5nIHBhY2tldHMgb3IgYmVpbmcgb3RoZXJ3aXNlIG5hc3R5IGxpa2UKKyAqIGEgY2hpcCByZXNldCB3b3VsZCBiZS4gIFByZXZpb3VzbHkgdGhlIGRyaXZlciBoYWQgYSB3aG9sZSBzZXF1ZW5jZQorICogb2YgaWYgUnhTdXNwZW5kZWQsIGlmIGl0J3Mgbm8gYnVmZmVycyBkbyBvbmUgdGhpbmcsIGlmIGl0J3Mgbm8gcmVzb3VyY2VzLAorICogZG8gYW5vdGhlciwgZXRjLiAgQnV0IHRob3NlIHRoaW5ncyBkb24ndCByZWFsbHkgbWF0dGVyLiAgU2VwYXJhdGUgbG9naWMKKyAqIGluIHRoZSBJU1IgcHJvdmlkZXMgZm9yIGFsbG9jYXRpbmcgYnVmZmVycy0tdGhlIG90aGVyIGhhbGYgb2Ygb3BlcmF0aW9uCisgKiBpcyBqdXN0IG1ha2luZyBzdXJlIHRoZSByZWNlaXZlciBpcyBhY3RpdmUuICBzcGVlZG9fcnhfc29mdF9yZXNldCBkb2VzIHRoYXQuCisgKiBUaGlzIHByb2JsZW0gd2l0aCB0aGUgb2xkLCBtb3JlIGludm9sdmVkIGFsZ29yaXRobSBpcyBzaG93biB1cCB1bmRlcgorICogcGluZyBmbG9vZHMgb24gdGhlIG9yZGVyIG9mIDYwSyBwYWNrZXRzL3NlY29uZCBvbiBhIDEwME1icHMgZmR4IG5ldHdvcmsuCisgKi8KK3N0YXRpYyB2b2lkCitzcGVlZG9fcnhfc29mdF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBSeEZEICpyZmQ7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisKKwlpb2FkZHIgPSBzcC0+cmVnczsKKwlpZiAod2FpdF9mb3JfY21kX2RvbmUoZGV2LCBzcCkgIT0gMCkgeworCQlwcmludGsoIiVzOiBwcmV2aW91cyBjb21tYW5kIHN0YWxsZWRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJLyoKKwkqIFB1dCB0aGUgaGFyZHdhcmUgaW50byBhIGtub3duIHN0YXRlLgorCSovCisJaW93cml0ZTgoUnhBYm9ydCwgaW9hZGRyICsgU0NCQ21kKTsKKworCXJmZCA9IHNwLT5yeF9yaW5ncFtzcC0+Y3VyX3J4ICUgUlhfUklOR19TSVpFXTsKKworCXJmZC0+cnhfYnVmX2FkZHIgPSAweGZmZmZmZmZmOworCisJaWYgKHdhaXRfZm9yX2NtZF9kb25lKGRldiwgc3ApICE9IDApIHsKKwkJcHJpbnRrKCIlczogUnhBYm9ydCBjb21tYW5kIHN0YWxsZWRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJaW93cml0ZTMyKHNwLT5yeF9yaW5nX2RtYVtzcC0+Y3VyX3J4ICUgUlhfUklOR19TSVpFXSwKKwkJaW9hZGRyICsgU0NCUG9pbnRlcik7CisJaW93cml0ZTgoUnhTdGFydCwgaW9hZGRyICsgU0NCQ21kKTsKK30KKworCisvKiBNZWRpYSBtb25pdG9yaW5nIGFuZCBjb250cm9sLiAqLworc3RhdGljIHZvaWQgc3BlZWRvX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHNwLT5yZWdzOworCWludCBwaHlfbnVtID0gc3AtPnBoeVswXSAmIDB4MWY7CisKKwkvKiBXZSBoYXZlIE1JSSBhbmQgbG9zdCBsaW5rIGJlYXQuICovCisJaWYgKChzcC0+cGh5WzBdICYgMHg4MDAwKSA9PSAwKSB7CisJCWludCBwYXJ0bmVyID0gbWRpb19yZWFkKGRldiwgcGh5X251bSwgTUlJX0xQQSk7CisJCWlmIChwYXJ0bmVyICE9IHNwLT5wYXJ0bmVyKSB7CisJCQlpbnQgZmxvd19jdHJsID0gc3AtPm1paV9pZi5hZHZlcnRpc2luZyAmIHBhcnRuZXIgJiAweDA0MDAgPyAxIDogMDsKKwkJCWlmIChuZXRpZl9tc2dfbGluayhzcCkpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IExpbmsgc3RhdHVzIGNoYW5nZS5cbiIsIGRldi0+bmFtZSk7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBPbGQgcGFydG5lciAleCwgbmV3ICV4LCBhZHYgJXguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHNwLT5wYXJ0bmVyLCBwYXJ0bmVyLCBzcC0+bWlpX2lmLmFkdmVydGlzaW5nKTsKKwkJCX0KKwkJCXNwLT5wYXJ0bmVyID0gcGFydG5lcjsKKwkJCWlmIChmbG93X2N0cmwgIT0gc3AtPmZsb3dfY3RybCkgeworCQkJCXNwLT5mbG93X2N0cmwgPSBmbG93X2N0cmw7CisJCQkJc3AtPnJ4X21vZGUgPSAtMTsJLyogVHJpZ2dlciBhIHJlbG9hZC4gKi8KKwkJCX0KKwkJfQorCX0KKwltaWlfY2hlY2tfbGluaygmc3AtPm1paV9pZik7CisJaWYgKG5ldGlmX21zZ190aW1lcihzcCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNZWRpYSBjb250cm9sIHRpY2ssIHN0YXR1cyAlNC40eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGlvcmVhZDE2KGlvYWRkciArIFNDQlN0YXR1cykpOworCX0KKwlpZiAoc3AtPnJ4X21vZGUgPCAwICB8fAorCQkoc3AtPnJ4X2J1ZyAgJiYgamlmZmllcyAtIHNwLT5sYXN0X3J4X3RpbWUgPiAyKkhaKSkgeworCQkvKiBXZSBoYXZlbid0IHJlY2VpdmVkIGEgcGFja2V0IGluIGEgTG9uZyBUaW1lLiAgV2UgbWlnaHQgaGF2ZSBiZWVuCisJCSAgIGJpdHRlbiBieSB0aGUgcmVjZWl2ZXIgaGFuZyBidWcuICBUaGlzIGNhbiBiZSBjbGVhcmVkIGJ5IHNlbmRpbmcKKwkJICAgYSBzZXQgbXVsdGljYXN0IGxpc3QgY29tbWFuZC4gKi8KKwkJaWYgKG5ldGlmX21zZ190aW1lcihzcCkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNlbmRpbmcgYSBtdWx0aWNhc3QgbGlzdCBzZXQgY29tbWFuZCIKKwkJCQkgICAiIGZyb20gYSB0aW1lciByb3V0aW5lLCIKKwkJCQkgICAiIG09JWQsIGo9JWxkLCBsPSVsZC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBzcC0+cnhfbW9kZSwgamlmZmllcywgc3AtPmxhc3RfcnhfdGltZSk7CisJCXNldF9yeF9tb2RlKGRldik7CisJfQorCS8qIFdlIG11c3QgY29udGludWUgdG8gbW9uaXRvciB0aGUgbWVkaWEuICovCisJc3AtPnRpbWVyLmV4cGlyZXMgPSBSVU5fQVQoMipIWik7IAkJCS8qIDIuMCBzZWMuICovCisJYWRkX3RpbWVyKCZzcC0+dGltZXIpOworfQorCitzdGF0aWMgdm9pZCBzcGVlZG9fc2hvd19zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJaWYgKG5ldGlmX21zZ19wa3RkYXRhKHNwKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFR4IHJpbmcgZHVtcCwgIFR4IHF1ZXVlICV1IC8gJXU6XG4iLCAKKwkJICAgIGRldi0+bmFtZSwgc3AtPmN1cl90eCwgc3AtPmRpcnR5X3R4KTsKKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAgJWMlYyUyZCAlOC44eC5cbiIsIGRldi0+bmFtZSwKKwkJCSAgICBpID09IHNwLT5kaXJ0eV90eCAlIFRYX1JJTkdfU0laRSA/ICcqJyA6ICcgJywKKwkJCSAgICBpID09IHNwLT5jdXJfdHggJSBUWF9SSU5HX1NJWkUgPyAnPScgOiAnICcsCisJCQkgICAgaSwgc3AtPnR4X3JpbmdbaV0uc3RhdHVzKTsKKworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFByaW50aW5nIFJ4IHJpbmciCisJCSAgICAiIChuZXh0IHRvIHJlY2VpdmUgaW50byAldSwgZGlydHkgaW5kZXggJXUpLlxuIiwKKwkJICAgIGRldi0+bmFtZSwgc3AtPmN1cl9yeCwgc3AtPmRpcnR5X3J4KTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlYyVjJWMlMmQgJTguOHguXG4iLCBkZXYtPm5hbWUsCisJCQkgICAgc3AtPnJ4X3JpbmdwW2ldID09IHNwLT5sYXN0X3J4ZiA/ICdsJyA6ICcgJywKKwkJCSAgICBpID09IHNwLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRSA/ICcqJyA6ICcgJywKKwkJCSAgICBpID09IHNwLT5jdXJfcnggJSBSWF9SSU5HX1NJWkUgPyAnPScgOiAnICcsCisJCQkgICAgaSwgKHNwLT5yeF9yaW5ncFtpXSAhPSBOVUxMKSA/CisJCQkgICAgKHVuc2lnbmVkKXNwLT5yeF9yaW5ncFtpXS0+c3RhdHVzIDogMCk7CisJfQorCisjaWYgMAorCXsKKwkJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBzcC0+cmVnczsKKwkJaW50IHBoeV9udW0gPSBzcC0+cGh5WzBdICYgMHgxZjsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCS8qIEZJWE1FOiB3aGF0IGRvZXMgaXQgbWVhbj8gIC0tU0FXICovCisJCQlpZiAoaSA9PSA2KSBpID0gMjE7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICBQSFkgaW5kZXggJWQgcmVnaXN0ZXIgJWQgaXMgJTQuNHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgcGh5X251bSwgaSwgbWRpb19yZWFkKGRldiwgcGh5X251bSwgaSkpOworCQl9CisJfQorI2VuZGlmCisKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgUnggYW5kIFR4IHJpbmdzLCBhbG9uZyB3aXRoIHZhcmlvdXMgJ2RldicgYml0cy4gKi8KK3N0YXRpYyB2b2lkCitzcGVlZG9faW5pdF9yeF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IFJ4RkQgKnJ4ZiwgKmxhc3RfcnhmID0gTlVMTDsKKwlkbWFfYWRkcl90IGxhc3RfcnhmX2RtYSA9IDAgLyogdG8gc2h1dCB1cCB0aGUgY29tcGlsZXIgKi87CisJaW50IGk7CisKKwlzcC0+Y3VyX3J4ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKFBLVF9CVUZfU1ogKyBzaXplb2Yoc3RydWN0IFJ4RkQpKTsKKwkJLyogWFhYOiBkbyB3ZSByZWFsbHkgd2FudCB0byBjYWxsIHRoaXMgYmVmb3JlIHRoZSBOVUxMIGNoZWNrPyAtLWhjaCAqLworCQlyeF9hbGlnbihza2IpOwkJCS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcnkgKi8KKwkJc3AtPnJ4X3NrYnVmZltpXSA9IHNrYjsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJYnJlYWs7CQkJLyogT0suICBKdXN0IGluaXRpYWxseSBzaG9ydCBvZiBSeCBidWZzLiAqLworCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCXJ4ZiA9IChzdHJ1Y3QgUnhGRCAqKXNrYi0+dGFpbDsKKwkJc3AtPnJ4X3JpbmdwW2ldID0gcnhmOworCQlzcC0+cnhfcmluZ19kbWFbaV0gPQorCQkJcGNpX21hcF9zaW5nbGUoc3AtPnBkZXYsIHJ4ZiwKKwkJCQkJUEtUX0JVRl9TWiArIHNpemVvZihzdHJ1Y3QgUnhGRCksIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJCXNrYl9yZXNlcnZlKHNrYiwgc2l6ZW9mKHN0cnVjdCBSeEZEKSk7CisJCWlmIChsYXN0X3J4ZikgeworCQkJbGFzdF9yeGYtPmxpbmsgPSBjcHVfdG9fbGUzMihzcC0+cnhfcmluZ19kbWFbaV0pOworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNwLT5wZGV2LCBsYXN0X3J4Zl9kbWEsCisJCQkJCQkJCQkJICAgc2l6ZW9mKHN0cnVjdCBSeEZEKSwgUENJX0RNQV9UT0RFVklDRSk7CisJCX0KKwkJbGFzdF9yeGYgPSByeGY7CisJCWxhc3RfcnhmX2RtYSA9IHNwLT5yeF9yaW5nX2RtYVtpXTsKKwkJcnhmLT5zdGF0dXMgPSBjcHVfdG9fbGUzMigweDAwMDAwMDAxKTsJLyogJzEnIGlzIGZsYWcgdmFsdWUgb25seS4gKi8KKwkJcnhmLT5saW5rID0gMDsJCQkJCQkvKiBOb25lIHlldC4gKi8KKwkJLyogVGhpcyBmaWVsZCB1bnVzZWQgYnkgaTgyNTU3LiAqLworCQlyeGYtPnJ4X2J1Zl9hZGRyID0gMHhmZmZmZmZmZjsKKwkJcnhmLT5jb3VudCA9IGNwdV90b19sZTMyKFBLVF9CVUZfU1ogPDwgMTYpOworCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3AtPnBkZXYsIHNwLT5yeF9yaW5nX2RtYVtpXSwKKwkJCQkJCQkJCSAgIHNpemVvZihzdHJ1Y3QgUnhGRCksIFBDSV9ETUFfVE9ERVZJQ0UpOworCX0KKwlzcC0+ZGlydHlfcnggPSAodW5zaWduZWQgaW50KShpIC0gUlhfUklOR19TSVpFKTsKKwkvKiBNYXJrIHRoZSBsYXN0IGVudHJ5IGFzIGVuZC1vZi1saXN0LiAqLworCWxhc3RfcnhmLT5zdGF0dXMgPSBjcHVfdG9fbGUzMigweEMwMDAwMDAyKTsJLyogJzInIGlzIGZsYWcgdmFsdWUgb25seS4gKi8KKwlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3AtPnBkZXYsIHNwLT5yeF9yaW5nX2RtYVtSWF9SSU5HX1NJWkUtMV0sCisJCQkJCQkJCSAgIHNpemVvZihzdHJ1Y3QgUnhGRCksIFBDSV9ETUFfVE9ERVZJQ0UpOworCXNwLT5sYXN0X3J4ZiA9IGxhc3RfcnhmOworCXNwLT5sYXN0X3J4Zl9kbWEgPSBsYXN0X3J4Zl9kbWE7Cit9CisKK3N0YXRpYyB2b2lkIHNwZWVkb19wdXJnZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlbnRyeTsKKworCXdoaWxlICgoaW50KShzcC0+Y3VyX3R4IC0gc3AtPmRpcnR5X3R4KSA+IDApIHsKKwkJZW50cnkgPSBzcC0+ZGlydHlfdHggJSBUWF9SSU5HX1NJWkU7CisJCWlmIChzcC0+dHhfc2tidWZmW2VudHJ5XSkgeworCQkJc3AtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJcGNpX3VubWFwX3NpbmdsZShzcC0+cGRldiwKKwkJCQkJbGUzMl90b19jcHUoc3AtPnR4X3JpbmdbZW50cnldLnR4X2J1Zl9hZGRyMCksCisJCQkJCXNwLT50eF9za2J1ZmZbZW50cnldLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYl9pcnEoc3AtPnR4X3NrYnVmZltlbnRyeV0pOworCQkJc3AtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQl9CisJCXNwLT5kaXJ0eV90eCsrOworCX0KKwl3aGlsZSAoc3AtPm1jX3NldHVwX2hlYWQgIT0gTlVMTCkgeworCQlzdHJ1Y3Qgc3BlZWRvX21jX2Jsb2NrICp0OworCQlpZiAobmV0aWZfbXNnX3R4X2VycihzcCkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGZyZWVpbmcgbWMgZnJhbWUuXG4iLCBkZXYtPm5hbWUpOworCQlwY2lfdW5tYXBfc2luZ2xlKHNwLT5wZGV2LCBzcC0+bWNfc2V0dXBfaGVhZC0+ZnJhbWVfZG1hLAorCQkJCXNwLT5tY19zZXR1cF9oZWFkLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQl0ID0gc3AtPm1jX3NldHVwX2hlYWQtPm5leHQ7CisJCWtmcmVlKHNwLT5tY19zZXR1cF9oZWFkKTsKKwkJc3AtPm1jX3NldHVwX2hlYWQgPSB0OworCX0KKwlzcC0+bWNfc2V0dXBfdGFpbCA9IE5VTEw7CisJc3AtPnR4X2Z1bGwgPSAwOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfbWlpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBSZXNldCB0aGUgTUlJIHRyYW5zY2VpdmVyLCBzdWdnZXN0ZWQgYnkgRnJlZCBZb3VuZyBAIHNjYWxhYmxlLmNvbS4gKi8KKwlpZiAoKHNwLT5waHlbMF0gJiAweDgwMDApID09IDApIHsKKwkJaW50IHBoeV9hZGRyID0gc3AtPnBoeVswXSAmIDB4MWY7CisJCWludCBhZHZlcnRpc2luZyA9IG1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfQURWRVJUSVNFKTsKKwkJaW50IG1paV9ibWNyID0gbWRpb19yZWFkKGRldiwgcGh5X2FkZHIsIE1JSV9CTUNSKTsKKwkJbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQk1DUiwgMHgwNDAwKTsKKwkJbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQk1TUiwgMHgwMDAwKTsKKwkJbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQURWRVJUSVNFLCAweDAwMDApOworCQltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9CTUNSLCAweDgwMDApOworI2lmZGVmIGhvbm9yX2RlZmF1bHRfcG9ydAorCQltZGlvX3dyaXRlKGRldiwgcGh5X2FkZHIsIE1JSV9CTUNSLCBtaWlfY3RybFtkZXYtPmRlZmF1bHRfcG9ydCAmIDddKTsKKyNlbHNlCisJCW1kaW9fcmVhZChkZXYsIHBoeV9hZGRyLCBNSUlfQk1DUik7CisJCW1kaW9fd3JpdGUoZGV2LCBwaHlfYWRkciwgTUlJX0JNQ1IsIG1paV9ibWNyKTsKKwkJbWRpb193cml0ZShkZXYsIHBoeV9hZGRyLCBNSUlfQURWRVJUSVNFLCBhZHZlcnRpc2luZyk7CisjZW5kaWYKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNwZWVkb190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBzcC0+cmVnczsKKwlpbnQgc3RhdHVzID0gaW9yZWFkMTYoaW9hZGRyICsgU0NCU3RhdHVzKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG5ldGlmX21zZ190eF9lcnIoc3ApKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQ6IHN0YXR1cyAlNC40eCAiCisJCSAgICIgJTQuNHggYXQgJWQvJWQgY29tbWFuZCAlOC44eC5cbiIsCisJCSAgIGRldi0+bmFtZSwgc3RhdHVzLCBpb3JlYWQxNihpb2FkZHIgKyBTQ0JDbWQpLAorCQkgICBzcC0+ZGlydHlfdHgsIHNwLT5jdXJfdHgsCisJCSAgIHNwLT50eF9yaW5nW3NwLT5kaXJ0eV90eCAlIFRYX1JJTkdfU0laRV0uc3RhdHVzKTsKKworCX0KKwlzcGVlZG9fc2hvd19zdGF0ZShkZXYpOworI2lmIDAKKwlpZiAoKHN0YXR1cyAmIDB4MDBDMCkgIT0gMHgwMDgwCisJCSYmICAoc3RhdHVzICYgMHgwMDNDKSA9PSAweDAwMTApIHsKKwkJLyogT25seSB0aGUgY29tbWFuZCB1bml0IGhhcyBzdG9wcGVkLiAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHJ5aW5nIHRvIHJlc3RhcnQgdGhlIHRyYW5zbWl0dGVyLi4uXG4iLAorCQkJICAgZGV2LT5uYW1lKTsKKwkJaW93cml0ZTMyKFRYX1JJTkdfRUxFTV9ETUEoc3AsIGRpcnR5X3R4ICUgVFhfUklOR19TSVpFXSksCisJCQkgaW9hZGRyICsgU0NCUG9pbnRlcik7CisJCWlvd3JpdGUxNihDVVN0YXJ0LCBpb2FkZHIgKyBTQ0JDbWQpOworCQlyZXNldF9taWkoZGV2KTsKKwl9IGVsc2UgeworI2Vsc2UKKwl7CisjZW5kaWYKKwkJZGVsX3RpbWVyX3N5bmMoJnNwLT50aW1lcik7CisJCS8qIFJlc2V0IHRoZSBUeCBhbmQgUnggdW5pdHMuICovCisJCWlvd3JpdGUzMihQb3J0UmVzZXQsIGlvYWRkciArIFNDQlBvcnQpOworCQkvKiBXZSBtYXkgZ2V0IHNwdXJpb3VzIGludGVycnVwdHMgaGVyZS4gIEJ1dCBJIGRvbid0IHRoaW5rIHRoYXQgdGhleQorCQkgICBtYXkgZG8gbXVjaCBoYXJtLiAgMTk5OS8xMi8wOSBTQVcgKi8KKwkJdWRlbGF5KDEwKTsKKwkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzLiAqLworCQlpb3dyaXRlMTYoU0NCTWFza0FsbCwgaW9hZGRyICsgU0NCQ21kKTsKKwkJc3luY2hyb25pemVfaXJxKGRldi0+aXJxKTsKKwkJc3BlZWRvX3R4X2J1ZmZlcl9nYyhkZXYpOworCQkvKiBGcmVlIGFzIG11Y2ggYXMgcG9zc2libGUuCisJCSAgIEl0IGhlbHBzIHRvIHJlY292ZXIgZnJvbSBhIGhhbmcgYmVjYXVzZSBvZiBvdXQtb2YtbWVtb3J5LgorCQkgICBJdCBhbHNvIHNpbXBsaWZpZXMgc3BlZWRvX3Jlc3VtZSgpIGluIGNhc2UgVFggcmluZyBpcyBmdWxsIG9yCisJCSAgIGNsb3NlLXRvLWJlIGZ1bGwuICovCisJCXNwZWVkb19wdXJnZV90eChkZXYpOworCQlzcGVlZG9fcmVmaWxsX3J4X2J1ZmZlcnMoZGV2LCAxKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNwLT5sb2NrLCBmbGFncyk7CisJCXNwZWVkb19yZXN1bWUoZGV2KTsKKwkJc3AtPnJ4X21vZGUgPSAtMTsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwLT5sb2NrLCBmbGFncyk7CisJCXNldF9yeF9tb2RlKGRldik7IC8qIGl0IHRha2VzIHRoZSBzcGlubG9jayBpdHNlbGYgLS1TQVcgKi8KKwkJLyogUmVzZXQgTUlJIHRyYW5zY2VpdmVyLiAgRG8gaXQgYmVmb3JlIHN0YXJ0aW5nIHRoZSB0aW1lciB0byBzZXJpYWxpemUKKwkJICAgbWRpb194eHggb3BlcmF0aW9ucy4gIFllcywgaXQncyBhIHBhcmFub3lhIDotKSAgMjAwMC8wNS8wOSBTQVcgKi8KKwkJcmVzZXRfbWlpKGRldik7CisJCXNwLT50aW1lci5leHBpcmVzID0gUlVOX0FUKDIqSFopOworCQlhZGRfdGltZXIoJnNwLT50aW1lcik7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIGludAorc3BlZWRvX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHNwLT5yZWdzOworCWludCBlbnRyeTsKKworCS8qIFByZXZlbnQgaW50ZXJydXB0cyBmcm9tIGNoYW5naW5nIHRoZSBUeCByaW5nIGZyb20gdW5kZXJuZWF0aCB1cy4gKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayBpZiB0aGVyZSBhcmUgZW5vdWdoIHNwYWNlLiAqLworCWlmICgoaW50KShzcC0+Y3VyX3R4IC0gc3AtPmRpcnR5X3R4KSA+PSBUWF9RVUVVRV9MSU1JVCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbmNvcnJlY3QgdGJ1c3kgc3RhdGUsIGZpeGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlzcC0+dHhfZnVsbCA9IDE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAxOworCX0KKworCS8qIENhbGN1bGF0ZSB0aGUgVHggZGVzY3JpcHRvciBlbnRyeS4gKi8KKwllbnRyeSA9IHNwLT5jdXJfdHgrKyAlIFRYX1JJTkdfU0laRTsKKworCXNwLT50eF9za2J1ZmZbZW50cnldID0gc2tiOworCXNwLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMgPQorCQljcHVfdG9fbGUzMihDbWRTdXNwZW5kIHwgQ21kVHggfCBDbWRUeEZsZXgpOworCWlmICghKGVudHJ5ICYgKChUWF9SSU5HX1NJWkU+PjIpLTEpKSkKKwkJc3AtPnR4X3JpbmdbZW50cnldLnN0YXR1cyB8PSBjcHVfdG9fbGUzMihDbWRJbnRyKTsKKwlzcC0+dHhfcmluZ1tlbnRyeV0ubGluayA9CisJCWNwdV90b19sZTMyKFRYX1JJTkdfRUxFTV9ETUEoc3AsIHNwLT5jdXJfdHggJSBUWF9SSU5HX1NJWkUpKTsKKwlzcC0+dHhfcmluZ1tlbnRyeV0udHhfZGVzY19hZGRyID0KKwkJY3B1X3RvX2xlMzIoVFhfUklOR19FTEVNX0RNQShzcCwgZW50cnkpICsgVFhfREVTQ1JfQlVGX09GRlNFVCk7CisJLyogVGhlIGRhdGEgcmVnaW9uIGlzIGFsd2F5cyBpbiBvbmUgYnVmZmVyIGRlc2NyaXB0b3IuICovCisJc3AtPnR4X3JpbmdbZW50cnldLmNvdW50ID0gY3B1X3RvX2xlMzIoc3AtPnR4X3RocmVzaG9sZCk7CisJc3AtPnR4X3JpbmdbZW50cnldLnR4X2J1Zl9hZGRyMCA9CisJCWNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHNwLT5wZGV2LCBza2ItPmRhdGEsCisJCQkJCSAgIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKSk7CisJc3AtPnR4X3JpbmdbZW50cnldLnR4X2J1Zl9zaXplMCA9IGNwdV90b19sZTMyKHNrYi0+bGVuKTsKKworCS8qIHdvcmthcm91bmQgZm9yIGhhcmR3YXJlIGJ1ZyBvbiAxMCBtYml0IGhhbGYgZHVwbGV4ICovCisKKwlpZiAoKHNwLT5wYXJ0bmVyID09IDApICYmIChzcC0+Y2hpcF9pZCA9PSAxKSkgeworCQl3YWl0X2Zvcl9jbWRfZG9uZShkZXYsIHNwKTsKKwkJaW93cml0ZTgoMCAsIGlvYWRkciArIFNDQkNtZCk7CisJCXVkZWxheSgxKTsKKwl9CisKKwkvKiBUcmlnZ2VyIHRoZSBjb21tYW5kIHVuaXQgcmVzdW1lLiAqLworCXdhaXRfZm9yX2NtZF9kb25lKGRldiwgc3ApOworCWNsZWFyX3N1c3BlbmQoc3AtPmxhc3RfY21kKTsKKwkvKiBXZSB3YW50IHRoZSB0aW1lIHdpbmRvdyBiZXR3ZWVuIGNsZWFyaW5nIHN1c3BlbmQgZmxhZyBvbiB0aGUgcHJldmlvdXMKKwkgICBjb21tYW5kIGFuZCByZXN1bWluZyBDVSB0byBiZSBhcyBzbWFsbCBhcyBwb3NzaWJsZS4KKwkgICBJbnRlcnJ1cHRzIGluIGJldHdlZW4gYXJlIHZlcnkgdW5kZXNpcmVkLiAgLS1TQVcgKi8KKwlpb3dyaXRlOChDVVJlc3VtZSwgaW9hZGRyICsgU0NCQ21kKTsKKwlzcC0+bGFzdF9jbWQgPSAoc3RydWN0IGRlc2NyaXB0b3IgKikmc3AtPnR4X3JpbmdbZW50cnldOworCisJLyogTGVhdmUgcm9vbSBmb3Igc2V0X3J4X21vZGUoKS4gSWYgdGhlcmUgaXMgbm8gbW9yZSBzcGFjZSB0aGFuIHJlc2VydmVkCisJICAgZm9yIG11bHRpY2FzdCBmaWx0ZXIgbWFyayB0aGUgcmluZyBhcyBmdWxsLiAqLworCWlmICgoaW50KShzcC0+Y3VyX3R4IC0gc3AtPmRpcnR5X3R4KSA+PSBUWF9RVUVVRV9MSU1JVCkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXNwLT50eF9mdWxsID0gMTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcC0+bG9jaywgZmxhZ3MpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3BlZWRvX3R4X2J1ZmZlcl9nYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGludCBkaXJ0eV90eDsKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWRpcnR5X3R4ID0gc3AtPmRpcnR5X3R4OworCXdoaWxlICgoaW50KShzcC0+Y3VyX3R4IC0gZGlydHlfdHgpID4gMCkgeworCQlpbnQgZW50cnkgPSBkaXJ0eV90eCAlIFRYX1JJTkdfU0laRTsKKwkJaW50IHN0YXR1cyA9IGxlMzJfdG9fY3B1KHNwLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMpOworCisJCWlmIChuZXRpZl9tc2dfdHhfZG9uZShzcCkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiIHNjYXZlbmdlIGNhbmRpZGF0ZSAlZCBzdGF0dXMgJTQuNHguXG4iLAorCQkJCSAgIGVudHJ5LCBzdGF0dXMpOworCQlpZiAoKHN0YXR1cyAmIFN0YXR1c0NvbXBsZXRlKSA9PSAwKQorCQkJYnJlYWs7CQkJLyogSXQgc3RpbGwgaGFzbid0IGJlZW4gcHJvY2Vzc2VkLiAqLworCQlpZiAoc3RhdHVzICYgVHhVbmRlcnJ1bikKKwkJCWlmIChzcC0+dHhfdGhyZXNob2xkIDwgMHgwMWUwODAwMCkgeworCQkJCWlmIChuZXRpZl9tc2dfdHhfZXJyKHNwKSkKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUWCB1bmRlcnJ1biwgdGhyZXNob2xkIGFkanVzdGVkLlxuIiwKKwkJCQkJCSAgIGRldi0+bmFtZSk7CisJCQkJc3AtPnR4X3RocmVzaG9sZCArPSAweDAwMDQwMDAwOworCQkJfQorCQkvKiBGcmVlIHRoZSBvcmlnaW5hbCBza2IuICovCisJCWlmIChzcC0+dHhfc2tidWZmW2VudHJ5XSkgeworCQkJc3AtPnN0YXRzLnR4X3BhY2tldHMrKzsJLyogQ291bnQgb25seSB1c2VyIHBhY2tldHMuICovCisJCQlzcC0+c3RhdHMudHhfYnl0ZXMgKz0gc3AtPnR4X3NrYnVmZltlbnRyeV0tPmxlbjsKKwkJCXBjaV91bm1hcF9zaW5nbGUoc3AtPnBkZXYsCisJCQkJCWxlMzJfdG9fY3B1KHNwLT50eF9yaW5nW2VudHJ5XS50eF9idWZfYWRkcjApLAorCQkJCQlzcC0+dHhfc2tidWZmW2VudHJ5XS0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2JfaXJxKHNwLT50eF9za2J1ZmZbZW50cnldKTsKKwkJCXNwLT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJfQorCQlkaXJ0eV90eCsrOworCX0KKworCWlmIChuZXRpZl9tc2dfdHhfZXJyKHNwKSAmJiAoaW50KShzcC0+Y3VyX3R4IC0gZGlydHlfdHgpID4gVFhfUklOR19TSVpFKSB7CisJCXByaW50ayhLRVJOX0VSUiAib3V0LW9mLXN5bmMgZGlydHkgcG9pbnRlciwgJWQgdnMuICVkLCIKKwkJCSAgICIgZnVsbD0lZC5cbiIsCisJCQkgICBkaXJ0eV90eCwgc3AtPmN1cl90eCwgc3AtPnR4X2Z1bGwpOworCQlkaXJ0eV90eCArPSBUWF9SSU5HX1NJWkU7CisJfQorCisJd2hpbGUgKHNwLT5tY19zZXR1cF9oZWFkICE9IE5VTEwKKwkJICAgJiYgKGludCkoZGlydHlfdHggLSBzcC0+bWNfc2V0dXBfaGVhZC0+dHggLSAxKSA+IDApIHsKKwkJc3RydWN0IHNwZWVkb19tY19ibG9jayAqdDsKKwkJaWYgKG5ldGlmX21zZ190eF9lcnIoc3ApKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmcmVlaW5nIG1jIGZyYW1lLlxuIiwgZGV2LT5uYW1lKTsKKwkJcGNpX3VubWFwX3NpbmdsZShzcC0+cGRldiwgc3AtPm1jX3NldHVwX2hlYWQtPmZyYW1lX2RtYSwKKwkJCQlzcC0+bWNfc2V0dXBfaGVhZC0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJdCA9IHNwLT5tY19zZXR1cF9oZWFkLT5uZXh0OworCQlrZnJlZShzcC0+bWNfc2V0dXBfaGVhZCk7CisJCXNwLT5tY19zZXR1cF9oZWFkID0gdDsKKwl9CisJaWYgKHNwLT5tY19zZXR1cF9oZWFkID09IE5VTEwpCisJCXNwLT5tY19zZXR1cF90YWlsID0gTlVMTDsKKworCXNwLT5kaXJ0eV90eCA9IGRpcnR5X3R4OworfQorCisvKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgZG9lcyBhbGwgb2YgdGhlIFJ4IHRocmVhZCB3b3JrIGFuZCBjbGVhbnMgdXAKKyAgIGFmdGVyIHRoZSBUeCB0aHJlYWQuICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3BlZWRvX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaW5zdGFuY2U7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcDsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwlsb25nIGJvZ3VzY250ID0gbWF4X2ludGVycnVwdF93b3JrOworCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlZCA9IDA7CisKKwlzcCA9IG5ldGRldl9wcml2KGRldik7CisJaW9hZGRyID0gc3AtPnJlZ3M7CisKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCS8qIEEgbG9jayB0byBwcmV2ZW50IHNpbXVsdGFuZW91cyBlbnRyeSBvbiBTTVAgbWFjaGluZXMuICovCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgKHZvaWQqKSZzcC0+aW5faW50ZXJydXB0KSkgeworCQlwcmludGsoS0VSTl9FUlIiJXM6IFNNUCBzaW11bHRhbmVvdXMgZW50cnkgb2YgYW4gaW50ZXJydXB0IGhhbmRsZXIuXG4iLAorCQkJICAgZGV2LT5uYW1lKTsKKwkJc3AtPmluX2ludGVycnVwdCA9IDA7CS8qIEF2b2lkIGhhbHRpbmcgbWFjaGluZS4gKi8KKwkJcmV0dXJuIElSUV9OT05FOworCX0KKyNlbmRpZgorCisJZG8geworCQlzdGF0dXMgPSBpb3JlYWQxNihpb2FkZHIgKyBTQ0JTdGF0dXMpOworCQkvKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMgQVNBUC4gKi8KKwkJLyogV2lsbCBjaGFuZ2UgZnJvbSAweGZjMDAgdG8gMHhmZjAwIHdoZW4gd2Ugc3RhcnQgaGFuZGxpbmcKKwkJICAgRkNQIGFuZCBFUiBpbnRlcnJ1cHRzIC0tRHJhZ2FuICovCisJCWlvd3JpdGUxNihzdGF0dXMgJiAweGZjMDAsIGlvYWRkciArIFNDQlN0YXR1cyk7CisKKwkJaWYgKG5ldGlmX21zZ19pbnRyKHNwKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogaW50ZXJydXB0ICBzdGF0dXM9JSM0LjR4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisKKwkJaWYgKChzdGF0dXMgJiAweGZjMDApID09IDApCisJCQlicmVhazsKKwkJaGFuZGxlZCA9IDE7CisKKworCQlpZiAoKHN0YXR1cyAmIDB4NTAwMCkgfHwJLyogUGFja2V0IHJlY2VpdmVkLCBvciBSeCBlcnJvci4gKi8KKwkJCShzcC0+cnhfcmluZ19zdGF0ZSYoUnJOb01lbXxSclBvc3Rwb25lZCkpID09IFJyUG9zdHBvbmVkKQorCQkJCQkJCQkJLyogTmVlZCB0byBnYXRoZXIgdGhlIHBvc3Rwb25lZCBwYWNrZXQuICovCisJCQlzcGVlZG9fcngoZGV2KTsKKworCQkvKiBBbHdheXMgY2hlY2sgaWYgYWxsIHJ4IGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZC4gIC0tU0FXICovCisJCXNwZWVkb19yZWZpbGxfcnhfYnVmZmVycyhkZXYsIDApOworCQkKKwkJc3Bpbl9sb2NrKCZzcC0+bG9jayk7CisJCS8qCisJCSAqIFRoZSBjaGlwIG1heSBoYXZlIHN1c3BlbmRlZCByZWNlcHRpb24gZm9yIHZhcmlvdXMgcmVhc29ucy4KKwkJICogQ2hlY2sgZm9yIHRoYXQsIGFuZCByZS1wcmltZSBpdCBzaG91bGQgdGhpcyBiZSB0aGUgY2FzZS4KKwkJICovCisJCXN3aXRjaCAoKHN0YXR1cyA+PiAyKSAmIDB4ZikgeworCQljYXNlIDA6IC8qIElkbGUgKi8KKwkJCWJyZWFrOworCQljYXNlIDE6CS8qIFN1c3BlbmRlZCAqLworCQljYXNlIDI6CS8qIE5vIHJlc291cmNlcyAoUnhGRHMpICovCisJCWNhc2UgOToJLyogU3VzcGVuZGVkIHdpdGggbm8gbW9yZSBSQkRzICovCisJCWNhc2UgMTA6IC8qIE5vIHJlc291cmNlcyBkdWUgdG8gbm8gUkJEcyAqLworCQljYXNlIDEyOiAvKiBSZWFkeSB3aXRoIG5vIFJCRHMgKi8KKwkJCXNwZWVkb19yeF9zb2Z0X3Jlc2V0KGRldik7CisJCQlicmVhazsKKwkJY2FzZSAzOiAgY2FzZSA1OiAgY2FzZSA2OiAgY2FzZSA3OiAgY2FzZSA4OgorCQljYXNlIDExOiAgY2FzZSAxMzogIGNhc2UgMTQ6ICBjYXNlIDE1OgorCQkJLyogdGhlc2UgYXJlIGFsbCByZXNlcnZlZCB2YWx1ZXMgKi8KKwkJCWJyZWFrOworCQl9CisJCQorCQkKKwkJLyogVXNlciBpbnRlcnJ1cHQsIENvbW1hbmQvVHggdW5pdCBpbnRlcnJ1cHQgb3IgQ1Ugbm90IGFjdGl2ZS4gKi8KKwkJaWYgKHN0YXR1cyAmIDB4QTQwMCkgeworCQkJc3BlZWRvX3R4X2J1ZmZlcl9nYyhkZXYpOworCQkJaWYgKHNwLT50eF9mdWxsCisJCQkJJiYgKGludCkoc3AtPmN1cl90eCAtIHNwLT5kaXJ0eV90eCkgPCBUWF9RVUVVRV9VTkZVTEwpIHsKKwkJCQkvKiBUaGUgcmluZyBpcyBubyBsb25nZXIgZnVsbC4gKi8KKwkJCQlzcC0+dHhfZnVsbCA9IDA7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOyAvKiBBdHRlbnRpb246IHVuZGVyIGEgc3BpbmxvY2suICAtLVNBVyAqLworCQkJfQorCQl9CisJCQorCQlzcGluX3VubG9jaygmc3AtPmxvY2spOworCisJCWlmICgtLWJvZ3VzY250IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVG9vIG11Y2ggd29yayBhdCBpbnRlcnJ1cHQsIHN0YXR1cz0weCU0LjR4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCQkvKiBDbGVhciBhbGwgaW50ZXJydXB0IHNvdXJjZXMuICovCisJCQkvKiBXaWxsIGNoYW5nZSBmcm9tIDB4ZmMwMCB0byAweGZmMDAgd2hlbiB3ZSBzdGFydCBoYW5kbGluZworCQkJICAgRkNQIGFuZCBFUiBpbnRlcnJ1cHRzIC0tRHJhZ2FuICovCisJCQlpb3dyaXRlMTYoMHhmYzAwLCBpb2FkZHIgKyBTQ0JTdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgxKTsKKworCWlmIChuZXRpZl9tc2dfaW50cihzcCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBpbnRlcnJ1cHQsIHN0YXR1cz0lIzQuNHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQxNihpb2FkZHIgKyBTQ0JTdGF0dXMpKTsKKworCWNsZWFyX2JpdCgwLCAodm9pZCopJnNwLT5pbl9pbnRlcnJ1cHQpOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBSeEZEICpzcGVlZG9fcnhfYWxsb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGVudHJ5KQoreworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBSeEZEICpyeGY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkvKiBHZXQgYSBmcmVzaCBza2J1ZmYgdG8gcmVwbGFjZSB0aGUgY29uc3VtZWQgb25lLiAqLworCXNrYiA9IGRldl9hbGxvY19za2IoUEtUX0JVRl9TWiArIHNpemVvZihzdHJ1Y3QgUnhGRCkpOworCS8qIFhYWDogZG8gd2UgcmVhbGx5IHdhbnQgdG8gY2FsbCB0aGlzIGJlZm9yZSB0aGUgTlVMTCBjaGVjaz8gLS1oY2ggKi8KKwlyeF9hbGlnbihza2IpOwkJCQkvKiBBbGlnbiBJUCBvbiAxNiBieXRlIGJvdW5kYXJ5ICovCisJc3AtPnJ4X3NrYnVmZltlbnRyeV0gPSBza2I7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCXNwLT5yeF9yaW5ncFtlbnRyeV0gPSBOVUxMOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcnhmID0gc3AtPnJ4X3JpbmdwW2VudHJ5XSA9IChzdHJ1Y3QgUnhGRCAqKXNrYi0+dGFpbDsKKwlzcC0+cnhfcmluZ19kbWFbZW50cnldID0KKwkJcGNpX21hcF9zaW5nbGUoc3AtPnBkZXYsIHJ4ZiwKKwkJCQkJICAgUEtUX0JVRl9TWiArIHNpemVvZihzdHJ1Y3QgUnhGRCksIFBDSV9ETUFfRlJPTURFVklDRSk7CisJc2tiLT5kZXYgPSBkZXY7CisJc2tiX3Jlc2VydmUoc2tiLCBzaXplb2Yoc3RydWN0IFJ4RkQpKTsKKwlyeGYtPnJ4X2J1Zl9hZGRyID0gMHhmZmZmZmZmZjsKKwlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3AtPnBkZXYsIHNwLT5yeF9yaW5nX2RtYVtlbnRyeV0sCisJCQkJCQkJCSAgIHNpemVvZihzdHJ1Y3QgUnhGRCksIFBDSV9ETUFfVE9ERVZJQ0UpOworCXJldHVybiByeGY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcGVlZG9fcnhfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZW50cnksCisJCQkJCQkJCSAgc3RydWN0IFJ4RkQgKnJ4ZiwgZG1hX2FkZHJfdCByeGZfZG1hKQoreworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXJ4Zi0+c3RhdHVzID0gY3B1X3RvX2xlMzIoMHhDMDAwMDAwMSk7IAkvKiAnMScgZm9yIGRyaXZlciB1c2Ugb25seS4gKi8KKwlyeGYtPmxpbmsgPSAwOwkJCS8qIE5vbmUgeWV0LiAqLworCXJ4Zi0+Y291bnQgPSBjcHVfdG9fbGUzMihQS1RfQlVGX1NaIDw8IDE2KTsKKwlzcC0+bGFzdF9yeGYtPmxpbmsgPSBjcHVfdG9fbGUzMihyeGZfZG1hKTsKKwlzcC0+bGFzdF9yeGYtPnN0YXR1cyAmPSBjcHVfdG9fbGUzMih+MHhDMDAwMDAwMCk7CisJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNwLT5wZGV2LCBzcC0+bGFzdF9yeGZfZG1hLAorCQkJCQkJCQkgICBzaXplb2Yoc3RydWN0IFJ4RkQpLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlzcC0+bGFzdF9yeGYgPSByeGY7CisJc3AtPmxhc3RfcnhmX2RtYSA9IHJ4Zl9kbWE7Cit9CisKK3N0YXRpYyBpbnQgc3BlZWRvX3JlZmlsbF9yeF9idWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZvcmNlKQoreworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlbnRyeTsKKwlzdHJ1Y3QgUnhGRCAqcnhmOworCisJZW50cnkgPSBzcC0+ZGlydHlfcnggJSBSWF9SSU5HX1NJWkU7CisJaWYgKHNwLT5yeF9za2J1ZmZbZW50cnldID09IE5VTEwpIHsKKwkJcnhmID0gc3BlZWRvX3J4X2FsbG9jKGRldiwgZW50cnkpOworCQlpZiAocnhmID09IE5VTEwpIHsKKwkJCXVuc2lnbmVkIGludCBmb3J3OworCQkJaW50IGZvcndfZW50cnk7CisJCQlpZiAobmV0aWZfbXNnX3J4X2VycihzcCkgfHwgIShzcC0+cnhfcmluZ19zdGF0ZSAmIFJyT09NUmVwb3J0ZWQpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNhbid0IGZpbGwgcnggYnVmZmVyIChmb3JjZSAlZCkhXG4iLAorCQkJCQkJZGV2LT5uYW1lLCBmb3JjZSk7CisJCQkJc3AtPnJ4X3Jpbmdfc3RhdGUgfD0gUnJPT01SZXBvcnRlZDsKKwkJCX0KKwkJCXNwZWVkb19zaG93X3N0YXRlKGRldik7CisJCQlpZiAoIWZvcmNlKQorCQkJCXJldHVybiAtMTsJLyogQmV0dGVyIGx1Y2sgbmV4dCB0aW1lISAgKi8KKwkJCS8qIEJvcnJvdyBhbiBza2IgZnJvbSBvbmUgb2YgbmV4dCBlbnRyaWVzLiAqLworCQkJZm9yIChmb3J3ID0gc3AtPmRpcnR5X3J4ICsgMTsgZm9ydyAhPSBzcC0+Y3VyX3J4OyBmb3J3KyspCisJCQkJaWYgKHNwLT5yeF9za2J1ZmZbZm9ydyAlIFJYX1JJTkdfU0laRV0gIT0gTlVMTCkKKwkJCQkJYnJlYWs7CisJCQlpZiAoZm9ydyA9PSBzcC0+Y3VyX3J4KQorCQkJCXJldHVybiAtMTsKKwkJCWZvcndfZW50cnkgPSBmb3J3ICUgUlhfUklOR19TSVpFOworCQkJc3AtPnJ4X3NrYnVmZltlbnRyeV0gPSBzcC0+cnhfc2tidWZmW2ZvcndfZW50cnldOworCQkJc3AtPnJ4X3NrYnVmZltmb3J3X2VudHJ5XSA9IE5VTEw7CisJCQlyeGYgPSBzcC0+cnhfcmluZ3BbZm9yd19lbnRyeV07CisJCQlzcC0+cnhfcmluZ3BbZm9yd19lbnRyeV0gPSBOVUxMOworCQkJc3AtPnJ4X3JpbmdwW2VudHJ5XSA9IHJ4ZjsKKwkJfQorCX0gZWxzZSB7CisJCXJ4ZiA9IHNwLT5yeF9yaW5ncFtlbnRyeV07CisJfQorCXNwZWVkb19yeF9saW5rKGRldiwgZW50cnksIHJ4Ziwgc3AtPnJ4X3JpbmdfZG1hW2VudHJ5XSk7CisJc3AtPmRpcnR5X3J4Kys7CisJc3AtPnJ4X3Jpbmdfc3RhdGUgJj0gfihSck5vTWVtfFJyT09NUmVwb3J0ZWQpOyAvKiBNYXJrIHRoZSBwcm9ncmVzcy4gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3BlZWRvX3JlZmlsbF9yeF9idWZmZXJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBmb3JjZSkKK3sKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIFJlZmlsbCB0aGUgUlggcmluZy4gKi8KKwl3aGlsZSAoKGludCkoc3AtPmN1cl9yeCAtIHNwLT5kaXJ0eV9yeCkgPiAwICYmCisJCQlzcGVlZG9fcmVmaWxsX3J4X2J1ZihkZXYsIGZvcmNlKSAhPSAtMSk7Cit9CisKK3N0YXRpYyBpbnQKK3NwZWVkb19yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlbnRyeSA9IHNwLT5jdXJfcnggJSBSWF9SSU5HX1NJWkU7CisJaW50IHJ4X3dvcmtfbGltaXQgPSBzcC0+ZGlydHlfcnggKyBSWF9SSU5HX1NJWkUgLSBzcC0+Y3VyX3J4OworCWludCBhbGxvY19vayA9IDE7CisJaW50IG5wa3RzID0gMDsKKworCWlmIChuZXRpZl9tc2dfaW50cihzcCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIgSW4gc3BlZWRvX3J4KCkuXG4iKTsKKwkvKiBJZiB3ZSBvd24gdGhlIG5leHQgZW50cnksIGl0J3MgYSBuZXcgcGFja2V0LiBTZW5kIGl0IHVwLiAqLworCXdoaWxlIChzcC0+cnhfcmluZ3BbZW50cnldICE9IE5VTEwpIHsKKwkJaW50IHN0YXR1czsKKwkJaW50IHBrdF9sZW47CisKKwkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHNwLT5wZGV2LCBzcC0+cnhfcmluZ19kbWFbZW50cnldLAorCQkJCQkJCQkJc2l6ZW9mKHN0cnVjdCBSeEZEKSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJc3RhdHVzID0gbGUzMl90b19jcHUoc3AtPnJ4X3JpbmdwW2VudHJ5XS0+c3RhdHVzKTsKKwkJcGt0X2xlbiA9IGxlMzJfdG9fY3B1KHNwLT5yeF9yaW5ncFtlbnRyeV0tPmNvdW50KSAmIDB4M2ZmZjsKKworCQlpZiAoIShzdGF0dXMgJiBSeENvbXBsZXRlKSkKKwkJCWJyZWFrOworCisJCWlmICgtLXJ4X3dvcmtfbGltaXQgPCAwKQorCQkJYnJlYWs7CisKKwkJLyogQ2hlY2sgZm9yIGEgcmFyZSBvdXQtb2YtbWVtb3J5IGNhc2U6IHRoZSBjdXJyZW50IGJ1ZmZlciBpcworCQkgICB0aGUgbGFzdCBidWZmZXIgYWxsb2NhdGVkIGluIHRoZSBSWCByaW5nLiAgLS1TQVcgKi8KKwkJaWYgKHNwLT5sYXN0X3J4ZiA9PSBzcC0+cnhfcmluZ3BbZW50cnldKSB7CisJCQkvKiBQb3N0cG9uZSB0aGUgcGFja2V0LiAgSXQnbGwgYmUgcmVhcGVkIGF0IGFuIGludGVycnVwdCB3aGVuIHRoaXMKKwkJCSAgIHBhY2tldCBpcyBubyBsb25nZXIgdGhlIGxhc3QgcGFja2V0IGluIHRoZSByaW5nLiAqLworCQkJaWYgKG5ldGlmX21zZ19yeF9lcnIoc3ApKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUlggcGFja2V0IHBvc3Rwb25lZCFcbiIsCisJCQkJCSAgIGRldi0+bmFtZSk7CisJCQlzcC0+cnhfcmluZ19zdGF0ZSB8PSBSclBvc3Rwb25lZDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG5ldGlmX21zZ19yeF9zdGF0dXMoc3ApKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgc3BlZWRvX3J4KCkgc3RhdHVzICU4Ljh4IGxlbiAlZC5cbiIsIHN0YXR1cywKKwkJCQkgICBwa3RfbGVuKTsKKwkJaWYgKChzdGF0dXMgJiAoUnhFcnJUb29CaWd8UnhPS3wweDBmOTApKSAhPSBSeE9LKSB7CisJCQlpZiAoc3RhdHVzICYgUnhFcnJUb29CaWcpCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXRoZXJuZXQgZnJhbWUgb3ZlcnJhbiB0aGUgUnggYnVmZmVyLCAiCisJCQkJCSAgICJzdGF0dXMgJTguOHghXG4iLCBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCQllbHNlIGlmICghIChzdGF0dXMgJiBSeE9LKSkgeworCQkJCS8qIFRoZXJlIHdhcyBhIGZhdGFsIGVycm9yLiAgVGhpcyAqc2hvdWxkKiBiZSBpbXBvc3NpYmxlLiAqLworCQkJCXNwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBBbm9tYWxvdXMgZXZlbnQgaW4gc3BlZWRvX3J4KCksICIKKwkJCQkJICAgInN0YXR1cyAlOC44eC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCS8qIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgbG9uZyBlbm91Z2ggdG8ganVzdCBhY2NlcHQgd2l0aG91dAorCQkJICAgY29weWluZyB0byBhIHByb3Blcmx5IHNpemVkIHNrYnVmZi4gKi8KKwkJCWlmIChwa3RfbGVuIDwgcnhfY29weWJyZWFrCisJCQkJJiYgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSAwKSB7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCisJCQkJLyogJ3NrYl9wdXQoKScgcG9pbnRzIHRvIHRoZSBzdGFydCBvZiBza19idWZmIGRhdGEgYXJlYS4gKi8KKwkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3AtPnBkZXYsIHNwLT5yeF9yaW5nX2RtYVtlbnRyeV0sCisJCQkJCQkJCQkJCXNpemVvZihzdHJ1Y3QgUnhGRCkgKyBwa3RfbGVuLAorCQkJCQkJCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisjaWYgMSB8fCBVU0VfSVBfQ1NVTQorCQkJCS8qIFBhY2tldCBpcyBpbiBvbmUgY2h1bmsgLS0gd2UgY2FuIGNvcHkgKyBja3N1bS4gKi8KKwkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgc3AtPnJ4X3NrYnVmZltlbnRyeV0tPnRhaWwsIHBrdF9sZW4sIDApOworCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKyNlbHNlCisJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBwa3RfbGVuKSwgc3AtPnJ4X3NrYnVmZltlbnRyeV0tPnRhaWwsCisJCQkJCSAgIHBrdF9sZW4pOworI2VuZGlmCisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNwLT5wZGV2LCBzcC0+cnhfcmluZ19kbWFbZW50cnldLAorCQkJCQkJCQkJCQkgICBzaXplb2Yoc3RydWN0IFJ4RkQpICsgcGt0X2xlbiwKKwkJCQkJCQkJCQkJICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlucGt0cysrOworCQkJfSBlbHNlIHsKKwkJCQkvKiBQYXNzIHVwIHRoZSBhbHJlYWR5LWZpbGxlZCBza2J1ZmYuICovCisJCQkJc2tiID0gc3AtPnJ4X3NrYnVmZltlbnRyeV07CisJCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEluY29uc2lzdGVudCBSeCBkZXNjcmlwdG9yIGNoYWluLlxuIiwKKwkJCQkJCSAgIGRldi0+bmFtZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlzcC0+cnhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJCW5wa3RzKys7CisJCQkJc3AtPnJ4X3JpbmdwW2VudHJ5XSA9IE5VTEw7CisJCQkJcGNpX3VubWFwX3NpbmdsZShzcC0+cGRldiwgc3AtPnJ4X3JpbmdfZG1hW2VudHJ5XSwKKwkJCQkJCQkJIFBLVF9CVUZfU1ogKyBzaXplb2Yoc3RydWN0IFJ4RkQpLAorCQkJCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCX0KKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCXNwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlzcC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJfQorCQllbnRyeSA9ICgrK3NwLT5jdXJfcngpICUgUlhfUklOR19TSVpFOworCQlzcC0+cnhfcmluZ19zdGF0ZSAmPSB+UnJQb3N0cG9uZWQ7CisJCS8qIFJlZmlsbCB0aGUgcmVjZW50bHkgdGFrZW4gYnVmZmVycy4KKwkJICAgRG8gaXQgb25lLWJ5LW9uZSB0byBoYW5kbGUgdHJhZmZpYyBidXJzdHMgYmV0dGVyLiAqLworCQlpZiAoYWxsb2Nfb2sgJiYgc3BlZWRvX3JlZmlsbF9yeF9idWYoZGV2LCAwKSA9PSAtMSkKKwkJCWFsbG9jX29rID0gMDsKKwl9CisKKwkvKiBUcnkgaGFyZCB0byByZWZpbGwgdGhlIHJlY2VudGx5IHRha2VuIGJ1ZmZlcnMuICovCisJc3BlZWRvX3JlZmlsbF9yeF9idWZmZXJzKGRldiwgMSk7CisKKwlpZiAobnBrdHMpCisJCXNwLT5sYXN0X3J4X3RpbWUgPSBqaWZmaWVzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NwZWVkb19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gc3AtPnJlZ3M7CisJaW50IGk7CisKKwluZXRkZXZpY2Vfc3RvcChkZXYpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmIChuZXRpZl9tc2dfaWZkb3duKHNwKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZCwgc3RhdHVzIHdhcyAlNC40eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGlvcmVhZDE2KGlvYWRkciArIFNDQlN0YXR1cykpOworCisJLyogU2h1dCBvZmYgdGhlIG1lZGlhIG1vbml0b3JpbmcgdGltZXIuICovCisJZGVsX3RpbWVyX3N5bmMoJnNwLT50aW1lcik7CisKKwlpb3dyaXRlMTYoU0NCTWFza0FsbCwgaW9hZGRyICsgU0NCQ21kKTsKKworCS8qIFNodXR0aW5nIGRvd24gdGhlIGNoaXAgbmljZWx5IGZhaWxzIHRvIGRpc2FibGUgZmxvdyBjb250cm9sLiBTby4uICovCisJaW93cml0ZTMyKFBvcnRQYXJ0aWFsUmVzZXQsIGlvYWRkciArIFNDQlBvcnQpOworCWlvcmVhZDMyKGlvYWRkciArIFNDQlBvcnQpOyAvKiBmbHVzaCBwb3N0ZWQgd3JpdGUgKi8KKwkvKgorCSAqIFRoZSBjaGlwIHJlcXVpcmVzIGEgMTAgbWljcm9zZWNvbmQgcXVpZXQgcGVyaW9kLiAgV2FpdCBoZXJlIQorCSAqLworCXVkZWxheSgxMCk7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlzcGVlZG9fc2hvd19zdGF0ZShkZXYpOworCisgICAgLyogRnJlZSBhbGwgdGhlIHNrYnVmZnMgaW4gdGhlIFJ4IGFuZCBUeCBxdWV1ZXMuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBzcC0+cnhfc2tidWZmW2ldOworCQlzcC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwkJLyogQ2xlYXIgdGhlIFJ4IGRlc2NyaXB0b3JzLiAqLworCQlpZiAoc2tiKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKHNwLT5wZGV2LAorCQkJCQkgc3AtPnJ4X3JpbmdfZG1hW2ldLAorCQkJCQkgUEtUX0JVRl9TWiArIHNpemVvZihzdHJ1Y3QgUnhGRCksIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNwLT50eF9za2J1ZmZbaV07CisJCXNwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQkvKiBDbGVhciB0aGUgVHggZGVzY3JpcHRvcnMuICovCisJCWlmIChza2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoc3AtPnBkZXYsCisJCQkJCSBsZTMyX3RvX2NwdShzcC0+dHhfcmluZ1tpXS50eF9idWZfYWRkcjApLAorCQkJCQkgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQl9CisJfQorCisJLyogRnJlZSBtdWx0aWNhc3Qgc2V0dGluZyBibG9ja3MuICovCisJZm9yIChpID0gMDsgc3AtPm1jX3NldHVwX2hlYWQgIT0gTlVMTDsgaSsrKSB7CisJCXN0cnVjdCBzcGVlZG9fbWNfYmxvY2sgKnQ7CisJCXQgPSBzcC0+bWNfc2V0dXBfaGVhZC0+bmV4dDsKKwkJa2ZyZWUoc3AtPm1jX3NldHVwX2hlYWQpOworCQlzcC0+bWNfc2V0dXBfaGVhZCA9IHQ7CisJfQorCXNwLT5tY19zZXR1cF90YWlsID0gTlVMTDsKKwlpZiAobmV0aWZfbXNnX2lmZG93bihzcCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogJWQgbXVsdGljYXN0IGJsb2NrcyBkcm9wcGVkLlxuIiwgZGV2LT5uYW1lLCBpKTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUoc3AtPnBkZXYsIFBDSV9EMik7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIFNwZWVkby0zIGhhcyBhbiBlc3BlY2lhbGx5IGF3a3dhcmQgYW5kIHVudXNhYmxlIG1ldGhvZCBvZiBnZXR0aW5nCisgICBzdGF0aXN0aWNzIG91dCBvZiB0aGUgY2hpcC4gIEl0IHRha2VzIGFuIHVucHJlZGljdGFibGUgbGVuZ3RoIG9mIHRpbWUKKyAgIGZvciB0aGUgZHVtcC1zdGF0cyBjb21tYW5kIHRvIGNvbXBsZXRlLiAgVG8gYXZvaWQgYSBidXN5LXdhaXQgbG9vcCB3ZQorICAgdXBkYXRlIHRoZSBzdGF0cyB3aXRoIHRoZSBwcmV2aW91cyBkdW1wIHJlc3VsdHMsIGFuZCB0aGVuIHRyaWdnZXIgYQorICAgbmV3IGR1bXAuCisKKyAgIE9oLCBhbmQgaW5jb21pbmcgZnJhbWVzIGFyZSBkcm9wcGVkIHdoaWxlIGV4ZWN1dGluZyBkdW1wLXN0YXRzIQorICAgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCitzcGVlZG9fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBzcC0+cmVnczsKKworCS8qIFVwZGF0ZSBvbmx5IGlmIHRoZSBwcmV2aW91cyBkdW1wIGZpbmlzaGVkLiAqLworCWlmIChzcC0+bHN0YXRzLT5kb25lX21hcmtlciA9PSBsZTMyX3RvX2NwdSgweEEwMDcpKSB7CisJCXNwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyArPSBsZTMyX3RvX2NwdShzcC0+bHN0YXRzLT50eF9jb2xsMTZfZXJycyk7CisJCXNwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzICs9IGxlMzJfdG9fY3B1KHNwLT5sc3RhdHMtPnR4X2xhdGVfY29sbHMpOworCQlzcC0+c3RhdHMudHhfZmlmb19lcnJvcnMgKz0gbGUzMl90b19jcHUoc3AtPmxzdGF0cy0+dHhfdW5kZXJydW5zKTsKKwkJc3AtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzICs9IGxlMzJfdG9fY3B1KHNwLT5sc3RhdHMtPnR4X2xvc3RfY2Fycmllcik7CisJCS8qc3AtPnN0YXRzLnR4X2RlZmVycmVkICs9IGxlMzJfdG9fY3B1KHNwLT5sc3RhdHMtPnR4X2RlZmVycmVkKTsqLworCQlzcC0+c3RhdHMuY29sbGlzaW9ucyArPSBsZTMyX3RvX2NwdShzcC0+bHN0YXRzLT50eF90b3RhbF9jb2xscyk7CisJCXNwLT5zdGF0cy5yeF9jcmNfZXJyb3JzICs9IGxlMzJfdG9fY3B1KHNwLT5sc3RhdHMtPnJ4X2NyY19lcnJzKTsKKwkJc3AtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyArPSBsZTMyX3RvX2NwdShzcC0+bHN0YXRzLT5yeF9hbGlnbl9lcnJzKTsKKwkJc3AtPnN0YXRzLnJ4X292ZXJfZXJyb3JzICs9IGxlMzJfdG9fY3B1KHNwLT5sc3RhdHMtPnJ4X3Jlc291cmNlX2VycnMpOworCQlzcC0+c3RhdHMucnhfZmlmb19lcnJvcnMgKz0gbGUzMl90b19jcHUoc3AtPmxzdGF0cy0+cnhfb3ZlcnJ1bl9lcnJzKTsKKwkJc3AtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgKz0gbGUzMl90b19jcHUoc3AtPmxzdGF0cy0+cnhfcnVudF9lcnJzKTsKKwkJc3AtPmxzdGF0cy0+ZG9uZV9tYXJrZXIgPSAweDAwMDA7CisJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkvKiBUYWtlIGEgc3BpbmxvY2sgdG8gbWFrZSB3YWl0X2Zvcl9jbWRfZG9uZSBhbmQgc2VuZGluZyB0aGUKKwkJCSAgIGNvbW1hbmQgYXRvbWljLiAgLS1TQVcgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzcC0+bG9jaywgZmxhZ3MpOworCQkJd2FpdF9mb3JfY21kX2RvbmUoZGV2LCBzcCk7CisJCQlpb3dyaXRlOChDVUR1bXBTdGF0cywgaW9hZGRyICsgU0NCQ21kKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwLT5sb2NrLCBmbGFncyk7CisJCX0KKwl9CisJcmV0dXJuICZzcC0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIHNwZWVkb19nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cm5jcHkoaW5mby0+ZHJpdmVyLCAiZWVwcm8xMDAiLCBzaXplb2YoaW5mby0+ZHJpdmVyKS0xKTsKKwlzdHJuY3B5KGluZm8tPnZlcnNpb24sIHZlcnNpb24sIHNpemVvZihpbmZvLT52ZXJzaW9uKS0xKTsKKwlpZiAoc3AtPnBkZXYpCisJCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoc3AtPnBkZXYpKTsKK30KKworc3RhdGljIGludCBzcGVlZG9fZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZzcC0+bG9jayk7CisJbWlpX2V0aHRvb2xfZ3NldCgmc3AtPm1paV9pZiwgZWNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZzcC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BlZWRvX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJlczsKKwlzcGluX2xvY2tfaXJxKCZzcC0+bG9jayk7CisJcmVzID0gbWlpX2V0aHRvb2xfc3NldCgmc3AtPm1paV9pZiwgZWNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZzcC0+bG9jayk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBzcGVlZG9fbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiBtaWlfbndheV9yZXN0YXJ0KCZzcC0+bWlpX2lmKTsKK30KKworc3RhdGljIHUzMiBzcGVlZG9fZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbWlpX2xpbmtfb2soJnNwLT5taWlfaWYpOworfQorCitzdGF0aWMgdTMyIHNwZWVkb19nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gc3AtPm1zZ19lbmFibGU7Cit9CisKK3N0YXRpYyB2b2lkIHNwZWVkb19zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHYpCit7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJc3AtPm1zZ19lbmFibGUgPSB2OworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbyA9IHNwZWVkb19nZXRfZHJ2aW5mbywKKwkuZ2V0X3NldHRpbmdzID0gc3BlZWRvX2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzID0gc3BlZWRvX3NldF9zZXR0aW5ncywKKwkubndheV9yZXNldCA9IHNwZWVkb19ud2F5X3Jlc2V0LAorCS5nZXRfbGluayA9IHNwZWVkb19nZXRfbGluaywKKwkuZ2V0X21zZ2xldmVsID0gc3BlZWRvX2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsID0gc3BlZWRvX3NldF9tc2dsZXZlbCwKK307CisKK3N0YXRpYyBpbnQgc3BlZWRvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG1paV9pb2N0bF9kYXRhICpkYXRhID0gaWZfbWlpKHJxKTsKKwlpbnQgcGh5ID0gc3AtPnBoeVswXSAmIDB4MWY7CisJaW50IHNhdmVkX2FjcGk7CisJaW50IHQ7CisKKyAgICBzd2l0Y2goY21kKSB7CisJY2FzZSBTSU9DR01JSVBIWToJCS8qIEdldCBhZGRyZXNzIG9mIE1JSSBQSFkgaW4gdXNlLiAqLworCQlkYXRhLT5waHlfaWQgPSBwaHk7CisKKwljYXNlIFNJT0NHTUlJUkVHOgkJLyogUmVhZCBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCQkvKiBGSVhNRTogdGhlc2Ugb3BlcmF0aW9ucyBuZWVkIHRvIGJlIHNlcmlhbGl6ZWQgd2l0aCBNRElPCisJCSAgIGFjY2VzcyBmcm9tIHRoZSB0aW1lb3V0IGhhbmRsZXIuCisJCSAgIFRoZXkgYXJlIGN1cnJlbnRseSBzZXJpYWxpemVkIG9ubHkgd2l0aCBNRElPIGFjY2VzcyBmcm9tIHRoZQorCQkgICB0aW1lciByb3V0aW5lLiAgMjAwMC8wNS8wOSBTQVcgKi8KKwkJc2F2ZWRfYWNwaSA9IHBjaV9zZXRfcG93ZXJfc3RhdGUoc3AtPnBkZXYsIFBDSV9EMCk7CisJCXQgPSBkZWxfdGltZXJfc3luYygmc3AtPnRpbWVyKTsKKwkJZGF0YS0+dmFsX291dCA9IG1kaW9fcmVhZChkZXYsIGRhdGEtPnBoeV9pZCAmIDB4MWYsIGRhdGEtPnJlZ19udW0gJiAweDFmKTsKKwkJaWYgKHQpCisJCQlhZGRfdGltZXIoJnNwLT50aW1lcik7IC8qIG1heSBiZSBzZXQgdG8gdGhlIHBhc3QgIC0tU0FXICovCisJCXBjaV9zZXRfcG93ZXJfc3RhdGUoc3AtPnBkZXYsIHNhdmVkX2FjcGkpOworCQlyZXR1cm4gMDsKKworCWNhc2UgU0lPQ1NNSUlSRUc6CQkvKiBXcml0ZSBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlzYXZlZF9hY3BpID0gcGNpX3NldF9wb3dlcl9zdGF0ZShzcC0+cGRldiwgUENJX0QwKTsKKwkJdCA9IGRlbF90aW1lcl9zeW5jKCZzcC0+dGltZXIpOworCQltZGlvX3dyaXRlKGRldiwgZGF0YS0+cGh5X2lkLCBkYXRhLT5yZWdfbnVtLCBkYXRhLT52YWxfaW4pOworCQlpZiAodCkKKwkJCWFkZF90aW1lcigmc3AtPnRpbWVyKTsgLyogbWF5IGJlIHNldCB0byB0aGUgcGFzdCAgLS1TQVcgKi8KKwkJcGNpX3NldF9wb3dlcl9zdGF0ZShzcC0+cGRldiwgc2F2ZWRfYWNwaSk7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9Cit9CisKKy8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICAgVGhpcyBpcyB2ZXJ5IHVnbHkgd2l0aCBJbnRlbCBjaGlwcyAtLSB3ZSB1c3VhbGx5IGhhdmUgdG8gZXhlY3V0ZSBhbgorICAgZW50aXJlIGNvbmZpZ3VyYXRpb24gY29tbWFuZCwgcGx1cyBwcm9jZXNzIGEgbXVsdGljYXN0IGNvbW1hbmQuCisgICBUaGlzIGlzIGNvbXBsaWNhdGVkLiAgV2UgbXVzdCBwdXQgYSBsYXJnZSBjb25maWd1cmF0aW9uIGNvbW1hbmQgYW5kCisgICBhbiBhcmJpdHJhcmlseS1zaXplZCBtdWx0aWNhc3QgY29tbWFuZCBpbiB0aGUgdHJhbnNtaXQgbGlzdC4KKyAgIFRvIG1pbmltaXplIHRoZSBkaXNydXB0aW9uIC0tIHRoZSBwcmV2aW91cyBjb21tYW5kIG1pZ2h0IGhhdmUgYWxyZWFkeQorICAgbG9hZGVkIHRoZSBsaW5rIC0tIHdlIGNvbnZlcnQgdGhlIGN1cnJlbnQgY29tbWFuZCBibG9jaywgbm9ybWFsbHkgYSBUeAorICAgY29tbWFuZCwgaW50byBhIG5vLW9wIGFuZCBsaW5rIGl0IHRvIHRoZSBuZXcgY29tbWFuZC4KKyovCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGVlZG9fcHJpdmF0ZSAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gc3AtPnJlZ3M7CisJc3RydWN0IGRlc2NyaXB0b3IgKmxhc3RfY21kOworCWNoYXIgbmV3X3J4X21vZGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZW50cnksIGk7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CQkJLyogU2V0IHByb21pc2N1b3VzLiAqLworCQluZXdfcnhfbW9kZSA9IDM7CisJfSBlbHNlIGlmICgoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgIHx8CisJCQkgICBkZXYtPm1jX2NvdW50ID4gbXVsdGljYXN0X2ZpbHRlcl9saW1pdCkgeworCQluZXdfcnhfbW9kZSA9IDE7CisJfSBlbHNlCisJCW5ld19yeF9tb2RlID0gMDsKKworCWlmIChuZXRpZl9tc2dfcnhfc3RhdHVzKHNwKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzZXRfcnhfbW9kZSAlZCAtPiAlZFxuIiwgZGV2LT5uYW1lLAorCQkJCXNwLT5yeF9tb2RlLCBuZXdfcnhfbW9kZSk7CisKKwlpZiAoKGludCkoc3AtPmN1cl90eCAtIHNwLT5kaXJ0eV90eCkgPiBUWF9SSU5HX1NJWkUgLSBUWF9NVUxUSUNBU1RfU0laRSkgeworCSAgICAvKiBUaGUgVHggcmluZyBpcyBmdWxsIC0tIGRvbid0IGFkZCBhbnl0aGluZyEgIEhvcGUgdGhlIG1vZGUgd2lsbCBiZQorCQkgKiBzZXQgYWdhaW4gbGF0ZXIuICovCisJCXNwLT5yeF9tb2RlID0gLTE7CisJCXJldHVybjsKKwl9CisKKwlpZiAobmV3X3J4X21vZGUgIT0gc3AtPnJ4X21vZGUpIHsKKwkJdTggKmNvbmZpZ19jbWRfZGF0YTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3AtPmxvY2ssIGZsYWdzKTsKKwkJZW50cnkgPSBzcC0+Y3VyX3R4KysgJSBUWF9SSU5HX1NJWkU7CisJCWxhc3RfY21kID0gc3AtPmxhc3RfY21kOworCQlzcC0+bGFzdF9jbWQgPSAoc3RydWN0IGRlc2NyaXB0b3IgKikmc3AtPnR4X3JpbmdbZW50cnldOworCisJCXNwLT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsJCQkvKiBSZWR1bmRhbnQuICovCisJCXNwLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMgPSBjcHVfdG9fbGUzMihDbWRTdXNwZW5kIHwgQ21kQ29uZmlndXJlKTsKKwkJc3AtPnR4X3JpbmdbZW50cnldLmxpbmsgPQorCQkJY3B1X3RvX2xlMzIoVFhfUklOR19FTEVNX0RNQShzcCwgKGVudHJ5ICsgMSkgJSBUWF9SSU5HX1NJWkUpKTsKKwkJY29uZmlnX2NtZF9kYXRhID0gKHZvaWQgKikmc3AtPnR4X3JpbmdbZW50cnldLnR4X2Rlc2NfYWRkcjsKKwkJLyogQ29uc3RydWN0IGEgZnVsbCBDbWRDb25maWcgZnJhbWUuICovCisJCW1lbWNweShjb25maWdfY21kX2RhdGEsIGk4MjU1OF9jb25maWdfY21kLCBDT05GSUdfREFUQV9TSVpFKTsKKwkJY29uZmlnX2NtZF9kYXRhWzFdID0gKHR4ZmlmbyA8PCA0KSB8IHJ4ZmlmbzsKKwkJY29uZmlnX2NtZF9kYXRhWzRdID0gcnhkbWFjb3VudDsKKwkJY29uZmlnX2NtZF9kYXRhWzVdID0gdHhkbWFjb3VudCArIDB4ODA7CisJCWNvbmZpZ19jbWRfZGF0YVsxNV0gfD0gKG5ld19yeF9tb2RlICYgMikgPyAxIDogMDsKKwkJLyogMHg4MCBkb2Vzbid0IGRpc2FibGUgRkMgMHg4NCBkb2VzLgorCQkgICBEaXNhYmxlIEZsb3cgY29udHJvbCBzaW5jZSB3ZSBhcmUgbm90IEFDSy1pbmcgYW55IEZDIGludGVycnVwdHMKKwkJICAgZm9yIG5vdy4gLS1EcmFnYW4gKi8KKwkJY29uZmlnX2NtZF9kYXRhWzE5XSA9IDB4ODQ7CisJCWNvbmZpZ19jbWRfZGF0YVsxOV0gfD0gc3AtPm1paV9pZi5mdWxsX2R1cGxleCA/IDB4NDAgOiAwOworCQljb25maWdfY21kX2RhdGFbMjFdID0gKG5ld19yeF9tb2RlICYgMSkgPyAweDBEIDogMHgwNTsKKwkJaWYgKHNwLT5waHlbMF0gJiAweDgwMDApIHsJCQkvKiBVc2UgdGhlIEFVSSBwb3J0IGluc3RlYWQuICovCisJCQljb25maWdfY21kX2RhdGFbMTVdIHw9IDB4ODA7CisJCQljb25maWdfY21kX2RhdGFbOF0gPSAwOworCQl9CisJCS8qIFRyaWdnZXIgdGhlIGNvbW1hbmQgdW5pdCByZXN1bWUuICovCisJCXdhaXRfZm9yX2NtZF9kb25lKGRldiwgc3ApOworCQljbGVhcl9zdXNwZW5kKGxhc3RfY21kKTsKKwkJaW93cml0ZTgoQ1VSZXN1bWUsIGlvYWRkciArIFNDQkNtZCk7CisJCWlmICgoaW50KShzcC0+Y3VyX3R4IC0gc3AtPmRpcnR5X3R4KSA+PSBUWF9RVUVVRV9MSU1JVCkgeworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJc3AtPnR4X2Z1bGwgPSAxOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwLT5sb2NrLCBmbGFncyk7CisJfQorCisJaWYgKG5ld19yeF9tb2RlID09IDAgICYmICBkZXYtPm1jX2NvdW50IDwgNCkgeworCQkvKiBUaGUgc2ltcGxlIGNhc2Ugb2YgMC0zIG11bHRpY2FzdCBsaXN0IGVudHJpZXMgb2NjdXJzIG9mdGVuLCBhbmQKKwkJICAgZml0cyB3aXRoaW4gb25lIHR4X3JpbmdbXSBlbnRyeS4gKi8KKwkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJCXUxNiAqc2V0dXBfcGFyYW1zLCAqZWFkZHJzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzcC0+bG9jaywgZmxhZ3MpOworCQllbnRyeSA9IHNwLT5jdXJfdHgrKyAlIFRYX1JJTkdfU0laRTsKKwkJbGFzdF9jbWQgPSBzcC0+bGFzdF9jbWQ7CisJCXNwLT5sYXN0X2NtZCA9IChzdHJ1Y3QgZGVzY3JpcHRvciAqKSZzcC0+dHhfcmluZ1tlbnRyeV07CisKKwkJc3AtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQlzcC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzID0gY3B1X3RvX2xlMzIoQ21kU3VzcGVuZCB8IENtZE11bHRpY2FzdExpc3QpOworCQlzcC0+dHhfcmluZ1tlbnRyeV0ubGluayA9CisJCQljcHVfdG9fbGUzMihUWF9SSU5HX0VMRU1fRE1BKHNwLCAoZW50cnkgKyAxKSAlIFRYX1JJTkdfU0laRSkpOworCQlzcC0+dHhfcmluZ1tlbnRyeV0udHhfZGVzY19hZGRyID0gMDsgLyogUmVhbGx5IE1DIGxpc3QgY291bnQuICovCisJCXNldHVwX3BhcmFtcyA9ICh1MTYgKikmc3AtPnR4X3JpbmdbZW50cnldLnR4X2Rlc2NfYWRkcjsKKwkJKnNldHVwX3BhcmFtcysrID0gY3B1X3RvX2xlMTYoZGV2LT5tY19jb3VudCo2KTsKKwkJLyogRmlsbCBpbiB0aGUgbXVsdGljYXN0IGFkZHJlc3Nlcy4gKi8KKwkJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBpIDwgZGV2LT5tY19jb3VudDsKKwkJCSBpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQkJZWFkZHJzID0gKHUxNiAqKW1jbGlzdC0+ZG1pX2FkZHI7CisJCQkqc2V0dXBfcGFyYW1zKysgPSAqZWFkZHJzKys7CisJCQkqc2V0dXBfcGFyYW1zKysgPSAqZWFkZHJzKys7CisJCQkqc2V0dXBfcGFyYW1zKysgPSAqZWFkZHJzKys7CisJCX0KKworCQl3YWl0X2Zvcl9jbWRfZG9uZShkZXYsIHNwKTsKKwkJY2xlYXJfc3VzcGVuZChsYXN0X2NtZCk7CisJCS8qIEltbWVkaWF0ZWx5IHRyaWdnZXIgdGhlIGNvbW1hbmQgdW5pdCByZXN1bWUuICovCisJCWlvd3JpdGU4KENVUmVzdW1lLCBpb2FkZHIgKyBTQ0JDbWQpOworCisJCWlmICgoaW50KShzcC0+Y3VyX3R4IC0gc3AtPmRpcnR5X3R4KSA+PSBUWF9RVUVVRV9MSU1JVCkgeworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJc3AtPnR4X2Z1bGwgPSAxOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwLT5sb2NrLCBmbGFncyk7CisJfSBlbHNlIGlmIChuZXdfcnhfbW9kZSA9PSAwKSB7CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCQl1MTYgKnNldHVwX3BhcmFtcywgKmVhZGRyczsKKwkJc3RydWN0IHNwZWVkb19tY19ibG9jayAqbWNfYmxrOworCQlzdHJ1Y3QgZGVzY3JpcHRvciAqbWNfc2V0dXBfZnJtOworCQlpbnQgaTsKKworCQltY19ibGsgPSBrbWFsbG9jKHNpemVvZigqbWNfYmxrKSArIDIgKyBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0KjYsCisJCQkJCQkgR0ZQX0FUT01JQyk7CisJCWlmIChtY19ibGsgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRmFpbGVkIHRvIGFsbG9jYXRlIGEgc2V0dXAgZnJhbWUuXG4iLAorCQkJCSAgIGRldi0+bmFtZSk7CisJCQlzcC0+cnhfbW9kZSA9IC0xOyAvKiBXZSBmYWlsZWQsIHRyeSBhZ2Fpbi4gKi8KKwkJCXJldHVybjsKKwkJfQorCQltY19ibGstPm5leHQgPSBOVUxMOworCQltY19ibGstPmxlbiA9IDIgKyBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0KjY7CisJCW1jX2Jsay0+ZnJhbWVfZG1hID0KKwkJCXBjaV9tYXBfc2luZ2xlKHNwLT5wZGV2LCAmbWNfYmxrLT5mcmFtZSwgbWNfYmxrLT5sZW4sCisJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQltY19zZXR1cF9mcm0gPSAmbWNfYmxrLT5mcmFtZTsKKworCQkvKiBGaWxsIHRoZSBzZXR1cCBmcmFtZS4gKi8KKwkJaWYgKG5ldGlmX21zZ19pZnVwKHNwKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogQ29uc3RydWN0aW5nIGEgc2V0dXAgZnJhbWUgYXQgJXAuXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgbWNfc2V0dXBfZnJtKTsKKwkJbWNfc2V0dXBfZnJtLT5jbWRfc3RhdHVzID0KKwkJCWNwdV90b19sZTMyKENtZFN1c3BlbmQgfCBDbWRJbnRyIHwgQ21kTXVsdGljYXN0TGlzdCk7CisJCS8qIExpbmsgc2V0IGJlbG93LiAqLworCQlzZXR1cF9wYXJhbXMgPSAodTE2ICopJm1jX3NldHVwX2ZybS0+cGFyYW1zOworCQkqc2V0dXBfcGFyYW1zKysgPSBjcHVfdG9fbGUxNihkZXYtPm1jX2NvdW50KjYpOworCQkvKiBGaWxsIGluIHRoZSBtdWx0aWNhc3QgYWRkcmVzc2VzLiAqLworCQlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IGkgPCBkZXYtPm1jX2NvdW50OworCQkJIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQllYWRkcnMgPSAodTE2ICopbWNsaXN0LT5kbWlfYWRkcjsKKwkJCSpzZXR1cF9wYXJhbXMrKyA9ICplYWRkcnMrKzsKKwkJCSpzZXR1cF9wYXJhbXMrKyA9ICplYWRkcnMrKzsKKwkJCSpzZXR1cF9wYXJhbXMrKyA9ICplYWRkcnMrKzsKKwkJfQorCisJCS8qIERpc2FibGUgaW50ZXJydXB0cyB3aGlsZSBwbGF5aW5nIHdpdGggdGhlIFR4IENtZCBsaXN0LiAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3AtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAoc3AtPm1jX3NldHVwX3RhaWwpCisJCQlzcC0+bWNfc2V0dXBfdGFpbC0+bmV4dCA9IG1jX2JsazsKKwkJZWxzZQorCQkJc3AtPm1jX3NldHVwX2hlYWQgPSBtY19ibGs7CisJCXNwLT5tY19zZXR1cF90YWlsID0gbWNfYmxrOworCQltY19ibGstPnR4ID0gc3AtPmN1cl90eDsKKworCQllbnRyeSA9IHNwLT5jdXJfdHgrKyAlIFRYX1JJTkdfU0laRTsKKwkJbGFzdF9jbWQgPSBzcC0+bGFzdF9jbWQ7CisJCXNwLT5sYXN0X2NtZCA9IG1jX3NldHVwX2ZybTsKKworCQkvKiBDaGFuZ2UgdGhlIGNvbW1hbmQgdG8gYSBOb09wLCBwb2ludGluZyB0byB0aGUgQ21kTXVsdGkgY29tbWFuZC4gKi8KKwkJc3AtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQlzcC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzID0gY3B1X3RvX2xlMzIoQ21kTk9wKTsKKwkJc3AtPnR4X3JpbmdbZW50cnldLmxpbmsgPSBjcHVfdG9fbGUzMihtY19ibGstPmZyYW1lX2RtYSk7CisKKwkJLyogU2V0IHRoZSBsaW5rIGluIHRoZSBzZXR1cCBmcmFtZS4gKi8KKwkJbWNfc2V0dXBfZnJtLT5saW5rID0KKwkJCWNwdV90b19sZTMyKFRYX1JJTkdfRUxFTV9ETUEoc3AsIChlbnRyeSArIDEpICUgVFhfUklOR19TSVpFKSk7CisKKwkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNwLT5wZGV2LCBtY19ibGstPmZyYW1lX2RtYSwKKwkJCQkJCQkJCSAgIG1jX2Jsay0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCQl3YWl0X2Zvcl9jbWRfZG9uZShkZXYsIHNwKTsKKwkJY2xlYXJfc3VzcGVuZChsYXN0X2NtZCk7CisJCS8qIEltbWVkaWF0ZWx5IHRyaWdnZXIgdGhlIGNvbW1hbmQgdW5pdCByZXN1bWUuICovCisJCWlvd3JpdGU4KENVUmVzdW1lLCBpb2FkZHIgKyBTQ0JDbWQpOworCisJCWlmICgoaW50KShzcC0+Y3VyX3R4IC0gc3AtPmRpcnR5X3R4KSA+PSBUWF9RVUVVRV9MSU1JVCkgeworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJc3AtPnR4X2Z1bGwgPSAxOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKG5ldGlmX21zZ19yeF9zdGF0dXMoc3ApKQorCQkJcHJpbnRrKCIgQ21kTUNTZXR1cCBmcmFtZSBsZW5ndGggJWQgaW4gZW50cnkgJWQuXG4iLAorCQkJCSAgIGRldi0+bWNfY291bnQsIGVudHJ5KTsKKwl9CisKKwlzcC0+cnhfbW9kZSA9IG5ld19yeF9tb2RlOworfQorDAorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBlZXBybzEwMF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YSAocGRldik7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBzcC0+cmVnczsKKworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAwOworCQkKKwlkZWxfdGltZXJfc3luYygmc3AtPnRpbWVyKTsKKworCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwlpb3dyaXRlMzIoUG9ydFBhcnRpYWxSZXNldCwgaW9hZGRyICsgU0NCUG9ydCk7CisJCisJLyogWFhYIGNhbGwgcGNpX3NldF9wb3dlcl9zdGF0ZSAoKT8gKi8KKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9wb3dlcl9zdGF0ZSAocGRldiwgUENJX0QzaG90KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlZXBybzEwMF9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YSAocGRldik7CisJc3RydWN0IHNwZWVkb19wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBzcC0+cmVnczsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKwlwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gMDsKKworCS8qIEknbSBhYnNvbHV0ZWx5IHVuY2VydGFpbiBpZiB0aGlzIHBhcnQgb2YgY29kZSBtYXkgd29yay4KKwkgICBUaGUgcHJvYmxlbXMgYXJlOgorCSAgICAtIGNvcnJlY3QgaGFyZHdhcmUgcmVpbml0aWFsaXphdGlvbjsKKwkJLSBjb3JyZWN0IGRyaXZlciBiZWhhdmlvciBiZXR3ZWVuIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUKKwkJICByZWluaXRpYWxpemF0aW9uOworCQktIHNlcmlhbGl6YXRpb24gd2l0aCBvdGhlciBkcml2ZXIgY2FsbHMuCisJICAgMjAwMC8wMy8wOCAgU0FXICovCisJaW93cml0ZTE2KFNDQk1hc2tBbGwsIGlvYWRkciArIFNDQkNtZCk7CisJc3BlZWRvX3Jlc3VtZShkZXYpOworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwlzcC0+cnhfbW9kZSA9IC0xOworCXNwLT5mbG93X2N0cmwgPSBzcC0+cGFydG5lciA9IDA7CisJc2V0X3J4X21vZGUoZGV2KTsKKwlzcC0+dGltZXIuZXhwaXJlcyA9IFJVTl9BVCgyKkhaKTsKKwlhZGRfdGltZXIoJnNwLT50aW1lcik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBlZXBybzEwMF9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKwlzdHJ1Y3Qgc3BlZWRvX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJcmVsZWFzZV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKKworCXBjaV9pb3VubWFwKHBkZXYsIHNwLT5yZWdzKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFRYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgVHhGRCkKKwkJCQkJCQkJKyBzaXplb2Yoc3RydWN0IHNwZWVkb19zdGF0cyksCisJCQkJCQlzcC0+dHhfcmluZywgc3AtPnR4X3JpbmdfZG1hKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJZnJlZV9uZXRkZXYoZGV2KTsKK30KKwwKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBlZXBybzEwMF9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEyMjksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEyMDksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwMjksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwMzAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwMzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwMzIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwMzMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwMzQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwMzUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwMzYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwMzcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwMzgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwMzksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwM0EsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwM0IsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwM0MsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwM0QsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwM0UsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwNTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwNTksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEyMjcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI0NDksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI0NTksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI0NUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDUyMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDUyMDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyAwLH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZWVwcm8xMDBfcGNpX3RibCk7CisJCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZWVwcm8xMDBfZHJpdmVyID0geworCS5uYW1lCQk9ICJlZXBybzEwMCIsCisJLmlkX3RhYmxlCT0gZWVwcm8xMDBfcGNpX3RibCwKKwkucHJvYmUJCT0gZWVwcm8xMDBfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChlZXBybzEwMF9yZW1vdmVfb25lKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IGVlcHJvMTAwX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBlZXBybzEwMF9yZXN1bWUsCisjZW5kaWYgLyogQ09ORklHX1BNICovCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlZXBybzEwMF9pbml0X21vZHVsZSh2b2lkKQoreworI2lmZGVmIE1PRFVMRQorCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmVlcHJvMTAwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlZXBybzEwMF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZWVwcm8xMDBfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZWVwcm8xMDBfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZWVwcm8xMDBfY2xlYW51cF9tb2R1bGUpOworDAorLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1JL3Vzci9zcmMvbGludXgvbmV0L2luZXQgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWMgZWVwcm8xMDAuYyBgWyAtZiAvdXNyL2luY2x1ZGUvbGludXgvbW9kdmVyc2lvbnMuaCBdICYmIGVjaG8gLURNT0RWRVJTSU9OU2AiCisgKiAgYy1pbmRlbnQtbGV2ZWw6IDQKKyAqICBjLWJhc2ljLW9mZnNldDogNAorICogIHRhYi13aWR0aDogNAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lZXhwcmVzcy5jIGIvZHJpdmVycy9uZXQvZWV4cHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzhlNzk0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZWV4cHJlc3MuYwpAQCAtMCwwICsxLDE3NTIgQEAKKy8qIEludGVsIEV0aGVyRXhwcmVzcyAxNiBkZXZpY2UgZHJpdmVyIGZvciBMaW51eAorICoKKyAqIFdyaXR0ZW4gYnkgSm9obiBTdWxsaXZhbiwgMTk5NQorICogIGJhc2VkIG9uIG9yaWdpbmFsIGNvZGUgYnkgRG9uYWxkIEJlY2tlciwgd2l0aCBjaGFuZ2VzIGJ5CisgKiAgQWxhbiBDb3ggYW5kIFBhdWxpbmUgTWlkZGVsaW5rLgorICoKKyAqIFN1cHBvcnQgZm9yIDgtYml0IG1vZGUgYnkgWm9sdGFuIFN6aWxhZ3lpIDx6b2x0YW5zQGNzLmFyaXpvbmEuZWR1PgorICoKKyAqIE1hbnkgbW9kaWZpY2F0aW9ucywgYW5kIGN1cnJlbnRseSBtYWludGFpbmVkLCBieQorICogIFBoaWxpcCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KKyAqIEFkZGVkIHRoZSBDb21wYXEgTFRFICBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICogQWRkZWQgTUNBIHN1cHBvcnQgQWRhbSBGcml0emxlciA8bWlkQGF1ay5jeD4KKyAqCisgKiBOb3RlIC0gdGhpcyBkcml2ZXIgaXMgZXhwZXJpbWVudGFsIHN0aWxsIC0gaXQgaGFzIHByb2JsZW1zIG9uIGZhc3RlcgorICogbWFjaGluZXMuIFNvbWVvbmUgbmVlZHMgdG8gc2l0IGRvd24gYW5kIGdvIHRocm91Z2ggaXQgbGluZSBieSBsaW5lIHdpdGgKKyAqIGEgZGF0YWJvb2suLi4KKyAqLworCisvKiBUaGUgRXRoZXJFeHByZXNzIDE2IGlzIGEgZmFpcmx5IHNpbXBsZSBjYXJkLCBiYXNlZCBvbiBhIHNoYXJlZC1tZW1vcnkKKyAqIGRlc2lnbiB1c2luZyB0aGUgaTgyNTg2IEV0aGVybmV0IGNvcHJvY2Vzc29yLiAgSXQgYmVhcnMgbm8gcmVsYXRpb25zaGlwLAorICogYXMgZmFyIGFzIEkga25vdywgdG8gdGhlIHNpbWlsYXJseS1uYW1lZCAiRXRoZXJFeHByZXNzIFBybyIgcmFuZ2UuCisgKgorICogSGlzdG9yaWNhbGx5LCBMaW51eCBzdXBwb3J0IGZvciB0aGVzZSBjYXJkcyBoYXMgYmVlbiB2ZXJ5IGJhZC4gIEhvd2V2ZXIsCisgKiB0aGluZ3Mgc2VlbSB0byBiZSBnZXR0aW5nIGJldHRlciBzbG93bHkuCisgKi8KKworLyogSWYgeW91ciBjYXJkIGlzIGNvbmZ1c2VkIGFib3V0IHdoYXQgc29ydCBvZiBpbnRlcmZhY2UgaXQgaGFzIChlZyBpdAorICogcGVyc2lzdGVudGx5IHJlcG9ydHMgIjEwYmFzZVQiIHdoZW4gbm9uZSBpcyBmaXR0ZWQpLCBydW5uaW5nICdTT0ZUU0VUIC9CQVJUJworICogb3IgJ1NPRlRTRVQgL0xJU0EnIGZyb20gRE9TIHNlZW1zIHRvIGhlbHAuCisgKi8KKworLyogSGVyZSdzIHRoZSBzY29vcCBvbiBtZW1vcnkgbWFwcGluZy4KKyAqCisgKiBUaGVyZSBhcmUgdGhyZWUgd2F5cyB0byBhY2Nlc3MgRXRoZXJFeHByZXNzIGNhcmQgbWVtb3J5OiBlaXRoZXIgdXNpbmcgdGhlCisgKiBzaGFyZWQtbWVtb3J5IG1hcHBpbmcsIG9yIHVzaW5nIFBJTyB0aHJvdWdoIHRoZSBkYXRhcG9ydCwgb3IgdXNpbmcgUElPCisgKiB0aHJvdWdoIHRoZSAic2hhZG93IG1lbW9yeSIgcG9ydHMuCisgKgorICogVGhlIHNoYWRvdyBtZW1vcnkgc3lzdGVtIHdvcmtzIGJ5IGhhdmluZyB0aGUgY2FyZCBtYXAgc29tZSBvZiBpdHMgbWVtb3J5CisgKiBhcyBmb2xsb3dzOgorICoKKyAqICh0aGUgbG93IGZpdmUgYml0cyBvZiB0aGUgU01QVFIgYXJlIGlnbm9yZWQpCisgKgorICogIGJhc2UrMHg0MDAwLi40MDBmICAgICAgbWVtb3J5IGF0IFNNUFRSKzAuLjE1CisgKiAgYmFzZSsweDgwMDAuLjgwMGYgICAgICBtZW1vcnkgYXQgU01QVFIrMTYuLjMxCisgKiAgYmFzZSsweGMwMDAuLmMwMDcgICAgICBkdWJpb3VzIHN0dWZmIChtZW1vcnkgYXQgU01QVFIrMTYuLjIzIGFwcGFyZW50bHkpCisgKiAgYmFzZSsweGMwMDguLmMwMGYgICAgICBtZW1vcnkgYXQgMHgwMDA4Li4weDAwMGYKKyAqCisgKiBUaGlzIGxhc3Qgc2V0ICh0aGUgb25lIGF0IGMwMDgpIGlzIHBhcnRpY3VsYXJseSBoYW5keSBiZWNhdXNlIHRoZSBTQ0IKKyAqIGxpdmVzIGF0IDB4MDAwOC4gIFNvIHRoYXQgc2V0IG9mIHBvcnRzIGdpdmVzIHVzIGVhc3kgcmFuZG9tIGFjY2VzcyB0byBkYXRhCisgKiBpbiB0aGUgU0NCIHdpdGhvdXQgaGF2aW5nIHRvIG1lc3MgYXJvdW5kIHNldHRpbmcgdXAgcG9pbnRlcnMgYW5kIHRoZSBsaWtlLgorICogV2UgYWx3YXlzIHVzZSB0aGlzIG1ldGhvZCB0byBhY2Nlc3MgdGhlIFNDQiAodmlhIHRoZSBzY2JfeHgoKSBmdW5jdGlvbnMpLgorICoKKyAqIERhdGFwb3J0IGFjY2VzcyB3b3JrcyBieSBhaW1pbmcgdGhlIGFwcHJvcHJpYXRlIChyZWFkIG9yIHdyaXRlKSBwb2ludGVyCisgKiBhdCB0aGUgZmlyc3QgYWRkcmVzcyB5b3UncmUgaW50ZXJlc3RlZCBpbiwgYW5kIHRoZW4gcmVhZGluZyBvciB3cml0aW5nIGZyb20KKyAqIHRoZSBkYXRhcG9ydC4gIFRoZSBwb2ludGVycyBhdXRvLWluY3JlbWVudCBhZnRlciBlYWNoIHRyYW5zZmVyLiAgV2UgdXNlCisgKiB0aGlzIGZvciBkYXRhIHRyYW5zZmVyLgorICoKKyAqIFdlIGRvbid0IHVzZSB0aGUgc2hhcmVkLW1lbW9yeSBzeXN0ZW0gYmVjYXVzZSBpdCBhbGxlZ2VkbHkgZG9lc24ndCB3b3JrIG9uCisgKiBhbGwgY2FyZHMsIGFuZCBiZWNhdXNlIGl0J3MgYSBiaXQgbW9yZSBwcm9uZSB0byBnbyB3cm9uZyAoaXQncyBvbmUgbW9yZQorICogdGhpbmcgdG8gY29uZmlndXJlLi4uKS4KKyAqLworCisvKiBLbm93biBidWdzOgorICoKKyAqIC0gVGhlIGNhcmQgc2VlbXMgdG8gd2FudCB0byBnaXZlIHVzIHR3byBpbnRlcnJ1cHRzIGV2ZXJ5IHRpbWUgc29tZXRoaW5nCisgKiAgIGhhcHBlbnMsIHdoZXJlIGp1c3Qgb25lIHdvdWxkIGJlIGJldHRlci4KKyAqLworCisvKgorICoKKyAqIE5vdGUgYnkgWm9sdGFuIFN6aWxhZ3lpIDEwLTEyLTk2OgorICoKKyAqIEkndmUgc3VjY2VlZGVkIGluIGVsaW1pbmF0aW5nIHRoZSAiQ1Ugd2VkZ2VkIiBtZXNzYWdlcywgYW5kIGhlbmNlIHRoZQorICogbG9ja3Vwcywgd2hpY2ggd2VyZSBvbmx5IG9jY3VycmluZyB3aXRoIGNhcmRzIHJ1bm5pbmcgaW4gOC1iaXQgbW9kZSAoImZvcmNlCisgKiA4LWJpdCBvcGVyYXRpb24iIGluIEludGVsJ3MgU29mdFNldCB1dGlsaXR5KS4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIKKyAqIHNldHMgdGhlIDgyNTg2IGFuZCB0aGUgQVNJQyB0byA4LWJpdCBtb2RlIGF0IHN0YXJ0dXA7IGl0IGFsc28gc3RvcHMgdGhlCisgKiBDVSBiZWZvcmUgc3VibWl0dGluZyBhIHBhY2tldCBmb3IgdHJhbnNtaXNzaW9uLCBhbmQgdGhlbiByZXN0YXJ0cyBpdCBhcyBzb29uCisgKiBhcyB0aGUgcHJvY2VzcyBvZiBoYW5kaW5nIHRoZSBwYWNrZXQgaXMgY29tcGxldGUuIFRoaXMgaXMgZGVmaW5pdGVseSBhbgorICogdW5uZWNlc3Nhcnkgc2xvd2Rvd24gaWYgdGhlIGNhcmQgaXMgcnVubmluZyBpbiAxNi1iaXQgbW9kZTsgdGhlcmVmb3JlIG9uZQorICogc2hvdWxkIGRldGVjdCAxNi1iaXQgdnMgOC1iaXQgbW9kZSBmcm9tIHRoZSBFRVBST00gc2V0dGluZ3MgYW5kIGFjdCAKKyAqIGFjY29yZGluZ2x5LiBJbiA4LWJpdCBtb2RlIHdpdGggdGhpcyBidWdmaXggSSdtIGdldHRpbmcgYWJvdXQgMTUwIEsvcyBmb3IKKyAqIGZ0cCdzLCB3aGljaCBpcyBzaWduaWZpY2FudGx5IGJldHRlciB0aGFuIEkgZ2V0IGluIERPUywgc28gdGhlIG92ZXJoZWFkIG9mCisgKiBzdG9wcGluZyBhbmQgcmVzdGFydGluZyB0aGUgQ1Ugd2l0aCBlYWNoIHRyYW5zbWl0IGlzIG5vdCBwcm9oaWJpdGl2ZSBpbgorICogcHJhY3RpY2UuCisgKgorICogVXBkYXRlIGJ5IERhdmlkIFdvb2Rob3VzZSAxMS81Lzk5OgorICoKKyAqIEkndmUgc2VlbiAiQ1Ugd2VkZ2VkIiBtZXNzYWdlcyBpbiAxNi1iaXQgbW9kZSwgb24gdGhlIEFscGhhIGFyY2hpdGVjdHVyZS4KKyAqIEkgYXNzdW1lIHRoYXQgdGhpcyBpcyBiZWNhdXNlIDE2LWJpdCBhY2Nlc3NlcyBhcmUgYWN0dWFsbHkgaGFuZGxlZCBhcyB0d28KKyAqIDgtYml0IGFjY2Vzc2VzLgorICovCisKKyNpZmRlZiBfX2FscGhhX18KKyNkZWZpbmUgTE9DS1VQMTYgMQorI2VuZGlmCisjaWZuZGVmIExPQ0tVUDE2CisjZGVmaW5lIExPQ0tVUDE2IDAKKyNlbmRpZgorICAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS1sZWdhY3kuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2lmbmRlZiBORVRfREVCVUcKKyNkZWZpbmUgTkVUX0RFQlVHIDQKKyNlbmRpZgorCisjaW5jbHVkZSAiZWV4cHJlc3MuaCIKKworI2RlZmluZSBFRVhQX0lPX0VYVEVOVCAgMTYKKworLyoKKyAqIFByaXZhdGUgZGF0YSBkZWNsYXJhdGlvbnMKKyAqLworCitzdHJ1Y3QgbmV0X2xvY2FsCit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJdW5zaWduZWQgbG9uZyBsYXN0X3R4OyAgICAgICAvKiBqaWZmaWVzIHdoZW4gbGFzdCB0cmFuc21pdCBzdGFydGVkICovCisJdW5zaWduZWQgbG9uZyBpbml0X3RpbWU7ICAgICAvKiBqaWZmaWVzIHdoZW4gZWV4cF9od19pbml0NTg2IGNhbGxlZCAqLworCXVuc2lnbmVkIHNob3J0IHJ4X2ZpcnN0OyAgICAgLyogZmlyc3QgcnggYnVmLCBzYW1lIGFzIFJYX0JVRl9TVEFSVCAqLworCXVuc2lnbmVkIHNob3J0IHJ4X2xhc3Q7ICAgICAgLyogbGFzdCByeCBidWYgKi8KKwl1bnNpZ25lZCBzaG9ydCByeF9wdHI7ICAgICAgIC8qIGZpcnN0IHJ4IGJ1ZiB0byBsb29rIGF0ICovCisJdW5zaWduZWQgc2hvcnQgdHhfaGVhZDsgICAgICAvKiBuZXh0IGZyZWUgdHggYnVmICovCisJdW5zaWduZWQgc2hvcnQgdHhfcmVhcDsgICAgICAvKiBmaXJzdCBpbi11c2UgdHggYnVmICovCisJdW5zaWduZWQgc2hvcnQgdHhfdGFpbDsgICAgICAvKiBwcmV2aW91cyB0eCBidWYgdG8gdHhfaGVhZCAqLworCXVuc2lnbmVkIHNob3J0IHR4X2xpbms7ICAgICAgLyogbGFzdCBrbm93bi1leGVjdXRpbmcgdHggYnVmICovCisJdW5zaWduZWQgc2hvcnQgbGFzdF90eF9yZXN0YXJ0OyAgIC8qIHNldCB0byB0eF9saW5rIHdoZW4gd2UKKwkJCQkJICAgICByZXN0YXJ0IHRoZSBDVSAqLworCXVuc2lnbmVkIGNoYXIgc3RhcnRlZDsKKwl1bnNpZ25lZCBzaG9ydCByeF9idWZfc3RhcnQ7CisJdW5zaWduZWQgc2hvcnQgcnhfYnVmX2VuZDsKKwl1bnNpZ25lZCBzaG9ydCBudW1fdHhfYnVmczsKKwl1bnNpZ25lZCBzaG9ydCBudW1fcnhfYnVmczsKKwl1bnNpZ25lZCBjaGFyIHdpZHRoOyAgICAgICAgIC8qIDAgZm9yIDE2Yml0LCAxIGZvciA4Yml0ICovCisJdW5zaWduZWQgY2hhciB3YXNfcHJvbWlzYzsKKwl1bnNpZ25lZCBjaGFyIG9sZF9tY19jb3VudDsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCisvKiBUaGlzIGlzIHRoZSBjb2RlIGFuZCBkYXRhIHRoYXQgaXMgZG93bmxvYWRlZCB0byB0aGUgRXRoZXJFeHByZXNzIGNhcmQncworICogbWVtb3J5IGF0IGJvb3QgdGltZS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc3RhcnRfY29kZVtdID0geworLyogMHgwMDAwICovCisJMHgwMDAxLCAgICAgICAgICAgICAgICAgLyogSVNDUDogYnVzeSAtIGNsZWFyZWQgYWZ0ZXIgcmVzZXQgKi8KKwkweDAwMDgsMHgwMDAwLDB4MDAwMCwgICAvKiBvZmZzZXQsYWRkcmVzcyAobG8saGkpIG9mIFNDQiAqLworCisJMHgwMDAwLDB4MDAwMCwgICAgICAgICAgLyogU0NCOiBzdGF0dXMsIGNvbW1hbmRzICovCisJMHgwMDAwLDB4MDAwMCwgICAgICAgICAgLyogbGlua3MgdG8gZmlyc3QgY29tbWFuZCBibG9jaywKKwkJCQkgICBmaXJzdCByZWNlaXZlIGRlc2NyaXB0b3IgKi8KKwkweDAwMDAsMHgwMDAwLCAgICAgICAgICAvKiBDUkMgZXJyb3IsIGFsaWdubWVudCBlcnJvciBjb3VudHMgKi8KKwkweDAwMDAsMHgwMDAwLCAgICAgICAgICAvKiBvdXQgb2YgcmVzb3VyY2VzLCBvdmVycnVuIGVycm9yIGNvdW50cyAqLworCisJMHgwMDAwLDB4MDAwMCwgICAgICAgICAgLyogcGFkICovCisJMHgwMDAwLDB4MDAwMCwKKworLyogMHgyMCAtLSBzdGFydCBvZiA4MjU4NiBDVSBwcm9ncmFtICovCisjZGVmaW5lIENPTkZfTElOSyAweDIwCisJMHgwMDAwLENtZF9Db25maWcsICAgICAgCisJMHgwMDMyLCAgICAgICAgICAgICAgICAgLyogbGluayB0byBuZXh0IGNvbW1hbmQgKi8KKwkweDA4MGMsICAgICAgICAgICAgICAgICAvKiAxMiBieXRlcyBmb2xsb3cgOiBmaWZvIHRocmVzaG9sZD04ICovCisJMHgyZTQwLCAgICAgICAgICAgICAgICAgLyogZG9uJ3QgcnggYmFkIGZyYW1lcworCQkJCSAqIFNSRFkvQVJEWSA9PiBleHQuIHN5bmMuIDogcHJlYW1ibGUgbGVuPTgKKwkgICAgICAgICAgICAgICAgICAgICAgICAgKiB0YWtlIGFkZHJlc3NlcyBmcm9tIGRhdGEgYnVmZmVycworCQkJCSAqIDYgYnl0ZXMvYWRkcmVzcworCQkJCSAqLworCTB4NjAwMCwgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgYmFja29mZiBtZXRob2QgJiBwcmlvcml0eQorCQkJCSAqIGludGVyZnJhbWUgc3BhY2luZyA9IDB4NjAgKi8KKwkweGYyMDAsICAgICAgICAgICAgICAgICAvKiBzbG90IHRpbWU9MHgyMDAgCisJCQkJICogbWF4IGNvbGxpc2lvbiByZXRyeSA9IDB4ZiAqLworI2RlZmluZSBDT05GX1BST01JU0MgIDB4MmUKKwkweDAwMDAsICAgICAgICAgICAgICAgICAvKiBubyBIRExDIDogbm9ybWFsIENSQyA6IGVuYWJsZSBicm9hZGNhc3QgCisJCQkJICogZGlzYWJsZSBwcm9taXNjdW91cy9tdWx0aWNhc3QgbW9kZXMgKi8KKwkweDAwM2MsICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIGZyYW1lIGxlbmd0aCA9IDYwIG9jdGV0cykgKi8KKworCTB4MDAwMCxDbWRfU2V0QWRkciwKKwkweDAwM2UsICAgICAgICAgICAgICAgICAvKiBsaW5rIHRvIG5leHQgY29tbWFuZCAqLworI2RlZmluZSBDT05GX0hXQUREUiAgMHgzOAorCTB4MDAwMCwweDAwMDAsMHgwMDAwLCAgIC8qIGhhcmR3YXJlIGFkZHJlc3MgcGxhY2VkIGhlcmUgKi8KKworCTB4MDAwMCxDbWRfTUNhc3QsCisJMHgwMDc2LCAgICAgICAgICAgICAgICAgLyogbGluayB0byBuZXh0IGNvbW1hbmQgKi8KKyNkZWZpbmUgQ09ORl9OUl9NVUxUSUNBU1QgMHg0NAorCTB4MDAwMCwgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzICovCisjZGVmaW5lIENPTkZfTVVMVElDQVNUIDB4NDYKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAvKiBzb21lIGFkZHJlc3NlcyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisKKyNkZWZpbmUgQ09ORl9ESUFHX1JFU1VMVCAgMHg3NgorCTB4MDAwMCwgQ21kX0RpYWcsCisJMHgwMDdjLCAgICAgICAgICAgICAgICAgLyogbGluayB0byBuZXh0IGNvbW1hbmQgKi8KKworCTB4MDAwMCxDbWRfVERSfENtZF9JTlQsCisJMHgwMDg0LAorI2RlZmluZSBDT05GX1REUl9SRVNVTFQgIDB4ODIKKwkweDAwMDAsCisKKwkweDAwMDAsQ21kX0VORHxDbWRfTm9wLCAvKiBlbmQgb2YgY29uZmlndXJlIHNlcXVlbmNlICovCisJMHgwMDg0ICAgICAgICAgICAgICAgICAgLyogZHVtbXkgbGluayAqLworfTsKKworLyogbWFwcyBpcnEgbnVtYmVyIHRvIEV0aGVyRXhwcmVzcyBtYWdpYyB2YWx1ZSAqLworc3RhdGljIGNoYXIgaXJxcm1hcFtdID0geyAwLDAsMSwyLDMsNCwwLDAsMCwxLDUsNiwwLDAsMCwwIH07CisKKyNpZmRlZiBDT05GSUdfTUNBX0xFR0FDWQorLyogbWFwcGluZyBvZiB0aGUgZmlyc3QgZm91ciBiaXRzIG9mIHRoZSBzZWNvbmQgUE9TIHJlZ2lzdGVyICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbWNhX2lvbWFwW10gPSB7CisJMHgyNzAsIDB4MjYwLCAweDI1MCwgMHgyNDAsIDB4MjMwLCAweDIyMCwgMHgyMTAsIDB4MjAwLAorCTB4MzcwLCAweDM2MCwgMHgzNTAsIDB4MzQwLCAweDMzMCwgMHgzMjAsIDB4MzEwLCAweDMwMAorfTsKKy8qIGJpdHMgNS03IG9mIHRoZSBzZWNvbmQgUE9TIHJlZ2lzdGVyICovCitzdGF0aWMgY2hhciBtY2FfaXJxbWFwW10gPSB7IDEyLCA5LCAzLCA0LCA1LCAxMCwgMTEsIDE1IH07CisjZW5kaWYgCisKKy8qCisgKiBQcm90b3R5cGVzIGZvciBMaW51eCBpbnRlcmZhY2UKKyAqLworCitzdGF0aWMgaW50IGVleHBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZWV4cF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGVleHBfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZWV4cF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZWV4cF94bWl0KHN0cnVjdCBza19idWZmICpidWYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgaXJxcmV0dXJuX3QgZWV4cF9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2FkZHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIGVleHBfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoKKyAqIFByb3RvdHlwZXMgZm9yIGhhcmR3YXJlIGFjY2VzcyBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCBlZXhwX2h3X3J4X3BpbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGVleHBfaHdfdHhfcGlvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0ICpidWYsCisJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBsZW4pOworc3RhdGljIGludCBlZXhwX2h3X3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdW5zaWduZWQgc2hvcnQgaW9hZGRyKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBlZXhwX2h3X3JlYWRlZXByb20odW5zaWduZWQgc2hvcnQgaW9hZGRyLAorCQkJCQkgdW5zaWduZWQgY2hhciBsb2NhdGlvbik7CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBlZXhwX2h3X2xhc3R0eHN0YXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlZXhwX2h3X3R4cmVzdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHZvaWQgZWV4cF9od190eGluaXQgICAgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWV4cF9od19yeGluaXQgICAgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZCBlZXhwX2h3X2luaXQ1ODYgICAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlZXhwX3NldHVwX2ZpbHRlciAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBjaGFyICplZXhwX2lmbWFwW109eyJBVUkiLCAiQk5DIiwgIlJKNDUifTsKK2VudW0gZWV4cF9pZnR5cGUge0FVST0wLCBCTkM9MSwgVFBFPTJ9OworCisjZGVmaW5lIFNUQVJURURfUlUgICAgICAyCisjZGVmaW5lIFNUQVJURURfQ1UgICAgICAxCisKKy8qCisgKiBQcmltaXRpdmUgaGFyZHdhcmUgYWNjZXNzIGZ1bmN0aW9ucy4KKyAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IHNjYl9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gaW53KGRldi0+YmFzZV9hZGRyICsgMHhjMDA4KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBzY2JfcmRjbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gaW53KGRldi0+YmFzZV9hZGRyICsgMHhjMDBhKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNjYl9jb21tYW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IGNtZCkKK3sKKwlvdXR3KGNtZCwgZGV2LT5iYXNlX2FkZHIgKyAweGMwMGEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2NiX3dyY2JsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZhbCkKK3sKKwlvdXR3KHZhbCwgZGV2LT5iYXNlX2FkZHIgKyAweGMwMGMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2NiX3dycmZhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZhbCkKK3sKKwlvdXR3KHZhbCwgZGV2LT5iYXNlX2FkZHIgKyAweGMwMGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2xvb3BiYWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJb3V0YihpbmIoZGV2LT5iYXNlX2FkZHIgKyBDb25maWcpIHwgMiwgZGV2LT5iYXNlX2FkZHIgKyBDb25maWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfbG9vcGJhY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlvdXRiKGluYihkZXYtPmJhc2VfYWRkciArIENvbmZpZykgJiB+MiwgZGV2LT5iYXNlX2FkZHIgKyBDb25maWcpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGludCBTSEFET1coc2hvcnQgaW50IGFkZHIpCit7CisJYWRkciAmPSAweDFmOworCWlmIChhZGRyID4gMHhmKSBhZGRyICs9IDB4M2ZmMDsKKwlyZXR1cm4gYWRkciArIDB4NDAwMDsKK30KKworLyoKKyAqIExpbnV4IGludGVyZmFjZQorICovCisKKy8qCisgKiBjaGVja3MgZm9yIHByZXNlbmNlIG9mIEV0aGVyRXhwcmVzcyBjYXJkCisgKi8KKworc3RhdGljIGludCBfX2luaXQgZG9fZXhwcmVzc19wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIHNob3J0ICpwb3J0OworCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBwb3J0c1tdID0geyAweDI0MCwweDMwMCwweDMxMCwweDI3MCwweDMyMCwweDM0MCwwIH07CisJdW5zaWduZWQgc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGRldl9pcnEgPSBkZXYtPmlycTsKKwlpbnQgZXJyOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJZGV2LT5pZl9wb3J0ID0gMHhmZjsgLyogbm90IHNldCAqLworCisjaWZkZWYgQ09ORklHX01DQV9MRUdBQ1kKKwlpZiAoTUNBX2J1cykgeworCQlpbnQgc2xvdCA9IDA7CisKKwkJLyoKKwkJICogT25seSBmaW5kIG9uZSBjYXJkIGF0IGEgdGltZS4gIFN1YnNlcXVlbnQgY2FsbHMKKwkJICogd2lsbCBmaW5kIG90aGVycywgaG93ZXZlciwgcHJvcGVyIG11bHRpY2FyZCBNQ0EKKwkJICogcHJvYmluZyBhbmQgc2V0dXAgY2FuJ3QgYmUgZG9uZSB3aXRoIHRoZQorCQkgKiBvbGQtc3R5bGUgU3BhY2UuYyBpbml0IHJvdXRpbmVzLiAgLS0gQVNGCisJCSAqLworCQl3aGlsZSAoc2xvdCAhPSBNQ0FfTk9URk9VTkQpIHsKKwkJCWludCBwb3MwLCBwb3MxOworCQkJCisJCQlzbG90ID0gbWNhX2ZpbmRfdW51c2VkX2FkYXB0ZXIoMHg2MjhCLCBzbG90KTsKKwkJCWlmIChzbG90ID09IE1DQV9OT1RGT1VORCkKKwkJCQlicmVhazsKKworCQkJcG9zMCA9IG1jYV9yZWFkX3N0b3JlZF9wb3Moc2xvdCwgMik7CisJCQlwb3MxID0gbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCAzKTsKKwkJCWlvYWRkciA9IG1jYV9pb21hcFtwb3MxJjB4Zl07CisKKwkJCWRldi0+aXJxID0gbWNhX2lycW1hcFsocG9zMT4+NCkmMHg3XTsKKwkJCQorCQkJLyoKKwkJCSAqIFhYWDogVHJhbnNjaWV2ZXIgc2VsZWN0aW9uIGlzIGRvbmUKKwkJCSAqIGRpZmZlcmVudGx5IG9uIHRoZSBNQ0EgdmVyc2lvbi4gIAorCQkJICogSG93IHRvIGdldCBpdCB0byBzZWxlY3Qgc29tZXRoaW5nCisJCQkgKiBvdGhlciB0aGFuIGV4dGVybmFsL0FVSSBpcyBjdXJyZW50bHkKKwkJCSAqIHVua25vd24uICBUaGlzIGNvZGUgaXMganVzdCBmb3IgbG9va3MuIC0tIEFTRgorCQkJICovCisJCQlpZiAoKHBvczAgJiAweDcpID09IDB4MSkKKwkJCQlkZXYtPmlmX3BvcnQgPSBBVUk7CisJCQllbHNlIGlmICgocG9zMCAmIDB4NykgPT0gMHg1KSB7CisJCQkJaWYgKHBvczEgJiAweDgwKQorCQkJCQlkZXYtPmlmX3BvcnQgPSBCTkM7CisJCQkJZWxzZQorCQkJCQlkZXYtPmlmX3BvcnQgPSBUUEU7CisJCQl9CisKKwkJCW1jYV9zZXRfYWRhcHRlcl9uYW1lKHNsb3QsICJJbnRlbCBFdGhlckV4cHJlc3MgMTYgTUNBIik7CisJCQltY2Ffc2V0X2FkYXB0ZXJfcHJvY2ZuKHNsb3QsIE5VTEwsIGRldik7CisJCQltY2FfbWFya19hc191c2VkKHNsb3QpOworCisJCQlicmVhazsKKwkJfQorCX0KKyNlbmRpZgorCWlmIChpb2FkZHImMHhmZTAwKSB7CisJCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBFRVhQX0lPX0VYVEVOVCwgIkV0aGVyRXhwcmVzcyIpKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJZXJyID0gZWV4cF9od19wcm9iZShkZXYsaW9hZGRyKTsKKwkJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBFRVhQX0lPX0VYVEVOVCk7CisJCXJldHVybiBlcnI7CisJfSBlbHNlIGlmIChpb2FkZHIpCisJCXJldHVybiAtRU5YSU87CisKKwlmb3IgKHBvcnQ9JnBvcnRzWzBdIDsgKnBvcnQgOyBwb3J0KysgKQorCXsKKwkJdW5zaWduZWQgc2hvcnQgc3VtID0gMDsKKwkJaW50IGk7CisJCWlmICghcmVxdWVzdF9yZWdpb24oKnBvcnQsIEVFWFBfSU9fRVhURU5ULCAiRXRoZXJFeHByZXNzIikpCisJCQljb250aW51ZTsKKwkJZm9yICggaT0wIDsgaTw0IDsgaSsrICkKKwkJeworCQkJdW5zaWduZWQgc2hvcnQgdDsKKwkJCXQgPSBpbmIoKnBvcnQgKyBJRF9QT1JUKTsKKwkJCXN1bSB8PSAodD4+NCkgPDwgKCh0ICYgMHgwMyk8PDIpOworCQl9CisJCWlmIChzdW09PTB4YmFiYSAmJiAhZWV4cF9od19wcm9iZShkZXYsKnBvcnQpKSB7CisJCQlyZWxlYXNlX3JlZ2lvbigqcG9ydCwgRUVYUF9JT19FWFRFTlQpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmVsZWFzZV9yZWdpb24oKnBvcnQsIEVFWFBfSU9fRVhURU5UKTsKKwkJZGV2LT5pcnEgPSBkZXZfaXJxOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworI2lmbmRlZiBNT0RVTEUKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGV4cHJlc3NfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCisJZXJyID0gZG9fZXhwcmVzc19wcm9iZShkZXYpOworCWlmICghZXJyKSB7CisJCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCQlpZiAoIWVycikKKwkJCXJldHVybiBkZXY7CisJfQorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKyNlbmRpZgorCisvKgorICogb3BlbiBhbmQgaW5pdGlhbGl6ZSB0aGUgYWRhcHRlciwgcmVhZHkgZm9yIHVzZQorICovCisKK3N0YXRpYyBpbnQgZWV4cF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKyNpZiBORVRfREVCVUcgPiA2CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlZXhwX29wZW4oKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJaWYgKCFkZXYtPmlycSB8fCAhaXJxcm1hcFtkZXYtPmlycV0pCisJCXJldHVybiAtRU5YSU87CisKKwlyZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwmZWV4cF9pcnEsMCxkZXYtPm5hbWUsZGV2KTsKKwlpZiAocmV0KSByZXR1cm4gcmV0OworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIEVFWFBfSU9fRVhURU5ULCAiRXRoZXJFeHByZXNzIikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRXRoZXJFeHByZXNzIGlvIHBvcnQgJXgsIGlzIGJ1c3kuXG4iCisJCQksIGlvYWRkcik7CisJCWdvdG8gZXJyX291dDE7CisJfQorCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyKzB4NDAwMCwgRUVYUF9JT19FWFRFTlQsICJFdGhlckV4cHJlc3Mgc2hhZG93IikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRXRoZXJFeHByZXNzIGlvIHBvcnQgJXgsIGlzIGJ1c3kuXG4iCisJCQksIGlvYWRkcisweDQwMDApOworCQlnb3RvIGVycl9vdXQyOworCX0KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkcisweDgwMDAsIEVFWFBfSU9fRVhURU5ULCAiRXRoZXJFeHByZXNzIHNoYWRvdyIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkV0aGVyRXhwcmVzcyBpbyBwb3J0ICV4LCBpcyBidXN5LlxuIgorCQkJLCBpb2FkZHIrMHg4MDAwKTsKKwkJZ290byBlcnJfb3V0MzsKKwl9CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIrMHhjMDAwLCBFRVhQX0lPX0VYVEVOVCwgIkV0aGVyRXhwcmVzcyBzaGFkb3ciKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJFdGhlckV4cHJlc3MgaW8gcG9ydCAleCwgaXMgYnVzeS5cbiIKKwkJCSwgaW9hZGRyKzB4YzAwMCk7CisJCWdvdG8gZXJyX291dDQ7CisJfQorCQorCWlmIChscC0+d2lkdGgpIHsKKwkJcHJpbnRrKCIlczogZm9yY2luZyBBU0lDIHRvIDgtYml0IG1vZGVcbiIsIGRldi0+bmFtZSk7CisJCW91dGIoaW5iKGRldi0+YmFzZV9hZGRyK0NvbmZpZykmfjQsIGRldi0+YmFzZV9hZGRyK0NvbmZpZyk7CisJfQorCisJZWV4cF9od19pbml0NTg2KGRldik7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyNpZiBORVRfREVCVUcgPiA2CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBsZWF2aW5nIGVleHBfb3BlbigpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJcmV0dXJuIDA7CisKKwllcnJfb3V0NDoKKwkJcmVsZWFzZV9yZWdpb24oaW9hZGRyKzB4ODAwMCwgRUVYUF9JT19FWFRFTlQpOworCWVycl9vdXQzOgorCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIrMHg0MDAwLCBFRVhQX0lPX0VYVEVOVCk7CisJZXJyX291dDI6CisJCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgRUVYUF9JT19FWFRFTlQpOworCWVycl9vdXQxOgorCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJcmV0dXJuIC1FQlVTWTsKK30KKworLyoKKyAqIGNsb3NlIGFuZCBkaXNhYmxlIHRoZSBpbnRlcmZhY2UsIGxlYXZpbmcgdGhlIDU4NiBpbiByZXNldC4KKyAqLworCitzdGF0aWMgaW50IGVleHBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpbnQgaXJxID0gZGV2LT5pcnE7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJb3V0YihTSVJRX2Rpc3xpcnFybWFwW2lycV0saW9hZGRyK1NFVF9JUlEpOworCWxwLT5zdGFydGVkID0gMDsKKwlzY2JfY29tbWFuZChkZXYsIFNDQl9DVXN1c3BlbmR8U0NCX1JVc3VzcGVuZCk7CisJb3V0YigwLGlvYWRkcitTSUdOQUxfQ0EpOworCWZyZWVfaXJxKGlycSxkZXYpOworCW91dGIoaTU4Nl9SU1QsaW9hZGRyK0VFUFJPTV9DdHJsKTsKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEVFWFBfSU9fRVhURU5UKTsKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIrMHg0MDAwLCAxNik7CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyKzB4ODAwMCwgMTYpOworCXJlbGVhc2VfcmVnaW9uKGlvYWRkcisweGMwMDAsIDE2KTsKKworCXJldHVybiAwOworfQorCisvKgorICogUmV0dXJuIGludGVyZmFjZSBzdGF0cworICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZWV4cF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiAmbHAtPnN0YXRzOworfQorCisvKgorICogVGhpcyBnZXRzIGNhbGxlZCB3aGVuIGEgaGlnaGVyIGxldmVsIHRoaW5rcyB3ZSBhcmUgYnJva2VuLiAgQ2hlY2sgdGhhdAorICogbm90aGluZyBoYXMgYmVjb21lIGphbW1lZCBpbiB0aGUgQ1UuCisgKi8KKworc3RhdGljIHZvaWQgdW5zdGlja19jdShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWlmIChscC0+c3RhcnRlZCkKKwl7CisJCWlmICgoamlmZmllcyAtIGRldi0+dHJhbnNfc3RhcnQpPjUwKQorCQl7CisJCQlpZiAobHAtPnR4X2xpbms9PWxwLT5sYXN0X3R4X3Jlc3RhcnQpCisJCQl7CisJCQkJdW5zaWduZWQgc2hvcnQgYm9ndXNjb3VudD0yMDAscnNzdDsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmV0cmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlMDR4LCByZXNldHRpbmcuLi5cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgc2NiX3N0YXR1cyhkZXYpKTsKKwkJCQllZXhwX2h3X3R4aW5pdChkZXYpOworCQkJCWxwLT5sYXN0X3R4X3Jlc3RhcnQgPSAwOworCQkJCXNjYl93cmNibChkZXYsIGxwLT50eF9saW5rKTsKKwkJCQlzY2JfY29tbWFuZChkZXYsIFNDQl9DVXN0YXJ0KTsKKwkJCQlvdXRiKDAsaW9hZGRyK1NJR05BTF9DQSk7CisJCQkJd2hpbGUgKCFTQ0JfY29tcGxldGUocnNzdD1zY2Jfc3RhdHVzKGRldikpKQorCQkJCXsKKwkJCQkJaWYgKCEtLWJvZ3VzY291bnQpCisJCQkJCXsKKwkJCQkJCWJvZ3VzY291bnQ9MjAwOworCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlc2V0IHRpbWVkIG91dCBzdGF0dXMgJTA0eCwgcmV0cnlpbmcuLi5cbiIsCisJCQkJCQkgICAgICAgZGV2LT5uYW1lLHJzc3QpOworCQkJCQkJc2NiX3dyY2JsKGRldiwgbHAtPnR4X2xpbmspOworCQkJCQkJc2NiX2NvbW1hbmQoZGV2LCBTQ0JfQ1VzdGFydCk7CisJCQkJCQlvdXRiKDAsaW9hZGRyK1NJR05BTF9DQSk7CisJCQkJCX0KKwkJCQl9CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXVuc2lnbmVkIHNob3J0IHN0YXR1cyA9IHNjYl9zdGF0dXMoZGV2KTsKKwkJCQlpZiAoU0NCX0NVZGVhZChzdGF0dXMpKQorCQkJCXsKKwkJCQkJdW5zaWduZWQgc2hvcnQgdHhzdGF0dXMgPSBlZXhwX2h3X2xhc3R0eHN0YXQoZGV2KTsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRyYW5zbWl0IHRpbWVkIG91dCwgQ1Ugbm90IGFjdGl2ZSBzdGF0dXMgJTA0eCAlMDR4LCByZXN0YXJ0aW5nLi4uXG4iLAorCQkJCQkgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMsIHR4c3RhdHVzKTsKKwkJCQkJZWV4cF9od190eHJlc3RhcnQoZGV2KTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJdW5zaWduZWQgc2hvcnQgdHhzdGF0dXMgPSBlZXhwX2h3X2xhc3R0eHN0YXQoZGV2KTsKKwkJCQkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJiAhdHhzdGF0dXMpCisJCQkJCXsKKwkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDVSB3ZWRnZWQsIHN0YXR1cyAlMDR4ICUwNHgsIHJlc2V0dGluZy4uLlxuIiwKKwkJCQkJCSAgICAgICBkZXYtPm5hbWUsc3RhdHVzLHR4c3RhdHVzKTsKKwkJCQkJCWVleHBfaHdfaW5pdDU4NihkZXYpOworCQkJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dFxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlpZiAoKGppZmZpZXMtbHAtPmluaXRfdGltZSk+MTApCisJCXsKKwkJCXVuc2lnbmVkIHNob3J0IHN0YXR1cyA9IHNjYl9zdGF0dXMoZGV2KTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpODI1ODYgc3RhcnR1cCB0aW1lZCBvdXQsIHN0YXR1cyAlMDR4LCByZXNldHRpbmcuLi5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJZWV4cF9od19pbml0NTg2KGRldik7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVleHBfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyNpZmRlZiBDT05GSUdfU01QCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNlbmRpZgorCWludCBzdGF0dXM7CisJCisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCisJLyoKKwkgKglCZXN0IHdvdWxkIGJlIHRvIHVzZSBzeW5jaHJvbml6ZV9pcnEoKTsgc3Bpbl9sb2NrKCkgaGVyZQorCSAqCWxldHMgbWFrZSBpdCB3b3JrIGZpcnN0Li4KKwkgKi8KKwkgCisjaWZkZWYgQ09ORklHX1NNUAorCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworI2VuZGlmCisKKwlzdGF0dXMgPSBzY2Jfc3RhdHVzKGRldik7CisJdW5zdGlja19jdShkZXYpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsICVzP1xuIiwgZGV2LT5uYW1lLAorCSAgICAgICAoU0NCX2NvbXBsZXRlKHN0YXR1cyk/Imxvc3QgaW50ZXJydXB0IjoKKwkJImJvYXJkIG9uIGZpcmUiKSk7CisJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCWxwLT5sYXN0X3R4ID0gamlmZmllczsKKwlpZiAoIVNDQl9jb21wbGV0ZShzdGF0dXMpKSB7CisJCXNjYl9jb21tYW5kKGRldiwgU0NCX0NVYWJvcnQpOworCQlvdXRiKDAsZGV2LT5iYXNlX2FkZHIrU0lHTkFMX0NBKTsKKwl9CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwkKKyNpZmRlZiBDT05GSUdfU01QCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyNlbmRpZgorfQorCisvKgorICogQ2FsbGVkIHRvIHRyYW5zbWl0IGEgcGFja2V0LCBvciB0byBhbGxvdyB1cyB0byByaWdodCBvdXJzZWx2ZXMKKyAqIGlmIHRoZSBrZXJuZWwgdGhpbmtzIHdlJ3ZlIGRpZWQuCisgKi8KK3N0YXRpYyBpbnQgZWV4cF94bWl0KHN0cnVjdCBza19idWZmICpidWYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNob3J0IGxlbmd0aCA9IGJ1Zi0+bGVuOworI2lmZGVmIENPTkZJR19TTVAKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2VuZGlmCisKKyNpZiBORVRfREVCVUcgPiA2CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlZXhwX3htaXQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJaWYgKGJ1Zi0+bGVuIDwgRVRIX1pMRU4pIHsKKwkJYnVmID0gc2tiX3BhZHRvKGJ1ZiwgRVRIX1pMRU4pOworCQlpZiAoYnVmID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJbGVuZ3RoID0gRVRIX1pMRU47CisJfQorCisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCisJLyoKKwkgKglCZXN0IHdvdWxkIGJlIHRvIHVzZSBzeW5jaHJvbml6ZV9pcnEoKTsgc3Bpbl9sb2NrKCkgaGVyZQorCSAqCWxldHMgbWFrZSBpdCB3b3JrIGZpcnN0Li4KKwkgKi8KKwkgCisjaWZkZWYgQ09ORklHX1NNUAorCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworI2VuZGlmCisgIAorCXsKKwkJdW5zaWduZWQgc2hvcnQgKmRhdGEgPSAodW5zaWduZWQgc2hvcnQgKilidWYtPmRhdGE7CisKKwkJbHAtPnN0YXRzLnR4X2J5dGVzICs9IGxlbmd0aDsKKworCSAgICAgICAgZWV4cF9od190eF9waW8oZGV2LGRhdGEsbGVuZ3RoKTsKKwl9CisJZGV2X2tmcmVlX3NrYihidWYpOworI2lmZGVmIENPTkZJR19TTVAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworI2VuZGlmCisJZW5hYmxlX2lycShkZXYtPmlycSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBIYW5kbGUgYW4gRXRoZXJFeHByZXNzIGludGVycnVwdAorICogSWYgd2UndmUgZmluaXNoZWQgaW5pdGlhbGl6aW5nLCBzdGFydCB0aGUgUlUgYW5kIENVIHVwLgorICogSWYgd2UndmUgYWxyZWFkeSBzdGFydGVkLCByZWFwIHR4IGJ1ZmZlcnMsIGhhbmRsZSBhbnkgcmVjZWl2ZWQgcGFja2V0cywKKyAqIGNoZWNrIHRvIG1ha2Ugc3VyZSB3ZSd2ZSBub3QgYmVjb21lIHdlZGdlZC4KKyAqLworCisvKgorICogSGFuZGxlIGFuIEV0aGVyRXhwcmVzcyBpbnRlcnJ1cHQKKyAqIElmIHdlJ3ZlIGZpbmlzaGVkIGluaXRpYWxpemluZywgc3RhcnQgdGhlIFJVIGFuZCBDVSB1cC4KKyAqIElmIHdlJ3ZlIGFscmVhZHkgc3RhcnRlZCwgcmVhcCB0eCBidWZmZXJzLCBoYW5kbGUgYW55IHJlY2VpdmVkIHBhY2tldHMsCisgKiBjaGVjayB0byBtYWtlIHN1cmUgd2UndmUgbm90IGJlY29tZSB3ZWRnZWQuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGVleHBfc3RhcnRfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICB1bnNpZ25lZCBzaG9ydCBzdGF0dXMpCit7CisJdW5zaWduZWQgc2hvcnQgYWNrX2NtZCA9IFNDQl9hY2soc3RhdHVzKTsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaWYgKChkZXYtPmZsYWdzICYgSUZGX1VQKSAmJiAhKGxwLT5zdGFydGVkICYgU1RBUlRFRF9DVSkpIHsKKwkJc2hvcnQgZGlhZ19zdGF0dXMsIHRkcl9zdGF0dXM7CisJCXdoaWxlIChTQ0JfQ1VzdGF0KHN0YXR1cyk9PTIpCisJCQlzdGF0dXMgPSBzY2Jfc3RhdHVzKGRldik7CisjaWYgTkVUX0RFQlVHID4gNAorCQlwcmludGsoIiVzOiBDVSB3ZW50IG5vbi1hY3RpdmUgKHN0YXR1cyAlMDR4KVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKyNlbmRpZgorCisJCW91dHcoQ09ORl9ESUFHX1JFU1VMVCAmIH4zMSwgaW9hZGRyICsgU01fUFRSKTsKKwkJZGlhZ19zdGF0dXMgPSBpbncoaW9hZGRyICsgU0hBRE9XKENPTkZfRElBR19SRVNVTFQpKTsKKwkJaWYgKGRpYWdfc3RhdHVzICYgMTw8MTEpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiA4MjU4NiBmYWlsZWQgc2VsZi10ZXN0XG4iLCAKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQl9IGVsc2UgaWYgKCEoZGlhZ19zdGF0dXMgJiAxPDwxMykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiA4MjU4NiBzZWxmLXRlc3QgZmFpbGVkIHRvIGNvbXBsZXRlXG4iLCBkZXYtPm5hbWUpOworCQl9CisKKwkJb3V0dyhDT05GX1REUl9SRVNVTFQgJiB+MzEsIGlvYWRkciArIFNNX1BUUik7CisJCXRkcl9zdGF0dXMgPSBpbncoaW9hZGRyICsgU0hBRE9XKENPTkZfVERSX1JFU1VMVCkpOworCQlpZiAodGRyX3N0YXR1cyAmIChURFJfU0hPUlR8VERSX09QRU4pKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVERSIHJlcG9ydHMgY2FibGUgJXMgYXQgJWQgdGljayVzXG4iLCBkZXYtPm5hbWUsICh0ZHJfc3RhdHVzICYgVERSX1NIT1JUKT8ic2hvcnQiOiJicm9rZW4iLCB0ZHJfc3RhdHVzICYgVERSX1RJTUUsICgodGRyX3N0YXR1cyAmIFREUl9USU1FKSAhPSAxKSA/ICJzIiA6ICIiKTsKKwkJfSAKKwkJZWxzZSBpZiAodGRyX3N0YXR1cyAmIFREUl9YQ1ZSUFJPQkxFTSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFREUiByZXBvcnRzIHRyYW5zY2VpdmVyIHByb2JsZW1cbiIsIGRldi0+bmFtZSk7CisJCX0KKwkJZWxzZSBpZiAodGRyX3N0YXR1cyAmIFREUl9MSU5LT0spIHsKKyNpZiBORVRfREVCVUcgPiA0CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFREUiByZXBvcnRzIGxpbmsgT0tcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCXByaW50aygiJXM6IFREUiBpcyBnYS1nYSAoc3RhdHVzICUwNHgpXG4iLCBkZXYtPm5hbWUsCisJCQkgICAgICAgdGRyX3N0YXR1cyk7CisJCX0KKwkJCQorCQlscC0+c3RhcnRlZCB8PSBTVEFSVEVEX0NVOworCQlzY2Jfd3JjYmwoZGV2LCBscC0+dHhfbGluayk7CisJCS8qIGlmIHRoZSBSVSBpc24ndCBydW5uaW5nLCBzdGFydCBpdCBub3cgKi8KKwkJaWYgKCEobHAtPnN0YXJ0ZWQgJiBTVEFSVEVEX1JVKSkgeworCQkJYWNrX2NtZCB8PSBTQ0JfUlVzdGFydDsKKwkJCXNjYl93cnJmYShkZXYsIGxwLT5yeF9idWZfc3RhcnQpOworCQkJbHAtPnJ4X3B0ciA9IGxwLT5yeF9idWZfc3RhcnQ7CisJCQlscC0+c3RhcnRlZCB8PSBTVEFSVEVEX1JVOworCQl9CisJCWFja19jbWQgfD0gU0NCX0NVc3RhcnQgfCAweDIwMDA7CisJfQorCisJaWYgKChkZXYtPmZsYWdzICYgSUZGX1VQKSAmJiAhKGxwLT5zdGFydGVkICYgU1RBUlRFRF9SVSkgJiYgU0NCX1JVc3RhdChzdGF0dXMpPT00KSAKKwkJbHAtPnN0YXJ0ZWR8PVNUQVJURURfUlU7CisKKwlyZXR1cm4gYWNrX2NtZDsKK30KKworc3RhdGljIHZvaWQgZWV4cF9jbWRfY2xlYXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGludCBvbGR0aW1lID0gamlmZmllczsKKwl3aGlsZSAoc2NiX3JkY21kKGRldikgJiYgKChqaWZmaWVzLW9sZHRpbWUpPDEwKSk7CisJaWYgKHNjYl9yZGNtZChkZXYpKSB7CisJCXByaW50aygiJXM6IGNvbW1hbmQgZGlkbid0IGNsZWFyXG4iLCBkZXYtPm5hbWUpOworCX0KK30KKwkKK3N0YXRpYyBpcnFyZXR1cm5fdCBlZXhwX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaW5mbywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pbmZvOworCXN0cnVjdCBuZXRfbG9jYWwgKmxwOworCXVuc2lnbmVkIHNob3J0IGlvYWRkcixzdGF0dXMsYWNrX2NtZDsKKwl1bnNpZ25lZCBzaG9ydCBvbGRfcmVhZF9wdHIsIG9sZF93cml0ZV9wdHI7CisKKwlpZiAoZGV2PT1OVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZWV4cHJlc3M6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2VcbiIsCisJCSAgICAgICBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJc3Bpbl9sb2NrKCZscC0+bG9jayk7CisKKwlvbGRfcmVhZF9wdHIgPSBpbncoaW9hZGRyK1JFQURfUFRSKTsKKwlvbGRfd3JpdGVfcHRyID0gaW53KGlvYWRkcitXUklURV9QVFIpOworCisJb3V0YihTSVJRX2Rpc3xpcnFybWFwW2lycV0saW9hZGRyK1NFVF9JUlEpOworCisJCisJc3RhdHVzID0gc2NiX3N0YXR1cyhkZXYpOworCisjaWYgTkVUX0RFQlVHID4gNAorCXByaW50ayhLRVJOX0RFQlVHICIlczogaW50ZXJydXB0IChzdGF0dXMgJXgpXG4iLCBkZXYtPm5hbWUsIHN0YXR1cyk7CisjZW5kaWYKKworCWlmIChscC0+c3RhcnRlZCA9PSAoU1RBUlRFRF9DVSB8IFNUQVJURURfUlUpKSB7CisKKwkJZG8geworCQkJZWV4cF9jbWRfY2xlYXIoZGV2KTsKKworCQkJYWNrX2NtZCA9IFNDQl9hY2soc3RhdHVzKTsKKwkJCXNjYl9jb21tYW5kKGRldiwgYWNrX2NtZCk7CisJCQlvdXRiKDAsaW9hZGRyK1NJR05BTF9DQSk7CisKKwkJCWVleHBfY21kX2NsZWFyKGRldik7CisKKwkJCWlmIChTQ0JfY29tcGxldGUoc3RhdHVzKSkgeworCQkJCWlmICghZWV4cF9od19sYXN0dHhzdGF0KGRldikpIHsKKwkJCQkJcHJpbnRrKCIlczogdHggaW50ZXJydXB0IGJ1dCBubyBzdGF0dXNcbiIsIGRldi0+bmFtZSk7CisJCQkJfQorCQkJfQorCQkJCisJCQlpZiAoU0NCX3J4ZGZyYW1lKHN0YXR1cykpIAorCQkJCWVleHBfaHdfcnhfcGlvKGRldik7CisKKwkJCXN0YXR1cyA9IHNjYl9zdGF0dXMoZGV2KTsKKwkJfSB3aGlsZSAoc3RhdHVzICYgMHhjMDAwKTsKKworCQlpZiAoU0NCX1JVZGVhZChzdGF0dXMpKSAKKwkJeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJVIHN0b3BwZWQ6IHN0YXR1cyAlMDR4XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSxzdGF0dXMpOworI2lmIDAKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjdXJfcmZkPSUwNHgsIGN1cl9yYmQ9JTA0eFxuIiwgZGV2LT5uYW1lLCBscC0+Y3VyX3JmZCwgbHAtPmN1cl9yYmQpOworCQkJb3V0dyhscC0+Y3VyX3JmZCwgaW9hZGRyK1JFQURfUFRSKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBbJTA0eF1cbiIsIGRldi0+bmFtZSwgaW53KGlvYWRkcitEQVRBUE9SVCkpOworCQkJb3V0dyhscC0+Y3VyX3JmZCs2LCBpb2FkZHIrUkVBRF9QVFIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJiZCBpcyAlMDR4XG4iLCBkZXYtPm5hbWUsIHJiZD0gaW53KGlvYWRkcitEQVRBUE9SVCkpOworCQkJb3V0dyhyYmQsIGlvYWRkcitSRUFEX1BUUik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogWyUwNHggJTA0eF0gIiwgZGV2LT5uYW1lLCBpbncoaW9hZGRyK0RBVEFQT1JUKSwgaW53KGlvYWRkcitEQVRBUE9SVCkpOworCQkJb3V0dyhyYmQrOCwgaW9hZGRyK1JFQURfUFRSKTsKKwkJCXByaW50aygiWyUwNHhdXG4iLCBpbncoaW9hZGRyK0RBVEFQT1JUKSk7CisjZW5kaWYKKwkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKyNpZiAxCisJCSAgICAgICAgZWV4cF9od19yeGluaXQoZGV2KTsKKyNlbHNlCisJCQlscC0+Y3VyX3JmZCA9IGxwLT5maXJzdF9yZmQ7CisjZW5kaWYKKwkJCXNjYl93cnJmYShkZXYsIGxwLT5yeF9idWZfc3RhcnQpOworCQkJc2NiX2NvbW1hbmQoZGV2LCBTQ0JfUlVzdGFydCk7CisJCQlvdXRiKDAsaW9hZGRyK1NJR05BTF9DQSk7CisJCX0gCisJfSBlbHNlIHsKKwkJaWYgKHN0YXR1cyAmIDB4ODAwMCkgCisJCQlhY2tfY21kID0gZWV4cF9zdGFydF9pcnEoZGV2LCBzdGF0dXMpOworCQllbHNlCisJCQlhY2tfY21kID0gU0NCX2FjayhzdGF0dXMpOworCQlzY2JfY29tbWFuZChkZXYsIGFja19jbWQpOworCQlvdXRiKDAsaW9hZGRyK1NJR05BTF9DQSk7CisJfQorCisJZWV4cF9jbWRfY2xlYXIoZGV2KTsKKworCW91dGIoU0lSUV9lbnxpcnFybWFwW2lycV0saW9hZGRyK1NFVF9JUlEpOyAKKworI2lmIE5FVF9ERUJVRyA+IDYgCisJcHJpbnRrKCIlczogbGVhdmluZyBlZXhwX2lycSgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJb3V0dyhvbGRfcmVhZF9wdHIsIGlvYWRkcitSRUFEX1BUUik7CisJb3V0dyhvbGRfd3JpdGVfcHRyLCBpb2FkZHIrV1JJVEVfUFRSKTsKKwkKKwlzcGluX3VubG9jaygmbHAtPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIEhhcmR3YXJlIGFjY2VzcyBmdW5jdGlvbnMKKyAqLworCisvKgorICogU2V0IHRoZSBjYWJsZSB0eXBlIHRvIHVzZS4KKyAqLworCitzdGF0aWMgdm9pZCBlZXhwX2h3X3NldF9pbnRlcmZhY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBjaGFyIG9sZHZhbCA9IGluYihkZXYtPmJhc2VfYWRkciArIDB4MzAwZSk7CisJb2xkdmFsICY9IH4weDgyOworCXN3aXRjaCAoZGV2LT5pZl9wb3J0KSB7CisJY2FzZSBUUEU6CisJCW9sZHZhbCB8PSAweDI7CisJY2FzZSBCTkM6CisJCW9sZHZhbCB8PSAweDgwOworCQlicmVhazsKKwl9CisJb3V0YihvbGR2YWwsIGRldi0+YmFzZV9hZGRyKzB4MzAwZSk7CisJbWRlbGF5KDIwKTsKK30KKworLyoKKyAqIENoZWNrIGFsbCB0aGUgcmVjZWl2ZSBidWZmZXJzLCBhbmQgaGFuZCBhbnkgcmVjZWl2ZWQgcGFja2V0cworICogdG8gdGhlIHVwcGVyIGxldmVscy4gQmFzaWMgc2FuaXR5IGNoZWNrIG9uIGVhY2ggZnJhbWUKKyAqIGRlc2NyaXB0b3IsIHRob3VnaCB3ZSBkb24ndCBib3RoZXIgdHJ5aW5nIHRvIGZpeCBicm9rZW4gb25lcy4KKyAqLworCitzdGF0aWMgdm9pZCBlZXhwX2h3X3J4X3BpbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBzaG9ydCByeF9ibG9jayA9IGxwLT5yeF9wdHI7CisJdW5zaWduZWQgc2hvcnQgYm9ndXNjb3VudCA9IGxwLT5udW1fcnhfYnVmczsKKwl1bnNpZ25lZCBzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisKKyNpZiBORVRfREVCVUcgPiA2CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlZXhwX2h3X3J4KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworIAlkbyB7CisgCQl1bnNpZ25lZCBzaG9ydCByZmRfY21kLCByeF9uZXh0LCBwYnVmLCBwa3RfbGVuOworICAKKwkJb3V0dyhyeF9ibG9jaywgaW9hZGRyICsgUkVBRF9QVFIpOworCQlzdGF0dXMgPSBpbncoaW9hZGRyICsgREFUQVBPUlQpOworCisJCWlmIChGRF9Eb25lKHN0YXR1cykpCisJCXsKKwkJCXJmZF9jbWQgPSBpbncoaW9hZGRyICsgREFUQVBPUlQpOworCQkJcnhfbmV4dCA9IGludyhpb2FkZHIgKyBEQVRBUE9SVCk7CisJCQlwYnVmID0gaW53KGlvYWRkciArIERBVEFQT1JUKTsKKyAKKwkJCW91dHcocGJ1ZiwgaW9hZGRyICsgUkVBRF9QVFIpOworCQkJcGt0X2xlbiA9IGludyhpb2FkZHIgKyBEQVRBUE9SVCk7CisKKwkJCWlmIChyZmRfY21kIT0weDAwMDApCisgIAkJCXsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcmZkX2NtZCBub3QgemVybzoweCUwNHhcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgcmZkX2NtZCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQllbHNlIGlmIChwYnVmIT1yeF9ibG9jaysweDE2KQorCQkJeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByZmQgYW5kIHJiZCBvdXQgb2Ygc3luYyAweCUwNHggMHglMDR4XG4iLCAKKwkJCQkgICAgICAgZGV2LT5uYW1lLCByeF9ibG9jaysweDE2LCBwYnVmKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWVsc2UgaWYgKChwa3RfbGVuICYgMHhjMDAwKSE9MHhjMDAwKSAKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRU9GIG9yIEYgbm90IHNldCBvbiByZWNlaXZlZCBidWZmZXIgKCUwNHgpXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIHBrdF9sZW4gJiAweGMwMDApOworICAJCQkJY29udGludWU7CisgIAkJCX0KKyAgCQkJZWxzZSBpZiAoIUZEX09LKHN0YXR1cykpIAorCQkJeworCQkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlpZiAoRkRfQ1JDKHN0YXR1cykpCisJCQkJCWxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkJaWYgKEZEX0FsaWduKHN0YXR1cykpCisJCQkJCWxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlpZiAoRkRfUmVzcmMoc3RhdHVzKSkKKwkJCQkJbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQkJaWYgKEZEX0RNQShzdGF0dXMpKQorCQkJCQlscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCQlpZiAoRkRfU2hvcnQoc3RhdHVzKSkKKwkJCQkJbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJCXBrdF9sZW4gJj0gMHgzZmZmOworCQkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbisxNik7CisJCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXRcbiIsZGV2LT5uYW1lKTsKKwkJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJCQkJb3V0dyhwYnVmKzEwLCBpb2FkZHIrUkVBRF9QVFIpOworCQkJICAgICAgICBpbnN3KGlvYWRkcitEQVRBUE9SVCwgc2tiX3B1dChza2IscGt0X2xlbiksKHBrdF9sZW4rMSk+PjEpOworCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJCQluZXRpZl9yeChza2IpOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJCX0KKwkJCW91dHcocnhfYmxvY2ssIGlvYWRkcitXUklURV9QVFIpOworCQkJb3V0dygwLCBpb2FkZHIrREFUQVBPUlQpOworCQkJb3V0dygwLCBpb2FkZHIrREFUQVBPUlQpOworCQkJcnhfYmxvY2sgPSByeF9uZXh0OworCQl9CisJfSB3aGlsZSAoRkRfRG9uZShzdGF0dXMpICYmIGJvZ3VzY291bnQtLSk7CisJbHAtPnJ4X3B0ciA9IHJ4X2Jsb2NrOworfQorCisvKgorICogSGFuZCBhIHBhY2tldCB0byB0aGUgY2FyZCBmb3IgdHJhbnNtaXNzaW9uCisgKiBJZiB3ZSBnZXQgaGVyZSwgd2UgTVVTVCBoYXZlIGFscmVhZHkgY2hlY2tlZAorICogdG8gbWFrZSBzdXJlIHRoZXJlIGlzIHJvb20gaW4gdGhlIHRyYW5zbWl0CisgKiBidWZmZXIgcmVnaW9uLgorICovCisKK3N0YXRpYyB2b2lkIGVleHBfaHdfdHhfcGlvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0ICpidWYsCisJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBsZW4pCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIHNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKExPQ0tVUDE2IHx8IGxwLT53aWR0aCkgeworCQkvKiBTdG9wIHRoZSBDVSBzbyB0aGF0IHRoZXJlIGlzIG5vIGNoYW5jZSB0aGF0IGl0CisJCSAgIGp1bXBzIG9mZiB0byBhIGJvZ3VzIGFkZHJlc3Mgd2hpbGUgd2UgYXJlIHdyaXRpbmcgdGhlCisJCSAgIHBvaW50ZXIgdG8gdGhlIG5leHQgdHJhbnNtaXQgcGFja2V0IGluIDgtYml0IG1vZGUgLS0gCisJCSAgIHRoaXMgZWxpbWluYXRlcyB0aGUgIkNVIHdlZGdlZCIgZXJyb3JzIGluIDgtYml0IG1vZGUuCisJCSAgIChab2x0YW4gU3ppbGFneWkgMTAtMTItOTYpICovIAorCQlzY2JfY29tbWFuZChkZXYsIFNDQl9DVXN1c3BlbmQpOworCQlvdXR3KDB4RkZGRiwgaW9hZGRyK1NJR05BTF9DQSk7CisJfQorCisgCW91dHcobHAtPnR4X2hlYWQsIGlvYWRkciArIFdSSVRFX1BUUik7CisKKwlvdXR3KDB4MDAwMCwgaW9hZGRyICsgREFUQVBPUlQpOworICAgICAgICBvdXR3KENtZF9JTlR8Q21kX1htaXQsIGlvYWRkciArIERBVEFQT1JUKTsKKwlvdXR3KGxwLT50eF9oZWFkKzB4MDgsIGlvYWRkciArIERBVEFQT1JUKTsKKwlvdXR3KGxwLT50eF9oZWFkKzB4MGUsIGlvYWRkciArIERBVEFQT1JUKTsKKworCW91dHcoMHgwMDAwLCBpb2FkZHIgKyBEQVRBUE9SVCk7CisJb3V0dygweDAwMDAsIGlvYWRkciArIERBVEFQT1JUKTsKKwlvdXR3KGxwLT50eF9oZWFkKzB4MDgsIGlvYWRkciArIERBVEFQT1JUKTsKKworCW91dHcoMHg4MDAwfGxlbiwgaW9hZGRyICsgREFUQVBPUlQpOworCW91dHcoLTEsIGlvYWRkciArIERBVEFQT1JUKTsKKwlvdXR3KGxwLT50eF9oZWFkKzB4MTYsIGlvYWRkciArIERBVEFQT1JUKTsKKwlvdXR3KDAsIGlvYWRkciArIERBVEFQT1JUKTsKKworICAgICAgICBvdXRzdyhpb2FkZHIgKyBEQVRBUE9SVCwgYnVmLCAobGVuKzEpPj4xKTsKKworCW91dHcobHAtPnR4X3RhaWwrMHhjLCBpb2FkZHIgKyBXUklURV9QVFIpOworCW91dHcobHAtPnR4X2hlYWQsIGlvYWRkciArIERBVEFQT1JUKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCWxwLT50eF90YWlsID0gbHAtPnR4X2hlYWQ7CisJaWYgKGxwLT50eF9oZWFkPT1UWF9CVUZfU1RBUlQrKChscC0+bnVtX3R4X2J1ZnMtMSkqVFhfQlVGX1NJWkUpKQorCQlscC0+dHhfaGVhZCA9IFRYX0JVRl9TVEFSVDsKKwllbHNlCisJCWxwLT50eF9oZWFkICs9IFRYX0JVRl9TSVpFOworCWlmIChscC0+dHhfaGVhZCAhPSBscC0+dHhfcmVhcCkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkKKwlpZiAoTE9DS1VQMTYgfHwgbHAtPndpZHRoKSB7CisJCS8qIFJlc3RhcnQgdGhlIENVIHNvIHRoYXQgdGhlIHBhY2tldCBjYW4gYWN0dWFsbHkKKwkJICAgYmUgdHJhbnNtaXR0ZWQuIChab2x0YW4gU3ppbGFneWkgMTAtMTItOTYpICovCisJCXNjYl9jb21tYW5kKGRldiwgU0NCX0NVcmVzdW1lKTsKKwkJb3V0dygweEZGRkYsIGlvYWRkcitTSUdOQUxfQ0EpOworCX0KKworCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJbHAtPmxhc3RfdHggPSBqaWZmaWVzOworfQorCisvKgorICogU2FuaXR5IGNoZWNrIHRoZSBzdXNwZWN0ZWQgRXRoZXJFeHByZXNzIGNhcmQKKyAqIFJlYWQgaGFyZHdhcmUgYWRkcmVzcywgcmVzZXQgY2FyZCwgc2l6ZSBtZW1vcnkgYW5kIGluaXRpYWxpemUgYnVmZmVyCisgKiBtZW1vcnkgcG9pbnRlcnMuIFRoZXNlIGFyZSBoZWxkIGluIGRldi0+cHJpdiwgaW4gY2FzZSBzb21lb25lIGhhcyBtb3JlCisgKiB0aGFuIG9uZSBjYXJkIGluIGEgbWFjaGluZS4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBlZXhwX2h3X3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IGlvYWRkcikKK3sKKwl1bnNpZ25lZCBzaG9ydCBod19hZGRyWzNdOworCXVuc2lnbmVkIGNoYXIgYnVzd2lkdGg7CisJdW5zaWduZWQgaW50IG1lbW9yeV9zaXplOworCWludCBpOworCXVuc2lnbmVkIHNob3J0IHhzdW0gPSAwOworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXByaW50aygiJXM6IEV0aGVyRXhwcmVzcyAxNiBhdCAlI3ggIixkZXYtPm5hbWUsaW9hZGRyKTsKKworCW91dGIoQVNJQ19SU1QsIGlvYWRkcitFRVBST01fQ3RybCk7CisJb3V0YigwLCBpb2FkZHIrRUVQUk9NX0N0cmwpOworCXVkZWxheSg1MDApOworCW91dGIoaTU4Nl9SU1QsIGlvYWRkcitFRVBST01fQ3RybCk7CisKKwlod19hZGRyWzBdID0gZWV4cF9od19yZWFkZWVwcm9tKGlvYWRkciwyKTsKKwlod19hZGRyWzFdID0gZWV4cF9od19yZWFkZWVwcm9tKGlvYWRkciwzKTsKKwlod19hZGRyWzJdID0gZWV4cF9od19yZWFkZWVwcm9tKGlvYWRkciw0KTsKKworCS8qIFN0YW5kYXJkIEFkZHJlc3Mgb3IgQ29tcGFxIExURSBBZGRyZXNzICovCisJaWYgKCEoKGh3X2FkZHJbMl09PTB4MDBhYSAmJiAoKGh3X2FkZHJbMV0gJiAweGZmMDApPT0weDAwMDApKSB8fAorCSAgICAgIChod19hZGRyWzJdPT0weDAwODAgJiYgKChod19hZGRyWzFdICYgMHhmZjAwKT09MHg1RjAwKSkpKSAKKwl7CisJCXByaW50aygiIHJlamVjdGVkOiBpbnZhbGlkIGFkZHJlc3MgJTA0eCUwNHglMDR4XG4iLAorCQkJaHdfYWRkclsyXSxod19hZGRyWzFdLGh3X2FkZHJbMF0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBDYWxjdWxhdGUgdGhlIEVFUFJPTSBjaGVja3N1bS4gIENhcnJ5IG9uIGFueXdheSBpZiBpdCdzIGJhZCwKKwkgKiB0aG91Z2guCisJICovCisJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisJCXhzdW0gKz0gZWV4cF9od19yZWFkZWVwcm9tKGlvYWRkciwgaSk7CisJaWYgKHhzdW0gIT0gMHhiYWJhKQorCQlwcmludGsoIiAoYmFkIEVFUFJPTSB4c3VtIDB4JTAyeCkiLCB4c3VtKTsKKworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCWZvciAoIGk9MCA7IGk8NiA7IGkrKyApCisJCWRldi0+ZGV2X2FkZHJbaV0gPSAoKHVuc2lnbmVkIGNoYXIgKilod19hZGRyKVs1LWldOworCisJeworCQlzdGF0aWMgY2hhciBpcnFtYXBbXT17MCwgOSwgMywgNCwgNSwgMTAsIDExLCAwfTsKKwkJdW5zaWduZWQgc2hvcnQgc2V0dXB2YWwgPSBlZXhwX2h3X3JlYWRlZXByb20oaW9hZGRyLDApOworCisJCS8qIFVzZSB0aGUgSVJRIGZyb20gRUVQUk9NIGlmIG5vbmUgd2FzIGdpdmVuICovCisJCWlmICghZGV2LT5pcnEpCisJCQlkZXYtPmlycSA9IGlycW1hcFtzZXR1cHZhbD4+MTNdOworCisJCWlmIChkZXYtPmlmX3BvcnQgPT0gMHhmZikgeworCQkJZGV2LT5pZl9wb3J0ID0gIShzZXR1cHZhbCAmIDB4MTAwMCkgPyBBVUkgOgorCQkJCWVleHBfaHdfcmVhZGVlcHJvbShpb2FkZHIsNSkgJiAweDEgPyBUUEUgOiBCTkM7CisJCX0KKworCQlidXN3aWR0aCA9ICEoKHNldHVwdmFsICYgMHg0MDApID4+IDEwKTsKKwl9CisKKwltZW1zZXQobHAsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKworIAlwcmludGsoIihJUlEgJWQsICVzIGNvbm5lY3RvciwgJWQtYml0IGJ1cyIsIGRldi0+aXJxLCAKKyAJICAgICAgIGVleHBfaWZtYXBbZGV2LT5pZl9wb3J0XSwgYnVzd2lkdGg/ODoxNik7CisgCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihkZXYtPmJhc2VfYWRkciArIDB4MzAwZSwgMSwgIkV0aGVyRXhwcmVzcyIpKQorCQlyZXR1cm4gLUVCVVNZOworCisgCWVleHBfaHdfc2V0X2ludGVyZmFjZShkZXYpOworIAorCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyICsgMHgzMDBlLCAxKTsKKyAgCisJLyogRmluZCBvdXQgaG93IG11Y2ggUkFNIHdlIGhhdmUgb24gdGhlIGNhcmQgKi8KKwlvdXR3KDAsIGRldi0+YmFzZV9hZGRyICsgV1JJVEVfUFRSKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzI3Njg7IGkrKykKKwkJb3V0dygwLCBkZXYtPmJhc2VfYWRkciArIERBVEFQT1JUKTsKKworICAgICAgICBmb3IgKG1lbW9yeV9zaXplID0gMDsgbWVtb3J5X3NpemUgPCA2NDsgbWVtb3J5X3NpemUrKykKKwl7CisJCW91dHcobWVtb3J5X3NpemU8PDEwLCBkZXYtPmJhc2VfYWRkciArIFJFQURfUFRSKTsKKwkJaWYgKGludyhkZXYtPmJhc2VfYWRkcitEQVRBUE9SVCkpCisJCQlicmVhazsKKwkJb3V0dyhtZW1vcnlfc2l6ZTw8MTAsIGRldi0+YmFzZV9hZGRyICsgV1JJVEVfUFRSKTsKKwkJb3V0dyhtZW1vcnlfc2l6ZSB8IDB4NTAwMCwgZGV2LT5iYXNlX2FkZHIrREFUQVBPUlQpOworCQlvdXR3KG1lbW9yeV9zaXplPDwxMCwgZGV2LT5iYXNlX2FkZHIgKyBSRUFEX1BUUik7CisJCWlmIChpbncoZGV2LT5iYXNlX2FkZHIrREFUQVBPUlQpICE9IChtZW1vcnlfc2l6ZSB8IDB4NTAwMCkpCisJCQlicmVhazsKKwl9CisKKwkvKiBTb3J0IG91dCB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMuICBXZSBtYXkgaGF2ZSAxNiwgMzIsIDQ4IG9yIDY0aworCSAqIG9mIFJBTSB0byBwbGF5IHdpdGguCisJICovCisJbHAtPm51bV90eF9idWZzID0gNDsKKwlscC0+cnhfYnVmX2VuZCA9IDB4M2ZmNjsKKwlzd2l0Y2ggKG1lbW9yeV9zaXplKQorCXsKKwljYXNlIDY0OgorCQlscC0+cnhfYnVmX2VuZCArPSAweDQwMDA7CisJY2FzZSA0ODoKKwkJbHAtPm51bV90eF9idWZzICs9IDQ7CisJCWxwLT5yeF9idWZfZW5kICs9IDB4NDAwMDsKKwljYXNlIDMyOgorCQlscC0+cnhfYnVmX2VuZCArPSAweDQwMDA7CisJY2FzZSAxNjoKKwkJcHJpbnRrKCIsICVkayBSQU0pXG4iLCBtZW1vcnlfc2l6ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygiKSBiYWQgbWVtb3J5IHNpemUgKCVkaykuXG4iLCBtZW1vcnlfc2l6ZSk7CisJCXJldHVybiAtRU5PREVWOworCQlicmVhazsKKwl9CisKKwlscC0+cnhfYnVmX3N0YXJ0ID0gVFhfQlVGX1NUQVJUICsgKGxwLT5udW1fdHhfYnVmcypUWF9CVUZfU0laRSk7CisJbHAtPndpZHRoID0gYnVzd2lkdGg7CisKKwlkZXYtPm9wZW4gPSBlZXhwX29wZW47CisJZGV2LT5zdG9wID0gZWV4cF9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGVleHBfeG1pdDsKKwlkZXYtPmdldF9zdGF0cyA9IGVleHBfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmZWV4cF9zZXRfbXVsdGljYXN0OworCWRldi0+dHhfdGltZW91dCA9IGVleHBfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gMipIWjsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgYSB3b3JkIGZyb20gdGhlIEV0aGVyRXhwcmVzcyBvbi1ib2FyZCBzZXJpYWwgRUVQUk9NLgorICogVGhlIEVFUFJPTSBjb250YWlucyA2NCB3b3JkcyBvZiAxNiBiaXRzLgorICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgX19pbml0IGVleHBfaHdfcmVhZGVlcHJvbSh1bnNpZ25lZCBzaG9ydCBpb2FkZHIsCisJCQkJCQkgICAgdW5zaWduZWQgY2hhciBsb2NhdGlvbikKK3sKKwl1bnNpZ25lZCBzaG9ydCBjbWQgPSAweDE4MHwobG9jYXRpb24mMHg3Zik7CisJdW5zaWduZWQgc2hvcnQgcnZhbCA9IDAsd3ZhbCA9IEVDX0NTfGk1ODZfUlNUOworCWludCBpOworCisJb3V0YihFQ19DU3xpNTg2X1JTVCxpb2FkZHIrRUVQUk9NX0N0cmwpOworCWZvciAoaT0weDEwMCA7IGkgOyBpPj49MSApCisJeworCQlpZiAoY21kJmkpCisJCQl3dmFsIHw9IEVDX1dyOworCQllbHNlCisJCQl3dmFsICY9IH5FQ19XcjsKKworCQlvdXRiKHd2YWwsaW9hZGRyK0VFUFJPTV9DdHJsKTsKKwkJb3V0Yih3dmFsfEVDX0Nsayxpb2FkZHIrRUVQUk9NX0N0cmwpOworCQllZXByb21fZGVsYXkoKTsKKwkJb3V0Yih3dmFsLGlvYWRkcitFRVBST01fQ3RybCk7CisJCWVlcHJvbV9kZWxheSgpOworCX0KKwl3dmFsICY9IH5FQ19XcjsKKwlvdXRiKHd2YWwsaW9hZGRyK0VFUFJPTV9DdHJsKTsKKwlmb3IgKGk9MHg4MDAwIDsgaSA7IGk+Pj0xICkKKwl7CisJCW91dGIod3ZhbHxFQ19DbGssaW9hZGRyK0VFUFJPTV9DdHJsKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJCWlmIChpbmIoaW9hZGRyK0VFUFJPTV9DdHJsKSZFQ19SZCkKKwkJCXJ2YWwgfD0gaTsKKwkJb3V0Yih3dmFsLGlvYWRkcitFRVBST01fQ3RybCk7CisJCWVlcHJvbV9kZWxheSgpOworCX0KKwl3dmFsICY9IH5FQ19DUzsKKwlvdXRiKHd2YWx8RUNfQ2xrLGlvYWRkcitFRVBST01fQ3RybCk7CisJZWVwcm9tX2RlbGF5KCk7CisJb3V0Yih3dmFsLGlvYWRkcitFRVBST01fQ3RybCk7CisJZWVwcm9tX2RlbGF5KCk7CisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBSZWFwIHR4IGJ1ZmZlcnMgYW5kIHJldHVybiBsYXN0IHRyYW5zbWl0IHN0YXR1cy4KKyAqIGlmID09MCB0aGVuIGVpdGhlcjoKKyAqICAgIGEpIHdlJ3JlIG5vdCB0cmFuc21pdHRpbmcgYW55dGhpbmcsIHNvIHdoeSBhcmUgd2UgaGVyZT8KKyAqICAgIGIpIHdlJ3ZlIGRpZWQuCisgKiBvdGhlcndpc2UsIFN0YXRfQnVzeShyZXR1cm4pIG1lYW5zIHdlJ3ZlIHN0aWxsIGdvdCBzb21lIHBhY2tldHMKKyAqIHRvIHRyYW5zbWl0LCBTdGF0X0RvbmUocmV0dXJuKSBtZWFucyBvdXIgYnVmZmVycyBzaG91bGQgYmUgZW1wdHkKKyAqIGFnYWluCisgKi8KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGVleHBfaHdfbGFzdHR4c3RhdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBzaG9ydCB0eF9ibG9jayA9IGxwLT50eF9yZWFwOworCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKKworCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmIGxwLT50eF9oZWFkPT1scC0+dHhfcmVhcCkKKwkJcmV0dXJuIDB4MDAwMDsKKworCWRvCisJeworCQlvdXR3KHR4X2Jsb2NrICYgfjMxLCBkZXYtPmJhc2VfYWRkciArIFNNX1BUUik7CisJCXN0YXR1cyA9IGludyhkZXYtPmJhc2VfYWRkciArIFNIQURPVyh0eF9ibG9jaykpOworCQlpZiAoIVN0YXRfRG9uZShzdGF0dXMpKQorCQl7CisJCQlscC0+dHhfbGluayA9IHR4X2Jsb2NrOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCQllbHNlCisJCXsKKwkJCWxwLT5sYXN0X3R4X3Jlc3RhcnQgPSAwOworCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gU3RhdF9Ob0NvbGwoc3RhdHVzKTsKKwkJCWlmICghU3RhdF9PSyhzdGF0dXMpKQorCQkJeworCQkJCWNoYXIgKndoYXRzdXAgPSBOVUxMOworCQkJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKyAgCQkJCWlmIChTdGF0X0Fib3J0KHN0YXR1cykpIAorICAJCQkJCWxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJCWlmIChTdGF0X1ROb0NhcihzdGF0dXMpKSB7CisJCQkJCXdoYXRzdXAgPSAiYWJvcnRlZCwgbm8gY2FycmllciI7CisJCQkJCWxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCX0KKwkJCQlpZiAoU3RhdF9UTm9DVFMoc3RhdHVzKSkgeworCQkJCQl3aGF0c3VwID0gImFib3J0ZWQsIGxvc3QgQ1RTIjsKKyAgCQkJCQlscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQl9CisJCQkJaWYgKFN0YXRfVE5vRE1BKHN0YXR1cykpIHsKKwkJCQkJd2hhdHN1cCA9ICJGSUZPIHVuZGVycmFuIjsKKyAgCQkJCQlscC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQl9CisJCQkJaWYgKFN0YXRfVFhDb2xsKHN0YXR1cykpIHsKKwkJCQkJd2hhdHN1cCA9ICJhYm9ydGVkLCB0b28gbWFueSBjb2xsaXNpb25zIjsKKwkJCQkJbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQkJfQorCQkJCWlmICh3aGF0c3VwKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogdHJhbnNtaXQgJXNcbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUsIHdoYXRzdXApOworCQkJfQorCQkJZWxzZQorCQkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCX0KKwkJaWYgKHR4X2Jsb2NrID09IFRYX0JVRl9TVEFSVCsoKGxwLT5udW1fdHhfYnVmcy0xKSpUWF9CVUZfU0laRSkpCisJCQlscC0+dHhfcmVhcCA9IHR4X2Jsb2NrID0gVFhfQlVGX1NUQVJUOworCQllbHNlCisJCQlscC0+dHhfcmVhcCA9IHR4X2Jsb2NrICs9IFRYX0JVRl9TSVpFOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCXdoaWxlIChscC0+dHhfcmVhcCAhPSBscC0+dHhfaGVhZCk7CisKKwlscC0+dHhfbGluayA9IGxwLT50eF90YWlsICsgMHgwODsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uIEl0IGlzIGNhbGxlZCB3aGVuIHNvbWUgaGlnaGVyIHJvdXRpbmUgZGV0ZWN0cworICogdGhhdCB0aGUgQ1UgaGFzIHN0b3BwZWQsIHRvIHRyeSB0byByZXN0YXJ0IGl0IGZyb20gdGhlIGxhc3QgcGFja2V0IHdlIGtuZXcKKyAqIHdlIHdlcmUgd29ya2luZyBvbiwgb3IgdGhlIGlkbGUgbG9vcCBpZiB3ZSBoYWQgZmluaXNoZWQgZm9yIHRoZSB0aW1lLgorICovCisKK3N0YXRpYyB2b2lkIGVleHBfaHdfdHhyZXN0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIHNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJbHAtPmxhc3RfdHhfcmVzdGFydCA9IGxwLT50eF9saW5rOworCXNjYl93cmNibChkZXYsIGxwLT50eF9saW5rKTsKKwlzY2JfY29tbWFuZChkZXYsIFNDQl9DVXN0YXJ0KTsKKwlvdXRiKDAsaW9hZGRyK1NJR05BTF9DQSk7CisKKwl7CisJCXVuc2lnbmVkIHNob3J0IGJvZ3VzY291bnQ9NTAsZmFpbGNvdW50PTU7CisJCXdoaWxlICghc2NiX3N0YXR1cyhkZXYpKQorCQl7CisJCQlpZiAoIS0tYm9ndXNjb3VudCkKKwkJCXsKKwkJCQlpZiAoLS1mYWlsY291bnQpCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ1Ugc3RhcnQgdGltZWQgb3V0LCBzdGF0dXMgJTA0eCwgY21kICUwNHhcbiIsIGRldi0+bmFtZSwgc2NiX3N0YXR1cyhkZXYpLCBzY2JfcmRjbWQoZGV2KSk7CisJCQkJICAgICAgICBzY2Jfd3JjYmwoZGV2LCBscC0+dHhfbGluayk7CisJCQkJCXNjYl9jb21tYW5kKGRldiwgU0NCX0NVc3RhcnQpOworCQkJCQlvdXRiKDAsaW9hZGRyK1NJR05BTF9DQSk7CisJCQkJCWJvZ3VzY291bnQgPSAxMDA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGYWlsZWQgdG8gcmVzdGFydCBDVSwgcmVzZXR0aW5nIGJvYXJkLi4uXG4iLGRldi0+bmFtZSk7CisJCQkJCWVleHBfaHdfaW5pdDU4NihkZXYpOworCQkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgKiBXcml0ZXMgZG93biB0aGUgbGlzdCBvZiB0cmFuc21pdCBidWZmZXJzIGludG8gY2FyZCBtZW1vcnkuICBFYWNoCisgKiBlbnRyeSBjb25zaXN0cyBvZiBhbiA4MjU4NiB0cmFuc21pdCBjb21tYW5kLCBmb2xsb3dlZCBieSBhIGp1bXAKKyAqIHBvaW50aW5nIHRvIGl0c2VsZi4gIFdoZW4gd2Ugd2FudCB0byB0cmFuc21pdCBhIHBhY2tldCwgd2Ugd3JpdGUKKyAqIHRoZSBkYXRhIGludG8gdGhlIGFwcHJvcHJpYXRlIHRyYW5zbWl0IGJ1ZmZlciBhbmQgdGhlbiBtb2RpZnkgdGhlCisgKiBwcmVjZWRpbmcganVtcCB0byBwb2ludCBhdCB0aGUgbmV3IHRyYW5zbWl0IGNvbW1hbmQuICBUaGlzIG1lYW5zIHRoYXQKKyAqIHRoZSA1ODYgY29tbWFuZCB1bml0IGlzIGNvbnRpbnVvdXNseSBhY3RpdmUuCisgKi8KKworc3RhdGljIHZvaWQgZWV4cF9od190eGluaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgc2hvcnQgdHhfYmxvY2sgPSBUWF9CVUZfU1RBUlQ7CisJdW5zaWduZWQgc2hvcnQgY3VydGJ1ZjsKKwl1bnNpZ25lZCBzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWZvciAoIGN1cnRidWY9MCA7IGN1cnRidWY8bHAtPm51bV90eF9idWZzIDsgY3VydGJ1ZisrICkKKwl7CisJCW91dHcodHhfYmxvY2ssIGlvYWRkciArIFdSSVRFX1BUUik7CisKKwkgICAgICAgIG91dHcoMHgwMDAwLCBpb2FkZHIgKyBEQVRBUE9SVCk7CisJCW91dHcoQ21kX0lOVHxDbWRfWG1pdCwgaW9hZGRyICsgREFUQVBPUlQpOworCQlvdXR3KHR4X2Jsb2NrKzB4MDgsIGlvYWRkciArIERBVEFQT1JUKTsKKwkJb3V0dyh0eF9ibG9jaysweDBlLCBpb2FkZHIgKyBEQVRBUE9SVCk7CisKKwkJb3V0dygweDAwMDAsIGlvYWRkciArIERBVEFQT1JUKTsKKwkJb3V0dygweDAwMDAsIGlvYWRkciArIERBVEFQT1JUKTsKKwkJb3V0dyh0eF9ibG9jaysweDA4LCBpb2FkZHIgKyBEQVRBUE9SVCk7CisKKwkJb3V0dygweDgwMDAsIGlvYWRkciArIERBVEFQT1JUKTsKKwkJb3V0dygtMSwgaW9hZGRyICsgREFUQVBPUlQpOworCQlvdXR3KHR4X2Jsb2NrKzB4MTYsIGlvYWRkciArIERBVEFQT1JUKTsKKwkJb3V0dygweDAwMDAsIGlvYWRkciArIERBVEFQT1JUKTsKKworCQl0eF9ibG9jayArPSBUWF9CVUZfU0laRTsKKwl9CisJbHAtPnR4X2hlYWQgPSBUWF9CVUZfU1RBUlQ7CisJbHAtPnR4X3JlYXAgPSBUWF9CVUZfU1RBUlQ7CisJbHAtPnR4X3RhaWwgPSB0eF9ibG9jayAtIFRYX0JVRl9TSVpFOworCWxwLT50eF9saW5rID0gbHAtPnR4X3RhaWwgKyAweDA4OworCWxwLT5yeF9idWZfc3RhcnQgPSB0eF9ibG9jazsKKworfQorCisvKgorICogV3JpdGUgdGhlIGNpcmN1bGFyIGxpc3Qgb2YgcmVjZWl2ZSBidWZmZXIgZGVzY3JpcHRvcnMgdG8gY2FyZCBtZW1vcnkuCisgKiBUaGUgZW5kIG9mIHRoZSBsaXN0IGlzbid0IG1hcmtlZCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgODI1ODYgcmVjZWl2ZQorICogdW5pdCB3aWxsIGxvb3AgdW50aWwgYnVmZmVycyBiZWNvbWUgYXZhaWxhYmxlICh0aGlzIGF2b2lkcyBpdCBnaXZpbmcgdXMKKyAqICJvdXQgb2YgcmVzb3VyY2VzIiBtZXNzYWdlcykuCisgKi8KKworc3RhdGljIHZvaWQgZWV4cF9od19yeGluaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgc2hvcnQgcnhfYmxvY2sgPSBscC0+cnhfYnVmX3N0YXJ0OworCXVuc2lnbmVkIHNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJbHAtPm51bV9yeF9idWZzID0gMDsKKwlscC0+cnhfZmlyc3QgPSBscC0+cnhfcHRyID0gcnhfYmxvY2s7CisJZG8KKwl7CisJCWxwLT5udW1fcnhfYnVmcysrOworCisJCW91dHcocnhfYmxvY2ssIGlvYWRkciArIFdSSVRFX1BUUik7CisKKwkJb3V0dygwLCBpb2FkZHIgKyBEQVRBUE9SVCk7ICBvdXR3KDAsIGlvYWRkcitEQVRBUE9SVCk7CisJCW91dHcocnhfYmxvY2sgKyBSWF9CVUZfU0laRSwgaW9hZGRyK0RBVEFQT1JUKTsKKwkJb3V0dygweGZmZmYsIGlvYWRkcitEQVRBUE9SVCk7CisKKwkJb3V0dygweDAwMDAsIGlvYWRkcitEQVRBUE9SVCk7CisJCW91dHcoMHhkZWFkLCBpb2FkZHIrREFUQVBPUlQpOworCQlvdXR3KDB4ZGVhZCwgaW9hZGRyK0RBVEFQT1JUKTsKKwkJb3V0dygweGRlYWQsIGlvYWRkcitEQVRBUE9SVCk7CisJCW91dHcoMHhkZWFkLCBpb2FkZHIrREFUQVBPUlQpOworCQlvdXR3KDB4ZGVhZCwgaW9hZGRyK0RBVEFQT1JUKTsKKwkJb3V0dygweGRlYWQsIGlvYWRkcitEQVRBUE9SVCk7CisKKwkJb3V0dygweDAwMDAsIGlvYWRkcitEQVRBUE9SVCk7CisJCW91dHcocnhfYmxvY2sgKyBSWF9CVUZfU0laRSArIDB4MTYsIGlvYWRkcitEQVRBUE9SVCk7CisJCW91dHcocnhfYmxvY2sgKyAweDIwLCBpb2FkZHIrREFUQVBPUlQpOworCQlvdXR3KDAsIGlvYWRkcitEQVRBUE9SVCk7CisJCW91dHcoUlhfQlVGX1NJWkUtMHgyMCwgaW9hZGRyK0RBVEFQT1JUKTsKKworCQlscC0+cnhfbGFzdCA9IHJ4X2Jsb2NrOworCQlyeF9ibG9jayArPSBSWF9CVUZfU0laRTsKKwl9IHdoaWxlIChyeF9ibG9jayA8PSBscC0+cnhfYnVmX2VuZC1SWF9CVUZfU0laRSk7CisKKworCS8qIE1ha2UgZmlyc3QgUnggZnJhbWUgZGVzY3JpcHRvciBwb2ludCB0byBmaXJzdCBSeCBidWZmZXIKKyAgICAgICAgICAgZGVzY3JpcHRvciAqLworCW91dHcobHAtPnJ4X2ZpcnN0ICsgNiwgaW9hZGRyK1dSSVRFX1BUUik7CisJb3V0dyhscC0+cnhfZmlyc3QgKyAweDE2LCBpb2FkZHIrREFUQVBPUlQpOworCisJLyogQ2xvc2UgUnggZnJhbWUgZGVzY3JpcHRvciByaW5nICovCisgIAlvdXR3KGxwLT5yeF9sYXN0ICsgNCwgaW9hZGRyK1dSSVRFX1BUUik7CisgIAlvdXR3KGxwLT5yeF9maXJzdCwgaW9hZGRyK0RBVEFQT1JUKTsKKyAgCisJLyogQ2xvc2UgUnggYnVmZmVyIGRlc2NyaXB0b3IgcmluZyAqLworCW91dHcobHAtPnJ4X2xhc3QgKyAweDE2ICsgMiwgaW9hZGRyK1dSSVRFX1BUUik7CisJb3V0dyhscC0+cnhfZmlyc3QgKyAweDE2LCBpb2FkZHIrREFUQVBPUlQpOworCQorfQorCisvKgorICogVW4tcmVzZXQgdGhlIDU4NiwgYW5kIHN0YXJ0IHRoZSBjb25maWd1cmF0aW9uIHNlcXVlbmNlLiBXZSBkb24ndCB3YWl0IGZvcgorICogdGhpcyB0byBmaW5pc2gsIGJ1dCBhbGxvdyB0aGUgaW50ZXJydXB0IGhhbmRsZXIgdG8gc3RhcnQgdGhlIENVIGFuZCBSVSBmb3IKKyAqIHVzLiAgV2UgY2FuJ3Qgc3RhcnQgdGhlIHJlY2VpdmUvdHJhbnNtaXNzaW9uIHN5c3RlbSB1cCBiZWZvcmUgd2Uga25vdyB0aGF0CisgKiB0aGUgaGFyZHdhcmUgaXMgY29uZmlndXJlZCBjb3JyZWN0bHkuCisgKi8KKworc3RhdGljIHZvaWQgZWV4cF9od19pbml0NTg2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIHNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpOworCisjaWYgTkVUX0RFQlVHID4gNgorCXByaW50aygiJXM6IGVleHBfaHdfaW5pdDU4NigpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlscC0+c3RhcnRlZCA9IDA7CisKKwlzZXRfbG9vcGJhY2soZGV2KTsKKworCW91dGIoU0lSUV9kaXN8aXJxcm1hcFtkZXYtPmlycV0saW9hZGRyK1NFVF9JUlEpOworCisJLyogRG93bmxvYWQgdGhlIHN0YXJ0dXAgY29kZSAqLworCW91dHcobHAtPnJ4X2J1Zl9lbmQgJiB+MzEsIGlvYWRkciArIFNNX1BUUik7CisJb3V0dyhscC0+d2lkdGg/MHgwMDAxOjB4MDAwMCwgaW9hZGRyICsgMHg4MDA2KTsKKwlvdXR3KDB4MDAwMCwgaW9hZGRyICsgMHg4MDA4KTsKKwlvdXR3KDB4MDAwMCwgaW9hZGRyICsgMHg4MDBhKTsKKwlvdXR3KDB4MDAwMCwgaW9hZGRyICsgMHg4MDBjKTsKKwlvdXR3KDB4MDAwMCwgaW9hZGRyICsgMHg4MDBlKTsKKworCWZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKHN0YXJ0X2NvZGUpKTsgaSs9MzIpIHsKKwkJaW50IGo7CisJCW91dHcoaSwgaW9hZGRyICsgU01fUFRSKTsKKwkJZm9yIChqID0gMDsgaiA8IDE2OyBqKz0yKQorCQkJb3V0dyhzdGFydF9jb2RlWyhpK2opLzJdLAorCQkJICAgICBpb2FkZHIrMHg0MDAwK2opOworCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorPTIpCisJCQlvdXR3KHN0YXJ0X2NvZGVbKGkraisxNikvMl0sCisJCQkgICAgIGlvYWRkcisweDgwMDAraik7CisJfQorCisJLyogRG8gd2Ugd2FudCBwcm9taXNjdW91cyBtb2RlIG9yIG11bHRpY2FzdD8gKi8KKwlvdXR3KENPTkZfUFJPTUlTQyAmIH4zMSwgaW9hZGRyK1NNX1BUUik7CisJaSA9IGludyhpb2FkZHIrU0hBRE9XKENPTkZfUFJPTUlTQykpOworCW91dHcoKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyk/KGl8MSk6KGkgJiB+MSksIAorCSAgICAgaW9hZGRyK1NIQURPVyhDT05GX1BST01JU0MpKTsKKwlscC0+d2FzX3Byb21pc2MgPSBkZXYtPmZsYWdzICYgSUZGX1BST01JU0M7CisjaWYgMAorCWVleHBfc2V0dXBfZmlsdGVyKGRldik7CisjZW5kaWYKKworCS8qIFdyaXRlIG91ciBoYXJkd2FyZSBhZGRyZXNzICovCisJb3V0dyhDT05GX0hXQUREUiAmIH4zMSwgaW9hZGRyK1NNX1BUUik7CisJb3V0dygoKHVuc2lnbmVkIHNob3J0ICopZGV2LT5kZXZfYWRkcilbMF0sIGlvYWRkcitTSEFET1coQ09ORl9IV0FERFIpKTsKKwlvdXR3KCgodW5zaWduZWQgc2hvcnQgKilkZXYtPmRldl9hZGRyKVsxXSwgCisJICAgICBpb2FkZHIrU0hBRE9XKENPTkZfSFdBRERSKzIpKTsKKwlvdXR3KCgodW5zaWduZWQgc2hvcnQgKilkZXYtPmRldl9hZGRyKVsyXSwKKwkgICAgIGlvYWRkcitTSEFET1coQ09ORl9IV0FERFIrNCkpOworCisJZWV4cF9od190eGluaXQoZGV2KTsKKwllZXhwX2h3X3J4aW5pdChkZXYpOworCisJb3V0YigwLGlvYWRkcitFRVBST01fQ3RybCk7CisJbWRlbGF5KDUpOworCisJc2NiX2NvbW1hbmQoZGV2LCAweGYwMDApOworCW91dGIoMCxpb2FkZHIrU0lHTkFMX0NBKTsKKworCW91dHcoMCwgaW9hZGRyK1NNX1BUUik7CisKKwl7CisJCXVuc2lnbmVkIHNob3J0IHJib2d1c2NvdW50PTUwLHJmYWlsY291bnQ9NTsKKwkJd2hpbGUgKGludyhpb2FkZHIrMHg0MDAwKSkKKwkJeworCQkJaWYgKCEtLXJib2d1c2NvdW50KQorCQkJeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpODI1ODYgcmVzZXQgdGltZWQgb3V0LCBraWNraW5nLi4uXG4iLAorCQkJCQlkZXYtPm5hbWUpOworCQkJCXNjYl9jb21tYW5kKGRldiwgMCk7CisJCQkJb3V0YigwLGlvYWRkcitTSUdOQUxfQ0EpOworCQkJCXJib2d1c2NvdW50ID0gMTAwOworCQkJCWlmICghLS1yZmFpbGNvdW50KQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGk4MjU4NiBub3QgcmVzcG9uZGluZywgZ2l2aW5nIHVwLlxuIiwKKwkJCQkJCWRldi0+bmFtZSk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKyAgICAgICAgc2NiX3dyY2JsKGRldiwgQ09ORl9MSU5LKTsKKwlzY2JfY29tbWFuZChkZXYsIDB4ZjAwMHxTQ0JfQ1VzdGFydCk7CisJb3V0YigwLGlvYWRkcitTSUdOQUxfQ0EpOworCisJeworCQl1bnNpZ25lZCBzaG9ydCBpYm9ndXNjb3VudD01MCxpZmFpbGNvdW50PTU7CisJCXdoaWxlICghc2NiX3N0YXR1cyhkZXYpKQorCQl7CisJCQlpZiAoIS0taWJvZ3VzY291bnQpCisJCQl7CisJCQkJaWYgKC0taWZhaWxjb3VudCkKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpODI1ODYgaW5pdGlhbGl6YXRpb24gdGltZWQgb3V0LCBzdGF0dXMgJTA0eCwgY21kICUwNHhcbiIsCisJCQkJCQlkZXYtPm5hbWUsIHNjYl9zdGF0dXMoZGV2KSwgc2NiX3JkY21kKGRldikpOworCQkJCQlzY2Jfd3JjYmwoZGV2LCBDT05GX0xJTkspOworCQkJCSAgICAgICAgc2NiX2NvbW1hbmQoZGV2LCAweGYwMDB8U0NCX0NVc3RhcnQpOworCQkJCQlvdXRiKDAsaW9hZGRyK1NJR05BTF9DQSk7CisJCQkJCWlib2d1c2NvdW50ID0gMTAwOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgaTgyNTg2LCBnaXZpbmcgdXAuXG4iLGRldi0+bmFtZSk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwljbGVhcl9sb29wYmFjayhkZXYpOworCW91dGIoU0lSUV9lbnxpcnFybWFwW2Rldi0+aXJxXSxpb2FkZHIrU0VUX0lSUSk7CisKKwlscC0+aW5pdF90aW1lID0gamlmZmllczsKKyNpZiBORVRfREVCVUcgPiA2CisgICAgICAgIHByaW50aygiJXM6IGxlYXZpbmcgZWV4cF9od19pbml0NTg2KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGVleHBfc2V0dXBfZmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldl9tY19saXN0ICpkbWkgPSBkZXYtPm1jX2xpc3Q7CisJdW5zaWduZWQgc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGNvdW50ID0gZGV2LT5tY19jb3VudDsKKwlpbnQgaTsKKwlpZiAoY291bnQgPiA4KSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiB0b28gbWFueSBtdWx0aWNhc3QgYWRkcmVzc2VzICglZClcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGNvdW50KTsKKwkJY291bnQgPSA4OworCX0KKwkKKwlvdXR3KENPTkZfTlJfTVVMVElDQVNUICYgfjMxLCBpb2FkZHIrU01fUFRSKTsKKwlvdXR3KGNvdW50LCBpb2FkZHIrU0hBRE9XKENPTkZfTlJfTVVMVElDQVNUKSk7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJdW5zaWduZWQgc2hvcnQgKmRhdGEgPSAodW5zaWduZWQgc2hvcnQgKilkbWktPmRtaV9hZGRyOworCQlpZiAoIWRtaSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHRvbyBmZXcgbXVsdGljYXN0IGFkZHJlc3Nlc1xuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChkbWktPmRtaV9hZGRybGVuICE9IEVUSF9BTEVOKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogaW52YWxpZCBtdWx0aWNhc3QgYWRkcmVzcyBsZW5ndGggZ2l2ZW4uXG4iLCBkZXYtPm5hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJb3V0dygoQ09ORl9NVUxUSUNBU1QrKDYqaSkpICYgfjMxLCBpb2FkZHIrU01fUFRSKTsKKwkJb3V0dyhkYXRhWzBdLCBpb2FkZHIrU0hBRE9XKENPTkZfTVVMVElDQVNUKyg2KmkpKSk7CisJCW91dHcoKENPTkZfTVVMVElDQVNUKyg2KmkpKzIpICYgfjMxLCBpb2FkZHIrU01fUFRSKTsKKwkJb3V0dyhkYXRhWzFdLCBpb2FkZHIrU0hBRE9XKENPTkZfTVVMVElDQVNUKyg2KmkpKzIpKTsKKwkJb3V0dygoQ09ORl9NVUxUSUNBU1QrKDYqaSkrNCkgJiB+MzEsIGlvYWRkcitTTV9QVFIpOworCQlvdXR3KGRhdGFbMl0sIGlvYWRkcitTSEFET1coQ09ORl9NVUxUSUNBU1QrKDYqaSkrNCkpOworCX0KK30KKworLyoKKyAqIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICovCitzdGF0aWMgdm9pZAorZWV4cF9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBraWNrID0gMCwgaTsKKyAgICAgICAgaWYgKChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpICE9IGxwLT53YXNfcHJvbWlzYykgeworICAgICAgICAgICAgICAgIG91dHcoQ09ORl9QUk9NSVNDICYgfjMxLCBpb2FkZHIrU01fUFRSKTsKKyAgICAgICAgICAgICAgICBpID0gaW53KGlvYWRkcitTSEFET1coQ09ORl9QUk9NSVNDKSk7CisgICAgICAgICAgICAgICAgb3V0dygoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKT8oaXwxKTooaSAmIH4xKSwKKyAgICAgICAgICAgICAgICAgICAgIGlvYWRkcitTSEFET1coQ09ORl9QUk9NSVNDKSk7CisgICAgICAgICAgICAgICAgbHAtPndhc19wcm9taXNjID0gZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDOworICAgICAgICAgICAgICAgIGtpY2sgPSAxOworICAgICAgICB9CisgICAgICAgIGlmICghKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykpIHsKKyAgICAgICAgICAgICAgICBlZXhwX3NldHVwX2ZpbHRlcihkZXYpOworICAgICAgICAgICAgICAgIGlmIChscC0+b2xkX21jX2NvdW50ICE9IGRldi0+bWNfY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtpY2sgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbHAtPm9sZF9tY19jb3VudCA9IGRldi0+bWNfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChraWNrKSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBvajsKKyAgICAgICAgICAgICAgICBzY2JfY29tbWFuZChkZXYsIFNDQl9DVXN1c3BlbmQpOworICAgICAgICAgICAgICAgIG91dGIoMCwgaW9hZGRyK1NJR05BTF9DQSk7CisgICAgICAgICAgICAgICAgb3V0YigwLCBpb2FkZHIrU0lHTkFMX0NBKTsKKyNpZiAwCisgICAgICAgICAgICAgICAgcHJpbnRrKCIlczogd2FpdGluZyBmb3IgQ1UgdG8gZ28gc3VzcGVuZGVkXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisgICAgICAgICAgICAgICAgb2ogPSBqaWZmaWVzOworICAgICAgICAgICAgICAgIHdoaWxlICgoU0NCX0NVc3RhdChzY2Jfc3RhdHVzKGRldikpID09IDIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICgoamlmZmllcy1vaikgPCAyMDAwKSk7CisJCWlmIChTQ0JfQ1VzdGF0KHNjYl9zdGF0dXMoZGV2KSkgPT0gMikKKwkJCXByaW50aygiJXM6IHdhcm5pbmcsIENVIGRpZG4ndCBzdG9wXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgIGxwLT5zdGFydGVkICY9IH4oU1RBUlRFRF9DVSk7CisgICAgICAgICAgICAgICAgc2NiX3dyY2JsKGRldiwgQ09ORl9MSU5LKTsKKyAgICAgICAgICAgICAgICBzY2JfY29tbWFuZChkZXYsIFNDQl9DVXN0YXJ0KTsKKyAgICAgICAgICAgICAgICBvdXRiKDAsIGlvYWRkcitTSUdOQUxfQ0EpOworICAgICAgICB9Cit9CisKKworLyoKKyAqIE1PRFVMRSBzdHVmZgorICovCisKKyNpZmRlZiBNT0RVTEUKKworI2RlZmluZSBFRVhQX01BWF9DQVJEUyAgICAgNCAgICAvKiBtYXggbnVtYmVyIG9mIGNhcmRzIHRvIHN1cHBvcnQgKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfZWV4cFtFRVhQX01BWF9DQVJEU107CitzdGF0aWMgaW50IGlycVtFRVhQX01BWF9DQVJEU107CitzdGF0aWMgaW50IGlvW0VFWFBfTUFYX0NBUkRTXTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJFdGhlckV4cHJlc3MgMTYgSS9PIGJhc2UgYWRkcmVzcyhlcykiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiRXRoZXJFeHByZXNzIDE2IElSUSBudW1iZXIocykiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCisvKiBJZGVhbGx5IHRoZSB1c2VyIHdvdWxkIGdpdmUgdXMgaW89LCBpcnE9IGZvciBldmVyeSBjYXJkLiAgSWYgYW55IHBhcmFtZXRlcnMKKyAqIGFyZSBzcGVjaWZpZWQsIHdlIHZlcmlmeSBhbmQgdGhlbiB1c2UgdGhlbS4gIElmIG5vIHBhcmFtZXRlcnMgYXJlIGdpdmVuLCB3ZQorICogYXV0b3Byb2JlIGZvciBvbmUgY2FyZCBvbmx5LgorICovCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCB0aGlzX2RldiwgZm91bmQgPSAwOworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgRUVYUF9NQVhfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwkJZGV2LT5pcnEgPSBpcnFbdGhpc19kZXZdOworCQlkZXYtPmJhc2VfYWRkciA9IGlvW3RoaXNfZGV2XTsKKwkJaWYgKGlvW3RoaXNfZGV2XSA9PSAwKSB7CisJCQlpZiAodGhpc19kZXYpCisJCQkJYnJlYWs7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgImVleHByZXNzLmM6IE1vZHVsZSBhdXRvcHJvYmUgbm90IHJlY29tbWVuZGVkLCBnaXZlIGlvPXh4LlxuIik7CisJCX0KKwkJaWYgKGRvX2V4cHJlc3NfcHJvYmUoZGV2KSA9PSAwICYmIHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKKwkJCWRldl9lZXhwW3RoaXNfZGV2XSA9IGRldjsKKwkJCWZvdW5kKys7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJlZXhwcmVzcy5jOiBGYWlsZWQgdG8gcmVnaXN0ZXIgY2FyZCBhdCAweCV4LlxuIiwgaW9bdGhpc19kZXZdKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJYnJlYWs7CisJfQorCWlmIChmb3VuZCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FTlhJTzsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWludCB0aGlzX2RldjsKKworCWZvciAodGhpc19kZXYgPSAwOyB0aGlzX2RldiA8IEVFWFBfTUFYX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZWV4cFt0aGlzX2Rldl07CisJCWlmIChkZXYpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQlmcmVlX25ldGRldihkZXYpOworCQl9CisJfQorfQorI2VuZGlmCisKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiAgYy1maWxlLXN0eWxlOiAibGludXgiCisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VleHByZXNzLmggYi9kcml2ZXJzL25ldC9lZXhwcmVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YjQzMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9lZXhwcmVzcy5oCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogZWV4cHJlc3MuaDogSW50ZWwgRXRoZXJFeHByZXNzMTYgZGVmaW5lcworICovCisKKy8qCisgKiBFdGhlckV4cHJlc3MgY2FyZCByZWdpc3RlciBhZGRyZXNzZXMKKyAqIGFzIG9mZnNldHMgZnJvbSB0aGUgYmFzZSBJTyByZWdpb24gKGRldi0+YmFzZV9hZGRyKQorICovCisKKyNkZWZpbmUgREFUQVBPUlQgICAgICAweDAwMDAKKyNkZWZpbmUgV1JJVEVfUFRSICAgICAweDAwMDIKKyNkZWZpbmUgUkVBRF9QVFIgICAgICAweDAwMDQKKyNkZWZpbmUgU0lHTkFMX0NBICAgICAweDAwMDYKKyNkZWZpbmUgU0VUX0lSUSAgICAgICAweDAwMDcKKyNkZWZpbmUgU01fUFRSICAgICAgICAweDAwMDgKKyNkZWZpbmUJTUVNX0RlYwkgICAgICAweDAwMGEKKyNkZWZpbmUgTUVNX0N0cmwgICAgICAweDAwMGIKKyNkZWZpbmUgTUVNX1BhZ2VfQ3RybCAweDAwMGMKKyNkZWZpbmUgQ29uZmlnICAgICAgICAweDAwMGQKKyNkZWZpbmUgRUVQUk9NX0N0cmwgICAweDAwMGUKKyNkZWZpbmUgSURfUE9SVCAgICAgICAweDAwMGYKKyNkZWZpbmUJTUVNX0VDdHJsICAgICAweDAwMGYKKworLyoKKyAqIGNhcmQgcmVnaXN0ZXIgZGVmaW5lcworICovCisKKy8qIFNFVF9JUlEgKi8KKyNkZWZpbmUgU0lSUV9lbiAgICAgICAweDA4CisjZGVmaW5lIFNJUlFfZGlzICAgICAgMHgwMAorCisvKiBFRVBST01fQ3RybCAqLworI2RlZmluZSBFQ19DbGsgICAgICAgIDB4MDEKKyNkZWZpbmUgRUNfQ1MgICAgICAgICAweDAyCisjZGVmaW5lIEVDX1dyICAgICAgICAgMHgwNAorI2RlZmluZSBFQ19SZCAgICAgICAgIDB4MDgKKyNkZWZpbmUgQVNJQ19SU1QgICAgICAweDQwCisjZGVmaW5lIGk1ODZfUlNUICAgICAgMHg4MAorCisjZGVmaW5lIGVlcHJvbV9kZWxheSgpIHsgdWRlbGF5KDQwKTsgfQorCisvKgorICogaTgyNTg2IE1lbW9yeSBDb25maWd1cmF0aW9uCisgKi8KKworLyogKFN5c3RlbSBDb25maWd1cmF0aW9uIFBvaW50ZXIpIFN5c3RlbSBzdGFydCB1cCBibG9jaywgcmVhZCBhZnRlciA1ODZfUlNUICovCisjZGVmaW5lIFNDUF9TVEFSVCAweGZmZjYKKworLyogSW50ZXJtZWRpYXRlIFN5c3RlbSBDb25maWd1cmF0aW9uIFBvaW50ZXIgKi8KKyNkZWZpbmUgSVNDUF9TVEFSVCAweDAwMDAKKworLyogU3lzdGVtIENvbW1hbmQgQmxvY2sgKi8KKyNkZWZpbmUgU0NCX1NUQVJUIDB4MDAwOAorCisvKiBTdGFydCBvZiBidWZmZXIgcmVnaW9uLiAgRXZlcnl0aGluZyBiZWZvcmUgdGhpcyBpcyB1c2VkIGZvciBjb250cm9sCisgKiBzdHJ1Y3R1cmVzIGFuZCB0aGUgQ1UgY29uZmlndXJhdGlvbiBwcm9ncmFtLiAgVGhlIG1lbW9yeSBsYXlvdXQgaXMgCisgKiBkZXRlcm1pbmVkIGluIGVleHBfaHdfcHJvYmUoKSwgb25jZSB3ZSBrbm93IGhvdyBtdWNoIG1lbW9yeSBpcyAKKyAqIGF2YWlsYWJsZSBvbiB0aGUgY2FyZC4KKyAqLworCisjZGVmaW5lIFRYX0JVRl9TVEFSVCAweDAxMDAKKworI2RlZmluZSBUWF9CVUZfU0laRSAoKDI0K0VUSF9GUkFNRV9MRU4rMzEpJn4weDFmKQorI2RlZmluZSBSWF9CVUZfU0laRSAoKDMyK0VUSF9GUkFNRV9MRU4rMzEpJn4weDFmKQorCisvKgorICogU0NCIGRlZmluZXMgCisgKi8KKworLyogdGhlc2UgZnVuY3Rpb25zIHRha2UgdGhlIFNDQiBzdGF0dXMgd29yZCBhbmQgdGVzdCB0aGUgcmVsZXZhbnQgc3RhdHVzIGJpdCAqLworI2RlZmluZSBTQ0JfY29tcGxldGUocykgKChzJjB4ODAwMCkhPTApCisjZGVmaW5lIFNDQl9yeGRmcmFtZShzKSAoKHMmMHg0MDAwKSE9MCkKKyNkZWZpbmUgU0NCX0NVZGVhZChzKSAgICgocyYweDIwMDApIT0wKQorI2RlZmluZSBTQ0JfUlVkZWFkKHMpICAgKChzJjB4MTAwMCkhPTApCisjZGVmaW5lIFNDQl9hY2socykgICAgICAocyAmIDB4ZjAwMCkKKworLyogQ29tbWFuZCB1bml0IHN0YXR1czogMD1pZGxlLCAxPXN1c3BlbmRlZCwgMj1hY3RpdmUgKi8KKyNkZWZpbmUgU0NCX0NVc3RhdChzKSAgICgocyYweDAzMDApPj44KQorCisvKiBSZWNlaXZlIHVuaXQgc3RhdHVzOiAwPWlkbGUsIDE9c3VzcGVuZGVkLCAyPW91dCBvZiByZXNvdXJjZXMsIDQ9cmVhZHkgKi8KKyNkZWZpbmUgU0NCX1JVc3RhdChzKSAgICgocyYweDAwNzApPj40KQorCisvKiBTQ0IgY29tbWFuZHMgKi8KKyNkZWZpbmUgU0NCX0NVbm9wICAgICAgIDB4MDAwMAorI2RlZmluZSBTQ0JfQ1VzdGFydCAgICAgMHgwMTAwCisjZGVmaW5lIFNDQl9DVXJlc3VtZSAgICAweDAyMDAKKyNkZWZpbmUgU0NCX0NVc3VzcGVuZCAgIDB4MDMwMAorI2RlZmluZSBTQ0JfQ1VhYm9ydCAgICAgMHgwNDAwCisjZGVmaW5lIFNDQl9yZXNldGNoaXAgICAweDAwODAKKworI2RlZmluZSBTQ0JfUlVub3AgICAgICAgMHgwMDAwCisjZGVmaW5lIFNDQl9SVXN0YXJ0ICAgICAweDAwMTAKKyNkZWZpbmUgU0NCX1JVcmVzdW1lICAgIDB4MDAyMAorI2RlZmluZSBTQ0JfUlVzdXNwZW5kICAgMHgwMDMwCisjZGVmaW5lIFNDQl9SVWFib3J0ICAgICAweDAwNDAKKworLyoKKyAqIENvbW1hbmQgYmxvY2sgZGVmaW5lcyAKKyAqLworCisjZGVmaW5lIFN0YXRfRG9uZShzKSAgICAoKHMmMHg4MDAwKSE9MCkKKyNkZWZpbmUgU3RhdF9CdXN5KHMpICAgICgocyYweDQwMDApIT0wKQorI2RlZmluZSBTdGF0X09LKHMpICAgICAgKChzJjB4MjAwMCkhPTApCisjZGVmaW5lIFN0YXRfQWJvcnQocykgICAoKHMmMHgxMDAwKSE9MCkKKyNkZWZpbmUgU3RhdF9TVEZhaWwgICAgICgocyYweDA4MDApIT0wKQorI2RlZmluZSBTdGF0X1ROb0NhcihzKSAgKChzJjB4MDQwMCkhPTApCisjZGVmaW5lIFN0YXRfVE5vQ1RTKHMpICAoKHMmMHgwMjAwKSE9MCkKKyNkZWZpbmUgU3RhdF9UTm9ETUEocykgICgocyYweDAxMDApIT0wKQorI2RlZmluZSBTdGF0X1REZWZlcihzKSAgKChzJjB4MDA4MCkhPTApCisjZGVmaW5lIFN0YXRfVENvbGwocykgICAoKHMmMHgwMDQwKSE9MCkKKyNkZWZpbmUgU3RhdF9UWENvbGwocykgICgocyYweDAwMjApIT0wKQorI2RlZmluZSBTdGF0X05vQ29sbChzKSAgKHMmMHgwMDBmKQorCisvKiBDbWRfRU5EIHdpbGwgZW5kIEFGVEVSIHRoZSBjb21tYW5kIGlmIHRoaXMgaXMgdGhlIGZpcnN0CisgKiBjb21tYW5kIGJsb2NrIGFmdGVyIGFuIFNDQl9DVXN0YXJ0LCBidXQgQkVGT1JFIHRoZSBjb21tYW5kCisgKiBmb3IgYWxsIHN1YnNlcXVlbnQgY29tbWFuZHMuIEJlc3Qgc3RyYXRlZ3kgaXMgdG8gcGxhY2UKKyAqIENtZF9JTlQgb24gdGhlIGxhc3QgY29tbWFuZCBpbiB0aGUgc2VxdWVuY2UsIGZvbGxvd2VkIGJ5IGEKKyAqIGR1bW15IENtZF9Ob3Agd2l0aCBDbWRfRU5EIGFmdGVyIHRoaXMuCisgKi8KKworI2RlZmluZSBDbWRfRU5EICAgICAweDgwMDAKKyNkZWZpbmUgQ21kX1NVUyAgICAgMHg0MDAwCisjZGVmaW5lIENtZF9JTlQgICAgIDB4MjAwMAorCisjZGVmaW5lIENtZF9Ob3AgICAgIDB4MDAwMAorI2RlZmluZSBDbWRfU2V0QWRkciAweDAwMDEKKyNkZWZpbmUgQ21kX0NvbmZpZyAgMHgwMDAyCisjZGVmaW5lIENtZF9NQ2FzdCAgIDB4MDAwMworI2RlZmluZSBDbWRfWG1pdCAgICAweDAwMDQKKyNkZWZpbmUgQ21kX1REUiAgICAgMHgwMDA1CisjZGVmaW5lIENtZF9EdW1wICAgIDB4MDAwNgorI2RlZmluZSBDbWRfRGlhZyAgICAweDAwMDcKKworCisvKgorICogRnJhbWUgRGVzY3JpcHRvciAoUmVjZWl2ZSBibG9jaykgZGVmaW5lcworICovCisKKyNkZWZpbmUgRkRfRG9uZShzKSAgKChzJjB4ODAwMCkhPTApCisjZGVmaW5lIEZEX0J1c3kocykgICgocyYweDQwMDApIT0wKQorI2RlZmluZSBGRF9PSyhzKSAgICAoKHMmMHgyMDAwKSE9MCkKKworI2RlZmluZSBGRF9DUkMocykgICAoKHMmMHgwODAwKSE9MCkKKyNkZWZpbmUgRkRfQWxpZ24ocykgKChzJjB4MDQwMCkhPTApCisjZGVmaW5lIEZEX1Jlc3JjKHMpICgocyYweDAyMDApIT0wKQorI2RlZmluZSBGRF9ETUEocykgICAoKHMmMHgwMTAwKSE9MCkKKyNkZWZpbmUgRkRfU2hvcnQocykgKChzJjB4MDA4MCkhPTApCisjZGVmaW5lIEZEX05vRU9GKHMpICgocyYweDAwNDApIT0wKQorCitzdHJ1Y3QgcmZkX2hlYWRlciB7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBsaW5rOworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IHJiZF9vZmZzZXQ7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgZHN0YWRkcjE7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgZHN0YWRkcjI7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgZHN0YWRkcjM7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgc3JjYWRkcjE7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgc3JjYWRkcjI7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgc3JjYWRkcjM7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOworICAKKwkvKiBUaGlzIGlzIGFjdHVhbGx5IGEgUmVjZWl2ZSBCdWZmZXIgRGVzY3JpcHRvci4gIFRoZSB3YXkgd2UgCisJICogYXJyYW5nZSBtZW1vcnkgbWVhbnMgdGhhdCBhbiBSQkQgYWx3YXlzIGZvbGxvd3MgdGhlIFJGRCB0aGF0IAorCSAqIHBvaW50cyB0byBpdCwgc28gdGhleSBtaWdodCBhcyB3ZWxsIGJlIGluIHRoZSBzYW1lIHN0cnVjdHVyZS4KKwkgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBhY3R1YWxfY291bnQ7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgbmV4dF9yYmQ7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgYnVmX2FkZHIxOworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGJ1Zl9hZGRyMjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBzaXplOworfTsKKworLyogUmV0dXJuZWQgZGF0YSBmcm9tIHRoZSBUaW1lIERvbWFpbiBSZWZsZWN0b21ldGVyICovCisKKyNkZWZpbmUgVERSX0xJTktPSyAgICAgICAoMTw8MTUpCisjZGVmaW5lIFREUl9YQ1ZSUFJPQkxFTSAgKDE8PDE0KQorI2RlZmluZSBURFJfT1BFTiAgICAgICAgICgxPDwxMykKKyNkZWZpbmUgVERSX1NIT1JUICAgICAgICAoMTw8MTIpCisjZGVmaW5lIFREUl9USU1FICAgICAgICAgMHg3ZmYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VwaWMxMDAuYyBiL2RyaXZlcnMvbmV0L2VwaWMxMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWViYWVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXBpYzEwMC5jCkBAIC0wLDAgKzEsMTY4NyBAQAorLyogZXBpYzEwMC5jOiBBIFNNQyA4M2MxNzAgRVBJQy8xMDAgRmFzdCBFdGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LiAqLworLyoKKwlXcml0dGVuL2NvcHlyaWdodCAxOTk3LTIwMDEgYnkgRG9uYWxkIEJlY2tlci4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKwl0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCURyaXZlcnMgYmFzZWQgb24gb3IgZGVyaXZlZCBmcm9tIHRoaXMgY29kZSBmYWxsIHVuZGVyIHRoZSBHUEwgYW5kIG11c3QKKwlyZXRhaW4gdGhlIGF1dGhvcnNoaXAsIGNvcHlyaWdodCBhbmQgbGljZW5zZSBub3RpY2UuICBUaGlzIGZpbGUgaXMgbm90CisJYSBjb21wbGV0ZSBwcm9ncmFtIGFuZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdGhlIGVudGlyZSBvcGVyYXRpbmcKKwlzeXN0ZW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4KKworCVRoaXMgZHJpdmVyIGlzIGZvciB0aGUgU01DODNjMTcwLzE3NSAiRVBJQyIgc2VyaWVzLCBhcyB1c2VkIG9uIHRoZQorCVNNQyBFdGhlclBvd2VyIElJIDk0MzIgUENJIGFkYXB0ZXIsIGFuZCBzZXZlcmFsIENhcmRCdXMgY2FyZHMuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKwlJbmZvcm1hdGlvbiBhbmQgdXBkYXRlcyBhdmFpbGFibGUgYXQKKwlodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL2VwaWMxMDAuaHRtbAorCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCisJTGludXgga2VybmVsLXNwZWNpZmljIGNoYW5nZXM6CisJCisJTEsxLjEuMiAoamdhcnppayk6CisJKiBNZXJnZSBiZWNrZXIgdmVyc2lvbiAxLjA5ICg0LzA4LzIwMDApCisKKwlMSzEuMS4zOgorCSogTWFqb3IgYnVnZml4IHRvIDEuMDkgZHJpdmVyIChGcmFuY2lzIFJvbWlldSkKKwkKKwlMSzEuMS40IChqZ2FyemlrKToKKwkqIE1lcmdlIGJlY2tlciB0ZXN0IHZlcnNpb24gMS4wOSAoNS8yOS8yMDAwKQorCisJTEsxLjEuNToKKwkqIEZpeCBsb2NraW5nIChqZ2FyemlrKQorCSogTGltaXQgODNjMTc1IHByb2JlIHRvIGV0aGVybmV0LWNsYXNzIFBDSSBkZXZpY2VzIChyZ29vY2gpCisKKwlMSzEuMS42OgorCSogTWVyZ2UgYmVja2VyIHZlcnNpb24gMS4xMQorCSogTW92ZSBwY2lfZW5hYmxlX2RldmljZSBiZWZvcmUgYW55IFBDSSBCQVIgbGVuIGNoZWNrcworCisJTEsxLjEuNzoKKwkqIHsgZmlsbCBtZSBpbiB9CisKKwlMSzEuMS44OgorCSogZXRodG9vbCBkcml2ZXIgaW5mbyBzdXBwb3J0IChqZ2FyemlrKQorCisJTEsxLjEuOToKKwkqIGV0aHRvb2wgbWVkaWEgZ2V0L3NldCBzdXBwb3J0IChqZ2FyemlrKQorCisJTEsxLjEuMTA6CisJKiByZXZlcnQgTUlJIHRyYW5zY2VpdmVyIGluaXQgY2hhbmdlIChqZ2FyemlrKQorCisJTEsxLjEuMTE6CisJKiBpbXBsZW1lbnQgRVRIVE9PTF9bR1NdU0VULCBfTldBWV9SU1QsIF9bR1NdTVNHTFZMLCBfR0xJTksgKGpnYXJ6aWspCisJKiByZXBsYWNlIHNvbWUgTUlJLXJlbGF0ZWQgbWFnaWMgbnVtYmVycyB3aXRoIGNvbnN0YW50cworCisJTEsxLjEuMTI6CisJKiBmaXggcG93ZXItdXAgc2VxdWVuY2UKKworCUxLMS4xLjEzOgorCSogcmV2ZXJ0IHZlcnNpb24gMS4xLjEyLCBwb3dlci11cCBzZXF1ZW5jZSAiZml4IgorCisJTEsxLjEuMTQgKEtyeXpzenRvZiBIYWxhc2EpOgorCSogZml4IHNwdXJpb3VzIGJhZCBpbml0aWFsaXphdGlvbnMKKwkqIHBvdW5kIHBoeSBhIGxhIFNNU0MncyBhcHAgbm90ZSBvbiB0aGUgc3ViamVjdAorCQorCUFDMS4xLjE0YWMKKwkqIGZpeCBwb3dlciB1cC9kb3duIGZvciBldGh0b29sIHRoYXQgYnJva2UgaW4gMS4xMQorCisqLworCisjZGVmaW5lIERSVl9OQU1FICAgICAgICAiZXBpYzEwMCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gICAgICIxLjExK0xLMS4xLjE0K0FDMS4xLjE0IgorI2RlZmluZSBEUlZfUkVMREFURSAgICAgIkp1bmUgMiwgMjAwNCIKKworLyogVGhlIHVzZXItY29uZmlndXJhYmxlIHZhbHVlcy4KKyAgIFRoZXNlIG1heSBiZSBtb2RpZmllZCB3aGVuIGEgZHJpdmVyIG1vZHVsZSBpcyBsb2FkZWQuKi8KKworc3RhdGljIGludCBkZWJ1ZyA9IDE7CQkJLyogMSBub3JtYWwgbWVzc2FnZXMsIDAgcXVpZXQgLi4gNyB2ZXJib3NlLiAqLworCisvKiBVc2VkIHRvIHBhc3MgdGhlIGZ1bGwtZHVwbGV4IGZsYWcsIGV0Yy4gKi8KKyNkZWZpbmUgTUFYX1VOSVRTIDgJCS8qIE1vcmUgYXJlIHN1cHBvcnRlZCwgbGltaXQgb25seSBvbiBvcHRpb25zICovCitzdGF0aWMgaW50IG9wdGlvbnNbTUFYX1VOSVRTXSA9IHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9Oworc3RhdGljIGludCBmdWxsX2R1cGxleFtNQVhfVU5JVFNdID0gey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CisKKy8qIFNldCB0aGUgY29weSBicmVha3BvaW50IGZvciB0aGUgY29weS1vbmx5LXRpbnktZnJhbWVzIHNjaGVtZS4KKyAgIFNldHRpbmcgdG8gPiAxNTE4IGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoaXMgZmVhdHVyZS4gKi8KK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrOworCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIHNldCBhdCBjb21waWxlIHRpbWUuICovCisKKy8qIEtlZXAgdGhlIHJpbmcgc2l6ZXMgYSBwb3dlciBvZiB0d28gZm9yIG9wZXJhdGlvbmFsIGVmZmljaWVuY3kuCisgICBUaGUgY29tcGlsZXIgd2lsbCBjb252ZXJ0IDx1bnNpZ25lZD4nJSc8Ml5OPiBpbnRvIGEgYml0IG1hc2suCisgICBNYWtpbmcgdGhlIFR4IHJpbmcgdG9vIGxhcmdlIGRlY3JlYXNlcyB0aGUgZWZmZWN0aXZlbmVzcyBvZiBjaGFubmVsCisgICBib25kaW5nIGFuZCBwYWNrZXQgcHJpb3JpdHkuCisgICBUaGVyZSBhcmUgbm8gaWxsIGVmZmVjdHMgZnJvbSB0b28tbGFyZ2UgcmVjZWl2ZSByaW5ncy4gKi8KKyNkZWZpbmUgVFhfUklOR19TSVpFCTI1NgorI2RlZmluZSBUWF9RVUVVRV9MRU4JMjQwCQkvKiBMaW1pdCByaW5nIGVudHJpZXMgYWN0dWFsbHkgdXNlZC4gICovCisjZGVmaW5lIFJYX1JJTkdfU0laRQkyNTYKKyNkZWZpbmUgVFhfVE9UQUxfU0laRQlUWF9SSU5HX1NJWkUqc2l6ZW9mKHN0cnVjdCBlcGljX3R4X2Rlc2MpCisjZGVmaW5lIFJYX1RPVEFMX1NJWkUJUlhfUklOR19TSVpFKnNpemVvZihzdHJ1Y3QgZXBpY19yeF9kZXNjKQorCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgdXN1YWxseSBhcmUgbm90IGNoYW5nZWQuICovCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQgICgyKkhaKQorCisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1MzYJCQkvKiBTaXplIG9mIGVhY2ggdGVtcG9yYXJ5IFJ4IGJ1ZmZlci4qLworCisvKiBCeXRlcyB0cmFuc2ZlcnJlZCB0byBjaGlwIGJlZm9yZSB0cmFuc21pc3Npb24gc3RhcnRzLiAqLworLyogSW5pdGlhbCB0aHJlc2hvbGQsIGluY3JlYXNlZCBvbiB1bmRlcmZsb3csIHJvdW5kZWQgZG93biB0byA0IGJ5dGUgdW5pdHMuICovCisjZGVmaW5lIFRYX0ZJRk9fVEhSRVNIIDI1NgorI2RlZmluZSBSWF9GSUZPX1RIUkVTSCAxCQkvKiAwLTMsIDA9PTMyLCA2NCw5Niwgb3IgMz09MTI4IGJ5dGVzICAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyogVGhlc2UgaWRlbnRpZnkgdGhlIGRyaXZlciBiYXNlIHZlcnNpb24gYW5kIG1heSBub3QgYmUgcmVtb3ZlZC4gKi8KK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KK0RSVl9OQU1FICIuYzp2MS4xMSAxLzcvMjAwMSBXcml0dGVuIGJ5IERvbmFsZCBCZWNrZXIgPGJlY2tlckBzY3lsZC5jb20+XG4iOworc3RhdGljIGNoYXIgdmVyc2lvbjJbXSBfX2RldmluaXRkYXRhID0KKyIgIGh0dHA6Ly93d3cuc2N5bGQuY29tL25ldHdvcmsvZXBpYzEwMC5odG1sXG4iOworc3RhdGljIGNoYXIgdmVyc2lvbjNbXSBfX2RldmluaXRkYXRhID0KKyIgICh1bm9mZmljaWFsIDIuNC54IGtlcm5lbCBwb3J0LCB2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIiwgIiBEUlZfUkVMREFURSAiKVxuIjsKKworTU9EVUxFX0FVVEhPUigiRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU01DIDgzYzE3MCBFUElDIHNlcmllcyBFdGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJ4X2NvcHlicmVhaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShvcHRpb25zLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGZ1bGxfZHVwbGV4LCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkVQSUMvMTAwIGRlYnVnIGxldmVsICgwLTUpIik7CitNT0RVTEVfUEFSTV9ERVNDKG9wdGlvbnMsICJFUElDLzEwMDogQml0cyAwLTM6IG1lZGlhIHR5cGUsIGJpdCA0OiBmdWxsIGR1cGxleCIpOworTU9EVUxFX1BBUk1fREVTQyhyeF9jb3B5YnJlYWssICJFUElDLzEwMCBjb3B5IGJyZWFrcG9pbnQgZm9yIGNvcHktb25seS10aW55LWZyYW1lcyIpOworTU9EVUxFX1BBUk1fREVTQyhmdWxsX2R1cGxleCwgIkVQSUMvMTAwIGZ1bGwgZHVwbGV4IHNldHRpbmcocykgKDEpIik7CisKKy8qCisJCQkJVGhlb3J5IG9mIE9wZXJhdGlvbgorCitJLiBCb2FyZCBDb21wYXRpYmlsaXR5CisKK1RoaXMgZGV2aWNlIGRyaXZlciBpcyBkZXNpZ25lZCBmb3IgdGhlIFNNQyAiRVBJQy8xMDAiLCB0aGUgU01DCitzaW5nbGUtY2hpcCBFdGhlcm5ldCBjb250cm9sbGVycyBmb3IgUENJLiAgVGhpcyBjaGlwIGlzIHVzZWQgb24KK3RoZSBTTUMgRXRoZXJQb3dlciBJSSBib2FyZHMuCisKK0lJLiBCb2FyZC1zcGVjaWZpYyBzZXR0aW5ncworCitQQ0kgYnVzIGRldmljZXMgYXJlIGNvbmZpZ3VyZWQgYnkgdGhlIHN5c3RlbSBhdCBib290IHRpbWUsIHNvIG5vIGp1bXBlcnMKK25lZWQgdG8gYmUgc2V0IG9uIHRoZSBib2FyZC4gIFRoZSBzeXN0ZW0gQklPUyB3aWxsIGFzc2lnbiB0aGUKK1BDSSBJTlRBIHNpZ25hbCB0byBhIChwcmVmZXJhYmx5IG90aGVyd2lzZSB1bnVzZWQpIHN5c3RlbSBJUlEgbGluZS4KK05vdGU6IEtlcm5lbCB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gMS4zLjczIGRvIG5vdCBzdXBwb3J0IHNoYXJlZCBQQ0kKK2ludGVycnVwdCBsaW5lcy4KKworSUlJLiBEcml2ZXIgb3BlcmF0aW9uCisKK0lJSWEuIFJpbmcgYnVmZmVycworCitJVmIuIFJlZmVyZW5jZXMKKworaHR0cDovL3d3dy5zbXNjLmNvbS9tYWluL2RhdGFzaGVldHMvODNjMTcxLnBkZgoraHR0cDovL3d3dy5zbXNjLmNvbS9tYWluL2RhdGFzaGVldHMvODNjMTc1LnBkZgoraHR0cDovL3NjeWxkLmNvbS9leHBlcnQvTldheS5odG1sCitodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9wZi9EUC9EUDgzODQwQS5odG1sCisKK0lWYy4gRXJyYXRhCisKKyovCisKKworZW51bSBwY2lfaWRfZmxhZ3NfYml0cyB7CisgICAgICAgIC8qIFNldCBQQ0kgY29tbWFuZCByZWdpc3RlciBiaXRzIGJlZm9yZSBjYWxsaW5nIHByb2JlMSgpLiAqLworICAgICAgICBQQ0lfVVNFU19JTz0xLCBQQ0lfVVNFU19NRU09MiwgUENJX1VTRVNfTUFTVEVSPTQsCisgICAgICAgIC8qIFJlYWQgYW5kIG1hcCB0aGUgc2luZ2xlIGZvbGxvd2luZyBQQ0kgQkFSLiAqLworICAgICAgICBQQ0lfQUREUjA9MDw8NCwgUENJX0FERFIxPTE8PDQsIFBDSV9BRERSMj0yPDw0LCBQQ0lfQUREUjM9Mzw8NCwKKyAgICAgICAgUENJX0FERFJfNjRCSVRTPTB4MTAwLCBQQ0lfTk9fQUNQSV9XQUtFPTB4MjAwLCBQQ0lfTk9fTUlOX0xBVEVOQ1k9MHg0MDAsCit9OworCitlbnVtIGNoaXBfY2FwYWJpbGl0eV9mbGFncyB7IE1JSV9QV1JEV049MSwgVFlQRTJfSU5UUj0yLCBOT19NSUk9NCB9OworCisjZGVmaW5lIEVQSUNfVE9UQUxfU0laRSAweDEwMAorI2RlZmluZSBVU0VfSU9fT1BTIDEKKyNpZmRlZiBVU0VfSU9fT1BTCisjZGVmaW5lIEVQSUNfSU9UWVBFIFBDSV9VU0VTX01BU1RFUnxQQ0lfVVNFU19JT3xQQ0lfQUREUjAKKyNlbHNlCisjZGVmaW5lIEVQSUNfSU9UWVBFIFBDSV9VU0VTX01BU1RFUnxQQ0lfVVNFU19NRU18UENJX0FERFIxCisjZW5kaWYKKwordHlwZWRlZiBlbnVtIHsKKwlTTVNDXzgzQzE3MF8wLAorCVNNU0NfODNDMTcwLAorCVNNU0NfODNDMTc1LAorfSBjaGlwX3Q7CisKKworc3RydWN0IGVwaWNfY2hpcF9pbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOworCWVudW0gcGNpX2lkX2ZsYWdzX2JpdHMgcGNpX2ZsYWdzOworICAgICAgICBpbnQgaW9fc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmVlZGVkIGZvciBJL08gcmVnaW9uIGNoZWNrIG9yIGlvcmVtYXAoKS4gKi8KKyAgICAgICAgaW50IGRydl9mbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERyaXZlciB1c2UsIGludGVuZGVkIGFzIGNhcGFiaWxpdHkgZmxhZ3MuICovCit9OworCisKKy8qIGluZGV4ZWQgYnkgY2hpcF90ICovCitzdGF0aWMgc3RydWN0IGVwaWNfY2hpcF9pbmZvIHBjaV9pZF90YmxbXSA9IHsKKwl7ICJTTVNDIEVQSUMvMTAwIDgzYzE3MCIsCisJIEVQSUNfSU9UWVBFLCBFUElDX1RPVEFMX1NJWkUsIFRZUEUyX0lOVFIgfCBOT19NSUkgfCBNSUlfUFdSRFdOIH0sCisJeyAiU01TQyBFUElDLzEwMCA4M2MxNzAiLAorCSBFUElDX0lPVFlQRSwgRVBJQ19UT1RBTF9TSVpFLCBUWVBFMl9JTlRSIH0sCisJeyAiU01TQyBFUElDL0MgODNjMTc1IiwKKwkgRVBJQ19JT1RZUEUsIEVQSUNfVE9UQUxfU0laRSwgVFlQRTJfSU5UUiB8IE1JSV9QV1JEV04gfSwKK307CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGVwaWNfcGNpX3RibFtdID0geworCXsgMHgxMEI4LCAweDAwMDUsIDB4MTA5MiwgMHgwQUI0LCAwLCAwLCBTTVNDXzgzQzE3MF8wIH0sCisJeyAweDEwQjgsIDB4MDAwNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgU01TQ184M0MxNzAgfSwKKwl7IDB4MTBCOCwgMHgwMDA2LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAorCSAgUENJX0NMQVNTX05FVFdPUktfRVRIRVJORVQgPDwgOCwgMHhmZmZmMDAsIFNNU0NfODNDMTc1IH0sCisJeyAwLH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFIChwY2ksIGVwaWNfcGNpX3RibCk7CisKKwkKKyNpZm5kZWYgVVNFX0lPX09QUworI3VuZGVmIGluYgorI3VuZGVmIGludworI3VuZGVmIGlubAorI3VuZGVmIG91dGIKKyN1bmRlZiBvdXR3CisjdW5kZWYgb3V0bAorI2RlZmluZSBpbmIgcmVhZGIKKyNkZWZpbmUgaW53IHJlYWR3CisjZGVmaW5lIGlubCByZWFkbAorI2RlZmluZSBvdXRiIHdyaXRlYgorI2RlZmluZSBvdXR3IHdyaXRldworI2RlZmluZSBvdXRsIHdyaXRlbAorI2VuZGlmCisKKy8qIE9mZnNldHMgdG8gcmVnaXN0ZXJzLCB1c2luZyB0aGUgKHVnaCkgU01DIG5hbWVzLiAqLworZW51bSBlcGljX3JlZ2lzdGVycyB7CisgIENPTU1BTkQ9MCwgSU5UU1RBVD00LCBJTlRNQVNLPTgsIEdFTkNUTD0weDBDLCBOVkNUTD0weDEwLCBFRUNUTD0weDE0LAorICBQQ0lCdXJzdENudD0weDE4LAorICBURVNUMT0weDFDLCBDUkNDTlQ9MHgyMCwgQUxJQ05UPTB4MjQsIE1QQ05UPTB4MjgsCS8qIFJ4IGVycm9yIGNvdW50ZXJzLiAqLworICBNSUlDdHJsPTB4MzAsIE1JSURhdGE9MHgzNCwgTUlJQ2ZnPTB4MzgsCisgIExBTjA9NjQsCQkJCQkJLyogTUFDIGFkZHJlc3MuICovCisgIE1DMD04MCwJCQkJCQkvKiBNdWx0aWNhc3QgZmlsdGVyIHRhYmxlLiAqLworICBSeEN0cmw9OTYsIFR4Q3RybD0xMTIsIFR4U1RBVD0weDc0LAorICBQUnhDREFSPTB4ODQsIFJ4U1RBVD0weEE0LCBFYXJseVJ4PTB4QjAsIFBUeENEQVI9MHhDNCwgVHhUaHJlc2g9MHhEQywKK307CisKKy8qIEludGVycnVwdCByZWdpc3RlciBiaXRzLCB1c2luZyBteSBvd24gbWVhbmluZ2Z1bCBuYW1lcy4gKi8KK2VudW0gSW50clN0YXR1cyB7CisJVHhJZGxlPTB4NDAwMDAsIFJ4SWRsZT0weDIwMDAwLCBJbnRyU3VtbWFyeT0weDAxMDAwMCwKKwlQQ0lCdXNFcnIxNzA9MHg3MDAwLCBQQ0lCdXNFcnIxNzU9MHgxMDAwLCBQaHlFdmVudDE3NT0weDgwMDAsCisJUnhTdGFydGVkPTB4MDgwMCwgUnhFYXJseVdhcm49MHgwNDAwLCBDbnRGdWxsPTB4MDIwMCwgVHhVbmRlcnJ1bj0weDAxMDAsCisJVHhFbXB0eT0weDAwODAsIFR4RG9uZT0weDAwMjAsIFJ4RXJyb3I9MHgwMDEwLAorCVJ4T3ZlcmZsb3c9MHgwMDA4LCBSeEZ1bGw9MHgwMDA0LCBSeEhlYWRlcj0weDAwMDIsIFJ4RG9uZT0weDAwMDEsCit9OworZW51bSBDb21tYW5kQml0cyB7CisJU3RvcFJ4PTEsIFN0YXJ0Ung9MiwgVHhRdWV1ZWQ9NCwgUnhRdWV1ZWQ9OCwKKwlTdG9wVHhETUE9MHgyMCwgU3RvcFJ4RE1BPTB4NDAsIFJlc3RhcnRUeD0weDgwLAorfTsKKworI2RlZmluZSBFcGljUmVtb3ZlZAkweGZmZmZmZmZmCS8qIENoaXAgZmFpbGVkIG9yIHJlbW92ZWQgKENhcmRCdXMpICovCisKKyNkZWZpbmUgRXBpY05hcGlFdmVudAkoVHhFbXB0eSB8IFR4RG9uZSB8IFwKKwkJCSBSeERvbmUgfCBSeFN0YXJ0ZWQgfCBSeEVhcmx5V2FybiB8IFJ4T3ZlcmZsb3cgfCBSeEZ1bGwpCisjZGVmaW5lIEVwaWNOb3JtYWxFdmVudAkoMHgwMDAwZmZmZiAmIH5FcGljTmFwaUV2ZW50KQorCitzdGF0aWMgdTE2IG1lZGlhMm1paWN0bFsxNl0gPSB7CisJMCwgMHgwQzAwLCAweDBDMDAsIDB4MjAwMCwgIDB4MDEwMCwgMHgyMTAwLCAwLCAwLAorCTAsIDAsIDAsIDAsICAwLCAwLCAwLCAwIH07CisKKy8qIFRoZSBFUElDMTAwIFJ4IGFuZCBUeCBidWZmZXIgZGVzY3JpcHRvcnMuICovCisKK3N0cnVjdCBlcGljX3R4X2Rlc2MgeworCXUzMiB0eHN0YXR1czsKKwl1MzIgYnVmYWRkcjsKKwl1MzIgYnVmbGVuZ3RoOworCXUzMiBuZXh0OworfTsKKworc3RydWN0IGVwaWNfcnhfZGVzYyB7CisJdTMyIHJ4c3RhdHVzOworCXUzMiBidWZhZGRyOworCXUzMiBidWZsZW5ndGg7CisJdTMyIG5leHQ7Cit9OworCitlbnVtIGRlc2Nfc3RhdHVzX2JpdHMgeworCURlc2NPd249MHg4MDAwLAorfTsKKworI2RlZmluZSBQUklWX0FMSUdOCTE1IAkvKiBSZXF1aXJlZCBhbGlnbm1lbnQgbWFzayAqLworc3RydWN0IGVwaWNfcHJpdmF0ZSB7CisJc3RydWN0IGVwaWNfcnhfZGVzYyAqcnhfcmluZzsKKwlzdHJ1Y3QgZXBpY190eF9kZXNjICp0eF9yaW5nOworCS8qIFRoZSBzYXZlZCBhZGRyZXNzIG9mIGEgc2VudC1pbi1wbGFjZSBwYWNrZXQvYnVmZmVyLCBmb3Igc2tmcmVlKCkuICovCisJc3RydWN0IHNrX2J1ZmYqIHR4X3NrYnVmZltUWF9SSU5HX1NJWkVdOworCS8qIFRoZSBhZGRyZXNzZXMgb2YgcmVjZWl2ZS1pbi1wbGFjZSBza2J1ZmZzLiAqLworCXN0cnVjdCBza19idWZmKiByeF9za2J1ZmZbUlhfUklOR19TSVpFXTsKKworCWRtYV9hZGRyX3QgdHhfcmluZ19kbWE7CisJZG1hX2FkZHJfdCByeF9yaW5nX2RtYTsKKworCS8qIFJpbmcgcG9pbnRlcnMuICovCisJc3BpbmxvY2tfdCBsb2NrOwkJCQkvKiBHcm91cCB3aXRoIFR4IGNvbnRyb2wgY2FjaGUgbGluZS4gKi8KKwlzcGlubG9ja190IG5hcGlfbG9jazsKKwl1bnNpZ25lZCBpbnQgcmVzY2hlZHVsZV9pbl9wb2xsOworCXVuc2lnbmVkIGludCBjdXJfdHgsIGRpcnR5X3R4OworCisJdW5zaWduZWQgaW50IGN1cl9yeCwgZGlydHlfcng7CisJdTMyIGlycV9tYXNrOworCXVuc2lnbmVkIGludCByeF9idWZfc3o7CQkJCS8qIEJhc2VkIG9uIE1UVStzbGFjay4gKi8KKworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OwkJCS8qIFBDSSBidXMgbG9jYXRpb24uICovCisJaW50IGNoaXBfaWQsIGNoaXBfZmxhZ3M7CisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsJCQkvKiBNZWRpYSBzZWxlY3Rpb24gdGltZXIuICovCisJaW50IHR4X3RocmVzaG9sZDsKKwl1bnNpZ25lZCBjaGFyIG1jX2ZpbHRlcls4XTsKKwlzaWduZWQgY2hhciBwaHlzWzRdOwkJCQkvKiBNSUkgZGV2aWNlIGFkZHJlc3Nlcy4gKi8KKwl1MTYgYWR2ZXJ0aXNpbmc7CQkJCQkvKiBOV2F5IG1lZGlhIGFkdmVydGlzZW1lbnQgKi8KKwlpbnQgbWlpX3BoeV9jbnQ7CisJc3RydWN0IG1paV9pZl9pbmZvIG1paTsKKwl1bnNpZ25lZCBpbnQgdHhfZnVsbDoxOwkJCQkvKiBUaGUgVHggcXVldWUgaXMgZnVsbC4gKi8KKwl1bnNpZ25lZCBpbnQgZGVmYXVsdF9wb3J0OjQ7CQkvKiBMYXN0IGRldi0+aWZfcG9ydCB2YWx1ZS4gKi8KK307CisKK3N0YXRpYyBpbnQgZXBpY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCByZWFkX2VlcHJvbShsb25nIGlvYWRkciwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbik7CitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2MsIGludCB2YWwpOworc3RhdGljIHZvaWQgZXBpY19yZXN0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZXBpY190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgZXBpY190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZXBpY19pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGVwaWNfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZXBpY19yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYnVkZ2V0KTsKK3N0YXRpYyBpbnQgZXBpY19wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBlcGljX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgbmV0ZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CitzdGF0aWMgaW50IGVwaWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVwaWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwwKKworc3RhdGljIGludCBfX2RldmluaXQgZXBpY19pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBjYXJkX2lkeCA9IC0xOworCWxvbmcgaW9hZGRyOworCWludCBjaGlwX2lkeCA9IChpbnQpIGVudC0+ZHJpdmVyX2RhdGE7CisJaW50IGlycTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBlcGljX3ByaXZhdGUgKmVwOworCWludCBpLCByZXQsIG9wdGlvbiA9IDAsIGR1cGxleCA9IDA7CisJdm9pZCAqcmluZ19zcGFjZTsKKwlkbWFfYWRkcl90IHJpbmdfZG1hOworCisvKiB3aGVuIGJ1aWx0IGludG8gdGhlIGtlcm5lbCwgd2Ugb25seSBwcmludCB2ZXJzaW9uIGlmIGRldmljZSBpcyBmb3VuZCAqLworI2lmbmRlZiBNT0RVTEUKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQlwcmludGsgKEtFUk5fSU5GTyAiJXMiIEtFUk5fSU5GTyAiJXMiIEtFUk5fSU5GTyAiJXMiLAorCQkJdmVyc2lvbiwgdmVyc2lvbjIsIHZlcnNpb24zKTsKKyNlbmRpZgorCQorCWNhcmRfaWR4Kys7CisJCisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisJaXJxID0gcGRldi0+aXJxOworCisJaWYgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgPCBwY2lfaWRfdGJsW2NoaXBfaWR4XS5pb19zaXplKSB7CisJCXByaW50ayAoS0VSTl9FUlIgImNhcmQgJWQ6IG5vIFBDSSByZWdpb24gc3BhY2VcbiIsIGNhcmRfaWR4KTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGU7CisJfQorCQorCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCisJcmV0ID0gLUVOT01FTTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZiAoKmVwKSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiY2FyZCAlZDogbm8gbWVtb3J5IGZvciBldGggZGV2aWNlXG4iLCBjYXJkX2lkeCk7CisJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKKwl9CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKyNpZmRlZiBVU0VfSU9fT1BTCisJaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAwKTsKKyNlbHNlCisJaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAxKTsKKwlpb2FkZHIgPSAobG9uZykgaW9yZW1hcCAoaW9hZGRyLCBwY2lfcmVzb3VyY2VfbGVuIChwZGV2LCAxKSk7CisJaWYgKCFpb2FkZHIpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBEUlZfTkFNRSAiICVkOiBpb3JlbWFwIGZhaWxlZFxuIiwgY2FyZF9pZHgpOworCQlnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7CisJfQorI2VuZGlmCisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKwllcCA9IGRldi0+cHJpdjsKKwllcC0+bWlpLmRldiA9IGRldjsKKwllcC0+bWlpLm1kaW9fcmVhZCA9IG1kaW9fcmVhZDsKKwllcC0+bWlpLm1kaW9fd3JpdGUgPSBtZGlvX3dyaXRlOworCWVwLT5taWkucGh5X2lkX21hc2sgPSAweDFmOworCWVwLT5taWkucmVnX251bV9tYXNrID0gMHgxZjsKKworCXJpbmdfc3BhY2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBUWF9UT1RBTF9TSVpFLCAmcmluZ19kbWEpOworCWlmICghcmluZ19zcGFjZSkKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJZXAtPnR4X3JpbmcgPSAoc3RydWN0IGVwaWNfdHhfZGVzYyAqKXJpbmdfc3BhY2U7CisJZXAtPnR4X3JpbmdfZG1hID0gcmluZ19kbWE7CisKKwlyaW5nX3NwYWNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKKwlpZiAoIXJpbmdfc3BhY2UpCisJCWdvdG8gZXJyX291dF91bm1hcF90eDsKKwllcC0+cnhfcmluZyA9IChzdHJ1Y3QgZXBpY19yeF9kZXNjICopcmluZ19zcGFjZTsKKwllcC0+cnhfcmluZ19kbWEgPSByaW5nX2RtYTsKKworCWlmIChkZXYtPm1lbV9zdGFydCkgeworCQlvcHRpb24gPSBkZXYtPm1lbV9zdGFydDsKKwkJZHVwbGV4ID0gKGRldi0+bWVtX3N0YXJ0ICYgMTYpID8gMSA6IDA7CisJfSBlbHNlIGlmIChjYXJkX2lkeCA+PSAwICAmJiAgY2FyZF9pZHggPCBNQVhfVU5JVFMpIHsKKwkJaWYgKG9wdGlvbnNbY2FyZF9pZHhdID49IDApCisJCQlvcHRpb24gPSBvcHRpb25zW2NhcmRfaWR4XTsKKwkJaWYgKGZ1bGxfZHVwbGV4W2NhcmRfaWR4XSA+PSAwKQorCQkJZHVwbGV4ID0gZnVsbF9kdXBsZXhbY2FyZF9pZHhdOworCX0KKworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCWRldi0+aXJxID0gaXJxOworCisJc3Bpbl9sb2NrX2luaXQoJmVwLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZXAtPm5hcGlfbG9jayk7CisJZXAtPnJlc2NoZWR1bGVfaW5fcG9sbCA9IDA7CisKKwkvKiBCcmluZyB0aGUgY2hpcCBvdXQgb2YgbG93LXBvd2VyIG1vZGUuICovCisJb3V0bCgweDQyMDAsIGlvYWRkciArIEdFTkNUTCk7CisJLyogTWFnaWM/ISAgSWYgd2UgZG9uJ3Qgc2V0IHRoaXMgYml0IHRoZSBNSUkgaW50ZXJmYWNlIHdvbid0IHdvcmsuICovCisJLyogVGhpcyBtYWdpYyBpcyBkb2N1bWVudGVkIGluIFNNU0MgYXBwIG5vdGUgNy4xNSAqLworCWZvciAoaSA9IDE2OyBpID4gMDsgaS0tKQorCQlvdXRsKDB4MDAwOCwgaW9hZGRyICsgVEVTVDEpOworCisJLyogVHVybiBvbiB0aGUgTUlJIHRyYW5zY2VpdmVyLiAqLworCW91dGwoMHgxMiwgaW9hZGRyICsgTUlJQ2ZnKTsKKwlpZiAoY2hpcF9pZHggPT0gMSkKKwkJb3V0bCgoaW5sKGlvYWRkciArIE5WQ1RMKSAmIH4weDAwM0MpIHwgMHg0ODAwLCBpb2FkZHIgKyBOVkNUTCk7CisJb3V0bCgweDAyMDAsIGlvYWRkciArIEdFTkNUTCk7CisKKwkvKiBOb3RlOiB0aGUgJzE3NSBkb2VzIG5vdCBoYXZlIGEgc2VyaWFsIEVFUFJPTS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkoKHUxNiAqKWRldi0+ZGV2X2FkZHIpW2ldID0gbGUxNl90b19jcHUoaW53KGlvYWRkciArIExBTjAgKyBpKjQpKTsKKworCWlmIChkZWJ1ZyA+IDIpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgRFJWX05BTUUgIiglcyk6IEVFUFJPTSBjb250ZW50c1xuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisJCQlwcmludGsoIiAlNC40eCVzIiwgcmVhZF9lZXByb20oaW9hZGRyLCBpKSwKKwkJCQkgICBpICUgMTYgPT0gMTUgPyAiXG4iIDogIiIpOworCX0KKworCWVwLT5wY2lfZGV2ID0gcGRldjsKKwllcC0+Y2hpcF9pZCA9IGNoaXBfaWR4OworCWVwLT5jaGlwX2ZsYWdzID0gcGNpX2lkX3RibFtjaGlwX2lkeF0uZHJ2X2ZsYWdzOworCWVwLT5pcnFfbWFzayA9IAorCQkoZXAtPmNoaXBfZmxhZ3MgJiBUWVBFMl9JTlRSID8gIFBDSUJ1c0VycjE3NSA6IFBDSUJ1c0VycjE3MCkKKwkJIHwgQ250RnVsbCB8IFR4VW5kZXJydW4gfCBFcGljTmFwaUV2ZW50OworCisJLyogRmluZCB0aGUgY29ubmVjdGVkIE1JSSB4Y3Zycy4KKwkgICBEb2luZyB0aGlzIGluIG9wZW4oKSB3b3VsZCBhbGxvdyBkZXRlY3RpbmcgZXh0ZXJuYWwgeGN2cnMgbGF0ZXIsIGJ1dAorCSAgIHRha2VzIG11Y2ggdGltZSBhbmQgbm8gY2FyZHMgaGF2ZSBleHRlcm5hbCBNSUkuICovCisJeworCQlpbnQgcGh5LCBwaHlfaWR4ID0gMDsKKwkJZm9yIChwaHkgPSAxOyBwaHkgPCAzMiAmJiBwaHlfaWR4IDwgc2l6ZW9mKGVwLT5waHlzKTsgcGh5KyspIHsKKwkJCWludCBtaWlfc3RhdHVzID0gbWRpb19yZWFkKGRldiwgcGh5LCBNSUlfQk1TUik7CisJCQlpZiAobWlpX3N0YXR1cyAhPSAweGZmZmYgICYmICBtaWlfc3RhdHVzICE9IDB4MDAwMCkgeworCQkJCWVwLT5waHlzW3BoeV9pZHgrK10gPSBwaHk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiKCVzKTogTUlJIHRyYW5zY2VpdmVyICMlZCBjb250cm9sICIKKwkJCQkJICAgIiU0LjR4IHN0YXR1cyAlNC40eC5cbiIsCisJCQkJCSAgIHBjaV9uYW1lKHBkZXYpLCBwaHksIG1kaW9fcmVhZChkZXYsIHBoeSwgMCksIG1paV9zdGF0dXMpOworCQkJfQorCQl9CisJCWVwLT5taWlfcGh5X2NudCA9IHBoeV9pZHg7CisJCWlmIChwaHlfaWR4ICE9IDApIHsKKwkJCXBoeSA9IGVwLT5waHlzWzBdOworCQkJZXAtPm1paS5hZHZlcnRpc2luZyA9IG1kaW9fcmVhZChkZXYsIHBoeSwgTUlJX0FEVkVSVElTRSk7CisJCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FICIoJXMpOiBBdXRvbmVnb3RpYXRpb24gYWR2ZXJ0aXNpbmcgJTQuNHggbGluayAiCisJCQkJICAgInBhcnRuZXIgJTQuNHguXG4iLAorCQkJCSAgIHBjaV9uYW1lKHBkZXYpLCBlcC0+bWlpLmFkdmVydGlzaW5nLCBtZGlvX3JlYWQoZGV2LCBwaHksIDUpKTsKKwkJfSBlbHNlIGlmICggISAoZXAtPmNoaXBfZmxhZ3MgJiBOT19NSUkpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICIoJXMpOiAqKipXQVJOSU5HKioqOiBObyBNSUkgdHJhbnNjZWl2ZXIgZm91bmQhXG4iLAorCQkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJCS8qIFVzZSB0aGUga25vd24gUEhZIGFkZHJlc3Mgb2YgdGhlIEVQSUkuICovCisJCQllcC0+cGh5c1swXSA9IDM7CisJCX0KKwkJZXAtPm1paS5waHlfaWQgPSBlcC0+cGh5c1swXTsKKwl9CisKKwkvKiBUdXJuIG9mZiB0aGUgTUlJIHhjdnIgKDE3NSBvbmx5ISksIGxlYXZlIHRoZSBjaGlwIGluIGxvdy1wb3dlciBtb2RlLiAqLworCWlmIChlcC0+Y2hpcF9mbGFncyAmIE1JSV9QV1JEV04pCisJCW91dGwoaW5sKGlvYWRkciArIE5WQ1RMKSAmIH4weDQ4M0MsIGlvYWRkciArIE5WQ1RMKTsKKwlvdXRsKDB4MDAwOCwgaW9hZGRyICsgR0VOQ1RMKTsKKworCS8qIFRoZSBsb3dlciBmb3VyIGJpdHMgYXJlIHRoZSBtZWRpYSB0eXBlLiAqLworCWlmIChkdXBsZXgpIHsKKwkJZXAtPm1paS5mb3JjZV9tZWRpYSA9IGVwLT5taWkuZnVsbF9kdXBsZXggPSAxOworCQlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FICIoJXMpOiAgRm9yY2VkIGZ1bGwgZHVwbGV4IG9wZXJhdGlvbiByZXF1ZXN0ZWQuXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCX0KKwlkZXYtPmlmX3BvcnQgPSBlcC0+ZGVmYXVsdF9wb3J0ID0gb3B0aW9uOworCisJLyogVGhlIEVwaWMtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSAmZXBpY19vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmVwaWNfc3RhcnRfeG1pdDsKKwlkZXYtPnN0b3AgPSAmZXBpY19jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9ICZlcGljX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZTsKKwlkZXYtPmRvX2lvY3RsID0gJm5ldGRldl9pb2N0bDsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJm5ldGRldl9ldGh0b29sX29wczsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKwlkZXYtPnR4X3RpbWVvdXQgPSAmZXBpY190eF90aW1lb3V0OworCWRldi0+cG9sbCA9IGVwaWNfcG9sbDsKKwlkZXYtPndlaWdodCA9IDY0OworCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX291dF91bm1hcF9yeDsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBhdCAlI2x4LCBJUlEgJWQsICIsCisJCSAgIGRldi0+bmFtZSwgcGNpX2lkX3RibFtjaGlwX2lkeF0ubmFtZSwgaW9hZGRyLCBkZXYtPmlycSk7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJcHJpbnRrKCIlMi4yeDoiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIiUyLjJ4LlxuIiwgZGV2LT5kZXZfYWRkcltpXSk7CisKK291dDoKKwlyZXR1cm4gcmV0OworCitlcnJfb3V0X3VubWFwX3J4OgorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgZXAtPnJ4X3JpbmcsIGVwLT5yeF9yaW5nX2RtYSk7CitlcnJfb3V0X3VubWFwX3R4OgorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgZXAtPnR4X3JpbmcsIGVwLT50eF9yaW5nX2RtYSk7CitlcnJfb3V0X2lvdW5tYXA6CisjaWZuZGVmIFVTRV9JT19PUFMKKwlpb3VubWFwKGlvYWRkcik7CitlcnJfb3V0X2ZyZWVfbmV0ZGV2OgorI2VuZGlmCisJZnJlZV9uZXRkZXYoZGV2KTsKK2Vycl9vdXRfZnJlZV9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXRfZGlzYWJsZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJZ290byBvdXQ7Cit9CisMCisvKiBTZXJpYWwgRUVQUk9NIHNlY3Rpb24uICovCisKKy8qICBFRVBST01fQ3RybCBiaXRzLiAqLworI2RlZmluZSBFRV9TSElGVF9DTEsJMHgwNAkvKiBFRVBST00gc2hpZnQgY2xvY2suICovCisjZGVmaW5lIEVFX0NTCQkJMHgwMgkvKiBFRVBST00gY2hpcCBzZWxlY3QuICovCisjZGVmaW5lIEVFX0RBVEFfV1JJVEUJMHgwOAkvKiBFRVBST00gY2hpcCBkYXRhIGluLiAqLworI2RlZmluZSBFRV9XUklURV8wCQkweDAxCisjZGVmaW5lIEVFX1dSSVRFXzEJCTB4MDkKKyNkZWZpbmUgRUVfREFUQV9SRUFECTB4MTAJLyogRUVQUk9NIGNoaXAgZGF0YSBvdXQuICovCisjZGVmaW5lIEVFX0VOQgkJCSgweDAwMDEgfCBFRV9DUykKKworLyogRGVsYXkgYmV0d2VlbiBFRVBST00gY2xvY2sgdHJhbnNpdGlvbnMuCisgICBUaGlzIHNlcnZlcyB0byBmbHVzaCB0aGUgb3BlcmF0aW9uIHRvIHRoZSBQQ0kgYnVzLgorICovCisKKyNkZWZpbmUgZWVwcm9tX2RlbGF5KCkJaW5sKGVlX2FkZHIpCisKKy8qIFRoZSBFRVBST00gY29tbWFuZHMgaW5jbHVkZSB0aGUgYWx3YXktc2V0IGxlYWRpbmcgYml0LiAqLworI2RlZmluZSBFRV9XUklURV9DTUQJKDUgPDwgNikKKyNkZWZpbmUgRUVfUkVBRDY0X0NNRAkoNiA8PCA2KQorI2RlZmluZSBFRV9SRUFEMjU2X0NNRAkoNiA8PCA4KQorI2RlZmluZSBFRV9FUkFTRV9DTUQJKDcgPDwgNikKKworc3RhdGljIHZvaWQgZXBpY19kaXNhYmxlX2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXBpY19wcml2YXRlICplcCkKK3sKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJb3V0bCgweDAwMDAwMDAwLCBpb2FkZHIgKyBJTlRNQVNLKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fZXBpY19wY2lfY29tbWl0KGxvbmcgaW9hZGRyKQoreworI2lmbmRlZiBVU0VfSU9fT1BTCisJaW5sKGlvYWRkciArIElOVE1BU0spOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlcGljX25hcGlfaXJxX29mZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGVwaWNfcHJpdmF0ZSAqZXApCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW91dGwoZXAtPmlycV9tYXNrICYgfkVwaWNOYXBpRXZlbnQsIGlvYWRkciArIElOVE1BU0spOworCV9fZXBpY19wY2lfY29tbWl0KGlvYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlcGljX25hcGlfaXJxX29uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBlcGljX3ByaXZhdGUgKmVwKQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwkvKiBObyBuZWVkIHRvIGNvbW1pdCBwb3NzaWJsZSBwb3N0ZWQgd3JpdGUgKi8KKwlvdXRsKGVwLT5pcnFfbWFzayB8IEVwaWNOYXBpRXZlbnQsIGlvYWRkciArIElOVE1BU0spOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCByZWFkX2VlcHJvbShsb25nIGlvYWRkciwgaW50IGxvY2F0aW9uKQoreworCWludCBpOworCWludCByZXR2YWwgPSAwOworCWxvbmcgZWVfYWRkciA9IGlvYWRkciArIEVFQ1RMOworCWludCByZWFkX2NtZCA9IGxvY2F0aW9uIHwKKwkJKGlubChlZV9hZGRyKSAmIDB4NDAgPyBFRV9SRUFENjRfQ01EIDogRUVfUkVBRDI1Nl9DTUQpOworCisJb3V0bChFRV9FTkIgJiB+RUVfQ1MsIGVlX2FkZHIpOworCW91dGwoRUVfRU5CLCBlZV9hZGRyKTsKKworCS8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gMTI7IGkgPj0gMDsgaS0tKSB7CisJCXNob3J0IGRhdGF2YWwgPSAocmVhZF9jbWQgJiAoMSA8PCBpKSkgPyBFRV9XUklURV8xIDogRUVfV1JJVEVfMDsKKwkJb3V0bChFRV9FTkIgfCBkYXRhdmFsLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJCW91dGwoRUVfRU5CIHwgZGF0YXZhbCB8IEVFX1NISUZUX0NMSywgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheSgpOworCX0KKwlvdXRsKEVFX0VOQiwgZWVfYWRkcik7CisKKwlmb3IgKGkgPSAxNjsgaSA+IDA7IGktLSkgeworCQlvdXRsKEVFX0VOQiB8IEVFX1NISUZUX0NMSywgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheSgpOworCQlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpbmwoZWVfYWRkcikgJiBFRV9EQVRBX1JFQUQpID8gMSA6IDApOworCQlvdXRsKEVFX0VOQiwgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheSgpOworCX0KKworCS8qIFRlcm1pbmF0ZSB0aGUgRUVQUk9NIGFjY2Vzcy4gKi8KKwlvdXRsKEVFX0VOQiAmIH5FRV9DUywgZWVfYWRkcik7CisJcmV0dXJuIHJldHZhbDsKK30KKworI2RlZmluZSBNSUlfUkVBRE9QCQkxCisjZGVmaW5lIE1JSV9XUklURU9QCQkyCitzdGF0aWMgaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgcmVhZF9jbWQgPSAocGh5X2lkIDw8IDkpIHwgKGxvY2F0aW9uIDw8IDQpIHwgTUlJX1JFQURPUDsKKwlpbnQgaTsKKworCW91dGwocmVhZF9jbWQsIGlvYWRkciArIE1JSUN0cmwpOworCS8qIFR5cGljYWwgb3BlcmF0aW9uIHRha2VzIDI1IGxvb3BzLiAqLworCWZvciAoaSA9IDQwMDsgaSA+IDA7IGktLSkgeworCQliYXJyaWVyKCk7CisJCWlmICgoaW5sKGlvYWRkciArIE1JSUN0cmwpICYgTUlJX1JFQURPUCkgPT0gMCkgeworCQkJLyogV29yayBhcm91bmQgcmVhZCBmYWlsdXJlIGJ1Zy4gKi8KKwkJCWlmIChwaHlfaWQgPT0gMSAmJiBsb2NhdGlvbiA8IDYKKwkJCQkmJiBpbncoaW9hZGRyICsgTUlJRGF0YSkgPT0gMHhmZmZmKSB7CisJCQkJb3V0bChyZWFkX2NtZCwgaW9hZGRyICsgTUlJQ3RybCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlyZXR1cm4gaW53KGlvYWRkciArIE1JSURhdGEpOworCQl9CisJfQorCXJldHVybiAweGZmZmY7Cit9CisKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvYywgaW50IHZhbHVlKQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGk7CisKKwlvdXR3KHZhbHVlLCBpb2FkZHIgKyBNSUlEYXRhKTsKKwlvdXRsKChwaHlfaWQgPDwgOSkgfCAobG9jIDw8IDQpIHwgTUlJX1dSSVRFT1AsIGlvYWRkciArIE1JSUN0cmwpOworCWZvciAoaSA9IDEwMDAwOyBpID4gMDsgaS0tKSB7IAorCQliYXJyaWVyKCk7CisJCWlmICgoaW5sKGlvYWRkciArIE1JSUN0cmwpICYgTUlJX1dSSVRFT1ApID09IDApCisJCQlicmVhazsKKwl9CisJcmV0dXJuOworfQorCisMCitzdGF0aWMgaW50IGVwaWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlcGljX3ByaXZhdGUgKmVwID0gZGV2LT5wcml2OworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGk7CisJaW50IHJldHZhbDsKKworCS8qIFNvZnQgcmVzZXQgdGhlIGNoaXAuICovCisJb3V0bCgweDQwMDEsIGlvYWRkciArIEdFTkNUTCk7CisKKwlpZiAoKHJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmZXBpY19pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldikpKQorCQlyZXR1cm4gcmV0dmFsOworCisJZXBpY19pbml0X3JpbmcoZGV2KTsKKworCW91dGwoMHg0MDAwLCBpb2FkZHIgKyBHRU5DVEwpOworCS8qIFRoaXMgbWFnaWMgaXMgZG9jdW1lbnRlZCBpbiBTTVNDIGFwcCBub3RlIDcuMTUgKi8KKwlmb3IgKGkgPSAxNjsgaSA+IDA7IGktLSkKKwkJb3V0bCgweDAwMDgsIGlvYWRkciArIFRFU1QxKTsKKworCS8qIFB1bGwgdGhlIGNoaXAgb3V0IG9mIGxvdy1wb3dlciBtb2RlLCBlbmFibGUgaW50ZXJydXB0cywgYW5kIHNldCBmb3IKKwkgICBQQ0kgcmVhZCBtdWx0aXBsZS4gIFRoZSBNSUljZmcgc2V0dGluZyBhbmQgc3RyYW5nZSB3cml0ZSBvcmRlciBhcmUKKwkgICByZXF1aXJlZCBieSB0aGUgZGV0YWlscyBvZiB3aGljaCBiaXRzIGFyZSByZXNldCBhbmQgdGhlIHRyYW5zY2VpdmVyCisJICAgd2lyaW5nIG9uIHRoZSBPc2l0ZWNoIENhcmRCdXMgY2FyZC4KKwkqLworI2lmIDAKKwlvdXRsKGRldi0+aWZfcG9ydCA9PSAxID8gMHgxMyA6IDB4MTIsIGlvYWRkciArIE1JSUNmZyk7CisjZW5kaWYKKwlpZiAoZXAtPmNoaXBfZmxhZ3MgJiBNSUlfUFdSRFdOKQorCQlvdXRsKChpbmwoaW9hZGRyICsgTlZDVEwpICYgfjB4MDAzQykgfCAweDQ4MDAsIGlvYWRkciArIE5WQ1RMKTsKKworI2lmIGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX19zcGFyY19fKQkJLyogQmlnIGVuZGlhbiAqLworCW91dGwoMHg0NDMyIHwgKFJYX0ZJRk9fVEhSRVNIPDw4KSwgaW9hZGRyICsgR0VOQ1RMKTsKKwlpbmwoaW9hZGRyICsgR0VOQ1RMKTsKKwlvdXRsKDB4MDQzMiB8IChSWF9GSUZPX1RIUkVTSDw8OCksIGlvYWRkciArIEdFTkNUTCk7CisjZWxzZQorCW91dGwoMHg0NDEyIHwgKFJYX0ZJRk9fVEhSRVNIPDw4KSwgaW9hZGRyICsgR0VOQ1RMKTsKKwlpbmwoaW9hZGRyICsgR0VOQ1RMKTsKKwlvdXRsKDB4MDQxMiB8IChSWF9GSUZPX1RIUkVTSDw8OCksIGlvYWRkciArIEdFTkNUTCk7CisjZW5kaWYKKworCXVkZWxheSgyMCk7IC8qIExvb2tzIGxpa2UgRVBJSSBuZWVkcyB0aGF0IGlmIHlvdSB3YW50IHJlbGlhYmxlIFJYIGluaXQuIEZJWE1FOiBwY2kgcG9zdGluZyBidWc/ICovCisJCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJb3V0bChjcHVfdG9fbGUxNigoKHUxNiopZGV2LT5kZXZfYWRkcilbaV0pLCBpb2FkZHIgKyBMQU4wICsgaSo0KTsKKworCWVwLT50eF90aHJlc2hvbGQgPSBUWF9GSUZPX1RIUkVTSDsKKwlvdXRsKGVwLT50eF90aHJlc2hvbGQsIGlvYWRkciArIFR4VGhyZXNoKTsKKworCWlmIChtZWRpYTJtaWljdGxbZGV2LT5pZl9wb3J0ICYgMTVdKSB7CisJCWlmIChlcC0+bWlpX3BoeV9jbnQpCisJCQltZGlvX3dyaXRlKGRldiwgZXAtPnBoeXNbMF0sIE1JSV9CTUNSLCBtZWRpYTJtaWljdGxbZGV2LT5pZl9wb3J0JjE1XSk7CisJCWlmIChkZXYtPmlmX3BvcnQgPT0gMSkgeworCQkJaWYgKGRlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogVXNpbmcgdGhlIDEwYmFzZTIgdHJhbnNjZWl2ZXIsIE1JSSAiCisJCQkJCSAgICJzdGF0dXMgJTQuNHguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIG1kaW9fcmVhZChkZXYsIGVwLT5waHlzWzBdLCBNSUlfQk1TUikpOworCQl9CisJfSBlbHNlIHsKKwkJaW50IG1paV9scGEgPSBtZGlvX3JlYWQoZGV2LCBlcC0+cGh5c1swXSwgTUlJX0xQQSk7CisJCWlmIChtaWlfbHBhICE9IDB4ZmZmZikgeworCQkJaWYgKChtaWlfbHBhICYgTFBBXzEwMEZVTEwpIHx8IChtaWlfbHBhICYgMHgwMUMwKSA9PSBMUEFfMTBGVUxMKQorCQkJCWVwLT5taWkuZnVsbF9kdXBsZXggPSAxOworCQkJZWxzZSBpZiAoISAobWlpX2xwYSAmIExQQV9MUEFDSykpCisJCQkJbWRpb193cml0ZShkZXYsIGVwLT5waHlzWzBdLCBNSUlfQk1DUiwgQk1DUl9BTkVOQUJMRXxCTUNSX0FOUkVTVEFSVCk7CisJCQlpZiAoZGVidWcgPiAxKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTZXR0aW5nICVzLWR1cGxleCBiYXNlZCBvbiBNSUkgeGN2ciAlZCIKKwkJCQkJICAgIiByZWdpc3RlciByZWFkIG9mICU0LjR4LlxuIiwgZGV2LT5uYW1lLAorCQkJCQkgICBlcC0+bWlpLmZ1bGxfZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiLAorCQkJCQkgICBlcC0+cGh5c1swXSwgbWlpX2xwYSk7CisJCX0KKwl9CisKKwlvdXRsKGVwLT5taWkuZnVsbF9kdXBsZXggPyAweDdGIDogMHg3OSwgaW9hZGRyICsgVHhDdHJsKTsKKwlvdXRsKGVwLT5yeF9yaW5nX2RtYSwgaW9hZGRyICsgUFJ4Q0RBUik7CisJb3V0bChlcC0+dHhfcmluZ19kbWEsIGlvYWRkciArIFBUeENEQVIpOworCisJLyogU3RhcnQgdGhlIGNoaXAncyBSeCBwcm9jZXNzLiAqLworCXNldF9yeF9tb2RlKGRldik7CisJb3V0bChTdGFydFJ4IHwgUnhRdWV1ZWQsIGlvYWRkciArIENPTU1BTkQpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCW91dGwoKGVwLT5jaGlwX2ZsYWdzICYgVFlQRTJfSU5UUiA/IFBDSUJ1c0VycjE3NSA6IFBDSUJ1c0VycjE3MCkKKwkJIHwgQ250RnVsbCB8IFR4VW5kZXJydW4gCisJCSB8IFJ4RXJyb3IgfCBSeEhlYWRlciB8IEVwaWNOYXBpRXZlbnQsIGlvYWRkciArIElOVE1BU0spOworCisJaWYgKGRlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlcGljX29wZW4oKSBpb2FkZHIgJWx4IElSUSAlZCBzdGF0dXMgJTQuNHggIgorCQkJICAgIiVzLWR1cGxleC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGlvYWRkciwgZGV2LT5pcnEsIChpbnQpaW5sKGlvYWRkciArIEdFTkNUTCksCisJCQkgICBlcC0+bWlpLmZ1bGxfZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiKTsKKworCS8qIFNldCB0aGUgdGltZXIgdG8gc3dpdGNoIHRvIGNoZWNrIGZvciBsaW5rIGJlYXQgYW5kIHBlcmhhcHMgc3dpdGNoCisJICAgdG8gYW4gYWx0ZXJuYXRlIG1lZGlhIHR5cGUuICovCisJaW5pdF90aW1lcigmZXAtPnRpbWVyKTsKKwllcC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAzKkhaOworCWVwLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCWVwLT50aW1lci5mdW5jdGlvbiA9ICZlcGljX3RpbWVyOwkJCQkvKiB0aW1lciBoYW5kbGVyICovCisJYWRkX3RpbWVyKCZlcC0+dGltZXIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlc2V0IHRoZSBjaGlwIHRvIHJlY292ZXIgZnJvbSBhIFBDSSB0cmFuc2FjdGlvbiBlcnJvci4KKyAgIFRoaXMgbWF5IG9jY3VyIGF0IGludGVycnVwdCB0aW1lLiAqLworc3RhdGljIHZvaWQgZXBpY19wYXVzZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGVwaWNfcHJpdmF0ZSAqZXAgPSBkZXYtPnByaXY7CisKKwluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCQorCS8qIERpc2FibGUgaW50ZXJydXB0cyBieSBjbGVhcmluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJb3V0bCgweDAwMDAwMDAwLCBpb2FkZHIgKyBJTlRNQVNLKTsKKwkvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IERNQSBwcm9jZXNzZXMuICovCisJb3V0dyhTdG9wUnggfCBTdG9wVHhETUEgfCBTdG9wUnhETUEsIGlvYWRkciArIENPTU1BTkQpOworCisJLyogVXBkYXRlIHRoZSBlcnJvciBjb3VudHMuICovCisJaWYgKGludyhpb2FkZHIgKyBDT01NQU5EKSAhPSAweGZmZmYpIHsKKwkJZXAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gaW5iKGlvYWRkciArIE1QQ05UKTsKKwkJZXAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyArPSBpbmIoaW9hZGRyICsgQUxJQ05UKTsKKwkJZXAtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gaW5iKGlvYWRkciArIENSQ0NOVCk7CisJfQorCisJLyogUmVtb3ZlIHRoZSBwYWNrZXRzIG9uIHRoZSBSeCBxdWV1ZS4gKi8KKwllcGljX3J4KGRldiwgUlhfUklOR19TSVpFKTsKK30KKworc3RhdGljIHZvaWQgZXBpY19yZXN0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZXBpY19wcml2YXRlICplcCA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKworCS8qIFNvZnQgcmVzZXQgdGhlIGNoaXAuICovCisJb3V0bCgweDQwMDEsIGlvYWRkciArIEdFTkNUTCk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlc3RhcnRpbmcgdGhlIEVQSUMgY2hpcCwgUnggJWQvJWQgVHggJWQvJWQuXG4iLAorCQkgICBkZXYtPm5hbWUsIGVwLT5jdXJfcngsIGVwLT5kaXJ0eV9yeCwgZXAtPmRpcnR5X3R4LCBlcC0+Y3VyX3R4KTsKKwl1ZGVsYXkoMSk7CisKKwkvKiBUaGlzIG1hZ2ljIGlzIGRvY3VtZW50ZWQgaW4gU01TQyBhcHAgbm90ZSA3LjE1ICovCisJZm9yIChpID0gMTY7IGkgPiAwOyBpLS0pCisJCW91dGwoMHgwMDA4LCBpb2FkZHIgKyBURVNUMSk7CisKKyNpZiBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9fc3BhcmNfXykJCS8qIEJpZyBlbmRpYW4gKi8KKwlvdXRsKDB4MDQzMiB8IChSWF9GSUZPX1RIUkVTSDw8OCksIGlvYWRkciArIEdFTkNUTCk7CisjZWxzZQorCW91dGwoMHgwNDEyIHwgKFJYX0ZJRk9fVEhSRVNIPDw4KSwgaW9hZGRyICsgR0VOQ1RMKTsKKyNlbmRpZgorCW91dGwoZGV2LT5pZl9wb3J0ID09IDEgPyAweDEzIDogMHgxMiwgaW9hZGRyICsgTUlJQ2ZnKTsKKwlpZiAoZXAtPmNoaXBfZmxhZ3MgJiBNSUlfUFdSRFdOKQorCQlvdXRsKChpbmwoaW9hZGRyICsgTlZDVEwpICYgfjB4MDAzQykgfCAweDQ4MDAsIGlvYWRkciArIE5WQ1RMKTsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCW91dGwoY3B1X3RvX2xlMTYoKCh1MTYqKWRldi0+ZGV2X2FkZHIpW2ldKSwgaW9hZGRyICsgTEFOMCArIGkqNCk7CisKKwllcC0+dHhfdGhyZXNob2xkID0gVFhfRklGT19USFJFU0g7CisJb3V0bChlcC0+dHhfdGhyZXNob2xkLCBpb2FkZHIgKyBUeFRocmVzaCk7CisJb3V0bChlcC0+bWlpLmZ1bGxfZHVwbGV4ID8gMHg3RiA6IDB4NzksIGlvYWRkciArIFR4Q3RybCk7CisJb3V0bChlcC0+cnhfcmluZ19kbWEgKyAoZXAtPmN1cl9yeCVSWF9SSU5HX1NJWkUpKgorCQlzaXplb2Yoc3RydWN0IGVwaWNfcnhfZGVzYyksIGlvYWRkciArIFBSeENEQVIpOworCW91dGwoZXAtPnR4X3JpbmdfZG1hICsgKGVwLT5kaXJ0eV90eCVUWF9SSU5HX1NJWkUpKgorCQkgc2l6ZW9mKHN0cnVjdCBlcGljX3R4X2Rlc2MpLCBpb2FkZHIgKyBQVHhDREFSKTsKKworCS8qIFN0YXJ0IHRoZSBjaGlwJ3MgUnggcHJvY2Vzcy4gKi8KKwlzZXRfcnhfbW9kZShkZXYpOworCW91dGwoU3RhcnRSeCB8IFJ4UXVldWVkLCBpb2FkZHIgKyBDT01NQU5EKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCW91dGwoKGVwLT5jaGlwX2ZsYWdzICYgVFlQRTJfSU5UUiA/IFBDSUJ1c0VycjE3NSA6IFBDSUJ1c0VycjE3MCkKKwkJIHwgQ250RnVsbCB8IFR4VW5kZXJydW4KKwkJIHwgUnhFcnJvciB8IFJ4SGVhZGVyIHwgRXBpY05hcGlFdmVudCwgaW9hZGRyICsgSU5UTUFTSyk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVwaWNfcmVzdGFydCgpIGRvbmUsIGNtZCBzdGF0dXMgJTQuNHgsIGN0bCAlNC40eCIKKwkJICAgIiBpbnRlcnJ1cHQgJTQuNHguXG4iLAorCQkgICBkZXYtPm5hbWUsIChpbnQpaW5sKGlvYWRkciArIENPTU1BTkQpLCAoaW50KWlubChpb2FkZHIgKyBHRU5DVEwpLAorCQkgICAoaW50KWlubChpb2FkZHIgKyBJTlRTVEFUKSk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjaGVja19tZWRpYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlcGljX3ByaXZhdGUgKmVwID0gZGV2LT5wcml2OworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IG1paV9scGEgPSBlcC0+bWlpX3BoeV9jbnQgPyBtZGlvX3JlYWQoZGV2LCBlcC0+cGh5c1swXSwgTUlJX0xQQSkgOiAwOworCWludCBuZWdvdGlhdGVkID0gbWlpX2xwYSAmIGVwLT5taWkuYWR2ZXJ0aXNpbmc7CisJaW50IGR1cGxleCA9IChuZWdvdGlhdGVkICYgMHgwMTAwKSB8fCAobmVnb3RpYXRlZCAmIDB4MDFDMCkgPT0gMHgwMDQwOworCisJaWYgKGVwLT5taWkuZm9yY2VfbWVkaWEpCisJCXJldHVybjsKKwlpZiAobWlpX2xwYSA9PSAweGZmZmYpCQkvKiBCb2d1cyByZWFkICovCisJCXJldHVybjsKKwlpZiAoZXAtPm1paS5mdWxsX2R1cGxleCAhPSBkdXBsZXgpIHsKKwkJZXAtPm1paS5mdWxsX2R1cGxleCA9IGR1cGxleDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNldHRpbmcgJXMtZHVwbGV4IGJhc2VkIG9uIE1JSSAjJWQgbGluayIKKwkJCSAgICIgcGFydG5lciBjYXBhYmlsaXR5IG9mICU0LjR4LlxuIiwgZGV2LT5uYW1lLAorCQkJICAgZXAtPm1paS5mdWxsX2R1cGxleCA/ICJmdWxsIiA6ICJoYWxmIiwgZXAtPnBoeXNbMF0sIG1paV9scGEpOworCQlvdXRsKGVwLT5taWkuZnVsbF9kdXBsZXggPyAweDdGIDogMHg3OSwgaW9hZGRyICsgVHhDdHJsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVwaWNfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBlcGljX3ByaXZhdGUgKmVwID0gZGV2LT5wcml2OworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IG5leHRfdGljayA9IDUqSFo7CisKKwlpZiAoZGVidWcgPiAzKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogTWVkaWEgbW9uaXRvciB0aWNrLCBUeCBzdGF0dXMgJTguOHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCAoaW50KWlubChpb2FkZHIgKyBUeFNUQVQpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBPdGhlciByZWdpc3RlcnMgYXJlIEludE1hc2sgJTQuNHggIgorCQkJICAgIkludFN0YXR1cyAlNC40eCBSeFN0YXR1cyAlNC40eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIChpbnQpaW5sKGlvYWRkciArIElOVE1BU0spLAorCQkJICAgKGludClpbmwoaW9hZGRyICsgSU5UU1RBVCksIChpbnQpaW5sKGlvYWRkciArIFJ4U1RBVCkpOworCX0KKworCWNoZWNrX21lZGlhKGRldik7CisKKwllcC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBuZXh0X3RpY2s7CisJYWRkX3RpbWVyKCZlcC0+dGltZXIpOworfQorCitzdGF0aWMgdm9pZCBlcGljX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXBpY19wcml2YXRlICplcCA9IGRldi0+cHJpdjsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKGRlYnVnID4gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHJhbnNtaXQgdGltZW91dCB1c2luZyBNSUkgZGV2aWNlLCAiCisJCQkgICAiVHggc3RhdHVzICU0LjR4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgKGludClpbncoaW9hZGRyICsgVHhTVEFUKSk7CisJCWlmIChkZWJ1ZyA+IDEpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHggaW5kaWNlczogZGlydHlfdHggJWQsIGN1cl90eCAlZC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBlcC0+ZGlydHlfdHgsIGVwLT5jdXJfdHgpOworCQl9CisJfQorCWlmIChpbncoaW9hZGRyICsgVHhTVEFUKSAmIDB4MTApIHsJCS8qIFR4IEZJRk8gdW5kZXJmbG93LiAqLworCQllcC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJb3V0bChSZXN0YXJ0VHgsIGlvYWRkciArIENPTU1BTkQpOworCX0gZWxzZSB7CisJCWVwaWNfcmVzdGFydChkZXYpOworCQlvdXRsKFR4UXVldWVkLCBkZXYtPmJhc2VfYWRkciArIENPTU1BTkQpOworCX0KKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCWVwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwlpZiAoIWVwLT50eF9mdWxsKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIFJ4IGFuZCBUeCByaW5ncywgYWxvbmcgd2l0aCB2YXJpb3VzICdkZXYnIGJpdHMuICovCitzdGF0aWMgdm9pZCBlcGljX2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlcGljX3ByaXZhdGUgKmVwID0gZGV2LT5wcml2OworCWludCBpOworCisJZXAtPnR4X2Z1bGwgPSAwOworCWVwLT5kaXJ0eV90eCA9IGVwLT5jdXJfdHggPSAwOworCWVwLT5jdXJfcnggPSBlcC0+ZGlydHlfcnggPSAwOworCWVwLT5yeF9idWZfc3ogPSAoZGV2LT5tdHUgPD0gMTUwMCA/IFBLVF9CVUZfU1ogOiBkZXYtPm10dSArIDMyKTsKKworCS8qIEluaXRpYWxpemUgYWxsIFJ4IGRlc2NyaXB0b3JzLiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQllcC0+cnhfcmluZ1tpXS5yeHN0YXR1cyA9IDA7CisJCWVwLT5yeF9yaW5nW2ldLmJ1Zmxlbmd0aCA9IGNwdV90b19sZTMyKGVwLT5yeF9idWZfc3opOworCQllcC0+cnhfcmluZ1tpXS5uZXh0ID0gZXAtPnJ4X3JpbmdfZG1hICsgCisJCQkJICAgICAgKGkrMSkqc2l6ZW9mKHN0cnVjdCBlcGljX3J4X2Rlc2MpOworCQllcC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwl9CisJLyogTWFyayB0aGUgbGFzdCBlbnRyeSBhcyB3cmFwcGluZyB0aGUgcmluZy4gKi8KKwllcC0+cnhfcmluZ1tpLTFdLm5leHQgPSBlcC0+cnhfcmluZ19kbWE7CisKKwkvKiBGaWxsIGluIHRoZSBSeCBidWZmZXJzLiAgSGFuZGxlIGFsbG9jYXRpb24gZmFpbHVyZSBncmFjZWZ1bGx5LiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYihlcC0+cnhfYnVmX3N6KTsKKwkJZXAtPnJ4X3NrYnVmZltpXSA9IHNrYjsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJYnJlYWs7CisJCXNrYi0+ZGV2ID0gZGV2OwkJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKwkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyLiAqLworCQllcC0+cnhfcmluZ1tpXS5idWZhZGRyID0gcGNpX21hcF9zaW5nbGUoZXAtPnBjaV9kZXYsIAorCQkJc2tiLT50YWlsLCBlcC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQllcC0+cnhfcmluZ1tpXS5yeHN0YXR1cyA9IGNwdV90b19sZTMyKERlc2NPd24pOworCX0KKwllcC0+ZGlydHlfcnggPSAodW5zaWduZWQgaW50KShpIC0gUlhfUklOR19TSVpFKTsKKworCS8qIFRoZSBUeCBidWZmZXIgZGVzY3JpcHRvciBpcyBmaWxsZWQgaW4gYXMgbmVlZGVkLCBidXQgd2UKKwkgICBkbyBuZWVkIHRvIGNsZWFyIHRoZSBvd25lcnNoaXAgYml0LiAqLworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQllcC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJZXAtPnR4X3JpbmdbaV0udHhzdGF0dXMgPSAweDAwMDA7CisJCWVwLT50eF9yaW5nW2ldLm5leHQgPSBlcC0+dHhfcmluZ19kbWEgKyAKKwkJCShpKzEpKnNpemVvZihzdHJ1Y3QgZXBpY190eF9kZXNjKTsKKwl9CisJZXAtPnR4X3JpbmdbaS0xXS5uZXh0ID0gZXAtPnR4X3JpbmdfZG1hOworCXJldHVybjsKK30KKworc3RhdGljIGludCBlcGljX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXBpY19wcml2YXRlICplcCA9IGRldi0+cHJpdjsKKwlpbnQgZW50cnksIGZyZWVfY291bnQ7CisJdTMyIGN0cmxfd29yZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmIChza2ItPmxlbiA8IEVUSF9aTEVOKSB7CisJCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyogQ2F1dGlvbjogdGhlIHdyaXRlIG9yZGVyIGlzIGltcG9ydGFudCBoZXJlLCBzZXQgdGhlIGZpZWxkIHdpdGggdGhlCisJICAgIm93bmVyc2hpcCIgYml0IGxhc3QuICovCisKKwkvKiBDYWxjdWxhdGUgdGhlIG5leHQgVHggZGVzY3JpcHRvciBlbnRyeS4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXAtPmxvY2ssIGZsYWdzKTsKKwlmcmVlX2NvdW50ID0gZXAtPmN1cl90eCAtIGVwLT5kaXJ0eV90eDsKKwllbnRyeSA9IGVwLT5jdXJfdHggJSBUWF9SSU5HX1NJWkU7CisKKwllcC0+dHhfc2tidWZmW2VudHJ5XSA9IHNrYjsKKwllcC0+dHhfcmluZ1tlbnRyeV0uYnVmYWRkciA9IHBjaV9tYXBfc2luZ2xlKGVwLT5wY2lfZGV2LCBza2ItPmRhdGEsIAorCQkgCQkJICAgICAgICAgICAgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCWlmIChmcmVlX2NvdW50IDwgVFhfUVVFVUVfTEVOLzIpIHsvKiBUeXBpY2FsIHBhdGggKi8KKwkJY3RybF93b3JkID0gY3B1X3RvX2xlMzIoMHgxMDAwMDApOyAvKiBObyBpbnRlcnJ1cHQgKi8KKwl9IGVsc2UgaWYgKGZyZWVfY291bnQgPT0gVFhfUVVFVUVfTEVOLzIpIHsKKwkJY3RybF93b3JkID0gY3B1X3RvX2xlMzIoMHgxNDAwMDApOyAvKiBUeC1kb25lIGludHIuICovCisJfSBlbHNlIGlmIChmcmVlX2NvdW50IDwgVFhfUVVFVUVfTEVOIC0gMSkgeworCQljdHJsX3dvcmQgPSBjcHVfdG9fbGUzMigweDEwMDAwMCk7IC8qIE5vIFR4LWRvbmUgaW50ci4gKi8KKwl9IGVsc2UgeworCQkvKiBMZWF2ZSByb29tIGZvciBhbiBhZGRpdGlvbmFsIGVudHJ5LiAqLworCQljdHJsX3dvcmQgPSBjcHVfdG9fbGUzMigweDE0MDAwMCk7IC8qIFR4LWRvbmUgaW50ci4gKi8KKwkJZXAtPnR4X2Z1bGwgPSAxOworCX0KKwllcC0+dHhfcmluZ1tlbnRyeV0uYnVmbGVuZ3RoID0gY3RybF93b3JkIHwgY3B1X3RvX2xlMzIoc2tiLT5sZW4pOworCWVwLT50eF9yaW5nW2VudHJ5XS50eHN0YXR1cyA9CisJCSgoc2tiLT5sZW4gPj0gRVRIX1pMRU4gPyBza2ItPmxlbiA6IEVUSF9aTEVOKSA8PCAxNikKKwkJfCBjcHVfdG9fbGUzMihEZXNjT3duKTsKKworCWVwLT5jdXJfdHgrKzsKKwlpZiAoZXAtPnR4X2Z1bGwpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwLT5sb2NrLCBmbGFncyk7CisJLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgdHJhbnNtaXQgZGVtYW5kLiAqLworCW91dGwoVHhRdWV1ZWQsIGRldi0+YmFzZV9hZGRyICsgQ09NTUFORCk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlpZiAoZGVidWcgPiA0KQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFF1ZXVlZCBUeCBwYWNrZXQgc2l6ZSAlZCB0byBzbG90ICVkLCAiCisJCQkgICAiZmxhZyAlMi4yeCBUeCBzdGF0dXMgJTguOHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCAoaW50KXNrYi0+bGVuLCBlbnRyeSwgY3RybF93b3JkLAorCQkJICAgKGludClpbmwoZGV2LT5iYXNlX2FkZHIgKyBUeFNUQVQpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlcGljX3R4X2Vycm9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlcGljX3ByaXZhdGUgKmVwLAorCQkJICBpbnQgc3RhdHVzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZlcC0+c3RhdHM7CisKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCS8qIFRoZXJlIHdhcyBhbiBtYWpvciBlcnJvciwgbG9nIGl0LiAqLworCWlmIChkZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHJhbnNtaXQgZXJyb3IsIFR4IHN0YXR1cyAlOC44eC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisjZW5kaWYKKwlzdGF0cy0+dHhfZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIDB4MTA1MCkKKwkJc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIDB4MDAwOCkKKwkJc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIDB4MDA0MCkKKwkJc3RhdHMtPnR4X3dpbmRvd19lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgMHgwMDEwKQorCQlzdGF0cy0+dHhfZmlmb19lcnJvcnMrKzsKK30KKworc3RhdGljIHZvaWQgZXBpY190eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXBpY19wcml2YXRlICplcCkKK3sKKwl1bnNpZ25lZCBpbnQgZGlydHlfdHgsIGN1cl90eDsKKworCS8qCisJICogTm90ZTogaWYgdGhpcyBsb2NrIGJlY29tZXMgYSBwcm9ibGVtIHdlIGNhbiBuYXJyb3cgdGhlIGxvY2tlZAorCSAqIHJlZ2lvbiBhdCB0aGUgY29zdCBvZiBvY2Nhc2lvbmFsbHkgZ3JhYmJpbmcgdGhlIGxvY2sgbW9yZSB0aW1lcy4KKwkgKi8KKwljdXJfdHggPSBlcC0+Y3VyX3R4OworCWZvciAoZGlydHlfdHggPSBlcC0+ZGlydHlfdHg7IGN1cl90eCAtIGRpcnR5X3R4ID4gMDsgZGlydHlfdHgrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlpbnQgZW50cnkgPSBkaXJ0eV90eCAlIFRYX1JJTkdfU0laRTsKKwkJaW50IHR4c3RhdHVzID0gbGUzMl90b19jcHUoZXAtPnR4X3JpbmdbZW50cnldLnR4c3RhdHVzKTsKKworCQlpZiAodHhzdGF0dXMgJiBEZXNjT3duKQorCQkJYnJlYWs7CS8qIEl0IHN0aWxsIGhhc24ndCBiZWVuIFR4ZWQgKi8KKworCQlpZiAobGlrZWx5KHR4c3RhdHVzICYgMHgwMDAxKSkgeworCQkJZXAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKHR4c3RhdHVzID4+IDgpICYgMTU7CisJCQllcC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJZXAtPnN0YXRzLnR4X2J5dGVzICs9IGVwLT50eF9za2J1ZmZbZW50cnldLT5sZW47CisJCX0gZWxzZQorCQkJZXBpY190eF9lcnJvcihkZXYsIGVwLCB0eHN0YXR1cyk7CisKKwkJLyogRnJlZSB0aGUgb3JpZ2luYWwgc2tiLiAqLworCQlza2IgPSBlcC0+dHhfc2tidWZmW2VudHJ5XTsKKwkJcGNpX3VubWFwX3NpbmdsZShlcC0+cGNpX2RldiwgZXAtPnR4X3JpbmdbZW50cnldLmJ1ZmFkZHIsIAorCQkJCSBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCWVwLT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwl9CisKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCWlmIChjdXJfdHggLSBkaXJ0eV90eCA+IFRYX1JJTkdfU0laRSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IE91dC1vZi1zeW5jIGRpcnR5IHBvaW50ZXIsICVkIHZzLiAlZCwgZnVsbD0lZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGRpcnR5X3R4LCBjdXJfdHgsIGVwLT50eF9mdWxsKTsKKwkJZGlydHlfdHggKz0gVFhfUklOR19TSVpFOworCX0KKyNlbmRpZgorCWVwLT5kaXJ0eV90eCA9IGRpcnR5X3R4OworCWlmIChlcC0+dHhfZnVsbCAmJiBjdXJfdHggLSBkaXJ0eV90eCA8IFRYX1FVRVVFX0xFTiAtIDQpIHsKKwkJLyogVGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwsIGFsbG93IG5ldyBUWCBlbnRyaWVzLiAqLworCQllcC0+dHhfZnVsbCA9IDA7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9Cit9CisKKy8qIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBkb2VzIGFsbCBvZiB0aGUgUnggdGhyZWFkIHdvcmsgYW5kIGNsZWFucyB1cAorICAgYWZ0ZXIgdGhlIFR4IHRocmVhZC4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBlcGljX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IGVwaWNfcHJpdmF0ZSAqZXAgPSBkZXYtPnByaXY7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlZCA9IDA7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGlubChpb2FkZHIgKyBJTlRTVEFUKTsKKwkvKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMgQVNBUC4gKi8KKwlvdXRsKHN0YXR1cyAmIEVwaWNOb3JtYWxFdmVudCwgaW9hZGRyICsgSU5UU1RBVCk7CisKKwlpZiAoZGVidWcgPiA0KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogSW50ZXJydXB0LCBzdGF0dXM9JSM4Ljh4IG5ldyAiCisJCQkJICAgImludHN0YXQ9JSM4Ljh4LlxuIiwgZGV2LT5uYW1lLCBzdGF0dXMsCisJCQkJICAgKGludClpbmwoaW9hZGRyICsgSU5UU1RBVCkpOworCX0KKworCWlmICgoc3RhdHVzICYgSW50clN1bW1hcnkpID09IDApCisJCWdvdG8gb3V0OworCisJaGFuZGxlZCA9IDE7CisKKwlpZiAoKHN0YXR1cyAmIEVwaWNOYXBpRXZlbnQpICYmICFlcC0+cmVzY2hlZHVsZV9pbl9wb2xsKSB7CisJCXNwaW5fbG9jaygmZXAtPm5hcGlfbG9jayk7CisJCWlmIChuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKGRldikpIHsKKwkJCWVwaWNfbmFwaV9pcnFfb2ZmKGRldiwgZXApOworCQkJX19uZXRpZl9yeF9zY2hlZHVsZShkZXYpOworCQl9IGVsc2UKKwkJCWVwLT5yZXNjaGVkdWxlX2luX3BvbGwrKzsKKwkJc3Bpbl91bmxvY2soJmVwLT5uYXBpX2xvY2spOworCX0KKwlzdGF0dXMgJj0gfkVwaWNOYXBpRXZlbnQ7CisKKwkvKiBDaGVjayB1bmNvbW1vbiBldmVudHMgYWxsIGF0IG9uY2UuICovCisJaWYgKHN0YXR1cyAmIChDbnRGdWxsIHwgVHhVbmRlcnJ1biB8IFBDSUJ1c0VycjE3MCB8IFBDSUJ1c0VycjE3NSkpIHsKKwkJaWYgKHN0YXR1cyA9PSBFcGljUmVtb3ZlZCkKKwkJCWdvdG8gb3V0OworCisJCS8qIEFsd2F5cyB1cGRhdGUgdGhlIGVycm9yIGNvdW50cyB0byBhdm9pZCBvdmVyaGVhZCBsYXRlci4gKi8KKwkJZXAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gaW5iKGlvYWRkciArIE1QQ05UKTsKKwkJZXAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyArPSBpbmIoaW9hZGRyICsgQUxJQ05UKTsKKwkJZXAtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gaW5iKGlvYWRkciArIENSQ0NOVCk7CisKKwkJaWYgKHN0YXR1cyAmIFR4VW5kZXJydW4pIHsgLyogVHggRklGTyB1bmRlcmZsb3cuICovCisJCQllcC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCW91dGwoZXAtPnR4X3RocmVzaG9sZCArPSAxMjgsIGlvYWRkciArIFR4VGhyZXNoKTsKKwkJCS8qIFJlc3RhcnQgdGhlIHRyYW5zbWl0IHByb2Nlc3MuICovCisJCQlvdXRsKFJlc3RhcnRUeCwgaW9hZGRyICsgQ09NTUFORCk7CisJCX0KKwkJaWYgKHN0YXR1cyAmIFBDSUJ1c0VycjE3MCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUENJIEJ1cyBFcnJvciEgc3RhdHVzICU0LjR4LlxuIiwKKwkJCQkJIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCWVwaWNfcGF1c2UoZGV2KTsKKwkJCWVwaWNfcmVzdGFydChkZXYpOworCQl9CisJCS8qIENsZWFyIGFsbCBlcnJvciBzb3VyY2VzLiAqLworCQlvdXRsKHN0YXR1cyAmIDB4N2YxOCwgaW9hZGRyICsgSU5UU1RBVCk7CisJfQorCitvdXQ6CisJaWYgKGRlYnVnID4gMykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4aXQgaW50ZXJydXB0LCBpbnRyX3N0YXR1cz0lIzQuNHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKwl9CisKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIGludCBlcGljX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWRnZXQpCit7CisJc3RydWN0IGVwaWNfcHJpdmF0ZSAqZXAgPSBkZXYtPnByaXY7CisJaW50IGVudHJ5ID0gZXAtPmN1cl9yeCAlIFJYX1JJTkdfU0laRTsKKwlpbnQgcnhfd29ya19saW1pdCA9IGVwLT5kaXJ0eV9yeCArIFJYX1JJTkdfU0laRSAtIGVwLT5jdXJfcng7CisJaW50IHdvcmtfZG9uZSA9IDA7CisKKwlpZiAoZGVidWcgPiA0KQorCQlwcmludGsoS0VSTl9ERUJVRyAiIEluIGVwaWNfcngoKSwgZW50cnkgJWQgJTguOHguXG4iLCBlbnRyeSwKKwkJCSAgIGVwLT5yeF9yaW5nW2VudHJ5XS5yeHN0YXR1cyk7CisKKwlpZiAocnhfd29ya19saW1pdCA+IGJ1ZGdldCkKKwkJcnhfd29ya19saW1pdCA9IGJ1ZGdldDsKKworCS8qIElmIHdlIG93biB0aGUgbmV4dCBlbnRyeSwgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCisJd2hpbGUgKChlcC0+cnhfcmluZ1tlbnRyeV0ucnhzdGF0dXMgJiBjcHVfdG9fbGUzMihEZXNjT3duKSkgPT0gMCkgeworCQlpbnQgc3RhdHVzID0gbGUzMl90b19jcHUoZXAtPnJ4X3JpbmdbZW50cnldLnJ4c3RhdHVzKTsKKworCQlpZiAoZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgZXBpY19yeCgpIHN0YXR1cyB3YXMgJTguOHguXG4iLCBzdGF0dXMpOworCQlpZiAoLS1yeF93b3JrX2xpbWl0IDwgMCkKKwkJCWJyZWFrOworCQlpZiAoc3RhdHVzICYgMHgyMDA2KSB7CisJCQlpZiAoZGVidWcgPiAyKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXBpY19yeCgpIGVycm9yIHN0YXR1cyB3YXMgJTguOHguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCQlpZiAoc3RhdHVzICYgMHgyMDAwKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE92ZXJzaXplZCBFdGhlcm5ldCBmcmFtZSBzcGFubmVkICIKKwkJCQkJICAgIm11bHRpcGxlIGJ1ZmZlcnMsIHN0YXR1cyAlNC40eCFcbiIsIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCQllcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJfSBlbHNlIGlmIChzdGF0dXMgJiAweDAwMDYpCisJCQkJLyogUnggRnJhbWUgZXJyb3JzIGFyZSBjb3VudGVkIGluIGhhcmR3YXJlLiAqLworCQkJCWVwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJfSBlbHNlIHsKKwkJCS8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLCBjb21wYXRpYmxlIHdpdGggbmV0LTJlLiAqLworCQkJLyogT21pdCB0aGUgZm91ciBvY3RldCBDUkMgZnJvbSB0aGUgbGVuZ3RoLiAqLworCQkJc2hvcnQgcGt0X2xlbiA9IChzdGF0dXMgPj4gMTYpIC0gNDsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCWlmIChwa3RfbGVuID4gUEtUX0JVRl9TWiAtIDQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdmVyc2l6ZWQgRXRoZXJuZXQgZnJhbWUsIHN0YXR1cyAleCAiCisJCQkJCSAgICIlZCBieXRlcy5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgc3RhdHVzLCBwa3RfbGVuKTsKKwkJCQlwa3RfbGVuID0gMTUxNDsKKwkJCX0KKwkJCS8qIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgbG9uZyBlbm91Z2ggdG8gYWNjZXB0IHdpdGhvdXQgY29weWluZworCQkJICAgdG8gYSBtaW5pbWFsbHktc2l6ZWQgc2tidWZmLiAqLworCQkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsKKwkJCQkmJiAoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMikpICE9IE5VTEwpIHsKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KKwkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZXAtPnBjaV9kZXYsCisJCQkJCQkJICAgIGVwLT5yeF9yaW5nW2VudHJ5XS5idWZhZGRyLAorCQkJCQkJCSAgICBlcC0+cnhfYnVmX3N6LAorCQkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBlcC0+cnhfc2tidWZmW2VudHJ5XS0+dGFpbCwgcGt0X2xlbiwgMCk7CisJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShlcC0+cGNpX2RldiwKKwkJCQkJCQkgICAgICAgZXAtPnJ4X3JpbmdbZW50cnldLmJ1ZmFkZHIsCisJCQkJCQkJICAgICAgIGVwLT5yeF9idWZfc3osCisJCQkJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQl9IGVsc2UgeworCQkJCXBjaV91bm1hcF9zaW5nbGUoZXAtPnBjaV9kZXYsIAorCQkJCQllcC0+cnhfcmluZ1tlbnRyeV0uYnVmYWRkciwgCisJCQkJCWVwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJc2tiX3B1dChza2IgPSBlcC0+cnhfc2tidWZmW2VudHJ5XSwgcGt0X2xlbik7CisJCQkJZXAtPnJ4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJfQorCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJZXAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCWVwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQl9CisJCXdvcmtfZG9uZSsrOworCQllbnRyeSA9ICgrK2VwLT5jdXJfcngpICUgUlhfUklOR19TSVpFOworCX0KKworCS8qIFJlZmlsbCB0aGUgUnggcmluZyBidWZmZXJzLiAqLworCWZvciAoOyBlcC0+Y3VyX3J4IC0gZXAtPmRpcnR5X3J4ID4gMDsgZXAtPmRpcnR5X3J4KyspIHsKKwkJZW50cnkgPSBlcC0+ZGlydHlfcnggJSBSWF9SSU5HX1NJWkU7CisJCWlmIChlcC0+cnhfc2tidWZmW2VudHJ5XSA9PSBOVUxMKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJc2tiID0gZXAtPnJ4X3NrYnVmZltlbnRyeV0gPSBkZXZfYWxsb2Nfc2tiKGVwLT5yeF9idWZfc3opOworCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJCWJyZWFrOworCQkJc2tiLT5kZXYgPSBkZXY7CQkJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLworCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCisJCQllcC0+cnhfcmluZ1tlbnRyeV0uYnVmYWRkciA9IHBjaV9tYXBfc2luZ2xlKGVwLT5wY2lfZGV2LCAKKwkJCQlza2ItPnRhaWwsIGVwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQl3b3JrX2RvbmUrKzsKKwkJfQorCQllcC0+cnhfcmluZ1tlbnRyeV0ucnhzdGF0dXMgPSBjcHVfdG9fbGUzMihEZXNjT3duKTsKKwl9CisJcmV0dXJuIHdvcmtfZG9uZTsKK30KKworc3RhdGljIHZvaWQgZXBpY19yeF9lcnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGVwaWNfcHJpdmF0ZSAqZXApCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaW5sKGlvYWRkciArIElOVFNUQVQpOworCisJaWYgKHN0YXR1cyA9PSBFcGljUmVtb3ZlZCkKKwkJcmV0dXJuOworCWlmIChzdGF0dXMgJiBSeE92ZXJmbG93KSAJLyogTWlzc2VkIGEgUnggZnJhbWUuICovCisJCWVwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgKFJ4T3ZlcmZsb3cgfCBSeEZ1bGwpKQorCQlvdXR3KFJ4UXVldWVkLCBpb2FkZHIgKyBDT01NQU5EKTsKK30KKworc3RhdGljIGludCBlcGljX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpCit7CisJc3RydWN0IGVwaWNfcHJpdmF0ZSAqZXAgPSBkZXYtPnByaXY7CisJaW50IHdvcmtfZG9uZSwgb3JpZ19idWRnZXQ7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW9yaWdfYnVkZ2V0ID0gKCpidWRnZXQgPiBkZXYtPnF1b3RhKSA/IGRldi0+cXVvdGEgOiAqYnVkZ2V0OworCityeF9hY3Rpb246CisKKwllcGljX3R4KGRldiwgZXApOworCisJd29ya19kb25lID0gZXBpY19yeChkZXYsICpidWRnZXQpOworCisJZXBpY19yeF9lcnIoZGV2LCBlcCk7CisKKwkqYnVkZ2V0IC09IHdvcmtfZG9uZTsKKwlkZXYtPnF1b3RhIC09IHdvcmtfZG9uZTsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikgJiYgKHdvcmtfZG9uZSA8IG9yaWdfYnVkZ2V0KSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlpbnQgbW9yZTsKKworCQkvKiBBIGJpdCBiYXJvcXVlIGJ1dCBpdCBhdm9pZHMgYSAoc3BhY2UgaHVuZ3J5KSBzcGluX3VubG9jayAqLworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZlcC0+bmFwaV9sb2NrLCBmbGFncyk7CisKKwkJbW9yZSA9IGVwLT5yZXNjaGVkdWxlX2luX3BvbGw7CisJCWlmICghbW9yZSkgeworCQkJX19uZXRpZl9yeF9jb21wbGV0ZShkZXYpOworCQkJb3V0bChFcGljTmFwaUV2ZW50LCBpb2FkZHIgKyBJTlRTVEFUKTsKKwkJCWVwaWNfbmFwaV9pcnFfb24oZGV2LCBlcCk7CisJCX0gZWxzZQorCQkJZXAtPnJlc2NoZWR1bGVfaW5fcG9sbC0tOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwLT5uYXBpX2xvY2ssIGZsYWdzKTsKKworCQlpZiAobW9yZSkKKwkJCWdvdG8gcnhfYWN0aW9uOworCX0KKworCXJldHVybiAod29ya19kb25lID49IG9yaWdfYnVkZ2V0KTsKK30KKworc3RhdGljIGludCBlcGljX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZXBpY19wcml2YXRlICplcCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKGRlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZCwgc3RhdHVzIHdhcyAlMi4yeC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIChpbnQpaW5sKGlvYWRkciArIElOVFNUQVQpKTsKKworCWRlbF90aW1lcl9zeW5jKCZlcC0+dGltZXIpOworCisJZXBpY19kaXNhYmxlX2ludChkZXYsIGVwKTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJZXBpY19wYXVzZShkZXYpOworCisJLyogRnJlZSBhbGwgdGhlIHNrYnVmZnMgaW4gdGhlIFJ4IHF1ZXVlLiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlza2IgPSBlcC0+cnhfc2tidWZmW2ldOworCQllcC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwkJZXAtPnJ4X3JpbmdbaV0ucnhzdGF0dXMgPSAwOwkJLyogTm90IG93bmVkIGJ5IEVwaWMgY2hpcC4gKi8KKwkJZXAtPnJ4X3JpbmdbaV0uYnVmbGVuZ3RoID0gMDsKKwkJaWYgKHNrYikgeworCQkJcGNpX3VubWFwX3NpbmdsZShlcC0+cGNpX2RldiwgZXAtPnJ4X3JpbmdbaV0uYnVmYWRkciwgCisJCQkJIAkgZXAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJfQorCQllcC0+cnhfcmluZ1tpXS5idWZhZGRyID0gMHhCQURGMDBEMDsgLyogQW4gaW52YWxpZCBhZGRyZXNzLiAqLworCX0KKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJc2tiID0gZXAtPnR4X3NrYnVmZltpXTsKKwkJZXAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCWlmICghc2tiKQorCQkJY29udGludWU7CisJCXBjaV91bm1hcF9zaW5nbGUoZXAtPnBjaV9kZXYsIGVwLT50eF9yaW5nW2ldLmJ1ZmFkZHIsIAorCQkJCSBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9CisKKwkvKiBHcmVlbiEgTGVhdmUgdGhlIGNoaXAgaW4gbG93LXBvd2VyIG1vZGUuICovCisJb3V0bCgweDAwMDgsIGlvYWRkciArIEdFTkNUTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICplcGljX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlcGljX3ByaXZhdGUgKmVwID0gZGV2LT5wcml2OworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCS8qIFVwZGF0ZSB0aGUgZXJyb3IgY291bnRzLiAqLworCQllcC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBpbmIoaW9hZGRyICsgTVBDTlQpOworCQllcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICs9IGluYihpb2FkZHIgKyBBTElDTlQpOworCQllcC0+c3RhdHMucnhfY3JjX2Vycm9ycyArPSBpbmIoaW9hZGRyICsgQ1JDQ05UKTsKKwl9CisKKwlyZXR1cm4gJmVwLT5zdGF0czsKK30KKworLyogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgICBOb3RlIHRoYXQgd2Ugb25seSB1c2UgZXhjbHVzaW9uIGFyb3VuZCBhY3R1YWxseSBxdWV1ZWluZyB0aGUKKyAgIG5ldyBmcmFtZSwgbm90IGFyb3VuZCBmaWxsaW5nIGVwLT5zZXR1cF9mcmFtZS4gIFRoaXMgaXMgbm9uLWRldGVybWluaXN0aWMKKyAgIHdoZW4gcmUtZW50ZXJlZCBidXQgc3RpbGwgY29ycmVjdC4gKi8KKworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBlcGljX3ByaXZhdGUgKmVwID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGNoYXIgbWNfZmlsdGVyWzhdOwkJIC8qIE11bHRpY2FzdCBoYXNoIGZpbHRlciAqLworCWludCBpOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewkJCS8qIFNldCBwcm9taXNjdW91cy4gKi8KKwkJb3V0bCgweDAwMkMsIGlvYWRkciArIFJ4Q3RybCk7CisJCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICovCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLCBkZXYtPm5hbWUpOworCQltZW1zZXQobWNfZmlsdGVyLCAweGZmLCBzaXplb2YobWNfZmlsdGVyKSk7CisJfSBlbHNlIGlmICgoZGV2LT5tY19jb3VudCA+IDApICB8fCAgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCS8qIFRoZXJlIGlzIGFwcGFyZW50bHkgYSBjaGlwIGJ1Zywgc28gdGhlIG11bHRpY2FzdCBmaWx0ZXIKKwkJICAgaXMgbmV2ZXIgZW5hYmxlZC4gKi8KKwkJLyogVG9vIG1hbnkgdG8gZmlsdGVyIHBlcmZlY3RseSAtLSBhY2NlcHQgYWxsIG11bHRpY2FzdHMuICovCisJCW1lbXNldChtY19maWx0ZXIsIDB4ZmYsIHNpemVvZihtY19maWx0ZXIpKTsKKwkJb3V0bCgweDAwMEMsIGlvYWRkciArIFJ4Q3RybCk7CisJfSBlbHNlIGlmIChkZXYtPm1jX2NvdW50ID09IDApIHsKKwkJb3V0bCgweDAwMDQsIGlvYWRkciArIFJ4Q3RybCk7CisJCXJldHVybjsKKwl9IGVsc2UgewkJCQkJLyogTmV2ZXIgZXhlY3V0ZWQsIGZvciBub3cuICovCisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCisJCW1lbXNldChtY19maWx0ZXIsIDAsIHNpemVvZihtY19maWx0ZXIpKTsKKwkJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7CisJCQkgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCXVuc2lnbmVkIGludCBiaXRfbnIgPQorCQkJCWV0aGVyX2NyY19sZShFVEhfQUxFTiwgbWNsaXN0LT5kbWlfYWRkcikgJiAweDNmOworCQkJbWNfZmlsdGVyW2JpdF9uciA+PiAzXSB8PSAoMSA8PCBiaXRfbnIpOworCQl9CisJfQorCS8qIFRvRG86IHBlcmhhcHMgd2UgbmVlZCB0byBzdG9wIHRoZSBUeCBhbmQgUnggcHJvY2VzcyBoZXJlPyAqLworCWlmIChtZW1jbXAobWNfZmlsdGVyLCBlcC0+bWNfZmlsdGVyLCBzaXplb2YobWNfZmlsdGVyKSkpIHsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCW91dHcoKCh1MTYgKiltY19maWx0ZXIpW2ldLCBpb2FkZHIgKyBNQzAgKyBpKjQpOworCQltZW1jcHkoZXAtPm1jX2ZpbHRlciwgbWNfZmlsdGVyLCBzaXplb2YobWNfZmlsdGVyKSk7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X2dldF9kcnZpbmZvIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBlcGljX3ByaXZhdGUgKm5wID0gZGV2LT5wcml2OworCisJc3RyY3B5IChpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkgKGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzdHJjcHkgKGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworfQorCitzdGF0aWMgaW50IG5ldGRldl9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IGVwaWNfcHJpdmF0ZSAqbnAgPSBkZXYtPnByaXY7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCXJjID0gbWlpX2V0aHRvb2xfZ3NldCgmbnAtPm1paSwgY21kKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBuZXRkZXZfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBlcGljX3ByaXZhdGUgKm5wID0gZGV2LT5wcml2OworCWludCByYzsKKworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyYyA9IG1paV9ldGh0b29sX3NzZXQoJm5wLT5taWksIGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbmV0ZGV2X253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXBpY19wcml2YXRlICpucCA9IGRldi0+cHJpdjsKKwlyZXR1cm4gbWlpX253YXlfcmVzdGFydCgmbnAtPm1paSk7Cit9CisKK3N0YXRpYyB1MzIgbmV0ZGV2X2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVwaWNfcHJpdmF0ZSAqbnAgPSBkZXYtPnByaXY7CisJcmV0dXJuIG1paV9saW5rX29rKCZucC0+bWlpKTsKK30KKworc3RhdGljIHUzMiBuZXRkZXZfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRlYnVnOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSkKK3sKKwlkZWJ1ZyA9IHZhbHVlOworfQorCitzdGF0aWMgaW50IGV0aHRvb2xfYmVnaW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCS8qIHBvd2VyLXVwLCBpZiBpbnRlcmZhY2UgaXMgZG93biAqLworCWlmICghIG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlvdXRsKDB4MDIwMCwgaW9hZGRyICsgR0VOQ1RMKTsKKwkJb3V0bCgoaW5sKGlvYWRkciArIE5WQ1RMKSAmIH4weDAwM0MpIHwgMHg0ODAwLCBpb2FkZHIgKyBOVkNUTCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBldGh0b29sX2NvbXBsZXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwkvKiBwb3dlci1kb3duLCBpZiBpbnRlcmZhY2UgaXMgZG93biAqLworCWlmICghIG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlvdXRsKDB4MDAwOCwgaW9hZGRyICsgR0VOQ1RMKTsKKwkJb3V0bCgoaW5sKGlvYWRkciArIE5WQ1RMKSAmIH4weDQ4M0MpIHwgMHgwMDAwLCBpb2FkZHIgKyBOVkNUTCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorCS5nZXRfc2V0dGluZ3MJCT0gbmV0ZGV2X2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCQk9IG5ldGRldl9zZXRfc2V0dGluZ3MsCisJLm53YXlfcmVzZXQJCT0gbmV0ZGV2X253YXlfcmVzZXQsCisJLmdldF9saW5rCQk9IG5ldGRldl9nZXRfbGluaywKKwkuZ2V0X21zZ2xldmVsCQk9IG5ldGRldl9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSBuZXRkZXZfc2V0X21zZ2xldmVsLAorCS5nZXRfc2cJCQk9IGV0aHRvb2xfb3BfZ2V0X3NnLAorCS5nZXRfdHhfY3N1bQkJPSBldGh0b29sX29wX2dldF90eF9jc3VtLAorCS5iZWdpbgkJCT0gZXRodG9vbF9iZWdpbiwKKwkuY29tcGxldGUJCT0gZXRodG9vbF9jb21wbGV0ZQorfTsKKworc3RhdGljIGludCBuZXRkZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgZXBpY19wcml2YXRlICpucCA9IGRldi0+cHJpdjsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShycSk7CisJaW50IHJjOworCisJLyogcG93ZXItdXAsIGlmIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKCEgbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCW91dGwoMHgwMjAwLCBpb2FkZHIgKyBHRU5DVEwpOworCQlvdXRsKChpbmwoaW9hZGRyICsgTlZDVEwpICYgfjB4MDAzQykgfCAweDQ4MDAsIGlvYWRkciArIE5WQ1RMKTsKKwl9CisKKwkvKiBhbGwgbm9uLWV0aHRvb2wgaW9jdGxzICh0aGUgU0lPQ1tHU11NSUl4eHggaW9jdGxzKSAqLworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyYyA9IGdlbmVyaWNfbWlpX2lvY3RsKCZucC0+bWlpLCBkYXRhLCBjbWQsIE5VTEwpOworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCisJLyogcG93ZXItZG93biwgaWYgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlpZiAoISBuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJb3V0bCgweDAwMDgsIGlvYWRkciArIEdFTkNUTCk7CisJCW91dGwoKGlubChpb2FkZHIgKyBOVkNUTCkgJiB+MHg0ODNDKSB8IDB4MDAwMCwgaW9hZGRyICsgTlZDVEwpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IGVwaWNfcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZXBpY19wcml2YXRlICplcCA9IGRldi0+cHJpdjsKKwkKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFRYX1RPVEFMX1NJWkUsIGVwLT50eF9yaW5nLCBlcC0+dHhfcmluZ19kbWEpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgZXAtPnJ4X3JpbmcsIGVwLT5yeF9yaW5nX2RtYSk7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKyNpZm5kZWYgVVNFX0lPX09QUworCWlvdW5tYXAoKHZvaWQqKSBkZXYtPmJhc2VfYWRkcik7CisjZW5kaWYKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCWZyZWVfbmV0ZGV2KGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwkvKiBwY2lfcG93ZXJfb2ZmKHBkZXYsIC0xKTsgKi8KK30KKworCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgZXBpY19zdXNwZW5kIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gMDsKKwllcGljX3BhdXNlKGRldik7CisJLyogUHV0IHRoZSBjaGlwIGludG8gbG93LXBvd2VyIG1vZGUuICovCisJb3V0bCgweDAwMDgsIGlvYWRkciArIEdFTkNUTCk7CisJLyogcGNpX3Bvd2VyX29mZihwZGV2LCAtMSk7ICovCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBlcGljX3Jlc3VtZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gMDsKKwllcGljX3Jlc3RhcnQoZGV2KTsKKwkvKiBwY2lfcG93ZXJfb24ocGRldik7ICovCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZXBpY19kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCT0gZXBpY19wY2lfdGJsLAorCS5wcm9iZQkJPSBlcGljX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZXBpY19yZW1vdmVfb25lKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IGVwaWNfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGVwaWNfcmVzdW1lLAorI2VuZGlmIC8qIENPTkZJR19QTSAqLworfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBlcGljX2luaXQgKHZvaWQpCit7CisvKiB3aGVuIGEgbW9kdWxlLCB0aGlzIGlzIHByaW50ZWQgd2hldGhlciBvciBub3QgZGV2aWNlcyBhcmUgZm91bmQgaW4gcHJvYmUgKi8KKyNpZmRlZiBNT0RVTEUKKwlwcmludGsgKEtFUk5fSU5GTyAiJXMiIEtFUk5fSU5GTyAiJXMiIEtFUk5fSU5GTyAiJXMiLAorCQl2ZXJzaW9uLCB2ZXJzaW9uMiwgdmVyc2lvbjMpOworI2VuZGlmCisKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0ICgmZXBpY19kcml2ZXIpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlcGljX2NsZWFudXAgKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmZXBpY19kcml2ZXIpOworfQorCisKK21vZHVsZV9pbml0KGVwaWNfaW5pdCk7Cittb2R1bGVfZXhpdChlcGljX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXFsLmMgYi9kcml2ZXJzL25ldC9lcWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDY4NjU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXFsLmMKQEAgLTAsMCArMSw2MTMgQEAKKy8qCisgKiBFcXVhbGl6ZXIgTG9hZC1iYWxhbmNlciBmb3Igc2VyaWFsIG5ldHdvcmsgaW50ZXJmYWNlcy4KKyAqCisgKiAoYykgQ29weXJpZ2h0IDE5OTUgU2ltb24gIkd1cnUgQWxlcGgtTnVsbCIgSmFuZXMKKyAqIE5DTTogTmV0d29yayBhbmQgQ29tbXVuaWNhdGlvbnMgTWFuYWdlbWVudCwgSW5jLgorICoKKyAqIChjKSBDb3B5cmlnaHQgMjAwMiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKgorICoJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICoJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqIAorICogVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBzaW1vbkBuY20uY29tLCBvciBDL08KKyAqICAgIE5DTQorICogICAgQXR0bjogU2ltb24gSmFuZXMKKyAqICAgIDY4MDMgV2hpdHRpZXIgQXZlCisgKiAgICBNY0xlYW4gVkEgMjIxMDEKKyAqICAgIFBob25lOiAxLTcwMy04NDctMDA0MCBleHQgMTAzCisgKi8KKworLyoKKyAqIFNvdXJjZXM6CisgKiAgIHNrZWxldG9uLmMgYnkgRG9uYWxkIEJlY2tlci4KKyAqIEluc3BpcmF0aW9uczoKKyAqICAgVGhlIEhhcnJpZWQgYW5kIE92ZXJ3b3JrZWQgQWxhbiBDb3gKKyAqIENvbnNwaXJhY2llczoKKyAqICAgVGhlIEFsYW4gQ294IGFuZCBNaWtlIE1jTGFnYW4gcGxvdCB0byBnZXQgc29tZW9uZSBlbHNlIHRvIGRvIHRoZSBjb2RlLCAKKyAqICAgd2hpY2ggdHVybmVkIG91dCB0byBiZSBtZS4KKyAqLworCisvKgorICogJExvZzogZXFsLmMsdiAkCisgKiBSZXZpc2lvbiAxLjIgIDE5OTYvMDQvMTEgMTc6NTE6NTIgIGd1cnUKKyAqIEFkZGVkIG9uZS1saW5lIGVxbF9yZW1vdmVfc2xhdmUgcGF0Y2guCisgKgorICogUmV2aXNpb24gMS4xICAxOTk2LzA0LzExIDE3OjQ0OjE3ICBndXJ1CisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorICogUmV2aXNpb24gMy4xMyAgMTk5Ni8wMS8yMSAgMTU6MTc6MTggIGFsYW4KKyAqIHR4X3F1ZXVlX2xlbiBjaGFuZ2VzLgorICogcmVmb3JtYXR0ZWQuCisgKgorICogUmV2aXNpb24gMy4xMiAgMTk5NS8wMy8yMiAgMjE6MDc6NTEgIGFuYXJjaHkKKyAqIEFkZGVkIGNhcGFibGUoKSBjaGVja3Mgb24gY29uZmlndXJhdGlvbi4KKyAqIE1vdmVkIGhlYWRlciBmaWxlLgorICoKKyAqIFJldmlzaW9uIDMuMTEgIDE5OTUvMDEvMTkgIDIzOjE0OjMxICBndXJ1CisgKiAJCSAgICAgIHNsYXZlX2xvYWQgPSAoVUxPTkdfTUFYIC0gKFVMT05HX01BWCAvIDIpKSAtCisgKiAJCQkocHJpb3JpdHlfQnBzKSArIGJ5dGVzX3F1ZXVlZCAqIDg7CisgKgorICogUmV2aXNpb24gMy4xMCAgMTk5NS8wMS8xOSAgMjM6MDc6NTMgIGd1cnUKKyAqIGJhY2sgdG8KKyAqIAkJICAgICAgc2xhdmVfbG9hZCA9IChVTE9OR19NQVggLSAoVUxPTkdfTUFYIC8gMikpIC0KKyAqIAkJCShwcmlvcml0eV9CcHMpICsgYnl0ZXNfcXVldWVkOworICoKKyAqIFJldmlzaW9uIDMuOSAgMTk5NS8wMS8xOSAgMjI6Mzg6MjAgIGd1cnUKKyAqIAkJICAgICAgc2xhdmVfbG9hZCA9IChVTE9OR19NQVggLSAoVUxPTkdfTUFYIC8gMikpIC0KKyAqIAkJCShwcmlvcml0eV9CcHMpICsgYnl0ZXNfcXVldWVkICogNDsKKyAqCisgKiBSZXZpc2lvbiAzLjggIDE5OTUvMDEvMTkgIDIyOjMwOjU1ICBndXJ1CisgKiAgICAgICBzbGF2ZV9sb2FkID0gKFVMT05HX01BWCAtIChVTE9OR19NQVggLyAyKSkgLQorICogCQkJKHByaW9yaXR5X0JwcykgKyBieXRlc19xdWV1ZWQgKiAyOworICoKKyAqIFJldmlzaW9uIDMuNyAgMTk5NS8wMS8xOSAgMjE6NTI6MzUgIGd1cnUKKyAqIHByaW50aydzIHRyaW1tZWQgb3V0LgorICoKKyAqIFJldmlzaW9uIDMuNiAgMTk5NS8wMS8xOSAgMjE6NDk6NTYgIGd1cnUKKyAqIFRoaXMgaXMgd29ya2luZyBwcmV0dHkgd2VsbC4gSSBnYWluZWQgMSBLL3MgaW4gc3BlZWQuLiBub3cgaXQncyBqdXN0CisgKiByb2J1c3RuZXNzIGFuZCBwcmludGsncyB0byBiZSBkaWtlZCBvdXQuCisgKgorICogUmV2aXNpb24gMy41ICAxOTk1LzAxLzE4ICAyMjoyOTo1OSAgZ3VydQorICogc3RpbGwgY3Jhc2hlcyB0aGUga2VybmVsIHdoZW4gdGhlIGxvY2tfd2FpdCB0aGluZyBpcyB3b2tlbiB1cC4KKyAqCisgKiBSZXZpc2lvbiAzLjQgIDE5OTUvMDEvMTggIDIxOjU5OjQ3ICBndXJ1CisgKiBCcm9rZW4gc2V0LWJpdCBsb2NraW5nIHNuYXBzaG90CisgKgorICogUmV2aXNpb24gMy4zICAxOTk1LzAxLzE3ICAyMjowOToxOCAgZ3VydQorICogaW5maW5pdGUgc2xlZXAgaW4gYSBsb2NrIHNvbWV3aGVyZS4uCisgKgorICogUmV2aXNpb24gMy4yICAxOTk1LzAxLzE1ICAxNjo0NjowNiAgZ3VydQorICogTG9nIHRyaW1tZWQgb2Ygbm9uLXBlcnRpbmVudCAxLnggYnJhbmNoIG1lc3NhZ2VzCisgKgorICogUmV2aXNpb24gMy4xICAxOTk1LzAxLzE1ICAxNDo0MTo0NSAgZ3VydQorICogTmV3IFNjaGVkdWxlciBhbmQgdGltZXIgc3R1ZmYuLi4KKyAqCisgKiBSZXZpc2lvbiAxLjE1ICAxOTk1LzAxLzE1ICAxNDoyOTowMiAgZ3VydQorICogV2lsbCBtYWtlIDEuMTQgKG5vdyAxLjE1KSB0aGUgMy4wIGJyYW5jaCwgYW5kIHRoZSAxLjEyIHRoZSAyLjAgYnJhbmNoLCB0aGUgb25lCisgKiB3aXRoIHRoZSBkdW1iZXIgc2NoZWR1bGVyCisgKgorICogUmV2aXNpb24gMS4xNCAgMTk5NS8wMS8xNSAgMDI6Mzc6MDggIGd1cnUKKyAqIHNob2NrLi4gdGhlIGtlcHQtbmV3LXZlcnNpb25zIGNvdWxkIGhhdmUgem9ua2VkIHdvcmtpbmcKKyAqIHN0dWZmLi4gc2h1ZGRlcgorICoKKyAqIFJldmlzaW9uIDEuMTMgIDE5OTUvMDEvMTUgIDAyOjM2OjMxICBndXJ1CisgKiBiaWcgY2hhbmdlcworICoKKyAqIAlzY2hlZHVsZXIgd2FzIHRvcm4gb3V0IGFuZCByZXBsYWNlZCB3aXRoIHNvbWV0aGluZyBzbWFydGVyCisgKgorICogCWdsb2JhbCBuYW1lcyBub3QgcHJlZml4ZWQgd2l0aCBlcWxfIHdlcmUgcmVuYW1lZCB0byBwcm90ZWN0CisgKiAJYWdhaW5zdCBuYW1lc3BhY2UgY29sbGlzaW9ucworICoKKyAqIAlhIGZldyBtb3JlIGFic3RyYWN0IGludGVyZmFjZXMgd2VyZSBhZGRlZCB0byBmYWNpbGl0YXRlIGFueQorICogCXBvdGVudGlhbCBjaGFuZ2Ugb2YgZGF0YXN0cnVjdHVyZS4gIHRoZSBkcml2ZXIgaXMgc3RpbGwgdXNpbmcKKyAqIAlhIGxpbmtlZCBsaXN0IG9mIHNsYXZlcy4gIGdvaW5nIHRvIGEgaGVhcCB3b3VsZCBiZSBhIGJpdCBvZgorICogCWFuIG92ZXJraWxsLgorICoKKyAqIAl0aGlzIGNvbXBpbGVzIGZpbmUgd2l0aCBubyB3YXJuaW5ncy4KKyAqCisgKiAJdGhlIGxvY2tpbmcgbWVjaGFuaXNtIGFuZCB0aW1lciBzdHVmZiBtdXN0IGJlIHdyaXR0ZW4gaG93ZXZlciwKKyAqIAl0aGlzIHZlcnNpb24gd2lsbCBub3Qgd29yayBvdGhlcndpc2UKKyAqCisgKiBTb3JyeSwgSSBoYWQgdG8gcmV3cml0ZSBtb3N0IG9mIHRoaXMgZm9yIDIuNS54IC1EYXZlTQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXFsLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW50IGVxbF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBlcWxfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGVxbF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7CitzdGF0aWMgaW50IGVxbF9zbGF2ZV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICplcWxfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisjZGVmaW5lIGVxbF9pc19zbGF2ZShkZXYpCSgoZGV2LT5mbGFncyAmIElGRl9TTEFWRSkgPT0gSUZGX1NMQVZFKQorI2RlZmluZSBlcWxfaXNfbWFzdGVyKGRldikJKChkZXYtPmZsYWdzICYgSUZGX01BU1RFUikgPT0gSUZGX01BU1RFUikKKworc3RhdGljIHZvaWQgZXFsX2tpbGxfb25lX3NsYXZlKHNsYXZlX3QgKnNsYXZlKTsKKworc3RhdGljIHZvaWQgZXFsX3RpbWVyKHVuc2lnbmVkIGxvbmcgcGFyYW0pCit7CisJZXF1YWxpemVyX3QgKmVxbCA9IChlcXVhbGl6ZXJfdCAqKSBwYXJhbTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0aGlzLCAqdG1wLCAqaGVhZDsKKwkKKwlzcGluX2xvY2tfYmgoJmVxbC0+cXVldWUubG9jayk7CisJaGVhZCA9ICZlcWwtPnF1ZXVlLmFsbF9zbGF2ZXM7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHRoaXMsIHRtcCwgaGVhZCkgeworCQlzbGF2ZV90ICpzbGF2ZSA9IGxpc3RfZW50cnkodGhpcywgc2xhdmVfdCwgbGlzdCk7CisKKwkJaWYgKChzbGF2ZS0+ZGV2LT5mbGFncyAmIElGRl9VUCkgPT0gSUZGX1VQKSB7CisJCQlzbGF2ZS0+Ynl0ZXNfcXVldWVkIC09IHNsYXZlLT5wcmlvcml0eV9CcHM7CisJCQlpZiAoc2xhdmUtPmJ5dGVzX3F1ZXVlZCA8IDApCisJCQkJc2xhdmUtPmJ5dGVzX3F1ZXVlZCA9IDA7CisJCX0gZWxzZSB7CisJCQllcWxfa2lsbF9vbmVfc2xhdmUoc2xhdmUpOworCQl9CisKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmVxbC0+cXVldWUubG9jayk7CisKKwllcWwtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgRVFMX0RFRkFVTFRfUkVTQ0hFRF9JVkFMOworCWFkZF90aW1lcigmZXFsLT50aW1lcik7Cit9CisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0gCisJIkVxdWFsaXplcjIwMDI6IFNpbW9uIEphbmVzIChzaW1vbkBuY20uY29tKSBhbmQgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKVxuIjsKKworc3RhdGljIHZvaWQgX19pbml0IGVxbF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWVxdWFsaXplcl90ICplcWwgPSBuZXRkZXZfcHJpdihkZXYpOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaW5pdF90aW1lcigmZXFsLT50aW1lcik7CisJZXFsLT50aW1lci5kYXRhICAgICAJPSAodW5zaWduZWQgbG9uZykgZXFsOworCWVxbC0+dGltZXIuZXhwaXJlcyAgCT0gamlmZmllcyArIEVRTF9ERUZBVUxUX1JFU0NIRURfSVZBTDsKKwllcWwtPnRpbWVyLmZ1bmN0aW9uIAk9IGVxbF90aW1lcjsKKworCXNwaW5fbG9ja19pbml0KCZlcWwtPnF1ZXVlLmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZlcWwtPnF1ZXVlLmFsbF9zbGF2ZXMpOworCWVxbC0+cXVldWUubWFzdGVyX2Rldgk9IGRldjsKKworCWRldi0+b3BlbgkJPSBlcWxfb3BlbjsKKwlkZXYtPnN0b3AJCT0gZXFsX2Nsb3NlOworCWRldi0+ZG9faW9jdGwJCT0gZXFsX2lvY3RsOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gZXFsX3NsYXZlX3htaXQ7CisJZGV2LT5nZXRfc3RhdHMJCT0gZXFsX2dldF9zdGF0czsKKyAgCisJLyoKKwkgKglOb3cgd2UgdW5kbyBzb21lIG9mIHRoZSB0aGluZ3MgdGhhdCBldGhfc2V0dXAgZG9lcworCSAqIAl0aGF0IHdlIGRvbid0IGxpa2UgCisJICovCisJIAorCWRldi0+bXR1ICAgICAgICAJPSBFUUxfREVGQVVMVF9NVFU7CS8qIHNldCB0byA1NzYgaW4gaWZfZXFsLmggKi8KKwlkZXYtPmZsYWdzICAgICAgCT0gSUZGX01BU1RFUjsKKworCWRldi0+dHlwZSAgICAgICAJPSBBUlBIUkRfU0xJUDsKKwlkZXYtPnR4X3F1ZXVlX2xlbiAJPSA1OwkJLyogSGFuZHMgdGhlbSBvZmYgZmFzdCAqLworfQorCitzdGF0aWMgaW50IGVxbF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZXF1YWxpemVyX3QgKmVxbCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBYWFggV2Ugc2hvdWxkIGZvcmNlIHRoaXMgb2ZmIGF1dG9tYXRpY2FsbHkgZm9yIHRoZSB1c2VyLiAqLworCXByaW50ayhLRVJOX0lORk8gIiVzOiByZW1lbWJlciB0byB0dXJuIG9mZiBWYW4tSmFjb2Jzb24gY29tcHJlc3Npb24gb24gIgorCSAgICAgICAieW91ciBzbGF2ZSBkZXZpY2VzLlxuIiwgZGV2LT5uYW1lKTsKKworCWlmICghbGlzdF9lbXB0eSgmZXFsLT5xdWV1ZS5hbGxfc2xhdmVzKSkKKwkJQlVHKCk7CisKKwllcWwtPm1pbl9zbGF2ZXMgPSAxOworCWVxbC0+bWF4X3NsYXZlcyA9IEVRTF9ERUZBVUxUX01BWF9TTEFWRVM7IC8qIDQgdXN1YWxseS4uLiAqLworCisJYWRkX3RpbWVyKCZlcWwtPnRpbWVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlcWxfa2lsbF9vbmVfc2xhdmUoc2xhdmVfdCAqc2xhdmUpCit7CisJbGlzdF9kZWwoJnNsYXZlLT5saXN0KTsKKwlzbGF2ZS0+ZGV2LT5mbGFncyAmPSB+SUZGX1NMQVZFOworCWRldl9wdXQoc2xhdmUtPmRldik7CisJa2ZyZWUoc2xhdmUpOworfQorCitzdGF0aWMgdm9pZCBlcWxfa2lsbF9zbGF2ZV9xdWV1ZShzbGF2ZV9xdWV1ZV90ICpxdWV1ZSkKK3sgCisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgKnRtcCwgKnRoaXM7CisKKwlzcGluX2xvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKKworCWhlYWQgPSAmcXVldWUtPmFsbF9zbGF2ZXM7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHRoaXMsIHRtcCwgaGVhZCkgeworCQlzbGF2ZV90ICpzID0gbGlzdF9lbnRyeSh0aGlzLCBzbGF2ZV90LCBsaXN0KTsKKworCQllcWxfa2lsbF9vbmVfc2xhdmUocyk7CisJCXF1ZXVlLT5udW1fc2xhdmVzLS07CisJfQorCisJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKK30KKworc3RhdGljIGludCBlcWxfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllcXVhbGl6ZXJfdCAqZXFsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qCisJICoJVGhlIHRpbWVyIGhhcyB0byBiZSBzdG9wcGVkIGZpcnN0IGJlZm9yZSB3ZSBzdGFydCBoYWNraW5nIGF3YXkKKwkgKglhdCB0aGUgZGF0YSBzdHJ1Y3R1cmUgaXQgc2NhbnMgZXZlcnkgc28gb2Z0ZW4uLi4gCisJICovCisKKwlkZWxfdGltZXJfc3luYygmZXFsLT50aW1lcik7CisKKwllcWxfa2lsbF9zbGF2ZV9xdWV1ZSgmZXFsLT5xdWV1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlcWxfZW5zbGF2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCAgc2xhdmluZ19yZXF1ZXN0X3QgX191c2VyICpzcnEpOworc3RhdGljIGludCBlcWxfZW1hbmNpcGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzbGF2aW5nX3JlcXVlc3RfdCBfX3VzZXIgKnNycSk7CisKK3N0YXRpYyBpbnQgZXFsX2dfc2xhdmVfY2ZnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNsYXZlX2NvbmZpZ190IF9fdXNlciAqc2MpOworc3RhdGljIGludCBlcWxfc19zbGF2ZV9jZmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2xhdmVfY29uZmlnX3QgX191c2VyICpzYyk7CisKK3N0YXRpYyBpbnQgZXFsX2dfbWFzdGVyX2NmZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBtYXN0ZXJfY29uZmlnX3QgX191c2VyICptYyk7CitzdGF0aWMgaW50IGVxbF9zX21hc3Rlcl9jZmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbWFzdGVyX2NvbmZpZ190IF9fdXNlciAqbWMpOworCitzdGF0aWMgaW50IGVxbF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sgIAorCWlmIChjbWQgIT0gRVFMX0dFVE1BU1RSQ0ZHICYmIGNtZCAhPSBFUUxfR0VUU0xBVkVDRkcgJiYKKwkgICAgIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJICAJcmV0dXJuIC1FUEVSTTsKKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgRVFMX0VOU0xBVkU6CisJCQlyZXR1cm4gZXFsX2Vuc2xhdmUoZGV2LCBpZnItPmlmcl9kYXRhKTsKKwkJY2FzZSBFUUxfRU1BTkNJUEFURToKKwkJCXJldHVybiBlcWxfZW1hbmNpcGF0ZShkZXYsIGlmci0+aWZyX2RhdGEpOworCQljYXNlIEVRTF9HRVRTTEFWRUNGRzoKKwkJCXJldHVybiBlcWxfZ19zbGF2ZV9jZmcoZGV2LCBpZnItPmlmcl9kYXRhKTsKKwkJY2FzZSBFUUxfU0VUU0xBVkVDRkc6CisJCQlyZXR1cm4gZXFsX3Nfc2xhdmVfY2ZnKGRldiwgaWZyLT5pZnJfZGF0YSk7CisJCWNhc2UgRVFMX0dFVE1BU1RSQ0ZHOgorCQkJcmV0dXJuIGVxbF9nX21hc3Rlcl9jZmcoZGV2LCBpZnItPmlmcl9kYXRhKTsKKwkJY2FzZSBFUUxfU0VUTUFTVFJDRkc6CisJCQlyZXR1cm4gZXFsX3NfbWFzdGVyX2NmZyhkZXYsIGlmci0+aWZyX2RhdGEpOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX07Cit9CisKKy8qIHF1ZXVlLT5sb2NrIG11c3QgYmUgaGVsZCAqLworc3RhdGljIHNsYXZlX3QgKl9fZXFsX3NjaGVkdWxlX3NsYXZlcyhzbGF2ZV9xdWV1ZV90ICpxdWV1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGJlc3RfbG9hZCA9IH4wVUw7CisJc3RydWN0IGxpc3RfaGVhZCAqdGhpcywgKnRtcCwgKmhlYWQ7CisJc2xhdmVfdCAqYmVzdF9zbGF2ZTsKKworCWJlc3Rfc2xhdmUgPSBOVUxMOworCisJLyogTWFrZSBhIHBhc3MgdG8gc2V0IHRoZSBiZXN0IHNsYXZlLiAqLworCWhlYWQgPSAmcXVldWUtPmFsbF9zbGF2ZXM7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHRoaXMsIHRtcCwgaGVhZCkgeworCQlzbGF2ZV90ICpzbGF2ZSA9IGxpc3RfZW50cnkodGhpcywgc2xhdmVfdCwgbGlzdCk7CisJCXVuc2lnbmVkIGxvbmcgc2xhdmVfbG9hZCwgYnl0ZXNfcXVldWVkLCBwcmlvcml0eV9CcHM7IAorCisJCS8qIEdvIHRocm91Z2ggdGhlIHNsYXZlIGxpc3Qgb25jZSwgdXBkYXRpbmcgYmVzdF9zbGF2ZQorCQkgKiB3aGVuZXZlciBhIG5ldyBiZXN0X2xvYWQgaXMgZm91bmQuCisJCSAqLworCQlieXRlc19xdWV1ZWQgPSBzbGF2ZS0+Ynl0ZXNfcXVldWVkOworCQlwcmlvcml0eV9CcHMgPSBzbGF2ZS0+cHJpb3JpdHlfQnBzOyAgICAKKwkJaWYgKChzbGF2ZS0+ZGV2LT5mbGFncyAmIElGRl9VUCkgPT0gSUZGX1VQKSB7CisJCQlzbGF2ZV9sb2FkID0gKH4wVUwgLSAofjBVTCAvIDIpKSAtIAorCQkJCShwcmlvcml0eV9CcHMpICsgYnl0ZXNfcXVldWVkICogODsKKworCQkJaWYgKHNsYXZlX2xvYWQgPCBiZXN0X2xvYWQpIHsKKwkJCQliZXN0X2xvYWQgPSBzbGF2ZV9sb2FkOworCQkJCWJlc3Rfc2xhdmUgPSBzbGF2ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFdlIGZvdW5kIGEgZGVhZCBzbGF2ZSwga2lsbCBpdC4gKi8KKwkJCWVxbF9raWxsX29uZV9zbGF2ZShzbGF2ZSk7CisJCX0KKwl9CisJcmV0dXJuIGJlc3Rfc2xhdmU7Cit9CisKK3N0YXRpYyBpbnQgZXFsX3NsYXZlX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllcXVhbGl6ZXJfdCAqZXFsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzbGF2ZV90ICpzbGF2ZTsKKworCXNwaW5fbG9jaygmZXFsLT5xdWV1ZS5sb2NrKTsKKworCXNsYXZlID0gX19lcWxfc2NoZWR1bGVfc2xhdmVzKCZlcWwtPnF1ZXVlKTsKKwlpZiAoc2xhdmUpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldiA9IHNsYXZlLT5kZXY7CisKKwkJc2tiLT5kZXYgPSBzbGF2ZV9kZXY7CisJCXNrYi0+cHJpb3JpdHkgPSAxOworCQlzbGF2ZS0+Ynl0ZXNfcXVldWVkICs9IHNrYi0+bGVuOyAKKwkJZGV2X3F1ZXVlX3htaXQoc2tiKTsKKwkJZXFsLT5zdGF0cy50eF9wYWNrZXRzKys7CisJfSBlbHNlIHsKKwkJZXFsLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9CSAgCisKKwlzcGluX3VubG9jaygmZXFsLT5xdWV1ZS5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiBlcWxfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZXF1YWxpemVyX3QgKmVxbCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuICZlcWwtPnN0YXRzOworfQorCisvKgorICoJUHJpdmF0ZSBpb2N0bCBmdW5jdGlvbnMKKyAqLworCisvKiBxdWV1ZS0+bG9jayBtdXN0IGJlIGhlbGQgKi8KK3N0YXRpYyBzbGF2ZV90ICpfX2VxbF9maW5kX3NsYXZlX2RldihzbGF2ZV9xdWV1ZV90ICpxdWV1ZSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0aGlzLCAqaGVhZDsKKworCWhlYWQgPSAmcXVldWUtPmFsbF9zbGF2ZXM7CisJbGlzdF9mb3JfZWFjaCh0aGlzLCBoZWFkKSB7CisJCXNsYXZlX3QgKnNsYXZlID0gbGlzdF9lbnRyeSh0aGlzLCBzbGF2ZV90LCBsaXN0KTsKKworCQlpZiAoc2xhdmUtPmRldiA9PSBkZXYpCisJCQlyZXR1cm4gc2xhdmU7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGVxbF9pc19mdWxsKHNsYXZlX3F1ZXVlX3QgKnF1ZXVlKQoreworCWVxdWFsaXplcl90ICplcWwgPSBuZXRkZXZfcHJpdihxdWV1ZS0+bWFzdGVyX2Rldik7CisKKwlpZiAocXVldWUtPm51bV9zbGF2ZXMgPj0gZXFsLT5tYXhfc2xhdmVzKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyogcXVldWUtPmxvY2sgbXVzdCBiZSBoZWxkICovCitzdGF0aWMgaW50IF9fZXFsX2luc2VydF9zbGF2ZShzbGF2ZV9xdWV1ZV90ICpxdWV1ZSwgc2xhdmVfdCAqc2xhdmUpCit7CisJaWYgKCFlcWxfaXNfZnVsbChxdWV1ZSkpIHsKKwkJc2xhdmVfdCAqZHVwbGljYXRlX3NsYXZlID0gTlVMTDsKKworCQlkdXBsaWNhdGVfc2xhdmUgPSBfX2VxbF9maW5kX3NsYXZlX2RldihxdWV1ZSwgc2xhdmUtPmRldik7CisJCWlmIChkdXBsaWNhdGVfc2xhdmUgIT0gMCkKKwkJCWVxbF9raWxsX29uZV9zbGF2ZShkdXBsaWNhdGVfc2xhdmUpOworCisJCWxpc3RfYWRkKCZzbGF2ZS0+bGlzdCwgJnF1ZXVlLT5hbGxfc2xhdmVzKTsKKwkJcXVldWUtPm51bV9zbGF2ZXMrKzsKKwkJc2xhdmUtPmRldi0+ZmxhZ3MgfD0gSUZGX1NMQVZFOworCisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRU5PU1BDOworfQorCitzdGF0aWMgaW50IGVxbF9lbnNsYXZlKHN0cnVjdCBuZXRfZGV2aWNlICptYXN0ZXJfZGV2LCBzbGF2aW5nX3JlcXVlc3RfdCBfX3VzZXIgKnNycXApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldjsKKwlzbGF2aW5nX3JlcXVlc3RfdCBzcnE7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnNycSwgc3JxcCwgc2l6ZW9mIChzbGF2aW5nX3JlcXVlc3RfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNsYXZlX2RldiAgPSBkZXZfZ2V0X2J5X25hbWUoc3JxLnNsYXZlX25hbWUpOworCWlmIChzbGF2ZV9kZXYpIHsKKwkJaWYgKChtYXN0ZXJfZGV2LT5mbGFncyAmIElGRl9VUCkgPT0gSUZGX1VQKSB7CisJCQkvKiBzbGF2ZSBpcyBub3QgYSBtYXN0ZXIgJiBub3QgYWxyZWFkeSBhIHNsYXZlOiAqLworCQkJaWYgKCFlcWxfaXNfbWFzdGVyKHNsYXZlX2RldikgJiYKKwkJCSAgICAhZXFsX2lzX3NsYXZlKHNsYXZlX2RldikpIHsKKwkJCQlzbGF2ZV90ICpzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKwkJCQllcXVhbGl6ZXJfdCAqZXFsID0gbmV0ZGV2X3ByaXYobWFzdGVyX2Rldik7CisJCQkJaW50IHJldDsKKworCQkJCWlmICghcykgeworCQkJCQlkZXZfcHV0KHNsYXZlX2Rldik7CisJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCX0KKworCQkJCW1lbXNldChzLCAwLCBzaXplb2YoKnMpKTsKKwkJCQlzLT5kZXYgPSBzbGF2ZV9kZXY7CisJCQkJcy0+cHJpb3JpdHkgPSBzcnEucHJpb3JpdHk7CisJCQkJcy0+cHJpb3JpdHlfYnBzID0gc3JxLnByaW9yaXR5OworCQkJCXMtPnByaW9yaXR5X0JwcyA9IHNycS5wcmlvcml0eSAvIDg7CisKKwkJCQlzcGluX2xvY2tfYmgoJmVxbC0+cXVldWUubG9jayk7CisJCQkJcmV0ID0gX19lcWxfaW5zZXJ0X3NsYXZlKCZlcWwtPnF1ZXVlLCBzKTsKKwkJCQlpZiAocmV0KSB7CisJCQkJCWRldl9wdXQoc2xhdmVfZGV2KTsKKwkJCQkJa2ZyZWUocyk7CisJCQkJfQorCQkJCXNwaW5fdW5sb2NrX2JoKCZlcWwtPnF1ZXVlLmxvY2spOworCisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCQlkZXZfcHV0KHNsYXZlX2Rldik7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgZXFsX2VtYW5jaXBhdGUoc3RydWN0IG5ldF9kZXZpY2UgKm1hc3Rlcl9kZXYsIHNsYXZpbmdfcmVxdWVzdF90IF9fdXNlciAqc3JxcCkKK3sKKwllcXVhbGl6ZXJfdCAqZXFsID0gbmV0ZGV2X3ByaXYobWFzdGVyX2Rldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldjsKKwlzbGF2aW5nX3JlcXVlc3RfdCBzcnE7CisJaW50IHJldDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc3JxLCBzcnFwLCBzaXplb2YgKHNsYXZpbmdfcmVxdWVzdF90KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc2xhdmVfZGV2ID0gZGV2X2dldF9ieV9uYW1lKHNycS5zbGF2ZV9uYW1lKTsKKwlyZXQgPSAtRUlOVkFMOworCWlmIChzbGF2ZV9kZXYpIHsKKwkJc3Bpbl9sb2NrX2JoKCZlcWwtPnF1ZXVlLmxvY2spOworCisJCWlmIChlcWxfaXNfc2xhdmUoc2xhdmVfZGV2KSkgeworCQkJc2xhdmVfdCAqc2xhdmUgPSBfX2VxbF9maW5kX3NsYXZlX2RldigmZXFsLT5xdWV1ZSwKKwkJCQkJCQkgICAgICBzbGF2ZV9kZXYpOworCisJCQlpZiAoc2xhdmUpIHsKKwkJCQllcWxfa2lsbF9vbmVfc2xhdmUoc2xhdmUpOworCQkJCXJldCA9IDA7CisJCQl9CisJCX0KKwkJZGV2X3B1dChzbGF2ZV9kZXYpOworCisJCXNwaW5fdW5sb2NrX2JoKCZlcWwtPnF1ZXVlLmxvY2spOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXFsX2dfc2xhdmVfY2ZnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNsYXZlX2NvbmZpZ190IF9fdXNlciAqc2NwKQoreworCWVxdWFsaXplcl90ICplcWwgPSBuZXRkZXZfcHJpdihkZXYpOworCXNsYXZlX3QgKnNsYXZlOworCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXY7CisJc2xhdmVfY29uZmlnX3Qgc2M7CisJaW50IHJldDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc2MsIHNjcCwgc2l6ZW9mIChzbGF2ZV9jb25maWdfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNsYXZlX2RldiA9IGRldl9nZXRfYnlfbmFtZShzYy5zbGF2ZV9uYW1lKTsKKwlpZiAoIXNsYXZlX2RldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2JoKCZlcWwtPnF1ZXVlLmxvY2spOworCWlmIChlcWxfaXNfc2xhdmUoc2xhdmVfZGV2KSkgeworCQlzbGF2ZSA9IF9fZXFsX2ZpbmRfc2xhdmVfZGV2KCZlcWwtPnF1ZXVlLCBzbGF2ZV9kZXYpOworCQlpZiAoc2xhdmUpIHsKKwkJCXNjLnByaW9yaXR5ID0gc2xhdmUtPnByaW9yaXR5OworCQkJcmV0ID0gMDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmZXFsLT5xdWV1ZS5sb2NrKTsKKworCWRldl9wdXQoc2xhdmVfZGV2KTsKKworCWlmICghcmV0ICYmIGNvcHlfdG9fdXNlcihzY3AsICZzYywgc2l6ZW9mIChzbGF2ZV9jb25maWdfdCkpKQorCQlyZXQgPSAtRUZBVUxUOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlcWxfc19zbGF2ZV9jZmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2xhdmVfY29uZmlnX3QgX191c2VyICpzY3ApCit7CisJc2xhdmVfdCAqc2xhdmU7CisJZXF1YWxpemVyX3QgKmVxbDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2OworCXNsYXZlX2NvbmZpZ190IHNjOworCWludCByZXQ7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnNjLCBzY3AsIHNpemVvZiAoc2xhdmVfY29uZmlnX3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzbGF2ZV9kZXYgPSBkZXZfZ2V0X2J5X25hbWUoc2Muc2xhdmVfbmFtZSk7CisJaWYgKCFzbGF2ZV9kZXYpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gLUVJTlZBTDsKKworCWVxbCA9IG5ldGRldl9wcml2KGRldik7CisJc3Bpbl9sb2NrX2JoKCZlcWwtPnF1ZXVlLmxvY2spOworCWlmIChlcWxfaXNfc2xhdmUoc2xhdmVfZGV2KSkgeworCQlzbGF2ZSA9IF9fZXFsX2ZpbmRfc2xhdmVfZGV2KCZlcWwtPnF1ZXVlLCBzbGF2ZV9kZXYpOworCQlpZiAoc2xhdmUpIHsKKwkJCXNsYXZlLT5wcmlvcml0eSA9IHNjLnByaW9yaXR5OworCQkJc2xhdmUtPnByaW9yaXR5X2JwcyA9IHNjLnByaW9yaXR5OworCQkJc2xhdmUtPnByaW9yaXR5X0JwcyA9IHNjLnByaW9yaXR5IC8gODsKKwkJCXJldCA9IDA7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJmVxbC0+cXVldWUubG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVxbF9nX21hc3Rlcl9jZmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbWFzdGVyX2NvbmZpZ190IF9fdXNlciAqbWNwKQoreworCWVxdWFsaXplcl90ICplcWw7CisJbWFzdGVyX2NvbmZpZ190IG1jOworCisJaWYgKGVxbF9pc19tYXN0ZXIoZGV2KSkgeworCQllcWwgPSBuZXRkZXZfcHJpdihkZXYpOworCQltYy5tYXhfc2xhdmVzID0gZXFsLT5tYXhfc2xhdmVzOworCQltYy5taW5fc2xhdmVzID0gZXFsLT5taW5fc2xhdmVzOworCQlpZiAoY29weV90b191c2VyKG1jcCwgJm1jLCBzaXplb2YgKG1hc3Rlcl9jb25maWdfdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBlcWxfc19tYXN0ZXJfY2ZnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIG1hc3Rlcl9jb25maWdfdCBfX3VzZXIgKm1jcCkKK3sKKwllcXVhbGl6ZXJfdCAqZXFsOworCW1hc3Rlcl9jb25maWdfdCBtYzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbWMsIG1jcCwgc2l6ZW9mIChtYXN0ZXJfY29uZmlnX3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZXFsX2lzX21hc3RlcihkZXYpKSB7CisJCWVxbCA9IG5ldGRldl9wcml2KGRldik7CisJCWVxbC0+bWF4X3NsYXZlcyA9IG1jLm1heF9zbGF2ZXM7CisJCWVxbC0+bWluX3NsYXZlcyA9IG1jLm1pbl9zbGF2ZXM7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfZXFsOworCitzdGF0aWMgaW50IF9faW5pdCBlcWxfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgZXJyOworCisJcHJpbnRrKHZlcnNpb24pOworCisJZGV2X2VxbCA9IGFsbG9jX25ldGRldihzaXplb2YoZXF1YWxpemVyX3QpLCAiZXFsIiwgZXFsX3NldHVwKTsKKwlpZiAoIWRldl9lcWwpCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldl9lcWwpOworCWlmIChlcnIpIAorCQlmcmVlX25ldGRldihkZXZfZXFsKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXFsX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2X2VxbCk7CisJZnJlZV9uZXRkZXYoZGV2X2VxbCk7Cit9CisKK21vZHVsZV9pbml0KGVxbF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChlcWxfY2xlYW51cF9tb2R1bGUpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXMzMjEwLmMgYi9kcml2ZXJzL25ldC9lczMyMTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWU4MTUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXMzMjEwLmMKQEAgLTAsMCArMSw0NzggQEAKKy8qCisJZXMzMjEwLmMKKworCUxpbnV4IGRyaXZlciBmb3IgUmFjYWwtSW50ZXJsYW4gRVMzMjEwIEVJU0EgTmV0d29yayBBZGFwdGVyCisKKwlDb3B5cmlnaHQgKEMpIDE5OTYsIFBhdWwgR29ydG1ha2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlJbmZvcm1hdGlvbiBhbmQgQ29kZSBTb3VyY2VzOgorCisJMSkgVGhlIGV4aXN0aW5nIG15cmlhZCBvZiBMaW51eCA4MzkwIGRyaXZlcnMgd3JpdHRlbiBieSBEb25hbGQgQmVja2VyLgorCisJMikgT25jZSBhZ2FpbiBSdXNzIE5lbHNvbidzIGFzbSBwYWNrZXQgZHJpdmVyIHByb3ZpZGVkIGFkZGl0aW9uYWwgaW5mby4KKworCTMpIEluZm8gZm9yIGdldHRpbmcgSVJRIGFuZCBzaC1tZW0gZ2xlYW5lZCBmcm9tIHRoZSBFSVNBIGNmZyBmaWxlcy4KKwkgICBUb28gYmFkIGl0IGRvZXNuJ3Qgd29yayAtLSBzZWUgYmVsb3cuCisKKwlUaGUgRVMzMjEwIGlzIGFuIEVJU0Egc2hhcmVkIG1lbW9yeSBOUzgzOTAgaW1wbGVtZW50YXRpb24uIE5vdGUKKwl0aGF0IGFsbCBtZW1vcnkgY29waWVzIHRvL2Zyb20gdGhlIGJvYXJkIG11c3QgYmUgMzJiaXQgdHJhbnNmZXJzLgorCVdoaWNoIHJ1bGVzIG91dCB1c2luZyBldGhfaW9fY29weV9hbmRfc3VtKCkgaW4gdGhpcyBkcml2ZXIuCisKKwlBcHBhcmVudGx5IHRoZXJlIGFyZSB0d28gc2xpZ2h0bHkgZGlmZmVyZW50IHJldmlzaW9ucyBvZiB0aGUKKwljYXJkLCBzaW5jZSB0aGVyZSBhcmUgdHdvIGRpc3RpbmN0IEVJU0EgY2ZnIGZpbGVzICghcmlpMDEwMS5jZmcKKwlhbmQgIXJpaTAxMDIuY2ZnKSBPbmUgaGFzIG1lZGlhIHNlbGVjdCBpbiB0aGUgY2ZnIGZpbGUgYW5kIHRoZQorCW90aGVyIGRvZXNuJ3QuIEhvcGVmdWxseSB0aGlzIHdpbGwgd29yayB3aXRoIGVpdGhlci4KKworCVRoYXQgaXMgYWJvdXQgYWxsIEkgY2FuIHRlbGwgeW91IGFib3V0IGl0LCBoYXZpbmcgbmV2ZXIgYWN0dWFsbHkKKwlldmVuIHNlZW4gb25lIG9mIHRoZXNlIGNhcmRzLiA6KSAgVHJ5IGh0dHA6Ly93d3cuaW50ZXJsYW4uY29tCisJaWYgeW91IHdhbnQgbW9yZSBpbmZvLgorCisJVGhhbmtzIGdvIHRvIE1hcmsgU2FsYXphciBmb3IgdGVzdGluZyB2MC4wMiBvZiB0aGlzIGRyaXZlci4KKworCUJ1Z3MsIHRvLWZpeCwgZXRjOgorCisJMSkgVGhlIEVJU0EgY2ZnIHBvcnRzIHRoYXQgYXJlICpzdXBwb3NlZCogdG8gaGF2ZSB0aGUgSVJRIGFuZCBzaGFyZWQKKwkgICBtZW0gdmFsdWVzIGp1c3QgcmVhZCAweGZmIGFsbCB0aGUgdGltZS4gSHJybXBmLiBBcHBhcmVudGx5IHRoZQorCSAgIHNhbWUgaGFwcGVucyB3aXRoIHRoZSBwYWNrZXQgZHJpdmVyIGFzIHRoZSBjb2RlIGZvciByZWFkaW5nCisJICAgdGhlc2UgcmVnaXN0ZXJzIGlzIGRpc2FibGVkIHRoZXJlLiBJbiB0aGUgbWVhbnRpbWUsIGJvb3Qgd2l0aDoKKwkgICBldGhlcj08SVJRPiwwLDB4PHNoYXJlZF9tZW1fYWRkcj4sZXRoMCB0byBvdmVycmlkZSB0aGUgSVJRIGFuZAorCSAgIHNoYXJlZCBtZW1vcnkgZGV0ZWN0aW9uLiAoVGhlIGkvbyBwb3J0IGRldGVjdGlvbiBpcyBva2F5LikKKworCTIpIE1vZHVsZSBzdXBwb3J0IGN1cnJlbnRseSB1bnRlc3RlZC4gUHJvYmFibHkgd29ya3MgdGhvdWdoLgorCisqLworCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPQorCSJlczMyMTAuYzogRHJpdmVyIHJldmlzaW9uIHYwLjAzLCAxNC8wOS85NlxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vpc2EuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSAiODM5MC5oIgorCitzdGF0aWMgaW50IGVzX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKTsKKworc3RhdGljIGludCBlc19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBlc19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHZvaWQgZXNfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHZvaWQgZXNfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsIGludCByaW5nX3BhZ2UpOworc3RhdGljIHZvaWQgZXNfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQgZXNfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RhcnRfcGFnZSk7CisKKyNkZWZpbmUgRVNfU1RBUlRfUEcJMHgwMCAgICAvKiBGaXJzdCBwYWdlIG9mIFRYIGJ1ZmZlcgkJKi8KKyNkZWZpbmUgRVNfU1RPUF9QRwkweDQwICAgIC8qIExhc3QgcGFnZSArMSBvZiBSWCByaW5nCQkqLworCisjZGVmaW5lIEVTX0lPX0VYVEVOVAkweDM3CS8qIFRoZSBjZmcgZmlsZSBzYXlzIDB4YzkwIC0+IDB4Y2M3CSovCisjZGVmaW5lIEVTX0lEX1BPUlQJMHhjODAJLyogU2FtZSBmb3IgYWxsIEVJU0EgY2FyZHMgCQkqLworI2RlZmluZSBFU19TQV9QUk9NCTB4YzkwCS8qIFN0YXJ0IG9mIGUnbmV0IGFkZHIuCQkJKi8KKyNkZWZpbmUgRVNfUkVTRVRfUE9SVAkweGM4NAkvKiBGcm9tIHRoZSBwYWNrZXQgZHJpdmVyIHNvdXJjZQkqLworI2RlZmluZSBFU19OSUNfT0ZGU0VUCTB4Y2EwCS8qIEhlbGxvLCB0aGUgODM5MCBpcyAqaGVyZSoJCSovCisKKyNkZWZpbmUgRVNfQUREUjAJMHgwMgkvKiAzIGJ5dGUgdmVuZG9yIHByZWZpeAkJCSovCisjZGVmaW5lIEVTX0FERFIxCTB4MDcKKyNkZWZpbmUgRVNfQUREUjIJMHgwMQorCisvKgorICogVHdvIGNhcmQgcmV2aXNpb25zLiBFSVNBIElEJ3MgYXJlIGFsd2F5cyByZXYuIG1pbm9yLCByZXYuIG1ham9yLCwgYW5kCisgKiB0aGVuIHRoZSB0aHJlZSB2ZW5kb3IgbGV0dGVycyBzdG9yZWQgaW4gNSBiaXRzIGVhY2gsIHdpdGggYW4gImEiID0gMS4KKyAqIEZvciBlZzogInJpaSIgPSAxMDAxMCAwMTAwMSAwMTAwMSA9IDB4NDkyOSwgd2hpY2ggaXMgaG93IHRoZSBFSVNBCisgKiBjb25maWcgdXRpbGl0eSBkZXRlcm1pbmVzIGF1dG9tYWdpY2FsbHkgd2hhdCBjb25maWcgZmlsZShzKSB0byB1c2UuCisgKi8KKyNkZWZpbmUgRVNfRUlTQV9JRDEJMHgwMTAxMjk0OQkvKiAhcmlpMDEwMS5jZmcgCQkqLworI2RlZmluZSBFU19FSVNBX0lEMgkweDAyMDEyOTQ5CS8qICFyaWkwMTAyLmNmZyAJCSovCisKKyNkZWZpbmUgRVNfQ0ZHMQkJMHhjYzAJLyogSU9QT1JUKDEpIC0tPiBJT1BPUlQoNikgaW4gY2ZnIGZpbGUJKi8KKyNkZWZpbmUgRVNfQ0ZHMgkJMHhjYzEKKyNkZWZpbmUgRVNfQ0ZHMwkJMHhjYzIKKyNkZWZpbmUgRVNfQ0ZHNAkJMHhjYzMKKyNkZWZpbmUgRVNfQ0ZHNQkJMHhjYzQKKyNkZWZpbmUgRVNfQ0ZHNgkJMHhjODQJLyogTkI6IDB4Yzg0IGlzIGFsc28gInJlc2V0IiBwb3J0LgkqLworCisvKgorICoJWW91IGNhbiBPUiBhbnkgb2YgdGhlIGZvbGxvd2luZyBiaXRzIHRvZ2V0aGVyIGFuZCBhc3NpZ24gaXQKKyAqCXRvIEVTX0RFQlVHIHRvIGdldCB2ZXJib3NlIGRyaXZlciBpbmZvIGR1cmluZyBvcGVyYXRpb24uCisgKglTb21lIG9mIHRoZXNlIGRvbid0IGRvIGFueXRoaW5nIHlldC4KKyAqLworCisjZGVmaW5lIEVTX0RfUFJPQkUJMHgwMQorI2RlZmluZSBFU19EX1JYX1BLVAkweDAyCisjZGVmaW5lIEVTX0RfVFhfUEtUCTB4MDQKKyNkZWZpbmUgRURfRF9JUlEJMHgwOAorCisjZGVmaW5lIEVTX0RFQlVHCTAKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbG9faXJxX21hcFtdIF9faW5pdGRhdGEgPSB7MywgNCwgNSwgNiwgNywgOSwgMTB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgaGlfaXJxX21hcFtdIF9faW5pdGRhdGEgPSB7MTEsIDEyLCAwLCAxNCwgMCwgMCwgMCwgMTV9OworCisvKgorICoJUHJvYmUgZm9yIHRoZSBjYXJkLiBUaGUgYmVzdCB3YXkgaXMgdG8gcmVhZCB0aGUgRUlTQSBJRCBpZiBpdAorICoJaXMga25vd24uIFRoZW4gd2UgY2hlY2sgdGhlIHByZWZpeCBvZiB0aGUgc3RhdGlvbiBhZGRyZXNzCisgKglQUk9NIGZvciBhIG1hdGNoIGFnYWluc3QgdGhlIFJhY2FsLUludGVybGFuIGFzc2lnbmVkIHZhbHVlLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGRvX2VzX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGlycSA9IGRldi0+aXJxOworCWludCBtZW1fc3RhcnQgPSBkZXYtPm1lbV9zdGFydDsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWlmIChpb2FkZHIgPiAweDFmZikJCS8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KKwkJcmV0dXJuIGVzX3Byb2JlMShkZXYsIGlvYWRkcik7CisJZWxzZSBpZiAoaW9hZGRyID4gMCkJCS8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKwkJcmV0dXJuIC1FTlhJTzsKKworCWlmICghRUlTQV9idXMpIHsKKyNpZiBFU19ERUJVRyAmIEVTX0RfUFJPQkUKKwkJcHJpbnRrKCJlczMyMTAuYzogTm90IEVJU0EgYnVzLiBOb3QgcHJvYmluZyBoaWdoIHBvcnRzLlxuIik7CisjZW5kaWYKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkvKiBFSVNBIHNwZWMgYWxsb3dzIGZvciB1cCB0byAxNiBzbG90cywgYnV0IDggaXMgdHlwaWNhbC4gKi8KKwlmb3IgKGlvYWRkciA9IDB4MTAwMDsgaW9hZGRyIDwgMHg5MDAwOyBpb2FkZHIgKz0gMHgxMDAwKSB7CisJCWlmIChlc19wcm9iZTEoZGV2LCBpb2FkZHIpID09IDApCisJCQlyZXR1cm4gMDsKKwkJZGV2LT5pcnEgPSBpcnE7CisJCWRldi0+bWVtX3N0YXJ0ID0gbWVtX3N0YXJ0OworCX0KKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRVNfSU9fRVhURU5UKTsKKwlpb3VubWFwKGVpX3N0YXR1cy5tZW0pOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgZXNfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2VpX25ldGRldigpOworCWludCBlcnI7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKworCWVyciA9IGRvX2VzX3Byb2JlKGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCWNsZWFudXBfY2FyZChkZXYpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBlc19wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKwlpbnQgaSwgcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgZWlzYV9pZDsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyICsgRVNfU0FfUFJPTSwgRVNfSU9fRVhURU5ULCAiZXMzMjEwIikpCisJCXJldHVybiAtRU5PREVWOworCisjaWYgRVNfREVCVUcgJiBFU19EX1BST0JFCisJcHJpbnRrKCJlczMyMTAuYzogcHJvYmUgYXQgJSN4LCBJRCAlIzh4XG4iLCBpb2FkZHIsIGlubChpb2FkZHIgKyBFU19JRF9QT1JUKSk7CisJcHJpbnRrKCJlczMyMTAuYzogY29uZmlnIHJlZ3M6ICUjeCAlI3ggJSN4ICUjeCAlI3ggJSN4XG4iLAorCQlpbmIoaW9hZGRyICsgRVNfQ0ZHMSksIGluYihpb2FkZHIgKyBFU19DRkcyKSwgaW5iKGlvYWRkciArIEVTX0NGRzMpLAorCQlpbmIoaW9hZGRyICsgRVNfQ0ZHNCksIGluYihpb2FkZHIgKyBFU19DRkc1KSwgaW5iKGlvYWRkciArIEVTX0NGRzYpKTsKKyNlbmRpZgorCisKKy8qCUNoZWNrIHRoZSBFSVNBIElEIG9mIHRoZSBjYXJkLiAqLworCWVpc2FfaWQgPSBpbmwoaW9hZGRyICsgRVNfSURfUE9SVCk7CisJaWYgKChlaXNhX2lkICE9IEVTX0VJU0FfSUQxKSAmJiAoZWlzYV9pZCAhPSBFU19FSVNBX0lEMikpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisvKglDaGVjayB0aGUgUmFjYWwgdmVuZG9yIElEIGFzIHdlbGwuICovCisJaWYgKGluYihpb2FkZHIgKyBFU19TQV9QUk9NICsgMCkgIT0gRVNfQUREUjAKKwkJfHwgaW5iKGlvYWRkciArIEVTX1NBX1BST00gKyAxKSAhPSBFU19BRERSMQorCQl8fCBpbmIoaW9hZGRyICsgRVNfU0FfUFJPTSArIDIpICE9IEVTX0FERFIyICkgeworCQlwcmludGsoImVzMzIxMC5jOiBjYXJkIG5vdCBmb3VuZCIpOworCQlmb3IoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKQorCQkJcHJpbnRrKCIgJTAyeCIsIGluYihpb2FkZHIgKyBFU19TQV9QUk9NICsgaSkpOworCQlwcmludGsoIiAoaW52YWxpZCBwcmVmaXgpLlxuIik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCXByaW50aygiZXMzMjEwLmM6IEVTMzIxMCByZXYuICVsZCBhdCAlI3gsIG5vZGUiLCBlaXNhX2lkPj4yNCwgaW9hZGRyKTsKKwlmb3IoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKQorCQlwcmludGsoIiAlMDJ4IiwgKGRldi0+ZGV2X2FkZHJbaV0gPSBpbmIoaW9hZGRyICsgRVNfU0FfUFJPTSArIGkpKSk7CisKKwkvKiBTbmFyZiB0aGUgaW50ZXJydXB0IG5vdy4gKi8KKwlpZiAoZGV2LT5pcnEgPT0gMCkgeworCQl1bnNpZ25lZCBjaGFyIGhpX2lycSA9IGluYihpb2FkZHIgKyBFU19DRkcyKSAmIDB4MDc7CisJCXVuc2lnbmVkIGNoYXIgbG9faXJxID0gaW5iKGlvYWRkciArIEVTX0NGRzEpICYgMHhmZTsKKworCQlpZiAoaGlfaXJxICE9IDApIHsKKwkJCWRldi0+aXJxID0gaGlfaXJxX21hcFtoaV9pcnEgLSAxXTsKKwkJfSBlbHNlIHsKKwkJCWludCBpID0gMDsKKwkJCXdoaWxlIChsb19pcnEgPiAoMTw8aSkpIGkrKzsKKwkJCWRldi0+aXJxID0gbG9faXJxX21hcFtpXTsKKwkJfQorCQlwcmludGsoIiB1c2luZyBJUlEgJWQiLCBkZXYtPmlycSk7CisjaWYgRVNfREVCVUcgJiBFU19EX1BST0JFCisJCXByaW50aygiZXMzMjEwLmM6IGhpX2lycSAlI3gsIGxvX2lycSAlI3gsIGRldi0+aXJxID0gJWRcbiIsCisJCQkJCWhpX2lycSwgbG9faXJxLCBkZXYtPmlycSk7CisjZW5kaWYKKwl9IGVsc2UgeworCQlpZiAoZGV2LT5pcnEgPT0gMikKKwkJCWRldi0+aXJxID0gOTsJCQkvKiBEb2ghICovCisJCXByaW50aygiIGFzc2lnbmluZyBJUlEgJWQiLCBkZXYtPmlycSk7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBlaV9pbnRlcnJ1cHQsIDAsICJlczMyMTAiLCBkZXYpKSB7CisJCXByaW50ayAoIiB1bmFibGUgdG8gZ2V0IElSUSAlZC5cbiIsIGRldi0+aXJxKTsKKwkJcmV0dmFsID0gLUVBR0FJTjsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGRldi0+bWVtX3N0YXJ0ID09IDApIHsKKwkJdW5zaWduZWQgY2hhciBtZW1fZW5hYmxlZCA9IGluYihpb2FkZHIgKyBFU19DRkcyKSAmIDB4YzA7CisJCXVuc2lnbmVkIGNoYXIgbWVtX2JpdHMgPSBpbmIoaW9hZGRyICsgRVNfQ0ZHMykgJiAweDA3OworCisJCWlmIChtZW1fZW5hYmxlZCAhPSAweDgwKSB7CisJCQlwcmludGsoIiBzaGFyZWQgbWVtIGRpc2FibGVkIC0gZ2l2aW5nIHVwXG4iKTsKKwkJCXJldHZhbCA9IC1FTlhJTzsKKwkJCWdvdG8gb3V0MTsKKwkJfQorCQlkZXYtPm1lbV9zdGFydCA9IDB4QzAwMDAgKyBtZW1fYml0cyoweDQwMDA7CisJCXByaW50aygiIHVzaW5nICIpOworCX0gZWxzZSB7CisJCXByaW50aygiIGFzc2lnbmluZyAiKTsKKwl9CisKKwllaV9zdGF0dXMubWVtID0gaW9yZW1hcChkZXYtPm1lbV9zdGFydCwgKEVTX1NUT1BfUEcgLSBFU19TVEFSVF9QRykqMjU2KTsKKwlpZiAoIWVpX3N0YXR1cy5tZW0pIHsKKwkJcHJpbnRrKCJpb3JlbWFwIGZhaWxlZCAtIGdpdmluZyB1cFxuIik7CisJCXJldHZhbCA9IC1FTlhJTzsKKwkJZ290byBvdXQxOworCX0KKworCWRldi0+bWVtX2VuZCA9IGRldi0+bWVtX3N0YXJ0ICsgKEVTX1NUT1BfUEcgLSBFU19TVEFSVF9QRykqMjU2OworCisJcHJpbnRrKCJtZW0gJSNseC0lI2x4XG4iLCBkZXYtPm1lbV9zdGFydCwgZGV2LT5tZW1fZW5kLTEpOworCisjaWYgRVNfREVCVUcgJiBFU19EX1BST0JFCisJaWYgKGluYihpb2FkZHIgKyBFU19DRkc1KSkKKwkJcHJpbnRrKCJlczMyMTA6IFdhcm5pbmcgLSBETUEgY2hhbm5lbCBlbmFibGVkLCBidXQgbm90IHVzZWQgaGVyZS5cbiIpOworI2VuZGlmCisJLyogTm90ZSwgcG9pbnQgYXQgdGhlIDgzOTAsIGFuZCBub3QgdGhlIGNhcmQuLi4gKi8KKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkciArIEVTX05JQ19PRkZTRVQ7CisKKwllaV9zdGF0dXMubmFtZSA9ICJFUzMyMTAiOworCWVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gRVNfU1RBUlRfUEc7CisJZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPSBFU19TVEFSVF9QRyArIFRYX1BBR0VTOworCWVpX3N0YXR1cy5zdG9wX3BhZ2UgPSBFU19TVE9QX1BHOworCWVpX3N0YXR1cy53b3JkMTYgPSAxOworCisJaWYgKGVpX2RlYnVnID4gMCkKKwkJcHJpbnRrKHZlcnNpb24pOworCisJZWlfc3RhdHVzLnJlc2V0XzgzOTAgPSAmZXNfcmVzZXRfODM5MDsKKwllaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmZXNfYmxvY2tfaW5wdXQ7CisJZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZlc19ibG9ja19vdXRwdXQ7CisJZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZlc19nZXRfODM5MF9oZHI7CisKKwlkZXYtPm9wZW4gPSAmZXNfb3BlbjsKKwlkZXYtPnN0b3AgPSAmZXNfY2xvc2U7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CisjZW5kaWYKKwlOUzgzOTBfaW5pdChkZXYsIDApOworCXJldHVybiAwOworb3V0MToKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKK291dDoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIgKyBFU19TQV9QUk9NLCBFU19JT19FWFRFTlQpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKglSZXNldCBhcyBwZXIgdGhlIHBhY2tldCBkcml2ZXIgbWV0aG9kLiBKdWRnaW5nIGJ5IHRoZSBFSVNBIGNmZworICoJZmlsZSwgdGhpcyBqdXN0IHRvZ2dsZXMgdGhlICJCb2FyZCBFbmFibGUiIGJpdHMgKGJpdCAyIGFuZCAwKS4KKyAqLworCitzdGF0aWMgdm9pZCBlc19yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBlbmQ7CisKKwlvdXRiKDB4MDQsIGlvYWRkciArIEVTX1JFU0VUX1BPUlQpOworCWlmIChlaV9kZWJ1ZyA+IDEpIHByaW50aygiJXM6IHJlc2V0dGluZyB0aGUgRVMzMjEwLi4uIiwgZGV2LT5uYW1lKTsKKworCWVuZCA9IGppZmZpZXMgKyAyKkhaLzEwMDsKKyAgICAgICAgd2hpbGUgKChzaWduZWQpKGVuZCAtIGppZmZpZXMpID4gMCkgY29udGludWU7CisKKwllaV9zdGF0dXMudHhpbmcgPSAwOworCW91dGIoMHgwMSwgaW9hZGRyICsgRVNfUkVTRVRfUE9SVCk7CisJaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCJyZXNldCBkb25lXG4iKTsKKworCXJldHVybjsKK30KKworLyoKKyAqCU5vdGU6IEluIHRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGlzIHRoZSBpbXBsaWNpdCBhc3N1bXB0aW9uCisgKgl0aGF0IHRoZSBhc3NvY2lhdGVkIG1lbWNweSB3aWxsIG9ubHkgdXNlICJyZXA7IG1vdnNsIiBhcyBsb25nIGFzCisgKgl3ZSBrZWVwIHRoZSBjb3VudHMgYXMgc29tZSBtdWx0aXBsZSBvZiBkb3VibGV3b3Jkcy4gVGhpcyBpcyBhCisgKglyZXF1aXJlbWVudCBvZiB0aGUgaGFyZHdhcmUsIGFuZCBhbHNvIHByZXZlbnRzIHVzIGZyb20gdXNpbmcKKyAqCWV0aF9pb19jb3B5X2FuZF9zdW0oKSBzaW5jZSB3ZSBjYW4ndCBndWFyYW50ZWUgaXQgd2lsbCBsaW1pdAorICoJaXRzZWxmIHRvIGRvdWJsZXdvcmQgYWNjZXNzLgorICovCisKKy8qCisgKglHcmFiIHRoZSA4MzkwIHNwZWNpZmljIGhlYWRlci4gU2ltaWxhciB0byB0aGUgYmxvY2tfaW5wdXQgcm91dGluZSwgYnV0CisgKgl3ZSBkb24ndCBuZWVkIHRvIGJlIGNvbmNlcm5lZCB3aXRoIHJpbmcgd3JhcCBhcyB0aGUgaGVhZGVyIHdpbGwgYmUgYXQKKyAqCXRoZSBzdGFydCBvZiBhIHBhZ2UsIHNvIHdlIG9wdGltaXplIGFjY29yZGluZ2x5LiAoQSBzaW5nbGUgZG91Ymxld29yZC4pCisgKi8KKworc3RhdGljIHZvaWQKK2VzX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQoreworCXZvaWQgX19pb21lbSAqaGRyX3N0YXJ0ID0gZWlfc3RhdHVzLm1lbSArICgocmluZ19wYWdlIC0gRVNfU1RBUlRfUEcpPDw4KTsKKwltZW1jcHlfZnJvbWlvKGhkciwgaGRyX3N0YXJ0LCBzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpKTsKKwloZHItPmNvdW50ID0gKGhkci0+Y291bnQgKyAzKSAmIH4zOyAgICAgLyogUm91bmQgdXAgYWxsb2NhdGlvbi4gKi8KK30KKworLyoKKyAqCUJsb2NrIGlucHV0IGFuZCBvdXRwdXQgYXJlIGVhc3kgb24gc2hhcmVkIG1lbW9yeSBldGhlcmNhcmRzLCB0aGUgb25seQorICoJY29tcGxpY2F0aW9uIGlzIHdoZW4gdGhlIHJpbmcgYnVmZmVyIHdyYXBzLiBUaGUgY291bnQgd2lsbCBhbHJlYWR5CisgKgliZSByb3VuZGVkIHVwIHRvIGEgZG91Ymxld29yZCB2YWx1ZSB2aWEgZXNfZ2V0XzgzOTBfaGRyKCkgYWJvdmUuCisgKi8KKworc3RhdGljIHZvaWQgZXNfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkJICBpbnQgcmluZ19vZmZzZXQpCit7CisJdm9pZCBfX2lvbWVtICp4ZmVyX3N0YXJ0ID0gZWlfc3RhdHVzLm1lbSArIHJpbmdfb2Zmc2V0IC0gRVNfU1RBUlRfUEcqMjU2OworCisJaWYgKHJpbmdfb2Zmc2V0ICsgY291bnQgPiBFU19TVE9QX1BHKjI1NikgeworCQkvKiBQYWNrZXQgd3JhcHMgb3ZlciBlbmQgb2YgcmluZyBidWZmZXIuICovCisJCWludCBzZW1pX2NvdW50ID0gRVNfU1RPUF9QRyoyNTYgLSByaW5nX29mZnNldDsKKwkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEsIHhmZXJfc3RhcnQsIHNlbWlfY291bnQpOworCQljb3VudCAtPSBzZW1pX2NvdW50OworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSArIHNlbWlfY291bnQsIGVpX3N0YXR1cy5tZW0sIGNvdW50KTsKKwl9IGVsc2UgeworCQkvKiBQYWNrZXQgaXMgaW4gb25lIGNodW5rLiAqLworCQlldGhfaW9fY29weV9hbmRfc3VtKHNrYiwgeGZlcl9zdGFydCwgY291bnQsIDApOworCX0KK30KKworc3RhdGljIHZvaWQgZXNfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydF9wYWdlKQoreworCXZvaWQgX19pb21lbSAqc2htZW0gPSBlaV9zdGF0dXMubWVtICsgKChzdGFydF9wYWdlIC0gRVNfU1RBUlRfUEcpPDw4KTsKKworCWNvdW50ID0gKGNvdW50ICsgMykgJiB+MzsgICAgIC8qIFJvdW5kIHVwIHRvIGRvdWJsZXdvcmQgKi8KKwltZW1jcHlfdG9pbyhzaG1lbSwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgZXNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWVpX29wZW4oZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlc19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJaWYgKGVpX2RlYnVnID4gMSkKKwkJcHJpbnRrKCIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQuXG4iLCBkZXYtPm5hbWUpOworCisJZWlfY2xvc2UoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIE1PRFVMRQorI2RlZmluZSBNQVhfRVNfQ0FSRFMJNAkvKiBNYXggbnVtYmVyIG9mIEVTMzIxMCBjYXJkcyBwZXIgbW9kdWxlICovCisjZGVmaW5lIE5BTUVMRU4JCTgJLyogIyBvZiBjaGFycyBmb3Igc3RvcmluZyBkZXYtPm5hbWUgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X2VzMzIxMFtNQVhfRVNfQ0FSRFNdOworc3RhdGljIGludCBpb1tNQVhfRVNfQ0FSRFNdOworc3RhdGljIGludCBpcnFbTUFYX0VTX0NBUkRTXTsKK3N0YXRpYyBpbnQgbWVtW01BWF9FU19DQVJEU107CisKK21vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkobWVtLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBiYXNlIGFkZHJlc3MoZXMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSBudW1iZXIocykiKTsKK01PRFVMRV9QQVJNX0RFU0MobWVtLCAibWVtb3J5IGJhc2UgYWRkcmVzcyhlcykiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmFjYWwtSW50ZXJsYW4gRVMzMjEwIEVJU0EgZXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK2ludAoraW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCB0aGlzX2RldiwgZm91bmQgPSAwOworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX0VTX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCWlmIChpb1t0aGlzX2Rldl0gPT0gMCAmJiB0aGlzX2RldiAhPSAwKQorCQkJYnJlYWs7CisJCWRldiA9IGFsbG9jX2VpX25ldGRldigpOworCQlpZiAoIWRldikKKwkJCWJyZWFrOworCQlkZXYtPmlycSA9IGlycVt0aGlzX2Rldl07CisJCWRldi0+YmFzZV9hZGRyID0gaW9bdGhpc19kZXZdOworCQlkZXYtPm1lbV9zdGFydCA9IG1lbVt0aGlzX2Rldl07CisJCWlmIChkb19lc19wcm9iZShkZXYpID09IDApIHsKKwkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7CisJCQkJZGV2X2VzMzIxMFtmb3VuZCsrXSA9IGRldjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQl9CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVzMzIxMC5jOiBObyBlczMyMTAgY2FyZCBmb3VuZCAoaS9vID0gMHgleCkuXG4iLCBpb1t0aGlzX2Rldl0pOworCQlicmVhazsKKwl9CisJaWYgKGZvdW5kKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVOWElPOworfQorCit2b2lkCitjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWludCB0aGlzX2RldjsKKworCWZvciAodGhpc19kZXYgPSAwOyB0aGlzX2RldiA8IE1BWF9FU19DQVJEUzsgdGhpc19kZXYrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2VzMzIxMFt0aGlzX2Rldl07CisJCWlmIChkZXYpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogTU9EVUxFICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aDE2aS5jIGIvZHJpdmVycy9uZXQvZXRoMTZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NhZTZiYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aDE2aS5jCkBAIC0wLDAgKzEsMTUwOSBAQAorLyogZXRoMTZpLmMgQW4gSUNMIEV0aGVyVGVhbSAxNmkgYW5kIDMyIEVJU0EgZXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eAorICAgCisgICBXcml0dGVuIDE5OTQtMTk5OSBieSBNaWthIEt1b3BwYWxhCisgICAKKyAgIENvcHlyaWdodCAoQykgMTk5NC0xOTk5IGJ5IE1pa2EgS3VvcHBhbGEKKyAgIEJhc2VkIG9uIHNrZWxldG9uLmMgYW5kIGhlYXZpbHkgb24gYXQxNzAwLmMgYnkgRG9uYWxkIEJlY2tlcgorCisgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisgICBUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIG1pa3VAaWtpLmZpCisKKyAgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGZvbGxvd2luZyBjYXJkcyA6CisJLSBJQ0wgRXRoZXJUZWFtIDE2aQorCS0gSUNMIEV0aGVyVGVhbSAzMiBFSVNBIAorCSAgKFVzZXMgdHJ1ZSAzMiBiaXQgdHJhbnNmZXJzIHJhdGhlciB0aGFuIDE2aSBjb21wYWJpbGl0eSBtb2RlKQorCisgICBFeGFtcGxlIE1vZHVsZSB1c2FnZToKKyAgICAgICAgaW5zbW9kIGV0aDE2aS5vIGlvPTB4MmEwIG1lZGlhdHlwZT1ibmMKKworCW1lZGlhdHlwZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6IGJuYyx0cCxkaXgsYXV0byxlcHJvbQorCisJJ2F1dG8nIHdpbGwgdHJ5IHRvIGF1dG9wcm9iZSBtZWRpYXR5cGUuCisJJ2Vwcm9tJyB3aWxsIHVzZSB3aGF0ZXZlciB0eXBlIGRlZmluZWQgaW4gZXByb20uCisKKyAgIEkgaGF2ZSBiZW5jaG1hcmtlZCBkcml2ZXIgd2l0aCBQSUkvMzAwTWh6IGFzIGEgZnRwIGNsaWVudAorICAgYW5kIDQ4Ni8zM01oeiBhcyBhIGZ0cCBzZXJ2ZXIuIFRvcCBzcGVlZCB3YXMgMTEyOC4zNyBraWxvYnl0ZXMvc2VjLgorICAgCisgICBTb3VyY2VzOgorICAgICAtIHNrZWxldG9uLmMgIGEgc2FtcGxlIG5ldHdvcmsgZHJpdmVyIGNvcmUgZm9yIGxpbnV4LAorICAgICAgIHdyaXR0ZW4gYnkgRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT4KKyAgICAgLSBhdDE3MDAuYyBhIGRyaXZlciBmb3IgQWxsaWVkIFRlbGVzaXMgQVQxNzAwLCB3cml0dGVuIAorICAgICAgIGJ5IERvbmFsZCBCZWNrZXIuCisgICAgIC0gZTE2aVNSVi5hc20gYSBOZXR3YXJlIDMuWCBTZXJ2ZXIgRHJpdmVyIGZvciBJQ0wgRXRoZXJUZWFtMTZpCisgICAgICAgd3JpdHRlbiBieSBNYXJra3UgVmlpbWEKKyAgICAgLSBUaGUgRnVqaXRzdSBNQjg2OTY1IGRhdGFib29rLgorICAgCisgICBBdXRob3IgdGhhbmtzIGZvbGxvd2luZyBwZXJzb25zIGR1ZSB0byB0aGVpciB2YWx1ZWJsZSBhc3Npc3RhbmNlOiAgICAKKyAgICAgICAgTWFya2t1IFZpaW1hIChJQ0wpCisJQXJpIFZhbHZlIChJQ0wpICAgICAgCisJRG9uYWxkIEJlY2tlcgorCUt1cnQgSHV3aWcgPGt1cnRAaHV3aWcuZGU+CisKKyAgIFJldmlzaW9uIGhpc3Rvcnk6CisKKyAgIFZlcnNpb24JRGF0ZQkJRGVzY3JpcHRpb24KKyAgIAorICAgMC4wMSAgICAgICAgIDE1LjEyLTk0ICAgICAgICBJbml0aWFsIHZlcnNpb24gKGNhcmQgZGV0ZWN0aW9uKQorICAgMC4wMiAgICAgICAgIDIzLjAxLTk1ICAgICAgICBJbnRlcnJ1cHQgaXMgbm93IGhvb2tlZCBjb3JyZWN0bHkKKyAgIDAuMDMgICAgICAgICAwMS4wMi05NSAgICAgICAgUmV3cm90ZSBpbml0aWFsaXphdGlvbiBwYXJ0CisgICAwLjA0ICAgICAgICAgMDcuMDItOTUgICAgICAgIEJhc2Ugc2tlbGV0b24gZG9uZS4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWRlIGEgZmV3IGNoYW5nZXMgdG8gc2lnbmF0dXJlIGNoZWNraW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIG1ha2UgaXQgYSBiaXQgcmVsaWFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZml4ZWQgYnVnIGluIHR4X2J1ZiBtYXBwaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZml4ZWQgYnVnIGluIGluaXRpYWxpemF0aW9uIChETENfRU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNuJ3QgZW5hYmxlZCB3aGVuIGluaXRpYWxpemF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIGRvbmUuKQorICAgMC4wNSAgICAgICAgIDA4LjAyLTk1ICAgICAgICBJZiB0aGVyZSB3ZXJlIG1vcmUgdGhhbiBvbmUgcGFja2V0IHRvIHNlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbWl0IHdhcyBqYW1tZWQgZHVlIHRvIGludmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgd3JpdGUuLi5ub3cgZml4ZWQKKyAgIDAuMDYgICAgICAgICAxOS4wMi05NSAgICAgICAgUmV3cm90ZSBpbnRlcnJ1cHQgaGFuZGxpbmcgICAgICAgIAorICAgMC4wNyAgICAgICAgIDEzLjA0LTk1ICAgICAgICBXcm90ZSBFRVBST00gcmVhZCByb3V0aW5lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXJkIGNvbmZpZ3VyYXRpb24gbm93IHNldCBhY2NvcmRpbmcgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSByZWFkIGZyb20gRUVQUk9NCisgICAwLjA4ICAgICAgICAgMjMuMDYtOTUgICAgICAgIFdyb3RlIHBhcnQgdGhhdCB0cmllcyB0byBwcm9iZSB1c2VkIGludGVyZmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0IGlmIEFVVE8gaXMgc2VsZWN0ZWQKKworICAgMC4wOSAgICAgICAgIDAxLjA5LTk1ICAgICAgICBBZGRlZCBtb2R1bGUgc3VwcG9ydAorICAgCisgICAwLjEwICAgICAgICAgMDQuMDktOTUgICAgICAgIEZpeGVkIHJlY2VpdmUgcGFja2V0IGFsbG9jYXRpb24gdG8gd29yaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGtlcm5lbHMgPiAxLjMueAorICAgICAgCisgICAwLjIwCQkyMC4wOS05NQlBZGRlZCBzdXBwb3J0IGZvciBFdGhlclRlYW0zMiBFSVNBCQorCisgICAwLjIxICAgICAgICAgMTcuMTAtOTUgICAgICAgIFJlbW92ZWQgdGhlIHVubmVjZXNzYXJ5IGV4dGVybiAKKwkJCQlpbml0X2V0aGVyZGV2KCkgZGVjbGFyYXRpb24uIFNvbWUKKwkJCQlvdGhlciBjbGVhbnVwcy4KKyAgIAkJCQkKKyAgIDAuMjIJCTIyLjAyLTk2CVJlY2VpdmUgYnVmZmVyIHdhcyBub3QgZmx1c2hlZAorCQkJCWNvcnJlY3RseSB3aGVuIGZhdWx0eSBwYWNrZXQgd2FzCisJCQkJcmVjZWl2ZWQuIE5vdyBmaXhlZC4KKworICAgMC4yMwkJMjYuMDItOTYJTWFkZSByZXNldHRpbmcgdGhlIGFkYXB0ZXIJCisJCQkgCW1vcmUgcmVsaWFibGUuCisgICAKKyAgIDAuMjQJCTI3LjAyLTk2CVJld3JvdGUgZmF1bHR5IHBhY2tldCBoYW5kbGluZyBpbiBldGgxNmlfcngKKworICAgMC4yNQkJMjIuMDUtOTYJa2ZyZWUoKSB3YXMgbWlzc2luZyBmcm9tIGNsZWFudXBfbW9kdWxlLgorCisgICAwLjI2CQkxMS4wNi05NglTb21ldGltZXMgY2FyZCB3YXMgbm90IGZvdW5kIGJ5IAorCQkJCWNoZWNrX3NpZ25hdHVyZSgpLiBOb3cgbWFkZSBtb3JlIHJlbGlhYmxlLgorICAgCisgICAwLjI3CQkyMy4wNi05NglPb3BzLiAxNiBjb25zZWN1dGl2ZSBjb2xsaXNpb25zIGhhbHRlZCAKKwkJCQlhZGFwdGVyLiBOb3cgd2lsbCB0cnkgdG8gcmV0cmFuc21pdCAKKwkJCQlNQVhfQ09MXzE2IHRpbWVzIGJlZm9yZSBmaW5hbGx5IGdpdmluZyB1cC4KKyAgIAorICAgMC4yOAkgICAgICAgIDI4LjEwLTk3CUFkZGVkIGRldl9pZCBwYXJhbWV0ZXIgKE5VTEwpIGZvciBmcmVlX2lycQorCisgICAwLjI5ICAgICAgICAgMjkuMTAtOTcgICAgICAgIE11bHRpcGxlIGNhcmQgc3VwcG9ydCBmb3IgbW9kdWxlIHVzZXJzCisKKyAgIDAuMzAgICAgICAgICAzMC4xMC05NyAgICAgICAgRml4ZWQgaXJxIGFsbG9jYXRpb24gYnVnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVxdWVzdF9pcnEgbW92ZWQgZnJvbSBwcm9iZSB0byBvcGVuKQorCisgICAwLjMwYSAgICAgICAgMjEuMDgtOTggICAgICAgIENhcmQgZGV0ZWN0aW9uIG1hZGUgbW9yZSByZWxheGVkLiBEcml2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFkIHByb2JsZW1zIHdpdGggc29tZSBUQ1AvSVAtUFJPTSBib290cworCQkJCXRvIGZpbmQgdGhlIGNhcmQuIFN1Z2dlc3RlZCBieSAKKwkJCQlLdXJ0IEh1d2lnIDxrdXJ0QGh1d2lnLmRlPgorCisgICAwLjMxICAgICAgICAgMjguMDgtOTggICAgICAgIE1lZGlhIGludGVyZmFjZSBwb3J0IGNhbiBub3cgYmUgc2VsZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBtb2R1bGUgcGFyYW1ldGVycyBvciBrZXJuZWwKKwkJCQlib290IHBhcmFtZXRlcnMuIAorCisgICAwLjMyICAgICAgICAgMzEuMDgtOTggICAgICAgIElSUSB3YXMgbmV2ZXIgZnJlZWQgaWYgb3Blbi9jbG9zZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpciB3YXNuJ3QgY2FsbGVkLiBOb3cgZml4ZWQuCisgICAKKyAgIDAuMzMgICAgICAgICAxMC4wOS05OCAgICAgICAgV2hlbiBldGgxNmlfb3BlbigpIHdhcyBjYWxsZWQgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRoMTZpX2Nsb3NlKCkgY2hpcCBuZXZlciByZWNvdmVyZWQuCisJCQkJTm93IG1vcmUgc2hhbGxvdyByZXNldCBpcyBtYWRlIG9uCisJCQkJY2xvc2UuCisKKyAgIDAuMzQgICAgICAgICAyOS4wNi05OQlGaXhlZCBvbmUgYmFkICNpZmRlZi4KKwkJCQlDaGFuZ2VkIGlvYWRkciAtPiBpbyBmb3IgY29uc2lzdGVuY3kKKworICAgMC4zNSAgICAgICAgIDAxLjA3LTk5ICAgICAgICB0cmFuc21pdCwtcmVjZWl2ZSBieXRlcyB3ZXJlIG5ldmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgaW4gc3RhdHMuIAorCisgICBCdWdzOgorCUluIHNvbWUgY2FzZXMgdGhlIG1lZGlhIGludGVyZmFjZSBhdXRvcHJvYmluZyBjb2RlIGRvZXNuJ3QgZmluZCAKKwl0aGUgY29ycmVjdCBpbnRlcmZhY2UgdHlwZS4gSW4gdGhpcyBjYXNlIHlvdSBjYW4gCisJbWFudWFsbHkgY2hvb3NlIHRoZSBpbnRlcmZhY2UgdHlwZSBpbiBET1Mgd2l0aCBFMTZJQy5FWEUgd2hpY2ggaXMgCisJY29uZmlndXJhdGlvbiBzb2Z0d2FyZSBmb3IgRXRoZXJUZWFtMTZpIGFuZCBFdGhlclRlYW0zMiBjYXJkcy4KKwlUaGlzIGlzIGFsc28gdHJ1ZSBmb3IgSVJRIHNldHRpbmcuIFlvdSBjYW5ub3QgdXNlIG1vZHVsZQorCXBhcmFtZXRlciB0byBjb25maWd1cmUgSVJRIG9mIHRoZSBjYXJkICh5ZXQpLiAKKworICAgVG8gZG86CisJLSBSZWFsIG11bHRpY2FzdCBzdXBwb3J0CisJLSBSZXdyaXRlIHRoZSBtZWRpYSBpbnRlcmZhY2UgYXV0b3Byb2JpbmcgY29kZS4gSXRzIF9ob3JyaWJsZV8gIQorCS0gUG9zc2libHkgbWVyZ2UgYWxsIHRoZSBNQjg2OTY1IHNwZWNpZmljIGNvZGUgdG8gZXh0ZXJuYWwKKwkgIG1vZHVsZSBmb3IgdXNlIGJ5IGV0aDE2LmMgYW5kIERvbmFsZCdzIGF0MTcwMC5jCisJLSBJUlEgY29uZmlndXJhdGlvbiB3aXRoIG1vZHVsZSBwYXJhbWV0ZXIuIEkgd2lsbCBkbworCSAgdGhpcyB3aGVuIGkgd2lsbCBnZXQgZW5vdWdoIGluZm8gYWJvdXQgc2V0dGluZworCSAgaXJxIHdpdGhvdXQgY29uZmlndXJhdGlvbiB1dGlsaXR5LgorKi8KKworc3RhdGljIGNoYXIgKnZlcnNpb24gPSAKKyAgICAiZXRoMTZpLmM6IHYwLjM1IDAxLUp1bC0xOTk5IE1pa2EgS3VvcHBhbGEgKG1pa3VAaWtpLmZpKVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CQkgIAorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CQkgIAorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgkJICAKKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4JCSAgCisjaW5jbHVkZSA8bGludXgvaW4uaD4JCSAgCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgkJICAKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4JCSAgCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgkJICAKKyNpbmNsdWRlIDxhc20vaW8uaD4JCSAgCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisKKworLyogRmV3IG1hY3JvcyAqLworI2RlZmluZSBCSVQoYSkJCSAgICAgICAoICgxIDw8IChhKSkgKSAgCisjZGVmaW5lIEJJVFNFVChpb2FkZHIsIGJudW0pICAgKChvdXRiKCgoaW5iKGlvYWRkcikpIHwgKGJudW0pKSwgaW9hZGRyKSkpIAorI2RlZmluZSBCSVRDTFIoaW9hZGRyLCBibnVtKSAgICgob3V0YigoKGluYihpb2FkZHIpKSAmICh+KGJudW0pKSksIGlvYWRkcikpKQorCisvKiBUaGlzIGlzIHRoZSBJL08gYWRkcmVzcyBzcGFjZSBmb3IgRXRoZXJ0ZWFtIDE2aSBhZGFwdGVyLiAqLworI2RlZmluZSBFVEgxNklfSU9fRVhURU5UICAgICAgIDMyCisKKy8qIFRpY2tzIGJlZm9yZSBkZWNpZGluZyB0aGF0IHRyYW5zbWl0IGhhcyB0aW1lZCBvdXQgKi8KKyNkZWZpbmUgVFhfVElNRU9VVCAgICAgICAgICAgICAoNDAwKkhaLzEwMDApCisKKy8qIE1heGltdW0gbG9vcCBjb3VudCB3aGVuIHJlY2VpdmluZyBwYWNrZXRzICovCisjZGVmaW5lIE1BWF9SWF9MT09QICAgICAgICAgICAgMjAKKworLyogU29tZSBpbnRlcnJ1cHQgbWFza3MgKi8KKyNkZWZpbmUgRVRIMTZJX0lOVFJfT04JICAgICAgIDB4ZWY4YSAgICAgICAvKiBIaWdoZXIgaXMgcmVjZWl2ZSBtYXNrICovCisjZGVmaW5lIEVUSDE2SV9JTlRSX09GRgkgICAgICAgMHgwMDAwCisJIAorLyogQnVmZmVycyBoZWFkZXIgc3RhdHVzIGJ5dGUgbWVhbmluZ3MgKi8KKyNkZWZpbmUgUEtUX0dPT0QgICAgICAgICAgICAgICBCSVQoNSkKKyNkZWZpbmUgUEtUX0dPT0RfUk1UICAgICAgICAgICBCSVQoNCkKKyNkZWZpbmUgUEtUX1NIT1JUICAgICAgICAgICAgICBCSVQoMykKKyNkZWZpbmUgUEtUX0FMSUdOX0VSUiAgICAgICAgICBCSVQoMikKKyNkZWZpbmUgUEtUX0NSQ19FUlIgICAgICAgICAgICBCSVQoMSkKKyNkZWZpbmUgUEtUX1JYX0JVRl9PVkVSRkxPVyAgICBCSVQoMCkKKworLyogVHJhbnNtaXQgc3RhdHVzIHJlZ2lzdGVyIChETENSMCkgKi8KKyNkZWZpbmUgVFhfU1RBVFVTX1JFRyAgICAgICAgICAwCisjZGVmaW5lIFRYX0RPTkUgICAgICAgICAgICAgICAgQklUKDcpCisjZGVmaW5lIE5FVF9CVVNZICAgICAgICAgICAgICAgQklUKDYpCisjZGVmaW5lIFRYX1BLVF9SQ0QgICAgICAgICAgICAgQklUKDUpCisjZGVmaW5lIENSX0xPU1QgICAgICAgICAgICAgICAgQklUKDQpCisjZGVmaW5lIFRYX0pBQkJFUl9FUlIJICAgICAgIEJJVCgzKQorI2RlZmluZSBDT0xMSVNJT04gICAgICAgICAgICAgIEJJVCgyKQorI2RlZmluZSBDT0xMSVNJT05TXzE2ICAgICAgICAgIEJJVCgxKQorCisvKiBSZWNlaXZlIHN0YXR1cyByZWdpc3RlciAoRExDUjEpICovCisjZGVmaW5lIFJYX1NUQVRVU19SRUcgICAgICAgICAgMQorI2RlZmluZSBSWF9QS1QgICAgICAgICAgICAgICAgIEJJVCg3KSAgLyogUGFja2V0IHJlY2VpdmVkICovCisjZGVmaW5lIEJVU19SRF9FUlIgICAgICAgICAgICAgQklUKDYpCisjZGVmaW5lIFNIT1JUX1BLVF9FUlIgICAgICAgICAgQklUKDMpCisjZGVmaW5lIEFMSUdOX0VSUiAgICAgICAgICAgICAgQklUKDIpCisjZGVmaW5lIENSQ19FUlIgICAgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIFJYX0JVRl9PVkVSRkxPVyAgICAgICAgQklUKDApCisgICAgICAgICAgICAgIAorLyogVHJhbnNtaXQgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAoRExDUjIpICovCisjZGVmaW5lIFRYX0lOVFJfUkVHICAgICAgICAgICAgMgorI2RlZmluZSBUWF9JTlRSX0RPTkUgICAgICAgICAgIEJJVCg3KQorI2RlZmluZSBUWF9JTlRSX0NPTCAgICAgICAgICAgIEJJVCgyKQorI2RlZmluZSBUWF9JTlRSXzE2X0NPTCAgICAgICAgIEJJVCgxKQorCisvKiBSZWNlaXZlIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKERMQ1IzKSAqLworI2RlZmluZSBSWF9JTlRSX1JFRyAgICAgICAgICAgIDMKKyNkZWZpbmUgUlhfSU5UUl9SRUNFSVZFICAgICAgICBCSVQoNykKKyNkZWZpbmUgUlhfSU5UUl9TSE9SVF9QS1QgICAgICBCSVQoMykKKyNkZWZpbmUgUlhfSU5UUl9DUkNfRVJSICAgICAgICBCSVQoMSkKKyNkZWZpbmUgUlhfSU5UUl9CVUZfT1ZFUkZMT1cgICBCSVQoMCkKKworLyogVHJhbnNtaXQgTW9kZSBSZWdpc3RlciAoRExDUjQpICovCisjZGVmaW5lIFRSQU5TTUlUX01PREVfUkVHICAgICAgNAorI2RlZmluZSBMT09QQkFDS19DT05UUk9MICAgICAgIEJJVCgxKQorI2RlZmluZSBDT05UUk9MX09VVFBVVCAgICAgICAgIEJJVCgyKQorCisvKiBSZWNlaXZlIE1vZGUgUmVnaXN0ZXIgKERMQ1I1KSAqLworI2RlZmluZSBSRUNFSVZFX01PREVfUkVHICAgICAgIDUKKyNkZWZpbmUgUlhfQlVGRkVSX0VNUFRZICAgICAgICBCSVQoNikKKyNkZWZpbmUgQUNDRVBUX0JBRF9QQUNLRVRTICAgICBCSVQoNSkKKyNkZWZpbmUgUkVDRUlWRV9TSE9SVF9BRERSICAgICBCSVQoNCkKKyNkZWZpbmUgQUNDRVBUX1NIT1JUX1BBQ0tFVFMgICBCSVQoMykKKyNkZWZpbmUgUkVNT1RFX1JFU0VUICAgICAgICAgICBCSVQoMikKKworI2RlZmluZSBBRERSRVNTX0ZJTFRFUl9NT0RFICAgIEJJVCgxKSB8IEJJVCgwKQorI2RlZmluZSBSRUpFQ1RfQUxMICAgICAgICAgICAgIDAKKyNkZWZpbmUgQUNDRVBUX0FMTCAgICAgICAgICAgICAzCisjZGVmaW5lIE1PREVfMSAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgIC8qIE5PREUgSUQsIEJDLCBNQywgMi0yNHRoIGJpdCAqLworI2RlZmluZSBNT0RFXzIgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAvKiBOT0RFIElELCBCQywgTUMsIEhhc2ggVGFibGUgKi8KKworLyogQ29uZmlndXJhdGlvbiBSZWdpc3RlciAwIChETENSNikgKi8KKyNkZWZpbmUgQ09ORklHX1JFR18wICAgICAgICAgICA2CisjZGVmaW5lIERMQ19FTiAgICAgICAgICAgICAgICAgQklUKDcpCisjZGVmaW5lIFNSQU1fQ1lDTEVfVElNRV8xMDBOUyAgQklUKDYpCisjZGVmaW5lIFNZU1RFTV9CVVNfV0lEVEhfOCAgICAgQklUKDUpICAgICAgIC8qIDEgPSA4Yml0LCAwID0gMTZiaXQgKi8KKyNkZWZpbmUgQlVGRkVSX1dJRFRIXzggICAgICAgICBCSVQoNCkgICAgICAgLyogMSA9IDhiaXQsIDAgPSAxNmJpdCAqLworI2RlZmluZSBUQlMxICAgICAgICAgICAgICAgICAgIEJJVCgzKSAgICAgICAKKyNkZWZpbmUgVEJTMCAgICAgICAgICAgICAgICAgICBCSVQoMikKKyNkZWZpbmUgU1JBTV9CUzEgICAgICAgICAgICAgICBCSVQoMSkgICAgICAgLyogMDA9OGtiLCAgMDE9MTZrYiAgKi8KKyNkZWZpbmUgU1JBTV9CUzAgICAgICAgICAgICAgICBCSVQoMCkgICAgICAgLyogMTA9MzJrYiwgMTE9NjRrYiAgKi8KKworI2lmbmRlZiBFVEgxNklfVFhfQlVGX1NJWkUgICAgICAgICAgICAgICAgICAgLyogMCA9IDJrYiwgMSA9IDRrYiAgKi8gCisjZGVmaW5lIEVUSDE2SV9UWF9CVUZfU0laRSAgICAgMyAgICAgICAgICAgICAvKiAyID0gOGtiLCAzID0gMTZrYiAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgVFhfQlVGXzF4MjA0OCAgICAgICAgICAwCisjZGVmaW5lIFRYX0JVRl8yeDIwNDggICAgICAgICAgMQorI2RlZmluZSBUWF9CVUZfMng0MDk4ICAgICAgICAgIDIKKyNkZWZpbmUgVFhfQlVGXzJ4ODE5MiAgICAgICAgICAzCisKKy8qIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMSAoRExDUjcpICovCisjZGVmaW5lIENPTkZJR19SRUdfMSAgICAgICAgICAgNworI2RlZmluZSBQT1dFUlVQICAgICAgICAgICAgICAgIEJJVCg1KQorCisvKiBUcmFuc21pdCBzdGFydCByZWdpc3RlciAqLworI2RlZmluZSBUUkFOU01JVF9TVEFSVF9SRUcgICAgIDEwCisjZGVmaW5lIFRSQU5TTUlUX1NUQVJUX1JCICAgICAgMgorI2RlZmluZSBUWF9TVEFSVCAgICAgICAgICAgICAgIEJJVCg3KSAgICAgICAvKiBSZXN0IG9mIHJlZ2lzdGVyIGJpdCBpbmRpY2F0ZSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBwYWNrZXRzIGluIHR4IGJ1ZmZlciovCisvKiBOb2RlIElEIHJlZ2lzdGVycyAoRExDUjgtMTMpICovCisjZGVmaW5lIE5PREVfSURfMCAgICAgICAgICAgICAgOAorI2RlZmluZSBOT0RFX0lEX1JCICAgICAgICAgICAgIDAKKworLyogSGFzaCBUYWJsZSByZWdpc3RlcnMgKEhUOC0xNSkgKi8KKyNkZWZpbmUgSEFTSF9UQUJMRV8wICAgICAgICAgICA4CisjZGVmaW5lIEhBU0hfVEFCTEVfUkIgICAgICAgICAgMQorCisvKiBCdWZmZXIgbWVtb3J5IHBvcnRzICovCisjZGVmaW5lIEJVRkZFUl9NRU1fUE9SVF9MQiAgICAgOAorI2RlZmluZSBEQVRBUE9SVCAgICAgICAgICAgICAgIEJVRkZFUl9NRU1fUE9SVF9MQgorI2RlZmluZSBCVUZGRVJfTUVNX1BPUlRfSEIgICAgIDkKKworLyogMTYgQ29sbGlzaW9uIGNvbnRyb2wgcmVnaXN0ZXIgKEJNUFIxMSkgKi8KKyNkZWZpbmUgQ09MXzE2X1JFRyAgICAgICAgICAgICAxMQorI2RlZmluZSBIQUxUX09OXzE2ICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUkVUUkFOU19BTkRfSEFMVF9PTl8xNiAweDAyCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGF0dGVtcHRzIHRvIHNlbmQgYWZ0ZXIgMTYgY29uY2VjdXRpdmUgY29sbGlzaW9ucyAqLworI2RlZmluZSBNQVhfQ09MXzE2CSAgICAgICAxMAorCisvKiBETUEgQnVyc3QgYW5kIFRyYW5zY2VpdmVyIE1vZGUgUmVnaXN0ZXIgKEJNUFIxMykgKi8KKyNkZWZpbmUgVFJBTlNDRUlWRVJfTU9ERV9SRUcgICAxMworI2RlZmluZSBUUkFOU0NFSVZFUl9NT0RFX1JCICAgIDIgICAgICAgICAKKyNkZWZpbmUgSU9fQkFTRV9VTkxPQ0sJICAgICAgIEJJVCg3KQorI2RlZmluZSBMT1dFUl9TUVVFTENIX1RSRVNIICAgIEJJVCg2KQorI2RlZmluZSBMSU5LX1RFU1RfRElTQUJMRSAgICAgIEJJVCg1KQorI2RlZmluZSBBVUlfU0VMRUNUICAgICAgICAgICAgIEJJVCg0KQorI2RlZmluZSBESVNfQVVUT19QT1JUX1NFTCAgICAgIEJJVCgzKQorCisvKiBGaWx0ZXIgU2VsZiBSZWNlaXZlIFJlZ2lzdGVyIChCTVBSMTQpICAqLworI2RlZmluZSBGSUxURVJfU0VMRl9SWF9SRUcgICAgIDE0CisjZGVmaW5lIFNLSVBfUlhfUEFDS0VUICAgICAgICAgQklUKDIpCisjZGVmaW5lIEZJTFRFUl9TRUxGX1JFQ0VJVkUgICAgQklUKDApCisKKy8qIEVFUFJPTSBDb250cm9sIFJlZ2lzdGVyIChCTVBSIDE2KSAqLworI2RlZmluZSBFRVBST01fQ1RSTF9SRUcgICAgICAgIDE2CisKKy8qIEVFUFJPTSBEYXRhIFJlZ2lzdGVyIChCTVBSIDE3KSAqLworI2RlZmluZSBFRVBST01fREFUQV9SRUcgICAgICAgIDE3CisKKy8qIE5NQzkzQ1N4NiBFRVBST00gQ29udHJvbCBCaXRzICovCisjZGVmaW5lIENTXzAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBDU18xICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgU0tfMCAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFNLXzEgICAgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBESV8wICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgRElfMSAgICAgICAgICAgICAgICAgICAweDgwCisKKy8qIE5NQzkzQ1N4NiBFRVBST00gSW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIEVFUFJPTV9SRUFEICAgICAgICAgICAgMHg4MAorCisvKiBOTUM5M0NTeDYgRUVQUk9NIEFkZHJlc3NlcyAqLworI2RlZmluZSBFX05PREVJRF8wICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgRV9OT0RFSURfMSAgICAgICAgICAgICAweDAzCisjZGVmaW5lIEVfTk9ERUlEXzIgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBFX1BPUlRfU0VMRUNUICAgICAgICAgIDB4MTQKKyAgI2RlZmluZSBFX1BPUlRfQk5DICAgICAgICAgICAweDAwCisgICNkZWZpbmUgRV9QT1JUX0RJWCAgICAgICAgICAgMHgwMQorICAjZGVmaW5lIEVfUE9SVF9UUCAgICAgICAgICAgIDB4MDIKKyAgI2RlZmluZSBFX1BPUlRfQVVUTyAgICAgICAgICAweDAzCisgICNkZWZpbmUgRV9QT1JUX0ZST01fRVBST00gICAgMHgwNAorI2RlZmluZSBFX1BST0RVQ1RfQ0ZHICAgICAgICAgIDB4MzAKKyAKKworLyogTWFjcm8gdG8gc2xvdyBkb3duIGlvIGJldHdlZW4gRUVQUk9NIGNsb2NrIHRyYW5zaXRpb25zICovCisjZGVmaW5lIGVlcHJvbV9zbG93X2lvKCkgZG8geyBpbnQgX2kgPSA0MDsgd2hpbGUoLS1faSA+IDApIHsgaW5iKDB4ODApOyB9fXdoaWxlKDApCisKKy8qIEp1bXBlcmxlc3MgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoQk1QUjE5KSAqLworI2RlZmluZSBKVU1QRVJMRVNTX0NPTkZJRyAgICAgIDE5CisKKy8qIElEIFJPTSByZWdpc3RlcnMsIHdyaXRpbmcgdG8gdGhlbSBhbHNvIHJlc2V0cyBzb21lIHBhcnRzIG9mIGNoaXAgKi8KKyNkZWZpbmUgSURfUk9NXzAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBJRF9ST01fNyAgICAgICAgICAgICAgIDMxCisjZGVmaW5lIFJFU0VUICAgICAgICAgICAgICAgICAgSURfUk9NXzAKKworLyogVGhpcyBpcyB0aGUgSS9PIGFkZHJlc3MgbGlzdCB0byBiZSBwcm9iZWQgd2hlbiBzZWVraW5nIHRoZSBjYXJkICovCitzdGF0aWMgdW5zaWduZWQgaW50IGV0aDE2aV9wb3J0bGlzdFtdIF9faW5pdGRhdGEgPSB7CisJMHgyNjAsIDB4MjgwLCAweDJBMCwgMHgyNDAsIDB4MzQwLCAweDMyMCwgMHgzODAsIDB4MzAwLCAwIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBldGgzMmlfcG9ydGxpc3RbXSBfX2luaXRkYXRhID0geyAKKwkweDEwMDAsIDB4MjAwMCwgMHgzMDAwLCAweDQwMDAsIDB4NTAwMCwgMHg2MDAwLCAweDcwMDAsIDB4ODAwMCwKKwkweDkwMDAsIDB4QTAwMCwgMHhCMDAwLCAweEMwMDAsIDB4RDAwMCwgMHhFMDAwLCAweEYwMDAsIDAgCit9OworCisvKiBUaGlzIGlzIHRoZSBJbnRlcnJ1cHQgbG9va3VwIHRhYmxlIGZvciBFdGgxNmkgY2FyZCAqLworc3RhdGljIHVuc2lnbmVkIGludCBldGgxNmlfaXJxbWFwW10gX19pbml0ZGF0YSA9IHsgOSwgMTAsIDUsIDE1LCAwIH07CisjZGVmaW5lIE5VTV9PRl9JU0FfSVJRUyAgICA0CisKKy8qIFRoaXMgaXMgdGhlIEludGVycnVwdCBsb29rdXAgdGFibGUgZm9yIEV0aDMyaSBjYXJkICovCitzdGF0aWMgdW5zaWduZWQgaW50IGV0aDMyaV9pcnFtYXBbXSBfX2luaXRkYXRhID0geyAzLCA1LCA3LCA5LCAxMCwgMTEsIDEyLCAxNSwgMCB9OyAgCisjZGVmaW5lIEVJU0FfSVJRX1JFRwkweGM4OQorI2RlZmluZSBOVU1fT0ZfRUlTQV9JUlFTICAgOAorCitzdGF0aWMgdW5zaWduZWQgaW50IGV0aDE2aV90eF9idWZfbWFwW10gPSB7IDIwNDgsIDIwNDgsIDQwOTYsIDgxOTIgfTsKKworLyogVXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgPjIgZm9yIGRlYnVnICovCisjaWZuZGVmIEVUSDE2SV9ERUJVRworI2RlZmluZSBFVEgxNklfREVCVUcgMAorI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgaW50IGV0aDE2aV9kZWJ1ZyA9IEVUSDE2SV9ERUJVRzsKKworLyogSW5mb3JtYXRpb24gZm9yIGVhY2ggYm9hcmQgKi8KKworc3RydWN0IGV0aDE2aV9sb2NhbCB7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJdW5zaWduZWQgY2hhciAgICAgdHhfc3RhcnRlZDsKKwl1bnNpZ25lZCBjaGFyICAgICB0eF9idWZfYnVzeTsKKwl1bnNpZ25lZCBzaG9ydCAgICB0eF9xdWV1ZTsgIC8qIE51bWJlciBvZiBwYWNrZXRzIGluIHRyYW5zbWl0IGJ1ZmZlciAqLworCXVuc2lnbmVkIHNob3J0ICAgIHR4X3F1ZXVlX2xlbjsgICAgICAgICAKKwl1bnNpZ25lZCBpbnQgICAgICB0eF9idWZfc2l6ZTsKKwl1bnNpZ25lZCBsb25nICAgICBvcGVuX3RpbWU7CisJdW5zaWduZWQgbG9uZyAgICAgdHhfYnVmZmVyZWRfcGFja2V0czsKKwl1bnNpZ25lZCBsb25nICAgICB0eF9idWZmZXJlZF9ieXRlczsKKwl1bnNpZ25lZCBsb25nICAgICBjb2xfMTY7CisJc3BpbmxvY2tfdAkgIGxvY2s7Cit9OworCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCisKK3N0YXRpYyBpbnQgICAgIGV0aDE2aV9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcik7CitzdGF0aWMgaW50ICAgICBldGgxNmlfY2hlY2tfc2lnbmF0dXJlKGludCBpb2FkZHIpOworc3RhdGljIGludCAgICAgZXRoMTZpX3Byb2JlX3BvcnQoaW50IGlvYWRkcik7CitzdGF0aWMgdm9pZCAgICBldGgxNmlfc2V0X3BvcnQoaW50IGlvYWRkciwgaW50IHBvcnR0eXBlKTsKK3N0YXRpYyBpbnQgICAgIGV0aDE2aV9zZW5kX3Byb2JlX3BhY2tldChpbnQgaW9hZGRyLCB1bnNpZ25lZCBjaGFyICpiLCBpbnQgbCk7CitzdGF0aWMgaW50ICAgICBldGgxNmlfcmVjZWl2ZV9wcm9iZV9wYWNrZXQoaW50IGlvYWRkcik7CitzdGF0aWMgaW50ICAgICBldGgxNmlfZ2V0X2lycShpbnQgaW9hZGRyKTsKK3N0YXRpYyBpbnQgICAgIGV0aDE2aV9yZWFkX2VlcHJvbShpbnQgaW9hZGRyLCBpbnQgb2Zmc2V0KTsKK3N0YXRpYyBpbnQgICAgIGV0aDE2aV9yZWFkX2VlcHJvbV93b3JkKGludCBpb2FkZHIpOworc3RhdGljIHZvaWQgICAgZXRoMTZpX2VlcHJvbV9jbWQoaW50IGlvYWRkciwgdW5zaWduZWQgY2hhciBjb21tYW5kKTsKK3N0YXRpYyBpbnQgICAgIGV0aDE2aV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgZXRoMTZpX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgZXRoMTZpX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgZXRoMTZpX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgZXRoMTZpX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgZXRoMTZpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkICAgIGV0aDE2aV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIGV0aDE2aV90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgZXRoMTZpX3NraXBfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgZXRoMTZpX211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsgCitzdGF0aWMgdm9pZCAgICBldGgxNmlfc2VsZWN0X3JlZ2JhbmsodW5zaWduZWQgY2hhciByZWdiYW5rLCBpbnQgaW9hZGRyKTsKK3N0YXRpYyB2b2lkICAgIGV0aDE2aV9pbml0aWFsaXplKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBib290KTsKKworI2lmIDAKK3N0YXRpYyBpbnQgICAgIGV0aDE2aV9zZXRfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyB1c2hvcnQgIGV0aDE2aV9wYXJzZV9tZWRpYXR5cGUoY29uc3QgY2hhciogcyk7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpldGgxNmlfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgY2hhciBjYXJkbmFtZVtdIF9faW5pdGRhdGEgPSAiSUNMIEV0aGVyVGVhbSAxNmkvMzIiOworCitzdGF0aWMgaW50IF9faW5pdCBkb19ldGgxNmlfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwlpbnQgaW9hZGRyOworCWludCBiYXNlX2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZihldGgxNmlfZGVidWcgPiA0KSAKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlByb2Jpbmcgc3RhcnRlZCBmb3IgJXNcbiIsIGNhcmRuYW1lKTsKKworCWlmKGJhc2VfYWRkciA+IDB4MWZmKSAgICAgICAgICAgLyogQ2hlY2sgb25seSBzaW5nbGUgbG9jYXRpb24gKi8KKwkJcmV0dXJuIGV0aDE2aV9wcm9iZTEoZGV2LCBiYXNlX2FkZHIpOworCWVsc2UgaWYoYmFzZV9hZGRyICE9IDApICAgICAgICAgLyogRG9uJ3QgcHJvYmUgYXQgYWxsICovCisJCXJldHVybiAtRU5YSU87CisKKwkvKiBTZWVrIGNhcmQgZnJvbSB0aGUgSVNBIGlvIGFkZHJlc3Mgc3BhY2UgKi8KKwlmb3IoaSA9IDA7IChpb2FkZHIgPSBldGgxNmlfcG9ydGxpc3RbaV0pIDsgaSsrKQorCQlpZihldGgxNmlfcHJvYmUxKGRldiwgaW9hZGRyKSA9PSAwKQorCQkJcmV0dXJuIDA7CisKKwkvKiBTZWVrIGNhcmQgZnJvbSB0aGUgRUlTQSBpbyBhZGRyZXNzIHNwYWNlICovCisJZm9yKGkgPSAwOyAoaW9hZGRyID0gZXRoMzJpX3BvcnRsaXN0W2ldKSA7IGkrKykKKwkJaWYoZXRoMTZpX3Byb2JlMShkZXYsIGlvYWRkcikgPT0gMCkKKwkJCXJldHVybiAwOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKyNpZm5kZWYgTU9EVUxFCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBldGgxNmlfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgZXRoMTZpX2xvY2FsKSk7CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCisJZXJyID0gZG9fZXRoMTZpX3Byb2JlKGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBFVEgxNklfSU9fRVhURU5UKTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgZXRoMTZpX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKQoreworCXN0cnVjdCBldGgxNmlfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCWludCByZXR2YWw7CisKKwkvKiBMZXQncyBncmFiIHRoZSByZWdpb24gKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgRVRIMTZJX0lPX0VYVEVOVCwgY2FyZG5hbWUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyoKKwkgIFRoZSBNQjg2OTg1IGNoaXAgaGFzIG9uIHJlZ2lzdGVyIHdoaWNoIGhvbGRzIGluZm9ybWF0aW9uIGluIHdoaWNoIAorCSAgaW8gYWRkcmVzcyB0aGUgY2hpcCBsaWVzLiBGaXJzdCByZWFkIHRoaXMgcmVnaXN0ZXIgYW5kIGNvbXBhcmUKKwkgIGl0IHRvIG91ciBjdXJyZW50IGlvIGFkZHJlc3MgYW5kIGlmIG1hdGNoIHRoZW4gdGhpcyBjb3VsZAorCSAgYmUgb3VyIGNoaXAuCisJICAqLworCisJaWYoaW9hZGRyIDwgMHgxMDAwKSB7CisJCWlmKGV0aDE2aV9wb3J0bGlzdFsoaW5iKGlvYWRkciArIEpVTVBFUkxFU1NfQ09ORklHKSAmIDB4MDcpXSAKKwkJICAgIT0gaW9hZGRyKSB7CisJCQlyZXR2YWwgPSAtRU5PREVWOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBOb3cgd2Ugd2lsbCBnbyBhIGJpdCBkZWVwZXIgYW5kIHRyeSB0byBmaW5kIHRoZSBjaGlwJ3Mgc2lnbmF0dXJlICovCisKKwlpZihldGgxNmlfY2hlY2tfc2lnbmF0dXJlKGlvYWRkcikgIT0gMCkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiAKKwkgICBOb3cgaXQgc2VlbXMgdGhhdCB3ZSBoYXZlIGZvdW5kIGEgZXRoZXJuZXQgY2hpcCBpbiB0aGlzIHBhcnRpY3VsYXIKKwkgICBpb2FkZHIuIFRoZSBNQjg2OTg1IGNoaXAgaGFzIHRoaXMgZmVhdHVyZSwgdGhhdCB3aGVuIHlvdSByZWFkIGEgCisJICAgY2VydGFpbiByZWdpc3RlciBpdCB3aWxsIGluY3JlYXNlIGl0J3MgaW8gYmFzZSBhZGRyZXNzIHRvIG5leHQKKwkgICBjb25maWd1cmFibGUgc2xvdC4gTm93IHdoZW4gd2UgaGF2ZSBmb3VuZCB0aGUgY2hpcCwgZmlyc3QgdGhpbmcgaXMKKwkgICB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY2hpcCdzIGlvYWRkciB3aWxsIGhvbGQgc3RpbGwgaGVyZS4KKwkgICAqLworCisJZXRoMTZpX3NlbGVjdF9yZWdiYW5rKFRSQU5TQ0VJVkVSX01PREVfUkIsIGlvYWRkcik7CisJb3V0YigweDAwLCBpb2FkZHIgKyBUUkFOU0NFSVZFUl9NT0RFX1JFRyk7CisKKwlvdXRiKDB4MDAsIGlvYWRkciArIFJFU0VUKTsgICAgICAgICAgICAgLyogUmVzZXQgc29tZSBwYXJ0cyBvZiBjaGlwICovCisJQklUU0VUKGlvYWRkciArIENPTkZJR19SRUdfMCwgQklUKDcpKTsgIC8qIERpc2FibGUgdGhlIGRhdGEgbGluayAqLworCisJaWYoIChldGgxNmlfZGVidWcgJiB2ZXJzaW9uX3ByaW50ZWQrKykgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCWRldi0+aXJxID0gZXRoMTZpX2dldF9pcnEoaW9hZGRyKTsKKworCS8qIFRyeSB0byBvYnRhaW4gaW50ZXJydXB0IHZlY3RvciAqLworCisJaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgKHZvaWQgKikmZXRoMTZpX2ludGVycnVwdCwgMCwgY2FyZG5hbWUsIGRldikpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIGF0ICUjM3gsIGJ1dCBpcyB1bnVzYWJsZSBkdWUgdG8gY29uZmxpY3RpbmcgSVJRICVkLlxuIiwgCisJCSAgICAgICBjYXJkbmFtZSwgaW9hZGRyLCBkZXYtPmlycSk7CisJCWdvdG8gb3V0OworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBhdCAlIzN4LCBJUlEgJWQsICIsCisJICAgICAgIGRldi0+bmFtZSwgY2FyZG5hbWUsIGlvYWRkciwgZGV2LT5pcnEpOworCisKKwkvKiBOb3cgd2Ugd2lsbCBoYXZlIHRvIGxvY2sgdGhlIGNoaXAncyBpbyBhZGRyZXNzICovCisJZXRoMTZpX3NlbGVjdF9yZWdiYW5rKFRSQU5TQ0VJVkVSX01PREVfUkIsIGlvYWRkcik7CisJb3V0YigweDM4LCBpb2FkZHIgKyBUUkFOU0NFSVZFUl9NT0RFX1JFRyk7IAorCisJZXRoMTZpX2luaXRpYWxpemUoZGV2LCAxKTsgLyogSW5pdGlhbGl6ZSByZXN0IG9mIHRoZSBjaGlwJ3MgcmVnaXN0ZXJzICovCisKKwkvKiBOb3cgbGV0J3Mgc2FtZSBzb21lIGVuZXJneSBieSBzaHV0dGluZyBkb3duIHRoZSBjaGlwIDspICovCisJQklUQ0xSKGlvYWRkciArIENPTkZJR19SRUdfMSwgUE9XRVJVUCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBkZXZpY2Ugc3RydWN0dXJlICovCisJbWVtc2V0KGxwLCAwLCBzaXplb2Yoc3RydWN0IGV0aDE2aV9sb2NhbCkpOworCWRldi0+b3BlbiAgICAgICAgICAgICAgID0gZXRoMTZpX29wZW47CisJZGV2LT5zdG9wICAgICAgICAgICAgICAgPSBldGgxNmlfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgICAgPSBldGgxNmlfdHg7CisJZGV2LT5nZXRfc3RhdHMgICAgICAgICAgPSBldGgxNmlfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gZXRoMTZpX211bHRpY2FzdDsKKwlkZXYtPnR4X3RpbWVvdXQgCT0gZXRoMTZpX3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwk9IFRYX1RJTUVPVVQ7CisJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKwlyZXR1cm4gMDsKK291dDoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEVUSDE2SV9JT19FWFRFTlQpOworCXJldHVybiByZXR2YWw7Cit9CisKKworc3RhdGljIHZvaWQgZXRoMTZpX2luaXRpYWxpemUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJvb3QpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpLCBub2RlX3cgPSAwOworCXVuc2lnbmVkIGNoYXIgbm9kZV9ieXRlID0gMDsKKworCS8qIFNldHVwIHN0YXRpb24gYWRkcmVzcyAqLworCWV0aDE2aV9zZWxlY3RfcmVnYmFuayhOT0RFX0lEX1JCLCBpb2FkZHIpOworCWZvcihpID0gMCA7IGkgPCAzIDsgaSsrKSB7CisJCXVuc2lnbmVkIHNob3J0IG5vZGVfdmFsID0gZXRoMTZpX3JlYWRfZWVwcm9tKGlvYWRkciwgRV9OT0RFSURfMCArIGkpOworCQkoKHVuc2lnbmVkIHNob3J0ICopZGV2LT5kZXZfYWRkcilbaV0gPSBudG9ocyhub2RlX3ZhbCk7CisJfQorCisJZm9yKGkgPSAwOyBpIDwgNjsgaSsrKSB7IAorCQlvdXRiKCAoKHVuc2lnbmVkIGNoYXIgKilkZXYtPmRldl9hZGRyKVtpXSwgaW9hZGRyICsgTk9ERV9JRF8wICsgaSk7CisJCWlmKGJvb3QpIHsKKwkJCXByaW50aygiJTAyeCIsIGluYihpb2FkZHIgKyBOT0RFX0lEXzAgKyBpKSk7CisJCQlpZihpICE9IDUpCisJCQkJcHJpbnRrKCI6Iik7CisJCX0KKwl9CisKKwkvKiBOb3cgd2Ugd2lsbCBzZXQgbXVsdGljYXN0IGFkZHJlc3NlcyB0byBhY2NlcHQgbm9uZSAqLworCWV0aDE2aV9zZWxlY3RfcmVnYmFuayhIQVNIX1RBQkxFX1JCLCBpb2FkZHIpOworCWZvcihpID0gMDsgaSA8IDg7IGkrKykgCisJCW91dGIoMHgwMCwgaW9hZGRyICsgSEFTSF9UQUJMRV8wICsgaSk7CisKKwkvKgorCSAgTm93IGxldCdzIGRpc2FibGUgdGhlIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlciwgc2V0IHRoZSBidWZmZXIgcmFtIAorCSAgY3ljbGUgdGltZSwgYnVzIHdpZHRoIGFuZCBidWZmZXIgZGF0YSBwYXRoIHdpZHRoLiBBbHNvIHdlIHNoYWxsCisJICBzZXQgdHJhbnNtaXQgYnVmZmVyIHNpemUgYW5kIHRvdGFsIGJ1ZmZlciBzaXplLgorCSAgKi8KKworCWV0aDE2aV9zZWxlY3RfcmVnYmFuaygyLCBpb2FkZHIpOworCisJbm9kZV9ieXRlID0gMDsKKwlub2RlX3cgPSBldGgxNmlfcmVhZF9lZXByb20oaW9hZGRyLCBFX1BST0RVQ1RfQ0ZHKTsKKworCWlmKCAobm9kZV93ICYgMHhGRjAwKSA9PSAweDA4MDApCisJCW5vZGVfYnl0ZSB8PSBCVUZGRVJfV0lEVEhfODsKKworCW5vZGVfYnl0ZSB8PSBTUkFNX0JTMTsKKworCWlmKCAobm9kZV93ICYgMHgwMEZGKSA9PSA2NCkKKwkJbm9kZV9ieXRlIHw9IFNSQU1fQlMwOworCisJbm9kZV9ieXRlIHw9IERMQ19FTiB8IFNSQU1fQ1lDTEVfVElNRV8xMDBOUyB8IChFVEgxNklfVFhfQlVGX1NJWkUgPDwgMik7CisKKwlvdXRiKG5vZGVfYnl0ZSwgaW9hZGRyICsgQ09ORklHX1JFR18wKTsKKworCS8qIFdlIHNoYWxsIGhhbHQgdGhlIHRyYW5zbWl0dGluZywgaWYgMTYgY29sbGlzaW9ucyBhcmUgZGV0ZWN0ZWQgKi8KKwlvdXRiKEhBTFRfT05fMTYsIGlvYWRkciArIENPTF8xNl9SRUcpOworCisjaWZkZWYgTU9EVUxFCisJLyogaWZfcG9ydCBhbHJlYWR5IHNldCBieSBpbml0X21vZHVsZSgpICovCisjZWxzZQorCWRldi0+aWZfcG9ydCA9IChkZXYtPm1lbV9zdGFydCA8IEVfUE9SVF9GUk9NX0VQUk9NKSA/IAorCQlkZXYtPm1lbV9zdGFydCA6IEVfUE9SVF9GUk9NX0VQUk9NOworI2VuZGlmCisKKwkvKiBTZXQgaW50ZXJmYWNlIHBvcnQgdHlwZSAqLworCWlmKGJvb3QpIHsKKwkJY2hhciAqcG9ydHR5cGVbXSA9IHsiQk5DIiwgIkRJWCIsICJUUCIsICJBVVRPIiwgIkZST01fRVBST00iIH07CisKKwkJc3dpdGNoKGRldi0+aWZfcG9ydCkKKwkJeworCisJCWNhc2UgRV9QT1JUX0ZST01fRVBST006CisJCQlkZXYtPmlmX3BvcnQgPSBldGgxNmlfcmVhZF9lZXByb20oaW9hZGRyLCBFX1BPUlRfU0VMRUNUKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRV9QT1JUX0FVVE86CisJCQlkZXYtPmlmX3BvcnQgPSBldGgxNmlfcHJvYmVfcG9ydChpb2FkZHIpOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBFX1BPUlRfQk5DOgorCQljYXNlIEVfUE9SVF9UUDoKKwkJY2FzZSBFX1BPUlRfRElYOgorCQkJYnJlYWs7CisJCX0KKworCQlwcmludGsoIiAlcyBpbnRlcmZhY2UuXG4iLCBwb3J0dHlwZVtkZXYtPmlmX3BvcnRdKTsKKworCQlldGgxNmlfc2V0X3BvcnQoaW9hZGRyLCBkZXYtPmlmX3BvcnQpOworCX0KKworCS8qIFNldCBSZWNlaXZlIE1vZGUgdG8gbm9ybWFsIG9wZXJhdGlvbiAqLworCW91dGIoTU9ERV8yLCBpb2FkZHIgKyBSRUNFSVZFX01PREVfUkVHKTsKK30KKworc3RhdGljIGludCBldGgxNmlfcHJvYmVfcG9ydChpbnQgaW9hZGRyKQoreworCWludCBpOworCWludCByZXRjb2RlOworCXVuc2lnbmVkIGNoYXIgZHVtbXlfcGFja2V0WzY0XTsKKworCS8qIFBvd2VydXAgdGhlIGNoaXAgKi8KKwlvdXRiKDB4YzAgfCBQT1dFUlVQLCBpb2FkZHIgKyBDT05GSUdfUkVHXzEpOworCisJQklUU0VUKGlvYWRkciArIENPTkZJR19SRUdfMCwgRExDX0VOKTsKKworCWV0aDE2aV9zZWxlY3RfcmVnYmFuayhOT0RFX0lEX1JCLCBpb2FkZHIpOworCisJZm9yKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWR1bW15X3BhY2tldFtpXSA9IGluYihpb2FkZHIgKyBOT0RFX0lEXzAgKyBpKTsKKwkJZHVtbXlfcGFja2V0W2krNl0gPSBpbmIoaW9hZGRyICsgTk9ERV9JRF8wICsgaSk7CisJfQorCisJZHVtbXlfcGFja2V0WzEyXSA9IDB4MDA7CisJZHVtbXlfcGFja2V0WzEzXSA9IDB4MDQ7CisJbWVtc2V0KGR1bW15X3BhY2tldCArIDE0LCAwLCBzaXplb2YoZHVtbXlfcGFja2V0KSAtIDE0KTsKKworCWV0aDE2aV9zZWxlY3RfcmVnYmFuaygyLCBpb2FkZHIpOworCisJZm9yKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCUJJVFNFVChpb2FkZHIgKyBDT05GSUdfUkVHXzAsIERMQ19FTik7CisJCUJJVENMUihpb2FkZHIgKyBDT05GSUdfUkVHXzAsIERMQ19FTik7CisJCWV0aDE2aV9zZXRfcG9ydChpb2FkZHIsIGkpOworCisJCWlmKGV0aDE2aV9kZWJ1ZyA+IDEpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiU2V0IHBvcnQgbnVtYmVyICVkXG4iLCBpKTsKKworCQlyZXRjb2RlID0gZXRoMTZpX3NlbmRfcHJvYmVfcGFja2V0KGlvYWRkciwgZHVtbXlfcGFja2V0LCA2NCk7CisJCWlmKHJldGNvZGUgPT0gMCkgeworCQkJcmV0Y29kZSA9IGV0aDE2aV9yZWNlaXZlX3Byb2JlX3BhY2tldChpb2FkZHIpOworCQkJaWYocmV0Y29kZSAhPSAtMSkgeworCQkJCWlmKGV0aDE2aV9kZWJ1ZyA+IDEpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICJFdGgxNmkgaW50ZXJmYWNlIHBvcnQgZm91bmQgYXQgJWRcbiIsIGkpOworCQkJCXJldHVybiBpOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJaWYoZXRoMTZpX2RlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiVFJBTlNNSVRfRE9ORSB0aW1lb3V0IHdoZW4gcHJvYmluZyBpbnRlcmZhY2UgcG9ydFxuIik7CisJCX0KKwl9CisKKwlpZiggZXRoMTZpX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlVzaW5nIGRlZmF1bHQgcG9ydFxuIik7CisKKwlyZXR1cm4gRV9QT1JUX0JOQzsKK30KKworc3RhdGljIHZvaWQgZXRoMTZpX3NldF9wb3J0KGludCBpb2FkZHIsIGludCBwb3J0dHlwZSkKK3sgCisJdW5zaWduZWQgc2hvcnQgdGVtcCA9IDA7CisKKwlldGgxNmlfc2VsZWN0X3JlZ2JhbmsoVFJBTlNDRUlWRVJfTU9ERV9SQiwgaW9hZGRyKTsKKwlvdXRiKExPT1BCQUNLX0NPTlRST0wsIGlvYWRkciArIFRSQU5TTUlUX01PREVfUkVHKTsKKworCXRlbXAgfD0gRElTX0FVVE9fUE9SVF9TRUw7CisKKwlzd2l0Y2gocG9ydHR5cGUpIHsKKworCWNhc2UgRV9QT1JUX0JOQyA6CisJCXRlbXAgfD0gQVVJX1NFTEVDVDsKKwkJYnJlYWs7CisKKwljYXNlIEVfUE9SVF9UUCA6CisJCWJyZWFrOworCisJY2FzZSBFX1BPUlRfRElYIDoKKwkJdGVtcCB8PSBBVUlfU0VMRUNUOworCQlCSVRTRVQoaW9hZGRyICsgVFJBTlNNSVRfTU9ERV9SRUcsIENPTlRST0xfT1VUUFVUKTsKKwkJYnJlYWs7CisJfSAgCisKKwlvdXRiKHRlbXAsIGlvYWRkciArIFRSQU5TQ0VJVkVSX01PREVfUkVHKTsKKworCWlmKGV0aDE2aV9kZWJ1ZyA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlRSQU5TTUlUX01PREVfUkVHID0gJXhcbiIsIGluYihpb2FkZHIgKyBUUkFOU01JVF9NT0RFX1JFRykpOworCQlwcmludGsoS0VSTl9ERUJVRyAiVFJBTlNDRUlWRVJfTU9ERV9SRUcgPSAleFxuIiwgCisJCSAgICAgICBpbmIoaW9hZGRyK1RSQU5TQ0VJVkVSX01PREVfUkVHKSk7CisJfQorfQorCitzdGF0aWMgaW50IGV0aDE2aV9zZW5kX3Byb2JlX3BhY2tldChpbnQgaW9hZGRyLCB1bnNpZ25lZCBjaGFyICpiLCBpbnQgbCkKK3sKKwlpbnQgc3RhcnR0aW1lOworCisJb3V0YigweGZmLCBpb2FkZHIgKyBUWF9TVEFUVVNfUkVHKTsKKworCW91dHcobCwgaW9hZGRyICsgREFUQVBPUlQpOworCW91dHN3KGlvYWRkciArIERBVEFQT1JULCAodW5zaWduZWQgc2hvcnQgKiliLCAobCArIDEpID4+IDEpOyAgCisKKwlzdGFydHRpbWUgPSBqaWZmaWVzOworCW91dGIoVFhfU1RBUlQgfCAxLCBpb2FkZHIgKyBUUkFOU01JVF9TVEFSVF9SRUcpOyAKKworCXdoaWxlKCAoaW5iKGlvYWRkciArIFRYX1NUQVRVU19SRUcpICYgMHg4MCkgPT0gMCkgeworCQlpZiggKGppZmZpZXMgLSBzdGFydHRpbWUpID4gVFhfVElNRU9VVCkgeworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXRoMTZpX3JlY2VpdmVfcHJvYmVfcGFja2V0KGludCBpb2FkZHIpCit7CisJaW50IHN0YXJ0dGltZTsKKworCXN0YXJ0dGltZSA9IGppZmZpZXM7CisKKwl3aGlsZSgoaW5iKGlvYWRkciArIFRYX1NUQVRVU19SRUcpICYgMHgyMCkgPT0gMCkgeworCQlpZiggKGppZmZpZXMgLSBzdGFydHRpbWUpID4gVFhfVElNRU9VVCkgeworCisJCQlpZihldGgxNmlfZGVidWcgPiAxKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJUaW1lb3V0IG9jY3VycmVkIHdhaXRpbmcgdHJhbnNtaXQgcGFja2V0IHJlY2VpdmVkXG4iKTsKKwkJCXN0YXJ0dGltZSA9IGppZmZpZXM7CisJCQl3aGlsZSgoaW5iKGlvYWRkciArIFJYX1NUQVRVU19SRUcpICYgMHg4MCkgPT0gMCkgeworCQkJCWlmKCAoamlmZmllcyAtIHN0YXJ0dGltZSkgPiBUWF9USU1FT1VUKSB7CisJCQkJCWlmKGV0aDE2aV9kZWJ1ZyA+IDEpCisJCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiVGltZW91dCBvY2N1cnJlZCB3YWl0aW5nIHJlY2VpdmUgcGFja2V0XG4iKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCX0KKworCQkJaWYoZXRoMTZpX2RlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiUkVDRUlWRV9QQUNLRVRcbiIpOworCQkJcmV0dXJuKDApOyAvKiBGb3VuZCByZWNlaXZlIHBhY2tldCAqLworCQl9CisJfQorCisJaWYoZXRoMTZpX2RlYnVnID4gMSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiVFJBTlNNSVRfUEFDS0VUX1JFQ0VJVkVEICV4XG4iLCBpbmIoaW9hZGRyICsgVFhfU1RBVFVTX1JFRykpOworCQlwcmludGsoS0VSTl9ERUJVRyAiUlhfU1RBVFVTX1JFRyA9ICV4XG4iLCBpbmIoaW9hZGRyICsgUlhfU1RBVFVTX1JFRykpOworCX0KKworCXJldHVybigwKTsgLyogUmV0dXJuIHN1Y2Nlc3MgKi8KK30KKworI2lmIDAKK3N0YXRpYyBpbnQgZXRoMTZpX3NldF9pcnEoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwljb25zdCBpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJY29uc3QgaW50IGlycSA9IGRldi0+aXJxOworCWludCBpID0gMDsKKworCWlmKGlvYWRkciA8IDB4MTAwMCkgewkJCisJCXdoaWxlKGV0aDE2aV9pcnFtYXBbaV0gJiYgZXRoMTZpX2lycW1hcFtpXSAhPSBpcnEpCisJCQlpKys7CisJCisJCWlmKGkgPCBOVU1fT0ZfSVNBX0lSUVMpIHsKKwkJCXU4IGNieXRlID0gaW5iKGlvYWRkciArIEpVTVBFUkxFU1NfQ09ORklHKTsKKwkJCWNieXRlID0gKGNieXRlICYgMHgzRikgfCAoaSA8PCA2KTsKKwkJCW91dGIoY2J5dGUsIGlvYWRkciArIEpVTVBFUkxFU1NfQ09ORklHKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWVsc2UgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBFSVNBIEludGVycnVwdCBjYW5ub3QgYmUgc2V0LiBVc2UgRUlTQSBDb25maWd1cmF0aW9uIHV0aWxpdHkuXG4iLCBkZXYtPm5hbWUpOworCX0KKwkKKwlyZXR1cm4gLTE7CisKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBldGgxNmlfZ2V0X2lycShpbnQgaW9hZGRyKQoreworCXVuc2lnbmVkIGNoYXIgY2J5dGU7CisKKwlpZiggaW9hZGRyIDwgMHgxMDAwKSB7CisJCWNieXRlID0gaW5iKGlvYWRkciArIEpVTVBFUkxFU1NfQ09ORklHKTsKKwkJcmV0dXJuKCBldGgxNmlfaXJxbWFwWyAoKGNieXRlICYgMHhDMCkgPj4gNikgXSApOworCX0gZWxzZSB7ICAvKiBPaC4udGhlIGNhcmQgaXMgRUlTQSBzbyBtZXRob2QgZ2V0dGluZyBJUlEgZGlmZmVyZW50ICovCisJCXVuc2lnbmVkIHNob3J0IGluZGV4ID0gMDsKKwkJY2J5dGUgPSBpbmIoaW9hZGRyICsgRUlTQV9JUlFfUkVHKTsKKwkJd2hpbGUoIChjYnl0ZSAmIDB4MDEpID09IDApIHsKKwkJCWNieXRlID0gY2J5dGUgPj4gMTsKKwkJCWluZGV4Kys7CisJCX0KKwkJcmV0dXJuKCBldGgzMmlfaXJxbWFwWyBpbmRleCBdICk7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBldGgxNmlfY2hlY2tfc2lnbmF0dXJlKGludCBpb2FkZHIpCit7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciBjcmVnWzRdID0geyAwIH07CisKKwlmb3IoaSA9IDA7IGkgPCA0IDsgaSsrKSB7CisKKwkJY3JlZ1tpXSA9IGluYihpb2FkZHIgKyBUUkFOU01JVF9NT0RFX1JFRyArIGkpOworCisJCWlmKGV0aDE2aV9kZWJ1ZyA+IDEpCisJCQlwcmludGsoImV0aDE2aTogcmVhZCBzaWduYXR1cmUgYnl0ZSAleCBhdCAleFxuIiwgCisJCQkgICAgICAgY3JlZ1tpXSwKKwkJCSAgICAgICBpb2FkZHIgKyBUUkFOU01JVF9NT0RFX1JFRyArIGkpOworCX0KKworCWNyZWdbMF0gJj0gMHgwRjsgICAgICAvKiBNYXNrIGNvbGxpc2lvbiBjbnIgKi8KKwljcmVnWzJdICY9IDB4N0Y7ICAgICAgLyogTWFzayBEQ0xFTiBiaXQgKi8KKworI2lmIDAKKwkvKiAKKwkgICBUaGlzIHdhcyByZW1vdmVkIGJlY2F1c2UgdGhlIGNhcmQgd2FzIHNvbWV0aW1lcyBsZWZ0IHRvIHN0YXRlCisJICAgZnJvbSB3aGljaCBpdCBjb3VsZG4ndCBiZSBmaW5kIGFueW1vcmUuIElmIHRoZXJlIGlzIG5lZWQKKwkgICB0byBtb3JlIHN0cmljdCBjaGVjayBzdGlsbCB0aGlzIGhhdmUgdG8gYmUgZml4ZWQuCisJICAgKi8KKwlpZiggISAoKGNyZWdbMF0gPT0gMHgwNikgJiYgKGNyZWdbMV0gPT0gMHg0MSkpICkgeworCQlpZihjcmVnWzFdICE9IDB4NDIpCisJCQlyZXR1cm4gLTE7CisJfQorI2VuZGlmCisKKwlpZiggISgoY3JlZ1syXSA9PSAweDM2KSAmJiAoY3JlZ1szXSA9PSAweEUwKSkgKSB7CisJCWNyZWdbMl0gJj0gMHg0MDsKKwkJY3JlZ1szXSAmPSAweDAzOworCQkKKwkJaWYoICEoKGNyZWdbMl0gPT0gMHg0MCkgJiYgKGNyZWdbM10gPT0gMHgwMCkpICkKKwkJCXJldHVybiAtMTsKKwl9CisJCisJaWYoZXRoMTZpX3JlYWRfZWVwcm9tKGlvYWRkciwgRV9OT0RFSURfMCkgIT0gMCkKKwkJcmV0dXJuIC0xOworCQorCWlmKChldGgxNmlfcmVhZF9lZXByb20oaW9hZGRyLCBFX05PREVJRF8xKSAmIDB4RkYwMCkgIT0gMHg0QjAwKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBldGgxNmlfcmVhZF9lZXByb20oaW50IGlvYWRkciwgaW50IG9mZnNldCkKK3sKKwlpbnQgZGF0YSA9IDA7CisKKwlldGgxNmlfZWVwcm9tX2NtZChpb2FkZHIsIEVFUFJPTV9SRUFEIHwgb2Zmc2V0KTsKKwlvdXRiKENTXzEsIGlvYWRkciArIEVFUFJPTV9DVFJMX1JFRyk7CisJZGF0YSA9IGV0aDE2aV9yZWFkX2VlcHJvbV93b3JkKGlvYWRkcik7CisJb3V0YihDU18wIHwgU0tfMCwgaW9hZGRyICsgRUVQUk9NX0NUUkxfUkVHKTsKKworCXJldHVybihkYXRhKTsgIAorfQorCitzdGF0aWMgaW50IGV0aDE2aV9yZWFkX2VlcHJvbV93b3JkKGludCBpb2FkZHIpCit7CisJaW50IGk7CisJaW50IGRhdGEgPSAwOworICAgICAKKwlmb3IoaSA9IDE2OyBpID4gMDsgaS0tKSB7CisJCW91dGIoQ1NfMSB8IFNLXzAsIGlvYWRkciArIEVFUFJPTV9DVFJMX1JFRyk7CisJCWVlcHJvbV9zbG93X2lvKCk7CisJCW91dGIoQ1NfMSB8IFNLXzEsIGlvYWRkciArIEVFUFJPTV9DVFJMX1JFRyk7CisJCWVlcHJvbV9zbG93X2lvKCk7CisJCWRhdGEgPSAoZGF0YSA8PCAxKSB8IAorCQkJKChpbmIoaW9hZGRyICsgRUVQUk9NX0RBVEFfUkVHKSAmIERJXzEpID8gMSA6IDApOworCQkKKwkJZWVwcm9tX3Nsb3dfaW8oKTsKKwl9CisKKwlyZXR1cm4oZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGV0aDE2aV9lZXByb21fY21kKGludCBpb2FkZHIsIHVuc2lnbmVkIGNoYXIgY29tbWFuZCkKK3sKKwlpbnQgaTsKKworCW91dGIoQ1NfMCB8IFNLXzAsIGlvYWRkciArIEVFUFJPTV9DVFJMX1JFRyk7CisJb3V0YihESV8wLCBpb2FkZHIgKyBFRVBST01fREFUQV9SRUcpOworCW91dGIoQ1NfMSB8IFNLXzAsIGlvYWRkciArIEVFUFJPTV9DVFJMX1JFRyk7CisJb3V0YihESV8xLCBpb2FkZHIgKyBFRVBST01fREFUQV9SRUcpOworCW91dGIoQ1NfMSB8IFNLXzEsIGlvYWRkciArIEVFUFJPTV9DVFJMX1JFRyk7CisKKwlmb3IoaSA9IDc7IGkgPj0gMDsgaS0tKSB7CisJCXNob3J0IGNtZCA9ICggKGNvbW1hbmQgJiAoMSA8PCBpKSkgPyBESV8xIDogRElfMCApOworCQlvdXRiKGNtZCwgaW9hZGRyICsgRUVQUk9NX0RBVEFfUkVHKTsKKwkJb3V0YihDU18xIHwgU0tfMCwgaW9hZGRyICsgRUVQUk9NX0NUUkxfUkVHKTsKKwkJZWVwcm9tX3Nsb3dfaW8oKTsKKwkJb3V0YihDU18xIHwgU0tfMSwgaW9hZGRyICsgRUVQUk9NX0NUUkxfUkVHKTsKKwkJZWVwcm9tX3Nsb3dfaW8oKTsKKwl9IAorfQorCitzdGF0aWMgaW50IGV0aDE2aV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV0aDE2aV9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwkKKwkvKiBQb3dlcnVwIHRoZSBjaGlwICovCisJb3V0YigweGMwIHwgUE9XRVJVUCwgaW9hZGRyICsgQ09ORklHX1JFR18xKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGNoaXAgKi8KKwlldGgxNmlfaW5pdGlhbGl6ZShkZXYsIDApOyAgCisKKwkvKiBTZXQgdGhlIHRyYW5zbWl0IGJ1ZmZlciBzaXplICovCisJbHAtPnR4X2J1Zl9zaXplID0gZXRoMTZpX3R4X2J1Zl9tYXBbRVRIMTZJX1RYX0JVRl9TSVpFICYgMHgwM107CisKKwlpZihldGgxNmlfZGVidWcgPiAwKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHRyYW5zbWl0IGJ1ZmZlciBzaXplICVkXG4iLCAKKwkJICAgICAgIGRldi0+bmFtZSwgbHAtPnR4X2J1Zl9zaXplKTsKKworCS8qIE5vdyBlbmFibGUgVHJhbnNtaXR0ZXIgYW5kIFJlY2VpdmVyIHNlY3Rpb25zICovCisJQklUQ0xSKGlvYWRkciArIENPTkZJR19SRUdfMCwgRExDX0VOKTsKKworCS8qIE5vdyBzd2l0Y2ggdG8gcmVnaXN0ZXIgYmFuayAyLCBmb3IgcnVuIHRpbWUgb3BlcmF0aW9uICovCisJZXRoMTZpX3NlbGVjdF9yZWdiYW5rKDIsIGlvYWRkcik7CisKKwlscC0+b3Blbl90aW1lID0gamlmZmllczsKKwlscC0+dHhfc3RhcnRlZCA9IDA7CisJbHAtPnR4X3F1ZXVlID0gMDsKKwlscC0+dHhfcXVldWVfbGVuID0gMDsKKworCS8qIFR1cm4gb24gaW50ZXJydXB0cyovCisJb3V0dyhFVEgxNklfSU5UUl9PTiwgaW9hZGRyICsgVFhfSU5UUl9SRUcpOyAgCisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV0aDE2aV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBldGgxNmlfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlldGgxNmlfcmVzZXQoZGV2KTsKKworCS8qIFR1cm4gb2ZmIGludGVycnVwdHMqLworCW91dHcoRVRIMTZJX0lOVFJfT0ZGLCBpb2FkZHIgKyBUWF9JTlRSX1JFRyk7ICAKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwlscC0+b3Blbl90aW1lID0gMDsKKworCS8qIERpc2FibGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgKi8KKwlCSVRTRVQoaW9hZGRyICsgQ09ORklHX1JFR18wLCBETENfRU4pOworCisJLyogUmVzZXQgdGhlIGNoaXAgKi8KKwkvKiBvdXRiKDB4ZmYsIGlvYWRkciArIFJFU0VUKTsgKi8KKwkvKiBvdXR3KDB4ZmZmZiwgaW9hZGRyICsgVFhfU1RBVFVTX1JFRyk7ICAgICovCisJCisJb3V0YigweDAwLCBpb2FkZHIgKyBDT05GSUdfUkVHXzEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV0aDE2aV90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV0aDE2aV9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwkvKiAKKwkgICBJZiB3ZSBnZXQgaGVyZSwgc29tZSBoaWdoZXIgbGV2ZWwgaGFzIGRlY2lkZWQgdGhhdCAKKwkgICB3ZSBhcmUgYnJva2VuLiBUaGVyZSBzaG91bGQgcmVhbGx5IGJlIGEgImtpY2sgbWUiIAorCSAgIGZ1bmN0aW9uIGNhbGwgaW5zdGVhZC4gCisJICAgKi8KKworCW91dHcoRVRIMTZJX0lOVFJfT0ZGLCBpb2FkZHIgKyBUWF9JTlRSX1JFRyk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCB3aXRoIHN0YXR1cyAlMDR4LCAlcyA/XG4iLCAKKwkgICAgICAgZGV2LT5uYW1lLAorCWludyhpb2FkZHIgKyBUWF9TVEFUVVNfUkVHKSwgIChpbmIoaW9hZGRyICsgVFhfU1RBVFVTX1JFRykgJiBUWF9ET05FKSA/IAorCQkgICAgICAgIklSUSBjb25mbGljdCIgOiAibmV0d29yayBjYWJsZSBwcm9ibGVtIik7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIExldCdzIGR1bXAgYWxsIHJlZ2lzdGVycyAqLworCWlmKGV0aDE2aV9kZWJ1ZyA+IDApIHsgCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdGltZW91dDogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgaW5iKGlvYWRkciArIDApLCAKKwkJICAgICAgIGluYihpb2FkZHIgKyAxKSwgaW5iKGlvYWRkciArIDIpLCAKKwkJICAgICAgIGluYihpb2FkZHIgKyAzKSwgaW5iKGlvYWRkciArIDQpLCAKKwkJICAgICAgIGluYihpb2FkZHIgKyA1KSwKKwkJICAgICAgIGluYihpb2FkZHIgKyA2KSwgaW5iKGlvYWRkciArIDcpKTsKKworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHRyYW5zbWl0IHN0YXJ0IHJlZzogJTAyeC4gY29sbGlzaW9uIHJlZyAlMDJ4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBpbmIoaW9hZGRyICsgVFJBTlNNSVRfU1RBUlRfUkVHKSwKKwkJICAgICAgIGluYihpb2FkZHIgKyBDT0xfMTZfUkVHKSk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAibHAtPnR4X3F1ZXVlID0gJWRcbiIsIGxwLT50eF9xdWV1ZSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJscC0+dHhfcXVldWVfbGVuID0gJWRcbiIsIGxwLT50eF9xdWV1ZV9sZW4pOworCQlwcmludGsoS0VSTl9ERUJVRyAibHAtPnR4X3N0YXJ0ZWQgPSAlZFxuIiwgbHAtPnR4X3N0YXJ0ZWQpOworCX0KKwlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJZXRoMTZpX3Jlc2V0KGRldik7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJb3V0dyhFVEgxNklfSU5UUl9PTiwgaW9hZGRyICsgVFhfSU5UUl9SRUcpOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBldGgxNmlfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXRoMTZpX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBzdGF0dXMgPSAwOworCXVzaG9ydCBsZW5ndGggPSBza2ItPmxlbjsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChsZW5ndGggPCBFVEhfWkxFTikgeworCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQlsZW5ndGggPSBFVEhfWkxFTjsKKwl9CisJYnVmID0gc2tiLT5kYXRhOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkKKwkvKiBUdXJuIG9mZiBUWCBpbnRlcnJ1cHRzICovCisJb3V0dyhFVEgxNklfSU5UUl9PRkYsIGlvYWRkciArIFRYX0lOVFJfUkVHKTsKKwkKKwkvKiBXZSB3b3VsZCBiZSBiZXR0ZXIgZG9pbmcgdGhlIGRpc2FibGVfaXJxIHRyaWNrcyB0aGUgM2M1MDkgZG9lcywKKwkgICB0aGF0IHdvdWxkIG1ha2UgdGhpcyBzdWNrIGEgbG90IGxlc3MgKi8KKwkgICAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCWlmKCAobGVuZ3RoICsgMikgPiAobHAtPnR4X2J1Zl9zaXplIC0gbHAtPnR4X3F1ZXVlX2xlbikpIHsKKwkJaWYoZXRoMTZpX2RlYnVnID4gMCkgCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHJhbnNtaXQgYnVmZmVyIGZ1bGwuXG4iLCBkZXYtPm5hbWUpOyAgCisJfSAKKwllbHNlIHsKKwkJb3V0dyhsZW5ndGgsIGlvYWRkciArIERBVEFQT1JUKTsKKworCQlpZiggaW9hZGRyIDwgMHgxMDAwICkgCisJCQlvdXRzdyhpb2FkZHIgKyBEQVRBUE9SVCwgYnVmLCAobGVuZ3RoICsgMSkgPj4gMSk7CisJCWVsc2UgeworCQkJdW5zaWduZWQgY2hhciBmcmFnID0gbGVuZ3RoICUgNDsKKwkJCW91dHNsKGlvYWRkciArIERBVEFQT1JULCBidWYsIGxlbmd0aCA+PiAyKTsKKwkJCWlmKCBmcmFnICE9IDAgKSB7CisJCQkJb3V0c3coaW9hZGRyICsgREFUQVBPUlQsIChidWYgKyAobGVuZ3RoICYgMHhGRkZDKSksIDEpOworCQkJCWlmKCBmcmFnID09IDMgKSAKKwkJCQkJb3V0c3coaW9hZGRyICsgREFUQVBPUlQsIAorCQkJCQkgICAgICAoYnVmICsgKGxlbmd0aCAmIDB4RkZGQykgKyAyKSwgMSk7CisJCQl9CisJCX0KKwkJbHAtPnR4X2J1ZmZlcmVkX3BhY2tldHMrKzsKKwkJbHAtPnR4X2J1ZmZlcmVkX2J5dGVzID0gbGVuZ3RoOworCQlscC0+dHhfcXVldWUrKzsKKwkJbHAtPnR4X3F1ZXVlX2xlbiArPSBsZW5ndGggKyAyOworCX0KKwlscC0+dHhfYnVmX2J1c3kgPSAwOworCisJaWYobHAtPnR4X3N0YXJ0ZWQgPT0gMCkgeworCQkvKiBJZiB0aGUgdHJhbnNtaXR0ZXIgaXMgaWRsZS4uYWx3YXlzIHRyaWdnZXIgYSB0cmFuc21pdCAqLworCQlvdXRiKFRYX1NUQVJUIHwgbHAtPnR4X3F1ZXVlLCBpb2FkZHIgKyBUUkFOU01JVF9TVEFSVF9SRUcpOworCQlscC0+dHhfcXVldWUgPSAwOworCQlscC0+dHhfcXVldWVfbGVuID0gMDsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCWxwLT50eF9zdGFydGVkID0gMTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKwllbHNlIGlmKGxwLT50eF9xdWV1ZV9sZW4gPCBscC0+dHhfYnVmX3NpemUgLSAoRVRIX0ZSQU1FX0xFTiArIDIpKSB7CisJCS8qIFRoZXJlIGlzIHN0aWxsIG1vcmUgcm9vbSBmb3Igb25lIG1vcmUgcGFja2V0IGluIHR4IGJ1ZmZlciAqLworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCQkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCQorCW91dHcoRVRIMTZJX0lOVFJfT04sIGlvYWRkciArIFRYX0lOVFJfUkVHKTsKKwkvKiBUdXJuIFRYIGludGVycnVwdHMgYmFjayBvbiAqLworCS8qIG91dGIoVFhfSU5UUl9ET05FIHwgVFhfSU5UUl8xNl9DT0wsIGlvYWRkciArIFRYX0lOVFJfUkVHKTsgKi8KKwlzdGF0dXMgPSAwOworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXRoMTZpX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV0aDE2aV9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgYm9ndXNjb3VudCA9IE1BWF9SWF9MT09QOworCisJLyogTG9vcCB1bnRpbCBhbGwgcGFja2V0cyBoYXZlIGJlZW4gcmVhZCAqLworCXdoaWxlKCAoaW5iKGlvYWRkciArIFJFQ0VJVkVfTU9ERV9SRUcpICYgUlhfQlVGRkVSX0VNUFRZKSA9PSAwKSB7CisKKwkJLyogUmVhZCBzdGF0dXMgYnl0ZSBmcm9tIHJlY2VpdmUgYnVmZmVyICovIAorCQl1c2hvcnQgc3RhdHVzID0gaW53KGlvYWRkciArIERBVEFQT1JUKTsKKworCQkvKiBHZXQgdGhlIHNpemUgb2YgdGhlIHBhY2tldCBmcm9tIHJlY2VpdmUgYnVmZmVyICovCisJCXVzaG9ydCBwa3RfbGVuID0gaW53KGlvYWRkciArIERBVEFQT1JUKTsKKworCQlpZihldGgxNmlfZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSZWNlaXZpbmcgcGFja2V0IG1vZGUgJTAyeCBzdGF0dXMgJTA0eC5cbiIsIAorCQkJICAgICAgIGRldi0+bmFtZSwgCisJCQkgICAgICAgaW5iKGlvYWRkciArIFJFQ0VJVkVfTU9ERV9SRUcpLCBzdGF0dXMpOworCQkKKwkJaWYoICEoc3RhdHVzICYgUEtUX0dPT0QpICkgeworCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCisJCQlpZiggKHBrdF9sZW4gPCBFVEhfWkxFTikgfHwgKHBrdF9sZW4gPiBFVEhfRlJBTUVfTEVOKSApIHsKKwkJCQlscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCWV0aDE2aV9yZXNldChkZXYpOworCQkJCXJldHVybjsJCQorCQkJfQorCQkJZWxzZSB7IAorCQkJCWV0aDE2aV9za2lwX3BhY2tldChkZXYpOworCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQl9CQorCQl9CisJCWVsc2UgeyAgIC8qIE9rIHNvIG5vdyB3ZSBzaG91bGQgaGF2ZSBhIGdvb2QgcGFja2V0ICovCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAzKTsKKwkJCWlmKCBza2IgPT0gTlVMTCApIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGQnbiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBhY2tldCAobGVuICVkKVxuIiwgCisJCQkJICAgICAgIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCQkJZXRoMTZpX3NraXBfcGFja2V0KGRldik7CisJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJc2tiLT5kZXYgPSBkZXY7CisJCQlza2JfcmVzZXJ2ZShza2IsMik7CisJCQkKKwkJCS8qIAorCQkJICAgTm93IGxldCdzIGdldCB0aGUgcGFja2V0IG91dCBvZiBidWZmZXIuCisJCQkgICBzaXplIGlzIChwa3RfbGVuICsgMSkgPj4gMSwgY2F1c2Ugd2UgYXJlIG5vdyByZWFkaW5nIHdvcmRzCisJCQkgICBhbmQgaXQgaGF2ZSB0byBiZSBldmVuIGFsaWduZWQuCisJCQkgICAqLyAKKwkJCQorCQkJaWYoaW9hZGRyIDwgMHgxMDAwKSAKKwkJCQlpbnN3KGlvYWRkciArIERBVEFQT1JULCBza2JfcHV0KHNrYiwgcGt0X2xlbiksIAorCQkJCSAgICAgKHBrdF9sZW4gKyAxKSA+PiAxKTsKKwkJCWVsc2UgewkKKwkJCQl1bnNpZ25lZCBjaGFyICpidWYgPSBza2JfcHV0KHNrYiwgcGt0X2xlbik7CisJCQkJdW5zaWduZWQgY2hhciBmcmFnID0gcGt0X2xlbiAlIDQ7CisKKwkJCQlpbnNsKGlvYWRkciArIERBVEFQT1JULCBidWYsIHBrdF9sZW4gPj4gMik7CisKKwkJCQlpZihmcmFnICE9IDApIHsKKwkJCQkJdW5zaWduZWQgc2hvcnQgcmVzdFsyXTsKKwkJCQkJcmVzdFswXSA9IGludyggaW9hZGRyICsgREFUQVBPUlQgKTsKKwkJCQkJaWYoZnJhZyA9PSAzKQorCQkJCQkJcmVzdFsxXSA9IGludyggaW9hZGRyICsgREFUQVBPUlQgKTsKKworCQkJCQltZW1jcHkoYnVmICsgKHBrdF9sZW4gJiAweGZmZmMpLCAoY2hhciAqKXJlc3QsIGZyYWcpOworCQkJCX0KKwkJCX0KKworCQkJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsIGRldik7CisKKwkJCWlmKCBldGgxNmlfZGVidWcgPiA1ICkgeworCQkJCWludCBpOworCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUmVjZWl2ZWQgcGFja2V0IG9mIGxlbmd0aCAlZC5cbiIsIAorCQkJCSAgICAgICBkZXYtPm5hbWUsIHBrdF9sZW4pOworCQkJCWZvcihpID0gMDsgaSA8IDE0OyBpKyspIAorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiICUwMngiLCBza2ItPmRhdGFbaV0pOworCQkJCXByaW50ayhLRVJOX0RFQlVHICIuXG4iKTsKKwkJCX0KKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCisJCX0gLyogZWxzZSAqLworCisJCWlmKC0tYm9ndXNjb3VudCA8PSAwKQorCQkJYnJlYWs7CisKKwl9IC8qIHdoaWxlICovCit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBldGgxNmlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgZXRoMTZpX2xvY2FsICpscDsKKwlpbnQgaW9hZGRyID0gMCwgc3RhdHVzOworCWludCBoYW5kbGVkID0gMDsKKworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIFR1cm4gb2ZmIGFsbCBpbnRlcnJ1cHRzIGZyb20gYWRhcHRlciAqLworCW91dHcoRVRIMTZJX0lOVFJfT0ZGLCBpb2FkZHIgKyBUWF9JTlRSX1JFRyk7CisKKwkvKiBldGgxNmlfdHggd29uJ3QgYmUgY2FsbGVkICovCisJc3Bpbl9sb2NrKCZscC0+bG9jayk7CisKKwlzdGF0dXMgPSBpbncoaW9hZGRyICsgVFhfU1RBVFVTX1JFRyk7ICAgICAgLyogR2V0IHRoZSBzdGF0dXMgKi8KKwlvdXR3KHN0YXR1cywgaW9hZGRyICsgVFhfU1RBVFVTX1JFRyk7ICAgICAgLyogQ2xlYXIgc3RhdHVzIGJpdHMgKi8KKworCWlmIChzdGF0dXMpCisJCWhhbmRsZWQgPSAxOworCisJaWYoZXRoMTZpX2RlYnVnID4gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJbnRlcnJ1cHQgd2l0aCBzdGF0dXMgJTA0eC5cbiIsIGRldi0+bmFtZSwgc3RhdHVzKTsKKworCWlmKCBzdGF0dXMgJiAweDdmMDAgKSB7CisKKwkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCisJCWlmKHN0YXR1cyAmIChCVVNfUkRfRVJSIDw8IDgpICkgCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQnVzIHJlYWQgZXJyb3IuXG4iLGRldi0+bmFtZSk7CisJCWlmKHN0YXR1cyAmIChTSE9SVF9QS1RfRVJSIDw8IDgpICkgICBscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQlpZihzdGF0dXMgJiAoQUxJR05fRVJSIDw8IDgpICkgICAgICAgbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQlpZihzdGF0dXMgJiAoQ1JDX0VSUiA8PCA4KSApCSAgICBscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQlpZihzdGF0dXMgJiAoUlhfQlVGX09WRVJGTE9XIDw8IDgpICkgbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJfQorCWlmKCBzdGF0dXMgJiAweDAwMWEpIHsKKworCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisKKwkJaWYoc3RhdHVzICYgQ1JfTE9TVCkgbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCWlmKHN0YXR1cyAmIFRYX0pBQkJFUl9FUlIpIGxwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisKKyNpZiAwCSAgICAgICAKKwkJaWYoc3RhdHVzICYgQ09MTElTSU9OKSB7CisJCQlscC0+c3RhdHMuY29sbGlzaW9ucyArPSAKKwkJCQkoKGluYihpb2FkZHIrVFJBTlNNSVRfTU9ERV9SRUcpICYgMHhGMCkgPj4gNCk7CisJCX0KKyNlbmRpZgorCQlpZihzdGF0dXMgJiBDT0xMSVNJT05TXzE2KSB7CisJCQlpZihscC0+Y29sXzE2IDwgTUFYX0NPTF8xNikgeyAKKwkJCQlscC0+Y29sXzE2Kys7CisJCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJCQkvKiBSZXN1bWUgdHJhbnNtaXR0aW5nLCBza2lwIGZhaWxlZCBwYWNrZXQgKi8KKwkJCQlvdXRiKDB4MDIsIGlvYWRkciArIENPTF8xNl9SRUcpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGJhaWxpbmcgb3V0IGR1ZSB0byBtYW55IGNvbnNlY3V0aXZlIDE2LWluLWEtcm93IGNvbGxpc2lvbnMuIE5ldHdvcmsgY2FibGUgcHJvYmxlbT9cbiIsIGRldi0+bmFtZSk7CisJCQl9CisJCX0KKwl9CisKKwlpZiggc3RhdHVzICYgMHgwMGZmICkgeyAgICAgICAgICAvKiBMZXQncyBjaGVjayB0aGUgdHJhbnNtaXQgc3RhdHVzIHJlZyAqLworCisJCWlmKHN0YXR1cyAmIFRYX0RPTkUpIHsgICAgICAgICAvKiBUaGUgdHJhbnNtaXQgaGFzIGJlZW4gZG9uZSAqLworCQkJbHAtPnN0YXRzLnR4X3BhY2tldHMgPSBscC0+dHhfYnVmZmVyZWRfcGFja2V0czsKKwkJCWxwLT5zdGF0cy50eF9ieXRlcyArPSBscC0+dHhfYnVmZmVyZWRfYnl0ZXM7CisJCQlscC0+Y29sXzE2ID0gMDsJCSAgIAorCisJCQlpZihscC0+dHhfcXVldWUpIHsgICAgICAgICAgIC8qIElzIHRoZXJlIHN0aWxsIHBhY2tldHMgPyAqLworCQkJCS8qIFRoZXJlIHdhcyBwYWNrZXQocykgc28gc3RhcnQgdHJhbnNtaXR0aW5nIGFuZCB3cml0ZSBhbHNvCisJCQkJICAgaG93IG1hbnkgcGFja2V0cyB0aGVyZSBpcyB0byBiZSBzZW5kZWQgKi8KKwkJCQlvdXRiKFRYX1NUQVJUIHwgbHAtPnR4X3F1ZXVlLCBpb2FkZHIgKyBUUkFOU01JVF9TVEFSVF9SRUcpOworCQkJCWxwLT50eF9xdWV1ZSA9IDA7CisJCQkJbHAtPnR4X3F1ZXVlX2xlbiA9IDA7CisJCQkJbHAtPnR4X3N0YXJ0ZWQgPSAxOworCQkJfQorCQkJZWxzZSB7CisJCQkJbHAtPnR4X3N0YXJ0ZWQgPSAwOworCQkJfQorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQl9CisJfQorCisJaWYoICggc3RhdHVzICYgMHg4MDAwICkgfHwgCisJICAgICggKGluYihpb2FkZHIgKyBSRUNFSVZFX01PREVfUkVHKSAmIFJYX0JVRkZFUl9FTVBUWSkgPT0gMCkgKSB7CisJCWV0aDE2aV9yeChkZXYpOyAgLyogV2UgaGF2ZSBwYWNrZXQgaW4gcmVjZWl2ZSBidWZmZXIgKi8KKwl9ICAKKwkKKwkvKiBUdXJuIGludGVycnVwdHMgYmFjayBvbiAqLworCW91dHcoRVRIMTZJX0lOVFJfT04sIGlvYWRkciArIFRYX0lOVFJfUkVHKTsKKwkKKwlpZihscC0+dHhfcXVldWVfbGVuIDwgbHAtPnR4X2J1Zl9zaXplIC0gKEVUSF9GUkFNRV9MRU4gKyAyKSkgeworCQkvKiBUaGVyZSBpcyBzdGlsbCBtb3JlIHJvb20gZm9yIG9uZSBtb3JlIHBhY2tldCBpbiB0eCBidWZmZXIgKi8KKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKwkKKwlzcGluX3VubG9jaygmbHAtPmxvY2spOworCQorCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgdm9pZCBldGgxNmlfc2tpcF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sJIAorCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWludyhpb2FkZHIgKyBEQVRBUE9SVCk7CisJaW53KGlvYWRkciArIERBVEFQT1JUKTsKKwlpbncoaW9hZGRyICsgREFUQVBPUlQpOworCisJb3V0YihTS0lQX1JYX1BBQ0tFVCwgaW9hZGRyICsgRklMVEVSX1NFTEZfUlhfUkVHKTsKKwl3aGlsZSggaW5iKCBpb2FkZHIgKyBGSUxURVJfU0VMRl9SWF9SRUcgKSAhPSAwKTsKK30KKworc3RhdGljIHZvaWQgZXRoMTZpX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV0aDE2aV9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWlmKGV0aDE2aV9kZWJ1ZyA+IDEpIAorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlc2V0dGluZyBkZXZpY2UuXG4iLCBkZXYtPm5hbWUpOworCisJQklUU0VUKGlvYWRkciArIENPTkZJR19SRUdfMCwgRExDX0VOKTsKKwlvdXR3KDB4ZmZmZiwgaW9hZGRyICsgVFhfU1RBVFVTX1JFRyk7ICAgIAorCWV0aDE2aV9zZWxlY3RfcmVnYmFuaygyLCBpb2FkZHIpOworCisJbHAtPnR4X3N0YXJ0ZWQgPSAwOworCWxwLT50eF9idWZfYnVzeSA9IDA7CisJbHAtPnR4X3F1ZXVlID0gMDsKKwlscC0+dHhfcXVldWVfbGVuID0gMDsgICAgCisJQklUQ0xSKGlvYWRkciArIENPTkZJR19SRUdfMCwgRExDX0VOKTsKK30KKworc3RhdGljIHZvaWQgZXRoMTZpX211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgCisJaWYoZGV2LT5tY19jb3VudCB8fCBkZXYtPmZsYWdzJihJRkZfQUxMTVVMVEl8SUZGX1BST01JU0MpKSAKKwl7CisJCWRldi0+ZmxhZ3N8PUlGRl9QUk9NSVNDOwkvKiBNdXN0IGRvIHRoaXMgKi8KKwkJb3V0YigzLCBpb2FkZHIgKyBSRUNFSVZFX01PREVfUkVHKTsgICAgCisJfSBlbHNlIHsKKwkJb3V0YigyLCBpb2FkZHIgKyBSRUNFSVZFX01PREVfUkVHKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZXRoMTZpX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBldGgxNmlfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgZXRoMTZpX3NlbGVjdF9yZWdiYW5rKHVuc2lnbmVkIGNoYXIgYmFua25iciwgaW50IGlvYWRkcikKK3sKKwl1bnNpZ25lZCBjaGFyIGRhdGE7CisKKwlkYXRhID0gaW5iKGlvYWRkciArIENPTkZJR19SRUdfMSk7CisJb3V0YiggKChkYXRhICYgMHhGMykgfCAoIChiYW5rbmJyICYgMHgwMykgPDwgMikpLCBpb2FkZHIgKyBDT05GSUdfUkVHXzEpOyAKK30KKworI2lmZGVmIE1PRFVMRQorCitzdGF0aWMgdXNob3J0IGV0aDE2aV9wYXJzZV9tZWRpYXR5cGUoY29uc3QgY2hhciogcykKK3sKKwlpZighcykKKwkJcmV0dXJuIEVfUE9SVF9GUk9NX0VQUk9NOworCQorICAgICAgICBpZiAoIXN0cm5jbXAocywgImJuYyIsIDMpKQorCQlyZXR1cm4gRV9QT1JUX0JOQzsKKyAgICAgICAgZWxzZSBpZiAoIXN0cm5jbXAocywgInRwIiwgMikpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVfUE9SVF9UUDsKKyAgICAgICAgZWxzZSBpZiAoIXN0cm5jbXAocywgImRpeCIsIDMpKQorICAgICAgICAgICAgICAgIHJldHVybiBFX1BPUlRfRElYOworICAgICAgICBlbHNlIGlmICghc3RybmNtcChzLCAiYXV0byIsIDQpKQorCQlyZXR1cm4gRV9QT1JUX0FVVE87CisJZWxzZQorCQlyZXR1cm4gRV9QT1JUX0ZST01fRVBST007Cit9CisKKyNkZWZpbmUgTUFYX0VUSDE2SV9DQVJEUyA0ICAvKiBNYXggbnVtYmVyIG9mIEV0aDE2aSBjYXJkcyBwZXIgbW9kdWxlICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X2V0aDE2aVtNQVhfRVRIMTZJX0NBUkRTXTsKK3N0YXRpYyBpbnQgaW9bTUFYX0VUSDE2SV9DQVJEU107CisjaWYgMAorc3RhdGljIGludCBpcnFbTUFYX0VUSDE2SV9DQVJEU107CisjZW5kaWYKK3N0YXRpYyBjaGFyKiBtZWRpYXR5cGVbTUFYX0VUSDE2SV9DQVJEU107CitzdGF0aWMgaW50IGRlYnVnID0gLTE7CisKK01PRFVMRV9BVVRIT1IoIk1pa2EgS3VvcHBhbGEgPG1pa3VAaWtpLmZpPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJQ0wgRXRoZXJUZWFtIDE2aS8zMiBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiZXRoMTZpIEkvTyBiYXNlIGFkZHJlc3MoZXMpIik7CisKKyNpZiAwCittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJldGgxNmkgaW50ZXJydXB0IHJlcXVlc3QgbnVtYmVyIik7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtX2FycmF5KG1lZGlhdHlwZSwgY2hhcnAsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhtZWRpYXR5cGUsICJldGgxNmkgbWVkaWEgdHlwZSBvZiBpbnRlcmZhY2UocykgKGJuYyx0cCxkaXgsYXV0byxlcHJvbSkiKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImV0aDE2aSBkZWJ1ZyBsZXZlbCAoMC02KSIpOworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgdGhpc19kZXYsIGZvdW5kID0gMDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX0VUSDE2SV9DQVJEUzsgdGhpc19kZXYrKykgeworCQlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGV0aDE2aV9sb2NhbCkpOworCQlpZiAoIWRldikKKwkJCWJyZWFrOworCisJCWRldi0+YmFzZV9hZGRyID0gaW9bdGhpc19kZXZdOworCisJICAgICAgICBpZihkZWJ1ZyAhPSAtMSkKKwkJCWV0aDE2aV9kZWJ1ZyA9IGRlYnVnOworCisJCWlmKGV0aDE2aV9kZWJ1ZyA+IDEpCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgImV0aDE2aSglZCk6IGludGVyZmFjZSB0eXBlICVzXG4iLCB0aGlzX2RldiwgbWVkaWF0eXBlW3RoaXNfZGV2XSA/IG1lZGlhdHlwZVt0aGlzX2Rldl0gOiAibm9uZSIgKTsKKworCQlkZXYtPmlmX3BvcnQgPSBldGgxNmlfcGFyc2VfbWVkaWF0eXBlKG1lZGlhdHlwZVt0aGlzX2Rldl0pOworCisJCWlmKGlvW3RoaXNfZGV2XSA9PSAwKSB7CisJCQlpZih0aGlzX2RldiAhPSAwKSAvKiBPbmx5IGF1dG9wcm9iZSAxc3Qgb25lICovCisJCQkJYnJlYWs7CisKKwkJCXByaW50ayhLRVJOX05PVElDRSAiZXRoMTZpLmM6IFByZXNlbnRseSBhdXRvcHJvYmluZyAobm90IHJlY29tbWVuZGVkKSBmb3IgYSBzaW5nbGUgY2FyZC5cbiIpOworCQl9CisKKwkJaWYgKGRvX2V0aDE2aV9wcm9iZShkZXYpID09IDApIHsKKwkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7CisJCQkJZGV2X2V0aDE2aVtmb3VuZCsrXSA9IGRldjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVUSDE2SV9JT19FWFRFTlQpOworCQl9CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImV0aDE2aS5jIE5vIEV0aDE2aSBjYXJkIGZvdW5kIChpL28gPSAweCV4KS5cbiIsCisJCSAgICAgICBpb1t0aGlzX2Rldl0pOworCQlmcmVlX25ldGRldihkZXYpOworCQlicmVhazsKKwl9CisJaWYgKGZvdW5kKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVOWElPOworfQorCQordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWludCB0aGlzX2RldjsKKworCWZvcih0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX0VUSDE2SV9DQVJEUzsgdGhpc19kZXYrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2V0aDE2aVt0aGlzX2Rldl07CisJCQorCQlpZihkZXYtPnByaXYpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBFVEgxNklfSU9fRVhURU5UKTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogTU9EVUxFICovCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtYyBldGgxNmkuYyIKKyAqICBhbHQtY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVkVSU0lPTlMgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0IC1wcm90b3R5cGVzIC1PNiAtYyBldGgxNmkuYyIKKyAqICB0YWItd2lkdGg6IDgKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiBFbmQ6CisgKi8KKworLyogRW5kIG9mIGZpbGUgZXRoMTZpLmMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V3cmszLmMgYi9kcml2ZXJzL25ldC9ld3JrMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZjk2OWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ld3JrMy5jCkBAIC0wLDAgKzEsMjAwNyBAQAorLyogIGV3cmszLmM6IEEgRElHSVRBTCBFdGhlcldPUktTIDMgZXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KKworICAgV3JpdHRlbiAxOTk0IGJ5IERhdmlkIEMuIERhdmllcy4KKworICAgQ29weXJpZ2h0IDE5OTQgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24uCisKKyAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKyAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKyAgIFRoaXMgZHJpdmVyIGlzIHdyaXR0ZW4gZm9yIHRoZSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiBzZXJpZXMKKyAgIG9mIEV0aGVyV09SS1MgZXRoZXJuZXQgY2FyZHM6CisKKyAgIERFMjAzIFR1cmJvIChCTkMpCisgICBERTIwNCBUdXJibyAoVFApCisgICBERTIwNSBUdXJibyAoVFAgQk5DKQorCisgICBUaGUgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZCBvbiBhIHJlbGF0aXZlbHkgYnVzeSAgbmV0d29yayB1c2luZyB0aGUgREUyMDUKKyAgIGNhcmQgYW5kIGJlbmNobWFya2VkIHdpdGggJ3R0Y3AnOiBpdCB0cmFuc2ZlcnJlZCAxNk0gIG9mIGRhdGEgYXQgOTc1a0IvcworICAgKDcuOE1iL3MpIHRvIGEgREVDc3RhdGlvbiA1MDAwLzIwMC4KKworICAgVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhdCBkYXZpZXNAbWFuaWFjLnVsdHJhbmV0LmNvbS4KKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgVGhpcyBkcml2ZXIgaGFzIGJlZW4gd3JpdHRlbiAgc3Vic3RhbnRpYWxseSAgZnJvbSBzY3JhdGNoLCBhbHRob3VnaCAgaXRzCisgICBpbmhlcml0YW5jZSBvZiBzdHlsZSBhbmQgc3RhY2sgaW50ZXJmYWNlIGZyb20gJ2RlcGNhLmMnIGFuZCBpbiB0dXJuIGZyb20KKyAgIERvbmFsZCBCZWNrZXIncyAnbGFuY2UuYycgc2hvdWxkIGJlIG9idmlvdXMuCisKKyAgIFRoZSAgREUyMDMvNC81IGJvYXJkcyAgYWxsICB1c2UgYSBuZXcgcHJvcHJpZXRhcnkgICBjaGlwIGluIHBsYWNlIG9mIHRoZQorICAgTEFOQ0UgY2hpcCB1c2VkIGluIHByaW9yIGNhcmRzICAoREVQQ0EsIERFMTAwLCBERTIwMC8xLzIsIERFMjEwLCBERTQyMikuCisgICBVc2UgdGhlIGRlcGNhLmMgZHJpdmVyIGluIHRoZSBzdGFuZGFyZCBkaXN0cmlidXRpb24gIGZvciB0aGUgTEFOQ0UgYmFzZWQKKyAgIGNhcmRzIGZyb20gRElHSVRBTDsgdGhpcyBkcml2ZXIgd2lsbCBub3Qgd29yayB3aXRoIHRoZW0uCisKKyAgIFRoZSBERTIwMy80LzUgY2FyZHMgaGF2ZSAyICBtYWluIG1vZGVzOiBzaGFyZWQgbWVtb3J5ICBhbmQgSS9PIG9ubHkuIEkvTworICAgb25seSBtYWtlcyAgYWxsIHRoZSBjYXJkIGFjY2Vzc2VzIHRocm91Z2ggIEkvTyB0cmFuc2FjdGlvbnMgYW5kICBubyBoaWdoCisgICAoc2hhcmVkKSAgbWVtb3J5IGlzIHVzZWQuIFRoaXMgIG1vZGUgcHJvdmlkZXMgYSA+NDglIHBlcmZvcm1hbmNlIHBlbmFsdHkKKyAgIGFuZCAgaXMgZGVwcmVjYXRlZCBpbiB0aGlzICBkcml2ZXIsICBhbHRob3VnaCBhbGxvd2VkIHRvIHByb3ZpZGUgaW5pdGlhbAorICAgc2V0dXAgd2hlbiBoYXJkc3RyYXBwZWQuCisKKyAgIFRoZSBzaGFyZWQgbWVtb3J5IG1vZGUgY29tZXMgaW4gMyBmbGF2b3VyczogMmtCLCAzMmtCIGFuZCA2NGtCLiBUaGVyZSBpcworICAgbm8gcG9pbnQgaW4gdXNpbmcgYW55IG1vZGUgb3RoZXIgdGhhbiB0aGUgMmtCICBtb2RlIC0gdGhlaXIgcGVyZm9ybWFuY2VzCisgICBhcmUgdmlydHVhbGx5IGlkZW50aWNhbCwgYWx0aG91Z2ggdGhlIGRyaXZlciBoYXMgIGJlZW4gdGVzdGVkIGluIHRoZSAya0IKKyAgIGFuZCAzMmtCIG1vZGVzLiBJIHdvdWxkIHN1Z2dlc3QgeW91IHVuY29tbWVudCB0aGUgbGluZToKKworICAgRk9SQ0VfMktfTU9ERTsKKworICAgdG8gYWxsb3cgdGhlIGRyaXZlciB0byBjb25maWd1cmUgdGhlIGNhcmQgYXMgYSAgMmtCIGNhcmQgYXQgeW91ciBjdXJyZW50CisgICBiYXNlICBhZGRyZXNzLCB0aHVzIGxlYXZpbmcgbW9yZSAgcm9vbSB0byBjbHV0dGVyICB5b3VyICBzeXN0ZW0gYm94IHdpdGgKKyAgIG90aGVyIG1lbW9yeSBodW5ncnkgYm9hcmRzLgorCisgICBBcyBtYW55IElTQSAgYW5kIEVJU0EgY2FyZHMgIGNhbiBiZSBzdXBwb3J0ZWQgIHVuZGVyIHRoaXMgZHJpdmVyICBhcyB5b3UKKyAgIHdpc2gsIGxpbWl0ZWQgcHJpbWFyaWx5ICBieSB0aGUgYXZhaWxhYmxlIElSUSBsaW5lcywgIHJhdGhlciB0aGFuIGJ5IHRoZQorICAgYXZhaWxhYmxlIEkvTyBhZGRyZXNzZXMgICgyNCBJU0EsICAxNiBFSVNBKS4gICBJIGhhdmUgIGNoZWNrZWQgZGlmZmVyZW50CisgICBjb25maWd1cmF0aW9ucyBvZiAgbXVsdGlwbGUgIGRlcGNhIGNhcmRzIGFuZCAgZXdyazMgY2FyZHMgIGFuZCBoYXZlICBub3QKKyAgIGZvdW5kIGEgcHJvYmxlbSB5ZXQgKHByb3ZpZGVkIHlvdSBoYXZlIGF0IGxlYXN0IGRlcGNhLmMgdjAuMzgpIC4uLgorCisgICBUaGUgYm9hcmQgSVJRIHNldHRpbmcgICBtdXN0IGJlIGF0ICBhbiB1bnVzZWQgIElSUSB3aGljaCBpcyAgYXV0by1wcm9iZWQKKyAgIHVzaW5nICBEb25hbGQgIEJlY2tlcidzIGF1dG9wcm9iZSAgcm91dGluZXMuICAgQWxsICB0aGVzZSBjYXJkcyAgIGFyZSBhdAorICAgezUsMTAsMTEsMTV9LgorCisgICBObyAxNk1CIG1lbW9yeSAgbGltaXRhdGlvbiBzaG91bGQgZXhpc3Qgd2l0aCB0aGlzICBkcml2ZXIgYXMgRE1BIGlzICBub3QKKyAgIHVzZWQgYW5kIHRoZSBjb21tb24gbWVtb3J5IGFyZWEgaXMgaW4gbG93IG1lbW9yeSBvbiB0aGUgbmV0d29yayBjYXJkIChteQorICAgY3VycmVudCBzeXN0ZW0gaGFzIDIwTUIgYW5kIEkndmUgbm90IGhhZCBwcm9ibGVtcyB5ZXQpLgorCisgICBUaGUgYWJpbGl0eSB0byBsb2FkICB0aGlzIGRyaXZlciBhcyBhICBsb2FkYWJsZSBtb2R1bGUgaGFzIGJlZW4gaW5jbHVkZWQKKyAgIGFuZCB1c2VkICBleHRlbnNpdmVseSBkdXJpbmcgdGhlICBkcml2ZXIgZGV2ZWxvcG1lbnQgKHRvIHNhdmUgdGhvc2UgbG9uZworICAgcmVib290IHNlcXVlbmNlcykuIFRvIHV0aWxpc2UgdGhpcyBhYmlsaXR5LCB5b3UgaGF2ZSB0byBkbyA4IHRoaW5nczoKKworICAgMCkgaGF2ZSBhIGNvcHkgb2YgdGhlIGxvYWRhYmxlIG1vZHVsZXMgY29kZSBpbnN0YWxsZWQgb24geW91ciBzeXN0ZW0uCisgICAxKSBjb3B5IGV3cmszLmMgZnJvbSB0aGUgIC9saW51eC9kcml2ZXJzL25ldCBkaXJlY3RvcnkgdG8geW91ciBmYXZvdXJpdGUKKyAgIHRlbXBvcmFyeSBkaXJlY3RvcnkuCisgICAyKSBlZGl0IHRoZSAgc291cmNlIGNvZGUgbmVhciAgbGluZSAxODk4IHRvIHJlZmxlY3QgIHRoZSBJL08gYWRkcmVzcyBhbmQKKyAgIElSUSB5b3UncmUgdXNpbmcuCisgICAzKSBjb21waWxlICBld3JrMy5jLCBidXQgaW5jbHVkZSAtRE1PRFVMRSBpbiAgdGhlIGNvbW1hbmQgbGluZSB0byBlbnN1cmUKKyAgIHRoYXQgdGhlIGNvcnJlY3QgYml0cyBhcmUgY29tcGlsZWQgKHNlZSBlbmQgb2Ygc291cmNlIGNvZGUpLgorICAgNCkgaWYgeW91IGFyZSB3YW50aW5nIHRvIGFkZCBhIG5ldyAgY2FyZCwgZ290byA1LiBPdGhlcndpc2UsIHJlY29tcGlsZSBhCisgICBrZXJuZWwgd2l0aCB0aGUgZXdyazMgY29uZmlndXJhdGlvbiB0dXJuZWQgb2ZmIGFuZCByZWJvb3QuCisgICA1KSBpbnNtb2QgZXdyazMubworICAgW0FsYW4gQ294OiBDaGFuZ2VkIHRoaXMgc28geW91IGNhbiBpbnNtb2QgZXdyazMubyBpcnE9eCBpbz15XQorICAgW0FkYW0gS3JvcGVsaW46IG5vdyBhY2NlcHRzIGlycT14MSx4MiBpbz15MSx5MiBmb3IgbXVsdGlwbGUgY2FyZHNdCisgICA2KSBydW4gdGhlIG5ldCBzdGFydHVwIGJpdHMgZm9yIHlvdXIgbmV3IGV0aD8/IGludGVyZmFjZSBtYW51YWxseQorICAgKHVzdWFsbHkgL2V0Yy9yYy5pbmV0WzEyXSBhdCBib290IHRpbWUpLgorICAgNykgZW5qb3khCisKKyAgIE5vdGUgdGhhdCBhdXRvcHJvYmluZyBpcyBub3QgYWxsb3dlZCBpbiBsb2FkYWJsZSBtb2R1bGVzIC0gdGhlIHN5c3RlbSBpcworICAgYWxyZWFkeSB1cCBhbmQgcnVubmluZyBhbmQgeW91J3JlIG1lc3Npbmcgd2l0aCBpbnRlcnJ1cHRzLgorCisgICBUbyB1bmxvYWQgYSBtb2R1bGUsIHR1cm4gb2ZmIHRoZSBhc3NvY2lhdGVkIGludGVyZmFjZQorICAgJ2lmY29uZmlnIGV0aD8/IGRvd24nIHRoZW4gJ3JtbW9kIGV3cmszJy4KKworICAgUHJvbWlzY3VvdXMgICBtb2RlIGhhcyBiZWVuICB0dXJuZWQgIG9mZiAgaW4gdGhpcyBkcml2ZXIsICAgYnV0ICBhbGwgdGhlCisgICBtdWx0aWNhc3QgIGFkZHJlc3MgYml0cyAgaGF2ZSBiZWVuICAgdHVybmVkIG9uLiBUaGlzICBpbXByb3ZlZCB0aGUgIHNlbmQKKyAgIHBlcmZvcm1hbmNlIG9uIGEgYnVzeSBuZXR3b3JrIGJ5IGFib3V0IDEzJS4KKworICAgSW9jdGwncyBoYXZlIG5vdyBiZWVuIHByb3ZpZGVkIChwcmltYXJpbHkgYmVjYXVzZSAgSSB3YW50ZWQgdG8gZ3JhYiBzb21lCisgICBwYWNrZXQgc2l6ZSBzdGF0aXN0aWNzKS4gVGhleSAgYXJlIHBhdHRlcm5lZCBhZnRlciAncGxpcGNvbmZpZy5jJyBmcm9tIGEKKyAgIHN1Z2dlc3Rpb24gYnkgQWxhbiBDb3guICBVc2luZyB0aGVzZSAgaW9jdGxzLCB5b3UgY2FuIGVuYWJsZSBwcm9taXNjdW91cworICAgbW9kZSwgYWRkL2RlbGV0ZSBtdWx0aWNhc3QgIGFkZHJlc3NlcywgY2hhbmdlIHRoZSBoYXJkd2FyZSBhZGRyZXNzLCAgZ2V0CisgICBwYWNrZXQgc2l6ZSBkaXN0cmlidXRpb24gc3RhdGlzdGljcyBhbmQgbXVjayBhcm91bmQgd2l0aCB0aGUgY29udHJvbCBhbmQKKyAgIHN0YXR1cyByZWdpc3Rlci4gSSdsbCBhZGQgb3RoZXJzIGlmIGFuZCB3aGVuIHRoZSBuZWVkIGFyaXNlcy4KKworICAgVE8gRE86CisgICAtLS0tLS0KKworCisgICBSZXZpc2lvbiBIaXN0b3J5CisgICAtLS0tLS0tLS0tLS0tLS0tCisKKyAgIFZlcnNpb24gICBEYXRlICAgICAgICBEZXNjcmlwdGlvbgorCisgICAwLjEgICAgIDI2LWF1Zy05NCAgIEluaXRpYWwgd3JpdGluZy4gQUxQSEEgY29kZSByZWxlYXNlLgorICAgMC4xMSAgICAzMS1hdWctOTQgICBGaXhlZDogMmsgbW9kZSBtZW1vcnkgYmFzZSBjYWxjLiwKKyAgIExlTUFDIHZlcnNpb24gY2FsYy4sCisgICBJUlEgdmVjdG9yIGFzc2lnbm1lbnRzIGR1cmluZyBhdXRvcHJvYmUuCisgICAwLjEyICAgIDMxLWF1Zy05NCAgIFRlc3RlZCB3b3JraW5nIG9uIExlTUFDMiAoREUyMFszNDVdLUFDKSBjYXJkLgorICAgRml4ZWQgdXAgTUNBIGhhc2ggdGFibGUgYWxnb3JpdGhtLgorICAgMC4yMCAgICAgNC1zZXAtOTQgICBBZGRlZCBJT0NUTCBmdW5jdGlvbmFsaXR5LgorICAgMC4yMSAgICAxNC1zZXAtOTQgICBBZGRlZCBJL08gbW9kZS4KKyAgIDAuMjFheHAgMTUtc2VwLTk0ICAgU3BlY2lhbCB2ZXJzaW9uIGZvciBBTFBIQSBBWFAgTGludXggVjEuMC4KKyAgIDAuMjIgICAgMTYtc2VwLTk0ICAgQWRkZWQgbW9yZSBJT0NUTHMgJiB0aWRpZWQgdXAuCisgICAwLjIzICAgIDIxLXNlcC05NCAgIEFkZGVkIHRyYW5zbWl0IGN1dCB0aHJvdWdoLgorICAgMC4yNCAgICAzMS1vY3QtOTQgICBBZGRlZCB1aWQgY2hlY2tzIGluIHNvbWUgaW9jdGxzLgorICAgMC4zMCAgICAgMS1ub3YtOTQgICBCRVRBIGNvZGUgcmVsZWFzZS4KKyAgIDAuMzEgICAgIDUtZGVjLTk0ICAgQWRkZWQgY2hlY2svYWxsb2NhdGUgcmVnaW9uIGNvZGUuCisgICAwLjMyICAgIDE2LWphbi05NSAgIEJyb2FkY2FzdCBwYWNrZXQgZml4LgorICAgMC4zMyAgICAxMC1GZWItOTUgICBGaXggcmVjb2duaXRpb24gYnVnIHJlcG9ydGVkIGJ5IDxia21Ac3Rhci5ybC5hYy51az4uCisgICAwLjQwICAgIDI3LURlYy05NSAgIFJhdGlvbmFsaXNlIE1PRFVMRSBhbmQgYXV0b3Byb2JlIGNvZGUuCisgICBSZXdyaXRlIGZvciBwb3J0YWJpbGl0eSAmIHVwZGF0ZWQuCisgICBBTFBIQSBzdXBwb3J0IGZyb20gPGplc3RhYnJvQGFtdC50YXkxLmRlYy5jb20+CisgICBBZGRlZCB2ZXJpZnlfYXJlYSgpIGNhbGxzIGluIGV3cmszX2lvY3RsKCkgZnJvbQorICAgc3VnZ2VzdGlvbiBieSA8aGVpa29AY29sb3NzdXMuZXNjYXBlLmRlPi4KKyAgIEFkZCBuZXcgbXVsdGljYXN0aW5nIGNvZGUuCisgICAwLjQxICAgIDIwLUphbi05NiAgIEZpeCBJUlEgc2V0IHVwIHByb2JsZW0gcmVwb3J0ZWQgYnkKKyAgIDxrZW5uZXRoQGJicy5zYXMubnR1LmFjLnNnPi4KKyAgIDAuNDIgICAgMjItQXByLTk2ICAgRml4IGFsbG9jX2RldmljZSgpIGJ1ZyA8amFyaUBtYXJra3VzMi5maW1yLmZpPgorICAgMC40MyAgICAxNi1BdWctOTYgICBVcGRhdGUgYWxsb2NfZGV2aWNlKCkgdG8gY29uZm9ybSB0byBkZTR4NS5jCisgICAwLjQ0ICAgIDA4LU5vdi0wMSAgIHVzZSBsaWJyYXJ5IGNyYzMyIGZ1bmN0aW9ucyA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgICAwLjQ1ICAgIDE5LUp1bC0wMiAgIGZpeCB1bmFsaWduZWQgYWNjZXNzIG9uIGFscGhhIDxtYXJ0aW5AYnJ1bGkubmV0PgorICAgMC40NiAgICAxMC1PY3QtMDIgICBNdWx0aXBsZSBOSUMgc3VwcG9ydCB3aGVuIG1vZHVsZSA8YWtyb3BlbDFAcm9jaGVzdGVyLnJyLmNvbT4KKyAgIDAuNDcgICAgMTgtT2N0LTAyICAgZXRodG9vbCBzdXBwb3J0IDxha3JvcGVsMUByb2NoZXN0ZXIucnIuY29tPgorICAgMC40OCAgICAxOC1PY3QtMDIgICBjbGkvc3RpIHJlbW92YWwgZm9yIDIuNSA8dmRhQHBvcnQuaW10cC5pbHlpY2hldnNrLm9kZXNzYS51YT4KKyAgIGlvY3RsIGxvY2tpbmcsIHNpZ25hdHVyZSBzZWFyY2ggY2xlYW51cCA8YWtyb3BlbDFAcm9jaGVzdGVyLnJyLmNvbT4KKworICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImV3cmszLmgiCisKKyNkZWZpbmUgRFJWX05BTUUJImV3cmszIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC40OCIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPQorRFJWX05BTUUgIjp2IiBEUlZfVkVSU0lPTiAiIDIwMDIvMTAvMTggZGF2aWVzQG1hbmlhYy51bHRyYW5ldC5jb21cbiI7CisKKyNpZmRlZiBFV1JLM19ERUJVRworc3RhdGljIGludCBld3JrM19kZWJ1ZyA9IEVXUkszX0RFQlVHOworI2Vsc2UKK3N0YXRpYyBpbnQgZXdyazNfZGVidWcgPSAxOworI2VuZGlmCisKKyNkZWZpbmUgRVdSSzNfTkRBIDB4ZmZlMAkvKiBObyBEZXZpY2UgQWRkcmVzcyAqLworCisjZGVmaW5lIFBST0JFX0xFTkdUSCAgICAzMgorI2RlZmluZSBFVEhfUFJPTV9TSUcgICAgMHhBQTU1MDBGRlVMCisKKyNpZm5kZWYgRVdSSzNfU0lHTkFUVVJFCisjZGVmaW5lIEVXUkszX1NJR05BVFVSRSB7IkRFMjAzIiwiREUyMDQiLCJERTIwNSIsIiJ9CisjZGVmaW5lIEVXUkszX1NUUkxFTiA4CisjZW5kaWYKKworI2lmbmRlZiBFV1JLM19SQU1fQkFTRV9BRERSRVNTRVMKKyNkZWZpbmUgRVdSSzNfUkFNX0JBU0VfQUREUkVTU0VTIHsweGMwMDAwLDB4ZDAwMDAsMHgwMDAwMH0KKyNlbmRpZgorCisvKgorICAgKiogU2V0cyB1cCB0aGUgSS9PIGFyZWEgZm9yIHRoZSBhdXRvcHJvYmUuCisgKi8KKyNkZWZpbmUgRVdSSzNfSU9fQkFTRSAweDEwMAkvKiBTdGFydCBhZGRyZXNzIGZvciBwcm9iZSBzZWFyY2ggKi8KKyNkZWZpbmUgRVdSSzNfSU9QX0lOQyAweDIwCS8qIEkvTyBhZGRyZXNzIGluY3JlbWVudCAqLworI2RlZmluZSBFV1JLM19UT1RBTF9TSVpFIDB4MjAJLyogcmVxdWlyZWQgSS9PIGFkZHJlc3MgbGVuZ3RoICovCisKKyNpZm5kZWYgTUFYX05VTV9FV1JLM1MKKyNkZWZpbmUgTUFYX05VTV9FV1JLM1MgMjEKKyNlbmRpZgorCisjaWZuZGVmIEVXUkszX0VJU0FfSU9fUE9SVFMKKyNkZWZpbmUgRVdSSzNfRUlTQV9JT19QT1JUUyAweDBjMDAJLyogSS9PIHBvcnQgYmFzZSBhZGRyZXNzLCBzbG90IDAgKi8KKyNlbmRpZgorCisjaWZuZGVmIE1BWF9FSVNBX1NMT1RTCisjZGVmaW5lIE1BWF9FSVNBX1NMT1RTIDE2CisjZGVmaW5lIEVJU0FfU0xPVF9JTkMgMHgxMDAwCisjZW5kaWYKKworI2RlZmluZSBRVUVVRV9QS1RfVElNRU9VVCAoMSpIWikJLyogSmlmZmllcyAqLworCisvKgorICAgKiogRXRoZXJXT1JLUyAzIHNoYXJlZCBtZW1vcnkgd2luZG93IHNpemVzCisgKi8KKyNkZWZpbmUgSU9fT05MWSAgICAgICAgIDB4MDAKKyNkZWZpbmUgU0hNRU1fMksgICAgICAgIDB4ODAwCisjZGVmaW5lIFNITUVNXzMySyAgICAgICAweDgwMDAKKyNkZWZpbmUgU0hNRU1fNjRLICAgICAgIDB4MTAwMDAKKworLyoKKyAgICoqIEV0aGVyV09SS1MgMyBJUlEgRU5BQkxFL0RJU0FCTEUKKyAqLworI2RlZmluZSBFTkFCTEVfSVJRcyB7IFwKKyAgaWNyIHw9IGxwLT5pcnFfbWFzaztcCisgIG91dGIoaWNyLCBFV1JLM19JQ1IpOyAgICAgICAgICAgICAgICAgICAgIC8qIEVuYWJsZSB0aGUgSVJRcyAqL1wKK30KKworI2RlZmluZSBESVNBQkxFX0lSUXMgeyBcCisgIGljciA9IGluYihFV1JLM19JQ1IpO1wKKyAgaWNyICY9IH5scC0+aXJxX21hc2s7XAorICBvdXRiKGljciwgRVdSSzNfSUNSKTsgICAgICAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBJUlFzICovXAorfQorCisvKgorICAgKiogRXRoZXJXT1JLUyAzIFNUQVJUL1NUT1AKKyAqLworI2RlZmluZSBTVEFSVF9FV1JLMyB7IFwKKyAgY3NyID0gaW5iKEVXUkszX0NTUik7XAorICBjc3IgJj0gfihDU1JfVFhEfENTUl9SWEQpO1wKKyAgb3V0Yihjc3IsIEVXUkszX0NTUik7ICAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIHRoZSBUWCBhbmQvb3IgUlggKi9cCit9CisKKyNkZWZpbmUgU1RPUF9FV1JLMyB7IFwKKyAgY3NyID0gKENTUl9UWER8Q1NSX1JYRCk7XAorICBvdXRiKGNzciwgRVdSSzNfQ1NSKTsgICAgICAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBUWCBhbmQvb3IgUlggKi9cCit9CisKKy8qCisgICAqKiBUaGUgRXRoZXJXT1JLUyAzIHByaXZhdGUgc3RydWN0dXJlCisgKi8KKyNkZWZpbmUgRVdSSzNfUEtUX1NUQVRfU1ogMTYKKyNkZWZpbmUgRVdSSzNfUEtUX0JJTl9TWiAgMTI4CS8qIFNob3VsZCBiZSA+PTEwMCB1bmxlc3MgeW91CisJCQkJICAgaW5jcmVhc2UgRVdSSzNfUEtUX1NUQVRfU1ogKi8KKworc3RydWN0IGV3cmszX3N0YXRzIHsKKwl1MzIgYmluc1tFV1JLM19QS1RfU1RBVF9TWl07CisJdTMyIHVuaWNhc3Q7CisJdTMyIG11bHRpY2FzdDsKKwl1MzIgYnJvYWRjYXN0OworCXUzMiBleGNlc3NpdmVfY29sbGlzaW9uczsKKwl1MzIgdHhfdW5kZXJydW5zOworCXUzMiBleGNlc3NpdmVfdW5kZXJydW5zOworfTsKKworc3RydWN0IGV3cmszX3ByaXZhdGUgeworCWNoYXIgYWRhcHRlcl9uYW1lWzgwXTsJLyogTmFtZSBleHBvcnRlZCB0byAvcHJvYy9pb3BvcnRzICovCisJdV9sb25nIHNobWVtX2Jhc2U7CS8qIFNoYXJlZCBtZW1vcnkgc3RhcnQgYWRkcmVzcyAqLworCXZvaWQgX19pb21lbSAqc2htZW07CisJdV9sb25nIHNobWVtX2xlbmd0aDsJLyogU2hhcmVkIG1lbW9yeSB3aW5kb3cgbGVuZ3RoICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CS8qIFB1YmxpYyBzdGF0cyAqLworCXN0cnVjdCBld3JrM19zdGF0cyBwa3RTdGF0czsgLyogUHJpdmF0ZSBzdGF0cyBjb3VudGVycyAqLworCXVfY2hhciBpcnFfbWFzazsJLyogQWRhcHRlciBJUlEgbWFzayBiaXRzICovCisJdV9jaGFyIG1QYWdlOwkJLyogTWF4aW11bSAya0IgUGFnZSBudW1iZXIgKi8KKwl1X2NoYXIgbGVtYWM7CQkvKiBDaGlwIHJldi4gbGV2ZWwgKi8KKwl1X2NoYXIgaGFyZF9zdHJhcHBlZDsJLyogRG9uJ3QgYWxsb3cgYSBmdWxsIG9wZW4gKi8KKwl1X2NoYXIgdHhjOwkJLyogVHJhbnNtaXQgY3V0IHRocm91Z2ggKi8KKwl2b2lkIF9faW9tZW0gKm1jdGJsOwkvKiBQb2ludGVyIHRvIHRoZSBtdWx0aWNhc3QgdGFibGUgKi8KKwl1X2NoYXIgbGVkX21hc2s7CS8qIFVzZWQgdG8gcmVzZXJ2ZSBMRUQgYWNjZXNzIGZvciBldGh0b29sICovCisJc3BpbmxvY2tfdCBod19sb2NrOworfTsKKworLyoKKyAgICoqIEZvcmNlIHRoZSBFdGhlcldPUktTIDMgY2FyZCB0byBiZSBpbiAya0IgTU9ERQorICovCisjZGVmaW5lIEZPUkNFXzJLX01PREUgeyBcCisgIHNobWVtX2xlbmd0aCA9IFNITUVNXzJLO1wKKyAgb3V0YigoKG1lbV9zdGFydCAtIDB4ODAwMDApID4+IDExKSwgRVdSSzNfTUJSKTtcCit9CisKKy8qCisgICAqKiBQdWJsaWMgRnVuY3Rpb25zCisgKi8KK3N0YXRpYyBpbnQgZXdyazNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZXdyazNfcXVldWVfcGt0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGV3cmszX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgZXdyazNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmV3cmszX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZXdyazNfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzXzIwMzsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHM7CisKKy8qCisgICAqKiBQcml2YXRlIGZ1bmN0aW9ucworICovCitzdGF0aWMgaW50IGV3cmszX2h3X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9sb25nIGlvYmFzZSk7CitzdGF0aWMgdm9pZCBld3JrM19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBld3JrM19yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZXdyazNfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBld3JrM190aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZCBFdGh3cmtTaWduYXR1cmUoY2hhciAqbmFtZSwgY2hhciAqZWVwcm9tX2ltYWdlKTsKK3N0YXRpYyBpbnQgRGV2aWNlUHJlc2VudCh1X2xvbmcgaW9iYXNlKTsKK3N0YXRpYyB2b2lkIFNldE11bHRpY2FzdEZpbHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgRUlTQV9zaWduYXR1cmUoY2hhciAqbmFtZSwgczMyIGVpc2FfaWQpOworCitzdGF0aWMgaW50IFJlYWRfRUVQUk9NKHVfbG9uZyBpb2Jhc2UsIHVfY2hhciBlYWRkcik7CitzdGF0aWMgaW50IFdyaXRlX0VFUFJPTShzaG9ydCBkYXRhLCB1X2xvbmcgaW9iYXNlLCB1X2NoYXIgZWFkZHIpOworc3RhdGljIHVfY2hhciBnZXRfaHdfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgKiBlZXByb21faW1hZ2UsIGNoYXIgY2hpcFR5cGUpOworCitzdGF0aWMgaW50IGV3cmszX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2xvbmcgaW9iYXNlLCBpbnQgaXJxKTsKK3N0YXRpYyBpbnQgaXNhX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfbG9uZyBpb2Jhc2UpOworc3RhdGljIGludCBlaXNhX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfbG9uZyBpb2Jhc2UpOworCitzdGF0aWMgdV9jaGFyIGlycVtNQVhfTlVNX0VXUkszUysxXSA9IHs1LCAwLCAxMCwgMywgMTEsIDksIDE1LCAxMn07CisKK3N0YXRpYyBjaGFyIG5hbWVbRVdSSzNfU1RSTEVOICsgMV07CitzdGF0aWMgaW50IG51bV9ld3JrczNzOworCisvKgorICAgKiogTWlzY2VsbGFuZW91cyBkZWZpbmVzLi4uCisgKi8KKyNkZWZpbmUgSU5JVF9FV1JLMyB7XAorICAgIG91dGIoRUVQUk9NX0lOSVQsIEVXUkszX0lPUFIpO1wKKyAgICBtZGVsYXkoMSk7XAorfQorCisjaWZuZGVmIE1PRFVMRQorc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgZXdyazNfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgZXdyazNfcHJpdmF0ZSkpOworCWludCBlcnI7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwl9CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJZXJyID0gZXdyazNfcHJvYmUxKGRldiwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKwlpZiAoZXJyKSAKKwkJZ290byBvdXQ7CisJcmV0dXJuIGRldjsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7CisJCit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgZXdyazNfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfbG9uZyBpb2Jhc2UsIGludCBpcnEpCit7CisJaW50IGVycjsKKworCWRldi0+YmFzZV9hZGRyID0gaW9iYXNlOworCWRldi0+aXJxID0gaXJxOworCisJLyogQWRkcmVzcyBQUk9NIHBhdHRlcm4gKi8KKwllcnIgPSBpc2FfcHJvYmUoZGV2LCBpb2Jhc2UpOworCWlmIChlcnIgIT0gMCkgCisJCWVyciA9IGVpc2FfcHJvYmUoZGV2LCBpb2Jhc2UpOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBFV1JLM19UT1RBTF9TSVpFKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IAorZXdyazNfaHdfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2xvbmcgaW9iYXNlKQoreworCXN0cnVjdCBld3JrM19wcml2YXRlICpscDsKKwlpbnQgaSwgc3RhdHVzID0gMDsKKwl1X2xvbmcgbWVtX3N0YXJ0LCBzaG1lbV9sZW5ndGg7CisJdV9jaGFyIGNyLCBjbXIsIGljciwgbmljc3IsIGxlbWFjLCBoYXJkX3N0cmFwcGVkID0gMDsKKwl1X2NoYXIgZWVwcm9tX2ltYWdlW0VFUFJPTV9NQVhdLCBjaGtzdW0sIGVpc2FfY3IgPSAwOworCisJLyoKKwkqKiBTdG9wIHRoZSBFV1JLMy4gRW5hYmxlIHRoZSBEQlIgUk9NLiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHJlbW90ZSBib290LgorCSoqIFRoaXMgYWxzbyBkaXNhYmxlcyB0aGUgRUlTQV9FTkFCTEUgYml0IGluIHRoZSBFSVNBIENvbnRyb2wgUmVnaXN0ZXIuCisJICovCisJaWYgKGlvYmFzZSA+IDB4NDAwKQorCQllaXNhX2NyID0gaW5iKEVJU0FfQ1IpOworCUlOSVRfRVdSSzM7CisKKwluaWNzciA9IGluYihFV1JLM19DU1IpOworCisJaWNyID0gaW5iKEVXUkszX0lDUik7CisJaWNyICY9IDB4NzA7CisJb3V0YihpY3IsIEVXUkszX0lDUik7CS8qIERpc2FibGUgYWxsIHRoZSBJUlFzICovCisKKwlpZiAobmljc3IgPT0gKENTUl9UWEQgfCBDU1JfUlhEKSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCisJLyogQ2hlY2sgdGhhdCB0aGUgRUVQUk9NIGlzIGFsaXZlIGFuZCB3ZWxsIGFuZCBub3QgbGl2aW5nIG9uIFBsdXRvLi4uICovCisJZm9yIChjaGtzdW0gPSAwLCBpID0gMDsgaSA8IEVFUFJPTV9NQVg7IGkgKz0gMikgeworCQl1bmlvbiB7CisJCQlzaG9ydCB2YWw7CisJCQljaGFyIGNbMl07CisJCX0gdG1wOworCisJCXRtcC52YWwgPSAoc2hvcnQpIFJlYWRfRUVQUk9NKGlvYmFzZSwgKGkgPj4gMSkpOworCQllZXByb21faW1hZ2VbaV0gPSB0bXAuY1swXTsKKwkJZWVwcm9tX2ltYWdlW2kgKyAxXSA9IHRtcC5jWzFdOworCQljaGtzdW0gKz0gZWVwcm9tX2ltYWdlW2ldICsgZWVwcm9tX2ltYWdlW2kgKyAxXTsKKwl9CisKKwlpZiAoY2hrc3VtICE9IDApIHsJLyogQmFkIEVFUFJPTSBEYXRhISAqLworCQlwcmludGsoIiVzOiBEZXZpY2UgaGFzIGEgYmFkIG9uLWJvYXJkIEVFUFJPTS5cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCQorCUV0aHdya1NpZ25hdHVyZShuYW1lLCBlZXByb21faW1hZ2UpOworCWlmICgqbmFtZSA9PSAnXDAnKSAKKwkJcmV0dXJuIC1FTlhJTzsKKworCWRldi0+YmFzZV9hZGRyID0gaW9iYXNlOworCQkJCQorCWlmIChpb2Jhc2UgPiAweDQwMCkgeworCQlvdXRiKGVpc2FfY3IsIEVJU0FfQ1IpOwkJLyogUmV3cml0ZSB0aGUgRUlTQSBDUiAqLworCX0KKwlsZW1hYyA9IGVlcHJvbV9pbWFnZVtFRVBST01fQ0hJUFZFUl07CisJY21yID0gaW5iKEVXUkszX0NNUik7CisJCisJaWYgKCgobGVtYWMgPT0gTGVNQUMpICYmICgoY21yICYgQ01SX05PX0VFUFJPTSkgIT0gQ01SX05PX0VFUFJPTSkpIHx8CisJICAgICgobGVtYWMgPT0gTGVNQUMyKSAmJiAhKGNtciAmIENNUl9IUykpKSB7CisJCXByaW50aygiJXM6ICVzIGF0ICUjNGx4IiwgZGV2LT5uYW1lLCBuYW1lLCBpb2Jhc2UpOworCQloYXJkX3N0cmFwcGVkID0gMTsKKwl9IGVsc2UgaWYgKChpb2Jhc2UgJiAweDBmZmYpID09IEVXUkszX0VJU0FfSU9fUE9SVFMpIHsKKwkJLyogRUlTQSBzbG90IGFkZHJlc3MgKi8KKwkJcHJpbnRrKCIlczogJXMgYXQgJSM0bHggKEVJU0Egc2xvdCAlbGQpIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbmFtZSwgaW9iYXNlLCAoKGlvYmFzZSA+PiAxMikgJiAweDBmKSk7CisJfSBlbHNlIHsJLyogSVNBIHBvcnQgYWRkcmVzcyAqLworCQlwcmludGsoIiVzOiAlcyBhdCAlIzRseCIsIGRldi0+bmFtZSwgbmFtZSwgaW9iYXNlKTsKKwl9CisKKwlwcmludGsoIiwgaC93IGFkZHJlc3MgIik7CisJaWYgKGxlbWFjICE9IExlTUFDMikKKwkJRGV2aWNlUHJlc2VudChpb2Jhc2UpOwkvKiBuZWVkIGFmdGVyIEVXUkszX0lOSVQgKi8KKwlzdGF0dXMgPSBnZXRfaHdfYWRkcihkZXYsIGVlcHJvbV9pbWFnZSwgbGVtYWMpOworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTiAtIDE7IGkrKykgewkvKiBnZXQgdGhlIGV0aGVybmV0IGFkZHIuICovCisJCXByaW50aygiJTIuMng6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJfQorCXByaW50aygiJTIuMngsXG4iLCBkZXYtPmRldl9hZGRyW2ldKTsKKwkKKwlpZiAoc3RhdHVzKSB7CisJCXByaW50aygiICAgICAgd2hpY2ggaGFzIGFuIEVFUFJPTSBDUkMgZXJyb3IuXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlpZiAobGVtYWMgPT0gTGVNQUMyKSB7CS8qIFNwZWNpYWwgTGVNQUMyIENNUiB0aGluZ3MgKi8KKwkJY21yICY9IH4oQ01SX1JBIHwgQ01SX1dCIHwgQ01SX0xJTksgfCBDTVJfUE9MQVJJVFkgfCBDTVJfMFdTKTsKKwkJaWYgKGVlcHJvbV9pbWFnZVtFRVBST01fTUlTQzBdICYgUkVBRF9BSEVBRCkKKwkJCWNtciB8PSBDTVJfUkE7CisJCWlmIChlZXByb21faW1hZ2VbRUVQUk9NX01JU0MwXSAmIFdSSVRFX0JFSElORCkKKwkJCWNtciB8PSBDTVJfV0I7CisJCWlmIChlZXByb21faW1hZ2VbRUVQUk9NX05FVE1BTjBdICYgTkVUTUFOX1BPTCkKKwkJCWNtciB8PSBDTVJfUE9MQVJJVFk7CisJCWlmIChlZXByb21faW1hZ2VbRUVQUk9NX05FVE1BTjBdICYgTkVUTUFOX0xJTkspCisJCQljbXIgfD0gQ01SX0xJTks7CisJCWlmIChlZXByb21faW1hZ2VbRUVQUk9NX01JU0MwXSAmIF8wV1NfRU5BKQorCQkJY21yIHw9IENNUl8wV1M7CisJfQorCWlmIChlZXByb21faW1hZ2VbRUVQUk9NX1NFVFVQXSAmIFNFVFVQX0RSQU0pCisJCWNtciB8PSBDTVJfRFJBTTsKKwlvdXRiKGNtciwgRVdSSzNfQ01SKTsKKwkKKwljciA9IGluYihFV1JLM19DUik7CS8qIFNldCB1cCB0aGUgQ29udHJvbCBSZWdpc3RlciAqLworCWNyIHw9IGVlcHJvbV9pbWFnZVtFRVBST01fU0VUVVBdICYgU0VUVVBfQVBEOworCWlmIChjciAmIFNFVFVQX0FQRCkKKwkJY3IgfD0gZWVwcm9tX2ltYWdlW0VFUFJPTV9TRVRVUF0gJiBTRVRVUF9QUzsKKwljciB8PSBlZXByb21faW1hZ2VbRUVQUk9NX01JU0MwXSAmIEZBU1RfQlVTOworCWNyIHw9IGVlcHJvbV9pbWFnZVtFRVBST01fTUlTQzBdICYgRU5BXzE2OworCW91dGIoY3IsIEVXUkszX0NSKTsKKworCS8qCisJKiogRGV0ZXJtaW5lIHRoZSBiYXNlIGFkZHJlc3MgYW5kIHdpbmRvdyBsZW5ndGggZm9yIHRoZSBFV1JLMworCSoqIFJBTSBmcm9tIHRoZSBtZW1vcnkgYmFzZSByZWdpc3Rlci4KKwkqLworCW1lbV9zdGFydCA9IGluYihFV1JLM19NQlIpOworCXNobWVtX2xlbmd0aCA9IDA7CisJaWYgKG1lbV9zdGFydCAhPSAwKSB7CisJCWlmICgobWVtX3N0YXJ0ID49IDB4MGEpICYmIChtZW1fc3RhcnQgPD0gMHgwZikpIHsKKwkJCW1lbV9zdGFydCAqPSBTSE1FTV82NEs7CisJCQlzaG1lbV9sZW5ndGggPSBTSE1FTV82NEs7CisJCX0gZWxzZSBpZiAoKG1lbV9zdGFydCA+PSAweDE0KSAmJiAobWVtX3N0YXJ0IDw9IDB4MWYpKSB7CisJCQltZW1fc3RhcnQgKj0gU0hNRU1fMzJLOworCQkJc2htZW1fbGVuZ3RoID0gU0hNRU1fMzJLOworCQl9IGVsc2UgaWYgKChtZW1fc3RhcnQgPj0gMHg0MCkgJiYgKG1lbV9zdGFydCA8PSAweGZmKSkgeworCQkJbWVtX3N0YXJ0ID0gbWVtX3N0YXJ0ICogU0hNRU1fMksgKyAweDgwMDAwOworCQkJc2htZW1fbGVuZ3RoID0gU0hNRU1fMks7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJfQorCS8qCisJKiogU2VlIHRoZSB0b3Agb2YgdGhpcyBzb3VyY2UgY29kZSBmb3IgY29tbWVudHMgYWJvdXQKKwkqKiB1bmNvbW1lbnRpbmcgdGhpcyBsaW5lLgorCSovCisvKiAgICAgICAgICBGT1JDRV8yS19NT0RFOyAqLworCQorCWlmIChoYXJkX3N0cmFwcGVkKSB7CisJCXByaW50aygiICAgICAgaXMgaGFyZCBzdHJhcHBlZC5cbiIpOworCX0gZWxzZSBpZiAobWVtX3N0YXJ0KSB7CisJCXByaW50aygiICAgICAgaGFzIGEgJWRrIFJBTSB3aW5kb3ciLCAoaW50KSAoc2htZW1fbGVuZ3RoID4+IDEwKSk7CisJCXByaW50aygiIGF0IDB4JS41bHgiLCBtZW1fc3RhcnQpOworCX0gZWxzZSB7CisJCXByaW50aygiICAgICAgaXMgaW4gSS9PIG9ubHkgbW9kZSIpOworCX0KKworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlscC0+c2htZW1fYmFzZSA9IG1lbV9zdGFydDsKKwlscC0+c2htZW0gPSBpb3JlbWFwKG1lbV9zdGFydCwgc2htZW1fbGVuZ3RoKTsKKwlpZiAoIWxwLT5zaG1lbSkKKwkJcmV0dXJuIC1FTk9NRU07CisJbHAtPnNobWVtX2xlbmd0aCA9IHNobWVtX2xlbmd0aDsKKwlscC0+bGVtYWMgPSBsZW1hYzsKKwlscC0+aGFyZF9zdHJhcHBlZCA9IGhhcmRfc3RyYXBwZWQ7CisJbHAtPmxlZF9tYXNrID0gQ1JfTEVEOworCXNwaW5fbG9ja19pbml0KCZscC0+aHdfbG9jayk7CisJCisJbHAtPm1QYWdlID0gNjQ7CisJaWYgKGNtciAmIENNUl9EUkFNKQorCQlscC0+bVBhZ2UgPDw9IDE7CS8qIDIgRFJBTVMgb24gbW9kdWxlICovCisJCisJc3ByaW50ZihscC0+YWRhcHRlcl9uYW1lLCAiJXMgKCVzKSIsIG5hbWUsIGRldi0+bmFtZSk7CisJCisJbHAtPmlycV9tYXNrID0gSUNSX1RORU0gfCBJQ1JfVFhETSB8IElDUl9STkVNIHwgSUNSX1JYRE07CisJCisJaWYgKCFoYXJkX3N0cmFwcGVkKSB7CisJCS8qCisJCSoqIEVuYWJsZSBFV1JLMyBib2FyZCBpbnRlcnJ1cHRzIGZvciBhdXRvcHJvYmluZworCQkqLworCQlpY3IgfD0gSUNSX0lFOwkvKiBFbmFibGUgaW50ZXJydXB0cyAqLworCQlvdXRiKGljciwgRVdSSzNfSUNSKTsKKwkJCisJCS8qIFRoZSBETUEgY2hhbm5lbCBtYXkgYmUgcGFzc2VkIGluIG9uIHRoaXMgcGFyYW1ldGVyLiAqLworCQlkZXYtPmRtYSA9IDA7CisJCQorCQkvKiBUbyBhdXRvLUlSUSB3ZSBlbmFibGUgdGhlIGluaXRpYWxpemF0aW9uLWRvbmUgYW5kIERNQSBlcnIsCisJCSAgIGludGVycnVwdHMuIEZvciBub3cgd2Ugd2lsbCBhbHdheXMgZ2V0IGEgRE1BIGVycm9yLiAqLworCQlpZiAoZGV2LT5pcnEgPCAyKSB7CisjaWZuZGVmIE1PRFVMRQorCQkJdV9jaGFyIGlycW51bTsKKwkJCXVuc2lnbmVkIGxvbmcgaXJxX21hc2s7CisJCQkKKworCQkJaXJxX21hc2sgPSBwcm9iZV9pcnFfb24oKTsKKwkJCQorCQkJLyoKKwkJCSoqIFRyaWdnZXIgYSBUTkUgaW50ZXJydXB0LgorCQkJKi8KKwkJCWljciB8PSBJQ1JfVE5FTTsKKwkJCW91dGIoMSwgRVdSSzNfVERRKTsJLyogV3JpdGUgdG8gdGhlIFRYIGRvbmUgcXVldWUgKi8KKwkJCW91dGIoaWNyLCBFV1JLM19JQ1IpOwkvKiBVbm1hc2sgdGhlIFRYRCBpbnRlcnJ1cHQgKi8KKwkJCQorCQkJaXJxbnVtID0gaXJxWygoaWNyICYgSVJRX1NFTCkgPj4gNCldOworCQkJCisJCQltZGVsYXkoMjApOworCQkJZGV2LT5pcnEgPSBwcm9iZV9pcnFfb2ZmKGlycV9tYXNrKTsKKwkJCWlmICgoZGV2LT5pcnEpICYmIChpcnFudW0gPT0gZGV2LT5pcnEpKSB7CisJCQkJcHJpbnRrKCIgYW5kIHVzZXMgSVJRJWQuXG4iLCBkZXYtPmlycSk7CisJCQl9IGVsc2UgeworCQkJCWlmICghZGV2LT5pcnEpIHsKKwkJCQkJcHJpbnRrKCIgYW5kIGZhaWxlZCB0byBkZXRlY3QgSVJRIGxpbmUuXG4iKTsKKwkJCQl9IGVsc2UgaWYgKChpcnFudW0gPT0gMSkgJiYgKGxlbWFjID09IExlTUFDMikpIHsKKwkJCQkJcHJpbnRrKCIgYW5kIGFuIGlsbGVnYWwgSVJRIGxpbmUgZGV0ZWN0ZWQuXG4iKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGsoIiwgYnV0IGluY29ycmVjdCBJUlEgbGluZSBkZXRlY3RlZC5cbiIpOworCQkJCX0KKwkJCQlpb3VubWFwKGxwLT5zaG1lbSk7CisJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCX0KKworCQkJRElTQUJMRV9JUlFzOwkvKiBNYXNrIGFsbCBpbnRlcnJ1cHRzICovCisKKyNlbmRpZgkJCQkvKiBNT0RVTEUgKi8KKwkJfSBlbHNlIHsKKwkJCXByaW50aygiIGFuZCByZXF1aXJlcyBJUlElZC5cbiIsIGRldi0+aXJxKTsKKwkJfQorCX0KKworCWlmIChld3JrM19kZWJ1ZyA+IDEpIHsKKwkJcHJpbnRrKHZlcnNpb24pOworCX0KKwkvKiBUaGUgRVdSSzMtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSBld3JrM19vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gZXdyazNfcXVldWVfcGt0OworCWRldi0+c3RvcCA9IGV3cmszX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gZXdyazNfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+ZG9faW9jdGwgPSBld3JrM19pb2N0bDsKKwlpZiAobHAtPmFkYXB0ZXJfbmFtZVs0XSA9PSAnMycpCisJCVNFVF9FVEhUT09MX09QUyhkZXYsICZldGh0b29sX29wc18yMDMpOworCWVsc2UKKwkJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmV0aHRvb2xfb3BzKTsKKwlkZXYtPnR4X3RpbWVvdXQgPSBld3JrM190aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBRVUVVRV9QS1RfVElNRU9VVDsKKwkKKwlkZXYtPm1lbV9zdGFydCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKwwKKworc3RhdGljIGludCBld3JrM19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV3cmszX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGksIHN0YXR1cyA9IDA7CisJdV9jaGFyIGljciwgY3NyOworCisJLyoKKwkgICAqKiBTdG9wIHRoZSBUWCBhbmQgUlguLi4KKwkgKi8KKwlTVE9QX0VXUkszOworCisJaWYgKCFscC0+aGFyZF9zdHJhcHBlZCkgeworCQlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICh2b2lkICopIGV3cmszX2ludGVycnVwdCwgMCwgImV3cmszIiwgZGV2KSkgeworCQkJcHJpbnRrKCJld3JrM19vcGVuKCk6IFJlcXVlc3RlZCBJUlElZCBpcyBidXN5XG4iLCBkZXYtPmlycSk7CisJCQlzdGF0dXMgPSAtRUFHQUlOOworCQl9IGVsc2UgeworCisJCQkvKgorCQkJICAgKiogUmUtaW5pdGlhbGl6ZSB0aGUgRVdSSzMuLi4KKwkJCSAqLworCQkJZXdyazNfaW5pdChkZXYpOworCisJCQlpZiAoZXdyazNfZGVidWcgPiAxKSB7CisJCQkJcHJpbnRrKCIlczogZXdyazMgb3BlbiB3aXRoIGlycSAlZFxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCQkJcHJpbnRrKCIgIHBoeXNpY2FsIGFkZHJlc3M6ICIpOworCQkJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJCQkJcHJpbnRrKCIlMi4yeDoiLCAodV9jaGFyKSBkZXYtPmRldl9hZGRyW2ldKTsKKwkJCQl9CisJCQkJcHJpbnRrKCIlMi4yeFxuIiwgKHVfY2hhcikgZGV2LT5kZXZfYWRkcltpXSk7CisJCQkJaWYgKGxwLT5zaG1lbV9sZW5ndGggPT0gMCkgeworCQkJCQlwcmludGsoIiAgbm8gc2hhcmVkIG1lbW9yeSwgSS9PIG9ubHkgbW9kZVxuIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRrKCIgIHN0YXJ0IG9mIHNoYXJlZCBtZW1vcnk6IDB4JTA4bHhcbiIsIGxwLT5zaG1lbV9iYXNlKTsKKwkJCQkJcHJpbnRrKCIgIHdpbmRvdyBsZW5ndGg6IDB4JTA0bHhcbiIsIGxwLT5zaG1lbV9sZW5ndGgpOworCQkJCX0KKwkJCQlwcmludGsoIiAgIyBvZiBEUkFNUzogJWRcbiIsICgoaW5iKEVXUkszX0NNUikgJiAweDAyKSA/IDIgOiAxKSk7CisJCQkJcHJpbnRrKCIgIGNzcjogIDB4JTAyeFxuIiwgaW5iKEVXUkszX0NTUikpOworCQkJCXByaW50aygiICBjcjogICAweCUwMnhcbiIsIGluYihFV1JLM19DUikpOworCQkJCXByaW50aygiICBpY3I6ICAweCUwMnhcbiIsIGluYihFV1JLM19JQ1IpKTsKKwkJCQlwcmludGsoIiAgY21yOiAgMHglMDJ4XG4iLCBpbmIoRVdSSzNfQ01SKSk7CisJCQkJcHJpbnRrKCIgIGZtcWM6IDB4JTAyeFxuIiwgaW5iKEVXUkszX0ZNUUMpKTsKKwkJCX0KKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCQkvKgorCQkJICAgKiogVW5tYXNrIEVXUkszIGJvYXJkIGludGVycnVwdHMKKwkJCSAqLworCQkJaWNyID0gaW5iKEVXUkszX0lDUik7CisJCQlFTkFCTEVfSVJRczsKKworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZXdyazMgYXZhaWxhYmxlIGZvciBoYXJkIHN0cmFwcGVkIHNldCB1cCBvbmx5LlxuIiwgZGV2LT5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIgICAgICBSdW4gdGhlICdld3JrM3NldHVwJyB1dGlsaXR5IG9yIHJlbW92ZSB0aGUgaGFyZCBzdHJhcHMuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAgICoqIEluaXRpYWxpemUgdGhlIEV0aGVyV09SS1MgMyBvcGVyYXRpbmcgY29uZGl0aW9ucworICovCitzdGF0aWMgdm9pZCBld3JrM19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV3cmszX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1X2NoYXIgY3NyLCBwYWdlOworCXVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaTsKKworCS8qCisJICAgKiogRW5hYmxlIGFueSBtdWx0aWNhc3RzCisJICovCisJc2V0X211bHRpY2FzdF9saXN0KGRldik7CisKKwkvKgorCSoqIFNldCBoYXJkd2FyZSBNQUMgYWRkcmVzcy4gQWRkcmVzcyBpcyBpbml0aWFsaXplZCBmcm9tIHRoZSBFRVBST00KKwkqKiBkdXJpbmcgc3RhcnR1cCBidXQgbWF5IGhhdmUgc2luY2UgYmVlbiBjaGFuZ2VkIGJ5IHRoZSB1c2VyLgorCSovCisJZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykKKwkJb3V0YihkZXYtPmRldl9hZGRyW2ldLCBFV1JLM19QQVIwICsgaSk7CisKKwkvKgorCSAgICoqIENsZWFuIG91dCBhbnkgcmVtYWluaW5nIGVudHJpZXMgaW4gYWxsIHRoZSBxdWV1ZXMgaGVyZQorCSAqLworCXdoaWxlIChpbmIoRVdSSzNfVFEpKTsKKwl3aGlsZSAoaW5iKEVXUkszX1REUSkpOworCXdoaWxlIChpbmIoRVdSSzNfUlEpKTsKKwl3aGlsZSAoaW5iKEVXUkszX0ZNUSkpOworCisJLyoKKwkgICAqKiBXcml0ZSBhIGNsZWFuIGZyZWUgbWVtb3J5IHF1ZXVlCisJICovCisJZm9yIChwYWdlID0gMTsgcGFnZSA8IGxwLT5tUGFnZTsgcGFnZSsrKSB7CS8qIFdyaXRlIHRoZSBmcmVlIHBhZ2UgbnVtYmVycyAqLworCQlvdXRiKHBhZ2UsIEVXUkszX0ZNUSk7CS8qIHRvIHRoZSBGcmVlIE1lbW9yeSBRdWV1ZSAqLworCX0KKworCVNUQVJUX0VXUkszOwkJLyogRW5hYmxlIHRoZSBUWCBhbmQvb3IgUlggKi8KK30KKworLyoKKyAqICBUcmFuc21pdCB0aW1lb3V0CisgKi8KKyAKK3N0YXRpYyB2b2lkIGV3cmszX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXdyazNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVfY2hhciBpY3IsIGNzcjsKKwl1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJCisJaWYgKCFscC0+aGFyZF9zdHJhcHBlZCkgCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HIiVzOiB0cmFuc21pdCB0aW1lZC9sb2NrZWQgb3V0LCBzdGF0dXMgJTA0eCwgcmVzZXR0aW5nLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgaW5iKEVXUkszX0NTUikpOworCisJCS8qCisJCSAgICoqIE1hc2sgYWxsIGJvYXJkIGludGVycnVwdHMKKwkJICovCisJCURJU0FCTEVfSVJRczsKKworCQkvKgorCQkgICAqKiBTdG9wIHRoZSBUWCBhbmQgUlguLi4KKwkJICovCisJCVNUT1BfRVdSSzM7CisKKwkJZXdyazNfaW5pdChkZXYpOworCisJCS8qCisJCSAgICoqIFVubWFzayBFV1JLMyBib2FyZCBpbnRlcnJ1cHRzCisJCSAqLworCQlFTkFCTEVfSVJRczsKKworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KK30KKworLyoKKyAgICoqIFdyaXRlcyBhIHNvY2tldCBidWZmZXIgdG8gdGhlIGZyZWUgcGFnZSBxdWV1ZQorICovCitzdGF0aWMgaW50IGV3cmszX3F1ZXVlX3BrdCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXdyazNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwl2b2lkIF9faW9tZW0gKmJ1ZiA9IE5VTEw7CisJdV9jaGFyIGljcjsKKwl1X2NoYXIgcGFnZTsKKworCXNwaW5fbG9ja19pcnEgKCZscC0+aHdfbG9jayk7CisJRElTQUJMRV9JUlFzOworCisJLyogaWYgbm8gcmVzb3VyY2VzIGF2YWlsYWJsZSwgZXhpdCwgcmVxdWVzdCBwYWNrZXQgYmUgcXVldWVkICovCisJaWYgKGluYiAoRVdSSzNfRk1RQykgPT0gMCkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGV3cmszX3F1ZXVlX3BrdCgpOiBObyBmcmVlIHJlc291cmNlcy4uLlxuIiwKKwkJCWRldi0+bmFtZSk7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogZXdyazNfcXVldWVfcGt0KCk6IENTUjogJTAyeCBJQ1I6ICUwMnggRk1RQzogJTAyeFxuIiwKKwkJCWRldi0+bmFtZSwgaW5iIChFV1JLM19DU1IpLCBpbmIgKEVXUkszX0lDUiksCisJCQlpbmIgKEVXUkszX0ZNUUMpKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qCisJICoqIEdldCBhIGZyZWUgcGFnZSBmcm9tIHRoZSBGTVEKKwkgKi8KKwlpZiAoKHBhZ2UgPSBpbmIgKEVXUkszX0ZNUSkpID49IGxwLT5tUGFnZSkgeworCQlwcmludGsgKCJld3JrM19xdWV1ZV9wa3QoKTogSW52YWxpZCBmcmVlIG1lbW9yeSBwYWdlICglZCkuXG4iLAorCQkgICAgICh1X2NoYXIpIHBhZ2UpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisKKwkvKgorCSAqKiBTZXQgdXAgc2hhcmVkIG1lbW9yeSB3aW5kb3cgYW5kIHBvaW50ZXIgaW50byB0aGUgd2luZG93CisJICovCisJaWYgKGxwLT5zaG1lbV9sZW5ndGggPT0gSU9fT05MWSkgeworCQlvdXRiIChwYWdlLCBFV1JLM19JT1BSKTsKKwl9IGVsc2UgaWYgKGxwLT5zaG1lbV9sZW5ndGggPT0gU0hNRU1fMkspIHsKKwkJYnVmID0gbHAtPnNobWVtOworCQlvdXRiIChwYWdlLCBFV1JLM19NUFIpOworCX0gZWxzZSBpZiAobHAtPnNobWVtX2xlbmd0aCA9PSBTSE1FTV8zMkspIHsKKwkJYnVmID0gKCgoc2hvcnQpIHBhZ2UgPDwgMTEpICYgMHg3ODAwKSArIGxwLT5zaG1lbTsKKwkJb3V0YiAoKHBhZ2UgPj4gNCksIEVXUkszX01QUik7CisJfSBlbHNlIGlmIChscC0+c2htZW1fbGVuZ3RoID09IFNITUVNXzY0SykgeworCQlidWYgPSAoKChzaG9ydCkgcGFnZSA8PCAxMSkgJiAweGY4MDApICsgbHAtPnNobWVtOworCQlvdXRiICgocGFnZSA+PiA1KSwgRVdSSzNfTVBSKTsKKwl9IGVsc2UgeworCQlwcmludGsgKEtFUk5fRVJSICIlczogT29wcyAtIHlvdXIgcHJpdmF0ZSBkYXRhIGFyZWEgaXMgaG9zZWQhXG4iLAorCQkJZGV2LT5uYW1lKTsKKwkJQlVHICgpOworCX0KKworCS8qCisJICoqIFNldCB1cCB0aGUgYnVmZmVyIGNvbnRyb2wgc3RydWN0dXJlcyBhbmQgY29weSB0aGUgZGF0YSBmcm9tCisJICoqIHRoZSBzb2NrZXQgYnVmZmVyIHRvIHRoZSBzaGFyZWQgbWVtb3J5IC4KKwkgKi8KKwlpZiAobHAtPnNobWVtX2xlbmd0aCA9PSBJT19PTkxZKSB7CisJCWludCBpOworCQl1X2NoYXIgKnAgPSBza2ItPmRhdGE7CisJCW91dGIgKChjaGFyKSAoVENSX1FNT0RFIHwgVENSX1BBRCB8IFRDUl9JRkMpLCBFV1JLM19EQVRBKTsKKwkJb3V0YiAoKGNoYXIpIChza2ItPmxlbiAmIDB4ZmYpLCBFV1JLM19EQVRBKTsKKwkJb3V0YiAoKGNoYXIpICgoc2tiLT5sZW4gPj4gOCkgJiAweGZmKSwgRVdSSzNfREFUQSk7CisJCW91dGIgKChjaGFyKSAweDA0LCBFV1JLM19EQVRBKTsKKwkJZm9yIChpID0gMDsgaSA8IHNrYi0+bGVuOyBpKyspIHsKKwkJCW91dGIgKCpwKyssIEVXUkszX0RBVEEpOworCQl9CisJCW91dGIgKHBhZ2UsIEVXUkszX1RRKTsJLyogU3RhcnQgc2VuZGluZyBwa3QgKi8KKwl9IGVsc2UgeworCQl3cml0ZWIgKChjaGFyKSAoVENSX1FNT0RFIHwgVENSX1BBRCB8IFRDUl9JRkMpLCBidWYpOwkvKiBjdHJsIGJ5dGUgKi8KKwkJYnVmICs9IDE7CisJCXdyaXRlYiAoKGNoYXIpIChza2ItPmxlbiAmIDB4ZmYpLCBidWYpOwkvKiBsZW5ndGggKDE2IGJpdCB4ZmVyKSAqLworCQlidWYgKz0gMTsKKwkJaWYgKGxwLT50eGMpIHsKKwkJCXdyaXRlYigoKHNrYi0+bGVuID4+IDgpICYgMHhmZikgfCBYQ1QsIGJ1Zik7CisJCQlidWYgKz0gMTsKKwkJCXdyaXRlYiAoMHgwNCwgYnVmKTsJLyogaW5kZXggYnl0ZSAqLworCQkJYnVmICs9IDE7CisJCQl3cml0ZWIgKDB4MDAsIChidWYgKyBza2ItPmxlbikpOwkvKiBXcml0ZSB0aGUgWENUIGZsYWcgKi8KKwkJCW1lbWNweV90b2lvIChidWYsIHNrYi0+ZGF0YSwgUFJFTE9BRCk7CS8qIFdyaXRlIFBSRUxPQUQgYnl0ZXMgKi8KKwkJCW91dGIgKHBhZ2UsIEVXUkszX1RRKTsJLyogU3RhcnQgc2VuZGluZyBwa3QgKi8KKwkJCW1lbWNweV90b2lvIChidWYgKyBQUkVMT0FELAorCQkJCQkgc2tiLT5kYXRhICsgUFJFTE9BRCwKKwkJCQkJIHNrYi0+bGVuIC0gUFJFTE9BRCk7CisJCQl3cml0ZWIgKDB4ZmYsIChidWYgKyBza2ItPmxlbikpOwkvKiBXcml0ZSB0aGUgWENUIGZsYWcgKi8KKwkJfSBlbHNlIHsKKwkJCXdyaXRlYiAoKHNrYi0+bGVuID4+IDgpICYgMHhmZiwgYnVmKTsKKwkJCWJ1ZiArPSAxOworCQkJd3JpdGViICgweDA0LCBidWYpOwkvKiBpbmRleCBieXRlICovCisJCQlidWYgKz0gMTsKKwkJCW1lbWNweV90b2lvIChidWYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwkvKiBXcml0ZSBkYXRhIGJ5dGVzICovCisJCQlvdXRiIChwYWdlLCBFV1JLM19UUSk7CS8qIFN0YXJ0IHNlbmRpbmcgcGt0ICovCisJCX0KKwl9CisKKwlFTkFCTEVfSVJRczsKKwlzcGluX3VubG9ja19pcnEgKCZscC0+aHdfbG9jayk7CisKKwlscC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKworCS8qIENoZWNrIGZvciBmcmVlIHJlc291cmNlczogc3RvcCBUeCBxdWV1ZSBpZiB0aGVyZSBhcmUgbm9uZSAqLworCWlmIChpbmIgKEVXUkszX0ZNUUMpID09IDApCisJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlFTkFCTEVfSVJRczsKKwlzcGluX3VubG9ja19pcnEgKCZscC0+aHdfbG9jayk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgICAqKiBUaGUgRVdSSzMgaW50ZXJydXB0IGhhbmRsZXIuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBld3JrM19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBld3JrM19wcml2YXRlICpscDsKKwl1X2xvbmcgaW9iYXNlOworCXVfY2hhciBpY3IsIGNyLCBjc3I7CisKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisJaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKwkvKiBnZXQgdGhlIGludGVycnVwdCBpbmZvcm1hdGlvbiAqLworCWNzciA9IGluYihFV1JLM19DU1IpOworCisJLyoKKwkgKiogTWFzayB0aGUgRVdSSzMgYm9hcmQgaW50ZXJydXB0cyBhbmQgdHVybiBvbiB0aGUgTEVECisJICovCisJc3Bpbl9sb2NrKCZscC0+aHdfbG9jayk7CisJRElTQUJMRV9JUlFzOworCisJY3IgPSBpbmIoRVdSSzNfQ1IpOworCWNyIHw9IGxwLT5sZWRfbWFzazsKKwlvdXRiKGNyLCBFV1JLM19DUik7CisKKwlpZiAoY3NyICYgQ1NSX1JORSkJLyogUnggaW50ZXJydXB0IChwYWNrZXRbc10gYXJyaXZlZCkgKi8KKwkJZXdyazNfcngoZGV2KTsKKworCWlmIChjc3IgJiBDU1JfVE5FKQkvKiBUeCBpbnRlcnJ1cHQgKHBhY2tldCBzZW50KSAqLworCQlld3JrM190eChkZXYpOworCisJLyoKKwkgKiogTm93IGRlYWwgd2l0aCB0aGUgVFgvUlggZGlzYWJsZSBmbGFncy4gVGhlc2UgYXJlIHNldCB3aGVuIHRoZXJlCisJICoqIGFyZSBubyBtb3JlIHJlc291cmNlcy4gSWYgcmVzb3VyY2VzIGZyZWUgdXAgdGhlbiBlbmFibGUgdGhlc2UKKwkgKiogaW50ZXJydXB0cywgb3RoZXJ3aXNlIG1hc2sgdGhlbSAtIGZhaWx1cmUgdG8gZG8gdGhpcyB3aWxsIHJlc3VsdAorCSAqKiBpbiB0aGUgc3lzdGVtIGhhbmdpbmcgaW4gYW4gaW50ZXJydXB0IGxvb3AuCisJICovCisJaWYgKGluYihFV1JLM19GTVFDKSkgewkvKiBhbnkgcmVzb3VyY2VzIGF2YWlsYWJsZT8gKi8KKwkJbHAtPmlycV9tYXNrIHw9IElDUl9UWERNIHwgSUNSX1JYRE07CS8qIGVuYWJsZSB0aGUgaW50ZXJydXB0IHNvdXJjZSAqLworCQljc3IgJj0gfihDU1JfVFhEIHwgQ1NSX1JYRCk7CS8qIGVuc3VyZSByZXN0YXJ0IG9mIGEgc3RhbGxlZCBUWCBvciBSWCAqLworCQlvdXRiKGNzciwgRVdSSzNfQ1NSKTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0gZWxzZSB7CisJCWxwLT5pcnFfbWFzayAmPSB+KElDUl9UWERNIHwgSUNSX1JYRE0pOwkJLyogZGlzYWJsZSB0aGUgaW50ZXJydXB0IHNvdXJjZSAqLworCX0KKworCS8qIFVubWFzayB0aGUgRVdSSzMgYm9hcmQgaW50ZXJydXB0cyBhbmQgdHVybiBvZmYgdGhlIExFRCAqLworCWNyICY9IH4obHAtPmxlZF9tYXNrKTsKKwlvdXRiKGNyLCBFV1JLM19DUik7CisJRU5BQkxFX0lSUXM7CisJc3Bpbl91bmxvY2soJmxwLT5od19sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIENhbGxlZCB3aXRoIGxwLT5od19sb2NrIGhlbGQgKi8KK3N0YXRpYyBpbnQgZXdyazNfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXdyazNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaSwgc3RhdHVzID0gMDsKKwl1X2NoYXIgcGFnZTsKKwl2b2lkIF9faW9tZW0gKmJ1ZiA9IE5VTEw7CisKKwl3aGlsZSAoaW5iKEVXUkszX1JRQykgJiYgIXN0YXR1cykgewkvKiBXaGlsc3QgdGhlcmUncyBpbmNvbWluZyBkYXRhICovCisJCWlmICgocGFnZSA9IGluYihFV1JLM19SUSkpIDwgbHAtPm1QYWdlKSB7CS8qIEdldCBuZXh0IGVudHJ5J3MgYnVmZmVyIHBhZ2UgKi8KKwkJCS8qCisJCQkgICAqKiBTZXQgdXAgc2hhcmVkIG1lbW9yeSB3aW5kb3cgYW5kIHBvaW50ZXIgaW50byB0aGUgd2luZG93CisJCQkgKi8KKwkJCWlmIChscC0+c2htZW1fbGVuZ3RoID09IElPX09OTFkpIHsKKwkJCQlvdXRiKHBhZ2UsIEVXUkszX0lPUFIpOworCQkJfSBlbHNlIGlmIChscC0+c2htZW1fbGVuZ3RoID09IFNITUVNXzJLKSB7CisJCQkJYnVmID0gbHAtPnNobWVtOworCQkJCW91dGIocGFnZSwgRVdSSzNfTVBSKTsKKwkJCX0gZWxzZSBpZiAobHAtPnNobWVtX2xlbmd0aCA9PSBTSE1FTV8zMkspIHsKKwkJCQlidWYgPSAoKChzaG9ydCkgcGFnZSA8PCAxMSkgJiAweDc4MDApICsgbHAtPnNobWVtOworCQkJCW91dGIoKHBhZ2UgPj4gNCksIEVXUkszX01QUik7CisJCQl9IGVsc2UgaWYgKGxwLT5zaG1lbV9sZW5ndGggPT0gU0hNRU1fNjRLKSB7CisJCQkJYnVmID0gKCgoc2hvcnQpIHBhZ2UgPDwgMTEpICYgMHhmODAwKSArIGxwLT5zaG1lbTsKKwkJCQlvdXRiKChwYWdlID4+IDUpLCBFV1JLM19NUFIpOworCQkJfSBlbHNlIHsKKwkJCQlzdGF0dXMgPSAtMTsKKwkJCQlwcmludGsoIiVzOiBPb3BzIC0geW91ciBwcml2YXRlIGRhdGEgYXJlYSBpcyBob3NlZCFcbiIsIGRldi0+bmFtZSk7CisJCQl9CisKKwkJCWlmICghc3RhdHVzKSB7CisJCQkJY2hhciByeF9zdGF0dXM7CisJCQkJaW50IHBrdF9sZW47CisKKwkJCQlpZiAobHAtPnNobWVtX2xlbmd0aCA9PSBJT19PTkxZKSB7CisJCQkJCXJ4X3N0YXR1cyA9IGluYihFV1JLM19EQVRBKTsKKwkJCQkJcGt0X2xlbiA9IGluYihFV1JLM19EQVRBKTsKKwkJCQkJcGt0X2xlbiB8PSAoKHVfc2hvcnQpIGluYihFV1JLM19EQVRBKSA8PCA4KTsKKwkJCQl9IGVsc2UgeworCQkJCQlyeF9zdGF0dXMgPSByZWFkYihidWYpOworCQkJCQlidWYgKz0gMTsKKwkJCQkJcGt0X2xlbiA9IHJlYWR3KGJ1Zik7CisJCQkJCWJ1ZiArPSAzOworCQkJCX0KKworCQkJCWlmICghKHJ4X3N0YXR1cyAmIFJfUk9LKSkgewkvKiBUaGVyZSB3YXMgYW4gZXJyb3IuICovCisJCQkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsJLyogVXBkYXRlIHRoZSBlcnJvciBzdGF0cy4gKi8KKwkJCQkJaWYgKHJ4X3N0YXR1cyAmIFJfREJFKQorCQkJCQkJbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCQlpZiAocnhfc3RhdHVzICYgUl9DUkMpCisJCQkJCQlscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCQlpZiAocnhfc3RhdHVzICYgUl9QTEwpCisJCQkJCQlscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCQl9IGVsc2UgeworCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQkJCWlmICgoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMikpICE9IE5VTEwpIHsKKwkJCQkJCXVuc2lnbmVkIGNoYXIgKnA7CisJCQkJCQlza2ItPmRldiA9IGRldjsKKwkJCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIHRvIDE2IGJ5dGVzICovCisJCQkJCQlwID0gc2tiX3B1dChza2IsIHBrdF9sZW4pOworCisJCQkJCQlpZiAobHAtPnNobWVtX2xlbmd0aCA9PSBJT19PTkxZKSB7CisJCQkJCQkJKnAgPSBpbmIoRVdSSzNfREFUQSk7CS8qIGR1bW15IHJlYWQgKi8KKwkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgcGt0X2xlbjsgaSsrKSB7CisJCQkJCQkJCSpwKysgPSBpbmIoRVdSSzNfREFUQSk7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQltZW1jcHlfZnJvbWlvKHAsIGJ1ZiwgcGt0X2xlbik7CisJCQkJCQl9CisKKwkJCQkJCWZvciAoaSA9IDE7IGkgPCBFV1JLM19QS1RfU1RBVF9TWiAtIDE7IGkrKykgeworCQkJCQkJCWlmIChwa3RfbGVuIDwgaSAqIEVXUkszX1BLVF9CSU5fU1opIHsKKwkJCQkJCQkJbHAtPnBrdFN0YXRzLmJpbnNbaV0rKzsKKwkJCQkJCQkJaSA9IEVXUkszX1BLVF9TVEFUX1NaOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCXAgPSBza2ItPmRhdGE7CS8qIExvb2sgYXQgdGhlIGRlc3QgYWRkciAqLworCQkJCQkJaWYgKHBbMF0gJiAweDAxKSB7CS8qIE11bHRpY2FzdC9Ccm9hZGNhc3QgKi8KKwkJCQkJCQlpZiAoKCooczE2ICopICYgcFswXSA9PSAtMSkgJiYgKCooczE2ICopICYgcFsyXSA9PSAtMSkgJiYgKCooczE2ICopICYgcFs0XSA9PSAtMSkpIHsKKwkJCQkJCQkJbHAtPnBrdFN0YXRzLmJyb2FkY2FzdCsrOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWxwLT5wa3RTdGF0cy5tdWx0aWNhc3QrKzsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgaWYgKCgqKHMxNiAqKSAmIHBbMF0gPT0gKihzMTYgKikgJiBkZXYtPmRldl9hZGRyWzBdKSAmJgorCQkJCQkJCSAgICgqKHMxNiAqKSAmIHBbMl0gPT0gKihzMTYgKikgJiBkZXYtPmRldl9hZGRyWzJdKSAmJgorCQkJCQkJCSAgICgqKHMxNiAqKSAmIHBbNF0gPT0gKihzMTYgKikgJiBkZXYtPmRldl9hZGRyWzRdKSkgeworCQkJCQkJCWxwLT5wa3RTdGF0cy51bmljYXN0Kys7CisJCQkJCQl9CisJCQkJCQlscC0+cGt0U3RhdHMuYmluc1swXSsrOwkJLyogRHVwbGljYXRlcyBzdGF0cy5yeF9wYWNrZXRzICovCisJCQkJCQlpZiAobHAtPnBrdFN0YXRzLmJpbnNbMF0gPT0gMCkgewkvKiBSZXNldCBjb3VudGVycyAqLworCQkJCQkJCW1lbXNldCgmbHAtPnBrdFN0YXRzLCAwLCBzaXplb2YobHAtPnBrdFN0YXRzKSk7CisJCQkJCQl9CisJCQkJCQkvKgorCQkJCQkJICAgKiogTm90aWZ5IHRoZSB1cHBlciBwcm90b2NvbCBsYXllcnMgdGhhdCB0aGVyZSBpcyBhbm90aGVyCisJCQkJCQkgICAqKiBwYWNrZXQgdG8gaGFuZGxlCisJCQkJCQkgKi8KKwkJCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQkJCQluZXRpZl9yeChza2IpOworCisJCQkJCQkvKgorCQkJCQkJICAgKiogVXBkYXRlIHN0YXRzCisJCQkJCQkgKi8KKwkJCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmludGsoIiVzOiBJbnN1ZmZpY2llbnQgbWVtb3J5OyBudWtpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CQkvKiBSZWFsbHksIGRlZmVycmVkLiAqLworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkvKgorCQkJICAgKiogUmV0dXJuIHRoZSByZWNlaXZlZCBidWZmZXIgdG8gdGhlIGZyZWUgbWVtb3J5IHF1ZXVlCisJCQkgKi8KKwkJCW91dGIocGFnZSwgRVdSSzNfRk1RKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50aygiZXdyazNfcngoKTogSWxsZWdhbCBwYWdlIG51bWJlciwgcGFnZSAlZFxuIiwgcGFnZSk7CisJCQlwcmludGsoImV3cmszX3J4KCk6IENTUjogJTAyeCBJQ1I6ICUwMnggRk1RQzogJTAyeFxuIiwgaW5iKEVXUkszX0NTUiksIGluYihFV1JLM19JQ1IpLCBpbmIoRVdSSzNfRk1RQykpOworCQl9CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisqKiBCdWZmZXIgc2VudCAtIGNoZWNrIGZvciBUWCBidWZmZXIgZXJyb3JzLgorKiogQ2FsbGVkIHdpdGggbHAtPmh3X2xvY2sgaGVsZAorKi8KK3N0YXRpYyBpbnQgZXdyazNfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXdyazNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwl1X2NoYXIgdHhfc3RhdHVzOworCisJd2hpbGUgKCh0eF9zdGF0dXMgPSBpbmIoRVdSSzNfVERRKSkgPiAwKSB7CS8qIFdoaWxzdCB0aGVyZSdzIG9sZCBidWZmZXJzICovCisJCWlmICh0eF9zdGF0dXMgJiBUX1ZTVFMpIHsJLyogVGhlIHN0YXR1cyBpcyB2YWxpZCAqLworCQkJaWYgKHR4X3N0YXR1cyAmIFRfVFhFKSB7CisJCQkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJCWlmICh0eF9zdGF0dXMgJiBUX05DTCkKKwkJCQkJbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJaWYgKHR4X3N0YXR1cyAmIFRfTENMKQorCQkJCQlscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQkJCWlmICh0eF9zdGF0dXMgJiBUX0NUVSkgeworCQkJCQlpZiAoKHR4X3N0YXR1cyAmIFRfQ09MTCkgXiBUX1hVUikgeworCQkJCQkJbHAtPnBrdFN0YXRzLnR4X3VuZGVycnVucysrOworCQkJCQl9IGVsc2UgeworCQkJCQkJbHAtPnBrdFN0YXRzLmV4Y2Vzc2l2ZV91bmRlcnJ1bnMrKzsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAodHhfc3RhdHVzICYgVF9DT0xMKSB7CisJCQkJCWlmICgodHhfc3RhdHVzICYgVF9DT0xMKSBeIFRfWENPTEwpIHsKKwkJCQkJCWxwLT5zdGF0cy5jb2xsaXNpb25zKys7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlscC0+cGt0U3RhdHMuZXhjZXNzaXZlX2NvbGxpc2lvbnMrKzsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV3cmszX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV3cmszX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJdV9jaGFyIGljciwgY3NyOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCWlmIChld3JrM19kZWJ1ZyA+IDEpIHsKKwkJcHJpbnRrKCIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQsIHN0YXR1cyB3YXMgJTIuMnguXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBpbmIoRVdSSzNfQ1NSKSk7CisJfQorCS8qCisJICAgKiogV2Ugc3RvcCB0aGUgRVdSSzMgaGVyZS4uLiBtYXNrIGludGVycnVwdHMgYW5kIHN0b3AgVFggJiBSWAorCSAqLworCURJU0FCTEVfSVJRczsKKworCVNUT1BfRVdSSzM7CisKKwkvKgorCSAgICoqIENsZWFuIG91dCB0aGUgVFggYW5kIFJYIHF1ZXVlcyBoZXJlIChub3RlIHRoYXQgb25lIGVudHJ5CisJICAgKiogbWF5IGdldCBhZGRlZCB0byBlaXRoZXIgdGhlIFRYRCBvciBSWCBxdWV1ZXMgaWYgdGhlIFRYIG9yIFJYCisJICAgKioganVzdCBzdGFydHMgcHJvY2Vzc2luZyBhIHBhY2tldCBiZWZvcmUgdGhlIFNUT1BfRVdSSzMgY29tbWFuZAorCSAgICoqIGlzIHJlY2VpdmVkLiBUaGlzIHdpbGwgYmUgZmx1c2hlZCBpbiB0aGUgZXdyazNfb3BlbigpIGNhbGwpLgorCSAqLworCXdoaWxlIChpbmIoRVdSSzNfVFEpKTsKKwl3aGlsZSAoaW5iKEVXUkszX1REUSkpOworCXdoaWxlIChpbmIoRVdSSzNfUlEpKTsKKworCWlmICghbHAtPmhhcmRfc3RyYXBwZWQpIHsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmV3cmszX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBld3JrM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBOdWxsIGJvZHkgc2luY2UgdGhlcmUgaXMgbm8gZnJhbWluZyBlcnJvciBjb3VudGVyICovCisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qCisgICAqKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRlci4KKyAqLworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV3cmszX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJdV9jaGFyIGNzcjsKKworCWNzciA9IGluYihFV1JLM19DU1IpOworCisJaWYgKGxwLT5zaG1lbV9sZW5ndGggPT0gSU9fT05MWSkgeworCQlscC0+bWN0YmwgPSBOVUxMOworCX0gZWxzZSB7CisJCWxwLT5tY3RibCA9IGxwLT5zaG1lbSArIFBBR0UwX0hURTsKKwl9CisKKwljc3IgJj0gfihDU1JfUE1FIHwgQ1NSX01DRSk7CisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewkJLyogc2V0IHByb21pc2N1b3VzIG1vZGUgKi8KKwkJY3NyIHw9IENTUl9QTUU7CisJCW91dGIoY3NyLCBFV1JLM19DU1IpOworCX0gZWxzZSB7CisJCVNldE11bHRpY2FzdEZpbHRlcihkZXYpOworCQljc3IgfD0gQ1NSX01DRTsKKwkJb3V0Yihjc3IsIEVXUkszX0NTUik7CisJfQorfQorCisvKgorICAgKiogQ2FsY3VsYXRlIHRoZSBoYXNoIGNvZGUgYW5kIHVwZGF0ZSB0aGUgbG9naWNhbCBhZGRyZXNzIGZpbHRlcgorICAgKiogZnJvbSBhIGxpc3Qgb2YgZXRoZXJuZXQgbXVsdGljYXN0IGFkZHJlc3Nlcy4KKyAgICoqIExpdHRsZSBlbmRpYW4gY3JjIG9uZSBsaW5lciBmcm9tIE1hdHQgVGhvbWFzLCBERUMuCisgICAqKgorICAgKiogTm90ZSB0aGF0IHdoZW4gY2xlYXJpbmcgdGhlIHRhYmxlLCB0aGUgYnJvYWRjYXN0IGJpdCBtdXN0IHJlbWFpbiBhc3NlcnRlZAorICAgKiogdG8gcmVjZWl2ZSBicm9hZGNhc3QgbWVzc2FnZXMuCisgKi8KK3N0YXRpYyB2b2lkIFNldE11bHRpY2FzdEZpbHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBld3JrM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGRldl9tY19saXN0ICpkbWkgPSBkZXYtPm1jX2xpc3Q7CisJdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCWludCBpOworCWNoYXIgKmFkZHJzLCBiaXQsIGJ5dGU7CisJc2hvcnQgX19pb21lbSAqcCA9IGxwLT5tY3RibDsKKwl1MTYgaGFzaGNvZGU7CisJdTMyIGNyYzsKKworCXNwaW5fbG9ja19pcnEoJmxwLT5od19sb2NrKTsKKworCWlmIChscC0+c2htZW1fbGVuZ3RoID09IElPX09OTFkpIHsKKwkJb3V0YigwLCBFV1JLM19JT1BSKTsKKwkJb3V0dyhQQUdFMF9IVEUsIEVXUkszX1BJUjEpOworCX0gZWxzZSB7CisJCW91dGIoMCwgRVdSSzNfTVBSKTsKKwl9CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQlmb3IgKGkgPSAwOyBpIDwgKEhBU0hfVEFCTEVfTEVOID4+IDMpOyBpKyspIHsKKwkJCWlmIChscC0+c2htZW1fbGVuZ3RoID09IElPX09OTFkpIHsKKwkJCQlvdXRiKDB4ZmYsIEVXUkszX0RBVEEpOworCQkJfSBlbHNlIHsJLyogbWVtc2V0IGRpZG4ndCB3b3JrIGhlcmUgKi8KKwkJCQl3cml0ZXcoMHhmZmZmLCBwKTsKKwkJCQlwKys7CisJCQkJaSsrOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogQ2xlYXIgdGFibGUgZXhjZXB0IGZvciBicm9hZGNhc3QgYml0ICovCisJCWlmIChscC0+c2htZW1fbGVuZ3RoID09IElPX09OTFkpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCAoSEFTSF9UQUJMRV9MRU4gPj4gNCkgLSAxOyBpKyspIHsKKwkJCQlvdXRiKDB4MDAsIEVXUkszX0RBVEEpOworCQkJfQorCQkJb3V0YigweDgwLCBFV1JLM19EQVRBKTsKKwkJCWkrKzsJLyogaW5zZXJ0IHRoZSBicm9hZGNhc3QgYml0ICovCisJCQlmb3IgKDsgaSA8IChIQVNIX1RBQkxFX0xFTiA+PiAzKTsgaSsrKSB7CisJCQkJb3V0YigweDAwLCBFV1JLM19EQVRBKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW1lbXNldF9pbyhscC0+bWN0YmwsIDAsIEhBU0hfVEFCTEVfTEVOID4+IDMpOworCQkJd3JpdGViKDB4ODAsIGxwLT5tY3RibCArIChIQVNIX1RBQkxFX0xFTiA+PiA0KSAtIDEpOworCQl9CisKKwkJLyogVXBkYXRlIHRhYmxlICovCisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyspIHsJLyogZm9yIGVhY2ggYWRkcmVzcyBpbiB0aGUgbGlzdCAqLworCQkJYWRkcnMgPSBkbWktPmRtaV9hZGRyOworCQkJZG1pID0gZG1pLT5uZXh0OworCQkJaWYgKCgqYWRkcnMgJiAweDAxKSA9PSAxKSB7CS8qIG11bHRpY2FzdCBhZGRyZXNzPyAqLworCQkJCWNyYyA9IGV0aGVyX2NyY19sZShFVEhfQUxFTiwgYWRkcnMpOworCQkJCWhhc2hjb2RlID0gY3JjICYgKCgxIDw8IDkpIC0gMSk7CS8qIGhhc2hjb2RlIGlzIDkgTFNiIG9mIENSQyAqLworCisJCQkJYnl0ZSA9IGhhc2hjb2RlID4+IDM7CS8qIGJpdFszLThdIC0+IGJ5dGUgaW4gZmlsdGVyICovCisJCQkJYml0ID0gMSA8PCAoaGFzaGNvZGUgJiAweDA3KTsJLyogYml0WzAtMl0gLT4gYml0IGluIGJ5dGUgKi8KKworCQkJCWlmIChscC0+c2htZW1fbGVuZ3RoID09IElPX09OTFkpIHsKKwkJCQkJdV9jaGFyIHRtcDsKKworCQkJCQlvdXR3KFBBR0UwX0hURSArIGJ5dGUsIEVXUkszX1BJUjEpOworCQkJCQl0bXAgPSBpbmIoRVdSSzNfREFUQSk7CisJCQkJCXRtcCB8PSBiaXQ7CisJCQkJCW91dHcoUEFHRTBfSFRFICsgYnl0ZSwgRVdSSzNfUElSMSk7CisJCQkJCW91dGIodG1wLCBFV1JLM19EQVRBKTsKKwkJCQl9IGVsc2UgeworCQkJCQl3cml0ZWIocmVhZGIobHAtPm1jdGJsICsgYnl0ZSkgfCBiaXQsIGxwLT5tY3RibCArIGJ5dGUpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycSgmbHAtPmh3X2xvY2spOworfQorCisvKgorICAgKiogSVNBIGJ1cyBJL08gZGV2aWNlIHByb2JlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGlzYV9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2xvbmcgaW9hZGRyKQoreworCWludCBpID0gbnVtX2V3cmtzM3MsIG1heFNsb3RzOworCWludCByZXQgPSAtRU5PREVWOworCisJdV9sb25nIGlvYmFzZTsKKworCWlmIChpb2FkZHIgPj0gMHg0MDApCisJCWdvdG8gb3V0OworCisJaWYgKGlvYWRkciA9PSAwKSB7CS8qIEF1dG9wcm9iaW5nICovCisJCWlvYmFzZSA9IEVXUkszX0lPX0JBU0U7CQkvKiBHZXQgdGhlIGZpcnN0IHNsb3QgYWRkcmVzcyAqLworCQltYXhTbG90cyA9IDI0OworCX0gZWxzZSB7CQkvKiBQcm9iZSBhIHNwZWNpZmljIGxvY2F0aW9uICovCisJCWlvYmFzZSA9IGlvYWRkcjsKKwkJbWF4U2xvdHMgPSBpICsgMTsKKwl9CisKKwlmb3IgKDsgKGkgPCBtYXhTbG90cykgJiYgKGRldiAhPSBOVUxMKTsKKwkgICAgIGlvYmFzZSArPSBFV1JLM19JT1BfSU5DLCBpKyspCisJeworCQlpZiAocmVxdWVzdF9yZWdpb24oaW9iYXNlLCBFV1JLM19UT1RBTF9TSVpFLCBEUlZfTkFNRSkpIHsKKwkJCWlmIChEZXZpY2VQcmVzZW50KGlvYmFzZSkgPT0gMCkgeworCQkJCWludCBpcnEgPSBkZXYtPmlycTsKKwkJCQlyZXQgPSBld3JrM19od19pbml0KGRldiwgaW9iYXNlKTsKKwkJCQlpZiAoIXJldCkKKwkJCQkJYnJlYWs7CisJCQkJZGV2LT5pcnEgPSBpcnE7CisJCQl9CisJCQlyZWxlYXNlX3JlZ2lvbihpb2Jhc2UsIEVXUkszX1RPVEFMX1NJWkUpOworCQl9CisJfQorIG91dDoKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgICAqKiBFSVNBIGJ1cyBJL08gZGV2aWNlIHByb2JlLiBQcm9iZSBmcm9tIHNsb3QgMSBzaW5jZSBzbG90IDAgaXMgdXN1YWxseQorICAgKiogdGhlIG1vdGhlcmJvYXJkLgorICovCitzdGF0aWMgaW50IF9faW5pdCBlaXNhX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfbG9uZyBpb2FkZHIpCit7CisJaW50IGksIG1heFNsb3RzOworCXVfbG9uZyBpb2Jhc2U7CisJaW50IHJldCA9IC1FTk9ERVY7CisKKwlpZiAoaW9hZGRyIDwgMHgxMDAwKQorCQlnb3RvIG91dDsKKworCWlmIChpb2FkZHIgPT0gMCkgewkvKiBBdXRvcHJvYmluZyAqLworCQlpb2Jhc2UgPSBFSVNBX1NMT1RfSU5DOwkJLyogR2V0IHRoZSBmaXJzdCBzbG90IGFkZHJlc3MgKi8KKwkJaSA9IDE7CisJCW1heFNsb3RzID0gTUFYX0VJU0FfU0xPVFM7CisJfSBlbHNlIHsJCS8qIFByb2JlIGEgc3BlY2lmaWMgbG9jYXRpb24gKi8KKwkJaW9iYXNlID0gaW9hZGRyOworCQlpID0gKGlvYWRkciA+PiAxMik7CisJCW1heFNsb3RzID0gaSArIDE7CisJfQorCisJZm9yIChpID0gMTsgKGkgPCBtYXhTbG90cykgJiYgKGRldiAhPSBOVUxMKTsgaSsrLCBpb2Jhc2UgKz0gRUlTQV9TTE9UX0lOQykgeworCQlpZiAoRUlTQV9zaWduYXR1cmUobmFtZSwgRUlTQV9JRCkgPT0gMCkgeworCQkJaWYgKHJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgRVdSSzNfVE9UQUxfU0laRSwgRFJWX05BTUUpICYmCisJCQkgICAgRGV2aWNlUHJlc2VudChpb2Jhc2UpID09IDApIHsKKwkJCQlpbnQgaXJxID0gZGV2LT5pcnE7CisJCQkJcmV0ID0gZXdyazNfaHdfaW5pdChkZXYsIGlvYmFzZSk7CisJCQkJaWYgKCFyZXQpCisJCQkJCWJyZWFrOworCQkJCWRldi0+aXJxID0gaXJxOworCQkJfQorCQkJcmVsZWFzZV9yZWdpb24oaW9iYXNlLCBFV1JLM19UT1RBTF9TSVpFKTsKKwkJfQorCX0KKworIG91dDoKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgICAqKiBSZWFkIHRoZSBFV1JLMyBFRVBST00gdXNpbmcgdGhpcyByb3V0aW5lCisgKi8KK3N0YXRpYyBpbnQgUmVhZF9FRVBST00odV9sb25nIGlvYmFzZSwgdV9jaGFyIGVhZGRyKQoreworCWludCBpOworCisJb3V0YigoZWFkZHIgJiAweDNmKSwgRVdSSzNfUElSMSk7CS8qIHNldCB1cCA2IGJpdHMgb2YgYWRkcmVzcyBpbmZvICovCisJb3V0YihFRVBST01fUkQsIEVXUkszX0lPUFIpOwkvKiBpc3N1ZSByZWFkIGNvbW1hbmQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNTAwMDsgaSsrKQorCQlpbmIoRVdSSzNfQ1NSKTsJLyogd2FpdCAxbXNlYyAqLworCisJcmV0dXJuIGludyhFV1JLM19FUFJPTTEpOwkvKiAxNiBiaXRzIGRhdGEgcmV0dXJuICovCit9CisKKy8qCisgICAqKiBXcml0ZSB0aGUgRVdSSzMgRUVQUk9NIHVzaW5nIHRoaXMgcm91dGluZQorICovCitzdGF0aWMgaW50IFdyaXRlX0VFUFJPTShzaG9ydCBkYXRhLCB1X2xvbmcgaW9iYXNlLCB1X2NoYXIgZWFkZHIpCit7CisJaW50IGk7CisKKwlvdXRiKEVFUFJPTV9XUl9FTiwgRVdSSzNfSU9QUik7CQkvKiBpc3N1ZSB3cml0ZSBlbmFibGUgY29tbWFuZCAqLworCWZvciAoaSA9IDA7IGkgPCA1MDAwOyBpKyspCisJCWluYihFV1JLM19DU1IpOwkvKiB3YWl0IDFtc2VjICovCisJb3V0dyhkYXRhLCBFV1JLM19FUFJPTTEpOwkvKiB3cml0ZSBkYXRhIHRvIHJlZ2lzdGVyICovCisJb3V0YigoZWFkZHIgJiAweDNmKSwgRVdSSzNfUElSMSk7CS8qIHNldCB1cCA2IGJpdHMgb2YgYWRkcmVzcyBpbmZvICovCisJb3V0YihFRVBST01fV1IsIEVXUkszX0lPUFIpOwkvKiBpc3N1ZSB3cml0ZSBjb21tYW5kICovCisJZm9yIChpID0gMDsgaSA8IDc1MDAwOyBpKyspCisJCWluYihFV1JLM19DU1IpOwkvKiB3YWl0IDE1bXNlYyAqLworCW91dGIoRUVQUk9NX1dSX0RJUywgRVdSSzNfSU9QUik7CS8qIGlzc3VlIHdyaXRlIGRpc2FibGUgY29tbWFuZCAqLworCWZvciAoaSA9IDA7IGkgPCA1MDAwOyBpKyspCisJCWluYihFV1JLM19DU1IpOwkvKiB3YWl0IDFtc2VjICovCisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAgICoqIExvb2sgZm9yIGEgcGFydGljdWxhciBib2FyZCBuYW1lIGluIHRoZSBvbi1ib2FyZCBFRVBST00uCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBFdGh3cmtTaWduYXR1cmUoY2hhciAqbmFtZSwgY2hhciAqZWVwcm9tX2ltYWdlKQoreworCWludCBpOworCWNoYXIgKnNpZ25hdHVyZXNbXSA9IEVXUkszX1NJR05BVFVSRTsKKworCWZvciAoaT0wOyAqc2lnbmF0dXJlc1tpXSAhPSAnXDAnOyBpKyspCisJCWlmKCAhc3RybmNtcChlZXByb21faW1hZ2UrRUVQUk9NX1BOQU1FNywgc2lnbmF0dXJlc1tpXSwgc3RybGVuKHNpZ25hdHVyZXNbaV0pKSApCisJCQlicmVhazsKKworCWlmICgqc2lnbmF0dXJlc1tpXSAhPSAnXDAnKSB7CisJCW1lbWNweShuYW1lLCBlZXByb21faW1hZ2UrRUVQUk9NX1BOQU1FNywgRVdSSzNfU1RSTEVOKTsKKwkJbmFtZVtFV1JLM19TVFJMRU5dID0gJ1wwJzsKKwl9IGVsc2UKKwkJbmFtZVswXSA9ICdcMCc7CisKKwlyZXR1cm47Cit9CisKKy8qCisgICAqKiBMb29rIGZvciBhIHNwZWNpYWwgc2VxdWVuY2UgaW4gdGhlIEV0aGVybmV0IHN0YXRpb24gYWRkcmVzcyBQUk9NIHRoYXQKKyAgICoqIGlzIGNvbW1vbiBhY3Jvc3MgYWxsIEVXUkszIHByb2R1Y3RzLgorICAgKioKKyAgICoqIFNlYXJjaCB0aGUgRXRoZXJuZXQgYWRkcmVzcyBST00gZm9yIHRoZSBzaWduYXR1cmUuIFNpbmNlIHRoZSBST00gYWRkcmVzcworICAgKiogY291bnRlciBjYW4gc3RhcnQgYXQgYW4gYXJiaXRyYXJ5IHBvaW50LCB0aGUgc2VhcmNoIG11c3QgaW5jbHVkZSB0aGUgZW50aXJlCisgICAqKiBwcm9iZSBzZXF1ZW5jZSBsZW5ndGggcGx1cyB0aGUgKGxlbmd0aF9vZl90aGVfc2lnbmF0dXJlIC0gMSkuCisgICAqKiBTdG9wIHRoZSBzZWFyY2ggSU1NRURJQVRFTFkgYWZ0ZXIgdGhlIHNpZ25hdHVyZSBpcyBmb3VuZCBzbyB0aGF0IHRoZQorICAgKiogUFJPTSBhZGRyZXNzIGNvdW50ZXIgaXMgY29ycmVjdGx5IHBvc2l0aW9uZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZQorICAgKiogZXRoZXJuZXQgYWRkcmVzcyBmb3IgbGF0ZXIgcmVhZCBvdXQuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgRGV2aWNlUHJlc2VudCh1X2xvbmcgaW9iYXNlKQoreworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXUzMiBhOworCQkJdTMyIGI7CisJCX0gbGxzaWc7CisJCWNoYXIgU2lnW3NpemVvZih1MzIpIDw8IDFdOworCX0KKwlkZXY7CisJc2hvcnQgc2lnTGVuZ3RoOworCWNoYXIgZGF0YTsKKwlpbnQgaSwgaiwgc3RhdHVzID0gMDsKKworCWRldi5sbHNpZy5hID0gRVRIX1BST01fU0lHOworCWRldi5sbHNpZy5iID0gRVRIX1BST01fU0lHOworCXNpZ0xlbmd0aCA9IHNpemVvZih1MzIpIDw8IDE7CisKKwlmb3IgKGkgPSAwLCBqID0gMDsgaiA8IHNpZ0xlbmd0aCAmJiBpIDwgUFJPQkVfTEVOR1RIICsgc2lnTGVuZ3RoIC0gMTsgaSsrKSB7CisJCWRhdGEgPSBpbmIoRVdSSzNfQVBST00pOworCQlpZiAoZGV2LlNpZ1tqXSA9PSBkYXRhKSB7CS8qIHRyYWNrIHNpZ25hdHVyZSAqLworCQkJaisrOworCQl9IGVsc2UgewkvKiBsb3N0IHNpZ25hdHVyZTsgYmVnaW4gc2VhcmNoIGFnYWluICovCisJCQlpZiAoZGF0YSA9PSBkZXYuU2lnWzBdKSB7CisJCQkJaiA9IDE7CisJCQl9IGVsc2UgeworCQkJCWogPSAwOworCQkJfQorCQl9CisJfQorCisJaWYgKGogIT0gc2lnTGVuZ3RoKSB7CisJCXN0YXR1cyA9IC1FTk9ERVY7CS8qIHNlYXJjaCBmYWlsZWQgKi8KKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHVfY2hhciBfX2luaXQgZ2V0X2h3X2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9jaGFyICogZWVwcm9tX2ltYWdlLCBjaGFyIGNoaXBUeXBlKQoreworCWludCBpLCBqLCBrOworCXVfc2hvcnQgY2hrc3VtOworCXVfY2hhciBjcmMsIGxmc3IsIHNkLCBzdGF0dXMgPSAwOworCXVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwl1MTYgdG1wOworCisJaWYgKGNoaXBUeXBlID09IExlTUFDMikgeworCQlmb3IgKGNyYyA9IDB4NmEsIGogPSAwOyBqIDwgRVRIX0FMRU47IGorKykgeworCQkJc2QgPSBkZXYtPmRldl9hZGRyW2pdID0gZWVwcm9tX2ltYWdlW0VFUFJPTV9QQUREUjAgKyBqXTsKKwkJCW91dGIoZGV2LT5kZXZfYWRkcltqXSwgRVdSSzNfUEFSMCArIGopOworCQkJZm9yIChrID0gMDsgayA8IDg7IGsrKywgc2QgPj49IDEpIHsKKwkJCQlsZnNyID0gKCgoKGNyYyAmIDB4MDIpID4+IDEpIF4gKGNyYyAmIDB4MDEpKSBeIChzZCAmIDB4MDEpKSA8PCA3OworCQkJCWNyYyA9IChjcmMgPj4gMSkgKyBsZnNyOworCQkJfQorCQl9CisJCWlmIChjcmMgIT0gZWVwcm9tX2ltYWdlW0VFUFJPTV9QQV9DUkNdKQorCQkJc3RhdHVzID0gLTE7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMCwgayA9IDA7IGkgPCBFVEhfQUxFTjspIHsKKwkJCWsgPDw9IDE7CisJCQlpZiAoayA+IDB4ZmZmZikKKwkJCQlrIC09IDB4ZmZmZjsKKworCQkJayArPSAodV9jaGFyKSAodG1wID0gaW5iKEVXUkszX0FQUk9NKSk7CisJCQlkZXYtPmRldl9hZGRyW2ldID0gKHVfY2hhcikgdG1wOworCQkJb3V0YihkZXYtPmRldl9hZGRyW2ldLCBFV1JLM19QQVIwICsgaSk7CisJCQlpKys7CisJCQlrICs9ICh1X3Nob3J0KSAoKHRtcCA9IGluYihFV1JLM19BUFJPTSkpIDw8IDgpOworCQkJZGV2LT5kZXZfYWRkcltpXSA9ICh1X2NoYXIpIHRtcDsKKwkJCW91dGIoZGV2LT5kZXZfYWRkcltpXSwgRVdSSzNfUEFSMCArIGkpOworCQkJaSsrOworCisJCQlpZiAoayA+IDB4ZmZmZikKKwkJCQlrIC09IDB4ZmZmZjsKKwkJfQorCQlpZiAoayA9PSAweGZmZmYpCisJCQlrID0gMDsKKwkJY2hrc3VtID0gaW5iKEVXUkszX0FQUk9NKTsKKwkJY2hrc3VtIHw9IChpbmIoRVdSSzNfQVBST00pIDw8IDgpOworCQlpZiAoayAhPSBjaGtzdW0pCisJCQlzdGF0dXMgPSAtMTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICAgKiogTG9vayBmb3IgYSBwYXJ0aWN1bGFyIGJvYXJkIG5hbWUgaW4gdGhlIEVJU0EgY29uZmlndXJhdGlvbiBzcGFjZQorICovCitzdGF0aWMgaW50IF9faW5pdCBFSVNBX3NpZ25hdHVyZShjaGFyICpuYW1lLCBzMzIgZWlzYV9pZCkKK3sKKwl1X2xvbmcgaTsKKwljaGFyICpzaWduYXR1cmVzW10gPSBFV1JLM19TSUdOQVRVUkU7CisJY2hhciBNYW5Db2RlW0VXUkszX1NUUkxFTl07CisJdW5pb24geworCQlzMzIgSUQ7CisJCWNoYXIgSWRbNF07CisJfSBFaXNhOworCWludCBzdGF0dXMgPSAwOworCisJKm5hbWUgPSAnXDAnOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJRWlzYS5JZFtpXSA9IGluYihlaXNhX2lkICsgaSk7CisJfQorCisJTWFuQ29kZVswXSA9ICgoKEVpc2EuSWRbMF0gPj4gMikgJiAweDFmKSArIDB4NDApOworCU1hbkNvZGVbMV0gPSAoKChFaXNhLklkWzFdICYgMHhlMCkgPj4gNSkgKyAoKEVpc2EuSWRbMF0gJiAweDAzKSA8PCAzKSArIDB4NDApOworCU1hbkNvZGVbMl0gPSAoKChFaXNhLklkWzJdID4+IDQpICYgMHgwZikgKyAweDMwKTsKKwlNYW5Db2RlWzNdID0gKChFaXNhLklkWzJdICYgMHgwZikgKyAweDMwKTsKKwlNYW5Db2RlWzRdID0gKCgoRWlzYS5JZFszXSA+PiA0KSAmIDB4MGYpICsgMHgzMCk7CisJTWFuQ29kZVs1XSA9ICdcMCc7CisKKwlmb3IgKGkgPSAwOyAoKnNpZ25hdHVyZXNbaV0gIT0gJ1wwJykgJiYgKCpuYW1lID09ICdcMCcpOyBpKyspIHsKKwkJaWYgKHN0cnN0cihNYW5Db2RlLCBzaWduYXR1cmVzW2ldKSAhPSBOVUxMKSB7CisJCQlzdHJjcHkobmFtZSwgTWFuQ29kZSk7CisJCQlzdGF0dXMgPSAxOworCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsJCS8qIHJldHVybiB0aGUgZGV2aWNlIG5hbWUgc3RyaW5nICovCit9CisKK3N0YXRpYyB2b2lkIGV3cmszX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJaW50IGZ3cmV2ID0gUmVhZF9FRVBST00oZGV2LT5iYXNlX2FkZHIsIEVFUFJPTV9SRVZMVkwpOworCisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3ByaW50ZihpbmZvLT5md192ZXJzaW9uLCAiJWQiLCBmd3Jldik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCAiTi9BIik7CisJaW5mby0+ZWVkdW1wX2xlbiA9IEVFUFJPTV9NQVg7Cit9CisKK3N0YXRpYyBpbnQgZXdyazNfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgZXdyazNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJdTggY3IgPSBpbmIoRVdSSzNfQ1IpOworCisJc3dpdGNoIChscC0+YWRhcHRlcl9uYW1lWzRdKSB7CisJY2FzZSAnMyc6IC8qIERFMjAzICovCisJCWVjbWQtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF9CTkM7CisJCWVjbWQtPnBvcnQgPSBQT1JUX0JOQzsKKwkJYnJlYWs7CisKKwljYXNlICc0JzogLyogREUyMDQgKi8KKwkJZWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEX1RQOworCQllY21kLT5wb3J0ID0gUE9SVF9UUDsKKwkJYnJlYWs7CisKKwljYXNlICc1JzogLyogREUyMDUgKi8KKwkJZWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEX1RQIHwgU1VQUE9SVEVEX0JOQyB8IFNVUFBPUlRFRF9BVUk7CisJCWVjbWQtPmF1dG9uZWcgPSAhKGNyICYgQ1JfQVBEKTsKKwkJLyoKKwkJKiogUG9ydCBpcyBvbmx5IHZhbGlkIGlmIGF1dG9uZWcgaXMgZGlzYWJsZWQKKwkJKiogYW5kIGV2ZW4gdGhlbiB3ZSBkb24ndCBrbm93IGlmIEFVSSBpcyBqdW1wZXJlZC4KKwkJKi8KKwkJaWYgKCFlY21kLT5hdXRvbmVnKQorCQkJZWNtZC0+cG9ydCA9IChjciAmIENSX1BTRUwpID8gUE9SVF9CTkMgOiBQT1JUX1RQOworCQlicmVhazsKKwl9CisKKwllY21kLT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEXzEwYmFzZVRfSGFsZjsKKwllY21kLT5zcGVlZCA9IFNQRUVEXzEwOworCWVjbWQtPmR1cGxleCA9IERVUExFWF9IQUxGOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV3cmszX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IGV3cmszX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggY3I7CisKKwkvKiBERTIwNSBpcyB0aGUgb25seSBjYXJkIHdpdGggYW55dGhpbmcgdG8gc2V0ICovCisJaWYgKGxwLT5hZGFwdGVyX25hbWVbNF0gIT0gJzUnKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkvKiBTYW5pdHktY2hlY2sgcGFyYW1ldGVycyAqLworCWlmIChlY21kLT5zcGVlZCAhPSBTUEVFRF8xMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGVjbWQtPnBvcnQgIT0gUE9SVF9UUCAmJiBlY21kLT5wb3J0ICE9IFBPUlRfQk5DKQorCQlyZXR1cm4gLUVJTlZBTDsgLyogQVVJIGlzIG5vdCBzb2Z0d2FyZS1zZWxlY3RhYmxlICovCisJaWYgKGVjbWQtPnRyYW5zY2VpdmVyICE9IFhDVlJfSU5URVJOQUwpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlY21kLT5kdXBsZXggIT0gRFVQTEVYX0hBTEYpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlY21kLT5waHlfYWRkcmVzcyAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+aHdfbG9jaywgZmxhZ3MpOworCWNyID0gaW5iKEVXUkszX0NSKTsKKworCS8qIElmIEF1dG9uZWcgaXMgc2V0LCBjaGFuZ2UgdG8gQXV0byBQb3J0IG1vZGUgKi8KKwkvKiBPdGhlcndpc2UsIGRpc2FibGUgQXV0byBQb3J0IGFuZCBzZXQgcG9ydCBleHBsaWNpdGx5ICovCisJaWYgKGVjbWQtPmF1dG9uZWcpIHsKKwkJY3IgJj0gfkNSX0FQRDsKKwl9IGVsc2UgeworCQljciB8PSBDUl9BUEQ7CisJCWlmIChlY21kLT5wb3J0ID09IFBPUlRfVFApCisJCQljciAmPSB+Q1JfUFNFTDsJCS8qIEZvcmNlIFRQICovCisJCWVsc2UKKwkJCWNyIHw9IENSX1BTRUw7CQkvKiBGb3JjZSBCTkMgKi8KKwl9CisKKwkvKiBDb21taXQgdGhlIGNoYW5nZXMgKi8KKwlvdXRiKGNyLCBFV1JLM19DUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmh3X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBld3JrM19nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJdTggY21yID0gaW5iKEVXUkszX0NNUik7CisJLyogREUyMDMgaGFzIEJOQyBvbmx5IGFuZCBsaW5rIHN0YXR1cyBkb2VzIG5vdCBhcHBseSAqLworCS8qIE9uIERFMjA0IHRoaXMgaXMgYWx3YXlzIHZhbGlkIHNpbmNlIFRQIGlzIHRoZSBvbmx5IHBvcnQuICovCisJLyogT24gREUyMDUgdGhpcyByZWZsZWN0cyBUUCBzdGF0dXMgZXZlbiBpZiBCTkMgb3IgQVVJIGlzIHNlbGVjdGVkLiAqLworCXJldHVybiAhKGNtciAmIENNUl9MSU5LKTsKK30KKworc3RhdGljIGludCBld3JrM19waHlzX2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQoreworCXN0cnVjdCBld3JrM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IGNyOworCWludCBjb3VudDsKKworCS8qIFRvZ2dsZSBMRUQgNHggcGVyIHNlY29uZCAqLworCWNvdW50ID0gZGF0YSA8PCAyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5od19sb2NrLCBmbGFncyk7CisKKwkvKiBCYWlsIGlmIGEgUEhZU19JRCBpcyBhbHJlYWR5IGluIHByb2dyZXNzICovCisJaWYgKGxwLT5sZWRfbWFzayA9PSAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5od19sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogUHJldmVudCBJU1IgZnJvbSB0d2lkZGxpbmcgdGhlIExFRCAqLworCWxwLT5sZWRfbWFzayA9IDA7CisKKwl3aGlsZSAoY291bnQtLSkgeworCQkvKiBUb2dnbGUgdGhlIExFRCAqLworCQljciA9IGluYihFV1JLM19DUik7CisJCW91dGIoY3IgXiBDUl9MRUQsIEVXUkszX0NSKTsKKworCQkvKiBXYWl0IGEgbGl0dGxlIHdoaWxlICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5od19sb2NrLCBmbGFncyk7CisJCW1zbGVlcCgyNTApOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmh3X2xvY2ssIGZsYWdzKTsKKworCQkvKiBFeGl0IGlmIHdlIGdvdCBhIHNpZ25hbCAqLworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwl9CisKKwlscC0+bGVkX21hc2sgPSBDUl9MRUQ7CisJY3IgPSBpbmIoRVdSSzNfQ1IpOworCW91dGIoY3IgJiB+Q1JfTEVELCBFV1JLM19DUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmh3X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgPyAtRVJFU1RBUlRTWVMgOiAwOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzXzIwMyA9IHsKKwkuZ2V0X2RydmluZm8gPSBld3JrM19nZXRfZHJ2aW5mbywKKwkuZ2V0X3NldHRpbmdzID0gZXdyazNfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgPSBld3JrM19zZXRfc2V0dGluZ3MsCisJLnBoeXNfaWQgPSBld3JrM19waHlzX2lkLAorfTsKKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8gPSBld3JrM19nZXRfZHJ2aW5mbywKKwkuZ2V0X3NldHRpbmdzID0gZXdyazNfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgPSBld3JrM19zZXRfc2V0dGluZ3MsCisJLmdldF9saW5rID0gZXdyazNfZ2V0X2xpbmssCisJLnBoeXNfaWQgPSBld3JrM19waHlzX2lkLAorfTsKKworLyoKKyAgICoqIFBlcmZvcm0gSU9DVEwgY2FsbCBmdW5jdGlvbnMgaGVyZS4gU29tZSBhcmUgcHJpdmlsZWdlZCBvcGVyYXRpb25zIGFuZCB0aGUKKyAgICoqIGVmZmVjdGl2ZSB1aWQgaXMgY2hlY2tlZCBpbiB0aG9zZSBjYXNlcy4KKyAqLworc3RhdGljIGludCBld3JrM19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBld3JrM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGV3cmszX2lvY3RsICppb2MgPSAoc3RydWN0IGV3cmszX2lvY3RsICopICZycS0+aWZyX2lmcnU7CisJdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCWludCBpLCBqLCBzdGF0dXMgPSAwOworCXVfY2hhciBjc3I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bmlvbiBld3JrM19hZGRyIHsKKwkJdV9jaGFyIGFkZHJbSEFTSF9UQUJMRV9MRU4gKiBFVEhfQUxFTl07CisJCXVfc2hvcnQgdmFsWyhIQVNIX1RBQkxFX0xFTiAqIEVUSF9BTEVOKSA+PiAxXTsKKwl9OworCQorCXVuaW9uIGV3cmszX2FkZHIgKnRtcDsKKworCS8qIEFsbCB3ZSBoYW5kbGUgYXJlIHByaXZhdGUgSU9DVExzICovCisJaWYgKGNtZCAhPSBFV1JLM0lPQ1RMKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwl0bXAgPSBrbWFsbG9jKHNpemVvZih1bmlvbiBld3JrM19hZGRyKSwgR0ZQX0tFUk5FTCk7CisJaWYodG1wPT1OVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN3aXRjaCAoaW9jLT5jbWQpIHsKKwljYXNlIEVXUkszX0dFVF9IV0FERFI6CS8qIEdldCB0aGUgaGFyZHdhcmUgYWRkcmVzcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykgeworCQkJdG1wLT5hZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKwkJfQorCQlpb2MtPmxlbiA9IEVUSF9BTEVOOworCQlpZiAoY29weV90b191c2VyKGlvYy0+ZGF0YSwgdG1wLT5hZGRyLCBpb2MtPmxlbikpCisJCQlzdGF0dXMgPSAtRUZBVUxUOworCQlicmVhazsKKwkJCisJY2FzZSBFV1JLM19TRVRfSFdBRERSOgkvKiBTZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3MgKi8KKwkJaWYgKGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+aHdfbG9jaywgZmxhZ3MpOworCQkJY3NyID0gaW5iKEVXUkszX0NTUik7CisJCQljc3IgfD0gKENTUl9UWEQgfCBDU1JfUlhEKTsKKwkJCW91dGIoY3NyLCBFV1JLM19DU1IpOwkvKiBEaXNhYmxlIHRoZSBUWCBhbmQgUlggKi8KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5od19sb2NrLCBmbGFncyk7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcih0bXAtPmFkZHIsIGlvYy0+ZGF0YSwgRVRIX0FMRU4pKSB7CisJCQkJc3RhdHVzID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+aHdfbG9jaywgZmxhZ3MpOworCQkJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKwkJCQlkZXYtPmRldl9hZGRyW2ldID0gdG1wLT5hZGRyW2ldOworCQkJCW91dGIodG1wLT5hZGRyW2ldLCBFV1JLM19QQVIwICsgaSk7CisJCQl9CisKKwkJCWNzciA9IGluYihFV1JLM19DU1IpOworCQkJY3NyICY9IH4oQ1NSX1RYRCB8IENTUl9SWEQpOwkvKiBFbmFibGUgdGhlIFRYIGFuZCBSWCAqLworCQkJb3V0Yihjc3IsIEVXUkszX0NTUik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+aHdfbG9jaywgZmxhZ3MpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVQRVJNOworCQl9CisKKwkJYnJlYWs7CisJY2FzZSBFV1JLM19TRVRfUFJPTToJLyogU2V0IFByb21pc2N1b3VzIE1vZGUgKi8KKwkJaWYgKGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+aHdfbG9jaywgZmxhZ3MpOworCQkJY3NyID0gaW5iKEVXUkszX0NTUik7CisJCQljc3IgfD0gQ1NSX1BNRTsKKwkJCWNzciAmPSB+Q1NSX01DRTsKKwkJCW91dGIoY3NyLCBFV1JLM19DU1IpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmh3X2xvY2ssIGZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IC1FUEVSTTsKKwkJfQorCisJCWJyZWFrOworCWNhc2UgRVdSSzNfQ0xSX1BST006CS8qIENsZWFyIFByb21pc2N1b3VzIE1vZGUgKi8KKwkJaWYgKGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+aHdfbG9jaywgZmxhZ3MpOworCQkJY3NyID0gaW5iKEVXUkszX0NTUik7CisJCQljc3IgJj0gfkNTUl9QTUU7CisJCQlvdXRiKGNzciwgRVdSSzNfQ1NSKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5od19sb2NrLCBmbGFncyk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCX0KKworCQlicmVhazsKKwljYXNlIEVXUkszX0dFVF9NQ0E6CS8qIEdldCB0aGUgbXVsdGljYXN0IGFkZHJlc3MgdGFibGUgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5od19sb2NrLCBmbGFncyk7CisJCWlmIChscC0+c2htZW1fbGVuZ3RoID09IElPX09OTFkpIHsKKwkJCW91dGIoMCwgRVdSSzNfSU9QUik7CisJCQlvdXR3KFBBR0UwX0hURSwgRVdSSzNfUElSMSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgKEhBU0hfVEFCTEVfTEVOID4+IDMpOyBpKyspIHsKKwkJCQl0bXAtPmFkZHJbaV0gPSBpbmIoRVdSSzNfREFUQSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlvdXRiKDAsIEVXUkszX01QUik7CisJCQltZW1jcHlfZnJvbWlvKHRtcC0+YWRkciwgbHAtPnNobWVtICsgUEFHRTBfSFRFLCAoSEFTSF9UQUJMRV9MRU4gPj4gMykpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5od19sb2NrLCBmbGFncyk7CisKKwkJaW9jLT5sZW4gPSAoSEFTSF9UQUJMRV9MRU4gPj4gMyk7CisJCWlmIChjb3B5X3RvX3VzZXIoaW9jLT5kYXRhLCB0bXAtPmFkZHIsIGlvYy0+bGVuKSkKKwkJCXN0YXR1cyA9IC1FRkFVTFQ7CisKKwkJYnJlYWs7CisJY2FzZSBFV1JLM19TRVRfTUNBOgkvKiBTZXQgYSBtdWx0aWNhc3QgYWRkcmVzcyAqLworCQlpZiAoY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJaWYgKGlvYy0+bGVuID4gMTAyNCkKKwkJCXsKKwkJCQlzdGF0dXMgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGNvcHlfZnJvbV91c2VyKHRtcC0+YWRkciwgaW9jLT5kYXRhLCBFVEhfQUxFTiAqIGlvYy0+bGVuKSkgeworCQkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IC1FUEVSTTsKKwkJfQorCisJCWJyZWFrOworCWNhc2UgRVdSSzNfQ0xSX01DQToJLyogQ2xlYXIgYWxsIG11bHRpY2FzdCBhZGRyZXNzZXMgKi8KKwkJaWYgKGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXNldF9tdWx0aWNhc3RfbGlzdChkZXYpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVQRVJNOworCQl9CisKKwkJYnJlYWs7CisJY2FzZSBFV1JLM19NQ0FfRU46CS8qIEVuYWJsZSBtdWx0aWNhc3QgYWRkcmVzc2luZyAqLworCQlpZiAoY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5od19sb2NrLCBmbGFncyk7CisJCQljc3IgPSBpbmIoRVdSSzNfQ1NSKTsKKwkJCWNzciB8PSBDU1JfTUNFOworCQkJY3NyICY9IH5DU1JfUE1FOworCQkJb3V0Yihjc3IsIEVXUkszX0NTUik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+aHdfbG9jaywgZmxhZ3MpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVQRVJNOworCQl9CisKKwkJYnJlYWs7CisJY2FzZSBFV1JLM19HRVRfU1RBVFM6IHsgLyogR2V0IHRoZSBkcml2ZXIgc3RhdGlzdGljcyAqLworCQlzdHJ1Y3QgZXdyazNfc3RhdHMgKnRtcF9zdGF0cyA9CisgICAgICAgIAkJa21hbGxvYyhzaXplb2YobHAtPnBrdFN0YXRzKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghdG1wX3N0YXRzKSB7CisJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmh3X2xvY2ssIGZsYWdzKTsKKwkJbWVtY3B5KHRtcF9zdGF0cywgJmxwLT5wa3RTdGF0cywgc2l6ZW9mKGxwLT5wa3RTdGF0cykpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+aHdfbG9jaywgZmxhZ3MpOworCisJCWlvYy0+bGVuID0gc2l6ZW9mKGxwLT5wa3RTdGF0cyk7CisJCWlmIChjb3B5X3RvX3VzZXIoaW9jLT5kYXRhLCB0bXBfc3RhdHMsIHNpemVvZihscC0+cGt0U3RhdHMpKSkKKyAgICAJCQlzdGF0dXMgPSAtRUZBVUxUOworCQlrZnJlZSh0bXBfc3RhdHMpOworCQlicmVhazsKKwl9CisJY2FzZSBFV1JLM19DTFJfU1RBVFM6CS8qIFplcm8gb3V0IHRoZSBkcml2ZXIgc3RhdGlzdGljcyAqLworCQlpZiAoY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5od19sb2NrLCBmbGFncyk7CisJCQltZW1zZXQoJmxwLT5wa3RTdGF0cywgMCwgc2l6ZW9mKGxwLT5wa3RTdGF0cykpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmh3X2xvY2ssZmxhZ3MpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVQRVJNOworCQl9CisKKwkJYnJlYWs7CisJY2FzZSBFV1JLM19HRVRfQ1NSOgkvKiBHZXQgdGhlIENTUiBSZWdpc3RlciBjb250ZW50cyAqLworCQl0bXAtPmFkZHJbMF0gPSBpbmIoRVdSSzNfQ1NSKTsKKwkJaW9jLT5sZW4gPSAxOworCQlpZiAoY29weV90b191c2VyKGlvYy0+ZGF0YSwgdG1wLT5hZGRyLCBpb2MtPmxlbikpCisJCQlzdGF0dXMgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIEVXUkszX1NFVF9DU1I6CS8qIFNldCB0aGUgQ1NSIFJlZ2lzdGVyIGNvbnRlbnRzICovCisJCWlmIChjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIodG1wLT5hZGRyLCBpb2MtPmRhdGEsIDEpKSB7CisJCQkJc3RhdHVzID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW91dGIodG1wLT5hZGRyWzBdLCBFV1JLM19DU1IpOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVQRVJNOworCQl9CisKKwkJYnJlYWs7CisJY2FzZSBFV1JLM19HRVRfRUVQUk9NOgkvKiBHZXQgdGhlIEVFUFJPTSBjb250ZW50cyAqLworCQlpZiAoY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJZm9yIChpID0gMDsgaSA8IChFRVBST01fTUFYID4+IDEpOyBpKyspIHsKKwkJCQl0bXAtPnZhbFtpXSA9IChzaG9ydCkgUmVhZF9FRVBST00oaW9iYXNlLCBpKTsKKwkJCX0KKwkJCWkgPSBFRVBST01fTUFYOworCQkJdG1wLT5hZGRyW2krK10gPSBpbmIoRVdSSzNfQ01SKTsJCS8qIENvbmZpZy9NYW5hZ2VtZW50IFJlZy4gKi8KKwkJCWZvciAoaiA9IDA7IGogPCBFVEhfQUxFTjsgaisrKSB7CisJCQkJdG1wLT5hZGRyW2krK10gPSBpbmIoRVdSSzNfUEFSMCArIGopOworCQkJfQorCQkJaW9jLT5sZW4gPSBFRVBST01fTUFYICsgMSArIEVUSF9BTEVOOworCQkJaWYgKGNvcHlfdG9fdXNlcihpb2MtPmRhdGEsIHRtcC0+YWRkciwgaW9jLT5sZW4pKQorCQkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCX0KKworCQlicmVhazsKKwljYXNlIEVXUkszX1NFVF9FRVBST006CS8qIFNldCB0aGUgRUVQUk9NIGNvbnRlbnRzICovCisJCWlmIChjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIodG1wLT5hZGRyLCBpb2MtPmRhdGEsIEVFUFJPTV9NQVgpKSB7CisJCQkJc3RhdHVzID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCAoRUVQUk9NX01BWCA+PiAxKTsgaSsrKSB7CisJCQkJV3JpdGVfRUVQUk9NKHRtcC0+dmFsW2ldLCBpb2Jhc2UsIGkpOworCQkJfQorCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVQRVJNOworCQl9CisKKwkJYnJlYWs7CisJY2FzZSBFV1JLM19HRVRfQ01SOgkvKiBHZXQgdGhlIENNUiBSZWdpc3RlciBjb250ZW50cyAqLworCQl0bXAtPmFkZHJbMF0gPSBpbmIoRVdSSzNfQ01SKTsKKwkJaW9jLT5sZW4gPSAxOworCQlpZiAoY29weV90b191c2VyKGlvYy0+ZGF0YSwgdG1wLT5hZGRyLCBpb2MtPmxlbikpCisJCQlzdGF0dXMgPSAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIEVXUkszX1NFVF9UWF9DVVRfVEhSVToJLyogU2V0IFRYIGN1dCB0aHJvdWdoIG1vZGUgKi8KKwkJaWYgKGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCWxwLT50eGMgPSAxOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVQRVJNOworCQl9CisKKwkJYnJlYWs7CisJY2FzZSBFV1JLM19DTFJfVFhfQ1VUX1RIUlU6CS8qIENsZWFyIFRYIGN1dCB0aHJvdWdoIG1vZGUgKi8KKwkJaWYgKGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCWxwLT50eGMgPSAwOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gLUVQRVJNOworCQl9CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3RhdHVzID0gLUVPUE5PVFNVUFA7CisJfQorCWtmcmVlKHRtcCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmZGVmIE1PRFVMRQorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpld3JrM19kZXZzW01BWF9OVU1fRVdSSzNTXTsKK3N0YXRpYyBpbnQgbmRldnM7CitzdGF0aWMgaW50IGlvW01BWF9OVU1fRVdSSzNTKzFdID0geyAweDMwMCwgMCwgfTsKKworLyogJzIxJyBiZWxvdyBzaG91bGQgcmVhbGx5IGJlICdNQVhfTlVNX0VXUkszUycgKi8KK21vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiRXRoZXJXT1JLUyAzIEkvTyBiYXNlIGFkZHJlc3MoZXMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIkV0aGVyV09SS1MgMyBJUlEgbnVtYmVyKHMpIik7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBld3JrM19leGl0X21vZHVsZSh2b2lkKQoreworCWludCBpOworCisJZm9yKCBpPTA7IGk8bmRldnM7IGkrKyApIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGV3cmszX2RldnNbaV07CisJCXN0cnVjdCBld3JrM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJCWV3cmszX2RldnNbaV0gPSBOVUxMOworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRVdSSzNfVE9UQUxfU0laRSk7CisJCWlvdW5tYXAobHAtPnNobWVtKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwl9Cit9CisKK3N0YXRpYyBfX2luaXQgaW50IGV3cmszX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IGk9MDsKKworCXdoaWxlKCBpb1tpXSAmJiBpcnFbaV0gKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKKwkJCT0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBld3JrM19wcml2YXRlKSk7CisKKwkJaWYgKCFkZXYpCisJCQlicmVhazsKKworCQlpZiAoZXdyazNfcHJvYmUxKGRldiwgaW9baV0sIGlycVtpXSkgIT0gMCkgeworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCWJyZWFrOworCQl9CisKKwkJZXdyazNfZGV2c1tuZGV2cysrXSA9IGRldjsKKwkJaSsrOworCX0KKworCXJldHVybiBuZGV2cyA/IDAgOiAtRUlPOworfQorCisKKy8qIEhhY2sgZm9yIGJyZWFrYWdlIGluIG5ldyBtb2R1bGUgc3R1ZmYgKi8KK21vZHVsZV9leGl0KGV3cmszX2V4aXRfbW9kdWxlKTsKK21vZHVsZV9pbml0KGV3cmszX2luaXRfbW9kdWxlKTsKKyNlbmRpZgkJCQkvKiBNT0RVTEUgKi8KK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworDAorCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRF9fS0VSTkVMX18gLUkvbGludXgvaW5jbHVkZSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tc3RyZW5ndGgtcmVkdWNlIC1tYWxpZ24tbG9vcHM9MiAtbWFsaWduLWp1bXBzPTIgLW1hbGlnbi1mdW5jdGlvbnM9MiAtTzIgLW00ODYgLWMgZXdyazMuYyIKKyAqCisgKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1EX19LRVJORUxfXyAtRE1PRFVMRSAtSS9saW51eC9pbmNsdWRlIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1zdHJlbmd0aC1yZWR1Y2UgLW1hbGlnbi1sb29wcz0yIC1tYWxpZ24tanVtcHM9MiAtbWFsaWduLWZ1bmN0aW9ucz0yIC1PMiAtbTQ4NiAtYyBld3JrMy5jIgorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ld3JrMy5oIGIvZHJpdmVycy9uZXQvZXdyazMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjc0YmQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXdyazMuaApAQCAtMCwwICsxLDMyMiBAQAorLyoKKyAgICBXcml0dGVuIDE5OTQgYnkgRGF2aWQgQy4gRGF2aWVzLgorCisgICAgQ29weXJpZ2h0IDE5OTQgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24uCisKKyAgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gIHRoZSB0ZXJtcyBvZiB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKyAgICBUaGUgYXV0aG9yIG1heSAgICBiZSAgcmVhY2hlZCBhcyBkYXZpZXNAd2FudG9uLmxrZy5kZWMuY29tICBvciAgIERpZ2l0YWwKKyAgICBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIDU1MCBLaW5nIFN0cmVldCwgTGl0dGxldG9uIE1BIDAxNDYwLgorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworLyoKKyoqIEkvTyBBZGRyZXNzIFJlZ2lzdGVyIE1hcAorKi8KKyNkZWZpbmUgRVdSSzNfQ1NSICAgIGlvYmFzZSsweDAwICAgLyogQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIEVXUkszX0NSICAgICBpb2Jhc2UrMHgwMSAgIC8qIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVdSSzNfSUNSICAgIGlvYmFzZSsweDAyICAgLyogSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVdSSzNfVFNSICAgIGlvYmFzZSsweDAzICAgLyogVHJhbnNtaXQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIEVXUkszX1JTVkQxICBpb2Jhc2UrMHgwNCAgIC8qIFJFU0VSVkVEICovCisjZGVmaW5lIEVXUkszX1JTVkQyICBpb2Jhc2UrMHgwNSAgIC8qIFJFU0VSVkVEICovCisjZGVmaW5lIEVXUkszX0ZNUSAgICBpb2Jhc2UrMHgwNiAgIC8qIEZyZWUgTWVtb3J5IFF1ZXVlICovCisjZGVmaW5lIEVXUkszX0ZNUUMgICBpb2Jhc2UrMHgwNyAgIC8qIEZyZWUgTWVtb3J5IFF1ZXVlIENvdW50ZXIgKi8KKyNkZWZpbmUgRVdSSzNfUlEgICAgIGlvYmFzZSsweDA4ICAgLyogUmVjZWl2ZSBRdWV1ZSAqLworI2RlZmluZSBFV1JLM19SUUMgICAgaW9iYXNlKzB4MDkgICAvKiBSZWNlaXZlIFF1ZXVlIENvdW50ZXIgKi8KKyNkZWZpbmUgRVdSSzNfVFEgICAgIGlvYmFzZSsweDBhICAgLyogVHJhbnNtaXQgUXVldWUgKi8KKyNkZWZpbmUgRVdSSzNfVFFDICAgIGlvYmFzZSsweDBiICAgLyogVHJhbnNtaXQgUXVldWUgQ291bnRlciAqLworI2RlZmluZSBFV1JLM19URFEgICAgaW9iYXNlKzB4MGMgICAvKiBUcmFuc21pdCBEb25lIFF1ZXVlICovCisjZGVmaW5lIEVXUkszX1REUUMgICBpb2Jhc2UrMHgwZCAgIC8qIFRyYW5zbWl0IERvbmUgUXVldWUgQ291bnRlciAqLworI2RlZmluZSBFV1JLM19QSVIxICAgaW9iYXNlKzB4MGUgICAvKiBQYWdlIEluZGV4IFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgRVdSSzNfUElSMiAgIGlvYmFzZSsweDBmICAgLyogUGFnZSBJbmRleCBSZWdpc3RlciAyICovCisjZGVmaW5lIEVXUkszX0RBVEEgICBpb2Jhc2UrMHgxMCAgIC8qIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVdSSzNfSU9QUiAgIGlvYmFzZSsweDExICAgLyogSS9PIFBhZ2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVdSSzNfSU9CUiAgIGlvYmFzZSsweDEyICAgLyogSS9PIEJhc2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVdSSzNfTVBSICAgIGlvYmFzZSsweDEzICAgLyogTWVtb3J5IFBhZ2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVdSSzNfTUJSICAgIGlvYmFzZSsweDE0ICAgLyogTWVtb3J5IEJhc2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVdSSzNfQVBST00gIGlvYmFzZSsweDE1ICAgLyogQWRkcmVzcyBQUk9NICovCisjZGVmaW5lIEVXUkszX0VQUk9NMSBpb2Jhc2UrMHgxNiAgIC8qIEVFUFJPTSBEYXRhIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgRVdSSzNfRVBST00yIGlvYmFzZSsweDE3ICAgLyogRUVQUk9NIERhdGEgUmVnaXN0ZXIgMiAqLworI2RlZmluZSBFV1JLM19QQVIwICAgaW9iYXNlKzB4MTggICAvKiBQaHlzaWNhbCBBZGRyZXNzIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgRVdSSzNfUEFSMSAgIGlvYmFzZSsweDE5ICAgLyogUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciAxICovCisjZGVmaW5lIEVXUkszX1BBUjIgICBpb2Jhc2UrMHgxYSAgIC8qIFBoeXNpY2FsIEFkZHJlc3MgUmVnaXN0ZXIgMiAqLworI2RlZmluZSBFV1JLM19QQVIzICAgaW9iYXNlKzB4MWIgICAvKiBQaHlzaWNhbCBBZGRyZXNzIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUgRVdSSzNfUEFSNCAgIGlvYmFzZSsweDFjICAgLyogUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlciA0ICovCisjZGVmaW5lIEVXUkszX1BBUjUgICBpb2Jhc2UrMHgxZCAgIC8qIFBoeXNpY2FsIEFkZHJlc3MgUmVnaXN0ZXIgNSAqLworI2RlZmluZSBFV1JLM19DTVIgICAgaW9iYXNlKzB4MWUgICAvKiBDb25maWd1cmF0aW9uL01hbmFnZW1lbnQgUmVnaXN0ZXIgKi8KKworLyoKKyoqIENvbnRyb2wgUGFnZSBNYXAKKyovCisjZGVmaW5lIFBBR0UwX0ZNUSAgICAgMHgwMDAgICAgICAgICAvKiBGcmVlIE1lbW9yeSBRdWV1ZSAqLworI2RlZmluZSBQQUdFMF9SUSAgICAgIDB4MDgwICAgICAgICAgLyogUmVjZWl2ZSBRdWV1ZSAqLworI2RlZmluZSBQQUdFMF9UUSAgICAgIDB4MTAwICAgICAgICAgLyogVHJhbnNtaXQgUXVldWUgKi8KKyNkZWZpbmUgUEFHRTBfVERRICAgICAweDE4MCAgICAgICAgIC8qIFRyYW5zbWl0IERvbmUgUXVldWUgKi8KKyNkZWZpbmUgUEFHRTBfSFRFICAgICAweDIwMCAgICAgICAgIC8qIEhhc2ggVGFibGUgRW50cmllcyAqLworI2RlZmluZSBQQUdFMF9SU1ZEICAgIDB4MjQwICAgICAgICAgLyogUkVTRVJWRUQgKi8KKyNkZWZpbmUgUEFHRTBfVVNSRCAgICAweDYwMCAgICAgICAgIC8qIFVzZXIgRGF0YSAqLworCisvKgorKiogQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucyAoRVdSSzNfQ1NSKQorKi8KKyNkZWZpbmUgQ1NSX1JBCQkweDgwCSAgICAvKiBSdW50IEFjY2VwdCAqLworI2RlZmluZSBDU1JfUE1FCQkweDQwCSAgICAvKiBQcm9taXNjdW91cyBNb2RlIEVuYWJsZSAqLworI2RlZmluZSBDU1JfTUNFCQkweDIwCSAgICAvKiBNdWx0aWNhc3QgRW5hYmxlICovIAorI2RlZmluZSBDU1JfVE5FCQkweDA4CSAgICAvKiBUWCBEb25lIFF1ZXVlIE5vdCBFbXB0eSAqLworI2RlZmluZSBDU1JfUk5FCQkweDA0CSAgICAvKiBSWCBRdWV1ZSBOb3QgRW1wdHkgKi8KKyNkZWZpbmUgQ1NSX1RYRAkJMHgwMgkgICAgLyogVFggRGlzYWJsZSAqLworI2RlZmluZSBDU1JfUlhECQkweDAxCSAgICAvKiBSWCBEaXNhYmxlICovCisKKy8qCisqKiBDb250cm9sIFJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucyAoRVdSSzNfQ1IpCisqLworI2RlZmluZSBDUl9BUEQJCTB4ODAJLyogQXV0byBQb3J0IERpc2FibGUgKi8KKyNkZWZpbmUgQ1JfUFNFTAkJMHg0MAkvKiBQb3J0IFNlbGVjdCAoMC0+VFAgcG9ydCkgKi8KKyNkZWZpbmUgQ1JfTEJDSwkJMHgyMAkvKiBMb29wQmFDSyBlbmFibGUgKi8KKyNkZWZpbmUgQ1JfRkRVUAkJMHgxMAkvKiBGdWxsIERVUGxleCBlbmFibGUgKi8KKyNkZWZpbmUgQ1JfRkJVUwkJMHgwOAkvKiBGYXN0IEJVUyBlbmFibGUgKElTQSBjbGsgPiA4LjMzTUh6KSAqLworI2RlZmluZSBDUl9FTl8xNgkweDA0CS8qIEVOYWJsZSAxNiBiaXQgbWVtb3J5IGFjY2Vzc2VzICovCisjZGVmaW5lIENSX0xFRAkJMHgwMgkvKiBMRUQgKDEtPiB0dXJuIG9uKSAqLworCisvKgorKiogSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgYml0IGRlZmluaXRpb25zIChFV1JLM19JQ1IpCisqLworI2RlZmluZSBJQ1JfSUUJCTB4ODAJLyogSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBJQ1JfSVMJCTB4NjAJLyogSW50ZXJydXB0IFNlbGVjdGVkICovCisjZGVmaW5lIElDUl9UTkVNCTB4MDgJLyogVE5FIE1hc2sgKDAtPm1hc2spICovCisjZGVmaW5lIElDUl9STkVNCTB4MDQJLyogUk5FIE1hc2sgKDAtPm1hc2spICovCisjZGVmaW5lIElDUl9UWERNCTB4MDIJLyogVFhEIE1hc2sgKDAtPm1hc2spICovCisjZGVmaW5lIElDUl9SWERNCTB4MDEJLyogUlhEIE1hc2sgKDAtPm1hc2spICovCisKKy8qCisqKiBUcmFuc21pdCBTdGF0dXMgUmVnaXN0ZXIgYml0IGRlZmluaXRpb25zIChFV1JLM19UU1IpCisqLworI2RlZmluZSBUU1JfTkNMCQkweDgwCS8qIE5vIENhcnJpZXIgTG9vcGJhY2sgKi8KKyNkZWZpbmUgVFNSX0lECQkweDQwCS8qIEluaXRpYWxseSBEZWZlcnJlZCAqLworI2RlZmluZSBUU1JfTENMCQkweDIwCS8qIExhdGUgQ29MbGlzaW9uICovCisjZGVmaW5lIFRTUl9FQ0wJCTB4MTAJLyogRXhjZXNzaXZlIENvTGxpc2lvbnMgKi8KKyNkZWZpbmUgVFNSX1JDTlRSCTB4MGYJLyogUmV0cmllcyBDb3VOVGVSICovCisKKy8qCisqKiBJL08gUGFnZSBSZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMgKEVXUkszX0lPUFIpCisqLworI2RlZmluZSBFRVBST01fSU5JVAkweGMwCS8qIEVFUFJPTSBJTklUIGNvbW1hbmQgKi8KKyNkZWZpbmUgRUVQUk9NX1dSX0VOCTB4YzgJLyogRUVQUk9NIFdSSVRFIEVOQUJMRSBjb21tYW5kICovCisjZGVmaW5lIEVFUFJPTV9XUgkweGQwCS8qIEVFUFJPTSBXUklURSBjb21tYW5kICovCisjZGVmaW5lIEVFUFJPTV9XUl9ESVMJMHhkOAkvKiBFRVBST00gV1JJVEUgRElTQUJMRSBjb21tYW5kICovCisjZGVmaW5lIEVFUFJPTV9SRAkweGUwCS8qIEVFUFJPTSBSRUFEIGNvbW1hbmQgKi8KKworLyoKKyoqIEkvTyBCYXNlIFJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucyAoRVdSSzNfSU9CUikKKyovCisjZGVmaW5lIEVJU0FfUkVHU19FTgkweDIwCS8qIEVuYWJsZSBFSVNBIElEIGFuZCBDb250cm9sIFJlZ2lzdGVycyAqLworI2RlZmluZSBFSVNBX0lPQiAgICAgICAgMHgxZgkvKiBDb21wYXJlIGJpdHMgZm9yIEkvTyBCYXNlIEFkZHJlc3MgKi8KKworLyoKKyoqIEkvTyBDb25maWd1cmF0aW9uL01hbmFnZW1lbnQgUmVnaXN0ZXIgYml0IGRlZmluaXRpb25zIChFV1JLM19DTVIpCisqLworI2RlZmluZSBDTVJfUkEgICAgICAgICAgMHg4MCAgICAvKiBSZWFkIEFoZWFkICovCisjZGVmaW5lIENNUl9XQiAgICAgICAgICAweDQwICAgIC8qIFdyaXRlIEJlaGluZCAqLworI2RlZmluZSBDTVJfTElOSyAgICAgICAgMHgyMAkvKiAwLT5UUCAqLworI2RlZmluZSBDTVJfUE9MQVJJVFkgICAgMHgxMAkvKiBJbmZvcm1hdGlvbmFsICovCisjZGVmaW5lIENNUl9OT19FRVBST00JMHgwYwkvKiBOT19FRVBST008MTowPiBwaW4gc3RhdHVzICovCisjZGVmaW5lIENNUl9IUyAgICAgICAgICAweDA4CS8qIEhhcmQgU3RyYXBwZWQgcGluIHN0YXR1cyAoTGVNQUMyKSAqLworI2RlZmluZSBDTVJfUE5QICAgICAgICAgMHgwNCAgICAvKiBQbHVnICduIFBsYXkgKi8KKyNkZWZpbmUgQ01SX0RSQU0gICAgICAgIDB4MDIJLyogMC0+IDFEUkFNLCAxLT4gMiBEUkFNIG9uIGJvYXJkICovCisjZGVmaW5lIENNUl8wV1MgICAgICAgICAweDAxICAgIC8qIFplcm8gV2FpdCBTdGF0ZSAqLworCisvKiAKKyoqIE1BQyBSZWNlaXZlIFN0YXR1cyBSZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMKKyovCisKKyNkZWZpbmUgUl9ST0sgICAgIAkweDgwIAkvKiBSZWNlaXZlIE9LIHN1bW1hcnkgKi8KKyNkZWZpbmUgUl9JQU0gICAgIAkweDEwIAkvKiBJbmRpdmlkdWFsIEFkZHJlc3MgTWF0Y2ggKi8KKyNkZWZpbmUgUl9NQ00gICAgIAkweDA4IAkvKiBNdWx0aUNhc3QgTWF0Y2ggKi8KKyNkZWZpbmUgUl9EQkUgICAgIAkweDA0IAkvKiBEcmliYmxlIEJpdCBFcnJvciAqLworI2RlZmluZSBSX0NSQyAgICAgCTB4MDIgCS8qIENSQyBlcnJvciAqLworI2RlZmluZSBSX1BMTCAgICAgCTB4MDEgCS8qIFBoYXNlIExvY2sgTG9zdCAqLworCisvKiAKKyoqIE1BQyBUcmFuc21pdCBDb250cm9sIFJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucworKi8KKworI2RlZmluZSBUQ1JfU1FFRSAgICAJMHg0MCAJLyogU1FFIEVuYWJsZSAtIGxvb2sgZm9yIGhlYXJ0YmVhdCAgKi8KKyNkZWZpbmUgVENSX1NFRCAgICAgCTB4MjAgCS8qIFN0b3Agd2hlbiBFcnJvciBEZXRlY3RlZCAqLworI2RlZmluZSBUQ1JfUU1PREUgICAgIAkweDEwIAkvKiBRX01PREUgKi8KKyNkZWZpbmUgVENSX0xBQiAgICAgICAgIDB4MDggCS8qIExlc3MgQWdncmVzc2l2ZSBCYWNrb2ZmICovCisjZGVmaW5lIFRDUl9QQUQgICAgIAkweDA0IAkvKiBQQUQgUnVudCBQYWNrZXRzICovCisjZGVmaW5lIFRDUl9JRkMgICAgIAkweDAyIAkvKiBJbnNlcnQgRnJhbWUgQ2hlY2sgKi8KKyNkZWZpbmUgVENSX0lTQSAgICAgCTB4MDEgCS8qIEluc2VydCBTb3VyY2UgQWRkcmVzcyAqLworCisvKiAKKyoqIE1BQyBUcmFuc21pdCBTdGF0dXMgUmVnaXN0ZXIgYml0IGRlZmluaXRpb25zCisqLworCisjZGVmaW5lIFRfVlNUUyAgICAJMHg4MCAJLyogVmFsaWQgU1RhdHVTICovCisjZGVmaW5lIFRfQ1RVICAgICAJMHg0MCAJLyogQ3V0IFRocm91Z2ggVXNlZCAqLworI2RlZmluZSBUX1NRRSAgICAgCTB4MjAgCS8qIFNpZ25hbCBRdWFsaXR5IEVycm9yICovCisjZGVmaW5lIFRfTkNMICAgICAJMHgxMCAJLyogTm8gQ2FycmllciBMb29wYmFjayAqLworI2RlZmluZSBUX0xDTCAgICAgICAgICAgMHgwOCAJLyogTGF0ZSBDb2xsaXNpb24gKi8KKyNkZWZpbmUgVF9JRCAgICAgIAkweDA0IAkvKiBJbml0aWFsbHkgRGVmZXJyZWQgKi8KKyNkZWZpbmUgVF9DT0xMICAgICAJMHgwMyAJLyogQ09MTGlzaW9uIHN0YXR1cyAqLworI2RlZmluZSBUX1hDT0xMICAgICAgICAgMHgwMyAgICAvKiBFeGNlc3NpdmUgQ29sbGlzaW9ucyAqLworI2RlZmluZSBUX01DT0xMICAgICAgICAgMHgwMiAgICAvKiBNdWx0aXBsZSBDb2xsaXNpb25zICovCisjZGVmaW5lIFRfT0NPTEwgICAgICAgICAweDAxICAgIC8qIE9uZSBDb2xsaXNpb24gKi8KKyNkZWZpbmUgVF9OT0NPTEwgICAgICAgIDB4MDAgICAgLyogTm8gQ29sbGlzaW9ucyAqLworI2RlZmluZSBUX1hVUiAgICAgICAgICAgMHgwMyAgICAvKiBFeGNlc3NpdmUgVW5kZXJydW5zICovCisjZGVmaW5lIFRfVFhFICAgICAgICAgICAweDdmICAgIC8qIFRYIEVycm9ycyAqLworCisvKiAKKyoqIEVJU0EgQ29uZmlndXJhdGlvbiBSZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMgCisqLworCisjZGVmaW5lIEVJU0FfSUQgICAgICAgaW9iYXNlICsgMHgwYzgwICAvKiBFSVNBIElEIFJlZ2lzdGVycyAqLyAKKyNkZWZpbmUgRUlTQV9JRDAgICAgICBpb2Jhc2UgKyAweDBjODAgIC8qIEVJU0EgSUQgUmVnaXN0ZXIgMCAqLyAKKyNkZWZpbmUgRUlTQV9JRDEgICAgICBpb2Jhc2UgKyAweDBjODEgIC8qIEVJU0EgSUQgUmVnaXN0ZXIgMSAqLyAKKyNkZWZpbmUgRUlTQV9JRDIgICAgICBpb2Jhc2UgKyAweDBjODIgIC8qIEVJU0EgSUQgUmVnaXN0ZXIgMiAqLyAKKyNkZWZpbmUgRUlTQV9JRDMgICAgICBpb2Jhc2UgKyAweDBjODMgIC8qIEVJU0EgSUQgUmVnaXN0ZXIgMyAqLyAKKyNkZWZpbmUgRUlTQV9DUiAgICAgICBpb2Jhc2UgKyAweDBjODQgIC8qIEVJU0EgQ29udHJvbCBSZWdpc3RlciAqLworCisvKgorKiogRUVQUk9NIEJZVEVTCisqLworI2RlZmluZSBFRVBST01fTUVNQiAgICAgMHgwMAorI2RlZmluZSBFRVBST01fSU9CICAgICAgMHgwMQorI2RlZmluZSBFRVBST01fRUlTQV9JRDAgMHgwMgorI2RlZmluZSBFRVBST01fRUlTQV9JRDEgMHgwMworI2RlZmluZSBFRVBST01fRUlTQV9JRDIgMHgwNAorI2RlZmluZSBFRVBST01fRUlTQV9JRDMgMHgwNQorI2RlZmluZSBFRVBST01fTUlTQzAgICAgMHgwNgorI2RlZmluZSBFRVBST01fTUlTQzEgICAgMHgwNworI2RlZmluZSBFRVBST01fUE5BTUU3ICAgMHgwOAorI2RlZmluZSBFRVBST01fUE5BTUU2ICAgMHgwOQorI2RlZmluZSBFRVBST01fUE5BTUU1ICAgMHgwYQorI2RlZmluZSBFRVBST01fUE5BTUU0ICAgMHgwYgorI2RlZmluZSBFRVBST01fUE5BTUUzICAgMHgwYworI2RlZmluZSBFRVBST01fUE5BTUUyICAgMHgwZAorI2RlZmluZSBFRVBST01fUE5BTUUxICAgMHgwZQorI2RlZmluZSBFRVBST01fUE5BTUUwICAgMHgwZgorI2RlZmluZSBFRVBST01fU1dGTEFHUyAgMHgxMAorI2RlZmluZSBFRVBST01fSFdDQVQgICAgMHgxMQorI2RlZmluZSBFRVBST01fTkVUTUFOMiAgMHgxMgorI2RlZmluZSBFRVBST01fUkVWTFZMICAgMHgxMworI2RlZmluZSBFRVBST01fTkVUTUFOMCAgMHgxNAorI2RlZmluZSBFRVBST01fTkVUTUFOMSAgMHgxNQorI2RlZmluZSBFRVBST01fQ0hJUFZFUiAgMHgxNgorI2RlZmluZSBFRVBST01fU0VUVVAgICAgMHgxNworI2RlZmluZSBFRVBST01fUEFERFIwICAgMHgxOAorI2RlZmluZSBFRVBST01fUEFERFIxICAgMHgxOQorI2RlZmluZSBFRVBST01fUEFERFIyICAgMHgxYQorI2RlZmluZSBFRVBST01fUEFERFIzICAgMHgxYgorI2RlZmluZSBFRVBST01fUEFERFI0ICAgMHgxYworI2RlZmluZSBFRVBST01fUEFERFI1ICAgMHgxZAorI2RlZmluZSBFRVBST01fUEFfQ1JDICAgMHgxZQorI2RlZmluZSBFRVBST01fQ0hLU1VNICAgMHgxZgorCisvKgorKiogRUVQUk9NIGJ5dGVzIGZvciBjaGVja3N1bW1pbmcKKyovCisjZGVmaW5lIEVFUFJPTV9NQVggICAgICAzMiAgICAgICAgICAgICAvKiBieXRlcyAqLworCisvKgorKiogRUVQUk9NIE1JU0NFTExBTkVPVVMgRkxBR1MKKyovCisjZGVmaW5lIFJCRV9TSEFET1cJMHgwMTAwCS8qIFJlbW90ZSBCb290IEVuYWJsZSBTaGFkb3cgKi8gCisjZGVmaW5lIFJFQURfQUhFQUQgICAgICAweDAwODAgIC8qIFJlYWQgQWhlYWQgZmVhdHVyZSAqLworI2RlZmluZSBJUlFfU0VMMiAgICAgICAgMHgwMDcwICAvKiBJUlEgbGluZSBzZWxlY3Rpb24gKExlTUFDMikgKi8KKyNkZWZpbmUgSVJRX1NFTCAgICAgICAgIDB4MDA2MCAgLyogSVJRIGxpbmUgc2VsZWN0aW9uICovCisjZGVmaW5lIEZBU1RfQlVTICAgICAgICAweDAwMDggIC8qIElTQSBCdXMgc3BlZWRzID4gOC4zM01IeiAqLworI2RlZmluZSBFTkFfMTYgICAgICAgICAgMHgwMDA0ICAvKiBFbmFibGVzIDE2IGJpdCBtZW1vcnkgdHJhbnNmZXJzICovCisjZGVmaW5lIFdSSVRFX0JFSElORCAgICAweDAwMDIgIC8qIFdyaXRlIEJlaGluZCBmZWF0dXJlICovCisjZGVmaW5lIF8wV1NfRU5BICAgICAgICAweDAwMDEgIC8qIFplcm8gV2FpdCBTdGF0ZSBFbmFibGUgKi8KKworLyoKKyoqIEVFUFJPTSBORVRXT1JLIE1BTkFHRU1FTlQgRkxBR1MKKyovCisjZGVmaW5lIE5FVE1BTl9QT0wgICAgICAweDA0ICAgIC8qIFBvbGFyaXR5IGRlZmVhdCAqLworI2RlZmluZSBORVRNQU5fTElOSyAgICAgMHgwMiAgICAvKiBMaW5rIGRlZmVhdCAqLworI2RlZmluZSBORVRNQU5fQ0NFICAgICAgMHgwMSAgICAvKiBDdXN0b20gQ291bnRlcnMgRW5hYmxlICovCisKKy8qCisqKiBFRVBST00gU1cgRkxBR1MKKyovCisjZGVmaW5lIFNXX1NRRQkJMHgxMAkvKiBTaWduYWwgUXVhbGl0eSBFcnJvciAqLyAKKyNkZWZpbmUgU1dfTEFCCQkweDA4CS8qIExlc3MgQWdncmVzc2l2ZSBCYWNrb2ZmICovCisjZGVmaW5lIFNXX0lOSVQJCTB4MDQJLyogSW5pdGlhbGl6ZWQgKi8KKyNkZWZpbmUgU1dfVElNRU9VVCAgICAgCTB4MDIJLyogMDoyLjUgbWlucywgMTogMzAgc2VjcyAqLworI2RlZmluZSBTV19SRU1PVEUgICAgICAJMHgwMSAgICAvKiBSZW1vdGUgQm9vdCBFbmFibGUgLT4gMSAqLworCisvKgorKiogRUVQUk9NIFNFVFVQIEZMQUdTCisqLworI2RlZmluZSBTRVRVUF9BUEQJMHg4MAkvKiBBdXRvUG9ydCBEaXNhYmxlICovCisjZGVmaW5lIFNFVFVQX1BTCTB4NDAJLyogUG9ydCBTZWxlY3QgKi8KKyNkZWZpbmUgU0VUVVBfTVAJMHgyMAkvKiBNdWx0aVBvcnQgKi8KKyNkZWZpbmUgU0VUVVBfMVRQCTB4MTAJLyogMSBwb3J0LCBUUCAqLworI2RlZmluZSBTRVRVUF8xQ09BWAkweDAwCS8qIDEgcG9ydCwgQ29heCAqLworI2RlZmluZSBTRVRVUF9EUkFNCTB4MDIJLyogTnVtYmVyIG9mIERSQU1TIG9uIGJvYXJkICovCisKKy8qCisqKiBFRVBST00gTUFOQUdFTUVOVCBGTEFHUworKi8KKyNkZWZpbmUgTUdNVF9DQ0UJMHgwMQkvKiBDdXN0b20gQ291bnRlcnMgRW5hYmxlICovCisKKy8qCisqKiBFRVBST00gVkVSU0lPTlMKKyovCisjZGVmaW5lIExlTUFDICAgICAgICAgICAweDExCisjZGVmaW5lIExlTUFDMiAgICAgICAgICAweDEyCisKKy8qCisqKiBNaXNjZWxsYW5lb3VzCisqLworCisjZGVmaW5lIEVFUFJPTV9XQUlUX1RJTUUgMTAwMCAgICAvKiBOdW1iZXIgb2YgbWljcm9zZWNvbmRzICovCisjZGVmaW5lIEVJU0FfRU4gICAgICAgICAweDAwMDEgICAvKiBFbmFibGUgRUlTQSBidXMgYnVmZmVycyAqLworCisjZGVmaW5lIEhBU0hfVEFCTEVfTEVOICAgNTEyICAgICAvKiBCaXRzICovCisKKyNkZWZpbmUgWENUIDB4ODAgICAgICAgICAgICAgICAgIC8qIFRyYW5zbWl0IEN1dCBUaHJvdWdoICovCisjZGVmaW5lIFBSRUxPQUQgMTYgICAgICAgICAgICAgICAvKiA0IGxvbmcgd29yZHMgKi8KKworI2RlZmluZSBNQVNLX0lOVEVSUlVQVFMgICAxCisjZGVmaW5lIFVOTUFTS19JTlRFUlJVUFRTIDAKKworI2RlZmluZSBFRVBST01fT0ZGU0VUKGEpICgodV9zaG9ydCkoKHVfbG9uZykoYSkpKQorCisvKgorKiogSW5jbHVkZSB0aGUgSU9DVEwgc3R1ZmYKKyovCisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorCisjZGVmaW5lCUVXUkszSU9DVEwJU0lPQ0RFVlBSSVZBVEUKKworc3RydWN0IGV3cmszX2lvY3RsIHsKKwl1bnNpZ25lZCBzaG9ydCBjbWQ7ICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgdG8gcnVuICovCisJdW5zaWduZWQgc2hvcnQgbGVuOyAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgdGhlIGRhdGEgYnVmZmVyICovCisJdW5zaWduZWQgY2hhciAgX191c2VyICpkYXRhOyAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciAqLworfTsKKworLyogCisqKiBSZWNvZ25pc2VkIGNvbW1hbmRzIGZvciB0aGUgZHJpdmVyIAorKi8KKyNkZWZpbmUgRVdSSzNfR0VUX0hXQUREUgkweDAxIC8qIEdldCB0aGUgaGFyZHdhcmUgYWRkcmVzcyAqLworI2RlZmluZSBFV1JLM19TRVRfSFdBRERSCTB4MDIgLyogR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzICovCisjZGVmaW5lIEVXUkszX1NFVF9QUk9NICAJMHgwMyAvKiBTZXQgUHJvbWlzY3VvdXMgTW9kZSAqLworI2RlZmluZSBFV1JLM19DTFJfUFJPTSAgCTB4MDQgLyogQ2xlYXIgUHJvbWlzY3VvdXMgTW9kZSAqLworI2RlZmluZSBFV1JLM19TQVlfQk9PCSAgICAgICAgMHgwNSAvKiBTYXkgIkJvbyEiIHRvIHRoZSBrZXJuZWwgbG9nIGZpbGUgKi8KKyNkZWZpbmUgRVdSSzNfR0VUX01DQSAgIAkweDA2IC8qIEdldCBhIG11bHRpY2FzdCBhZGRyZXNzICovCisjZGVmaW5lIEVXUkszX1NFVF9NQ0EgICAJMHgwNyAvKiBTZXQgYSBtdWx0aWNhc3QgYWRkcmVzcyAqLworI2RlZmluZSBFV1JLM19DTFJfTUNBICAgIAkweDA4IC8qIENsZWFyIGEgbXVsdGljYXN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgRVdSSzNfTUNBX0VOICAgIAkweDA5IC8qIEVuYWJsZSBhIG11bHRpY2FzdCBhZGRyZXNzIGdyb3VwICovCisjZGVmaW5lIEVXUkszX0dFVF9TVEFUUyAgCTB4MGEgLyogR2V0IHRoZSBkcml2ZXIgc3RhdGlzdGljcyAqLworI2RlZmluZSBFV1JLM19DTFJfU1RBVFMgCTB4MGIgLyogWmVybyBvdXQgdGhlIGRyaXZlciBzdGF0aXN0aWNzICovCisjZGVmaW5lIEVXUkszX0dFVF9DU1IgICAJMHgwYyAvKiBHZXQgdGhlIENTUiBSZWdpc3RlciBjb250ZW50cyAqLworI2RlZmluZSBFV1JLM19TRVRfQ1NSICAgCTB4MGQgLyogU2V0IHRoZSBDU1IgUmVnaXN0ZXIgY29udGVudHMgKi8KKyNkZWZpbmUgRVdSSzNfR0VUX0VFUFJPTSAgIAkweDBlIC8qIEdldCB0aGUgRUVQUk9NIGNvbnRlbnRzICovCisjZGVmaW5lIEVXUkszX1NFVF9FRVBST00JMHgwZiAvKiBTZXQgdGhlIEVFUFJPTSBjb250ZW50cyAqLworI2RlZmluZSBFV1JLM19HRVRfQ01SICAgCTB4MTAgLyogR2V0IHRoZSBDTVIgUmVnaXN0ZXIgY29udGVudHMgKi8KKyNkZWZpbmUgRVdSSzNfQ0xSX1RYX0NVVF9USFJVICAJMHgxMSAvKiBDbGVhciB0aGUgVFggY3V0IHRocm91Z2ggbW9kZSAqLworI2RlZmluZSBFV1JLM19TRVRfVFhfQ1VUX1RIUlUJMHgxMiAvKiBTZXQgdGhlIFRYIGN1dCB0aHJvdWdoIG1vZGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZlYWxueC5jIGIvZHJpdmVycy9uZXQvZmVhbG54LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1ZTlkZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2ZlYWxueC5jCkBAIC0wLDAgKzEsMjAwNSBAQAorLyoKKwlXcml0dGVuIDE5OTgtMjAwMCBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorCXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisJRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdAorCXJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZS4gIFRoaXMgZmlsZSBpcyBub3QKKwlhIGNvbXBsZXRlIHByb2dyYW0gYW5kIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgZW50aXJlIG9wZXJhdGluZworCXN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorCisJVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisJU3VwcG9ydCBpbmZvcm1hdGlvbiBhbmQgdXBkYXRlcyBhdmFpbGFibGUgYXQKKwlodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL3BjaS1za2VsZXRvbi5odG1sCisKKwlMaW51eCBrZXJuZWwgdXBkYXRlczoKKworCVZlcnNpb24gMi41MSwgTm92IDE3LCAyMDAxIChqZ2FyemlrKToKKwktIEFkZCBldGh0b29sIHN1cHBvcnQKKwktIFJlcGxhY2Ugc29tZSBNSUktcmVsYXRlZCBtYWdpYyBudW1iZXJzIHdpdGggY29uc3RhbnRzCisKKyovCisKKyNkZWZpbmUgRFJWX05BTUUJImZlYWxueCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjIuNTEiCisjZGVmaW5lIERSVl9SRUxEQVRFCSJOb3YtMTctMjAwMSIKKworc3RhdGljIGludCBkZWJ1ZzsJCS8qIDEtPiBwcmludCBkZWJ1ZyBtZXNzYWdlICovCitzdGF0aWMgaW50IG1heF9pbnRlcnJ1cHRfd29yayA9IDIwOworCisvKiBNYXhpbXVtIG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIGZpbHRlciAodnMuIFJ4LWFsbC1tdWx0aWNhc3QpLiAqLworc3RhdGljIGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gMzI7CisKKy8qIFNldCB0aGUgY29weSBicmVha3BvaW50IGZvciB0aGUgY29weS1vbmx5LXRpbnktZnJhbWVzIHNjaGVtZS4gKi8KKy8qIFNldHRpbmcgdG8gPiAxNTE4IGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoaXMgZmVhdHVyZS4gICAgICAgICAgKi8KK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrOworCisvKiBVc2VkIHRvIHBhc3MgdGhlIG1lZGlhIHR5cGUsIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJvdGggJ29wdGlvbnNbXScgYW5kICdmdWxsX2R1cGxleFtdJyBzaG91bGQgZXhpc3QgZm9yIGRyaXZlciAqLworLyogaW50ZXJvcGVyYWJpbGl0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGUgbWVkaWEgdHlwZSBpcyB1c3VhbGx5IHBhc3NlZCBpbiAnb3B0aW9uc1tdJy4gICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUFYX1VOSVRTIDgJCS8qIE1vcmUgYXJlIHN1cHBvcnRlZCwgbGltaXQgb25seSBvbiBvcHRpb25zICovCitzdGF0aWMgaW50IG9wdGlvbnNbTUFYX1VOSVRTXSA9IHsgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH07CitzdGF0aWMgaW50IGZ1bGxfZHVwbGV4W01BWF9VTklUU10gPSB7IC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9OworCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIHNldCBhdCBjb21waWxlIHRpbWUuICAgICAgICAgICAgICAgICAqLworLyogS2VlcCB0aGUgcmluZyBzaXplcyBhIHBvd2VyIG9mIHR3byBmb3IgY29tcGlsZSBlZmZpY2llbmN5LiAgICAgICAgICAgKi8KKy8qIFRoZSBjb21waWxlciB3aWxsIGNvbnZlcnQgPHVuc2lnbmVkPiclJzwyXk4+IGludG8gYSBiaXQgbWFzay4gICAgICAgICovCisvKiBNYWtpbmcgdGhlIFR4IHJpbmcgdG9vIGxhcmdlIGRlY3JlYXNlcyB0aGUgZWZmZWN0aXZlbmVzcyBvZiBjaGFubmVsICAqLworLyogYm9uZGluZyBhbmQgcGFja2V0IHByaW9yaXR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoZXJlIGFyZSBubyBpbGwgZWZmZWN0cyBmcm9tIHRvby1sYXJnZSByZWNlaXZlIHJpbmdzLiAgICAgICAgICAgICAgICovCisvLyA4OC0xMi05IG1vZGlmeSwKKy8vICNkZWZpbmUgVFhfUklOR19TSVpFICAgIDE2CisvLyAjZGVmaW5lIFJYX1JJTkdfU0laRSAgICAzMgorI2RlZmluZSBUWF9SSU5HX1NJWkUgICAgNgorI2RlZmluZSBSWF9SSU5HX1NJWkUgICAgMTIKKyNkZWZpbmUgVFhfVE9UQUxfU0laRQlUWF9SSU5HX1NJWkUqc2l6ZW9mKHN0cnVjdCBmZWFsbnhfZGVzYykKKyNkZWZpbmUgUlhfVE9UQUxfU0laRQlSWF9SSU5HX1NJWkUqc2l6ZW9mKHN0cnVjdCBmZWFsbnhfZGVzYykKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAgICAgKDIqSFopCisKKyNkZWZpbmUgUEtUX0JVRl9TWiAgICAgIDE1MzYJLyogU2l6ZSBvZiBlYWNoIHRlbXBvcmFyeSBSeCBidWZmZXIuICovCisKKworLyogSW5jbHVkZSBmaWxlcywgZGVzaWduZWQgdG8gc3VwcG9ydCBtb3N0IGtlcm5lbCB2ZXJzaW9ucyAyLjAuMCBhbmQgbGF0ZXIuICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgkvKiBQcm9jZXNzb3IgdHlwZSBmb3IgY2FjaGUgYWxpZ25tZW50LiAqLworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qIFRoZXNlIGlkZW50aWZ5IHRoZSBkcml2ZXIgYmFzZSB2ZXJzaW9uIGFuZCBtYXkgbm90IGJlIHJlbW92ZWQuICovCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CitLRVJOX0lORk8gRFJWX05BTUUgIi5jOnYiIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURSAiXG4iOworCisKKy8qIFRoaXMgZHJpdmVyIHdhcyB3cml0dGVuIHRvIHVzZSBQQ0kgbWVtb3J5IHNwYWNlLCBob3dldmVyIHNvbWUgeDg2IHN5c3RlbXMKKyAgIHdvcmsgb25seSB3aXRoIEkvTyBzcGFjZSBhY2Nlc3Nlcy4gKi8KKyNpZm5kZWYgX19hbHBoYV9fCisjZGVmaW5lIFVTRV9JT19PUFMKKyNlbmRpZgorCisvKiBLZXJuZWwgY29tcGF0aWJpbGl0eSBkZWZpbmVzLCBzb21lIGNvbW1vbiB0byBEYXZpZCBIaW5kcycgUENNQ0lBIHBhY2thZ2UuICovCisvKiBUaGlzIGlzIG9ubHkgaW4gdGhlIHN1cHBvcnQtYWxsLWtlcm5lbHMgc291cmNlIGNvZGUuICovCisKKyNkZWZpbmUgUlVOX0FUKHgpIChqaWZmaWVzICsgKHgpKQorCitNT0RVTEVfQVVUSE9SKCJNeXNvbiBvciB3aG9ldmVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk15c29uIE1URC04eHggMTAwLzEwTSBFdGhlcm5ldCBQQ0kgQWRhcHRlciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9wYXJhbShtYXhfaW50ZXJydXB0X3dvcmssIGludCwgMCk7CisvL01PRFVMRV9QQVJNKG1pbl9wY2lfbGF0ZW5jeSwgImkiKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyeF9jb3B5YnJlYWssIGludCwgMCk7Cittb2R1bGVfcGFyYW0obXVsdGljYXN0X2ZpbHRlcl9saW1pdCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShvcHRpb25zLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGZ1bGxfZHVwbGV4LCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfaW50ZXJydXB0X3dvcmssICJmZWFsbnggbWF4aW11bSBldmVudHMgaGFuZGxlZCBwZXIgaW50ZXJydXB0Iik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZmVhbG54IGVuYWJsZSBkZWJ1Z2dpbmcgKDAtMSkiKTsKK01PRFVMRV9QQVJNX0RFU0MocnhfY29weWJyZWFrLCAiZmVhbG54IGNvcHkgYnJlYWtwb2ludCBmb3IgY29weS1vbmx5LXRpbnktZnJhbWVzIik7CitNT0RVTEVfUEFSTV9ERVNDKG11bHRpY2FzdF9maWx0ZXJfbGltaXQsICJmZWFsbnggbWF4aW11bSBudW1iZXIgb2YgZmlsdGVyZWQgbXVsdGljYXN0IGFkZHJlc3NlcyIpOworTU9EVUxFX1BBUk1fREVTQyhvcHRpb25zLCAiZmVhbG54OiBCaXRzIDAtMzogbWVkaWEgdHlwZSwgYml0IDE3OiBmdWxsIGR1cGxleCIpOworTU9EVUxFX1BBUk1fREVTQyhmdWxsX2R1cGxleCwgImZlYWxueCBmdWxsIGR1cGxleCBzZXR0aW5nKHMpICgxKSIpOworCisjZGVmaW5lIE1JTl9SRUdJT05fU0laRSAxMzYKKworZW51bSBwY2lfZmxhZ3NfYml0IHsKKwlQQ0lfVVNFU19JTyA9IDEsCisJUENJX1VTRVNfTUVNID0gMiwKKwlQQ0lfVVNFU19NQVNURVIgPSA0LAorCVBDSV9BRERSMCA9IDB4MTAgPDwgMCwKKwlQQ0lfQUREUjEgPSAweDEwIDw8IDEsCisJUENJX0FERFIyID0gMHgxMCA8PCAyLAorCVBDSV9BRERSMyA9IDB4MTAgPDwgMywKK307CisKKy8qIEEgY2hpcCBjYXBhYmlsaXRpZXMgdGFibGUsIG1hdGNoaW5nIHRoZSBlbnRyaWVzIGluIHBjaV90YmxbXSBhYm92ZS4gKi8KK2VudW0gY2hpcF9jYXBhYmlsaXR5X2ZsYWdzIHsKKwlIQVNfTUlJX1hDVlIsCisJSEFTX0NISVBfWENWUiwKK307CisKKy8qIDg5LzYvMTMgYWRkLCAqLworLyogZm9yIGRpZmZlcmVudCBQSFkgKi8KK2VudW0gcGh5X3R5cGVfZmxhZ3MgeworCU15c29uUEhZID0gMSwKKwlBaGRvY1BIWSA9IDIsCisJU2VlcVBIWSA9IDMsCisJTWFydmVsbFBIWSA9IDQsCisJTXlzb245ODEgPSA1LAorCUxldmVsT25lUEhZID0gNiwKKwlPdGhlclBIWSA9IDEwLAorfTsKKworc3RydWN0IGNoaXBfaW5mbyB7CisJY2hhciAqY2hpcF9uYW1lOworCWludCBpb19zaXplOworCWludCBmbGFnczsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2hpcF9pbmZvIHNrZWxfbmV0ZHJ2X3RibFtdID0geworCXsiMTAwLzEwTSBFdGhlcm5ldCBQQ0kgQWRhcHRlciIsIDEzNiwgSEFTX01JSV9YQ1ZSfSwKKwl7IjEwMC8xME0gRXRoZXJuZXQgUENJIEFkYXB0ZXIiLCAxMzYsIEhBU19DSElQX1hDVlJ9LAorCXsiMTAwMC8xMDAvMTBNIEV0aGVybmV0IFBDSSBBZGFwdGVyIiwgMTM2LCBIQVNfTUlJX1hDVlJ9LAorfTsKKworLyogT2Zmc2V0cyB0byB0aGUgQ29tbWFuZCBhbmQgU3RhdHVzIFJlZ2lzdGVycy4gKi8KK2VudW0gZmVhbG54X29mZnNldHMgeworCVBBUjAgPSAweDAsCQkvKiBwaHlzaWNhbCBhZGRyZXNzIDAtMyAqLworCVBBUjEgPSAweDA0LAkJLyogcGh5c2ljYWwgYWRkcmVzcyA0LTUgKi8KKwlNQVIwID0gMHgwOCwJCS8qIG11bHRpY2FzdCBhZGRyZXNzIDAtMyAqLworCU1BUjEgPSAweDBDLAkJLyogbXVsdGljYXN0IGFkZHJlc3MgNC03ICovCisJRkFSMCA9IDB4MTAsCQkvKiBmbG93LWNvbnRyb2wgYWRkcmVzcyAwLTMgKi8KKwlGQVIxID0gMHgxNCwJCS8qIGZsb3ctY29udHJvbCBhZGRyZXNzIDQtNSAqLworCVRDUlJDUiA9IDB4MTgsCQkvKiByZWNlaXZlICYgdHJhbnNtaXQgY29uZmlndXJhdGlvbiAqLworCUJDUiA9IDB4MUMsCQkvKiBidXMgY29tbWFuZCAqLworCVRYUERSID0gMHgyMCwJCS8qIHRyYW5zbWl0IHBvbGxpbmcgZGVtYW5kICovCisJUlhQRFIgPSAweDI0LAkJLyogcmVjZWl2ZSBwb2xsaW5nIGRlbWFuZCAqLworCVJYQ1dQID0gMHgyOCwJCS8qIHJlY2VpdmUgY3VycmVudCB3b3JkIHBvaW50ZXIgKi8KKwlUWExCQSA9IDB4MkMsCQkvKiB0cmFuc21pdCBsaXN0IGJhc2UgYWRkcmVzcyAqLworCVJYTEJBID0gMHgzMCwJCS8qIHJlY2VpdmUgbGlzdCBiYXNlIGFkZHJlc3MgKi8KKwlJU1IgPSAweDM0LAkJLyogaW50ZXJydXB0IHN0YXR1cyAqLworCUlNUiA9IDB4MzgsCQkvKiBpbnRlcnJ1cHQgbWFzayAqLworCUZUSCA9IDB4M0MsCQkvKiBmbG93IGNvbnRyb2wgaGlnaC9sb3cgdGhyZXNob2xkICovCisJTUFOQUdFTUVOVCA9IDB4NDAsCS8qIGJvb3Ryb20vZWVwcm9tIGFuZCBtaWkgbWFuYWdlbWVudCAqLworCVRBTExZID0gMHg0NCwJCS8qIHRhbGx5IGNvdW50ZXJzIGZvciBjcmMgYW5kIG1wYSAqLworCVRTUiA9IDB4NDgsCQkvKiB0YWxseSBjb3VudGVyIGZvciB0cmFuc21pdCBzdGF0dXMgKi8KKwlCTUNSU1IgPSAweDRjLAkJLyogYmFzaWMgbW9kZSBjb250cm9sIGFuZCBzdGF0dXMgKi8KKwlQSFlJREVOVElGSUVSID0gMHg1MCwJLyogcGh5IGlkZW50aWZpZXIgKi8KKwlBTkFSQU5MUEFSID0gMHg1NCwJLyogYXV0by1uZWdvdGlhdGlvbiBhZHZlcnRpc2VtZW50IGFuZCBsaW5rCisJCQkJICAgcGFydG5lciBhYmlsaXR5ICovCisJQU5FUk9DUiA9IDB4NTgsCQkvKiBhdXRvLW5lZ290aWF0aW9uIGV4cGFuc2lvbiBhbmQgcGNpIGNvbmYuICovCisJQlBSRU1SUFNSID0gMHg1YywJLyogYnlwYXNzICYgcmVjZWl2ZSBlcnJvciBtYXNrIGFuZCBwaHkgc3RhdHVzICovCit9OworCisvKiBCaXRzIGluIHRoZSBpbnRlcnJ1cHQgc3RhdHVzL2VuYWJsZSByZWdpc3RlcnMuICovCisvKiBUaGUgYml0cyBpbiB0aGUgSW50ciBTdGF0dXMvRW5hYmxlIHJlZ2lzdGVycywgbW9zdGx5IGludGVycnVwdCBzb3VyY2VzLiAqLworZW51bSBpbnRyX3N0YXR1c19iaXRzIHsKKwlSRkNPTiA9IDB4MDAwMjAwMDAsCS8qIHJlY2VpdmUgZmxvdyBjb250cm9sIHhvbiBwYWNrZXQgKi8KKwlSRkNPRkYgPSAweDAwMDEwMDAwLAkvKiByZWNlaXZlIGZsb3cgY29udHJvbCB4b2ZmIHBhY2tldCAqLworCUxTQ1N0YXR1cyA9IDB4MDAwMDgwMDAsCS8qIGxpbmsgc3RhdHVzIGNoYW5nZSAqLworCUFOQ1N0YXR1cyA9IDB4MDAwMDQwMDAsCS8qIGF1dG9uZWdvdGlhdGlvbiBjb21wbGV0ZWQgKi8KKwlGQkUgPSAweDAwMDAyMDAwLAkvKiBmYXRhbCBidXMgZXJyb3IgKi8KKwlGQkVNYXNrID0gMHgwMDAwMTgwMCwJLyogbWFzayBiaXQxMi0xMSAqLworCVBhcml0eUVyciA9IDB4MDAwMDAwMDAsCS8qIHBhcml0eSBlcnJvciAqLworCVRhcmdldEVyciA9IDB4MDAwMDEwMDAsCS8qIHRhcmdldCBhYm9ydCAqLworCU1hc3RlckVyciA9IDB4MDAwMDA4MDAsCS8qIG1hc3RlciBlcnJvciAqLworCVRVTkYgPSAweDAwMDAwNDAwLAkvKiB0cmFuc21pdCB1bmRlcmZsb3cgKi8KKwlST1ZGID0gMHgwMDAwMDIwMCwJLyogcmVjZWl2ZSBvdmVyZmxvdyAqLworCUVUSSA9IDB4MDAwMDAxMDAsCS8qIHRyYW5zbWl0IGVhcmx5IGludCAqLworCUVSSSA9IDB4MDAwMDAwODAsCS8qIHJlY2VpdmUgZWFybHkgaW50ICovCisJQ05UT1ZGID0gMHgwMDAwMDA0MCwJLyogY291bnRlciBvdmVyZmxvdyAqLworCVJCVSA9IDB4MDAwMDAwMjAsCS8qIHJlY2VpdmUgYnVmZmVyIHVuYXZhaWxhYmxlICovCisJVEJVID0gMHgwMDAwMDAxMCwJLyogdHJhbnNtaXQgYnVmZmVyIHVuYXZpbGFibGUgKi8KKwlUSSA9IDB4MDAwMDAwMDgsCS8qIHRyYW5zbWl0IGludGVycnVwdCAqLworCVJJID0gMHgwMDAwMDAwNCwJLyogcmVjZWl2ZSBpbnRlcnJ1cHQgKi8KKwlSeEVyciA9IDB4MDAwMDAwMDIsCS8qIHJlY2VpdmUgZXJyb3IgKi8KK307CisKKy8qIEJpdHMgaW4gdGhlIE5ldHdvcmtDb25maWcgcmVnaXN0ZXIsIFcgZm9yIHdyaXRpbmcsIFIgZm9yIHJlYWRpbmcgKi8KKy8qIEZJWE1FOiBzb21lIG5hbWVzIGFyZSBpbnZlbnRlZCBieSBtZS4gTWFya2VkIHdpdGggKG5hbWU/KSAqLworLyogSWYgeW91IGhhdmUgZG9jcyBhbmQga25vdyBiaXQgbmFtZXMsIHBsZWFzZSBmaXggJ2VtICovCitlbnVtIHJ4X21vZGVfYml0cyB7CisJQ1JfV19FTkgJPSAweDAyMDAwMDAwLAkvKiBlbmhhbmNlZCBtb2RlIChuYW1lPykgKi8KKwlDUl9XX0ZECQk9IDB4MDAxMDAwMDAsCS8qIGZ1bGwgZHVwbGV4ICovCisJQ1JfV19QUzEwCT0gMHgwMDA4MDAwMCwJLyogMTAgbWJpdCAqLworCUNSX1dfVFhFTgk9IDB4MDAwNDAwMDAsCS8qIHR4IGVuYWJsZSAobmFtZT8pICovCisJQ1JfV19QUzEwMDAJPSAweDAwMDEwMDAwLAkvKiAxMDAwIG1iaXQgKi8KKyAgICAgLyogQ1JfV19SWEJVUlNUTUFTSz0gMHgwMDAwMGUwMCwgSW0gdW5zdXJlIGFib3V0IHRoaXMgKi8KKwlDUl9XX1JYTU9ERU1BU0sJPSAweDAwMDAwMGUwLAorCUNSX1dfUFJPTQk9IDB4MDAwMDAwODAsCS8qIHByb21pc2N1b3VzIG1vZGUgKi8KKwlDUl9XX0FCCQk9IDB4MDAwMDAwNDAsCS8qIGFjY2VwdCBicm9hZGNhc3QgKi8KKwlDUl9XX0FNCQk9IDB4MDAwMDAwMjAsCS8qIGFjY2VwdCBtdXRsaWNhc3QgKi8KKwlDUl9XX0FSUAk9IDB4MDAwMDAwMDgsCS8qIHJlY2VpdmUgcnVudCBwa3QgKi8KKwlDUl9XX0FMUAk9IDB4MDAwMDAwMDQsCS8qIHJlY2VpdmUgbG9uZyBwa3QgKi8KKwlDUl9XX1NFUAk9IDB4MDAwMDAwMDIsCS8qIHJlY2VpdmUgZXJyb3IgcGt0ICovCisJQ1JfV19SWEVOCT0gMHgwMDAwMDAwMSwJLyogcnggZW5hYmxlICh1bmljYXN0PykgKG5hbWU/KSAqLworCisJQ1JfUl9UWFNUT1AJPSAweDA0MDAwMDAwLAkvKiB0eCBzdG9wcGVkIChuYW1lPykgKi8KKwlDUl9SX0ZECQk9IDB4MDAxMDAwMDAsCS8qIGZ1bGwgZHVwbGV4IGRldGVjdGVkICovCisJQ1JfUl9QUzEwCT0gMHgwMDA4MDAwMCwJLyogMTAgbWJpdCBkZXRlY3RlZCAqLworCUNSX1JfUlhTVE9QCT0gMHgwMDAwODAwMCwJLyogcnggc3RvcHBlZCAobmFtZT8pICovCit9OworCisvKiBUaGUgVHVsaXAgUnggYW5kIFR4IGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KK3N0cnVjdCBmZWFsbnhfZGVzYyB7CisJczMyIHN0YXR1czsKKwlzMzIgY29udHJvbDsKKwl1MzIgYnVmZmVyOworCXUzMiBuZXh0X2Rlc2M7CisJc3RydWN0IGZlYWxueF9kZXNjICpuZXh0X2Rlc2NfbG9naWNhbDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tidWZmOworCXUzMiByZXNlcnZlZDE7CisJdTMyIHJlc2VydmVkMjsKK307CisKKy8qIEJpdHMgaW4gbmV0d29ya19kZXNjLnN0YXR1cyAqLworZW51bSByeF9kZXNjX3N0YXR1c19iaXRzIHsKKwlSWE9XTiA9IDB4ODAwMDAwMDAsCS8qIG93biBiaXQgKi8KKwlGTE5HTUFTSyA9IDB4MGZmZjAwMDAsCS8qIGZyYW1lIGxlbmd0aCAqLworCUZMTkdTaGlmdCA9IDE2LAorCU1BUlNUQVRVUyA9IDB4MDAwMDQwMDAsCS8qIG11bHRpY2FzdCBhZGRyZXNzIHJlY2VpdmVkICovCisJQkFSU1RBVFVTID0gMHgwMDAwMjAwMCwJLyogYnJvYWRjYXN0IGFkZHJlc3MgcmVjZWl2ZWQgKi8KKwlQSFlTVEFUVVMgPSAweDAwMDAxMDAwLAkvKiBwaHlzaWNhbCBhZGRyZXNzIHJlY2VpdmVkICovCisJUlhGU0QgPSAweDAwMDAwODAwLAkvKiBmaXJzdCBkZXNjcmlwdG9yICovCisJUlhMU0QgPSAweDAwMDAwNDAwLAkvKiBsYXN0IGRlc2NyaXB0b3IgKi8KKwlFcnJvclN1bW1hcnkgPSAweDgwLAkvKiBlcnJvciBzdW1tYXJ5ICovCisJUlVOVCA9IDB4NDAsCQkvKiBydW50IHBhY2tldCByZWNlaXZlZCAqLworCUxPTkcgPSAweDIwLAkJLyogbG9uZyBwYWNrZXQgcmVjZWl2ZWQgKi8KKwlGQUUgPSAweDEwLAkJLyogZnJhbWUgYWxpZ24gZXJyb3IgKi8KKwlDUkMgPSAweDA4LAkJLyogY3JjIGVycm9yICovCisJUlhFUiA9IDB4MDQsCQkvKiByZWNlaXZlIGVycm9yICovCit9OworCitlbnVtIHJ4X2Rlc2NfY29udHJvbF9iaXRzIHsKKwlSWElDID0gMHgwMDgwMDAwMCwJLyogaW50ZXJydXB0IGNvbnRyb2wgKi8KKwlSQlNTaGlmdCA9IDAsCit9OworCitlbnVtIHR4X2Rlc2Nfc3RhdHVzX2JpdHMgeworCVRYT1dOID0gMHg4MDAwMDAwMCwJLyogb3duIGJpdCAqLworCUpBQlRPID0gMHgwMDAwNDAwMCwJLyogamFiYmVyIHRpbWVvdXQgKi8KKwlDU0wgPSAweDAwMDAyMDAwLAkvKiBjYXJyaWVyIHNlbnNlIGxvc3QgKi8KKwlMQyA9IDB4MDAwMDEwMDAsCS8qIGxhdGUgY29sbGlzaW9uICovCisJRUMgPSAweDAwMDAwODAwLAkvKiBleGNlc3NpdmUgY29sbGlzaW9uICovCisJVURGID0gMHgwMDAwMDQwMCwJLyogZmlmbyB1bmRlcmZsb3cgKi8KKwlERlIgPSAweDAwMDAwMjAwLAkvKiBkZWZlcnJlZCAqLworCUhGID0gMHgwMDAwMDEwMCwJLyogaGVhcnRiZWF0IGZhaWwgKi8KKwlOQ1JNYXNrID0gMHgwMDAwMDBmZiwJLyogY29sbGlzaW9uIHJldHJ5IGNvdW50ICovCisJTkNSU2hpZnQgPSAwLAorfTsKKworZW51bSB0eF9kZXNjX2NvbnRyb2xfYml0cyB7CisJVFhJQyA9IDB4ODAwMDAwMDAsCS8qIGludGVycnVwdCBjb250cm9sICovCisJRVRJQ29udHJvbCA9IDB4NDAwMDAwMDAsCS8qIGVhcmx5IHRyYW5zbWl0IGludGVycnVwdCAqLworCVRYTEQgPSAweDIwMDAwMDAwLAkvKiBsYXN0IGRlc2NyaXB0b3IgKi8KKwlUWEZEID0gMHgxMDAwMDAwMCwJLyogZmlyc3QgZGVzY3JpcHRvciAqLworCUNSQ0VuYWJsZSA9IDB4MDgwMDAwMDAsCS8qIGNyYyBjb250cm9sICovCisJUEFERW5hYmxlID0gMHgwNDAwMDAwMCwJLyogcGFkZGluZyBjb250cm9sICovCisJUmV0cnlUeExDID0gMHgwMjAwMDAwMCwJLyogcmV0cnkgbGF0ZSBjb2xsaXNpb24gKi8KKwlQS1RTTWFzayA9IDB4M2ZmODAwLAkvKiBwYWNrZXQgc2l6ZSBiaXQyMS0xMSAqLworCVBLVFNTaGlmdCA9IDExLAorCVRCU01hc2sgPSAweDAwMDAwN2ZmLAkvKiB0cmFuc21pdCBidWZmZXIgYml0IDEwLTAgKi8KKwlUQlNTaGlmdCA9IDAsCit9OworCisvKiBCb290Uk9NL0VFUFJPTS9NSUkgTWFuYWdlbWVudCBSZWdpc3RlciAqLworI2RlZmluZSBNQVNLX01JSVJfTUlJX1JFQUQgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBNQVNLX01JSVJfTUlJX1dSSVRFICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBNQVNLX01JSVJfTUlJX01ETyAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBNQVNLX01JSVJfTUlJX01ESSAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBNQVNLX01JSVJfTUlJX01EQyAgICAgICAgMHgwMDAwMDAwMQorCisvKiBTVCtPUCtQSFlBRCtSRUdBRCtUQSAqLworI2RlZmluZSBPUF9SRUFEICAgICAgICAgICAgIDB4NjAwMAkvKiBTVDowMStPUDoxMCtQSFlBRCtSRUdBRCtUQTpaMCAqLworI2RlZmluZSBPUF9XUklURSAgICAgICAgICAgIDB4NTAwMgkvKiBTVDowMStPUDowMStQSFlBRCtSRUdBRCtUQToxMCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIENvbnN0YW50cyBmb3IgTXlzb24gUEhZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIE15c29uUEhZSUQgICAgICAweGQwMDAwMzAyCisvKiA4OS03LTI3IGFkZCwgKGJlZ2luKSAqLworI2RlZmluZSBNeXNvblBIWUlEMCAgICAgMHgwMzAyCisjZGVmaW5lIFN0YXR1c1JlZ2lzdGVyICAxOAorI2RlZmluZSBTUEVFRDEwMCAgICAgICAgMHgwNDAwCS8vIGJpdDEwCisjZGVmaW5lIEZVTExNT0RFICAgICAgICAweDA4MDAJLy8gYml0MTEKKy8qIDg5LTctMjcgYWRkLCAoZW5kKSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIENvbnN0YW50cyBmb3IgU2VlcSA4MDIyNSBQSFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFNlZXFQSFlJRDAgICAgICAweDAwMTYKKworI2RlZmluZSBNSUlSZWdpc3RlcjE4ICAgMTgKKyNkZWZpbmUgU1BEX0RFVF8xMDAgICAgIDB4ODAKKyNkZWZpbmUgRFBMWF9ERVRfRlVMTCAgIDB4NDAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogICAgICBDb25zdGFudHMgZm9yIEFoZG9jIDEwMSBQSFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBBaGRvY1BIWUlEMCAgICAgMHgwMDIyCisKKyNkZWZpbmUgRGlhZ25vc3RpY1JlZyAgIDE4CisjZGVmaW5lIERQTFhfRlVMTCAgICAgICAweDA4MDAKKyNkZWZpbmUgU3BlZWRfMTAwICAgICAgIDB4MDQwMAorCisvKiA4OS82LzEzIGFkZCwgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAgICAgIENvbnN0YW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgTWFydmVsbFBIWUlEMCAgICAgICAgICAgMHgwMTQxCisjZGVmaW5lIExldmVsT25lUEhZSUQwCQkweDAwMTMKKworI2RlZmluZSBNSUkxMDAwQmFzZVRDb250cm9sUmVnICA5CisjZGVmaW5lIE1JSTEwMDBCYXNlVFN0YXR1c1JlZyAgIDEwCisjZGVmaW5lIFNwZWNpZmljUmVnCQkxNworCisvKiBmb3IgMTAwMEJhc2VUIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZQWJsZXRvUGVyZm9ybTEwMDBGdWxsRHVwbGV4ICAweDAyMDAKKyNkZWZpbmUgUEhZQWJsZXRvUGVyZm9ybTEwMDBIYWxmRHVwbGV4ICAweDAxMDAKKyNkZWZpbmUgUEhZMTAwMEFiaWxpdHlNYXNrICAgICAgICAgICAgICAweDMwMAorCisvLyBmb3IgcGh5IHNwZWNpZmljIHN0YXR1cyByZWdpc3RlciwgbWFydmVsbCBwaHkuCisjZGVmaW5lIFNwZWVkTWFzayAgICAgICAweDBjMDAwCisjZGVmaW5lIFNwZWVkXzEwMDBNICAgICAweDA4MDAwCisjZGVmaW5lIFNwZWVkXzEwME0gICAgICAweDQwMDAKKyNkZWZpbmUgU3BlZWRfMTBNICAgICAgIDAKKyNkZWZpbmUgRnVsbF9EdXBsZXggICAgIDB4MjAwMAorCisvLyA4OS8xMi8yOSBhZGQsIGZvciBwaHkgc3BlY2lmaWMgc3RhdHVzIHJlZ2lzdGVyLCBsZXZlbG9uZSBwaHksIChiZWdpbikKKyNkZWZpbmUgTFhUMTAwMF8xMDBNICAgIDB4MDgwMDAKKyNkZWZpbmUgTFhUMTAwMF8xMDAwTSAgIDB4MGMwMDAKKyNkZWZpbmUgTFhUMTAwMF9GdWxsICAgIDB4MjAwCisvLyA4OS8xMi8yOSBhZGQsIGZvciBwaHkgc3BlY2lmaWMgc3RhdHVzIHJlZ2lzdGVyLCBsZXZlbG9uZSBwaHksIChlbmQpCisKKy8qIGZvciAzLWluLTEgY2FzZSwgQk1DUlNSIHJlZ2lzdGVyICovCisjZGVmaW5lIExpbmtJc1VwMgkweDAwMDQwMDAwCisKKy8qIGZvciBQSFkgKi8KKyNkZWZpbmUgTGlua0lzVXAgICAgICAgIDB4MDAwNAorCisKK3N0cnVjdCBuZXRkZXZfcHJpdmF0ZSB7CisJLyogRGVzY3JpcHRvciByaW5ncyBmaXJzdCBmb3IgYWxpZ25tZW50LiAqLworCXN0cnVjdCBmZWFsbnhfZGVzYyAqcnhfcmluZzsKKwlzdHJ1Y3QgZmVhbG54X2Rlc2MgKnR4X3Jpbmc7CisKKwlkbWFfYWRkcl90IHJ4X3JpbmdfZG1hOworCWRtYV9hZGRyX3QgdHhfcmluZ19kbWE7CisKKwlzcGlubG9ja190IGxvY2s7CisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKworCS8qIE1lZGlhIG1vbml0b3JpbmcgdGltZXIuICovCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisKKwkvKiBSZXNldCB0aW1lciAqLworCXN0cnVjdCB0aW1lcl9saXN0IHJlc2V0X3RpbWVyOworCWludCByZXNldF90aW1lcl9hcm1lZDsKKwl1bnNpZ25lZCBsb25nIGNydmFsdWVfc3Y7CisJdW5zaWduZWQgbG9uZyBpbXJ2YWx1ZV9zdjsKKworCS8qIEZyZXF1ZW50bHkgdXNlZCB2YWx1ZXM6IGtlZXAgc29tZSBhZGphY2VudCBmb3IgY2FjaGUgZWZmZWN0LiAqLworCWludCBmbGFnczsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKwl1bnNpZ25lZCBsb25nIGNydmFsdWU7CisJdW5zaWduZWQgbG9uZyBiY3J2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGltcnZhbHVlOworCXN0cnVjdCBmZWFsbnhfZGVzYyAqY3VyX3J4OworCXN0cnVjdCBmZWFsbnhfZGVzYyAqbGFja19yeGJ1ZjsKKwlpbnQgcmVhbGx5X3J4X2NvdW50OworCXN0cnVjdCBmZWFsbnhfZGVzYyAqY3VyX3R4OworCXN0cnVjdCBmZWFsbnhfZGVzYyAqY3VyX3R4X2NvcHk7CisJaW50IHJlYWxseV90eF9jb3VudDsKKwlpbnQgZnJlZV90eF9jb3VudDsKKwl1bnNpZ25lZCBpbnQgcnhfYnVmX3N6OwkvKiBCYXNlZCBvbiBNVFUrc2xhY2suICovCisKKwkvKiBUaGVzZSB2YWx1ZXMgYXJlIGtlZXAgdHJhY2sgb2YgdGhlIHRyYW5zY2VpdmVyL21lZGlhIGluIHVzZS4gKi8KKwl1bnNpZ25lZCBpbnQgbGlua29rOworCXVuc2lnbmVkIGludCBsaW5lX3NwZWVkOworCXVuc2lnbmVkIGludCBkdXBsZXhtb2RlOworCXVuc2lnbmVkIGludCBkZWZhdWx0X3BvcnQ6NDsJLyogTGFzdCBkZXYtPmlmX3BvcnQgdmFsdWUuICovCisJdW5zaWduZWQgaW50IFBIWVR5cGU7CisKKwkvKiBNSUkgdHJhbnNjZWl2ZXIgc2VjdGlvbi4gKi8KKwlpbnQgbWlpX2NudDsJCS8qIE1JSSBkZXZpY2UgYWRkcmVzc2VzLiAqLworCXVuc2lnbmVkIGNoYXIgcGh5c1syXTsJLyogTUlJIGRldmljZSBhZGRyZXNzZXMuICovCisJc3RydWN0IG1paV9pZl9pbmZvIG1paTsKKwl2b2lkIF9faW9tZW0gKm1lbTsKK307CisKKworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpOworc3RhdGljIGludCBuZXRkZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGdldGxpbmt0eXBlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZ2V0bGlua3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG5ldGRldl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgcmVzZXRfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHR4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBpbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHN0YXJ0X3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGludHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgbmV0ZGV2X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBfX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpnZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG1paV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOworc3RhdGljIGludCBuZXRkZXZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCByZXNldF9yeF9kZXNjcmlwdG9ycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJlc2V0X3R4X2Rlc2NyaXB0b3JzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZCBzdG9wX25pY19yeCh2b2lkIF9faW9tZW0gKmlvYWRkciwgbG9uZyBjcnZhbHVlKQoreworCWludCBkZWxheSA9IDB4MTAwMDsKKwlpb3dyaXRlMzIoY3J2YWx1ZSAmIH4oQ1JfV19SWEVOKSwgaW9hZGRyICsgVENSUkNSKTsKKwl3aGlsZSAoLS1kZWxheSkgeworCQlpZiAoIChpb3JlYWQzMihpb2FkZHIgKyBUQ1JSQ1IpICYgQ1JfUl9SWFNUT1ApID09IENSX1JfUlhTVE9QKQorCQkJYnJlYWs7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHN0b3BfbmljX3J4dHgodm9pZCBfX2lvbWVtICppb2FkZHIsIGxvbmcgY3J2YWx1ZSkKK3sKKwlpbnQgZGVsYXkgPSAweDEwMDA7CisJaW93cml0ZTMyKGNydmFsdWUgJiB+KENSX1dfUlhFTitDUl9XX1RYRU4pLCBpb2FkZHIgKyBUQ1JSQ1IpOworCXdoaWxlICgtLWRlbGF5KSB7CisJCWlmICggKGlvcmVhZDMyKGlvYWRkciArIFRDUlJDUikgJiAoQ1JfUl9SWFNUT1ArQ1JfUl9UWFNUT1ApKQorCQkJCQkgICAgPT0gKENSX1JfUlhTVE9QK0NSX1JfVFhTVE9QKSApCisJCQlicmVhazsKKwl9Cit9CisKKworc3RhdGljIGludCBfX2RldmluaXQgZmVhbG54X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wOworCWludCBpLCBvcHRpb24sIGVyciwgaXJxOworCXN0YXRpYyBpbnQgY2FyZF9pZHggPSAtMTsKKwljaGFyIGJvYXJkbmFtZVsxMl07CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJdW5zaWduZWQgbG9uZyBsZW47CisJdW5zaWduZWQgaW50IGNoaXBfaWQgPSBlbnQtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdm9pZCAqcmluZ19zcGFjZTsKKwlkbWFfYWRkcl90IHJpbmdfZG1hOworI2lmZGVmIFVTRV9JT19PUFMKKwlpbnQgYmFyID0gMDsKKyNlbHNlCisJaW50IGJhciA9IDE7CisjZW5kaWYKKwkKKy8qIHdoZW4gYnVpbHQgaW50byB0aGUga2VybmVsLCB3ZSBvbmx5IHByaW50IHZlcnNpb24gaWYgZGV2aWNlIGlzIGZvdW5kICovCisjaWZuZGVmIE1PRFVMRQorCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorCQorCWNhcmRfaWR4Kys7CisJc3ByaW50Zihib2FyZG5hbWUsICJmZWFsbnglZCIsIGNhcmRfaWR4KTsKKwkKKwlvcHRpb24gPSBjYXJkX2lkeCA8IE1BWF9VTklUUyA/IG9wdGlvbnNbY2FyZF9pZHhdIDogMDsKKworCWkgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoaSkgcmV0dXJuIGk7CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisJCisJbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCBiYXIpOworCWlmIChsZW4gPCBNSU5fUkVHSU9OX1NJWkUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVnaW9uIHNpemUgJWxkIHRvbyBzbWFsbCwgYWJvcnRpbmdcbiIsCisJCSAgICAgICBib2FyZG5hbWUsIGxlbik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWkgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIGJvYXJkbmFtZSk7CisJaWYgKGkpIHJldHVybiBpOworCQorCWlycSA9IHBkZXYtPmlycTsKKworCWlvYWRkciA9IHBjaV9pb21hcChwZGV2LCBiYXIsIGxlbik7CisJaWYgKCFpb2FkZHIpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X3JlczsKKwl9CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldGRldl9wcml2YXRlKSk7CisJaWYgKCFkZXYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X3VubWFwOworCX0KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCS8qIHJlYWQgZXRoZXJuZXQgaWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgKytpKQorCQlkZXYtPmRldl9hZGRyW2ldID0gaW9yZWFkOChpb2FkZHIgKyBQQVIwICsgaSk7CisKKwkvKiBSZXNldCB0aGUgY2hpcCB0byBlcmFzZSBwcmV2aW91cyBtaXNjb25maWd1cmF0aW9uLiAqLworCWlvd3JpdGUzMigweDAwMDAwMDAxLCBpb2FkZHIgKyBCQ1IpOworCisJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZylpb2FkZHI7CisJZGV2LT5pcnEgPSBpcnE7CisKKwkvKiBNYWtlIGNlcnRhaW4gdGhlIGRlc2NyaXB0b3IgbGlzdHMgYXJlIGFsaWduZWQuICovCisJbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCW5wLT5tZW0gPSBpb2FkZHI7CisJc3Bpbl9sb2NrX2luaXQoJm5wLT5sb2NrKTsKKwlucC0+cGNpX2RldiA9IHBkZXY7CisJbnAtPmZsYWdzID0gc2tlbF9uZXRkcnZfdGJsW2NoaXBfaWRdLmZsYWdzOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCW5wLT5taWkuZGV2ID0gZGV2OworCW5wLT5taWkubWRpb19yZWFkID0gbWRpb19yZWFkOworCW5wLT5taWkubWRpb193cml0ZSA9IG1kaW9fd3JpdGU7CisJbnAtPm1paS5waHlfaWRfbWFzayA9IDB4MWY7CisJbnAtPm1paS5yZWdfbnVtX21hc2sgPSAweDFmOworCisJcmluZ19zcGFjZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFJYX1RPVEFMX1NJWkUsICZyaW5nX2RtYSk7CisJaWYgKCFyaW5nX3NwYWNlKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9mcmVlX2RldjsKKwl9CisJbnAtPnJ4X3JpbmcgPSAoc3RydWN0IGZlYWxueF9kZXNjICopcmluZ19zcGFjZTsKKwlucC0+cnhfcmluZ19kbWEgPSByaW5nX2RtYTsKKworCXJpbmdfc3BhY2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBUWF9UT1RBTF9TSVpFLCAmcmluZ19kbWEpOworCWlmICghcmluZ19zcGFjZSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfZnJlZV9yeDsKKwl9CisJbnAtPnR4X3JpbmcgPSAoc3RydWN0IGZlYWxueF9kZXNjICopcmluZ19zcGFjZTsKKwlucC0+dHhfcmluZ19kbWEgPSByaW5nX2RtYTsKKworCS8qIGZpbmQgdGhlIGNvbm5lY3RlZCBNSUkgeGN2cnMgKi8KKwlpZiAobnAtPmZsYWdzID09IEhBU19NSUlfWENWUikgeworCQlpbnQgcGh5LCBwaHlfaWR4ID0gMDsKKworCQlmb3IgKHBoeSA9IDE7IHBoeSA8IDMyICYmIHBoeV9pZHggPCA0OyBwaHkrKykgeworCQkJaW50IG1paV9zdGF0dXMgPSBtZGlvX3JlYWQoZGV2LCBwaHksIDEpOworCisJCQlpZiAobWlpX3N0YXR1cyAhPSAweGZmZmYgJiYgbWlpX3N0YXR1cyAhPSAweDAwMDApIHsKKwkJCQlucC0+cGh5c1twaHlfaWR4KytdID0gcGh5OworCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkgICAgICAgIiVzOiBNSUkgUEhZIGZvdW5kIGF0IGFkZHJlc3MgJWQsIHN0YXR1cyAiCisJCQkJICAgICAgICIweCU0LjR4LlxuIiwgZGV2LT5uYW1lLCBwaHksIG1paV9zdGF0dXMpOworCQkJCS8qIGdldCBwaHkgdHlwZSAqLworCQkJCXsKKwkJCQkJdW5zaWduZWQgaW50IGRhdGE7CisKKwkJCQkJZGF0YSA9IG1kaW9fcmVhZChkZXYsIG5wLT5waHlzWzBdLCAyKTsKKwkJCQkJaWYgKGRhdGEgPT0gU2VlcVBIWUlEMCkKKwkJCQkJCW5wLT5QSFlUeXBlID0gU2VlcVBIWTsKKwkJCQkJZWxzZSBpZiAoZGF0YSA9PSBBaGRvY1BIWUlEMCkKKwkJCQkJCW5wLT5QSFlUeXBlID0gQWhkb2NQSFk7CisJCQkJCWVsc2UgaWYgKGRhdGEgPT0gTWFydmVsbFBIWUlEMCkKKwkJCQkJCW5wLT5QSFlUeXBlID0gTWFydmVsbFBIWTsKKwkJCQkJZWxzZSBpZiAoZGF0YSA9PSBNeXNvblBIWUlEMCkKKwkJCQkJCW5wLT5QSFlUeXBlID0gTXlzb245ODE7CisJCQkJCWVsc2UgaWYgKGRhdGEgPT0gTGV2ZWxPbmVQSFlJRDApCisJCQkJCQlucC0+UEhZVHlwZSA9IExldmVsT25lUEhZOworCQkJCQllbHNlCisJCQkJCQlucC0+UEhZVHlwZSA9IE90aGVyUEhZOworCQkJCX0KKwkJCX0KKwkJfQorCisJCW5wLT5taWlfY250ID0gcGh5X2lkeDsKKwkJaWYgKHBoeV9pZHggPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1JSSBQSFkgbm90IGZvdW5kIC0tIHRoaXMgZGV2aWNlIG1heSAiCisJCQkgICAgICAgIm5vdCBvcGVyYXRlIGNvcnJlY3RseS5cbiIsIGRldi0+bmFtZSk7CisJCX0KKwl9IGVsc2UgeworCQlucC0+cGh5c1swXSA9IDMyOworLyogODkvNi8yMyBhZGQsIChiZWdpbikgKi8KKwkJLyogZ2V0IHBoeSB0eXBlICovCisJCWlmIChpb3JlYWQzMihpb2FkZHIgKyBQSFlJREVOVElGSUVSKSA9PSBNeXNvblBIWUlEKQorCQkJbnAtPlBIWVR5cGUgPSBNeXNvblBIWTsKKwkJZWxzZQorCQkJbnAtPlBIWVR5cGUgPSBPdGhlclBIWTsKKwl9CisJbnAtPm1paS5waHlfaWQgPSBucC0+cGh5c1swXTsKKworCWlmIChkZXYtPm1lbV9zdGFydCkKKwkJb3B0aW9uID0gZGV2LT5tZW1fc3RhcnQ7CisKKwkvKiBUaGUgbG93ZXIgZm91ciBiaXRzIGFyZSB0aGUgbWVkaWEgdHlwZS4gKi8KKwlpZiAob3B0aW9uID4gMCkgeworCQlpZiAob3B0aW9uICYgMHgyMDApCisJCQlucC0+bWlpLmZ1bGxfZHVwbGV4ID0gMTsKKwkJbnAtPmRlZmF1bHRfcG9ydCA9IG9wdGlvbiAmIDE1OworCX0KKworCWlmIChjYXJkX2lkeCA8IE1BWF9VTklUUyAmJiBmdWxsX2R1cGxleFtjYXJkX2lkeF0gPiAwKQorCQlucC0+bWlpLmZ1bGxfZHVwbGV4ID0gZnVsbF9kdXBsZXhbY2FyZF9pZHhdOworCisJaWYgKG5wLT5taWkuZnVsbF9kdXBsZXgpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1lZGlhIHR5cGUgZm9yY2VkIHRvIEZ1bGwgRHVwbGV4LlxuIiwgZGV2LT5uYW1lKTsKKy8qIDg5LzYvMTMgYWRkLCAoYmVnaW4pICovCisvLyAgICAgIGlmIChucC0+UEhZVHlwZT09TWFydmVsbFBIWSkKKwkJaWYgKChucC0+UEhZVHlwZSA9PSBNYXJ2ZWxsUEhZKSB8fCAobnAtPlBIWVR5cGUgPT0gTGV2ZWxPbmVQSFkpKSB7CisJCQl1bnNpZ25lZCBpbnQgZGF0YTsKKworCQkJZGF0YSA9IG1kaW9fcmVhZChkZXYsIG5wLT5waHlzWzBdLCA5KTsKKwkJCWRhdGEgPSAoZGF0YSAmIDB4ZmNmZikgfCAweDAyMDA7CisJCQltZGlvX3dyaXRlKGRldiwgbnAtPnBoeXNbMF0sIDksIGRhdGEpOworCQl9CisvKiA4OS82LzEzIGFkZCwgKGVuZCkgKi8KKwkJaWYgKG5wLT5mbGFncyA9PSBIQVNfTUlJX1hDVlIpCisJCQltZGlvX3dyaXRlKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9BRFZFUlRJU0UsIEFEVkVSVElTRV9GVUxMKTsKKwkJZWxzZQorCQkJaW93cml0ZTMyKEFEVkVSVElTRV9GVUxMLCBpb2FkZHIgKyBBTkFSQU5MUEFSKTsKKwkJbnAtPm1paS5mb3JjZV9tZWRpYSA9IDE7CisJfQorCisJLyogVGhlIGNoaXAtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSAmbmV0ZGV2X29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmc3RhcnRfdHg7CisJZGV2LT5zdG9wID0gJm5ldGRldl9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9ICZnZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGU7CisJZGV2LT5kb19pb2N0bCA9ICZtaWlfaW9jdGw7CisJZGV2LT5ldGh0b29sX29wcyA9ICZuZXRkZXZfZXRodG9vbF9vcHM7CisJZGV2LT50eF90aW1lb3V0ID0gJnR4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisJCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X2ZyZWVfdHg7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgYXQgJXAsICIsCisJICAgICAgIGRldi0+bmFtZSwgc2tlbF9uZXRkcnZfdGJsW2NoaXBfaWRdLmNoaXBfbmFtZSwgaW9hZGRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlwcmludGsoIiUyLjJ4OiIsIGRldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiJTIuMngsIElSUSAlZC5cbiIsIGRldi0+ZGV2X2FkZHJbaV0sIGlycSk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9mcmVlX3R4OgorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgbnAtPnR4X3JpbmcsIG5wLT50eF9yaW5nX2RtYSk7CitlcnJfb3V0X2ZyZWVfcng6CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCBucC0+cnhfcmluZywgbnAtPnJ4X3JpbmdfZG1hKTsKK2Vycl9vdXRfZnJlZV9kZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKK2Vycl9vdXRfdW5tYXA6CisJcGNpX2lvdW5tYXAocGRldiwgaW9hZGRyKTsKK2Vycl9vdXRfcmVzOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZmVhbG54X3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChkZXYpIHsKKwkJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBUWF9UT1RBTF9TSVpFLCBucC0+dHhfcmluZywKKwkJCW5wLT50eF9yaW5nX2RtYSk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgbnAtPnJ4X3JpbmcsCisJCQlucC0+cnhfcmluZ19kbWEpOworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlwY2lfaW91bm1hcChwZGV2LCBucC0+bWVtKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9FUlIgImZlYWxueDogcmVtb3ZlIGZvciB1bmtub3duIGRldmljZVxuIik7Cit9CisKKworc3RhdGljIHVsb25nIG04MHhfc2VuZF9jbWRfdG9fcGh5KHZvaWQgX19pb21lbSAqbWlpcG9ydCwgaW50IG9wY29kZSwgaW50IHBoeWFkLCBpbnQgcmVnYWQpCit7CisJdWxvbmcgbWlpcjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgbWFzaywgZGF0YTsKKworCS8qIGVuYWJsZSBNSUkgb3V0cHV0ICovCisJbWlpciA9ICh1bG9uZykgaW9yZWFkMzIobWlpcG9ydCk7CisJbWlpciAmPSAweGZmZmZmZmYwOworCisJbWlpciB8PSBNQVNLX01JSVJfTUlJX1dSSVRFICsgTUFTS19NSUlSX01JSV9NRE87CisKKwkvKiBzZW5kIDMyIDEncyBwcmVhbWJsZSAqLworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCS8qIGxvdyBNREM7IE1ETyBpcyBhbHJlYWR5IGhpZ2ggKG1paXIpICovCisJCW1paXIgJj0gfk1BU0tfTUlJUl9NSUlfTURDOworCQlpb3dyaXRlMzIobWlpciwgbWlpcG9ydCk7CisKKwkJLyogaGlnaCBNREMgKi8KKwkJbWlpciB8PSBNQVNLX01JSVJfTUlJX01EQzsKKwkJaW93cml0ZTMyKG1paXIsIG1paXBvcnQpOworCX0KKworCS8qIGNhbGN1bGF0ZSBTVCtPUCtQSFlBRCtSRUdBRCtUQSAqLworCWRhdGEgPSBvcGNvZGUgfCAocGh5YWQgPDwgNykgfCAocmVnYWQgPDwgMik7CisKKwkvKiBzZW50IG91dCAqLworCW1hc2sgPSAweDgwMDA7CisJd2hpbGUgKG1hc2spIHsKKwkJLyogbG93IE1EQywgcHJlcGFyZSBNRE8gKi8KKwkJbWlpciAmPSB+KE1BU0tfTUlJUl9NSUlfTURDICsgTUFTS19NSUlSX01JSV9NRE8pOworCQlpZiAobWFzayAmIGRhdGEpCisJCQltaWlyIHw9IE1BU0tfTUlJUl9NSUlfTURPOworCisJCWlvd3JpdGUzMihtaWlyLCBtaWlwb3J0KTsKKwkJLyogaGlnaCBNREMgKi8KKwkJbWlpciB8PSBNQVNLX01JSVJfTUlJX01EQzsKKwkJaW93cml0ZTMyKG1paXIsIG1paXBvcnQpOworCQl1ZGVsYXkoMzApOworCisJCS8qIG5leHQgKi8KKwkJbWFzayA+Pj0gMTsKKwkJaWYgKG1hc2sgPT0gMHgyICYmIG9wY29kZSA9PSBPUF9SRUFEKQorCQkJbWlpciAmPSB+TUFTS19NSUlSX01JSV9XUklURTsKKwl9CisJcmV0dXJuIG1paXI7Cit9CisKKworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeWFkLCBpbnQgcmVnYWQpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICptaWlwb3J0ID0gbnAtPm1lbSArIE1BTkFHRU1FTlQ7CisJdWxvbmcgbWlpcjsKKwl1bnNpZ25lZCBpbnQgbWFzaywgZGF0YTsKKworCW1paXIgPSBtODB4X3NlbmRfY21kX3RvX3BoeShtaWlwb3J0LCBPUF9SRUFELCBwaHlhZCwgcmVnYWQpOworCisJLyogcmVhZCBkYXRhICovCisJbWFzayA9IDB4ODAwMDsKKwlkYXRhID0gMDsKKwl3aGlsZSAobWFzaykgeworCQkvKiBsb3cgTURDICovCisJCW1paXIgJj0gfk1BU0tfTUlJUl9NSUlfTURDOworCQlpb3dyaXRlMzIobWlpciwgbWlpcG9ydCk7CisKKwkJLyogcmVhZCBNREkgKi8KKwkJbWlpciA9IGlvcmVhZDMyKG1paXBvcnQpOworCQlpZiAobWlpciAmIE1BU0tfTUlJUl9NSUlfTURJKQorCQkJZGF0YSB8PSBtYXNrOworCisJCS8qIGhpZ2ggTURDLCBhbmQgd2FpdCAqLworCQltaWlyIHw9IE1BU0tfTUlJUl9NSUlfTURDOworCQlpb3dyaXRlMzIobWlpciwgbWlpcG9ydCk7CisJCXVkZWxheSgzMCk7CisKKwkJLyogbmV4dCAqLworCQltYXNrID4+PSAxOworCX0KKworCS8qIGxvdyBNREMgKi8KKwltaWlyICY9IH5NQVNLX01JSVJfTUlJX01EQzsKKwlpb3dyaXRlMzIobWlpciwgbWlpcG9ydCk7CisKKwlyZXR1cm4gZGF0YSAmIDB4ZmZmZjsKK30KKworCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlhZCwgaW50IHJlZ2FkLCBpbnQgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKm1paXBvcnQgPSBucC0+bWVtICsgTUFOQUdFTUVOVDsKKwl1bG9uZyBtaWlyOworCXVuc2lnbmVkIGludCBtYXNrOworCisJbWlpciA9IG04MHhfc2VuZF9jbWRfdG9fcGh5KG1paXBvcnQsIE9QX1dSSVRFLCBwaHlhZCwgcmVnYWQpOworCisJLyogd3JpdGUgZGF0YSAqLworCW1hc2sgPSAweDgwMDA7CisJd2hpbGUgKG1hc2spIHsKKwkJLyogbG93IE1EQywgcHJlcGFyZSBNRE8gKi8KKwkJbWlpciAmPSB+KE1BU0tfTUlJUl9NSUlfTURDICsgTUFTS19NSUlSX01JSV9NRE8pOworCQlpZiAobWFzayAmIGRhdGEpCisJCQltaWlyIHw9IE1BU0tfTUlJUl9NSUlfTURPOworCQlpb3dyaXRlMzIobWlpciwgbWlpcG9ydCk7CisKKwkJLyogaGlnaCBNREMgKi8KKwkJbWlpciB8PSBNQVNLX01JSVJfTUlJX01EQzsKKwkJaW93cml0ZTMyKG1paXIsIG1paXBvcnQpOworCisJCS8qIG5leHQgKi8KKwkJbWFzayA+Pj0gMTsKKwl9CisKKwkvKiBsb3cgTURDICovCisJbWlpciAmPSB+TUFTS19NSUlSX01JSV9NREM7CisJaW93cml0ZTMyKG1paXIsIG1paXBvcnQpOworfQorCisKK3N0YXRpYyBpbnQgbmV0ZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5tZW07CisJaW50IGk7CisKKwlpb3dyaXRlMzIoMHgwMDAwMDAwMSwgaW9hZGRyICsgQkNSKTsJLyogUmVzZXQgKi8KKworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgJmludHJfaGFuZGxlciwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQlpb3dyaXRlMTYoKCh1bnNpZ25lZCBzaG9ydCopZGV2LT5kZXZfYWRkcilbaV0sCisJCQkJaW9hZGRyICsgUEFSMCArIGkqMik7CisKKwlpbml0X3JpbmcoZGV2KTsKKworCWlvd3JpdGUzMihucC0+cnhfcmluZ19kbWEsIGlvYWRkciArIFJYTEJBKTsKKwlpb3dyaXRlMzIobnAtPnR4X3JpbmdfZG1hLCBpb2FkZHIgKyBUWExCQSk7CisKKwkvKiBJbml0aWFsaXplIG90aGVyIHJlZ2lzdGVycy4gKi8KKwkvKiBDb25maWd1cmUgdGhlIFBDSSBidXMgYnVyc3RzIGFuZCBGSUZPIHRocmVzaG9sZHMuCisJICAgNDg2OiBTZXQgOCBsb25nd29yZCBidXJzdC4KKwkgICA1ODY6IG5vIGJ1cnN0IGxpbWl0LgorCSAgIEJ1cnN0IGxlbmd0aCA1OjMKKwkgICAwIDAgMCAgIDEKKwkgICAwIDAgMSAgIDQKKwkgICAwIDEgMCAgIDgKKwkgICAwIDEgMSAgIDE2CisJICAgMSAwIDAgICAzMgorCSAgIDEgMCAxICAgNjQKKwkgICAxIDEgMCAgIDEyOAorCSAgIDEgMSAxICAgMjU2CisJICAgV2FpdCB0aGUgc3BlY2lmaWVkIDUwIFBDSSBjeWNsZXMgYWZ0ZXIgYSByZXNldCBieSBpbml0aWFsaXppbmcKKwkgICBUeCBhbmQgUnggcXVldWVzIGFuZCB0aGUgYWRkcmVzcyBmaWx0ZXIgbGlzdC4KKwkgICBGSVhNRSAoVWVpbW9yKTogb3B0aW1pc3RpYyBmb3IgYWxwaGEgKyBwb3N0ZWQgd3JpdGVzID8gKi8KKyNpZiBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9fc3BhcmNfXykKKy8vIDg5LzkvMSBtb2RpZnksIAorLy8gICBucC0+YmNydmFsdWU9MHgwNCB8IDB4MHgzODsgIC8qIGJpZy1lbmRpYW4sIDI1NiBidXJzdCBsZW5ndGggKi8KKwlucC0+YmNydmFsdWUgPSAweDA0IHwgMHgxMDsJLyogYmlnLWVuZGlhbiwgdHggOCBidXJzdCBsZW5ndGggKi8KKwlucC0+Y3J2YWx1ZSA9IDB4ZTAwOwkvKiByeCAxMjggYnVyc3QgbGVuZ3RoICovCisjZWxpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorLy8gODkvOS8xIG1vZGlmeSwgCisvLyAgIG5wLT5iY3J2YWx1ZT0weDM4OyAgICAgICAgICAgLyogbGl0dGxlLWVuZGlhbiwgMjU2IGJ1cnN0IGxlbmd0aCAqLworCW5wLT5iY3J2YWx1ZSA9IDB4MTA7CS8qIGxpdHRsZS1lbmRpYW4sIDggYnVyc3QgbGVuZ3RoICovCisJbnAtPmNydmFsdWUgPSAweGUwMDsJLyogcnggMTI4IGJ1cnN0IGxlbmd0aCAqLworI2VsaWYgZGVmaW5lZChfX2kzODZfXykKKyNpZiBkZWZpbmVkKE1PRFVMRSkKKy8vIDg5LzkvMSBtb2RpZnksIAorLy8gICBucC0+YmNydmFsdWU9MHgzODsgICAgICAgICAgIC8qIGxpdHRsZS1lbmRpYW4sIDI1NiBidXJzdCBsZW5ndGggKi8KKwlucC0+YmNydmFsdWUgPSAweDEwOwkvKiBsaXR0bGUtZW5kaWFuLCA4IGJ1cnN0IGxlbmd0aCAqLworCW5wLT5jcnZhbHVlID0gMHhlMDA7CS8qIHJ4IDEyOCBidXJzdCBsZW5ndGggKi8KKyNlbHNlCisJLyogV2hlbiBub3QgYSBtb2R1bGUgd2UgY2FuIHdvcmsgYXJvdW5kIGJyb2tlbiAnNDg2IFBDSSBib2FyZHMuICovCisjZGVmaW5lIHg4NiBib290X2NwdV9kYXRhLng4NgorLy8gODkvOS8xIG1vZGlmeSwgCisvLyAgIG5wLT5iY3J2YWx1ZT0oeDg2IDw9IDQgPyAweDEwIDogMHgzOCk7CisJbnAtPmJjcnZhbHVlID0gMHgxMDsKKwlucC0+Y3J2YWx1ZSA9ICh4ODYgPD0gNCA/IDB4YTAwIDogMHhlMDApOworCWlmICh4ODYgPD0gNCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRoaXMgaXMgYSAzODYvNDg2IFBDSSBzeXN0ZW0sIHNldHRpbmcgYnVyc3QgIgorCQkgICAgICAgImxlbmd0aCB0byAleC5cbiIsIGRldi0+bmFtZSwgKHg4NiA8PSA0ID8gMHgxMCA6IDB4MzgpKTsKKyNlbmRpZgorI2Vsc2UKKy8vIDg5LzkvMSBtb2RpZnksCisvLyAgIG5wLT5iY3J2YWx1ZT0weDM4OworCW5wLT5iY3J2YWx1ZSA9IDB4MTA7CisJbnAtPmNydmFsdWUgPSAweGUwMDsJLyogcnggMTI4IGJ1cnN0IGxlbmd0aCAqLworI3dhcm5pbmcgUHJvY2Vzc29yIGFyY2hpdGVjdHVyZSB1bmRlZmluZWQhCisjZW5kaWYKKy8vIDg5LzEyLzI5IGFkZCwKKy8vIDkwLzEvMTYgbW9kaWZ5LAorLy8gICBucC0+aW1ydmFsdWU9RkJFfFRVTkZ8Q05UT1ZGfFJCVXxUSXxSSTsKKwlucC0+aW1ydmFsdWUgPSBUVU5GIHwgQ05UT1ZGIHwgUkJVIHwgVEkgfCBSSTsKKwlpZiAobnAtPnBjaV9kZXYtPmRldmljZSA9PSAweDg5MSkgeworCQlucC0+YmNydmFsdWUgfD0gMHgyMDA7CS8qIHNldCBQUk9HIGJpdCAqLworCQlucC0+Y3J2YWx1ZSB8PSBDUl9XX0VOSDsJLyogc2V0IGVuaGFuY2VkIGJpdCAqLworCQlucC0+aW1ydmFsdWUgfD0gRVRJOworCX0KKwlpb3dyaXRlMzIobnAtPmJjcnZhbHVlLCBpb2FkZHIgKyBCQ1IpOworCisJaWYgKGRldi0+aWZfcG9ydCA9PSAwKQorCQlkZXYtPmlmX3BvcnQgPSBucC0+ZGVmYXVsdF9wb3J0OworCisJaW93cml0ZTMyKDAsIGlvYWRkciArIFJYUERSKTsKKy8vIDg5LzkvMSBtb2RpZnksCisvLyAgIG5wLT5jcnZhbHVlID0gMHgwMGU0MDAwMTsgICAgLyogdHggc3RvcmUgYW5kIGZvcndhcmQsIHR4L3J4IGVuYWJsZSAqLworCW5wLT5jcnZhbHVlIHw9IDB4MDBlNDAwMDE7CS8qIHR4IHN0b3JlIGFuZCBmb3J3YXJkLCB0eC9yeCBlbmFibGUgKi8KKwlucC0+bWlpLmZ1bGxfZHVwbGV4ID0gbnAtPm1paS5mb3JjZV9tZWRpYTsKKwlnZXRsaW5rc3RhdHVzKGRldik7CisJaWYgKG5wLT5saW5rb2spCisJCWdldGxpbmt0eXBlKGRldik7CisJX19zZXRfcnhfbW9kZShkZXYpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCS8qIENsZWFyIGFuZCBFbmFibGUgaW50ZXJydXB0cyBieSBzZXR0aW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlpb3dyaXRlMzIoRkJFIHwgVFVORiB8IENOVE9WRiB8IFJCVSB8IFRJIHwgUkksIGlvYWRkciArIElTUik7CisJaW93cml0ZTMyKG5wLT5pbXJ2YWx1ZSwgaW9hZGRyICsgSU1SKTsKKworCWlmIChkZWJ1ZykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBEb25lIG5ldGRldl9vcGVuKCkuXG4iLCBkZXYtPm5hbWUpOworCisJLyogU2V0IHRoZSB0aW1lciB0byBjaGVjayBmb3IgbGluayBiZWF0LiAqLworCWluaXRfdGltZXIoJm5wLT50aW1lcik7CisJbnAtPnRpbWVyLmV4cGlyZXMgPSBSVU5fQVQoMyAqIEhaKTsKKwlucC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisJbnAtPnRpbWVyLmZ1bmN0aW9uID0gJm5ldGRldl90aW1lcjsKKworCS8qIHRpbWVyIGhhbmRsZXIgKi8KKwlhZGRfdGltZXIoJm5wLT50aW1lcik7CisKKwlpbml0X3RpbWVyKCZucC0+cmVzZXRfdGltZXIpOworCW5wLT5yZXNldF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKwlucC0+cmVzZXRfdGltZXIuZnVuY3Rpb24gPSAmcmVzZXRfdGltZXI7CisJbnAtPnJlc2V0X3RpbWVyX2FybWVkID0gMDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGdldGxpbmtzdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKy8qIGZ1bmN0aW9uOiBSb3V0aW5lIHdpbGwgcmVhZCBNSUkgU3RhdHVzIFJlZ2lzdGVyIHRvIGdldCBsaW5rIHN0YXR1cy4gICAgICAgKi8KKy8qIGlucHV0ICAgOiBkZXYuLi4gcG9pbnRlciB0byB0aGUgYWRhcHRlciBibG9jay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIG91dHB1dCAgOiBub25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgaSwgRGVsYXlUaW1lID0gMHgxMDAwOworCisJbnAtPmxpbmtvayA9IDA7CisKKwlpZiAobnAtPlBIWVR5cGUgPT0gTXlzb25QSFkpIHsKKwkJZm9yIChpID0gMDsgaSA8IERlbGF5VGltZTsgKytpKSB7CisJCQlpZiAoaW9yZWFkMzIobnAtPm1lbSArIEJNQ1JTUikgJiBMaW5rSXNVcDIpIHsKKwkJCQlucC0+bGlua29rID0gMTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQl1ZGVsYXkoMTAwKTsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBEZWxheVRpbWU7ICsraSkgeworCQkJaWYgKG1kaW9fcmVhZChkZXYsIG5wLT5waHlzWzBdLCBNSUlfQk1TUikgJiBCTVNSX0xTVEFUVVMpIHsKKwkJCQlucC0+bGlua29rID0gMTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQl1ZGVsYXkoMTAwKTsKKwkJfQorCX0KK30KKworCitzdGF0aWMgdm9pZCBnZXRsaW5rdHlwZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKG5wLT5QSFlUeXBlID09IE15c29uUEhZKSB7CS8qIDMtaW4tMSBjYXNlICovCisJCWlmIChpb3JlYWQzMihucC0+bWVtICsgVENSUkNSKSAmIENSX1JfRkQpCisJCQlucC0+ZHVwbGV4bW9kZSA9IDI7CS8qIGZ1bGwgZHVwbGV4ICovCisJCWVsc2UKKwkJCW5wLT5kdXBsZXhtb2RlID0gMTsJLyogaGFsZiBkdXBsZXggKi8KKwkJaWYgKGlvcmVhZDMyKG5wLT5tZW0gKyBUQ1JSQ1IpICYgQ1JfUl9QUzEwKQorCQkJbnAtPmxpbmVfc3BlZWQgPSAxOwkvKiAxME0gKi8KKwkJZWxzZQorCQkJbnAtPmxpbmVfc3BlZWQgPSAyOwkvKiAxMDBNICovCisJfSBlbHNlIHsKKwkJaWYgKG5wLT5QSFlUeXBlID09IFNlZXFQSFkpIHsJLyogdGhpcyBQSFkgaXMgU0VFUSA4MDIyNSAqLworCQkJdW5zaWduZWQgaW50IGRhdGE7CisKKwkJCWRhdGEgPSBtZGlvX3JlYWQoZGV2LCBucC0+cGh5c1swXSwgTUlJUmVnaXN0ZXIxOCk7CisJCQlpZiAoZGF0YSAmIFNQRF9ERVRfMTAwKQorCQkJCW5wLT5saW5lX3NwZWVkID0gMjsJLyogMTAwTSAqLworCQkJZWxzZQorCQkJCW5wLT5saW5lX3NwZWVkID0gMTsJLyogMTBNICovCisJCQlpZiAoZGF0YSAmIERQTFhfREVUX0ZVTEwpCisJCQkJbnAtPmR1cGxleG1vZGUgPSAyOwkvKiBmdWxsIGR1cGxleCBtb2RlICovCisJCQllbHNlCisJCQkJbnAtPmR1cGxleG1vZGUgPSAxOwkvKiBoYWxmIGR1cGxleCBtb2RlICovCisJCX0gZWxzZSBpZiAobnAtPlBIWVR5cGUgPT0gQWhkb2NQSFkpIHsKKwkJCXVuc2lnbmVkIGludCBkYXRhOworCisJCQlkYXRhID0gbWRpb19yZWFkKGRldiwgbnAtPnBoeXNbMF0sIERpYWdub3N0aWNSZWcpOworCQkJaWYgKGRhdGEgJiBTcGVlZF8xMDApCisJCQkJbnAtPmxpbmVfc3BlZWQgPSAyOwkvKiAxMDBNICovCisJCQllbHNlCisJCQkJbnAtPmxpbmVfc3BlZWQgPSAxOwkvKiAxME0gKi8KKwkJCWlmIChkYXRhICYgRFBMWF9GVUxMKQorCQkJCW5wLT5kdXBsZXhtb2RlID0gMjsJLyogZnVsbCBkdXBsZXggbW9kZSAqLworCQkJZWxzZQorCQkJCW5wLT5kdXBsZXhtb2RlID0gMTsJLyogaGFsZiBkdXBsZXggbW9kZSAqLworCQl9CisvKiA4OS82LzEzIGFkZCwgKGJlZ2luKSAqLworCQllbHNlIGlmIChucC0+UEhZVHlwZSA9PSBNYXJ2ZWxsUEhZKSB7CisJCQl1bnNpZ25lZCBpbnQgZGF0YTsKKworCQkJZGF0YSA9IG1kaW9fcmVhZChkZXYsIG5wLT5waHlzWzBdLCBTcGVjaWZpY1JlZyk7CisJCQlpZiAoZGF0YSAmIEZ1bGxfRHVwbGV4KQorCQkJCW5wLT5kdXBsZXhtb2RlID0gMjsJLyogZnVsbCBkdXBsZXggbW9kZSAqLworCQkJZWxzZQorCQkJCW5wLT5kdXBsZXhtb2RlID0gMTsJLyogaGFsZiBkdXBsZXggbW9kZSAqLworCQkJZGF0YSAmPSBTcGVlZE1hc2s7CisJCQlpZiAoZGF0YSA9PSBTcGVlZF8xMDAwTSkKKwkJCQlucC0+bGluZV9zcGVlZCA9IDM7CS8qIDEwMDBNICovCisJCQllbHNlIGlmIChkYXRhID09IFNwZWVkXzEwME0pCisJCQkJbnAtPmxpbmVfc3BlZWQgPSAyOwkvKiAxMDBNICovCisJCQllbHNlCisJCQkJbnAtPmxpbmVfc3BlZWQgPSAxOwkvKiAxME0gKi8KKwkJfQorLyogODkvNi8xMyBhZGQsIChlbmQpICovCisvKiA4OS83LzI3IGFkZCwgKGJlZ2luKSAqLworCQllbHNlIGlmIChucC0+UEhZVHlwZSA9PSBNeXNvbjk4MSkgeworCQkJdW5zaWduZWQgaW50IGRhdGE7CisKKwkJCWRhdGEgPSBtZGlvX3JlYWQoZGV2LCBucC0+cGh5c1swXSwgU3RhdHVzUmVnaXN0ZXIpOworCisJCQlpZiAoZGF0YSAmIFNQRUVEMTAwKQorCQkJCW5wLT5saW5lX3NwZWVkID0gMjsKKwkJCWVsc2UKKwkJCQlucC0+bGluZV9zcGVlZCA9IDE7CisKKwkJCWlmIChkYXRhICYgRlVMTE1PREUpCisJCQkJbnAtPmR1cGxleG1vZGUgPSAyOworCQkJZWxzZQorCQkJCW5wLT5kdXBsZXhtb2RlID0gMTsKKwkJfQorLyogODkvNy8yNyBhZGQsIChlbmQpICovCisvKiA4OS8xMi8yOSBhZGQgKi8KKwkJZWxzZSBpZiAobnAtPlBIWVR5cGUgPT0gTGV2ZWxPbmVQSFkpIHsKKwkJCXVuc2lnbmVkIGludCBkYXRhOworCisJCQlkYXRhID0gbWRpb19yZWFkKGRldiwgbnAtPnBoeXNbMF0sIFNwZWNpZmljUmVnKTsKKwkJCWlmIChkYXRhICYgTFhUMTAwMF9GdWxsKQorCQkJCW5wLT5kdXBsZXhtb2RlID0gMjsJLyogZnVsbCBkdXBsZXggbW9kZSAqLworCQkJZWxzZQorCQkJCW5wLT5kdXBsZXhtb2RlID0gMTsJLyogaGFsZiBkdXBsZXggbW9kZSAqLworCQkJZGF0YSAmPSBTcGVlZE1hc2s7CisJCQlpZiAoZGF0YSA9PSBMWFQxMDAwXzEwMDBNKQorCQkJCW5wLT5saW5lX3NwZWVkID0gMzsJLyogMTAwME0gKi8KKwkJCWVsc2UgaWYgKGRhdGEgPT0gTFhUMTAwMF8xMDBNKQorCQkJCW5wLT5saW5lX3NwZWVkID0gMjsJLyogMTAwTSAqLworCQkJZWxzZQorCQkJCW5wLT5saW5lX3NwZWVkID0gMTsJLyogMTBNICovCisJCX0KKwkJbnAtPmNydmFsdWUgJj0gKH5DUl9XX1BTMTApICYgKH5DUl9XX0ZEKSAmICh+Q1JfV19QUzEwMDApOworCQlpZiAobnAtPmxpbmVfc3BlZWQgPT0gMSkKKwkJCW5wLT5jcnZhbHVlIHw9IENSX1dfUFMxMDsKKwkJZWxzZSBpZiAobnAtPmxpbmVfc3BlZWQgPT0gMykKKwkJCW5wLT5jcnZhbHVlIHw9IENSX1dfUFMxMDAwOworCQlpZiAobnAtPmR1cGxleG1vZGUgPT0gMikKKwkJCW5wLT5jcnZhbHVlIHw9IENSX1dfRkQ7CisJfQorfQorCisKKy8qIFRha2UgbG9jayBiZWZvcmUgY2FsbGluZyB0aGlzICovCitzdGF0aWMgdm9pZCBhbGxvY2F0ZV9yeF9idWZmZXJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiAgYWxsb2NhdGUgc2tiIGZvciByeCBidWZmZXJzICovCisJd2hpbGUgKG5wLT5yZWFsbHlfcnhfY291bnQgIT0gUlhfUklOR19TSVpFKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihucC0+cnhfYnVmX3N6KTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJYnJlYWs7CS8qIEJldHRlciBsdWNrIG5leHQgcm91bmQuICovCisKKwkJd2hpbGUgKG5wLT5sYWNrX3J4YnVmLT5za2J1ZmYpCisJCQlucC0+bGFja19yeGJ1ZiA9IG5wLT5sYWNrX3J4YnVmLT5uZXh0X2Rlc2NfbG9naWNhbDsKKworCQlza2ItPmRldiA9IGRldjsJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLworCQlucC0+bGFja19yeGJ1Zi0+c2tidWZmID0gc2tiOworCQlucC0+bGFja19yeGJ1Zi0+YnVmZmVyID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsIHNrYi0+dGFpbCwKKwkJCW5wLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCW5wLT5sYWNrX3J4YnVmLT5zdGF0dXMgPSBSWE9XTjsKKwkJKytucC0+cmVhbGx5X3J4X2NvdW50OworCX0KK30KKworCitzdGF0aWMgdm9pZCBuZXRkZXZfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5tZW07CisJaW50IG9sZF9jcnZhbHVlID0gbnAtPmNydmFsdWU7CisJdW5zaWduZWQgaW50IG9sZF9saW5rb2sgPSBucC0+bGlua29rOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGVidWcpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogTWVkaWEgc2VsZWN0aW9uIHRpbWVyIHRpY2ssIHN0YXR1cyAlOC44eCAiCisJCSAgICAgICAiY29uZmlnICU4Ljh4LlxuIiwgZGV2LT5uYW1lLCBpb3JlYWQzMihpb2FkZHIgKyBJU1IpLAorCQkgICAgICAgaW9yZWFkMzIoaW9hZGRyICsgVENSUkNSKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPmxvY2ssIGZsYWdzKTsKKworCWlmIChucC0+ZmxhZ3MgPT0gSEFTX01JSV9YQ1ZSKSB7CisJCWdldGxpbmtzdGF0dXMoZGV2KTsKKwkJaWYgKChvbGRfbGlua29rID09IDApICYmIChucC0+bGlua29rID09IDEpKSB7CS8qIHdlIG5lZWQgdG8gZGV0ZWN0IHRoZSBtZWRpYSB0eXBlIGFnYWluICovCisJCQlnZXRsaW5rdHlwZShkZXYpOworCQkJaWYgKG5wLT5jcnZhbHVlICE9IG9sZF9jcnZhbHVlKSB7CisJCQkJc3RvcF9uaWNfcnh0eChpb2FkZHIsIG5wLT5jcnZhbHVlKTsKKwkJCQlpb3dyaXRlMzIobnAtPmNydmFsdWUsIGlvYWRkciArIFRDUlJDUik7CisJCQl9CisJCX0KKwl9CisKKwlhbGxvY2F0ZV9yeF9idWZmZXJzKGRldik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+bG9jaywgZmxhZ3MpOworCisJbnAtPnRpbWVyLmV4cGlyZXMgPSBSVU5fQVQoMTAgKiBIWik7CisJYWRkX3RpbWVyKCZucC0+dGltZXIpOworfQorCisKKy8qIFRha2UgbG9jayBiZWZvcmUgY2FsbGluZyAqLworLyogUmVzZXQgY2hpcCBhbmQgZGlzYWJsZSByeCwgdHggYW5kIGludGVycnVwdHMgKi8KK3N0YXRpYyB2b2lkIHJlc2V0X2FuZF9kaXNhYmxlX3J4dHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5tZW07CisJaW50IGRlbGF5PTUxOworCisJLyogUmVzZXQgdGhlIGNoaXAncyBUeCBhbmQgUnggcHJvY2Vzc2VzLiAqLworCXN0b3BfbmljX3J4dHgoaW9hZGRyLCAwKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBieSBjbGVhcmluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJaW93cml0ZTMyKDAsIGlvYWRkciArIElNUik7CisKKwkvKiBSZXNldCB0aGUgY2hpcCB0byBlcmFzZSBwcmV2aW91cyBtaXNjb25maWd1cmF0aW9uLiAqLworCWlvd3JpdGUzMigweDAwMDAwMDAxLCBpb2FkZHIgKyBCQ1IpOworCisJLyogVWVpbW9yOiB3YWl0IGZvciA1MCBQQ0kgY3ljbGVzIChhbmQgZmx1c2ggcG9zdGVkIHdyaXRlcyBidHcpLiAKKwkgICBXZSBzdXJlbHkgd2FpdCB0b28gbG9uZyAoYWRkcmVzcytkYXRhIHBoYXNlKS4gV2hvIGNhcmVzPyAqLworCXdoaWxlICgtLWRlbGF5KSB7CisJCWlvcmVhZDMyKGlvYWRkciArIEJDUik7CisJCXJtYigpOworCX0KK30KKworCisvKiBUYWtlIGxvY2sgYmVmb3JlIGNhbGxpbmcgKi8KKy8qIFJlc3RvcmUgY2hpcCBhZnRlciByZXNldCAqLworc3RhdGljIHZvaWQgZW5hYmxlX3J4dHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5tZW07CisKKwlyZXNldF9yeF9kZXNjcmlwdG9ycyhkZXYpOworCisJaW93cml0ZTMyKG5wLT50eF9yaW5nX2RtYSArICgoY2hhciopbnAtPmN1cl90eCAtIChjaGFyKilucC0+dHhfcmluZyksCisJCWlvYWRkciArIFRYTEJBKTsKKwlpb3dyaXRlMzIobnAtPnJ4X3JpbmdfZG1hICsgKChjaGFyKilucC0+Y3VyX3J4IC0gKGNoYXIqKW5wLT5yeF9yaW5nKSwKKwkJaW9hZGRyICsgUlhMQkEpOworCisJaW93cml0ZTMyKG5wLT5iY3J2YWx1ZSwgaW9hZGRyICsgQkNSKTsKKworCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBSWFBEUik7CisJX19zZXRfcnhfbW9kZShkZXYpOyAvKiBjaGFuZ2VzIG5wLT5jcnZhbHVlLCB3cml0ZXMgaXQgaW50byBUQ1JSQ1IgKi8KKworCS8qIENsZWFyIGFuZCBFbmFibGUgaW50ZXJydXB0cyBieSBzZXR0aW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlpb3dyaXRlMzIoRkJFIHwgVFVORiB8IENOVE9WRiB8IFJCVSB8IFRJIHwgUkksIGlvYWRkciArIElTUik7CisJaW93cml0ZTMyKG5wLT5pbXJ2YWx1ZSwgaW9hZGRyICsgSU1SKTsKKworCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBUWFBEUik7Cit9CisKKworc3RhdGljIHZvaWQgcmVzZXRfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlc2V0dGluZyB0eCBhbmQgcnggbWFjaGluZXJ5XG4iLCBkZXYtPm5hbWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5wLT5sb2NrLCBmbGFncyk7CisJbnAtPmNydmFsdWUgPSBucC0+Y3J2YWx1ZV9zdjsKKwlucC0+aW1ydmFsdWUgPSBucC0+aW1ydmFsdWVfc3Y7CisKKwlyZXNldF9hbmRfZGlzYWJsZV9yeHR4KGRldik7CisJLyogd29ya3MgZm9yIG1lIHdpdGhvdXQgdGhpczoKKwlyZXNldF90eF9kZXNjcmlwdG9ycyhkZXYpOyAqLworCWVuYWJsZV9yeHR4KGRldik7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsgLyogRklYTUU6IG9yIG5ldGlmX3dha2VfcXVldWUoZGV2KTsgPyAqLworCQkKKwlucC0+cmVzZXRfdGltZXJfYXJtZWQgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnAtPmxvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgdm9pZCB0eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+bWVtOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgJTguOHgsIgorCSAgICAgICAiIHJlc2V0dGluZy4uLlxuIiwgZGV2LT5uYW1lLCBpb3JlYWQzMihpb2FkZHIgKyBJU1IpKTsKKworCXsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgUnggcmluZyAlcDogIiwgbnAtPnJ4X3JpbmcpOworCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCisJCQlwcmludGsoIiAlOC44eCIsICh1bnNpZ25lZCBpbnQpIG5wLT5yeF9yaW5nW2ldLnN0YXR1cyk7CisJCXByaW50aygiXG4iIEtFUk5fREVCVUcgIiAgVHggcmluZyAlcDogIiwgbnAtPnR4X3JpbmcpOworCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCisJCQlwcmludGsoIiAlNC40eCIsIG5wLT50eF9yaW5nW2ldLnN0YXR1cyk7CisJCXByaW50aygiXG4iKTsKKwl9CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5wLT5sb2NrLCBmbGFncyk7CisKKwlyZXNldF9hbmRfZGlzYWJsZV9yeHR4KGRldik7CisJcmVzZXRfdHhfZGVzY3JpcHRvcnMoZGV2KTsKKwllbmFibGVfcnh0eChkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnAtPmxvY2ssIGZsYWdzKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5wLT5zdGF0cy50eF9lcnJvcnMrKzsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7IC8qIG9yIC4uX3N0YXJ0Xy4uID8/ICovCit9CisKKworLyogSW5pdGlhbGl6ZSB0aGUgUnggYW5kIFR4IHJpbmdzLCBhbG9uZyB3aXRoIHZhcmlvdXMgJ2RldicgYml0cy4gKi8KK3N0YXRpYyB2b2lkIGluaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJLyogaW5pdGlhbGl6ZSByeCB2YXJpYWJsZXMgKi8KKwlucC0+cnhfYnVmX3N6ID0gKGRldi0+bXR1IDw9IDE1MDAgPyBQS1RfQlVGX1NaIDogZGV2LT5tdHUgKyAzMik7CisJbnAtPmN1cl9yeCA9ICZucC0+cnhfcmluZ1swXTsKKwlucC0+bGFja19yeGJ1ZiA9IG5wLT5yeF9yaW5nOworCW5wLT5yZWFsbHlfcnhfY291bnQgPSAwOworCisJLyogaW5pdGlhbCByeCBkZXNjcmlwdG9ycy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJbnAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gMDsKKwkJbnAtPnJ4X3JpbmdbaV0uY29udHJvbCA9IG5wLT5yeF9idWZfc3ogPDwgUkJTU2hpZnQ7CisJCW5wLT5yeF9yaW5nW2ldLm5leHRfZGVzYyA9IG5wLT5yeF9yaW5nX2RtYSArCisJCQkoaSArIDEpKnNpemVvZihzdHJ1Y3QgZmVhbG54X2Rlc2MpOworCQlucC0+cnhfcmluZ1tpXS5uZXh0X2Rlc2NfbG9naWNhbCA9ICZucC0+cnhfcmluZ1tpICsgMV07CisJCW5wLT5yeF9yaW5nW2ldLnNrYnVmZiA9IE5VTEw7CisJfQorCisJLyogZm9yIHRoZSBsYXN0IHJ4IGRlc2NyaXB0b3IgKi8KKwlucC0+cnhfcmluZ1tpIC0gMV0ubmV4dF9kZXNjID0gbnAtPnJ4X3JpbmdfZG1hOworCW5wLT5yeF9yaW5nW2kgLSAxXS5uZXh0X2Rlc2NfbG9naWNhbCA9IG5wLT5yeF9yaW5nOworCisJLyogYWxsb2NhdGUgc2tiIGZvciByeCBidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKG5wLT5yeF9idWZfc3opOworCisJCWlmIChza2IgPT0gTlVMTCkgeworCQkJbnAtPmxhY2tfcnhidWYgPSAmbnAtPnJ4X3JpbmdbaV07CisJCQlicmVhazsKKwkJfQorCisJCSsrbnAtPnJlYWxseV9yeF9jb3VudDsKKwkJbnAtPnJ4X3JpbmdbaV0uc2tidWZmID0gc2tiOworCQlza2ItPmRldiA9IGRldjsJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLworCQlucC0+cnhfcmluZ1tpXS5idWZmZXIgPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2Rldiwgc2tiLT50YWlsLAorCQkJbnAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJbnAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gUlhPV047CisJCW5wLT5yeF9yaW5nW2ldLmNvbnRyb2wgfD0gUlhJQzsKKwl9CisKKwkvKiBpbml0aWFsaXplIHR4IHZhcmlhYmxlcyAqLworCW5wLT5jdXJfdHggPSAmbnAtPnR4X3JpbmdbMF07CisJbnAtPmN1cl90eF9jb3B5ID0gJm5wLT50eF9yaW5nWzBdOworCW5wLT5yZWFsbHlfdHhfY291bnQgPSAwOworCW5wLT5mcmVlX3R4X2NvdW50ID0gVFhfUklOR19TSVpFOworCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCW5wLT50eF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJCS8qIGRvIHdlIG5lZWQgbnAtPnR4X3JpbmdbaV0uY29udHJvbCA9IFhYWDsgPz8gKi8KKwkJbnAtPnR4X3JpbmdbaV0ubmV4dF9kZXNjID0gbnAtPnR4X3JpbmdfZG1hICsKKwkJCShpICsgMSkqc2l6ZW9mKHN0cnVjdCBmZWFsbnhfZGVzYyk7CisJCW5wLT50eF9yaW5nW2ldLm5leHRfZGVzY19sb2dpY2FsID0gJm5wLT50eF9yaW5nW2kgKyAxXTsKKwkJbnAtPnR4X3JpbmdbaV0uc2tidWZmID0gTlVMTDsKKwl9CisKKwkvKiBmb3IgdGhlIGxhc3QgdHggZGVzY3JpcHRvciAqLworCW5wLT50eF9yaW5nW2kgLSAxXS5uZXh0X2Rlc2MgPSBucC0+dHhfcmluZ19kbWE7CisJbnAtPnR4X3JpbmdbaSAtIDFdLm5leHRfZGVzY19sb2dpY2FsID0gJm5wLT50eF9yaW5nWzBdOworfQorCisKK3N0YXRpYyBpbnQgc3RhcnRfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5wLT5sb2NrLCBmbGFncyk7CisKKwlucC0+Y3VyX3R4X2NvcHktPnNrYnVmZiA9IHNrYjsKKworI2RlZmluZSBvbmVfYnVmZmVyCisjZGVmaW5lIEJQVCAxMDIyCisjaWYgZGVmaW5lZChvbmVfYnVmZmVyKQorCW5wLT5jdXJfdHhfY29weS0+YnVmZmVyID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsIHNrYi0+ZGF0YSwKKwkJc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCW5wLT5jdXJfdHhfY29weS0+Y29udHJvbCA9IFRYSUMgfCBUWExEIHwgVFhGRCB8IENSQ0VuYWJsZSB8IFBBREVuYWJsZTsKKwlucC0+Y3VyX3R4X2NvcHktPmNvbnRyb2wgfD0gKHNrYi0+bGVuIDw8IFBLVFNTaGlmdCk7CS8qIHBrdCBzaXplICovCisJbnAtPmN1cl90eF9jb3B5LT5jb250cm9sIHw9IChza2ItPmxlbiA8PCBUQlNTaGlmdCk7CS8qIGJ1ZmZlciBzaXplICovCisvLyA4OS8xMi8yOSBhZGQsCisJaWYgKG5wLT5wY2lfZGV2LT5kZXZpY2UgPT0gMHg4OTEpCisJCW5wLT5jdXJfdHhfY29weS0+Y29udHJvbCB8PSBFVElDb250cm9sIHwgUmV0cnlUeExDOworCW5wLT5jdXJfdHhfY29weS0+c3RhdHVzID0gVFhPV047CisJbnAtPmN1cl90eF9jb3B5ID0gbnAtPmN1cl90eF9jb3B5LT5uZXh0X2Rlc2NfbG9naWNhbDsKKwktLW5wLT5mcmVlX3R4X2NvdW50OworI2VsaWYgZGVmaW5lZCh0d29fYnVmZmVyKQorCWlmIChza2ItPmxlbiA+IEJQVCkgeworCQlzdHJ1Y3QgZmVhbG54X2Rlc2MgKm5leHQ7CisKKwkJLyogZm9yIHRoZSBmaXJzdCBkZXNjcmlwdG9yICovCisJCW5wLT5jdXJfdHhfY29weS0+YnVmZmVyID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsIHNrYi0+ZGF0YSwKKwkJCUJQVCwgUENJX0RNQV9UT0RFVklDRSk7CisJCW5wLT5jdXJfdHhfY29weS0+Y29udHJvbCA9IFRYSUMgfCBUWEZEIHwgQ1JDRW5hYmxlIHwgUEFERW5hYmxlOworCQlucC0+Y3VyX3R4X2NvcHktPmNvbnRyb2wgfD0gKHNrYi0+bGVuIDw8IFBLVFNTaGlmdCk7CS8qIHBrdCBzaXplICovCisJCW5wLT5jdXJfdHhfY29weS0+Y29udHJvbCB8PSAoQlBUIDw8IFRCU1NoaWZ0KTsJLyogYnVmZmVyIHNpemUgKi8KKworCQkvKiBmb3IgdGhlIGxhc3QgZGVzY3JpcHRvciAqLworCQluZXh0ID0gbnAtPmN1cl90eF9jb3B5LT5uZXh0X2Rlc2NfbG9naWNhbDsKKwkJbmV4dC0+c2tidWZmID0gc2tiOworCQluZXh0LT5jb250cm9sID0gVFhJQyB8IFRYTEQgfCBDUkNFbmFibGUgfCBQQURFbmFibGU7CisJCW5leHQtPmNvbnRyb2wgfD0gKHNrYi0+bGVuIDw8IFBLVFNTaGlmdCk7CS8qIHBrdCBzaXplICovCisJCW5leHQtPmNvbnRyb2wgfD0gKChza2ItPmxlbiAtIEJQVCkgPDwgVEJTU2hpZnQpOwkvKiBidWYgc2l6ZSAqLworLy8gODkvMTIvMjkgYWRkLAorCQlpZiAobnAtPnBjaV9kZXYtPmRldmljZSA9PSAweDg5MSkKKwkJCW5wLT5jdXJfdHhfY29weS0+Y29udHJvbCB8PSBFVElDb250cm9sIHwgUmV0cnlUeExDOworCQluZXh0LT5idWZmZXIgPSBwY2lfbWFwX3NpbmdsZShlcC0+cGNpX2Rldiwgc2tiLT5kYXRhICsgQlBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2ItPmxlbiAtIEJQVCwgUENJX0RNQV9UT0RFVklDRSk7CisKKwkJbmV4dC0+c3RhdHVzID0gVFhPV047CisJCW5wLT5jdXJfdHhfY29weS0+c3RhdHVzID0gVFhPV047CisKKwkJbnAtPmN1cl90eF9jb3B5ID0gbmV4dC0+bmV4dF9kZXNjX2xvZ2ljYWw7CisJCW5wLT5mcmVlX3R4X2NvdW50IC09IDI7CisJfSBlbHNlIHsKKwkJbnAtPmN1cl90eF9jb3B5LT5idWZmZXIgPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2Rldiwgc2tiLT5kYXRhLAorCQkJc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlucC0+Y3VyX3R4X2NvcHktPmNvbnRyb2wgPSBUWElDIHwgVFhMRCB8IFRYRkQgfCBDUkNFbmFibGUgfCBQQURFbmFibGU7CisJCW5wLT5jdXJfdHhfY29weS0+Y29udHJvbCB8PSAoc2tiLT5sZW4gPDwgUEtUU1NoaWZ0KTsJLyogcGt0IHNpemUgKi8KKwkJbnAtPmN1cl90eF9jb3B5LT5jb250cm9sIHw9IChza2ItPmxlbiA8PCBUQlNTaGlmdCk7CS8qIGJ1ZmZlciBzaXplICovCisvLyA4OS8xMi8yOSBhZGQsCisJCWlmIChucC0+cGNpX2Rldi0+ZGV2aWNlID09IDB4ODkxKQorCQkJbnAtPmN1cl90eF9jb3B5LT5jb250cm9sIHw9IEVUSUNvbnRyb2wgfCBSZXRyeVR4TEM7CisJCW5wLT5jdXJfdHhfY29weS0+c3RhdHVzID0gVFhPV047CisJCW5wLT5jdXJfdHhfY29weSA9IG5wLT5jdXJfdHhfY29weS0+bmV4dF9kZXNjX2xvZ2ljYWw7CisJCS0tbnAtPmZyZWVfdHhfY291bnQ7CisJfQorI2VuZGlmCisKKwlpZiAobnAtPmZyZWVfdHhfY291bnQgPCAyKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJKytucC0+cmVhbGx5X3R4X2NvdW50OworCWlvd3JpdGUzMigwLCBucC0+bWVtICsgVFhQRFIpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnAtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBUYWtlIGxvY2sgYmVmb3JlIGNhbGxpbmcgKi8KKy8qIENoaXAgcHJvYmFibHkgaG9zZWQgdHggcmluZy4gQ2xlYW4gdXAuICovCitzdGF0aWMgdm9pZCByZXNldF90eF9kZXNjcmlwdG9ycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBmZWFsbnhfZGVzYyAqY3VyOworCWludCBpOworCisJLyogaW5pdGlhbGl6ZSB0eCB2YXJpYWJsZXMgKi8KKwlucC0+Y3VyX3R4ID0gJm5wLT50eF9yaW5nWzBdOworCW5wLT5jdXJfdHhfY29weSA9ICZucC0+dHhfcmluZ1swXTsKKwlucC0+cmVhbGx5X3R4X2NvdW50ID0gMDsKKwlucC0+ZnJlZV90eF9jb3VudCA9IFRYX1JJTkdfU0laRTsKKworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQljdXIgPSAmbnAtPnR4X3JpbmdbaV07CisJCWlmIChjdXItPnNrYnVmZikgeworCQkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldiwgY3VyLT5idWZmZXIsCisJCQkJY3VyLT5za2J1ZmYtPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKGN1ci0+c2tidWZmKTsKKwkJCS8qIG9yIGRldl9rZnJlZV9za2JfaXJxKGN1ci0+c2tidWZmKTsgPyAqLworCQkJY3VyLT5za2J1ZmYgPSBOVUxMOworCQl9CisJCWN1ci0+c3RhdHVzID0gMDsKKwkJY3VyLT5jb250cm9sID0gMDsJLyogbmVlZGVkPyAqLworCQkvKiBwcm9iYWJseSBub3QgbmVlZGVkLiBXZSBkbyBpdCBmb3IgcHVyZWx5IHBhcmFub2lkIHJlYXNvbnMgKi8KKwkJY3VyLT5uZXh0X2Rlc2MgPSBucC0+dHhfcmluZ19kbWEgKworCQkJKGkgKyAxKSpzaXplb2Yoc3RydWN0IGZlYWxueF9kZXNjKTsKKwkJY3VyLT5uZXh0X2Rlc2NfbG9naWNhbCA9ICZucC0+dHhfcmluZ1tpICsgMV07CisJfQorCS8qIGZvciB0aGUgbGFzdCB0eCBkZXNjcmlwdG9yICovCisJbnAtPnR4X3JpbmdbVFhfUklOR19TSVpFIC0gMV0ubmV4dF9kZXNjID0gbnAtPnR4X3JpbmdfZG1hOworCW5wLT50eF9yaW5nW1RYX1JJTkdfU0laRSAtIDFdLm5leHRfZGVzY19sb2dpY2FsID0gJm5wLT50eF9yaW5nWzBdOworfQorCisKKy8qIFRha2UgbG9jayBhbmQgc3RvcCByeCBiZWZvcmUgY2FsbGluZyB0aGlzICovCitzdGF0aWMgdm9pZCByZXNldF9yeF9kZXNjcmlwdG9ycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBmZWFsbnhfZGVzYyAqY3VyID0gbnAtPmN1cl9yeDsKKwlpbnQgaTsKKworCWFsbG9jYXRlX3J4X2J1ZmZlcnMoZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlpZiAoY3VyLT5za2J1ZmYpCisJCQljdXItPnN0YXR1cyA9IFJYT1dOOworCQljdXIgPSBjdXItPm5leHRfZGVzY19sb2dpY2FsOworCX0KKworCWlvd3JpdGUzMihucC0+cnhfcmluZ19kbWEgKyAoKGNoYXIqKW5wLT5jdXJfcnggLSAoY2hhciopbnAtPnJ4X3JpbmcpLAorCQlucC0+bWVtICsgUlhMQkEpOworfQorCisKKy8qIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBkb2VzIGFsbCBvZiB0aGUgUnggdGhyZWFkIHdvcmsgYW5kIGNsZWFucyB1cAorICAgYWZ0ZXIgdGhlIFR4IHRocmVhZC4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBpbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2luc3RhbmNlOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPm1lbTsKKwlsb25nIGJvZ3VzY250ID0gbWF4X2ludGVycnVwdF93b3JrOworCXVuc2lnbmVkIGludCBudW1fdHggPSAwOworCWludCBoYW5kbGVkID0gMDsKKworCXNwaW5fbG9jaygmbnAtPmxvY2spOworCisJaW93cml0ZTMyKDAsIGlvYWRkciArIElNUik7CisKKwlkbyB7CisJCXUzMiBpbnRyX3N0YXR1cyA9IGlvcmVhZDMyKGlvYWRkciArIElTUik7CisKKwkJLyogQWNrbm93bGVkZ2UgYWxsIG9mIHRoZSBjdXJyZW50IGludGVycnVwdCBzb3VyY2VzIEFTQVAuICovCisJCWlvd3JpdGUzMihpbnRyX3N0YXR1cywgaW9hZGRyICsgSVNSKTsKKworCQlpZiAoZGVidWcpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEludGVycnVwdCwgc3RhdHVzICU0LjR4LlxuIiwgZGV2LT5uYW1lLAorCQkJICAgICAgIGludHJfc3RhdHVzKTsKKworCQlpZiAoIShpbnRyX3N0YXR1cyAmIG5wLT5pbXJ2YWx1ZSkpCisJCQlicmVhazsKKworCQloYW5kbGVkID0gMTsKKworLy8gOTAvMS8xNiBkZWxldGUsCisvLworLy8gICAgICBpZiAoaW50cl9zdGF0dXMgJiBGQkUpCisvLyAgICAgIHsgICAvKiBmYXRhbCBlcnJvciAqLworLy8gICAgICAgICAgc3RvcF9uaWNfdHgoaW9hZGRyLCAwKTsKKy8vICAgICAgICAgIHN0b3BfbmljX3J4KGlvYWRkciwgMCk7CisvLyAgICAgICAgICBicmVhazsKKy8vICAgICAgfTsKKworCQlpZiAoaW50cl9zdGF0dXMgJiBUVU5GKQorCQkJaW93cml0ZTMyKDAsIGlvYWRkciArIFRYUERSKTsKKworCQlpZiAoaW50cl9zdGF0dXMgJiBDTlRPVkYpIHsKKwkJCS8qIG1pc3NlZCBwa3RzICovCisJCQlucC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBpb3JlYWQzMihpb2FkZHIgKyBUQUxMWSkgJiAweDdmZmY7CisKKwkJCS8qIGNyYyBlcnJvciAqLworCQkJbnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0KKwkJCSAgICAoaW9yZWFkMzIoaW9hZGRyICsgVEFMTFkpICYgMHg3ZmZmMDAwMCkgPj4gMTY7CisJCX0KKworCQlpZiAoaW50cl9zdGF0dXMgJiAoUkkgfCBSQlUpKSB7CisJCQlpZiAoaW50cl9zdGF0dXMgJiBSSSkKKwkJCQluZXRkZXZfcngoZGV2KTsKKwkJCWVsc2UgeworCQkJCXN0b3BfbmljX3J4KGlvYWRkciwgbnAtPmNydmFsdWUpOworCQkJCXJlc2V0X3J4X2Rlc2NyaXB0b3JzKGRldik7CisJCQkJaW93cml0ZTMyKG5wLT5jcnZhbHVlLCBpb2FkZHIgKyBUQ1JSQ1IpOworCQkJfQkJCQkKKwkJfQorCisJCXdoaWxlIChucC0+cmVhbGx5X3R4X2NvdW50KSB7CisJCQlsb25nIHR4X3N0YXR1cyA9IG5wLT5jdXJfdHgtPnN0YXR1czsKKwkJCWxvbmcgdHhfY29udHJvbCA9IG5wLT5jdXJfdHgtPmNvbnRyb2w7CisKKwkJCWlmICghKHR4X2NvbnRyb2wgJiBUWExEKSkgewkvKiB0aGlzIHBrdCBpcyBjb21iaW5lZCBieSB0d28gdHggZGVzY3JpcHRvcnMgKi8KKwkJCQlzdHJ1Y3QgZmVhbG54X2Rlc2MgKm5leHQ7CisKKwkJCQluZXh0ID0gbnAtPmN1cl90eC0+bmV4dF9kZXNjX2xvZ2ljYWw7CisJCQkJdHhfc3RhdHVzID0gbmV4dC0+c3RhdHVzOworCQkJCXR4X2NvbnRyb2wgPSBuZXh0LT5jb250cm9sOworCQkJfQorCisJCQlpZiAodHhfc3RhdHVzICYgVFhPV04pCisJCQkJYnJlYWs7CisKKwkJCWlmICghKG5wLT5jcnZhbHVlICYgQ1JfV19FTkgpKSB7CisJCQkJaWYgKHR4X3N0YXR1cyAmIChDU0wgfCBMQyB8IEVDIHwgVURGIHwgSEYpKSB7CisJCQkJCW5wLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQkJaWYgKHR4X3N0YXR1cyAmIEVDKQorCQkJCQkJbnAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQkJCWlmICh0eF9zdGF0dXMgJiBDU0wpCisJCQkJCQlucC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQkJaWYgKHR4X3N0YXR1cyAmIExDKQorCQkJCQkJbnAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJCQkJaWYgKHR4X3N0YXR1cyAmIFVERikKKwkJCQkJCW5wLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJCQlpZiAoKHR4X3N0YXR1cyAmIEhGKSAmJiBucC0+bWlpLmZ1bGxfZHVwbGV4ID09IDApCisJCQkJCQlucC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycysrOworCisJCQkJfSBlbHNlIHsKKwkJCQkJbnAtPnN0YXRzLnR4X2J5dGVzICs9CisJCQkJCSAgICAoKHR4X2NvbnRyb2wgJiBQS1RTTWFzaykgPj4gUEtUU1NoaWZ0KTsKKworCQkJCQlucC0+c3RhdHMuY29sbGlzaW9ucyArPQorCQkJCQkgICAgKCh0eF9zdGF0dXMgJiBOQ1JNYXNrKSA+PiBOQ1JTaGlmdCk7CisJCQkJCW5wLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlucC0+c3RhdHMudHhfYnl0ZXMgKz0KKwkJCQkgICAgKCh0eF9jb250cm9sICYgUEtUU01hc2spID4+IFBLVFNTaGlmdCk7CisJCQkJbnAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCX0KKworCQkJLyogRnJlZSB0aGUgb3JpZ2luYWwgc2tiLiAqLworCQkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldiwgbnAtPmN1cl90eC0+YnVmZmVyLAorCQkJCW5wLT5jdXJfdHgtPnNrYnVmZi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2JfaXJxKG5wLT5jdXJfdHgtPnNrYnVmZik7CisJCQlucC0+Y3VyX3R4LT5za2J1ZmYgPSBOVUxMOworCQkJLS1ucC0+cmVhbGx5X3R4X2NvdW50OworCQkJaWYgKG5wLT5jdXJfdHgtPmNvbnRyb2wgJiBUWExEKSB7CisJCQkJbnAtPmN1cl90eCA9IG5wLT5jdXJfdHgtPm5leHRfZGVzY19sb2dpY2FsOworCQkJCSsrbnAtPmZyZWVfdHhfY291bnQ7CisJCQl9IGVsc2UgeworCQkJCW5wLT5jdXJfdHggPSBucC0+Y3VyX3R4LT5uZXh0X2Rlc2NfbG9naWNhbDsKKwkJCQlucC0+Y3VyX3R4ID0gbnAtPmN1cl90eC0+bmV4dF9kZXNjX2xvZ2ljYWw7CisJCQkJbnAtPmZyZWVfdHhfY291bnQgKz0gMjsKKwkJCX0KKwkJCW51bV90eCsrOworCQl9CQkvKiBlbmQgb2YgZm9yIGxvb3AgKi8KKwkJCisJCWlmIChudW1fdHggJiYgbnAtPmZyZWVfdHhfY291bnQgPj0gMikKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCQkvKiByZWFkIHRyYW5zbWl0IHN0YXR1cyBmb3IgZW5oYW5jZWQgbW9kZSBvbmx5ICovCisJCWlmIChucC0+Y3J2YWx1ZSAmIENSX1dfRU5IKSB7CisJCQlsb25nIGRhdGE7CisKKwkJCWRhdGEgPSBpb3JlYWQzMihpb2FkZHIgKyBUU1IpOworCQkJbnAtPnN0YXRzLnR4X2Vycm9ycyArPSAoZGF0YSAmIDB4ZmYwMDAwMDApID4+IDI0OworCQkJbnAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzICs9IChkYXRhICYgMHhmZjAwMDAwMCkgPj4gMjQ7CisJCQlucC0+c3RhdHMudHhfd2luZG93X2Vycm9ycyArPSAoZGF0YSAmIDB4MDBmZjAwMDApID4+IDE2OworCQkJbnAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKGRhdGEgJiAweDAwMDBmZmZmKTsKKwkJfQorCisJCWlmICgtLWJvZ3VzY250IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRvbyBtdWNoIHdvcmsgYXQgaW50ZXJydXB0LCAiCisJCQkgICAgICAgInN0YXR1cz0weCU0LjR4LlxuIiwgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7CisJCQlpZiAoIW5wLT5yZXNldF90aW1lcl9hcm1lZCkgeworCQkJCW5wLT5yZXNldF90aW1lcl9hcm1lZCA9IDE7CisJCQkJbnAtPnJlc2V0X3RpbWVyLmV4cGlyZXMgPSBSVU5fQVQoSFovMik7CisJCQkJYWRkX3RpbWVyKCZucC0+cmVzZXRfdGltZXIpOworCQkJCXN0b3BfbmljX3J4dHgoaW9hZGRyLCAwKTsKKwkJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQkJLyogb3IgbmV0aWZfdHhfZGlzYWJsZShkZXYpOyA/PyAqLworCQkJCS8qIFByZXZlbnQgb3RoZXIgcGF0aHMgZnJvbSBlbmFibGluZyB0eCxyeCxpbnRycyAqLworCQkJCW5wLT5jcnZhbHVlX3N2ID0gbnAtPmNydmFsdWU7CisJCQkJbnAtPmltcnZhbHVlX3N2ID0gbnAtPmltcnZhbHVlOworCQkJCW5wLT5jcnZhbHVlICY9IH4oQ1JfV19UWEVOIHwgQ1JfV19SWEVOKTsgLyogb3Igc2ltcGx5ID0gMD8gKi8KKwkJCQlucC0+aW1ydmFsdWUgPSAwOworCQkJfQorCisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKDEpOworCisJLyogcmVhZCB0aGUgdGFsbHkgY291bnRlcnMgKi8KKwkvKiBtaXNzZWQgcGt0cyAqLworCW5wLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IGlvcmVhZDMyKGlvYWRkciArIFRBTExZKSAmIDB4N2ZmZjsKKworCS8qIGNyYyBlcnJvciAqLworCW5wLT5zdGF0cy5yeF9jcmNfZXJyb3JzICs9IChpb3JlYWQzMihpb2FkZHIgKyBUQUxMWSkgJiAweDdmZmYwMDAwKSA+PiAxNjsKKworCWlmIChkZWJ1ZykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleGl0aW5nIGludGVycnVwdCwgc3RhdHVzPSUjNC40eC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGlvcmVhZDMyKGlvYWRkciArIElTUikpOworCisJaW93cml0ZTMyKG5wLT5pbXJ2YWx1ZSwgaW9hZGRyICsgSU1SKTsKKworCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7CisKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCisvKiBUaGlzIHJvdXRpbmUgaXMgbG9naWNhbGx5IHBhcnQgb2YgdGhlIGludGVycnVwdCBoYW5kbGVyLCBidXQgc2VwYXJhdGVkCisgICBmb3IgY2xhcml0eSBhbmQgYmV0dGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24uICovCitzdGF0aWMgaW50IG5ldGRldl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPm1lbTsKKworCS8qIElmIEVPUCBpcyBzZXQgb24gdGhlIG5leHQgZW50cnksIGl0J3MgYSBuZXcgcGFja2V0LiBTZW5kIGl0IHVwLiAqLworCXdoaWxlICghKG5wLT5jdXJfcngtPnN0YXR1cyAmIFJYT1dOKSAmJiBucC0+Y3VyX3J4LT5za2J1ZmYpIHsKKwkJczMyIHJ4X3N0YXR1cyA9IG5wLT5jdXJfcngtPnN0YXR1czsKKworCQlpZiAobnAtPnJlYWxseV9yeF9jb3VudCA9PSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKGRlYnVnKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgbmV0ZGV2X3J4KCkgc3RhdHVzIHdhcyAlOC44eC5cbiIsIHJ4X3N0YXR1cyk7CisKKwkJaWYgKCghKChyeF9zdGF0dXMgJiBSWEZTRCkgJiYgKHJ4X3N0YXR1cyAmIFJYTFNEKSkpCisJCSAgICB8fCAocnhfc3RhdHVzICYgRXJyb3JTdW1tYXJ5KSkgeworCQkJaWYgKHJ4X3N0YXR1cyAmIEVycm9yU3VtbWFyeSkgewkvKiB0aGVyZSB3YXMgYSBmYXRhbCBlcnJvciAqLworCQkJCWlmIChkZWJ1ZykKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkJICAgICAgICIlczogUmVjZWl2ZSBlcnJvciwgUnggc3RhdHVzICU4Ljh4LlxuIiwKKwkJCQkJICAgICAgIGRldi0+bmFtZSwgcnhfc3RhdHVzKTsKKworCQkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsJLyogZW5kIG9mIGEgcGFja2V0LiAqLworCQkJCWlmIChyeF9zdGF0dXMgJiAoTE9ORyB8IFJVTlQpKQorCQkJCQlucC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCWlmIChyeF9zdGF0dXMgJiBSWEVSKQorCQkJCQlucC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJaWYgKHJ4X3N0YXR1cyAmIENSQykKKwkJCQkJbnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCX0gZWxzZSB7CisJCQkJaW50IG5lZWRfdG9fcmVzZXQgPSAwOworCQkJCWludCBkZXNubyA9IDA7CisKKwkJCQlpZiAocnhfc3RhdHVzICYgUlhGU0QpIHsJLyogdGhpcyBwa3QgaXMgdG9vIGxvbmcsIG92ZXIgb25lIHJ4IGJ1ZmZlciAqLworCQkJCQlzdHJ1Y3QgZmVhbG54X2Rlc2MgKmN1cjsKKworCQkJCQkvKiBjaGVjayB0aGlzIHBhY2tldCBpcyByZWNlaXZlZCBjb21wbGV0ZWx5PyAqLworCQkJCQljdXIgPSBucC0+Y3VyX3J4OworCQkJCQl3aGlsZSAoZGVzbm8gPD0gbnAtPnJlYWxseV9yeF9jb3VudCkgeworCQkJCQkJKytkZXNubzsKKwkJCQkJCWlmICgoIShjdXItPnN0YXR1cyAmIFJYT1dOKSkKKwkJCQkJCSAgICAmJiAoY3VyLT5zdGF0dXMgJiBSWExTRCkpCisJCQkJCQkJYnJlYWs7CisJCQkJCQkvKiBnb3RvIG5leHQgcnggZGVzY3JpcHRvciAqLworCQkJCQkJY3VyID0gY3VyLT5uZXh0X2Rlc2NfbG9naWNhbDsKKwkJCQkJfQorCQkJCQlpZiAoZGVzbm8gPiBucC0+cmVhbGx5X3J4X2NvdW50KQorCQkJCQkJbmVlZF90b19yZXNldCA9IDE7CisJCQkJfSBlbHNlCS8qIFJYTFNEIGRpZCBub3QgZmluZCwgc29tZXRoaW5nIGVycm9yICovCisJCQkJCW5lZWRfdG9fcmVzZXQgPSAxOworCisJCQkJaWYgKG5lZWRfdG9fcmVzZXQgPT0gMCkgeworCQkJCQlpbnQgaTsKKworCQkJCQlucC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCisJCQkJCS8qIGZyZWUgYWxsIHJ4IGRlc2NyaXB0b3JzIHJlbGF0ZWQgdGhpcyBsb25nIHBrdCAqLworCQkJCQlmb3IgKGkgPSAwOyBpIDwgZGVzbm87ICsraSkgeworCQkJCQkJaWYgKCFucC0+Y3VyX3J4LT5za2J1ZmYpIHsKKwkJCQkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCQkJCQkiJXM6IEknbSBzY2FyZWRcbiIsIGRldi0+bmFtZSk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlucC0+Y3VyX3J4LT5zdGF0dXMgPSBSWE9XTjsKKwkJCQkJCW5wLT5jdXJfcnggPSBucC0+Y3VyX3J4LT5uZXh0X2Rlc2NfbG9naWNhbDsKKwkJCQkJfQorCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UgeyAgICAgICAgLyogcnggZXJyb3IsIG5lZWQgdG8gcmVzZXQgdGhpcyBjaGlwICovCisJCQkJCXN0b3BfbmljX3J4KGlvYWRkciwgbnAtPmNydmFsdWUpOworCQkJCQlyZXNldF9yeF9kZXNjcmlwdG9ycyhkZXYpOworCQkJCQlpb3dyaXRlMzIobnAtPmNydmFsdWUsIGlvYWRkciArIFRDUlJDUik7CisJCQkJfQorCQkJCWJyZWFrOwkvKiBleGl0IHRoZSB3aGlsZSBsb29wICovCisJCQl9CisJCX0gZWxzZSB7CS8qIHRoaXMgcmVjZWl2ZWQgcGt0IGlzIG9rICovCisKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisJCQkvKiBPbWl0IHRoZSBmb3VyIG9jdGV0IENSQyBmcm9tIHRoZSBsZW5ndGguICovCisJCQlzaG9ydCBwa3RfbGVuID0gKChyeF9zdGF0dXMgJiBGTE5HTUFTSykgPj4gRkxOR1NoaWZ0KSAtIDQ7CisKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQkJaWYgKGRlYnVnKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIgIG5ldGRldl9yeCgpIG5vcm1hbCBSeCBwa3QgbGVuZ3RoICVkIgorCQkJCSAgICAgICAiIHN0YXR1cyAleC5cbiIsIHBrdF9sZW4sIHJ4X3N0YXR1cyk7CisjZW5kaWYKKworCQkJLyogQ2hlY2sgaWYgdGhlIHBhY2tldCBpcyBsb25nIGVub3VnaCB0byBhY2NlcHQgd2l0aG91dCBjb3B5aW5nCisJCQkgICB0byBhIG1pbmltYWxseS1zaXplZCBza2J1ZmYuICovCisJCQlpZiAocGt0X2xlbiA8IHJ4X2NvcHlicmVhayAmJgorCQkJICAgIChza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKSkgIT0gTlVMTCkgeworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLworCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShucC0+cGNpX2RldiwKKwkJCQkJCQkgICAgbnAtPmN1cl9yeC0+YnVmZmVyLAorCQkJCQkJCSAgICBucC0+cnhfYnVmX3N6LAorCQkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCS8qIENhbGwgY29weSArIGNrc3VtIGlmIGF2YWlsYWJsZS4gKi8KKworI2lmICEgZGVmaW5lZChfX2FscGhhX18pCisJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIAorCQkJCQlucC0+Y3VyX3J4LT5za2J1ZmYtPnRhaWwsIHBrdF9sZW4sIDApOworCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKyNlbHNlCisJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBwa3RfbGVuKSwKKwkJCQkJbnAtPmN1cl9yeC0+c2tidWZmLT50YWlsLCBwa3RfbGVuKTsKKyNlbmRpZgorCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShucC0+cGNpX2RldiwKKwkJCQkJCQkgICAgICAgbnAtPmN1cl9yeC0+YnVmZmVyLAorCQkJCQkJCSAgICAgICBucC0+cnhfYnVmX3N6LAorCQkJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJfSBlbHNlIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LAorCQkJCQkJIG5wLT5jdXJfcngtPmJ1ZmZlciwKKwkJCQkJCSBucC0+cnhfYnVmX3N6LAorCQkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJc2tiX3B1dChza2IgPSBucC0+Y3VyX3J4LT5za2J1ZmYsIHBrdF9sZW4pOworCQkJCW5wLT5jdXJfcngtPnNrYnVmZiA9IE5VTEw7CisJCQkJLS1ucC0+cmVhbGx5X3J4X2NvdW50OworCQkJfQorCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJbnAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCW5wLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQl9CisKKwkJbnAtPmN1cl9yeCA9IG5wLT5jdXJfcngtPm5leHRfZGVzY19sb2dpY2FsOworCX0JCQkvKiBlbmQgb2Ygd2hpbGUgbG9vcCAqLworCisJLyogIGFsbG9jYXRlIHNrYiBmb3IgcnggYnVmZmVycyAqLworCWFsbG9jYXRlX3J4X2J1ZmZlcnMoZGV2KTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+bWVtOworCisJLyogVGhlIGNoaXAgb25seSBuZWVkIHJlcG9ydCBmcmFtZSBzaWxlbnRseSBkcm9wcGVkLiAqLworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJbnAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gaW9yZWFkMzIoaW9hZGRyICsgVEFMTFkpICYgMHg3ZmZmOworCQlucC0+c3RhdHMucnhfY3JjX2Vycm9ycyArPSAoaW9yZWFkMzIoaW9hZGRyICsgVEFMTFkpICYgMHg3ZmZmMDAwMCkgPj4gMTY7CisJfQorCisJcmV0dXJuICZucC0+c3RhdHM7Cit9CisKKworLyogZm9yIGRldi0+c2V0X211bHRpY2FzdF9saXN0ICovCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNwaW5sb2NrX3QgKmxwID0gJigoc3RydWN0IG5ldGRldl9wcml2YXRlICopbmV0ZGV2X3ByaXYoZGV2KSktPmxvY2s7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZShscCwgZmxhZ3MpOworCV9fc2V0X3J4X21vZGUoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxwLCBmbGFncyk7Cit9CisKKworLyogVGFrZSBsb2NrIGJlZm9yZSBjYWxsaW5nICovCitzdGF0aWMgdm9pZCBfX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+bWVtOworCXUzMiBtY19maWx0ZXJbMl07CS8qIE11bHRpY2FzdCBoYXNoIGZpbHRlciAqLworCXUzMiByeF9tb2RlOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewkvKiBTZXQgcHJvbWlzY3VvdXMuICovCisJCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICovCisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CisJCW1lbXNldChtY19maWx0ZXIsIDB4ZmYsIHNpemVvZihtY19maWx0ZXIpKTsKKwkJcnhfbW9kZSA9IENSX1dfUFJPTSB8IENSX1dfQUIgfCBDUl9XX0FNOworCX0gZWxzZSBpZiAoKGRldi0+bWNfY291bnQgPiBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0KQorCQkgICB8fCAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKKwkJLyogVG9vIG1hbnkgdG8gbWF0Y2gsIG9yIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KKwkJbWVtc2V0KG1jX2ZpbHRlciwgMHhmZiwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCQlyeF9tb2RlID0gQ1JfV19BQiB8IENSX1dfQU07CisJfSBlbHNlIHsKKwkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJCWludCBpOworCisJCW1lbXNldChtY19maWx0ZXIsIDAsIHNpemVvZihtY19maWx0ZXIpKTsKKwkJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7CisJCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCXVuc2lnbmVkIGludCBiaXQ7CisJCQliaXQgPSAoZXRoZXJfY3JjKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKSA+PiAyNikgXiAweDNGOworCQkJbWNfZmlsdGVyW2JpdCA+PiA1XSB8PSAoMSA8PCBiaXQpOworCQl9CisJCXJ4X21vZGUgPSBDUl9XX0FCIHwgQ1JfV19BTTsKKwl9CisKKwlzdG9wX25pY19yeHR4KGlvYWRkciwgbnAtPmNydmFsdWUpOworCisJaW93cml0ZTMyKG1jX2ZpbHRlclswXSwgaW9hZGRyICsgTUFSMCk7CisJaW93cml0ZTMyKG1jX2ZpbHRlclsxXSwgaW9hZGRyICsgTUFSMSk7CisJbnAtPmNydmFsdWUgJj0gfkNSX1dfUlhNT0RFTUFTSzsKKwlucC0+Y3J2YWx1ZSB8PSByeF9tb2RlOworCWlvd3JpdGUzMihucC0+Y3J2YWx1ZSwgaW9hZGRyICsgVENSUkNSKTsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgbmV0ZGV2X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJcmMgPSBtaWlfZXRodG9vbF9nc2V0KCZucC0+bWlpLCBjbWQpOworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG5ldGRldl9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCXJjID0gbWlpX2V0aHRvb2xfc3NldCgmbnAtPm1paSwgY21kKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBuZXRkZXZfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiBtaWlfbndheV9yZXN0YXJ0KCZucC0+bWlpKTsKK30KKworc3RhdGljIHUzMiBuZXRkZXZfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbWlpX2xpbmtfb2soJm5wLT5taWkpOworfQorCitzdGF0aWMgdTMyIG5ldGRldl9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGVidWc7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbHVlKQoreworCWRlYnVnID0gdmFsdWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBuZXRkZXZfZ2V0X2RydmluZm8sCisJLmdldF9zZXR0aW5ncwkJPSBuZXRkZXZfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gbmV0ZGV2X3NldF9zZXR0aW5ncywKKwkubndheV9yZXNldAkJPSBuZXRkZXZfbndheV9yZXNldCwKKwkuZ2V0X2xpbmsJCT0gbmV0ZGV2X2dldF9saW5rLAorCS5nZXRfbXNnbGV2ZWwJCT0gbmV0ZGV2X2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCQk9IG5ldGRldl9zZXRfbXNnbGV2ZWwsCisJLmdldF9zZwkJCT0gZXRodG9vbF9vcF9nZXRfc2csCisJLmdldF90eF9jc3VtCQk9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCit9OworCitzdGF0aWMgaW50IG1paV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByYzsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyYyA9IGdlbmVyaWNfbWlpX2lvY3RsKCZucC0+bWlpLCBpZl9taWkocnEpLCBjbWQsIE5VTEwpOworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBpbnQgbmV0ZGV2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+bWVtOworCWludCBpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGJ5IGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlpb3dyaXRlMzIoMHgwMDAwLCBpb2FkZHIgKyBJTVIpOworCisJLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBwcm9jZXNzZXMuICovCisJc3RvcF9uaWNfcnh0eChpb2FkZHIsIDApOworCisJZGVsX3RpbWVyX3N5bmMoJm5wLT50aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJm5wLT5yZXNldF90aW1lcik7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCS8qIEZyZWUgYWxsIHRoZSBza2J1ZmZzIGluIHRoZSBSeCBxdWV1ZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IG5wLT5yeF9yaW5nW2ldLnNrYnVmZjsKKworCQlucC0+cnhfcmluZ1tpXS5zdGF0dXMgPSAwOworCQlpZiAoc2tiKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBucC0+cnhfcmluZ1tpXS5idWZmZXIsCisJCQkJbnAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCW5wLT5yeF9yaW5nW2ldLnNrYnVmZiA9IE5VTEw7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IG5wLT50eF9yaW5nW2ldLnNrYnVmZjsKKworCQlpZiAoc2tiKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBucC0+dHhfcmluZ1tpXS5idWZmZXIsCisJCQkJc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJbnAtPnR4X3JpbmdbaV0uc2tidWZmID0gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZmVhbG54X3BjaV90YmxbXSA9IHsKKwl7MHgxNTE2LCAweDA4MDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsweDE1MTYsIDB4MDgwMywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMX0sCisJezB4MTUxNiwgMHgwODkxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAyfSwKKwl7fSAvKiB0ZXJtaW5hdGUgbGlzdCAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBmZWFsbnhfcGNpX3RibCk7CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGZlYWxueF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImZlYWxueCIsCisJLmlkX3RhYmxlCT0gZmVhbG54X3BjaV90YmwsCisJLnByb2JlCQk9IGZlYWxueF9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGZlYWxueF9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGZlYWxueF9pbml0KHZvaWQpCit7CisvKiB3aGVuIGEgbW9kdWxlLCB0aGlzIGlzIHByaW50ZWQgd2hldGhlciBvciBub3QgZGV2aWNlcyBhcmUgZm91bmQgaW4gcHJvYmUgKi8KKyNpZmRlZiBNT0RVTEUKKwlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmZlYWxueF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmVhbG54X2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmZlYWxueF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChmZWFsbnhfaW5pdCk7Cittb2R1bGVfZXhpdChmZWFsbnhfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mZWMuYyBiL2RyaXZlcnMvbmV0L2ZlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNzAwODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9mZWMuYwpAQCAtMCwwICsxLDIyNTkgQEAKKy8qCisgKiBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKEZFQykgZHJpdmVyIGZvciBNb3Rvcm9sYSBNUEM4eHguCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcgRGFuIE1hbGVrIChkbWFsZWtAamxjLm5ldCkKKyAqCisgKiBUaGlzIHZlcnNpb24gb2YgdGhlIGRyaXZlciBpcyBzcGVjaWZpYyB0byB0aGUgRkFEUyBpbXBsZW1lbnRhdGlvbiwKKyAqIHNpbmNlIHRoZSBib2FyZCBjb250YWlucyBjb250cm9sIHJlZ2lzdGVycyBleHRlcm5hbCB0byB0aGUgcHJvY2Vzc29yCisgKiBmb3IgdGhlIGNvbnRyb2wgb2YgdGhlIExldmVsT25lIExYVDk3MCB0cmFuc2NlaXZlci4gIFRoZSBNUEM4NjBUIG1hbnVhbAorICogZGVzY3JpYmVzIGNvbm5lY3Rpb25zIHVzaW5nIHRoZSBpbnRlcm5hbCBwYXJhbGxlbCBwb3J0IEkvTywgd2hpY2gKKyAqIGlzIGJhc2ljYWxseSBhbGwgb2YgUG9ydCBELgorICoKKyAqIFJpZ2h0IG5vdywgSSBhbSB2ZXJ5IHdhdHNlZnVsIHdpdGggdGhlIGJ1ZmZlcnMuICBJIGFsbG9jYXRlIG1lbW9yeQorICogcGFnZXMgYW5kIHRoZW4gZGl2aWRlIHRoZW0gaW50byAySyBmcmFtZSBidWZmZXJzLiAgVGhpcyB3YXkgSSBrbm93IEkKKyAqIGhhdmUgYnVmZmVycyBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvbmUgZnJhbWUgd2l0aGluIG9uZSBidWZmZXIgZGVzY3JpcHRvci4KKyAqIE9uY2UgSSBnZXQgdGhpcyB3b3JraW5nLCBJIHdpbGwgdXNlIDY0IG9yIDEyOCBieXRlIENQTSBidWZmZXJzLCB3aGljaAorICogd2lsbCBiZSBtdWNoIG1vcmUgbWVtb3J5IGVmZmljaWVudCBhbmQgd2lsbCBlYXNpbHkgaGFuZGxlIGxvdHMgb2YKKyAqIHNtYWxsIHBhY2tldHMuCisgKgorICogTXVjaCBiZXR0ZXIgbXVsdGlwbGUgUEhZIHN1cHBvcnQgYnkgTWFnbnVzIERhbW0uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgRXJpY3Nzb24gUmFkaW8gU3lzdGVtcyBBQi4KKyAqCisgKiBTdXBwb3J0IGZvciBGRUMgY29udHJvbGxlciBvZiBDb2xkRmlyZS81MjcwLzUyNzEvNTI3Mi81Mjc0LzUyNzUvNTI4MC81MjgyLgorICogQ29weXJ1Z2h0IChjKSAyMDAxLTIwMDQgR3JlZyBVbmdlcmVyIChnZXJnQHNuYXBnZWFyLmNvbSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX001Mjd4KSB8fCBkZWZpbmVkKENPTkZJR19NNTI3MikgfHwgZGVmaW5lZChDT05GSUdfTTUyOHgpCisjaW5jbHVkZSA8YXNtL2NvbGRmaXJlLmg+CisjaW5jbHVkZSA8YXNtL21jZnNpbS5oPgorI2luY2x1ZGUgImZlYy5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc20vOHh4X2ltbWFwLmg+CisjaW5jbHVkZSA8YXNtL21wYzh4eC5oPgorI2luY2x1ZGUgImNvbW1wcm9jLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0ZFQzIpCisjZGVmaW5lCUZFQ19NQVhfUE9SVFMJMgorI2Vsc2UKKyNkZWZpbmUJRkVDX01BWF9QT1JUUwkxCisjZW5kaWYKKworLyoKKyAqIERlZmluZSB0aGUgZml4ZWQgYWRkcmVzcyBvZiB0aGUgRkVDIGhhcmR3YXJlLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGZlY19od1tdID0geworI2lmIGRlZmluZWQoQ09ORklHX001MjcyKQorCShNQ0ZfTUJBUiArIDB4ODQwKSwKKyNlbGlmIGRlZmluZWQoQ09ORklHX001Mjd4KQorCShNQ0ZfTUJBUiArIDB4MTAwMCksCisJKE1DRl9NQkFSICsgMHgxODAwKSwKKyNlbGlmIGRlZmluZWQoQ09ORklHX001Mjh4KQorCShNQ0ZfTUJBUiArIDB4MTAwMCksCisjZWxzZQorCSYoKChpbW1hcF90ICopSU1BUF9BRERSKS0+aW1fY3BtLmNwX2ZlYyksCisjZW5kaWYKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCWZlY19tYWNfZGVmYXVsdFtdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCit9OworCisvKgorICogU29tZSBoYXJkd2FyZSBnZXRzIGl0IE1BQyBhZGRyZXNzIG91dCBvZiBsb2NhbCBmbGFzaCBtZW1vcnkuCisgKiBpZiB0aGlzIGlzIG5vbi16ZXJvIHRoZW4gYXNzdW1lIGl0IGlzIHRoZSBhZGRyZXNzIHRvIGdldCBNQUMgZnJvbS4KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX05FVHRlbCkKKyNkZWZpbmUJRkVDX0ZMQVNITUFDCTB4ZjAwMDYwMDYKKyNlbGlmIGRlZmluZWQoQ09ORklHX0dJTEJBUkNPTkFQKSB8fCBkZWZpbmVkKENPTkZJR19TQ0FMRVMpCisjZGVmaW5lCUZFQ19GTEFTSE1BQwkweGYwMDA2MDAwCisjZWxpZiBkZWZpbmVkIChDT05GSUdfTVREX0tleVRlY2hub2xvZ3kpCisjZGVmaW5lCUZFQ19GTEFTSE1BQwkweGZmZTA0MDAwCisjZWxpZiBkZWZpbmVkKENPTkZJR19DQU5DYW0pCisjZGVmaW5lCUZFQ19GTEFTSE1BQwkweGYwMDIwMDAwCisjZWxzZQorI2RlZmluZQlGRUNfRkxBU0hNQUMJMAorI2VuZGlmCisKK3Vuc2lnbmVkIGNoYXIgKmZlY19mbGFzaG1hYyA9ICh1bnNpZ25lZCBjaGFyICopIEZFQ19GTEFTSE1BQzsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2Ygc29tZSBzdHJ1Y3R1cmVzIHRvIHN1cHBvcnQgZGlmZmVyZW50IFBIWXMKKyovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50IG1paV9kYXRhOworCXZvaWQgKCpmdW5jdCkodWludCBtaWlfcmVnLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK30gcGh5X2NtZF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludCBpZDsKKwljaGFyICpuYW1lOworCisJY29uc3QgcGh5X2NtZF90ICpjb25maWc7CisJY29uc3QgcGh5X2NtZF90ICpzdGFydHVwOworCWNvbnN0IHBoeV9jbWRfdCAqYWNrX2ludDsKKwljb25zdCBwaHlfY21kX3QgKnNodXRkb3duOworfSBwaHlfaW5mb190OworCisvKiBUaGUgbnVtYmVyIG9mIFR4IGFuZCBSeCBidWZmZXJzLiAgVGhlc2UgYXJlIGFsbG9jYXRlZCBmcm9tIHRoZSBwYWdlCisgKiBwb29sLiAgVGhlIGNvZGUgbWF5IGFzc3VtZSB0aGVzZSBhcmUgcG93ZXIgb2YgdHdvLCBzbyBpdCBpdCBiZXN0CisgKiB0byBrZWVwIHRoZW0gdGhhdCBzaXplLgorICogV2UgZG9uJ3QgbmVlZCB0byBhbGxvY2F0ZSBwYWdlcyBmb3IgdGhlIHRyYW5zbWl0dGVyLiAgV2UganVzdCB1c2UKKyAqIHRoZSBza2J1ZmZlciBkaXJlY3RseS4KKyAqLworI2RlZmluZSBGRUNfRU5FVF9SWF9QQUdFUwk4CisjZGVmaW5lIEZFQ19FTkVUX1JYX0ZSU0laRQkyMDQ4CisjZGVmaW5lIEZFQ19FTkVUX1JYX0ZSUFBHCShQQUdFX1NJWkUgLyBGRUNfRU5FVF9SWF9GUlNJWkUpCisjZGVmaW5lIFJYX1JJTkdfU0laRQkJKEZFQ19FTkVUX1JYX0ZSUFBHICogRkVDX0VORVRfUlhfUEFHRVMpCisjZGVmaW5lIEZFQ19FTkVUX1RYX0ZSU0laRQkyMDQ4CisjZGVmaW5lIEZFQ19FTkVUX1RYX0ZSUFBHCShQQUdFX1NJWkUgLyBGRUNfRU5FVF9UWF9GUlNJWkUpCisjZGVmaW5lIFRYX1JJTkdfU0laRQkJMTYJLyogTXVzdCBiZSBwb3dlciBvZiB0d28gKi8KKyNkZWZpbmUgVFhfUklOR19NT0RfTUFTSwkxNQkvKiAgIGZvciB0aGlzIHRvIHdvcmsgKi8KKworLyogSW50ZXJydXB0IGV2ZW50cy9tYXNrcy4KKyovCisjZGVmaW5lIEZFQ19FTkVUX0hCRVJSCSgodWludCkweDgwMDAwMDAwKQkvKiBIZWFydGJlYXQgZXJyb3IgKi8KKyNkZWZpbmUgRkVDX0VORVRfQkFCUgkoKHVpbnQpMHg0MDAwMDAwMCkJLyogQmFiYmxpbmcgcmVjZWl2ZXIgKi8KKyNkZWZpbmUgRkVDX0VORVRfQkFCVAkoKHVpbnQpMHgyMDAwMDAwMCkJLyogQmFiYmxpbmcgdHJhbnNtaXR0ZXIgKi8KKyNkZWZpbmUgRkVDX0VORVRfR1JBCSgodWludCkweDEwMDAwMDAwKQkvKiBHcmFjZWZ1bCBzdG9wIGNvbXBsZXRlICovCisjZGVmaW5lIEZFQ19FTkVUX1RYRgkoKHVpbnQpMHgwODAwMDAwMCkJLyogRnVsbCBmcmFtZSB0cmFuc21pdHRlZCAqLworI2RlZmluZSBGRUNfRU5FVF9UWEIJKCh1aW50KTB4MDQwMDAwMDApCS8qIEEgYnVmZmVyIHdhcyB0cmFuc21pdHRlZCAqLworI2RlZmluZSBGRUNfRU5FVF9SWEYJKCh1aW50KTB4MDIwMDAwMDApCS8qIEZ1bGwgZnJhbWUgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgRkVDX0VORVRfUlhCCSgodWludCkweDAxMDAwMDAwKQkvKiBBIGJ1ZmZlciB3YXMgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgRkVDX0VORVRfTUlJCSgodWludCkweDAwODAwMDAwKQkvKiBNSUkgaW50ZXJydXB0ICovCisjZGVmaW5lIEZFQ19FTkVUX0VCRVJSCSgodWludCkweDAwNDAwMDAwKQkvKiBTRE1BIGJ1cyBlcnJvciAqLworCisvKiBUaGUgRkVDIHN0b3JlcyBkZXN0L3NyYy90eXBlLCBkYXRhLCBhbmQgY2hlY2tzdW0gZm9yIHJlY2VpdmUgcGFja2V0cy4KKyAqLworI2RlZmluZSBQS1RfTUFYQlVGX1NJWkUJCTE1MTgKKyNkZWZpbmUgUEtUX01JTkJVRl9TSVpFCQk2NAorI2RlZmluZSBQS1RfTUFYQkxSX1NJWkUJCTE1MjAKKworCisvKgorICogVGhlIDUyNzAvNTI3MS81MjgwLzUyODIgUlggY29udHJvbCByZWdpc3RlciBhbHNvIGNvbnRhaW5zIG1heGltdW0gZnJhbWUKKyAqIHNpemUgYml0cy4gT3RoZXIgRkVDIGhhcmR3YXJlIGRvZXMgbm90LCBzbyB3ZSBuZWVkIHRvIHRha2UgdGhhdCBpbnRvCisgKiBhY2NvdW50IHdoZW4gc2V0dGluZyBpdC4KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX001Mjd4KSB8fCBkZWZpbmVkKENPTkZJR19NNTI4eCkKKyNkZWZpbmUJT1BUX0ZSQU1FX1NJWkUJKFBLVF9NQVhCVUZfU0laRSA8PCAxNikKKyNlbHNlCisjZGVmaW5lCU9QVF9GUkFNRV9TSVpFCTAKKyNlbmRpZgorCisvKiBUaGUgRkVDIGJ1ZmZlciBkZXNjcmlwdG9ycyB0cmFjayB0aGUgcmluZyBidWZmZXJzLiAgVGhlIHJ4X2JkX2Jhc2UgYW5kCisgKiB0eF9iZF9iYXNlIGFsd2F5cyBwb2ludCB0byB0aGUgYmFzZSBvZiB0aGUgYnVmZmVyIGRlc2NyaXB0b3JzLiAgVGhlCisgKiBjdXJfcnggYW5kIGN1cl90eCBwb2ludCB0byB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBidWZmZXIuCisgKiBUaGUgZGlydHlfdHggdHJhY2tzIHRoZSBjdXJyZW50IGJ1ZmZlciB0aGF0IGlzIGJlaW5nIHNlbnQgYnkgdGhlCisgKiBjb250cm9sbGVyLiAgVGhlIGN1cl90eCBhbmQgZGlydHlfdHggYXJlIGVxdWFsIHVuZGVyIGJvdGggY29tcGxldGVseQorICogZW1wdHkgYW5kIGNvbXBsZXRlbHkgZnVsbCBjb25kaXRpb25zLiAgVGhlIGVtcHR5L3JlYWR5IGluZGljYXRvciBpbgorICogdGhlIGJ1ZmZlciBkZXNjcmlwdG9yIGRldGVybWluZXMgdGhlIGFjdHVhbCBjb25kaXRpb24uCisgKi8KK3N0cnVjdCBmZWNfZW5ldF9wcml2YXRlIHsKKwkvKiBIYXJkd2FyZSByZWdpc3RlcnMgb2YgdGhlIEZFQyBkZXZpY2UgKi8KKwl2b2xhdGlsZSBmZWNfdAkqaHdwOworCisJLyogVGhlIHNhdmVkIGFkZHJlc3Mgb2YgYSBzZW50LWluLXBsYWNlIHBhY2tldC9idWZmZXIsIGZvciBza2ZyZWUoKS4gKi8KKwl1bnNpZ25lZCBjaGFyICp0eF9ib3VuY2VbVFhfUklOR19TSVpFXTsKKwlzdHJ1Y3QJc2tfYnVmZiogdHhfc2tidWZmW1RYX1JJTkdfU0laRV07CisJdXNob3J0CXNrYl9jdXI7CisJdXNob3J0CXNrYl9kaXJ0eTsKKworCS8qIENQTSBkdWFsIHBvcnQgUkFNIHJlbGF0aXZlIGFkZHJlc3Nlcy4KKwkqLworCWNiZF90CSpyeF9iZF9iYXNlOwkJLyogQWRkcmVzcyBvZiBSeCBhbmQgVHggYnVmZmVycy4gKi8KKwljYmRfdAkqdHhfYmRfYmFzZTsKKwljYmRfdAkqY3VyX3J4LCAqY3VyX3R4OwkJLyogVGhlIG5leHQgZnJlZSByaW5nIGVudHJ5ICovCisJY2JkX3QJKmRpcnR5X3R4OwkvKiBUaGUgcmluZyBlbnRyaWVzIHRvIGJlIGZyZWUoKWVkLiAqLworCXN0cnVjdAluZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXVpbnQJdHhfZnVsbDsKKwlzcGlubG9ja190IGxvY2s7CisKKwl1aW50CXBoeV9pZDsKKwl1aW50CXBoeV9pZF9kb25lOworCXVpbnQJcGh5X3N0YXR1czsKKwl1aW50CXBoeV9zcGVlZDsKKwlwaHlfaW5mb190CSpwaHk7CisJc3RydWN0IHdvcmtfc3RydWN0IHBoeV90YXNrOworCisJdWludAlzZXF1ZW5jZV9kb25lOworCXVpbnQJbWlpX3BoeV90YXNrX3F1ZXVlZDsKKworCXVpbnQJcGh5X2FkZHI7CisKKwlpbnQJaW5kZXg7CisJaW50CW9wZW5lZDsKKwlpbnQJbGluazsKKwlpbnQJb2xkX2xpbms7CisJaW50CWZ1bGxfZHVwbGV4OworCXVuc2lnbmVkIGNoYXIgbWFjX2FkZHJbRVRIX0FMRU5dOworfTsKKworc3RhdGljIGludCBmZWNfZW5ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBmZWNfZW5ldF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZmVjX2VuZXRfbWlpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGZlY19lbmV0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICogZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOworc3RhdGljIHZvaWQgZmVjX2VuZXRfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBmZWNfZW5ldF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZmVjX2VuZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmZlY19lbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGZlY19yZXN0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBkdXBsZXgpOworc3RhdGljIHZvaWQgZmVjX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBmZWNfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisKKy8qIE1JSSBwcm9jZXNzaW5nLiAgV2Uga2VlcCB0aGlzIGFzIHNpbXBsZSBhcyBwb3NzaWJsZS4gIFJlcXVlc3RzIGFyZQorICogcGxhY2VkIG9uIHRoZSBsaXN0IChpZiB0aGVyZSBpcyByb29tKS4gIFdoZW4gdGhlIHJlcXVlc3QgaXMgZmluaXNoZWQKKyAqIGJ5IHRoZSBNSUksIGFuIG9wdGlvbmFsIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQuCisgKi8KK3R5cGVkZWYgc3RydWN0IG1paV9saXN0IHsKKwl1aW50CW1paV9yZWd2YWw7CisJdm9pZAkoKm1paV9mdW5jKSh1aW50IHZhbCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJc3RydWN0CW1paV9saXN0ICptaWlfbmV4dDsKK30gbWlpX2xpc3RfdDsKKworI2RlZmluZQkJTk1JSQkyMAorbWlpX2xpc3RfdAltaWlfY21kc1tOTUlJXTsKK21paV9saXN0X3QJKm1paV9mcmVlOworbWlpX2xpc3RfdAkqbWlpX2hlYWQ7CittaWlfbGlzdF90CSptaWlfdGFpbDsKKworc3RhdGljIGludAltaWlfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJlcXVlc3QsIAorCQkJCXZvaWQgKCpmdW5jKSh1aW50LCBzdHJ1Y3QgbmV0X2RldmljZSAqKSk7CisKKy8qIE1ha2UgTUlJIHJlYWQvd3JpdGUgY29tbWFuZHMgZm9yIHRoZSBGRUMuCisqLworI2RlZmluZSBta19taWlfcmVhZChSRUcpCSgweDYwMDIwMDAwIHwgKChSRUcgJiAweDFmKSA8PCAxOCkpCisjZGVmaW5lIG1rX21paV93cml0ZShSRUcsIFZBTCkJKDB4NTAwMjAwMDAgfCAoKFJFRyAmIDB4MWYpIDw8IDE4KSB8IFwKKwkJCQkJCShWQUwgJiAweGZmZmYpKQorI2RlZmluZSBta19taWlfZW5kCTAKKworLyogVHJhbnNtaXR0ZXIgdGltZW91dC4KKyovCisjZGVmaW5lIFRYX1RJTUVPVVQgKDIqSFopCisKKy8qIFJlZ2lzdGVyIGRlZmluaXRpb25zIGZvciB0aGUgUEhZLgorKi8KKworI2RlZmluZSBNSUlfUkVHX0NSICAgICAgICAgIDAgIC8qIENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX1JFR19TUiAgICAgICAgICAxICAvKiBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9SRUdfUEhZSVIxICAgICAgMiAgLyogUEhZIElkZW50aWZpY2F0aW9uIFJlZ2lzdGVyIDEgICAgICAgICAgICAqLworI2RlZmluZSBNSUlfUkVHX1BIWUlSMiAgICAgIDMgIC8qIFBIWSBJZGVudGlmaWNhdGlvbiBSZWdpc3RlciAyICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX1JFR19BTkFSICAgICAgICA0ICAvKiBBLU4gQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAgICAgICAgICAgICAgICovIAorI2RlZmluZSBNSUlfUkVHX0FOTFBBUiAgICAgIDUgIC8qIEEtTiBMaW5rIFBhcnRuZXIgQWJpbGl0eSBSZWdpc3RlciAgICAgICAgKi8KKyNkZWZpbmUgTUlJX1JFR19BTkVSICAgICAgICA2ICAvKiBBLU4gRXhwYW5zaW9uIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9SRUdfQU5OUFRSICAgICAgNyAgLyogQS1OIE5leHQgUGFnZSBUcmFuc21pdCBSZWdpc3RlciAgICAgICAgICAqLworI2RlZmluZSBNSUlfUkVHX0FOTFBSTlBSICAgIDggIC8qIEEtTiBMaW5rIFBhcnRuZXIgUmVjZWl2ZWQgTmV4dCBQYWdlIFJlZy4gKi8KKworLyogdmFsdWVzIGZvciBwaHlfc3RhdHVzICovCisKKyNkZWZpbmUgUEhZX0NPTkZfQU5FCTB4MDAwMSAgLyogMSBhdXRvLW5lZ290aWF0aW9uIGVuYWJsZWQgKi8KKyNkZWZpbmUgUEhZX0NPTkZfTE9PUAkweDAwMDIgIC8qIDEgbG9vcGJhY2sgbW9kZSBlbmFibGVkICovCisjZGVmaW5lIFBIWV9DT05GX1NQTUFTSwkweDAwZjAgIC8qIG1hc2sgZm9yIHNwZWVkICovCisjZGVmaW5lIFBIWV9DT05GXzEwSERYCTB4MDAxMCAgLyogMTAgTWJpdCBoYWxmIGR1cGxleCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgUEhZX0NPTkZfMTBGRFgJMHgwMDIwICAvKiAxMCBNYml0IGZ1bGwgZHVwbGV4IHN1cHBvcnRlZCAqLyAKKyNkZWZpbmUgUEhZX0NPTkZfMTAwSERYCTB4MDA0MCAgLyogMTAwIE1iaXQgaGFsZiBkdXBsZXggc3VwcG9ydGVkICovCisjZGVmaW5lIFBIWV9DT05GXzEwMEZEWAkweDAwODAgIC8qIDEwMCBNYml0IGZ1bGwgZHVwbGV4IHN1cHBvcnRlZCAqLyAKKworI2RlZmluZSBQSFlfU1RBVF9MSU5LCTB4MDEwMCAgLyogMSB1cCAtIDAgZG93biAqLworI2RlZmluZSBQSFlfU1RBVF9GQVVMVAkweDAyMDAgIC8qIDEgcmVtb3RlIGZhdWx0ICovCisjZGVmaW5lIFBIWV9TVEFUX0FOQwkweDA0MDAgIC8qIDEgYXV0by1uZWdvdGlhdGlvbiBjb21wbGV0ZQkqLworI2RlZmluZSBQSFlfU1RBVF9TUE1BU0sJMHhmMDAwICAvKiBtYXNrIGZvciBzcGVlZCAqLworI2RlZmluZSBQSFlfU1RBVF8xMEhEWAkweDEwMDAgIC8qIDEwIE1iaXQgaGFsZiBkdXBsZXggc2VsZWN0ZWQJKi8KKyNkZWZpbmUgUEhZX1NUQVRfMTBGRFgJMHgyMDAwICAvKiAxMCBNYml0IGZ1bGwgZHVwbGV4IHNlbGVjdGVkCSovIAorI2RlZmluZSBQSFlfU1RBVF8xMDBIRFgJMHg0MDAwICAvKiAxMDAgTWJpdCBoYWxmIGR1cGxleCBzZWxlY3RlZCAqLworI2RlZmluZSBQSFlfU1RBVF8xMDBGRFgJMHg4MDAwICAvKiAxMDAgTWJpdCBmdWxsIGR1cGxleCBzZWxlY3RlZCAqLyAKKworCitzdGF0aWMgaW50CitmZWNfZW5ldF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcDsKKwl2b2xhdGlsZSBmZWNfdAkqZmVjcDsKKwl2b2xhdGlsZSBjYmRfdAkqYmRwOworCisJZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlmZWNwID0gKHZvbGF0aWxlIGZlY190KilkZXYtPmJhc2VfYWRkcjsKKworCWlmICghZmVwLT5saW5rKSB7CisJCS8qIExpbmsgaXMgZG93biBvciBhdXRvbmVnb3RpYXRpb24gaXMgaW4gcHJvZ3Jlc3MuICovCisJCXJldHVybiAxOworCX0KKworCS8qIEZpbGwgaW4gYSBUeCByaW5nIGVudHJ5ICovCisJYmRwID0gZmVwLT5jdXJfdHg7CisKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCWlmIChiZHAtPmNiZF9zYyAmIEJEX0VORVRfVFhfUkVBRFkpIHsKKwkJLyogT29vcHMuICBBbGwgdHJhbnNtaXQgYnVmZmVycyBhcmUgZnVsbC4gIEJhaWwgb3V0LgorCQkgKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCBzaW5jZSBkZXYtPnRidXN5IHNob3VsZCBiZSBzZXQuCisJCSAqLworCQlwcmludGsoIiVzOiB0eCBxdWV1ZSBmdWxsIS5cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCisJLyogQ2xlYXIgYWxsIG9mIHRoZSBzdGF0dXMgZmxhZ3MuCisJICovCisJYmRwLT5jYmRfc2MgJj0gfkJEX0VORVRfVFhfU1RBVFM7CisKKwkvKiBTZXQgYnVmZmVyIGxlbmd0aCBhbmQgYnVmZmVyIHBvaW50ZXIuCisJKi8KKwliZHAtPmNiZF9idWZhZGRyID0gX19wYShza2ItPmRhdGEpOworCWJkcC0+Y2JkX2RhdGxlbiA9IHNrYi0+bGVuOworCisJLyoKKwkgKglPbiBzb21lIEZFQyBpbXBsZW1lbnRhdGlvbnMgZGF0YSBtdXN0IGJlIGFsaWduZWQgb24KKwkgKgk0LWJ5dGUgYm91bmRhcmllcy4gVXNlIGJvdW5jZSBidWZmZXJzIHRvIGNvcHkgZGF0YQorCSAqCWFuZCBnZXQgaXQgYWxpZ25lZC4gVWdoLgorCSAqLworCWlmIChiZHAtPmNiZF9idWZhZGRyICYgMHgzKSB7CisJCXVuc2lnbmVkIGludCBpbmRleDsKKwkJaW5kZXggPSBiZHAgLSBmZXAtPnR4X2JkX2Jhc2U7CisJCW1lbWNweShmZXAtPnR4X2JvdW5jZVtpbmRleF0sICh2b2lkICopIGJkcC0+Y2JkX2J1ZmFkZHIsIGJkcC0+Y2JkX2RhdGxlbik7CisJCWJkcC0+Y2JkX2J1ZmFkZHIgPSBfX3BhKGZlcC0+dHhfYm91bmNlW2luZGV4XSk7CisJfQorCisJLyogU2F2ZSBza2IgcG9pbnRlci4KKwkqLworCWZlcC0+dHhfc2tidWZmW2ZlcC0+c2tiX2N1cl0gPSBza2I7CisKKwlmZXAtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCWZlcC0+c2tiX2N1ciA9IChmZXAtPnNrYl9jdXIrMSkgJiBUWF9SSU5HX01PRF9NQVNLOworCQorCS8qIFB1c2ggdGhlIGRhdGEgY2FjaGUgc28gdGhlIENQTSBkb2VzIG5vdCBnZXQgc3RhbGUgbWVtb3J5CisJICogZGF0YS4KKwkgKi8KKwlmbHVzaF9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhICsgc2tiLT5sZW4pOworCisJc3Bpbl9sb2NrX2lycSgmZmVwLT5sb2NrKTsKKworCS8qIFNlbmQgaXQgb24gaXRzIHdheS4gIFRlbGwgRkVDIGl0cyByZWFkeSwgaW50ZXJydXB0IHdoZW4gZG9uZSwKKwkgKiBpdHMgdGhlIGxhc3QgQkQgb2YgdGhlIGZyYW1lLCBhbmQgdG8gcHV0IHRoZSBDUkMgb24gdGhlIGVuZC4KKwkgKi8KKworCWJkcC0+Y2JkX3NjIHw9IChCRF9FTkVUX1RYX1JFQURZIHwgQkRfRU5FVF9UWF9JTlRSCisJCQl8IEJEX0VORVRfVFhfTEFTVCB8IEJEX0VORVRfVFhfVEMpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwkvKiBUcmlnZ2VyIHRyYW5zbWlzc2lvbiBzdGFydCAqLworCWZlY3AtPmZlY194X2Rlc19hY3RpdmUgPSAweDAxMDAwMDAwOworCisJLyogSWYgdGhpcyB3YXMgdGhlIGxhc3QgQkQgaW4gdGhlIHJpbmcsIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgYWdhaW4uCisJKi8KKwlpZiAoYmRwLT5jYmRfc2MgJiBCRF9FTkVUX1RYX1dSQVApIHsKKwkJYmRwID0gZmVwLT50eF9iZF9iYXNlOworCX0gZWxzZSB7CisJCWJkcCsrOworCX0KKworCWlmIChiZHAgPT0gZmVwLT5kaXJ0eV90eCkgeworCQlmZXAtPnR4X2Z1bGwgPSAxOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJfQorCisJZmVwLT5jdXJfdHggPSAoY2JkX3QgKiliZHA7CisKKwlzcGluX3VubG9ja19pcnEoJmZlcC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2ZlY190aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlwcmludGsoIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQuXG4iLCBkZXYtPm5hbWUpOworCWZlcC0+c3RhdHMudHhfZXJyb3JzKys7CisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwl7CisJaW50CWk7CisJY2JkX3QJKmJkcDsKKworCXByaW50aygiUmluZyBkYXRhIGR1bXA6IGN1cl90eCAlbHglcywgZGlydHlfdHggJWx4IGN1cl9yeDogJWx4XG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZylmZXAtPmN1cl90eCwgZmVwLT50eF9mdWxsID8gIiAoZnVsbCkiIDogIiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKWZlcC0+ZGlydHlfdHgsCisJICAgICAgICh1bnNpZ25lZCBsb25nKWZlcC0+Y3VyX3J4KTsKKworCWJkcCA9IGZlcC0+dHhfYmRfYmFzZTsKKwlwcmludGsoIiB0eDogJXUgYnVmZmVyc1xuIiwgIFRYX1JJTkdfU0laRSk7CisJZm9yIChpID0gMCA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlwcmludGsoIiAgJTA4eDogJTA0eCAlMDR4ICUwOHhcbiIsIAorCQkgICAgICAgKHVpbnQpIGJkcCwKKwkJICAgICAgIGJkcC0+Y2JkX3NjLAorCQkgICAgICAgYmRwLT5jYmRfZGF0bGVuLAorCQkgICAgICAgKGludCkgYmRwLT5jYmRfYnVmYWRkcik7CisJCWJkcCsrOworCX0KKworCWJkcCA9IGZlcC0+cnhfYmRfYmFzZTsKKwlwcmludGsoIiByeDogJWx1IGJ1ZmZlcnNcbiIsICAodW5zaWduZWQgbG9uZykgUlhfUklOR19TSVpFKTsKKwlmb3IgKGkgPSAwIDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXByaW50aygiICAlMDh4OiAlMDR4ICUwNHggJTA4eFxuIiwKKwkJICAgICAgICh1aW50KSBiZHAsCisJCSAgICAgICBiZHAtPmNiZF9zYywKKwkJICAgICAgIGJkcC0+Y2JkX2RhdGxlbiwKKwkJICAgICAgIChpbnQpIGJkcC0+Y2JkX2J1ZmFkZHIpOworCQliZHArKzsKKwl9CisJfQorI2VuZGlmCisJZmVjX3Jlc3RhcnQoZGV2LCAwKTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qIFRoZSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqIFRoaXMgaXMgY2FsbGVkIGZyb20gdGhlIE1QQyBjb3JlIGludGVycnVwdC4KKyAqLworc3RhdGljIGlycXJldHVybl90CitmZWNfZW5ldF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdAluZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJdm9sYXRpbGUgZmVjX3QJKmZlY3A7CisJdWludAlpbnRfZXZlbnRzOworCWludCBoYW5kbGVkID0gMDsKKworCWZlY3AgPSAodm9sYXRpbGUgZmVjX3QqKWRldi0+YmFzZV9hZGRyOworCisJLyogR2V0IHRoZSBpbnRlcnJ1cHQgZXZlbnRzIHRoYXQgY2F1c2VkIHVzIHRvIGJlIGhlcmUuCisJKi8KKwl3aGlsZSAoKGludF9ldmVudHMgPSBmZWNwLT5mZWNfaWV2ZW50KSAhPSAwKSB7CisJCWZlY3AtPmZlY19pZXZlbnQgPSBpbnRfZXZlbnRzOworCisJCS8qIEhhbmRsZSByZWNlaXZlIGV2ZW50IGluIGl0cyBvd24gZnVuY3Rpb24uCisJCSAqLworCQlpZiAoaW50X2V2ZW50cyAmIEZFQ19FTkVUX1JYRikgeworCQkJaGFuZGxlZCA9IDE7CisJCQlmZWNfZW5ldF9yeChkZXYpOworCQl9CisKKwkJLyogVHJhbnNtaXQgT0ssIG9yIG5vbi1mYXRhbCBlcnJvci4gVXBkYXRlIHRoZSBidWZmZXIKKwkJICAgZGVzY3JpcHRvcnMuIEZFQyBoYW5kbGVzIGFsbCBlcnJvcnMsIHdlIGp1c3QgZGlzY292ZXIKKwkJICAgdGhlbSBhcyBwYXJ0IG9mIHRoZSB0cmFuc21pdCBwcm9jZXNzLgorCQkqLworCQlpZiAoaW50X2V2ZW50cyAmIEZFQ19FTkVUX1RYRikgeworCQkJaGFuZGxlZCA9IDE7CisJCQlmZWNfZW5ldF90eChkZXYpOworCQl9CisKKwkJaWYgKGludF9ldmVudHMgJiBGRUNfRU5FVF9NSUkpIHsKKwkJCWhhbmRsZWQgPSAxOworCQkJZmVjX2VuZXRfbWlpKGRldik7CisJCX0KKwkKKwl9CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKworc3RhdGljIHZvaWQKK2ZlY19lbmV0X3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0CWZlY19lbmV0X3ByaXZhdGUgKmZlcDsKKwl2b2xhdGlsZSBjYmRfdAkqYmRwOworCXN0cnVjdAlza19idWZmCSpza2I7CisKKwlmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNwaW5fbG9jaygmZmVwLT5sb2NrKTsKKwliZHAgPSBmZXAtPmRpcnR5X3R4OworCisJd2hpbGUgKChiZHAtPmNiZF9zYyZCRF9FTkVUX1RYX1JFQURZKSA9PSAwKSB7CisJCWlmIChiZHAgPT0gZmVwLT5jdXJfdHggJiYgZmVwLT50eF9mdWxsID09IDApIGJyZWFrOworCisJCXNrYiA9IGZlcC0+dHhfc2tidWZmW2ZlcC0+c2tiX2RpcnR5XTsKKwkJLyogQ2hlY2sgZm9yIGVycm9ycy4gKi8KKwkJaWYgKGJkcC0+Y2JkX3NjICYgKEJEX0VORVRfVFhfSEIgfCBCRF9FTkVUX1RYX0xDIHwKKwkJCQkgICBCRF9FTkVUX1RYX1JMIHwgQkRfRU5FVF9UWF9VTiB8CisJCQkJICAgQkRfRU5FVF9UWF9DU0wpKSB7CisJCQlmZXAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJaWYgKGJkcC0+Y2JkX3NjICYgQkRfRU5FVF9UWF9IQikgIC8qIE5vIGhlYXJ0YmVhdCAqLworCQkJCWZlcC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycysrOworCQkJaWYgKGJkcC0+Y2JkX3NjICYgQkRfRU5FVF9UWF9MQykgIC8qIExhdGUgY29sbGlzaW9uICovCisJCQkJZmVwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCQlpZiAoYmRwLT5jYmRfc2MgJiBCRF9FTkVUX1RYX1JMKSAgLyogUmV0cmFucyBsaW1pdCAqLworCQkJCWZlcC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWlmIChiZHAtPmNiZF9zYyAmIEJEX0VORVRfVFhfVU4pICAvKiBVbmRlcnJ1biAqLworCQkJCWZlcC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCWlmIChiZHAtPmNiZF9zYyAmIEJEX0VORVRfVFhfQ1NMKSAvKiBDYXJyaWVyIGxvc3QgKi8KKwkJCQlmZXAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCX0gZWxzZSB7CisJCQlmZXAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJfQorCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkJaWYgKGJkcC0+Y2JkX3NjICYgQkRfRU5FVF9UWF9SRUFEWSkKKwkJCXByaW50aygiSEVZISBFbmV0IHhtaXQgaW50ZXJydXB0IGFuZCBUWF9SRUFEWS5cbiIpOworI2VuZGlmCisJCS8qIERlZmVycmVkIG1lYW5zIHNvbWUgY29sbGlzaW9ucyBvY2N1cnJlZCBkdXJpbmcgdHJhbnNtaXQsCisJCSAqIGJ1dCB3ZSBldmVudHVhbGx5IHNlbnQgdGhlIHBhY2tldCBPSy4KKwkJICovCisJCWlmIChiZHAtPmNiZF9zYyAmIEJEX0VORVRfVFhfREVGKQorCQkJZmVwLT5zdGF0cy5jb2xsaXNpb25zKys7CisJICAgIAorCQkvKiBGcmVlIHRoZSBzayBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGFzdCB0cmFuc21pdC4KKwkJICovCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCWZlcC0+dHhfc2tidWZmW2ZlcC0+c2tiX2RpcnR5XSA9IE5VTEw7CisJCWZlcC0+c2tiX2RpcnR5ID0gKGZlcC0+c2tiX2RpcnR5ICsgMSkgJiBUWF9SSU5HX01PRF9NQVNLOworCSAgICAKKwkJLyogVXBkYXRlIHBvaW50ZXIgdG8gbmV4dCBidWZmZXIgZGVzY3JpcHRvciB0byBiZSB0cmFuc21pdHRlZC4KKwkJICovCisJCWlmIChiZHAtPmNiZF9zYyAmIEJEX0VORVRfVFhfV1JBUCkKKwkJCWJkcCA9IGZlcC0+dHhfYmRfYmFzZTsKKwkJZWxzZQorCQkJYmRwKys7CisJICAgIAorCQkvKiBTaW5jZSB3ZSBoYXZlIGZyZWVkIHVwIGEgYnVmZmVyLCB0aGUgcmluZyBpcyBubyBsb25nZXIKKwkJICogZnVsbC4KKwkJICovCisJCWlmIChmZXAtPnR4X2Z1bGwpIHsKKwkJCWZlcC0+dHhfZnVsbCA9IDA7CisJCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQorCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfQorCX0KKwlmZXAtPmRpcnR5X3R4ID0gKGNiZF90ICopYmRwOworCXNwaW5fdW5sb2NrKCZmZXAtPmxvY2spOworfQorCisKKy8qIER1cmluZyBhIHJlY2VpdmUsIHRoZSBjdXJfcnggcG9pbnRzIHRvIHRoZSBjdXJyZW50IGluY29taW5nIGJ1ZmZlci4KKyAqIFdoZW4gd2UgdXBkYXRlIHRocm91Z2ggdGhlIHJpbmcsIGlmIHRoZSBuZXh0IGluY29taW5nIGJ1ZmZlciBoYXMKKyAqIG5vdCBiZWVuIGdpdmVuIHRvIHRoZSBzeXN0ZW0sIHdlIGp1c3Qgc2V0IHRoZSBlbXB0eSBpbmRpY2F0b3IsCisgKiBlZmZlY3RpdmVseSB0b3NzaW5nIHRoZSBwYWNrZXQuCisgKi8KK3N0YXRpYyB2b2lkCitmZWNfZW5ldF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdAlmZWNfZW5ldF9wcml2YXRlICpmZXA7CisJdm9sYXRpbGUgZmVjX3QJKmZlY3A7CisJdm9sYXRpbGUgY2JkX3QgKmJkcDsKKwlzdHJ1Y3QJc2tfYnVmZgkqc2tiOworCXVzaG9ydAlwa3RfbGVuOworCV9fdTggKmRhdGE7CisKKwlmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWZlY3AgPSAodm9sYXRpbGUgZmVjX3QqKWRldi0+YmFzZV9hZGRyOworCisJLyogRmlyc3QsIGdyYWIgYWxsIG9mIHRoZSBzdGF0cyBmb3IgdGhlIGluY29taW5nIHBhY2tldC4KKwkgKiBUaGVzZSBnZXQgbWVzc2VkIHVwIGlmIHdlIGdldCBjYWxsZWQgZHVlIHRvIGEgYnVzeSBjb25kaXRpb24uCisJICovCisJYmRwID0gZmVwLT5jdXJfcng7CisKK3doaWxlICghKGJkcC0+Y2JkX3NjICYgQkRfRU5FVF9SWF9FTVBUWSkpIHsKKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJLyogU2luY2Ugd2UgaGF2ZSBhbGxvY2F0ZWQgc3BhY2UgdG8gaG9sZCBhIGNvbXBsZXRlIGZyYW1lLAorCSAqIHRoZSBsYXN0IGluZGljYXRvciBzaG91bGQgYmUgc2V0LgorCSAqLworCWlmICgoYmRwLT5jYmRfc2MgJiBCRF9FTkVUX1JYX0xBU1QpID09IDApCisJCXByaW50aygiRkVDIEVORVQ6IHJjdiBpcyBub3QgK2xhc3RcbiIpOworI2VuZGlmCisKKwlpZiAoIWZlcC0+b3BlbmVkKQorCQlnb3RvIHJ4X3Byb2Nlc3NpbmdfZG9uZTsKKworCS8qIENoZWNrIGZvciBlcnJvcnMuICovCisJaWYgKGJkcC0+Y2JkX3NjICYgKEJEX0VORVRfUlhfTEcgfCBCRF9FTkVUX1JYX1NIIHwgQkRfRU5FVF9SWF9OTyB8CisJCQkgICBCRF9FTkVUX1JYX0NSIHwgQkRfRU5FVF9SWF9PVikpIHsKKwkJZmVwLT5zdGF0cy5yeF9lcnJvcnMrKzsgICAgICAgCisJCWlmIChiZHAtPmNiZF9zYyAmIChCRF9FTkVUX1JYX0xHIHwgQkRfRU5FVF9SWF9TSCkpIHsKKwkJLyogRnJhbWUgdG9vIGxvbmcgb3IgdG9vIHNob3J0LiAqLworCQkJZmVwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCX0KKwkJaWYgKGJkcC0+Y2JkX3NjICYgQkRfRU5FVF9SWF9OTykJLyogRnJhbWUgYWxpZ25tZW50ICovCisJCQlmZXAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQlpZiAoYmRwLT5jYmRfc2MgJiBCRF9FTkVUX1JYX0NSKQkvKiBDUkMgRXJyb3IgKi8KKwkJCWZlcC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQlpZiAoYmRwLT5jYmRfc2MgJiBCRF9FTkVUX1JYX09WKQkvKiBGSUZPIG92ZXJydW4gKi8KKwkJCWZlcC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCX0KKworCS8qIFJlcG9ydCBsYXRlIGNvbGxpc2lvbnMgYXMgYSBmcmFtZSBlcnJvci4KKwkgKiBPbiB0aGlzIGVycm9yLCB0aGUgQkQgaXMgY2xvc2VkLCBidXQgd2UgZG9uJ3Qga25vdyB3aGF0IHdlCisJICogaGF2ZSBpbiB0aGUgYnVmZmVyLiAgU28sIGp1c3QgZHJvcCB0aGlzIGZyYW1lIG9uIHRoZSBmbG9vci4KKwkgKi8KKwlpZiAoYmRwLT5jYmRfc2MgJiBCRF9FTkVUX1JYX0NMKSB7CisJCWZlcC0+c3RhdHMucnhfZXJyb3JzKys7CisJCWZlcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCWdvdG8gcnhfcHJvY2Vzc2luZ19kb25lOworCX0KKworCS8qIFByb2Nlc3MgdGhlIGluY29taW5nIGZyYW1lLgorCSAqLworCWZlcC0+c3RhdHMucnhfcGFja2V0cysrOworCXBrdF9sZW4gPSBiZHAtPmNiZF9kYXRsZW47CisJZmVwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCWRhdGEgPSAoX191OCopX192YShiZHAtPmNiZF9idWZhZGRyKTsKKworCS8qIFRoaXMgZG9lcyAxNiBieXRlIGFsaWdubWVudCwgZXhhY3RseSB3aGF0IHdlIG5lZWQuCisJICogVGhlIHBhY2tldCBsZW5ndGggaW5jbHVkZXMgRkNTLCBidXQgd2UgZG9uJ3Qgd2FudCB0bworCSAqIGluY2x1ZGUgdGhhdCB3aGVuIHBhc3NpbmcgdXBzdHJlYW0gYXMgaXQgbWVzc2VzIHVwCisJICogYnJpZGdpbmcgYXBwbGljYXRpb25zLgorCSAqLworCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbi00KTsKKworCWlmIChza2IgPT0gTlVMTCkgeworCQlwcmludGsoIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJZmVwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJfSBlbHNlIHsKKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYl9wdXQoc2tiLHBrdF9sZW4tNCk7CS8qIE1ha2Ugcm9vbSAqLworCQlldGhfY29weV9hbmRfc3VtKHNrYiwKKwkJCQkgKHVuc2lnbmVkIGNoYXIgKilfX3ZhKGJkcC0+Y2JkX2J1ZmFkZHIpLAorCQkJCSBwa3RfbGVuLTQsIDApOworCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCQluZXRpZl9yeChza2IpOworCX0KKyAgcnhfcHJvY2Vzc2luZ19kb25lOgorCisJLyogQ2xlYXIgdGhlIHN0YXR1cyBmbGFncyBmb3IgdGhpcyBidWZmZXIuCisJKi8KKwliZHAtPmNiZF9zYyAmPSB+QkRfRU5FVF9SWF9TVEFUUzsKKworCS8qIE1hcmsgdGhlIGJ1ZmZlciBlbXB0eS4KKwkqLworCWJkcC0+Y2JkX3NjIHw9IEJEX0VORVRfUlhfRU1QVFk7CisKKwkvKiBVcGRhdGUgQkQgcG9pbnRlciB0byBuZXh0IGVudHJ5LgorCSovCisJaWYgKGJkcC0+Y2JkX3NjICYgQkRfRU5FVF9SWF9XUkFQKQorCQliZHAgPSBmZXAtPnJ4X2JkX2Jhc2U7CisJZWxzZQorCQliZHArKzsKKwkKKyNpZiAxCisJLyogRG9pbmcgdGhpcyBoZXJlIHdpbGwga2VlcCB0aGUgRkVDIHJ1bm5pbmcgd2hpbGUgd2UgcHJvY2VzcworCSAqIGluY29taW5nIGZyYW1lcy4gIE9uIGEgaGVhdmlseSBsb2FkZWQgbmV0d29yaywgd2Ugc2hvdWxkIGJlCisJICogYWJsZSB0byBrZWVwIHVwIGF0IHRoZSBleHBlbnNlIG9mIHN5c3RlbSByZXNvdXJjZXMuCisJICovCisJZmVjcC0+ZmVjX3JfZGVzX2FjdGl2ZSA9IDB4MDEwMDAwMDA7CisjZW5kaWYKKyAgIH0gLyogd2hpbGUgKCEoYmRwLT5jYmRfc2MgJiBCRF9FTkVUX1JYX0VNUFRZKSkgKi8KKwlmZXAtPmN1cl9yeCA9IChjYmRfdCAqKWJkcDsKKworI2lmIDAKKwkvKiBEb2luZyB0aGlzIGhlcmUgd2lsbCBhbGxvdyB1cyB0byBwcm9jZXNzIGFsbCBmcmFtZXMgaW4gdGhlCisJICogcmluZyBiZWZvcmUgdGhlIEZFQyBpcyBhbGxvd2VkIHRvIHB1dCBtb3JlIHRoZXJlLiAgT24gYSBoZWF2aWx5CisJICogbG9hZGVkIG5ldHdvcmssIHNvbWUgZnJhbWVzIG1heSBiZSBsb3N0LiAgVW5mb3J0dW5hdGVseSwgdGhpcworCSAqIGluY3JlYXNlcyB0aGUgaW50ZXJydXB0IG92ZXJoZWFkIHNpbmNlIHdlIGNhbiBwb3RlbnRpYWxseSB3b3JrCisJICogb3VyIHdheSBiYWNrIHRvIHRoZSBpbnRlcnJ1cHQgcmV0dXJuIG9ubHkgdG8gY29tZSByaWdodCBiYWNrCisJICogaGVyZS4KKwkgKi8KKwlmZWNwLT5mZWNfcl9kZXNfYWN0aXZlID0gMHgwMTAwMDAwMDsKKyNlbmRpZgorfQorCisKK3N0YXRpYyB2b2lkCitmZWNfZW5ldF9taWkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QJZmVjX2VuZXRfcHJpdmF0ZSAqZmVwOworCXZvbGF0aWxlIGZlY190CSplcDsKKwltaWlfbGlzdF90CSptaXA7CisJdWludAkJbWlpX3JlZzsKKworCWZlcCA9IG5ldGRldl9wcml2KGRldik7CisJZXAgPSBmZXAtPmh3cDsKKwltaWlfcmVnID0gZXAtPmZlY19taWlfZGF0YTsKKwkKKwlpZiAoKG1pcCA9IG1paV9oZWFkKSA9PSBOVUxMKSB7CisJCXByaW50aygiTUlJIGFuZCBubyBoZWFkIVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAobWlwLT5taWlfZnVuYyAhPSBOVUxMKQorCQkoKihtaXAtPm1paV9mdW5jKSkobWlpX3JlZywgZGV2KTsKKworCW1paV9oZWFkID0gbWlwLT5taWlfbmV4dDsKKwltaXAtPm1paV9uZXh0ID0gbWlpX2ZyZWU7CisJbWlpX2ZyZWUgPSBtaXA7CisKKwlpZiAoKG1pcCA9IG1paV9oZWFkKSAhPSBOVUxMKQorCQllcC0+ZmVjX21paV9kYXRhID0gbWlwLT5taWlfcmVndmFsOworfQorCitzdGF0aWMgaW50CittaWlfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJlZ3ZhbCwgdm9pZCAoKmZ1bmMpKHVpbnQsIHN0cnVjdCBuZXRfZGV2aWNlICopKQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwltaWlfbGlzdF90CSptaXA7CisJaW50CQlyZXR2YWw7CisKKwkvKiBBZGQgUEhZIGFkZHJlc3MgdG8gcmVnaXN0ZXIgY29tbWFuZC4KKwkqLworCWZlcCA9IG5ldGRldl9wcml2KGRldik7CisJcmVndmFsIHw9IGZlcC0+cGh5X2FkZHIgPDwgMjM7CisKKwlyZXR2YWwgPSAwOworCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisKKwlpZiAoKG1pcCA9IG1paV9mcmVlKSAhPSBOVUxMKSB7CisJCW1paV9mcmVlID0gbWlwLT5taWlfbmV4dDsKKwkJbWlwLT5taWlfcmVndmFsID0gcmVndmFsOworCQltaXAtPm1paV9mdW5jID0gZnVuYzsKKwkJbWlwLT5taWlfbmV4dCA9IE5VTEw7CisJCWlmIChtaWlfaGVhZCkgeworCQkJbWlpX3RhaWwtPm1paV9uZXh0ID0gbWlwOworCQkJbWlpX3RhaWwgPSBtaXA7CisJCX0KKwkJZWxzZSB7CisJCQltaWlfaGVhZCA9IG1paV90YWlsID0gbWlwOworCQkJZmVwLT5od3AtPmZlY19taWlfZGF0YSA9IHJlZ3ZhbDsKKwkJfQorCX0KKwllbHNlIHsKKwkJcmV0dmFsID0gMTsKKwl9CisKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKworCXJldHVybihyZXR2YWwpOworfQorCitzdGF0aWMgdm9pZCBtaWlfZG9fY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHBoeV9jbWRfdCAqYykKK3sKKwlpbnQgazsKKworCWlmKCFjKQorCQlyZXR1cm47CisKKwlmb3IoayA9IDA7IChjK2spLT5taWlfZGF0YSAhPSBta19taWlfZW5kOyBrKyspIHsKKwkJbWlpX3F1ZXVlKGRldiwgKGMrayktPm1paV9kYXRhLCAoYytrKS0+ZnVuY3QpOworCX0KK30KKworc3RhdGljIHZvaWQgbWlpX3BhcnNlX3NyKHVpbnQgbWlpX3JlZywgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSB1aW50ICpzID0gJihmZXAtPnBoeV9zdGF0dXMpOworCisJKnMgJj0gfihQSFlfU1RBVF9MSU5LIHwgUEhZX1NUQVRfRkFVTFQgfCBQSFlfU1RBVF9BTkMpOworCisJaWYgKG1paV9yZWcgJiAweDAwMDQpCisJCSpzIHw9IFBIWV9TVEFUX0xJTks7CisJaWYgKG1paV9yZWcgJiAweDAwMTApCisJCSpzIHw9IFBIWV9TVEFUX0ZBVUxUOworCWlmIChtaWlfcmVnICYgMHgwMDIwKQorCQkqcyB8PSBQSFlfU1RBVF9BTkM7Cit9CisKK3N0YXRpYyB2b2lkIG1paV9wYXJzZV9jcih1aW50IG1paV9yZWcsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgdWludCAqcyA9ICYoZmVwLT5waHlfc3RhdHVzKTsKKworCSpzICY9IH4oUEhZX0NPTkZfQU5FIHwgUEhZX0NPTkZfTE9PUCk7CisKKwlpZiAobWlpX3JlZyAmIDB4MTAwMCkKKwkJKnMgfD0gUEhZX0NPTkZfQU5FOworCWlmIChtaWlfcmVnICYgMHg0MDAwKQorCQkqcyB8PSBQSFlfQ09ORl9MT09QOworfQorCitzdGF0aWMgdm9pZCBtaWlfcGFyc2VfYW5hcih1aW50IG1paV9yZWcsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgdWludCAqcyA9ICYoZmVwLT5waHlfc3RhdHVzKTsKKworCSpzICY9IH4oUEhZX0NPTkZfU1BNQVNLKTsKKworCWlmIChtaWlfcmVnICYgMHgwMDIwKQorCQkqcyB8PSBQSFlfQ09ORl8xMEhEWDsKKwlpZiAobWlpX3JlZyAmIDB4MDA0MCkKKwkJKnMgfD0gUEhZX0NPTkZfMTBGRFg7CisJaWYgKG1paV9yZWcgJiAweDAwODApCisJCSpzIHw9IFBIWV9DT05GXzEwMEhEWDsKKwlpZiAobWlpX3JlZyAmIDB4MDAxMDApCisJCSpzIHw9IFBIWV9DT05GXzEwMEZEWDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogVGhlIExldmVsIG9uZSBMWFQ5NzAgaXMgdXNlZCBieSBtYW55IGJvYXJkcwkJCQkgICAgICovCisKKyNkZWZpbmUgTUlJX0xYVDk3MF9NSVJST1IgICAgMTYgIC8qIE1pcnJvciByZWdpc3RlciAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX0xYVDk3MF9JRVIgICAgICAgMTcgIC8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0xYVDk3MF9JU1IgICAgICAgMTggIC8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0xYVDk3MF9DT05GSUcgICAgMTkgIC8qIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgICAgKi8KKyNkZWZpbmUgTUlJX0xYVDk3MF9DU1IgICAgICAgMjAgIC8qIENoaXAgU3RhdHVzIFJlZ2lzdGVyICAgICAgKi8KKworc3RhdGljIHZvaWQgbWlpX3BhcnNlX2x4dDk3MF9jc3IodWludCBtaWlfcmVnLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHVpbnQgKnMgPSAmKGZlcC0+cGh5X3N0YXR1cyk7CisKKwkqcyAmPSB+KFBIWV9TVEFUX1NQTUFTSyk7CisKKwlpZiAobWlpX3JlZyAmIDB4MDgwMCkgeworCQlpZiAobWlpX3JlZyAmIDB4MTAwMCkKKwkJCSpzIHw9IFBIWV9TVEFUXzEwMEZEWDsKKwkJZWxzZQorCQkJKnMgfD0gUEhZX1NUQVRfMTAwSERYOworCX0gZWxzZSB7CisJCWlmIChtaWlfcmVnICYgMHgxMDAwKQorCQkJKnMgfD0gUEhZX1NUQVRfMTBGRFg7CisJCWVsc2UKKwkJCSpzIHw9IFBIWV9TVEFUXzEwSERYOworCX0KK30KKworc3RhdGljIHBoeV9pbmZvX3QgcGh5X2luZm9fbHh0OTcwID0geworCTB4MDc4MTAwMDAsIAorCSJMWFQ5NzAiLAorCisJKGNvbnN0IHBoeV9jbWRfdCBbXSkgeyAgLyogY29uZmlnICovCisJCXsgbWtfbWlpX3JlYWQoTUlJX1JFR19DUiksIG1paV9wYXJzZV9jciB9LAorCQl7IG1rX21paV9yZWFkKE1JSV9SRUdfQU5BUiksIG1paV9wYXJzZV9hbmFyIH0sCisJCXsgbWtfbWlpX2VuZCwgfQorCX0sCisJKGNvbnN0IHBoeV9jbWRfdCBbXSkgeyAgLyogc3RhcnR1cCAtIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJCXsgbWtfbWlpX3dyaXRlKE1JSV9MWFQ5NzBfSUVSLCAweDAwMDIpLCBOVUxMIH0sCisJCXsgbWtfbWlpX3dyaXRlKE1JSV9SRUdfQ1IsIDB4MTIwMCksIE5VTEwgfSwgLyogYXV0b25lZ290aWF0ZSAqLworCQl7IG1rX21paV9lbmQsIH0KKwl9LAorCShjb25zdCBwaHlfY21kX3QgW10pIHsgLyogYWNrX2ludCAqLworCQkvKiByZWFkIFNSIGFuZCBJU1IgdG8gYWNrbm93bGVkZ2UgKi8KKwkJeyBta19taWlfcmVhZChNSUlfUkVHX1NSKSwgbWlpX3BhcnNlX3NyIH0sCisJCXsgbWtfbWlpX3JlYWQoTUlJX0xYVDk3MF9JU1IpLCBOVUxMIH0sCisKKwkJLyogZmluZCBvdXQgdGhlIGN1cnJlbnQgc3RhdHVzICovCisJCXsgbWtfbWlpX3JlYWQoTUlJX0xYVDk3MF9DU1IpLCBtaWlfcGFyc2VfbHh0OTcwX2NzciB9LAorCQl7IG1rX21paV9lbmQsIH0KKwl9LAorCShjb25zdCBwaHlfY21kX3QgW10pIHsgIC8qIHNodXRkb3duIC0gZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJCXsgbWtfbWlpX3dyaXRlKE1JSV9MWFQ5NzBfSUVSLCAweDAwMDApLCBOVUxMIH0sCisJCXsgbWtfbWlpX2VuZCwgfQorCX0sCit9OworCQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogVGhlIExldmVsIG9uZSBMWFQ5NzEgaXMgdXNlZCBvbiBzb21lIG9mIG15IGN1c3RvbSBib2FyZHMgICAgICAgICAgICAgICAgICAqLworCisvKiByZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgdGhlIDk3MSAqLworCisjZGVmaW5lIE1JSV9MWFQ5NzFfUENSICAgICAgIDE2ICAvKiBQb3J0IENvbnRyb2wgUmVnaXN0ZXIgICAgICovCisjZGVmaW5lIE1JSV9MWFQ5NzFfU1IyICAgICAgIDE3ICAvKiBTdGF0dXMgUmVnaXN0ZXIgMiAgICAgICAgICovCisjZGVmaW5lIE1JSV9MWFQ5NzFfSUVSICAgICAgIDE4ICAvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9MWFQ5NzFfSVNSICAgICAgIDE5ICAvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9MWFQ5NzFfTENSICAgICAgIDIwICAvKiBMRUQgQ29udHJvbCBSZWdpc3RlciAgICAgICovCisjZGVmaW5lIE1JSV9MWFQ5NzFfVENSICAgICAgIDMwICAvKiBUcmFuc21pdCBDb250cm9sIFJlZ2lzdGVyICovCisKKy8qIAorICogSSBoYWQgc29tZSBuaWNlIGlkZWFzIG9mIHJ1bm5pbmcgdGhlIE1ESU8gZmFzdGVyLi4uCisgKiBUaGUgOTcxIHNob3VsZCBzdXBwb3J0IDhNSHogYW5kIEkgdHJpZWQgaXQsIGJ1dCB0aGluZ3MgYWN0ZWQgcmVhbGx5CisgKiB3ZWlyZCwgc28gMi41IE1IeiBvdWdodCB0byBiZSBlbm91Z2ggZm9yIGFueW9uZS4uLgorICovCisKK3N0YXRpYyB2b2lkIG1paV9wYXJzZV9seHQ5NzFfc3IyKHVpbnQgbWlpX3JlZywgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSB1aW50ICpzID0gJihmZXAtPnBoeV9zdGF0dXMpOworCisJKnMgJj0gfihQSFlfU1RBVF9TUE1BU0sgfCBQSFlfU1RBVF9MSU5LIHwgUEhZX1NUQVRfQU5DKTsKKworCWlmIChtaWlfcmVnICYgMHgwNDAwKSB7CisJCWZlcC0+bGluayA9IDE7CisJCSpzIHw9IFBIWV9TVEFUX0xJTks7CisJfSBlbHNlIHsKKwkJZmVwLT5saW5rID0gMDsKKwl9CisJaWYgKG1paV9yZWcgJiAweDAwODApCisJCSpzIHw9IFBIWV9TVEFUX0FOQzsKKwlpZiAobWlpX3JlZyAmIDB4NDAwMCkgeworCQlpZiAobWlpX3JlZyAmIDB4MDIwMCkKKwkJCSpzIHw9IFBIWV9TVEFUXzEwMEZEWDsKKwkJZWxzZQorCQkJKnMgfD0gUEhZX1NUQVRfMTAwSERYOworCX0gZWxzZSB7CisJCWlmIChtaWlfcmVnICYgMHgwMjAwKQorCQkJKnMgfD0gUEhZX1NUQVRfMTBGRFg7CisJCWVsc2UKKwkJCSpzIHw9IFBIWV9TVEFUXzEwSERYOworCX0KKwlpZiAobWlpX3JlZyAmIDB4MDAwOCkKKwkJKnMgfD0gUEhZX1NUQVRfRkFVTFQ7Cit9CisKK3N0YXRpYyBwaHlfaW5mb190IHBoeV9pbmZvX2x4dDk3MSA9IHsKKwkweDAwMDEzNzhlLCAKKwkiTFhUOTcxIiwKKwkKKwkoY29uc3QgcGh5X2NtZF90IFtdKSB7ICAvKiBjb25maWcgKi8gIAorCQkvKiBsaW1pdCB0byAxME1CaXQgYmVjYXVzZSBteSBwcm90b3J5cGUgYm9hcmQgCisJCSAqIGRvZXNuJ3Qgd29yayB3aXRoIDEwMC4gKi8KKwkJeyBta19taWlfcmVhZChNSUlfUkVHX0NSKSwgbWlpX3BhcnNlX2NyIH0sCisJCXsgbWtfbWlpX3JlYWQoTUlJX1JFR19BTkFSKSwgbWlpX3BhcnNlX2FuYXIgfSwKKwkJeyBta19taWlfcmVhZChNSUlfTFhUOTcxX1NSMiksIG1paV9wYXJzZV9seHQ5NzFfc3IyIH0sCisJCXsgbWtfbWlpX2VuZCwgfQorCX0sCisJKGNvbnN0IHBoeV9jbWRfdCBbXSkgeyAgLyogc3RhcnR1cCAtIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJCXsgbWtfbWlpX3dyaXRlKE1JSV9MWFQ5NzFfSUVSLCAweDAwZjIpLCBOVUxMIH0sCisJCXsgbWtfbWlpX3dyaXRlKE1JSV9SRUdfQ1IsIDB4MTIwMCksIE5VTEwgfSwgLyogYXV0b25lZ290aWF0ZSAqLworCQl7IG1rX21paV93cml0ZShNSUlfTFhUOTcxX0xDUiwgMHhkNDIyKSwgTlVMTCB9LCAvKiBMRUQgY29uZmlnICovCisJCS8qIFNvbWVob3cgZG9lcyB0aGUgOTcxIHRlbGwgbWUgdGhhdCB0aGUgbGluayBpcyBkb3duCisJCSAqIHRoZSBmaXJzdCByZWFkIGFmdGVyIHBvd2VyLXVwLgorCQkgKiByZWFkIGhlcmUgdG8gZ2V0IGEgdmFsaWQgdmFsdWUgaW4gYWNrX2ludCAqLworCQl7IG1rX21paV9yZWFkKE1JSV9SRUdfU1IpLCBtaWlfcGFyc2Vfc3IgfSwgCisJCXsgbWtfbWlpX2VuZCwgfQorCX0sCisJKGNvbnN0IHBoeV9jbWRfdCBbXSkgeyAvKiBhY2tfaW50ICovCisJCS8qIGZpbmQgb3V0IHRoZSBjdXJyZW50IHN0YXR1cyAqLworCQl7IG1rX21paV9yZWFkKE1JSV9SRUdfU1IpLCBtaWlfcGFyc2Vfc3IgfSwKKwkJeyBta19taWlfcmVhZChNSUlfTFhUOTcxX1NSMiksIG1paV9wYXJzZV9seHQ5NzFfc3IyIH0sCisJCS8qIHdlIG9ubHkgbmVlZCB0byByZWFkIElTUiB0byBhY2tub3dsZWRnZSAqLworCQl7IG1rX21paV9yZWFkKE1JSV9MWFQ5NzFfSVNSKSwgTlVMTCB9LAorCQl7IG1rX21paV9lbmQsIH0KKwl9LAorCShjb25zdCBwaHlfY21kX3QgW10pIHsgIC8qIHNodXRkb3duIC0gZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJCXsgbWtfbWlpX3dyaXRlKE1JSV9MWFQ5NzFfSUVSLCAweDAwMDApLCBOVUxMIH0sCisJCXsgbWtfbWlpX2VuZCwgfQorCX0sCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBUaGUgUXVhbGl0eSBTZW1pY29uZHVjdG9yIFFTNjYxMiBpcyB1c2VkIG9uIHRoZSBSUFggQ0xMRiAgICAgICAgICAgICAgICAgICovCisKKy8qIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgTUlJX1FTNjYxMl9NQ1IgICAgICAgMTcgIC8qIE1vZGUgQ29udHJvbCBSZWdpc3RlciAgICAgICovCisjZGVmaW5lIE1JSV9RUzY2MTJfRlRSICAgICAgIDI3ICAvKiBGYWN0b3J5IFRlc3QgUmVnaXN0ZXIgICAgICAqLworI2RlZmluZSBNSUlfUVM2NjEyX01DTyAgICAgICAyOCAgLyogTWlzYy4gQ29udHJvbCBSZWdpc3RlciAgICAgKi8KKyNkZWZpbmUgTUlJX1FTNjYxMl9JU1IgICAgICAgMjkgIC8qIEludGVycnVwdCBTb3VyY2UgUmVnaXN0ZXIgICovCisjZGVmaW5lIE1JSV9RUzY2MTJfSU1SICAgICAgIDMwICAvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAgICAqLworI2RlZmluZSBNSUlfUVM2NjEyX1BDUiAgICAgICAzMSAgLyogMTAwQmFzZVR4IFBIWSBDb250cm9sIFJlZy4gKi8KKworc3RhdGljIHZvaWQgbWlpX3BhcnNlX3FzNjYxMl9wY3IodWludCBtaWlfcmVnLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHVpbnQgKnMgPSAmKGZlcC0+cGh5X3N0YXR1cyk7CisKKwkqcyAmPSB+KFBIWV9TVEFUX1NQTUFTSyk7CisKKwlzd2l0Y2goKG1paV9yZWcgPj4gMikgJiA3KSB7CisJY2FzZSAxOiAqcyB8PSBQSFlfU1RBVF8xMEhEWDsgYnJlYWs7CisJY2FzZSAyOiAqcyB8PSBQSFlfU1RBVF8xMDBIRFg7IGJyZWFrOworCWNhc2UgNTogKnMgfD0gUEhZX1NUQVRfMTBGRFg7IGJyZWFrOworCWNhc2UgNjogKnMgfD0gUEhZX1NUQVRfMTAwRkRYOyBicmVhazsKKwl9Cit9CisKK3N0YXRpYyBwaHlfaW5mb190IHBoeV9pbmZvX3FzNjYxMiA9IHsKKwkweDAwMTgxNDQwLCAKKwkiUVM2NjEyIiwKKwkKKwkoY29uc3QgcGh5X2NtZF90IFtdKSB7ICAvKiBjb25maWcgKi8gIAorCQkvKiBUaGUgUEhZIHBvd2VycyB1cCBpc29sYXRlZCBvbiB0aGUgUlBYLCAKKwkJICogc28gc2VuZCBhIGNvbW1hbmQgdG8gYWxsb3cgb3BlcmF0aW9uLgorCQkgKi8KKwkJeyBta19taWlfd3JpdGUoTUlJX1FTNjYxMl9QQ1IsIDB4MGRjMCksIE5VTEwgfSwKKworCQkvKiBwYXJzZSBjciBhbmQgYW5hciB0byBnZXQgc29tZSBpbmZvICovCisJCXsgbWtfbWlpX3JlYWQoTUlJX1JFR19DUiksIG1paV9wYXJzZV9jciB9LAorCQl7IG1rX21paV9yZWFkKE1JSV9SRUdfQU5BUiksIG1paV9wYXJzZV9hbmFyIH0sCisJCXsgbWtfbWlpX2VuZCwgfQorCX0sCisJKGNvbnN0IHBoeV9jbWRfdCBbXSkgeyAgLyogc3RhcnR1cCAtIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJCXsgbWtfbWlpX3dyaXRlKE1JSV9RUzY2MTJfSU1SLCAweDAwM2EpLCBOVUxMIH0sCisJCXsgbWtfbWlpX3dyaXRlKE1JSV9SRUdfQ1IsIDB4MTIwMCksIE5VTEwgfSwgLyogYXV0b25lZ290aWF0ZSAqLworCQl7IG1rX21paV9lbmQsIH0KKwl9LAorCShjb25zdCBwaHlfY21kX3QgW10pIHsgLyogYWNrX2ludCAqLworCQkvKiB3ZSBuZWVkIHRvIHJlYWQgSVNSLCBTUiBhbmQgQU5FUiB0byBhY2tub3dsZWRnZSAqLworCQl7IG1rX21paV9yZWFkKE1JSV9RUzY2MTJfSVNSKSwgTlVMTCB9LAorCQl7IG1rX21paV9yZWFkKE1JSV9SRUdfU1IpLCBtaWlfcGFyc2Vfc3IgfSwKKwkJeyBta19taWlfcmVhZChNSUlfUkVHX0FORVIpLCBOVUxMIH0sCisKKwkJLyogcmVhZCBwY3IgdG8gZ2V0IGluZm8gKi8KKwkJeyBta19taWlfcmVhZChNSUlfUVM2NjEyX1BDUiksIG1paV9wYXJzZV9xczY2MTJfcGNyIH0sCisJCXsgbWtfbWlpX2VuZCwgfQorCX0sCisJKGNvbnN0IHBoeV9jbWRfdCBbXSkgeyAgLyogc2h1dGRvd24gLSBkaXNhYmxlIGludGVycnVwdHMgKi8KKwkJeyBta19taWlfd3JpdGUoTUlJX1FTNjYxMl9JTVIsIDB4MDAwMCksIE5VTEwgfSwKKwkJeyBta19taWlfZW5kLCB9CisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEFNRCBBTTc5Qzg3NCBwaHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogcmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSA4NzQgKi8KKworI2RlZmluZSBNSUlfQU03OUM4NzRfTUZSICAgICAgIDE2ICAvKiBNaXNjZWxsYW5lb3VzIEZlYXR1cmUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0FNNzlDODc0X0lDU1IgICAgICAxNyAgLyogSW50ZXJydXB0L1N0YXR1cyBSZWdpc3RlciAgICAgICovCisjZGVmaW5lIE1JSV9BTTc5Qzg3NF9EUiAgICAgICAgMTggIC8qIERpYWdub3N0aWMgUmVnaXN0ZXIgICAgICAgICAgICAqLworI2RlZmluZSBNSUlfQU03OUM4NzRfUE1MUiAgICAgIDE5ICAvKiBQb3dlciBhbmQgTG9vcGJhY2sgUmVnaXN0ZXIgICAgKi8KKyNkZWZpbmUgTUlJX0FNNzlDODc0X01DUiAgICAgICAyMSAgLyogTW9kZUNvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICovCisjZGVmaW5lIE1JSV9BTTc5Qzg3NF9EQyAgICAgICAgMjMgIC8qIERpc2Nvbm5lY3QgQ291bnRlciAgICAgICAgICAgICAqLworI2RlZmluZSBNSUlfQU03OUM4NzRfUkVDICAgICAgIDI0ICAvKiBSZWNpZXZlIEVycm9yIENvdW50ZXIgICAgICAgICAgKi8KKworc3RhdGljIHZvaWQgbWlpX3BhcnNlX2FtNzljODc0X2RyKHVpbnQgbWlpX3JlZywgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSB1aW50ICpzID0gJihmZXAtPnBoeV9zdGF0dXMpOworCisJKnMgJj0gfihQSFlfU1RBVF9TUE1BU0sgfCBQSFlfU1RBVF9BTkMpOworCisJaWYgKG1paV9yZWcgJiAweDAwODApCisJCSpzIHw9IFBIWV9TVEFUX0FOQzsKKwlpZiAobWlpX3JlZyAmIDB4MDQwMCkKKwkJKnMgfD0gKChtaWlfcmVnICYgMHgwODAwKSA/IFBIWV9TVEFUXzEwMEZEWCA6IFBIWV9TVEFUXzEwMEhEWCk7CisJZWxzZQorCQkqcyB8PSAoKG1paV9yZWcgJiAweDA4MDApID8gUEhZX1NUQVRfMTBGRFggOiBQSFlfU1RBVF8xMEhEWCk7Cit9CisKK3N0YXRpYyBwaHlfaW5mb190IHBoeV9pbmZvX2FtNzljODc0ID0geworCTB4MDAwMjI1NjEsIAorCSJBTTc5Qzg3NCIsCisJCisJKGNvbnN0IHBoeV9jbWRfdCBbXSkgeyAgLyogY29uZmlnICovICAKKwkJLyogbGltaXQgdG8gMTBNQml0IGJlY2F1c2UgbXkgcHJvdG9yeXBlIGJvYXJkIAorCQkgKiBkb2Vzbid0IHdvcmsgd2l0aCAxMDAuICovCisJCXsgbWtfbWlpX3JlYWQoTUlJX1JFR19DUiksIG1paV9wYXJzZV9jciB9LAorCQl7IG1rX21paV9yZWFkKE1JSV9SRUdfQU5BUiksIG1paV9wYXJzZV9hbmFyIH0sCisJCXsgbWtfbWlpX3JlYWQoTUlJX0FNNzlDODc0X0RSKSwgbWlpX3BhcnNlX2FtNzljODc0X2RyIH0sCisJCXsgbWtfbWlpX2VuZCwgfQorCX0sCisJKGNvbnN0IHBoeV9jbWRfdCBbXSkgeyAgLyogc3RhcnR1cCAtIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJCXsgbWtfbWlpX3dyaXRlKE1JSV9BTTc5Qzg3NF9JQ1NSLCAweGZmMDApLCBOVUxMIH0sCisJCXsgbWtfbWlpX3dyaXRlKE1JSV9SRUdfQ1IsIDB4MTIwMCksIE5VTEwgfSwgLyogYXV0b25lZ290aWF0ZSAqLworCQl7IG1rX21paV9yZWFkKE1JSV9SRUdfU1IpLCBtaWlfcGFyc2Vfc3IgfSwgCisJCXsgbWtfbWlpX2VuZCwgfQorCX0sCisJKGNvbnN0IHBoeV9jbWRfdCBbXSkgeyAvKiBhY2tfaW50ICovCisJCS8qIGZpbmQgb3V0IHRoZSBjdXJyZW50IHN0YXR1cyAqLworCQl7IG1rX21paV9yZWFkKE1JSV9SRUdfU1IpLCBtaWlfcGFyc2Vfc3IgfSwKKwkJeyBta19taWlfcmVhZChNSUlfQU03OUM4NzRfRFIpLCBtaWlfcGFyc2VfYW03OWM4NzRfZHIgfSwKKwkJLyogd2Ugb25seSBuZWVkIHRvIHJlYWQgSVNSIHRvIGFja25vd2xlZGdlICovCisJCXsgbWtfbWlpX3JlYWQoTUlJX0FNNzlDODc0X0lDU1IpLCBOVUxMIH0sCisJCXsgbWtfbWlpX2VuZCwgfQorCX0sCisJKGNvbnN0IHBoeV9jbWRfdCBbXSkgeyAgLyogc2h1dGRvd24gLSBkaXNhYmxlIGludGVycnVwdHMgKi8KKwkJeyBta19taWlfd3JpdGUoTUlJX0FNNzlDODc0X0lDU1IsIDB4MDAwMCksIE5VTEwgfSwKKwkJeyBta19taWlfZW5kLCB9CisJfSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEtlbmRpbiBLUzg3MjFCTCBwaHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogcmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSA4NzIxICovCisKKyNkZWZpbmUgTUlJX0tTODcyMUJMX1JYRVJDUgkyMQorI2RlZmluZSBNSUlfS1M4NzIxQkxfSUNTUgkyMgorI2RlZmluZQlNSUlfS1M4NzIxQkxfUEhZQ1IJMzEKKworc3RhdGljIHBoeV9pbmZvX3QgcGh5X2luZm9fa3M4NzIxYmwgPSB7CisJMHgwMDAyMjE2MSwgCisJIktTODcyMUJMIiwKKwkKKwkoY29uc3QgcGh5X2NtZF90IFtdKSB7ICAvKiBjb25maWcgKi8gIAorCQl7IG1rX21paV9yZWFkKE1JSV9SRUdfQ1IpLCBtaWlfcGFyc2VfY3IgfSwKKwkJeyBta19taWlfcmVhZChNSUlfUkVHX0FOQVIpLCBtaWlfcGFyc2VfYW5hciB9LAorCQl7IG1rX21paV9lbmQsIH0KKwl9LAorCShjb25zdCBwaHlfY21kX3QgW10pIHsgIC8qIHN0YXJ0dXAgKi8KKwkJeyBta19taWlfd3JpdGUoTUlJX0tTODcyMUJMX0lDU1IsIDB4ZmYwMCksIE5VTEwgfSwKKwkJeyBta19taWlfd3JpdGUoTUlJX1JFR19DUiwgMHgxMjAwKSwgTlVMTCB9LCAvKiBhdXRvbmVnb3RpYXRlICovCisJCXsgbWtfbWlpX3JlYWQoTUlJX1JFR19TUiksIG1paV9wYXJzZV9zciB9LCAKKwkJeyBta19taWlfZW5kLCB9CisJfSwKKwkoY29uc3QgcGh5X2NtZF90IFtdKSB7IC8qIGFja19pbnQgKi8KKwkJLyogZmluZCBvdXQgdGhlIGN1cnJlbnQgc3RhdHVzICovCisJCXsgbWtfbWlpX3JlYWQoTUlJX1JFR19TUiksIG1paV9wYXJzZV9zciB9LAorCQkvKiB3ZSBvbmx5IG5lZWQgdG8gcmVhZCBJU1IgdG8gYWNrbm93bGVkZ2UgKi8KKwkJeyBta19taWlfcmVhZChNSUlfS1M4NzIxQkxfSUNTUiksIE5VTEwgfSwKKwkJeyBta19taWlfZW5kLCB9CisJfSwKKwkoY29uc3QgcGh5X2NtZF90IFtdKSB7ICAvKiBzaHV0ZG93biAqLworCQl7IG1rX21paV93cml0ZShNSUlfS1M4NzIxQkxfSUNTUiwgMHgwMDAwKSwgTlVMTCB9LAorCQl7IG1rX21paV9lbmQsIH0KKwl9LAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgcGh5X2luZm9fdCAqcGh5X2luZm9bXSA9IHsKKwkmcGh5X2luZm9fbHh0OTcwLAorCSZwaHlfaW5mb19seHQ5NzEsCisJJnBoeV9pbmZvX3FzNjYxMiwKKwkmcGh5X2luZm9fYW03OWM4NzQsCisJJnBoeV9pbmZvX2tzODcyMWJsLAorCU5VTEwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIENPTkZJR19SUFhDTEFTU0lDCitzdGF0aWMgdm9pZAorbWlpX2xpbmtfaW50ZXJydXB0KHZvaWQgKmRldl9pZCk7CisjZWxzZQorc3RhdGljIGlycXJldHVybl90CittaWlfbGlua19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfTTUyNzIpCisKKy8qCisgKglDb2RlIHNwZWNpZmljIHRvIENvbGRmaXJlIDUyNzIgc2V0dXAuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5saW5lX18gZmVjX3JlcXVlc3RfaW50cnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICppY3JwOworCisJLyogU2V0dXAgaW50ZXJydXB0IGhhbmRsZXJzLiAqLworCWlmIChyZXF1ZXN0X2lycSg4NiwgZmVjX2VuZXRfaW50ZXJydXB0LCAwLCAiZmVjKFJYKSIsIGRldikgIT0gMCkKKwkJcHJpbnRrKCJGRUM6IENvdWxkIG5vdCBhbGxvY2F0ZSBGRUMoUkMpIElSUSg4NikhXG4iKTsKKwlpZiAocmVxdWVzdF9pcnEoODcsIGZlY19lbmV0X2ludGVycnVwdCwgMCwgImZlYyhUWCkiLCBkZXYpICE9IDApCisJCXByaW50aygiRkVDOiBDb3VsZCBub3QgYWxsb2NhdGUgRkVDKFJDKSBJUlEoODcpIVxuIik7CisJaWYgKHJlcXVlc3RfaXJxKDg4LCBmZWNfZW5ldF9pbnRlcnJ1cHQsIDAsICJmZWMoT1RIRVIpIiwgZGV2KSAhPSAwKQorCQlwcmludGsoIkZFQzogQ291bGQgbm90IGFsbG9jYXRlIEZFQyhPVEhFUikgSVJRKDg4KSFcbiIpOworCWlmIChyZXF1ZXN0X2lycSg2NiwgbWlpX2xpbmtfaW50ZXJydXB0LCAwLCAiZmVjKE1JSSkiLCBkZXYpICE9IDApCisJCXByaW50aygiRkVDOiBDb3VsZCBub3QgYWxsb2NhdGUgTUlJIElSUSg2NikhXG4iKTsKKworCS8qIFVubWFzayBpbnRlcnJ1cHQgYXQgQ29sZEZpcmUgNTI3MiBTSU0gKi8KKwlpY3JwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKE1DRl9NQkFSICsgTUNGU0lNX0lDUjMpOworCSppY3JwID0gMHgwMDAwMGRkZDsKKwlpY3JwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKE1DRl9NQkFSICsgTUNGU0lNX0lDUjEpOworCSppY3JwID0gKCppY3JwICYgMHg3MDc3Nzc3NykgfCAweDBkMDAwMDAwOworfQorCitzdGF0aWMgdm9pZCBfX2lubGluZV9fIGZlY19zZXRfbWlpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXApCit7CisJdm9sYXRpbGUgZmVjX3QgKmZlY3A7CisKKwlmZWNwID0gZmVwLT5od3A7CisJZmVjcC0+ZmVjX3JfY250cmwgPSBPUFRfRlJBTUVfU0laRSB8IDB4MDQ7CisJZmVjcC0+ZmVjX3hfY250cmwgPSAweDAwOworCisJLyoKKwkgKiBTZXQgTUlJIHNwZWVkIHRvIDIuNSBNSHoKKwkgKiBTZWUgNTI3MiBtYW51YWwgc2VjdGlvbiAxMS41Ljg6IE1TQ1IKKwkgKi8KKwlmZXAtPnBoeV9zcGVlZCA9ICgoKChNQ0ZfQ0xLIC8gNCkgLyAoMjUwMDAwMCAvIDEwKSkgKyA1KSAvIDEwKSAqIDI7CisJZmVjcC0+ZmVjX21paV9zcGVlZCA9IGZlcC0+cGh5X3NwZWVkOworCisJZmVjX3Jlc3RhcnQoZGV2LCAwKTsKK30KKworc3RhdGljIHZvaWQgX19pbmxpbmVfXyBmZWNfZ2V0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIGZlY190ICpmZWNwOworCXVuc2lnbmVkIGNoYXIgKmlhcCwgdG1wYWRkcls2XTsKKwlpbnQgaTsKKworCWZlY3AgPSBmZXAtPmh3cDsKKworCWlmIChmZWNfZmxhc2htYWMpIHsKKwkJLyoKKwkJICogR2V0IE1BQyBhZGRyZXNzIGZyb20gRkxBU0guCisJCSAqIElmIGl0IGlzIGFsbCAxJ3Mgb3IgMCdzLCB1c2UgdGhlIGRlZmF1bHQuCisJCSAqLworCQlpYXAgPSBmZWNfZmxhc2htYWM7CisJCWlmICgoaWFwWzBdID09IDApICYmIChpYXBbMV0gPT0gMCkgJiYgKGlhcFsyXSA9PSAwKSAmJgorCQkgICAgKGlhcFszXSA9PSAwKSAmJiAoaWFwWzRdID09IDApICYmIChpYXBbNV0gPT0gMCkpCisJCQlpYXAgPSBmZWNfbWFjX2RlZmF1bHQ7CisJCWlmICgoaWFwWzBdID09IDB4ZmYpICYmIChpYXBbMV0gPT0gMHhmZikgJiYgKGlhcFsyXSA9PSAweGZmKSAmJgorCQkgICAgKGlhcFszXSA9PSAweGZmKSAmJiAoaWFwWzRdID09IDB4ZmYpICYmIChpYXBbNV0gPT0gMHhmZikpCisJCQlpYXAgPSBmZWNfbWFjX2RlZmF1bHQ7CisJfSBlbHNlIHsKKwkJKigodW5zaWduZWQgbG9uZyAqKSAmdG1wYWRkclswXSkgPSBmZWNwLT5mZWNfYWRkcl9sb3c7CisJCSooKHVuc2lnbmVkIHNob3J0ICopICZ0bXBhZGRyWzRdKSA9IChmZWNwLT5mZWNfYWRkcl9oaWdoID4+IDE2KTsKKwkJaWFwID0gJnRtcGFkZHJbMF07CisJfQorCisJZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IGZlcC0+bWFjX2FkZHJbaV0gPSAqaWFwKys7CisKKwkvKiBBZGp1c3QgTUFDIGlmIHVzaW5nIGRlZmF1bHQgTUFDIGFkZHJlc3MgKi8KKwlpZiAoaWFwID09IGZlY19tYWNfZGVmYXVsdCkgeworCQlkZXYtPmRldl9hZGRyW0VUSF9BTEVOLTFdID0gZmVwLT5tYWNfYWRkcltFVEhfQUxFTi0xXSA9CisJCQlpYXBbRVRIX0FMRU4tMV0gKyBmZXAtPmluZGV4OworCX0KK30KKworc3RhdGljIHZvaWQgX19pbmxpbmVfXyBmZWNfZW5hYmxlX3BoeV9pbnRyKHZvaWQpCit7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5saW5lX18gZmVjX2Rpc2FibGVfcGh5X2ludHIodm9pZCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICppY3JwOworCWljcnAgPSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoTUNGX01CQVIgKyBNQ0ZTSU1fSUNSMSk7CisJKmljcnAgPSAoKmljcnAgJiAweDcwNzc3Nzc3KSB8IDB4MDgwMDAwMDA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5saW5lX18gZmVjX3BoeV9hY2tfaW50cih2b2lkKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmljcnA7CisJLyogQWNrbm93bGVkZ2UgdGhlIGludGVycnVwdCAqLworCWljcnAgPSAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSAoTUNGX01CQVIgKyBNQ0ZTSU1fSUNSMSk7CisJKmljcnAgPSAoKmljcnAgJiAweDc3Nzc3Nzc3KSB8IDB4MDgwMDAwMDA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5saW5lX18gZmVjX2xvY2FsaHdfc2V0dXAodm9pZCkKK3sKK30KKworLyoKKyAqCURvIG5vdCBuZWVkIHRvIG1ha2UgcmVnaW9uIHVuY2FjaGVkIG9uIDUyNzIuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5saW5lX18gZmVjX3VuY2FjaGUodW5zaWduZWQgbG9uZyBhZGRyKQoreworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX001Mjd4KSB8fCBkZWZpbmVkKENPTkZJR19NNTI4eCkKKworLyoKKyAqCUNvZGUgc3BlY2lmaWMgdG8gQ29sZGZpcmUgNTI3MC81MjcxLzUyNzQvNTI3NSBhbmQgNTI4MC81MjgyIHNldHVwcy4KKyAqLworc3RhdGljIHZvaWQgX19pbmxpbmVfXyBmZWNfcmVxdWVzdF9pbnRycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXA7CisJaW50IGI7CisKKwlmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWIgPSAoZmVwLT5pbmRleCkgPyAxMjggOiA2NDsKKworCS8qIFNldHVwIGludGVycnVwdCBoYW5kbGVycy4gKi8KKwlpZiAocmVxdWVzdF9pcnEoYisyMywgZmVjX2VuZXRfaW50ZXJydXB0LCAwLCAiZmVjKFRYRikiLCBkZXYpICE9IDApCisJCXByaW50aygiRkVDOiBDb3VsZCBub3QgYWxsb2NhdGUgRkVDKFRYRikgSVJRKCVkKzIzKSFcbiIsIGIpOworCWlmIChyZXF1ZXN0X2lycShiKzI0LCBmZWNfZW5ldF9pbnRlcnJ1cHQsIDAsICJmZWMoVFhCKSIsIGRldikgIT0gMCkKKwkJcHJpbnRrKCJGRUM6IENvdWxkIG5vdCBhbGxvY2F0ZSBGRUMoVFhCKSBJUlEoJWQrMjQpIVxuIiwgYik7CisJaWYgKHJlcXVlc3RfaXJxKGIrMjUsIGZlY19lbmV0X2ludGVycnVwdCwgMCwgImZlYyhUWEZJRk8pIiwgZGV2KSAhPSAwKQorCQlwcmludGsoIkZFQzogQ291bGQgbm90IGFsbG9jYXRlIEZFQyhUWEZJRk8pIElSUSglZCsyNSkhXG4iLCBiKTsKKwlpZiAocmVxdWVzdF9pcnEoYisyNiwgZmVjX2VuZXRfaW50ZXJydXB0LCAwLCAiZmVjKFRYQ1IpIiwgZGV2KSAhPSAwKQorCQlwcmludGsoIkZFQzogQ291bGQgbm90IGFsbG9jYXRlIEZFQyhUWENSKSBJUlEoJWQrMjYpIVxuIiwgYik7CisKKwlpZiAocmVxdWVzdF9pcnEoYisyNywgZmVjX2VuZXRfaW50ZXJydXB0LCAwLCAiZmVjKFJYRikiLCBkZXYpICE9IDApCisJCXByaW50aygiRkVDOiBDb3VsZCBub3QgYWxsb2NhdGUgRkVDKFJYRikgSVJRKCVkKzI3KSFcbiIsIGIpOworCWlmIChyZXF1ZXN0X2lycShiKzI4LCBmZWNfZW5ldF9pbnRlcnJ1cHQsIDAsICJmZWMoUlhCKSIsIGRldikgIT0gMCkKKwkJcHJpbnRrKCJGRUM6IENvdWxkIG5vdCBhbGxvY2F0ZSBGRUMoUlhCKSBJUlEoJWQrMjgpIVxuIiwgYik7CisKKwlpZiAocmVxdWVzdF9pcnEoYisyOSwgZmVjX2VuZXRfaW50ZXJydXB0LCAwLCAiZmVjKE1JSSkiLCBkZXYpICE9IDApCisJCXByaW50aygiRkVDOiBDb3VsZCBub3QgYWxsb2NhdGUgRkVDKE1JSSkgSVJRKCVkKzI5KSFcbiIsIGIpOworCWlmIChyZXF1ZXN0X2lycShiKzMwLCBmZWNfZW5ldF9pbnRlcnJ1cHQsIDAsICJmZWMoTEMpIiwgZGV2KSAhPSAwKQorCQlwcmludGsoIkZFQzogQ291bGQgbm90IGFsbG9jYXRlIEZFQyhMQykgSVJRKCVkKzMwKSFcbiIsIGIpOworCWlmIChyZXF1ZXN0X2lycShiKzMxLCBmZWNfZW5ldF9pbnRlcnJ1cHQsIDAsICJmZWMoSEJFUlIpIiwgZGV2KSAhPSAwKQorCQlwcmludGsoIkZFQzogQ291bGQgbm90IGFsbG9jYXRlIEZFQyhIQkVSUikgSVJRKCVkKzMxKSFcbiIsIGIpOworCWlmIChyZXF1ZXN0X2lycShiKzMyLCBmZWNfZW5ldF9pbnRlcnJ1cHQsIDAsICJmZWMoR1JBKSIsIGRldikgIT0gMCkKKwkJcHJpbnRrKCJGRUM6IENvdWxkIG5vdCBhbGxvY2F0ZSBGRUMoR1JBKSBJUlEoJWQrMzIpIVxuIiwgYik7CisJaWYgKHJlcXVlc3RfaXJxKGIrMzMsIGZlY19lbmV0X2ludGVycnVwdCwgMCwgImZlYyhFQkVSUikiLCBkZXYpICE9IDApCisJCXByaW50aygiRkVDOiBDb3VsZCBub3QgYWxsb2NhdGUgRkVDKEVCRVJSKSBJUlEoJWQrMzMpIVxuIiwgYik7CisJaWYgKHJlcXVlc3RfaXJxKGIrMzQsIGZlY19lbmV0X2ludGVycnVwdCwgMCwgImZlYyhCQUJUKSIsIGRldikgIT0gMCkKKwkJcHJpbnRrKCJGRUM6IENvdWxkIG5vdCBhbGxvY2F0ZSBGRUMoQkFCVCkgSVJRKCVkKzM0KSFcbiIsIGIpOworCWlmIChyZXF1ZXN0X2lycShiKzM1LCBmZWNfZW5ldF9pbnRlcnJ1cHQsIDAsICJmZWMoQkFCUikiLCBkZXYpICE9IDApCisJCXByaW50aygiRkVDOiBDb3VsZCBub3QgYWxsb2NhdGUgRkVDKEJBQlIpIElSUSglZCszNSkhXG4iLCBiKTsKKworCS8qIFVubWFzayBpbnRlcnJ1cHRzIGF0IENvbGRGaXJlIDUyODAvNTI4MiBpbnRlcnJ1cHQgY29udHJvbGxlciAqLworCXsKKwkJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAgKmljcnA7CisJCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgICppbXJwOworCQlpbnQgaTsKKworCQliID0gKGZlcC0+aW5kZXgpID8gTUNGSUNNX0lOVEMxIDogTUNGSUNNX0lOVEMwOworCQlpY3JwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKE1DRl9JUFNCQVIgKyBiICsKKwkJCU1DRklOVENfSUNSMCk7CisJCWZvciAoaSA9IDIzOyAoaSA8IDM2KTsgaSsrKQorCQkJaWNycFtpXSA9IDB4MjM7CisKKwkJaW1ycCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChNQ0ZfSVBTQkFSICsgYiArCisJCQlNQ0ZJTlRDX0lNUkgpOworCQkqaW1ycCAmPSB+MHgwMDAwMDAwZjsKKwkJaW1ycCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChNQ0ZfSVBTQkFSICsgYiArCisJCQlNQ0ZJTlRDX0lNUkwpOworCQkqaW1ycCAmPSB+MHhmZjgwMDAwMTsKKwl9CisKKyNpZiBkZWZpbmVkKENPTkZJR19NNTI4eCkKKwkvKiBTZXQgdXAgZ3BpbyBvdXRwdXRzIGZvciBNSUkgbGluZXMgKi8KKwl7CisJCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICpncGlvX3Bhc3BhcjsKKyAgCisJCWdwaW9fcGFzcGFyID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopIChNQ0ZfSVBTQkFSICsKKwkJCTB4MTAwMDU2KTsKKwkJKmdwaW9fcGFzcGFyID0gMHgwZjAwOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBfX2lubGluZV9fIGZlY19zZXRfbWlpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXApCit7CisJdm9sYXRpbGUgZmVjX3QgKmZlY3A7CisKKwlmZWNwID0gZmVwLT5od3A7CisJZmVjcC0+ZmVjX3JfY250cmwgPSBPUFRfRlJBTUVfU0laRSB8IDB4MDQ7CisJZmVjcC0+ZmVjX3hfY250cmwgPSAweDAwOworCisJLyoKKwkgKiBTZXQgTUlJIHNwZWVkIHRvIDIuNSBNSHoKKwkgKiBTZWUgNTI4MiBtYW51YWwgc2VjdGlvbiAxNy41LjQuNzogTVNDUgorCSAqLworCWZlcC0+cGh5X3NwZWVkID0gKCgoKE1DRl9DTEsgLyAyKSAvICgyNTAwMDAwIC8gMTApKSArIDUpIC8gMTApICogMjsKKwlmZWNwLT5mZWNfbWlpX3NwZWVkID0gZmVwLT5waHlfc3BlZWQ7CisKKwlmZWNfcmVzdGFydChkZXYsIDApOworfQorCitzdGF0aWMgdm9pZCBfX2lubGluZV9fIGZlY19nZXRfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgZmVjX3QgKmZlY3A7CisJdW5zaWduZWQgY2hhciAqaWFwLCB0bXBhZGRyWzZdOworCWludCBpOworCisJZmVjcCA9IGZlcC0+aHdwOworCisJaWYgKGZlY19mbGFzaG1hYykgeworCQkvKgorCQkgKiBHZXQgTUFDIGFkZHJlc3MgZnJvbSBGTEFTSC4KKwkJICogSWYgaXQgaXMgYWxsIDEncyBvciAwJ3MsIHVzZSB0aGUgZGVmYXVsdC4KKwkJICovCisJCWlhcCA9IGZlY19mbGFzaG1hYzsKKwkJaWYgKChpYXBbMF0gPT0gMCkgJiYgKGlhcFsxXSA9PSAwKSAmJiAoaWFwWzJdID09IDApICYmCisJCSAgICAoaWFwWzNdID09IDApICYmIChpYXBbNF0gPT0gMCkgJiYgKGlhcFs1XSA9PSAwKSkKKwkJCWlhcCA9IGZlY19tYWNfZGVmYXVsdDsKKwkJaWYgKChpYXBbMF0gPT0gMHhmZikgJiYgKGlhcFsxXSA9PSAweGZmKSAmJiAoaWFwWzJdID09IDB4ZmYpICYmCisJCSAgICAoaWFwWzNdID09IDB4ZmYpICYmIChpYXBbNF0gPT0gMHhmZikgJiYgKGlhcFs1XSA9PSAweGZmKSkKKwkJCWlhcCA9IGZlY19tYWNfZGVmYXVsdDsKKwl9IGVsc2UgeworCQkqKCh1bnNpZ25lZCBsb25nICopICZ0bXBhZGRyWzBdKSA9IGZlY3AtPmZlY19hZGRyX2xvdzsKKwkJKigodW5zaWduZWQgc2hvcnQgKikgJnRtcGFkZHJbNF0pID0gKGZlY3AtPmZlY19hZGRyX2hpZ2ggPj4gMTYpOworCQlpYXAgPSAmdG1wYWRkclswXTsKKwl9CisKKwlmb3IgKGk9MDsgaTxFVEhfQUxFTjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gZmVwLT5tYWNfYWRkcltpXSA9ICppYXArKzsKKworCS8qIEFkanVzdCBNQUMgaWYgdXNpbmcgZGVmYXVsdCBNQUMgYWRkcmVzcyAqLworCWlmIChpYXAgPT0gZmVjX21hY19kZWZhdWx0KSB7CisJCWRldi0+ZGV2X2FkZHJbRVRIX0FMRU4tMV0gPSBmZXAtPm1hY19hZGRyW0VUSF9BTEVOLTFdID0KKwkJCWlhcFtFVEhfQUxFTi0xXSArIGZlcC0+aW5kZXg7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2lubGluZV9fIGZlY19lbmFibGVfcGh5X2ludHIodm9pZCkKK3sKK30KKworc3RhdGljIHZvaWQgX19pbmxpbmVfXyBmZWNfZGlzYWJsZV9waHlfaW50cih2b2lkKQoreworfQorCitzdGF0aWMgdm9pZCBfX2lubGluZV9fIGZlY19waHlfYWNrX2ludHIodm9pZCkKK3sKK30KKworc3RhdGljIHZvaWQgX19pbmxpbmVfXyBmZWNfbG9jYWxod19zZXR1cCh2b2lkKQoreworfQorCisvKgorICoJRG8gbm90IG5lZWQgdG8gbWFrZSByZWdpb24gdW5jYWNoZWQgb24gNTI3Mi4KKyAqLworc3RhdGljIHZvaWQgX19pbmxpbmVfXyBmZWNfdW5jYWNoZSh1bnNpZ25lZCBsb25nIGFkZHIpCit7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2Vsc2UKKworLyoKKyAqCUNvZGUgc2VwY2lmaWMgdG8gdGhlIE1QQzg2MFQgc2V0dXAuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5saW5lX18gZmVjX3JlcXVlc3RfaW50cnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcDsKKworCWltbWFwID0gKGltbWFwX3QgKilJTUFQX0FERFI7CS8qIHBvaW50ZXIgdG8gaW50ZXJuYWwgcmVnaXN0ZXJzICovCisKKwlpZiAocmVxdWVzdF84eHhpcnEoRkVDX0lOVEVSUlVQVCwgZmVjX2VuZXRfaW50ZXJydXB0LCAwLCAiZmVjIiwgZGV2KSAhPSAwKQorCQlwYW5pYygiQ291bGQgbm90IGFsbG9jYXRlIEZFQyBJUlEhIik7CisKKyNpZmRlZiBDT05GSUdfUlBYQ0xBU1NJQworCS8qIE1ha2UgUG9ydCBDLCBiaXQgMTUgYW4gaW5wdXQgdGhhdCBjYXVzZXMgaW50ZXJydXB0cy4KKwkqLworCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BjcGFyICY9IH4weDAwMDE7CisJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNkaXIgJj0gfjB4MDAwMTsKKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY3NvICY9IH4weDAwMDE7CisJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNpbnQgfD0gMHgwMDAxOworCWNwbV9pbnN0YWxsX2hhbmRsZXIoQ1BNVkVDX1BJT19QQzE1LCBtaWlfbGlua19pbnRlcnJ1cHQsIGRldik7CisKKwkvKiBNYWtlIExFRFMgcmVmbGVjdCBMaW5rIHN0YXR1cy4KKwkqLworCSooKHVpbnQgKikgUlBYX0NTUl9BRERSKSAmPSB+QkNTUjJfRkVUSExFRE1PREU7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRkFEUworCWlmIChyZXF1ZXN0Xzh4eGlycShTSVVfSVJRMiwgbWlpX2xpbmtfaW50ZXJydXB0LCAwLCAibWlpIiwgZGV2KSAhPSAwKQorCQlwYW5pYygiQ291bGQgbm90IGFsbG9jYXRlIE1JSSBJUlEhIik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgX19pbmxpbmVfXyBmZWNfZ2V0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGNoYXIgKmlhcCwgdG1wYWRkcls2XTsKKwliZF90ICpiZDsKKwlpbnQgaTsKKworCWlhcCA9IGJkLT5iaV9lbmV0YWRkcjsKKwliZCA9IChiZF90ICopX19yZXM7CisKKyNpZmRlZiBDT05GSUdfUlBYQ0xBU1NJQworCS8qIFRoZSBFbWJlZGRlZCBQbGFuZXQgYm9hcmRzIGhhdmUgb25seSBvbmUgTUFDIGFkZHJlc3MgaW4KKwkgKiB0aGUgRUVQUk9NLCBidXQgY2FuIGhhdmUgdHdvIEV0aGVybmV0IHBvcnRzLiAgRm9yIHRoZQorCSAqIEZFQyBwb3J0LCB3ZSBjcmVhdGUgYW5vdGhlciBhZGRyZXNzIGJ5IHNldHRpbmcgb25lIG9mCisJICogdGhlIGFkZHJlc3MgYml0cyBhYm92ZSBzb21ldGhpbmcgdGhhdCB3b3VsZCBoYXZlICh1cCB0bworCSAqIG5vdykgYmVlbiBhbGxvY2F0ZWQuCisJICovCisJZm9yIChpPTA7IGk8NjsgaSsrKQorCQl0bXBhZGRyW2ldID0gKmlhcCsrOworCXRtcGFkZHJbM10gfD0gMHg4MDsKKwlpYXAgPSB0bXBhZGRyOworI2VuZGlmCisKKwlmb3IgKGk9MDsgaTw2OyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSBmZXAtPm1hY19hZGRyW2ldID0gKmlhcCsrOworfQorCitzdGF0aWMgdm9pZCBfX2lubGluZV9fIGZlY19zZXRfbWlpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXApCit7CisJZXh0ZXJuIHVpbnQgX2dldF9JTU1SKHZvaWQpOworCXZvbGF0aWxlIGltbWFwX3QgKmltbWFwOworCXZvbGF0aWxlIGZlY190ICpmZWNwOworCisJZmVjcCA9IGZlcC0+aHdwOworCWltbWFwID0gKGltbWFwX3QgKilJTUFQX0FERFI7CS8qIHBvaW50ZXIgdG8gaW50ZXJuYWwgcmVnaXN0ZXJzICovCisKKwkvKiBDb25maWd1cmUgYWxsIG9mIHBvcnQgRCBmb3IgTUlJLgorCSovCisJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGRwYXIgPSAweDFmZmY7CisKKwkvKiBCaXRzIG1vdmVkIGZyb20gUmV2LiBEIG9ud2FyZC4KKwkqLworCWlmICgoX2dldF9JTU1SKCkgJiAweGZmZmYpIDwgMHgwNTAxKQorCQlpbW1hcC0+aW1faW9wb3J0LmlvcF9wZGRpciA9IDB4MWM1ODsJLyogUHJlIHJldi4gRCAqLworCWVsc2UKKwkJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGRkaXIgPSAweDFmZmY7CS8qIFJldi4gRCBhbmQgbGF0ZXIgKi8KKwkKKwkvKiBTZXQgTUlJIHNwZWVkIHRvIDIuNSBNSHoKKwkqLworCWZlY3AtPmZlY19taWlfc3BlZWQgPSBmZXAtPnBoeV9zcGVlZCA9IAorCQkoKGJkLT5iaV9idXNmcmVxICogMTAwMDAwMCkgLyAyNTAwMDAwKSAmIDB4N2U7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5saW5lX18gZmVjX2VuYWJsZV9waHlfaW50cih2b2lkKQoreworCXZvbGF0aWxlIGZlY190ICpmZWNwOworCisJZmVjcCA9IGZlcC0+aHdwOworCisJLyogRW5hYmxlIE1JSSBjb21tYW5kIGZpbmlzaGVkIGludGVycnVwdCAKKwkqLworCWZlY3AtPmZlY19pdmVjID0gKEZFQ19JTlRFUlJVUFQvMikgPDwgMjk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5saW5lX18gZmVjX2Rpc2FibGVfcGh5X2ludHIodm9pZCkKK3sKK30KKworc3RhdGljIHZvaWQgX19pbmxpbmVfXyBmZWNfcGh5X2Fja19pbnRyKHZvaWQpCit7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5saW5lX18gZmVjX2xvY2FsaHdfc2V0dXAodm9pZCkKK3sKKwl2b2xhdGlsZSBmZWNfdCAqZmVjcDsKKworCWZlY3AgPSBmZXAtPmh3cDsKKwlmZWNwLT5mZWNfcl9oYXNoID0gUEtUX01BWEJVRl9TSVpFOworCS8qIEVuYWJsZSBiaWcgZW5kaWFuIGFuZCBkb24ndCBjYXJlIGFib3V0IFNETUEgRkMuCisJKi8KKwlmZWNwLT5mZWNfZnVuX2NvZGUgPSAweDc4MDAwMDAwOworfQorCitzdGF0aWMgdm9pZCBfX2lubGluZV9fIGZlY191bmNhY2hlKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlwdGVfdCAqcHRlOworCXB0ZSA9IHZhX3RvX3B0ZShtZW1fYWRkcik7CisJcHRlX3ZhbCgqcHRlKSB8PSBfUEFHRV9OT19DQUNIRTsKKwlmbHVzaF90bGJfcGFnZShpbml0X21tLm1tYXAsIG1lbV9hZGRyKTsKK30KKworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgbWlpX2Rpc3BsYXlfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgdWludCAqcyA9ICYoZmVwLT5waHlfc3RhdHVzKTsKKworCWlmICghZmVwLT5saW5rICYmICFmZXAtPm9sZF9saW5rKSB7CisJCS8qIExpbmsgaXMgc3RpbGwgZG93biAtIGRvbid0IHByaW50IGFueXRoaW5nICovCisJCXJldHVybjsKKwl9CisKKwlwcmludGsoIiVzOiBzdGF0dXM6ICIsIGRldi0+bmFtZSk7CisKKwlpZiAoIWZlcC0+bGluaykgeworCQlwcmludGsoImxpbmsgZG93biIpOworCX0gZWxzZSB7CisJCXByaW50aygibGluayB1cCIpOworCisJCXN3aXRjaCgqcyAmIFBIWV9TVEFUX1NQTUFTSykgeworCQljYXNlIFBIWV9TVEFUXzEwMEZEWDogcHJpbnRrKCIsIDEwME1CaXQgRnVsbCBEdXBsZXgiKTsgYnJlYWs7CisJCWNhc2UgUEhZX1NUQVRfMTAwSERYOiBwcmludGsoIiwgMTAwTUJpdCBIYWxmIER1cGxleCIpOyBicmVhazsKKwkJY2FzZSBQSFlfU1RBVF8xMEZEWDogcHJpbnRrKCIsIDEwTUJpdCBGdWxsIER1cGxleCIpOyBicmVhazsKKwkJY2FzZSBQSFlfU1RBVF8xMEhEWDogcHJpbnRrKCIsIDEwTUJpdCBIYWxmIER1cGxleCIpOyBicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiLCBVbmtub3duIHNwZWVkL2R1cGxleCIpOworCQl9CisKKwkJaWYgKCpzICYgUEhZX1NUQVRfQU5DKQorCQkJcHJpbnRrKCIsIGF1dG8tbmVnb3RpYXRpb24gY29tcGxldGUiKTsKKwl9CisKKwlpZiAoKnMgJiBQSFlfU1RBVF9GQVVMVCkKKwkJcHJpbnRrKCIsIHJlbW90ZSBmYXVsdCIpOworCisJcHJpbnRrKCIuXG4iKTsKK30KKworc3RhdGljIHZvaWQgbWlpX2Rpc3BsYXlfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgdWludCAqcyA9ICYoZmVwLT5waHlfc3RhdHVzKTsKKworCS8qCisJKiogV2hlbiB3ZSBnZXQgaGVyZSwgcGh5X3Rhc2sgaXMgYWxyZWFkeSByZW1vdmVkIGZyb20KKwkqKiB0aGUgd29ya3F1ZXVlLiAgSXQgaXMgdGh1cyBzYWZlIHRvIGFsbG93IHRvIHJldXNlIGl0LgorCSovCisJZmVwLT5taWlfcGh5X3Rhc2tfcXVldWVkID0gMDsKKwlwcmludGsoIiVzOiBjb25maWc6IGF1dG8tbmVnb3RpYXRpb24gIiwgZGV2LT5uYW1lKTsKKworCWlmICgqcyAmIFBIWV9DT05GX0FORSkKKwkJcHJpbnRrKCJvbiIpOworCWVsc2UKKwkJcHJpbnRrKCJvZmYiKTsKKworCWlmICgqcyAmIFBIWV9DT05GXzEwMEZEWCkKKwkJcHJpbnRrKCIsIDEwMEZEWCIpOworCWlmICgqcyAmIFBIWV9DT05GXzEwMEhEWCkKKwkJcHJpbnRrKCIsIDEwMEhEWCIpOworCWlmICgqcyAmIFBIWV9DT05GXzEwRkRYKQorCQlwcmludGsoIiwgMTBGRFgiKTsKKwlpZiAoKnMgJiBQSFlfQ09ORl8xMEhEWCkKKwkJcHJpbnRrKCIsIDEwSERYIik7CisJaWYgKCEoKnMgJiBQSFlfQ09ORl9TUE1BU0spKQorCQlwcmludGsoIiwgTm8gc3BlZWQvZHVwbGV4IHNlbGVjdGVkPyIpOworCisJaWYgKCpzICYgUEhZX0NPTkZfTE9PUCkKKwkJcHJpbnRrKCIsIGxvb3BiYWNrIGVuYWJsZWQiKTsKKwkKKwlwcmludGsoIi5cbiIpOworCisJZmVwLT5zZXF1ZW5jZV9kb25lID0gMTsKK30KKworc3RhdGljIHZvaWQgbWlpX3JlbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBkdXBsZXg7CisKKwkvKgorCSoqIFdoZW4gd2UgZ2V0IGhlcmUsIHBoeV90YXNrIGlzIGFscmVhZHkgcmVtb3ZlZCBmcm9tCisJKiogdGhlIHdvcmtxdWV1ZS4gIEl0IGlzIHRodXMgc2FmZSB0byBhbGxvdyB0byByZXVzZSBpdC4KKwkqLworCWZlcC0+bWlpX3BoeV90YXNrX3F1ZXVlZCA9IDA7CisJZmVwLT5saW5rID0gKGZlcC0+cGh5X3N0YXR1cyAmIFBIWV9TVEFUX0xJTkspID8gMSA6IDA7CisJbWlpX2Rpc3BsYXlfc3RhdHVzKGRldik7CisJZmVwLT5vbGRfbGluayA9IGZlcC0+bGluazsKKworCWlmIChmZXAtPmxpbmspIHsKKwkJZHVwbGV4ID0gMDsKKwkJaWYgKGZlcC0+cGh5X3N0YXR1cyAKKwkJICAgICYgKFBIWV9TVEFUXzEwMEZEWCB8IFBIWV9TVEFUXzEwRkRYKSkKKwkJCWR1cGxleCA9IDE7CisJCWZlY19yZXN0YXJ0KGRldiwgZHVwbGV4KTsKKwl9CisJZWxzZQorCQlmZWNfc3RvcChkZXYpOworCisjaWYgMAorCWVuYWJsZV9pcnEoZmVwLT5taWlfaXJxKTsKKyNlbmRpZgorCit9CisKKy8qIG1paV9xdWV1ZV9yZWxpbmsgaXMgY2FsbGVkIGluIGludGVycnVwdCBjb250ZXh0IGZyb20gbWlpX2xpbmtfaW50ZXJydXB0ICovCitzdGF0aWMgdm9pZCBtaWlfcXVldWVfcmVsaW5rKHVpbnQgbWlpX3JlZywgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qCisJKiogV2UgY2Fubm90IHF1ZXVlIHBoeV90YXNrIHR3aWNlIGluIHRoZSB3b3JrcXVldWUuICBJdAorCSoqIHdvdWxkIGNhdXNlIGFuIGVuZGxlc3MgbG9vcCBpbiB0aGUgd29ya3F1ZXVlLgorCSoqIEZvcnR1bmF0ZWx5LCBpZiB0aGUgbGFzdCBtaWlfcmVsaW5rIGVudHJ5IGhhcyBub3QgeWV0IGJlZW4KKwkqKiBleGVjdXRlZCBub3csIGl0IHdpbGwgZG8gdGhlIGpvYiBmb3IgdGhlIGN1cnJlbnQgaW50ZXJydXB0LAorCSoqIHdoaWNoIGlzIGp1c3Qgd2hhdCB3ZSB3YW50LgorCSovCisJaWYgKGZlcC0+bWlpX3BoeV90YXNrX3F1ZXVlZCkKKwkJcmV0dXJuOworCisJZmVwLT5taWlfcGh5X3Rhc2tfcXVldWVkID0gMTsKKwlJTklUX1dPUksoJmZlcC0+cGh5X3Rhc2ssICh2b2lkKiltaWlfcmVsaW5rLCBkZXYpOworCXNjaGVkdWxlX3dvcmsoJmZlcC0+cGh5X3Rhc2spOworfQorCisvKiBtaWlfcXVldWVfY29uZmlnIGlzIGNhbGxlZCBpbiB1c2VyIGNvbnRleHQgZnJvbSBmZWNfZW5ldF9vcGVuICovCitzdGF0aWMgdm9pZCBtaWlfcXVldWVfY29uZmlnKHVpbnQgbWlpX3JlZywgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChmZXAtPm1paV9waHlfdGFza19xdWV1ZWQpCisJCXJldHVybjsKKworCWZlcC0+bWlpX3BoeV90YXNrX3F1ZXVlZCA9IDE7CisJSU5JVF9XT1JLKCZmZXAtPnBoeV90YXNrLCAodm9pZCopbWlpX2Rpc3BsYXlfY29uZmlnLCBkZXYpOworCXNjaGVkdWxlX3dvcmsoJmZlcC0+cGh5X3Rhc2spOworfQorCisKKworcGh5X2NtZF90IHBoeV9jbWRfcmVsaW5rW10gPSB7IHsgbWtfbWlpX3JlYWQoTUlJX1JFR19DUiksIG1paV9xdWV1ZV9yZWxpbmsgfSwKKwkJCSAgICAgICB7IG1rX21paV9lbmQsIH0gfTsKK3BoeV9jbWRfdCBwaHlfY21kX2NvbmZpZ1tdID0geyB7IG1rX21paV9yZWFkKE1JSV9SRUdfQ1IpLCBtaWlfcXVldWVfY29uZmlnIH0sCisJCQkgICAgICAgeyBta19taWlfZW5kLCB9IH07CisKKworCisvKiBSZWFkIHJlbWFpbmRlciBvZiBQSFkgSUQuCisqLworc3RhdGljIHZvaWQKK21paV9kaXNjb3Zlcl9waHkzKHVpbnQgbWlpX3JlZywgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwOworCWludCBpOworCisJZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlmZXAtPnBoeV9pZCB8PSAobWlpX3JlZyAmIDB4ZmZmZik7CisJcHJpbnRrKCJmZWM6IFBIWSBAIDB4JXgsIElEIDB4JTA4eCIsIGZlcC0+cGh5X2FkZHIsIGZlcC0+cGh5X2lkKTsKKworCWZvcihpID0gMDsgcGh5X2luZm9baV07IGkrKykgeworCQlpZihwaHlfaW5mb1tpXS0+aWQgPT0gKGZlcC0+cGh5X2lkID4+IDQpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKHBoeV9pbmZvW2ldKQorCQlwcmludGsoIiAtLSAlc1xuIiwgcGh5X2luZm9baV0tPm5hbWUpOworCWVsc2UKKwkJcHJpbnRrKCIgLS0gdW5rbm93biBQSFkhXG4iKTsKKyAgICAgIAorCWZlcC0+cGh5ID0gcGh5X2luZm9baV07CisJZmVwLT5waHlfaWRfZG9uZSA9IDE7Cit9CisKKy8qIFNjYW4gYWxsIG9mIHRoZSBNSUkgUEhZIGFkZHJlc3NlcyBsb29raW5nIGZvciBzb21lb25lIHRvIHJlc3BvbmQKKyAqIHdpdGggYSB2YWxpZCBJRC4gIFRoaXMgdXN1YWxseSBoYXBwZW5zIHF1aWNrbHkuCisgKi8KK3N0YXRpYyB2b2lkCittaWlfZGlzY292ZXJfcGh5KHVpbnQgbWlpX3JlZywgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwOworCXZvbGF0aWxlIGZlY190ICpmZWNwOworCXVpbnQgcGh5dHlwZTsKKworCWZlcCA9IG5ldGRldl9wcml2KGRldik7CisJZmVjcCA9IGZlcC0+aHdwOworCisJaWYgKGZlcC0+cGh5X2FkZHIgPCAzMikgeworCQlpZiAoKHBoeXR5cGUgPSAobWlpX3JlZyAmIDB4ZmZmZikpICE9IDB4ZmZmZiAmJiBwaHl0eXBlICE9IDApIHsKKwkJCQorCQkJLyogR290IGZpcnN0IHBhcnQgb2YgSUQsIG5vdyBnZXQgcmVtYWluZGVyLgorCQkJKi8KKwkJCWZlcC0+cGh5X2lkID0gcGh5dHlwZSA8PCAxNjsKKwkJCW1paV9xdWV1ZShkZXYsIG1rX21paV9yZWFkKE1JSV9SRUdfUEhZSVIyKSwKKwkJCQkJCQltaWlfZGlzY292ZXJfcGh5Myk7CisJCX0KKwkJZWxzZSB7CisJCQlmZXAtPnBoeV9hZGRyKys7CisJCQltaWlfcXVldWUoZGV2LCBta19taWlfcmVhZChNSUlfUkVHX1BIWUlSMSksCisJCQkJCQkJbWlpX2Rpc2NvdmVyX3BoeSk7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGsoIkZFQzogTm8gUEhZIGRldmljZSBmb3VuZC5cbiIpOworCQkvKiBEaXNhYmxlIGV4dGVybmFsIE1JSSBpbnRlcmZhY2UgKi8KKwkJZmVjcC0+ZmVjX21paV9zcGVlZCA9IGZlcC0+cGh5X3NwZWVkID0gMDsKKwkJZmVjX2Rpc2FibGVfcGh5X2ludHIoKTsKKwl9Cit9CisKKy8qIFRoaXMgaW50ZXJydXB0IG9jY3VycyB3aGVuIHRoZSBQSFkgZGV0ZWN0cyBhIGxpbmsgY2hhbmdlLgorKi8KKyNpZmRlZiBDT05GSUdfUlBYQ0xBU1NJQworc3RhdGljIHZvaWQKK21paV9saW5rX2ludGVycnVwdCh2b2lkICpkZXZfaWQpCisjZWxzZQorc3RhdGljIGlycXJldHVybl90CittaWlfbGlua19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQorI2VuZGlmCit7CisJc3RydWN0CW5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWZlY19waHlfYWNrX2ludHIoKTsKKworI2lmIDAKKwlkaXNhYmxlX2lycShmZXAtPm1paV9pcnEpOyAgLyogZGlzYWJsZSBub3csIGVuYWJsZSBsYXRlciAqLworI2VuZGlmCisKKwltaWlfZG9fY21kKGRldiwgZmVwLT5waHktPmFja19pbnQpOworCW1paV9kb19jbWQoZGV2LCBwaHlfY21kX3JlbGluayk7ICAvKiByZXN0YXJ0IGFuZCBkaXNwbGF5IHN0YXR1cyAqLworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50CitmZWNfZW5ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBJIHNob3VsZCByZXNldCB0aGUgcmluZyBidWZmZXJzIGhlcmUsIGJ1dCBJIGRvbid0IHlldCBrbm93CisJICogYSBzaW1wbGUgd2F5IHRvIGRvIHRoYXQuCisJICovCisJZmVjX3NldF9tYWNfYWRkcmVzcyhkZXYpOworCisJZmVwLT5zZXF1ZW5jZV9kb25lID0gMDsKKwlmZXAtPmxpbmsgPSAwOworCisJaWYgKGZlcC0+cGh5KSB7CisJCW1paV9kb19jbWQoZGV2LCBmZXAtPnBoeS0+YWNrX2ludCk7CisJCW1paV9kb19jbWQoZGV2LCBmZXAtPnBoeS0+Y29uZmlnKTsKKwkJbWlpX2RvX2NtZChkZXYsIHBoeV9jbWRfY29uZmlnKTsgIC8qIGRpc3BsYXkgY29uZmlndXJhdGlvbiAqLworCisJCS8qIEZJWE1FOiB1c2UgbmV0aWZfY2Fycmllcl97b24sb2ZmfSA7IHRoaXMgcG9sbHMKKwkJICogdW50aWwgbGluayBpcyB1cCB3aGljaCBpcyB3cm9uZy4uLiAgY291bGQgYmUKKwkJICogMzAgc2Vjb25kcyBvciBtb3JlIHdlIGFyZSB0cmFwcGVkIGluIGhlcmUuIC1qZ2FyemlrCisJCSAqLworCQl3aGlsZSghZmVwLT5zZXF1ZW5jZV9kb25lKQorCQkJc2NoZWR1bGUoKTsKKworCQltaWlfZG9fY21kKGRldiwgZmVwLT5waHktPnN0YXJ0dXApOworCisJCS8qIFNldCB0aGUgaW5pdGlhbCBsaW5rIHN0YXRlIHRvIHRydWUuIEEgbG90IG9mIGhhcmR3YXJlCisJCSAqIGJhc2VkIG9uIHRoaXMgZGV2aWNlIGRvZXMgbm90IGltcGxlbWVudCBhIFBIWSBpbnRlcnJ1cHQsCisJCSAqIHNvIHdlIGFyZSBuZXZlciBub3RpZmllZCBvZiBsaW5rIGNoYW5nZS4KKwkJICovCisJCWZlcC0+bGluayA9IDE7CisJfSBlbHNlIHsKKwkJZmVwLT5saW5rID0gMTsgLyogbGV0cyBqdXN0IHRyeSBpdCBhbmQgc2VlICovCisJCS8qIG5vIHBoeSwgIGdvIGZ1bGwgZHVwbGV4LCAgaXQncyBtb3N0IGxpa2VseSBhIGh1YiBjaGlwICovCisJCWZlY19yZXN0YXJ0KGRldiwgMSk7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlmZXAtPm9wZW5lZCA9IDE7CisJcmV0dXJuIDA7CQkvKiBTdWNjZXNzICovCit9CisKK3N0YXRpYyBpbnQKK2ZlY19lbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBEb24ndCBrbm93IHdoYXQgdG8gZG8geWV0LgorCSovCisJZmVwLT5vcGVuZWQgPSAwOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlmZWNfc3RvcChkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZmVjX2VuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gJmZlcC0+c3RhdHM7Cit9CisKKy8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICogU2tlbGV0b24gdGFrZW4gZnJvbSBzdW5sYW5jZSBkcml2ZXIuCisgKiBUaGUgQ1BNIEV0aGVybmV0IGltcGxlbWVudGF0aW9uIGFsbG93cyBNdWx0aWNhc3QgYXMgd2VsbCBhcyBpbmRpdmlkdWFsCisgKiBNQUMgYWRkcmVzcyBmaWx0ZXJpbmcuICBTb21lIG9mIHRoZSBkcml2ZXJzIGNoZWNrIHRvIG1ha2Ugc3VyZSBpdCBpcworICogYSBncm91cCBtdWx0aWNhc3QgYWRkcmVzcywgYW5kIGRpc2NhcmQgdGhvc2UgdGhhdCBhcmUgbm90LiAgSSBndWVzcyBJCisgKiB3aWxsIGRvIHRoZSBzYW1lIGZvciBub3csIGJ1dCBqdXN0IHJlbW92ZSB0aGUgdGVzdCBpZiB5b3Ugd2FudAorICogaW5kaXZpZHVhbCBmaWx0ZXJpbmcgYXMgd2VsbCAoZG8gdGhlIHVwcGVyIG5ldCBsYXllcnMgd2FudCBvciBzdXBwb3J0CisgKiB0aGlzIGtpbmQgb2YgZmVhdHVyZT8pLgorICovCisKKyNkZWZpbmUgSEFTSF9CSVRTCTYJCS8qICNiaXRzIGluIGhhc2ggKi8KKyNkZWZpbmUgQ1JDMzJfUE9MWQkweEVEQjg4MzIwCisKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXA7CisJdm9sYXRpbGUgZmVjX3QgKmVwOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pOworCXVuc2lnbmVkIGludCBpLCBqLCBiaXQsIGRhdGEsIGNyYzsKKwl1bnNpZ25lZCBjaGFyIGhhc2g7CisKKwlmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWVwID0gZmVwLT5od3A7CisKKwlpZiAoZGV2LT5mbGFncyZJRkZfUFJPTUlTQykgeworCQkvKiBMb2cgYW55IG5ldCB0YXBzLiAqLworCQlwcmludGsoIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLCBkZXYtPm5hbWUpOworCQllcC0+ZmVjX3JfY250cmwgfD0gMHgwMDA4OworCX0gZWxzZSB7CisKKwkJZXAtPmZlY19yX2NudHJsICY9IH4weDAwMDg7CisKKwkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwkJCS8qIENhdGNoIGFsbCBtdWx0aWNhc3QgYWRkcmVzc2VzLCBzbyBzZXQgdGhlCisJCQkgKiBmaWx0ZXIgdG8gYWxsIDEncy4KKwkJCSAqLworCQkJZXAtPmZlY19oYXNoX3RhYmxlX2hpZ2ggPSAweGZmZmZmZmZmOworCQkJZXAtPmZlY19oYXNoX3RhYmxlX2xvdyA9IDB4ZmZmZmZmZmY7CisJCX0gZWxzZSB7CisJCQkvKiBDbGVhciBmaWx0ZXIgYW5kIGFkZCB0aGUgYWRkcmVzc2VzIGluIGhhc2ggcmVnaXN0ZXIuCisJCQkqLworCQkJZXAtPmZlY19oYXNoX3RhYmxlX2hpZ2ggPSAwOworCQkJZXAtPmZlY19oYXNoX3RhYmxlX2xvdyA9IDA7CisgICAgICAgICAgICAKKwkJCWRtaSA9IGRldi0+bWNfbGlzdDsKKworCQkJZm9yIChqID0gMDsgaiA8IGRldi0+bWNfY291bnQ7IGorKywgZG1pID0gZG1pLT5uZXh0KQorCQkJeworCQkJCS8qIE9ubHkgc3VwcG9ydCBncm91cCBtdWx0aWNhc3QgZm9yIG5vdy4KKwkJCQkqLworCQkJCWlmICghKGRtaS0+ZG1pX2FkZHJbMF0gJiAxKSkKKwkJCQkJY29udGludWU7CisJCQkKKwkJCQkvKiBjYWxjdWxhdGUgY3JjMzIgdmFsdWUgb2YgbWFjIGFkZHJlc3MKKwkJCQkqLworCQkJCWNyYyA9IDB4ZmZmZmZmZmY7CisKKwkJCQlmb3IgKGkgPSAwOyBpIDwgZG1pLT5kbWlfYWRkcmxlbjsgaSsrKQorCQkJCXsKKwkJCQkJZGF0YSA9IGRtaS0+ZG1pX2FkZHJbaV07CisJCQkJCWZvciAoYml0ID0gMDsgYml0IDwgODsgYml0KyssIGRhdGEgPj49IDEpCisJCQkJCXsKKwkJCQkJCWNyYyA9IChjcmMgPj4gMSkgXgorCQkJCQkJKCgoY3JjIF4gZGF0YSkgJiAxKSA/IENSQzMyX1BPTFkgOiAwKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8qIG9ubHkgdXBwZXIgNiBiaXRzIChIQVNIX0JJVFMpIGFyZSB1c2VkCisJCQkJICAgd2hpY2ggcG9pbnQgdG8gc3BlY2lmaWMgYml0IGluIGhlIGhhc2ggcmVnaXN0ZXJzCisJCQkJKi8KKwkJCQloYXNoID0gKGNyYyA+PiAoMzIgLSBIQVNIX0JJVFMpKSAmIDB4M2Y7CisJCQkKKwkJCQlpZiAoaGFzaCA+IDMxKQorCQkJCQllcC0+ZmVjX2hhc2hfdGFibGVfaGlnaCB8PSAxIDw8IChoYXNoIC0gMzIpOworCQkJCWVsc2UKKwkJCQkJZXAtPmZlY19oYXNoX3RhYmxlX2xvdyB8PSAxIDw8IGhhc2g7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIFNldCBhIE1BQyBjaGFuZ2UgaW4gaGFyZHdhcmUuCisgKi8KK3N0YXRpYyB2b2lkCitmZWNfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcDsKKwl2b2xhdGlsZSBmZWNfdCAqZmVjcDsKKworCWZlcCA9IG5ldGRldl9wcml2KGRldik7CisJZmVjcCA9IGZlcC0+aHdwOworCisJLyogU2V0IHN0YXRpb24gYWRkcmVzcy4gKi8KKwlmZWNwLT5mZWNfYWRkcl9sb3cgPSBmZXAtPm1hY19hZGRyWzNdIHwgKGZlcC0+bWFjX2FkZHJbMl0gPDwgOCkgfAorCQkoZmVwLT5tYWNfYWRkclsxXSA8PCAxNikgfCAoZmVwLT5tYWNfYWRkclswXSA8PCAyNCk7CisJZmVjcC0+ZmVjX2FkZHJfaGlnaCA9IChmZXAtPm1hY19hZGRyWzVdIDw8IDE2KSB8CisJCShmZXAtPm1hY19hZGRyWzRdIDw8IDI0KTsKKworfQorCisvKiBJbml0aWFsaXplIHRoZSBGRUMgRXRoZXJuZXQgb24gODYwVCAob3IgQ29sZEZpcmUgNTI3MikuCisgKi8KKyAvKgorICAqIFhYWDogIFdlIG5lZWQgdG8gY2xlYW4gdXAgb24gZmFpbHVyZSBleGl0cyBoZXJlLgorICAqLworaW50IF9faW5pdCBmZWNfZW5ldF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZwltZW1fYWRkcjsKKwl2b2xhdGlsZSBjYmRfdAkqYmRwOworCWNiZF90CQkqY2JkX2Jhc2U7CisJdm9sYXRpbGUgZmVjX3QJKmZlY3A7CisJaW50IAkJaSwgajsKKwlzdGF0aWMgaW50CWluZGV4ID0gMDsKKworCS8qIE9ubHkgYWxsb3cgdXMgdG8gYmUgcHJvYmVkIG9uY2UuICovCisJaWYgKGluZGV4ID49IEZFQ19NQVhfUE9SVFMpCisJCXJldHVybiAtRU5YSU87CisKKwkvKiBDcmVhdGUgYW4gRXRoZXJuZXQgZGV2aWNlIGluc3RhbmNlLgorCSovCisJZmVjcCA9ICh2b2xhdGlsZSBmZWNfdCAqKSBmZWNfaHdbaW5kZXhdOworCisJZmVwLT5pbmRleCA9IGluZGV4OworCWZlcC0+aHdwID0gZmVjcDsKKworCS8qIFdoYWNrIGEgcmVzZXQuICBXZSBzaG91bGQgd2FpdCBmb3IgdGhpcy4KKwkqLworCWZlY3AtPmZlY19lY250cmwgPSAxOworCXVkZWxheSgxMCk7CisKKwkvKiBDbGVhciBhbmQgZW5hYmxlIGludGVycnVwdHMgKi8KKwlmZWNwLT5mZWNfaWV2ZW50ID0gMHhmZmMwOworCWZlY3AtPmZlY19pbWFzayA9IChGRUNfRU5FVF9UWEYgfCBGRUNfRU5FVF9UWEIgfAorCQlGRUNfRU5FVF9SWEYgfCBGRUNfRU5FVF9SWEIgfCBGRUNfRU5FVF9NSUkpOworCWZlY3AtPmZlY19oYXNoX3RhYmxlX2hpZ2ggPSAwOworCWZlY3AtPmZlY19oYXNoX3RhYmxlX2xvdyA9IDA7CisJZmVjcC0+ZmVjX3JfYnVmZl9zaXplID0gUEtUX01BWEJMUl9TSVpFOworICAgICAgICBmZWNwLT5mZWNfZWNudHJsID0gMjsKKyAgICAgICAgZmVjcC0+ZmVjX3JfZGVzX2FjdGl2ZSA9IDB4MDEwMDAwMDA7CisKKwkvKiBTZXQgdGhlIEV0aGVybmV0IGFkZHJlc3MuICBJZiB1c2luZyBtdWx0aXBsZSBFbmV0cyBvbiB0aGUgOHh4LAorCSAqIHRoaXMgbmVlZHMgc29tZSB3b3JrIHRvIGdldCB1bmlxdWUgYWRkcmVzc2VzLgorCSAqCisJICogVGhpcyBpcyBvdXIgZGVmYXVsdCBNQUMgYWRkcmVzcyB1bmxlc3MgdGhlIHVzZXIgY2hhbmdlcworCSAqIGl0IHZpYSBldGhfbWFjX2FkZHIgKG91ciBkZXYtPnNldF9tYWNfYWRkciBoYW5kbGVyKS4KKwkgKi8KKwlmZWNfZ2V0X21hYyhkZXYpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBidWZmZXIgZGVzY3JpcHRvcnMuCisJKi8KKwlpZiAoKChSWF9SSU5HX1NJWkUgKyBUWF9SSU5HX1NJWkUpICogc2l6ZW9mKGNiZF90KSkgPiBQQUdFX1NJWkUpIHsKKwkJcHJpbnRrKCJGRUMgaW5pdCBlcnJvci4gIE5lZWQgbW9yZSBzcGFjZS5cbiIpOworCQlwcmludGsoIkZFQyBpbml0aWFsaXphdGlvbiBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCW1lbV9hZGRyID0gX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWNiZF9iYXNlID0gKGNiZF90ICopbWVtX2FkZHI7CisJLyogWFhYOiBtaXNzaW5nIGNoZWNrIGZvciBhbGxvY2F0aW9uIGZhaWx1cmUgKi8KKworCWZlY191bmNhY2hlKG1lbV9hZGRyKTsKKworCS8qIFNldCByZWNlaXZlIGFuZCB0cmFuc21pdCBkZXNjcmlwdG9yIGJhc2UuCisJKi8KKwlmZXAtPnJ4X2JkX2Jhc2UgPSBjYmRfYmFzZTsKKwlmZXAtPnR4X2JkX2Jhc2UgPSBjYmRfYmFzZSArIFJYX1JJTkdfU0laRTsKKworCWZlcC0+ZGlydHlfdHggPSBmZXAtPmN1cl90eCA9IGZlcC0+dHhfYmRfYmFzZTsKKwlmZXAtPmN1cl9yeCA9IGZlcC0+cnhfYmRfYmFzZTsKKworCWZlcC0+c2tiX2N1ciA9IGZlcC0+c2tiX2RpcnR5ID0gMDsKKworCS8qIEluaXRpYWxpemUgdGhlIHJlY2VpdmUgYnVmZmVyIGRlc2NyaXB0b3JzLgorCSovCisJYmRwID0gZmVwLT5yeF9iZF9iYXNlOworCWZvciAoaT0wOyBpPEZFQ19FTkVUX1JYX1BBR0VTOyBpKyspIHsKKworCQkvKiBBbGxvY2F0ZSBhIHBhZ2UuCisJCSovCisJCW1lbV9hZGRyID0gX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCQkvKiBYWFg6IG1pc3NpbmcgY2hlY2sgZm9yIGFsbG9jYXRpb24gZmFpbHVyZSAqLworCisJCWZlY191bmNhY2hlKG1lbV9hZGRyKTsKKworCQkvKiBJbml0aWFsaXplIHRoZSBCRCBmb3IgZXZlcnkgZnJhZ21lbnQgaW4gdGhlIHBhZ2UuCisJCSovCisJCWZvciAoaj0wOyBqPEZFQ19FTkVUX1JYX0ZSUFBHOyBqKyspIHsKKwkJCWJkcC0+Y2JkX3NjID0gQkRfRU5FVF9SWF9FTVBUWTsKKwkJCWJkcC0+Y2JkX2J1ZmFkZHIgPSBfX3BhKG1lbV9hZGRyKTsKKwkJCW1lbV9hZGRyICs9IEZFQ19FTkVUX1JYX0ZSU0laRTsKKwkJCWJkcCsrOworCQl9CisJfQorCisJLyogU2V0IHRoZSBsYXN0IGJ1ZmZlciB0byB3cmFwLgorCSovCisJYmRwLS07CisJYmRwLT5jYmRfc2MgfD0gQkRfU0NfV1JBUDsKKworCS8qIC4uLmFuZCB0aGUgc2FtZSBmb3IgdHJhbnNtbWl0LgorCSovCisJYmRwID0gZmVwLT50eF9iZF9iYXNlOworCWZvciAoaT0wLCBqPUZFQ19FTkVUX1RYX0ZSUFBHOyBpPFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCWlmIChqID49IEZFQ19FTkVUX1RYX0ZSUFBHKSB7CisJCQltZW1fYWRkciA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwkJCWogPSAxOworCQl9IGVsc2UgeworCQkJbWVtX2FkZHIgKz0gRkVDX0VORVRfVFhfRlJTSVpFOworCQkJaisrOworCQl9CisJCWZlcC0+dHhfYm91bmNlW2ldID0gKHVuc2lnbmVkIGNoYXIgKikgbWVtX2FkZHI7CisKKwkJLyogSW5pdGlhbGl6ZSB0aGUgQkQgZm9yIGV2ZXJ5IGZyYWdtZW50IGluIHRoZSBwYWdlLgorCQkqLworCQliZHAtPmNiZF9zYyA9IDA7CisJCWJkcC0+Y2JkX2J1ZmFkZHIgPSAwOworCQliZHArKzsKKwl9CisKKwkvKiBTZXQgdGhlIGxhc3QgYnVmZmVyIHRvIHdyYXAuCisJKi8KKwliZHAtLTsKKwliZHAtPmNiZF9zYyB8PSBCRF9TQ19XUkFQOworCisJLyogU2V0IHJlY2VpdmUgYW5kIHRyYW5zbWl0IGRlc2NyaXB0b3IgYmFzZS4KKwkqLworCWZlY3AtPmZlY19yX2Rlc19zdGFydCA9IF9fcGEoKHVpbnQpKGZlcC0+cnhfYmRfYmFzZSkpOworCWZlY3AtPmZlY194X2Rlc19zdGFydCA9IF9fcGEoKHVpbnQpKGZlcC0+dHhfYmRfYmFzZSkpOworCisJLyogSW5zdGFsbCBvdXIgaW50ZXJydXB0IGhhbmRsZXJzLiBUaGlzIHZhcmllcyBkZXBlbmRpbmcgb24KKwkgKiB0aGUgYXJjaGl0ZWN0dXJlLgorCSovCisJZmVjX3JlcXVlc3RfaW50cnMoZGV2KTsKKworCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpZmVjcDsKKworCS8qIFRoZSBGRUMgRXRoZXJuZXQgc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSBmZWNfZW5ldF9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gZmVjX2VuZXRfc3RhcnRfeG1pdDsKKwlkZXYtPnR4X3RpbWVvdXQgPSBmZWNfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKwlkZXYtPnN0b3AgPSBmZWNfZW5ldF9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9IGZlY19lbmV0X2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHNldF9tdWx0aWNhc3RfbGlzdDsKKworCWZvciAoaT0wOyBpPE5NSUktMTsgaSsrKQorCQltaWlfY21kc1tpXS5taWlfbmV4dCA9ICZtaWlfY21kc1tpKzFdOworCW1paV9mcmVlID0gbWlpX2NtZHM7CisKKwkvKiBzZXR1cCBNSUkgaW50ZXJmYWNlICovCisJZmVjX3NldF9taWkoZGV2LCBmZXApOworCisJcHJpbnRrKCIlczogRkVDIEVORVQgVmVyc2lvbiAwLjIsICIsIGRldi0+bmFtZSk7CisJZm9yIChpPTA7IGk8NTsgaSsrKQorCQlwcmludGsoIiUwMng6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCIlMDJ4XG4iLCBkZXYtPmRldl9hZGRyWzVdKTsKKworCS8qIFF1ZXVlIHVwIGNvbW1hbmQgdG8gZGV0ZWN0IHRoZSBQSFkgYW5kIGluaXRpYWxpemUgdGhlCisJICogcmVtYWluZGVyIG9mIHRoZSBpbnRlcmZhY2UuCisJICovCisJZmVwLT5waHlfaWRfZG9uZSA9IDA7CisJZmVwLT5waHlfYWRkciA9IDA7CisJbWlpX3F1ZXVlKGRldiwgbWtfbWlpX3JlYWQoTUlJX1JFR19QSFlJUjEpLCBtaWlfZGlzY292ZXJfcGh5KTsKKworCWluZGV4Kys7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN0YXJ0IG9yIHJlc3RhcnQgdGhlIEZFQyBkdXJpbmcgYSBsaW5rCisgKiBjaGFuZ2UuICBUaGlzIG9ubHkgaGFwcGVucyB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIGhhbGYgYW5kIGZ1bGwKKyAqIGR1cGxleC4KKyAqLworc3RhdGljIHZvaWQKK2ZlY19yZXN0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBkdXBsZXgpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcDsKKwl2b2xhdGlsZSBjYmRfdCAqYmRwOworCXZvbGF0aWxlIGZlY190ICpmZWNwOworCWludCBpOworCisJZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlmZWNwID0gZmVwLT5od3A7CisKKwkvKiBXaGFjayBhIHJlc2V0LiAgV2Ugc2hvdWxkIHdhaXQgZm9yIHRoaXMuCisJKi8KKwlmZWNwLT5mZWNfZWNudHJsID0gMTsKKwl1ZGVsYXkoMTApOworCisJLyogRW5hYmxlIGludGVycnVwdHMgd2Ugd2lzaCB0byBzZXJ2aWNlLgorCSovCisJZmVjcC0+ZmVjX2ltYXNrID0gKEZFQ19FTkVUX1RYRiB8IEZFQ19FTkVUX1RYQiB8CisJCQkJRkVDX0VORVRfUlhGIHwgRkVDX0VORVRfUlhCIHwgRkVDX0VORVRfTUlJKTsKKworCS8qIENsZWFyIGFueSBvdXRzdGFuZGluZyBpbnRlcnJ1cHQuCisJKi8KKwlmZWNwLT5mZWNfaWV2ZW50ID0gMHhmZmMwOworCWZlY19lbmFibGVfcGh5X2ludHIoKTsKKworCS8qIFNldCBzdGF0aW9uIGFkZHJlc3MuCisJKi8KKwlmZWNwLT5mZWNfYWRkcl9sb3cgPSBmZXAtPm1hY19hZGRyWzNdIHwgKGZlcC0+bWFjX2FkZHJbMl0gPDwgOCkgfAorCQkoZmVwLT5tYWNfYWRkclsxXSA8PCAxNikgfCAoZmVwLT5tYWNfYWRkclswXSA8PCAyNCk7CisJZmVjcC0+ZmVjX2FkZHJfaGlnaCA9IChmZXAtPm1hY19hZGRyWzVdIDw8IDE2KSB8CisJCShmZXAtPm1hY19hZGRyWzRdIDw8IDI0KTsKKworCWZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSBmZXAtPm1hY19hZGRyW2ldOworCisJLyogUmVzZXQgYWxsIG11bHRpY2FzdC4KKwkqLworCWZlY3AtPmZlY19oYXNoX3RhYmxlX2hpZ2ggPSAwOworCWZlY3AtPmZlY19oYXNoX3RhYmxlX2xvdyA9IDA7CisKKwkvKiBTZXQgbWF4aW11bSByZWNlaXZlIGJ1ZmZlciBzaXplLgorCSovCisJZmVjcC0+ZmVjX3JfYnVmZl9zaXplID0gUEtUX01BWEJMUl9TSVpFOworCisJZmVjX2xvY2FsaHdfc2V0dXAoKTsKKworCS8qIFNldCByZWNlaXZlIGFuZCB0cmFuc21pdCBkZXNjcmlwdG9yIGJhc2UuCisJKi8KKwlmZWNwLT5mZWNfcl9kZXNfc3RhcnQgPSBfX3BhKCh1aW50KShmZXAtPnJ4X2JkX2Jhc2UpKTsKKwlmZWNwLT5mZWNfeF9kZXNfc3RhcnQgPSBfX3BhKCh1aW50KShmZXAtPnR4X2JkX2Jhc2UpKTsKKworCWZlcC0+ZGlydHlfdHggPSBmZXAtPmN1cl90eCA9IGZlcC0+dHhfYmRfYmFzZTsKKwlmZXAtPmN1cl9yeCA9IGZlcC0+cnhfYmRfYmFzZTsKKworCS8qIFJlc2V0IFNLQiB0cmFuc21pdCBidWZmZXJzLgorCSovCisJZmVwLT5za2JfY3VyID0gZmVwLT5za2JfZGlydHkgPSAwOworCWZvciAoaT0wOyBpPD1UWF9SSU5HX01PRF9NQVNLOyBpKyspIHsKKwkJaWYgKGZlcC0+dHhfc2tidWZmW2ldICE9IE5VTEwpIHsKKwkJCWRldl9rZnJlZV9za2JfYW55KGZlcC0+dHhfc2tidWZmW2ldKTsKKwkJCWZlcC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJfQorCX0KKworCS8qIEluaXRpYWxpemUgdGhlIHJlY2VpdmUgYnVmZmVyIGRlc2NyaXB0b3JzLgorCSovCisJYmRwID0gZmVwLT5yeF9iZF9iYXNlOworCWZvciAoaT0wOyBpPFJYX1JJTkdfU0laRTsgaSsrKSB7CisKKwkJLyogSW5pdGlhbGl6ZSB0aGUgQkQgZm9yIGV2ZXJ5IGZyYWdtZW50IGluIHRoZSBwYWdlLgorCQkqLworCQliZHAtPmNiZF9zYyA9IEJEX0VORVRfUlhfRU1QVFk7CisJCWJkcCsrOworCX0KKworCS8qIFNldCB0aGUgbGFzdCBidWZmZXIgdG8gd3JhcC4KKwkqLworCWJkcC0tOworCWJkcC0+Y2JkX3NjIHw9IEJEX1NDX1dSQVA7CisKKwkvKiAuLi5hbmQgdGhlIHNhbWUgZm9yIHRyYW5zbW1pdC4KKwkqLworCWJkcCA9IGZlcC0+dHhfYmRfYmFzZTsKKwlmb3IgKGk9MDsgaTxUWF9SSU5HX1NJWkU7IGkrKykgeworCisJCS8qIEluaXRpYWxpemUgdGhlIEJEIGZvciBldmVyeSBmcmFnbWVudCBpbiB0aGUgcGFnZS4KKwkJKi8KKwkJYmRwLT5jYmRfc2MgPSAwOworCQliZHAtPmNiZF9idWZhZGRyID0gMDsKKwkJYmRwKys7CisJfQorCisJLyogU2V0IHRoZSBsYXN0IGJ1ZmZlciB0byB3cmFwLgorCSovCisJYmRwLS07CisJYmRwLT5jYmRfc2MgfD0gQkRfU0NfV1JBUDsKKworCS8qIEVuYWJsZSBNSUkgbW9kZS4KKwkqLworCWlmIChkdXBsZXgpIHsKKwkJZmVjcC0+ZmVjX3JfY250cmwgPSBPUFRfRlJBTUVfU0laRSB8IDB4MDQ7LyogTUlJIGVuYWJsZSAqLworCQlmZWNwLT5mZWNfeF9jbnRybCA9IDB4MDQ7CQkgIC8qIEZEIGVuYWJsZSAqLworCX0KKwllbHNlIHsKKwkJLyogTUlJIGVuYWJsZXxObyBSY3Ygb24gWG1pdCAqLworCQlmZWNwLT5mZWNfcl9jbnRybCA9IE9QVF9GUkFNRV9TSVpFIHwgMHgwNjsKKwkJZmVjcC0+ZmVjX3hfY250cmwgPSAweDAwOworCX0KKwlmZXAtPmZ1bGxfZHVwbGV4ID0gZHVwbGV4OworCisJLyogU2V0IE1JSSBzcGVlZC4KKwkqLworCWZlY3AtPmZlY19taWlfc3BlZWQgPSBmZXAtPnBoeV9zcGVlZDsKKworCS8qIEFuZCBsYXN0LCBlbmFibGUgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIHByb2Nlc3NpbmcuCisJKi8KKwlmZWNwLT5mZWNfZWNudHJsID0gMjsKKwlmZWNwLT5mZWNfcl9kZXNfYWN0aXZlID0gMHgwMTAwMDAwMDsKK30KKworc3RhdGljIHZvaWQKK2ZlY19zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdm9sYXRpbGUgZmVjX3QgKmZlY3A7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcDsKKworCWZlcCA9IG5ldGRldl9wcml2KGRldik7CisJZmVjcCA9IGZlcC0+aHdwOworCisJZmVjcC0+ZmVjX3hfY250cmwgPSAweDAxOwkvKiBHcmFjZWZ1bCB0cmFuc21pdCBzdG9wICovCisKKwl3aGlsZSghKGZlY3AtPmZlY19pZXZlbnQgJiAweDEwMDAwMDAwKSk7CisKKwkvKiBXaGFjayBhIHJlc2V0LiAgV2Ugc2hvdWxkIHdhaXQgZm9yIHRoaXMuCisJKi8KKwlmZWNwLT5mZWNfZWNudHJsID0gMTsKKwl1ZGVsYXkoMTApOworCisJLyogQ2xlYXIgb3V0c3RhbmRpbmcgTUlJIGNvbW1hbmQgaW50ZXJydXB0cy4KKwkqLworCWZlY3AtPmZlY19pZXZlbnQgPSBGRUNfRU5FVF9NSUk7CisJZmVjX2VuYWJsZV9waHlfaW50cigpOworCisJZmVjcC0+ZmVjX2ltYXNrID0gRkVDX0VORVRfTUlJOworCWZlY3AtPmZlY19taWlfc3BlZWQgPSBmZXAtPnBoeV9zcGVlZDsKK30KKworc3RhdGljIGludCBfX2luaXQgZmVjX2VuZXRfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpLCBlcnI7CisKKwlmb3IgKGkgPSAwOyAoaSA8IEZFQ19NQVhfUE9SVFMpOyBpKyspIHsKKwkJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBmZWNfZW5ldF9wcml2YXRlKSk7CisJCWlmICghZGV2KQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWVyciA9IGZlY19lbmV0X2luaXQoZGV2KTsKKwkJaWYgKGVycikgeworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSAhPSAwKSB7CisJCQkvKiBYWFg6IG1pc3NpbmcgY2xlYW51cCBoZXJlICovCisJCQlmcmVlX25ldGRldihkZXYpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KGZlY19lbmV0X21vZHVsZV9pbml0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZmVjLmggYi9kcml2ZXJzL25ldC9mZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmU0Zjk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZmVjLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJZmVjLmggIC0tICBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgZm9yIE1vdG9yb2xhIENvbGRGaXJlIDUyNzAsCisJCSAgIDUyNzEsIDUyNzIsIDUyNzQsIDUyNzUsIDUyODAgYW5kIDUyODIuCisgKgorICoJKEMpIENvcHlyaWdodCAyMDAwLTIwMDMsIEdyZWcgVW5nZXJlciAoZ2VyZ0BzbmFwZ2Vhci5jb20pCisgKgkoQykgQ29weXJpZ2h0IDIwMDAtMjAwMSwgTGluZW8gKHd3dy5saW5lby5jb20pCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEZFQ19ICisjZGVmaW5lCUZFQ19ICisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQoQ09ORklHX001Mjd4KSB8fCBkZWZpbmVkKENPTkZJR19NNTI4eCkKKy8qCisgKglKdXN0IGZpZ3VyZXMsIE1vdG9yb2xhIHdvdWxkIGhhdmUgdG8gY2hhbmdlIHRoZSBvZmZzZXRzIGZvcgorICoJcmVnaXN0ZXJzIGluIHRoZSBzYW1lIHBlcmlwaGVyYWwgZGV2aWNlIG9uIGRpZmZlcmVudCBtb2RlbHMKKyAqCW9mIHRoZSBDb2xkRmlyZSEKKyAqLwordHlwZWRlZiBzdHJ1Y3QgZmVjIHsKKwl1bnNpZ25lZCBsb25nCWZlY19yZXNlcnZlZDA7CisJdW5zaWduZWQgbG9uZwlmZWNfaWV2ZW50OwkJLyogSW50ZXJydXB0IGV2ZW50IHJlZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX2ltYXNrOwkJLyogSW50ZXJydXB0IG1hc2sgcmVnICovCisJdW5zaWduZWQgbG9uZwlmZWNfcmVzZXJ2ZWQxOworCXVuc2lnbmVkIGxvbmcJZmVjX3JfZGVzX2FjdGl2ZTsJLyogUmVjZWl2ZSBkZXNjcmlwdG9yIHJlZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX3hfZGVzX2FjdGl2ZTsJLyogVHJhbnNtaXQgZGVzY3JpcHRvciByZWcgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19yZXNlcnZlZDJbM107CisJdW5zaWduZWQgbG9uZwlmZWNfZWNudHJsOwkJLyogRXRoZXJuZXQgY29udHJvbCByZWcgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19yZXNlcnZlZDNbNl07CisJdW5zaWduZWQgbG9uZwlmZWNfbWlpX2RhdGE7CQkvKiBNSUkgbWFuYWdlIGZyYW1lIHJlZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX21paV9zcGVlZDsJCS8qIE1JSSBzcGVlZCBjb250cm9sIHJlZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX3Jlc2VydmVkNFs3XTsKKwl1bnNpZ25lZCBsb25nCWZlY19taWJfY3RybHN0YXQ7CS8qIE1JQiBjb250cm9sL3N0YXR1cyByZWcgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19yZXNlcnZlZDVbN107CisJdW5zaWduZWQgbG9uZwlmZWNfcl9jbnRybDsJCS8qIFJlY2VpdmUgY29udHJvbCByZWcgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19yZXNlcnZlZDZbMTVdOworCXVuc2lnbmVkIGxvbmcJZmVjX3hfY250cmw7CQkvKiBUcmFuc21pdCBDb250cm9sIHJlZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX3Jlc2VydmVkN1s3XTsKKwl1bnNpZ25lZCBsb25nCWZlY19hZGRyX2xvdzsJCS8qIExvdyAzMmJpdHMgTUFDIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19hZGRyX2hpZ2g7CQkvKiBIaWdoIDE2Yml0cyBNQUMgYWRkcmVzcyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX29wZDsJCS8qIE9wY29kZSArIFBhdXNlIGR1cmF0aW9uICovCisJdW5zaWduZWQgbG9uZwlmZWNfcmVzZXJ2ZWQ4WzEwXTsKKwl1bnNpZ25lZCBsb25nCWZlY19oYXNoX3RhYmxlX2hpZ2g7CS8qIEhpZ2ggMzJiaXRzIGhhc2ggdGFibGUgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19oYXNoX3RhYmxlX2xvdzsJLyogTG93IDMyYml0cyBoYXNoIHRhYmxlICovCisJdW5zaWduZWQgbG9uZwlmZWNfZ3JwX2hhc2hfdGFibGVfaGlnaDsvKiBIaWdoIDMyYml0cyBoYXNoIHRhYmxlICovCisJdW5zaWduZWQgbG9uZwlmZWNfZ3JwX2hhc2hfdGFibGVfbG93OwkvKiBMb3cgMzJiaXRzIGhhc2ggdGFibGUgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19yZXNlcnZlZDlbN107CisJdW5zaWduZWQgbG9uZwlmZWNfeF93bXJrOwkJLyogRklGTyB0cmFuc21pdCB3YXRlciBtYXJrICovCisJdW5zaWduZWQgbG9uZwlmZWNfcmVzZXJ2ZWQxMDsKKwl1bnNpZ25lZCBsb25nCWZlY19yX2JvdW5kOwkJLyogRklGTyByZWNlaXZlIGJvdW5kIHJlZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX3JfZnN0YXJ0OwkJLyogRklGTyByZWNlaXZlIHN0YXJ0IHJlZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX3Jlc2VydmVkMTFbMTFdOworCXVuc2lnbmVkIGxvbmcJZmVjX3JfZGVzX3N0YXJ0OwkvKiBSZWNlaXZlIGRlc2NyaXB0b3IgcmluZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX3hfZGVzX3N0YXJ0OwkvKiBUcmFuc21pdCBkZXNjcmlwdG9yIHJpbmcgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19yX2J1ZmZfc2l6ZTsJLyogTWF4aW11bSByZWNlaXZlIGJ1ZmYgc2l6ZSAqLworfSBmZWNfdDsKKworI2Vsc2UKKworLyoKKyAqCURlZmluZSBkZXZpY2UgcmVnaXN0ZXIgc2V0IGFkZHJlc3MgbWFwLgorICovCit0eXBlZGVmIHN0cnVjdCBmZWMgeworCXVuc2lnbmVkIGxvbmcJZmVjX2VjbnRybDsJCS8qIEV0aGVybmV0IGNvbnRyb2wgcmVnICovCisJdW5zaWduZWQgbG9uZwlmZWNfaWV2ZW50OwkJLyogSW50ZXJydXB0IGV2ZW4gcmVnICovCisJdW5zaWduZWQgbG9uZwlmZWNfaW1hc2s7CQkvKiBJbnRlcnJ1cHQgbWFzayByZWcgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19pdmVjOwkJLyogSW50ZXJydXB0IHZlYyBzdGF0dXMgcmVnICovCisJdW5zaWduZWQgbG9uZwlmZWNfcl9kZXNfYWN0aXZlOwkvKiBSZWNlaXZlIGRlc2NyaXB0b3IgcmVnICovCisJdW5zaWduZWQgbG9uZwlmZWNfeF9kZXNfYWN0aXZlOwkvKiBUcmFuc21pdCBkZXNjcmlwdG9yIHJlZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX3Jlc2VydmVkMVsxMF07CisJdW5zaWduZWQgbG9uZwlmZWNfbWlpX2RhdGE7CQkvKiBNSUkgbWFuYWdlIGZyYW1lIHJlZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX21paV9zcGVlZDsJCS8qIE1JSSBzcGVlZCBjb250cm9sIHJlZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX3Jlc2VydmVkMlsxN107CisJdW5zaWduZWQgbG9uZwlmZWNfcl9ib3VuZDsJCS8qIEZJRk8gcmVjZWl2ZSBib3VuZCByZWcgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19yX2ZzdGFydDsJCS8qIEZJRk8gcmVjZWl2ZSBzdGFydCByZWcgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19yZXNlcnZlZDNbNF07CisJdW5zaWduZWQgbG9uZwlmZWNfeF93bXJrOwkJLyogRklGTyB0cmFuc21pdCB3YXRlciBtYXJrICovCisJdW5zaWduZWQgbG9uZwlmZWNfcmVzZXJ2ZWQ0OworCXVuc2lnbmVkIGxvbmcJZmVjX3hfZnN0YXJ0OwkJLyogRklGTyB0cmFuc21pdCBzdGFydCByZWcgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19yZXNlcnZlZDVbMjFdOworCXVuc2lnbmVkIGxvbmcJZmVjX3JfY250cmw7CQkvKiBSZWNlaXZlIGNvbnRyb2wgcmVnICovCisJdW5zaWduZWQgbG9uZwlmZWNfbWF4X2ZybV9sZW47CS8qIE1heGltdW0gZnJhbWUgbGVuZ3RoIHJlZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX3Jlc2VydmVkNlsxNF07CisJdW5zaWduZWQgbG9uZwlmZWNfeF9jbnRybDsJCS8qIFRyYW5zbWl0IENvbnRyb2wgcmVnICovCisJdW5zaWduZWQgbG9uZwlmZWNfcmVzZXJ2ZWQ3WzE1OF07CisJdW5zaWduZWQgbG9uZwlmZWNfYWRkcl9sb3c7CQkvKiBMb3cgMzJiaXRzIE1BQyBhZGRyZXNzICovCisJdW5zaWduZWQgbG9uZwlmZWNfYWRkcl9oaWdoOwkJLyogSGlnaCAxNmJpdHMgTUFDIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19oYXNoX3RhYmxlX2hpZ2g7CS8qIEhpZ2ggMzJiaXRzIGhhc2ggdGFibGUgKi8KKwl1bnNpZ25lZCBsb25nCWZlY19oYXNoX3RhYmxlX2xvdzsJLyogTG93IDMyYml0cyBoYXNoIHRhYmxlICovCisJdW5zaWduZWQgbG9uZwlmZWNfcl9kZXNfc3RhcnQ7CS8qIFJlY2VpdmUgZGVzY3JpcHRvciByaW5nICovCisJdW5zaWduZWQgbG9uZwlmZWNfeF9kZXNfc3RhcnQ7CS8qIFRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZyAqLworCXVuc2lnbmVkIGxvbmcJZmVjX3JfYnVmZl9zaXplOwkvKiBNYXhpbXVtIHJlY2VpdmUgYnVmZiBzaXplICovCisJdW5zaWduZWQgbG9uZwlyZXNlcnZlZDhbOV07CisJdW5zaWduZWQgbG9uZwlmZWNfZmlmb19yYW1bMTEyXTsJLyogRklGTyBSQU0gYnVmZmVyICovCit9IGZlY190OworCisjZW5kaWYgLyogQ09ORklHX001MjcyICovCisKKworLyoKKyAqCURlZmluZSB0aGUgYnVmZmVyIGRlc2NyaXB0b3Igc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBidWZkZXNjIHsKKwl1bnNpZ25lZCBzaG9ydAljYmRfc2M7CQkJLyogQ29udHJvbCBhbmQgc3RhdHVzIGluZm8gKi8KKwl1bnNpZ25lZCBzaG9ydAljYmRfZGF0bGVuOwkJLyogRGF0YSBsZW5ndGggKi8KKwl1bnNpZ25lZCBsb25nCWNiZF9idWZhZGRyOwkJLyogQnVmZmVyIGFkZHJlc3MgKi8KK30gY2JkX3Q7CisKKworLyoKKyAqCVRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgY291cnRlc3kgb2YgY29tbXByb2MuaCwgd2hpY2ggd2hlcmUKKyAqCUNvcHlyaWdodCAoYykgMTk5NyBEYW4gTWFsZWsgKGRtYWxla0BqbGMubmV0KS4KKyAqLworI2RlZmluZSBCRF9TQ19FTVBUWSAgICAgKCh1c2hvcnQpMHg4MDAwKSAgICAgICAgLyogUmVjaWV2ZSBpcyBlbXB0eSAqLworI2RlZmluZSBCRF9TQ19SRUFEWSAgICAgKCh1c2hvcnQpMHg4MDAwKSAgICAgICAgLyogVHJhbnNtaXQgaXMgcmVhZHkgKi8KKyNkZWZpbmUgQkRfU0NfV1JBUCAgICAgICgodXNob3J0KTB4MjAwMCkgICAgICAgIC8qIExhc3QgYnVmZmVyIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgQkRfU0NfSU5UUlBUICAgICgodXNob3J0KTB4MTAwMCkgICAgICAgIC8qIEludGVycnVwdCBvbiBjaGFuZ2UgKi8KKyNkZWZpbmUgQkRfU0NfQ00gICAgICAgICgodXNob3J0KTB4MDIwMCkgICAgICAgIC8qIENvbnRpbm91cyBtb2RlICovCisjZGVmaW5lIEJEX1NDX0lEICAgICAgICAoKHVzaG9ydCkweDAxMDApICAgICAgICAvKiBSZWMnZCB0b28gbWFueSBpZGxlcyAqLworI2RlZmluZSBCRF9TQ19QICAgICAgICAgKCh1c2hvcnQpMHgwMTAwKSAgICAgICAgLyogeG10IHByZWFtYmxlICovCisjZGVmaW5lIEJEX1NDX0JSICAgICAgICAoKHVzaG9ydCkweDAwMjApICAgICAgICAvKiBCcmVhayByZWNlaXZlZCAqLworI2RlZmluZSBCRF9TQ19GUiAgICAgICAgKCh1c2hvcnQpMHgwMDEwKSAgICAgICAgLyogRnJhbWluZyBlcnJvciAqLworI2RlZmluZSBCRF9TQ19QUiAgICAgICAgKCh1c2hvcnQpMHgwMDA4KSAgICAgICAgLyogUGFyaXR5IGVycm9yICovCisjZGVmaW5lIEJEX1NDX09WICAgICAgICAoKHVzaG9ydCkweDAwMDIpICAgICAgICAvKiBPdmVycnVuICovCisjZGVmaW5lIEJEX1NDX0NEICAgICAgICAoKHVzaG9ydCkweDAwMDEpICAgICAgICAvKiA/PyAqLworCisvKiBCdWZmZXIgZGVzY3JpcHRvciBjb250cm9sL3N0YXR1cyB1c2VkIGJ5IEV0aGVybmV0IHJlY2VpdmUuCisqLworI2RlZmluZSBCRF9FTkVUX1JYX0VNUFRZICAgICAgICAoKHVzaG9ydCkweDgwMDApCisjZGVmaW5lIEJEX0VORVRfUlhfV1JBUCAgICAgICAgICgodXNob3J0KTB4MjAwMCkKKyNkZWZpbmUgQkRfRU5FVF9SWF9JTlRSICAgICAgICAgKCh1c2hvcnQpMHgxMDAwKQorI2RlZmluZSBCRF9FTkVUX1JYX0xBU1QgICAgICAgICAoKHVzaG9ydCkweDA4MDApCisjZGVmaW5lIEJEX0VORVRfUlhfRklSU1QgICAgICAgICgodXNob3J0KTB4MDQwMCkKKyNkZWZpbmUgQkRfRU5FVF9SWF9NSVNTICAgICAgICAgKCh1c2hvcnQpMHgwMTAwKQorI2RlZmluZSBCRF9FTkVUX1JYX0xHICAgICAgICAgICAoKHVzaG9ydCkweDAwMjApCisjZGVmaW5lIEJEX0VORVRfUlhfTk8gICAgICAgICAgICgodXNob3J0KTB4MDAxMCkKKyNkZWZpbmUgQkRfRU5FVF9SWF9TSCAgICAgICAgICAgKCh1c2hvcnQpMHgwMDA4KQorI2RlZmluZSBCRF9FTkVUX1JYX0NSICAgICAgICAgICAoKHVzaG9ydCkweDAwMDQpCisjZGVmaW5lIEJEX0VORVRfUlhfT1YgICAgICAgICAgICgodXNob3J0KTB4MDAwMikKKyNkZWZpbmUgQkRfRU5FVF9SWF9DTCAgICAgICAgICAgKCh1c2hvcnQpMHgwMDAxKQorI2RlZmluZSBCRF9FTkVUX1JYX1NUQVRTICAgICAgICAoKHVzaG9ydCkweDAxM2YpICAgICAgICAvKiBBbGwgc3RhdHVzIGJpdHMgKi8KKworLyogQnVmZmVyIGRlc2NyaXB0b3IgY29udHJvbC9zdGF0dXMgdXNlZCBieSBFdGhlcm5ldCB0cmFuc21pdC4KKyovCisjZGVmaW5lIEJEX0VORVRfVFhfUkVBRFkgICAgICAgICgodXNob3J0KTB4ODAwMCkKKyNkZWZpbmUgQkRfRU5FVF9UWF9QQUQgICAgICAgICAgKCh1c2hvcnQpMHg0MDAwKQorI2RlZmluZSBCRF9FTkVUX1RYX1dSQVAgICAgICAgICAoKHVzaG9ydCkweDIwMDApCisjZGVmaW5lIEJEX0VORVRfVFhfSU5UUiAgICAgICAgICgodXNob3J0KTB4MTAwMCkKKyNkZWZpbmUgQkRfRU5FVF9UWF9MQVNUICAgICAgICAgKCh1c2hvcnQpMHgwODAwKQorI2RlZmluZSBCRF9FTkVUX1RYX1RDICAgICAgICAgICAoKHVzaG9ydCkweDA0MDApCisjZGVmaW5lIEJEX0VORVRfVFhfREVGICAgICAgICAgICgodXNob3J0KTB4MDIwMCkKKyNkZWZpbmUgQkRfRU5FVF9UWF9IQiAgICAgICAgICAgKCh1c2hvcnQpMHgwMTAwKQorI2RlZmluZSBCRF9FTkVUX1RYX0xDICAgICAgICAgICAoKHVzaG9ydCkweDAwODApCisjZGVmaW5lIEJEX0VORVRfVFhfUkwgICAgICAgICAgICgodXNob3J0KTB4MDA0MCkKKyNkZWZpbmUgQkRfRU5FVF9UWF9SQ01BU0sgICAgICAgKCh1c2hvcnQpMHgwMDNjKQorI2RlZmluZSBCRF9FTkVUX1RYX1VOICAgICAgICAgICAoKHVzaG9ydCkweDAwMDIpCisjZGVmaW5lIEJEX0VORVRfVFhfQ1NMICAgICAgICAgICgodXNob3J0KTB4MDAwMSkKKyNkZWZpbmUgQkRfRU5FVF9UWF9TVEFUUyAgICAgICAgKCh1c2hvcnQpMHgwM2ZmKSAgICAgICAgLyogQWxsIHN0YXR1cyBiaXRzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYgLyogRkVDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZlY184eHgvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2ZlY184eHgvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjM2YWMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZmVjXzh4eC9LY29uZmlnCkBAIC0wLDAgKzEsMTQgQEAKK2NvbmZpZyBGRUNfOFhYCisJdHJpc3RhdGUgIk1vdG9yb2xhIDh4eCBGRUMgZHJpdmVyIgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIDh4eCAmJiAoTkVUVEEgfHwgTkVUUEhPTkUpCisJc2VsZWN0IE1JSQorCitjb25maWcgRkVDXzhYWF9HRU5FUklDX1BIWQorCWJvb2wgIlN1cHBvcnQgYW55IGdlbmVyaWMgUEhZIgorCWRlcGVuZHMgb24gRkVDXzhYWAorCWRlZmF1bHQgeQorCitjb25maWcgRkVDXzhYWF9ETTkxNjFfUEhZCisJYm9vbCAiU3VwcG9ydCBETTkxNjEgUEhZIgorCWRlcGVuZHMgb24gRkVDXzhYWAorCWRlZmF1bHQgbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZmVjXzh4eC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2ZlY184eHgvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBjNTRmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2ZlY184eHgvTWFrZWZpbGUKQEAgLTAsMCArMSwxMiBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIE1vdG9yb2xhIDh4eCBGRUMgZXRoZXJuZXQgY29udHJvbGxlcgorIworCitvYmotJChDT05GSUdfRkVDXzhYWCkgKz0gZmVjXzh4eC5vCisKK2ZlY184eHgtb2JqcyA6PSBmZWNfbWFpbi5vIGZlY19taWkubworCisjIHRoZSBwbGF0Zm9ybSBpbnN0YW50YXRpYXRpb24gb2JqZWN0cworaWZlcSAoJChDT05GSUdfTkVUVEEpLHkpCitmZWNfOHh4LW9ianMJKz0gZmVjXzh4eC1uZXR0YS5vCitlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZmVjXzh4eC9mZWNfOHh4LW5ldHRhLmMgYi9kcml2ZXJzL25ldC9mZWNfOHh4L2ZlY184eHgtbmV0dGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWMyNzVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZmVjXzh4eC9mZWNfOHh4LW5ldHRhLmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBGRUMgaW5zdGFudGF0aWF0aW9uIGZpbGUgZm9yIE5FVFRBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtLzh4eF9pbW1hcC5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL21wYzh4eC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9jb21tcHJvYy5oPgorCisjaW5jbHVkZSAiZmVjXzh4eC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBmZWNfcGxhdGZvcm1faW5mbyBmZWMxX2luZm8gPSB7CisJLmZlY19ubyA9IDAsCisJLnVzZV9tZGlvID0gMSwKKwkucGh5X2FkZHIgPSA4LAorCS5mZWNfaXJxID0gU0lVX0xFVkVMMSwKKwkucGh5X2lycSA9IENQTV9JUlFfT0ZGU0VUICsgQ1BNVkVDX1BJT19QQzYsCisJLnJ4X3JpbmcgPSAxMjgsCisJLnR4X3JpbmcgPSAxNiwKKwkucnhfY29weWJyZWFrID0gMjQwLAorCS51c2VfbmFwaSA9IDEsCisJLm5hcGlfd2VpZ2h0ID0gMTcsCit9OworCitzdGF0aWMgc3RydWN0IGZlY19wbGF0Zm9ybV9pbmZvIGZlYzJfaW5mbyA9IHsKKwkuZmVjX25vID0gMSwKKwkudXNlX21kaW8gPSAxLAorCS5waHlfYWRkciA9IDIsCisJLmZlY19pcnEgPSBTSVVfTEVWRUwzLAorCS5waHlfaXJxID0gQ1BNX0lSUV9PRkZTRVQgKyBDUE1WRUNfUElPX1BDNywKKwkucnhfcmluZyA9IDEyOCwKKwkudHhfcmluZyA9IDE2LAorCS5yeF9jb3B5YnJlYWsgPSAyNDAsCisJLnVzZV9uYXBpID0gMSwKKwkubmFwaV93ZWlnaHQgPSAxNywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZmVjMV9kZXY7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmZlYzJfZGV2OworCisvKiBYWFggY3VzdG9tIHUtYm9vdCAmIExpbnV4IHN0YXJ0dXAgbmVlZGVkICovCitleHRlcm4gY29uc3QgY2hhciAqX19md19nZXRlbnYoY29uc3QgY2hhciAqdmFyKTsKKworLyogYWNjZXNzIHBvcnRzICovCisjZGVmaW5lIHNldGJpdHMzMihfYWRkciwgX3YpIF9fZmVjX291dDMyKCYoX2FkZHIpLCBfX2ZlY19pbjMyKCYoX2FkZHIpKSB8ICAoX3YpKQorI2RlZmluZSBjbHJiaXRzMzIoX2FkZHIsIF92KSBfX2ZlY19vdXQzMigmKF9hZGRyKSwgX19mZWNfaW4zMigmKF9hZGRyKSkgJiB+KF92KSkKKworI2RlZmluZSBzZXRiaXRzMTYoX2FkZHIsIF92KSBfX2ZlY19vdXQxNigmKF9hZGRyKSwgX19mZWNfaW4xNigmKF9hZGRyKSkgfCAgKF92KSkKKyNkZWZpbmUgY2xyYml0czE2KF9hZGRyLCBfdikgX19mZWNfb3V0MTYoJihfYWRkciksIF9fZmVjX2luMTYoJihfYWRkcikpICYgfihfdikpCisKK2ludCBmZWNfOHh4X3BsYXRmb3JtX2luaXQodm9pZCkKK3sKKwlpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopSU1BUF9BRERSOworCWJkX3QgKmJkID0gKGJkX3QgKikgX19yZXM7CisJY29uc3QgY2hhciAqczsKKwljaGFyICplOworCWludCBpOworCisJLyogdXNlIE1EQyBmb3IgTUlJICovCisJc2V0Yml0czE2KGltbWFwLT5pbV9pb3BvcnQuaW9wX3BkcGFyLCAweDAwODApOworCWNscmJpdHMxNihpbW1hcC0+aW1faW9wb3J0LmlvcF9wZGRpciwgMHgwMDgwKTsKKworCS8qIGNvbmZpZ3VyZSBGRUMxIHBpbnMgKi8KKwlzZXRiaXRzMTYoaW1tYXAtPmltX2lvcG9ydC5pb3BfcGFwYXIsIDB4ZTgxMCk7CisJc2V0Yml0czE2KGltbWFwLT5pbV9pb3BvcnQuaW9wX3BhZGlyLCAweDA4MTApOworCWNscmJpdHMxNihpbW1hcC0+aW1faW9wb3J0LmlvcF9wYWRpciwgMHhlMDAwKTsKKworCXNldGJpdHMzMihpbW1hcC0+aW1fY3BtLmNwX3BicGFyLCAweDAwMDAwMDAxKTsKKwljbHJiaXRzMzIoaW1tYXAtPmltX2NwbS5jcF9wYmRpciwgMHgwMDAwMDAwMSk7CisKKwlzZXRiaXRzMzIoaW1tYXAtPmltX2NwbS5jcF9jcHRyLCAweDAwMDAwMTAwKTsKKwljbHJiaXRzMzIoaW1tYXAtPmltX2NwbS5jcF9jcHRyLCAweDAwMDAwMDUwKTsKKworCWNscmJpdHMxNihpbW1hcC0+aW1faW9wb3J0LmlvcF9wY3BhciwgMHgwMjAwKTsKKwljbHJiaXRzMTYoaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNkaXIsIDB4MDIwMCk7CisJY2xyYml0czE2KGltbWFwLT5pbV9pb3BvcnQuaW9wX3Bjc28sIDB4MDIwMCk7CisJc2V0Yml0czE2KGltbWFwLT5pbV9pb3BvcnQuaW9wX3BjaW50LCAweDAyMDApOworCisJLyogY29uZmlndXJlIEZFQzIgcGlucyAqLworCXNldGJpdHMzMihpbW1hcC0+aW1fY3BtLmNwX3BlcGFyLCAweDAwMDM5NjIwKTsKKwlzZXRiaXRzMzIoaW1tYXAtPmltX2NwbS5jcF9wZWRpciwgMHgwMDAzOTYyMCk7CisJc2V0Yml0czMyKGltbWFwLT5pbV9jcG0uY3BfcGVzbywgMHgwMDAzMTAwMCk7CisJY2xyYml0czMyKGltbWFwLT5pbV9jcG0uY3BfcGVzbywgMHgwMDAwODYyMCk7CisKKwlzZXRiaXRzMzIoaW1tYXAtPmltX2NwbS5jcF9jcHRyLCAweDAwMDAwMDgwKTsKKwljbHJiaXRzMzIoaW1tYXAtPmltX2NwbS5jcF9jcHRyLCAweDAwMDAwMDI4KTsKKworCWNscmJpdHMxNihpbW1hcC0+aW1faW9wb3J0LmlvcF9wY3BhciwgMHgwMjAwKTsKKwljbHJiaXRzMTYoaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNkaXIsIDB4MDIwMCk7CisJY2xyYml0czE2KGltbWFwLT5pbV9pb3BvcnQuaW9wX3Bjc28sIDB4MDIwMCk7CisJc2V0Yml0czE2KGltbWFwLT5pbV9pb3BvcnQuaW9wX3BjaW50LCAweDAyMDApOworCisJLyogZmlsbCB1cCAqLworCWZlYzFfaW5mby5zeXNfY2xrID0gYmQtPmJpX2ludGZyZXE7CisJZmVjMl9pbmZvLnN5c19jbGsgPSBiZC0+YmlfaW50ZnJlcTsKKworCXMgPSBfX2Z3X2dldGVudigiZXRoYWRkciIpOworCWlmIChzICE9IE5VTEwpIHsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQkJZmVjMV9pbmZvLm1hY2FkZHJbaV0gPSBzaW1wbGVfc3RydG91bChzLCAmZSwgMTYpOworCQkJaWYgKCplKQorCQkJCXMgPSBlICsgMTsKKwkJfQorCX0KKworCXMgPSBfX2Z3X2dldGVudigiZXRoMWFkZHIiKTsKKwlpZiAocyAhPSBOVUxMKSB7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJCWZlYzJfaW5mby5tYWNhZGRyW2ldID0gc2ltcGxlX3N0cnRvdWwocywgJmUsIDE2KTsKKwkJCWlmICgqZSkKKwkJCQlzID0gZSArIDE7CisJCX0KKwl9CisKKwlmZWNfOHh4X2luaXRfb25lKCZmZWMxX2luZm8sICZmZWMxX2Rldik7CisJZmVjXzh4eF9pbml0X29uZSgmZmVjMl9pbmZvLCAmZmVjMl9kZXYpOworCisJcmV0dXJuIGZlYzFfZGV2ICE9IE5VTEwgJiYgZmVjMl9kZXYgIT0gTlVMTCA/IDAgOiAtMTsKK30KKwordm9pZCBmZWNfOHh4X3BsYXRmb3JtX2NsZWFudXAodm9pZCkKK3sKKwlpZiAoZmVjMl9kZXYgIT0gTlVMTCkKKwkJZmVjXzh4eF9jbGVhbnVwX29uZShmZWMyX2Rldik7CisKKwlpZiAoZmVjMV9kZXYgIT0gTlVMTCkKKwkJZmVjXzh4eF9jbGVhbnVwX29uZShmZWMxX2Rldik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mZWNfOHh4L2ZlY184eHguaCBiL2RyaXZlcnMvbmV0L2ZlY184eHgvZmVjXzh4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZjYwYjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9mZWNfOHh4L2ZlY184eHguaApAQCAtMCwwICsxLDIxOCBAQAorI2lmbmRlZiBGRUNfOFhYX0gKKyNkZWZpbmUgRkVDXzhYWF9ICisKKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIEhXIGluZm8gKi8KKworLyogQ1JDIHBvbHlub21pdW0gdXNlZCBieSB0aGUgRkVDIGZvciB0aGUgbXVsdGljYXN0IGdyb3VwIGZpbHRlcmluZyAqLworI2RlZmluZSBGRUNfQ1JDX1BPTFkgICAweDA0QzExREI3CisKKyNkZWZpbmUgTUlJX0FEVkVSVElTRV9IQUxGCShBRFZFUlRJU0VfMTAwSEFMRiB8IFwKKwkJCQkgQURWRVJUSVNFXzEwSEFMRiB8IEFEVkVSVElTRV9DU01BKQorI2RlZmluZSBNSUlfQURWRVJUSVNFX0FMTAkoQURWRVJUSVNFXzEwMEZVTEwgfCBcCisJCQkJIEFEVkVSVElTRV8xMEZVTEwgfCBNSUlfQURWRVJUSVNFX0hBTEYpCisKKy8qIEludGVycnVwdCBldmVudHMvbWFza3MuCisqLworI2RlZmluZSBGRUNfRU5FVF9IQkVSUgkweDgwMDAwMDAwVQkvKiBIZWFydGJlYXQgZXJyb3IgICAgICAgICAgKi8KKyNkZWZpbmUgRkVDX0VORVRfQkFCUgkweDQwMDAwMDAwVQkvKiBCYWJibGluZyByZWNlaXZlciAgICAgICAgKi8KKyNkZWZpbmUgRkVDX0VORVRfQkFCVAkweDIwMDAwMDAwVQkvKiBCYWJibGluZyB0cmFuc21pdHRlciAgICAgKi8KKyNkZWZpbmUgRkVDX0VORVRfR1JBCTB4MTAwMDAwMDBVCS8qIEdyYWNlZnVsIHN0b3AgY29tcGxldGUgICAqLworI2RlZmluZSBGRUNfRU5FVF9UWEYJMHgwODAwMDAwMFUJLyogRnVsbCBmcmFtZSB0cmFuc21pdHRlZCAgICovCisjZGVmaW5lIEZFQ19FTkVUX1RYQgkweDA0MDAwMDAwVQkvKiBBIGJ1ZmZlciB3YXMgdHJhbnNtaXR0ZWQgKi8KKyNkZWZpbmUgRkVDX0VORVRfUlhGCTB4MDIwMDAwMDBVCS8qIEZ1bGwgZnJhbWUgcmVjZWl2ZWQgICAgICAqLworI2RlZmluZSBGRUNfRU5FVF9SWEIJMHgwMTAwMDAwMFUJLyogQSBidWZmZXIgd2FzIHJlY2VpdmVkICAgICovCisjZGVmaW5lIEZFQ19FTkVUX01JSQkweDAwODAwMDAwVQkvKiBNSUkgaW50ZXJydXB0ICAgICAgICAgICAgKi8KKyNkZWZpbmUgRkVDX0VORVRfRUJFUlIJMHgwMDQwMDAwMFUJLyogU0RNQSBidXMgZXJyb3IgICAgICAgICAgICovCisKKyNkZWZpbmUgRkVDX0VDTlRSTF9QSU5NVVgJMHgwMDAwMDAwNAorI2RlZmluZSBGRUNfRUNOVFJMX0VUSEVSX0VOCTB4MDAwMDAwMDIKKyNkZWZpbmUgRkVDX0VDTlRSTF9SRVNFVAkweDAwMDAwMDAxCisKKyNkZWZpbmUgRkVDX1JDTlRSTF9CQ19SRUoJMHgwMDAwMDAxMAorI2RlZmluZSBGRUNfUkNOVFJMX1BST00JCTB4MDAwMDAwMDgKKyNkZWZpbmUgRkVDX1JDTlRSTF9NSUlfTU9ERQkweDAwMDAwMDA0CisjZGVmaW5lIEZFQ19SQ05UUkxfRFJUCQkweDAwMDAwMDAyCisjZGVmaW5lIEZFQ19SQ05UUkxfTE9PUAkJMHgwMDAwMDAwMQorCisjZGVmaW5lIEZFQ19UQ05UUkxfRkRFTgkJMHgwMDAwMDAwNAorI2RlZmluZSBGRUNfVENOVFJMX0hCQwkJMHgwMDAwMDAwMgorI2RlZmluZSBGRUNfVENOVFJMX0dUUwkJMHgwMDAwMDAwMQorCisvKiB2YWx1ZXMgZm9yIE1JSSBwaHlfc3RhdHVzICovCisKKyNkZWZpbmUgUEhZX0NPTkZfQU5FCTB4MDAwMQkvKiAxIGF1dG8tbmVnb3RpYXRpb24gZW5hYmxlZCAgICAgKi8KKyNkZWZpbmUgUEhZX0NPTkZfTE9PUAkweDAwMDIJLyogMSBsb29wYmFjayBtb2RlIGVuYWJsZWQgICAgICAgICovCisjZGVmaW5lIFBIWV9DT05GX1NQTUFTSwkweDAwZjAJLyogbWFzayBmb3Igc3BlZWQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBIWV9DT05GXzEwSERYCTB4MDAxMAkvKiAxMCBNYml0IGhhbGYgZHVwbGV4IHN1cHBvcnRlZCAgKi8KKyNkZWZpbmUgUEhZX0NPTkZfMTBGRFgJMHgwMDIwCS8qIDEwIE1iaXQgZnVsbCBkdXBsZXggc3VwcG9ydGVkICAqLworI2RlZmluZSBQSFlfQ09ORl8xMDBIRFgJMHgwMDQwCS8qIDEwMCBNYml0IGhhbGYgZHVwbGV4IHN1cHBvcnRlZCAqLworI2RlZmluZSBQSFlfQ09ORl8xMDBGRFgJMHgwMDgwCS8qIDEwMCBNYml0IGZ1bGwgZHVwbGV4IHN1cHBvcnRlZCAqLworCisjZGVmaW5lIFBIWV9TVEFUX0xJTksJMHgwMTAwCS8qIDEgdXAgLSAwIGRvd24gICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBQSFlfU1RBVF9GQVVMVAkweDAyMDAJLyogMSByZW1vdGUgZmF1bHQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBIWV9TVEFUX0FOQwkweDA0MDAJLyogMSBhdXRvLW5lZ290aWF0aW9uIGNvbXBsZXRlICAgICovCisjZGVmaW5lIFBIWV9TVEFUX1NQTUFTSwkweGYwMDAJLyogbWFzayBmb3Igc3BlZWQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBIWV9TVEFUXzEwSERYCTB4MTAwMAkvKiAxMCBNYml0IGhhbGYgZHVwbGV4IHNlbGVjdGVkICAgKi8KKyNkZWZpbmUgUEhZX1NUQVRfMTBGRFgJMHgyMDAwCS8qIDEwIE1iaXQgZnVsbCBkdXBsZXggc2VsZWN0ZWQgICAqLworI2RlZmluZSBQSFlfU1RBVF8xMDBIRFgJMHg0MDAwCS8qIDEwMCBNYml0IGhhbGYgZHVwbGV4IHNlbGVjdGVkICAqLworI2RlZmluZSBQSFlfU1RBVF8xMDBGRFgJMHg4MDAwCS8qIDEwMCBNYml0IGZ1bGwgZHVwbGV4IHNlbGVjdGVkICAqLworCit0eXBlZGVmIHN0cnVjdCBwaHlfaW5mbyB7CisJdW5zaWduZWQgaW50IGlkOworCWNvbnN0IGNoYXIgKm5hbWU7CisJdm9pZCAoKnN0YXJ0dXApIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldik7CisJdm9pZCAoKnNodXRkb3duKSAoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpOworCXZvaWQgKCphY2tfaW50KSAoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpOworfSBwaHlfaW5mb190OworCisvKiBUaGUgRkVDIHN0b3JlcyBkZXN0L3NyYy90eXBlLCBkYXRhLCBhbmQgY2hlY2tzdW0gZm9yIHJlY2VpdmUgcGFja2V0cy4KKyAqLworI2RlZmluZSBNQVhfTVRVIDE1MDgJCS8qIEFsbG93IGZ1bGxzaXplZCBwcHBvZSBwYWNrZXRzIG92ZXIgVkxBTiAqLworI2RlZmluZSBNSU5fTVRVIDQ2CQkvKiB0aGlzIGlzIGRhdGEgc2l6ZSAqLworI2RlZmluZSBDUkNfTEVOIDQKKworI2RlZmluZSBQS1RfTUFYQlVGX1NJWkUJCShNQVhfTVRVK0VUSF9ITEVOK0NSQ19MRU4pCisjZGVmaW5lIFBLVF9NSU5CVUZfU0laRQkJKE1JTl9NVFUrRVRIX0hMRU4rQ1JDX0xFTikKKworLyogTXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgKi8KKyNkZWZpbmUgUEtUX01BWEJMUl9TSVpFCQkoKFBLVF9NQVhCVUZfU0laRSszKSAmIH4zKQorLyogVGhpcyBpcyBuZWVkZWQgc28gdGhhdCBpbnZhbGlkYXRlX3h4eCB3b250IGludmFsaWRhdGUgdG9vIG11Y2ggKi8KKyNkZWZpbmUgRU5FVF9SWF9GUlNJWkUJCUwxX0NBQ0hFX0FMSUdOKFBLVF9NQVhCVUZfU0laRSkKKworLyogcGxhdGZvcm0gaW50ZXJmYWNlICovCisKK3N0cnVjdCBmZWNfcGxhdGZvcm1faW5mbyB7CisJaW50IGZlY19ubzsJCS8qIEZFQyBpbmRleCAgICAgICAgICAgICAgICAgICovCisJaW50IHVzZV9tZGlvOwkJLyogdXNlIGV4dGVybmFsIE1JSSAgICAgICAgICAgKi8KKwlpbnQgcGh5X2FkZHI7CQkvKiB0aGUgcGh5IGFkZHJlc3MgICAgICAgICAgICAqLworCWludCBmZWNfaXJxLCBwaHlfaXJxOwkvKiB0aGUgaXJxIGZvciB0aGUgY29udHJvbGxlciAqLworCWludCByeF9yaW5nLCB0eF9yaW5nOwkvKiBudW1iZXIgb2YgYnVmZmVycyBvbiByeCAgICAqLworCWludCBzeXNfY2xrOwkJLyogc3lzdGVtIGNsb2NrICAgICAgICAgICAgICAgKi8KKwlfX3U4IG1hY2FkZHJbNl07CS8qIG1hYyBhZGRyZXNzICAgICAgICAgICAgICAgICovCisJaW50IHJ4X2NvcHlicmVhazsJLyogbGltaXQgd2UgY29weSBzbWFsbCBmcmFtZXMgKi8KKwlpbnQgdXNlX25hcGk7CQkvKiB1c2UgTkFQSSAgICAgICAgICAgICAgICAgICAqLworCWludCBuYXBpX3dlaWdodDsJLyogTkFQSSB3ZWlnaHQgICAgICAgICAgICAgICAgKi8KK307CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0cnVjdCBmZWM7CisKK3N0cnVjdCBmZWNfZW5ldF9wcml2YXRlIHsKKwlzcGlubG9ja190IGxvY2s7CS8qIGR1cmluZyBhbGwgb3BzIGV4Y2VwdCBUWCBwY2t0IHByb2Nlc3NpbmcgKi8KKwlzcGlubG9ja190IHR4X2xvY2s7CS8qIGR1cmluZyBmZWNfc3RhcnRfeG1pdCBhbmQgZmVjX3R4ICAgICAgICAgKi8KKwlpbnQgZmVjbm87CisJc3RydWN0IGZlYyAqZmVjcDsKKwljb25zdCBzdHJ1Y3QgZmVjX3BsYXRmb3JtX2luZm8gKmZwaTsKKwlpbnQgcnhfcmluZywgdHhfcmluZzsKKwlkbWFfYWRkcl90IHJpbmdfbWVtX2FkZHI7CisJdm9pZCAqcmluZ19iYXNlOworCXN0cnVjdCBza19idWZmICoqcnhfc2tidWZmOworCXN0cnVjdCBza19idWZmICoqdHhfc2tidWZmOworCWNiZF90ICpyeF9iZF9iYXNlOwkvKiBBZGRyZXNzIG9mIFJ4IGFuZCBUeCBidWZmZXJzLiAgICAqLworCWNiZF90ICp0eF9iZF9iYXNlOworCWNiZF90ICpkaXJ0eV90eDsJLyogcmluZyBlbnRyaWVzIHRvIGJlIGZyZWUoKWVkLiAgICAgKi8KKwljYmRfdCAqY3VyX3J4OworCWNiZF90ICpjdXJfdHg7CisJaW50IHR4X2ZyZWU7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IHRpbWVyX2xpc3QgcGh5X3RpbWVyX2xpc3Q7CisJY29uc3Qgc3RydWN0IHBoeV9pbmZvICpwaHk7CisJdW5zaWduZWQgaW50IGZlY19waHlfc3BlZWQ7CisJX191MzIgbXNnX2VuYWJsZTsKKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpX2lmOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBmZWNfcmVzdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZHVwbGV4LCBpbnQgc3BlZWQpOwordm9pZCBmZWNfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IGZlY19taWlfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOwordm9pZCBmZWNfbWlpX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKTsKKworaW50IGZlY19taWlfcGh5X2lkX2RldGVjdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgZmVjX21paV9zdGFydHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBmZWNfbWlpX3NodXRkb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBmZWNfbWlpX2Fja19pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3ZvaWQgZmVjX21paV9saW5rX3N0YXR1c19jaGFuZ2VfY2hlY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluaXRfbWVkaWEpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEZFQzFfTk8JMHgwMAorI2RlZmluZSBGRUMyX05PCTB4MDEKKyNkZWZpbmUgRkVDM19OTwkweDAyCisKK2ludCBmZWNfOHh4X2luaXRfb25lKGNvbnN0IHN0cnVjdCBmZWNfcGxhdGZvcm1faW5mbyAqZnBpLAorCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICoqZGV2cCk7CitpbnQgZmVjXzh4eF9jbGVhbnVwX29uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJmZWNfOHh4IgorI2RlZmluZSBQRlggRFJWX01PRFVMRV9OQU1FCSI6ICIKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIwLjEiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiTWF5IDYsIDIwMDQiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBmZWNfOHh4X3BsYXRmb3JtX2luaXQodm9pZCk7Cit2b2lkIGZlY184eHhfcGxhdGZvcm1fY2xlYW51cCh2b2lkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRkVDIGFjY2VzcyBtYWNyb3MgKi8KKyNpZiBkZWZpbmVkKENPTkZJR184eHgpCisvKiBmb3IgYSA4eHggX19yYXdfeHh4J3MgYXJlIHN1ZmZpY2llbnQgKi8KKyNkZWZpbmUgX19mZWNfb3V0MzIoYWRkciwgeCkJX19yYXdfd3JpdGVsKHgsIGFkZHIpCisjZGVmaW5lIF9fZmVjX291dDE2KGFkZHIsIHgpCV9fcmF3X3dyaXRldyh4LCBhZGRyKQorI2RlZmluZSBfX2ZlY19pbjMyKGFkZHIpCV9fcmF3X3JlYWRsKGFkZHIpCisjZGVmaW5lIF9fZmVjX2luMTYoYWRkcikJX19yYXdfcmVhZHcoYWRkcikKKyNlbHNlCisvKiBmb3Igb3RoZXJzIHBsYXkgaXQgc2FmZSAqLworI2RlZmluZSBfX2ZlY19vdXQzMihhZGRyLCB4KQlvdXRfYmUzMihhZGRyLCB4KQorI2RlZmluZSBfX2ZlY19vdXQxNihhZGRyLCB4KQlvdXRfYmUxNihhZGRyLCB4KQorI2RlZmluZSBfX2ZlY19pbjMyKGFkZHIpCWluX2JlMzIoYWRkcikKKyNkZWZpbmUgX19mZWNfaW4xNihhZGRyKQlpbl9iZTE2KGFkZHIpCisjZW5kaWYKKworLyogd3JpdGUgKi8KKyNkZWZpbmUgRlcoX2ZlY3AsIF9yZWcsIF92KSBfX2ZlY19vdXQzMigmKF9mZWNwKS0+ZmVjXyAjIyBfcmVnLCAoX3YpKQorCisvKiByZWFkICovCisjZGVmaW5lIEZSKF9mZWNwLCBfcmVnKQlfX2ZlY19pbjMyKCYoX2ZlY3ApLT5mZWNfICMjIF9yZWcpCisKKy8qIHNldCBiaXRzICovCisjZGVmaW5lIEZTKF9mZWNwLCBfcmVnLCBfdikgRlcoX2ZlY3AsIF9yZWcsIEZSKF9mZWNwLCBfcmVnKSB8IChfdikpCisKKy8qIGNsZWFyIGJpdHMgKi8KKyNkZWZpbmUgRkMoX2ZlY3AsIF9yZWcsIF92KSBGVyhfZmVjcCwgX3JlZywgRlIoX2ZlY3AsIF9yZWcpICYgfihfdikpCisKKy8qIGJ1ZmZlciBkZXNjcmlwdG9yIGFjY2VzcyBtYWNyb3MgKi8KKworLyogd3JpdGUgKi8KKyNkZWZpbmUgQ0JEV19TQyhfY2JkLCBfc2MpIAkJX19mZWNfb3V0MTYoJihfY2JkKS0+Y2JkX3NjLCAoX3NjKSkKKyNkZWZpbmUgQ0JEV19EQVRMRU4oX2NiZCwgX2RhdGxlbikJX19mZWNfb3V0MTYoJihfY2JkKS0+Y2JkX2RhdGxlbiwgKF9kYXRsZW4pKQorI2RlZmluZSBDQkRXX0JVRkFERFIoX2NiZCwgX2J1ZmFkZHIpCV9fZmVjX291dDMyKCYoX2NiZCktPmNiZF9idWZhZGRyLCAoX2J1ZmFkZHIpKQorCisvKiByZWFkICovCisjZGVmaW5lIENCRFJfU0MoX2NiZCkgCQkJX19mZWNfaW4xNigmKF9jYmQpLT5jYmRfc2MpCisjZGVmaW5lIENCRFJfREFUTEVOKF9jYmQpCQlfX2ZlY19pbjE2KCYoX2NiZCktPmNiZF9kYXRsZW4pCisjZGVmaW5lIENCRFJfQlVGQUREUihfY2JkKQkJX19mZWNfaW4zMigmKF9jYmQpLT5jYmRfYnVmYWRkcikKKworLyogc2V0IGJpdHMgKi8KKyNkZWZpbmUgQ0JEU19TQyhfY2JkLCBfc2MpIAkJQ0JEV19TQyhfY2JkLCBDQkRSX1NDKF9jYmQpIHwgKF9zYykpCisKKy8qIGNsZWFyIGJpdHMgKi8KKyNkZWZpbmUgQ0JEQ19TQyhfY2JkLCBfc2MpIAkJQ0JEV19TQyhfY2JkLCBDQkRSX1NDKF9jYmQpICYgfihfc2MpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZlY184eHgvZmVjX21haW4uYyBiL2RyaXZlcnMvbmV0L2ZlY184eHgvZmVjX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGYzYTlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZmVjXzh4eC9mZWNfbWFpbi5jCkBAIC0wLDAgKzEsMTI3NSBAQAorLyoKKyAqIEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAoRkVDKSBkcml2ZXIgZm9yIE1vdG9yb2xhIE1QQzh4eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgSW50cmFjb20gUy5BLiAKKyAqICBieSBQYW50ZWxpcyBBbnRvbmlvdSA8cGFudG9AaW50cmFjb20uZ3I+CisgKgorICogSGVhdmlseSBiYXNlZCBvbiBvcmlnaW5hbCBGRUMgZHJpdmVyIGJ5IERhbiBNYWxlayA8ZGFuQGVtYmVkZGVkZWRnZS5jb20+CisgKiBhbmQgbW9kaWZpY2F0aW9ucyBieSBKb2FraW0gVGplcm5sdW5kIDxqb2FraW0udGplcm5sdW5kQGx1bWVudGlzLnNlPgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vOHh4X2ltbWFwLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vbXBjOHh4Lmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2NvbW1wcm9jLmg+CisjaW5jbHVkZSA8YXNtL2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlICJmZWNfOHh4LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEZFQ19NQVhfTVVMVElDQVNUX0FERFJTCTY0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisgICAgRFJWX01PRFVMRV9OQU1FICIuYzp2IiBEUlZfTU9EVUxFX1ZFUlNJT04gIiAoIiBEUlZfTU9EVUxFX1JFTERBVEUgIikiICJcbiI7CisKK01PRFVMRV9BVVRIT1IoIlBhbnRlbGlzIEFudG9uaW91IDxwYW50b0BpbnRyYWNvbS5ncj4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTW90b3JvbGEgOHh4IEZFQyBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworTU9EVUxFX1BBUk0oZmVjXzh4eF9kZWJ1ZywgImkiKTsKK01PRFVMRV9QQVJNX0RFU0MoZmVjXzh4eF9kZWJ1ZywKKwkJICJGRUMgOHh4IGJpdG1hcHBlZCBkZWJ1Z2dpbmcgbWVzc2FnZSBlbmFibGUgdmFsdWUiKTsKKworaW50IGZlY184eHhfZGVidWcgPSAtMTsJCS8qIC0xID09IHVzZSBGRUNfOFhYX0RFRl9NU0dfRU5BQkxFIGFzIHZhbHVlICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRGVsYXkgdG8gd2FpdCBmb3IgRkVDIHJlc2V0IGNvbW1hbmQgdG8gY29tcGxldGUgKGluIHVzKSAKKyAqLworI2RlZmluZSBGRUNfUkVTRVRfREVMQVkJCTUwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgZmVjX3doYWNrX3Jlc2V0KGZlY190ICogZmVjcCkKK3sKKwlpbnQgaTsKKworCS8qCisJICogV2hhY2sgYSByZXNldC4gIFdlIHNob3VsZCB3YWl0IGZvciB0aGlzLiAgCisJICovCisJRlcoZmVjcCwgZWNudHJsLCBGRUNfRUNOVFJMX1BJTk1VWCB8IEZFQ19FQ05UUkxfUkVTRVQpOworCWZvciAoaSA9IDA7CisJICAgICAoRlIoZmVjcCwgZWNudHJsKSAmIEZFQ19FQ05UUkxfUkVTRVQpICE9IDAgJiYgaSA8IEZFQ19SRVNFVF9ERUxBWTsKKwkgICAgIGkrKykKKwkJdWRlbGF5KDEpOworCisJaWYgKGkgPT0gRkVDX1JFU0VUX0RFTEFZKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJGRUMgUmVzZXQgdGltZW91dCFcbiIpOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVHJhbnNtaXR0ZXIgdGltZW91dC4gIAorICovCisjZGVmaW5lIFRYX1RJTUVPVVQgKDIqSFopCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogUmV0dXJucyB0aGUgQ1JDIG5lZWRlZCB3aGVuIGZpbGxpbmcgaW4gdGhlIGhhc2ggdGFibGUgZm9yCisgKiBtdWx0aWNhc3QgZ3JvdXAgZmlsdGVyaW5nCisgKiBwQWRkciBtdXN0IHBvaW50IHRvIGEgTUFDIGFkZHJlc3MgKDYgYnl0ZXMpCisgKi8KK3N0YXRpYyBfX3UzMiBmZWNfbXVsaWNhc3RfY2FsY19jcmMoY2hhciAqcEFkZHIpCit7CisJdTggYnl0ZTsKKwlpbnQgYnl0ZV9jb3VudDsKKwlpbnQgYml0X2NvdW50OworCV9fdTMyIGNyYyA9IDB4ZmZmZmZmZmY7CisJdTggbXNiOworCisJZm9yIChieXRlX2NvdW50ID0gMDsgYnl0ZV9jb3VudCA8IDY7IGJ5dGVfY291bnQrKykgeworCQlieXRlID0gcEFkZHJbYnl0ZV9jb3VudF07CisJCWZvciAoYml0X2NvdW50ID0gMDsgYml0X2NvdW50IDwgODsgYml0X2NvdW50KyspIHsKKwkJCW1zYiA9IGNyYyA+PiAzMTsKKwkJCWNyYyA8PD0gMTsKKwkJCWlmIChtc2IgXiAoYnl0ZSAmIDB4MSkpIHsKKwkJCQljcmMgXj0gRkVDX0NSQ19QT0xZOworCQkJfQorCQkJYnl0ZSA+Pj0gMTsKKwkJfQorCX0KKwlyZXR1cm4gKGNyYyk7Cit9CisKKy8qCisgKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAqIFNrZWxldG9uIHRha2VuIGZyb20gc3VubGFuY2UgZHJpdmVyLgorICogVGhlIENQTSBFdGhlcm5ldCBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgTXVsdGljYXN0IGFzIHdlbGwgYXMgaW5kaXZpZHVhbAorICogTUFDIGFkZHJlc3MgZmlsdGVyaW5nLiAgU29tZSBvZiB0aGUgZHJpdmVycyBjaGVjayB0byBtYWtlIHN1cmUgaXQgaXMKKyAqIGEgZ3JvdXAgbXVsdGljYXN0IGFkZHJlc3MsIGFuZCBkaXNjYXJkIHRob3NlIHRoYXQgYXJlIG5vdC4gIEkgZ3Vlc3MgSQorICogd2lsbCBkbyB0aGUgc2FtZSBmb3Igbm93LCBidXQganVzdCByZW1vdmUgdGhlIHRlc3QgaWYgeW91IHdhbnQKKyAqIGluZGl2aWR1YWwgZmlsdGVyaW5nIGFzIHdlbGwgKGRvIHRoZSB1cHBlciBuZXQgbGF5ZXJzIHdhbnQgb3Igc3VwcG9ydAorICogdGhpcyBraW5kIG9mIGZlYXR1cmU/KS4KKyAqLworc3RhdGljIHZvaWQgZmVjX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWZlY190ICpmZWNwID0gZmVwLT5mZWNwOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqcG1jOworCV9fdTMyIGNyYzsKKwlpbnQgdGVtcDsKKwlfX3UzMiBjc3JWYWw7CisJaW50IGhhc2hfaW5kZXg7CisJX191MzIgaHRoaSwgaHRsbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisKKwlpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgIT0gMCkgeworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZmZXAtPmxvY2ssIGZsYWdzKTsKKwkJRlMoZmVjcCwgcl9jbnRybCwgRkVDX1JDTlRSTF9QUk9NKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmVwLT5sb2NrLCBmbGFncyk7CisKKwkJLyoKKwkJICogTG9nIGFueSBuZXQgdGFwcy4gCisJCSAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9NT0RVTEVfTkFNRQorCQkgICAgICAgIjogJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybjsKKworCX0KKworCWlmICgoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgIT0gMCB8fAorCSAgICBkZXYtPm1jX2NvdW50ID4gRkVDX01BWF9NVUxUSUNBU1RfQUREUlMpIHsKKwkJLyoKKwkJICogQ2F0Y2ggYWxsIG11bHRpY2FzdCBhZGRyZXNzZXMsIHNldCB0aGUgZmlsdGVyIHRvIGFsbCAxJ3MuCisJCSAqLworCQlodGhpID0gMHhmZmZmZmZmZlU7CisJCWh0bG8gPSAweGZmZmZmZmZmVTsKKwl9IGVsc2UgeworCQlodGhpID0gMDsKKwkJaHRsbyA9IDA7CisKKwkJLyoKKwkJICogTm93IHBvcHVsYXRlIHRoZSBoYXNoIHRhYmxlIAorCQkgKi8KKwkJZm9yIChwbWMgPSBkZXYtPm1jX2xpc3Q7IHBtYyAhPSBOVUxMOyBwbWMgPSBwbWMtPm5leHQpIHsKKwkJCWNyYyA9IGZlY19tdWxpY2FzdF9jYWxjX2NyYyhwbWMtPmRtaV9hZGRyKTsKKwkJCXRlbXAgPSAoY3JjICYgMHgzZikgPj4gMTsKKwkJCWhhc2hfaW5kZXggPSAoKHRlbXAgJiAweDAxKSA8PCA0KSB8CisJCQkJICAgICAoKHRlbXAgJiAweDAyKSA8PCAyKSB8CisJCQkJICAgICAoKHRlbXAgJiAweDA0KSkgfAorCQkJCSAgICAgKCh0ZW1wICYgMHgwOCkgPj4gMikgfAorCQkJCSAgICAgKCh0ZW1wICYgMHgxMCkgPj4gNCk7CisJCQljc3JWYWwgPSAoMSA8PCBoYXNoX2luZGV4KTsKKwkJCWlmIChjcmMgJiAxKQorCQkJCWh0aGkgfD0gY3NyVmFsOworCQkJZWxzZQorCQkJCWh0bG8gfD0gY3NyVmFsOworCQl9CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZlcC0+bG9jaywgZmxhZ3MpOworCUZDKGZlY3AsIHJfY250cmwsIEZFQ19SQ05UUkxfUFJPTSk7CisJRlcoZmVjcCwgaGFzaF90YWJsZV9oaWdoLCBodGhpKTsKKwlGVyhmZWNwLCBoYXNoX3RhYmxlX2xvdywgaHRsbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmVwLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgZmVjX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBzb2NrYWRkciAqbWFjID0gYWRkcjsKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZmVjICpmZWNwID0gZmVwLT5mZWNwOworCWludCBpOworCV9fdTMyIGFkZHJoaSwgYWRkcmxvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBHZXQgcG9pbnRlciB0byBTQ0MgYXJlYSBpbiBwYXJhbWV0ZXIgUkFNLiAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSBtYWMtPnNhX2RhdGFbaV07CisKKwkvKgorCSAqIFNldCBzdGF0aW9uIGFkZHJlc3MuIAorCSAqLworCWFkZHJoaSA9ICgoX191MzIpIGRldi0+ZGV2X2FkZHJbMF0gPDwgMjQpIHwKKwkJICgoX191MzIpIGRldi0+ZGV2X2FkZHJbMV0gPDwgMTYpIHwKKwkgICAJICgoX191MzIpIGRldi0+ZGV2X2FkZHJbMl0gPDwgIDgpIHwKKwkgICAgCSAgKF9fdTMyKSBkZXYtPmRldl9hZGRyWzNdOworCWFkZHJsbyA9ICgoX191MzIpIGRldi0+ZGV2X2FkZHJbNF0gPDwgMjQpIHwKKwkgICAgCSAoKF9fdTMyKSBkZXYtPmRldl9hZGRyWzVdIDw8IDE2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmZXAtPmxvY2ssIGZsYWdzKTsKKwlGVyhmZWNwLCBhZGRyX2xvdywgYWRkcmhpKTsKKwlGVyhmZWNwLCBhZGRyX2hpZ2gsIGFkZHJsbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmVwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHN0YXJ0IG9yIHJlc3RhcnQgdGhlIEZFQyBkdXJpbmcgYSBsaW5rCisgKiBjaGFuZ2UuICBUaGlzIG9ubHkgaGFwcGVucyB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIGhhbGYgYW5kIGZ1bGwKKyAqIGR1cGxleC4KKyAqLwordm9pZCBmZWNfcmVzdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZHVwbGV4LCBpbnQgc3BlZWQpCit7CisjaWZkZWYgQ09ORklHX0RVRVQKKwlpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIElNQVBfQUREUjsKKwlfX3UzMiBjcHRyOworI2VuZGlmCisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGZlYyAqZmVjcCA9IGZlcC0+ZmVjcDsKKwljb25zdCBzdHJ1Y3QgZmVjX3BsYXRmb3JtX2luZm8gKmZwaSA9IGZlcC0+ZnBpOworCWNiZF90ICpiZHA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgaTsKKwlfX3UzMiBhZGRyaGksIGFkZHJsbzsKKworCWZlY193aGFja19yZXNldChmZXAtPmZlY3ApOworCisJLyoKKwkgKiBTZXQgc3RhdGlvbiBhZGRyZXNzLiAKKwkgKi8KKwlhZGRyaGkgPSAoKF9fdTMyKSBkZXYtPmRldl9hZGRyWzBdIDw8IDI0KSB8CisJCSAoKF9fdTMyKSBkZXYtPmRldl9hZGRyWzFdIDw8IDE2KSB8CisJCSAoKF9fdTMyKSBkZXYtPmRldl9hZGRyWzJdIDw8ICA4KSB8CisJCSAoX191MzIpIGRldi0+ZGV2X2FkZHJbM107CisJYWRkcmxvID0gKChfX3UzMikgZGV2LT5kZXZfYWRkcls0XSA8PCAyNCkgfAorCQkgKChfX3UzMikgZGV2LT5kZXZfYWRkcls1XSA8PCAxNik7CisJRlcoZmVjcCwgYWRkcl9sb3csIGFkZHJoaSk7CisJRlcoZmVjcCwgYWRkcl9oaWdoLCBhZGRybG8pOworCisJLyoKKwkgKiBSZXNldCBhbGwgbXVsdGljYXN0LiAKKwkgKi8KKwlGVyhmZWNwLCBoYXNoX3RhYmxlX2hpZ2gsIDApOworCUZXKGZlY3AsIGhhc2hfdGFibGVfbG93LCAwKTsKKworCS8qCisJICogU2V0IG1heGltdW0gcmVjZWl2ZSBidWZmZXIgc2l6ZS4gCisJICovCisJRlcoZmVjcCwgcl9idWZmX3NpemUsIFBLVF9NQVhCTFJfU0laRSk7CisJRlcoZmVjcCwgcl9oYXNoLCBQS1RfTUFYQlVGX1NJWkUpOworCisJLyoKKwkgKiBTZXQgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgZGVzY3JpcHRvciBiYXNlLiAKKwkgKi8KKwlGVyhmZWNwLCByX2Rlc19zdGFydCwgaW9wYSgoX191MzIpIChmZXAtPnJ4X2JkX2Jhc2UpKSk7CisJRlcoZmVjcCwgeF9kZXNfc3RhcnQsIGlvcGEoKF9fdTMyKSAoZmVwLT50eF9iZF9iYXNlKSkpOworCisJZmVwLT5kaXJ0eV90eCA9IGZlcC0+Y3VyX3R4ID0gZmVwLT50eF9iZF9iYXNlOworCWZlcC0+dHhfZnJlZSA9IGZlcC0+dHhfcmluZzsKKwlmZXAtPmN1cl9yeCA9IGZlcC0+cnhfYmRfYmFzZTsKKworCS8qCisJICogUmVzZXQgU0tCIHJlY2VpdmUgYnVmZmVycyAKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZmVwLT5yeF9yaW5nOyBpKyspIHsKKwkJaWYgKChza2IgPSBmZXAtPnJ4X3NrYnVmZltpXSkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlmZXAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIHJlY2VpdmUgYnVmZmVyIGRlc2NyaXB0b3JzLiAKKwkgKi8KKwlmb3IgKGkgPSAwLCBiZHAgPSBmZXAtPnJ4X2JkX2Jhc2U7IGkgPCBmZXAtPnJ4X3Jpbmc7IGkrKywgYmRwKyspIHsKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihFTkVUX1JYX0ZSU0laRSk7CisJCWlmIChza2IgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTU9EVUxFX05BTUUKKwkJCSAgICAgICAiOiAlcyBNZW1vcnkgc3F1ZWV6ZSwgdW5hYmxlIHRvIGFsbG9jYXRlIHNrYlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJZmVwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQlicmVhazsKKwkJfQorCQlmZXAtPnJ4X3NrYnVmZltpXSA9IHNrYjsKKwkJc2tiLT5kZXYgPSBkZXY7CisJCUNCRFdfQlVGQUREUihiZHAsIGRtYV9tYXBfc2luZ2xlKE5VTEwsIHNrYi0+ZGF0YSwKKwkJCQkJIEwxX0NBQ0hFX0FMSUdOKFBLVF9NQVhCVUZfU0laRSksCisJCQkJCSBETUFfRlJPTV9ERVZJQ0UpKTsKKwkJQ0JEV19EQVRMRU4oYmRwLCAwKTsJLyogemVybyAqLworCQlDQkRXX1NDKGJkcCwgQkRfRU5FVF9SWF9FTVBUWSB8CisJCQkoKGkgPCBmZXAtPnJ4X3JpbmcgLSAxKSA/IDAgOiBCRF9TQ19XUkFQKSk7CisJfQorCS8qCisJICogaWYgd2UgZmFpbGVkLCBmaWxsdXAgcmVtYWluZGVyIAorCSAqLworCWZvciAoOyBpIDwgZmVwLT5yeF9yaW5nOyBpKyssIGJkcCsrKSB7CisJCWZlcC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwkJQ0JEV19TQyhiZHAsIChpIDwgZmVwLT5yeF9yaW5nIC0gMSkgPyAwIDogQkRfU0NfV1JBUCk7CisJfQorCisJLyoKKwkgKiBSZXNldCBTS0IgdHJhbnNtaXQgYnVmZmVycy4gIAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBmZXAtPnR4X3Jpbmc7IGkrKykgeworCQlpZiAoKHNrYiA9IGZlcC0+dHhfc2tidWZmW2ldKSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWZlcC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0KKworCS8qCisJICogLi4uYW5kIHRoZSBzYW1lIGZvciB0cmFuc21pdC4gIAorCSAqLworCWZvciAoaSA9IDAsIGJkcCA9IGZlcC0+dHhfYmRfYmFzZTsgaSA8IGZlcC0+dHhfcmluZzsgaSsrLCBiZHArKykgeworCQlmZXAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCUNCRFdfQlVGQUREUihiZHAsIHZpcnRfdG9fYnVzKE5VTEwpKTsKKwkJQ0JEV19EQVRMRU4oYmRwLCAwKTsKKwkJQ0JEV19TQyhiZHAsIChpIDwgZmVwLT50eF9yaW5nIC0gMSkgPyAwIDogQkRfU0NfV1JBUCk7CisJfQorCisJLyoKKwkgKiBFbmFibGUgYmlnIGVuZGlhbiBhbmQgZG9uJ3QgY2FyZSBhYm91dCBTRE1BIEZDLiAKKwkgKi8KKwlGVyhmZWNwLCBmdW5fY29kZSwgMHg3ODAwMDAwMCk7CisKKwkvKgorCSAqIFNldCBNSUkgc3BlZWQuIAorCSAqLworCUZXKGZlY3AsIG1paV9zcGVlZCwgZmVwLT5mZWNfcGh5X3NwZWVkKTsKKworCS8qCisJICogQ2xlYXIgYW55IG91dHN0YW5kaW5nIGludGVycnVwdC4gCisJICovCisJRlcoZmVjcCwgaWV2ZW50LCAweGZmYzApOworCUZXKGZlY3AsIGl2ZWMsIChmcGktPmZlY19pcnEgLyAyKSA8PCAyOSk7CisKKwkvKgorCSAqIGFkanVzdCB0byBzcGVlZCAob25seSBmb3IgRFVFVCAmIFJNSUkpIAorCSAqLworI2lmZGVmIENPTkZJR19EVUVUCisJY3B0ciA9IGluX2JlMzIoJmltbWFwLT5pbV9jcG0uY3BfY3B0cik7CisJc3dpdGNoIChmcGktPmZlY19ubykgeworCWNhc2UgMDoKKwkJLyoKKwkJICogY2hlY2sgaWYgaW4gUk1JSSBtb2RlIAorCQkgKi8KKwkJaWYgKChjcHRyICYgMHgxMDApID09IDApCisJCQlicmVhazsKKworCQlpZiAoc3BlZWQgPT0gMTApCisJCQljcHRyIHw9IDB4MDAwMDAxMDsKKwkJZWxzZSBpZiAoc3BlZWQgPT0gMTAwKQorCQkJY3B0ciAmPSB+MHgwMDAwMDEwOworCQlicmVhazsKKwljYXNlIDE6CisJCS8qCisJCSAqIGNoZWNrIGlmIGluIFJNSUkgbW9kZSAKKwkJICovCisJCWlmICgoY3B0ciAmIDB4ODApID09IDApCisJCQlicmVhazsKKworCQlpZiAoc3BlZWQgPT0gMTApCisJCQljcHRyIHw9IDB4MDAwMDAwODsKKwkJZWxzZSBpZiAoc3BlZWQgPT0gMTAwKQorCQkJY3B0ciAmPSB+MHgwMDAwMDA4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJb3V0X2JlMzIoJmltbWFwLT5pbV9jcG0uY3BfY3B0ciwgY3B0cik7CisjZW5kaWYKKworCUZXKGZlY3AsIHJfY250cmwsIEZFQ19SQ05UUkxfTUlJX01PREUpOwkvKiBNSUkgZW5hYmxlICovCisJLyoKKwkgKiBhZGp1c3QgdG8gZHVwbGV4IG1vZGUgCisJICovCisJaWYgKGR1cGxleCkgeworCQlGQyhmZWNwLCByX2NudHJsLCBGRUNfUkNOVFJMX0RSVCk7CisJCUZTKGZlY3AsIHhfY250cmwsIEZFQ19UQ05UUkxfRkRFTik7CS8qIEZEIGVuYWJsZSAqLworCX0gZWxzZSB7CisJCUZTKGZlY3AsIHJfY250cmwsIEZFQ19SQ05UUkxfRFJUKTsKKwkJRkMoZmVjcCwgeF9jbnRybCwgRkVDX1RDTlRSTF9GREVOKTsJLyogRkQgZGlzYWJsZSAqLworCX0KKworCS8qCisJICogRW5hYmxlIGludGVycnVwdHMgd2Ugd2lzaCB0byBzZXJ2aWNlLiAKKwkgKi8KKwlGVyhmZWNwLCBpbWFzaywgRkVDX0VORVRfVFhGIHwgRkVDX0VORVRfVFhCIHwKKwkgICBGRUNfRU5FVF9SWEYgfCBGRUNfRU5FVF9SWEIpOworCisJLyoKKwkgKiBBbmQgbGFzdCwgZW5hYmxlIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBwcm9jZXNzaW5nLiAKKwkgKi8KKwlGVyhmZWNwLCBlY250cmwsIEZFQ19FQ05UUkxfUElOTVVYIHwgRkVDX0VDTlRSTF9FVEhFUl9FTik7CisJRlcoZmVjcCwgcl9kZXNfYWN0aXZlLCAweDAxMDAwMDAwKTsKK30KKwordm9pZCBmZWNfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWZlY190ICpmZWNwID0gZmVwLT5mZWNwOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGk7CisKKwlpZiAoKEZSKGZlY3AsIGVjbnRybCkgJiBGRUNfRUNOVFJMX0VUSEVSX0VOKSA9PSAwKQorCQlyZXR1cm47CQkvKiBhbHJlYWR5IGRvd24gKi8KKworCUZXKGZlY3AsIHhfY250cmwsIDB4MDEpOwkvKiBHcmFjZWZ1bCB0cmFuc21pdCBzdG9wICovCisJZm9yIChpID0gMDsgKChGUihmZWNwLCBpZXZlbnQpICYgMHgxMDAwMDAwMCkgPT0gMCkgJiYKKwkgICAgIGkgPCBGRUNfUkVTRVRfREVMQVk7IGkrKykKKwkJdWRlbGF5KDEpOworCisJaWYgKGkgPT0gRkVDX1JFU0VUX0RFTEFZKQorCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9NT0RVTEVfTkFNRQorCQkgICAgICAgIjogJXMgRkVDIHRpbWVvdXQgb24gZ3JhY2VmdWwgdHJhbnNtaXQgc3RvcFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJLyoKKwkgKiBEaXNhYmxlIEZFQy4gTGV0IG9ubHkgTUlJIGludGVycnVwdHMuIAorCSAqLworCUZXKGZlY3AsIGltYXNrLCAwKTsKKwlGVyhmZWNwLCBlY250cmwsIH5GRUNfRUNOVFJMX0VUSEVSX0VOKTsKKworCS8qCisJICogUmVzZXQgU0tCIHRyYW5zbWl0IGJ1ZmZlcnMuICAKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZmVwLT50eF9yaW5nOyBpKyspIHsKKwkJaWYgKChza2IgPSBmZXAtPnR4X3NrYnVmZltpXSkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlmZXAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9CisKKwkvKgorCSAqIFJlc2V0IFNLQiByZWNlaXZlIGJ1ZmZlcnMgCisJICovCisJZm9yIChpID0gMDsgaSA8IGZlcC0+cnhfcmluZzsgaSsrKSB7CisJCWlmICgoc2tiID0gZmVwLT5yeF9za2J1ZmZbaV0pID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJZmVwLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfQorfQorCisvKiBjb21tb24gcmVjZWl2ZSBmdW5jdGlvbiAqLworc3RhdGljIGludCBmZWNfZW5ldF9yeF9jb21tb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJZmVjX3QgKmZlY3AgPSBmZXAtPmZlY3A7CisJY29uc3Qgc3RydWN0IGZlY19wbGF0Zm9ybV9pbmZvICpmcGkgPSBmZXAtPmZwaTsKKwljYmRfdCAqYmRwOworCXN0cnVjdCBza19idWZmICpza2IsICpza2JuLCAqc2tidDsKKwlpbnQgcmVjZWl2ZWQgPSAwOworCV9fdTE2IHBrdF9sZW4sIHNjOworCWludCBjdXJpZHg7CisJaW50IHJ4X3dvcmtfbGltaXQ7CisKKwlpZiAoZnBpLT51c2VfbmFwaSkgeworCQlyeF93b3JrX2xpbWl0ID0gbWluKGRldi0+cXVvdGEsICpidWRnZXQpOworCisJCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBGaXJzdCwgZ3JhYiBhbGwgb2YgdGhlIHN0YXRzIGZvciB0aGUgaW5jb21pbmcgcGFja2V0LgorCSAqIFRoZXNlIGdldCBtZXNzZWQgdXAgaWYgd2UgZ2V0IGNhbGxlZCBkdWUgdG8gYSBidXN5IGNvbmRpdGlvbi4KKwkgKi8KKwliZHAgPSBmZXAtPmN1cl9yeDsKKworCS8qIGNsZWFyIFJYIHN0YXR1cyBiaXRzIGZvciBuYXBpKi8KKwlpZiAoZnBpLT51c2VfbmFwaSkKKwkJRlcoZmVjcCwgaWV2ZW50LCBGRUNfRU5FVF9SWEYgfCBGRUNfRU5FVF9SWEIpOworCisJd2hpbGUgKCgoc2MgPSBDQkRSX1NDKGJkcCkpICYgQkRfRU5FVF9SWF9FTVBUWSkgPT0gMCkgeworCisJCWN1cmlkeCA9IGJkcCAtIGZlcC0+cnhfYmRfYmFzZTsKKworCQkvKgorCQkgKiBTaW5jZSB3ZSBoYXZlIGFsbG9jYXRlZCBzcGFjZSB0byBob2xkIGEgY29tcGxldGUgZnJhbWUsCisJCSAqIHRoZSBsYXN0IGluZGljYXRvciBzaG91bGQgYmUgc2V0LgorCQkgKi8KKwkJaWYgKChzYyAmIEJEX0VORVRfUlhfTEFTVCkgPT0gMCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX01PRFVMRV9OQU1FCisJCQkgICAgICAgIjogJXMgcmN2IGlzIG5vdCArbGFzdFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCisJCS8qCisJCSAqIENoZWNrIGZvciBlcnJvcnMuIAorCQkgKi8KKwkJaWYgKHNjICYgKEJEX0VORVRfUlhfTEcgfCBCRF9FTkVUX1JYX1NIIHwgQkRfRU5FVF9SWF9DTCB8CisJCQkgIEJEX0VORVRfUlhfTk8gfCBCRF9FTkVUX1JYX0NSIHwgQkRfRU5FVF9SWF9PVikpIHsKKwkJCWZlcC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkvKiBGcmFtZSB0b28gbG9uZyBvciB0b28gc2hvcnQuICovCisJCQlpZiAoc2MgJiAoQkRfRU5FVF9SWF9MRyB8IEJEX0VORVRfUlhfU0gpKQorCQkJCWZlcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJLyogRnJhbWUgYWxpZ25tZW50ICovCisJCQlpZiAoc2MgJiAoQkRfRU5FVF9SWF9OTyB8IEJEX0VORVRfUlhfQ0wpKQorCQkJCWZlcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkvKiBDUkMgRXJyb3IgKi8KKwkJCWlmIChzYyAmIEJEX0VORVRfUlhfQ1IpCisJCQkJZmVwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkvKiBGSUZPIG92ZXJydW4gKi8KKwkJCWlmIChzYyAmIEJEX0VORVRfUlhfT1YpCisJCQkJZmVwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisKKwkJCXNrYm4gPSBmZXAtPnJ4X3NrYnVmZltjdXJpZHhdOworCQkJQlVHX09OKHNrYm4gPT0gTlVMTCk7CisKKwkJfSBlbHNlIHsKKworCQkJLyogbmFwaSwgZ290IHBhY2tldCBidXQgbm8gcXVvdGEgKi8KKwkJCWlmIChmcGktPnVzZV9uYXBpICYmIC0tcnhfd29ya19saW1pdCA8IDApCisJCQkJYnJlYWs7CisKKwkJCXNrYiA9IGZlcC0+cnhfc2tidWZmW2N1cmlkeF07CisJCQlCVUdfT04oc2tiID09IE5VTEwpOworCisJCQkvKgorCQkJICogUHJvY2VzcyB0aGUgaW5jb21pbmcgZnJhbWUuCisJCQkgKi8KKwkJCWZlcC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJcGt0X2xlbiA9IENCRFJfREFUTEVOKGJkcCkgLSA0OwkvKiByZW1vdmUgQ1JDICovCisJCQlmZXAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW4gKyA0OworCisJCQlpZiAocGt0X2xlbiA8PSBmcGktPnJ4X2NvcHlicmVhaykgeworCQkJCS8qICsyIHRvIG1ha2UgSVAgaGVhZGVyIEwxIGNhY2hlIGFsaWduZWQgKi8KKwkJCQlza2JuID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMik7CisJCQkJaWYgKHNrYm4gIT0gTlVMTCkgeworCQkJCQlza2JfcmVzZXJ2ZShza2JuLCAyKTsJLyogYWxpZ24gSVAgaGVhZGVyICovCisJCQkJCW1lbWNweShza2JuLT5kYXRhLCBza2ItPmRhdGEsIHBrdF9sZW4pOworCQkJCQkvKiBzd2FwICovCisJCQkJCXNrYnQgPSBza2I7CisJCQkJCXNrYiA9IHNrYm47CisJCQkJCXNrYm4gPSBza2J0OworCQkJCX0KKwkJCX0gZWxzZQorCQkJCXNrYm4gPSBkZXZfYWxsb2Nfc2tiKEVORVRfUlhfRlJTSVpFKTsKKworCQkJaWYgKHNrYm4gIT0gTlVMTCkgeworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsJLyogTWFrZSByb29tICovCisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCQlyZWNlaXZlZCsrOworCQkJCWlmICghZnBpLT51c2VfbmFwaSkKKwkJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQllbHNlCisJCQkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX01PRFVMRV9OQU1FCisJCQkJICAgICAgICI6ICVzIE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJCWZlcC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCXNrYm4gPSBza2I7CisJCQl9CisJCX0KKworCQlmZXAtPnJ4X3NrYnVmZltjdXJpZHhdID0gc2tibjsKKwkJQ0JEV19CVUZBRERSKGJkcCwgZG1hX21hcF9zaW5nbGUoTlVMTCwgc2tibi0+ZGF0YSwKKwkJCQkJCSBMMV9DQUNIRV9BTElHTihQS1RfTUFYQlVGX1NJWkUpLAorCQkJCQkJIERNQV9GUk9NX0RFVklDRSkpOworCQlDQkRXX0RBVExFTihiZHAsIDApOworCQlDQkRXX1NDKGJkcCwgKHNjICYgfkJEX0VORVRfUlhfU1RBVFMpIHwgQkRfRU5FVF9SWF9FTVBUWSk7CisKKwkJLyoKKwkJICogVXBkYXRlIEJEIHBvaW50ZXIgdG8gbmV4dCBlbnRyeS4gCisJCSAqLworCQlpZiAoKHNjICYgQkRfRU5FVF9SWF9XUkFQKSA9PSAwKQorCQkJYmRwKys7CisJCWVsc2UKKwkJCWJkcCA9IGZlcC0+cnhfYmRfYmFzZTsKKworCQkvKgorCQkgKiBEb2luZyB0aGlzIGhlcmUgd2lsbCBrZWVwIHRoZSBGRUMgcnVubmluZyB3aGlsZSB3ZSBwcm9jZXNzCisJCSAqIGluY29taW5nIGZyYW1lcy4gIE9uIGEgaGVhdmlseSBsb2FkZWQgbmV0d29yaywgd2Ugc2hvdWxkIGJlCisJCSAqIGFibGUgdG8ga2VlcCB1cCBhdCB0aGUgZXhwZW5zZSBvZiBzeXN0ZW0gcmVzb3VyY2VzLgorCQkgKi8KKwkJRlcoZmVjcCwgcl9kZXNfYWN0aXZlLCAweDAxMDAwMDAwKTsKKwl9CisKKwlmZXAtPmN1cl9yeCA9IGJkcDsKKworCWlmIChmcGktPnVzZV9uYXBpKSB7CisJCWRldi0+cXVvdGEgLT0gcmVjZWl2ZWQ7CisJCSpidWRnZXQgLT0gcmVjZWl2ZWQ7CisKKwkJaWYgKHJ4X3dvcmtfbGltaXQgPCAwKQorCQkJcmV0dXJuIDE7CS8qIG5vdCBkb25lICovCisKKwkJLyogZG9uZSAqLworCQluZXRpZl9yeF9jb21wbGV0ZShkZXYpOworCisJCS8qIGVuYWJsZSBSWCBpbnRlcnJ1cHQgYml0cyAqLworCQlGUyhmZWNwLCBpbWFzaywgRkVDX0VORVRfUlhGIHwgRkVDX0VORVRfUlhCKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZmVjX2VuZXRfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljYmRfdCAqYmRwOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGRpcnR5aWR4LCBkb193YWtlOworCV9fdTE2IHNjOworCisJc3Bpbl9sb2NrKCZmZXAtPmxvY2spOworCWJkcCA9IGZlcC0+ZGlydHlfdHg7CisKKwlkb193YWtlID0gMDsKKwl3aGlsZSAoKChzYyA9IENCRFJfU0MoYmRwKSkgJiBCRF9FTkVUX1RYX1JFQURZKSA9PSAwKSB7CisKKwkJZGlydHlpZHggPSBiZHAgLSBmZXAtPnR4X2JkX2Jhc2U7CisKKwkJaWYgKGZlcC0+dHhfZnJlZSA9PSBmZXAtPnR4X3JpbmcpCisJCQlicmVhazsKKworCQlza2IgPSBmZXAtPnR4X3NrYnVmZltkaXJ0eWlkeF07CisKKwkJLyoKKwkJICogQ2hlY2sgZm9yIGVycm9ycy4gCisJCSAqLworCQlpZiAoc2MgJiAoQkRfRU5FVF9UWF9IQiB8IEJEX0VORVRfVFhfTEMgfAorCQkJICBCRF9FTkVUX1RYX1JMIHwgQkRfRU5FVF9UWF9VTiB8IEJEX0VORVRfVFhfQ1NMKSkgeworCQkJZmVwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmIChzYyAmIEJEX0VORVRfVFhfSEIpCS8qIE5vIGhlYXJ0YmVhdCAqLworCQkJCWZlcC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycysrOworCQkJaWYgKHNjICYgQkRfRU5FVF9UWF9MQykJLyogTGF0ZSBjb2xsaXNpb24gKi8KKwkJCQlmZXAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJCWlmIChzYyAmIEJEX0VORVRfVFhfUkwpCS8qIFJldHJhbnMgbGltaXQgKi8KKwkJCQlmZXAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQlpZiAoc2MgJiBCRF9FTkVUX1RYX1VOKQkvKiBVbmRlcnJ1biAqLworCQkJCWZlcC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCWlmIChzYyAmIEJEX0VORVRfVFhfQ1NMKQkvKiBDYXJyaWVyIGxvc3QgKi8KKwkJCQlmZXAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCX0gZWxzZQorCQkJZmVwLT5zdGF0cy50eF9wYWNrZXRzKys7CisKKwkJaWYgKHNjICYgQkRfRU5FVF9UWF9SRUFEWSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX01PRFVMRV9OQU1FCisJCQkgICAgICAgIjogJXMgSEVZISBFbmV0IHhtaXQgaW50ZXJydXB0IGFuZCBUWF9SRUFEWS5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKworCQkvKgorCQkgKiBEZWZlcnJlZCBtZWFucyBzb21lIGNvbGxpc2lvbnMgb2NjdXJyZWQgZHVyaW5nIHRyYW5zbWl0LAorCQkgKiBidXQgd2UgZXZlbnR1YWxseSBzZW50IHRoZSBwYWNrZXQgT0suCisJCSAqLworCQlpZiAoc2MgJiBCRF9FTkVUX1RYX0RFRikKKwkJCWZlcC0+c3RhdHMuY29sbGlzaW9ucysrOworCisJCS8qCisJCSAqIEZyZWUgdGhlIHNrIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYXN0IHRyYW5zbWl0LiAKKwkJICovCisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCWZlcC0+dHhfc2tidWZmW2RpcnR5aWR4XSA9IE5VTEw7CisKKwkJLyoKKwkJICogVXBkYXRlIHBvaW50ZXIgdG8gbmV4dCBidWZmZXIgZGVzY3JpcHRvciB0byBiZSB0cmFuc21pdHRlZC4gCisJCSAqLworCQlpZiAoKHNjICYgQkRfRU5FVF9UWF9XUkFQKSA9PSAwKQorCQkJYmRwKys7CisJCWVsc2UKKwkJCWJkcCA9IGZlcC0+dHhfYmRfYmFzZTsKKworCQkvKgorCQkgKiBTaW5jZSB3ZSBoYXZlIGZyZWVkIHVwIGEgYnVmZmVyLCB0aGUgcmluZyBpcyBubyBsb25nZXIKKwkJICogZnVsbC4KKwkJICovCisJCWlmICghZmVwLT50eF9mcmVlKyspCisJCQlkb193YWtlID0gMTsKKwl9CisKKwlmZXAtPmRpcnR5X3R4ID0gYmRwOworCisJc3Bpbl91bmxvY2soJmZlcC0+bG9jayk7CisKKwlpZiAoZG9fd2FrZSAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyoKKyAqIFRoZSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqIFRoaXMgaXMgY2FsbGVkIGZyb20gdGhlIE1QQyBjb3JlIGludGVycnVwdC4KKyAqLworc3RhdGljIGlycXJldHVybl90CitmZWNfZW5ldF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXA7CisJY29uc3Qgc3RydWN0IGZlY19wbGF0Zm9ybV9pbmZvICpmcGk7CisJZmVjX3QgKmZlY3A7CisJX191MzIgaW50X2V2ZW50czsKKwlfX3UzMiBpbnRfZXZlbnRzX25hcGk7CisKKwlpZiAodW5saWtlbHkoZGV2ID09IE5VTEwpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWZlY3AgPSBmZXAtPmZlY3A7CisJZnBpID0gZmVwLT5mcGk7CisKKwkvKgorCSAqIEdldCB0aGUgaW50ZXJydXB0IGV2ZW50cyB0aGF0IGNhdXNlZCB1cyB0byBiZSBoZXJlLgorCSAqLworCXdoaWxlICgoaW50X2V2ZW50cyA9IEZSKGZlY3AsIGlldmVudCkgJiBGUihmZWNwLCBpbWFzaykpICE9IDApIHsKKworCQlpZiAoIWZwaS0+dXNlX25hcGkpCisJCQlGVyhmZWNwLCBpZXZlbnQsIGludF9ldmVudHMpOworCQllbHNlIHsKKwkJCWludF9ldmVudHNfbmFwaSA9IGludF9ldmVudHMgJiB+KEZFQ19FTkVUX1JYRiB8IEZFQ19FTkVUX1JYQik7CisJCQlGVyhmZWNwLCBpZXZlbnQsIGludF9ldmVudHNfbmFwaSk7CisJCX0KKworCQlpZiAoKGludF9ldmVudHMgJiAoRkVDX0VORVRfSEJFUlIgfCBGRUNfRU5FVF9CQUJSIHwKKwkJCQkgICBGRUNfRU5FVF9CQUJUIHwgRkVDX0VORVRfRUJFUlIpKSAhPSAwKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTU9EVUxFX05BTUUKKwkJCSAgICAgICAiOiAlcyBGRUMgRVJST1IocykgMHgleFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGludF9ldmVudHMpOworCisJCWlmICgoaW50X2V2ZW50cyAmIEZFQ19FTkVUX1JYRikgIT0gMCkgeworCQkJaWYgKCFmcGktPnVzZV9uYXBpKQorCQkJCWZlY19lbmV0X3J4X2NvbW1vbihkZXYsIE5VTEwpOworCQkJZWxzZSB7CisJCQkJaWYgKG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAoZGV2KSkgeworCQkJCQkvKiBkaXNhYmxlIHJ4IGludGVycnVwdHMgKi8KKwkJCQkJRkMoZmVjcCwgaW1hc2ssIEZFQ19FTkVUX1JYRiB8IEZFQ19FTkVUX1JYQik7CisJCQkJCV9fbmV0aWZfcnhfc2NoZWR1bGUoZGV2KTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGsoS0VSTl9FUlIgRFJWX01PRFVMRV9OQU1FCisJCQkJCSAgICAgICAiOiAlcyBkcml2ZXIgYnVnISBpbnRlcnJ1cHQgd2hpbGUgaW4gcG9sbCFcbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJCQlGQyhmZWNwLCBpbWFzaywgRkVDX0VORVRfUlhGIHwgRkVDX0VORVRfUlhCKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoKGludF9ldmVudHMgJiBGRUNfRU5FVF9UWEYpICE9IDApCisJCQlmZWNfZW5ldF90eChkZXYpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogVGhpcyBpbnRlcnJ1cHQgb2NjdXJzIHdoZW4gdGhlIFBIWSBkZXRlY3RzIGEgbGluayBjaGFuZ2UuICovCitzdGF0aWMgaXJxcmV0dXJuX3QKK2ZlY19taWlfbGlua19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXA7CisJY29uc3Qgc3RydWN0IGZlY19wbGF0Zm9ybV9pbmZvICpmcGk7CisKKwlpZiAodW5saWtlbHkoZGV2ID09IE5VTEwpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWZwaSA9IGZlcC0+ZnBpOworCisJaWYgKCFmcGktPnVzZV9tZGlvKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkvKgorCSAqIEFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHQgaWYgcG9zc2libGUuIElmIHdlIGhhdmUgbm90CisJICogZm91bmQgdGhlIFBIWSB5ZXQgd2UgY2FuJ3QgcHJvY2VzcyBvciBhY2tub3dsZWRnZSB0aGUKKwkgKiBpbnRlcnJ1cHQgbm93LiBJbnN0ZWFkIHdlIGlnbm9yZSB0aGlzIGludGVycnVwdCBmb3Igbm93LAorCSAqIHdoaWNoIHdlIGNhbiBkbyBzaW5jZSBpdCBpcyBlZGdlIHRyaWdnZXJlZC4gSXQgd2lsbCBiZQorCSAqIGFja25vd2xlZGdlZCBsYXRlciBieSBmZWNfZW5ldF9vcGVuKCkuCisJICovCisJaWYgKCFmZXAtPnBoeSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJZmVjX21paV9hY2tfaW50KGRldik7CisJZmVjX21paV9saW5rX3N0YXR1c19jaGFuZ2VfY2hlY2soZGV2LCAwKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBmZWNfZW5ldF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJZmVjX3QgKmZlY3AgPSBmZXAtPmZlY3A7CisJY2JkX3QgKmJkcDsKKwlpbnQgY3VyaWR4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmVwLT50eF9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIEZpbGwgaW4gYSBUeCByaW5nIGVudHJ5IAorCSAqLworCWJkcCA9IGZlcC0+Y3VyX3R4OworCisJaWYgKCFmZXAtPnR4X2ZyZWUgfHwgKENCRFJfU0MoYmRwKSAmIEJEX0VORVRfVFhfUkVBRFkpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmVwLT50eF9sb2NrLCBmbGFncyk7CisKKwkJLyoKKwkJICogT29vcHMuICBBbGwgdHJhbnNtaXQgYnVmZmVycyBhcmUgZnVsbC4gIEJhaWwgb3V0LgorCQkgKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCBzaW5jZSB0aGUgdHggcXVldWUgc2hvdWxkIGJlIHN0b3BwZWQuCisJCSAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9NT0RVTEVfTkFNRQorCQkgICAgICAgIjogJXMgdHggcXVldWUgZnVsbCEuXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwljdXJpZHggPSBiZHAgLSBmZXAtPnR4X2JkX2Jhc2U7CisJLyoKKwkgKiBDbGVhciBhbGwgb2YgdGhlIHN0YXR1cyBmbGFncy4gCisJICovCisJQ0JEQ19TQyhiZHAsIEJEX0VORVRfVFhfU1RBVFMpOworCisJLyoKKwkgKiBTYXZlIHNrYiBwb2ludGVyLiAKKwkgKi8KKwlmZXAtPnR4X3NrYnVmZltjdXJpZHhdID0gc2tiOworCisJZmVwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCS8qCisJICogUHVzaCB0aGUgZGF0YSBjYWNoZSBzbyB0aGUgQ1BNIGRvZXMgbm90IGdldCBzdGFsZSBtZW1vcnkgZGF0YS4gCisJICovCisJQ0JEV19CVUZBRERSKGJkcCwgZG1hX21hcF9zaW5nbGUoTlVMTCwgc2tiLT5kYXRhLAorCQkJCQkgc2tiLT5sZW4sIERNQV9UT19ERVZJQ0UpKTsKKwlDQkRXX0RBVExFTihiZHAsIHNrYi0+bGVuKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJLyoKKwkgKiBJZiB0aGlzIHdhcyB0aGUgbGFzdCBCRCBpbiB0aGUgcmluZywgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBhZ2Fpbi4gCisJICovCisJaWYgKChDQkRSX1NDKGJkcCkgJiBCRF9FTkVUX1RYX1dSQVApID09IDApCisJCWZlcC0+Y3VyX3R4Kys7CisJZWxzZQorCQlmZXAtPmN1cl90eCA9IGZlcC0+dHhfYmRfYmFzZTsKKworCWlmICghLS1mZXAtPnR4X2ZyZWUpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qCisJICogVHJpZ2dlciB0cmFuc21pc3Npb24gc3RhcnQgCisJICovCisJQ0JEU19TQyhiZHAsIEJEX0VORVRfVFhfUkVBRFkgfCBCRF9FTkVUX1RYX0lOVFIgfAorCQlCRF9FTkVUX1RYX0xBU1QgfCBCRF9FTkVUX1RYX1RDKTsKKwlGVyhmZWNwLCB4X2Rlc19hY3RpdmUsIDB4MDEwMDAwMDApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmVwLT50eF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZmVjX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWZlcC0+c3RhdHMudHhfZXJyb3JzKys7CisKKwlpZiAoZmVwLT50eF9mcmVlKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwkvKiBjaGVjayBsaW5rIHN0YXR1cyBhZ2FpbiAqLworCWZlY19taWlfbGlua19zdGF0dXNfY2hhbmdlX2NoZWNrKGRldiwgMCk7Cit9CisKK3N0YXRpYyBpbnQgZmVjX2VuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWNvbnN0IHN0cnVjdCBmZWNfcGxhdGZvcm1faW5mbyAqZnBpID0gZmVwLT5mcGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIEluc3RhbGwgb3VyIGludGVycnVwdCBoYW5kbGVyLiAqLworCWlmIChyZXF1ZXN0X2lycShmcGktPmZlY19pcnEsIGZlY19lbmV0X2ludGVycnVwdCwgMCwgImZlYyIsIGRldikgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX01PRFVMRV9OQU1FCisJCSAgICAgICAiOiAlcyBDb3VsZCBub3QgYWxsb2NhdGUgRkVDIElSUSEiLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBJbnN0YWxsIG91ciBwaHkgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlpZiAoZnBpLT5waHlfaXJxICE9IC0xICYmIAorCQlyZXF1ZXN0X2lycShmcGktPnBoeV9pcnEsIGZlY19taWlfbGlua19pbnRlcnJ1cHQsIDAsICJmZWMtcGh5IiwKKwkJCQlkZXYpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9NT0RVTEVfTkFNRQorCQkgICAgICAgIjogJXMgQ291bGQgbm90IGFsbG9jYXRlIFBIWSBJUlEhIiwgZGV2LT5uYW1lKTsKKwkJZnJlZV9pcnEoZnBpLT5mZWNfaXJxLCBkZXYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZnBpLT51c2VfbWRpbykgeworCQlmZWNfbWlpX3N0YXJ0dXAoZGV2KTsKKwkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJZmVjX21paV9saW5rX3N0YXR1c19jaGFuZ2VfY2hlY2soZGV2LCAxKTsKKwl9IGVsc2UgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZmVwLT5sb2NrLCBmbGFncyk7CisJCWZlY19yZXN0YXJ0KGRldiwgMSwgMTAwKTsJLyogWFhYIHRoaXMgc3Vja3MgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmVwLT5sb2NrLCBmbGFncyk7CisKKwkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmZWNfZW5ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWNvbnN0IHN0cnVjdCBmZWNfcGxhdGZvcm1faW5mbyAqZnBpID0gZmVwLT5mcGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJaWYgKGZwaS0+dXNlX21kaW8pCisJCWZlY19taWlfc2h1dGRvd24oZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmZXAtPmxvY2ssIGZsYWdzKTsKKwlmZWNfc3RvcChkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZlcC0+bG9jaywgZmxhZ3MpOworCisJLyogcmVsZWFzZSBhbnkgaXJxcyAqLworCWlmIChmcGktPnBoeV9pcnEgIT0gLTEpCisJCWZyZWVfaXJxKGZwaS0+cGh5X2lycSwgZGV2KTsKKwlmcmVlX2lycShmcGktPmZlY19pcnEsIGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpmZWNfZW5ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gJmZlcC0+c3RhdHM7Cit9CisKK3N0YXRpYyBpbnQgZmVjX2VuZXRfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCkKK3sKKwlyZXR1cm4gZmVjX2VuZXRfcnhfY29tbW9uKGRldiwgYnVkZ2V0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGZlY19nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX01PRFVMRV9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX01PRFVMRV9WRVJTSU9OKTsKK30KKworc3RhdGljIGludCBmZWNfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHNpemVvZihmZWNfdCk7Cit9CisKK3N0YXRpYyB2b2lkIGZlY19nZXRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLAorCQkJIHZvaWQgKnApCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChyZWdzLT5sZW4gPCBzaXplb2YoZmVjX3QpKQorCQlyZXR1cm47CisKKwlyZWdzLT52ZXJzaW9uID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmVwLT5sb2NrLCBmbGFncyk7CisJbWVtY3B5X2Zyb21pbyhwLCBmZXAtPmZlY3AsIHNpemVvZihmZWNfdCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZlcC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGZlY19nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmVwLT5sb2NrLCBmbGFncyk7CisJcmMgPSBtaWlfZXRodG9vbF9nc2V0KCZmZXAtPm1paV9pZiwgY21kKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZXAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBmZWNfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZlcC0+bG9jaywgZmxhZ3MpOworCXJjID0gbWlpX2V0aHRvb2xfc3NldCgmZmVwLT5taWlfaWYsIGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmVwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZmVjX253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbWlpX253YXlfcmVzdGFydCgmZmVwLT5taWlfaWYpOworfQorCitzdGF0aWMgX191MzIgZmVjX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiBmZXAtPm1zZ19lbmFibGU7Cit9CisKK3N0YXRpYyB2b2lkIGZlY19zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MzIgdmFsdWUpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJZmVwLT5tc2dfZW5hYmxlID0gdmFsdWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZmVjX2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbyA9IGZlY19nZXRfZHJ2aW5mbywKKwkuZ2V0X3JlZ3NfbGVuID0gZmVjX2dldF9yZWdzX2xlbiwKKwkuZ2V0X3NldHRpbmdzID0gZmVjX2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzID0gZmVjX3NldF9zZXR0aW5ncywKKwkubndheV9yZXNldCA9IGZlY19ud2F5X3Jlc2V0LAorCS5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9tc2dsZXZlbCA9IGZlY19nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbCA9IGZlY19zZXRfbXNnbGV2ZWwsCisJLmdldF90eF9jc3VtID0gZXRodG9vbF9vcF9nZXRfdHhfY3N1bSwKKwkuc2V0X3R4X2NzdW0gPSBldGh0b29sX29wX3NldF90eF9jc3VtLAkvKiBsb2NhbCEgKi8KKwkuZ2V0X3NnID0gZXRodG9vbF9vcF9nZXRfc2csCisJLnNldF9zZyA9IGV0aHRvb2xfb3Bfc2V0X3NnLAorCS5nZXRfcmVncyA9IGZlY19nZXRfcmVncywKK307CisKK3N0YXRpYyBpbnQgZmVjX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG1paV9pb2N0bF9kYXRhICptaWkgPSAoc3RydWN0IG1paV9pb2N0bF9kYXRhICopJnJxLT5pZnJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYzsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmZXAtPmxvY2ssIGZsYWdzKTsKKwlyYyA9IGdlbmVyaWNfbWlpX2lvY3RsKCZmZXAtPm1paV9pZiwgbWlpLCBjbWQsIE5VTEwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZlcC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByYzsKK30KKworaW50IGZlY184eHhfaW5pdF9vbmUoY29uc3Qgc3RydWN0IGZlY19wbGF0Zm9ybV9pbmZvICpmcGksCisJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKipkZXZwKQoreworCWltbWFwX3QgKmltbWFwID0gKGltbWFwX3QgKikgSU1BUF9BRERSOworCXN0YXRpYyBpbnQgZmVjXzh4eF92ZXJzaW9uX3ByaW50ZWQgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBOVUxMOworCWZlY190ICpmZWNwID0gTlVMTDsKKwlpbnQgaTsKKwlpbnQgZXJyID0gMDsKKwlpbnQgcmVnaXN0ZXJlZCA9IDA7CisJX191MzIgc2llbDsKKworCSpkZXZwID0gTlVMTDsKKworCXN3aXRjaCAoZnBpLT5mZWNfbm8pIHsKKwljYXNlIDA6CisJCWZlY3AgPSAmKChpbW1hcF90ICopIElNQVBfQUREUiktPmltX2NwbS5jcF9mZWM7CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19EVUVUCisJY2FzZSAxOgorCQlmZWNwID0gJigoaW1tYXBfdCAqKSBJTUFQX0FERFIpLT5pbV9jcG0uY3BfZmVjMjsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZmVjXzh4eF92ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworCisJaSA9IHNpemVvZigqZmVwKSArIChzaXplb2Yoc3RydWN0IHNrX2J1ZmYgKiopICoKKwkJCSAgICAoZnBpLT5yeF9yaW5nICsgZnBpLT50eF9yaW5nKSk7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihpKTsKKwlpZiAoIWRldikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIHBhcnRpYWwgcmVzZXQgb2YgRkVDICovCisJZmVjX3doYWNrX3Jlc2V0KGZlY3ApOworCisJLyogcG9pbnQgcnhfc2tidWZmLCB0eF9za2J1ZmYgKi8KKwlmZXAtPnJ4X3NrYnVmZiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKikmZmVwWzFdOworCWZlcC0+dHhfc2tidWZmID0gZmVwLT5yeF9za2J1ZmYgKyBmcGktPnJ4X3Jpbmc7CisKKwlmZXAtPmZlY3AgPSBmZWNwOworCWZlcC0+ZnBpID0gZnBpOworCisJLyogaW5pdCBsb2NrcyAqLworCXNwaW5fbG9ja19pbml0KCZmZXAtPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZmZXAtPnR4X2xvY2spOworCisJLyoKKwkgKiBTZXQgdGhlIEV0aGVybmV0IGFkZHJlc3MuIAorCSAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSBmcGktPm1hY2FkZHJbaV07CisKKwlmZXAtPnJpbmdfYmFzZSA9IGRtYV9hbGxvY19jb2hlcmVudChOVUxMLAorCQkJCQkgICAgKGZwaS0+dHhfcmluZyArIGZwaS0+cnhfcmluZykgKgorCQkJCQkgICAgc2l6ZW9mKGNiZF90KSwgJmZlcC0+cmluZ19tZW1fYWRkciwKKwkJCQkJICAgIEdGUF9LRVJORUwpOworCWlmIChmZXAtPnJpbmdfYmFzZSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTU9EVUxFX05BTUUKKwkJICAgICAgICI6ICVzIGRtYSBhbGxvYyBmYWlsZWQuXG4iLCBkZXYtPm5hbWUpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwkvKgorCSAqIFNldCByZWNlaXZlIGFuZCB0cmFuc21pdCBkZXNjcmlwdG9yIGJhc2UuCisJICovCisJZmVwLT5yeF9iZF9iYXNlID0gZmVwLT5yaW5nX2Jhc2U7CisJZmVwLT50eF9iZF9iYXNlID0gZmVwLT5yeF9iZF9iYXNlICsgZnBpLT5yeF9yaW5nOworCisJLyogaW5pdGlhbGl6ZSByaW5nIHNpemUgdmFyaWFibGVzICovCisJZmVwLT50eF9yaW5nID0gZnBpLT50eF9yaW5nOworCWZlcC0+cnhfcmluZyA9IGZwaS0+cnhfcmluZzsKKworCS8qIFNJVSBpbnRlcnJ1cHQgKi8KKwlpZiAoZnBpLT5waHlfaXJxICE9IC0xICYmCisJCShmcGktPnBoeV9pcnEgPj0gU0lVX0lSUTAgJiYgZnBpLT5waHlfaXJxIDwgU0lVX0xFVkVMNykpIHsKKworCQlzaWVsID0gaW5fYmUzMigmaW1tYXAtPmltX3NpdV9jb25mLnNjX3NpZWwpOworCQlpZiAoKGZwaS0+cGh5X2lycSAmIDEpID09IDApCisJCQlzaWVsIHw9ICgweDgwMDAwMDAwID4+IGZwaS0+cGh5X2lycSk7CisJCWVsc2UKKwkJCXNpZWwgJj0gfigweDgwMDAwMDAwID4+IChmcGktPnBoeV9pcnEgJiB+MSkpOworCQlvdXRfYmUzMigmaW1tYXAtPmltX3NpdV9jb25mLnNjX3NpZWwsIHNpZWwpOworCX0KKworCS8qCisJICogVGhlIEZFQyBFdGhlcm5ldCBzcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAKKwkgKi8KKwlkZXYtPm9wZW4gPSBmZWNfZW5ldF9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gZmVjX2VuZXRfc3RhcnRfeG1pdDsKKwlkZXYtPnR4X3RpbWVvdXQgPSBmZWNfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKwlkZXYtPnN0b3AgPSBmZWNfZW5ldF9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9IGZlY19lbmV0X2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGZlY19zZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBmZWNfc2V0X21hY19hZGRyZXNzOworCWlmIChmcGktPnVzZV9uYXBpKSB7CisJCWRldi0+cG9sbCA9IGZlY19lbmV0X3BvbGw7CisJCWRldi0+d2VpZ2h0ID0gZnBpLT5uYXBpX3dlaWdodDsKKwl9CisJZGV2LT5ldGh0b29sX29wcyA9ICZmZWNfZXRodG9vbF9vcHM7CisJZGV2LT5kb19pb2N0bCA9IGZlY19pb2N0bDsKKworCWZlcC0+ZmVjX3BoeV9zcGVlZCA9CisJICAgICgoKChmcGktPnN5c19jbGsgKyA0OTk5OTk5KSAvIDI1MDAwMDApIC8gMikgJiAweDNGKSA8PCAxOworCisJaW5pdF90aW1lcigmZmVwLT5waHlfdGltZXJfbGlzdCk7CisKKwkvKiBwYXJ0aWFsIHJlc2V0IG9mIEZFQyBzbyB0aGF0IG9ubHkgTUlJIHdvcmtzICovCisJRlcoZmVjcCwgbWlpX3NwZWVkLCBmZXAtPmZlY19waHlfc3BlZWQpOworCUZXKGZlY3AsIGlldmVudCwgMHhmZmMwKTsKKwlGVyhmZWNwLCBpdmVjLCAoZnBpLT5mZWNfaXJxIC8gMikgPDwgMjkpOworCUZXKGZlY3AsIGltYXNrLCAwKTsKKwlGVyhmZWNwLCByX2NudHJsLCBGRUNfUkNOVFJMX01JSV9NT0RFKTsJLyogTUlJIGVuYWJsZSAqLworCUZXKGZlY3AsIGVjbnRybCwgRkVDX0VDTlRSTF9QSU5NVVggfCBGRUNfRUNOVFJMX0VUSEVSX0VOKTsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyICE9IDApCisJCWdvdG8gZXJyOworCXJlZ2lzdGVyZWQgPSAxOworCisJaWYgKGZwaS0+dXNlX21kaW8pIHsKKwkJZmVwLT5taWlfaWYuZGV2ID0gZGV2OworCQlmZXAtPm1paV9pZi5tZGlvX3JlYWQgPSBmZWNfbWlpX3JlYWQ7CisJCWZlcC0+bWlpX2lmLm1kaW9fd3JpdGUgPSBmZWNfbWlpX3dyaXRlOworCQlmZXAtPm1paV9pZi5waHlfaWRfbWFzayA9IDB4MWY7CisJCWZlcC0+bWlpX2lmLnJlZ19udW1fbWFzayA9IDB4MWY7CisJCWZlcC0+bWlpX2lmLnBoeV9pZCA9IGZlY19taWlfcGh5X2lkX2RldGVjdChkZXYpOworCX0KKworCSpkZXZwID0gZGV2OworCisJcmV0dXJuIDA7CisKKyAgICAgIGVycjoKKwlpZiAoZGV2ICE9IE5VTEwpIHsKKwkJaWYgKGZlY3AgIT0gTlVMTCkKKwkJCWZlY193aGFja19yZXNldChmZWNwKTsKKworCQlpZiAocmVnaXN0ZXJlZCkKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwkJaWYgKGZlcCAhPSBOVUxMKSB7CisJCQlpZiAoZmVwLT5yaW5nX2Jhc2UpCisJCQkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwKKwkJCQkJCSAgKGZwaS0+dHhfcmluZyArCisJCQkJCQkgICBmcGktPnJ4X3JpbmcpICoKKwkJCQkJCSAgc2l6ZW9mKGNiZF90KSwgZmVwLT5yaW5nX2Jhc2UsCisJCQkJCQkgIGZlcC0+cmluZ19tZW1fYWRkcik7CisJCX0KKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworaW50IGZlY184eHhfY2xlYW51cF9vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlmZWNfdCAqZmVjcCA9IGZlcC0+ZmVjcDsKKwljb25zdCBzdHJ1Y3QgZmVjX3BsYXRmb3JtX2luZm8gKmZwaSA9IGZlcC0+ZnBpOworCisJZmVjX3doYWNrX3Jlc2V0KGZlY3ApOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIChmcGktPnR4X3JpbmcgKyBmcGktPnJ4X3JpbmcpICogc2l6ZW9mKGNiZF90KSwKKwkJCSAgZmVwLT5yaW5nX2Jhc2UsIGZlcC0+cmluZ19tZW1fYWRkcik7CisKKwlmcmVlX25ldGRldihkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBfX2luaXQgZmVjXzh4eF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGZlY184eHhfcGxhdGZvcm1faW5pdCgpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmVjXzh4eF9jbGVhbnVwKHZvaWQpCit7CisJZmVjXzh4eF9wbGF0Zm9ybV9jbGVhbnVwKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworbW9kdWxlX2luaXQoZmVjXzh4eF9pbml0KTsKK21vZHVsZV9leGl0KGZlY184eHhfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mZWNfOHh4L2ZlY19taWkuYyBiL2RyaXZlcnMvbmV0L2ZlY184eHgvZmVjX21paS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwM2ViMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9mZWNfOHh4L2ZlY19taWkuYwpAQCAtMCwwICsxLDM4MCBAQAorLyoKKyAqIEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciAoRkVDKSBkcml2ZXIgZm9yIE1vdG9yb2xhIE1QQzh4eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgSW50cmFjb20gUy5BLiAKKyAqICBieSBQYW50ZWxpcyBBbnRvbmlvdSA8cGFudG9AaW50cmFjb20uZ3I+CisgKgorICogSGVhdmlseSBiYXNlZCBvbiBvcmlnaW5hbCBGRUMgZHJpdmVyIGJ5IERhbiBNYWxlayA8ZGFuQGVtYmVkZGVkZWRnZS5jb20+CisgKiBhbmQgbW9kaWZpY2F0aW9ucyBieSBKb2FraW0gVGplcm5sdW5kIDxqb2FraW0udGplcm5sdW5kQGx1bWVudGlzLnNlPgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vOHh4X2ltbWFwLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vbXBjOHh4Lmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2NvbW1wcm9jLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiZmVjXzh4eC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTWFrZSBNSUkgcmVhZC93cml0ZSBjb21tYW5kcyBmb3IgdGhlIEZFQy4KKyovCisjZGVmaW5lIG1rX21paV9yZWFkKFJFRykJKDB4NjAwMjAwMDAgfCAoKFJFRyAmIDB4MWYpIDw8IDE4KSkKKyNkZWZpbmUgbWtfbWlpX3dyaXRlKFJFRywgVkFMKQkoMHg1MDAyMDAwMCB8ICgoUkVHICYgMHgxZikgPDwgMTgpIHwgKFZBTCAmIDB4ZmZmZikpCisjZGVmaW5lIG1rX21paV9lbmQJCTAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFhYWCBib3RoIEZFQ3MgdXNlIHRoZSBNSUkgaW50ZXJmYWNlIG9mIEZFQzEgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZmVjX21paV9sb2NrKTsKKworI2RlZmluZSBGRUNfTUlJX0xPT1BTCTEwMDAwCisKK2ludCBmZWNfbWlpX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWZlY190ICpmZWNwOworCWludCBpLCByZXQgPSAtMTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogWFhYIE1JSSBpbnRlcmZhY2UgaXMgb25seSBjb25uZWN0ZWQgdG8gRkVDMSAqLworCWZlY3AgPSAmKChpbW1hcF90ICopIElNQVBfQUREUiktPmltX2NwbS5jcF9mZWM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmVjX21paV9sb2NrLCBmbGFncyk7CisKKwlpZiAoKEZSKGZlY3AsIHJfY250cmwpICYgRkVDX1JDTlRSTF9NSUlfTU9ERSkgPT0gMCkgeworCQlGUyhmZWNwLCByX2NudHJsLCBGRUNfUkNOVFJMX01JSV9NT0RFKTsJLyogTUlJIGVuYWJsZSAqLworCQlGUyhmZWNwLCBlY250cmwsIEZFQ19FQ05UUkxfUElOTVVYIHwgRkVDX0VDTlRSTF9FVEhFUl9FTik7CisJCUZXKGZlY3AsIGlldmVudCwgRkVDX0VORVRfTUlJKTsKKwl9CisKKwkvKiBBZGQgUEhZIGFkZHJlc3MgdG8gcmVnaXN0ZXIgY29tbWFuZC4gICovCisJRlcoZmVjcCwgbWlpX3NwZWVkLCBmZXAtPmZlY19waHlfc3BlZWQpOworCUZXKGZlY3AsIG1paV9kYXRhLCAocGh5X2lkIDw8IDIzKSB8IG1rX21paV9yZWFkKGxvY2F0aW9uKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRkVDX01JSV9MT09QUzsgaSsrKQorCQlpZiAoKEZSKGZlY3AsIGlldmVudCkgJiBGRUNfRU5FVF9NSUkpICE9IDApCisJCQlicmVhazsKKworCWlmIChpIDwgRkVDX01JSV9MT09QUykgeworCQlGVyhmZWNwLCBpZXZlbnQsIEZFQ19FTkVUX01JSSk7CisJCXJldCA9IEZSKGZlY3AsIG1paV9kYXRhKSAmIDB4ZmZmZjsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZWNfbWlpX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgZmVjX21paV93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlmZWNfdCAqZmVjcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJLyogWFhYIE1JSSBpbnRlcmZhY2UgaXMgb25seSBjb25uZWN0ZWQgdG8gRkVDMSAqLworCWZlY3AgPSAmKChpbW1hcF90ICopIElNQVBfQUREUiktPmltX2NwbS5jcF9mZWM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmVjX21paV9sb2NrLCBmbGFncyk7CisKKwlpZiAoKEZSKGZlY3AsIHJfY250cmwpICYgRkVDX1JDTlRSTF9NSUlfTU9ERSkgPT0gMCkgeworCQlGUyhmZWNwLCByX2NudHJsLCBGRUNfUkNOVFJMX01JSV9NT0RFKTsJLyogTUlJIGVuYWJsZSAqLworCQlGUyhmZWNwLCBlY250cmwsIEZFQ19FQ05UUkxfUElOTVVYIHwgRkVDX0VDTlRSTF9FVEhFUl9FTik7CisJCUZXKGZlY3AsIGlldmVudCwgRkVDX0VORVRfTUlJKTsKKwl9CisKKwkvKiBBZGQgUEhZIGFkZHJlc3MgdG8gcmVnaXN0ZXIgY29tbWFuZC4gICovCisJRlcoZmVjcCwgbWlpX3NwZWVkLCBmZXAtPmZlY19waHlfc3BlZWQpOwkvKiBhbHdheXMgYWRhcHQgbWlpIHNwZWVkICovCisJRlcoZmVjcCwgbWlpX2RhdGEsIChwaHlfaWQgPDwgMjMpIHwgbWtfbWlpX3dyaXRlKGxvY2F0aW9uLCB2YWx1ZSkpOworCisJZm9yIChpID0gMDsgaSA8IEZFQ19NSUlfTE9PUFM7IGkrKykKKwkJaWYgKChGUihmZWNwLCBpZXZlbnQpICYgRkVDX0VORVRfTUlJKSAhPSAwKQorCQkJYnJlYWs7CisKKwlpZiAoaSA8IEZFQ19NSUlfTE9PUFMpCisJCUZXKGZlY3AsIGlldmVudCwgRkVDX0VORVRfTUlJKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZlY19taWlfbG9jaywgZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIENPTkZJR19GRUNfOFhYX0dFTkVSSUNfUEhZCisKKy8qCisgKiBHZW5lcmljIFBIWSBzdXBwb3J0LgorICogU2hvdWxkIHdvcmsgZm9yIGFsbCBQSFlzLCBidXQgbGluayBjaGFuZ2UgaXMgZGV0ZWN0ZWQgYnkgcG9sbGluZworICovCisKK3N0YXRpYyB2b2lkIGdlbmVyaWNfdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZmVwLT5waHlfdGltZXJfbGlzdC5leHBpcmVzID0gamlmZmllcyArIEhaIC8gMjsKKworCWFkZF90aW1lcigmZmVwLT5waHlfdGltZXJfbGlzdCk7CisKKwlmZWNfbWlpX2xpbmtfc3RhdHVzX2NoYW5nZV9jaGVjayhkZXYsIDApOworfQorCitzdGF0aWMgdm9pZCBnZW5lcmljX3N0YXJ0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWZlcC0+cGh5X3RpbWVyX2xpc3QuZXhwaXJlcyA9IGppZmZpZXMgKyBIWiAvIDI7CS8qIGV2ZXJ5IDUwMG1zICovCisJZmVwLT5waHlfdGltZXJfbGlzdC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCWZlcC0+cGh5X3RpbWVyX2xpc3QuZnVuY3Rpb24gPSBnZW5lcmljX3RpbWVyX2NhbGxiYWNrOworCWFkZF90aW1lcigmZmVwLT5waHlfdGltZXJfbGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbmVyaWNfc2h1dGRvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWRlbF90aW1lcl9zeW5jKCZmZXAtPnBoeV90aW1lcl9saXN0KTsKK30KKworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRkVDXzhYWF9ETTkxNjFfUEhZCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFRoZSBEYXZpY29tIERNOTE2MSBpcyB1c2VkIG9uIHRoZSBORVRUQSBib2FyZAkJCSAgICAgKi8KKworLyogcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBNSUlfRE05MTYxX0FDUgkJMTYJLyogQXV4LiBDb25maWcgUmVnaXN0ZXIgICAgICAgICAqLworI2RlZmluZSBNSUlfRE05MTYxX0FDU1IJCTE3CS8qIEF1eC4gQ29uZmlnL1N0YXR1cyBSZWdpc3RlciAgKi8KKyNkZWZpbmUgTUlJX0RNOTE2MV8xMFRDU1IJMTgJLyogMTBCYXNlVCBDb25maWcvU3RhdHVzIFJlZy4gICAqLworI2RlZmluZSBNSUlfRE05MTYxX0lOVFIJCTIxCS8qIEludGVycnVwdCBSZWdpc3RlciAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlJX0RNOTE2MV9SRUNSCQkyMgkvKiBSZWNlaXZlIEVycm9yIENvdW50ZXIgUmVnLiAgICovCisjZGVmaW5lIE1JSV9ETTkxNjFfRElTQ1IJMjMJLyogRGlzY29ubmVjdCBDb3VudGVyIFJlZ2lzdGVyICAqLworCitzdGF0aWMgdm9pZCBkbTkxNjFfc3RhcnR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZmVjX21paV93cml0ZShkZXYsIGZlcC0+bWlpX2lmLnBoeV9pZCwgTUlJX0RNOTE2MV9JTlRSLCAweDAwMDApOworfQorCitzdGF0aWMgdm9pZCBkbTkxNjFfYWNrX2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZmVjX21paV9yZWFkKGRldiwgZmVwLT5taWlfaWYucGh5X2lkLCBNSUlfRE05MTYxX0lOVFIpOworfQorCitzdGF0aWMgdm9pZCBkbTkxNjFfc2h1dGRvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWZlY19taWlfd3JpdGUoZGV2LCBmZXAtPm1paV9pZi5waHlfaWQsIE1JSV9ETTkxNjFfSU5UUiwgMHgwZjAwKTsKK30KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9pbmZvIHBoeV9pbmZvW10gPSB7CisjaWZkZWYgQ09ORklHX0ZFQ184WFhfRE05MTYxX1BIWQorCXsKKwkgLmlkID0gMHgwMDE4MWI4OCwKKwkgLm5hbWUgPSAiRE05MTYxIiwKKwkgLnN0YXJ0dXAgPSBkbTkxNjFfc3RhcnR1cCwKKwkgLmFja19pbnQgPSBkbTkxNjFfYWNrX2ludCwKKwkgLnNodXRkb3duID0gZG05MTYxX3NodXRkb3duLAorCSB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZFQ184WFhfR0VORVJJQ19QSFkKKwl7CisJIC5pZCA9IDAsCisJIC5uYW1lID0gIkdFTkVSSUMiLAorCSAuc3RhcnR1cCA9IGdlbmVyaWNfc3RhcnR1cCwKKwkgLnNodXRkb3duID0gZ2VuZXJpY19zaHV0ZG93biwKKwkgfSwKKyNlbmRpZgorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBmZWNfbWlpX3BoeV9pZF9kZXRlY3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljb25zdCBzdHJ1Y3QgZmVjX3BsYXRmb3JtX2luZm8gKmZwaSA9IGZlcC0+ZnBpOworCWludCBpLCByLCBzdGFydCwgZW5kLCBwaHl0eXBlLCBwaHlzdWJ0eXBlOworCWNvbnN0IHN0cnVjdCBwaHlfaW5mbyAqcGh5OworCWludCBwaHlfaHdpZCwgcGh5X2lkOworCisJLyogaWYgbm8gTURJTyAqLworCWlmIChmcGktPnVzZV9tZGlvID09IDApCisJCXJldHVybiAtMTsKKworCXBoeV9od2lkID0gLTE7CisJZmVwLT5waHkgPSBOVUxMOworCisJLyogYXV0by1kZXRlY3Q/ICovCisJaWYgKGZwaS0+cGh5X2FkZHIgPT0gLTEpIHsKKwkJc3RhcnQgPSAwOworCQllbmQgPSAzMjsKKwl9IGVsc2UgewkJLyogZGlyZWN0ICovCisJCXN0YXJ0ID0gZnBpLT5waHlfYWRkcjsKKwkJZW5kID0gc3RhcnQgKyAxOworCX0KKworCWZvciAocGh5X2lkID0gc3RhcnQ7IHBoeV9pZCA8IGVuZDsgcGh5X2lkKyspIHsKKwkJciA9IGZlY19taWlfcmVhZChkZXYsIHBoeV9pZCwgTUlJX1BIWVNJRDEpOworCQlpZiAociA9PSAtMSB8fCAocGh5dHlwZSA9IChyICYgMHhmZmZmKSkgPT0gMHhmZmZmKQorCQkJY29udGludWU7CisJCXIgPSBmZWNfbWlpX3JlYWQoZGV2LCBwaHlfaWQsIE1JSV9QSFlTSUQyKTsKKwkJaWYgKHIgPT0gLTEgfHwgKHBoeXN1YnR5cGUgPSAociAmIDB4ZmZmZikpID09IDB4ZmZmZikKKwkJCWNvbnRpbnVlOworCQlwaHlfaHdpZCA9IChwaHl0eXBlIDw8IDE2KSB8IHBoeXN1YnR5cGU7CisJCWlmIChwaHlfaHdpZCAhPSAtMSkKKwkJCWJyZWFrOworCX0KKworCWlmIChwaHlfaHdpZCA9PSAtMSkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX01PRFVMRV9OQU1FCisJCSAgICAgICAiOiAlcyBObyBQSFkgZGV0ZWN0ZWQhXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChpID0gMCwgcGh5ID0gcGh5X2luZm87IGkgPCBzaXplb2YocGh5X2luZm8pIC8gc2l6ZW9mKHBoeV9pbmZvWzBdKTsKKwkgICAgIGkrKywgcGh5KyspCisJCWlmIChwaHktPmlkID09IChwaHlfaHdpZCA+PiA0KSB8fCBwaHktPmlkID09IDApCisJCQlicmVhazsKKworCWlmIChpID49IHNpemVvZihwaHlfaW5mbykgLyBzaXplb2YocGh5X2luZm9bMF0pKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTU9EVUxFX05BTUUKKwkJICAgICAgICI6ICVzIFBIWSBpZCAweCUwOHggaXMgbm90IHN1cHBvcnRlZCFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHBoeV9od2lkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZlcC0+cGh5ID0gcGh5OworCisJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTU9EVUxFX05BTUUKKwkgICAgICAgIjogJXMgUGh5IEAgMHgleCwgdHlwZSAlcyAoMHglMDh4KVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBwaHlfaWQsIGZlcC0+cGh5LT5uYW1lLCBwaHlfaHdpZCk7CisKKwlyZXR1cm4gcGh5X2lkOworfQorCit2b2lkIGZlY19taWlfc3RhcnR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWNvbnN0IHN0cnVjdCBmZWNfcGxhdGZvcm1faW5mbyAqZnBpID0gZmVwLT5mcGk7CisKKwlpZiAoIWZwaS0+dXNlX21kaW8gfHwgZmVwLT5waHkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGZlcC0+cGh5LT5zdGFydHVwID09IE5VTEwpCisJCXJldHVybjsKKworCSgqZmVwLT5waHktPnN0YXJ0dXApIChkZXYpOworfQorCit2b2lkIGZlY19taWlfc2h1dGRvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljb25zdCBzdHJ1Y3QgZmVjX3BsYXRmb3JtX2luZm8gKmZwaSA9IGZlcC0+ZnBpOworCisJaWYgKCFmcGktPnVzZV9tZGlvIHx8IGZlcC0+cGh5ID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChmZXAtPnBoeS0+c2h1dGRvd24gPT0gTlVMTCkKKwkJcmV0dXJuOworCisJKCpmZXAtPnBoeS0+c2h1dGRvd24pIChkZXYpOworfQorCit2b2lkIGZlY19taWlfYWNrX2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWNvbnN0IHN0cnVjdCBmZWNfcGxhdGZvcm1faW5mbyAqZnBpID0gZmVwLT5mcGk7CisKKwlpZiAoIWZwaS0+dXNlX21kaW8gfHwgZmVwLT5waHkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGZlcC0+cGh5LT5hY2tfaW50ID09IE5VTEwpCisJCXJldHVybjsKKworCSgqZmVwLT5waHktPmFja19pbnQpIChkZXYpOworfQorCisvKiBoZWxwZXIgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgbWlpX25lZ290aWF0ZWQoc3RydWN0IG1paV9pZl9pbmZvICptaWkpCit7CisJaW50IGFkdmVydCwgbHBhLCB2YWw7CisKKwlpZiAoIW1paV9saW5rX29rKG1paSkpCisJCXJldHVybiAwOworCisJdmFsID0gKCptaWktPm1kaW9fcmVhZCkgKG1paS0+ZGV2LCBtaWktPnBoeV9pZCwgTUlJX0JNU1IpOworCWlmICgodmFsICYgQk1TUl9BTkVHQ09NUExFVEUpID09IDApCisJCXJldHVybiAwOworCisJYWR2ZXJ0ID0gKCptaWktPm1kaW9fcmVhZCkgKG1paS0+ZGV2LCBtaWktPnBoeV9pZCwgTUlJX0FEVkVSVElTRSk7CisJbHBhID0gKCptaWktPm1kaW9fcmVhZCkgKG1paS0+ZGV2LCBtaWktPnBoeV9pZCwgTUlJX0xQQSk7CisKKwlyZXR1cm4gbWlpX253YXlfcmVzdWx0KGFkdmVydCAmIGxwYSk7Cit9CisKK3ZvaWQgZmVjX21paV9saW5rX3N0YXR1c19jaGFuZ2VfY2hlY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluaXRfbWVkaWEpCit7CisJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IG1lZGlhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobWlpX2NoZWNrX21lZGlhKCZmZXAtPm1paV9pZiwgbmV0aWZfbXNnX2xpbmsoZmVwKSwgaW5pdF9tZWRpYSkgPT0gMCkKKwkJcmV0dXJuOworCisJbWVkaWEgPSBtaWlfbmVnb3RpYXRlZCgmZmVwLT5taWlfaWYpOworCisJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZmVwLT5sb2NrLCBmbGFncyk7CisJCWZlY19yZXN0YXJ0KGRldiwgISEobWVkaWEgJiBBRFZFUlRJU0VfRlVMTCksCisJCQkgICAgKG1lZGlhICYgKEFEVkVSVElTRV8xMDBGVUxMIHwgQURWRVJUSVNFXzEwMEhBTEYpKSA/CisJCQkgICAgMTAwIDogMTApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZXAtPmxvY2ssIGZsYWdzKTsKKworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCX0gZWxzZSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZmVwLT5sb2NrLCBmbGFncyk7CisJCWZlY19zdG9wKGRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZlcC0+bG9jaywgZmxhZ3MpOworCisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZm12MTh4LmMgYi9kcml2ZXJzL25ldC9mbXYxOHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGM3NDg1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZm12MTh4LmMKQEAgLTAsMCArMSw2ODkgQEAKKy8qIGZtdjE4eC5jOiBBIG5ldHdvcmsgZGV2aWNlIGRyaXZlciBmb3IgdGhlIEZ1aml0c3UgRk1WLTE4MS8xODIvMTgzLzE4NC4KKworCU9yaWdpbmFsOiBhdDE3MDAuYyAoMTk5My05NCBieSBEb25hbGQgQmVja2VyKS4KKwkJQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorCQlEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LgorCQlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCQkJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisJCQk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCQkJQW5uYXBvbGlzIE1EIDIxNDAzCisKKwlNb2RpZmllZCBieSBZdXRha2EgVEFNSVlBICh0YW15QGZsYWIuZnVqaXRzdS5jby5qcCkKKwkJQ29weXJpZ2h0IDE5OTQgRnVqaXRzdSBMYWJvcmF0b3JpZXMgTHRkLgorCVNwZWNpYWwgdGhhbmtzIHRvOgorCQlNYXNheW9zaGkgVVRBS0EgKHV0YWthQGFjZS55ay5mdWppdHN1LmNvLmpwKQorCQkJZm9yIHRlc3RpbmcgdGhpcyBkcml2ZXIuCisJCUguIE5FR0lTSEkgKGFneSwgbmVnaXNoaUBzdW40NS5wc2QuY3MuZnVqaXRzdS5jby5qcCkKKwkJCWZvciBzdWdnZXN0aW9uIG9mIHNvbWUgcHJvZ3JhbSBtb2RpZmljYXRpb24uCisJCU1hc2FoaXJvIFNFS0lHVUNISSA8c2VraUBzeXNyYXAuY3MuZnVqaXRzdS5jby5qcD4KKwkJCWZvciBzdWdnZXN0aW9uIG9mIHNvbWUgcHJvZ3JhbSBtb2RpZmljYXRpb24uCisJCUthenV0b3NoaSBNT1JJT0tBIChtb3Jpb2thQGF1cm9yYS5vYWtzLmNzLmZ1aml0c3UuY28uanApCisJCQlmb3IgdGVzdGluZyB0aGlzIGRyaXZlci4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJVGhpcyBpcyBhIGRldmljZSBkcml2ZXIgZm9yIHRoZSBGdWppdHN1IEZNVi0xODEvMTgyLzE4My8xODQsIHdoaWNoCisJaXMgYSBzdHJhaWdodC1mb3J3YXJkIEZ1aml0c3UgTUI4Njk2NSBpbXBsZW1lbnRhdGlvbi4KKworICBTb3VyY2VzOgorICAgIGF0MTcwMC5jCisgICAgVGhlIEZ1aml0c3UgTUI4Njk2NSBkYXRhc2hlZXQuCisgICAgVGhlIEZ1aml0c3UgRk1WLTE4MS8xODIgdXNlcidzIGd1aWRlCisqLworCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPQorCSJmbXYxOHguYzp2Mi4yLjAgMDkvMjQvOTggIFl1dGFrYSBUQU1JWUEgKHRhbXlAZmxhYi5mdWppdHN1LmNvLmpwKVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNkZWZpbmUgRFJWX05BTUUgImZtdjE4eCIKKworc3RhdGljIHVuc2lnbmVkIGZtdjE4eF9wcm9iZV9saXN0W10gX19pbml0ZGF0YSA9IHsKKwkweDIyMCwgMHgyNDAsIDB4MjYwLCAweDI4MCwgMHgyYTAsIDB4MmMwLCAweDMwMCwgMHgzNDAsIDAKK307CisKKy8qIHVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sID4yIGZvciBkZWJ1ZyAqLworI2lmbmRlZiBORVRfREVCVUcKKyNkZWZpbmUgTkVUX0RFQlVHIDEKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGludCBuZXRfZGVidWcgPSBORVRfREVCVUc7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1Y2hhcjsKKworLyogSW5mb3JtYXRpb24gdGhhdCBuZWVkIHRvIGJlIGtlcHQgZm9yIGVhY2ggYm9hcmQuICovCitzdHJ1Y3QgbmV0X2xvY2FsIHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlsb25nIG9wZW5fdGltZTsJCQkJLyogVXNlbGVzcyBleGFtcGxlIGxvY2FsIGluZm8uICovCisJdWludCB0eF9zdGFydGVkOjE7CQkJLyogTnVtYmVyIG9mIHBhY2tldCBvbiB0aGUgVHggcXVldWUuICovCisJdWludCB0eF9xdWV1ZV9yZWFkeToxOwkJLyogVHggcXVldWUgaXMgcmVhZHkgdG8gYmUgc2VudC4gKi8KKwl1aW50IHJ4X3N0YXJ0ZWQ6MTsJCQkvKiBQYWNrZXRzIGFyZSBSeGluZy4gKi8KKwl1Y2hhciB0eF9xdWV1ZTsJCQkJLyogTnVtYmVyIG9mIHBhY2tldCBvbiB0aGUgVHggcXVldWUuICovCisJdXNob3J0IHR4X3F1ZXVlX2xlbjsJCS8qIEN1cnJlbnQgbGVuZ3RoIG9mIHRoZSBUeCBxdWV1ZS4gKi8KKwlzcGlubG9ja190IGxvY2s7Cit9OworCisKKy8qIE9mZnNldHMgZnJvbSB0aGUgYmFzZSBhZGRyZXNzLiAqLworI2RlZmluZSBTVEFUVVMJCQkwCisjZGVmaW5lIFRYX1NUQVRVUwkJMAorI2RlZmluZSBSWF9TVEFUVVMJCTEKKyNkZWZpbmUgVFhfSU5UUgkJCTIJCS8qIEJpdC1tYXBwZWQgaW50ZXJydXB0IGVuYWJsZSByZWdpc3RlcnMuICovCisjZGVmaW5lIFJYX0lOVFIJCQkzCisjZGVmaW5lIFRYX01PREUJCQk0CisjZGVmaW5lIFJYX01PREUJCQk1CisjZGVmaW5lIENPTkZJR18wCQk2CQkvKiBNaXNjLiBjb25maWd1cmF0aW9uIHNldHRpbmdzLiAqLworI2RlZmluZSBDT05GSUdfMQkJNworLyogUnVuLXRpbWUgcmVnaXN0ZXIgYmFuayAyIGRlZmluaXRpb25zLiAqLworI2RlZmluZSBEQVRBUE9SVAkJOAkJLyogV29yZC13aWRlIERNQSBvciBwcm9ncmFtbWVkLUkvTyBkYXRhcG9ydC4gKi8KKyNkZWZpbmUgVFhfU1RBUlQJCTEwCisjZGVmaW5lIENPTDE2Q05UTAkJMTEJCS8qIENvbnRyb2xsIFJlZyBmb3IgMTYgY29sbGlzaW9ucyAqLworI2RlZmluZSBNT0RFMTMJCQkxMworLyogRnVqaXRzdSBGTVYtMTh4IENhcmQgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZQlGSl9TVEFUVVMwCQkweDEwCisjZGVmaW5lCUZKX1NUQVRVUzEJCTB4MTEKKyNkZWZpbmUJRkpfQ09ORklHMAkJMHgxMgorI2RlZmluZQlGSl9DT05GSUcxCQkweDEzCisjZGVmaW5lCUZKX01BQ0FERFIJCTB4MTQJLyogMHgxNCAtIDB4MTkgKi8KKyNkZWZpbmUJRkpfQlVGQ05UTAkJMHgxQQorI2RlZmluZQlGSl9CVUZEQVRBCQkweDFDCisjZGVmaW5lIEZNVjE4WF9JT19FWFRFTlQJMzIKKworLyogSW5kZXggdG8gZnVuY3Rpb25zLCBhcyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLworCitzdGF0aWMgaW50IGZtdjE4eF9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgaW9hZGRyKTsKK3N0YXRpYyBpbnQgbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG5ldF9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBuZXRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgbmV0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbmV0X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG5ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworDAorLyogQ2hlY2sgZm9yIGEgbmV0d29yayBhZGFwdG9yIG9mIHRoaXMgdHlwZSwgYW5kIHJldHVybiAnMCcgaWZmIG9uZSBleGlzdHMuCisgICBJZiBkZXYtPmJhc2VfYWRkciA9PSAwLCBwcm9iZSBhbGwgbGlrZWx5IGxvY2F0aW9ucy4KKyAgIElmIGRldi0+YmFzZV9hZGRyID09IDEsIGFsd2F5cyByZXR1cm4gZmFpbHVyZS4KKyAgIElmIGRldi0+YmFzZV9hZGRyID09IDIsIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgZGV2aWNlIGFuZCByZXR1cm4gc3VjY2VzcworICAgKGRldGFjaGFibGUgZGV2aWNlcyBvbmx5KS4KKyAgICovCisKK3N0YXRpYyBpbnQgaW8gPSAweDIyMDsKK3N0YXRpYyBpbnQgaXJxOworCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBmbXYxOHhfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisJdW5zaWduZWQgKnBvcnQ7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwkJaW8gPSBkZXYtPmJhc2VfYWRkcjsKKwkJaXJxID0gZGV2LT5pcnE7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaWYgKGlvID4gMHgxZmYpIHsJLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLworCQllcnIgPSBmbXYxOHhfcHJvYmUxKGRldiwgaW8pOworCX0gZWxzZSBpZiAoaW8gIT0gMCkgewkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCWVyciA9IC1FTlhJTzsKKwl9IGVsc2UgeworCQlmb3IgKHBvcnQgPSBmbXYxOHhfcHJvYmVfbGlzdDsgKnBvcnQ7IHBvcnQrKykKKwkJCWlmIChmbXYxOHhfcHJvYmUxKGRldiwgKnBvcnQpID09IDApCisJCQkJYnJlYWs7CisJCWlmICghKnBvcnQpCisJCQllcnIgPSAtRU5PREVWOworCX0KKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEZNVjE4WF9JT19FWFRFTlQpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyogVGhlIEZ1aml0c3UgZGF0YXNoZWV0IHN1Z2dlc3RzIHRoYXQgdGhlIE5JQyBiZSBwcm9iZWQgZm9yIGJ5IGNoZWNraW5nIGl0cworICAgInNpZ25hdHVyZSIsIHRoZSBkZWZhdWx0IGJpdCBwYXR0ZXJuIGFmdGVyIGEgcmVzZXQuICBUaGlzICpkb2Vzbid0KiB3b3JrIC0tCisgICB0aGVyZSBpcyBubyB3YXkgdG8gcmVzZXQgdGhlIGJ1cyBpbnRlcmZhY2Ugd2l0aG91dCBhIGNvbXBsZXRlIHBvd2VyLWN5Y2xlIQorCisgICBJdCB0dXJucyBvdXQgdGhhdCBBVEkgY2FtZSB0byB0aGUgc2FtZSBjb25jbHVzaW9uIEkgZGlkOiB0aGUgb25seSB0aGluZworICAgdGhhdCBjYW4gYmUgZG9uZSBpcyBjaGVja2luZyBhIGZldyBiaXRzIGFuZCB0aGVuIGRpdmluZyByaWdodCBpbnRvIE1BQworICAgYWRkcmVzcyBjaGVjay4gKi8KKworc3RhdGljIGludCBfX2luaXQgZm12MTh4X3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBpb2FkZHIpCit7CisJY2hhciBpcnFtYXBbNF0gPSB7MywgNywgMTAsIDE1fTsKKwljaGFyIGlycW1hcF9wbnBbOF0gPSB7MywgNCwgNSwgNywgOSwgMTAsIDExLCAxNX07CisJdW5zaWduZWQgaW50IGksIHJldHZhbDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscDsKKworCS8qIFJlc2V0dGluZyB0aGUgY2hpcCBkb2Vzbid0IHJlc2V0IHRoZSBJU0EgaW50ZXJmYWNlLCBzbyBkb24ndCBib3RoZXIuCisJICAgVGhhdCBtZWFucyB3ZSBoYXZlIHRvIGJlIGNhcmVmdWwgd2l0aCB0aGUgcmVnaXN0ZXIgdmFsdWVzIHdlIHByb2JlIGZvci4KKwkgICAqLworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIEZNVjE4WF9JT19FWFRFTlQsIERSVl9OQU1FKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWRldi0+aXJxID0gaXJxOworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCisJLyogQ2hlY2sgSS9PIGFkZHJlc3MgY29uZmlndXJhdGlvbiBhbmQgRnVqaXRzdSB2ZW5kb3IgY29kZSAqLworCWlmIChpbmIoaW9hZGRyK0ZKX01BQ0FERFIgICkgIT0gMHgwMAorCXx8ICBpbmIoaW9hZGRyK0ZKX01BQ0FERFIrMSkgIT0gMHgwMAorCXx8ICBpbmIoaW9hZGRyK0ZKX01BQ0FERFIrMikgIT0gMHgwZSkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBDaGVjayBQblAgbW9kZSBmb3IgRk1WLTE4My8xODQvMTgzQS8xODRBLiAqLworCS8qIFRoaXMgUG5QIHJvdXRpbmUgaXMgdmVyeSBwb29yLiBJTyBhbmQgSVJRIHNob3VsZCBiZSBrbm93bi4gKi8KKwlpZiAoaW5iKGlvYWRkciArIEZKX1NUQVRVUzEpICYgMHgyMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlpZiAoZGV2LT5pcnEgPT0gaXJxbWFwX3BucFtpXSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA9PSA4KSB7CisJCQlyZXR2YWwgPSAtRU5PREVWOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZm12MTh4X3Byb2JlX2xpc3RbaW5iKGlvYWRkciArIEZKX0NPTkZJRzApICYgMHgwN10gIT0gaW9hZGRyKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWRldi0+aXJxID0gaXJxbWFwWyhpbmIoaW9hZGRyICsgRkpfQ09ORklHMCk+PjYpICYgMHgwM107CisJfQorCisJLyogU25hcmYgdGhlIGludGVycnVwdCB2ZWN0b3Igbm93LiAqLworCXJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmbmV0X2ludGVycnVwdCwgMCwgRFJWX05BTUUsIGRldik7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsgKCJGTVYtMTh4IGZvdW5kIGF0ICUjM3gsIGJ1dCBpdCdzIHVudXNhYmxlIGR1ZSB0byBhIGNvbmZsaWN0IG9uIgorCQkJCSJJUlEgJWQuXG4iLCBpb2FkZHIsIGRldi0+aXJxKTsKKwkJZ290byBvdXQ7CisJfQorCisJcHJpbnRrKCIlczogRk1WLTE4eCBmb3VuZCBhdCAlIzN4LCBJUlEgJWQsIGFkZHJlc3MgIiwgZGV2LT5uYW1lLAorCQkgICBpb2FkZHIsIGRldi0+aXJxKTsKKworCWZvcihpID0gMDsgaSA8IDY7IGkrKykgeworCQl1bnNpZ25lZCBjaGFyIHZhbCA9IGluYihpb2FkZHIgKyBGSl9NQUNBRERSICsgaSk7CisJCXByaW50aygiJTAyeCIsIHZhbCk7CisJCWRldi0+ZGV2X2FkZHJbaV0gPSB2YWw7CisJfQorCisJLyogIkZKX1NUQVRVUzAiIDEyIGJpdCAweDA0MDAgbWVhbnMgdXNlIHJlZ3VsYXIgMTAwIG9obSAxMGJhc2VUIHNpZ25hbHMsCisJICAgcmF0aGVyIHRoYW4gMTUwIG9obSBzaGllbGRlZCB0d2lzdGVkIHBhaXIgY29tcGVuc2F0aW9uLgorCSAgIDB4MDAwMCA9PSBhdXRvLXNlbnNlIHRoZSBpbnRlcmZhY2UKKwkgICAweDA4MDAgPT0gdXNlIFRQIGludGVyZmFjZQorCSAgIDB4MTgwMCA9PSB1c2UgY29heCBpbnRlcmZhY2UKKwkgICAqLworCXsKKwkJY29uc3QgY2hhciAqcG9ydHR5cGVbXSA9IHsiYXV0by1zZW5zZSIsICIxMGJhc2VUIiwgImF1dG8tc2Vuc2UiLCAiMTBiYXNlMi81In07CisJCXVzaG9ydCBzZXR1cF92YWx1ZSA9IGluYihpb2FkZHIgKyBGSl9TVEFUVVMwKTsKKworCQlzd2l0Y2goIHNldHVwX3ZhbHVlICYgMHgwNyApeworCQljYXNlIDB4MDEgLyogMTBiYXNlNSAqLzoKKwkJY2FzZSAweDAyIC8qIDEwYmFzZTIgKi86IGRldi0+aWZfcG9ydCA9IDB4MTg7IGJyZWFrOworCQljYXNlIDB4MDQgLyogMTBiYXNlVCAqLzogZGV2LT5pZl9wb3J0ID0gMHgwODsgYnJlYWs7CisJCWRlZmF1bHQgLyogYXV0by1zZW5zZSovOiBkZXYtPmlmX3BvcnQgPSAweDAwOyBicmVhazsKKwkJfQorCQlwcmludGsoIiAlcyBpbnRlcmZhY2UuXG4iLCBwb3J0dHlwZVsoZGV2LT5pZl9wb3J0Pj4zKSAmIDNdKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIExBTiBDb250cm9sbGVyIGFuZCBMQU4gQ2FyZCAqLworCW91dGIoMHhkYSwgaW9hZGRyICsgQ09ORklHXzApOwkgLyogSW5pdGlhbGl6ZSBMQU4gQ29udHJvbGxlciAqLworCW91dGIoMHgwMCwgaW9hZGRyICsgQ09ORklHXzEpOwkgLyogU3RhbmQgYnkgbW9kZSAqLworCW91dGIoMHgwMCwgaW9hZGRyICsgRkpfQ09ORklHMSk7IC8qIERpc2FibGUgSVJRIG9mIExBTiBDYXJkICovCisJb3V0YigweDAwLCBpb2FkZHIgKyBGSl9CVUZDTlRMKTsgLyogUmVzZXQgPyBJJ20gbm90IHN1cmUgKFRBTUlZQSkgKi8KKworCS8qIHdhaXQgZm9yIGEgd2hpbGUgKi8KKwl1ZGVsYXkoMjAwKTsKKworCS8qIFNldCB0aGUgc3RhdGlvbiBhZGRyZXNzIGluIGJhbmsgemVyby4gKi8KKwlvdXRiKDB4MDAsIGlvYWRkciArIENPTkZJR18xKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlvdXRiKGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIDggKyBpKTsKKworCS8qIFN3aXRjaCB0byBiYW5rIDEgYW5kIHNldCB0aGUgbXVsdGljYXN0IHRhYmxlIHRvIGFjY2VwdCBub25lLiAqLworCW91dGIoMHgwNCwgaW9hZGRyICsgQ09ORklHXzEpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCW91dGIoMHgwMCwgaW9hZGRyICsgOCArIGkpOworCisJLyogU3dpdGNoIHRvIGJhbmsgMiBhbmQgbG9jayBvdXIgSS9PIGFkZHJlc3MuICovCisJb3V0YigweDA4LCBpb2FkZHIgKyBDT05GSUdfMSk7CisJb3V0YihkZXYtPmlmX3BvcnQsIGlvYWRkciArIE1PREUxMyk7CisJb3V0YigweDAwLCBpb2FkZHIgKyBDT0wxNkNOVEwpOworCisJaWYgKG5ldF9kZWJ1ZykKKwkJcHJpbnRrKHZlcnNpb24pOworCisJLyogSW5pdGlhbGl6ZSB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPnByaXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPnByaXYpIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBvdXRfaXJxOworCX0KKwltZW1zZXQoZGV2LT5wcml2LCAwLCBzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCWxwID0gZGV2LT5wcml2OworCXNwaW5fbG9ja19pbml0KCZscC0+bG9jayk7CisKKwlkZXYtPm9wZW4JCT0gbmV0X29wZW47CisJZGV2LT5zdG9wCQk9IG5ldF9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IG5ldF9zZW5kX3BhY2tldDsKKwlkZXYtPnR4X3RpbWVvdXQJCT0gbmV0X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwk9IEhaLzEwOworCWRldi0+Z2V0X3N0YXRzCQk9IG5ldF9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfbXVsdGljYXN0X2xpc3Q7CisJcmV0dXJuIDA7CisKK291dF9pcnE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CitvdXQ6CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBGTVYxOFhfSU9fRVhURU5UKTsKKwlyZXR1cm4gcmV0dmFsOworfQorDAorCitzdGF0aWMgaW50IG5ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJLyogU2V0IHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIDAgdG8gMzJLIDEwMG5zLiBieXRlLXdpZGUgbWVtb3J5LAorCSAgIDE2IGJpdCBidXMgYWNjZXNzLCBhbmQgdHdvIDRLIFR4LCBlbmFibGUgdGhlIFJ4IGFuZCBUeC4gKi8KKwlvdXRiKDB4NWEsIGlvYWRkciArIENPTkZJR18wKTsKKworCS8qIFBvd2VydXAgYW5kIHN3aXRjaCB0byByZWdpc3RlciBiYW5rIDIgZm9yIHRoZSBydW4tdGltZSByZWdpc3RlcnMuICovCisJb3V0YigweGU4LCBpb2FkZHIgKyBDT05GSUdfMSk7CisKKwlscC0+dHhfc3RhcnRlZCA9IDA7CisJbHAtPnR4X3F1ZXVlX3JlYWR5ID0gMTsKKwlscC0+cnhfc3RhcnRlZCA9IDA7CisJbHAtPnR4X3F1ZXVlID0gMDsKKwlscC0+dHhfcXVldWVfbGVuID0gMDsKKworCS8qIENsZWFyIFR4IGFuZCBSeCBTdGF0dXMgKi8KKwlvdXRiKDB4ZmYsIGlvYWRkciArIFRYX1NUQVRVUyk7CisJb3V0YigweGZmLCBpb2FkZHIgKyBSWF9TVEFUVVMpOworCWxwLT5vcGVuX3RpbWUgPSBqaWZmaWVzOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkKKwkvKiBFbmFibGUgdGhlIElSUSBvZiB0aGUgTEFOIENhcmQgKi8KKwlvdXRiKDB4ODAsIGlvYWRkciArIEZKX0NPTkZJRzEpOworCisJLyogRW5hYmxlIGJvdGggVHggYW5kIFJ4IGludGVycnVwdHMgKi8KKwlvdXR3KDB4ODE4MiwgaW9hZGRyK1RYX0lOVFIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5ldF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCB3aXRoIHN0YXR1cyAlMDR4LCAlcz9cbiIsIGRldi0+bmFtZSwKKwkJICAgaHRvbnMoaW53KGlvYWRkciArIFRYX1NUQVRVUykpLAorCQkgICBpbmIoaW9hZGRyICsgVFhfU1RBVFVTKSAmIDB4ODAKKwkJICAgPyAiSVJRIGNvbmZsaWN0IiA6ICJuZXR3b3JrIGNhYmxlIHByb2JsZW0iKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdGltZW91dCByZWdpc3RlcnM6ICUwNHggJTA0eCAlMDR4ICUwNHggJTA0eCAlMDR4ICUwNHggJTA0eC5cbiIsCisJCSAgIGRldi0+bmFtZSwgaHRvbnMoaW53KGlvYWRkciArIDApKSwKKwkJICAgaHRvbnMoaW53KGlvYWRkciArIDIpKSwgaHRvbnMoaW53KGlvYWRkciArIDQpKSwKKwkJICAgaHRvbnMoaW53KGlvYWRkciArIDYpKSwgaHRvbnMoaW53KGlvYWRkciArIDgpKSwKKwkJICAgaHRvbnMoaW53KGlvYWRkciArMTApKSwgaHRvbnMoaW53KGlvYWRkciArMTIpKSwKKwkJICAgaHRvbnMoaW53KGlvYWRkciArMTQpKSk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiZXRoIGNhcmQ6ICUwNHggJTA0eFxuIiwKKwkJaHRvbnMoaW53KGlvYWRkcitGSl9TVEFUVVMwKSksCisJCWh0b25zKGludyhpb2FkZHIrRkpfQ09ORklHMCkpKTsKKwlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJLyogVG9EbzogV2Ugc2hvdWxkIHRyeSB0byByZXN0YXJ0IHRoZSBhZGFwdG9yLi4uICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBJbml0aWFsaXplIExBTiBDb250cm9sbGVyIGFuZCBMQU4gQ2FyZCAqLworCW91dGIoMHhkYSwgaW9hZGRyICsgQ09ORklHXzApOyAgIC8qIEluaXRpYWxpemUgTEFOIENvbnRyb2xsZXIgKi8KKwlvdXRiKDB4MDAsIGlvYWRkciArIENPTkZJR18xKTsgICAvKiBTdGFuZCBieSBtb2RlICovCisJb3V0YigweDAwLCBpb2FkZHIgKyBGSl9DT05GSUcxKTsgLyogRGlzYWJsZSBJUlEgb2YgTEFOIENhcmQgKi8KKwlvdXRiKDB4MDAsIGlvYWRkciArIEZKX0JVRkNOVEwpOyAvKiBSZXNldCA/IEknbSBub3Qgc3VyZSAqLworCW5ldF9vcGVuKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBuZXRfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc2hvcnQgbGVuZ3RoID0gc2tiLT5sZW47CisJdW5zaWduZWQgY2hhciAqYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBCbG9jayBhIHRyYW5zbWl0IGZyb20gb3ZlcmxhcHBpbmcuICAqLworCQorCWlmIChsZW5ndGggPiBFVEhfRlJBTUVfTEVOKSB7CisJCWlmIChuZXRfZGVidWcpCisJCQlwcmludGsoIiVzOiBBdHRlbXB0aW5nIHRvIHNlbmQgYSBsYXJnZSBwYWNrZXQgKCVkIGJ5dGVzKS5cbiIsCisJCQkJZGV2LT5uYW1lLCBsZW5ndGgpOworCQlyZXR1cm4gMTsKKwl9CisJCisJaWYgKGxlbmd0aCA8IEVUSF9aTEVOKSB7CisJCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCWxlbmd0aCA9IEVUSF9aTEVOOworCX0KKwlidWYgPSBza2ItPmRhdGE7CisJCisJaWYgKG5ldF9kZWJ1ZyA+IDQpCisJCXByaW50aygiJXM6IFRyYW5zbWl0dGluZyBhIHBhY2tldCBvZiBsZW5ndGggJWx1LlxuIiwgZGV2LT5uYW1lLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpc2tiLT5sZW4pOworCS8qIFdlIG1heSBub3Qgc3RhcnQgdHJhbnNtaXR0aW5nIHVubGVzcyB3ZSBmaW5pc2ggdHJhbnNmZXJyaW5nCisJICAgYSBwYWNrZXQgaW50byB0aGUgVHggcXVldWUuIER1cmluZyBleGVjdXRpbmcgdGhlIGZvbGxvd2luZworCSAgIGNvZGVzIHdlIHBvc3NpYmx5IGNhdGNoIGEgVHggaW50ZXJydXB0LiBUaHVzIHdlIGZsYWcgb2ZmCisJICAgdHhfcXVldWVfcmVhZHksIHNvIHRoYXQgd2UgcHJldmVudCB0aGUgaW50ZXJydXB0IHJvdXRpbmUKKwkgICAobmV0X2ludGVycnVwdCkgdG8gc3RhcnQgdHJhbnNtaXR0aW5nLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCWxwLT50eF9xdWV1ZV9yZWFkeSA9IDA7CisJeworCQlvdXR3KGxlbmd0aCwgaW9hZGRyICsgREFUQVBPUlQpOworCQlvdXRzdyhpb2FkZHIgKyBEQVRBUE9SVCwgYnVmLCAobGVuZ3RoICsgMSkgPj4gMSk7CisJCWxwLT50eF9xdWV1ZSsrOworCQlscC0+dHhfcXVldWVfbGVuICs9IGxlbmd0aCArIDI7CisJfQorCWxwLT50eF9xdWV1ZV9yZWFkeSA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCWlmIChscC0+dHhfc3RhcnRlZCA9PSAwKSB7CisJCS8qIElmIHRoZSBUeCBpcyBpZGxlLCBhbHdheXMgdHJpZ2dlciBhIHRyYW5zbWl0LiAqLworCQlvdXRiKDB4ODAgfCBscC0+dHhfcXVldWUsIGlvYWRkciArIFRYX1NUQVJUKTsKKwkJbHAtPnR4X3F1ZXVlID0gMDsKKwkJbHAtPnR4X3F1ZXVlX2xlbiA9IDA7CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlscC0+dHhfc3RhcnRlZCA9IDE7CisJfSBlbHNlIGlmIChscC0+dHhfcXVldWVfbGVuID49IDQwOTYgLSAxNTAyKSAvKiBObyByb29tIGZvciBhIHBhY2tldCAqLworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisMCisvKiBUaGUgdHlwaWNhbCB3b3JrbG9hZCBvZiB0aGUgZHJpdmVyOgorICAgSGFuZGxlIHRoZSBuZXR3b3JrIGludGVyZmFjZSBpbnRlcnJ1cHRzLiAqLworc3RhdGljIGlycXJldHVybl90CituZXRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscDsKKwlpbnQgaW9hZGRyLCBzdGF0dXM7CisKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlscCA9IGRldi0+cHJpdjsKKwlzdGF0dXMgPSBpbncoaW9hZGRyICsgVFhfU1RBVFVTKTsKKwlvdXR3KHN0YXR1cywgaW9hZGRyICsgVFhfU1RBVFVTKTsKKworCWlmIChuZXRfZGVidWcgPiA0KQorCQlwcmludGsoIiVzOiBJbnRlcnJ1cHQgd2l0aCBzdGF0dXMgJTA0eC5cbiIsIGRldi0+bmFtZSwgc3RhdHVzKTsKKwlpZiAobHAtPnJ4X3N0YXJ0ZWQgPT0gMCAmJgorCQkoc3RhdHVzICYgMHhmZjAwIHx8IChpbmIoaW9hZGRyICsgUlhfTU9ERSkgJiAweDQwKSA9PSAwKSkgeworCQkvKiBHb3QgYSBwYWNrZXQocykuCisJCSAgIFdlIGNhbm5vdCBleGVjdXRlIG5ldF9yeCBtb3JlIHRoYW4gb25jZSBhdCB0aGUgc2FtZSB0aW1lIGZvcgorCQkgICB0aGUgc2FtZSBkZXZpY2UuIER1cmluZyBleGVjdXRpbmcgbmV0X3J4LCB3ZSBwb3NzaWJseSBjYXRjaCBhCisJCSAgIFR4IGludGVycnVwdC4gVGh1cyB3ZSBmbGFnIG9uIHJ4X3N0YXJ0ZWQsIHNvIHRoYXQgd2UgcHJldmVudAorCQkgICB0aGUgaW50ZXJydXB0IHJvdXRpbmUgKG5ldF9pbnRlcnJ1cHQpIHRvIGRpdmUgaW50byBuZXRfcngKKwkJICAgYWdhaW4uICovCisJCWxwLT5yeF9zdGFydGVkID0gMTsKKwkJb3V0YigweDAwLCBpb2FkZHIgKyBSWF9JTlRSKTsJLyogRGlzYWJsZSBSWCBpbnRyLiAqLworCQluZXRfcngoZGV2KTsKKwkJb3V0YigweDgxLCBpb2FkZHIgKyBSWF9JTlRSKTsJLyogRW5hYmxlICBSWCBpbnRyLiAqLworCQlscC0+cnhfc3RhcnRlZCA9IDA7CisJfQorCWlmIChzdGF0dXMgJiAweDAwZmYpIHsKKwkJaWYgKHN0YXR1cyAmIDB4MDIpIHsKKwkJCS8qIE1vcmUgdGhhbiAxNiBjb2xsaXNpb25zIG9jY3VycmVkICovCisJCQlpZiAobmV0X2RlYnVnID4gNCkKKwkJCQlwcmludGsoIiVzOiAxNiBDb2xsaXNpb24gb2NjdXIgZHVyaW5nIFR4aW5nLlxuIiwgZGV2LT5uYW1lKTsKKwkJCS8qIENhbmNlbCBzZW5kaW5nIGEgcGFja2V0LiAqLworCQkJb3V0YigweDAzLCBpb2FkZHIgKyBDT0wxNkNOVEwpOworCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJfQorCQlpZiAoc3RhdHVzICYgMHg4MikgeworCQkJc3Bpbl9sb2NrKCZscC0+bG9jayk7CisJCQlscC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJaWYgKGxwLT50eF9xdWV1ZSAmJiBscC0+dHhfcXVldWVfcmVhZHkpIHsKKwkJCQlvdXRiKDB4ODAgfCBscC0+dHhfcXVldWUsIGlvYWRkciArIFRYX1NUQVJUKTsKKwkJCQlscC0+dHhfcXVldWUgPSAwOworCQkJCWxwLT50eF9xdWV1ZV9sZW4gPSAwOworCQkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsJLyogSW5mb3JtIHVwcGVyIGxheWVycy4gKi8KKwkJCX0gZWxzZSB7CisJCQkJbHAtPnR4X3N0YXJ0ZWQgPSAwOworCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsJLyogSW5mb3JtIHVwcGVyIGxheWVycy4gKi8KKwkJCX0KKwkJCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisJCX0KKwl9CisJcmV0dXJuIElSUV9SRVRWQUwoc3RhdHVzKTsKK30KKworLyogV2UgaGF2ZSBhIGdvb2QgcGFja2V0KHMpLCBnZXQgaXQvdGhlbSBvdXQgb2YgdGhlIGJ1ZmZlcnMuICovCitzdGF0aWMgdm9pZCBuZXRfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGJvZ3VzY291bnQgPSA1OworCisJd2hpbGUgKChpbmIoaW9hZGRyICsgUlhfTU9ERSkgJiAweDQwKSA9PSAwKSB7CisJCS8qIENsZWFyIFBLVF9SRFkgYml0OiBieSBhZ3kgMTk5NDA5MjIgKi8KKwkJLyogb3V0YigweDgwLCBpb2FkZHIgKyBSWF9TVEFUVVMpOyAqLworCQl1c2hvcnQgc3RhdHVzID0gaW53KGlvYWRkciArIERBVEFQT1JUKTsKKworCQlpZiAobmV0X2RlYnVnID4gNCkKKwkJCXByaW50aygiJXM6IFJ4aW5nIHBhY2tldCBtb2RlICUwMnggc3RhdHVzICUwNHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgaW5iKGlvYWRkciArIFJYX01PREUpLCBzdGF0dXMpOworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCWlmIChzdGF0dXMgPT0gMCkgeworCQkJb3V0YigweDA1LCBpb2FkZHIgKyAxNCk7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisKKwkJaWYgKChzdGF0dXMgJiAweEYwKSAhPSAweDIwKSB7CS8qIFRoZXJlIHdhcyBhbiBlcnJvci4gKi8KKwkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiAweDA4KSBscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIDB4MDQpIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiAweDAyKSBscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIDB4MDEpIGxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJdXNob3J0IHBrdF9sZW4gPSBpbncoaW9hZGRyICsgREFUQVBPUlQpOworCQkJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuICovCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlpZiAocGt0X2xlbiA+IDE1NTApIHsKKwkJCQlwcmludGsoIiVzOiBUaGUgRk1WLTE4eCBjbGFpbWVkIGEgdmVyeSBsYXJnZSBwYWNrZXQsIHNpemUgJWQuXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHBrdF9sZW4pOworCQkJCW91dGIoMHgwNSwgaW9hZGRyICsgMTQpOworCQkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiszKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCXByaW50aygiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQgKGxlbiAlZCkuXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHBrdF9sZW4pOworCQkJCW91dGIoMHgwNSwgaW9hZGRyICsgMTQpOworCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlza2ItPmRldiA9IGRldjsKKwkJCXNrYl9yZXNlcnZlKHNrYiwyKTsKKworCQkJaW5zdyhpb2FkZHIgKyBEQVRBUE9SVCwgc2tiX3B1dChza2IscGt0X2xlbiksIChwa3RfbGVuICsgMSkgPj4gMSk7CisKKwkJCWlmIChuZXRfZGVidWcgPiA1KSB7CisJCQkJaW50IGk7CisJCQkJcHJpbnRrKCIlczogUnhlZCBwYWNrZXQgb2YgbGVuZ3RoICVkOiAiLCBkZXYtPm5hbWUsIHBrdF9sZW4pOworCQkJCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKQorCQkJCQlwcmludGsoIiAlMDJ4Iiwgc2tiLT5kYXRhW2ldKTsKKwkJCQlwcmludGsoIi5cbiIpOworCQkJfQorCisJCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQl9CisJCWlmICgtLWJvZ3VzY291bnQgPD0gMCkKKwkJCWJyZWFrOworCX0KKworCS8qIElmIGFueSB3b3J0aC13aGlsZSBwYWNrZXRzIGhhdmUgYmVlbiByZWNlaXZlZCwgZGV2X3JpbnQoKQorCSAgIGhhcyBkb25lIGEgbWFya19iaChORVRfQkgpIGZvciB1cyBhbmQgd2lsbCB3b3JrIG9uIHRoZW0KKwkgICB3aGVuIHdlIGdldCB0byB0aGUgYm90dG9tLWhhbGYgcm91dGluZS4gKi8KKwl7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworCQkJaWYgKChpbmIoaW9hZGRyICsgUlhfTU9ERSkgJiAweDQwKSA9PSAweDQwKQorCQkJCWJyZWFrOworCQkJKHZvaWQpaW53KGlvYWRkciArIERBVEFQT1JUKTsJCQkJLyogZHVtbXkgc3RhdHVzIHJlYWQgKi8KKwkJCW91dGIoMHgwNSwgaW9hZGRyICsgMTQpOworCQl9CisKKwkJaWYgKG5ldF9kZWJ1ZyA+IDUgJiYgaSA+IDApCisJCQlwcmludGsoIiVzOiBFeGludCBSeCBwYWNrZXQgd2l0aCBtb2RlICUwMnggYWZ0ZXIgJWQgdGlja3MuXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgaW5iKGlvYWRkciArIFJYX01PREUpLCBpKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gbmV0X29wZW4oKS4gKi8KK3N0YXRpYyBpbnQgbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJKChzdHJ1Y3QgbmV0X2xvY2FsICopZGV2LT5wcml2KS0+b3Blbl90aW1lID0gMDsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwkvKiBTZXQgY29uZmlndXJhdGlvbiByZWdpc3RlciAwIHRvIGRpc2FibGUgVHggYW5kIFJ4LiAqLworCW91dGIoMHhkYSwgaW9hZGRyICsgQ09ORklHXzApOworCisJLyogVXBkYXRlIHRoZSBzdGF0aXN0aWNzIC0tIFRvRG8uICovCisKKwkvKiBQb3dlci1kb3duIHRoZSBjaGlwLiAgR3JlZW4sIGdyZWVuLCBncmVlbiEgKi8KKwlvdXRiKDB4MDAsIGlvYWRkciArIENPTkZJR18xKTsKKworCS8qIFNldCB0aGUgZXRoZXJuZXQgYWRhcHRvciBkaXNhYmxlIElSUSAqLworCW91dGIoMHgwMCwgaW9hZGRyICsgRkpfQ09ORklHMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCVRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IKKyAgIGNsb3NlZC4gKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXJldHVybiAmbHAtPnN0YXRzOworfQorCisvKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAgIG51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisgICBudW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKKyAgIG51bV9hZGRycyA+IDAJTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLCBhbmQgZG8KKwkJCWJlc3QtZWZmb3J0IGZpbHRlcmluZy4KKyAqLworIAorc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaWYgKGRldi0+bWNfY291bnQgfHwgZGV2LT5mbGFncyYoSUZGX1BST01JU0N8SUZGX0FMTE1VTFRJKSkKKwl7CisJCS8qCisJCSAqCVdlIG11c3QgbWFrZSB0aGUga2VybmVsIHJlYWxpc2Ugd2UgaGFkIHRvIG1vdmUKKwkJICoJaW50byBwcm9taXNjIG1vZGUgb3Igd2Ugc3RhcnQgYWxsIG91dCB3YXIgb24KKwkJICoJdGhlIGNhYmxlLiAtIEFDCisJCSAqLworCQlkZXYtPmZsYWdzfD1JRkZfUFJPTUlTQzsKKworCQlvdXRiKDMsIGlvYWRkciArIFJYX01PREUpOwkvKiBFbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworCX0KKwllbHNlCisJCW91dGIoMiwgaW9hZGRyICsgUlhfTU9ERSk7CS8qIERpc2FibGUgcHJvbWlzY3VvdXMsIHVzZSBub3JtYWwgbW9kZSAqLworfQorCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9mbXYxOHg7CisKK01PRFVMRV9QQVJNKGlvLCAiaSIpOworTU9EVUxFX1BBUk0oaXJxLCAiaSIpOworTU9EVUxFX1BBUk0obmV0X2RlYnVnLCAiaSIpOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkZNVi0xOFggSS9PIGFkZHJlc3MiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiRk1WLTE4WCBJUlEgbnVtYmVyIik7CitNT0RVTEVfUEFSTV9ERVNDKG5ldF9kZWJ1ZywgIkZNVi0xOFggZGVidWcgbGV2ZWwgKDAtMSw1LTYpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWlmIChpbyA9PSAwKQorCQlwcmludGsoImZtdjE4eDogWW91IHNob3VsZCBub3QgdXNlIGF1dG8tcHJvYmluZyB3aXRoIGluc21vZCFcbiIpOworCWRldl9mbXYxOHggPSBmbXYxOHhfcHJvYmUoLTEpOworCWlmIChJU19FUlIoZGV2X2ZtdjE4eCkpCisJCXJldHVybiBQVFJfRVJSKGRldl9mbXYxOHgpOworCXJldHVybiAwOworfQorCit2b2lkCitjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldl9mbXYxOHgpOworCWZyZWVfaXJxKGRldl9mbXYxOHgtPmlycSwgZGV2X2ZtdjE4eCk7CisJcmVsZWFzZV9yZWdpb24oZGV2X2ZtdjE4eC0+YmFzZV9hZGRyLCBGTVYxOFhfSU9fRVhURU5UKTsKKwlmcmVlX25ldGRldihkZXZfZm12MTh4KTsKK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1EX19LRVJORUxfXyAtSS91c3Ivc3JjL2xpbnV4L25ldC9pbmV0IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1tNDg2IC1jIGZtdjE4eC5jIgorICogIHZlcnNpb24tY29udHJvbDogdAorICogIGtlcHQtbmV3LXZlcnNpb25zOiA1CisgKiAgdGFiLXdpZHRoOiA0CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDQKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGE0OGM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKQEAgLTAsMCArMSwyMjMyIEBACisvKgorICogZm9yY2VkZXRoOiBFdGhlcm5ldCBkcml2ZXIgZm9yIE5WSURJQSBuRm9yY2UgbWVkaWEgYWNjZXNzIGNvbnRyb2xsZXJzLgorICoKKyAqIE5vdGU6IFRoaXMgZHJpdmVyIGlzIGEgY2xlYW5yb29tIHJlaW1wbGVtZW50YXRpb24gYmFzZWQgb24gcmV2ZXJzZQorICogICAgICBlbmdpbmVlcmVkIGRvY3VtZW50YXRpb24gd3JpdHRlbiBieSBDYXJsLURhbmllbCBIYWlsZmluZ2VyCisgKiAgICAgIGFuZCBBbmRyZXcgZGUgUXVpbmNleS4gSXQncyBuZWl0aGVyIHN1cHBvcnRlZCBub3IgZW5kb3JzZWQKKyAqICAgICAgYnkgTlZJRElBIENvcnAuIFVzZSBhdCB5b3VyIG93biByaXNrLgorICoKKyAqIE5WSURJQSwgbkZvcmNlIGFuZCBvdGhlciBOVklESUEgbWFya3MgYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZAorICogdHJhZGVtYXJrcyBvZiBOVklESUEgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kIG90aGVyCisgKiBjb3VudHJpZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLDQgTWFuZnJlZCBTcHJhdWwKKyAqIENvcHlyaWdodCAoQykgMjAwNCBBbmRyZXcgZGUgUXVpbmNleSAod29sIHN1cHBvcnQpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgQ2FybC1EYW5pZWwgSGFpbGZpbmdlciAoaW52YWxpZCBNQUMgaGFuZGxpbmcsIGluc2FuZQorICoJCUlSUSByYXRlIGZpeGVzLCBiaWdlbmRpYW4gZml4ZXMsIGNsZWFudXBzLCB2ZXJpZmljYXRpb24pCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgTlZJRElBIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqIENoYW5nZWxvZzoKKyAqIAkwLjAxOiAwNSBPY3QgMjAwMzogRmlyc3QgcmVsZWFzZSB0aGF0IGNvbXBpbGVzIHdpdGhvdXQgd2FybmluZ3MuCisgKiAJMC4wMjogMDUgT2N0IDIwMDM6IEZpeCBidWcgZm9yIG52X2RyYWluX3R4OiBkbyBub3QgdHJ5IHRvIGZyZWUgTlVMTCBza2JzLgorICogCQkJICAgQ2hlY2sgYWxsIFBDSSBCQVJzIGZvciB0aGUgcmVnaXN0ZXIgd2luZG93LgorICogCQkJICAgdWRlbGF5IGFkZGVkIHRvIG1paV9ydy4KKyAqIAkwLjAzOiAwNiBPY3QgMjAwMzogSW5pdGlhbGl6ZSBkZXYtPmlycS4KKyAqIAkwLjA0OiAwNyBPY3QgMjAwMzogSW5pdGlhbGl6ZSBucC0+bG9jaywgcmVkdWNlIGhhbmRsZWQgaXJxcywgYWRkIHByaW50a3MuCisgKiAJMC4wNTogMDkgT2N0IDIwMDM6IHByaW50ayByZW1vdmVkIGFnYWluLCBpcnEgc3RhdHVzIHByaW50IHR4X3RpbWVvdXQuCisgKiAJMC4wNjogMTAgT2N0IDIwMDM6IE1BQyBBZGRyZXNzIHJlYWQgdXBkYXRlZCwgcGZmIGZsYWcgZ2VuZXJhdGlvbiB1cGRhdGVkLAorICogCQkJICAgaXJxIG1hc2sgdXBkYXRlZAorICogCTAuMDc6IDE0IE9jdCAyMDAzOiBGdXJ0aGVyIGlycSBtYXNrIHVwZGF0ZXMuCisgKiAJMC4wODogMjAgT2N0IDIwMDM6IHJ4X2Rlc2MuTGVuZ3RoIGluaXRpYWxpemF0aW9uIGFkZGVkLCBudl9hbGxvY19yeCByZWZpbGwKKyAqIAkJCSAgIGFkZGVkIGludG8gaXJxIGhhbmRsZXIsIE5VTEwgY2hlY2sgZm9yIGRyYWluX3JpbmcuCisgKiAJMC4wOTogMjAgT2N0IDIwMDM6IEJhc2ljIGxpbmsgc3BlZWQgaXJxIGltcGxlbWVudGF0aW9uLiBPbmx5IGhhbmRsZSB0aGUKKyAqIAkJCSAgIHJlcXVlc3RlZCBpbnRlcnJ1cHQgc291cmNlcy4KKyAqIAkwLjEwOiAyMCBPY3QgMjAwMzogRmlyc3QgY2xlYW51cCBmb3IgcmVsZWFzZS4KKyAqIAkwLjExOiAyMSBPY3QgMjAwMzogaGV4ZHVtcCBmb3IgdHggYWRkZWQsIHJ4IGJ1ZmZlciBzaXplcyBpbmNyZWFzZWQuCisgKiAJCQkgICBNQUMgQWRkcmVzcyBpbml0IGZpeCwgc2V0X211bHRpY2FzdCBjbGVhbnVwLgorICogCTAuMTI6IDIzIE9jdCAyMDAzOiBDbGVhbnVwcyBmb3IgcmVsZWFzZS4KKyAqIAkwLjEzOiAyNSBPY3QgMjAwMzogTGltaXQgZm9yIGNvbmN1cnJlbnQgdHggcGFja2V0cyBpbmNyZWFzZWQgdG8gMTAuCisgKiAJCQkgICBTZXQgbGluayBzcGVlZCBjb3JyZWN0bHkuIHN0YXJ0IHJ4IGJlZm9yZSBzdGFydGluZworICogCQkJICAgdHggKG52X3N0YXJ0X3J4IHNldHMgdGhlIGxpbmsgc3BlZWQpLgorICogCTAuMTQ6IDI1IE9jdCAyMDAzOiBOaWMgZGVwZW5kYW50IGlycSBtYXNrLgorICogCTAuMTU6IDA4IE5vdiAyMDAzOiBmaXggc21wIGRlYWRsb2NrIHdpdGggc2V0X211bHRpY2FzdF9saXN0IGR1cmluZworICogCQkJICAgb3Blbi4KKyAqIAkwLjE2OiAxNSBOb3YgMjAwMzogaW5jbHVkZSBmaWxlIGNsZWFudXAgZm9yIHBwYzY0LCByeCBidWZmZXIgc2l6ZQorICogCQkJICAgaW5jcmVhc2VkIHRvIDE2MjggYnl0ZXMuCisgKiAJMC4xNzogMTYgTm92IDIwMDM6IHVuZG8gcnggYnVmZmVyIHNpemUgaW5jcmVhc2UuIFN1YnN0cmFjdCAxIGZyb20KKyAqIAkJCSAgIHRoZSB0eCBsZW5ndGguCisgKiAJMC4xODogMTcgTm92IDIwMDM6IGZpeCBvb3BzIGR1ZSB0byBsYXRlIGluaXRpYWxpemF0aW9uIG9mIGRldl9zdGF0cworICogCTAuMTk6IDI5IE5vdiAyMDAzOiBIYW5kbGUgUnhOb0J1ZiwgZGV0ZWN0ICYgaGFuZGxlIGludmFsaWQgbWFjCisgKiAJCQkgICBhZGRyZXNzZXMsIHJlYWxseSBzdG9wIHJ4IGlmIGFscmVhZHkgcnVubmluZworICogCQkJICAgaW4gbnZfc3RhcnRfcngsIGNsZWFuIHVwIGEgYml0LgorICogCTAuMjA6IDA3IERlYyAyMDAzOiBhbGxvYyBmaXhlcworICogCTAuMjE6IDEyIEphbiAyMDA0OiBhZGRpdGlvbmFsIGFsbG9jIGZpeCwgbmljIHBvbGxpbmcgZml4LgorICoJMC4yMjogMTkgSmFuIDIwMDQ6IHJlcHJvZ3JhbSB0aW1lciB0byBhIHNhbmUgcmF0ZSwgYXZvaWQgbG9ja3VwCisgKgkJCSAgIG9uIGNsb3NlLgorICoJMC4yMzogMjYgSmFuIDIwMDQ6IHZhcmlvdXMgc21hbGwgY2xlYW51cHMKKyAqCTAuMjQ6IDI3IEZlYiAyMDA0OiBtYWtlIGRyaXZlciBldmVuIGxlc3MgYW5vbnltb3VzIGluIGJhY2t0cmFjZXMKKyAqCTAuMjU6IDA5IE1hciAyMDA0OiB3b2wgc3VwcG9ydAorICoJMC4yNjogMDMgSnVuIDIwMDQ6IG5ldGRyaXZlciBzcGVjaWZpYyBhbm5vdGF0aW9uLCBzcGFyc2UtcmVsYXRlZCBmaXhlcworICoJMC4yNzogMTkgSnVuIDIwMDQ6IEdpZ2FiaXQgc3VwcG9ydCwgbmV3IGRlc2NyaXB0b3IgcmluZ3MsCisgKgkJCSAgIGFkZGVkIENLODA0L01DUDA0IGRldmljZSBJRHMsIGNvZGUgZml4ZXMKKyAqCQkJICAgZm9yIHJlZ2lzdGVycywgbGluayBzdGF0dXMgYW5kIG90aGVyIG1pbm9yIGZpeGVzLgorICoJMC4yODogMjEgSnVuIDIwMDQ6IEJpZyBjbGVhbnVwLCBtYWtpbmcgZHJpdmVyIG1vc3RseSBlbmRpYW4gc2FmZQorICoJMC4yOTogMzEgQXVnIDIwMDQ6IEFkZCBiYWNrdXAgdGltZXIgZm9yIGxpbmsgY2hhbmdlIG5vdGlmaWNhdGlvbi4KKyAqCTAuMzA6IDI1IFNlcCAyMDA0OiByeCBjaGVja3N1bSBzdXBwb3J0IGZvciBuZiAyNTAgR2IuIEFkZCByeCByZXNldAorICoJCQkgICBpbnRvIG52X2Nsb3NlLCBvdGhlcndpc2UgcmVlbmFibGluZyBmb3Igd29sIGNhbgorICoJCQkgICBjYXVzZSBETUEgdG8ga2ZyZWUnZCBtZW1vcnkuCisgKgkwLjMxOiAxNCBOb3YgMjAwNDogZXRodG9vbCBzdXBwb3J0IGZvciBnZXR0aW5nL3NldHRpbmcgbGluaworICoJICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcy4KKyAqCisgKiBLbm93biBidWdzOgorICogV2Ugc3VzcGVjdCB0aGF0IG9uIHNvbWUgaGFyZHdhcmUgbm8gVFggZG9uZSBpbnRlcnJ1cHRzIGFyZSBnZW5lcmF0ZWQuCisgKiBUaGlzIG1lYW5zIHJlY292ZXJ5IGZyb20gbmV0aWZfc3RvcF9xdWV1ZSBvbmx5IGhhcHBlbnMgaWYgdGhlIGh3IHRpbWVyCisgKiBpbnRlcnJ1cHQgZmlyZXMgKDEwMCB0aW1lcy9zZWNvbmQsIGNvbmZpZ3VyYWJsZSB3aXRoIE5WUkVHX1BPTExfREVGQVVMVCkKKyAqIGFuZCB0aGUgdGltZXIgaXMgYWN0aXZlIGluIHRoZSBJUlFNYXNrLCBvciBpZiBhIHJ4IHBhY2tldCBhcnJpdmVzIGJ5IGNoYW5jZS4KKyAqIElmIHlvdXIgaGFyZHdhcmUgcmVsaWFibHkgZ2VuZXJhdGVzIHR4IGRvbmUgaW50ZXJydXB0cywgdGhlbiB5b3UgY2FuIHJlbW92ZQorICogREVWX05FRURfVElNRVJJUlEgZnJvbSB0aGUgZHJpdmVyX2RhdGEgZmxhZ3MuCisgKiBERVZfTkVFRF9USU1FUklSUSB3aWxsIG5vdCBoYXJtIHlvdSBvbiBzYW5lIGhhcmR3YXJlLCBvbmx5IGdlbmVyYXRpbmcgYSBmZXcKKyAqIHN1cGVyZmx1b3VzIHRpbWVyIGludGVycnVwdHMgZnJvbSB0aGUgbmljLgorICovCisjZGVmaW5lIEZPUkNFREVUSF9WRVJTSU9OCQkiMC4zMSIKKyNkZWZpbmUgRFJWX05BTUUJCQkiZm9yY2VkZXRoIgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpZiAwCisjZGVmaW5lIGRwcmludGsJCQlwcmludGsKKyNlbHNlCisjZGVmaW5lIGRwcmludGsoeC4uLikJCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisKKy8qCisgKiBIYXJkd2FyZSBhY2Nlc3M6CisgKi8KKworI2RlZmluZSBERVZfTkVFRF9MQVNUUEFDS0VUMQkweDAwMDEJLyogc2V0IExBU1RQQUNLRVQxIGluIHR4IGZsYWdzICovCisjZGVmaW5lIERFVl9JUlFNQVNLXzEJCTB4MDAwMiAgLyogdXNlIE5WUkVHX0lSUU1BU0tfV0FOVEVEXzEgZm9yIGlycSBtYXNrICovCisjZGVmaW5lIERFVl9JUlFNQVNLXzIJCTB4MDAwNCAgLyogdXNlIE5WUkVHX0lSUU1BU0tfV0FOVEVEXzIgZm9yIGlycSBtYXNrICovCisjZGVmaW5lIERFVl9ORUVEX1RJTUVSSVJRCTB4MDAwOCAgLyogc2V0IHRoZSB0aW1lciBpcnEgZmxhZyBpbiB0aGUgaXJxIG1hc2sgKi8KKyNkZWZpbmUgREVWX05FRURfTElOS1RJTUVSCTB4MDAxMAkvKiBwb2xsIGxpbmsgc2V0dGluZ3MuIFJlbGllcyBvbiB0aGUgdGltZXIgaXJxICovCisKK2VudW0geworCU52UmVnSXJxU3RhdHVzID0gMHgwMDAsCisjZGVmaW5lIE5WUkVHX0lSUVNUQVRfTUlJRVZFTlQJMHgwNDAKKyNkZWZpbmUgTlZSRUdfSVJRU1RBVF9NQVNLCQkweDFmZgorCU52UmVnSXJxTWFzayA9IDB4MDA0LAorI2RlZmluZSBOVlJFR19JUlFfUlhfRVJST1IJCTB4MDAwMQorI2RlZmluZSBOVlJFR19JUlFfUlgJCQkweDAwMDIKKyNkZWZpbmUgTlZSRUdfSVJRX1JYX05PQlVGCQkweDAwMDQKKyNkZWZpbmUgTlZSRUdfSVJRX1RYX0VSUgkJMHgwMDA4CisjZGVmaW5lIE5WUkVHX0lSUV9UWDIJCQkweDAwMTAKKyNkZWZpbmUgTlZSRUdfSVJRX1RJTUVSCQkJMHgwMDIwCisjZGVmaW5lIE5WUkVHX0lSUV9MSU5LCQkJMHgwMDQwCisjZGVmaW5lIE5WUkVHX0lSUV9UWDEJCQkweDAxMDAKKyNkZWZpbmUgTlZSRUdfSVJRTUFTS19XQU5URURfMQkJMHgwMDVmCisjZGVmaW5lIE5WUkVHX0lSUU1BU0tfV0FOVEVEXzIJCTB4MDE0NworI2RlZmluZSBOVlJFR19JUlFfVU5LTk9XTgkJKH4oTlZSRUdfSVJRX1JYX0VSUk9SfE5WUkVHX0lSUV9SWHxOVlJFR19JUlFfUlhfTk9CVUZ8TlZSRUdfSVJRX1RYX0VSUnxOVlJFR19JUlFfVFgyfE5WUkVHX0lSUV9USU1FUnxOVlJFR19JUlFfTElOS3xOVlJFR19JUlFfVFgxKSkKKworCU52UmVnVW5rbm93blNldHVwUmVnNiA9IDB4MDA4LAorI2RlZmluZSBOVlJFR19VTktTRVRVUDZfVkFMCQkzCisKKy8qCisgKiBOVlJFR19QT0xMX0RFRkFVTFQgaXMgdGhlIGludGVydmFsIGxlbmd0aCBvZiB0aGUgdGltZXIgc291cmNlIG9uIHRoZSBuaWMKKyAqIE5WUkVHX1BPTExfREVGQVVMVD05NyB3b3VsZCByZXN1bHQgaW4gYW4gaW50ZXJ2YWwgbGVuZ3RoIG9mIDEgbXMKKyAqLworCU52UmVnUG9sbGluZ0ludGVydmFsID0gMHgwMGMsCisjZGVmaW5lIE5WUkVHX1BPTExfREVGQVVMVAk5NzAKKwlOdlJlZ01pc2MxID0gMHgwODAsCisjZGVmaW5lIE5WUkVHX01JU0MxX0hECQkweDAyCisjZGVmaW5lIE5WUkVHX01JU0MxX0ZPUkNFCTB4M2IwZjNjCisKKwlOdlJlZ1RyYW5zbWl0dGVyQ29udHJvbCA9IDB4MDg0LAorI2RlZmluZSBOVlJFR19YTUlUQ1RMX1NUQVJUCTB4MDEKKwlOdlJlZ1RyYW5zbWl0dGVyU3RhdHVzID0gMHgwODgsCisjZGVmaW5lIE5WUkVHX1hNSVRTVEFUX0JVU1kJMHgwMQorCisJTnZSZWdQYWNrZXRGaWx0ZXJGbGFncyA9IDB4OGMsCisjZGVmaW5lIE5WUkVHX1BGRl9BTFdBWVMJMHg3RjAwMDgKKyNkZWZpbmUgTlZSRUdfUEZGX1BST01JU0MJMHg4MAorI2RlZmluZSBOVlJFR19QRkZfTVlBRERSCTB4MjAKKworCU52UmVnT2ZmbG9hZENvbmZpZyA9IDB4OTAsCisjZGVmaW5lIE5WUkVHX09GRkxPQURfSE9NRVBIWQkweDYwMQorI2RlZmluZSBOVlJFR19PRkZMT0FEX05PUk1BTAlSWF9OSUNfQlVGU0laRQorCU52UmVnUmVjZWl2ZXJDb250cm9sID0gMHgwOTQsCisjZGVmaW5lIE5WUkVHX1JDVkNUTF9TVEFSVAkweDAxCisJTnZSZWdSZWNlaXZlclN0YXR1cyA9IDB4OTgsCisjZGVmaW5lIE5WUkVHX1JDVlNUQVRfQlVTWQkweDAxCisKKwlOdlJlZ1JhbmRvbVNlZWQgPSAweDljLAorI2RlZmluZSBOVlJFR19STkRTRUVEX01BU0sJMHgwMGZmCisjZGVmaW5lIE5WUkVHX1JORFNFRURfRk9SQ0UJMHg3ZjAwCisjZGVmaW5lIE5WUkVHX1JORFNFRURfRk9SQ0UyCTB4MmQwMAorI2RlZmluZSBOVlJFR19STkRTRUVEX0ZPUkNFMwkweDc0MDAKKworCU52UmVnVW5rbm93blNldHVwUmVnMSA9IDB4QTAsCisjZGVmaW5lIE5WUkVHX1VOS1NFVFVQMV9WQUwJMHgxNjA3MGYKKwlOdlJlZ1Vua25vd25TZXR1cFJlZzIgPSAweEE0LAorI2RlZmluZSBOVlJFR19VTktTRVRVUDJfVkFMCTB4MTYKKwlOdlJlZ01hY0FkZHJBID0gMHhBOCwKKwlOdlJlZ01hY0FkZHJCID0gMHhBQywKKwlOdlJlZ011bHRpY2FzdEFkZHJBID0gMHhCMCwKKyNkZWZpbmUgTlZSRUdfTUNBU1RBRERSQV9GT1JDRQkweDAxCisJTnZSZWdNdWx0aWNhc3RBZGRyQiA9IDB4QjQsCisJTnZSZWdNdWx0aWNhc3RNYXNrQSA9IDB4QjgsCisJTnZSZWdNdWx0aWNhc3RNYXNrQiA9IDB4QkMsCisKKwlOdlJlZ1BoeUludGVyZmFjZSA9IDB4QzAsCisjZGVmaW5lIFBIWV9SR01JSQkJMHgxMDAwMDAwMAorCisJTnZSZWdUeFJpbmdQaHlzQWRkciA9IDB4MTAwLAorCU52UmVnUnhSaW5nUGh5c0FkZHIgPSAweDEwNCwKKwlOdlJlZ1JpbmdTaXplcyA9IDB4MTA4LAorI2RlZmluZSBOVlJFR19SSU5HU1pfVFhTSElGVCAwCisjZGVmaW5lIE5WUkVHX1JJTkdTWl9SWFNISUZUIDE2CisJTnZSZWdVbmtub3duVHJhbnNtaXR0ZXJSZWcgPSAweDEwYywKKwlOdlJlZ0xpbmtTcGVlZCA9IDB4MTEwLAorI2RlZmluZSBOVlJFR19MSU5LU1BFRURfRk9SQ0UgMHgxMDAwMAorI2RlZmluZSBOVlJFR19MSU5LU1BFRURfMTAJMTAwMAorI2RlZmluZSBOVlJFR19MSU5LU1BFRURfMTAwCTEwMAorI2RlZmluZSBOVlJFR19MSU5LU1BFRURfMTAwMAk1MAorI2RlZmluZSBOVlJFR19MSU5LU1BFRURfTUFTSwkoMHhGRkYpCisJTnZSZWdVbmtub3duU2V0dXBSZWc1ID0gMHgxMzAsCisjZGVmaW5lIE5WUkVHX1VOS1NFVFVQNV9CSVQzMQkoMTw8MzEpCisJTnZSZWdVbmtub3duU2V0dXBSZWczID0gMHgxM2MsCisjZGVmaW5lIE5WUkVHX1VOS1NFVFVQM19WQUwxCTB4MjAwMDEwCisJTnZSZWdUeFJ4Q29udHJvbCA9IDB4MTQ0LAorI2RlZmluZSBOVlJFR19UWFJYQ1RMX0tJQ0sJMHgwMDAxCisjZGVmaW5lIE5WUkVHX1RYUlhDVExfQklUMQkweDAwMDIKKyNkZWZpbmUgTlZSRUdfVFhSWENUTF9CSVQyCTB4MDAwNAorI2RlZmluZSBOVlJFR19UWFJYQ1RMX0lETEUJMHgwMDA4CisjZGVmaW5lIE5WUkVHX1RYUlhDVExfUkVTRVQJMHgwMDEwCisjZGVmaW5lIE5WUkVHX1RYUlhDVExfUlhDSEVDSwkweDA0MDAKKwlOdlJlZ01JSVN0YXR1cyA9IDB4MTgwLAorI2RlZmluZSBOVlJFR19NSUlTVEFUX0VSUk9SCQkweDAwMDEKKyNkZWZpbmUgTlZSRUdfTUlJU1RBVF9MSU5LQ0hBTkdFCTB4MDAwOAorI2RlZmluZSBOVlJFR19NSUlTVEFUX01BU0sJCTB4MDAwZgorI2RlZmluZSBOVlJFR19NSUlTVEFUX01BU0syCQkweDAwMGYKKwlOdlJlZ1Vua25vd25TZXR1cFJlZzQgPSAweDE4NCwKKyNkZWZpbmUgTlZSRUdfVU5LU0VUVVA0X1ZBTAk4CisKKwlOdlJlZ0FkYXB0ZXJDb250cm9sID0gMHgxODgsCisjZGVmaW5lIE5WUkVHX0FEQVBUQ1RMX1NUQVJUCTB4MDIKKyNkZWZpbmUgTlZSRUdfQURBUFRDVExfTElOS1VQCTB4MDQKKyNkZWZpbmUgTlZSRUdfQURBUFRDVExfUEhZVkFMSUQJMHg0MDAwMAorI2RlZmluZSBOVlJFR19BREFQVENUTF9SVU5OSU5HCTB4MTAwMDAwCisjZGVmaW5lIE5WUkVHX0FEQVBUQ1RMX1BIWVNISUZUCTI0CisJTnZSZWdNSUlTcGVlZCA9IDB4MThjLAorI2RlZmluZSBOVlJFR19NSUlTUEVFRF9CSVQ4CSgxPDw4KQorI2RlZmluZSBOVlJFR19NSUlERUxBWQk1CisJTnZSZWdNSUlDb250cm9sID0gMHgxOTAsCisjZGVmaW5lIE5WUkVHX01JSUNUTF9JTlVTRQkweDA4MDAwCisjZGVmaW5lIE5WUkVHX01JSUNUTF9XUklURQkweDAwNDAwCisjZGVmaW5lIE5WUkVHX01JSUNUTF9BRERSU0hJRlQJNQorCU52UmVnTUlJRGF0YSA9IDB4MTk0LAorCU52UmVnV2FrZVVwRmxhZ3MgPSAweDIwMCwKKyNkZWZpbmUgTlZSRUdfV0FLRVVQRkxBR1NfVkFMCQkweDc3NzAKKyNkZWZpbmUgTlZSRUdfV0FLRVVQRkxBR1NfQlVTWVNISUZUCTI0CisjZGVmaW5lIE5WUkVHX1dBS0VVUEZMQUdTX0VOQUJMRVNISUZUCTE2CisjZGVmaW5lIE5WUkVHX1dBS0VVUEZMQUdTX0QzU0hJRlQJMTIKKyNkZWZpbmUgTlZSRUdfV0FLRVVQRkxBR1NfRDJTSElGVAk4CisjZGVmaW5lIE5WUkVHX1dBS0VVUEZMQUdTX0QxU0hJRlQJNAorI2RlZmluZSBOVlJFR19XQUtFVVBGTEFHU19EMFNISUZUCTAKKyNkZWZpbmUgTlZSRUdfV0FLRVVQRkxBR1NfQUNDRVBUX01BR1BBVAkJMHgwMQorI2RlZmluZSBOVlJFR19XQUtFVVBGTEFHU19BQ0NFUFRfV0FLRVVQUEFUCTB4MDIKKyNkZWZpbmUgTlZSRUdfV0FLRVVQRkxBR1NfQUNDRVBUX0xJTktDSEFOR0UJMHgwNAorI2RlZmluZSBOVlJFR19XQUtFVVBGTEFHU19FTkFCTEUJMHgxMTExCisKKwlOdlJlZ1BhdHRlcm5DUkMgPSAweDIwNCwKKwlOdlJlZ1BhdHRlcm5NYXNrID0gMHgyMDgsCisJTnZSZWdQb3dlckNhcCA9IDB4MjY4LAorI2RlZmluZSBOVlJFR19QT1dFUkNBUF9EM1NVUFAJKDE8PDMwKQorI2RlZmluZSBOVlJFR19QT1dFUkNBUF9EMlNVUFAJKDE8PDI2KQorI2RlZmluZSBOVlJFR19QT1dFUkNBUF9EMVNVUFAJKDE8PDI1KQorCU52UmVnUG93ZXJTdGF0ZSA9IDB4MjZjLAorI2RlZmluZSBOVlJFR19QT1dFUlNUQVRFX1BPV0VSRURVUAkweDgwMDAKKyNkZWZpbmUgTlZSRUdfUE9XRVJTVEFURV9WQUxJRAkJMHgwMTAwCisjZGVmaW5lIE5WUkVHX1BPV0VSU1RBVEVfTUFTSwkJMHgwMDAzCisjZGVmaW5lIE5WUkVHX1BPV0VSU1RBVEVfRDAJCTB4MDAwMAorI2RlZmluZSBOVlJFR19QT1dFUlNUQVRFX0QxCQkweDAwMDEKKyNkZWZpbmUgTlZSRUdfUE9XRVJTVEFURV9EMgkJMHgwMDAyCisjZGVmaW5lIE5WUkVHX1BPV0VSU1RBVEVfRDMJCTB4MDAwMworfTsKKworLyogQmlnIGVuZGlhbjogc2hvdWxkIHdvcmssIGJ1dCBpcyB1bnRlc3RlZCAqLworc3RydWN0IHJpbmdfZGVzYyB7CisJdTMyIFBhY2tldEJ1ZmZlcjsKKwl1MzIgRmxhZ0xlbjsKK307CisKKyNkZWZpbmUgRkxBR19NQVNLX1YxIDB4ZmZmZjAwMDAKKyNkZWZpbmUgRkxBR19NQVNLX1YyIDB4ZmZmZmMwMDAKKyNkZWZpbmUgTEVOX01BU0tfVjEgKDB4ZmZmZmZmZmYgXiBGTEFHX01BU0tfVjEpCisjZGVmaW5lIExFTl9NQVNLX1YyICgweGZmZmZmZmZmIF4gRkxBR19NQVNLX1YyKQorCisjZGVmaW5lIE5WX1RYX0xBU1RQQUNLRVQJKDE8PDE2KQorI2RlZmluZSBOVl9UWF9SRVRSWUVSUk9SCSgxPDwxOSkKKyNkZWZpbmUgTlZfVFhfTEFTVFBBQ0tFVDEJKDE8PDI0KQorI2RlZmluZSBOVl9UWF9ERUZFUlJFRAkJKDE8PDI2KQorI2RlZmluZSBOVl9UWF9DQVJSSUVSTE9TVAkoMTw8MjcpCisjZGVmaW5lIE5WX1RYX0xBVEVDT0xMSVNJT04JKDE8PDI4KQorI2RlZmluZSBOVl9UWF9VTkRFUkZMT1cJCSgxPDwyOSkKKyNkZWZpbmUgTlZfVFhfRVJST1IJCSgxPDwzMCkKKyNkZWZpbmUgTlZfVFhfVkFMSUQJCSgxPDwzMSkKKworI2RlZmluZSBOVl9UWDJfTEFTVFBBQ0tFVAkoMTw8MjkpCisjZGVmaW5lIE5WX1RYMl9SRVRSWUVSUk9SCSgxPDwxOCkKKyNkZWZpbmUgTlZfVFgyX0xBU1RQQUNLRVQxCSgxPDwyMykKKyNkZWZpbmUgTlZfVFgyX0RFRkVSUkVECQkoMTw8MjUpCisjZGVmaW5lIE5WX1RYMl9DQVJSSUVSTE9TVAkoMTw8MjYpCisjZGVmaW5lIE5WX1RYMl9MQVRFQ09MTElTSU9OCSgxPDwyNykKKyNkZWZpbmUgTlZfVFgyX1VOREVSRkxPVwkoMTw8MjgpCisvKiBlcnJvciBhbmQgdmFsaWQgYXJlIHRoZSBzYW1lIGZvciBib3RoICovCisjZGVmaW5lIE5WX1RYMl9FUlJPUgkJKDE8PDMwKQorI2RlZmluZSBOVl9UWDJfVkFMSUQJCSgxPDwzMSkKKworI2RlZmluZSBOVl9SWF9ERVNDUklQVE9SVkFMSUQJKDE8PDE2KQorI2RlZmluZSBOVl9SWF9NSVNTRURGUkFNRQkoMTw8MTcpCisjZGVmaW5lIE5WX1JYX1NVQlNUUkFDVDEJKDE8PDE4KQorI2RlZmluZSBOVl9SWF9FUlJPUjEJCSgxPDwyMykKKyNkZWZpbmUgTlZfUlhfRVJST1IyCQkoMTw8MjQpCisjZGVmaW5lIE5WX1JYX0VSUk9SMwkJKDE8PDI1KQorI2RlZmluZSBOVl9SWF9FUlJPUjQJCSgxPDwyNikKKyNkZWZpbmUgTlZfUlhfQ1JDRVJSCQkoMTw8MjcpCisjZGVmaW5lIE5WX1JYX09WRVJGTE9XCQkoMTw8MjgpCisjZGVmaW5lIE5WX1JYX0ZSQU1JTkdFUlIJKDE8PDI5KQorI2RlZmluZSBOVl9SWF9FUlJPUgkJKDE8PDMwKQorI2RlZmluZSBOVl9SWF9BVkFJTAkJKDE8PDMxKQorCisjZGVmaW5lIE5WX1JYMl9DSEVDS1NVTU1BU0sJKDB4MUMwMDAwMDApCisjZGVmaW5lIE5WX1JYMl9DSEVDS1NVTU9LMQkoMHgxMDAwMDAwMCkKKyNkZWZpbmUgTlZfUlgyX0NIRUNLU1VNT0syCSgweDE0MDAwMDAwKQorI2RlZmluZSBOVl9SWDJfQ0hFQ0tTVU1PSzMJKDB4MTgwMDAwMDApCisjZGVmaW5lIE5WX1JYMl9ERVNDUklQVE9SVkFMSUQJKDE8PDI5KQorI2RlZmluZSBOVl9SWDJfU1VCU1RSQUNUMQkoMTw8MjUpCisjZGVmaW5lIE5WX1JYMl9FUlJPUjEJCSgxPDwxOCkKKyNkZWZpbmUgTlZfUlgyX0VSUk9SMgkJKDE8PDE5KQorI2RlZmluZSBOVl9SWDJfRVJST1IzCQkoMTw8MjApCisjZGVmaW5lIE5WX1JYMl9FUlJPUjQJCSgxPDwyMSkKKyNkZWZpbmUgTlZfUlgyX0NSQ0VSUgkJKDE8PDIyKQorI2RlZmluZSBOVl9SWDJfT1ZFUkZMT1cJCSgxPDwyMykKKyNkZWZpbmUgTlZfUlgyX0ZSQU1JTkdFUlIJKDE8PDI0KQorLyogZXJyb3IgYW5kIGF2YWlsIGFyZSB0aGUgc2FtZSBmb3IgYm90aCAqLworI2RlZmluZSBOVl9SWDJfRVJST1IJCSgxPDwzMCkKKyNkZWZpbmUgTlZfUlgyX0FWQUlMCQkoMTw8MzEpCisKKy8qIE1pc2NlbGFuZW91cyBoYXJkd2FyZSByZWxhdGVkIGRlZmluZXM6ICovCisjZGVmaW5lIE5WX1BDSV9SRUdTWgkJMHgyNzAKKworLyogdmFyaW91cyB0aW1lb3V0IGRlbGF5czogYWxsIGluIHVzZWMgKi8KKyNkZWZpbmUgTlZfVFhSWF9SRVNFVF9ERUxBWQk0CisjZGVmaW5lIE5WX1RYU1RPUF9ERUxBWTEJMTAKKyNkZWZpbmUgTlZfVFhTVE9QX0RFTEFZMU1BWAk1MDAwMDAKKyNkZWZpbmUgTlZfVFhTVE9QX0RFTEFZMgkxMDAKKyNkZWZpbmUgTlZfUlhTVE9QX0RFTEFZMQkxMAorI2RlZmluZSBOVl9SWFNUT1BfREVMQVkxTUFYCTUwMDAwMAorI2RlZmluZSBOVl9SWFNUT1BfREVMQVkyCTEwMAorI2RlZmluZSBOVl9TRVRVUDVfREVMQVkJCTUKKyNkZWZpbmUgTlZfU0VUVVA1X0RFTEFZTUFYCTUwMDAwCisjZGVmaW5lIE5WX1BPV0VSVVBfREVMQVkJNQorI2RlZmluZSBOVl9QT1dFUlVQX0RFTEFZTUFYCTUwMDAKKyNkZWZpbmUgTlZfTUlJQlVTWV9ERUxBWQk1MAorI2RlZmluZSBOVl9NSUlQSFlfREVMQVkJMTAKKyNkZWZpbmUgTlZfTUlJUEhZX0RFTEFZTUFYCTEwMDAwCisKKyNkZWZpbmUgTlZfV0FLRVVQUEFUVEVSTlMJNQorI2RlZmluZSBOVl9XQUtFVVBNQVNLRU5UUklFUwk0CisKKy8qIEdlbmVyYWwgZHJpdmVyIGRlZmF1bHRzICovCisjZGVmaW5lIE5WX1dBVENIRE9HX1RJTUVPCSg1KkhaKQorCisjZGVmaW5lIFJYX1JJTkcJCTEyOAorI2RlZmluZSBUWF9SSU5HCQk2NAorLyogCisgKiBJZiB5b3VyIG5pYyBteXN0ZXJpb3VzbHkgaGFuZ3MgdGhlbiB0cnkgdG8gcmVkdWNlIHRoZSBsaW1pdHMKKyAqIHRvIDEvMDogSXQgbWlnaHQgYmUgcmVxdWlyZWQgdG8gc2V0IE5WX1RYX0xBU1RQQUNLRVQgaW4gdGhlCisgKiBsYXN0IHZhbGlkIHJpbmcgZW50cnkuIEJ1dCB0aGlzIHdvdWxkIGJlIGltcG9zc2libGUgdG8KKyAqIGltcGxlbWVudCAtIHByb2JhYmx5IGEgZGlzYXNzZW1ibHkgZXJyb3IuCisgKi8KKyNkZWZpbmUgVFhfTElNSVRfU1RPUAk2MworI2RlZmluZSBUWF9MSU1JVF9TVEFSVAk2MgorCisvKiByeC90eCBtYWMgYWRkciArIHR5cGUgKyB2bGFuICsgYWxpZ24gKyBzbGFjayovCisjZGVmaW5lIFJYX05JQ19CVUZTSVpFCQkoRVRIX0RBVEFfTEVOICsgNjQpCisvKiBldmVuIG1vcmUgc2xhY2sgKi8KKyNkZWZpbmUgUlhfQUxMT0NfQlVGU0laRQkoRVRIX0RBVEFfTEVOICsgMTI4KQorCisjZGVmaW5lIE9PTV9SRUZJTEwJKDErSFovMjApCisjZGVmaW5lIFBPTExfV0FJVAkoMStIWi8xMDApCisjZGVmaW5lIExJTktfVElNRU9VVAkoMypIWikKKworLyogCisgKiBkZXNjX3ZlciB2YWx1ZXM6CisgKiBUaGlzIGZpZWxkIGhhcyB0d28gcHVycG9zZXM6CisgKiAtIE5ld2VyIG5pY3MgdXNlcyBhIGRpZmZlcmVudCByaW5nIGxheW91dC4gVGhlIGxheW91dCBpcyBzZWxlY3RlZCBieQorICogICBjb21wYXJpbmcgbnAtPmRlc2NfdmVyIHdpdGggREVTQ19WRVJfeHkuCisgKiAtIEl0IGNvbnRhaW5zIGJpdHMgdGhhdCBhcmUgZm9yY2VkIG9uIHdoZW4gd3JpdGluZyB0byBOdlJlZ1R4UnhDb250cm9sLgorICovCisjZGVmaW5lIERFU0NfVkVSXzEJMHgwCisjZGVmaW5lIERFU0NfVkVSXzIJKDB4MDIxMDB8TlZSRUdfVFhSWENUTF9SWENIRUNLKQorCisvKiBQSFkgZGVmaW5lcyAqLworI2RlZmluZSBQSFlfT1VJX01BUlZFTEwJMHg1MDQzCisjZGVmaW5lIFBIWV9PVUlfQ0lDQURBCTB4MDNmMQorI2RlZmluZSBQSFlJRDFfT1VJX01BU0sJMHgwM2ZmCisjZGVmaW5lIFBIWUlEMV9PVUlfU0hGVAk2CisjZGVmaW5lIFBIWUlEMl9PVUlfTUFTSwkweGZjMDAKKyNkZWZpbmUgUEhZSUQyX09VSV9TSEZUCTEwCisjZGVmaW5lIFBIWV9JTklUMQkweDBmMDAwCisjZGVmaW5lIFBIWV9JTklUMgkweDBlMDAKKyNkZWZpbmUgUEhZX0lOSVQzCTB4MDEwMDAKKyNkZWZpbmUgUEhZX0lOSVQ0CTB4MDIwMAorI2RlZmluZSBQSFlfSU5JVDUJMHgwMDA0CisjZGVmaW5lIFBIWV9JTklUNgkweDAyMDAwCisjZGVmaW5lIFBIWV9HSUdBQklUCTB4MDEwMAorCisjZGVmaW5lIFBIWV9USU1FT1VUCTB4MQorI2RlZmluZSBQSFlfRVJST1IJMHgyCisKKyNkZWZpbmUgUEhZXzEwMAkweDEKKyNkZWZpbmUgUEhZXzEwMDAJMHgyCisjZGVmaW5lIFBIWV9IQUxGCTB4MTAwCisKKy8qIEZJWE1FOiBNSUkgZGVmaW5lcyB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byA8bGludXgvbWlpLmg+ICovCisjZGVmaW5lIE1JSV8xMDAwQlRfQ1IJMHgwOQorI2RlZmluZSBNSUlfMTAwMEJUX1NSCTB4MGEKKyNkZWZpbmUgQURWRVJUSVNFXzEwMDBGVUxMCTB4MDIwMAorI2RlZmluZSBBRFZFUlRJU0VfMTAwMEhBTEYJMHgwMTAwCisjZGVmaW5lIExQQV8xMDAwRlVMTAkweDA4MDAKKyNkZWZpbmUgTFBBXzEwMDBIQUxGCTB4MDQwMAorCisKKy8qCisgKiBTTVAgbG9ja2luZzoKKyAqIEFsbCBoYXJkd2FyZSBhY2Nlc3MgdW5kZXIgZGV2LT5wcml2LT5sb2NrLCBleGNlcHQgdGhlIHBlcmZvcm1hbmNlCisgKiBjcml0aWNhbCBwYXJ0czoKKyAqIC0gcnggaXMgKHBzZXVkby0pIGxvY2tsZXNzOiBpdCByZWxpZXMgb24gdGhlIHNpbmdsZS10aHJlYWRpbmcgcHJvdmlkZWQKKyAqCWJ5IHRoZSBhcmNoIGNvZGUgZm9yIGludGVycnVwdHMuCisgKiAtIHR4IHNldHVwIGlzIGxvY2tsZXNzOiBpdCByZWxpZXMgb24gZGV2LT54bWl0X2xvY2suIEFjdHVhbCBzdWJtaXNzaW9uCisgKgluZWVkcyBkZXYtPnByaXYtPmxvY2sgOi0oCisgKiAtIHNldF9tdWx0aWNhc3RfbGlzdDogcHJlcGFyYXRpb24gbG9ja2xlc3MsIHJlbGllcyBvbiBkZXYtPnhtaXRfbG9jay4KKyAqLworCisvKiBpbiBkZXY6IGJhc2UsIGlycSAqLworc3RydWN0IGZlX3ByaXYgeworCXNwaW5sb2NrX3QgbG9jazsKKworCS8qIEdlbmVyYWwgZGF0YToKKwkgKiBMb2NraW5nOiBzcGluX2xvY2soJm5wLT5sb2NrKTsgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlpbnQgaW5fc2h1dGRvd247CisJdTMyIGxpbmtzcGVlZDsKKwlpbnQgZHVwbGV4OworCWludCBhdXRvbmVnOworCWludCBmaXhlZF9tb2RlOworCWludCBwaHlhZGRyOworCWludCB3b2xlbmFibGVkOworCXVuc2lnbmVkIGludCBwaHlfb3VpOworCXUxNiBnaWdhYml0OworCisJLyogR2VuZXJhbCBkYXRhOiBSTyBmaWVsZHMgKi8KKwlkbWFfYWRkcl90IHJpbmdfYWRkcjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKwl1MzIgb3JpZ19tYWNbMl07CisJdTMyIGlycW1hc2s7CisJdTMyIGRlc2NfdmVyOworCisJdm9pZCBfX2lvbWVtICpiYXNlOworCisJLyogcnggc3BlY2lmaWMgZmllbGRzLgorCSAqIExvY2tpbmc6IFdpdGhpbiBpcnEgaGFuZGVyIG9yIGRpc2FibGVfaXJxK3NwaW5fbG9jaygmbnAtPmxvY2spOworCSAqLworCXN0cnVjdCByaW5nX2Rlc2MgKnJ4X3Jpbmc7CisJdW5zaWduZWQgaW50IGN1cl9yeCwgcmVmaWxsX3J4OworCXN0cnVjdCBza19idWZmICpyeF9za2J1ZmZbUlhfUklOR107CisJZG1hX2FkZHJfdCByeF9kbWFbUlhfUklOR107CisJdW5zaWduZWQgaW50IHJ4X2J1Zl9zejsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBvb21fa2ljazsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBuaWNfcG9sbDsKKworCS8qIG1lZGlhIGRldGVjdGlvbiB3b3JrYXJvdW5kLgorCSAqIExvY2tpbmc6IFdpdGhpbiBpcnEgaGFuZGVyIG9yIGRpc2FibGVfaXJxK3NwaW5fbG9jaygmbnAtPmxvY2spOworCSAqLworCWludCBuZWVkX2xpbmt0aW1lcjsKKwl1bnNpZ25lZCBsb25nIGxpbmtfdGltZW91dDsKKwkvKgorCSAqIHR4IHNwZWNpZmljIGZpZWxkcy4KKwkgKi8KKwlzdHJ1Y3QgcmluZ19kZXNjICp0eF9yaW5nOworCXVuc2lnbmVkIGludCBuZXh0X3R4LCBuaWNfdHg7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYnVmZltUWF9SSU5HXTsKKwlkbWFfYWRkcl90IHR4X2RtYVtUWF9SSU5HXTsKKwl1MzIgdHhfZmxhZ3M7Cit9OworCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgbG9vcHMgdW50aWwgd2UgYXNzdW1lIHRoYXQgYSBiaXQgaW4gdGhlIGlycSBtYXNrCisgKiBpcyBzdHVjay4gT3ZlcnJpZGFibGUgd2l0aCBtb2R1bGUgcGFyYW0uCisgKi8KK3N0YXRpYyBpbnQgbWF4X2ludGVycnVwdF93b3JrID0gNTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZmVfcHJpdiAqZ2V0X252cHJpdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBuZXRkZXZfcHJpdihkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHU4IF9faW9tZW0gKmdldF9od2Jhc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZ2V0X252cHJpdihkZXYpLT5iYXNlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX3B1c2godTggX19pb21lbSAqYmFzZSkKK3sKKwkvKiBmb3JjZSBvdXQgcGVuZGluZyBwb3N0ZWQgd3JpdGVzICovCisJcmVhZGwoYmFzZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG52X2Rlc2NyX2dldGxlbmd0aChzdHJ1Y3QgcmluZ19kZXNjICpwcmQsIHUzMiB2KQoreworCXJldHVybiBsZTMyX3RvX2NwdShwcmQtPkZsYWdMZW4pCisJCSYgKCh2ID09IERFU0NfVkVSXzEpID8gTEVOX01BU0tfVjEgOiBMRU5fTUFTS19WMik7Cit9CisKK3N0YXRpYyBpbnQgcmVnX2RlbGF5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBvZmZzZXQsIHUzMiBtYXNrLCB1MzIgdGFyZ2V0LAorCQkJCWludCBkZWxheSwgaW50IGRlbGF5bWF4LCBjb25zdCBjaGFyICptc2cpCit7CisJdTggX19pb21lbSAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKKworCXBjaV9wdXNoKGJhc2UpOworCWRvIHsKKwkJdWRlbGF5KGRlbGF5KTsKKwkJZGVsYXltYXggLT0gZGVsYXk7CisJCWlmIChkZWxheW1heCA8IDApIHsKKwkJCWlmIChtc2cpCisJCQkJcHJpbnRrKG1zZyk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gd2hpbGUgKChyZWFkbChiYXNlICsgb2Zmc2V0KSAmIG1hc2spICE9IHRhcmdldCk7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTUlJX1JFQUQJKC0xKQorLyogbWlpX3J3OiByZWFkL3dyaXRlIGEgcmVnaXN0ZXIgb24gdGhlIFBIWS4KKyAqCisgKiBDYWxsZXIgbXVzdCBndWFyYW50ZWUgc2VyaWFsaXphdGlvbgorICovCitzdGF0aWMgaW50IG1paV9ydyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYWRkciwgaW50IG1paXJlZywgaW50IHZhbHVlKQoreworCXU4IF9faW9tZW0gKmJhc2UgPSBnZXRfaHdiYXNlKGRldik7CisJdTMyIHJlZzsKKwlpbnQgcmV0dmFsOworCisJd3JpdGVsKE5WUkVHX01JSVNUQVRfTUFTSywgYmFzZSArIE52UmVnTUlJU3RhdHVzKTsKKworCXJlZyA9IHJlYWRsKGJhc2UgKyBOdlJlZ01JSUNvbnRyb2wpOworCWlmIChyZWcgJiBOVlJFR19NSUlDVExfSU5VU0UpIHsKKwkJd3JpdGVsKE5WUkVHX01JSUNUTF9JTlVTRSwgYmFzZSArIE52UmVnTUlJQ29udHJvbCk7CisJCXVkZWxheShOVl9NSUlCVVNZX0RFTEFZKTsKKwl9CisKKwlyZWcgPSAoYWRkciA8PCBOVlJFR19NSUlDVExfQUREUlNISUZUKSB8IG1paXJlZzsKKwlpZiAodmFsdWUgIT0gTUlJX1JFQUQpIHsKKwkJd3JpdGVsKHZhbHVlLCBiYXNlICsgTnZSZWdNSUlEYXRhKTsKKwkJcmVnIHw9IE5WUkVHX01JSUNUTF9XUklURTsKKwl9CisJd3JpdGVsKHJlZywgYmFzZSArIE52UmVnTUlJQ29udHJvbCk7CisKKwlpZiAocmVnX2RlbGF5KGRldiwgTnZSZWdNSUlDb250cm9sLCBOVlJFR19NSUlDVExfSU5VU0UsIDAsCisJCQlOVl9NSUlQSFlfREVMQVksIE5WX01JSVBIWV9ERUxBWU1BWCwgTlVMTCkpIHsKKwkJZHByaW50ayhLRVJOX0RFQlVHICIlczogbWlpX3J3IG9mIHJlZyAlZCBhdCBQSFkgJWQgdGltZWQgb3V0LlxuIiwKKwkJCQlkZXYtPm5hbWUsIG1paXJlZywgYWRkcik7CisJCXJldHZhbCA9IC0xOworCX0gZWxzZSBpZiAodmFsdWUgIT0gTUlJX1JFQUQpIHsKKwkJLyogaXQgd2FzIGEgd3JpdGUgb3BlcmF0aW9uIC0gZmV3ZXIgZmFpbHVyZXMgYXJlIGRldGVjdGFibGUgKi8KKwkJZHByaW50ayhLRVJOX0RFQlVHICIlczogbWlpX3J3IHdyb3RlIDB4JXggdG8gcmVnICVkIGF0IFBIWSAlZFxuIiwKKwkJCQlkZXYtPm5hbWUsIHZhbHVlLCBtaWlyZWcsIGFkZHIpOworCQlyZXR2YWwgPSAwOworCX0gZWxzZSBpZiAocmVhZGwoYmFzZSArIE52UmVnTUlJU3RhdHVzKSAmIE5WUkVHX01JSVNUQVRfRVJST1IpIHsKKwkJZHByaW50ayhLRVJOX0RFQlVHICIlczogbWlpX3J3IG9mIHJlZyAlZCBhdCBQSFkgJWQgZmFpbGVkLlxuIiwKKwkJCQlkZXYtPm5hbWUsIG1paXJlZywgYWRkcik7CisJCXJldHZhbCA9IC0xOworCX0gZWxzZSB7CisJCXJldHZhbCA9IHJlYWRsKGJhc2UgKyBOdlJlZ01JSURhdGEpOworCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBtaWlfcncgcmVhZCBmcm9tIHJlZyAlZCBhdCBQSFkgJWQ6IDB4JXguXG4iLAorCQkJCWRldi0+bmFtZSwgbWlpcmVnLCBhZGRyLCByZXR2YWwpOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgcGh5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOworCXUzMiBtaWljb250cm9sOworCXVuc2lnbmVkIGludCB0cmllcyA9IDA7CisKKwltaWljb250cm9sID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9CTUNSLCBNSUlfUkVBRCk7CisJbWlpY29udHJvbCB8PSBCTUNSX1JFU0VUOworCWlmIChtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0JNQ1IsIG1paWNvbnRyb2wpKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiB3YWl0IGZvciA1MDBtcyAqLworCW1zbGVlcCg1MDApOworCisJLyogbXVzdCB3YWl0IHRpbGwgcmVzZXQgaXMgZGVhc3NlcnRlZCAqLworCXdoaWxlIChtaWljb250cm9sICYgQk1DUl9SRVNFVCkgeworCQltc2xlZXAoMTApOworCQltaWljb250cm9sID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9CTUNSLCBNSUlfUkVBRCk7CisJCS8qIEZJWE1FOiAxMDAgdHJpZXMgc2VlbSBleGNlc3NpdmUgKi8KKwkJaWYgKHRyaWVzKysgPiAxMDApCisJCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBoeV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOworCXU4IF9faW9tZW0gKmJhc2UgPSBnZXRfaHdiYXNlKGRldik7CisJdTMyIHBoeWludGVyZmFjZSwgcGh5X3Jlc2VydmVkLCBtaWlfc3RhdHVzLCBtaWlfY29udHJvbCwgbWlpX2NvbnRyb2xfMTAwMCxyZWc7CisKKwkvKiBzZXQgYWR2ZXJ0aXNlIHJlZ2lzdGVyICovCisJcmVnID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9BRFZFUlRJU0UsIE1JSV9SRUFEKTsKKwlyZWcgfD0gKEFEVkVSVElTRV8xMEhBTEZ8QURWRVJUSVNFXzEwRlVMTHxBRFZFUlRJU0VfMTAwSEFMRnxBRFZFUlRJU0VfMTAwRlVMTHwweDgwMHwweDQwMCk7CisJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfQURWRVJUSVNFLCByZWcpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgd3JpdGUgdG8gYWR2ZXJ0aXNlIGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCXJldHVybiBQSFlfRVJST1I7CisJfQorCisJLyogZ2V0IHBoeSBpbnRlcmZhY2UgdHlwZSAqLworCXBoeWludGVyZmFjZSA9IHJlYWRsKGJhc2UgKyBOdlJlZ1BoeUludGVyZmFjZSk7CisKKwkvKiBzZWUgaWYgZ2lnYWJpdCBwaHkgKi8KKwltaWlfc3RhdHVzID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9CTVNSLCBNSUlfUkVBRCk7CisJaWYgKG1paV9zdGF0dXMgJiBQSFlfR0lHQUJJVCkgeworCQlucC0+Z2lnYWJpdCA9IFBIWV9HSUdBQklUOworCQltaWlfY29udHJvbF8xMDAwID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV8xMDAwQlRfQ1IsIE1JSV9SRUFEKTsKKwkJbWlpX2NvbnRyb2xfMTAwMCAmPSB+QURWRVJUSVNFXzEwMDBIQUxGOworCQlpZiAocGh5aW50ZXJmYWNlICYgUEhZX1JHTUlJKQorCQkJbWlpX2NvbnRyb2xfMTAwMCB8PSBBRFZFUlRJU0VfMTAwMEZVTEw7CisJCWVsc2UKKwkJCW1paV9jb250cm9sXzEwMDAgJj0gfkFEVkVSVElTRV8xMDAwRlVMTDsKKworCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV8xMDAwQlRfQ1IsIG1paV9jb250cm9sXzEwMDApKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGh5IGluaXQgZmFpbGVkLlxuIiwgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJCXJldHVybiBQSFlfRVJST1I7CisJCX0KKwl9CisJZWxzZQorCQlucC0+Z2lnYWJpdCA9IDA7CisKKwkvKiByZXNldCB0aGUgcGh5ICovCisJaWYgKHBoeV9yZXNldChkZXYpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgcmVzZXQgZmFpbGVkXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQlyZXR1cm4gUEhZX0VSUk9SOworCX0KKworCS8qIHBoeSB2ZW5kb3Igc3BlY2lmaWMgY29uZmlndXJhdGlvbiAqLworCWlmICgobnAtPnBoeV9vdWkgPT0gUEhZX09VSV9DSUNBREEpICYmIChwaHlpbnRlcmZhY2UgJiBQSFlfUkdNSUkpICkgeworCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX1JFU1YxLCBNSUlfUkVBRCk7CisJCXBoeV9yZXNlcnZlZCAmPSB+KFBIWV9JTklUMSB8IFBIWV9JTklUMik7CisJCXBoeV9yZXNlcnZlZCB8PSAoUEhZX0lOSVQzIHwgUEhZX0lOSVQ0KTsKKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfUkVTVjEsIHBoeV9yZXNlcnZlZCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX05DT05GSUcsIE1JSV9SRUFEKTsKKwkJcGh5X3Jlc2VydmVkIHw9IFBIWV9JTklUNTsKKwkJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfTkNPTkZJRywgcGh5X3Jlc2VydmVkKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBoeSBpbml0IGZhaWxlZC5cbiIsIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJCQlyZXR1cm4gUEhZX0VSUk9SOworCQl9CisJfQorCWlmIChucC0+cGh5X291aSA9PSBQSFlfT1VJX0NJQ0FEQSkgeworCQlwaHlfcmVzZXJ2ZWQgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX1NSRVZJU0lPTiwgTUlJX1JFQUQpOworCQlwaHlfcmVzZXJ2ZWQgfD0gUEhZX0lOSVQ2OworCQlpZiAobWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9TUkVWSVNJT04sIHBoeV9yZXNlcnZlZCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHkgaW5pdCBmYWlsZWQuXG4iLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCQkJcmV0dXJuIFBIWV9FUlJPUjsKKwkJfQorCX0KKworCS8qIHJlc3RhcnQgYXV0byBuZWdvdGlhdGlvbiAqLworCW1paV9jb250cm9sID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9CTUNSLCBNSUlfUkVBRCk7CisJbWlpX2NvbnRyb2wgfD0gKEJNQ1JfQU5SRVNUQVJUIHwgQk1DUl9BTkVOQUJMRSk7CisJaWYgKG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfQk1DUiwgbWlpX2NvbnRyb2wpKSB7CisJCXJldHVybiBQSFlfRVJST1I7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG52X3N0YXJ0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOworCXU4IF9faW9tZW0gKmJhc2UgPSBnZXRfaHdiYXNlKGRldik7CisKKwlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl9zdGFydF9yeFxuIiwgZGV2LT5uYW1lKTsKKwkvKiBBbHJlYWR5IHJ1bm5pbmc/IFN0b3AgaXQuICovCisJaWYgKHJlYWRsKGJhc2UgKyBOdlJlZ1JlY2VpdmVyQ29udHJvbCkgJiBOVlJFR19SQ1ZDVExfU1RBUlQpIHsKKwkJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1JlY2VpdmVyQ29udHJvbCk7CisJCXBjaV9wdXNoKGJhc2UpOworCX0KKwl3cml0ZWwobnAtPmxpbmtzcGVlZCwgYmFzZSArIE52UmVnTGlua1NwZWVkKTsKKwlwY2lfcHVzaChiYXNlKTsKKwl3cml0ZWwoTlZSRUdfUkNWQ1RMX1NUQVJULCBiYXNlICsgTnZSZWdSZWNlaXZlckNvbnRyb2wpOworCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X3N0YXJ0X3J4IHRvIGR1cGxleCAlZCwgc3BlZWQgMHglMDh4LlxuIiwKKwkJCQlkZXYtPm5hbWUsIG5wLT5kdXBsZXgsIG5wLT5saW5rc3BlZWQpOworCXBjaV9wdXNoKGJhc2UpOworfQorCitzdGF0aWMgdm9pZCBudl9zdG9wX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTggX19pb21lbSAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKKworCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X3N0b3BfcnhcbiIsIGRldi0+bmFtZSk7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1JlY2VpdmVyQ29udHJvbCk7CisJcmVnX2RlbGF5KGRldiwgTnZSZWdSZWNlaXZlclN0YXR1cywgTlZSRUdfUkNWU1RBVF9CVVNZLCAwLAorCQkJTlZfUlhTVE9QX0RFTEFZMSwgTlZfUlhTVE9QX0RFTEFZMU1BWCwKKwkJCUtFUk5fSU5GTyAibnZfc3RvcF9yeDogUmVjZWl2ZXJTdGF0dXMgcmVtYWluZWQgYnVzeSIpOworCisJdWRlbGF5KE5WX1JYU1RPUF9ERUxBWTIpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdMaW5rU3BlZWQpOworfQorCitzdGF0aWMgdm9pZCBudl9zdGFydF90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXU4IF9faW9tZW0gKmJhc2UgPSBnZXRfaHdiYXNlKGRldik7CisKKwlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl9zdGFydF90eFxuIiwgZGV2LT5uYW1lKTsKKwl3cml0ZWwoTlZSRUdfWE1JVENUTF9TVEFSVCwgYmFzZSArIE52UmVnVHJhbnNtaXR0ZXJDb250cm9sKTsKKwlwY2lfcHVzaChiYXNlKTsKK30KKworc3RhdGljIHZvaWQgbnZfc3RvcF90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXU4IF9faW9tZW0gKmJhc2UgPSBnZXRfaHdiYXNlKGRldik7CisKKwlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl9zdG9wX3R4XG4iLCBkZXYtPm5hbWUpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdUcmFuc21pdHRlckNvbnRyb2wpOworCXJlZ19kZWxheShkZXYsIE52UmVnVHJhbnNtaXR0ZXJTdGF0dXMsIE5WUkVHX1hNSVRTVEFUX0JVU1ksIDAsCisJCQlOVl9UWFNUT1BfREVMQVkxLCBOVl9UWFNUT1BfREVMQVkxTUFYLAorCQkJS0VSTl9JTkZPICJudl9zdG9wX3R4OiBUcmFuc21pdHRlclN0YXR1cyByZW1haW5lZCBidXN5Iik7CisKKwl1ZGVsYXkoTlZfVFhTVE9QX0RFTEFZMik7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1Vua25vd25UcmFuc21pdHRlclJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIG52X3R4cnhfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBnZXRfbnZwcml2KGRldik7CisJdTggX19pb21lbSAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKKworCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X3R4cnhfcmVzZXRcbiIsIGRldi0+bmFtZSk7CisJd3JpdGVsKE5WUkVHX1RYUlhDVExfQklUMiB8IE5WUkVHX1RYUlhDVExfUkVTRVQgfCBucC0+ZGVzY192ZXIsIGJhc2UgKyBOdlJlZ1R4UnhDb250cm9sKTsKKwlwY2lfcHVzaChiYXNlKTsKKwl1ZGVsYXkoTlZfVFhSWF9SRVNFVF9ERUxBWSk7CisJd3JpdGVsKE5WUkVHX1RYUlhDVExfQklUMiB8IG5wLT5kZXNjX3ZlciwgYmFzZSArIE52UmVnVHhSeENvbnRyb2wpOworCXBjaV9wdXNoKGJhc2UpOworfQorCisvKgorICogbnZfZ2V0X3N0YXRzOiBkZXYtPmdldF9zdGF0cyBmdW5jdGlvbgorICogR2V0IGxhdGVzdCBzdGF0cyB2YWx1ZSBmcm9tIHRoZSBuaWMuCisgKiBDYWxsZWQgd2l0aCByZWFkX2xvY2soJmRldl9iYXNlX2xvY2spIGhlbGQgZm9yIHJlYWQgLQorICogb25seSBzeW5jaHJvbml6ZWQgYWdhaW5zdCB1bnJlZ2lzdGVyX25ldGRldmljZS4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpudl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBnZXRfbnZwcml2KGRldik7CisKKwkvKiBJdCBzZWVtcyB0aGF0IHRoZSBuaWMgYWx3YXlzIGdlbmVyYXRlcyBpbnRlcnJ1cHRzIGFuZCBkb2Vzbid0CisJICogYWNjdW11bGF0ZSBlcnJvcnMgaW50ZXJuYWxseS4gVGh1cyB0aGUgY3VycmVudCB2YWx1ZXMgaW4gbnAtPnN0YXRzCisJICogYXJlIGFscmVhZHkgdXAgdG8gZGF0ZS4KKwkgKi8KKwlyZXR1cm4gJm5wLT5zdGF0czsKK30KKworLyoKKyAqIG52X2FsbG9jX3J4OiBmaWxsIHJ4IHJpbmcgZW50cmllcy4KKyAqIFJldHVybiAxIGlmIHRoZSBhbGxvY2F0aW9ucyBmb3IgdGhlIHNrYnMgZmFpbGVkIGFuZCB0aGUKKyAqIHJ4IGVuZ2luZSBpcyB3aXRob3V0IEF2YWlsYWJsZSBkZXNjcmlwdG9ycworICovCitzdGF0aWMgaW50IG52X2FsbG9jX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOworCXVuc2lnbmVkIGludCByZWZpbGxfcnggPSBucC0+cmVmaWxsX3J4OworCWludCBucjsKKworCXdoaWxlIChucC0+Y3VyX3J4ICE9IHJlZmlsbF9yeCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCW5yID0gcmVmaWxsX3J4ICUgUlhfUklORzsKKwkJaWYgKG5wLT5yeF9za2J1ZmZbbnJdID09IE5VTEwpIHsKKworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihSWF9BTExPQ19CVUZTSVpFKTsKKwkJCWlmICghc2tiKQorCQkJCWJyZWFrOworCisJCQlza2ItPmRldiA9IGRldjsKKwkJCW5wLT5yeF9za2J1ZmZbbnJdID0gc2tiOworCQl9IGVsc2UgeworCQkJc2tiID0gbnAtPnJ4X3NrYnVmZltucl07CisJCX0KKwkJbnAtPnJ4X2RtYVtucl0gPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2Rldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwKKwkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCW5wLT5yeF9yaW5nW25yXS5QYWNrZXRCdWZmZXIgPSBjcHVfdG9fbGUzMihucC0+cnhfZG1hW25yXSk7CisJCXdtYigpOworCQlucC0+cnhfcmluZ1tucl0uRmxhZ0xlbiA9IGNwdV90b19sZTMyKFJYX05JQ19CVUZTSVpFIHwgTlZfUlhfQVZBSUwpOworCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl9hbGxvY19yeDogUGFja2V0ICVkIG1hcmtlZCBhcyBBdmFpbGFibGVcbiIsCisJCQkJCWRldi0+bmFtZSwgcmVmaWxsX3J4KTsKKwkJcmVmaWxsX3J4Kys7CisJfQorCW5wLT5yZWZpbGxfcnggPSByZWZpbGxfcng7CisJaWYgKG5wLT5jdXJfcnggLSByZWZpbGxfcnggPT0gUlhfUklORykKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG52X2RvX3J4X3JlZmlsbCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkYXRhOworCXN0cnVjdCBmZV9wcml2ICpucCA9IGdldF9udnByaXYoZGV2KTsKKworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlpZiAobnZfYWxsb2NfcngoZGV2KSkgeworCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwkJaWYgKCFucC0+aW5fc2h1dGRvd24pCisJCQltb2RfdGltZXIoJm5wLT5vb21fa2ljaywgamlmZmllcyArIE9PTV9SRUZJTEwpOworCQlzcGluX3VubG9jaygmbnAtPmxvY2spOworCX0KKwllbmFibGVfaXJxKGRldi0+aXJxKTsKK30KKworc3RhdGljIGludCBudl9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBnZXRfbnZwcml2KGRldik7CisJaW50IGk7CisKKwlucC0+bmV4dF90eCA9IG5wLT5uaWNfdHggPSAwOworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HOyBpKyspCisJCW5wLT50eF9yaW5nW2ldLkZsYWdMZW4gPSAwOworCisJbnAtPmN1cl9yeCA9IFJYX1JJTkc7CisJbnAtPnJlZmlsbF9yeCA9IDA7CisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkc7IGkrKykKKwkJbnAtPnJ4X3JpbmdbaV0uRmxhZ0xlbiA9IDA7CisJcmV0dXJuIG52X2FsbG9jX3J4KGRldik7Cit9CisKK3N0YXRpYyB2b2lkIG52X2RyYWluX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HOyBpKyspIHsKKwkJbnAtPnR4X3JpbmdbaV0uRmxhZ0xlbiA9IDA7CisJCWlmIChucC0+dHhfc2tidWZmW2ldKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBucC0+dHhfZG1hW2ldLAorCQkJCQkJbnAtPnR4X3NrYnVmZltpXS0+bGVuLAorCQkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKG5wLT50eF9za2J1ZmZbaV0pOworCQkJbnAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCQlucC0+c3RhdHMudHhfZHJvcHBlZCsrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBudl9kcmFpbl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZV9wcml2ICpucCA9IGdldF9udnByaXYoZGV2KTsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklORzsgaSsrKSB7CisJCW5wLT5yeF9yaW5nW2ldLkZsYWdMZW4gPSAwOworCQl3bWIoKTsKKwkJaWYgKG5wLT5yeF9za2J1ZmZbaV0pIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsIG5wLT5yeF9kbWFbaV0sCisJCQkJCQlucC0+cnhfc2tidWZmW2ldLT5sZW4sCisJCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihucC0+cnhfc2tidWZmW2ldKTsKKwkJCW5wLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBkcmFpbl9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbnZfZHJhaW5fdHgoZGV2KTsKKwludl9kcmFpbl9yeChkZXYpOworfQorCisvKgorICogbnZfc3RhcnRfeG1pdDogZGV2LT5oYXJkX3N0YXJ0X3htaXQgZnVuY3Rpb24KKyAqIENhbGxlZCB3aXRoIGRldi0+eG1pdF9sb2NrIGhlbGQuCisgKi8KK3N0YXRpYyBpbnQgbnZfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZV9wcml2ICpucCA9IGdldF9udnByaXYoZGV2KTsKKwlpbnQgbnIgPSBucC0+bmV4dF90eCAlIFRYX1JJTkc7CisKKwlucC0+dHhfc2tidWZmW25yXSA9IHNrYjsKKwlucC0+dHhfZG1hW25yXSA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPmRhdGEsc2tiLT5sZW4sCisJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCisJbnAtPnR4X3JpbmdbbnJdLlBhY2tldEJ1ZmZlciA9IGNwdV90b19sZTMyKG5wLT50eF9kbWFbbnJdKTsKKworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwl3bWIoKTsKKwlucC0+dHhfcmluZ1tucl0uRmxhZ0xlbiA9IGNwdV90b19sZTMyKCAoc2tiLT5sZW4tMSkgfCBucC0+dHhfZmxhZ3MgKTsKKwlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl9zdGFydF94bWl0OiBwYWNrZXQgcGFja2V0ICVkIHF1ZXVlZCBmb3IgdHJhbnNtaXNzaW9uLlxuIiwKKwkJCQlkZXYtPm5hbWUsIG5wLT5uZXh0X3R4KTsKKwl7CisJCWludCBqOworCQlmb3IgKGo9MDsgajw2NDsgaisrKSB7CisJCQlpZiAoKGolMTYpID09IDApCisJCQkJZHByaW50aygiXG4lMDN4OiIsIGopOworCQkJZHByaW50aygiICUwMngiLCAoKHVuc2lnbmVkIGNoYXIqKXNrYi0+ZGF0YSlbal0pOworCQl9CisJCWRwcmludGsoIlxuIik7CisJfQorCisJbnAtPm5leHRfdHgrKzsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCWlmIChucC0+bmV4dF90eCAtIG5wLT5uaWNfdHggPj0gVFhfTElNSVRfU1RPUCkKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCXdyaXRlbChOVlJFR19UWFJYQ1RMX0tJQ0t8bnAtPmRlc2NfdmVyLCBnZXRfaHdiYXNlKGRldikgKyBOdlJlZ1R4UnhDb250cm9sKTsKKwlwY2lfcHVzaChnZXRfaHdiYXNlKGRldikpOworCXJldHVybiAwOworfQorCisvKgorICogbnZfdHhfZG9uZTogY2hlY2sgZm9yIGNvbXBsZXRlZCBwYWNrZXRzLCByZWxlYXNlIHRoZSBza2JzLgorICoKKyAqIENhbGxlciBtdXN0IG93biBucC0+bG9jay4KKyAqLworc3RhdGljIHZvaWQgbnZfdHhfZG9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZV9wcml2ICpucCA9IGdldF9udnByaXYoZGV2KTsKKwl1MzIgRmxhZ3M7CisJaW50IGk7CisKKwl3aGlsZSAobnAtPm5pY190eCAhPSBucC0+bmV4dF90eCkgeworCQlpID0gbnAtPm5pY190eCAlIFRYX1JJTkc7CisKKwkJRmxhZ3MgPSBsZTMyX3RvX2NwdShucC0+dHhfcmluZ1tpXS5GbGFnTGVuKTsKKworCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl90eF9kb25lOiBsb29raW5nIGF0IHBhY2tldCAlZCwgRmxhZ3MgMHgleC5cbiIsCisJCQkJCWRldi0+bmFtZSwgbnAtPm5pY190eCwgRmxhZ3MpOworCQlpZiAoRmxhZ3MgJiBOVl9UWF9WQUxJRCkKKwkJCWJyZWFrOworCQlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEpIHsKKwkJCWlmIChGbGFncyAmIChOVl9UWF9SRVRSWUVSUk9SfE5WX1RYX0NBUlJJRVJMT1NUfE5WX1RYX0xBVEVDT0xMSVNJT058CisJCQkJCQkJTlZfVFhfVU5ERVJGTE9XfE5WX1RYX0VSUk9SKSkgeworCQkJCWlmIChGbGFncyAmIE5WX1RYX1VOREVSRkxPVykKKwkJCQkJbnAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkJaWYgKEZsYWdzICYgTlZfVFhfQ0FSUklFUkxPU1QpCisJCQkJCW5wLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCW5wLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCX0gZWxzZSB7CisJCQkJbnAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCQlucC0+c3RhdHMudHhfYnl0ZXMgKz0gbnAtPnR4X3NrYnVmZltpXS0+bGVuOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKEZsYWdzICYgKE5WX1RYMl9SRVRSWUVSUk9SfE5WX1RYMl9DQVJSSUVSTE9TVHxOVl9UWDJfTEFURUNPTExJU0lPTnwKKwkJCQkJCQlOVl9UWDJfVU5ERVJGTE9XfE5WX1RYMl9FUlJPUikpIHsKKwkJCQlpZiAoRmxhZ3MgJiBOVl9UWDJfVU5ERVJGTE9XKQorCQkJCQlucC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQlpZiAoRmxhZ3MgJiBOVl9UWDJfQ0FSUklFUkxPU1QpCisJCQkJCW5wLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCW5wLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCX0gZWxzZSB7CisJCQkJbnAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCQlucC0+c3RhdHMudHhfYnl0ZXMgKz0gbnAtPnR4X3NrYnVmZltpXS0+bGVuOworCQkJfQorCQl9CisJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsIG5wLT50eF9kbWFbaV0sCisJCQkJCW5wLT50eF9za2J1ZmZbaV0tPmxlbiwKKwkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCWRldl9rZnJlZV9za2JfaXJxKG5wLT50eF9za2J1ZmZbaV0pOworCQlucC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJbnAtPm5pY190eCsrOworCX0KKwlpZiAobnAtPm5leHRfdHggLSBucC0+bmljX3R4IDwgVFhfTElNSVRfU1RBUlQpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyoKKyAqIG52X3R4X3RpbWVvdXQ6IGRldi0+dHhfdGltZW91dCBmdW5jdGlvbgorICogQ2FsbGVkIHdpdGggZGV2LT54bWl0X2xvY2sgaGVsZC4KKyAqLworc3RhdGljIHZvaWQgbnZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZV9wcml2ICpucCA9IGdldF9udnByaXYoZGV2KTsKKwl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOworCisJZHByaW50ayhLRVJOX0RFQlVHICIlczogR290IHR4X3RpbWVvdXQuIGlycTogJTA4eFxuIiwgZGV2LT5uYW1lLAorCQkJcmVhZGwoYmFzZSArIE52UmVnSXJxU3RhdHVzKSAmIE5WUkVHX0lSUVNUQVRfTUFTSyk7CisKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisKKwkvKiAxKSBzdG9wIHR4IGVuZ2luZSAqLworCW52X3N0b3BfdHgoZGV2KTsKKworCS8qIDIpIGNoZWNrIHRoYXQgdGhlIHBhY2tldHMgd2VyZSBub3Qgc2VudCBhbHJlYWR5OiAqLworCW52X3R4X2RvbmUoZGV2KTsKKworCS8qIDMpIGlmIHRoZXJlIGFyZSBkZWFkIGVudHJpZXM6IGNsZWFyIGV2ZXJ5dGhpbmcgKi8KKwlpZiAobnAtPm5leHRfdHggIT0gbnAtPm5pY190eCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR4X3RpbWVvdXQ6IGRlYWQgZW50cmllcyFcbiIsIGRldi0+bmFtZSk7CisJCW52X2RyYWluX3R4KGRldik7CisJCW5wLT5uZXh0X3R4ID0gbnAtPm5pY190eCA9IDA7CisJCXdyaXRlbCgodTMyKSAobnAtPnJpbmdfYWRkciArIFJYX1JJTkcqc2l6ZW9mKHN0cnVjdCByaW5nX2Rlc2MpKSwgYmFzZSArIE52UmVnVHhSaW5nUGh5c0FkZHIpOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCisJLyogNCkgcmVzdGFydCB0eCBlbmdpbmUgKi8KKwludl9zdGFydF90eChkZXYpOworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBudl9yeF9wcm9jZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOworCXUzMiBGbGFnczsKKworCWZvciAoOzspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJaW50IGxlbjsKKwkJaW50IGk7CisJCWlmIChucC0+Y3VyX3J4IC0gbnAtPnJlZmlsbF9yeCA+PSBSWF9SSU5HKQorCQkJYnJlYWs7CS8qIHdlIHNjYW5uZWQgdGhlIHdob2xlIHJpbmcgLSBkbyBub3QgY29udGludWUgKi8KKworCQlpID0gbnAtPmN1cl9yeCAlIFJYX1JJTkc7CisJCUZsYWdzID0gbGUzMl90b19jcHUobnAtPnJ4X3JpbmdbaV0uRmxhZ0xlbik7CisJCWxlbiA9IG52X2Rlc2NyX2dldGxlbmd0aCgmbnAtPnJ4X3JpbmdbaV0sIG5wLT5kZXNjX3Zlcik7CisKKwkJZHByaW50ayhLRVJOX0RFQlVHICIlczogbnZfcnhfcHJvY2VzczogbG9va2luZyBhdCBwYWNrZXQgJWQsIEZsYWdzIDB4JXguXG4iLAorCQkJCQlkZXYtPm5hbWUsIG5wLT5jdXJfcngsIEZsYWdzKTsKKworCQlpZiAoRmxhZ3MgJiBOVl9SWF9BVkFJTCkKKwkJCWJyZWFrOwkvKiBzdGlsbCBvd25lZCBieSBoYXJkd2FyZSwgKi8KKworCQkvKgorCQkgKiB0aGUgcGFja2V0IGlzIGZvciB1cyAtIGltbWVkaWF0ZWx5IHRlYXIgZG93biB0aGUgcGNpIG1hcHBpbmcuCisJCSAqIFRPRE86IGNoZWNrIGlmIGEgcHJlZmV0Y2ggb2YgdGhlIGZpcnN0IGNhY2hlbGluZSBpbXByb3ZlcworCQkgKiB0aGUgcGVyZm9ybWFuY2UuCisJCSAqLworCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBucC0+cnhfZG1hW2ldLAorCQkJCW5wLT5yeF9za2J1ZmZbaV0tPmxlbiwKKwkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCXsKKwkJCWludCBqOworCQkJZHByaW50ayhLRVJOX0RFQlVHICJEdW1waW5nIHBhY2tldCAoZmxhZ3MgMHgleCkuIixGbGFncyk7CisJCQlmb3IgKGo9MDsgajw2NDsgaisrKSB7CisJCQkJaWYgKChqJTE2KSA9PSAwKQorCQkJCQlkcHJpbnRrKCJcbiUwM3g6Iiwgaik7CisJCQkJZHByaW50aygiICUwMngiLCAoKHVuc2lnbmVkIGNoYXIqKW5wLT5yeF9za2J1ZmZbaV0tPmRhdGEpW2pdKTsKKwkJCX0KKwkJCWRwcmludGsoIlxuIik7CisJCX0KKwkJLyogbG9vayBhdCB3aGF0IHdlIGFjdHVhbGx5IGdvdDogKi8KKwkJaWYgKG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8xKSB7CisJCQlpZiAoIShGbGFncyAmIE5WX1JYX0RFU0NSSVBUT1JWQUxJRCkpCisJCQkJZ290byBuZXh0X3BrdDsKKworCQkJaWYgKEZsYWdzICYgTlZfUlhfTUlTU0VERlJBTUUpIHsKKwkJCQlucC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycysrOworCQkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlnb3RvIG5leHRfcGt0OworCQkJfQorCQkJaWYgKEZsYWdzICYgKE5WX1JYX0VSUk9SMXxOVl9SWF9FUlJPUjJ8TlZfUlhfRVJST1IzfE5WX1JYX0VSUk9SNCkpIHsKKwkJCQlucC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJZ290byBuZXh0X3BrdDsKKwkJCX0KKwkJCWlmIChGbGFncyAmIE5WX1JYX0NSQ0VSUikgeworCQkJCW5wLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCWdvdG8gbmV4dF9wa3Q7CisJCQl9CisJCQlpZiAoRmxhZ3MgJiBOVl9SWF9PVkVSRkxPVykgeworCQkJCW5wLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlnb3RvIG5leHRfcGt0OworCQkJfQorCQkJaWYgKEZsYWdzICYgTlZfUlhfRVJST1IpIHsKKwkJCQkvKiBmcmFtaW5nIGVycm9ycyBhcmUgc29mdCBlcnJvcnMsIHRoZSByZXN0IGlzIGZhdGFsLiAqLworCQkJCWlmIChGbGFncyAmIE5WX1JYX0ZSQU1JTkdFUlIpIHsKKwkJCQkJaWYgKEZsYWdzICYgTlZfUlhfU1VCU1RSQUNUMSkgeworCQkJCQkJbGVuLS07CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlucC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCWdvdG8gbmV4dF9wa3Q7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCEoRmxhZ3MgJiBOVl9SWDJfREVTQ1JJUFRPUlZBTElEKSkKKwkJCQlnb3RvIG5leHRfcGt0OworCisJCQlpZiAoRmxhZ3MgJiAoTlZfUlgyX0VSUk9SMXxOVl9SWDJfRVJST1IyfE5WX1JYMl9FUlJPUjN8TlZfUlgyX0VSUk9SNCkpIHsKKwkJCQlucC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJZ290byBuZXh0X3BrdDsKKwkJCX0KKwkJCWlmIChGbGFncyAmIE5WX1JYMl9DUkNFUlIpIHsKKwkJCQlucC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlnb3RvIG5leHRfcGt0OworCQkJfQorCQkJaWYgKEZsYWdzICYgTlZfUlgyX09WRVJGTE9XKSB7CisJCQkJbnAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCWdvdG8gbmV4dF9wa3Q7CisJCQl9CisJCQlpZiAoRmxhZ3MgJiBOVl9SWDJfRVJST1IpIHsKKwkJCQkvKiBmcmFtaW5nIGVycm9ycyBhcmUgc29mdCBlcnJvcnMsIHRoZSByZXN0IGlzIGZhdGFsLiAqLworCQkJCWlmIChGbGFncyAmIE5WX1JYMl9GUkFNSU5HRVJSKSB7CisJCQkJCWlmIChGbGFncyAmIE5WX1JYMl9TVUJTVFJBQ1QxKSB7CisJCQkJCQlsZW4tLTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQkJZ290byBuZXh0X3BrdDsKKwkJCQl9CisJCQl9CisJCQlGbGFncyAmPSBOVl9SWDJfQ0hFQ0tTVU1NQVNLOworCQkJaWYgKEZsYWdzID09IE5WX1JYMl9DSEVDS1NVTU9LMSB8fAorCQkJCQlGbGFncyA9PSBOVl9SWDJfQ0hFQ0tTVU1PSzIgfHwKKwkJCQkJRmxhZ3MgPT0gTlZfUlgyX0NIRUNLU1VNT0szKSB7CisJCQkJZHByaW50ayhLRVJOX0RFQlVHICIlczogaHcgY2hlY2tzdW0gaGl0IS5cbiIsIGRldi0+bmFtZSk7CisJCQkJbnAtPnJ4X3NrYnVmZltpXS0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCQl9IGVsc2UgeworCQkJCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IGh3Y2hlY2tzdW0gbWlzcyEuXG4iLCBkZXYtPm5hbWUpOworCQkJfQorCQl9CisJCS8qIGdvdCBhIHZhbGlkIHBhY2tldCAtIGZvcndhcmQgaXQgdG8gdGhlIG5ldHdvcmsgY29yZSAqLworCQlza2IgPSBucC0+cnhfc2tidWZmW2ldOworCQlucC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKworCQlza2JfcHV0KHNrYiwgbGVuKTsKKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJZHByaW50ayhLRVJOX0RFQlVHICIlczogbnZfcnhfcHJvY2VzczogcGFja2V0ICVkIHdpdGggJWQgYnl0ZXMsIHByb3RvICVkIGFjY2VwdGVkLlxuIiwKKwkJCQkJZGV2LT5uYW1lLCBucC0+Y3VyX3J4LCBsZW4sIHNrYi0+cHJvdG9jb2wpOworCQluZXRpZl9yeChza2IpOworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlucC0+c3RhdHMucnhfcGFja2V0cysrOworCQlucC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworbmV4dF9wa3Q6CisJCW5wLT5jdXJfcngrKzsKKwl9Cit9CisKKy8qCisgKiBudl9jaGFuZ2VfbXR1OiBkZXYtPmNoYW5nZV9tdHUgZnVuY3Rpb24KKyAqIENhbGxlZCB3aXRoIGRldl9iYXNlX2xvY2sgaGVsZCBmb3IgcmVhZC4KKyAqLworc3RhdGljIGludCBudl9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCWlmIChuZXdfbXR1ID4gRVRIX0RBVEFfTEVOKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZXYtPm10dSA9IG5ld19tdHU7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBudl9zZXRfbXVsdGljYXN0OiBkZXYtPnNldF9tdWx0aWNhc3QgZnVuY3Rpb24KKyAqIENhbGxlZCB3aXRoIGRldi0+eG1pdF9sb2NrIGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIG52X3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBnZXRfbnZwcml2KGRldik7CisJdTggX19pb21lbSAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKKwl1MzIgYWRkclsyXTsKKwl1MzIgbWFza1syXTsKKwl1MzIgcGZmOworCisJbWVtc2V0KGFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJbWVtc2V0KG1hc2ssIDAsIHNpemVvZihtYXNrKSk7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CisJCXBmZiA9IE5WUkVHX1BGRl9QUk9NSVNDOworCX0gZWxzZSB7CisJCXBmZiA9IE5WUkVHX1BGRl9NWUFERFI7CisKKwkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgfHwgZGV2LT5tY19saXN0KSB7CisJCQl1MzIgYWx3YXlzT2ZmWzJdOworCQkJdTMyIGFsd2F5c09uWzJdOworCisJCQlhbHdheXNPblswXSA9IGFsd2F5c09uWzFdID0gYWx3YXlzT2ZmWzBdID0gYWx3YXlzT2ZmWzFdID0gMHhmZmZmZmZmZjsKKwkJCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCQkJYWx3YXlzT25bMF0gPSBhbHdheXNPblsxXSA9IGFsd2F5c09mZlswXSA9IGFsd2F5c09mZlsxXSA9IDA7CisJCQl9IGVsc2UgeworCQkJCXN0cnVjdCBkZXZfbWNfbGlzdCAqd2FsazsKKworCQkJCXdhbGsgPSBkZXYtPm1jX2xpc3Q7CisJCQkJd2hpbGUgKHdhbGsgIT0gTlVMTCkgeworCQkJCQl1MzIgYSwgYjsKKwkJCQkJYSA9IGxlMzJfdG9fY3B1KCoodTMyICopIHdhbGstPmRtaV9hZGRyKTsKKwkJCQkJYiA9IGxlMTZfdG9fY3B1KCoodTE2ICopICgmd2Fsay0+ZG1pX2FkZHJbNF0pKTsKKwkJCQkJYWx3YXlzT25bMF0gJj0gYTsKKwkJCQkJYWx3YXlzT2ZmWzBdICY9IH5hOworCQkJCQlhbHdheXNPblsxXSAmPSBiOworCQkJCQlhbHdheXNPZmZbMV0gJj0gfmI7CisJCQkJCXdhbGsgPSB3YWxrLT5uZXh0OworCQkJCX0KKwkJCX0KKwkJCWFkZHJbMF0gPSBhbHdheXNPblswXTsKKwkJCWFkZHJbMV0gPSBhbHdheXNPblsxXTsKKwkJCW1hc2tbMF0gPSBhbHdheXNPblswXSB8IGFsd2F5c09mZlswXTsKKwkJCW1hc2tbMV0gPSBhbHdheXNPblsxXSB8IGFsd2F5c09mZlsxXTsKKwkJfQorCX0KKwlhZGRyWzBdIHw9IE5WUkVHX01DQVNUQUREUkFfRk9SQ0U7CisJcGZmIHw9IE5WUkVHX1BGRl9BTFdBWVM7CisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCW52X3N0b3BfcngoZGV2KTsKKwl3cml0ZWwoYWRkclswXSwgYmFzZSArIE52UmVnTXVsdGljYXN0QWRkckEpOworCXdyaXRlbChhZGRyWzFdLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RBZGRyQik7CisJd3JpdGVsKG1hc2tbMF0sIGJhc2UgKyBOdlJlZ011bHRpY2FzdE1hc2tBKTsKKwl3cml0ZWwobWFza1sxXSwgYmFzZSArIE52UmVnTXVsdGljYXN0TWFza0IpOworCXdyaXRlbChwZmYsIGJhc2UgKyBOdlJlZ1BhY2tldEZpbHRlckZsYWdzKTsKKwlkcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlY29uZmlndXJhdGlvbiBmb3IgbXVsdGljYXN0IGxpc3RzLlxuIiwKKwkJZGV2LT5uYW1lKTsKKwludl9zdGFydF9yeChkZXYpOworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworfQorCitzdGF0aWMgaW50IG52X3VwZGF0ZV9saW5rc3BlZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBnZXRfbnZwcml2KGRldik7CisJdTggX19pb21lbSAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKKwlpbnQgYWR2LCBscGE7CisJaW50IG5ld2xzID0gbnAtPmxpbmtzcGVlZDsKKwlpbnQgbmV3ZHVwID0gbnAtPmR1cGxleDsKKwlpbnQgbWlpX3N0YXR1czsKKwlpbnQgcmV0dmFsID0gMDsKKwl1MzIgY29udHJvbF8xMDAwLCBzdGF0dXNfMTAwMCwgcGh5cmVnOworCisJLyogQk1TUl9MU1RBVFVTIGlzIGxhdGNoZWQsIHJlYWQgaXQgdHdpY2U6CisJICogd2Ugd2FudCB0aGUgY3VycmVudCB2YWx1ZS4KKwkgKi8KKwltaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0JNU1IsIE1JSV9SRUFEKTsKKwltaWlfc3RhdHVzID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9CTVNSLCBNSUlfUkVBRCk7CisKKwlpZiAoIShtaWlfc3RhdHVzICYgQk1TUl9MU1RBVFVTKSkgeworCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBubyBsaW5rIGRldGVjdGVkIGJ5IHBoeSAtIGZhbGxpbmcgYmFjayB0byAxMEhELlxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQluZXdscyA9IE5WUkVHX0xJTktTUEVFRF9GT1JDRXxOVlJFR19MSU5LU1BFRURfMTA7CisJCW5ld2R1cCA9IDA7CisJCXJldHZhbCA9IDA7CisJCWdvdG8gc2V0X3NwZWVkOworCX0KKworCWlmIChucC0+YXV0b25lZyA9PSAwKSB7CisJCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X3VwZGF0ZV9saW5rc3BlZWQ6IGF1dG9uZWcgb2ZmLCBQSFkgc2V0IHRvIDB4JTA0eC5cbiIsCisJCQkJZGV2LT5uYW1lLCBucC0+Zml4ZWRfbW9kZSk7CisJCWlmIChucC0+Zml4ZWRfbW9kZSAmIExQQV8xMDBGVUxMKSB7CisJCQluZXdscyA9IE5WUkVHX0xJTktTUEVFRF9GT1JDRXxOVlJFR19MSU5LU1BFRURfMTAwOworCQkJbmV3ZHVwID0gMTsKKwkJfSBlbHNlIGlmIChucC0+Zml4ZWRfbW9kZSAmIExQQV8xMDBIQUxGKSB7CisJCQluZXdscyA9IE5WUkVHX0xJTktTUEVFRF9GT1JDRXxOVlJFR19MSU5LU1BFRURfMTAwOworCQkJbmV3ZHVwID0gMDsKKwkJfSBlbHNlIGlmIChucC0+Zml4ZWRfbW9kZSAmIExQQV8xMEZVTEwpIHsKKwkJCW5ld2xzID0gTlZSRUdfTElOS1NQRUVEX0ZPUkNFfE5WUkVHX0xJTktTUEVFRF8xMDsKKwkJCW5ld2R1cCA9IDE7CisJCX0gZWxzZSB7CisJCQluZXdscyA9IE5WUkVHX0xJTktTUEVFRF9GT1JDRXxOVlJFR19MSU5LU1BFRURfMTA7CisJCQluZXdkdXAgPSAwOworCQl9CisJCXJldHZhbCA9IDE7CisJCWdvdG8gc2V0X3NwZWVkOworCX0KKwkvKiBjaGVjayBhdXRvIG5lZ290aWF0aW9uIGlzIGNvbXBsZXRlICovCisJaWYgKCEobWlpX3N0YXR1cyAmIEJNU1JfQU5FR0NPTVBMRVRFKSkgeworCQkvKiBzdGlsbCBpbiBhdXRvbmVnb3RpYXRpb24gLSBjb25maWd1cmUgbmljIGZvciAxMCBNQml0IEhEIGFuZCB3YWl0LiAqLworCQluZXdscyA9IE5WUkVHX0xJTktTUEVFRF9GT1JDRXxOVlJFR19MSU5LU1BFRURfMTA7CisJCW5ld2R1cCA9IDA7CisJCXJldHZhbCA9IDA7CisJCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IGF1dG9uZWcgbm90IGNvbXBsZXRlZCAtIGZhbGxpbmcgYmFjayB0byAxMEhELlxuIiwgZGV2LT5uYW1lKTsKKwkJZ290byBzZXRfc3BlZWQ7CisJfQorCisJcmV0dmFsID0gMTsKKwlpZiAobnAtPmdpZ2FiaXQgPT0gUEhZX0dJR0FCSVQpIHsKKwkJY29udHJvbF8xMDAwID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV8xMDAwQlRfQ1IsIE1JSV9SRUFEKTsKKwkJc3RhdHVzXzEwMDAgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJXzEwMDBCVF9TUiwgTUlJX1JFQUQpOworCisJCWlmICgoY29udHJvbF8xMDAwICYgQURWRVJUSVNFXzEwMDBGVUxMKSAmJgorCQkJKHN0YXR1c18xMDAwICYgTFBBXzEwMDBGVUxMKSkgeworCQkJZHByaW50ayhLRVJOX0RFQlVHICIlczogbnZfdXBkYXRlX2xpbmtzcGVlZDogR0JpdCBldGhlcm5ldCBkZXRlY3RlZC5cbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJCW5ld2xzID0gTlZSRUdfTElOS1NQRUVEX0ZPUkNFfE5WUkVHX0xJTktTUEVFRF8xMDAwOworCQkJbmV3ZHVwID0gMTsKKwkJCWdvdG8gc2V0X3NwZWVkOworCQl9CisJfQorCisJYWR2ID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9BRFZFUlRJU0UsIE1JSV9SRUFEKTsKKwlscGEgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0xQQSwgTUlJX1JFQUQpOworCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X3VwZGF0ZV9saW5rc3BlZWQ6IFBIWSBhZHZlcnRpc2VzIDB4JTA0eCwgbHBhIDB4JTA0eC5cbiIsCisJCQkJZGV2LT5uYW1lLCBhZHYsIGxwYSk7CisKKwkvKiBGSVhNRTogaGFuZGxlIHBhcmFsbGVsIGRldGVjdGlvbiBwcm9wZXJseSAqLworCWxwYSA9IGxwYSAmIGFkdjsKKwlpZiAobHBhICYgTFBBXzEwMEZVTEwpIHsKKwkJbmV3bHMgPSBOVlJFR19MSU5LU1BFRURfRk9SQ0V8TlZSRUdfTElOS1NQRUVEXzEwMDsKKwkJbmV3ZHVwID0gMTsKKwl9IGVsc2UgaWYgKGxwYSAmIExQQV8xMDBIQUxGKSB7CisJCW5ld2xzID0gTlZSRUdfTElOS1NQRUVEX0ZPUkNFfE5WUkVHX0xJTktTUEVFRF8xMDA7CisJCW5ld2R1cCA9IDA7CisJfSBlbHNlIGlmIChscGEgJiBMUEFfMTBGVUxMKSB7CisJCW5ld2xzID0gTlZSRUdfTElOS1NQRUVEX0ZPUkNFfE5WUkVHX0xJTktTUEVFRF8xMDsKKwkJbmV3ZHVwID0gMTsKKwl9IGVsc2UgaWYgKGxwYSAmIExQQV8xMEhBTEYpIHsKKwkJbmV3bHMgPSBOVlJFR19MSU5LU1BFRURfRk9SQ0V8TlZSRUdfTElOS1NQRUVEXzEwOworCQluZXdkdXAgPSAwOworCX0gZWxzZSB7CisJCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJhZCBhYmlsaXR5ICUwNHggLSBmYWxsaW5nIGJhY2sgdG8gMTBIRC5cbiIsIGRldi0+bmFtZSwgbHBhKTsKKwkJbmV3bHMgPSBOVlJFR19MSU5LU1BFRURfRk9SQ0V8TlZSRUdfTElOS1NQRUVEXzEwOworCQluZXdkdXAgPSAwOworCX0KKworc2V0X3NwZWVkOgorCWlmIChucC0+ZHVwbGV4ID09IG5ld2R1cCAmJiBucC0+bGlua3NwZWVkID09IG5ld2xzKQorCQlyZXR1cm4gcmV0dmFsOworCisJZHByaW50ayhLRVJOX0lORk8gIiVzOiBjaGFuZ2luZyBsaW5rIHNldHRpbmcgZnJvbSAlZC8lZCB0byAlZC8lZC5cbiIsCisJCQlkZXYtPm5hbWUsIG5wLT5saW5rc3BlZWQsIG5wLT5kdXBsZXgsIG5ld2xzLCBuZXdkdXApOworCisJbnAtPmR1cGxleCA9IG5ld2R1cDsKKwlucC0+bGlua3NwZWVkID0gbmV3bHM7CisKKwlpZiAobnAtPmdpZ2FiaXQgPT0gUEhZX0dJR0FCSVQpIHsKKwkJcGh5cmVnID0gcmVhZGwoYmFzZSArIE52UmVnUmFuZG9tU2VlZCk7CisJCXBoeXJlZyAmPSB+KDB4M0ZGMDApOworCQlpZiAoKG5wLT5saW5rc3BlZWQgJiAweEZGRikgPT0gTlZSRUdfTElOS1NQRUVEXzEwKQorCQkJcGh5cmVnIHw9IE5WUkVHX1JORFNFRURfRk9SQ0UzOworCQllbHNlIGlmICgobnAtPmxpbmtzcGVlZCAmIDB4RkZGKSA9PSBOVlJFR19MSU5LU1BFRURfMTAwKQorCQkJcGh5cmVnIHw9IE5WUkVHX1JORFNFRURfRk9SQ0UyOworCQllbHNlIGlmICgobnAtPmxpbmtzcGVlZCAmIDB4RkZGKSA9PSBOVlJFR19MSU5LU1BFRURfMTAwMCkKKwkJCXBoeXJlZyB8PSBOVlJFR19STkRTRUVEX0ZPUkNFOworCQl3cml0ZWwocGh5cmVnLCBiYXNlICsgTnZSZWdSYW5kb21TZWVkKTsKKwl9CisKKwlwaHlyZWcgPSByZWFkbChiYXNlICsgTnZSZWdQaHlJbnRlcmZhY2UpOworCXBoeXJlZyAmPSB+KFBIWV9IQUxGfFBIWV8xMDB8UEhZXzEwMDApOworCWlmIChucC0+ZHVwbGV4ID09IDApCisJCXBoeXJlZyB8PSBQSFlfSEFMRjsKKwlpZiAoKG5wLT5saW5rc3BlZWQgJiBOVlJFR19MSU5LU1BFRURfTUFTSykgPT0gTlZSRUdfTElOS1NQRUVEXzEwMCkKKwkJcGh5cmVnIHw9IFBIWV8xMDA7CisJZWxzZSBpZiAoKG5wLT5saW5rc3BlZWQgJiBOVlJFR19MSU5LU1BFRURfTUFTSykgPT0gTlZSRUdfTElOS1NQRUVEXzEwMDApCisJCXBoeXJlZyB8PSBQSFlfMTAwMDsKKwl3cml0ZWwocGh5cmVnLCBiYXNlICsgTnZSZWdQaHlJbnRlcmZhY2UpOworCisJd3JpdGVsKE5WUkVHX01JU0MxX0ZPUkNFIHwgKCBucC0+ZHVwbGV4ID8gMCA6IE5WUkVHX01JU0MxX0hEKSwKKwkJYmFzZSArIE52UmVnTWlzYzEpOworCXBjaV9wdXNoKGJhc2UpOworCXdyaXRlbChucC0+bGlua3NwZWVkLCBiYXNlICsgTnZSZWdMaW5rU3BlZWQpOworCXBjaV9wdXNoKGJhc2UpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgbnZfbGlua2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmIChudl91cGRhdGVfbGlua3NwZWVkKGRldikpIHsKKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQkJbnZfc3RvcF9yeChkZXYpOworCQl9IGVsc2UgeworCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgdXAuXG4iLCBkZXYtPm5hbWUpOworCQl9CisJCW52X3N0YXJ0X3J4KGRldik7CisJfSBlbHNlIHsKKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIGRvd24uXG4iLCBkZXYtPm5hbWUpOworCQkJbnZfc3RvcF9yeChkZXYpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBudl9saW5rX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXU4IF9faW9tZW0gKmJhc2UgPSBnZXRfaHdiYXNlKGRldik7CisJdTMyIG1paXN0YXQ7CisKKwltaWlzdGF0ID0gcmVhZGwoYmFzZSArIE52UmVnTUlJU3RhdHVzKTsKKwl3cml0ZWwoTlZSRUdfTUlJU1RBVF9NQVNLLCBiYXNlICsgTnZSZWdNSUlTdGF0dXMpOworCWRwcmludGsoS0VSTl9JTkZPICIlczogbGluayBjaGFuZ2UgaXJxLCBzdGF0dXMgMHgleC5cbiIsIGRldi0+bmFtZSwgbWlpc3RhdCk7CisKKwlpZiAobWlpc3RhdCAmIChOVlJFR19NSUlTVEFUX0xJTktDSEFOR0UpKQorCQludl9saW5rY2hhbmdlKGRldik7CisJZHByaW50ayhLRVJOX0RFQlVHICIlczogbGluayBjaGFuZ2Ugbm90aWZpY2F0aW9uIGRvbmUuXG4iLCBkZXYtPm5hbWUpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbnZfbmljX2lycShpbnQgZm9vLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gZ2V0X252cHJpdihkZXYpOworCXU4IF9faW9tZW0gKmJhc2UgPSBnZXRfaHdiYXNlKGRldik7CisJdTMyIGV2ZW50czsKKwlpbnQgaTsKKworCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X25pY19pcnFcbiIsIGRldi0+bmFtZSk7CisKKwlmb3IgKGk9MDsgOyBpKyspIHsKKwkJZXZlbnRzID0gcmVhZGwoYmFzZSArIE52UmVnSXJxU3RhdHVzKSAmIE5WUkVHX0lSUVNUQVRfTUFTSzsKKwkJd3JpdGVsKE5WUkVHX0lSUVNUQVRfTUFTSywgYmFzZSArIE52UmVnSXJxU3RhdHVzKTsKKwkJcGNpX3B1c2goYmFzZSk7CisJCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlycTogJTA4eFxuIiwgZGV2LT5uYW1lLCBldmVudHMpOworCQlpZiAoIShldmVudHMgJiBucC0+aXJxbWFzaykpCisJCQlicmVhazsKKworCQlpZiAoZXZlbnRzICYgKE5WUkVHX0lSUV9UWDF8TlZSRUdfSVJRX1RYMnxOVlJFR19JUlFfVFhfRVJSKSkgeworCQkJc3Bpbl9sb2NrKCZucC0+bG9jayk7CisJCQludl90eF9kb25lKGRldik7CisJCQlzcGluX3VubG9jaygmbnAtPmxvY2spOworCQl9CisKKwkJaWYgKGV2ZW50cyAmIChOVlJFR19JUlFfUlhfRVJST1J8TlZSRUdfSVJRX1JYfE5WUkVHX0lSUV9SWF9OT0JVRikpIHsKKwkJCW52X3J4X3Byb2Nlc3MoZGV2KTsKKwkJCWlmIChudl9hbGxvY19yeChkZXYpKSB7CisJCQkJc3Bpbl9sb2NrKCZucC0+bG9jayk7CisJCQkJaWYgKCFucC0+aW5fc2h1dGRvd24pCisJCQkJCW1vZF90aW1lcigmbnAtPm9vbV9raWNrLCBqaWZmaWVzICsgT09NX1JFRklMTCk7CisJCQkJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKKwkJCX0KKwkJfQorCisJCWlmIChldmVudHMgJiBOVlJFR19JUlFfTElOSykgeworCQkJc3Bpbl9sb2NrKCZucC0+bG9jayk7CisJCQludl9saW5rX2lycShkZXYpOworCQkJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKKwkJfQorCQlpZiAobnAtPm5lZWRfbGlua3RpbWVyICYmIHRpbWVfYWZ0ZXIoamlmZmllcywgbnAtPmxpbmtfdGltZW91dCkpIHsKKwkJCXNwaW5fbG9jaygmbnAtPmxvY2spOworCQkJbnZfbGlua2NoYW5nZShkZXYpOworCQkJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKKwkJCW5wLT5saW5rX3RpbWVvdXQgPSBqaWZmaWVzICsgTElOS19USU1FT1VUOworCQl9CisJCWlmIChldmVudHMgJiAoTlZSRUdfSVJRX1RYX0VSUikpIHsKKwkJCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlY2VpdmVkIGlycSB3aXRoIGV2ZW50cyAweCV4LiBQcm9iYWJseSBUWCBmYWlsLlxuIiwKKwkJCQkJCWRldi0+bmFtZSwgZXZlbnRzKTsKKwkJfQorCQlpZiAoZXZlbnRzICYgKE5WUkVHX0lSUV9VTktOT1dOKSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZWNlaXZlZCBpcnEgd2l0aCB1bmtub3duIGV2ZW50cyAweCV4LiBQbGVhc2UgcmVwb3J0XG4iLAorCQkJCQkJZGV2LT5uYW1lLCBldmVudHMpOworCQl9CisJCWlmIChpID4gbWF4X2ludGVycnVwdF93b3JrKSB7CisJCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwkJCS8qIGRpc2FibGUgaW50ZXJydXB0cyBvbiB0aGUgbmljICovCisJCQl3cml0ZWwoMCwgYmFzZSArIE52UmVnSXJxTWFzayk7CisJCQlwY2lfcHVzaChiYXNlKTsKKworCQkJaWYgKCFucC0+aW5fc2h1dGRvd24pCisJCQkJbW9kX3RpbWVyKCZucC0+bmljX3BvbGwsIGppZmZpZXMgKyBQT0xMX1dBSVQpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0b28gbWFueSBpdGVyYXRpb25zICglZCkgaW4gbnZfbmljX2lycS5cbiIsIGRldi0+bmFtZSwgaSk7CisJCQlzcGluX3VubG9jaygmbnAtPmxvY2spOworCQkJYnJlYWs7CisJCX0KKworCX0KKwlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl9uaWNfaXJxIGNvbXBsZXRlZFxuIiwgZGV2LT5uYW1lKTsKKworCXJldHVybiBJUlFfUkVUVkFMKGkpOworfQorCitzdGF0aWMgdm9pZCBudl9kb19uaWNfcG9sbCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkYXRhOworCXN0cnVjdCBmZV9wcml2ICpucCA9IGdldF9udnByaXYoZGV2KTsKKwl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOworCisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCS8qIEZJWE1FOiBEbyB3ZSBuZWVkIHN5bmNocm9uaXplX2lycShkZXYtPmlycSkgaGVyZT8gKi8KKwkvKgorCSAqIHJlZW5hYmxlIGludGVycnVwdHMgb24gdGhlIG5pYywgd2UgaGF2ZSB0byBkbyB0aGlzIGJlZm9yZSBjYWxsaW5nCisJICogbnZfbmljX2lycSBiZWNhdXNlIHRoYXQgbWF5IGRlY2lkZSB0byBkbyBvdGhlcndpc2UKKwkgKi8KKwl3cml0ZWwobnAtPmlycW1hc2ssIGJhc2UgKyBOdlJlZ0lycU1hc2spOworCXBjaV9wdXNoKGJhc2UpOworCW52X25pY19pcnEoKGludCkgMCwgKHZvaWQgKikgZGF0YSwgKHN0cnVjdCBwdF9yZWdzICopIE5VTEwpOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworfQorCitzdGF0aWMgdm9pZCBudl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBmZV9wcml2ICpucCA9IGdldF9udnByaXYoZGV2KTsKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCAiZm9yY2VkZXRoIik7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIEZPUkNFREVUSF9WRVJTSU9OKTsKKwlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7Cit9CisKK3N0YXRpYyB2b2lkIG52X2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29saW5mbykKK3sKKwlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBnZXRfbnZwcml2KGRldik7CisJd29saW5mby0+c3VwcG9ydGVkID0gV0FLRV9NQUdJQzsKKworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwlpZiAobnAtPndvbGVuYWJsZWQpCisJCXdvbGluZm8tPndvbG9wdHMgPSBXQUtFX01BR0lDOworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworfQorCitzdGF0aWMgaW50IG52X3NldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29saW5mbykKK3sKKwlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBnZXRfbnZwcml2KGRldik7CisJdTggX19pb21lbSAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKKworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwlpZiAod29saW5mby0+d29sb3B0cyA9PSAwKSB7CisJCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdXYWtlVXBGbGFncyk7CisJCW5wLT53b2xlbmFibGVkID0gMDsKKwl9CisJaWYgKHdvbGluZm8tPndvbG9wdHMgJiBXQUtFX01BR0lDKSB7CisJCXdyaXRlbChOVlJFR19XQUtFVVBGTEFHU19FTkFCTEUsIGJhc2UgKyBOdlJlZ1dha2VVcEZsYWdzKTsKKwkJbnAtPndvbGVuYWJsZWQgPSAxOworCX0KKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBudl9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBmZV9wcml2ICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGFkdjsKKworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwllY21kLT5wb3J0ID0gUE9SVF9NSUk7CisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJLyogV2UgZG8gbm90IHRyYWNrIGxpbmsgc3BlZWQgLyBkdXBsZXggc2V0dGluZyBpZiB0aGUKKwkJICogaW50ZXJmYWNlIGlzIGRpc2FibGVkLiBGb3JjZSBhIGxpbmsgY2hlY2sgKi8KKwkJbnZfdXBkYXRlX2xpbmtzcGVlZChkZXYpOworCX0KKwlzd2l0Y2gobnAtPmxpbmtzcGVlZCAmIChOVlJFR19MSU5LU1BFRURfTUFTSykpIHsKKwkJY2FzZSBOVlJFR19MSU5LU1BFRURfMTA6CisJCQllY21kLT5zcGVlZCA9IFNQRUVEXzEwOworCQkJYnJlYWs7CisJCWNhc2UgTlZSRUdfTElOS1NQRUVEXzEwMDoKKwkJCWVjbWQtPnNwZWVkID0gU1BFRURfMTAwOworCQkJYnJlYWs7CisJCWNhc2UgTlZSRUdfTElOS1NQRUVEXzEwMDA6CisJCQllY21kLT5zcGVlZCA9IFNQRUVEXzEwMDA7CisJCQlicmVhazsKKwl9CisJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJaWYgKG5wLT5kdXBsZXgpCisJCWVjbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOworCisJZWNtZC0+YXV0b25lZyA9IG5wLT5hdXRvbmVnOworCisJZWNtZC0+YWR2ZXJ0aXNpbmcgPSBBRFZFUlRJU0VEX01JSTsKKwlpZiAobnAtPmF1dG9uZWcpIHsKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9BdXRvbmVnOworCQlhZHYgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0FEVkVSVElTRSwgTUlJX1JFQUQpOworCX0gZWxzZSB7CisJCWFkdiA9IG5wLT5maXhlZF9tb2RlOworCX0KKwlpZiAoYWR2ICYgQURWRVJUSVNFXzEwSEFMRikKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMGJhc2VUX0hhbGY7CisJaWYgKGFkdiAmIEFEVkVSVElTRV8xMEZVTEwpCisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsOworCWlmIChhZHYgJiBBRFZFUlRJU0VfMTAwSEFMRikKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmOworCWlmIChhZHYgJiBBRFZFUlRJU0VfMTAwRlVMTCkKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsOworCWlmIChucC0+YXV0b25lZyAmJiBucC0+Z2lnYWJpdCA9PSBQSFlfR0lHQUJJVCkgeworCQlhZHYgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJXzEwMDBCVF9DUiwgTUlJX1JFQUQpOworCQlpZiAoYWR2ICYgQURWRVJUSVNFXzEwMDBGVUxMKQorCQkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbDsKKwl9CisKKwllY21kLT5zdXBwb3J0ZWQgPSAoU1VQUE9SVEVEX0F1dG9uZWcgfAorCQlTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CisJCVNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfAorCQlTVVBQT1JURURfTUlJKTsKKwlpZiAobnAtPmdpZ2FiaXQgPT0gUEhZX0dJR0FCSVQpCisJCWVjbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGw7CisKKwllY21kLT5waHlfYWRkcmVzcyA9IG5wLT5waHlhZGRyOworCWVjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9FWFRFUk5BTDsKKworCS8qIGlnbm9yZSBtYXh0eHBrdCwgbWF4cnhwa3QgZm9yIG5vdyAqLworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG52X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChlY21kLT5wb3J0ICE9IFBPUlRfTUlJKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZWNtZC0+dHJhbnNjZWl2ZXIgIT0gWENWUl9FWFRFUk5BTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGVjbWQtPnBoeV9hZGRyZXNzICE9IG5wLT5waHlhZGRyKSB7CisJCS8qIFRPRE86IHN1cHBvcnQgc3dpdGNoaW5nIGJldHdlZW4gbXVsdGlwbGUgcGh5cy4gU2hvdWxkIGJlCisJCSAqIHRyaXZpYWwsIGJ1dCBub3QgZW5hYmxlZCBkdWUgdG8gbGFjayBvZiB0ZXN0IGhhcmR3YXJlLiAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGVjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJdTMyIG1hc2s7CisKKwkJbWFzayA9IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfAorCQkJICBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGw7CisJCWlmIChucC0+Z2lnYWJpdCA9PSBQSFlfR0lHQUJJVCkKKwkJCW1hc2sgfD0gQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbDsKKworCQlpZiAoKGVjbWQtPmFkdmVydGlzaW5nICYgbWFzaykgPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJfSBlbHNlIGlmIChlY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRElTQUJMRSkgeworCQkvKiBOb3RlOiBhdXRvbmVnb3RpYXRpb24gZGlzYWJsZSwgc3BlZWQgMTAwMCBpbnRlbnRpb25hbGx5CisJCSAqIGZvcmJpZGRlbiAtIG5vb25lIHNob3VsZCBuZWVkIHRoYXQuICovCisKKwkJaWYgKGVjbWQtPnNwZWVkICE9IFNQRUVEXzEwICYmIGVjbWQtPnNwZWVkICE9IFNQRUVEXzEwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoZWNtZC0+ZHVwbGV4ICE9IERVUExFWF9IQUxGICYmIGVjbWQtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwlpZiAoZWNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQlpbnQgYWR2LCBibWNyOworCisJCW5wLT5hdXRvbmVnID0gMTsKKworCQkvKiBhZHZlcnRpc2Ugb25seSB3aGF0IGhhcyBiZWVuIHJlcXVlc3RlZCAqLworCQlhZHYgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0FEVkVSVElTRSwgTUlJX1JFQUQpOworCQlhZHYgJj0gfihBRFZFUlRJU0VfQUxMIHwgQURWRVJUSVNFXzEwMEJBU0U0KTsKKwkJaWYgKGVjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpCisJCQlhZHYgfD0gQURWRVJUSVNFXzEwSEFMRjsKKwkJaWYgKGVjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwpCisJCQlhZHYgfD0gQURWRVJUSVNFXzEwRlVMTDsKKwkJaWYgKGVjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmKQorCQkJYWR2IHw9IEFEVkVSVElTRV8xMDBIQUxGOworCQlpZiAoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpCisJCQlhZHYgfD0gQURWRVJUSVNFXzEwMEZVTEw7CisJCW1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfQURWRVJUSVNFLCBhZHYpOworCisJCWlmIChucC0+Z2lnYWJpdCA9PSBQSFlfR0lHQUJJVCkgeworCQkJYWR2ID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV8xMDAwQlRfQ1IsIE1JSV9SRUFEKTsKKwkJCWFkdiAmPSB+QURWRVJUSVNFXzEwMDBGVUxMOworCQkJaWYgKGVjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkKKwkJCQlhZHYgfD0gQURWRVJUSVNFXzEwMDBGVUxMOworCQkJbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV8xMDAwQlRfQ1IsIGFkdik7CisJCX0KKworCQlibWNyID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9CTUNSLCBNSUlfUkVBRCk7CisJCWJtY3IgfD0gKEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVCk7CisJCW1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfQk1DUiwgYm1jcik7CisKKwl9IGVsc2UgeworCQlpbnQgYWR2LCBibWNyOworCisJCW5wLT5hdXRvbmVnID0gMDsKKworCQlhZHYgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0FEVkVSVElTRSwgTUlJX1JFQUQpOworCQlhZHYgJj0gfihBRFZFUlRJU0VfQUxMIHwgQURWRVJUSVNFXzEwMEJBU0U0KTsKKwkJaWYgKGVjbWQtPnNwZWVkID09IFNQRUVEXzEwICYmIGVjbWQtPmR1cGxleCA9PSBEVVBMRVhfSEFMRikKKwkJCWFkdiB8PSBBRFZFUlRJU0VfMTBIQUxGOworCQlpZiAoZWNtZC0+c3BlZWQgPT0gU1BFRURfMTAgJiYgZWNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJYWR2IHw9IEFEVkVSVElTRV8xMEZVTEw7CisJCWlmIChlY21kLT5zcGVlZCA9PSBTUEVFRF8xMDAgJiYgZWNtZC0+ZHVwbGV4ID09IERVUExFWF9IQUxGKQorCQkJYWR2IHw9IEFEVkVSVElTRV8xMDBIQUxGOworCQlpZiAoZWNtZC0+c3BlZWQgPT0gU1BFRURfMTAwICYmIGVjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCWFkdiB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwkJbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9BRFZFUlRJU0UsIGFkdik7CisJCW5wLT5maXhlZF9tb2RlID0gYWR2OworCisJCWlmIChucC0+Z2lnYWJpdCA9PSBQSFlfR0lHQUJJVCkgeworCQkJYWR2ID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV8xMDAwQlRfQ1IsIE1JSV9SRUFEKTsKKwkJCWFkdiAmPSB+QURWRVJUSVNFXzEwMDBGVUxMOworCQkJbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV8xMDAwQlRfQ1IsIGFkdik7CisJCX0KKworCQlibWNyID0gbWlpX3J3KGRldiwgbnAtPnBoeWFkZHIsIE1JSV9CTUNSLCBNSUlfUkVBRCk7CisJCWJtY3IgfD0gfihCTUNSX0FORU5BQkxFfEJNQ1JfU1BFRUQxMDB8Qk1DUl9GVUxMRFBMWCk7CisJCWlmIChhZHYgJiAoQURWRVJUSVNFXzEwRlVMTHxBRFZFUlRJU0VfMTAwRlVMTCkpCisJCQlibWNyIHw9IEJNQ1JfRlVMTERQTFg7CisJCWlmIChhZHYgJiAoQURWRVJUSVNFXzEwMEhBTEZ8QURWRVJUSVNFXzEwMEZVTEwpKQorCQkJYm1jciB8PSBCTUNSX1NQRUVEMTAwOworCQltaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0JNQ1IsIGJtY3IpOworCisJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJCS8qIFdhaXQgYSBiaXQgYW5kIHRoZW4gcmVjb25maWd1cmUgdGhlIG5pYy4gKi8KKwkJCXVkZWxheSgxMCk7CisJCQludl9saW5rY2hhbmdlKGRldik7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBvcHMgPSB7CisJLmdldF9kcnZpbmZvID0gbnZfZ2V0X2RydmluZm8sCisJLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X3dvbCA9IG52X2dldF93b2wsCisJLnNldF93b2wgPSBudl9zZXRfd29sLAorCS5nZXRfc2V0dGluZ3MgPSBudl9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncyA9IG52X3NldF9zZXR0aW5ncywKK307CisKK3N0YXRpYyBpbnQgbnZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZV9wcml2ICpucCA9IGdldF9udnByaXYoZGV2KTsKKwl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOworCWludCByZXQsIG9vbSwgaTsKKworCWRwcmludGsoS0VSTl9ERUJVRyAibnZfb3BlbjogYmVnaW5cbiIpOworCisJLyogMSkgZXJhc2UgcHJldmlvdXMgbWlzY29uZmlndXJhdGlvbiAqLworCS8qIDQuMS0xOiBzdG9wIGFkYXB0ZXI6IGlnbm9yZWQsIDQuMyBzZWVtcyB0byBiZSBvdmVya2lsbCAqLworCXdyaXRlbChOVlJFR19NQ0FTVEFERFJBX0ZPUkNFLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RBZGRyQSk7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ011bHRpY2FzdEFkZHJCKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnTXVsdGljYXN0TWFza0EpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RNYXNrQik7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1BhY2tldEZpbHRlckZsYWdzKTsKKworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdUcmFuc21pdHRlckNvbnRyb2wpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdSZWNlaXZlckNvbnRyb2wpOworCisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ0FkYXB0ZXJDb250cm9sKTsKKworCS8qIDIpIGluaXRpYWxpemUgZGVzY3JpcHRvciByaW5ncyAqLworCW9vbSA9IG52X2luaXRfcmluZyhkZXYpOworCisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ0xpbmtTcGVlZCk7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1Vua25vd25UcmFuc21pdHRlclJlZyk7CisJbnZfdHhyeF9yZXNldChkZXYpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdVbmtub3duU2V0dXBSZWc2KTsKKworCW5wLT5pbl9zaHV0ZG93biA9IDA7CisKKwkvKiAzKSBzZXQgbWFjIGFkZHJlc3MgKi8KKwl7CisJCXUzMiBtYWNbMl07CisKKwkJbWFjWzBdID0gKGRldi0+ZGV2X2FkZHJbMF0gPDwgMCkgKyAoZGV2LT5kZXZfYWRkclsxXSA8PCA4KSArCisJCQkJKGRldi0+ZGV2X2FkZHJbMl0gPDwgMTYpICsgKGRldi0+ZGV2X2FkZHJbM10gPDwgMjQpOworCQltYWNbMV0gPSAoZGV2LT5kZXZfYWRkcls0XSA8PCAwKSArIChkZXYtPmRldl9hZGRyWzVdIDw8IDgpOworCisJCXdyaXRlbChtYWNbMF0sIGJhc2UgKyBOdlJlZ01hY0FkZHJBKTsKKwkJd3JpdGVsKG1hY1sxXSwgYmFzZSArIE52UmVnTWFjQWRkckIpOworCX0KKworCS8qIDQpIGdpdmUgaHcgcmluZ3MgKi8KKwl3cml0ZWwoKHUzMikgbnAtPnJpbmdfYWRkciwgYmFzZSArIE52UmVnUnhSaW5nUGh5c0FkZHIpOworCXdyaXRlbCgodTMyKSAobnAtPnJpbmdfYWRkciArIFJYX1JJTkcqc2l6ZW9mKHN0cnVjdCByaW5nX2Rlc2MpKSwgYmFzZSArIE52UmVnVHhSaW5nUGh5c0FkZHIpOworCXdyaXRlbCggKChSWF9SSU5HLTEpIDw8IE5WUkVHX1JJTkdTWl9SWFNISUZUKSArICgoVFhfUklORy0xKSA8PCBOVlJFR19SSU5HU1pfVFhTSElGVCksCisJCWJhc2UgKyBOdlJlZ1JpbmdTaXplcyk7CisKKwkvKiA1KSBjb250aW51ZSBzZXR1cCAqLworCXdyaXRlbChucC0+bGlua3NwZWVkLCBiYXNlICsgTnZSZWdMaW5rU3BlZWQpOworCXdyaXRlbChOVlJFR19VTktTRVRVUDNfVkFMMSwgYmFzZSArIE52UmVnVW5rbm93blNldHVwUmVnMyk7CisJd3JpdGVsKG5wLT5kZXNjX3ZlciwgYmFzZSArIE52UmVnVHhSeENvbnRyb2wpOworCXBjaV9wdXNoKGJhc2UpOworCXdyaXRlbChOVlJFR19UWFJYQ1RMX0JJVDF8bnAtPmRlc2NfdmVyLCBiYXNlICsgTnZSZWdUeFJ4Q29udHJvbCk7CisJcmVnX2RlbGF5KGRldiwgTnZSZWdVbmtub3duU2V0dXBSZWc1LCBOVlJFR19VTktTRVRVUDVfQklUMzEsIE5WUkVHX1VOS1NFVFVQNV9CSVQzMSwKKwkJCU5WX1NFVFVQNV9ERUxBWSwgTlZfU0VUVVA1X0RFTEFZTUFYLAorCQkJS0VSTl9JTkZPICJvcGVuOiBTZXR1cFJlZzUsIEJpdCAzMSByZW1haW5lZCBvZmZcbiIpOworCisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1Vua25vd25TZXR1cFJlZzQpOworCXdyaXRlbChOVlJFR19JUlFTVEFUX01BU0ssIGJhc2UgKyBOdlJlZ0lycVN0YXR1cyk7CisJd3JpdGVsKE5WUkVHX01JSVNUQVRfTUFTSzIsIGJhc2UgKyBOdlJlZ01JSVN0YXR1cyk7CisKKwkvKiA2KSBjb250aW51ZSBzZXR1cCAqLworCXdyaXRlbChOVlJFR19NSVNDMV9GT1JDRSB8IE5WUkVHX01JU0MxX0hELCBiYXNlICsgTnZSZWdNaXNjMSk7CisJd3JpdGVsKHJlYWRsKGJhc2UgKyBOdlJlZ1RyYW5zbWl0dGVyU3RhdHVzKSwgYmFzZSArIE52UmVnVHJhbnNtaXR0ZXJTdGF0dXMpOworCXdyaXRlbChOVlJFR19QRkZfQUxXQVlTLCBiYXNlICsgTnZSZWdQYWNrZXRGaWx0ZXJGbGFncyk7CisJd3JpdGVsKE5WUkVHX09GRkxPQURfTk9STUFMLCBiYXNlICsgTnZSZWdPZmZsb2FkQ29uZmlnKTsKKworCXdyaXRlbChyZWFkbChiYXNlICsgTnZSZWdSZWNlaXZlclN0YXR1cyksIGJhc2UgKyBOdlJlZ1JlY2VpdmVyU3RhdHVzKTsKKwlnZXRfcmFuZG9tX2J5dGVzKCZpLCBzaXplb2YoaSkpOworCXdyaXRlbChOVlJFR19STkRTRUVEX0ZPUkNFIHwgKGkmTlZSRUdfUk5EU0VFRF9NQVNLKSwgYmFzZSArIE52UmVnUmFuZG9tU2VlZCk7CisJd3JpdGVsKE5WUkVHX1VOS1NFVFVQMV9WQUwsIGJhc2UgKyBOdlJlZ1Vua25vd25TZXR1cFJlZzEpOworCXdyaXRlbChOVlJFR19VTktTRVRVUDJfVkFMLCBiYXNlICsgTnZSZWdVbmtub3duU2V0dXBSZWcyKTsKKwl3cml0ZWwoTlZSRUdfUE9MTF9ERUZBVUxULCBiYXNlICsgTnZSZWdQb2xsaW5nSW50ZXJ2YWwpOworCXdyaXRlbChOVlJFR19VTktTRVRVUDZfVkFMLCBiYXNlICsgTnZSZWdVbmtub3duU2V0dXBSZWc2KTsKKwl3cml0ZWwoKG5wLT5waHlhZGRyIDw8IE5WUkVHX0FEQVBUQ1RMX1BIWVNISUZUKXxOVlJFR19BREFQVENUTF9QSFlWQUxJRHxOVlJFR19BREFQVENUTF9SVU5OSU5HLAorCQkJYmFzZSArIE52UmVnQWRhcHRlckNvbnRyb2wpOworCXdyaXRlbChOVlJFR19NSUlTUEVFRF9CSVQ4fE5WUkVHX01JSURFTEFZLCBiYXNlICsgTnZSZWdNSUlTcGVlZCk7CisJd3JpdGVsKE5WUkVHX1VOS1NFVFVQNF9WQUwsIGJhc2UgKyBOdlJlZ1Vua25vd25TZXR1cFJlZzQpOworCXdyaXRlbChOVlJFR19XQUtFVVBGTEFHU19WQUwsIGJhc2UgKyBOdlJlZ1dha2VVcEZsYWdzKTsKKworCWkgPSByZWFkbChiYXNlICsgTnZSZWdQb3dlclN0YXRlKTsKKwlpZiAoIChpICYgTlZSRUdfUE9XRVJTVEFURV9QT1dFUkVEVVApID09IDApCisJCXdyaXRlbChOVlJFR19QT1dFUlNUQVRFX1BPV0VSRURVUHxpLCBiYXNlICsgTnZSZWdQb3dlclN0YXRlKTsKKworCXBjaV9wdXNoKGJhc2UpOworCXVkZWxheSgxMCk7CisJd3JpdGVsKHJlYWRsKGJhc2UgKyBOdlJlZ1Bvd2VyU3RhdGUpIHwgTlZSRUdfUE9XRVJTVEFURV9WQUxJRCwgYmFzZSArIE52UmVnUG93ZXJTdGF0ZSk7CisKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnSXJxTWFzayk7CisJcGNpX3B1c2goYmFzZSk7CisJd3JpdGVsKE5WUkVHX01JSVNUQVRfTUFTSzIsIGJhc2UgKyBOdlJlZ01JSVN0YXR1cyk7CisJd3JpdGVsKE5WUkVHX0lSUVNUQVRfTUFTSywgYmFzZSArIE52UmVnSXJxU3RhdHVzKTsKKwlwY2lfcHVzaChiYXNlKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmbnZfbmljX2lycSwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9kcmFpbjsKKworCS8qIGFzayBmb3IgaW50ZXJydXB0cyAqLworCXdyaXRlbChucC0+aXJxbWFzaywgYmFzZSArIE52UmVnSXJxTWFzayk7CisKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJd3JpdGVsKE5WUkVHX01DQVNUQUREUkFfRk9SQ0UsIGJhc2UgKyBOdlJlZ011bHRpY2FzdEFkZHJBKTsKKwl3cml0ZWwoMCwgYmFzZSArIE52UmVnTXVsdGljYXN0QWRkckIpOworCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdNdWx0aWNhc3RNYXNrQSk7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ011bHRpY2FzdE1hc2tCKTsKKwl3cml0ZWwoTlZSRUdfUEZGX0FMV0FZU3xOVlJFR19QRkZfTVlBRERSLCBiYXNlICsgTnZSZWdQYWNrZXRGaWx0ZXJGbGFncyk7CisJLyogT25lIG1hbnVhbCBsaW5rIHNwZWVkIHVwZGF0ZTogSW50ZXJydXB0cyBhcmUgZW5hYmxlZCwgZnV0dXJlIGxpbmsKKwkgKiBzcGVlZCBjaGFuZ2VzIGNhdXNlIGludGVycnVwdHMgYW5kIGFyZSBoYW5kbGVkIGJ5IG52X2xpbmtfaXJxKCkuCisJICovCisJeworCQl1MzIgbWlpc3RhdDsKKwkJbWlpc3RhdCA9IHJlYWRsKGJhc2UgKyBOdlJlZ01JSVN0YXR1cyk7CisJCXdyaXRlbChOVlJFR19NSUlTVEFUX01BU0ssIGJhc2UgKyBOdlJlZ01JSVN0YXR1cyk7CisJCWRwcmludGsoS0VSTl9JTkZPICJzdGFydHVwOiBnb3QgMHglMDh4LlxuIiwgbWlpc3RhdCk7CisJfQorCXJldCA9IG52X3VwZGF0ZV9saW5rc3BlZWQoZGV2KTsKKwludl9zdGFydF9yeChkZXYpOworCW52X3N0YXJ0X3R4KGRldik7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlpZiAocmV0KSB7CisJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwl9IGVsc2UgeworCQlwcmludGsoIiVzOiBubyBsaW5rIGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiIsIGRldi0+bmFtZSk7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJfQorCWlmIChvb20pCisJCW1vZF90aW1lcigmbnAtPm9vbV9raWNrLCBqaWZmaWVzICsgT09NX1JFRklMTCk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK291dF9kcmFpbjoKKwlkcmFpbl9yaW5nKGRldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBudl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmZV9wcml2ICpucCA9IGdldF9udnByaXYoZGV2KTsKKwl1OCBfX2lvbWVtICpiYXNlOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCW5wLT5pbl9zaHV0ZG93biA9IDE7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJc3luY2hyb25pemVfaXJxKGRldi0+aXJxKTsKKworCWRlbF90aW1lcl9zeW5jKCZucC0+b29tX2tpY2spOworCWRlbF90aW1lcl9zeW5jKCZucC0+bmljX3BvbGwpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwludl9zdG9wX3R4KGRldik7CisJbnZfc3RvcF9yeChkZXYpOworCW52X3R4cnhfcmVzZXQoZGV2KTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyBvbiB0aGUgbmljIG9yIHdlIHdpbGwgbG9jayB1cCAqLworCWJhc2UgPSBnZXRfaHdiYXNlKGRldik7CisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ0lycU1hc2spOworCXBjaV9wdXNoKGJhc2UpOworCWRwcmludGsoS0VSTl9JTkZPICIlczogSXJxbWFzayBpcyB6ZXJvIGFnYWluXG4iLCBkZXYtPm5hbWUpOworCisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCWRyYWluX3JpbmcoZGV2KTsKKworCWlmIChucC0+d29sZW5hYmxlZCkKKwkJbnZfc3RhcnRfcngoZGV2KTsKKworCS8qIEZJWE1FOiBwb3dlciBkb3duIG5pYyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG52X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZmVfcHJpdiAqbnA7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCXU4IF9faW9tZW0gKmJhc2U7CisJaW50IGVyciwgaTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgZmVfcHJpdikpOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFkZXYpCisJCWdvdG8gb3V0OworCisJbnAgPSBnZXRfbnZwcml2KGRldik7CisJbnAtPnBjaV9kZXYgPSBwY2lfZGV2OworCXNwaW5fbG9ja19pbml0KCZucC0+bG9jayk7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBjaV9kZXYtPmRldik7CisKKwlpbml0X3RpbWVyKCZucC0+b29tX2tpY2spOworCW5wLT5vb21fa2ljay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKwlucC0+b29tX2tpY2suZnVuY3Rpb24gPSAmbnZfZG9fcnhfcmVmaWxsOwkvKiB0aW1lciBoYW5kbGVyICovCisJaW5pdF90aW1lcigmbnAtPm5pY19wb2xsKTsKKwlucC0+bmljX3BvbGwuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisJbnAtPm5pY19wb2xsLmZ1bmN0aW9uID0gJm52X2RvX25pY19wb2xsOwkvKiB0aW1lciBoYW5kbGVyICovCisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0lORk8gImZvcmNlZGV0aDogcGNpX2VuYWJsZV9kZXYgZmFpbGVkICglZCkgZm9yIGRldmljZSAlc1xuIiwKKwkJCQllcnIsIHBjaV9uYW1lKHBjaV9kZXYpKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwY2lfZGV2KTsKKworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGNpX2RldiwgRFJWX05BTUUpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9kaXNhYmxlOworCisJZXJyID0gLUVJTlZBTDsKKwlhZGRyID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgREVWSUNFX0NPVU5UX1JFU09VUkNFOyBpKyspIHsKKwkJZHByaW50ayhLRVJOX0RFQlVHICIlczogcmVzb3VyY2UgJWQgc3RhcnQgJXAgbGVuICVsZCBmbGFncyAweCUwOGx4LlxuIiwKKwkJCQlwY2lfbmFtZShwY2lfZGV2KSwgaSwgKHZvaWQqKXBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCBpKSwKKwkJCQlwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIGkpLAorCQkJCXBjaV9yZXNvdXJjZV9mbGFncyhwY2lfZGV2LCBpKSk7CisJCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MocGNpX2RldiwgaSkgJiBJT1JFU09VUkNFX01FTSAmJgorCQkJCXBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgaSkgPj0gTlZfUENJX1JFR1NaKSB7CisJCQlhZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIGkpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGkgPT0gREVWSUNFX0NPVU5UX1JFU09VUkNFKSB7CisJCXByaW50ayhLRVJOX0lORk8gImZvcmNlZGV0aDogQ291bGRuJ3QgZmluZCByZWdpc3RlciB3aW5kb3cgZm9yIGRldmljZSAlcy5cbiIsCisJCQkJCXBjaV9uYW1lKHBjaV9kZXYpKTsKKwkJZ290byBvdXRfcmVscmVnOworCX0KKworCS8qIGhhbmRsZSBkaWZmZXJlbnQgZGVzY3JpcHRvciB2ZXJzaW9ucyAqLworCWlmIChwY2lfZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzEgfHwKKwkJcGNpX2Rldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yIHx8CisJCXBjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMykKKwkJbnAtPmRlc2NfdmVyID0gREVTQ19WRVJfMTsKKwllbHNlCisJCW5wLT5kZXNjX3ZlciA9IERFU0NfVkVSXzI7CisKKwllcnIgPSAtRU5PTUVNOworCW5wLT5iYXNlID0gaW9yZW1hcChhZGRyLCBOVl9QQ0lfUkVHU1opOworCWlmICghbnAtPmJhc2UpCisJCWdvdG8gb3V0X3JlbHJlZzsKKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKW5wLT5iYXNlOworCWRldi0+aXJxID0gcGNpX2Rldi0+aXJxOworCW5wLT5yeF9yaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpX2Rldiwgc2l6ZW9mKHN0cnVjdCByaW5nX2Rlc2MpICogKFJYX1JJTkcgKyBUWF9SSU5HKSwKKwkJCQkJCSZucC0+cmluZ19hZGRyKTsKKwlpZiAoIW5wLT5yeF9yaW5nKQorCQlnb3RvIG91dF91bm1hcDsKKwlucC0+dHhfcmluZyA9ICZucC0+cnhfcmluZ1tSWF9SSU5HXTsKKworCWRldi0+b3BlbiA9IG52X29wZW47CisJZGV2LT5zdG9wID0gbnZfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBudl9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gbnZfZ2V0X3N0YXRzOworCWRldi0+Y2hhbmdlX210dSA9IG52X2NoYW5nZV9tdHU7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBudl9zZXRfbXVsdGljYXN0OworCVNFVF9FVEhUT09MX09QUyhkZXYsICZvcHMpOworCWRldi0+dHhfdGltZW91dCA9IG52X3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IE5WX1dBVENIRE9HX1RJTUVPOworCisJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIGRldik7CisKKwkvKiByZWFkIHRoZSBtYWMgYWRkcmVzcyAqLworCWJhc2UgPSBnZXRfaHdiYXNlKGRldik7CisJbnAtPm9yaWdfbWFjWzBdID0gcmVhZGwoYmFzZSArIE52UmVnTWFjQWRkckEpOworCW5wLT5vcmlnX21hY1sxXSA9IHJlYWRsKGJhc2UgKyBOdlJlZ01hY0FkZHJCKTsKKworCWRldi0+ZGV2X2FkZHJbMF0gPSAobnAtPm9yaWdfbWFjWzFdID4+ICA4KSAmIDB4ZmY7CisJZGV2LT5kZXZfYWRkclsxXSA9IChucC0+b3JpZ19tYWNbMV0gPj4gIDApICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzJdID0gKG5wLT5vcmlnX21hY1swXSA+PiAyNCkgJiAweGZmOworCWRldi0+ZGV2X2FkZHJbM10gPSAobnAtPm9yaWdfbWFjWzBdID4+IDE2KSAmIDB4ZmY7CisJZGV2LT5kZXZfYWRkcls0XSA9IChucC0+b3JpZ19tYWNbMF0gPj4gIDgpICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzVdID0gKG5wLT5vcmlnX21hY1swXSA+PiAgMCkgJiAweGZmOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKSB7CisJCS8qCisJCSAqIEJhZCBtYWMgYWRkcmVzcy4gQXQgbGVhc3Qgb25lIGJpb3Mgc2V0cyB0aGUgbWFjIGFkZHJlc3MKKwkJICogdG8gMDE6MjM6NDU6Njc6ODk6YWIKKwkJICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgTWFjIGFkZHJlc3MgZGV0ZWN0ZWQ6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJcGNpX25hbWUocGNpX2RldiksCisJCQlkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLCBkZXYtPmRldl9hZGRyWzJdLAorCQkJZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7CisJCXByaW50ayhLRVJOX0VSUiAiUGxlYXNlIGNvbXBsYWluIHRvIHlvdXIgaGFyZHdhcmUgdmVuZG9yLiBTd2l0Y2hpbmcgdG8gYSByYW5kb20gTUFDLlxuIik7CisJCWRldi0+ZGV2X2FkZHJbMF0gPSAweDAwOworCQlkZXYtPmRldl9hZGRyWzFdID0gMHgwMDsKKwkJZGV2LT5kZXZfYWRkclsyXSA9IDB4NmM7CisJCWdldF9yYW5kb21fYnl0ZXMoJmRldi0+ZGV2X2FkZHJbM10sIDMpOworCX0KKworCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1BQyBBZGRyZXNzICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBwY2lfbmFtZShwY2lfZGV2KSwKKwkJCWRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sIGRldi0+ZGV2X2FkZHJbMl0sCisJCQlkZXYtPmRldl9hZGRyWzNdLCBkZXYtPmRldl9hZGRyWzRdLCBkZXYtPmRldl9hZGRyWzVdKTsKKworCS8qIGRpc2FibGUgV09MICovCisJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ1dha2VVcEZsYWdzKTsKKwlucC0+d29sZW5hYmxlZCA9IDA7CisKKwlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEpIHsKKwkJbnAtPnR4X2ZsYWdzID0gTlZfVFhfTEFTVFBBQ0tFVHxOVl9UWF9WQUxJRDsKKwkJaWYgKGlkLT5kcml2ZXJfZGF0YSAmIERFVl9ORUVEX0xBU1RQQUNLRVQxKQorCQkJbnAtPnR4X2ZsYWdzIHw9IE5WX1RYX0xBU1RQQUNLRVQxOworCX0gZWxzZSB7CisJCW5wLT50eF9mbGFncyA9IE5WX1RYMl9MQVNUUEFDS0VUfE5WX1RYMl9WQUxJRDsKKwkJaWYgKGlkLT5kcml2ZXJfZGF0YSAmIERFVl9ORUVEX0xBU1RQQUNLRVQxKQorCQkJbnAtPnR4X2ZsYWdzIHw9IE5WX1RYMl9MQVNUUEFDS0VUMTsKKwl9CisJaWYgKGlkLT5kcml2ZXJfZGF0YSAmIERFVl9JUlFNQVNLXzEpCisJCW5wLT5pcnFtYXNrID0gTlZSRUdfSVJRTUFTS19XQU5URURfMTsKKwlpZiAoaWQtPmRyaXZlcl9kYXRhICYgREVWX0lSUU1BU0tfMikKKwkJbnAtPmlycW1hc2sgPSBOVlJFR19JUlFNQVNLX1dBTlRFRF8yOworCWlmIChpZC0+ZHJpdmVyX2RhdGEgJiBERVZfTkVFRF9USU1FUklSUSkKKwkJbnAtPmlycW1hc2sgfD0gTlZSRUdfSVJRX1RJTUVSOworCWlmIChpZC0+ZHJpdmVyX2RhdGEgJiBERVZfTkVFRF9MSU5LVElNRVIpIHsKKwkJZHByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIHRpbWVyIG9uLlxuIiwgcGNpX25hbWUocGNpX2RldikpOworCQlucC0+bmVlZF9saW5rdGltZXIgPSAxOworCQlucC0+bGlua190aW1lb3V0ID0gamlmZmllcyArIExJTktfVElNRU9VVDsKKwl9IGVsc2UgeworCQlkcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgdGltZXIgb2ZmLlxuIiwgcGNpX25hbWUocGNpX2RldikpOworCQlucC0+bmVlZF9saW5rdGltZXIgPSAwOworCX0KKworCS8qIGZpbmQgYSBzdWl0YWJsZSBwaHkgKi8KKwlmb3IgKGkgPSAxOyBpIDwgMzI7IGkrKykgeworCQlpbnQgaWQxLCBpZDI7CisKKwkJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCQlpZDEgPSBtaWlfcncoZGV2LCBpLCBNSUlfUEhZU0lEMSwgTUlJX1JFQUQpOworCQlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwkJaWYgKGlkMSA8IDAgfHwgaWQxID09IDB4ZmZmZikKKwkJCWNvbnRpbnVlOworCQlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJCWlkMiA9IG1paV9ydyhkZXYsIGksIE1JSV9QSFlTSUQyLCBNSUlfUkVBRCk7CisJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCQlpZiAoaWQyIDwgMCB8fCBpZDIgPT0gMHhmZmZmKQorCQkJY29udGludWU7CisKKwkJaWQxID0gKGlkMSAmIFBIWUlEMV9PVUlfTUFTSykgPDwgUEhZSUQxX09VSV9TSEZUOworCQlpZDIgPSAoaWQyICYgUEhZSUQyX09VSV9NQVNLKSA+PiBQSFlJRDJfT1VJX1NIRlQ7CisJCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG9wZW46IEZvdW5kIFBIWSAlMDR4OiUwNHggYXQgYWRkcmVzcyAlZC5cbiIsCisJCQkJcGNpX25hbWUocGNpX2RldiksIGlkMSwgaWQyLCBpKTsKKwkJbnAtPnBoeWFkZHIgPSBpOworCQlucC0+cGh5X291aSA9IGlkMSB8IGlkMjsKKwkJYnJlYWs7CisJfQorCWlmIChpID09IDMyKSB7CisJCS8qIFBIWSBpbiBpc29sYXRlIG1vZGU/IE5vIHBoeSBhdHRhY2hlZCBhbmQgdXNlciB3YW50cyB0bworCQkgKiB0ZXN0IGxvb3BiYWNrPyBWZXJ5IG9kZCwgYnV0IGNhbiBiZSBjb3JyZWN0LgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG9wZW46IENvdWxkIG5vdCBmaW5kIGEgdmFsaWQgUEhZLlxuIiwKKwkJCQlwY2lfbmFtZShwY2lfZGV2KSk7CisJfQorCisJaWYgKGkgIT0gMzIpIHsKKwkJLyogcmVzZXQgaXQgKi8KKwkJcGh5X2luaXQoZGV2KTsKKwl9CisKKwkvKiBzZXQgZGVmYXVsdCBsaW5rIHNwZWVkIHNldHRpbmdzICovCisJbnAtPmxpbmtzcGVlZCA9IE5WUkVHX0xJTktTUEVFRF9GT1JDRXxOVlJFR19MSU5LU1BFRURfMTA7CisJbnAtPmR1cGxleCA9IDA7CisJbnAtPmF1dG9uZWcgPSAxOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9JTkZPICJmb3JjZWRldGg6IHVuYWJsZSB0byByZWdpc3RlciBuZXRkZXY6ICVkXG4iLCBlcnIpOworCQlnb3RvIG91dF9mcmVlcmluZzsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZvcmNlZGV0aC5jOiBzdWJzeXN0ZW06ICUwNXg6JTA0eCBib3VuZCB0byAlc1xuIiwKKwkJCWRldi0+bmFtZSwgcGNpX2Rldi0+c3Vic3lzdGVtX3ZlbmRvciwgcGNpX2Rldi0+c3Vic3lzdGVtX2RldmljZSwKKwkJCXBjaV9uYW1lKHBjaV9kZXYpKTsKKworCXJldHVybiAwOworCitvdXRfZnJlZXJpbmc6CisJcGNpX2ZyZWVfY29uc2lzdGVudChucC0+cGNpX2Rldiwgc2l6ZW9mKHN0cnVjdCByaW5nX2Rlc2MpICogKFJYX1JJTkcgKyBUWF9SSU5HKSwKKwkJCQlucC0+cnhfcmluZywgbnAtPnJpbmdfYWRkcik7CisJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIE5VTEwpOworb3V0X3VubWFwOgorCWlvdW5tYXAoZ2V0X2h3YmFzZShkZXYpKTsKK291dF9yZWxyZWc6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwY2lfZGV2KTsKK291dF9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKK291dF9mcmVlOgorCWZyZWVfbmV0ZGV2KGRldik7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IG52X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCBmZV9wcml2ICpucCA9IGdldF9udnByaXYoZGV2KTsKKwl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworCS8qIHNwZWNpYWwgb3A6IHdyaXRlIGJhY2sgdGhlIG1pc29yZGVyZWQgTUFDIGFkZHJlc3MgLSBvdGhlcndpc2UKKwkgKiB0aGUgbmV4dCBudl9wcm9iZSB3b3VsZCBzZWUgYSB3cm9uZyBhZGRyZXNzLgorCSAqLworCXdyaXRlbChucC0+b3JpZ19tYWNbMF0sIGJhc2UgKyBOdlJlZ01hY0FkZHJBKTsKKwl3cml0ZWwobnAtPm9yaWdfbWFjWzFdLCBiYXNlICsgTnZSZWdNYWNBZGRyQik7CisKKwkvKiBmcmVlIGFsbCBzdHJ1Y3R1cmVzICovCisJcGNpX2ZyZWVfY29uc2lzdGVudChucC0+cGNpX2Rldiwgc2l6ZW9mKHN0cnVjdCByaW5nX2Rlc2MpICogKFJYX1JJTkcgKyBUWF9SSU5HKSwgbnAtPnJ4X3JpbmcsIG5wLT5yaW5nX2FkZHIpOworCWlvdW5tYXAoZ2V0X2h3YmFzZShkZXYpKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBjaV9kZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKKwlmcmVlX25ldGRldihkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaV90YmxbXSA9IHsKKwl7CS8qIG5Gb3JjZSBFdGhlcm5ldCBDb250cm9sbGVyICovCisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX05WSURJQSwKKwkJLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8xLAorCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9JUlFNQVNLXzF8REVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSLAorCX0sCisJewkvKiBuRm9yY2UyIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KKwkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfTlZJRElBLAorCQkuZGV2aWNlID0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzIsCisJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTEFTVFBBQ0tFVDF8REVWX0lSUU1BU0tfMnxERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVIsCisJfSwKKwl7CS8qIG5Gb3JjZTMgRXRoZXJuZXQgQ29udHJvbGxlciAqLworCQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9OVklESUEsCisJCS5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMywKKwkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUiwKKwl9LAorCXsJLyogbkZvcmNlMyBFdGhlcm5ldCBDb250cm9sbGVyICovCisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX05WSURJQSwKKwkJLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF80LAorCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xBU1RQQUNLRVQxfERFVl9JUlFNQVNLXzJ8REVWX05FRURfVElNRVJJUlEsCisJfSwKKwl7CS8qIG5Gb3JjZTMgRXRoZXJuZXQgQ29udHJvbGxlciAqLworCQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9OVklESUEsCisJCS5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfNSwKKwkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRLAorCX0sCisJewkvKiBuRm9yY2UzIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KKwkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfTlZJRElBLAorCQkuZGV2aWNlID0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzYsCisJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTEFTVFBBQ0tFVDF8REVWX0lSUU1BU0tfMnxERVZfTkVFRF9USU1FUklSUSwKKwl9LAorCXsJLyogbkZvcmNlMyBFdGhlcm5ldCBDb250cm9sbGVyICovCisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX05WSURJQSwKKwkJLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF83LAorCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xBU1RQQUNLRVQxfERFVl9JUlFNQVNLXzJ8REVWX05FRURfVElNRVJJUlEsCisJfSwKKwl7CS8qIENLODA0IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KKwkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfTlZJRElBLAorCQkuZGV2aWNlID0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzgsCisJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTEFTVFBBQ0tFVDF8REVWX0lSUU1BU0tfMnxERVZfTkVFRF9USU1FUklSUSwKKwl9LAorCXsJLyogQ0s4MDQgRXRoZXJuZXQgQ29udHJvbGxlciAqLworCQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9OVklESUEsCisJCS5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfOSwKKwkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRLAorCX0sCisJewkvKiBNQ1AwNCBFdGhlcm5ldCBDb250cm9sbGVyICovCisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX05WSURJQSwKKwkJLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8xMCwKKwkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRLAorCX0sCisJewkvKiBNQ1AwNCBFdGhlcm5ldCBDb250cm9sbGVyICovCisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX05WSURJQSwKKwkJLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8xMSwKKwkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRLAorCX0sCisJezAsfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUgPSAiZm9yY2VkZXRoIiwKKwkuaWRfdGFibGUgPSBwY2lfdGJsLAorCS5wcm9iZSA9IG52X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChudl9yZW1vdmUpLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25pYyh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gImZvcmNlZGV0aC5jOiBSZXZlcnNlIEVuZ2luZWVyZWQgbkZvcmNlIGV0aGVybmV0IGRyaXZlci4gVmVyc2lvbiAlcy5cbiIsIEZPUkNFREVUSF9WRVJTSU9OKTsKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9uaWModm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK21vZHVsZV9wYXJhbShtYXhfaW50ZXJydXB0X3dvcmssIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9pbnRlcnJ1cHRfd29yaywgImZvcmNlZGV0aCBtYXhpbXVtIGV2ZW50cyBoYW5kbGVkIHBlciBpbnRlcnJ1cHQiKTsKKworTU9EVUxFX0FVVEhPUigiTWFuZnJlZCBTcHJhdWwgPG1hbmZyZWRAY29sb3JmdWxsaWZlLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmV2ZXJzZSBFbmdpbmVlcmVkIG5Gb3JjZSBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBjaV90YmwpOworCittb2R1bGVfaW5pdChpbml0X25pYyk7Cittb2R1bGVfZXhpdChleGl0X25pYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyLmMgYi9kcml2ZXJzL25ldC9naWFuZmFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQzYjJiMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuYwpAQCAtMCwwICsxLDE4NDkgQEAKKy8qIAorICogZHJpdmVycy9uZXQvZ2lhbmZhci5jCisgKgorICogR2lhbmZhciBFdGhlcm5ldCBEcml2ZXIKKyAqIERyaXZlciBmb3IgRkVDIG9uIE1QQzg1NDAgYW5kIFRTRUMgb24gTVBDODU0MC9NUEM4NTYwCisgKiBCYXNlZCBvbiA4MjYwX2lvL2ZjY19lbmV0LmMKKyAqCisgKiBBdXRob3I6IEFuZHkgRmxlbWluZworICogTWFpbnRhaW5lcjogS3VtYXIgR2FsYSAoa3VtYXIuZ2FsYUBmcmVlc2NhbGUuY29tKQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgR2lhbmZhcjogIEFLQSBMYW1iZGEgRHJhY29uaXMsICJEcmFnb24iCisgKiAgUkEgMTEgMzEgMjQuMgorICogIERlYyArNjkgMTkgNTIKKyAqICBWIDMuODQKKyAqICBCLVYgKzEuNjIKKyAqCisgKiAgVGhlb3J5IG9mIG9wZXJhdGlvbgorICogIFRoaXMgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciB0aGUgVHJpcGxlLXNwZWVkIEV0aGVybmV0CisgKiAgY29udHJvbGxlcnMgb24gdGhlIEZyZWVzY2FsZSA4NTQwLzg1NjAgaW50ZWdyYXRlZCBwcm9jZXNzb3JzLAorICogIGFzIHdlbGwgYXMgdGhlIEZhc3QgRXRoZXJuZXQgQ29udHJvbGxlciBvbiB0aGUgODU0MC4gIAorICogIAorICogIFRoZSBkcml2ZXIgaXMgaW5pdGlhbGl6ZWQgdGhyb3VnaCBwbGF0Zm9ybV9kZXZpY2UuICBTdHJ1Y3R1cmVzIHdoaWNoCisgKiAgZGVmaW5lIHRoZSBjb25maWd1cmF0aW9uIG5lZWRlZCBieSB0aGUgYm9hcmQgYXJlIGRlZmluZWQgaW4gYQorICogIGJvYXJkIHN0cnVjdHVyZSBpbiBhcmNoL3BwYy9wbGF0Zm9ybXMgKHRob3VnaCBJIGRvIG5vdAorICogIGRpc2NvdW50IHRoZSBwb3NzaWJpbGl0eSB0aGF0IG90aGVyIGFyY2hpdGVjdHVyZXMgY291bGQgb25lCisgKiAgZGF5IGJlIHN1cHBvcnRlZC4gIE9uZSBhc3N1bXB0aW9uIHRoZSBkcml2ZXIgY3VycmVudGx5IG1ha2VzCisgKiAgaXMgdGhhdCB0aGUgUEhZIGlzIGNvbmZpZ3VyZWQgaW4gc3VjaCBhIHdheSB0byBhZHZlcnRpc2UgYWxsCisgKiAgY2FwYWJpbGl0aWVzLiAgVGhpcyBpcyBhIHNlbnNpYmxlIGRlZmF1bHQsIGFuZCBvbiBjZXJ0YWluCisgKiAgUEhZcywgY2hhbmdpbmcgdGhpcyBkZWZhdWx0IGVuY291bnRlcnMgc3Vic3RhbnRpYWwgZXJyYXRhCisgKiAgaXNzdWVzLiAgRnV0dXJlIHZlcnNpb25zIG1heSByZW1vdmUgdGhpcyByZXF1aXJlbWVudCwgYnV0IGZvcgorICogIG5vdywgaXQgaXMgYmVzdCBmb3IgdGhlIGZpcm13YXJlIHRvIGVuc3VyZSB0aGlzIGlzIHRoZSBjYXNlLgorICoKKyAqICBUaGUgR2lhbmZhciBFdGhlcm5ldCBDb250cm9sbGVyIHVzZXMgYSByaW5nIG9mIGJ1ZmZlcgorICogIGRlc2NyaXB0b3JzLiAgVGhlIGJlZ2lubmluZyBpcyBpbmRpY2F0ZWQgYnkgYSByZWdpc3RlcgorICogIHBvaW50aW5nIHRvIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgcmluZy4gCisgKiAgVGhlIGVuZCBpcyBkZXRlcm1pbmVkIGJ5IGEgIndyYXAiIGJpdCBiZWluZyBzZXQgaW4gdGhlIAorICogIGxhc3QgZGVzY3JpcHRvciBvZiB0aGUgcmluZy4KKyAqCisgKiAgV2hlbiBhIHBhY2tldCBpcyByZWNlaXZlZCwgdGhlIFJYRiBiaXQgaW4gdGhlCisgKiAgSUVWRU5UIHJlZ2lzdGVyIGlzIHNldCwgdHJpZ2dlcmluZyBhbiBpbnRlcnJ1cHQgd2hlbiB0aGUgCisgKiAgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIElNQVNLIHJlZ2lzdGVyIGlzIGFsc28gc2V0IChpZgorICogIGludGVycnVwdCBjb2FsZXNjaW5nIGlzIGFjdGl2ZSwgdGhlbiB0aGUgaW50ZXJydXB0IG1heSBub3QKKyAqICBoYXBwZW4gaW1tZWRpYXRlbHksIGJ1dCB3aWxsIHdhaXQgdW50aWwgZWl0aGVyIGEgc2V0IG51bWJlcgorICogIG9mIGZyYW1lcyBvciBhbW91bnQgb2YgdGltZSBoYXZlIHBhc3NlZC4pLiAgSW4gTkFQSSwgdGhlCisgKiAgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCBzaWduYWwgdGhlcmUgaXMgd29yayB0byBiZSBkb25lLCBhbmQKKyAqICBleGl0LiAgV2l0aG91dCBOQVBJLCB0aGUgcGFja2V0KHMpIHdpbGwgYmUgaGFuZGxlZAorICogIGltbWVkaWF0ZWx5LiAgQm90aCBtZXRob2RzIHdpbGwgc3RhcnQgYXQgdGhlIGxhc3Qga25vd24gZW1wdHkKKyAqICBkZXNjcmlwdG9yLCBhbmQgcHJvY2VzcyBldmVyeSBzdWJzZXF1ZW50IGRlc2NyaXB0b3IgdW50aWwgdGhlcmUgCisgKiAgYXJlIG5vbmUgbGVmdCB3aXRoIGRhdGEgKE5BUEkgd2lsbCBzdG9wIGFmdGVyIGEgc2V0IG51bWJlciBvZgorICogIHBhY2tldHMgdG8gZ2l2ZSB0aW1lIHRvIG90aGVyIHRhc2tzLCBidXQgd2lsbCBldmVudHVhbGx5CisgKiAgcHJvY2VzcyBhbGwgdGhlIHBhY2tldHMpLiAgVGhlIGRhdGEgYXJyaXZlcyBpbnNpZGUgYQorICogIHByZS1hbGxvY2F0ZWQgc2tiLCBhbmQgc28gYWZ0ZXIgdGhlIHNrYiBpcyBwYXNzZWQgdXAgdG8gdGhlCisgKiAgc3RhY2ssIGEgbmV3IHNrYiBtdXN0IGJlIGFsbG9jYXRlZCwgYW5kIHRoZSBhZGRyZXNzIGZpZWxkIGluCisgKiAgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yIG11c3QgYmUgdXBkYXRlZCB0byBpbmRpY2F0ZSB0aGlzIG5ldworICogIHNrYi4KKyAqCisgKiAgV2hlbiB0aGUga2VybmVsIHJlcXVlc3RzIHRoYXQgYSBwYWNrZXQgYmUgdHJhbnNtaXR0ZWQsIHRoZQorICogIGRyaXZlciBzdGFydHMgd2hlcmUgaXQgbGVmdCBvZmYgbGFzdCB0aW1lLCBhbmQgcG9pbnRzIHRoZQorICogIGRlc2NyaXB0b3IgYXQgdGhlIGJ1ZmZlciB3aGljaCB3YXMgcGFzc2VkIGluLiAgVGhlIGRyaXZlcgorICogIHRoZW4gaW5mb3JtcyB0aGUgRE1BIGVuZ2luZSB0aGF0IHRoZXJlIGFyZSBwYWNrZXRzIHJlYWR5IHRvCisgKiAgYmUgdHJhbnNtaXR0ZWQuICBPbmNlIHRoZSBjb250cm9sbGVyIGlzIGZpbmlzaGVkIHRyYW5zbWl0dGluZworICogIHRoZSBwYWNrZXQsIGFuIGludGVycnVwdCBtYXkgYmUgdHJpZ2dlcmVkICh1bmRlciB0aGUgc2FtZQorICogIGNvbmRpdGlvbnMgYXMgZm9yIHJlY2VwdGlvbiwgYnV0IGRlcGVuZGluZyBvbiB0aGUgVFhGIGJpdCkuCisgKiAgVGhlIGRyaXZlciB0aGVuIGNsZWFucyB1cCB0aGUgYnVmZmVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworI2luY2x1ZGUgImdpYW5mYXIuaCIKKyNpbmNsdWRlICJnaWFuZmFyX3BoeS5oIgorCisjZGVmaW5lIFRYX1RJTUVPVVQgICAgICAoMSpIWikKKyNkZWZpbmUgU0tCX0FMTE9DX1RJTUVPVVQgMTAwMDAwMAorI3VuZGVmIEJSSUVGX0dGQVJfRVJST1JTCisjdW5kZWYgVkVSQk9TRV9HRkFSX0VSUk9SUworCisjaWZkZWYgQ09ORklHX0dGQVJfTkFQSQorI2RlZmluZSBSRUNFSVZFKHgpIG5ldGlmX3JlY2VpdmVfc2tiKHgpCisjZWxzZQorI2RlZmluZSBSRUNFSVZFKHgpIG5ldGlmX3J4KHgpCisjZW5kaWYKKworY29uc3QgY2hhciBnZmFyX2RyaXZlcl9uYW1lW10gPSAiR2lhbmZhciBFdGhlcm5ldCI7Citjb25zdCBjaGFyIGdmYXJfZHJpdmVyX3ZlcnNpb25bXSA9ICIxLjEiOworCitpbnQgc3RhcnR1cF9nZmFyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBnZmFyX2VuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZ2Zhcl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZ2Zhcl90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBnZmFyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RydWN0IHNrX2J1ZmYgKmdmYXJfbmV3X3NrYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcnhiZDggKmJkcCk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdmYXJfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBnZmFyX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZ2Zhcl9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBnZmFyX2Vycm9yKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGlycXJldHVybl90IGdmYXJfdHJhbnNtaXQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitpcnFyZXR1cm5fdCBnZmFyX3JlY2VpdmUoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaXJxcmV0dXJuX3QgZ2Zhcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaXJxcmV0dXJuX3QgcGh5X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIGdmYXJfcGh5X2NoYW5nZSh2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIGdmYXJfcGh5X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBhZGp1c3RfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGluaXRfcmVnaXN0ZXJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpbml0X3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZ2Zhcl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOworc3RhdGljIGludCBnZmFyX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOwordm9pZCBmcmVlX3NrYl9yZXNvdXJjZXMoc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdik7CitzdGF0aWMgdm9pZCBnZmFyX3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGdmYXJfc2V0X2hhc2hfZm9yX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKmFkZHIpOworI2lmZGVmIENPTkZJR19HRkFSX05BUEkKK3N0YXRpYyBpbnQgZ2Zhcl9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KTsKKyNlbmRpZgorc3RhdGljIGludCBnZmFyX2NsZWFuX3J4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJ4X3dvcmtfbGltaXQpOworc3RhdGljIGludCBnZmFyX3Byb2Nlc3NfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCBnZmFyX3BoeV9zdGFydHVwX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKK2V4dGVybiBzdHJ1Y3QgZXRodG9vbF9vcHMgZ2Zhcl9ldGh0b29sX29wczsKKworTU9EVUxFX0FVVEhPUigiRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJHaWFuZmFyIEV0aGVybmV0IERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IGdmYXJfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXUzMiB0ZW1wdmFsOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBOVUxMOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2aWNlKTsKKwlzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICplaW5mbzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJaW50IGlkeDsKKwlpbnQgZXJyID0gMDsKKwlpbnQgZGV2X2V0aHRvb2xfb3BzID0gMDsKKworCWVpbmZvID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAoZWluZm8gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImdmYXIgJWQ6IE1pc3NpbmcgYWRkaXRpb25hbCBkYXRhIVxuIiwKKwkJICAgICAgIHBkZXYtPmlkKTsKKworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBDcmVhdGUgYW4gZXRoZXJuZXQgZGV2aWNlIGluc3RhbmNlICovCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mICgqcHJpdikpOworCisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogU2V0IHRoZSBpbmZvIGluIHRoZSBwcml2IHRvIHRoZSBjdXJyZW50IGluZm8gKi8KKwlwcml2LT5laW5mbyA9IGVpbmZvOworCisJLyogZmlsbCBvdXQgSVJRIGZpZWxkcyAqLworCWlmIChlaW5mby0+ZGV2aWNlX2ZsYWdzICYgRlNMX0dJQU5GQVJfREVWX0hBU19NVUxUSV9JTlRSKSB7CisJCXByaXYtPmludGVycnVwdFRyYW5zbWl0ID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgInR4Iik7CisJCXByaXYtPmludGVycnVwdFJlY2VpdmUgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAicngiKTsKKwkJcHJpdi0+aW50ZXJydXB0RXJyb3IgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAiZXJyb3IiKTsKKwl9IGVsc2UgeworCQlwcml2LT5pbnRlcnJ1cHRUcmFuc21pdCA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJfQorCisJLyogZ2V0IGEgcG9pbnRlciB0byB0aGUgcmVnaXN0ZXIgbWVtb3J5ICovCisJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcHJpdi0+cmVncyA9IChzdHJ1Y3QgZ2ZhciAqKQorCQlpb3JlbWFwKHItPnN0YXJ0LCBzaXplb2YgKHN0cnVjdCBnZmFyKSk7CisKKwlpZiAocHJpdi0+cmVncyA9PSBOVUxMKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gcmVnc19mYWlsOworCX0KKworCS8qIFNldCB0aGUgUEhZIGJhc2UgYWRkcmVzcyAqLworCXByaXYtPnBoeXJlZ3MgPSAoc3RydWN0IGdmYXIgKikKKwkgICAgaW9yZW1hcChlaW5mby0+cGh5X3JlZ19hZGRyLCBzaXplb2YgKHN0cnVjdCBnZmFyKSk7CisKKwlpZiAocHJpdi0+cGh5cmVncyA9PSBOVUxMKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gcGh5X3JlZ3NfZmFpbDsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2aWNlLCBkZXYpOworCisJLyogU3RvcCB0aGUgRE1BIGVuZ2luZSBub3csIGluIGNhc2UgaXQgd2FzIHJ1bm5pbmcgYmVmb3JlICovCisJLyogKFRoZSBmaXJtd2FyZSBjb3VsZCBoYXZlIHVzZWQgaXQsIGFuZCBsZWZ0IGl0IHJ1bm5pbmcpLiAqLworCS8qIFRvIGRvIHRoaXMsIHdlIHdyaXRlIEdyYWNlZnVsIFJlY2VpdmUgU3RvcCBhbmQgR3JhY2VmdWwgKi8KKwkvKiBUcmFuc21pdCBTdG9wLCBhbmQgdGhlbiB3YWl0IHVudGlsIHRoZSBjb3JyZXNwb25kaW5nIGJpdHMgKi8KKwkvKiBpbiBJRVZFTlQgaW5kaWNhdGUgdGhlIHN0b3BzIGhhdmUgY29tcGxldGVkLiAqLworCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPmRtYWN0cmwpOworCXRlbXB2YWwgJj0gfihETUFDVFJMX0dSUyB8IERNQUNUUkxfR1RTKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5kbWFjdHJsLCB0ZW1wdmFsKTsKKworCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPmRtYWN0cmwpOworCXRlbXB2YWwgfD0gKERNQUNUUkxfR1JTIHwgRE1BQ1RSTF9HVFMpOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmRtYWN0cmwsIHRlbXB2YWwpOworCisJd2hpbGUgKCEoZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5pZXZlbnQpICYgKElFVkVOVF9HUlNDIHwgSUVWRU5UX0dUU0MpKSkKKwkJY3B1X3JlbGF4KCk7CisKKwkvKiBSZXNldCBNQUMgbGF5ZXIgKi8KKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5tYWNjZmcxLCBNQUNDRkcxX1NPRlRfUkVTRVQpOworCisJdGVtcHZhbCA9IChNQUNDRkcxX1RYX0ZMT1cgfCBNQUNDRkcxX1JYX0ZMT1cpOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPm1hY2NmZzEsIHRlbXB2YWwpOworCisJLyogSW5pdGlhbGl6ZSBNQUNDRkcyLiAqLworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPm1hY2NmZzIsIE1BQ0NGRzJfSU5JVF9TRVRUSU5HUyk7CisKKwkvKiBJbml0aWFsaXplIEVDTlRSTCAqLworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmVjbnRybCwgRUNOVFJMX0lOSVRfU0VUVElOR1MpOworCisJLyogQ29weSB0aGUgc3RhdGlvbiBhZGRyZXNzIGludG8gdGhlIGRldiBzdHJ1Y3R1cmUsICovCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGVpbmZvLT5tYWNfYWRkciwgTUFDX0FERFJfTEVOKTsKKworCS8qIFNldCB0aGUgZGV2LT5iYXNlX2FkZHIgdG8gdGhlIGdmYXIgcmVnIHJlZ2lvbiAqLworCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIChwcml2LT5yZWdzKTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsIGRldmljZSk7CisKKwkvKiBGaWxsIGluIHRoZSBkZXYgc3RydWN0dXJlICovCisJZGV2LT5vcGVuID0gZ2Zhcl9lbmV0X29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBnZmFyX3N0YXJ0X3htaXQ7CisJZGV2LT50eF90aW1lb3V0ID0gZ2Zhcl90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworI2lmZGVmIENPTkZJR19HRkFSX05BUEkKKwlkZXYtPnBvbGwgPSBnZmFyX3BvbGw7CisJZGV2LT53ZWlnaHQgPSBHRkFSX0RFVl9XRUlHSFQ7CisjZW5kaWYKKwlkZXYtPnN0b3AgPSBnZmFyX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gZ2Zhcl9nZXRfc3RhdHM7CisJZGV2LT5jaGFuZ2VfbXR1ID0gZ2Zhcl9jaGFuZ2VfbXR1OworCWRldi0+bXR1ID0gMTUwMDsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGdmYXJfc2V0X211bHRpOworCisJLyogSW5kZXggaW50byB0aGUgYXJyYXkgb2YgcG9zc2libGUgZXRodG9vbAorCSAqIG9wcyB0byBjYXRjaCBhbGwgNCBwb3NzaWJpbGl0aWVzICovCisJaWYoKHByaXYtPmVpbmZvLT5kZXZpY2VfZmxhZ3MgJiBGU0xfR0lBTkZBUl9ERVZfSEFTX1JNT04pID09IDApCisJCWRldl9ldGh0b29sX29wcyArPSAxOworCisJaWYoKHByaXYtPmVpbmZvLT5kZXZpY2VfZmxhZ3MgJiBGU0xfR0lBTkZBUl9ERVZfSEFTX0NPQUxFU0NFKSA9PSAwKQorCQlkZXZfZXRodG9vbF9vcHMgKz0gMjsKKworCWRldi0+ZXRodG9vbF9vcHMgPSBnZmFyX29wX2FycmF5W2Rldl9ldGh0b29sX29wc107CisKKwlwcml2LT5yeF9idWZmZXJfc2l6ZSA9IERFRkFVTFRfUlhfQlVGRkVSX1NJWkU7CisjaWZkZWYgQ09ORklHX0dGQVJfQlVGU1RBU0gKKwlwcml2LT5yeF9zdGFzaF9zaXplID0gU1RBU0hfTEVOR1RIOworI2VuZGlmCisJcHJpdi0+dHhfcmluZ19zaXplID0gREVGQVVMVF9UWF9SSU5HX1NJWkU7CisJcHJpdi0+cnhfcmluZ19zaXplID0gREVGQVVMVF9SWF9SSU5HX1NJWkU7CisKKwlwcml2LT50eGNvYWxlc2NpbmcgPSBERUZBVUxUX1RYX0NPQUxFU0NFOworCXByaXYtPnR4Y291bnQgPSBERUZBVUxUX1RYQ09VTlQ7CisJcHJpdi0+dHh0aW1lID0gREVGQVVMVF9UWFRJTUU7CisJcHJpdi0+cnhjb2FsZXNjaW5nID0gREVGQVVMVF9SWF9DT0FMRVNDRTsKKwlwcml2LT5yeGNvdW50ID0gREVGQVVMVF9SWENPVU5UOworCXByaXYtPnJ4dGltZSA9IERFRkFVTFRfUlhUSU1FOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCBhYm9ydGluZy5cbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJZ290byByZWdpc3Rlcl9mYWlsOworCX0KKworCS8qIFByaW50IG91dCB0aGUgZGV2aWNlIGluZm8gKi8KKwlwcmludGsoS0VSTl9JTkZPIERFVklDRV9OQU1FLCBkZXYtPm5hbWUpOworCWZvciAoaWR4ID0gMDsgaWR4IDwgNjsgaWR4KyspCisJCXByaW50aygiJTIuMnglYyIsIGRldi0+ZGV2X2FkZHJbaWR4XSwgaWR4ID09IDUgPyAnICcgOiAnOicpOworCXByaW50aygiXG4iKTsKKworCS8qIEV2ZW4gbW9yZSBkZXZpY2UgaW5mbyBoZWxwcyB3aGVuIGRldGVybWluaW5nIHdoaWNoIGtlcm5lbCAqLworCS8qIHByb3ZpZGVkIHdoaWNoIHNldCBvZiBiZW5jaG1hcmtzLiAgU2luY2UgdGhpcyBpcyBnbG9iYWwgZm9yIGFsbCAqLworCS8qIGRldmljZXMsIHdlIG9ubHkgcHJpbnQgaXQgb25jZSAqLworI2lmZGVmIENPTkZJR19HRkFSX05BUEkKKwlwcmludGsoS0VSTl9JTkZPICIlczogUnVubmluZyB3aXRoIE5BUEkgZW5hYmxlZFxuIiwgZGV2LT5uYW1lKTsKKyNlbHNlCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJ1bm5pbmcgd2l0aCBOQVBJIGRpc2FibGVkXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVkLyVkIFJYL1RYIEJEIHJpbmcgc2l6ZVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBwcml2LT5yeF9yaW5nX3NpemUsIHByaXYtPnR4X3Jpbmdfc2l6ZSk7CisKKwlyZXR1cm4gMDsKKworcmVnaXN0ZXJfZmFpbDoKKwlpb3VubWFwKCh2b2lkICopIHByaXYtPnBoeXJlZ3MpOworcGh5X3JlZ3NfZmFpbDoKKwlpb3VubWFwKCh2b2lkICopIHByaXYtPnJlZ3MpOworcmVnc19mYWlsOgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBpbnQgZ2Zhcl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXZpY2UsIE5VTEwpOworCisJaW91bm1hcCgodm9pZCAqKSBwcml2LT5yZWdzKTsKKwlpb3VubWFwKCh2b2lkICopIHByaXYtPnBoeXJlZ3MpOworCWZyZWVfbmV0ZGV2KGRldik7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBDb25maWd1cmUgdGhlIFBIWSBmb3IgZGV2LgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MuICAtMSBpZiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgaW5pdF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGh5X2luZm8gKmN1cnBoeTsKKwl1bnNpZ25lZCBpbnQgdGltZW91dCA9IFBIWV9JTklUX1RJTUVPVVQ7CisJc3RydWN0IGdmYXIgKnBoeXJlZ3MgPSBwcml2LT5waHlyZWdzOworCXN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbzsKKwlpbnQgZXJyOworCisJcHJpdi0+b2xkbGluayA9IDA7CisJcHJpdi0+b2xkc3BlZWQgPSAwOworCXByaXYtPm9sZGR1cGxleCA9IC0xOworCisJbWlpX2luZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyksCisJCQlHRlBfS0VSTkVMKTsKKworCWlmKE5VTEwgPT0gbWlpX2luZm8pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ291bGQgbm90IGFsbG9jYXRlIG1paV9pbmZvXG4iLCAKKwkJCQlkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltaWlfaW5mby0+c3BlZWQgPSBTUEVFRF8xMDAwOworCW1paV9pbmZvLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwltaWlfaW5mby0+cGF1c2UgPSAwOworCW1paV9pbmZvLT5saW5rID0gMTsKKworCW1paV9pbmZvLT5hZHZlcnRpc2luZyA9IChBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8CisJCQlBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB8CisJCQlBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgfAorCQkJQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsIHwKKwkJCUFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpOworCW1paV9pbmZvLT5hdXRvbmVnID0gMTsKKworCXNwaW5fbG9ja19pbml0KCZtaWlfaW5mby0+bWRpb19sb2NrKTsKKworCW1paV9pbmZvLT5taWlfaWQgPSBwcml2LT5laW5mby0+cGh5aWQ7CisKKwltaWlfaW5mby0+ZGV2ID0gZGV2OworCisJbWlpX2luZm8tPm1kaW9fcmVhZCA9ICZyZWFkX3BoeV9yZWc7CisJbWlpX2luZm8tPm1kaW9fd3JpdGUgPSAmd3JpdGVfcGh5X3JlZzsKKworCXByaXYtPm1paV9pbmZvID0gbWlpX2luZm87CisKKwkvKiBSZXNldCB0aGUgbWFuYWdlbWVudCBpbnRlcmZhY2UgKi8KKwlnZmFyX3dyaXRlKCZwaHlyZWdzLT5taWltY2ZnLCBNSUlNQ0ZHX1JFU0VUKTsKKworCS8qIFNldHVwIHRoZSBNSUkgTWdtdCBjbG9jayBzcGVlZCAqLworCWdmYXJfd3JpdGUoJnBoeXJlZ3MtPm1paW1jZmcsIE1JSU1DRkdfSU5JVF9WQUxVRSk7CisKKwkvKiBXYWl0IHVudGlsIHRoZSBidXMgaXMgZnJlZSAqLworCXdoaWxlICgoZ2Zhcl9yZWFkKCZwaHlyZWdzLT5taWltaW5kKSAmIE1JSU1JTkRfQlVTWSkgJiYKKwkJCXRpbWVvdXQtLSkKKwkJY3B1X3JlbGF4KCk7CisKKwlpZih0aW1lb3V0IDw9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVGhlIE1JSSBCdXMgaXMgc3R1Y2shXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCWVyciA9IC0xOworCQlnb3RvIGJ1c19mYWlsOworCX0KKworCS8qIGdldCBpbmZvIGZvciB0aGlzIFBIWSAqLworCWN1cnBoeSA9IGdldF9waHlfaW5mbyhwcml2LT5taWlfaW5mbyk7CisKKwlpZiAoY3VycGh5ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogTm8gUEhZIGZvdW5kXG4iLCBkZXYtPm5hbWUpOworCQllcnIgPSAtMTsKKwkJZ290byBub19waHk7CisJfQorCisJbWlpX2luZm8tPnBoeWluZm8gPSBjdXJwaHk7CisKKwkvKiBSdW4gdGhlIGNvbW1hbmRzIHdoaWNoIGluaXRpYWxpemUgdGhlIFBIWSAqLworCWlmKGN1cnBoeS0+aW5pdCkgeworCQllcnIgPSBjdXJwaHktPmluaXQocHJpdi0+bWlpX2luZm8pOworCisJCWlmIChlcnIpIAorCQkJZ290byBwaHlfaW5pdF9mYWlsOworCX0KKworCXJldHVybiAwOworCitwaHlfaW5pdF9mYWlsOgorbm9fcGh5OgorYnVzX2ZhaWw6CisJa2ZyZWUobWlpX2luZm8pOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgaW5pdF9yZWdpc3RlcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIENsZWFyIElFVkVOVCAqLworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlldmVudCwgSUVWRU5UX0lOSVRfQ0xFQVIpOworCisJLyogSW5pdGlhbGl6ZSBJTUFTSyAqLworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmltYXNrLCBJTUFTS19JTklUX0NMRUFSKTsKKworCS8qIEluaXQgaGFzaCByZWdpc3RlcnMgdG8gemVybyAqLworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlhZGRyMCwgMCk7CisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+aWFkZHIxLCAwKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pYWRkcjIsIDApOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlhZGRyMywgMCk7CisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+aWFkZHI0LCAwKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pYWRkcjUsIDApOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlhZGRyNiwgMCk7CisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+aWFkZHI3LCAwKTsKKworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmdhZGRyMCwgMCk7CisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+Z2FkZHIxLCAwKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5nYWRkcjIsIDApOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmdhZGRyMywgMCk7CisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+Z2FkZHI0LCAwKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5nYWRkcjUsIDApOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmdhZGRyNiwgMCk7CisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+Z2FkZHI3LCAwKTsKKworCS8qIFplcm8gb3V0IHJjdHJsICovCisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+cmN0cmwsIDB4MDAwMDAwMDApOworCisJLyogWmVybyBvdXQgdGhlIHJtb24gbWliIHJlZ2lzdGVycyBpZiBpdCBoYXMgdGhlbSAqLworCWlmIChwcml2LT5laW5mby0+ZGV2aWNlX2ZsYWdzICYgRlNMX0dJQU5GQVJfREVWX0hBU19STU9OKSB7CisJCW1lbXNldCgodm9pZCAqKSAmKHByaXYtPnJlZ3MtPnJtb24pLCAwLAorCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3Qgcm1vbl9taWIpKTsKKworCQkvKiBNYXNrIG9mZiB0aGUgQ0FNIGludGVycnVwdHMgKi8KKwkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+cm1vbi5jYW0xLCAweGZmZmZmZmZmKTsKKwkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+cm1vbi5jYW0yLCAweGZmZmZmZmZmKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBtYXggcmVjZWl2ZSBidWZmZXIgbGVuZ3RoICovCisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+bXJibHIsIHByaXYtPnJ4X2J1ZmZlcl9zaXplKTsKKworI2lmZGVmIENPTkZJR19HRkFSX0JVRlNUQVNICisJLyogSWYgd2UgYXJlIHN0YXNoaW5nIGJ1ZmZlcnMsIHdlIG5lZWQgdG8gc2V0IHRoZQorCSAqIGV4dHJhY3Rpb24gbGVuZ3RoIHRvIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgKi8KKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5hdHRyZWxpLCBwcml2LT5yeF9zdGFzaF9zaXplIDw8IDE2KTsKKyNlbmRpZgorCisJLyogSW5pdGlhbGl6ZSB0aGUgTWluaW11bSBGcmFtZSBMZW5ndGggUmVnaXN0ZXIgKi8KKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5taW5mbHIsIE1JTkZMUl9JTklUX1NFVFRJTkdTKTsKKworCS8qIFNldHVwIEF0dHJpYnV0ZXMgc28gdGhhdCBzbm9vcGluZyBpcyBvbiBmb3IgcnggKi8KKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5hdHRyLCBBVFRSX0lOSVRfU0VUVElOR1MpOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmF0dHJlbGksIEFUVFJFTElfSU5JVF9TRVRUSU5HUyk7CisKKwkvKiBBc3NpZ24gdGhlIFRCSSBhbiBhZGRyZXNzIHdoaWNoIHdvbid0IGNvbmZsaWN0IHdpdGggdGhlIFBIWXMgKi8KKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT50YmlwYSwgVEJJUEFfVkFMVUUpOworfQorCit2b2lkIHN0b3BfZ2ZhcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBnZmFyICpyZWdzID0gcHJpdi0+cmVnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB0ZW1wdmFsOworCisJLyogTG9jayBpdCBkb3duICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCS8qIFRlbGwgdGhlIGtlcm5lbCB0aGUgbGluayBpcyBkb3duICovCisJcHJpdi0+bWlpX2luZm8tPmxpbmsgPSAwOworCWFkanVzdF9saW5rKGRldik7CisKKwkvKiBNYXNrIGFsbCBpbnRlcnJ1cHRzICovCisJZ2Zhcl93cml0ZSgmcmVncy0+aW1hc2ssIElNQVNLX0lOSVRfQ0xFQVIpOworCisJLyogQ2xlYXIgYWxsIGludGVycnVwdHMgKi8KKwlnZmFyX3dyaXRlKCZyZWdzLT5pZXZlbnQsIElFVkVOVF9JTklUX0NMRUFSKTsKKworCS8qIFN0b3AgdGhlIERNQSwgYW5kIHdhaXQgZm9yIGl0IHRvIHN0b3AgKi8KKwl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5kbWFjdHJsKTsKKwlpZiAoKHRlbXB2YWwgJiAoRE1BQ1RSTF9HUlMgfCBETUFDVFJMX0dUUykpCisJICAgICE9IChETUFDVFJMX0dSUyB8IERNQUNUUkxfR1RTKSkgeworCQl0ZW1wdmFsIHw9IChETUFDVFJMX0dSUyB8IERNQUNUUkxfR1RTKTsKKwkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+ZG1hY3RybCwgdGVtcHZhbCk7CisKKwkJd2hpbGUgKCEoZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5pZXZlbnQpICYKKwkJCSAoSUVWRU5UX0dSU0MgfCBJRVZFTlRfR1RTQykpKQorCQkJY3B1X3JlbGF4KCk7CisJfQorCisJLyogRGlzYWJsZSBSeCBhbmQgVHggKi8KKwl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZyZWdzLT5tYWNjZmcxKTsKKwl0ZW1wdmFsICY9IH4oTUFDQ0ZHMV9SWF9FTiB8IE1BQ0NGRzFfVFhfRU4pOworCWdmYXJfd3JpdGUoJnJlZ3MtPm1hY2NmZzEsIHRlbXB2YWwpOworCisJaWYgKHByaXYtPmVpbmZvLT5ib2FyZF9mbGFncyAmIEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFIpIHsKKwkJLyogQ2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0cyAqLworCQltaWlfY2xlYXJfcGh5X2ludGVycnVwdChwcml2LT5taWlfaW5mbyk7CisKKwkJLyogRGlzYWJsZSBQSFkgSW50ZXJydXB0cyAqLworCQltaWlfY29uZmlndXJlX3BoeV9pbnRlcnJ1cHQocHJpdi0+bWlpX2luZm8sIAorCQkJCU1JSV9JTlRFUlJVUFRfRElTQUJMRUQpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCS8qIEZyZWUgdGhlIElSUXMgKi8KKwlpZiAocHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfTVVMVElfSU5UUikgeworCQlmcmVlX2lycShwcml2LT5pbnRlcnJ1cHRFcnJvciwgZGV2KTsKKwkJZnJlZV9pcnEocHJpdi0+aW50ZXJydXB0VHJhbnNtaXQsIGRldik7CisJCWZyZWVfaXJxKHByaXYtPmludGVycnVwdFJlY2VpdmUsIGRldik7CisJfSBlbHNlIHsKKwkJZnJlZV9pcnEocHJpdi0+aW50ZXJydXB0VHJhbnNtaXQsIGRldik7CisJfQorCisJaWYgKHByaXYtPmVpbmZvLT5ib2FyZF9mbGFncyAmIEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFIpIHsKKwkJZnJlZV9pcnEocHJpdi0+ZWluZm8tPmludGVycnVwdFBIWSwgZGV2KTsKKwl9IGVsc2UgeworCQlkZWxfdGltZXJfc3luYygmcHJpdi0+cGh5X2luZm9fdGltZXIpOworCX0KKworCWZyZWVfc2tiX3Jlc291cmNlcyhwcml2KTsKKworCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsCisJCQlzaXplb2Yoc3RydWN0IHR4YmQ4KSpwcml2LT50eF9yaW5nX3NpemUKKwkJCSsgc2l6ZW9mKHN0cnVjdCByeGJkOCkqcHJpdi0+cnhfcmluZ19zaXplLAorCQkJcHJpdi0+dHhfYmRfYmFzZSwKKwkJCWdmYXJfcmVhZCgmcmVncy0+dGJhc2UpKTsKK30KKworLyogSWYgdGhlcmUgYXJlIGFueSB0eCBza2JzIG9yIHJ4IHNrYnMgc3RpbGwgYXJvdW5kLCBmcmVlIHRoZW0uCisgKiBUaGVuIGZyZWUgdHhfc2tidWZmIGFuZCByeF9za2J1ZmYgKi8KK3ZvaWQgZnJlZV9za2JfcmVzb3VyY2VzKHN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYpCit7CisJc3RydWN0IHJ4YmQ4ICpyeGJkcDsKKwlzdHJ1Y3QgdHhiZDggKnR4YmRwOworCWludCBpOworCisJLyogR28gdGhyb3VnaCBhbGwgdGhlIGJ1ZmZlciBkZXNjcmlwdG9ycyBhbmQgZnJlZSB0aGVpciBkYXRhIGJ1ZmZlcnMgKi8KKwl0eGJkcCA9IHByaXYtPnR4X2JkX2Jhc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+dHhfcmluZ19zaXplOyBpKyspIHsKKworCQlpZiAocHJpdi0+dHhfc2tidWZmW2ldKSB7CisJCQlkbWFfdW5tYXBfc2luZ2xlKE5VTEwsIHR4YmRwLT5idWZQdHIsCisJCQkJCXR4YmRwLT5sZW5ndGgsCisJCQkJCURNQV9UT19ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYl9hbnkocHJpdi0+dHhfc2tidWZmW2ldKTsKKwkJCXByaXYtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCX0KKwl9CisKKwlrZnJlZShwcml2LT50eF9za2J1ZmYpOworCisJcnhiZHAgPSBwcml2LT5yeF9iZF9iYXNlOworCisJLyogcnhfc2tidWZmIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGFsbG9jYXRlZCwgc28gb25seQorCSAqIGZyZWUgaXQgYW5kIGl0cyBjb250ZW50cyBpZiBpdCBpcyBhbGxvY2F0ZWQgKi8KKwlpZihwcml2LT5yeF9za2J1ZmYgIT0gTlVMTCkgeworCQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+cnhfcmluZ19zaXplOyBpKyspIHsKKwkJCWlmIChwcml2LT5yeF9za2J1ZmZbaV0pIHsKKwkJCQlkbWFfdW5tYXBfc2luZ2xlKE5VTEwsIHJ4YmRwLT5idWZQdHIsCisJCQkJCQlwcml2LT5yeF9idWZmZXJfc2l6ZQorCQkJCQkJKyBSWEJVRl9BTElHTk1FTlQsCisJCQkJCQlETUFfRlJPTV9ERVZJQ0UpOworCisJCQkJZGV2X2tmcmVlX3NrYl9hbnkocHJpdi0+cnhfc2tidWZmW2ldKTsKKwkJCQlwcml2LT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCQkJfQorCisJCQlyeGJkcC0+c3RhdHVzID0gMDsKKwkJCXJ4YmRwLT5sZW5ndGggPSAwOworCQkJcnhiZHAtPmJ1ZlB0ciA9IDA7CisKKwkJCXJ4YmRwKys7CisJCX0KKworCQlrZnJlZShwcml2LT5yeF9za2J1ZmYpOworCX0KK30KKworLyogQnJpbmcgdGhlIGNvbnRyb2xsZXIgdXAgYW5kIHJ1bm5pbmcgKi8KK2ludCBzdGFydHVwX2dmYXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHhiZDggKnR4YmRwOworCXN0cnVjdCByeGJkOCAqcnhiZHA7CisJZG1hX2FkZHJfdCBhZGRyOworCXVuc2lnbmVkIGxvbmcgdmFkZHI7CisJaW50IGk7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGdmYXIgKnJlZ3MgPSBwcml2LT5yZWdzOworCXUzMiB0ZW1wdmFsOworCWludCBlcnIgPSAwOworCisJZ2Zhcl93cml0ZSgmcmVncy0+aW1hc2ssIElNQVNLX0lOSVRfQ0xFQVIpOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgYnVmZmVyIGRlc2NyaXB0b3JzICovCisJdmFkZHIgPSAodW5zaWduZWQgbG9uZykgZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIAorCQkJc2l6ZW9mIChzdHJ1Y3QgdHhiZDgpICogcHJpdi0+dHhfcmluZ19zaXplICsKKwkJCXNpemVvZiAoc3RydWN0IHJ4YmQ4KSAqIHByaXYtPnJ4X3Jpbmdfc2l6ZSwKKwkJCSZhZGRyLCBHRlBfS0VSTkVMKTsKKworCWlmICh2YWRkciA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXIgZGVzY3JpcHRvcnMhXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcHJpdi0+dHhfYmRfYmFzZSA9IChzdHJ1Y3QgdHhiZDggKikgdmFkZHI7CisKKwkvKiBlbmV0IERNQSBvbmx5IHVuZGVyc3RhbmRzIHBoeXNpY2FsIGFkZHJlc3NlcyAqLworCWdmYXJfd3JpdGUoJnJlZ3MtPnRiYXNlLCBhZGRyKTsKKworCS8qIFN0YXJ0IHRoZSByeCBkZXNjcmlwdG9yIHJpbmcgd2hlcmUgdGhlIHR4IHJpbmcgbGVhdmVzIG9mZiAqLworCWFkZHIgPSBhZGRyICsgc2l6ZW9mIChzdHJ1Y3QgdHhiZDgpICogcHJpdi0+dHhfcmluZ19zaXplOworCXZhZGRyID0gdmFkZHIgKyBzaXplb2YgKHN0cnVjdCB0eGJkOCkgKiBwcml2LT50eF9yaW5nX3NpemU7CisJcHJpdi0+cnhfYmRfYmFzZSA9IChzdHJ1Y3QgcnhiZDggKikgdmFkZHI7CisJZ2Zhcl93cml0ZSgmcmVncy0+cmJhc2UsIGFkZHIpOworCisJLyogU2V0dXAgdGhlIHNrYnVmZiByaW5ncyAqLworCXByaXYtPnR4X3NrYnVmZiA9CisJICAgIChzdHJ1Y3Qgc2tfYnVmZiAqKikga21hbGxvYyhzaXplb2YgKHN0cnVjdCBza19idWZmICopICoKKwkJCQkJcHJpdi0+dHhfcmluZ19zaXplLCBHRlBfS0VSTkVMKTsKKworCWlmIChwcml2LT50eF9za2J1ZmYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgdHhfc2tidWZmXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byB0eF9za2JfZmFpbDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+dHhfcmluZ19zaXplOyBpKyspCisJCXByaXYtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisKKwlwcml2LT5yeF9za2J1ZmYgPQorCSAgICAoc3RydWN0IHNrX2J1ZmYgKiopIGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3Qgc2tfYnVmZiAqKSAqCisJCQkJCXByaXYtPnJ4X3Jpbmdfc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAocHJpdi0+cnhfc2tidWZmID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ291bGQgbm90IGFsbG9jYXRlIHJ4X3NrYnVmZlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gcnhfc2tiX2ZhaWw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHByaXYtPnJ4X3Jpbmdfc2l6ZTsgaSsrKQorCQlwcml2LT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCisJLyogSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBpbiBvdXIgZGV2IHN0cnVjdHVyZSAqLworCXByaXYtPmRpcnR5X3R4ID0gcHJpdi0+Y3VyX3R4ID0gcHJpdi0+dHhfYmRfYmFzZTsKKwlwcml2LT5jdXJfcnggPSBwcml2LT5yeF9iZF9iYXNlOworCXByaXYtPnNrYl9jdXJ0eCA9IHByaXYtPnNrYl9kaXJ0eXR4ID0gMDsKKwlwcml2LT5za2JfY3VycnggPSAwOworCisJLyogSW5pdGlhbGl6ZSBUcmFuc21pdCBEZXNjcmlwdG9yIFJpbmcgKi8KKwl0eGJkcCA9IHByaXYtPnR4X2JkX2Jhc2U7CisJZm9yIChpID0gMDsgaSA8IHByaXYtPnR4X3Jpbmdfc2l6ZTsgaSsrKSB7CisJCXR4YmRwLT5zdGF0dXMgPSAwOworCQl0eGJkcC0+bGVuZ3RoID0gMDsKKwkJdHhiZHAtPmJ1ZlB0ciA9IDA7CisJCXR4YmRwKys7CisJfQorCisJLyogU2V0IHRoZSBsYXN0IGRlc2NyaXB0b3IgaW4gdGhlIHJpbmcgdG8gaW5kaWNhdGUgd3JhcCAqLworCXR4YmRwLS07CisJdHhiZHAtPnN0YXR1cyB8PSBUWEJEX1dSQVA7CisKKwlyeGJkcCA9IHByaXYtPnJ4X2JkX2Jhc2U7CisJZm9yIChpID0gMDsgaSA8IHByaXYtPnJ4X3Jpbmdfc2l6ZTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCisJCXJ4YmRwLT5zdGF0dXMgPSAwOworCisJCXNrYiA9IGdmYXJfbmV3X3NrYihkZXYsIHJ4YmRwKTsKKworCQlwcml2LT5yeF9za2J1ZmZbaV0gPSBza2I7CisKKwkJcnhiZHArKzsKKwl9CisKKwkvKiBTZXQgdGhlIGxhc3QgZGVzY3JpcHRvciBpbiB0aGUgcmluZyB0byB3cmFwICovCisJcnhiZHAtLTsKKwlyeGJkcC0+c3RhdHVzIHw9IFJYQkRfV1JBUDsKKworCS8qIElmIHRoZSBkZXZpY2UgaGFzIG11bHRpcGxlIGludGVycnVwdHMsIHJlZ2lzdGVyIGZvcgorCSAqIHRoZW0uICBPdGhlcndpc2UsIG9ubHkgcmVnaXN0ZXIgZm9yIHRoZSBvbmUgKi8KKwlpZiAocHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfTVVMVElfSU5UUikgeworCQkvKiBJbnN0YWxsIG91ciBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIEVycm9yLCAKKwkJICogVHJhbnNtaXQsIGFuZCBSZWNlaXZlICovCisJCWlmIChyZXF1ZXN0X2lycShwcml2LT5pbnRlcnJ1cHRFcnJvciwgZ2Zhcl9lcnJvciwKKwkJCQkwLCAiZW5ldF9lcnJvciIsIGRldikgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBnZXQgSVJRICVkXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgcHJpdi0+aW50ZXJydXB0RXJyb3IpOworCisJCQllcnIgPSAtMTsKKwkJCWdvdG8gZXJyX2lycV9mYWlsOworCQl9CisKKwkJaWYgKHJlcXVlc3RfaXJxKHByaXYtPmludGVycnVwdFRyYW5zbWl0LCBnZmFyX3RyYW5zbWl0LAorCQkJCTAsICJlbmV0X3R4IiwgZGV2KSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IGdldCBJUlEgJWRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBwcml2LT5pbnRlcnJ1cHRUcmFuc21pdCk7CisKKwkJCWVyciA9IC0xOworCisJCQlnb3RvIHR4X2lycV9mYWlsOworCQl9CisKKwkJaWYgKHJlcXVlc3RfaXJxKHByaXYtPmludGVycnVwdFJlY2VpdmUsIGdmYXJfcmVjZWl2ZSwKKwkJCQkwLCAiZW5ldF9yeCIsIGRldikgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBnZXQgSVJRICVkIChyZWNlaXZlMClcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBwcml2LT5pbnRlcnJ1cHRSZWNlaXZlKTsKKworCQkJZXJyID0gLTE7CisJCQlnb3RvIHJ4X2lycV9mYWlsOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHJlcXVlc3RfaXJxKHByaXYtPmludGVycnVwdFRyYW5zbWl0LCBnZmFyX2ludGVycnVwdCwKKwkJCQkwLCAiZ2Zhcl9pbnRlcnJ1cHQiLCBkZXYpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgZ2V0IElSUSAlZFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHByaXYtPmludGVycnVwdEVycm9yKTsKKworCQkJZXJyID0gLTE7CisJCQlnb3RvIGVycl9pcnFfZmFpbDsKKwkJfQorCX0KKworCS8qIFNldCB1cCB0aGUgUEhZIGNoYW5nZSB3b3JrIHF1ZXVlICovCisJSU5JVF9XT1JLKCZwcml2LT50cSwgZ2Zhcl9waHlfY2hhbmdlLCBkZXYpOworCisJaW5pdF90aW1lcigmcHJpdi0+cGh5X2luZm9fdGltZXIpOworCXByaXYtPnBoeV9pbmZvX3RpbWVyLmZ1bmN0aW9uID0gJmdmYXJfcGh5X3N0YXJ0dXBfdGltZXI7CisJcHJpdi0+cGh5X2luZm9fdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBwcml2LT5taWlfaW5mbzsKKwltb2RfdGltZXIoJnByaXYtPnBoeV9pbmZvX3RpbWVyLCBqaWZmaWVzICsgSFopOworCisJLyogQ29uZmlndXJlIHRoZSBjb2FsZXNjaW5nIHN1cHBvcnQgKi8KKwlpZiAocHJpdi0+dHhjb2FsZXNjaW5nKQorCQlnZmFyX3dyaXRlKCZyZWdzLT50eGljLAorCQkJICAgbWtfaWNfdmFsdWUocHJpdi0+dHhjb3VudCwgcHJpdi0+dHh0aW1lKSk7CisJZWxzZQorCQlnZmFyX3dyaXRlKCZyZWdzLT50eGljLCAwKTsKKworCWlmIChwcml2LT5yeGNvYWxlc2NpbmcpCisJCWdmYXJfd3JpdGUoJnJlZ3MtPnJ4aWMsCisJCQkgICBta19pY192YWx1ZShwcml2LT5yeGNvdW50LCBwcml2LT5yeHRpbWUpKTsKKwllbHNlCisJCWdmYXJfd3JpdGUoJnJlZ3MtPnJ4aWMsIDApOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcHJpdi0+cnhjbGVhbnVwcSk7CisKKwkvKiBFbmFibGUgUnggYW5kIFR4IGluIE1BQ0NGRzEgKi8KKwl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZyZWdzLT5tYWNjZmcxKTsKKwl0ZW1wdmFsIHw9IChNQUNDRkcxX1JYX0VOIHwgTUFDQ0ZHMV9UWF9FTik7CisJZ2Zhcl93cml0ZSgmcmVncy0+bWFjY2ZnMSwgdGVtcHZhbCk7CisKKwkvKiBJbml0aWFsaXplIERNQUNUUkwgdG8gaGF2ZSBXV1IgYW5kIFdPUCAqLworCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPmRtYWN0cmwpOworCXRlbXB2YWwgfD0gRE1BQ1RSTF9JTklUX1NFVFRJTkdTOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmRtYWN0cmwsIHRlbXB2YWwpOworCisJLyogQ2xlYXIgVEhMVCwgc28gdGhhdCB0aGUgRE1BIHN0YXJ0cyBwb2xsaW5nIG5vdyAqLworCWdmYXJfd3JpdGUoJnJlZ3MtPnRzdGF0LCBUU1RBVF9DTEVBUl9USEFMVCk7CisKKwkvKiBNYWtlIHN1cmUgd2UgYXJlbid0IHN0b3BwZWQgKi8KKwl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5kbWFjdHJsKTsKKwl0ZW1wdmFsICY9IH4oRE1BQ1RSTF9HUlMgfCBETUFDVFJMX0dUUyk7CisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+ZG1hY3RybCwgdGVtcHZhbCk7CisKKwkvKiBVbm1hc2sgdGhlIGludGVycnVwdHMgd2UgbG9vayBmb3IgKi8KKwlnZmFyX3dyaXRlKCZyZWdzLT5pbWFzaywgSU1BU0tfREVGQVVMVCk7CisKKwlyZXR1cm4gMDsKKworcnhfaXJxX2ZhaWw6CisJZnJlZV9pcnEocHJpdi0+aW50ZXJydXB0VHJhbnNtaXQsIGRldik7Cit0eF9pcnFfZmFpbDoKKwlmcmVlX2lycShwcml2LT5pbnRlcnJ1cHRFcnJvciwgZGV2KTsKK2Vycl9pcnFfZmFpbDoKK3J4X3NrYl9mYWlsOgorCWZyZWVfc2tiX3Jlc291cmNlcyhwcml2KTsKK3R4X3NrYl9mYWlsOgorCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsCisJCQlzaXplb2Yoc3RydWN0IHR4YmQ4KSpwcml2LT50eF9yaW5nX3NpemUKKwkJCSsgc2l6ZW9mKHN0cnVjdCByeGJkOCkqcHJpdi0+cnhfcmluZ19zaXplLAorCQkJcHJpdi0+dHhfYmRfYmFzZSwKKwkJCWdmYXJfcmVhZCgmcmVncy0+dGJhc2UpKTsKKworCWlmIChwcml2LT5taWlfaW5mby0+cGh5aW5mby0+Y2xvc2UpCisJCXByaXYtPm1paV9pbmZvLT5waHlpbmZvLT5jbG9zZShwcml2LT5taWlfaW5mbyk7CisKKwlrZnJlZShwcml2LT5taWlfaW5mbyk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBDYWxsZWQgd2hlbiBzb21ldGhpbmcgbmVlZHMgdG8gdXNlIHRoZSBldGhlcm5ldCBkZXZpY2UgKi8KKy8qIFJldHVybnMgMCBmb3Igc3VjY2Vzcy4gKi8KK3N0YXRpYyBpbnQgZ2Zhcl9lbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyOworCisJLyogSW5pdGlhbGl6ZSBhIGJ1bmNoIG9mIHJlZ2lzdGVycyAqLworCWluaXRfcmVnaXN0ZXJzKGRldik7CisKKwlnZmFyX3NldF9tYWNfYWRkcmVzcyhkZXYpOworCisJZXJyID0gaW5pdF9waHkoZGV2KTsKKworCWlmKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHN0YXJ0dXBfZ2ZhcihkZXYpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBrZXJuZWwgd2hlbiBhIGZyYW1lIGlzIHJlYWR5IGZvciB0cmFuc21pc3Npb24uICovCisvKiBJdCBpcyBwb2ludGVkIHRvIGJ5IHRoZSBkZXYtPmhhcmRfc3RhcnRfeG1pdCBmdW5jdGlvbiBwb2ludGVyICovCitzdGF0aWMgaW50IGdmYXJfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCB0eGJkOCAqdHhiZHA7CisKKwkvKiBVcGRhdGUgdHJhbnNtaXQgc3RhdHMgKi8KKwlwcml2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCS8qIExvY2sgcHJpdiBub3cgKi8KKwlzcGluX2xvY2tfaXJxKCZwcml2LT5sb2NrKTsKKworCS8qIFBvaW50IGF0IHRoZSBmaXJzdCBmcmVlIHR4IGRlc2NyaXB0b3IgKi8KKwl0eGJkcCA9IHByaXYtPmN1cl90eDsKKworCS8qIENsZWFyIGFsbCBidXQgdGhlIFdSQVAgc3RhdHVzIGZsYWdzICovCisJdHhiZHAtPnN0YXR1cyAmPSBUWEJEX1dSQVA7CisKKwkvKiBTZXQgYnVmZmVyIGxlbmd0aCBhbmQgcG9pbnRlciAqLworCXR4YmRwLT5sZW5ndGggPSBza2ItPmxlbjsKKwl0eGJkcC0+YnVmUHRyID0gZG1hX21hcF9zaW5nbGUoTlVMTCwgc2tiLT5kYXRhLCAKKwkJCXNrYi0+bGVuLCBETUFfVE9fREVWSUNFKTsKKworCS8qIFNhdmUgdGhlIHNrYiBwb2ludGVyIHNvIHdlIGNhbiBmcmVlIGl0IGxhdGVyICovCisJcHJpdi0+dHhfc2tidWZmW3ByaXYtPnNrYl9jdXJ0eF0gPSBza2I7CisKKwkvKiBVcGRhdGUgdGhlIGN1cnJlbnQgc2tiIHBvaW50ZXIgKHdyYXBwaW5nIGlmIHRoaXMgd2FzIHRoZSBsYXN0KSAqLworCXByaXYtPnNrYl9jdXJ0eCA9CisJICAgIChwcml2LT5za2JfY3VydHggKyAxKSAmIFRYX1JJTkdfTU9EX01BU0socHJpdi0+dHhfcmluZ19zaXplKTsKKworCS8qIEZsYWcgdGhlIEJEIGFzIGludGVycnVwdC1jYXVzaW5nICovCisJdHhiZHAtPnN0YXR1cyB8PSBUWEJEX0lOVEVSUlVQVDsKKworCS8qIEZsYWcgdGhlIEJEIGFzIHJlYWR5IHRvIGdvLCBsYXN0IGluIGZyYW1lLCBhbmQgICovCisJLyogaW4gbmVlZCBvZiBDUkMgKi8KKwl0eGJkcC0+c3RhdHVzIHw9IChUWEJEX1JFQURZIHwgVFhCRF9MQVNUIHwgVFhCRF9DUkMpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwkvKiBJZiB0aGlzIHdhcyB0aGUgbGFzdCBCRCBpbiB0aGUgcmluZywgdGhlIG5leHQgb25lICovCisJLyogaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmluZyAqLworCWlmICh0eGJkcC0+c3RhdHVzICYgVFhCRF9XUkFQKQorCQl0eGJkcCA9IHByaXYtPnR4X2JkX2Jhc2U7CisJZWxzZQorCQl0eGJkcCsrOworCisJLyogSWYgdGhlIG5leHQgQkQgc3RpbGwgbmVlZHMgdG8gYmUgY2xlYW5lZCB1cCwgdGhlbiB0aGUgYmRzCisJICAgYXJlIGZ1bGwuICBXZSBuZWVkIHRvIHRlbGwgdGhlIGtlcm5lbCB0byBzdG9wIHNlbmRpbmcgdXMgc3R1ZmYuICovCisJaWYgKHR4YmRwID09IHByaXYtPmRpcnR5X3R4KSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQlwcml2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCX0KKworCS8qIFVwZGF0ZSB0aGUgY3VycmVudCB0eGJkIHRvIHRoZSBuZXh0IG9uZSAqLworCXByaXYtPmN1cl90eCA9IHR4YmRwOworCisJLyogVGVsbCB0aGUgRE1BIHRvIGdvIGdvIGdvICovCisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+dHN0YXQsIFRTVEFUX0NMRUFSX1RIQUxUKTsKKworCS8qIFVubG9jayBwcml2ICovCisJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKiBTdG9wcyB0aGUga2VybmVsIHF1ZXVlLCBhbmQgaGFsdHMgdGhlIGNvbnRyb2xsZXIgKi8KK3N0YXRpYyBpbnQgZ2Zhcl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0b3BfZ2ZhcihkZXYpOworCisJLyogU2h1dGRvd24gdGhlIFBIWSAqLworCWlmIChwcml2LT5taWlfaW5mby0+cGh5aW5mby0+Y2xvc2UpCisJCXByaXYtPm1paV9pbmZvLT5waHlpbmZvLT5jbG9zZShwcml2LT5taWlfaW5mbyk7CisKKwlrZnJlZShwcml2LT5taWlfaW5mbyk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyogcmV0dXJucyBhIG5ldF9kZXZpY2Vfc3RhdHMgc3RydWN0dXJlIHBvaW50ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqIGdmYXJfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gJihwcml2LT5zdGF0cyk7Cit9CisKKy8qIENoYW5nZXMgdGhlIG1hYyBhZGRyZXNzIGlmIHRoZSBjb250cm9sbGVyIGlzIG5vdCBydW5uaW5nLiAqLworaW50IGdmYXJfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisJY2hhciB0bXBidWZbTUFDX0FERFJfTEVOXTsKKwl1MzIgdGVtcHZhbDsKKworCS8qIE5vdyBjb3B5IGl0IGludG8gdGhlIG1hYyByZWdpc3RlcnMgYmFja3dhcmRzLCBjdXogKi8KKwkvKiBsaXR0bGUgZW5kaWFuIGlzIHNpbGx5ICovCisJZm9yIChpID0gMDsgaSA8IE1BQ19BRERSX0xFTjsgaSsrKQorCQl0bXBidWZbTUFDX0FERFJfTEVOIC0gMSAtIGldID0gZGV2LT5kZXZfYWRkcltpXTsKKworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPm1hY3N0bmFkZHIxLCAqKCh1MzIgKikgKHRtcGJ1ZikpKTsKKworCXRlbXB2YWwgPSAqKCh1MzIgKikgKHRtcGJ1ZiArIDQpKTsKKworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPm1hY3N0bmFkZHIyLCB0ZW1wdmFsKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZ2Zhcl9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCWludCB0ZW1wc2l6ZSwgdGVtcHZhbDsKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgb2xkc2l6ZSA9IHByaXYtPnJ4X2J1ZmZlcl9zaXplOworCWludCBmcmFtZV9zaXplID0gbmV3X210dSArIDE4OworCisJaWYgKChmcmFtZV9zaXplIDwgNjQpIHx8IChmcmFtZV9zaXplID4gSlVNQk9fRlJBTUVfU0laRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBNVFUgc2V0dGluZ1xuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdGVtcHNpemUgPQorCSAgICAoZnJhbWVfc2l6ZSAmIH4oSU5DUkVNRU5UQUxfQlVGRkVSX1NJWkUgLSAxKSkgKworCSAgICBJTkNSRU1FTlRBTF9CVUZGRVJfU0laRTsKKworCS8qIE9ubHkgc3RvcCBhbmQgc3RhcnQgdGhlIGNvbnRyb2xsZXIgaWYgaXQgaXNuJ3QgYWxyZWFkeQorCSAqIHN0b3BwZWQgKi8KKwlpZiAoKG9sZHNpemUgIT0gdGVtcHNpemUpICYmIChkZXYtPmZsYWdzICYgSUZGX1VQKSkKKwkJc3RvcF9nZmFyKGRldik7CisKKwlwcml2LT5yeF9idWZmZXJfc2l6ZSA9IHRlbXBzaXplOworCisJZGV2LT5tdHUgPSBuZXdfbXR1OworCisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+bXJibHIsIHByaXYtPnJ4X2J1ZmZlcl9zaXplKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5tYXhmcm0sIHByaXYtPnJ4X2J1ZmZlcl9zaXplKTsKKworCS8qIElmIHRoZSBtdHUgaXMgbGFyZ2VyIHRoYW4gdGhlIG1heCBzaXplIGZvciBzdGFuZGFyZAorCSAqIGV0aGVybmV0IGZyYW1lcyAoaWUsIGEganVtYm8gZnJhbWUpLCB0aGVuIHNldCBtYWNjZmcyCisJICogdG8gYWxsb3cgaHVnZSBmcmFtZXMsIGFuZCB0byBjaGVjayB0aGUgbGVuZ3RoICovCisJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+bWFjY2ZnMik7CisKKwlpZiAocHJpdi0+cnhfYnVmZmVyX3NpemUgPiBERUZBVUxUX1JYX0JVRkZFUl9TSVpFKQorCQl0ZW1wdmFsIHw9IChNQUNDRkcyX0hVR0VGUkFNRSB8IE1BQ0NGRzJfTEVOR1RIQ0hFQ0spOworCWVsc2UKKwkJdGVtcHZhbCAmPSB+KE1BQ0NGRzJfSFVHRUZSQU1FIHwgTUFDQ0ZHMl9MRU5HVEhDSEVDSyk7CisKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5tYWNjZmcyLCB0ZW1wdmFsKTsKKworCWlmICgob2xkc2l6ZSAhPSB0ZW1wc2l6ZSkgJiYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApKQorCQlzdGFydHVwX2dmYXIoZGV2KTsKKworCXJldHVybiAwOworfQorCisvKiBnZmFyX3RpbWVvdXQgZ2V0cyBjYWxsZWQgd2hlbiBhIHBhY2tldCBoYXMgbm90IGJlZW4KKyAqIHRyYW5zbWl0dGVkIGFmdGVyIGEgc2V0IGFtb3VudCBvZiB0aW1lLgorICogRm9yIG5vdywgYXNzdW1lIHRoYXQgY2xlYXJpbmcgb3V0IGFsbCB0aGUgc3RydWN0dXJlcywgYW5kCisgKiBzdGFydGluZyBvdmVyIHdpbGwgZml4IHRoZSBwcm9ibGVtLiAqLworc3RhdGljIHZvaWQgZ2Zhcl90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCXN0b3BfZ2ZhcihkZXYpOworCQlzdGFydHVwX2dmYXIoZGV2KTsKKwl9CisKKwluZXRpZl9zY2hlZHVsZShkZXYpOworfQorCisvKiBJbnRlcnJ1cHQgSGFuZGxlciBmb3IgVHJhbnNtaXQgY29tcGxldGUgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBnZmFyX3RyYW5zbWl0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHR4YmQ4ICpiZHA7CisKKwkvKiBDbGVhciBJRVZFTlQgKi8KKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pZXZlbnQsIElFVkVOVF9UWF9NQVNLKTsKKworCS8qIExvY2sgcHJpdiAqLworCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisJYmRwID0gcHJpdi0+ZGlydHlfdHg7CisJd2hpbGUgKChiZHAtPnN0YXR1cyAmIFRYQkRfUkVBRFkpID09IDApIHsKKwkJLyogSWYgZGlydHlfdHggYW5kIGN1cl90eCBhcmUgdGhlIHNhbWUsIHRoZW4gZWl0aGVyIHRoZSAqLworCQkvKiByaW5nIGlzIGVtcHR5IG9yIGZ1bGwgbm93IChpdCBjb3VsZCBvbmx5IGJlIGZ1bGwgaW4gdGhlIGJlZ2lubmluZywgKi8KKwkJLyogb2J2aW91c2x5KS4gIElmIGl0IGlzIGVtcHR5LCB3ZSBhcmUgZG9uZS4gKi8KKwkJaWYgKChiZHAgPT0gcHJpdi0+Y3VyX3R4KSAmJiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpID09IDApKQorCQkJYnJlYWs7CisKKwkJcHJpdi0+c3RhdHMudHhfcGFja2V0cysrOworCisJCS8qIERlZmVycmVkIG1lYW5zIHNvbWUgY29sbGlzaW9ucyBvY2N1cnJlZCBkdXJpbmcgdHJhbnNtaXQsICovCisJCS8qIGJ1dCB3ZSBldmVudHVhbGx5IHNlbnQgdGhlIHBhY2tldC4gKi8KKwkJaWYgKGJkcC0+c3RhdHVzICYgVFhCRF9ERUYpCisJCQlwcml2LT5zdGF0cy5jb2xsaXNpb25zKys7CisKKwkJLyogRnJlZSB0aGUgc2sgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFR4QkQgKi8KKwkJZGV2X2tmcmVlX3NrYl9pcnEocHJpdi0+dHhfc2tidWZmW3ByaXYtPnNrYl9kaXJ0eXR4XSk7CisJCXByaXYtPnR4X3NrYnVmZltwcml2LT5za2JfZGlydHl0eF0gPSBOVUxMOworCQlwcml2LT5za2JfZGlydHl0eCA9CisJCSAgICAocHJpdi0+c2tiX2RpcnR5dHggKworCQkgICAgIDEpICYgVFhfUklOR19NT0RfTUFTSyhwcml2LT50eF9yaW5nX3NpemUpOworCisJCS8qIHVwZGF0ZSBiZHAgdG8gcG9pbnQgYXQgbmV4dCBiZCBpbiB0aGUgcmluZyAod3JhcHBpbmcgaWYgbmVjZXNzYXJ5KSAqLworCQlpZiAoYmRwLT5zdGF0dXMgJiBUWEJEX1dSQVApCisJCQliZHAgPSBwcml2LT50eF9iZF9iYXNlOworCQllbHNlCisJCQliZHArKzsKKworCQkvKiBNb3ZlIGRpcnR5X3R4IHRvIGJlIHRoZSBuZXh0IGJkICovCisJCXByaXYtPmRpcnR5X3R4ID0gYmRwOworCisJCS8qIFdlIGZyZWVkIGEgYnVmZmVyLCBzbyBub3cgd2UgY2FuIHJlc3RhcnQgdHJhbnNtaXNzaW9uICovCisJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpCisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfSAvKiB3aGlsZSAoKGJkcC0+c3RhdHVzICYgVFhCRF9SRUFEWSkgPT0gMCkgKi8KKworCS8qIElmIHdlIGFyZSBjb2FsZXNjaW5nIHRoZSBpbnRlcnJ1cHRzLCByZXNldCB0aGUgdGltZXIgKi8KKwkvKiBPdGhlcndpc2UsIGNsZWFyIGl0ICovCisJaWYgKHByaXYtPnR4Y29hbGVzY2luZykKKwkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+dHhpYywKKwkJCSAgIG1rX2ljX3ZhbHVlKHByaXYtPnR4Y291bnQsIHByaXYtPnR4dGltZSkpOworCWVsc2UKKwkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+dHhpYywgMCk7CisKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0cnVjdCBza19idWZmICogZ2Zhcl9uZXdfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCByeGJkOCAqYmRwKQoreworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gU0tCX0FMTE9DX1RJTUVPVVQ7CisKKwkvKiBXZSBoYXZlIHRvIGFsbG9jYXRlIHRoZSBza2IsIHNvIGtlZXAgdHJ5aW5nIHRpbGwgd2Ugc3VjY2VlZCAqLworCXdoaWxlICgoIXNrYikgJiYgdGltZW91dC0tKQorCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHByaXYtPnJ4X2J1ZmZlcl9zaXplICsgUlhCVUZfQUxJR05NRU5UKTsKKworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBXZSBuZWVkIHRoZSBkYXRhIGJ1ZmZlciB0byBiZSBhbGlnbmVkIHByb3Blcmx5LiAgV2Ugd2lsbCByZXNlcnZlCisJICogYXMgbWFueSBieXRlcyBhcyBuZWVkZWQgdG8gYWxpZ24gdGhlIGRhdGEgcHJvcGVybHkKKwkgKi8KKwlza2JfcmVzZXJ2ZShza2IsCisJCSAgICBSWEJVRl9BTElHTk1FTlQgLQorCQkgICAgKCgodW5zaWduZWQpIHNrYi0+ZGF0YSkgJiAoUlhCVUZfQUxJR05NRU5UIC0gMSkpKTsKKworCXNrYi0+ZGV2ID0gZGV2OworCisJYmRwLT5idWZQdHIgPSBkbWFfbWFwX3NpbmdsZShOVUxMLCBza2ItPmRhdGEsCisJCQlwcml2LT5yeF9idWZmZXJfc2l6ZSArIFJYQlVGX0FMSUdOTUVOVCwgCisJCQlETUFfRlJPTV9ERVZJQ0UpOworCisJYmRwLT5sZW5ndGggPSAwOworCisJLyogTWFyayB0aGUgYnVmZmVyIGVtcHR5ICovCisJYmRwLT5zdGF0dXMgfD0gKFJYQkRfRU1QVFkgfCBSWEJEX0lOVEVSUlVQVCk7CisKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY291bnRfZXJyb3JzKHVuc2lnbmVkIHNob3J0IHN0YXR1cywgc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmcHJpdi0+c3RhdHM7CisJc3RydWN0IGdmYXJfZXh0cmFfc3RhdHMgKmVzdGF0cyA9ICZwcml2LT5leHRyYV9zdGF0czsKKworCS8qIElmIHRoZSBwYWNrZXQgd2FzIHRydW5jYXRlZCwgbm9uZSBvZiB0aGUgb3RoZXIgZXJyb3JzCisJICogbWF0dGVyICovCisJaWYgKHN0YXR1cyAmIFJYQkRfVFJVTkNBVEVEKSB7CisJCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzKys7CisKKwkJZXN0YXRzLT5yeF90cnVuYysrOworCisJCXJldHVybjsKKwl9CisJLyogQ291bnQgdGhlIGVycm9ycywgaWYgdGhlcmUgd2VyZSBhbnkgKi8KKwlpZiAoc3RhdHVzICYgKFJYQkRfTEFSR0UgfCBSWEJEX1NIT1JUKSkgeworCQlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycysrOworCisJCWlmIChzdGF0dXMgJiBSWEJEX0xBUkdFKQorCQkJZXN0YXRzLT5yeF9sYXJnZSsrOworCQllbHNlCisJCQllc3RhdHMtPnJ4X3Nob3J0Kys7CisJfQorCWlmIChzdGF0dXMgJiBSWEJEX05PTk9DVEVUKSB7CisJCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJZXN0YXRzLT5yeF9ub25vY3RldCsrOworCX0KKwlpZiAoc3RhdHVzICYgUlhCRF9DUkNFUlIpIHsKKwkJZXN0YXRzLT5yeF9jcmNlcnIrKzsKKwkJc3RhdHMtPnJ4X2NyY19lcnJvcnMrKzsKKwl9CisJaWYgKHN0YXR1cyAmIFJYQkRfT1ZFUlJVTikgeworCQllc3RhdHMtPnJ4X292ZXJydW4rKzsKKwkJc3RhdHMtPnJ4X2NyY19lcnJvcnMrKzsKKwl9Cit9CisKK2lycXJldHVybl90IGdmYXJfcmVjZWl2ZShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisjaWZkZWYgQ09ORklHX0dGQVJfTkFQSQorCXUzMiB0ZW1wdmFsOworI2VuZGlmCisKKwkvKiBDbGVhciBJRVZFTlQsIHNvIHJ4IGludGVycnVwdCBpc24ndCBjYWxsZWQgYWdhaW4KKwkgKiBiZWNhdXNlIG9mIHRoaXMgaW50ZXJydXB0ICovCisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+aWV2ZW50LCBJRVZFTlRfUlhfTUFTSyk7CisKKwkvKiBzdXBwb3J0IE5BUEkgKi8KKyNpZmRlZiBDT05GSUdfR0ZBUl9OQVBJCisJaWYgKG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAoZGV2KSkgeworCQl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5pbWFzayk7CisJCXRlbXB2YWwgJj0gSU1BU0tfUlhfRElTQUJMRUQ7CisJCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmltYXNrLCB0ZW1wdmFsKTsKKworCQlfX25ldGlmX3J4X3NjaGVkdWxlKGRldik7CisJfSBlbHNlIHsKKyNpZmRlZiBWRVJCT1NFX0dGQVJfRVJST1JTCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVjZWl2ZSBjYWxsZWQgdHdpY2UgKCV4KVsleF1cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+aWV2ZW50KSwKKwkJICAgICAgIGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+aW1hc2spKTsKKyNlbmRpZgorCX0KKyNlbHNlCisKKwlzcGluX2xvY2soJnByaXYtPmxvY2spOworCWdmYXJfY2xlYW5fcnhfcmluZyhkZXYsIHByaXYtPnJ4X3Jpbmdfc2l6ZSk7CisKKwkvKiBJZiB3ZSBhcmUgY29hbGVzY2luZyBpbnRlcnJ1cHRzLCB1cGRhdGUgdGhlIHRpbWVyICovCisJLyogT3RoZXJ3aXNlLCBjbGVhciBpdCAqLworCWlmIChwcml2LT5yeGNvYWxlc2NpbmcpCisJCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPnJ4aWMsCisJCQkgICBta19pY192YWx1ZShwcml2LT5yeGNvdW50LCBwcml2LT5yeHRpbWUpKTsKKwllbHNlCisJCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPnJ4aWMsIDApOworCisJLyogSnVzdCBpbiBjYXNlIHdlIG5lZWQgdG8gd2FrZSB0aGUgcmluZyBwYXJhbSBjaGFuZ2VyICovCisJcHJpdi0+cnhjbGVhbiA9IDE7CisKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisjZW5kaWYKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKiBnZmFyX3Byb2Nlc3NfZnJhbWUoKSAtLSBoYW5kbGUgb25lIGluY29taW5nIHBhY2tldCBpZiBza2IKKyAqIGlzbid0IE5VTEwuICAqLworc3RhdGljIGludCBnZmFyX3Byb2Nlc3NfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChza2IgPT0gTlVMTCkgeworI2lmZGVmIEJSSUVGX0dGQVJfRVJST1JTCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNaXNzaW5nIHNrYiEhLlxuIiwKKwkJCQlkZXYtPm5hbWUpOworI2VuZGlmCisJCXByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcHJpdi0+ZXh0cmFfc3RhdHMucnhfc2tibWlzc2luZysrOworCX0gZWxzZSB7CisJCS8qIFByZXAgdGhlIHNrYiBmb3IgdGhlIHBhY2tldCAqLworCQlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKKworCQkvKiBUZWxsIHRoZSBza2Igd2hhdCBraW5kIG9mIHBhY2tldCB0aGlzIGlzICovCisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisKKwkJLyogU2VuZCB0aGUgcGFja2V0IHVwIHRoZSBzdGFjayAqLworCQlpZiAoUkVDRUlWRShza2IpID09IE5FVF9SWF9EUk9QKSB7CisJCQlwcml2LT5leHRyYV9zdGF0cy5rZXJuZWxfZHJvcHBlZCsrOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGdmYXJfY2xlYW5fcnhfcmluZygpIC0tIFByb2Nlc3NlcyBlYWNoIGZyYW1lIGluIHRoZSByeCByaW5nCisgKiAgIHVudGlsIHRoZSBidWRnZXQvcXVvdGEgaGFzIGJlZW4gcmVhY2hlZC4gUmV0dXJucyB0aGUgbnVtYmVyIAorICogICBvZiBmcmFtZXMgaGFuZGxlZAorICovCitzdGF0aWMgaW50IGdmYXJfY2xlYW5fcnhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcnhfd29ya19saW1pdCkKK3sKKwlzdHJ1Y3QgcnhiZDggKmJkcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUxNiBwa3RfbGVuOworCWludCBob3dtYW55ID0gMDsKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIEdldCB0aGUgZmlyc3QgZnVsbCBkZXNjcmlwdG9yICovCisJYmRwID0gcHJpdi0+Y3VyX3J4OworCisJd2hpbGUgKCEoKGJkcC0+c3RhdHVzICYgUlhCRF9FTVBUWSkgfHwgKC0tcnhfd29ya19saW1pdCA8IDApKSkgeworCQlza2IgPSBwcml2LT5yeF9za2J1ZmZbcHJpdi0+c2tiX2N1cnJ4XTsKKworCQlpZiAoIShiZHAtPnN0YXR1cyAmCisJCSAgICAgIChSWEJEX0xBUkdFIHwgUlhCRF9TSE9SVCB8IFJYQkRfTk9OT0NURVQKKwkJICAgICAgIHwgUlhCRF9DUkNFUlIgfCBSWEJEX09WRVJSVU4gfCBSWEJEX1RSVU5DQVRFRCkpKSB7CisJCQkvKiBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBwYWNrZXRzICovCisJCQlwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlob3dtYW55Kys7CisKKwkJCS8qIFJlbW92ZSB0aGUgRkNTIGZyb20gdGhlIHBhY2tldCBsZW5ndGggKi8KKwkJCXBrdF9sZW4gPSBiZHAtPmxlbmd0aCAtIDQ7CisKKwkJCWdmYXJfcHJvY2Vzc19mcmFtZShkZXYsIHNrYiwgcGt0X2xlbik7CisKKwkJCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCX0gZWxzZSB7CisJCQljb3VudF9lcnJvcnMoYmRwLT5zdGF0dXMsIHByaXYpOworCisJCQlpZiAoc2tiKQorCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisKKwkJCXByaXYtPnJ4X3NrYnVmZltwcml2LT5za2JfY3VycnhdID0gTlVMTDsKKwkJfQorCisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisKKwkJLyogQ2xlYXIgdGhlIHN0YXR1cyBmbGFncyBmb3IgdGhpcyBidWZmZXIgKi8KKwkJYmRwLT5zdGF0dXMgJj0gflJYQkRfU1RBVFM7CisKKwkJLyogQWRkIGFub3RoZXIgc2tiIGZvciB0aGUgZnV0dXJlICovCisJCXNrYiA9IGdmYXJfbmV3X3NrYihkZXYsIGJkcCk7CisJCXByaXYtPnJ4X3NrYnVmZltwcml2LT5za2JfY3VycnhdID0gc2tiOworCisJCS8qIFVwZGF0ZSB0byB0aGUgbmV4dCBwb2ludGVyICovCisJCWlmIChiZHAtPnN0YXR1cyAmIFJYQkRfV1JBUCkKKwkJCWJkcCA9IHByaXYtPnJ4X2JkX2Jhc2U7CisJCWVsc2UKKwkJCWJkcCsrOworCisJCS8qIHVwZGF0ZSB0byBwb2ludCBhdCB0aGUgbmV4dCBza2IgKi8KKwkJcHJpdi0+c2tiX2N1cnJ4ID0KKwkJICAgIChwcml2LT5za2JfY3VycnggKworCQkgICAgIDEpICYgUlhfUklOR19NT0RfTUFTSyhwcml2LT5yeF9yaW5nX3NpemUpOworCisJfQorCisJLyogVXBkYXRlIHRoZSBjdXJyZW50IHJ4YmQgcG9pbnRlciB0byBiZSB0aGUgbmV4dCBvbmUgKi8KKwlwcml2LT5jdXJfcnggPSBiZHA7CisKKwkvKiBJZiBubyBwYWNrZXRzIGhhdmUgYXJyaXZlZCBzaW5jZSB0aGUKKwkgKiBsYXN0IG9uZSB3ZSBwcm9jZXNzZWQsIGNsZWFyIHRoZSBJRVZFTlQgUlggYW5kCisJICogQlNZIGJpdHMgc28gdGhhdCBhbm90aGVyIGludGVycnVwdCB3b24ndCBiZQorCSAqIGdlbmVyYXRlZCB3aGVuIHdlIHNldCBJTUFTSyAqLworCWlmIChiZHAtPnN0YXR1cyAmIFJYQkRfRU1QVFkpCisJCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlldmVudCwgSUVWRU5UX1JYX01BU0spOworCisJcmV0dXJuIGhvd21hbnk7Cit9CisKKyNpZmRlZiBDT05GSUdfR0ZBUl9OQVBJCitzdGF0aWMgaW50IGdmYXJfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCkKK3sKKwlpbnQgaG93bWFueTsKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcnhfd29ya19saW1pdCA9ICpidWRnZXQ7CisKKwlpZiAocnhfd29ya19saW1pdCA+IGRldi0+cXVvdGEpCisJCXJ4X3dvcmtfbGltaXQgPSBkZXYtPnF1b3RhOworCisJaG93bWFueSA9IGdmYXJfY2xlYW5fcnhfcmluZyhkZXYsIHJ4X3dvcmtfbGltaXQpOworCisJZGV2LT5xdW90YSAtPSBob3dtYW55OworCXJ4X3dvcmtfbGltaXQgLT0gaG93bWFueTsKKwkqYnVkZ2V0IC09IGhvd21hbnk7CisKKwlpZiAocnhfd29ya19saW1pdCA+PSAwKSB7CisJCW5ldGlmX3J4X2NvbXBsZXRlKGRldik7CisKKwkJLyogQ2xlYXIgdGhlIGhhbHQgYml0IGluIFJTVEFUICovCisJCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPnJzdGF0LCBSU1RBVF9DTEVBUl9SSEFMVCk7CisKKwkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+aW1hc2ssIElNQVNLX0RFRkFVTFQpOworCisJCS8qIElmIHdlIGFyZSBjb2FsZXNjaW5nIGludGVycnVwdHMsIHVwZGF0ZSB0aGUgdGltZXIgKi8KKwkJLyogT3RoZXJ3aXNlLCBjbGVhciBpdCAqLworCQlpZiAocHJpdi0+cnhjb2FsZXNjaW5nKQorCQkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+cnhpYywKKwkJCQkgICBta19pY192YWx1ZShwcml2LT5yeGNvdW50LCBwcml2LT5yeHRpbWUpKTsKKwkJZWxzZQorCQkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+cnhpYywgMCk7CisKKwkJLyogU2lnbmFsIHRvIHRoZSByaW5nIHNpemUgY2hhbmdlciB0aGF0IGl0J3Mgc2FmZSB0byBnbyAqLworCQlwcml2LT5yeGNsZWFuID0gMTsKKwl9CisKKwlyZXR1cm4gKHJ4X3dvcmtfbGltaXQgPCAwKSA/IDEgOiAwOworfQorI2VuZGlmCisKKy8qIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgZGV2aWNlcyB3aXRoIG9uZSBpbnRlcnJ1cHQgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBnZmFyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBTYXZlIGlldmVudCBmb3IgZnV0dXJlIHJlZmVyZW5jZSAqLworCXUzMiBldmVudHMgPSBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPmlldmVudCk7CisKKwkvKiBDbGVhciBJRVZFTlQgKi8KKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pZXZlbnQsIGV2ZW50cyk7CisKKwkvKiBDaGVjayBmb3IgcmVjZXB0aW9uICovCisJaWYgKChldmVudHMgJiBJRVZFTlRfUlhGMCkgfHwgKGV2ZW50cyAmIElFVkVOVF9SWEIwKSkKKwkJZ2Zhcl9yZWNlaXZlKGlycSwgZGV2X2lkLCByZWdzKTsKKworCS8qIENoZWNrIGZvciB0cmFuc21pdCBjb21wbGV0aW9uICovCisJaWYgKChldmVudHMgJiBJRVZFTlRfVFhGKSB8fCAoZXZlbnRzICYgSUVWRU5UX1RYQikpCisJCWdmYXJfdHJhbnNtaXQoaXJxLCBkZXZfaWQsIHJlZ3MpOworCisJLyogVXBkYXRlIGVycm9yIHN0YXRpc3RpY3MgKi8KKwlpZiAoZXZlbnRzICYgSUVWRU5UX1RYRSkgeworCQlwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKKworCQlpZiAoZXZlbnRzICYgSUVWRU5UX0xDKQorCQkJcHJpdi0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQlpZiAoZXZlbnRzICYgSUVWRU5UX0NSTCkKKwkJCXByaXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCWlmIChldmVudHMgJiBJRVZFTlRfWEZVTikgeworI2lmZGVmIFZFUkJPU0VfR0ZBUl9FUlJPUlMKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0eCB1bmRlcnJ1bi4gZHJvcHBlZCBwYWNrZXRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkJcHJpdi0+c3RhdHMudHhfZHJvcHBlZCsrOworCQkJcHJpdi0+ZXh0cmFfc3RhdHMudHhfdW5kZXJydW4rKzsKKworCQkJLyogUmVhY3RpdmF0ZSB0aGUgVHggUXVldWVzICovCisJCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT50c3RhdCwgVFNUQVRfQ0xFQVJfVEhBTFQpOworCQl9CisJfQorCWlmIChldmVudHMgJiBJRVZFTlRfQlNZKSB7CisJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlwcml2LT5leHRyYV9zdGF0cy5yeF9ic3krKzsKKworCQlnZmFyX3JlY2VpdmUoaXJxLCBkZXZfaWQsIHJlZ3MpOworCisjaWZuZGVmIENPTkZJR19HRkFSX05BUEkKKwkJLyogQ2xlYXIgdGhlIGhhbHQgYml0IGluIFJTVEFUICovCisJCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPnJzdGF0LCBSU1RBVF9DTEVBUl9SSEFMVCk7CisjZW5kaWYKKworI2lmZGVmIFZFUkJPU0VfR0ZBUl9FUlJPUlMKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBidXN5IGVycm9yIChyaGFsdDogJXgpXG4iLCBkZXYtPm5hbWUsCisJCSAgICAgICBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPnJzdGF0KSk7CisjZW5kaWYKKwl9CisJaWYgKGV2ZW50cyAmIElFVkVOVF9CQUJSKSB7CisJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlwcml2LT5leHRyYV9zdGF0cy5yeF9iYWJyKys7CisKKyNpZmRlZiBWRVJCT1NFX0dGQVJfRVJST1JTCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogYmFiYmxpbmcgZXJyb3JcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwl9CisJaWYgKGV2ZW50cyAmIElFVkVOVF9FQkVSUikgeworCQlwcml2LT5leHRyYV9zdGF0cy5lYmVycisrOworI2lmZGVmIFZFUkJPU0VfR0ZBUl9FUlJPUlMKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBFQkVSUlxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCX0KKwlpZiAoZXZlbnRzICYgSUVWRU5UX1JYQykgeworI2lmZGVmIFZFUkJPU0VfR0ZBUl9FUlJPUlMKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjb250cm9sIGZyYW1lXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJfQorCisJaWYgKGV2ZW50cyAmIElFVkVOVF9CQUJUKSB7CisJCXByaXYtPmV4dHJhX3N0YXRzLnR4X2JhYnQrKzsKKyNpZmRlZiBWRVJCT1NFX0dGQVJfRVJST1JTCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogYmFidCBlcnJvclxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IHBoeV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KKwltaWlfY2xlYXJfcGh5X2ludGVycnVwdChwcml2LT5taWlfaW5mbyk7CisKKwkvKiBEaXNhYmxlIFBIWSBpbnRlcnJ1cHRzICovCisJbWlpX2NvbmZpZ3VyZV9waHlfaW50ZXJydXB0KHByaXYtPm1paV9pbmZvLAorCQkJTUlJX0lOVEVSUlVQVF9ESVNBQkxFRCk7CisKKwkvKiBTY2hlZHVsZSB0aGUgcGh5IGNoYW5nZSAqLworCXNjaGVkdWxlX3dvcmsoJnByaXYtPnRxKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogU2NoZWR1bGVkIGJ5IHRoZSBwaHlfaW50ZXJydXB0L3RpbWVyIHRvIGhhbmRsZSBQSFkgY2hhbmdlcyAqLworc3RhdGljIHZvaWQgZ2Zhcl9waHlfY2hhbmdlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkYXRhOworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXN1bHQgPSAwOworCisJLyogRGVsYXkgdG8gZ2l2ZSB0aGUgUEhZIGEgY2hhbmNlIHRvIGNoYW5nZSB0aGUKKwkgKiByZWdpc3RlciBzdGF0ZSAqLworCW1zbGVlcCgxKTsKKworCS8qIFVwZGF0ZSB0aGUgbGluaywgc3BlZWQsIGR1cGxleCAqLworCXJlc3VsdCA9IHByaXYtPm1paV9pbmZvLT5waHlpbmZvLT5yZWFkX3N0YXR1cyhwcml2LT5taWlfaW5mbyk7CisKKwkvKiBBZGp1c3QgdGhlIGtub3duIHN0YXR1cyBhcyBsb25nIGFzIHRoZSBsaW5rCisJICogaXNuJ3Qgc3RpbGwgY29taW5nIHVwICovCisJaWYoKDAgPT0gcmVzdWx0KSB8fCAocHJpdi0+bWlpX2luZm8tPmxpbmsgPT0gMCkpCisJCWFkanVzdF9saW5rKGRldik7CisKKwkvKiBSZWVuYWJsZSBpbnRlcnJ1cHRzLCBpZiBuZWVkZWQgKi8KKwlpZiAocHJpdi0+ZWluZm8tPmJvYXJkX2ZsYWdzICYgRlNMX0dJQU5GQVJfQlJEX0hBU19QSFlfSU5UUikKKwkJbWlpX2NvbmZpZ3VyZV9waHlfaW50ZXJydXB0KHByaXYtPm1paV9pbmZvLAorCQkJCU1JSV9JTlRFUlJVUFRfRU5BQkxFRCk7Cit9CisKKy8qIENhbGxlZCBldmVyeSBzbyBvZnRlbiBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgaW50ZXJydXB0CisgKiB0aGUgY29yZSBmb3IgUEhZIGNoYW5nZXMgKi8KK3N0YXRpYyB2b2lkIGdmYXJfcGh5X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlzY2hlZHVsZV93b3JrKCZwcml2LT50cSk7CisKKwltb2RfdGltZXIoJnByaXYtPnBoeV9pbmZvX3RpbWVyLCBqaWZmaWVzICsKKwkJCUdGQVJfUEhZX0NIQU5HRV9USU1FICogSFopOworfQorCisvKiBLZWVwIHRyeWluZyBhbmVnIGZvciBzb21lIHRpbWUKKyAqIElmLCBhZnRlciBHRkFSX0FOX1RJTUVPVVQgc2Vjb25kcywgaXQgaGFzIG5vdAorICogZmluaXNoZWQsIHdlIHN3aXRjaCB0byBmb3JjZWQuCisgKiBFaXRoZXIgd2F5LCBvbmNlIHRoZSBwcm9jZXNzIGhhcyBjb21wbGV0ZWQsIHdlIGVpdGhlcgorICogcmVxdWVzdCB0aGUgaW50ZXJydXB0LCBvciBzd2l0Y2ggdGhlIHRpbWVyIG92ZXIgdG8gCisgKiB1c2luZyBnZmFyX3BoeV90aW1lciB0byBjaGVjayBzdGF0dXMgKi8KK3N0YXRpYyB2b2lkIGdmYXJfcGh5X3N0YXJ0dXBfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCWludCByZXN1bHQ7CisJc3RhdGljIGludCBzZWNvbmRhcnkgPSBHRkFSX0FOX1RJTUVPVVQ7CisJc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvID0gKHN0cnVjdCBnZmFyX21paV9pbmZvICopZGF0YTsKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobWlpX2luZm8tPmRldik7CisKKwkvKiBDb25maWd1cmUgdGhlIEF1dG8tbmVnb3RpYXRpb24gKi8KKwlyZXN1bHQgPSBtaWlfaW5mby0+cGh5aW5mby0+Y29uZmlnX2FuZWcobWlpX2luZm8pOworCisJLyogSWYgYXV0b25lZ290aWF0aW9uIGZhaWxlZCB0byBzdGFydCwgYW5kCisJICogd2UgaGF2ZW4ndCB0aW1lZCBvdXQsIHJlc2V0IHRoZSB0aW1lciwgYW5kIHJldHVybiAqLworCWlmIChyZXN1bHQgJiYgc2Vjb25kYXJ5LS0pIHsKKwkJbW9kX3RpbWVyKCZwcml2LT5waHlfaW5mb190aW1lciwgamlmZmllcyArIEhaKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAocmVzdWx0KSB7CisJCS8qIENvdWxkbid0IHN0YXJ0IGF1dG9uZWdvdGlhdGlvbi4KKwkJICogVHJ5IHN3aXRjaGluZyB0byBmb3JjZWQgKi8KKwkJbWlpX2luZm8tPmF1dG9uZWcgPSAwOworCQlyZXN1bHQgPSBtaWlfaW5mby0+cGh5aW5mby0+Y29uZmlnX2FuZWcobWlpX2luZm8pOworCisJCS8qIEZvcmNpbmcgZmFpbGVkISAgR2l2ZSB1cCAqLworCQlpZihyZXN1bHQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEZvcmNpbmcgZmFpbGVkIVxuIiwKKwkJCQkJbWlpX2luZm8tPmRldi0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBLaWxsIHRoZSB0aW1lciBzbyBpdCBjYW4gYmUgcmVzdGFydGVkICovCisJZGVsX3RpbWVyX3N5bmMoJnByaXYtPnBoeV9pbmZvX3RpbWVyKTsKKworCS8qIEdyYWIgdGhlIFBIWSBpbnRlcnJ1cHQsIGlmIG5lY2Vzc2FyeS9wb3NzaWJsZSAqLworCWlmIChwcml2LT5laW5mby0+Ym9hcmRfZmxhZ3MgJiBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSKSB7CisJCWlmIChyZXF1ZXN0X2lycShwcml2LT5laW5mby0+aW50ZXJydXB0UEhZLCAKKwkJCQkJcGh5X2ludGVycnVwdCwKKwkJCQkJU0FfU0hJUlEsIAorCQkJCQkicGh5X2ludGVycnVwdCIsIAorCQkJCQltaWlfaW5mby0+ZGV2KSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IGdldCBJUlEgJWQgKFBIWSlcbiIsCisJCQkJCW1paV9pbmZvLT5kZXYtPm5hbWUsCisJCQkJCXByaXYtPmVpbmZvLT5pbnRlcnJ1cHRQSFkpOworCQl9IGVsc2UgeworCQkJbWlpX2NvbmZpZ3VyZV9waHlfaW50ZXJydXB0KHByaXYtPm1paV9pbmZvLCAKKwkJCQkJTUlJX0lOVEVSUlVQVF9FTkFCTEVEKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIFN0YXJ0IHRoZSB0aW1lciBhZ2FpbiwgdGhpcyB0aW1lIGluIG9yZGVyIHRvCisJICogaGFuZGxlIGEgY2hhbmdlIGluIHN0YXR1cyAqLworCWluaXRfdGltZXIoJnByaXYtPnBoeV9pbmZvX3RpbWVyKTsKKwlwcml2LT5waHlfaW5mb190aW1lci5mdW5jdGlvbiA9ICZnZmFyX3BoeV90aW1lcjsKKwlwcml2LT5waHlfaW5mb190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIG1paV9pbmZvLT5kZXY7CisJbW9kX3RpbWVyKCZwcml2LT5waHlfaW5mb190aW1lciwgamlmZmllcyArCisJCQlHRkFSX1BIWV9DSEFOR0VfVElNRSAqIEhaKTsKK30KKworLyogQ2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIGNvbnRyb2xsZXIgbWlnaHQgbmVlZCB0byBiZSBtYWRlCisgKiBhd2FyZSBvZiBuZXcgbGluayBzdGF0ZS4gIFRoZSBQSFkgY29kZSBjb252ZXlzIHRoaXMKKyAqIGluZm9ybWF0aW9uIHRocm91Z2ggdmFyaWFibGVzIGluIHRoZSBwcml2IHN0cnVjdHVyZSwgYW5kIHRoaXMKKyAqIGZ1bmN0aW9uIGNvbnZlcnRzIHRob3NlIHZhcmlhYmxlcyBpbnRvIHRoZSBhcHByb3ByaWF0ZQorICogcmVnaXN0ZXIgdmFsdWVzLCBhbmQgY2FuIGJyaW5nIGRvd24gdGhlIGRldmljZSBpZiBuZWVkZWQuCisgKi8KK3N0YXRpYyB2b2lkIGFkanVzdF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGdmYXIgKnJlZ3MgPSBwcml2LT5yZWdzOworCXUzMiB0ZW1wdmFsOworCXN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbyA9IHByaXYtPm1paV9pbmZvOworCisJaWYgKG1paV9pbmZvLT5saW5rKSB7CisJCS8qIE5vdyB3ZSBtYWtlIHN1cmUgdGhhdCB3ZSBjYW4gYmUgaW4gZnVsbCBkdXBsZXggbW9kZS4KKwkJICogSWYgbm90LCB3ZSBvcGVyYXRlIGluIGhhbGYtZHVwbGV4IG1vZGUuICovCisJCWlmIChtaWlfaW5mby0+ZHVwbGV4ICE9IHByaXYtPm9sZGR1cGxleCkgeworCQkJaWYgKCEobWlpX2luZm8tPmR1cGxleCkpIHsKKwkJCQl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZyZWdzLT5tYWNjZmcyKTsKKwkJCQl0ZW1wdmFsICY9IH4oTUFDQ0ZHMl9GVUxMX0RVUExFWCk7CisJCQkJZ2Zhcl93cml0ZSgmcmVncy0+bWFjY2ZnMiwgdGVtcHZhbCk7CisKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogSGFsZiBEdXBsZXhcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQl9IGVsc2UgeworCQkJCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnJlZ3MtPm1hY2NmZzIpOworCQkJCXRlbXB2YWwgfD0gTUFDQ0ZHMl9GVUxMX0RVUExFWDsKKwkJCQlnZmFyX3dyaXRlKCZyZWdzLT5tYWNjZmcyLCB0ZW1wdmFsKTsKKworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGdWxsIER1cGxleFxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCX0KKworCQkJcHJpdi0+b2xkZHVwbGV4ID0gbWlpX2luZm8tPmR1cGxleDsKKwkJfQorCisJCWlmIChtaWlfaW5mby0+c3BlZWQgIT0gcHJpdi0+b2xkc3BlZWQpIHsKKwkJCXN3aXRjaCAobWlpX2luZm8tPnNwZWVkKSB7CisJCQljYXNlIDEwMDA6CisJCQkJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcmVncy0+bWFjY2ZnMik7CisJCQkJdGVtcHZhbCA9CisJCQkJICAgICgodGVtcHZhbCAmIH4oTUFDQ0ZHMl9JRikpIHwgTUFDQ0ZHMl9HTUlJKTsKKwkJCQlnZmFyX3dyaXRlKCZyZWdzLT5tYWNjZmcyLCB0ZW1wdmFsKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTAwOgorCQkJY2FzZSAxMDoKKwkJCQl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZyZWdzLT5tYWNjZmcyKTsKKwkJCQl0ZW1wdmFsID0KKwkJCQkgICAgKCh0ZW1wdmFsICYgfihNQUNDRkcyX0lGKSkgfCBNQUNDRkcyX01JSSk7CisJCQkJZ2Zhcl93cml0ZSgmcmVncy0+bWFjY2ZnMiwgdGVtcHZhbCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgICAgIiVzOiBBY2shICBTcGVlZCAoJWQpIGlzIG5vdCAxMC8xMDAvMTAwMCFcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgbWlpX2luZm8tPnNwZWVkKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNwZWVkICVkQlRcbiIsIGRldi0+bmFtZSwKKwkJCSAgICAgICBtaWlfaW5mby0+c3BlZWQpOworCisJCQlwcml2LT5vbGRzcGVlZCA9IG1paV9pbmZvLT5zcGVlZDsKKwkJfQorCisJCWlmICghcHJpdi0+b2xkbGluaykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpbmsgaXMgdXBcbiIsIGRldi0+bmFtZSk7CisJCQlwcml2LT5vbGRsaW5rID0gMTsKKwkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwkJCW5ldGlmX3NjaGVkdWxlKGRldik7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocHJpdi0+b2xkbGluaykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpbmsgaXMgZG93blxuIiwgZGV2LT5uYW1lKTsKKwkJCXByaXYtPm9sZGxpbmsgPSAwOworCQkJcHJpdi0+b2xkc3BlZWQgPSAwOworCQkJcHJpdi0+b2xkZHVwbGV4ID0gLTE7CisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQl9CisJfQorfQorCisKKy8qIFVwZGF0ZSB0aGUgaGFzaCB0YWJsZSBiYXNlZCBvbiB0aGUgY3VycmVudCBsaXN0IG9mIG11bHRpY2FzdAorICogYWRkcmVzc2VzIHdlIHN1YnNjcmliZSB0by4gIEFsc28sIGNoYW5nZSB0aGUgcHJvbWlzY3VpdHkgb2YKKyAqIHRoZSBkZXZpY2UgYmFzZWQgb24gdGhlIGZsYWdzICh0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAorICogd2hlbmV2ZXIgZGV2LT5mbGFncyBpcyBjaGFuZ2VkICovCitzdGF0aWMgdm9pZCBnZmFyX3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNfcHRyOworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBnZmFyICpyZWdzID0gcHJpdi0+cmVnczsKKwl1MzIgdGVtcHZhbDsKKworCWlmKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRW50ZXJpbmcgcHJvbWlzY3VvdXMgbW9kZS5cbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJLyogU2V0IFJDVFJMIHRvIFBST00gKi8KKwkJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcmVncy0+cmN0cmwpOworCQl0ZW1wdmFsIHw9IFJDVFJMX1BST007CisJCWdmYXJfd3JpdGUoJnJlZ3MtPnJjdHJsLCB0ZW1wdmFsKTsKKwl9IGVsc2UgeworCQkvKiBTZXQgUkNUUkwgdG8gbm90IFBST00gKi8KKwkJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcmVncy0+cmN0cmwpOworCQl0ZW1wdmFsICY9IH4oUkNUUkxfUFJPTSk7CisJCWdmYXJfd3JpdGUoJnJlZ3MtPnJjdHJsLCB0ZW1wdmFsKTsKKwl9CisJCisJaWYoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQkvKiBTZXQgdGhlIGhhc2ggdG8gcnggYWxsIG11bHRpY2FzdCBmcmFtZXMgKi8KKwkJZ2Zhcl93cml0ZSgmcmVncy0+Z2FkZHIwLCAweGZmZmZmZmZmKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+Z2FkZHIxLCAweGZmZmZmZmZmKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+Z2FkZHIyLCAweGZmZmZmZmZmKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+Z2FkZHIzLCAweGZmZmZmZmZmKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+Z2FkZHI0LCAweGZmZmZmZmZmKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+Z2FkZHI1LCAweGZmZmZmZmZmKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+Z2FkZHI2LCAweGZmZmZmZmZmKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+Z2FkZHI3LCAweGZmZmZmZmZmKTsKKwl9IGVsc2UgeworCQkvKiB6ZXJvIG91dCB0aGUgaGFzaCAqLworCQlnZmFyX3dyaXRlKCZyZWdzLT5nYWRkcjAsIDB4MCk7CisJCWdmYXJfd3JpdGUoJnJlZ3MtPmdhZGRyMSwgMHgwKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+Z2FkZHIyLCAweDApOworCQlnZmFyX3dyaXRlKCZyZWdzLT5nYWRkcjMsIDB4MCk7CisJCWdmYXJfd3JpdGUoJnJlZ3MtPmdhZGRyNCwgMHgwKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+Z2FkZHI1LCAweDApOworCQlnZmFyX3dyaXRlKCZyZWdzLT5nYWRkcjYsIDB4MCk7CisJCWdmYXJfd3JpdGUoJnJlZ3MtPmdhZGRyNywgMHgwKTsKKworCQlpZihkZXYtPm1jX2NvdW50ID09IDApCisJCQlyZXR1cm47CisKKwkJLyogUGFyc2UgdGhlIGxpc3QsIGFuZCBzZXQgdGhlIGFwcHJvcHJpYXRlIGJpdHMgKi8KKwkJZm9yKG1jX3B0ciA9IGRldi0+bWNfbGlzdDsgbWNfcHRyOyBtY19wdHIgPSBtY19wdHItPm5leHQpIHsKKwkJCWdmYXJfc2V0X2hhc2hfZm9yX2FkZHIoZGV2LCBtY19wdHItPmRtaV9hZGRyKTsKKwkJfQorCX0KKworCXJldHVybjsKK30KKworLyogU2V0IHRoZSBhcHByb3ByaWF0ZSBoYXNoIGJpdCBmb3IgdGhlIGdpdmVuIGFkZHIgKi8KKy8qIFRoZSBhbGdvcml0aG0gd29ya3MgbGlrZSBzbzoKKyAqIDEpIFRha2UgdGhlIERlc3RpbmF0aW9uIEFkZHJlc3MgKGllIHRoZSBtdWx0aWNhc3QgYWRkcmVzcyksIGFuZAorICogZG8gYSBDUkMgb24gaXQgKGxpdHRsZSBlbmRpYW4pLCBhbmQgcmV2ZXJzZSB0aGUgYml0cyBvZiB0aGUKKyAqIHJlc3VsdC4KKyAqIDIpIFVzZSB0aGUgOCBtb3N0IHNpZ25pZmljYW50IGJpdHMgYXMgYSBoYXNoIGludG8gYSAyNTYtZW50cnkKKyAqIHRhYmxlLiAgVGhlIHRhYmxlIGlzIGNvbnRyb2xsZWQgdGhyb3VnaCA4IDMyLWJpdCByZWdpc3RlcnM6CisgKiBnYWRkcjAtNy4gIGdhZGRyMCdzIE1TQiBpcyBlbnRyeSAwLCBhbmQgZ2FkZHI3J3MgTFNCIGlzCisgKiBnYWRkcjcuICBUaGlzIG1lYW5zIHRoYXQgdGhlIDMgbW9zdCBzaWduaWZpY2FudCBiaXRzIGluIHRoZQorICogaGFzaCBpbmRleCB3aGljaCBnYWRkciByZWdpc3RlciB0byB1c2UsIGFuZCB0aGUgNSBvdGhlciBiaXRzCisgKiBpbmRpY2F0ZSB3aGljaCBiaXQgKGFzc3VtaW5nIGFuIElCTSBudW1iZXJpbmcgc2NoZW1lLCB3aGljaAorICogZm9yIFBvd2VyUEMgKHRtKSBpcyB1c3VhbGx5IHRoZSBjYXNlKSBpbiB0aGUgcmVnaXN0ZXIgaG9sZHMKKyAqIHRoZSBlbnRyeS4gKi8KK3N0YXRpYyB2b2lkIGdmYXJfc2V0X2hhc2hfZm9yX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKmFkZHIpCit7CisJdTMyIHRlbXB2YWw7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGdmYXIgKnJlZ3MgPSBwcml2LT5yZWdzOworCXUzMiAqaGFzaCA9ICZyZWdzLT5nYWRkcjA7CisJdTMyIHJlc3VsdCA9IGV0aGVyX2NyYyhNQUNfQUREUl9MRU4sIGFkZHIpOworCXU4IHdoaWNocmVnID0gKChyZXN1bHQgPj4gMjkpICYgMHg3KTsKKwl1OCB3aGljaGJpdCA9ICgocmVzdWx0ID4+IDI0KSAmIDB4MWYpOworCXUzMiB2YWx1ZSA9ICgxIDw8ICgzMS13aGljaGJpdCkpOworCisJdGVtcHZhbCA9IGdmYXJfcmVhZCgmaGFzaFt3aGljaHJlZ10pOworCXRlbXB2YWwgfD0gdmFsdWU7CisJZ2Zhcl93cml0ZSgmaGFzaFt3aGljaHJlZ10sIHRlbXB2YWwpOworCisJcmV0dXJuOworfQorCisvKiBHRkFSIGVycm9yIGludGVycnVwdCBoYW5kbGVyICovCitzdGF0aWMgaXJxcmV0dXJuX3QgZ2Zhcl9lcnJvcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBTYXZlIGlldmVudCBmb3IgZnV0dXJlIHJlZmVyZW5jZSAqLworCXUzMiBldmVudHMgPSBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPmlldmVudCk7CisKKwkvKiBDbGVhciBJRVZFTlQgKi8KKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pZXZlbnQsIElFVkVOVF9FUlJfTUFTSyk7CisKKwkvKiBIbW0uLi4gKi8KKyNpZiBkZWZpbmVkIChCUklFRl9HRkFSX0VSUk9SUykgfHwgZGVmaW5lZCAoVkVSQk9TRV9HRkFSX0VSUk9SUykKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVycm9yIGludGVycnVwdCAoaWV2ZW50PTB4JTA4eCBpbWFzaz0weCUwOHgpXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGV2ZW50cywgZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5pbWFzaykpOworI2VuZGlmCisKKwkvKiBVcGRhdGUgdGhlIGVycm9yIGNvdW50ZXJzICovCisJaWYgKGV2ZW50cyAmIElFVkVOVF9UWEUpIHsKKwkJcHJpdi0+c3RhdHMudHhfZXJyb3JzKys7CisKKwkJaWYgKGV2ZW50cyAmIElFVkVOVF9MQykKKwkJCXByaXYtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJaWYgKGV2ZW50cyAmIElFVkVOVF9DUkwpCisJCQlwcml2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQlpZiAoZXZlbnRzICYgSUVWRU5UX1hGVU4pIHsKKyNpZmRlZiBWRVJCT1NFX0dGQVJfRVJST1JTCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHVuZGVycnVuLiAgcGFja2V0IGRyb3BwZWQuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJCXByaXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJCXByaXYtPmV4dHJhX3N0YXRzLnR4X3VuZGVycnVuKys7CisKKwkJCS8qIFJlYWN0aXZhdGUgdGhlIFR4IFF1ZXVlcyAqLworCQkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+dHN0YXQsIFRTVEFUX0NMRUFSX1RIQUxUKTsKKwkJfQorI2lmZGVmIFZFUkJPU0VfR0ZBUl9FUlJPUlMKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdCBFcnJvclxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCX0KKwlpZiAoZXZlbnRzICYgSUVWRU5UX0JTWSkgeworCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJcHJpdi0+ZXh0cmFfc3RhdHMucnhfYnN5Kys7CisKKwkJZ2Zhcl9yZWNlaXZlKGlycSwgZGV2X2lkLCByZWdzKTsKKworI2lmbmRlZiBDT05GSUdfR0ZBUl9OQVBJCisJCS8qIENsZWFyIHRoZSBoYWx0IGJpdCBpbiBSU1RBVCAqLworCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5yc3RhdCwgUlNUQVRfQ0xFQVJfUkhBTFQpOworI2VuZGlmCisKKyNpZmRlZiBWRVJCT1NFX0dGQVJfRVJST1JTCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogYnVzeSBlcnJvciAocmhhbHQ6ICV4KVxuIiwgZGV2LT5uYW1lLAorCQkgICAgICAgZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5yc3RhdCkpOworI2VuZGlmCisJfQorCWlmIChldmVudHMgJiBJRVZFTlRfQkFCUikgeworCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJcHJpdi0+ZXh0cmFfc3RhdHMucnhfYmFicisrOworCisjaWZkZWYgVkVSQk9TRV9HRkFSX0VSUk9SUworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJhYmJsaW5nIGVycm9yXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJfQorCWlmIChldmVudHMgJiBJRVZFTlRfRUJFUlIpIHsKKwkJcHJpdi0+ZXh0cmFfc3RhdHMuZWJlcnIrKzsKKyNpZmRlZiBWRVJCT1NFX0dGQVJfRVJST1JTCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRUJFUlJcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwl9CisJaWYgKGV2ZW50cyAmIElFVkVOVF9SWEMpCisjaWZkZWYgVkVSQk9TRV9HRkFSX0VSUk9SUworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNvbnRyb2wgZnJhbWVcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCWlmIChldmVudHMgJiBJRVZFTlRfQkFCVCkgeworCQlwcml2LT5leHRyYV9zdGF0cy50eF9iYWJ0Kys7CisjaWZkZWYgVkVSQk9TRV9HRkFSX0VSUk9SUworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJhYnQgZXJyb3JcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBTdHJ1Y3R1cmUgZm9yIGEgZGV2aWNlIGRyaXZlciAqLworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIGdmYXJfZHJpdmVyID0geworCS5uYW1lID0gImZzbC1naWFuZmFyIiwKKwkuYnVzID0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZSA9IGdmYXJfcHJvYmUsCisJLnJlbW92ZSA9IGdmYXJfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZ2Zhcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZ2Zhcl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZ2Zhcl9leGl0KHZvaWQpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmdmYXJfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZ2Zhcl9pbml0KTsKK21vZHVsZV9leGl0KGdmYXJfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuaCBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmY3ODNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5oCkBAIC0wLDAgKzEsNTM4IEBACisvKiAKKyAqIGRyaXZlcnMvbmV0L2dpYW5mYXIuaAorICoKKyAqIEdpYW5mYXIgRXRoZXJuZXQgRHJpdmVyCisgKiBEcml2ZXIgZm9yIEZFQyBvbiBNUEM4NTQwIGFuZCBUU0VDIG9uIE1QQzg1NDAvTVBDODU2MAorICogQmFzZWQgb24gODI2MF9pby9mY2NfZW5ldC5jCisgKgorICogQXV0aG9yOiBBbmR5IEZsZW1pbmcKKyAqIE1haW50YWluZXI6IEt1bWFyIEdhbGEgKGt1bWFyLmdhbGFAZnJlZXNjYWxlLmNvbSkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFN0aWxsIGxlZnQgdG8gZG86CisgKiAgICAgIC1BZGQgc3VwcG9ydCBmb3IgbW9kdWxlIHBhcmFtZXRlcnMKKyAqCS1BZGQgc3VwcG9ydCBmb3IgZXRodG9vbCAtcworICoJLUFkZCBwYXRjaCBmb3IgZXRodG9vbCBwaHlzIGlkCisgKi8KKyNpZm5kZWYgX19HSUFORkFSX0gKKyNkZWZpbmUgX19HSUFORkFSX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnNsX2RldmljZXMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlICJnaWFuZmFyX3BoeS5oIgorCisvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGFja2V0cyB0byBiZSBoYW5kbGVkIGluIG9uZSBjYWxsIG9mIGdmYXJfcG9sbCAqLworI2RlZmluZSBHRkFSX0RFVl9XRUlHSFQgNjQKKworLyogTnVtYmVyIG9mIGJ5dGVzIHRvIGFsaWduIHRoZSByeCBidWZzIHRvICovCisjZGVmaW5lIFJYQlVGX0FMSUdOTUVOVCA2NAorCisvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGNvbXBvc2VzIGEgdW5pdCBmb3IgdGhlIHB1cnBvc2Ugb2YKKyAqIGFsbG9jYXRpbmcgZGF0YSBidWZmZXJzLiAgaWUtZm9yIGFueSBnaXZlbiBNVFUsIHRoZSBkYXRhIGJ1ZmZlcgorICogd2lsbCBiZSB0aGUgbmV4dCBoaWdoZXN0IG11bHRpcGxlIG9mIDUxMiBieXRlcy4gKi8KKyNkZWZpbmUgSU5DUkVNRU5UQUxfQlVGRkVSX1NJWkUgNTEyCisKKworI2RlZmluZSBNQUNfQUREUl9MRU4gNgorCisjZGVmaW5lIFBIWV9JTklUX1RJTUVPVVQgMTAwMDAwCisjZGVmaW5lIEdGQVJfUEhZX0NIQU5HRV9USU1FIDIKKworI2RlZmluZSBERVZJQ0VfTkFNRSAiJXM6IEdpYW5mYXIgRXRoZXJuZXQgQ29udHJvbGxlciBWZXJzaW9uIDEuMSwgIgorI2RlZmluZSBEUlZfTkFNRSAiZ2Zhci1lbmV0IgorZXh0ZXJuIGNvbnN0IGNoYXIgZ2Zhcl9kcml2ZXJfbmFtZVtdOworZXh0ZXJuIGNvbnN0IGNoYXIgZ2Zhcl9kcml2ZXJfdmVyc2lvbltdOworCisvKiBUaGVzZSBuZWVkIHRvIGJlIHBvd2VycyBvZiAyIGZvciB0aGlzIGRyaXZlciAqLworI2lmZGVmIENPTkZJR19HRkFSX05BUEkKKyNkZWZpbmUgREVGQVVMVF9UWF9SSU5HX1NJWkUJMjU2CisjZGVmaW5lIERFRkFVTFRfUlhfUklOR19TSVpFCTI1NgorI2Vsc2UKKyNkZWZpbmUgREVGQVVMVF9UWF9SSU5HX1NJWkUgICAgNjQKKyNkZWZpbmUgREVGQVVMVF9SWF9SSU5HX1NJWkUgICAgNjQKKyNlbmRpZgorCisjZGVmaW5lIEdGQVJfUlhfTUFYX1JJTkdfU0laRSAgIDI1NgorI2RlZmluZSBHRkFSX1RYX01BWF9SSU5HX1NJWkUgICAyNTYKKworI2RlZmluZSBERUZBVUxUX1JYX0JVRkZFUl9TSVpFICAxNTM2CisjZGVmaW5lIFRYX1JJTkdfTU9EX01BU0soc2l6ZSkgKHNpemUtMSkKKyNkZWZpbmUgUlhfUklOR19NT0RfTUFTSyhzaXplKSAoc2l6ZS0xKQorI2RlZmluZSBKVU1CT19CVUZGRVJfU0laRSA5NzI4CisjZGVmaW5lIEpVTUJPX0ZSQU1FX1NJWkUgOTYwMAorCisvKiBMYXRlbmN5IG9mIGludGVyZmFjZSBjbG9jayBpbiBuYW5vc2Vjb25kcyAqLworLyogSW50ZXJmYWNlIGNsb2NrIGxhdGVuY3kgLCBpbiB0aGlzIGNhc2UsIG1lYW5zIHRoZSAKKyAqIHRpbWUgZGVzY3JpYmVkIGJ5IGEgdmFsdWUgb2YgMSBpbiB0aGUgaW50ZXJydXB0CisgKiBjb2FsZXNjaW5nIHJlZ2lzdGVycycgdGltZSBmaWVsZHMuICBTaW5jZSB0aG9zZSBmaWVsZHMKKyAqIHJlZmVyIHRvIHRoZSB0aW1lIGl0IHRha2VzIGZvciA2NCBjbG9ja3MgdG8gcGFzcywgdGhlCisgKiBsYXRlbmNpZXMgYXJlIGFzIHN1Y2g6CisgKiBHQklUID0gMTI1TUh6ID0+IDhucy9jbG9jayA9PiA4KjY0IG5zIC8gdGljaworICogMTAwID0gMjUgTUh6ID0+IDQwbnMvY2xvY2sgPT4gNDAqNjQgbnMgLyB0aWNrCisgKiAxMCA9IDIuNSBNSHogPT4gNDAwbnMvY2xvY2sgPT4gNDAwKjY0IG5zIC8gdGljaworICovCisjZGVmaW5lIEdGQVJfR0JJVF9USU1FICA1MTIKKyNkZWZpbmUgR0ZBUl8xMDBfVElNRSAgIDI1NjAKKyNkZWZpbmUgR0ZBUl8xMF9USU1FICAgIDI1NjAwCisKKyNkZWZpbmUgREVGQVVMVF9UWF9DT0FMRVNDRSAxCisjZGVmaW5lIERFRkFVTFRfVFhDT1VOVAkxNgorI2RlZmluZSBERUZBVUxUX1RYVElNRQk0MDAKKworI2RlZmluZSBERUZBVUxUX1JYX0NPQUxFU0NFIDEKKyNkZWZpbmUgREVGQVVMVF9SWENPVU5UCTE2CisjZGVmaW5lIERFRkFVTFRfUlhUSU1FCTQwMAorCisjZGVmaW5lIFRCSVBBX1ZBTFVFCQkweDFmCisjZGVmaW5lIE1JSU1DRkdfSU5JVF9WQUxVRQkweDAwMDAwMDA3CisjZGVmaW5lIE1JSU1DRkdfUkVTRVQgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgTUlJTUlORF9CVVNZICAgICAgICAgICAgMHgwMDAwMDAwMQorCisvKiBNQUMgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBNQUNDRkcxX1NPRlRfUkVTRVQJMHg4MDAwMDAwMAorI2RlZmluZSBNQUNDRkcxX1JFU0VUX1JYX01DCTB4MDAwODAwMDAKKyNkZWZpbmUgTUFDQ0ZHMV9SRVNFVF9UWF9NQwkweDAwMDQwMDAwCisjZGVmaW5lIE1BQ0NGRzFfUkVTRVRfUlhfRlVOCTB4MDAwMjAwMDAKKyNkZWZpbmUJTUFDQ0ZHMV9SRVNFVF9UWF9GVU4JMHgwMDAxMDAwMAorI2RlZmluZSBNQUNDRkcxX0xPT1BCQUNLCTB4MDAwMDAxMDAKKyNkZWZpbmUgTUFDQ0ZHMV9SWF9GTE9XCQkweDAwMDAwMDIwCisjZGVmaW5lIE1BQ0NGRzFfVFhfRkxPVwkJMHgwMDAwMDAxMAorI2RlZmluZSBNQUNDRkcxX1NZTkNEX1JYX0VOCTB4MDAwMDAwMDgKKyNkZWZpbmUgTUFDQ0ZHMV9SWF9FTgkJMHgwMDAwMDAwNAorI2RlZmluZSBNQUNDRkcxX1NZTkNEX1RYX0VOCTB4MDAwMDAwMDIKKyNkZWZpbmUgTUFDQ0ZHMV9UWF9FTgkJMHgwMDAwMDAwMQorCisjZGVmaW5lIE1BQ0NGRzJfSU5JVF9TRVRUSU5HUwkweDAwMDA3MjA1CisjZGVmaW5lIE1BQ0NGRzJfRlVMTF9EVVBMRVgJMHgwMDAwMDAwMQorI2RlZmluZSBNQUNDRkcyX0lGICAgICAgICAgICAgICAweDAwMDAwMzAwCisjZGVmaW5lIE1BQ0NGRzJfTUlJICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgTUFDQ0ZHMl9HTUlJICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBNQUNDRkcyX0hVR0VGUkFNRQkweDAwMDAwMDIwCisjZGVmaW5lIE1BQ0NGRzJfTEVOR1RIQ0hFQ0sJMHgwMDAwMDAxMAorCisjZGVmaW5lIEVDTlRSTF9JTklUX1NFVFRJTkdTCTB4MDAwMDEwMDAKKyNkZWZpbmUgRUNOVFJMX1RCSV9NT0RFICAgICAgICAgMHgwMDAwMDAyMAorCisjZGVmaW5lIE1SQkxSX0lOSVRfU0VUVElOR1MJREVGQVVMVF9SWF9CVUZGRVJfU0laRQorCisjZGVmaW5lIE1JTkZMUl9JTklUX1NFVFRJTkdTCTB4MDAwMDAwNDAKKworLyogSW5pdCB0byBkbyB0eCBzbm9vcGluZyBmb3IgYnVmZmVycyBhbmQgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgRE1BQ1RSTF9JTklUX1NFVFRJTkdTICAgMHgwMDAwMDBjMworI2RlZmluZSBETUFDVFJMX0dSUyAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIERNQUNUUkxfR1RTICAgICAgICAgICAgIDB4MDAwMDAwMDgKKworI2RlZmluZSBUU1RBVF9DTEVBUl9USEFMVCAgICAgICAweDgwMDAwMDAwCisKKy8qIEludGVycnVwdCBjb2FsZXNjaW5nIG1hY3JvcyAqLworI2RlZmluZSBJQ19JQ0VOCQkJMHg4MDAwMDAwMAorI2RlZmluZSBJQ19JQ0ZUX01BU0sJCTB4MWZlMDAwMDAKKyNkZWZpbmUgSUNfSUNGVF9TSElGVAkJMjEKKyNkZWZpbmUgbWtfaWNfaWNmdCh4KQkJXAorCSgoKHVuc2lnbmVkIGludCl4IDw8IElDX0lDRlRfU0hJRlQpJklDX0lDRlRfTUFTSykKKyNkZWZpbmUgSUNfSUNUVF9NQVNLCQkweDAwMDBmZmZmCisjZGVmaW5lIG1rX2ljX2ljdHQoeCkJCSh4JklDX0lDVFRfTUFTSykKKworI2RlZmluZSBta19pY192YWx1ZShjb3VudCwgdGltZSkgKElDX0lDRU4gfCBcCisJCQkJbWtfaWNfaWNmdChjb3VudCkgfCBcCisJCQkJbWtfaWNfaWN0dCh0aW1lKSkKKworI2RlZmluZSBSQ1RSTF9QUk9NCQkweDAwMDAwMDA4CisjZGVmaW5lIFJTVEFUX0NMRUFSX1JIQUxUICAgICAgIDB4MDA4MDAwMDAKKworI2RlZmluZSBJRVZFTlRfSU5JVF9DTEVBUgkweGZmZmZmZmZmCisjZGVmaW5lIElFVkVOVF9CQUJSCQkweDgwMDAwMDAwCisjZGVmaW5lIElFVkVOVF9SWEMJCTB4NDAwMDAwMDAKKyNkZWZpbmUgSUVWRU5UX0JTWQkJMHgyMDAwMDAwMAorI2RlZmluZSBJRVZFTlRfRUJFUlIJCTB4MTAwMDAwMDAKKyNkZWZpbmUgSUVWRU5UX01TUk8JCTB4MDQwMDAwMDAKKyNkZWZpbmUgSUVWRU5UX0dUU0MJCTB4MDIwMDAwMDAKKyNkZWZpbmUgSUVWRU5UX0JBQlQJCTB4MDEwMDAwMDAKKyNkZWZpbmUgSUVWRU5UX1RYQwkJMHgwMDgwMDAwMAorI2RlZmluZSBJRVZFTlRfVFhFCQkweDAwNDAwMDAwCisjZGVmaW5lIElFVkVOVF9UWEIJCTB4MDAyMDAwMDAKKyNkZWZpbmUgSUVWRU5UX1RYRgkJMHgwMDEwMDAwMAorI2RlZmluZSBJRVZFTlRfTEMJCTB4MDAwNDAwMDAKKyNkZWZpbmUgSUVWRU5UX0NSTAkJMHgwMDAyMDAwMAorI2RlZmluZSBJRVZFTlRfWEZVTgkJMHgwMDAxMDAwMAorI2RlZmluZSBJRVZFTlRfUlhCMAkJMHgwMDAwODAwMAorI2RlZmluZSBJRVZFTlRfR1JTQwkJMHgwMDAwMDEwMAorI2RlZmluZSBJRVZFTlRfUlhGMAkJMHgwMDAwMDA4MAorI2RlZmluZSBJRVZFTlRfUlhfTUFTSyAgICAgICAgICAoSUVWRU5UX1JYQjAgfCBJRVZFTlRfUlhGMCkKKyNkZWZpbmUgSUVWRU5UX1RYX01BU0sgICAgICAgICAgKElFVkVOVF9UWEIgfCBJRVZFTlRfVFhGKQorI2RlZmluZSBJRVZFTlRfRVJSX01BU0sgICAgICAgICBcCisoSUVWRU5UX1JYQyB8IElFVkVOVF9CU1kgfCBJRVZFTlRfRUJFUlIgfCBJRVZFTlRfTVNSTyB8IFwKKyBJRVZFTlRfQkFCVCB8IElFVkVOVF9UWEMgfCBJRVZFTlRfVFhFIHwgSUVWRU5UX0xDIFwKKyB8IElFVkVOVF9DUkwgfCBJRVZFTlRfWEZVTikKKworI2RlZmluZSBJTUFTS19JTklUX0NMRUFSCTB4MDAwMDAwMDAKKyNkZWZpbmUgSU1BU0tfQkFCUiAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBJTUFTS19SWEMgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIElNQVNLX0JTWSAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgSU1BU0tfRUJFUlIgICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBJTUFTS19NU1JPCQkweDA0MDAwMDAwCisjZGVmaW5lIElNQVNLX0dSU0MgICAgICAgICAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgSU1BU0tfQkFCVAkJMHgwMTAwMDAwMAorI2RlZmluZSBJTUFTS19UWEMgICAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIElNQVNLX1RYRUVOCQkweDAwNDAwMDAwCisjZGVmaW5lIElNQVNLX1RYQkVOCQkweDAwMjAwMDAwCisjZGVmaW5lIElNQVNLX1RYRkVOICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgSU1BU0tfTEMJCTB4MDAwNDAwMDAKKyNkZWZpbmUgSU1BU0tfQ1JMCQkweDAwMDIwMDAwCisjZGVmaW5lIElNQVNLX1hGVU4JCTB4MDAwMTAwMDAKKyNkZWZpbmUgSU1BU0tfUlhCMCAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBJTUFTS19HVFNDICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIElNQVNLX1JYRkVOMAkJMHgwMDAwMDA4MAorI2RlZmluZSBJTUFTS19SWF9ESVNBQkxFRCB+KElNQVNLX1JYRkVOMCB8IElNQVNLX0JTWSkKKyNkZWZpbmUgSU1BU0tfREVGQVVMVCAgKElNQVNLX1RYRUVOIHwgSU1BU0tfVFhGRU4gfCBJTUFTS19UWEJFTiB8IFwKKwkJSU1BU0tfUlhGRU4wIHwgSU1BU0tfQlNZIHwgSU1BU0tfRUJFUlIgfCBJTUFTS19CQUJSIHwgXAorCQlJTUFTS19YRlVOIHwgSU1BU0tfUlhDIHwgSU1BU0tfQkFCVCkKKworCisvKiBBdHRyaWJ1dGUgZmllbGRzICovCisKKy8qIFRoaXMgZW5hYmxlcyByeCBzbm9vcGluZyBmb3IgYnVmZmVycyBhbmQgZGVzY3JpcHRvcnMgKi8KKyNpZmRlZiBDT05GSUdfR0ZBUl9CRFNUQVNICisjZGVmaW5lIEFUVFJfQkRTVEFTSAkJMHgwMDAwMDgwMAorI2Vsc2UKKyNkZWZpbmUgQVRUUl9CRFNUQVNICQkweDAwMDAwMDAwCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19HRkFSX0JVRlNUQVNICisjZGVmaW5lIEFUVFJfQlVGU1RBU0gJCTB4MDAwMDQwMDAKKyNkZWZpbmUgU1RBU0hfTEVOR1RICQk2NAorI2Vsc2UKKyNkZWZpbmUgQVRUUl9CVUZTVEFTSAkJMHgwMDAwMDAwMAorI2VuZGlmCisKKyNkZWZpbmUgQVRUUl9TTk9PUElORwkJMHgwMDAwMDBjMAorI2RlZmluZSBBVFRSX0lOSVRfU0VUVElOR1MgICAgICAoQVRUUl9TTk9PUElORyBcCisJCXwgQVRUUl9CRFNUQVNIIHwgQVRUUl9CVUZTVEFTSCkKKworI2RlZmluZSBBVFRSRUxJX0lOSVRfU0VUVElOR1MgICAweDAKKworCisvKiBUeEJEIHN0YXR1cyBmaWVsZCBiaXRzICovCisjZGVmaW5lIFRYQkRfUkVBRFkJCTB4ODAwMAorI2RlZmluZSBUWEJEX1BBRENSQwkJMHg0MDAwCisjZGVmaW5lIFRYQkRfV1JBUAkJMHgyMDAwCisjZGVmaW5lIFRYQkRfSU5URVJSVVBUCQkweDEwMDAKKyNkZWZpbmUgVFhCRF9MQVNUCQkweDA4MDAKKyNkZWZpbmUgVFhCRF9DUkMJCTB4MDQwMAorI2RlZmluZSBUWEJEX0RFRgkJMHgwMjAwCisjZGVmaW5lIFRYQkRfSFVHRUZSQU1FCQkweDAwODAKKyNkZWZpbmUgVFhCRF9MQVRFQ09MTElTSU9OCTB4MDA4MAorI2RlZmluZSBUWEJEX1JFVFJZTElNSVQJCTB4MDA0MAorI2RlZmluZQlUWEJEX1JFVFJZQ09VTlRNQVNLCTB4MDAzYworI2RlZmluZSBUWEJEX1VOREVSUlVOCQkweDAwMDIKKworLyogUnhCRCBzdGF0dXMgZmllbGQgYml0cyAqLworI2RlZmluZSBSWEJEX0VNUFRZCQkweDgwMDAKKyNkZWZpbmUgUlhCRF9STzEJCTB4NDAwMAorI2RlZmluZSBSWEJEX1dSQVAJCTB4MjAwMAorI2RlZmluZSBSWEJEX0lOVEVSUlVQVAkJMHgxMDAwCisjZGVmaW5lIFJYQkRfTEFTVAkJMHgwODAwCisjZGVmaW5lIFJYQkRfRklSU1QJCTB4MDQwMAorI2RlZmluZSBSWEJEX01JU1MJCTB4MDEwMAorI2RlZmluZSBSWEJEX0JST0FEQ0FTVAkJMHgwMDgwCisjZGVmaW5lIFJYQkRfTVVMVElDQVNUCQkweDAwNDAKKyNkZWZpbmUgUlhCRF9MQVJHRQkJMHgwMDIwCisjZGVmaW5lIFJYQkRfTk9OT0NURVQJCTB4MDAxMAorI2RlZmluZSBSWEJEX1NIT1JUCQkweDAwMDgKKyNkZWZpbmUgUlhCRF9DUkNFUlIJCTB4MDAwNAorI2RlZmluZSBSWEJEX09WRVJSVU4JCTB4MDAwMgorI2RlZmluZSBSWEJEX1RSVU5DQVRFRAkJMHgwMDAxCisjZGVmaW5lIFJYQkRfU1RBVFMJCTB4MDFmZgorCitzdHJ1Y3QgdHhiZDgKK3sKKwl1MTYJc3RhdHVzOwkvKiBTdGF0dXMgRmllbGRzICovCisJdTE2CWxlbmd0aDsJLyogQnVmZmVyIGxlbmd0aCAqLworCXUzMglidWZQdHI7CS8qIEJ1ZmZlciBQb2ludGVyICovCit9OworCitzdHJ1Y3QgcnhiZDgKK3sKKwl1MTYJc3RhdHVzOwkvKiBTdGF0dXMgRmllbGRzICovCisJdTE2CWxlbmd0aDsJLyogQnVmZmVyIExlbmd0aCAqLworCXUzMglidWZQdHI7CS8qIEJ1ZmZlciBQb2ludGVyICovCit9OworCitzdHJ1Y3Qgcm1vbl9taWIKK3sKKwl1MzIJdHI2NDsJLyogMHguNjgwIC0gVHJhbnNtaXQgYW5kIFJlY2VpdmUgNjQtYnl0ZSBGcmFtZSBDb3VudGVyICovCisJdTMyCXRyMTI3OwkvKiAweC42ODQgLSBUcmFuc21pdCBhbmQgUmVjZWl2ZSA2NS0xMjcgYnl0ZSBGcmFtZSBDb3VudGVyICovCisJdTMyCXRyMjU1OwkvKiAweC42ODggLSBUcmFuc21pdCBhbmQgUmVjZWl2ZSAxMjgtMjU1IGJ5dGUgRnJhbWUgQ291bnRlciAqLworCXUzMgl0cjUxMTsJLyogMHguNjhjIC0gVHJhbnNtaXQgYW5kIFJlY2VpdmUgMjU2LTUxMSBieXRlIEZyYW1lIENvdW50ZXIgKi8KKwl1MzIJdHIxazsJLyogMHguNjkwIC0gVHJhbnNtaXQgYW5kIFJlY2VpdmUgNTEyLTEwMjMgYnl0ZSBGcmFtZSBDb3VudGVyICovCisJdTMyCXRybWF4OwkvKiAweC42OTQgLSBUcmFuc21pdCBhbmQgUmVjZWl2ZSAxMDI0LTE1MTggYnl0ZSBGcmFtZSBDb3VudGVyICovCisJdTMyCXRybWd2OwkvKiAweC42OTggLSBUcmFuc21pdCBhbmQgUmVjZWl2ZSAxNTE5LTE1MjIgYnl0ZSBHb29kIFZMQU4gRnJhbWUgKi8KKwl1MzIJcmJ5dDsJLyogMHguNjljIC0gUmVjZWl2ZSBCeXRlIENvdW50ZXIgKi8KKwl1MzIJcnBrdDsJLyogMHguNmEwIC0gUmVjZWl2ZSBQYWNrZXQgQ291bnRlciAqLworCXUzMglyZmNzOwkvKiAweC42YTQgLSBSZWNlaXZlIEZDUyBFcnJvciBDb3VudGVyICovCisJdTMyCXJtY2E7CS8qIDB4LjZhOCAtIFJlY2VpdmUgTXVsdGljYXN0IFBhY2tldCBDb3VudGVyICovCisJdTMyCXJiY2E7CS8qIDB4LjZhYyAtIFJlY2VpdmUgQnJvYWRjYXN0IFBhY2tldCBDb3VudGVyICovCisJdTMyCXJ4Y2Y7CS8qIDB4LjZiMCAtIFJlY2VpdmUgQ29udHJvbCBGcmFtZSBQYWNrZXQgQ291bnRlciAqLworCXUzMglyeHBmOwkvKiAweC42YjQgLSBSZWNlaXZlIFBhdXNlIEZyYW1lIFBhY2tldCBDb3VudGVyICovCisJdTMyCXJ4dW87CS8qIDB4LjZiOCAtIFJlY2VpdmUgVW5rbm93biBPUCBDb2RlIENvdW50ZXIgKi8KKwl1MzIJcmFsbjsJLyogMHguNmJjIC0gUmVjZWl2ZSBBbGlnbm1lbnQgRXJyb3IgQ291bnRlciAqLworCXUzMglyZmxyOwkvKiAweC42YzAgLSBSZWNlaXZlIEZyYW1lIExlbmd0aCBFcnJvciBDb3VudGVyICovCisJdTMyCXJjZGU7CS8qIDB4LjZjNCAtIFJlY2VpdmUgQ29kZSBFcnJvciBDb3VudGVyICovCisJdTMyCXJjc2U7CS8qIDB4LjZjOCAtIFJlY2VpdmUgQ2FycmllciBTZW5zZSBFcnJvciBDb3VudGVyICovCisJdTMyCXJ1bmQ7CS8qIDB4LjZjYyAtIFJlY2VpdmUgVW5kZXJzaXplIFBhY2tldCBDb3VudGVyICovCisJdTMyCXJvdnI7CS8qIDB4LjZkMCAtIFJlY2VpdmUgT3ZlcnNpemUgUGFja2V0IENvdW50ZXIgKi8KKwl1MzIJcmZyZzsJLyogMHguNmQ0IC0gUmVjZWl2ZSBGcmFnbWVudHMgQ291bnRlciAqLworCXUzMglyamJyOwkvKiAweC42ZDggLSBSZWNlaXZlIEphYmJlciBDb3VudGVyICovCisJdTMyCXJkcnA7CS8qIDB4LjZkYyAtIFJlY2VpdmUgRHJvcCBDb3VudGVyICovCisJdTMyCXRieXQ7CS8qIDB4LjZlMCAtIFRyYW5zbWl0IEJ5dGUgQ291bnRlciBDb3VudGVyICovCisJdTMyCXRwa3Q7CS8qIDB4LjZlNCAtIFRyYW5zbWl0IFBhY2tldCBDb3VudGVyICovCisJdTMyCXRtY2E7CS8qIDB4LjZlOCAtIFRyYW5zbWl0IE11bHRpY2FzdCBQYWNrZXQgQ291bnRlciAqLworCXUzMgl0YmNhOwkvKiAweC42ZWMgLSBUcmFuc21pdCBCcm9hZGNhc3QgUGFja2V0IENvdW50ZXIgKi8KKwl1MzIJdHhwZjsJLyogMHguNmYwIC0gVHJhbnNtaXQgUGF1c2UgQ29udHJvbCBGcmFtZSBDb3VudGVyICovCisJdTMyCXRkZnI7CS8qIDB4LjZmNCAtIFRyYW5zbWl0IERlZmVycmFsIFBhY2tldCBDb3VudGVyICovCisJdTMyCXRlZGY7CS8qIDB4LjZmOCAtIFRyYW5zbWl0IEV4Y2Vzc2l2ZSBEZWZlcnJhbCBQYWNrZXQgQ291bnRlciAqLworCXUzMgl0c2NsOwkvKiAweC42ZmMgLSBUcmFuc21pdCBTaW5nbGUgQ29sbGlzaW9uIFBhY2tldCBDb3VudGVyICovCisJdTMyCXRtY2w7CS8qIDB4LjcwMCAtIFRyYW5zbWl0IE11bHRpcGxlIENvbGxpc2lvbiBQYWNrZXQgQ291bnRlciAqLworCXUzMgl0bGNsOwkvKiAweC43MDQgLSBUcmFuc21pdCBMYXRlIENvbGxpc2lvbiBQYWNrZXQgQ291bnRlciAqLworCXUzMgl0eGNsOwkvKiAweC43MDggLSBUcmFuc21pdCBFeGNlc3NpdmUgQ29sbGlzaW9uIFBhY2tldCBDb3VudGVyICovCisJdTMyCXRuY2w7CS8qIDB4LjcwYyAtIFRyYW5zbWl0IFRvdGFsIENvbGxpc2lvbiBDb3VudGVyICovCisJdTgJcmVzMVs0XTsKKwl1MzIJdGRycDsJLyogMHguNzE0IC0gVHJhbnNtaXQgRHJvcCBGcmFtZSBDb3VudGVyICovCisJdTMyCXRqYnI7CS8qIDB4LjcxOCAtIFRyYW5zbWl0IEphYmJlciBGcmFtZSBDb3VudGVyICovCisJdTMyCXRmY3M7CS8qIDB4LjcxYyAtIFRyYW5zbWl0IEZDUyBFcnJvciBDb3VudGVyICovCisJdTMyCXR4Y2Y7CS8qIDB4LjcyMCAtIFRyYW5zbWl0IENvbnRyb2wgRnJhbWUgQ291bnRlciAqLworCXUzMgl0b3ZyOwkvKiAweC43MjQgLSBUcmFuc21pdCBPdmVyc2l6ZSBGcmFtZSBDb3VudGVyICovCisJdTMyCXR1bmQ7CS8qIDB4LjcyOCAtIFRyYW5zbWl0IFVuZGVyc2l6ZSBGcmFtZSBDb3VudGVyICovCisJdTMyCXRmcmc7CS8qIDB4LjcyYyAtIFRyYW5zbWl0IEZyYWdtZW50cyBGcmFtZSBDb3VudGVyICovCisJdTMyCWNhcjE7CS8qIDB4LjczMCAtIENhcnJ5IFJlZ2lzdGVyIE9uZSAqLworCXUzMgljYXIyOwkvKiAweC43MzQgLSBDYXJyeSBSZWdpc3RlciBUd28gKi8KKwl1MzIJY2FtMTsJLyogMHguNzM4IC0gQ2FycnkgTWFzayBSZWdpc3RlciBPbmUgKi8KKwl1MzIJY2FtMjsJLyogMHguNzNjIC0gQ2FycnkgTWFzayBSZWdpc3RlciBUd28gKi8KK307CisKK3N0cnVjdCBnZmFyX2V4dHJhX3N0YXRzIHsKKwl1NjQga2VybmVsX2Ryb3BwZWQ7CisJdTY0IHJ4X2xhcmdlOworCXU2NCByeF9zaG9ydDsKKwl1NjQgcnhfbm9ub2N0ZXQ7CisJdTY0IHJ4X2NyY2VycjsKKwl1NjQgcnhfb3ZlcnJ1bjsKKwl1NjQgcnhfYnN5OworCXU2NCByeF9iYWJyOworCXU2NCByeF90cnVuYzsKKwl1NjQgZWJlcnI7CisJdTY0IHR4X2JhYnQ7CisJdTY0IHR4X3VuZGVycnVuOworCXU2NCByeF9za2JtaXNzaW5nOworCXU2NCB0eF90aW1lb3V0OworfTsKKworI2RlZmluZSBHRkFSX1JNT05fTEVOICgoc2l6ZW9mKHN0cnVjdCBybW9uX21pYikgLSAxNikvc2l6ZW9mKHUzMikpCisjZGVmaW5lIEdGQVJfRVhUUkFfU1RBVFNfTEVOIChzaXplb2Yoc3RydWN0IGdmYXJfZXh0cmFfc3RhdHMpL3NpemVvZih1NjQpKQorCisvKiBOdW1iZXIgb2Ygc3RhdHMgaW4gdGhlIHN0YXRzIHN0cnVjdHVyZSAoaWdub3JlIGNhciBhbmQgY2FtIHJlZ3MpKi8KKyNkZWZpbmUgR0ZBUl9TVEFUU19MRU4gKEdGQVJfUk1PTl9MRU4gKyBHRkFSX0VYVFJBX1NUQVRTX0xFTikKKworI2RlZmluZSBHRkFSX0lORk9TVFJfTEVOIDMyCisKK3N0cnVjdCBnZmFyX3N0YXRzIHsKKwl1NjQgZXh0cmFbR0ZBUl9FWFRSQV9TVEFUU19MRU5dOworCXU2NCBybW9uW0dGQVJfUk1PTl9MRU5dOworfTsKKworCitzdHJ1Y3QgZ2ZhciB7CisJdTgJcmVzMVsxNl07CisJdTMyCWlldmVudDsJCQkvKiAweC4wMTAgLSBJbnRlcnJ1cHQgRXZlbnQgUmVnaXN0ZXIgKi8KKwl1MzIJaW1hc2s7CQkJLyogMHguMDE0IC0gSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKwl1MzIJZWRpczsJCQkvKiAweC4wMTggLSBFcnJvciBEaXNhYmxlZCBSZWdpc3RlciAqLworCXU4CXJlczJbNF07CisJdTMyCWVjbnRybDsJCQkvKiAweC4wMjAgLSBFdGhlcm5ldCBDb250cm9sIFJlZ2lzdGVyICovCisJdTMyCW1pbmZscjsJCQkvKiAweC4wMjQgLSBNaW5pbXVtIEZyYW1lIExlbmd0aCBSZWdpc3RlciAqLworCXUzMglwdHY7CQkJLyogMHguMDI4IC0gUGF1c2UgVGltZSBWYWx1ZSBSZWdpc3RlciAqLworCXUzMglkbWFjdHJsOwkJLyogMHguMDJjIC0gRE1BIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwl1MzIJdGJpcGE7CQkJLyogMHguMDMwIC0gVEJJIFBIWSBBZGRyZXNzIFJlZ2lzdGVyICovCisJdTgJcmVzM1s4OF07CisJdTMyCWZpZm9fdHhfdGhyOwkJLyogMHguMDhjIC0gRklGTyB0cmFuc21pdCB0aHJlc2hvbGQgcmVnaXN0ZXIgKi8KKwl1OAlyZXM0WzhdOworCXUzMglmaWZvX3R4X3N0YXJ2ZTsJCS8qIDB4LjA5OCAtIEZJRk8gdHJhbnNtaXQgc3RhcnZlIHJlZ2lzdGVyICovCisJdTMyCWZpZm9fdHhfc3RhcnZlX3NodXRvZmY7CS8qIDB4LjA5YyAtIEZJRk8gdHJhbnNtaXQgc3RhcnZlIHNodXRvZmYgcmVnaXN0ZXIgKi8KKwl1OAlyZXM1Wzk2XTsKKwl1MzIJdGN0cmw7CQkJLyogMHguMTAwIC0gVHJhbnNtaXQgQ29udHJvbCBSZWdpc3RlciAqLworCXUzMgl0c3RhdDsJCQkvKiAweC4xMDQgLSBUcmFuc21pdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKwl1OAlyZXM2WzRdOworCXUzMgl0YmRsZW47CQkJLyogMHguMTBjIC0gVHJhbnNtaXQgQnVmZmVyIERlc2NyaXB0b3IgRGF0YSBMZW5ndGggUmVnaXN0ZXIgKi8KKwl1MzIJdHhpYzsJCQkvKiAweC4xMTAgLSBUcmFuc21pdCBJbnRlcnJ1cHQgQ29hbGVzY2luZyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisJdTgJcmVzN1sxNl07CisJdTMyCWN0YnB0cjsJCQkvKiAweC4xMjQgLSBDdXJyZW50IFRyYW5zbWl0IEJ1ZmZlciBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKwl1OAlyZXM4WzkyXTsKKwl1MzIJdGJwdHI7CQkJLyogMHguMTg0IC0gVHJhbnNtaXQgQnVmZmVyIERlc2NyaXB0b3IgUG9pbnRlciBMb3cgUmVnaXN0ZXIgKi8KKwl1OAlyZXM5WzEyNF07CisJdTMyCXRiYXNlOwkJCS8qIDB4LjIwNCAtIFRyYW5zbWl0IERlc2NyaXB0b3IgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyICovCisJdTgJcmVzMTBbMTY4XTsKKwl1MzIJb3N0YmQ7CQkJLyogMHguMmIwIC0gT3V0LW9mLVNlcXVlbmNlIFRyYW5zbWl0IEJ1ZmZlciBEZXNjcmlwdG9yIFJlZ2lzdGVyICovCisJdTMyCW9zdGJkcDsJCQkvKiAweC4yYjQgLSBPdXQtb2YtU2VxdWVuY2UgVHJhbnNtaXQgRGF0YSBCdWZmZXIgUG9pbnRlciBSZWdpc3RlciAqLworCXU4CXJlczExWzcyXTsKKwl1MzIJcmN0cmw7CQkJLyogMHguMzAwIC0gUmVjZWl2ZSBDb250cm9sIFJlZ2lzdGVyICovCisJdTMyCXJzdGF0OwkJCS8qIDB4LjMwNCAtIFJlY2VpdmUgU3RhdHVzIFJlZ2lzdGVyICovCisJdTgJcmVzMTJbNF07CisJdTMyCXJiZGxlbjsJCQkvKiAweC4zMGMgLSBSeEJEIERhdGEgTGVuZ3RoIFJlZ2lzdGVyICovCisJdTMyCXJ4aWM7CQkJLyogMHguMzEwIC0gUmVjZWl2ZSBJbnRlcnJ1cHQgQ29hbGVzY2luZyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisJdTgJcmVzMTNbMTZdOworCXUzMgljcmJwdHI7CQkJLyogMHguMzI0IC0gQ3VycmVudCBSZWNlaXZlIEJ1ZmZlciBEZXNjcmlwdG9yIFBvaW50ZXIgKi8KKwl1OAlyZXMxNFsyNF07CisJdTMyCW1yYmxyOwkJCS8qIDB4LjM0MCAtIE1heGltdW0gUmVjZWl2ZSBCdWZmZXIgTGVuZ3RoIFJlZ2lzdGVyICovCisJdTgJcmVzMTVbNjRdOworCXUzMglyYnB0cjsJCQkvKiAweC4zODQgLSBSZWNlaXZlIEJ1ZmZlciBEZXNjcmlwdG9yIFBvaW50ZXIgKi8KKwl1OAlyZXMxNlsxMjRdOworCXUzMglyYmFzZTsJCQkvKiAweC40MDQgLSBSZWNlaXZlIERlc2NyaXB0b3IgQmFzZSBBZGRyZXNzICovCisJdTgJcmVzMTdbMjQ4XTsKKwl1MzIJbWFjY2ZnMTsJCS8qIDB4LjUwMCAtIE1BQyBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KKwl1MzIJbWFjY2ZnMjsJCS8qIDB4LjUwNCAtIE1BQyBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KKwl1MzIJaXBnaWZnOwkJCS8qIDB4LjUwOCAtIEludGVyIFBhY2tldCBHYXAvSW50ZXIgRnJhbWUgR2FwIFJlZ2lzdGVyICovCisJdTMyCWhhZmR1cDsJCQkvKiAweC41MGMgLSBIYWxmIER1cGxleCBSZWdpc3RlciAqLworCXUzMgltYXhmcm07CQkJLyogMHguNTEwIC0gTWF4aW11bSBGcmFtZSBMZW5ndGggUmVnaXN0ZXIgKi8KKwl1OAlyZXMxOFsxMl07CisJdTMyCW1paW1jZmc7CQkvKiAweC41MjAgLSBNSUkgTWFuYWdlbWVudCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisJdTMyCW1paW1jb207CQkvKiAweC41MjQgLSBNSUkgTWFuYWdlbWVudCBDb21tYW5kIFJlZ2lzdGVyICovCisJdTMyCW1paW1hZGQ7CQkvKiAweC41MjggLSBNSUkgTWFuYWdlbWVudCBBZGRyZXNzIFJlZ2lzdGVyICovCisJdTMyCW1paW1jb247CQkvKiAweC41MmMgLSBNSUkgTWFuYWdlbWVudCBDb250cm9sIFJlZ2lzdGVyICovCisJdTMyCW1paW1zdGF0OwkJLyogMHguNTMwIC0gTUlJIE1hbmFnZW1lbnQgU3RhdHVzIFJlZ2lzdGVyICovCisJdTMyCW1paW1pbmQ7CQkvKiAweC41MzQgLSBNSUkgTWFuYWdlbWVudCBJbmRpY2F0b3IgUmVnaXN0ZXIgKi8KKwl1OAlyZXMxOVs0XTsKKwl1MzIJaWZzdGF0OwkJCS8qIDB4LjUzYyAtIEludGVyZmFjZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKwl1MzIJbWFjc3RuYWRkcjE7CQkvKiAweC41NDAgLSBTdGF0aW9uIEFkZHJlc3MgUGFydCAxIFJlZ2lzdGVyICovCisJdTMyCW1hY3N0bmFkZHIyOwkJLyogMHguNTQ0IC0gU3RhdGlvbiBBZGRyZXNzIFBhcnQgMiBSZWdpc3RlciAqLworCXU4CXJlczIwWzMxMl07CisJc3RydWN0IHJtb25fbWliCXJtb247CisJdTgJcmVzMjFbMTkyXTsKKwl1MzIJaWFkZHIwOwkJCS8qIDB4LjgwMCAtIEluZGl2ZHVhbCBhZGRyZXNzIHJlZ2lzdGVyIDAgKi8KKwl1MzIJaWFkZHIxOwkJCS8qIDB4LjgwNCAtIEluZGl2ZHVhbCBhZGRyZXNzIHJlZ2lzdGVyIDEgKi8KKwl1MzIJaWFkZHIyOwkJCS8qIDB4LjgwOCAtIEluZGl2ZHVhbCBhZGRyZXNzIHJlZ2lzdGVyIDIgKi8KKwl1MzIJaWFkZHIzOwkJCS8qIDB4LjgwYyAtIEluZGl2ZHVhbCBhZGRyZXNzIHJlZ2lzdGVyIDMgKi8KKwl1MzIJaWFkZHI0OwkJCS8qIDB4LjgxMCAtIEluZGl2ZHVhbCBhZGRyZXNzIHJlZ2lzdGVyIDQgKi8KKwl1MzIJaWFkZHI1OwkJCS8qIDB4LjgxNCAtIEluZGl2ZHVhbCBhZGRyZXNzIHJlZ2lzdGVyIDUgKi8KKwl1MzIJaWFkZHI2OwkJCS8qIDB4LjgxOCAtIEluZGl2ZHVhbCBhZGRyZXNzIHJlZ2lzdGVyIDYgKi8KKwl1MzIJaWFkZHI3OwkJCS8qIDB4LjgxYyAtIEluZGl2ZHVhbCBhZGRyZXNzIHJlZ2lzdGVyIDcgKi8KKwl1OAlyZXMyMls5Nl07CisJdTMyCWdhZGRyMDsJCQkvKiAweC44ODAgLSBHbG9iYWwgYWRkcmVzcyByZWdpc3RlciAwICovCisJdTMyCWdhZGRyMTsJCQkvKiAweC44ODQgLSBHbG9iYWwgYWRkcmVzcyByZWdpc3RlciAxICovCisJdTMyCWdhZGRyMjsJCQkvKiAweC44ODggLSBHbG9iYWwgYWRkcmVzcyByZWdpc3RlciAyICovCisJdTMyCWdhZGRyMzsJCQkvKiAweC44OGMgLSBHbG9iYWwgYWRkcmVzcyByZWdpc3RlciAzICovCisJdTMyCWdhZGRyNDsJCQkvKiAweC44OTAgLSBHbG9iYWwgYWRkcmVzcyByZWdpc3RlciA0ICovCisJdTMyCWdhZGRyNTsJCQkvKiAweC44OTQgLSBHbG9iYWwgYWRkcmVzcyByZWdpc3RlciA1ICovCisJdTMyCWdhZGRyNjsJCQkvKiAweC44OTggLSBHbG9iYWwgYWRkcmVzcyByZWdpc3RlciA2ICovCisJdTMyCWdhZGRyNzsJCQkvKiAweC44OWMgLSBHbG9iYWwgYWRkcmVzcyByZWdpc3RlciA3ICovCisJdTgJcmVzMjNbODU2XTsKKwl1MzIJYXR0cjsJCQkvKiAweC5iZjggLSBBdHRyaWJ1dGVzIFJlZ2lzdGVyICovCisJdTMyCWF0dHJlbGk7CQkvKiAweC5iZmMgLSBBdHRyaWJ1dGVzIEV4dHJhY3QgTGVuZ3RoIGFuZCBFeHRyYWN0IEluZGV4IFJlZ2lzdGVyICovCisJdTgJcmVzMjRbMTAyNF07CisKK307CisKKy8qIFN0cnVjdCBzdG9sZW4gYWxtb3N0IGNvbXBsZXRlbHkgKGFuZCBzaGFtZWxlc3NseSkgZnJvbSB0aGUgRkNDIGVuZXQgc291cmNlCisgKiAoT2ssIHRoYXQncyBub3Qgc28gdHJ1ZSBhbnltb3JlLCBidXQgdGhlcmUgaXMgYSBmYW1pbHkgcmVzZW1ibGVuY2UpCisgKiBUaGUgR0ZBUiBidWZmZXIgZGVzY3JpcHRvcnMgdHJhY2sgdGhlIHJpbmcgYnVmZmVycy4gIFRoZSByeF9iZF9iYXNlCisgKiBhbmQgdHhfYmRfYmFzZSBhbHdheXMgcG9pbnQgdG8gdGhlIGN1cnJlbnRseSBhdmFpbGFibGUgYnVmZmVyLgorICogVGhlIGRpcnR5X3R4IHRyYWNrcyB0aGUgY3VycmVudCBidWZmZXIgdGhhdCBpcyBiZWluZyBzZW50IGJ5IHRoZQorICogY29udHJvbGxlci4gIFRoZSBjdXJfdHggYW5kIGRpcnR5X3R4IGFyZSBlcXVhbCB1bmRlciBib3RoIGNvbXBsZXRlbHkKKyAqIGVtcHR5IGFuZCBjb21wbGV0ZWx5IGZ1bGwgY29uZGl0aW9ucy4gIFRoZSBlbXB0eS9yZWFkeSBpbmRpY2F0b3IgaW4KKyAqIHRoZSBidWZmZXIgZGVzY3JpcHRvciBkZXRlcm1pbmVzIHRoZSBhY3R1YWwgY29uZGl0aW9uLgorICovCitzdHJ1Y3QgZ2Zhcl9wcml2YXRlIHsKKwkvKiBwb2ludGVycyB0byBhcnJheXMgb2Ygc2tidWZmcyBmb3IgdHggYW5kIHJ4ICovCisJc3RydWN0IHNrX2J1ZmYgKiogdHhfc2tidWZmOworCXN0cnVjdCBza19idWZmICoqIHJ4X3NrYnVmZjsKKworCS8qIGluZGljZXMgcG9pbnRpbmcgdG8gdGhlIG5leHQgZnJlZSBzYmsgaW4gc2tiIGFycmF5cyAqLworCXUxNiBza2JfY3VydHg7CisJdTE2IHNrYl9jdXJyeDsKKworCS8qIGluZGV4IG9mIHRoZSBmaXJzdCBza2Igd2hpY2ggaGFzbid0IGJlZW4gdHJhbnNtaXR0ZWQKKwkgKiB5ZXQuICovCisJdTE2IHNrYl9kaXJ0eXR4OworCisJLyogQ29uZmlndXJhdGlvbiBpbmZvIGZvciB0aGUgY29hbGVzY2luZyBmZWF0dXJlcyAqLworCXVuc2lnbmVkIGNoYXIgdHhjb2FsZXNjaW5nOworCXVuc2lnbmVkIHNob3J0IHR4Y291bnQ7CisJdW5zaWduZWQgc2hvcnQgdHh0aW1lOworCXVuc2lnbmVkIGNoYXIgcnhjb2FsZXNjaW5nOworCXVuc2lnbmVkIHNob3J0IHJ4Y291bnQ7CisJdW5zaWduZWQgc2hvcnQgcnh0aW1lOworCisJLyogR0ZBUiBhZGRyZXNzZXMgKi8KKwlzdHJ1Y3QgcnhiZDggKnJ4X2JkX2Jhc2U7CS8qIEJhc2UgYWRkcmVzc2VzIG9mIFJ4IGFuZCBUeCBCdWZmZXJzICovCisJc3RydWN0IHR4YmQ4ICp0eF9iZF9iYXNlOworCXN0cnVjdCByeGJkOCAqY3VyX3J4OyAgICAgICAgICAgLyogTmV4dCBmcmVlIHJ4IHJpbmcgZW50cnkgKi8KKwlzdHJ1Y3QgdHhiZDggKmN1cl90eDsJICAgICAgICAvKiBOZXh0IGZyZWUgcmluZyBlbnRyeSAqLworCXN0cnVjdCB0eGJkOCAqZGlydHlfdHg7CQkvKiBUaGUgUmluZyBlbnRyeSB0byBiZSBmcmVlZC4gKi8KKwlzdHJ1Y3QgZ2ZhciAqcmVnczsJLyogUG9pbnRlciB0byB0aGUgR0ZBUiBtZW1vcnkgbWFwcGVkIFJlZ2lzdGVycyAqLworCXN0cnVjdCBnZmFyICpwaHlyZWdzOworCXN0cnVjdCB3b3JrX3N0cnVjdCB0cTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBwaHlfaW5mb190aW1lcjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsgLyogbGludXggbmV0d29yayBzdGF0aXN0aWNzICovCisJc3RydWN0IGdmYXJfZXh0cmFfc3RhdHMgZXh0cmFfc3RhdHM7CisJc3BpbmxvY2tfdCBsb2NrOworCXVuc2lnbmVkIGludCByeF9idWZmZXJfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgcnhfc3Rhc2hfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgdHhfcmluZ19zaXplOworCXVuc2lnbmVkIGludCByeF9yaW5nX3NpemU7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcnhjbGVhbnVwcTsKKwl1bnNpZ25lZCBpbnQgcnhjbGVhbjsKKworCS8qIEluZm8gc3RydWN0dXJlIGluaXRpYWxpemVkIGJ5IGJvYXJkIHNldHVwIGNvZGUgKi8KKwl1bnNpZ25lZCBpbnQgaW50ZXJydXB0VHJhbnNtaXQ7CisJdW5zaWduZWQgaW50IGludGVycnVwdFJlY2VpdmU7CisJdW5zaWduZWQgaW50IGludGVycnVwdEVycm9yOworCXN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKmVpbmZvOworCisJc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvOworCWludCBvbGRzcGVlZDsKKwlpbnQgb2xkZHVwbGV4OworCWludCBvbGRsaW5rOworfTsKKworZXh0ZXJuIGlubGluZSB1MzIgZ2Zhcl9yZWFkKHZvbGF0aWxlIHVuc2lnbmVkICphZGRyKQoreworCXUzMiB2YWw7CisJdmFsID0gaW5fYmUzMihhZGRyKTsKKwlyZXR1cm4gdmFsOworfQorCitleHRlcm4gaW5saW5lIHZvaWQgZ2Zhcl93cml0ZSh2b2xhdGlsZSB1bnNpZ25lZCAqYWRkciwgdTMyIHZhbCkKK3sKKwlvdXRfYmUzMihhZGRyLCB2YWwpOworfQorCitleHRlcm4gc3RydWN0IGV0aHRvb2xfb3BzICpnZmFyX29wX2FycmF5W107CisKKyNlbmRpZiAvKiBfX0dJQU5GQVJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZ2lhbmZhcl9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9naWFuZmFyX2V0aHRvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODA0NmU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZ2lhbmZhcl9ldGh0b29sLmMKQEAgLTAsMCArMSw1MjcgQEAKKy8qCisgKiAgZHJpdmVycy9uZXQvZ2lhbmZhcl9ldGh0b29sLmMKKyAqCisgKiAgR2lhbmZhciBFdGhlcm5ldCBEcml2ZXIKKyAqICBFdGh0b29sIHN1cHBvcnQgZm9yIEdpYW5mYXIgRW5ldAorICogIEJhc2VkIG9uIGUxMDAwIGV0aHRvb2wgc3VwcG9ydAorICoKKyAqICBBdXRob3I6IEFuZHkgRmxlbWluZworICogIE1haW50YWluZXI6IEt1bWFyIEdhbGEgKGt1bWFyLmdhbGFAZnJlZXNjYWxlLmNvbSkKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAzLDIwMDQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIAorICogIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIsIGluY29ycG9yYXRlZCBoZXJlaW4gCisgKiAgYnkgcmVmZXJlbmNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisKKyNpbmNsdWRlICJnaWFuZmFyLmgiCisKKyNkZWZpbmUgaXNfcG93ZXJfb2ZfMih4KSAgICAgICAgKCh4KSAhPSAwICYmICgoKHgpICYgKCh4KSAtIDEpKSA9PSAwKSkKKworZXh0ZXJuIGludCBzdGFydHVwX2dmYXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBzdG9wX2dmYXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBnZmFyX3JlY2VpdmUoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKK3ZvaWQgZ2Zhcl9maWxsX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3N0YXRzICpkdW1teSwKKwkJICAgICB1NjQgKiBidWYpOwordm9pZCBnZmFyX2dzdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICogYnVmKTsKK2ludCBnZmFyX2djb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqY3ZhbHMpOworaW50IGdmYXJfc2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjdmFscyk7Cit2b2lkIGdmYXJfZ3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJ2YWxzKTsKK2ludCBnZmFyX3NyaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpydmFscyk7Cit2b2lkIGdmYXJfZ2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbyk7CisKK3N0YXRpYyBjaGFyIHN0YXRfZ3N0cmluZ3NbXVtFVEhfR1NUUklOR19MRU5dID0geworCSJyeC1kcm9wcGVkLWJ5LWtlcm5lbCIsCisJInJ4LWxhcmdlLWZyYW1lLWVycm9ycyIsCisJInJ4LXNob3J0LWZyYW1lLWVycm9ycyIsCisJInJ4LW5vbi1vY3RldC1lcnJvcnMiLAorCSJyeC1jcmMtZXJyb3JzIiwKKwkicngtb3ZlcnJ1bi1lcnJvcnMiLAorCSJyeC1idXN5LWVycm9ycyIsCisJInJ4LWJhYmJsaW5nLWVycm9ycyIsCisJInJ4LXRydW5jYXRlZC1mcmFtZXMiLAorCSJldGhlcm5ldC1idXMtZXJyb3IiLAorCSJ0eC1iYWJibGluZy1lcnJvcnMiLAorCSJ0eC11bmRlcnJ1bi1lcnJvcnMiLAorCSJyeC1za2ItbWlzc2luZy1lcnJvcnMiLAorCSJ0eC10aW1lb3V0LWVycm9ycyIsCisJInR4LXJ4LTY0LWZyYW1lcyIsCisJInR4LXJ4LTY1LTEyNy1mcmFtZXMiLAorCSJ0eC1yeC0xMjgtMjU1LWZyYW1lcyIsCisJInR4LXJ4LTI1Ni01MTEtZnJhbWVzIiwKKwkidHgtcngtNTEyLTEwMjMtZnJhbWVzIiwKKwkidHgtcngtMTAyNC0xNTE4LWZyYW1lcyIsCisJInR4LXJ4LTE1MTktMTUyMi1nb29kLXZsYW4iLAorCSJyeC1ieXRlcyIsCisJInJ4LXBhY2tldHMiLAorCSJyeC1mY3MtZXJyb3JzIiwKKwkicmVjZWl2ZS1tdWx0aWNhc3QtcGFja2V0IiwKKwkicmVjZWl2ZS1icm9hZGNhc3QtcGFja2V0IiwKKwkicngtY29udHJvbC1mcmFtZS1wYWNrZXRzIiwKKwkicngtcGF1c2UtZnJhbWUtcGFja2V0cyIsCisJInJ4LXVua25vd24tb3AtY29kZSIsCisJInJ4LWFsaWdubWVudC1lcnJvciIsCisJInJ4LWZyYW1lLWxlbmd0aC1lcnJvciIsCisJInJ4LWNvZGUtZXJyb3IiLAorCSJyeC1jYXJyaWVyLXNlbnNlLWVycm9yIiwKKwkicngtdW5kZXJzaXplLXBhY2tldHMiLAorCSJyeC1vdmVyc2l6ZS1wYWNrZXRzIiwKKwkicngtZnJhZ21lbnRlZC1mcmFtZXMiLAorCSJyeC1qYWJiZXItZnJhbWVzIiwKKwkicngtZHJvcHBlZC1mcmFtZXMiLAorCSJ0eC1ieXRlLWNvdW50ZXIiLAorCSJ0eC1wYWNrZXRzIiwKKwkidHgtbXVsdGljYXN0LXBhY2tldHMiLAorCSJ0eC1icm9hZGNhc3QtcGFja2V0cyIsCisJInR4LXBhdXNlLWNvbnRyb2wtZnJhbWVzIiwKKwkidHgtZGVmZXJyYWwtcGFja2V0cyIsCisJInR4LWV4Y2Vzc2l2ZS1kZWZlcnJhbC1wYWNrZXRzIiwKKwkidHgtc2luZ2xlLWNvbGxpc2lvbi1wYWNrZXRzIiwKKwkidHgtbXVsdGlwbGUtY29sbGlzaW9uLXBhY2tldHMiLAorCSJ0eC1sYXRlLWNvbGxpc2lvbi1wYWNrZXRzIiwKKwkidHgtZXhjZXNzaXZlLWNvbGxpc2lvbi1wYWNrZXRzIiwKKwkidHgtdG90YWwtY29sbGlzaW9uIiwKKwkicmVzZXJ2ZWQiLAorCSJ0eC1kcm9wcGVkLWZyYW1lcyIsCisJInR4LWphYmJlci1mcmFtZXMiLAorCSJ0eC1mY3MtZXJyb3JzIiwKKwkidHgtY29udHJvbC1mcmFtZXMiLAorCSJ0eC1vdmVyc2l6ZS1mcmFtZXMiLAorCSJ0eC11bmRlcnNpemUtZnJhbWVzIiwKKwkidHgtZnJhZ21lbnRlZC1mcmFtZXMiLAorfTsKKworLyogRmlsbCBpbiBhbiBhcnJheSBvZiA2NC1iaXQgc3RhdGlzdGljcyBmcm9tIHZhcmlvdXMgc291cmNlcy4KKyAqIFRoaXMgYXJyYXkgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBldGh0b29sX3N0YXRzCisgKiBzdHJ1Y3R1cmUsIGFuZCByZXR1cm5lZCB0byB1c2VyIHNwYWNlCisgKi8KK3ZvaWQgZ2Zhcl9maWxsX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3N0YXRzICpkdW1teSwgdTY0ICogYnVmKQoreworCWludCBpOworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiAqcm1vbiA9ICh1MzIgKikgJiBwcml2LT5yZWdzLT5ybW9uOworCXU2NCAqZXh0cmEgPSAodTY0ICopICYgcHJpdi0+ZXh0cmFfc3RhdHM7CisJc3RydWN0IGdmYXJfc3RhdHMgKnN0YXRzID0gKHN0cnVjdCBnZmFyX3N0YXRzICopIGJ1ZjsKKworCWZvciAoaSA9IDA7IGkgPCBHRkFSX1JNT05fTEVOOyBpKyspIHsKKwkJc3RhdHMtPnJtb25baV0gPSAodTY0KSAocm1vbltpXSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEdGQVJfRVhUUkFfU1RBVFNfTEVOOyBpKyspIHsKKwkJc3RhdHMtPmV4dHJhW2ldID0gZXh0cmFbaV07CisJfQorfQorCisvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3RhdHMgKGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHN0cmluZ3MpICovCitpbnQgZ2Zhcl9zdGF0c19jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBHRkFSX1NUQVRTX0xFTjsKK30KKwordm9pZCBnZmFyX2dzdHJpbmdzX25vcm1vbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqIGJ1ZikKK3sKKwltZW1jcHkoYnVmLCBzdGF0X2dzdHJpbmdzLCBHRkFSX0VYVFJBX1NUQVRTX0xFTiAqIEVUSF9HU1RSSU5HX0xFTik7Cit9CisKK3ZvaWQgZ2Zhcl9maWxsX3N0YXRzX25vcm1vbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCAKKwkJc3RydWN0IGV0aHRvb2xfc3RhdHMgKmR1bW15LCB1NjQgKiBidWYpCit7CisJaW50IGk7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTY0ICpleHRyYSA9ICh1NjQgKikgJiBwcml2LT5leHRyYV9zdGF0czsKKworCWZvciAoaSA9IDA7IGkgPCBHRkFSX0VYVFJBX1NUQVRTX0xFTjsgaSsrKSB7CisJCWJ1ZltpXSA9IGV4dHJhW2ldOworCX0KK30KKworCitpbnQgZ2Zhcl9zdGF0c19jb3VudF9ub3Jtb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gR0ZBUl9FWFRSQV9TVEFUU19MRU47Cit9CisvKiBGaWxscyBpbiB0aGUgZHJ2aW5mbyBzdHJ1Y3R1cmUgd2l0aCBzb21lIGJhc2ljIGluZm8gKi8KK3ZvaWQgZ2Zhcl9nZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QKKwkgICAgICBldGh0b29sX2RydmluZm8gKmRydmluZm8pCit7CisJc3RybmNweShkcnZpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBHRkFSX0lORk9TVFJfTEVOKTsKKwlzdHJuY3B5KGRydmluZm8tPnZlcnNpb24sIGdmYXJfZHJpdmVyX3ZlcnNpb24sIEdGQVJfSU5GT1NUUl9MRU4pOworCXN0cm5jcHkoZHJ2aW5mby0+ZndfdmVyc2lvbiwgIk4vQSIsIEdGQVJfSU5GT1NUUl9MRU4pOworCXN0cm5jcHkoZHJ2aW5mby0+YnVzX2luZm8sICJOL0EiLCBHRkFSX0lORk9TVFJfTEVOKTsKKwlkcnZpbmZvLT5uX3N0YXRzID0gR0ZBUl9TVEFUU19MRU47CisJZHJ2aW5mby0+dGVzdGluZm9fbGVuID0gMDsKKwlkcnZpbmZvLT5yZWdkdW1wX2xlbiA9IDA7CisJZHJ2aW5mby0+ZWVkdW1wX2xlbiA9IDA7Cit9CisKKy8qIFJldHVybiB0aGUgY3VycmVudCBzZXR0aW5ncyBpbiB0aGUgZXRodG9vbF9jbWQgc3RydWN0dXJlICovCitpbnQgZ2Zhcl9nc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdWludCBnaWdhYml0X3N1cHBvcnQgPSAKKwkJcHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfR0lHQUJJVCA/CisJCQlTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgOiAwOworCXVpbnQgZ2lnYWJpdF9hZHZlcnQgPSAKKwkJcHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfR0lHQUJJVCA/CisJCQlBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsOiAwOworCisJY21kLT5zdXBwb3J0ZWQgPSAoU1VQUE9SVEVEXzEwYmFzZVRfSGFsZgorCQkJICB8IFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmCisJCQkgIHwgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwKKwkJCSAgfCBnaWdhYml0X3N1cHBvcnQgfCBTVVBQT1JURURfQXV0b25lZyk7CisKKwkvKiBGb3Igbm93LCB3ZSBhbHdheXMgYWR2ZXJ0aXNlIGV2ZXJ5dGhpbmcgKi8KKwljbWQtPmFkdmVydGlzaW5nID0gKEFEVkVSVElTRURfMTBiYXNlVF9IYWxmCisJCQkgICAgfCBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYKKwkJCSAgICB8IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbAorCQkJICAgIHwgZ2lnYWJpdF9hZHZlcnQgfCBBRFZFUlRJU0VEX0F1dG9uZWcpOworCisJY21kLT5zcGVlZCA9IHByaXYtPm1paV9pbmZvLT5zcGVlZDsKKwljbWQtPmR1cGxleCA9IHByaXYtPm1paV9pbmZvLT5kdXBsZXg7CisJY21kLT5wb3J0ID0gUE9SVF9NSUk7CisJY21kLT5waHlfYWRkcmVzcyA9IHByaXYtPm1paV9pbmZvLT5taWlfaWQ7CisJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CisJY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJY21kLT5tYXh0eHBrdCA9IHByaXYtPnR4Y291bnQ7CisJY21kLT5tYXhyeHBrdCA9IHByaXYtPnJ4Y291bnQ7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHN0cnVjdHVyZSAqLworaW50IGdmYXJfcmVnbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHNpemVvZiAoc3RydWN0IGdmYXIpOworfQorCisvKiBSZXR1cm4gYSBkdW1wIG9mIHRoZSBHRkFSIHJlZ2lzdGVyIHNwYWNlICovCit2b2lkIGdmYXJfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqcmVnYnVmKQoreworCWludCBpOworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiAqdGhlcmVncyA9ICh1MzIgKikgcHJpdi0+cmVnczsKKwl1MzIgKmJ1ZiA9ICh1MzIgKikgcmVnYnVmOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3RydWN0IGdmYXIpIC8gc2l6ZW9mICh1MzIpOyBpKyspCisJCWJ1ZltpXSA9IHRoZXJlZ3NbaV07Cit9CisKKy8qIEZpbGwgaW4gYSBidWZmZXIgd2l0aCB0aGUgc3RyaW5ncyB3aGljaCBjb3JyZXNwb25kIHRvIHRoZQorICogc3RhdHMgKi8KK3ZvaWQgZ2Zhcl9nc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqIGJ1ZikKK3sKKwltZW1jcHkoYnVmLCBzdGF0X2dzdHJpbmdzLCBHRkFSX1NUQVRTX0xFTiAqIEVUSF9HU1RSSU5HX0xFTik7Cit9CisKKy8qIENvbnZlcnQgbWljcm9zZWNvbmRzIHRvIGV0aGVybmV0IGNsb2NrIHRpY2tzLCB3aGljaCBjaGFuZ2VzCisgKiBkZXBlbmRpbmcgb24gd2hhdCBzcGVlZCB0aGUgY29udHJvbGxlciBpcyBydW5uaW5nIGF0ICovCitzdGF0aWMgdW5zaWduZWQgaW50IGdmYXJfdXNlY3MydGlja3Moc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiwgdW5zaWduZWQgaW50IHVzZWNzKQoreworCXVuc2lnbmVkIGludCBjb3VudDsKKworCS8qIFRoZSB0aW1lciBpcyBkaWZmZXJlbnQsIGRlcGVuZGluZyBvbiB0aGUgaW50ZXJmYWNlIHNwZWVkICovCisJc3dpdGNoIChwcml2LT5taWlfaW5mby0+c3BlZWQpIHsKKwljYXNlIDEwMDA6CisJCWNvdW50ID0gR0ZBUl9HQklUX1RJTUU7CisJCWJyZWFrOworCWNhc2UgMTAwOgorCQljb3VudCA9IEdGQVJfMTAwX1RJTUU7CisJCWJyZWFrOworCWNhc2UgMTA6CisJZGVmYXVsdDoKKwkJY291bnQgPSBHRkFSXzEwX1RJTUU7CisJCWJyZWFrOworCX0KKworCS8qIE1ha2Ugc3VyZSB3ZSByZXR1cm4gYSBudW1iZXIgZ3JlYXRlciB0aGFuIDAKKwkgKiBpZiB1c2VjcyA+IDAgKi8KKwlyZXR1cm4gKCh1c2VjcyAqIDEwMDAgKyBjb3VudCAtIDEpIC8gY291bnQpOworfQorCisvKiBDb252ZXJ0IGV0aGVybmV0IGNsb2NrIHRpY2tzIHRvIG1pY3Jvc2Vjb25kcyAqLworc3RhdGljIHVuc2lnbmVkIGludCBnZmFyX3RpY2tzMnVzZWNzKHN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYsIHVuc2lnbmVkIGludCB0aWNrcykKK3sKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisKKwkvKiBUaGUgdGltZXIgaXMgZGlmZmVyZW50LCBkZXBlbmRpbmcgb24gdGhlIGludGVyZmFjZSBzcGVlZCAqLworCXN3aXRjaCAocHJpdi0+bWlpX2luZm8tPnNwZWVkKSB7CisJY2FzZSAxMDAwOgorCQljb3VudCA9IEdGQVJfR0JJVF9USU1FOworCQlicmVhazsKKwljYXNlIDEwMDoKKwkJY291bnQgPSBHRkFSXzEwMF9USU1FOworCQlicmVhazsKKwljYXNlIDEwOgorCWRlZmF1bHQ6CisJCWNvdW50ID0gR0ZBUl8xMF9USU1FOworCQlicmVhazsKKwl9CisKKwkvKiBNYWtlIHN1cmUgd2UgcmV0dXJuIGEgbnVtYmVyIGdyZWF0ZXIgdGhhbiAwICovCisJLyogaWYgdGlja3MgaXMgPiAwICovCisJcmV0dXJuICgodGlja3MgKiBjb3VudCkgLyAxMDAwKTsKK30KKworLyogR2V0IHRoZSBjb2FsZXNjaW5nIHBhcmFtZXRlcnMsIGFuZCBwdXQgdGhlbSBpbiB0aGUgY3ZhbHMKKyAqIHN0cnVjdHVyZS4gICovCitpbnQgZ2Zhcl9nY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmN2YWxzKQoreworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJY3ZhbHMtPnJ4X2NvYWxlc2NlX3VzZWNzID0gZ2Zhcl90aWNrczJ1c2Vjcyhwcml2LCBwcml2LT5yeHRpbWUpOworCWN2YWxzLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9IHByaXYtPnJ4Y291bnQ7CisKKwljdmFscy0+dHhfY29hbGVzY2VfdXNlY3MgPSBnZmFyX3RpY2tzMnVzZWNzKHByaXYsIHByaXYtPnR4dGltZSk7CisJY3ZhbHMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzID0gcHJpdi0+dHhjb3VudDsKKworCWN2YWxzLT51c2VfYWRhcHRpdmVfcnhfY29hbGVzY2UgPSAwOworCWN2YWxzLT51c2VfYWRhcHRpdmVfdHhfY29hbGVzY2UgPSAwOworCisJY3ZhbHMtPnBrdF9yYXRlX2xvdyA9IDA7CisJY3ZhbHMtPnJ4X2NvYWxlc2NlX3VzZWNzX2xvdyA9IDA7CisJY3ZhbHMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2xvdyA9IDA7CisJY3ZhbHMtPnR4X2NvYWxlc2NlX3VzZWNzX2xvdyA9IDA7CisJY3ZhbHMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2xvdyA9IDA7CisKKwkvKiBXaGVuIHRoZSBwYWNrZXQgcmF0ZSBpcyBiZWxvdyBwa3RfcmF0ZV9oaWdoIGJ1dCBhYm92ZQorCSAqIHBrdF9yYXRlX2xvdyAoYm90aCBtZWFzdXJlZCBpbiBwYWNrZXRzIHBlciBzZWNvbmQpIHRoZQorCSAqIG5vcm1hbCB7cngsdHh9XyogY29hbGVzY2luZyBwYXJhbWV0ZXJzIGFyZSB1c2VkLgorCSAqLworCisJLyogV2hlbiB0aGUgcGFja2V0IHJhdGUgaXMgKG1lYXN1cmVkIGluIHBhY2tldHMgcGVyIHNlY29uZCkKKwkgKiBpcyBhYm92ZSBwa3RfcmF0ZV9oaWdoLCB0aGUge3J4LHR4fV8qX2hpZ2ggcGFyYW1ldGVycyBhcmUKKwkgKiB1c2VkLgorCSAqLworCWN2YWxzLT5wa3RfcmF0ZV9oaWdoID0gMDsKKwljdmFscy0+cnhfY29hbGVzY2VfdXNlY3NfaGlnaCA9IDA7CisJY3ZhbHMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2hpZ2ggPSAwOworCWN2YWxzLT50eF9jb2FsZXNjZV91c2Vjc19oaWdoID0gMDsKKwljdmFscy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaGlnaCA9IDA7CisKKwkvKiBIb3cgb2Z0ZW4gdG8gZG8gYWRhcHRpdmUgY29hbGVzY2luZyBwYWNrZXQgcmF0ZSBzYW1wbGluZywKKwkgKiBtZWFzdXJlZCBpbiBzZWNvbmRzLiAgTXVzdCBub3QgYmUgemVyby4KKwkgKi8KKwljdmFscy0+cmF0ZV9zYW1wbGVfaW50ZXJ2YWwgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENoYW5nZSB0aGUgY29hbGVzY2luZyB2YWx1ZXMuCisgKiBCb3RoIGN2YWxzLT4qX3VzZWNzIGFuZCBjdmFscy0+Kl9mcmFtZXMgaGF2ZSB0byBiZSA+IDAKKyAqIGluIG9yZGVyIGZvciBjb2FsZXNjaW5nIHRvIGJlIGFjdGl2ZQorICovCitpbnQgZ2Zhcl9zY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmN2YWxzKQoreworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogU2V0IHVwIHJ4IGNvYWxlc2NpbmcgKi8KKwlpZiAoKGN2YWxzLT5yeF9jb2FsZXNjZV91c2VjcyA9PSAwKSB8fAorCSAgICAoY3ZhbHMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID09IDApKQorCQlwcml2LT5yeGNvYWxlc2NpbmcgPSAwOworCWVsc2UKKwkJcHJpdi0+cnhjb2FsZXNjaW5nID0gMTsKKworCXByaXYtPnJ4dGltZSA9IGdmYXJfdXNlY3MydGlja3MocHJpdiwgY3ZhbHMtPnJ4X2NvYWxlc2NlX3VzZWNzKTsKKwlwcml2LT5yeGNvdW50ID0gY3ZhbHMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzOworCisJLyogU2V0IHVwIHR4IGNvYWxlc2NpbmcgKi8KKwlpZiAoKGN2YWxzLT50eF9jb2FsZXNjZV91c2VjcyA9PSAwKSB8fAorCSAgICAoY3ZhbHMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzID09IDApKQorCQlwcml2LT50eGNvYWxlc2NpbmcgPSAwOworCWVsc2UKKwkJcHJpdi0+dHhjb2FsZXNjaW5nID0gMTsKKworCXByaXYtPnR4dGltZSA9IGdmYXJfdXNlY3MydGlja3MocHJpdiwgY3ZhbHMtPnR4X2NvYWxlc2NlX3VzZWNzKTsKKwlwcml2LT50eGNvdW50ID0gY3ZhbHMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzOworCisJaWYgKHByaXYtPnJ4Y29hbGVzY2luZykKKwkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+cnhpYywKKwkJCSAgIG1rX2ljX3ZhbHVlKHByaXYtPnJ4Y291bnQsIHByaXYtPnJ4dGltZSkpOworCWVsc2UKKwkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+cnhpYywgMCk7CisKKwlpZiAocHJpdi0+dHhjb2FsZXNjaW5nKQorCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT50eGljLAorCQkJICAgbWtfaWNfdmFsdWUocHJpdi0+dHhjb3VudCwgcHJpdi0+dHh0aW1lKSk7CisJZWxzZQorCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT50eGljLCAwKTsKKworCXJldHVybiAwOworfQorCisvKiBGaWxscyBpbiBydmFscyB3aXRoIHRoZSBjdXJyZW50IHJpbmcgcGFyYW1ldGVycy4gIEN1cnJlbnRseSwKKyAqIHJ4LCByeF9taW5pLCBhbmQgcnhfanVtYm8gcmluZ3MgYXJlIHRoZSBzYW1lIHNpemUsIGFzIG1pbmkgYW5kCisgKiBqdW1ibyBhcmUgaWdub3JlZCBieSB0aGUgZHJpdmVyICovCit2b2lkIGdmYXJfZ3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJ2YWxzKQoreworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcnZhbHMtPnJ4X21heF9wZW5kaW5nID0gR0ZBUl9SWF9NQVhfUklOR19TSVpFOworCXJ2YWxzLT5yeF9taW5pX21heF9wZW5kaW5nID0gR0ZBUl9SWF9NQVhfUklOR19TSVpFOworCXJ2YWxzLT5yeF9qdW1ib19tYXhfcGVuZGluZyA9IEdGQVJfUlhfTUFYX1JJTkdfU0laRTsKKwlydmFscy0+dHhfbWF4X3BlbmRpbmcgPSBHRkFSX1RYX01BWF9SSU5HX1NJWkU7CisKKwkvKiBWYWx1ZXMgY2hhbmdlYWJsZSBieSB0aGUgdXNlci4gIFRoZSB2YWxpZCB2YWx1ZXMgYXJlCisJICogaW4gdGhlIHJhbmdlIDEgdG8gdGhlICIqX21heF9wZW5kaW5nIiBjb3VudGVycGFydCBhYm92ZS4KKwkgKi8KKwlydmFscy0+cnhfcGVuZGluZyA9IHByaXYtPnJ4X3Jpbmdfc2l6ZTsKKwlydmFscy0+cnhfbWluaV9wZW5kaW5nID0gcHJpdi0+cnhfcmluZ19zaXplOworCXJ2YWxzLT5yeF9qdW1ib19wZW5kaW5nID0gcHJpdi0+cnhfcmluZ19zaXplOworCXJ2YWxzLT50eF9wZW5kaW5nID0gcHJpdi0+dHhfcmluZ19zaXplOworfQorCisvKiBDaGFuZ2UgdGhlIGN1cnJlbnQgcmluZyBwYXJhbWV0ZXJzLCBzdG9wcGluZyB0aGUgY29udHJvbGxlciBpZgorICogbmVjZXNzYXJ5IHNvIHRoYXQgd2UgZG9uJ3QgbWVzcyB0aGluZ3MgdXAgd2hpbGUgd2UncmUgaW4KKyAqIG1vdGlvbi4gIFdlIHdhaXQgZm9yIHRoZSByaW5nIHRvIGJlIGNsZWFuIGJlZm9yZSByZWFsbG9jYXRpbmcKKyAqIHRoZSByaW5ncy4gKi8KK2ludCBnZmFyX3NyaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpydmFscykKK3sKKwl1MzIgdGVtcHZhbDsKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyID0gMDsKKworCWlmIChydmFscy0+cnhfcGVuZGluZyA+IEdGQVJfUlhfTUFYX1JJTkdfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWlzX3Bvd2VyX29mXzIocnZhbHMtPnJ4X3BlbmRpbmcpKSB7CisJCXByaW50aygiJXM6IFJpbmcgc2l6ZXMgbXVzdCBiZSBhIHBvd2VyIG9mIDJcbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHJ2YWxzLT50eF9wZW5kaW5nID4gR0ZBUl9UWF9NQVhfUklOR19TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghaXNfcG93ZXJfb2ZfMihydmFscy0+dHhfcGVuZGluZykpIHsKKwkJcHJpbnRrKCIlczogUmluZyBzaXplcyBtdXN0IGJlIGEgcG93ZXIgb2YgMlxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBTdG9wIHRoZSBjb250cm9sbGVyIHNvIHdlIGRvbid0IHJ4IGFueSBtb3JlIGZyYW1lcyAqLworCS8qIEJ1dCBmaXJzdCwgbWFrZSBzdXJlIHdlIGNsZWFyIHRoZSBiaXRzICovCisJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+ZG1hY3RybCk7CisJdGVtcHZhbCAmPSB+KERNQUNUUkxfR1JTIHwgRE1BQ1RSTF9HVFMpOworCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmRtYWN0cmwsIHRlbXB2YWwpOworCisJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+ZG1hY3RybCk7CisJdGVtcHZhbCB8PSAoRE1BQ1RSTF9HUlMgfCBETUFDVFJMX0dUUyk7CisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+ZG1hY3RybCwgdGVtcHZhbCk7CisKKwl3aGlsZSAoIShnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPmlldmVudCkgJiAoSUVWRU5UX0dSU0MgfCBJRVZFTlRfR1RTQykpKQorCQljcHVfcmVsYXgoKTsKKworCS8qIE5vdGUgdGhhdCByeCBpcyBub3QgY2xlYW4gcmlnaHQgbm93ICovCisJcHJpdi0+cnhjbGVhbiA9IDA7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9VUCkgeworCQkvKiBUZWxsIHRoZSBkcml2ZXIgdG8gcHJvY2VzcyB0aGUgcmVzdCBvZiB0aGUgZnJhbWVzICovCisJCWdmYXJfcmVjZWl2ZSgwLCAodm9pZCAqKSBkZXYsIE5VTEwpOworCisJCS8qIE5vdyB3YWl0IGZvciBpdCB0byBiZSBkb25lICovCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwcml2LT5yeGNsZWFudXBxLCBwcml2LT5yeGNsZWFuKTsKKworCQkvKiBPaywgYWxsIHBhY2tldHMgaGF2ZSBiZWVuIGhhbmRsZWQuICBOb3cgd2UgYnJpbmcgaXQgZG93biwKKwkJICogY2hhbmdlIHRoZSByaW5nIHNpemUsIGFuZCBicmluZyBpdCB1cCAqLworCisJCXN0b3BfZ2ZhcihkZXYpOworCX0KKworCXByaXYtPnJ4X3Jpbmdfc2l6ZSA9IHJ2YWxzLT5yeF9wZW5kaW5nOworCXByaXYtPnR4X3Jpbmdfc2l6ZSA9IHJ2YWxzLT50eF9wZW5kaW5nOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApCisJCWVyciA9IHN0YXJ0dXBfZ2ZhcihkZXYpOworCisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IGV0aHRvb2xfb3BzIGdmYXJfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncyA9IGdmYXJfZ3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbyA9IGdmYXJfZ2RydmluZm8sCisJLmdldF9yZWdzX2xlbiA9IGdmYXJfcmVnbGVuLAorCS5nZXRfcmVncyA9IGdmYXJfZ2V0X3JlZ3MsCisJLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X2NvYWxlc2NlID0gZ2Zhcl9nY29hbGVzY2UsCisJLnNldF9jb2FsZXNjZSA9IGdmYXJfc2NvYWxlc2NlLAorCS5nZXRfcmluZ3BhcmFtID0gZ2Zhcl9ncmluZ3BhcmFtLAorCS5zZXRfcmluZ3BhcmFtID0gZ2Zhcl9zcmluZ3BhcmFtLAorCS5nZXRfc3RyaW5ncyA9IGdmYXJfZ3N0cmluZ3MsCisJLmdldF9zdGF0c19jb3VudCA9IGdmYXJfc3RhdHNfY291bnQsCisJLmdldF9ldGh0b29sX3N0YXRzID0gZ2Zhcl9maWxsX3N0YXRzLAorfTsKKworc3RydWN0IGV0aHRvb2xfb3BzIGdmYXJfbm9ybW9uX25vY29hbGVzY2VfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncyA9IGdmYXJfZ3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbyA9IGdmYXJfZ2RydmluZm8sCisJLmdldF9yZWdzX2xlbiA9IGdmYXJfcmVnbGVuLAorCS5nZXRfcmVncyA9IGdmYXJfZ2V0X3JlZ3MsCisJLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X3JpbmdwYXJhbSA9IGdmYXJfZ3JpbmdwYXJhbSwKKwkuc2V0X3JpbmdwYXJhbSA9IGdmYXJfc3JpbmdwYXJhbSwKKwkuZ2V0X3N0cmluZ3MgPSBnZmFyX2dzdHJpbmdzX25vcm1vbiwKKwkuZ2V0X3N0YXRzX2NvdW50ID0gZ2Zhcl9zdGF0c19jb3VudF9ub3Jtb24sCisJLmdldF9ldGh0b29sX3N0YXRzID0gZ2Zhcl9maWxsX3N0YXRzX25vcm1vbiwKK307CisKK3N0cnVjdCBldGh0b29sX29wcyBnZmFyX25vY29hbGVzY2VfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncyA9IGdmYXJfZ3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbyA9IGdmYXJfZ2RydmluZm8sCisJLmdldF9yZWdzX2xlbiA9IGdmYXJfcmVnbGVuLAorCS5nZXRfcmVncyA9IGdmYXJfZ2V0X3JlZ3MsCisJLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X3JpbmdwYXJhbSA9IGdmYXJfZ3JpbmdwYXJhbSwKKwkuc2V0X3JpbmdwYXJhbSA9IGdmYXJfc3JpbmdwYXJhbSwKKwkuZ2V0X3N0cmluZ3MgPSBnZmFyX2dzdHJpbmdzLAorCS5nZXRfc3RhdHNfY291bnQgPSBnZmFyX3N0YXRzX2NvdW50LAorCS5nZXRfZXRodG9vbF9zdGF0cyA9IGdmYXJfZmlsbF9zdGF0cywKK307CisKK3N0cnVjdCBldGh0b29sX29wcyBnZmFyX25vcm1vbl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzID0gZ2Zhcl9nc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvID0gZ2Zhcl9nZHJ2aW5mbywKKwkuZ2V0X3JlZ3NfbGVuID0gZ2Zhcl9yZWdsZW4sCisJLmdldF9yZWdzID0gZ2Zhcl9nZXRfcmVncywKKwkuZ2V0X2xpbmsgPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfY29hbGVzY2UgPSBnZmFyX2djb2FsZXNjZSwKKwkuc2V0X2NvYWxlc2NlID0gZ2Zhcl9zY29hbGVzY2UsCisJLmdldF9yaW5ncGFyYW0gPSBnZmFyX2dyaW5ncGFyYW0sCisJLnNldF9yaW5ncGFyYW0gPSBnZmFyX3NyaW5ncGFyYW0sCisJLmdldF9zdHJpbmdzID0gZ2Zhcl9nc3RyaW5nc19ub3Jtb24sCisJLmdldF9zdGF0c19jb3VudCA9IGdmYXJfc3RhdHNfY291bnRfbm9ybW9uLAorCS5nZXRfZXRodG9vbF9zdGF0cyA9IGdmYXJfZmlsbF9zdGF0c19ub3Jtb24sCit9OworCitzdHJ1Y3QgZXRodG9vbF9vcHMgKmdmYXJfb3BfYXJyYXlbXSA9IHsKKwkmZ2Zhcl9ldGh0b29sX29wcywKKwkmZ2Zhcl9ub3Jtb25fZXRodG9vbF9vcHMsCisJJmdmYXJfbm9jb2FsZXNjZV9ldGh0b29sX29wcywKKwkmZ2Zhcl9ub3Jtb25fbm9jb2FsZXNjZV9ldGh0b29sX29wcworfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2dpYW5mYXJfcGh5LmMgYi9kcml2ZXJzL25ldC9naWFuZmFyX3BoeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYjE2YWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9naWFuZmFyX3BoeS5jCkBAIC0wLDAgKzEsNjYxIEBACisvKiAKKyAqIGRyaXZlcnMvbmV0L2dpYW5mYXJfcGh5LmMKKyAqCisgKiBHaWFuZmFyIEV0aGVybmV0IERyaXZlciAtLSBQSFkgaGFuZGxpbmcKKyAqIERyaXZlciBmb3IgRkVDIG9uIE1QQzg1NDAgYW5kIFRTRUMgb24gTVBDODU0MC9NUEM4NTYwCisgKiBCYXNlZCBvbiA4MjYwX2lvL2ZjY19lbmV0LmMKKyAqCisgKiBBdXRob3I6IEFuZHkgRmxlbWluZworICogTWFpbnRhaW5lcjogS3VtYXIgR2FsYSAoa3VtYXIuZ2FsYUBmcmVlc2NhbGUuY29tKQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKworI2luY2x1ZGUgImdpYW5mYXIuaCIKKyNpbmNsdWRlICJnaWFuZmFyX3BoeS5oIgorCitzdGF0aWMgdm9pZCBjb25maWdfZ2VubWlpX2FkdmVydChzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pOworc3RhdGljIHZvaWQgZ2VubWlpX3NldHVwX2ZvcmNlZChzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pOworc3RhdGljIHZvaWQgZ2VubWlpX3Jlc3RhcnRfYW5lZyhzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pOworc3RhdGljIGludCBnYml0X2NvbmZpZ19hbmVnKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbyk7CitzdGF0aWMgaW50IGdlbm1paV9jb25maWdfYW5lZyhzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pOworc3RhdGljIGludCBnZW5taWlfdXBkYXRlX2xpbmsoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvKTsKK3N0YXRpYyBpbnQgZ2VubWlpX3JlYWRfc3RhdHVzKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbyk7Cit1MTYgcGh5X3JlYWQoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvLCB1MTYgcmVnbnVtKTsKK3ZvaWQgcGh5X3dyaXRlKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbywgdTE2IHJlZ251bSwgdTE2IHZhbCk7CisKKy8qIFdyaXRlIHZhbHVlIHRvIHRoZSBQSFkgZm9yIHRoaXMgZGV2aWNlIHRvIHRoZSByZWdpc3RlciBhdCByZWdudW0sICovCisvKiB3YWl0aW5nIHVudGlsIHRoZSB3cml0ZSBpcyBkb25lIGJlZm9yZSBpdCByZXR1cm5zLiAgQWxsIFBIWSAqLworLyogY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgZG9uZSB0aHJvdWdoIHRoZSBUU0VDMSBNSUlNIHJlZ3MgKi8KK3ZvaWQgd3JpdGVfcGh5X3JlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnbnVtLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGdmYXIgKnJlZ2Jhc2UgPSBwcml2LT5waHlyZWdzOworCisJLyogU2V0IHRoZSBQSFkgYWRkcmVzcyBhbmQgdGhlIHJlZ2lzdGVyIGFkZHJlc3Mgd2Ugd2FudCB0byB3cml0ZSAqLworCWdmYXJfd3JpdGUoJnJlZ2Jhc2UtPm1paW1hZGQsIChtaWlfaWQgPDwgOCkgfCByZWdudW0pOworCisJLyogV3JpdGUgb3V0IHRoZSB2YWx1ZSB3ZSB3YW50ICovCisJZ2Zhcl93cml0ZSgmcmVnYmFzZS0+bWlpbWNvbiwgdmFsdWUpOworCisJLyogV2FpdCBmb3IgdGhlIHRyYW5zYWN0aW9uIHRvIGZpbmlzaCAqLworCXdoaWxlIChnZmFyX3JlYWQoJnJlZ2Jhc2UtPm1paW1pbmQpICYgTUlJTUlORF9CVVNZKQorCQljcHVfcmVsYXgoKTsKK30KKworLyogUmVhZHMgZnJvbSByZWdpc3RlciByZWdudW0gaW4gdGhlIFBIWSBmb3IgZGV2aWNlIGRldiwgKi8KKy8qIHJldHVybmluZyB0aGUgdmFsdWUuICBDbGVhcnMgbWlpbWNvbSBmaXJzdC4gIEFsbCBQSFkgKi8KKy8qIGNvbmZpZ3VyYXRpb24gaGFzIHRvIGJlIGRvbmUgdGhyb3VnaCB0aGUgVFNFQzEgTUlJTSByZWdzICovCitpbnQgcmVhZF9waHlfcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtaWlfaWQsIGludCByZWdudW0pCit7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGdmYXIgKnJlZ2Jhc2UgPSBwcml2LT5waHlyZWdzOworCXUxNiB2YWx1ZTsKKworCS8qIFNldCB0aGUgUEhZIGFkZHJlc3MgYW5kIHRoZSByZWdpc3RlciBhZGRyZXNzIHdlIHdhbnQgdG8gcmVhZCAqLworCWdmYXJfd3JpdGUoJnJlZ2Jhc2UtPm1paW1hZGQsIChtaWlfaWQgPDwgOCkgfCByZWdudW0pOworCisJLyogQ2xlYXIgbWlpbWNvbSwgYW5kIHRoZW4gaW5pdGlhdGUgYSByZWFkICovCisJZ2Zhcl93cml0ZSgmcmVnYmFzZS0+bWlpbWNvbSwgMCk7CisJZ2Zhcl93cml0ZSgmcmVnYmFzZS0+bWlpbWNvbSwgTUlJX1JFQURfQ09NTUFORCk7CisKKwkvKiBXYWl0IGZvciB0aGUgdHJhbnNhY3Rpb24gdG8gZmluaXNoICovCisJd2hpbGUgKGdmYXJfcmVhZCgmcmVnYmFzZS0+bWlpbWluZCkgJiAoTUlJTUlORF9OT1RWQUxJRCB8IE1JSU1JTkRfQlVTWSkpCisJCWNwdV9yZWxheCgpOworCisJLyogR3JhYiB0aGUgdmFsdWUgb2YgdGhlIHJlZ2lzdGVyIGZyb20gbWlpbXN0YXQgKi8KKwl2YWx1ZSA9IGdmYXJfcmVhZCgmcmVnYmFzZS0+bWlpbXN0YXQpOworCisJcmV0dXJuIHZhbHVlOworfQorCit2b2lkIG1paV9jbGVhcl9waHlfaW50ZXJydXB0KHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbykKK3sKKwlpZihtaWlfaW5mby0+cGh5aW5mby0+YWNrX2ludGVycnVwdCkKKwkJbWlpX2luZm8tPnBoeWluZm8tPmFja19pbnRlcnJ1cHQobWlpX2luZm8pOworfQorCisKK3ZvaWQgbWlpX2NvbmZpZ3VyZV9waHlfaW50ZXJydXB0KHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbywgdTMyIGludGVycnVwdHMpCit7CisJbWlpX2luZm8tPmludGVycnVwdHMgPSBpbnRlcnJ1cHRzOworCWlmKG1paV9pbmZvLT5waHlpbmZvLT5jb25maWdfaW50cikKKwkJbWlpX2luZm8tPnBoeWluZm8tPmNvbmZpZ19pbnRyKG1paV9pbmZvKTsKK30KKworCisvKiBXcml0ZXMgTUlJX0FEVkVSVElTRSB3aXRoIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMsIGFmdGVyCisgKiBzYW5pdGl6aW5nIGFkdmVydGlzZSB0byBtYWtlIHN1cmUgb25seSBzdXBwb3J0ZWQgZmVhdHVyZXMKKyAqIGFyZSBhZHZlcnRpc2VkIAorICovCitzdGF0aWMgdm9pZCBjb25maWdfZ2VubWlpX2FkdmVydChzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pCit7CisJdTMyIGFkdmVydGlzZTsKKwl1MTYgYWR2OworCisJLyogT25seSBhbGxvdyBhZHZlcnRpc2luZyB3aGF0IHRoaXMgUEhZIHN1cHBvcnRzICovCisJbWlpX2luZm8tPmFkdmVydGlzaW5nICY9IG1paV9pbmZvLT5waHlpbmZvLT5mZWF0dXJlczsKKwlhZHZlcnRpc2UgPSBtaWlfaW5mby0+YWR2ZXJ0aXNpbmc7CisKKwkvKiBTZXR1cCBzdGFuZGFyZCBhZHZlcnRpc2VtZW50ICovCisJYWR2ID0gcGh5X3JlYWQobWlpX2luZm8sIE1JSV9BRFZFUlRJU0UpOworCWFkdiAmPSB+KEFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfMTAwQkFTRTQpOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikKKwkJYWR2IHw9IEFEVkVSVElTRV8xMEhBTEY7CisJaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsKQorCQlhZHYgfD0gQURWRVJUSVNFXzEwRlVMTDsKKwlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmKQorCQlhZHYgfD0gQURWRVJUSVNFXzEwMEhBTEY7CisJaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCkKKwkJYWR2IHw9IEFEVkVSVElTRV8xMDBGVUxMOworCXBoeV93cml0ZShtaWlfaW5mbywgTUlJX0FEVkVSVElTRSwgYWR2KTsKK30KKworc3RhdGljIHZvaWQgZ2VubWlpX3NldHVwX2ZvcmNlZChzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pCit7CisJdTE2IGN0cmw7CisJdTMyIGZlYXR1cmVzID0gbWlpX2luZm8tPnBoeWluZm8tPmZlYXR1cmVzOworCQorCWN0cmwgPSBwaHlfcmVhZChtaWlfaW5mbywgTUlJX0JNQ1IpOworCisJY3RybCAmPSB+KEJNQ1JfRlVMTERQTFh8Qk1DUl9TUEVFRDEwMHxCTUNSX1NQRUVEMTAwMHxCTUNSX0FORU5BQkxFKTsKKwljdHJsIHw9IEJNQ1JfUkVTRVQ7CisKKwlzd2l0Y2gobWlpX2luZm8tPnNwZWVkKSB7CisJCWNhc2UgU1BFRURfMTAwMDoKKwkJCWlmKGZlYXR1cmVzICYgKFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZgorCQkJCQkJfCBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpKSB7CisJCQkJY3RybCB8PSBCTUNSX1NQRUVEMTAwMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW1paV9pbmZvLT5zcGVlZCA9IFNQRUVEXzEwMDsKKwkJY2FzZSBTUEVFRF8xMDA6CisJCQlpZiAoZmVhdHVyZXMgJiAoU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYKKwkJCQkJCXwgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwpKSB7CisJCQkJY3RybCB8PSBCTUNSX1NQRUVEMTAwOworCQkJCWJyZWFrOworCQkJfQorCQkJbWlpX2luZm8tPnNwZWVkID0gU1BFRURfMTA7CisJCWNhc2UgU1BFRURfMTA6CisJCQlpZiAoZmVhdHVyZXMgJiAoU1VQUE9SVEVEXzEwYmFzZVRfSGFsZgorCQkJCQkJfCBTVVBQT1JURURfMTBiYXNlVF9GdWxsKSkKKwkJCQlicmVhazsKKwkJZGVmYXVsdDogLyogVW5zdXBwb3J0ZWQgc3BlZWQhICovCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBCYWQgc3BlZWQhXG4iLCAKKwkJCQkJbWlpX2luZm8tPmRldi0+bmFtZSk7CisJCQlicmVhazsKKwl9CisKKwlwaHlfd3JpdGUobWlpX2luZm8sIE1JSV9CTUNSLCBjdHJsKTsKK30KKworCisvKiBFbmFibGUgYW5kIFJlc3RhcnQgQXV0b25lZ290aWF0aW9uICovCitzdGF0aWMgdm9pZCBnZW5taWlfcmVzdGFydF9hbmVnKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbykKK3sKKwl1MTYgY3RsOworCisJY3RsID0gcGh5X3JlYWQobWlpX2luZm8sIE1JSV9CTUNSKTsKKwljdGwgfD0gKEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVCk7CisJcGh5X3dyaXRlKG1paV9pbmZvLCBNSUlfQk1DUiwgY3RsKTsKK30KKworCitzdGF0aWMgaW50IGdiaXRfY29uZmlnX2FuZWcoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvKQoreworCXUxNiBhZHY7CisJdTMyIGFkdmVydGlzZTsKKworCWlmKG1paV9pbmZvLT5hdXRvbmVnKSB7CisJCS8qIENvbmZpZ3VyZSB0aGUgQURWRVJUSVNFIHJlZ2lzdGVyICovCisJCWNvbmZpZ19nZW5taWlfYWR2ZXJ0KG1paV9pbmZvKTsKKwkJYWR2ZXJ0aXNlID0gbWlpX2luZm8tPmFkdmVydGlzaW5nOworCisJCWFkdiA9IHBoeV9yZWFkKG1paV9pbmZvLCBNSUlfMTAwMEJBU0VUQ09OVFJPTCk7CisJCWFkdiAmPSB+KE1JSV8xMDAwQkFTRVRDT05UUk9MX0ZVTExEVVBMRVhDQVAgfAorCQkJCU1JSV8xMDAwQkFTRVRDT05UUk9MX0hBTEZEVVBMRVhDQVApOworCQlpZiAoYWR2ZXJ0aXNlICYgU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmKQorCQkJYWR2IHw9IE1JSV8xMDAwQkFTRVRDT05UUk9MX0hBTEZEVVBMRVhDQVA7CisJCWlmIChhZHZlcnRpc2UgJiBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpCisJCQlhZHYgfD0gTUlJXzEwMDBCQVNFVENPTlRST0xfRlVMTERVUExFWENBUDsKKwkJcGh5X3dyaXRlKG1paV9pbmZvLCBNSUlfMTAwMEJBU0VUQ09OVFJPTCwgYWR2KTsKKworCQkvKiBTdGFydC9SZXN0YXJ0IGFuZWcgKi8KKwkJZ2VubWlpX3Jlc3RhcnRfYW5lZyhtaWlfaW5mbyk7CisJfSBlbHNlCisJCWdlbm1paV9zZXR1cF9mb3JjZWQobWlpX2luZm8pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFydmVsbF9jb25maWdfYW5lZyhzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pCit7CisJLyogVGhlIE1hcnZlbGwgUEhZIGhhcyBhbiBlcnJhdGEgd2hpY2ggcmVxdWlyZXMKKwkgKiB0aGF0IGNlcnRhaW4gcmVnaXN0ZXJzIGdldCB3cml0dGVuIGluIG9yZGVyCisJICogdG8gcmVzdGFydCBhdXRvbmVnb3RpYXRpb24gKi8KKwlwaHlfd3JpdGUobWlpX2luZm8sIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKKworCXBoeV93cml0ZShtaWlfaW5mbywgMHgxZCwgMHgxZik7CisJcGh5X3dyaXRlKG1paV9pbmZvLCAweDFlLCAweDIwMGMpOworCXBoeV93cml0ZShtaWlfaW5mbywgMHgxZCwgMHg1KTsKKwlwaHlfd3JpdGUobWlpX2luZm8sIDB4MWUsIDApOworCXBoeV93cml0ZShtaWlfaW5mbywgMHgxZSwgMHgxMDApOworCisJZ2JpdF9jb25maWdfYW5lZyhtaWlfaW5mbyk7CisKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgZ2VubWlpX2NvbmZpZ19hbmVnKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbykKK3sKKwlpZiAobWlpX2luZm8tPmF1dG9uZWcpIHsKKwkJY29uZmlnX2dlbm1paV9hZHZlcnQobWlpX2luZm8pOworCQlnZW5taWlfcmVzdGFydF9hbmVnKG1paV9pbmZvKTsKKwl9IGVsc2UKKwkJZ2VubWlpX3NldHVwX2ZvcmNlZChtaWlfaW5mbyk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGdlbm1paV91cGRhdGVfbGluayhzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pCit7CisJdTE2IHN0YXR1czsKKworCS8qIERvIGEgZmFrZSByZWFkICovCisJcGh5X3JlYWQobWlpX2luZm8sIE1JSV9CTVNSKTsKKworCS8qIFJlYWQgbGluayBhbmQgYXV0b25lZ290aWF0aW9uIHN0YXR1cyAqLworCXN0YXR1cyA9IHBoeV9yZWFkKG1paV9pbmZvLCBNSUlfQk1TUik7CisJaWYgKChzdGF0dXMgJiBCTVNSX0xTVEFUVVMpID09IDApCisJCW1paV9pbmZvLT5saW5rID0gMDsKKwllbHNlCisJCW1paV9pbmZvLT5saW5rID0gMTsKKworCS8qIElmIHdlIGFyZSBhdXRvbmVnb3RpYXRpbmcsIGFuZCBub3QgZG9uZSwgCisJICogcmV0dXJuIGFuIGVycm9yICovCisJaWYgKG1paV9pbmZvLT5hdXRvbmVnICYmICEoc3RhdHVzICYgQk1TUl9BTkVHQ09NUExFVEUpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbm1paV9yZWFkX3N0YXR1cyhzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pCit7CisJdTE2IHN0YXR1czsKKwlpbnQgZXJyOworCisJLyogVXBkYXRlIHRoZSBsaW5rLCBidXQgcmV0dXJuIGlmIHRoZXJlCisJICogd2FzIGFuIGVycm9yICovCisJZXJyID0gZ2VubWlpX3VwZGF0ZV9saW5rKG1paV9pbmZvKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKG1paV9pbmZvLT5hdXRvbmVnKSB7CisJCXN0YXR1cyA9IHBoeV9yZWFkKG1paV9pbmZvLCBNSUlfTFBBKTsKKworCQlpZiAoc3RhdHVzICYgKExQQV8xMEZVTEwgfCBMUEFfMTAwRlVMTCkpCisJCQltaWlfaW5mby0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCWVsc2UKKwkJCW1paV9pbmZvLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwkJaWYgKHN0YXR1cyAmIChMUEFfMTAwRlVMTCB8IExQQV8xMDBIQUxGKSkKKwkJCW1paV9pbmZvLT5zcGVlZCA9IFNQRUVEXzEwMDsKKwkJZWxzZQorCQkJbWlpX2luZm8tPnNwZWVkID0gU1BFRURfMTA7CisJCW1paV9pbmZvLT5wYXVzZSA9IDA7CisJfQorCS8qIE9uIG5vbi1hbmVnLCB3ZSBhc3N1bWUgd2hhdCB3ZSBwdXQgaW4gQk1DUiBpcyB0aGUgc3BlZWQsCisJICogdGhvdWdoIG1hZ2ljLWFuZWcgc2hvdWxkbid0IHByZXZlbnQgdGhpcyBjYXNlIGZyb20gb2NjdXJyaW5nCisJICovCisKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgbWFydmVsbF9yZWFkX3N0YXR1cyhzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pCit7CisJdTE2IHN0YXR1czsKKwlpbnQgZXJyOworCisJLyogVXBkYXRlIHRoZSBsaW5rLCBidXQgcmV0dXJuIGlmIHRoZXJlCisJICogd2FzIGFuIGVycm9yICovCisJZXJyID0gZ2VubWlpX3VwZGF0ZV9saW5rKG1paV9pbmZvKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogSWYgdGhlIGxpbmsgaXMgdXAsIHJlYWQgdGhlIHNwZWVkIGFuZCBkdXBsZXggKi8KKwkvKiBJZiB3ZSBhcmVuJ3QgYXV0b25lZ290aWF0aW5nLCBhc3N1bWUgc3BlZWRzIAorCSAqIGFyZSBhcyBzZXQgKi8KKwlpZiAobWlpX2luZm8tPmF1dG9uZWcgJiYgbWlpX2luZm8tPmxpbmspIHsKKwkJaW50IHNwZWVkOworCQlzdGF0dXMgPSBwaHlfcmVhZChtaWlfaW5mbywgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVUyk7CisKKyNpZiAwCisJCS8qIElmIHNwZWVkIGFuZCBkdXBsZXggYXJlbid0IHJlc29sdmVkLAorCQkgKiByZXR1cm4gYW4gZXJyb3IuICBJc24ndCB0aGlzIGhhbmRsZWQKKwkJICogYnkgY2hlY2tpbmcgYW5lZz8KKwkJICovCisJCWlmICgoc3RhdHVzICYgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVU19SRVNPTFZFRCkgPT0gMCkKKwkJCXJldHVybiAtRUFHQUlOOworI2VuZGlmCisKKwkJLyogR2V0IHRoZSBkdXBsZXhpdHkgKi8KKwkJaWYgKHN0YXR1cyAmIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVNfRlVMTERVUExFWCkKKwkJCW1paV9pbmZvLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJZWxzZQorCQkJbWlpX2luZm8tPmR1cGxleCA9IERVUExFWF9IQUxGOworCisJCS8qIEdldCB0aGUgc3BlZWQgKi8KKwkJc3BlZWQgPSBzdGF0dXMgJiBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTX1NQRF9NQVNLOworCQlzd2l0Y2goc3BlZWQpIHsKKwkJCWNhc2UgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVU18xMDAwOgorCQkJCW1paV9pbmZvLT5zcGVlZCA9IFNQRUVEXzEwMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVNfMTAwOgorCQkJCW1paV9pbmZvLT5zcGVlZCA9IFNQRUVEXzEwMDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJbWlpX2luZm8tPnNwZWVkID0gU1BFRURfMTA7CisJCQkJYnJlYWs7CisJCX0KKwkJbWlpX2luZm8tPnBhdXNlID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGNpczgyMHhfcmVhZF9zdGF0dXMoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvKQoreworCXUxNiBzdGF0dXM7CisJaW50IGVycjsKKworCS8qIFVwZGF0ZSB0aGUgbGluaywgYnV0IHJldHVybiBpZiB0aGVyZQorCSAqIHdhcyBhbiBlcnJvciAqLworCWVyciA9IGdlbm1paV91cGRhdGVfbGluayhtaWlfaW5mbyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIElmIHRoZSBsaW5rIGlzIHVwLCByZWFkIHRoZSBzcGVlZCBhbmQgZHVwbGV4ICovCisJLyogSWYgd2UgYXJlbid0IGF1dG9uZWdvdGlhdGluZywgYXNzdW1lIHNwZWVkcyAKKwkgKiBhcmUgYXMgc2V0ICovCisJaWYgKG1paV9pbmZvLT5hdXRvbmVnICYmIG1paV9pbmZvLT5saW5rKSB7CisJCWludCBzcGVlZDsKKworCQlzdGF0dXMgPSBwaHlfcmVhZChtaWlfaW5mbywgTUlJX0NJUzgyMDFfQVVYX0NPTlNUQVQpOworCQlpZiAoc3RhdHVzICYgTUlJX0NJUzgyMDFfQVVYQ09OU1RBVF9EVVBMRVgpCisJCQltaWlfaW5mby0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCWVsc2UKKwkJCW1paV9pbmZvLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKworCQlzcGVlZCA9IHN0YXR1cyAmIE1JSV9DSVM4MjAxX0FVWENPTlNUQVRfU1BFRUQ7CisKKwkJc3dpdGNoIChzcGVlZCkgeworCQljYXNlIE1JSV9DSVM4MjAxX0FVWENPTlNUQVRfR0JJVDoKKwkJCW1paV9pbmZvLT5zcGVlZCA9IFNQRUVEXzEwMDA7CisJCQlicmVhazsKKwkJY2FzZSBNSUlfQ0lTODIwMV9BVVhDT05TVEFUXzEwMDoKKwkJCW1paV9pbmZvLT5zcGVlZCA9IFNQRUVEXzEwMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbWlpX2luZm8tPnNwZWVkID0gU1BFRURfMTA7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hcnZlbGxfYWNrX2ludGVycnVwdChzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pCit7CisJLyogQ2xlYXIgdGhlIGludGVycnVwdHMgYnkgcmVhZGluZyB0aGUgcmVnICovCisJcGh5X3JlYWQobWlpX2luZm8sIE1JSV9NMTAxMV9JRVZFTlQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFydmVsbF9jb25maWdfaW50cihzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pCit7CisJaWYobWlpX2luZm8tPmludGVycnVwdHMgPT0gTUlJX0lOVEVSUlVQVF9FTkFCTEVEKQorCQlwaHlfd3JpdGUobWlpX2luZm8sIE1JSV9NMTAxMV9JTUFTSywgTUlJX00xMDExX0lNQVNLX0lOSVQpOworCWVsc2UKKwkJcGh5X3dyaXRlKG1paV9pbmZvLCBNSUlfTTEwMTFfSU1BU0ssIE1JSV9NMTAxMV9JTUFTS19DTEVBUik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaXM4MjB4X2luaXQoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvKQoreworCXBoeV93cml0ZShtaWlfaW5mbywgTUlJX0NJUzgyMDFfQVVYX0NPTlNUQVQsIAorCQkJTUlJX0NJUzgyMDFfQVVYQ09OU1RBVF9JTklUKTsKKwlwaHlfd3JpdGUobWlpX2luZm8sIE1JSV9DSVM4MjAxX0VYVF9DT04xLAorCQkJTUlJX0NJUzgyMDFfRVhUQ09OMV9JTklUKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNpczgyMHhfYWNrX2ludGVycnVwdChzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pCit7CisJcGh5X3JlYWQobWlpX2luZm8sIE1JSV9DSVM4MjAxX0lTVEFUKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNpczgyMHhfY29uZmlnX2ludHIoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvKQoreworCWlmKG1paV9pbmZvLT5pbnRlcnJ1cHRzID09IE1JSV9JTlRFUlJVUFRfRU5BQkxFRCkKKwkJcGh5X3dyaXRlKG1paV9pbmZvLCBNSUlfQ0lTODIwMV9JTUFTSywgTUlJX0NJUzgyMDFfSU1BU0tfTUFTSyk7CisJZWxzZQorCQlwaHlfd3JpdGUobWlpX2luZm8sIE1JSV9DSVM4MjAxX0lNQVNLLCAwKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIERNOTE2MV9ERUxBWSAxMAorCitzdGF0aWMgaW50IGRtOTE2MV9yZWFkX3N0YXR1cyhzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pCit7CisJdTE2IHN0YXR1czsKKwlpbnQgZXJyOworCisJLyogVXBkYXRlIHRoZSBsaW5rLCBidXQgcmV0dXJuIGlmIHRoZXJlCisJICogd2FzIGFuIGVycm9yICovCisJZXJyID0gZ2VubWlpX3VwZGF0ZV9saW5rKG1paV9pbmZvKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogSWYgdGhlIGxpbmsgaXMgdXAsIHJlYWQgdGhlIHNwZWVkIGFuZCBkdXBsZXggKi8KKwkvKiBJZiB3ZSBhcmVuJ3QgYXV0b25lZ290aWF0aW5nLCBhc3N1bWUgc3BlZWRzIAorCSAqIGFyZSBhcyBzZXQgKi8KKwlpZiAobWlpX2luZm8tPmF1dG9uZWcgJiYgbWlpX2luZm8tPmxpbmspIHsKKwkJc3RhdHVzID0gcGh5X3JlYWQobWlpX2luZm8sIE1JSV9ETTkxNjFfU0NTUik7CisJCWlmIChzdGF0dXMgJiAoTUlJX0RNOTE2MV9TQ1NSXzEwMEYgfCBNSUlfRE05MTYxX1NDU1JfMTAwSCkpCisJCQltaWlfaW5mby0+c3BlZWQgPSBTUEVFRF8xMDA7CisJCWVsc2UKKwkJCW1paV9pbmZvLT5zcGVlZCA9IFNQRUVEXzEwOworCisJCWlmIChzdGF0dXMgJiAoTUlJX0RNOTE2MV9TQ1NSXzEwMEYgfCBNSUlfRE05MTYxX1NDU1JfMTBGKSkKKwkJCW1paV9pbmZvLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJZWxzZQorCQkJbWlpX2luZm8tPmR1cGxleCA9IERVUExFWF9IQUxGOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZG05MTYxX2NvbmZpZ19hbmVnKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbykKK3sKKwlzdHJ1Y3QgZG05MTYxX3ByaXZhdGUgKnByaXYgPSBtaWlfaW5mby0+cHJpdjsKKworCWlmKDAgPT0gcHJpdi0+cmVzZXRkb25lKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkbTkxNjFfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbyA9IChzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqKWRhdGE7CisJc3RydWN0IGRtOTE2MV9wcml2YXRlICpwcml2ID0gbWlpX2luZm8tPnByaXY7CisJdTE2IHN0YXR1cyA9IHBoeV9yZWFkKG1paV9pbmZvLCBNSUlfQk1TUik7CisKKwlpZiAoc3RhdHVzICYgQk1TUl9BTkVHQ09NUExFVEUpIHsKKwkJcHJpdi0+cmVzZXRkb25lID0gMTsKKwl9IGVsc2UKKwkJbW9kX3RpbWVyKCZwcml2LT50aW1lciwgamlmZmllcyArIERNOTE2MV9ERUxBWSAqIEhaKTsKK30KKworc3RhdGljIGludCBkbTkxNjFfaW5pdChzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pCit7CisJc3RydWN0IGRtOTE2MV9wcml2YXRlICpwcml2OworCisJLyogQWxsb2NhdGUgdGhlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KKwlwcml2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRtOTE2MV9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoTlVMTCA9PSBwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1paV9pbmZvLT5wcml2ID0gcHJpdjsKKworCS8qIFJlc2V0IGlzIG5vdCBkb25lIHlldCAqLworCXByaXYtPnJlc2V0ZG9uZSA9IDA7CisKKwkvKiBJc29sYXRlIHRoZSBQSFkgKi8KKwlwaHlfd3JpdGUobWlpX2luZm8sIE1JSV9CTUNSLCBCTUNSX0lTT0xBVEUpOworCisJLyogRG8gbm90IGJ5cGFzcyB0aGUgc2NyYW1ibGVyL2Rlc2NyYW1ibGVyICovCisJcGh5X3dyaXRlKG1paV9pbmZvLCBNSUlfRE05MTYxX1NDUiwgTUlJX0RNOTE2MV9TQ1JfSU5JVCk7CisKKwkvKiBDbGVhciAxMEJUQ1NSIHRvIGRlZmF1bHQgKi8KKwlwaHlfd3JpdGUobWlpX2luZm8sIE1JSV9ETTkxNjFfMTBCVENTUiwgTUlJX0RNOTE2MV8xMEJUQ1NSX0lOSVQpOworCisJLyogUmVjb25uZWN0IHRoZSBQSFksIGFuZCBlbmFibGUgQXV0b25lZ290aWF0aW9uICovCisJcGh5X3dyaXRlKG1paV9pbmZvLCBNSUlfQk1DUiwgQk1DUl9BTkVOQUJMRSk7CisKKwkvKiBTdGFydCBhIHRpbWVyIGZvciBETTkxNjFfREVMQVkgc2Vjb25kcyB0byB3YWl0CisJICogZm9yIHRoZSBQSFkgdG8gYmUgcmVhZHkgKi8KKwlpbml0X3RpbWVyKCZwcml2LT50aW1lcik7CisJcHJpdi0+dGltZXIuZnVuY3Rpb24gPSAmZG05MTYxX3RpbWVyOworCXByaXYtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgbWlpX2luZm87CisJbW9kX3RpbWVyKCZwcml2LT50aW1lciwgamlmZmllcyArIERNOTE2MV9ERUxBWSAqIEhaKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkbTkxNjFfY2xvc2Uoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvKQoreworCXN0cnVjdCBkbTkxNjFfcHJpdmF0ZSAqcHJpdiA9IG1paV9pbmZvLT5wcml2OworCisJZGVsX3RpbWVyX3N5bmMoJnByaXYtPnRpbWVyKTsKKwlrZnJlZShwcml2KTsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgZG05MTYxX2Fja19pbnRlcnJ1cHQoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvKQoreworCXBoeV9yZWFkKG1paV9pbmZvLCBNSUlfRE05MTYxX0lOVFIpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyogQ2ljYWRhIDgyMHggKi8KK3N0YXRpYyBzdHJ1Y3QgcGh5X2luZm8gcGh5X2luZm9fY2lzODIweCA9IHsKKwkweDAwMGZjNDQwLAorCSJDaWNhZGEgQ2lzODIwNCIsCisJMHgwMDBmZmZjMCwKKwkuZmVhdHVyZXMJPSBNSUlfR0JJVF9GRUFUVVJFUywKKwkuaW5pdAkJPSAmY2lzODIweF9pbml0LAorCS5jb25maWdfYW5lZwk9ICZnYml0X2NvbmZpZ19hbmVnLAorCS5yZWFkX3N0YXR1cwk9ICZjaXM4MjB4X3JlYWRfc3RhdHVzLAorCS5hY2tfaW50ZXJydXB0CT0gJmNpczgyMHhfYWNrX2ludGVycnVwdCwKKwkuY29uZmlnX2ludHIJPSAmY2lzODIweF9jb25maWdfaW50ciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5X2luZm8gcGh5X2luZm9fZG05MTYxID0geworCS5waHlfaWQJCT0gMHgwMTgxYjg4MCwKKwkubmFtZQkJPSAiRGF2aWNvbSBETTkxNjFFIiwKKwkucGh5X2lkX21hc2sJPSAweDBmZmZmZmYwLAorCS5pbml0CQk9IGRtOTE2MV9pbml0LAorCS5jb25maWdfYW5lZwk9IGRtOTE2MV9jb25maWdfYW5lZywKKwkucmVhZF9zdGF0dXMJPSBkbTkxNjFfcmVhZF9zdGF0dXMsCisJLmNsb3NlCQk9IGRtOTE2MV9jbG9zZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5X2luZm8gcGh5X2luZm9fbWFydmVsbCA9IHsKKwkucGh5X2lkCQk9IDB4MDE0MTBjMDAsCisJLnBoeV9pZF9tYXNrCT0gMHhmZmZmZmYwMCwKKwkubmFtZQkJPSAiTWFydmVsbCA4OEUxMTAxIiwKKwkuZmVhdHVyZXMJPSBNSUlfR0JJVF9GRUFUVVJFUywKKwkuY29uZmlnX2FuZWcJPSAmbWFydmVsbF9jb25maWdfYW5lZywKKwkucmVhZF9zdGF0dXMJPSAmbWFydmVsbF9yZWFkX3N0YXR1cywKKwkuYWNrX2ludGVycnVwdAk9ICZtYXJ2ZWxsX2Fja19pbnRlcnJ1cHQsCisJLmNvbmZpZ19pbnRyCT0gJm1hcnZlbGxfY29uZmlnX2ludHIsCit9OworCitzdGF0aWMgc3RydWN0IHBoeV9pbmZvIHBoeV9pbmZvX2dlbm1paT0geworCS5waHlfaWQJCT0gMHgwMDAwMDAwMCwKKwkucGh5X2lkX21hc2sJPSAweDAwMDAwMDAwLAorCS5uYW1lCQk9ICJHZW5lcmljIE1JSSIsCisJLmZlYXR1cmVzCT0gTUlJX0JBU0lDX0ZFQVRVUkVTLAorCS5jb25maWdfYW5lZwk9IGdlbm1paV9jb25maWdfYW5lZywKKwkucmVhZF9zdGF0dXMJPSBnZW5taWlfcmVhZF9zdGF0dXMsCit9OworCitzdGF0aWMgc3RydWN0IHBoeV9pbmZvICpwaHlfaW5mb1tdID0geworCSZwaHlfaW5mb19jaXM4MjB4LAorCSZwaHlfaW5mb19tYXJ2ZWxsLAorCSZwaHlfaW5mb19kbTkxNjEsCisJJnBoeV9pbmZvX2dlbm1paSwKKwlOVUxMCit9OworCit1MTYgcGh5X3JlYWQoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvLCB1MTYgcmVnbnVtKQoreworCXUxNiByZXR2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtaWlfaW5mby0+bWRpb19sb2NrLCBmbGFncyk7CisJcmV0dmFsID0gbWlpX2luZm8tPm1kaW9fcmVhZChtaWlfaW5mby0+ZGV2LCBtaWlfaW5mby0+bWlpX2lkLCByZWdudW0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1paV9pbmZvLT5tZGlvX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3ZvaWQgcGh5X3dyaXRlKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbywgdTE2IHJlZ251bSwgdTE2IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1paV9pbmZvLT5tZGlvX2xvY2ssIGZsYWdzKTsKKwltaWlfaW5mby0+bWRpb193cml0ZShtaWlfaW5mby0+ZGV2LCAKKwkJCW1paV9pbmZvLT5taWlfaWQsIAorCQkJcmVnbnVtLCB2YWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1paV9pbmZvLT5tZGlvX2xvY2ssIGZsYWdzKTsKK30KKworLyogVXNlIHRoZSBQSFkgSUQgcmVnaXN0ZXJzIHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2YgUEhZIGlzIGF0dGFjaGVkCisgKiB0byBkZXZpY2UgZGV2LiAgcmV0dXJuIGEgc3RydWN0IHBoeV9pbmZvIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoYXQgUEhZCisgKi8KK3N0cnVjdCBwaHlfaW5mbyAqIGdldF9waHlfaW5mbyhzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pCit7CisJdTE2IHBoeV9yZWc7CisJdTMyIHBoeV9JRDsKKwlpbnQgaTsKKwlzdHJ1Y3QgcGh5X2luZm8gKnRoZUluZm8gPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBtaWlfaW5mby0+ZGV2OworCisJLyogR3JhYiB0aGUgYml0cyBmcm9tIFBIWUlSMSwgYW5kIHB1dCB0aGVtIGluIHRoZSB1cHBlciBoYWxmICovCisJcGh5X3JlZyA9IHBoeV9yZWFkKG1paV9pbmZvLCBNSUlfUEhZU0lEMSk7CisJcGh5X0lEID0gKHBoeV9yZWcgJiAweGZmZmYpIDw8IDE2OworCisJLyogR3JhYiB0aGUgYml0cyBmcm9tIFBIWUlSMiwgYW5kIHB1dCB0aGVtIGluIHRoZSBsb3dlciBoYWxmICovCisJcGh5X3JlZyA9IHBoeV9yZWFkKG1paV9pbmZvLCBNSUlfUEhZU0lEMik7CisJcGh5X0lEIHw9IChwaHlfcmVnICYgMHhmZmZmKTsKKworCS8qIGxvb3AgdGhyb3VnaCBhbGwgdGhlIGtub3duIFBIWSB0eXBlcywgYW5kIGZpbmQgb25lIHRoYXQgKi8KKwkvKiBtYXRjaGVzIHRoZSBJRCB3ZSByZWFkIGZyb20gdGhlIFBIWS4gKi8KKwlmb3IgKGkgPSAwOyBwaHlfaW5mb1tpXTsgaSsrKQorCQlpZiAocGh5X2luZm9baV0tPnBoeV9pZCA9PSAKKwkJCQkocGh5X0lEICYgcGh5X2luZm9baV0tPnBoeV9pZF9tYXNrKSkgeworCQkJdGhlSW5mbyA9IHBoeV9pbmZvW2ldOworCQkJYnJlYWs7CisJCX0KKworCS8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbiwgYXMgd2UgaGF2ZSBnZW5lcmljIFBIWSBzdXBwb3J0ICovCisJaWYgKHRoZUluZm8gPT0gTlVMTCkgeworCQlwcmludGsoIiVzOiBQSFkgaWQgJXggaXMgbm90IHN1cHBvcnRlZCFcbiIsIGRldi0+bmFtZSwgcGh5X0lEKTsKKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCIlczogUEhZIGlzICVzICgleClcbiIsIGRldi0+bmFtZSwgdGhlSW5mby0+bmFtZSwKKwkJICAgICAgIHBoeV9JRCk7CisJfQorCisJcmV0dXJuIHRoZUluZm87Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyX3BoeS5oIGIvZHJpdmVycy9uZXQvZ2lhbmZhcl9waHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTliM2FiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZ2lhbmZhcl9waHkuaApAQCAtMCwwICsxLDIxMyBAQAorLyogCisgKiBkcml2ZXJzL25ldC9naWFuZmFyX3BoeS5oCisgKgorICogR2lhbmZhciBFdGhlcm5ldCBEcml2ZXIgLS0gUEhZIGhhbmRsaW5nCisgKiBEcml2ZXIgZm9yIEZFQyBvbiBNUEM4NTQwIGFuZCBUU0VDIG9uIE1QQzg1NDAvTVBDODU2MAorICogQmFzZWQgb24gODI2MF9pby9mY2NfZW5ldC5jCisgKgorICogQXV0aG9yOiBBbmR5IEZsZW1pbmcKKyAqIE1haW50YWluZXI6IEt1bWFyIEdhbGEgKGt1bWFyLmdhbGFAZnJlZXNjYWxlLmNvbSkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaWZuZGVmIF9fR0lBTkZBUl9QSFlfSAorI2RlZmluZSBfX0dJQU5GQVJfUEhZX0gKKworI2RlZmluZSBNSUlfZW5kICgodTMyKS0yKQorI2RlZmluZSBNSUlfcmVhZCAoKHUzMiktMSkKKworI2RlZmluZSBNSUlNSU5EX0JVU1kgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIE1JSU1JTkRfTk9UVkFMSUQgICAgICAgIDB4MDAwMDAwMDQKKworI2RlZmluZSBHRkFSX0FOX1RJTUVPVVQgICAgICAgICAyMDAwCisKKy8qIDEwMDBCVCBjb250cm9sIChNYXJ2ZWxsICYgQkNNNTR4eCBhdCBsZWFzdCkgKi8KKyNkZWZpbmUgTUlJXzEwMDBCQVNFVENPTlRST0wJCQkweDA5CisjZGVmaW5lIE1JSV8xMDAwQkFTRVRDT05UUk9MX0ZVTExEVVBMRVhDQVAJMHgwMjAwCisjZGVmaW5lIE1JSV8xMDAwQkFTRVRDT05UUk9MX0hBTEZEVVBMRVhDQVAJMHgwMTAwCisKKy8qIENpY2FkYSBFeHRlbmRlZCBDb250cm9sIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgTUlJX0NJUzgyMDFfRVhUX0NPTjEgICAgICAgICAgIDB4MTcKKyNkZWZpbmUgTUlJX0NJUzgyMDFfRVhUQ09OMV9JTklUICAgICAgIDB4MDAwMAorCisvKiBDaWNhZGEgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0NJUzgyMDFfSU1BU0sJCTB4MTkKKyNkZWZpbmUgTUlJX0NJUzgyMDFfSU1BU0tfSUVOCQkweDgwMDAKKyNkZWZpbmUgTUlJX0NJUzgyMDFfSU1BU0tfU1BFRUQJMHg0MDAwCisjZGVmaW5lIE1JSV9DSVM4MjAxX0lNQVNLX0xJTksJCTB4MjAwMAorI2RlZmluZSBNSUlfQ0lTODIwMV9JTUFTS19EVVBMRVgJMHgxMDAwCisjZGVmaW5lIE1JSV9DSVM4MjAxX0lNQVNLX01BU0sJCTB4ZjAwMAorCisvKiBDaWNhZGEgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfQ0lTODIwMV9JU1RBVAkJMHgxYQorI2RlZmluZSBNSUlfQ0lTODIwMV9JU1RBVF9TVEFUVVMJMHg4MDAwCisjZGVmaW5lIE1JSV9DSVM4MjAxX0lTVEFUX1NQRUVECTB4NDAwMAorI2RlZmluZSBNSUlfQ0lTODIwMV9JU1RBVF9MSU5LCQkweDIwMDAKKyNkZWZpbmUgTUlJX0NJUzgyMDFfSVNUQVRfRFVQTEVYCTB4MTAwMAorCisvKiBDaWNhZGEgQXV4aWxpYXJ5IENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9DSVM4MjAxX0FVWF9DT05TVEFUICAgICAgICAweDFjCisjZGVmaW5lIE1JSV9DSVM4MjAxX0FVWENPTlNUQVRfSU5JVCAgICAweDAwMDQKKyNkZWZpbmUgTUlJX0NJUzgyMDFfQVVYQ09OU1RBVF9EVVBMRVggIDB4MDAyMAorI2RlZmluZSBNSUlfQ0lTODIwMV9BVVhDT05TVEFUX1NQRUVEICAgMHgwMDE4CisjZGVmaW5lIE1JSV9DSVM4MjAxX0FVWENPTlNUQVRfR0JJVCAgICAweDAwMTAKKyNkZWZpbmUgTUlJX0NJUzgyMDFfQVVYQ09OU1RBVF8xMDAgICAgIDB4MDAwOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qIDg4RTEwMTEgUEhZIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTCQkweDExCisjZGVmaW5lIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVNfMTAwMAkJMHg4MDAwCisjZGVmaW5lIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVNfMTAwCQkweDQwMDAKKyNkZWZpbmUgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVU19TUERfTUFTSwkweGMwMDAKKyNkZWZpbmUgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVU19GVUxMRFVQTEVYCTB4MjAwMAorI2RlZmluZSBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTX1JFU09MVkVECTB4MDgwMAorI2RlZmluZSBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTX0xJTksJCTB4MDQwMAorCisjZGVmaW5lIE1JSV9NMTAxMV9JRVZFTlQJCTB4MTMKKyNkZWZpbmUgTUlJX00xMDExX0lFVkVOVF9DTEVBUgkJMHgwMDAwCisKKyNkZWZpbmUgTUlJX00xMDExX0lNQVNLCQkJMHgxMgorI2RlZmluZSBNSUlfTTEwMTFfSU1BU0tfSU5JVAkJMHg2NDAwCisjZGVmaW5lIE1JSV9NMTAxMV9JTUFTS19DTEVBUgkJMHgwMDAwCisKKyNkZWZpbmUgTUlJX0RNOTE2MV9TQ1IJCTB4MTAKKyNkZWZpbmUgTUlJX0RNOTE2MV9TQ1JfSU5JVAkweDA2MTAKKworLyogRE05MTYxIFNwZWNpZmllZCBDb25maWd1cmF0aW9uIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0RNOTE2MV9TQ1NSCTB4MTEKKyNkZWZpbmUgTUlJX0RNOTE2MV9TQ1NSXzEwMEYJMHg4MDAwCisjZGVmaW5lIE1JSV9ETTkxNjFfU0NTUl8xMDBICTB4NDAwMAorI2RlZmluZSBNSUlfRE05MTYxX1NDU1JfMTBGCTB4MjAwMAorI2RlZmluZSBNSUlfRE05MTYxX1NDU1JfMTBICTB4MTAwMAorCisvKiBETTkxNjEgSW50ZXJydXB0IFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9ETTkxNjFfSU5UUgkweDE1CisjZGVmaW5lIE1JSV9ETTkxNjFfSU5UUl9QRU5ECQkweDgwMDAKKyNkZWZpbmUgTUlJX0RNOTE2MV9JTlRSX0RQTFhfTUFTSwkweDA4MDAKKyNkZWZpbmUgTUlJX0RNOTE2MV9JTlRSX1NQRF9NQVNLCTB4MDQwMAorI2RlZmluZSBNSUlfRE05MTYxX0lOVFJfTElOS19NQVNLCTB4MDIwMAorI2RlZmluZSBNSUlfRE05MTYxX0lOVFJfTUFTSwkJMHgwMTAwCisjZGVmaW5lIE1JSV9ETTkxNjFfSU5UUl9EUExYX0NIQU5HRQkweDAwMTAKKyNkZWZpbmUgTUlJX0RNOTE2MV9JTlRSX1NQRF9DSEFOR0UJMHgwMDA4CisjZGVmaW5lIE1JSV9ETTkxNjFfSU5UUl9MSU5LX0NIQU5HRQkweDAwMDQKKyNkZWZpbmUgTUlJX0RNOTE2MV9JTlRSX0lOSVQgCQkweDAwMDAKKyNkZWZpbmUgTUlJX0RNOTE2MV9JTlRSX1NUT1AJXAorKE1JSV9ETTkxNjFfSU5UUl9EUExYX01BU0sgfCBNSUlfRE05MTYxX0lOVFJfU1BEX01BU0sgXAorIHwgTUlJX0RNOTE2MV9JTlRSX0xJTktfTUFTSyB8IE1JSV9ETTkxNjFfSU5UUl9NQVNLKQorCisvKiBETTkxNjEgMTBCVCBDb25maWd1cmF0aW9uL1N0YXR1cyAqLworI2RlZmluZSBNSUlfRE05MTYxXzEwQlRDU1IJMHgxMgorI2RlZmluZSBNSUlfRE05MTYxXzEwQlRDU1JfSU5JVAkweDc4MDAKKworI2RlZmluZSBNSUlfQkFTSUNfRkVBVFVSRVMJKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfCBcCisJCQkJIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfCBcCisJCQkJIFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwgXAorCQkJCSBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8IFwKKwkJCQkgU1VQUE9SVEVEX0F1dG9uZWcgfCBcCisJCQkJIFNVUFBPUlRFRF9UUCB8IFwKKwkJCQkgU1VQUE9SVEVEX01JSSkKKworI2RlZmluZSBNSUlfR0JJVF9GRUFUVVJFUwkoTUlJX0JBU0lDX0ZFQVRVUkVTIHwgXAorCQkJCSBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYgfCBcCisJCQkJIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCkKKworI2RlZmluZSBNSUlfUkVBRF9DT01NQU5EICAgICAgIDB4MDAwMDAwMDEKKworI2RlZmluZSBNSUlfSU5URVJSVVBUX0RJU0FCTEVEIDB4MAorI2RlZmluZSBNSUlfSU5URVJSVVBUX0VOQUJMRUQgMHgxCisvKiBUYWtlbiBmcm9tIG1paV9pZl9pbmZvIGFuZCBzdW5nZW1fcGh5LmggKi8KK3N0cnVjdCBnZmFyX21paV9pbmZvIHsKKwkvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgUEhZIHR5cGUgKi8KKwkvKiBBbmQgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KKwlzdHJ1Y3QgcGh5X2luZm8gKnBoeWluZm87CisKKwkvKiBmb3JjZWQgc3BlZWQgJiBkdXBsZXggKG5vIGF1dG9uZWcpCisJICogcGFydG5lciBzcGVlZCAmIGR1cGxleCAmIHBhdXNlIChhdXRvbmVnKQorCSAqLworCWludCBzcGVlZDsKKwlpbnQgZHVwbGV4OworCWludCBwYXVzZTsKKworCS8qIFRoZSBtb3N0IHJlY2VudGx5IHJlYWQgbGluayBzdGF0ZSAqLworCWludCBsaW5rOworCisJLyogRW5hYmxlZCBJbnRlcnJ1cHRzICovCisJdTMyIGludGVycnVwdHM7CisKKwl1MzIgYWR2ZXJ0aXNpbmc7CisJaW50IGF1dG9uZWc7CisJaW50IG1paV9pZDsKKworCS8qIHByaXZhdGUgZGF0YSBwb2ludGVyICovCisJLyogRm9yIHVzZSBieSBQSFlzIHRvIG1haW50YWluIGV4dHJhIHN0YXRlICovCisJdm9pZCAqcHJpdjsKKworCS8qIFByb3ZpZGVkIGJ5IGhvc3QgY2hpcCAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkvKiBBIGxvY2sgdG8gZW5zdXJlIHRoYXQgb25seSBvbmUgdGhpbmcgY2FuIHJlYWQvd3JpdGUKKwkgKiB0aGUgTURJTyBidXMgYXQgYSB0aW1lICovCisJc3BpbmxvY2tfdCBtZGlvX2xvY2s7CisKKwkvKiBQcm92aWRlZCBieSBldGhlcm5ldCBkcml2ZXIgKi8KKwlpbnQgKCptZGlvX3JlYWQpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnKTsKKwl2b2lkICgqbWRpb193cml0ZSkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtaWlfaWQsIGludCByZWcsIGludCB2YWwpOworfTsKKworLyogc3RydWN0IHBoeV9pbmZvOiBhIHN0cnVjdHVyZSB3aGljaCBkZWZpbmVzIGF0dHJpYnV0ZXMgZm9yIGEgUEhZCisgKgorICogaWQgd2lsbCBjb250YWluIGEgbnVtYmVyIHdoaWNoIHJlcHJlc2VudHMgdGhlIFBIWS4gIER1cmluZworICogc3RhcnR1cCwgdGhlIGRyaXZlciB3aWxsIHBvbGwgdGhlIFBIWSB0byBmaW5kIG91dCB3aGF0IGl0cworICogVUlELS1hcyBkZWZpbmVkIGJ5IHJlZ2lzdGVycyAyIGFuZCAzLS1pcy4gIFRoZSAzMi1iaXQgcmVzdWx0CisgKiBnb3R0ZW4gZnJvbSB0aGUgUEhZIHdpbGwgYmUgQU5EZWQgd2l0aCBwaHlfaWRfbWFzayB0bworICogZGlzY2FyZCBhbnkgYml0cyB3aGljaCBtYXkgY2hhbmdlIGJhc2VkIG9uIHJldmlzaW9uIG51bWJlcnMKKyAqIHVuaW1wb3J0YW50IHRvIGZ1bmN0aW9uYWxpdHkKKyAqCisgKiBUaGVyZSBhcmUgNiBjb21tYW5kcyB3aGljaCB0YWtlIGEgZ2Zhcl9taWlfaW5mbyBzdHJ1Y3R1cmUuCisgKiBFYWNoIFBIWSBtdXN0IGRlY2xhcmUgY29uZmlnX2FuZWcsIGFuZCByZWFkX3N0YXR1cy4KKyAqLworc3RydWN0IHBoeV9pbmZvIHsKKwl1MzIgcGh5X2lkOworCWNoYXIgKm5hbWU7CisJdW5zaWduZWQgaW50IHBoeV9pZF9tYXNrOworCXUzMiBmZWF0dXJlczsKKworCS8qIENhbGxlZCB0byBpbml0aWFsaXplIHRoZSBQSFkgKi8KKwlpbnQgKCppbml0KShzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pOworCisJLyogQ2FsbGVkIHRvIHN1c3BlbmQgdGhlIFBIWSBmb3IgcG93ZXIgKi8KKwlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pOworCisJLyogUmVjb25maWd1cmVzIGF1dG9uZWdvdGlhdGlvbiAob3IgZGlzYWJsZXMgaXQpICovCisJaW50ICgqY29uZmlnX2FuZWcpKHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbyk7CisKKwkvKiBEZXRlcm1pbmVzIHRoZSBuZWdvdGlhdGVkIHNwZWVkIGFuZCBkdXBsZXggKi8KKwlpbnQgKCpyZWFkX3N0YXR1cykoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvKTsKKworCS8qIENsZWFycyBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJaW50ICgqYWNrX2ludGVycnVwdCkoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvKTsKKworCS8qIEVuYWJsZXMgb3IgZGlzYWJsZXMgaW50ZXJydXB0cyAqLworCWludCAoKmNvbmZpZ19pbnRyKShzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pOworCisJLyogQ2xlYXJzIHVwIGFueSBtZW1vcnkgaWYgbmVlZGVkICovCisJdm9pZCAoKmNsb3NlKShzdHJ1Y3QgZ2Zhcl9taWlfaW5mbyAqbWlpX2luZm8pOworfTsKKworc3RydWN0IHBoeV9pbmZvICpnZXRfcGh5X2luZm8oc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvKTsKK2ludCByZWFkX3BoeV9yZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1paV9pZCwgaW50IHJlZ251bSk7Cit2b2lkIHdyaXRlX3BoeV9yZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1paV9pZCwgaW50IHJlZ251bSwgaW50IHZhbHVlKTsKK3ZvaWQgbWlpX2NsZWFyX3BoeV9pbnRlcnJ1cHQoc3RydWN0IGdmYXJfbWlpX2luZm8gKm1paV9pbmZvKTsKK3ZvaWQgbWlpX2NvbmZpZ3VyZV9waHlfaW50ZXJydXB0KHN0cnVjdCBnZmFyX21paV9pbmZvICptaWlfaW5mbywgdTMyIGludGVycnVwdHMpOworCitzdHJ1Y3QgZG05MTYxX3ByaXZhdGUgeworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCWludCByZXNldGRvbmU7Cit9OworCisjZW5kaWYgLyogR0lBTkZBUl9QSFlfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZ3Q2NDI0MGV0aC5oIGIvZHJpdmVycy9uZXQvZ3Q2NDI0MGV0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlN2FmMGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ndDY0MjQwZXRoLmgKQEAgLTAsMCArMSw0MDIgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgUGF0dG9uIEVsZWN0cm9uaWNzIENvbXBhbnkKKyAqIENvcHlyaWdodCAoQykgMjAwMiBNb21lbnR1bSBDb21wdXRlcgorICoKKyAqIENvcHlyaWdodCAyMDAwIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgIAlzdGV2ZWxAbXZpc3RhLmNvbSBvciBzdXBwb3J0QG12aXN0YS5jb20KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoVmVyc2lvbiAyKSBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBFdGhlcm5ldCBkcml2ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBNSVBTIEdUOTYxMDAgQWR2YW5jZWQKKyAqIENvbW11bmljYXRpb24gQ29udHJvbGxlci4KKyAqIAorICogTW9kaWZpZWQgZm9yIHRoZSBNYXJ2ZWxsb3VzIEdUNjQyNDAgUmV0YXJkZWQgQ29tbXVuaWNhdGlvbiBDb250cm9sbGVyLgorICovCisjaWZuZGVmIF9HVDY0MjQwRVRIX0gKKyNkZWZpbmUgX0dUNjQyNDBFVEhfSAorCisjaW5jbHVkZSA8YXNtL2d0NjQyNDAuaD4KKworI2RlZmluZSBFVEhFUk5FVF9QT1JUU19ESUZGRVJFTkNFX09GRlNFVFMJMHg0MDAKKworLyogVHJhbnNsYXRlIHRob3NlIHdlYW5pZSBuYW1lcyBmcm9tIEdhbGlsZW8vVnhXb3JrcyBoZWFkZXIgZmlsZXM6ICovCisKKyNkZWZpbmUgR1Q2NDI0MF9NUlIgICAgICAgICAgICAgICAgICAgIE1BSU5fUk9VVElOR19SRUdJU1RFUgorI2RlZmluZSBHVDY0MjQwX0NJVV9BUkJJVEVSX0NPTkZJRyAgICAgQ09NTV9VTklUX0FSQklURVJfQ09ORklHVVJBVElPTl9SRUdJU1RFUgorI2RlZmluZSBHVDY0MjQwX0NJVV9BUkJJVEVSX0NPTlRST0wgICAgQ09NTV9VTklUX0FSQklURVJfQ09OVFJPTAorI2RlZmluZSBHVDY0MjQwX01BSU5fTE9XX0NBVVNFICAgICAgICAgTE9XX0lOVEVSUlVQVF9DQVVTRV9SRUdJU1RFUgorI2RlZmluZSBHVDY0MjQwX01BSU5fSElHSF9DQVVTRSAgICAgICAgSElHSF9JTlRFUlJVUFRfQ0FVU0VfUkVHSVNURVIKKyNkZWZpbmUgR1Q2NDI0MF9DUFVfTE9XX01BU0sgICAgICAgICAgIENQVV9JTlRFUlJVUFRfTUFTS19SRUdJU1RFUl9MT1cKKyNkZWZpbmUgR1Q2NDI0MF9DUFVfSElHSF9NQVNLICAgICAgICAgIENQVV9JTlRFUlJVUFRfTUFTS19SRUdJU1RFUl9ISUdICisjZGVmaW5lIEdUNjQyNDBfQ1BVX1NFTEVDVF9DQVVTRSAgICAgICBDUFVfU0VMRUNUX0NBVVNFX1JFR0lTVEVSCisKKyNkZWZpbmUgR1Q2NDI0MF9FVEhfUEhZX0FERFJfUkVHICAgICAgIEVUSEVSTkVUX1BIWV9BRERSRVNTX1JFR0lTVEVSCisjZGVmaW5lIEdUNjQyNDBfRVRIX1BPUlRfQ09ORklHICAgICAgICBFVEhFUk5FVDBfUE9SVF9DT05GSUdVUkFUSU9OX1JFR0lTVEVSCisjZGVmaW5lIEdUNjQyNDBfRVRIX1BPUlRfQ09ORklHX0VYVCAgICBFVEhFUk5FVDBfUE9SVF9DT05GSUdVUkFUSU9OX0VYVEVORF9SRUdJU1RFUgorI2RlZmluZSBHVDY0MjQwX0VUSF9QT1JUX0NPTU1BTkQgICAgICAgRVRIRVJORVQwX1BPUlRfQ09NTUFORF9SRUdJU1RFUgorI2RlZmluZSBHVDY0MjQwX0VUSF9QT1JUX1NUQVRVUyAgICAgICAgRVRIRVJORVQwX1BPUlRfU1RBVFVTX1JFR0lTVEVSCisjZGVmaW5lIEdUNjQyNDBfRVRIX0lPX1NJWkUgICAgICAgICAgICBFVEhFUk5FVF9QT1JUU19ESUZGRVJFTkNFX09GRlNFVFMKKyNkZWZpbmUgR1Q2NDI0MF9FVEhfU01JX1JFRyAgICAgICAgICAgIEVUSEVSTkVUX1NNSV9SRUdJU1RFUgorI2RlZmluZSBHVDY0MjQwX0VUSF9NSUJfQ09VTlRfQkFTRSAgICAgRVRIRVJORVQwX01JQl9DT1VOVEVSX0JBU0UKKyNkZWZpbmUgR1Q2NDI0MF9FVEhfU0RNQV9DT05GSUcgICAgICAgIEVUSEVSTkVUMF9TRE1BX0NPTkZJR1VSQVRJT05fUkVHSVNURVIKKyNkZWZpbmUgR1Q2NDI0MF9FVEhfU0RNQV9DT01NICAgICAgICAgIEVUSEVSTkVUMF9TRE1BX0NPTU1BTkRfUkVHSVNURVIKKyNkZWZpbmUgR1Q2NDI0MF9FVEhfSU5UX01BU0sgICAgICAgICAgIEVUSEVSTkVUMF9JTlRFUlJVUFRfTUFTS19SRUdJU1RFUgorI2RlZmluZSBHVDY0MjQwX0VUSF9JTlRfQ0FVU0UgICAgICAgICAgRVRIRVJORVQwX0lOVEVSUlVQVF9DQVVTRV9SRUdJU1RFUgorI2RlZmluZSBHVDY0MjQwX0VUSF9DVVJSX1RYX0RFU0NfUFRSMCAgRVRIRVJORVQwX0NVUlJFTlRfVFhfREVTQ1JJUFRPUl9QT0lOVEVSMAorI2RlZmluZSBHVDY0MjQwX0VUSF9DVVJSX1RYX0RFU0NfUFRSMSAgRVRIRVJORVQwX0NVUlJFTlRfVFhfREVTQ1JJUFRPUl9QT0lOVEVSMQorI2RlZmluZSBHVDY0MjQwX0VUSF8xU1RfUlhfREVTQ19QVFIwICAgRVRIRVJORVQwX0ZJUlNUX1JYX0RFU0NSSVBUT1JfUE9JTlRFUjAKKyNkZWZpbmUgR1Q2NDI0MF9FVEhfQ1VSUl9SWF9ERVNDX1BUUjAgIEVUSEVSTkVUMF9DVVJSRU5UX1JYX0RFU0NSSVBUT1JfUE9JTlRFUjAKKyNkZWZpbmUgR1Q2NDI0MF9FVEhfSEFTSF9UQkxfUFRSICAgICAgIEVUSEVSTkVUMF9IQVNIX1RBQkxFX1BPSU5URVJfUkVHSVNURVIKKworLyogVHVybiBvbiBOQVBJIGJ5IGRlZmF1bHQgKi8KKworI2RlZmluZQlHVDY0MjQwX05BUEkJCQkxCisKKy8qIFNvbWUgNjQyNDAgc2V0dGluZ3MgdGhhdCBTSE9VTEQgZXZlbnR1YWxseSBiZSBzZXR1cCBpbiBQUk9NIG1vbml0b3I6ICovCisvKiAoQm9hcmQtc3BlY2lmaWMgdG8gdGhlIERTTDMyMjQgUmV2IEEgYm9hcmQgT05MWSEpICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBEMzIyNF9NUFBfQ1RSTDBfU0VUVElORwkJMHg2NjY2OTkwMAorI2RlZmluZSBEMzIyNF9NUFBfQ1RSTDFfU0VUVElORwkJMHgwMDAwMDAwMAorI2RlZmluZSBEMzIyNF9NUFBfQ1RSTDJfU0VUVElORwkJMHgwMDg4NzcwMAorI2RlZmluZSBEMzIyNF9NUFBfQ1RSTDNfU0VUVElORwkJMHgwMDAwMDA0NAorI2RlZmluZSBEMzIyNF9HUFBfSU9fQ1RSTF9TRVRUSU5HCTB4MDAwMGU4MDAKKyNkZWZpbmUgRDMyMjRfR1BQX0xFVkVMX0NUUkxfU0VUVElORwkweGYwMDFmNzAzCisjZGVmaW5lIEQzMjI0X0dQUF9WQUxVRV9TRVRUSU5HCQkweDAwMDAwMDAwCisKKy8qIEtlZXAgdGhlIHJpbmcgc2l6ZXMgYSBwb3dlciBvZiB0d28gZm9yIGVmZmljaWVuY3kuICovCisvLy0jZGVmaW5lIFRYX1JJTkdfU0laRSAxNgorI2RlZmluZSBUWF9SSU5HX1NJWkUJNjQJLyogVEVTVElORyAhISEgKi8KKyNkZWZpbmUgUlhfUklOR19TSVpFCTMyCisjZGVmaW5lIFBLVF9CVUZfU1oJMTUzNgkvKiBTaXplIG9mIGVhY2ggdGVtcG9yYXJ5IFJ4IGJ1ZmZlci4gKi8KKworI2RlZmluZSBSWF9IQVNIX1RBQkxFX1NJWkUgMTYzODQKKyNkZWZpbmUgSEFTSF9IT1BfTlVNQkVSIDEyCisKKyNkZWZpbmUgTlVNX0lOVEVSRkFDRVMgMworCisjZGVmaW5lIEdUNjQyNDBFVEhfVFhfVElNRU9VVCBIWi80CisKKyNkZWZpbmUgTUlQU19HVDY0MjQwX0JBU0UgMHhmNDAwMDAwMAorI2RlZmluZSBHVDY0MjQwX0VUSDBfQkFTRSAoTUlQU19HVDY0MjQwX0JBU0UgKyBHVDY0MjQwX0VUSF9QT1JUX0NPTkZJRykKKyNkZWZpbmUgR1Q2NDI0MF9FVEgxX0JBU0UgKEdUNjQyNDBfRVRIMF9CQVNFICsgR1Q2NDI0MF9FVEhfSU9fU0laRSkKKyNkZWZpbmUgR1Q2NDI0MF9FVEgyX0JBU0UgKEdUNjQyNDBfRVRIMV9CQVNFICsgR1Q2NDI0MF9FVEhfSU9fU0laRSkKKworI2lmIGRlZmluZWQoQ09ORklHX01JUFNfRFNMMzIyNCkKKyNkZWZpbmUgR1Q2NDI0MF9FVEhFUjBfSVJRIDQKKyNkZWZpbmUgR1Q2NDI0MF9FVEhFUjFfSVJRIDQKKyNlbHNlCisjZGVmaW5lIEdUNjQyNDBfRVRIRVIwX0lSUSAtMQorI2RlZmluZSBHVDY0MjQwX0VUSEVSMV9JUlEgLTEKKyNlbmRpZgorCisjZGVmaW5lIFJFVl9HVDY0MjQwICAweDEKKyNkZWZpbmUgUkVWX0dUNjQyNDBBIDB4MTAKKworI2RlZmluZSBHVDY0MjQwRVRIX1JFQUQoZ3AsIG9mZnNldCkJCQkJCVwKKwlHVF9SRUFEKChncCktPnBvcnRfb2Zmc2V0ICsgKG9mZnNldCkpCisKKyNkZWZpbmUgR1Q2NDI0MEVUSF9XUklURShncCwgb2Zmc2V0LCBkYXRhKQkJCQlcCisJR1RfV1JJVEUoKGdwKS0+cG9ydF9vZmZzZXQgKyAob2Zmc2V0KSwgKGRhdGEpKQorCisjZGVmaW5lIEdUNjQyNDBFVEhfU0VUQklUKGdwLCBvZmZzZXQsIGJpdHMpCQkJCVwKKwlHVDY0MjQwRVRIX1dSSVRFKChncCksIChvZmZzZXQpLAkJCQlcCisJICAgICAgICAgICAgICAgICBHVDY0MjQwRVRIX1JFQUQoKGdwKSwgKG9mZnNldCkpIHwgKGJpdHMpKQorCisjZGVmaW5lIEdUNjQyNDBFVEhfQ0xSQklUKGdwLCBvZmZzZXQsIGJpdHMpCQkJCVwKKwlHVDY0MjQwRVRIX1dSSVRFKChncCksIChvZmZzZXQpLAkJCQlcCisJICAgICAgICAgICAgICAgICBHVDY0MjQwRVRIX1JFQUQoKGdwKSwgKG9mZnNldCkpICYgfihiaXRzKSkKKworI2RlZmluZSBHVDY0MjQwX1JFQUQob2ZzKQkJR1RfUkVBRChvZnMpCisjZGVmaW5lIEdUNjQyNDBfV1JJVEUob2ZzLCBkYXRhKQlHVF9XUklURSgob2ZzKSwgKGRhdGEpKQorCisvKiBCaXQgZGVmaW5pdGlvbnMgb2YgdGhlIFNNSSBSZWcgKi8KK2VudW0geworCXNtaXJEYXRhTWFzayA9IDB4ZmZmZiwKKwlzbWlyUGh5QWRNYXNrID0gMHgxZiA8PCAxNiwKKwlzbWlyUGh5QWRCaXQgPSAxNiwKKwlzbWlyUmVnQWRNYXNrID0gMHgxZiA8PCAyMSwKKwlzbWlyUmVnQWRCaXQgPSAyMSwKKwlzbWlyT3BDb2RlID0gMSA8PCAyNiwKKwlzbWlyUmVhZFZhbGlkID0gMSA8PCAyNywKKwlzbWlyQnVzeSA9IDEgPDwgMjgKK307CisKKy8qIEJpdCBkZWZpbml0aW9ucyBvZiB0aGUgUG9ydCBDb25maWcgUmVnICovCitlbnVtIHBjcl9iaXRzIHsKKwlwY3JQTSA9IDEgPDwgMCwKKwlwY3JSQk0gPSAxIDw8IDEsCisJcGNyUEJGID0gMSA8PCAyLAorCXBjckVOID0gMSA8PCA3LAorCXBjckxQQktNYXNrID0gMHgzIDw8IDgsCisJcGNyTFBCS0JpdCA9IDEgPDwgOCwKKwlwY3JGQyA9IDEgPDwgMTAsCisJcGNySFMgPSAxIDw8IDEyLAorCXBjckhNID0gMSA8PCAxMywKKwlwY3JIRE0gPSAxIDw8IDE0LAorCXBjckhEID0gMSA8PCAxNSwKKwlwY3JJU0xNYXNrID0gMHg3IDw8IDI4LAorCXBjcklTTEJpdCA9IDI4LAorCXBjckFDQ1MgPSAxIDw8IDMxCit9OworCisvKiBCaXQgZGVmaW5pdGlvbnMgb2YgdGhlIFBvcnQgQ29uZmlnIEV4dGVuZCBSZWcgKi8KK2VudW0gcGN4cl9iaXRzIHsKKwlwY3hySUdNUCA9IDEsCisJcGN4clNQQU4gPSAyLAorCXBjeHJQQVIgPSA0LAorCXBjeHJQUklPdHhNYXNrID0gMHg3IDw8IDMsCisJcGN4clBSSU90eEJpdCA9IDMsCisJcGN4clBSSU9yeE1hc2sgPSAweDMgPDwgNiwKKwlwY3hyUFJJT3J4Qml0ID0gNiwKKwlwY3hyUFJJT3J4T3ZlcnJpZGUgPSAxIDw8IDgsCisJcGN4ckRQTFhlbiA9IDEgPDwgOSwKKwlwY3hyRkNUTGVuID0gMSA8PCAxMCwKKwlwY3hyRkxQID0gMSA8PCAxMSwKKwlwY3hyRkNUTCA9IDEgPDwgMTIsCisJcGN4ck1GTE1hc2sgPSAweDMgPDwgMTQsCisJcGN4ck1GTEJpdCA9IDE0LAorCXBjeHJNSUJjbHJNb2RlID0gMSA8PCAxNiwKKwlwY3hyU3BlZWQgPSAxIDw8IDE4LAorCXBjeHJTcGVlZGVuID0gMSA8PCAxOSwKKwlwY3hyUk1JSWVuID0gMSA8PCAyMCwKKwlwY3hyRFNDUGVuID0gMSA8PCAyMQorfTsKKworLyogQml0IGRlZmluaXRpb25zIG9mIHRoZSBQb3J0IENvbW1hbmQgUmVnICovCitlbnVtIHBjbXJfYml0cyB7CisJcGNtckZKID0gMSA8PCAxNQorfTsKKworCisvKiBCaXQgZGVmaW5pdGlvbnMgb2YgdGhlIFBvcnQgU3RhdHVzIFJlZyAqLworZW51bSBwc3JfYml0cyB7CisJcHNyU3BlZWQgPSAxLAorCXBzckR1cGxleCA9IDIsCisJcHNyRmN0bCA9IDQsCisJcHNyTGluayA9IDgsCisJcHNyUGF1c2UgPSAxIDw8IDQsCisJcHNyVHhMb3cgPSAxIDw8IDUsCisJcHNyVHhIaWdoID0gMSA8PCA2LAorCXBzclR4SW5Qcm9nID0gMSA8PCA3Cit9OworCisvKiBCaXQgZGVmaW5pdGlvbnMgb2YgdGhlIFNETUEgQ29uZmlnIFJlZyAqLworZW51bSBzZGNyX2JpdHMgeworCXNkY3JSQ01hc2sgPSAweGYgPDwgMiwKKwlzZGNyUkNCaXQgPSAyLAorCXNkY3JCTE1SID0gMSA8PCA2LAorCXNkY3JCTE1UID0gMSA8PCA3LAorCXNkY3JQT1ZSID0gMSA8PCA4LAorCXNkY3JSSUZCID0gMSA8PCA5LAorCXNkY3JCU1pNYXNrID0gMHgzIDw8IDEyLAorCXNkY3JCU1pCaXQgPSAxMgorfTsKKworLyogQml0IGRlZmluaXRpb25zIG9mIHRoZSBTRE1BIENvbW1hbmQgUmVnICovCitlbnVtIHNkY21yX2JpdHMgeworCXNkY21yRVJEID0gMSA8PCA3LAorCXNkY21yQVIgPSAxIDw8IDE1LAorCXNkY21yU1RESCA9IDEgPDwgMTYsCisJc2RjbXJTVERMID0gMSA8PCAxNywKKwlzZGNtclRYREggPSAxIDw8IDIzLAorCXNkY21yVFhETCA9IDEgPDwgMjQsCisJc2RjbXJBVCA9IDEgPDwgMzEKK307CisKKy8qIEJpdCBkZWZpbml0aW9ucyBvZiB0aGUgSW50ZXJydXB0IENhdXNlIFJlZyAqLworZW51bSBpY3JfYml0cyB7CisJaWNyUnhCdWZmZXIgPSAxLAorCWljclR4QnVmZmVySGlnaCA9IDEgPDwgMiwKKwlpY3JUeEJ1ZmZlckxvdyA9IDEgPDwgMywKKwlpY3JUeEVuZEhpZ2ggPSAxIDw8IDYsCisJaWNyVHhFbmRMb3cgPSAxIDw8IDcsCisJaWNyUnhFcnJvciA9IDEgPDwgOCwKKwlpY3JUeEVycm9ySGlnaCA9IDEgPDwgMTAsCisJaWNyVHhFcnJvckxvdyA9IDEgPDwgMTEsCisJaWNyUnhPVlIgPSAxIDw8IDEyLAorCWljclR4VWRyID0gMSA8PCAxMywKKwlpY3JSeEJ1ZmZlclEwID0gMSA8PCAxNiwKKwlpY3JSeEJ1ZmZlclExID0gMSA8PCAxNywKKwlpY3JSeEJ1ZmZlclEyID0gMSA8PCAxOCwKKwlpY3JSeEJ1ZmZlclEzID0gMSA8PCAxOSwKKwlpY3JSeEVycm9yUTAgPSAxIDw8IDIwLAorCWljclJ4RXJyb3JRMSA9IDEgPDwgMjEsCisJaWNyUnhFcnJvclEyID0gMSA8PCAyMiwKKwlpY3JSeEVycm9yUTMgPSAxIDw8IDIzLAorCWljck1JSVBoeVNUQyA9IDEgPDwgMjgsCisJaWNyU01JZG9uZSA9IDEgPDwgMjksCisJaWNyRXRoZXJJbnRTdW0gPSAxIDw8IDMxCit9OworCisKKy8qIFRoZSBSeCBhbmQgVHggZGVzY3JpcHRvciBsaXN0cy4gKi8KKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgY21kc3RhdDsKKwl1MTYgcmVzZXJ2ZWQ7CQkvLy1wcmsyMWF1ZzAxICAgIHUzMiByZXNlcnZlZDoxNjsKKwl1MTYgYnl0ZV9jbnQ7CQkvLy1wcmsyMWF1ZzAxICAgIHUzMiBieXRlX2NudDoxNjsKKwl1MzIgYnVmZl9wdHI7CisJdTMyIG5leHQ7Cit9IGd0NjQyNDBfdGRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBjbWRzdGF0OworCXUxNiBieXRlX2NudDsJCS8vLXByazIxYXVnMDEgICAgdTMyIGJ5dGVfY250OjE2OworCXUxNiBidWZmX3N6OwkJLy8tcHJrMjFhdWcwMSAgICB1MzIgYnVmZl9zejoxNjsKKwl1MzIgYnVmZl9wdHI7CisJdTMyIG5leHQ7Cit9IGd0NjQyNDBfcmRfdDsKKyNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOKQordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBieXRlX2NudDsJCS8vLXByazIxYXVnMDEgICAgdTMyIGJ5dGVfY250OjE2OworCXUxNiByZXNlcnZlZDsJCS8vLXByazIxYXVnMDEgICAgdTMyIHJlc2VydmVkOjE2OworCXUzMiBjbWRzdGF0OworCXUzMiBuZXh0OworCXUzMiBidWZmX3B0cjsKK30gZ3Q2NDI0MF90ZF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IGJ1ZmZfc3o7CQkvLy1wcmsyMWF1ZzAxICAgIHUzMiBidWZmX3N6OjE2OworCXUxNiBieXRlX2NudDsJCS8vLXByazIxYXVnMDEgICAgdTMyIGJ5dGVfY250OjE2OworCXUzMiBjbWRzdGF0OworCXUzMiBuZXh0OworCXUzMiBidWZmX3B0cjsKK30gZ3Q2NDI0MF9yZF90OworI2Vsc2UKKyNlcnJvciBFaXRoZXIgX19CSUdfRU5ESUFOIG9yIF9fTElUVExFX0VORElBTiBtdXN0IGJlIGRlZmluZWQhCisjZW5kaWYKKworCisvKiBWYWx1ZXMgZm9yIHRoZSBUeCBjb21tYW5kLXN0YXR1cyBkZXNjcmlwdG9yIGVudHJ5LiAqLworZW51bSB0ZF9jbWRzdGF0IHsKKwl0eE93biA9IDEgPDwgMzEsCisJdHhBdXRvTW9kZSA9IDEgPDwgMzAsCisJdHhFSSA9IDEgPDwgMjMsCisJdHhHZW5DUkMgPSAxIDw8IDIyLAorCXR4UGFkID0gMSA8PCAxOCwKKwl0eEZpcnN0ID0gMSA8PCAxNywKKwl0eExhc3QgPSAxIDw8IDE2LAorCXR4RXJyb3JTdW1tYXJ5ID0gMSA8PCAxNSwKKwl0eFJlVHhDbnRNYXNrID0gMHgwZiA8PCAxMCwKKwl0eFJlVHhDbnRCaXQgPSAxMCwKKwl0eENvbGxpc2lvbiA9IDEgPDwgOSwKKwl0eFJlVHhMaW1pdCA9IDEgPDwgOCwKKwl0eFVuZGVycnVuID0gMSA8PCA2LAorCXR4TGF0ZUNvbGxpc2lvbiA9IDEgPDwgNQorfTsKKworCisvKiBWYWx1ZXMgZm9yIHRoZSBSeCBjb21tYW5kLXN0YXR1cyBkZXNjcmlwdG9yIGVudHJ5LiAqLworZW51bSByZF9jbWRzdGF0IHsKKwlyeE93biA9IDEgPDwgMzEsCisJcnhBdXRvTW9kZSA9IDEgPDwgMzAsCisJcnhFSSA9IDEgPDwgMjMsCisJcnhGaXJzdCA9IDEgPDwgMTcsCisJcnhMYXN0ID0gMSA8PCAxNiwKKwlyeEVycm9yU3VtbWFyeSA9IDEgPDwgMTUsCisJcnhJR01QID0gMSA8PCAxNCwKKwlyeEhhc2hFeHBpcmVkID0gMSA8PCAxMywKKwlyeE1pc3NlZEZyYW1lID0gMSA8PCAxMiwKKwlyeEZyYW1lVHlwZSA9IDEgPDwgMTEsCisJcnhTaG9ydEZyYW1lID0gMSA8PCA4LAorCXJ4TWF4RnJhbWVMZW4gPSAxIDw8IDcsCisJcnhPdmVycnVuID0gMSA8PCA2LAorCXJ4Q29sbGlzaW9uID0gMSA8PCA0LAorCXJ4Q1JDRXJyb3IgPSAxCit9OworCisvKiBCaXQgZmllbGRzIG9mIGEgSGFzaCBUYWJsZSBFbnRyeSAqLworZW51bSBoYXNoX3RhYmxlX2VudHJ5IHsKKwlodGVWYWxpZCA9IDEsCisJaHRlU2tpcCA9IDIsCisJaHRlUkQgPSA0Cit9OworCisvLyBUaGUgTUlCIGNvdW50ZXJzCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyIGJ5dGVSZWNlaXZlZDsKKwl1MzIgYnl0ZVNlbnQ7CisJdTMyIGZyYW1lc1JlY2VpdmVkOworCXUzMiBmcmFtZXNTZW50OworCXUzMiB0b3RhbEJ5dGVSZWNlaXZlZDsKKwl1MzIgdG90YWxGcmFtZXNSZWNlaXZlZDsKKwl1MzIgYnJvYWRjYXN0RnJhbWVzUmVjZWl2ZWQ7CisJdTMyIG11bHRpY2FzdEZyYW1lc1JlY2VpdmVkOworCXUzMiBjUkNFcnJvcjsKKwl1MzIgb3ZlcnNpemVGcmFtZXM7CisJdTMyIGZyYWdtZW50czsKKwl1MzIgamFiYmVyOworCXUzMiBjb2xsaXNpb247CisJdTMyIGxhdGVDb2xsaXNpb247CisJdTMyIGZyYW1lczY0OworCXUzMiBmcmFtZXM2NV8xMjc7CisJdTMyIGZyYW1lczEyOF8yNTU7CisJdTMyIGZyYW1lczI1Nl81MTE7CisJdTMyIGZyYW1lczUxMl8xMDIzOworCXUzMiBmcmFtZXMxMDI0X01heFNpemU7CisJdTMyIG1hY1J4RXJyb3I7CisJdTMyIGRyb3BwZWRGcmFtZXM7CisJdTMyIG91dE11bHRpY2FzdEZyYW1lczsKKwl1MzIgb3V0QnJvYWRjYXN0RnJhbWVzOworCXUzMiB1bmRlcnNpemVGcmFtZXM7Cit9IG1pYl9jb3VudGVyc190OworCisKK3N0cnVjdCBndDY0MjQwX3ByaXZhdGUgeworCWd0NjQyNDBfcmRfdCAqcnhfcmluZzsKKwlndDY0MjQwX3RkX3QgKnR4X3Jpbmc7CisJLy8gVGhlIFJ4IGFuZCBUeCByaW5ncyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAorCWRtYV9hZGRyX3QgcnhfcmluZ19kbWE7CisJZG1hX2FkZHJfdCB0eF9yaW5nX2RtYTsKKwljaGFyICpoYXNoX3RhYmxlOworCS8vIFRoZSBIYXNoIFRhYmxlIG11c3QgYmUgOC1ieXRlIGFsaWduZWQKKwlkbWFfYWRkcl90IGhhc2hfdGFibGVfZG1hOworCWludCBoYXNoX21vZGU7CisKKwkvLyBUaGUgUnggYnVmZmVycyBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkCisJY2hhciAqcnhfYnVmZjsKKwlkbWFfYWRkcl90IHJ4X2J1ZmZfZG1hOworCS8vIFR4IGJ1ZmZlcnMgKHR4X3NrYnVmZltpXS0+ZGF0YSkgd2l0aCBsZXNzIHRoYW4gOCBieXRlcworCS8vIG9mIHBheWxvYWQgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZAorCXN0cnVjdCBza19idWZmICp0eF9za2J1ZmZbVFhfUklOR19TSVpFXTsKKwlpbnQgcnhfbmV4dF9vdXQ7CS8qIFRoZSBuZXh0IGZyZWUgcmluZyBlbnRyeSB0byByZWNlaXZlICovCisJaW50IHR4X25leHRfaW47CQkvKiBUaGUgbmV4dCBmcmVlIHJpbmcgZW50cnkgdG8gc2VuZCAqLworCWludCB0eF9uZXh0X291dDsJLyogVGhlIGxhc3QgcmluZyBlbnRyeSB0aGUgSVNSIHByb2Nlc3NlZCAqLworCWludCB0eF9jb3VudDsJCS8qIGN1cnJlbnQgIyBvZiBwa3RzIHdhaXRpbmcgdG8gYmUgc2VudCBpbiBUeCByaW5nICovCisJaW50IGludHJfd29ya19kb25lOwkvKiBudW1iZXIgb2YgUnggYW5kIFR4IHBrdHMgcHJvY2Vzc2VkIGluIHRoZSBpc3IgKi8KKwlpbnQgdHhfZnVsbDsJCS8qIFR4IHJpbmcgaXMgZnVsbCAqLworCisJbWliX2NvdW50ZXJzX3QgbWliOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCisJaW50IGlvX3NpemU7CisJaW50IHBvcnRfbnVtOwkJLy8gMCBvciAxCisJdTMyIHBvcnRfb2Zmc2V0OworCisJaW50IHBoeV9hZGRyOwkJLy8gUEhZIGFkZHJlc3MKKwl1MzIgbGFzdF9wc3I7CQkvLyBsYXN0IHZhbHVlIG9mIHRoZSBwb3J0IHN0YXR1cyByZWdpc3RlcgorCisJaW50IG9wdGlvbnM7CQkvKiBVc2VyLXNldHRhYmxlIG1pc2MuIGRyaXZlciBvcHRpb25zLiAqLworCWludCBkcnZfZmxhZ3M7CisJc3BpbmxvY2tfdCBsb2NrOwkvKiBTZXJpYWxpc2UgYWNjZXNzIHRvIGRldmljZSAqLworCXN0cnVjdCBtaWlfaWZfaW5mbyBtaWlfaWY7CisKKwl1MzIgbXNnX2VuYWJsZTsKK307CisKKyNlbmRpZiAvKiBfR1Q2NDI0MEVUSF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ndDk2MTAwZXRoLmMgYi9kcml2ZXJzL25ldC9ndDk2MTAwZXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2Y2ZiYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2d0OTYxMDBldGguYwpAQCAtMCwwICsxLDE1NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMCwgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogICAgICAgICAJc3RldmVsQG12aXN0YS5jb20gb3Igc291cmNlQG12aXN0YS5jb20KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoVmVyc2lvbiAyKSBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBFdGhlcm5ldCBkcml2ZXIgZm9yIHRoZSBNSVBTIEdUOTYxMDAgQWR2YW5jZWQgQ29tbXVuaWNhdGlvbiBDb250cm9sbGVyLgorICogCisgKiAgUmV2aXNpb24gaGlzdG9yeQorICogICAgCisgKiAgICAxMS4xMS4yMDAxICBNb3ZlZCB0byAyLjQuMTQsIHBwb3BvdkBtdmlzdGEuY29tLiAgTW9kaWZpZWQgZHJpdmVyIHRvIGFkZAorICogICAgICAgICAgICAgICAgcHJvcGVyIGd0OTYxMDBBIHN1cHBvcnQuCisgKiAgICAxMi4wNS4yMDAxICBNb3ZlZCBldGggcG9ydCAwIHRvIGlycSAzIChtYXBwZWQgdG8gR1RfU0VSSU5UMCBvbiBFVjk2MTAwQSkKKyAqICAgICAgICAgICAgICAgIGluIG9yZGVyIGZvciBib3RoIHBvcnRzIHRvIHdvcmsuIEFsc28gY2xlYW5lZCB1cCBib290CisgKiAgICAgICAgICAgICAgICBvcHRpb24gc3VwcG9ydCAobWFjIGFkZHJlc3Mgc3RyaW5nIHBhcnNpbmcpLCBmbGVzaGVkIG91dAorICogICAgICAgICAgICAgICAgZ3Q5NjEwMF9jbGVhbnVwX21vZHVsZSgpLCBhbmQgb3RoZXIgZ2VuZXJhbCBjb2RlIGNsZWFudXBzCisgKiAgICAgICAgICAgICAgICA8c3RldmVsQG12aXN0YS5jb20+LgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBERVNDX0JFIDEKKyNkZWZpbmUgREVTQ19EQVRBX0JFIDEKKworI2RlZmluZSBHVDk2MTAwX0RFQlVHIDIKKworI2luY2x1ZGUgImd0OTYxMDBldGguaCIKKworLy8gcHJvdG90eXBlcworc3RhdGljIHZvaWQqIGRtYWFsbG9jKHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICpkbWFfaGFuZGxlKTsKK3N0YXRpYyB2b2lkIGRtYWZyZWUoc2l6ZV90IHNpemUsIHZvaWQgKnZhZGRyKTsKK3N0YXRpYyB2b2lkIGd0OTYxMDBfZGVsYXkoaW50IG1zZWMpOworc3RhdGljIGludCBndDk2MTAwX2FkZF9oYXNoX2VudHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICB1bnNpZ25lZCBjaGFyKiBhZGRyKTsKK3N0YXRpYyB2b2lkIHJlYWRfbWliX2NvdW50ZXJzKHN0cnVjdCBndDk2MTAwX3ByaXZhdGUgKmdwKTsKK3N0YXRpYyBpbnQgcmVhZF9NSUkoaW50IHBoeV9hZGRyLCB1MzIgcmVnKTsKK3N0YXRpYyBpbnQgd3JpdGVfTUlJKGludCBwaHlfYWRkciwgdTMyIHJlZywgdTE2IGRhdGEpOworc3RhdGljIGludCBndDk2MTAwX2luaXRfbW9kdWxlKHZvaWQpOworc3RhdGljIHZvaWQgZ3Q5NjEwMF9jbGVhbnVwX21vZHVsZSh2b2lkKTsKK3N0YXRpYyB2b2lkIGR1bXBfTUlJKGludCBkYmdfbHZsLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGR1bXBfdHhfZGVzYyhpbnQgZGJnX2x2bCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGkpOworc3RhdGljIHZvaWQgZHVtcF9yeF9kZXNjKGludCBkYmdfbHZsLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaSk7CitzdGF0aWMgdm9pZCBkdW1wX3NrYihpbnQgZGJnX2x2bCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIGR1bXBfaHdfYWRkcihpbnQgZGJnX2x2bCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBjb25zdCBjaGFyKiBwZngsIHVuc2lnbmVkIGNoYXIqIGFkZHJfc3RyKTsKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0cyhzdHJ1Y3QgZ3Q5NjEwMF9wcml2YXRlICpncCk7CitzdGF0aWMgdm9pZCBhYm9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgYWJvcnRfYml0cyk7CitzdGF0aWMgdm9pZCBoYXJkX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlbmFibGVfZXRoZXJfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZGlzYWJsZV9ldGhlcl9pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGd0OTYxMDBfcHJvYmUxKHN0cnVjdCBwY2lfZGV2ICpwY2ksIGludCBwb3J0X251bSk7CitzdGF0aWMgdm9pZCByZXNldF90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJlc2V0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBndDk2MTAwX2NoZWNrX3R4X2NvbnNpc3RlbnQoc3RydWN0IGd0OTYxMDBfcHJpdmF0ZSAqZ3ApOworc3RhdGljIGludCBndDk2MTAwX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGd0OTYxMDBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZ3Q5NjEwMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZ3Q5NjEwMF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZ3Q5NjEwMF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RhdHVzKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBndDk2MTAwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIGd0OTYxMDBfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGd0OTYxMDBfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqIGd0OTYxMDBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitleHRlcm4gY2hhciAqIF9faW5pdCBwcm9tX2dldGNtZGxpbmUodm9pZCk7CisKK3N0YXRpYyBpbnQgbWF4X2ludGVycnVwdF93b3JrID0gMzI7CisKKyNkZWZpbmUgbmlic3dhcCh4KSAoKCgoeCkgPj4gNCkgJiAweDBmKSB8ICgoKHgpIDw8IDQpICYgMHhmMCkpCisKKyNkZWZpbmUgUlVOX0FUKHgpIChqaWZmaWVzICsgKHgpKQorCisvLyBGb3IgcmVhZGluZy93cml0aW5nIDMyLWJpdCB3b3JkcyBhbmQgaGFsZi13b3JkcyBmcm9tL3RvIERNQSBtZW1vcnkKKyNpZmRlZiBERVNDX0JFCisjZGVmaW5lIGNwdV90b19kbWEzMiBjcHVfdG9fYmUzMgorI2RlZmluZSBkbWEzMl90b19jcHUgYmUzMl90b19jcHUKKyNkZWZpbmUgY3B1X3RvX2RtYTE2IGNwdV90b19iZTE2CisjZGVmaW5lIGRtYTE2X3RvX2NwdSBiZTE2X3RvX2NwdQorI2Vsc2UKKyNkZWZpbmUgY3B1X3RvX2RtYTMyIGNwdV90b19sZTMyCisjZGVmaW5lIGRtYTMyX3RvX2NwdSBsZTMyX3RvX2NwdQorI2RlZmluZSBjcHVfdG9fZG1hMTYgY3B1X3RvX2xlMTYKKyNkZWZpbmUgZG1hMTZfdG9fY3B1IGxlMTZfdG9fY3B1CisjZW5kaWYKKworc3RhdGljIGNoYXIgbWFjMFsxOF0gPSAiMDAuMDIuMDMuMDQuMDUuMDYiOworc3RhdGljIGNoYXIgbWFjMVsxOF0gPSAiMDAuMDEuMDIuMDMuMDQuMDUiOworTU9EVUxFX1BBUk0obWFjMCwgImMxOCIpOworTU9EVUxFX1BBUk0obWFjMSwgImMxOCIpOworTU9EVUxFX1BBUk1fREVTQyhtYWMwLCAiTUFDIGFkZHJlc3MgZm9yIEdUOTYxMDAgZXRoZXJuZXQgcG9ydCAwIik7CitNT0RVTEVfUEFSTV9ERVNDKG1hYzEsICJNQUMgYWRkcmVzcyBmb3IgR1Q5NjEwMCBldGhlcm5ldCBwb3J0IDEiKTsKKworLyoKKyAqIEluZm8gZm9yIHRoZSBHVDk2MTAwIGV0aGVybmV0IGNvbnRyb2xsZXIncyBwb3J0cy4KKyAqLworc3RhdGljIHN0cnVjdCBndDk2MTAwX2lmX3QgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgaW50ICBpb2Jhc2U7ICAgLy8gSU8gQmFzZSBhZGRyZXNzIG9mIHRoaXMgcG9ydAorCWludCAgICAgICAgICAgaXJxOyAgICAgIC8vIElSUSBudW1iZXIgb2YgdGhpcyBwb3J0CisJY2hhciAgICAgICAgICptYWNfc3RyOworfSBndDk2MTAwX2lmbGlzdFtOVU1fSU5URVJGQUNFU10gPSB7CisJeworCQlOVUxMLAorCQlHVDk2MTAwX0VUSDBfQkFTRSwgR1Q5NjEwMF9FVEhFUjBfSVJRLAorCQltYWMwCisJfSwKKwl7CisJCU5VTEwsCisJCUdUOTYxMDBfRVRIMV9CQVNFLCBHVDk2MTAwX0VUSEVSMV9JUlEsCisJCW1hYzEKKwl9Cit9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqCitjaGlwX25hbWUoaW50IGNoaXBfcmV2KQoreworCXN3aXRjaCAoY2hpcF9yZXYpIHsKKwljYXNlIFJFVl9HVDk2MTAwOgorCQlyZXR1cm4gIkdUOTYxMDAiOworCWNhc2UgUkVWX0dUOTYxMDBBXzE6CisJY2FzZSBSRVZfR1Q5NjEwMEE6CisJCXJldHVybiAiR1Q5NjEwMEEiOworCWRlZmF1bHQ6CisJCXJldHVybiAiVW5rbm93biBHVDk2MTAwIjsKKwl9Cit9CisKKy8qCisgIERNQSBtZW1vcnkgYWxsb2NhdGlvbiwgZGVyaXZlZCBmcm9tIHBjaV9hbGxvY19jb25zaXN0ZW50LgorKi8KK3N0YXRpYyB2b2lkICogZG1hYWxsb2Moc2l6ZV90IHNpemUsIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUpCit7CisJdm9pZCAqcmV0OworCQorCXJldCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlDIHwgR0ZQX0RNQSwgZ2V0X29yZGVyKHNpemUpKTsKKwkKKwlpZiAocmV0ICE9IE5VTEwpIHsKKwkJZG1hX2NhY2hlX2ludigodW5zaWduZWQgbG9uZylyZXQsIHNpemUpOworCQlpZiAoZG1hX2hhbmRsZSAhPSBOVUxMKQorCQkJKmRtYV9oYW5kbGUgPSB2aXJ0X3RvX3BoeXMocmV0KTsKKworCQkvKiBidW1wIHZpcnR1YWwgYWRkcmVzcyB1cCB0byBub24tY2FjaGVkIGFyZWEgKi8KKwkJcmV0ID0gKHZvaWQqKUtTRUcxQUREUihyZXQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGRtYWZyZWUoc2l6ZV90IHNpemUsIHZvaWQgKnZhZGRyKQoreworCXZhZGRyID0gKHZvaWQqKUtTRUcwQUREUih2YWRkcik7CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl2YWRkciwgZ2V0X29yZGVyKHNpemUpKTsKK30KKworc3RhdGljIHZvaWQgZ3Q5NjEwMF9kZWxheShpbnQgbXMpCit7CisJaWYgKGluX2ludGVycnVwdCgpKQorCQlyZXR1cm47CisJZWxzZQorCQltc2xlZXBfaW50ZXJydXB0aWJsZShtcyk7Cit9CisKK3N0YXRpYyBpbnQKK3BhcnNlX21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIqIG1hY3N0cikKK3sKKwlpbnQgaSwgajsKKwl1bnNpZ25lZCBjaGFyIHJlc3VsdCwgdmFsdWU7CisJCisJZm9yIChpPTA7IGk8NjsgaSsrKSB7CisJCXJlc3VsdCA9IDA7CisJCWlmIChpICE9IDUgJiYgKihtYWNzdHIrMikgIT0gJy4nKSB7CisJCQllcnIoX19GSUxFX18gImludmFsaWQgbWFjIGFkZHJlc3MgZm9ybWF0OiAlZCAlY1xuIiwKKwkJCSAgICBpLCAqKG1hY3N0cisyKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkKKwkJZm9yIChqPTA7IGo8MjsgaisrKSB7CisJCQlpZiAoaXN4ZGlnaXQoKm1hY3N0cikgJiYKKwkJCSAgICAodmFsdWUgPSBpc2RpZ2l0KCptYWNzdHIpID8gKm1hY3N0ci0nMCcgOiAKKwkJCSAgICAgdG91cHBlcigqbWFjc3RyKS0nQScrMTApIDwgMTYpIHsKKwkJCQlyZXN1bHQgPSByZXN1bHQqMTYgKyB2YWx1ZTsKKwkJCQltYWNzdHIrKzsKKwkJCX0gZWxzZSB7CisJCQkJZXJyKF9fRklMRV9fICJpbnZhbGlkIG1hYyBhZGRyZXNzICIKKwkJCQkgICAgImNoYXJhY3RlcjogJWNcbiIsICptYWNzdHIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisKKwkJbWFjc3RyKys7IC8vIHN0ZXAgb3ZlciAnLicKKwkJZGV2LT5kZXZfYWRkcltpXSA9IHJlc3VsdDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CityZWFkX01JSShpbnQgcGh5X2FkZHIsIHUzMiByZWcpCit7CisJaW50IHRpbWVkb3V0ID0gMjA7CisJdTMyIHNtaXIgPSBzbWlyT3BDb2RlIHwgKHBoeV9hZGRyIDw8IHNtaXJQaHlBZEJpdCkgfAorCQkocmVnIDw8IHNtaXJSZWdBZEJpdCk7CisKKwkvLyB3YWl0IGZvciBsYXN0IG9wZXJhdGlvbiB0byBjb21wbGV0ZQorCXdoaWxlIChHVDk2MTAwX1JFQUQoR1Q5NjEwMF9FVEhfU01JX1JFRykgJiBzbWlyQnVzeSkgeworCQkvLyBzbm9vemUgZm9yIDEgbXNlYyBhbmQgY2hlY2sgYWdhaW4KKwkJZ3Q5NjEwMF9kZWxheSgxKTsKKworCQlpZiAoLS10aW1lZG91dCA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBidXN5IHRpbWVvdXQhIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorICAgIAorCUdUOTYxMDBfV1JJVEUoR1Q5NjEwMF9FVEhfU01JX1JFRywgc21pcik7CisKKwl0aW1lZG91dCA9IDIwOworCS8vIHdhaXQgZm9yIHJlYWQgdG8gY29tcGxldGUKKwl3aGlsZSAoISgoc21pciA9IEdUOTYxMDBfUkVBRChHVDk2MTAwX0VUSF9TTUlfUkVHKSkgJiBzbWlyUmVhZFZhbGlkKSkgeworCQkvLyBzbm9vemUgZm9yIDEgbXNlYyBhbmQgY2hlY2sgYWdhaW4KKwkJZ3Q5NjEwMF9kZWxheSgxKTsKKwkKKwkJaWYgKC0tdGltZWRvdXQgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdGltZW91dCEhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlyZXR1cm4gKGludCkoc21pciAmIHNtaXJEYXRhTWFzayk7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX3R4X2Rlc2MoaW50IGRiZ19sdmwsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpKQoreworCXN0cnVjdCBndDk2MTAwX3ByaXZhdGUgKmdwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlndDk2MTAwX3RkX3QgKnRkID0gJmdwLT50eF9yaW5nW2ldOworCisJZGJnKGRiZ19sdmwsICJUeCBkZXNjcmlwdG9yIGF0IDB4JTA4bHg6XG4iLCB2aXJ0X3RvX3BoeXModGQpKTsKKwlkYmcoZGJnX2x2bCwKKwkgICAgIiAgICBjbWRzdGF0PSUwNHgsIGJ5dGVfY250PSUwNHgsIGJ1ZmZfcHRyPSUwNHgsIG5leHQ9JTA0eFxuIiwKKwkgICAgZG1hMzJfdG9fY3B1KHRkLT5jbWRzdGF0KSwKKwkgICAgZG1hMTZfdG9fY3B1KHRkLT5ieXRlX2NudCksCisJICAgIGRtYTMyX3RvX2NwdSh0ZC0+YnVmZl9wdHIpLAorCSAgICBkbWEzMl90b19jcHUodGQtPm5leHQpKTsKK30KKworc3RhdGljIHZvaWQKK2R1bXBfcnhfZGVzYyhpbnQgZGJnX2x2bCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGkpCit7CisJc3RydWN0IGd0OTYxMDBfcHJpdmF0ZSAqZ3AgPSBuZXRkZXZfcHJpdihkZXYpOworCWd0OTYxMDBfcmRfdCAqcmQgPSAmZ3AtPnJ4X3JpbmdbaV07CisKKwlkYmcoZGJnX2x2bCwgIlJ4IGRlc2NyaXB0b3IgYXQgMHglMDhseDpcbiIsIHZpcnRfdG9fcGh5cyhyZCkpOworCWRiZyhkYmdfbHZsLCAiICAgIGNtZHN0YXQ9JTA0eCwgYnVmZl9zej0lMDR4LCBieXRlX2NudD0lMDR4LCAiCisJICAgICJidWZmX3B0cj0lMDR4LCBuZXh0PSUwNHhcbiIsCisJICAgIGRtYTMyX3RvX2NwdShyZC0+Y21kc3RhdCksCisJICAgIGRtYTE2X3RvX2NwdShyZC0+YnVmZl9zeiksCisJICAgIGRtYTE2X3RvX2NwdShyZC0+Ynl0ZV9jbnQpLAorCSAgICBkbWEzMl90b19jcHUocmQtPmJ1ZmZfcHRyKSwKKwkgICAgZG1hMzJfdG9fY3B1KHJkLT5uZXh0KSk7Cit9CisKK3N0YXRpYyBpbnQKK3dyaXRlX01JSShpbnQgcGh5X2FkZHIsIHUzMiByZWcsIHUxNiBkYXRhKQoreworCWludCB0aW1lZG91dCA9IDIwOworCXUzMiBzbWlyID0gKHBoeV9hZGRyIDw8IHNtaXJQaHlBZEJpdCkgfAorCQkocmVnIDw8IHNtaXJSZWdBZEJpdCkgfCBkYXRhOworCisJLy8gd2FpdCBmb3IgbGFzdCBvcGVyYXRpb24gdG8gY29tcGxldGUKKwl3aGlsZSAoR1Q5NjEwMF9SRUFEKEdUOTYxMDBfRVRIX1NNSV9SRUcpICYgc21pckJ1c3kpIHsKKwkJLy8gc25vb3plIGZvciAxIG1zZWMgYW5kIGNoZWNrIGFnYWluCisJCWd0OTYxMDBfZGVsYXkoMSk7CisJCisJCWlmICgtLXRpbWVkb3V0ID09IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGJ1c3kgdGltZW91dCEhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJR1Q5NjEwMF9XUklURShHVDk2MTAwX0VUSF9TTUlfUkVHLCBzbWlyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2R1bXBfTUlJKGludCBkYmdfbHZsLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpLCB2YWw7CisJc3RydWN0IGd0OTYxMDBfcHJpdmF0ZSAqZ3AgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIAorCWlmIChkYmdfbHZsIDw9IEdUOTYxMDBfREVCVUcpIHsKKwkJZm9yIChpPTA7IGk8NzsgaSsrKSB7CisJCQlpZiAoKHZhbCA9IHJlYWRfTUlJKGdwLT5waHlfYWRkciwgaSkpID49IDApCisJCQkJcHJpbnRrKCJNSUkgUmVnICVkPSV4XG4iLCBpLCB2YWwpOworCQl9CisJCWZvciAoaT0xNjsgaTwyMTsgaSsrKSB7CisJCQlpZiAoKHZhbCA9IHJlYWRfTUlJKGdwLT5waHlfYWRkciwgaSkpID49IDApCisJCQkJcHJpbnRrKCJNSUkgUmVnICVkPSV4XG4iLCBpLCB2YWwpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorZHVtcF9od19hZGRyKGludCBkYmdfbHZsLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyKiBwZngsCisJICAgICB1bnNpZ25lZCBjaGFyKiBhZGRyX3N0cikKK3sKKwlpbnQgaTsKKwljaGFyIGJ1ZlsxMDBdLCBvY3RldFs1XTsKKyAgICAKKwlpZiAoZGJnX2x2bCA8PSBHVDk2MTAwX0RFQlVHKSB7CisJCXN0cmNweShidWYsIHBmeCk7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJCXNwcmludGYob2N0ZXQsICIlMi4yeCVzIiwKKwkJCQlhZGRyX3N0cltpXSwgaTw1ID8gIjoiIDogIlxuIik7CisJCQlzdHJjYXQoYnVmLCBvY3RldCk7CisJCX0KKwkJaW5mbygiJXMiLCBidWYpOworCX0KK30KKworCitzdGF0aWMgdm9pZAorZHVtcF9za2IoaW50IGRiZ19sdmwsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciogc2tiZGF0YTsKKyAgICAKKwlpZiAoZGJnX2x2bCA8PSBHVDk2MTAwX0RFQlVHKSB7CisJCWRiZyhkYmdfbHZsLCAiJXM6IHNrYj0lcCwgc2tiLT5kYXRhPSVwLCBza2ItPmxlbj0lZFxuIiwKKwkJICAgIF9fRlVOQ1RJT05fXywgc2tiLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKworCQlza2JkYXRhID0gKHVuc2lnbmVkIGNoYXIqKUtTRUcxQUREUihza2ItPmRhdGEpOworICAgIAorCQlmb3IgKGk9MDsgaTxza2ItPmxlbjsgaSsrKSB7CisJCQlpZiAoIShpICUgMTYpKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJcbiAgICUzLjN4OiAlMi4yeCwiLAorCQkJCSAgICAgICBpLCBza2JkYXRhW2ldKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJTIuMngsIiwgc2tiZGF0YVtpXSk7CisJCX0KKwkJcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7CisJfQorfQorCisKK3N0YXRpYyBpbnQKK2d0OTYxMDBfYWRkX2hhc2hfZW50cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciogYWRkcikKK3sKKwlzdHJ1Y3QgZ3Q5NjEwMF9wcml2YXRlICpncCA9IG5ldGRldl9wcml2KGRldik7CisJLy91MTYgaGFzaFJlc3VsdCwgc3RtcDsKKwkvL3Vuc2lnbmVkIGNoYXIgY3RtcCwgaGFzaF9lYVs2XTsKKwl1MzIgdGJsRW50cnkxLCB0YmxFbnRyeTAsICp0YmxFbnRyeUFkZHI7CisJaW50IGk7CisKKwl0YmxFbnRyeTEgPSBodGVWYWxpZCB8IGh0ZVJEOworCXRibEVudHJ5MSB8PSAodTMyKWFkZHJbNV0gPDwgMzsKKwl0YmxFbnRyeTEgfD0gKHUzMilhZGRyWzRdIDw8IDExOworCXRibEVudHJ5MSB8PSAodTMyKWFkZHJbM10gPDwgMTk7CisJdGJsRW50cnkxIHw9ICgodTMyKWFkZHJbMl0gJiAweDFmKSA8PCAyNzsKKwlkYmcoMywgIiVzOiB0YmxFbnRyeTE9JXhcbiIsIF9fRlVOQ1RJT05fXywgdGJsRW50cnkxKTsKKwl0YmxFbnRyeTAgPSAoKHUzMilhZGRyWzJdID4+IDUpICYgMHgwNzsKKwl0YmxFbnRyeTAgfD0gKHUzMilhZGRyWzFdIDw8IDM7CisJdGJsRW50cnkwIHw9ICh1MzIpYWRkclswXSA8PCAxMTsKKwlkYmcoMywgIiVzOiB0YmxFbnRyeTA9JXhcbiIsIF9fRlVOQ1RJT05fXywgdGJsRW50cnkwKTsKKworI2lmIDAKKworCWZvciAoaT0wOyBpPDY7IGkrKykgeworCQkvLyBuaWJibGUgc3dhcAorCQljdG1wID0gbmlic3dhcChhZGRyW2ldKTsKKwkJLy8gaW52ZXJ0IGV2ZXJ5IG5pYmJsZQorCQloYXNoX2VhW2ldID0gKChjdG1wJjEpPDwzKSB8ICgoY3RtcCY4KT4+MykgfAorCQkJKChjdG1wJjIpPDwxKSB8ICgoY3RtcCY0KT4+MSk7CisJCWhhc2hfZWFbaV0gfD0gKChjdG1wJjB4MTApPDwzKSB8ICgoY3RtcCYweDgwKT4+MykgfAorCQkJKChjdG1wJjB4MjApPDwxKSB8ICgoY3RtcCYweDQwKT4+MSk7CisJfQorCisJZHVtcF9od19hZGRyKDMsIGRldiwgIiVzOiBuaWIgc3dhcC9pbnZ0IGFkZHI9IiwgX19GVU5DVElPTl9fLCBoYXNoX2VhKTsKKyAgICAKKwlpZiAoZ3AtPmhhc2hfbW9kZSA9PSAwKSB7CisJCWhhc2hSZXN1bHQgPSAoKHUxNiloYXNoX2VhWzBdICYgMHhmYykgPDwgNzsKKwkJc3RtcCA9ICgodTE2KWhhc2hfZWFbMF0gJiAweDAzKSB8CisJCQkoKCh1MTYpaGFzaF9lYVsxXSAmIDB4N2YpIDw8IDIpOworCQlzdG1wIF49ICgoKHUxNiloYXNoX2VhWzFdID4+IDcpICYgMHgwMSkgfAorCQkJKCh1MTYpaGFzaF9lYVsyXSA8PCAxKTsKKwkJc3RtcCBePSAodTE2KWhhc2hfZWFbM10gfCAoKCh1MTYpaGFzaF9lYVs0XSAmIDEpIDw8IDgpOworCQloYXNoUmVzdWx0IHw9IHN0bXA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC0xOyAvLyBkb24ndCBzdXBwb3J0IGhhc2ggbW9kZSAxCisJfQorCisJZGJnKDMsICIlczogaGFzaFJlc3VsdD0leFxuIiwgX19GVU5DVElPTl9fLCBoYXNoUmVzdWx0KTsKKworCXRibEVudHJ5QWRkciA9CisJCSh1MzIgKikoJmdwLT5oYXNoX3RhYmxlWygodTMyKWhhc2hSZXN1bHQgJiAweDdmZikgPDwgM10pOworICAgIAorCWRiZygzLCAiJXM6IHRibEVudHJ5QWRkcj0lcFxuIiwgdGJsRW50cnlBZGRyLCBfX0ZVTkNUSU9OX18pOworCisJZm9yIChpPTA7IGk8SEFTSF9IT1BfTlVNQkVSOyBpKyspIHsKKwkJaWYgKCgqdGJsRW50cnlBZGRyICYgaHRlVmFsaWQpICYmCisJCSAgICAhKCp0YmxFbnRyeUFkZHIgJiBodGVTa2lwKSkgeworCQkJLy8gVGhpcyBlbnRyeSBpcyBhbHJlYWR5IG9jY3VwaWVkLCBnbyB0byBuZXh0IGVudHJ5CisJCQl0YmxFbnRyeUFkZHIgKz0gMjsKKwkJCWRiZygzLCAiJXM6IHNraXBwaW5nIHRvICVwXG4iLCBfX0ZVTkNUSU9OX18sIAorCQkJICAgIHRibEVudHJ5QWRkcik7CisJCX0gZWxzZSB7CisJCQltZW1zZXQodGJsRW50cnlBZGRyLCAwLCA4KTsKKwkJCXRibEVudHJ5QWRkclsxXSA9IGNwdV90b19kbWEzMih0YmxFbnRyeTEpOworCQkJdGJsRW50cnlBZGRyWzBdID0gY3B1X3RvX2RtYTMyKHRibEVudHJ5MCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID49IEhBU0hfSE9QX05VTUJFUikgeworCQllcnIoIiVzOiBleHBpcmVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOyAvLyBDb3VsZG4ndCBmaW5kIGFuIHVudXNlZCBlbnRyeQorCX0KKworI2Vsc2UKKworCXRibEVudHJ5QWRkciA9ICh1MzIgKilncC0+aGFzaF90YWJsZTsKKwlmb3IgKGk9MDsgaTxSWF9IQVNIX1RBQkxFX1NJWkUvNDsgaSs9MikgeworCQl0YmxFbnRyeUFkZHJbaSsxXSA9IGNwdV90b19kbWEzMih0YmxFbnRyeTEpOworCQl0YmxFbnRyeUFkZHJbaV0gPSBjcHVfdG9fZG1hMzIodGJsRW50cnkwKTsKKwl9CisKKyNlbmRpZgorICAgIAorCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkCityZWFkX21pYl9jb3VudGVycyhzdHJ1Y3QgZ3Q5NjEwMF9wcml2YXRlICpncCkKK3sKKwl1MzIqIG1pYl9yZWdzID0gKHUzMiopJmdwLT5taWI7CisJaW50IGk7CisgICAgCisJZm9yIChpPTA7IGk8c2l6ZW9mKG1pYl9jb3VudGVyc190KS9zaXplb2YodTMyKTsgaSsrKQorCQltaWJfcmVnc1tpXSA9IEdUOTYxMDBFVEhfUkVBRChncCwgR1Q5NjEwMF9FVEhfTUlCX0NPVU5UX0JBU0UgKworCQkJCQkgICAgICBpKnNpemVvZih1MzIpKTsKK30KKworCitzdGF0aWMgdm9pZAordXBkYXRlX3N0YXRzKHN0cnVjdCBndDk2MTAwX3ByaXZhdGUgKmdwKQoreworCW1pYl9jb3VudGVyc190ICptaWIgPSAmZ3AtPm1pYjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmZ3AtPnN0YXRzOworICAgIAorCXJlYWRfbWliX2NvdW50ZXJzKGdwKTsKKyAgICAKKwlzdGF0cy0+cnhfcGFja2V0cyA9IG1pYi0+dG90YWxGcmFtZXNSZWNlaXZlZDsKKwlzdGF0cy0+dHhfcGFja2V0cyA9IG1pYi0+ZnJhbWVzU2VudDsKKwlzdGF0cy0+cnhfYnl0ZXMgPSBtaWItPnRvdGFsQnl0ZVJlY2VpdmVkOworCXN0YXRzLT50eF9ieXRlcyA9IG1pYi0+Ynl0ZVNlbnQ7CisJc3RhdHMtPnJ4X2Vycm9ycyA9IG1pYi0+dG90YWxGcmFtZXNSZWNlaXZlZCAtIG1pYi0+ZnJhbWVzUmVjZWl2ZWQ7CisJLy90aGUgdHggZXJyb3IgY291bnRlcnMgYXJlIGluY3JlbWVudGVkIGJ5IHRoZSBJU1IKKwkvL3J4X2Ryb3BwZWQgaW5jcmVtZW50ZWQgYnkgZ3Q5NjEwMF9yeAorCS8vdHhfZHJvcHBlZCBpbmNyZW1lbnRlZCBieSBndDk2MTAwX3R4CisJc3RhdHMtPm11bHRpY2FzdCA9IG1pYi0+bXVsdGljYXN0RnJhbWVzUmVjZWl2ZWQ7CisJLy8gY29sbGlzaW9ucyBpbmNyZW1lbnRlZCBieSBndDk2MTAwX3R4X2NvbXBsZXRlCisJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgPSBtaWItPm92ZXJzaXplRnJhbWVzICsgbWliLT5mcmFnbWVudHM7CisJLy8gVGhlIFJ4RXJyb3IgY29uZGl0aW9uIG1lYW5zIHRoZSBSeCBETUEgZW5jb3VudGVyZWQgYQorCS8vIENQVSBvd25lZCBkZXNjcmlwdG9yLCB3aGljaCwgaWYgdGhpbmdzIGFyZSB3b3JraW5nIGFzCisJLy8gdGhleSBzaG91bGQsIG1lYW5zIHRoZSBSeCByaW5nIGhhcyBvdmVyZmxvd2VkLgorCXN0YXRzLT5yeF9vdmVyX2Vycm9ycyA9IG1pYi0+bWFjUnhFcnJvcjsKKwlzdGF0cy0+cnhfY3JjX2Vycm9ycyA9IG1pYi0+Y1JDRXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkCithYm9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgYWJvcnRfYml0cykKK3sKKwlzdHJ1Y3QgZ3Q5NjEwMF9wcml2YXRlICpncCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHRpbWVkb3V0ID0gMTAwOyAvLyB3YWl0IHVwIHRvIDEwMCBtc2VjIGZvciBoYXJkIHN0b3AgdG8gY29tcGxldGUKKworCWRiZygzLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvLyBSZXR1cm4gaWYgbmVpdGhlciBSeCBvciBUeCBhYm9ydCBiaXRzIGFyZSBzZXQKKwlpZiAoIShhYm9ydF9iaXRzICYgKHNkY21yQVIgfCBzZGNtckFUKSkpCisJCXJldHVybjsKKworCS8vIG1ha2Ugc3VyZSBvbmx5IHRoZSBSeC9UeCBhYm9ydCBiaXRzIGFyZSBzZXQKKwlhYm9ydF9iaXRzICY9IChzZGNtckFSIHwgc2RjbXJBVCk7CisgICAgCisJc3Bpbl9sb2NrKCZncC0+bG9jayk7CisKKwkvLyBhYm9ydCBhbnkgUngvVHggRE1BIGltbWVkaWF0ZWx5CisJR1Q5NjEwMEVUSF9XUklURShncCwgR1Q5NjEwMF9FVEhfU0RNQV9DT01NLCBhYm9ydF9iaXRzKTsKKworCWRiZygzLCAiJXM6IFNETUEgY29tbSA9ICV4XG4iLCBfX0ZVTkNUSU9OX18sCisJICAgIEdUOTYxMDBFVEhfUkVBRChncCwgR1Q5NjEwMF9FVEhfU0RNQV9DT01NKSk7CisKKwkvLyB3YWl0IGZvciBhYm9ydCB0byBjb21wbGV0ZQorCXdoaWxlIChHVDk2MTAwRVRIX1JFQUQoZ3AsIEdUOTYxMDBfRVRIX1NETUFfQ09NTSkgJiBhYm9ydF9iaXRzKSB7CisJCS8vIHNub296ZSBmb3IgMSBtc2VjIGFuZCBjaGVjayBhZ2FpbgorCQlndDk2MTAwX2RlbGF5KDEpOworCQorCQlpZiAoLS10aW1lZG91dCA9PSAwKSB7CisJCQllcnIoIiVzOiB0aW1lb3V0ISFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZncC0+bG9jayk7Cit9CisKKworc3RhdGljIHZvaWQKK2hhcmRfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBndDk2MTAwX3ByaXZhdGUgKmdwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWRiZygzLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlkaXNhYmxlX2V0aGVyX2lycShkZXYpOworCisJYWJvcnQoZGV2LCBzZGNtckFSIHwgc2RjbXJBVCk7CisKKwkvLyBkaXNhYmxlIHBvcnQKKwlHVDk2MTAwRVRIX1dSSVRFKGdwLCBHVDk2MTAwX0VUSF9QT1JUX0NPTkZJRywgMCk7Cit9CisKKworc3RhdGljIHZvaWQKK2VuYWJsZV9ldGhlcl9pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ3Q5NjEwMF9wcml2YXRlICpncCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIGludE1hc2s7CisJLyoKKwkgKiByb3V0ZSBldGhlcm5ldCBpbnRlcnJ1cHQgdG8gR1RfU0VSSU5UMCBmb3IgcG9ydCAwLAorCSAqIEdUX0lOVDAgZm9yIHBvcnQgMS4KKwkgKi8KKwlpbnQgaW50cl9tYXNrX3JlZyA9IChncC0+cG9ydF9udW0gPT0gMCkgPworCQlHVDk2MTAwX1NFUklOVDBfTUFTSyA6IEdUOTYxMDBfSU5UMF9ISUdIX01BU0s7CisJCisJaWYgKGdwLT5jaGlwX3JldiA+PSBSRVZfR1Q5NjEwMEFfMSkgeworCQlpbnRNYXNrID0gaWNyVHhCdWZmZXJMb3cgfCBpY3JUeEVuZExvdyB8CisJCQlpY3JUeEVycm9yTG93ICB8IGljclJ4T1ZSIHwgaWNyVHhVZHIgfAorCQkJaWNyUnhCdWZmZXJRMCB8IGljclJ4RXJyb3JRMCB8CisJCQlpY3JNSUlQaHlTVEMgfCBpY3JFdGhlckludFN1bTsKKwl9CisJZWxzZSB7CisJCWludE1hc2sgPSBpY3JUeEJ1ZmZlckxvdyB8IGljclR4RW5kTG93IHwKKwkJCWljclR4RXJyb3JMb3cgIHwgaWNyUnhPVlIgfCBpY3JUeFVkciB8CisJCQlpY3JSeEJ1ZmZlciB8IGljclJ4RXJyb3IgfAorCQkJaWNyTUlJUGh5U1RDIHwgaWNyRXRoZXJJbnRTdW07CisJfQorCQorCS8vIHVubWFzayBpbnRlcnJ1cHRzCisJR1Q5NjEwMEVUSF9XUklURShncCwgR1Q5NjEwMF9FVEhfSU5UX01BU0ssIGludE1hc2spOworICAgIAorCWludE1hc2sgPSBHVDk2MTAwX1JFQUQoaW50cl9tYXNrX3JlZyk7CisJaW50TWFzayB8PSAxPDxncC0+cG9ydF9udW07CisJR1Q5NjEwMF9XUklURShpbnRyX21hc2tfcmVnLCBpbnRNYXNrKTsKK30KKworc3RhdGljIHZvaWQKK2Rpc2FibGVfZXRoZXJfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGd0OTYxMDBfcHJpdmF0ZSAqZ3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBpbnRNYXNrOworCWludCBpbnRyX21hc2tfcmVnID0gKGdwLT5wb3J0X251bSA9PSAwKSA/CisJCUdUOTYxMDBfU0VSSU5UMF9NQVNLIDogR1Q5NjEwMF9JTlQwX0hJR0hfTUFTSzsKKworCWludE1hc2sgPSBHVDk2MTAwX1JFQUQoaW50cl9tYXNrX3JlZyk7CisJaW50TWFzayAmPSB+KDE8PGdwLT5wb3J0X251bSk7CisJR1Q5NjEwMF9XUklURShpbnRyX21hc2tfcmVnLCBpbnRNYXNrKTsKKyAgICAKKwlHVDk2MTAwRVRIX1dSSVRFKGdwLCBHVDk2MTAwX0VUSF9JTlRfTUFTSywgMCk7Cit9CisKKworLyoKKyAqIEluaXQgR1Q5NjEwMCBldGhlcm5ldCBjb250cm9sbGVyIGRyaXZlcgorICovCitzdGF0aWMgaW50IGd0OTYxMDBfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpOworCWludCBpLCByZXR2YWw9MDsKKwl1MzIgY3B1Q29uZmlnOworCisJLyoKKwkgKiBTdHVwaWQgcHJvYmUgYmVjYXVzZSB0aGlzIHJlYWxseSBpc24ndCBhIFBDSSBkZXZpY2UKKwkgKi8KKwlpZiAoIShwY2kgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfREVWSUNFX0lEX01BUlZFTExfR1Q5NjEwMCwgTlVMTCkpICYmCisJICAgICEocGNpID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwKKwkJICAgICAgICAgICAgICAgICAgICBQQ0lfREVWSUNFX0lEX01BUlZFTExfR1Q5NjEwMEEsIE5VTEwpKSkgeworCQlwcmludGsoS0VSTl9FUlIgX19GSUxFX18gIjogR1Q5NjEwMCBub3QgZm91bmQhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJY3B1Q29uZmlnID0gR1Q5NjEwMF9SRUFEKEdUOTYxMDBfQ1BVX0lOVEVSRl9DT05GSUcpOworCWlmIChjcHVDb25maWcgJiAoMTw8MTIpKSB7CisJCXByaW50ayhLRVJOX0VSUiBfX0ZJTEVfXworCQkgICAgICAgIjogbXVzdCBiZSBpbiBCaWcgRW5kaWFuIG1vZGUhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZm9yIChpPTA7IGkgPCBOVU1fSU5URVJGQUNFUzsgaSsrKQorCQlyZXR2YWwgfD0gZ3Q5NjEwMF9wcm9iZTEocGNpLCBpKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGd0OTYxMDBfcHJvYmUxKHN0cnVjdCBwY2lfZGV2ICpwY2ksIGludCBwb3J0X251bSkKK3sKKwlzdHJ1Y3QgZ3Q5NjEwMF9wcml2YXRlICpncCA9IE5VTEw7CisJc3RydWN0IGd0OTYxMDBfaWZfdCAqZ3RpZiA9ICZndDk2MTAwX2lmbGlzdFtwb3J0X251bV07CisJaW50IHBoeV9hZGRyLCBwaHlfaWQxLCBwaHlfaWQyOworCXUzMiBwaHlBRDsKKwlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGNoYXIgY2hpcF9yZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisgICAgCisJaWYgKGd0aWYtPmlycSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaXJxIHVua25vd24gLSBwcm9iaW5nIG5vdCBzdXBwb3J0ZWRcbiIsCisJCSAgICAgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKyAgICAKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2ksIFBDSV9SRVZJU0lPTl9JRCwgJmNoaXBfcmV2KTsKKworCWlmIChjaGlwX3JldiA+PSBSRVZfR1Q5NjEwMEFfMSkgeworCQlwaHlBRCA9IEdUOTYxMDBfUkVBRChHVDk2MTAwX0VUSF9QSFlfQUREUl9SRUcpOworCQlwaHlfYWRkciA9IChwaHlBRCA+PiAoNSpwb3J0X251bSkpICYgMHgxZjsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBub3Qgc3VyZSB3aGF0J3MgdGhpcyBhYm91dCAtLSBwcm9iYWJseSBhIGd0IGJ1ZworCQkgKi8KKwkJcGh5X2FkZHIgPSBwb3J0X251bTsKKwkJcGh5QUQgPSBHVDk2MTAwX1JFQUQoR1Q5NjEwMF9FVEhfUEhZX0FERFJfUkVHKTsKKwkJcGh5QUQgJj0gfigweDFmIDw8IChwb3J0X251bSo1KSk7CisJCXBoeUFEIHw9IHBoeV9hZGRyIDw8IChwb3J0X251bSo1KTsKKwkJR1Q5NjEwMF9XUklURShHVDk2MTAwX0VUSF9QSFlfQUREUl9SRUcsIHBoeUFEKTsKKwl9CisJCisJLy8gcHJvYmUgZm9yIHRoZSBleHRlcm5hbCBQSFkKKwlpZiAoKHBoeV9pZDEgPSByZWFkX01JSShwaHlfYWRkciwgMikpIDw9IDAgfHwKKwkgICAgKHBoeV9pZDIgPSByZWFkX01JSShwaHlfYWRkciwgMykpIDw9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gUEhZIGZvdW5kIG9uIE1JSSVkXG4iLCBfX0ZVTkNUSU9OX18sIHBvcnRfbnVtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCQorCWlmICghcmVxdWVzdF9yZWdpb24oZ3RpZi0+aW9iYXNlLCBHVDk2MTAwX0VUSF9JT19TSVpFLCAiR1Q5NjEwMEVUSCIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlcXVlc3RfcmVnaW9uIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGd0OTYxMDBfcHJpdmF0ZSkpOworCWlmICghZGV2KQorCQlnb3RvIG91dDsKKwlndGlmLT5kZXYgPSBkZXY7CisJCisJLyogcHJpdmF0ZSBzdHJ1Y3QgYWxpZ25lZCBhbmQgemVyb2VkIGJ5IGFsbG9jX2V0aGVyZGV2ICovCisJLyogRmlsbCBpbiB0aGUgJ2RldicgZmllbGRzLiAqLworCWRldi0+YmFzZV9hZGRyID0gZ3RpZi0+aW9iYXNlOworCWRldi0+aXJxID0gZ3RpZi0+aXJxOworCisJaWYgKChyZXR2YWwgPSBwYXJzZV9tYWNfYWRkcihkZXYsIGd0aWYtPm1hY19zdHIpKSkgeworCQllcnIoIiVzOiBNQUMgYWRkcmVzcyBwYXJzZSBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0MTsKKwl9CisKKwlncCA9IG5ldGRldl9wcml2KGRldik7CisKKwltZW1zZXQoZ3AsIDAsIHNpemVvZigqZ3ApKTsgLy8gY2xlYXIgaXQKKworCWdwLT5wb3J0X251bSA9IHBvcnRfbnVtOworCWdwLT5pb19zaXplID0gR1Q5NjEwMF9FVEhfSU9fU0laRTsKKwlncC0+cG9ydF9vZmZzZXQgPSBwb3J0X251bSAqIEdUOTYxMDBfRVRIX0lPX1NJWkU7CisJZ3AtPnBoeV9hZGRyID0gcGh5X2FkZHI7CisJZ3AtPmNoaXBfcmV2ID0gY2hpcF9yZXY7CisKKwlpbmZvKCIlcyBmb3VuZCBhdCAweCV4LCBpcnEgJWRcbiIsCisJICAgICBjaGlwX25hbWUoZ3AtPmNoaXBfcmV2KSwgZ3RpZi0+aW9iYXNlLCBndGlmLT5pcnEpOworCWR1bXBfaHdfYWRkcigwLCBkZXYsICJIVyBBZGRyZXNzICIsIGRldi0+ZGV2X2FkZHIpOworCWluZm8oIiVzIGNoaXAgcmV2aXNpb249JWRcbiIsIGNoaXBfbmFtZShncC0+Y2hpcF9yZXYpLCBncC0+Y2hpcF9yZXYpOworCWluZm8oIiVzIGV0aGVybmV0IHBvcnQgJWRcbiIsIGNoaXBfbmFtZShncC0+Y2hpcF9yZXYpLCBncC0+cG9ydF9udW0pOworCWluZm8oImV4dGVybmFsIFBIWSBJRDE9MHglMDR4LCBJRDI9MHglMDR4XG4iLCBwaHlfaWQxLCBwaHlfaWQyKTsKKworCS8vIEFsbG9jYXRlIFJ4IGFuZCBUeCBkZXNjcmlwdG9yIHJpbmdzCisJaWYgKGdwLT5yeF9yaW5nID09IE5VTEwpIHsKKwkJLy8gQWxsIGRlc2NyaXB0b3JzIGluIHJpbmcgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQKKwkJZ3AtPnJ4X3JpbmcgPSBkbWFhbGxvYyhzaXplb2YoZ3Q5NjEwMF9yZF90KSAqIFJYX1JJTkdfU0laRQorCQkJCSAgICAgICArIHNpemVvZihndDk2MTAwX3RkX3QpICogVFhfUklOR19TSVpFLAorCQkJCSAgICAgICAmZ3AtPnJ4X3JpbmdfZG1hKTsKKwkJaWYgKGdwLT5yeF9yaW5nID09IE5VTEwpIHsKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDE7CisJCX0KKwkKKwkJZ3AtPnR4X3JpbmcgPSAoZ3Q5NjEwMF90ZF90ICopKGdwLT5yeF9yaW5nICsgUlhfUklOR19TSVpFKTsKKwkJZ3AtPnR4X3JpbmdfZG1hID0KKwkJCWdwLT5yeF9yaW5nX2RtYSArIHNpemVvZihndDk2MTAwX3JkX3QpICogUlhfUklOR19TSVpFOworCX0KKyAgICAKKwkvLyBBbGxvY2F0ZSB0aGUgUnggRGF0YSBCdWZmZXJzCisJaWYgKGdwLT5yeF9idWZmID09IE5VTEwpIHsKKwkJZ3AtPnJ4X2J1ZmYgPSBkbWFhbGxvYyhQS1RfQlVGX1NaKlJYX1JJTkdfU0laRSwKKwkJCQkgICAgICAgJmdwLT5yeF9idWZmX2RtYSk7CisJCWlmIChncC0+cnhfYnVmZiA9PSBOVUxMKSB7CisJCQlyZXR2YWwgPSAtRU5PTUVNOworCQkJZ290byBvdXQyOworCQl9CisJfQorICAgIAorCWRiZygzLCAiJXM6IHJ4X3Jpbmc9JXAsIHR4X3Jpbmc9JXBcbiIsIF9fRlVOQ1RJT05fXywKKwkgICAgZ3AtPnJ4X3JpbmcsIGdwLT50eF9yaW5nKTsKKworCS8vIEFsbG9jYXRlIFJ4IEhhc2ggVGFibGUKKwlpZiAoZ3AtPmhhc2hfdGFibGUgPT0gTlVMTCkgeworCQlncC0+aGFzaF90YWJsZSA9IChjaGFyKilkbWFhbGxvYyhSWF9IQVNIX1RBQkxFX1NJWkUsCisJCQkJCQkgJmdwLT5oYXNoX3RhYmxlX2RtYSk7CisJCWlmIChncC0+aGFzaF90YWJsZSA9PSBOVUxMKSB7CisJCQlyZXR2YWwgPSAtRU5PTUVNOworCQkJZ290byBvdXQzOworCQl9CisJfQorICAgIAorCWRiZygzLCAiJXM6IGhhc2g9JXBcbiIsIF9fRlVOQ1RJT05fXywgZ3AtPmhhc2hfdGFibGUpOworCisJc3Bpbl9sb2NrX2luaXQoJmdwLT5sb2NrKTsKKyAgICAKKwlkZXYtPm9wZW4gPSBndDk2MTAwX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBndDk2MTAwX3R4OworCWRldi0+c3RvcCA9IGd0OTYxMDBfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSBndDk2MTAwX2dldF9zdGF0czsKKwkvL2Rldi0+ZG9faW9jdGwgPSBndDk2MTAwX2lvY3RsOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gZ3Q5NjEwMF9zZXRfcnhfbW9kZTsKKwlkZXYtPnR4X3RpbWVvdXQgPSBndDk2MTAwX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IEdUOTYxMDBFVEhfVFhfVElNRU9VVDsKKworCXJldHZhbCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0NDsKKwlyZXR1cm4gMDsKKworb3V0NDoKKwlkbWFmcmVlKFJYX0hBU0hfVEFCTEVfU0laRSwgZ3AtPmhhc2hfdGFibGVfZG1hKTsKK291dDM6CisJZG1hZnJlZShQS1RfQlVGX1NaKlJYX1JJTkdfU0laRSwgZ3AtPnJ4X2J1ZmYpOworb3V0MjoKKwlkbWFmcmVlKHNpemVvZihndDk2MTAwX3JkX3QpICogUlhfUklOR19TSVpFCisJCSsgc2l6ZW9mKGd0OTYxMDBfdGRfdCkgKiBUWF9SSU5HX1NJWkUsCisJCWdwLT5yeF9yaW5nKTsKK291dDE6CisJZnJlZV9uZXRkZXYgKGRldik7CitvdXQ6CisJcmVsZWFzZV9yZWdpb24oZ3RpZi0+aW9iYXNlLCBHVDk2MTAwX0VUSF9JT19TSVpFKTsKKworCWVycigiJXMgZmFpbGVkLiAgUmV0dXJucyAlZFxuIiwgX19GVU5DVElPTl9fLCByZXR2YWwpOworCXJldHVybiByZXR2YWw7Cit9CisKKworc3RhdGljIHZvaWQKK3Jlc2V0X3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGd0OTYxMDBfcHJpdmF0ZSAqZ3AgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJYWJvcnQoZGV2LCBzZGNtckFUKTsKKworCWZvciAoaT0wOyBpPFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCWlmIChncC0+dHhfc2tidWZmW2ldKSB7CisJCQlpZiAoaW5faW50ZXJydXB0KCkpCisJCQkJZGV2X2tmcmVlX3NrYl9pcnEoZ3AtPnR4X3NrYnVmZltpXSk7CisJCQllbHNlCisJCQkJZGV2X2tmcmVlX3NrYihncC0+dHhfc2tidWZmW2ldKTsKKwkJCWdwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQl9CisKKwkJZ3AtPnR4X3JpbmdbaV0uY21kc3RhdCA9IDA7IC8vIENQVSBvd25zCisJCWdwLT50eF9yaW5nW2ldLmJ5dGVfY250ID0gMDsKKwkJZ3AtPnR4X3JpbmdbaV0uYnVmZl9wdHIgPSAwOworCQlncC0+dHhfcmluZ1tpXS5uZXh0ID0KKwkJCWNwdV90b19kbWEzMihncC0+dHhfcmluZ19kbWEgKworCQkJCSAgICAgc2l6ZW9mKGd0OTYxMDBfdGRfdCkgKiAoaSsxKSk7CisJCWR1bXBfdHhfZGVzYyg0LCBkZXYsIGkpOworCX0KKwkvKiBXcmFwIHRoZSByaW5nLiAqLworCWdwLT50eF9yaW5nW2ktMV0ubmV4dCA9IGNwdV90b19kbWEzMihncC0+dHhfcmluZ19kbWEpOworICAgIAorCS8vIHNldHVwIG9ubHkgdGhlIGxvd2VzdCBwcmlvcml0eSBUeENEUCByZWcKKwlHVDk2MTAwRVRIX1dSSVRFKGdwLCBHVDk2MTAwX0VUSF9DVVJSX1RYX0RFU0NfUFRSMCwgZ3AtPnR4X3JpbmdfZG1hKTsKKwlHVDk2MTAwRVRIX1dSSVRFKGdwLCBHVDk2MTAwX0VUSF9DVVJSX1RYX0RFU0NfUFRSMSwgMCk7CisKKwkvLyBpbml0IFR4IGluZGVjZXMgYW5kIHBrdCBjb3VudGVyCisJZ3AtPnR4X25leHRfaW4gPSBncC0+dHhfbmV4dF9vdXQgPSAwOworCWdwLT50eF9jb3VudCA9IDA7CisKK30KKworc3RhdGljIHZvaWQKK3Jlc2V0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGd0OTYxMDBfcHJpdmF0ZSAqZ3AgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJYWJvcnQoZGV2LCBzZGNtckFSKTsKKyAgICAKKwlmb3IgKGk9MDsgaTxSWF9SSU5HX1NJWkU7IGkrKykgeworCQlncC0+cnhfcmluZ1tpXS5uZXh0ID0KKwkJCWNwdV90b19kbWEzMihncC0+cnhfcmluZ19kbWEgKworCQkJCSAgICAgc2l6ZW9mKGd0OTYxMDBfcmRfdCkgKiAoaSsxKSk7CisJCWdwLT5yeF9yaW5nW2ldLmJ1ZmZfcHRyID0KKwkJCWNwdV90b19kbWEzMihncC0+cnhfYnVmZl9kbWEgKyBpKlBLVF9CVUZfU1opOworCQlncC0+cnhfcmluZ1tpXS5idWZmX3N6ID0gY3B1X3RvX2RtYTE2KFBLVF9CVUZfU1opOworCQkvLyBHaXZlIG93bmVyc2hpcCB0byBkZXZpY2UsIHNldCBmaXJzdCBhbmQgbGFzdCwgZW5hYmxlIGludHIKKwkJZ3AtPnJ4X3JpbmdbaV0uY21kc3RhdCA9CisJCQljcHVfdG9fZG1hMzIoKHUzMikocnhGaXJzdCB8IHJ4TGFzdCB8IHJ4T3duIHwgcnhFSSkpOworCQlkdW1wX3J4X2Rlc2MoNCwgZGV2LCBpKTsKKwl9CisJLyogV3JhcCB0aGUgcmluZy4gKi8KKwlncC0+cnhfcmluZ1tpLTFdLm5leHQgPSBjcHVfdG9fZG1hMzIoZ3AtPnJ4X3JpbmdfZG1hKTsKKworCS8vIFNldHVwIG9ubHkgdGhlIGxvd2VzdCBwcmlvcml0eSBSeEZEUCBhbmQgUnhDRFAgcmVncworCWZvciAoaT0wOyBpPDQ7IGkrKykgeworCQlpZiAoaSA9PSAwKSB7CisJCQlHVDk2MTAwRVRIX1dSSVRFKGdwLCBHVDk2MTAwX0VUSF8xU1RfUlhfREVTQ19QVFIwLAorCQkJCQkgZ3AtPnJ4X3JpbmdfZG1hKTsKKwkJCUdUOTYxMDBFVEhfV1JJVEUoZ3AsIEdUOTYxMDBfRVRIX0NVUlJfUlhfREVTQ19QVFIwLAorCQkJCQkgZ3AtPnJ4X3JpbmdfZG1hKTsKKwkJfSBlbHNlIHsKKwkJCUdUOTYxMDBFVEhfV1JJVEUoZ3AsCisJCQkJCSBHVDk2MTAwX0VUSF8xU1RfUlhfREVTQ19QVFIwICsgaSo0LAorCQkJCQkgMCk7CisJCQlHVDk2MTAwRVRIX1dSSVRFKGdwLAorCQkJCQkgR1Q5NjEwMF9FVEhfQ1VSUl9SWF9ERVNDX1BUUjAgKyBpKjQsCisJCQkJCSAwKTsKKwkJfQorCX0KKworCS8vIGluaXQgUnggTmV4dE91dCBpbmRleAorCWdwLT5yeF9uZXh0X291dCA9IDA7Cit9CisKKworLy8gUmV0dXJucyAxIGlmIHRoZSBUeCBjb3VudGVyIGFuZCBpbmRlY2VzIGRvbid0IGdlbAorc3RhdGljIGludAorZ3Q5NjEwMF9jaGVja190eF9jb25zaXN0ZW50KHN0cnVjdCBndDk2MTAwX3ByaXZhdGUgKmdwKQoreworCWludCBkaWZmID0gZ3AtPnR4X25leHRfaW4gLSBncC0+dHhfbmV4dF9vdXQ7CisKKwlkaWZmID0gZGlmZjwwID8gVFhfUklOR19TSVpFICsgZGlmZiA6IGRpZmY7CisJZGlmZiA9IGdwLT50eF9jb3VudCA9PSBUWF9SSU5HX1NJWkUgPyBkaWZmICsgVFhfUklOR19TSVpFIDogZGlmZjsKKyAgICAKKwlyZXR1cm4gKGRpZmYgIT0gZ3AtPnR4X2NvdW50KTsKK30KKworc3RhdGljIGludAorZ3Q5NjEwMF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGd0OTYxMDBfcHJpdmF0ZSAqZ3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiB0bXA7CisJdTE2IG1paV9yZWc7CisgICAgCisJZGJnKDMsICIlczogZGV2PSVwXG4iLCBfX0ZVTkNUSU9OX18sIGRldik7CisJZGJnKDMsICIlczogc2NzMTBfbG89JTR4LCBzY3MxMF9oaT0lNHhcbiIsIF9fRlVOQ1RJT05fXywgCisJICAgIEdUOTYxMDBfUkVBRCgweDgpLCBHVDk2MTAwX1JFQUQoMHgxMCkpOworCWRiZygzLCAiJXM6IHNjczMyX2xvPSU0eCwgc2NzMzJfaGk9JTR4XG4iLCBfX0ZVTkNUSU9OX18sCisJICAgIEdUOTYxMDBfUkVBRCgweDE4KSwgR1Q5NjEwMF9SRUFEKDB4MjApKTsKKyAgICAKKwkvLyBTdG9wIGFuZCBkaXNhYmxlIFBvcnQKKwloYXJkX3N0b3AoZGV2KTsKKyAgICAKKwkvLyBTZXR1cCBDSVUgQXJiaXRlcgorCXRtcCA9IEdUOTYxMDBfUkVBRChHVDk2MTAwX0NJVV9BUkJJVEVSX0NPTkZJRyk7CisJdG1wIHw9ICgweDBjIDw8IChncC0+cG9ydF9udW0qMikpOyAvLyBzZXQgRXRoZXIgRE1BIHJlcSBwcmlvcml0eSB0byBoaQorI2lmbmRlZiBERVNDX0JFCisJdG1wICY9IH4oMTw8MzEpOyAgICAgICAgICAgICAgICAgICAvLyBzZXQgZGVzYyBlbmRpYW5lc3MgdG8gbGl0dGxlCisjZWxzZQorCXRtcCB8PSAoMTw8MzEpOworI2VuZGlmCisJR1Q5NjEwMF9XUklURShHVDk2MTAwX0NJVV9BUkJJVEVSX0NPTkZJRywgdG1wKTsKKwlkYmcoMywgIiVzOiBDSVUgQ29uZmlnPSV4LyV4XG4iLCBfX0ZVTkNUSU9OX18sIAorCSAgICB0bXAsIEdUOTYxMDBfUkVBRChHVDk2MTAwX0NJVV9BUkJJVEVSX0NPTkZJRykpOworCisJLy8gU2V0IHJvdXRpbmcuCisJdG1wID0gR1Q5NjEwMF9SRUFEKEdUOTYxMDBfUk9VVEVfTUFJTikgJiAoMHgzZiA8PCAxOCk7CisJdG1wIHw9ICgweDA3IDw8ICgxOCArIGdwLT5wb3J0X251bSozKSk7CisJR1Q5NjEwMF9XUklURShHVDk2MTAwX1JPVVRFX01BSU4sIHRtcCk7CisKKwkvKiBzZXQgTUlJIGFzIHBlcmlwaGVyYWwgZnVuYyAqLworCXRtcCA9IEdUOTYxMDBfUkVBRChHVDk2MTAwX0dQUF9DT05GSUcyKTsKKwl0bXAgfD0gMHg3ZmZmIDw8IChncC0+cG9ydF9udW0qMTYpOworCUdUOTYxMDBfV1JJVEUoR1Q5NjEwMF9HUFBfQ09ORklHMiwgdG1wKTsKKwkKKwkvKiBTZXQgdXAgTUlJIHBvcnQgcGluIGRpcmVjdGlvbnMgKi8KKwl0bXAgPSBHVDk2MTAwX1JFQUQoR1Q5NjEwMF9HUFBfSU8yKTsKKwl0bXAgfD0gMHgwMDNkIDw8IChncC0+cG9ydF9udW0qMTYpOworCUdUOTYxMDBfV1JJVEUoR1Q5NjEwMF9HUFBfSU8yLCB0bXApOworCisJLy8gU2V0LXVwIGhhc2ggdGFibGUKKwltZW1zZXQoZ3AtPmhhc2hfdGFibGUsIDAsIFJYX0hBU0hfVEFCTEVfU0laRSk7IC8vIGNsZWFyIGl0CisJZ3AtPmhhc2hfbW9kZSA9IDA7CisJLy8gQWRkIGEgc2luZ2xlIGVudHJ5IHRvIGhhc2ggdGFibGUgLSBvdXIgZXRoZXJuZXQgYWRkcmVzcworCWd0OTYxMDBfYWRkX2hhc2hfZW50cnkoZGV2LCBkZXYtPmRldl9hZGRyKTsKKwkvLyBTZXQtdXAgRE1BIHB0ciB0byBoYXNoIHRhYmxlCisJR1Q5NjEwMEVUSF9XUklURShncCwgR1Q5NjEwMF9FVEhfSEFTSF9UQkxfUFRSLCBncC0+aGFzaF90YWJsZV9kbWEpOworCWRiZygzLCAiJXM6IEhhc2ggVGJsIFB0cj0leFxuIiwgX19GVU5DVElPTl9fLAorCSAgICBHVDk2MTAwRVRIX1JFQUQoZ3AsIEdUOTYxMDBfRVRIX0hBU0hfVEJMX1BUUikpOworCisJLy8gU2V0dXAgVHgKKwlyZXNldF90eChkZXYpOworCisJZGJnKDMsICIlczogQ3VyciBUeCBEZXNjIFB0cjA9JXhcbiIsIF9fRlVOQ1RJT05fXywKKwkgICAgR1Q5NjEwMEVUSF9SRUFEKGdwLCBHVDk2MTAwX0VUSF9DVVJSX1RYX0RFU0NfUFRSMCkpOworCisJLy8gU2V0dXAgUngKKwlyZXNldF9yeChkZXYpOworCisJZGJnKDMsICIlczogMXN0L0N1cnIgUnggRGVzYyBQdHIwPSV4LyV4XG4iLCBfX0ZVTkNUSU9OX18sCisJICAgIEdUOTYxMDBFVEhfUkVBRChncCwgR1Q5NjEwMF9FVEhfMVNUX1JYX0RFU0NfUFRSMCksCisJICAgIEdUOTYxMDBFVEhfUkVBRChncCwgR1Q5NjEwMF9FVEhfQ1VSUl9SWF9ERVNDX1BUUjApKTsKKworCS8vIGV0aCBwb3J0IGNvbmZpZyByZWdpc3RlcgorCUdUOTYxMDBFVEhfV1JJVEUoZ3AsIEdUOTYxMDBfRVRIX1BPUlRfQ09ORklHX0VYVCwKKwkJCSBwY3hyRkNUTCB8IHBjeHJGQ1RMZW4gfCBwY3hyRkxQIHwgcGN4ckRQTFhlbik7CisKKwltaWlfcmVnID0gcmVhZF9NSUkoZ3AtPnBoeV9hZGRyLCAweDExKTsgLyogaW50IGVuYWJsZSByZWdpc3RlciAqLworCW1paV9yZWcgfD0gMjsgIC8qIGVuYWJsZSBtaWkgaW50ZXJydXB0ICovCisJd3JpdGVfTUlJKGdwLT5waHlfYWRkciwgMHgxMSwgbWlpX3JlZyk7CisJCisJZGJnKDMsICIlczogUGh5QUQ9JXhcbiIsIF9fRlVOQ1RJT05fXywKKwkgICAgR1Q5NjEwMF9SRUFEKEdUOTYxMDBfRVRIX1BIWV9BRERSX1JFRykpOworCisJLy8gc2V0dXAgRE1BCisKKwkvLyBXZSB3YW50IHRoZSBSeC9UeCBETUEgdG8gd3JpdGUvcmVhZCBkYXRhIHRvL2Zyb20gbWVtb3J5IGluCisJLy8gQmlnIEVuZGlhbiBtb2RlLiBBbHNvIHNldCBETUEgQnVyc3QgU2l6ZSB0byA4IDY0Qml0IHdvcmRzLgorI2lmZGVmIERFU0NfREFUQV9CRQorCUdUOTYxMDBFVEhfV1JJVEUoZ3AsIEdUOTYxMDBfRVRIX1NETUFfQ09ORklHLAorCQkJICgweGY8PHNkY3JSQ0JpdCkgfCBzZGNyUklGQiB8ICgzPDxzZGNyQlNaQml0KSk7CisjZWxzZQorCUdUOTYxMDBFVEhfV1JJVEUoZ3AsIEdUOTYxMDBfRVRIX1NETUFfQ09ORklHLAorCQkJIHNkY3JCTE1SIHwgc2RjckJMTVQgfAorCQkJICgweGY8PHNkY3JSQ0JpdCkgfCBzZGNyUklGQiB8ICgzPDxzZGNyQlNaQml0KSk7CisjZW5kaWYKKwlkYmcoMywgIiVzOiBTRE1BIENvbmZpZz0leFxuIiwgX19GVU5DVElPTl9fLAorCSAgICBHVDk2MTAwRVRIX1JFQUQoZ3AsIEdUOTYxMDBfRVRIX1NETUFfQ09ORklHKSk7CisKKwkvLyBzdGFydCBSeCBETUEKKwlHVDk2MTAwRVRIX1dSSVRFKGdwLCBHVDk2MTAwX0VUSF9TRE1BX0NPTU0sIHNkY21yRVJEKTsKKwlkYmcoMywgIiVzOiBTRE1BIENvbW09JXhcbiIsIF9fRlVOQ1RJT05fXywKKwkgICAgR1Q5NjEwMEVUSF9SRUFEKGdwLCBHVDk2MTAwX0VUSF9TRE1BX0NPTU0pKTsKKyAgICAKKwkvLyBlbmFibGUgdGhpcyBwb3J0IChzZXQgaGFzaCBzaXplIHRvIDEvMkspCisJR1Q5NjEwMEVUSF9XUklURShncCwgR1Q5NjEwMF9FVEhfUE9SVF9DT05GSUcsIHBjckVOIHwgcGNySFMpOworCWRiZygzLCAiJXM6IFBvcnQgQ29uZmlnPSV4XG4iLCBfX0ZVTkNUSU9OX18sCisJICAgIEdUOTYxMDBFVEhfUkVBRChncCwgR1Q5NjEwMF9FVEhfUE9SVF9DT05GSUcpKTsKKyAgICAKKwkvKgorCSAqIERpc2FibGUgYWxsIFR5cGUtb2YtU2VydmljZSBxdWV1ZWluZy4gQWxsIFJ4IHBhY2tldHMgd2lsbCBiZQorCSAqIHRyZWF0ZWQgbm9ybWFsbHkgYW5kIHdpbGwgYmUgc2VudCB0byB0aGUgbG93ZXN0IHByaW9yaXR5CisJICogcXVldWUuCisJICoKKwkgKiBEaXNhYmxlIGZsb3ctY29udHJvbCBmb3Igbm93LiBGSVhNRTogc3VwcG9ydCBmbG93IGNvbnRyb2w/CisJICovCisKKwkvLyBjbGVhciBhbGwgdGhlIE1JQiBjdHIgcmVncworCUdUOTYxMDBFVEhfV1JJVEUoZ3AsIEdUOTYxMDBfRVRIX1BPUlRfQ09ORklHX0VYVCwKKwkJCSBwY3hyRkNUTCB8IHBjeHJGQ1RMZW4gfCBwY3hyRkxQIHwKKwkJCSBwY3hyUFJJT3J4T3ZlcnJpZGUpOworCXJlYWRfbWliX2NvdW50ZXJzKGdwKTsKKwlHVDk2MTAwRVRIX1dSSVRFKGdwLCBHVDk2MTAwX0VUSF9QT1JUX0NPTkZJR19FWFQsCisJCQkgcGN4ckZDVEwgfCBwY3hyRkNUTGVuIHwgcGN4ckZMUCB8CisJCQkgcGN4clBSSU9yeE92ZXJyaWRlIHwgcGN4ck1JQmNsck1vZGUpOworICAgIAorCWRiZygzLCAiJXM6IFBvcnQgQ29uZmlnIEV4dD0leFxuIiwgX19GVU5DVElPTl9fLAorCSAgICBHVDk2MTAwRVRIX1JFQUQoZ3AsIEdUOTYxMDBfRVRIX1BPUlRfQ09ORklHX0VYVCkpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCWR1bXBfTUlJKDQsIGRldik7CisKKwkvLyBlbmFibGUgaW50ZXJydXB0cworCWVuYWJsZV9ldGhlcl9pcnEoZGV2KTsKKworCS8vIHdlIHNob3VsZCBub3cgYmUgcmVjZWl2aW5nIGZyYW1lcworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK2d0OTYxMDBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXR2YWw7CisgICAgCisJZGJnKDIsICIlczogZGV2PSVwXG4iLCBfX0ZVTkNUSU9OX18sIGRldik7CisKKwkvLyBJbml0aWFsaXplIGFuZCBzdGFydHVwIHRoZSBHVC05NjEwMCBldGhlcm5ldCBwb3J0CisJaWYgKChyZXR2YWwgPSBndDk2MTAwX2luaXQoZGV2KSkpIHsKKwkJZXJyKCJlcnJvciBpbiBndDk2MTAwX2luaXRcbiIpOworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlpZiAoKHJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmZ3Q5NjEwMF9pbnRlcnJ1cHQsCisJCQkJICBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpKSkgeworCQllcnIoInVuYWJsZSB0byBnZXQgSVJRICVkXG4iLCBkZXYtPmlycSk7CisJCXJldHVybiByZXR2YWw7CisJfQorCQorCWRiZygyLCAiJXM6IEluaXRpYWxpemF0aW9uIGRvbmUuXG4iLCBfX0ZVTkNUSU9OX18pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2d0OTYxMDBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkYmcoMywgIiVzOiBkZXY9JXBcbiIsIF9fRlVOQ1RJT05fXywgZGV2KTsKKworCS8vIHN0b3AgdGhlIGRldmljZQorCWlmIChuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJaGFyZF9zdG9wKGRldik7CisJfQorCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisgICAgCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorZ3Q5NjEwMF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBndDk2MTAwX3ByaXZhdGUgKmdwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBuZXh0SW47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKworCW5leHRJbiA9IGdwLT50eF9uZXh0X2luOworCisJZGJnKDMsICIlczogbmV4dEluPSVkXG4iLCBfX0ZVTkNUSU9OX18sIG5leHRJbik7CisgICAgCisJaWYgKGdwLT50eF9jb3VudCA+PSBUWF9SSU5HX1NJWkUpIHsKKwkJd2FybigiVHggUmluZyBmdWxsLCBwa3QgZHJvcHBlZC5cbiIpOworCQlncC0+c3RhdHMudHhfZHJvcHBlZCsrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMTsKKwl9CisgICAgCisJaWYgKCEoZ3AtPmxhc3RfcHNyICYgcHNyTGluaykpIHsKKwkJZXJyKCIlczogTGluayBkb3duLCBwa3QgZHJvcHBlZC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdwLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAxOworCX0KKyAgICAKKwlpZiAoZG1hMzJfdG9fY3B1KGdwLT50eF9yaW5nW25leHRJbl0uY21kc3RhdCkgJiB0eE93bikgeworCQllcnIoIiVzOiBkZXZpY2Ugb3ducyBkZXNjcmlwdG9yLCBwa3QgZHJvcHBlZC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdwLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCS8vIHN0b3AgdGhlIHF1ZXVlLCBzbyBUeCB0aW1lb3V0IGNhbiBmaXggaXQKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMTsKKwl9CisgICAgCisJLy8gUHJlcGFyZSB0aGUgRGVzY3JpcHRvciBhdCB0eF9uZXh0X2luCisJZ3AtPnR4X3NrYnVmZltuZXh0SW5dID0gc2tiOworCWdwLT50eF9yaW5nW25leHRJbl0uYnl0ZV9jbnQgPSBjcHVfdG9fZG1hMTYoc2tiLT5sZW4pOworCWdwLT50eF9yaW5nW25leHRJbl0uYnVmZl9wdHIgPSBjcHVfdG9fZG1hMzIodmlydF90b19waHlzKHNrYi0+ZGF0YSkpOworCS8vIG1ha2Ugc3VyZSBwYWNrZXQgZ2V0cyB3cml0dGVuIGJhY2sgdG8gbWVtb3J5CisJZG1hX2NhY2hlX3diYWNrX2ludigodW5zaWduZWQgbG9uZykoc2tiLT5kYXRhKSwgc2tiLT5sZW4pOworCS8vIEdpdmUgb3duZXJzaGlwIHRvIGRldmljZSwgc2V0IGZpcnN0IGFuZCBsYXN0IGRlc2MsIGVuYWJsZSBpbnRlcnJ1cHQKKwkvLyBTZXR0aW5nIG9mIG93bmVyc2hpcCBiaXQgbXVzdCBiZSAqbGFzdCohCisJZ3AtPnR4X3JpbmdbbmV4dEluXS5jbWRzdGF0ID0KKwkJY3B1X3RvX2RtYTMyKCh1MzIpKHR4T3duIHwgdHhHZW5DUkMgfCB0eEVJIHwKKwkJCQkgICB0eFBhZCB8IHR4Rmlyc3QgfCB0eExhc3QpKTsKKyAgICAKKwlkdW1wX3R4X2Rlc2MoNCwgZGV2LCBuZXh0SW4pOworCWR1bXBfc2tiKDQsIGRldiwgc2tiKTsKKworCS8vIGluY3JlbWVudCB0eF9uZXh0X2luIHdpdGggd3JhcAorCWdwLT50eF9uZXh0X2luID0gKG5leHRJbiArIDEpICUgVFhfUklOR19TSVpFOworCS8vIElmIERNQSBpcyBzdG9wcGVkLCByZXN0YXJ0CisJaWYgKCEoR1Q5NjEwMEVUSF9SRUFEKGdwLCBHVDk2MTAwX0VUSF9QT1JUX1NUQVRVUykgJiBwc3JUeExvdykpCisJCUdUOTYxMDBFVEhfV1JJVEUoZ3AsIEdUOTYxMDBfRVRIX1NETUFfQ09NTSwKKwkJCQkgc2RjbXJFUkQgfCBzZGNtclRYREwpOworCisJLy8gaW5jcmVtZW50IGNvdW50IGFuZCBzdG9wIHF1ZXVlIGlmIGZ1bGwKKwlpZiAoKytncC0+dHhfY291bnQgPT0gVFhfUklOR19TSVpFKSB7CisJCWdwLT50eF9mdWxsID0gMTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlkYmcoMiwgIlR4IFJpbmcgbm93IGZ1bGwsIHF1ZXVlIHN0b3BwZWQuXG4iKTsKKwl9CisgICAgCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK2d0OTYxMDBfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHN0YXR1cykKK3sKKwlzdHJ1Y3QgZ3Q5NjEwMF9wcml2YXRlICpncCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgcGt0X2xlbiwgbmV4dE91dCwgY2RwOworCWd0OTYxMDBfcmRfdCAqcmQ7CisJdTMyIGNtZHN0YXQ7CisgICAgCisJZGJnKDMsICIlczogZGV2PSVwLCBzdGF0dXM9JXhcbiIsIF9fRlVOQ1RJT05fXywgZGV2LCBzdGF0dXMpOworCisJY2RwID0gKEdUOTYxMDBFVEhfUkVBRChncCwgR1Q5NjEwMF9FVEhfMVNUX1JYX0RFU0NfUFRSMCkKKwkgICAgICAgLSBncC0+cnhfcmluZ19kbWEpIC8gc2l6ZW9mKGd0OTYxMDBfcmRfdCk7CisKKwkvLyBDb250aW51ZSB1bnRpbCB3ZSByZWFjaCAxc3QgZGVzY3JpcHRvciBwb2ludGVyCisJZm9yIChuZXh0T3V0ID0gZ3AtPnJ4X25leHRfb3V0OyBuZXh0T3V0ICE9IGNkcDsKKwkgICAgIG5leHRPdXQgPSAobmV4dE91dCArIDEpICUgUlhfUklOR19TSVpFKSB7CisJCisJCWlmICgtLWdwLT5pbnRyX3dvcmtfZG9uZSA9PSAwKQorCQkJYnJlYWs7CisKKwkJcmQgPSAmZ3AtPnJ4X3JpbmdbbmV4dE91dF07CisJCWNtZHN0YXQgPSBkbWEzMl90b19jcHUocmQtPmNtZHN0YXQpOworCQorCQlkYmcoNCwgIiVzOiBSeCBkZXNjIGNtZHN0YXQ9JXgsIG5leHRPdXQ9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgIGNtZHN0YXQsIG5leHRPdXQpOworCisJCWlmIChjbWRzdGF0ICYgKHUzMilyeE93bikgeworCQkJLy9lcnIoIiVzOiBkZXZpY2Ugb3ducyBkZXNjcmlwdG9yIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCS8vIERNQSBpcyBub3QgZmluaXNoZWQgdXBkYXRpbmcgZGVzY3JpcHRvcj8/PworCQkJLy8gTGVhdmUgYW5kIGNvbWUgYmFjayBsYXRlciB0byBwaWNrLXVwIHdoZXJlCisJCQkvLyB3ZSBsZWZ0IG9mZi4KKwkJCWJyZWFrOworCQl9CisKKwkJLy8gRHJvcCB0aGlzIHJlY2VpdmVkIHBrdCBpZiB0aGVyZSB3ZXJlIGFueSBlcnJvcnMKKwkJaWYgKCgoY21kc3RhdCAmICh1MzIpKHJ4RXJyb3JTdW1tYXJ5KSkgJiYKKwkJICAgICAoY21kc3RhdCAmICh1MzIpKHJ4Rmlyc3QpKSkgfHwgKHN0YXR1cyAmIGljclJ4RXJyb3IpKSB7CisJCQkvLyB1cGRhdGUgdGhlIGRldGFpbGVkIHJ4IGVycm9yIGNvdW50ZXJzIHRoYXQKKwkJCS8vIGFyZSBub3QgY292ZXJlZCBieSB0aGUgTUlCIGNvdW50ZXJzLgorCQkJaWYgKGNtZHN0YXQgJiAodTMyKXJ4T3ZlcnJ1bikKKwkJCQlncC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCWNtZHN0YXQgfD0gKHUzMilyeE93bjsKKwkJCXJkLT5jbWRzdGF0ID0gY3B1X3RvX2RtYTMyKGNtZHN0YXQpOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBNdXN0IGJlIGZpcnN0IGFuZCBsYXN0IChpZSBvbmx5KSBkZXNjcmlwdG9yIG9mIHBhY2tldC4gV2UKKwkJICogaWdub3JlIChkcm9wKSBhbnkgcGFja2V0cyB0aGF0IGRvIG5vdCBmaXQgaW4gb25lIGRlc2NyaXB0b3IuCisJCSAqIEV2ZXJ5IGRlc2NyaXB0b3IncyByZWNlaXZlIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZAorCQkgKiB0aGUgbWF4aW11bSA4MDIuMyBmcmFtZSBzaXplLCBzbyBhIG11bHRpLWRlc2NyaXB0b3IgcGFja2V0CisJCSAqIGluZGljYXRlcyBhbiBlcnJvci4gTW9zdCBpZiBub3QgYWxsIGNvcnJ1cHRlZCBwYWNrZXRzIHdpbGwKKwkJICogaGF2ZSBhbHJlYWR5IGJlZW4gZHJvcHBlZCBieSB0aGUgYWJvdmUgY2hlY2sgZm9yIHRoZQorCQkgKiByeEVycm9yU3VtbWFyeSBzdGF0dXMgYml0LgorCQkgKi8KKwkJaWYgKCEoY21kc3RhdCAmICh1MzIpcnhGaXJzdCkgfHwgIShjbWRzdGF0ICYgKHUzMilyeExhc3QpKSB7CisJCQlpZiAoY21kc3RhdCAmICh1MzIpcnhGaXJzdCkgeworCQkJCS8qCisJCQkJICogVGhpcyBpcyB0aGUgZmlyc3QgZGVzY3JpcHRvciBvZiBhCisJCQkJICogbXVsdGktZGVzY3JpcHRvciBwYWNrZXQuIEl0IGlzbid0IGNvcnJ1cHRlZAorCQkJCSAqIGJlY2F1c2UgdGhlIGFib3ZlIGNoZWNrIGZvciByeEVycm9yU3VtbWFyeQorCQkJCSAqIHdvdWxkIGhhdmUgZHJvcHBlZCBpdCBhbHJlYWR5LCBzbyB3aGF0J3MKKwkJCQkgKiB0aGUgZGVhbCB3aXRoIHRoaXMgcGFja2V0PyBHb29kIHF1ZXN0aW9uLAorCQkJCSAqIGxldCdzIGR1bXAgaXQgb3V0LgorCQkJCSAqLworCQkJCWVycigiJXM6IGRlc2Mgbm90IGZpcnN0IGFuZCBsYXN0IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQlkdW1wX3J4X2Rlc2MoMCwgZGV2LCBuZXh0T3V0KTsKKwkJCX0KKwkJCWNtZHN0YXQgfD0gKHUzMilyeE93bjsKKwkJCXJkLT5jbWRzdGF0ID0gY3B1X3RvX2RtYTMyKGNtZHN0YXQpOworCQkJLy8gY29udGludWUgdG8gZHJvcCBldmVyeSBkZXNjcmlwdG9yIG9mIHRoaXMgcGFja2V0CisJCQljb250aW51ZTsKKwkJfQorCQorCQlwa3RfbGVuID0gZG1hMTZfdG9fY3B1KHJkLT5ieXRlX2NudCk7CisJCisJCS8qIENyZWF0ZSBuZXcgc2tiLiAqLworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4rMik7CisJCWlmIChza2IgPT0gTlVMTCkgeworCQkJZXJyKCIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlncC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJY21kc3RhdCB8PSAodTMyKXJ4T3duOworCQkJcmQtPmNtZHN0YXQgPSBjcHVfdG9fZG1hMzIoY21kc3RhdCk7CisJCQljb250aW51ZTsKKwkJfQorCQlza2ItPmRldiA9IGRldjsKKwkJc2tiX3Jlc2VydmUoc2tiLCAyKTsgICAvKiAxNiBieXRlIElQIGhlYWRlciBhbGlnbiAqLworCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdF9sZW4pLAorCQkgICAgICAgJmdwLT5yeF9idWZmW25leHRPdXQqUEtUX0JVRl9TWl0sIHBrdF9sZW4pOworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQlkdW1wX3NrYig0LCBkZXYsIHNrYik7CisJCisJCW5ldGlmX3J4KHNrYik7ICAgICAgICAvKiBwYXNzIHRoZSBwYWNrZXQgdG8gdXBwZXIgbGF5ZXJzICovCisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisKKwkJLy8gbm93IHdlIGNhbiByZWxlYXNlIG93bmVyc2hpcCBvZiB0aGlzIGRlc2MgYmFjayB0byBkZXZpY2UKKwkJY21kc3RhdCB8PSAodTMyKXJ4T3duOworCQlyZC0+Y21kc3RhdCA9IGNwdV90b19kbWEzMihjbWRzdGF0KTsKKwl9CisgICAgCisJaWYgKG5leHRPdXQgPT0gZ3AtPnJ4X25leHRfb3V0KQorCQlkYmcoMywgIiVzOiBSeENEUCBkaWQgbm90IGluY3JlbWVudD9cbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlncC0+cnhfbmV4dF9vdXQgPSBuZXh0T3V0OworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkCitndDk2MTAwX3R4X2NvbXBsZXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdGF0dXMpCit7CisJc3RydWN0IGd0OTYxMDBfcHJpdmF0ZSAqZ3AgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBuZXh0T3V0LCBjZHA7CisJZ3Q5NjEwMF90ZF90ICp0ZDsKKwl1MzIgY21kc3RhdDsKKworCWNkcCA9IChHVDk2MTAwRVRIX1JFQUQoZ3AsIEdUOTYxMDBfRVRIX0NVUlJfVFhfREVTQ19QVFIwKQorCSAgICAgICAtIGdwLT50eF9yaW5nX2RtYSkgLyBzaXplb2YoZ3Q5NjEwMF90ZF90KTsKKyAgICAKKwkvLyBDb250aW51ZSB1bnRpbCB3ZSByZWFjaCB0aGUgY3VycmVudCBkZXNjcmlwdG9yIHBvaW50ZXIKKwlmb3IgKG5leHRPdXQgPSBncC0+dHhfbmV4dF9vdXQ7IG5leHRPdXQgIT0gY2RwOworCSAgICAgbmV4dE91dCA9IChuZXh0T3V0ICsgMSkgJSBUWF9SSU5HX1NJWkUpIHsKKwkKKwkJaWYgKC0tZ3AtPmludHJfd29ya19kb25lID09IDApCisJCQlicmVhazsKKworCQl0ZCA9ICZncC0+dHhfcmluZ1tuZXh0T3V0XTsKKwkJY21kc3RhdCA9IGRtYTMyX3RvX2NwdSh0ZC0+Y21kc3RhdCk7CisJCisJCWRiZygzLCAiJXM6IFR4IGRlc2MgY21kc3RhdD0leCwgbmV4dE91dD0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkgICAgY21kc3RhdCwgbmV4dE91dCk7CisJCisJCWlmIChjbWRzdGF0ICYgKHUzMil0eE93bikgeworCQkJLyoKKwkJCSAqIERNQSBpcyBub3QgZmluaXNoZWQgd3JpdGluZyBkZXNjcmlwdG9yPz8/CisJCQkgKiBMZWF2ZSBhbmQgY29tZSBiYWNrIGxhdGVyIHRvIHBpY2stdXAgd2hlcmUKKwkJCSAqIHdlIGxlZnQgb2ZmLgorCQkJICovCisJCQlicmVhazsKKwkJfQorCQorCQkvLyBpbmNyZW1lbnQgVHggZXJyb3Igc3RhdHMKKwkJaWYgKGNtZHN0YXQgJiAodTMyKXR4RXJyb3JTdW1tYXJ5KSB7CisJCQlkYmcoMiwgIiVzOiBUeCBlcnJvciwgY21kc3RhdCA9ICV4XG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgY21kc3RhdCk7CisJCQlncC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQlpZiAoY21kc3RhdCAmICh1MzIpdHhSZVR4TGltaXQpCisJCQkJZ3AtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQlpZiAoY21kc3RhdCAmICh1MzIpdHhVbmRlcnJ1bikKKwkJCQlncC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCWlmIChjbWRzdGF0ICYgKHUzMil0eExhdGVDb2xsaXNpb24pCisJCQkJZ3AtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJfQorCQorCQlpZiAoY21kc3RhdCAmICh1MzIpdHhDb2xsaXNpb24pCisJCQlncC0+c3RhdHMuY29sbGlzaW9ucyArPQorCQkJCSh1MzIpKChjbWRzdGF0ICYgdHhSZVR4Q250TWFzaykgPj4KKwkJCQkgICAgICB0eFJlVHhDbnRCaXQpOworCisJCS8vIFdha2UgdGhlIHF1ZXVlIGlmIHRoZSByaW5nIHdhcyBmdWxsCisJCWlmIChncC0+dHhfZnVsbCkgeworCQkJZ3AtPnR4X2Z1bGwgPSAwOworCQkJaWYgKGdwLT5sYXN0X3BzciAmIHBzckxpbmspIHsKKwkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQkJZGJnKDIsICIlczogVHggUmluZyB3YXMgZnVsbCwgcXVldWUgd2FrZWRcbiIsCisJCQkJICAgIF9fRlVOQ1RJT05fXyk7CisJCQl9CisJCX0KKwkKKwkJLy8gZGVjcmVtZW50IHR4IHJpbmcgYnVmZmVyIGNvdW50CisJCWlmIChncC0+dHhfY291bnQpIGdwLT50eF9jb3VudC0tOworCQorCQkvLyBmcmVlIHRoZSBza2IKKwkJaWYgKGdwLT50eF9za2J1ZmZbbmV4dE91dF0pIHsKKwkJCWRiZygzLCAiJXM6IGdvb2QgVHgsIHNrYj0lcFxuIiwgX19GVU5DVElPTl9fLAorCQkJICAgIGdwLT50eF9za2J1ZmZbbmV4dE91dF0pOworCQkJZGV2X2tmcmVlX3NrYl9pcnEoZ3AtPnR4X3NrYnVmZltuZXh0T3V0XSk7CisJCQlncC0+dHhfc2tidWZmW25leHRPdXRdID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCWVycigiJXM6IG5vIHNrYiFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCX0KKwl9CisKKwlncC0+dHhfbmV4dF9vdXQgPSBuZXh0T3V0OworCisJaWYgKGd0OTYxMDBfY2hlY2tfdHhfY29uc2lzdGVudChncCkpIHsKKwkJZXJyKCIlczogVHggcXVldWUgaW5jb25zaXN0ZW50IVxuIiwgX19GVU5DVElPTl9fKTsKKwl9CisgICAgCisJaWYgKChzdGF0dXMgJiBpY3JUeEVuZExvdykgJiYgZ3AtPnR4X2NvdW50ICE9IDApIHsKKwkJLy8gd2UgbXVzdCByZXN0YXJ0IHRoZSBETUEKKwkJZGJnKDMsICIlczogUmVzdGFydGluZyBUeCBETUFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCUdUOTYxMDBFVEhfV1JJVEUoZ3AsIEdUOTYxMDBfRVRIX1NETUFfQ09NTSwKKwkJCQkgc2RjbXJFUkQgfCBzZGNtclRYREwpOworCX0KK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3QKK2d0OTYxMDBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKwlzdHJ1Y3QgZ3Q5NjEwMF9wcml2YXRlICpncCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIHN0YXR1czsKKyAgICAJaW50IGhhbmRsZWQgPSAwOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCWVycigiJXM6IG51bGwgZGV2IHB0clxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWRiZygzLCAiJXM6IGVudHJ5LCBpY3I9JXhcbiIsIF9fRlVOQ1RJT05fXywKKwkgICAgR1Q5NjEwMEVUSF9SRUFEKGdwLCBHVDk2MTAwX0VUSF9JTlRfQ0FVU0UpKTsKKworCXNwaW5fbG9jaygmZ3AtPmxvY2spOworCisJZ3AtPmludHJfd29ya19kb25lID0gbWF4X2ludGVycnVwdF93b3JrOworCisJd2hpbGUgKGdwLT5pbnRyX3dvcmtfZG9uZSA+IDApIHsKKworCQlzdGF0dXMgPSBHVDk2MTAwRVRIX1JFQUQoZ3AsIEdUOTYxMDBfRVRIX0lOVF9DQVVTRSk7CisJCS8vIEFDSyBpbnRlcnJ1cHRzCisJCUdUOTYxMDBFVEhfV1JJVEUoZ3AsIEdUOTYxMDBfRVRIX0lOVF9DQVVTRSwgfnN0YXR1cyk7CisKKwkJaWYgKChzdGF0dXMgJiBpY3JFdGhlckludFN1bSkgPT0gMCAmJgorCQkgICAgIShzdGF0dXMgJiAoaWNyVHhCdWZmZXJMb3d8aWNyVHhCdWZmZXJIaWdofGljclJ4QnVmZmVyKSkpCisJCQlicmVhazsKKworCQloYW5kbGVkID0gMTsKKworCQlpZiAoc3RhdHVzICYgaWNyTUlJUGh5U1RDKSB7CisJCQl1MzIgcHNyID0gR1Q5NjEwMEVUSF9SRUFEKGdwLCBHVDk2MTAwX0VUSF9QT1JUX1NUQVRVUyk7CisJCQlpZiAoZ3AtPmxhc3RfcHNyICE9IHBzcikgeworCQkJCWRiZygwLCAicG9ydCBzdGF0dXM6XG4iKTsKKwkJCQlkYmcoMCwgIiAgICAlcyBNQml0L3MsICVzLWR1cGxleCwgIgorCQkJCSAgICAiZmxvdy1jb250cm9sICVzLCBsaW5rIGlzICVzLFxuIiwKKwkJCQkgICAgcHNyICYgcHNyU3BlZWQgPyAiMTAwIjoiMTAiLAorCQkJCSAgICBwc3IgJiBwc3JEdXBsZXggPyAiZnVsbCI6ImhhbGYiLAorCQkJCSAgICBwc3IgJiBwc3JGY3RsID8gImRpc2FibGVkIjoiZW5hYmxlZCIsCisJCQkJICAgIHBzciAmIHBzckxpbmsgPyAidXAiOiJkb3duIik7CisJCQkJZGJnKDAsICIgICAgVHhMb3dRIGlzICVzLCBUeEhpZ2hRIGlzICVzLCAiCisJCQkJICAgICJUcmFuc21pdHRlciBpcyAlc1xuIiwKKwkJCQkgICAgcHNyICYgcHNyVHhMb3cgPyAicnVubmluZyI6InN0b3BwZWQiLAorCQkJCSAgICBwc3IgJiBwc3JUeEhpZ2ggPyAicnVubmluZyI6InN0b3BwZWQiLAorCQkJCSAgICBwc3IgJiBwc3JUeEluUHJvZyA/ICJvbiI6Im9mZiIpOworCQkKKwkJCQlpZiAoKHBzciAmIHBzckxpbmspICYmICFncC0+dHhfZnVsbCAmJgorCQkJCSAgICBuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKKwkJCQkJZGJnKDAsICIlczogTGluayB1cCwgd2FraW5nIHF1ZXVlLlxuIiwKKwkJCQkJICAgIF9fRlVOQ1RJT05fXyk7CisJCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCQl9IGVsc2UgaWYgKCEocHNyICYgcHNyTGluaykgJiYKKwkJCQkJICAgIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgeworCQkJCQlkYmcoMCwgIiVzOiBMaW5rIGRvd24sIHN0b3BwaW5nIHF1ZXVlLlxuIiwKKwkJCQkJICAgIF9fRlVOQ1RJT05fXyk7CisJCQkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCQl9CisKKwkJCQlncC0+bGFzdF9wc3IgPSBwc3I7CisJCQl9CisKKwkJCWlmICgtLWdwLT5pbnRyX3dvcmtfZG9uZSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisJCisJCWlmIChzdGF0dXMgJiAoaWNyVHhCdWZmZXJMb3cgfCBpY3JUeEVuZExvdykpCisJCQlndDk2MTAwX3R4X2NvbXBsZXRlKGRldiwgc3RhdHVzKTsKKworCQlpZiAoc3RhdHVzICYgKGljclJ4QnVmZmVyIHwgaWNyUnhFcnJvcikpIHsKKwkJCWd0OTYxMDBfcngoZGV2LCBzdGF0dXMpOworCQl9CisJCisJCS8vIE5vdyBjaGVjayBUWCBlcnJvcnMgKFJYIGVycm9ycyB3ZXJlIGhhbmRsZWQgaW4gZ3Q5NjEwMF9yeCkKKwkJaWYgKHN0YXR1cyAmIGljclR4RXJyb3JMb3cpIHsKKwkJCWVycigiJXM6IFR4IHJlc291cmNlIGVycm9yXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJaWYgKC0tZ3AtPmludHJfd29ya19kb25lID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkKKwkJaWYgKHN0YXR1cyAmIGljclR4VWRyKSB7CisJCQllcnIoIiVzOiBUeCB1bmRlcnJ1biBlcnJvclxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWlmICgtLWdwLT5pbnRyX3dvcmtfZG9uZSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGdwLT5pbnRyX3dvcmtfZG9uZSA9PSAwKSB7CisJCS8vIEFDSyBhbnkgcmVtYWluaW5nIHBlbmRpbmcgaW50ZXJydXB0cworCQlHVDk2MTAwRVRIX1dSSVRFKGdwLCBHVDk2MTAwX0VUSF9JTlRfQ0FVU0UsIDApOworCQlkYmcoMywgIiVzOiBoaXQgbWF4IHdvcmtcbiIsIF9fRlVOQ1RJT05fXyk7CisJfQorICAgIAorCWRiZygzLCAiJXM6IGV4aXQsIGljcj0leFxuIiwgX19GVU5DVElPTl9fLAorCSAgICBHVDk2MTAwRVRIX1JFQUQoZ3AsIEdUOTYxMDBfRVRIX0lOVF9DQVVTRSkpOworCisJc3Bpbl91bmxvY2soJmdwLT5sb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCitzdGF0aWMgdm9pZAorZ3Q5NjEwMF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGd0OTYxMDBfcHJpdmF0ZSAqZ3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwLT5sb2NrLCBmbGFncyk7CisgICAgCisJaWYgKCEoZ3AtPmxhc3RfcHNyICYgcHNyTGluaykpIHsKKwkJZXJyKCJ0eF90aW1lb3V0OiBsaW5rIGRvd24uXG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQlpZiAoZ3Q5NjEwMF9jaGVja190eF9jb25zaXN0ZW50KGdwKSkKKwkJCWVycigidHhfdGltZW91dDogVHggcmluZyBlcnJvci5cbiIpOworCisJCWRpc2FibGVfZXRoZXJfaXJxKGRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7CisJCXJlc2V0X3R4KGRldik7CisJCWVuYWJsZV9ldGhlcl9pcnEoZGV2KTsKKwkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KK30KKworCitzdGF0aWMgdm9pZAorZ3Q5NjEwMF9zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBndDk2MTAwX3ByaXZhdGUgKmdwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCS8vc3RydWN0IGRldl9tY19saXN0ICptY3B0cjsKKyAgICAKKwlkYmcoMywgIiVzOiBkZXY9JXAsIGZsYWdzPSV4XG4iLCBfX0ZVTkNUSU9OX18sIGRldiwgZGV2LT5mbGFncyk7CisKKwkvLyBzdG9wIHRoZSBSZWNlaXZlciBETUEKKwlhYm9ydChkZXYsIHNkY21yQVIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCUdUOTYxMDBFVEhfV1JJVEUoZ3AsIEdUOTYxMDBfRVRIX1BPUlRfQ09ORklHLAorCQkJCSBwY3JFTiB8IHBjckhTIHwgcGNyUE0pOworCX0KKworI2lmIDAKKwkvKgorCSAgRklYTUU6IGN1cnJlbnRseSBtdWx0aWNhc3QgZG9lc24ndCB3b3JrIC0gbmVlZCB0byBnZXQgaGFzaCB0YWJsZQorCSAgd29ya2luZyBmaXJzdC4KKwkqLworCWlmIChkZXYtPm1jX2NvdW50KSB7CisJCS8vIGNsZWFyIGhhc2ggdGFibGUKKwkJbWVtc2V0KGdwLT5oYXNoX3RhYmxlLCAwLCBSWF9IQVNIX1RBQkxFX1NJWkUpOworCQkvLyBBZGQgb3VyIGV0aGVybmV0IGFkZHJlc3MKKwkJZ3Q5NjEwMF9hZGRfaGFzaF9lbnRyeShkZXYsIGRldi0+ZGV2X2FkZHIpOworCisJCWZvciAobWNwdHIgPSBkZXYtPm1jX2xpc3Q7IG1jcHRyOyBtY3B0ciA9IG1jcHRyLT5uZXh0KSB7CisJCQlkdW1wX2h3X2FkZHIoMiwgZGV2LCBfX0ZVTkNUSU9OX18gIjogYWRkcj0iLAorCQkJCSAgICAgbWNwdHItPmRtaV9hZGRyKTsKKwkJCWd0OTYxMDBfYWRkX2hhc2hfZW50cnkoZGV2LCBtY3B0ci0+ZG1pX2FkZHIpOworCQl9CisJfQorI2VuZGlmCisgICAgCisJLy8gcmVzdGFydCBSeCBETUEKKwlHVDk2MTAwRVRIX1dSSVRFKGdwLCBHVDk2MTAwX0VUSF9TRE1BX0NPTU0sIHNkY21yRVJEKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCitndDk2MTAwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBndDk2MTAwX3ByaXZhdGUgKmdwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGJnKDMsICIlczogZGV2PSVwXG4iLCBfX0ZVTkNUSU9OX18sIGRldik7CisKKwlpZiAobmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSAoJmdwLT5sb2NrLCBmbGFncyk7CisJCXVwZGF0ZV9zdGF0cyhncCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZncC0+bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiAmZ3AtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCBndDk2MTAwX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpPTA7IGk8TlVNX0lOVEVSRkFDRVM7IGkrKykgeworCQlzdHJ1Y3QgZ3Q5NjEwMF9pZl90ICpndGlmID0gJmd0OTYxMDBfaWZsaXN0W2ldOworCQlpZiAoZ3RpZi0+ZGV2ICE9IE5VTEwpIHsKKwkJCXN0cnVjdCBndDk2MTAwX3ByaXZhdGUgKmdwID0gKHN0cnVjdCBndDk2MTAwX3ByaXZhdGUgKikKKwkJCQluZXRkZXZfcHJpdihndGlmLT5kZXYpOworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZ3RpZi0+ZGV2KTsKKwkJCWRtYWZyZWUoUlhfSEFTSF9UQUJMRV9TSVpFLCBncC0+aGFzaF90YWJsZV9kbWEpOworCQkJZG1hZnJlZShQS1RfQlVGX1NaKlJYX1JJTkdfU0laRSwgZ3AtPnJ4X2J1ZmYpOworCQkJZG1hZnJlZShzaXplb2YoZ3Q5NjEwMF9yZF90KSAqIFJYX1JJTkdfU0laRQorCQkJCSsgc2l6ZW9mKGd0OTYxMDBfdGRfdCkgKiBUWF9SSU5HX1NJWkUsCisJCQkJZ3AtPnJ4X3JpbmcpOworCQkJZnJlZV9uZXRkZXYoZ3RpZi0+ZGV2KTsKKwkJCXJlbGVhc2VfcmVnaW9uKGd0aWYtPmlvYmFzZSwgZ3AtPmlvX3NpemUpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBndDk2MTAwX3NldHVwKGNoYXIgKm9wdGlvbnMpCit7CisJY2hhciAqdGhpc19vcHQ7CisKKwlpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgodGhpc19vcHQgPSBzdHJzZXAgKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CisJCWlmICghKnRoaXNfb3B0KQorCQkJY29udGludWU7CisJCWlmICghc3RybmNtcCh0aGlzX29wdCwgIm1hYzA6IiwgNSkpIHsKKwkJCW1lbWNweShtYWMwLCB0aGlzX29wdCs1LCAxNyk7CisJCQltYWMwWzE3XT0gJ1wwJzsKKwkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgIm1hYzE6IiwgNSkpIHsKKwkJCW1lbWNweShtYWMxLCB0aGlzX29wdCs1LCAxNyk7CisJCQltYWMxWzE3XT0gJ1wwJzsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitfX3NldHVwKCJndDk2MTAwZXRoPSIsIGd0OTYxMDBfc2V0dXApOworCittb2R1bGVfaW5pdChndDk2MTAwX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGd0OTYxMDBfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJTdGV2ZSBMb25nZXJiZWFtIDxzdGV2ZWxAbXZpc3RhLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiR1Q5NjEwMCBFdGhlcm5ldCBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2d0OTYxMDBldGguaCBiL2RyaXZlcnMvbmV0L2d0OTYxMDBldGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjRiZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZ3Q5NjEwMGV0aC5oCkBAIC0wLDAgKzEsMzQ5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqICAgICAgICAgCXN0ZXZlbEBtdmlzdGEuY29tIG9yIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIGRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKFZlcnNpb24gMikgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgKgorICogRXRoZXJuZXQgZHJpdmVyIGRlZmluaXRpb25zIGZvciB0aGUgTUlQUyBHVDk2MTAwIEFkdmFuY2VkCisgKiBDb21tdW5pY2F0aW9uIENvbnRyb2xsZXIuCisgKiAKKyAqLworI2lmbmRlZiBfR1Q5NjEwMEVUSF9ICisjZGVmaW5lIF9HVDk2MTAwRVRIX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9nYWxpbGVvLWJvYXJkcy9ndDk2MTAwLmg+CisKKyNkZWZpbmUgZGJnKGx2bCwgZm9ybWF0LCBhcmcuLi4pIFwKKyAgICBpZiAobHZsIDw9IEdUOTYxMDBfREVCVUcpIFwKKyAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiIGZvcm1hdCwgZGV2LT5uYW1lICwgIyMgYXJnKQorI2RlZmluZSBlcnIoZm9ybWF0LCBhcmcuLi4pIFwKKyAgICBwcmludGsoS0VSTl9FUlIgIiVzOiAiIGZvcm1hdCwgZGV2LT5uYW1lICwgIyMgYXJnKQorI2RlZmluZSBpbmZvKGZvcm1hdCwgYXJnLi4uKSBcCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICIgZm9ybWF0LCBkZXYtPm5hbWUgLCAjIyBhcmcpCisjZGVmaW5lIHdhcm4oZm9ybWF0LCBhcmcuLi4pIFwKKyAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogIiBmb3JtYXQsIGRldi0+bmFtZSAsICMjIGFyZykKKworLyogS2VlcCB0aGUgcmluZyBzaXplcyBhIHBvd2VyIG9mIHR3byBmb3IgZWZmaWNpZW5jeS4gKi8KKyNkZWZpbmUgVFhfUklOR19TSVpFCTE2CisjZGVmaW5lIFJYX1JJTkdfU0laRQkzMgorI2RlZmluZSBQS1RfQlVGX1NaCTE1MzYJLyogU2l6ZSBvZiBlYWNoIHRlbXBvcmFyeSBSeCBidWZmZXIuKi8KKworI2RlZmluZSBSWF9IQVNIX1RBQkxFX1NJWkUgMTYzODQKKyNkZWZpbmUgSEFTSF9IT1BfTlVNQkVSIDEyCisKKyNkZWZpbmUgTlVNX0lOVEVSRkFDRVMgMgorCisjZGVmaW5lIEdUOTYxMDBFVEhfVFhfVElNRU9VVCBIWi80CisKKyNkZWZpbmUgR1Q5NjEwMF9FVEgwX0JBU0UgKE1JUFNfR1Q5NjEwMF9CQVNFICsgR1Q5NjEwMF9FVEhfUE9SVF9DT05GSUcpCisjZGVmaW5lIEdUOTYxMDBfRVRIMV9CQVNFIChHVDk2MTAwX0VUSDBfQkFTRSArIEdUOTYxMDBfRVRIX0lPX1NJWkUpCisKKyNpZmRlZiBDT05GSUdfTUlQU19FVjk2MTAwCisjZGVmaW5lIEdUOTYxMDBfRVRIRVIwX0lSUSAzCisjZGVmaW5lIEdUOTYxMDBfRVRIRVIxX0lSUSA0CisjZWxzZQorI2RlZmluZSBHVDk2MTAwX0VUSEVSMF9JUlEgLTEKKyNkZWZpbmUgR1Q5NjEwMF9FVEhFUjFfSVJRIC0xCisjZW5kaWYKKworI2RlZmluZSBSRVZfR1Q5NjEwMCAgMQorI2RlZmluZSBSRVZfR1Q5NjEwMEFfMSAyCisjZGVmaW5lIFJFVl9HVDk2MTAwQSAzCisKKyNkZWZpbmUgR1Q5NjEwMEVUSF9SRUFEKGdwLCBvZmZzZXQpIFwKKyAgICBHVDk2MTAwX1JFQUQoKGdwLT5wb3J0X29mZnNldCArIG9mZnNldCkpCisKKyNkZWZpbmUgR1Q5NjEwMEVUSF9XUklURShncCwgb2Zmc2V0LCBkYXRhKSBcCisgICAgR1Q5NjEwMF9XUklURSgoZ3AtPnBvcnRfb2Zmc2V0ICsgb2Zmc2V0KSwgZGF0YSkKKworI2RlZmluZSBHVDk2MTAwRVRIX1NFVEJJVChncCwgb2Zmc2V0LCBiaXRzKSB7XAorICAgIHUzMiB2YWwgPSBHVDk2MTAwRVRIX1JFQUQoZ3AsIG9mZnNldCk7IHZhbCB8PSAodTMyKShiaXRzKTsgXAorICAgIEdUOTYxMDBFVEhfV1JJVEUoZ3AsIG9mZnNldCwgdmFsKTsgfQorCisjZGVmaW5lIEdUOTYxMDBFVEhfQ0xSQklUKGdwLCBvZmZzZXQsIGJpdHMpIHtcCisgICAgdTMyIHZhbCA9IEdUOTYxMDBFVEhfUkVBRChncCwgb2Zmc2V0KTsgdmFsICY9ICh1MzIpKH4oYml0cykpOyBcCisgICAgR1Q5NjEwMEVUSF9XUklURShncCwgb2Zmc2V0LCB2YWwpOyB9CisKKworLyogQml0IGRlZmluaXRpb25zIG9mIHRoZSBTTUkgUmVnICovCitlbnVtIHsKKwlzbWlyRGF0YU1hc2sgPSAweGZmZmYsCisJc21pclBoeUFkTWFzayA9IDB4MWY8PDE2LAorCXNtaXJQaHlBZEJpdCA9IDE2LAorCXNtaXJSZWdBZE1hc2sgPSAweDFmPDwyMSwKKwlzbWlyUmVnQWRCaXQgPSAyMSwKKwlzbWlyT3BDb2RlID0gMTw8MjYsCisJc21pclJlYWRWYWxpZCA9IDE8PDI3LAorCXNtaXJCdXN5ID0gMTw8MjgKK307CisKKy8qIEJpdCBkZWZpbml0aW9ucyBvZiB0aGUgUG9ydCBDb25maWcgUmVnICovCitlbnVtIHBjcl9iaXRzIHsKKwlwY3JQTSA9IDEsCisJcGNyUkJNID0gMiwKKwlwY3JQQkYgPSA0LAorCXBjckVOID0gMTw8NywKKwlwY3JMUEJLTWFzayA9IDB4Mzw8OCwKKwlwY3JMUEJLQml0ID0gOCwKKwlwY3JGQyA9IDE8PDEwLAorCXBjckhTID0gMTw8MTIsCisJcGNySE0gPSAxPDwxMywKKwlwY3JIRE0gPSAxPDwxNCwKKwlwY3JIRCA9IDE8PDE1LAorCXBjcklTTE1hc2sgPSAweDc8PDI4LAorCXBjcklTTEJpdCA9IDI4LAorCXBjckFDQ1MgPSAxPDwzMQorfTsKKworLyogQml0IGRlZmluaXRpb25zIG9mIHRoZSBQb3J0IENvbmZpZyBFeHRlbmQgUmVnICovCitlbnVtIHBjeHJfYml0cyB7CisJcGN4cklHTVAgPSAxLAorCXBjeHJTUEFOID0gMiwKKwlwY3hyUEFSID0gNCwKKwlwY3hyUFJJT3R4TWFzayA9IDB4Nzw8MywKKwlwY3hyUFJJT3R4Qml0ID0gMywKKwlwY3hyUFJJT3J4TWFzayA9IDB4Mzw8NiwKKwlwY3hyUFJJT3J4Qml0ID0gNiwKKwlwY3hyUFJJT3J4T3ZlcnJpZGUgPSAxPDw4LAorCXBjeHJEUExYZW4gPSAxPDw5LAorCXBjeHJGQ1RMZW4gPSAxPDwxMCwKKwlwY3hyRkxQID0gMTw8MTEsCisJcGN4ckZDVEwgPSAxPDwxMiwKKwlwY3hyTUZMTWFzayA9IDB4Mzw8MTQsCisJcGN4ck1GTEJpdCA9IDE0LAorCXBjeHJNSUJjbHJNb2RlID0gMTw8MTYsCisJcGN4clNwZWVkID0gMTw8MTgsCisJcGN4clNwZWVkZW4gPSAxPDwxOSwKKwlwY3hyUk1JSWVuID0gMTw8MjAsCisJcGN4ckRTQ1BlbiA9IDE8PDIxCit9OworCisvKiBCaXQgZGVmaW5pdGlvbnMgb2YgdGhlIFBvcnQgQ29tbWFuZCBSZWcgKi8KK2VudW0gcGNtcl9iaXRzIHsKKwlwY21yRkogPSAxPDwxNQorfTsKKworCisvKiBCaXQgZGVmaW5pdGlvbnMgb2YgdGhlIFBvcnQgU3RhdHVzIFJlZyAqLworZW51bSBwc3JfYml0cyB7CisJcHNyU3BlZWQgPSAxLAorCXBzckR1cGxleCA9IDIsCisJcHNyRmN0bCA9IDQsCisJcHNyTGluayA9IDgsCisJcHNyUGF1c2UgPSAxPDw0LAorCXBzclR4TG93ID0gMTw8NSwKKwlwc3JUeEhpZ2ggPSAxPDw2LAorCXBzclR4SW5Qcm9nID0gMTw8NworfTsKKworLyogQml0IGRlZmluaXRpb25zIG9mIHRoZSBTRE1BIENvbmZpZyBSZWcgKi8KK2VudW0gc2Rjcl9iaXRzIHsKKwlzZGNyUkNNYXNrID0gMHhmPDwyLAorCXNkY3JSQ0JpdCA9IDIsCisJc2RjckJMTVIgPSAxPDw2LAorCXNkY3JCTE1UID0gMTw8NywKKwlzZGNyUE9WUiA9IDE8PDgsCisJc2RjclJJRkIgPSAxPDw5LAorCXNkY3JCU1pNYXNrID0gMHgzPDwxMiwKKwlzZGNyQlNaQml0ID0gMTIKK307CisKKy8qIEJpdCBkZWZpbml0aW9ucyBvZiB0aGUgU0RNQSBDb21tYW5kIFJlZyAqLworZW51bSBzZGNtcl9iaXRzIHsKKwlzZGNtckVSRCA9IDE8PDcsCisJc2RjbXJBUiA9IDE8PDE1LAorCXNkY21yU1RESCA9IDE8PDE2LAorCXNkY21yU1RETCA9IDE8PDE3LAorCXNkY21yVFhESCA9IDE8PDIzLAorCXNkY21yVFhETCA9IDE8PDI0LAorCXNkY21yQVQgPSAxPDwzMQorfTsKKworLyogQml0IGRlZmluaXRpb25zIG9mIHRoZSBJbnRlcnJ1cHQgQ2F1c2UgUmVnICovCitlbnVtIGljcl9iaXRzIHsKKwlpY3JSeEJ1ZmZlciA9IDEsCisJaWNyVHhCdWZmZXJIaWdoID0gMTw8MiwKKwlpY3JUeEJ1ZmZlckxvdyA9IDE8PDMsCisJaWNyVHhFbmRIaWdoID0gMTw8NiwKKwlpY3JUeEVuZExvdyA9IDE8PDcsCisJaWNyUnhFcnJvciA9IDE8PDgsCisJaWNyVHhFcnJvckhpZ2ggPSAxPDwxMCwKKwlpY3JUeEVycm9yTG93ID0gMTw8MTEsCisJaWNyUnhPVlIgPSAxPDwxMiwKKwlpY3JUeFVkciA9IDE8PDEzLAorCWljclJ4QnVmZmVyUTAgPSAxPDwxNiwKKwlpY3JSeEJ1ZmZlclExID0gMTw8MTcsCisJaWNyUnhCdWZmZXJRMiA9IDE8PDE4LAorCWljclJ4QnVmZmVyUTMgPSAxPDwxOSwKKwlpY3JSeEVycm9yUTAgPSAxPDwyMCwKKwlpY3JSeEVycm9yUTEgPSAxPDwyMSwKKwlpY3JSeEVycm9yUTIgPSAxPDwyMiwKKwlpY3JSeEVycm9yUTMgPSAxPDwyMywKKwlpY3JNSUlQaHlTVEMgPSAxPDwyOCwKKwlpY3JTTUlkb25lID0gMTw8MjksCisJaWNyRXRoZXJJbnRTdW0gPSAxPDwzMQorfTsKKworCisvKiBUaGUgUnggYW5kIFR4IGRlc2NyaXB0b3IgbGlzdHMuICovCit0eXBlZGVmIHN0cnVjdCB7CisjaWZkZWYgREVTQ19CRQorCXUxNiBieXRlX2NudDsKKwl1MTYgcmVzZXJ2ZWQ7CisjZWxzZQorCXUxNiByZXNlcnZlZDsKKwl1MTYgYnl0ZV9jbnQ7CisjZW5kaWYKKwl1MzIgY21kc3RhdDsKKwl1MzIgbmV4dDsKKwl1MzIgYnVmZl9wdHI7Cit9IGd0OTYxMDBfdGRfdCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZmRlZiBERVNDX0JFCisJdTE2IGJ1ZmZfc3o7CisJdTE2IGJ5dGVfY250OworI2Vsc2UKKwl1MTYgYnl0ZV9jbnQ7CisJdTE2IGJ1ZmZfc3o7CisjZW5kaWYKKwl1MzIgY21kc3RhdDsKKwl1MzIgbmV4dDsKKwl1MzIgYnVmZl9wdHI7Cit9IGd0OTYxMDBfcmRfdCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKworLyogVmFsdWVzIGZvciB0aGUgVHggY29tbWFuZC1zdGF0dXMgZGVzY3JpcHRvciBlbnRyeS4gKi8KK2VudW0gdGRfY21kc3RhdCB7CisJdHhPd24gPSAxPDwzMSwKKwl0eEF1dG9Nb2RlID0gMTw8MzAsCisJdHhFSSA9IDE8PDIzLAorCXR4R2VuQ1JDID0gMTw8MjIsCisJdHhQYWQgPSAxPDwxOCwKKwl0eEZpcnN0ID0gMTw8MTcsCisJdHhMYXN0ID0gMTw8MTYsCisJdHhFcnJvclN1bW1hcnkgPSAxPDwxNSwKKwl0eFJlVHhDbnRNYXNrID0gMHgwZjw8MTAsCisJdHhSZVR4Q250Qml0ID0gMTAsCisJdHhDb2xsaXNpb24gPSAxPDw5LAorCXR4UmVUeExpbWl0ID0gMTw8OCwKKwl0eFVuZGVycnVuID0gMTw8NiwKKwl0eExhdGVDb2xsaXNpb24gPSAxPDw1Cit9OworCisKKy8qIFZhbHVlcyBmb3IgdGhlIFJ4IGNvbW1hbmQtc3RhdHVzIGRlc2NyaXB0b3IgZW50cnkuICovCitlbnVtIHJkX2NtZHN0YXQgeworCXJ4T3duID0gMTw8MzEsCisJcnhBdXRvTW9kZSA9IDE8PDMwLAorCXJ4RUkgPSAxPDwyMywKKwlyeEZpcnN0ID0gMTw8MTcsCisJcnhMYXN0ID0gMTw8MTYsCisJcnhFcnJvclN1bW1hcnkgPSAxPDwxNSwKKwlyeElHTVAgPSAxPDwxNCwKKwlyeEhhc2hFeHBpcmVkID0gMTw8MTMsCisJcnhNaXNzZWRGcmFtZSA9IDE8PDEyLAorCXJ4RnJhbWVUeXBlID0gMTw8MTEsCisJcnhTaG9ydEZyYW1lID0gMTw8OCwKKwlyeE1heEZyYW1lTGVuID0gMTw8NywKKwlyeE92ZXJydW4gPSAxPDw2LAorCXJ4Q29sbGlzaW9uID0gMTw8NCwKKwlyeENSQ0Vycm9yID0gMQorfTsKKworLyogQml0IGZpZWxkcyBvZiBhIEhhc2ggVGFibGUgRW50cnkgKi8KK2VudW0gaGFzaF90YWJsZV9lbnRyeSB7CisJaHRlVmFsaWQgPSAxLAorCWh0ZVNraXAgPSAyLAorCWh0ZVJEID0gNAorfTsKKworLy8gVGhlIE1JQiBjb3VudGVycwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBieXRlUmVjZWl2ZWQ7CisJdTMyIGJ5dGVTZW50OworCXUzMiBmcmFtZXNSZWNlaXZlZDsKKwl1MzIgZnJhbWVzU2VudDsKKwl1MzIgdG90YWxCeXRlUmVjZWl2ZWQ7CisJdTMyIHRvdGFsRnJhbWVzUmVjZWl2ZWQ7CisJdTMyIGJyb2FkY2FzdEZyYW1lc1JlY2VpdmVkOworCXUzMiBtdWx0aWNhc3RGcmFtZXNSZWNlaXZlZDsKKwl1MzIgY1JDRXJyb3I7CisJdTMyIG92ZXJzaXplRnJhbWVzOworCXUzMiBmcmFnbWVudHM7CisJdTMyIGphYmJlcjsKKwl1MzIgY29sbGlzaW9uOworCXUzMiBsYXRlQ29sbGlzaW9uOworCXUzMiBmcmFtZXM2NDsKKwl1MzIgZnJhbWVzNjVfMTI3OworCXUzMiBmcmFtZXMxMjhfMjU1OworCXUzMiBmcmFtZXMyNTZfNTExOworCXUzMiBmcmFtZXM1MTJfMTAyMzsKKwl1MzIgZnJhbWVzMTAyNF9NYXhTaXplOworCXUzMiBtYWNSeEVycm9yOworCXUzMiBkcm9wcGVkRnJhbWVzOworCXUzMiBvdXRNdWx0aWNhc3RGcmFtZXM7CisJdTMyIG91dEJyb2FkY2FzdEZyYW1lczsKKwl1MzIgdW5kZXJzaXplRnJhbWVzOworfSBtaWJfY291bnRlcnNfdDsKKworCitzdHJ1Y3QgZ3Q5NjEwMF9wcml2YXRlIHsKKwlndDk2MTAwX3JkX3QqIHJ4X3Jpbmc7CisJZ3Q5NjEwMF90ZF90KiB0eF9yaW5nOworCS8vIFRoZSBSeCBhbmQgVHggcmluZ3MgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQKKwlkbWFfYWRkcl90IHJ4X3JpbmdfZG1hOworCWRtYV9hZGRyX3QgdHhfcmluZ19kbWE7CisJY2hhciogaGFzaF90YWJsZTsKKwkvLyBUaGUgSGFzaCBUYWJsZSBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkCisJZG1hX2FkZHJfdCBoYXNoX3RhYmxlX2RtYTsKKwlpbnQgaGFzaF9tb2RlOworICAgIAorCS8vIFRoZSBSeCBidWZmZXJzIG11c3QgYmUgOC1ieXRlIGFsaWduZWQKKwljaGFyKiByeF9idWZmOworCWRtYV9hZGRyX3QgcnhfYnVmZl9kbWE7CisJLy8gVHggYnVmZmVycyAodHhfc2tidWZmW2ldLT5kYXRhKSB3aXRoIGxlc3MgdGhhbiA4IGJ5dGVzCisJLy8gb2YgcGF5bG9hZCBtdXN0IGJlIDgtYnl0ZSBhbGlnbmVkCisJc3RydWN0IHNrX2J1ZmYqIHR4X3NrYnVmZltUWF9SSU5HX1NJWkVdOworCWludCByeF9uZXh0X291dDsgLyogVGhlIG5leHQgZnJlZSByaW5nIGVudHJ5IHRvIHJlY2VpdmUgKi8KKwlpbnQgdHhfbmV4dF9pbjsJIC8qIFRoZSBuZXh0IGZyZWUgcmluZyBlbnRyeSB0byBzZW5kICovCisJaW50IHR4X25leHRfb3V0OyAvKiBUaGUgbGFzdCByaW5nIGVudHJ5IHRoZSBJU1IgcHJvY2Vzc2VkICovCisJaW50IHR4X2NvdW50OyAgICAvKiBjdXJyZW50ICMgb2YgcGt0cyB3YWl0aW5nIHRvIGJlIHNlbnQgaW4gVHggcmluZyAqLworCWludCBpbnRyX3dvcmtfZG9uZTsgLyogbnVtYmVyIG9mIFJ4IGFuZCBUeCBwa3RzIHByb2Nlc3NlZCBpbiB0aGUgaXNyICovCisJaW50IHR4X2Z1bGw7ICAgICAgICAvKiBUeCByaW5nIGlzIGZ1bGwgKi8KKyAgICAKKwltaWJfY291bnRlcnNfdCBtaWI7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisKKwlpbnQgaW9fc2l6ZTsKKwlpbnQgcG9ydF9udW07ICAvLyAwIG9yIDEKKwlpbnQgY2hpcF9yZXY7CisJdTMyIHBvcnRfb2Zmc2V0OworICAgIAorCWludCBwaHlfYWRkcjsgLy8gUEhZIGFkZHJlc3MKKwl1MzIgbGFzdF9wc3I7IC8vIGxhc3QgdmFsdWUgb2YgdGhlIHBvcnQgc3RhdHVzIHJlZ2lzdGVyCisKKwlpbnQgb3B0aW9uczsgICAgIC8qIFVzZXItc2V0dGFibGUgbWlzYy4gZHJpdmVyIG9wdGlvbnMuICovCisJaW50IGRydl9mbGFnczsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwlzcGlubG9ja190IGxvY2s7IC8qIFNlcmlhbGlzZSBhY2Nlc3MgdG8gZGV2aWNlICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbWFjaGkuYyBiL2RyaXZlcnMvbmV0L2hhbWFjaGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDk2NzE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaGFtYWNoaS5jCkBAIC0wLDAgKzEsMjAyNCBAQAorLyogaGFtYWNoaS5jOiBBIFBhY2tldCBFbmdpbmVzIEdOSUMtSUkgR2lnYWJpdCBFdGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LiAqLworLyoKKwlXcml0dGVuIDE5OTgtMjAwMCBieSBEb25hbGQgQmVja2VyLgorCVVwZGF0ZXMgMjAwMCBieSBLZWl0aCBVbmRlcndvb2QuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIAorCXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisJRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdAorCXJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZS4gIFRoaXMgZmlsZSBpcyBub3QKKwlhIGNvbXBsZXRlIHByb2dyYW0gYW5kIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgZW50aXJlIG9wZXJhdGluZworCXN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorCisJVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisJVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSBQYWNrZXQgRW5naW5lcyBHTklDLUlJIFBDSSBHaWdhYml0IEV0aGVybmV0CisJYWRhcHRlci4KKworCVN1cHBvcnQgYW5kIHVwZGF0ZXMgYXZhaWxhYmxlIGF0CisJaHR0cDovL3d3dy5zY3lsZC5jb20vbmV0d29yay9oYW1hY2hpLmh0bWwKKwlvcgorCWh0dHA6Ly93d3cucGFybC5jbGVtc29uLmVkdS9+a2VpdGh1L2hhbWFjaGkuaHRtbAorCisKKworCUxpbnV4IGtlcm5lbCBjaGFuZ2Vsb2c6CisKKwlMSzEuMC4xOgorCS0gZml4IGxhY2sgb2YgcGNpX2RldjwtPmRldiBhc3NvY2lhdGlvbgorCS0gZXRodG9vbCBzdXBwb3J0IChqZ2FyemlrKQorCisqLworCisjZGVmaW5lIERSVl9OQU1FCSJoYW1hY2hpIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wMStMSzEuMC4xIgorI2RlZmluZSBEUlZfUkVMREFURQkiNS8xOC8yMDAxIgorCisKKy8qIEEgZmV3IHVzZXItY29uZmlndXJhYmxlIHZhbHVlcy4gKi8KKworc3RhdGljIGludCBkZWJ1ZyA9IDE7CQkvKiAxIG5vcm1hbCBtZXNzYWdlcywgMCBxdWlldCAuLiA3IHZlcmJvc2UuICAqLworI2RlZmluZSBmaW5hbF92ZXJzaW9uCisjZGVmaW5lIGhhbWFjaGlfZGVidWcgZGVidWcKKy8qIE1heGltdW0gZXZlbnRzIChSeCBwYWNrZXRzLCBldGMuKSB0byBoYW5kbGUgYXQgZWFjaCBpbnRlcnJ1cHQuICovCitzdGF0aWMgaW50IG1heF9pbnRlcnJ1cHRfd29yayA9IDQwOworc3RhdGljIGludCBtdHU7CisvKiBEZWZhdWx0IHZhbHVlcyBzZWxlY3RlZCBieSB0ZXN0aW5nIG9uIGEgZHVhbCBwcm9jZXNzb3IgUElJSS00NTAgKi8KKy8qIFRoZXNlIHNpeCBpbnRlcnJ1cHQgY29udHJvbCBwYXJhbWV0ZXJzIG1heSBiZSBzZXQgZGlyZWN0bHkgd2hlbiBsb2FkaW5nIHRoZQorICogbW9kdWxlLCBvciB0aHJvdWdoIHRoZSByeF9wYXJhbXMgYW5kIHR4X3BhcmFtcyB2YXJpYWJsZXMKKyAqLworc3RhdGljIGludCBtYXhfcnhfbGF0ZW5jeSA9IDB4MTE7CitzdGF0aWMgaW50IG1heF9yeF9nYXAgPSAweDA1Oworc3RhdGljIGludCBtaW5fcnhfcGt0ID0gMHgxODsKK3N0YXRpYyBpbnQgbWF4X3R4X2xhdGVuY3kgPSAweDAwOyAKK3N0YXRpYyBpbnQgbWF4X3R4X2dhcCA9IDB4MDA7CitzdGF0aWMgaW50IG1pbl90eF9wa3QgPSAweDMwOworCisvKiBTZXQgdGhlIGNvcHkgYnJlYWtwb2ludCBmb3IgdGhlIGNvcHktb25seS10aW55LWZyYW1lcyBzY2hlbWUuCisgICAtU2V0dGluZyB0byA+IDE1MTggY2F1c2VzIGFsbCBmcmFtZXMgdG8gYmUgY29waWVkCisJLVNldHRpbmcgdG8gMCBkaXNhYmxlcyBjb3BpZXMKKyovCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhazsKKworLyogQW4gb3ZlcnJpZGUgZm9yIHRoZSBoYXJkd2FyZSBkZXRlY3Rpb24gb2YgYnVzIHdpZHRoLgorCVNldCB0byAxIHRvIGZvcmNlIDMyIGJpdCBQQ0kgYnVzIGRldGVjdGlvbi4gIFNldCB0byA0IHRvIGZvcmNlIDY0IGJpdC4KKwlBZGQgMiB0byBkaXNhYmxlIHBhcml0eSBkZXRlY3Rpb24uCisqLworc3RhdGljIGludCBmb3JjZTMyOworCisKKy8qIFVzZWQgdG8gcGFzcyB0aGUgbWVkaWEgdHlwZSwgZXRjLgorICAgVGhlc2UgZXhpc3QgZm9yIGRyaXZlciBpbnRlcm9wZXJhYmlsaXR5LgorICAgTm8gbWVkaWEgdHlwZXMgYXJlIGN1cnJlbnRseSBkZWZpbmVkLgorCQktIFRoZSBsb3dlciA0IGJpdHMgYXJlIHJlc2VydmVkIGZvciB0aGUgbWVkaWEgdHlwZS4KKwkJLSBUaGUgbmV4dCB0aHJlZSBiaXRzIG1heSBiZSBzZXQgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJCQkweDAwMDAwMDAwIDogQXV0b2RldGVjdCBQQ0kgYnVzCisJCQkweDAwMDAwMDEwIDogRm9yY2UgMzIgYml0IFBDSSBidXMKKwkJCTB4MDAwMDAwMjAgOiBEaXNhYmxlIHBhcml0eSBkZXRlY3Rpb24KKwkJCTB4MDAwMDAwNDAgOiBGb3JjZSA2NCBiaXQgUENJIGJ1cworCQkJRGVmYXVsdCBpcyBhdXRvZGV0ZWN0CisJCS0gVGhlIG5leHQgYml0IGNhbiBiZSB1c2VkIHRvIGZvcmNlIGhhbGYtZHVwbGV4LiAgVGhpcyBpcyBhIGJhZAorCQkgIGlkZWEgc2luY2Ugbm8ga25vd24gaW1wbGVtZW50YXRpb25zIGltcGxlbWVudCBoYWxmLWR1cGxleCwgYW5kLAorCQkgIGluIGdlbmVyYWwsIGhhbGYtZHVwbGV4IGZvciBnaWdhYml0IGV0aGVybmV0IGlzIGEgYmFkIGlkZWEuCisJCQkweDAwMDAwMDgwIDogRm9yY2UgaGFsZi1kdXBsZXggCisJCQlEZWZhdWx0IGlzIGZ1bGwtZHVwbGV4LgorCQktIEluIHRoZSBvcmlnaW5hbCBkcml2ZXIsIHRoZSBuaW50aCBiaXQgY291bGQgYmUgdXNlZCB0byBmb3JjZQorCQkgIGZ1bGwtZHVwbGV4LiAgTWFpbnRhaW4gdGhhdCBmb3IgY29tcGF0aWJpbGl0eQorCQkgICAweDAwMDAwMjAwIDogRm9yY2UgZnVsbC1kdXBsZXgKKyovCisjZGVmaW5lIE1BWF9VTklUUyA4CQkJCS8qIE1vcmUgYXJlIHN1cHBvcnRlZCwgbGltaXQgb25seSBvbiBvcHRpb25zICovCitzdGF0aWMgaW50IG9wdGlvbnNbTUFYX1VOSVRTXSA9IHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9Oworc3RhdGljIGludCBmdWxsX2R1cGxleFtNQVhfVU5JVFNdID0gey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CisvKiBUaGUgSGFtYWNoaSBjaGlwc2V0IHN1cHBvcnRzIDMgcGFyYW1ldGVycyBlYWNoIGZvciBSeCBhbmQgVHgKKyAqIGludGVycnVwdXQgbWFuYWdlbWVudC4gIFBhcmFtZXRlcnMgd2lsbCBiZSBsb2FkZWQgYXMgc3BlY2lmaWVkIGludG8KKyAqIHRoZSBUeEludENvbnRyb2wgYW5kIFJ4SW50Q29udHJvbCByZWdpc3RlcnMuICAKKyAqCisgKiBUaGUgcmVnaXN0ZXJzIGFyZSBhcnJhbmdlZCBhcyBmb2xsb3dzOgorICogICAgIDIzIC0gMTYgICAxNSAtICA4ICAgNyAgICAtICAgIDAKKyAqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICogICB8IG1pbl9wa3QgfCBtYXhfZ2FwIHwgbWF4X2xhdGVuY3kgfAorICogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgIG1pbl9wa3QgICAgICA6IFRoZSBtaW5pbXVtIG51bWJlciBvZiBwYWNrZXRzIHByb2Nlc3NlZCBiZXR3ZWVuCisgKiAgICAgICAgICAgICAgICAgIGludGVycnVwdHMuIAorICogICBtYXhfZ2FwICAgICAgOiBUaGUgbWF4aW11bSBpbnRlci1wYWNrZXQgZ2FwIGluIHVuaXRzIG9mIDguMTkyIHVzCisgKiAgIG1heF9sYXRlbmN5ICA6IFRoZSBhYnNvbHV0ZSB0aW1lIGJldHdlZW4gaW50ZXJydXB0cyBpbiB1bml0cyBvZiA4LjE5MiB1cworICogCisgKi8KK3N0YXRpYyBpbnQgcnhfcGFyYW1zW01BWF9VTklUU10gPSB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKK3N0YXRpYyBpbnQgdHhfcGFyYW1zW01BWF9VTklUU10gPSB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IGFyZSBzZXQgYXQgY29tcGlsZSB0aW1lLiAqLworCisvKiBLZWVwIHRoZSByaW5nIHNpemVzIGEgcG93ZXIgb2YgdHdvIGZvciBjb21waWxlIGVmZmljaWVuY3kuCisJVGhlIGNvbXBpbGVyIHdpbGwgY29udmVydCA8dW5zaWduZWQ+JyUnPDJeTj4gaW50byBhIGJpdCBtYXNrLgorICAgTWFraW5nIHRoZSBUeCByaW5nIHRvbyBsYXJnZSBkZWNyZWFzZXMgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgY2hhbm5lbAorICAgYm9uZGluZyBhbmQgcGFja2V0IHByaW9yaXR5LgorICAgVGhlcmUgYXJlIG5vIGlsbCBlZmZlY3RzIGZyb20gdG9vLWxhcmdlIHJlY2VpdmUgcmluZ3MsIGV4Y2VwdCBmb3IKKwlleGNlc3NpdmUgbWVtb3J5IHVzYWdlICovCisvKiBFbXBpcmljYWxseSBpdCBhcHBlYXJzIHRoYXQgdGhlIFR4IHJpbmcgbmVlZHMgdG8gYmUgYSBsaXR0bGUgYmlnZ2VyCisgICBmb3IgdGhlc2UgR2JpdCBhZGFwdGVycyBvciB5b3UgZ2V0IGludG8gYW4gb3ZlcnJ1biBjb25kaXRpb24gcmVhbGx5CisgICBlYXNpbHkuICBBbHNvLCB0aGluZ3MgYXBwZWFyIHRvIHdvcmsgYSBiaXQgYmV0dGVyIGluIGJhY2stdG8tYmFjaworICAgY29uZmlndXJhdGlvbnMgaWYgdGhlIFJ4IHJpbmcgaXMgOCB0aW1lcyB0aGUgc2l6ZSBvZiB0aGUgVHggcmluZworKi8KKyNkZWZpbmUgVFhfUklOR19TSVpFCTY0CisjZGVmaW5lIFJYX1JJTkdfU0laRQk1MTIKKyNkZWZpbmUgVFhfVE9UQUxfU0laRQlUWF9SSU5HX1NJWkUqc2l6ZW9mKHN0cnVjdCBoYW1hY2hpX2Rlc2MpCisjZGVmaW5lIFJYX1RPVEFMX1NJWkUJUlhfUklOR19TSVpFKnNpemVvZihzdHJ1Y3QgaGFtYWNoaV9kZXNjKQorCisvKgorICogRW5hYmxlIG5ldGRldl9pb2N0bC4gIEFkZGVkIGludGVycnVwdCBjb2FsZXNjaW5nIHBhcmFtZXRlciBhZGp1c3RtZW50LgorICogMi8xOS85OSBQZXRlIFd5Y2tvZmYgPHd5Y2tvZmZAY2Euc2FuZGlhLmdvdj4KKyAqLworCisvKiBwbGF5IHdpdGggNjQtYml0IGFkZHJsZW47IHNlZW1zIHRvIGJlIGEgdGVlbnN5IGJpdCBzbG93ZXIgIC0tcHcgKi8KKy8qICNkZWZpbmUgQUREUkxFTiA2NCAqLworCisvKgorICogUlhfQ0hFQ0tTVU0gdHVybnMgb24gY2FyZC1nZW5lcmF0ZWQgcmVjZWl2ZSBjaGVja3N1bSBnZW5lcmF0aW9uIGZvcgorICogICBUQ1AgYW5kIFVEUCBwYWNrZXRzLiAgT3RoZXJ3aXNlIHRoZSB1cHBlciBsYXllcnMgZG8gdGhlIGNhbGN1bGF0aW9uLgorICogVFhfQ0hFQ0tTVU0gd29uJ3QgZG8gYW55dGhpbmcgdG9vIHVzZWZ1bCwgZXZlbiBpZiBpdCB3b3Jrcy4gIFRoZXJlJ3Mgbm8KKyAqICAgZWFzeSBtZWNoYW5pc20gYnkgd2hpY2ggdG8gdGVsbCB0aGUgVENQL1VEUCBzdGFjayB0aGF0IGl0IG5lZWQgbm90CisgKiAgIGdlbmVyYXRlIGNoZWNrc3VtcyBmb3IgdGhpcyBkZXZpY2UuICBCdXQgaWYgc29tZWJvZHkgY2FuIGZpbmQgYSB3YXkKKyAqICAgdG8gZ2V0IHRoYXQgdG8gd29yaywgbW9zdCBvZiB0aGUgY2FyZCB3b3JrIGlzIGluIGhlcmUgYWxyZWFkeS4KKyAqIDMvMTAvMTk5OSBQZXRlIFd5Y2tvZmYgPHd5Y2tvZmZAY2Euc2FuZGlhLmdvdj4KKyAqLworI3VuZGVmICBUWF9DSEVDS1NVTQorI2RlZmluZSBSWF9DSEVDS1NVTQorCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgdXN1YWxseSBhcmUgbm90IGNoYW5nZWQuICovCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQgICg1KkhaKQorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgkvKiBQcm9jZXNzb3IgdHlwZSBmb3IgY2FjaGUgYWxpZ25tZW50LiAqLworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorS0VSTl9JTkZPIERSVl9OQU1FICIuYzp2IiBEUlZfVkVSU0lPTiAiICIgRFJWX1JFTERBVEUgIiAgV3JpdHRlbiBieSBEb25hbGQgQmVja2VyXG4iCitLRVJOX0lORk8gIiAgIFNvbWUgbW9kaWZpY2F0aW9ucyBieSBFcmljIGthc3RlbiA8a2FzdGVuQG5zY2wubXN1LmVkdT5cbiIKK0tFUk5fSU5GTyAiICAgRnVydGhlciBtb2RpZmljYXRpb25zIGJ5IEtlaXRoIFVuZGVyd29vZCA8a2VpdGh1QHBhcmwuY2xlbXNvbi5lZHU+XG4iOworCisKKy8qIElQX01GIGFwcGVhcnMgdG8gYmUgb25seSBkZWZpbmVkIGluIDxuZXRpbmV0L2lwLmg+LCBob3dldmVyLAorICAgd2UgbmVlZCBpdCBmb3IgaGFyZHdhcmUgY2hlY2tzdW1taW5nIHN1cHBvcnQuICBGWUkuLi4gc29tZSBvZgorICAgdGhlIGRlZmluaXRpb25zIGluIDxuZXRpbmV0L2lwLmg+IGNvbmZsaWN0L2R1cGxpY2F0ZSB0aG9zZSBpbgorICAgb3RoZXIgbGludXggaGVhZGVycyBjYXVzaW5nIG1hbnkgY29tcGlsZXIgd2FybmluZ3MuCisqLworI2lmbmRlZiBJUF9NRgorICAjZGVmaW5lIElQX01GIDB4MjAwMCAgIC8qIElQIG1vcmUgZnJhZ3MgZnJvbSA8bmV0aW5ldC9pcC5oPiAqLyAKKyNlbmRpZgorCisvKiBEZWZpbmUgSVBfT0ZGU0VUIHRvIGJlIElQT1BUX09GRlNFVCAqLworI2lmbmRlZiBJUF9PRkZTRVQKKyAgI2lmZGVmIElQT1BUX09GRlNFVAorICAgICNkZWZpbmUgSVBfT0ZGU0VUIElQT1BUX09GRlNFVAorICAjZWxzZQorICAgICNkZWZpbmUgSVBfT0ZGU0VUIDIKKyAgI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBSVU5fQVQoeCkgKGppZmZpZXMgKyAoeCkpCisKKy8qIENvbmRlbnNlZCBidXMrZW5kaWFuIHBvcnRhYmlsaXR5IG9wZXJhdGlvbnMuICovCisjaWYgQUREUkxFTiA9PSA2NAorI2RlZmluZSBjcHVfdG9fbGVYWChhZGRyKQljcHVfdG9fbGU2NChhZGRyKQorI2Vsc2UgCisjZGVmaW5lIGNwdV90b19sZVhYKGFkZHIpCWNwdV90b19sZTMyKGFkZHIpCisjZW5kaWYgICAKKworCisvKgorCQkJCVRoZW9yeSBvZiBPcGVyYXRpb24KKworSS4gQm9hcmQgQ29tcGF0aWJpbGl0eQorCitUaGlzIGRldmljZSBkcml2ZXIgaXMgZGVzaWduZWQgZm9yIHRoZSBQYWNrZXQgRW5naW5lcyAiSGFtYWNoaSIKK0dpZ2FiaXQgRXRoZXJuZXQgY2hpcC4gIFRoZSBvbmx5IFBDQSBjdXJyZW50bHkgc3VwcG9ydGVkIGlzIHRoZSBHTklDLUlJIDY0LWJpdAorNjZNaHogUENJIGNhcmQuCisKK0lJLiBCb2FyZC1zcGVjaWZpYyBzZXR0aW5ncworCitObyBqdW1wZXJzIGV4aXN0IG9uIHRoZSBib2FyZC4gIFRoZSBjaGlwIHN1cHBvcnRzIHNvZnR3YXJlIGNvcnJlY3Rpb24gb2YKK3ZhcmlvdXMgbW90aGVyYm9hcmQgd2lyaW5nIGVycm9ycywgaG93ZXZlciB0aGlzIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0Cit0aGF0IGZlYXR1cmUuCisKK0lJSS4gRHJpdmVyIG9wZXJhdGlvbgorCitJSUlhLiBSaW5nIGJ1ZmZlcnMKKworVGhlIEhhbWFjaGkgdXNlcyBhIHR5cGljYWwgZGVzY3JpcHRvciBiYXNlZCBidXMtbWFzdGVyIGFyY2hpdGVjdHVyZS4KK1RoZSBkZXNjcmlwdG9yIGxpc3QgaXMgc2ltaWxhciB0byB0aGF0IHVzZWQgYnkgdGhlIERpZ2l0YWwgVHVsaXAuCitUaGlzIGRyaXZlciB1c2VzIHR3byBzdGF0aWNhbGx5IGFsbG9jYXRlZCBmaXhlZC1zaXplIGRlc2NyaXB0b3IgbGlzdHMKK2Zvcm1lZCBpbnRvIHJpbmdzIGJ5IGEgYnJhbmNoIGZyb20gdGhlIGZpbmFsIGRlc2NyaXB0b3IgdG8gdGhlIGJlZ2lubmluZyBvZgordGhlIGxpc3QuICBUaGUgcmluZyBzaXplcyBhcmUgc2V0IGF0IGNvbXBpbGUgdGltZSBieSBSWC9UWF9SSU5HX1NJWkUuCisKK1RoaXMgZHJpdmVyIHVzZXMgYSB6ZXJvLWNvcHkgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgc2NoZW1lIHNpbWlsYXIgbXkgb3RoZXIKK25ldHdvcmsgZHJpdmVycy4KK1RoZSBkcml2ZXIgYWxsb2NhdGVzIGZ1bGwgZnJhbWUgc2l6ZSBza2J1ZmZzIGZvciB0aGUgUnggcmluZyBidWZmZXJzIGF0CitvcGVuKCkgdGltZSBhbmQgcGFzc2VzIHRoZSBza2ItPmRhdGEgZmllbGQgdG8gdGhlIEhhbWFjaGkgYXMgcmVjZWl2ZSBkYXRhCitidWZmZXJzLiAgV2hlbiBhbiBpbmNvbWluZyBmcmFtZSBpcyBsZXNzIHRoYW4gUlhfQ09QWUJSRUFLIGJ5dGVzIGxvbmcsCithIGZyZXNoIHNrYnVmZiBpcyBhbGxvY2F0ZWQgYW5kIHRoZSBmcmFtZSBpcyBjb3BpZWQgdG8gdGhlIG5ldyBza2J1ZmYuCitXaGVuIHRoZSBpbmNvbWluZyBmcmFtZSBpcyBsYXJnZXIsIHRoZSBza2J1ZmYgaXMgcGFzc2VkIGRpcmVjdGx5IHVwIHRoZQorcHJvdG9jb2wgc3RhY2sgYW5kIHJlcGxhY2VkIGJ5IGEgbmV3bHkgYWxsb2NhdGVkIHNrYnVmZi4KKworVGhlIFJYX0NPUFlCUkVBSyB2YWx1ZSBpcyBjaG9zZW4gdG8gdHJhZGUtb2ZmIHRoZSBtZW1vcnkgd2FzdGVkIGJ5Cit1c2luZyBhIGZ1bGwtc2l6ZWQgc2tidWZmIGZvciBzbWFsbCBmcmFtZXMgdnMuIHRoZSBjb3B5aW5nIGNvc3RzIG9mIGxhcmdlcgorZnJhbWVzLiAgR2lnYWJpdCBjYXJkcyBhcmUgdHlwaWNhbGx5IHVzZWQgb24gZ2VuZXJvdXNseSBjb25maWd1cmVkIG1hY2hpbmVzCithbmQgdGhlIHVuZGVyZmlsbGVkIGJ1ZmZlcnMgaGF2ZSBuZWdsaWdpYmxlIGltcGFjdCBjb21wYXJlZCB0byB0aGUgYmVuZWZpdCBvZgorYSBzaW5nbGUgYWxsb2NhdGlvbiBzaXplLCBzbyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB6ZXJvIHJlc3VsdHMgaW4gbmV2ZXIKK2NvcHlpbmcgcGFja2V0cy4KKworSUlJYi9jLiBUcmFuc21pdC9SZWNlaXZlIFN0cnVjdHVyZQorCitUaGUgUnggYW5kIFR4IGRlc2NyaXB0b3Igc3RydWN0dXJlIGFyZSBzdHJhaWdodC1mb3J3YXJkLCB3aXRoIG5vIGhpc3RvcmljYWwKK2JhZ2dhZ2UgdGhhdCBtdXN0IGJlIGV4cGxhaW5lZC4gIFVubGlrZSB0aGUgYXdrd2FyZCBEQkRNQSBzdHJ1Y3R1cmUsIHRoZXJlCithcmUgbm8gdW51c2VkIGZpZWxkcyBvciBvcHRpb24gYml0cyB0aGF0IGhhZCBvbmx5IG9uZSBhbGxvd2FibGUgc2V0dGluZy4KKworVHdvIGRldGFpbHMgc2hvdWxkIGJlIG5vdGVkIGFib3V0IHRoZSBkZXNjcmlwdG9yczogVGhlIGNoaXAgc3VwcG9ydHMgYm90aCAzMgorYml0IGFuZCA2NCBiaXQgYWRkcmVzcyBzdHJ1Y3R1cmVzLCBhbmQgdGhlIGxlbmd0aCBmaWVsZCBpcyBvdmVyd3JpdHRlbiBvbgordGhlIHJlY2VpdmUgZGVzY3JpcHRvcnMuICBUaGUgZGVzY3JpcHRvciBsZW5ndGggaXMgc2V0IGluIHRoZSBjb250cm9sIHdvcmQKK2ZvciBlYWNoIGNoYW5uZWwuIFRoZSBkZXZlbG9wbWVudCBkcml2ZXIgdXNlcyAzMiBiaXQgYWRkcmVzc2VzIG9ubHksIGhvd2V2ZXIKKzY0IGJpdCBhZGRyZXNzZXMgbWF5IGJlIGVuYWJsZWQgZm9yIDY0IGJpdCBhcmNoaXRlY3R1cmVzIGUuZy4gdGhlIEFscGhhLgorCitJSUlkLiBTeW5jaHJvbml6YXRpb24KKworVGhpcyBkcml2ZXIgaXMgdmVyeSBzaW1pbGFyIHRvIG15IG90aGVyIG5ldHdvcmsgZHJpdmVycy4KK1RoZSBkcml2ZXIgcnVucyBhcyB0d28gaW5kZXBlbmRlbnQsIHNpbmdsZS10aHJlYWRlZCBmbG93cyBvZiBjb250cm9sLiAgT25lCitpcyB0aGUgc2VuZC1wYWNrZXQgcm91dGluZSwgd2hpY2ggZW5mb3JjZXMgc2luZ2xlLXRocmVhZGVkIHVzZSBieSB0aGUKK2Rldi0+dGJ1c3kgZmxhZy4gIFRoZSBvdGhlciB0aHJlYWQgaXMgdGhlIGludGVycnVwdCBoYW5kbGVyLCB3aGljaCBpcyBzaW5nbGUKK3RocmVhZGVkIGJ5IHRoZSBoYXJkd2FyZSBhbmQgb3RoZXIgc29mdHdhcmUuCisKK1RoZSBzZW5kIHBhY2tldCB0aHJlYWQgaGFzIHBhcnRpYWwgY29udHJvbCBvdmVyIHRoZSBUeCByaW5nIGFuZCAnZGV2LT50YnVzeScKK2ZsYWcuICBJdCBzZXRzIHRoZSB0YnVzeSBmbGFnIHdoZW5ldmVyIGl0J3MgcXVldWluZyBhIFR4IHBhY2tldC4gSWYgdGhlIG5leHQKK3F1ZXVlIHNsb3QgaXMgZW1wdHksIGl0IGNsZWFycyB0aGUgdGJ1c3kgZmxhZyB3aGVuIGZpbmlzaGVkIG90aGVyd2lzZSBpdCBzZXRzCit0aGUgJ2htcC0+dHhfZnVsbCcgZmxhZy4KKworVGhlIGludGVycnVwdCBoYW5kbGVyIGhhcyBleGNsdXNpdmUgY29udHJvbCBvdmVyIHRoZSBSeCByaW5nIGFuZCByZWNvcmRzIHN0YXRzCitmcm9tIHRoZSBUeCByaW5nLiAgQWZ0ZXIgcmVhcGluZyB0aGUgc3RhdHMsIGl0IG1hcmtzIHRoZSBUeCBxdWV1ZSBlbnRyeSBhcworZW1wdHkgYnkgaW5jcmVtZW50aW5nIHRoZSBkaXJ0eV90eCBtYXJrLiBJZmYgdGhlICdobXAtPnR4X2Z1bGwnIGZsYWcgaXMgc2V0LCBpdAorY2xlYXJzIGJvdGggdGhlIHR4X2Z1bGwgYW5kIHRidXN5IGZsYWdzLgorCitJVi4gTm90ZXMKKworVGhhbmtzIHRvIEtpbSBTdGVhcm5zIG9mIFBhY2tldCBFbmdpbmVzIGZvciBwcm92aWRpbmcgYSBwYWlyIG9mIEdOSUMtSUkgYm9hcmRzLgorCitJVmIuIFJlZmVyZW5jZXMKKworSGFtYWNoaSBFbmdpbmVlcmluZyBEZXNpZ24gU3BlY2lmaWNhdGlvbiwgNS8xNS85NworKE5vdGU6IFRoaXMgdmVyc2lvbiB3YXMgbWFya2VkICJDb25maWRlbnRpYWwiLikKKworSVZjLiBFcnJhdGEKKworTm9uZSBub3RlZC4gIAorCitWLiAgUmVjZW50IENoYW5nZXMKKworMDEvMTUvMTk5OSBFUEsgIEVubGFyZ2VtZW50IG9mIHRoZSBUWCBhbmQgUlggcmluZyBzaXplcy4gIFRoaXMgYXBwZWFycyAKKyAgICB0byBoZWxwIGF2b2lkIHNvbWUgc3RhbGwgY29uZGl0aW9ucyAtLSB0aGlzIG5lZWRzIGZ1cnRoZXIgcmVzZWFyY2guCisKKzAxLzE1LzE5OTkgRVBLICBDcmVhdGlvbiBvZiB0aGUgaGFtYWNoaV90eCBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24gY2xlYW5zIAorICAgIHRoZSBUeCByaW5nIGFuZCBpcyBjYWxsZWQgZnJvbSBoYW1hY2hpX3N0YXJ0X3htaXQgKHRoaXMgdXNlZCB0byBiZQorICAgIGNhbGxlZCBmcm9tIGhhbWFjaGlfaW50ZXJydXB0IGJ1dCBpdCB0ZW5kcyB0byBkZWxheSBleGVjdXRpb24gb2YgdGhlCisgICAgaW50ZXJydXB0IGhhbmRsZXIgYW5kIHRodXMgcmVkdWNlIGJhbmR3aWR0aCBieSByZWR1Y2luZyB0aGUgbGF0ZW5jeQorICAgIGJldHdlZW4gaGFtYWNoaV9yeCgpJ3MpLiAgTm90YWJseSwgc29tZSBtb2RpZmljYXRpb24gaGFzIGJlZW4gbWFkZSBzbyAKKyAgICB0aGF0IHRoZSBjbGVhbmluZyBsb29wIGNoZWNrcyBvbmx5IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBEZXNjT3duIGJpdCAKKyAgICBpc24ndCBzZXQgaW4gdGhlIHN0YXR1cyBmbGFnIHNpbmNlIHRoZSBjYXJkIGlzIG5vdCByZXF1aXJlZCAKKyAgICB0byBzZXQgdGhlIGVudGlyZSBmbGFnIHRvIHplcm8gYWZ0ZXIgcHJvY2Vzc2luZy4KKworMDEvMTUvMTk5OSBFUEsgSW4gdGhlIGhhbWFjaGlfc3RhcnRfdHggZnVuY3Rpb24sIHRoZSBUeCByaW5nIGZ1bGwgZmxhZyBpcyAKKyAgICBjaGVja2VkIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGFkZCBhIGJ1ZmZlciB0byB0aGUgcmluZy4gIElmIHRoZSByaW5nIGlzIGZ1bGwKKyAgICBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gZnJlZSBhbnkgZGlydHkgYnVmZmVycyBhbmQgdGh1cyBmaW5kIHNwYWNlIGZvcgorICAgIHRoZSBuZXcgYnVmZmVyIG9yIHRoZSBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIHdoaWNoIHNob3VsZCBjYXNlIHRoZQorICAgIHNjaGVkdWxlciB0byByZXNjaGVkdWxlIHRoZSBidWZmZXIgbGF0ZXIuCisKKzAxLzE1LzE5OTkgRVBLIFNvbWUgYWRqdXN0bWVudHMgd2VyZSBtYWRlIHRvIHRoZSBjaGlwIGluaXRpYWxpemF0aW9uLiAgCisgICAgRW5kLXRvLWVuZCBmbG93IGNvbnRyb2wgc2hvdWxkIG5vdyBiZSBmdWxseSBhY3RpdmUgYW5kIHRoZSBpbnRlcnJ1cHQgCisgICAgYWxnb3JpdGhtIHZhcnMgaGF2ZSBiZWVuIGNoYW5nZWQuICBUaGVzZSBjb3VsZCBwcm9iYWJseSB1c2UgZnVydGhlciB0dW5pbmcuCisKKzAxLzE1LzE5OTkgRVBLIEFkZGVkIHRoZSBtYXhfe3J4LHR4fV9sYXRlbmN5IG9wdGlvbnMuICBUaGVzZSBhcmUgdXNlZCB0bworICAgIHNldCB0aGUgcnggYW5kIHR4IGxhdGVuY2llcyBmb3IgdGhlIEhhbWFjaGkgaW50ZXJydXB0cy4gSWYgeW91J3JlIGhhdmluZworICAgIHByb2JsZW1zIHdpdGggbmV0d29yayBzdGFsbHMsIHRyeSBzZXR0aW5nIHRoZXNlIHRvIGhpZ2hlciB2YWx1ZXMuCisgICAgVmFsaWQgdmFsdWVzIGFyZSAweDAwIHRocm91Z2ggMHhmZi4KKworMDEvMTUvMTk5OSBFUEsgSW4gZ2VuZXJhbCwgdGhlIG92ZXJhbGwgYmFuZHdpZHRoIGhhcyBpbmNyZWFzZWQgYW5kIAorICAgIGxhdGVuY2llcyBhcmUgYmV0dGVyIChzb21ldGltZXMgYnkgYSBmYWN0b3Igb2YgMikuICBTdGFsbHMgYXJlIHJhcmUgYXQKKyAgICB0aGlzIHBvaW50LCBob3dldmVyIHRoZXJlIHN0aWxsIGFwcGVhcnMgdG8gYmUgYSBidWcgc29tZXdoZXJlIGJldHdlZW4gdGhlCisgICAgaGFyZHdhcmUgYW5kIGRyaXZlci4gIFRDUCBjaGVja3N1bSBlcnJvcnMgdW5kZXIgbG9hZCBhbHNvIGFwcGVhciB0byBiZQorICAgIGVsaW1pbmF0ZWQgYXQgdGhpcyBwb2ludC4KKworMDEvMTgvMTk5OSBFUEsgRW5zdXJlZCB0aGF0IHRoZSBEZXNjRW5kUmluZyBiaXQgd2FzIGJlaW5nIHNldCBvbiBib3RoIHRoZQorICAgIFJ4IGFuZCBUeCByaW5ncy4gIFRoaXMgYXBwZWFycyB0byBoYXZlIGJlZW4gYWZmZWN0aW5nIHdoZXRoZXIgYSBwYXJ0aWN1bGFyCisgICAgcGVlci10by1wZWVyIGNvbm5lY3Rpb24gd291bGQgaGFuZyB1bmRlciBoaWdoIGxvYWQuICBJIGJlbGlldmUgdGhlIFJ4CisgICAgcmluZ3Mgd2FzIHR5cGljYWxseSBnZXR0aW5nIHNldCBjb3JyZWN0bHksIGJ1dCB0aGUgVHggcmluZyB3YXNuJ3QgZ2V0dGluZworICAgIHRoZSBEZXNjRW5kUmluZyBiaXQgc2V0IGR1cmluZyBpbml0aWFsaXphdGlvbi4gPz8/IERvZXMgdGhpcyBtZWFuIHRoZQorICAgIGhhbWFjaGkgY2FyZCBpcyB1c2luZyB0aGUgRGVzY0VuZFJpbmcgaW4gcHJvY2Vzc2luZyBldmVuIGlmIGEgcGFydGljdWxhcgorICAgIHNsb3QgaXNuJ3QgaW4gdXNlIC0tIGh5cG90aGV0aWNhbGx5LCB0aGUgY2FyZCBtaWdodCBiZSBzZWFyY2hpbmcgdGhlIAorICAgIGVudGlyZSBUeCByaW5nIGZvciBzbG90cyB3aXRoIHRoZSBEZXNjT3duIGJpdCBzZXQgYW5kIHRoZW4gcHJvY2Vzc2luZworICAgIHRoZW0uICBJZiB0aGUgRGVzY0VuZFJpbmcgYml0IGlzbid0IHNldCwgdGhlbiBpdCBtaWdodCBqdXN0IHdhbmRlciBvZmYKKyAgICB0aHJvdWdoIG1lbW9yeSB1bnRpbCBpdCBoaXRzIGEgY2h1bmsgb2YgZGF0YSB3aXRoIHRoYXQgYml0IHNldAorICAgIGFuZCB0aGVuIGxvb3BpbmcgYmFjay4KKworMDIvMDkvMTk5OSBFUEsgQWRkZWQgTWljaGVsIE11ZWxsZXIncyBUeERNQSBJbnRlcnJ1cHQgYW5kIFR4LXRpbWVvdXQgCisgICAgcHJvYmxlbSAoVHhDbWQgYW5kIFJ4Q21kIG5lZWQgb25seSB0byBiZSBzZXQgd2hlbiBpZGxlIG9yIHN0b3BwZWQuCisKKzAyLzA5LzE5OTkgRVBLIEFkZGVkIGNvZGUgdG8gY2hlY2svcmVzZXQgZGV2LT50YnVzeSBpbiBoYW1hY2hpX2ludGVycnVwdC4KKyAgICAoTWljaGVsIE11ZWxsZXIgcG9pbnRlZCBvdXQgdGhlIGBgcGVybWFuZW50bHkgYnVzeScnIHBvdGVudGlhbCAKKyAgICBwcm9ibGVtIGhlcmUpLgorCiswMi8yMi8xOTk5IEVQSyBBZGRlZCBQZXRlIFd5Y2tvZmYncyBpb2N0bCB0byBjb250cm9sIHRoZSBUeC9SeCBsYXRlbmNpZXMuIAorCiswMi8yMy8xOTk5IEVQSyBWZXJpZmllZCB0aGF0IHRoZSBpbnRlcnJ1cHQgc3RhdHVzIGZpZWxkIGJpdHMgZm9yIFR4IHdlcmUKKyAgICBpbmNvcnJlY3RseSBkZWZpbmVkIGFuZCBjb3JyZWN0ZWQgKGFzIHBlciBNaWNoZWwgTXVlbGxlcikuCisKKzAyLzIzLzE5OTkgRVBLIENvcnJlY3RlZCB0aGUgVHggZnVsbCBjaGVjayB0byBjaGVjayB0aGF0IGF0IGxlYXN0IDQgc2xvdHMKKyAgICB3ZXJlIGF2YWlsYWJsZSBiZWZvcmUgcmVzZXRpbmcgdGhlIHRidXN5IGFuZCB0eF9mdWxsIGZsYWdzCisgICAgKGFzIHBlciBNaWNoZWwgTXVlbGxlcikuCisKKzAzLzExLzE5OTkgRVBLIEFkZGVkIFBldGUgV3lja29mZidzIGhhcmR3YXJlIGNoZWNrc3VtbWluZyBzdXBwb3J0LgorCisxMi8zMS8xOTk5IEtEVSBDbGVhbmVkIHVwIGFzc29ydGVkIHRoaW5ncyBhbmQgYWRkZWQgRG9uJ3MgY29kZSB0byBmb3JjZQorMzIgYml0LgorCiswMi8yMC8yMDAwIEtEVSBTb21lIG9mIHRoZSBjb250cm9sIHdhcyBqdXN0IHBsYWluIG9kZC4gIENsZWFuZWQgdXAgdGhlCitoYW1hY2hpX3N0YXJ0X3htaXQoKSBhbmQgaGFtYWNoaV9pbnRlcnJ1cHQoKSBjb2RlLiAgVGhlcmUgaXMgc3RpbGwgc29tZQorcmUtc3RydWN0dXJpbmcgSSB3b3VsZCBsaWtlIHRvIGRvLiAgCisKKzAzLzAxLzIwMDAgS0RVIEV4cGVyaW1lbnRpbmcgd2l0aCBhIFdJREUgcmFuZ2Ugb2YgaW50ZXJydXB0IG1pdGlnYXRpb24KK3BhcmFtZXRlcnMgb24gYSBkdWFsIFAzLTQ1MCBzZXR1cCB5aWVsZGVkIHRoZSBuZXcgZGVmYXVsdCBpbnRlcnJ1cHQKK21pdGlnYXRpb24gcGFyYW1ldGVycy4gIFR4IHNob3VsZCBpbnRlcnJ1cHQgVkVSWSBpbmZyZXF1ZW50bHkgZHVlIHRvCitFcmljJ3Mgc2NoZW1lLiAgUnggc2hvdWxkIGJlIG1vcmUgb2Z0ZW4uLi4KKworMDMvMTMvMjAwMCBLRFUgQWRkZWQgYSBwYXRjaCB0byBtYWtlIHRoZSBSeCBDaGVja3N1bSBjb2RlIGludGVyYWN0CituaWNlbHkgd2l0aCBub24tbGludXggbWFjaGluZXMuICAKKworMDMvMTMvMjAwMCBLRFUgRXhwZXJpbWVudGVkIHdpdGggc29tZSBvZiB0aGUgY29uZmlndXJhdGlvbiB2YWx1ZXM6ICAKKworCS1JdCBzZWVtcyB0aGF0IGVuYWJsaW5nIFBDSSBwZXJmb3JtYW5jZSBjb21tYW5kcyBmb3IgZGVzY3JpcHRvcnMKKwkoY2hhbmdpbmcgUnhETUFDdHJsIGFuZCBUeERNQUN0cmwgbG93ZXIgbmliYmxlIGZyb20gNSB0byBEKSBoYXMgbWluaW1hbCAKKwlwZXJmb3JtYW5jZSBpbXBhY3QgZm9yIGFueSBvZiBteSB0ZXN0cy4gKHR0Y3AsIG5ldHBpcGUsIG5ldHBlcmYpICBJIHdpbGwgCisJbGVhdmUgdGhlbSB0aGF0IHdheSB1bnRpbCBJIGhlYXIgZnVydGhlciBmZWVkYmFjay4KKworCS1JbmNyZWFzaW5nIHRoZSBQQ0lfTEFURU5DWV9USU1FUiB0byAxMzAgCisJKDIgKyAoYnVyc3Qgc2l6ZSBvZiAxMjggKiAoMCB3YWl0IHN0YXRlcyArIDEpKSkgc2VlbXMgdG8gc2xpZ2h0bHkKKwlkZWdyYWRlIHBlcmZvcm1hbmNlLiAgTGVhdmluZyBkZWZhdWx0IGF0IDY0IHBlbmRpbmcgZnVydGhlciBpbmZvcm1hdGlvbi4KKworMDMvMTQvMjAwMCBLRFUgRnVydGhlciB0dW5pbmc6ICAKKworCS1hZGp1c3RlZCBib2d1c2NudCBpbiBoYW1hY2hpX3J4KCkgdG8gZGVwZW5kIG9uIGludGVycnVwdAorCW1pdGlnYXRpb24gcGFyYW1ldGVycyBjaG9zZW4uCisKKwktU2VsZWN0ZWQgYSBzZXQgb2YgaW50ZXJydXB0IHBhcmFtZXRlcnMgYmFzZWQgb24gc29tZSBleHRlbnNpdmUgdGVzdGluZy4gIAorCVRoZXNlIG1heSBjaGFuZ2Ugd2l0aCBtb3JlIHRlc3RpbmcuCisKK1RPIERPOgorCistQ29uc2lkZXIgYm9ycm93aW5nIGZyb20gdGhlIGFjZW5pYyBkcml2ZXIgY29kZSB0byBjaGVjayBQQ0lfQ09NTUFORCBmb3IKK1BDSV9DT01NQU5EX0lOVkFMSURBVEUuICBTZXQgbWF4aW11bSBidXJzdCBzaXplIHRvIGNhY2hlIGxpbmUgc2l6ZSBpbgordGhhdCBjYXNlLgorCistZml4IHRoZSByZXNldCBwcm9jZWR1cmUuICBJdCBkb2Vzbid0IHF1aXRlIHdvcmsuICAKKyovCisKKy8qIEEgZmV3IHZhbHVlcyB0aGF0IG1heSBiZSB0d2Vha2VkLiAqLworLyogU2l6ZSBvZiBlYWNoIHRlbXBvcmFyeSBSeCBidWZmZXIsIGNhbGN1bGF0ZWQgYXM6CisgKiAxNTE4IGJ5dGVzIChldGhlcm5ldCBwYWNrZXQpICsgMiBieXRlcyAodG8gZ2V0IDggYnl0ZSBhbGlnbm1lbnQgZm9yCisgKiB0aGUgY2FyZCkgKyA4IGJ5dGVzIG9mIHN0YXR1cyBpbmZvICsgOCBieXRlcyBmb3IgdGhlIFJ4IENoZWNrc3VtICsKKyAqIDIgbW9yZSBiZWNhdXNlIHdlIHVzZSBza2JfcmVzZXJ2ZS4gIAorICovCisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1MzgKKworLyogRm9yIG5vdywgdGhpcyBpcyBnb2luZyB0byBiZSBzZXQgdG8gdGhlIG1heGltdW0gc2l6ZSBvZiBhbiBldGhlcm5ldAorICogcGFja2V0LiAgRXZlbnR1YWxseSwgd2UgbWF5IHdhbnQgdG8gbWFrZSBpdCBhIHZhcmlhYmxlIHRoYXQgaXMKKyAqIHJlbGF0ZWQgdG8gdGhlIE1UVQorICovCisjZGVmaW5lIE1BWF9GUkFNRV9TSVpFICAxNTE4CisKKy8qIFRoZSByZXN0IG9mIHRoZXNlIHZhbHVlcyBzaG91bGQgbmV2ZXIgY2hhbmdlLiAqLworCitzdGF0aWMgdm9pZCBoYW1hY2hpX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CisKK2VudW0gY2FwYWJpbGl0eV9mbGFncyB7Q2FuSGF2ZU1JST0xLCB9Oworc3RhdGljIHN0cnVjdCBjaGlwX2luZm8geworCXUxNgl2ZW5kb3JfaWQsIGRldmljZV9pZCwgZGV2aWNlX2lkX21hc2ssIHBhZDsKKwljb25zdCBjaGFyICpuYW1lOworCXZvaWQgKCptZWRpYV90aW1lcikodW5zaWduZWQgbG9uZyBkYXRhKTsKKwlpbnQgZmxhZ3M7Cit9IGNoaXBfdGJsW10gPSB7CisJezB4MTMxOCwgMHgwOTExLCAweGZmZmYsIDAsICJIYW1hY2hpIEdOSUMtSUkiLCBoYW1hY2hpX3RpbWVyLCAwfSwKKwl7MCx9LAorfTsKKworLyogT2Zmc2V0cyB0byB0aGUgSGFtYWNoaSByZWdpc3RlcnMuICBWYXJpb3VzIHNpemVzLiAqLworZW51bSBoYW1hY2hpX29mZnNldHMgeworCVR4RE1BQ3RybD0weDAwLCBUeENtZD0weDA0LCBUeFN0YXR1cz0weDA2LCBUeFB0cj0weDA4LCBUeEN1clB0cj0weDEwLAorCVJ4RE1BQ3RybD0weDIwLCBSeENtZD0weDI0LCBSeFN0YXR1cz0weDI2LCBSeFB0cj0weDI4LCBSeEN1clB0cj0weDMwLAorCVBDSUNsa01lYXM9MHgwNjAsIE1pc2NTdGF0dXM9MHgwNjYsIENoaXBSZXY9MHg2OCwgQ2hpcFJlc2V0PTB4MDZCLAorCUxFREN0cmw9MHgwNkMsIFZpcnR1YWxKdW1wZXJzPTB4MDZELCBHUElPPTB4NkUsCisJVHhDaGVja3N1bT0weDA3NCwgUnhDaGVja3N1bT0weDA3NiwKKwlUeEludHJDdHJsPTB4MDc4LCBSeEludHJDdHJsPTB4MDdDLAorCUludGVycnVwdEVuYWJsZT0weDA4MCwgSW50ZXJydXB0Q2xlYXI9MHgwODQsIEludHJTdGF0dXM9MHgwODgsCisJRXZlbnRTdGF0dXM9MHgwOEMsCisJTUFDQ25mZz0weDBBMCwgRnJhbWVHYXAwPTB4MEEyLCBGcmFtZUdhcDE9MHgwQTQsCisJLyogU2VlIGVudW0gTUlJX29mZnNldHMgYmVsb3cuICovCisJTUFDQ25mZzI9MHgwQjAsIFJ4RGVwdGg9MHgwQjgsIEZsb3dDdHJsPTB4MEJDLCBNYXhGcmFtZVNpemU9MHgwQ0UsCisJQWRkck1vZGU9MHgwRDAsIFN0YXRpb25BZGRyPTB4MEQyLAorCS8qIEdpZ2FiaXQgQXV0b05lZ290aWF0aW9uLiAqLworCUFOQ3RybD0weDBFMCwgQU5TdGF0dXM9MHgwRTIsIEFOWGNobmdDdHJsPTB4MEU0LCBBTkFkdmVydGlzZT0weDBFOCwKKwlBTkxpbmtQYXJ0bmVyQWJpbGl0eT0weDBFQSwKKwlFRUNtZFN0YXR1cz0weDBGMCwgRUVEYXRhPTB4MEYxLCBFRUFkZHI9MHgwRjIsCisJRklGT2NmZz0weDBGOCwKK307CisKKy8qIE9mZnNldHMgdG8gdGhlIE1JSS1tb2RlIHJlZ2lzdGVycy4gKi8KK2VudW0gTUlJX29mZnNldHMgeworCU1JSV9DbWQ9MHhBNiwgTUlJX0FkZHI9MHhBOCwgTUlJX1dyX0RhdGE9MHhBQSwgTUlJX1JkX0RhdGE9MHhBQywKKwlNSUlfU3RhdHVzPTB4QUUsCit9OworCisvKiBCaXRzIGluIHRoZSBpbnRlcnJ1cHQgc3RhdHVzL21hc2sgcmVnaXN0ZXJzLiAqLworZW51bSBpbnRyX3N0YXR1c19iaXRzIHsKKwlJbnRyUnhEb25lPTB4MDEsIEludHJSeFBDSUZhdWx0PTB4MDIsIEludHJSeFBDSUVycj0weDA0LAorCUludHJUeERvbmU9MHgxMDAsIEludHJUeFBDSUZhdWx0PTB4MjAwLCBJbnRyVHhQQ0lFcnI9MHg0MDAsCisJTGlua0NoYW5nZT0weDEwMDAwLCBOZWdvdGlhdGlvbkNoYW5nZT0weDIwMDAwLCBTdGF0c01heD0weDQwMDAwLCB9OworCisvKiBUaGUgSGFtYWNoaSBSeCBhbmQgVHggYnVmZmVyIGRlc2NyaXB0b3JzLiAqLworc3RydWN0IGhhbWFjaGlfZGVzYyB7CisJdTMyIHN0YXR1c19uX2xlbmd0aDsJCQkKKyNpZiBBRERSTEVOID09IDY0CisJdTMyIHBhZDsKKwl1NjQgYWRkcjsKKyNlbHNlCisJdTMyIGFkZHI7CisjZW5kaWYKK307CisKKy8qIEJpdHMgaW4gaGFtYWNoaV9kZXNjLnN0YXR1c19uX2xlbmd0aCAqLworZW51bSBkZXNjX3N0YXR1c19iaXRzIHsKKwlEZXNjT3duPTB4ODAwMDAwMDAsIERlc2NFbmRQYWNrZXQ9MHg0MDAwMDAwMCwgRGVzY0VuZFJpbmc9MHgyMDAwMDAwMCwgCisJRGVzY0ludHI9MHgxMDAwMDAwMCwKK307CisKKyNkZWZpbmUgUFJJVl9BTElHTgkxNSAgCQkJLyogUmVxdWlyZWQgYWxpZ25tZW50IG1hc2sgKi8KKyNkZWZpbmUgTUlJX0NOVAkJNAorc3RydWN0IGhhbWFjaGlfcHJpdmF0ZSB7CisJLyogRGVzY3JpcHRvciByaW5ncyBmaXJzdCBmb3IgYWxpZ25tZW50LiAgVHggcmVxdWlyZXMgYSBzZWNvbmQgZGVzY3JpcHRvcgorCSAgIGZvciBzdGF0dXMuICovCisJc3RydWN0IGhhbWFjaGlfZGVzYyAqcnhfcmluZzsKKwlzdHJ1Y3QgaGFtYWNoaV9kZXNjICp0eF9yaW5nOworCXN0cnVjdCBza19idWZmKiByeF9za2J1ZmZbUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3Qgc2tfYnVmZiogdHhfc2tidWZmW1RYX1JJTkdfU0laRV07CisJZG1hX2FkZHJfdCB0eF9yaW5nX2RtYTsKKwlkbWFfYWRkcl90IHJ4X3JpbmdfZG1hOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkJLyogTWVkaWEgc2VsZWN0aW9uIHRpbWVyLiAqLworCS8qIEZyZXF1ZW50bHkgdXNlZCBhbmQgcGFpcmVkIHZhbHVlOiBrZWVwIGFkamFjZW50IGZvciBjYWNoZSBlZmZlY3QuICovCisJc3BpbmxvY2tfdCBsb2NrOworCWludCBjaGlwX2lkOworCXVuc2lnbmVkIGludCBjdXJfcngsIGRpcnR5X3J4OwkJLyogUHJvZHVjZXIvY29uc3VtZXIgcmluZyBpbmRpY2VzICovCisJdW5zaWduZWQgaW50IGN1cl90eCwgZGlydHlfdHg7CisJdW5zaWduZWQgaW50IHJ4X2J1Zl9zejsJCQkvKiBCYXNlZCBvbiBNVFUrc2xhY2suICovCisJdW5zaWduZWQgaW50IHR4X2Z1bGw6MTsJCQkvKiBUaGUgVHggcXVldWUgaXMgZnVsbC4gKi8KKwl1bnNpZ25lZCBpbnQgZHVwbGV4X2xvY2s6MTsKKwl1bnNpZ25lZCBpbnQgZGVmYXVsdF9wb3J0OjQ7CQkvKiBMYXN0IGRldi0+aWZfcG9ydCB2YWx1ZS4gKi8KKwkvKiBNSUkgdHJhbnNjZWl2ZXIgc2VjdGlvbi4gKi8KKwlpbnQgbWlpX2NudDsJCQkJCQkJCS8qIE1JSSBkZXZpY2UgYWRkcmVzc2VzLiAqLworCXN0cnVjdCBtaWlfaWZfaW5mbyBtaWlfaWY7CQkvKiBNSUkgbGliIGhvb2tzL2luZm8gKi8KKwl1bnNpZ25lZCBjaGFyIHBoeXNbTUlJX0NOVF07CQkvKiBNSUkgZGV2aWNlIGFkZHJlc3Nlcywgb25seSBmaXJzdCBvbmUgdXNlZC4gKi8KKwl1MzIgcnhfaW50X3ZhciwgdHhfaW50X3ZhcjsJLyogaW50ZXJydXB0IGNvbnRyb2wgdmFyaWFibGVzICovCisJdTMyIG9wdGlvbjsJCQkJCQkJLyogSG9sZCBvbiB0byBhIGNvcHkgb2YgdGhlIG9wdGlvbnMgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKwl2b2lkIF9faW9tZW0gKmJhc2U7Cit9OworCitNT0RVTEVfQVVUSE9SKCJEb25hbGQgQmVja2VyIDxiZWNrZXJAc2N5bGQuY29tPiwgRXJpYyBLYXN0ZW4gPGthc3RlbkBuc2NsLm1zdS5lZHU+LCBLZWl0aCBVbmRlcndvb2QgPGtlaXRodUBwYXJsLmNsZW1zb24uZWR1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQYWNrZXQgRW5naW5lcyAnSGFtYWNoaScgR05JQy1JSSBHaWdhYml0IEV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW0obWF4X2ludGVycnVwdF93b3JrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG10dSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShtaW5fcnhfcGt0LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1heF9yeF9nYXAsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obWF4X3J4X2xhdGVuY3ksIGludCwgMCk7Cittb2R1bGVfcGFyYW0obWluX3R4X3BrdCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShtYXhfdHhfZ2FwLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1heF90eF9sYXRlbmN5LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJ4X2NvcHlicmVhaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShyeF9wYXJhbXMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkodHhfcGFyYW1zLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG9wdGlvbnMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZnVsbF9kdXBsZXgsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0oZm9yY2UzMiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2ludGVycnVwdF93b3JrLCAiR05JQy1JSSBtYXhpbXVtIGV2ZW50cyBoYW5kbGVkIHBlciBpbnRlcnJ1cHQiKTsKK01PRFVMRV9QQVJNX0RFU0MobXR1LCAiR05JQy1JSSBNVFUgKGFsbCBib2FyZHMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiR05JQy1JSSBkZWJ1ZyBsZXZlbCAoMC03KSIpOworTU9EVUxFX1BBUk1fREVTQyhtaW5fcnhfcGt0LCAiR05JQy1JSSBtaW5pbXVtIFJ4IHBhY2tldHMgcHJvY2Vzc2VkIGJldHdlZW4gaW50ZXJydXB0cyIpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfcnhfZ2FwLCAiR05JQy1JSSBtYXhpbXVtIFJ4IGludGVyLXBhY2tldCBnYXAgaW4gOC4xOTIgbWljcm9zZWNvbmQgdW5pdHMiKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X3J4X2xhdGVuY3ksICJHTklDLUlJIHRpbWUgYmV0d2VlbiBSeCBpbnRlcnJ1cHRzIGluIDguMTkyIG1pY3Jvc2Vjb25kIHVuaXRzIik7CitNT0RVTEVfUEFSTV9ERVNDKG1pbl90eF9wa3QsICJHTklDLUlJIG1pbmltdW0gVHggcGFja2V0cyBwcm9jZXNzZWQgYmV0d2VlbiBpbnRlcnJ1cHRzIik7CitNT0RVTEVfUEFSTV9ERVNDKG1heF90eF9nYXAsICJHTklDLUlJIG1heGltdW0gVHggaW50ZXItcGFja2V0IGdhcCBpbiA4LjE5MiBtaWNyb3NlY29uZCB1bml0cyIpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfdHhfbGF0ZW5jeSwgIkdOSUMtSUkgdGltZSBiZXR3ZWVuIFR4IGludGVycnVwdHMgaW4gOC4xOTIgbWljcm9zZWNvbmQgdW5pdHMiKTsKK01PRFVMRV9QQVJNX0RFU0MocnhfY29weWJyZWFrLCAiR05JQy1JSSBjb3B5IGJyZWFrcG9pbnQgZm9yIGNvcHktb25seS10aW55LWZyYW1lcyIpOworTU9EVUxFX1BBUk1fREVTQyhyeF9wYXJhbXMsICJHTklDLUlJIG1pbl9yeF9wa3QrbWF4X3J4X2dhcCttYXhfcnhfbGF0ZW5jeSIpOworTU9EVUxFX1BBUk1fREVTQyh0eF9wYXJhbXMsICJHTklDLUlJIG1pbl90eF9wa3QrbWF4X3R4X2dhcCttYXhfdHhfbGF0ZW5jeSIpOworTU9EVUxFX1BBUk1fREVTQyhvcHRpb25zLCAiR05JQy1JSSBCaXRzIDAtMzogbWVkaWEgdHlwZSwgYml0cyA0LTY6IGFzIGZvcmNlMzIsIGJpdCA3OiBoYWxmIGR1cGxleCwgYml0IDkgZnVsbCBkdXBsZXgiKTsKK01PRFVMRV9QQVJNX0RFU0MoZnVsbF9kdXBsZXgsICJHTklDLUlJIGZ1bGwgZHVwbGV4IHNldHRpbmcocykgKDEpIik7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlMzIsICJHTklDLUlJOiBCaXQgMDogMzIgYml0IFBDSSwgYml0IDE6IGRpc2FibGUgcGFyaXR5LCBiaXQgMjogNjQgYml0IFBDSSAoYWxsIGJvYXJkcykiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorc3RhdGljIGludCByZWFkX2VlcHJvbSh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbik7CitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKTsKK3N0YXRpYyBpbnQgaGFtYWNoaV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBuZXRkZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgdm9pZCBoYW1hY2hpX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBoYW1hY2hpX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBoYW1hY2hpX2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaGFtYWNoaV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGhhbWFjaGlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCBoYW1hY2hpX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlubGluZSBpbnQgaGFtYWNoaV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGhhbWFjaGlfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGludHJfc3RhdHVzKTsKK3N0YXRpYyBpbnQgaGFtYWNoaV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaGFtYWNoaV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHM7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzX25vX21paTsKKworc3RhdGljIGludCBfX2RldmluaXQgaGFtYWNoaV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IGhhbWFjaGlfcHJpdmF0ZSAqaG1wOworCWludCBvcHRpb24sIGksIHJ4X2ludF92YXIsIHR4X2ludF92YXIsIGJvZ3VzY250OworCWludCBjaGlwX2lkID0gZW50LT5kcml2ZXJfZGF0YTsKKwlpbnQgaXJxOworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCXVuc2lnbmVkIGxvbmcgYmFzZTsKKwlzdGF0aWMgaW50IGNhcmRfaWR4OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdm9pZCAqcmluZ19zcGFjZTsKKwlkbWFfYWRkcl90IHJpbmdfZG1hOworCWludCByZXQgPSAtRU5PTUVNOworCisvKiB3aGVuIGJ1aWx0IGludG8gdGhlIGtlcm5lbCwgd2Ugb25seSBwcmludCB2ZXJzaW9uIGlmIGRldmljZSBpcyBmb3VuZCAqLworI2lmbmRlZiBNT0RVTEUKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKyNpZmRlZiBfX2FscGhhX18JCQkJLyogUmVhbGx5ICI2NCBiaXQgYWRkcnMiICovCisJYmFzZSB8PSAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpIDw8IDMyKTsKKyNlbmRpZgorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlpID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJaWYgKGkpIHJldHVybiBpOworCisJaXJxID0gcGRldi0+aXJxOworCWlvYWRkciA9IGlvcmVtYXAoYmFzZSwgMHg0MDApOworCWlmICghaW9hZGRyKQorCQlnb3RvIGVycl9vdXRfcmVsZWFzZTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgaGFtYWNoaV9wcml2YXRlKSk7CisJaWYgKCFkZXYpCisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKyNpZmRlZiBUWF9DSEVDS1NVTQorCXByaW50aygiY2hlY2sgdGhhdCBza2Jjb3B5IGluIGlwX3F1ZXVlX3htaXQgaXNuJ3QgaGFwcGVuaW5nXG4iKTsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiArPSA4OyAgLyogZm9yIGNrc3VtIHRhZyAqLworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gMSA/IHJlYWRfZWVwcm9tKGlvYWRkciwgNCArIGkpCisJCQk6IHJlYWRiKGlvYWRkciArIFN0YXRpb25BZGRyICsgaSk7CisKKyNpZiAhIGRlZmluZWQoZmluYWxfdmVyc2lvbikKKwlpZiAoaGFtYWNoaV9kZWJ1ZyA+IDQpCisJCWZvciAoaSA9IDA7IGkgPCAweDEwOyBpKyspCisJCQlwcmludGsoIiUyLjJ4JXMiLAorCQkJCSAgIHJlYWRfZWVwcm9tKGlvYWRkciwgaSksIGkgJSAxNiAhPSAxNSA/ICIgIiA6ICJcbiIpOworI2VuZGlmCisKKwlobXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNwaW5fbG9ja19pbml0KCZobXAtPmxvY2spOworCisJaG1wLT5taWlfaWYuZGV2ID0gZGV2OworCWhtcC0+bWlpX2lmLm1kaW9fcmVhZCA9IG1kaW9fcmVhZDsKKwlobXAtPm1paV9pZi5tZGlvX3dyaXRlID0gbWRpb193cml0ZTsKKwlobXAtPm1paV9pZi5waHlfaWRfbWFzayA9IDB4MWY7CisJaG1wLT5taWlfaWYucmVnX251bV9tYXNrID0gMHgxZjsKKworCXJpbmdfc3BhY2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBUWF9UT1RBTF9TSVpFLCAmcmluZ19kbWEpOworCWlmICghcmluZ19zcGFjZSkKKwkJZ290byBlcnJfb3V0X2NsZWFyZGV2OworCWhtcC0+dHhfcmluZyA9IChzdHJ1Y3QgaGFtYWNoaV9kZXNjICopcmluZ19zcGFjZTsKKwlobXAtPnR4X3JpbmdfZG1hID0gcmluZ19kbWE7CisKKwlyaW5nX3NwYWNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKKwlpZiAoIXJpbmdfc3BhY2UpCisJCWdvdG8gZXJyX291dF91bm1hcF90eDsKKwlobXAtPnJ4X3JpbmcgPSAoc3RydWN0IGhhbWFjaGlfZGVzYyAqKXJpbmdfc3BhY2U7CisJaG1wLT5yeF9yaW5nX2RtYSA9IHJpbmdfZG1hOworCisJLyogQ2hlY2sgZm9yIG9wdGlvbnMgYmVpbmcgcGFzc2VkIGluICovCisJb3B0aW9uID0gY2FyZF9pZHggPCBNQVhfVU5JVFMgPyBvcHRpb25zW2NhcmRfaWR4XSA6IDA7CisJaWYgKGRldi0+bWVtX3N0YXJ0KQorCQlvcHRpb24gPSBkZXYtPm1lbV9zdGFydDsKKworCS8qIElmIHRoZSBidXMgc2l6ZSBpcyBtaXNpZGVudGlmaWVkLCBkbyB0aGUgZm9sbG93aW5nLiAqLworCWZvcmNlMzIgPSBmb3JjZTMyID8gZm9yY2UzMiA6IAorCQkoKG9wdGlvbiAgPj0gMCkgPyAoKG9wdGlvbiAmIDB4MDAwMDAwNzApID4+IDQpIDogMCApOworCWlmIChmb3JjZTMyKQorCQl3cml0ZWIoZm9yY2UzMiwgaW9hZGRyICsgVmlydHVhbEp1bXBlcnMpOworCisJLyogSG1tbSwgZG8gd2UgcmVhbGx5IG5lZWQgdG8gcmVzZXQgdGhlIGNoaXA/Pz8uICovCisJd3JpdGViKDB4MDEsIGlvYWRkciArIENoaXBSZXNldCk7CisKKwkvKiBBZnRlciBhIHJlc2V0LCB0aGUgY2xvY2sgc3BlZWQgbWVhc3VyZW1lbnQgb2YgdGhlIFBDSSBidXMgd2lsbCBub3QKKwkgKiBiZSB2YWxpZCBmb3IgYSBtb21lbnQuICBXYWl0IGZvciBhIGxpdHRsZSB3aGlsZSB1bnRpbCBpdCBpcy4gIElmCisJICogaXQgdGFrZXMgbW9yZSB0aGFuIDEwbXMsIGZvcmdldCBpdC4KKwkgKi8KKwl1ZGVsYXkoMTApOwkKKwlpID0gcmVhZGIoaW9hZGRyICsgUENJQ2xrTWVhcyk7CisJZm9yIChib2d1c2NudCA9IDA7ICghKGkgJiAweDA4MCkpICYmIGJvZ3VzY250IDwgMTAwMDsgYm9ndXNjbnQrKyl7CisJCXVkZWxheSgxMCk7CQorCQlpID0gcmVhZGIoaW9hZGRyICsgUENJQ2xrTWVhcyk7CQorCX0KKworCWhtcC0+YmFzZSA9IGlvYWRkcjsKKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvYWRkcjsKKwlkZXYtPmlycSA9IGlycTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCWhtcC0+Y2hpcF9pZCA9IGNoaXBfaWQ7CisJaG1wLT5wY2lfZGV2ID0gcGRldjsKKworCS8qIFRoZSBsb3dlciBmb3VyIGJpdHMgYXJlIHRoZSBtZWRpYSB0eXBlLiAqLworCWlmIChvcHRpb24gPiAwKSB7CisJCWhtcC0+b3B0aW9uID0gb3B0aW9uOworCQlpZiAob3B0aW9uICYgMHgyMDApCisJCQlobXAtPm1paV9pZi5mdWxsX2R1cGxleCA9IDE7CisJCWVsc2UgaWYgKG9wdGlvbiAmIDB4MDgwKQorCQkJaG1wLT5taWlfaWYuZnVsbF9kdXBsZXggPSAwOworCQlobXAtPmRlZmF1bHRfcG9ydCA9IG9wdGlvbiAmIDE1OworCQlpZiAoaG1wLT5kZWZhdWx0X3BvcnQpCisJCQlobXAtPm1paV9pZi5mb3JjZV9tZWRpYSA9IDE7CisJfQorCWlmIChjYXJkX2lkeCA8IE1BWF9VTklUUyAgJiYgIGZ1bGxfZHVwbGV4W2NhcmRfaWR4XSA+IDApCisJCWhtcC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gMTsKKworCS8qIGxvY2sgdGhlIGR1cGxleCBtb2RlIGlmIHNvbWVvbmUgc3BlY2lmaWVkIGEgdmFsdWUgKi8KKwlpZiAoaG1wLT5taWlfaWYuZnVsbF9kdXBsZXggfHwgKG9wdGlvbiAmIDB4MDgwKSkKKwkJaG1wLT5kdXBsZXhfbG9jayA9IDE7CisKKwkvKiBTZXQgaW50ZXJydXB0IHR1bmluZyBwYXJhbWV0ZXJzICovCisJbWF4X3J4X2xhdGVuY3kgPSBtYXhfcnhfbGF0ZW5jeSAmIDB4MDBmZjsKKwltYXhfcnhfZ2FwID0gbWF4X3J4X2dhcCAmIDB4MDBmZjsKKwltaW5fcnhfcGt0ID0gbWluX3J4X3BrdCAmIDB4MDBmZjsKKwltYXhfdHhfbGF0ZW5jeSA9IG1heF90eF9sYXRlbmN5ICYgMHgwMGZmOworCW1heF90eF9nYXAgPSBtYXhfdHhfZ2FwICYgMHgwMGZmOworCW1pbl90eF9wa3QgPSBtaW5fdHhfcGt0ICYgMHgwMGZmOworCisJcnhfaW50X3ZhciA9IGNhcmRfaWR4IDwgTUFYX1VOSVRTID8gcnhfcGFyYW1zW2NhcmRfaWR4XSA6IC0xOworCXR4X2ludF92YXIgPSBjYXJkX2lkeCA8IE1BWF9VTklUUyA/IHR4X3BhcmFtc1tjYXJkX2lkeF0gOiAtMTsKKwlobXAtPnJ4X2ludF92YXIgPSByeF9pbnRfdmFyID49IDAgPyByeF9pbnRfdmFyIDogCisJCShtaW5fcnhfcGt0IDw8IDE2IHwgbWF4X3J4X2dhcCA8PCA4IHwgbWF4X3J4X2xhdGVuY3kpOworCWhtcC0+dHhfaW50X3ZhciA9IHR4X2ludF92YXIgPj0gMCA/IHR4X2ludF92YXIgOiAKKwkJKG1pbl90eF9wa3QgPDwgMTYgfCBtYXhfdHhfZ2FwIDw8IDggfCBtYXhfdHhfbGF0ZW5jeSk7CisKKworCS8qIFRoZSBIYW1hY2hpLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5vcGVuID0gJmhhbWFjaGlfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZoYW1hY2hpX3N0YXJ0X3htaXQ7CisJZGV2LT5zdG9wID0gJmhhbWFjaGlfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSAmaGFtYWNoaV9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGU7CisJZGV2LT5kb19pb2N0bCA9ICZuZXRkZXZfaW9jdGw7CisJaWYgKGNoaXBfdGJsW2htcC0+Y2hpcF9pZF0uZmxhZ3MgJiBDYW5IYXZlTUlJKQorCQlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmZXRodG9vbF9vcHMpOworCWVsc2UKKwkJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmV0aHRvb2xfb3BzX25vX21paSk7CisJZGV2LT50eF90aW1lb3V0ID0gJmhhbWFjaGlfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKwlpZiAobXR1KQorCQlkZXYtPm10dSA9IG10dTsKKworCWkgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoaSkgeworCQlyZXQgPSBpOworCQlnb3RvIGVycl9vdXRfdW5tYXBfcng7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIHR5cGUgJXggYXQgJXAsICIsCisJCSAgIGRldi0+bmFtZSwgY2hpcF90YmxbY2hpcF9pZF0ubmFtZSwgcmVhZGwoaW9hZGRyICsgQ2hpcFJldiksCisJCSAgIGlvYWRkcik7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJCXByaW50aygiJTIuMng6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCIlMi4yeCwgSVJRICVkLlxuIiwgZGV2LT5kZXZfYWRkcltpXSwgaXJxKTsKKwlpID0gcmVhZGIoaW9hZGRyICsgUENJQ2xrTWVhcyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICAlZC1iaXQgJWQgTWh6IFBDSSBidXMgKCVkKSwgVmlydHVhbCBKdW1wZXJzICIKKwkJICAgIiUyLjJ4LCBMUEEgJTQuNHguXG4iLAorCQkgICBkZXYtPm5hbWUsIHJlYWR3KGlvYWRkciArIE1pc2NTdGF0dXMpICYgMSA/IDY0IDogMzIsCisJCSAgIGkgPyAyMDAwLyhpJjB4N2YpIDogMCwgaSYweDdmLCAoaW50KXJlYWRiKGlvYWRkciArIFZpcnR1YWxKdW1wZXJzKSwKKwkJICAgcmVhZHcoaW9hZGRyICsgQU5MaW5rUGFydG5lckFiaWxpdHkpKTsKKworCWlmIChjaGlwX3RibFtobXAtPmNoaXBfaWRdLmZsYWdzICYgQ2FuSGF2ZU1JSSkgeworCQlpbnQgcGh5LCBwaHlfaWR4ID0gMDsKKwkJZm9yIChwaHkgPSAwOyBwaHkgPCAzMiAmJiBwaHlfaWR4IDwgTUlJX0NOVDsgcGh5KyspIHsKKwkJCWludCBtaWlfc3RhdHVzID0gbWRpb19yZWFkKGRldiwgcGh5LCBNSUlfQk1TUik7CisJCQlpZiAobWlpX3N0YXR1cyAhPSAweGZmZmYgICYmCisJCQkJbWlpX3N0YXR1cyAhPSAweDAwMDApIHsKKwkJCQlobXAtPnBoeXNbcGh5X2lkeCsrXSA9IHBoeTsKKwkJCQlobXAtPm1paV9pZi5hZHZlcnRpc2luZyA9IG1kaW9fcmVhZChkZXYsIHBoeSwgTUlJX0FEVkVSVElTRSk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1JSSBQSFkgZm91bmQgYXQgYWRkcmVzcyAlZCwgc3RhdHVzICIKKwkJCQkJICAgIjB4JTQuNHggYWR2ZXJ0aXNpbmcgJTQuNHguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHBoeSwgbWlpX3N0YXR1cywgaG1wLT5taWlfaWYuYWR2ZXJ0aXNpbmcpOworCQkJfQorCQl9CisJCWhtcC0+bWlpX2NudCA9IHBoeV9pZHg7CisJCWlmIChobXAtPm1paV9jbnQgPiAwKQorCQkJaG1wLT5taWlfaWYucGh5X2lkID0gaG1wLT5waHlzWzBdOworCQllbHNlCisJCQltZW1zZXQoJmhtcC0+bWlpX2lmLCAwLCBzaXplb2YoaG1wLT5taWlfaWYpKTsKKwl9CisJLyogQ29uZmlndXJlIGdpZ2FiaXQgYXV0b25lZ290aWF0aW9uLiAqLworCXdyaXRldygweDA0MDAsIGlvYWRkciArIEFOWGNobmdDdHJsKTsJLyogRW5hYmxlIGxlZ2FjeSBsaW5rcy4gKi8KKwl3cml0ZXcoMHgwOGUwLCBpb2FkZHIgKyBBTkFkdmVydGlzZSk7CS8qIFNldCBvdXIgYWR2ZXJ0aXNlIHdvcmQuICovCisJd3JpdGV3KDB4MTAwMCwgaW9hZGRyICsgQU5DdHJsKTsJCQkvKiBFbmFibGUgbmVnb3RpYXRpb24gKi8KKworCWNhcmRfaWR4Kys7CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfdW5tYXBfcng6CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCBobXAtPnJ4X3JpbmcsIAorCQlobXAtPnJ4X3JpbmdfZG1hKTsKK2Vycl9vdXRfdW5tYXBfdHg6CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBUWF9UT1RBTF9TSVpFLCBobXAtPnR4X3JpbmcsIAorCQlobXAtPnR4X3JpbmdfZG1hKTsKK2Vycl9vdXRfY2xlYXJkZXY6CisJZnJlZV9uZXRkZXYgKGRldik7CitlcnJfb3V0X2lvdW5tYXA6CisJaW91bm1hcChpb2FkZHIpOworZXJyX291dF9yZWxlYXNlOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJlYWRfZWVwcm9tKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgbG9jYXRpb24pCit7CisJaW50IGJvZ3VzX2NudCA9IDEwMDA7CisKKwkvKiBXZSBzaG91bGQgY2hlY2sgYnVzeSBmaXJzdCAtIHBlciBkb2NzIC1LRFUgKi8KKwl3aGlsZSAoKHJlYWRiKGlvYWRkciArIEVFQ21kU3RhdHVzKSAmIDB4NDApICAmJiAtLWJvZ3VzX2NudCA+IDApOworCXdyaXRldyhsb2NhdGlvbiwgaW9hZGRyICsgRUVBZGRyKTsKKwl3cml0ZWIoMHgwMiwgaW9hZGRyICsgRUVDbWRTdGF0dXMpOworCWJvZ3VzX2NudCA9IDEwMDA7CisJd2hpbGUgKChyZWFkYihpb2FkZHIgKyBFRUNtZFN0YXR1cykgJiAweDQwKSAgJiYgLS1ib2d1c19jbnQgPiAwKTsKKwlpZiAoaGFtYWNoaV9kZWJ1ZyA+IDUpCisJCXByaW50aygiICAgRUVQUk9NIHN0YXR1cyBpcyAlMi4yeCBhZnRlciAlZCB0aWNrcy5cbiIsCisJCQkgICAoaW50KXJlYWRiKGlvYWRkciArIEVFQ21kU3RhdHVzKSwgMTAwMC0gYm9ndXNfY250KTsKKwlyZXR1cm4gcmVhZGIoaW9hZGRyICsgRUVEYXRhKTsKK30KKworLyogTUlJIE1hbmFnZW1lbiBEYXRhIEkvTyBhY2Nlc3Nlcy4KKyAgIFRoZXNlIHJvdXRpbmVzIGFzc3VtZSB0aGUgTURJTyBjb250cm9sbGVyIGlzIGlkbGUsIGFuZCBkbyBub3QgZXhpdCB1bnRpbAorICAgdGhlIGNvbW1hbmQgaXMgZmluaXNoZWQuICovCisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKK3sKKwlzdHJ1Y3QgaGFtYWNoaV9wcml2YXRlICpobXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gaG1wLT5iYXNlOworCWludCBpOworCisJLyogV2Ugc2hvdWxkIGNoZWNrIGJ1c3kgZmlyc3QgLSBwZXIgZG9jcyAtS0RVICovCisJZm9yIChpID0gMTAwMDA7IGkgPj0gMDsgaS0tKQorCQlpZiAoKHJlYWR3KGlvYWRkciArIE1JSV9TdGF0dXMpICYgMSkgPT0gMCkKKwkJCWJyZWFrOworCXdyaXRldygocGh5X2lkPDw4KSArIGxvY2F0aW9uLCBpb2FkZHIgKyBNSUlfQWRkcik7CisJd3JpdGV3KDB4MDAwMSwgaW9hZGRyICsgTUlJX0NtZCk7CisJZm9yIChpID0gMTAwMDA7IGkgPj0gMDsgaS0tKQorCQlpZiAoKHJlYWR3KGlvYWRkciArIE1JSV9TdGF0dXMpICYgMSkgPT0gMCkKKwkJCWJyZWFrOworCXJldHVybiByZWFkdyhpb2FkZHIgKyBNSUlfUmRfRGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGhhbWFjaGlfcHJpdmF0ZSAqaG1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGhtcC0+YmFzZTsKKwlpbnQgaTsKKworCS8qIFdlIHNob3VsZCBjaGVjayBidXN5IGZpcnN0IC0gcGVyIGRvY3MgLUtEVSAqLworCWZvciAoaSA9IDEwMDAwOyBpID49IDA7IGktLSkKKwkJaWYgKChyZWFkdyhpb2FkZHIgKyBNSUlfU3RhdHVzKSAmIDEpID09IDApCisJCQlicmVhazsKKwl3cml0ZXcoKHBoeV9pZDw8OCkgKyBsb2NhdGlvbiwgaW9hZGRyICsgTUlJX0FkZHIpOworCXdyaXRldyh2YWx1ZSwgaW9hZGRyICsgTUlJX1dyX0RhdGEpOworCisJLyogV2FpdCBmb3IgdGhlIGNvbW1hbmQgdG8gZmluaXNoLiAqLworCWZvciAoaSA9IDEwMDAwOyBpID49IDA7IGktLSkKKwkJaWYgKChyZWFkdyhpb2FkZHIgKyBNSUlfU3RhdHVzKSAmIDEpID09IDApCisJCQlicmVhazsKKwlyZXR1cm47Cit9CisKKwwKK3N0YXRpYyBpbnQgaGFtYWNoaV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhhbWFjaGlfcHJpdmF0ZSAqaG1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGhtcC0+YmFzZTsKKwlpbnQgaTsKKwl1MzIgcnhfaW50X3ZhciwgdHhfaW50X3ZhcjsKKwl1MTYgZmlmb19pbmZvOworCisJaSA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmaGFtYWNoaV9pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKGkpCisJCXJldHVybiBpOworCisJaWYgKGhhbWFjaGlfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGhhbWFjaGlfb3BlbigpIGlycSAlZC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKworCWhhbWFjaGlfaW5pdF9yaW5nKGRldik7CisKKyNpZiBBRERSTEVOID09IDY0CisJLyogd3JpdGVsbGxsIGFueW9uZSA/ICovCisJd3JpdGVsKGNwdV90b19sZTY0KGhtcC0+cnhfcmluZ19kbWEpLCBpb2FkZHIgKyBSeFB0cik7CisJd3JpdGVsKGNwdV90b19sZTY0KGhtcC0+cnhfcmluZ19kbWEpID4+IDMyLCBpb2FkZHIgKyBSeFB0ciArIDQpOworCXdyaXRlbChjcHVfdG9fbGU2NChobXAtPnR4X3JpbmdfZG1hKSwgaW9hZGRyICsgVHhQdHIpOworCXdyaXRlbChjcHVfdG9fbGU2NChobXAtPnR4X3JpbmdfZG1hKSA+PiAzMiwgaW9hZGRyICsgVHhQdHIgKyA0KTsKKyNlbHNlCisJd3JpdGVsKGNwdV90b19sZTMyKGhtcC0+cnhfcmluZ19kbWEpLCBpb2FkZHIgKyBSeFB0cik7CisJd3JpdGVsKGNwdV90b19sZTMyKGhtcC0+dHhfcmluZ19kbWEpLCBpb2FkZHIgKyBUeFB0cik7CisjZW5kaWYKKworCS8qIFRPRE86ICBJdCB3b3VsZCBtYWtlIHNlbnNlIHRvIG9yZ2FuaXplIHRoaXMgYXMgd29yZHMgc2luY2UgdGhlIGNhcmQgCisJICogZG9jdW1lbnRhdGlvbiBkb2VzLiAtS0RVCisJICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJd3JpdGViKGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIFN0YXRpb25BZGRyICsgaSk7CisKKwkvKiBJbml0aWFsaXplIG90aGVyIHJlZ2lzdGVyczogd2l0aCBzbyBtYW55IHRoaXMgZXZlbnR1YWxseSB0aGlzIHdpbGwKKwkgICBjb252ZXJ0ZWQgdG8gYW4gb2Zmc2V0L3ZhbHVlIGxpc3QuICovCisKKwkvKiBDb25maWd1cmUgdGhlIEZJRk8gKi8KKwlmaWZvX2luZm8gPSAocmVhZHcoaW9hZGRyICsgR1BJTykgJiAweDAwQzApID4+IDY7CisJc3dpdGNoIChmaWZvX2luZm8peworCQljYXNlIDAgOiAKKwkJCS8qIE5vIEZJRk8gKi8KKwkJCXdyaXRldygweDAwMDAsIGlvYWRkciArIEZJRk9jZmcpOworCQkJYnJlYWs7CisJCWNhc2UgMSA6IAorCQkJLyogQ29uZmlndXJlIHRoZSBGSUZPIGZvciA1MTJLIGV4dGVybmFsLCAxNksgdXNlZCBmb3IgVHguICovCisJCQl3cml0ZXcoMHgwMDI4LCBpb2FkZHIgKyBGSUZPY2ZnKTsKKwkJCWJyZWFrOworCQljYXNlIDIgOiAKKwkJCS8qIENvbmZpZ3VyZSB0aGUgRklGTyBmb3IgMTAyNCBleHRlcm5hbCwgMzJLIHVzZWQgZm9yIFR4LiAqLworCQkJd3JpdGV3KDB4MDA0QywgaW9hZGRyICsgRklGT2NmZyk7CisJCQlicmVhazsKKwkJY2FzZSAzIDogCisJCQkvKiBDb25maWd1cmUgdGhlIEZJRk8gZm9yIDIwNDggZXh0ZXJuYWwsIDMySyB1c2VkIGZvciBUeC4gKi8KKwkJCXdyaXRldygweDAwNkMsIGlvYWRkciArIEZJRk9jZmcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQgOiAKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAgVW5zdXBwb3J0ZWQgZXh0ZXJuYWwgbWVtb3J5IGNvbmZpZyFcbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJCS8qIERlZmF1bHQgdG8gbm8gRklGTyAqLworCQkJd3JpdGV3KDB4MDAwMCwgaW9hZGRyICsgRklGT2NmZyk7CisJCQlicmVhazsKKwl9CisJCisJaWYgKGRldi0+aWZfcG9ydCA9PSAwKQorCQlkZXYtPmlmX3BvcnQgPSBobXAtPmRlZmF1bHRfcG9ydDsKKworCisJLyogU2V0dGluZyB0aGUgUnggbW9kZSB3aWxsIHN0YXJ0IHRoZSBSeCBwcm9jZXNzLiAqLworCS8qIElmIHNvbWVvbmUgZGlkbid0IGNob29zZSBhIGR1cGxleCwgZGVmYXVsdCB0byBmdWxsLWR1cGxleCAqLyAKKwlpZiAoaG1wLT5kdXBsZXhfbG9jayAhPSAxKQorCQlobXAtPm1paV9pZi5mdWxsX2R1cGxleCA9IDE7CisKKwkvKiBhbHdheXMgMSwgdGFrZXMgbm8gbW9yZSB0aW1lIHRvIGRvIGl0ICovCisJd3JpdGV3KDB4MDAwMSwgaW9hZGRyICsgUnhDaGVja3N1bSk7CisjaWZkZWYgVFhfQ0hFQ0tTVU0KKwl3cml0ZXcoMHgwMDAxLCBpb2FkZHIgKyBUeENoZWNrc3VtKTsKKyNlbHNlCisJd3JpdGV3KDB4MDAwMCwgaW9hZGRyICsgVHhDaGVja3N1bSk7CisjZW5kaWYKKwl3cml0ZXcoMHg4MDAwLCBpb2FkZHIgKyBNQUNDbmZnKTsgLyogU29mdCByZXNldCB0aGUgTUFDICovCisJd3JpdGV3KDB4MjE1RiwgaW9hZGRyICsgTUFDQ25mZyk7CisJd3JpdGV3KDB4MDAwQywgaW9hZGRyICsgRnJhbWVHYXAwKTsgCisJLyogV0hBVD8hPyE/ICBXaHkgaXNuJ3QgdGhpcyBkb2N1bWVudGVkIHNvbWV3aGVyZT8gLUtEVSAqLworCXdyaXRldygweDEwMTgsIGlvYWRkciArIEZyYW1lR2FwMSk7CisJLyogV2h5IGRvIHdlIGVuYWJsZSByZWNlaXZlcy90cmFuc21pdHMgaGVyZT8gLUtEVSAqLworCXdyaXRldygweDA3ODAsIGlvYWRkciArIE1BQ0NuZmcyKTsgLyogVXBwZXIgMTYgYml0cyBjb250cm9sIExFRHMuICovCisJLyogRW5hYmxlIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG9mIGZsb3cgY29udHJvbCBmcmFtZXMsIHBlcmlvZCAweGZmZmYuICovCisJd3JpdGVsKDB4MDAzMEZGRkYsIGlvYWRkciArIEZsb3dDdHJsKTsKKwl3cml0ZXcoTUFYX0ZSQU1FX1NJWkUsIGlvYWRkciArIE1heEZyYW1lU2l6ZSk7IAkvKiBkZXYtPm10dSsxNCA/Pz8gKi8KKworCS8qIEVuYWJsZSBsZWdhY3kgbGlua3MuICovCisJd3JpdGV3KDB4MDQwMCwgaW9hZGRyICsgQU5YY2huZ0N0cmwpOwkvKiBFbmFibGUgbGVnYWN5IGxpbmtzLiAqLworCS8qIEluaXRpYWwgTGluayBMRUQgdG8gYmxpbmtpbmcgcmVkLiAqLworCXdyaXRlYigweDAzLCBpb2FkZHIgKyBMRURDdHJsKTsKKworCS8qIENvbmZpZ3VyZSBpbnRlcnJ1cHQgbWl0aWdhdGlvbi4gIFRoaXMgaGFzIGEgZ3JlYXQgZWZmZWN0IG9uCisJICAgcGVyZm9ybWFuY2UsIHNvIHN5c3RlbXMgdHVuaW5nIHNob3VsZCBzdGFydCBoZXJlIS4gKi8KKworCXJ4X2ludF92YXIgPSBobXAtPnJ4X2ludF92YXI7CisJdHhfaW50X3ZhciA9IGhtcC0+dHhfaW50X3ZhcjsKKworCWlmIChoYW1hY2hpX2RlYnVnID4gMSkgeworCQlwcmludGsoIm1heF90eF9sYXRlbmN5OiAlZCwgbWF4X3R4X2dhcDogJWQsIG1pbl90eF9wa3Q6ICVkXG4iLAorCQkJdHhfaW50X3ZhciAmIDB4MDBmZiwgKHR4X2ludF92YXIgJiAweDAwZmYwMCkgPj4gOCwgCisJCQkodHhfaW50X3ZhciAmIDB4MDBmZjAwMDApID4+IDE2KTsKKwkJcHJpbnRrKCJtYXhfcnhfbGF0ZW5jeTogJWQsIG1heF9yeF9nYXA6ICVkLCBtaW5fcnhfcGt0OiAlZFxuIiwKKwkJCXJ4X2ludF92YXIgJiAweDAwZmYsIChyeF9pbnRfdmFyICYgMHgwMGZmMDApID4+IDgsIAorCQkJKHJ4X2ludF92YXIgJiAweDAwZmYwMDAwKSA+PiAxNik7CisJCXByaW50aygicnhfaW50X3ZhcjogJXgsIHR4X2ludF92YXI6ICV4XG4iLCByeF9pbnRfdmFyLCB0eF9pbnRfdmFyKTsKKwl9CisKKwl3cml0ZWwodHhfaW50X3ZhciwgaW9hZGRyICsgVHhJbnRyQ3RybCk7IAorCXdyaXRlbChyeF9pbnRfdmFyLCBpb2FkZHIgKyBSeEludHJDdHJsKTsgCisKKwlzZXRfcnhfbW9kZShkZXYpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCXdyaXRlbCgweDgwODc4Nzg3LCBpb2FkZHIgKyBJbnRlcnJ1cHRFbmFibGUpOworCXdyaXRldygweDAwMDAsIGlvYWRkciArIEV2ZW50U3RhdHVzKTsJLyogQ2xlYXIgbm9uLWludGVycnVwdGluZyBldmVudHMgKi8KKworCS8qIENvbmZpZ3VyZSBhbmQgc3RhcnQgdGhlIERNQSBjaGFubmVscy4gKi8KKwkvKiBCdXJzdCBzaXplcyBhcmUgaW4gdGhlIGxvdyB0aHJlZSBiaXRzOiBzaXplID0gNDw8KHZhbCY3KSAqLworI2lmIEFERFJMRU4gPT0gNjQKKwl3cml0ZXcoMHgwMDVELCBpb2FkZHIgKyBSeERNQUN0cmwpOyAJCS8qIDEyOCBkd29yZCBidXJzdHMgKi8KKwl3cml0ZXcoMHgwMDVELCBpb2FkZHIgKyBUeERNQUN0cmwpOworI2Vsc2UKKwl3cml0ZXcoMHgwMDFELCBpb2FkZHIgKyBSeERNQUN0cmwpOworCXdyaXRldygweDAwMUQsIGlvYWRkciArIFR4RE1BQ3RybCk7CisjZW5kaWYKKwl3cml0ZXcoMHgwMDAxLCBpb2FkZHIgKyBSeENtZCk7CisKKwlpZiAoaGFtYWNoaV9kZWJ1ZyA+IDIpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBEb25lIGhhbWFjaGlfb3BlbigpLCBzdGF0dXM6IFJ4ICV4IFR4ICV4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgcmVhZHcoaW9hZGRyICsgUnhTdGF0dXMpLCByZWFkdyhpb2FkZHIgKyBUeFN0YXR1cykpOworCX0KKwkvKiBTZXQgdGhlIHRpbWVyIHRvIGNoZWNrIGZvciBsaW5rIGJlYXQuICovCisJaW5pdF90aW1lcigmaG1wLT50aW1lcik7CisJaG1wLT50aW1lci5leHBpcmVzID0gUlVOX0FUKCgyNCpIWikvMTApOwkJCS8qIDIuNCBzZWMuICovCisJaG1wLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCWhtcC0+dGltZXIuZnVuY3Rpb24gPSAmaGFtYWNoaV90aW1lcjsJCQkJLyogdGltZXIgaGFuZGxlciAqLworCWFkZF90aW1lcigmaG1wLT50aW1lcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGFtYWNoaV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBoYW1hY2hpX3ByaXZhdGUgKmhtcCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBVcGRhdGUgdGhlIGRpcnR5IHBvaW50ZXIgdW50aWwgd2UgZmluZCBhbiBlbnRyeSB0aGF0IGlzCisJCXN0aWxsIG93bmVkIGJ5IHRoZSBjYXJkICovCisJZm9yICg7IGhtcC0+Y3VyX3R4IC0gaG1wLT5kaXJ0eV90eCA+IDA7IGhtcC0+ZGlydHlfdHgrKykgeworCQlpbnQgZW50cnkgPSBobXAtPmRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCWlmIChobXAtPnR4X3JpbmdbZW50cnldLnN0YXR1c19uX2xlbmd0aCAmIGNwdV90b19sZTMyKERlc2NPd24pKSAKKwkJCWJyZWFrOworCQkvKiBGcmVlIHRoZSBvcmlnaW5hbCBza2IuICovCisJCXNrYiA9IGhtcC0+dHhfc2tidWZmW2VudHJ5XTsKKwkJaWYgKHNrYiAhPSAwKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKGhtcC0+cGNpX2RldiwgCisJCQkJaG1wLT50eF9yaW5nW2VudHJ5XS5hZGRyLCBza2ItPmxlbiwgCisJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlobXAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQl9CisJCWhtcC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzX25fbGVuZ3RoID0gMDsKKwkJaWYgKGVudHJ5ID49IFRYX1JJTkdfU0laRS0xKSAKKwkJCWhtcC0+dHhfcmluZ1tUWF9SSU5HX1NJWkUtMV0uc3RhdHVzX25fbGVuZ3RoIHw9CisJCQkJY3B1X3RvX2xlMzIoRGVzY0VuZFJpbmcpOyAgIAorCQlobXAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGFtYWNoaV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IGhhbWFjaGlfcHJpdmF0ZSAqaG1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGhtcC0+YmFzZTsKKwlpbnQgbmV4dF90aWNrID0gMTAqSFo7CisKKwlpZiAoaGFtYWNoaV9kZWJ1ZyA+IDIpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEhhbWFjaGkgQXV0b25lZ290aWF0aW9uIHN0YXR1cyAlNC40eCwgTFBBICIKKwkJCSAgICIlNC40eC5cbiIsIGRldi0+bmFtZSwgcmVhZHcoaW9hZGRyICsgQU5TdGF0dXMpLAorCQkJICAgcmVhZHcoaW9hZGRyICsgQU5MaW5rUGFydG5lckFiaWxpdHkpKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEF1dG9uZWdvdGlhdGlvbiByZWdzICU0LjR4ICU0LjR4ICU0LjR4ICIKKwkJICAgICAgICIlNC40eCAlNC40eCAlNC40eC5cbiIsIGRldi0+bmFtZSwKKwkJICAgICAgIHJlYWR3KGlvYWRkciArIDB4MGUwKSwKKwkJICAgICAgIHJlYWR3KGlvYWRkciArIDB4MGUyKSwKKwkJICAgICAgIHJlYWR3KGlvYWRkciArIDB4MGU0KSwKKwkJICAgICAgIHJlYWR3KGlvYWRkciArIDB4MGU2KSwKKwkJICAgICAgIHJlYWR3KGlvYWRkciArIDB4MGU4KSwKKwkJICAgICAgIHJlYWR3KGlvYWRkciArIDB4MGVBKSk7CisJfQorCS8qIFdlIGNvdWxkIGRvIHNvbWV0aGluZyBoZXJlLi4uIG5haC4gKi8KKwlobXAtPnRpbWVyLmV4cGlyZXMgPSBSVU5fQVQobmV4dF90aWNrKTsKKwlhZGRfdGltZXIoJmhtcC0+dGltZXIpOworfQorCitzdGF0aWMgdm9pZCBoYW1hY2hpX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaGFtYWNoaV9wcml2YXRlICpobXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gaG1wLT5iYXNlOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEhhbWFjaGkgdHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgJTguOHgsIgorCQkgICAiIHJlc2V0dGluZy4uLlxuIiwgZGV2LT5uYW1lLCAoaW50KXJlYWR3KGlvYWRkciArIFR4U3RhdHVzKSk7CisKKwl7CisJCWludCBpOworCQlwcmludGsoS0VSTl9ERUJVRyAiICBSeCByaW5nICVwOiAiLCBobXAtPnJ4X3JpbmcpOworCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCisJCQlwcmludGsoIiAlOC44eCIsICh1bnNpZ25lZCBpbnQpaG1wLT5yeF9yaW5nW2ldLnN0YXR1c19uX2xlbmd0aCk7CisJCXByaW50aygiXG4iS0VSTl9ERUJVRyIgIFR4IHJpbmcgJXA6ICIsIGhtcC0+dHhfcmluZyk7CisJCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykKKwkJCXByaW50aygiICU0LjR4IiwgaG1wLT50eF9yaW5nW2ldLnN0YXR1c19uX2xlbmd0aCk7CisJCXByaW50aygiXG4iKTsKKwl9CisKKwkvKiBSZWluaXQgdGhlIGhhcmR3YXJlIGFuZCBtYWtlIHN1cmUgdGhlIFJ4IGFuZCBUeCBwcm9jZXNzZXMgCisJCWFyZSB1cCBhbmQgcnVubmluZy4KKwkgKi8KKwlkZXYtPmlmX3BvcnQgPSAwOworCS8qIFRoZSByaWdodCB3YXkgdG8gZG8gUmVzZXQuIC1LRFUKKwkgKgkJLUNsZWFyIE9XTiBiaXQgaW4gYWxsIFJ4L1R4IGRlc2NyaXB0b3JzCisJICoJCS1XYWl0IDUwIHVTIGZvciBjaGFubmVscyB0byBnbyBpZGxlCisJICoJCS1UdXJuIG9mZiBNQUMgcmVjZWl2ZXIKKwkgKgkJLUlzc3VlIFJlc2V0CisJICovCisJCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQorCQlobXAtPnJ4X3JpbmdbaV0uc3RhdHVzX25fbGVuZ3RoICY9IGNwdV90b19sZTMyKH5EZXNjT3duKTsKKworCS8qIFByZXN1bWUgdGhhdCBhbGwgcGFja2V0cyBpbiB0aGUgVHggcXVldWUgYXJlIGdvbmUgaWYgd2UgaGF2ZSB0bworCSAqIHJlLWluaXQgdGhlIGhhcmR3YXJlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKyl7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJaWYgKGkgPj0gVFhfUklOR19TSVpFIC0gMSkKKwkJCWhtcC0+dHhfcmluZ1tpXS5zdGF0dXNfbl9sZW5ndGggPSBjcHVfdG9fbGUzMigKKwkJCQlEZXNjRW5kUmluZyB8CisJCQkJKGhtcC0+dHhfcmluZ1tpXS5zdGF0dXNfbl9sZW5ndGggJiAweDAwMDBGRkZGKSk7CisJCWVsc2UJCisJCQlobXAtPnR4X3JpbmdbaV0uc3RhdHVzX25fbGVuZ3RoICY9IDB4MDAwMGZmZmY7CisJCXNrYiA9IGhtcC0+dHhfc2tidWZmW2ldOworCQlpZiAoc2tiKXsKKwkJCXBjaV91bm1hcF9zaW5nbGUoaG1wLT5wY2lfZGV2LCBobXAtPnR4X3JpbmdbaV0uYWRkciwgCisJCQkJc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJaG1wLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQl9CisJfQorCisJdWRlbGF5KDYwKTsgLyogU2xlZXAgNjAgdXMganVzdCBmb3Igc2FmZXR5IHNha2UgKi8KKwl3cml0ZXcoMHgwMDAyLCBpb2FkZHIgKyBSeENtZCk7IC8qIFNUT1AgUnggKi8KKwkJCisJd3JpdGViKDB4MDEsIGlvYWRkciArIENoaXBSZXNldCk7ICAvKiBSZWluaXQgdGhlIGhhcmR3YXJlICovIAorCisJaG1wLT50eF9mdWxsID0gMDsKKwlobXAtPmN1cl9yeCA9IGhtcC0+Y3VyX3R4ID0gMDsKKwlobXAtPmRpcnR5X3J4ID0gaG1wLT5kaXJ0eV90eCA9IDA7CisJLyogUnggcGFja2V0cyBhcmUgYWxzbyBwcmVzdW1lZCBsb3N0OyBob3dldmVyLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBhCisJICogcmluZyBvZiBidWZmZXJzIGlzIGluIHRhY3QuIC1LRFUKKwkgKi8gCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKXsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGhtcC0+cnhfc2tidWZmW2ldOworCisJCWlmIChza2IpeworCQkJcGNpX3VubWFwX3NpbmdsZShobXAtPnBjaV9kZXYsIGhtcC0+cnhfcmluZ1tpXS5hZGRyLCAKKwkJCQlobXAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCWhtcC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwkJfQorCX0KKwkvKiBGaWxsIGluIHRoZSBSeCBidWZmZXJzLiAgSGFuZGxlIGFsbG9jYXRpb24gZmFpbHVyZSBncmFjZWZ1bGx5LiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYihobXAtPnJ4X2J1Zl9zeik7CisJCWhtcC0+cnhfc2tidWZmW2ldID0gc2tiOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlicmVhazsKKwkJc2tiLT5kZXYgPSBkZXY7ICAgICAgICAgLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLworCQlza2JfcmVzZXJ2ZShza2IsIDIpOyAvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIuICovCisgICAgICAgICAgICAgICAgaG1wLT5yeF9yaW5nW2ldLmFkZHIgPSBjcHVfdG9fbGVYWChwY2lfbWFwX3NpbmdsZShobXAtPnBjaV9kZXYsIAorCQkJc2tiLT50YWlsLCBobXAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCWhtcC0+cnhfcmluZ1tpXS5zdGF0dXNfbl9sZW5ndGggPSBjcHVfdG9fbGUzMihEZXNjT3duIHwgCisJCQlEZXNjRW5kUGFja2V0IHwgRGVzY0ludHIgfCAoaG1wLT5yeF9idWZfc3ogLSAyKSk7CisJfQorCWhtcC0+ZGlydHlfcnggPSAodW5zaWduZWQgaW50KShpIC0gUlhfUklOR19TSVpFKTsKKwkvKiBNYXJrIHRoZSBsYXN0IGVudHJ5IGFzIHdyYXBwaW5nIHRoZSByaW5nLiAqLworCWhtcC0+cnhfcmluZ1tSWF9SSU5HX1NJWkUtMV0uc3RhdHVzX25fbGVuZ3RoIHw9IGNwdV90b19sZTMyKERlc2NFbmRSaW5nKTsKKworCS8qIFRyaWdnZXIgYW4gaW1tZWRpYXRlIHRyYW5zbWl0IGRlbWFuZC4gKi8KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlobXAtPnN0YXRzLnR4X2Vycm9ycysrOworCisJLyogUmVzdGFydCB0aGUgY2hpcCdzIFR4L1J4IHByb2Nlc3NlcyAuICovCisJd3JpdGV3KDB4MDAwMiwgaW9hZGRyICsgVHhDbWQpOyAvKiBTVE9QIFR4ICovCisJd3JpdGV3KDB4MDAwMSwgaW9hZGRyICsgVHhDbWQpOyAvKiBTVEFSVCBUeCAqLworCXdyaXRldygweDAwMDEsIGlvYWRkciArIFJ4Q21kKTsgLyogU1RBUlQgUnggKi8KKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworCisvKiBJbml0aWFsaXplIHRoZSBSeCBhbmQgVHggcmluZ3MsIGFsb25nIHdpdGggdmFyaW91cyAnZGV2JyBiaXRzLiAqLworc3RhdGljIHZvaWQgaGFtYWNoaV9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGFtYWNoaV9wcml2YXRlICpobXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJaG1wLT50eF9mdWxsID0gMDsKKwlobXAtPmN1cl9yeCA9IGhtcC0+Y3VyX3R4ID0gMDsKKwlobXAtPmRpcnR5X3J4ID0gaG1wLT5kaXJ0eV90eCA9IDA7CisKKyNpZiAwCisJLyogVGhpcyBpcyB3cm9uZy4gIEknbSBub3Qgc3VyZSB3aGF0IHRoZSBvcmlnaW5hbCBwbGFuIHdhcywgYnV0IHRoaXMKKwkgKiBpcyB3cm9uZy4gIEFuIE1UVSBvZiAxIGdldHMgeW91IGEgYnVmZmVyIG9mIDE1MzYsIHdoaWxlIGFuIE1UVQorCSAqIG9mIDE1MDEgZ2V0cyBhIGJ1ZmZlciBvZiAxNTMzPyAtS0RVCisJICovCisJaG1wLT5yeF9idWZfc3ogPSAoZGV2LT5tdHUgPD0gMTUwMCA/IFBLVF9CVUZfU1ogOiBkZXYtPm10dSArIDMyKTsKKyNlbmRpZgorCS8qIE15IGF0dGVtcHQgYXQgYSByZWFzb25hYmxlIGNvcnJlY3Rpb24gKi8KKwkvKiArMjYgZ2V0cyB0aGUgbWF4aW11bSBldGhlcm5ldCBlbmNhcHN1bGF0aW9uLCArNyAmIH43IGJlY2F1c2UgdGhlCisJICogY2FyZCBuZWVkcyByb29tIHRvIGRvIDggYnl0ZSBhbGlnbm1lbnQsICsyIHNvIHdlIGNhbiByZXNlcnZlIAorCSAqIHRoZSBmaXJzdCAyIGJ5dGVzLCBhbmQgKzE2IGdldHMgcm9vbSBmb3IgdGhlIHN0YXR1cyB3b3JkIGZyb20gdGhlIAorCSAqIGNhcmQuICAtS0RVCisJICovCisJaG1wLT5yeF9idWZfc3ogPSAoZGV2LT5tdHUgPD0gMTQ5MiA/IFBLVF9CVUZfU1ogOiAKKwkJKCgoZGV2LT5tdHUrMjYrNykgJiB+NykgKyAyICsgMTYpKTsKKworCS8qIEluaXRpYWxpemUgYWxsIFJ4IGRlc2NyaXB0b3JzLiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlobXAtPnJ4X3JpbmdbaV0uc3RhdHVzX25fbGVuZ3RoID0gMDsKKwkJaG1wLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCX0KKwkvKiBGaWxsIGluIHRoZSBSeCBidWZmZXJzLiAgSGFuZGxlIGFsbG9jYXRpb24gZmFpbHVyZSBncmFjZWZ1bGx5LiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYihobXAtPnJ4X2J1Zl9zeik7CisJCWhtcC0+cnhfc2tidWZmW2ldID0gc2tiOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlicmVhazsKKwkJc2tiLT5kZXYgPSBkZXY7ICAgICAgICAgLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLworCQlza2JfcmVzZXJ2ZShza2IsIDIpOyAvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIuICovCisgICAgICAgICAgICAgICAgaG1wLT5yeF9yaW5nW2ldLmFkZHIgPSBjcHVfdG9fbGVYWChwY2lfbWFwX3NpbmdsZShobXAtPnBjaV9kZXYsIAorCQkJc2tiLT50YWlsLCBobXAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCS8qIC0yIGJlY2F1c2UgaXQgZG9lc24ndCBSRUFMTFkgaGF2ZSB0aGF0IGZpcnN0IDIgYnl0ZXMgLUtEVSAqLworCQlobXAtPnJ4X3JpbmdbaV0uc3RhdHVzX25fbGVuZ3RoID0gY3B1X3RvX2xlMzIoRGVzY093biB8IAorCQkJRGVzY0VuZFBhY2tldCB8IERlc2NJbnRyIHwgKGhtcC0+cnhfYnVmX3N6IC0yKSk7CisJfQorCWhtcC0+ZGlydHlfcnggPSAodW5zaWduZWQgaW50KShpIC0gUlhfUklOR19TSVpFKTsKKwlobXAtPnJ4X3JpbmdbUlhfUklOR19TSVpFLTFdLnN0YXR1c19uX2xlbmd0aCB8PSBjcHVfdG9fbGUzMihEZXNjRW5kUmluZyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJaG1wLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQlobXAtPnR4X3JpbmdbaV0uc3RhdHVzX25fbGVuZ3RoID0gMDsKKwl9CisJLyogTWFyayB0aGUgbGFzdCBlbnRyeSBvZiB0aGUgcmluZyAqLworCWhtcC0+dHhfcmluZ1tUWF9SSU5HX1NJWkUtMV0uc3RhdHVzX25fbGVuZ3RoIHw9IGNwdV90b19sZTMyKERlc2NFbmRSaW5nKTsKKworCXJldHVybjsKK30KKworCisjaWZkZWYgVFhfQ0hFQ0tTVU0KKyNkZWZpbmUgY3N1bV9hZGQoaXQsIHZhbCkgXAorZG8geyBcCisgICAgaXQgKz0gKHUxNikgKHZhbCk7IFwKKyAgICBpZiAoaXQgJiAweGZmZmYwMDAwKSB7IFwKKwlpdCAmPSAweGZmZmY7IFwKKwkrK2l0OyBcCisgICAgfSBcCit9IHdoaWxlICgwKQorICAgIC8qIHByaW50aygiYWRkICUwNHggLS0+ICUwNHhcbiIsIHZhbCwgaXQpOyBcICovCisKKy8qIHVoLT5sZW4gYWxyZWFkeSBuZXR3b3JrIGZvcm1hdCwgZG8gbm90IHN3YXAgKi8KKyNkZWZpbmUgcHNldWRvX2NzdW1fdWRwKHN1bSxpaCx1aCkgZG8geyBcCisgICAgc3VtID0gMDsgXAorICAgIGNzdW1fYWRkKHN1bSwgKGloKS0+c2FkZHIgPj4gMTYpOyBcCisgICAgY3N1bV9hZGQoc3VtLCAoaWgpLT5zYWRkciAmIDB4ZmZmZik7IFwKKyAgICBjc3VtX2FkZChzdW0sIChpaCktPmRhZGRyID4+IDE2KTsgXAorICAgIGNzdW1fYWRkKHN1bSwgKGloKS0+ZGFkZHIgJiAweGZmZmYpOyBcCisgICAgY3N1bV9hZGQoc3VtLCBfX2NvbnN0YW50X2h0b25zKElQUFJPVE9fVURQKSk7IFwKKyAgICBjc3VtX2FkZChzdW0sICh1aCktPmxlbik7IFwKK30gd2hpbGUgKDApCisKKy8qIHN3YXAgbGVuICovCisjZGVmaW5lIHBzZXVkb19jc3VtX3RjcChzdW0saWgsbGVuKSBkbyB7IFwKKyAgICBzdW0gPSAwOyBcCisgICAgY3N1bV9hZGQoc3VtLCAoaWgpLT5zYWRkciA+PiAxNik7IFwKKyAgICBjc3VtX2FkZChzdW0sIChpaCktPnNhZGRyICYgMHhmZmZmKTsgXAorICAgIGNzdW1fYWRkKHN1bSwgKGloKS0+ZGFkZHIgPj4gMTYpOyBcCisgICAgY3N1bV9hZGQoc3VtLCAoaWgpLT5kYWRkciAmIDB4ZmZmZik7IFwKKyAgICBjc3VtX2FkZChzdW0sIF9fY29uc3RhbnRfaHRvbnMoSVBQUk9UT19UQ1ApKTsgXAorICAgIGNzdW1fYWRkKHN1bSwgaHRvbnMobGVuKSk7IFwKK30gd2hpbGUgKDApCisjZW5kaWYKKworc3RhdGljIGludCBoYW1hY2hpX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGFtYWNoaV9wcml2YXRlICpobXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGVudHJ5OworCXUxNiBzdGF0dXM7CisKKwkvKiBPaywgbm93IG1ha2Ugc3VyZSB0aGF0IHRoZSBxdWV1ZSBoYXMgc3BhY2UgYmVmb3JlIHRyeWluZyB0byAKKwkJYWRkIGFub3RoZXIgc2tidWZmLiAgaWYgd2UgcmV0dXJuIG5vbi16ZXJvIHRoZSBzY2hlZHVsZXIKKwkJc2hvdWxkIGludGVycHJldCB0aGlzIGFzIGEgcXVldWUgZnVsbCBhbmQgcmVxdWV1ZSB0aGUgYnVmZmVyCisJCWZvciBsYXRlci4KKwkgKi8KKwlpZiAoaG1wLT50eF9mdWxsKSB7CisJCS8qIFdlIHNob3VsZCBORVZFUiByZWFjaCB0aGlzIHBvaW50IC1LRFUgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEhhbWFjaGkgdHJhbnNtaXQgcXVldWUgZnVsbCBhdCBzbG90ICVkLlxuIixkZXYtPm5hbWUsIGhtcC0+Y3VyX3R4KTsKKworCQkvKiBXYWtlIHRoZSBwb3RlbnRpYWxseS1pZGxlIHRyYW5zbWl0IGNoYW5uZWwuICovCisJCS8qIElmIHdlIGRvbid0IG5lZWQgdG8gcmVhZCBzdGF0dXMsIERPTidUIC1LRFUgKi8KKwkJc3RhdHVzPXJlYWR3KGhtcC0+YmFzZSArIFR4U3RhdHVzKTsKKwkJaWYoICEoc3RhdHVzICYgMHgwMDAxKSB8fCAoc3RhdHVzICYgMHgwMDAyKSkKKwkJCXdyaXRldygweDAwMDEsIGhtcC0+YmFzZSArIFR4Q21kKTsKKwkJcmV0dXJuIDE7CisJfSAKKworCS8qIENhdXRpb246IHRoZSB3cml0ZSBvcmRlciBpcyBpbXBvcnRhbnQgaGVyZSwgc2V0IHRoZSBmaWVsZAorCSAgIHdpdGggdGhlICJvd25lcnNoaXAiIGJpdHMgbGFzdC4gKi8KKworCS8qIENhbGN1bGF0ZSB0aGUgbmV4dCBUeCBkZXNjcmlwdG9yIGVudHJ5LiAqLworCWVudHJ5ID0gaG1wLT5jdXJfdHggJSBUWF9SSU5HX1NJWkU7CisKKwlobXAtPnR4X3NrYnVmZltlbnRyeV0gPSBza2I7CisKKyNpZmRlZiBUWF9DSEVDS1NVTQorCXsKKwkgICAgLyogdGFjayBvbiBjaGVja3N1bSB0YWcgKi8KKwkgICAgdTMyIHRhZ3ZhbCA9IDA7CisJICAgIHN0cnVjdCBldGhoZHIgKmVoID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7CisJICAgIGlmIChlaC0+aF9wcm90byA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKSkgeworCQlzdHJ1Y3QgaXBoZHIgKmloID0gKHN0cnVjdCBpcGhkciAqKSgoY2hhciAqKWVoICsgRVRIX0hMRU4pOworCQlpZiAoaWgtPnByb3RvY29sID09IElQUFJPVE9fVURQKSB7CisJCSAgICBzdHJ1Y3QgdWRwaGRyICp1aAorCQkgICAgICA9IChzdHJ1Y3QgdWRwaGRyICopKChjaGFyICopaWggKyBpaC0+aWhsKjQpOworCQkgICAgdTMyIG9mZnNldCA9ICgodW5zaWduZWQgY2hhciAqKXVoICsgNikgLSBza2ItPmRhdGE7CisJCSAgICB1MzIgcHNldWRvOworCQkgICAgcHNldWRvX2NzdW1fdWRwKHBzZXVkbywgaWgsIHVoKTsKKwkJICAgIHBzZXVkbyA9IGh0b25zKHBzZXVkbyk7CisJCSAgICBwcmludGsoInVkcCBja3N1bSB3YXMgJTA0eCwgc2VuZGluZyBwc2V1ZG8gJTA0eFxuIiwKKwkJICAgICAgdWgtPmNoZWNrLCBwc2V1ZG8pOworCQkgICAgdWgtPmNoZWNrID0gMDsgIC8qIHplcm8gb3V0IHVoLT5jaGVjayBiZWZvcmUgY2FyZCBjYWxjICovCisJCSAgICAvKgorCQkgICAgICogc3RhcnQgYXQgMTQgKHNraXAgZXRoaGRyKSwgc3RvcmUgYXQgb2Zmc2V0ICh1aC0+Y2hlY2spLAorCQkgICAgICogdXNlIHBzZXVkbyB2YWx1ZSBnaXZlbi4KKwkJICAgICAqLworCQkgICAgdGFndmFsID0gKDE0IDw8IDI0KSB8IChvZmZzZXQgPDwgMTYpIHwgcHNldWRvOworCQl9IGVsc2UgaWYgKGloLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkgeworCQkgICAgcHJpbnRrKCJ0Y3AsIG5vIGF1dG8gY2tzdW1cbiIpOworCQl9CisJICAgIH0KKwkgICAgKih1MzIgKilza2JfcHVzaChza2IsIDgpID0gdGFndmFsOworCX0KKyNlbmRpZgorCisgICAgICAgIGhtcC0+dHhfcmluZ1tlbnRyeV0uYWRkciA9IGNwdV90b19sZVhYKHBjaV9tYXBfc2luZ2xlKGhtcC0+cGNpX2RldiwgCisJCXNrYi0+ZGF0YSwgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpKTsKKyAgICAKKwkvKiBIbW1tbSwgY291bGQgcHJvYmFibHkgcHV0IGEgRGVzY0ludHIgb24gdGhlc2UsIGJ1dCB0aGUgd2F5CisJCXRoZSBkcml2ZXIgaXMgY3VycmVudGx5IGNvZGVkIG1ha2VzIFR4IGludGVycnVwdHMgdW5uZWNlc3NhcnkKKwkJc2luY2UgdGhlIGNsZWFyaW5nIG9mIHRoZSBUeCByaW5nIGlzIGhhbmRsZWQgYnkgdGhlIHN0YXJ0X3htaXQKKwkJcm91dGluZS4gIFRoaXMgb3JnYW5pemF0aW9uIGhlbHBzIG1pdGlnYXRlIHRoZSBpbnRlcnJ1cHRzIGEKKwkJYml0IGFuZCBwcm9iYWJseSByZW5kZXJzIHRoZSBtYXhfdHhfbGF0ZW5jeSBwYXJhbSB1c2VsZXNzLgorCQkKKwkJVXBkYXRlOiBQdXR0aW5nIGEgRGVzY0ludHIgYml0IG9uIGFsbCBvZiB0aGUgZGVzY3JpcHRvcnMgYW5kCisJCW1pdGlnYXRpbmcgaW50ZXJydXB0IGZyZXF1ZW5jeSB3aXRoIHRoZSB0eF9taW5fcGt0IHBhcmFtZXRlci4gLUtEVQorCSovCisJaWYgKGVudHJ5ID49IFRYX1JJTkdfU0laRS0xKQkJIC8qIFdyYXAgcmluZyAqLworCQlobXAtPnR4X3JpbmdbZW50cnldLnN0YXR1c19uX2xlbmd0aCA9IGNwdV90b19sZTMyKERlc2NPd24gfAorCQkJRGVzY0VuZFBhY2tldCB8IERlc2NFbmRSaW5nIHwgRGVzY0ludHIgfCBza2ItPmxlbik7CisJZWxzZQorCQlobXAtPnR4X3JpbmdbZW50cnldLnN0YXR1c19uX2xlbmd0aCA9IGNwdV90b19sZTMyKERlc2NPd24gfAorCQkJRGVzY0VuZFBhY2tldCB8IERlc2NJbnRyIHwgc2tiLT5sZW4pOworCWhtcC0+Y3VyX3R4Kys7CisKKwkvKiBOb24teDg2IFRvZG86IGV4cGxpY2l0bHkgZmx1c2ggY2FjaGUgbGluZXMgaGVyZS4gKi8KKworCS8qIFdha2UgdGhlIHBvdGVudGlhbGx5LWlkbGUgdHJhbnNtaXQgY2hhbm5lbC4gKi8KKwkvKiBJZiB3ZSBkb24ndCBuZWVkIHRvIHJlYWQgc3RhdHVzLCBET04nVCAtS0RVICovCisJc3RhdHVzPXJlYWR3KGhtcC0+YmFzZSArIFR4U3RhdHVzKTsKKwlpZiggIShzdGF0dXMgJiAweDAwMDEpIHx8IChzdGF0dXMgJiAweDAwMDIpKQorCQl3cml0ZXcoMHgwMDAxLCBobXAtPmJhc2UgKyBUeENtZCk7CisKKwkvKiBJbW1lZGlhdGVseSBiZWZvcmUgcmV0dXJuaW5nLCBsZXQncyBjbGVhciBhcyBtYW55IGVudHJpZXMgYXMgd2UgY2FuLiAqLworCWhhbWFjaGlfdHgoZGV2KTsKKworCS8qIFdlIHNob3VsZCBraWNrIHRoZSBib3R0b20gaGFsZiBoZXJlLCBzaW5jZSB3ZSBhcmUgbm90IGFjY2VwdGluZworCSAqIGludGVycnVwdHMgd2l0aCBldmVyeSBwYWNrZXQuICBpLmUuIHJlYWxpemUgdGhhdCBHaWdhYml0IGV0aGVybmV0CisJICogY2FuIHRyYW5zbWl0IGZhc3RlciB0aGFuIG9yZGluYXJ5IG1hY2hpbmVzIGNhbiBsb2FkIHBhY2tldHM7CisJICogaGVuY2UsIGFueSBwYWNrZXQgdGhhdCBnb3QgcHV0IG9mZiBiZWNhdXNlIHdlIHdlcmUgaW4gdGhlIHRyYW5zbWl0CisJICogcm91dGluZSBzaG91bGQgSU1NRURJQVRFTFkgZ2V0IGEgY2hhbmNlIHRvIGJlIHJlLXF1ZXVlZC4gLUtEVQorCSAqLworCWlmICgoaG1wLT5jdXJfdHggLSBobXAtPmRpcnR5X3R4KSA8IChUWF9SSU5HX1NJWkUgLSA0KSkgCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsgIC8qIFR5cGljYWwgcGF0aCAqLworCWVsc2UgeworCQlobXAtPnR4X2Z1bGwgPSAxOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJfQorCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJaWYgKGhhbWFjaGlfZGVidWcgPiA0KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogSGFtYWNoaSB0cmFuc21pdCBmcmFtZSAjJWQgcXVldWVkIGluIHNsb3QgJWQuXG4iLAorCQkJICAgZGV2LT5uYW1lLCBobXAtPmN1cl90eCwgZW50cnkpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogVGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXMgYWxsIG9mIHRoZSBSeCB0aHJlYWQgd29yayBhbmQgY2xlYW5zIHVwCisgICBhZnRlciB0aGUgVHggdGhyZWFkLiAqLworc3RhdGljIGlycXJldHVybl90IGhhbWFjaGlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2luc3RhbmNlOworCXN0cnVjdCBoYW1hY2hpX3ByaXZhdGUgKmhtcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBobXAtPmJhc2U7CisJbG9uZyBib2d1c2NudCA9IG1heF9pbnRlcnJ1cHRfd29yazsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgkJCS8qIENhbiBuZXZlciBvY2N1ci4gKi8KKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiaGFtYWNoaV9pbnRlcnJ1cHQoKTogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisjZW5kaWYKKworCXNwaW5fbG9jaygmaG1wLT5sb2NrKTsKKworCWRvIHsKKwkJdTMyIGludHJfc3RhdHVzID0gcmVhZGwoaW9hZGRyICsgSW50ZXJydXB0Q2xlYXIpOworCisJCWlmIChoYW1hY2hpX2RlYnVnID4gNCkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogSGFtYWNoaSBpbnRlcnJ1cHQsIHN0YXR1cyAlNC40eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7CisKKwkJaWYgKGludHJfc3RhdHVzID09IDApCisJCQlicmVhazsKKworCQloYW5kbGVkID0gMTsKKworCQlpZiAoaW50cl9zdGF0dXMgJiBJbnRyUnhEb25lKQorCQkJaGFtYWNoaV9yeChkZXYpOworCisJCWlmIChpbnRyX3N0YXR1cyAmIEludHJUeERvbmUpeworCQkJLyogVGhpcyBjb2RlIHNob3VsZCBSQVJFTFkgbmVlZCB0byBleGVjdXRlLiBBZnRlciBhbGwsIHRoaXMgaXMKKwkJCSAqIGEgZ2lnYWJpdCBsaW5rLCBpdCBzaG91bGQgY29uc3VtZSBwYWNrZXRzIGFzIGZhc3QgYXMgd2UgcHV0CisJCQkgKiB0aGVtIGluIEFORCB3ZSBjbGVhciB0aGUgVHggcmluZyBpbiBoYW1hY2hpX3N0YXJ0X3htaXQoKS4KKwkJCSAqLyAKKwkJCWlmIChobXAtPnR4X2Z1bGwpeworCQkJCWZvciAoOyBobXAtPmN1cl90eCAtIGhtcC0+ZGlydHlfdHggPiAwOyBobXAtPmRpcnR5X3R4KyspeworCQkJCQlpbnQgZW50cnkgPSBobXAtPmRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQkJCWlmIChobXAtPnR4X3JpbmdbZW50cnldLnN0YXR1c19uX2xlbmd0aCAmIGNwdV90b19sZTMyKERlc2NPd24pKSAKKwkJCQkJCWJyZWFrOworCQkJCQlza2IgPSBobXAtPnR4X3NrYnVmZltlbnRyeV07CisJCQkJCS8qIEZyZWUgdGhlIG9yaWdpbmFsIHNrYi4gKi8KKwkJCQkJaWYgKHNrYil7CisJCQkJCQlwY2lfdW5tYXBfc2luZ2xlKGhtcC0+cGNpX2RldiwgCisJCQkJCQkJaG1wLT50eF9yaW5nW2VudHJ5XS5hZGRyLCAKKwkJCQkJCQlza2ItPmxlbiwKKwkJCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQkJCQlobXAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJCQl9CisJCQkJCWhtcC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzX25fbGVuZ3RoID0gMDsKKwkJCQkJaWYgKGVudHJ5ID49IFRYX1JJTkdfU0laRS0xKSAgCisJCQkJCQlobXAtPnR4X3JpbmdbVFhfUklOR19TSVpFLTFdLnN0YXR1c19uX2xlbmd0aCB8PSAKKwkJCQkJCQljcHVfdG9fbGUzMihEZXNjRW5kUmluZyk7CisJCQkJCWhtcC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJCX0KKwkJCQlpZiAoaG1wLT5jdXJfdHggLSBobXAtPmRpcnR5X3R4IDwgVFhfUklOR19TSVpFIC0gNCl7CisJCQkJCS8qIFRoZSByaW5nIGlzIG5vIGxvbmdlciBmdWxsICovCisJCQkJCWhtcC0+dHhfZnVsbCA9IDA7CisJCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCX0KKwkJfQorCisKKwkJLyogQWJub3JtYWwgZXJyb3Igc3VtbWFyeS91bmNvbW1vbiBldmVudHMgaGFuZGxlcnMuICovCisJCWlmIChpbnRyX3N0YXR1cyAmCisJCQkoSW50clR4UENJRmF1bHQgfCBJbnRyVHhQQ0lFcnIgfCBJbnRyUnhQQ0lGYXVsdCB8IEludHJSeFBDSUVyciB8CisJCQkgTGlua0NoYW5nZSB8IE5lZ290aWF0aW9uQ2hhbmdlIHwgU3RhdHNNYXgpKQorCQkJaGFtYWNoaV9lcnJvcihkZXYsIGludHJfc3RhdHVzKTsKKworCQlpZiAoLS1ib2d1c2NudCA8IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUb28gbXVjaCB3b3JrIGF0IGludGVycnVwdCwgc3RhdHVzPTB4JTQuNHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgaW50cl9zdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgxKTsKKworCWlmIChoYW1hY2hpX2RlYnVnID4gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleGl0aW5nIGludGVycnVwdCwgc3RhdHVzPSUjNC40eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIHJlYWRsKGlvYWRkciArIEludHJTdGF0dXMpKTsKKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJLyogQ29kZSB0aGF0IHNob3VsZCBuZXZlciBiZSBydW4hICBQZXJoYXBzIHJlbW92ZSBhZnRlciB0ZXN0aW5nLi4gKi8KKwl7CisJCXN0YXRpYyBpbnQgc3RvcGl0ID0gMTA7CisJCWlmIChkZXYtPnN0YXJ0ID09IDAgICYmICAtLXN0b3BpdCA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVtZXJnZW5jeSBzdG9wLCBsb29waW5nIHN0YXJ0dXAgaW50ZXJydXB0LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUpOworCQkJZnJlZV9pcnEoaXJxLCBkZXYpOworCQl9CisJfQorI2VuZGlmCisKKwlzcGluX3VubG9jaygmaG1wLT5sb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworLyogVGhpcyByb3V0aW5lIGlzIGxvZ2ljYWxseSBwYXJ0IG9mIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgYnV0IHNlcGFyYXRlZAorICAgZm9yIGNsYXJpdHkgYW5kIGJldHRlciByZWdpc3RlciBhbGxvY2F0aW9uLiAqLworc3RhdGljIGludCBoYW1hY2hpX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhhbWFjaGlfcHJpdmF0ZSAqaG1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZW50cnkgPSBobXAtPmN1cl9yeCAlIFJYX1JJTkdfU0laRTsKKwlpbnQgYm9ndXNjbnQgPSAoaG1wLT5kaXJ0eV9yeCArIFJYX1JJTkdfU0laRSkgLSBobXAtPmN1cl9yeDsKKworCWlmIChoYW1hY2hpX2RlYnVnID4gNCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiIEluIGhhbWFjaGlfcngoKSwgZW50cnkgJWQgc3RhdHVzICU0LjR4LlxuIiwKKwkJCSAgIGVudHJ5LCBobXAtPnJ4X3JpbmdbZW50cnldLnN0YXR1c19uX2xlbmd0aCk7CisJfQorCisJLyogSWYgRU9QIGlzIHNldCBvbiB0aGUgbmV4dCBlbnRyeSwgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IGhhbWFjaGlfZGVzYyAqZGVzYyA9ICYoaG1wLT5yeF9yaW5nW2VudHJ5XSk7CisJCXUzMiBkZXNjX3N0YXR1cyA9IGxlMzJfdG9fY3B1KGRlc2MtPnN0YXR1c19uX2xlbmd0aCk7CisJCXUxNiBkYXRhX3NpemUgPSBkZXNjX3N0YXR1czsJLyogSW1wbGljaXQgdHJ1bmNhdGUgKi8KKwkJdTggKmJ1Zl9hZGRyOyAKKwkJczMyIGZyYW1lX3N0YXR1czsKKwkJCisJCWlmIChkZXNjX3N0YXR1cyAmIERlc2NPd24pCisJCQlicmVhazsKKwkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGhtcC0+cGNpX2RldiwKKwkJCQkJICAgIGRlc2MtPmFkZHIsCisJCQkJCSAgICBobXAtPnJ4X2J1Zl9zeiwKKwkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCWJ1Zl9hZGRyID0gKHU4ICopIGhtcC0+cnhfc2tidWZmW2VudHJ5XS0+dGFpbDsKKwkJZnJhbWVfc3RhdHVzID0gbGUzMl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoczMyKikmKGJ1Zl9hZGRyW2RhdGFfc2l6ZSAtIDEyXSkpKTsKKwkJaWYgKGhhbWFjaGlfZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgaGFtYWNoaV9yeCgpIHN0YXR1cyB3YXMgJTguOHguXG4iLAorCQkJCWZyYW1lX3N0YXR1cyk7CisJCWlmICgtLWJvZ3VzY250IDwgMCkKKwkJCWJyZWFrOworCQlpZiAoICEgKGRlc2Nfc3RhdHVzICYgRGVzY0VuZFBhY2tldCkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPdmVyc2l6ZWQgRXRoZXJuZXQgZnJhbWUgc3Bhbm5lZCAiCisJCQkJICAgIm11bHRpcGxlIGJ1ZmZlcnMsIGVudHJ5ICUjeCBsZW5ndGggJWQgc3RhdHVzICU0LjR4IVxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIGhtcC0+Y3VyX3J4LCBkYXRhX3NpemUsIGRlc2Nfc3RhdHVzKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPdmVyc2l6ZWQgRXRoZXJuZXQgZnJhbWUgJXAgdnMgJXAuXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgZGVzYywgJmhtcC0+cnhfcmluZ1tobXAtPmN1cl9yeCAlIFJYX1JJTkdfU0laRV0pOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE92ZXJzaXplZCBFdGhlcm5ldCBmcmFtZSAtLSBuZXh0IHN0YXR1cyAleC8leCBsYXN0IHN0YXR1cyAleC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLAorCQkJCSAgIGhtcC0+cnhfcmluZ1soaG1wLT5jdXJfcngrMSkgJSBSWF9SSU5HX1NJWkVdLnN0YXR1c19uX2xlbmd0aCAmIDB4ZmZmZjAwMDAsCisJCQkJICAgaG1wLT5yeF9yaW5nWyhobXAtPmN1cl9yeCsxKSAlIFJYX1JJTkdfU0laRV0uc3RhdHVzX25fbGVuZ3RoICYgMHgwMDAwZmZmZiwKKwkJCQkgICBobXAtPnJ4X3JpbmdbKGhtcC0+Y3VyX3J4LTEpICUgUlhfUklOR19TSVpFXS5zdGF0dXNfbl9sZW5ndGgpOworCQkJaG1wLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCX0gLyogZWxzZSAgT21pdCBmb3IgcHJvdG90eXBlIGVycmF0YT8/PyAqLworCQlpZiAoZnJhbWVfc3RhdHVzICYgMHgwMDM4MDAwMCkgeworCQkJLyogVGhlcmUgd2FzIGFuIGVycm9yLiAqLworCQkJaWYgKGhhbWFjaGlfZGVidWcgPiAyKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIgIGhhbWFjaGlfcngoKSBSeCBlcnJvciB3YXMgJTguOHguXG4iLAorCQkJCQkgICBmcmFtZV9zdGF0dXMpOworCQkJaG1wLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChmcmFtZV9zdGF0dXMgJiAweDAwNjAwMDAwKSBobXAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCWlmIChmcmFtZV9zdGF0dXMgJiAweDAwMDgwMDAwKSBobXAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDAxMDAwMDApIGhtcC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyA8IDApIGhtcC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQl9IGVsc2UgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCS8qIE9taXQgQ1JDICovCisJCQl1MTYgcGt0X2xlbiA9IChmcmFtZV9zdGF0dXMgJiAweDA3ZmYpIC0gNDsJCisjaWZkZWYgUlhfQ0hFQ0tTVU0KKwkJCXUzMiBwZmNrID0gKih1MzIgKikgJmJ1Zl9hZGRyW2RhdGFfc2l6ZSAtIDhdOworI2VuZGlmCisKKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCQlpZiAoaGFtYWNoaV9kZWJ1ZyA+IDQpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgaGFtYWNoaV9yeCgpIG5vcm1hbCBSeCBwa3QgbGVuZ3RoICVkIgorCQkJCQkgICAiIG9mICVkLCBib2d1c19jbnQgJWQuXG4iLAorCQkJCQkgICBwa3RfbGVuLCBkYXRhX3NpemUsIGJvZ3VzY250KTsKKwkJCWlmIChoYW1hY2hpX2RlYnVnID4gNSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyIlczogIHJ4IHN0YXR1cyAlOC44eCAlOC44eCAlOC44eCAlOC44eCAlOC44eC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwKKwkJCQkJICAgKihzMzIqKSYoYnVmX2FkZHJbZGF0YV9zaXplIC0gMjBdKSwKKwkJCQkJICAgKihzMzIqKSYoYnVmX2FkZHJbZGF0YV9zaXplIC0gMTZdKSwKKwkJCQkJICAgKihzMzIqKSYoYnVmX2FkZHJbZGF0YV9zaXplIC0gMTJdKSwKKwkJCQkJICAgKihzMzIqKSYoYnVmX2FkZHJbZGF0YV9zaXplIC0gOF0pLAorCQkJCQkgICAqKHMzMiopJihidWZfYWRkcltkYXRhX3NpemUgLSA0XSkpOworI2VuZGlmCisJCQkvKiBDaGVjayBpZiB0aGUgcGFja2V0IGlzIGxvbmcgZW5vdWdoIHRvIGFjY2VwdCB3aXRob3V0IGNvcHlpbmcKKwkJCSAgIHRvIGEgbWluaW1hbGx5LXNpemVkIHNrYnVmZi4gKi8KKwkJCWlmIChwa3RfbGVuIDwgcnhfY29weWJyZWFrCisJCQkJJiYgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSBOVUxMKSB7CisjaWZkZWYgUlhfQ0hFQ0tTVU0KKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiByeF9jb3B5YnJlYWsgbm9uLXplcm8gIgorCQkJCSAgIm5vdCBnb29kIHdpdGggUlhfQ0hFQ0tTVU1cbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KKwkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoaG1wLT5wY2lfZGV2LAorCQkJCQkJCSAgICBobXAtPnJ4X3JpbmdbZW50cnldLmFkZHIsCisJCQkJCQkJICAgIGhtcC0+cnhfYnVmX3N6LAorCQkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCS8qIENhbGwgY29weSArIGNrc3VtIGlmIGF2YWlsYWJsZS4gKi8KKyNpZiAxIHx8IFVTRV9JUF9DT1BZU1VNCisJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIAorCQkJCQlobXAtPnJ4X3NrYnVmZltlbnRyeV0tPmRhdGEsIHBrdF9sZW4sIDApOworCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKyNlbHNlCisJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBwa3RfbGVuKSwgaG1wLT5yeF9yaW5nX2RtYQorCQkJCQkrIGVudHJ5KnNpemVvZigqZGVzYyksIHBrdF9sZW4pOworI2VuZGlmCisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGhtcC0+cGNpX2RldiwKKwkJCQkJCQkgICAgICAgaG1wLT5yeF9yaW5nW2VudHJ5XS5hZGRyLAorCQkJCQkJCSAgICAgICBobXAtPnJ4X2J1Zl9zeiwKKwkJCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCX0gZWxzZSB7CisJCQkJcGNpX3VubWFwX3NpbmdsZShobXAtPnBjaV9kZXYsIAorCQkJCQkJIGhtcC0+cnhfcmluZ1tlbnRyeV0uYWRkciwKKwkJCQkJCSBobXAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlza2JfcHV0KHNrYiA9IGhtcC0+cnhfc2tidWZmW2VudHJ5XSwgcGt0X2xlbik7CisJCQkJaG1wLT5yeF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJCX0KKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisKKworI2lmZGVmIFJYX0NIRUNLU1VNCisJCQkvKiBUQ1Agb3IgVURQIG9uIGlwdjQsIERJWCBlbmNvZGluZyAqLworCQkJaWYgKHBmY2s+PjI0ID09IDB4OTEgfHwgcGZjaz4+MjQgPT0gMHg1MSkgeworCQkJCXN0cnVjdCBpcGhkciAqaWggPSAoc3RydWN0IGlwaGRyICopIHNrYi0+ZGF0YTsKKwkJCQkvKiBDaGVjayB0aGF0IElQIHBhY2tldCBpcyBhdCBsZWFzdCA0NiBieXRlcywgb3RoZXJ3aXNlLAorCQkJCSAqIHRoZXJlIG1heSBiZSBwYWQgYnl0ZXMgaW5jbHVkZWQgaW4gdGhlIGhhcmR3YXJlIGNoZWNrc3VtLgorCQkJCSAqIFRoaXMgd291bGRuJ3QgaGFwcGVuIGlmIGV2ZXJ5b25lIHBhZGRlZCB3aXRoIDAuCisJCQkJICovCisJCQkJaWYgKG50b2hzKGloLT50b3RfbGVuKSA+PSA0Nil7CisJCQkJCS8qIGRvbid0IHdvcnJ5IGFib3V0IGZyYWdzICovCisJCQkJCWlmICghKGloLT5mcmFnX29mZiAmIF9fY29uc3RhbnRfaHRvbnMoSVBfTUZ8SVBfT0ZGU0VUKSkpIHsKKwkJCQkJCXUzMiBpbnYgPSAqKHUzMiAqKSAmYnVmX2FkZHJbZGF0YV9zaXplIC0gMTZdOworCQkJCQkJdTMyICpwID0gKHUzMiAqKSAmYnVmX2FkZHJbZGF0YV9zaXplIC0gMjBdOworCQkJCQkJcmVnaXN0ZXIgdTMyIGNyYywgcF9yLCBwX3IxOworCisJCQkJCQlpZiAoaW52ICYgNCkgeworCQkJCQkJCWludiAmPSB+NDsKKwkJCQkJCQktLXA7CisJCQkJCQl9CisJCQkJCQlwX3IgPSAqcDsKKwkJCQkJCXBfcjEgPSAqKHAtMSk7CisJCQkJCQlzd2l0Y2ggKGludikgeworCQkJCQkJCWNhc2UgMDoJCisJCQkJCQkJCWNyYyA9IChwX3IgJiAweGZmZmYpICsgKHBfciA+PiAxNik7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgMToJCisJCQkJCQkJCWNyYyA9IChwX3IgPj4gMTYpICsgKHBfciAmIDB4ZmZmZikKKwkJCQkJCQkJCSsgKHBfcjEgPj4gMTYgJiAweGZmMDApOyAKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOgkKKwkJCQkJCQkJY3JjID0gcF9yICsgKHBfcjEgPj4gMTYpOyAKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAzOgkKKwkJCQkJCQkJY3JjID0gcF9yICsgKHBfcjEgJiAweGZmMDApICsgKHBfcjEgPj4gMTYpOyAKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJZGVmYXVsdDoJLypOT1RSRUFDSEVEKi8gY3JjID0gMDsKKwkJCQkJCX0KKwkJCQkJCWlmIChjcmMgJiAweGZmZmYwMDAwKSB7CisJCQkJCQkJY3JjICY9IDB4ZmZmZjsKKwkJCQkJCQkrK2NyYzsKKwkJCQkJCX0KKwkJCQkJCS8qIHRjcC91ZHAgd2lsbCBhZGQgaW4gcHNldWRvICovCisJCQkJCQlza2ItPmNzdW0gPSBudG9ocyhwZmNrICYgMHhmZmZmKTsKKwkJCQkJCWlmIChza2ItPmNzdW0gPiBjcmMpCisJCQkJCQkJc2tiLT5jc3VtIC09IGNyYzsKKwkJCQkJCWVsc2UKKwkJCQkJCQlza2ItPmNzdW0gKz0gKH5jcmMgJiAweGZmZmYpOworCQkJCQkJLyoKKwkJCQkJCSogY291bGQgZG8gdGhlIHBzZXVkbyBteXNlbGYgYW5kIHJldHVybgorCQkJCQkJKiBDSEVDS1NVTV9VTk5FQ0VTU0FSWQorCQkJCQkJKi8KKwkJCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fSFc7CisJCQkJCX0KKwkJCQl9CQorCQkJfQorI2VuZGlmICAvKiBSWF9DSEVDS1NVTSAqLworCisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCWhtcC0+c3RhdHMucnhfcGFja2V0cysrOworCQl9CisJCWVudHJ5ID0gKCsraG1wLT5jdXJfcngpICUgUlhfUklOR19TSVpFOworCX0KKworCS8qIFJlZmlsbCB0aGUgUnggcmluZyBidWZmZXJzLiAqLworCWZvciAoOyBobXAtPmN1cl9yeCAtIGhtcC0+ZGlydHlfcnggPiAwOyBobXAtPmRpcnR5X3J4KyspIHsKKwkJc3RydWN0IGhhbWFjaGlfZGVzYyAqZGVzYzsKKworCQllbnRyeSA9IGhtcC0+ZGlydHlfcnggJSBSWF9SSU5HX1NJWkU7CisJCWRlc2MgPSAmKGhtcC0+cnhfcmluZ1tlbnRyeV0pOworCQlpZiAoaG1wLT5yeF9za2J1ZmZbZW50cnldID09IE5VTEwpIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKGhtcC0+cnhfYnVmX3N6KTsKKworCQkJaG1wLT5yeF9za2J1ZmZbZW50cnldID0gc2tiOworCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJCWJyZWFrOwkJLyogQmV0dGVyIGx1Y2sgbmV4dCByb3VuZC4gKi8KKwkJCXNrYi0+ZGV2ID0gZGV2OwkJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLworCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCisgICAgICAgICAgICAgICAgCWRlc2MtPmFkZHIgPSBjcHVfdG9fbGVYWChwY2lfbWFwX3NpbmdsZShobXAtPnBjaV9kZXYsIAorCQkJCXNrYi0+dGFpbCwgaG1wLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSkpOworCQl9CisJCWRlc2MtPnN0YXR1c19uX2xlbmd0aCA9IGNwdV90b19sZTMyKGhtcC0+cnhfYnVmX3N6KTsKKwkJaWYgKGVudHJ5ID49IFJYX1JJTkdfU0laRS0xKQorCQkJZGVzYy0+c3RhdHVzX25fbGVuZ3RoIHw9IGNwdV90b19sZTMyKERlc2NPd24gfCAKKwkJCQlEZXNjRW5kUGFja2V0IHwgRGVzY0VuZFJpbmcgfCBEZXNjSW50cik7CisJCWVsc2UKKwkJCWRlc2MtPnN0YXR1c19uX2xlbmd0aCB8PSBjcHVfdG9fbGUzMihEZXNjT3duIHwgCisJCQkJRGVzY0VuZFBhY2tldCB8IERlc2NJbnRyKTsKKwl9CisKKwkvKiBSZXN0YXJ0IFJ4IGVuZ2luZSBpZiBzdG9wcGVkLiAqLworCS8qIElmIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgc3RhdHVzLCBkb24ndC4gLUtEVSAqLworCWlmIChyZWFkdyhobXAtPmJhc2UgKyBSeFN0YXR1cykgJiAweDAwMDIpCisJCXdyaXRldygweDAwMDEsIGhtcC0+YmFzZSArIFJ4Q21kKTsKKworCXJldHVybiAwOworfQorCisvKiBUaGlzIGlzIG1vcmUgcHJvcGVybHkgbmFtZWQgInVuY29tbW9uIGludGVycnVwdCBldmVudHMiLCBhcyBpdCBjb3ZlcnMgbW9yZQorICAgdGhhbiBqdXN0IGVycm9ycy4gKi8KK3N0YXRpYyB2b2lkIGhhbWFjaGlfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGludHJfc3RhdHVzKQoreworCXN0cnVjdCBoYW1hY2hpX3ByaXZhdGUgKmhtcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBobXAtPmJhc2U7CisKKwlpZiAoaW50cl9zdGF0dXMgJiAoTGlua0NoYW5nZXxOZWdvdGlhdGlvbkNoYW5nZSkpIHsKKwkJaWYgKGhhbWFjaGlfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpbmsgY2hhbmdlZDogQXV0b05lZ290aWF0aW9uIEN0cmwiCisJCQkJICAgIiAlNC40eCwgU3RhdHVzICU0LjR4ICU0LjR4IEludHIgc3RhdHVzICU0LjR4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIHJlYWR3KGlvYWRkciArIDB4MEUwKSwgcmVhZHcoaW9hZGRyICsgMHgwRTIpLAorCQkJCSAgIHJlYWR3KGlvYWRkciArIEFOTGlua1BhcnRuZXJBYmlsaXR5KSwKKwkJCQkgICByZWFkbChpb2FkZHIgKyBJbnRyU3RhdHVzKSk7CisJCWlmIChyZWFkdyhpb2FkZHIgKyBBTlN0YXR1cykgJiAweDIwKQorCQkJd3JpdGViKDB4MDEsIGlvYWRkciArIExFREN0cmwpOworCQllbHNlCisJCQl3cml0ZWIoMHgwMywgaW9hZGRyICsgTEVEQ3RybCk7CisJfQorCWlmIChpbnRyX3N0YXR1cyAmIFN0YXRzTWF4KSB7CisJCWhhbWFjaGlfZ2V0X3N0YXRzKGRldik7CisJCS8qIFJlYWQgdGhlIG92ZXJmbG93IGJpdHMgdG8gY2xlYXIuICovCisJCXJlYWRsKGlvYWRkciArIDB4MzcwKTsKKwkJcmVhZGwoaW9hZGRyICsgMHgzRjApOworCX0KKwlpZiAoKGludHJfc3RhdHVzICYgfihMaW5rQ2hhbmdlfFN0YXRzTWF4fE5lZ290aWF0aW9uQ2hhbmdlfEludHJSeERvbmV8SW50clR4RG9uZSkpCisJCSYmIGhhbWFjaGlfZGVidWcpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFNvbWV0aGluZyBXaWNrZWQgaGFwcGVuZWQhICU0LjR4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW50cl9zdGF0dXMpOworCS8qIEhtbW1tbSwgaXQncyBub3QgY2xlYXIgaG93IHRvIHJlY292ZXIgZnJvbSBQQ0kgZmF1bHRzLiAqLworCWlmIChpbnRyX3N0YXR1cyAmIChJbnRyVHhQQ0lFcnIgfCBJbnRyVHhQQ0lGYXVsdCkpCisJCWhtcC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwlpZiAoaW50cl9zdGF0dXMgJiAoSW50clJ4UENJRXJyIHwgSW50clJ4UENJRmF1bHQpKQorCQlobXAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7Cit9CisKK3N0YXRpYyBpbnQgaGFtYWNoaV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBoYW1hY2hpX3ByaXZhdGUgKmhtcCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBobXAtPmJhc2U7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgaTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmIChoYW1hY2hpX2RlYnVnID4gMSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLCBzdGF0dXMgd2FzIFR4ICU0LjR4IFJ4ICU0LjR4IEludCAlMi4yeC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIHJlYWR3KGlvYWRkciArIFR4U3RhdHVzKSwKKwkJCSAgIHJlYWR3KGlvYWRkciArIFJ4U3RhdHVzKSwgcmVhZGwoaW9hZGRyICsgSW50clN0YXR1cykpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFF1ZXVlIHBvaW50ZXJzIHdlcmUgVHggJWQgLyAlZCwgIFJ4ICVkIC8gJWQuXG4iLAorCQkJICAgZGV2LT5uYW1lLCBobXAtPmN1cl90eCwgaG1wLT5kaXJ0eV90eCwgaG1wLT5jdXJfcngsIGhtcC0+ZGlydHlfcngpOworCX0KKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBieSBjbGVhcmluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJd3JpdGVsKDB4MDAwMCwgaW9hZGRyICsgSW50ZXJydXB0RW5hYmxlKTsKKworCS8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggcHJvY2Vzc2VzLiAqLworCXdyaXRlbCgyLCBpb2FkZHIgKyBSeENtZCk7CisJd3JpdGV3KDIsIGlvYWRkciArIFR4Q21kKTsKKworI2lmZGVmIF9faTM4Nl9fCisJaWYgKGhhbWFjaGlfZGVidWcgPiAyKSB7CisJCXByaW50aygiXG4iS0VSTl9ERUJVRyIgIFR4IHJpbmcgYXQgJTguOHg6XG4iLAorCQkJICAgKGludClobXAtPnR4X3JpbmdfZG1hKTsKKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCQkJcHJpbnRrKCIgJWMgIyVkIGRlc2MuICU4Ljh4ICU4Ljh4LlxuIiwKKwkJCQkgICByZWFkbChpb2FkZHIgKyBUeEN1clB0cikgPT0gKGxvbmcpJmhtcC0+dHhfcmluZ1tpXSA/ICc+JyA6ICcgJywKKwkJCQkgICBpLCBobXAtPnR4X3JpbmdbaV0uc3RhdHVzX25fbGVuZ3RoLCBobXAtPnR4X3JpbmdbaV0uYWRkcik7CisJCXByaW50aygiXG4iS0VSTl9ERUJVRyAiICBSeCByaW5nICU4Ljh4OlxuIiwKKwkJCSAgIChpbnQpaG1wLT5yeF9yaW5nX2RtYSk7CisJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAlYyAjJWQgZGVzYy4gJTQuNHggJTguOHhcbiIsCisJCQkJICAgcmVhZGwoaW9hZGRyICsgUnhDdXJQdHIpID09IChsb25nKSZobXAtPnJ4X3JpbmdbaV0gPyAnPicgOiAnICcsCisJCQkJICAgaSwgaG1wLT5yeF9yaW5nW2ldLnN0YXR1c19uX2xlbmd0aCwgaG1wLT5yeF9yaW5nW2ldLmFkZHIpOworCQkJaWYgKGhhbWFjaGlfZGVidWcgPiA2KSB7CisJCQkJaWYgKCoodTgqKWhtcC0+cnhfc2tidWZmW2ldLT50YWlsICE9IDB4NjkpIHsKKwkJCQkJdTE2ICphZGRyID0gKHUxNiAqKQorCQkJCQkJaG1wLT5yeF9za2J1ZmZbaV0tPnRhaWw7CisJCQkJCWludCBqOworCisJCQkJCWZvciAoaiA9IDA7IGogPCAweDUwOyBqKyspCisJCQkJCQlwcmludGsoIiAlNC40eCIsIGFkZHJbal0pOworCQkJCQlwcmludGsoIlxuIik7CisJCQkJfQorCQkJfQorCQl9CisJfQorI2VuZGlmIC8qIF9faTM4Nl9fIGRlYnVnZ2luZyBvbmx5ICovCisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCWRlbF90aW1lcl9zeW5jKCZobXAtPnRpbWVyKTsKKworCS8qIEZyZWUgYWxsIHRoZSBza2J1ZmZzIGluIHRoZSBSeCBxdWV1ZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc2tiID0gaG1wLT5yeF9za2J1ZmZbaV07CisJCWhtcC0+cnhfcmluZ1tpXS5zdGF0dXNfbl9sZW5ndGggPSAwOworCQlobXAtPnJ4X3JpbmdbaV0uYWRkciA9IDB4QkFERjAwRDA7IC8qIEFuIGludmFsaWQgYWRkcmVzcy4gKi8KKwkJaWYgKHNrYikgeworCQkJcGNpX3VubWFwX3NpbmdsZShobXAtPnBjaV9kZXYsIAorCQkJCWhtcC0+cnhfcmluZ1tpXS5hZGRyLCBobXAtPnJ4X2J1Zl9zeiwgCisJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCWhtcC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJc2tiID0gaG1wLT50eF9za2J1ZmZbaV07CisJCWlmIChza2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoaG1wLT5wY2lfZGV2LCAKKwkJCQlobXAtPnR4X3JpbmdbaV0uYWRkciwgc2tiLT5sZW4sIAorCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJaG1wLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQl9CisJfQorCisJd3JpdGViKDB4MDAsIGlvYWRkciArIExFREN0cmwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaGFtYWNoaV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGFtYWNoaV9wcml2YXRlICpobXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gaG1wLT5iYXNlOworCisJLyogV2Ugc2hvdWxkIGxvY2sgdGhpcyBzZWdtZW50IG9mIGNvZGUgZm9yIFNNUCBldmVudHVhbGx5LCBhbHRob3VnaAorCSAgIHRoZSB2dWxuZXJhYmlsaXR5IHdpbmRvdyBpcyB2ZXJ5IHNtYWxsIGFuZCBzdGF0aXN0aWNzIGFyZQorCSAgIG5vbi1jcml0aWNhbC4gKi8KKyAgICAgICAgLyogT2ssIHdoYXQgZ29lcyBoZXJlPyAgVGhpcyBhcHBlYXJzIHRvIGJlIHN0dWNrIGF0IDIxIHBhY2tldHMKKyAgICAgICAgICAgYWNjb3JkaW5nIHRvIGlmY29uZmlnLiAgSXQgZG9lcyBnZXQgaW5jcmVtZW50ZWQgaW4gaGFtYWNoaV90eCgpLAorICAgICAgICAgICBzbyBJIHRoaW5rIEknbGwgY29tbWVudCBpdCBvdXQgaGVyZSBhbmQgc2VlIGlmIGJldHRlciB0aGluZ3MKKyAgICAgICAgICAgaGFwcGVuLgorICAgICAgICAqLyAKKwkvKiBobXAtPnN0YXRzLnR4X3BhY2tldHMJPSByZWFkbChpb2FkZHIgKyAweDAwMCk7ICovCisKKwlobXAtPnN0YXRzLnJ4X2J5dGVzID0gcmVhZGwoaW9hZGRyICsgMHgzMzApOyAvKiBUb3RhbCBVbmkrQnJkK011bHRpICovCisJaG1wLT5zdGF0cy50eF9ieXRlcyA9IHJlYWRsKGlvYWRkciArIDB4M0IwKTsgLyogVG90YWwgVW5pK0JyZCtNdWx0aSAqLworCWhtcC0+c3RhdHMubXVsdGljYXN0CQk9IHJlYWRsKGlvYWRkciArIDB4MzIwKTsgLyogTXVsdGljYXN0IFJ4ICovCisKKwlobXAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMJPSByZWFkbChpb2FkZHIgKyAweDM2OCk7IC8qIE92ZXIrVW5kZXJzaXplZCAqLworCWhtcC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMJPSByZWFkbChpb2FkZHIgKyAweDM1Qyk7IC8qIEphYmJlciAqLworCWhtcC0+c3RhdHMucnhfY3JjX2Vycm9ycwk9IHJlYWRsKGlvYWRkciArIDB4MzYwKTsgLyogSmFiYmVyICovCisJaG1wLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMJPSByZWFkbChpb2FkZHIgKyAweDM2NCk7IC8qIFN5bWJvbCBFcnJzICovCisJaG1wLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzCT0gcmVhZGwoaW9hZGRyICsgMHgzNkMpOyAvKiBEcm9wcGVkICovCisKKwlyZXR1cm4gJmhtcC0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhhbWFjaGlfcHJpdmF0ZSAqaG1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGhtcC0+YmFzZTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsJCQkvKiBTZXQgcHJvbWlzY3VvdXMuICovCisJCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICovCisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CisJCXdyaXRldygweDAwMEYsIGlvYWRkciArIEFkZHJNb2RlKTsKKwl9IGVsc2UgaWYgKChkZXYtPm1jX2NvdW50ID4gNjMpICB8fCAgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCS8qIFRvbyBtYW55IHRvIG1hdGNoLCBvciBhY2NlcHQgYWxsIG11bHRpY2FzdHMuICovCisJCXdyaXRldygweDAwMEIsIGlvYWRkciArIEFkZHJNb2RlKTsKKwl9IGVsc2UgaWYgKGRldi0+bWNfY291bnQgPiAwKSB7IC8qIE11c3QgdXNlIHRoZSBDQU0gZmlsdGVyLiAqLworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwkJaW50IGk7CisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCQkJIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQl3cml0ZWwoKih1MzIqKShtY2xpc3QtPmRtaV9hZGRyKSwgaW9hZGRyICsgMHgxMDAgKyBpKjgpOworCQkJd3JpdGVsKDB4MjAwMDAgfCAoKih1MTYqKSZtY2xpc3QtPmRtaV9hZGRyWzRdKSwKKwkJCQkgICBpb2FkZHIgKyAweDEwNCArIGkqOCk7CisJCX0KKwkJLyogQ2xlYXIgcmVtYWluaW5nIGVudHJpZXMuICovCisJCWZvciAoOyBpIDwgNjQ7IGkrKykKKwkJCXdyaXRlbCgwLCBpb2FkZHIgKyAweDEwNCArIGkqOCk7CisJCXdyaXRldygweDAwMDMsIGlvYWRkciArIEFkZHJNb2RlKTsKKwl9IGVsc2UgewkJCQkJLyogTm9ybWFsLCB1bmljYXN0L2Jyb2FkY2FzdC1vbmx5IG1vZGUuICovCisJCXdyaXRldygweDAwMDEsIGlvYWRkciArIEFkZHJNb2RlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfaWZfcnVubmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGFtYWNoaV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBoYW1hY2hpX3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgaGFtYWNoaV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBoYW1hY2hpX3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJbWlpX2V0aHRvb2xfZ3NldCgmbnAtPm1paV9pZiwgZWNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFtYWNoaV9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBoYW1hY2hpX3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmVzOworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyZXMgPSBtaWlfZXRodG9vbF9zc2V0KCZucC0+bWlpX2lmLCBlY21kKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGhhbWFjaGlfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBoYW1hY2hpX3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbWlpX253YXlfcmVzdGFydCgmbnAtPm1paV9pZik7Cit9CisKK3N0YXRpYyB1MzIgaGFtYWNoaV9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBoYW1hY2hpX3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbWlpX2xpbmtfb2soJm5wLT5taWlfaWYpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzID0geworCS5iZWdpbiA9IGNoZWNrX2lmX3J1bm5pbmcsCisJLmdldF9kcnZpbmZvID0gaGFtYWNoaV9nZXRfZHJ2aW5mbywKKwkuZ2V0X3NldHRpbmdzID0gaGFtYWNoaV9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncyA9IGhhbWFjaGlfc2V0X3NldHRpbmdzLAorCS5ud2F5X3Jlc2V0ID0gaGFtYWNoaV9ud2F5X3Jlc2V0LAorCS5nZXRfbGluayA9IGhhbWFjaGlfZ2V0X2xpbmssCit9OworCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzX25vX21paSA9IHsKKwkuYmVnaW4gPSBjaGVja19pZl9ydW5uaW5nLAorCS5nZXRfZHJ2aW5mbyA9IGhhbWFjaGlfZ2V0X2RydmluZm8sCit9OworCitzdGF0aWMgaW50IG5ldGRldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBoYW1hY2hpX3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkocnEpOworCWludCByYzsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjbWQgPT0gKFNJT0NERVZQUklWQVRFKzMpKSB7IC8qIHNldCByeCx0eCBpbnRyIHBhcmFtcyAqLworCQl1MzIgKmQgPSAodTMyICopJnJxLT5pZnJfaWZydTsKKwkJLyogU2hvdWxkIGFkZCB0aGlzIGNoZWNrIGhlcmUgb3IgYW4gb3JkaW5hcnkgdXNlciBjYW4gZG8gbmFzdHkKKwkJICogdGhpbmdzLiAtS0RVCisJCSAqCisJCSAqIFRPRE86IFNodXQgZG93biB0aGUgUnggYW5kIFR4IGVuZ2luZXMgd2hpbGUgZG9pbmcgdGhpcy4KKwkJICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCXdyaXRlbChkWzBdLCBucC0+YmFzZSArIFR4SW50ckN0cmwpOworCQl3cml0ZWwoZFsxXSwgbnAtPmJhc2UgKyBSeEludHJDdHJsKTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogdHggJTA4eCwgcnggJTA4eCBpbnRyXG4iLCBkZXYtPm5hbWUsCisJCSAgKHUzMikgcmVhZGwobnAtPmJhc2UgKyBUeEludHJDdHJsKSwKKwkJICAodTMyKSByZWFkbChucC0+YmFzZSArIFJ4SW50ckN0cmwpKTsKKwkJcmMgPSAwOworCX0KKworCWVsc2UgeworCQlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJCXJjID0gZ2VuZXJpY19taWlfaW9jdGwoJm5wLT5taWlfaWYsIGRhdGEsIGNtZCwgTlVMTCk7CisJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCX0KKworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgaGFtYWNoaV9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGRldikgeworCQlzdHJ1Y3QgaGFtYWNoaV9wcml2YXRlICpobXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgaG1wLT5yeF9yaW5nLCAKKwkJCWhtcC0+cnhfcmluZ19kbWEpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFRYX1RPVEFMX1NJWkUsIGhtcC0+dHhfcmluZywgCisJCQlobXAtPnR4X3JpbmdfZG1hKTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJaW91bm1hcChobXAtPmJhc2UpOworCQlmcmVlX25ldGRldihkZXYpOworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaGFtYWNoaV9wY2lfdGJsW10gPSB7CisJeyAweDEzMTgsIDB4MDkxMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IDAsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaGFtYWNoaV9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGhhbWFjaGlfZHJpdmVyID0geworCS5uYW1lCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQk9IGhhbWFjaGlfcGNpX3RibCwKKwkucHJvYmUJCT0gaGFtYWNoaV9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGhhbWFjaGlfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBoYW1hY2hpX2luaXQgKHZvaWQpCit7CisvKiB3aGVuIGEgbW9kdWxlLCB0aGlzIGlzIHByaW50ZWQgd2hldGhlciBvciBub3QgZGV2aWNlcyBhcmUgZm91bmQgaW4gcHJvYmUgKi8KKyNpZmRlZiBNT0RVTEUKKwlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaGFtYWNoaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaGFtYWNoaV9leGl0ICh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaGFtYWNoaV9kcml2ZXIpOworfQorCisKK21vZHVsZV9pbml0KGhhbWFjaGlfaW5pdCk7Cittb2R1bGVfZXhpdChoYW1hY2hpX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vNnBhY2suYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvLzZwYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3YjM1MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvLzZwYWNrLmMKQEAgLTAsMCArMSwxMDUxIEBACisvKgorICogNnBhY2suYwlUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSA2cGFjayBwcm90b2NvbCBmb3Iga2VybmVsLWJhc2VkCisgKgkJZGV2aWNlcyBsaWtlIFRUWS4gSXQgaW50ZXJmYWNlcyBiZXR3ZWVuIGEgcmF3IFRUWSBhbmQgdGhlCisgKgkJa2VybmVsJ3MgQVguMjUgcHJvdG9jb2wgbGF5ZXJzLgorICoKKyAqIEF1dGhvcnM6CUFuZHJlYXMgS/Zuc2dlbiA8YWprQGllaGsucnd0aC1hYWNoZW4uZGU+CisgKiAgICAgICAgICAgICAgUmFsZiBCYWVjaGxlIERMNVJCIDxyYWxmQGxpbnV4LW1pcHMub3JnPgorICoKKyAqIFF1aXRlIGEgbG90IG9mIHN0dWZmICJzdG9sZW4iIGJ5IEpvZXJnIFJldXRlciBmcm9tIHNsaXAuYywgd3JpdHRlbiBieQorICoKKyAqCQlMYXVyZW5jZSBDdWxoYW5lLCA8bG96QGhvbG1lcy5kZW1vbi5jby51az4KKyAqCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdXdhbHQubmwubXVnbmV0Lm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxuZXQvYXgyNS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisjZGVmaW5lIFNJWFBBQ0tfVkVSU0lPTiAgICAiUmV2aXNpb246IDAuMy4wIgorCisvKiBzaXhwYWNrIHByaW9yaXR5IGNvbW1hbmRzICovCisjZGVmaW5lIFNJWFBfU0VPRgkJMHg0MAkvKiBzdGFydCBhbmQgZW5kIG9mIGEgNnBhY2sgZnJhbWUgKi8KKyNkZWZpbmUgU0lYUF9UWF9VUlVOCQkweDQ4CS8qIHRyYW5zbWl0IG92ZXJydW4gKi8KKyNkZWZpbmUgU0lYUF9SWF9PUlVOCQkweDUwCS8qIHJlY2VpdmUgb3ZlcnJ1biAqLworI2RlZmluZSBTSVhQX1JYX0JVRl9PVkwJCTB4NTgJLyogcmVjZWl2ZSBidWZmZXIgb3ZlcmZsb3cgKi8KKworI2RlZmluZSBTSVhQX0NIS1NVTQkJMHhGRgkvKiB2YWxpZCBjaGVja3N1bSBvZiBhIDZwYWNrIGZyYW1lICovCisKKy8qIG1hc2tzIHRvIGdldCBjZXJ0YWluIGJpdHMgb3V0IG9mIHRoZSBzdGF0dXMgYnl0ZXMgc2VudCBieSB0aGUgVE5DICovCisKKyNkZWZpbmUgU0lYUF9DTURfTUFTSwkJMHhDMAorI2RlZmluZSBTSVhQX0NITl9NQVNLCQkweDA3CisjZGVmaW5lIFNJWFBfUFJJT19DTURfTUFTSwkweDgwCisjZGVmaW5lIFNJWFBfU1REX0NNRF9NQVNLCTB4NDAKKyNkZWZpbmUgU0lYUF9QUklPX0RBVEFfTUFTSwkweDM4CisjZGVmaW5lIFNJWFBfVFhfTUFTSwkJMHgyMAorI2RlZmluZSBTSVhQX1JYX01BU0sJCTB4MTAKKyNkZWZpbmUgU0lYUF9SWF9EQ0RfTUFTSwkweDE4CisjZGVmaW5lIFNJWFBfTEVEU19PTgkJMHg3OAorI2RlZmluZSBTSVhQX0xFRFNfT0ZGCQkweDYwCisjZGVmaW5lIFNJWFBfQ09OCQkweDA4CisjZGVmaW5lIFNJWFBfU1RBCQkweDEwCisKKyNkZWZpbmUgU0lYUF9GT1VORF9UTkMJCTB4ZTkKKyNkZWZpbmUgU0lYUF9DT05fT04JCTB4NjgKKyNkZWZpbmUgU0lYUF9EQ0RfTUFTSwkJMHgwOAorI2RlZmluZSBTSVhQX0RBTUFfT0ZGCQkwCisKKy8qIGRlZmF1bHQgbGV2ZWwgMiBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFNJWFBfVFhERUxBWQkJCShIWi80KQkvKiBpbiAxIHMgKi8KKyNkZWZpbmUgU0lYUF9QRVJTSVNUCQkJNTAJLyogaW4gMjU2dGhzICovCisjZGVmaW5lIFNJWFBfU0xPVFRJTUUJCQkoSFovMTApCS8qIGluIDEgcyAqLworI2RlZmluZSBTSVhQX0lOSVRfUkVTWU5DX1RJTUVPVVQJKDMqSFovMikgLyogaW4gMSBzICovCisjZGVmaW5lIFNJWFBfUkVTWU5DX1RJTUVPVVQJCTUqSFoJLyogaW4gMSBzICovCisKKy8qIDZwYWNrIGNvbmZpZ3VyYXRpb24uICovCisjZGVmaW5lIFNJWFBfTlJVTklUCQkJMzEgICAgICAvKiBNQVggbnVtYmVyIG9mIDZwYWNrIGNoYW5uZWxzICovCisjZGVmaW5lIFNJWFBfTVRVCQkJMjU2CS8qIERlZmF1bHQgTVRVICovCisKK2VudW0gc2l4cGFja19mbGFncyB7CisJU0lYUEZfRVJST1IsCS8qIFBhcml0eSwgZXRjLiBlcnJvcgkqLworfTsKKworc3RydWN0IHNpeHBhY2sgeworCS8qIFZhcmlvdXMgZmllbGRzLiAqLworCXN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CQkvKiBwdHIgdG8gVFRZIHN0cnVjdHVyZQkqLworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CQkvKiBlYXN5IGZvciBpbnRyIGhhbmRsaW5nICAqLworCisJLyogVGhlc2UgYXJlIHBvaW50ZXJzIHRvIHRoZSBtYWxsb2MoKWVkIGZyYW1lIGJ1ZmZlcnMuICovCisJdW5zaWduZWQgY2hhcgkJKnJidWZmOwkJLyogcmVjZWl2ZXIgYnVmZmVyCSovCisJaW50CQkJcmNvdW50OyAgICAgICAgIC8qIHJlY2VpdmVkIGNoYXJzIGNvdW50ZXIgICovCisJdW5zaWduZWQgY2hhcgkJKnhidWZmOwkJLyogdHJhbnNtaXR0ZXIgYnVmZmVyCSovCisJdW5zaWduZWQgY2hhcgkJKnhoZWFkOyAgICAgICAgIC8qIG5leHQgYnl0ZSB0byBYTUlUICovCisJaW50CQkJeGxlZnQ7ICAgICAgICAgIC8qIGJ5dGVzIGxlZnQgaW4gWE1JVCBxdWV1ZSAgKi8KKworCXVuc2lnbmVkIGNoYXIJCXJhd19idWZbNF07CisJdW5zaWduZWQgY2hhcgkJY29va2VkX2J1Zls0MDBdOworCisJdW5zaWduZWQgaW50CQlyeF9jb3VudDsKKwl1bnNpZ25lZCBpbnQJCXJ4X2NvdW50X2Nvb2tlZDsKKworCS8qIDZwYWNrIGludGVyZmFjZSBzdGF0aXN0aWNzLiAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCisJaW50CQkJbXR1OwkJLyogT3VyIG10dSAodG8gc3BvdCBjaGFuZ2VzISkgKi8KKwlpbnQJCQlidWZmc2l6ZTsgICAgICAgLyogTWF4IGJ1ZmZlcnMgc2l6ZXMgKi8KKworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwkJLyogRmxhZyB2YWx1ZXMvIG1vZGUgZXRjICovCisJdW5zaWduZWQgY2hhcgkJbW9kZTsJCS8qIDZwYWNrIG1vZGUgKi8KKworCS8qIDZwYWNrIHN0dWZmICovCisJdW5zaWduZWQgY2hhcgkJdHhfZGVsYXk7CisJdW5zaWduZWQgY2hhcgkJcGVyc2lzdGVuY2U7CisJdW5zaWduZWQgY2hhcgkJc2xvdHRpbWU7CisJdW5zaWduZWQgY2hhcgkJZHVwbGV4OworCXVuc2lnbmVkIGNoYXIJCWxlZF9zdGF0ZTsKKwl1bnNpZ25lZCBjaGFyCQlzdGF0dXM7CisJdW5zaWduZWQgY2hhcgkJc3RhdHVzMTsKKwl1bnNpZ25lZCBjaGFyCQlzdGF0dXMyOworCXVuc2lnbmVkIGNoYXIJCXR4X2VuYWJsZTsKKwl1bnNpZ25lZCBjaGFyCQl0bmNfc3RhdGU7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0eF90OworCXN0cnVjdCB0aW1lcl9saXN0CXJlc3luY190OworCWF0b21pY190CQlyZWZjbnQ7CisJc3RydWN0IHNlbWFwaG9yZQlkZWFkX3NlbTsKKwlzcGlubG9ja190CQlsb2NrOworfTsKKworI2RlZmluZSBBWDI1XzZQQUNLX0hFQURFUl9MRU4gMAorCitzdGF0aWMgdm9pZCBzcF9zdGFydF90eF90aW1lcihzdHJ1Y3Qgc2l4cGFjayAqKTsKK3N0YXRpYyB2b2lkIHNpeHBhY2tfZGVjb2RlKHN0cnVjdCBzaXhwYWNrICosIHVuc2lnbmVkIGNoYXJbXSwgaW50KTsKK3N0YXRpYyBpbnQgZW5jb2RlX3NpeHBhY2sodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIGludCwgdW5zaWduZWQgY2hhcik7CisKKy8qCisgKiBwZXJmb3JtIHRoZSBwZXJzaXN0ZW5jZS9zbG90dGltZSBhbGdvcml0aG0gZm9yIENTTUEgYWNjZXNzLiBJZiB0aGUKKyAqIHBlcnNpc3RlbmNlIGNoZWNrIHdhcyBzdWNjZXNzZnVsLCB3cml0ZSB0aGUgZGF0YSB0byB0aGUgc2VyaWFsIGRyaXZlci4KKyAqIE5vdGUgdGhhdCBpbiBjYXNlIG9mIERBTUEgb3BlcmF0aW9uLCB0aGUgZGF0YSBpcyBub3Qgc2VudCBoZXJlLgorICovCisKK3N0YXRpYyB2b2lkIHNwX3htaXRfb25fYWlyKHVuc2lnbmVkIGxvbmcgY2hhbm5lbCkKK3sKKwlzdHJ1Y3Qgc2l4cGFjayAqc3AgPSAoc3RydWN0IHNpeHBhY2sgKikgY2hhbm5lbDsKKwlpbnQgYWN0dWFsOworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHJhbmRvbTsKKworCXJhbmRvbSA9IHJhbmRvbSAqIDE3ICsgNDE7CisKKwlpZiAoKChzcC0+c3RhdHVzMSAmIFNJWFBfRENEX01BU0spID09IDApICYmIChyYW5kb20gPCBzcC0+cGVyc2lzdGVuY2UpKSB7CisJCXNwLT5sZWRfc3RhdGUgPSAweDcwOworCQlzcC0+dHR5LT5kcml2ZXItPndyaXRlKHNwLT50dHksICZzcC0+bGVkX3N0YXRlLCAxKTsKKwkJc3AtPnR4X2VuYWJsZSA9IDE7CisJCWFjdHVhbCA9IHNwLT50dHktPmRyaXZlci0+d3JpdGUoc3AtPnR0eSwgc3AtPnhidWZmLCBzcC0+c3RhdHVzMik7CisJCXNwLT54bGVmdCAtPSBhY3R1YWw7CisJCXNwLT54aGVhZCArPSBhY3R1YWw7CisJCXNwLT5sZWRfc3RhdGUgPSAweDYwOworCQlzcC0+dHR5LT5kcml2ZXItPndyaXRlKHNwLT50dHksICZzcC0+bGVkX3N0YXRlLCAxKTsKKwkJc3AtPnN0YXR1czIgPSAwOworCX0gZWxzZQorCQlzcF9zdGFydF90eF90aW1lcihzcCk7Cit9CisKKy8qIC0tLS0+IDZwYWNrIHRpbWVyIGludGVycnVwdCBoYW5kbGVyIGFuZCBmcmllbmRzLiA8LS0tLSAqLworc3RhdGljIHZvaWQgc3Bfc3RhcnRfdHhfdGltZXIoc3RydWN0IHNpeHBhY2sgKnNwKQoreworCWludCB3aGVuID0gc3AtPnNsb3R0aW1lOworCisJZGVsX3RpbWVyKCZzcC0+dHhfdCk7CisJc3AtPnR4X3QuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBzcDsKKwlzcC0+dHhfdC5mdW5jdGlvbiA9IHNwX3htaXRfb25fYWlyOworCXNwLT50eF90LmV4cGlyZXMgPSBqaWZmaWVzICsgKCh3aGVuICsgMSkgKiBIWikgLyAxMDA7CisJYWRkX3RpbWVyKCZzcC0+dHhfdCk7Cit9CisKKy8qIEVuY2Fwc3VsYXRlIG9uZSBBWC4yNSBmcmFtZSBhbmQgc3R1ZmYgaW50byBhIFRUWSBxdWV1ZS4gKi8KK3N0YXRpYyB2b2lkIHNwX2VuY2FwcyhzdHJ1Y3Qgc2l4cGFjayAqc3AsIHVuc2lnbmVkIGNoYXIgKmljcCwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICptc2csICpwID0gaWNwOworCWludCBhY3R1YWwsIGNvdW50OworCisJaWYgKGxlbiA+IHNwLT5tdHUpIHsJLyogc3AtPm10dSA9IEFYMjVfTVRVID0gbWF4LiBQQUNMRU4gPSAyNTYgKi8KKwkJbXNnID0gIm92ZXJzaXplZCB0cmFuc21pdCBwYWNrZXQhIjsKKwkJZ290byBvdXRfZHJvcDsKKwl9CisKKwlpZiAobGVuID4gc3AtPm10dSkgewkvKiBzcC0+bXR1ID0gQVgyNV9NVFUgPSBtYXguIFBBQ0xFTiA9IDI1NiAqLworCQltc2cgPSAib3ZlcnNpemVkIHRyYW5zbWl0IHBhY2tldCEiOworCQlnb3RvIG91dF9kcm9wOworCX0KKworCWlmIChwWzBdID4gNSkgeworCQltc2cgPSAiaW52YWxpZCBLSVNTIGNvbW1hbmQiOworCQlnb3RvIG91dF9kcm9wOworCX0KKworCWlmICgocFswXSAhPSAwKSAmJiAobGVuID4gMikpIHsKKwkJbXNnID0gIktJU1MgY29udHJvbCBwYWNrZXQgdG9vIGxvbmciOworCQlnb3RvIG91dF9kcm9wOworCX0KKworCWlmICgocFswXSA9PSAwKSAmJiAobGVuIDwgMTUpKSB7CisJCW1zZyA9ICJiYWQgQVguMjUgcGFja2V0IHRvIHRyYW5zbWl0IjsKKwkJZ290byBvdXRfZHJvcDsKKwl9CisKKwljb3VudCA9IGVuY29kZV9zaXhwYWNrKHAsIHNwLT54YnVmZiwgbGVuLCBzcC0+dHhfZGVsYXkpOworCXNldF9iaXQoVFRZX0RPX1dSSVRFX1dBS0VVUCwgJnNwLT50dHktPmZsYWdzKTsKKworCXN3aXRjaCAocFswXSkgeworCWNhc2UgMToJc3AtPnR4X2RlbGF5ID0gcFsxXTsKKwkJcmV0dXJuOworCWNhc2UgMjoJc3AtPnBlcnNpc3RlbmNlID0gcFsxXTsKKwkJcmV0dXJuOworCWNhc2UgMzoJc3AtPnNsb3R0aW1lID0gcFsxXTsKKwkJcmV0dXJuOworCWNhc2UgNDoJLyogaWdub3JlZCAqLworCQlyZXR1cm47CisJY2FzZSA1OglzcC0+ZHVwbGV4ID0gcFsxXTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwWzBdICE9IDApCisJCXJldHVybjsKKworCS8qCisJICogSW4gY2FzZSBvZiBmdWxsZHVwbGV4IG9yIERBTUEgb3BlcmF0aW9uLCB3ZSBkb24ndCB0YWtlIGNhcmUgYWJvdXQgdGhlCisJICogc3RhdGUgb2YgdGhlIERDRCBvciBvZiBhbnkgdGltZXJzLCBhcyB0aGUgZGV0ZXJtaW5hdGlvbiBvZiB0aGUKKwkgKiBjb3JyZWN0IHRpbWUgdG8gc2VuZCBpcyB0aGUgam9iIG9mIHRoZSBBWC4yNSBsYXllci4gV2Ugc2VuZAorCSAqIGltbWVkaWF0ZWx5IGFmdGVyIGRhdGEgaGFzIGFycml2ZWQuCisJICovCisJaWYgKHNwLT5kdXBsZXggPT0gMSkgeworCQlzcC0+bGVkX3N0YXRlID0gMHg3MDsKKwkJc3AtPnR0eS0+ZHJpdmVyLT53cml0ZShzcC0+dHR5LCAmc3AtPmxlZF9zdGF0ZSwgMSk7CisJCXNwLT50eF9lbmFibGUgPSAxOworCQlhY3R1YWwgPSBzcC0+dHR5LT5kcml2ZXItPndyaXRlKHNwLT50dHksIHNwLT54YnVmZiwgY291bnQpOworCQlzcC0+eGxlZnQgPSBjb3VudCAtIGFjdHVhbDsKKwkJc3AtPnhoZWFkID0gc3AtPnhidWZmICsgYWN0dWFsOworCQlzcC0+bGVkX3N0YXRlID0gMHg2MDsKKwkJc3AtPnR0eS0+ZHJpdmVyLT53cml0ZShzcC0+dHR5LCAmc3AtPmxlZF9zdGF0ZSwgMSk7CisJfSBlbHNlIHsKKwkJc3AtPnhsZWZ0ID0gY291bnQ7CisJCXNwLT54aGVhZCA9IHNwLT54YnVmZjsKKwkJc3AtPnN0YXR1czIgPSBjb3VudDsKKwkJaWYgKHNwLT5kdXBsZXggPT0gMCkKKwkJCXNwX3N0YXJ0X3R4X3RpbWVyKHNwKTsKKwl9CisKKwlyZXR1cm47CisKK291dF9kcm9wOgorCXNwLT5zdGF0cy50eF9kcm9wcGVkKys7CisJbmV0aWZfc3RhcnRfcXVldWUoc3AtPmRldik7CisJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcyAtIGRyb3BwZWQuXG4iLCBzcC0+ZGV2LT5uYW1lLCBtc2cpOworfQorCisvKiBFbmNhcHN1bGF0ZSBhbiBJUCBkYXRhZ3JhbSBhbmQga2ljayBpdCBpbnRvIGEgVFRZIHF1ZXVlLiAqLworCitzdGF0aWMgaW50IHNwX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2l4cGFjayAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2JoKCZzcC0+bG9jayk7CisJLyogV2Ugd2VyZSBub3QgYnVzeSwgc28gd2UgYXJlIG5vdy4uLiA6LSkgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJc3AtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCXNwX2VuY2FwcyhzcCwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJc3Bpbl91bmxvY2tfYmgoJnNwLT5sb2NrKTsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNwX29wZW5fZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNpeHBhY2sgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChzcC0+dHR5ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiAwOworfQorCisvKiBDbG9zZSB0aGUgbG93LWxldmVsIHBhcnQgb2YgdGhlIDZwYWNrIGNoYW5uZWwuICovCitzdGF0aWMgaW50IHNwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNpeHBhY2sgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19iaCgmc3AtPmxvY2spOworCWlmIChzcC0+dHR5KSB7CisJCS8qIFRUWSBkaXNjaXBsaW5lIGlzIHJ1bm5pbmcuICovCisJCWNsZWFyX2JpdChUVFlfRE9fV1JJVEVfV0FLRVVQLCAmc3AtPnR0eS0+ZmxhZ3MpOworCX0KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJc3Bpbl91bmxvY2tfYmgoJnNwLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKiBSZXR1cm4gdGhlIGZyYW1lIHR5cGUgSUQgKi8KK3N0YXRpYyBpbnQgc3BfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdW5zaWduZWQgc2hvcnQgdHlwZSwgdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pCit7CisjaWZkZWYgQ09ORklHX0lORVQKKwlpZiAodHlwZSAhPSBodG9ucyhFVEhfUF9BWDI1KSkKKwkJcmV0dXJuIGF4MjVfZW5jYXBzdWxhdGUoc2tiLCBkZXYsIHR5cGUsIGRhZGRyLCBzYWRkciwgbGVuKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzaXhwYWNrICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuICZzcC0+c3RhdHM7Cit9CisKK3N0YXRpYyBpbnQgc3Bfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisJc3RydWN0IHNvY2thZGRyX2F4MjUgKnNhID0gYWRkcjsKKworCWlmIChzYS0+c2F4MjVfZmFtaWx5ICE9IEFGX0FYMjUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFzYS0+c2F4MjVfbmRpZ2lzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnEoJmRldi0+eG1pdF9sb2NrKTsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgJnNhLT5zYXgyNV9jYWxsLCBBWDI1X0FERFJfTEVOKTsKKwlzcGluX3VubG9ja19pcnEoJmRldi0+eG1pdF9sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNwX3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisjaWZkZWYgQ09ORklHX0lORVQKKwlyZXR1cm4gYXgyNV9yZWJ1aWxkX2hlYWRlcihza2IpOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBzcF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0YXRpYyBjaGFyIGF4MjVfYmNhc3RbQVgyNV9BRERSX0xFTl0gPQorCQl7J1EnPDwxLCdTJzw8MSwnVCc8PDEsJyAnPDwxLCcgJzw8MSwnICc8PDEsJzAnPDwxfTsKKwlzdGF0aWMgY2hhciBheDI1X3Rlc3RbQVgyNV9BRERSX0xFTl0gPQorCQl7J0wnPDwxLCdJJzw8MSwnTic8PDEsJ1UnPDwxLCdYJzw8MSwnICc8PDEsJzEnPDwxfTsKKworCS8qIEZpbmlzaCBzZXR0aW5nIHVwIHRoZSBERVZJQ0UgaW5mby4gKi8KKwlkZXYtPm10dQkJPSBTSVhQX01UVTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHNwX3htaXQ7CisJZGV2LT5vcGVuCQk9IHNwX29wZW5fZGV2OworCWRldi0+ZGVzdHJ1Y3RvcgkJPSBmcmVlX25ldGRldjsKKwlkZXYtPnN0b3AJCT0gc3BfY2xvc2U7CisJZGV2LT5oYXJkX2hlYWRlcgk9IHNwX2hlYWRlcjsKKwlkZXYtPmdldF9zdGF0cwkgICAgICAgID0gc3BfZ2V0X3N0YXRzOworCWRldi0+c2V0X21hY19hZGRyZXNzICAgID0gc3Bfc2V0X21hY19hZGRyZXNzOworCWRldi0+aGFyZF9oZWFkZXJfbGVuCT0gQVgyNV9NQVhfSEVBREVSX0xFTjsKKwlkZXYtPmFkZHJfbGVuCQk9IEFYMjVfQUREUl9MRU47CisJZGV2LT50eXBlCQk9IEFSUEhSRF9BWDI1OworCWRldi0+dHhfcXVldWVfbGVuCT0gMTA7CisJZGV2LT5yZWJ1aWxkX2hlYWRlcgk9IHNwX3JlYnVpbGRfaGVhZGVyOworCWRldi0+dHhfdGltZW91dAkJPSBOVUxMOworCisJLyogT25seSBhY3RpdmF0ZWQgaW4gQVguMjUgbW9kZSAqLworCW1lbWNweShkZXYtPmJyb2FkY2FzdCwgYXgyNV9iY2FzdCwgQVgyNV9BRERSX0xFTik7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGF4MjVfdGVzdCwgQVgyNV9BRERSX0xFTik7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlkZXYtPmZsYWdzCQk9IDA7Cit9CisKKy8qIFNlbmQgb25lIGNvbXBsZXRlbHkgZGVjYXBzdWxhdGVkIElQIGRhdGFncmFtIHRvIHRoZSBJUCBsYXllci4gKi8KKworLyoKKyAqIFRoaXMgaXMgdGhlIHJvdXRpbmUgdGhhdCBzZW5kcyB0aGUgcmVjZWl2ZWQgZGF0YSB0byB0aGUga2VybmVsIEFYLjI1LgorICogJ2NtZCcgaXMgdGhlIEtJU1MgY29tbWFuZC4gRm9yIEFYLjI1IGRhdGEsIGl0IGlzIHplcm8uCisgKi8KKworc3RhdGljIHZvaWQgc3BfYnVtcChzdHJ1Y3Qgc2l4cGFjayAqc3AsIGNoYXIgY21kKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKworCWNvdW50ID0gc3AtPnJjb3VudCArIDE7CisKKwlzcC0+c3RhdHMucnhfYnl0ZXMgKz0gY291bnQ7CisKKwlpZiAoKHNrYiA9IGRldl9hbGxvY19za2IoY291bnQpKSA9PSBOVUxMKQorCQlnb3RvIG91dF9tZW07CisKKwlza2ItPmRldiA9IHNwLT5kZXY7CisJcHRyID0gc2tiX3B1dChza2IsIGNvdW50KTsKKwkqcHRyKysgPSBjbWQ7CS8qIEtJU1MgY29tbWFuZCAqLworCisJbWVtY3B5KHB0ciwgc3AtPmNvb2tlZF9idWYgKyAxLCBjb3VudCk7CisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9BWDI1KTsKKwluZXRpZl9yeChza2IpOworCXNwLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCXNwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisKKwlyZXR1cm47CisKK291dF9tZW06CisJc3AtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogV2UgaGF2ZSBhIHBvdGVudGlhbCByYWNlIG9uIGRlcmVmZXJlbmNpbmcgdHR5LT5kaXNjX2RhdGEsIGJlY2F1c2UgdGhlIHR0eQorICogbGF5ZXIgcHJvdmlkZXMgbm8gbG9ja2luZyBhdCBhbGwgLSB0aHVzIG9uZSBjcHUgY291bGQgYmUgcnVubmluZworICogc2l4cGFja19yZWNlaXZlX2J1ZiB3aGlsZSBhbm90aGVyIGNhbGxzIHNpeHBhY2tfY2xvc2UsIHdoaWNoIHplcm9lcworICogdHR5LT5kaXNjX2RhdGEgYW5kIGZyZWVzIHRoZSBtZW1vcnkgdGhhdCBzaXhwYWNrX3JlY2VpdmVfYnVmIGlzIHVzaW5nLiAgVGhlCisgKiBiZXN0IHdheSB0byBmaXggdGhpcyBpcyB0byB1c2UgYSByd2xvY2sgaW4gdGhlIHR0eSBzdHJ1Y3QsIGJ1dCBmb3Igbm93IHdlCisgKiB1c2UgYSBzaW5nbGUgZ2xvYmFsIHJ3bG9jayBmb3IgYWxsIHR0eXMgaW4gcHBwIGxpbmUgZGlzY2lwbGluZS4KKyAqLworc3RhdGljIERFRklORV9SV0xPQ0soZGlzY19kYXRhX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3N0YXRpYyBzdHJ1Y3Qgc2l4cGFjayAqc3BfZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHNpeHBhY2sgKnNwOworCisJcmVhZF9sb2NrKCZkaXNjX2RhdGFfbG9jayk7CisJc3AgPSB0dHktPmRpc2NfZGF0YTsKKwlpZiAoc3ApCisJCWF0b21pY19pbmMoJnNwLT5yZWZjbnQpOworCXJlYWRfdW5sb2NrKCZkaXNjX2RhdGFfbG9jayk7CisKKwlyZXR1cm4gc3A7Cit9CisKK3N0YXRpYyB2b2lkIHNwX3B1dChzdHJ1Y3Qgc2l4cGFjayAqc3ApCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnNwLT5yZWZjbnQpKQorCQl1cCgmc3AtPmRlYWRfc2VtKTsKK30KKworLyoKKyAqIENhbGxlZCBieSB0aGUgVFRZIGRyaXZlciB3aGVuIHRoZXJlJ3Mgcm9vbSBmb3IgbW9yZSBkYXRhLiAgSWYgd2UgaGF2ZQorICogbW9yZSBwYWNrZXRzIHRvIHNlbmQsIHdlIHNlbmQgdGhlbSBoZXJlLgorICovCitzdGF0aWMgdm9pZCBzaXhwYWNrX3dyaXRlX3dha2V1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzaXhwYWNrICpzcCA9IHNwX2dldCh0dHkpOworCWludCBhY3R1YWw7CisKKwlpZiAoIXNwKQorCQlyZXR1cm47CisJaWYgKHNwLT54bGVmdCA8PSAwKSAgeworCQkvKiBOb3cgc2VyaWFsIGJ1ZmZlciBpcyBhbG1vc3QgZnJlZSAmIHdlIGNhbiBzdGFydAorCQkgKiB0cmFuc21pc3Npb24gb2YgYW5vdGhlciBwYWNrZXQgKi8KKwkJc3AtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJY2xlYXJfYml0KFRUWV9ET19XUklURV9XQUtFVVAsICZ0dHktPmZsYWdzKTsKKwkJc3AtPnR4X2VuYWJsZSA9IDA7CisJCW5ldGlmX3dha2VfcXVldWUoc3AtPmRldik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChzcC0+dHhfZW5hYmxlKSB7CisJCWFjdHVhbCA9IHR0eS0+ZHJpdmVyLT53cml0ZSh0dHksIHNwLT54aGVhZCwgc3AtPnhsZWZ0KTsKKwkJc3AtPnhsZWZ0IC09IGFjdHVhbDsKKwkJc3AtPnhoZWFkICs9IGFjdHVhbDsKKwl9CisKK291dDoKKwlzcF9wdXQoc3ApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHNpeHBhY2tfcmVjZWl2ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmV0dXJuIDY1NTM2OyAgLyogV2UgY2FuIGhhbmRsZSBhbiBpbmZpbml0ZSBhbW91bnQgb2YgZGF0YS4gOi0pICovCit9CisKKy8qCisgKiBIYW5kbGUgdGhlICdyZWNlaXZlciBkYXRhIHJlYWR5JyBpbnRlcnJ1cHQuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgJ3R0eV9pbycgbW9kdWxlIGluIHRoZSBrZXJuZWwgd2hlbgorICogYSBibG9jayBvZiA2cGFjayBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkLCB3aGljaCBjYW4gbm93IGJlIGRlY2Fwc3VsYXRlZAorICogYW5kIHNlbnQgb24gdG8gc29tZSBJUCBsYXllciBmb3IgZnVydGhlciBwcm9jZXNzaW5nLgorICovCitzdGF0aWMgdm9pZCBzaXhwYWNrX3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJY29uc3QgdW5zaWduZWQgY2hhciAqY3AsIGNoYXIgKmZwLCBpbnQgY291bnQpCit7CisJc3RydWN0IHNpeHBhY2sgKnNwOworCXVuc2lnbmVkIGNoYXIgYnVmWzUxMl07CisJaW50IGNvdW50MTsKKworCWlmICghY291bnQpCisJCXJldHVybjsKKworCXNwID0gc3BfZ2V0KHR0eSk7CisJaWYgKCFzcCkKKwkJcmV0dXJuOworCisJbWVtY3B5KGJ1ZiwgY3AsIGNvdW50IDwgc2l6ZW9mKGJ1ZikgPyBjb3VudCA6IHNpemVvZihidWYpKTsKKworCS8qIFJlYWQgdGhlIGNoYXJhY3RlcnMgb3V0IG9mIHRoZSBidWZmZXIgKi8KKworCWNvdW50MSA9IGNvdW50OworCXdoaWxlIChjb3VudCkgeworCQljb3VudC0tOworCQlpZiAoZnAgJiYgKmZwKyspIHsKKwkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChTSVhQRl9FUlJPUiwgJnNwLT5mbGFncykpCisJCQkJc3AtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJY29udGludWU7CisJCX0KKwl9CisJc2l4cGFja19kZWNvZGUoc3AsIGJ1ZiwgY291bnQxKTsKKworCXNwX3B1dChzcCk7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncykKKwkgICAgJiYgdHR5LT5kcml2ZXItPnVudGhyb3R0bGUpCisJCXR0eS0+ZHJpdmVyLT51bnRocm90dGxlKHR0eSk7Cit9CisKKy8qCisgKiBUcnkgdG8gcmVzeW5jIHRoZSBUTkMuIENhbGxlZCBieSB0aGUgcmVzeW5jIHRpbWVyIGRlZmluZWQgaW4KKyAqIGRlY29kZV9wcmlvX2NvbW1hbmQKKyAqLworCisjZGVmaW5lIFROQ19VTklOSVRJQUxJWkVECTAKKyNkZWZpbmUgVE5DX1VOU1lOQ19TVEFSVFVQCTEKKyNkZWZpbmUgVE5DX1VOU1lOQ0VECQkyCisjZGVmaW5lIFROQ19JTl9TWU5DCQkzCisKK3N0YXRpYyB2b2lkIF9fdG5jX3NldF9zeW5jX3N0YXRlKHN0cnVjdCBzaXhwYWNrICpzcCwgaW50IG5ld190bmNfc3RhdGUpCit7CisJY2hhciAqbXNnOworCisJc3dpdGNoIChuZXdfdG5jX3N0YXRlKSB7CisJZGVmYXVsdDoJCQkvKiBnY2Mgb2ggcGllY2Utby1jcmFwIC4uLiAqLworCWNhc2UgVE5DX1VOU1lOQ19TVEFSVFVQOgorCQltc2cgPSAiU3luY2hyb25pemluZyB3aXRoIFROQyI7CisJCWJyZWFrOworCWNhc2UgVE5DX1VOU1lOQ0VEOgorCQltc2cgPSAiTG9zdCBzeW5jaHJvbml6YXRpb24gd2l0aCBUTkNcbiI7CisJCWJyZWFrOworCWNhc2UgVE5DX0lOX1NZTkM6CisJCW1zZyA9ICJGb3VuZCBUTkMiOworCQlicmVhazsKKwl9CisKKwlzcC0+dG5jX3N0YXRlID0gbmV3X3RuY19zdGF0ZTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXNcbiIsIHNwLT5kZXYtPm5hbWUsIG1zZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0bmNfc2V0X3N5bmNfc3RhdGUoc3RydWN0IHNpeHBhY2sgKnNwLCBpbnQgbmV3X3RuY19zdGF0ZSkKK3sKKwlpbnQgb2xkX3RuY19zdGF0ZSA9IHNwLT50bmNfc3RhdGU7CisKKwlpZiAob2xkX3RuY19zdGF0ZSAhPSBuZXdfdG5jX3N0YXRlKQorCQlfX3RuY19zZXRfc3luY19zdGF0ZShzcCwgbmV3X3RuY19zdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlc3luY190bmModW5zaWduZWQgbG9uZyBjaGFubmVsKQoreworCXN0cnVjdCBzaXhwYWNrICpzcCA9IChzdHJ1Y3Qgc2l4cGFjayAqKSBjaGFubmVsOworCXN0YXRpYyBjaGFyIHJlc3luY19jbWQgPSAweGU4OworCisJLyogY2xlYXIgYW55IGRhdGEgdGhhdCBtaWdodCBoYXZlIGJlZW4gcmVjZWl2ZWQgKi8KKworCXNwLT5yeF9jb3VudCA9IDA7CisJc3AtPnJ4X2NvdW50X2Nvb2tlZCA9IDA7CisKKwkvKiByZXNldCBzdGF0ZSBtYWNoaW5lICovCisKKwlzcC0+c3RhdHVzID0gMTsKKwlzcC0+c3RhdHVzMSA9IDE7CisJc3AtPnN0YXR1czIgPSAwOworCisJLyogcmVzeW5jIHRoZSBUTkMgKi8KKworCXNwLT5sZWRfc3RhdGUgPSAweDYwOworCXNwLT50dHktPmRyaXZlci0+d3JpdGUoc3AtPnR0eSwgJnNwLT5sZWRfc3RhdGUsIDEpOworCXNwLT50dHktPmRyaXZlci0+d3JpdGUoc3AtPnR0eSwgJnJlc3luY19jbWQsIDEpOworCisKKwkvKiBTdGFydCByZXN5bmMgdGltZXIgYWdhaW4gLS0gdGhlIFROQyBtaWdodCBiZSBzdGlsbCBhYnNlbnQgKi8KKworCWRlbF90aW1lcigmc3AtPnJlc3luY190KTsKKwlzcC0+cmVzeW5jX3QuZGF0YQk9ICh1bnNpZ25lZCBsb25nKSBzcDsKKwlzcC0+cmVzeW5jX3QuZnVuY3Rpb24JPSByZXN5bmNfdG5jOworCXNwLT5yZXN5bmNfdC5leHBpcmVzCT0gamlmZmllcyArIFNJWFBfUkVTWU5DX1RJTUVPVVQ7CisJYWRkX3RpbWVyKCZzcC0+cmVzeW5jX3QpOworfQorCitzdGF0aWMgaW5saW5lIGludCB0bmNfaW5pdChzdHJ1Y3Qgc2l4cGFjayAqc3ApCit7CisJdW5zaWduZWQgY2hhciBpbmJ5dGUgPSAweGU4OworCisJdG5jX3NldF9zeW5jX3N0YXRlKHNwLCBUTkNfVU5TWU5DX1NUQVJUVVApOworCisJc3AtPnR0eS0+ZHJpdmVyLT53cml0ZShzcC0+dHR5LCAmaW5ieXRlLCAxKTsKKworCWRlbF90aW1lcigmc3AtPnJlc3luY190KTsKKwlzcC0+cmVzeW5jX3QuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBzcDsKKwlzcC0+cmVzeW5jX3QuZnVuY3Rpb24gPSByZXN5bmNfdG5jOworCXNwLT5yZXN5bmNfdC5leHBpcmVzID0gamlmZmllcyArIFNJWFBfUkVTWU5DX1RJTUVPVVQ7CisJYWRkX3RpbWVyKCZzcC0+cmVzeW5jX3QpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBPcGVuIHRoZSBoaWdoLWxldmVsIHBhcnQgb2YgdGhlIDZwYWNrIGNoYW5uZWwuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgVFRZIG1vZHVsZSB3aGVuIHRoZQorICogNnBhY2sgbGluZSBkaXNjaXBsaW5lIGlzIGNhbGxlZCBmb3IuICBCZWNhdXNlIHdlIGFyZQorICogc3VyZSB0aGUgdHR5IGxpbmUgZXhpc3RzLCB3ZSBvbmx5IGhhdmUgdG8gbGluayBpdCB0bworICogYSBmcmVlIDZwY2FjayBjaGFubmVsLi4uCisgKi8KK3N0YXRpYyBpbnQgc2l4cGFja19vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJY2hhciAqcmJ1ZmYgPSBOVUxMLCAqeGJ1ZmYgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHNpeHBhY2sgKnNwOworCXVuc2lnbmVkIGxvbmcgbGVuOworCWludCBlcnIgPSAwOworCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3Qgc2l4cGFjayksICJzcCVkIiwgc3Bfc2V0dXApOworCWlmICghZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzcC0+ZGV2ID0gZGV2OworCisJc3Bpbl9sb2NrX2luaXQoJnNwLT5sb2NrKTsKKwlhdG9taWNfc2V0KCZzcC0+cmVmY250LCAxKTsKKwlpbml0X01VVEVYX0xPQ0tFRCgmc3AtPmRlYWRfc2VtKTsKKworCS8qICEhISBsZW5ndGggb2YgdGhlIGJ1ZmZlcnMuIE1UVSBpcyBJUCBNVFUsIG5vdCBQQUNMRU4hICAqLworCisJbGVuID0gZGV2LT5tdHUgKiAyOworCisJcmJ1ZmYgPSBrbWFsbG9jKGxlbiArIDQsIEdGUF9LRVJORUwpOworCXhidWZmID0ga21hbGxvYyhsZW4gKyA0LCBHRlBfS0VSTkVMKTsKKworCWlmIChyYnVmZiA9PSBOVUxMIHx8IHhidWZmID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT0JVRlM7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJc3Bpbl9sb2NrX2JoKCZzcC0+bG9jayk7CisKKwlzcC0+dHR5ID0gdHR5OworCisJc3AtPnJidWZmCT0gcmJ1ZmY7CisJc3AtPnhidWZmCT0geGJ1ZmY7CisKKwlzcC0+bXR1CQk9IEFYMjVfTVRVICsgNzM7CisJc3AtPmJ1ZmZzaXplCT0gbGVuOworCXNwLT5yY291bnQJPSAwOworCXNwLT5yeF9jb3VudAk9IDA7CisJc3AtPnJ4X2NvdW50X2Nvb2tlZCA9IDA7CisJc3AtPnhsZWZ0CT0gMDsKKworCXNwLT5mbGFncwk9IDA7CQkvKiBDbGVhciBFU0NBUEUgJiBFUlJPUiBmbGFncyAqLworCisJc3AtPmR1cGxleAk9IDA7CisJc3AtPnR4X2RlbGF5ICAgID0gU0lYUF9UWERFTEFZOworCXNwLT5wZXJzaXN0ZW5jZSA9IFNJWFBfUEVSU0lTVDsKKwlzcC0+c2xvdHRpbWUgICAgPSBTSVhQX1NMT1RUSU1FOworCXNwLT5sZWRfc3RhdGUgICA9IDB4NjA7CisJc3AtPnN0YXR1cyAgICAgID0gMTsKKwlzcC0+c3RhdHVzMSAgICAgPSAxOworCXNwLT5zdGF0dXMyICAgICA9IDA7CisJc3AtPnR4X2VuYWJsZSAgID0gMDsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlpbml0X3RpbWVyKCZzcC0+dHhfdCk7CisJaW5pdF90aW1lcigmc3AtPnJlc3luY190KTsKKworCXNwaW5fdW5sb2NrX2JoKCZzcC0+bG9jayk7CisKKwkvKiBEb25lLiAgV2UgaGF2ZSBsaW5rZWQgdGhlIFRUWSBsaW5lIHRvIGEgY2hhbm5lbC4gKi8KKwl0dHktPmRpc2NfZGF0YSA9IHNwOworCisJLyogTm93IHdlJ3JlIHJlYWR5IHRvIHJlZ2lzdGVyLiAqLworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkKKwkJZ290byBvdXRfZnJlZTsKKworCXRuY19pbml0KHNwKTsKKworCXJldHVybiAwOworCitvdXRfZnJlZToKKwlrZnJlZSh4YnVmZik7CisJa2ZyZWUocmJ1ZmYpOworCisJaWYgKGRldikKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKworLyoKKyAqIENsb3NlIGRvd24gYSA2cGFjayBjaGFubmVsLgorICogVGhpcyBtZWFucyBmbHVzaGluZyBvdXQgYW55IHBlbmRpbmcgcXVldWVzLCBhbmQgdGhlbiByZXN0b3JpbmcgdGhlCisgKiBUVFkgbGluZSBkaXNjaXBsaW5lIHRvIHdoYXQgaXQgd2FzIGJlZm9yZSBpdCBnb3QgaG9va2VkIHRvIDZwYWNrCisgKiAod2hpY2ggdXN1YWxseSBpcyBUVFkgYWdhaW4pLgorICovCitzdGF0aWMgdm9pZCBzaXhwYWNrX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHNpeHBhY2sgKnNwOworCisJd3JpdGVfbG9jaygmZGlzY19kYXRhX2xvY2spOworCXNwID0gdHR5LT5kaXNjX2RhdGE7CisJdHR5LT5kaXNjX2RhdGEgPSBOVUxMOworCXdyaXRlX3VubG9jaygmZGlzY19kYXRhX2xvY2spOworCWlmIChzcCA9PSAwKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFdlIGhhdmUgbm93IGVuc3VyZWQgdGhhdCBub2JvZHkgY2FuIHN0YXJ0IHVzaW5nIGFwIGZyb20gbm93IG9uLCBidXQKKwkgKiB3ZSBoYXZlIHRvIHdhaXQgZm9yIGFsbCBleGlzdGluZyB1c2VycyB0byBmaW5pc2guCisJICovCisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZzcC0+cmVmY250KSkKKwkJZG93bigmc3AtPmRlYWRfc2VtKTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KHNwLT5kZXYpOworCisJZGVsX3RpbWVyKCZzcC0+dHhfdCk7CisJZGVsX3RpbWVyKCZzcC0+cmVzeW5jX3QpOworCisJLyogRnJlZSBhbGwgNnBhY2sgZnJhbWUgYnVmZmVycy4gKi8KKwlrZnJlZShzcC0+cmJ1ZmYpOworCWtmcmVlKHNwLT54YnVmZik7Cit9CisKKy8qIFBlcmZvcm0gSS9PIGNvbnRyb2wgb24gYW4gYWN0aXZlIDZwYWNrIGNoYW5uZWwuICovCitzdGF0aWMgaW50IHNpeHBhY2tfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHNpeHBhY2sgKnNwID0gc3BfZ2V0KHR0eSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNwLT5kZXY7CisJdW5zaWduZWQgaW50IHRtcCwgZXJyOworCisJaWYgKCFzcCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIFNJT0NHSUZOQU1FOgorCQllcnIgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopIGFyZywgZGV2LT5uYW1lLAorCQkgICAgICAgICAgICAgICAgICAgc3RybGVuKGRldi0+bmFtZSkgKyAxKSA/IC1FRkFVTFQgOiAwOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dJRkVOQ0FQOgorCQllcnIgPSBwdXRfdXNlcigwLCAoaW50IF9fdXNlciAqKSBhcmcpOworCQlicmVhazsKKworCWNhc2UgU0lPQ1NJRkVOQ0FQOgorCQlpZiAoZ2V0X3VzZXIodG1wLCAoaW50IF9fdXNlciAqKSBhcmcpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlzcC0+bW9kZSA9IHRtcDsKKwkJZGV2LT5hZGRyX2xlbiAgICAgICAgPSBBWDI1X0FERFJfTEVOOworCQlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IEFYMjVfS0lTU19IRUFERVJfTEVOICsKKwkJICAgICAgICAgICAgICAgICAgICAgICBBWDI1X01BWF9IRUFERVJfTEVOICsgMzsKKwkJZGV2LT50eXBlICAgICAgICAgICAgPSBBUlBIUkRfQVgyNTsKKworCQllcnIgPSAwOworCQlicmVhazsKKworCSBjYXNlIFNJT0NTSUZIV0FERFI6IHsKKwkJY2hhciBhZGRyW0FYMjVfQUREUl9MRU5dOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmYWRkciwKKwkJICAgICAgICAgICAgICAgICAgICh2b2lkIF9fdXNlciAqKSBhcmcsIEFYMjVfQUREUl9MRU4pKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlzcGluX2xvY2tfaXJxKCZkZXYtPnhtaXRfbG9jayk7CisJCW1lbWNweShkZXYtPmRldl9hZGRyLCAmYWRkciwgQVgyNV9BRERSX0xFTik7CisJCXNwaW5fdW5sb2NrX2lycSgmZGV2LT54bWl0X2xvY2spOworCisJCWVyciA9IDA7CisJCWJyZWFrOworCX0KKworCS8qIEFsbG93IHN0dHkgdG8gcmVhZCwgYnV0IG5vdCBzZXQsIHRoZSBzZXJpYWwgcG9ydCAqLworCWNhc2UgVENHRVRTOgorCWNhc2UgVENHRVRBOgorCQllcnIgPSBuX3R0eV9pb2N0bCh0dHksIChzdHJ1Y3QgZmlsZSAqKSBmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT0lPQ1RMQ01EOworCX0KKworCXNwX3B1dChzcCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IHR0eV9sZGlzYyBzcF9sZGlzYyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm1hZ2ljCQk9IFRUWV9MRElTQ19NQUdJQywKKwkubmFtZQkJPSAiNnBhY2siLAorCS5vcGVuCQk9IHNpeHBhY2tfb3BlbiwKKwkuY2xvc2UJCT0gc2l4cGFja19jbG9zZSwKKwkuaW9jdGwJCT0gc2l4cGFja19pb2N0bCwKKwkucmVjZWl2ZV9idWYJPSBzaXhwYWNrX3JlY2VpdmVfYnVmLAorCS5yZWNlaXZlX3Jvb20JPSBzaXhwYWNrX3JlY2VpdmVfcm9vbSwKKwkud3JpdGVfd2FrZXVwCT0gc2l4cGFja193cml0ZV93YWtldXAsCit9OworCisvKiBJbml0aWFsaXplIDZwYWNrIGNvbnRyb2wgZGV2aWNlIC0tIHJlZ2lzdGVyIDZwYWNrIGxpbmUgZGlzY2lwbGluZSAqLworCitzdGF0aWMgY2hhciBtc2dfYmFubmVyW10gIF9faW5pdGRhdGEgPSBLRVJOX0lORk8gXAorCSJBWC4yNTogNnBhY2sgZHJpdmVyLCAiIFNJWFBBQ0tfVkVSU0lPTiAiXG4iOworc3RhdGljIGNoYXIgbXNnX3JlZ2ZhaWxbXSBfX2luaXRkYXRhID0gS0VSTl9FUlIgIFwKKwkiNnBhY2s6IGNhbid0IHJlZ2lzdGVyIGxpbmUgZGlzY2lwbGluZSAoZXJyID0gJWQpXG4iOworCitzdGF0aWMgaW50IF9faW5pdCBzaXhwYWNrX2luaXRfZHJpdmVyKHZvaWQpCit7CisJaW50IHN0YXR1czsKKworCXByaW50ayhtc2dfYmFubmVyKTsKKworCS8qIFJlZ2lzdGVyIHRoZSBwcm92aWRlZCBsaW5lIHByb3RvY29sIGRpc2NpcGxpbmUgKi8KKwlpZiAoKHN0YXR1cyA9IHR0eV9yZWdpc3Rlcl9sZGlzYyhOXzZQQUNLLCAmc3BfbGRpc2MpKSAhPSAwKQorCQlwcmludGsobXNnX3JlZ2ZhaWwsIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgY29uc3QgY2hhciBtc2dfdW5yZWdmYWlsW10gX19leGl0ZGF0YSA9IEtFUk5fRVJSIFwKKwkiNnBhY2s6IGNhbid0IHVucmVnaXN0ZXIgbGluZSBkaXNjaXBsaW5lIChlcnIgPSAlZClcbiI7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzaXhwYWNrX2V4aXRfZHJpdmVyKHZvaWQpCit7CisJaW50IHJldDsKKworCWlmICgocmV0ID0gdHR5X3JlZ2lzdGVyX2xkaXNjKE5fNlBBQ0ssIE5VTEwpKSkKKwkJcHJpbnRrKG1zZ191bnJlZ2ZhaWwsIHJldCk7Cit9CisKKy8qIGVuY29kZSBhbiBBWC4yNSBwYWNrZXQgaW50byA2cGFjayAqLworCitzdGF0aWMgaW50IGVuY29kZV9zaXhwYWNrKHVuc2lnbmVkIGNoYXIgKnR4X2J1ZiwgdW5zaWduZWQgY2hhciAqdHhfYnVmX3JhdywKKwlpbnQgbGVuZ3RoLCB1bnNpZ25lZCBjaGFyIHR4X2RlbGF5KQoreworCWludCBjb3VudCA9IDA7CisJdW5zaWduZWQgY2hhciBjaGVja3N1bSA9IDAsIGJ1Zls0MDBdOworCWludCByYXdfY291bnQgPSAwOworCisJdHhfYnVmX3Jhd1tyYXdfY291bnQrK10gPSBTSVhQX1BSSU9fQ01EX01BU0sgfCBTSVhQX1RYX01BU0s7CisJdHhfYnVmX3Jhd1tyYXdfY291bnQrK10gPSBTSVhQX1NFT0Y7CisKKwlidWZbMF0gPSB0eF9kZWxheTsKKwlmb3IgKGNvdW50ID0gMTsgY291bnQgPCBsZW5ndGg7IGNvdW50KyspCisJCWJ1Zltjb3VudF0gPSB0eF9idWZbY291bnRdOworCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbGVuZ3RoOyBjb3VudCsrKQorCQljaGVja3N1bSArPSBidWZbY291bnRdOworCWJ1ZltsZW5ndGhdID0gKHVuc2lnbmVkIGNoYXIpIDB4ZmYgLSBjaGVja3N1bTsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8PSBsZW5ndGg7IGNvdW50KyspIHsKKwkJaWYgKChjb3VudCAlIDMpID09IDApIHsKKwkJCXR4X2J1Zl9yYXdbcmF3X2NvdW50KytdID0gKGJ1Zltjb3VudF0gJiAweDNmKTsKKwkJCXR4X2J1Zl9yYXdbcmF3X2NvdW50XSA9ICgoYnVmW2NvdW50XSA+PiAyKSAmIDB4MzApOworCQl9IGVsc2UgaWYgKChjb3VudCAlIDMpID09IDEpIHsKKwkJCXR4X2J1Zl9yYXdbcmF3X2NvdW50KytdIHw9IChidWZbY291bnRdICYgMHgwZik7CisJCQl0eF9idWZfcmF3W3Jhd19jb3VudF0gPQkoKGJ1Zltjb3VudF0gPj4gMikgJiAweDNjKTsKKwkJfSBlbHNlIHsKKwkJCXR4X2J1Zl9yYXdbcmF3X2NvdW50KytdIHw9IChidWZbY291bnRdICYgMHgwMyk7CisJCQl0eF9idWZfcmF3W3Jhd19jb3VudCsrXSA9IChidWZbY291bnRdID4+IDIpOworCQl9CisJfQorCWlmICgobGVuZ3RoICUgMykgIT0gMikKKwkJcmF3X2NvdW50Kys7CisJdHhfYnVmX3Jhd1tyYXdfY291bnQrK10gPSBTSVhQX1NFT0Y7CisJcmV0dXJuIHJhd19jb3VudDsKK30KKworLyogZGVjb2RlIDQgc2l4cGFjay1lbmNvZGVkIGJ5dGVzIGludG8gMyBkYXRhIGJ5dGVzICovCisKK3N0YXRpYyB2b2lkIGRlY29kZV9kYXRhKHN0cnVjdCBzaXhwYWNrICpzcCwgdW5zaWduZWQgY2hhciBpbmJ5dGUpCit7CisJdW5zaWduZWQgY2hhciAqYnVmOworCisJaWYgKHNwLT5yeF9jb3VudCAhPSAzKSB7CisJCXNwLT5yYXdfYnVmW3NwLT5yeF9jb3VudCsrXSA9IGluYnl0ZTsKKworCQlyZXR1cm47CisJfQorCisJYnVmID0gc3AtPnJhd19idWY7CisJc3AtPmNvb2tlZF9idWZbc3AtPnJ4X2NvdW50X2Nvb2tlZCsrXSA9CisJCWJ1ZlswXSB8ICgoYnVmWzFdIDw8IDIpICYgMHhjMCk7CisJc3AtPmNvb2tlZF9idWZbc3AtPnJ4X2NvdW50X2Nvb2tlZCsrXSA9CisJCShidWZbMV0gJiAweDBmKSB8ICgoYnVmWzJdIDw8IDIpICYgMHhmMCk7CisJc3AtPmNvb2tlZF9idWZbc3AtPnJ4X2NvdW50X2Nvb2tlZCsrXSA9CisJCShidWZbMl0gJiAweDAzKSB8IChpbmJ5dGUgPDwgMik7CisJc3AtPnJ4X2NvdW50ID0gMDsKK30KKworLyogaWRlbnRpZnkgYW5kIGV4ZWN1dGUgYSA2cGFjayBwcmlvcml0eSBjb21tYW5kIGJ5dGUgKi8KKworc3RhdGljIHZvaWQgZGVjb2RlX3ByaW9fY29tbWFuZChzdHJ1Y3Qgc2l4cGFjayAqc3AsIHVuc2lnbmVkIGNoYXIgY21kKQoreworCXVuc2lnbmVkIGNoYXIgY2hhbm5lbDsKKwlpbnQgYWN0dWFsOworCisJY2hhbm5lbCA9IGNtZCAmIFNJWFBfQ0hOX01BU0s7CisJaWYgKChjbWQgJiBTSVhQX1BSSU9fREFUQV9NQVNLKSAhPSAwKSB7ICAgICAvKiBpZGxlID8gKi8KKworCS8qIFJYIGFuZCBEQ0QgZmxhZ3MgY2FuIG9ubHkgYmUgc2V0IGluIHRoZSBzYW1lIHByaW8gY29tbWFuZCwKKwkgICBpZiB0aGUgRENEIGZsYWcgaGFzIGJlZW4gc2V0IHdpdGhvdXQgdGhlIFJYIGZsYWcgaW4gdGhlIHByZXZpb3VzCisJICAgcHJpbyBjb21tYW5kLiBJZiBEQ0QgaGFzIG5vdCBiZWVuIHNldCBiZWZvcmUsIHNvbWV0aGluZyBpbiB0aGUKKwkgICB0cmFuc21pc3Npb24gaGFzIGdvbmUgd3JvbmcuIEluIHRoaXMgY2FzZSwgUlggYW5kIERDRCBhcmUKKwkgICBjbGVhcmVkIGluIG9yZGVyIHRvIHByZXZlbnQgdGhlIGRlY29kZV9kYXRhIHJvdXRpbmUgZnJvbQorCSAgIHJlYWRpbmcgZnVydGhlciBkYXRhIHRoYXQgbWlnaHQgYmUgY29ycnVwdC4gKi8KKworCQlpZiAoKChzcC0+c3RhdHVzICYgU0lYUF9EQ0RfTUFTSykgPT0gMCkgJiYKKwkJCSgoY21kICYgU0lYUF9SWF9EQ0RfTUFTSykgPT0gU0lYUF9SWF9EQ0RfTUFTSykpIHsKKwkJCQlpZiAoc3AtPnN0YXR1cyAhPSAxKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiNnBhY2s6IHByb3RvY29sIHZpb2xhdGlvblxuIik7CisJCQkJZWxzZQorCQkJCQlzcC0+c3RhdHVzID0gMDsKKwkJCQljbWQgJj0gIVNJWFBfUlhfRENEX01BU0s7CisJCX0KKwkJc3AtPnN0YXR1cyA9IGNtZCAmIFNJWFBfUFJJT19EQVRBX01BU0s7CisJfSBlbHNlIHsgLyogb3V0cHV0IHdhdGNoZG9nIGNoYXIgaWYgaWRsZSAqLworCQlpZiAoKHNwLT5zdGF0dXMyICE9IDApICYmIChzcC0+ZHVwbGV4ID09IDEpKSB7CisJCQlzcC0+bGVkX3N0YXRlID0gMHg3MDsKKwkJCXNwLT50dHktPmRyaXZlci0+d3JpdGUoc3AtPnR0eSwgJnNwLT5sZWRfc3RhdGUsIDEpOworCQkJc3AtPnR4X2VuYWJsZSA9IDE7CisJCQlhY3R1YWwgPSBzcC0+dHR5LT5kcml2ZXItPndyaXRlKHNwLT50dHksIHNwLT54YnVmZiwgc3AtPnN0YXR1czIpOworCQkJc3AtPnhsZWZ0IC09IGFjdHVhbDsKKwkJCXNwLT54aGVhZCArPSBhY3R1YWw7CisJCQlzcC0+bGVkX3N0YXRlID0gMHg2MDsKKwkJCXNwLT5zdGF0dXMyID0gMDsKKworCQl9CisJfQorCisJLyogbmVlZGVkIHRvIHRyaWdnZXIgdGhlIFROQyB3YXRjaGRvZyAqLworCXNwLT50dHktPmRyaXZlci0+d3JpdGUoc3AtPnR0eSwgJnNwLT5sZWRfc3RhdGUsIDEpOworCisgICAgICAgIC8qIGlmIHRoZSBzdGF0ZSBieXRlIGhhcyBiZWVuIHJlY2VpdmVkLCB0aGUgVE5DIGlzIHByZXNlbnQsCisgICAgICAgICAgIHNvIHRoZSByZXN5bmMgdGltZXIgY2FuIGJlIHJlc2V0LiAqLworCisJaWYgKHNwLT50bmNfc3RhdGUgPT0gVE5DX0lOX1NZTkMpIHsKKwkJZGVsX3RpbWVyKCZzcC0+cmVzeW5jX3QpOworCQlzcC0+cmVzeW5jX3QuZGF0YQk9ICh1bnNpZ25lZCBsb25nKSBzcDsKKwkJc3AtPnJlc3luY190LmZ1bmN0aW9uCT0gcmVzeW5jX3RuYzsKKwkJc3AtPnJlc3luY190LmV4cGlyZXMJPSBqaWZmaWVzICsgU0lYUF9JTklUX1JFU1lOQ19USU1FT1VUOworCQlhZGRfdGltZXIoJnNwLT5yZXN5bmNfdCk7CisJfQorCisJc3AtPnN0YXR1czEgPSBjbWQgJiBTSVhQX1BSSU9fREFUQV9NQVNLOworfQorCisvKiBpZGVudGlmeSBhbmQgZXhlY3V0ZSBhIHN0YW5kYXJkIDZwYWNrIGNvbW1hbmQgYnl0ZSAqLworCitzdGF0aWMgdm9pZCBkZWNvZGVfc3RkX2NvbW1hbmQoc3RydWN0IHNpeHBhY2sgKnNwLCB1bnNpZ25lZCBjaGFyIGNtZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGNoZWNrc3VtID0gMCwgcmVzdCA9IDAsIGNoYW5uZWw7CisJc2hvcnQgaTsKKworCWNoYW5uZWwgPSBjbWQgJiBTSVhQX0NITl9NQVNLOworCXN3aXRjaCAoY21kICYgU0lYUF9DTURfTUFTSykgeyAgICAgLyogbm9ybWFsIGNvbW1hbmQgKi8KKwljYXNlIFNJWFBfU0VPRjoKKwkJaWYgKChzcC0+cnhfY291bnQgPT0gMCkgJiYgKHNwLT5yeF9jb3VudF9jb29rZWQgPT0gMCkpIHsKKwkJCWlmICgoc3AtPnN0YXR1cyAmIFNJWFBfUlhfRENEX01BU0spID09CisJCQkJU0lYUF9SWF9EQ0RfTUFTSykgeworCQkJCXNwLT5sZWRfc3RhdGUgPSAweDY4OworCQkJCXNwLT50dHktPmRyaXZlci0+d3JpdGUoc3AtPnR0eSwgJnNwLT5sZWRfc3RhdGUsIDEpOworCQkJfQorCQl9IGVsc2UgeworCQkJc3AtPmxlZF9zdGF0ZSA9IDB4NjA7CisJCQkvKiBmaWxsIHRyYWlsaW5nIGJ5dGVzIHdpdGggemVyb2VzICovCisJCQlzcC0+dHR5LT5kcml2ZXItPndyaXRlKHNwLT50dHksICZzcC0+bGVkX3N0YXRlLCAxKTsKKwkJCXJlc3QgPSBzcC0+cnhfY291bnQ7CisJCQlpZiAocmVzdCAhPSAwKQorCQkJCSBmb3IgKGkgPSByZXN0OyBpIDw9IDM7IGkrKykKKwkJCQkJZGVjb2RlX2RhdGEoc3AsIDApOworCQkJaWYgKHJlc3QgPT0gMikKKwkJCQlzcC0+cnhfY291bnRfY29va2VkIC09IDI7CisJCQllbHNlIGlmIChyZXN0ID09IDMpCisJCQkJc3AtPnJ4X2NvdW50X2Nvb2tlZCAtPSAxOworCQkJZm9yIChpID0gMDsgaSA8IHNwLT5yeF9jb3VudF9jb29rZWQ7IGkrKykKKwkJCQljaGVja3N1bSArPSBzcC0+Y29va2VkX2J1ZltpXTsKKwkJCWlmIChjaGVja3N1bSAhPSBTSVhQX0NIS1NVTSkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICI2cGFjazogYmFkIGNoZWNrc3VtICUyLjJ4XG4iLCBjaGVja3N1bSk7CisJCQl9IGVsc2UgeworCQkJCXNwLT5yY291bnQgPSBzcC0+cnhfY291bnRfY29va2VkLTI7CisJCQkJc3BfYnVtcChzcCwgMCk7CisJCQl9CisJCQlzcC0+cnhfY291bnRfY29va2VkID0gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNJWFBfVFhfVVJVTjogcHJpbnRrKEtFUk5fREVCVUcgIjZwYWNrOiBUWCB1bmRlcnJ1blxuIik7CisJCWJyZWFrOworCWNhc2UgU0lYUF9SWF9PUlVOOiBwcmludGsoS0VSTl9ERUJVRyAiNnBhY2s6IFJYIG92ZXJydW5cbiIpOworCQlicmVhazsKKwljYXNlIFNJWFBfUlhfQlVGX09WTDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIjZwYWNrOiBSWCBidWZmZXIgb3ZlcmZsb3dcbiIpOworCX0KK30KKworLyogZGVjb2RlIGEgNnBhY2sgcGFja2V0ICovCisKK3N0YXRpYyB2b2lkCitzaXhwYWNrX2RlY29kZShzdHJ1Y3Qgc2l4cGFjayAqc3AsIHVuc2lnbmVkIGNoYXIgKnByZV9yYnVmZiwgaW50IGNvdW50KQoreworCXVuc2lnbmVkIGNoYXIgaW5ieXRlOworCWludCBjb3VudDE7CisKKwlmb3IgKGNvdW50MSA9IDA7IGNvdW50MSA8IGNvdW50OyBjb3VudDErKykgeworCQlpbmJ5dGUgPSBwcmVfcmJ1ZmZbY291bnQxXTsKKwkJaWYgKGluYnl0ZSA9PSBTSVhQX0ZPVU5EX1ROQykgeworCQkJdG5jX3NldF9zeW5jX3N0YXRlKHNwLCBUTkNfSU5fU1lOQyk7CisJCQlkZWxfdGltZXIoJnNwLT5yZXN5bmNfdCk7CisJCX0KKwkJaWYgKChpbmJ5dGUgJiBTSVhQX1BSSU9fQ01EX01BU0spICE9IDApCisJCQlkZWNvZGVfcHJpb19jb21tYW5kKHNwLCBpbmJ5dGUpOworCQllbHNlIGlmICgoaW5ieXRlICYgU0lYUF9TVERfQ01EX01BU0spICE9IDApCisJCQlkZWNvZGVfc3RkX2NvbW1hbmQoc3AsIGluYnl0ZSk7CisJCWVsc2UgaWYgKChzcC0+c3RhdHVzICYgU0lYUF9SWF9EQ0RfTUFTSykgPT0gU0lYUF9SWF9EQ0RfTUFTSykKKwkJCWRlY29kZV9kYXRhKHNwLCBpbmJ5dGUpOworCX0KK30KKworTU9EVUxFX0FVVEhPUigiUmFsZiBCYWVjaGxlIERPMUdSQiA8cmFsZkBsaW51eC1taXBzLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiNnBhY2sgZHJpdmVyIGZvciBBWC4yNSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX0xESVNDKE5fNlBBQ0spOworCittb2R1bGVfaW5pdChzaXhwYWNrX2luaXRfZHJpdmVyKTsKK21vZHVsZV9leGl0KHNpeHBhY2tfZXhpdF9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQwNjhmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL0tjb25maWcKQEAgLTAsMCArMSwxOTEgQEAKK2NvbmZpZyBNS0lTUworCXRyaXN0YXRlICJTZXJpYWwgcG9ydCBLSVNTIGRyaXZlciIKKwlkZXBlbmRzIG9uIEFYMjUgJiYgQlJPS0VOX09OX1NNUAorCS0tLWhlbHAtLS0KKwkgIEtJU1MgaXMgYSBwcm90b2NvbCB1c2VkIGZvciB0aGUgZXhjaGFuZ2Ugb2YgZGF0YSBiZXR3ZWVuIGEgY29tcHV0ZXIKKwkgIGFuZCBhIFRlcm1pbmFsIE5vZGUgQ29udHJvbGxlciAoYSBzbWFsbCBlbWJlZGRlZCBzeXN0ZW0gY29tbW9ubHkKKwkgIHVzZWQgZm9yIG5ldHdvcmtpbmcgb3ZlciBBWC4yNSBhbWF0ZXVyIHJhZGlvIGNvbm5lY3Rpb25zOyBpdAorCSAgY29ubmVjdHMgdGhlIGNvbXB1dGVyJ3Mgc2VyaWFsIHBvcnQgd2l0aCB0aGUgcmFkaW8ncyBtaWNyb3Bob25lCisJICBpbnB1dCBhbmQgc3BlYWtlciBvdXRwdXQpLgorCisJICBBbHRob3VnaCBLSVNTIGlzIGxlc3MgYWR2YW5jZWQgdGhhbiB0aGUgNnBhY2sgcHJvdG9jb2wsIGl0IGhhcworCSAgdGhlIGFkdmFudGFnZSB0aGF0IGl0IGlzIGFscmVhZHkgc3VwcG9ydGVkIGJ5IG1vc3QgbW9kZXJuIFROQ3MKKwkgIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGEgZmlybXdhcmUgdXBncmFkZS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWtpc3MuCisKK2NvbmZpZyA2UEFDSworCXRyaXN0YXRlICJTZXJpYWwgcG9ydCA2UEFDSyBkcml2ZXIiCisJZGVwZW5kcyBvbiBBWDI1ICYmIEJST0tFTl9PTl9TTVAKKwktLS1oZWxwLS0tCisJICA2cGFjayBpcyBhIHRyYW5zbWlzc2lvbiBwcm90b2NvbCBmb3IgdGhlIGRhdGEgZXhjaGFuZ2UgYmV0d2VlbiB5b3VyCisJICBQQyBhbmQgeW91ciBUTkMgKHRoZSBUZXJtaW5hbCBOb2RlIENvbnRyb2xsZXIgYWN0cyBhcyBhIGtpbmQgb2YKKwkgIG1vZGVtIGNvbm5lY3RpbmcgeW91ciBjb21wdXRlcidzIHNlcmlhbCBwb3J0IHRvIHlvdXIgcmFkaW8ncworCSAgbWljcm9waG9uZSBpbnB1dCBhbmQgc3BlYWtlciBvdXRwdXQpLiBUaGlzIHByb3RvY29sIGNhbiBiZSB1c2VkIGFzCisJICBhbiBhbHRlcm5hdGl2ZSB0byBLSVNTIGZvciBuZXR3b3JraW5nIG92ZXIgQVguMjUgYW1hdGV1ciByYWRpbworCSAgY29ubmVjdGlvbnMsIGJ1dCBpdCBoYXMgc29tZSBleHRlbmRlZCBmdW5jdGlvbmFsaXR5LgorCisJICBOb3RlIHRoYXQgdGhpcyBkcml2ZXIgaXMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBtaWdodCBjYXVzZQorCSAgcHJvYmxlbXMuIEZvciBkZXRhaWxzIGFib3V0IHRoZSBmZWF0dXJlcyBhbmQgdGhlIHVzYWdlIG9mIHRoZQorCSAgZHJpdmVyLCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy82cGFjay50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCA2cGFjay4KKworY29uZmlnIEJQUUVUSEVSCisJdHJpc3RhdGUgIkJQUSBFdGhlcm5ldCBkcml2ZXIiCisJZGVwZW5kcyBvbiBBWDI1CisJaGVscAorCSAgQVguMjUgaXMgdGhlIHByb3RvY29sIHVzZWQgZm9yIGNvbXB1dGVyIGNvbW11bmljYXRpb24gb3ZlciBhbWF0ZXVyCisJICByYWRpby4gSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGJlIGFibGUgdG8gc2VuZCBhbmQgcmVjZWl2ZSBBWC4yNQorCSAgdHJhZmZpYyBvdmVyIEV0aGVybmV0IChhbHNvIGNhbGxlZCAiQlBRIEFYLjI1IiksIHdoaWNoIGNvdWxkIGJlCisJICB1c2VmdWwgaWYgc29tZSBvdGhlciBjb21wdXRlciBvbiB5b3VyIGxvY2FsIG5ldHdvcmsgaGFzIGEgZGlyZWN0CisJICBhbWF0ZXVyIHJhZGlvIGNvbm5lY3Rpb24uCisKK2NvbmZpZyBETUFTQ0MKKwl0cmlzdGF0ZSAiSGlnaC1zcGVlZCAoRE1BKSBTQ0MgZHJpdmVyIGZvciBBWC4yNSIKKwlkZXBlbmRzIG9uIElTQSAmJiBBWDI1ICYmIEJST0tFTl9PTl9TTVAKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciBoaWdoLXNwZWVkIFNDQyBib2FyZHMsIGkuZS4gdGhvc2Ugc3VwcG9ydGluZworCSAgRE1BIG9uIG9uZSBwb3J0LiBZb3UgdXN1YWxseSB1c2UgdGhvc2UgYm9hcmRzIHRvIGNvbm5lY3QgeW91cgorCSAgY29tcHV0ZXIgdG8gYW4gYW1hdGV1ciByYWRpbyBtb2RlbSAoc3VjaCBhcyB0aGUgV0E0RFNZIDU2a2JwcworCSAgbW9kZW0pLCBpbiBvcmRlciB0byBzZW5kIGFuZCByZWNlaXZlIEFYLjI1IHBhY2tldCByYWRpbyBuZXR3b3JrCisJICB0cmFmZmljLgorCisJICBDdXJyZW50bHksIHRoaXMgZHJpdmVyIHN1cHBvcnRzIE90dGF3YSBQSS9QSTIsIFBhY2NvbW0vR3JhY2lsaXMKKwkgIFBhY2tlVHdpbiwgYW5kIFM1U0NDL0RNQSBib2FyZHMuIFRoZXkgYXJlIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkuCisJICBJZiB5b3UgaGF2ZSBvbmUgb2YgdGhlc2UgY2FyZHMsIHNheSBZIGhlcmUgYW5kIHJlYWQgdGhlIEFYMjUtSE9XVE8sCisJICBhdmFpbGFibGUgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUaGlzIGRyaXZlciBjYW4gb3BlcmF0ZSBtdWx0aXBsZSBib2FyZHMgc2ltdWx0YW5lb3VzbHkuIElmIHlvdQorCSAgY29tcGlsZSBpdCBhcyBhIG1vZHVsZSAoYnkgc2F5aW5nIE0gaW5zdGVhZCBvZiBZKSwgaXQgd2lsbCBiZSBjYWxsZWQKKwkgIGRtYXNjYy4gSWYgeW91IGRvbid0IHBhc3MgYW55IHBhcmFtZXRlciB0byB0aGUgZHJpdmVyLCBhbGwKKwkgIHBvc3NpYmxlIEkvTyBhZGRyZXNzZXMgYXJlIHByb2JlZC4gVGhpcyBjb3VsZCBpcnJpdGF0ZSBvdGhlciBkZXZpY2VzCisJICB0aGF0IGFyZSBjdXJyZW50bHkgbm90IGluIHVzZS4gWW91IG1heSBzcGVjaWZ5IHRoZSBsaXN0IG9mIGFkZHJlc3NlcworCSAgdG8gYmUgcHJvYmVkIGJ5ICJkbWFzY2M9YWRkcjEsYWRkcjIsLi4uIiAod2hlbiBjb21waWxlZCBpbnRvIHRoZQorCSAga2VybmVsIGltYWdlKSBvciAiaW89YWRkcjEsYWRkcjIsLi4uIiAod2hlbiBsb2FkZWQgYXMgYSBtb2R1bGUpLiBUaGUKKwkgIG5ldHdvcmsgaW50ZXJmYWNlcyB3aWxsIGJlIGNhbGxlZCBkbWFzY2MwIGFuZCBkbWFzY2MxIGZvciB0aGUgYm9hcmQKKwkgIGRldGVjdGVkIGZpcnN0LCBkbWFzY2MyIGFuZCBkbWFzY2MzIGZvciB0aGUgc2Vjb25kIG9uZSwgYW5kIHNvIG9uLgorCisJICBCZWZvcmUgeW91IGNvbmZpZ3VyZSBlYWNoIGludGVyZmFjZSB3aXRoIGlmY29uZmlnLCB5b3UgTVVTVCBzZXQKKwkgIGNlcnRhaW4gcGFyYW1ldGVycywgc3VjaCBhcyBjaGFubmVsIGFjY2VzcyB0aW1pbmcsIGNsb2NrIG1vZGUsIGFuZAorCSAgRE1BIGNoYW5uZWwuIFRoaXMgaXMgYWNjb21wbGlzaGVkIHdpdGggYSBzbWFsbCB1dGlsaXR5IHByb2dyYW0sCisJICBkbWFzY2NfY2ZnLCBhdmFpbGFibGUgYXQKKwkgIDxodHRwOi8vY2Fjb2Zvbml4Lm50LnR1d2llbi5hYy5hdC9+b2Uxa2liL0xpbnV4Lz4uIFBsZWFzZSBiZSBzdXJlIHRvCisJICBnZXQgYXQgbGVhc3QgdmVyc2lvbiAxLjI3IG9mIGRtYXNjY19jZmcsIGFzIG9sZGVyIHZlcnNpb25zIHdpbGwgbm90CisJICB3b3JrIHdpdGggdGhlIGN1cnJlbnQgZHJpdmVyLgorCitjb25maWcgU0NDCisJdHJpc3RhdGUgIlo4NTMwIFNDQyBkcml2ZXIiCisJZGVwZW5kcyBvbiBJU0EgJiYgQVgyNQorCS0tLWhlbHAtLS0KKwkgIFRoZXNlIGNhcmRzIGFyZSB1c2VkIHRvIGNvbm5lY3QgeW91ciBMaW51eCBib3ggdG8gYW4gYW1hdGV1ciByYWRpbworCSAgaW4gb3JkZXIgdG8gY29tbXVuaWNhdGUgd2l0aCBvdGhlciBjb21wdXRlcnMuIElmIHlvdSB3YW50IHRvIHVzZQorCSAgdGhpcywgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvejg1MzBkcnYudHh0PiBhbmQgdGhlCisJICBBWDI1LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gQWxzbyBtYWtlIHN1cmUgdG8gc2F5IFkKKwkgIHRvICJBbWF0ZXVyIFJhZGlvIEFYLjI1IExldmVsIDIiIHN1cHBvcnQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNjYy4KKworY29uZmlnIFNDQ19ERUxBWQorCWJvb2wgImFkZGl0aW9uYWwgZGVsYXkgZm9yIFBBMEhaUCBPcHRvU0NDIGNvbXBhdGlibGUgYm9hcmRzIgorCWRlcGVuZHMgb24gU0NDCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcyB3aXRoIHRoZSBTQ0MgZHJpdmVyIG5vdAorCSAgd29ya2luZyBwcm9wZXJseTsgcGxlYXNlIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy96ODUzMGRydi50eHQ+IGZvciBkZXRhaWxzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgU0NDX1RSWEVDSE8KKwlib29sICJzdXBwb3J0IGZvciBUUlggdGhhdCBmZWVkYmFjayB0aGUgdHggc2lnbmFsIHRvIHJ4IgorCWRlcGVuZHMgb24gU0NDCisJaGVscAorCSAgU29tZSB0cmFuc21pdHRlcnMgZmVlZCB0aGUgdHJhbnNtaXR0ZWQgc2lnbmFsIGJhY2sgdG8gdGhlIHJlY2VpdmUKKwkgIGxpbmUuICBTYXkgWSBoZXJlIHRvIGZvaWwgdGhpcyBieSBleHBsaWNpdGx5IGRpc2FibGluZyB0aGUgcmVjZWl2ZXIKKwkgIGR1cmluZyBkYXRhIHRyYW5zbWlzc2lvbi4KKworCSAgSWYgaW4gZG91YnQsIHNheSBZLgorCitjb25maWcgQkFZQ09NX1NFUl9GRFgKKwl0cmlzdGF0ZSAiQkFZQ09NIHNlcjEyIGZ1bGxkdXBsZXggZHJpdmVyIGZvciBBWC4yNSIKKwlkZXBlbmRzIG9uIEFYMjUKKwlzZWxlY3QgQ1JDX0NDSVRUCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBvbmUgb2YgdHdvIGRyaXZlcnMgZm9yIEJheWNvbSBzdHlsZSBzaW1wbGUgYW1hdGV1ciByYWRpbworCSAgbW9kZW1zIHRoYXQgY29ubmVjdCB0byBhIHNlcmlhbCBpbnRlcmZhY2UuIFRoZSBkcml2ZXIgc3VwcG9ydHMgdGhlCisJICBzZXIxMiBkZXNpZ24gaW4gZnVsbC1kdXBsZXggbW9kZS4gSW4gYWRkaXRpb24sIGl0IGFsbG93cyB0aGUKKwkgIGJhdWRyYXRlIHRvIGJlIHNldCBiZXR3ZWVuIDMwMCBhbmQgNDgwMCBiYXVkIChob3dldmVyIG5vdCBhbGwgbW9kZW1zCisJICBzdXBwb3J0IGFsbCBiYXVkcmF0ZXMpLiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgZHJpdmVyLiBUaGUgbmV4dAorCSAgZHJpdmVyLCAiQkFZQ09NIHNlcjEyIGhhbGYtZHVwbGV4IGRyaXZlciBmb3IgQVguMjUiIGlzIHRoZSBvbGQKKwkgIGRyaXZlciBhbmQgc3RpbGwgcHJvdmlkZWQgaW4gY2FzZSB0aGlzIGRyaXZlciBkb2VzIG5vdCB3b3JrIHdpdGgKKwkgIHlvdXIgc2VyaWFsIGludGVyZmFjZSBjaGlwLiBUbyBjb25maWd1cmUgdGhlIGRyaXZlciwgdXNlIHRoZSBzZXRoZGxjCisJICB1dGlsaXR5IGF2YWlsYWJsZSBpbiB0aGUgc3RhbmRhcmQgYXgyNSB1dGlsaXRpZXMgcGFja2FnZS4gRm9yCisJICBpbmZvcm1hdGlvbiBvbiB0aGUgbW9kZW1zLCBzZWUgPGh0dHA6Ly93d3cuYmF5Y29tLmRlLz4gYW5kCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYmF5Y29tLnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGJheWNvbV9zZXJfZmR4LiAgVGhpcyBpcyByZWNvbW1lbmRlZC4KKworY29uZmlnIEJBWUNPTV9TRVJfSERYCisJdHJpc3RhdGUgIkJBWUNPTSBzZXIxMiBoYWxmZHVwbGV4IGRyaXZlciBmb3IgQVguMjUiCisJZGVwZW5kcyBvbiBBWDI1CisJc2VsZWN0IENSQ19DQ0lUVAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgb25lIG9mIHR3byBkcml2ZXJzIGZvciBCYXljb20gc3R5bGUgc2ltcGxlIGFtYXRldXIgcmFkaW8KKwkgIG1vZGVtcyB0aGF0IGNvbm5lY3QgdG8gYSBzZXJpYWwgaW50ZXJmYWNlLiBUaGUgZHJpdmVyIHN1cHBvcnRzIHRoZQorCSAgc2VyMTIgZGVzaWduIGluIGZ1bGwtZHVwbGV4IG1vZGUuIFRoaXMgaXMgdGhlIG9sZCBkcml2ZXIuICBJdCBpcworCSAgc3RpbGwgcHJvdmlkZWQgaW4gY2FzZSB5b3VyIHNlcmlhbCBpbnRlcmZhY2UgY2hpcCBkb2VzIG5vdCB3b3JrIHdpdGgKKwkgIHRoZSBmdWxsLWR1cGxleCBkcml2ZXIuIFRoaXMgZHJpdmVyIGlzIGRlcHJlY2lhdGVkLiAgVG8gY29uZmlndXJlCisJICB0aGUgZHJpdmVyLCB1c2UgdGhlIHNldGhkbGMgdXRpbGl0eSBhdmFpbGFibGUgaW4gdGhlIHN0YW5kYXJkIGF4MjUKKwkgIHV0aWxpdGllcyBwYWNrYWdlLiBGb3IgaW5mb3JtYXRpb24gb24gdGhlIG1vZGVtcywgc2VlCisJICA8aHR0cDovL3d3dy5iYXljb20uZGUvPiBhbmQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9iYXljb20udHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYmF5Y29tX3Nlcl9oZHguICBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitjb25maWcgQkFZQ09NX1BBUgorCXRyaXN0YXRlICJCQVlDT00gcGljcGFyIGFuZCBwYXI5NiBkcml2ZXIgZm9yIEFYLjI1IgorCWRlcGVuZHMgb24gUEFSUE9SVCAmJiBBWDI1CisJc2VsZWN0IENSQ19DQ0lUVAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIEJheWNvbSBzdHlsZSBzaW1wbGUgYW1hdGV1ciByYWRpbyBtb2RlbXMgdGhhdAorCSAgY29ubmVjdCB0byBhIHBhcmFsbGVsIGludGVyZmFjZS4gVGhlIGRyaXZlciBzdXBwb3J0cyB0aGUgcGljcGFyIGFuZAorCSAgcGFyOTYgZGVzaWducy4gVG8gY29uZmlndXJlIHRoZSBkcml2ZXIsIHVzZSB0aGUgc2V0aGRsYyB1dGlsaXR5CisJICBhdmFpbGFibGUgaW4gdGhlIHN0YW5kYXJkIGF4MjUgdXRpbGl0aWVzIHBhY2thZ2UuIEZvciBpbmZvcm1hdGlvbiBvbgorCSAgdGhlIG1vZGVtcywgc2VlIDxodHRwOi8vd3d3LmJheWNvbS5kZS8+IGFuZCB0aGUgZmlsZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JheWNvbS50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBiYXljb21fcGFyLiAgVGhpcyBpcyByZWNvbW1lbmRlZC4KKworY29uZmlnIEJBWUNPTV9FUFAKKwl0cmlzdGF0ZSAiQkFZQ09NIGVwcCBkcml2ZXIgZm9yIEFYLjI1IgorCWRlcGVuZHMgb24gUEFSUE9SVCAmJiBBWDI1ICYmICE2NEJJVAorCXNlbGVjdCBDUkNfQ0NJVFQKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciBCYXljb20gc3R5bGUgc2ltcGxlIGFtYXRldXIgcmFkaW8gbW9kZW1zIHRoYXQKKwkgIGNvbm5lY3QgdG8gYSBwYXJhbGxlbCBpbnRlcmZhY2UuIFRoZSBkcml2ZXIgc3VwcG9ydHMgdGhlIEVQUAorCSAgZGVzaWducy4gVG8gY29uZmlndXJlIHRoZSBkcml2ZXIsIHVzZSB0aGUgc2V0aGRsYyB1dGlsaXR5IGF2YWlsYWJsZQorCSAgaW4gdGhlIHN0YW5kYXJkIGF4MjUgdXRpbGl0aWVzIHBhY2thZ2UuIEZvciBpbmZvcm1hdGlvbiBvbiB0aGUKKwkgIG1vZGVtcywgc2VlIDxodHRwOi8vd3d3LmJheWNvbS5kZS8+IGFuZCB0aGUgZmlsZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JheWNvbS50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBiYXljb21fZXBwLiAgVGhpcyBpcyByZWNvbW1lbmRlZC4KKworY29uZmlnIFlBTQorCXRyaXN0YXRlICJZQU0gZHJpdmVyIGZvciBBWC4yNSIKKwlkZXBlbmRzIG9uIEFYMjUKKwloZWxwCisJICBUaGUgWUFNIGlzIGEgbW9kZW0gZm9yIHBhY2tldCByYWRpbyB3aGljaCBjb25uZWN0cyB0byB0aGUgc2VyaWFsCisJICBwb3J0IGFuZCBpbmNsdWRlcyBzb21lIG9mIHRoZSBmdW5jdGlvbnMgb2YgYSBUZXJtaW5hbCBOb2RlCisJICBDb250cm9sbGVyLiBJZiB5b3UgaGF2ZSBvbmUgb2YgdGhvc2UsIHNheSBZIGhlcmUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHlhbS4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGVmODY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vTWFrZWZpbGUKQEAgLTAsMCArMSwyMiBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IEFYLjI1IGFuZCBIRk1PREVNIGRldmljZSBkcml2ZXJzLgorIworIworIyAxOTk3MTEzMCAJTW92ZWQgdGhlIGFtYXRldXIgcmFkaW8gcmVsYXRlZCBuZXR3b3JrIGRyaXZlcnMgZnJvbSAKKyMJCWRyaXZlcnMvbmV0LyB0byBkcml2ZXJzL2hhbXJhZGlvIGZvciBlYXNpZXIgbWFpbnRhaW5hbmNlLgorIyAgICAgICAgICAgICAgIEpvZXJnIFJldXRlciBETDFCS0UgPGpyZXV0ZXJAeWFpbmEuZGU+CisjCisjIDIwMDAwODA2CVJld3JpdHRlbiB0byB1c2UgbGlzdHMgaW5zdGVhZCBvZiBpZi1zdGF0ZW1lbnRzLgorIwkJQ2hyaXN0b3BoIEhlbGx3aWcgPGhjaEBpbmZyYWRlYWQub3JnPgorIworCitvYmotJChDT05GSUdfRE1BU0NDKQkJKz0gZG1hc2NjLm8KK29iai0kKENPTkZJR19TQ0MpCQkrPSBzY2Mubworb2JqLSQoQ09ORklHX01LSVNTKQkJKz0gbWtpc3Mubworb2JqLSQoQ09ORklHXzZQQUNLKQkJKz0gNnBhY2subworb2JqLSQoQ09ORklHX1lBTSkJCSs9IHlhbS5vCitvYmotJChDT05GSUdfQlBRRVRIRVIpCQkrPSBicHFldGhlci5vCitvYmotJChDT05GSUdfQkFZQ09NX1NFUl9GRFgpCSs9IGJheWNvbV9zZXJfZmR4Lm8JaGRsY2Rydi5vCitvYmotJChDT05GSUdfQkFZQ09NX1NFUl9IRFgpCSs9IGJheWNvbV9zZXJfaGR4Lm8JaGRsY2Rydi5vCitvYmotJChDT05GSUdfQkFZQ09NX1BBUikJKz0gYmF5Y29tX3Bhci5vCQloZGxjZHJ2Lm8KK29iai0kKENPTkZJR19CQVlDT01fRVBQKQkrPSBiYXljb21fZXBwLm8JCWhkbGNkcnYubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX2VwcC5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX2VwcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4Y2I4N2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fZXBwLmMKQEAgLTAsMCArMSwxMzgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKgliYXljb21fZXBwLmMgIC0tIGJheWNvbSBlcHAgcmFkaW8gbW9kZW0gZHJpdmVyLgorICoKKyAqCUNvcHlyaWdodCAoQykgMTk5OC0yMDAwCisgKiAgICAgICAgICBUaG9tYXMgU2FpbGVyIChzYWlsZXJAaWZlLmVlLmV0aHouY2gpCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogIFBsZWFzZSBub3RlIHRoYXQgdGhlIEdQTCBhbGxvd3MgeW91IHRvIHVzZSB0aGUgZHJpdmVyLCBOT1QgdGhlIHJhZGlvLgorICogIEluIG9yZGVyIHRvIHVzZSB0aGUgcmFkaW8sIHlvdSBuZWVkIGEgbGljZW5zZSBmcm9tIHRoZSBjb21tdW5pY2F0aW9ucworICogIGF1dGhvcml0eSBvZiB5b3VyIGNvdW50cnkuCisgKgorICoKKyAqICBIaXN0b3J5OgorICogICAwLjEgIHh4Lnh4LjE5OTggIEluaXRpYWwgdmVyc2lvbiBieSBNYXR0aGlhcyBXZWx3YXJza3kgKGRnMmZlZikKKyAqICAgMC4yICAyMS4wNC4xOTk4ICBNYXNzaXZlIHJld29yayBieSBUaG9tYXMgU2FpbGVyCisgKiAgICAgICAgICAgICAgICAgICAgSW50ZWdyYXRlZCBGUEdBIEVQUCBtb2RlbSBjb25maWd1cmF0aW9uIHJvdXRpbmVzCisgKiAgIDAuMyAgMTEuMDUuMTk5OCAgVG9vayBGUEdBIGNvbmZpZyBvdXQgYW5kIG1vdmVkIGl0IGludG8gYSBzZXBhcmF0ZSBwcm9ncmFtCisgKiAgIDAuNCAgMjYuMDcuMTk5OSAgQWRhcHRlZCB0byBuZXcgbG93bGV2ZWwgcGFycG9ydCBkcml2ZXIgaW50ZXJmYWNlCisgKiAgIDAuNSAgMDMuMDguMTk5OSAgYWRhcHQgdG8gTGludXMnIG5ldyBfX3NldHVwL19faW5pdGNhbGwKKyAqICAgICAgICAgICAgICAgICAgICByZW1vdmVkIHNvbWUgcHJlLTIuMiBrZXJuZWwgY29tcGF0aWJpbGl0eSBjcnVmdAorICogICAwLjYgIDEwLjA4LjE5OTkgIENoZWNrIGlmIHBhcnBvcnQgY2FuIGRvIFNQUCBhbmQgaXMgc2FmZSB0byBhY2Nlc3MgZHVyaW5nIGludGVycnVwdCBjb250ZXh0cworICogICAwLjcgIDEyLjAyLjIwMDAgIGFkYXB0ZWQgdG8gc29mdG5ldCBkcml2ZXIgaW50ZXJmYWNlCisgKgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L2hkbGNkcnYuaD4KKyNpbmNsdWRlIDxsaW51eC9iYXljb20uaD4KKyNpZiBkZWZpbmVkKENPTkZJR19BWDI1KSB8fCBkZWZpbmVkKENPTkZJR19BWDI1X01PRFVMRSkKKy8qIHByb3RvdHlwZXMgZm9yIGF4MjVfZW5jYXBzdWxhdGUgYW5kIGF4MjVfcmVidWlsZF9oZWFkZXIgKi8KKyNpbmNsdWRlIDxuZXQvYXgyNS5oPiAKKyNlbmRpZiAvKiBDT05GSUdfQVgyNSB8fCBDT05GSUdfQVgyNV9NT0RVTEUgKi8KKyNpbmNsdWRlIDxsaW51eC9jcmMtY2NpdHQuaD4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQkFZQ09NX0RFQlVHCisjZGVmaW5lIEJBWUNPTV9NQUdJQyAxOTczMDUxMAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgcGFyYW5vaWFfc3RyW10gPSBLRVJOX0VSUiAKKwkiYmF5Y29tX2VwcDogYmFkIG1hZ2ljIG51bWJlciBmb3IgaGRsY2Rydl9zdGF0ZSBzdHJ1Y3QgaW4gcm91dGluZSAlc1xuIjsKKworc3RhdGljIGNvbnN0IGNoYXIgYmNfZHJ2bmFtZVtdID0gImJheWNvbV9lcHAiOworc3RhdGljIGNvbnN0IGNoYXIgYmNfZHJ2aW5mb1tdID0gS0VSTl9JTkZPICJiYXljb21fZXBwOiAoQykgMTk5OC0yMDAwIFRob21hcyBTYWlsZXIsIEhCOUpOWC9BRTRXQVxuIgorS0VSTl9JTkZPICJiYXljb21fZXBwOiB2ZXJzaW9uIDAuNyBjb21waWxlZCAiIF9fVElNRV9fICIgIiBfX0RBVEVfXyAiXG4iOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBOUl9QT1JUUyA0CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqYmF5Y29tX2RldmljZVtOUl9QT1JUU107CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBFUFAgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIEVQUF9EQ0RCSVQgICAgICAweDgwCisjZGVmaW5lIEVQUF9QVFRCSVQgICAgICAweDA4CisjZGVmaW5lIEVQUF9OUkVGICAgICAgICAweDAxCisjZGVmaW5lIEVQUF9OUkFFRiAgICAgICAweDAyCisjZGVmaW5lIEVQUF9OUkhGICAgICAgICAweDA0CisjZGVmaW5lIEVQUF9OVEhGICAgICAgICAweDIwCisjZGVmaW5lIEVQUF9OVEFFRiAgICAgICAweDEwCisjZGVmaW5lIEVQUF9OVEVGICAgICAgICBFUFBfUFRUQklUCisKKy8qIEVQUCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIEVQUF9UWF9GSUZPX0VOQUJMRSAweDEwCisjZGVmaW5lIEVQUF9SWF9GSUZPX0VOQUJMRSAweDA4CisjZGVmaW5lIEVQUF9NT0RFTV9FTkFCTEUgICAweDIwCisjZGVmaW5lIEVQUF9MRURTICAgICAgICAgICAweEMwCisjZGVmaW5lIEVQUF9JUlFfRU5BQkxFICAgICAweDEwCisKKy8qIExQVCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTFBUUkVHX0VDT05UUk9MICAgICAgIDB4NDAyCisjZGVmaW5lIExQVFJFR19DT05GSUdCICAgICAgICAweDQwMQorI2RlZmluZSBMUFRSRUdfQ09ORklHQSAgICAgICAgMHg0MDAKKyNkZWZpbmUgTFBUUkVHX0VQUERBVEEgICAgICAgIDB4MDA0CisjZGVmaW5lIExQVFJFR19FUFBBRERSICAgICAgICAweDAwMworI2RlZmluZSBMUFRSRUdfQ09OVFJPTCAgICAgICAgMHgwMDIKKyNkZWZpbmUgTFBUUkVHX1NUQVRVUyAgICAgICAgIDB4MDAxCisjZGVmaW5lIExQVFJFR19EQVRBICAgICAgICAgICAweDAwMAorCisvKiBMUFQgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBMUFRDVFJMX1BST0dSQU0gICAgICAgMHgwNCAgIC8qIDAgdG8gcmVwcm9ncmFtICovCisjZGVmaW5lIExQVENUUkxfV1JJVEUgICAgICAgICAweDAxCisjZGVmaW5lIExQVENUUkxfQUREUlNUQiAgICAgICAweDA4CisjZGVmaW5lIExQVENUUkxfREFUQVNUQiAgICAgICAweDAyCisjZGVmaW5lIExQVENUUkxfSU5URU4gICAgICAgICAweDEwCisKKy8qIExQVCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTFBUU1RBVF9TSElGVF9OSU5UUiAgIDYKKyNkZWZpbmUgTFBUU1RBVF9XQUlUICAgICAgICAgIDB4ODAKKyNkZWZpbmUgTFBUU1RBVF9OSU5UUiAgICAgICAgICgxPDxMUFRTVEFUX1NISUZUX05JTlRSKQorI2RlZmluZSBMUFRTVEFUX1BFICAgICAgICAgICAgMHgyMAorI2RlZmluZSBMUFRTVEFUX0RPTkUgICAgICAgICAgMHgxMAorI2RlZmluZSBMUFRTVEFUX05FUlJPUiAgICAgICAgMHgwOAorI2RlZmluZSBMUFRTVEFUX0VQUFRJTUVPVVQgICAgMHgwMQorCisvKiBMUFQgZGF0YSByZWdpc3RlciAqLworI2RlZmluZSBMUFREQVRBX1NISUZUX1RESSAgICAgMAorI2RlZmluZSBMUFREQVRBX1NISUZUX1RNUyAgICAgMgorI2RlZmluZSBMUFREQVRBX1RESSAgICAgICAgICAgKDE8PExQVERBVEFfU0hJRlRfVERJKQorI2RlZmluZSBMUFREQVRBX1RDSyAgICAgICAgICAgMHgwMgorI2RlZmluZSBMUFREQVRBX1RNUyAgICAgICAgICAgKDE8PExQVERBVEFfU0hJRlRfVE1TKQorI2RlZmluZSBMUFREQVRBX0lOSVRCSUFTICAgICAgMHg4MAorCisKKy8qIEVQUCBtb2RlbSBjb25maWcvc3RhdHVzIGJpdHMgKi8KKyNkZWZpbmUgRVBQX0RDREJJVCAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgRVBQX1BUVEJJVCAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgRVBQX1JYRUJJVCAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRVBQX1JYQUVCSVQgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgRVBQX1JYSEZVTEwgICAgICAgICAgIDB4MDQKKworI2RlZmluZSBFUFBfTlRIRiAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBFUFBfTlRBRUYgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBFUFBfTlRFRiAgICAgICAgICAgICAgRVBQX1BUVEJJVAorCisjZGVmaW5lIEVQUF9UWF9GSUZPX0VOQUJMRSAgICAweDEwCisjZGVmaW5lIEVQUF9SWF9GSUZPX0VOQUJMRSAgICAweDA4CisjZGVmaW5lIEVQUF9NT0RFTV9FTkFCTEUgICAgICAweDIwCisjZGVmaW5lIEVQUF9MRURTICAgICAgICAgICAgICAweEMwCisjZGVmaW5lIEVQUF9JUlFfRU5BQkxFICAgICAgICAweDEwCisKKy8qIFhpbGlueCA0ayBKVEFHIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBYQzRLX0lSTEVOR1RIICAgMworI2RlZmluZSBYQzRLX0VYVEVTVCAgICAgMAorI2RlZmluZSBYQzRLX1BSRUxPQUQgICAgMQorI2RlZmluZSBYQzRLX0NPTkZJR1VSRSAgNQorI2RlZmluZSBYQzRLX0JZUEFTUyAgICAgNworCisjZGVmaW5lIEVQUF9DT05WRU5USU9OQUwgIDAKKyNkZWZpbmUgRVBQX0ZQR0EgICAgICAgICAgMQorI2RlZmluZSBFUFBfRlBHQUVYVFNUQVRVUyAyCisKKyNkZWZpbmUgVFhCVUZGRVJfU0laRSAgICAgKChIRExDRFJWX01BWEZMRU4qNi81KSs4KQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogSW5mb3JtYXRpb24gdGhhdCBuZWVkIHRvIGJlIGtlcHQgZm9yIGVhY2ggYm9hcmQuCisgKi8KKworc3RydWN0IGJheWNvbV9zdGF0ZSB7CisJaW50IG1hZ2ljOworCisgICAgICAgIHN0cnVjdCBwYXJkZXZpY2UgKnBkZXY7CisJdW5zaWduZWQgaW50IHdvcmtfcnVubmluZzsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcnVuX3dvcms7CisJdW5zaWduZWQgaW50IG1vZGVtOworCXVuc2lnbmVkIGludCBiaXRyYXRlOworCXVuc2lnbmVkIGNoYXIgc3RhdDsKKworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGludCBpbnRjbGs7CisJCXVuc2lnbmVkIGludCBmY2xrOworCQl1bnNpZ25lZCBpbnQgYnBzOworCQl1bnNpZ25lZCBpbnQgZXh0bW9kZW07CisJCXVuc2lnbmVkIGludCBsb29wYmFjazsKKwl9IGNmZzsKKworICAgICAgICBzdHJ1Y3QgaGRsY2Rydl9jaGFubmVsX3BhcmFtcyBjaF9wYXJhbXM7CisKKyAgICAgICAgc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IGJpdGJ1ZiwgYml0c3RyZWFtLCBudW1iaXRzLCBzdGF0ZTsKKwkJdW5zaWduZWQgY2hhciAqYnVmcHRyOworCQlpbnQgYnVmY250OworCQl1bnNpZ25lZCBjaGFyIGJ1ZltUWEJVRkZFUl9TSVpFXTsKKyAgICAgICAgfSBoZGxjcng7CisKKyAgICAgICAgc3RydWN0IHsKKwkJaW50IGNhbGlicmF0ZTsKKyAgICAgICAgICAgICAgICBpbnQgc2xvdGNudDsKKwkJaW50IGZsYWdzOworCQllbnVtIHsgdHhfaWRsZSA9IDAsIHR4X2tleXVwLCB0eF9kYXRhLCB0eF90YWlsIH0gc3RhdGU7CisJCXVuc2lnbmVkIGNoYXIgKmJ1ZnB0cjsKKwkJaW50IGJ1ZmNudDsKKwkJdW5zaWduZWQgY2hhciBidWZbVFhCVUZGRVJfU0laRV07CisgICAgICAgIH0gaGRsY3R4OworCisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXVuc2lnbmVkIGludCBwdHRfa2V5ZWQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsgIC8qIG5leHQgdHJhbnNtaXQgcGFja2V0ICAqLworCisjaWZkZWYgQkFZQ09NX0RFQlVHCisJc3RydWN0IGRlYnVnX3ZhbHMgeworCQl1bnNpZ25lZCBsb25nIGxhc3RfamlmZmllczsKKwkJdW5zaWduZWQgY3VyX2ludGNudDsKKwkJdW5zaWduZWQgbGFzdF9pbnRjbnQ7CisJCWludCBjdXJfcGxsY29ycjsKKwkJaW50IGxhc3RfcGxsY29ycjsKKwkJdW5zaWduZWQgaW50IG1vZF9jeWNsZXM7CisJCXVuc2lnbmVkIGludCBkZW1vZF9jeWNsZXM7CisJfSBkZWJ1Z192YWxzOworI2VuZGlmIC8qIEJBWUNPTV9ERUJVRyAqLworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgS0lTU19WRVJCT1NFCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFBBUkFNX1RYREVMQVkgICAxCisjZGVmaW5lIFBBUkFNX1BFUlNJU1QgICAyCisjZGVmaW5lIFBBUkFNX1NMT1RUSU1FICAzCisjZGVmaW5lIFBBUkFNX1RYVEFJTCAgICA0CisjZGVmaW5lIFBBUkFNX0ZVTExEVVAgICA1CisjZGVmaW5lIFBBUkFNX0hBUkRXQVJFICA2CisjZGVmaW5lIFBBUkFNX1JFVFVSTiAgICAyNTUKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogdGhlIENSQyByb3V0aW5lcyBhcmUgc3RvbGVuIGZyb20gV0FNUEVTCisgKiBieSBEaWV0ZXIgRGV5a2UKKyAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIDAKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcHBlbmRfY3JjX2NjaXR0KHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKyAJdW5zaWduZWQgaW50IGNyYyA9IDB4ZmZmZjsKKworCWZvciAoO2xlbj4wO2xlbi0tKQorCQljcmMgPSAoY3JjID4+IDgpIF4gY3JjX2NjaXR0X3RhYmxlWyhjcmMgXiAqYnVmZmVyKyspICYgMHhmZl07CisJY3JjIF49IDB4ZmZmZjsKKwkqYnVmZmVyKysgPSBjcmM7CisJKmJ1ZmZlcisrID0gY3JjID4+IDg7Cit9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIGludCBjaGVja19jcmNfY2NpdHQoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY250KQoreworCXJldHVybiAoY3JjX2NjaXR0KDB4ZmZmZiwgYnVmLCBjbnQpICYgMHhmZmZmKSA9PSAweGYwYjg7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBpbnQgY2FsY19jcmNfY2NpdHQoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY250KQoreworCXJldHVybiAoY3JjX2NjaXR0KDB4ZmZmZiwgYnVmLCBjbnQpIF4gMHhmZmZmKSAmIDB4ZmZmZjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIHRlbm1zX3RvX2ZsYWdzKGJjLHRlbm1zKSAoKHRlbm1zICogYmMtPmJpdHJhdGUpIC8gODAwKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIGJheWNvbV9pbnRfZnJlcShzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYykKK3sKKyNpZmRlZiBCQVlDT01fREVCVUcKKwl1bnNpZ25lZCBsb25nIGN1cl9qaWZmaWVzID0gamlmZmllczsKKwkvKgorCSAqIG1lYXN1cmUgdGhlIGludGVycnVwdCBmcmVxdWVuY3kKKwkgKi8KKwliYy0+ZGVidWdfdmFscy5jdXJfaW50Y250Kys7CisJaWYgKChjdXJfamlmZmllcyAtIGJjLT5kZWJ1Z192YWxzLmxhc3RfamlmZmllcykgPj0gSFopIHsKKwkJYmMtPmRlYnVnX3ZhbHMubGFzdF9qaWZmaWVzID0gY3VyX2ppZmZpZXM7CisJCWJjLT5kZWJ1Z192YWxzLmxhc3RfaW50Y250ID0gYmMtPmRlYnVnX3ZhbHMuY3VyX2ludGNudDsKKwkJYmMtPmRlYnVnX3ZhbHMuY3VyX2ludGNudCA9IDA7CisJCWJjLT5kZWJ1Z192YWxzLmxhc3RfcGxsY29yciA9IGJjLT5kZWJ1Z192YWxzLmN1cl9wbGxjb3JyOworCQliYy0+ZGVidWdfdmFscy5jdXJfcGxsY29yciA9IDA7CisJfQorI2VuZGlmIC8qIEJBWUNPTV9ERUJVRyAqLworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogICAgZXBwY29uZmlnX3BhdGggc2hvdWxkIGJlIHNldGFibGUgIHZpYSAvcHJvYy9zeXMuCisgKi8KKworc3RhdGljIGNoYXIgZXBwY29uZmlnX3BhdGhbMjU2XSA9ICIvdXNyL3NiaW4vZXBwZnBnYSI7CisKK3N0YXRpYyBjaGFyICplbnZwW10gPSB7ICJIT01FPS8iLCAiVEVSTT1saW51eCIsICJQQVRIPS91c3IvYmluOi9iaW4iLCBOVUxMIH07CisKKy8qIGVwcGNvbmZpZzogY2FsbGVkIGR1cmluZyBpZmNvbmZpZyB1cCB0byBjb25maWd1cmUgdGhlIG1vZGVtICovCitzdGF0aWMgaW50IGVwcGNvbmZpZyhzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYykKK3sKKwljaGFyIG1vZGVhcmdbMjU2XTsKKwljaGFyIHBvcnRhcmdbMTZdOworICAgICAgICBjaGFyICphcmd2W10gPSB7IGVwcGNvbmZpZ19wYXRoLCAiLXMiLCAiLXAiLCBwb3J0YXJnLCAiLW0iLCBtb2RlYXJnLAorCQkJIE5VTEwgfTsKKworCS8qIHNldCB1cCBhcmd1bWVudHMgKi8KKwlzcHJpbnRmKG1vZGVhcmcsICIlc2Nsaywlc21vZGVtLGZjbGs9JWQsYnBzPSVkLGRpdmlkZXI9JWQlcyxleHRzdGF0IiwKKwkJYmMtPmNmZy5pbnRjbGsgPyAiaW50IiA6ICJleHQiLAorCQliYy0+Y2ZnLmV4dG1vZGVtID8gImV4dCIgOiAiaW50IiwgYmMtPmNmZy5mY2xrLCBiYy0+Y2ZnLmJwcywKKwkJKGJjLT5jZmcuZmNsayArIDggKiBiYy0+Y2ZnLmJwcykgLyAoMTYgKiBiYy0+Y2ZnLmJwcyksCisJCWJjLT5jZmcubG9vcGJhY2sgPyAiLGxvb3BiYWNrIiA6ICIiKTsKKwlzcHJpbnRmKHBvcnRhcmcsICIlbGQiLCBiYy0+cGRldi0+cG9ydC0+YmFzZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcyAtcyAtcCAlcyAtbSAlc1xuIiwgYmNfZHJ2bmFtZSwgZXBwY29uZmlnX3BhdGgsIHBvcnRhcmcsIG1vZGVhcmcpOworCisJcmV0dXJuIGNhbGxfdXNlcm1vZGVoZWxwZXIoZXBwY29uZmlnX3BhdGgsIGFyZ3YsIGVudnAsIDEpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGVwcF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgZG9fa2lzc19wYXJhbXMoc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMsCisJCQkJICB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKworI2lmZGVmIEtJU1NfVkVSQk9TRQorI2RlZmluZSBQS1AoYSxiKSBwcmludGsoS0VSTl9JTkZPICJiYXljb21tX2VwcDogY2hhbm5lbCBwYXJhbXM6ICIgYSAiXG4iLCBiKQorI2Vsc2UgLyogS0lTU19WRVJCT1NFICovCSAgICAgIAorI2RlZmluZSBQS1AoYSxiKSAKKyNlbmRpZiAvKiBLSVNTX1ZFUkJPU0UgKi8JICAgICAgCisKKwlpZiAobGVuIDwgMikKKwkJcmV0dXJuOworCXN3aXRjaChkYXRhWzBdKSB7CisJY2FzZSBQQVJBTV9UWERFTEFZOgorCQliYy0+Y2hfcGFyYW1zLnR4X2RlbGF5ID0gZGF0YVsxXTsKKwkJUEtQKCJUWCBkZWxheSA9ICV1bXMiLCAxMCAqIGJjLT5jaF9wYXJhbXMudHhfZGVsYXkpOworCQlicmVhazsKKwljYXNlIFBBUkFNX1BFUlNJU1Q6ICAgCisJCWJjLT5jaF9wYXJhbXMucHBlcnNpc3QgPSBkYXRhWzFdOworCQlQS1AoInAgcGVyc2lzdGVuY2UgPSAldSIsIGJjLT5jaF9wYXJhbXMucHBlcnNpc3QpOworCQlicmVhazsKKwljYXNlIFBBUkFNX1NMT1RUSU1FOiAgCisJCWJjLT5jaF9wYXJhbXMuc2xvdHRpbWUgPSBkYXRhWzFdOworCQlQS1AoInNsb3QgdGltZSA9ICV1bXMiLCBiYy0+Y2hfcGFyYW1zLnNsb3R0aW1lKTsKKwkJYnJlYWs7CisJY2FzZSBQQVJBTV9UWFRBSUw6ICAgIAorCQliYy0+Y2hfcGFyYW1zLnR4X3RhaWwgPSBkYXRhWzFdOworCQlQS1AoIlRYIHRhaWwgPSAldW1zIiwgYmMtPmNoX3BhcmFtcy50eF90YWlsKTsKKwkJYnJlYWs7CisJY2FzZSBQQVJBTV9GVUxMRFVQOiAgIAorCQliYy0+Y2hfcGFyYW1zLmZ1bGxkdXAgPSAhIWRhdGFbMV07CisJCVBLUCgiJXMgZHVwbGV4IiwgYmMtPmNoX3BhcmFtcy5mdWxsZHVwID8gImZ1bGwiIDogImhhbGYiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorI3VuZGVmIFBLUAorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBoaWdoIHBlcmZvcm1hbmNlIEhETEMgZW5jb2RlcgorICogeWVzLCBpdCdzIHVnbHksIGJ1dCBnZW5lcmF0ZXMgcHJldHR5IGdvb2QgY29kZQorICovCisKKyNkZWZpbmUgRU5DT0RFSVRFUkEoaikgICAgICAgICAgICAgICAgICAgICAgICAgXAorKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghKG5vdGJpdHN0cmVhbSAmICgweDFmMCA8PCBqKSkpICAgIFwKKyAgICAgICAgICAgICAgICBnb3RvIHN0dWZmIyNqOyAgICAgICAgICAgICAgICAgXAorICBlbmNvZGVlbmQjI2o6ICAgIAk7ICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKKyNkZWZpbmUgRU5DT0RFSVRFUkIoaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdHVmZiMjajogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYml0c3RyZWFtICY9IH4oMHgxMDAgPDwgaik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJpdGJ1ZiA9IChiaXRidWYgJiAoKCgyIDw8IGopIDw8IG51bWJpdCkgLSAxKSkgfCAgICAgICAgXAorICAgICAgICAgICAgICAgICgoYml0YnVmICYgfigoKDIgPDwgaikgPDwgbnVtYml0KSAtIDEpKSA8PCAxKTsgIFwKKyAgICAgICAgbnVtYml0Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5vdGJpdHN0cmVhbSA9IH5iaXRzdHJlYW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnb3RvIGVuY29kZWVuZCMjajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKKworc3RhdGljIHZvaWQgZW5jb2RlX2hkbGMoc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICp3cCwgKmJwOworCWludCBwa3RfbGVuOworICAgICAgICB1bnNpZ25lZCBiaXRzdHJlYW0sIG5vdGJpdHN0cmVhbSwgYml0YnVmLCBudW1iaXQsIGNyYzsKKwl1bnNpZ25lZCBjaGFyIGNyY2FyclsyXTsKKwkKKwlpZiAoYmMtPmhkbGN0eC5idWZjbnQgPiAwKQorCQlyZXR1cm47CisJc2tiID0gYmMtPnNrYjsKKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCWJjLT5za2IgPSBOVUxMOworCXBrdF9sZW4gPSBza2ItPmxlbi0xOyAvKiBzdHJpcCBLSVNTIGJ5dGUgKi8KKwl3cCA9IGJjLT5oZGxjdHguYnVmOworCWJwID0gc2tiLT5kYXRhKzE7CisJY3JjID0gY2FsY19jcmNfY2NpdHQoYnAsIHBrdF9sZW4pOworCWNyY2FyclswXSA9IGNyYzsKKwljcmNhcnJbMV0gPSBjcmMgPj4gODsKKwkqd3ArKyA9IDB4N2U7CisJYml0c3RyZWFtID0gYml0YnVmID0gbnVtYml0ID0gMDsKKwl3aGlsZSAocGt0X2xlbiA+IC0yKSB7CisJCWJpdHN0cmVhbSA+Pj0gODsKKwkJYml0c3RyZWFtIHw9ICgodW5zaWduZWQgaW50KSpicCkgPDwgODsKKwkJYml0YnVmIHw9ICgodW5zaWduZWQgaW50KSpicCkgPDwgbnVtYml0OworCQlub3RiaXRzdHJlYW0gPSB+Yml0c3RyZWFtOworCQlicCsrOworCQlwa3RfbGVuLS07CisJCWlmICghcGt0X2xlbikKKwkJCWJwID0gY3JjYXJyOworCQlFTkNPREVJVEVSQSgwKTsKKwkJRU5DT0RFSVRFUkEoMSk7CisJCUVOQ09ERUlURVJBKDIpOworCQlFTkNPREVJVEVSQSgzKTsKKwkJRU5DT0RFSVRFUkEoNCk7CisJCUVOQ09ERUlURVJBKDUpOworCQlFTkNPREVJVEVSQSg2KTsKKwkJRU5DT0RFSVRFUkEoNyk7CisJCWdvdG8gZW5kaXRlcjsKKwkJRU5DT0RFSVRFUkIoMCk7CisJCUVOQ09ERUlURVJCKDEpOworCQlFTkNPREVJVEVSQigyKTsKKwkJRU5DT0RFSVRFUkIoMyk7CisJCUVOQ09ERUlURVJCKDQpOworCQlFTkNPREVJVEVSQig1KTsKKwkJRU5DT0RFSVRFUkIoNik7CisJCUVOQ09ERUlURVJCKDcpOworCWVuZGl0ZXI6CisJCW51bWJpdCArPSA4OworCQl3aGlsZSAobnVtYml0ID49IDgpIHsKKwkJCSp3cCsrID0gYml0YnVmOworCQkJYml0YnVmID4+PSA4OworCQkJbnVtYml0IC09IDg7CisJCX0KKwl9CisJYml0YnVmIHw9IDB4N2U3ZSA8PCBudW1iaXQ7CisJbnVtYml0ICs9IDE2OworCXdoaWxlIChudW1iaXQgPj0gOCkgeworCQkqd3ArKyA9IGJpdGJ1ZjsKKwkJYml0YnVmID4+PSA4OworCQludW1iaXQgLT0gODsKKwl9CisJYmMtPmhkbGN0eC5idWZwdHIgPSBiYy0+aGRsY3R4LmJ1ZjsKKwliYy0+aGRsY3R4LmJ1ZmNudCA9IHdwIC0gYmMtPmhkbGN0eC5idWY7CisJZGV2X2tmcmVlX3NrYihza2IpOworCWJjLT5zdGF0cy50eF9wYWNrZXRzKys7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHJhbmRvbV9zZWVkOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IHJhbmRvbV9udW0odm9pZCkKK3sKKwlyYW5kb21fc2VlZCA9IDI4NjI5ICogcmFuZG9tX3NlZWQgKyAxNTc7CisJcmV0dXJuIHJhbmRvbV9zZWVkOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgdHJhbnNtaXQoc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMsIGludCBjbnQsIHVuc2lnbmVkIGNoYXIgc3RhdCkKK3sKKwlzdHJ1Y3QgcGFycG9ydCAqcHAgPSBiYy0+cGRldi0+cG9ydDsKKwl1bnNpZ25lZCBjaGFyIHRtcFsxMjhdOworCWludCBpLCBqOworCisJaWYgKGJjLT5oZGxjdHguc3RhdGUgPT0gdHhfdGFpbCAmJiAhKHN0YXQgJiBFUFBfUFRUQklUKSkKKwkJYmMtPmhkbGN0eC5zdGF0ZSA9IHR4X2lkbGU7CisJaWYgKGJjLT5oZGxjdHguc3RhdGUgPT0gdHhfaWRsZSAmJiBiYy0+aGRsY3R4LmNhbGlicmF0ZSA8PSAwKSB7CisJCWlmIChiYy0+aGRsY3R4LmJ1ZmNudCA8PSAwKQorCQkJZW5jb2RlX2hkbGMoYmMpOworCQlpZiAoYmMtPmhkbGN0eC5idWZjbnQgPD0gMCkKKwkJCXJldHVybiAwOworCQlpZiAoIWJjLT5jaF9wYXJhbXMuZnVsbGR1cCkgeworCQkJaWYgKCEoc3RhdCAmIEVQUF9EQ0RCSVQpKSB7CisJCQkJYmMtPmhkbGN0eC5zbG90Y250ID0gYmMtPmNoX3BhcmFtcy5zbG90dGltZTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmICgoLS1iYy0+aGRsY3R4LnNsb3RjbnQpID4gMCkKKwkJCQlyZXR1cm4gMDsKKwkJCWJjLT5oZGxjdHguc2xvdGNudCA9IGJjLT5jaF9wYXJhbXMuc2xvdHRpbWU7CisJCQlpZiAoKHJhbmRvbV9udW0oKSAlIDI1NikgPiBiYy0+Y2hfcGFyYW1zLnBwZXJzaXN0KQorCQkJCXJldHVybiAwOworCQl9CisJfQorCWlmIChiYy0+aGRsY3R4LnN0YXRlID09IHR4X2lkbGUgJiYgYmMtPmhkbGN0eC5idWZjbnQgPiAwKSB7CisJCWJjLT5oZGxjdHguc3RhdGUgPSB0eF9rZXl1cDsKKwkJYmMtPmhkbGN0eC5mbGFncyA9IHRlbm1zX3RvX2ZsYWdzKGJjLCBiYy0+Y2hfcGFyYW1zLnR4X2RlbGF5KTsKKwkJYmMtPnB0dF9rZXllZCsrOworCX0KKwl3aGlsZSAoY250ID4gMCkgeworCQlzd2l0Y2ggKGJjLT5oZGxjdHguc3RhdGUpIHsKKwkJY2FzZSB0eF9rZXl1cDoKKwkJCWkgPSBtaW5fdChpbnQsIGNudCwgYmMtPmhkbGN0eC5mbGFncyk7CisJCQljbnQgLT0gaTsKKwkJCWJjLT5oZGxjdHguZmxhZ3MgLT0gaTsKKwkJCWlmIChiYy0+aGRsY3R4LmZsYWdzIDw9IDApCisJCQkJYmMtPmhkbGN0eC5zdGF0ZSA9IHR4X2RhdGE7CisJCQltZW1zZXQodG1wLCAweDdlLCBzaXplb2YodG1wKSk7CisJCQl3aGlsZSAoaSA+IDApIHsKKwkJCQlqID0gKGkgPiBzaXplb2YodG1wKSkgPyBzaXplb2YodG1wKSA6IGk7CisJCQkJaWYgKGogIT0gcHAtPm9wcy0+ZXBwX3dyaXRlX2RhdGEocHAsIHRtcCwgaiwgMCkpCisJCQkJCXJldHVybiAtMTsKKwkJCQlpIC09IGo7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIHR4X2RhdGE6CisJCQlpZiAoYmMtPmhkbGN0eC5idWZjbnQgPD0gMCkgeworCQkJCWVuY29kZV9oZGxjKGJjKTsKKwkJCQlpZiAoYmMtPmhkbGN0eC5idWZjbnQgPD0gMCkgeworCQkJCQliYy0+aGRsY3R4LnN0YXRlID0gdHhfdGFpbDsKKwkJCQkJYmMtPmhkbGN0eC5mbGFncyA9IHRlbm1zX3RvX2ZsYWdzKGJjLCBiYy0+Y2hfcGFyYW1zLnR4X3RhaWwpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpID0gbWluX3QoaW50LCBjbnQsIGJjLT5oZGxjdHguYnVmY250KTsKKwkJCWJjLT5oZGxjdHguYnVmY250IC09IGk7CisJCQljbnQgLT0gaTsKKwkJCWlmIChpICE9IHBwLT5vcHMtPmVwcF93cml0ZV9kYXRhKHBwLCBiYy0+aGRsY3R4LmJ1ZnB0ciwgaSwgMCkpCisJCQkJCXJldHVybiAtMTsKKwkJCWJjLT5oZGxjdHguYnVmcHRyICs9IGk7CisJCQlicmVhazsKKwkJCQorCQljYXNlIHR4X3RhaWw6CisJCQllbmNvZGVfaGRsYyhiYyk7CisJCQlpZiAoYmMtPmhkbGN0eC5idWZjbnQgPiAwKSB7CisJCQkJYmMtPmhkbGN0eC5zdGF0ZSA9IHR4X2RhdGE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpID0gbWluX3QoaW50LCBjbnQsIGJjLT5oZGxjdHguZmxhZ3MpOworCQkJaWYgKGkpIHsKKwkJCQljbnQgLT0gaTsKKwkJCQliYy0+aGRsY3R4LmZsYWdzIC09IGk7CisJCQkJbWVtc2V0KHRtcCwgMHg3ZSwgc2l6ZW9mKHRtcCkpOworCQkJCXdoaWxlIChpID4gMCkgeworCQkJCQlqID0gKGkgPiBzaXplb2YodG1wKSkgPyBzaXplb2YodG1wKSA6IGk7CisJCQkJCWlmIChqICE9IHBwLT5vcHMtPmVwcF93cml0ZV9kYXRhKHBwLCB0bXAsIGosIDApKQorCQkJCQkJcmV0dXJuIC0xOworCQkJCQlpIC09IGo7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCWRlZmF1bHQ6ICAvKiBmYWxsIHRocm91Z2ggKi8KKwkJCWlmIChiYy0+aGRsY3R4LmNhbGlicmF0ZSA8PSAwKQorCQkJCXJldHVybiAwOworCQkJaSA9IG1pbl90KGludCwgY250LCBiYy0+aGRsY3R4LmNhbGlicmF0ZSk7CisJCQljbnQgLT0gaTsKKwkJCWJjLT5oZGxjdHguY2FsaWJyYXRlIC09IGk7CisJCQltZW1zZXQodG1wLCAwLCBzaXplb2YodG1wKSk7CisJCQl3aGlsZSAoaSA+IDApIHsKKwkJCQlqID0gKGkgPiBzaXplb2YodG1wKSkgPyBzaXplb2YodG1wKSA6IGk7CisJCQkJaWYgKGogIT0gcHAtPm9wcy0+ZXBwX3dyaXRlX2RhdGEocHAsIHRtcCwgaiwgMCkpCisJCQkJCXJldHVybiAtMTsKKwkJCQlpIC09IGo7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBkb19yeHBhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgKmNwOworCXVuc2lnbmVkIHBrdGxlbjsKKworCWlmIChiYy0+aGRsY3J4LmJ1ZmNudCA8IDQpIAorCQlyZXR1cm47CisJaWYgKCFjaGVja19jcmNfY2NpdHQoYmMtPmhkbGNyeC5idWYsIGJjLT5oZGxjcnguYnVmY250KSkgCisJCXJldHVybjsKKwlwa3RsZW4gPSBiYy0+aGRsY3J4LmJ1ZmNudC0yKzE7IC8qIEtJU1Mga2x1ZGdlICovCisJaWYgKCEoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RsZW4pKSkgeworCQlwcmludGsoIiVzOiBtZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0XG4iLCBkZXYtPm5hbWUpOworCQliYy0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCXNrYi0+ZGV2ID0gZGV2OworCWNwID0gc2tiX3B1dChza2IsIHBrdGxlbik7CisJKmNwKysgPSAwOyAvKiBLSVNTIGtsdWRnZSAqLworCW1lbWNweShjcCwgYmMtPmhkbGNyeC5idWYsIHBrdGxlbiAtIDEpOworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9BWDI1KTsKKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJbmV0aWZfcngoc2tiKTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCWJjLT5zdGF0cy5yeF9wYWNrZXRzKys7Cit9CisKKyNkZWZpbmUgREVDT0RFSVRFUkEoaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCEobm90Yml0c3RyZWFtICYgKDB4MGZjIDw8IGopKSkgICAgICAgICAgICAgIC8qIGZsYWcgb3IgYWJvcnQgKi8gIFwKKyAgICAgICAgICAgICAgICBnb3RvIGZsZ2FicnQjI2o7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChiaXRzdHJlYW0gJiAoMHgxZjggPDwgaikpID09ICgweGY4IDw8IGopKSAgIC8qIHN0dWZmZWQgYml0ICovICAgIFwKKyAgICAgICAgICAgICAgICBnb3RvIHN0dWZmIyNqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZW5kaXRlciMjajogICAgICA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorCisjZGVmaW5lIERFQ09ERUlURVJCKGopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZsZ2FicnQjI2o6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghKG5vdGJpdHN0cmVhbSAmICgweDFmYyA8PCBqKSkpIHsgICAgICAgICAgICAgIC8qIGFib3J0IHJlY2VpdmVkICovICAgICAgICBcCisgICAgICAgICAgICAgICAgc3RhdGUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZ290byBlbmRpdGVyIyNqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoYml0c3RyZWFtICYgKDB4MWZlIDw8IGopKSAhPSAoMHgwZmMgPDwgaikpICAgLyogZmxhZyByZWNlaXZlZCAqLyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZ290byBlbmRpdGVyIyNqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChzdGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZG9fcnhwYWNrZXQoZGV2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJjLT5oZGxjcnguYnVmY250ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJjLT5oZGxjcnguYnVmcHRyID0gYmMtPmhkbGNyeC5idWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRlID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG51bWJpdHMgPSA3LWo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGdvdG8gZW5kaXRlciMjajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0dWZmIyNqOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG51bWJpdHMtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJpdGJ1ZiA9IChiaXRidWYgJiAoKH4weGZmKSA8PCBqKSkgfCAoKGJpdGJ1ZiAmIH4oKH4weGZmKSA8PCBqKSkgPDwgMSk7ICAgICAgICBcCisgICAgICAgIGdvdG8gZW5kaXRlciMjajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorICAgICAgICAKK3N0YXRpYyBpbnQgcmVjZWl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY250KQoreworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGFycG9ydCAqcHAgPSBiYy0+cGRldi0+cG9ydDsKKyAgICAgICAgdW5zaWduZWQgaW50IGJpdGJ1Ziwgbm90Yml0c3RyZWFtLCBiaXRzdHJlYW0sIG51bWJpdHMsIHN0YXRlOworCXVuc2lnbmVkIGNoYXIgdG1wWzEyOF07CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKmNwOworCWludCBjbnQyLCByZXQgPSAwOworICAgICAgICAKKyAgICAgICAgbnVtYml0cyA9IGJjLT5oZGxjcngubnVtYml0czsKKwlzdGF0ZSA9IGJjLT5oZGxjcnguc3RhdGU7CisJYml0c3RyZWFtID0gYmMtPmhkbGNyeC5iaXRzdHJlYW07CisJYml0YnVmID0gYmMtPmhkbGNyeC5iaXRidWY7CisJd2hpbGUgKGNudCA+IDApIHsKKwkJY250MiA9IChjbnQgPiBzaXplb2YodG1wKSkgPyBzaXplb2YodG1wKSA6IGNudDsKKwkJY250IC09IGNudDI7CisJCWlmIChjbnQyICE9IHBwLT5vcHMtPmVwcF9yZWFkX2RhdGEocHAsIHRtcCwgY250MiwgMCkpIHsKKwkJCXJldCA9IC0xOworCQkJYnJlYWs7CisJCX0KKwkJY3AgPSB0bXA7CisJCWZvciAoOyBjbnQyID4gMDsgY250Mi0tLCBjcCsrKSB7CisJCQliaXRzdHJlYW0gPj49IDg7CisJCQliaXRzdHJlYW0gfD0gKCpjcCkgPDwgODsKKwkJCWJpdGJ1ZiA+Pj0gODsKKwkJCWJpdGJ1ZiB8PSAoKmNwKSA8PCA4OworCQkJbnVtYml0cyArPSA4OworCQkJbm90Yml0c3RyZWFtID0gfmJpdHN0cmVhbTsKKwkJCURFQ09ERUlURVJBKDApOworCQkJREVDT0RFSVRFUkEoMSk7CisJCQlERUNPREVJVEVSQSgyKTsKKwkJCURFQ09ERUlURVJBKDMpOworCQkJREVDT0RFSVRFUkEoNCk7CisJCQlERUNPREVJVEVSQSg1KTsKKwkJCURFQ09ERUlURVJBKDYpOworCQkJREVDT0RFSVRFUkEoNyk7CisJCQlnb3RvIGVuZGRlYzsKKwkJCURFQ09ERUlURVJCKDApOworCQkJREVDT0RFSVRFUkIoMSk7CisJCQlERUNPREVJVEVSQigyKTsKKwkJCURFQ09ERUlURVJCKDMpOworCQkJREVDT0RFSVRFUkIoNCk7CisJCQlERUNPREVJVEVSQig1KTsKKwkJCURFQ09ERUlURVJCKDYpOworCQkJREVDT0RFSVRFUkIoNyk7CisJCWVuZGRlYzoKKwkJCXdoaWxlIChzdGF0ZSAmJiBudW1iaXRzID49IDgpIHsKKwkJCQlpZiAoYmMtPmhkbGNyeC5idWZjbnQgPj0gVFhCVUZGRVJfU0laRSkgeworCQkJCQlzdGF0ZSA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJKihiYy0+aGRsY3J4LmJ1ZnB0cikrKyA9IGJpdGJ1ZiA+PiAoMTYtbnVtYml0cyk7CisJCQkJCWJjLT5oZGxjcnguYnVmY250Kys7CisJCQkJCW51bWJpdHMgLT0gODsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisgICAgICAgIGJjLT5oZGxjcngubnVtYml0cyA9IG51bWJpdHM7CisJYmMtPmhkbGNyeC5zdGF0ZSA9IHN0YXRlOworCWJjLT5oZGxjcnguYml0c3RyZWFtID0gYml0c3RyZWFtOworCWJjLT5oZGxjcnguYml0YnVmID0gYml0YnVmOworCXJldHVybiByZXQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgX19pMzg2X18KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjZGVmaW5lIEdFVFRJQ0soeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKGNwdV9oYXNfdHNjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJcmR0c2NsKHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorI2Vsc2UgLyogX19pMzg2X18gKi8KKyNkZWZpbmUgR0VUVElDSyh4KQorI2VuZGlmIC8qIF9faTM4Nl9fICovCisKK3N0YXRpYyB2b2lkIGVwcF9iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjOworCXN0cnVjdCBwYXJwb3J0ICpwcDsKKwl1bnNpZ25lZCBjaGFyIHN0YXQ7CisJdW5zaWduZWQgY2hhciB0bXBbMl07CisJdW5zaWduZWQgaW50IHRpbWUxID0gMCwgdGltZTIgPSAwLCB0aW1lMyA9IDA7CisJaW50IGNudCwgY250MjsKKwkKKwliYyA9IG5ldGRldl9wcml2KGRldik7CisJaWYgKCFiYy0+d29ya19ydW5uaW5nKQorCQlyZXR1cm47CisJYmF5Y29tX2ludF9mcmVxKGJjKTsKKwlwcCA9IGJjLT5wZGV2LT5wb3J0OworCS8qIHVwZGF0ZSBzdGF0dXMgKi8KKwlpZiAocHAtPm9wcy0+ZXBwX3JlYWRfYWRkcihwcCwgJnN0YXQsIDEsIDApICE9IDEpCisJCWdvdG8gZXBwdGltZW91dDsKKwliYy0+c3RhdCA9IHN0YXQ7CisJYmMtPmRlYnVnX3ZhbHMubGFzdF9wbGxjb3JyID0gc3RhdDsKKwlHRVRUSUNLKHRpbWUxKTsKKwlpZiAoYmMtPm1vZGVtID09IEVQUF9GUEdBRVhUU1RBVFVTKSB7CisJCS8qIGdldCBpbnB1dCBjb3VudCAqLworCQl0bXBbMF0gPSBFUFBfVFhfRklGT19FTkFCTEV8RVBQX1JYX0ZJRk9fRU5BQkxFfEVQUF9NT0RFTV9FTkFCTEV8MTsKKwkJaWYgKHBwLT5vcHMtPmVwcF93cml0ZV9hZGRyKHBwLCB0bXAsIDEsIDApICE9IDEpCisJCQlnb3RvIGVwcHRpbWVvdXQ7CisJCWlmIChwcC0+b3BzLT5lcHBfcmVhZF9hZGRyKHBwLCB0bXAsIDIsIDApICE9IDIpCisJCQlnb3RvIGVwcHRpbWVvdXQ7CisJCWNudCA9IHRtcFswXSB8ICh0bXBbMV0gPDwgOCk7CisJCWNudCAmPSAweDdmZmY7CisJCS8qIGdldCBvdXRwdXQgY291bnQgKi8KKwkJdG1wWzBdID0gRVBQX1RYX0ZJRk9fRU5BQkxFfEVQUF9SWF9GSUZPX0VOQUJMRXxFUFBfTU9ERU1fRU5BQkxFfDI7CisJCWlmIChwcC0+b3BzLT5lcHBfd3JpdGVfYWRkcihwcCwgdG1wLCAxLCAwKSAhPSAxKQorCQkJZ290byBlcHB0aW1lb3V0OworCQlpZiAocHAtPm9wcy0+ZXBwX3JlYWRfYWRkcihwcCwgdG1wLCAyLCAwKSAhPSAyKQorCQkJZ290byBlcHB0aW1lb3V0OworCQljbnQyID0gdG1wWzBdIHwgKHRtcFsxXSA8PCA4KTsKKwkJY250MiA9IDE2Mzg0IC0gKGNudDIgJiAweDdmZmYpOworCQkvKiByZXR1cm4gdG8gbm9ybWFsICovCisJCXRtcFswXSA9IEVQUF9UWF9GSUZPX0VOQUJMRXxFUFBfUlhfRklGT19FTkFCTEV8RVBQX01PREVNX0VOQUJMRTsKKwkJaWYgKHBwLT5vcHMtPmVwcF93cml0ZV9hZGRyKHBwLCB0bXAsIDEsIDApICE9IDEpCisJCQlnb3RvIGVwcHRpbWVvdXQ7CisJCWlmICh0cmFuc21pdChiYywgY250Miwgc3RhdCkpCisJCQlnb3RvIGVwcHRpbWVvdXQ7CisJCUdFVFRJQ0sodGltZTIpOworCQlpZiAocmVjZWl2ZShkZXYsIGNudCkpCisJCQlnb3RvIGVwcHRpbWVvdXQ7CisJCWlmIChwcC0+b3BzLT5lcHBfcmVhZF9hZGRyKHBwLCAmc3RhdCwgMSwgMCkgIT0gMSkKKwkJCWdvdG8gZXBwdGltZW91dDsKKwkJYmMtPnN0YXQgPSBzdGF0OworCX0gZWxzZSB7CisJCS8qIHRyeSB0byB0eCAqLworCQlzd2l0Y2ggKHN0YXQgJiAoRVBQX05UQUVGfEVQUF9OVEhGKSkgeworCQljYXNlIEVQUF9OVEhGOgorCQkJY250ID0gMjA0OCAtIDI1NjsKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBFUFBfTlRBRUY6CisJCQljbnQgPSAyMDQ4IC0gMTc5MzsKKwkJCWJyZWFrOworCQkKKwkJY2FzZSAwOgorCQkJY250ID0gMDsKKwkJCWJyZWFrOworCQkKKwkJZGVmYXVsdDoKKwkJCWNudCA9IDIwNDggLSAxMDI1OworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHRyYW5zbWl0KGJjLCBjbnQsIHN0YXQpKQorCQkJZ290byBlcHB0aW1lb3V0OworCQlHRVRUSUNLKHRpbWUyKTsKKwkJLyogZG8gcmVjZWl2ZXIgKi8KKwkJd2hpbGUgKChzdGF0ICYgKEVQUF9OUkFFRnxFUFBfTlJIRikpICE9IEVQUF9OUkhGKSB7CisJCQlzd2l0Y2ggKHN0YXQgJiAoRVBQX05SQUVGfEVQUF9OUkhGKSkgeworCQkJY2FzZSBFUFBfTlJBRUY6CisJCQkJY250ID0gMTAyNTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAwOgorCQkJCWNudCA9IDE3OTM7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJY250ID0gMjU2OworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHJlY2VpdmUoZGV2LCBjbnQpKQorCQkJCWdvdG8gZXBwdGltZW91dDsKKwkJCWlmIChwcC0+b3BzLT5lcHBfcmVhZF9hZGRyKHBwLCAmc3RhdCwgMSwgMCkgIT0gMSkKKwkJCQlnb3RvIGVwcHRpbWVvdXQ7CisJCX0KKwkJY250ID0gMDsKKwkJaWYgKGJjLT5iaXRyYXRlIDwgNTAwMDApCisJCQljbnQgPSAyNTY7CisJCWVsc2UgaWYgKGJjLT5iaXRyYXRlIDwgMTAwMDAwKQorCQkJY250ID0gMTI4OworCQl3aGlsZSAoY250ID4gMCAmJiBzdGF0ICYgRVBQX05SRUYpIHsKKwkJCWlmIChyZWNlaXZlKGRldiwgMSkpCisJCQkJZ290byBlcHB0aW1lb3V0OworCQkJY250LS07CisJCQlpZiAocHAtPm9wcy0+ZXBwX3JlYWRfYWRkcihwcCwgJnN0YXQsIDEsIDApICE9IDEpCisJCQkJZ290byBlcHB0aW1lb3V0OworCQl9CisJfQorCUdFVFRJQ0sodGltZTMpOworI2lmZGVmIEJBWUNPTV9ERUJVRworCWJjLT5kZWJ1Z192YWxzLm1vZF9jeWNsZXMgPSB0aW1lMiAtIHRpbWUxOworCWJjLT5kZWJ1Z192YWxzLmRlbW9kX2N5Y2xlcyA9IHRpbWUzIC0gdGltZTI7CisjZW5kaWYgLyogQkFZQ09NX0RFQlVHICovCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZiYy0+cnVuX3dvcmssIDEpOworCWlmICghYmMtPnNrYikKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXJldHVybjsKKyBlcHB0aW1lb3V0OgorCXByaW50ayhLRVJOX0VSUiAiJXM6IEVQUCB0aW1lb3V0IVxuIiwgYmNfZHJ2bmFtZSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT0gbmV0d29yayBkcml2ZXIgaW50ZXJmYWNlID09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitzdGF0aWMgaW50IGJheWNvbV9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChza2ItPmRhdGFbMF0gIT0gMCkgeworCQlkb19raXNzX3BhcmFtcyhiYywgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChiYy0+c2tiKQorCQlyZXR1cm4gLTE7CisJLyogc3RyaXAgS0lTUyBieXRlICovCisJaWYgKHNrYi0+bGVuID49IEhETENEUlZfTUFYRkxFTisxIHx8IHNrYi0+bGVuIDwgMykgeworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJYmMtPnNrYiA9IHNrYjsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgYmF5Y29tX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBzb2NrYWRkciAqc2EgPSAoc3RydWN0IHNvY2thZGRyICopYWRkcjsKKworCS8qIGFkZHIgaXMgYW4gQVguMjUgc2hpZnRlZCBBU0NJSSBtYWMgYWRkcmVzcyAqLworCW1lbWNweShkZXYtPmRldl9hZGRyLCBzYS0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7IAorCXJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmJheWNvbV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYyA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiAKKwkgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4gIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZQorCSAqIGNhcmQgb3BlbiBvciBjbG9zZWQuIAorCSAqLworCXJldHVybiAmYmMtPnN0YXRzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgZXBwX3dha2V1cCh2b2lkICpoYW5kbGUpCit7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKiloYW5kbGU7CisgICAgICAgIHN0cnVjdCBiYXljb21fc3RhdGUgKmJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiYmF5Y29tX2VwcDogJXM6IHdoeSBhbSBJIGJlaW5nIHdva2VuIHVwP1xuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgaWYgKCFwYXJwb3J0X2NsYWltKGJjLT5wZGV2KSkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiYmF5Y29tX2VwcDogJXM6IEknbSBicm9rZW4uXG4iLCBkZXYtPm5hbWUpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIE9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuIFRoaXMgaXMgY2FsbGVkIChpbiB0aGUgY3VycmVudCBrZXJuZWwpCisgKiBzb21ldGltZSBhZnRlciBib290aW5nIHdoZW4gdGhlICdpZmNvbmZpZycgcHJvZ3JhbSBpcyBydW4uCisgKgorICogVGhpcyByb3V0aW5lIHNob3VsZCBzZXQgZXZlcnl0aGluZyB1cCBhbmV3IGF0IGVhY2ggb3BlbiwgZXZlbgorICogcmVnaXN0ZXJzIHRoYXQgInNob3VsZCIgb25seSBuZWVkIHRvIGJlIHNldCBvbmNlIGF0IGJvb3QsIHNvIHRoYXQKKyAqIHRoZXJlIGlzIG5vbi1yZWJvb3Qgd2F5IHRvIHJlY292ZXIgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuCisgKi8KKworc3RhdGljIGludCBlcHBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgc3RydWN0IHBhcnBvcnQgKnBwID0gcGFycG9ydF9maW5kX2Jhc2UoZGV2LT5iYXNlX2FkZHIpOworCXVuc2lnbmVkIGludCBpLCBqOworCXVuc2lnbmVkIGNoYXIgdG1wWzEyOF07CisJdW5zaWduZWQgY2hhciBzdGF0OworCXVuc2lnbmVkIGxvbmcgdHN0YXJ0OworCQorICAgICAgICBpZiAoIXBwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogcGFycG9ydCBhdCAweCVseCB1bmtub3duXG4iLCBiY19kcnZuYW1lLCBkZXYtPmJhc2VfYWRkcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTlhJTzsKKyAgICAgICAgfQorI2lmIDAKKyAgICAgICAgaWYgKHBwLT5pcnEgPCAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogcGFycG9ydCBhdCAweCVseCBoYXMgbm8gaXJxXG4iLCBiY19kcnZuYW1lLCBwcC0+YmFzZSk7CisJCXBhcnBvcnRfcHV0X3BvcnQocHApOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5YSU87CisgICAgICAgIH0KKyNlbmRpZgorCWlmICgofnBwLT5tb2RlcykgJiAoUEFSUE9SVF9NT0RFX1RSSVNUQVRFIHwgUEFSUE9SVF9NT0RFX1BDU1BQIHwgUEFSUE9SVF9NT0RFX1NBRkVJTklOVCkpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBwYXJwb3J0IGF0IDB4JWx4IGNhbm5vdCBiZSB1c2VkXG4iLAorCQkgICAgICAgYmNfZHJ2bmFtZSwgcHAtPmJhc2UpOworCQlwYXJwb3J0X3B1dF9wb3J0KHBwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKKwl9CisJbWVtc2V0KCZiYy0+bW9kZW0sIDAsIHNpemVvZihiYy0+bW9kZW0pKTsKKyAgICAgICAgYmMtPnBkZXYgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwcCwgZGV2LT5uYW1lLCBOVUxMLCBlcHBfd2FrZXVwLCAKKwkJCQkJZXBwX2ludGVycnVwdCwgUEFSUE9SVF9ERVZfRVhDTCwgZGV2KTsKKwlwYXJwb3J0X3B1dF9wb3J0KHBwKTsKKyAgICAgICAgaWYgKCFiYy0+cGRldikgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCByZWdpc3RlciBwYXJwb3J0IGF0IDB4JWx4XG4iLCBiY19kcnZuYW1lLCBwcC0+YmFzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTlhJTzsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFycG9ydF9jbGFpbShiYy0+cGRldikpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBwYXJwb3J0IGF0IDB4JWx4IGJ1c3lcbiIsIGJjX2Rydm5hbWUsIHBwLT5iYXNlKTsKKyAgICAgICAgICAgICAgICBwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKGJjLT5wZGV2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICB9CisgICAgICAgIGRldi0+aXJxID0gLypwcC0+aXJxKi8gMDsKKwlJTklUX1dPUksoJmJjLT5ydW5fd29yaywgKHZvaWQgKikodm9pZCAqKWVwcF9iaCwgZGV2KTsKKwliYy0+d29ya19ydW5uaW5nID0gMTsKKwliYy0+bW9kZW0gPSBFUFBfQ09OVkVOVElPTkFMOworCWlmIChlcHBjb25maWcoYmMpKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogbm8gRlBHQSBkZXRlY3RlZCwgYXNzdW1pbmcgY29udmVudGlvbmFsIEVQUCBtb2RlbVxuIiwgYmNfZHJ2bmFtZSk7CisJZWxzZQorCQliYy0+bW9kZW0gPSAvKkVQUF9GUEdBKi8gRVBQX0ZQR0FFWFRTVEFUVVM7CisJcGFycG9ydF93cml0ZV9jb250cm9sKHBwLCBMUFRDVFJMX1BST0dSQU0pOyAvKiBwcmVwYXJlIEVQUCBtb2RlOyB3ZSBhcmVuJ3QgdXNpbmcgaW50ZXJydXB0cyAqLworCS8qIHJlc2V0IHRoZSBtb2RlbSAqLworCXRtcFswXSA9IDA7CisJdG1wWzFdID0gRVBQX1RYX0ZJRk9fRU5BQkxFfEVQUF9SWF9GSUZPX0VOQUJMRXxFUFBfTU9ERU1fRU5BQkxFOworCWlmIChwcC0+b3BzLT5lcHBfd3JpdGVfYWRkcihwcCwgdG1wLCAyLCAwKSAhPSAyKQorCQlnb3RvIGVwcHRpbWVvdXQ7CisJLyogYXV0b3Byb2JlIGJhdWQgcmF0ZSAqLworCXRzdGFydCA9IGppZmZpZXM7CisJaSA9IDA7CisJd2hpbGUgKChzaWduZWQpKGppZmZpZXMtdHN0YXJ0LUhaLzMpIDwgMCkgeworCQlpZiAocHAtPm9wcy0+ZXBwX3JlYWRfYWRkcihwcCwgJnN0YXQsIDEsIDApICE9IDEpCisJCQlnb3RvIGVwcHRpbWVvdXQ7CisJCWlmICgoc3RhdCAmIChFUFBfTlJBRUZ8RVBQX05SSEYpKSA9PSBFUFBfTlJIRikgeworCQkJc2NoZWR1bGUoKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChwcC0+b3BzLT5lcHBfcmVhZF9kYXRhKHBwLCB0bXAsIDEyOCwgMCkgIT0gMTI4KQorCQkJZ290byBlcHB0aW1lb3V0OworCQlpZiAocHAtPm9wcy0+ZXBwX3JlYWRfZGF0YShwcCwgdG1wLCAxMjgsIDApICE9IDEyOCkKKwkJCWdvdG8gZXBwdGltZW91dDsKKwkJaSArPSAyNTY7CisJfQorCWZvciAoaiA9IDA7IGogPCAyNTY7IGorKykgeworCQlpZiAocHAtPm9wcy0+ZXBwX3JlYWRfYWRkcihwcCwgJnN0YXQsIDEsIDApICE9IDEpCisJCQlnb3RvIGVwcHRpbWVvdXQ7CisJCWlmICghKHN0YXQgJiBFUFBfTlJFRikpCisJCQlicmVhazsKKwkJaWYgKHBwLT5vcHMtPmVwcF9yZWFkX2RhdGEocHAsIHRtcCwgMSwgMCkgIT0gMSkKKwkJCWdvdG8gZXBwdGltZW91dDsKKwkJaSsrOworCX0KKwl0c3RhcnQgPSBqaWZmaWVzIC0gdHN0YXJ0OworCWJjLT5iaXRyYXRlID0gaSAqICg4ICogSFopIC8gdHN0YXJ0OworCWogPSAxOworCWkgPSBiYy0+Yml0cmF0ZSA+PiAzOworCXdoaWxlIChqIDwgNyAmJiBpID4gMTUwKSB7CisJCWorKzsKKwkJaSA+Pj0gMTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGF1dG9wcm9iZWQgYml0cmF0ZTogJWQgIGludCBkaXZpZGVyOiAlZCAgaW50IHJhdGU6ICVkXG4iLCAKKwkgICAgICAgYmNfZHJ2bmFtZSwgYmMtPmJpdHJhdGUsIGosIGJjLT5iaXRyYXRlID4+IChqKzIpKTsKKwl0bXBbMF0gPSBFUFBfVFhfRklGT19FTkFCTEV8RVBQX1JYX0ZJRk9fRU5BQkxFfEVQUF9NT0RFTV9FTkFCTEUvKnxqKi87CisJaWYgKHBwLT5vcHMtPmVwcF93cml0ZV9hZGRyKHBwLCB0bXAsIDEsIDApICE9IDEpCisJCWdvdG8gZXBwdGltZW91dDsKKwkvKgorCSAqIGluaXRpYWxpc2UgaGRsYyB2YXJpYWJsZXMKKwkgKi8KKwliYy0+aGRsY3J4LnN0YXRlID0gMDsKKwliYy0+aGRsY3J4Lm51bWJpdHMgPSAwOworCWJjLT5oZGxjdHguc3RhdGUgPSB0eF9pZGxlOworCWJjLT5oZGxjdHguYnVmY250ID0gMDsKKwliYy0+aGRsY3R4LnNsb3RjbnQgPSBiYy0+Y2hfcGFyYW1zLnNsb3R0aW1lOworCWJjLT5oZGxjdHguY2FsaWJyYXRlID0gMDsKKwkvKiBzdGFydCB0aGUgYm90dG9tIGhhbGYgc3R1ZmYgKi8KKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJjLT5ydW5fd29yaywgMSk7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKKworIGVwcHRpbWVvdXQ6CisJcHJpbnRrKEtFUk5fRVJSICIlczogZXBwIHRpbWVvdXQgZHVyaW5nIGJpdHJhdGUgcHJvYmVcbiIsIGJjX2Rydm5hbWUpOworCXBhcnBvcnRfd3JpdGVfY29udHJvbChwcCwgMCk7IC8qIHJlc2V0IHRoZSBhZGFwdGVyICovCisgICAgICAgIHBhcnBvcnRfcmVsZWFzZShiYy0+cGRldik7CisgICAgICAgIHBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UoYmMtPnBkZXYpOworCXJldHVybiAtRUlPOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBlcHBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYyA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBhcnBvcnQgKnBwID0gYmMtPnBkZXYtPnBvcnQ7CisJdW5zaWduZWQgY2hhciB0bXBbMV07CisKKwliYy0+d29ya19ydW5uaW5nID0gMDsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCWJjLT5zdGF0ID0gRVBQX0RDREJJVDsKKwl0bXBbMF0gPSAwOworCXBwLT5vcHMtPmVwcF93cml0ZV9hZGRyKHBwLCB0bXAsIDEsIDApOworCXBhcnBvcnRfd3JpdGVfY29udHJvbChwcCwgMCk7IC8qIHJlc2V0IHRoZSBhZGFwdGVyICovCisgICAgICAgIHBhcnBvcnRfcmVsZWFzZShiYy0+cGRldik7CisgICAgICAgIHBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UoYmMtPnBkZXYpOworCWlmIChiYy0+c2tiKQorCQlkZXZfa2ZyZWVfc2tiKGJjLT5za2IpOworCWJjLT5za2IgPSBOVUxMOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBjbG9zZSBlcHAgYXQgaW9iYXNlIDB4JWx4IGlycSAldVxuIiwKKwkgICAgICAgYmNfZHJ2bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgYmF5Y29tX3NldG1vZGUoc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMsIGNvbnN0IGNoYXIgKm1vZGVzdHIpCit7CisJY29uc3QgY2hhciAqY3A7CisKKwlpZiAoc3Ryc3RyKG1vZGVzdHIsImludGNsayIpKQorCQliYy0+Y2ZnLmludGNsayA9IDE7CisJaWYgKHN0cnN0cihtb2Rlc3RyLCJleHRjbGsiKSkKKwkJYmMtPmNmZy5pbnRjbGsgPSAwOworCWlmIChzdHJzdHIobW9kZXN0ciwiaW50bW9kZW0iKSkKKwkJYmMtPmNmZy5leHRtb2RlbSA9IDA7CisJaWYgKHN0cnN0cihtb2Rlc3RyLCJleHRtb2RlbSIpKQorCQliYy0+Y2ZnLmV4dG1vZGVtID0gMTsKKwlpZiAoc3Ryc3RyKG1vZGVzdHIsIm5vbG9vcGJhY2siKSkKKwkJYmMtPmNmZy5sb29wYmFjayA9IDA7CisJaWYgKHN0cnN0cihtb2Rlc3RyLCJsb29wYmFjayIpKQorCQliYy0+Y2ZnLmxvb3BiYWNrID0gMTsKKwlpZiAoKGNwID0gc3Ryc3RyKG1vZGVzdHIsImZjbGs9IikpKSB7CisJCWJjLT5jZmcuZmNsayA9IHNpbXBsZV9zdHJ0b3VsKGNwKzUsIE5VTEwsIDApOworCQlpZiAoYmMtPmNmZy5mY2xrIDwgMTAwMDAwMCkKKwkJCWJjLT5jZmcuZmNsayA9IDEwMDAwMDA7CisJCWlmIChiYy0+Y2ZnLmZjbGsgPiAyNTAwMDAwMCkKKwkJCWJjLT5jZmcuZmNsayA9IDI1MDAwMDAwOworCX0KKwlpZiAoKGNwID0gc3Ryc3RyKG1vZGVzdHIsImJwcz0iKSkpIHsKKwkJYmMtPmNmZy5icHMgPSBzaW1wbGVfc3RydG91bChjcCs0LCBOVUxMLCAwKTsKKwkJaWYgKGJjLT5jZmcuYnBzIDwgMTAwMCkKKwkJCWJjLT5jZmcuYnBzID0gMTAwMDsKKwkJaWYgKGJjLT5jZmcuYnBzID4gMTUwMDAwMCkKKwkJCWJjLT5jZmcuYnBzID0gMTUwMDAwMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGJheWNvbV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYyA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGhkbGNkcnZfaW9jdGwgaGk7CisKKwlpZiAoY21kICE9IFNJT0NERVZQUklWQVRFKQorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZoaSwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKGhpKSkpCisJCXJldHVybiAtRUZBVUxUOworCXN3aXRjaCAoaGkuY21kKSB7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworCWNhc2UgSERMQ0RSVkNUTF9HRVRDSEFOTkVMUEFSOgorCQloaS5kYXRhLmNwLnR4X2RlbGF5ID0gYmMtPmNoX3BhcmFtcy50eF9kZWxheTsKKwkJaGkuZGF0YS5jcC50eF90YWlsID0gYmMtPmNoX3BhcmFtcy50eF90YWlsOworCQloaS5kYXRhLmNwLnNsb3R0aW1lID0gYmMtPmNoX3BhcmFtcy5zbG90dGltZTsKKwkJaGkuZGF0YS5jcC5wcGVyc2lzdCA9IGJjLT5jaF9wYXJhbXMucHBlcnNpc3Q7CisJCWhpLmRhdGEuY3AuZnVsbGR1cCA9IGJjLT5jaF9wYXJhbXMuZnVsbGR1cDsKKwkJYnJlYWs7CisKKwljYXNlIEhETENEUlZDVExfU0VUQ0hBTk5FTFBBUjoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCWJjLT5jaF9wYXJhbXMudHhfZGVsYXkgPSBoaS5kYXRhLmNwLnR4X2RlbGF5OworCQliYy0+Y2hfcGFyYW1zLnR4X3RhaWwgPSBoaS5kYXRhLmNwLnR4X3RhaWw7CisJCWJjLT5jaF9wYXJhbXMuc2xvdHRpbWUgPSBoaS5kYXRhLmNwLnNsb3R0aW1lOworCQliYy0+Y2hfcGFyYW1zLnBwZXJzaXN0ID0gaGkuZGF0YS5jcC5wcGVyc2lzdDsKKwkJYmMtPmNoX3BhcmFtcy5mdWxsZHVwID0gaGkuZGF0YS5jcC5mdWxsZHVwOworCQliYy0+aGRsY3R4LnNsb3RjbnQgPSAxOworCQlyZXR1cm4gMDsKKwkJCisJY2FzZSBIRExDRFJWQ1RMX0dFVE1PREVNUEFSOgorCQloaS5kYXRhLm1wLmlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCQloaS5kYXRhLm1wLmlycSA9IGRldi0+aXJxOworCQloaS5kYXRhLm1wLmRtYSA9IGRldi0+ZG1hOworCQloaS5kYXRhLm1wLmRtYTIgPSAwOworCQloaS5kYXRhLm1wLnNlcmlvYmFzZSA9IDA7CisJCWhpLmRhdGEubXAucGFyaW9iYXNlID0gMDsKKwkJaGkuZGF0YS5tcC5taWRpaW9iYXNlID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIEhETENEUlZDVExfU0VUTU9ERU1QQVI6CisJCWlmICgoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpIHx8IG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQlkZXYtPmJhc2VfYWRkciA9IGhpLmRhdGEubXAuaW9iYXNlOworCQlkZXYtPmlycSA9IC8qaGkuZGF0YS5tcC5pcnEqLzA7CisJCWRldi0+ZG1hID0gLypoaS5kYXRhLm1wLmRtYSovMDsKKwkJcmV0dXJuIDA7CQorCQkKKwljYXNlIEhETENEUlZDVExfR0VUU1RBVDoKKwkJaGkuZGF0YS5jcy5wdHQgPSAhIShiYy0+c3RhdCAmIEVQUF9QVFRCSVQpOworCQloaS5kYXRhLmNzLmRjZCA9ICEoYmMtPnN0YXQgJiBFUFBfRENEQklUKTsKKwkJaGkuZGF0YS5jcy5wdHRfa2V5ZWQgPSBiYy0+cHR0X2tleWVkOworCQloaS5kYXRhLmNzLnR4X3BhY2tldHMgPSBiYy0+c3RhdHMudHhfcGFja2V0czsKKwkJaGkuZGF0YS5jcy50eF9lcnJvcnMgPSBiYy0+c3RhdHMudHhfZXJyb3JzOworCQloaS5kYXRhLmNzLnJ4X3BhY2tldHMgPSBiYy0+c3RhdHMucnhfcGFja2V0czsKKwkJaGkuZGF0YS5jcy5yeF9lcnJvcnMgPSBiYy0+c3RhdHMucnhfZXJyb3JzOworCQlicmVhazsJCQorCisJY2FzZSBIRExDRFJWQ1RMX09MREdFVFNUQVQ6CisJCWhpLmRhdGEub2NzLnB0dCA9ICEhKGJjLT5zdGF0ICYgRVBQX1BUVEJJVCk7CisJCWhpLmRhdGEub2NzLmRjZCA9ICEoYmMtPnN0YXQgJiBFUFBfRENEQklUKTsKKwkJaGkuZGF0YS5vY3MucHR0X2tleWVkID0gYmMtPnB0dF9rZXllZDsKKwkJYnJlYWs7CQkKKworCWNhc2UgSERMQ0RSVkNUTF9DQUxJQlJBVEU6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQliYy0+aGRsY3R4LmNhbGlicmF0ZSA9IGhpLmRhdGEuY2FsaWJyYXRlICogYmMtPmJpdHJhdGUgLyA4OworCQlyZXR1cm4gMDsKKworCWNhc2UgSERMQ0RSVkNUTF9EUklWRVJOQU1FOgorCQlzdHJuY3B5KGhpLmRhdGEuZHJpdmVybmFtZSwgImJheWNvbV9lcHAiLCBzaXplb2YoaGkuZGF0YS5kcml2ZXJuYW1lKSk7CisJCWJyZWFrOworCQkKKwljYXNlIEhETENEUlZDVExfR0VUTU9ERToKKwkJc3ByaW50ZihoaS5kYXRhLm1vZGVuYW1lLCAiJXNjbGssJXNtb2RlbSxmY2xrPSVkLGJwcz0lZCVzIiwgCisJCQliYy0+Y2ZnLmludGNsayA/ICJpbnQiIDogImV4dCIsCisJCQliYy0+Y2ZnLmV4dG1vZGVtID8gImV4dCIgOiAiaW50IiwgYmMtPmNmZy5mY2xrLCBiYy0+Y2ZnLmJwcywKKwkJCWJjLT5jZmcubG9vcGJhY2sgPyAiLGxvb3BiYWNrIiA6ICIiKTsKKwkJYnJlYWs7CisKKwljYXNlIEhETENEUlZDVExfU0VUTU9ERToKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pIHx8IG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQloaS5kYXRhLm1vZGVuYW1lW3NpemVvZihoaS5kYXRhLm1vZGVuYW1lKS0xXSA9ICdcMCc7CisJCXJldHVybiBiYXljb21fc2V0bW9kZShiYywgaGkuZGF0YS5tb2RlbmFtZSk7CisKKwljYXNlIEhETENEUlZDVExfTU9ERUxJU1Q6CisJCXN0cm5jcHkoaGkuZGF0YS5tb2RlbmFtZSwgImludGNsayxleHRjbGssaW50bW9kZW0sZXh0bW9kZW0sZGl2aWRlcj14IiwKKwkJCXNpemVvZihoaS5kYXRhLm1vZGVuYW1lKSk7CisJCWJyZWFrOworCisJY2FzZSBIRExDRFJWQ1RMX01PREVNUEFSTUFTSzoKKwkJcmV0dXJuIEhETENEUlZfUEFSTUFTS19JT0JBU0U7CisKKwl9CisJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCAmaGksIHNpemVvZihoaSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBDaGVjayBmb3IgYSBuZXR3b3JrIGFkYXB0b3Igb2YgdGhpcyB0eXBlLCBhbmQgcmV0dXJuICcwJyBpZiBvbmUgZXhpc3RzLgorICogSWYgZGV2LT5iYXNlX2FkZHIgPT0gMCwgcHJvYmUgYWxsIGxpa2VseSBsb2NhdGlvbnMuCisgKiBJZiBkZXYtPmJhc2VfYWRkciA9PSAxLCBhbHdheXMgcmV0dXJuIGZhaWx1cmUuCisgKiBJZiBkZXYtPmJhc2VfYWRkciA9PSAyLCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGRldmljZSBhbmQgcmV0dXJuIHN1Y2Nlc3MKKyAqIChkZXRhY2hhYmxlIGRldmljZXMgb25seSkuCisgKi8KK3N0YXRpYyB2b2lkIGJheWNvbV9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0YXRpYyBjaGFyIGF4MjVfYmNhc3RbQVgyNV9BRERSX0xFTl0gPSB7CisJCSdRJyA8PCAxLCAnUycgPDwgMSwgJ1QnIDw8IDEsICcgJyA8PCAxLCAnICcgPDwgMSwgJyAnIDw8IDEsICcwJyA8PCAxCisJfTsKKwlzdGF0aWMgY2hhciBheDI1X25vY2FsbFtBWDI1X0FERFJfTEVOXSA9IHsKKwkJJ0wnIDw8IDEsICdJJyA8PCAxLCAnTicgPDwgMSwgJ1UnIDw8IDEsICdYJyA8PCAxLCAnICcgPDwgMSwgJzEnIDw8IDEKKwl9OworCWNvbnN0IHN0cnVjdCBoZGxjZHJ2X2NoYW5uZWxfcGFyYW1zIGRmbHRfY2hfcGFyYW1zID0geyAKKwkJMjAsIDIsIDEwLCA0MCwgMCAKKwl9OworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjOworCisJLyoKKwkgKiBub3QgYSByZWFsIHByb2JlISBvbmx5IGluaXRpYWxpemUgZGF0YSBzdHJ1Y3R1cmVzCisJICovCisJYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCS8qCisJICogaW5pdGlhbGl6ZSB0aGUgYmF5Y29tX3N0YXRlIHN0cnVjdAorCSAqLworCWJjLT5jaF9wYXJhbXMgPSBkZmx0X2NoX3BhcmFtczsKKwliYy0+cHR0X2tleWVkID0gMDsKKworCS8qCisJICogaW5pdGlhbGl6ZSB0aGUgZGV2aWNlIHN0cnVjdAorCSAqLworCWRldi0+b3BlbiA9IGVwcF9vcGVuOworCWRldi0+c3RvcCA9IGVwcF9jbG9zZTsKKwlkZXYtPmRvX2lvY3RsID0gYmF5Y29tX2lvY3RsOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gYmF5Y29tX3NlbmRfcGFja2V0OworCWRldi0+Z2V0X3N0YXRzID0gYmF5Y29tX2dldF9zdGF0czsKKworCS8qIEZpbGwgaW4gdGhlIGZpZWxkcyBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSAqLworCWJjLT5za2IgPSBOVUxMOworCQorI2lmIGRlZmluZWQoQ09ORklHX0FYMjUpIHx8IGRlZmluZWQoQ09ORklHX0FYMjVfTU9EVUxFKQorCWRldi0+aGFyZF9oZWFkZXIgPSBheDI1X2VuY2Fwc3VsYXRlOworCWRldi0+cmVidWlsZF9oZWFkZXIgPSBheDI1X3JlYnVpbGRfaGVhZGVyOworI2Vsc2UgLyogQ09ORklHX0FYMjUgfHwgQ09ORklHX0FYMjVfTU9EVUxFICovCisJZGV2LT5oYXJkX2hlYWRlciA9IE5VTEw7CisJZGV2LT5yZWJ1aWxkX2hlYWRlciA9IE5VTEw7CisjZW5kaWYgLyogQ09ORklHX0FYMjUgfHwgQ09ORklHX0FYMjVfTU9EVUxFICovCisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBiYXljb21fc2V0X21hY19hZGRyZXNzOworCQorCWRldi0+dHlwZSA9IEFSUEhSRF9BWDI1OyAgICAgICAgICAgLyogQUZfQVgyNSBkZXZpY2UgKi8KKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IEFYMjVfTUFYX0hFQURFUl9MRU4gKyBBWDI1X0JQUV9IRUFERVJfTEVOOworCWRldi0+bXR1ID0gQVgyNV9ERUZfUEFDTEVOOyAgICAgICAgLyogZXRoX210dSBpcyB0aGUgZGVmYXVsdCAqLworCWRldi0+YWRkcl9sZW4gPSBBWDI1X0FERFJfTEVOOyAgICAgLyogc2l6ZW9mIGFuIGF4LjI1IGFkZHJlc3MgKi8KKwltZW1jcHkoZGV2LT5icm9hZGNhc3QsIGF4MjVfYmNhc3QsIEFYMjVfQUREUl9MRU4pOworCW1lbWNweShkZXYtPmRldl9hZGRyLCBheDI1X25vY2FsbCwgQVgyNV9BRERSX0xFTik7CisJZGV2LT50eF9xdWV1ZV9sZW4gPSAxNjsKKworCS8qIE5ldyBzdHlsZSBmbGFncyAqLworCWRldi0+ZmxhZ3MgPSAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGNvbW1hbmQgbGluZSBzZXR0YWJsZSBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICptb2RlW05SX1BPUlRTXSA9IHsgIiIsIH07CitzdGF0aWMgaW50IGlvYmFzZVtOUl9QT1JUU10gPSB7IDB4Mzc4LCB9OworCittb2R1bGVfcGFyYW1fYXJyYXkobW9kZSwgY2hhcnAsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhtb2RlLCAiYmF5Y29tIG9wZXJhdGluZyBtb2RlIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaW9iYXNlLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpb2Jhc2UsICJiYXljb20gaW8gYmFzZSBhZGRyZXNzIik7CisKK01PRFVMRV9BVVRIT1IoIlRob21hcyBNLiBTYWlsZXIsIHNhaWxlckBpZmUuZWUuZXRoei5jaCwgaGI5am54QGhiOXcuY2hlLmV1Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJheWNvbSBlcHAgYW1hdGV1ciByYWRpbyBtb2RlbSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBiYXljb21fZXBwX2Rldl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qCisJICogaW5pdGlhbGl6ZSBwYXJ0IG9mIHRoZSBiYXljb21fc3RhdGUgc3RydWN0CisJICovCisJYmMtPm1hZ2ljID0gQkFZQ09NX01BR0lDOworCWJjLT5jZmcuZmNsayA9IDE5NjY2NjAwOworCWJjLT5jZmcuYnBzID0gOTYwMDsKKwkvKgorCSAqIGluaXRpYWxpemUgcGFydCBvZiB0aGUgZGV2aWNlIHN0cnVjdAorCSAqLworCWJheWNvbV9wcm9iZShkZXYpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2JheWNvbWVwcCh2b2lkKQoreworCWludCBpLCBmb3VuZCA9IDA7CisJY2hhciBzZXRfaHcgPSAxOworCisJcHJpbnRrKGJjX2RydmluZm8pOworCS8qCisJICogcmVnaXN0ZXIgbmV0IGRldmljZXMKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlJfUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCQkKKwkJZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgYmF5Y29tX3N0YXRlKSwgImJjZSVkIiwKKwkJCQkgICBiYXljb21fZXBwX2Rldl9zZXR1cCk7CisKKwkJaWYgKCFkZXYpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImJjZSVkIDogb3V0IG9mIG1lbW9yeVxuIiwgaSk7CisJCQlyZXR1cm4gZm91bmQgPyAwIDogLUVOT01FTTsKKwkJfQorCQkJCisJCXNwcmludGYoZGV2LT5uYW1lLCAiYmNlJWQiLCBpKTsKKwkJZGV2LT5iYXNlX2FkZHIgPSBpb2Jhc2VbaV07CisKKwkJaWYgKCFtb2RlW2ldKQorCQkJc2V0X2h3ID0gMDsKKwkJaWYgKCFzZXRfaHcpCisJCQlpb2Jhc2VbaV0gPSAwOworCisJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlICVzXG4iLCBiY19kcnZuYW1lLCBkZXYtPm5hbWUpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzZXRfaHcgJiYgYmF5Y29tX3NldG1vZGUobmV0ZGV2X3ByaXYoZGV2KSwgbW9kZVtpXSkpCisJCQlzZXRfaHcgPSAwOworCQliYXljb21fZGV2aWNlW2ldID0gZGV2OworCQlmb3VuZCsrOworCX0KKworCXJldHVybiBmb3VuZCA/IDAgOiAtRU5YSU87Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2JheWNvbWVwcCh2b2lkKQoreworCWludCBpOworCisJZm9yKGkgPSAwOyBpIDwgTlJfUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYmF5Y29tX2RldmljZVtpXTsKKworCQlpZiAoZGV2KSB7CisJCQlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYyA9IG5ldGRldl9wcml2KGRldik7CisJCQlpZiAoYmMtPm1hZ2ljID09IEJBWUNPTV9NQUdJQykgeworCQkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCX0gZWxzZQorCQkJCXByaW50ayhwYXJhbm9pYV9zdHIsICJjbGVhbnVwX21vZHVsZSIpOworCQl9CisJfQorfQorCittb2R1bGVfaW5pdChpbml0X2JheWNvbWVwcCk7Cittb2R1bGVfZXhpdChjbGVhbnVwX2JheWNvbWVwcCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIE1PRFVMRQorCisvKgorICogZm9ybWF0OiBiYXljb21fZXBwPWlvLG1vZGUKKyAqIG1vZGU6IGZwZ2EgY29uZmlnIG9wdGlvbnMKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBiYXljb21fZXBwX3NldHVwKGNoYXIgKnN0cikKK3sKKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIF9faW5pdGRhdGEgbnJfZGV2ID0gMDsKKwlpbnQgaW50c1syXTsKKworICAgICAgICBpZiAobnJfZGV2ID49IE5SX1BPUlRTKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgMiwgaW50cyk7CisJaWYgKGludHNbMF0gPCAxKQorCQlyZXR1cm4gMDsKKwltb2RlW25yX2Rldl0gPSBzdHI7CisJaW9iYXNlW25yX2Rldl0gPSBpbnRzWzFdOworCW5yX2RldisrOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJiYXljb21fZXBwPSIsIGJheWNvbV9lcHBfc2V0dXApOworCisjZW5kaWYgLyogTU9EVUxFICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JheWNvbV9wYXIuYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JheWNvbV9wYXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTJhZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX3Bhci5jCkBAIC0wLDAgKzEsNTc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKgliYXljb21fcGFyLmMgIC0tIGJheWNvbSBwYXI5NiBhbmQgcGljcGFyIHJhZGlvIG1vZGVtIGRyaXZlci4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMCAgVGhvbWFzIFNhaWxlciAoc2FpbGVyQGlmZS5lZS5ldGh6LmNoKQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBHUEwgYWxsb3dzIHlvdSB0byB1c2UgdGhlIGRyaXZlciwgTk9UIHRoZSByYWRpby4KKyAqICBJbiBvcmRlciB0byB1c2UgdGhlIHJhZGlvLCB5b3UgbmVlZCBhIGxpY2Vuc2UgZnJvbSB0aGUgY29tbXVuaWNhdGlvbnMKKyAqICBhdXRob3JpdHkgb2YgeW91ciBjb3VudHJ5LgorICoKKyAqCisgKiAgU3VwcG9ydGVkIG1vZGVtcworICoKKyAqICBwYXI5NjogIFRoaXMgaXMgYSBtb2RlbSBmb3IgOTYwMCBiYXVkIEZTSyBjb21wYXRpYmxlIHRvIHRoZSBHM1JVSCBzdGFuZGFyZC4KKyAqICAgICAgICAgIFRoZSBtb2RlbSBkb2VzIGFsbCB0aGUgZmlsdGVyaW5nIGFuZCByZWdlbmVyYXRlcyB0aGUgcmVjZWl2ZXIgY2xvY2suCisgKiAgICAgICAgICBEYXRhIGlzIHRyYW5zZmVycmVkIGZyb20gYW5kIHRvIHRoZSBQQyB2aWEgYSBzaGlmdCByZWdpc3Rlci4KKyAqICAgICAgICAgIFRoZSBzaGlmdCByZWdpc3RlciBpcyBmaWxsZWQgd2l0aCAxNiBiaXRzIGFuZCBhbiBpbnRlcnJ1cHQgaXMKKyAqICAgICAgICAgIHNpZ25hbGxlZC4gVGhlIFBDIHRoZW4gZW1wdGllcyB0aGUgc2hpZnQgcmVnaXN0ZXIgaW4gYSBidXJzdC4gVGhpcworICogICAgICAgICAgbW9kZW0gY29ubmVjdHMgdG8gdGhlIHBhcmFsbGVsIHBvcnQsIGhlbmNlIHRoZSBuYW1lLiBUaGUgbW9kZW0KKyAqICAgICAgICAgIGxlYXZlcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEhETEMgcHJvdG9jb2wgYW5kIHRoZSBzY3JhbWJsZXIKKyAqICAgICAgICAgIHBvbHlub21pYWwgdG8gdGhlIFBDLiBUaGlzIG1vZGVtIGlzIG5vIGxvbmdlciBhdmFpbGFibGUgKGF0IGxlYXN0CisgKiAgICAgICAgICBmcm9tIEJheWNvbSkgYW5kIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHRoZSBQSUNQQVIgbW9kZW0gKHNlZSBiZWxvdykuCisgKiAgICAgICAgICBZb3UgbWF5IGhvd2V2ZXIgc3RpbGwgYnVpbGQgb25lIGZyb20gdGhlIHNjaGVtYXRpY3MgcHVibGlzaGVkIGluCisgKiAgICAgICAgICBjcS1ETCA6LSkuCisgKgorICogIHBpY3BhcjogVGhpcyBpcyBhIHJlZGVzaWduIG9mIHRoZSBwYXI5NiBtb2RlbSBieSBIZW5uaW5nIFJlY2gsIERGOUlDLiBUaGUKKyAqICAgICAgICAgIG1vZGVtIGlzIHByb3RvY29sIGNvbXBhdGlibGUgdG8gcGFyOTYsIGJ1dCB1c2VzIG9ubHkgdGhyZWUgbG93CisgKiAgICAgICAgICBwb3dlciBJQ3MgYW5kIGNhbiB0aGVyZWZvcmUgYmUgZmVkIGZyb20gdGhlIHBhcmFsbGVsIHBvcnQgYW5kCisgKiAgICAgICAgICBkb2VzIG5vdCByZXF1aXJlIGFuIGFkZGl0aW9uYWwgcG93ZXIgc3VwcGx5LiBJdCBmZWF0dXJlcworICogICAgICAgICAgYnVpbHQgaW4gRENEIGNpcmN1aXRyeS4gVGhlIGRyaXZlciBzaG91bGQgdGhlcmVmb3JlIGJlIGNvbmZpZ3VyZWQKKyAqICAgICAgICAgIGZvciBoYXJkd2FyZSBEQ0QuCisgKgorICoKKyAqICBDb21tYW5kIGxpbmUgb3B0aW9ucyAoaW5zbW9kIGNvbW1hbmQgbGluZSkKKyAqCisgKiAgbW9kZSAgICAgZHJpdmVyIG1vZGUgc3RyaW5nLiBWYWxpZCBjaG9pY2VzIGFyZSBwYXI5NiBhbmQgcGljcGFyLgorICogIGlvYmFzZSAgIGJhc2UgYWRkcmVzcyBvZiB0aGUgcG9ydDsgY29tbW9uIHZhbHVlcyBhcmUgMHgzNzgsIDB4Mjc4LCAweDNiYworICoKKyAqCisgKiAgSGlzdG9yeToKKyAqICAgMC4xICAyNi4wNi4xOTk2ICBBZGFwdGVkIGZyb20gYmF5Y29tLmMgYW5kIG1hZGUgbmV0d29yayBkcml2ZXIgaW50ZXJmYWNlCisgKiAgICAgICAgMTguMTAuMTk5NiAgQ2hhbmdlZCB0byBuZXcgdXNlciBzcGFjZSBhY2Nlc3Mgcm91dGluZXMgKGNvcHlfe3RvLGZyb219X3VzZXIpCisgKiAgIDAuMyAgMjYuMDQuMTk5NyAgaW5pdCBjb2RlL2RhdGEgdGFnZ2VkCisgKiAgIDAuNCAgMDguMDcuMTk5NyAgYWx0ZXJuYXRpdmUgc2VyMTIgZGVjb2RpbmcgYWxnb3JpdGhtICh1c2VzIGRlbHRhIENUUyBpbnRzKQorICogICAwLjUgIDExLjExLjE5OTcgIHNwbGl0IGludG8gc2VwYXJhdGUgZmlsZXMgZm9yIHNlcjEyL3Bhcjk2CisgKiAgIDAuNiAgMDMuMDguMTk5OSAgYWRhcHQgdG8gTGludXMnIG5ldyBfX3NldHVwL19faW5pdGNhbGwKKyAqICAgICAgICAgICAgICAgICAgICByZW1vdmVkIHNvbWUgcHJlLTIuMiBrZXJuZWwgY29tcGF0aWJpbGl0eSBjcnVmdAorICogICAwLjcgIDEwLjA4LjE5OTkgIENoZWNrIGlmIHBhcnBvcnQgY2FuIGRvIFNQUCBhbmQgaXMgc2FmZSB0byBhY2Nlc3MgZHVyaW5nIGludGVycnVwdCBjb250ZXh0cworICogICAwLjggIDEyLjAyLjIwMDAgIGFkYXB0ZWQgdG8gc29mdG5ldCBkcml2ZXIgaW50ZXJmYWNlCisgKiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCBkaXJlY3QgcGFycG9ydCBhY2Nlc3MsIHVzZXMgcGFycG9ydCBkcml2ZXIgbWV0aG9kcworICogICAwLjkgIDAzLjA3LjIwMDAgIGZpeCBpbnRlcmZhY2UgbmFtZSBoYW5kbGluZworICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGRsY2Rydi5oPgorI2luY2x1ZGUgPGxpbnV4L2JheWNvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9idWcuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQkFZQ09NX0RFQlVHCisKKy8qCisgKiBtb2RlbSBvcHRpb25zOyBiaXQgbWFzaworICovCisjZGVmaW5lIEJBWUNPTV9PUFRJT05TX1NPRlREQ0QgIDEKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBjaGFyIGJjX2Rydm5hbWVbXSA9ICJiYXljb21fcGFyIjsKK3N0YXRpYyBjb25zdCBjaGFyIGJjX2RydmluZm9bXSA9IEtFUk5fSU5GTyAiYmF5Y29tX3BhcjogKEMpIDE5OTYtMjAwMCBUaG9tYXMgU2FpbGVyLCBIQjlKTlgvQUU0V0FcbiIKK0tFUk5fSU5GTyAiYmF5Y29tX3BhcjogdmVyc2lvbiAwLjkgY29tcGlsZWQgIiBfX1RJTUVfXyAiICIgX19EQVRFX18gIlxuIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTlJfUE9SVFMgNAorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmJheWNvbV9kZXZpY2VbTlJfUE9SVFNdOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBQQVI5Nl9CVVJTVEJJVFMgMTYKKyNkZWZpbmUgUEFSOTZfQlVSU1QgICAgIDQKKyNkZWZpbmUgUEFSOTZfUFRUICAgICAgIDIKKyNkZWZpbmUgUEFSOTZfVFhCSVQgICAgIDEKKyNkZWZpbmUgUEFSOTZfQUNLICAgICAgIDB4NDAKKyNkZWZpbmUgUEFSOTZfUlhCSVQgICAgIDB4MjAKKyNkZWZpbmUgUEFSOTZfRENEICAgICAgIDB4MTAKKyNkZWZpbmUgUEFSOTdfUE9XRVIgICAgIDB4ZjgKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIEluZm9ybWF0aW9uIHRoYXQgbmVlZCB0byBiZSBrZXB0IGZvciBlYWNoIGJvYXJkLgorICovCisKK3N0cnVjdCBiYXljb21fc3RhdGUgeworCXN0cnVjdCBoZGxjZHJ2X3N0YXRlIGhkcnY7CisKKwlzdHJ1Y3QgcGFyZGV2aWNlICpwZGV2OworCXVuc2lnbmVkIGludCBvcHRpb25zOworCisJc3RydWN0IG1vZGVtX3N0YXRlIHsKKwkJc2hvcnQgYXJiX2RpdmlkZXI7CisJCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CisJCXVuc2lnbmVkIGludCBzaHJlZzsKKwkJc3RydWN0IG1vZGVtX3N0YXRlX3Bhcjk2IHsKKwkJCWludCBkY2RfY291bnQ7CisJCQl1bnNpZ25lZCBpbnQgZGNkX3NocmVnOworCQkJdW5zaWduZWQgbG9uZyBkZXNjcmFtOworCQkJdW5zaWduZWQgbG9uZyBzY3JhbTsKKwkJfSBwYXI5NjsKKwl9IG1vZGVtOworCisjaWZkZWYgQkFZQ09NX0RFQlVHCisJc3RydWN0IGRlYnVnX3ZhbHMgeworCQl1bnNpZ25lZCBsb25nIGxhc3RfamlmZmllczsKKwkJdW5zaWduZWQgY3VyX2ludGNudDsKKwkJdW5zaWduZWQgbGFzdF9pbnRjbnQ7CisJCWludCBjdXJfcGxsY29ycjsKKwkJaW50IGxhc3RfcGxsY29ycjsKKwl9IGRlYnVnX3ZhbHM7CisjZW5kaWYgLyogQkFZQ09NX0RFQlVHICovCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgX19pbmxpbmVfXyBiYXljb21faW50X2ZyZXEoc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMpCit7CisjaWZkZWYgQkFZQ09NX0RFQlVHCisJdW5zaWduZWQgbG9uZyBjdXJfamlmZmllcyA9IGppZmZpZXM7CisJLyoKKwkgKiBtZWFzdXJlIHRoZSBpbnRlcnJ1cHQgZnJlcXVlbmN5CisJICovCisJYmMtPmRlYnVnX3ZhbHMuY3VyX2ludGNudCsrOworCWlmICgoY3VyX2ppZmZpZXMgLSBiYy0+ZGVidWdfdmFscy5sYXN0X2ppZmZpZXMpID49IEhaKSB7CisJCWJjLT5kZWJ1Z192YWxzLmxhc3RfamlmZmllcyA9IGN1cl9qaWZmaWVzOworCQliYy0+ZGVidWdfdmFscy5sYXN0X2ludGNudCA9IGJjLT5kZWJ1Z192YWxzLmN1cl9pbnRjbnQ7CisJCWJjLT5kZWJ1Z192YWxzLmN1cl9pbnRjbnQgPSAwOworCQliYy0+ZGVidWdfdmFscy5sYXN0X3BsbGNvcnIgPSBiYy0+ZGVidWdfdmFscy5jdXJfcGxsY29ycjsKKwkJYmMtPmRlYnVnX3ZhbHMuY3VyX3BsbGNvcnIgPSAwOworCX0KKyNlbmRpZiAvKiBCQVlDT01fREVCVUcgKi8KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09IFBBUjk2IHNwZWNpZmljIHJvdXRpbmVzID09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisjZGVmaW5lIFBBUjk2X0RFU0NSQU1fVEFQMSAweDIwMDAwCisjZGVmaW5lIFBBUjk2X0RFU0NSQU1fVEFQMiAweDAxMDAwCisjZGVmaW5lIFBBUjk2X0RFU0NSQU1fVEFQMyAweDAwMDAxCisKKyNkZWZpbmUgUEFSOTZfREVTQ1JBTV9UQVBTSDEgMTcKKyNkZWZpbmUgUEFSOTZfREVTQ1JBTV9UQVBTSDIgMTIKKyNkZWZpbmUgUEFSOTZfREVTQ1JBTV9UQVBTSDMgMAorCisjZGVmaW5lIFBBUjk2X1NDUkFNX1RBUDEgMHgyMDAwMCAvKiBYXjE3ICovCisjZGVmaW5lIFBBUjk2X1NDUkFNX1RBUE4gMHgwMDAyMSAvKiBYXjArWF41ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHBhcjk2X3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBiYXljb21fc3RhdGUgKmJjKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBkYXRhID0gaGRsY2Rydl9nZXRiaXRzKCZiYy0+aGRydik7CisJc3RydWN0IHBhcnBvcnQgKnBwID0gYmMtPnBkZXYtPnBvcnQ7CisKKwlmb3IoaSA9IDA7IGkgPCBQQVI5Nl9CVVJTVEJJVFM7IGkrKywgZGF0YSA+Pj0gMSkgeworCQl1bnNpZ25lZCBjaGFyIHZhbCA9IFBBUjk3X1BPV0VSOworCQliYy0+bW9kZW0ucGFyOTYuc2NyYW0gPSAoKGJjLT5tb2RlbS5wYXI5Ni5zY3JhbSA8PCAxKSB8CisJCQkJCSAoYmMtPm1vZGVtLnBhcjk2LnNjcmFtICYgMSkpOworCQlpZiAoIShkYXRhICYgMSkpCisJCQliYy0+bW9kZW0ucGFyOTYuc2NyYW0gXj0gMTsKKwkJaWYgKGJjLT5tb2RlbS5wYXI5Ni5zY3JhbSAmIChQQVI5Nl9TQ1JBTV9UQVAxIDw8IDEpKQorCQkJYmMtPm1vZGVtLnBhcjk2LnNjcmFtIF49CisJCQkJKFBBUjk2X1NDUkFNX1RBUE4gPDwgMSk7CisJCWlmIChiYy0+bW9kZW0ucGFyOTYuc2NyYW0gJiAoUEFSOTZfU0NSQU1fVEFQMSA8PCAyKSkKKwkJCXZhbCB8PSBQQVI5Nl9UWEJJVDsKKwkJcHAtPm9wcy0+d3JpdGVfZGF0YShwcCwgdmFsKTsKKwkJcHAtPm9wcy0+d3JpdGVfZGF0YShwcCwgdmFsIHwgUEFSOTZfQlVSU1QpOworCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcGFyOTZfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGRhdGEsIG1hc2ssIG1hc2syLCBkZXNjeDsKKwlzdHJ1Y3QgcGFycG9ydCAqcHAgPSBiYy0+cGRldi0+cG9ydDsKKworCS8qCisJICogZG8gcmVjZWl2ZXI7IGRpZmZlcmVudGlhbCBkZWNvZGUgYW5kIGRlc2NyYW1ibGUgb24gdGhlIGZseQorCSAqLworCWZvcihkYXRhID0gaSA9IDA7IGkgPCBQQVI5Nl9CVVJTVEJJVFM7IGkrKykgeworCQliYy0+bW9kZW0ucGFyOTYuZGVzY3JhbSA9IChiYy0+bW9kZW0ucGFyOTYuZGVzY3JhbSA8PCAxKTsKKwkJaWYgKHBwLT5vcHMtPnJlYWRfc3RhdHVzKHBwKSAmIFBBUjk2X1JYQklUKQorCQkJYmMtPm1vZGVtLnBhcjk2LmRlc2NyYW0gfD0gMTsKKwkJZGVzY3ggPSBiYy0+bW9kZW0ucGFyOTYuZGVzY3JhbSBeCisJCQkoYmMtPm1vZGVtLnBhcjk2LmRlc2NyYW0gPj4gMSk7CisJCS8qIG5vdyB0aGUgZGlmZiBkZWNvZGVkIGRhdGEgaXMgaW52ZXJ0ZWQgaW4gZGVzY3JhbSAqLworCQlwcC0+b3BzLT53cml0ZV9kYXRhKHBwLCBQQVI5N19QT1dFUiB8IFBBUjk2X1BUVCk7CisJCWRlc2N4IF49ICgoZGVzY3ggPj4gUEFSOTZfREVTQ1JBTV9UQVBTSDEpIF4KKwkJCSAgKGRlc2N4ID4+IFBBUjk2X0RFU0NSQU1fVEFQU0gyKSk7CisJCWRhdGEgPj49IDE7CisJCWlmICghKGRlc2N4ICYgMSkpCisJCQlkYXRhIHw9IDB4ODAwMDsKKwkJcHAtPm9wcy0+d3JpdGVfZGF0YShwcCwgUEFSOTdfUE9XRVIgfCBQQVI5Nl9QVFQgfCBQQVI5Nl9CVVJTVCk7CisJfQorCWhkbGNkcnZfcHV0Yml0cygmYmMtPmhkcnYsIGRhdGEpOworCS8qCisJICogZG8gRENEIGFsZ29yaXRobQorCSAqLworCWlmIChiYy0+b3B0aW9ucyAmIEJBWUNPTV9PUFRJT05TX1NPRlREQ0QpIHsKKwkJYmMtPm1vZGVtLnBhcjk2LmRjZF9zaHJlZyA9IChiYy0+bW9kZW0ucGFyOTYuZGNkX3NocmVnID4+IDE2KQorCQkJfCAoZGF0YSA8PCAxNik7CisJCS8qIHNlYXJjaCBmb3IgZmxhZ3MgYW5kIHNldCB0aGUgZGNkIGNvdW50ZXIgYXBwcm9wcmlhdGVseSAqLworCQlmb3IobWFzayA9IDB4MWZlMDAsIG1hc2syID0gMHhmYzAwLCBpID0gMDsKKwkJICAgIGkgPCBQQVI5Nl9CVVJTVEJJVFM7IGkrKywgbWFzayA8PD0gMSwgbWFzazIgPDw9IDEpCisJCQlpZiAoKGJjLT5tb2RlbS5wYXI5Ni5kY2Rfc2hyZWcgJiBtYXNrKSA9PSBtYXNrMikKKwkJCQliYy0+bW9kZW0ucGFyOTYuZGNkX2NvdW50ID0gSERMQ0RSVl9NQVhGTEVOKzQ7CisJCS8qIGNoZWNrIGZvciBhYm9ydC9ub2lzZSBzZXF1ZW5jZXMgKi8KKwkJZm9yKG1hc2sgPSAweDFmZTAwLCBtYXNrMiA9IDB4MWZlMDAsIGkgPSAwOworCQkgICAgaSA8IFBBUjk2X0JVUlNUQklUUzsgaSsrLCBtYXNrIDw8PSAxLCBtYXNrMiA8PD0gMSkKKwkJCWlmICgoKGJjLT5tb2RlbS5wYXI5Ni5kY2Rfc2hyZWcgJiBtYXNrKSA9PSBtYXNrMikgJiYKKwkJCSAgICAoYmMtPm1vZGVtLnBhcjk2LmRjZF9jb3VudCA+PSAwKSkKKwkJCQliYy0+bW9kZW0ucGFyOTYuZGNkX2NvdW50IC09IEhETENEUlZfTUFYRkxFTi0xMDsKKwkJLyogZGVjcmVtZW50IGFuZCBzZXQgdGhlIGRjZCB2YXJpYWJsZSAqLworCQlpZiAoYmMtPm1vZGVtLnBhcjk2LmRjZF9jb3VudCA+PSAwKQorCQkJYmMtPm1vZGVtLnBhcjk2LmRjZF9jb3VudCAtPSAyOworCQloZGxjZHJ2X3NldGRjZCgmYmMtPmhkcnYsIGJjLT5tb2RlbS5wYXI5Ni5kY2RfY291bnQgPiAwKTsKKwl9IGVsc2UgeworCQloZGxjZHJ2X3NldGRjZCgmYmMtPmhkcnYsICEhKHBwLT5vcHMtPnJlYWRfc3RhdHVzKHBwKSAmIFBBUjk2X0RDRCkpOworCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHBhcjk2X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCisJYmF5Y29tX2ludF9mcmVxKGJjKTsKKwkvKgorCSAqIGNoZWNrIGlmIHRyYW5zbWl0dGVyIGFjdGl2ZQorCSAqLworCWlmIChoZGxjZHJ2X3B0dCgmYmMtPmhkcnYpKQorCQlwYXI5Nl90eChkZXYsIGJjKTsKKwllbHNlIHsKKwkJcGFyOTZfcngoZGV2LCBiYyk7CisJCWlmICgtLWJjLT5tb2RlbS5hcmJfZGl2aWRlciA8PSAwKSB7CisJCQliYy0+bW9kZW0uYXJiX2RpdmlkZXIgPSA2OworCQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCQkJaGRsY2Rydl9hcmJpdHJhdGUoZGV2LCAmYmMtPmhkcnYpOworCQl9CisJfQorCWxvY2FsX2lycV9lbmFibGUoKTsKKwloZGxjZHJ2X3RyYW5zbWl0dGVyKGRldiwgJmJjLT5oZHJ2KTsKKwloZGxjZHJ2X3JlY2VpdmVyKGRldiwgJmJjLT5oZHJ2KTsKKyAgICAgICAgbG9jYWxfaXJxX2Rpc2FibGUoKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHBhcjk2X3dha2V1cCh2b2lkICpoYW5kbGUpCit7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKiloYW5kbGU7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcHJpbnRrKEtFUk5fREVCVUcgImJheWNvbV9wYXI6ICVzOiB3aHkgYW0gSSBiZWluZyB3b2tlbiB1cD9cbiIsIGRldi0+bmFtZSk7CisJaWYgKCFwYXJwb3J0X2NsYWltKGJjLT5wZGV2KSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgImJheWNvbV9wYXI6ICVzOiBJJ20gYnJva2VuLlxuIiwgZGV2LT5uYW1lKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgcGFyOTZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGFycG9ydCAqcHA7CisKKwlpZiAoIWRldiB8fCAhYmMpCisJCXJldHVybiAtRU5YSU87CisJcHAgPSBwYXJwb3J0X2ZpbmRfYmFzZShkZXYtPmJhc2VfYWRkcik7CisJaWYgKCFwcCkgeworCQlwcmludGsoS0VSTl9FUlIgImJheWNvbV9wYXI6IHBhcnBvcnQgYXQgMHglbHggdW5rbm93blxuIiwgZGV2LT5iYXNlX2FkZHIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlpZiAocHAtPmlycSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXljb21fcGFyOiBwYXJwb3J0IGF0IDB4JWx4IGhhcyBubyBpcnFcbiIsIHBwLT5iYXNlKTsKKwkJcGFycG9ydF9wdXRfcG9ydChwcCk7CisJCXJldHVybiAtRU5YSU87CisJfQorCWlmICgofnBwLT5tb2RlcykgJiAoUEFSUE9SVF9NT0RFX1BDU1BQIHwgUEFSUE9SVF9NT0RFX1NBRkVJTklOVCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYXljb21fcGFyOiBwYXJwb3J0IGF0IDB4JWx4IGNhbm5vdCBiZSB1c2VkXG4iLCBwcC0+YmFzZSk7CisJCXBhcnBvcnRfcHV0X3BvcnQocHApOworCQlyZXR1cm4gLUVOWElPOworCX0KKwltZW1zZXQoJmJjLT5tb2RlbSwgMCwgc2l6ZW9mKGJjLT5tb2RlbSkpOworCWJjLT5oZHJ2LnBhci5iaXRyYXRlID0gOTYwMDsKKwliYy0+cGRldiA9IHBhcnBvcnRfcmVnaXN0ZXJfZGV2aWNlKHBwLCBkZXYtPm5hbWUsIE5VTEwsIHBhcjk2X3dha2V1cCwgCisJCQkJIHBhcjk2X2ludGVycnVwdCwgUEFSUE9SVF9ERVZfRVhDTCwgZGV2KTsKKwlwYXJwb3J0X3B1dF9wb3J0KHBwKTsKKwlpZiAoIWJjLT5wZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAiYmF5Y29tX3BhcjogY2Fubm90IHJlZ2lzdGVyIHBhcnBvcnQgYXQgMHglbHhcbiIsIGRldi0+YmFzZV9hZGRyKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJaWYgKHBhcnBvcnRfY2xhaW0oYmMtPnBkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYmF5Y29tX3BhcjogcGFycG9ydCBhdCAweCVseCBidXN5XG4iLCBwcC0+YmFzZSk7CisJCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UoYmMtPnBkZXYpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlwcCA9IGJjLT5wZGV2LT5wb3J0OworCWRldi0+aXJxID0gcHAtPmlycTsKKwlwcC0+b3BzLT5kYXRhX2ZvcndhcmQocHApOworICAgICAgICBiYy0+aGRydi5wYXIuYml0cmF0ZSA9IDk2MDA7CisJcHAtPm9wcy0+d3JpdGVfZGF0YShwcCwgUEFSOTZfUFRUIHwgUEFSOTdfUE9XRVIpOyAvKiBzd2l0Y2ggb2ZmIFBUVCAqLworCXBwLT5vcHMtPmVuYWJsZV9pcnEocHApOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBwYXI5NiBhdCBpb2Jhc2UgMHglbHggaXJxICV1IG9wdGlvbnMgMHgleFxuIiwKKwkgICAgICAgYmNfZHJ2bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxLCBiYy0+b3B0aW9ucyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHBhcjk2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwYXJwb3J0ICpwcDsKKworCWlmICghZGV2IHx8ICFiYykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHAgPSBiYy0+cGRldi0+cG9ydDsKKwkvKiBkaXNhYmxlIGludGVycnVwdCAqLworCXBwLT5vcHMtPmRpc2FibGVfaXJxKHBwKTsKKwkvKiBzd2l0Y2ggb2ZmIFBUVCAqLworCXBwLT5vcHMtPndyaXRlX2RhdGEocHAsIFBBUjk2X1BUVCB8IFBBUjk3X1BPV0VSKTsKKwlwYXJwb3J0X3JlbGVhc2UoYmMtPnBkZXYpOworCXBhcnBvcnRfdW5yZWdpc3Rlcl9kZXZpY2UoYmMtPnBkZXYpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBjbG9zZSBwYXI5NiBhdCBpb2Jhc2UgMHglbHggaXJxICV1XG4iLAorCSAgICAgICBiY19kcnZuYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT0gaGRsY2RydiBkcml2ZXIgaW50ZXJmYWNlID09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitzdGF0aWMgaW50IGJheWNvbV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwKKwkJCXN0cnVjdCBoZGxjZHJ2X2lvY3RsICpoaSwgaW50IGNtZCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IGhkbGNkcnZfb3BzIHBhcjk2X29wcyA9IHsKKwkuZHJ2bmFtZSA9IGJjX2Rydm5hbWUsCisJLmRydmluZm8gPSBiY19kcnZpbmZvLAorCS5vcGVuICAgID0gcGFyOTZfb3BlbiwKKwkuY2xvc2UgICA9IHBhcjk2X2Nsb3NlLAorCS5pb2N0bCAgID0gYmF5Y29tX2lvY3RsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBiYXljb21fc2V0bW9kZShzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYywgY29uc3QgY2hhciAqbW9kZXN0cikKK3sKKwlpZiAoIXN0cm5jbXAobW9kZXN0ciwgInBpY3BhciIsIDYpKQorCQliYy0+b3B0aW9ucyA9IDA7CisJZWxzZSBpZiAoIXN0cm5jbXAobW9kZXN0ciwgInBhcjk2IiwgNSkpCisJCWJjLT5vcHRpb25zID0gQkFZQ09NX09QVElPTlNfU09GVERDRDsKKwllbHNlCisJCWJjLT5vcHRpb25zID0gISFzdHJjaHIobW9kZXN0ciwgJyonKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgYmF5Y29tX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLAorCQkJc3RydWN0IGhkbGNkcnZfaW9jdGwgKmhpLCBpbnQgY21kKQoreworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjOworCXN0cnVjdCBiYXljb21faW9jdGwgYmk7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwliYyA9IG5ldGRldl9wcml2KGRldik7CisJQlVHX09OKGJjLT5oZHJ2Lm1hZ2ljICE9IEhETENEUlZfTUFHSUMpOworCisJaWYgKGNtZCAhPSBTSU9DREVWUFJJVkFURSkKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwlzd2l0Y2ggKGhpLT5jbWQpIHsKKwlkZWZhdWx0OgorCQlicmVhazsKKworCWNhc2UgSERMQ0RSVkNUTF9HRVRNT0RFOgorCQlzdHJjcHkoaGktPmRhdGEubW9kZW5hbWUsIGJjLT5vcHRpb25zID8gInBhcjk2IiA6ICJwaWNwYXIiKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCBoaSwgc2l6ZW9mKHN0cnVjdCBoZGxjZHJ2X2lvY3RsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEhETENEUlZDVExfU0VUTU9ERToKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSB8fCAhY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQloaS0+ZGF0YS5tb2RlbmFtZVtzaXplb2YoaGktPmRhdGEubW9kZW5hbWUpLTFdID0gJ1wwJzsKKwkJcmV0dXJuIGJheWNvbV9zZXRtb2RlKGJjLCBoaS0+ZGF0YS5tb2RlbmFtZSk7CisKKwljYXNlIEhETENEUlZDVExfTU9ERUxJU1Q6CisJCXN0cmNweShoaS0+ZGF0YS5tb2RlbmFtZSwgInBhcjk2LHBpY3BhciIpOworCQlpZiAoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsIGhpLCBzaXplb2Yoc3RydWN0IGhkbGNkcnZfaW9jdGwpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgSERMQ0RSVkNUTF9NT0RFTVBBUk1BU0s6CisJCXJldHVybiBIRExDRFJWX1BBUk1BU0tfSU9CQVNFOworCisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZiaSwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKGJpKSkpCisJCXJldHVybiAtRUZBVUxUOworCXN3aXRjaCAoYmkuY21kKSB7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworI2lmZGVmIEJBWUNPTV9ERUJVRworCWNhc2UgQkFZQ09NQ1RMX0dFVERFQlVHOgorCQliaS5kYXRhLmRiZy5kZWJ1ZzEgPSBiYy0+aGRydi5wdHRfa2V5ZWQ7CisJCWJpLmRhdGEuZGJnLmRlYnVnMiA9IGJjLT5kZWJ1Z192YWxzLmxhc3RfaW50Y250OworCQliaS5kYXRhLmRiZy5kZWJ1ZzMgPSBiYy0+ZGVidWdfdmFscy5sYXN0X3BsbGNvcnI7CisJCWJyZWFrOworI2VuZGlmIC8qIEJBWUNPTV9ERUJVRyAqLworCisJfQorCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgJmJpLCBzaXplb2YoYmkpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7CisKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBjb21tYW5kIGxpbmUgc2V0dGFibGUgcGFyYW1ldGVycworICovCitzdGF0aWMgY29uc3QgY2hhciAqbW9kZVtOUl9QT1JUU10gPSB7ICJwaWNwYXIiLCB9Oworc3RhdGljIGludCBpb2Jhc2VbTlJfUE9SVFNdID0geyAweDM3OCwgfTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG1vZGUsIGNoYXJwLCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobW9kZSwgImJheWNvbSBvcGVyYXRpbmcgbW9kZTsgZWcuIHBhcjk2IG9yIHBpY3BhciIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlvYmFzZSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW9iYXNlLCAiYmF5Y29tIGlvIGJhc2UgYWRkcmVzcyIpOworCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgTS4gU2FpbGVyLCBzYWlsZXJAaWZlLmVlLmV0aHouY2gsIGhiOWpueEBoYjl3LmNoZS5ldSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCYXljb20gcGFyOTYgYW5kIHBpY3BhciBhbWF0ZXVyIHJhZGlvIG1vZGVtIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9iYXljb21wYXIodm9pZCkKK3sKKwlpbnQgaSwgZm91bmQgPSAwOworCWNoYXIgc2V0X2h3ID0gMTsKKworCXByaW50ayhiY19kcnZpbmZvKTsKKwkvKgorCSAqIHJlZ2lzdGVyIG5ldCBkZXZpY2VzCisJICovCisJZm9yIChpID0gMDsgaSA8IE5SX1BPUlRTOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwkJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmM7CisJCWNoYXIgaWZuYW1lW0lGTkFNU0laXTsKKworCQlzcHJpbnRmKGlmbmFtZSwgImJjcCVkIiwgaSk7CisKKwkJaWYgKCFtb2RlW2ldKQorCQkJc2V0X2h3ID0gMDsKKwkJaWYgKCFzZXRfaHcpCisJCQlpb2Jhc2VbaV0gPSAwOworCisJCWRldiA9IGhkbGNkcnZfcmVnaXN0ZXIoJnBhcjk2X29wcywKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBiYXljb21fc3RhdGUpLAorCQkJCSAgICAgICBpZm5hbWUsIGlvYmFzZVtpXSwgMCwgMCk7CisJCWlmIChJU19FUlIoZGV2KSkgCisJCQlicmVhazsKKworCQliYyA9IG5ldGRldl9wcml2KGRldik7CisJCWlmIChzZXRfaHcgJiYgYmF5Y29tX3NldG1vZGUoYmMsIG1vZGVbaV0pKQorCQkJc2V0X2h3ID0gMDsKKwkJZm91bmQrKzsKKwkJYmF5Y29tX2RldmljZVtpXSA9IGRldjsKKwl9CisKKwlpZiAoIWZvdW5kKQorCQlyZXR1cm4gLUVOWElPOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9iYXljb21wYXIodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvcihpID0gMDsgaSA8IE5SX1BPUlRTOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGJheWNvbV9kZXZpY2VbaV07CisKKwkJaWYgKGRldikKKwkJCWhkbGNkcnZfdW5yZWdpc3RlcihkZXYpOworCX0KK30KKworbW9kdWxlX2luaXQoaW5pdF9iYXljb21wYXIpOworbW9kdWxlX2V4aXQoY2xlYW51cF9iYXljb21wYXIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBNT0RVTEUKKworLyoKKyAqIGZvcm1hdDogYmF5Y29tX3Bhcj1pbyxtb2RlCisgKiBtb2RlOiBwYXI5NixwaWNwYXIKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBiYXljb21fcGFyX3NldHVwKGNoYXIgKnN0cikKK3sKKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIG5yX2RldjsKKwlpbnQgaW50c1syXTsKKworICAgICAgICBpZiAobnJfZGV2ID49IE5SX1BPUlRTKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIDIsIGludHMpOworICAgICAgICBpZiAoaW50c1swXSA8IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIG1vZGVbbnJfZGV2XSA9IHN0cjsKKyAgICAgICAgaW9iYXNlW25yX2Rldl0gPSBpbnRzWzFdOworCW5yX2RldisrOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJiYXljb21fcGFyPSIsIGJheWNvbV9wYXJfc2V0dXApOworCisjZW5kaWYgLyogTU9EVUxFICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JheWNvbV9zZXJfZmR4LmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fc2VyX2ZkeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZjI3MGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fc2VyX2ZkeC5jCkBAIC0wLDAgKzEsNzA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKgliYXljb21fc2VyX2ZkeC5jICAtLSBiYXljb20gc2VyMTIgZnVsbGR1cGxleCByYWRpbyBtb2RlbSBkcml2ZXIuCisgKgorICoJQ29weXJpZ2h0IChDKSAxOTk2LTIwMDAgIFRob21hcyBTYWlsZXIgKHNhaWxlckBpZmUuZWUuZXRoei5jaCkKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAgUGxlYXNlIG5vdGUgdGhhdCB0aGUgR1BMIGFsbG93cyB5b3UgdG8gdXNlIHRoZSBkcml2ZXIsIE5PVCB0aGUgcmFkaW8uCisgKiAgSW4gb3JkZXIgdG8gdXNlIHRoZSByYWRpbywgeW91IG5lZWQgYSBsaWNlbnNlIGZyb20gdGhlIGNvbW11bmljYXRpb25zCisgKiAgYXV0aG9yaXR5IG9mIHlvdXIgY291bnRyeS4KKyAqCisgKgorICogIFN1cHBvcnRlZCBtb2RlbXMKKyAqCisgKiAgc2VyMTI6ICBUaGlzIGlzIGEgdmVyeSBzaW1wbGUgMTIwMCBiYXVkIEFGU0sgbW9kZW0uIFRoZSBtb2RlbSBjb25zaXN0cyBvbmx5CisgKiAgICAgICAgICBvZiBhIG1vZHVsYXRvci9kZW1vZHVsYXRvciBjaGlwLCB1c3VhbGx5IGEgVEkgVENNMzEwNS4gVGhlIGNvbXB1dGVyCisgKiAgICAgICAgICBpcyByZXNwb25zaWJsZSBmb3IgcmVnZW5lcmF0aW5nIHRoZSByZWNlaXZlciBiaXQgY2xvY2ssIGFzIHdlbGwgYXMKKyAqICAgICAgICAgIGZvciBoYW5kbGluZyB0aGUgSERMQyBwcm90b2NvbC4gVGhlIG1vZGVtIGNvbm5lY3RzIHRvIGEgc2VyaWFsIHBvcnQsCisgKiAgICAgICAgICBoZW5jZSB0aGUgbmFtZS4gU2luY2UgdGhlIHNlcmlhbCBwb3J0IGlzIG5vdCB1c2VkIGFzIGFuIGFzeW5jIHNlcmlhbAorICogICAgICAgICAgcG9ydCwgdGhlIGtlcm5lbCBkcml2ZXIgZm9yIHNlcmlhbCBwb3J0cyBjYW5ub3QgYmUgdXNlZCwgYW5kIHRoaXMKKyAqICAgICAgICAgIGRyaXZlciBvbmx5IHN1cHBvcnRzIHN0YW5kYXJkIHNlcmlhbCBoYXJkd2FyZSAoODI1MCwgMTY0NTAsIDE2NTUwQSkKKyAqCisgKiAgICAgICAgICBUaGlzIG1vZGVtIHVzdWFsbHkgZHJhd3MgaXRzIHN1cHBseSBjdXJyZW50IG91dCBvZiB0aGUgb3RoZXJ3aXNlIHVudXNlZAorICogICAgICAgICAgVFhEIHBpbiBvZiB0aGUgc2VyaWFsIHBvcnQuIFRodXMgYSBjb250aWdudW91cyBzdHJlYW0gb2YgMHgwMC1ieXRlcworICogICAgICAgICAgaXMgdHJhbnNtaXR0ZWQgdG8gYWNoaWV2ZSBhIHBvc2l0aXZlIHN1cHBseSB2b2x0YWdlLgorICoKKyAqICBoc2s6ICAgIFRoaXMgaXMgYSA0ODAwIGJhdWQgRlNLIG1vZGVtLCBkZXNpZ25lZCBmb3IgVE5DIHVzZS4gSXQgd29ya3MgZmluZQorICogICAgICAgICAgaW4gJ2JheWNvbS1tb2RlJyA6LSkgIEluIGNvbnRyYXN0IHRvIHRoZSBUQ00zMTA1IG1vZGVtLCBwb3dlciBpcworICogICAgICAgICAgZXh0ZXJuYWxseSBzdXBwbGllZC4gU28gdGhlcmUncyBubyBuZWVkIHRvIHByb3ZpZGUgdGhlIDB4MDAtYnl0ZS1zdHJlYW0KKyAqICAgICAgICAgIHdoZW4gcmVjZWl2aW5nIG9yIGlkbGUsIHdoaWNoIGRyYXN0aWNhbGx5IHJlZHVjZXMgaW50ZXJydXB0IGxvYWQuCisgKgorICogIENvbW1hbmQgbGluZSBvcHRpb25zIChpbnNtb2QgY29tbWFuZCBsaW5lKQorICoKKyAqICBtb2RlICAgICBzZXIjICAgIGhhcmR3YXJlIERDRAorICogICAgICAgICAgIHNlciMqICAgc29mdHdhcmUgRENECisgKiAgICAgICAgICAgc2VyIysgICBoYXJkd2FyZSBEQ0QsIGludmVydGVkIHNpZ25hbCBhdCBEQ0QgcGluCisgKiAgICAgICAgICAgJyMnIGRlbm90ZXMgdGhlIGJhdWQgcmF0ZSAvIDEwMCwgZWcuIHNlcjEyKiBpcyAnMTIwMCBiYXVkLCBzb2Z0IERDRCcKKyAqICBpb2Jhc2UgICBiYXNlIGFkZHJlc3Mgb2YgdGhlIHBvcnQ7IGNvbW1vbiB2YWx1ZXMgYXJlIDB4M2Y4LCAweDJmOCwgMHgzZTgsIDB4MmU4CisgKiAgYmF1ZCAgICAgYmF1ZCByYXRlIChiZXR3ZWVuIDMwMCBhbmQgNDgwMCkKKyAqICBpcnEgICAgICBpbnRlcnJ1cHQgbGluZSBvZiB0aGUgcG9ydDsgY29tbW9uIHZhbHVlcyBhcmUgNCwzCisgKgorICoKKyAqICBIaXN0b3J5OgorICogICAwLjEgIDI2LjA2LjE5OTYgIEFkYXB0ZWQgZnJvbSBiYXljb20uYyBhbmQgbWFkZSBuZXR3b3JrIGRyaXZlciBpbnRlcmZhY2UKKyAqICAgICAgICAxOC4xMC4xOTk2ICBDaGFuZ2VkIHRvIG5ldyB1c2VyIHNwYWNlIGFjY2VzcyByb3V0aW5lcyAoY29weV97dG8sZnJvbX1fdXNlcikKKyAqICAgMC4zICAyNi4wNC4xOTk3ICBpbml0IGNvZGUvZGF0YSB0YWdnZWQKKyAqICAgMC40ICAwOC4wNy4xOTk3ICBhbHRlcm5hdGl2ZSBzZXIxMiBkZWNvZGluZyBhbGdvcml0aG0gKHVzZXMgZGVsdGEgQ1RTIGludHMpCisgKiAgIDAuNSAgMTEuMTEuMTk5NyAgc2VyMTIvcGFyOTYgc3BsaXQgaW50byBzZXBhcmF0ZSBmaWxlcworICogICAwLjYgIDI0LjAxLjE5OTggIFRob3JzdGVuIEtyYW56a293c2tpLCBkbDhiY3UgYW5kIFRob21hcyBTYWlsZXI6CisgKiAgICAgICAgICAgICAgICAgICAgcmVkdWNlZCBpbnRlcnJ1cHQgbG9hZCBpbiB0cmFuc21pdCBjYXNlCisgKiAgICAgICAgICAgICAgICAgICAgcmV3b3JrZWQgcmVjZWl2ZXIKKyAqICAgMC43ICAwMy4wOC4xOTk5ICBhZGFwdCB0byBMaW51cycgbmV3IF9fc2V0dXAvX19pbml0Y2FsbAorICogICAwLjggIDEwLjA4LjE5OTkgIHVzZSBtb2R1bGVfaW5pdC9tb2R1bGVfZXhpdAorICogICAwLjkgIDEyLjAyLjIwMDAgIGFkYXB0ZWQgdG8gc29mdG5ldCBkcml2ZXIgaW50ZXJmYWNlCisgKiAgIDAuMTAgMDMuMDcuMjAwMCAgZml4IGludGVyZmFjZSBuYW1lIGhhbmRsaW5nCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaGRsY2Rydi5oPgorI2luY2x1ZGUgPGxpbnV4L2JheWNvbS5oPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBCQVlDT01fREVCVUcKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBjaGFyIGJjX2Rydm5hbWVbXSA9ICJiYXljb21fc2VyX2ZkeCI7CitzdGF0aWMgY29uc3QgY2hhciBiY19kcnZpbmZvW10gPSBLRVJOX0lORk8gImJheWNvbV9zZXJfZmR4OiAoQykgMTk5Ni0yMDAwIFRob21hcyBTYWlsZXIsIEhCOUpOWC9BRTRXQVxuIgorS0VSTl9JTkZPICJiYXljb21fc2VyX2ZkeDogdmVyc2lvbiAwLjEwIGNvbXBpbGVkICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE5SX1BPUlRTIDQKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpiYXljb21fZGV2aWNlW05SX1BPUlRTXTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgUkJSKGlvYmFzZSkgKGlvYmFzZSswKQorI2RlZmluZSBUSFIoaW9iYXNlKSAoaW9iYXNlKzApCisjZGVmaW5lIElFUihpb2Jhc2UpIChpb2Jhc2UrMSkKKyNkZWZpbmUgSUlSKGlvYmFzZSkgKGlvYmFzZSsyKQorI2RlZmluZSBGQ1IoaW9iYXNlKSAoaW9iYXNlKzIpCisjZGVmaW5lIExDUihpb2Jhc2UpIChpb2Jhc2UrMykKKyNkZWZpbmUgTUNSKGlvYmFzZSkgKGlvYmFzZSs0KQorI2RlZmluZSBMU1IoaW9iYXNlKSAoaW9iYXNlKzUpCisjZGVmaW5lIE1TUihpb2Jhc2UpIChpb2Jhc2UrNikKKyNkZWZpbmUgU0NSKGlvYmFzZSkgKGlvYmFzZSs3KQorI2RlZmluZSBETEwoaW9iYXNlKSAoaW9iYXNlKzApCisjZGVmaW5lIERMTShpb2Jhc2UpIChpb2Jhc2UrMSkKKworI2RlZmluZSBTRVIxMl9FWFRFTlQgOAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogSW5mb3JtYXRpb24gdGhhdCBuZWVkIHRvIGJlIGtlcHQgZm9yIGVhY2ggYm9hcmQuCisgKi8KKworc3RydWN0IGJheWNvbV9zdGF0ZSB7CisJc3RydWN0IGhkbGNkcnZfc3RhdGUgaGRydjsKKworCXVuc2lnbmVkIGludCBiYXVkLCBiYXVkX3VzLCBiYXVkX2FyYmRpdiwgYmF1ZF91YXJ0ZGl2LCBiYXVkX2RjZHRpbWVvdXQ7CisJaW50IG9wdF9kY2Q7CisKKwlzdHJ1Y3QgbW9kZW1fc3RhdGUgeworCQl1bnNpZ25lZCBjaGFyIGZsYWdzOworCQl1bnNpZ25lZCBjaGFyIHB0dDsKKwkJdW5zaWduZWQgaW50IHNocmVnOworCQlzdHJ1Y3QgbW9kZW1fc3RhdGVfc2VyMTIgeworCQkJdW5zaWduZWQgY2hhciB0eF9iaXQ7CisJCQl1bnNpZ25lZCBjaGFyIGxhc3RfcnhiaXQ7CisJCQlpbnQgZGNkX3N1bTAsIGRjZF9zdW0xLCBkY2Rfc3VtMjsKKwkJCWludCBkY2RfdGltZTsKKwkJCXVuc2lnbmVkIGludCBwbGxfdGltZTsKKwkJCXVuc2lnbmVkIGludCB0eHNocmVnOworCQl9IHNlcjEyOworCX0gbW9kZW07CisKKyNpZmRlZiBCQVlDT01fREVCVUcKKwlzdHJ1Y3QgZGVidWdfdmFscyB7CisJCXVuc2lnbmVkIGxvbmcgbGFzdF9qaWZmaWVzOworCQl1bnNpZ25lZCBjdXJfaW50Y250OworCQl1bnNpZ25lZCBsYXN0X2ludGNudDsKKwkJaW50IGN1cl9wbGxjb3JyOworCQlpbnQgbGFzdF9wbGxjb3JyOworCX0gZGVidWdfdmFsczsKKyNlbmRpZiAvKiBCQVlDT01fREVCVUcgKi8KK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgYmF5Y29tX2ludF9mcmVxKHN0cnVjdCBiYXljb21fc3RhdGUgKmJjKQoreworI2lmZGVmIEJBWUNPTV9ERUJVRworCXVuc2lnbmVkIGxvbmcgY3VyX2ppZmZpZXMgPSBqaWZmaWVzOworCS8qCisJICogbWVhc3VyZSB0aGUgaW50ZXJydXB0IGZyZXF1ZW5jeQorCSAqLworCWJjLT5kZWJ1Z192YWxzLmN1cl9pbnRjbnQrKzsKKwlpZiAoKGN1cl9qaWZmaWVzIC0gYmMtPmRlYnVnX3ZhbHMubGFzdF9qaWZmaWVzKSA+PSBIWikgeworCQliYy0+ZGVidWdfdmFscy5sYXN0X2ppZmZpZXMgPSBjdXJfamlmZmllczsKKwkJYmMtPmRlYnVnX3ZhbHMubGFzdF9pbnRjbnQgPSBiYy0+ZGVidWdfdmFscy5jdXJfaW50Y250OworCQliYy0+ZGVidWdfdmFscy5jdXJfaW50Y250ID0gMDsKKwkJYmMtPmRlYnVnX3ZhbHMubGFzdF9wbGxjb3JyID0gYmMtPmRlYnVnX3ZhbHMuY3VyX3BsbGNvcnI7CisJCWJjLT5kZWJ1Z192YWxzLmN1cl9wbGxjb3JyID0gMDsKKwl9CisjZW5kaWYgLyogQkFZQ09NX0RFQlVHICovCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PSBTRVIxMiBzcGVjaWZpYyByb3V0aW5lcyA9PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXIxMl9zZXRfZGl2aXNvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkaXZpc29yKQoreworICAgICAgICBvdXRiKDB4ODEsIExDUihkZXYtPmJhc2VfYWRkcikpOyAgICAgICAgLyogRExBQiA9IDEgKi8KKyAgICAgICAgb3V0YihkaXZpc29yLCBETEwoZGV2LT5iYXNlX2FkZHIpKTsKKyAgICAgICAgb3V0YihkaXZpc29yID4+IDgsIERMTShkZXYtPmJhc2VfYWRkcikpOworICAgICAgICBvdXRiKDB4MDEsIExDUihkZXYtPmJhc2VfYWRkcikpOyAgICAgICAgLyogd29yZCBsZW5ndGggPSA2ICovCisgICAgICAgIC8qCisgICAgICAgICAqIG1ha2Ugc3VyZSB0aGUgbmV4dCBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkOworICAgICAgICAgKiAwIG11c3QgYmUgdXNlZCB0byBwb3dlciB0aGUgbW9kZW07IHRoZSBtb2RlbSBkcmF3cyBpdHMKKyAgICAgICAgICogcG93ZXIgZnJvbSB0aGUgVHhEIGxpbmUKKyAgICAgICAgICovCisgICAgICAgIG91dGIoMHgwMCwgVEhSKGRldi0+YmFzZV9hZGRyKSk7CisgICAgICAgIC8qCisgICAgICAgICAqIGl0IGlzIGltcG9ydGFudCBub3QgdG8gc2V0IHRoZSBkaXZpZGVyIHdoaWxlIHRyYW5zbWl0dGluZzsKKyAgICAgICAgICogdGhpcyByZXBvcnRlZGx5IG1ha2VzIHNvbWUgVUFSVHMgZ2VuZXJhdGluZyBpbnRlcnJ1cHRzCisgICAgICAgICAqIGluIHRoZSBodW5kcmVkdGhvdXNhbmRzIHBlciBzZWNvbmQgcmVnaW9uCisgICAgICAgICAqIFJlcG9ydGVkIGJ5OiBJZ25hY2lvLkFyZW5hemFAc3R1ZGkuZXBmbC5jaCAoSWduYWNpbyBBcmVuYXphIE51bm8pCisgICAgICAgICAqLworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIDAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGh3ZWlnaHQxNih1bnNpZ25lZCBpbnQgdykKKyAgICAgICAgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaHdlaWdodDgodW5zaWduZWQgaW50IHcpCisgICAgICAgIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaHdlaWdodDE2KHVuc2lnbmVkIGludCB3KQoreworICAgICAgICB1bnNpZ25lZCBzaG9ydCByZXMgPSAodyAmIDB4NTU1NSkgKyAoKHcgPj4gMSkgJiAweDU1NTUpOworICAgICAgICByZXMgPSAocmVzICYgMHgzMzMzKSArICgocmVzID4+IDIpICYgMHgzMzMzKTsKKyAgICAgICAgcmVzID0gKHJlcyAmIDB4MEYwRikgKyAoKHJlcyA+PiA0KSAmIDB4MEYwRik7CisgICAgICAgIHJldHVybiAocmVzICYgMHgwMEZGKSArICgocmVzID4+IDgpICYgMHgwMEZGKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaHdlaWdodDgodW5zaWduZWQgaW50IHcpCit7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHJlcyA9ICh3ICYgMHg1NSkgKyAoKHcgPj4gMSkgJiAweDU1KTsKKyAgICAgICAgcmVzID0gKHJlcyAmIDB4MzMpICsgKChyZXMgPj4gMikgJiAweDMzKTsKKyAgICAgICAgcmV0dXJuIChyZXMgJiAweDBGKSArICgocmVzID4+IDQpICYgMHgwRik7Cit9CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgc2VyMTJfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMsIHN0cnVjdCB0aW1ldmFsICp0diwgdW5zaWduZWQgY2hhciBjdXJzKQoreworCWludCB0aW1lZGlmZjsKKwlpbnQgYmR1czggPSBiYy0+YmF1ZF91cyA+PiAzOworCWludCBiZHVzNCA9IGJjLT5iYXVkX3VzID4+IDI7CisJaW50IGJkdXMyID0gYmMtPmJhdWRfdXMgPj4gMTsKKworCXRpbWVkaWZmID0gMTAwMDAwMCArIHR2LT50dl91c2VjIC0gYmMtPm1vZGVtLnNlcjEyLnBsbF90aW1lOworCXdoaWxlICh0aW1lZGlmZiA+PSA1MDAwMDApCisJCXRpbWVkaWZmIC09IDEwMDAwMDA7CisJd2hpbGUgKHRpbWVkaWZmID49IGJkdXMyKSB7CisJCXRpbWVkaWZmIC09IGJjLT5iYXVkX3VzOworCQliYy0+bW9kZW0uc2VyMTIucGxsX3RpbWUgKz0gYmMtPmJhdWRfdXM7CisJCWJjLT5tb2RlbS5zZXIxMi5kY2RfdGltZS0tOworCQkvKiBmaXJzdCBjaGVjayBpZiB0aGVyZSBpcyByb29tIHRvIGFkZCBhIGJpdCAqLworCQlpZiAoYmMtPm1vZGVtLnNocmVnICYgMSkgeworCQkJaGRsY2Rydl9wdXRiaXRzKCZiYy0+aGRydiwgKGJjLT5tb2RlbS5zaHJlZyA+PiAxKSBeIDB4ZmZmZik7CisJCQliYy0+bW9kZW0uc2hyZWcgPSAweDEwMDAwOworCQl9CisJCS8qIGFkZCBhIG9uZSBiaXQgKi8KKwkJYmMtPm1vZGVtLnNocmVnID4+PSAxOworCX0KKwlpZiAoYmMtPm1vZGVtLnNlcjEyLmRjZF90aW1lIDw9IDApIHsKKwkJaWYgKCFiYy0+b3B0X2RjZCkKKwkJCWhkbGNkcnZfc2V0ZGNkKCZiYy0+aGRydiwgKGJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMCArIAorCQkJCQkJICAgYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0xICsgCisJCQkJCQkgICBiYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTIpIDwgMCk7CisJCWJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMiA9IGJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMTsKKwkJYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0xID0gYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0wOworCQliYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTAgPSAyOyAvKiBzbGlnaHQgYmlhcyAqLworCQliYy0+bW9kZW0uc2VyMTIuZGNkX3RpbWUgKz0gMTIwOworCX0KKwlpZiAoYmMtPm1vZGVtLnNlcjEyLmxhc3RfcnhiaXQgIT0gY3VycykgeworCQliYy0+bW9kZW0uc2VyMTIubGFzdF9yeGJpdCA9IGN1cnM7CisJCWJjLT5tb2RlbS5zaHJlZyB8PSAweDEwMDAwOworCQkvKiBhZGp1c3QgdGhlIFBMTCAqLworCQlpZiAodGltZWRpZmYgPiAwKQorCQkJYmMtPm1vZGVtLnNlcjEyLnBsbF90aW1lICs9IGJkdXM4OworCQllbHNlCisJCQliYy0+bW9kZW0uc2VyMTIucGxsX3RpbWUgKz0gMTAwMDAwMCAtIGJkdXM4OworCQkvKiB1cGRhdGUgRENEICovCisJCWlmIChhYnModGltZWRpZmYpID4gYmR1czQpCisJCQliYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTAgKz0gNDsKKwkJZWxzZQorCQkJYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0wLS07CisjaWZkZWYgQkFZQ09NX0RFQlVHCisJCWJjLT5kZWJ1Z192YWxzLmN1cl9wbGxjb3JyID0gdGltZWRpZmY7CisjZW5kaWYgLyogQkFZQ09NX0RFQlVHICovCisJfQorCXdoaWxlIChiYy0+bW9kZW0uc2VyMTIucGxsX3RpbWUgPj0gMTAwMDAwMCkKKwkJYmMtPm1vZGVtLnNlcjEyLnBsbF90aW1lIC09IDEwMDAwMDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2VyMTJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKwlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYyA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJdW5zaWduZWQgY2hhciBpaXIsIG1zcjsKKwl1bnNpZ25lZCBpbnQgdHhjb3VudCA9IDA7CisKKwlpZiAoIWJjIHx8IGJjLT5oZHJ2Lm1hZ2ljICE9IEhETENEUlZfTUFHSUMpCisJCXJldHVybiBJUlFfTk9ORTsKKwkvKiBmYXN0IHdheSBvdXQgZm9yIHNoYXJlZCBpcnEgKi8KKwlpZiAoKGlpciA9IGluYihJSVIoZGV2LT5iYXNlX2FkZHIpKSkgJiAxKSAJCisJCXJldHVybiBJUlFfTk9ORTsKKwkvKiBnZXQgY3VycmVudCB0aW1lICovCisJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJbXNyID0gaW5iKE1TUihkZXYtPmJhc2VfYWRkcikpOworCS8qIGRlbHRhIERDRCAqLworCWlmICgobXNyICYgOCkgJiYgYmMtPm9wdF9kY2QpCisJCWhkbGNkcnZfc2V0ZGNkKCZiYy0+aGRydiwgISgobXNyIF4gYmMtPm9wdF9kY2QpICYgMHg4MCkpOworCWRvIHsKKwkJc3dpdGNoIChpaXIgJiA2KSB7CisJCWNhc2UgNjoKKwkJCWluYihMU1IoZGV2LT5iYXNlX2FkZHIpKTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgNDoKKwkJCWluYihSQlIoZGV2LT5iYXNlX2FkZHIpKTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgMjoKKwkJCS8qCisJCQkgKiBtYWtlIHN1cmUgdGhlIG5leHQgaW50ZXJydXB0IGlzIGdlbmVyYXRlZDsKKwkJCSAqIDAgbXVzdCBiZSB1c2VkIHRvIHBvd2VyIHRoZSBtb2RlbTsgdGhlIG1vZGVtIGRyYXdzIGl0cworCQkJICogcG93ZXIgZnJvbSB0aGUgVHhEIGxpbmUKKwkJCSAqLworCQkJb3V0YigweDAwLCBUSFIoZGV2LT5iYXNlX2FkZHIpKTsKKwkJCWJheWNvbV9pbnRfZnJlcShiYyk7CisJCQl0eGNvdW50Kys7CisJCQkvKgorCQkJICogZmlyc3Qgb3V0cHV0IHRoZSBsYXN0IGJpdCAoISkgdGhlbiBjYWxsIEhETEMgdHJhbnNtaXR0ZXIsCisJCQkgKiBzaW5jZSB0aGlzIG1heSB0YWtlIHF1aXRlIGxvbmcKKwkJCSAqLworCQkJaWYgKGJjLT5tb2RlbS5wdHQpCisJCQkJb3V0YigweDBlIHwgKCEhYmMtPm1vZGVtLnNlcjEyLnR4X2JpdCksIE1DUihkZXYtPmJhc2VfYWRkcikpOworCQkJZWxzZQorCQkJCW91dGIoMHgwZCwgTUNSKGRldi0+YmFzZV9hZGRyKSk7ICAgICAgIC8qIHRyYW5zbWl0dGVyIG9mZiAqLworCQkJYnJlYWs7CisJCQkKKwkJZGVmYXVsdDoKKwkJCW1zciA9IGluYihNU1IoZGV2LT5iYXNlX2FkZHIpKTsKKwkJCS8qIGRlbHRhIERDRCAqLworCQkJaWYgKChtc3IgJiA4KSAmJiBiYy0+b3B0X2RjZCkgCisJCQkJaGRsY2Rydl9zZXRkY2QoJmJjLT5oZHJ2LCAhKChtc3IgXiBiYy0+b3B0X2RjZCkgJiAweDgwKSk7CisJCQlicmVhazsKKwkJfQorCQlpaXIgPSBpbmIoSUlSKGRldi0+YmFzZV9hZGRyKSk7CisJfSB3aGlsZSAoIShpaXIgJiAxKSk7CisJc2VyMTJfcngoZGV2LCBiYywgJnR2LCBtc3IgJiAweDEwKTsgLyogQ1RTICovCisJaWYgKGJjLT5tb2RlbS5wdHQgJiYgdHhjb3VudCkgeworCQlpZiAoYmMtPm1vZGVtLnNlcjEyLnR4c2hyZWcgPD0gMSkgeworCQkJYmMtPm1vZGVtLnNlcjEyLnR4c2hyZWcgPSAweDEwMDAwIHwgaGRsY2Rydl9nZXRiaXRzKCZiYy0+aGRydik7CisJCQlpZiAoIWhkbGNkcnZfcHR0KCZiYy0+aGRydikpIHsKKwkJCQlzZXIxMl9zZXRfZGl2aXNvcihkZXYsIDExNTIwMC8xMDAvOCk7CisJCQkJYmMtPm1vZGVtLnB0dCA9IDA7CisJCQkJZ290byBlbmRfdHJhbnNtaXQ7CisJCQl9CisJCX0KKwkJYmMtPm1vZGVtLnNlcjEyLnR4X2JpdCA9ICEoYmMtPm1vZGVtLnNlcjEyLnR4X2JpdCBeIChiYy0+bW9kZW0uc2VyMTIudHhzaHJlZyAmIDEpKTsKKwkJYmMtPm1vZGVtLnNlcjEyLnR4c2hyZWcgPj49IDE7CisJfQorIGVuZF90cmFuc21pdDoKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJaWYgKCFiYy0+bW9kZW0ucHR0ICYmIHR4Y291bnQpIHsKKwkJaGRsY2Rydl9hcmJpdHJhdGUoZGV2LCAmYmMtPmhkcnYpOworCQlpZiAoaGRsY2Rydl9wdHQoJmJjLT5oZHJ2KSkgeworCQkJc2VyMTJfc2V0X2Rpdmlzb3IoZGV2LCBiYy0+YmF1ZF91YXJ0ZGl2KTsKKwkJCWJjLT5tb2RlbS5zZXIxMi50eHNocmVnID0gMTsKKwkJCWJjLT5tb2RlbS5wdHQgPSAxOworCQl9CisJfQorCWhkbGNkcnZfdHJhbnNtaXR0ZXIoZGV2LCAmYmMtPmhkcnYpOworCWhkbGNkcnZfcmVjZWl2ZXIoZGV2LCAmYmMtPmhkcnYpOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZW51bSB1YXJ0IHsgY191YXJ0X3Vua25vd24sIGNfdWFydF84MjUwLAorCSAgICBjX3VhcnRfMTY0NTAsIGNfdWFydF8xNjU1MCwgY191YXJ0XzE2NTUwQX07CitzdGF0aWMgY29uc3QgY2hhciAqdWFydF9zdHJbXSA9IHsgCisJInVua25vd24iLCAiODI1MCIsICIxNjQ1MCIsICIxNjU1MCIsICIxNjU1MEEiIAorfTsKKworc3RhdGljIGVudW0gdWFydCBzZXIxMl9jaGVja191YXJ0KHVuc2lnbmVkIGludCBpb2Jhc2UpCit7CisJdW5zaWduZWQgY2hhciBiMSxiMixiMzsKKwllbnVtIHVhcnQgdTsKKwllbnVtIHVhcnQgdWFydF90YWJbXSA9CisJCXsgY191YXJ0XzE2NDUwLCBjX3VhcnRfdW5rbm93biwgY191YXJ0XzE2NTUwLCBjX3VhcnRfMTY1NTBBIH07CisKKwliMSA9IGluYihNQ1IoaW9iYXNlKSk7CisJb3V0YihiMSB8IDB4MTAsIE1DUihpb2Jhc2UpKTsJLyogbG9vcGJhY2sgbW9kZSAqLworCWIyID0gaW5iKE1TUihpb2Jhc2UpKTsKKwlvdXRiKDB4MWEsIE1DUihpb2Jhc2UpKTsKKwliMyA9IGluYihNU1IoaW9iYXNlKSkgJiAweGYwOworCW91dGIoYjEsIE1DUihpb2Jhc2UpKTsJCQkvKiByZXN0b3JlIG9sZCB2YWx1ZXMgKi8KKwlvdXRiKGIyLCBNU1IoaW9iYXNlKSk7CisJaWYgKGIzICE9IDB4OTApCisJCXJldHVybiBjX3VhcnRfdW5rbm93bjsKKwlpbmIoUkJSKGlvYmFzZSkpOworCWluYihSQlIoaW9iYXNlKSk7CisJb3V0YigweDAxLCBGQ1IoaW9iYXNlKSk7CQkvKiBlbmFibGUgRklGT3MgKi8KKwl1ID0gdWFydF90YWJbKGluYihJSVIoaW9iYXNlKSkgPj4gNikgJiAzXTsKKwlpZiAodSA9PSBjX3VhcnRfMTY0NTApIHsKKwkJb3V0YigweDVhLCBTQ1IoaW9iYXNlKSk7CisJCWIxID0gaW5iKFNDUihpb2Jhc2UpKTsKKwkJb3V0YigweGE1LCBTQ1IoaW9iYXNlKSk7CisJCWIyID0gaW5iKFNDUihpb2Jhc2UpKTsKKwkJaWYgKChiMSAhPSAweDVhKSB8fCAoYjIgIT0gMHhhNSkpCisJCQl1ID0gY191YXJ0XzgyNTA7CisJfQorCXJldHVybiB1OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBzZXIxMl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCWVudW0gdWFydCB1OworCisJaWYgKCFkZXYgfHwgIWJjKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghZGV2LT5iYXNlX2FkZHIgfHwgZGV2LT5iYXNlX2FkZHIgPiAweDEwMDAtU0VSMTJfRVhURU5UIHx8CisJICAgIGRldi0+aXJxIDwgMiB8fCBkZXYtPmlycSA+IDE1KQorCQlyZXR1cm4gLUVOWElPOworCWlmIChiYy0+YmF1ZCA8IDMwMCB8fCBiYy0+YmF1ZCA+IDQ4MDApCisJCXJldHVybiAtRUlOVkFMOworCWlmICghcmVxdWVzdF9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFNFUjEyX0VYVEVOVCwgImJheWNvbV9zZXJfZmR4IikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQkFZQ09NX1NFUl9GU1g6IEkvTyBwb3J0IDB4JTA0bHggYnVzeSBcbiIsIAorCQkgICAgICAgZGV2LT5iYXNlX2FkZHIpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisJbWVtc2V0KCZiYy0+bW9kZW0sIDAsIHNpemVvZihiYy0+bW9kZW0pKTsKKwliYy0+aGRydi5wYXIuYml0cmF0ZSA9IGJjLT5iYXVkOworCWJjLT5iYXVkX3VzID0gMTAwMDAwMC9iYy0+YmF1ZDsKKwliYy0+YmF1ZF91YXJ0ZGl2ID0gKDExNTIwMC84KS9iYy0+YmF1ZDsKKwlpZiAoKHUgPSBzZXIxMl9jaGVja191YXJ0KGRldi0+YmFzZV9hZGRyKSkgPT0gY191YXJ0X3Vua25vd24peworCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgU0VSMTJfRVhURU5UKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCW91dGIoMCwgRkNSKGRldi0+YmFzZV9hZGRyKSk7ICAvKiBkaXNhYmxlIEZJRk9zICovCisJb3V0YigweDBkLCBNQ1IoZGV2LT5iYXNlX2FkZHIpKTsKKwlvdXRiKDAsIElFUihkZXYtPmJhc2VfYWRkcikpOworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgc2VyMTJfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwKKwkJCSJiYXljb21fc2VyX2ZkeCIsIGRldikpIHsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFNFUjEyX0VYVEVOVCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCS8qCisJICogc2V0IHRoZSBTSU8gdG8gNiBCaXRzL2NoYXJhY3RlcjsgZHVyaW5nIHJlY2VpdmUsCisJICogdGhlIGJhdWQgcmF0ZSBpcyBzZXQgdG8gcHJvZHVjZSAxMDAgaW50cy9zZWMKKwkgKiB0byBmZWVkIHRoZSBjaGFubmVsIGFyYml0cmF0aW9uIHByb2Nlc3MsCisJICogZHVyaW5nIHRyYW5zbWl0IHRvIGJhdWQgaW50cy9zZWMgdG8gcnVuCisJICogdGhlIHRyYW5zbWl0dGVyCisJICovCisJc2VyMTJfc2V0X2Rpdmlzb3IoZGV2LCAxMTUyMDAvMTAwLzgpOworCS8qCisJICogZW5hYmxlIHRyYW5zbWl0dGVyIGVtcHR5IGludGVycnVwdCBhbmQgbW9kZW0gc3RhdHVzIGludGVycnVwdAorCSAqLworCW91dGIoMHgwYSwgSUVSKGRldi0+YmFzZV9hZGRyKSk7CisJLyoKKwkgKiBtYWtlIHN1cmUgdGhlIG5leHQgaW50ZXJydXB0IGlzIGdlbmVyYXRlZDsKKwkgKiAwIG11c3QgYmUgdXNlZCB0byBwb3dlciB0aGUgbW9kZW07IHRoZSBtb2RlbSBkcmF3cyBpdHMKKwkgKiBwb3dlciBmcm9tIHRoZSBUeEQgbGluZQorCSAqLworCW91dGIoMHgwMCwgVEhSKGRldi0+YmFzZV9hZGRyKSk7CisJaGRsY2Rydl9zZXRkY2QoJmJjLT5oZHJ2LCAwKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogc2VyX2ZkeCBhdCBpb2Jhc2UgMHglbHggaXJxICV1IGJhdWQgJXUgdWFydCAlc1xuIiwKKwkgICAgICAgYmNfZHJ2bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxLCBiYy0+YmF1ZCwgdWFydF9zdHJbdV0pOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBzZXIxMl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghZGV2IHx8ICFiYykKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyoKKwkgKiBkaXNhYmxlIGludGVycnVwdHMKKwkgKi8KKwlvdXRiKDAsIElFUihkZXYtPmJhc2VfYWRkcikpOworCW91dGIoMSwgTUNSKGRldi0+YmFzZV9hZGRyKSk7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFNFUjEyX0VYVEVOVCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNsb3NlIHNlcl9mZHggYXQgaW9iYXNlIDB4JWx4IGlycSAldVxuIiwKKwkgICAgICAgYmNfZHJ2bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09IGhkbGNkcnYgZHJpdmVyIGludGVyZmFjZSA9PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgYmF5Y29tX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLAorCQkJc3RydWN0IGhkbGNkcnZfaW9jdGwgKmhpLCBpbnQgY21kKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgaGRsY2Rydl9vcHMgc2VyMTJfb3BzID0geworCS5kcnZuYW1lID0gYmNfZHJ2bmFtZSwKKwkuZHJ2aW5mbyA9IGJjX2RydmluZm8sCisJLm9wZW4gICAgPSBzZXIxMl9vcGVuLAorCS5jbG9zZSAgID0gc2VyMTJfY2xvc2UsCisJLmlvY3RsICAgPSBiYXljb21faW9jdGwsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBiYXljb21fc2V0bW9kZShzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYywgY29uc3QgY2hhciAqbW9kZXN0cikKK3sKKwl1bnNpZ25lZCBpbnQgYmF1ZDsKKworCWlmICghc3RybmNtcChtb2Rlc3RyLCAic2VyIiwgMykpIHsKKwkJYmF1ZCA9IHNpbXBsZV9zdHJ0b3VsKG1vZGVzdHIrMywgTlVMTCwgMTApOworCQlpZiAoYmF1ZCA+PSAzICYmIGJhdWQgPD0gNDgpCisJCQliYy0+YmF1ZCA9IGJhdWQqMTAwOworCX0KKwlpZiAoc3RyY2hyKG1vZGVzdHIsICcqJykpCisJCWJjLT5vcHRfZGNkID0gMDsKKwllbHNlIGlmIChzdHJjaHIobW9kZXN0ciwgJysnKSkKKwkJYmMtPm9wdF9kY2QgPSAtMTsKKwllbHNlCisJCWJjLT5vcHRfZGNkID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgYmF5Y29tX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLAorCQkJc3RydWN0IGhkbGNkcnZfaW9jdGwgKmhpLCBpbnQgY21kKQoreworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjOworCXN0cnVjdCBiYXljb21faW9jdGwgYmk7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwliYyA9IG5ldGRldl9wcml2KGRldik7CisJQlVHX09OKGJjLT5oZHJ2Lm1hZ2ljICE9IEhETENEUlZfTUFHSUMpOworCisJaWYgKGNtZCAhPSBTSU9DREVWUFJJVkFURSkKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwlzd2l0Y2ggKGhpLT5jbWQpIHsKKwlkZWZhdWx0OgorCQlicmVhazsKKworCWNhc2UgSERMQ0RSVkNUTF9HRVRNT0RFOgorCQlzcHJpbnRmKGhpLT5kYXRhLm1vZGVuYW1lLCAic2VyJXUiLCBiYy0+YmF1ZCAvIDEwMCk7CisJCWlmIChiYy0+b3B0X2RjZCA8PSAwKQorCQkJc3RyY2F0KGhpLT5kYXRhLm1vZGVuYW1lLCAoIWJjLT5vcHRfZGNkKSA/ICIqIiA6ICIrIik7CisJCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgaGksIHNpemVvZihzdHJ1Y3QgaGRsY2Rydl9pb2N0bCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBIRExDRFJWQ1RMX1NFVE1PREU6CisJCWlmIChuZXRpZl9ydW5uaW5nKGRldikgfHwgIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJaGktPmRhdGEubW9kZW5hbWVbc2l6ZW9mKGhpLT5kYXRhLm1vZGVuYW1lKS0xXSA9ICdcMCc7CisJCXJldHVybiBiYXljb21fc2V0bW9kZShiYywgaGktPmRhdGEubW9kZW5hbWUpOworCisJY2FzZSBIRExDRFJWQ1RMX01PREVMSVNUOgorCQlzdHJjcHkoaGktPmRhdGEubW9kZW5hbWUsICJzZXIxMixzZXIzLHNlcjI0Iik7CisJCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgaGksIHNpemVvZihzdHJ1Y3QgaGRsY2Rydl9pb2N0bCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBIRExDRFJWQ1RMX01PREVNUEFSTUFTSzoKKwkJcmV0dXJuIEhETENEUlZfUEFSTUFTS19JT0JBU0UgfCBIRExDRFJWX1BBUk1BU0tfSVJROworCisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZiaSwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKGJpKSkpCisJCXJldHVybiAtRUZBVUxUOworCXN3aXRjaCAoYmkuY21kKSB7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworI2lmZGVmIEJBWUNPTV9ERUJVRworCWNhc2UgQkFZQ09NQ1RMX0dFVERFQlVHOgorCQliaS5kYXRhLmRiZy5kZWJ1ZzEgPSBiYy0+aGRydi5wdHRfa2V5ZWQ7CisJCWJpLmRhdGEuZGJnLmRlYnVnMiA9IGJjLT5kZWJ1Z192YWxzLmxhc3RfaW50Y250OworCQliaS5kYXRhLmRiZy5kZWJ1ZzMgPSBiYy0+ZGVidWdfdmFscy5sYXN0X3BsbGNvcnI7CisJCWJyZWFrOworI2VuZGlmIC8qIEJBWUNPTV9ERUJVRyAqLworCisJfQorCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgJmJpLCBzaXplb2YoYmkpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7CisKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBjb21tYW5kIGxpbmUgc2V0dGFibGUgcGFyYW1ldGVycworICovCitzdGF0aWMgY2hhciAqbW9kZVtOUl9QT1JUU10gPSB7ICJzZXIxMioiLCB9Oworc3RhdGljIGludCBpb2Jhc2VbTlJfUE9SVFNdID0geyAweDNmOCwgfTsKK3N0YXRpYyBpbnQgaXJxW05SX1BPUlRTXSA9IHsgNCwgfTsKK3N0YXRpYyBpbnQgYmF1ZFtOUl9QT1JUU10gPSB7IFswIC4uLiBOUl9QT1JUUy0xXSA9IDEyMDAgfTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG1vZGUsIGNoYXJwLCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobW9kZSwgImJheWNvbSBvcGVyYXRpbmcgbW9kZTsgKiBmb3Igc29mdHdhcmUgRENEIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaW9iYXNlLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpb2Jhc2UsICJiYXljb20gaW8gYmFzZSBhZGRyZXNzIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJiYXljb20gaXJxIG51bWJlciIpOworbW9kdWxlX3BhcmFtX2FycmF5KGJhdWQsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGJhdWQsICJiYXljb20gYmF1ZCByYXRlICgzMDAgdG8gNDgwMCkiKTsKKworTU9EVUxFX0FVVEhPUigiVGhvbWFzIE0uIFNhaWxlciwgc2FpbGVyQGlmZS5lZS5ldGh6LmNoLCBoYjlqbnhAaGI5dy5jaGUuZXUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmF5Y29tIHNlcjEyIGZ1bGwgZHVwbGV4IGFtYXRldXIgcmFkaW8gbW9kZW0gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2JheWNvbXNlcmZkeCh2b2lkKQoreworCWludCBpLCBmb3VuZCA9IDA7CisJY2hhciBzZXRfaHcgPSAxOworCisJcHJpbnRrKGJjX2RydmluZm8pOworCS8qCisJICogcmVnaXN0ZXIgbmV0IGRldmljZXMKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlJfUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCQlzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYzsKKwkJY2hhciBpZm5hbWVbSUZOQU1TSVpdOworCisJCXNwcmludGYoaWZuYW1lLCAiYmNzZiVkIiwgaSk7CisKKwkJaWYgKCFtb2RlW2ldKQorCQkJc2V0X2h3ID0gMDsKKwkJaWYgKCFzZXRfaHcpCisJCQlpb2Jhc2VbaV0gPSBpcnFbaV0gPSAwOworCisJCWRldiA9IGhkbGNkcnZfcmVnaXN0ZXIoJnNlcjEyX29wcywgCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYmF5Y29tX3N0YXRlKSwKKwkJCQkgICAgICAgaWZuYW1lLCBpb2Jhc2VbaV0sIGlycVtpXSwgMCk7CisJCWlmIChJU19FUlIoZGV2KSkgCisJCQlicmVhazsKKworCQliYyA9IG5ldGRldl9wcml2KGRldik7CisJCWlmIChzZXRfaHcgJiYgYmF5Y29tX3NldG1vZGUoYmMsIG1vZGVbaV0pKQorCQkJc2V0X2h3ID0gMDsKKwkJYmMtPmJhdWQgPSBiYXVkW2ldOworCQlmb3VuZCsrOworCQliYXljb21fZGV2aWNlW2ldID0gZGV2OworCX0KKworCWlmICghZm91bmQpCisJCXJldHVybiAtRU5YSU87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2JheWNvbXNlcmZkeCh2b2lkKQoreworCWludCBpOworCisJZm9yKGkgPSAwOyBpIDwgTlJfUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYmF5Y29tX2RldmljZVtpXTsKKwkJaWYgKGRldikgCisJCQloZGxjZHJ2X3VucmVnaXN0ZXIoZGV2KTsKKwl9Cit9CisKK21vZHVsZV9pbml0KGluaXRfYmF5Y29tc2VyZmR4KTsKK21vZHVsZV9leGl0KGNsZWFudXBfYmF5Y29tc2VyZmR4KTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTU9EVUxFCisKKy8qCisgKiBmb3JtYXQ6IGJheWNvbV9zZXJfZmR4PWlvLGlycSxtb2RlCisgKiBtb2RlOiBzZXIjICAgIGhhcmR3YXJlIERDRAorICogICAgICAgc2VyIyogICBzb2Z0d2FyZSBEQ0QKKyAqICAgICAgIHNlciMrICAgaGFyZHdhcmUgRENELCBpbnZlcnRlZCBzaWduYWwgYXQgRENEIHBpbgorICogJyMnIGRlbm90ZXMgdGhlIGJhdWQgcmF0ZSAvIDEwMCwgZWcuIHNlcjEyKiBpcyAnMTIwMCBiYXVkLCBzb2Z0IERDRCcKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBiYXljb21fc2VyX2ZkeF9zZXR1cChjaGFyICpzdHIpCit7CisgICAgICAgIHN0YXRpYyB1bnNpZ25lZCBucl9kZXY7CisgICAgICAgIGludCBpbnRzWzRdOworCisgICAgICAgIGlmIChucl9kZXYgPj0gTlJfUE9SVFMpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHN0ciA9IGdldF9vcHRpb25zKHN0ciwgNCwgaW50cyk7CisgICAgICAgIGlmIChpbnRzWzBdIDwgMikKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbW9kZVtucl9kZXZdID0gc3RyOworICAgICAgICBpb2Jhc2VbbnJfZGV2XSA9IGludHNbMV07CisgICAgICAgIGlycVtucl9kZXZdID0gaW50c1syXTsKKwlpZiAoaW50c1swXSA+PSAzKQorCQliYXVkW25yX2Rldl0gPSBpbnRzWzNdOworCW5yX2RldisrOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJiYXljb21fc2VyX2ZkeD0iLCBiYXljb21fc2VyX2ZkeF9zZXR1cCk7CisKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX3Nlcl9oZHguYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JheWNvbV9zZXJfaGR4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhZDg1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JheWNvbV9zZXJfaGR4LmMKQEAgLTAsMCArMSw3NDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqCWJheWNvbV9zZXJfaGR4LmMgIC0tIGJheWNvbSBzZXIxMiBoYWxmZHVwbGV4IHJhZGlvIG1vZGVtIGRyaXZlci4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMCAgVGhvbWFzIFNhaWxlciAoc2FpbGVyQGlmZS5lZS5ldGh6LmNoKQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBHUEwgYWxsb3dzIHlvdSB0byB1c2UgdGhlIGRyaXZlciwgTk9UIHRoZSByYWRpby4KKyAqICBJbiBvcmRlciB0byB1c2UgdGhlIHJhZGlvLCB5b3UgbmVlZCBhIGxpY2Vuc2UgZnJvbSB0aGUgY29tbXVuaWNhdGlvbnMKKyAqICBhdXRob3JpdHkgb2YgeW91ciBjb3VudHJ5LgorICoKKyAqCisgKiAgU3VwcG9ydGVkIG1vZGVtcworICoKKyAqICBzZXIxMjogIFRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSAxMjAwIGJhdWQgQUZTSyBtb2RlbS4gVGhlIG1vZGVtIGNvbnNpc3RzIG9ubHkKKyAqICAgICAgICAgIG9mIGEgbW9kdWxhdG9yL2RlbW9kdWxhdG9yIGNoaXAsIHVzdWFsbHkgYSBUSSBUQ00zMTA1LiBUaGUgY29tcHV0ZXIKKyAqICAgICAgICAgIGlzIHJlc3BvbnNpYmxlIGZvciByZWdlbmVyYXRpbmcgdGhlIHJlY2VpdmVyIGJpdCBjbG9jaywgYXMgd2VsbCBhcworICogICAgICAgICAgZm9yIGhhbmRsaW5nIHRoZSBIRExDIHByb3RvY29sLiBUaGUgbW9kZW0gY29ubmVjdHMgdG8gYSBzZXJpYWwgcG9ydCwKKyAqICAgICAgICAgIGhlbmNlIHRoZSBuYW1lLiBTaW5jZSB0aGUgc2VyaWFsIHBvcnQgaXMgbm90IHVzZWQgYXMgYW4gYXN5bmMgc2VyaWFsCisgKiAgICAgICAgICBwb3J0LCB0aGUga2VybmVsIGRyaXZlciBmb3Igc2VyaWFsIHBvcnRzIGNhbm5vdCBiZSB1c2VkLCBhbmQgdGhpcworICogICAgICAgICAgZHJpdmVyIG9ubHkgc3VwcG9ydHMgc3RhbmRhcmQgc2VyaWFsIGhhcmR3YXJlICg4MjUwLCAxNjQ1MCwgMTY1NTBBKQorICoKKyAqCisgKiAgQ29tbWFuZCBsaW5lIG9wdGlvbnMgKGluc21vZCBjb21tYW5kIGxpbmUpCisgKgorICogIG1vZGUgICAgIHNlcjEyICAgIGhhcmR3YXJlIERDRAorICogICAgICAgICAgIHNlcjEyKiAgIHNvZnR3YXJlIERDRAorICogICAgICAgICAgIHNlcjEyQCAgIGhhcmR3YXJlL3NvZnR3YXJlIERDRCwgaS5lLiBubyBleHBsaWNpdCBEQ0Qgc2lnbmFsIGJ1dCBoYXJkd2FyZQorICogICAgICAgICAgICAgICAgICAgIG11dGVzIGF1ZGlvIGlucHV0IHRvIHRoZSBtb2RlbQorICogICAgICAgICAgIHNlcjEyKyAgIGhhcmR3YXJlIERDRCwgaW52ZXJ0ZWQgc2lnbmFsIGF0IERDRCBwaW4KKyAqICBpb2Jhc2UgICBiYXNlIGFkZHJlc3Mgb2YgdGhlIHBvcnQ7IGNvbW1vbiB2YWx1ZXMgYXJlIDB4M2Y4LCAweDJmOCwgMHgzZTgsIDB4MmU4CisgKiAgaXJxICAgICAgaW50ZXJydXB0IGxpbmUgb2YgdGhlIHBvcnQ7IGNvbW1vbiB2YWx1ZXMgYXJlIDQsMworICoKKyAqCisgKiAgSGlzdG9yeToKKyAqICAgMC4xICAyNi4wNi4xOTk2ICBBZGFwdGVkIGZyb20gYmF5Y29tLmMgYW5kIG1hZGUgbmV0d29yayBkcml2ZXIgaW50ZXJmYWNlCisgKiAgICAgICAgMTguMTAuMTk5NiAgQ2hhbmdlZCB0byBuZXcgdXNlciBzcGFjZSBhY2Nlc3Mgcm91dGluZXMgKGNvcHlfe3RvLGZyb219X3VzZXIpCisgKiAgIDAuMyAgMjYuMDQuMTk5NyAgaW5pdCBjb2RlL2RhdGEgdGFnZ2VkCisgKiAgIDAuNCAgMDguMDcuMTk5NyAgYWx0ZXJuYXRpdmUgc2VyMTIgZGVjb2RpbmcgYWxnb3JpdGhtICh1c2VzIGRlbHRhIENUUyBpbnRzKQorICogICAwLjUgIDExLjExLjE5OTcgIHNlcjEyL3Bhcjk2IHNwbGl0IGludG8gc2VwYXJhdGUgZmlsZXMKKyAqICAgMC42ICAxNC4wNC4xOTk4ICBjbGVhbnVwcworICogICAwLjcgIDAzLjA4LjE5OTkgIGFkYXB0IHRvIExpbnVzJyBuZXcgX19zZXR1cC9fX2luaXRjYWxsCisgKiAgIDAuOCAgMTAuMDguMTk5OSAgdXNlIG1vZHVsZV9pbml0L21vZHVsZV9leGl0CisgKiAgIDAuOSAgMTIuMDIuMjAwMCAgYWRhcHRlZCB0byBzb2Z0bmV0IGRyaXZlciBpbnRlcmZhY2UKKyAqICAgMC4xMCAwMy4wNy4yMDAwICBmaXggaW50ZXJmYWNlIG5hbWUgaGFuZGxpbmcKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjZHJ2Lmg+CisjaW5jbHVkZSA8bGludXgvYmF5Y29tLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEJBWUNPTV9ERUJVRworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgYmNfZHJ2bmFtZVtdID0gImJheWNvbV9zZXJfaGR4IjsKK3N0YXRpYyBjb25zdCBjaGFyIGJjX2RydmluZm9bXSA9IEtFUk5fSU5GTyAiYmF5Y29tX3Nlcl9oZHg6IChDKSAxOTk2LTIwMDAgVGhvbWFzIFNhaWxlciwgSEI5Sk5YL0FFNFdBXG4iCitLRVJOX0lORk8gImJheWNvbV9zZXJfaGR4OiB2ZXJzaW9uIDAuMTAgY29tcGlsZWQgIiBfX1RJTUVfXyAiICIgX19EQVRFX18gIlxuIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTlJfUE9SVFMgNAorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmJheWNvbV9kZXZpY2VbTlJfUE9SVFNdOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBSQlIoaW9iYXNlKSAoaW9iYXNlKzApCisjZGVmaW5lIFRIUihpb2Jhc2UpIChpb2Jhc2UrMCkKKyNkZWZpbmUgSUVSKGlvYmFzZSkgKGlvYmFzZSsxKQorI2RlZmluZSBJSVIoaW9iYXNlKSAoaW9iYXNlKzIpCisjZGVmaW5lIEZDUihpb2Jhc2UpIChpb2Jhc2UrMikKKyNkZWZpbmUgTENSKGlvYmFzZSkgKGlvYmFzZSszKQorI2RlZmluZSBNQ1IoaW9iYXNlKSAoaW9iYXNlKzQpCisjZGVmaW5lIExTUihpb2Jhc2UpIChpb2Jhc2UrNSkKKyNkZWZpbmUgTVNSKGlvYmFzZSkgKGlvYmFzZSs2KQorI2RlZmluZSBTQ1IoaW9iYXNlKSAoaW9iYXNlKzcpCisjZGVmaW5lIERMTChpb2Jhc2UpIChpb2Jhc2UrMCkKKyNkZWZpbmUgRExNKGlvYmFzZSkgKGlvYmFzZSsxKQorCisjZGVmaW5lIFNFUjEyX0VYVEVOVCA4CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4KKyAqLworCitzdHJ1Y3QgYmF5Y29tX3N0YXRlIHsKKwlzdHJ1Y3QgaGRsY2Rydl9zdGF0ZSBoZHJ2OworCisJaW50IG9wdF9kY2Q7CisKKwlzdHJ1Y3QgbW9kZW1fc3RhdGUgeworCQlzaG9ydCBhcmJfZGl2aWRlcjsKKwkJdW5zaWduZWQgY2hhciBmbGFnczsKKwkJdW5zaWduZWQgaW50IHNocmVnOworCQlzdHJ1Y3QgbW9kZW1fc3RhdGVfc2VyMTIgeworCQkJdW5zaWduZWQgY2hhciB0eF9iaXQ7CisJCQlpbnQgZGNkX3N1bTAsIGRjZF9zdW0xLCBkY2Rfc3VtMjsKKwkJCXVuc2lnbmVkIGNoYXIgbGFzdF9zYW1wbGU7CisJCQl1bnNpZ25lZCBjaGFyIGxhc3RfcnhiaXQ7CisJCQl1bnNpZ25lZCBpbnQgZGNkX3NocmVnOworCQkJdW5zaWduZWQgaW50IGRjZF90aW1lOworCQkJdW5zaWduZWQgaW50IGJpdF9wbGw7CisJCQl1bnNpZ25lZCBjaGFyIGludGVybV9zYW1wbGU7CisJCX0gc2VyMTI7CisJfSBtb2RlbTsKKworI2lmZGVmIEJBWUNPTV9ERUJVRworCXN0cnVjdCBkZWJ1Z192YWxzIHsKKwkJdW5zaWduZWQgbG9uZyBsYXN0X2ppZmZpZXM7CisJCXVuc2lnbmVkIGN1cl9pbnRjbnQ7CisJCXVuc2lnbmVkIGxhc3RfaW50Y250OworCQlpbnQgY3VyX3BsbGNvcnI7CisJCWludCBsYXN0X3BsbGNvcnI7CisJfSBkZWJ1Z192YWxzOworI2VuZGlmIC8qIEJBWUNPTV9ERUJVRyAqLworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiYXljb21faW50X2ZyZXEoc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMpCit7CisjaWZkZWYgQkFZQ09NX0RFQlVHCisJdW5zaWduZWQgbG9uZyBjdXJfamlmZmllcyA9IGppZmZpZXM7CisJLyoKKwkgKiBtZWFzdXJlIHRoZSBpbnRlcnJ1cHQgZnJlcXVlbmN5CisJICovCisJYmMtPmRlYnVnX3ZhbHMuY3VyX2ludGNudCsrOworCWlmICgoY3VyX2ppZmZpZXMgLSBiYy0+ZGVidWdfdmFscy5sYXN0X2ppZmZpZXMpID49IEhaKSB7CisJCWJjLT5kZWJ1Z192YWxzLmxhc3RfamlmZmllcyA9IGN1cl9qaWZmaWVzOworCQliYy0+ZGVidWdfdmFscy5sYXN0X2ludGNudCA9IGJjLT5kZWJ1Z192YWxzLmN1cl9pbnRjbnQ7CisJCWJjLT5kZWJ1Z192YWxzLmN1cl9pbnRjbnQgPSAwOworCQliYy0+ZGVidWdfdmFscy5sYXN0X3BsbGNvcnIgPSBiYy0+ZGVidWdfdmFscy5jdXJfcGxsY29ycjsKKwkJYmMtPmRlYnVnX3ZhbHMuY3VyX3BsbGNvcnIgPSAwOworCX0KKyNlbmRpZiAvKiBCQVlDT01fREVCVUcgKi8KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09IFNFUjEyIHNwZWNpZmljIHJvdXRpbmVzID09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc2VyMTJfc2V0X2Rpdmlzb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHVuc2lnbmVkIGNoYXIgZGl2aXNvcikKK3sKKwlvdXRiKDB4ODEsIExDUihkZXYtPmJhc2VfYWRkcikpOwkvKiBETEFCID0gMSAqLworCW91dGIoZGl2aXNvciwgRExMKGRldi0+YmFzZV9hZGRyKSk7CisJb3V0YigwLCBETE0oZGV2LT5iYXNlX2FkZHIpKTsKKwlvdXRiKDB4MDEsIExDUihkZXYtPmJhc2VfYWRkcikpOwkvKiB3b3JkIGxlbmd0aCA9IDYgKi8KKwkvKgorCSAqIG1ha2Ugc3VyZSB0aGUgbmV4dCBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkOworCSAqIDAgbXVzdCBiZSB1c2VkIHRvIHBvd2VyIHRoZSBtb2RlbTsgdGhlIG1vZGVtIGRyYXdzIGl0cworCSAqIHBvd2VyIGZyb20gdGhlIFR4RCBsaW5lCisJICovCisJb3V0YigweDAwLCBUSFIoZGV2LT5iYXNlX2FkZHIpKTsKKwkvKgorCSAqIGl0IGlzIGltcG9ydGFudCBub3QgdG8gc2V0IHRoZSBkaXZpZGVyIHdoaWxlIHRyYW5zbWl0dGluZzsKKwkgKiB0aGlzIHJlcG9ydGVkbHkgbWFrZXMgc29tZSBVQVJUcyBnZW5lcmF0aW5nIGludGVycnVwdHMKKwkgKiBpbiB0aGUgaHVuZHJlZHRob3VzYW5kcyBwZXIgc2Vjb25kIHJlZ2lvbgorCSAqIFJlcG9ydGVkIGJ5OiBJZ25hY2lvLkFyZW5hemFAc3R1ZGkuZXBmbC5jaCAoSWduYWNpbyBBcmVuYXphIE51bm8pCisJICovCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogbXVzdCBjYWxsIHRoZSBUWCBhcmJpdHJhdG9yIGV2ZXJ5IDEwbXMKKyAqLworI2RlZmluZSBTRVIxMl9BUkJfRElWSURFUihiYykgIChiYy0+b3B0X2RjZCA/IDI0IDogMzYpCisJCQkgICAgICAgCisjZGVmaW5lIFNFUjEyX0RDRF9JTlRFUlZBTChiYykgKGJjLT5vcHRfZGNkID8gMTIgOiAyNDApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXIxMl90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYykKK3sKKwkvKiBvbmUgaW50ZXJydXB0IHBlciBjaGFubmVsIGJpdCAqLworCXNlcjEyX3NldF9kaXZpc29yKGRldiwgMTIpOworCS8qCisJICogZmlyc3Qgb3V0cHV0IHRoZSBsYXN0IGJpdCAoISkgdGhlbiBjYWxsIEhETEMgdHJhbnNtaXR0ZXIsCisJICogc2luY2UgdGhpcyBtYXkgdGFrZSBxdWl0ZSBsb25nCisJICovCisJb3V0YigweDBlIHwgKCEhYmMtPm1vZGVtLnNlcjEyLnR4X2JpdCksIE1DUihkZXYtPmJhc2VfYWRkcikpOworCWlmIChiYy0+bW9kZW0uc2hyZWcgPD0gMSkKKwkJYmMtPm1vZGVtLnNocmVnID0gMHgxMDAwMCB8IGhkbGNkcnZfZ2V0Yml0cygmYmMtPmhkcnYpOworCWJjLT5tb2RlbS5zZXIxMi50eF9iaXQgPSAhKGJjLT5tb2RlbS5zZXIxMi50eF9iaXQgXgorCQkJCSAgIChiYy0+bW9kZW0uc2hyZWcgJiAxKSk7CisJYmMtPm1vZGVtLnNocmVnID4+PSAxOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNlcjEyX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBiYXljb21fc3RhdGUgKmJjKQoreworCXVuc2lnbmVkIGNoYXIgY3VyX3M7CisJLyoKKwkgKiBkbyBkZW1vZHVsYXRvcgorCSAqLworCWN1cl9zID0gaW5iKE1TUihkZXYtPmJhc2VfYWRkcikpICYgMHgxMDsJLyogdGhlIENUUyBsaW5lICovCisJaGRsY2Rydl9jaGFubmVsYml0KCZiYy0+aGRydiwgY3VyX3MpOworCWJjLT5tb2RlbS5zZXIxMi5kY2Rfc2hyZWcgPSAoYmMtPm1vZGVtLnNlcjEyLmRjZF9zaHJlZyA8PCAxKSB8CisJCShjdXJfcyAhPSBiYy0+bW9kZW0uc2VyMTIubGFzdF9zYW1wbGUpOworCWJjLT5tb2RlbS5zZXIxMi5sYXN0X3NhbXBsZSA9IGN1cl9zOworCWlmKGJjLT5tb2RlbS5zZXIxMi5kY2Rfc2hyZWcgJiAxKSB7CisJCWlmICghYmMtPm9wdF9kY2QpIHsKKwkJCXVuc2lnbmVkIGludCBkY2RzcG9zLCBkY2RzbmVnOworCisJCQlkY2RzcG9zID0gZGNkc25lZyA9IDA7CisJCQlkY2RzcG9zICs9ICgoYmMtPm1vZGVtLnNlcjEyLmRjZF9zaHJlZyA+PiAxKSAmIDEpOworCQkJaWYgKCEoYmMtPm1vZGVtLnNlcjEyLmRjZF9zaHJlZyAmIDB4N2ZmZmZmZmUpKQorCQkJCWRjZHNwb3MgKz0gMjsKKwkJCWRjZHNuZWcgKz0gKChiYy0+bW9kZW0uc2VyMTIuZGNkX3NocmVnID4+IDIpICYgMSk7CisJCQlkY2RzbmVnICs9ICgoYmMtPm1vZGVtLnNlcjEyLmRjZF9zaHJlZyA+PiAzKSAmIDEpOworCQkJZGNkc25lZyArPSAoKGJjLT5tb2RlbS5zZXIxMi5kY2Rfc2hyZWcgPj4gNCkgJiAxKTsKKworCQkJYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0wICs9IDE2KmRjZHNwb3MgLSBkY2RzbmVnOworCQl9IGVsc2UKKwkJCWJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMC0tOworCX0KKwlpZighYmMtPm1vZGVtLnNlcjEyLmRjZF90aW1lKSB7CisJCWhkbGNkcnZfc2V0ZGNkKCZiYy0+aGRydiwgKGJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMCArCisJCQkJCSAgIGJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMSArCisJCQkJCSAgIGJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMikgPCAwKTsKKwkJYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0yID0gYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0xOworCQliYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTEgPSBiYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTA7CisJCS8qIG9mZnNldCB0byBlbnN1cmUgRENEIG9mZiBvbiBzaWxlbnQgaW5wdXQgKi8KKwkJYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0wID0gMjsKKwkJYmMtPm1vZGVtLnNlcjEyLmRjZF90aW1lID0gU0VSMTJfRENEX0lOVEVSVkFMKGJjKTsKKwl9CisJYmMtPm1vZGVtLnNlcjEyLmRjZF90aW1lLS07CisJaWYgKCFiYy0+b3B0X2RjZCkgeworCQkvKgorCQkgKiBQTEwgY29kZSBmb3IgdGhlIGltcHJvdmVkIHNvZnR3YXJlIERDRCBhbGdvcml0aG0KKwkJICovCisJCWlmIChiYy0+bW9kZW0uc2VyMTIuaW50ZXJtX3NhbXBsZSkgeworCQkJLyoKKwkJCSAqIGludGVybWVkaWF0ZSBzYW1wbGU7IHNldCB0aW1pbmcgY29ycmVjdGlvbiB0byBub3JtYWwKKwkJCSAqLworCQkJc2VyMTJfc2V0X2Rpdmlzb3IoZGV2LCA0KTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBkbyBQTEwgY29ycmVjdGlvbiBhbmQgY2FsbCBIRExDIHJlY2VpdmVyCisJCQkgKi8KKwkJCXN3aXRjaCAoYmMtPm1vZGVtLnNlcjEyLmRjZF9zaHJlZyAmIDcpIHsKKwkJCWNhc2UgMTogLyogdHJhbnNpdGlvbiB0b28gbGF0ZSAqLworCQkJCXNlcjEyX3NldF9kaXZpc29yKGRldiwgNSk7CisjaWZkZWYgQkFZQ09NX0RFQlVHCisJCQkJYmMtPmRlYnVnX3ZhbHMuY3VyX3BsbGNvcnIrKzsKKyNlbmRpZiAvKiBCQVlDT01fREVCVUcgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgNDoJLyogdHJhbnNpdGlvbiB0b28gZWFybHkgKi8KKwkJCQlzZXIxMl9zZXRfZGl2aXNvcihkZXYsIDMpOworI2lmZGVmIEJBWUNPTV9ERUJVRworCQkJCWJjLT5kZWJ1Z192YWxzLmN1cl9wbGxjb3JyLS07CisjZW5kaWYgLyogQkFZQ09NX0RFQlVHICovCisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXNlcjEyX3NldF9kaXZpc29yKGRldiwgNCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQliYy0+bW9kZW0uc2hyZWcgPj49IDE7CisJCQlpZiAoYmMtPm1vZGVtLnNlcjEyLmxhc3Rfc2FtcGxlID09CisJCQkgICAgYmMtPm1vZGVtLnNlcjEyLmxhc3RfcnhiaXQpCisJCQkJYmMtPm1vZGVtLnNocmVnIHw9IDB4MTAwMDA7CisJCQliYy0+bW9kZW0uc2VyMTIubGFzdF9yeGJpdCA9CisJCQkJYmMtPm1vZGVtLnNlcjEyLmxhc3Rfc2FtcGxlOworCQl9CisJCWlmICgrK2JjLT5tb2RlbS5zZXIxMi5pbnRlcm1fc2FtcGxlID49IDMpCisJCQliYy0+bW9kZW0uc2VyMTIuaW50ZXJtX3NhbXBsZSA9IDA7CisJCS8qCisJCSAqIERDRCBzdHVmZgorCQkgKi8KKwkJaWYgKGJjLT5tb2RlbS5zZXIxMi5kY2Rfc2hyZWcgJiAxKSB7CisJCQl1bnNpZ25lZCBpbnQgZGNkc3BvcywgZGNkc25lZzsKKworCQkJZGNkc3BvcyA9IGRjZHNuZWcgPSAwOworCQkJZGNkc3BvcyArPSAoKGJjLT5tb2RlbS5zZXIxMi5kY2Rfc2hyZWcgPj4gMSkgJiAxKTsKKwkJCWRjZHNwb3MgKz0gKCEoYmMtPm1vZGVtLnNlcjEyLmRjZF9zaHJlZyAmIDB4N2ZmZmZmZmUpKQorCQkJCTw8IDE7CisJCQlkY2RzbmVnICs9ICgoYmMtPm1vZGVtLnNlcjEyLmRjZF9zaHJlZyA+PiAyKSAmIDEpOworCQkJZGNkc25lZyArPSAoKGJjLT5tb2RlbS5zZXIxMi5kY2Rfc2hyZWcgPj4gMykgJiAxKTsKKwkJCWRjZHNuZWcgKz0gKChiYy0+bW9kZW0uc2VyMTIuZGNkX3NocmVnID4+IDQpICYgMSk7CisKKwkJCWJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMCArPSAxNipkY2RzcG9zIC0gZGNkc25lZzsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIFBMTCBhbGdvcml0aG0gZm9yIHRoZSBoYXJkd2FyZSBzcXVlbGNoIERDRCBhbGdvcml0aG0KKwkJICovCisJCWlmIChiYy0+bW9kZW0uc2VyMTIuaW50ZXJtX3NhbXBsZSkgeworCQkJLyoKKwkJCSAqIGludGVybWVkaWF0ZSBzYW1wbGU7IHNldCB0aW1pbmcgY29ycmVjdGlvbiB0byBub3JtYWwKKwkJCSAqLworCQkJc2VyMTJfc2V0X2Rpdmlzb3IoZGV2LCA2KTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBkbyBQTEwgY29ycmVjdGlvbiBhbmQgY2FsbCBIRExDIHJlY2VpdmVyCisJCQkgKi8KKwkJCXN3aXRjaCAoYmMtPm1vZGVtLnNlcjEyLmRjZF9zaHJlZyAmIDMpIHsKKwkJCWNhc2UgMTogLyogdHJhbnNpdGlvbiB0b28gbGF0ZSAqLworCQkJCXNlcjEyX3NldF9kaXZpc29yKGRldiwgNyk7CisjaWZkZWYgQkFZQ09NX0RFQlVHCisJCQkJYmMtPmRlYnVnX3ZhbHMuY3VyX3BsbGNvcnIrKzsKKyNlbmRpZiAvKiBCQVlDT01fREVCVUcgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgMjoJLyogdHJhbnNpdGlvbiB0b28gZWFybHkgKi8KKwkJCQlzZXIxMl9zZXRfZGl2aXNvcihkZXYsIDUpOworI2lmZGVmIEJBWUNPTV9ERUJVRworCQkJCWJjLT5kZWJ1Z192YWxzLmN1cl9wbGxjb3JyLS07CisjZW5kaWYgLyogQkFZQ09NX0RFQlVHICovCisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXNlcjEyX3NldF9kaXZpc29yKGRldiwgNik7CisJCQkJYnJlYWs7CisJCQl9CisJCQliYy0+bW9kZW0uc2hyZWcgPj49IDE7CisJCQlpZiAoYmMtPm1vZGVtLnNlcjEyLmxhc3Rfc2FtcGxlID09CisJCQkgICAgYmMtPm1vZGVtLnNlcjEyLmxhc3RfcnhiaXQpCisJCQkJYmMtPm1vZGVtLnNocmVnIHw9IDB4MTAwMDA7CisJCQliYy0+bW9kZW0uc2VyMTIubGFzdF9yeGJpdCA9CisJCQkJYmMtPm1vZGVtLnNlcjEyLmxhc3Rfc2FtcGxlOworCQl9CisJCWJjLT5tb2RlbS5zZXIxMi5pbnRlcm1fc2FtcGxlID0gIWJjLT5tb2RlbS5zZXIxMi5pbnRlcm1fc2FtcGxlOworCQkvKgorCQkgKiBEQ0Qgc3R1ZmYKKwkJICovCisJCWJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMCAtPSAoYmMtPm1vZGVtLnNlcjEyLmRjZF9zaHJlZyAmIDEpOworCX0KKwlvdXRiKDB4MGQsIE1DUihkZXYtPmJhc2VfYWRkcikpOwkJLyogdHJhbnNtaXR0ZXIgb2ZmICovCisJaWYgKGJjLT5tb2RlbS5zaHJlZyAmIDEpIHsKKwkJaGRsY2Rydl9wdXRiaXRzKCZiYy0+aGRydiwgYmMtPm1vZGVtLnNocmVnID4+IDEpOworCQliYy0+bW9kZW0uc2hyZWcgPSAweDEwMDAwOworCX0KKwlpZighYmMtPm1vZGVtLnNlcjEyLmRjZF90aW1lKSB7CisJCWlmIChiYy0+b3B0X2RjZCAmIDEpIAorCQkJaGRsY2Rydl9zZXRkY2QoJmJjLT5oZHJ2LCAhKChpbmIoTVNSKGRldi0+YmFzZV9hZGRyKSkgXiBiYy0+b3B0X2RjZCkgJiAweDgwKSk7CisJCWVsc2UKKwkJCWhkbGNkcnZfc2V0ZGNkKCZiYy0+aGRydiwgKGJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMCArCisJCQkJCQkgICBiYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTEgKworCQkJCQkJICAgYmMtPm1vZGVtLnNlcjEyLmRjZF9zdW0yKSA8IDApOworCQliYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTIgPSBiYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTE7CisJCWJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMSA9IGJjLT5tb2RlbS5zZXIxMi5kY2Rfc3VtMDsKKwkJLyogb2Zmc2V0IHRvIGVuc3VyZSBEQ0Qgb2ZmIG9uIHNpbGVudCBpbnB1dCAqLworCQliYy0+bW9kZW0uc2VyMTIuZGNkX3N1bTAgPSAyOworCQliYy0+bW9kZW0uc2VyMTIuZGNkX3RpbWUgPSBTRVIxMl9EQ0RfSU5URVJWQUwoYmMpOworCX0KKwliYy0+bW9kZW0uc2VyMTIuZGNkX3RpbWUtLTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzZXIxMl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBjaGFyIGlpcjsKKworCWlmICghZGV2IHx8ICFiYyB8fCBiYy0+aGRydi5tYWdpYyAhPSBIRExDRFJWX01BR0lDKQorCQlyZXR1cm4gSVJRX05PTkU7CisJLyogZmFzdCB3YXkgb3V0ICovCisJaWYgKChpaXIgPSBpbmIoSUlSKGRldi0+YmFzZV9hZGRyKSkpICYgMSkKKwkJcmV0dXJuIElSUV9OT05FOworCWJheWNvbV9pbnRfZnJlcShiYyk7CisJZG8geworCQlzd2l0Y2ggKGlpciAmIDYpIHsKKwkJY2FzZSA2OgorCQkJaW5iKExTUihkZXYtPmJhc2VfYWRkcikpOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSA0OgorCQkJaW5iKFJCUihkZXYtPmJhc2VfYWRkcikpOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSAyOgorCQkJLyoKKwkJCSAqIGNoZWNrIGlmIHRyYW5zbWl0dGVyIGFjdGl2ZQorCQkJICovCisJCQlpZiAoaGRsY2Rydl9wdHQoJmJjLT5oZHJ2KSkKKwkJCQlzZXIxMl90eChkZXYsIGJjKTsKKwkJCWVsc2UgeworCQkJCXNlcjEyX3J4KGRldiwgYmMpOworCQkJCWJjLT5tb2RlbS5hcmJfZGl2aWRlci0tOworCQkJfQorCQkJb3V0YigweDAwLCBUSFIoZGV2LT5iYXNlX2FkZHIpKTsKKwkJCWJyZWFrOworCQkJCisJCWRlZmF1bHQ6CisJCQlpbmIoTVNSKGRldi0+YmFzZV9hZGRyKSk7CisJCQlicmVhazsKKwkJfQorCQlpaXIgPSBpbmIoSUlSKGRldi0+YmFzZV9hZGRyKSk7CisJfSB3aGlsZSAoIShpaXIgJiAxKSk7CisJaWYgKGJjLT5tb2RlbS5hcmJfZGl2aWRlciA8PSAwKSB7CisJCWJjLT5tb2RlbS5hcmJfZGl2aWRlciA9IFNFUjEyX0FSQl9ESVZJREVSKGJjKTsKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCQloZGxjZHJ2X2FyYml0cmF0ZShkZXYsICZiYy0+aGRydik7CisJfQorCWxvY2FsX2lycV9lbmFibGUoKTsKKwloZGxjZHJ2X3RyYW5zbWl0dGVyKGRldiwgJmJjLT5oZHJ2KTsKKwloZGxjZHJ2X3JlY2VpdmVyKGRldiwgJmJjLT5oZHJ2KTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2VudW0gdWFydCB7IGNfdWFydF91bmtub3duLCBjX3VhcnRfODI1MCwKKwkgICAgY191YXJ0XzE2NDUwLCBjX3VhcnRfMTY1NTAsIGNfdWFydF8xNjU1MEF9Oworc3RhdGljIGNvbnN0IGNoYXIgKnVhcnRfc3RyW10gPSB7IAorCSJ1bmtub3duIiwgIjgyNTAiLCAiMTY0NTAiLCAiMTY1NTAiLCAiMTY1NTBBIiAKK307CisKK3N0YXRpYyBlbnVtIHVhcnQgc2VyMTJfY2hlY2tfdWFydCh1bnNpZ25lZCBpbnQgaW9iYXNlKQoreworCXVuc2lnbmVkIGNoYXIgYjEsYjIsYjM7CisJZW51bSB1YXJ0IHU7CisJZW51bSB1YXJ0IHVhcnRfdGFiW10gPQorCQl7IGNfdWFydF8xNjQ1MCwgY191YXJ0X3Vua25vd24sIGNfdWFydF8xNjU1MCwgY191YXJ0XzE2NTUwQSB9OworCisJYjEgPSBpbmIoTUNSKGlvYmFzZSkpOworCW91dGIoYjEgfCAweDEwLCBNQ1IoaW9iYXNlKSk7CS8qIGxvb3BiYWNrIG1vZGUgKi8KKwliMiA9IGluYihNU1IoaW9iYXNlKSk7CisJb3V0YigweDFhLCBNQ1IoaW9iYXNlKSk7CisJYjMgPSBpbmIoTVNSKGlvYmFzZSkpICYgMHhmMDsKKwlvdXRiKGIxLCBNQ1IoaW9iYXNlKSk7CQkJLyogcmVzdG9yZSBvbGQgdmFsdWVzICovCisJb3V0YihiMiwgTVNSKGlvYmFzZSkpOworCWlmIChiMyAhPSAweDkwKQorCQlyZXR1cm4gY191YXJ0X3Vua25vd247CisJaW5iKFJCUihpb2Jhc2UpKTsKKwlpbmIoUkJSKGlvYmFzZSkpOworCW91dGIoMHgwMSwgRkNSKGlvYmFzZSkpOwkJLyogZW5hYmxlIEZJRk9zICovCisJdSA9IHVhcnRfdGFiWyhpbmIoSUlSKGlvYmFzZSkpID4+IDYpICYgM107CisJaWYgKHUgPT0gY191YXJ0XzE2NDUwKSB7CisJCW91dGIoMHg1YSwgU0NSKGlvYmFzZSkpOworCQliMSA9IGluYihTQ1IoaW9iYXNlKSk7CisJCW91dGIoMHhhNSwgU0NSKGlvYmFzZSkpOworCQliMiA9IGluYihTQ1IoaW9iYXNlKSk7CisJCWlmICgoYjEgIT0gMHg1YSkgfHwgKGIyICE9IDB4YTUpKQorCQkJdSA9IGNfdWFydF84MjUwOworCX0KKwlyZXR1cm4gdTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgc2VyMTJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwllbnVtIHVhcnQgdTsKKworCWlmICghZGV2IHx8ICFiYykKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIWRldi0+YmFzZV9hZGRyIHx8IGRldi0+YmFzZV9hZGRyID4gMHgxMDAwLVNFUjEyX0VYVEVOVCB8fAorCSAgICBkZXYtPmlycSA8IDIgfHwgZGV2LT5pcnEgPiAxNSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBTRVIxMl9FWFRFTlQsICJiYXljb21fc2VyMTIiKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisJbWVtc2V0KCZiYy0+bW9kZW0sIDAsIHNpemVvZihiYy0+bW9kZW0pKTsKKwliYy0+aGRydi5wYXIuYml0cmF0ZSA9IDEyMDA7CisJaWYgKCh1ID0gc2VyMTJfY2hlY2tfdWFydChkZXYtPmJhc2VfYWRkcikpID09IGNfdWFydF91bmtub3duKSB7CisJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBTRVIxMl9FWFRFTlQpOyAgICAgICAKKwkJcmV0dXJuIC1FSU87CisJfQorCW91dGIoMCwgRkNSKGRldi0+YmFzZV9hZGRyKSk7ICAvKiBkaXNhYmxlIEZJRk9zICovCisJb3V0YigweDBkLCBNQ1IoZGV2LT5iYXNlX2FkZHIpKTsKKwlvdXRiKDAsIElFUihkZXYtPmJhc2VfYWRkcikpOworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgc2VyMTJfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwKKwkJCSJiYXljb21fc2VyMTIiLCBkZXYpKSB7CisJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBTRVIxMl9FWFRFTlQpOyAgICAgICAKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJLyoKKwkgKiBlbmFibGUgdHJhbnNtaXR0ZXIgZW1wdHkgaW50ZXJydXB0CisJICovCisJb3V0YigyLCBJRVIoZGV2LT5iYXNlX2FkZHIpKTsKKwkvKgorCSAqIHNldCB0aGUgU0lPIHRvIDYgQml0cy9jaGFyYWN0ZXIgYW5kIDE5MjAwIG9yIDI4ODAwIGJhdWQsIHNvIHRoYXQKKwkgKiB3ZSBnZXQgZXhhY3RseSAoaG9wZWZ1bGx5KSAyIG9yIDMgaW50ZXJydXB0cyBwZXIgcmFkaW8gc3ltYm9sLAorCSAqIGRlcGVuZGluZyBvbiB0aGUgdXNhZ2Ugb2YgdGhlIHNvZnR3YXJlIERDRCByb3V0aW5lCisJICovCisJc2VyMTJfc2V0X2Rpdmlzb3IoZGV2LCBiYy0+b3B0X2RjZCA/IDYgOiA0KTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogc2VyMTIgYXQgaW9iYXNlIDB4JWx4IGlycSAldSB1YXJ0ICVzXG4iLCAKKwkgICAgICAgYmNfZHJ2bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxLCB1YXJ0X3N0clt1XSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHNlcjEyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJheWNvbV9zdGF0ZSAqYmMgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCFkZXYgfHwgIWJjKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKgorCSAqIGRpc2FibGUgaW50ZXJydXB0cworCSAqLworCW91dGIoMCwgSUVSKGRldi0+YmFzZV9hZGRyKSk7CisJb3V0YigxLCBNQ1IoZGV2LT5iYXNlX2FkZHIpKTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgU0VSMTJfRVhURU5UKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogY2xvc2Ugc2VyMTIgYXQgaW9iYXNlIDB4JWx4IGlycSAldVxuIiwKKwkgICAgICAgYmNfZHJ2bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogPT09PT09PT09PT09PT09PT09PT09IGhkbGNkcnYgZHJpdmVyIGludGVyZmFjZSA9PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgYmF5Y29tX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLAorCQkJc3RydWN0IGhkbGNkcnZfaW9jdGwgKmhpLCBpbnQgY21kKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgaGRsY2Rydl9vcHMgc2VyMTJfb3BzID0geworCS5kcnZuYW1lID0gYmNfZHJ2bmFtZSwKKwkuZHJ2aW5mbyA9IGJjX2RydmluZm8sCisJLm9wZW4gICAgPSBzZXIxMl9vcGVuLAorCS5jbG9zZSAgID0gc2VyMTJfY2xvc2UsCisJLmlvY3RsICAgPSBiYXljb21faW9jdGwsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBiYXljb21fc2V0bW9kZShzdHJ1Y3QgYmF5Y29tX3N0YXRlICpiYywgY29uc3QgY2hhciAqbW9kZXN0cikKK3sKKwlpZiAoc3RyY2hyKG1vZGVzdHIsICcqJykpCisJCWJjLT5vcHRfZGNkID0gMDsKKwllbHNlIGlmIChzdHJjaHIobW9kZXN0ciwgJysnKSkKKwkJYmMtPm9wdF9kY2QgPSAtMTsKKwllbHNlIGlmIChzdHJjaHIobW9kZXN0ciwgJ0AnKSkKKwkJYmMtPm9wdF9kY2QgPSAtMjsKKwllbHNlCisJCWJjLT5vcHRfZGNkID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgYmF5Y29tX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLAorCQkJc3RydWN0IGhkbGNkcnZfaW9jdGwgKmhpLCBpbnQgY21kKQoreworCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjOworCXN0cnVjdCBiYXljb21faW9jdGwgYmk7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwliYyA9IG5ldGRldl9wcml2KGRldik7CisJQlVHX09OKGJjLT5oZHJ2Lm1hZ2ljICE9IEhETENEUlZfTUFHSUMpOworCisJaWYgKGNtZCAhPSBTSU9DREVWUFJJVkFURSkKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwlzd2l0Y2ggKGhpLT5jbWQpIHsKKwlkZWZhdWx0OgorCQlicmVhazsKKworCWNhc2UgSERMQ0RSVkNUTF9HRVRNT0RFOgorCQlzdHJjcHkoaGktPmRhdGEubW9kZW5hbWUsICJzZXIxMiIpOworCQlpZiAoYmMtPm9wdF9kY2QgPD0gMCkKKwkJCXN0cmNhdChoaS0+ZGF0YS5tb2RlbmFtZSwgKCFiYy0+b3B0X2RjZCkgPyAiKiIgOiAoYmMtPm9wdF9kY2QgPT0gLTIpID8gIkAiIDogIisiKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCBoaSwgc2l6ZW9mKHN0cnVjdCBoZGxjZHJ2X2lvY3RsKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEhETENEUlZDVExfU0VUTU9ERToKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSB8fCAhY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQloaS0+ZGF0YS5tb2RlbmFtZVtzaXplb2YoaGktPmRhdGEubW9kZW5hbWUpLTFdID0gJ1wwJzsKKwkJcmV0dXJuIGJheWNvbV9zZXRtb2RlKGJjLCBoaS0+ZGF0YS5tb2RlbmFtZSk7CisKKwljYXNlIEhETENEUlZDVExfTU9ERUxJU1Q6CisJCXN0cmNweShoaS0+ZGF0YS5tb2RlbmFtZSwgInNlcjEyIik7CisJCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgaGksIHNpemVvZihzdHJ1Y3QgaGRsY2Rydl9pb2N0bCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBIRExDRFJWQ1RMX01PREVNUEFSTUFTSzoKKwkJcmV0dXJuIEhETENEUlZfUEFSTUFTS19JT0JBU0UgfCBIRExDRFJWX1BBUk1BU0tfSVJROworCisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZiaSwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKGJpKSkpCisJCXJldHVybiAtRUZBVUxUOworCXN3aXRjaCAoYmkuY21kKSB7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworI2lmZGVmIEJBWUNPTV9ERUJVRworCWNhc2UgQkFZQ09NQ1RMX0dFVERFQlVHOgorCQliaS5kYXRhLmRiZy5kZWJ1ZzEgPSBiYy0+aGRydi5wdHRfa2V5ZWQ7CisJCWJpLmRhdGEuZGJnLmRlYnVnMiA9IGJjLT5kZWJ1Z192YWxzLmxhc3RfaW50Y250OworCQliaS5kYXRhLmRiZy5kZWJ1ZzMgPSBiYy0+ZGVidWdfdmFscy5sYXN0X3BsbGNvcnI7CisJCWJyZWFrOworI2VuZGlmIC8qIEJBWUNPTV9ERUJVRyAqLworCisJfQorCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgJmJpLCBzaXplb2YoYmkpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7CisKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBjb21tYW5kIGxpbmUgc2V0dGFibGUgcGFyYW1ldGVycworICovCitzdGF0aWMgY2hhciAqbW9kZVtOUl9QT1JUU10gPSB7ICJzZXIxMioiLCB9Oworc3RhdGljIGludCBpb2Jhc2VbTlJfUE9SVFNdID0geyAweDNmOCwgfTsKK3N0YXRpYyBpbnQgaXJxW05SX1BPUlRTXSA9IHsgNCwgfTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG1vZGUsIGNoYXJwLCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobW9kZSwgImJheWNvbSBvcGVyYXRpbmcgbW9kZTsgKiBmb3Igc29mdHdhcmUgRENEIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaW9iYXNlLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpb2Jhc2UsICJiYXljb20gaW8gYmFzZSBhZGRyZXNzIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJiYXljb20gaXJxIG51bWJlciIpOworCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgTS4gU2FpbGVyLCBzYWlsZXJAaWZlLmVlLmV0aHouY2gsIGhiOWpueEBoYjl3LmNoZS5ldSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCYXljb20gc2VyMTIgaGFsZiBkdXBsZXggYW1hdGV1ciByYWRpbyBtb2RlbSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfYmF5Y29tc2VyaGR4KHZvaWQpCit7CisJaW50IGksIGZvdW5kID0gMDsKKwljaGFyIHNldF9odyA9IDE7CisKKwlwcmludGsoYmNfZHJ2aW5mbyk7CisJLyoKKwkgKiByZWdpc3RlciBuZXQgZGV2aWNlcworCSAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjOworCQljaGFyIGlmbmFtZVtJRk5BTVNJWl07CisKKwkJc3ByaW50ZihpZm5hbWUsICJiY3NoJWQiLCBpKTsKKworCQlpZiAoIW1vZGVbaV0pCisJCQlzZXRfaHcgPSAwOworCQlpZiAoIXNldF9odykKKwkJCWlvYmFzZVtpXSA9IGlycVtpXSA9IDA7CisKKwkJZGV2ID0gaGRsY2Rydl9yZWdpc3Rlcigmc2VyMTJfb3BzLCAKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBiYXljb21fc3RhdGUpLAorCQkJCSAgICAgICBpZm5hbWUsIGlvYmFzZVtpXSwgaXJxW2ldLCAwKTsKKwkJaWYgKElTX0VSUihkZXYpKSAKKwkJCWJyZWFrOworCisJCWJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJaWYgKHNldF9odyAmJiBiYXljb21fc2V0bW9kZShiYywgbW9kZVtpXSkpCisJCQlzZXRfaHcgPSAwOworCQlmb3VuZCsrOworCQliYXljb21fZGV2aWNlW2ldID0gZGV2OworCX0KKworCWlmICghZm91bmQpCisJCXJldHVybiAtRU5YSU87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2JheWNvbXNlcmhkeCh2b2lkKQoreworCWludCBpOworCisJZm9yKGkgPSAwOyBpIDwgTlJfUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYmF5Y29tX2RldmljZVtpXTsKKworCQlpZiAoZGV2KQorCQkJaGRsY2Rydl91bnJlZ2lzdGVyKGRldik7CisJfQorfQorCittb2R1bGVfaW5pdChpbml0X2JheWNvbXNlcmhkeCk7Cittb2R1bGVfZXhpdChjbGVhbnVwX2JheWNvbXNlcmhkeCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIE1PRFVMRQorCisvKgorICogZm9ybWF0OiBiYXljb21fc2VyX2hkeD1pbyxpcnEsbW9kZQorICogbW9kZTogc2VyMTIgICAgaGFyZHdhcmUgRENECisgKiAgICAgICBzZXIxMiogICBzb2Z0d2FyZSBEQ0QKKyAqICAgICAgIHNlcjEyQCAgIGhhcmR3YXJlL3NvZnR3YXJlIERDRCwgaS5lLiBubyBleHBsaWNpdCBEQ0Qgc2lnbmFsIGJ1dCBoYXJkd2FyZQorICogICAgICAgICAgICAgICAgbXV0ZXMgYXVkaW8gaW5wdXQgdG8gdGhlIG1vZGVtCisgKiAgICAgICBzZXIxMisgICBoYXJkd2FyZSBEQ0QsIGludmVydGVkIHNpZ25hbCBhdCBEQ0QgcGluCisgKi8KKworc3RhdGljIGludCBfX2luaXQgYmF5Y29tX3Nlcl9oZHhfc2V0dXAoY2hhciAqc3RyKQoreworICAgICAgICBzdGF0aWMgdW5zaWduZWQgbnJfZGV2OworCWludCBpbnRzWzNdOworCisgICAgICAgIGlmIChucl9kZXYgPj0gTlJfUE9SVFMpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCAzLCBpbnRzKTsKKwlpZiAoaW50c1swXSA8IDIpCisJCXJldHVybiAwOworCW1vZGVbbnJfZGV2XSA9IHN0cjsKKwlpb2Jhc2VbbnJfZGV2XSA9IGludHNbMV07CisJaXJxW25yX2Rldl0gPSBpbnRzWzJdOworCW5yX2RldisrOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJiYXljb21fc2VyX2hkeD0iLCBiYXljb21fc2VyX2hkeF9zZXR1cCk7CisKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vYnBxZXRoZXIuYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JwcWV0aGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYxYTM1OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JwcWV0aGVyLmMKQEAgLTAsMCArMSw2NDMgQEAKKy8qCisgKglHOEJQUSBjb21wYXRpYmxlICJBWC4yNSB2aWEgZXRoZXJuZXQiIGRyaXZlciByZWxlYXNlIDAwNAorICoKKyAqCVRoaXMgY29kZSBSRVFVSVJFUyAyLjAuMCBvciBoaWdoZXIvIE5FVDMuMDI5CisgKgorICoJVGhpcyBtb2R1bGU6CisgKgkJVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgaXMgYSAicHNldWRvIiBuZXR3b3JrIGRyaXZlciB0byBhbGxvdyBBWC4yNSBvdmVyIEV0aGVybmV0CisgKgl1c2luZyBHOEJQUSBlbmNhcHN1bGF0aW9uLiBJdCBoYXMgYmVlbiBleHRyYWN0ZWQgZnJvbSB0aGUgcHJvdG9jb2wKKyAqCWltcGxlbWVudGF0aW9uIGJlY2F1c2UKKyAqCisgKgkJLSB0aGluZ3MgZ290IHVucmVhZGFibGUgd2l0aGluIHRoZSBwcm90b2NvbCBzdGFjaworICoJCS0gdG8gY3VyZSB0aGUgcHJvdG9jb2wgc3RhY2sgZnJvbSAiZmVhdHVyZS1pc20iCisgKgkJLSBhIHByb3RvY29sIGltcGxlbWVudGF0aW9uIHNob3VsZG4ndCBuZWVkIHRvIGtub3cgb24KKyAqCQkgIHdoaWNoIGhhcmR3YXJlIGl0IGlzIHJ1bm5pbmcKKyAqCQktIHVzZXItbGV2ZWwgcHJvZ3JhbXMgbGlrZSB0aGUgQVguMjUgdXRpbGl0aWVzIHNob3VsZG4ndAorICoJCSAgbmVlZCB0byBrbm93IGFib3V0IHRoZSBoYXJkd2FyZS4KKyAqCQktIElQIG92ZXIgZXRoZXJuZXQgZW5jYXBzdWxhdGVkIEFYLjI1IHdhcyBpbXBvc3NpYmxlCisgKgkJLSByeGVjaG8uYyBkaWQgbm90IHdvcmsKKyAqCQktIHRvIGhhdmUgcm9vbSBmb3IgZXh0ZW5zaW9ucworICoJCS0gaXQganVzdCBkZXNlcnZlcyB0byAibGl2ZSIgYXMgYW4gb3duIGRyaXZlcgorICoKKyAqCVRoaXMgZHJpdmVyIGNhbiB1c2UgYW55IGV0aGVybmV0IGRlc3RpbmF0aW9uIGFkZHJlc3MsIGFuZCBjYW4gYmUKKyAqCWxpbWl0ZWQgdG8gYWNjZXB0IGZyYW1lcyBmcm9tIG9uZSBkZWRpY2F0ZWQgZXRoZXJuZXQgY2FyZCBvbmx5LgorICoKKyAqCU5vdGUgdGhhdCB0aGUgZHJpdmVyIHNldHMgdXAgdGhlIEJQUSBkZXZpY2VzIGF1dG9tYWdpY2FsbHkgb24KKyAqCXN0YXJ0dXAgb3IgKGlmIHN0YXJ0ZWQgYmVmb3JlIHRoZSAiaW5zbW9kIiBvZiBhbiBldGhlcm5ldCBkZXZpY2UpCisgKglvbiAiaWZjb25maWcgdXAiLiBJdCBob3BlZnVsbHkgd2lsbCByZW1vdmUgdGhlIEJQUSBvbiAicm1tb2QiaW5nCisgKgl0aGUgZXRoZXJuZXQgZGV2aWNlIChpbiBmYWN0OiBhcyBzb29uIGFzIGFub3RoZXIgZXRoZXJuZXQgb3IgYnBxCisgKglkZXZpY2UgZ2V0cyAiaWZjb25maWcidXJlZCkuCisgKgorICoJSSBoYXZlIGhlYXJkIHRoYXQgc2V2ZXJhbCBwZW9wbGUgYXJlIHRoaW5raW5nIG9mIGV4cGVyaW1lbnRzCisgKgl3aXRoIGhpZ2hzcGVlZCBwYWNrZXQgcmFkaW8gdXNpbmcgZXhpc3RpbmcgZXRoZXJuZXQgY2FyZHMuCisgKglXZWxsLCB0aGlzIGRyaXZlciBpcyBwcmVwYXJlZCBmb3IgdGhpcyBwdXJwb3NlLCBqdXN0IGFkZAorICoJeW91ciB0eCBrZXkgY29udHJvbCBhbmQgYSB0eGRlbGF5IC8gdGFpbHRpbWUgYWxnb3JpdGhtLAorICoJcHJvYmFibHkgc29tZSBidWZmZXJpbmcsIGFuZCAvdm9pbGEvLi4uCisgKgorICoJSGlzdG9yeQorICoJQlBRICAgMDAxCUpvZXJnKERMMUJLRSkJCUV4dHJhY3RlZCBCUFEgY29kZSBmcm9tIEFYLjI1CisgKgkJCQkJCXByb3RvY29sIHN0YWNrIGFuZCBhZGRlZCBteSBvd24KKyAqCQkJCQkJeWV0IGV4aXN0aW5nIHBhdGNoZXMKKyAqCUJQUSAgIDAwMglKb2VyZyhETDFCS0UpCQlTY2FuIG5ldHdvcmsgZGV2aWNlIGxpc3Qgb24KKyAqCQkJCQkJc3RhcnR1cC4KKyAqCUJQUSAgIDAwMwlKb2VyZyhETDFCS0UpCQlFdGhlcm5ldCBkZXN0aW5hdGlvbiBhZGRyZXNzCisgKgkJCQkJCWFuZCBhY2NlcHRlZCBzb3VyY2UgYWRkcmVzcworICoJCQkJCQljYW4gYmUgY29uZmlndXJlZCBieSBhbiBpb2N0bCgpCisgKgkJCQkJCWNhbGwuCisgKgkJCQkJCUZpeGVkIHRvIG1hdGNoIExpbnV4IG5ldHdvcmtpbmcKKyAqCQkJCQkJY2hhbmdlcyAtIDIuMS4xNS4KKyAqCUJQUSAgIDAwNAlKb2VyZyhETDFCS0UpCQlGaXhlZCB0byBub3QgbG9jayB1cCBvbiBpZmNvbmZpZy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bmV0L2F4MjUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorCisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorCisjaW5jbHVkZSA8bGludXgvYnBxZXRoZXIuaD4KKworc3RhdGljIGNoYXIgYmFubmVyW10gX19pbml0ZGF0YSA9IEtFUk5fSU5GTyAiQVguMjU6IGJwcWV0aGVyIGRyaXZlciB2ZXJzaW9uIDAwNFxuIjsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXgyNV9iY2FzdFtBWDI1X0FERFJfTEVOXSA9CisJeydRJyA8PCAxLCAnUycgPDwgMSwgJ1QnIDw8IDEsICcgJyA8PCAxLCAnICcgPDwgMSwgJyAnIDw8IDEsICcwJyA8PCAxfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF4MjVfZGVmYWRkcltBWDI1X0FERFJfTEVOXSA9CisJeydMJyA8PCAxLCAnSScgPDwgMSwgJ04nIDw8IDEsICdVJyA8PCAxLCAnWCcgPDwgMSwgJyAnIDw8IDEsICcxJyA8PCAxfTsKKworc3RhdGljIGNoYXIgYmNhc3RfYWRkcls2XT17MHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkZ9OworCitzdGF0aWMgY2hhciBicHFfZXRoX2FkZHJbNl07CisKK3N0YXRpYyBpbnQgYnBxX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgcGFja2V0X3R5cGUgKik7CitzdGF0aWMgaW50IGJwcV9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcsIHZvaWQgKik7CitzdGF0aWMgY29uc3QgY2hhciAqYnBxX3ByaW50X2V0aGFkZHIoY29uc3QgdW5zaWduZWQgY2hhciAqKTsKKworc3RhdGljIHN0cnVjdCBwYWNrZXRfdHlwZSBicHFfcGFja2V0X3R5cGUgPSB7CisJLnR5cGUJPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0JQUSksCisJLmZ1bmMJPSBicHFfcmN2LAorfTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBicHFfZGV2X25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID1icHFfZGV2aWNlX2V2ZW50LAorfTsKKworCitzdHJ1Y3QgYnBxZGV2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJwcV9saXN0OwkvKiBsaXN0IG9mIGJwcSBkZXZpY2VzIGNoYWluICovCisJc3RydWN0IG5ldF9kZXZpY2UgKmV0aGRldjsJLyogbGluayB0byBldGhlcm5ldCBkZXZpY2UgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqYXhkZXY7CS8qIGJwcSBkZXZpY2UgKGJwcSMpICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CS8qIHNvbWUgc3RhdGlzdGljcyAqLworCWNoYXIgICBkZXN0X2FkZHJbNl07CQkvKiBldGhlciBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJY2hhciAgIGFjcHRfYWRkcls2XTsJCS8qIGFjY2VwdCBldGhlciBmcmFtZXMgZnJvbSB0aGlzIGFkZHJlc3Mgb25seSAqLworfTsKKworc3RhdGljIExJU1RfSEVBRChicHFfZGV2aWNlcyk7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyoKKyAqCUdldCB0aGUgZXRoZXJuZXQgZGV2aWNlIGZvciBhIEJQUSBkZXZpY2UKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0X2RldmljZSAqYnBxX2dldF9ldGhlcl9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYnBxZGV2ICpicHEgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuIGJwcSA/IGJwcS0+ZXRoZGV2IDogTlVMTDsKK30KKworLyoKKyAqCUdldCB0aGUgQlBRIGRldmljZSBmb3IgdGhlIGV0aGVybmV0IGRldmljZQorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRfZGV2aWNlICpicHFfZ2V0X2F4MjVfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJwcWRldiAqYnBxOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShicHEsICZicHFfZGV2aWNlcywgYnBxX2xpc3QpIHsKKwkJaWYgKGJwcS0+ZXRoZGV2ID09IGRldikKKwkJCXJldHVybiBicHEtPmF4ZGV2OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGV2X2lzX2V0aGRldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiAoCisJCQlkZXYtPnR5cGUgPT0gQVJQSFJEX0VUSEVSCisJCQkmJiBzdHJuY21wKGRldi0+bmFtZSwgImR1bW15IiwgNSkKKwkpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKgorICoJUmVjZWl2ZSBhbiBBWC4yNSBmcmFtZSB2aWEgYW4gZXRoZXJuZXQgaW50ZXJmYWNlLgorICovCitzdGF0aWMgaW50IGJwcV9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHBhY2tldF90eXBlICpwdHlwZSkKK3sKKwlpbnQgbGVuOworCWNoYXIgKiBwdHI7CisJc3RydWN0IGV0aGhkciAqZXRoOworCXN0cnVjdCBicHFkZXYgKmJwcTsKKworCWlmICgoc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJCXJldHVybiBORVRfUlhfRFJPUDsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSkpCisJCWdvdG8gZHJvcDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlkZXYgPSBicHFfZ2V0X2F4MjVfZGV2KGRldik7CisKKwlpZiAoZGV2ID09IE5VTEwgfHwgIW5ldGlmX3J1bm5pbmcoZGV2KSkgCisJCWdvdG8gZHJvcF91bmxvY2s7CisKKwkvKgorCSAqIGlmIHdlIHdhbnQgdG8gYWNjZXB0IGZyYW1lcyBmcm9tIGp1c3Qgb25lIGV0aGVybmV0IGRldmljZQorCSAqIHdlIGNoZWNrIHRoZSBzb3VyY2UgYWRkcmVzcyBvZiB0aGUgc2VuZGVyLgorCSAqLworCisJYnBxID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWV0aCA9IGV0aF9oZHIoc2tiKTsKKworCWlmICghKGJwcS0+YWNwdF9hZGRyWzBdICYgMHgwMSkgJiYKKwkgICAgbWVtY21wKGV0aC0+aF9zb3VyY2UsIGJwcS0+YWNwdF9hZGRyLCBFVEhfQUxFTikpCisJCWdvdG8gZHJvcF91bmxvY2s7CisKKwlpZiAoc2tiX2Nvdyhza2IsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSkpCisJCWdvdG8gZHJvcF91bmxvY2s7CisKKwlsZW4gPSBza2ItPmRhdGFbMF0gKyBza2ItPmRhdGFbMV0gKiAyNTYgLSA1OworCisJc2tiX3B1bGwoc2tiLCAyKTsJLyogUmVtb3ZlIHRoZSBsZW5ndGggYnl0ZXMgKi8KKwlza2JfdHJpbShza2IsIGxlbik7CS8qIFNldCB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhICovCisKKwlicHEtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlicHEtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKworCXB0ciA9IHNrYl9wdXNoKHNrYiwgMSk7CisJKnB0ciA9IDA7CisKKwlza2ItPmRldiA9IGRldjsKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQVgyNSk7CisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKKworCW5ldGlmX3J4KHNrYik7CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKK3VubG9jazoKKworCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIDA7Citkcm9wX3VubG9jazoKKwlrZnJlZV9za2Ioc2tiKTsKKwlnb3RvIHVubG9jazsKKworZHJvcDoKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIAlTZW5kIGFuIEFYLjI1IGZyYW1lIHZpYSBhbiBldGhlcm5ldCBpbnRlcmZhY2UKKyAqLworc3RhdGljIGludCBicHFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBza19idWZmICpuZXdza2I7CisJdW5zaWduZWQgY2hhciAqcHRyOworCXN0cnVjdCBicHFkZXYgKmJwcTsKKwlpbnQgc2l6ZTsKKworCS8qCisJICogSnVzdCB0byBiZSAqcmVhbGx5KiBzdXJlIG5vdCB0byBzZW5kIGFueXRoaW5nIGlmIHRoZSBpbnRlcmZhY2UKKwkgKiBpcyBkb3duLCB0aGUgZXRoZXJuZXQgZGV2aWNlIG1heSBoYXZlIGdvbmUuCisJICovCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXNrYl9wdWxsKHNrYiwgMSk7CisJc2l6ZSA9IHNrYi0+bGVuOworCisJLyoKKwkgKiBUaGUgQVguMjUgY29kZSBsZWF2ZXMgZW5vdWdoIHJvb20gZm9yIHRoZSBldGhlcm5ldCBoZWFkZXIsIGJ1dAorCSAqIHNlbmR0bygpIGRvZXMgbm90LgorCSAqLworCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IEFYMjVfQlBRX0hFQURFUl9MRU4pIHsJLyogT3VnaCEgKi8KKwkJaWYgKChuZXdza2IgPSBza2JfcmVhbGxvY19oZWFkcm9vbShza2IsIEFYMjVfQlBRX0hFQURFUl9MRU4pKSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJicHFldGhlcjogb3V0IG9mIG1lbW9yeVxuIik7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJaWYgKHNrYi0+c2sgIT0gTlVMTCkKKwkJCXNrYl9zZXRfb3duZXJfdyhuZXdza2IsIHNrYi0+c2spOworCisJCWtmcmVlX3NrYihza2IpOworCQlza2IgPSBuZXdza2I7CisJfQorCisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0FYMjUpOworCisJcHRyID0gc2tiX3B1c2goc2tiLCAyKTsKKworCSpwdHIrKyA9IChzaXplICsgNSkgJSAyNTY7CisJKnB0cisrID0gKHNpemUgKyA1KSAvIDI1NjsKKworCWJwcSA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoKGRldiA9IGJwcV9nZXRfZXRoZXJfZGV2KGRldikpID09IE5VTEwpIHsKKwkJYnBxLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlza2ItPmRldiA9IGRldjsKKwlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKwlkZXYtPmhhcmRfaGVhZGVyKHNrYiwgZGV2LCBFVEhfUF9CUFEsIGJwcS0+ZGVzdF9hZGRyLCBOVUxMLCAwKTsKKwlicHEtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlicHEtPnN0YXRzLnR4X2J5dGVzKz1za2ItPmxlbjsKKyAgCisJZGV2X3F1ZXVlX3htaXQoc2tiKTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglTdGF0aXN0aWNzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYnBxX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBicHFkZXYgKmJwcSA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gJmJwcS0+c3RhdHM7Cit9CisKKy8qCisgKglTZXQgQVguMjUgY2FsbHNpZ24KKyAqLworc3RhdGljIGludCBicHFfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisgICAgc3RydWN0IHNvY2thZGRyICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyOworCisgICAgbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHNhLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKKworICAgIHJldHVybiAwOworfQorCisvKglJb2N0bCBjb21tYW5kcworICoKKyAqCQlTSU9DU0JQUUVUSE9QVAkJcmVzZXJ2ZWQgZm9yIGVuaGFuY2VtZW50cworICoJCVNJT0NTQlBRRVRIQUREUgkJc2V0IHRoZSBkZXN0aW5hdGlvbiBhbmQgYWNjZXB0ZWQKKyAqCQkJCQlzb3VyY2UgZXRoZXJuZXQgYWRkcmVzcyAoYnJvYWRjYXN0CisgKgkJCQkJb3IgbXVsdGljYXN0OiBhY2NlcHQgYWxsKQorICovCitzdGF0aWMgaW50IGJwcV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgYnBxX2V0aGFkZHIgX191c2VyICpldGhhZGRyID0gaWZyLT5pZnJfZGF0YTsKKwlzdHJ1Y3QgYnBxZGV2ICpicHEgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBicHFfcmVxIHJlcTsKKworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgU0lPQ1NCUFFFVEhPUFQ6CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnJlcSwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKHN0cnVjdCBicHFfcmVxKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlzd2l0Y2ggKHJlcS5jbWQpIHsKKwkJCQljYXNlIFNJT0NHQlBRRVRIUEFSQU06CisJCQkJY2FzZSBTSU9DU0JQUUVUSFBBUkFNOgorCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIFNJT0NTQlBRRVRIQUREUjoKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihicHEtPmRlc3RfYWRkciwgZXRoYWRkci0+ZGVzdGluYXRpb24sIEVUSF9BTEVOKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihicHEtPmFjcHRfYWRkciwgZXRoYWRkci0+YWNjZXB0LCBFVEhfQUxFTikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBvcGVuL2Nsb3NlIGEgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgYnBxX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJwcV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKgorICoJUHJvYyBmaWxlc3lzdGVtCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogYnBxX3ByaW50X2V0aGFkZHIoY29uc3QgdW5zaWduZWQgY2hhciAqZSkKK3sKKwlzdGF0aWMgY2hhciBidWZbMThdOworCisJc3ByaW50ZihidWYsICIlMi4yWDolMi4yWDolMi4yWDolMi4yWDolMi4yWDolMi4yWCIsCisJCWVbMF0sIGVbMV0sIGVbMl0sIGVbM10sIGVbNF0sIGVbNV0pOworCisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIHZvaWQgKmJwcV9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCWludCBpID0gMTsKKwlzdHJ1Y3QgYnBxZGV2ICpicHFkZXY7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlpZiAoKnBvcyA9PSAwKQorCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOworCQorCWxpc3RfZm9yX2VhY2hfZW50cnkoYnBxZGV2LCAmYnBxX2RldmljZXMsIGJwcV9saXN0KSB7CisJCWlmIChpID09ICpwb3MpCisJCQlyZXR1cm4gYnBxZGV2OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKmJwcV9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworCSsrKnBvczsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJcCA9IGJwcV9kZXZpY2VzLm5leHQ7CisJZWxzZQorCQlwID0gKChzdHJ1Y3QgYnBxZGV2ICopdiktPmJwcV9saXN0Lm5leHQ7CisKKwlyZXR1cm4gKHAgPT0gJmJwcV9kZXZpY2VzKSA/IE5VTEwgCisJCTogbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYnBxZGV2LCBicHFfbGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkIGJwcV9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKworCitzdGF0aWMgaW50IGJwcV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXNlcV9wdXRzKHNlcSwgCisJCQkgImRldiAgIGV0aGVyICAgICAgZGVzdGluYXRpb24gICAgICAgIGFjY2VwdCBmcm9tXG4iKTsKKwllbHNlIHsKKwkJY29uc3Qgc3RydWN0IGJwcWRldiAqYnBxZGV2ID0gdjsKKworCQlzZXFfcHJpbnRmKHNlcSwgIiUtNXMgJS0xMHMgJXMgICIsCisJCQlicHFkZXYtPmF4ZGV2LT5uYW1lLCBicHFkZXYtPmV0aGRldi0+bmFtZSwKKwkJCWJwcV9wcmludF9ldGhhZGRyKGJwcWRldi0+ZGVzdF9hZGRyKSk7CisKKwkJc2VxX3ByaW50ZihzZXEsICIlc1xuIiwKKwkJCShicHFkZXYtPmFjcHRfYWRkclswXSAmIDB4MDEpID8gIioiIAorCQkJICAgOiBicHFfcHJpbnRfZXRoYWRkcihicHFkZXYtPmFjcHRfYWRkcikpOworCisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGJwcV9zZXFvcHMgPSB7CisJLnN0YXJ0ID0gYnBxX3NlcV9zdGFydCwKKwkubmV4dCA9IGJwcV9zZXFfbmV4dCwKKwkuc3RvcCA9IGJwcV9zZXFfc3RvcCwKKwkuc2hvdyA9IGJwcV9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgYnBxX2luZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmJwcV9zZXFvcHMpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBicHFfaW5mb19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gYnBxX2luZm9fb3BlbiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworc3RhdGljIHZvaWQgYnBxX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGJwcV94bWl0OworCWRldi0+b3BlbgkgICAgID0gYnBxX29wZW47CisJZGV2LT5zdG9wCSAgICAgPSBicHFfY2xvc2U7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBicHFfc2V0X21hY19hZGRyZXNzOworCWRldi0+Z2V0X3N0YXRzCSAgICAgPSBicHFfZ2V0X3N0YXRzOworCWRldi0+ZG9faW9jdGwJICAgICA9IGJwcV9pb2N0bDsKKwlkZXYtPmRlc3RydWN0b3IJICAgICA9IGZyZWVfbmV0ZGV2OworCisJbWVtY3B5KGRldi0+YnJvYWRjYXN0LCBheDI1X2JjYXN0LCBBWDI1X0FERFJfTEVOKTsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgIGF4MjVfZGVmYWRkciwgQVgyNV9BRERSX0xFTik7CisKKwlkZXYtPmZsYWdzICAgICAgPSAwOworCisjaWYgZGVmaW5lZChDT05GSUdfQVgyNSkgfHwgZGVmaW5lZChDT05GSUdfQVgyNV9NT0RVTEUpCisJZGV2LT5oYXJkX2hlYWRlciAgICAgPSBheDI1X2VuY2Fwc3VsYXRlOworCWRldi0+cmVidWlsZF9oZWFkZXIgID0gYXgyNV9yZWJ1aWxkX2hlYWRlcjsKKyNlbmRpZgorCisJZGV2LT50eXBlICAgICAgICAgICAgPSBBUlBIUkRfQVgyNTsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IEFYMjVfTUFYX0hFQURFUl9MRU4gKyBBWDI1X0JQUV9IRUFERVJfTEVOOworCWRldi0+bXR1ICAgICAgICAgICAgID0gQVgyNV9ERUZfUEFDTEVOOworCWRldi0+YWRkcl9sZW4gICAgICAgID0gQVgyNV9BRERSX0xFTjsKKworfQorCisvKgorICoJU2V0dXAgYSBuZXcgZGV2aWNlLgorICovCitzdGF0aWMgaW50IGJwcV9uZXdfZGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICplZGV2KQoreworCWludCBlcnI7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJc3RydWN0IGJwcWRldiAqYnBxOworCisJbmRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IGJwcWRldiksICJicHElZCIsCisJCQkgICBicHFfc2V0dXApOworCWlmICghbmRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkJCisJYnBxID0gbmV0ZGV2X3ByaXYobmRldik7CisJZGV2X2hvbGQoZWRldik7CisJYnBxLT5ldGhkZXYgPSBlZGV2OworCWJwcS0+YXhkZXYgPSBuZGV2OworCisJbWVtY3B5KGJwcS0+ZGVzdF9hZGRyLCBiY2FzdF9hZGRyLCBzaXplb2YoYnBxX2V0aF9hZGRyKSk7CisJbWVtY3B5KGJwcS0+YWNwdF9hZGRyLCBiY2FzdF9hZGRyLCBzaXplb2YoYnBxX2V0aF9hZGRyKSk7CisKKwllcnIgPSBkZXZfYWxsb2NfbmFtZShuZGV2LCBuZGV2LT5uYW1lKTsKKwlpZiAoZXJyIDwgMCkgCisJCWdvdG8gZXJyb3I7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXZpY2UobmRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJvcjsKKworCS8qIExpc3QgcHJvdGVjdGVkIGJ5IFJUTkwgKi8KKwlsaXN0X2FkZF9yY3UoJmJwcS0+YnBxX2xpc3QsICZicHFfZGV2aWNlcyk7CisJcmV0dXJuIDA7CisKKyBlcnJvcjoKKwlkZXZfcHV0KGVkZXYpOworCWZyZWVfbmV0ZGV2KG5kZXYpOworCXJldHVybiBlcnI7CisJCit9CisKK3N0YXRpYyB2b2lkIGJwcV9mcmVlX2RldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgYnBxZGV2ICpicHEgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCWRldl9wdXQoYnBxLT5ldGhkZXYpOworCWxpc3RfZGVsX3JjdSgmYnBxLT5icHFfbGlzdCk7CisKKwl1bnJlZ2lzdGVyX25ldGRldmljZShuZGV2KTsKK30KKworLyoKKyAqCUhhbmRsZSBkZXZpY2Ugc3RhdHVzIGNoYW5nZXMuCisgKi8KK3N0YXRpYyBpbnQgYnBxX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilwdHI7CisKKwlpZiAoIWRldl9pc19ldGhkZXYoZGV2KSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJcmN1X3JlYWRfbG9jaygpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX1VQOgkJLyogbmV3IGV0aGVybmV0IGRldmljZSAtPiBuZXcgQlBRIGludGVyZmFjZSAqLworCQlpZiAoYnBxX2dldF9heDI1X2RldihkZXYpID09IE5VTEwpCisJCQlicHFfbmV3X2RldmljZShkZXYpOworCQlicmVhazsKKworCWNhc2UgTkVUREVWX0RPV046CS8qIGV0aGVybmV0IGRldmljZSBjbG9zZWQgLT4gY2xvc2UgQlBRIGludGVyZmFjZSAqLworCQlpZiAoKGRldiA9IGJwcV9nZXRfYXgyNV9kZXYoZGV2KSkgIT0gTlVMTCkKKwkJCWRldl9jbG9zZShkZXYpOworCQlicmVhazsKKworCWNhc2UgTkVUREVWX1VOUkVHSVNURVI6CS8qIGV0aGVybmV0IGRldmljZSByZW1vdmVkIC0+IGZyZWUgQlBRIGludGVyZmFjZSAqLworCQlpZiAoKGRldiA9IGJwcV9nZXRfYXgyNV9kZXYoZGV2KSkgIT0gTlVMTCkKKwkJCWJwcV9mcmVlX2RldmljZShkZXYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBJbml0aWFsaXplIGRyaXZlci4gVG8gYmUgY2FsbGVkIGZyb20gYWZfYXgyNSBpZiBub3QgY29tcGlsZWQgYXMgYQorICogbW9kdWxlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGJwcV9pbml0X2RyaXZlcih2b2lkKQoreworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJaWYgKCFwcm9jX25ldF9mb3BzX2NyZWF0ZSgiYnBxZXRoZXIiLCBTX0lSVUdPLCAmYnBxX2luZm9fZm9wcykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiYnBxOiBjYW5ub3QgY3JlYXRlIC9wcm9jL25ldC9icHFldGhlciBlbnRyeS5cbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisjZW5kaWYgIC8qIENPTkZJR19QUk9DX0ZTICovCisKKwlkZXZfYWRkX3BhY2soJmJwcV9wYWNrZXRfdHlwZSk7CisKKwlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmJwcV9kZXZfbm90aWZpZXIpOworCisJcHJpbnRrKGJhbm5lcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGJwcV9jbGVhbnVwX2RyaXZlcih2b2lkKQoreworCXN0cnVjdCBicHFkZXYgKmJwcTsKKworCWRldl9yZW1vdmVfcGFjaygmYnBxX3BhY2tldF90eXBlKTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZicHFfZGV2X25vdGlmaWVyKTsKKworCXByb2NfbmV0X3JlbW92ZSgiYnBxZXRoZXIiKTsKKworCXJ0bmxfbG9jaygpOworCXdoaWxlICghbGlzdF9lbXB0eSgmYnBxX2RldmljZXMpKSB7CisJCWJwcSA9IGxpc3RfZW50cnkoYnBxX2RldmljZXMubmV4dCwgc3RydWN0IGJwcWRldiwgYnBxX2xpc3QpOworCQlicHFfZnJlZV9kZXZpY2UoYnBxLT5heGRldik7CisJfQorCXJ0bmxfdW5sb2NrKCk7Cit9CisKK01PRFVMRV9BVVRIT1IoIkpvZXJnIFJldXRlciBETDFCS0UgPGpyZXV0ZXJAeWFpbmEuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRyYW5zbWl0IGFuZCByZWNlaXZlIEFYLjI1IHBhY2tldHMgb3ZlciBFdGhlcm5ldCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX2luaXQoYnBxX2luaXRfZHJpdmVyKTsKK21vZHVsZV9leGl0KGJwcV9jbGVhbnVwX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9kbWFzY2MuYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2RtYXNjYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMjY5YjcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vZG1hc2NjLmMKQEAgLTAsMCArMSwxNDkzIEBACisvKgorICogRHJpdmVyIGZvciBoaWdoLXNwZWVkIFNDQyBib2FyZHMgKHRob3NlIHdpdGggRE1BIHN1cHBvcnQpCisgKiBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMCBLbGF1cyBLdWRpZWxrYQorICoKKyAqIFM1U0NDL0RNQSBzdXBwb3J0IGJ5IEphbmtvIEtvbGV6bmlrIFM1MkhJCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPG5ldC9heDI1Lmg+CisjaW5jbHVkZSAiejg1MzAuaCIKKworCisvKiBOdW1iZXIgb2YgYnVmZmVycyBwZXIgY2hhbm5lbCAqLworCisjZGVmaW5lIE5VTV9UWF9CVUYgICAgICAyCS8qIE5VTV9UWF9CVUYgPj0gMSAobWluLiAyIHJlY29tbWVuZGVkKSAqLworI2RlZmluZSBOVU1fUlhfQlVGICAgICAgNgkvKiBOVU1fUlhfQlVGID49IDEgKG1pbi4gMiByZWNvbW1lbmRlZCkgKi8KKyNkZWZpbmUgQlVGX1NJWkUgICAgICAgIDE1NzYJLyogQlVGX1NJWkUgPj0gbXR1ICsgaGFyZF9oZWFkZXJfbGVuICovCisKKworLyogQ2FyZHMgc3VwcG9ydGVkICovCisKKyNkZWZpbmUgSFdfUEkgICAgICAgICAgIHsgIk90dGF3YSBQSSIsIDB4MzAwLCAweDIwLCAweDEwLCA4LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgOCwgMTg0MzIwMCwgMzY4NjQwMCB9CisjZGVmaW5lIEhXX1BJMiAgICAgICAgICB7ICJPdHRhd2EgUEkyIiwgMHgzMDAsIDB4MjAsIDB4MTAsIDgsIFwKKwkJCSAgICAwLCA4LCAzNjg2NDAwLCA3MzcyODAwIH0KKyNkZWZpbmUgSFdfVFdJTiAgICAgICAgIHsgIkdyYWNpbGlzIFBhY2tlVHdpbiIsIDB4MjAwLCAweDEwLCAweDEwLCAzMiwgXAorCQkJICAgIDAsIDQsIDYxNDQwMDAsIDYxNDQwMDAgfQorI2RlZmluZSBIV19TNSAgICAgICAgICAgeyAiUzVTQ0MvRE1BIiwgMHgyMDAsIDB4MTAsIDB4MTAsIDMyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDgsIDQ5MTUyMDAsIDk4MzA0MDAgfQorCisjZGVmaW5lIEhBUkRXQVJFICAgICAgICB7IEhXX1BJLCBIV19QSTIsIEhXX1RXSU4sIEhXX1M1IH0KKworI2RlZmluZSBUTVJfMF9IWiAgICAgICAgMjU2MDAJLyogRnJlcXVlbmN5IG9mIHRpbWVyIDAgKi8KKworI2RlZmluZSBUWVBFX1BJICAgICAgICAgMAorI2RlZmluZSBUWVBFX1BJMiAgICAgICAgMQorI2RlZmluZSBUWVBFX1RXSU4gICAgICAgMgorI2RlZmluZSBUWVBFX1M1ICAgICAgICAgMworI2RlZmluZSBOVU1fVFlQRVMgICAgICAgNAorCisjZGVmaW5lIE1BWF9OVU1fREVWUyAgICAzMgorCisKKy8qIFNDQyBjaGlwcyBzdXBwb3J0ZWQgKi8KKworI2RlZmluZSBaODUzMCAgICAgICAgICAgMAorI2RlZmluZSBaODVDMzAgICAgICAgICAgMQorI2RlZmluZSBaODUyMzAgICAgICAgICAgMgorCisjZGVmaW5lIENISVBOQU1FUyAgICAgICB7ICJaODUzMCIsICJaODVDMzAiLCAiWjg1MjMwIiB9CisKKworLyogSS9PIHJlZ2lzdGVycyAqLworCisvKiA4NTMwIHJlZ2lzdGVycyByZWxhdGl2ZSB0byBjYXJkIGJhc2UgKi8KKyNkZWZpbmUgU0NDQl9DTUQgICAgICAgIDB4MDAKKyNkZWZpbmUgU0NDQl9EQVRBICAgICAgIDB4MDEKKyNkZWZpbmUgU0NDQV9DTUQgICAgICAgIDB4MDIKKyNkZWZpbmUgU0NDQV9EQVRBICAgICAgIDB4MDMKKworLyogODI1My84MjU0IHJlZ2lzdGVycyByZWxhdGl2ZSB0byBjYXJkIGJhc2UgKi8KKyNkZWZpbmUgVE1SX0NOVDAgICAgICAgIDB4MDAKKyNkZWZpbmUgVE1SX0NOVDEgICAgICAgIDB4MDEKKyNkZWZpbmUgVE1SX0NOVDIgICAgICAgIDB4MDIKKyNkZWZpbmUgVE1SX0NUUkwgICAgICAgIDB4MDMKKworLyogQWRkaXRpb25hbCBQSS9QSTIgcmVnaXN0ZXJzIHJlbGF0aXZlIHRvIGNhcmQgYmFzZSAqLworI2RlZmluZSBQSV9EUkVRX01BU0sgICAgMHgwNAorCisvKiBBZGRpdGlvbmFsIFBhY2tlVHdpbiByZWdpc3RlcnMgcmVsYXRpdmUgdG8gY2FyZCBiYXNlICovCisjZGVmaW5lIFRXSU5fSU5UX1JFRyAgICAweDA4CisjZGVmaW5lIFRXSU5fQ0xSX1RNUjEgICAweDA5CisjZGVmaW5lIFRXSU5fQ0xSX1RNUjIgICAweDBhCisjZGVmaW5lIFRXSU5fU1BBUkVfMSAgICAweDBiCisjZGVmaW5lIFRXSU5fRE1BX0NGRyAgICAweDA4CisjZGVmaW5lIFRXSU5fU0VSSUFMX0NGRyAweDA5CisjZGVmaW5lIFRXSU5fRE1BX0NMUl9GRiAweDBhCisjZGVmaW5lIFRXSU5fU1BBUkVfMiAgICAweDBiCisKKworLyogUGFja2VUd2luIEkvTyByZWdpc3RlciB2YWx1ZXMgKi8KKworLyogSU5UX1JFRyAqLworI2RlZmluZSBUV0lOX1NDQ19NU0sgICAgICAgMHgwMQorI2RlZmluZSBUV0lOX1RNUjFfTVNLICAgICAgMHgwMgorI2RlZmluZSBUV0lOX1RNUjJfTVNLICAgICAgMHgwNAorI2RlZmluZSBUV0lOX0lOVF9NU0sgICAgICAgMHgwNworCisvKiBTRVJJQUxfQ0ZHICovCisjZGVmaW5lIFRXSU5fRFRSQV9PTiAgICAgICAweDAxCisjZGVmaW5lIFRXSU5fRFRSQl9PTiAgICAgICAweDAyCisjZGVmaW5lIFRXSU5fRVhUQ0xLQSAgICAgICAweDA0CisjZGVmaW5lIFRXSU5fRVhUQ0xLQiAgICAgICAweDA4CisjZGVmaW5lIFRXSU5fTE9PUEFfT04gICAgICAweDEwCisjZGVmaW5lIFRXSU5fTE9PUEJfT04gICAgICAweDIwCisjZGVmaW5lIFRXSU5fRUkgICAgICAgICAgICAweDgwCisKKy8qIERNQV9DRkcgKi8KKyNkZWZpbmUgVFdJTl9ETUFfSERYX1QxICAgIDB4MDgKKyNkZWZpbmUgVFdJTl9ETUFfSERYX1IxICAgIDB4MGEKKyNkZWZpbmUgVFdJTl9ETUFfSERYX1QzICAgIDB4MTQKKyNkZWZpbmUgVFdJTl9ETUFfSERYX1IzICAgIDB4MTYKKyNkZWZpbmUgVFdJTl9ETUFfRkRYX1QzUjEgIDB4MWIKKyNkZWZpbmUgVFdJTl9ETUFfRkRYX1QxUjMgIDB4MWQKKworCisvKiBTdGF0dXMgdmFsdWVzICovCisKKyNkZWZpbmUgSURMRSAgICAgIDAKKyNkZWZpbmUgVFhfSEVBRCAgIDEKKyNkZWZpbmUgVFhfREFUQSAgIDIKKyNkZWZpbmUgVFhfUEFVU0UgIDMKKyNkZWZpbmUgVFhfVEFJTCAgIDQKKyNkZWZpbmUgUlRTX09GRiAgIDUKKyNkZWZpbmUgV0FJVCAgICAgIDYKKyNkZWZpbmUgRENEX09OICAgIDcKKyNkZWZpbmUgUlhfT04gICAgIDgKKyNkZWZpbmUgRENEX09GRiAgIDkKKworCisvKiBJb2N0bHMgKi8KKworI2RlZmluZSBTSU9DR1NDQ1BBUkFNIFNJT0NERVZQUklWQVRFCisjZGVmaW5lIFNJT0NTU0NDUEFSQU0gKFNJT0NERVZQUklWQVRFKzEpCisKKworLyogRGF0YSB0eXBlcyAqLworCitzdHJ1Y3Qgc2NjX3BhcmFtIHsKKwlpbnQgcGNsa19oejsJCS8qIGZyZXF1ZW5jeSBvZiBCUkcgaW5wdXQgKGRvbid0IGNoYW5nZSkgKi8KKwlpbnQgYnJnX3RjOwkJLyogQlJHIHRlcm1pbmFsIGNvdW50OyBCUkcgZGlzYWJsZWQgaWYgPCAwICovCisJaW50IG5yemk7CQkvKiAwIChucnopLCAxIChucnppKSAqLworCWludCBjbG9ja3M7CQkvKiBzZWUgZG1hc2NjX2NmZyBkb2N1bWVudGF0aW9uICovCisJaW50IHR4ZGVsYXk7CQkvKiBbMS9UTVJfMF9IWl0gKi8KKwlpbnQgdHh0aW1lb3V0OwkJLyogWzEvSFpdICovCisJaW50IHR4dGFpbDsJCS8qIFsxL1RNUl8wX0haXSAqLworCWludCB3YWl0dGltZTsJCS8qIFsxL1RNUl8wX0haXSAqLworCWludCBzbG90dGltZTsJCS8qIFsxL1RNUl8wX0haXSAqLworCWludCBwZXJzaXN0OwkJLyogMSAuLi4gMjU2ICovCisJaW50IGRtYTsJCS8qIC0xIChkaXNhYmxlKSwgMCwgMSwgMyAqLworCWludCB0eHBhdXNlOwkJLyogWzEvVE1SXzBfSFpdICovCisJaW50IHJ0c29mZjsJCS8qIFsxL1RNUl8wX0haXSAqLworCWludCBkY2RvbjsJCS8qIFsxL1RNUl8wX0haXSAqLworCWludCBkY2RvZmY7CQkvKiBbMS9UTVJfMF9IWl0gKi8KK307CisKK3N0cnVjdCBzY2NfaGFyZHdhcmUgeworCWNoYXIgKm5hbWU7CisJaW50IGlvX3JlZ2lvbjsKKwlpbnQgaW9fZGVsdGE7CisJaW50IGlvX3NpemU7CisJaW50IG51bV9kZXZzOworCWludCBzY2Nfb2Zmc2V0OworCWludCB0bXJfb2Zmc2V0OworCWludCB0bXJfaHo7CisJaW50IHBjbGtfaHo7Cit9OworCitzdHJ1Y3Qgc2NjX3ByaXYgeworCWludCB0eXBlOworCWludCBjaGlwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHNjY19pbmZvICppbmZvOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCWludCBjaGFubmVsOworCWludCBjYXJkX2Jhc2UsIHNjY19jbWQsIHNjY19kYXRhOworCWludCB0bXJfY250LCB0bXJfY3RybCwgdG1yX21vZGU7CisJc3RydWN0IHNjY19wYXJhbSBwYXJhbTsKKwljaGFyIHJ4X2J1ZltOVU1fUlhfQlVGXVtCVUZfU0laRV07CisJaW50IHJ4X2xlbltOVU1fUlhfQlVGXTsKKwlpbnQgcnhfcHRyOworCXN0cnVjdCB3b3JrX3N0cnVjdCByeF93b3JrOworCWludCByeF9oZWFkLCByeF90YWlsLCByeF9jb3VudDsKKwlpbnQgcnhfb3ZlcjsKKwljaGFyIHR4X2J1ZltOVU1fVFhfQlVGXVtCVUZfU0laRV07CisJaW50IHR4X2xlbltOVU1fVFhfQlVGXTsKKwlpbnQgdHhfcHRyOworCWludCB0eF9oZWFkLCB0eF90YWlsLCB0eF9jb3VudDsKKwlpbnQgc3RhdGU7CisJdW5zaWduZWQgbG9uZyB0eF9zdGFydDsKKwlpbnQgcnIwOworCXNwaW5sb2NrX3QgKnJlZ2lzdGVyX2xvY2s7CS8qIFBlciBzY2NfaW5mbyAqLworCXNwaW5sb2NrX3QgcmluZ19sb2NrOworfTsKKworc3RydWN0IHNjY19pbmZvIHsKKwlpbnQgaXJxX3VzZWQ7CisJaW50IHR3aW5fc2VyaWFsX2NmZzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2WzJdOworCXN0cnVjdCBzY2NfcHJpdiBwcml2WzJdOworCXN0cnVjdCBzY2NfaW5mbyAqbmV4dDsKKwlzcGlubG9ja190IHJlZ2lzdGVyX2xvY2s7CS8qIFBlciBkZXZpY2UgcmVnaXN0ZXIgbG9jayAqLworfTsKKworCisvKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyBpbnQgc2V0dXBfYWRhcHRlcihpbnQgY2FyZF9iYXNlLCBpbnQgdHlwZSwgaW50IG4pIF9faW5pdDsKKworc3RhdGljIHZvaWQgd3JpdGVfc2NjKHN0cnVjdCBzY2NfcHJpdiAqcHJpdiwgaW50IHJlZywgaW50IHZhbCk7CitzdGF0aWMgdm9pZCB3cml0ZV9zY2NfZGF0YShzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYsIGludCB2YWwsIGludCBmYXN0KTsKK3N0YXRpYyBpbnQgcmVhZF9zY2Moc3RydWN0IHNjY19wcml2ICpwcml2LCBpbnQgcmVnKTsKK3N0YXRpYyBpbnQgcmVhZF9zY2NfZGF0YShzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpOworCitzdGF0aWMgaW50IHNjY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzY2NfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNjY19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCk7CitzdGF0aWMgaW50IHNjY19zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2NjX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc2NjX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpzYSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0eF9vbihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpOworc3RhdGljIGlubGluZSB2b2lkIHJ4X29uKHN0cnVjdCBzY2NfcHJpdiAqcHJpdik7CitzdGF0aWMgaW5saW5lIHZvaWQgcnhfb2ZmKHN0cnVjdCBzY2NfcHJpdiAqcHJpdik7CitzdGF0aWMgdm9pZCBzdGFydF90aW1lcihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYsIGludCB0LCBpbnQgcjE1KTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciByYW5kb20odm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB6ODUzMF9pc3Ioc3RydWN0IHNjY19pbmZvICppbmZvKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBzY2NfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgcnhfaXNyKHN0cnVjdCBzY2NfcHJpdiAqcHJpdik7CitzdGF0aWMgdm9pZCBzcGVjaWFsX2NvbmRpdGlvbihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYsIGludCByYyk7CitzdGF0aWMgdm9pZCByeF9iaCh2b2lkICphcmcpOworc3RhdGljIHZvaWQgdHhfaXNyKHN0cnVjdCBzY2NfcHJpdiAqcHJpdik7CitzdGF0aWMgdm9pZCBlc19pc3Ioc3RydWN0IHNjY19wcml2ICpwcml2KTsKK3N0YXRpYyB2b2lkIHRtX2lzcihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpOworCisKKy8qIEluaXRpYWxpemF0aW9uIHZhcmlhYmxlcyAqLworCitzdGF0aWMgaW50IGlvW01BWF9OVU1fREVWU10gX19pbml0ZGF0YSA9IHsgMCwgfTsKKworLyogQmV3YXJlISBod1tdIGlzIGFsc28gdXNlZCBpbiBjbGVhbnVwX21vZHVsZSgpLiAqLworc3RhdGljIHN0cnVjdCBzY2NfaGFyZHdhcmUgaHdbTlVNX1RZUEVTXSBfX2luaXRkYXRhX29yX21vZHVsZSA9IEhBUkRXQVJFOworc3RhdGljIGNoYXIgYXgyNV9icm9hZGNhc3RbN10gX19pbml0ZGF0YSA9CisgICAgeyAnUScgPDwgMSwgJ1MnIDw8IDEsICdUJyA8PCAxLCAnICcgPDwgMSwgJyAnIDw8IDEsICcgJyA8PCAxLAorJzAnIDw8IDEgfTsKK3N0YXRpYyBjaGFyIGF4MjVfdGVzdFs3XSBfX2luaXRkYXRhID0KKyAgICB7ICdMJyA8PCAxLCAnSScgPDwgMSwgJ04nIDw8IDEsICdVJyA8PCAxLCAnWCcgPDwgMSwgJyAnIDw8IDEsCisnMScgPDwgMSB9OworCisKKy8qIEdsb2JhbCB2YXJpYWJsZXMgKi8KKworc3RhdGljIHN0cnVjdCBzY2NfaW5mbyAqZmlyc3Q7CitzdGF0aWMgdW5zaWduZWQgbG9uZyByYW5kOworCisKK01PRFVMRV9BVVRIT1IoIktsYXVzIEt1ZGllbGthIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgaGlnaC1zcGVlZCBTQ0MgYm9hcmRzIik7CitNT0RVTEVfUEFSTShpbywgIjEtIiBfX01PRFVMRV9TVFJJTkcoTUFYX05VTV9ERVZTKSAiaSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZG1hc2NjX2V4aXQodm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NjX2luZm8gKmluZm87CisKKwl3aGlsZSAoZmlyc3QpIHsKKwkJaW5mbyA9IGZpcnN0OworCisJCS8qIFVucmVnaXN0ZXIgZGV2aWNlcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQkJdW5yZWdpc3Rlcl9uZXRkZXYoaW5mby0+ZGV2W2ldKTsKKworCQkvKiBSZXNldCBib2FyZCAqLworCQlpZiAoaW5mby0+cHJpdlswXS50eXBlID09IFRZUEVfVFdJTikKKwkJCW91dGIoMCwgaW5mby0+ZGV2WzBdLT5iYXNlX2FkZHIgKyBUV0lOX1NFUklBTF9DRkcpOworCQl3cml0ZV9zY2MoJmluZm8tPnByaXZbMF0sIFI5LCBGSFdSRVMpOworCQlyZWxlYXNlX3JlZ2lvbihpbmZvLT5kZXZbMF0tPmJhc2VfYWRkciwKKwkJCSAgICAgICBod1tpbmZvLT5wcml2WzBdLnR5cGVdLmlvX3NpemUpOworCisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCQlmcmVlX25ldGRldihpbmZvLT5kZXZbaV0pOworCisJCS8qIEZyZWUgbWVtb3J5ICovCisJCWZpcnN0ID0gaW5mby0+bmV4dDsKKwkJa2ZyZWUoaW5mbyk7CisJfQorfQorCisjaWZuZGVmIE1PRFVMRQordm9pZCBfX2luaXQgZG1hc2NjX3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fREVWUyAmJiBpIDwgaW50c1swXTsgaSsrKQorCQlpb1tpXSA9IGludHNbaSArIDFdOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGRtYXNjY19pbml0KHZvaWQpCit7CisJaW50IGgsIGksIGosIG47CisJaW50IGJhc2VbTUFYX05VTV9ERVZTXSwgdGNtZFtNQVhfTlVNX0RFVlNdLCB0MFtNQVhfTlVNX0RFVlNdLAorCSAgICB0MVtNQVhfTlVNX0RFVlNdOworCXVuc2lnbmVkIHRfdmFsOworCXVuc2lnbmVkIGxvbmcgdGltZSwgc3RhcnRbTUFYX05VTV9ERVZTXSwgZGVsYXlbTUFYX05VTV9ERVZTXSwKKwkgICAgY291bnRpbmdbTUFYX05VTV9ERVZTXTsKKworCS8qIEluaXRpYWxpemUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgKi8KKwlyYW5kID0gamlmZmllczsKKwkvKiBDYXJkcyBmb3VuZCA9IDAgKi8KKwluID0gMDsKKwkvKiBXYXJuaW5nIG1lc3NhZ2UgKi8KKwlpZiAoIWlvWzBdKQorCQlwcmludGsoS0VSTl9JTkZPICJkbWFzY2M6IGF1dG9wcm9iaW5nIChkYW5nZXJvdXMpXG4iKTsKKworCS8qIFJ1biBhdXRvZGV0ZWN0aW9uIGZvciBlYWNoIGNhcmQgdHlwZSAqLworCWZvciAoaCA9IDA7IGggPCBOVU1fVFlQRVM7IGgrKykgeworCisJCWlmIChpb1swXSkgeworCQkJLyogVXNlci1zcGVjaWZpZWQgSS9PIGFkZHJlc3MgcmVnaW9ucyAqLworCQkJZm9yIChpID0gMDsgaSA8IGh3W2hdLm51bV9kZXZzOyBpKyspCisJCQkJYmFzZVtpXSA9IDA7CisJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9ERVZTICYmIGlvW2ldOyBpKyspIHsKKwkJCQlqID0gKGlvW2ldIC0KKwkJCQkgICAgIGh3W2hdLmlvX3JlZ2lvbikgLyBod1toXS5pb19kZWx0YTsKKwkJCQlpZiAoaiA+PSAwICYmIGogPCBod1toXS5udW1fZGV2cworCQkJCSAgICAmJiBod1toXS5pb19yZWdpb24gKworCQkJCSAgICBqICogaHdbaF0uaW9fZGVsdGEgPT0gaW9baV0pIHsKKwkJCQkJYmFzZVtqXSA9IGlvW2ldOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIERlZmF1bHQgSS9PIGFkZHJlc3MgcmVnaW9ucyAqLworCQkJZm9yIChpID0gMDsgaSA8IGh3W2hdLm51bV9kZXZzOyBpKyspIHsKKwkJCQliYXNlW2ldID0KKwkJCQkgICAgaHdbaF0uaW9fcmVnaW9uICsgaSAqIGh3W2hdLmlvX2RlbHRhOworCQkJfQorCQl9CisKKwkJLyogQ2hlY2sgdmFsaWQgSS9PIGFkZHJlc3MgcmVnaW9ucyAqLworCQlmb3IgKGkgPSAwOyBpIDwgaHdbaF0ubnVtX2RldnM7IGkrKykKKwkJCWlmIChiYXNlW2ldKSB7CisJCQkJaWYgKCFyZXF1ZXN0X3JlZ2lvbgorCQkJCSAgICAoYmFzZVtpXSwgaHdbaF0uaW9fc2l6ZSwgImRtYXNjYyIpKQorCQkJCQliYXNlW2ldID0gMDsKKwkJCQllbHNlIHsKKwkJCQkJdGNtZFtpXSA9CisJCQkJCSAgICBiYXNlW2ldICsgaHdbaF0udG1yX29mZnNldCArCisJCQkJCSAgICBUTVJfQ1RSTDsKKwkJCQkJdDBbaV0gPQorCQkJCQkgICAgYmFzZVtpXSArIGh3W2hdLnRtcl9vZmZzZXQgKworCQkJCQkgICAgVE1SX0NOVDA7CisJCQkJCXQxW2ldID0KKwkJCQkJICAgIGJhc2VbaV0gKyBod1toXS50bXJfb2Zmc2V0ICsKKwkJCQkJICAgIFRNUl9DTlQxOworCQkJCX0KKwkJCX0KKworCQkvKiBTdGFydCB0aW1lcnMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGh3W2hdLm51bV9kZXZzOyBpKyspCisJCQlpZiAoYmFzZVtpXSkgeworCQkJCS8qIFRpbWVyIDA6IExTQitNU0IsIE1vZGUgMywgVE1SXzBfSFogKi8KKwkJCQlvdXRiKDB4MzYsIHRjbWRbaV0pOworCQkJCW91dGIoKGh3W2hdLnRtcl9oeiAvIFRNUl8wX0haKSAmIDB4RkYsCisJCQkJICAgICB0MFtpXSk7CisJCQkJb3V0YigoaHdbaF0udG1yX2h6IC8gVE1SXzBfSFopID4+IDgsCisJCQkJICAgICB0MFtpXSk7CisJCQkJLyogVGltZXIgMTogTFNCK01TQiwgTW9kZSAwLCBIWi8xMCAqLworCQkJCW91dGIoMHg3MCwgdGNtZFtpXSk7CisJCQkJb3V0YigoVE1SXzBfSFogLyBIWiAqIDEwKSAmIDB4RkYsIHQxW2ldKTsKKwkJCQlvdXRiKChUTVJfMF9IWiAvIEhaICogMTApID4+IDgsIHQxW2ldKTsKKwkJCQlzdGFydFtpXSA9IGppZmZpZXM7CisJCQkJZGVsYXlbaV0gPSAwOworCQkJCWNvdW50aW5nW2ldID0gMTsKKwkJCQkvKiBUaW1lciAyOiBMU0IrTVNCLCBNb2RlIDAgKi8KKwkJCQlvdXRiKDB4YjAsIHRjbWRbaV0pOworCQkJfQorCQl0aW1lID0gamlmZmllczsKKwkJLyogV2FpdCB1bnRpbCBjb3VudGVyIHJlZ2lzdGVycyBhcmUgbG9hZGVkICovCisJCXVkZWxheSgyMDAwMDAwIC8gVE1SXzBfSFopOworCisJCS8qIFRpbWluZyBsb29wICovCisJCXdoaWxlIChqaWZmaWVzIC0gdGltZSA8IDEzKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgaHdbaF0ubnVtX2RldnM7IGkrKykKKwkJCQlpZiAoYmFzZVtpXSAmJiBjb3VudGluZ1tpXSkgeworCQkJCQkvKiBSZWFkIGJhY2sgVGltZXIgMTogbGF0Y2g7IHJlYWQgTFNCOyByZWFkIE1TQiAqLworCQkJCQlvdXRiKDB4NDAsIHRjbWRbaV0pOworCQkJCQl0X3ZhbCA9CisJCQkJCSAgICBpbmIodDFbaV0pICsgKGluYih0MVtpXSkgPDwgOCk7CisJCQkJCS8qIEFsc28gY2hlY2sgd2hldGhlciBjb3VudGVyIGRpZCB3cmFwICovCisJCQkJCWlmICh0X3ZhbCA9PSAwCisJCQkJCSAgICB8fCB0X3ZhbCA+IFRNUl8wX0haIC8gSFogKiAxMCkKKwkJCQkJCWNvdW50aW5nW2ldID0gMDsKKwkJCQkJZGVsYXlbaV0gPSBqaWZmaWVzIC0gc3RhcnRbaV07CisJCQkJfQorCQl9CisKKwkJLyogRXZhbHVhdGUgbWVhc3VyZW1lbnRzICovCisJCWZvciAoaSA9IDA7IGkgPCBod1toXS5udW1fZGV2czsgaSsrKQorCQkJaWYgKGJhc2VbaV0pIHsKKwkJCQlpZiAoKGRlbGF5W2ldID49IDkgJiYgZGVsYXlbaV0gPD0gMTEpICYmCisJCQkJICAgIC8qIE9rLCB3ZSBoYXZlIGZvdW5kIGFuIGFkYXB0ZXIgKi8KKwkJCQkgICAgKHNldHVwX2FkYXB0ZXIoYmFzZVtpXSwgaCwgbikgPT0gMCkpCisJCQkJCW4rKzsKKwkJCQllbHNlCisJCQkJCXJlbGVhc2VfcmVnaW9uKGJhc2VbaV0sCisJCQkJCQkgICAgICAgaHdbaF0uaW9fc2l6ZSk7CisJCQl9CisKKwl9CQkJLyogTlVNX1RZUEVTICovCisKKwkvKiBJZiBhbnkgYWRhcHRlciB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkLCByZXR1cm4gb2sgKi8KKwlpZiAobikKKwkJcmV0dXJuIDA7CisKKwkvKiBJZiBubyBhZGFwdGVyIGZvdW5kLCByZXR1cm4gZXJyb3IgKi8KKwlwcmludGsoS0VSTl9JTkZPICJkbWFzY2M6IG5vIGFkYXB0ZXJzIGZvdW5kXG4iKTsKKwlyZXR1cm4gLUVJTzsKK30KKworbW9kdWxlX2luaXQoZG1hc2NjX2luaXQpOworbW9kdWxlX2V4aXQoZG1hc2NjX2V4aXQpOworCitzdGF0aWMgdm9pZCBkZXZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkZXYtPnR5cGUgPSBBUlBIUkRfQVgyNTsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IDczOworCWRldi0+bXR1ID0gMTUwMDsKKwlkZXYtPmFkZHJfbGVuID0gNzsKKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IDY0OworCW1lbWNweShkZXYtPmJyb2FkY2FzdCwgYXgyNV9icm9hZGNhc3QsIDcpOworCW1lbWNweShkZXYtPmRldl9hZGRyLCBheDI1X3Rlc3QsIDcpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9hZGFwdGVyKGludCBjYXJkX2Jhc2UsIGludCB0eXBlLCBpbnQgbikKK3sKKwlpbnQgaSwgaXJxLCBjaGlwOworCXN0cnVjdCBzY2NfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBzY2NfcHJpdiAqcHJpdjsKKwl1bnNpZ25lZCBsb25nIHRpbWU7CisJdW5zaWduZWQgaW50IGlycXM7CisJaW50IHRtcl9iYXNlID0gY2FyZF9iYXNlICsgaHdbdHlwZV0udG1yX29mZnNldDsKKwlpbnQgc2NjX2Jhc2UgPSBjYXJkX2Jhc2UgKyBod1t0eXBlXS5zY2Nfb2Zmc2V0OworCWNoYXIgKmNoaXBuYW1lc1tdID0gQ0hJUE5BTUVTOworCisJLyogQWxsb2NhdGUgbWVtb3J5ICovCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzY2NfaW5mbyksIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlpZiAoIWluZm8pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWFzY2M6ICIKKwkJICAgICAgICJjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciAlcyBhdCAlIzN4XG4iLAorCQkgICAgICAgaHdbdHlwZV0ubmFtZSwgY2FyZF9iYXNlKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogSW5pdGlhbGl6ZSB3aGF0IGlzIG5lY2Vzc2FyeSBmb3Igd3JpdGVfc2NjIGFuZCB3cml0ZV9zY2NfZGF0YSAqLworCW1lbXNldChpbmZvLCAwLCBzaXplb2Yoc3RydWN0IHNjY19pbmZvKSk7CisKKwlpbmZvLT5kZXZbMF0gPSBhbGxvY19uZXRkZXYoMCwgIiIsIGRldl9zZXR1cCk7CisJaWYgKCFpbmZvLT5kZXZbMF0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWFzY2M6ICIKKwkJICAgICAgICJjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciAlcyBhdCAlIzN4XG4iLAorCQkgICAgICAgaHdbdHlwZV0ubmFtZSwgY2FyZF9iYXNlKTsKKwkJZ290byBvdXQxOworCX0KKworCWluZm8tPmRldlsxXSA9IGFsbG9jX25ldGRldigwLCAiIiwgZGV2X3NldHVwKTsKKwlpZiAoIWluZm8tPmRldlsxXSkgeworCQlwcmludGsoS0VSTl9FUlIgImRtYXNjYzogIgorCQkgICAgICAgImNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yICVzIGF0ICUjM3hcbiIsCisJCSAgICAgICBod1t0eXBlXS5uYW1lLCBjYXJkX2Jhc2UpOworCQlnb3RvIG91dDI7CisJfQorCXNwaW5fbG9ja19pbml0KCZpbmZvLT5yZWdpc3Rlcl9sb2NrKTsKKworCXByaXYgPSAmaW5mby0+cHJpdlswXTsKKwlwcml2LT50eXBlID0gdHlwZTsKKwlwcml2LT5jYXJkX2Jhc2UgPSBjYXJkX2Jhc2U7CisJcHJpdi0+c2NjX2NtZCA9IHNjY19iYXNlICsgU0NDQV9DTUQ7CisJcHJpdi0+c2NjX2RhdGEgPSBzY2NfYmFzZSArIFNDQ0FfREFUQTsKKwlwcml2LT5yZWdpc3Rlcl9sb2NrID0gJmluZm8tPnJlZ2lzdGVyX2xvY2s7CisKKwkvKiBSZXNldCBTQ0MgKi8KKwl3cml0ZV9zY2MocHJpdiwgUjksIEZIV1JFUyB8IE1JRSB8IE5WKTsKKworCS8qIERldGVybWluZSB0eXBlIG9mIGNoaXAgYnkgZW5hYmxpbmcgU0RMQy9IRExDIGVuaGFuY2VtZW50cyAqLworCXdyaXRlX3NjYyhwcml2LCBSMTUsIFNIRExDRSk7CisJaWYgKCFyZWFkX3NjYyhwcml2LCBSMTUpKSB7CisJCS8qIFdSNycgbm90IHByZXNlbnQuIFRoaXMgaXMgYW4gb3JkaW5hcnkgWjg1MzAgU0NDLiAqLworCQljaGlwID0gWjg1MzA7CisJfSBlbHNlIHsKKwkJLyogUHV0IG9uZSBjaGFyYWN0ZXIgaW4gVFggRklGTyAqLworCQl3cml0ZV9zY2NfZGF0YShwcml2LCAwLCAwKTsKKwkJaWYgKHJlYWRfc2NjKHByaXYsIFIwKSAmIFR4X0JVRl9FTVApIHsKKwkJCS8qIFRYIEZJRk8gbm90IGZ1bGwuIFRoaXMgaXMgYSBaODUyMzAgRVNDQyB3aXRoIGEgNC1ieXRlIEZJRk8uICovCisJCQljaGlwID0gWjg1MjMwOworCQl9IGVsc2UgeworCQkJLyogVFggRklGTyBmdWxsLiBUaGlzIGlzIGEgWjg1QzMwIFNDQyB3aXRoIGEgMS1ieXRlIEZJRk8uICovCisJCQljaGlwID0gWjg1QzMwOworCQl9CisJfQorCXdyaXRlX3NjYyhwcml2LCBSMTUsIDApOworCisJLyogU3RhcnQgSVJRIGF1dG8tZGV0ZWN0aW9uICovCisJaXJxcyA9IHByb2JlX2lycV9vbigpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgKi8KKwlpZiAodHlwZSA9PSBUWVBFX1RXSU4pIHsKKwkJb3V0YigwLCBjYXJkX2Jhc2UgKyBUV0lOX0RNQV9DRkcpOworCQlpbmIoY2FyZF9iYXNlICsgVFdJTl9DTFJfVE1SMSk7CisJCWluYihjYXJkX2Jhc2UgKyBUV0lOX0NMUl9UTVIyKTsKKwkJaW5mby0+dHdpbl9zZXJpYWxfY2ZnID0gVFdJTl9FSTsKKwkJb3V0YihpbmZvLT50d2luX3NlcmlhbF9jZmcsIGNhcmRfYmFzZSArIFRXSU5fU0VSSUFMX0NGRyk7CisJfSBlbHNlIHsKKwkJd3JpdGVfc2NjKHByaXYsIFIxNSwgQ1RTSUUpOworCQl3cml0ZV9zY2MocHJpdiwgUjAsIFJFU19FWFRfSU5UKTsKKwkJd3JpdGVfc2NjKHByaXYsIFIxLCBFWFRfSU5UX0VOQUIpOworCX0KKworCS8qIFN0YXJ0IHRpbWVyICovCisJb3V0YigxLCB0bXJfYmFzZSArIFRNUl9DTlQxKTsKKwlvdXRiKDAsIHRtcl9iYXNlICsgVE1SX0NOVDEpOworCisJLyogV2FpdCBhbmQgZGV0ZWN0IElSUSAqLworCXRpbWUgPSBqaWZmaWVzOworCXdoaWxlIChqaWZmaWVzIC0gdGltZSA8IDIgKyBIWiAvIFRNUl8wX0haKTsKKwlpcnEgPSBwcm9iZV9pcnFfb2ZmKGlycXMpOworCisJLyogQ2xlYXIgcGVuZGluZyBpbnRlcnJ1cHQsIGRpc2FibGUgaW50ZXJydXB0cyAqLworCWlmICh0eXBlID09IFRZUEVfVFdJTikgeworCQlpbmIoY2FyZF9iYXNlICsgVFdJTl9DTFJfVE1SMSk7CisJfSBlbHNlIHsKKwkJd3JpdGVfc2NjKHByaXYsIFIxLCAwKTsKKwkJd3JpdGVfc2NjKHByaXYsIFIxNSwgMCk7CisJCXdyaXRlX3NjYyhwcml2LCBSMCwgUkVTX0VYVF9JTlQpOworCX0KKworCWlmIChpcnEgPD0gMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJkbWFzY2M6IGNvdWxkIG5vdCBmaW5kIGlycSBvZiAlcyBhdCAlIzN4IChpcnE9JWQpXG4iLAorCQkgICAgICAgaHdbdHlwZV0ubmFtZSwgY2FyZF9iYXNlLCBpcnEpOworCQlnb3RvIG91dDM7CisJfQorCisJLyogU2V0IHVwIGRhdGEgc3RydWN0dXJlcyAqLworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJZGV2ID0gaW5mby0+ZGV2W2ldOworCQlwcml2ID0gJmluZm8tPnByaXZbaV07CisJCXByaXYtPnR5cGUgPSB0eXBlOworCQlwcml2LT5jaGlwID0gY2hpcDsKKwkJcHJpdi0+ZGV2ID0gZGV2OworCQlwcml2LT5pbmZvID0gaW5mbzsKKwkJcHJpdi0+Y2hhbm5lbCA9IGk7CisJCXNwaW5fbG9ja19pbml0KCZwcml2LT5yaW5nX2xvY2spOworCQlwcml2LT5yZWdpc3Rlcl9sb2NrID0gJmluZm8tPnJlZ2lzdGVyX2xvY2s7CisJCXByaXYtPmNhcmRfYmFzZSA9IGNhcmRfYmFzZTsKKwkJcHJpdi0+c2NjX2NtZCA9IHNjY19iYXNlICsgKGkgPyBTQ0NCX0NNRCA6IFNDQ0FfQ01EKTsKKwkJcHJpdi0+c2NjX2RhdGEgPSBzY2NfYmFzZSArIChpID8gU0NDQl9EQVRBIDogU0NDQV9EQVRBKTsKKwkJcHJpdi0+dG1yX2NudCA9IHRtcl9iYXNlICsgKGkgPyBUTVJfQ05UMiA6IFRNUl9DTlQxKTsKKwkJcHJpdi0+dG1yX2N0cmwgPSB0bXJfYmFzZSArIFRNUl9DVFJMOworCQlwcml2LT50bXJfbW9kZSA9IGkgPyAweGIwIDogMHg3MDsKKwkJcHJpdi0+cGFyYW0ucGNsa19oeiA9IGh3W3R5cGVdLnBjbGtfaHo7CisJCXByaXYtPnBhcmFtLmJyZ190YyA9IC0xOworCQlwcml2LT5wYXJhbS5jbG9ja3MgPSBUQ1RSeENQIHwgUkNSVHhDUDsKKwkJcHJpdi0+cGFyYW0ucGVyc2lzdCA9IDI1NjsKKwkJcHJpdi0+cGFyYW0uZG1hID0gLTE7CisJCUlOSVRfV09SSygmcHJpdi0+cnhfd29yaywgcnhfYmgsIHByaXYpOworCQlkZXYtPnByaXYgPSBwcml2OworCQlzcHJpbnRmKGRldi0+bmFtZSwgImRtYXNjYyVpIiwgMiAqIG4gKyBpKTsKKwkJU0VUX01PRFVMRV9PV05FUihkZXYpOworCQlkZXYtPmJhc2VfYWRkciA9IGNhcmRfYmFzZTsKKwkJZGV2LT5pcnEgPSBpcnE7CisJCWRldi0+b3BlbiA9IHNjY19vcGVuOworCQlkZXYtPnN0b3AgPSBzY2NfY2xvc2U7CisJCWRldi0+ZG9faW9jdGwgPSBzY2NfaW9jdGw7CisJCWRldi0+aGFyZF9zdGFydF94bWl0ID0gc2NjX3NlbmRfcGFja2V0OworCQlkZXYtPmdldF9zdGF0cyA9IHNjY19nZXRfc3RhdHM7CisJCWRldi0+aGFyZF9oZWFkZXIgPSBheDI1X2VuY2Fwc3VsYXRlOworCQlkZXYtPnJlYnVpbGRfaGVhZGVyID0gYXgyNV9yZWJ1aWxkX2hlYWRlcjsKKwkJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBzY2Nfc2V0X21hY19hZGRyZXNzOworCX0KKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGluZm8tPmRldlswXSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWFzY2M6IGNvdWxkIG5vdCByZWdpc3RlciAlc1xuIiwKKwkJICAgICAgIGluZm8tPmRldlswXS0+bmFtZSk7CisJCWdvdG8gb3V0MzsKKwl9CisJaWYgKHJlZ2lzdGVyX25ldGRldihpbmZvLT5kZXZbMV0pKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZG1hc2NjOiBjb3VsZCBub3QgcmVnaXN0ZXIgJXNcbiIsCisJCSAgICAgICBpbmZvLT5kZXZbMV0tPm5hbWUpOworCQlnb3RvIG91dDQ7CisJfQorCisKKwlpbmZvLT5uZXh0ID0gZmlyc3Q7CisJZmlyc3QgPSBpbmZvOworCXByaW50ayhLRVJOX0lORk8gImRtYXNjYzogZm91bmQgJXMgKCVzKSBhdCAlIzN4LCBpcnEgJWRcbiIsCisJICAgICAgIGh3W3R5cGVdLm5hbWUsIGNoaXBuYW1lc1tjaGlwXSwgY2FyZF9iYXNlLCBpcnEpOworCXJldHVybiAwOworCisgICAgICBvdXQ0OgorCXVucmVnaXN0ZXJfbmV0ZGV2KGluZm8tPmRldlswXSk7CisgICAgICBvdXQzOgorCWlmIChpbmZvLT5wcml2WzBdLnR5cGUgPT0gVFlQRV9UV0lOKQorCQlvdXRiKDAsIGluZm8tPmRldlswXS0+YmFzZV9hZGRyICsgVFdJTl9TRVJJQUxfQ0ZHKTsKKwl3cml0ZV9zY2MoJmluZm8tPnByaXZbMF0sIFI5LCBGSFdSRVMpOworCWZyZWVfbmV0ZGV2KGluZm8tPmRldlsxXSk7CisgICAgICBvdXQyOgorCWZyZWVfbmV0ZGV2KGluZm8tPmRldlswXSk7CisgICAgICBvdXQxOgorCWtmcmVlKGluZm8pOworICAgICAgb3V0OgorCXJldHVybiAtMTsKK30KKworCisvKiBEcml2ZXIgZnVuY3Rpb25zICovCisKK3N0YXRpYyB2b2lkIHdyaXRlX3NjYyhzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYsIGludCByZWcsIGludCB2YWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzd2l0Y2ggKHByaXYtPnR5cGUpIHsKKwljYXNlIFRZUEVfUzU6CisJCWlmIChyZWcpCisJCQlvdXRiKHJlZywgcHJpdi0+c2NjX2NtZCk7CisJCW91dGIodmFsLCBwcml2LT5zY2NfY21kKTsKKwkJcmV0dXJuOworCWNhc2UgVFlQRV9UV0lOOgorCQlpZiAocmVnKQorCQkJb3V0Yl9wKHJlZywgcHJpdi0+c2NjX2NtZCk7CisJCW91dGJfcCh2YWwsIHByaXYtPnNjY19jbWQpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJc3Bpbl9sb2NrX2lycXNhdmUocHJpdi0+cmVnaXN0ZXJfbG9jaywgZmxhZ3MpOworCQlvdXRiX3AoMCwgcHJpdi0+Y2FyZF9iYXNlICsgUElfRFJFUV9NQVNLKTsKKwkJaWYgKHJlZykKKwkJCW91dGJfcChyZWcsIHByaXYtPnNjY19jbWQpOworCQlvdXRiX3AodmFsLCBwcml2LT5zY2NfY21kKTsKKwkJb3V0YigxLCBwcml2LT5jYXJkX2Jhc2UgKyBQSV9EUkVRX01BU0spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHByaXYtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KK30KKworCitzdGF0aWMgdm9pZCB3cml0ZV9zY2NfZGF0YShzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYsIGludCB2YWwsIGludCBmYXN0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3dpdGNoIChwcml2LT50eXBlKSB7CisJY2FzZSBUWVBFX1M1OgorCQlvdXRiKHZhbCwgcHJpdi0+c2NjX2RhdGEpOworCQlyZXR1cm47CisJY2FzZSBUWVBFX1RXSU46CisJCW91dGJfcCh2YWwsIHByaXYtPnNjY19kYXRhKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWlmIChmYXN0KQorCQkJb3V0Yl9wKHZhbCwgcHJpdi0+c2NjX2RhdGEpOworCQllbHNlIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKHByaXYtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKKwkJCW91dGJfcCgwLCBwcml2LT5jYXJkX2Jhc2UgKyBQSV9EUkVRX01BU0spOworCQkJb3V0Yl9wKHZhbCwgcHJpdi0+c2NjX2RhdGEpOworCQkJb3V0YigxLCBwcml2LT5jYXJkX2Jhc2UgKyBQSV9EUkVRX01BU0spOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwcml2LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7CisJCX0KKwkJcmV0dXJuOworCX0KK30KKworCitzdGF0aWMgaW50IHJlYWRfc2NjKHN0cnVjdCBzY2NfcHJpdiAqcHJpdiwgaW50IHJlZykKK3sKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzd2l0Y2ggKHByaXYtPnR5cGUpIHsKKwljYXNlIFRZUEVfUzU6CisJCWlmIChyZWcpCisJCQlvdXRiKHJlZywgcHJpdi0+c2NjX2NtZCk7CisJCXJldHVybiBpbmIocHJpdi0+c2NjX2NtZCk7CisJY2FzZSBUWVBFX1RXSU46CisJCWlmIChyZWcpCisJCQlvdXRiX3AocmVnLCBwcml2LT5zY2NfY21kKTsKKwkJcmV0dXJuIGluYl9wKHByaXYtPnNjY19jbWQpOworCWRlZmF1bHQ6CisJCXNwaW5fbG9ja19pcnFzYXZlKHByaXYtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKKwkJb3V0Yl9wKDAsIHByaXYtPmNhcmRfYmFzZSArIFBJX0RSRVFfTUFTSyk7CisJCWlmIChyZWcpCisJCQlvdXRiX3AocmVnLCBwcml2LT5zY2NfY21kKTsKKwkJcmMgPSBpbmJfcChwcml2LT5zY2NfY21kKTsKKwkJb3V0YigxLCBwcml2LT5jYXJkX2Jhc2UgKyBQSV9EUkVRX01BU0spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHByaXYtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHJjOworCX0KK30KKworCitzdGF0aWMgaW50IHJlYWRfc2NjX2RhdGEoc3RydWN0IHNjY19wcml2ICpwcml2KQoreworCWludCByYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN3aXRjaCAocHJpdi0+dHlwZSkgeworCWNhc2UgVFlQRV9TNToKKwkJcmV0dXJuIGluYihwcml2LT5zY2NfZGF0YSk7CisJY2FzZSBUWVBFX1RXSU46CisJCXJldHVybiBpbmJfcChwcml2LT5zY2NfZGF0YSk7CisJZGVmYXVsdDoKKwkJc3Bpbl9sb2NrX2lycXNhdmUocHJpdi0+cmVnaXN0ZXJfbG9jaywgZmxhZ3MpOworCQlvdXRiX3AoMCwgcHJpdi0+Y2FyZF9iYXNlICsgUElfRFJFUV9NQVNLKTsKKwkJcmMgPSBpbmJfcChwcml2LT5zY2NfZGF0YSk7CisJCW91dGIoMSwgcHJpdi0+Y2FyZF9iYXNlICsgUElfRFJFUV9NQVNLKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwcml2LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7CisJCXJldHVybiByYzsKKwl9Cit9CisKKworc3RhdGljIGludCBzY2Nfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzY2NfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2NjX2luZm8gKmluZm8gPSBwcml2LT5pbmZvOworCWludCBjYXJkX2Jhc2UgPSBwcml2LT5jYXJkX2Jhc2U7CisKKwkvKiBSZXF1ZXN0IElSUSBpZiBub3QgYWxyZWFkeSB1c2VkIGJ5IG90aGVyIGNoYW5uZWwgKi8KKwlpZiAoIWluZm8tPmlycV91c2VkKSB7CisJCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgc2NjX2lzciwgMCwgImRtYXNjYyIsIGluZm8pKSB7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCX0KKwlpbmZvLT5pcnFfdXNlZCsrOworCisJLyogUmVxdWVzdCBETUEgaWYgcmVxdWlyZWQgKi8KKwlpZiAocHJpdi0+cGFyYW0uZG1hID49IDApIHsKKwkJaWYgKHJlcXVlc3RfZG1hKHByaXYtPnBhcmFtLmRtYSwgImRtYXNjYyIpKSB7CisJCQlpZiAoLS1pbmZvLT5pcnFfdXNlZCA9PSAwKQorCQkJCWZyZWVfaXJxKGRldi0+aXJxLCBpbmZvKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9IGVsc2UgeworCQkJdW5zaWduZWQgbG9uZyBmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisJCQljbGVhcl9kbWFfZmYocHJpdi0+cGFyYW0uZG1hKTsKKwkJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCQl9CisJfQorCisJLyogSW5pdGlhbGl6ZSBsb2NhbCB2YXJpYWJsZXMgKi8KKwlwcml2LT5yeF9wdHIgPSAwOworCXByaXYtPnJ4X292ZXIgPSAwOworCXByaXYtPnJ4X2hlYWQgPSBwcml2LT5yeF90YWlsID0gcHJpdi0+cnhfY291bnQgPSAwOworCXByaXYtPnN0YXRlID0gSURMRTsKKwlwcml2LT50eF9oZWFkID0gcHJpdi0+dHhfdGFpbCA9IHByaXYtPnR4X2NvdW50ID0gMDsKKwlwcml2LT50eF9wdHIgPSAwOworCisJLyogUmVzZXQgY2hhbm5lbCAqLworCXdyaXRlX3NjYyhwcml2LCBSOSwgKHByaXYtPmNoYW5uZWwgPyBDSFJCIDogQ0hSQSkgfCBNSUUgfCBOVik7CisJLyogWDEgY2xvY2ssIFNETEMgbW9kZSAqLworCXdyaXRlX3NjYyhwcml2LCBSNCwgU0RMQyB8IFgxQ0xLKTsKKwkvKiBETUEgKi8KKwl3cml0ZV9zY2MocHJpdiwgUjEsIEVYVF9JTlRfRU5BQiB8IFdUX0ZOX1JEWUZOKTsKKwkvKiA4IGJpdCBSWCBjaGFyLCBSWCBkaXNhYmxlICovCisJd3JpdGVfc2NjKHByaXYsIFIzLCBSeDgpOworCS8qIDggYml0IFRYIGNoYXIsIFRYIGRpc2FibGUgKi8KKwl3cml0ZV9zY2MocHJpdiwgUjUsIFR4OCk7CisJLyogU0RMQyBhZGRyZXNzIGZpZWxkICovCisJd3JpdGVfc2NjKHByaXYsIFI2LCAwKTsKKwkvKiBTRExDIGZsYWcgKi8KKwl3cml0ZV9zY2MocHJpdiwgUjcsIEZMQUcpOworCXN3aXRjaCAocHJpdi0+Y2hpcCkgeworCWNhc2UgWjg1QzMwOgorCQkvKiBTZWxlY3QgV1I3JyAqLworCQl3cml0ZV9zY2MocHJpdiwgUjE1LCBTSERMQ0UpOworCQkvKiBBdXRvIEVPTSByZXNldCAqLworCQl3cml0ZV9zY2MocHJpdiwgUjcsIEFVVE9FT00pOworCQl3cml0ZV9zY2MocHJpdiwgUjE1LCAwKTsKKwkJYnJlYWs7CisJY2FzZSBaODUyMzA6CisJCS8qIFNlbGVjdCBXUjcnICovCisJCXdyaXRlX3NjYyhwcml2LCBSMTUsIFNIRExDRSk7CisJCS8qIFRoZSBmb2xsb3dpbmcgYml0cyBhcmUgc2V0IChzZWUgMi41LjIuMSk6CisJCSAgIC0gQXV0b21hdGljIEVPTSByZXNldAorCQkgICAtIEludGVycnVwdCByZXF1ZXN0IGlmIFJYIEZJRk8gaXMgaGFsZiBmdWxsCisJCSAgIFRoaXMgYml0IHNob3VsZCBiZSBpZ25vcmVkIGluIERNQSBtb2RlIChhY2NvcmRpbmcgdG8gdGhlCisJCSAgIGRvY3VtZW50YXRpb24pLCBidXQgYWN0dWFsbHkgaXNuJ3QuIFRoZSByZWNlaXZlciBkb2Vzbid0IHdvcmsgaWYKKwkJICAgaXQgaXMgc2V0LiBUaHVzLCB3ZSBoYXZlIHRvIGNsZWFyIGl0IGluIERNQSBtb2RlLgorCQkgICAtIEludGVycnVwdC9ETUEgcmVxdWVzdCBpZiBUWCBGSUZPIGlzIGNvbXBsZXRlbHkgZW1wdHkKKwkJICAgYSkgSWYgc2V0LCB0aGUgRVNDQyBiZWhhdmVzIGFzIGlmIGl0IGhhZCBubyBUWCBGSUZPIChaODVDMzAKKwkJICAgY29tcGF0aWJpbGl0eSkuCisJCSAgIGIpIElmIGNsZWFyZWQsIERNQSByZXF1ZXN0cyBtYXkgZm9sbG93IGVhY2ggb3RoZXIgdmVyeSBxdWlja2x5LAorCQkgICBmaWxsaW5nIHVwIHRoZSBUWCBGSUZPLgorCQkgICBBZHZhbnRhZ2U6IFRYIHdvcmtzIGV2ZW4gaW4gY2FzZSBvZiBoaWdoIGJ1cyBsYXRlbmN5LgorCQkgICBEaXNhZHZhbnRhZ2U6IEVkZ2UtdHJpZ2dlcmVkIERNQSByZXF1ZXN0IGNpcmN1aXRyeSBtYXkgbWlzcworCQkgICBhIHJlcXVlc3QuIE5vIG1vcmUgZGF0YSBpcyBkZWxpdmVyZWQsIHJlc3VsdGluZworCQkgICBpbiBhIFRYIEZJRk8gdW5kZXJydW4uCisJCSAgIEJvdGggUEkyIGFuZCBTNVNDQy9ETUEgc2VlbSB0byB3b3JrIGZpbmUgd2l0aCBUWEZJRk9FIGNsZWFyZWQuCisJCSAgIFRoZSBQYWNrZVR3aW4gZG9lc24ndC4gSSBkb24ndCBrbm93IGFib3V0IHRoZSBQSSwgYnV0IGxldCdzCisJCSAgIGFzc3VtZSBpdCBiZWhhdmVzIGxpa2UgdGhlIFBJMi4KKwkJICovCisJCWlmIChwcml2LT5wYXJhbS5kbWEgPj0gMCkgeworCQkJaWYgKHByaXYtPnR5cGUgPT0gVFlQRV9UV0lOKQorCQkJCXdyaXRlX3NjYyhwcml2LCBSNywgQVVUT0VPTSB8IFRYRklGT0UpOworCQkJZWxzZQorCQkJCXdyaXRlX3NjYyhwcml2LCBSNywgQVVUT0VPTSk7CisJCX0gZWxzZSB7CisJCQl3cml0ZV9zY2MocHJpdiwgUjcsIEFVVE9FT00gfCBSWEZJRk9IKTsKKwkJfQorCQl3cml0ZV9zY2MocHJpdiwgUjE1LCAwKTsKKwkJYnJlYWs7CisJfQorCS8qIFByZXNldCBDUkMsIE5SWihJKSBlbmNvZGluZyAqLworCXdyaXRlX3NjYyhwcml2LCBSMTAsIENSQ1BTIHwgKHByaXYtPnBhcmFtLm5yemkgPyBOUlpJIDogTlJaKSk7CisKKwkvKiBDb25maWd1cmUgYmF1ZCByYXRlIGdlbmVyYXRvciAqLworCWlmIChwcml2LT5wYXJhbS5icmdfdGMgPj0gMCkgeworCQkvKiBQcm9ncmFtIEJSIGdlbmVyYXRvciAqLworCQl3cml0ZV9zY2MocHJpdiwgUjEyLCBwcml2LT5wYXJhbS5icmdfdGMgJiAweEZGKTsKKwkJd3JpdGVfc2NjKHByaXYsIFIxMywgKHByaXYtPnBhcmFtLmJyZ190YyA+PiA4KSAmIDB4RkYpOworCQkvKiBCUkcgc291cmNlID0gU1lTIENMSzsgZW5hYmxlIEJSRzsgRFRSIFJFUSBmdW5jdGlvbiAocmVxdWlyZWQgYnkKKwkJICAgUGFja2VUd2luLCBub3QgY29ubmVjdGVkIG9uIHRoZSBQSTIpOyBzZXQgRFBMTCBzb3VyY2UgdG8gQlJHICovCisJCXdyaXRlX3NjYyhwcml2LCBSMTQsIFNTQlIgfCBEVFJSRVEgfCBCUlNSQyB8IEJSRU5BQkwpOworCQkvKiBFbmFibGUgRFBMTCAqLworCQl3cml0ZV9zY2MocHJpdiwgUjE0LCBTRUFSQ0ggfCBEVFJSRVEgfCBCUlNSQyB8IEJSRU5BQkwpOworCX0gZWxzZSB7CisJCS8qIERpc2FibGUgQlIgZ2VuZXJhdG9yICovCisJCXdyaXRlX3NjYyhwcml2LCBSMTQsIERUUlJFUSB8IEJSU1JDKTsKKwl9CisKKwkvKiBDb25maWd1cmUgY2xvY2tzICovCisJaWYgKHByaXYtPnR5cGUgPT0gVFlQRV9UV0lOKSB7CisJCS8qIERpc2FibGUgZXh0ZXJuYWwgVFggY2xvY2sgcmVjZWl2ZXIgKi8KKwkJb3V0YigoaW5mby0+dHdpbl9zZXJpYWxfY2ZnICY9CisJCSAgICAgIH4ocHJpdi0+Y2hhbm5lbCA/IFRXSU5fRVhUQ0xLQiA6IFRXSU5fRVhUQ0xLQSkpLAorCQkgICAgIGNhcmRfYmFzZSArIFRXSU5fU0VSSUFMX0NGRyk7CisJfQorCXdyaXRlX3NjYyhwcml2LCBSMTEsIHByaXYtPnBhcmFtLmNsb2Nrcyk7CisJaWYgKChwcml2LT50eXBlID09IFRZUEVfVFdJTikgJiYgIShwcml2LT5wYXJhbS5jbG9ja3MgJiBUUnhDT0kpKSB7CisJCS8qIEVuYWJsZSBleHRlcm5hbCBUWCBjbG9jayByZWNlaXZlciAqLworCQlvdXRiKChpbmZvLT50d2luX3NlcmlhbF9jZmcgfD0KKwkJICAgICAgKHByaXYtPmNoYW5uZWwgPyBUV0lOX0VYVENMS0IgOiBUV0lOX0VYVENMS0EpKSwKKwkJICAgICBjYXJkX2Jhc2UgKyBUV0lOX1NFUklBTF9DRkcpOworCX0KKworCS8qIENvbmZpZ3VyZSBQYWNrZVR3aW4gKi8KKwlpZiAocHJpdi0+dHlwZSA9PSBUWVBFX1RXSU4pIHsKKwkJLyogQXNzZXJ0IERUUiwgZW5hYmxlIGludGVycnVwdHMgKi8KKwkJb3V0YigoaW5mby0+dHdpbl9zZXJpYWxfY2ZnIHw9IFRXSU5fRUkgfAorCQkgICAgICAocHJpdi0+Y2hhbm5lbCA/IFRXSU5fRFRSQl9PTiA6IFRXSU5fRFRSQV9PTikpLAorCQkgICAgIGNhcmRfYmFzZSArIFRXSU5fU0VSSUFMX0NGRyk7CisJfQorCisJLyogUmVhZCBjdXJyZW50IHN0YXR1cyAqLworCXByaXYtPnJyMCA9IHJlYWRfc2NjKHByaXYsIFIwKTsKKwkvKiBFbmFibGUgRENEIGludGVycnVwdCAqLworCXdyaXRlX3NjYyhwcml2LCBSMTUsIERDRElFKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHNjY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzY2NfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2NjX2luZm8gKmluZm8gPSBwcml2LT5pbmZvOworCWludCBjYXJkX2Jhc2UgPSBwcml2LT5jYXJkX2Jhc2U7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAocHJpdi0+dHlwZSA9PSBUWVBFX1RXSU4pIHsKKwkJLyogRHJvcCBEVFIgKi8KKwkJb3V0YigoaW5mby0+dHdpbl9zZXJpYWxfY2ZnICY9CisJCSAgICAgIChwcml2LT5jaGFubmVsID8gflRXSU5fRFRSQl9PTiA6IH5UV0lOX0RUUkFfT04pKSwKKwkJICAgICBjYXJkX2Jhc2UgKyBUV0lOX1NFUklBTF9DRkcpOworCX0KKworCS8qIFJlc2V0IGNoYW5uZWwsIGZyZWUgRE1BIGFuZCBJUlEgKi8KKwl3cml0ZV9zY2MocHJpdiwgUjksIChwcml2LT5jaGFubmVsID8gQ0hSQiA6IENIUkEpIHwgTUlFIHwgTlYpOworCWlmIChwcml2LT5wYXJhbS5kbWEgPj0gMCkgeworCQlpZiAocHJpdi0+dHlwZSA9PSBUWVBFX1RXSU4pCisJCQlvdXRiKDAsIGNhcmRfYmFzZSArIFRXSU5fRE1BX0NGRyk7CisJCWZyZWVfZG1hKHByaXYtPnBhcmFtLmRtYSk7CisJfQorCWlmICgtLWluZm8tPmlycV91c2VkID09IDApCisJCWZyZWVfaXJxKGRldi0+aXJxLCBpbmZvKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc2NjX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBzY2NfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR1NDQ1BBUkFNOgorCQlpZiAoY29weV90b191c2VyCisJCSAgICAoaWZyLT5pZnJfZGF0YSwgJnByaXYtPnBhcmFtLAorCQkgICAgIHNpemVvZihzdHJ1Y3Qgc2NjX3BhcmFtKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJY2FzZSBTSU9DU1NDQ1BBUkFNOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQkJcmV0dXJuIC1FQUdBSU47CisJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkgICAgKCZwcml2LT5wYXJhbSwgaWZyLT5pZnJfZGF0YSwKKwkJICAgICBzaXplb2Yoc3RydWN0IHNjY19wYXJhbSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworCitzdGF0aWMgaW50IHNjY19zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzY2NfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJLyogVGVtcG9yYXJpbHkgc3RvcCB0aGUgc2NoZWR1bGVyIGZlZWRpbmcgdXMgcGFja2V0cyAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIFRyYW5zZmVyIGRhdGEgdG8gRE1BIGJ1ZmZlciAqLworCWkgPSBwcml2LT50eF9oZWFkOworCW1lbWNweShwcml2LT50eF9idWZbaV0sIHNrYi0+ZGF0YSArIDEsIHNrYi0+bGVuIC0gMSk7CisJcHJpdi0+dHhfbGVuW2ldID0gc2tiLT5sZW4gLSAxOworCisJLyogQ2xlYXIgaW50ZXJydXB0cyB3aGlsZSB3ZSB0b3VjaCBvdXIgY2lyY3VsYXIgYnVmZmVycyAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJpbmdfbG9jaywgZmxhZ3MpOworCS8qIE1vdmUgdGhlIHJpbmcgYnVmZmVyJ3MgaGVhZCAqLworCXByaXYtPnR4X2hlYWQgPSAoaSArIDEpICUgTlVNX1RYX0JVRjsKKwlwcml2LT50eF9jb3VudCsrOworCisJLyogSWYgd2UganVzdCBmaWxsZWQgdXAgdGhlIGxhc3QgYnVmZmVyLCBsZWF2ZSBxdWV1ZSBzdG9wcGVkLgorCSAgIFRoZSBoaWdoZXIgbGF5ZXJzIG11c3Qgd2FpdCB1bnRpbCB3ZSBoYXZlIGEgRE1BIGJ1ZmZlcgorCSAgIHRvIGFjY2VwdCB0aGUgZGF0YS4gKi8KKwlpZiAocHJpdi0+dHhfY291bnQgPCBOVU1fVFhfQlVGKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwkvKiBTZXQgbmV3IFRYIHN0YXRlICovCisJaWYgKHByaXYtPnN0YXRlID09IElETEUpIHsKKwkJLyogQXNzZXJ0IFJUUywgc3RhcnQgdGltZXIgKi8KKwkJcHJpdi0+c3RhdGUgPSBUWF9IRUFEOworCQlwcml2LT50eF9zdGFydCA9IGppZmZpZXM7CisJCXdyaXRlX3NjYyhwcml2LCBSNSwgVHhDUkNfRU5BQiB8IFJUUyB8IFR4RU5BQiB8IFR4OCk7CisJCXdyaXRlX3NjYyhwcml2LCBSMTUsIDApOworCQlzdGFydF90aW1lcihwcml2LCBwcml2LT5wYXJhbS50eGRlbGF5LCAwKTsKKwl9CisKKwkvKiBUdXJuIGludGVycnVwdHMgYmFjayBvbiBhbmQgZnJlZSBidWZmZXIgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yaW5nX2xvY2ssIGZsYWdzKTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNjY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisKKwlyZXR1cm4gJnByaXYtPnN0YXRzOworfQorCisKK3N0YXRpYyBpbnQgc2NjX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpzYSkKK3sKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgKChzdHJ1Y3Qgc29ja2FkZHIgKikgc2EpLT5zYV9kYXRhLAorCSAgICAgICBkZXYtPmFkZHJfbGVuKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgdHhfb24oc3RydWN0IHNjY19wcml2ICpwcml2KQoreworCWludCBpLCBuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocHJpdi0+cGFyYW0uZG1hID49IDApIHsKKwkJbiA9IChwcml2LT5jaGlwID09IFo4NTIzMCkgPyAzIDogMTsKKwkJLyogUHJvZ3JhbSBETUEgY29udHJvbGxlciAqLworCQlmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisJCXNldF9kbWFfbW9kZShwcml2LT5wYXJhbS5kbWEsIERNQV9NT0RFX1dSSVRFKTsKKwkJc2V0X2RtYV9hZGRyKHByaXYtPnBhcmFtLmRtYSwKKwkJCSAgICAgKGludCkgcHJpdi0+dHhfYnVmW3ByaXYtPnR4X3RhaWxdICsgbik7CisJCXNldF9kbWFfY291bnQocHJpdi0+cGFyYW0uZG1hLAorCQkJICAgICAgcHJpdi0+dHhfbGVuW3ByaXYtPnR4X3RhaWxdIC0gbik7CisJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCQkvKiBFbmFibGUgVFggdW5kZXJydW4gaW50ZXJydXB0ICovCisJCXdyaXRlX3NjYyhwcml2LCBSMTUsIFR4VUlFKTsKKwkJLyogQ29uZmlndXJlIERSRVEgKi8KKwkJaWYgKHByaXYtPnR5cGUgPT0gVFlQRV9UV0lOKQorCQkJb3V0YigocHJpdi0+cGFyYW0uZG1hID09CisJCQkgICAgICAxKSA/IFRXSU5fRE1BX0hEWF9UMSA6IFRXSU5fRE1BX0hEWF9UMywKKwkJCSAgICAgcHJpdi0+Y2FyZF9iYXNlICsgVFdJTl9ETUFfQ0ZHKTsKKwkJZWxzZQorCQkJd3JpdGVfc2NjKHByaXYsIFIxLAorCQkJCSAgRVhUX0lOVF9FTkFCIHwgV1RfRk5fUkRZRk4gfAorCQkJCSAgV1RfUkRZX0VOQUIpOworCQkvKiBXcml0ZSBmaXJzdCBieXRlKHMpICovCisJCXNwaW5fbG9ja19pcnFzYXZlKHByaXYtPnJlZ2lzdGVyX2xvY2ssIGZsYWdzKTsKKwkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJCXdyaXRlX3NjY19kYXRhKHByaXYsCisJCQkJICAgICAgIHByaXYtPnR4X2J1Zltwcml2LT50eF90YWlsXVtpXSwgMSk7CisJCWVuYWJsZV9kbWEocHJpdi0+cGFyYW0uZG1hKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShwcml2LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJd3JpdGVfc2NjKHByaXYsIFIxNSwgVHhVSUUpOworCQl3cml0ZV9zY2MocHJpdiwgUjEsCisJCQkgIEVYVF9JTlRfRU5BQiB8IFdUX0ZOX1JEWUZOIHwgVHhJTlRfRU5BQik7CisJCXR4X2lzcihwcml2KTsKKwl9CisJLyogUmVzZXQgRU9NIGxhdGNoIGlmIHdlIGRvIG5vdCBoYXZlIHRoZSBBVVRPRU9NIGZlYXR1cmUgKi8KKwlpZiAocHJpdi0+Y2hpcCA9PSBaODUzMCkKKwkJd3JpdGVfc2NjKHByaXYsIFIwLCBSRVNfRU9NX0wpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCByeF9vbihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIENsZWFyIFJYIEZJRk8gKi8KKwl3aGlsZSAocmVhZF9zY2MocHJpdiwgUjApICYgUnhfQ0hfQVYpCisJCXJlYWRfc2NjX2RhdGEocHJpdik7CisJcHJpdi0+cnhfb3ZlciA9IDA7CisJaWYgKHByaXYtPnBhcmFtLmRtYSA+PSAwKSB7CisJCS8qIFByb2dyYW0gRE1BIGNvbnRyb2xsZXIgKi8KKwkJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCQlzZXRfZG1hX21vZGUocHJpdi0+cGFyYW0uZG1hLCBETUFfTU9ERV9SRUFEKTsKKwkJc2V0X2RtYV9hZGRyKHByaXYtPnBhcmFtLmRtYSwKKwkJCSAgICAgKGludCkgcHJpdi0+cnhfYnVmW3ByaXYtPnJ4X2hlYWRdKTsKKwkJc2V0X2RtYV9jb3VudChwcml2LT5wYXJhbS5kbWEsIEJVRl9TSVpFKTsKKwkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJCWVuYWJsZV9kbWEocHJpdi0+cGFyYW0uZG1hKTsKKwkJLyogQ29uZmlndXJlIFBhY2tlVHdpbiBETUEgKi8KKwkJaWYgKHByaXYtPnR5cGUgPT0gVFlQRV9UV0lOKSB7CisJCQlvdXRiKChwcml2LT5wYXJhbS5kbWEgPT0KKwkJCSAgICAgIDEpID8gVFdJTl9ETUFfSERYX1IxIDogVFdJTl9ETUFfSERYX1IzLAorCQkJICAgICBwcml2LT5jYXJkX2Jhc2UgKyBUV0lOX0RNQV9DRkcpOworCQl9CisJCS8qIFNwLiBjb25kLiBpbnRyLiBvbmx5LCBleHQgaW50IGVuYWJsZSwgUlggRE1BIGVuYWJsZSAqLworCQl3cml0ZV9zY2MocHJpdiwgUjEsIEVYVF9JTlRfRU5BQiB8IElOVF9FUlJfUnggfAorCQkJICBXVF9SRFlfUlQgfCBXVF9GTl9SRFlGTiB8IFdUX1JEWV9FTkFCKTsKKwl9IGVsc2UgeworCQkvKiBSZXNldCBjdXJyZW50IGZyYW1lICovCisJCXByaXYtPnJ4X3B0ciA9IDA7CisJCS8qIEludHIuIG9uIGFsbCBSeCBjaGFyYWN0ZXJzIGFuZCBTcC4gY29uZC4sIGV4dCBpbnQgZW5hYmxlICovCisJCXdyaXRlX3NjYyhwcml2LCBSMSwgRVhUX0lOVF9FTkFCIHwgSU5UX0FMTF9SeCB8IFdUX1JEWV9SVCB8CisJCQkgIFdUX0ZOX1JEWUZOKTsKKwl9CisJd3JpdGVfc2NjKHByaXYsIFIwLCBFUlJfUkVTKTsKKwl3cml0ZV9zY2MocHJpdiwgUjMsIFJ4RU5BQkxFIHwgUng4IHwgUnhDUkNfRU5BQik7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHJ4X29mZihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpCit7CisJLyogRGlzYWJsZSByZWNlaXZlciAqLworCXdyaXRlX3NjYyhwcml2LCBSMywgUng4KTsKKwkvKiBEaXNhYmxlIERSRVEgLyBSWCBpbnRlcnJ1cHQgKi8KKwlpZiAocHJpdi0+cGFyYW0uZG1hID49IDAgJiYgcHJpdi0+dHlwZSA9PSBUWVBFX1RXSU4pCisJCW91dGIoMCwgcHJpdi0+Y2FyZF9iYXNlICsgVFdJTl9ETUFfQ0ZHKTsKKwllbHNlCisJCXdyaXRlX3NjYyhwcml2LCBSMSwgRVhUX0lOVF9FTkFCIHwgV1RfRk5fUkRZRk4pOworCS8qIERpc2FibGUgRE1BICovCisJaWYgKHByaXYtPnBhcmFtLmRtYSA+PSAwKQorCQlkaXNhYmxlX2RtYShwcml2LT5wYXJhbS5kbWEpOworfQorCisKK3N0YXRpYyB2b2lkIHN0YXJ0X3RpbWVyKHN0cnVjdCBzY2NfcHJpdiAqcHJpdiwgaW50IHQsIGludCByMTUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW91dGIocHJpdi0+dG1yX21vZGUsIHByaXYtPnRtcl9jdHJsKTsKKwlpZiAodCA9PSAwKSB7CisJCXRtX2lzcihwcml2KTsKKwl9IGVsc2UgaWYgKHQgPiAwKSB7CisJCXNhdmVfZmxhZ3MoZmxhZ3MpOworCQljbGkoKTsKKwkJb3V0Yih0ICYgMHhGRiwgcHJpdi0+dG1yX2NudCk7CisJCW91dGIoKHQgPj4gOCkgJiAweEZGLCBwcml2LT50bXJfY250KTsKKwkJaWYgKHByaXYtPnR5cGUgIT0gVFlQRV9UV0lOKSB7CisJCQl3cml0ZV9zY2MocHJpdiwgUjE1LCByMTUgfCBDVFNJRSk7CisJCQlwcml2LT5ycjAgfD0gQ1RTOworCQl9CisJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCX0KK30KKworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcmFuZG9tKHZvaWQpCit7CisJLyogU2VlICJOdW1lcmljYWwgUmVjaXBlcyBpbiBDIiwgc2Vjb25kIGVkaXRpb24sIHAuIDI4NCAqLworCXJhbmQgPSByYW5kICogMTY2NDUyNUwgKyAxMDEzOTA0MjIzTDsKKwlyZXR1cm4gKHVuc2lnbmVkIGNoYXIpIChyYW5kID4+IDI0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHo4NTMwX2lzcihzdHJ1Y3Qgc2NjX2luZm8gKmluZm8pCit7CisJaW50IGlzLCBpID0gMTAwOworCisJd2hpbGUgKChpcyA9IHJlYWRfc2NjKCZpbmZvLT5wcml2WzBdLCBSMykpICYmIGktLSkgeworCQlpZiAoaXMgJiBDSEFSeElQKSB7CisJCQlyeF9pc3IoJmluZm8tPnByaXZbMF0pOworCQl9IGVsc2UgaWYgKGlzICYgQ0hBVHhJUCkgeworCQkJdHhfaXNyKCZpbmZvLT5wcml2WzBdKTsKKwkJfSBlbHNlIGlmIChpcyAmIENIQUVYVCkgeworCQkJZXNfaXNyKCZpbmZvLT5wcml2WzBdKTsKKwkJfSBlbHNlIGlmIChpcyAmIENIQlJ4SVApIHsKKwkJCXJ4X2lzcigmaW5mby0+cHJpdlsxXSk7CisJCX0gZWxzZSBpZiAoaXMgJiBDSEJUeElQKSB7CisJCQl0eF9pc3IoJmluZm8tPnByaXZbMV0pOworCQl9IGVsc2UgeworCQkJZXNfaXNyKCZpbmZvLT5wcml2WzFdKTsKKwkJfQorCQl3cml0ZV9zY2MoJmluZm8tPnByaXZbMF0sIFIwLCBSRVNfSF9JVVMpOworCQlpKys7CisJfQorCWlmIChpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImRtYXNjYzogc3R1Y2sgaW4gSVNSIHdpdGggUlIzPTB4JTAyeC5cbiIsCisJCSAgICAgICBpcyk7CisJfQorCS8qIE9rLCBubyBpbnRlcnJ1cHRzIHBlbmRpbmcgZnJvbSB0aGlzIDg1MzAuIFRoZSBJTlQgbGluZSBzaG91bGQKKwkgICBiZSBpbmFjdGl2ZSBub3cuICovCit9CisKKworc3RhdGljIGlycXJldHVybl90IHNjY19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3Qgc2NjX2luZm8gKmluZm8gPSBkZXZfaWQ7CisKKwlzcGluX2xvY2soaW5mby0+cHJpdlswXS5yZWdpc3Rlcl9sb2NrKTsKKwkvKiBBdCB0aGlzIHBvaW50IGludGVycnVwdHMgYXJlIGVuYWJsZWQsIGFuZCB0aGUgaW50ZXJydXB0IHVuZGVyIHNlcnZpY2UKKwkgICBpcyBhbHJlYWR5IGFja25vd2xlZGdlZCwgYnV0IG1hc2tlZCBvZmYuCisKKwkgICBJbnRlcnJ1cHQgcHJvY2Vzc2luZzogV2UgbG9vcCB1bnRpbCB3ZSBrbm93IHRoYXQgdGhlIElSUSBsaW5lIGlzCisJICAgbG93LiBJZiBhbm90aGVyIHBvc2l0aXZlIGVkZ2Ugb2NjdXJzIGFmdGVyd2FyZHMgZHVyaW5nIHRoZSBJU1IsCisJICAgYW5vdGhlciBpbnRlcnJ1cHQgd2lsbCBiZSB0cmlnZ2VyZWQgYnkgdGhlIGludGVycnVwdCBjb250cm9sbGVyCisJICAgYXMgc29vbiBhcyB0aGUgSVJRIGxldmVsIGlzIGVuYWJsZWQgYWdhaW4gKHNlZSBhc20vaXJxLmgpLgorCisJICAgQm90dG9tLWhhbGYgaGFuZGxlcnMgd2lsbCBiZSBwcm9jZXNzZWQgYWZ0ZXIgc2NjX2lzcigpLiBUaGlzIGlzCisJICAgaW1wb3J0YW50LCBzaW5jZSB3ZSBvbmx5IGhhdmUgc21hbGwgcmluZ2J1ZmZlcnMgYW5kIHdhbnQgbmV3IGRhdGEKKwkgICB0byBiZSBmZXRjaGVkL2RlbGl2ZXJlZCBpbW1lZGlhdGVseS4gKi8KKworCWlmIChpbmZvLT5wcml2WzBdLnR5cGUgPT0gVFlQRV9UV0lOKSB7CisJCWludCBpcywgY2FyZF9iYXNlID0gaW5mby0+cHJpdlswXS5jYXJkX2Jhc2U7CisJCXdoaWxlICgoaXMgPSB+aW5iKGNhcmRfYmFzZSArIFRXSU5fSU5UX1JFRykpICYKKwkJICAgICAgIFRXSU5fSU5UX01TSykgeworCQkJaWYgKGlzICYgVFdJTl9TQ0NfTVNLKSB7CisJCQkJejg1MzBfaXNyKGluZm8pOworCQkJfSBlbHNlIGlmIChpcyAmIFRXSU5fVE1SMV9NU0spIHsKKwkJCQlpbmIoY2FyZF9iYXNlICsgVFdJTl9DTFJfVE1SMSk7CisJCQkJdG1faXNyKCZpbmZvLT5wcml2WzBdKTsKKwkJCX0gZWxzZSB7CisJCQkJaW5iKGNhcmRfYmFzZSArIFRXSU5fQ0xSX1RNUjIpOworCQkJCXRtX2lzcigmaW5mby0+cHJpdlsxXSk7CisJCQl9CisJCX0KKwl9IGVsc2UKKwkJejg1MzBfaXNyKGluZm8pOworCXNwaW5fdW5sb2NrKGluZm8tPnByaXZbMF0ucmVnaXN0ZXJfbG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKK3N0YXRpYyB2b2lkIHJ4X2lzcihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpCit7CisJaWYgKHByaXYtPnBhcmFtLmRtYSA+PSAwKSB7CisJCS8qIENoZWNrIHNwZWNpYWwgY29uZGl0aW9uIGFuZCBwZXJmb3JtIGVycm9yIHJlc2V0LiBTZWUgMi40LjcuNS4gKi8KKwkJc3BlY2lhbF9jb25kaXRpb24ocHJpdiwgcmVhZF9zY2MocHJpdiwgUjEpKTsKKwkJd3JpdGVfc2NjKHByaXYsIFIwLCBFUlJfUkVTKTsKKwl9IGVsc2UgeworCQkvKiBDaGVjayBzcGVjaWFsIGNvbmRpdGlvbiBmb3IgZWFjaCBjaGFyYWN0ZXIuIEVycm9yIHJlc2V0IG5vdCBuZWNlc3NhcnkuCisJCSAgIFNhbWUgYWxnb3JpdGhtIGZvciBTQ0MgYW5kIEVTQ0MuIFNlZSAyLjQuNy4xIGFuZCAyLjQuNy40LiAqLworCQlpbnQgcmM7CisJCXdoaWxlIChyZWFkX3NjYyhwcml2LCBSMCkgJiBSeF9DSF9BVikgeworCQkJcmMgPSByZWFkX3NjYyhwcml2LCBSMSk7CisJCQlpZiAocHJpdi0+cnhfcHRyIDwgQlVGX1NJWkUpCisJCQkJcHJpdi0+cnhfYnVmW3ByaXYtPnJ4X2hlYWRdW3ByaXYtPgorCQkJCQkJCSAgICByeF9wdHIrK10gPQorCQkJCSAgICByZWFkX3NjY19kYXRhKHByaXYpOworCQkJZWxzZSB7CisJCQkJcHJpdi0+cnhfb3ZlciA9IDI7CisJCQkJcmVhZF9zY2NfZGF0YShwcml2KTsKKwkJCX0KKwkJCXNwZWNpYWxfY29uZGl0aW9uKHByaXYsIHJjKTsKKwkJfQorCX0KK30KKworCitzdGF0aWMgdm9pZCBzcGVjaWFsX2NvbmRpdGlvbihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYsIGludCByYykKK3sKKwlpbnQgY2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFNlZSBGaWd1cmUgMi0xNS4gT25seSBvdmVycnVuIGFuZCBFT0YgbmVlZCB0byBiZSBjaGVja2VkLiAqLworCisJaWYgKHJjICYgUnhfT1ZSKSB7CisJCS8qIFJlY2VpdmVyIG92ZXJydW4gKi8KKwkJcHJpdi0+cnhfb3ZlciA9IDE7CisJCWlmIChwcml2LT5wYXJhbS5kbWEgPCAwKQorCQkJd3JpdGVfc2NjKHByaXYsIFIwLCBFUlJfUkVTKTsKKwl9IGVsc2UgaWYgKHJjICYgRU5EX0ZSKSB7CisJCS8qIEVuZCBvZiBmcmFtZS4gR2V0IGJ5dGUgY291bnQgKi8KKwkJaWYgKHByaXYtPnBhcmFtLmRtYSA+PSAwKSB7CisJCQlmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisJCQljYiA9IEJVRl9TSVpFIC0gZ2V0X2RtYV9yZXNpZHVlKHByaXYtPnBhcmFtLmRtYSkgLQorCQkJICAgIDI7CisJCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCWNiID0gcHJpdi0+cnhfcHRyIC0gMjsKKwkJfQorCQlpZiAocHJpdi0+cnhfb3ZlcikgeworCQkJLyogV2UgaGFkIGFuIG92ZXJydW4gKi8KKwkJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKHByaXYtPnJ4X292ZXIgPT0gMikKKwkJCQlwcml2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQllbHNlCisJCQkJcHJpdi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCXByaXYtPnJ4X292ZXIgPSAwOworCQl9IGVsc2UgaWYgKHJjICYgQ1JDX0VSUikgeworCQkJLyogQ291bnQgaW52YWxpZCBDUkMgb25seSBpZiBwYWNrZXQgbGVuZ3RoID49IG1pbmltdW0gKi8KKwkJCWlmIChjYiA+PSAxNSkgeworCQkJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCXByaXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChjYiA+PSAxNSkgeworCQkJCWlmIChwcml2LT5yeF9jb3VudCA8IE5VTV9SWF9CVUYgLSAxKSB7CisJCQkJCS8qIFB1dCBnb29kIGZyYW1lIGluIEZJRk8gKi8KKwkJCQkJcHJpdi0+cnhfbGVuW3ByaXYtPnJ4X2hlYWRdID0gY2I7CisJCQkJCXByaXYtPnJ4X2hlYWQgPQorCQkJCQkgICAgKHByaXYtPnJ4X2hlYWQgKworCQkJCQkgICAgIDEpICUgTlVNX1JYX0JVRjsKKwkJCQkJcHJpdi0+cnhfY291bnQrKzsKKwkJCQkJc2NoZWR1bGVfd29yaygmcHJpdi0+cnhfd29yayk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCXByaXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQkJfQorCQkJfQorCQl9CisJCS8qIEdldCByZWFkeSBmb3IgbmV3IGZyYW1lICovCisJCWlmIChwcml2LT5wYXJhbS5kbWEgPj0gMCkgeworCQkJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCQkJc2V0X2RtYV9hZGRyKHByaXYtPnBhcmFtLmRtYSwKKwkJCQkgICAgIChpbnQpIHByaXYtPnJ4X2J1Zltwcml2LT5yeF9oZWFkXSk7CisJCQlzZXRfZG1hX2NvdW50KHByaXYtPnBhcmFtLmRtYSwgQlVGX1NJWkUpOworCQkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJCX0gZWxzZSB7CisJCQlwcml2LT5yeF9wdHIgPSAwOworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHJ4X2JoKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYgPSBhcmc7CisJaW50IGkgPSBwcml2LT5yeF90YWlsOworCWludCBjYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yaW5nX2xvY2ssIGZsYWdzKTsKKwl3aGlsZSAocHJpdi0+cnhfY291bnQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmluZ19sb2NrLCBmbGFncyk7CisJCWNiID0gcHJpdi0+cnhfbGVuW2ldOworCQkvKiBBbGxvY2F0ZSBidWZmZXIgKi8KKwkJc2tiID0gZGV2X2FsbG9jX3NrYihjYiArIDEpOworCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCS8qIERyb3AgcGFja2V0ICovCisJCQlwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCX0gZWxzZSB7CisJCQkvKiBGaWxsIGJ1ZmZlciAqLworCQkJZGF0YSA9IHNrYl9wdXQoc2tiLCBjYiArIDEpOworCQkJZGF0YVswXSA9IDA7CisJCQltZW1jcHkoJmRhdGFbMV0sIHByaXYtPnJ4X2J1ZltpXSwgY2IpOworCQkJc2tiLT5kZXYgPSBwcml2LT5kZXY7CisJCQlza2ItPnByb3RvY29sID0gbnRvaHMoRVRIX1BfQVgyNSk7CisJCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCQluZXRpZl9yeChza2IpOworCQkJcHJpdi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IGNiOworCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yaW5nX2xvY2ssIGZsYWdzKTsKKwkJLyogTW92ZSB0YWlsICovCisJCXByaXYtPnJ4X3RhaWwgPSBpID0gKGkgKyAxKSAlIE5VTV9SWF9CVUY7CisJCXByaXYtPnJ4X2NvdW50LS07CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJpbmdfbG9jaywgZmxhZ3MpOworfQorCisKK3N0YXRpYyB2b2lkIHR4X2lzcihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpCit7CisJaW50IGkgPSBwcml2LT50eF90YWlsLCBwID0gcHJpdi0+dHhfcHRyOworCisJLyogU3VzcGVuZCBUWCBpbnRlcnJ1cHRzIGlmIHdlIGRvbid0IHdhbnQgdG8gc2VuZCBhbnl0aGluZy4KKwkgICBTZWUgRmlndXJlIDItMjIuICovCisJaWYgKHAgPT0gcHJpdi0+dHhfbGVuW2ldKSB7CisJCXdyaXRlX3NjYyhwcml2LCBSMCwgUkVTX1R4X1ApOworCQlyZXR1cm47CisJfQorCisJLyogV3JpdGUgY2hhcmFjdGVycyAqLworCXdoaWxlICgocmVhZF9zY2MocHJpdiwgUjApICYgVHhfQlVGX0VNUCkgJiYgcCA8IHByaXYtPnR4X2xlbltpXSkgeworCQl3cml0ZV9zY2NfZGF0YShwcml2LCBwcml2LT50eF9idWZbaV1bcCsrXSwgMCk7CisJfQorCisJLyogUmVzZXQgRU9NIGxhdGNoIG9mIFo4NTMwICovCisJaWYgKCFwcml2LT50eF9wdHIgJiYgcCAmJiBwcml2LT5jaGlwID09IFo4NTMwKQorCQl3cml0ZV9zY2MocHJpdiwgUjAsIFJFU19FT01fTCk7CisKKwlwcml2LT50eF9wdHIgPSBwOworfQorCisKK3N0YXRpYyB2b2lkIGVzX2lzcihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpCit7CisJaW50IGksIHJyMCwgZHJyMCwgcmVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBSZWFkIHN0YXR1cywgcmVzZXQgaW50ZXJydXB0IGJpdCAob3BlbiBsYXRjaGVzKSAqLworCXJyMCA9IHJlYWRfc2NjKHByaXYsIFIwKTsKKwl3cml0ZV9zY2MocHJpdiwgUjAsIFJFU19FWFRfSU5UKTsKKwlkcnIwID0gcHJpdi0+cnIwIF4gcnIwOworCXByaXYtPnJyMCA9IHJyMDsKKworCS8qIFRyYW5zbWl0IHVuZGVycnVuICgyLjQuOS42KS4gV2UgY2FuJ3QgY2hlY2sgdGhlIFR4RU9NIGZsYWcsIHNpbmNlCisJICAgaXQgbWlnaHQgaGF2ZSBhbHJlYWR5IGJlZW4gY2xlYXJlZCBhZ2FpbiBieSBBVVRPRU9NLiAqLworCWlmIChwcml2LT5zdGF0ZSA9PSBUWF9EQVRBKSB7CisJCS8qIEdldCByZW1haW5pbmcgYnl0ZXMgKi8KKwkJaSA9IHByaXYtPnR4X3RhaWw7CisJCWlmIChwcml2LT5wYXJhbS5kbWEgPj0gMCkgeworCQkJZGlzYWJsZV9kbWEocHJpdi0+cGFyYW0uZG1hKTsKKwkJCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKKwkJCXJlcyA9IGdldF9kbWFfcmVzaWR1ZShwcml2LT5wYXJhbS5kbWEpOworCQkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJCX0gZWxzZSB7CisJCQlyZXMgPSBwcml2LT50eF9sZW5baV0gLSBwcml2LT50eF9wdHI7CisJCQlwcml2LT50eF9wdHIgPSAwOworCQl9CisJCS8qIERpc2FibGUgRFJFUSAvIFRYIGludGVycnVwdCAqLworCQlpZiAocHJpdi0+cGFyYW0uZG1hID49IDAgJiYgcHJpdi0+dHlwZSA9PSBUWVBFX1RXSU4pCisJCQlvdXRiKDAsIHByaXYtPmNhcmRfYmFzZSArIFRXSU5fRE1BX0NGRyk7CisJCWVsc2UKKwkJCXdyaXRlX3NjYyhwcml2LCBSMSwgRVhUX0lOVF9FTkFCIHwgV1RfRk5fUkRZRk4pOworCQlpZiAocmVzKSB7CisJCQkvKiBVcGRhdGUgcGFja2V0IHN0YXRpc3RpY3MgKi8KKwkJCXByaXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJcHJpdi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCS8qIE90aGVyIHVuZGVycnVuIGludGVycnVwdHMgbWF5IGFscmVhZHkgYmUgd2FpdGluZyAqLworCQkJd3JpdGVfc2NjKHByaXYsIFIwLCBSRVNfRVhUX0lOVCk7CisJCQl3cml0ZV9zY2MocHJpdiwgUjAsIFJFU19FWFRfSU5UKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFVwZGF0ZSBwYWNrZXQgc3RhdGlzdGljcyAqLworCQkJcHJpdi0+c3RhdHMudHhfcGFja2V0cysrOworCQkJcHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gcHJpdi0+dHhfbGVuW2ldOworCQkJLyogUmVtb3ZlIGZyYW1lIGZyb20gRklGTyAqLworCQkJcHJpdi0+dHhfdGFpbCA9IChpICsgMSkgJSBOVU1fVFhfQlVGOworCQkJcHJpdi0+dHhfY291bnQtLTsKKwkJCS8qIEluZm9ybSB1cHBlciBsYXllcnMgKi8KKwkJCW5ldGlmX3dha2VfcXVldWUocHJpdi0+ZGV2KTsKKwkJfQorCQkvKiBTd2l0Y2ggc3RhdGUgKi8KKwkJd3JpdGVfc2NjKHByaXYsIFIxNSwgMCk7CisJCWlmIChwcml2LT50eF9jb3VudCAmJgorCQkgICAgKGppZmZpZXMgLSBwcml2LT50eF9zdGFydCkgPCBwcml2LT5wYXJhbS50eHRpbWVvdXQpIHsKKwkJCXByaXYtPnN0YXRlID0gVFhfUEFVU0U7CisJCQlzdGFydF90aW1lcihwcml2LCBwcml2LT5wYXJhbS50eHBhdXNlLCAwKTsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPnN0YXRlID0gVFhfVEFJTDsKKwkJCXN0YXJ0X3RpbWVyKHByaXYsIHByaXYtPnBhcmFtLnR4dGFpbCwgMCk7CisJCX0KKwl9CisKKwkvKiBEQ0QgdHJhbnNpdGlvbiAqLworCWlmIChkcnIwICYgRENEKSB7CisJCWlmIChycjAgJiBEQ0QpIHsKKwkJCXN3aXRjaCAocHJpdi0+c3RhdGUpIHsKKwkJCWNhc2UgSURMRToKKwkJCWNhc2UgV0FJVDoKKwkJCQlwcml2LT5zdGF0ZSA9IERDRF9PTjsKKwkJCQl3cml0ZV9zY2MocHJpdiwgUjE1LCAwKTsKKwkJCQlzdGFydF90aW1lcihwcml2LCBwcml2LT5wYXJhbS5kY2RvbiwgMCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKHByaXYtPnN0YXRlKSB7CisJCQljYXNlIFJYX09OOgorCQkJCXJ4X29mZihwcml2KTsKKwkJCQlwcml2LT5zdGF0ZSA9IERDRF9PRkY7CisJCQkJd3JpdGVfc2NjKHByaXYsIFIxNSwgMCk7CisJCQkJc3RhcnRfdGltZXIocHJpdiwgcHJpdi0+cGFyYW0uZGNkb2ZmLCAwKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIENUUyB0cmFuc2l0aW9uICovCisJaWYgKChkcnIwICYgQ1RTKSAmJiAofnJyMCAmIENUUykgJiYgcHJpdi0+dHlwZSAhPSBUWVBFX1RXSU4pCisJCXRtX2lzcihwcml2KTsKKworfQorCisKK3N0YXRpYyB2b2lkIHRtX2lzcihzdHJ1Y3Qgc2NjX3ByaXYgKnByaXYpCit7CisJc3dpdGNoIChwcml2LT5zdGF0ZSkgeworCWNhc2UgVFhfSEVBRDoKKwljYXNlIFRYX1BBVVNFOgorCQl0eF9vbihwcml2KTsKKwkJcHJpdi0+c3RhdGUgPSBUWF9EQVRBOworCQlicmVhazsKKwljYXNlIFRYX1RBSUw6CisJCXdyaXRlX3NjYyhwcml2LCBSNSwgVHhDUkNfRU5BQiB8IFR4OCk7CisJCXByaXYtPnN0YXRlID0gUlRTX09GRjsKKwkJaWYgKHByaXYtPnR5cGUgIT0gVFlQRV9UV0lOKQorCQkJd3JpdGVfc2NjKHByaXYsIFIxNSwgMCk7CisJCXN0YXJ0X3RpbWVyKHByaXYsIHByaXYtPnBhcmFtLnJ0c29mZiwgMCk7CisJCWJyZWFrOworCWNhc2UgUlRTX09GRjoKKwkJd3JpdGVfc2NjKHByaXYsIFIxNSwgRENESUUpOworCQlwcml2LT5ycjAgPSByZWFkX3NjYyhwcml2LCBSMCk7CisJCWlmIChwcml2LT5ycjAgJiBEQ0QpIHsKKwkJCXByaXYtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJCXJ4X29uKHByaXYpOworCQkJcHJpdi0+c3RhdGUgPSBSWF9PTjsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPnN0YXRlID0gV0FJVDsKKwkJCXN0YXJ0X3RpbWVyKHByaXYsIHByaXYtPnBhcmFtLndhaXR0aW1lLCBEQ0RJRSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXQUlUOgorCQlpZiAocHJpdi0+dHhfY291bnQpIHsKKwkJCXByaXYtPnN0YXRlID0gVFhfSEVBRDsKKwkJCXByaXYtPnR4X3N0YXJ0ID0gamlmZmllczsKKwkJCXdyaXRlX3NjYyhwcml2LCBSNSwKKwkJCQkgIFR4Q1JDX0VOQUIgfCBSVFMgfCBUeEVOQUIgfCBUeDgpOworCQkJd3JpdGVfc2NjKHByaXYsIFIxNSwgMCk7CisJCQlzdGFydF90aW1lcihwcml2LCBwcml2LT5wYXJhbS50eGRlbGF5LCAwKTsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPnN0YXRlID0gSURMRTsKKwkJCWlmIChwcml2LT50eXBlICE9IFRZUEVfVFdJTikKKwkJCQl3cml0ZV9zY2MocHJpdiwgUjE1LCBEQ0RJRSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBEQ0RfT046CisJY2FzZSBEQ0RfT0ZGOgorCQl3cml0ZV9zY2MocHJpdiwgUjE1LCBEQ0RJRSk7CisJCXByaXYtPnJyMCA9IHJlYWRfc2NjKHByaXYsIFIwKTsKKwkJaWYgKHByaXYtPnJyMCAmIERDRCkgeworCQkJcnhfb24ocHJpdik7CisJCQlwcml2LT5zdGF0ZSA9IFJYX09OOworCQl9IGVsc2UgeworCQkJcHJpdi0+c3RhdGUgPSBXQUlUOworCQkJc3RhcnRfdGltZXIocHJpdiwKKwkJCQkgICAgcmFuZG9tKCkgLyBwcml2LT5wYXJhbS5wZXJzaXN0ICoKKwkJCQkgICAgcHJpdi0+cGFyYW0uc2xvdHRpbWUsIERDRElFKTsKKwkJfQorCQlicmVhazsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9oZGxjZHJ2LmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9oZGxjZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5OTU5YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2hkbGNkcnYuYwpAQCAtMCwwICsxLDgxNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJaGRsY2Rydi5jICAtLSBIRExDIHBhY2tldCByYWRpbyBuZXR3b3JrIGRyaXZlci4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMCAgVGhvbWFzIFNhaWxlciAoc2FpbGVyQGlmZS5lZS5ldGh6LmNoKQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBHUEwgYWxsb3dzIHlvdSB0byB1c2UgdGhlIGRyaXZlciwgTk9UIHRoZSByYWRpby4KKyAqICBJbiBvcmRlciB0byB1c2UgdGhlIHJhZGlvLCB5b3UgbmVlZCBhIGxpY2Vuc2UgZnJvbSB0aGUgY29tbXVuaWNhdGlvbnMKKyAqICBhdXRob3JpdHkgb2YgeW91ciBjb3VudHJ5LgorICoKKyAqICBUaGUgZHJpdmVyIHdhcyBkZXJpdmVkIGZyb20gRG9uYWxkIEJlY2tlcnMgc2tlbGV0b24uYworICoJV3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisgKgorICogIEhpc3Rvcnk6CisgKiAgIDAuMSAgMjEuMDkuMTk5NiAgU3RhcnRlZAorICogICAgICAgIDE4LjEwLjE5OTYgIENoYW5nZWQgdG8gbmV3IHVzZXIgc3BhY2UgYWNjZXNzIHJvdXRpbmVzIAorICogICAgICAgICAgICAgICAgICAgIChjb3B5X3t0byxmcm9tfV91c2VyKQorICogICAwLjIgIDIxLjExLjE5OTYgIHZhcmlvdXMgc21hbGwgY2hhbmdlcworICogICAwLjMgIDAzLjAzLjE5OTcgIGZpeGVkIChob3BlZnVsbHkpIElQIG5vdCB3b3JraW5nIHdpdGggYXguMjUgYXMgYSBtb2R1bGUKKyAqICAgMC40ICAxNi4wNC4xOTk3ICBpbml0IGNvZGUvZGF0YSB0YWdnZWQKKyAqICAgMC41ICAzMC4wNy4xOTk3ICBtYWRlIEhETEMgYnVmZmVycyBiaWdnZXIgKHNvbHZlcyBhIHByb2JsZW0gd2l0aCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICBzb3VuZG1vZGVtIGRyaXZlcikKKyAqICAgMC42ICAwNS4wNC4xOTk4ICBhZGQgc3BpbmxvY2tzCisgKiAgIDAuNyAgMDMuMDguMTk5OSAgcmVtb3ZlZCBzb21lIG9sZCBjb21wYXRpYmlsaXR5IGNydWZ0CisgKiAgIDAuOCAgMTIuMDIuMjAwMCAgYWRhcHRlZCB0byBzb2Z0bmV0IGRyaXZlciBpbnRlcmZhY2UKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaGRsY2Rydi5oPgorLyogcHJvdG90eXBlcyBmb3IgYXgyNV9lbmNhcHN1bGF0ZSBhbmQgYXgyNV9yZWJ1aWxkX2hlYWRlciAqLworI2luY2x1ZGUgPG5ldC9heDI1Lmg+IAorCisvKiBtYWtlIGdlbmtzeW1zIGhhcHB5ICovCisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMtY2NpdHQuaD4KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBUaGUgbmFtZSBvZiB0aGUgY2FyZC4gSXMgdXNlZCBmb3IgbWVzc2FnZXMgYW5kIGluIHRoZSByZXF1ZXN0cyBmb3IKKyAqIGlvIHJlZ2lvbnMsIGlycXMgYW5kIGRtYSBjaGFubmVscworICovCisKK3N0YXRpYyBjaGFyIGF4MjVfYmNhc3RbQVgyNV9BRERSX0xFTl0gPQoreydRJyA8PCAxLCAnUycgPDwgMSwgJ1QnIDw8IDEsICcgJyA8PCAxLCAnICcgPDwgMSwgJyAnIDw8IDEsICcwJyA8PCAxfTsKK3N0YXRpYyBjaGFyIGF4MjVfbm9jYWxsW0FYMjVfQUREUl9MRU5dID0KK3snTCcgPDwgMSwgJ0knIDw8IDEsICdOJyA8PCAxLCAnVScgPDwgMSwgJ1gnIDw8IDEsICcgJyA8PCAxLCAnMScgPDwgMX07CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtJU1NfVkVSQk9TRQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBQQVJBTV9UWERFTEFZICAgMQorI2RlZmluZSBQQVJBTV9QRVJTSVNUICAgMgorI2RlZmluZSBQQVJBTV9TTE9UVElNRSAgMworI2RlZmluZSBQQVJBTV9UWFRBSUwgICAgNAorI2RlZmluZSBQQVJBTV9GVUxMRFVQICAgNQorI2RlZmluZSBQQVJBTV9IQVJEV0FSRSAgNgorI2RlZmluZSBQQVJBTV9SRVRVUk4gICAgMjU1CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIHRoZSBDUkMgcm91dGluZXMgYXJlIHN0b2xlbiBmcm9tIFdBTVBFUworICogYnkgRGlldGVyIERleWtlCisgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcHBlbmRfY3JjX2NjaXR0KHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKyAJdW5zaWduZWQgaW50IGNyYyA9IGNyY19jY2l0dCgweGZmZmYsIGJ1ZmZlciwgbGVuKSBeIDB4ZmZmZjsKKwkqYnVmZmVyKysgPSBjcmM7CisJKmJ1ZmZlcisrID0gY3JjID4+IDg7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfY3JjX2NjaXR0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNudCkKK3sKKwlyZXR1cm4gKGNyY19jY2l0dCgweGZmZmYsIGJ1ZiwgY250KSAmIDB4ZmZmZikgPT0gMHhmMGI4OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAwCitzdGF0aWMgaW50IGNhbGNfY3JjX2NjaXR0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNudCkKK3sKKwl1bnNpZ25lZCBpbnQgY3JjID0gMHhmZmZmOworCisJZm9yICg7IGNudCA+IDA7IGNudC0tKQorCQljcmMgPSAoY3JjID4+IDgpIF4gY3JjX2NjaXR0X3RhYmxlWyhjcmMgXiAqYnVmKyspICYgMHhmZl07CisJY3JjIF49IDB4ZmZmZjsKKwlyZXR1cm4gKGNyYyAmIDB4ZmZmZik7Cit9CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIHRlbm1zX3RvXzJmbGFncyhzLHRlbm1zKSAoKHRlbm1zICogcy0+cGFyLmJpdHJhdGUpIC8gMTAwIC8gMTYpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBUaGUgSERMQyByb3V0aW5lcworICovCisKK3N0YXRpYyBpbnQgaGRsY19yeF9hZGRfYnl0ZXMoc3RydWN0IGhkbGNkcnZfc3RhdGUgKnMsIHVuc2lnbmVkIGludCBiaXRzLCAKKwkJCSAgICAgaW50IG51bSkKK3sKKwlpbnQgYWRkZWQgPSAwOworCQorCXdoaWxlIChzLT5oZGxjcngucnhfc3RhdGUgJiYgbnVtID49IDgpIHsKKwkJaWYgKHMtPmhkbGNyeC5sZW4gPj0gc2l6ZW9mKHMtPmhkbGNyeC5idWZmZXIpKSB7CisJCQlzLT5oZGxjcngucnhfc3RhdGUgPSAwOworCQkJcmV0dXJuIDA7CisJCX0KKwkJKnMtPmhkbGNyeC5icCsrID0gYml0cyA+PiAoMzItbnVtKTsKKwkJcy0+aGRsY3J4LmxlbisrOworCQludW0gLT0gODsKKwkJYWRkZWQgKz0gODsKKwl9CisJcmV0dXJuIGFkZGVkOworfQorCitzdGF0aWMgdm9pZCBoZGxjX3J4X2ZsYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGhkbGNkcnZfc3RhdGUgKnMpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgcGt0X2xlbjsKKwl1bnNpZ25lZCBjaGFyICpjcDsKKworCWlmIChzLT5oZGxjcngubGVuIDwgNCkgCisJCXJldHVybjsKKwlpZiAoIWNoZWNrX2NyY19jY2l0dChzLT5oZGxjcnguYnVmZmVyLCBzLT5oZGxjcngubGVuKSkgCisJCXJldHVybjsKKwlwa3RfbGVuID0gcy0+aGRsY3J4LmxlbiAtIDIgKyAxOyAvKiBLSVNTIGtsdWRnZSAqLworCWlmICghKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbikpKSB7CisJCXByaW50aygiJXM6IG1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXRcbiIsIGRldi0+bmFtZSk7CisJCXMtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKwlza2ItPmRldiA9IGRldjsKKwljcCA9IHNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKwkqY3ArKyA9IDA7IC8qIEtJU1Mga2x1ZGdlICovCisJbWVtY3B5KGNwLCBzLT5oZGxjcnguYnVmZmVyLCBwa3RfbGVuIC0gMSk7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0FYMjUpOworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwluZXRpZl9yeChza2IpOworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJcy0+c3RhdHMucnhfcGFja2V0cysrOworfQorCit2b2lkIGhkbGNkcnZfcmVjZWl2ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGhkbGNkcnZfc3RhdGUgKnMpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IG1hc2sxLCBtYXNrMiwgbWFzazMsIG1hc2s0LCBtYXNrNSwgbWFzazYsIHdvcmQ7CisJCisJaWYgKCFzIHx8IHMtPm1hZ2ljICE9IEhETENEUlZfTUFHSUMpIAorCQlyZXR1cm47CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJnMtPmhkbGNyeC5pbl9oZGxjX3J4KSkKKwkJcmV0dXJuOworCisJd2hpbGUgKCFoZGxjZHJ2X2hidWZfZW1wdHkoJnMtPmhkbGNyeC5oYnVmKSkgeworCQl3b3JkID0gaGRsY2Rydl9oYnVmX2dldCgmcy0+aGRsY3J4LmhidWYpOwkKKworI2lmZGVmIEhETENEUlZfREVCVUcKKwkJaGRsY2Rydl9hZGRfYml0YnVmZmVyX3dvcmQoJnMtPmJpdGJ1Zl9oZGxjLCB3b3JkKTsKKyNlbmRpZiAvKiBIRExDRFJWX0RFQlVHICovCisJICAgICAgIAlzLT5oZGxjcnguYml0c3RyZWFtID4+PSAxNjsKKwkJcy0+aGRsY3J4LmJpdHN0cmVhbSB8PSB3b3JkIDw8IDE2OworCQlzLT5oZGxjcnguYml0YnVmID4+PSAxNjsKKwkJcy0+aGRsY3J4LmJpdGJ1ZiB8PSB3b3JkIDw8IDE2OworCQlzLT5oZGxjcngubnVtYml0cyArPSAxNjsKKwkJZm9yKGkgPSAxNSwgbWFzazEgPSAweDFmYzAwLCBtYXNrMiA9IDB4MWZlMDAsIG1hc2szID0gMHgwZmMwMCwKKwkJICAgIG1hc2s0ID0gMHgxZjgwMCwgbWFzazUgPSAweGY4MDAsIG1hc2s2ID0gMHhmZmZmOyAKKwkJICAgIGkgPj0gMDsgCisJCSAgICBpLS0sIG1hc2sxIDw8PSAxLCBtYXNrMiA8PD0gMSwgbWFzazMgPDw9IDEsIG1hc2s0IDw8PSAxLCAKKwkJICAgIG1hc2s1IDw8PSAxLCBtYXNrNiA9IChtYXNrNiA8PCAxKSB8IDEpIHsKKwkJCWlmICgocy0+aGRsY3J4LmJpdHN0cmVhbSAmIG1hc2sxKSA9PSBtYXNrMSkKKwkJCQlzLT5oZGxjcngucnhfc3RhdGUgPSAwOyAvKiBhYm9ydCByZWNlaXZlZCAqLworCQkJZWxzZSBpZiAoKHMtPmhkbGNyeC5iaXRzdHJlYW0gJiBtYXNrMikgPT0gbWFzazMpIHsKKwkJCQkvKiBmbGFnIHJlY2VpdmVkICovCisJCQkJaWYgKHMtPmhkbGNyeC5yeF9zdGF0ZSkgeworCQkJCQloZGxjX3J4X2FkZF9ieXRlcyhzLCBzLT5oZGxjcnguYml0YnVmIAorCQkJCQkJCSAgPDwgKDgraSksCisJCQkJCQkJICBzLT5oZGxjcngubnVtYml0cworCQkJCQkJCSAgLTgtaSk7CisJCQkJCWhkbGNfcnhfZmxhZyhkZXYsIHMpOworCQkJCX0KKwkJCQlzLT5oZGxjcngubGVuID0gMDsKKwkJCQlzLT5oZGxjcnguYnAgPSBzLT5oZGxjcnguYnVmZmVyOworCQkJCXMtPmhkbGNyeC5yeF9zdGF0ZSA9IDE7CisJCQkJcy0+aGRsY3J4Lm51bWJpdHMgPSBpOworCQkJfSBlbHNlIGlmICgocy0+aGRsY3J4LmJpdHN0cmVhbSAmIG1hc2s0KSA9PSBtYXNrNSkgeworCQkJCS8qIHN0dWZmZWQgYml0ICovCisJCQkJcy0+aGRsY3J4Lm51bWJpdHMtLTsKKwkJCQlzLT5oZGxjcnguYml0YnVmID0gKHMtPmhkbGNyeC5iaXRidWYgJiAofm1hc2s2KSkgfAorCQkJCQkoKHMtPmhkbGNyeC5iaXRidWYgJiBtYXNrNikgPDwgMSk7CisJCQl9CisJCX0KKwkJcy0+aGRsY3J4Lm51bWJpdHMgLT0gaGRsY19yeF9hZGRfYnl0ZXMocywgcy0+aGRsY3J4LmJpdGJ1ZiwKKwkJCQkJCSAgICAgICBzLT5oZGxjcngubnVtYml0cyk7CisJfQorCWNsZWFyX2JpdCgwLCAmcy0+aGRsY3J4LmluX2hkbGNfcngpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19raXNzX3BhcmFtcyhzdHJ1Y3QgaGRsY2Rydl9zdGF0ZSAqcywKKwkJCQkgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCisjaWZkZWYgS0lTU19WRVJCT1NFCisjZGVmaW5lIFBLUChhLGIpIHByaW50ayhLRVJOX0lORk8gImhkbGNkcnYuYzogY2hhbm5lbCBwYXJhbXM6ICIgYSAiXG4iLCBiKQorI2Vsc2UgLyogS0lTU19WRVJCT1NFICovCSAgICAgIAorI2RlZmluZSBQS1AoYSxiKSAKKyNlbmRpZiAvKiBLSVNTX1ZFUkJPU0UgKi8JICAgICAgCisKKwlpZiAobGVuIDwgMikKKwkJcmV0dXJuOworCXN3aXRjaChkYXRhWzBdKSB7CisJY2FzZSBQQVJBTV9UWERFTEFZOgorCQlzLT5jaF9wYXJhbXMudHhfZGVsYXkgPSBkYXRhWzFdOworCQlQS1AoIlRYIGRlbGF5ID0gJXVtcyIsIDEwICogcy0+Y2hfcGFyYW1zLnR4X2RlbGF5KTsKKwkJYnJlYWs7CisJY2FzZSBQQVJBTV9QRVJTSVNUOiAgIAorCQlzLT5jaF9wYXJhbXMucHBlcnNpc3QgPSBkYXRhWzFdOworCQlQS1AoInAgcGVyc2lzdGVuY2UgPSAldSIsIHMtPmNoX3BhcmFtcy5wcGVyc2lzdCk7CisJCWJyZWFrOworCWNhc2UgUEFSQU1fU0xPVFRJTUU6ICAKKwkJcy0+Y2hfcGFyYW1zLnNsb3R0aW1lID0gZGF0YVsxXTsKKwkJUEtQKCJzbG90IHRpbWUgPSAldW1zIiwgcy0+Y2hfcGFyYW1zLnNsb3R0aW1lKTsKKwkJYnJlYWs7CisJY2FzZSBQQVJBTV9UWFRBSUw6ICAgIAorCQlzLT5jaF9wYXJhbXMudHhfdGFpbCA9IGRhdGFbMV07CisJCVBLUCgiVFggdGFpbCA9ICV1bXMiLCBzLT5jaF9wYXJhbXMudHhfdGFpbCk7CisJCWJyZWFrOworCWNhc2UgUEFSQU1fRlVMTERVUDogICAKKwkJcy0+Y2hfcGFyYW1zLmZ1bGxkdXAgPSAhIWRhdGFbMV07CisJCVBLUCgiJXMgZHVwbGV4Iiwgcy0+Y2hfcGFyYW1zLmZ1bGxkdXAgPyAiZnVsbCIgOiAiaGFsZiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisjdW5kZWYgUEtQCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBoZGxjZHJ2X3RyYW5zbWl0dGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBoZGxjZHJ2X3N0YXRlICpzKQoreworCXVuc2lnbmVkIGludCBtYXNrMSwgbWFzazIsIG1hc2szOworCWludCBpOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHBrdF9sZW47CisKKwlpZiAoIXMgfHwgcy0+bWFnaWMgIT0gSERMQ0RSVl9NQUdJQykgCisJCXJldHVybjsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmcy0+aGRsY3R4LmluX2hkbGNfdHgpKQorCQlyZXR1cm47CisJZm9yICg7OykgeworCQlpZiAocy0+aGRsY3R4Lm51bWJpdHMgPj0gMTYpIHsKKwkJCWlmIChoZGxjZHJ2X2hidWZfZnVsbCgmcy0+aGRsY3R4LmhidWYpKSB7CisJCQkJY2xlYXJfYml0KDAsICZzLT5oZGxjdHguaW5faGRsY190eCk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaGRsY2Rydl9oYnVmX3B1dCgmcy0+aGRsY3R4LmhidWYsIHMtPmhkbGN0eC5iaXRidWYpOworCQkJcy0+aGRsY3R4LmJpdGJ1ZiA+Pj0gMTY7CisJCQlzLT5oZGxjdHgubnVtYml0cyAtPSAxNjsKKwkJfQorCQlzd2l0Y2ggKHMtPmhkbGN0eC50eF9zdGF0ZSkgeworCQlkZWZhdWx0OgorCQkJY2xlYXJfYml0KDAsICZzLT5oZGxjdHguaW5faGRsY190eCk7CisJCQlyZXR1cm47CisJCWNhc2UgMDoKKwkJY2FzZSAxOgorCQkJaWYgKHMtPmhkbGN0eC5udW1mbGFncykgeworCQkJCXMtPmhkbGN0eC5udW1mbGFncy0tOworCQkJCXMtPmhkbGN0eC5iaXRidWYgfD0gCisJCQkJCTB4N2U3ZSA8PCBzLT5oZGxjdHgubnVtYml0czsKKwkJCQlzLT5oZGxjdHgubnVtYml0cyArPSAxNjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzLT5oZGxjdHgudHhfc3RhdGUgPT0gMSkgeworCQkJCWNsZWFyX2JpdCgwLCAmcy0+aGRsY3R4LmluX2hkbGNfdHgpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmICghKHNrYiA9IHMtPnNrYikpIHsKKwkJCQlpbnQgZmxncyA9IHRlbm1zX3RvXzJmbGFncyhzLCBzLT5jaF9wYXJhbXMudHhfdGFpbCk7CisJCQkJaWYgKGZsZ3MgPCAyKQorCQkJCQlmbGdzID0gMjsKKwkJCQlzLT5oZGxjdHgudHhfc3RhdGUgPSAxOworCQkJCXMtPmhkbGN0eC5udW1mbGFncyA9IGZsZ3M7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzLT5za2IgPSBOVUxMOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJcGt0X2xlbiA9IHNrYi0+bGVuLTE7IC8qIHN0cmlwIEtJU1MgYnl0ZSAqLworCQkJaWYgKHBrdF9sZW4gPj0gSERMQ0RSVl9NQVhGTEVOIHx8IHBrdF9sZW4gPCAyKSB7CisJCQkJcy0+aGRsY3R4LnR4X3N0YXRlID0gMDsKKwkJCQlzLT5oZGxjdHgubnVtZmxhZ3MgPSAxOworCQkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQkJYnJlYWs7CisJCQl9CisJCQltZW1jcHkocy0+aGRsY3R4LmJ1ZmZlciwgc2tiLT5kYXRhKzEsIHBrdF9sZW4pOworCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCXMtPmhkbGN0eC5icCA9IHMtPmhkbGN0eC5idWZmZXI7CisJCQlhcHBlbmRfY3JjX2NjaXR0KHMtPmhkbGN0eC5idWZmZXIsIHBrdF9sZW4pOworCQkJcy0+aGRsY3R4LmxlbiA9IHBrdF9sZW4rMjsgLyogdGhlIGFwcGVuZGVkIENSQyAqLworCQkJcy0+aGRsY3R4LnR4X3N0YXRlID0gMjsKKwkJCXMtPmhkbGN0eC5iaXRzdHJlYW0gPSAwOworCQkJcy0+c3RhdHMudHhfcGFja2V0cysrOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWlmICghcy0+aGRsY3R4LmxlbikgeworCQkJCXMtPmhkbGN0eC50eF9zdGF0ZSA9IDA7CisJCQkJcy0+aGRsY3R4Lm51bWZsYWdzID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXMtPmhkbGN0eC5sZW4tLTsKKwkJCXMtPmhkbGN0eC5iaXRidWYgfD0gKnMtPmhkbGN0eC5icCA8PAorCQkJCXMtPmhkbGN0eC5udW1iaXRzOworCQkJcy0+aGRsY3R4LmJpdHN0cmVhbSA+Pj0gODsKKwkJCXMtPmhkbGN0eC5iaXRzdHJlYW0gfD0gKCpzLT5oZGxjdHguYnArKykgPDwgMTY7CisJCQltYXNrMSA9IDB4MWYwMDA7CisJCQltYXNrMiA9IDB4MTAwMDA7CisJCQltYXNrMyA9IDB4ZmZmZmZmZmYgPj4gKDMxLXMtPmhkbGN0eC5udW1iaXRzKTsKKwkJCXMtPmhkbGN0eC5udW1iaXRzICs9IDg7CisJCQlmb3IoaSA9IDA7IGkgPCA4OyBpKyssIG1hc2sxIDw8PSAxLCBtYXNrMiA8PD0gMSwgCisJCQkgICAgbWFzazMgPSAobWFzazMgPDwgMSkgfCAxKSB7CisJCQkJaWYgKChzLT5oZGxjdHguYml0c3RyZWFtICYgbWFzazEpICE9IG1hc2sxKSAKKwkJCQkJY29udGludWU7CisJCQkJcy0+aGRsY3R4LmJpdHN0cmVhbSAmPSB+bWFzazI7CisJCQkJcy0+aGRsY3R4LmJpdGJ1ZiA9IAorCQkJCQkocy0+aGRsY3R4LmJpdGJ1ZiAmIG1hc2szKSB8CisJCQkJCQkoKHMtPmhkbGN0eC5iaXRidWYgJiAKKwkJCQkJCSAofm1hc2szKSkgPDwgMSk7CisJCQkJcy0+aGRsY3R4Lm51bWJpdHMrKzsKKwkJCQltYXNrMyA9IChtYXNrMyA8PCAxKSB8IDE7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBzdGFydF90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaGRsY2Rydl9zdGF0ZSAqcykKK3sKKwlzLT5oZGxjdHgudHhfc3RhdGUgPSAwOworCXMtPmhkbGN0eC5udW1mbGFncyA9IHRlbm1zX3RvXzJmbGFncyhzLCBzLT5jaF9wYXJhbXMudHhfZGVsYXkpOworCXMtPmhkbGN0eC5iaXRidWYgPSBzLT5oZGxjdHguYml0c3RyZWFtID0gcy0+aGRsY3R4Lm51bWJpdHMgPSAwOworCWhkbGNkcnZfdHJhbnNtaXR0ZXIoZGV2LCBzKTsKKwlzLT5oZGxjdHgucHR0ID0gMTsKKwlzLT5wdHRfa2V5ZWQrKzsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcmFuZG9tX3NlZWQ7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgcmFuZG9tX251bSh2b2lkKQoreworCXJhbmRvbV9zZWVkID0gMjg2MjkgKiByYW5kb21fc2VlZCArIDE1NzsKKwlyZXR1cm4gcmFuZG9tX3NlZWQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBoZGxjZHJ2X2FyYml0cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaGRsY2Rydl9zdGF0ZSAqcykKK3sKKwlpZiAoIXMgfHwgcy0+bWFnaWMgIT0gSERMQ0RSVl9NQUdJQyB8fCBzLT5oZGxjdHgucHR0IHx8ICFzLT5za2IpIAorCQlyZXR1cm47CisJaWYgKHMtPmNoX3BhcmFtcy5mdWxsZHVwKSB7CisJCXN0YXJ0X3R4KGRldiwgcyk7CisJCXJldHVybjsKKwl9CisJaWYgKHMtPmhkbGNyeC5kY2QpIHsKKwkJcy0+aGRsY3R4LnNsb3RjbnQgPSBzLT5jaF9wYXJhbXMuc2xvdHRpbWU7CisJCXJldHVybjsKKwl9CisJaWYgKCgtLXMtPmhkbGN0eC5zbG90Y250KSA+IDApCisJCXJldHVybjsKKwlzLT5oZGxjdHguc2xvdGNudCA9IHMtPmNoX3BhcmFtcy5zbG90dGltZTsKKwlpZiAoKHJhbmRvbV9udW0oKSAlIDI1NikgPiBzLT5jaF9wYXJhbXMucHBlcnNpc3QpCisJCXJldHVybjsKKwlzdGFydF90eChkZXYsIHMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT0gbmV0d29yayBkcml2ZXIgaW50ZXJmYWNlID09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCitzdGF0aWMgaW50IGhkbGNkcnZfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGRsY2Rydl9zdGF0ZSAqc20gPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKHNrYi0+ZGF0YVswXSAhPSAwKSB7CisJCWRvX2tpc3NfcGFyYW1zKHNtLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHNtLT5za2IpCisJCXJldHVybiAtMTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJc20tPnNrYiA9IHNrYjsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgaGRsY2Rydl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gKHN0cnVjdCBzb2NrYWRkciAqKWFkZHI7CisKKwkvKiBhZGRyIGlzIGFuIEFYLjI1IHNoaWZ0ZWQgQVNDSUkgbWFjIGFkZHJlc3MgKi8KKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgc2EtPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOyAKKwlyZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpoZGxjZHJ2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBoZGxjZHJ2X3N0YXRlICpzbSA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiAKKwkgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4gIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZQorCSAqIGNhcmQgb3BlbiBvciBjbG9zZWQuIAorCSAqLworCXJldHVybiAmc20tPnN0YXRzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQorICogc29tZXRpbWUgYWZ0ZXIgYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgorICoKKyAqIFRoaXMgcm91dGluZSBzaG91bGQgc2V0IGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4KKyAqIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0CisgKiB0aGVyZSBpcyBub24tcmVib290IHdheSB0byByZWNvdmVyIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgorICovCisKK3N0YXRpYyBpbnQgaGRsY2Rydl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhkbGNkcnZfc3RhdGUgKnMgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJaWYgKCFzLT5vcHMgfHwgIXMtPm9wcy0+b3BlbikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCSAqIGluaXRpYWxpc2Ugc29tZSB2YXJpYWJsZXMKKwkgKi8KKwlzLT5vcGVuZWQgPSAxOworCXMtPmhkbGNyeC5oYnVmLnJkID0gcy0+aGRsY3J4LmhidWYud3IgPSAwOworCXMtPmhkbGNyeC5pbl9oZGxjX3J4ID0gMDsKKwlzLT5oZGxjcngucnhfc3RhdGUgPSAwOworCQorCXMtPmhkbGN0eC5oYnVmLnJkID0gcy0+aGRsY3R4LmhidWYud3IgPSAwOworCXMtPmhkbGN0eC5pbl9oZGxjX3R4ID0gMDsKKwlzLT5oZGxjdHgudHhfc3RhdGUgPSAxOworCXMtPmhkbGN0eC5udW1mbGFncyA9IDA7CisJcy0+aGRsY3R4LmJpdHN0cmVhbSA9IHMtPmhkbGN0eC5iaXRidWYgPSBzLT5oZGxjdHgubnVtYml0cyA9IDA7CisJcy0+aGRsY3R4LnB0dCA9IDA7CisJcy0+aGRsY3R4LnNsb3RjbnQgPSBzLT5jaF9wYXJhbXMuc2xvdHRpbWU7CisJcy0+aGRsY3R4LmNhbGlicmF0ZSA9IDA7CisKKwlpID0gcy0+b3BzLT5vcGVuKGRldik7CisJaWYgKGkpCisJCXJldHVybiBpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogCisgKiBUaGUgaW52ZXJzZSByb3V0aW5lIHRvIGhkbGNkcnZfb3BlbigpLiAKKyAqLworCitzdGF0aWMgaW50IGhkbGNkcnZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGRsY2Rydl9zdGF0ZSAqcyA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGkgPSAwOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKHMtPm9wcyAmJiBzLT5vcHMtPmNsb3NlKQorCQlpID0gcy0+b3BzLT5jbG9zZShkZXYpOworCWlmIChzLT5za2IpCisJCWRldl9rZnJlZV9za2Iocy0+c2tiKTsKKwlzLT5za2IgPSBOVUxMOworCXMtPm9wZW5lZCA9IDA7CisJcmV0dXJuIGk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGhkbGNkcnZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IGhkbGNkcnZfc3RhdGUgKnMgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBoZGxjZHJ2X2lvY3RsIGJpOworCisJaWYgKGNtZCAhPSBTSU9DREVWUFJJVkFURSkgeworCQlpZiAocy0+b3BzICYmIHMtPm9wcy0+aW9jdGwpCisJCQlyZXR1cm4gcy0+b3BzLT5pb2N0bChkZXYsIGlmciwgJmJpLCBjbWQpOworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIoJmJpLCBpZnItPmlmcl9kYXRhLCBzaXplb2YoYmkpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKGJpLmNtZCkgeworCWRlZmF1bHQ6CisJCWlmIChzLT5vcHMgJiYgcy0+b3BzLT5pb2N0bCkKKwkJCXJldHVybiBzLT5vcHMtPmlvY3RsKGRldiwgaWZyLCAmYmksIGNtZCk7CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwljYXNlIEhETENEUlZDVExfR0VUQ0hBTk5FTFBBUjoKKwkJYmkuZGF0YS5jcC50eF9kZWxheSA9IHMtPmNoX3BhcmFtcy50eF9kZWxheTsKKwkJYmkuZGF0YS5jcC50eF90YWlsID0gcy0+Y2hfcGFyYW1zLnR4X3RhaWw7CisJCWJpLmRhdGEuY3Auc2xvdHRpbWUgPSBzLT5jaF9wYXJhbXMuc2xvdHRpbWU7CisJCWJpLmRhdGEuY3AucHBlcnNpc3QgPSBzLT5jaF9wYXJhbXMucHBlcnNpc3Q7CisJCWJpLmRhdGEuY3AuZnVsbGR1cCA9IHMtPmNoX3BhcmFtcy5mdWxsZHVwOworCQlicmVhazsKKworCWNhc2UgSERMQ0RSVkNUTF9TRVRDSEFOTkVMUEFSOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJcy0+Y2hfcGFyYW1zLnR4X2RlbGF5ID0gYmkuZGF0YS5jcC50eF9kZWxheTsKKwkJcy0+Y2hfcGFyYW1zLnR4X3RhaWwgPSBiaS5kYXRhLmNwLnR4X3RhaWw7CisJCXMtPmNoX3BhcmFtcy5zbG90dGltZSA9IGJpLmRhdGEuY3Auc2xvdHRpbWU7CisJCXMtPmNoX3BhcmFtcy5wcGVyc2lzdCA9IGJpLmRhdGEuY3AucHBlcnNpc3Q7CisJCXMtPmNoX3BhcmFtcy5mdWxsZHVwID0gYmkuZGF0YS5jcC5mdWxsZHVwOworCQlzLT5oZGxjdHguc2xvdGNudCA9IDE7CisJCXJldHVybiAwOworCQkKKwljYXNlIEhETENEUlZDVExfR0VUTU9ERU1QQVI6CisJCWJpLmRhdGEubXAuaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJCWJpLmRhdGEubXAuaXJxID0gZGV2LT5pcnE7CisJCWJpLmRhdGEubXAuZG1hID0gZGV2LT5kbWE7CisJCWJpLmRhdGEubXAuZG1hMiA9IHMtPnB0dF9vdXQuZG1hMjsKKwkJYmkuZGF0YS5tcC5zZXJpb2Jhc2UgPSBzLT5wdHRfb3V0LnNlcmlvYmFzZTsKKwkJYmkuZGF0YS5tcC5wYXJpb2Jhc2UgPSBzLT5wdHRfb3V0LnBhcmlvYmFzZTsKKwkJYmkuZGF0YS5tcC5taWRpaW9iYXNlID0gcy0+cHR0X291dC5taWRpaW9iYXNlOworCQlicmVhazsKKworCWNhc2UgSERMQ0RSVkNUTF9TRVRNT0RFTVBBUjoKKwkJaWYgKCghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkgfHwgbmV0aWZfcnVubmluZyhkZXYpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCWRldi0+YmFzZV9hZGRyID0gYmkuZGF0YS5tcC5pb2Jhc2U7CisJCWRldi0+aXJxID0gYmkuZGF0YS5tcC5pcnE7CisJCWRldi0+ZG1hID0gYmkuZGF0YS5tcC5kbWE7CisJCXMtPnB0dF9vdXQuZG1hMiA9IGJpLmRhdGEubXAuZG1hMjsKKwkJcy0+cHR0X291dC5zZXJpb2Jhc2UgPSBiaS5kYXRhLm1wLnNlcmlvYmFzZTsKKwkJcy0+cHR0X291dC5wYXJpb2Jhc2UgPSBiaS5kYXRhLm1wLnBhcmlvYmFzZTsKKwkJcy0+cHR0X291dC5taWRpaW9iYXNlID0gYmkuZGF0YS5tcC5taWRpaW9iYXNlOworCQlyZXR1cm4gMDsJCisJCisJY2FzZSBIRExDRFJWQ1RMX0dFVFNUQVQ6CisJCWJpLmRhdGEuY3MucHR0ID0gaGRsY2Rydl9wdHQocyk7CisJCWJpLmRhdGEuY3MuZGNkID0gcy0+aGRsY3J4LmRjZDsKKwkJYmkuZGF0YS5jcy5wdHRfa2V5ZWQgPSBzLT5wdHRfa2V5ZWQ7CisJCWJpLmRhdGEuY3MudHhfcGFja2V0cyA9IHMtPnN0YXRzLnR4X3BhY2tldHM7CisJCWJpLmRhdGEuY3MudHhfZXJyb3JzID0gcy0+c3RhdHMudHhfZXJyb3JzOworCQliaS5kYXRhLmNzLnJ4X3BhY2tldHMgPSBzLT5zdGF0cy5yeF9wYWNrZXRzOworCQliaS5kYXRhLmNzLnJ4X2Vycm9ycyA9IHMtPnN0YXRzLnJ4X2Vycm9yczsKKwkJYnJlYWs7CQkKKworCWNhc2UgSERMQ0RSVkNUTF9PTERHRVRTVEFUOgorCQliaS5kYXRhLm9jcy5wdHQgPSBoZGxjZHJ2X3B0dChzKTsKKwkJYmkuZGF0YS5vY3MuZGNkID0gcy0+aGRsY3J4LmRjZDsKKwkJYmkuZGF0YS5vY3MucHR0X2tleWVkID0gcy0+cHR0X2tleWVkOworCQlicmVhazsJCQorCisJY2FzZSBIRExDRFJWQ1RMX0NBTElCUkFURToKKwkJaWYoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCisJCQlyZXR1cm4gLUVQRVJNOworCQlzLT5oZGxjdHguY2FsaWJyYXRlID0gYmkuZGF0YS5jYWxpYnJhdGUgKiBzLT5wYXIuYml0cmF0ZSAvIDE2OworCQlyZXR1cm4gMDsKKworCWNhc2UgSERMQ0RSVkNUTF9HRVRTQU1QTEVTOgorI2lmbmRlZiBIRExDRFJWX0RFQlVHCisJCXJldHVybiAtRVBFUk07CisjZWxzZSAvKiBIRExDRFJWX0RFQlVHICovCisJCWlmIChzLT5iaXRidWZfY2hhbm5lbC5yZCA9PSBzLT5iaXRidWZfY2hhbm5lbC53cikgCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJYmkuZGF0YS5iaXRzID0gCisJCQlzLT5iaXRidWZfY2hhbm5lbC5idWZmZXJbcy0+Yml0YnVmX2NoYW5uZWwucmRdOworCQlzLT5iaXRidWZfY2hhbm5lbC5yZCA9IChzLT5iaXRidWZfY2hhbm5lbC5yZCsxKSAlCisJCQlzaXplb2Yocy0+Yml0YnVmX2NoYW5uZWwuYnVmZmVyKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogSERMQ0RSVl9ERUJVRyAqLworCQkJCQorCWNhc2UgSERMQ0RSVkNUTF9HRVRCSVRTOgorI2lmbmRlZiBIRExDRFJWX0RFQlVHCisJCXJldHVybiAtRVBFUk07CisjZWxzZSAvKiBIRExDRFJWX0RFQlVHICovCisJCWlmIChzLT5iaXRidWZfaGRsYy5yZCA9PSBzLT5iaXRidWZfaGRsYy53cikgCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJYmkuZGF0YS5iaXRzID0gCisJCQlzLT5iaXRidWZfaGRsYy5idWZmZXJbcy0+Yml0YnVmX2hkbGMucmRdOworCQlzLT5iaXRidWZfaGRsYy5yZCA9IChzLT5iaXRidWZfaGRsYy5yZCsxKSAlCisJCQlzaXplb2Yocy0+Yml0YnVmX2hkbGMuYnVmZmVyKTsKKwkJYnJlYWs7CQkKKyNlbmRpZiAvKiBIRExDRFJWX0RFQlVHICovCisKKwljYXNlIEhETENEUlZDVExfRFJJVkVSTkFNRToKKwkJaWYgKHMtPm9wcyAmJiBzLT5vcHMtPmRydm5hbWUpIHsKKwkJCXN0cm5jcHkoYmkuZGF0YS5kcml2ZXJuYW1lLCBzLT5vcHMtPmRydm5hbWUsIAorCQkJCXNpemVvZihiaS5kYXRhLmRyaXZlcm5hbWUpKTsKKwkJCWJyZWFrOworCQl9CisJCWJpLmRhdGEuZHJpdmVybmFtZVswXSA9ICdcMCc7CisJCWJyZWFrOworCQkKKwl9CisJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCAmYmksIHNpemVvZihiaSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKKworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIEluaXRpYWxpemUgZmllbGRzIGluIGhkbGNkcnYKKyAqLworc3RhdGljIHZvaWQgaGRsY2Rydl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRsY2Rydl9jaGFubmVsX3BhcmFtcyBkZmx0X2NoX3BhcmFtcyA9IHsgCisJCTIwLCAyLCAxMCwgNDAsIDAgCisJfTsKKwlzdHJ1Y3QgaGRsY2Rydl9zdGF0ZSAqcyA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKgorCSAqIGluaXRpYWxpemUgdGhlIGhkbGNkcnZfc3RhdGUgc3RydWN0CisJICovCisJcy0+Y2hfcGFyYW1zID0gZGZsdF9jaF9wYXJhbXM7CisJcy0+cHR0X2tleWVkID0gMDsKKworCXNwaW5fbG9ja19pbml0KCZzLT5oZGxjcnguaGJ1Zi5sb2NrKTsKKwlzLT5oZGxjcnguaGJ1Zi5yZCA9IHMtPmhkbGNyeC5oYnVmLndyID0gMDsKKwlzLT5oZGxjcnguaW5faGRsY19yeCA9IDA7CisJcy0+aGRsY3J4LnJ4X3N0YXRlID0gMDsKKwkKKwlzcGluX2xvY2tfaW5pdCgmcy0+aGRsY3R4LmhidWYubG9jayk7CisJcy0+aGRsY3R4LmhidWYucmQgPSBzLT5oZGxjdHguaGJ1Zi53ciA9IDA7CisJcy0+aGRsY3R4LmluX2hkbGNfdHggPSAwOworCXMtPmhkbGN0eC50eF9zdGF0ZSA9IDE7CisJcy0+aGRsY3R4Lm51bWZsYWdzID0gMDsKKwlzLT5oZGxjdHguYml0c3RyZWFtID0gcy0+aGRsY3R4LmJpdGJ1ZiA9IHMtPmhkbGN0eC5udW1iaXRzID0gMDsKKwlzLT5oZGxjdHgucHR0ID0gMDsKKwlzLT5oZGxjdHguc2xvdGNudCA9IHMtPmNoX3BhcmFtcy5zbG90dGltZTsKKwlzLT5oZGxjdHguY2FsaWJyYXRlID0gMDsKKworI2lmZGVmIEhETENEUlZfREVCVUcKKwlzLT5iaXRidWZfY2hhbm5lbC5yZCA9IHMtPmJpdGJ1Zl9jaGFubmVsLndyID0gMDsKKwlzLT5iaXRidWZfY2hhbm5lbC5zaHJlZyA9IDB4ODA7CisKKwlzLT5iaXRidWZfaGRsYy5yZCA9IHMtPmJpdGJ1Zl9oZGxjLndyID0gMDsKKwlzLT5iaXRidWZfaGRsYy5zaHJlZyA9IDB4ODA7CisjZW5kaWYgLyogSERMQ0RSVl9ERUJVRyAqLworCisJLyoKKwkgKiBpbml0aWFsaXplIHRoZSBkZXZpY2Ugc3RydWN0CisJICovCisJZGV2LT5vcGVuID0gaGRsY2Rydl9vcGVuOworCWRldi0+c3RvcCA9IGhkbGNkcnZfY2xvc2U7CisJZGV2LT5kb19pb2N0bCA9IGhkbGNkcnZfaW9jdGw7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBoZGxjZHJ2X3NlbmRfcGFja2V0OworCWRldi0+Z2V0X3N0YXRzID0gaGRsY2Rydl9nZXRfc3RhdHM7CisKKwkvKiBGaWxsIGluIHRoZSBmaWVsZHMgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKworCXMtPnNrYiA9IE5VTEw7CisJCisjaWYgZGVmaW5lZChDT05GSUdfQVgyNSkgfHwgZGVmaW5lZChDT05GSUdfQVgyNV9NT0RVTEUpCisJZGV2LT5oYXJkX2hlYWRlciA9IGF4MjVfZW5jYXBzdWxhdGU7CisJZGV2LT5yZWJ1aWxkX2hlYWRlciA9IGF4MjVfcmVidWlsZF9oZWFkZXI7CisjZWxzZSAvKiBDT05GSUdfQVgyNSB8fCBDT05GSUdfQVgyNV9NT0RVTEUgKi8KKwlkZXYtPmhhcmRfaGVhZGVyID0gTlVMTDsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyID0gTlVMTDsKKyNlbmRpZiAvKiBDT05GSUdfQVgyNSB8fCBDT05GSUdfQVgyNV9NT0RVTEUgKi8KKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGhkbGNkcnZfc2V0X21hY19hZGRyZXNzOworCQorCWRldi0+dHlwZSA9IEFSUEhSRF9BWDI1OyAgICAgICAgICAgLyogQUZfQVgyNSBkZXZpY2UgKi8KKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IEFYMjVfTUFYX0hFQURFUl9MRU4gKyBBWDI1X0JQUV9IRUFERVJfTEVOOworCWRldi0+bXR1ID0gQVgyNV9ERUZfUEFDTEVOOyAgICAgICAgLyogZXRoX210dSBpcyB0aGUgZGVmYXVsdCAqLworCWRldi0+YWRkcl9sZW4gPSBBWDI1X0FERFJfTEVOOyAgICAgLyogc2l6ZW9mIGFuIGF4LjI1IGFkZHJlc3MgKi8KKwltZW1jcHkoZGV2LT5icm9hZGNhc3QsIGF4MjVfYmNhc3QsIEFYMjVfQUREUl9MRU4pOworCW1lbWNweShkZXYtPmRldl9hZGRyLCBheDI1X25vY2FsbCwgQVgyNV9BRERSX0xFTik7CisJZGV2LT50eF9xdWV1ZV9sZW4gPSAxNjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdHJ1Y3QgbmV0X2RldmljZSAqaGRsY2Rydl9yZWdpc3Rlcihjb25zdCBzdHJ1Y3QgaGRsY2Rydl9vcHMgKm9wcywKKwkJCQkgICAgdW5zaWduZWQgaW50IHByaXZzaXplLCBjb25zdCBjaGFyICppZm5hbWUsCisJCQkJICAgIHVuc2lnbmVkIGludCBiYXNlYWRkciwgdW5zaWduZWQgaW50IGlycSwgCisJCQkJICAgIHVuc2lnbmVkIGludCBkbWEpIAoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGhkbGNkcnZfc3RhdGUgKnM7CisJaW50IGVycjsKKworCUJVR19PTihvcHMgPT0gTlVMTCk7CisKKwlpZiAocHJpdnNpemUgPCBzaXplb2Yoc3RydWN0IGhkbGNkcnZfc3RhdGUpKQorCQlwcml2c2l6ZSA9IHNpemVvZihzdHJ1Y3QgaGRsY2Rydl9zdGF0ZSk7CisKKwlkZXYgPSBhbGxvY19uZXRkZXYocHJpdnNpemUsIGlmbmFtZSwgaGRsY2Rydl9zZXR1cCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJLyoKKwkgKiBpbml0aWFsaXplIHBhcnQgb2YgdGhlIGhkbGNkcnZfc3RhdGUgc3RydWN0CisJICovCisJcyA9IG5ldGRldl9wcml2KGRldik7CisJcy0+bWFnaWMgPSBIRExDRFJWX01BR0lDOworCXMtPm9wcyA9IG9wczsKKwlkZXYtPmJhc2VfYWRkciA9IGJhc2VhZGRyOworCWRldi0+aXJxID0gaXJxOworCWRldi0+ZG1hID0gZG1hOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGRsY2RydjogY2Fubm90IHJlZ2lzdGVyIG5ldCAiCisJCSAgICAgICAiZGV2aWNlICVzXG4iLCBkZXYtPm5hbWUpOworCQlmcmVlX25ldGRldihkZXYpOworCQlkZXYgPSBFUlJfUFRSKGVycik7CisJfQorCXJldHVybiBkZXY7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIGhkbGNkcnZfdW5yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3QgaGRsY2Rydl9zdGF0ZSAqcyA9IG5ldGRldl9wcml2KGRldik7CisKKwlCVUdfT04ocy0+bWFnaWMgIT0gSERMQ0RSVl9NQUdJQyk7CisKKwlpZiAocy0+b3BlbmVkICYmIHMtPm9wcy0+Y2xvc2UpCisJCXMtPm9wcy0+Y2xvc2UoZGV2KTsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQorCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitFWFBPUlRfU1lNQk9MKGhkbGNkcnZfcmVjZWl2ZXIpOworRVhQT1JUX1NZTUJPTChoZGxjZHJ2X3RyYW5zbWl0dGVyKTsKK0VYUE9SVF9TWU1CT0woaGRsY2Rydl9hcmJpdHJhdGUpOworRVhQT1JUX1NZTUJPTChoZGxjZHJ2X3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woaGRsY2Rydl91bnJlZ2lzdGVyKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgX19pbml0IGhkbGNkcnZfaW5pdF9kcml2ZXIodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJoZGxjZHJ2OiAoQykgMTk5Ni0yMDAwIFRob21hcyBTYWlsZXIgSEI5Sk5YL0FFNFdBXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJoZGxjZHJ2OiB2ZXJzaW9uIDAuOCBjb21waWxlZCAiIF9fVElNRV9fICIgIiBfX0RBVEVfXyAiXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBoZGxjZHJ2X2NsZWFudXBfZHJpdmVyKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiaGRsY2RydjogY2xlYW51cFxuIik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgTS4gU2FpbGVyLCBzYWlsZXJAaWZlLmVlLmV0aHouY2gsIGhiOWpueEBoYjl3LmNoZS5ldSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQYWNrZXQgUmFkaW8gbmV0d29yayBpbnRlcmZhY2UgSERMQyBlbmNvZGVyL2RlY29kZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9pbml0KGhkbGNkcnZfaW5pdF9kcml2ZXIpOworbW9kdWxlX2V4aXQoaGRsY2Rydl9jbGVhbnVwX2RyaXZlcik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vbWtpc3MuYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL21raXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDllYTA4MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL21raXNzLmMKQEAgLTAsMCArMSw5NTEgQEAKKy8qCisgKglNS0lTUyBEcml2ZXIKKyAqCisgKglUaGlzIG1vZHVsZToKKyAqCQlUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogCQlUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBBWC4yNSBwcm90b2NvbCBmb3Iga2VybmVsLWJhc2VkCisgKgkJZGV2aWNlcyBsaWtlIFRUWXMuIEl0IGludGVyZmFjZXMgYmV0d2VlbiBhIHJhdyBUVFksIGFuZCB0aGUKKyAqCQlrZXJuZWwncyBBWC4yNSBwcm90b2NvbCBsYXllcnMsIGp1c3QgbGlrZSBzbGlwLmMuCisgKgkJQVguMjUgbmVlZHMgdG8gYmUgc2VwYXJhdGVkIGZyb20gc2xpcC5jIHdoaWxlIHNsaXAuYyBpcyBubworICoJCWxvbmdlciBhIHN0YXRpYyBrZXJuZWwgZGV2aWNlIHNpbmNlIGl0IGlzIGEgbW9kdWxlLgorICoJCVRoaXMgbWV0aG9kIGNsZWFycyB0aGUgd2F5IHRvIGltcGxlbWVudCBvdGhlciBraXNzIHByb3RvY29scworICoJCWxpa2UgbWtpc3Mgc21hY2sgZzhicHEgLi4uLi4gc28gZmFyIG9ubHkgbWtpc3MgaXMgaW1wbGVtZW50ZWQuCisgKgorICogSGFucyBBbGJsYXMgPGhhbnNAZXNyYWMuZWxlLnR1ZS5ubD4KKyAqCisgKglIaXN0b3J5CisgKglKb25hdGhhbiAoRzRLTFgpCUZpeGVkIHRvIG1hdGNoIExpbnV4IG5ldHdvcmtpbmcgY2hhbmdlcyAtIDIuMS4xNS4KKyAqCU1hdHRoaWFzIChERzJGRUYpICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIEZsZXhOZXQgQ1JDIChvbiBzcGVjaWFsIHJlcXVlc3QpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeGVkIGJ1ZyBpbiBheDI1X2Nsb3NlKCk6IGRldl9sb2NrX3dhaXQoKSB3YXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIHR3aWNlLCBjYXVzaW5nIGEgZGVhZGxvY2suCisgKglKZXJvZW4gKFBFMVJYUSkJCVJlbW92ZWQgb2xkIE1LSVNTX01BR0lDIHN0dWZmIGFuZCBjYWxscyB0bworICoJCQkJTU9EXypfVVNFX0NPVU5UCisgKgkJCQlSZW1vdmUgY2xpKCkgYW5kIGZpeCBydG5sIGxvY2sgdXNhZ2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorCisjaW5jbHVkZSA8bmV0L2F4MjUuaD4KKworI2luY2x1ZGUgIm1raXNzLmgiCisKKyNpZmRlZiBDT05GSUdfSU5FVAorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjZW5kaWYKKworc3RhdGljIGNoYXIgYmFubmVyW10gX19pbml0ZGF0YSA9IEtFUk5fSU5GTyAibWtpc3M6IEFYLjI1IE11bHRpa2lzcywgSGFucyBBbGJhcyBQRTFBWVhcbiI7CisKK3R5cGVkZWYgc3RydWN0IGF4MjVfY3RybCB7CisJc3RydWN0IGF4X2Rpc3AgY3RybDsJLyogCQkJCSovCisJc3RydWN0IG5ldF9kZXZpY2UgIGRldjsJLyogdGhlIGRldmljZQkJCSovCit9IGF4MjVfY3RybF90OworCitzdGF0aWMgYXgyNV9jdHJsX3QgKipheDI1X2N0cmxzOworCitpbnQgYXgyNV9tYXhkZXYgPSBBWDI1X01BWERFVjsJCS8qIENhbiBiZSBvdmVycmlkZGVuIHdpdGggaW5zbW9kISAqLworCitzdGF0aWMgc3RydWN0IHR0eV9sZGlzYwlheF9sZGlzYzsKKworc3RhdGljIGludCBheDI1X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50IGtpc3NfZXNjKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQpOworc3RhdGljIGludCBraXNzX2VzY19jcmModW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIHNob3J0LCBpbnQpOworc3RhdGljIHZvaWQga2lzc191bmVzYyhzdHJ1Y3QgYXhfZGlzcCAqLCB1bnNpZ25lZCBjaGFyKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgQ3JjX2ZsZXhfdGFibGVbXSA9IHsKKyAgMHgwZjg3LCAweDFlMGUsIDB4MmM5NSwgMHgzZDFjLCAweDQ5YTMsIDB4NTgyYSwgMHg2YWIxLCAweDdiMzgsCisgIDB4ODNjZiwgMHg5MjQ2LCAweGEwZGQsIDB4YjE1NCwgMHhjNWViLCAweGQ0NjIsIDB4ZTZmOSwgMHhmNzcwLAorICAweDFmMDYsIDB4MGU4ZiwgMHgzYzE0LCAweDJkOWQsIDB4NTkyMiwgMHg0OGFiLCAweDdhMzAsIDB4NmJiOSwKKyAgMHg5MzRlLCAweDgyYzcsIDB4YjA1YywgMHhhMWQ1LCAweGQ1NmEsIDB4YzRlMywgMHhmNjc4LCAweGU3ZjEsCisgIDB4MmU4NSwgMHgzZjBjLCAweDBkOTcsIDB4MWMxZSwgMHg2OGExLCAweDc5MjgsIDB4NGJiMywgMHg1YTNhLAorICAweGEyY2QsIDB4YjM0NCwgMHg4MWRmLCAweDkwNTYsIDB4ZTRlOSwgMHhmNTYwLCAweGM3ZmIsIDB4ZDY3MiwKKyAgMHgzZTA0LCAweDJmOGQsIDB4MWQxNiwgMHgwYzlmLCAweDc4MjAsIDB4NjlhOSwgMHg1YjMyLCAweDRhYmIsCisgIDB4YjI0YywgMHhhM2M1LCAweDkxNWUsIDB4ODBkNywgMHhmNDY4LCAweGU1ZTEsIDB4ZDc3YSwgMHhjNmYzLAorICAweDRkODMsIDB4NWMwYSwgMHg2ZTkxLCAweDdmMTgsIDB4MGJhNywgMHgxYTJlLCAweDI4YjUsIDB4MzkzYywKKyAgMHhjMWNiLCAweGQwNDIsIDB4ZTJkOSwgMHhmMzUwLCAweDg3ZWYsIDB4OTY2NiwgMHhhNGZkLCAweGI1NzQsCisgIDB4NWQwMiwgMHg0YzhiLCAweDdlMTAsIDB4NmY5OSwgMHgxYjI2LCAweDBhYWYsIDB4MzgzNCwgMHgyOWJkLAorICAweGQxNGEsIDB4YzBjMywgMHhmMjU4LCAweGUzZDEsIDB4OTc2ZSwgMHg4NmU3LCAweGI0N2MsIDB4YTVmNSwKKyAgMHg2YzgxLCAweDdkMDgsIDB4NGY5MywgMHg1ZTFhLCAweDJhYTUsIDB4M2IyYywgMHgwOWI3LCAweDE4M2UsCisgIDB4ZTBjOSwgMHhmMTQwLCAweGMzZGIsIDB4ZDI1MiwgMHhhNmVkLCAweGI3NjQsIDB4ODVmZiwgMHg5NDc2LAorICAweDdjMDAsIDB4NmQ4OSwgMHg1ZjEyLCAweDRlOWIsIDB4M2EyNCwgMHgyYmFkLCAweDE5MzYsIDB4MDhiZiwKKyAgMHhmMDQ4LCAweGUxYzEsIDB4ZDM1YSwgMHhjMmQzLCAweGI2NmMsIDB4YTdlNSwgMHg5NTdlLCAweDg0ZjcsCisgIDB4OGI4ZiwgMHg5YTA2LCAweGE4OWQsIDB4YjkxNCwgMHhjZGFiLCAweGRjMjIsIDB4ZWViOSwgMHhmZjMwLAorICAweDA3YzcsIDB4MTY0ZSwgMHgyNGQ1LCAweDM1NWMsIDB4NDFlMywgMHg1MDZhLCAweDYyZjEsIDB4NzM3OCwKKyAgMHg5YjBlLCAweDhhODcsIDB4YjgxYywgMHhhOTk1LCAweGRkMmEsIDB4Y2NhMywgMHhmZTM4LCAweGVmYjEsCisgIDB4MTc0NiwgMHgwNmNmLCAweDM0NTQsIDB4MjVkZCwgMHg1MTYyLCAweDQwZWIsIDB4NzI3MCwgMHg2M2Y5LAorICAweGFhOGQsIDB4YmIwNCwgMHg4OTlmLCAweDk4MTYsIDB4ZWNhOSwgMHhmZDIwLCAweGNmYmIsIDB4ZGUzMiwKKyAgMHgyNmM1LCAweDM3NGMsIDB4MDVkNywgMHgxNDVlLCAweDYwZTEsIDB4NzE2OCwgMHg0M2YzLCAweDUyN2EsCisgIDB4YmEwYywgMHhhYjg1LCAweDk5MWUsIDB4ODg5NywgMHhmYzI4LCAweGVkYTEsIDB4ZGYzYSwgMHhjZWIzLAorICAweDM2NDQsIDB4MjdjZCwgMHgxNTU2LCAweDA0ZGYsIDB4NzA2MCwgMHg2MWU5LCAweDUzNzIsIDB4NDJmYiwKKyAgMHhjOThiLCAweGQ4MDIsIDB4ZWE5OSwgMHhmYjEwLCAweDhmYWYsIDB4OWUyNiwgMHhhY2JkLCAweGJkMzQsCisgIDB4NDVjMywgMHg1NDRhLCAweDY2ZDEsIDB4Nzc1OCwgMHgwM2U3LCAweDEyNmUsIDB4MjBmNSwgMHgzMTdjLAorICAweGQ5MGEsIDB4Yzg4MywgMHhmYTE4LCAweGViOTEsIDB4OWYyZSwgMHg4ZWE3LCAweGJjM2MsIDB4YWRiNSwKKyAgMHg1NTQyLCAweDQ0Y2IsIDB4NzY1MCwgMHg2N2Q5LCAweDEzNjYsIDB4MDJlZiwgMHgzMDc0LCAweDIxZmQsCisgIDB4ZTg4OSwgMHhmOTAwLCAweGNiOWIsIDB4ZGExMiwgMHhhZWFkLCAweGJmMjQsIDB4OGRiZiwgMHg5YzM2LAorICAweDY0YzEsIDB4NzU0OCwgMHg0N2QzLCAweDU2NWEsIDB4MjJlNSwgMHgzMzZjLCAweDAxZjcsIDB4MTA3ZSwKKyAgMHhmODA4LCAweGU5ODEsIDB4ZGIxYSwgMHhjYTkzLCAweGJlMmMsIDB4YWZhNSwgMHg5ZDNlLCAweDhjYjcsCisgIDB4NzQ0MCwgMHg2NWM5LCAweDU3NTIsIDB4NDZkYiwgMHgzMjY0LCAweDIzZWQsIDB4MTE3NiwgMHgwMGZmCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBjYWxjX2NyY19mbGV4KHVuc2lnbmVkIGNoYXIgKmNwLCBpbnQgc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCBjcmMgPSAweGZmZmY7CisgICAgCisgICAgd2hpbGUgKHNpemUtLSkKKwljcmMgPSAoY3JjIDw8IDgpIF4gQ3JjX2ZsZXhfdGFibGVbKChjcmMgPj4gOCkgXiAqY3ArKykgJiAweGZmXTsKKworICAgIHJldHVybiBjcmM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBjaGVja19jcmNfZmxleCh1bnNpZ25lZCBjaGFyICpjcCwgaW50IHNpemUpCit7CisgIHVuc2lnbmVkIHNob3J0IGNyYyA9IDB4ZmZmZjsKKworICBpZiAoc2l6ZSA8IDMpCisgICAgICByZXR1cm4gLTE7CisKKyAgd2hpbGUgKHNpemUtLSkKKyAgICAgIGNyYyA9IChjcmMgPDwgOCkgXiBDcmNfZmxleF90YWJsZVsoKGNyYyA+PiA4KSBeICpjcCsrKSAmIDB4ZmZdOworCisgIGlmICgoY3JjICYgMHhmZmZmKSAhPSAweDcwNzApIAorICAgICAgcmV0dXJuIC0xOworCisgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEZpbmQgYSBmcmVlIGNoYW5uZWwsIGFuZCBsaW5rIGluIHRoaXMgYHR0eScgbGluZS4gKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGF4X2Rpc3AgKmF4X2FsbG9jKHZvaWQpCit7CisJYXgyNV9jdHJsX3QgKmF4cD1OVUxMOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGF4MjVfbWF4ZGV2OyBpKyspIHsKKwkJYXhwID0gYXgyNV9jdHJsc1tpXTsKKworCQkvKiBOb3QgYWxsb2NhdGVkID8gKi8KKwkJaWYgKGF4cCA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJLyogTm90IGluIHVzZSA/ICovCisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChBWEZfSU5VU0UsICZheHAtPmN0cmwuZmxhZ3MpKQorCQkJYnJlYWs7CisJfQorCisJLyogU29ycnksIHRvbyBtYW55LCBhbGwgc2xvdHMgaW4gdXNlICovCisJaWYgKGkgPj0gYXgyNV9tYXhkZXYpCisJCXJldHVybiBOVUxMOworCisJLyogSWYgbm8gY2hhbm5lbHMgYXJlIGF2YWlsYWJsZSwgYWxsb2NhdGUgb25lICovCisJaWYgKGF4cCA9PSBOVUxMICYmIChheDI1X2N0cmxzW2ldID0ga21hbGxvYyhzaXplb2YoYXgyNV9jdHJsX3QpLCBHRlBfS0VSTkVMKSkgIT0gTlVMTCkgeworCQlheHAgPSBheDI1X2N0cmxzW2ldOworCX0KKwltZW1zZXQoYXhwLCAwLCBzaXplb2YoYXgyNV9jdHJsX3QpKTsKKworCS8qIEluaXRpYWxpemUgY2hhbm5lbCBjb250cm9sIGRhdGEgKi8KKwlzZXRfYml0KEFYRl9JTlVTRSwgJmF4cC0+Y3RybC5mbGFncyk7CisJc3ByaW50ZihheHAtPmRldi5uYW1lLCAiYXglZCIsIGkrKyk7CisJYXhwLT5jdHJsLnR0eSAgICAgID0gTlVMTDsKKwlheHAtPmRldi5iYXNlX2FkZHIgPSBpOworCWF4cC0+ZGV2LnByaXYgICAgICA9ICh2b2lkICopJmF4cC0+Y3RybDsKKwlheHAtPmRldi5uZXh0ICAgICAgPSBOVUxMOworCWF4cC0+ZGV2LmluaXQgICAgICA9IGF4MjVfaW5pdDsKKworCWlmIChheHAgIT0gTlVMTCkgeworCQkvKgorCQkgKiByZWdpc3RlciBkZXZpY2Ugc28gdGhhdCBpdCBjYW4gYmUgaWZjb25maWcnZWQKKwkJICogYXgyNV9pbml0KCkgd2lsbCBiZSBjYWxsZWQgYXMgYSBzaWRlLWVmZmVjdAorCQkgKiBTSURFLUVGRkVDVCBXQVJOSU5HOiBheDI1X2luaXQoKSBDTEVBUlMgYXhwLT5jdHJsICEKKwkJICovCisJCWlmIChyZWdpc3Rlcl9uZXRkZXYoJmF4cC0+ZGV2KSA9PSAwKSB7CisJCQkvKiAoUmUtKVNldCB0aGUgSU5VU0UgYml0LiAgIFZlcnkgSW1wb3J0YW50ISAqLworCQkJc2V0X2JpdChBWEZfSU5VU0UsICZheHAtPmN0cmwuZmxhZ3MpOworCQkJYXhwLT5jdHJsLmRldiA9ICZheHAtPmRldjsKKwkJCWF4cC0+ZGV2LnByaXYgPSAodm9pZCAqKSAmYXhwLT5jdHJsOworCisJCQlyZXR1cm4gJmF4cC0+Y3RybDsKKwkJfSBlbHNlIHsKKwkJCWNsZWFyX2JpdChBWEZfSU5VU0UsJmF4cC0+Y3RybC5mbGFncyk7CisJCQlwcmludGsoS0VSTl9FUlIgIm1raXNzOiBheF9hbGxvYygpIC0gcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbHVyZS5cbiIpOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEZyZWUgYW4gQVgyNSBjaGFubmVsLiAqLworc3RhdGljIGlubGluZSB2b2lkIGF4X2ZyZWUoc3RydWN0IGF4X2Rpc3AgKmF4KQoreworCS8qIEZyZWUgYWxsIEFYMjUgZnJhbWUgYnVmZmVycy4gKi8KKwlpZiAoYXgtPnJidWZmKQorCQlrZnJlZShheC0+cmJ1ZmYpOworCWF4LT5yYnVmZiA9IE5VTEw7CisJaWYgKGF4LT54YnVmZikKKwkJa2ZyZWUoYXgtPnhidWZmKTsKKwlheC0+eGJ1ZmYgPSBOVUxMOworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KEFYRl9JTlVTRSwgJmF4LT5mbGFncykpCisJCXByaW50ayhLRVJOX0VSUiAibWtpc3M6ICVzOiBheF9mcmVlIGZvciBhbHJlYWR5IGZyZWUgdW5pdC5cbiIsIGF4LT5kZXYtPm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBheF9jaGFuZ2VkbXR1KHN0cnVjdCBheF9kaXNwICpheCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYXgtPmRldjsKKwl1bnNpZ25lZCBjaGFyICp4YnVmZiwgKnJidWZmLCAqb3hidWZmLCAqb3JidWZmOworCWludCBsZW47CisKKwlsZW4gPSBkZXYtPm10dSAqIDI7CisKKwkvKgorCSAqIGFsbG93IGZvciBhcnJpdmFsIG9mIGxhcmdlciBVRFAgcGFja2V0cywgZXZlbiBpZiB3ZSBzYXkgbm90IHRvCisJICogYWxzbyBmaXhlcyBhIGJ1ZyBpbiB3aGljaCBTdW5PUyBzZW5kcyA1MTItYnl0ZSBwYWNrZXRzIGV2ZW4gd2l0aAorCSAqIGFuIE1TUyBvZiAxMjgKKwkgKi8KKwlpZiAobGVuIDwgNTc2ICogMikKKwkJbGVuID0gNTc2ICogMjsKKworCXhidWZmID0ga21hbGxvYyhsZW4gKyA0LCBHRlBfQVRPTUlDKTsKKwlyYnVmZiA9IGttYWxsb2MobGVuICsgNCwgR0ZQX0FUT01JQyk7CisKKwlpZiAoeGJ1ZmYgPT0gTlVMTCB8fCByYnVmZiA9PSBOVUxMKSAgeworCQlwcmludGsoS0VSTl9FUlIgIm1raXNzOiAlczogdW5hYmxlIHRvIGdyb3cgYXgyNSBidWZmZXJzLCBNVFUgY2hhbmdlIGNhbmNlbGxlZC5cbiIsCisJCSAgICAgICBheC0+ZGV2LT5uYW1lKTsKKwkJZGV2LT5tdHUgPSBheC0+bXR1OworCQlpZiAoeGJ1ZmYgIT0gTlVMTCkKKwkJCWtmcmVlKHhidWZmKTsKKwkJaWYgKHJidWZmICE9IE5VTEwpCisJCQlrZnJlZShyYnVmZik7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfYmgoJmF4LT5idWZsb2NrKTsKKworCW94YnVmZiAgICA9IGF4LT54YnVmZjsKKwlheC0+eGJ1ZmYgPSB4YnVmZjsKKwlvcmJ1ZmYgICAgPSBheC0+cmJ1ZmY7CisJYXgtPnJidWZmID0gcmJ1ZmY7CisKKwlpZiAoYXgtPnhsZWZ0KSB7CisJCWlmIChheC0+eGxlZnQgPD0gbGVuKSB7CisJCQltZW1jcHkoYXgtPnhidWZmLCBheC0+eGhlYWQsIGF4LT54bGVmdCk7CisJCX0gZWxzZSAgeworCQkJYXgtPnhsZWZ0ID0gMDsKKwkJCWF4LT50eF9kcm9wcGVkKys7CisJCX0KKwl9CisKKwlheC0+eGhlYWQgPSBheC0+eGJ1ZmY7CisKKwlpZiAoYXgtPnJjb3VudCkgeworCQlpZiAoYXgtPnJjb3VudCA8PSBsZW4pIHsKKwkJCW1lbWNweShheC0+cmJ1ZmYsIG9yYnVmZiwgYXgtPnJjb3VudCk7CisJCX0gZWxzZSAgeworCQkJYXgtPnJjb3VudCA9IDA7CisJCQlheC0+cnhfb3Zlcl9lcnJvcnMrKzsKKwkJCXNldF9iaXQoQVhGX0VSUk9SLCAmYXgtPmZsYWdzKTsKKwkJfQorCX0KKworCWF4LT5tdHUgICAgICA9IGRldi0+bXR1ICsgNzM7CisJYXgtPmJ1ZmZzaXplID0gbGVuOworCisJc3Bpbl91bmxvY2tfYmgoJmF4LT5idWZsb2NrKTsKKworCWlmIChveGJ1ZmYgIT0gTlVMTCkKKwkJa2ZyZWUob3hidWZmKTsKKwlpZiAob3JidWZmICE9IE5VTEwpCisJCWtmcmVlKG9yYnVmZik7Cit9CisKKworLyogU2V0IHRoZSAic2VuZGluZyIgZmxhZy4gIFRoaXMgbXVzdCBiZSBhdG9taWMuICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXhfbG9jayhzdHJ1Y3QgYXhfZGlzcCAqYXgpCit7CisJbmV0aWZfc3RvcF9xdWV1ZShheC0+ZGV2KTsKK30KKworCisvKiBDbGVhciB0aGUgInNlbmRpbmciIGZsYWcuICBUaGlzIG11c3QgYmUgYXRvbWljLiAqLworc3RhdGljIGlubGluZSB2b2lkIGF4X3VubG9jayhzdHJ1Y3QgYXhfZGlzcCAqYXgpCit7CisJbmV0aWZfc3RhcnRfcXVldWUoYXgtPmRldik7Cit9CisKKy8qIFNlbmQgb25lIGNvbXBsZXRlbHkgZGVjYXBzdWxhdGVkIEFYLjI1IHBhY2tldCB0byB0aGUgQVguMjUgbGF5ZXIuICovCitzdGF0aWMgdm9pZCBheF9idW1wKHN0cnVjdCBheF9kaXNwICpheCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBjb3VudDsKKworCXNwaW5fbG9ja19iaCgmYXgtPmJ1ZmxvY2spOworCWlmIChheC0+cmJ1ZmZbMF0gPiAweDBmKSB7CisJCWlmIChheC0+cmJ1ZmZbMF0gJiAweDIwKSB7CisJCSAgICAgICAgYXgtPmNyY21vZGUgPSBDUkNfTU9ERV9GTEVYOworCQkJaWYgKGNoZWNrX2NyY19mbGV4KGF4LT5yYnVmZiwgYXgtPnJjb3VudCkgPCAwKSB7CisJCQkgICAgICAgIGF4LT5yeF9lcnJvcnMrKzsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlheC0+cmNvdW50IC09IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBkbDlzYXUgYnVnZml4OiB0aGUgdHJhaWxsaW5nIHR3byBieXRlcyBmbGV4bmV0IGNyYworICAgICAgICAgICAgICAgICAgICAgICAgICogd2lsbCBub3QgYmUgcGFzc2VkIHRvIHRoZSBrZXJuZWwuIHRodXMgd2UgaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gY29ycmVjdCB0aGUga2lzc3Bhcm0gc2lnbmF0dXJlLCBiZWNhdXNlIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbmRpY2F0ZXMgYSBjcmMgYnV0IHRoZXJlJ3Mgbm9uZQorCQkJICovCisgICAgICAgICAgICAgICAgICAgICAgICAqYXgtPnJidWZmICY9IH4weDIwOworCQl9CisgCX0KKwlzcGluX3VubG9ja19iaCgmYXgtPmJ1ZmxvY2spOworCisJY291bnQgPSBheC0+cmNvdW50OworCisJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKGNvdW50KSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIm1raXNzOiAlczogbWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsIGF4LT5kZXYtPm5hbWUpOworCQlheC0+cnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCisJc2tiLT5kZXYgICAgICA9IGF4LT5kZXY7CisJc3Bpbl9sb2NrX2JoKCZheC0+YnVmbG9jayk7CisJbWVtY3B5KHNrYl9wdXQoc2tiLGNvdW50KSwgYXgtPnJidWZmLCBjb3VudCk7CisJc3Bpbl91bmxvY2tfYmgoJmF4LT5idWZsb2NrKTsKKwlza2ItPm1hYy5yYXcgID0gc2tiLT5kYXRhOworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9BWDI1KTsKKwluZXRpZl9yeChza2IpOworCWF4LT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCWF4LT5yeF9wYWNrZXRzKys7CisJYXgtPnJ4X2J5dGVzKz1jb3VudDsKK30KKworLyogRW5jYXBzdWxhdGUgb25lIEFYLjI1IHBhY2tldCBhbmQgc3R1ZmYgaW50byBhIFRUWSBxdWV1ZS4gKi8KK3N0YXRpYyB2b2lkIGF4X2VuY2FwcyhzdHJ1Y3QgYXhfZGlzcCAqYXgsIHVuc2lnbmVkIGNoYXIgKmljcCwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpwOworCWludCBhY3R1YWwsIGNvdW50OworCisJaWYgKGF4LT5tdHUgIT0gYXgtPmRldi0+bXR1ICsgNzMpCS8qIFNvbWVvbmUgaGFzIGJlZW4gaWZjb25maWdnaW5nICovCisJCWF4X2NoYW5nZWRtdHUoYXgpOworCisJaWYgKGxlbiA+IGF4LT5tdHUpIHsJCS8qIFNpZ2gsIHNob3VsZG4ndCBvY2N1ciBCVVQgLi4uICovCisJCWxlbiA9IGF4LT5tdHU7CisJCXByaW50ayhLRVJOX0VSUiAibWtpc3M6ICVzOiB0cnVuY2F0aW5nIG92ZXJzaXplZCB0cmFuc21pdCBwYWNrZXQhXG4iLCBheC0+ZGV2LT5uYW1lKTsKKwkJYXgtPnR4X2Ryb3BwZWQrKzsKKwkJYXhfdW5sb2NrKGF4KTsKKwkJcmV0dXJuOworCX0KKworCXAgPSBpY3A7CisKKwlzcGluX2xvY2tfYmgoJmF4LT5idWZsb2NrKTsKKyAgICAgICAgc3dpdGNoIChheC0+Y3JjbW9kZSkgeworCSAgICAgICAgIHVuc2lnbmVkIHNob3J0IGNyYzsKKworCWNhc2UgQ1JDX01PREVfRkxFWDoKKwkgICAgICAgICAqcCB8PSAweDIwOworCSAgICAgICAgIGNyYyA9IGNhbGNfY3JjX2ZsZXgocCwgbGVuKTsKKwkJIGNvdW50ID0ga2lzc19lc2NfY3JjKHAsICh1bnNpZ25lZCBjaGFyICopYXgtPnhidWZmLCBjcmMsIGxlbisyKTsKKwkJIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgICAgICBjb3VudCA9IGtpc3NfZXNjKHAsICh1bnNpZ25lZCBjaGFyICopYXgtPnhidWZmLCBsZW4pOworCQkgYnJlYWs7CisJfQorCQorCWF4LT50dHktPmZsYWdzIHw9ICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApOworCWFjdHVhbCA9IGF4LT50dHktPmRyaXZlci0+d3JpdGUoYXgtPnR0eSwgYXgtPnhidWZmLCBjb3VudCk7CisJYXgtPnR4X3BhY2tldHMrKzsKKwlheC0+dHhfYnl0ZXMrPWFjdHVhbDsKKwlheC0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJYXgtPnhsZWZ0ID0gY291bnQgLSBhY3R1YWw7CisJYXgtPnhoZWFkID0gYXgtPnhidWZmICsgYWN0dWFsOworCisJc3Bpbl91bmxvY2tfYmgoJmF4LT5idWZsb2NrKTsKK30KKworLyoKKyAqIENhbGxlZCBieSB0aGUgZHJpdmVyIHdoZW4gdGhlcmUncyByb29tIGZvciBtb3JlIGRhdGEuICBJZiB3ZSBoYXZlCisgKiBtb3JlIHBhY2tldHMgdG8gc2VuZCwgd2Ugc2VuZCB0aGVtIGhlcmUuCisgKi8KK3N0YXRpYyB2b2lkIGF4MjVfd3JpdGVfd2FrZXVwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJaW50IGFjdHVhbDsKKwlzdHJ1Y3QgYXhfZGlzcCAqYXggPSAoc3RydWN0IGF4X2Rpc3AgKikgdHR5LT5kaXNjX2RhdGE7CisKKwkvKiBGaXJzdCBtYWtlIHN1cmUgd2UncmUgY29ubmVjdGVkLiAqLworCWlmIChheCA9PSBOVUxMIHx8IGF4LT5tYWdpYyAhPSBBWDI1X01BR0lDIHx8ICFuZXRpZl9ydW5uaW5nKGF4LT5kZXYpKQorCQlyZXR1cm47CisJaWYgKGF4LT54bGVmdCA8PSAwKSAgeworCQkvKiBOb3cgc2VyaWFsIGJ1ZmZlciBpcyBhbG1vc3QgZnJlZSAmIHdlIGNhbiBzdGFydAorCQkgKiB0cmFuc21pc3Npb24gb2YgYW5vdGhlciBwYWNrZXQKKwkJICovCisJCXR0eS0+ZmxhZ3MgJj0gfigxIDw8IFRUWV9ET19XUklURV9XQUtFVVApOworCisJCW5ldGlmX3dha2VfcXVldWUoYXgtPmRldik7CisJCXJldHVybjsKKwl9CisKKwlhY3R1YWwgPSB0dHktPmRyaXZlci0+d3JpdGUodHR5LCBheC0+eGhlYWQsIGF4LT54bGVmdCk7CisJYXgtPnhsZWZ0IC09IGFjdHVhbDsKKwlheC0+eGhlYWQgKz0gYWN0dWFsOworfQorCisvKiBFbmNhcHN1bGF0ZSBhbiBBWC4yNSBwYWNrZXQgYW5kIGtpY2sgaXQgaW50byBhIFRUWSBxdWV1ZS4gKi8KK3N0YXRpYyBpbnQgYXhfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBheF9kaXNwICpheCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkgIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJta2lzczogJXM6IHhtaXQgY2FsbCB3aGVuIGlmYWNlIGlzIGRvd25cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKKwkJLyoKKwkJICogTWF5IGJlIHdlIG11c3QgY2hlY2sgdHJhbnNtaXR0ZXIgdGltZW91dCBoZXJlID8KKwkJICogICAgICAxNCBPY3QgMTk5NCBEbWl0cnkgR29yb2RjaGFuaW4uCisJCSAqLworCQlpZiAoamlmZmllcyAtIGRldi0+dHJhbnNfc3RhcnQgIDwgMjAgKiBIWikgeworCQkJLyogMjAgc2VjIHRpbWVvdXQgbm90IHJlYWNoZWQgKi8KKwkJCXJldHVybiAxOworCQl9CisKKwkJcHJpbnRrKEtFUk5fRVJSICJta2lzczogJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgJXM/XG4iLCBkZXYtPm5hbWUsCisJCSAgICAgICAoYXgtPnR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIoYXgtPnR0eSkgfHwgYXgtPnhsZWZ0KSA/CisJCSAgICAgICAiYmFkIGxpbmUgcXVhbGl0eSIgOiAiZHJpdmVyIGVycm9yIik7CisKKwkJYXgtPnhsZWZ0ID0gMDsKKwkJYXgtPnR0eS0+ZmxhZ3MgJj0gfigxIDw8IFRUWV9ET19XUklURV9XQUtFVVApOworCQlheF91bmxvY2soYXgpOworCX0KKworCS8qIFdlIHdlcmUgbm90IGJ1c3ksIHNvIHdlIGFyZSBub3cuLi4gOi0pICovCisJaWYgKHNrYiAhPSBOVUxMKSB7CisJCWF4X2xvY2soYXgpOworCQlheF9lbmNhcHMoYXgsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlrZnJlZV9za2Ioc2tiKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX0FYMjUpIHx8IGRlZmluZWQoQ09ORklHX0FYMjVfTU9EVUxFKQorCisvKiBSZXR1cm4gdGhlIGZyYW1lIHR5cGUgSUQgKi8KK3N0YXRpYyBpbnQgYXhfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHR5cGUsCisJICB2b2lkICpkYWRkciwgdm9pZCAqc2FkZHIsIHVuc2lnbmVkIGxlbikKK3sKKyNpZmRlZiBDT05GSUdfSU5FVAorCWlmICh0eXBlICE9IGh0b25zKEVUSF9QX0FYMjUpKQorCQlyZXR1cm4gYXgyNV9lbmNhcHN1bGF0ZShza2IsIGRldiwgdHlwZSwgZGFkZHIsIHNhZGRyLCBsZW4pOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBheF9yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworI2lmZGVmIENPTkZJR19JTkVUCisJcmV0dXJuIGF4MjVfcmVidWlsZF9oZWFkZXIoc2tiKTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworI2VuZGlmCS8qIENPTkZJR197QVgyNSxBWDI1X01PRFVMRX0gKi8KKworLyogT3BlbiB0aGUgbG93LWxldmVsIHBhcnQgb2YgdGhlIEFYMjUgY2hhbm5lbC4gRWFzeSEgKi8KK3N0YXRpYyBpbnQgYXhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBheF9kaXNwICpheCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBsZW47CisKKwlpZiAoYXgtPnR0eSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIGZyYW1lIGJ1ZmZlcnM6CisJICoKKwkgKiByYnVmZglSZWNlaXZlIGJ1ZmZlci4KKwkgKiB4YnVmZglUcmFuc21pdCBidWZmZXIuCisJICovCisJbGVuID0gZGV2LT5tdHUgKiAyOworCisJLyoKKwkgKiBhbGxvdyBmb3IgYXJyaXZhbCBvZiBsYXJnZXIgVURQIHBhY2tldHMsIGV2ZW4gaWYgd2Ugc2F5IG5vdCB0bworCSAqIGFsc28gZml4ZXMgYSBidWcgaW4gd2hpY2ggU3VuT1Mgc2VuZHMgNTEyLWJ5dGUgcGFja2V0cyBldmVuIHdpdGgKKwkgKiBhbiBNU1Mgb2YgMTI4CisJICovCisJaWYgKGxlbiA8IDU3NiAqIDIpCisJCWxlbiA9IDU3NiAqIDI7CisKKwlpZiAoKGF4LT5yYnVmZiA9IGttYWxsb2MobGVuICsgNCwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCWdvdG8gbm9yYnVmZjsKKworCWlmICgoYXgtPnhidWZmID0ga21hbGxvYyhsZW4gKyA0LCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJZ290byBub3hidWZmOworCisJYXgtPm10dQkgICAgID0gZGV2LT5tdHUgKyA3MzsKKwlheC0+YnVmZnNpemUgPSBsZW47CisJYXgtPnJjb3VudCAgID0gMDsKKwlheC0+eGxlZnQgICAgPSAwOworCisJYXgtPmZsYWdzICAgJj0gKDEgPDwgQVhGX0lOVVNFKTsgICAgICAvKiBDbGVhciBFU0NBUEUgJiBFUlJPUiBmbGFncyAqLworCisJc3Bpbl9sb2NrX2luaXQoJmF4LT5idWZsb2NrKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7CisKK25veGJ1ZmY6CisJa2ZyZWUoYXgtPnJidWZmKTsKKworbm9yYnVmZjoKKwlyZXR1cm4gLUVOT01FTTsKK30KKworCisvKiBDbG9zZSB0aGUgbG93LWxldmVsIHBhcnQgb2YgdGhlIEFYMjUgY2hhbm5lbC4gRWFzeSEgKi8KK3N0YXRpYyBpbnQgYXhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXhfZGlzcCAqYXggPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKGF4LT50dHkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWF4LT50dHktPmZsYWdzICY9IH4oMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF4MjVfcmVjZWl2ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmV0dXJuIDY1NTM2OyAgLyogV2UgY2FuIGhhbmRsZSBhbiBpbmZpbml0ZSBhbW91bnQgb2YgZGF0YS4gOi0pICovCit9CisKKy8qCisgKiBIYW5kbGUgdGhlICdyZWNlaXZlciBkYXRhIHJlYWR5JyBpbnRlcnJ1cHQuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgJ3R0eV9pbycgbW9kdWxlIGluIHRoZSBrZXJuZWwgd2hlbgorICogYSBibG9jayBvZiBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkLCB3aGljaCBjYW4gbm93IGJlIGRlY2Fwc3VsYXRlZAorICogYW5kIHNlbnQgb24gdG8gdGhlIEFYLjI1IGxheWVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgKi8KK3N0YXRpYyB2b2lkIGF4MjVfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsIGNoYXIgKmZwLCBpbnQgY291bnQpCit7CisJc3RydWN0IGF4X2Rpc3AgKmF4ID0gKHN0cnVjdCBheF9kaXNwICopIHR0eS0+ZGlzY19kYXRhOworCisJaWYgKGF4ID09IE5VTEwgfHwgYXgtPm1hZ2ljICE9IEFYMjVfTUFHSUMgfHwgIW5ldGlmX3J1bm5pbmcoYXgtPmRldikpCisJCXJldHVybjsKKworCS8qCisJICogQXJnaCEgbXR1IGNoYW5nZSB0aW1lISAtIGNvc3RzIHVzIHRoZSBwYWNrZXQgcGFydCByZWNlaXZlZAorCSAqIGF0IHRoZSBjaGFuZ2UKKwkgKi8KKwlpZiAoYXgtPm10dSAhPSBheC0+ZGV2LT5tdHUgKyA3MykKKwkJYXhfY2hhbmdlZG10dShheCk7CisKKwkvKiBSZWFkIHRoZSBjaGFyYWN0ZXJzIG91dCBvZiB0aGUgYnVmZmVyICovCisJd2hpbGUgKGNvdW50LS0pIHsKKwkJaWYgKGZwICE9IE5VTEwgJiYgKmZwKyspIHsKKwkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChBWEZfRVJST1IsICZheC0+ZmxhZ3MpKQorCQkJCWF4LT5yeF9lcnJvcnMrKzsKKwkJCWNwKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWtpc3NfdW5lc2MoYXgsICpjcCsrKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXgyNV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGF4X2Rpc3AgKmF4ID0gKHN0cnVjdCBheF9kaXNwICopIHR0eS0+ZGlzY19kYXRhOworCWludCBlcnI7CisKKwkvKiBGaXJzdCBtYWtlIHN1cmUgd2UncmUgbm90IGFscmVhZHkgY29ubmVjdGVkLiAqLworCWlmIChheCAmJiBheC0+bWFnaWMgPT0gQVgyNV9NQUdJQykKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwkvKiBPSy4gIEZpbmQgYSBmcmVlIEFYMjUgY2hhbm5lbCB0byB1c2UuICovCisJaWYgKChheCA9IGF4X2FsbG9jKCkpID09IE5VTEwpCisJCXJldHVybiAtRU5GSUxFOworCisJYXgtPnR0eSA9IHR0eTsKKwl0dHktPmRpc2NfZGF0YSA9IGF4OworCisJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKKworCS8qIFJlc3RvcmUgZGVmYXVsdCBzZXR0aW5ncyAqLworCWF4LT5kZXYtPnR5cGUgPSBBUlBIUkRfQVgyNTsKKworCS8qIFBlcmZvcm0gdGhlIGxvdy1sZXZlbCBBWDI1IGluaXRpYWxpemF0aW9uLiAqLworCWlmICgoZXJyID0gYXhfb3BlbihheC0+ZGV2KSkpCisJCXJldHVybiBlcnI7CisKKwkvKiBEb25lLiAgV2UgaGF2ZSBsaW5rZWQgdGhlIFRUWSBsaW5lIHRvIGEgY2hhbm5lbC4gKi8KKwlyZXR1cm4gYXgtPmRldi0+YmFzZV9hZGRyOworfQorCitzdGF0aWMgdm9pZCBheDI1X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGF4X2Rpc3AgKmF4ID0gKHN0cnVjdCBheF9kaXNwICopIHR0eS0+ZGlzY19kYXRhOworCisJLyogRmlyc3QgbWFrZSBzdXJlIHdlJ3JlIGNvbm5lY3RlZC4gKi8KKwlpZiAoYXggPT0gTlVMTCB8fCBheC0+bWFnaWMgIT0gQVgyNV9NQUdJQykKKwkJcmV0dXJuOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoYXgtPmRldik7CisKKwl0dHktPmRpc2NfZGF0YSA9IE5VTEw7CisJYXgtPnR0eSAgICAgICAgPSBOVUxMOworCisJYXhfZnJlZShheCk7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpheF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IGF4X2Rpc3AgKmF4ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCisJc3RhdHMucnhfcGFja2V0cyAgICAgPSBheC0+cnhfcGFja2V0czsKKwlzdGF0cy50eF9wYWNrZXRzICAgICA9IGF4LT50eF9wYWNrZXRzOworCXN0YXRzLnJ4X2J5dGVzCSAgICAgPSBheC0+cnhfYnl0ZXM7CisJc3RhdHMudHhfYnl0ZXMgICAgICAgPSBheC0+dHhfYnl0ZXM7CisJc3RhdHMucnhfZHJvcHBlZCAgICAgPSBheC0+cnhfZHJvcHBlZDsKKwlzdGF0cy50eF9kcm9wcGVkICAgICA9IGF4LT50eF9kcm9wcGVkOworCXN0YXRzLnR4X2Vycm9ycyAgICAgID0gYXgtPnR4X2Vycm9yczsKKwlzdGF0cy5yeF9lcnJvcnMgICAgICA9IGF4LT5yeF9lcnJvcnM7CisJc3RhdHMucnhfb3Zlcl9lcnJvcnMgPSBheC0+cnhfb3Zlcl9lcnJvcnM7CisKKwlyZXR1cm4gJnN0YXRzOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJICAgU1RBTkRBUkQgRU5DQVBTVUxBVElPTgkgICAgICAgIAkgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBraXNzX2VzYyh1bnNpZ25lZCBjaGFyICpzLCB1bnNpZ25lZCBjaGFyICpkLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnB0ciA9IGQ7CisJdW5zaWduZWQgY2hhciBjOworCisJLyoKKwkgKiBTZW5kIGFuIGluaXRpYWwgRU5EIGNoYXJhY3RlciB0byBmbHVzaCBvdXQgYW55CisJICogZGF0YSB0aGF0IG1heSBoYXZlIGFjY3VtdWxhdGVkIGluIHRoZSByZWNlaXZlcgorCSAqIGR1ZSB0byBsaW5lIG5vaXNlLgorCSAqLworCisJKnB0cisrID0gRU5EOworCisJd2hpbGUgKGxlbi0tID4gMCkgeworCQlzd2l0Y2ggKGMgPSAqcysrKSB7CisJCQljYXNlIEVORDoKKwkJCQkqcHRyKysgPSBFU0M7CisJCQkJKnB0cisrID0gRVNDX0VORDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRVNDOgorCQkJCSpwdHIrKyA9IEVTQzsKKwkJCQkqcHRyKysgPSBFU0NfRVNDOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkqcHRyKysgPSBjOworCQkJCWJyZWFrOworCQl9CisJfQorCisJKnB0cisrID0gRU5EOworCisJcmV0dXJuIHB0ciAtIGQ7Cit9CisKKy8qCisgKiBNVzoKKyAqIE9LIGl0cyB1Z2x5LCBidXQgdGVsbCBtZSBhIGJldHRlciBzb2x1dGlvbiB3aXRob3V0IGNvcHlpbmcgdGhlCisgKiBwYWNrZXQgdG8gYSB0ZW1wb3JhcnkgYnVmZmVyIDotKQorICovCitzdGF0aWMgaW50IGtpc3NfZXNjX2NyYyh1bnNpZ25lZCBjaGFyICpzLCB1bnNpZ25lZCBjaGFyICpkLCB1bnNpZ25lZCBzaG9ydCBjcmMsIGludCBsZW4pCit7CisJdW5zaWduZWQgY2hhciAqcHRyID0gZDsKKwl1bnNpZ25lZCBjaGFyIGM9MDsKKworCSpwdHIrKyA9IEVORDsKKwl3aGlsZSAobGVuID4gMCkgeworCQlpZiAobGVuID4gMikgCisJCQljID0gKnMrKzsKKwkJZWxzZSBpZiAobGVuID4gMSkKKwkJCWMgPSBjcmMgPj4gODsKKwkJZWxzZSBpZiAobGVuID4gMCkKKwkJCWMgPSBjcmMgJiAweGZmOworCisJCWxlbi0tOworCisJCXN3aXRjaCAoYykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFTkQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHIrKyA9IEVTQzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cisrID0gRVNDX0VORDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEVTQzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cisrID0gRVNDOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyKysgPSBFU0NfRVNDOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHIrKyA9IGM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQl9CisJfQorCSpwdHIrKyA9IEVORDsKKwlyZXR1cm4gcHRyIC0gZDsJCQorfQorCitzdGF0aWMgdm9pZCBraXNzX3VuZXNjKHN0cnVjdCBheF9kaXNwICpheCwgdW5zaWduZWQgY2hhciBzKQoreworCXN3aXRjaCAocykgeworCQljYXNlIEVORDoKKwkJCS8qIGRyb3Aga2VlcHRlc3QgYml0ID0gVlNWICovCisJCQlpZiAodGVzdF9iaXQoQVhGX0tFRVBURVNULCAmYXgtPmZsYWdzKSkKKwkJCQljbGVhcl9iaXQoQVhGX0tFRVBURVNULCAmYXgtPmZsYWdzKTsKKworCQkJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoQVhGX0VSUk9SLCAmYXgtPmZsYWdzKSAmJiAoYXgtPnJjb3VudCA+IDIpKQorCQkJCWF4X2J1bXAoYXgpOworCisJCQljbGVhcl9iaXQoQVhGX0VTQ0FQRSwgJmF4LT5mbGFncyk7CisJCQlheC0+cmNvdW50ID0gMDsKKwkJCXJldHVybjsKKworCQljYXNlIEVTQzoKKwkJCXNldF9iaXQoQVhGX0VTQ0FQRSwgJmF4LT5mbGFncyk7CisJCQlyZXR1cm47CisJCWNhc2UgRVNDX0VTQzoKKwkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQVhGX0VTQ0FQRSwgJmF4LT5mbGFncykpCisJCQkJcyA9IEVTQzsKKwkJCWJyZWFrOworCQljYXNlIEVTQ19FTkQ6CisJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEFYRl9FU0NBUEUsICZheC0+ZmxhZ3MpKQorCQkJCXMgPSBFTkQ7CisJCQlicmVhazsKKwl9CisKKwlzcGluX2xvY2tfYmgoJmF4LT5idWZsb2NrKTsKKwlpZiAoIXRlc3RfYml0KEFYRl9FUlJPUiwgJmF4LT5mbGFncykpIHsKKwkJaWYgKGF4LT5yY291bnQgPCBheC0+YnVmZnNpemUpIHsKKwkJCWF4LT5yYnVmZltheC0+cmNvdW50KytdID0gczsKKwkJCXNwaW5fdW5sb2NrX2JoKCZheC0+YnVmbG9jayk7CisJCQlyZXR1cm47CisJCX0KKworCQlheC0+cnhfb3Zlcl9lcnJvcnMrKzsKKwkJc2V0X2JpdChBWEZfRVJST1IsICZheC0+ZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19iaCgmYXgtPmJ1ZmxvY2spOworfQorCisKK3N0YXRpYyBpbnQgYXhfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgX191c2VyICphZGRyKQoreworCWlmIChjb3B5X2Zyb21fdXNlcihkZXYtPmRldl9hZGRyLCBhZGRyLCBBWDI1X0FERFJfTEVOKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXhfc2V0X2Rldl9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBzb2NrYWRkciAqc2EgPSBhZGRyOworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHNhLT5zYV9kYXRhLCBBWDI1X0FERFJfTEVOKTsKKworCXJldHVybiAwOworfQorCisKKy8qIFBlcmZvcm0gSS9PIGNvbnRyb2wgb24gYW4gYWN0aXZlIGF4MjUgY2hhbm5lbC4gKi8KK3N0YXRpYyBpbnQgYXgyNV9kaXNwX2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHZvaWQgKmZpbGUsIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGF4X2Rpc3AgKmF4ID0gKHN0cnVjdCBheF9kaXNwICopIHR0eS0+ZGlzY19kYXRhOworCXVuc2lnbmVkIGludCB0bXA7CisKKwkvKiBGaXJzdCBtYWtlIHN1cmUgd2UncmUgY29ubmVjdGVkLiAqLworCWlmIChheCA9PSBOVUxMIHx8IGF4LT5tYWdpYyAhPSBBWDI1X01BR0lDKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoY21kKSB7CisJIAljYXNlIFNJT0NHSUZOQU1FOgorCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsIGF4LT5kZXYtPm5hbWUsIHN0cmxlbihheC0+ZGV2LT5uYW1lKSArIDEpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTSU9DR0lGRU5DQVA6CisJCQlyZXR1cm4gcHV0X3VzZXIoNCwgKGludCBfX3VzZXIgKilhcmcpOworCisJCWNhc2UgU0lPQ1NJRkVOQ0FQOgorCQkJaWYgKGdldF91c2VyKHRtcCwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYXgtPm1vZGUgPSB0bXA7CisJCQlheC0+ZGV2LT5hZGRyX2xlbiAgICAgICAgPSBBWDI1X0FERFJfTEVOOwkgIC8qIHNpemVvZiBhbiBBWC4yNSBhZGRyICovCisJCQlheC0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBBWDI1X0tJU1NfSEVBREVSX0xFTiArIEFYMjVfTUFYX0hFQURFUl9MRU4gKyAzOworCQkJYXgtPmRldi0+dHlwZSAgICAgICAgICAgID0gQVJQSFJEX0FYMjU7CisJCQlyZXR1cm4gMDsKKworCQkgY2FzZSBTSU9DU0lGSFdBRERSOgorCQkJcmV0dXJuIGF4X3NldF9tYWNfYWRkcmVzcyhheC0+ZGV2LCBhcmcpOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KK30KKworc3RhdGljIGludCBheF9vcGVuX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBheF9kaXNwICpheCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoYXgtPnR0eSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAwOworfQorCisKKy8qIEluaXRpYWxpemUgdGhlIGRyaXZlci4gIENhbGxlZCBieSBuZXR3b3JrIHN0YXJ0dXAuICovCitzdGF0aWMgaW50IGF4MjVfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBheF9kaXNwICpheCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzdGF0aWMgY2hhciBheDI1X2JjYXN0W0FYMjVfQUREUl9MRU5dID0KKwkJeydRJzw8MSwnUyc8PDEsJ1QnPDwxLCcgJzw8MSwnICc8PDEsJyAnPDwxLCcwJzw8MX07CisJc3RhdGljIGNoYXIgYXgyNV90ZXN0W0FYMjVfQUREUl9MRU5dID0KKwkJeydMJzw8MSwnSSc8PDEsJ04nPDwxLCdVJzw8MSwnWCc8PDEsJyAnPDwxLCcxJzw8MX07CisKKwlpZiAoYXggPT0gTlVMTCkJCS8qIEFsbG9jYXRpb24gZmFpbGVkID8/ICovCisJCXJldHVybiAtRU5PREVWOworCisJLyogU2V0IHVwIHRoZSAiQVgyNSBDb250cm9sIEJsb2NrIi4gKEFuZCBjbGVhciBzdGF0aXN0aWNzKSAqLworCW1lbXNldChheCwgMCwgc2l6ZW9mIChzdHJ1Y3QgYXhfZGlzcCkpOworCWF4LT5tYWdpYyAgPSBBWDI1X01BR0lDOworCWF4LT5kZXYJICAgPSBkZXY7CisKKwkvKiBGaW5pc2ggc2V0dGluZyB1cCB0aGUgREVWSUNFIGluZm8uICovCisJZGV2LT5tdHUgICAgICAgICAgICAgPSBBWF9NVFU7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBheF94bWl0OworCWRldi0+b3BlbiAgICAgICAgICAgID0gYXhfb3Blbl9kZXY7CisJZGV2LT5zdG9wICAgICAgICAgICAgPSBheF9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cwkgICAgID0gYXhfZ2V0X3N0YXRzOworCWRldi0+c2V0X21hY19hZGRyZXNzID0gYXhfc2V0X2Rldl9tYWNfYWRkcmVzczsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IDA7CisJZGV2LT5hZGRyX2xlbiAgICAgICAgPSAwOworCWRldi0+dHlwZSAgICAgICAgICAgID0gQVJQSFJEX0FYMjU7CisJZGV2LT50eF9xdWV1ZV9sZW4gICAgPSAxMDsKKwlkZXYtPmhhcmRfaGVhZGVyICAgICA9IGF4X2hlYWRlcjsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyICA9IGF4X3JlYnVpbGRfaGVhZGVyOworCisJbWVtY3B5KGRldi0+YnJvYWRjYXN0LCBheDI1X2JjYXN0LCBBWDI1X0FERFJfTEVOKTsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgIGF4MjVfdGVzdCwgIEFYMjVfQUREUl9MRU4pOworCisJLyogTmV3LXN0eWxlIGZsYWdzLiAqLworCWRldi0+ZmxhZ3MgICAgICA9IElGRl9CUk9BRENBU1QgfCBJRkZfTVVMVElDQVNUOworCisJcmV0dXJuIDA7Cit9CisKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoJCQlJbml0IE1LSVNTIGRyaXZlcgkJCSAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyBpbnQgX19pbml0IG1raXNzX2luaXRfZHJpdmVyKHZvaWQpCit7CisJaW50IHN0YXR1czsKKworCXByaW50ayhiYW5uZXIpOworCisJaWYgKGF4MjVfbWF4ZGV2IDwgNCkKKwkgIGF4MjVfbWF4ZGV2ID0gNDsgLyogU2FuaXR5ICovCisKKwlpZiAoKGF4MjVfY3RybHMgPSBrbWFsbG9jKHNpemVvZih2b2lkICopICogYXgyNV9tYXhkZXYsIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWtpc3M6IENhbid0IGFsbG9jYXRlIGF4MjVfY3RybHNbXSBhcnJheSFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBDbGVhciB0aGUgcG9pbnRlciBhcnJheSwgd2UgYWxsb2NhdGUgZGV2aWNlcyB3aGVuIHdlIG5lZWQgdGhlbSAqLworCW1lbXNldChheDI1X2N0cmxzLCAwLCBzaXplb2Yodm9pZCopICogYXgyNV9tYXhkZXYpOyAvKiBQb2ludGVycyAqLworCisJLyogRmlsbCBpbiBvdXIgbGluZSBwcm90b2NvbCBkaXNjaXBsaW5lLCBhbmQgcmVnaXN0ZXIgaXQgKi8KKwlheF9sZGlzYy5tYWdpYwkJPSBUVFlfTERJU0NfTUFHSUM7CisJYXhfbGRpc2MubmFtZQkJPSAibWtpc3MiOworCWF4X2xkaXNjLm9wZW4JCT0gYXgyNV9vcGVuOworCWF4X2xkaXNjLmNsb3NlCQk9IGF4MjVfY2xvc2U7CisJYXhfbGRpc2MuaW9jdGwJCT0gKGludCAoKikoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKiwKKwkJCQkJdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKSlheDI1X2Rpc3BfaW9jdGw7CisJYXhfbGRpc2MucmVjZWl2ZV9idWYJPSBheDI1X3JlY2VpdmVfYnVmOworCWF4X2xkaXNjLnJlY2VpdmVfcm9vbQk9IGF4MjVfcmVjZWl2ZV9yb29tOworCWF4X2xkaXNjLndyaXRlX3dha2V1cAk9IGF4MjVfd3JpdGVfd2FrZXVwOworCisJaWYgKChzdGF0dXMgPSB0dHlfcmVnaXN0ZXJfbGRpc2MoTl9BWDI1LCAmYXhfbGRpc2MpKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWtpc3M6IGNhbid0IHJlZ2lzdGVyIGxpbmUgZGlzY2lwbGluZSAoZXJyID0gJWQpXG4iLCBzdGF0dXMpOworCQlrZnJlZShheDI1X2N0cmxzKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1raXNzX2V4aXRfZHJpdmVyKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYXgyNV9tYXhkZXY7IGkrKykgeworCQlpZiAoYXgyNV9jdHJsc1tpXSkgeworCQkJLyoKKwkJCSogVlNWID0gaWYgZGV2LT5zdGFydD09MCwgdGhlbiBkZXZpY2UKKwkJCSogdW5yZWdpc3RlcmVkIHdoaWxlIGNsb3NlIHByb2MuCisJCQkqLworCQkJaWYgKG5ldGlmX3J1bm5pbmcoJmF4MjVfY3RybHNbaV0tPmRldikpCisJCQkJdW5yZWdpc3Rlcl9uZXRkZXYoJmF4MjVfY3RybHNbaV0tPmRldik7CisJCQlrZnJlZShheDI1X2N0cmxzW2ldKTsKKwkJfQorCX0KKworCWtmcmVlKGF4MjVfY3RybHMpOworCWF4MjVfY3RybHMgPSBOVUxMOworCisJaWYgKChpID0gdHR5X3JlZ2lzdGVyX2xkaXNjKE5fQVgyNSwgTlVMTCkpKQorCQlwcmludGsoS0VSTl9FUlIgIm1raXNzOiBjYW4ndCB1bnJlZ2lzdGVyIGxpbmUgZGlzY2lwbGluZSAoZXJyID0gJWQpXG4iLCBpKTsKK30KKworTU9EVUxFX0FVVEhPUigiSGFucyBBbGJhcyBQRTFBWVggPGhhbnNAZXNyYWMuZWxlLnR1ZS5ubD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiS0lTUyBkcml2ZXIgZm9yIEFYLjI1IG92ZXIgVFRZcyIpOworTU9EVUxFX1BBUk0oYXgyNV9tYXhkZXYsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKGF4MjVfbWF4ZGV2LCAibnVtYmVyIG9mIE1LSVNTIGRldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19MRElTQyhOX0FYMjUpOworbW9kdWxlX2luaXQobWtpc3NfaW5pdF9kcml2ZXIpOworbW9kdWxlX2V4aXQobWtpc3NfZXhpdF9kcml2ZXIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9ta2lzcy5oIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vbWtpc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWI3MDA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vbWtpc3MuaApAQCAtMCwwICsxLDYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJRGVmaW5lcyBmb3IgdGhlIE11bHRpLUtJU1MgZHJpdmVyLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQVgyNV9NQVhERVYJMTYJCS8qIE1BWCBudW1iZXIgb2YgQVgyNSBjaGFubmVsczsKKwkJCQkJICAgVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoCisJCQkJCSAgIGluc21vZCAtb2F4MjVfbWF4ZGV2PW5ubgkqLworI2RlZmluZSBBWF9NVFUJCTIzNgkKKworLyogU0xJUC9LSVNTIHByb3RvY29sIGNoYXJhY3RlcnMuICovCisjZGVmaW5lIEVORCAgICAgICAgICAgICAwMzAwCQkvKiBpbmRpY2F0ZXMgZW5kIG9mIGZyYW1lCSovCisjZGVmaW5lIEVTQyAgICAgICAgICAgICAwMzMzCQkvKiBpbmRpY2F0ZXMgYnl0ZSBzdHVmZmluZwkqLworI2RlZmluZSBFU0NfRU5EICAgICAgICAgMDMzNAkJLyogRVNDIEVTQ19FTkQgbWVhbnMgRU5EICdkYXRhJwkqLworI2RlZmluZSBFU0NfRVNDICAgICAgICAgMDMzNQkJLyogRVNDIEVTQ19FU0MgbWVhbnMgRVNDICdkYXRhJwkqLworCitzdHJ1Y3QgYXhfZGlzcCB7CisJaW50ICAgICAgICAgICAgICAgIG1hZ2ljOworCisJLyogVmFyaW91cyBmaWVsZHMuICovCisJc3RydWN0IHR0eV9zdHJ1Y3QgICp0dHk7CQkvKiBwdHIgdG8gVFRZIHN0cnVjdHVyZQkJKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAgICAgICpkZXY7CQkvKiBlYXN5IGZvciBpbnRyIGhhbmRsaW5nCSovCisKKwkvKiBUaGVzZSBhcmUgcG9pbnRlcnMgdG8gdGhlIG1hbGxvYygpZWQgZnJhbWUgYnVmZmVycy4gKi8KKwl1bnNpZ25lZCBjaGFyICAgICAgKnJidWZmOwkJLyogcmVjZWl2ZXIgYnVmZmVyCQkqLworCWludCAgICAgICAgICAgICAgICByY291bnQ7CQkvKiByZWNlaXZlZCBjaGFycyBjb3VudGVyICAgICAgICovCisJdW5zaWduZWQgY2hhciAgICAgICp4YnVmZjsJCS8qIHRyYW5zbWl0dGVyIGJ1ZmZlcgkJKi8KKwl1bnNpZ25lZCBjaGFyICAgICAgKnhoZWFkOwkJLyogcG9pbnRlciB0byBuZXh0IGJ5dGUgdG8gWE1JVCAqLworCWludCAgICAgICAgICAgICAgICB4bGVmdDsJCS8qIGJ5dGVzIGxlZnQgaW4gWE1JVCBxdWV1ZSAgICAgKi8KKworCS8qIFNMSVAgaW50ZXJmYWNlIHN0YXRpc3RpY3MuICovCisJdW5zaWduZWQgbG9uZyAgICAgIHJ4X3BhY2tldHM7CQkvKiBpbmJvdW5kIGZyYW1lcyBjb3VudGVyCSovCisJdW5zaWduZWQgbG9uZyAgICAgIHR4X3BhY2tldHM7CQkvKiBvdXRib3VuZCBmcmFtZXMgY291bnRlciAgICAgICovCisJdW5zaWduZWQgbG9uZyAgICAgIHJ4X2J5dGVzOwkJLyogaW5ib3VuZCBieXRlcyBjb3VudGVyICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgICAgICB0eF9ieXRlczsJCS8qIG91dGJvdW5kIGJ5dGVzIGNvdW50ZXIgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nICAgICAgcnhfZXJyb3JzOwkJLyogUGFyaXR5LCBldGMuIGVycm9ycyAgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgICAgICB0eF9lcnJvcnM7CQkvKiBQbGFubmVkIHN0dWZmICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgbG9uZyAgICAgIHJ4X2Ryb3BwZWQ7CQkvKiBObyBtZW1vcnkgZm9yIHNrYiAgICAgICAgICAgICovCisJdW5zaWduZWQgbG9uZyAgICAgIHR4X2Ryb3BwZWQ7CQkvKiBXaGVuIE1UVSBjaGFuZ2UgICAgICAgICAgICAgICovCisJdW5zaWduZWQgbG9uZyAgICAgIHJ4X292ZXJfZXJyb3JzOwkvKiBGcmFtZSBiaWdnZXIgdGhlbiBTTElQIGJ1Zi4gICovCisKKwkvKiBEZXRhaWxlZCBTTElQIHN0YXRpc3RpY3MuICovCisJaW50ICAgICAgICAgICAgICAgICBtdHU7CQkvKiBPdXIgbXR1ICh0byBzcG90IGNoYW5nZXMhKSAgICovCisJaW50ICAgICAgICAgICAgICAgICBidWZmc2l6ZTsJCS8qIE1heCBidWZmZXJzIHNpemVzICAgICAgICAgICAgKi8KKworCisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOwkJLyogRmxhZyB2YWx1ZXMvIG1vZGUgZXRjCSovCisJCQkJCS8qIGxvbmcgcmVxJ2Q6IHVzZWQgYnkgc2V0X2JpdCAtLVJSICovCisjZGVmaW5lIEFYRl9JTlVTRQkwCQkvKiBDaGFubmVsIGluIHVzZSAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFYRl9FU0NBUEUJMSAgICAgICAgICAgICAgIC8qIEVTQyByZWNlaXZlZCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQVhGX0VSUk9SCTIgICAgICAgICAgICAgICAvKiBQYXJpdHksIGV0Yy4gZXJyb3IgICAgICAgICAgICovCisjZGVmaW5lIEFYRl9LRUVQVEVTVAkzCQkvKiBLZWVwYWxpdmUgdGVzdCBmbGFnCQkqLworI2RlZmluZSBBWEZfT1VUV0FJVAk0CQkvKiBpcyBvdXRwYWNrZXQgd2FzIGZsYWcJKi8KKworCWludCAgICAgICAgICAgICAgICAgbW9kZTsKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICBjcmNtb2RlOyAgICAvKiBNVzogZm9yIEZsZXhOZXQsIFNNQUNLIGV0Yy4gICovIAorI2RlZmluZSBDUkNfTU9ERV9OT05FICAgMAorI2RlZmluZSBDUkNfTU9ERV9GTEVYICAgMQorI2RlZmluZSBDUkNfTU9ERV9TTUFDSyAgMgorCXNwaW5sb2NrX3QgICAgICAgICAgYnVmbG9jazsJLyogbG9jayBmb3IgcmJ1ZiBhbmQgeGJ1ZiAqLworfTsKKworI2RlZmluZSBBWDI1X01BR0lDCQkweDUzMTYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3NjYy5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vc2NjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U5ZTdhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3NjYy5jCkBAIC0wLDAgKzEsMjE5MSBAQAorI2RlZmluZSBSQ1NfSUQgIiRJZDogc2NjLmMsdiAxLjc1IDE5OTgvMTEvMDQgMTU6MTU6MDEganJldXRlciBFeHAganJldXRlciAkIgorCisjZGVmaW5lIFZFUlNJT04gIjMuMCIKKworLyoKKyAqIFBsZWFzZSB1c2Ugejg1MzBkcnYtdXRpbHMtMy4wIHdpdGggdGhpcyB2ZXJzaW9uLgorICogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBZb3UgY2FuIGZpbmQgYSBzdWJzZXQgb2YgdGhlIGRvY3VtZW50YXRpb24gaW4gCisgKiBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvejg1MzBkcnYudHh0LgorICovCisKKy8qCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKiAgIFNDQy5DIC0gTGludXggZHJpdmVyIGZvciBaODUzMCBiYXNlZCBIRExDIGNhcmRzIGZvciBBWC4yNSAgICAgICoKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKworICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCUNvcHlyaWdodCAoYykgMTk5MywgMjAwMCBKb2VyZyBSZXV0ZXIgREwxQktFCisKKwlwb3J0aW9ucyAoYykgMTk5MyBHdWlkbyB0ZW4gRG9sbGUgUEUxTk5aCisKKyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAKKyAgIFRoZSBkcml2ZXIgYW5kIHRoZSBwcm9ncmFtcyBpbiB0aGUgYXJjaGl2ZSBhcmUgVU5ERVIgQ09OU1RSVUNUSU9OLgorICAgVGhlIGNvZGUgaXMgbGlrZWx5IHRvIGZhaWwsIGFuZCBzbyB5b3VyIGtlcm5lbCBjb3VsZCAtLS0gZXZlbiAKKyAgIGEgd2hvbGUgbmV0d29yay4gCisKKyAgIFRoaXMgZHJpdmVyIGlzIGludGVuZGVkIGZvciBBbWF0ZXVyIFJhZGlvIHVzZS4gSWYgeW91IGFyZSBydW5uaW5nIGl0CisgICBmb3IgY29tbWVyY2lhbCBwdXJwb3NlcywgcGxlYXNlIGRyb3AgbWUgYSBub3RlLiBJIGFtIG5vc3kuLi4KKworICAgLi4uQlVUOgorIAorICAgISBZb3UgIG0gdSBzIHQgIHJlY29nbml6ZSB0aGUgYXBwcm9wcmlhdGUgbGVnaXNsYXRpb25zIG9mIHlvdXIgY291bnRyeSAhCisgICAhIGJlZm9yZSB5b3UgY29ubmVjdCBhIHJhZGlvIHRvIHRoZSBTQ0MgYm9hcmQgYW5kIHN0YXJ0IHRvIHRyYW5zbWl0IG9yICEKKyAgICEgcmVjZWl2ZS4gVGhlIEdQTCBhbGxvd3MgeW91IHRvIHVzZSB0aGUgIGQgciBpIHYgZSByLCAgTk9UIHRoZSBSQURJTyEgIQorCisgICBGb3Igbm9uLUFtYXRldXItUmFkaW8gdXNlIHBsZWFzZSBub3RlIHRoYXQgeW91IG1pZ2h0IG5lZWQgYSBzcGVjaWFsCisgICBhbGxvd2FuY2UvbGljZW5jZSBmcm9tIHRoZSBkZXNpZ25lciBvZiB0aGUgU0NDIEJvYXJkIGFuZC9vciB0aGUKKyAgIE1PREVNLiAKKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgCisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIChtb2RpZmllZCkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisgICBkZWxpdmVyZWQgd2l0aCB0aGUgTGludXgga2VybmVsIHNvdXJjZS4KKyAgIAorICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBmaW5kIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW4gCisgICAvdXNyL3NyYy9saW51eC9DT1BZSU5HOyAKKyAgIAorICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisKKwkJCisgICBJbmNvbXBsZXRlIGhpc3Rvcnkgb2Ygejg1MzBkcnY6CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIDE5OTQtMDktMTMJc3RhcnRlZCB0byB3cml0ZSB0aGUgZHJpdmVyLCByZXNjdWVkIG1vc3Qgb2YgbXkgb3duCisJCWNvZGUgKGFuZCBIYW5zIEFsYmxhcycgbWVtb3J5IGJ1ZmZlciBwb29sIGNvbmNlcHQpIGZyb20gCisJCWFuIGVhcmxpZXIgcHJvamVjdCAic2NjZHJ2IiB3aGljaCB3YXMgaW5pdGlhdGVkIGJ5IAorCQlHdWlkbyB0ZW4gRG9sbGUuIE5vdCBtdWNoIG9mIHRoZSBvbGQgZHJpdmVyIHN1cnZpdmVkLCAKKwkJdGhvdWdoLiBUaGUgZmlyc3QgdmVyc2lvbiBJIHB1dCBteSBoYW5kcyBvbiB3YXMgc2NjZHJ2MS4zCisJCWZyb20gQXVndXN0IDE5OTMuIFRoZSBtZW1vcnkgYnVmZmVyIHBvb2wgY29uY2VwdAorCQlhcHBlYXJlZCBpbiBhbiB1bmF1dGhvcml6ZWQgc2NjZHJ2IHZlcnNpb24gKDEuNSkgZnJvbQorCQlBdWd1c3QgMTk5NC4KKworICAgMTk5NS0wMS0zMQljaGFuZ2VkIGNvcHlyaWdodCBub3RpY2UgdG8gR1BMIHdpdGhvdXQgbGltaXRhdGlvbnMuCisgICAKKyAgICAgLgorICAgICAuCTxTTklQPgorICAgICAuCisgICAJCSAgCisgICAxOTk2LTEwLTA1CU5ldyBzZW1lc3RlciwgbmV3IGRyaXZlci4uLiAKKworICAgCQkgICogS0lTUyBUTkMgZW11bGF0b3IgcmVtb3ZlZCAoVFRZIGRyaXZlcikKKyAgIAkJICAqIFNvdXJjZSBtb3ZlZCB0byBkcml2ZXJzL25ldC8KKyAgIAkJICAqIEluY2x1ZGVzIFo4NTMwIGRlZmluZXMgZnJvbSBkcml2ZXJzL25ldC96ODUzMC5oCisgICAJCSAgKiBVc2VzIHNrX2J1ZmZlciBtZW1vcnkgbWFuYWdlbWVudAorICAgCQkgICogUmVkdWNlZCBvdmVyaGVhZCBvZiAvcHJvYy9uZXQvejg1MzBkcnYgb3V0cHV0CisgICAJCSAgKiBTdHJlYW1saW5lZCBxdWl0ZSBhIGxvdCB0aGluZ3MKKyAgIAkJICAqIEludmVudHMgYnJhbmQgbmV3IGJ1Z3MuLi4gOy0pCisKKyAgIAkJICBUaGUgbW92ZSB0byB2ZXJzaW9uIG51bWJlciAzLjAgcmVmbGVjdHMgdGhlc2VzIGNoYW5nZXMuCisgICAJCSAgWW91IGNhbiB1c2UgJ2tpc3NicmlkZ2UnIGlmIHlvdSBuZWVkIGEgS0lTUyBUTkMgZW11bGF0b3IuCisKKyAgIDE5OTYtMTItMTMJRml4ZWQgZm9yIExpbnV4IG5ldHdvcmtpbmcgY2hhbmdlcy4gKEc0S0xYKQorICAgMTk5Ny0wMS0wOAlGaXhlZCB0aGUgcmVtYWluaW5nIHByb2JsZW1zLgorICAgMTk5Ny0wNC0wMglIb3BlZnVsbHkgZml4ZWQgdGhlIHByb2JsZW1zIHdpdGggdGhlIG5ldyAqX3RpbWVyKCkKKyAgIAkJcm91dGluZXMsIGFkZGVkIGNhbGlicmF0aW9uIGNvZGUuCisgICAxOTk3LTEwLTEyCU1hZGUgU0NDX0RFTEFZIGEgQ09ORklHIG9wdGlvbiwgYWRkZWQgQ09ORklHX1NDQ19UUlhFQ0hPCisgICAxOTk4LTAxLTI5CVNtYWxsIGZpeCB0byBhdm9pZCBsb2NrLXVwIG9uIGluaXRpYWxpemF0aW9uCisgICAxOTk4LTA5LTI5CUZpeGVkIHRoZSAiZ3JvdXBpbmciIGJ1Z3MsIHR4X2luaGliaXQgd29ya3MgYWdhaW4sCisgICAJCXVzaW5nIGRldi0+dHhfcXVldWVfbGVuIG5vdyBpbnN0ZWFkIG9mIE1BWFFVRVVFIG5vdy4KKyAgIDE5OTgtMTAtMjEJUG9zdHBvbmVkIHRoZSBzcGlubG9jayBjaGFuZ2VzLCB3b3VsZCBuZWVkIGEgbG90IG9mCisgICAJCXRlc3RpbmcgSSBjdXJyZW50bHkgZG9uJ3QgaGF2ZSB0aGUgdGltZSB0by4gU29mdGRjZCBkb2Vzbid0CisgICAJCXdvcmsuCisgICAxOTk4LTExLTA0CVNvZnRkY2QgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgaW4gRFBMTCBtb2RlLCBpbiBmYWN0IGl0IAorICAgCQluZXZlciBkaWQuIFRoZSBEUExMIGxvY2tzIG9uIG5vaXNlLCB0aGUgU1lOQyB1bml0IHNlZXMKKyAgIAkJZmxhZ3MgdGhhdCBhcmVuJ3QuLi4gUmVzdGFydGluZyB0aGUgRFBMTCBkb2VzIG5vdCBoZWxwCisgICAJCWVpdGhlciwgaXQgcmVzeW5jaHJvbml6ZXMgdG9vIHNsb3cgYW5kIHRoZSBmaXJzdCByZWNlaXZlZAorICAgCQlmcmFtZSBnZXRzIGxvc3QuCisgICAyMDAwLTAyLTEzCUZpeGVkIGZvciBuZXcgbmV0d29yayBkcml2ZXIgaW50ZXJmYWNlIGNoYW5nZXMsIHN0aWxsCisgICAJCWRvZXMgVFggdGltZW91dHMgaXRzZWxmIHNpbmNlIGl0IHVzZXMgaXRzIG93biBxdWV1ZQorICAgCQlzY2hlbWUuCisKKyAgIFRoYW5rcyB0byBhbGwgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMgZHJpdmVyIHdpdGggaWRlYXMgYW5kIGJ1ZworICAgcmVwb3J0cyEKKyAgIAorICAgTkIgLS0gaWYgeW91IGZpbmQgZXJyb3JzLCBjaGFuZ2Ugc29tZXRoaW5nLCBwbGVhc2UgbGV0IG1lIGtub3cKKyAgICAgIAkgZmlyc3QgYmVmb3JlIHlvdSBkaXN0cmlidXRlIGl0Li4uIEFuZCBwbGVhc2UgZG9uJ3QgdG91Y2gKKyAgIAkgdGhlIHZlcnNpb24gbnVtYmVyLiBKdXN0IHJlcGxhY2UgbXkgY2FsbHNpZ24gaW4KKyAgIAkgInYzLjAuZGwxYmtlIiB3aXRoIHlvdXIgb3duLiBKdXN0IHRvIGF2b2lkIGNvbmZ1c2lvbi4uLgorCisgICBJZiB5b3Ugd2FudCB0byBhZGQgeW91ciBtb2RpZmljYXRpb24gdG8gdGhlIGxpbnV4IGRpc3RyaWJ1dGlvbgorICAgcGxlYXNlICghKSBjb250YWN0IG1lIGZpcnN0LgorICAgCisgICBOZXcgdmVyc2lvbnMgb2YgdGhlIGRyaXZlciB3aWxsIGJlIGFubm91bmNlZCBvbiB0aGUgbGludXgtaGFtcworICAgbWFpbGluZyBsaXN0IG9uIHZnZXIua2VybmVsLm9yZy4gVG8gc3Vic2NyaWJlIHNlbmQgYW4gZS1tYWlsCisgICB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnIHdpdGggdGhlIGZvbGxvd2luZyBsaW5lIGluCisgICB0aGUgYm9keSBvZiB0aGUgbWFpbDoKKyAgIAorCSAgIHN1YnNjcmliZSBsaW51eC1oYW1zCisJICAgCisgICBUaGUgY29udGVudCBvZiB0aGUgIlN1YmplY3QiIGZpZWxkIHdpbGwgYmUgaWdub3JlZC4KKworICAgdnkgNzMsCisgICBKb2VyZyBSZXV0ZXIJYW1wci1uZXQ6IGRsMWJrZUBkYjBwcmEuYW1wci5vcmcKKwkJQVgtMjUgICA6IERMMUJLRSBAIERCMEFCSC4jQkFZLkRFVS5FVQorCQlJbnRlcm5ldDoganJldXRlckB5YWluYS5kZQorCQl3d3cgICAgIDogaHR0cDovL3lhaW5hLmRlL2pyZXV0ZXIKKyovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyN1bmRlZiAgU0NDX0xERUxBWQkJLyogc2xvdyBpdCBldmVuIGEgYml0IG1vcmUgZG93biAqLworI3VuZGVmICBTQ0NfRE9OVF9DSEVDSwkJLyogZG9uJ3QgbG9vayBpZiB0aGUgU0NDcyB5b3Ugc3BlY2lmaWVkIGFyZSBhdmFpbGFibGUgKi8KKworI2RlZmluZSBTQ0NfTUFYQ0hJUFMJNCAgICAgICAvKiBudW1iZXIgb2YgbWF4LiBzdXBwb3J0ZWQgY2hpcHMgKi8KKyNkZWZpbmUgU0NDX0JVRlNJWkUJMzg0ICAgICAvKiBtdXN0IG5vdCBleGNlZWQgNDA5NiAqLworI3VuZGVmCVNDQ19ERUJVRworCisjZGVmaW5lIFNDQ19ERUZBVUxUX0NMT0NLCTQ5MTUyMDAgCisJCQkJLyogZGVmYXVsdCBwY2xvY2sgaWYgbm90aGluZyBpcyBzcGVjaWZpZWQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NjLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPG5ldC9heDI1Lmg+CisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJ6ODUzMC5oIgorCitzdGF0aWMgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0gS0VSTl9JTkZPICJBWC4yNTogWjg1MzAgU0NDIGRyaXZlciB2ZXJzaW9uICJWRVJTSU9OIi5kbDFia2VcbiI7CisKK3N0YXRpYyB2b2lkIHRfZHdhaXQodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCB0X3R4ZGVsYXkodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCB0X3RhaWwodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCB0X2J1c3kodW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCB0X21heGtleXVwKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgdF9pZGxlKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgc2NjX3R4X2RvbmUoc3RydWN0IHNjY19jaGFubmVsICopOworc3RhdGljIHZvaWQgc2NjX3N0YXJ0X3R4X3RpbWVyKHN0cnVjdCBzY2NfY2hhbm5lbCAqLCB2b2lkICgqKSh1bnNpZ25lZCBsb25nKSwgdW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCBzY2Nfc3RhcnRfbWF4a2V5dXAoc3RydWN0IHNjY19jaGFubmVsICopOworc3RhdGljIHZvaWQgc2NjX3N0YXJ0X2RlZmVyKHN0cnVjdCBzY2NfY2hhbm5lbCAqKTsKKworc3RhdGljIHZvaWQgejg1MzBfaW5pdCh2b2lkKTsKKworc3RhdGljIHZvaWQgaW5pdF9jaGFubmVsKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKTsKK3N0YXRpYyB2b2lkIHNjY19rZXlfdHJ4IChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYywgY2hhciB0eCk7CitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NjX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIHNjY19pbml0X3RpbWVyKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKTsKKworc3RhdGljIGludCBzY2NfbmV0X2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKTsKK3N0YXRpYyB2b2lkIHNjY19uZXRfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNjY19uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc2NjX25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNjY19uZXRfcngoc3RydWN0IHNjY19jaGFubmVsICpzY2MsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBzY2NfbmV0X3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzY2NfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgc2NjX25ldF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiBzY2NfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgU0NDX0RyaXZlck5hbWVbXSA9ICJzY2MiOworCitzdGF0aWMgc3RydWN0IGlycWZsYWdzIHsgdW5zaWduZWQgY2hhciB1c2VkIDogMTsgfSBJdmVjW05SX0lSUVNdOworCQorc3RhdGljIHN0cnVjdCBzY2NfY2hhbm5lbCBTQ0NfSW5mb1syICogU0NDX01BWENISVBTXTsJLyogaW5mb3JtYXRpb24gcGVyIGNoYW5uZWwgKi8KKworc3RhdGljIHN0cnVjdCBzY2NfY3RybCB7CisJaW9fcG9ydCBjaGFuX0E7CisJaW9fcG9ydCBjaGFuX0I7CisJaW50IGlycTsKK30gU0NDX2N0cmxbU0NDX01BWENISVBTKzFdOworCitzdGF0aWMgdW5zaWduZWQgY2hhciBEcml2ZXJfSW5pdGlhbGl6ZWQ7CitzdGF0aWMgaW50IE5jaGlwczsKK3N0YXRpYyBpb19wb3J0IFZlY3Rvcl9MYXRjaDsKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKgkJCVBvcnQgQWNjZXNzIEZ1bmN0aW9ucwkJCSAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKy8qIFRoZXNlIHByb3ZpZGUgaW50ZXJydXB0IHNhdmUgMi1zdGVwIGFjY2VzcyB0byB0aGUgWjg1MzAgcmVnaXN0ZXJzICovCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW9sb2NrKTsJLyogR3VhcmRzIHBhaXJlZCBhY2Nlc3NlcyAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgSW5SZWcoaW9fcG9ydCBwb3J0LCB1bnNpZ25lZCBjaGFyIHJlZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgcjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb2xvY2ssIGZsYWdzKTsJCisjaWZkZWYgU0NDX0xERUxBWQorCU91dGIocG9ydCwgcmVnKTsKKwl1ZGVsYXkoU0NDX0xERUxBWSk7CisJcj1JbmIocG9ydCk7CisJdWRlbGF5KFNDQ19MREVMQVkpOworI2Vsc2UKKwlPdXRiKHBvcnQsIHJlZyk7CisJcj1JbmIocG9ydCk7CisjZW5kaWYKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIE91dFJlZyhpb19wb3J0IHBvcnQsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbG9jaywgZmxhZ3MpOworI2lmZGVmIFNDQ19MREVMQVkKKwlPdXRiKHBvcnQsIHJlZyk7IHVkZWxheShTQ0NfTERFTEFZKTsKKwlPdXRiKHBvcnQsIHZhbCk7IHVkZWxheShTQ0NfTERFTEFZKTsKKyNlbHNlCisJT3V0Yihwb3J0LCByZWcpOworCU91dGIocG9ydCwgdmFsKTsKKyNlbmRpZgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3Ioc3RydWN0IHNjY19jaGFubmVsICpzY2MsIHVuc2lnbmVkIGNoYXIgcmVnLAorCXVuc2lnbmVkIGNoYXIgdmFsKQoreworCU91dFJlZyhzY2MtPmN0cmwsIHJlZywgKHNjYy0+d3JlZ1tyZWddID0gdmFsKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvcihzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYywgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgdmFsKQoreworCU91dFJlZyhzY2MtPmN0cmwsIHJlZywgKHNjYy0+d3JlZ1tyZWddIHw9IHZhbCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2woc3RydWN0IHNjY19jaGFubmVsICpzY2MsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlPdXRSZWcoc2NjLT5jdHJsLCByZWcsIChzY2MtPndyZWdbcmVnXSAmPSB+dmFsKSk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqCQkJU29tZSB1c2VmdWwgbWFjcm9zCQkJICAgICAgKiAqLworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNjY19kaXNjYXJkX2J1ZmZlcnMoc3RydWN0IHNjY19jaGFubmVsICpzY2MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NjLT5sb2NrLCBmbGFncyk7CQorCWlmIChzY2MtPnR4X2J1ZmYgIT0gTlVMTCkKKwl7CisJCWRldl9rZnJlZV9za2Ioc2NjLT50eF9idWZmKTsKKwkJc2NjLT50eF9idWZmID0gTlVMTDsKKwl9CisJCisJd2hpbGUgKHNrYl9xdWV1ZV9sZW4oJnNjYy0+dHhfcXVldWUpKQorCQlkZXZfa2ZyZWVfc2tiKHNrYl9kZXF1ZXVlKCZzY2MtPnR4X3F1ZXVlKSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2MtPmxvY2ssIGZsYWdzKTsKK30KKworCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqCQkJSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZXMJCSAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKworLyogLS0tLT4gc3Vicm91dGluZXMgZm9yIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcnMgPC0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHNjY19ub3RpZnkoc3RydWN0IHNjY19jaGFubmVsICpzY2MsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWNoYXIgKmJwOworCQorICAgICAgICBpZiAoc2NjLT5raXNzLmZ1bGxkdXAgIT0gS0lTU19EVVBMRVhfT1BUSU1BKQorCQlyZXR1cm47CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKDIpOworCWlmIChza2IgIT0gTlVMTCkKKwl7CisJCWJwID0gc2tiX3B1dChza2IsIDIpOworCQkqYnArKyA9IFBBUkFNX0hXRVZFTlQ7CisJCSpicCsrID0gZXZlbnQ7CisJCXNjY19uZXRfcngoc2NjLCBza2IpOworCX0gZWxzZQorCQlzY2MtPnN0YXQubm9zcGFjZSsrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfcnhfRklGTyhzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYykKK3sKKwlpbnQgazsKKwkKKwlmb3IgKGs9MDsgazwzOyBrKyspCisJCUluYihzY2MtPmRhdGEpOworCQkKKwlpZihzY2MtPnJ4X2J1ZmYgIT0gTlVMTCkJCS8qIGRpZCB3ZSByZWNlaXZlIHNvbWV0aGluZz8gKi8KKwl7CisJCXNjYy0+c3RhdC5yeGVycnMrKzsgIC8qIHRoZW4gY291bnQgaXQgYXMgYW4gZXJyb3IgKi8KKwkJZGV2X2tmcmVlX3NrYl9pcnEoc2NjLT5yeF9idWZmKTsKKwkJc2NjLT5yeF9idWZmID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X2h1bnQoc3RydWN0IHNjY19jaGFubmVsICpzY2MpCit7CisJaWYgKChzY2MtPm1vZGVtLmNsb2Nrc3JjICE9IENMS19FWFRFUk5BTCkpCisJCU91dFJlZyhzY2MtPmN0cmwsUjE0LFNFQVJDSHxzY2MtPndyZWdbUjE0XSk7IC8qIERQTEw6IGVudGVyIHNlYXJjaCBtb2RlICovCisJb3Ioc2NjLFIzLEVOVF9ITXxSeEVOQUJMRSk7ICAvKiBlbmFibGUgdGhlIHJlY2VpdmVyLCBodW50IG1vZGUgKi8KK30KKworLyogLS0tLT4gZm91ciBkaWZmZXJlbnQgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBUeCwgUngsIGNoYW5naW5nIG9mCSovCisvKiAgICAgICBEQ0QvQ1RTIGFuZCBSeC9UeCBlcnJvcnMJCQkJCSovCisKKy8qIFRyYW5zbWl0dGVyIGludGVycnVwdCBoYW5kbGVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2NjX3R4aW50KHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlzY2MtPnN0YXQudHhpbnRzKys7CisJc2tiID0gc2NjLT50eF9idWZmOworCQorCS8qIHNlbmQgZmlyc3Qgb2N0ZXQgKi8KKwkKKwlpZiAoc2tiID09IE5VTEwpCisJeworCQlza2IgPSBza2JfZGVxdWV1ZSgmc2NjLT50eF9xdWV1ZSk7CisJCXNjYy0+dHhfYnVmZiA9IHNrYjsKKwkJbmV0aWZfd2FrZV9xdWV1ZShzY2MtPmRldik7CisKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQl7CisJCQlzY2NfdHhfZG9uZShzY2MpOworCQkJT3V0YihzY2MtPmN0cmwsIFJFU19UeF9QKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKHNrYi0+bGVuID09IDApCQkvKiBQYXJhbm9pYS4uLiAqLworCQl7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQkJc2NjLT50eF9idWZmID0gTlVMTDsKKwkJCXNjY190eF9kb25lKHNjYyk7CisJCQlPdXRiKHNjYy0+Y3RybCwgUkVTX1R4X1ApOworCQkJcmV0dXJuOworCQl9CisKKwkJc2NjLT5zdGF0LnR4X3N0YXRlID0gVFhTX0FDVElWRTsKKworCQlPdXRSZWcoc2NjLT5jdHJsLCBSMCwgUkVTX1R4X0NSQyk7CisJCQkJCQkvKiByZXNldCBDUkMgZ2VuZXJhdG9yICovCisJCW9yKHNjYyxSMTAsQUJVTkRFUik7CQkvKiByZS1pbnN0YWxsIHVuZGVycnVuIHByb3RlY3Rpb24gKi8KKwkJT3V0YihzY2MtPmRhdGEsKnNrYi0+ZGF0YSk7CS8qIHNlbmQgYnl0ZSAqLworCQlza2JfcHVsbChza2IsIDEpOworCisJCWlmICghc2NjLT5lbmhhbmNlZCkJCS8qIHJlc2V0IEVPTSBsYXRjaCAqLworCQkJT3V0YihzY2MtPmN0cmwsUkVTX0VPTV9MKTsKKwkJcmV0dXJuOworCX0KKwkKKwkvKiBFbmQgT2YgRnJhbWUuLi4gKi8KKwkKKwlpZiAoc2tiLT5sZW4gPT0gMCkKKwl7CisJCU91dGIoc2NjLT5jdHJsLCBSRVNfVHhfUCk7CS8qIHJlc2V0IHBlbmRpbmcgaW50ICovCisJCWNsKHNjYywgUjEwLCBBQlVOREVSKTsJCS8qIHNlbmQgQ1JDICovCisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCXNjYy0+dHhfYnVmZiA9IE5VTEw7CisJCXNjYy0+c3RhdC50eF9zdGF0ZSA9IFRYU19ORVdGUkFNRTsgLyogbmV4dCBmcmFtZS4uLiAqLworCQlyZXR1cm47CisJfSAKKwkKKwkvKiBzZW5kIG9jdGV0ICovCisJCisJT3V0YihzY2MtPmRhdGEsKnNrYi0+ZGF0YSk7CQkKKwlza2JfcHVsbChza2IsIDEpOworfQorCisKKy8qIEV4dGVybmFsL1N0YXR1cyBpbnRlcnJ1cHQgaGFuZGxlciAqLworc3RhdGljIGlubGluZSB2b2lkIHNjY19leGludChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYykKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1cyxjaGFuZ2VzLGNoZ19hbmRfc3RhdDsKKworCXNjYy0+c3RhdC5leGludHMrKzsKKworCXN0YXR1cyA9IEluUmVnKHNjYy0+Y3RybCxSMCk7CisJY2hhbmdlcyA9IHN0YXR1cyBeIHNjYy0+c3RhdHVzOworCWNoZ19hbmRfc3RhdCA9IGNoYW5nZXMgJiBzdGF0dXM7CisJCisJLyogQUJPUlQ6IGdlbmVyYXRlZCB3aGVuZXZlciBEQ0QgZHJvcHMgd2hpbGUgcmVjZWl2aW5nICovCisKKwlpZiAoY2hnX2FuZF9zdGF0ICYgQlJLX0FCUlQpCQkvKiBSZWNlaXZlZCBhbiBBQk9SVCAqLworCQlmbHVzaF9yeF9GSUZPKHNjYyk7CisKKwkvKiBIVU5UOiBzb2Z0d2FyZSBEQ0Q7IG9uID0gd2FpdGluZyBmb3IgU1lOQywgb2ZmID0gcmVjZWl2aW5nIGZyYW1lICovCisKKwlpZiAoKGNoYW5nZXMgJiBTWU5DX0hVTlQpICYmIHNjYy0+a2lzcy5zb2Z0ZGNkKQorCXsKKwkJaWYgKHN0YXR1cyAmIFNZTkNfSFVOVCkKKwkJeworCQkJc2NjLT5kY2QgPSAwOworCQkJZmx1c2hfcnhfRklGTyhzY2MpOworCQkJaWYgKChzY2MtPm1vZGVtLmNsb2Nrc3JjICE9IENMS19FWFRFUk5BTCkpCisJCQkJT3V0UmVnKHNjYy0+Y3RybCxSMTQsU0VBUkNIfHNjYy0+d3JlZ1tSMTRdKTsgLyogRFBMTDogZW50ZXIgc2VhcmNoIG1vZGUgKi8KKwkJfSBlbHNlIHsKKwkJCXNjYy0+ZGNkID0gMTsKKwkJfQorCisJCXNjY19ub3RpZnkoc2NjLCBzY2MtPmRjZD8gSFdFVl9EQ0RfT0ZGOkhXRVZfRENEX09OKTsKKwl9CisKKwkvKiBEQ0Q6IG9uID0gc3RhcnQgdG8gcmVjZWl2ZSBwYWNrZXQsIG9mZiA9IEFCT1JUIGNvbmRpdGlvbiAqLworCS8qIChhIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBwYWNrZXQgZ2VuZXJhdGVzIGEgc3BlY2lhbCBjb25kaXRpb24gaW50KSAqLworCQorCWlmKChjaGFuZ2VzICYgRENEKSAmJiAhc2NjLT5raXNzLnNvZnRkY2QpIC8qIERDRCBpbnB1dCBjaGFuZ2VkIHN0YXRlICovCisJeworCQlpZihzdGF0dXMgJiBEQ0QpICAgICAgICAgICAgICAgIC8qIERDRCBpcyBub3cgT04gKi8KKwkJeworCQkJc3RhcnRfaHVudChzY2MpOworCQkJc2NjLT5kY2QgPSAxOworCQl9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERDRCBpcyBub3cgT0ZGICovCisJCQljbChzY2MsUjMsRU5UX0hNfFJ4RU5BQkxFKTsgLyogZGlzYWJsZSB0aGUgcmVjZWl2ZXIgKi8KKwkJCWZsdXNoX3J4X0ZJRk8oc2NjKTsKKwkJCXNjYy0+ZGNkID0gMDsKKwkJfQorCQkKKwkJc2NjX25vdGlmeShzY2MsIHNjYy0+ZGNkPyBIV0VWX0RDRF9PTjpIV0VWX0RDRF9PRkYpOworCX0KKworI2lmZGVmIG5vdGRlZgorCS8qIENUUzogdXNlIGV4dGVybmFsIFR4RGVsYXkgKHdoYXQncyB0aGF0IGdvb2QgZm9yPyEpCisJICogQW55d2F5OiBJZiB3ZSBfY291bGRfIHVzZSBpdCAoQmF5Q29tIFVTQ0MgdXNlcyBDVFMgZm9yCisJICogb3duIHB1cnBvc2VzKSB3ZSBfc2hvdWxkXyB1c2UgdGhlICJhdXRvZW5hYmxlIiBmZWF0dXJlCisJICogb2YgdGhlIFo4NTMwIGFuZCBub3QgdGhpcyBpbnRlcnJ1cHQuLi4KKwkgKi8KKwkgCisJaWYgKGNoZ19hbmRfc3RhdCAmIENUUykJCQkvKiBDVFMgaXMgbm93IE9OICovCisJeworCQlpZiAoc2NjLT5raXNzLnR4ZGVsYXkgPT0gMCkJLyogemVybyBUWERFTEFZID0gd2FpdCBmb3IgQ1RTICovCisJCQlzY2Nfc3RhcnRfdHhfdGltZXIoc2NjLCB0X3R4ZGVsYXksIDApOworCX0KKyNlbmRpZgorCQorCWlmIChzY2MtPnN0YXQudHhfc3RhdGUgPT0gVFhTX0FDVElWRSAmJiAoc3RhdHVzICYgVHhFT00pKQorCXsKKwkJc2NjLT5zdGF0LnR4X3VuZGVyKys7CSAgLyogb29wcywgYW4gdW5kZXJydW4hIGNvdW50ICdlbSAqLworCQlPdXRiKHNjYy0+Y3RybCwgUkVTX0VYVF9JTlQpOwkvKiByZXNldCBleHQvc3RhdHVzIGludGVycnVwdHMgKi8KKworCQlpZiAoc2NjLT50eF9idWZmICE9IE5VTEwpCisJCXsKKwkJCWRldl9rZnJlZV9za2JfaXJxKHNjYy0+dHhfYnVmZik7CisJCQlzY2MtPnR4X2J1ZmYgPSBOVUxMOworCQl9CisJCQorCQlvcihzY2MsUjEwLEFCVU5ERVIpOworCQlzY2Nfc3RhcnRfdHhfdGltZXIoc2NjLCB0X3R4ZGVsYXksIDApOwkvKiByZXN0YXJ0IHRyYW5zbWlzc2lvbiAqLworCX0KKwkJCisJc2NjLT5zdGF0dXMgPSBzdGF0dXM7CisJT3V0YihzY2MtPmN0cmwsUkVTX0VYVF9JTlQpOworfQorCisKKy8qIFJlY2VpdmVyIGludGVycnVwdCBoYW5kbGVyICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2NjX3J4aW50KHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlzY2MtPnN0YXQucnhpbnRzKys7CisKKwlpZigoc2NjLT53cmVnWzVdICYgUlRTKSAmJiBzY2MtPmtpc3MuZnVsbGR1cCA9PSBLSVNTX0RVUExFWF9IQUxGKQorCXsKKwkJSW5iKHNjYy0+ZGF0YSk7CQkvKiBkaXNjYXJkIGNoYXIgKi8KKwkJb3Ioc2NjLFIzLEVOVF9ITSk7CS8qIGVudGVyIGh1bnQgbW9kZSBmb3IgbmV4dCBmbGFnICovCisJCXJldHVybjsKKwl9CisKKwlza2IgPSBzY2MtPnJ4X2J1ZmY7CisJCisJaWYgKHNrYiA9PSBOVUxMKQorCXsKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihzY2MtPnN0YXQuYnVmc2l6ZSk7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJeworCQkJc2NjLT5kZXZfc3RhdC5yeF9kcm9wcGVkKys7CisJCQlzY2MtPnN0YXQubm9zcGFjZSsrOworCQkJSW5iKHNjYy0+ZGF0YSk7CisJCQlvcihzY2MsIFIzLCBFTlRfSE0pOworCQkJcmV0dXJuOworCQl9CisJCQorCQlzY2MtPnJ4X2J1ZmYgPSBza2I7CisJCSooc2tiX3B1dChza2IsIDEpKSA9IDA7CS8qIEtJU1MgZGF0YSAqLworCX0KKwkKKwlpZiAoc2tiLT5sZW4gPj0gc2NjLT5zdGF0LmJ1ZnNpemUpCisJeworI2lmZGVmIG5vdGRlZgorCQlwcmludGsoS0VSTl9ERUJVRyAiejg1MzBkcnY6IG9vcHMsIHNjY19yeGludCgpIHJlY2VpdmVkIGh1Z2UgZnJhbWUuLi5cbiIpOworI2VuZGlmCisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCXNjYy0+cnhfYnVmZiA9IE5VTEw7CisJCUluYihzY2MtPmRhdGEpOworCQlvcihzY2MsIFIzLCBFTlRfSE0pOworCQlyZXR1cm47CisJfQorCisJKihza2JfcHV0KHNrYiwgMSkpID0gSW5iKHNjYy0+ZGF0YSk7Cit9CisKKworLyogUmVjZWl2ZSBTcGVjaWFsIENvbmRpdGlvbiBpbnRlcnJ1cHQgaGFuZGxlciAqLworc3RhdGljIGlubGluZSB2b2lkIHNjY19zcGludChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYykKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2NjLT5zdGF0LnNwaW50cysrOworCisJc3RhdHVzID0gSW5SZWcoc2NjLT5jdHJsLFIxKTsJCS8qIHJlYWQgcmVjZWl2ZXIgc3RhdHVzICovCisJCisJSW5iKHNjYy0+ZGF0YSk7CQkJCS8qIHRocm93IGF3YXkgUnggYnl0ZSAqLworCXNrYiA9IHNjYy0+cnhfYnVmZjsKKworCWlmKHN0YXR1cyAmIFJ4X09WUikJCQkvKiByZWNlaXZlciBvdmVycnVuICovCisJeworCQlzY2MtPnN0YXQucnhfb3ZlcisrOyAgICAgICAgICAgICAvKiBjb3VudCB0aGVtICovCisJCW9yKHNjYyxSMyxFTlRfSE0pOyAgICAgICAgICAgICAgIC8qIGVudGVyIGh1bnQgbW9kZSBmb3IgbmV4dCBmbGFnICovCisJCQorCQlpZiAoc2tiICE9IE5VTEwpIAorCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJc2NjLT5yeF9idWZmID0gc2tiID0gTlVMTDsKKwl9CisKKwlpZihzdGF0dXMgJiBFTkRfRlIgJiYgc2tiICE9IE5VTEwpCS8qIGVuZCBvZiBmcmFtZSAqLworCXsKKwkJLyogQ1JDIG9rYXksIGZyYW1lIGVuZHMgb24gOCBiaXQgYm91bmRhcnkgYW5kIHJlY2VpdmVkIHNvbWV0aGluZyA/ICovCisJCQorCQlpZiAoIShzdGF0dXMgJiBDUkNfRVJSKSAmJiAoc3RhdHVzICYgMHhlKSA9PSBSRVM4ICYmIHNrYi0+bGVuID4gMCkKKwkJeworCQkJLyogaWdub3JlIGxhc3QgcmVjZWl2ZWQgYnl0ZSAoZmlyc3Qgb2YgdGhlIENSQyBieXRlcykgKi8KKwkJCXNrYl90cmltKHNrYiwgc2tiLT5sZW4tMSk7CisJCQlzY2NfbmV0X3J4KHNjYywgc2tiKTsKKwkJCXNjYy0+cnhfYnVmZiA9IE5VTEw7CisJCQlzY2MtPnN0YXQucnhmcmFtZXMrKzsKKwkJfSBlbHNlIHsJCQkJLyogYSBiYWQgZnJhbWUgKi8KKwkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQlzY2MtPnJ4X2J1ZmYgPSBOVUxMOworCQkJc2NjLT5zdGF0LnJ4ZXJycysrOworCQl9CisJfSAKKworCU91dGIoc2NjLT5jdHJsLEVSUl9SRVMpOworfQorCisKKy8qIC0tLS0+IGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIHRoZSBaODUzMCA8LS0tLSAqLworCitzdGF0aWMgdm9pZCBzY2NfaXNyX2Rpc3BhdGNoKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjLCBpbnQgdmVjdG9yKQoreworCXNwaW5fbG9jaygmc2NjLT5sb2NrKTsKKwlzd2l0Y2ggKHZlY3RvciAmIFZFQ1RPUl9NQVNLKQorCXsKKwkJY2FzZSBUWElOVDogc2NjX3R4aW50KHNjYyk7IGJyZWFrOworCQljYXNlIEVYSU5UOiBzY2NfZXhpbnQoc2NjKTsgYnJlYWs7CisJCWNhc2UgUlhJTlQ6IHNjY19yeGludChzY2MpOyBicmVhazsKKwkJY2FzZSBTUElOVDogc2NjX3NwaW50KHNjYyk7IGJyZWFrOworCX0KKwlzcGluX3VubG9jaygmc2NjLT5sb2NrKTsKK30KKworLyogSWYgdGhlIGNhcmQgaGFzIGEgbGF0Y2ggZm9yIHRoZSBpbnRlcnJ1cHQgdmVjdG9yIChsaWtlIHRoZSBQQTBIWlAgY2FyZCkKKyAgIHVzZSBpdCB0byBnZXQgdGhlIG51bWJlciBvZiB0aGUgY2hpcCB0aGF0IGdlbmVyYXRlZCB0aGUgaW50LgorICAgSWYgbm90OiBwb2xsIGFsbCBkZWZpbmVkIGNoaXBzLgorICovCisKKyNkZWZpbmUgU0NDX0lSUVRJTUVPVVQgMzAwMDAKKworc3RhdGljIGlycXJldHVybl90IHNjY19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBjaGFyIHZlY3RvcjsJCisJc3RydWN0IHNjY19jaGFubmVsICpzY2M7CisJc3RydWN0IHNjY19jdHJsICpjdHJsOworCWludCBrOworCQorCWlmIChWZWN0b3JfTGF0Y2gpCisJeworCSAgICAJZm9yKGs9MDsgayA8IFNDQ19JUlFUSU1FT1VUOyBrKyspCisgICAgCQl7CisJCQlPdXRiKFZlY3Rvcl9MYXRjaCwgMCk7ICAgICAgLyogR2VuZXJhdGUgSU5UQUNLICovCisgICAgICAgIAorCQkJLyogUmVhZCB0aGUgdmVjdG9yICovCisJCQlpZigodmVjdG9yPUluYihWZWN0b3JfTGF0Y2gpKSA+PSAxNiAqIE5jaGlwcykgYnJlYWs7IAorCQkJaWYgKHZlY3RvciAmIDB4MDEpIGJyZWFrOworICAgICAgICAJIAorCQkgICAgICAgIHNjYz0mU0NDX0luZm9bdmVjdG9yID4+IDMgXiAweDAxXTsKKwkJCWlmICghc2NjLT5kZXYpIGJyZWFrOworCisJCQlzY2NfaXNyX2Rpc3BhdGNoKHNjYywgdmVjdG9yKTsKKworCQkJT3V0UmVnKHNjYy0+Y3RybCxSMCxSRVNfSF9JVVMpOyAgICAgICAgICAgICAgLyogUmVzZXQgSGlnaGVzdCBJVVMgKi8KKwkJfSAgCisKKwkJaWYgKGsgPT0gU0NDX0lSUVRJTUVPVVQpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ6ODUzMGRydjogZW5kbGVzcyBsb29wIGluIHNjY19pc3IoKT9cbiIpOworCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwkvKiBGaW5kIHRoZSBTQ0MgZ2VuZXJhdGluZyB0aGUgaW50ZXJydXB0IGJ5IHBvbGxpbmcgYWxsIGF0dGFjaGVkIFNDQ3MKKwkgKiByZWFkaW5nIFJSM0EgKHRoZSBpbnRlcnJ1cHQgcGVuZGluZyByZWdpc3RlcikKKwkgKi8KKworCWN0cmwgPSBTQ0NfY3RybDsKKwl3aGlsZSAoY3RybC0+Y2hhbl9BKQorCXsKKwkJaWYgKGN0cmwtPmlycSAhPSBpcnEpCisJCXsKKwkJCWN0cmwrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc2NjID0gTlVMTDsKKwkJZm9yIChrID0gMDsgSW5SZWcoY3RybC0+Y2hhbl9BLFIzKSAmJiBrIDwgU0NDX0lSUVRJTUVPVVQ7IGsrKykKKwkJeworCQkJdmVjdG9yPUluUmVnKGN0cmwtPmNoYW5fQixSMik7CS8qIFJlYWQgdGhlIHZlY3RvciAqLworCQkJaWYgKHZlY3RvciAmIDB4MDEpIGJyZWFrOyAKKworCQkJc2NjID0gJlNDQ19JbmZvW3ZlY3RvciA+PiAzIF4gMHgwMV07CisJCSAgICAgICAgaWYgKCFzY2MtPmRldikgYnJlYWs7CisKKwkJCXNjY19pc3JfZGlzcGF0Y2goc2NjLCB2ZWN0b3IpOworCQl9CisKKwkJaWYgKGsgPT0gU0NDX0lSUVRJTUVPVVQpCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIno4NTMwZHJ2OiBlbmRsZXNzIGxvb3AgaW4gc2NjX2lzcigpPyFcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBUaGlzIGxvb2tzIHdlaXJkIGFuZCBpdCBpcy4gQXQgbGVhc3QgdGhlIEJheUNvbSBVU0NDIGRvZXNuJ3QKKwkJICogdXNlIHRoZSBJbnRlcnJ1cHQgRGFpc3kgQ2hhaW4sIHRodXMgd2UnbGwgaGF2ZSB0byBzdGFydAorCQkgKiBhbGwgb3ZlciBhZ2FpbiB0byBiZSBzdXJlIG5vdCB0byBtaXNzIGFuIGludGVycnVwdCBmcm9tIAorCQkgKiAoYW55IG9mKSB0aGUgb3RoZXIgY2hpcChzKS4uLgorCQkgKiBIb25lc3RseSwgdGhlIHNpdHVhdGlvbiAqaXMqIGJyYWluZGFtYWdlZC4uLgorCQkgKi8KKworCQlpZiAoc2NjICE9IE5VTEwpCisJCXsKKwkJCU91dFJlZyhzY2MtPmN0cmwsUjAsUkVTX0hfSVVTKTsKKwkJCWN0cmwgPSBTQ0NfY3RybDsgCisJCX0gZWxzZQorCQkJY3RybCsrOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKgkJCUluaXQgQ2hhbm5lbAkJCQkJKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKworLyogLS0tLT4gc2V0IFNDQyBjaGFubmVsIHNwZWVkIDwtLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYnJnKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjLCB1bnNpZ25lZCBpbnQgdGMpCit7CisJY2woc2NjLFIxNCxCUkVOQUJMKTsJCS8qIGRpc2FibGUgYmF1ZHJhdGUgZ2VuZXJhdG9yICovCisJd3Ioc2NjLFIxMix0YyAmIDI1NSk7CQkvKiBicmcgcmF0ZSBMT1cgKi8KKwl3cihzY2MsUjEzLHRjID4+IDgpOyAgIAkJLyogYnJnIHJhdGUgSElHSCAqLworCW9yKHNjYyxSMTQsQlJFTkFCTCk7CQkvKiBlbmFibGUgYmF1ZHJhdGUgZ2VuZXJhdG9yICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc3BlZWQoc3RydWN0IHNjY19jaGFubmVsICpzY2MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NjLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoc2NjLT5tb2RlbS5zcGVlZCA+IDApCS8qIHBhcmFub2lhLi4uICovCisJCXNldF9icmcoc2NjLCAodW5zaWduZWQpIChzY2MtPmNsb2NrIC8gKHNjYy0+bW9kZW0uc3BlZWQgKiA2NCkpIC0gMik7CisJCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjYy0+bG9jaywgZmxhZ3MpOworfQorCisKKy8qIC0tLS0+IGluaXRpYWxpemUgYSBTQ0MgY2hhbm5lbCA8LS0tLSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9icmcoc3RydWN0IHNjY19jaGFubmVsICpzY2MpCit7CisJd3Ioc2NjLCBSMTQsIEJSU1JDKTsJCQkJLyogQlJHIHNvdXJjZSA9IFBDTEsgKi8KKwlPdXRSZWcoc2NjLT5jdHJsLCBSMTQsIFNTQlJ8c2NjLT53cmVnW1IxNF0pOwkvKiBEUExMIHNvdXJjZSA9IEJSRyAqLworCU91dFJlZyhzY2MtPmN0cmwsIFIxNCwgU05SWkl8c2NjLT53cmVnW1IxNF0pOwkvKiBEUExMIE5SWkkgbW9kZSAqLworfQorCisvKgorICogSW5pdGlhbGl6YXRpb24gYWNjb3JkaW5nIHRvIHRoZSBaODUzMCBtYW51YWwgKFNHUy1UaG9tc29uJ3MgdmVyc2lvbik6CisgKgorICogMS4gTW9kZXMgYW5kIGNvbnN0YW50cworICoKKyAqIFdSOQkxMTAwMDAwMAljaGlwIHJlc2V0CisgKiBXUjQJWFhYWFhYWFgJVHgvUnggY29udHJvbCwgYXN5bmMgb3Igc3luYyBtb2RlCisgKiBXUjEJMFhYMDBYMDAJc2VsZWN0IFcvUkVRIChvcHRpb25hbCkKKyAqIFdSMglYWFhYWFhYWAlwcm9ncmFtIGludGVycnVwdCB2ZWN0b3IKKyAqIFdSMwlYWFhYWFhYMAlzZWxlY3QgUnggY29udHJvbAorICogV1I1CVhYWFgwWFhYCXNlbGVjdCBUeCBjb250cm9sCisgKiBXUjYJWFhYWFhYWFgJc3luYyBjaGFyYWN0ZXIKKyAqIFdSNwlYWFhYWFhYWAlzeW5jIGNoYXJhY3RlcgorICogV1I5CTAwMFgwWFhYCXNlbGVjdCBpbnRlcnJ1cHQgY29udHJvbAorICogV1IxMAlYWFhYWFhYWAltaXNjZWxsYW5lb3VzIGNvbnRyb2wgKG9wdGlvbmFsKQorICogV1IxMQlYWFhYWFhYWAljbG9jayBjb250cm9sCisgKiBXUjEyCVhYWFhYWFhYCXRpbWUgY29uc3RhbnQgbG93ZXIgYnl0ZSAob3B0aW9uYWwpCisgKiBXUjEzCVhYWFhYWFhYCXRpbWUgY29uc3RhbnQgdXBwZXIgYnl0ZSAob3B0aW9uYWwpCisgKiBXUjE0CVhYWFhYWFgwCW1pc2NlbGxhbmVvdXMgY29udHJvbAorICogV1IxNAlYWFhTU1NTUwljb21tYW5kcyAob3B0aW9uYWwpCisgKgorICogMi4gRW5hYmxlcworICoKKyAqIFdSMTQJMDAwU1NTUzEJYmF1ZCByYXRlIGVuYWJsZQorICogV1IzCVNTU1NTU1MxCVJ4IGVuYWJsZQorICogV1I1CVNTU1MxU1NTCVR4IGVuYWJsZQorICogV1IwCTEwMDAwMDAwCXJlc2V0IFR4IENSRyAob3B0aW9uYWwpCisgKiBXUjEJWFNTMDBTMDAJRE1BIGVuYWJsZSAob3B0aW9uYWwpCisgKgorICogMy4gSW50ZXJydXB0IHN0YXR1cworICoKKyAqIFdSMTUJWFhYWFhYWFgJZW5hYmxlIGV4dGVybmFsL3N0YXR1cworICogV1IwCTAwMDEwMDAwCXJlc2V0IGV4dGVybmFsIHN0YXR1cworICogV1IwCTAwMDEwMDAwCXJlc2V0IGV4dGVybmFsIHN0YXR1cyB0d2ljZQorICogV1IxCVNTU1hYU1hYCWVuYWJsZSBSeCwgVHggYW5kIEV4dC9zdGF0dXMKKyAqIFdSOQkwMDBTWFNTUwllbmFibGUgbWFzdGVyIGludGVycnVwdCBlbmFibGUKKyAqCisgKiAxID0gc2V0IHRvIG9uZSwgMCA9IHJlc2V0IHRvIHplcm8KKyAqIFggPSB1c2VyIGRlZmluZWQsIFMgPSBzYW1lIGFzIHByZXZpb3VzIGluaXQKKyAqCisgKgorICogTm90ZSB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBkaWZmZXJzIGluIHNvbWUgcG9pbnRzIGZyb20gYWJvdmUgc2NoZW1lLgorICoKKyAqLworIAorc3RhdGljIHZvaWQgaW5pdF9jaGFubmVsKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKQoreworCWRlbF90aW1lcigmc2NjLT50eF90KTsKKwlkZWxfdGltZXIoJnNjYy0+dHhfd2RvZyk7CisKKwlkaXNhYmxlX2lycShzY2MtPmlycSk7CisKKwl3cihzY2MsUjQsWDFDTEt8U0RMQyk7CQkvKiAqMSBjbG9jaywgU0RMQyBtb2RlICovCisJd3Ioc2NjLFIxLDApOwkJCS8qIG5vIFcvUkVRIG9wZXJhdGlvbiAqLworCXdyKHNjYyxSMyxSeDh8UnhDUkNfRU5BQik7CS8qIFJYIDggYml0cy9jaGFyLCBDUkMsIGRpc2FibGVkICovCQorCXdyKHNjYyxSNSxUeDh8RFRSfFR4Q1JDX0VOQUIpOwkvKiBUWCA4IGJpdHMvY2hhciwgZGlzYWJsZWQsIERUUiAqLworCXdyKHNjYyxSNiwwKTsJCQkvKiBTRExDIGFkZHJlc3MgemVybyAobm90IHVzZWQpICovCisJd3Ioc2NjLFI3LEZMQUcpOwkJLyogU0RMQyBmbGFnIHZhbHVlICovCisJd3Ioc2NjLFI5LFZJUyk7CQkJLyogdmVjdG9yIGluY2x1ZGVzIHN0YXR1cyAqLworCXdyKHNjYyxSMTAsKHNjYy0+bW9kZW0ubnJ6PyBOUlogOiBOUlpJKXxDUkNQU3xBQlVOREVSKTsgLyogYWJvcnQgb24gdW5kZXJydW4sIHByZXNldCBDUkMgZ2VuZXJhdG9yLCBOUlooSSkgKi8KKwl3cihzY2MsUjE0LCAwKTsKKworCisvKiBzZXQgY2xvY2sgc291cmNlczoKKworICAgQ0xLX0RQTEw6IG5vcm1hbCBoYWxmZHVwbGV4IG9wZXJhdGlvbgorICAgCisJCVJ4Q2xrOiB1c2UgRFBMTAorCQlUeENsazogdXNlIERQTEwKKwkJVFJ4QyBtb2RlIERQTEwgb3V0cHV0CisJCQorICAgQ0xLX0VYVEVSTkFMOiBleHRlcm5hbCBjbG9ja2luZyAoRzNSVUggb3IgREY5SUMgbW9kZW0pCisgICAKKyAgCSAgICAgICAgQmF5Q29tOiAJCW90aGVyczoKKyAgCSAgICAgICAgCisgIAkgICAgICAgIFR4Q2xrID0gcGluIFJUeEMJVHhDbGsgPSBwaW4gVFJ4QworICAJICAgICAgICBSeENsayA9IHBpbiBUUnhDIAlSeENsayA9IHBpbiBSVHhDCisgIAkgICAgIAorCisgICBDTEtfRElWSURFUjoKKyAgIAkJUnhDbGsgPSB1c2UgRFBMTAorICAgCQlUeENsayA9IHBpbiBSVHhDCisgICAJCQorICAgCQlCYXlDb206CQkJb3RoZXJzOgorICAgCQlwaW4gVFJ4QyA9IERQTEwJCXBpbiBUUnhDID0gQlJHCisgICAJCShSeENsayAqIDEpCQkoUnhDbGsgKiAzMikKKyovICAKKworICAgCQkKKwlzd2l0Y2goc2NjLT5tb2RlbS5jbG9ja3NyYykKKwl7CisJCWNhc2UgQ0xLX0RQTEw6CisJCQl3cihzY2MsIFIxMSwgUkNEUExMfFRDRFBMTHxUUnhDT0l8VFJ4Q0RQKTsKKwkJCWluaXRfYnJnKHNjYyk7CisJCQlicmVhazsKKworCQljYXNlIENMS19ESVZJREVSOgorCQkJd3Ioc2NjLCBSMTEsICgoc2NjLT5icmFuZCAmIEJBWUNPTSk/IFRSeENEUCA6IFRSeENCUikgfCBSQ0RQTEx8VENSVHhDUHxUUnhDT0kpOworCQkJaW5pdF9icmcoc2NjKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ0xLX0VYVEVSTkFMOgorCQkJd3Ioc2NjLCBSMTEsIChzY2MtPmJyYW5kICYgQkFZQ09NKT8gUkNUUnhDUHxUQ1JUeENQIDogUkNSVHhDUHxUQ1RSeENQKTsKKwkJCU91dFJlZyhzY2MtPmN0cmwsIFIxNCwgRElTRFBMTCk7CisJCQlicmVhazsKKworCX0KKwkKKwlzZXRfc3BlZWQoc2NjKTsJCQkvKiBzZXQgYmF1ZHJhdGUgKi8KKwkKKwlpZihzY2MtPmVuaGFuY2VkKQorCXsKKwkJb3Ioc2NjLFIxNSxTSERMQ0V8RklGT0UpOwkvKiBlbmFibGUgRklGTywgU0RMQy9IRExDIEVuaGFuY2VtZW50cyAoRnJvbSBub3cgUjcgaXMgUjcnKSAqLworCQl3cihzY2MsUjcsQVVUT0VPTSk7CisJfQorCisJaWYoc2NjLT5raXNzLnNvZnRkY2QgfHwgKEluUmVnKHNjYy0+Y3RybCxSMCkgJiBEQ0QpKQorCQkJCQkJLyogRENEIGlzIG5vdyBPTiAqLworCXsKKwkJc3RhcnRfaHVudChzY2MpOworCX0KKwkKKwkvKiBlbmFibGUgQUJPUlQsIERDRCAmIFNZTkMvSFVOVCBpbnRlcnJ1cHRzICovCisKKwl3cihzY2MsUjE1LCBCUktJRXxUeFVJRXwoc2NjLT5raXNzLnNvZnRkY2Q/IFNZTkNJRTpEQ0RJRSkpOworCisJT3V0YihzY2MtPmN0cmwsUkVTX0VYVF9JTlQpOwkvKiByZXNldCBleHQvc3RhdHVzIGludGVycnVwdHMgKi8KKwlPdXRiKHNjYy0+Y3RybCxSRVNfRVhUX0lOVCk7CS8qIG11c3QgYmUgZG9uZSB0d2ljZSAqLworCisJb3Ioc2NjLFIxLElOVF9BTExfUnh8VHhJTlRfRU5BQnxFWFRfSU5UX0VOQUIpOyAvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCQorCXNjYy0+c3RhdHVzID0gSW5SZWcoc2NjLT5jdHJsLFIwKTsJLyogcmVhZCBpbml0aWFsIHN0YXR1cyAqLworCQorCW9yKHNjYyxSOSxNSUUpOwkJCS8qIG1hc3RlciBpbnRlcnJ1cHQgZW5hYmxlICovCisJCisJc2NjX2luaXRfdGltZXIoc2NjKTsKKwkJCQorCWVuYWJsZV9pcnEoc2NjLT5pcnEpOworfQorCisKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKgkJCVNDQyB0aW1lciBmdW5jdGlvbnMJCQkgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisKKy8qIC0tLS0+IHNjY19rZXlfdHJ4IHNldHMgdGhlIHRpbWUgY29uc3RhbnQgZm9yIHRoZSBiYXVkcmF0ZSAKKyAgICAgICAgIGdlbmVyYXRvciBhbmQga2V5cyB0aGUgdHJhbnNtaXR0ZXIJCSAgICAgPC0tLS0gKi8KKworc3RhdGljIHZvaWQgc2NjX2tleV90cngoc3RydWN0IHNjY19jaGFubmVsICpzY2MsIGNoYXIgdHgpCit7CisJdW5zaWduZWQgaW50IHRpbWVfY29uc3Q7CisJCQorCWlmIChzY2MtPmJyYW5kICYgUFJJTVVTKQorCQlPdXRiKHNjYy0+Y3RybCArIDQsIHNjYy0+b3B0aW9uIHwgKHR4PyAweDgwIDogMCkpOworCisJaWYgKHNjYy0+bW9kZW0uc3BlZWQgPCAzMDApIAorCQlzY2MtPm1vZGVtLnNwZWVkID0gMTIwMDsKKworCXRpbWVfY29uc3QgPSAodW5zaWduZWQpIChzY2MtPmNsb2NrIC8gKHNjYy0+bW9kZW0uc3BlZWQgKiAodHg/IDI6NjQpKSkgLSAyOworCisJZGlzYWJsZV9pcnEoc2NjLT5pcnEpOworCisJaWYgKHR4KQorCXsKKwkJb3Ioc2NjLCBSMSwgVHhJTlRfRU5BQik7CS8qIHRfbWF4a2V5dXAgbWF5IGhhdmUgcmVzZXQgdGhlc2UgKi8KKwkJb3Ioc2NjLCBSMTUsIFR4VUlFKTsKKwl9CisKKwlpZiAoc2NjLT5tb2RlbS5jbG9ja3NyYyA9PSBDTEtfRFBMTCkKKwl7CQkJCS8qIGZvcmNlIHNpbXBsZXggb3BlcmF0aW9uICovCisJCWlmICh0eCkKKwkJeworI2lmZGVmIENPTkZJR19TQ0NfVFJYRUNITworCQkJY2woc2NjLCBSMywgUnhFTkFCTEV8RU5UX0hNKTsJLyogc3dpdGNoIG9mZiByZWNlaXZlciAqLworCQkJY2woc2NjLCBSMTUsIERDRElFfFNZTkNJRSk7CS8qIE5vIERDRCBjaGFuZ2VzLCBwbGVhc2UgKi8KKyNlbmRpZgorCQkJc2V0X2JyZyhzY2MsIHRpbWVfY29uc3QpOwkvKiByZXByb2dyYW0gYmF1ZHJhdGUgZ2VuZXJhdG9yICovCisKKwkJCS8qIERQTEwgLT4gUnggY2xrLCBCUkcgLT4gVHggQ0xLLCBUUnhDIG1vZGUgb3V0cHV0LCBUUnhDID0gQlJHICovCisJCQl3cihzY2MsIFIxMSwgUkNEUExMfFRDQlJ8VFJ4Q09JfFRSeENCUik7CisJCQkKKwkJCS8qIEJ5IHBvcHVsYXIgZGVtYW5kOiB0eF9pbmhpYml0ICovCisJCQlpZiAoc2NjLT5raXNzLnR4X2luaGliaXQpCisJCQl7CisJCQkJb3Ioc2NjLFI1LCBUeEVOQUIpOworCQkJCXNjYy0+d3JlZ1tSNV0gfD0gUlRTOworCQkJfSBlbHNlIHsKKwkJCQlvcihzY2MsUjUsUlRTfFR4RU5BQik7CS8qIHNldCB0aGUgUlRTIGxpbmUgYW5kIGVuYWJsZSBUWCAqLworCQkJfQorCQl9IGVsc2UgeworCQkJY2woc2NjLFI1LFJUU3xUeEVOQUIpOworCQkJCisJCQlzZXRfYnJnKHNjYywgdGltZV9jb25zdCk7CS8qIHJlcHJvZ3JhbSBiYXVkcmF0ZSBnZW5lcmF0b3IgKi8KKwkJCQorCQkJLyogRFBMTCAtPiBSeCBjbGssIERQTEwgLT4gVHggQ0xLLCBUUnhDIG1vZGUgb3V0cHV0LCBUUnhDID0gRFBMTCAqLworCQkJd3Ioc2NjLCBSMTEsIFJDRFBMTHxUQ0RQTEx8VFJ4Q09JfFRSeENEUCk7CisKKyNpZm5kZWYgQ09ORklHX1NDQ19UUlhFQ0hPCisJCQlpZiAoc2NjLT5raXNzLnNvZnRkY2QpCisjZW5kaWYKKwkJCXsKKwkJCQlvcihzY2MsUjE1LCBzY2MtPmtpc3Muc29mdGRjZD8gU1lOQ0lFOkRDRElFKTsKKwkJCQlzdGFydF9odW50KHNjYyk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAodHgpCisJCXsKKyNpZmRlZiBDT05GSUdfU0NDX1RSWEVDSE8KKwkJCWlmIChzY2MtPmtpc3MuZnVsbGR1cCA9PSBLSVNTX0RVUExFWF9IQUxGKQorCQkJeworCQkJCWNsKHNjYywgUjMsIFJ4RU5BQkxFKTsKKwkJCQljbChzY2MsIFIxNSwgRENESUV8U1lOQ0lFKTsKKwkJCX0KKyNlbmRpZgorCQkJCQorCQkJaWYgKHNjYy0+a2lzcy50eF9pbmhpYml0KQorCQkJeworCQkJCW9yKHNjYyxSNSwgVHhFTkFCKTsKKwkJCQlzY2MtPndyZWdbUjVdIHw9IFJUUzsKKwkJCX0gZWxzZSB7CQorCQkJCW9yKHNjYyxSNSxSVFN8VHhFTkFCKTsJLyogZW5hYmxlIHR4ICovCisJCQl9CisJCX0gZWxzZSB7CisJCQljbChzY2MsUjUsUlRTfFR4RU5BQik7CQkvKiBkaXNhYmxlIHR4ICovCisKKwkJCWlmICgoc2NjLT5raXNzLmZ1bGxkdXAgPT0gS0lTU19EVVBMRVhfSEFMRikgJiYKKyNpZm5kZWYgQ09ORklHX1NDQ19UUlhFQ0hPCisJCQkgICAgc2NjLT5raXNzLnNvZnRkY2QpCisjZWxzZQorCQkJICAgIDEpCisjZW5kaWYKKwkJCXsKKwkJCQlvcihzY2MsIFIxNSwgc2NjLT5raXNzLnNvZnRkY2Q/IFNZTkNJRTpEQ0RJRSk7CisJCQkJc3RhcnRfaHVudChzY2MpOworCQkJfQorCQl9CisJfQorCisJZW5hYmxlX2lycShzY2MtPmlycSk7Cit9CisKKworLyogLS0tLT4gU0NDIHRpbWVyIGludGVycnVwdCBoYW5kbGVyIGFuZCBmcmllbmRzLiA8LS0tLSAqLworCitzdGF0aWMgdm9pZCBfX3NjY19zdGFydF90eF90aW1lcihzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYywgdm9pZCAoKmhhbmRsZXIpKHVuc2lnbmVkIGxvbmcpLCB1bnNpZ25lZCBsb25nIHdoZW4pCit7CisJZGVsX3RpbWVyKCZzY2MtPnR4X3QpOworCisJaWYgKHdoZW4gPT0gMCkKKwl7CisJCWhhbmRsZXIoKHVuc2lnbmVkIGxvbmcpIHNjYyk7CisJfSBlbHNlIAorCWlmICh3aGVuICE9IFRJTUVSX09GRikKKwl7CisJCXNjYy0+dHhfdC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHNjYzsKKwkJc2NjLT50eF90LmZ1bmN0aW9uID0gaGFuZGxlcjsKKwkJc2NjLT50eF90LmV4cGlyZXMgPSBqaWZmaWVzICsgKHdoZW4qSFopLzEwMDsKKwkJYWRkX3RpbWVyKCZzY2MtPnR4X3QpOworCX0KK30KKworc3RhdGljIHZvaWQgc2NjX3N0YXJ0X3R4X3RpbWVyKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjLCB2b2lkICgqaGFuZGxlcikodW5zaWduZWQgbG9uZyksIHVuc2lnbmVkIGxvbmcgd2hlbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZzY2MtPmxvY2ssIGZsYWdzKTsKKwlfX3NjY19zdGFydF90eF90aW1lcihzY2MsIGhhbmRsZXIsIHdoZW4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjYy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzY2Nfc3RhcnRfZGVmZXIoc3RydWN0IHNjY19jaGFubmVsICpzY2MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NjLT5sb2NrLCBmbGFncyk7CisJZGVsX3RpbWVyKCZzY2MtPnR4X3dkb2cpOworCQorCWlmIChzY2MtPmtpc3MubWF4ZGVmZXIgIT0gMCAmJiBzY2MtPmtpc3MubWF4ZGVmZXIgIT0gVElNRVJfT0ZGKQorCXsKKwkJc2NjLT50eF93ZG9nLmRhdGEgPSAodW5zaWduZWQgbG9uZykgc2NjOworCQlzY2MtPnR4X3dkb2cuZnVuY3Rpb24gPSB0X2J1c3k7CisJCXNjYy0+dHhfd2RvZy5leHBpcmVzID0gamlmZmllcyArIEhaKnNjYy0+a2lzcy5tYXhkZWZlcjsKKwkJYWRkX3RpbWVyKCZzY2MtPnR4X3dkb2cpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2MtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc2NjX3N0YXJ0X21heGtleXVwKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjYy0+bG9jaywgZmxhZ3MpOworCWRlbF90aW1lcigmc2NjLT50eF93ZG9nKTsKKwkKKwlpZiAoc2NjLT5raXNzLm1heGtleXVwICE9IDAgJiYgc2NjLT5raXNzLm1heGtleXVwICE9IFRJTUVSX09GRikKKwl7CisJCXNjYy0+dHhfd2RvZy5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHNjYzsKKwkJc2NjLT50eF93ZG9nLmZ1bmN0aW9uID0gdF9tYXhrZXl1cDsKKwkJc2NjLT50eF93ZG9nLmV4cGlyZXMgPSBqaWZmaWVzICsgSFoqc2NjLT5raXNzLm1heGtleXVwOworCQlhZGRfdGltZXIoJnNjYy0+dHhfd2RvZyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjYy0+bG9jaywgZmxhZ3MpOworfQorCisvKiAKKyAqIFRoaXMgaXMgY2FsbGVkIGZyb20gc2NjX3R4aW50KCkgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBmcmFtZXMgdG8gc2VuZC4KKyAqIE5vdCBleGFjdGx5IGEgdGltZXIgZnVuY3Rpb24sIGJ1dCBpdCBpcyBhIGNsb3NlIGZyaWVuZCBvZiB0aGUgZmFtaWx5Li4uCisgKi8KKworc3RhdGljIHZvaWQgc2NjX3R4X2RvbmUoc3RydWN0IHNjY19jaGFubmVsICpzY2MpCit7CisJLyogCisJICogdHJ4IHJlbWFpbnMga2V5ZWQgaW4gZnVsbGR1cCBtb2RlIDIgdW50aWwgdF9pZGxlIGV4cGlyZXMuCisJICovCisJCQkJIAorCXN3aXRjaCAoc2NjLT5raXNzLmZ1bGxkdXApCisJeworCQljYXNlIEtJU1NfRFVQTEVYX0xJTks6CisJCQlzY2MtPnN0YXQudHhfc3RhdGUgPSBUWFNfSURMRTI7CisJCQlpZiAoc2NjLT5raXNzLmlkbGV0aW1lICE9IFRJTUVSX09GRikKKwkJCXNjY19zdGFydF90eF90aW1lcihzY2MsIHRfaWRsZSwgc2NjLT5raXNzLmlkbGV0aW1lKjEwMCk7CisJCQlicmVhazsKKwkJY2FzZSBLSVNTX0RVUExFWF9PUFRJTUE6CisJCQlzY2Nfbm90aWZ5KHNjYywgSFdFVl9BTExfU0VOVCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNjYy0+c3RhdC50eF9zdGF0ZSA9IFRYU19CVVNZOworCQkJc2NjX3N0YXJ0X3R4X3RpbWVyKHNjYywgdF90YWlsLCBzY2MtPmtpc3MudGFpbHRpbWUpOworCX0KKworCW5ldGlmX3dha2VfcXVldWUoc2NjLT5kZXYpOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIFJhbmQgPSAxNzsKKworc3RhdGljIGlubGluZSBpbnQgaXNfZ3JvdXBlZChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYykKK3sKKwlpbnQgazsKKwlzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYzI7CisJdW5zaWduZWQgY2hhciBncnAxLCBncnAyOworCisJZ3JwMSA9IHNjYy0+a2lzcy5ncm91cDsKKwkKKwlmb3IgKGsgPSAwOyBrIDwgKE5jaGlwcyAqIDIpOyBrKyspCisJeworCQlzY2MyID0gJlNDQ19JbmZvW2tdOworCQlncnAyID0gc2NjMi0+a2lzcy5ncm91cDsKKwkJCisJCWlmIChzY2MyID09IHNjYyB8fCAhKHNjYzItPmRldiAmJiBncnAyKSkKKwkJCWNvbnRpbnVlOworCQkKKwkJaWYgKChncnAxICYgMHgzZikgPT0gKGdycDIgJiAweDNmKSkKKwkJeworCQkJaWYgKCAoZ3JwMSAmIFRYR1JPVVApICYmIChzY2MyLT53cmVnW1I1XSAmIFJUUykgKQorCQkJCXJldHVybiAxOworCQkJCisJCQlpZiAoIChncnAxICYgUlhHUk9VUCkgJiYgc2NjMi0+ZGNkICkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogRFdBSVQgYW5kIFNMT1RUSU1FIGV4cGlyZWQKKyAqCisgKiBmdWxsZHVwID09IDA6ICBEQ0QgaXMgYWN0aXZlIG9yIFJhbmQgPiBQLXBlcnNpc3RlbmNlOiBzdGFydCB0X2J1c3kgdGltZXIKKyAqICAgICAgICAgICAgICAgIGVsc2Uga2V5IHRyeCBhbmQgc3RhcnQgdHhkZWxheQorICogZnVsbGR1cCA9PSAxOiAga2V5IHRyeCBhbmQgc3RhcnQgdHhkZWxheQorICogZnVsbGR1cCA9PSAyOiAgbWludGltZSBleHBpcmVkLCByZXNldCBzdGF0dXMgb3Iga2V5IHRyeCBhbmQgc3RhcnQgdHhkZWxheQorICovCisKK3N0YXRpYyB2b2lkIHRfZHdhaXQodW5zaWduZWQgbG9uZyBjaGFubmVsKQoreworCXN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjID0gKHN0cnVjdCBzY2NfY2hhbm5lbCAqKSBjaGFubmVsOworCQorCWlmIChzY2MtPnN0YXQudHhfc3RhdGUgPT0gVFhTX1dBSVQpCS8qIG1heGtleXVwIG9yIGlkbGUgdGltZW91dCAqLworCXsKKwkJaWYgKHNrYl9xdWV1ZV9sZW4oJnNjYy0+dHhfcXVldWUpID09IDApCS8qIG5vdGhpbmcgdG8gc2VuZCAqLworCQl7CisJCQlzY2MtPnN0YXQudHhfc3RhdGUgPSBUWFNfSURMRTsKKwkJCW5ldGlmX3dha2VfcXVldWUoc2NjLT5kZXYpOwkvKiB0X21heGtleXVwIGxvY2tlZCBpdC4gKi8KKwkJCXJldHVybjsKKwkJfQorCisJCXNjYy0+c3RhdC50eF9zdGF0ZSA9IFRYU19CVVNZOworCX0KKworCWlmIChzY2MtPmtpc3MuZnVsbGR1cCA9PSBLSVNTX0RVUExFWF9IQUxGKQorCXsKKwkJUmFuZCA9IFJhbmQgKiAxNyArIDMxOworCQkKKwkJaWYgKHNjYy0+ZGNkIHx8IChzY2MtPmtpc3MucGVyc2lzdCkgPCBSYW5kIHx8IChzY2MtPmtpc3MuZ3JvdXAgJiYgaXNfZ3JvdXBlZChzY2MpKSApCisJCXsKKwkJCXNjY19zdGFydF9kZWZlcihzY2MpOworCQkJc2NjX3N0YXJ0X3R4X3RpbWVyKHNjYywgdF9kd2FpdCwgc2NjLT5raXNzLnNsb3R0aW1lKTsKKwkJCXJldHVybiA7CisJCX0KKwl9CisKKwlpZiAoICEoc2NjLT53cmVnW1I1XSAmIFJUUykgKQorCXsKKwkJc2NjX2tleV90cngoc2NjLCBUWF9PTik7CisJCXNjY19zdGFydF90eF90aW1lcihzY2MsIHRfdHhkZWxheSwgc2NjLT5raXNzLnR4ZGVsYXkpOworCX0gZWxzZSB7CisJCXNjY19zdGFydF90eF90aW1lcihzY2MsIHRfdHhkZWxheSwgMCk7CisJfQorfQorCisKKy8qIFRYREVMQVkgZXhwaXJlZAorICoKKyAqIGtpY2sgdHJhbnNtaXNzaW9uIGJ5IGEgZmFrZSBzY2NfdHhpbnQoc2NjKSwgc3RhcnQgJ21heGtleXVwJyB3YXRjaGRvZy4KKyAqLworCitzdGF0aWMgdm9pZCB0X3R4ZGVsYXkodW5zaWduZWQgbG9uZyBjaGFubmVsKQoreworCXN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjID0gKHN0cnVjdCBzY2NfY2hhbm5lbCAqKSBjaGFubmVsOworCisJc2NjX3N0YXJ0X21heGtleXVwKHNjYyk7CisKKwlpZiAoc2NjLT50eF9idWZmID09IE5VTEwpCisJeworCQlkaXNhYmxlX2lycShzY2MtPmlycSk7CisJCXNjY190eGludChzY2MpOwkKKwkJZW5hYmxlX2lycShzY2MtPmlycSk7CisJfQorfQorCQorCisvKiBUQUlMVElNRSBleHBpcmVkCisgKgorICogc3dpdGNoIG9mZiB0cmFuc21pdHRlci4gSWYgd2Ugd2VyZSBzdG9wcGVkIGJ5IE1heGtleXVwIHJlc3RhcnQKKyAqIHRyYW5zbWlzc2lvbiBhZnRlciAnbWludGltZScgc2Vjb25kcworICovCisKK3N0YXRpYyB2b2lkIHRfdGFpbCh1bnNpZ25lZCBsb25nIGNoYW5uZWwpCit7CisJc3RydWN0IHNjY19jaGFubmVsICpzY2MgPSAoc3RydWN0IHNjY19jaGFubmVsICopIGNoYW5uZWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NjLT5sb2NrLCBmbGFncyk7IAorIAlkZWxfdGltZXIoJnNjYy0+dHhfd2RvZyk7CQorIAlzY2Nfa2V5X3RyeChzY2MsIFRYX09GRik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NjLT5sb2NrLCBmbGFncyk7CisKKyAJaWYgKHNjYy0+c3RhdC50eF9zdGF0ZSA9PSBUWFNfVElNRU9VVCkJCS8qIHdlIGhhZCBhIHRpbWVvdXQ/ICovCisgCXsKKyAJCXNjYy0+c3RhdC50eF9zdGF0ZSA9IFRYU19XQUlUOworCQlzY2Nfc3RhcnRfdHhfdGltZXIoc2NjLCB0X2R3YWl0LCBzY2MtPmtpc3MubWludGltZSoxMDApOworIAkJcmV0dXJuOworIAl9CisgCQorIAlzY2MtPnN0YXQudHhfc3RhdGUgPSBUWFNfSURMRTsKKwluZXRpZl93YWtlX3F1ZXVlKHNjYy0+ZGV2KTsKK30KKworCisvKiBCVVNZIHRpbWVvdXQKKyAqCisgKiB0aHJvdyBhd2F5IHNlbmQgYnVmZmVycyBpZiBEQ0QgcmVtYWlucyBhY3RpdmUgdG9vIGxvbmcuCisgKi8KKworc3RhdGljIHZvaWQgdF9idXN5KHVuc2lnbmVkIGxvbmcgY2hhbm5lbCkKK3sKKwlzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYyA9IChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKikgY2hhbm5lbDsKKworCWRlbF90aW1lcigmc2NjLT50eF90KTsKKwluZXRpZl9zdG9wX3F1ZXVlKHNjYy0+ZGV2KTsJLyogZG9uJ3QgcGlsZSBvbiB0aGUgd2FiYml0ISAqLworCisJc2NjX2Rpc2NhcmRfYnVmZmVycyhzY2MpOworCXNjYy0+c3RhdC50eGVycnMrKzsKKwlzY2MtPnN0YXQudHhfc3RhdGUgPSBUWFNfSURMRTsKKworCW5ldGlmX3dha2VfcXVldWUoc2NjLT5kZXYpOwkKK30KKworLyogTUFYS0VZVVAgdGltZW91dAorICoKKyAqIHRoaXMgaXMgb3VyIHdhdGNoZG9nLgorICovCisKK3N0YXRpYyB2b2lkIHRfbWF4a2V5dXAodW5zaWduZWQgbG9uZyBjaGFubmVsKQoreworCXN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjID0gKHN0cnVjdCBzY2NfY2hhbm5lbCAqKSBjaGFubmVsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NjLT5sb2NrLCBmbGFncyk7CisJLyogCisJICogbGV0IHRoaW5ncyBzZXR0bGUgZG93biBiZWZvcmUgd2Ugc3RhcnQgdG8KKwkgKiBhY2NlcHQgbmV3IGRhdGEuCisJICovCisKKwluZXRpZl9zdG9wX3F1ZXVlKHNjYy0+ZGV2KTsKKwlzY2NfZGlzY2FyZF9idWZmZXJzKHNjYyk7CisKKwlkZWxfdGltZXIoJnNjYy0+dHhfdCk7CisKKwljbChzY2MsIFIxLCBUeElOVF9FTkFCKTsJLyogZm9yY2UgYW4gQUJPUlQsIGJ1dCBkb24ndCAqLworCWNsKHNjYywgUjE1LCBUeFVJRSk7CQkvKiBjb3VudCBpdC4gKi8KKwlPdXRSZWcoc2NjLT5jdHJsLCBSMCwgUkVTX1R4X1ApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NjLT5sb2NrLCBmbGFncyk7CisKKwlzY2MtPnN0YXQudHhlcnJzKys7CisJc2NjLT5zdGF0LnR4X3N0YXRlID0gVFhTX1RJTUVPVVQ7CisJc2NjX3N0YXJ0X3R4X3RpbWVyKHNjYywgdF90YWlsLCBzY2MtPmtpc3MudGFpbHRpbWUpOworfQorCisvKiBJRExFIHRpbWVvdXQKKyAqCisgKiBpbiBmdWxsZHVwIG1vZGUgMiBpdCBrZXlzIGRvd24gdGhlIHRyYW5zbWl0dGVyIGFmdGVyICdpZGxlJyBzZWNvbmRzCisgKiBvZiBpbmFjdGl2aXR5LiBXZSB3aWxsIG5vdCByZXN0YXJ0IHRyYW5zbWlzc2lvbiBiZWZvcmUgJ21pbnRpbWUnCisgKiBleHBpcmVzLgorICovCisKK3N0YXRpYyB2b2lkIHRfaWRsZSh1bnNpZ25lZCBsb25nIGNoYW5uZWwpCit7CisJc3RydWN0IHNjY19jaGFubmVsICpzY2MgPSAoc3RydWN0IHNjY19jaGFubmVsICopIGNoYW5uZWw7CisJCisJZGVsX3RpbWVyKCZzY2MtPnR4X3dkb2cpOworCisJc2NjX2tleV90cngoc2NjLCBUWF9PRkYpOworCWlmKHNjYy0+a2lzcy5taW50aW1lKQorCQlzY2Nfc3RhcnRfdHhfdGltZXIoc2NjLCB0X2R3YWl0LCBzY2MtPmtpc3MubWludGltZSoxMDApOworCXNjYy0+c3RhdC50eF9zdGF0ZSA9IFRYU19XQUlUOworfQorCitzdGF0aWMgdm9pZCBzY2NfaW5pdF90aW1lcihzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjYy0+bG9jaywgZmxhZ3MpOwkKKwlzY2MtPnN0YXQudHhfc3RhdGUgPSBUWFNfSURMRTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2MtPmxvY2ssIGZsYWdzKTsKK30KKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKgkJCVNldC9nZXQgTDEgcGFyYW1ldGVycwkJCSAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKworLyoKKyAqIHRoaXMgd2lsbCBzZXQgdGhlICJoYXJkd2FyZSIgcGFyYW1ldGVycyB0aHJvdWdoIEtJU1MgY29tbWFuZHMgb3IgaW9jdGwoKQorICovCisKKyNkZWZpbmUgQ0FTVCh4KSAodW5zaWduZWQgbG9uZykoeCkKKworc3RhdGljIHVuc2lnbmVkIGludCBzY2Nfc2V0X3BhcmFtKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBpbnQgYXJnKQoreworCXN3aXRjaCAoY21kKQorCXsKKwkJY2FzZSBQQVJBTV9UWERFTEFZOglzY2MtPmtpc3MudHhkZWxheT1hcmc7CQlicmVhazsKKwkJY2FzZSBQQVJBTV9QRVJTSVNUOglzY2MtPmtpc3MucGVyc2lzdD1hcmc7CQlicmVhazsKKwkJY2FzZSBQQVJBTV9TTE9UVElNRToJc2NjLT5raXNzLnNsb3R0aW1lPWFyZzsJCWJyZWFrOworCQljYXNlIFBBUkFNX1RYVEFJTDoJc2NjLT5raXNzLnRhaWx0aW1lPWFyZzsJCWJyZWFrOworCQljYXNlIFBBUkFNX0ZVTExEVVA6CXNjYy0+a2lzcy5mdWxsZHVwPWFyZzsJCWJyZWFrOworCQljYXNlIFBBUkFNX0RUUjoJCWJyZWFrOyAvKiBkb2VzIHNvbWVvbmUgbmVlZCB0aGlzPyAqLworCQljYXNlIFBBUkFNX0dST1VQOglzY2MtPmtpc3MuZ3JvdXA9YXJnOwkJYnJlYWs7CisJCWNhc2UgUEFSQU1fSURMRToJc2NjLT5raXNzLmlkbGV0aW1lPWFyZzsJCWJyZWFrOworCQljYXNlIFBBUkFNX01JTjoJCXNjYy0+a2lzcy5taW50aW1lPWFyZzsJCWJyZWFrOworCQljYXNlIFBBUkFNX01BWEtFWToJc2NjLT5raXNzLm1heGtleXVwPWFyZzsJCWJyZWFrOworCQljYXNlIFBBUkFNX1dBSVQ6CXNjYy0+a2lzcy53YWl0dGltZT1hcmc7CQlicmVhazsKKwkJY2FzZSBQQVJBTV9NQVhERUZFUjoJc2NjLT5raXNzLm1heGRlZmVyPWFyZzsJCWJyZWFrOworCQljYXNlIFBBUkFNX1RYOgkJc2NjLT5raXNzLnR4X2luaGliaXQ9YXJnOwlicmVhazsKKworCQljYXNlIFBBUkFNX1NPRlREQ0Q6CQorCQkJc2NjLT5raXNzLnNvZnRkY2Q9YXJnOworCQkJaWYgKGFyZykKKwkJCXsKKwkJCQlvcihzY2MsIFIxNSwgU1lOQ0lFKTsKKwkJCQljbChzY2MsIFIxNSwgRENESUUpOworCQkJCXN0YXJ0X2h1bnQoc2NjKTsKKwkJCX0gZWxzZSB7CisJCQkJb3Ioc2NjLCBSMTUsIERDRElFKTsKKwkJCQljbChzY2MsIFIxNSwgU1lOQ0lFKTsKKwkJCX0KKwkJCWJyZWFrOworCQkJCQorCQljYXNlIFBBUkFNX1NQRUVEOgorCQkJaWYgKGFyZyA8IDI1NikKKwkJCQlzY2MtPm1vZGVtLnNwZWVkPWFyZyoxMDA7CisJCQllbHNlCisJCQkJc2NjLT5tb2RlbS5zcGVlZD1hcmc7CisKKwkJCWlmIChzY2MtPnN0YXQudHhfc3RhdGUgPT0gMCkJLyogb25seSBzd2l0Y2ggYmF1ZHJhdGUgb24gcnguLi4gOy0pICovCisJCQkJc2V0X3NwZWVkKHNjYyk7CisJCQlicmVhazsKKwkJCQorCQljYXNlIFBBUkFNX1JUUzoJCisJCQlpZiAoICEoc2NjLT53cmVnW1I1XSAmIFJUUykgKQorCQkJeworCQkJCWlmIChhcmcgIT0gVFhfT0ZGKQorCQkJCQlzY2Nfa2V5X3RyeChzY2MsIFRYX09OKTsKKwkJCQkJc2NjX3N0YXJ0X3R4X3RpbWVyKHNjYywgdF90eGRlbGF5LCBzY2MtPmtpc3MudHhkZWxheSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChhcmcgPT0gVFhfT0ZGKQorCQkJCXsKKwkJCQkJc2NjLT5zdGF0LnR4X3N0YXRlID0gVFhTX0JVU1k7CisJCQkJCXNjY19zdGFydF90eF90aW1lcihzY2MsIHRfdGFpbCwgc2NjLT5raXNzLnRhaWx0aW1lKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJCQorCQljYXNlIFBBUkFNX0hXRVZFTlQ6CisJCQlzY2Nfbm90aWZ5KHNjYywgc2NjLT5kY2Q/IEhXRVZfRENEX09OOkhXRVZfRENEX09GRik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQorCXJldHVybiAwOworfQorCisKKyAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNjY19nZXRfcGFyYW0oc3RydWN0IHNjY19jaGFubmVsICpzY2MsIHVuc2lnbmVkIGludCBjbWQpCit7CisJc3dpdGNoIChjbWQpCisJeworCQljYXNlIFBBUkFNX1RYREVMQVk6CXJldHVybiBDQVNUKHNjYy0+a2lzcy50eGRlbGF5KTsKKwkJY2FzZSBQQVJBTV9QRVJTSVNUOglyZXR1cm4gQ0FTVChzY2MtPmtpc3MucGVyc2lzdCk7CisJCWNhc2UgUEFSQU1fU0xPVFRJTUU6CXJldHVybiBDQVNUKHNjYy0+a2lzcy5zbG90dGltZSk7CisJCWNhc2UgUEFSQU1fVFhUQUlMOglyZXR1cm4gQ0FTVChzY2MtPmtpc3MudGFpbHRpbWUpOworCQljYXNlIFBBUkFNX0ZVTExEVVA6CXJldHVybiBDQVNUKHNjYy0+a2lzcy5mdWxsZHVwKTsKKwkJY2FzZSBQQVJBTV9TT0ZURENEOglyZXR1cm4gQ0FTVChzY2MtPmtpc3Muc29mdGRjZCk7CisJCWNhc2UgUEFSQU1fRFRSOgkJcmV0dXJuIENBU1QoKHNjYy0+d3JlZ1tSNV0gJiBEVFIpPyAxOjApOworCQljYXNlIFBBUkFNX1JUUzoJCXJldHVybiBDQVNUKChzY2MtPndyZWdbUjVdICYgUlRTKT8gMTowKTsKKwkJY2FzZSBQQVJBTV9TUEVFRDoJcmV0dXJuIENBU1Qoc2NjLT5tb2RlbS5zcGVlZCk7CisJCWNhc2UgUEFSQU1fR1JPVVA6CXJldHVybiBDQVNUKHNjYy0+a2lzcy5ncm91cCk7CisJCWNhc2UgUEFSQU1fSURMRToJcmV0dXJuIENBU1Qoc2NjLT5raXNzLmlkbGV0aW1lKTsKKwkJY2FzZSBQQVJBTV9NSU46CQlyZXR1cm4gQ0FTVChzY2MtPmtpc3MubWludGltZSk7CisJCWNhc2UgUEFSQU1fTUFYS0VZOglyZXR1cm4gQ0FTVChzY2MtPmtpc3MubWF4a2V5dXApOworCQljYXNlIFBBUkFNX1dBSVQ6CXJldHVybiBDQVNUKHNjYy0+a2lzcy53YWl0dGltZSk7CisJCWNhc2UgUEFSQU1fTUFYREVGRVI6CXJldHVybiBDQVNUKHNjYy0+a2lzcy5tYXhkZWZlcik7CisJCWNhc2UgUEFSQU1fVFg6CQlyZXR1cm4gQ0FTVChzY2MtPmtpc3MudHhfaW5oaWJpdCk7CisJCWRlZmF1bHQ6CQlyZXR1cm4gTk9fU1VDSF9QQVJBTTsKKwl9CisKK30KKworI3VuZGVmIENBU1QKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKgkJCVNlbmQgY2FsaWJyYXRpb24gcGF0dGVybgkJICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB2b2lkIHNjY19zdG9wX2NhbGlicmF0ZSh1bnNpZ25lZCBsb25nIGNoYW5uZWwpCit7CisJc3RydWN0IHNjY19jaGFubmVsICpzY2MgPSAoc3RydWN0IHNjY19jaGFubmVsICopIGNoYW5uZWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NjLT5sb2NrLCBmbGFncyk7CisJZGVsX3RpbWVyKCZzY2MtPnR4X3dkb2cpOworCXNjY19rZXlfdHJ4KHNjYywgVFhfT0ZGKTsKKwl3cihzY2MsIFI2LCAwKTsKKwl3cihzY2MsIFI3LCBGTEFHKTsKKwlPdXRiKHNjYy0+Y3RybCxSRVNfRVhUX0lOVCk7CS8qIHJlc2V0IGV4dC9zdGF0dXMgaW50ZXJydXB0cyAqLworCU91dGIoc2NjLT5jdHJsLFJFU19FWFRfSU5UKTsKKworCW5ldGlmX3dha2VfcXVldWUoc2NjLT5kZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjYy0+bG9jaywgZmxhZ3MpOworfQorCisKK3N0YXRpYyB2b2lkCitzY2Nfc3RhcnRfY2FsaWJyYXRlKHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjLCBpbnQgZHVyYXRpb24sIHVuc2lnbmVkIGNoYXIgcGF0dGVybikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZzY2MtPmxvY2ssIGZsYWdzKTsKKwluZXRpZl9zdG9wX3F1ZXVlKHNjYy0+ZGV2KTsKKwlzY2NfZGlzY2FyZF9idWZmZXJzKHNjYyk7CisKKwlkZWxfdGltZXIoJnNjYy0+dHhfd2RvZyk7CisKKwlzY2MtPnR4X3dkb2cuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBzY2M7CisJc2NjLT50eF93ZG9nLmZ1bmN0aW9uID0gc2NjX3N0b3BfY2FsaWJyYXRlOworCXNjYy0+dHhfd2RvZy5leHBpcmVzID0gamlmZmllcyArIEhaKmR1cmF0aW9uOworCWFkZF90aW1lcigmc2NjLT50eF93ZG9nKTsKKworCS8qIFRoaXMgZG9lc24ndCBzZWVtIHRvIHdvcmsuIFdoeSBub3Q/ICovCQorCXdyKHNjYywgUjYsIDApOworCXdyKHNjYywgUjcsIHBhdHRlcm4pOworCisJLyogCisJICogRG9uJ3Qga25vdyBpZiB0aGlzIHdvcmtzLiAKKwkgKiBEYW1uLCB3aGVyZSBpcyBteSBaODUzMCBwcm9ncmFtbWluZyBtYW51YWwuLi4/IAorCSAqLworCisJT3V0YihzY2MtPmN0cmwsUkVTX0VYVF9JTlQpOwkvKiByZXNldCBleHQvc3RhdHVzIGludGVycnVwdHMgKi8KKwlPdXRiKHNjYy0+Y3RybCxSRVNfRVhUX0lOVCk7CisKKwlzY2Nfa2V5X3RyeChzY2MsIFRYX09OKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2MtPmxvY2ssIGZsYWdzKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKgkJSW5pdCBjaGFubmVsIHN0cnVjdHVyZXMsIHNwZWNpYWwgSFcsIGV0Yy4uLgkgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyoKKyAqIFJlc2V0IHRoZSBaODUzMHMgYW5kIHNldHVwIHNwZWNpYWwgaGFyZHdhcmUKKyAqLworCitzdGF0aWMgdm9pZCB6ODUzMF9pbml0KHZvaWQpCit7CisJc3RydWN0IHNjY19jaGFubmVsICpzY2M7CisJaW50IGNoaXAsIGs7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljaGFyICpmbGFnOworCisKKwlwcmludGsoS0VSTl9JTkZPICJJbml0IFo4NTMwIGRyaXZlcjogJXUgY2hhbm5lbHMsIElSUSIsIE5jaGlwcyoyKTsKKwkKKwlmbGFnPSIgIjsKKwlmb3IgKGsgPSAwOyBrIDwgTlJfSVJRUzsgaysrKQorCQlpZiAoSXZlY1trXS51c2VkKSAKKwkJeworCQkJcHJpbnRrKCIlcyVkIiwgZmxhZywgayk7CisJCQlmbGFnPSIsIjsKKwkJfQorCXByaW50aygiXG4iKTsKKworCisJLyogcmVzZXQgYW5kIHByZS1pbml0IGFsbCBjaGlwcyBpbiB0aGUgc3lzdGVtICovCisJZm9yIChjaGlwID0gMDsgY2hpcCA8IE5jaGlwczsgY2hpcCsrKQorCXsKKwkJc2NjPSZTQ0NfSW5mb1syKmNoaXBdOworCQlpZiAoIXNjYy0+Y3RybCkgY29udGludWU7CisKKwkJLyogU3BlY2lhbCBTQ0MgY2FyZHMgKi8KKworCQlpZihzY2MtPmJyYW5kICYgRUFHTEUpCQkJLyogdGhpcyBpcyBhbiBFQUdMRSBjYXJkICovCisJCQlPdXRiKHNjYy0+c3BlY2lhbCwweDA4KTsJLyogZW5hYmxlIGludGVycnVwdCBvbiB0aGUgYm9hcmQgKi8KKwkJCQorCQlpZihzY2MtPmJyYW5kICYgKFBDMTAwIHwgUFJJTVVTKSkJLyogdGhpcyBpcyBhIFBDMTAwL1BSSU1VUyBjYXJkICovCisJCQlPdXRiKHNjYy0+c3BlY2lhbCxzY2MtPm9wdGlvbik7CS8qIHNldCB0aGUgTU9ERU0gbW9kZSAoMHgyMikgKi8KKworCQkJCisJCS8qIFJlc2V0IGFuZCBwcmUtaW5pdCBaODUzMCAqLworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzY2MtPmxvY2ssIGZsYWdzKTsKKwkJCQkKKwkJT3V0YihzY2MtPmN0cmwsIDApOworCQlPdXRSZWcoc2NjLT5jdHJsLFI5LEZIV1JFUyk7CQkvKiBmb3JjZSBoYXJkd2FyZSByZXNldCAqLworCQl1ZGVsYXkoMTAwKTsJCQkJLyogZ2l2ZSBpdCAnYSBiaXQnIG1vcmUgdGltZSB0aGFuIHJlcXVpcmVkICovCisJCXdyKHNjYywgUjIsIGNoaXAqMTYpOwkJCS8qIGludGVycnVwdCB2ZWN0b3IgKi8KKwkJd3Ioc2NjLCBSOSwgVklTKTsJCQkvKiB2ZWN0b3IgaW5jbHVkZXMgc3RhdHVzICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjYy0+bG9jaywgZmxhZ3MpOwkJCisgICAgICAgIH0KKworIAorCURyaXZlcl9Jbml0aWFsaXplZCA9IDE7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlLCBlcnIsIGluc3RhbmNlLCBhbmQgcmVnaXN0ZXIgZHJpdmVyCisgKi8KKworc3RhdGljIGludCBzY2NfbmV0X2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjKQoreworCWludCBlcnI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCWRldiA9IGFsbG9jX25ldGRldigwLCBuYW1lLCBzY2NfbmV0X3NldHVwKTsKKwlpZiAoIWRldikgCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2LT5wcml2ID0gc2NjOworCXNjYy0+ZGV2ID0gZGV2OworCXNwaW5fbG9ja19pbml0KCZzY2MtPmxvY2spOworCWluaXRfdGltZXIoJnNjYy0+dHhfdCk7CisJaW5pdF90aW1lcigmc2NjLT50eF93ZG9nKTsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldmljZShkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgcmVnaXN0ZXIgbmV0d29yayBkZXZpY2UgKCVkKVxuIiwgCisJCSAgICAgICBuYW1lLCBlcnIpOworCQlmcmVlX25ldGRldihkZXYpOworCQlzY2MtPmRldiA9IE5VTEw7CisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKgkJCSAgICBOZXR3b3JrIGRyaXZlciBtZXRob2RzCQkgICAgICAqICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBheDI1X2JjYXN0W0FYMjVfQUREUl9MRU5dID0KK3snUScgPDwgMSwgJ1MnIDw8IDEsICdUJyA8PCAxLCAnICcgPDwgMSwgJyAnIDw8IDEsICcgJyA8PCAxLCAnMCcgPDwgMX07CitzdGF0aWMgdW5zaWduZWQgY2hhciBheDI1X25vY2FsbFtBWDI1X0FERFJfTEVOXSA9Cit7J0wnIDw8IDEsICdJJyA8PCAxLCAnTicgPDwgMSwgJ1UnIDw8IDEsICdYJyA8PCAxLCAnICcgPDwgMSwgJzEnIDw8IDF9OworCisvKiAtLS0tPiBJbml0aWFsaXplIGRldmljZSA8LS0tLS0gKi8KKworc3RhdGljIHZvaWQgc2NjX25ldF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlkZXYtPnR4X3F1ZXVlX2xlbiAgICA9IDE2OwkvKiBzaG91bGQgYmUgZW5vdWdoLi4uICovCisKKwlkZXYtPm9wZW4gICAgICAgICAgICA9IHNjY19uZXRfb3BlbjsKKwlkZXYtPnN0b3AJICAgICA9IHNjY19uZXRfY2xvc2U7CisKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHNjY19uZXRfdHg7CisJZGV2LT5oYXJkX2hlYWRlciAgICAgPSBheDI1X2VuY2Fwc3VsYXRlOworCWRldi0+cmVidWlsZF9oZWFkZXIgID0gYXgyNV9yZWJ1aWxkX2hlYWRlcjsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IHNjY19uZXRfc2V0X21hY19hZGRyZXNzOworCWRldi0+Z2V0X3N0YXRzICAgICAgID0gc2NjX25ldF9nZXRfc3RhdHM7CisJZGV2LT5kb19pb2N0bCAgICAgICAgPSBzY2NfbmV0X2lvY3RsOworCWRldi0+dHhfdGltZW91dCAgICAgID0gTlVMTDsKKworCW1lbWNweShkZXYtPmJyb2FkY2FzdCwgYXgyNV9iY2FzdCwgIEFYMjVfQUREUl9MRU4pOworCW1lbWNweShkZXYtPmRldl9hZGRyLCAgYXgyNV9ub2NhbGwsIEFYMjVfQUREUl9MRU4pOworIAorCWRldi0+ZmxhZ3MgICAgICA9IDA7CisKKwlkZXYtPnR5cGUgPSBBUlBIUkRfQVgyNTsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IEFYMjVfTUFYX0hFQURFUl9MRU4gKyBBWDI1X0JQUV9IRUFERVJfTEVOOworCWRldi0+bXR1ID0gQVgyNV9ERUZfUEFDTEVOOworCWRldi0+YWRkcl9sZW4gPSBBWDI1X0FERFJfTEVOOworCit9CisKKy8qIC0tLS0+IG9wZW4gbmV0d29yayBkZXZpY2UgPC0tLS0gKi8KKworc3RhdGljIGludCBzY2NfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYyA9IChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKikgZGV2LT5wcml2OworCisgCWlmICghc2NjLT5pbml0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNjYy0+dHhfYnVmZiA9IE5VTEw7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2NjLT50eF9xdWV1ZSk7CisgCisJaW5pdF9jaGFubmVsKHNjYyk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCisvKiAtLS0tPiBjbG9zZSBuZXR3b3JrIGRldmljZSA8LS0tLSAqLworCitzdGF0aWMgaW50IHNjY19uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYyA9IChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2NjLT5sb2NrLCBmbGFncyk7CQorCU91dGIoc2NjLT5jdHJsLDApOwkJLyogTWFrZSBzdXJlIHBvaW50ZXIgaXMgd3JpdHRlbiAqLworCXdyKHNjYyxSMSwwKTsJCQkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwl3cihzY2MsUjMsMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NjLT5sb2NrLCBmbGFncyk7CisKKwlkZWxfdGltZXJfc3luYygmc2NjLT50eF90KTsKKwlkZWxfdGltZXJfc3luYygmc2NjLT50eF93ZG9nKTsKKwkKKwlzY2NfZGlzY2FyZF9idWZmZXJzKHNjYyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLT4gcmVjZWl2ZSBmcmFtZSwgY2FsbGVkIGZyb20gc2NjX3J4aW50KCkgPC0tLS0gKi8KKworc3RhdGljIHZvaWQgc2NjX25ldF9yeChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAoc2tiLT5sZW4gPT0gMCkgeworCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQlyZXR1cm47CisJfQorCQkKKwlzY2MtPmRldl9zdGF0LnJ4X3BhY2tldHMrKzsKKwlzY2MtPmRldl9zdGF0LnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCisJc2tiLT5kZXYgICAgICA9IHNjYy0+ZGV2OworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9BWDI1KTsKKwlza2ItPm1hYy5yYXcgID0gc2tiLT5kYXRhOworCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKKwkKKwluZXRpZl9yeChza2IpOworCXNjYy0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlyZXR1cm47Cit9CisKKy8qIC0tLS0+IHRyYW5zbWl0IGZyYW1lIDwtLS0tICovCisKK3N0YXRpYyBpbnQgc2NjX25ldF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjID0gKHN0cnVjdCBzY2NfY2hhbm5lbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljaGFyIGtpc3NjbWQ7CisKKwlpZiAoc2tiLT5sZW4gPiBzY2MtPnN0YXQuYnVmc2l6ZSB8fCBza2ItPmxlbiA8IDIpIHsKKwkJc2NjLT5kZXZfc3RhdC50eF9kcm9wcGVkKys7CS8qIGJvZ3VzIGZyYW1lICovCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCXNjYy0+ZGV2X3N0YXQudHhfcGFja2V0cysrOworCXNjYy0+ZGV2X3N0YXQudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJc2NjLT5zdGF0LnR4ZnJhbWVzKys7CisJCisJa2lzc2NtZCA9ICpza2ItPmRhdGEgJiAweDFmOworCXNrYl9wdWxsKHNrYiwgMSk7CisKKwlpZiAoa2lzc2NtZCkgeworCQlzY2Nfc2V0X3BhcmFtKHNjYywga2lzc2NtZCwgKnNrYi0+ZGF0YSk7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjYy0+bG9jaywgZmxhZ3MpOworCQkKKwlpZiAoc2tiX3F1ZXVlX2xlbigmc2NjLT50eF9xdWV1ZSkgPiBzY2MtPmRldi0+dHhfcXVldWVfbGVuKSB7CisJCXN0cnVjdCBza19idWZmICpza2JfZGVsOworCQlza2JfZGVsID0gc2tiX2RlcXVldWUoJnNjYy0+dHhfcXVldWUpOworCQlkZXZfa2ZyZWVfc2tiKHNrYl9kZWwpOworCX0KKwlza2JfcXVldWVfdGFpbCgmc2NjLT50eF9xdWV1ZSwgc2tiKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkKKworCS8qCisJICogU3RhcnQgdHJhbnNtaXNzaW9uIGlmIHRoZSB0cnggc3RhdGUgaXMgaWRsZSBvcgorCSAqIHRfaWRsZSBoYXNuJ3QgZXhwaXJlZCB5ZXQuIFVzZSBkd2FpdC9wZXJzaXN0ZW5jZS9zbG90dGltZQorCSAqIGFsZ29yaXRobSBmb3Igbm9ybWFsIGhhbGZkdXBsZXggb3BlcmF0aW9uLgorCSAqLworCisJaWYoc2NjLT5zdGF0LnR4X3N0YXRlID09IFRYU19JRExFIHx8IHNjYy0+c3RhdC50eF9zdGF0ZSA9PSBUWFNfSURMRTIpIHsKKwkJc2NjLT5zdGF0LnR4X3N0YXRlID0gVFhTX0JVU1k7CisJCWlmIChzY2MtPmtpc3MuZnVsbGR1cCA9PSBLSVNTX0RVUExFWF9IQUxGKQorCQkJX19zY2Nfc3RhcnRfdHhfdGltZXIoc2NjLCB0X2R3YWl0LCBzY2MtPmtpc3Mud2FpdHRpbWUpOworCQllbHNlCisJCQlfX3NjY19zdGFydF90eF90aW1lcihzY2MsIHRfZHdhaXQsIDApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY2MtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLT4gaW9jdGwgZnVuY3Rpb25zIDwtLS0tICovCisKKy8qCisgKiBTSU9DU0NDQ0ZHCQktIGNvbmZpZ3VyZSBkcml2ZXIJYXJnOiAoc3RydWN0IHNjY19od19jb25maWcgKikgYXJnCisgKiBTSU9DU0NDSU5JCQktIGluaXRpYWxpemUgZHJpdmVyCWFyZzogLS0tCisgKiBTSU9DU0NDQ0hBTklOSQktIGluaXRpYWxpemUgY2hhbm5lbAlhcmc6IChzdHJ1Y3Qgc2NjX21vZGVtICopIGFyZworICogU0lPQ1NDQ1NNRU0JCS0gc2V0IG1lbW9yeQkJYXJnOiAoc3RydWN0IHNjY19tZW1fY29uZmlnICopIGFyZworICogU0lPQ1NDQ0dLSVNTCQktIGdldCBsZXZlbCAxIHBhcmFtZXRlcglhcmc6IChzdHJ1Y3Qgc2NjX2tpc3NfY21kICopIGFyZworICogU0lPQ1NDQ1NLSVNTCQktIHNldCBsZXZlbCAxIHBhcmFtZXRlciBhcmc6IChzdHJ1Y3Qgc2NjX2tpc3NfY21kICopIGFyZworICogU0lPQ1NDQ0dTVEFUCQktIGdldCBkcml2ZXIgc3RhdHVzCWFyZzogKHN0cnVjdCBzY2Nfc3RhdCAqKSBhcmcKKyAqIFNJT0NTQ0NDQUwJCS0gc2VuZCBjYWxpYi4gcGF0dGVybglhcmc6IChzdHJ1Y3Qgc2NjX2NhbGlicmF0ZSAqKSBhcmcKKyAqLworCitzdGF0aWMgaW50IHNjY19uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IHNjY19raXNzX2NtZCBraXNzX2NtZDsKKwlzdHJ1Y3Qgc2NjX21lbV9jb25maWcgbWVtY2ZnOworCXN0cnVjdCBzY2NfaHdfY29uZmlnIGh3Y2ZnOworCXN0cnVjdCBzY2NfY2FsaWJyYXRlIGNhbDsKKwlzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYyA9IChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKikgZGV2LT5wcml2OworCWludCBjaGFuOworCXVuc2lnbmVkIGNoYXIgZGV2aWNlX25hbWVbSUZOQU1TSVpdOworCXZvaWQgX191c2VyICphcmcgPSBpZnItPmlmcl9kYXRhOworCQorCQorCWlmICghRHJpdmVyX0luaXRpYWxpemVkKQorCXsKKwkJaWYgKGNtZCA9PSBTSU9DU0NDQ0ZHKQorCQl7CisJCQlpbnQgZm91bmQgPSAxOworCisJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpIHJldHVybiAtRVBFUk07CisJCQlpZiAoIWFyZykgcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChOY2hpcHMgPj0gU0NDX01BWENISVBTKSAKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZod2NmZywgYXJnLCBzaXplb2YoaHdjZmcpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKGh3Y2ZnLmlycSA9PSAyKSBod2NmZy5pcnEgPSA5OworCisJCQlpZiAoaHdjZmcuaXJxIDwgMCB8fCBod2NmZy5pcnEgPj0gTlJfSVJRUykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkKKwkJCWlmICghSXZlY1tod2NmZy5pcnFdLnVzZWQgJiYgaHdjZmcuaXJxKQorCQkJeworCQkJCWlmIChyZXF1ZXN0X2lycShod2NmZy5pcnEsIHNjY19pc3IsIFNBX0lOVEVSUlVQVCwgIkFYLjI1IFNDQyIsIE5VTEwpKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ6ODUzMGRydjogd2FybmluZywgY2Fubm90IGdldCBJUlEgJWRcbiIsIGh3Y2ZnLmlycSk7CisJCQkJZWxzZQorCQkJCQlJdmVjW2h3Y2ZnLmlycV0udXNlZCA9IDE7CisJCQl9CisKKwkJCWlmIChod2NmZy52ZWN0b3JfbGF0Y2ggJiYgIVZlY3Rvcl9MYXRjaCkgeworCQkJCWlmICghcmVxdWVzdF9yZWdpb24oaHdjZmcudmVjdG9yX2xhdGNoLCAxLCAic2NjIHZlY3RvciBsYXRjaCIpKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ6ODUzMGRydjogd2FybmluZywgY2Fubm90IHJlc2VydmUgdmVjdG9yIGxhdGNoIHBvcnQgMHglbHhcbiwgZGlzYWJsZWQuIiwgaHdjZmcudmVjdG9yX2xhdGNoKTsKKwkJCQllbHNlCisJCQkJCVZlY3Rvcl9MYXRjaCA9IGh3Y2ZnLnZlY3Rvcl9sYXRjaDsKKwkJCX0KKworCQkJaWYgKGh3Y2ZnLmNsb2NrID09IDApCisJCQkJaHdjZmcuY2xvY2sgPSBTQ0NfREVGQVVMVF9DTE9DSzsKKworI2lmbmRlZiBTQ0NfRE9OVF9DSEVDSworCisJCQlpZihyZXF1ZXN0X3JlZ2lvbihod2NmZy5jdHJsX2EsIDEsICJzY2MtcHJvYmUiKSkKKwkJCXsKKwkJCQlkaXNhYmxlX2lycShod2NmZy5pcnEpOworCQkJCU91dGIoaHdjZmcuY3RybF9hLCAwKTsKKwkJCQlPdXRSZWcoaHdjZmcuY3RybF9hLCBSOSwgRkhXUkVTKTsKKwkJCQl1ZGVsYXkoMTAwKTsKKwkJCQlPdXRSZWcoaHdjZmcuY3RybF9hLFIxMywweDU1KTsJCS8qIGlzIHRoaXMgY2hpcCByZWFsbHkgdGhlcmU/ICovCisJCQkJdWRlbGF5KDUpOworCisJCQkJaWYgKEluUmVnKGh3Y2ZnLmN0cmxfYSxSMTMpICE9IDB4NTUpCisJCQkJCWZvdW5kID0gMDsKKwkJCQllbmFibGVfaXJxKGh3Y2ZnLmlycSk7CisJCQkJcmVsZWFzZV9yZWdpb24oaHdjZmcuY3RybF9hLCAxKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlmb3VuZCA9IDA7CisjZW5kaWYKKworCQkJaWYgKGZvdW5kKQorCQkJeworCQkJCVNDQ19JbmZvWzIqTmNoaXBzICBdLmN0cmwgPSBod2NmZy5jdHJsX2E7CisJCQkJU0NDX0luZm9bMipOY2hpcHMgIF0uZGF0YSA9IGh3Y2ZnLmRhdGFfYTsKKwkJCQlTQ0NfSW5mb1syKk5jaGlwcyAgXS5pcnEgID0gaHdjZmcuaXJxOworCQkJCVNDQ19JbmZvWzIqTmNoaXBzKzFdLmN0cmwgPSBod2NmZy5jdHJsX2I7CisJCQkJU0NDX0luZm9bMipOY2hpcHMrMV0uZGF0YSA9IGh3Y2ZnLmRhdGFfYjsKKwkJCQlTQ0NfSW5mb1syKk5jaGlwcysxXS5pcnEgID0gaHdjZmcuaXJxOworCQkJCisJCQkJU0NDX2N0cmxbTmNoaXBzXS5jaGFuX0EgPSBod2NmZy5jdHJsX2E7CisJCQkJU0NDX2N0cmxbTmNoaXBzXS5jaGFuX0IgPSBod2NmZy5jdHJsX2I7CisJCQkJU0NDX2N0cmxbTmNoaXBzXS5pcnEgICAgPSBod2NmZy5pcnE7CisJCQl9CisKKworCQkJZm9yIChjaGFuID0gMDsgY2hhbiA8IDI7IGNoYW4rKykKKwkJCXsKKwkJCQlzcHJpbnRmKGRldmljZV9uYW1lLCAiJXMlaSIsIFNDQ19Ecml2ZXJOYW1lLCAyKk5jaGlwcytjaGFuKTsKKworCQkJCVNDQ19JbmZvWzIqTmNoaXBzK2NoYW5dLnNwZWNpYWwgPSBod2NmZy5zcGVjaWFsOworCQkJCVNDQ19JbmZvWzIqTmNoaXBzK2NoYW5dLmNsb2NrID0gaHdjZmcuY2xvY2s7CisJCQkJU0NDX0luZm9bMipOY2hpcHMrY2hhbl0uYnJhbmQgPSBod2NmZy5icmFuZDsKKwkJCQlTQ0NfSW5mb1syKk5jaGlwcytjaGFuXS5vcHRpb24gPSBod2NmZy5vcHRpb247CisJCQkJU0NDX0luZm9bMipOY2hpcHMrY2hhbl0uZW5oYW5jZWQgPSBod2NmZy5lc2NjOworCisjaWZkZWYgU0NDX0RPTlRfQ0hFQ0sKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogZGF0YSBwb3J0ID0gMHglMy4zeCAgY29udHJvbCBwb3J0ID0gMHglMy4zeFxuIiwKKwkJCQkJZGV2aWNlX25hbWUsIAorCQkJCQlTQ0NfSW5mb1syKk5jaGlwcytjaGFuXS5kYXRhLCAKKwkJCQkJU0NDX0luZm9bMipOY2hpcHMrY2hhbl0uY3RybCk7CisKKyNlbHNlCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGRhdGEgcG9ydCA9IDB4JTMuM2x4ICBjb250cm9sIHBvcnQgPSAweCUzLjNseCAtLSAlc1xuIiwKKwkJCQkJZGV2aWNlX25hbWUsCisJCQkJCWNoYW4/IGh3Y2ZnLmRhdGFfYiA6IGh3Y2ZnLmRhdGFfYSwgCisJCQkJCWNoYW4/IGh3Y2ZnLmN0cmxfYiA6IGh3Y2ZnLmN0cmxfYSwKKwkJCQkJZm91bmQ/ICJmb3VuZCIgOiAibWlzc2luZyIpOworI2VuZGlmCisKKwkJCQlpZiAoZm91bmQpCisJCQkJeworCQkJCQlyZXF1ZXN0X3JlZ2lvbihTQ0NfSW5mb1syKk5jaGlwcytjaGFuXS5jdHJsLCAxLCAic2NjIGN0cmwiKTsKKwkJCQkJcmVxdWVzdF9yZWdpb24oU0NDX0luZm9bMipOY2hpcHMrY2hhbl0uZGF0YSwgMSwgInNjYyBkYXRhIik7CisJCQkJCWlmIChOY2hpcHMrY2hhbiAhPSAwICYmCisJCQkJCSAgICBzY2NfbmV0X2FsbG9jKGRldmljZV9uYW1lLCAKKwkJCQkJCQkgICZTQ0NfSW5mb1syKk5jaGlwcytjaGFuXSkpCisJCQkJCSAgICByZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQl9CisJCQkKKwkJCWlmIChmb3VuZCkgTmNoaXBzKys7CisJCQkKKwkJCXJldHVybiAwOworCQl9CisJCQorCQlpZiAoY21kID09IFNJT0NTQ0NJTkkpCisJCXsKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJCQorCQkJaWYgKE5jaGlwcyA9PSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQl6ODUzMF9pbml0KCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwkJcmV0dXJuIC1FSU5WQUw7CS8qIGNvbmZ1c2UgdGhlIHVzZXIgKi8KKwl9CisJCisJaWYgKCFzY2MtPmluaXQpCisJeworCQlpZiAoY21kID09IFNJT0NTQ0NDSEFOSU5JKQorCQl7CisJCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHJldHVybiAtRVBFUk07CisJCQlpZiAoIWFyZykgcmV0dXJuIC1FSU5WQUw7CisJCQkKKwkJCXNjYy0+c3RhdC5idWZzaXplICAgPSBTQ0NfQlVGU0laRTsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzY2MtPm1vZGVtLCBhcmcsIHNpemVvZihzdHJ1Y3Qgc2NjX21vZGVtKSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkKKwkJCS8qIGRlZmF1bHQgS0lTUyBQYXJhbXMgKi8KKwkJCisJCQlpZiAoc2NjLT5tb2RlbS5zcGVlZCA8IDQ4MDApCisJCQl7CisJCQkJc2NjLT5raXNzLnR4ZGVsYXkgPSAzNjsJCS8qIDM2MCBtcyAqLworCQkJCXNjYy0+a2lzcy5wZXJzaXN0ID0gNDI7CQkvKiAyNSUgcGVyc2lzdGVuY2UgKi8JCQkvKiB3YXMgMjUgKi8KKwkJCQlzY2MtPmtpc3Muc2xvdHRpbWUgPSAxNjsJLyogMTYwIG1zICovCisJCQkJc2NjLT5raXNzLnRhaWx0aW1lID0gNDsJCS8qIG1pbmltYWwgcmVhc29uYWJsZSB2YWx1ZSAqLworCQkJCXNjYy0+a2lzcy5mdWxsZHVwID0gMDsJCS8qIENTTUEgKi8KKwkJCQlzY2MtPmtpc3Mud2FpdHRpbWUgPSA1MDsJLyogNTAwIG1zICovCisJCQkJc2NjLT5raXNzLm1heGtleXVwID0gMTA7CS8qIDEwIHMgKi8KKwkJCQlzY2MtPmtpc3MubWludGltZSA9IDM7CQkvKiAzIHMgKi8KKwkJCQlzY2MtPmtpc3MuaWRsZXRpbWUgPSAzMDsJLyogMzAgcyAqLworCQkJCXNjYy0+a2lzcy5tYXhkZWZlciA9IDEyMDsJLyogMiBtaW4gKi8KKwkJCQlzY2MtPmtpc3Muc29mdGRjZCA9IDA7CQkvKiBoYXJkd2FyZSBkY2QgKi8KKwkJCX0gZWxzZSB7CisJCQkJc2NjLT5raXNzLnR4ZGVsYXkgPSAxMDsJCS8qIDEwMCBtcyAqLworCQkJCXNjYy0+a2lzcy5wZXJzaXN0ID0gNjQ7CQkvKiAyNSUgcGVyc2lzdGVuY2UgKi8JCQkvKiB3YXMgMjUgKi8KKwkJCQlzY2MtPmtpc3Muc2xvdHRpbWUgPSA4OwkJLyogMTYwIG1zICovCisJCQkJc2NjLT5raXNzLnRhaWx0aW1lID0gMTsJCS8qIG1pbmltYWwgcmVhc29uYWJsZSB2YWx1ZSAqLworCQkJCXNjYy0+a2lzcy5mdWxsZHVwID0gMDsJCS8qIENTTUEgKi8KKwkJCQlzY2MtPmtpc3Mud2FpdHRpbWUgPSA1MDsJLyogNTAwIG1zICovCisJCQkJc2NjLT5raXNzLm1heGtleXVwID0gNzsJCS8qIDcgcyAqLworCQkJCXNjYy0+a2lzcy5taW50aW1lID0gMzsJCS8qIDMgcyAqLworCQkJCXNjYy0+a2lzcy5pZGxldGltZSA9IDMwOwkvKiAzMCBzICovCisJCQkJc2NjLT5raXNzLm1heGRlZmVyID0gMTIwOwkvKiAyIG1pbiAqLworCQkJCXNjYy0+a2lzcy5zb2Z0ZGNkID0gMDsJCS8qIGhhcmR3YXJlIGRjZCAqLworCQkJfQorCQkJCisJCQlzY2MtPnR4X2J1ZmYgPSBOVUxMOworCQkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2NjLT50eF9xdWV1ZSk7CisJCQlzY2MtPmluaXQgPSAxOworCQkJCisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQorCXN3aXRjaChjbWQpCisJeworCQljYXNlIFNJT0NTQ0NSRVNFUlZFRDoKKwkJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwkJY2FzZSBTSU9DU0NDU01FTToKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkgcmV0dXJuIC1FUEVSTTsKKwkJCWlmICghYXJnIHx8IGNvcHlfZnJvbV91c2VyKCZtZW1jZmcsIGFyZywgc2l6ZW9mKG1lbWNmZykpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJc2NjLT5zdGF0LmJ1ZnNpemUgICA9IG1lbWNmZy5idWZzaXplOworCQkJcmV0dXJuIDA7CisJCQorCQljYXNlIFNJT0NTQ0NHU1RBVDoKKwkJCWlmICghYXJnIHx8IGNvcHlfdG9fdXNlcihhcmcsICZzY2MtPnN0YXQsIHNpemVvZihzY2MtPnN0YXQpKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiAwOworCQkKKwkJY2FzZSBTSU9DU0NDR0tJU1M6CisJCQlpZiAoIWFyZyB8fCBjb3B5X2Zyb21fdXNlcigma2lzc19jbWQsIGFyZywgc2l6ZW9mKGtpc3NfY21kKSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlraXNzX2NtZC5wYXJhbSA9IHNjY19nZXRfcGFyYW0oc2NjLCBraXNzX2NtZC5jb21tYW5kKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAma2lzc19jbWQsIHNpemVvZihraXNzX2NtZCkpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIDA7CisJCQorCQljYXNlIFNJT0NTQ0NTS0lTUzoKKwkJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgcmV0dXJuIC1FUEVSTTsKKwkJCWlmICghYXJnIHx8IGNvcHlfZnJvbV91c2VyKCZraXNzX2NtZCwgYXJnLCBzaXplb2Yoa2lzc19jbWQpKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiBzY2Nfc2V0X3BhcmFtKHNjYywga2lzc19jbWQuY29tbWFuZCwga2lzc19jbWQucGFyYW0pOworCQkKKwkJY2FzZSBTSU9DU0NDQ0FMOgorCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKSByZXR1cm4gLUVQRVJNOworCQkJaWYgKCFhcmcgfHwgY29weV9mcm9tX3VzZXIoJmNhbCwgYXJnLCBzaXplb2YoY2FsKSkgfHwgY2FsLnRpbWUgPT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJc2NjX3N0YXJ0X2NhbGlicmF0ZShzY2MsIGNhbC50aW1lLCBjYWwucGF0dGVybik7CisJCQlyZXR1cm4gMDsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwkJCisJfQorCQorCXJldHVybiAtRUlOVkFMOworfQorCisvKiAtLS0tPiBzZXQgaW50ZXJmYWNlIGNhbGxzaWduIDwtLS0tICovCisKK3N0YXRpYyBpbnQgc2NjX25ldF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gKHN0cnVjdCBzb2NrYWRkciAqKSBhZGRyOworCW1lbWNweShkZXYtPmRldl9hZGRyLCBzYS0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0+IGdldCBzdGF0aXN0aWNzIDwtLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2NjX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYyA9IChzdHJ1Y3Qgc2NjX2NoYW5uZWwgKikgZGV2LT5wcml2OworCQorCXNjYy0+ZGV2X3N0YXQucnhfZXJyb3JzID0gc2NjLT5zdGF0LnJ4ZXJycyArIHNjYy0+c3RhdC5yeF9vdmVyOworCXNjYy0+ZGV2X3N0YXQudHhfZXJyb3JzID0gc2NjLT5zdGF0LnR4ZXJycyArIHNjYy0+c3RhdC50eF91bmRlcjsKKwlzY2MtPmRldl9zdGF0LnJ4X2ZpZm9fZXJyb3JzID0gc2NjLT5zdGF0LnJ4X292ZXI7CisJc2NjLT5kZXZfc3RhdC50eF9maWZvX2Vycm9ycyA9IHNjYy0+c3RhdC50eF91bmRlcjsKKworCXJldHVybiAmc2NjLT5kZXZfc3RhdDsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoJCWR1bXAgc3RhdGlzdGljcyB0byAvcHJvYy9uZXQvejg1MzBkcnYJCSAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjX25ldF9zZXFfaWR4KGxvZmZfdCBwb3MpCit7CisJaW50IGs7CisKKwlmb3IgKGsgPSAwOyBrIDwgTmNoaXBzKjI7ICsraykgeworCQlpZiAoIVNDQ19JbmZvW2tdLmluaXQpIAorCQkJY29udGludWU7CisJCWlmIChwb3MtLSA9PSAwKQorCQkJcmV0dXJuICZTQ0NfSW5mb1trXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICpzY2NfbmV0X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJcmV0dXJuICpwb3MgPyBzY2NfbmV0X3NlcV9pZHgoKnBvcyAtIDEpIDogU0VRX1NUQVJUX1RPS0VOOworCQorfQorCitzdGF0aWMgdm9pZCAqc2NjX25ldF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJdW5zaWduZWQgazsKKwlzdHJ1Y3Qgc2NjX2NoYW5uZWwgKnNjYyA9IHY7CisJKysqcG9zOworCQorCWZvciAoayA9ICh2ID09IFNFUV9TVEFSVF9UT0tFTikgPyAwIDogKHNjYyAtIFNDQ19JbmZvKSsxOworCSAgICAgayA8IE5jaGlwcyoyOyArK2spIHsKKwkJaWYgKFNDQ19JbmZvW2tdLmluaXQpIAorCQkJcmV0dXJuICZTQ0NfSW5mb1trXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNjY19uZXRfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7Cit9CisKK3N0YXRpYyBpbnQgc2NjX25ldF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJc2VxX3B1dHMoc2VxLCAiejg1MzBkcnYtIlZFUlNJT04iXG4iKTsKKwl9IGVsc2UgaWYgKCFEcml2ZXJfSW5pdGlhbGl6ZWQpIHsKKwkJc2VxX3B1dHMoc2VxLCAibm90IGluaXRpYWxpemVkXG4iKTsKKwl9IGVsc2UgaWYgKCFOY2hpcHMpIHsKKwkJc2VxX3B1dHMoc2VxLCAiY2hpcHMgbWlzc2luZ1xuIik7CisJfSBlbHNlIHsKKwkJY29uc3Qgc3RydWN0IHNjY19jaGFubmVsICpzY2MgPSB2OworCQljb25zdCBzdHJ1Y3Qgc2NjX3N0YXQgKnN0YXQgPSAmc2NjLT5zdGF0OworCQljb25zdCBzdHJ1Y3Qgc2NjX2tpc3MgKmtpc3MgPSAmc2NjLT5raXNzOworCisKKwkJLyogZGV2CWRhdGEgY3RybCBpcnEgY2xvY2sgYnJhbmQgZW5oIHZlY3RvciBzcGVjaWFsIG9wdGlvbiAKKwkJICoJYmF1ZCBucnogY2xvY2tzcmMgc29mdGRjZCBidWZzaXplCisJCSAqCXJ4aW50cyB0eGludHMgZXhpbnRzIHNwaW50cworCQkgKglyY3ZkIHJ4ZXJycyBvdmVyIC8geG1pdCB0eGVycnMgdW5kZXIgLyBub3NwYWNlIGJ1ZnNpemUKKwkJICoJdHhkIHBlcnMgc2xvdCB0YWlsIGZ1bCB3YWl0IG1pbiBtYXhrIGlkbCBkZWZyIHR4b2YgZ3JwCisJCSAqCVcgIyMgIyMgIyMgIyMgIyMgIyMgIyMgIyMgIyMgIyMgIyMgIyMgIyMgIyMgIyMgIyMKKwkJICoJUiAjIyAjIyBYWCAjIyAjIyAjIyAjIyAjIyBYWCAjIyAjIyAjIyAjIyAjIyAjIyAjIworCQkgKi8KKworCQlzZXFfcHJpbnRmKHNlcSwgIiVzXHQlMy4zbHggJTMuM2x4ICVkICVsdSAlMi4yeCAlZCAlMy4zbHggJTMuM2x4ICVkXG4iLAorCQkJCXNjYy0+ZGV2LT5uYW1lLAorCQkJCXNjYy0+ZGF0YSwgc2NjLT5jdHJsLCBzY2MtPmlycSwgc2NjLT5jbG9jaywgc2NjLT5icmFuZCwKKwkJCQlzY2MtPmVuaGFuY2VkLCBWZWN0b3JfTGF0Y2gsIHNjYy0+c3BlY2lhbCwKKwkJCQlzY2MtPm9wdGlvbik7CisJCXNlcV9wcmludGYoc2VxLCAiXHQlbHUgJWQgJWQgJWQgJWRcbiIsCisJCQkJc2NjLT5tb2RlbS5zcGVlZCwgc2NjLT5tb2RlbS5ucnosCisJCQkJc2NjLT5tb2RlbS5jbG9ja3NyYywga2lzcy0+c29mdGRjZCwKKwkJCQlzdGF0LT5idWZzaXplKTsKKwkJc2VxX3ByaW50ZihzZXEsICJcdCVsdSAlbHUgJWx1ICVsdVxuIiwKKwkJCQlzdGF0LT5yeGludHMsIHN0YXQtPnR4aW50cywgc3RhdC0+ZXhpbnRzLCBzdGF0LT5zcGludHMpOworCQlzZXFfcHJpbnRmKHNlcSwgIlx0JWx1ICVsdSAlZCAvICVsdSAlbHUgJWQgLyAlZCAlZFxuIiwKKwkJCQlzdGF0LT5yeGZyYW1lcywgc3RhdC0+cnhlcnJzLCBzdGF0LT5yeF9vdmVyLAorCQkJCXN0YXQtPnR4ZnJhbWVzLCBzdGF0LT50eGVycnMsIHN0YXQtPnR4X3VuZGVyLAorCQkJCXN0YXQtPm5vc3BhY2UsICBzdGF0LT50eF9zdGF0ZSk7CisKKyNkZWZpbmUgSyh4KSBraXNzLT54CisJCXNlcV9wcmludGYoc2VxLCAiXHQlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKKwkJCQlLKHR4ZGVsYXkpLCBLKHBlcnNpc3QpLCBLKHNsb3R0aW1lKSwgSyh0YWlsdGltZSksCisJCQkJSyhmdWxsZHVwKSwgSyh3YWl0dGltZSksIEsobWludGltZSksIEsobWF4a2V5dXApLAorCQkJCUsoaWRsZXRpbWUpLCBLKG1heGRlZmVyKSwgSyh0eF9pbmhpYml0KSwgSyhncm91cCkpOworI3VuZGVmIEsKKyNpZmRlZiBTQ0NfREVCVUcKKwkJeworCQkJaW50IHJlZzsKKworCQlzZXFfcHJpbnRmKHNlcSwgIlx0VyAiKTsKKwkJCWZvciAocmVnID0gMDsgcmVnIDwgMTY7IHJlZysrKQorCQkJCXNlcV9wcmludGYoc2VxLCAiJTIuMnggIiwgc2NjLT53cmVnW3JlZ10pOworCQkJc2VxX3ByaW50ZihzZXEsICJcbiIpOworCQkJCisJCXNlcV9wcmludGYoc2VxLCAiXHRSICUyLjJ4ICUyLjJ4IFhYICIsIEluUmVnKHNjYy0+Y3RybCxSMCksIEluUmVnKHNjYy0+Y3RybCxSMSkpOworCQkJZm9yIChyZWcgPSAzOyByZWcgPCA4OyByZWcrKykKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiUyLjJ4ICIsIEluUmVnKHNjYy0+Y3RybCwgcmVnKSk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIlhYICIpOworCQkJZm9yIChyZWcgPSA5OyByZWcgPCAxNjsgcmVnKyspCisJCQkJc2VxX3ByaW50ZihzZXEsICIlMi4yeCAiLCBJblJlZyhzY2MtPmN0cmwsIHJlZykpOworCQkJc2VxX3ByaW50ZihzZXEsICJcbiIpOworCQl9CisjZW5kaWYKKwkJc2VxX3B1dGMoc2VxLCAnXG4nKTsKKwl9CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgc2NjX25ldF9zZXFfb3BzID0geworCS5zdGFydCAgPSBzY2NfbmV0X3NlcV9zdGFydCwKKwkubmV4dCAgID0gc2NjX25ldF9zZXFfbmV4dCwKKwkuc3RvcCAgID0gc2NjX25ldF9zZXFfc3RvcCwKKwkuc2hvdyAgID0gc2NjX25ldF9zZXFfc2hvdywKK307CisKKworc3RhdGljIGludCBzY2NfbmV0X3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmc2NjX25ldF9zZXFfb3BzKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc2NjX25ldF9zZXFfZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm9wZW4JID0gc2NjX25ldF9zZXFfb3BlbiwKKwkucmVhZAkgPSBzZXFfcmVhZCwKKwkubGxzZWVrCSA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlX3ByaXZhdGUsCit9OworCisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworIAorLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICogCQkJSW5pdCBTQ0MgZHJpdmVyIAkJCSAgICAgICogKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyBpbnQgX19pbml0IHNjY19pbml0X2RyaXZlciAodm9pZCkKK3sKKwljaGFyIGRldm5hbWVbSUZOQU1TSVpdOworCQorCXByaW50ayhiYW5uZXIpOworCQorCXNwcmludGYoZGV2bmFtZSwiJXMwIiwgU0NDX0RyaXZlck5hbWUpOworCQorCXJ0bmxfbG9jaygpOworCWlmIChzY2NfbmV0X2FsbG9jKGRldm5hbWUsIFNDQ19JbmZvKSkgeworCQlydG5sX3VubG9jaygpOworCQlwcmludGsoS0VSTl9FUlIgIno4NTMwZHJ2OiBjYW5ub3QgaW5pdGlhbGl6ZSBtb2R1bGVcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcnRubF91bmxvY2soKTsKKworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJ6ODUzMGRydiIsIDAsICZzY2NfbmV0X3NlcV9mb3BzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2NjX2NsZWFudXBfZHJpdmVyKHZvaWQpCit7CisJaW9fcG9ydCBjdHJsOworCWludCBrOworCXN0cnVjdCBzY2NfY2hhbm5lbCAqc2NjOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCisJaWYgKE5jaGlwcyA9PSAwICYmIChkZXYgPSBTQ0NfSW5mb1swXS5kZXYpKSAKKwl7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJfQorCisJLyogR3VhcmQgYWdhaW5zdCBjaGlwIHByYXR0bGUgKi8KKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQorCWZvciAoayA9IDA7IGsgPCBOY2hpcHM7IGsrKykKKwkJaWYgKCAoY3RybCA9IFNDQ19jdHJsW2tdLmNoYW5fQSkgKQorCQl7CisJCQlPdXRiKGN0cmwsIDApOworCQkJT3V0UmVnKGN0cmwsUjksRkhXUkVTKTsJLyogZm9yY2UgaGFyZHdhcmUgcmVzZXQgKi8KKwkJCXVkZWxheSg1MCk7CisJCX0KKwkJCisJLyogVG8gdW5sb2FkIHRoZSBwb3J0IG11c3QgYmUgY2xvc2VkIHNvIG5vIHJlYWwgSVJRIHBlbmRpbmcgKi8KKwlmb3IgKGs9MDsgayA8IE5SX0lSUVMgOyBrKyspCisJCWlmIChJdmVjW2tdLnVzZWQpIGZyZWVfaXJxKGssIE5VTEwpOworCQkKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCQorCS8qIE5vdyBjbGVhbiB1cCAqLworCWZvciAoayA9IDA7IGsgPCBOY2hpcHMqMjsgaysrKQorCXsKKwkJc2NjID0gJlNDQ19JbmZvW2tdOworCQlpZiAoc2NjLT5jdHJsKQorCQl7CisJCQlyZWxlYXNlX3JlZ2lvbihzY2MtPmN0cmwsIDEpOworCQkJcmVsZWFzZV9yZWdpb24oc2NjLT5kYXRhLCAxKTsKKwkJfQorCQlpZiAoc2NjLT5kZXYpCisJCXsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KHNjYy0+ZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KHNjYy0+ZGV2KTsKKwkJfQorCX0KKwkKKwkJCisJaWYgKFZlY3Rvcl9MYXRjaCkKKwkJcmVsZWFzZV9yZWdpb24oVmVjdG9yX0xhdGNoLCAxKTsKKworCXByb2NfbmV0X3JlbW92ZSgiejg1MzBkcnYiKTsKK30KKworTU9EVUxFX0FVVEhPUigiSm9lcmcgUmV1dGVyIDxqcmV1dGVyQHlhaW5hLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBWC4yNSBEZXZpY2UgRHJpdmVyIGZvciBaODUzMCBiYXNlZCBIRExDIGNhcmRzIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiWjg1MzAgYmFzZWQgU0NDIGNhcmRzIGZvciBBbWF0ZXVyIFJhZGlvIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfaW5pdChzY2NfaW5pdF9kcml2ZXIpOworbW9kdWxlX2V4aXQoc2NjX2NsZWFudXBfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3lhbS5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8veWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3YjAwZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3lhbS5jCkBAIC0wLDAgKzEsMTIxOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogICAgeWFtLmMgIC0tIFlBTSByYWRpbyBtb2RlbSBkcml2ZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZGVyaWMgUmlibGUgRjFPQVQgKGZyaWJsZUB0ZWFzZXIuZnIpCisgKiAgICAgIEFkYXB0ZWQgZnJvbSBiYXljb20uYyBkcml2ZXIgd3JpdHRlbiBieSBUaG9tYXMgU2FpbGVyIChzYWlsZXJAaWZlLmVlLmV0aHouY2gpCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBHUEwgYWxsb3dzIHlvdSB0byB1c2UgdGhlIGRyaXZlciwgTk9UIHRoZSByYWRpby4KKyAqICBJbiBvcmRlciB0byB1c2UgdGhlIHJhZGlvLCB5b3UgbmVlZCBhIGxpY2Vuc2UgZnJvbSB0aGUgY29tbXVuaWNhdGlvbnMKKyAqICBhdXRob3JpdHkgb2YgeW91ciBjb3VudHJ5LgorICoKKyAqCisgKiAgSGlzdG9yeToKKyAqICAgMC4wIEYxT0FUIDA2LjA2Ljk4ICBCZWdpbiBvZiB3b3JrIHdpdGggYmF5Y29tLmMgc291cmNlIGNvZGUgViAwLjMKKyAqICAgMC4xIEYxT0FUIDA3LjA2Ljk4ICBBZGQgdGltZXIgcG9sbGluZyByb3V0aW5lIGZvciBjaGFubmVsIGFyYml0cmF0aW9uCisgKiAgIDAuMiBGNkZCQiAwOC4wNi45OCAgQWRkZWQgZGVsYXkgYWZ0ZXIgRlBHQSBwcm9ncmFtbWluZworICogICAwLjMgRjZGQkIgMjkuMDcuOTggIERlbGF5ZWQgUFRUIGltcGxlbWVudGF0aW9uIGZvciBkdXBtb2RlPTIKKyAqICAgMC40IEY2RkJCIDMwLjA3Ljk4ICBBZGRlZCBUeFRhaWwsIFNsb3R0aW1lIGFuZCBQZXJzaXN0YW5jZQorICogICAwLjUgRjZGQkIgMDEuMDguOTggIFNoYXJlZCBJUlFzLCAvcHJvYy9uZXQgYW5kIG5ldHdvcmsgc3RhdGlzdGljcworICogICAwLjYgRjZGQkIgMjUuMDguOTggIEFkZGVkIDEyMDBCZHMgZm9ybWF0CisgKiAgIDAuNyBGNkZCQiAxMi4wOS45OCAgQWRkZWQgdG8gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uCisgKiAgIDAuOCBGNkZCQiAxNC4xMC45OCAgRml4ZWQgc2xvdHRpbWUvcGVyc2lzdGVuY2UgdGltaW5nIGJ1ZworICogICAgICAgT0sxWklBIDIuMDkuMDEgIEZpeGVkICJrZnJlZV9za2Igb24gaGFyZCBJUlEiIAorICogICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIGRldl9rZnJlZV9za2JfYW55KCkuIChpbXBvcnRhbnQgaW4gMi40IGtlcm5lbCkKKyAqICAgCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpZiBkZWZpbmVkKENPTkZJR19BWDI1KSB8fCBkZWZpbmVkKENPTkZJR19BWDI1X01PRFVMRSkKKy8qIHByb3RvdHlwZXMgZm9yIGF4MjVfZW5jYXBzdWxhdGUgYW5kIGF4MjVfcmVidWlsZF9oZWFkZXIgKi8KKyNpbmNsdWRlIDxuZXQvYXgyNS5oPgorI2VuZGlmCS8qIENPTkZJR19BWDI1IHx8IENPTkZJR19BWDI1X01PRFVMRSAqLworCisvKiBtYWtlIGdlbmtzeW1zIGhhcHB5ICovCisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC95YW0uaD4KKyNpbmNsdWRlICJ5YW05NjAwLmgiCisjaW5jbHVkZSAieWFtMTIwMC5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgeWFtX2Rydm5hbWVbXSA9ICJ5YW0iOworc3RhdGljIGNoYXIgeWFtX2RydmluZm9bXSBfX2luaXRkYXRhID0gS0VSTl9JTkZPICJZQU0gZHJpdmVyIHZlcnNpb24gMC44IGJ5IEYxT0FUL0Y2RkJCXG4iOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBZQU1fOTYwMAkxCisjZGVmaW5lIFlBTV8xMjAwCTIKKworI2RlZmluZSBOUl9QT1JUUwk0CisjZGVmaW5lIFlBTV9NQUdJQwkweEYxMEE3NjU0CisKKy8qIFRyYW5zbWl0dGVyIHN0YXRlcyAqLworCisjZGVmaW5lIFRYX09GRgkJMAorI2RlZmluZSBUWF9IRUFECQkxCisjZGVmaW5lIFRYX0RBVEEJCTIKKyNkZWZpbmUgVFhfQ1JDMQkJMworI2RlZmluZSBUWF9DUkMyCQk0CisjZGVmaW5lIFRYX1RBSUwJCTUKKworI2RlZmluZSBZQU1fTUFYX0ZSQU1FCTEwMjQKKworI2RlZmluZSBERUZBVUxUX0JJVFJBVEUJOTYwMAkJCS8qIGJwcyAqLworI2RlZmluZSBERUZBVUxUX0hPTERECTEwCQkJLyogc2VjICovCisjZGVmaW5lIERFRkFVTFRfVFhECTMwMAkJCS8qIG1zICovCisjZGVmaW5lIERFRkFVTFRfVFhUQUlMCTEwCQkJLyogbXMgKi8KKyNkZWZpbmUgREVGQVVMVF9TTE9UCTEwMAkJCS8qIG1zICovCisjZGVmaW5lIERFRkFVTFRfUEVSUwk2NAkJCS8qIDAtPjI1NSAqLworCitzdHJ1Y3QgeWFtX3BvcnQgeworCWludCBtYWdpYzsKKwlpbnQgYml0cmF0ZTsKKwlpbnQgYmF1ZHJhdGU7CisJaW50IGlvYmFzZTsKKwlpbnQgaXJxOworCWludCBkdXBtb2RlOworCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCS8qIFN0YXRzIHNlY3Rpb24gKi8KKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCisJaW50IG5iX3J4aW50OworCWludCBuYl9tZGludDsKKworCS8qIFBhcmFtZXRlcnMgc2VjdGlvbiAqLworCisJaW50IHR4ZDsJCQkJLyogdHggZGVsYXkgKi8KKwlpbnQgaG9sZGQ7CQkJCS8qIGR1cGxleCBwdHQgZGVsYXkgKi8KKwlpbnQgdHh0YWlsOwkJCQkvKiB0eHRhaWwgZGVsYXkgKi8KKwlpbnQgc2xvdDsJCQkJLyogc2xvdHRpbWUgKi8KKwlpbnQgcGVyczsJCQkJLyogcGVyc2lzdGVuY2UgKi8KKworCS8qIFR4IHNlY3Rpb24gKi8KKworCWludCB0eF9zdGF0ZTsKKwlpbnQgdHhfY291bnQ7CisJaW50IHNsb3RjbnQ7CisJdW5zaWduZWQgY2hhciB0eF9idWZbWUFNX01BWF9GUkFNRV07CisJaW50IHR4X2xlbjsKKwlpbnQgdHhfY3JjbCwgdHhfY3JjaDsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHNlbmRfcXVldWU7CQkvKiBQYWNrZXRzIGF3YWl0aW5nIHRyYW5zbWlzc2lvbiAqLworCisJLyogUnggc2VjdGlvbiAqLworCisJaW50IGRjZDsKKwl1bnNpZ25lZCBjaGFyIHJ4X2J1ZltZQU1fTUFYX0ZSQU1FXTsKKwlpbnQgcnhfbGVuOworCWludCByeF9jcmNsLCByeF9jcmNoOworfTsKKworc3RydWN0IHlhbV9tY3MgeworCXVuc2lnbmVkIGNoYXIgYml0c1tZQU1fRlBHQV9TSVpFXTsKKwlpbnQgYml0cmF0ZTsKKwlzdHJ1Y3QgeWFtX21jcyAqbmV4dDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqeWFtX2RldnNbTlJfUE9SVFNdOworCitzdGF0aWMgc3RydWN0IHlhbV9tY3MgKnlhbV9kYXRhOworCitzdGF0aWMgY2hhciBheDI1X2JjYXN0WzddID0KK3snUScgPDwgMSwgJ1MnIDw8IDEsICdUJyA8PCAxLCAnICcgPDwgMSwgJyAnIDw8IDEsICcgJyA8PCAxLCAnMCcgPDwgMX07CitzdGF0aWMgY2hhciBheDI1X3Rlc3RbN10gPQoreydMJyA8PCAxLCAnSScgPDwgMSwgJ04nIDw8IDEsICdVJyA8PCAxLCAnWCcgPDwgMSwgJyAnIDw8IDEsICcxJyA8PCAxfTsKKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHlhbV90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKE5VTEwsIDAsIDApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBSQlIoaW9iYXNlKQkoaW9iYXNlKzApCisjZGVmaW5lIFRIUihpb2Jhc2UpCShpb2Jhc2UrMCkKKyNkZWZpbmUgSUVSKGlvYmFzZSkJKGlvYmFzZSsxKQorI2RlZmluZSBJSVIoaW9iYXNlKQkoaW9iYXNlKzIpCisjZGVmaW5lIEZDUihpb2Jhc2UpCShpb2Jhc2UrMikKKyNkZWZpbmUgTENSKGlvYmFzZSkJKGlvYmFzZSszKQorI2RlZmluZSBNQ1IoaW9iYXNlKQkoaW9iYXNlKzQpCisjZGVmaW5lIExTUihpb2Jhc2UpCShpb2Jhc2UrNSkKKyNkZWZpbmUgTVNSKGlvYmFzZSkJKGlvYmFzZSs2KQorI2RlZmluZSBTQ1IoaW9iYXNlKQkoaW9iYXNlKzcpCisjZGVmaW5lIERMTChpb2Jhc2UpCShpb2Jhc2UrMCkKKyNkZWZpbmUgRExNKGlvYmFzZSkJKGlvYmFzZSsxKQorCisjZGVmaW5lIFlBTV9FWFRFTlQJOAorCisvKiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgQml0IE1hc2tzICovCisjZGVmaW5lIElJUl9OT1BFTkQJMQorI2RlZmluZSBJSVJfTVNSCQkwCisjZGVmaW5lIElJUl9UWAkJMgorI2RlZmluZSBJSVJfUlgJCTQKKyNkZWZpbmUgSUlSX0xTUgkJNgorI2RlZmluZSBJSVJfVElNRU9VVAkxMgkJCS8qIEZpZm8gbW9kZSBvbmx5ICovCisKKyNkZWZpbmUgSUlSX01BU0sJMHgwRgorCisvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIEJpdCBNYXNrcyAqLworI2RlZmluZSBJRVJfUlgJCTEJCQkvKiBlbmFibGUgcnggaW50ZXJydXB0ICovCisjZGVmaW5lIElFUl9UWAkJMgkJCS8qIGVuYWJsZSB0eCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSUVSX0xTUgkJNAkJCS8qIGVuYWJsZSBsaW5lIHN0YXR1cyBpbnRlcnJ1cHRzICovCisjZGVmaW5lIElFUl9NU1IJCTgJCQkvKiBlbmFibGUgbW9kZW0gc3RhdHVzIGludGVycnVwdHMgKi8KKworLyogTW9kZW0gQ29udHJvbCBSZWdpc3RlciBCaXQgTWFza3MgKi8KKyNkZWZpbmUgTUNSX0RUUgkJMHgwMQkJCS8qIERUUiBvdXRwdXQgKi8KKyNkZWZpbmUgTUNSX1JUUwkJMHgwMgkJCS8qIFJUUyBvdXRwdXQgKi8KKyNkZWZpbmUgTUNSX09VVDEJMHgwNAkJCS8qIE9VVDEgb3V0cHV0IChub3QgYWNjZXNzaWJsZSBpbiBSUzIzMikgKi8KKyNkZWZpbmUgTUNSX09VVDIJMHgwOAkJCS8qIE1hc3RlciBJbnRlcnJ1cHQgZW5hYmxlIChtdXN0IGJlIHNldCBvbiBQQ3MpICovCisjZGVmaW5lIE1DUl9MT09QCTB4MTAJCQkvKiBMb29wYmFjayBlbmFibGUgKi8KKworLyogTW9kZW0gU3RhdHVzIFJlZ2lzdGVyIEJpdCBNYXNrcyAqLworI2RlZmluZSBNU1JfRENUUwkweDAxCQkJLyogRGVsdGEgQ1RTIGlucHV0ICovCisjZGVmaW5lIE1TUl9ERFNSCTB4MDIJCQkvKiBEZWx0YSBEU1IgKi8KKyNkZWZpbmUgTVNSX0RSSU4JMHgwNAkJCS8qIERlbHRhIFJJICovCisjZGVmaW5lIE1TUl9ERENECTB4MDgJCQkvKiBEZWx0YSBEQ0QgKi8KKyNkZWZpbmUgTVNSX0NUUwkJMHgxMAkJCS8qIENUUyBpbnB1dCAqLworI2RlZmluZSBNU1JfRFNSCQkweDIwCQkJLyogRFNSIGlucHV0ICovCisjZGVmaW5lIE1TUl9SSU5HCTB4NDAJCQkvKiBSSSAgaW5wdXQgKi8KKyNkZWZpbmUgTVNSX0RDRAkJMHg4MAkJCS8qIERDRCBpbnB1dCAqLworCisvKiBsaW5lIHN0YXR1cyByZWdpc3RlciBiaXQgbWFzayAqLworI2RlZmluZSBMU1JfUlhDCQkweDAxCisjZGVmaW5lIExTUl9PRQkJMHgwMgorI2RlZmluZSBMU1JfUEUJCTB4MDQKKyNkZWZpbmUgTFNSX0ZFCQkweDA4CisjZGVmaW5lIExTUl9CUkVBSwkweDEwCisjZGVmaW5lIExTUl9USFJFCTB4MjAKKyNkZWZpbmUgTFNSX1RTUkUJMHg0MAorCisvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgQml0IE1hc2tzICovCisjZGVmaW5lIExDUl9ETEFCCTB4ODAKKyNkZWZpbmUgTENSX0JSRUFLCTB4NDAKKyNkZWZpbmUgTENSX1BaRVJPCTB4MjgKKyNkZWZpbmUgTENSX1BFVkVOCTB4MTgKKyNkZWZpbmUgTENSX1BPREQJMHgwOAorI2RlZmluZSBMQ1JfU1RPUDEJMHgwMAorI2RlZmluZSBMQ1JfU1RPUDIJMHgwNAorI2RlZmluZSBMQ1JfQklUNQkweDAwCisjZGVmaW5lIExDUl9CSVQ2CTB4MDIKKyNkZWZpbmUgTENSX0JJVDcJMHgwMQorI2RlZmluZSBMQ1JfQklUOAkweDAzCisKKy8qIFlBTSBNb2RlbSA8LT4gVUFSVCBQb3J0IG1hcHBpbmcgKi8KKworI2RlZmluZSBUWF9SRFkJCU1TUl9EQ1RTCQkvKiB0cmFuc21pdHRlciByZWFkeSB0byBzZW5kICovCisjZGVmaW5lIFJYX0RDRAkJTVNSX0RDRAkJCS8qIGNhcnJpZXIgZGV0ZWN0ICovCisjZGVmaW5lIFJYX0ZMQUcJCU1TUl9SSU5HCQkvKiBoZGxjIGZsYWcgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgRlBHQV9ET05FCU1TUl9EU1IJCQkvKiBGUEdBIGlzIGNvbmZpZ3VyZWQgKi8KKyNkZWZpbmUgUFRUX09OCQkoTUNSX1JUU3xNQ1JfT1VUMikJLyogYWN0aXZhdGUgUFRUICovCisjZGVmaW5lIFBUVF9PRkYJCShNQ1JfRFRSfE1DUl9PVVQyKQkvKiByZWxlYXNlIFBUVCAqLworCisjZGVmaW5lIEVOQUJMRV9SWElOVAlJRVJfUlgJCQkvKiBlbmFibGUgdWFydCByeCBpbnRlcnJ1cHQgZHVyaW5nIHJ4ICovCisjZGVmaW5lIEVOQUJMRV9UWElOVAlJRVJfTVNSCQkJLyogZW5hYmxlIHVhcnQgbXMgaW50ZXJydXB0IGR1cmluZyB0eCAqLworI2RlZmluZSBFTkFCTEVfUlRYSU5UCShJRVJfUlh8SUVSX01TUikJLyogZnVsbCBkdXBsZXggb3BlcmF0aW9ucyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENSQyBUYWJsZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgY2hrdGFibFsyNTZdID0KK3sweDAwLCAweDg5LCAweDEyLCAweDliLCAweDI0LCAweGFkLCAweDM2LCAweGJmLCAweDQ4LCAweGMxLCAweDVhLCAweGQzLCAweDZjLCAweGU1LCAweDdlLAorIDB4ZjcsIDB4ODEsIDB4MDgsIDB4OTMsIDB4MWEsIDB4YTUsIDB4MmMsIDB4YjcsIDB4M2UsIDB4YzksIDB4NDAsIDB4ZGIsIDB4NTIsIDB4ZWQsIDB4NjQsCisgMHhmZiwgMHg3NiwgMHgwMiwgMHg4YiwgMHgxMCwgMHg5OSwgMHgyNiwgMHhhZiwgMHgzNCwgMHhiZCwgMHg0YSwgMHhjMywgMHg1OCwgMHhkMSwgMHg2ZSwKKyAweGU3LCAweDdjLCAweGY1LCAweDgzLCAweDBhLCAweDkxLCAweDE4LCAweGE3LCAweDJlLCAweGI1LCAweDNjLCAweGNiLCAweDQyLCAweGQ5LCAweDUwLAorIDB4ZWYsIDB4NjYsIDB4ZmQsIDB4NzQsIDB4MDQsIDB4OGQsIDB4MTYsIDB4OWYsIDB4MjAsIDB4YTksIDB4MzIsIDB4YmIsIDB4NGMsIDB4YzUsIDB4NWUsCisgMHhkNywgMHg2OCwgMHhlMSwgMHg3YSwgMHhmMywgMHg4NSwgMHgwYywgMHg5NywgMHgxZSwgMHhhMSwgMHgyOCwgMHhiMywgMHgzYSwgMHhjZCwgMHg0NCwKKyAweGRmLCAweDU2LCAweGU5LCAweDYwLCAweGZiLCAweDcyLCAweDA2LCAweDhmLCAweDE0LCAweDlkLCAweDIyLCAweGFiLCAweDMwLCAweGI5LCAweDRlLAorIDB4YzcsIDB4NWMsIDB4ZDUsIDB4NmEsIDB4ZTMsIDB4NzgsIDB4ZjEsIDB4ODcsIDB4MGUsIDB4OTUsIDB4MWMsIDB4YTMsIDB4MmEsIDB4YjEsIDB4MzgsCisgMHhjZiwgMHg0NiwgMHhkZCwgMHg1NCwgMHhlYiwgMHg2MiwgMHhmOSwgMHg3MCwgMHgwOCwgMHg4MSwgMHgxYSwgMHg5MywgMHgyYywgMHhhNSwgMHgzZSwKKyAweGI3LCAweDQwLCAweGM5LCAweDUyLCAweGRiLCAweDY0LCAweGVkLCAweDc2LCAweGZmLCAweDg5LCAweDAwLCAweDliLCAweDEyLCAweGFkLCAweDI0LAorIDB4YmYsIDB4MzYsIDB4YzEsIDB4NDgsIDB4ZDMsIDB4NWEsIDB4ZTUsIDB4NmMsIDB4ZjcsIDB4N2UsIDB4MGEsIDB4ODMsIDB4MTgsIDB4OTEsIDB4MmUsCisgMHhhNywgMHgzYywgMHhiNSwgMHg0MiwgMHhjYiwgMHg1MCwgMHhkOSwgMHg2NiwgMHhlZiwgMHg3NCwgMHhmZCwgMHg4YiwgMHgwMiwgMHg5OSwgMHgxMCwKKyAweGFmLCAweDI2LCAweGJkLCAweDM0LCAweGMzLCAweDRhLCAweGQxLCAweDU4LCAweGU3LCAweDZlLCAweGY1LCAweDdjLCAweDBjLCAweDg1LCAweDFlLAorIDB4OTcsIDB4MjgsIDB4YTEsIDB4M2EsIDB4YjMsIDB4NDQsIDB4Y2QsIDB4NTYsIDB4ZGYsIDB4NjAsIDB4ZTksIDB4NzIsIDB4ZmIsIDB4OGQsIDB4MDQsCisgMHg5ZiwgMHgxNiwgMHhhOSwgMHgyMCwgMHhiYiwgMHgzMiwgMHhjNSwgMHg0YywgMHhkNywgMHg1ZSwgMHhlMSwgMHg2OCwgMHhmMywgMHg3YSwgMHgwZSwKKyAweDg3LCAweDFjLCAweDk1LCAweDJhLCAweGEzLCAweDM4LCAweGIxLCAweDQ2LCAweGNmLCAweDU0LCAweGRkLCAweDYyLCAweGViLCAweDcwLCAweGY5LAorIDB4OGYsIDB4MDYsIDB4OWQsIDB4MTQsIDB4YWIsIDB4MjIsIDB4YjksIDB4MzAsIDB4YzcsIDB4NGUsIDB4ZDUsIDB4NWMsIDB4ZTMsIDB4NmEsIDB4ZjEsCisgMHg3OH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBjaGt0YWJoWzI1Nl0gPQorezB4MDAsIDB4MTEsIDB4MjMsIDB4MzIsIDB4NDYsIDB4NTcsIDB4NjUsIDB4NzQsIDB4OGMsIDB4OWQsIDB4YWYsIDB4YmUsIDB4Y2EsIDB4ZGIsIDB4ZTksCisgMHhmOCwgMHgxMCwgMHgwMSwgMHgzMywgMHgyMiwgMHg1NiwgMHg0NywgMHg3NSwgMHg2NCwgMHg5YywgMHg4ZCwgMHhiZiwgMHhhZSwgMHhkYSwgMHhjYiwKKyAweGY5LCAweGU4LCAweDIxLCAweDMwLCAweDAyLCAweDEzLCAweDY3LCAweDc2LCAweDQ0LCAweDU1LCAweGFkLCAweGJjLCAweDhlLCAweDlmLCAweGViLAorIDB4ZmEsIDB4YzgsIDB4ZDksIDB4MzEsIDB4MjAsIDB4MTIsIDB4MDMsIDB4NzcsIDB4NjYsIDB4NTQsIDB4NDUsIDB4YmQsIDB4YWMsIDB4OWUsIDB4OGYsCisgMHhmYiwgMHhlYSwgMHhkOCwgMHhjOSwgMHg0MiwgMHg1MywgMHg2MSwgMHg3MCwgMHgwNCwgMHgxNSwgMHgyNywgMHgzNiwgMHhjZSwgMHhkZiwgMHhlZCwKKyAweGZjLCAweDg4LCAweDk5LCAweGFiLCAweGJhLCAweDUyLCAweDQzLCAweDcxLCAweDYwLCAweDE0LCAweDA1LCAweDM3LCAweDI2LCAweGRlLCAweGNmLAorIDB4ZmQsIDB4ZWMsIDB4OTgsIDB4ODksIDB4YmIsIDB4YWEsIDB4NjMsIDB4NzIsIDB4NDAsIDB4NTEsIDB4MjUsIDB4MzQsIDB4MDYsIDB4MTcsIDB4ZWYsCisgMHhmZSwgMHhjYywgMHhkZCwgMHhhOSwgMHhiOCwgMHg4YSwgMHg5YiwgMHg3MywgMHg2MiwgMHg1MCwgMHg0MSwgMHgzNSwgMHgyNCwgMHgxNiwgMHgwNywKKyAweGZmLCAweGVlLCAweGRjLCAweGNkLCAweGI5LCAweGE4LCAweDlhLCAweDhiLCAweDg0LCAweDk1LCAweGE3LCAweGI2LCAweGMyLCAweGQzLCAweGUxLAorIDB4ZjAsIDB4MDgsIDB4MTksIDB4MmIsIDB4M2EsIDB4NGUsIDB4NWYsIDB4NmQsIDB4N2MsIDB4OTQsIDB4ODUsIDB4YjcsIDB4YTYsIDB4ZDIsIDB4YzMsCisgMHhmMSwgMHhlMCwgMHgxOCwgMHgwOSwgMHgzYiwgMHgyYSwgMHg1ZSwgMHg0ZiwgMHg3ZCwgMHg2YywgMHhhNSwgMHhiNCwgMHg4NiwgMHg5NywgMHhlMywKKyAweGYyLCAweGMwLCAweGQxLCAweDI5LCAweDM4LCAweDBhLCAweDFiLCAweDZmLCAweDdlLCAweDRjLCAweDVkLCAweGI1LCAweGE0LCAweDk2LCAweDg3LAorIDB4ZjMsIDB4ZTIsIDB4ZDAsIDB4YzEsIDB4MzksIDB4MjgsIDB4MWEsIDB4MGIsIDB4N2YsIDB4NmUsIDB4NWMsIDB4NGQsIDB4YzYsIDB4ZDcsIDB4ZTUsCisgMHhmNCwgMHg4MCwgMHg5MSwgMHhhMywgMHhiMiwgMHg0YSwgMHg1YiwgMHg2OSwgMHg3OCwgMHgwYywgMHgxZCwgMHgyZiwgMHgzZSwgMHhkNiwgMHhjNywKKyAweGY1LCAweGU0LCAweDkwLCAweDgxLCAweGIzLCAweGEyLCAweDVhLCAweDRiLCAweDc5LCAweDY4LCAweDFjLCAweDBkLCAweDNmLCAweDJlLCAweGU3LAorIDB4ZjYsIDB4YzQsIDB4ZDUsIDB4YTEsIDB4YjAsIDB4ODIsIDB4OTMsIDB4NmIsIDB4N2EsIDB4NDgsIDB4NTksIDB4MmQsIDB4M2MsIDB4MGUsIDB4MWYsCisgMHhmNywgMHhlNiwgMHhkNCwgMHhjNSwgMHhiMSwgMHhhMCwgMHg5MiwgMHg4MywgMHg3YiwgMHg2YSwgMHg1OCwgMHg0OSwgMHgzZCwgMHgyYywgMHgxZSwKKyAweDBmfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRlBHQSBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgZGVsYXkoaW50IG1zKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyAoKG1zICogSFopIC8gMTAwMCk7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQorCQljcHVfcmVsYXgoKTsKK30KKworLyoKKyAqIHJlc2V0IEZQR0EKKyAqLworCitzdGF0aWMgdm9pZCBmcGdhX3Jlc2V0KGludCBpb2Jhc2UpCit7CisJb3V0YigwLCBJRVIoaW9iYXNlKSk7CisJb3V0YihMQ1JfRExBQiB8IExDUl9CSVQ1LCBMQ1IoaW9iYXNlKSk7CisJb3V0YigxLCBETEwoaW9iYXNlKSk7CisJb3V0YigwLCBETE0oaW9iYXNlKSk7CisKKwlvdXRiKExDUl9CSVQ1LCBMQ1IoaW9iYXNlKSk7CisJaW5iKExTUihpb2Jhc2UpKTsKKwlpbmIoTVNSKGlvYmFzZSkpOworCS8qIHR1cm4gb2ZmIEZQR0Egc3VwcGx5IHZvbHRhZ2UgKi8KKwlvdXRiKE1DUl9PVVQxIHwgTUNSX09VVDIsIE1DUihpb2Jhc2UpKTsKKwlkZWxheSgxMDApOworCS8qIHR1cm4gb24gRlBHQSBzdXBwbHkgdm9sdGFnZSBhZ2FpbiAqLworCW91dGIoTUNSX0RUUiB8IE1DUl9SVFMgfCBNQ1JfT1VUMSB8IE1DUl9PVVQyLCBNQ1IoaW9iYXNlKSk7CisJZGVsYXkoMTAwKTsKK30KKworLyoKKyAqIHNlbmQgb25lIGJ5dGUgdG8gRlBHQQorICovCisKK3N0YXRpYyBpbnQgZnBnYV93cml0ZShpbnQgaW9iYXNlLCB1bnNpZ25lZCBjaGFyIHdyZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJpdDsKKwlpbnQgazsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgSFogLyAxMDsKKworCWZvciAoayA9IDA7IGsgPCA4OyBrKyspIHsKKwkJYml0ID0gKHdyZCAmIDB4ODApID8gKE1DUl9SVFMgfCBNQ1JfRFRSKSA6IE1DUl9EVFI7CisJCW91dGIoYml0IHwgTUNSX09VVDEgfCBNQ1JfT1VUMiwgTUNSKGlvYmFzZSkpOworCQl3cmQgPDw9IDE7CisJCW91dGIoMHhmYywgVEhSKGlvYmFzZSkpOworCQl3aGlsZSAoKGluYihMU1IoaW9iYXNlKSkgJiBMU1JfVFNSRSkgPT0gMCkKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmFkZF9tY3ModW5zaWduZWQgY2hhciAqYml0cywgaW50IGJpdHJhdGUpCit7CisJc3RydWN0IHlhbV9tY3MgKnA7CisKKwkvKiBJZiBpdCBhbHJlYWR5IGV4aXN0cywgcmVwbGFjZSB0aGUgYml0IGRhdGEgKi8KKwlwID0geWFtX2RhdGE7CisJd2hpbGUgKHApIHsKKwkJaWYgKHAtPmJpdHJhdGUgPT0gYml0cmF0ZSkgeworCQkJbWVtY3B5KHAtPmJpdHMsIGJpdHMsIFlBTV9GUEdBX1NJWkUpOworCQkJcmV0dXJuIHAtPmJpdHM7CisJCX0KKwkJcCA9IHAtPm5leHQ7CisJfQorCisJLyogQWxsb2NhdGUgYSBuZXcgbWNzICovCisJaWYgKChwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHlhbV9tY3MpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJZQU06IG5vIG1lbW9yeSB0byBhbGxvY2F0ZSBtY3NcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtY3B5KHAtPmJpdHMsIGJpdHMsIFlBTV9GUEdBX1NJWkUpOworCXAtPmJpdHJhdGUgPSBiaXRyYXRlOworCXAtPm5leHQgPSB5YW1fZGF0YTsKKwl5YW1fZGF0YSA9IHA7CisKKwlyZXR1cm4gcC0+Yml0czsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmdldF9tY3MoaW50IGJpdHJhdGUpCit7CisJc3RydWN0IHlhbV9tY3MgKnA7CisKKwlwID0geWFtX2RhdGE7CisJd2hpbGUgKHApIHsKKwkJaWYgKHAtPmJpdHJhdGUgPT0gYml0cmF0ZSkKKwkJCXJldHVybiBwLT5iaXRzOworCQlwID0gcC0+bmV4dDsKKwl9CisKKwkvKiBMb2FkIHByZWRlZmluZWQgbWNzIGRhdGEgKi8KKwlzd2l0Y2ggKGJpdHJhdGUpIHsKKwljYXNlIDEyMDA6CisJCXJldHVybiBhZGRfbWNzKGJpdHNfMTIwMCwgYml0cmF0ZSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGFkZF9tY3MoYml0c185NjAwLCBiaXRyYXRlKTsKKwl9Cit9CisKKy8qCisgKiBkb3dubG9hZCBiaXRzdHJlYW0gdG8gRlBHQQorICogZGF0YSBpcyBjb250YWluZWQgaW4gYml0c1tdIGFycmF5IGluIHlhbTEyMDAuaCByZXNwLiB5YW05NjAwLmgKKyAqLworCitzdGF0aWMgaW50IGZwZ2FfZG93bmxvYWQoaW50IGlvYmFzZSwgaW50IGJpdHJhdGUpCit7CisJaW50IGksIHJjOworCXVuc2lnbmVkIGNoYXIgKnBiaXRzOworCisJcGJpdHMgPSBnZXRfbWNzKGJpdHJhdGUpOworCWlmIChwYml0cyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlmcGdhX3Jlc2V0KGlvYmFzZSk7CisJZm9yIChpID0gMDsgaSA8IFlBTV9GUEdBX1NJWkU7IGkrKykgeworCQlpZiAoZnBnYV93cml0ZShpb2Jhc2UsIHBiaXRzW2ldKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ5YW06IGVycm9yIGluIHdyaXRlIGN5Y2xlXG4iKTsKKwkJCXJldHVybiAtMTsJCQkvKiB3cml0ZS4uLiAqLworCQl9CisJfQorCisJZnBnYV93cml0ZShpb2Jhc2UsIDB4RkYpOworCXJjID0gaW5iKE1TUihpb2Jhc2UpKTsJCS8qIGNoZWNrIERPTkUgc2lnbmFsICovCisKKwkvKiBOZWVkZWQgZm9yIHNvbWUgaGFyZHdhcmVzICovCisJZGVsYXkoNTApOworCisJcmV0dXJuIChyYyAmIE1TUl9EU1IpID8gMCA6IC0xOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU2VyaWFsIHBvcnQgaW5pdCAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgeWFtX3NldF91YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHlhbV9wb3J0ICp5cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGRpdmlzb3IgPSAxMTUyMDAgLyB5cC0+YmF1ZHJhdGU7CisKKwlvdXRiKDAsIElFUihkZXYtPmJhc2VfYWRkcikpOworCW91dGIoTENSX0RMQUIgfCBMQ1JfQklUOCwgTENSKGRldi0+YmFzZV9hZGRyKSk7CisJb3V0YihkaXZpc29yLCBETEwoZGV2LT5iYXNlX2FkZHIpKTsKKwlvdXRiKDAsIERMTShkZXYtPmJhc2VfYWRkcikpOworCW91dGIoTENSX0JJVDgsIExDUihkZXYtPmJhc2VfYWRkcikpOworCW91dGIoUFRUX09GRiwgTUNSKGRldi0+YmFzZV9hZGRyKSk7CisJb3V0YigweDAwLCBGQ1IoZGV2LT5iYXNlX2FkZHIpKTsKKworCS8qIEZsdXNoIHBlbmRpbmcgaXJxICovCisKKwlpbmIoUkJSKGRldi0+YmFzZV9hZGRyKSk7CisJaW5iKE1TUihkZXYtPmJhc2VfYWRkcikpOworCisJLyogRW5hYmxlIHJ4IGlycSAqLworCisJb3V0YihFTkFCTEVfUlRYSU5ULCBJRVIoZGV2LT5iYXNlX2FkZHIpKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZW51bSB1YXJ0IHsKKwljX3VhcnRfdW5rbm93biwgY191YXJ0XzgyNTAsCisJY191YXJ0XzE2NDUwLCBjX3VhcnRfMTY1NTAsIGNfdWFydF8xNjU1MEEKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICp1YXJ0X3N0cltdID0KK3sidW5rbm93biIsICI4MjUwIiwgIjE2NDUwIiwgIjE2NTUwIiwgIjE2NTUwQSJ9OworCitzdGF0aWMgZW51bSB1YXJ0IHlhbV9jaGVja191YXJ0KHVuc2lnbmVkIGludCBpb2Jhc2UpCit7CisJdW5zaWduZWQgY2hhciBiMSwgYjIsIGIzOworCWVudW0gdWFydCB1OworCWVudW0gdWFydCB1YXJ0X3RhYltdID0KKwl7Y191YXJ0XzE2NDUwLCBjX3VhcnRfdW5rbm93biwgY191YXJ0XzE2NTUwLCBjX3VhcnRfMTY1NTBBfTsKKworCWIxID0gaW5iKE1DUihpb2Jhc2UpKTsKKwlvdXRiKGIxIHwgMHgxMCwgTUNSKGlvYmFzZSkpOwkvKiBsb29wYmFjayBtb2RlICovCisJYjIgPSBpbmIoTVNSKGlvYmFzZSkpOworCW91dGIoMHgxYSwgTUNSKGlvYmFzZSkpOworCWIzID0gaW5iKE1TUihpb2Jhc2UpKSAmIDB4ZjA7CisJb3V0YihiMSwgTUNSKGlvYmFzZSkpOwkJLyogcmVzdG9yZSBvbGQgdmFsdWVzICovCisJb3V0YihiMiwgTVNSKGlvYmFzZSkpOworCWlmIChiMyAhPSAweDkwKQorCQlyZXR1cm4gY191YXJ0X3Vua25vd247CisJaW5iKFJCUihpb2Jhc2UpKTsKKwlpbmIoUkJSKGlvYmFzZSkpOworCW91dGIoMHgwMSwgRkNSKGlvYmFzZSkpOwkvKiBlbmFibGUgRklGT3MgKi8KKwl1ID0gdWFydF90YWJbKGluYihJSVIoaW9iYXNlKSkgPj4gNikgJiAzXTsKKwlpZiAodSA9PSBjX3VhcnRfMTY0NTApIHsKKwkJb3V0YigweDVhLCBTQ1IoaW9iYXNlKSk7CisJCWIxID0gaW5iKFNDUihpb2Jhc2UpKTsKKwkJb3V0YigweGE1LCBTQ1IoaW9iYXNlKSk7CisJCWIyID0gaW5iKFNDUihpb2Jhc2UpKTsKKwkJaWYgKChiMSAhPSAweDVhKSB8fCAoYjIgIT0gMHhhNSkpCisJCQl1ID0gY191YXJ0XzgyNTA7CisJfQorCXJldHVybiB1OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFJ4IFNlY3Rpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB5YW1fcnhfZmxhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgeWFtX3BvcnQgKnlwKQoreworCWlmICh5cC0+ZGNkICYmIHlwLT5yeF9sZW4gPj0gMyAmJiB5cC0+cnhfbGVuIDwgWUFNX01BWF9GUkFNRSkgeworCQlpbnQgcGt0X2xlbiA9IHlwLT5yeF9sZW4gLSAyICsgMTsJLyogLUNSQyArIGtpc3MgKi8KKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlpZiAoKHlwLT5yeF9jcmNoICYgeXAtPnJ4X2NyY2wpICE9IDB4RkYpIHsKKwkJCS8qIEJhZCBjcmMgKi8KKwkJfSBlbHNlIHsKKwkJCWlmICghKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbikpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXRcbiIsIGRldi0+bmFtZSk7CisJCQkJKyt5cC0+c3RhdHMucnhfZHJvcHBlZDsKKwkJCX0gZWxzZSB7CisJCQkJdW5zaWduZWQgY2hhciAqY3A7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJY3AgPSBza2JfcHV0KHNrYiwgcGt0X2xlbik7CisJCQkJKmNwKysgPSAwOwkJLyogS0lTUyBrbHVkZ2UgKi8KKwkJCQltZW1jcHkoY3AsIHlwLT5yeF9idWYsIHBrdF9sZW4gLSAxKTsKKwkJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQVgyNSk7CisJCQkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQkrK3lwLT5zdGF0cy5yeF9wYWNrZXRzOworCQkJfQorCQl9CisJfQorCXlwLT5yeF9sZW4gPSAwOworCXlwLT5yeF9jcmNsID0gMHgyMTsKKwl5cC0+cnhfY3JjaCA9IDB4ZjM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB5YW1fcnhfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgeWFtX3BvcnQgKnlwLCB1bnNpZ25lZCBjaGFyIHJ4YikKK3sKKwlpZiAoeXAtPnJ4X2xlbiA8IFlBTV9NQVhfRlJBTUUpIHsKKwkJdW5zaWduZWQgY2hhciBjID0geXAtPnJ4X2NyY2w7CisJCXlwLT5yeF9jcmNsID0gKGNoa3RhYmxbY10gXiB5cC0+cnhfY3JjaCk7CisJCXlwLT5yeF9jcmNoID0gKGNoa3RhYmhbY10gXiByeGIpOworCQl5cC0+cnhfYnVmW3lwLT5yeF9sZW4rK10gPSByeGI7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogVFggU2VjdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHB0dF9vbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW91dGIoUFRUX09OLCBNQ1IoZGV2LT5iYXNlX2FkZHIpKTsKK30KKworc3RhdGljIHZvaWQgcHR0X29mZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW91dGIoUFRUX09GRiwgTUNSKGRldi0+YmFzZV9hZGRyKSk7Cit9CisKK3N0YXRpYyBpbnQgeWFtX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHlhbV9wb3J0ICp5cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlza2JfcXVldWVfdGFpbCgmeXAtPnNlbmRfcXVldWUsIHNrYik7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHlhbV9zdGFydF90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgeWFtX3BvcnQgKnlwKQoreworCWlmICgoeXAtPnR4X3N0YXRlID09IFRYX1RBSUwpIHx8ICh5cC0+dHhkID09IDApKQorCQl5cC0+dHhfY291bnQgPSAxOworCWVsc2UKKwkJeXAtPnR4X2NvdW50ID0gKHlwLT5iaXRyYXRlICogeXAtPnR4ZCkgLyA4MDAwOworCXlwLT50eF9zdGF0ZSA9IFRYX0hFQUQ7CisJcHR0X29uKGRldik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCByYW5kb21fc2VlZDsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCByYW5kb21fbnVtKHZvaWQpCit7CisJcmFuZG9tX3NlZWQgPSAyODYyOSAqIHJhbmRvbV9zZWVkICsgMTU3OworCXJldHVybiByYW5kb21fc2VlZDsKK30KKworc3RhdGljIHZvaWQgeWFtX2FyYml0cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB5YW1fcG9ydCAqeXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKHlwLT5tYWdpYyAhPSBZQU1fTUFHSUMgfHwgeXAtPnR4X3N0YXRlICE9IFRYX09GRiB8fAorCSAgICBza2JfcXVldWVfZW1wdHkoJnlwLT5zZW5kX3F1ZXVlKSkKKwkJcmV0dXJuOworCS8qIHR4X3N0YXRlIGlzIFRYX09GRiBhbmQgdGhlcmUgaXMgZGF0YSB0byBzZW5kICovCisKKwlpZiAoeXAtPmR1cG1vZGUpIHsKKwkJLyogRnVsbCBkdXBsZXggbW9kZSwgZG9uJ3Qgd2FpdCAqLworCQl5YW1fc3RhcnRfdHgoZGV2LCB5cCk7CisJCXJldHVybjsKKwl9CisJaWYgKHlwLT5kY2QpIHsKKwkJLyogRENEIG9uLCB3YWl0IHNsb3RpbWUgLi4uICovCisJCXlwLT5zbG90Y250ID0geXAtPnNsb3QgLyAxMDsKKwkJcmV0dXJuOworCX0KKwkvKiBJcyBzbG90dGltZSBwYXNzZWQgPyAqLworCWlmICgoLS15cC0+c2xvdGNudCkgPiAwKQorCQlyZXR1cm47CisKKwl5cC0+c2xvdGNudCA9IHlwLT5zbG90IC8gMTA7CisKKwkvKiBpcyByYW5kb20gPiBwZXJzaXN0ID8gKi8KKwlpZiAoKHJhbmRvbV9udW0oKSAlIDI1NikgPiB5cC0+cGVycykKKwkJcmV0dXJuOworCisJeWFtX3N0YXJ0X3R4KGRldiwgeXApOworfQorCitzdGF0aWMgdm9pZCB5YW1fZG90aW1lcih1bnNpZ25lZCBsb25nIGR1bW15KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5SX1BPUlRTOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHlhbV9kZXZzW2ldOworCQlpZiAoZGV2ICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCXlhbV9hcmJpdHJhdGUoZGV2KTsKKwl9CisJeWFtX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLyAxMDA7CisJYWRkX3RpbWVyKCZ5YW1fdGltZXIpOworfQorCitzdGF0aWMgdm9pZCB5YW1fdHhfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgeWFtX3BvcnQgKnlwKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciBiLCB0ZW1wOworCisJc3dpdGNoICh5cC0+dHhfc3RhdGUpIHsKKwljYXNlIFRYX09GRjoKKwkJYnJlYWs7CisJY2FzZSBUWF9IRUFEOgorCQlpZiAoLS15cC0+dHhfY291bnQgPD0gMCkgeworCQkJaWYgKCEoc2tiID0gc2tiX2RlcXVldWUoJnlwLT5zZW5kX3F1ZXVlKSkpIHsKKwkJCQlwdHRfb2ZmKGRldik7CisJCQkJeXAtPnR4X3N0YXRlID0gVFhfT0ZGOworCQkJCWJyZWFrOworCQkJfQorCQkJeXAtPnR4X3N0YXRlID0gVFhfREFUQTsKKwkJCWlmIChza2ItPmRhdGFbMF0gIT0gMCkgeworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19raXNzX3BhcmFtcyhzLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsgKi8KKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJCWJyZWFrOworCQkJfQorCQkJeXAtPnR4X2xlbiA9IHNrYi0+bGVuIC0gMTsJLyogc3RyaXAgS0lTUyBieXRlICovCisJCQlpZiAoeXAtPnR4X2xlbiA+PSBZQU1fTUFYX0ZSQU1FIHx8IHlwLT50eF9sZW4gPCAyKSB7CisgICAgICAgIAkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQkJYnJlYWs7CisJCQl9CisJCQltZW1jcHkoeXAtPnR4X2J1Ziwgc2tiLT5kYXRhICsgMSwgeXAtPnR4X2xlbik7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJeXAtPnR4X2NvdW50ID0gMDsKKwkJCXlwLT50eF9jcmNsID0gMHgyMTsKKwkJCXlwLT50eF9jcmNoID0gMHhmMzsKKwkJCXlwLT50eF9zdGF0ZSA9IFRYX0RBVEE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUWF9EQVRBOgorCQliID0geXAtPnR4X2J1Zlt5cC0+dHhfY291bnQrK107CisJCW91dGIoYiwgVEhSKGRldi0+YmFzZV9hZGRyKSk7CisJCXRlbXAgPSB5cC0+dHhfY3JjbDsKKwkJeXAtPnR4X2NyY2wgPSBjaGt0YWJsW3RlbXBdIF4geXAtPnR4X2NyY2g7CisJCXlwLT50eF9jcmNoID0gY2hrdGFiaFt0ZW1wXSBeIGI7CisJCWlmICh5cC0+dHhfY291bnQgPj0geXAtPnR4X2xlbikgeworCQkJeXAtPnR4X3N0YXRlID0gVFhfQ1JDMTsKKwkJfQorCQlicmVhazsKKwljYXNlIFRYX0NSQzE6CisJCXlwLT50eF9jcmNoID0gY2hrdGFibFt5cC0+dHhfY3JjbF0gXiB5cC0+dHhfY3JjaDsKKwkJeXAtPnR4X2NyY2wgPSBjaGt0YWJoW3lwLT50eF9jcmNsXSBeIGNoa3RhYmxbeXAtPnR4X2NyY2hdIF4gMHhmZjsKKwkJb3V0Yih5cC0+dHhfY3JjbCwgVEhSKGRldi0+YmFzZV9hZGRyKSk7CisJCXlwLT50eF9zdGF0ZSA9IFRYX0NSQzI7CisJCWJyZWFrOworCWNhc2UgVFhfQ1JDMjoKKwkJb3V0YihjaGt0YWJoW3lwLT50eF9jcmNoXSBeIDB4RkYsIFRIUihkZXYtPmJhc2VfYWRkcikpOworCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZ5cC0+c2VuZF9xdWV1ZSkpIHsKKwkJCXlwLT50eF9jb3VudCA9ICh5cC0+Yml0cmF0ZSAqIHlwLT50eHRhaWwpIC8gODAwMDsKKwkJCWlmICh5cC0+ZHVwbW9kZSA9PSAyKQorCQkJCXlwLT50eF9jb3VudCArPSAoeXAtPmJpdHJhdGUgKiB5cC0+aG9sZGQpIC8gODsKKwkJCWlmICh5cC0+dHhfY291bnQgPT0gMCkKKwkJCQl5cC0+dHhfY291bnQgPSAxOworCQkJeXAtPnR4X3N0YXRlID0gVFhfVEFJTDsKKwkJfSBlbHNlIHsKKwkJCXlwLT50eF9jb3VudCA9IDE7CisJCQl5cC0+dHhfc3RhdGUgPSBUWF9IRUFEOworCQl9CisJCSsreXAtPnN0YXRzLnR4X3BhY2tldHM7CisJCWJyZWFrOworCWNhc2UgVFhfVEFJTDoKKwkJaWYgKC0teXAtPnR4X2NvdW50IDw9IDApIHsKKwkJCXlwLT50eF9zdGF0ZSA9IFRYX09GRjsKKwkJCXB0dF9vZmYoZGV2KTsKKwkJfQorCQlicmVhazsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJU1Igcm91dGluZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgeWFtX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHlhbV9wb3J0ICp5cDsKKwl1bnNpZ25lZCBjaGFyIGlpcjsKKwlpbnQgY291bnRlciA9IDEwMDsKKwlpbnQgaTsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfUE9SVFM7IGkrKykgeworCQlkZXYgPSB5YW1fZGV2c1tpXTsKKwkJeXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQkJY29udGludWU7CisKKwkJd2hpbGUgKChpaXIgPSBJSVJfTUFTSyAmIGluYihJSVIoZGV2LT5iYXNlX2FkZHIpKSkgIT0gSUlSX05PUEVORCkgeworCQkJdW5zaWduZWQgY2hhciBtc3IgPSBpbmIoTVNSKGRldi0+YmFzZV9hZGRyKSk7CisJCQl1bnNpZ25lZCBjaGFyIGxzciA9IGluYihMU1IoZGV2LT5iYXNlX2FkZHIpKTsKKwkJCXVuc2lnbmVkIGNoYXIgcnhiOworCisJCQloYW5kbGVkID0gMTsKKworCQkJaWYgKGxzciAmIExTUl9PRSkKKwkJCQkrK3lwLT5zdGF0cy5yeF9maWZvX2Vycm9yczsKKworCQkJeXAtPmRjZCA9IChtc3IgJiBSWF9EQ0QpID8gMSA6IDA7CisKKwkJCWlmICgtLWNvdW50ZXIgPD0gMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHRvbyBtYW55IGlycSBpaXI9JWRcbiIsCisJCQkJCQlkZXYtPm5hbWUsIGlpcik7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlpZiAobXNyICYgVFhfUkRZKSB7CisJCQkJKyt5cC0+bmJfbWRpbnQ7CisJCQkJeWFtX3R4X2J5dGUoZGV2LCB5cCk7CisJCQl9CisJCQlpZiAobHNyICYgTFNSX1JYQykgeworCQkJCSsreXAtPm5iX3J4aW50OworCQkJCXJ4YiA9IGluYihSQlIoZGV2LT5iYXNlX2FkZHIpKTsKKwkJCQlpZiAobXNyICYgUlhfRkxBRykKKwkJCQkJeWFtX3J4X2ZsYWcoZGV2LCB5cCk7CisJCQkJZWxzZQorCQkJCQl5YW1fcnhfYnl0ZShkZXYsIHlwLCByeGIpOworCQkJfQorCQl9CisJfQorb3V0OgorCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworc3RhdGljIHZvaWQgKnlhbV9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXJldHVybiAoKnBvcyA8IE5SX1BPUlRTKSA/IHlhbV9kZXZzWypwb3NdIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgKnlhbV9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKysqcG9zOworCXJldHVybiAoKnBvcyA8IE5SX1BPUlRTKSA/IHlhbV9kZXZzWypwb3NdIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgeWFtX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworfQorCitzdGF0aWMgaW50IHlhbV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdjsKKwljb25zdCBzdHJ1Y3QgeWFtX3BvcnQgKnlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNlcV9wcmludGYoc2VxLCAiRGV2aWNlICVzXG4iLCBkZXYtPm5hbWUpOworCXNlcV9wcmludGYoc2VxLCAiICBVcCAgICAgICAlZFxuIiwgbmV0aWZfcnVubmluZyhkZXYpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgU3BlZWQgICAgJXVcbiIsIHlwLT5iaXRyYXRlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgSW9CYXNlICAgMHgleFxuIiwgeXAtPmlvYmFzZSk7CisJc2VxX3ByaW50ZihzZXEsICIgIEJhdWRSYXRlICV1XG4iLCB5cC0+YmF1ZHJhdGUpOworCXNlcV9wcmludGYoc2VxLCAiICBJUlEgICAgICAldVxuIiwgeXAtPmlycSk7CisJc2VxX3ByaW50ZihzZXEsICIgIFR4U3RhdGUgICV1XG4iLCB5cC0+dHhfc3RhdGUpOworCXNlcV9wcmludGYoc2VxLCAiICBEdXBsZXggICAldVxuIiwgeXAtPmR1cG1vZGUpOworCXNlcV9wcmludGYoc2VxLCAiICBIb2xkRGx5ICAldVxuIiwgeXAtPmhvbGRkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgVHhEZWxheSAgJXVcbiIsIHlwLT50eGQpOworCXNlcV9wcmludGYoc2VxLCAiICBUeFRhaWwgICAldVxuIiwgeXAtPnR4dGFpbCk7CisJc2VxX3ByaW50ZihzZXEsICIgIFNsb3RUaW1lICV1XG4iLCB5cC0+c2xvdCk7CisJc2VxX3ByaW50ZihzZXEsICIgIFBlcnNpc3QgICV1XG4iLCB5cC0+cGVycyk7CisJc2VxX3ByaW50ZihzZXEsICIgIFR4RnJhbWVzICVsdVxuIiwgeXAtPnN0YXRzLnR4X3BhY2tldHMpOworCXNlcV9wcmludGYoc2VxLCAiICBSeEZyYW1lcyAlbHVcbiIsIHlwLT5zdGF0cy5yeF9wYWNrZXRzKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgVHhJbnQgICAgJXVcbiIsIHlwLT5uYl9tZGludCk7CisJc2VxX3ByaW50ZihzZXEsICIgIFJ4SW50ICAgICV1XG4iLCB5cC0+bmJfcnhpbnQpOworCXNlcV9wcmludGYoc2VxLCAiICBSeE92ZXIgICAlbHVcbiIsIHlwLT5zdGF0cy5yeF9maWZvX2Vycm9ycyk7CisJc2VxX3ByaW50ZihzZXEsICJcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHlhbV9zZXFvcHMgPSB7CisJLnN0YXJ0ID0geWFtX3NlcV9zdGFydCwKKwkubmV4dCA9IHlhbV9zZXFfbmV4dCwKKwkuc3RvcCA9IHlhbV9zZXFfc3RvcCwKKwkuc2hvdyA9IHlhbV9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgeWFtX2luZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJnlhbV9zZXFvcHMpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB5YW1faW5mb19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0geWFtX2luZm9fb3BlbiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKKyNlbmRpZgorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnlhbV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeWFtX3BvcnQgKnlwOworCisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCisJeXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWlmICh5cC0+bWFnaWMgIT0gWUFNX01BR0lDKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIAorCSAqIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLiAgVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlCisJICogY2FyZCBvcGVuIG9yIGNsb3NlZC4gCisJICovCisJcmV0dXJuICZ5cC0+c3RhdHM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHlhbV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHlhbV9wb3J0ICp5cCA9IG5ldGRldl9wcml2KGRldik7CisJZW51bSB1YXJ0IHU7CisJaW50IGk7CisJaW50IHJldD0wOworCisJcHJpbnRrKEtFUk5fSU5GTyAiVHJ5aW5nICVzIGF0IGlvYmFzZSAweCVseCBpcnEgJXVcbiIsIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKworCWlmICghZGV2IHx8ICF5cC0+Yml0cmF0ZSkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIWRldi0+YmFzZV9hZGRyIHx8IGRldi0+YmFzZV9hZGRyID4gMHgxMDAwIC0gWUFNX0VYVEVOVCB8fAorCQlkZXYtPmlycSA8IDIgfHwgZGV2LT5pcnEgPiAxNSkgeworCQlyZXR1cm4gLUVOWElPOworCX0KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBZQU1fRVhURU5ULCBkZXYtPm5hbWUpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IDB4JWx4IGJ1c3lcbiIsIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisJaWYgKCh1ID0geWFtX2NoZWNrX3VhcnQoZGV2LT5iYXNlX2FkZHIpKSA9PSBjX3VhcnRfdW5rbm93bikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW5ub3QgZmluZCB1YXJ0IHR5cGVcbiIsIGRldi0+bmFtZSk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0X3JlbGVhc2VfYmFzZTsKKwl9CisJaWYgKGZwZ2FfZG93bmxvYWQoZGV2LT5iYXNlX2FkZHIsIHlwLT5iaXRyYXRlKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW5ub3QgaW5pdCBGUEdBXG4iLCBkZXYtPm5hbWUpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dF9yZWxlYXNlX2Jhc2U7CisJfQorCW91dGIoMCwgSUVSKGRldi0+YmFzZV9hZGRyKSk7CisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCB5YW1faW50ZXJydXB0LCBTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGlycSAlZCBidXN5XG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dF9yZWxlYXNlX2Jhc2U7CisJfQorCisJeWFtX3NldF91YXJ0KGRldik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQorCXlwLT5zbG90Y250ID0geXAtPnNsb3QgLyAxMDsKKworCS8qIFJlc2V0IG92ZXJydW5zIGZvciBhbGwgcG9ydHMgLSBGUEdBIHByb2dyYW1taW5nIG1ha2VzIG92ZXJydW5zICovCisJZm9yIChpID0gMDsgaSA8IE5SX1BPUlRTOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHlhbV9kZXZzW2ldOworCQlzdHJ1Y3QgeWFtX3BvcnQgKnlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJaW5iKExTUihkZXYtPmJhc2VfYWRkcikpOworCQl5cC0+c3RhdHMucnhfZmlmb19lcnJvcnMgPSAwOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzIGF0IGlvYmFzZSAweCVseCBpcnEgJXUgdWFydCAlc1xuIiwgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEsCisJCSAgIHVhcnRfc3RyW3VdKTsKKwlyZXR1cm4gMDsKKworb3V0X3JlbGVhc2VfYmFzZToKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgWUFNX0VYVEVOVCk7CisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgeWFtX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgeWFtX3BvcnQgKnlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogZGlzYWJsZSBpbnRlcnJ1cHRzCisJICovCisJb3V0YigwLCBJRVIoZGV2LT5iYXNlX2FkZHIpKTsKKwlvdXRiKDEsIE1DUihkZXYtPmJhc2VfYWRkcikpOworCS8qIFJlbW92ZSBJUlEgaGFuZGxlciBpZiBsYXN0ICovCisJZnJlZV9pcnEoZGV2LT5pcnEsZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgWUFNX0VYVEVOVCk7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnlwLT5zZW5kX3F1ZXVlKSkpCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBjbG9zZSB5YW0gYXQgaW9iYXNlIDB4JWx4IGlycSAldVxuIiwKKwkJICAgeWFtX2Rydm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHlhbV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgeWFtX3BvcnQgKnlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgeWFtZHJ2X2lvY3RsX2NmZyB5aTsKKwlzdHJ1Y3QgeWFtZHJ2X2lvY3RsX21jcyAqeW07CisJaW50IGlvY3RsX2NtZDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmaW9jdGxfY21kLCBpZnItPmlmcl9kYXRhLCBzaXplb2YoaW50KSkpCisJCSByZXR1cm4gLUVGQVVMVDsKKworCWlmICh5cC0+bWFnaWMgIT0gWUFNX01BR0lDKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChjbWQgIT0gU0lPQ0RFVlBSSVZBVEUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChpb2N0bF9jbWQpIHsKKworCWNhc2UgU0lPQ1lBTVJFU0VSVkVEOgorCQlyZXR1cm4gLUVJTlZBTDsJCQkvKiB1bnVzZWQgKi8KKworCWNhc2UgU0lPQ1lBTVNNQ1M6CisJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCQlyZXR1cm4gLUVJTlZBTDsJCS8qIENhbm5vdCBjaGFuZ2UgdGhpcyBwYXJhbWV0ZXIgd2hlbiB1cCAqLworCQlpZiAoKHltID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHlhbWRydl9pb2N0bF9tY3MpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJeW0tPmJpdHJhdGUgPSA5NjAwOworCQlpZiAoY29weV9mcm9tX3VzZXIoeW0sIGlmci0+aWZyX2RhdGEsIHNpemVvZihzdHJ1Y3QgeWFtZHJ2X2lvY3RsX21jcykpKSB7CisJCQlrZnJlZSh5bSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlpZiAoeW0tPmJpdHJhdGUgPiBZQU1fTUFYQklUUkFURSkgeworCQkJa2ZyZWUoeW0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYWRkX21jcyh5bS0+Yml0cywgeW0tPmJpdHJhdGUpOworCQlrZnJlZSh5bSk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DWUFNU0NGRzoKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ5aSwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKHN0cnVjdCB5YW1kcnZfaW9jdGxfY2ZnKSkpCisJCQkgcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKCh5aS5jZmcubWFzayAmIFlBTV9JT0JBU0UpICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCXJldHVybiAtRUlOVkFMOwkJLyogQ2Fubm90IGNoYW5nZSB0aGlzIHBhcmFtZXRlciB3aGVuIHVwICovCisJCWlmICgoeWkuY2ZnLm1hc2sgJiBZQU1fSVJRKSAmJiBuZXRpZl9ydW5uaW5nKGRldikpCisJCQlyZXR1cm4gLUVJTlZBTDsJCS8qIENhbm5vdCBjaGFuZ2UgdGhpcyBwYXJhbWV0ZXIgd2hlbiB1cCAqLworCQlpZiAoKHlpLmNmZy5tYXNrICYgWUFNX0JJVFJBVEUpICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCXJldHVybiAtRUlOVkFMOwkJLyogQ2Fubm90IGNoYW5nZSB0aGlzIHBhcmFtZXRlciB3aGVuIHVwICovCisJCWlmICgoeWkuY2ZnLm1hc2sgJiBZQU1fQkFVRFJBVEUpICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCXJldHVybiAtRUlOVkFMOwkJLyogQ2Fubm90IGNoYW5nZSB0aGlzIHBhcmFtZXRlciB3aGVuIHVwICovCisKKwkJaWYgKHlpLmNmZy5tYXNrICYgWUFNX0lPQkFTRSkgeworCQkJeXAtPmlvYmFzZSA9IHlpLmNmZy5pb2Jhc2U7CisJCQlkZXYtPmJhc2VfYWRkciA9IHlpLmNmZy5pb2Jhc2U7CisJCX0KKwkJaWYgKHlpLmNmZy5tYXNrICYgWUFNX0lSUSkgeworCQkJaWYgKHlpLmNmZy5pcnEgPiAxNSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXlwLT5pcnEgPSB5aS5jZmcuaXJxOworCQkJZGV2LT5pcnEgPSB5aS5jZmcuaXJxOworCQl9CisJCWlmICh5aS5jZmcubWFzayAmIFlBTV9CSVRSQVRFKSB7CisJCQlpZiAoeWkuY2ZnLmJpdHJhdGUgPiBZQU1fTUFYQklUUkFURSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXlwLT5iaXRyYXRlID0geWkuY2ZnLmJpdHJhdGU7CisJCX0KKwkJaWYgKHlpLmNmZy5tYXNrICYgWUFNX0JBVURSQVRFKSB7CisJCQlpZiAoeWkuY2ZnLmJhdWRyYXRlID4gWUFNX01BWEJBVURSQVRFKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJeXAtPmJhdWRyYXRlID0geWkuY2ZnLmJhdWRyYXRlOworCQl9CisJCWlmICh5aS5jZmcubWFzayAmIFlBTV9NT0RFKSB7CisJCQlpZiAoeWkuY2ZnLm1vZGUgPiBZQU1fTUFYTU9ERSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXlwLT5kdXBtb2RlID0geWkuY2ZnLm1vZGU7CisJCX0KKwkJaWYgKHlpLmNmZy5tYXNrICYgWUFNX0hPTERETFkpIHsKKwkJCWlmICh5aS5jZmcuaG9sZGRseSA+IFlBTV9NQVhIT0xERExZKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJeXAtPmhvbGRkID0geWkuY2ZnLmhvbGRkbHk7CisJCX0KKwkJaWYgKHlpLmNmZy5tYXNrICYgWUFNX1RYREVMQVkpIHsKKwkJCWlmICh5aS5jZmcudHhkZWxheSA+IFlBTV9NQVhUWERFTEFZKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJeXAtPnR4ZCA9IHlpLmNmZy50eGRlbGF5OworCQl9CisJCWlmICh5aS5jZmcubWFzayAmIFlBTV9UWFRBSUwpIHsKKwkJCWlmICh5aS5jZmcudHh0YWlsID4gWUFNX01BWFRYVEFJTCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXlwLT50eHRhaWwgPSB5aS5jZmcudHh0YWlsOworCQl9CisJCWlmICh5aS5jZmcubWFzayAmIFlBTV9QRVJTSVNUKSB7CisJCQlpZiAoeWkuY2ZnLnBlcnNpc3QgPiBZQU1fTUFYUEVSU0lTVCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXlwLT5wZXJzID0geWkuY2ZnLnBlcnNpc3Q7CisJCX0KKwkJaWYgKHlpLmNmZy5tYXNrICYgWUFNX1NMT1RUSU1FKSB7CisJCQlpZiAoeWkuY2ZnLnNsb3R0aW1lID4gWUFNX01BWFNMT1RUSU1FKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJeXAtPnNsb3QgPSB5aS5jZmcuc2xvdHRpbWU7CisJCQl5cC0+c2xvdGNudCA9IHlwLT5zbG90IC8gMTA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNJT0NZQU1HQ0ZHOgorCQl5aS5jZmcubWFzayA9IDB4ZmZmZmZmZmY7CisJCXlpLmNmZy5pb2Jhc2UgPSB5cC0+aW9iYXNlOworCQl5aS5jZmcuaXJxID0geXAtPmlycTsKKwkJeWkuY2ZnLmJpdHJhdGUgPSB5cC0+Yml0cmF0ZTsKKwkJeWkuY2ZnLmJhdWRyYXRlID0geXAtPmJhdWRyYXRlOworCQl5aS5jZmcubW9kZSA9IHlwLT5kdXBtb2RlOworCQl5aS5jZmcudHhkZWxheSA9IHlwLT50eGQ7CisJCXlpLmNmZy5ob2xkZGx5ID0geXAtPmhvbGRkOworCQl5aS5jZmcudHh0YWlsID0geXAtPnR4dGFpbDsKKwkJeWkuY2ZnLnBlcnNpc3QgPSB5cC0+cGVyczsKKwkJeWkuY2ZnLnNsb3R0aW1lID0geXAtPnNsb3Q7CisJCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgJnlpLCBzaXplb2Yoc3RydWN0IHlhbWRydl9pb2N0bF9jZmcpKSkKKwkJCSByZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKworCX0KKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCB5YW1fc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisJc3RydWN0IHNvY2thZGRyICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgYWRkcjsKKworCS8qIGFkZHIgaXMgYW4gQVguMjUgc2hpZnRlZCBBU0NJSSBtYWMgYWRkcmVzcyAqLworCW1lbWNweShkZXYtPmRldl9hZGRyLCBzYS0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCB5YW1fc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeWFtX3BvcnQgKnlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXlwLT5tYWdpYyA9IFlBTV9NQUdJQzsKKwl5cC0+Yml0cmF0ZSA9IERFRkFVTFRfQklUUkFURTsKKwl5cC0+YmF1ZHJhdGUgPSBERUZBVUxUX0JJVFJBVEUgKiAyOworCXlwLT5pb2Jhc2UgPSAwOworCXlwLT5pcnEgPSAwOworCXlwLT5kdXBtb2RlID0gMDsKKwl5cC0+aG9sZGQgPSBERUZBVUxUX0hPTEREOworCXlwLT50eGQgPSBERUZBVUxUX1RYRDsKKwl5cC0+dHh0YWlsID0gREVGQVVMVF9UWFRBSUw7CisJeXAtPnNsb3QgPSBERUZBVUxUX1NMT1Q7CisJeXAtPnBlcnMgPSBERUZBVUxUX1BFUlM7CisJeXAtPmRldiA9IGRldjsKKworCWRldi0+YmFzZV9hZGRyID0geXAtPmlvYmFzZTsKKwlkZXYtPmlycSA9IHlwLT5pcnE7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJZGV2LT5vcGVuID0geWFtX29wZW47CisJZGV2LT5zdG9wID0geWFtX2Nsb3NlOworCWRldi0+ZG9faW9jdGwgPSB5YW1faW9jdGw7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB5YW1fc2VuZF9wYWNrZXQ7CisJZGV2LT5nZXRfc3RhdHMgPSB5YW1fZ2V0X3N0YXRzOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmeXAtPnNlbmRfcXVldWUpOworCisjaWYgZGVmaW5lZChDT05GSUdfQVgyNSkgfHwgZGVmaW5lZChDT05GSUdfQVgyNV9NT0RVTEUpCisJZGV2LT5oYXJkX2hlYWRlciA9IGF4MjVfZW5jYXBzdWxhdGU7CisJZGV2LT5yZWJ1aWxkX2hlYWRlciA9IGF4MjVfcmVidWlsZF9oZWFkZXI7CisjZWxzZQkJCQkJCQkvKiBDT05GSUdfQVgyNSB8fCBDT05GSUdfQVgyNV9NT0RVTEUgKi8KKwlkZXYtPmhhcmRfaGVhZGVyID0gTlVMTDsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyID0gTlVMTDsKKyNlbmRpZgkJCQkJCQkvKiBDT05GSUdfQVgyNSB8fCBDT05GSUdfQVgyNV9NT0RVTEUgKi8KKworCWRldi0+c2V0X21hY19hZGRyZXNzID0geWFtX3NldF9tYWNfYWRkcmVzczsKKworCWRldi0+dHlwZSA9IEFSUEhSRF9BWDI1OwkvKiBBRl9BWDI1IGRldmljZSAqLworCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gNzM7CS8qIFdlIGRvIGRpZ2lwZWF0ZXJzIG5vdyAqLworCWRldi0+bXR1ID0gMjU2OwkJCQkvKiBBWDI1IGlzIHRoZSBkZWZhdWx0ICovCisJZGV2LT5hZGRyX2xlbiA9IDc7CQkJLyogc2l6ZW9mIGFuIGF4LjI1IGFkZHJlc3MgKi8KKwltZW1jcHkoZGV2LT5icm9hZGNhc3QsIGF4MjVfYmNhc3QsIDcpOworCW1lbWNweShkZXYtPmRldl9hZGRyLCBheDI1X3Rlc3QsIDcpOworCit9CisKK3N0YXRpYyBpbnQgX19pbml0IHlhbV9pbml0X2RyaXZlcih2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGksIGVycjsKKwljaGFyIG5hbWVbSUZOQU1TSVpdOworCisJcHJpbnRrKHlhbV9kcnZpbmZvKTsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKSB7CisJCXNwcmludGYobmFtZSwgInlhbSVkIiwgaSk7CisJCQorCQlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCB5YW1fcG9ydCksIG5hbWUsCisJCQkJICAgeWFtX3NldHVwKTsKKwkJaWYgKCFkZXYpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAieWFtOiBjYW5ub3QgYWxsb2NhdGUgbmV0IGRldmljZSAlc1xuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJCisJCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ5YW06IGNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlICVzXG4iLCBkZXYtPm5hbWUpOworCQkJZ290byBlcnJvcjsKKwkJfQorCQl5YW1fZGV2c1tpXSA9IGRldjsKKworCX0KKworCXlhbV90aW1lci5mdW5jdGlvbiA9IHlhbV9kb3RpbWVyOworCXlhbV90aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaIC8gMTAwOworCWFkZF90aW1lcigmeWFtX3RpbWVyKTsKKworCXByb2NfbmV0X2ZvcHNfY3JlYXRlKCJ5YW0iLCBTX0lSVUdPLCAmeWFtX2luZm9fZm9wcyk7CisJcmV0dXJuIDA7CisgZXJyb3I6CisJd2hpbGUgKC0taSA+PSAwKSB7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KHlhbV9kZXZzW2ldKTsKKwkJZnJlZV9uZXRkZXYoeWFtX2RldnNbaV0pOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgX19leGl0IHlhbV9jbGVhbnVwX2RyaXZlcih2b2lkKQoreworCXN0cnVjdCB5YW1fbWNzICpwOworCWludCBpOworCisJZGVsX3RpbWVyKCZ5YW1fdGltZXIpOworCWZvciAoaSA9IDA7IGkgPCBOUl9QT1JUUzsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB5YW1fZGV2c1tpXTsKKwkJaWYgKGRldikgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9CisKKwl3aGlsZSAoeWFtX2RhdGEpIHsKKwkJcCA9IHlhbV9kYXRhOworCQl5YW1fZGF0YSA9IHlhbV9kYXRhLT5uZXh0OworCQlrZnJlZShwKTsKKwl9CisKKwlwcm9jX25ldF9yZW1vdmUoInlhbSIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworTU9EVUxFX0FVVEhPUigiRnJlZGVyaWMgUmlibGUgRjFPQVQgZnJpYmxlQHRlYXNlci5mciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJZYW0gYW1hdGV1ciByYWRpbyBtb2RlbSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoeWFtX2luaXRfZHJpdmVyKTsKK21vZHVsZV9leGl0KHlhbV9jbGVhbnVwX2RyaXZlcik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby95YW0xMjAwLmggYi9kcml2ZXJzL25ldC9oYW1yYWRpby95YW0xMjAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNjYThhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3lhbTEyMDAuaApAQCAtMCwwICsxLDM0MyBAQAorLyoKKyAqCisgKiBGaWxlIHlhbTFrMmI1Lm1jcyBjb252ZXJ0ZWQgdG8gaCBmb3JtYXQgYnkgbWNzMmgKKyAqCisgKiAoQykgRjZGQkIgMTk5OAorICoKKyAqIFR1ZSBBdWcgMjUgMjA6MjQ6MDggMTk5OAorICoKKyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBiaXRzXzEyMDBbXT0geworMHhmZiwweGYyLDB4MDAsMHhhNSwweGFkLDB4ZmYsMHhmZSwweDlmLDB4ZmYsMHhlZiwweGYzLDB4Y2IsMHhmZiwweGRiLDB4ZmMsMHhmMiwKKzB4ZmYsMHhmNiwweGZmLDB4M2MsMHhiZiwweGZkLDB4YmYsMHhkZiwweDZlLDB4M2YsMHg2ZiwweGYxLDB4N2QsMHhiNCwweGZkLDB4YmYsCisweGRmLDB4NmYsMHgzZiwweDZmLDB4ZjcsMHgwYiwweGZmLDB4ZGIsMHhmZCwweGYyLDB4ZmYsMHhmNiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmMCwweGNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmQsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4YmYsCisweGZmLDB4ZmYsMHhmNywweGZmLDB4ZmYsMHhmYiwweGZmLDB4ZmYsMHhmZiwweGZjLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGYwLAorMHg1ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGY3LDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmUsMHg3ZiwweGJmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmNywweGZmLDB4ZmIsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDlmLAorMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmQsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZjcsMHhmZiwKKzB4ZmYsMHhmZiwweGZiLDB4ZmYsMHhmYiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGY3LDB4ZmYsMHhmZiwweGZiLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGZmLDB4ZjAsMHg1ZiwweGZmLAorMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZWYsMHhmZiwweGZmLDB4ZmIsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhiZiwweGZmLDB4ZmYsMHhkZiwweGY3LDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmYiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhlYiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmQsMHhmZiwweGJmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmIsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGY3LDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGY3LDB4YmYsMHhlNywweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmIsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDc3LDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4MWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGRiLAorMHhmZiwweGZmLDB4ZjUsMHhhNSwweGZkLDB4NGIsMHg2ZSwweGVmLDB4MzMsMHgzMiwweGRkLDB4ZDMsMHg0YSwweGQ2LDB4OTIsMHhmZSwKKzB4YjMsMHgzZiwweGJkLDB4ZjEsMHhmYSwweGRiLDB4ZmUsMHhmNywweGY2LDB4OTYsMHhiZCwweGJkLDB4ZmYsMHhiZCwweGZmLDB4ZWQsCisweDdmLDB4NmIsMHg3ZiwweGZiLDB4ZGYsMHhmZSwweGZiLDB4ZmUsMHg5MCwweGNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhiZSwweGVmLAorMHhmZiwweGZmLDB4ZGIsMHg1ZiwweGY2LDB4ZmYsMHhmNiwweDhmLDB4ZmQsMHhhNSwweGRkLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHg2ZiwKKzB4N2YsMHhkYiwweGYxLDB4ZmMsMHhiZiwweGZmLDB4NmYsMHhmZiwweGVmLDB4ZmMsMHg1YiwweDVkLDB4ZGEsMHhkZiwweGY0LDB4ZmYsCisweGYyLDB4ZmYsMHhmZCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZDAsMHgxZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZiLDB4ZWYsMHhiNywweGZjLDB4MzMsMHhmZiwweGZiLDB4ZmYsMHgwNCwweDZhLDB4ZjMsMHgzYywweDM2LDB4ZmYsMHhmMCwKKzB4MGYsMHhmMSwweDBmLDB4ZmYsMHhmZiwweGZmLDB4ZjMsMHgxNSwweDcyLDB4MGYsMHhmMSwweDZmLDB4ZmYsMHhmZSwweDk0LDB4M2YsCisweGZmLDB4ZmYsMHhmZiwweDdiLDB4ZmYsMHhmZiwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGYwLAorMHhmNywweGVmLDB4YjcsMHhmYywweDMzLDB4ZmYsMHhmZiwweGZmLDB4MDQsMHg2YSwweGYzLDB4M2MsMHgzNiwweGZmLDB4ZjAsMHgwZiwKKzB4ZjEsMHgwZiwweGZmLDB4ZmYsMHhmZiwweGYzLDB4MTUsMHg3MywweDhmLDB4ZjIsMHg2ZiwweGZmLDB4ZmUsMHg5NCwweDNmLDB4ZmYsCisweGZmLDB4ZmYsMHg3ZCwweDlmLDB4ZmYsMHhmMCwweDBmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDllLAorMHhmZiwweGZjLDB4ZWYsMHhkMywweGZiLDB4ZmYsMHg3ZiwweGY1LDB4NWYsMHhmZSwweDU5LDB4ZmYsMHhmZiwweGZmLDB4ZmMsMHhmMSwKKzB4ZmUsMHg3ZiwweGZmLDB4ZmYsMHhmYSwweDE3LDB4ZmYsMHhlNywweGVmLDB4ZWYsMHhmZiwweGZmLDB4M2YsMHhmMSwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjUsMHhmZiwweGJmLDB4ZmYsMHhmYywweGVhLAorMHhmZiwweGYwLDB4ZmYsMHhmZiwweGJmLDB4ZjksMHgzZiwweGIxLDB4ZWYsMHhmZiwweGQ3LDB4ZmYsMHhmYiwweGZmLDB4ZjAsMHhmZiwKKzB4ZmYsMHhmMywweGZmLDB4ZGYsMHhmZiwweDdiLDB4ZmYsMHhmZCwweGZmLDB4ZjYsMHhmZiwweGJmLDB4ZmYsMHhmZiwweGJmLDB4ZmYsCisweGZmLDB4ZmYsMHhkYSwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYyLDB4YzAsMHgwMSwweDAwLDB4MDAsMHgwMiwweDAyLAorMHgwMiwweDAyLDB4MDAsMHg0MCwweDQwLDB4NDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDIwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxOSwweDAwLDB4MDQsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsCisweDAwLDB4M2MsMHhmMCwweGFmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZCwweGJmLDB4ZmYsMHhmZiwweGZiLDB4ZmYsMHhmZCwweGZmLAorMHhmZiwweDdmLDB4ZmYsMHhmZiwweGJmLDB4ZmYsMHhlZiwweGZmLDB4ZmYsMHhmZCwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZGYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGJmLDB4ZmUsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZGYsCisweGRiLDB4ZjAsMHg2ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjAsMHhiZiwweGRmLDB4ZmYsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhkZiwweGRmLDB4ZmYsMHhlZiwweGZmLDB4OWUsMHhlZiwweGZmLDB4ZmYsMHg3ZiwweGZmLDB4ZjEsMHhlZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZjcsMHhmYSwweGJmLDB4ZmYsMHhmZiwweGZlLDB4NDcsMHhlZiwweGZmLDB4YmQsMHhmNiwweGZmLDB4ZmYsMHhkZiwweGY1LDB4ZjAsCisweGYwLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY4LDB4MzAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDEsMHgwMiwweDA4LAorMHgxNiwweDAwLDB4MDAsMHgwMCwweDgwLDB4MDAsMHgwMSwweDAyLDB4MDAsMHg4MCwweDAxLDB4MGMsMHgwMiwweDAwLDB4MDAsMHgwMSwKKzB4MDAsMHgwMCwweDIwLDB4MDAsMHgwMCwweDA2LDB4MDAsMHgyMCwweDAwLDB4MTAsMHgwMCwweDE0LDB4MDAsMHgwNCwweGMxLDB4ZjAsCisweDJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZiLDB4ZmYsMHhmZiwweDdmLAorMHhlYywweGZmLDB4ZmYsMHhmYSwweGZmLDB4YmYsMHhmZiwweDZmLDB4ZmYsMHhlMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4YmQsMHhmZSwKKzB4NDYsMHhmZiwweGVmLDB4N2YsMHhjZCwweGRmLDB4ZmYsMHhmZiwweGZkLDB4ZmYsMHhiZCwweGZmLDB4N2YsMHg3ZiwweGYwLDB4NGYsCisweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDBmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZkLDB4YTQsMHhiYywweGNkLDB4NmQsMHg2YiwweDZmLDB4NWIsMHhkYywweDMzLAorMHg1YSwweGY2LDB4ZjcsMHhmNiwweGIzLDB4M2YsMHhiZCwweGMxLDB4ZmEsMHg1YSwweGY2LDB4ZjYsMHhiNiwweGY3LDB4ZmYsMHhiZCwKKzB4YmIsMHgzYywweGNlLDB4Y2YsMHgzNCwweGVmLDB4MzMsMHhiYiwweGNjLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHg0ZiwweGZmLDB4ZmYsCisweGZmLDB4ZmUsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGRiLDB4ZmYsMHhmNiwweGQ2LDB4ZmYsMHhmZCwweGZkLDB4YmYsMHhmZiwweGFkLAorMHhiZiwweGY5LDB4N2YsMHg2ZiwweGZjLDB4ZGIsMHhmMSwweGZkLDB4YmYsMHhmZiwweDZmLDB4ZmYsMHhmZiwweGRhLDB4ZGIsMHhmYywKKzB4ZGIsMHhmZiwweDc2LDB4OGYsMHhmNiwweGZmLDB4Y2QsMHhhYiwweGZlLDB4ZmIsMHhmZiwweGQwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZlLDB4ZmYsMHg5ZiwweGZmLDB4ZjQsMHgyMCwweGFmLDB4NmQsMHgwYiwweGMxLDB4N2IsMHhmZiwweGZmLDB4ZmYsMHhjYiwweGZmLAorMHgzZiwweGYwLDB4ZWYsMHg3ZiwweDBmLDB4ZjEsMHhjMywweDNjLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjgsMHgwYiwKKzB4MWQsMHg2YSwweDY0LDB4MDUsMHg2YiwweDk5LDB4MDEsMHhmZiwweGZkLDB4ZWYsMHhmMCwweDJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsCisweGZmLDB4ZmYsMHhmZiwweGY0LDB4MDAsMHgyZiwweGNjLDB4MGIsMHhjMywweDdmLDB4ZmYsMHhmZiwweGZmLDB4MGEsMHhkZiwweGJmLAorMHhmZCwweDdmLDB4ZmYsMHhmZiwweGYxLDB4YzMsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4NGEsMHgwZSwKKzB4OTYsMHg2NCwweDAyLDB4OTcsMHg5OSwweDEwLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsCisweGZmLDB4ZmYsMHhmZSwweDg0LDB4ZjksMHhkNSwweDI3LDB4ZjEsMHg3ZiwweGZmLDB4ZjgsMHhlYiwweGRmLDB4ZjMsMHhjZiwweDNmLAorMHgxZiwweGZmLDB4ZjcsMHgxMSwweGZmLDB4Y2YsMHhmZiwweGZlLDB4NjcsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGM0LDB4ZmYsMHhmZiwKKzB4YjMsMHhhMSwweGZmLDB4ZjksMHhlMCwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY1LDB4ZmYsCisweGZmLDB4ZmIsMHg3ZiwweGUwLDB4ZmYsMHhjNywweGZlLDB4N2YsMHgzZiwweGZmLDB4ZmQsMHg3NywweDhkLDB4N2YsMHgwZiwweGZmLAorMHhjMywweGZmLDB4ZjEsMHhiZiwweDhmLDB4Y2YsMHhmZiwweGZmLDB4ZGQsMHg3YiwweGZmLDB4ZjYsMHhmYSwweGY3LDB4ZmYsMHg0MCwKKzB4OWYsMHhmOSwweDdmLDB4ZDgsMHhmZiwweGZmLDB4ZmEsMHhmMCwweDFmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMSwweGMwLDB4MDAsCisweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDEwLAorMHgwMCwweDAxLDB4MDAsMHgxMCwweDIwLDB4MjAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDA0LDB4MDEsMHgwNSwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHg0MCwweDQwLDB4MDAsMHgwMCwweDNjLDB4ZjAsMHgxZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmQsMHhiZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZSwweDdmLDB4N2YsMHhmZiwweGVmLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhlZiwweGY3LAorMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHhmZiwweGZmLDB4ZjcsMHhmZiwweGZmLDB4ZmYsMHhmYywweGZkLDB4ZmYsMHg3ZiwKKzB4N2UsMHhmZiwweGZmLDB4ZmYsMHhkYiwweGYwLDB4NmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYwLDB4YmIsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZSwweGViLDB4ZmQsMHg2ZiwweGZmLDB4ZjcsMHhmZSwweGY1LDB4N2YsMHhmZiwweGZmLDB4N2YsMHhiZiwweGIxLAorMHhmZiwweGZmLDB4OWYsMHhiZiwweGZiLDB4ZmYsMHhmZSwweGZmLDB4ZmUsMHhmZiwweGY3LDB4ZWIsMHhkZiwweGJmLDB4NWYsMHhkZCwKKzB4ZmYsMHhkYiwweGZkLDB4ZDAsMHhmMCwweDZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmOCwweDMwLDB4MjAsMHgwMCwweDQyLDB4MDAsCisweDAwLDB4MDAsMHgzMCwweDE4LDB4MDQsMHgwOCwweDA5LDB4MjEsMHg4MiwweDgwLDB4MDIsMHgwMCwweDA4LDB4MDAsMHgwMSwweDAwLAorMHgwMCwweDAwLDB4MGMsMHgyMCwweDEwLDB4MDAsMHgxMSwweDAwLDB4NDQsMHg4NCwweDAwLDB4MjAsMHgyMCwweDg0LDB4ODAsMHgwMCwKKzB4MDAsMHgwMCwweGMxLDB4ZjAsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmNywweGZmLDB4ZmIsMHhkZCwweGY5LDB4ZmYsCisweGRhLDB4ZmYsMHhkYywweGRkLDB4ZmMsMHhmYiwweGZmLDB4YmYsMHhmYiwweDNlLDB4ZDcsMHg5NiwweGZlLDB4NjEsMHhmNywweGZmLAorMHg3ZiwweGZmLDB4M2YsMHhmZCwweGZmLDB4ZGYsMHhjZiwweGY3LDB4ZGYsMHhmNywweGJmLDB4ZmQsMHhmZiwweGZlLDB4ZWYsMHhlZiwKKzB4ZmUsMHhmZiwweGYwLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmMCwweDJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmMywweGJkLDB4ZmQsMHg0YiwweDc0LDB4Y2YsCisweDczLDB4NWIsMHhjYiwweDNiLDB4ZGYsMHhmZSwweGY3LDB4ZmUsMHhkMywweDc1LDB4YWMsMHhhMSwweGZiLDB4ZGYsMHhmZSwweGY3LAorMHg3NiwweDk2LDB4YjUsMHgyNCwweGJkLDB4YTUsMHhhZCwweDQ5LDB4MmYsMHg2OSwweDJiLDB4NTIsMHg1YiwweGJkLDB4ZmYsMHhmZiwKKzB4ZjAsMHhjZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhkYiwweGZmLDB4ZjYsMHhmZSwweGZmLDB4Y2MsCisweGE3LDB4ZmIsMHhhZCwweGZmLDB4N2YsMHg2ZiwweGZmLDB4NmQsMHg3ZiwweGRiLDB4ZjEsMHhmZCwweGJmLDB4ZmYsMHg2ZiwweGZmLAorMHg2ZiwweGZmLDB4ZGIsMHhmZiwweGRiLDB4ZmYsMHhmNiwweDk3LDB4ZjYsMHhmZiwweGI1LDB4YjUsMHhmZiwweGZmLDB4ZmYsMHhkMCwKKzB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZkLDB4YTUsMHhiYywweDQzLDB4ZmMsMHg3YywweDAzLDB4ZTcsCisweGZmLDB4ZmYsMHgyMCwweGZmLDB4ZmYsMHhmZiwweGNjLDB4ZmQsMHg3ZCwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkNSwweDU5LAorMHhiYSwweDU2LDB4NjYsMHg2YSwweGFkLDB4OWEsMHhhOSwweDlhLDB4OTcsMHhhNSwweGFhLDB4YmIsMHhmZiwweGZmLDB4ZjAsMHgwZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZSwweGZiLDB4ZmYsMHhmZCwweGY3LDB4ZmQsMHg0MywweGZmLDB4ZmQsMHg2YiwweGU3LDB4ZmYsCisweGZmLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4M2YsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZDUsMHg1OSwweGI1LAorMHhhNiwweDY2LDB4NmEsMHhhZCwweDlhLDB4YTksMHg5OSwweDZiLDB4NWEsMHhhYSwweGZmLDB4ZmYsMHhiNywweGYwLDB4M2YsMHhmZiwKKzB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHg5YywweGY3LDB4ZmQsMHhkMiwweDQxLDB4ZmYsMHhmZiwweGYyLDB4N2YsCisweDhmLDB4ZmYsMHhmZiwweDNkLDB4ZjMsMHhmZiwweDE3LDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhkZiwweGZjLAorMHg4ZiwweDM4LDB4ZmYsMHhlZiwweDIzLDB4ZmYsMHhmYiwweGY3LDB4YzgsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDlmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZSwweGY1LDB4N2YsMHhmZiwweGZkLDB4ZmYsMHhlNCwweGZmLDB4ZWIsMHhmZiwweGNmLDB4YmYsMHhmYSwweGZmLDB4YWIsCisweGVmLDB4ZmYsMHhmYiwweGZmLDB4ZjMsMHhmZCwweDYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmYSwweGZmLDB4ZmIsMHhmZCwweDBkLAorMHhmZiwweGZlLDB4ZmYsMHg0MywweDdmLDB4ZmUsMHhiZiwweGQwLDB4ZmQsMHhmZiwweGZhLDB4ZjAsMHgzZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmUsMHhmMywweGMwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAyLDB4MDEsMHgwMCwweDYwLDB4YzAsMHg0MCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgzNCwweDA0LDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHg4OCwweDAwLAorMHgwMCwweDAzLDB4MDAsMHgwMCwweDQwLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgzYywweGYwLDB4M2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwKKzB4ZmQsMHgzZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDdmLDB4N2YsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGY3LDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjcsMHhmZiwweGZmLDB4ZmYsMHhmZCwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZlLDB4NWYsMHhmZiwweGZmLDB4Y2IsMHhmMCwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMCwKKzB4ZmYsMHhmZiwweGZkLDB4ZmYsMHhlZiwweGUzLDB4ZGUsMHhlZSwweGQ5LDB4YzUsMHg5MywweGZmLDB4ZmYsMHhmZSwweGZlLDB4ZmYsCisweGZiLDB4ZWUsMHhmZSwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZkLDB4ZmYsMHhiZiwweGY3LDB4ZmYsMHhmZiwweDdmLAorMHhhZiwweGJkLDB4ZGYsMHhkZiwweGZiLDB4ZjMsMHhmMywweGYwLDB4ZjAsMHhhZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjgsMHgzNCwKKzB4MDAsMHgwNiwweDYxLDB4MDAsMHgxOCwweDAxLDB4YTAsMHgwNSwweDE3LDB4MDAsMHgyMCwweDA1LDB4MjgsMHgyMCwweDAwLDB4MDAsCisweDA1LDB4MDAsMHg0MSwweDAwLDB4MDAsMHg0MCwweDAwLDB4MDksMHgwMCwweDAxLDB4MjAsMHg4NiwweDgyLDB4MDgsMHg0MCwweDAzLAorMHg4MCwweDMwLDB4NzAsMHgwOCwweDE0LDB4MDIsMHhjMSwweGYwLDB4Y2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGJkLDB4ZWYsMHhmYiwweGZmLDB4ZmYsMHhmYiwweDljLDB4N2YsMHhlZiwweGRmLDB4ZmYsMHhiZiwweGViLDB4ZGUsCisweGZmLDB4YzEsMHg3ZiwweGZmLDB4ZmIsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweDVmLDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHhiZiwweGVmLAorMHgzZiwweGY3LDB4OGYsMHhlZiwweDdmLDB4ZmYsMHhmMCwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHgzZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhiZCwKKzB4ZGYsMHhlZiwweDdkLDB4NmQsMHgyYiwweDVhLDB4NWQsMHhkMiwweGRmLDB4ZjYsMHg5MiwweGI2LDB4YjIsMHhiMywweGFjLDB4YTEsCisweGZiLDB4ZGYsMHhmZSwweGYxLDB4ZWUsMHhmNSwweGY2LDB4YmMsMHg2YiwweGJkLDB4N2QsMHhhZiwweDFhLDB4ZWYsMHg1ZiwweDZiLAorMHhjNiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4NWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZGIsMHhmZiwKKzB4ZjYsMHhmZiwweGY2LDB4YjcsMHhmZCwweGFkLDB4ZmQsMHhiZiwweGYzLDB4NmYsMHhmZiwweDZmLDB4ZmYsMHhkYiwweGQxLDB4ZmQsCisweGJmLDB4ZmYsMHg2ZiwweGY1LDB4NmIsMHhiYywweDViLDB4M2MsMHhkYSwweGVmLDB4MTYsMHhhZiwweDE2LDB4ZmYsMHhjZCwweGFiLAorMHhmZiwweDZmLDB4ZmYsMHhkMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmYywweGJmLDB4ZmYsMHhmZiwKKzB4ZmYsMHg2YywweDAzLDB4MTAsMHhjMSwweGYzLDB4ZmYsMHhmMywweDNhLDB4ZjMsMHhjYSwweGZmLDB4YWYsMHhmMSwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhkOSwweDk2LDB4YTYsMHg2NSwweGE2LDB4NjYsMHg2YSwweDk1LDB4NjksMHg2OSwweDZhLDB4NWEsMHg1YSwweGZmLAorMHhmZiwweDVmLDB4ZjAsMHgxZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhiZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZWEsMHgwZiwweDUwLDB4YzMsMHhmMywweDdmLDB4ZmYsMHhmMywweGYzLDB4YzMsMHhmZiwweGFmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZDksMHg5NiwweGE2LDB4NjUsMHhhNiwweDY2LDB4NmEsMHg5NSwweDY5LDB4NjksMHg2YSwweDVhLDB4NWEsMHhmZiwweGZmLAorMHhmZiwweGYwLDB4M2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZDcsMHhmZiwweGZmLDB4NWYsMHhjMSwKKzB4M2YsMHhmNywweDVlLDB4ZjUsMHhjZSwweDllLDB4NWYsMHgzZiwweDE3LDB4ZmYsMHhmMywweGUxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGQ4LDB4ZmYsMHhmYSwweGZlLDB4NjcsMHhmZiwweGZlLDB4YmYsMHg1YSwweGZmLDB4ZmYsMHhhZiwweGY1LDB4ZmYsMHhmZiwweGZmLAorMHhmMCwweDJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmNSwweGZmLDB4ZmYsMHhmZCwweGZmLDB4ZjcsMHhmZiwweGZkLDB4NGUsMHgzZCwKKzB4M2YsMHhlNywweDBiLDB4YmYsMHg4ZiwweGY5LDB4ZmYsMHhlYiwweGUzLDB4ZmYsMHhlMSwweGZmLDB4ZmYsMHhmYywweGZmLDB4YzcsCisweDlmLDB4ZmYsMHgzZSwweDM5LDB4ZTUsMHhmZiwweGNmLDB4OWIsMHhmOSwweGZmLDB4ZmYsMHhjNSwweGZmLDB4ZmYsMHhmYSwweGYwLAorMHg1ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjMsMHhjMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4NjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgyMCwweDAwLDB4MjAsCisweDAwLDB4MDEsMHgxMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHhmMCwweDRmLAorMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZkLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhiZiwKKzB4M2YsMHhmZiwweGZmLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmYiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmNywweGZmLDB4ZjcsCisweGZmLDB4ZWQsMHhmZiwweGZiLDB4ZmUsMHhmZiwweDdmLDB4ZmYsMHg3ZiwweGRmLDB4ZmYsMHhmZiwweGRkLDB4ZjAsMHgzZiwweGZmLAorMHhmZiwweGZmLDB4ZmUsMHhmMCwweGZmLDB4ZmYsMHhmMywweGZmLDB4ZjcsMHhmZiwweGZlLDB4NWYsMHhmZiwweGY3LDB4ZmYsMHhmZiwKKzB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmNywweGZlLDB4N2IsMHhmMSwweGZmLDB4ZmQsMHhmZCwweGZmLDB4ZGYsMHhkZiwweGZmLDB4N2QsCisweDczLDB4ZjksMHhmZiwweGMzLDB4N2UsMHhmZSwweGZmLDB4ZWYsMHhkNywweGZmLDB4Y2YsMHhkMCwweGYwLDB4NmYsMHhmZiwweGZmLAorMHhmZiwweGZlLDB4ZjgsMHgzMCwweDAwLDB4MDAsMHg0MCwweDA0LDB4MDAsMHgwMSwweDQxLDB4MjAsMHgwMCwweDA0LDB4MDAsMHgwMiwKKzB4ZDUsMHgwOSwweDAwLDB4MDIsMHg4MCwweDAyLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwYSwweDA0LDB4MDAsMHgwNywweDAwLDB4MDEsCisweDUwLDB4MDEsMHg4MCwweDAyLDB4NjEsMHg0MCwweDQxLDB4MGMsMHgxNCwweDA4LDB4YzEsMHhmMCwweDlmLDB4ZmYsMHhmZiwweGZmLAorMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhkZiwweGNiLDB4NWYsMHhmZSwweGVmLDB4ZmYsMHhmZSwKKzB4ZmYsMHgzZiwweGZmLDB4N2YsMHhmZCwweGMxLDB4ZmYsMHhmZiwweDdmLDB4ZmYsMHhkZiwweGZkLDB4ZmMsMHhmZCwweGY3LDB4ZWUsCisweGZmLDB4ZmYsMHg0ZSwweGZmLDB4ZGYsMHhjZiwweGRiLDB4ZWIsMHhmZiwweGZmLDB4ZjAsMHgxZiwweGZmLDB4ZmYsMHhmZiwweGZlLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4MmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweDdmLAorMHhmZiwweGZmLDB4ZmYsMHhmZCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZjcsMHhmYiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweDdmLDB4ZmYsMHhmMCwweDFmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhkZCwweGZmLAorMHhmZiwweGZmLDB4YTUsMHhmZiwweDZmLDB4NmIsMHhlOSwweDZmLDB4ZGEsMHhjYSwweGZiLDB4ZGQsMHhlZSwweGY3LDB4ZjYsMHhiMiwKKzB4YjMsMHhhNCwweGExLDB4NWIsMHg1YiwweGY2LDB4ZDcsMHhmNCwweGY3LDB4N2IsMHhiZCwweGJkLDB4YWQsMHhjZiwweGVmLDB4N2YsCisweDZiLDB4N2YsMHgzYiwweGRmLDB4ZGIsMHhmZiwweGZmLDB4MzAsMHhjZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4YmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmNiwweGZlLDB4OTYsMHhmZiwweGZkLDB4YjUsMHhmZCwweGJmLDB4YWQsMHg3ZiwweGZmLDB4NmYsMHhmZiwKKzB4ZGUsMHhkMSwweGFkLDB4YWQsMHhlOSwweGZmLDB4ZjEsMHhlYywweGVmLDB4ZGUsMHgzZiwweGNiLDB4ZmYsMHhmNiwweGZmLDB4MzIsCisweGZmLDB4YzUsMHhiZCwweGZmLDB4ZmYsMHhmZiwweGQwLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZlLDB4ZmIsMHhmZiwweGY0LAorMHgyOCwweGJmLDB4ZmYsMHhmZCwweGZiLDB4ZDMsMHhmZiwweGZmLDB4NDIsMHhmZiwweGZmLDB4ZmYsMHhlYSwweGIzLDB4ZmMsMHhjMywKKzB4YzEsMHhmZiwweDMzLDB4ZmYsMHhjMCwweDE1LDB4NmIsMHg3MCwweGZmLDB4ZjAsMHhmMiwweDRmLDB4ZmYsMHhmYywweDNlLDB4OTcsCisweDNjLDB4ZmYsMHhmZiwweGZkLDB4ZWYsMHhmMCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZSwweDc4LAorMHhiZiwweGZmLDB4ZmQsMHhmMywweGVmLDB4NTUsMHhmZiwweDdlLDB4ZmYsMHhmZiwweGZmLDB4ZWEsMHhiMywweGZjLDB4YzMsMHhjMSwKKzB4ZmYsMHgzMywweGZmLDB4YzAsMHgxNSwweDZmLDB4ZmYsMHgwZiwweGYwLDB4ZjAsMHgwZiwweGZmLDB4ZmMsMHgzZCwweDZiLDB4YzMsCisweGZmLDB4ZmYsMHhmZSwweGY3LDB4ZjAsMHhjZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmYywweGZmLAorMHhmZiwweDIzLDB4ZjgsMHg3ZiwweGZmLDB4NGUsMHhmZiwweGZmLDB4ZmYsMHhmYiwweGY5LDB4MTcsMHhmZiwweGY2LDB4ZjEsMHhmZiwKKzB4Y2YsMHhlZiwweGZmLDB4ZmYsMHgxMywweGRmLDB4ZTYsMHgyZiwweGM3LDB4ZmYsMHhmZiwweGU3LDB4YzEsMHhmZCwweGZmLDB4ZmUsCisweGZmLDB4ZmYsMHhmZiwweGYwLDB4NGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY1LDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhhZSwweGZmLAorMHhmZiwweDdmLDB4M2IsMHgzZiwweGZjLDB4N2YsMHhmYywweGVmLDB4ZmYsMHhmYywweGUyLDB4N2IsMHhmZiwweGYxLDB4ZmQsMHhlZCwKKzB4ZWYsMHhmZiwweGZmLDB4MzUsMHg3MywweGZmLDB4ZmYsMHhmZSwweGZhLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhiZiwweGZmLDB4ZmYsCisweGZmLDB4ZmEsMHhmMCwweDhmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMSwweGMwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDQsMHgwMSwweDQwLDB4NDAsMHgwMCwKKzB4MDAsMHgzMCwweDI4LDB4MDQsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDM4LDB4ZjAsMHgwZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmQsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmIsMHhmZiwweDdmLAorMHhmZiwweGZmLDB4OWYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGRmLDB4ZGYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZWQsMHhmZiwweGZkLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGJmLDB4YmYsMHhmZiwweGZmLDB4YzMsCisweGYwLDB4M2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYwLDB4YmYsMHhmZCwweGZmLDB4YmYsMHhmZiwweGZmLDB4ZmQsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZCwweDdiLDB4ZmYsMHg3ZiwweGZmLDB4YmQsMHhmZiwweGYxLDB4ZWYsMHhmZiwweGZmLDB4ZmQsMHhkZiwKKzB4ZmQsMHhmYiwweGZmLDB4ZmYsMHhiZiwweGJlLDB4ZmYsMHhjZCwweDdmLDB4ZmMsMHhmNywweGY3LDB4NmYsMHhiZiwweGQ4LDB4ZjAsCisweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmOCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4YTAsMHgwMCwweDAwLAorMHhjMCwweDAwLDB4MDAsMHgyMCwweDM0LDB4MDAsMHgwMCwweDAwLDB4MGMsMHg4MSwweDAwLDB4MjAsMHhhNCwweDIwLDB4MDAsMHgxMCwKKzB4MDgsMHgwNCwweDQ4LDB4MDgsMHgwMCwweDQwLDB4OTMsMHgwMCwweDEwLDB4MDAsMHgzOCwweDE4LDB4MjAsMHhjMSwweGYwLDB4M2YsCisweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmYiwweGZmLDB4ZmYsMHhiOSwweGRmLDB4ZmUsMHhiMywweGZmLDB4ZmYsMHhlNywweGZkLAorMHhmZiwweGZmLDB4M2IsMHhmZiwweDdmLDB4ZmYsMHhiZiwweGZmLDB4YzEsMHhmZiwweGZjLDB4ZmYsMHhmZiwweDNmLDB4NzcsMHhmZSwKKzB4ZmUsMHhjZiwweGZmLDB4YmYsMHhmZCwweGJmLDB4ZmYsMHhmZSwweGVkLDB4ZjIsMHhmZCwweGY3LDB4ZmYsMHhmMCwweDJmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhiZiwweGZmLDB4ZmYsCisweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmMywweGFkLDB4Y2YsMHhlZiwweDcwLDB4YzksMHg3MywweDNiLDB4ZGYsMHg1YiwweDRhLAorMHhmNiwweGI3LDB4ZmUsMHhkNywweGY1LDB4YmMsMHhjMSwweDMzLDB4Y2EsMHhkNiwweGI3LDB4NmUsMHhmNywweGZiLDB4YmQsMHhjNSwKKzB4MjQsMHhjZiwweDZmLDB4MmYsMHg0ZCwweDJiLDB4YmEsMHg1YSwweGZmLDB4ZmYsMHhmZiwweGYwLDB4YWYsMHhmZiwweGZmLDB4ZmYsCisweGZlLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGY2LDB4ZjYsMHhkNywweGZmLDB4ZmYsMHhhZCwweGJkLDB4ZmYsMHhmZiwweGZmLAorMHhlZiwweGY3LDB4N2YsMHhmYywweDViLDB4YjEsMHhmZCwweGJkLDB4NzUsMHg2ZiwweGVmLDB4NmEsMHhmZCwweDViLDB4ZmIsMHhkYiwKKzB4M2EsMHhiZiwweDhlLDB4OWYsMHhmZiwweGJmLDB4ZmQsMHhmZiwweDZmLDB4ZmYsMHhkMCwweDZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsCisweGZmLDB4YmIsMHhmZiwweGYwLDB4M2YsMHhmZiwweGZmLDB4ZmQsMHhmYiwweDdmLDB4ZGUsMHhmZiwweGZmLDB4NWEsMHhkNiwweGJmLAorMHhkOCwweDJhLDB4YmYsMHhiZiwweGYxLDB4ZTUsMHhmZiwweGNjLDB4YzAsMHhhOSwweDcwLDB4ZmYsMHhmMywweDNjLDB4M2MsMHhmZCwKKzB4NTcsMHhmZCwweDk4LDB4MDMsMHgwMCwweGMzLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhhZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweDNkLDB4YmYsMHhmZiwweGZkLDB4ZmIsMHhmZiwweGRiLDB4ZmYsMHhmZiwweDBmLDB4ZmMsMHgzZiwweGQ4LAorMHgyYSwweGJmLDB4YmYsMHhmMSwweGVmLDB4ZmYsMHhjYywweGMwLDB4OTYsMHhiZSwweGZmLDB4ZjMsMHgzZiwweGZmLDB4ZmQsMHg1NywKKzB4ZmQsMHg5OSwweDBmLDB4ZmYsMHhjMywweGZmLDB4ZmYsMHhmZiwweGYwLDB4NGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsCisweGZmLDB4ZjEsMHhlNywweGZmLDB4ZmYsMHhmMywweDhlLDB4N2IsMHhmZiwweGE4LDB4ZmYsMHhkZiwweDdmLDB4OGUsMHg3OCwweDczLAorMHhmZiwweGYxLDB4NTEsMHg2MiwweGZmLDB4ZmMsMHg0YiwweGZmLDB4ZjMsMHhmZiwweDdlLDB4Y2YsMHhmOSwweGZmLDB4ZmQsMHhmZiwKKzB4ZmYsMHg3ZiwweGZmLDB4ZTAsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDRmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmNSwweGZmLDB4ZmYsCisweGZiLDB4ZmQsMHhhZSwweGZmLDB4ZmMsMHhmZSwweDZmLDB4M2YsMHhmOCwweGZkLDB4NzcsMHhhZiwweGZlLDB4MzcsMHhmZSwweDdiLAorMHhmZiwweGIxLDB4OGMsMHhmZiwweGVmLDB4ZmQsMHhmOCwweGU3LDB4YmYsMHhmZiwweGYxLDB4ZmUsMHgzZSwweGY3LDB4ZmUsMHg5NSwKKzB4M2UsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZhLDB4ZjAsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjEsMHhjMCwweDAwLDB4MDAsCisweDAxLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDgwLDB4MDIsMHgwMCwweDAwLDB4MTAsMHgwMCwweDEwLDB4MDAsMHgxMCwweDA4LAorMHg0MSwweDgwLDB4MTAsMHgwMCwweDAwLDB4MDgsMHgxMCwweDg0LDB4MDAsMHgwYywweDA0LDB4MDIsMHg2MSwweDAwLDB4MDAsMHg4MSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzZCwweGYwLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZkLDB4YmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHg3ZiwweGZmLDB4ZmUsMHhmZCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLAorMHg3ZiwweGJmLDB4ZjcsMHg3ZiwweGVmLDB4ZmYsMHhlZiwweGZmLDB4ZjcsMHhmZCwweGZmLDB4ZmYsMHhmZCwweDdmLDB4ZmYsMHhiZSwKKzB4ZGYsMHhmZiwweGZmLDB4ZDksMHhmMCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMCwweGJiLDB4ZmYsMHg3ZiwweGZiLDB4ZmYsCisweGZiLDB4ZmYsMHhiZiwweGZmLDB4ZjMsMHg3ZiwweGZiLDB4ZmQsMHhlYiwweDdmLDB4ZGYsMHhmYSwweGZmLDB4ZGUsMHhmMCwweGVkLAorMHhmZiwweGIxLDB4ZjcsMHhmOSwweDFmLDB4YjUsMHg1YiwweGZlLDB4N2UsMHhmNywweGJlLDB4ZmQsMHg3ZiwweDVmLDB4YjUsMHhmNywKKzB4ZmYsMHhmZiwweGQwLDB4ZjAsMHg0ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjgsMHgzMCwweDAxLDB4MDAsMHgwNywweDQyLDB4MDEsCisweDAwLDB4NmEsMHgxOCwweDUwLDB4ODAsMHgwMCwweDAwLDB4MDIsMHg0MCwweDAxLDB4MDEsMHgyMCwweDAxLDB4MDEsMHgyNCwweDE0LAorMHgyMSwweDEwLDB4MDIsMHgwOCwweDA3LDB4MDgsMHgwMCwweDQwLDB4MTAsMHg4MCwweDU4LDB4MDAsMHg4NCwweDgwLDB4MTgsMHgxMCwKKzB4NDAsMHhjMSwweGYwLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGY3LDB4ZmYsMHhkYiwweGI3LDB4ZjMsCisweGRmLDB4N2MsMHhmOCwweDc0LDB4ZmYsMHhmZiwweDZmLDB4N2QsMHgzZiwweDdlLDB4ZWMsMHg3ZiwweGMxLDB4ZjUsMHhmZiwweGNmLAorMHg2ZiwweDlmLDB4ZjksMHhkZiwweGJlLDB4ZTUsMHhlNywweGZmLDB4ZDcsMHhmMywweGRkLDB4ZmIsMHhmZiwweGZjLDB4ZmYsMHhiZiwKKzB4ZmYsMHhmMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZjAsMHgyZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZDcsMHhmZiwweGZmLDB4ZmYsMHhiNCwweGNmLDB4ZWYsMHg3NywweDZmLDB4NzMsCisweDNhLDB4NGEsMHgzYSwweGNiLDB4ZDQsMHhmNywweDJlLDB4ZDYsMHhiZCwweGJkLDB4YTEsMHgzYiwweGRmLDB4ZDYsMHhmNywweGVlLAorMHhkMywweDM1LDB4YmQsMHhmYiwweGJkLDB4Y2UsMHhlYiwweDJiLDB4NGQsMHgyZiwweGJiLDB4ZGEsMHhmZiwweGZmLDB4ZmUsMHhiMCwKKzB4NWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHg1ZiwweDM2LDB4YWYsMHgzZiwweGVkLDB4YjcsCisweGY1LDB4ZmQsMHhmMywweDJiLDB4ZWYsMHg3NywweGZmLDB4ZmIsMHhkYSwweGIxLDB4YmQsMHhhMywweDc3LDB4NjksMHg3ZiwweDRmLAorMHhmZiwweGRiLDB4ZmEsMHg1YiwweGZmLDB4ZjIsMHhmZSwweGZmLDB4OTYsMHhmZiwweGZmLDB4ZmUsMHhkZiwweGZmLDB4ZDAsMHhhZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZCwweDhmLDB4ZmQsMHg0MCwweDZmLDB4OWUsMHg4MywweDVhLDB4MGYsCisweGZhLDB4YzMsMHhmZiwweGZmLDB4ZmMsMHhlOSwweDdmLDB4ZjMsMHgwMSwweGQwLDB4MDAsMHhmZSwweGJmLDB4Y2QsMHgzZiwweGYwLAorMHhlZiwweGZjLDB4YzUsMHgwYywweDNmLDB4ZmQsMHg2OCwweDBiLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhkZiwweGYwLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhiYiwweGZmLDB4ZmQsMHg4NSwweGZmLDB4ZDQsMHg2ZiwweDlmLDB4YzMsMHg1YSwweDBmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZjLDB4ZTksMHg3ZiwweGYzLDB4MDEsMHhmMCwweGZiLDB4YzIsMHhiZiwweGZjLDB4MDAsMHgzNywweGVmLAorMHhmYywweGNkLDB4YmMsMHgzZiwweGZmLDB4MGMsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDVmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZDksMHhmNywweGQxLDB4YjcsMHg3ZSwweDdmLDB4ZjEsMHhlNCwweGZkLDB4ZmYsCisweGZiLDB4ZmIsMHhmZiwweDVmLDB4ZmYsMHg3ZiwweGIxLDB4YmMsMHgwZiwweDY3LDB4ZWIsMHhiOCwweDNmLDB4ZmYsMHhlMiwweGZmLAorMHhlOSwweGZmLDB4ZmQsMHhlMywweGZmLDB4M2YsMHg5ZiwweGMyLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHg5ZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmUsMHhmNSwweDdmLDB4ZmYsMHhmMCwweDNmLDB4YmMsMHhmZiwweGQ1LDB4ZjUsMHhjZSwweDNmLDB4ZmUsMHhmZiwweGZlLDB4NmQsCisweGZmLDB4ZjEsMHhiZiwweDdiLDB4ZmYsMHhmMSwweGZkLDB4ZmYsMHg0ZiwweGZmLDB4ODcsMHhmZiwweGFlLDB4ZmYsMHhiMSwweGY4LAorMHhmZSwweGZmLDB4ZmYsMHg3OCwweDAxLDB4YjksMHhmZiwweGZmLDB4ZmYsMHhmYSwweGYwLDB4MmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwKKzB4ZjMsMHhjMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDIsMHgxMywweDAyLDB4MDAsMHg4MCwweDQwLDB4MDAsMHg5MCwweDEwLDB4MDAsCisweDEwLDB4MDAsMHgwMiwweDAwLDB4MDEsMHgyMCwweDgwLDB4MTIsMHgxMCwweDAwLDB4NDAsMHgwOCwweDAwLDB4MDQsMHgwMCwweDAwLAorMHgwMiwweDAwLDB4MDEsMHg0MCwweDAwLDB4ODAsMHgwMCwweDAwLDB4M2MsMHhmMCwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZCwKKzB4MWYsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhmZiwweDdmLDB4ZjcsMHhkZiwweGY3LDB4ZmYsCisweGY3LDB4ZmIsMHhlYiwweGQxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGY3LDB4ZmYsMHhmZiwweGZiLDB4ZmYsMHhmZSwweGZmLAorMHhmZiwweDdlLDB4ZmYsMHhmYiwweGZmLDB4ZmYsMHhmZiwweGRiLDB4ZjAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjAsMHhmZiwKKzB4ZmYsMHhiNywweGViLDB4ZjcsMHhkZiwweGZmLDB4ZmUsMHhmNSwweDZiLDB4ZTcsMHhlZCwweGY3LDB4M2UsMHhlYywweGZmLDB4NTQsCisweGVmLDB4NmYsMHhmMSwweGY1LDB4YWYsMHg2ZiwweGY2LDB4ZmQsMHhmZiwweGRkLDB4N2IsMHhmZiwweGVmLDB4YmYsMHg3ZiwweGZmLAorMHhmZiwweGY3LDB4ZmYsMHhmMywweDVmLDB4ZjcsMHhkMCwweGYwLDB4Y2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY4LDB4MzAsMHgwMCwKKzB4ODAsMHg0MCwweDA0LDB4MDAsMHg4MSwweDJjLDB4MDQsMHgyNCwweDAwLDB4MDIsMHgwMSwweGM4LDB4MDIsMHgwMCwweDAyLDB4MjQsCisweDAwLDB4MDEsMHhiNCwweDQyLDB4ZGMsMHg0NCwweDAyLDB4MTUsMHg5MCwweDAyLDB4MDMsMHg0OCwweDM5LDB4MTAsMHgwMiwweDI0LAorMHhhMCwweGJhLDB4MDAsMHgwMCwweDQwLDB4YzEsMHhmMCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmUsMHhmYywweGY3LDB4ZjAsMHhlZSwweGI2LDB4NWQsMHhmZCwweGY1LDB4ZmYsMHhkYiwweGY3LDB4N2YsMHg3ZiwweGJlLDB4ZmYsCisweGMxLDB4ZmUsMHhiZiwweGZhLDB4ZmEsMHg1ZiwweGZmLDB4YWQsMHhmZiwweGVmLDB4ZmYsMHg3ZiwweGRmLDB4N2YsMHhmZSwweGJmLAorMHhiNywweDk0LDB4YmYsMHhmZiwweGZmLDB4ZjAsMHg5ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4OGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGQ3LDB4ZmYsMHhmZiwweGZiLDB4YjUsMHhmZiwKKzB4ZWYsMHg3YywweGViLDB4MmIsMHg1MiwweDViLDB4M2IsMHhkYSwweGQ0LDB4ZjMsMHgzNiwweDk2LDB4YjUsMHhiZCwweGYxLDB4ZmIsCisweGRhLDB4ZWUsMHhmNiwweGZlLDB4ZDMsMHgzNSwweGJkLDB4ZGYsMHhhZCwweGNmLDB4ZWYsMHg3ZSwweGNkLDB4NmIsMHhiYiwweGRmLAorMHhmZiwweGZmLDB4ZmQsMHhiMCwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGQzLDB4NWYsMHhmNiwKKzB4ZmYsMHhmNiwweGZmLDB4ZmQsMHhhZCwweGZkLDB4ZmYsMHg3ZiwweGVmLDB4ZmYsMHg2ZiwweDdmLDB4ZGIsMHhmMSwweGE1LDB4YTMsCisweDdmLDB4NmYsMHg2YiwweDRmLDB4ZmYsMHhkYiwweGZiLDB4Y2IsMHhmZiwweGY2LDB4ZmYsMHhmNCwweGQ3LDB4ZmQsMHhiZiwweGZlLAorMHhkZiwweGZmLDB4ZDAsMHhjZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZjcsMHhkZiwweGZmLDB4ZmYsMHhmZiwKKzB4M2YsMHg3ZiwweGZjLDB4ZTUsMHhmZiwweDIwLDB4ZmUsMHhmZiwweGZmLDB4ZGYsMHg3ZiwweGZmLDB4ZjEsMHg3ZiwweGZmLDB4ZmUsCisweGZmLDB4ZjAsMHg3YywweDNkLDB4NGYsMHhmMywweGMzLDB4M2YsMHhmZiwweGZmLDB4NmYsMHhjMywweGZmLDB4MGYsMHhmZiwweGZmLAorMHhhZiwweGYwLDB4MmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmYiwweGI3LDB4ZTAsMHgwZiwweGZmLDB4ZmYsMHgyYiwKKzB4ZmYsMHg3ZCwweGJmLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmOCwweDlmLDB4N2YsMHhmZiwweGYxLDB4NTUsMHhmZiwweGZmLDB4ZmYsCisweGZkLDB4N2MsMHgzYywweGZmLDB4ZjMsMHhjMywweDNmLDB4ZmYsMHhmZiwweGVmLDB4YzMsMHhmZiwweGRmLDB4ZmYsMHhmZiwweGZmLAorMHhmMCwweDlmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGVmLDB4ZmYsMHhmZiwweDlmLDB4YmYsMHg3ZiwKKzB4ZjksMHgxOSwweDQ3LDB4OGUsMHhlNywweDlmLDB4M2YsMHgxNywweGZmLDB4ZmMsMHg4MSwweGMxLDB4N2UsMHhmMywweGQ5LDB4ZjksCisweDczLDB4ZGYsMHhmNCwweDdmLDB4ZmEsMHhmZiwweGZmLDB4ZmYsMHhmYiwweDdmLDB4NzcsMHhjNywweGZmLDB4ZmYsMHhmZiwweGYwLAorMHgyZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjUsMHhmNywweGZmLDB4ZmIsMHhmZiwweGY3LDB4M2YsMHhmYywweGJmLDB4M2UsMHgzZiwKKzB4ZWMsMHhmZiwweDgxLDB4YWYsMHhmZSwweDRmLDB4ZjMsMHhiYiwweGZmLDB4ZjAsMHg3ZSwweGZmLDB4NmYsMHhmZiwweDg3LDB4ZmYsCisweGJiLDB4ZmYsMHhkNSwweGZjLDB4ZmYsMHg3ZiwweGZjLDB4NmYsMHhmZiwweGVmLDB4ZTcsMHhmZiwweGZmLDB4ZmEsMHhmMCwweDNmLAorMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYzLDB4YzAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwKKzB4MDAsMHgzMCwweDEwLDB4NjAsMHgyMCwweDAwLDB4MDgsMHgwMCwweDAxLDB4MjAsMHg4MCwweDAwLDB4MTAsMHgwMCwweDA0LDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4ODAsMHg0MCwweDAwLDB4MDgsMHgyMCwweDNjLDB4ZjAsMHg2ZiwweGZmLAorMHhmZiwweGZmLDB4ZmUsMHhmNSwweGJmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweGZlLDB4M2YsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGZmLDB4ZmYsMHhmMSwweGRmLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweGRmLDB4ZmYsCisweGZkLDB4YmQsMHhmZiwweGZmLDB4ZmYsMHhmYiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHg1YiwweGYwLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZlLDB4ZjAsMHhiZiwweGJmLDB4YmYsMHhmZiwweGY3LDB4ZmIsMHhmZiwweGZlLDB4ZWUsMHhmYSwweGZmLDB4ZmYsMHhmZiwKKzB4M2QsMHgzYiwweGZmLDB4ZmYsMHhmZSwweGZiLDB4ZjEsMHhmZiwweGJmLDB4N2IsMHhmZiwweGZmLDB4ZWYsMHhmZiwweGJmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGY3LDB4ZWYsMHhmZiwweGZiLDB4ZDAsMHhmMCwweGRmLDB4ZmYsMHhmZiwweGZmLAorMHhmZSwweGY4LDB4MzAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MGIsMHgxMCwweDA1LDB4MDEsMHgwMCwweDA4LDB4MDAsMHgwMiwKKzB4MDEsMHgwMSwweDAwLDB4MDAsMHgxMCwweDAxLDB4YzgsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDIsMHgwMiwweDAwLDB4MDAsCisweDAwLDB4ODAsMHgwMiwweDAwLDB4MDAsMHg0MCwweDI0LDB4ODAsMHgwMCwweGMxLDB4ZjAsMHgzZiwweGZmLDB4ZmYsMHhmZiwweGZlLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGY3LDB4ZmQsMHhmNywweGZhLDB4ZWYsMHhlZSwweGY5LDB4ZmQsMHhmZiwweGY3LDB4ZmUsMHhiZiwKKzB4MWYsMHhmZCwweDllLDB4ZmQsMHhkMSwweGVmLDB4ZmYsMHhmNywweDdmLDB4OWYsMHhmZiwweGVmLDB4ZmYsMHhmNiwweGZmLDB4ZmUsCisweGZlLDB4N2IsMHhmZiwweGJkLDB4ZmYsMHg3ZSwweGZmLDB4ZmYsMHhmZiwweGYwLDB4M2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGFmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLAorMHhmZiwweGY3LDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmQsMHhmZiwweGZmLDB4ZGYsMHhmZiwKKzB4ZmYsMHg1ZiwweGYxLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhlZiwweGZmLAorMHhmNywweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgzZiwweGZiLDB4ZmYsMHhmZiwweGVmLDB4ZmIsMHhmZCwKKzB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmYiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4MmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY3LDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZkLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhmZiwweGZmLDB4ZTcsMHhmZiwKKzB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGNmLDB4ZmYsMHhmYiwweGZmLDB4ZmIsMHhmMSwKKzB4ZmYsMHhmZiwweGZiLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHgyZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4N2IsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweGZmLDB4ZjEsMHhmZiwKKzB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGYwLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGVmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4NTcsMHhmZiwweGZlLDB4YmYsMHhmYiwweGYxLDB4ZmYsMHhmZiwKKzB4ZmQsMHhmNywweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGQ3LDB4ZmYsMHhmMCwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmNywweGRiLDB4ZmYsMHhkYiwweGZkLAorMHhmNiwweGZmLDB4ZjYsMHhmZiwweDNjLDB4YmMsMHhiYywweGJmLDB4ZGYsMHg2ZiwweGVmLDB4MmYsMHhmMSwweDNjLDB4YmYsMHhiYywKKzB4YmYsMHhkZiwweDZmLDB4ZmYsMHg2ZiwweGY3LDB4ZGIsMHhmZiwweGRiLDB4ZmQsMHhmNiwweGZmLDB4ZjYsMHhmZiwweGZmLDB4ZmYsCisweDAxLDB4ZTIsMHhlZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby95YW05NjAwLmggYi9kcml2ZXJzL25ldC9oYW1yYWRpby95YW05NjAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVkMWZlNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3lhbTk2MDAuaApAQCAtMCwwICsxLDM0MyBAQAorLyoKKyAqCisgKiBGaWxlIHlhbTExMS5tY3MgY29udmVydGVkIHRvIGggZm9ybWF0IGJ5IG1jczJoCisgKgorICogKEMpIEY2RkJCIDE5OTgKKyAqCisgKiBUdWUgQXVnIDI1IDIwOjIzOjAzIDE5OTgKKyAqCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYml0c185NjAwW109IHsKKzB4ZmYsMHhmMiwweDAwLDB4YTUsMHhhZCwweGZmLDB4ZmUsMHg5ZiwweGZmLDB4ZWYsMHhmYiwweGNiLDB4ZmYsMHhkYiwweGZlLDB4ZjIsCisweGZmLDB4ZjYsMHhmZiwweDljLDB4YmYsMHhmZCwweGJmLDB4ZWYsMHgyZSwweDNmLDB4NmYsMHhmMSwweGZkLDB4YjQsMHhmZCwweGJmLAorMHhmZiwweDZmLDB4ZmYsMHg2ZiwweGZmLDB4MGIsMHhmZiwweGRiLDB4ZmYsMHhmMiwweGZmLDB4ZjYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZjAsMHg2ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZCwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZjcsMHhmZiwweGZmLDB4ZmYsCisweGZiLDB4ZmYsMHhmZiwweGY3LDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweDdmLDB4ZjEsMHhmZiwweGZlLDB4ZmYsMHhiZiwweGJmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjcsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmMCwKKzB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZjcsCisweGZmLDB4ZmYsMHhmNywweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4N2UsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZkLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhkZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhlZiwweGZmLDB4ZjMsMHhmYiwweGZlLDB4ZmYsMHhmMSwweGZmLDB4ZmQsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHhmZiwweGYwLDB4N2YsMHhmZiwKKzB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGY3LDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDBmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDdmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGY1LAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHgyZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmYiwweGZmLDB4ZmYsMHhmZiwweGVmLDB4ZmYsMHg3ZiwweGZmLDB4ZWYsCisweGZmLDB4ZWYsMHhmZiwweDdmLDB4ZWYsMHhmMSwweGZmLDB4ZWYsMHhmZiwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4OWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4YmQsMHhmZiwweGVmLDB4N2YsMHhlZiwweDdmLDB4ZmIsMHhkZiwweGQzLDB4NWEsMHhmZSwweGQ3LDB4ZDYsCisweGY3LDB4N2YsMHhiZCwweGYxLDB4YmIsMHg1ZCwweGQ2LDB4ZjcsMHhmZSwweDk2LDB4ZmYsMHhiZCwweGFmLDB4YWQsMHhiZiwweGVmLAorMHg3ZiwweDZiLDB4N2YsMHhmYiwweGQ2LDB4ZmUsMHhmNywweGZmLDB4MTAsMHhlZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4YmUsMHhlZiwKKzB4ZmYsMHhmZiwweGRiLDB4ZmYsMHhmNiwweGZmLDB4ZjYsMHhmZiwweGZkLDB4YmYsMHhmZCwweGJmLDB4ZmYsMHg3ZiwweGZmLDB4N2YsCisweGRmLDB4ZGIsMHhmMSwweGZkLDB4MzUsMHhmZiwweDZmLDB4ZmYsMHg2ZiwweGZmLDB4ZGIsMHhmZiwweGNiLDB4ZmYsMHhmNiwweGZmLAorMHhmMiwweGZkLDB4ZmQsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGQwLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHg1NSwweGZmLDB4Y2MsMHhjMCwweDNmLDB4ZmYsCisweGZmLDB4ZjEsMHgyNCwweGYwLDB4ZmYsMHhmZiwweGNmLDB4ZWYsMHgzZiwweGZmLDB4ZjAsMHhmZiwweGZmLDB4ZmYsMHhmYywweDNmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4NTUsMHhmZiwweGNjLDB4YzAsMHgzZiwweGZmLDB4ZmYsCisweGYxLDB4MDAsMHhmMCwweGZmLDB4ZmYsMHhjZiwweGRmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmMsMHgzZiwweGZmLAorMHhmZiwweGZmLDB4N2QsMHhmZiwweGZmLDB4ZjAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmUsMHg3ZiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsCisweGZmLDB4Y2YsMHhmZiwweGYzLDB4ZmYsMHg5NywweGZmLDB4ZmYsMHg4ZiwweGU3LDB4ZmYsMHhmZiwweGZjLDB4NzEsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY1LDB4ZmYsMHhiZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZTMsMHhmNywweGVmLDB4ZmYsMHhmZiwweGZjLDB4N2IsMHhmZiwweGYxLDB4M2YsCisweGZmLDB4ZWYsMHhmZiwweGNmLDB4ZTMsMHhlMywweGZmLDB4ZmYsMHhmZiwweGZmLDB4M2YsMHhmZiwweGZmLDB4ZmYsMHhiZiwweGZmLAorMHhiZiwweGZmLDB4ZGEsMHhmMCwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMiwweGMwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMSwweDNjLDB4ZjAsMHhhZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmQsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRiLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweDlmLDB4ZmYsCisweGZmLDB4ZmYsMHhmNywweGZmLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhkYiwweGYwLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYwLDB4YmIsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGZiLDB4ZGYsMHhiZiwweGYxLDB4ZmUsMHhmZCwweGY3LDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4NzcsMHhmZCwweGYyLAorMHhmMCwweDFmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmOCwweDM4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywKKzB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDkwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMSwweDAwLDB4MDAsMHgwNCwweDI0LDB4MDAsCisweDQwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDEsMHhjMCwweGYwLAorMHg0ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGJmLDB4ZmYsMHhmZiwweDZmLDB4ZmYsMHhkZiwweGZmLDB4ZDEsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZmIsMHhmZiwweGZiLDB4ZWYsMHhmZiwweGZmLDB4ZWUsMHhmZiwweGZmLDB4N2YsMHhmMCwweGRmLAorMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHg4ZiwweGZmLAorMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmNSwweGFkLDB4ZmYsMHg2OSwweDJhLDB4ZWQsMHg2YiwweGZiLDB4ZGYsMHgzYSwKKzB4ZGMsMHhmNCwweDk2LDB4ZWUsMHhiMywweDNkLDB4MzUsMHhjMSwweGJiLDB4ZGQsMHhmZSwweGY2LDB4ZmUsMHhkNiwweGI1LDB4YWQsCisweGJmLDB4YTUsMHhhZCwweDQ5LDB4MmYsMHg0ZiwweDJiLDB4ZGEsMHg1ZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4MmYsMHhmZiwweGZmLAorMHhmZiwweGZlLDB4YmYsMHhmZiwweGZmLDB4ZmIsMHg1YiwweGY3LDB4ZjYsMHhmZiwweGY2LDB4ZmYsMHhmZCwweGJmLDB4ZmQsMHhhNSwKKzB4ZjMsMHg2ZiwweGYzLDB4NmUsMHhmYSwweDdiLDB4ZDEsMHhmZCwweGI1LDB4NzcsMHg2ZiwweGU5LDB4NmYsMHhmZiwweGRiLDB4ZmIsCisweGRiLDB4ZGYsMHhmNiwweGZmLDB4ZjYsMHhmZiwweGZkLDB4M2YsMHhmZSwweGY3LDB4ZmYsMHhkMCwweDRmLDB4ZmYsMHhmZiwweGZmLAorMHhmZSwweGZmLDB4OWYsMHhmZiwweGZmLDB4MGYsMHhmZiwweGMwLDB4M2YsMHg5YywweDAzLDB4ZmYsMHhmZiwweDhiLDB4YTUsMHhmZSwKKzB4ODAsMHgzZSwweGMyLDB4YmYsMHhhYywweGIxLDB4MjQsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgwZiwweGZmLDB4YTMsCisweGZmLDB4ZmQsMHg2YiwweGZmLDB4ZmYsMHhmMCwweGE1LDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhhZiwweGZmLDB4ZmYsMHhmZiwweGZlLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweDBmLDB4ZmYsMHhjMCwweDNmLDB4ZDQsMHg2YiwweGZmLDB4ZmYsMHhkYiwweGZmLDB4ZmUsMHg4NiwKKzB4YmYsMHhjMiwweGJmLDB4MzAsMHhhMSwweDI0LDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhjYywweGZmLDB4MGYsMHhmZiwweGEzLDB4ZmYsCisweDA1LDB4NmIsMHhmZiwweGZmLDB4ZjAsMHhhNSwweGZmLDB4ZmYsMHhmZiwweGYwLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLAorMHhmZiwweGZmLDB4ZmIsMHhjNywweGZmLDB4YzQsMHhmZiwweGZmLDB4N2YsMHhmZiwweGVjLDB4ZmUsMHg3ZiwweGRmLDB4ZDgsMHhiOSwKKzB4NDcsMHhmYywweDM2LDB4YzEsMHhkZiwweGZmLDB4ZmYsMHhmOSwweGZmLDB4ZjMsMHhmZiwweGY3LDB4ZmYsMHhmYywweGZmLDB4ZmQsCisweDNmLDB4ZmYsMHhmZiwweGZmLDB4M2YsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmNSwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHg3ZSwweGJkLDB4M2YsMHhmZiwweDJiLDB4ZmUsMHgyZiwweGY1LDB4YTMsMHhmYywKKzB4NWIsMHhmZSwweDYxLDB4OWYsMHg3ZiwweGVmLDB4ZmYsMHhmZiwweGE3LDB4ZmIsMHhmZiwweGZmLDB4ZmEsMHhmZSwweGZmLDB4MzMsCisweGYxLDB4ZmYsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZhLDB4ZjAsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjEsMHhjMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgwMCwweDMwLDB4MjQsMHgwNCwKKzB4MDAsMHgwMSwweDAwLDB4ODAsMHg0MCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMiwweDAxLDB4MDEsMHgwMCwweDAyLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgzZCwweGYwLDB4MmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZkLDB4YmQsMHhmZiwweGZkLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmIsMHhmZiwweGZmLDB4N2YsMHhmNiwweGVmLDB4YmYsMHhmNywweGZmLDB4NzMsMHhlYiwKKzB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmOSwweGZmLDB4ZmQsMHhmZSwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZDksMHhmMCwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMCwweGJmLDB4N2YsMHhmZiwweGZmLAorMHhmZiwweDdmLDB4ZmYsMHhmZiwweGRlLDB4ZmYsMHhmZiwweGVmLDB4ZGQsMHhkZSwweDc3LDB4ZjIsMHhmYiwweGVkLDB4ZTcsMHhmMSwKKzB4NzMsMHhmZCwweGZkLDB4ZGYsMHhmZiwweDdkLDB4YmUsMHhkZiwweGZmLDB4ZmIsMHhmZiwweGVmLDB4ZmYsMHhlZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGQwLDB4ZjAsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjgsMHgzMCwweDIwLDB4MDIsMHgwMCwweDIyLAorMHg0MCwweGMwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAyLDB4NDEsMHgwMiwweDEyLDB4MDAsMHgyMSwweDg3LDB4ODEsMHgwMCwKKzB4MDAsMHg4MCwweDA0LDB4MGIsMHgyOCwweDAxLDB4YjAsMHgwMCwweDgyLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHhjMSwweGYwLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZCwweGZmLAorMHhmNywweGZmLDB4ZmUsMHg3ZiwweGVkLDB4NzksMHhmZiwweGRlLDB4ZWIsMHg3ZiwweDc0LDB4ZjcsMHhmNywweGUxLDB4ZjksMHhmZiwKKzB4ZjYsMHg1ZiwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZDcsMHhkYiwweGVmLDB4ZmYsMHhiYiwweGZmLDB4ZmYsMHhmZiwweGNjLDB4ZmYsCisweGZmLDB4ZmYsMHhmMCwweGNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZjAsMHgwZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmQsMHgzZCwweGNkLDB4NDksMHg3ZiwweDZmLAorMHgyYiwweGJhLDB4NWMsMHhkMiwweGRhLDB4ZjYsMHhmMywweDNlLDB4ZjcsMHhmZiwweGJkLDB4ZjEsMHhmYSwweGRmLDB4ZmUsMHhmNywKKzB4Y2MsMHhmNiwweGJiLDB4YTUsMHhiMywweGFkLDB4YmYsMHg2ZiwweDdkLDB4NmYsMHg2YiwweGRiLDB4ZGYsMHhiZCwweGZmLDB4ZmUsCisweGIwLDB4NWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGJmLDB4ZmYsMHhmZiwweGZiLDB4ZGIsMHg1NywweGY2LDB4ZmUsMHg5ZiwweGQ1LAorMHhiNywweGZmLDB4YWYsMHhlNSwweDNmLDB4ZmYsMHhmZiwweDZmLDB4ZmYsMHhkYiwweGYxLDB4ZmQsMHhiZiwweGZmLDB4NmYsMHg2OSwKKzB4NmMsMHhkZiwweGRhLDB4ZGYsMHhjYiwweGZmLDB4ZjYsMHhmZiwweDc2LDB4ZmQsMHhmZCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZDAsCisweDNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZkLDB4YmQsMHgwOCwweDAzLDB4ODksMHg0ZiwweDVhLAorMHgwZiwweGYwLDB4ZmYsMHhmOCwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweDVhLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMywKKzB4ZmEsMHhhMCwweGYwLDB4ZjIsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmYywweGZkLDB4MDAsMHg2YiwweGZmLDB4ZmYsMHg1YSwweDBmLAorMHhmMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHg1YSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4YjMsMHhmNSwKKzB4NTAsMHhmMCwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZDcsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDdmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZkLDB4YmMsMHhmZiwweGU0LDB4ZTcsMHg3MSwweGZmLDB4ZjksMHhjNCwweGY0LAorMHg3ZiwweDdmLDB4Y2YsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmIsMHhmNywweDczLDB4YmYsMHgxNCwKKzB4ZmYsMHhlNiwweGZmLDB4ZmYsMHhlMSwweDdkLDB4ZmYsMHhmZiwweGU3LDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHgzZiwweGZmLDB4ZmYsCisweGZmLDB4ZmUsMHhmNSwweGZmLDB4ZmYsMHhmZSwweGQyLDB4ZmEsMHhmZiwweGM0LDB4ZjQsMHg1YywweGJmLDB4ZmEsMHhmZiwweGZmLAorMHhlYywweDdlLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhlZiwweGZmLDB4ZmYsMHg2YiwweGRiLDB4ZmYsMHhkZiwKKzB4ZjksMHhmYiwweGJmLDB4ZmYsMHhmMSwweGZmLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmYiwweGYwLDB4YmYsMHhmZiwweGZmLDB4ZmYsCisweGZlLDB4ZjMsMHhjMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDgyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHg0MCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMSwweDA4LDB4MjAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDEsMHgwMCwweDAxLDB4MDAsMHgwMCwweDgwLDB4MDIsMHgwMCwweDAxLDB4M2MsMHhmMCwweDVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsCisweGZkLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhmZiwweGRmLDB4ZmYsMHhlZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGY3LDB4ZmYsMHhmYiwweGZmLDB4ZmQsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZkLDB4ZmYsMHhmZiwweGMzLDB4ZjAsMHhhZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjAsCisweGZmLDB4ZGYsMHhmZiwweGZmLDB4ZjcsMHgyMywweGZmLDB4ZmYsMHhmZCwweGZmLDB4ZWYsMHhmZiwweGZlLDB4N2YsMHg3ZCwweGY3LAorMHhmZSwweGZmLDB4N2YsMHg3MSwweGZmLDB4ZmIsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweDZlLDB4ZmQsMHhmNywweGZkLDB4ZmYsMHhiZiwKKzB4ZmYsMHhiZiwweGY5LDB4ZmQsMHhmZiwweGRmLDB4ZWYsMHhmMCwweGYwLDB4YWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY4LDB4MzAsCisweDQwLDB4MDEsMHgwMCwweDgzLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwNiwweDA4LDB4MDQsMHgyNiwweDI2LDB4MDAsMHgwMCwweDA2LAorMHgwMywweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHg3MCwweDA4LDB4ODAsMHgwMCwweDIwLDB4MDEsMHgyMCwKKzB4MDAsMHgwMiwweDAwLDB4MzAsMHgwMCwweDAwLDB4YzEsMHhmMCwweDVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHg3YiwweDNmLDB4ZjcsMHhmZiwweGQ3LDB4ZmUsMHhmZSwweGZiLDB4ZmUsMHgzYiwweGZlLDB4YmQsMHhmZiwweDJmLAorMHhmZiwweDcxLDB4ZmYsMHhmYiwweDdmLDB4ZTcsMHhmZiwweGY5LDB4ZWYsMHhmZiwweGQ3LDB4ZmEsMHhmZiwweGI3LDB4YmIsMHhmZSwKKzB4ZmYsMHhmZiwweDc0LDB4ZmYsMHhmNywweGZmLDB4ZjAsMHhjZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4OGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4YjUsCisweGJkLDB4NmYsMHg3YywweGViLDB4N2YsMHhmYiwweGRiLDB4ZDMsMHg0YiwweGVlLDB4ZDYsMHhmNiwweGI3LDB4ZmQsMHhhYywweGExLAorMHhmYiwweGRmLDB4ZmUsMHhmNywweGY0LDB4OTYsMHhiZCwweGI0LDB4YzUsMHhhNSwweGFmLDB4NmYsMHg2OSwweDRmLDB4N2YsMHhiYSwKKzB4ZGIsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGRiLDB4ZmYsCisweGY2LDB4ZmYsMHhmNiwweGZmLDB4YmQsMHhiZiwweGE1LDB4YmYsMHhmZiwweDdkLDB4N2YsMHhlZiwweGZmLDB4ZmIsMHhmMSwweGZkLAorMHhiZiwweGZmLDB4NmYsMHhmZiwweDZiLDB4N2EsMHhkYiwweGZmLDB4ZGIsMHhkZiwweGY2LDB4ZmUsMHhiNiwweGZkLDB4ZmQsMHhiZiwKKzB4ZmUsMHhmNywweGZmLDB4ZDAsMHhlZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmNCwweDJmLDB4ZmYsCisweGZjLDB4NDMsMHg2YiwweGZmLDB4ZmYsMHhmZiwweDBkLDB4ZmYsMHhmYywweDMzLDB4M2YsMHhmMCwweDVmLDB4ZjEsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZjksMHhkZSwweGYwLDB4NGMsMHhmZSwweDc3LDB4YWYsMHhmZiwweGZmLDB4ZWYsMHhmZiwweGYwLDB4ZmYsMHhkYiwKKzB4ZmYsMHg1ZiwweGYwLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmUsMHhmNywweGZmLDB4ZjAsMHgyZiwweGZmLDB4ZmQsCisweDQzLDB4N2YsMHhmZiwweGZmLDB4ZjEsMHgwZiwweGZmLDB4ZmMsMHgzMywweDNmLDB4ZmYsMHhhZiwweGYxLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGY2LDB4ZDcsMHhmZiwweGJjLDB4ZmQsMHhiZCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmMCwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZjLDB4ZmYsMHhmZiwweGZiLDB4ZjEsCisweGJmLDB4ZmYsMHhmOSwweGZkLDB4Y2YsMHhmMiwweDcwLDB4ZmYsMHgxZiwweDlmLDB4ZjMsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmYywweGY3LDB4ZmYsMHgxMywweDlmLDB4ZmMsMHhmZiwweGZmLDB4ODQsMHhmNywweGZmLDB4ZmYsMHg0NywweGZmLDB4ZmYsMHhmZiwKKzB4ZjAsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjUsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZjLDB4ZmYsMHhmZSwweGZlLDB4NzksCisweDNmLDB4ZmYsMHgxZCwweDQ2LDB4Y2YsMHhmZiwweGNmLDB4ZmMsMHg3YiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGVkLAorMHhmMywweGFiLDB4ZmYsMHhjYiwweGZmLDB4ZjgsMHhmZiwweGZjLDB4ZjUsMHhmZiwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmEsMHhmMCwKKzB4OGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYzLDB4YzIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsCisweDAwLDB4MDAsMHgyMCwweDAwLDB4MjAsMHgwMCwweDAwLDB4MDQsMHgwOCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDIwLAorMHgwYywweDAwLDB4MDAsMHgwNCwweDAxLDB4MDAsMHgwMSwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMSwweDNjLDB4ZjAsMHg3ZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZCwweGJmLDB4ZmYsMHhmZiwweGZkLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsCisweGRmLDB4ZmYsMHhmZiwweGY3LDB4ZmYsMHhmZiwweGZmLDB4ZWYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGViLAorMHhmZiwweGRmLDB4ZmYsMHhmZiwweGZiLDB4ZjcsMHg3ZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4YmYsMHhkYiwweGYwLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZlLDB4ZjAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHg3ZiwweGY3LDB4ZmYsCisweGJmLDB4YmYsMHhjZiwweGZmLDB4ZmYsMHhmZiwweDNlLDB4ZjEsMHg3ZiwweGZmLDB4ZmYsMHhlZiwweGZmLDB4ZmYsMHhmZiwweGZlLAorMHhmZiwweGZkLDB4ZmYsMHhiZiwweGJkLDB4ZmUsMHhmZiwweGZiLDB4ZjcsMHhkZiwweGZiLDB4ZDAsMHhmMCwweDlmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZSwweGY4LDB4MzAsMHgyMCwweDAwLDB4NDAsMHgwMSwweDgwLDB4YzAsMHgzMCwweDAwLDB4MDAsMHgyMCwweDAwLDB4MTAsCisweDUwLDB4ODgsMHgyMCwweDAwLDB4MDAsMHgxMywweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDEsMHg4MCwweDA4LDB4MDAsMHgwMCwweGEwLDB4MDAsMHgxMCwweGMxLDB4ZjAsMHhlZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmUsMHhmZCwweGVmLDB4N2YsMHhmZiwweGZmLDB4YmYsMHhmZiwweGY3LDB4ZmYsMHhlZiwweGZiLDB4ZmQsMHg3NywweGVmLDB4YmYsCisweGY3LDB4N2YsMHhmZiwweGZmLDB4YmYsMHhkMSwweDdmLDB4ZmYsMHhmZiwweGY3LDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhhZiwweGZmLAorMHhkZiwweGY3LDB4ZmIsMHhmZiwweGZkLDB4ZmYsMHhmYywweGZmLDB4ZmQsMHhmZiwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZTAsMHgzZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZGQsMHhmZiwKKzB4ZmYsMHhmZiwweGE1LDB4ZmQsMHg2ZiwweDdkLDB4NmQsMHg3ZiwweDUyLDB4ZGYsMHg1YSwweDRiLDB4ZWUsMHhiNiwweGVlLDB4ZjIsCisweGJiLDB4YWMsMHhhMSwweDViLDB4NGQsMHhkNiwweGY3LDB4ZmUsMHhiMiwweGJkLDB4MzUsMHhiNSwweGI1LDB4ZGQsMHg2ZiwweDdmLAorMHhlOSwweDVmLDB4NTIsMHhkZiwweGJkLDB4ZmYsMHhmZiwweGYwLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGJmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhkYiwweGZlLDB4ZjYsMHhmZiwweGY2LDB4ZmYsMHhmZCwweGJmLDB4ZmQsMHhiNSwweGJmLDB4ZjksMHg3ZiwweDZmLDB4ZmYsCisweGRiLDB4ZjEsMHhmZCwweGJmLDB4ZmYsMHg2ZiwweGZmLDB4NjksMHg3ZiwweGRiLDB4ZmYsMHhkMywweGZmLDB4ZjYsMHhmZSwweGYyLAorMHhmZiwweGFkLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhkMCwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmNSwKKzB4MzAsMHgwZiwweGZmLDB4ZmYsMHhmZCwweDZiLDB4Y2EsMHhmZiwweGYwLDB4MGYsMHhkNiwweGJmLDB4Y2YsMHgzZiwweGZmLDB4ZmYsCisweGYxLDB4ZmYsMHhmZiwweGZmLDB4Y2EsMHhmZSwweGJmLDB4ZmYsMHhmMCwweDA1LDB4YWYsMHgwZiwweGZmLDB4ZmMsMHhmMCwweGNmLAorMHhmMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhlZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZjUsMHgzMCwKKzB4MGYsMHhmZiwweGZmLDB4ZmMsMHgzZiwweGNhLDB4ZmYsMHgwZiwweDBmLDB4ZDYsMHhiZiwweGZmLDB4ZmYsMHhmNSwweDVmLDB4ZjEsCisweGZmLDB4OGIsMHhmZiwweGMzLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4MGYsMHhmZiwweGZjLDB4ZjAsMHhjZiwweGYwLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4M2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4Y2YsMHhmZiwKKzB4ZmYsMHhiZiwweDlmLDB4M2YsMHhmZSwweGZjLDB4ZmYsMHg0ZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmNywweGYxLDB4ZmYsCisweGRmLDB4ZmUsMHg3ZSwweDNmLDB4OWYsMHhmNCwweGZjLDB4N2YsMHhmYywweGZmLDB4ZmYsMHgzZiwweGZmLDB4M2YsMHhmZSwweDNmLAorMHhmZiwweGZmLDB4ZmYsMHhmMCwweDRmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmNSwweGZmLDB4ZmYsMHhmYiwweGZmLDB4ZmUsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4YmYsMHhmYiwweGZmLDB4ZjgsMHhlZCwweGZmLDB4OGYsMHhmZiwweGJiLDB4ZmYsMHhiMSwweGYzLDB4ZWYsCisweDhmLDB4ZjcsMHhmZiwweGZmLDB4ZGIsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGJmLDB4ZmQsMHg3OSwweGJmLDB4YmYsMHhmZiwweGZmLAorMHhmZiwweGZiLDB4ZjAsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjMsMHhjMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDQsMHgwOCwweDA4LDB4MDEsMHgwMSwweDAwLDB4OTAsCisweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAxLAorMHgzYywweGYwLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZkLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHg5ZiwweGZmLDB4YWYsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGJmLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhlZCwweGZmLDB4ZmYsMHhmZiwweGVmLDB4ZmYsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGMzLAorMHhmMCwweDNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMCwweGZmLDB4ZmQsMHhmZiwweGZmLDB4ZmYsMHhmYiwweGZmLDB4YmIsMHhmZiwKKzB4ZmYsMHhmZiwweDdmLDB4ZjYsMHhmZiwweDdmLDB4ZmIsMHhmZCwweGVkLDB4ZmYsMHhmMSwweGZmLDB4ZmUsMHg3ZiwweGZmLDB4ZmYsCisweGZmLDB4NWYsMHhmZiwweGY3LDB4ZmYsMHg3ZSwweGZmLDB4ZmQsMHhmZiwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZWYsMHhmMCwweGYwLAorMHg4ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjgsMHgzMCwweDgwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHg0MCwweDAyLDB4MDAsMHgwMywKKzB4MDAsMHgwNSwweDA0LDB4MjAsMHgwMCwweDAwLDB4MDEsMHhkMCwweDAwLDB4ODEsMHgwMCwweDIwLDB4MDQsMHgwNCwweDAwLDB4MDAsCisweDgxLDB4MDQsMHgwOCwweDgwLDB4MTAsMHgwMCwweGMwLDB4MDAsMHgwMCwweDAwLDB4MjAsMHgwMCwweDA4LDB4YzEsMHhmMCwweDZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjMsMHhmZCwweGZmLDB4ZWQsMHhmYywKKzB4ZmYsMHhmZiwweDlmLDB4ZmIsMHhmZCwweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweDdmLDB4ZmIsMHgzZSwweGZmLDB4OWYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmQsMHhmOSwweGZmLDB4ZmYsMHhmZiwweGZkLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHg2ZiwweGZmLAorMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4Y2YsMHhmZiwweGZmLAorMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmQsMHhiZCwweGZmLDB4ZWYsMHg3YywweGViLDB4N2YsMHhmYiwweGRiLDB4ZmEsMHhkYywKKzB4ZWUsMHhmNywweGY2LDB4ZDcsMHhmNSwweDJkLDB4YTEsMHhiYiwweGRkLDB4ZWUsMHhmNywweDU0LDB4ZjcsMHhmYiwweDJjLDB4YjUsCisweGI0LDB4YmQsMHg2YiwweDZmLDB4ZWYsMHg2ZiwweGJiLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDFmLDB4ZmYsMHhmZiwweGZmLAorMHhmZSwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmIsMHhmZiwweGY2LDB4ZmYsMHhmNiwweGZmLDB4ZmQsMHhiZiwweGZmLDB4YmYsMHhlZiwKKzB4NmYsMHhmZiwweDZmLDB4ZmEsMHhkYiwweGYxLDB4YzUsMHhiZCwweGY1LDB4NmYsMHhmZiwweDZmLDB4Y2EsMHhkYiwweGZmLDB4ZGIsCisweGZiLDB4ZjYsMHg5NywweGY2LDB4ZmYsMHhmZCwweGJmLDB4ZmUsMHhmNywweGZmLDB4ZDAsMHg5ZiwweGZmLDB4ZmYsMHhmZiwweGZlLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4OGIsMHg3ZiwweGZmLDB4ZmYsMHhlNywweDYzLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmYywweDc3LDB4ZGYsMHhmMSwweGRiLDB4ZmYsMHhkNiwweGE4LDB4M2YsMHhmZiwweGZmLDB4MDgsMHgyZiwweGYwLDB4ZmYsCisweGMzLDB4ZmYsMHhlYiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHg1ZiwweGYwLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDhiLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmMsMHhmZiwweGNmLDB4ZjEsMHhkYiwweGZmLDB4ZDYsMHhhOCwweDNmLDB4ZmYsMHhmZiwweDA4LDB4MmYsMHhmMCwweGZmLDB4YzMsCisweGZmLDB4ZWIsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmNSwweGJmLDB4ZmYsMHhjYSwweGZmLDB4OWYsMHhmZiwweGZhLDB4YjksMHhlNywKKzB4OWYsMHhmMywweDgxLDB4ZmYsMHhmZiwweGZjLDB4NzMsMHhkNywweGZmLDB4ZmYsMHg3NywweGZmLDB4ZmQsMHhmZiwweGZjLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGNmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHgxZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjUsMHhmZiwweGZmLAorMHhmZiwweGY3LDB4ZGUsMHhmZiwweGZlLDB4N2UsMHhmZiwweGJmLDB4ZmYsMHhiZiwweGYxLDB4YjMsMHhmZiwweGZmLDB4ZTMsMHhmYiwKKzB4ZmYsMHhlMSwweDFmLDB4N2YsMHhmZiwweGY4LDB4NzgsMHhmZiwweGZiLDB4MWUsMHhmZiwweGY3LDB4ZmUsMHhlNywweGZmLDB4ZmYsCisweGZmLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmYSwweGYwLDB4NGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYzLDB4YzAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDUwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwKKzB4MDEsMHg4MCwweDQwLDB4NDAsMHgyMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsCisweDgwLDB4MDAsMHgwMCwweDAxLDB4M2MsMHhmMCwweGFmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZCwweGJmLDB4ZmYsMHhmYiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGVmLDB4ZjcsMHhmMSwKKzB4ZmQsMHhmZiwweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZWYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDdmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGRiLDB4ZjAsMHg4ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZjAsMHhmZiwweGRmLDB4ZmYsMHhmZiwweDdmLAorMHhmZiwweGZmLDB4ZmYsMHhiZSwweGQ3LDB4ZmYsMHhlZCwweGJkLDB4N2UsMHhiZiwweGZlLDB4ZjYsMHg3ZiwweGJmLDB4NzEsMHhmZiwKKzB4ZmYsMHhkYSwweGZmLDB4ZjksMHhmZiwweGJmLDB4N2YsMHhmZSwweGZmLDB4NmYsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweDdmLDB4ZmYsMHhkMCwweGYwLDB4Y2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY4LDB4MzAsMHg0MiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4MCwweGMxLDB4MDAsMHgwMCwweDkwLDB4MDAsMHhjNCwweDAwLDB4MDAsMHgxMiwweDIwLDB4NDMsMHgyMiwweDgxLDB4ODQsMHgwMCwKKzB4MDAsMHgxNCwweDAwLDB4MDEsMHgwMCwweDA4LDB4ODAsMHgwMCwweDAyLDB4MDAsMHgwMiwweDAwLDB4MDQsMHgwMiwweDAwLDB4MDAsCisweDEwLDB4YzEsMHhmMCwweDFmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmQsMHhmZiwweGZmLDB4ZGQsMHhmZSwweGZmLAorMHhiNiwweDc2LDB4ZTUsMHhiYywweGY5LDB4ZjcsMHhhZiwweDVmLDB4YmYsMHhmYywweGRmLDB4Y2YsMHhmMSwweGZmLDB4ZWYsMHg3OSwKKzB4ZmYsMHhiZCwweGZmLDB4ZWYsMHhmZiwweGZmLDB4ZjcsMHg2ZiwweDVmLDB4ZmYsMHhmZiwweGZkLDB4ZWYsMHhlZiwweGJmLDB4ZmYsCisweGZmLDB4ZjAsMHg5ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGRiLDB4ZmYsMHhmZiwweGZkLDB4MmQsMHhmZiwweDY5LDB4MmEsMHhlZiwweDc3LAorMHhiYiwweGRkLDB4NWEsMHhkZiwweGY2LDB4ZjYsMHhkNiwweGY3LDB4N2QsMHhiZCwweGQxLDB4YjIsMHg0YSwweGQ2LDB4YjIsMHhiZSwKKzB4OTcsMHhmNSwweGJkLDB4YjMsMHhhZCwweGZmLDB4ZWYsMHg3ZiwweDY5LDB4NmIsMHhmYiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsCisweDJmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGRiLDB4ZmYsMHhmNiwweGZlLDB4OWYsMHhkNCwweGJmLAorMHhlZCwweGFmLDB4ZmYsMHg2YiwweDZmLDB4ZjcsMHhmZiwweGRkLDB4ZGIsMHgzMSwweGZkLDB4YmYsMHhmZiwweDZmLDB4N2YsMHhmZiwKKzB4ZmYsMHhkYiwweGZmLDB4Y2IsMHhkZiwweGY2LDB4ZmYsMHhmNiwweGZmLDB4ZmQsMHhiZiwweGZlLDB4ZjcsMHhmZiwweGQwLDB4OGYsCisweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmQsMHgxZiwweGZmLDB4NDYsMHgyZiwweDlmLDB4ZmYsMHhmZiwweGZmLAorMHhhNSwweGZmLDB4ZmYsMHhmZiwweGRmLDB4YjcsMHhmZiwweGZmLDB4ZjEsMHhmZiwweGZmLDB4ZmYsMHhmNywweGU5LDB4NmEsMHhiZiwKKzB4ZmYsMHhmZiwweGZkLDB4ZmYsMHhmZiwweGZkLDB4NTUsMHg1NywweGZmLDB4ZmYsMHhmZiwweGZmLDB4YWYsMHhmMCwweDRmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZSwweGZlLDB4ZGYsMHhmZiwweGZkLDB4MWYsMHhmZiwweDQ2LDB4MmYsMHg5ZiwweGZmLDB4ZmYsMHhmZiwweGE1LAorMHhmZiwweGZmLDB4ZmYsMHhjMCwweDM3LDB4ZmYsMHhmZiwweGYxLDB4OTksMHg4ZSwweGRjLDB4N2YsMHhlOSwweDZhLDB4YmYsMHhmZiwKKzB4ZjAsMHgwZiwweGZmLDB4ZmYsMHhmZCwweDU1LDB4NTcsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHgwZiwweGZmLDB4ZmYsCisweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDA3LDB4ZmYsMHhjMCwweGJlLDB4ZmYsMHhmZiwweGNmLDB4ZWYsMHg5ZiwweGZmLAorMHhmZiwweGZiLDB4ZmYsMHhlNywweGZmLDB4ZmYsMHhhMSwweGUzLDB4Y2UsMHgzYywweDU4LDB4M2YsMHhmMywweGZmLDB4ZmQsMHhlZiwKKzB4ZjksMHhmZiwweGZmLDB4ZjcsMHhmMSwweDdmLDB4ZmYsMHhjYiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4MmYsMHhmZiwweGZmLDB4ZmYsCisweGZlLDB4ZjUsMHg3ZiwweGZmLDB4ZjAsMHhmZiwweGZlLDB4ZmYsMHhjNCwweDc1LDB4ZTcsMHhiOSwweGZmLDB4ZmYsMHhmZiwweGVmLAorMHhmZiwweGM3LDB4MzcsMHgzYiwweGZmLDB4ZjAsMHgxMywweDllLDB4MGYsMHhmNCwweGZmLDB4ZmUsMHhmYiwweGZmLDB4ZmYsMHhmOSwKKzB4ZmMsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmEsMHhmMCwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsCisweGYzLDB4YzAsMHgwMSwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDIsMHgyMiwweDAwLDB4MDAsMHhjMCwweDQwLDB4MDAsMHg0MCwweDAwLAorMHgwNCwweDA4LDB4MDQsMHgwYSwweDAxLDB4MDEsMHgxMCwweDIwLDB4MjAsMHgwMCwweDAwLDB4MDQsMHgwOCwweDA4LDB4MDQsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMSwweDNjLDB4ZjAsMHhjZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmQsCisweDNmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhmZiwweDdmLDB4ZmYsMHg3ZiwweGZmLDB4Y2YsMHg5ZCwweGZmLAorMHhmZiwweGY3LDB4ZmQsMHhmMSwweGZmLDB4ZmYsMHhmZiwweGVlLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkYiwweGYwLDB4NmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGYwLDB4ZmYsCisweGZmLDB4ZmYsMHhmNywweGY3LDB4ZmYsMHhmZiwweGZlLDB4YmYsMHhmNywweGZmLDB4ZmYsMHg1YiwweGZmLDB4YmYsMHhmNywweGZmLAorMHhmZCwweDdmLDB4NzEsMHhmZCwweGZmLDB4ZWQsMHhmNywweGZlLDB4ZWYsMHhmZiwweGZmLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGVmLDB4ZmYsMHg3ZiwweGZmLDB4ZDAsMHhmMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmOCwweDMwLDB4MTEsCisweDAwLDB4NDgsMHg2MCwweDQwLDB4ODIsMHg2MCwweDI0LDB4NjAsMHgwMCwweGNjLDB4MDAsMHg4MCwweDA0LDB4MDEsMHgwMCwweDAwLAorMHgxNCwweDAxLDB4MGMsMHgwNCwweDAwLDB4MzAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDA4LDB4MDAsMHgwMSwweDAwLDB4YzIsMHgwMCwKKzB4MDAsMHgwMiwweDAwLDB4ODAsMHgwMCwweGMxLDB4ZjAsMHg1ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGY3LDB4N2IsMHhmZiwweGYzLDB4ZWIsMHhiZiwweGZmLDB4ZjcsMHhmZiwweGZmLDB4ZmYsMHhlNywweDVkLDB4M2YsMHhmZiwweGY2LAorMHhkMSwweGZkLDB4ZmYsMHhlYiwweGY3LDB4M2QsMHhmZiwweGZmLDB4ZmYsMHg1ZiwweGZmLDB4N2YsMHg3ZiwweGYzLDB4ZmYsMHhmZiwKKzB4ZWYsMHhmZCwweGJmLDB4ZmYsMHhmZiwweGYwLDB4NWYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYxLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmNSwweGI1LDB4ZGYsCisweDZmLDB4N2QsMHg2OSwweDdmLDB4ZmIsMHhkZiwweDUyLDB4NWYsMHhmNiwweGY3LDB4ZmUsMHhmNiwweGYzLDB4YmQsMHhiMSwweGRhLAorMHhjZCwweGZlLDB4ZjYsMHhlZSwweGQyLDB4YmQsMHhhNSwweGFmLDB4YmQsMHhmZiwweDZmLDB4N2MsMHhlYiwweDJiLDB4ZmEsMHhkYSwKKzB4ZmYsMHhmZSwweGRmLDB4ZjAsMHg0ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4YmYsMHhmZiwweGZmLDB4ZmYsMHhkYiwweGZmLDB4ZjYsCisweGZmLDB4ZjYsMHhmZiwweGJkLDB4YmYsMHhjZCwweGJmLDB4ZWIsMHg2ZiwweGY3LDB4NmYsMHhkZiwweGRiLDB4NTEsMHhmZCwweGJkLAorMHhmZiwweDZmLDB4ZmYsMHg2ZiwweGZiLDB4NWIsMHhmZiwweGRiLDB4ZmYsMHhmNiwweGZlLDB4ZjYsMHhmZCwweGZkLDB4YmYsMHhmZSwKKzB4ZjcsMHhmZiwweGQwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZhLDB4NTAsMHhmZiwweGZmLDB4ZmYsCisweGYwLDB4NmYsMHhmZiwweGZmLDB4ZjAsMHg5NiwweGZmLDB4ZmYsMHhjNiwweDJiLDB4ZmYsMHhmZiwweGYxLDB4ZmMsMHhmZiwweGZmLAorMHhmNywweGRiLDB4YzMsMHhmZiwweDAwLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGMxLDB4NGYsMHhjMywweGZmLDB4ZmYsMHhmZiwKKzB4YWYsMHhmMCwweDlmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmNSwweGEwLDB4ZmYsMHhmZiwweGZmLDB4ZjAsCisweDZmLDB4ZmYsMHhmZiwweGYwLDB4OTYsMHhmZiwweGZmLDB4YzYsMHgyYiwweGZmLDB4ZmYsMHhmMSwweDVhLDB4ZmYsMHhmZiwweGZmLAorMHhmMywweGMzLDB4ZmYsMHgwMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhjMSwweDRmLDB4YzMsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZjAsMHhjZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmYywweGZmLDB4ZmYsMHg5ZiwweGYwLDB4N2YsCisweGZmLDB4ZjksMHhmYywweDRmLDB4ZjMsMHhmZiwweDI3LDB4ZWIsMHhmZiwweGZjLDB4ODEsMHhmYywweDdmLDB4ZmUsMHg3YiwweGZmLAorMHhmNywweGZmLDB4MTIsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4MTgsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwKKzB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGY1LDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHhmZSwweGZmLDB4ZmMsMHg3ZSwweDdmLDB4YmYsCisweGZmLDB4ZmYsMHhhZiwweGVmLDB4ZmYsMHhkZiwweGRmLDB4ZmIsMHhmZiwweGYxLDB4YzMsMHhmZSwweDZmLDB4ZjEsMHhjZiwweDNmLAorMHhmYiwweGZmLDB4ZmYsMHhjZiwweGZlLDB4ZmYsMHhmZiwweGZlLDB4N2YsMHhiZiwweGZmLDB4ZmYsMHhiZiwweGZhLDB4ZjAsMHhkZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmMywweGMwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsCisweDIwLDB4MDAsMHgwMSwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDIsMHg4MCwweDAwLDB4MDIsMHgzYywweGYwLDB4MmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZlLDB4ZmQsMHhiZiwweGZmLDB4ZmIsMHhmZCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGY1LDB4ZjEsMHhmZiwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhlZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZGIsMHhmMCwweDJmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZSwweGYwLDB4ZmYsMHhmZiwweGZmLDB4ZmIsMHhmZiwweGJmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmNywweGJmLDB4ZmIsCisweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZjcsMHhmZiwweGYxLDB4ZjcsMHhiZiwweGZiLDB4ZmYsMHhmZiwweGZmLDB4N2YsMHhkZSwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZWQsMHhmNywweGZmLDB4ZmYsMHg3ZiwweGQwLDB4ZjAsMHgzZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmUsMHhmOCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZTAsMHgwMCwweDAwLDB4ODAsCisweDIwLDB4MDEsMHgwMSwweDkyLDB4MDAsMHgwMSwweDAxLDB4MDAsMHhlMCwweDFjLDB4NjAsMHgyMCwweDMwLDB4MDgsMHgwOCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDgwLDB4MDAsMHhjMSwweGYwLDB4NmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGRiLDB4ZmUsMHhmZiwweGZmLDB4ZGYsMHhmZiwweGZjLDB4N2YsMHhmYiwweGJmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsMHhmNiwweGZmLDB4ZjcsMHg3ZSwweDNmLDB4ZmYsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGY3LAorMHhmZiwweGZmLDB4ZmYsMHhlZCwweGZmLDB4ZGYsMHhmZiwweGI3LDB4ZmYsMHhmMCwweDNmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhkZiwweGZmLDB4ZmYsMHhmZiwweGRmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhiZiwweGZmLDB4ZGYsCisweDU3LDB4ZWYsMHhmMSwweGZkLDB4ZmUsMHg3ZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZGYsMHhmYiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4N2YsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmIsMHhmZiwweGRmLDB4ZmYsCisweGZmLDB4ZjEsMHhmZCwweGZmLDB4N2YsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmMCwweDlmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmNywweGZkLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGYxLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjAsMHg2ZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZjEsCisweGZmLDB4ZmYsMHhmZCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorMHhmZiwweGZmLDB4ZmYsMHhmZiwweGYwLDB4Y2YsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmYiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZiLDB4NmYsMHhmZiwweGZlLDB4YmYsMHhmZiwweGYxLDB4ZmYsCisweGY3LDB4ZmYsMHhmZiwweDdmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZkLAorMHhmZiwweGZmLDB4ZmYsMHhmMCwweGVmLDB4ZmYsMHhmZiwweGZmLDB4ZmUsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmIsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweDU3LDB4ZmYsMHhmZCwweGJmLDB4ZmYsMHhmMSwweGZmLDB4ZWYsCisweGZlLDB4ZmYsMHhiZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLAorMHhkZSwweGZmLDB4ZjAsMHhjZiwweGZmLDB4ZmYsMHhmZiwweGZlLDB4ZmYsMHhmZiwweGZmLDB4ZjcsMHhkYiwweGZmLDB4ZGIsMHhmZCwKKzB4ZjYsMHhmZiwweGY2LDB4ZmYsMHgzYywweGJjLDB4YmMsMHhiZiwweGRmLDB4NmYsMHhlNywweDJmLDB4ZjEsMHgzYywweGJmLDB4ZmQsCisweGJmLDB4ZGYsMHg2ZiwweGZmLDB4NmYsMHhmNywweGRiLDB4ZmYsMHhkYiwweGZkLDB4ZjYsMHhmZiwweGY2LDB4ZmYsMHhmZiwweGZmLAorMHgwMiwweDAxLDB4ZGYsMHhmZiwweGZmLDB4ZmYsMHhmZSwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKzB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vejg1MzAuaCBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3o4NTMwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJlZjU0OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3o4NTMwLmgKQEAgLTAsMCArMSwyNDUgQEAKKworLyogODUzMCBTZXJpYWwgQ29tbXVuaWNhdGlvbnMgQ29udHJvbGxlciBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZQlGTEFHCTB4N2UKKworLyogV3JpdGUgUmVnaXN0ZXIgMCAqLworI2RlZmluZQlSMAkwCQkvKiBSZWdpc3RlciBzZWxlY3RzICovCisjZGVmaW5lCVIxCTEKKyNkZWZpbmUJUjIJMgorI2RlZmluZQlSMwkzCisjZGVmaW5lCVI0CTQKKyNkZWZpbmUJUjUJNQorI2RlZmluZQlSNgk2CisjZGVmaW5lCVI3CTcKKyNkZWZpbmUJUjgJOAorI2RlZmluZQlSOQk5CisjZGVmaW5lCVIxMAkxMAorI2RlZmluZQlSMTEJMTEKKyNkZWZpbmUJUjEyCTEyCisjZGVmaW5lCVIxMwkxMworI2RlZmluZQlSMTQJMTQKKyNkZWZpbmUJUjE1CTE1CisKKyNkZWZpbmUJTlVMTENPREUJMAkvKiBOdWxsIENvZGUgKi8KKyNkZWZpbmUJUE9JTlRfSElHSAkweDgJLyogU2VsZWN0IHVwcGVyIGhhbGYgb2YgcmVnaXN0ZXJzICovCisjZGVmaW5lCVJFU19FWFRfSU5UCTB4MTAJLyogUmVzZXQgRXh0LiBTdGF0dXMgSW50ZXJydXB0cyAqLworI2RlZmluZQlTRU5EX0FCT1JUCTB4MTgJLyogSERMQyBBYm9ydCAqLworI2RlZmluZQlSRVNfUnhJTlRfRkMJMHgyMAkvKiBSZXNldCBSeElOVCBvbiBGaXJzdCBDaGFyYWN0ZXIgKi8KKyNkZWZpbmUJUkVTX1R4X1AJMHgyOAkvKiBSZXNldCBUeElOVCBQZW5kaW5nICovCisjZGVmaW5lCUVSUl9SRVMJCTB4MzAJLyogRXJyb3IgUmVzZXQgKi8KKyNkZWZpbmUJUkVTX0hfSVVTCTB4MzgJLyogUmVzZXQgaGlnaGVzdCBJVVMgKi8KKworI2RlZmluZQlSRVNfUnhfQ1JDCTB4NDAJLyogUmVzZXQgUnggQ1JDIENoZWNrZXIgKi8KKyNkZWZpbmUJUkVTX1R4X0NSQwkweDgwCS8qIFJlc2V0IFR4IENSQyBDaGVja2VyICovCisjZGVmaW5lCVJFU19FT01fTAkweEMwCS8qIFJlc2V0IEVPTSBsYXRjaCAqLworCisvKiBXcml0ZSBSZWdpc3RlciAxICovCisKKyNkZWZpbmUJRVhUX0lOVF9FTkFCCTB4MQkvKiBFeHQgSW50IEVuYWJsZSAqLworI2RlZmluZQlUeElOVF9FTkFCCTB4MgkvKiBUeCBJbnQgRW5hYmxlICovCisjZGVmaW5lCVBBUl9TUEVDCTB4NAkvKiBQYXJpdHkgaXMgc3BlY2lhbCBjb25kaXRpb24gKi8KKworI2RlZmluZQlSeElOVF9ESVNBQgkwCS8qIFJ4IEludCBEaXNhYmxlICovCisjZGVmaW5lCVJ4SU5UX0ZDRVJSCTB4OAkvKiBSeCBJbnQgb24gRmlyc3QgQ2hhcmFjdGVyIE9ubHkgb3IgRXJyb3IgKi8KKyNkZWZpbmUJSU5UX0FMTF9SeAkweDEwCS8qIEludCBvbiBhbGwgUnggQ2hhcmFjdGVycyBvciBlcnJvciAqLworI2RlZmluZQlJTlRfRVJSX1J4CTB4MTgJLyogSW50IG9uIGVycm9yIG9ubHkgKi8KKworI2RlZmluZQlXVF9SRFlfUlQJMHgyMAkvKiBXYWl0L1JlYWR5IG9uIFIvVCAqLworI2RlZmluZQlXVF9GTl9SRFlGTgkweDQwCS8qIFdhaXQvRk4vUmVhZHkgRk4gKi8KKyNkZWZpbmUJV1RfUkRZX0VOQUIJMHg4MAkvKiBXYWl0L1JlYWR5IEVuYWJsZSAqLworCisvKiBXcml0ZSBSZWdpc3RlciAjMiAoSW50ZXJydXB0IFZlY3RvcikgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgMyAqLworCisjZGVmaW5lCVJ4RU5BQkxFCTB4MQkvKiBSeCBFbmFibGUgKi8KKyNkZWZpbmUJU1lOQ19MX0lOSAkweDIJLyogU3luYyBDaGFyYWN0ZXIgTG9hZCBJbmhpYml0ICovCisjZGVmaW5lCUFERF9TTQkJMHg0CS8qIEFkZHJlc3MgU2VhcmNoIE1vZGUgKFNETEMpICovCisjZGVmaW5lCVJ4Q1JDX0VOQUIJMHg4CS8qIFJ4IENSQyBFbmFibGUgKi8KKyNkZWZpbmUJRU5UX0hNCQkweDEwCS8qIEVudGVyIEh1bnQgTW9kZSAqLworI2RlZmluZQlBVVRPX0VOQUIJMHgyMAkvKiBBdXRvIEVuYWJsZXMgKi8KKyNkZWZpbmUJUng1CQkweDAJLyogUnggNSBCaXRzL0NoYXJhY3RlciAqLworI2RlZmluZQlSeDcJCTB4NDAJLyogUnggNyBCaXRzL0NoYXJhY3RlciAqLworI2RlZmluZQlSeDYJCTB4ODAJLyogUnggNiBCaXRzL0NoYXJhY3RlciAqLworI2RlZmluZQlSeDgJCTB4YzAJLyogUnggOCBCaXRzL0NoYXJhY3RlciAqLworCisvKiBXcml0ZSBSZWdpc3RlciA0ICovCisKKyNkZWZpbmUJUEFSX0VOQQkJMHgxCS8qIFBhcml0eSBFbmFibGUgKi8KKyNkZWZpbmUJUEFSX0VWRU4JMHgyCS8qIFBhcml0eSBFdmVuL09kZCogKi8KKworI2RlZmluZQlTWU5DX0VOQUIJMAkvKiBTeW5jIE1vZGVzIEVuYWJsZSAqLworI2RlZmluZQlTQjEJCTB4NAkvKiAxIHN0b3AgYml0L2NoYXIgKi8KKyNkZWZpbmUJU0IxNQkJMHg4CS8qIDEuNSBzdG9wIGJpdHMvY2hhciAqLworI2RlZmluZQlTQjIJCTB4YwkvKiAyIHN0b3AgYml0cy9jaGFyICovCisKKyNkZWZpbmUJTU9OU1lOQwkJMAkvKiA4IEJpdCBTeW5jIGNoYXJhY3RlciAqLworI2RlZmluZQlCSVNZTkMJCTB4MTAJLyogMTYgYml0IHN5bmMgY2hhcmFjdGVyICovCisjZGVmaW5lCVNETEMJCTB4MjAJLyogU0RMQyBNb2RlICgwMTExMTExMCBTeW5jIEZsYWcpICovCisjZGVmaW5lCUVYVFNZTkMJCTB4MzAJLyogRXh0ZXJuYWwgU3luYyBNb2RlICovCisKKyNkZWZpbmUJWDFDTEsJCTB4MAkvKiB4MSBjbG9jayBtb2RlICovCisjZGVmaW5lCVgxNkNMSwkJMHg0MAkvKiB4MTYgY2xvY2sgbW9kZSAqLworI2RlZmluZQlYMzJDTEsJCTB4ODAJLyogeDMyIGNsb2NrIG1vZGUgKi8KKyNkZWZpbmUJWDY0Q0xLCQkweEMwCS8qIHg2NCBjbG9jayBtb2RlICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDUgKi8KKworI2RlZmluZQlUeENSQ19FTkFCCTB4MQkvKiBUeCBDUkMgRW5hYmxlICovCisjZGVmaW5lCVJUUwkJMHgyCS8qIFJUUyAqLworI2RlZmluZQlTRExDX0NSQwkweDQJLyogU0RMQy9DUkMtMTYgKi8KKyNkZWZpbmUJVHhFTkFCCQkweDgJLyogVHggRW5hYmxlICovCisjZGVmaW5lCVNORF9CUksJCTB4MTAJLyogU2VuZCBCcmVhayAqLworI2RlZmluZQlUeDUJCTB4MAkvKiBUeCA1IGJpdHMgKG9yIGxlc3MpL2NoYXJhY3RlciAqLworI2RlZmluZQlUeDcJCTB4MjAJLyogVHggNyBiaXRzL2NoYXJhY3RlciAqLworI2RlZmluZQlUeDYJCTB4NDAJLyogVHggNiBiaXRzL2NoYXJhY3RlciAqLworI2RlZmluZQlUeDgJCTB4NjAJLyogVHggOCBiaXRzL2NoYXJhY3RlciAqLworI2RlZmluZQlEVFIJCTB4ODAJLyogRFRSICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDYgKFN5bmMgYml0cyAwLTcvU0RMQyBBZGRyZXNzIEZpZWxkKSAqLworCisvKiBXcml0ZSBSZWdpc3RlciA3IChTeW5jIGJpdHMgOC0xNS9TRExDIDAxMTExMTEwKSAqLworCisvKiBXcml0ZSBSZWdpc3RlciA4ICh0cmFuc21pdCBidWZmZXIpICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDkgKE1hc3RlciBpbnRlcnJ1cHQgY29udHJvbCkgKi8KKyNkZWZpbmUJVklTCTEJLyogVmVjdG9yIEluY2x1ZGVzIFN0YXR1cyAqLworI2RlZmluZQlOVgkyCS8qIE5vIFZlY3RvciAqLworI2RlZmluZQlETEMJNAkvKiBEaXNhYmxlIExvd2VyIENoYWluICovCisjZGVmaW5lCU1JRQk4CS8qIE1hc3RlciBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lCVNUQVRISQkweDEwCS8qIFN0YXR1cyBoaWdoICovCisjZGVmaW5lCU5PUkVTRVQJMAkvKiBObyByZXNldCBvbiB3cml0ZSB0byBSOSAqLworI2RlZmluZQlDSFJCCTB4NDAJLyogUmVzZXQgY2hhbm5lbCBCICovCisjZGVmaW5lCUNIUkEJMHg4MAkvKiBSZXNldCBjaGFubmVsIEEgKi8KKyNkZWZpbmUJRkhXUkVTCTB4YzAJLyogRm9yY2UgaGFyZHdhcmUgcmVzZXQgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgMTAgKG1pc2MgY29udHJvbCBiaXRzKSAqLworI2RlZmluZQlCSVQ2CTEJLyogNiBiaXQvOGJpdCBzeW5jICovCisjZGVmaW5lCUxPT1BNT0RFIDIJLyogU0RMQyBMb29wIG1vZGUgKi8KKyNkZWZpbmUJQUJVTkRFUgk0CS8qIEFib3J0L2ZsYWcgb24gU0RMQyB4bWl0IHVuZGVycnVuICovCisjZGVmaW5lCU1BUktJRExFIDgJLyogTWFyay9mbGFnIG9uIGlkbGUgKi8KKyNkZWZpbmUJR0FPUAkweDEwCS8qIEdvIGFjdGl2ZSBvbiBwb2xsICovCisjZGVmaW5lCU5SWgkwCS8qIE5SWiBtb2RlICovCisjZGVmaW5lCU5SWkkJMHgyMAkvKiBOUlpJIG1vZGUgKi8KKyNkZWZpbmUJRk0xCTB4NDAJLyogRk0xICh0cmFuc2l0aW9uID0gMSkgKi8KKyNkZWZpbmUJRk0wCTB4NjAJLyogRk0wICh0cmFuc2l0aW9uID0gMCkgKi8KKyNkZWZpbmUJQ1JDUFMJMHg4MAkvKiBDUkMgUHJlc2V0IEkvTyAqLworCisvKiBXcml0ZSBSZWdpc3RlciAxMSAoQ2xvY2sgTW9kZSBjb250cm9sKSAqLworI2RlZmluZQlUUnhDWFQJMAkvKiBUUnhDID0gWHRhbCBvdXRwdXQgKi8KKyNkZWZpbmUJVFJ4Q1RDCTEJLyogVFJ4QyA9IFRyYW5zbWl0IGNsb2NrICovCisjZGVmaW5lCVRSeENCUgkyCS8qIFRSeEMgPSBCUiBHZW5lcmF0b3IgT3V0cHV0ICovCisjZGVmaW5lCVRSeENEUAkzCS8qIFRSeEMgPSBEUExMIG91dHB1dCAqLworI2RlZmluZQlUUnhDT0kJNAkvKiBUUnhDIE8vSSAqLworI2RlZmluZQlUQ1JUeENQCTAJLyogVHJhbnNtaXQgY2xvY2sgPSBSVHhDIHBpbiAqLworI2RlZmluZQlUQ1RSeENQCTgJLyogVHJhbnNtaXQgY2xvY2sgPSBUUnhDIHBpbiAqLworI2RlZmluZQlUQ0JSCTB4MTAJLyogVHJhbnNtaXQgY2xvY2sgPSBCUiBHZW5lcmF0b3Igb3V0cHV0ICovCisjZGVmaW5lCVRDRFBMTAkweDE4CS8qIFRyYW5zbWl0IGNsb2NrID0gRFBMTCBvdXRwdXQgKi8KKyNkZWZpbmUJUkNSVHhDUAkwCS8qIFJlY2VpdmUgY2xvY2sgPSBSVHhDIHBpbiAqLworI2RlZmluZQlSQ1RSeENQCTB4MjAJLyogUmVjZWl2ZSBjbG9jayA9IFRSeEMgcGluICovCisjZGVmaW5lCVJDQlIJMHg0MAkvKiBSZWNlaXZlIGNsb2NrID0gQlIgR2VuZXJhdG9yIG91dHB1dCAqLworI2RlZmluZQlSQ0RQTEwJMHg2MAkvKiBSZWNlaXZlIGNsb2NrID0gRFBMTCBvdXRwdXQgKi8KKyNkZWZpbmUJUlR4Q1gJMHg4MAkvKiBSVHhDIFh0YWwvTm8gWHRhbCAqLworCisvKiBXcml0ZSBSZWdpc3RlciAxMiAobG93ZXIgYnl0ZSBvZiBiYXVkIHJhdGUgZ2VuZXJhdG9yIHRpbWUgY29uc3RhbnQpICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDEzICh1cHBlciBieXRlIG9mIGJhdWQgcmF0ZSBnZW5lcmF0b3IgdGltZSBjb25zdGFudCkgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgMTQgKE1pc2MgY29udHJvbCBiaXRzKSAqLworI2RlZmluZQlCUkVOQUJMCTEJLyogQmF1ZCByYXRlIGdlbmVyYXRvciBlbmFibGUgKi8KKyNkZWZpbmUJQlJTUkMJMgkvKiBCYXVkIHJhdGUgZ2VuZXJhdG9yIHNvdXJjZSAqLworI2RlZmluZQlEVFJSRVEJNAkvKiBEVFIvUmVxdWVzdCBmdW5jdGlvbiAqLworI2RlZmluZQlBVVRPRUNITyA4CS8qIEF1dG8gRWNobyAqLworI2RlZmluZQlMT09QQkFLCTB4MTAJLyogTG9jYWwgbG9vcGJhY2sgKi8KKyNkZWZpbmUJU0VBUkNICTB4MjAJLyogRW50ZXIgc2VhcmNoIG1vZGUgKi8KKyNkZWZpbmUJUk1DCTB4NDAJLyogUmVzZXQgbWlzc2luZyBjbG9jayAqLworI2RlZmluZQlESVNEUExMCTB4NjAJLyogRGlzYWJsZSBEUExMICovCisjZGVmaW5lCVNTQlIJMHg4MAkvKiBTZXQgRFBMTCBzb3VyY2UgPSBCUiBnZW5lcmF0b3IgKi8KKyNkZWZpbmUJU1NSVHhDCTB4YTAJLyogU2V0IERQTEwgc291cmNlID0gUlR4QyAqLworI2RlZmluZQlTRk1NCTB4YzAJLyogU2V0IEZNIG1vZGUgKi8KKyNkZWZpbmUJU05SWkkJMHhlMAkvKiBTZXQgTlJaSSBtb2RlICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDE1IChleHRlcm5hbC9zdGF0dXMgaW50ZXJydXB0IGNvbnRyb2wpICovCisjZGVmaW5lCVpDSUUJMgkvKiBaZXJvIGNvdW50IElFICovCisjZGVmaW5lCURDRElFCTgJLyogRENEIElFICovCisjZGVmaW5lCVNZTkNJRQkweDEwCS8qIFN5bmMvaHVudCBJRSAqLworI2RlZmluZQlDVFNJRQkweDIwCS8qIENUUyBJRSAqLworI2RlZmluZQlUeFVJRQkweDQwCS8qIFR4IFVuZGVycnVuL0VPTSBJRSAqLworI2RlZmluZQlCUktJRQkweDgwCS8qIEJyZWFrL0Fib3J0IElFICovCisKKworLyogUmVhZCBSZWdpc3RlciAwICovCisjZGVmaW5lCVJ4X0NIX0FWCTB4MQkvKiBSeCBDaGFyYWN0ZXIgQXZhaWxhYmxlICovCisjZGVmaW5lCVpDT1VOVAkJMHgyCS8qIFplcm8gY291bnQgKi8KKyNkZWZpbmUJVHhfQlVGX0VNUAkweDQJLyogVHggQnVmZmVyIGVtcHR5ICovCisjZGVmaW5lCURDRAkJMHg4CS8qIERDRCAqLworI2RlZmluZQlTWU5DX0hVTlQJMHgxMAkvKiBTeW5jL2h1bnQgKi8KKyNkZWZpbmUJQ1RTCQkweDIwCS8qIENUUyAqLworI2RlZmluZQlUeEVPTQkJMHg0MAkvKiBUeCB1bmRlcnJ1biAqLworI2RlZmluZQlCUktfQUJSVAkweDgwCS8qIEJyZWFrL0Fib3J0ICovCisKKy8qIFJlYWQgUmVnaXN0ZXIgMSAqLworI2RlZmluZQlBTExfU05UCQkweDEJLyogQWxsIHNlbnQgKi8KKy8qIFJlc2lkdWUgRGF0YSBmb3IgOCBSeCBiaXRzL2NoYXIgcHJvZ3JhbW1lZCAqLworI2RlZmluZQlSRVMzCQkweDgJLyogMC8zICovCisjZGVmaW5lCVJFUzQJCTB4NAkvKiAwLzQgKi8KKyNkZWZpbmUJUkVTNQkJMHhjCS8qIDAvNSAqLworI2RlZmluZQlSRVM2CQkweDIJLyogMC82ICovCisjZGVmaW5lCVJFUzcJCTB4YQkvKiAwLzcgKi8KKyNkZWZpbmUJUkVTOAkJMHg2CS8qIDAvOCAqLworI2RlZmluZQlSRVMxOAkJMHhlCS8qIDEvOCAqLworI2RlZmluZQlSRVMyOAkJMHgwCS8qIDIvOCAqLworLyogU3BlY2lhbCBSeCBDb25kaXRpb24gSW50ZXJydXB0cyAqLworI2RlZmluZQlQQVJfRVJSCQkweDEwCS8qIFBhcml0eSBlcnJvciAqLworI2RlZmluZQlSeF9PVlIJCTB4MjAJLyogUnggT3ZlcnJ1biBFcnJvciAqLworI2RlZmluZQlDUkNfRVJSCQkweDQwCS8qIENSQy9GcmFtaW5nIEVycm9yICovCisjZGVmaW5lCUVORF9GUgkJMHg4MAkvKiBFbmQgb2YgRnJhbWUgKFNETEMpICovCisKKy8qIFJlYWQgUmVnaXN0ZXIgMiAoY2hhbm5lbCBiIG9ubHkpIC0gSW50ZXJydXB0IHZlY3RvciAqLworCisvKiBSZWFkIFJlZ2lzdGVyIDMgKGludGVycnVwdCBwZW5kaW5nIHJlZ2lzdGVyKSBjaCBhIG9ubHkgKi8KKyNkZWZpbmUJQ0hCRVhUCTB4MQkJLyogQ2hhbm5lbCBCIEV4dC9TdGF0IElQICovCisjZGVmaW5lCUNIQlR4SVAJMHgyCQkvKiBDaGFubmVsIEIgVHggSVAgKi8KKyNkZWZpbmUJQ0hCUnhJUAkweDQJCS8qIENoYW5uZWwgQiBSeCBJUCAqLworI2RlZmluZQlDSEFFWFQJMHg4CQkvKiBDaGFubmVsIEEgRXh0L1N0YXQgSVAgKi8KKyNkZWZpbmUJQ0hBVHhJUAkweDEwCQkvKiBDaGFubmVsIEEgVHggSVAgKi8KKyNkZWZpbmUJQ0hBUnhJUAkweDIwCQkvKiBDaGFubmVsIEEgUnggSVAgKi8KKworLyogUmVhZCBSZWdpc3RlciA4IChyZWNlaXZlIGRhdGEgcmVnaXN0ZXIpICovCisKKy8qIFJlYWQgUmVnaXN0ZXIgMTAgIChtaXNjIHN0YXR1cyBiaXRzKSAqLworI2RlZmluZQlPTkxPT1AJMgkJLyogT24gbG9vcCAqLworI2RlZmluZQlMT09QU0VORCAweDEwCQkvKiBMb29wIHNlbmRpbmcgKi8KKyNkZWZpbmUJQ0xLMk1JUwkweDQwCQkvKiBUd28gY2xvY2tzIG1pc3NpbmcgKi8KKyNkZWZpbmUJQ0xLMU1JUwkweDgwCQkvKiBPbmUgY2xvY2sgbWlzc2luZyAqLworCisvKiBSZWFkIFJlZ2lzdGVyIDEyIChsb3dlciBieXRlIG9mIGJhdWQgcmF0ZSBnZW5lcmF0b3IgY29uc3RhbnQpICovCisKKy8qIFJlYWQgUmVnaXN0ZXIgMTMgKHVwcGVyIGJ5dGUgb2YgYmF1ZCByYXRlIGdlbmVyYXRvciBjb25zdGFudCkgKi8KKworLyogUmVhZCBSZWdpc3RlciAxNSAodmFsdWUgb2YgV1IgMTUpICovCisKKy8qIFo4NUMzMC9aODUyMzAgRW5oYW5jZWQgU0NDIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDcnIChTRExDL0hETEMgUHJvZ3JhbW1hYmxlIEVuaGFuY2VtZW50cykgKi8KKyNkZWZpbmUgQVVUT1RYRgkweDAxCQkvKiBBdXRvIFR4IEZsYWcgKi8KKyNkZWZpbmUgQVVUT0VPTSAweDAyCQkvKiBBdXRvIEVPTSBMYXRjaCBSZXNldCAqLworI2RlZmluZSBBVVRPUlRTCTB4MDQJCS8qIEF1dG8gUlRTICovCisjZGVmaW5lIFRYRE5SWkkgMHgwOAkJLyogVHhEIFB1bGxlZCBIaWdoIGluIFNETEMgTlJaSSBtb2RlICovCisjZGVmaW5lIFJYRklGT0ggMHgwOAkJLyogWjg1MjMwOiBJbnQgb24gUlggRklGTyBoYWxmIGZ1bGwgKi8KKyNkZWZpbmUgRkFTVERUUiAweDEwCQkvKiBGYXN0IERUUi9SRVEgTW9kZSAqLworI2RlZmluZSBDUkNDQkNSCTB4MjAJCS8qIENSQyBDaGVjayBCeXRlcyBDb21wbGV0ZWx5IFJlY2VpdmVkICovCisjZGVmaW5lIFRYRklGT0UgMHgyMAkJLyogWjg1MjMwOiBJbnQgb24gVFggRklGTyBjb21wbGV0ZWx5IGVtcHR5ICovCisjZGVmaW5lIEVYVFJERU4JMHg0MAkJLyogRXh0ZW5kZWQgUmVhZCBFbmFibGVkICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDE1IChleHRlcm5hbC9zdGF0dXMgaW50ZXJydXB0IGNvbnRyb2wpICovCisjZGVmaW5lIFNIRExDRQkxCQkvKiBTRExDL0hETEMgRW5oYW5jZW1lbnRzIEVuYWJsZSAqLworI2RlZmluZSBGSUZPRQk0CQkvKiBGSUZPIEVuYWJsZSAqLworCisvKiBSZWFkIFJlZ2lzdGVyIDYgKGZyYW1lIHN0YXR1cyBGSUZPKSAqLworI2RlZmluZSBCQ0xTQgkweGZmCQkvKiBMU0Igb2YgMTQgYml0cyBjb3VudCAqLworCisvKiBSZWFkIFJlZ2lzdGVyIDcgKGZyYW1lIHN0YXR1cyBGSUZPKSAqLworI2RlZmluZSBCQ01TQgkweDNmCQkvKiBNU0Igb2YgMTQgYml0cyBjb3VudCAqLworI2RlZmluZSBGREEJMHg0MAkJLyogRklGTyBEYXRhIEF2YWlsYWJsZSBTdGF0dXMgKi8KKyNkZWZpbmUgRk9TCTB4ODAJCS8qIEZJRk8gT3ZlcmZsb3cgU3RhdHVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ocC1wbHVzLmMgYi9kcml2ZXJzL25ldC9ocC1wbHVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzNDMxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2hwLXBsdXMuYwpAQCAtMCwwICsxLDQ5NSBAQAorLyogaHAtcGx1cy5jOiBBIEhQIFBDTEFOL3BsdXMgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eC4gKi8KKy8qCisJV3JpdHRlbiAxOTk0IGJ5IERvbmFsZCBCZWNrZXIuCisKKwlUaGlzIGRyaXZlciBpcyBmb3IgdGhlIEhld2xldHQgUGFja2FyZCBQQyBMQU4gKDI3KioqKSBwbHVzIGV0aGVyY2FyZHMuCisJVGhlc2UgY2FyZHMgYXJlIHNvbGQgdW5kZXIgc2V2ZXJhbCBtb2RlbCBudW1iZXJzLCB1c3VhbGx5IDI3MjQqLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKwlBcyBpcyBvZnRlbiB0aGUgY2FzZSwgYSBncmVhdCBkZWFsIG9mIGNyZWRpdCBpcyBvd2VkIHRvIFJ1c3MgTmVsc29uLgorCVRoZSBDcnlud3IgcGFja2V0IGRyaXZlciB3YXMgbXkgcHJpbWFyeSBzb3VyY2Ugb2YgSFAtc3BlY2lmaWMKKwlwcm9ncmFtbWluZyBpbmZvcm1hdGlvbi4KKyovCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9CisiaHAtcGx1cy5jOnYxLjEwIDkvMjQvOTQgRG9uYWxkIEJlY2tlciAoYmVja2VyQGNlc2Rpcy5nc2ZjLm5hc2EuZ292KVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CQkvKiBJbXBvcnRhbnQgLS0gdGhpcyBpbmxpbmVzIHdvcmQgbW92ZXMuICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAiODM5MC5oIgorCisjZGVmaW5lIERSVl9OQU1FICJocC1wbHVzIgorCisvKiBBIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIEkvTyBhZGRyZXNzZXMgdG8gYmUgcHJvYmVkLiAqLworc3RhdGljIHVuc2lnbmVkIGludCBocHBsdXNfcG9ydGxpc3RbXSBfX2luaXRkYXRhID0KK3sweDIwMCwgMHgyNDAsIDB4MjgwLCAweDJDMCwgMHgzMDAsIDB4MzIwLCAweDM0MCwgMH07CisKKy8qCisgICBUaGUgSFAgRXRoZXJUd2lzdCBjaGlwIGltcGxlbWVudGF0aW9uIGlzIGEgZmFpcmx5IHJvdXRpbmUgRFA4MzkwCisgICBpbXBsZW1lbnRhdGlvbi4gIEl0IGFsbG93cyBib3RoIHNoYXJlZCBtZW1vcnkgYW5kIHByb2dyYW1tZWQtSS9PIGJ1ZmZlcgorICAgYWNjZXNzLCB1c2luZyBhIGN1c3RvbSBpbnRlcmZhY2UgZm9yIGJvdGguICBUaGUgcHJvZ3JhbW1lZC1JL08gbW9kZSBpcworICAgZW50aXJlbHkgaW1wbGVtZW50ZWQgaW4gdGhlIEhQIEV0aGVyVHdpc3QgY2hpcCwgYnlwYXNzaW5nIHRoZSBwcm9ibGVtCisgICByaWRkZW4gYnVpbHQtaW4gODM5MCBmYWNpbGl0aWVzIHVzZWQgb24gTkUyMDAwIGRlc2lnbnMuICBUaGUgc2hhcmVkCisgICBtZW1vcnkgbW9kZSBpcyBsaWtld2lzZSBzcGVjaWFsLCB3aXRoIGFuIG9mZnNldCByZWdpc3RlciB1c2VkIHRvIG1ha2UKKyAgIHBhY2tldHMgYXBwZWFyIGF0IHRoZSBzaGFyZWQgbWVtb3J5IGJhc2UuICBCb3RoIG1vZGVzIHVzZSBhIGJhc2UgYW5kIGJvdW5kcworICAgcGFnZSByZWdpc3RlciB0byBoaWRlIHRoZSBSeCByaW5nIGJ1ZmZlciB3cmFwIC0tIGEgcGFja2V0IHRoYXQgc3BhbnMgdGhlCisgICBlbmQgb2YgcGh5c2ljYWwgYnVmZmVyIG1lbW9yeSBhcHBlYXJzIGNvbnRpbnVvdXMgdG8gdGhlIGRyaXZlci4gKGMuZi4gdGhlCisgICAzYzUwMyBhbmQgQ2FibGV0cm9uIEUyMTAwKQorCisgICBBIHNwZWNpYWwgbm90ZTogdGhlIGludGVybmFsIGJ1ZmZlciBvZiB0aGUgYm9hcmQgaXMgb25seSA4IGJpdHMgd2lkZS4KKyAgIFRoaXMgbGF5cyBzZXZlcmFsIG5hc3R5IHRyYXBzIGZvciB0aGUgdW5hd2FyZToKKyAgIC0gdGhlIDgzOTAgbXVzdCBiZSBwcm9ncmFtbWVkIGZvciBieXRlLXdpZGUgb3BlcmF0aW9ucworICAgLSBhbGwgSS9PIGFuZCBtZW1vcnkgb3BlcmF0aW9ucyBtdXN0IHdvcmsgb24gd2hvbGUgd29yZHMgKHRoZSBhY2Nlc3MKKyAgICAgbGF0Y2hlcyBhcmUgc2VyaWFsbHkgcHJlbG9hZGVkIGFuZCBoYXZlIG5vIGJ5dGUtc3dhcHBpbmcgYWJpbGl0eSkuCisKKyAgIFRoaXMgYm9hcmQgaXMgbGFpZCBvdXQgaW4gSS9PIHNwYWNlIG11Y2ggbGlrZSB0aGUgZWFybGllciBIUCBib2FyZHM6CisgICB0aGUgZmlyc3QgMTYgbG9jYXRpb25zIGFyZSBmb3IgdGhlIGJvYXJkIHJlZ2lzdGVycywgYW5kIHRoZSBzZWNvbmQgMTYgYXJlCisgICBmb3IgdGhlIDgzOTAuICBUaGUgYm9hcmQgaXMgZWFzeSB0byBpZGVudGlmeSwgd2l0aCBib3RoIGEgZGVkaWNhdGVkIDE2IGJpdAorICAgSUQgcmVnaXN0ZXIgYW5kIGEgY29uc3RhbnQgMHg1MzAqIHZhbHVlIGluIHRoZSB1cHBlciBiaXRzIG9mIHRoZSBwYWdpbmcKKyAgIHJlZ2lzdGVyLgorKi8KKworI2RlZmluZSBIUF9JRAkJCTB4MDAJLyogSUQgcmVnaXN0ZXIsIGFsd2F5cyAweDQ4NTAuICovCisjZGVmaW5lIEhQX1BBR0lORwkJMHgwMgkvKiBSZWdpc3RlcnMgdmlzaWJsZSBAIDgtZiwgc2VlIFBhZ2VOYW1lLiAqLworI2RlZmluZSBIUFBfT1BUSU9OCQkweDA0CS8qIEJpdG1hcHBlZCBvcHRpb25zLCBzZWUgSFBfT3B0aW9uLgkqLworI2RlZmluZSBIUFBfT1VUX0FERFIJMHgwOAkvKiBJL08gb3V0cHV0IGxvY2F0aW9uIGluIFBlcmZfUGFnZS4JKi8KKyNkZWZpbmUgSFBQX0lOX0FERFIJCTB4MEEJLyogSS9PIGlucHV0IGxvY2F0aW9uIGluIFBlcmZfUGFnZS4JCSovCisjZGVmaW5lIEhQX0RBVEFQT1JUCQkweDBjCS8qIEkvTyBkYXRhIHRyYW5zZmVyIGluIFBlcmZfUGFnZS4JCSovCisjZGVmaW5lIE5JQ19PRkZTRVQJCTB4MTAJLyogT2Zmc2V0IHRvIHRoZSA4MzkwIHJlZ2lzdGVycy4JCSovCisjZGVmaW5lIEhQX0lPX0VYVEVOVAkzMgorCisjZGVmaW5lIEhQX1NUQVJUX1BHCQkweDAwCS8qIEZpcnN0IHBhZ2Ugb2YgVFggYnVmZmVyICovCisjZGVmaW5lIEhQX1NUT1BfUEcJCTB4ODAJLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcgKi8KKworLyogVGhlIHJlZ2lzdGVyIHNldCBzZWxlY3RlZCBpbiBIUF9QQUdJTkcuICovCitlbnVtIFBhZ2VOYW1lIHsKKwlQZXJmX1BhZ2UgPSAwLAkJCQkvKiBOb3JtYWwgb3BlcmF0aW9uLiAqLworCU1BQ19QYWdlID0gMSwJCQkJLyogVGhlIGV0aGVybmV0IGFkZHJlc3MgKCtjaGVja3N1bSkuICovCisJSFdfUGFnZSA9IDIsCQkJCS8qIEVFUFJPTS1sb2FkZWQgaGFyZHdhcmUgcGFyYW1ldGVycy4gKi8KKwlMQU5fUGFnZSA9IDQsCQkJCS8qIFRyYW5zY2VpdmVyIHNlbGVjdGlvbiwgdGVzdGluZywgZXRjLiAqLworCUlEX1BhZ2UgPSA2IH07CisKKy8qIFRoZSBiaXQgZGVmaW5pdGlvbnMgZm9yIHRoZSBIUFBfT1BUSU9OIHJlZ2lzdGVyLiAqLworZW51bSBIUF9PcHRpb24geworCU5JQ1Jlc2V0ID0gMSwgQ2hpcFJlc2V0ID0gMiwgCS8qIEFjdGl2ZSBsb3csIHJlYWxseSBVTnJlc2V0LiAqLworCUVuYWJsZUlSUSA9IDQsIEZha2VJbnRyID0gOCwgQm9vdFJPTUVuYiA9IDB4MTAsIElPRW5iID0gMHgyMCwKKwlNZW1FbmFibGUgPSAweDQwLCBaZXJvV2FpdCA9IDB4ODAsIE1lbURpc2FibGUgPSAweDEwMDAsIH07CisKK3N0YXRpYyBpbnQgaHBwX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKTsKKworc3RhdGljIHZvaWQgaHBwX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGhwcF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBocHBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBocHBfbWVtX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIGhwcF9tZW1fYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydF9wYWdlKTsKK3N0YXRpYyB2b2lkIGhwcF9tZW1fZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsCisJCQkJCQkgIGludCByaW5nX3BhZ2UpOworc3RhdGljIHZvaWQgaHBwX2lvX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIGhwcF9pb19ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHN0YXJ0X3BhZ2UpOworc3RhdGljIHZvaWQgaHBwX2lvX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLAorCQkJCQkJICBpbnQgcmluZ19wYWdlKTsKKworDAorLyoJUHJvYmUgYSBsaXN0IG9mIGFkZHJlc3NlcyBmb3IgYW4gSFAgTEFOKyBhZGFwdG9yLgorCVRoaXMgcm91dGluZSBpcyBhbG1vc3QgYm9pbGVycGxhdGUuICovCisKK3N0YXRpYyBpbnQgX19pbml0IGRvX2hwcF9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCWludCBiYXNlX2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaXJxID0gZGV2LT5pcnE7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZiAoYmFzZV9hZGRyID4gMHgxZmYpCQkvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCXJldHVybiBocHBfcHJvYmUxKGRldiwgYmFzZV9hZGRyKTsKKwllbHNlIGlmIChiYXNlX2FkZHIgIT0gMCkJLyogRG9uJ3QgcHJvYmUgYXQgYWxsLiAqLworCQlyZXR1cm4gLUVOWElPOworCisJZm9yIChpID0gMDsgaHBwbHVzX3BvcnRsaXN0W2ldOyBpKyspIHsKKwkJaWYgKGhwcF9wcm9iZTEoZGV2LCBocHBsdXNfcG9ydGxpc3RbaV0pID09IDApCisJCQlyZXR1cm4gMDsKKwkJZGV2LT5pcnEgPSBpcnE7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIE5COiBocHBfY2xvc2UoKSBoYW5kbGVzIGZyZWVfaXJxICovCisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIgLSBOSUNfT0ZGU0VULCBIUF9JT19FWFRFTlQpOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgaHBfcGx1c19wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCisJZXJyID0gZG9faHBwX3Byb2JlKGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCWNsZWFudXBfY2FyZChkZXYpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKyNlbmRpZgorCisvKiBEbyB0aGUgaW50ZXJlc3RpbmcgcGFydCBvZiB0aGUgcHJvYmUgYXQgYSBzaW5nbGUgYWRkcmVzcy4gKi8KK3N0YXRpYyBpbnQgX19pbml0IGhwcF9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKwlpbnQgaSwgcmV0dmFsOworCXVuc2lnbmVkIGNoYXIgY2hlY2tzdW0gPSAwOworCWNvbnN0IGNoYXIgbmFtZVtdID0gIkhQLVBDLUxBTisiOworCWludCBtZW1fc3RhcnQ7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBIUF9JT19FWFRFTlQsIERSVl9OQU1FKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIENoZWNrIGZvciB0aGUgSFArIHNpZ25hdHVyZSwgNTAgNDggMHggNTMuICovCisJaWYgKGludyhpb2FkZHIgKyBIUF9JRCkgIT0gMHg0ODUwCisJCXx8IChpbncoaW9hZGRyICsgSFBfUEFHSU5HKSAmIDB4ZmZmMCkgIT0gMHg1MzAwKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChlaV9kZWJ1ZyAgJiYgIHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayh2ZXJzaW9uKTsKKworCXByaW50aygiJXM6ICVzIGF0ICUjM3gsIiwgZGV2LT5uYW1lLCBuYW1lLCBpb2FkZHIpOworCisJLyogUmV0cmlldmUgYW5kIGNoZWNrc3VtIHRoZSBzdGF0aW9uIGFkZHJlc3MuICovCisJb3V0dyhNQUNfUGFnZSwgaW9hZGRyICsgSFBfUEFHSU5HKTsKKworCWZvcihpID0gMDsgaSA8IEVUSEVSX0FERFJfTEVOOyBpKyspIHsKKwkJdW5zaWduZWQgY2hhciBpbnZhbCA9IGluYihpb2FkZHIgKyA4ICsgaSk7CisJCWRldi0+ZGV2X2FkZHJbaV0gPSBpbnZhbDsKKwkJY2hlY2tzdW0gKz0gaW52YWw7CisJCXByaW50aygiICUyLjJ4IiwgaW52YWwpOworCX0KKwljaGVja3N1bSArPSBpbmIoaW9hZGRyICsgMTQpOworCisJaWYgKGNoZWNrc3VtICE9IDB4ZmYpIHsKKwkJcHJpbnRrKCIgYmFkIGNoZWNrc3VtICUyLjJ4LlxuIiwgY2hlY2tzdW0pOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9IGVsc2UgeworCQkvKiBQb2ludCBhdCB0aGUgU29mdHdhcmUgQ29uZmlndXJhdGlvbiBGbGFncy4gKi8KKwkJb3V0dyhJRF9QYWdlLCBpb2FkZHIgKyBIUF9QQUdJTkcpOworCQlwcmludGsoIiBJRCAlNC40eCIsIGludyhpb2FkZHIgKyAxMikpOworCX0KKworCS8qIFJlYWQgdGhlIElSUSBsaW5lLiAqLworCW91dHcoSFdfUGFnZSwgaW9hZGRyICsgSFBfUEFHSU5HKTsKKwl7CisJCWludCBpcnEgPSBpbmIoaW9hZGRyICsgMTMpICYgMHgwZjsKKwkJaW50IG9wdGlvbiA9IGludyhpb2FkZHIgKyBIUFBfT1BUSU9OKTsKKworCQlkZXYtPmlycSA9IGlycTsKKwkJaWYgKG9wdGlvbiAmIE1lbUVuYWJsZSkgeworCQkJbWVtX3N0YXJ0ID0gaW53KGlvYWRkciArIDkpIDw8IDg7CisJCQlwcmludGsoIiwgSVJRICVkLCBtZW1vcnkgYWRkcmVzcyAlI3guXG4iLCBpcnEsIG1lbV9zdGFydCk7CisJCX0gZWxzZSB7CisJCQltZW1fc3RhcnQgPSAwOworCQkJcHJpbnRrKCIsIElSUSAlZCwgcHJvZ3JhbW1lZC1JL08gbW9kZS5cbiIsIGlycSk7CisJCX0KKwl9CisKKwkvKiBTZXQgdGhlIHdyYXAgcmVnaXN0ZXJzIGZvciBzdHJpbmcgSS9PIHJlYWRzLiAgICovCisJb3V0dygoSFBfU1RBUlRfUEcgKyBUWF9QQUdFUy8yKSB8ICgoSFBfU1RPUF9QRyAtIDEpIDw8IDgpLCBpb2FkZHIgKyAxNCk7CisKKwkvKiBTZXQgdGhlIGJhc2UgYWRkcmVzcyB0byBwb2ludCB0byB0aGUgTklDLCBub3QgdGhlICJyZWFsIiBiYXNlISAqLworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyICsgTklDX09GRlNFVDsKKworCWRldi0+b3BlbiA9ICZocHBfb3BlbjsKKwlkZXYtPnN0b3AgPSAmaHBwX2Nsb3NlOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlaV9wb2xsOworI2VuZGlmCisKKwllaV9zdGF0dXMubmFtZSA9IG5hbWU7CisJZWlfc3RhdHVzLndvcmQxNiA9IDA7CQkvKiBBZ2dnZ2hoaGhoISBEZWJ1ZyB0aW1lOiAyIGRheXMhICovCisJZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBIUF9TVEFSVF9QRzsKKwllaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IEhQX1NUQVJUX1BHICsgVFhfUEFHRVMvMjsKKwllaV9zdGF0dXMuc3RvcF9wYWdlID0gSFBfU1RPUF9QRzsKKworCWVpX3N0YXR1cy5yZXNldF84MzkwID0gJmhwcF9yZXNldF84MzkwOworCWVpX3N0YXR1cy5ibG9ja19pbnB1dCA9ICZocHBfaW9fYmxvY2tfaW5wdXQ7CisJZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZocHBfaW9fYmxvY2tfb3V0cHV0OworCWVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmaHBwX2lvX2dldF84MzkwX2hkcjsKKworCS8qIENoZWNrIGlmIHRoZSBtZW1vcnlfZW5hYmxlIGZsYWcgaXMgc2V0IGluIHRoZSBvcHRpb24gcmVnaXN0ZXIuICovCisJaWYgKG1lbV9zdGFydCkgeworCQllaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmaHBwX21lbV9ibG9ja19pbnB1dDsKKwkJZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZocHBfbWVtX2Jsb2NrX291dHB1dDsKKwkJZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZocHBfbWVtX2dldF84MzkwX2hkcjsKKwkJZGV2LT5tZW1fc3RhcnQgPSBtZW1fc3RhcnQ7CisJCWVpX3N0YXR1cy5ybWVtX3N0YXJ0ID0gZGV2LT5tZW1fc3RhcnQgKyBUWF9QQUdFUy8yKjI1NjsKKwkJZGV2LT5tZW1fZW5kID0gZWlfc3RhdHVzLnJtZW1fZW5kCisJCQk9IGRldi0+bWVtX3N0YXJ0ICsgKEhQX1NUT1BfUEcgLSBIUF9TVEFSVF9QRykqMjU2OworCX0KKworCW91dHcoUGVyZl9QYWdlLCBpb2FkZHIgKyBIUF9QQUdJTkcpOworCU5TODM5MF9pbml0KGRldiwgMCk7CisJLyogTGVhdmUgdGhlIDgzOTAgYW5kIEhQIGNoaXAgcmVzZXQuICovCisJb3V0dyhpbncoaW9hZGRyICsgSFBQX09QVElPTikgJiB+RW5hYmxlSVJRLCBpb2FkZHIgKyBIUFBfT1BUSU9OKTsKKworCXJldHVybiAwOworb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgSFBfSU9fRVhURU5UKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitocHBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciAtIE5JQ19PRkZTRVQ7CisJaW50IG9wdGlvbl9yZWc7CisJaW50IHJldHZhbDsKKworCWlmICgocmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGVpX2ludGVycnVwdCwgMCwgZGV2LT5uYW1lLCBkZXYpKSkgeworCSAgICByZXR1cm4gcmV0dmFsOworCX0KKworCS8qIFJlc2V0IHRoZSA4MzkwIGFuZCBIUCBjaGlwLiAqLworCW9wdGlvbl9yZWcgPSBpbncoaW9hZGRyICsgSFBQX09QVElPTik7CisJb3V0dyhvcHRpb25fcmVnICYgfihOSUNSZXNldCArIENoaXBSZXNldCksIGlvYWRkciArIEhQUF9PUFRJT04pOworCXVkZWxheSg1KTsKKwkvKiBVbnJlc2V0IHRoZSBib2FyZCBhbmQgZW5hYmxlIGludGVycnVwdHMuICovCisJb3V0dyhvcHRpb25fcmVnIHwgKEVuYWJsZUlSUSArIE5JQ1Jlc2V0ICsgQ2hpcFJlc2V0KSwgaW9hZGRyICsgSFBQX09QVElPTik7CisKKwkvKiBTZXQgdGhlIHdyYXAgcmVnaXN0ZXJzIGZvciBwcm9ncmFtbWVkLUkvTyBvcGVyYXRpb24uICAgKi8KKwlvdXR3KEhXX1BhZ2UsIGlvYWRkciArIEhQX1BBR0lORyk7CisJb3V0dygoSFBfU1RBUlRfUEcgKyBUWF9QQUdFUy8yKSB8ICgoSFBfU1RPUF9QRyAtIDEpIDw8IDgpLCBpb2FkZHIgKyAxNCk7CisKKwkvKiBTZWxlY3QgdGhlIG9wZXJhdGlvbmFsIHBhZ2UuICovCisJb3V0dyhQZXJmX1BhZ2UsIGlvYWRkciArIEhQX1BBR0lORyk7CisKKwllaV9vcGVuKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2hwcF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciAtIE5JQ19PRkZTRVQ7CisJaW50IG9wdGlvbl9yZWcgPSBpbncoaW9hZGRyICsgSFBQX09QVElPTik7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwllaV9jbG9zZShkZXYpOworCW91dHcoKG9wdGlvbl9yZWcgJiB+RW5hYmxlSVJRKSB8IE1lbURpc2FibGUgfCBOSUNSZXNldCB8IENoaXBSZXNldCwKKwkJIGlvYWRkciArIEhQUF9PUFRJT04pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitocHBfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciAtIE5JQ19PRkZTRVQ7CisJaW50IG9wdGlvbl9yZWcgPSBpbncoaW9hZGRyICsgSFBQX09QVElPTik7CisKKwlpZiAoZWlfZGVidWcgPiAxKSBwcmludGsoInJlc2V0dGluZyB0aGUgODM5MCB0aW1lPSVsZC4uLiIsIGppZmZpZXMpOworCisJb3V0dyhvcHRpb25fcmVnICYgfihOSUNSZXNldCArIENoaXBSZXNldCksIGlvYWRkciArIEhQUF9PUFRJT04pOworCS8qIFBhdXNlIGEgZmV3IGN5Y2xlcyBmb3IgdGhlIGhhcmR3YXJlIHJlc2V0IHRvIHRha2UgcGxhY2UuICovCisJdWRlbGF5KDUpOworCWVpX3N0YXR1cy50eGluZyA9IDA7CisJb3V0dyhvcHRpb25fcmVnIHwgKEVuYWJsZUlSUSArIE5JQ1Jlc2V0ICsgQ2hpcFJlc2V0KSwgaW9hZGRyICsgSFBQX09QVElPTik7CisKKwl1ZGVsYXkoNSk7CisKKworCWlmICgoaW5iX3AoaW9hZGRyK05JQ19PRkZTRVQrRU4wX0lTUikgJiBFTklTUl9SRVNFVCkgPT0gMCkKKwkJcHJpbnRrKCIlczogaHBfcmVzZXRfODM5MCgpIGRpZCBub3QgY29tcGxldGUuXG4iLCBkZXYtPm5hbWUpOworCisJaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCI4MzkwIHJlc2V0IGRvbmUgKCVsZCkuIiwgamlmZmllcyk7CisJcmV0dXJuOworfQorCisvKiBUaGUgcHJvZ3JhbW1lZC1JL08gdmVyc2lvbiBvZiByZWFkaW5nIHRoZSA0IGJ5dGUgODM5MCBzcGVjaWZpYyBoZWFkZXIuCisgICBOb3RlIHRoYXQgdHJhbnNmZXIgd2l0aCB0aGUgRXRoZXJUd2lzdCsgbXVzdCBiZSBvbiB3b3JkIGJvdW5kYXJpZXMuICovCisKK3N0YXRpYyB2b2lkCitocHBfaW9fZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsIGludCByaW5nX3BhZ2UpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyIC0gTklDX09GRlNFVDsKKworCW91dHcoKHJpbmdfcGFnZTw8OCksIGlvYWRkciArIEhQUF9JTl9BRERSKTsKKwlpbnN3KGlvYWRkciArIEhQX0RBVEFQT1JULCBoZHIsIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcik+PjEpOworfQorCisvKiBCbG9jayBpbnB1dCBhbmQgb3V0cHV0LCBzaW1pbGFyIHRvIHRoZSBDcnlud3IgcGFja2V0IGRyaXZlci4gKi8KKworc3RhdGljIHZvaWQKK2hwcF9pb19ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCkKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIgLSBOSUNfT0ZGU0VUOworCWNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKKworCW91dHcocmluZ19vZmZzZXQsIGlvYWRkciArIEhQUF9JTl9BRERSKTsKKwlpbnN3KGlvYWRkciArIEhQX0RBVEFQT1JULCBidWYsIGNvdW50Pj4xKTsKKwlpZiAoY291bnQgJiAweDAxKQorICAgICAgICBidWZbY291bnQtMV0gPSBpbncoaW9hZGRyICsgSFBfREFUQVBPUlQpOworfQorCisvKiBUaGUgY29ycmVzcG9uZGluZyBzaGFyZWQgbWVtb3J5IHZlcnNpb25zIG9mIHRoZSBhYm92ZSAyIGZ1bmN0aW9ucy4gKi8KKworc3RhdGljIHZvaWQKK2hwcF9tZW1fZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsIGludCByaW5nX3BhZ2UpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyIC0gTklDX09GRlNFVDsKKwlpbnQgb3B0aW9uX3JlZyA9IGludyhpb2FkZHIgKyBIUFBfT1BUSU9OKTsKKworCW91dHcoKHJpbmdfcGFnZTw8OCksIGlvYWRkciArIEhQUF9JTl9BRERSKTsKKwlvdXR3KG9wdGlvbl9yZWcgJiB+KE1lbURpc2FibGUgKyBCb290Uk9NRW5iKSwgaW9hZGRyICsgSFBQX09QVElPTik7CisJaXNhX21lbWNweV9mcm9taW8oaGRyLCBkZXYtPm1lbV9zdGFydCwgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSk7CisJb3V0dyhvcHRpb25fcmVnLCBpb2FkZHIgKyBIUFBfT1BUSU9OKTsKKwloZHItPmNvdW50ID0gKGxlMTZfdG9fY3B1KGhkci0+Y291bnQpICsgMykgJiB+MzsJLyogUm91bmQgdXAgYWxsb2NhdGlvbi4gKi8KK30KKworc3RhdGljIHZvaWQKK2hwcF9tZW1fYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyIC0gTklDX09GRlNFVDsKKwlpbnQgb3B0aW9uX3JlZyA9IGludyhpb2FkZHIgKyBIUFBfT1BUSU9OKTsKKworCW91dHcocmluZ19vZmZzZXQsIGlvYWRkciArIEhQUF9JTl9BRERSKTsKKworCW91dHcob3B0aW9uX3JlZyAmIH4oTWVtRGlzYWJsZSArIEJvb3RST01FbmIpLCBpb2FkZHIgKyBIUFBfT1BUSU9OKTsKKworCS8qIENhdXRpb246IHRoaXMgcmVsaWVzIG9uIGdldF84MzkwX2hkcigpIHJvdW5kaW5nIHVwIGNvdW50IQorCSAgIEFsc28gbm90ZSB0aGF0IHdlICpjYW4ndCogdXNlIGV0aF9pb19jb3B5X2FuZF9zdW0oKSBiZWNhdXNlCisJICAgaXQgd2lsbCBub3QgYWx3YXlzIGNvcHkgImNvdW50IiBieXRlcyAoZS5nLiBwYWRkZWQgSVApLiAgKi8KKworCWlzYV9tZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgZGV2LT5tZW1fc3RhcnQsIGNvdW50KTsKKwlvdXR3KG9wdGlvbl9yZWcsIGlvYWRkciArIEhQUF9PUFRJT04pOworfQorCisvKiBBIHNwZWNpYWwgbm90ZTogd2UgKm11c3QqIGFsd2F5cyB0cmFuc2ZlciA+PTE2IGJpdCB3b3Jkcy4KKyAgIEl0J3MgYWx3YXlzIHNhZmUgdG8gcm91bmQgdXAsIHNvIHdlIGRvLiAqLworc3RhdGljIHZvaWQKK2hwcF9pb19ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydF9wYWdlKQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciAtIE5JQ19PRkZTRVQ7CisJb3V0dyhzdGFydF9wYWdlIDw8IDgsIGlvYWRkciArIEhQUF9PVVRfQUREUik7CisJb3V0c2woaW9hZGRyICsgSFBfREFUQVBPUlQsIGJ1ZiwgKGNvdW50KzMpPj4yKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitocHBfbWVtX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RhcnRfcGFnZSkKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIgLSBOSUNfT0ZGU0VUOworCWludCBvcHRpb25fcmVnID0gaW53KGlvYWRkciArIEhQUF9PUFRJT04pOworCisJb3V0dyhzdGFydF9wYWdlIDw8IDgsIGlvYWRkciArIEhQUF9PVVRfQUREUik7CisJb3V0dyhvcHRpb25fcmVnICYgfihNZW1EaXNhYmxlICsgQm9vdFJPTUVuYiksIGlvYWRkciArIEhQUF9PUFRJT04pOworCWlzYV9tZW1jcHlfdG9pbyhkZXYtPm1lbV9zdGFydCwgYnVmLCAoY291bnQgKyAzKSAmIH4zKTsKKwlvdXR3KG9wdGlvbl9yZWcsIGlvYWRkciArIEhQUF9PUFRJT04pOworCisJcmV0dXJuOworfQorCisMCisjaWZkZWYgTU9EVUxFCisjZGVmaW5lIE1BWF9IUFBfQ0FSRFMJNAkvKiBNYXggbnVtYmVyIG9mIEhQUCBjYXJkcyBwZXIgbW9kdWxlICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9ocHBbTUFYX0hQUF9DQVJEU107CitzdGF0aWMgaW50IGlvW01BWF9IUFBfQ0FSRFNdOworc3RhdGljIGludCBpcnFbTUFYX0hQUF9DQVJEU107CisKK21vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiSS9PIHBvcnQgYWRkcmVzcyhlcykiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRIG51bWJlcihzKTsgaWdub3JlZCBpZiBwcm9wZXJseSBkZXRlY3RlZCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIUCBQQy1MQU4rIElTQSBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogVGhpcyBpcyBzZXQgdXAgc28gdGhhdCBvbmx5IGEgc2luZ2xlIGF1dG9wcm9iZSB0YWtlcyBwbGFjZSBwZXIgY2FsbC4KK0lTQSBkZXZpY2UgYXV0b3Byb2JlcyBvbiBhIHJ1bm5pbmcgbWFjaGluZSBhcmUgbm90IHJlY29tbWVuZGVkLiAqLworaW50Citpbml0X21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IHRoaXNfZGV2LCBmb3VuZCA9IDA7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfSFBQX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCWlmIChpb1t0aGlzX2Rldl0gPT0gMCkgIHsKKwkJCWlmICh0aGlzX2RldiAhPSAwKSBicmVhazsgLyogb25seSBhdXRvcHJvYmUgMXN0IG9uZSAqLworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJocC1wbHVzLmM6IFByZXNlbnRseSBhdXRvcHJvYmluZyAobm90IHJlY29tbWVuZGVkKSBmb3IgYSBzaW5nbGUgY2FyZC5cbiIpOworCQl9CisJCWRldiA9IGFsbG9jX2VpX25ldGRldigpOworCQlpZiAoIWRldikKKwkJCWJyZWFrOworCQlkZXYtPmlycSA9IGlycVt0aGlzX2Rldl07CisJCWRldi0+YmFzZV9hZGRyID0gaW9bdGhpc19kZXZdOworCQlpZiAoZG9faHBwX3Byb2JlKGRldikgPT0gMCkgeworCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKKwkJCQlkZXZfaHBwW2ZvdW5kKytdID0gZGV2OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJY2xlYW51cF9jYXJkKGRldik7CisJCX0KKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaHAtcGx1cy5jOiBObyBIUC1QbHVzIGNhcmQgZm91bmQgKGkvbyA9IDB4JXgpLlxuIiwgaW9bdGhpc19kZXZdKTsKKwkJYnJlYWs7CisJfQorCWlmIChmb3VuZCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FTlhJTzsKK30KKwordm9pZAorY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgdGhpc19kZXY7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfSFBQX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaHBwW3RoaXNfZGV2XTsKKwkJaWYgKGRldikgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJfQorCX0KK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hwLmMgYi9kcml2ZXJzL25ldC9ocC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNjg4ODYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ocC5jCkBAIC0wLDAgKzEsNDY0IEBACisvKiBocC5jOiBBIEhQIExBTiBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4LiAqLworLyoKKwlXcml0dGVuIDE5OTMtOTQgYnkgRG9uYWxkIEJlY2tlci4KKworCUNvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKwlEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKwlUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgSFAgUEMtTEFOIGFkYXB0b3JzLgorCisJU291cmNlczoKKwkgIFRoZSBDcnlud3IgcGFja2V0IGRyaXZlci4KKyovCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9CisJImhwLmM6djEuMTAgOS8yMy85NCBEb25hbGQgQmVja2VyIChiZWNrZXJAY2VzZGlzLmdzZmMubmFzYS5nb3YpXG4iOworCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICI4MzkwLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgImhwIgorCisvKiBBIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIEkvTyBhZGRyZXNzZXMgdG8gYmUgcHJvYmVkLiAqLworc3RhdGljIHVuc2lnbmVkIGludCBocHBjbGFuX3BvcnRsaXN0W10gX19pbml0ZGF0YSA9Cit7IDB4MzAwLCAweDMyMCwgMHgzNDAsIDB4MjgwLCAweDJDMCwgMHgyMDAsIDB4MjQwLCAwfTsKKworI2RlZmluZSBIUF9JT19FWFRFTlQJMzIKKworI2RlZmluZSBIUF9EQVRBUE9SVAkJMHgwYwkvKiAiUmVtb3RlIERNQSIgZGF0YSBwb3J0LiAqLworI2RlZmluZSBIUF9JRAkJCTB4MDcKKyNkZWZpbmUgSFBfQ09ORklHVVJFCTB4MDgJLyogQ29uZmlndXJhdGlvbiByZWdpc3Rlci4gKi8KKyNkZWZpbmUJIEhQX1JVTgkJCTB4MDEJLyogMSA9PSBSdW4sIDAgPT0gcmVzZXQuICovCisjZGVmaW5lCSBIUF9JUlEJCQkweDBFCS8qIE1hc2sgZm9yIHNvZnR3YXJlLWNvbmZpZ3VyZWQgSVJRIGxpbmUuICovCisjZGVmaW5lCSBIUF9EQVRBT04JCTB4MTAJLyogVHVybiBvbiBkYXRhcG9ydCAqLworI2RlZmluZSBOSUNfT0ZGU0VUCQkweDEwCS8qIE9mZnNldCB0aGUgODM5MCByZWdpc3RlcnMuICovCisKKyNkZWZpbmUgSFBfU1RBUlRfUEcJCTB4MDAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKyNkZWZpbmUgSFBfOEJTVE9QX1BHCTB4ODAJLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcgKi8KKyNkZWZpbmUgSFBfMTZCU1RPUF9QRwkweEZGCS8qIFNhbWUsIGZvciAxNiBiaXQgY2FyZHMuICovCisKK3N0YXRpYyBpbnQgaHBfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpOworCitzdGF0aWMgaW50IGhwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGhwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaHBfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGhwX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLAorCQkJCQlpbnQgcmluZ19wYWdlKTsKK3N0YXRpYyB2b2lkIGhwX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiAsIGludCByaW5nX29mZnNldCk7CitzdGF0aWMgdm9pZCBocF9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHN0YXJ0X3BhZ2UpOworCitzdGF0aWMgdm9pZCBocF9pbml0X2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIFRoZSBtYXAgZnJvbSBJUlEgbnVtYmVyIHRvIEhQX0NPTkZJR1VSRSByZWdpc3RlciBzZXR0aW5nLiAqLworLyogTXkgZGVmYXVsdCBpcyBJUlE1CSAgICAgICAgICAgICAwICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5IDEwIDExICovCitzdGF0aWMgY2hhciBpcnFtYXBbMTZdIF9faW5pdGRhdGE9IHsgMCwgMCwgNCwgNiwgOCwxMCwgMCwxNCwgMCwgNCwgMiwxMiwwLDAsMCwwfTsKKworDAorLyoJUHJvYmUgZm9yIGFuIEhQIExBTiBhZGFwdG9yLgorCUFsc28gaW5pdGlhbGl6ZSB0aGUgY2FyZCBhbmQgZmlsbCBpbiBTVEFUSU9OX0FERFIgd2l0aCB0aGUgc3RhdGlvbgorCWFkZHJlc3MuICovCisKK3N0YXRpYyBpbnQgX19pbml0IGRvX2hwX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJaW50IGJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpcnEgPSBkZXYtPmlycTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWlmIChiYXNlX2FkZHIgPiAweDFmZikJCS8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KKwkJcmV0dXJuIGhwX3Byb2JlMShkZXYsIGJhc2VfYWRkcik7CisJZWxzZSBpZiAoYmFzZV9hZGRyICE9IDApCS8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKwkJcmV0dXJuIC1FTlhJTzsKKworCWZvciAoaSA9IDA7IGhwcGNsYW5fcG9ydGxpc3RbaV07IGkrKykgeworCQlpZiAoaHBfcHJvYmUxKGRldiwgaHBwY2xhbl9wb3J0bGlzdFtpXSkgPT0gMCkKKwkJCXJldHVybiAwOworCQlkZXYtPmlycSA9IGlycTsKKwl9CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIgLSBOSUNfT0ZGU0VULCBIUF9JT19FWFRFTlQpOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgaHBfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2VpX25ldGRldigpOworCWludCBlcnI7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKworCWVyciA9IGRvX2hwX3Byb2JlKGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCWNsZWFudXBfY2FyZChkZXYpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBocF9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKwlpbnQgaSwgcmV0dmFsLCBib2FyZF9pZCwgd29yZG1vZGU7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIEhQX0lPX0VYVEVOVCwgRFJWX05BTUUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogQ2hlY2sgZm9yIHRoZSBIUCBwaHlzaWNhbCBhZGRyZXNzLCAwOCAwMCAwOSB4eCB4eCB4eC4gKi8KKwkvKiBUaGlzIHJlYWxseSBpc24ndCBnb29kIGVub3VnaDogd2UgbWF5IHBpY2sgdXAgSFAgTEFOQ0UgYm9hcmRzCisJICAgYWxzbyEgIEF2b2lkIHRoZSBsYW5jZSAweDU3NTcgc2lnbmF0dXJlLiAqLworCWlmIChpbmIoaW9hZGRyKSAhPSAweDA4CisJCXx8IGluYihpb2FkZHIrMSkgIT0gMHgwMAorCQl8fCBpbmIoaW9hZGRyKzIpICE9IDB4MDkKKwkJfHwgaW5iKGlvYWRkcisxNCkgPT0gMHg1NykgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTZXQgdXAgdGhlIHBhcmFtZXRlcnMgYmFzZWQgb24gdGhlIGJvYXJkIElELgorCSAgIElmIHlvdSBoYXZlIGFkZGl0aW9uYWwgbWFwcGluZ3MsIHBsZWFzZSBtYWlsIHRoZW0gdG8gbWUgLWRqYi4gKi8KKwlpZiAoKGJvYXJkX2lkID0gaW5iKGlvYWRkciArIEhQX0lEKSkgJiAweDgwKSB7CisJCW5hbWUgPSAiSFAyNzI0NyI7CisJCXdvcmRtb2RlID0gMTsKKwl9IGVsc2UgeworCQluYW1lID0gIkhQMjcyNTAiOworCQl3b3JkbW9kZSA9IDA7CisJfQorCisJaWYgKGVpX2RlYnVnICAmJiAgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKHZlcnNpb24pOworCisJcHJpbnRrKCIlczogJXMgKElEICUwMngpIGF0ICUjM3gsIiwgZGV2LT5uYW1lLCBuYW1lLCBib2FyZF9pZCwgaW9hZGRyKTsKKworCWZvcihpID0gMDsgaSA8IEVUSEVSX0FERFJfTEVOOyBpKyspCisJCXByaW50aygiICUyLjJ4IiwgZGV2LT5kZXZfYWRkcltpXSA9IGluYihpb2FkZHIgKyBpKSk7CisKKwkvKiBTbmFyZiB0aGUgaW50ZXJydXB0IG5vdy4gIFNvbWVkYXkgdGhpcyBjb3VsZCBiZSBtb3ZlZCB0byBvcGVuKCkuICovCisJaWYgKGRldi0+aXJxIDwgMikgeworCQlpbnQgaXJxXzE2bGlzdFtdID0geyAxMSwgMTAsIDUsIDMsIDQsIDcsIDksIDB9OworCQlpbnQgaXJxXzhsaXN0W10gPSB7IDcsIDUsIDMsIDQsIDksIDB9OworCQlpbnQgKmlycXAgPSB3b3JkbW9kZSA/IGlycV8xNmxpc3QgOiBpcnFfOGxpc3Q7CisJCWRvIHsKKwkJCWludCBpcnEgPSAqaXJxcDsKKwkJCWlmIChyZXF1ZXN0X2lycSAoaXJxLCBOVUxMLCAwLCAiYm9ndXMiLCBOVUxMKSAhPSAtRUJVU1kpIHsKKwkJCQl1bnNpZ25lZCBsb25nIGNvb2tpZSA9IHByb2JlX2lycV9vbigpOworCQkJCS8qIFR3aW5rbGUgdGhlIGludGVycnVwdCwgYW5kIGNoZWNrIGlmIGl0J3Mgc2Vlbi4gKi8KKwkJCQlvdXRiX3AoaXJxbWFwW2lycV0gfCBIUF9SVU4sIGlvYWRkciArIEhQX0NPTkZJR1VSRSk7CisJCQkJb3V0Yl9wKCAweDAwIHwgSFBfUlVOLCBpb2FkZHIgKyBIUF9DT05GSUdVUkUpOworCQkJCWlmIChpcnEgPT0gcHJvYmVfaXJxX29mZihjb29raWUpCQkgLyogSXQncyBhIGdvb2QgSVJRIGxpbmUhICovCisJCQkJCSYmIHJlcXVlc3RfaXJxIChpcnEsIGVpX2ludGVycnVwdCwgMCwgRFJWX05BTUUsIGRldikgPT0gMCkgeworCQkJCQlwcmludGsoIiBzZWxlY3RpbmcgSVJRICVkLlxuIiwgaXJxKTsKKwkJCQkJZGV2LT5pcnEgPSAqaXJxcDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlICgqKytpcnFwKTsKKwkJaWYgKCppcnFwID09IDApIHsKKwkJCXByaW50aygiIG5vIGZyZWUgSVJRIGxpbmVzLlxuIik7CisJCQlyZXR2YWwgPSAtRUJVU1k7CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChkZXYtPmlycSA9PSAyKQorCQkJZGV2LT5pcnEgPSA5OworCQlpZiAoKHJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBlaV9pbnRlcnJ1cHQsIDAsIERSVl9OQU1FLCBkZXYpKSkgeworCQkJcHJpbnRrICgiIHVuYWJsZSB0byBnZXQgSVJRICVkLlxuIiwgZGV2LT5pcnEpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBTZXQgdGhlIGJhc2UgYWRkcmVzcyB0byBwb2ludCB0byB0aGUgTklDLCBub3QgdGhlICJyZWFsIiBiYXNlISAqLworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyICsgTklDX09GRlNFVDsKKwlkZXYtPm9wZW4gPSAmaHBfb3BlbjsKKwlkZXYtPnN0b3AgPSAmaHBfY2xvc2U7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CisjZW5kaWYKKworCWVpX3N0YXR1cy5uYW1lID0gbmFtZTsKKwllaV9zdGF0dXMud29yZDE2ID0gd29yZG1vZGU7CisJZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBIUF9TVEFSVF9QRzsKKwllaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IEhQX1NUQVJUX1BHICsgVFhfUEFHRVM7CisJZWlfc3RhdHVzLnN0b3BfcGFnZSA9IHdvcmRtb2RlID8gSFBfMTZCU1RPUF9QRyA6IEhQXzhCU1RPUF9QRzsKKworCWVpX3N0YXR1cy5yZXNldF84MzkwID0gJmhwX3Jlc2V0XzgzOTA7CisJZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZocF9nZXRfODM5MF9oZHI7CisJZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJmhwX2Jsb2NrX2lucHV0OworCWVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmaHBfYmxvY2tfb3V0cHV0OworCWhwX2luaXRfY2FyZChkZXYpOworCisJcmV0dXJuIDA7CitvdXQ6CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBIUF9JT19FWFRFTlQpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK2hwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllaV9vcGVuKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2hwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZWlfY2xvc2UoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2hwX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaHBfYmFzZSA9IGRldi0+YmFzZV9hZGRyIC0gTklDX09GRlNFVDsKKwlpbnQgc2F2ZWRfY29uZmlnID0gaW5iX3AoaHBfYmFzZSArIEhQX0NPTkZJR1VSRSk7CisKKwlpZiAoZWlfZGVidWcgPiAxKSBwcmludGsoInJlc2V0dGluZyB0aGUgODM5MCB0aW1lPSVsZC4uLiIsIGppZmZpZXMpOworCW91dGJfcCgweDAwLCBocF9iYXNlICsgSFBfQ09ORklHVVJFKTsKKwllaV9zdGF0dXMudHhpbmcgPSAwOworCS8qIFBhdXNlIGp1c3QgYSBmZXcgY3ljbGVzIGZvciB0aGUgaGFyZHdhcmUgcmVzZXQgdG8gdGFrZSBwbGFjZS4gKi8KKwl1ZGVsYXkoNSk7CisKKwlvdXRiX3Aoc2F2ZWRfY29uZmlnLCBocF9iYXNlICsgSFBfQ09ORklHVVJFKTsKKwl1ZGVsYXkoNSk7CisKKwlpZiAoKGluYl9wKGhwX2Jhc2UrTklDX09GRlNFVCtFTjBfSVNSKSAmIEVOSVNSX1JFU0VUKSA9PSAwKQorCQlwcmludGsoIiVzOiBocF9yZXNldF84MzkwKCkgZGlkIG5vdCBjb21wbGV0ZS5cbiIsIGRldi0+bmFtZSk7CisKKwlpZiAoZWlfZGVidWcgPiAxKSBwcmludGsoIjgzOTAgcmVzZXQgZG9uZSAoJWxkKS4iLCBqaWZmaWVzKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitocF9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSkKK3sKKwlpbnQgbmljX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgc2F2ZWRfY29uZmlnID0gaW5iX3AobmljX2Jhc2UgLSBOSUNfT0ZGU0VUICsgSFBfQ09ORklHVVJFKTsKKworCW91dGJfcChzYXZlZF9jb25maWcgfCBIUF9EQVRBT04sIG5pY19iYXNlIC0gTklDX09GRlNFVCArIEhQX0NPTkZJR1VSRSk7CisJb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUQVJULCBuaWNfYmFzZSk7CisJb3V0Yl9wKHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkciksIG5pY19iYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKDAsIG5pY19iYXNlICsgRU4wX1JDTlRISSk7CisJb3V0Yl9wKDAsIG5pY19iYXNlICsgRU4wX1JTQVJMTyk7CS8qIE9uIHBhZ2UgYm91bmRhcnkgKi8KKwlvdXRiX3AocmluZ19wYWdlLCBuaWNfYmFzZSArIEVOMF9SU0FSSEkpOworCW91dGJfcChFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgbmljX2Jhc2UpOworCisJaWYgKGVpX3N0YXR1cy53b3JkMTYpCisJICBpbnN3KG5pY19iYXNlIC0gTklDX09GRlNFVCArIEhQX0RBVEFQT1JULCBoZHIsIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcik+PjEpOworCWVsc2UKKwkgIGluc2IobmljX2Jhc2UgLSBOSUNfT0ZGU0VUICsgSFBfREFUQVBPUlQsIGhkciwgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSk7CisKKwlvdXRiX3Aoc2F2ZWRfY29uZmlnICYgKH5IUF9EQVRBT04pLCBuaWNfYmFzZSAtIE5JQ19PRkZTRVQgKyBIUF9DT05GSUdVUkUpOworfQorCisvKiBCbG9jayBpbnB1dCBhbmQgb3V0cHV0LCBzaW1pbGFyIHRvIHRoZSBDcnlud3IgcGFja2V0IGRyaXZlci4gSWYgeW91IGFyZQorICAgcG9ydGluZyB0byBhIG5ldyBldGhlcmNhcmQgbG9vayBhdCB0aGUgcGFja2V0IGRyaXZlciBzb3VyY2UgZm9yIGhpbnRzLgorICAgVGhlIEhQIExBTiBkb2Vzbid0IHVzZSBzaGFyZWQgbWVtb3J5IC0tIHdlIHB1dCB0aGUgcGFja2V0CisgICBvdXQgdGhyb3VnaCB0aGUgInJlbW90ZSBETUEiIGRhdGFwb3J0LiAqLworCitzdGF0aWMgdm9pZAoraHBfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpCit7CisJaW50IG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IHNhdmVkX2NvbmZpZyA9IGluYl9wKG5pY19iYXNlIC0gTklDX09GRlNFVCArIEhQX0NPTkZJR1VSRSk7CisJaW50IHhmZXJfY291bnQgPSBjb3VudDsKKwljaGFyICpidWYgPSBza2ItPmRhdGE7CisKKwlvdXRiX3Aoc2F2ZWRfY29uZmlnIHwgSFBfREFUQU9OLCBuaWNfYmFzZSAtIE5JQ19PRkZTRVQgKyBIUF9DT05GSUdVUkUpOworCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgbmljX2Jhc2UpOworCW91dGJfcChjb3VudCAmIDB4ZmYsIG5pY19iYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKGNvdW50ID4+IDgsIG5pY19iYXNlICsgRU4wX1JDTlRISSk7CisJb3V0Yl9wKHJpbmdfb2Zmc2V0ICYgMHhmZiwgbmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKwlvdXRiX3AocmluZ19vZmZzZXQgPj4gOCwgbmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKwlvdXRiX3AoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIG5pY19iYXNlKTsKKwlpZiAoZWlfc3RhdHVzLndvcmQxNikgeworCSAgaW5zdyhuaWNfYmFzZSAtIE5JQ19PRkZTRVQgKyBIUF9EQVRBUE9SVCxidWYsY291bnQ+PjEpOworCSAgaWYgKGNvdW50ICYgMHgwMSkKKwkJYnVmW2NvdW50LTFdID0gaW5iKG5pY19iYXNlIC0gTklDX09GRlNFVCArIEhQX0RBVEFQT1JUKSwgeGZlcl9jb3VudCsrOworCX0gZWxzZSB7CisJCWluc2IobmljX2Jhc2UgLSBOSUNfT0ZGU0VUICsgSFBfREFUQVBPUlQsIGJ1ZiwgY291bnQpOworCX0KKwkvKiBUaGlzIGlzIGZvciB0aGUgQUxQSEEgdmVyc2lvbiBvbmx5LCByZW1vdmUgZm9yIGxhdGVyIHJlbGVhc2VzLiAqLworCWlmIChlaV9kZWJ1ZyA+IDApIHsJCQkvKiBETUEgdGVybWluYXRpb24gYWRkcmVzcyBjaGVjay4uLiAqLworCSAgaW50IGhpZ2ggPSBpbmJfcChuaWNfYmFzZSArIEVOMF9SU0FSSEkpOworCSAgaW50IGxvdyA9IGluYl9wKG5pY19iYXNlICsgRU4wX1JTQVJMTyk7CisJICBpbnQgYWRkciA9IChoaWdoIDw8IDgpICsgbG93OworCSAgLyogQ2hlY2sgb25seSB0aGUgbG93ZXIgOCBiaXRzIHNvIHdlIGNhbiBpZ25vcmUgcmluZyB3cmFwLiAqLworCSAgaWYgKCgocmluZ19vZmZzZXQgKyB4ZmVyX2NvdW50KSAmIDB4ZmYpICE9IChhZGRyICYgMHhmZikpCisJCXByaW50aygiJXM6IFJYIHRyYW5zZmVyIGFkZHJlc3MgbWlzbWF0Y2gsICUjNC40eCB2cy4gJSM0LjR4IChhY3R1YWwpLlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgcmluZ19vZmZzZXQgKyB4ZmVyX2NvdW50LCBhZGRyKTsKKwl9CisJb3V0Yl9wKHNhdmVkX2NvbmZpZyAmICh+SFBfREFUQU9OKSwgbmljX2Jhc2UgLSBOSUNfT0ZGU0VUICsgSFBfQ09ORklHVVJFKTsKK30KKworc3RhdGljIHZvaWQKK2hwX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RhcnRfcGFnZSkKK3sKKwlpbnQgbmljX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgc2F2ZWRfY29uZmlnID0gaW5iX3AobmljX2Jhc2UgLSBOSUNfT0ZGU0VUICsgSFBfQ09ORklHVVJFKTsKKworCW91dGJfcChzYXZlZF9jb25maWcgfCBIUF9EQVRBT04sIG5pY19iYXNlIC0gTklDX09GRlNFVCArIEhQX0NPTkZJR1VSRSk7CisJLyogUm91bmQgdGhlIGNvdW50IHVwIGZvciB3b3JkIHdyaXRlcy4JRG8gd2UgbmVlZCB0byBkbyB0aGlzPworCSAgIFdoYXQgZWZmZWN0IHdpbGwgYW4gb2RkIGJ5dGUgY291bnQgaGF2ZSBvbiB0aGUgODM5MD8KKwkgICBJIHNob3VsZCBjaGVjayBzb21lZGF5LiAqLworCWlmIChlaV9zdGF0dXMud29yZDE2ICYmIChjb3VudCAmIDB4MDEpKQorCSAgY291bnQrKzsKKwkvKiBXZSBzaG91bGQgYWxyZWFkeSBiZSBpbiBwYWdlIDAsIGJ1dCB0byBiZSBzYWZlLi4uICovCisJb3V0Yl9wKEU4MzkwX1BBR0UwK0U4MzkwX1NUQVJUK0U4MzkwX05PRE1BLCBuaWNfYmFzZSk7CisKKyNpZmRlZiBORTgzOTBfUldfQlVHRklYCisJLyogSGFuZGxlIHRoZSByZWFkLWJlZm9yZS13cml0ZSBidWcgdGhlIHNhbWUgd2F5IGFzIHRoZQorCSAgIENyeW53ciBwYWNrZXQgZHJpdmVyIC0tIHRoZSBOYXRTZW1pIG1ldGhvZCBkb2Vzbid0IHdvcmsuICovCisJb3V0Yl9wKDB4NDIsIG5pY19iYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKDAsCW5pY19iYXNlICsgRU4wX1JDTlRISSk7CisJb3V0Yl9wKDB4ZmYsIG5pY19iYXNlICsgRU4wX1JTQVJMTyk7CisJb3V0Yl9wKDB4MDAsIG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisjZGVmaW5lIE5FX0NNRAkgCTB4MDAKKwlvdXRiX3AoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIG5pY19iYXNlICsgTkVfQ01EKTsKKwkvKiBNYWtlIGNlcnRhaW4gdGhhdCB0aGUgZHVtbXkgcmVhZCBoYXMgb2NjdXJyZWQuICovCisJaW5iX3AoMHg2MSk7CisJaW5iX3AoMHg2MSk7CisjZW5kaWYKKworCW91dGJfcChjb3VudCAmIDB4ZmYsIG5pY19iYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKGNvdW50ID4+IDgsCSBuaWNfYmFzZSArIEVOMF9SQ05USEkpOworCW91dGJfcCgweDAwLCBuaWNfYmFzZSArIEVOMF9SU0FSTE8pOworCW91dGJfcChzdGFydF9wYWdlLCBuaWNfYmFzZSArIEVOMF9SU0FSSEkpOworCisJb3V0Yl9wKEU4MzkwX1JXUklURStFODM5MF9TVEFSVCwgbmljX2Jhc2UpOworCWlmIChlaV9zdGF0dXMud29yZDE2KSB7CisJCS8qIFVzZSB0aGUgJ3JlcCcgc2VxdWVuY2UgZm9yIDE2IGJpdCBib2FyZHMuICovCisJCW91dHN3KG5pY19iYXNlIC0gTklDX09GRlNFVCArIEhQX0RBVEFQT1JULCBidWYsIGNvdW50Pj4xKTsKKwl9IGVsc2UgeworCQlvdXRzYihuaWNfYmFzZSAtIE5JQ19PRkZTRVQgKyBIUF9EQVRBUE9SVCwgYnVmLCBjb3VudCk7CisJfQorCisJLyogRE9OJ1QgY2hlY2sgZm9yICdpbmJfcChFTjBfSVNSKSAmIEVOSVNSX1JEQycgaGVyZSAtLSBpdCdzIGJyb2tlbiEgKi8KKworCS8qIFRoaXMgaXMgZm9yIHRoZSBBTFBIQSB2ZXJzaW9uIG9ubHksIHJlbW92ZSBmb3IgbGF0ZXIgcmVsZWFzZXMuICovCisJaWYgKGVpX2RlYnVnID4gMCkgewkJCS8qIERNQSB0ZXJtaW5hdGlvbiBhZGRyZXNzIGNoZWNrLi4uICovCisJICBpbnQgaGlnaCA9IGluYl9wKG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisJICBpbnQgbG93ICA9IGluYl9wKG5pY19iYXNlICsgRU4wX1JTQVJMTyk7CisJICBpbnQgYWRkciA9IChoaWdoIDw8IDgpICsgbG93OworCSAgaWYgKChzdGFydF9wYWdlIDw8IDgpICsgY291bnQgIT0gYWRkcikKKwkJcHJpbnRrKCIlczogVFggVHJhbnNmZXIgYWRkcmVzcyBtaXNtYXRjaCwgJSM0LjR4IHZzLiAlIzQuNHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCAoc3RhcnRfcGFnZSA8PCA4KSArIGNvdW50LCBhZGRyKTsKKwl9CisJb3V0Yl9wKHNhdmVkX2NvbmZpZyAmICh+SFBfREFUQU9OKSwgbmljX2Jhc2UgLSBOSUNfT0ZGU0VUICsgSFBfQ09ORklHVVJFKTsKKwlyZXR1cm47Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBldGhlcmNhcmQgaWYgc29tZXRoaW5nIHNjcmV3cyB1cC4gKi8KK3N0YXRpYyB2b2lkCitocF9pbml0X2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaXJxID0gZGV2LT5pcnE7CisJTlM4MzkwX2luaXQoZGV2LCAwKTsKKwlvdXRiX3AoaXJxbWFwW2lycSYweDBmXSB8IEhQX1JVTiwKKwkJICAgZGV2LT5iYXNlX2FkZHIgLSBOSUNfT0ZGU0VUICsgSFBfQ09ORklHVVJFKTsKKwlyZXR1cm47Cit9CisKKyNpZmRlZiBNT0RVTEUKKyNkZWZpbmUgTUFYX0hQX0NBUkRTCTQJLyogTWF4IG51bWJlciBvZiBIUCBjYXJkcyBwZXIgbW9kdWxlICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9ocFtNQVhfSFBfQ0FSRFNdOworc3RhdGljIGludCBpb1tNQVhfSFBfQ0FSRFNdOworc3RhdGljIGludCBpcnFbTUFYX0hQX0NBUkRTXTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJJL08gYmFzZSBhZGRyZXNzKGVzKSIpOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJJUlEgbnVtYmVyKHMpIChhc3NpZ25lZCkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSFAgUEMtTEFOIElTQSBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogVGhpcyBpcyBzZXQgdXAgc28gdGhhdCBvbmx5IGEgc2luZ2xlIGF1dG9wcm9iZSB0YWtlcyBwbGFjZSBwZXIgY2FsbC4KK0lTQSBkZXZpY2UgYXV0b3Byb2JlcyBvbiBhIHJ1bm5pbmcgbWFjaGluZSBhcmUgbm90IHJlY29tbWVuZGVkLiAqLworaW50Citpbml0X21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IHRoaXNfZGV2LCBmb3VuZCA9IDA7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfSFBfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJaWYgKGlvW3RoaXNfZGV2XSA9PSAwKSAgeworCQkJaWYgKHRoaXNfZGV2ICE9IDApIGJyZWFrOyAvKiBvbmx5IGF1dG9wcm9iZSAxc3Qgb25lICovCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgImhwLmM6IFByZXNlbnRseSBhdXRvcHJvYmluZyAobm90IHJlY29tbWVuZGVkKSBmb3IgYSBzaW5nbGUgY2FyZC5cbiIpOworCQl9CisJCWRldiA9IGFsbG9jX2VpX25ldGRldigpOworCQlpZiAoIWRldikKKwkJCWJyZWFrOworCQlkZXYtPmlycSA9IGlycVt0aGlzX2Rldl07CisJCWRldi0+YmFzZV9hZGRyID0gaW9bdGhpc19kZXZdOworCQlpZiAoZG9faHBfcHJvYmUoZGV2KSA9PSAwKSB7CisJCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgeworCQkJCWRldl9ocFtmb3VuZCsrXSA9IGRldjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQl9CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImhwLmM6IE5vIEhQIGNhcmQgZm91bmQgKGkvbyA9IDB4JXgpLlxuIiwgaW9bdGhpc19kZXZdKTsKKwkJYnJlYWs7CisJfQorCWlmIChmb3VuZCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FTlhJTzsKK30KKwordm9pZAorY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgdGhpc19kZXY7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfSFBfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9ocFt0aGlzX2Rldl07CisJCWlmIChkZXYpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ocDEwMC5jIGIvZHJpdmVycy9uZXQvaHAxMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2IxNzAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaHAxMDAuYwpAQCAtMCwwICsxLDMxMTUgQEAKKy8qCisqKiBocDEwMC5jIAorKiogSFAgQ0FTQ0FERSBBcmNoaXRlY3R1cmUgRHJpdmVyIGZvciAxMDBWRy1BbnlMYW4gTmV0d29yayBBZGFwdGVycworKioKKyoqICRJZDogaHAxMDAuYyx2IDEuNTggMjAwMS8wOS8yNCAxODowMzowMSBwZXJleCBFeHAgcGVyZXggJAorKioKKyoqIEJhc2VkIG9uIHRoZSBIUDEwMCBkcml2ZXIgd3JpdHRlbiBieSBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QGpjdS5jej4KKyoqIEV4dGVuZGVkIGZvciBuZXcgYnVzbWFzdGVyIGNhcGFibGUgY2hpcHNldHMgYnkgCisqKiBTaWVnZnJpZWQgIkZyaWVkZXIiIExvZWZmbGVyIChkZzFzZWspIDxmbG9lZmZAbWF0aGVtYXRpay51bmktc3R1dHRnYXJ0LmRlPgorKioKKyoqIE1haW50YWluZWQgYnk6IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyoqIAorKiogVGhpcyBkcml2ZXIgaGFzIG9ubHkgYmVlbiB0ZXN0ZWQgd2l0aAorKiogLS0gSFAgSjI1ODVCIDEwLzEwMCBNYml0L3MgUENJIEJ1c21hc3RlcgorKiogLS0gSFAgSjI1ODVBIDEwLzEwMCBNYml0L3MgUENJIAorKiogLS0gSFAgSjI5NzAgIDEwIE1iaXQvcyBQQ0kgQ29tYm8gMTBiYXNlLVQvQk5DCisqKiAtLSBIUCBKMjk3MyAgMTAgTWJpdC9zIFBDSSAxMGJhc2UtVAorKiogLS0gSFAgSjI1NzMgIDEwLzEwMCBJU0EKKyoqIC0tIENvbXBleCBSZWFkeUxpbmsgRU5FVDEwMC1WRzQgIDEwLzEwMCBNYml0L3MgUENJIC8gRUlTQQorKiogLS0gQ29tcGV4IEZyZWVkb21MaW5lIDEwMC9WRyAgMTAvMTAwIE1iaXQvcyBJU0EgLyBFSVNBIC8gUENJCisqKiAKKyoqIGJ1dCBpdCBzaG91bGQgYWxzbyB3b3JrIHdpdGggdGhlIG90aGVyIENBU0NBREUgYmFzZWQgYWRhcHRlcnMuCisqKgorKiogVE9ETzoKKyoqICAgICAgIC0gIEoyNTczIHNlZW1zIHRvIGhhbmcgc29tZXRpbWVzIHdoZW4gaW4gc2hhcmVkIG1lbW9yeSBtb2RlLgorKiogICAgICAgLSAgTW9kZSBmb3IgUHJpb3JpdHkgVFgKKyoqICAgICAgIC0gIENoZWNrIFBDSSByZWdpc3RlcnMsIHBlcmZvcm1hbmNlIG1pZ2h0IGJlIGltcHJvdmVkPworKiogICAgICAgLSAgVG8gcmVkdWNlIGludGVycnVwdCBsb2FkIGluIGJ1c21hc3Rlciwgb25lIGNvdWxkIHN3aXRjaCBvZmYKKyoqICAgICAgICAgIHRoZSBpbnRlcnJ1cHRzIHRoYXQgYXJlIHVzZWQgdG8gcmVmaWxsIHRoZSBxdWV1ZXMgd2hlbmV2ZXIgdGhlCisqKiAgICAgICAgICBxdWV1ZXMgYXJlIGZpbGxlZCB1cCB0byBtb3JlIHRoYW4gYSBjZXJ0YWluIHRocmVzaG9sZC4KKyoqICAgICAgIC0gIHNvbWUgdXBkYXRlcyBmb3IgRUlTQSB2ZXJzaW9uIG9mIGNhcmQKKyoqCisqKgorKiogICBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKioKKyoqICAgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoqCisqKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKioKKyoqIDEuNTdjIC0+IDEuNTgKKyoqICAgLSB1c2VkIGluZGVudCB0byBjaGFuZ2UgY29kaW5nLXN0eWxlCisqKiAgIC0gYWRkZWQgS1RJIERQLTIwMCBFSVNBIElECisqKiAgIC0gaW9yZW1hcCBpcyBhbHNvIHVzZWQgZm9yIGxvdyAoPDFNQikgbWVtb3J5IChtdWx0aS1hcmNoaXRlY3R1cmUgc3VwcG9ydCkKKyoqCisqKiAxLjU3YiAtPiAxLjU3YyAtIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorKiogICAtIHJlbGVhc2UgcmVzb3VyY2VzIG9uIGZhaWx1cmUgaW4gaW5pdF9tb2R1bGUKKyoqCisqKiAxLjU3IC0+IDEuNTdiIC0gSmVhbiBJSQorKiogICAtIGZpeCBzcGlubG9ja3MsIFNNUCBpcyBub3cgd29ya2luZyAhCisqKgorKiogMS41NiAtPiAxLjU3CisqKiAgIC0gdXBkYXRlcyBmb3IgbmV3IFBDSSBpbnRlcmZhY2UgZm9yIDIuMSBrZXJuZWxzCisqKgorKiogMS41NSAtPiAxLjU2CisqKiAgIC0gcmVtb3ZlZCBwcmludGsgaW4gbWlzYy4gaW50ZXJydXB0IGFuZCB1cGRhdGUgc3RhdGlzdGljcyB0byBhbGxvdworKiogICAgIG1vbml0b3Jpbmcgb2YgY2FyZCBzdGF0dXMKKyoqICAgLSB0aW1pbmcgY2hhbmdlcyBpbiB4bWl0IHJvdXRpbmVzLCByZWxvZ2luIHRvIDEwMFZHIGh1YiBhZGRlZCB3aGVuCisqKiAgICAgZHJpdmVyIGRvZXMgcmVzZXQKKyoqICAgLSBpbmNsdWRlZCBmaXggZm9yIENvbXBleCBGcmVlZG9tTGluZSBQQ0kgYWRhcHRlcgorKiogCisqKiAxLjU0IC0+IDEuNTUKKyoqICAgLSBmaXhlZCBiYWQgaW5pdGlhbGl6YXRpb24gaW4gaW5pdF9tb2R1bGUKKyoqICAgLSBhZGRlZCBDb21wZXggRnJlZWRvbUxpbmUgYWRhcHRlcgorKiogICAtIHNvbWUgZml4ZXMgaW4gY2FyZCBpbml0aWFsaXphdGlvbgorKioKKyoqIDEuNTMgLT4gMS41NAorKiogICAtIGFkZGVkIGhhcmR3YXJlIG11bHRpY2FzdCBmaWx0ZXIgc3VwcG9ydCAoZG9lc24ndCB3b3JrKQorKiogICAtIGxpdHRsZSBjaGFuZ2VzIGluIGhwMTAwX3NlbnNlX2xhbiByb3V0aW5lIAorKiogICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgQ29heCBhbmQgQVVJIChKMjk3MCkKKyoqICAgLSBmaXggZm9yIG11bHRpcGxlIGNhcmRzIGFuZCBocDEwMF9tb2RlIHBhcmFtZXRlciAoaW5zbW9kKQorKiogICAtIGZpeCBmb3Igc2hhcmVkIElSUSAKKyoqCisqKiAxLjUyIC0+IDEuNTMKKyoqICAgLSBmaXhlZCBidWcgaW4gbXVsdGljYXN0IHN1cHBvcnQKKyoqCisqLworCisjZGVmaW5lIEhQMTAwX0RFRkFVTFRfUFJJT1JJVFlfVFggMAorCisjdW5kZWYgSFAxMDBfREVCVUcKKyN1bmRlZiBIUDEwMF9ERUJVR19CCQkvKiBUcmFjZSAgKi8KKyN1bmRlZiBIUDEwMF9ERUJVR19CTQkJLyogRGVidWcgYnVzbWFzdGVyIGNvZGUgKFBETCBzdHVmZikgKi8KKworI3VuZGVmIEhQMTAwX0RFQlVHX1RSQUlOSU5HCS8qIERlYnVnIGxvZ2luLXRvLWh1YiBwcm9jZWR1cmUgKi8KKyN1bmRlZiBIUDEwMF9ERUJVR19UWAorI3VuZGVmIEhQMTAwX0RFQlVHX0lSUQorI3VuZGVmIEhQMTAwX0RFQlVHX1JYCisKKyN1bmRlZiBIUDEwMF9NVUxUSUNBU1RfRklMVEVSCS8qIE5lZWQgdG8gYmUgZGVidWdnZWQuLi4gKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9laXNhLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CS8qIGZvciBDT05GSUdfUENJICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgImhwMTAwLmgiCisKKy8qCisgKiAgZGVmaW5lcworICovCisKKyNkZWZpbmUgSFAxMDBfQlVTX0lTQSAgICAgMAorI2RlZmluZSBIUDEwMF9CVVNfRUlTQSAgICAxCisjZGVmaW5lIEhQMTAwX0JVU19QQ0kgICAgIDIKKworI2RlZmluZSBIUDEwMF9SRUdJT05fU0laRQkweDIwCS8qIGZvciBpb3BvcnRzICovCisjZGVmaW5lIEhQMTAwX1NJR19MRU4JCTgJLyogc2FtZSBhcyBFSVNBX1NJR19MRU4gKi8KKworI2RlZmluZSBIUDEwMF9NQVhfUEFDS0VUX1NJWkUJKDE1MzYrNCkKKyNkZWZpbmUgSFAxMDBfTUlOX1BBQ0tFVF9TSVpFCTYwCisKKyNpZm5kZWYgSFAxMDBfREVGQVVMVF9SWF9SQVRJTworLyogZGVmYXVsdCAtIDc1JSBvbmJvYXJkIG1lbW9yeSBvbiB0aGUgY2FyZCBhcmUgdXNlZCBmb3IgUlggcGFja2V0cyAqLworI2RlZmluZSBIUDEwMF9ERUZBVUxUX1JYX1JBVElPCTc1CisjZW5kaWYKKworI2lmbmRlZiBIUDEwMF9ERUZBVUxUX1BSSU9SSVRZX1RYCisvKiBkZWZhdWx0IC0gZG9uJ3QgZW5hYmxlIHRyYW5zbWl0IG91dGdvaW5nIHBhY2tldHMgYXMgcHJpb3JpdHkgKi8KKyNkZWZpbmUgSFAxMDBfREVGQVVMVF9QUklPUklUWV9UWCAwCisjZW5kaWYKKworLyoKKyAqICBzdHJ1Y3R1cmVzCisgKi8KKworc3RydWN0IGhwMTAwX3ByaXZhdGUgeworCXNwaW5sb2NrX3QgbG9jazsKKwljaGFyIGlkW0hQMTAwX1NJR19MRU5dOworCXVfc2hvcnQgY2hpcDsKKwl1X3Nob3J0IHNvZnRfbW9kZWw7CisJdV9pbnQgbWVtb3J5X3NpemU7CisJdV9pbnQgdmlydF9tZW1vcnlfc2l6ZTsKKwl1X3Nob3J0IHJ4X3JhdGlvOwkvKiAxIC0gOTkgKi8KKwl1X3Nob3J0IHByaW9yaXR5X3R4OwkvKiAhPSAwIC0gcHJpb3JpdHkgdHggKi8KKwl1X3Nob3J0IG1vZGU7CQkvKiBQSU8sIFNoYXJlZCBNZW0gb3IgQnVzbWFzdGVyICovCisJdV9jaGFyIGJ1czsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKwlzaG9ydCBtZW1fbWFwcGVkOwkvKiBtZW1vcnkgbWFwcGVkIGFjY2VzcyAqLworCXZvaWQgX19pb21lbSAqbWVtX3B0cl92aXJ0OwkvKiB2aXJ0dWFsIG1lbW9yeSBtYXBwZWQgYXJlYSwgbWF5YmUgTlVMTCAqLworCXVuc2lnbmVkIGxvbmcgbWVtX3B0cl9waHlzOwkvKiBwaHlzaWNhbCBtZW1vcnkgbWFwcGVkIGFyZWEgKi8KKwlzaG9ydCBsYW5fdHlwZTsJCS8qIDEwTWIvcywgMTAwTWIvcyBvciAtMSAoZXJyb3IpICovCisJaW50IGh1Yl9zdGF0dXM7CQkvKiB3YXMgbG9naW4gdG8gaHViIHN1Y2Nlc3NmdWw/ICovCisJdV9jaGFyIG1hYzFfbW9kZTsKKwl1X2NoYXIgbWFjMl9tb2RlOworCXVfY2hhciBoYXNoX2J5dGVzWzhdOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCisJLyogUmluZ3MgZm9yIGJ1c21hc3RlciBtb2RlOiAqLworCWhwMTAwX3JpbmdfdCAqcnhyaGVhZDsJLyogSGVhZCAob2xkZXN0KSBpbmRleCBpbnRvIHJ4cmluZyAqLworCWhwMTAwX3JpbmdfdCAqcnhydGFpbDsJLyogVGFpbCAobmV3ZXN0KSBpbmRleCBpbnRvIHJ4cmluZyAqLworCWhwMTAwX3JpbmdfdCAqdHhyaGVhZDsJLyogSGVhZCAob2xkZXN0KSBpbmRleCBpbnRvIHR4cmluZyAqLworCWhwMTAwX3JpbmdfdCAqdHhydGFpbDsJLyogVGFpbCAobmV3ZXN0KSBpbmRleCBpbnRvIHR4cmluZyAqLworCisJaHAxMDBfcmluZ190IHJ4cmluZ1tNQVhfUlhfUERMXTsKKwlocDEwMF9yaW5nX3QgdHhyaW5nW01BWF9UWF9QRExdOworCisJdV9pbnQgKnBhZ2VfdmFkZHJfYWxnbjsJLyogQWxpZ25lZCB2aXJ0dWFsIGFkZHJlc3Mgb2YgYWxsb2NhdGVkIHBhZ2UgKi8KKwl1X2xvbmcgd2hhdGV2ZXJfb2Zmc2V0OwkvKiBPZmZzZXQgdG8gYnVzL3BoeXMvZG1hIGFkZHJlc3MgKi8KKwlpbnQgcnhyY29tbWl0OwkJLyogIyBSeCBQRExzIGNvbW1pdGVkIHRvIGFkYXB0ZXIgKi8KKwlpbnQgdHhyY29tbWl0OwkJLyogIyBUeCBQRExzIGNvbW1pdGVkIHRvIGFkYXB0ZXIgKi8KK307CisKKy8qCisgKiAgdmFyaWFibGVzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpocDEwMF9pc2FfdGJsW10gPSB7CisJIkhXUEYxNTAiLCAvKiBIUCBKMjU3MyByZXYgQSAqLworCSJIV1AxOTUwIiwgLyogSFAgSjI1NzMgKi8KK307CisKKyNpZmRlZiBDT05GSUdfRUlTQQorc3RhdGljIHN0cnVjdCBlaXNhX2RldmljZV9pZCBocDEwMF9laXNhX3RibFtdID0geworCXsgIkhXUEYxODAiIH0sIC8qIEhQIEoyNTc3IHJldiBBICovCisJeyAiSFdQMTkyMCIgfSwgLyogSFAgMjcyNDhCICovCisJeyAiSFdQMTk0MCIgfSwgLyogSFAgSjI1NzcgKi8KKwl7ICJIV1AxOTkwIiB9LCAvKiBIUCBKMjU3NyAqLworCXsgIkNQWDAzMDEiIH0sIC8qIFJlYWR5TGluayBFTkVUMTAwLVZHNCAqLworCXsgIkNQWDA0MDEiIH0sIC8qIEZyZWVkb21MaW5lIDEwMC9WRyAqLworCXsgIiIgfQkgICAgICAgLyogTWFuZGF0b3J5IGZpbmFsIGVudHJ5ICEgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGVpc2EsIGhwMTAwX2Vpc2FfdGJsKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGhwMTAwX3BjaV90YmxbXSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9KMjU4NUEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwKKwl7UENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9KMjU4NUIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwKKwl7UENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9KMjk3MEEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwKKwl7UENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9KMjk3M0EsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwKKwl7UENJX1ZFTkRPUl9JRF9DT01QRVgsIFBDSV9ERVZJQ0VfSURfQ09NUEVYX0VORVQxMDBWRzQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwKKwl7UENJX1ZFTkRPUl9JRF9DT01QRVgyLCBQQ0lfREVWSUNFX0lEX0NPTVBFWDJfMTAwVkcsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwKKy8qCXtQQ0lfVkVORE9SX0lEX0tUSSwgUENJX0RFVklDRV9JRF9LVElfRFAyMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwgKi8KKwl7fQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGhwMTAwX3BjaV90YmwpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgaHAxMDBfcnhfcmF0aW8gPSBIUDEwMF9ERUZBVUxUX1JYX1JBVElPOworc3RhdGljIGludCBocDEwMF9wcmlvcml0eV90eCA9IEhQMTAwX0RFRkFVTFRfUFJJT1JJVFlfVFg7CitzdGF0aWMgaW50IGhwMTAwX21vZGUgPSAxOworCittb2R1bGVfcGFyYW0oaHAxMDBfcnhfcmF0aW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaHAxMDBfcHJpb3JpdHlfdHgsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaHAxMDBfbW9kZSwgaW50LCAwKTsKKworLyoKKyAqICBwcm90b3R5cGVzCisgKi8KKworc3RhdGljIGludCBocDEwMF9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkciwgdV9jaGFyIGJ1cywKKwkJCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KTsKKworCitzdGF0aWMgaW50IGhwMTAwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGhwMTAwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBocDEwMF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBocDEwMF9zdGFydF94bWl0X2JtKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBocDEwMF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaHAxMDBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaHAxMDBfbWlzY19pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBocDEwMF91cGRhdGVfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBocDEwMF9jbGVhcl9zdGF0cyhzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAsIGludCBpb2FkZHIpOworc3RhdGljIHZvaWQgaHAxMDBfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGhwMTAwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIGhwMTAwX3N0YXJ0X2ludGVyZmFjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGhwMTAwX3N0b3BfaW50ZXJmYWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaHAxMDBfbG9hZF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9zaG9ydCBpb2FkZHIpOworc3RhdGljIGludCBocDEwMF9zZW5zZV9sYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGhwMTAwX2xvZ2luX3RvX3ZnX2h1YihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSB1X3Nob3J0IGZvcmNlX3JlbG9naW4pOworc3RhdGljIGludCBocDEwMF9kb3duX3ZnX2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBocDEwMF9jYXNjYWRlX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfc2hvcnQgZW5hYmxlKTsKK3N0YXRpYyB2b2lkIGhwMTAwX0JNX3NodXRkb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaHAxMDBfbW11aW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGhwMTAwX2luaXRfcGRscyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaHAxMDBfaW5pdF9yeHBkbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHJlZ2lzdGVyIGhwMTAwX3JpbmdfdCAqIHJpbmdwdHIsCisJCQkgICAgcmVnaXN0ZXIgdV9pbnQgKiBwZGxwdHIpOworc3RhdGljIGludCBocDEwMF9pbml0X3R4cGRsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgcmVnaXN0ZXIgaHAxMDBfcmluZ190ICogcmluZ3B0ciwKKwkJCSAgICByZWdpc3RlciB1X2ludCAqIHBkbHB0cik7CitzdGF0aWMgdm9pZCBocDEwMF9yeGZpbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBocDEwMF9od2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBocDEwMF9jbGVhbl90eHJpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjaWZkZWYgSFAxMDBfREVCVUcKK3N0YXRpYyB2b2lkIGhwMTAwX1JlZ2lzdGVyRHVtcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorCisvKiBDb252ZXJzaW9uIHRvIG5ldyBQQ0kgQVBJIDoKKyAqIENvbnZlcnQgYW4gYWRkcmVzcyBpbiBhIGtlcm5lbCBidWZmZXIgdG8gYSBidXMvcGh5cy9kbWEgYWRkcmVzcy4KKyAqIFRoaXMgd29yayAqb25seSogZm9yIG1lbW9yeSBmcmFnbWVudHMgcGFydCBvZiBscC0+cGFnZV92YWRkciwKKyAqIGJlY2F1c2UgaXQgd2FzIHByb3Blcmx5IERNQSBhbGxvY2F0ZWQgdmlhIHBjaV9hbGxvY19jb25zaXN0ZW50KCksCisgKiBzbyB3ZSBqdXN0IG5lZWQgdG8gInJldHJlaXZlIiB0aGUgb3JpZ2luYWwgbWFwcGluZyB0byBidXMvcGh5cy9kbWEKKyAqIGFkZHJlc3MgLSBKZWFuIElJICovCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgdmlydF90b193aGF0ZXZlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgKiBwdHIpCit7CisJc3RydWN0IGhwMTAwX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gKCh1X2xvbmcpIHB0cikgKyBscC0+d2hhdGV2ZXJfb2Zmc2V0OworfQorCitzdGF0aWMgaW5saW5lIHVfaW50IHBkbF9tYXBfZGF0YShzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIHBjaV9tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LCBkYXRhLCAKKwkJCSAgICAgIE1BWF9FVEhFUl9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworfQorCisvKiBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgcmVhbGx5IGJlIG5lZWRlZCBpbiBhIGdvb2QgZGVzaWduLi4uICovCitzdGF0aWMgdm9pZCB3YWl0KHZvaWQpCit7CisJbWRlbGF5KDEpOworfQorCisvKgorICogIHByb2JlIGZ1bmN0aW9ucworICogIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgLSBpZiBwb3NzaWJsZSAtIGF2b2lkIGRvaW5nIHdyaXRlIG9wZXJhdGlvbnMKKyAqICBzaW5jZSB0aGlzIGNvdWxkIGNhdXNlIHByb2JsZW1zIHdoZW4gdGhlIGNhcmQgaXMgbm90IGluc3RhbGxlZC4KKyAqLworCisvKgorICogUmVhZCBib2FyZCBpZCBhbmQgY29udmVydCB0byBzdHJpbmcuCisgKiBFZmZlY3RpdmVseSBzYW1lIGNvZGUgYXMgZGVjb2RlX2Vpc2Ffc2lnCisgKi8KK3N0YXRpYyBfX2RldmluaXQgY29uc3QgY2hhciAqaHAxMDBfcmVhZF9pZChpbnQgaW9hZGRyKQoreworCWludCBpOworCXN0YXRpYyBjaGFyIHN0cltIUDEwMF9TSUdfTEVOXTsKKwl1bnNpZ25lZCBjaGFyIHNpZ1s0XSwgc3VtOworICAgICAgICB1bnNpZ25lZCBzaG9ydCByZXY7CisKKwlocDEwMF9wYWdlKElEX01BQ19BRERSKTsKKwlzdW0gPSAwOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJc2lnW2ldID0gaHAxMDBfaW5iKEJPQVJEX0lEICsgaSk7CisJCXN1bSArPSBzaWdbaV07CisJfQorCisJc3VtICs9IGhwMTAwX2luYihCT0FSRF9JRCArIGkpOworCWlmIChzdW0gIT0gMHhmZikKKwkJcmV0dXJuIE5VTEw7CS8qIGJhZCBjaGVja3N1bSAqLworCisgICAgICAgIHN0clswXSA9ICgoc2lnWzBdID4+IDIpICYgMHgxZikgKyAoJ0EnIC0gMSk7CisgICAgICAgIHN0clsxXSA9ICgoKHNpZ1swXSAmIDMpIDw8IDMpIHwgKHNpZ1sxXSA+PiA1KSkgKyAoJ0EnIC0gMSk7CisgICAgICAgIHN0clsyXSA9IChzaWdbMV0gJiAweDFmKSArICgnQScgLSAxKTsKKyAgICAgICAgcmV2ID0gKHNpZ1syXSA8PCA4KSB8IHNpZ1szXTsKKyAgICAgICAgc3ByaW50ZihzdHIgKyAzLCAiJTA0WCIsIHJldik7CisKKwlyZXR1cm4gc3RyOworfQorCitzdGF0aWMgX19pbml0IGludCBocDEwMF9pc2FfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpCit7CisJY29uc3QgY2hhciAqc2lnOworCWludCBpOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIEhQMTAwX1JFR0lPTl9TSVpFLCAiaHAxMDAiKSkKKwkJZ290byBlcnI7CisKKwlpZiAoaHAxMDBfaW53KEhXX0lEKSAhPSBIUDEwMF9IV19JRF9DQVNDQURFKSB7CisJCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgSFAxMDBfUkVHSU9OX1NJWkUpOworCQlnb3RvIGVycjsKKwl9CisKKwlzaWcgPSBocDEwMF9yZWFkX2lkKGlvYWRkcik7CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBIUDEwMF9SRUdJT05fU0laRSk7CisKKwlpZiAoc2lnID09IE5VTEwpCisJCWdvdG8gZXJyOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaHAxMDBfaXNhX3RibCk7IGkrKykgeworCQlpZiAoIXN0cmNtcChocDEwMF9pc2FfdGJsW2ldLCBzaWcpKSAKKwkJCWJyZWFrOworCisJfQorCisJaWYgKGkgPCBBUlJBWV9TSVpFKGhwMTAwX2lzYV90YmwpKQorCQlyZXR1cm4gaHAxMDBfcHJvYmUxKGRldiwgaW9hZGRyLCBIUDEwMF9CVVNfSVNBLCBOVUxMKTsKKyBlcnI6CisJcmV0dXJuIC1FTk9ERVY7CisKK30KKy8qCisgKiBQcm9iZSBmb3IgSVNBIGJvYXJkLgorICogRUlTQSBhbmQgUENJIGFyZSBoYW5kbGVkIGJ5IGRldmljZSBpbmZyYXN0cnVjdHVyZS4KKyAqLworCitzdGF0aWMgaW50ICBfX2luaXQgaHAxMDBfaXNhX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBhZGRyKQoreworCWludCBlcnIgPSAtRU5PREVWOworCisJLyogUHJvYmUgZm9yIGEgc3BlY2lmaWMgSVNBIGFkZHJlc3MgKi8JCQorCWlmIChhZGRyID4gMHhmZiAmJiBhZGRyIDwgMHg0MDApCisJCWVyciA9IGhwMTAwX2lzYV9wcm9iZTEoZGV2LCBhZGRyKTsKKworCWVsc2UgaWYgKGFkZHIgIT0gMCkgCisJCWVyciA9IC1FTlhJTzsKKworCWVsc2UgeworCQkvKiBQcm9iZSBhbGwgSVNBIHBvc3NpYmxlIHBvcnQgcmVnaW9ucyAqLworCQlmb3IgKGFkZHIgPSAweDEwMDsgYWRkciA8IDB4NDAwOyBhZGRyICs9IDB4MjApIHsKKwkJCWVyciA9IGhwMTAwX2lzYV9wcm9iZTEoZGV2LCBhZGRyKTsKKwkJCWlmICghZXJyKQorCQkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBlcnI7Cit9CisKKworI2lmbmRlZiBNT0RVTEUKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGhwMTAwX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGhwMTAwX3ByaXZhdGUpKTsKKwlpbnQgZXJyOworCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWhwMTAwX291dHcoMHg0MjAwLCBUUkFDRSk7CisJcHJpbnRrKCJocDEwMDogJXM6IHByb2JlXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwl9CisKKwllcnIgPSBocDEwMF9pc2FfcHJvYmUoZGV2LCBkZXYtPmJhc2VfYWRkcik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKKyBvdXQxOgorCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBIUDEwMF9SRUdJT05fU0laRSk7Cisgb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBocDEwMF9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkciwKKwkJCQkgIHVfY2hhciBidXMsIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCWludCBpOworCWludCBlcnIgPSAtRU5PREVWOworCWNvbnN0IGNoYXIgKmVpZDsKKwl1X2ludCBjaGlwOworCXVfY2hhciB1YzsKKwl1X2ludCBtZW1vcnlfc2l6ZSA9IDAsIHZpcnRfbWVtb3J5X3NpemUgPSAwOworCXVfc2hvcnQgbG9jYWxfbW9kZSwgbHN3OworCXNob3J0IG1lbV9tYXBwZWQ7CisJdW5zaWduZWQgbG9uZyBtZW1fcHRyX3BoeXM7CisJdm9pZCBfX2lvbWVtICptZW1fcHRyX3ZpcnQ7CisJc3RydWN0IGhwMTAwX3ByaXZhdGUgKmxwOworCisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWhwMTAwX291dHcoMHg0MjAxLCBUUkFDRSk7CisJcHJpbnRrKCJocDEwMDogJXM6IHByb2JlMVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogbWVtb3J5IHJlZ2lvbiBmb3IgcHJvZ3JhbW1lZCBpL28gKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgSFAxMDBfUkVHSU9OX1NJWkUsICJocDEwMCIpKQorCQlnb3RvIG91dDE7CisKKwlpZiAoaHAxMDBfaW53KEhXX0lEKSAhPSBIUDEwMF9IV19JRF9DQVNDQURFKSAKKwkJZ290byBvdXQyOworCisJY2hpcCA9IGhwMTAwX2ludyhQQUdJTkcpICYgSFAxMDBfQ0hJUElEX01BU0s7CisjaWZkZWYgSFAxMDBfREVCVUcKKwlpZiAoY2hpcCA9PSBIUDEwMF9DSElQSURfU0hBU1RBKQorCQlwcmludGsoImhwMTAwOiAlczogU2hhc3RhIENoaXAgZGV0ZWN0ZWQuIChUaGlzIGlzIGEgcHJlIDgwMi4xMiBjaGlwKVxuIiwgZGV2LT5uYW1lKTsKKwllbHNlIGlmIChjaGlwID09IEhQMTAwX0NISVBJRF9SQUlOSUVSKQorCQlwcmludGsoImhwMTAwOiAlczogUmFpbmllciBDaGlwIGRldGVjdGVkLiAoVGhpcyBpcyBhIHByZSA4MDIuMTIgY2hpcClcbiIsIGRldi0+bmFtZSk7CisJZWxzZSBpZiAoY2hpcCA9PSBIUDEwMF9DSElQSURfTEFTU0VOKQorCQlwcmludGsoImhwMTAwOiAlczogTGFzc2VuIENoaXAgZGV0ZWN0ZWQuXG4iLCBkZXYtPm5hbWUpOworCWVsc2UKKwkJcHJpbnRrKCJocDEwMDogJXM6IFdhcm5pbmc6IFVua25vd24gQ0FTQ0FERSBjaGlwIChpZD0weCUuNHgpLlxuIiwgZGV2LT5uYW1lLCBjaGlwKTsKKyNlbmRpZgorCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisKKwllaWQgPSBocDEwMF9yZWFkX2lkKGlvYWRkcik7CisJaWYgKGVpZCA9PSBOVUxMKSB7CS8qIGJhZCBjaGVja3N1bT8gKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaHAxMDBfcHJvYmU6IGJhZCBJRCBjaGVja3N1bSBhdCBiYXNlIHBvcnQgMHgleFxuIiwgaW9hZGRyKTsKKwkJZ290byBvdXQyOworCX0KKworCWhwMTAwX3BhZ2UoSURfTUFDX0FERFIpOworCWZvciAoaSA9IHVjID0gMDsgaSA8IDc7IGkrKykKKwkJdWMgKz0gaHAxMDBfaW5iKExBTl9BRERSICsgaSk7CisJaWYgKHVjICE9IDB4ZmYpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaHAxMDBfcHJvYmU6IGJhZCBsYW4gYWRkcmVzcyBjaGVja3N1bSBhdCBwb3J0IDB4JXgpXG4iLCBpb2FkZHIpOworCQllcnIgPSAtRUlPOworCQlnb3RvIG91dDI7CisJfQorCisJLyogTWFrZSBzdXJlLCB0aGF0IGFsbCByZWdpc3RlcnMgYXJlIGNvcnJlY3RseSB1cGRhdGVkLi4uICovCisKKwlocDEwMF9sb2FkX2VlcHJvbShkZXYsIGlvYWRkcik7CisJd2FpdCgpOworCisJLyoKKwkgKiBEZXRlcm1pbmUgZHJpdmVyIG9wZXJhdGlvbiBtb2RlCisJICoKKwkgKiBVc2UgdGhlIHZhcmlhYmxlICJocDEwMF9tb2RlIiB1cG9uIGluc21vZCBvciBhcyBrZXJuZWwgcGFyYW1ldGVyIHRvCisJICogZm9yY2UgZHJpdmVyIG1vZGVzOgorCSAqIGhwMTAwX21vZGU9MSAtPiBkZWZhdWx0LCB1c2UgYnVzbWFzdGVyIG1vZGUgaWYgY29uZmlndXJlZC4KKwkgKiBocDEwMF9tb2RlPTIgLT4gZW5hYmxlIHNoYXJlZCBtZW1vcnkgbW9kZSAKKwkgKiBocDEwMF9tb2RlPTMgLT4gZm9yY2UgdXNlIG9mIGkvbyBtYXBwZWQgbW9kZS4KKwkgKiBocDEwMF9tb2RlPTQgLT4gc2FtZSBhcyAxLCBidXQgcmUtc2V0IHRoZSBlbmFibGUgYml0IG9uIHRoZSBjYXJkLgorCSAqLworCisJLyoKKwkgKiBMU1cgdmFsdWVzOgorCSAqICAgMHgyMjc4IC0+IEoyNTg1QiwgUG5QIHNoYXJlZCBtZW1vcnkgbW9kZQorCSAqICAgMHgyMjcwIC0+IEoyNTg1Qiwgc2hhcmVkIG1lbW9yeSBtb2RlLCAweGRjMDAwCisJICogICAweGEyM2MgLT4gSjI1ODVCLCBJL08gbWFwcGVkIG1vZGUKKwkgKiAgIDB4MjI0MCAtPiBFSVNBIENPTVBFWCwgQnVzTWFzdGVyIChTaGFzdGEgQ2hpcCkKKwkgKiAgIDB4MjIyMCAtPiBFSVNBIEhQLCBJL08gKFNoYXN0YSBDaGlwKQorCSAqICAgMHgyMjYwIC0+IEVJU0EgSFAsIEJ1c01hc3RlciAoU2hhc3RhIENoaXApCisJICovCisKKyNpZiAwCisJbG9jYWxfbW9kZSA9IDB4MjI3MDsKKwlocDEwMF9vdXR3KDB4ZmVmZSwgT1BUSU9OX0xTVyk7CisJaHAxMDBfb3V0dyhsb2NhbF9tb2RlIHwgSFAxMDBfU0VUX0xCIHwgSFAxMDBfU0VUX0hCLCBPUFRJT05fTFNXKTsKKyNlbmRpZgorCisJLyogaHAxMDBfbW9kZSB2YWx1ZSBtYXliZSB1c2VkIGluIGZ1dHVyZSBieSBhbm90aGVyIGNhcmQgKi8KKwlsb2NhbF9tb2RlID0gaHAxMDBfbW9kZTsKKwlpZiAobG9jYWxfbW9kZSA8IDEgfHwgbG9jYWxfbW9kZSA+IDQpCisJCWxvY2FsX21vZGUgPSAxOwkvKiBkZWZhdWx0ICovCisjaWZkZWYgSFAxMDBfREVCVUcKKwlwcmludGsoImhwMTAwOiAlczogb3JpZ2luYWwgTFNXID0gMHgleFxuIiwgZGV2LT5uYW1lLAorCSAgICAgICBocDEwMF9pbncoT1BUSU9OX0xTVykpOworI2VuZGlmCisKKwlpZiAobG9jYWxfbW9kZSA9PSAzKSB7CisJCWhwMTAwX291dHcoSFAxMDBfTUVNX0VOIHwgSFAxMDBfUkVTRVRfTEIsIE9QVElPTl9MU1cpOworCQlocDEwMF9vdXR3KEhQMTAwX0lPX0VOIHwgSFAxMDBfU0VUX0xCLCBPUFRJT05fTFNXKTsKKwkJaHAxMDBfb3V0dyhIUDEwMF9CTV9XUklURSB8IEhQMTAwX0JNX1JFQUQgfCBIUDEwMF9SRVNFVF9IQiwgT1BUSU9OX0xTVyk7CisJCXByaW50aygiaHAxMDA6IElPIG1hcHBlZCBtb2RlIGZvcmNlZC5cbiIpOworCX0gZWxzZSBpZiAobG9jYWxfbW9kZSA9PSAyKSB7CisJCWhwMTAwX291dHcoSFAxMDBfTUVNX0VOIHwgSFAxMDBfU0VUX0xCLCBPUFRJT05fTFNXKTsKKwkJaHAxMDBfb3V0dyhIUDEwMF9JT19FTiB8IEhQMTAwX1NFVF9MQiwgT1BUSU9OX0xTVyk7CisJCWhwMTAwX291dHcoSFAxMDBfQk1fV1JJVEUgfCBIUDEwMF9CTV9SRUFEIHwgSFAxMDBfUkVTRVRfSEIsIE9QVElPTl9MU1cpOworCQlwcmludGsoImhwMTAwOiBTaGFyZWQgbWVtb3J5IG1vZGUgcmVxdWVzdGVkLlxuIik7CisJfSBlbHNlIGlmIChsb2NhbF9tb2RlID09IDQpIHsKKwkJaWYgKGNoaXAgPT0gSFAxMDBfQ0hJUElEX0xBU1NFTikgeworCQkJaHAxMDBfb3V0dyhIUDEwMF9CTV9XUklURSB8IEhQMTAwX0JNX1JFQUQgfCBIUDEwMF9TRVRfSEIsIE9QVElPTl9MU1cpOworCQkJaHAxMDBfb3V0dyhIUDEwMF9JT19FTiB8IEhQMTAwX01FTV9FTiB8IEhQMTAwX1JFU0VUX0xCLCBPUFRJT05fTFNXKTsKKwkJCXByaW50aygiaHAxMDA6IEJ1c21hc3RlciBtb2RlIHJlcXVlc3RlZC5cbiIpOworCQl9CisJCWxvY2FsX21vZGUgPSAxOworCX0KKworCWlmIChsb2NhbF9tb2RlID09IDEpIHsJLyogZGVmYXVsdCBiZWhhdmlvdXIgKi8KKwkJbHN3ID0gaHAxMDBfaW53KE9QVElPTl9MU1cpOworCisJCWlmICgobHN3ICYgSFAxMDBfSU9fRU4pICYmICh+bHN3ICYgSFAxMDBfTUVNX0VOKSAmJgorCQkgICAgKH5sc3cgJiAoSFAxMDBfQk1fV1JJVEUgfCBIUDEwMF9CTV9SRUFEKSkpIHsKKyNpZmRlZiBIUDEwMF9ERUJVRworCQkJcHJpbnRrKCJocDEwMDogJXM6IElPX0VOIGJpdCBpcyBzZXQgb24gY2FyZC5cbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJCWxvY2FsX21vZGUgPSAzOworCQl9IGVsc2UgaWYgKGNoaXAgPT0gSFAxMDBfQ0hJUElEX0xBU1NFTiAmJgorCQkJICAgKGxzdyAmIChIUDEwMF9CTV9XUklURSB8IEhQMTAwX0JNX1JFQUQpKSA9PSAoSFAxMDBfQk1fV1JJVEUgfCBIUDEwMF9CTV9SRUFEKSkgeworCQkJLyogQ29udmVyc2lvbiB0byBuZXcgUENJIEFQSSA6CisJCQkgKiBJIGRvbid0IGhhdmUgdGhlIGRvYywgYnV0IEkgYXNzdW1lIHRoYXQgdGhlIGNhcmQKKwkJCSAqIGNhbiBtYXAgdGhlIGZ1bGwgMzJiaXQgYWRkcmVzcyBzcGFjZS4KKwkJCSAqIEFsc28sIHdlIGNhbiBoYXZlIEVJU0EgQnVzbWFzdGVyIGNhcmRzIChub3QgdGVzdGVkKSwKKwkJCSAqIHNvIGJld2FyZSAhISEgLSBKZWFuIElJICovCisJCQlpZigoYnVzID09IEhQMTAwX0JVU19QQ0kpICYmCisJCQkgICAocGNpX3NldF9kbWFfbWFzayhwY2lfZGV2LCAweGZmZmZmZmZmKSkpIHsKKwkJCQkvKiBHcmFjZWZ1bGx5IGZhbGxiYWNrIHRvIHNoYXJlZCBtZW1vcnkgKi8KKwkJCQlnb3RvIGJ1c21hc3RlcmZhaWw7CisJCQl9CisJCQlwcmludGsoImhwMTAwOiBCdXNtYXN0ZXIgbW9kZSBlbmFibGVkLlxuIik7CisJCQlocDEwMF9vdXR3KEhQMTAwX01FTV9FTiB8IEhQMTAwX0lPX0VOIHwgSFAxMDBfUkVTRVRfTEIsIE9QVElPTl9MU1cpOworCQl9IGVsc2UgeworCQlidXNtYXN0ZXJmYWlsOgorI2lmZGVmIEhQMTAwX0RFQlVHCisJCQlwcmludGsoImhwMTAwOiAlczogQ2FyZCBub3QgY29uZmlndXJlZCBmb3IgQk0gb3IgQk0gbm90IHN1cHBvcnRlZCB3aXRoIHRoaXMgY2FyZC5cbiIsIGRldi0+bmFtZSk7CisJCQlwcmludGsoImhwMTAwOiAlczogVHJ5aW5nIHNoYXJlZCBtZW1vcnkgbW9kZS5cbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJCS8qIEluIHRoaXMgY2FzZSwgdHJ5IHNoYXJlZCBtZW1vcnkgbW9kZSAqLworCQkJbG9jYWxfbW9kZSA9IDI7CisJCQlocDEwMF9vdXR3KEhQMTAwX01FTV9FTiB8IEhQMTAwX1NFVF9MQiwgT1BUSU9OX0xTVyk7CisJCQkvKiBocDEwMF9vdXR3KEhQMTAwX0lPX0VOfEhQMTAwX1JFU0VUX0xCLCBPUFRJT05fTFNXKTsgKi8KKwkJfQorCX0KKyNpZmRlZiBIUDEwMF9ERUJVRworCXByaW50aygiaHAxMDA6ICVzOiBuZXcgTFNXID0gMHgleFxuIiwgZGV2LT5uYW1lLCBocDEwMF9pbncoT1BUSU9OX0xTVykpOworI2VuZGlmCisKKwkvKiBDaGVjayBmb3Igc2hhcmVkIG1lbW9yeSBvbiB0aGUgY2FyZCwgZXZlbnR1YWxseSByZW1hcCBpdCAqLworCWhwMTAwX3BhZ2UoSFdfTUFQKTsKKwltZW1fbWFwcGVkID0gKChocDEwMF9pbncoT1BUSU9OX0xTVykgJiAoSFAxMDBfTUVNX0VOKSkgIT0gMCk7CisJbWVtX3B0cl9waHlzID0gMFVMOworCW1lbV9wdHJfdmlydCA9IE5VTEw7CisJbWVtb3J5X3NpemUgPSAoODE5MiA8PCAoKGhwMTAwX2luYihTUkFNKSA+PiA1KSAmIDB4MDcpKTsKKwl2aXJ0X21lbW9yeV9zaXplID0gMDsKKworCS8qIEZvciBtZW1vcnkgbWFwcGVkIG9yIGJ1c21hc3RlciBtb2RlLCB3ZSB3YW50IHRoZSBtZW1vcnkgYWRkcmVzcyAqLworCWlmIChtZW1fbWFwcGVkIHx8IChsb2NhbF9tb2RlID09IDEpKSB7CisJCW1lbV9wdHJfcGh5cyA9IChocDEwMF9pbncoTUVNX01BUF9MU1cpIHwgKGhwMTAwX2ludyhNRU1fTUFQX01TVykgPDwgMTYpKTsKKwkJbWVtX3B0cl9waHlzICY9IH4weDFmZmY7CS8qIDhrIGFsaWdubWVudCAqLworCisJCWlmIChidXMgPT0gSFAxMDBfQlVTX0lTQSAmJiAobWVtX3B0cl9waHlzICYgfjB4ZmZmZmYpICE9IDApIHsKKwkJCXByaW50aygiaHAxMDA6IENhbiBvbmx5IHVzZSBwcm9ncmFtbWVkIGkvbyBtb2RlLlxuIik7CisJCQltZW1fcHRyX3BoeXMgPSAwOworCQkJbWVtX21hcHBlZCA9IDA7CisJCQlsb2NhbF9tb2RlID0gMzsJLyogVXNlIHByb2dyYW1tZWQgaS9vICovCisJCX0KKworCQkvKiBXZSBkbyBub3QgbmVlZCBhY2Nlc3MgdG8gc2hhcmVkIG1lbW9yeSBpbiBidXNtYXN0ZXIgbW9kZSAqLworCQkvKiBIb3dldmVyIGluIHNsYXZlIG1vZGUgd2UgbmVlZCB0byByZW1hcCBoaWdoICg+MUdCKSBjYXJkIG1lbW9yeSAgKi8KKwkJaWYgKGxvY2FsX21vZGUgIT0gMSkgewkvKiA9IG5vdCBidXNtYXN0ZXIgKi8KKwkJCS8qIFdlIHRyeSB3aXRoIHNtYWxsZXIgbWVtb3J5IHNpemVzLCBpZiBpb3JlbWFwIGZhaWxzICovCisJCQlmb3IgKHZpcnRfbWVtb3J5X3NpemUgPSBtZW1vcnlfc2l6ZTsgdmlydF9tZW1vcnlfc2l6ZSA+IDE2MzgzOyB2aXJ0X21lbW9yeV9zaXplID4+PSAxKSB7CisJCQkJaWYgKChtZW1fcHRyX3ZpcnQgPSBpb3JlbWFwKCh1X2xvbmcpIG1lbV9wdHJfcGh5cywgdmlydF9tZW1vcnlfc2l6ZSkpID09IE5VTEwpIHsKKyNpZmRlZiBIUDEwMF9ERUJVRworCQkJCQlwcmludGsoImhwMTAwOiAlczogaW9yZW1hcCBmb3IgMHgleCBieXRlcyBoaWdoIFBDSSBtZW1vcnkgYXQgMHglbHggZmFpbGVkXG4iLCBkZXYtPm5hbWUsIHZpcnRfbWVtb3J5X3NpemUsIG1lbV9wdHJfcGh5cyk7CisjZW5kaWYKKwkJCQl9IGVsc2UgeworI2lmZGVmIEhQMTAwX0RFQlVHCisJCQkJCXByaW50aygiaHAxMDA6ICVzOiByZW1hcHBlZCAweCV4IGJ5dGVzIGhpZ2ggUENJIG1lbW9yeSBhdCAweCVseCB0byAlcC5cbiIsIGRldi0+bmFtZSwgdmlydF9tZW1vcnlfc2l6ZSwgbWVtX3B0cl9waHlzLCBtZW1fcHRyX3ZpcnQpOworI2VuZGlmCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKG1lbV9wdHJfdmlydCA9PSBOVUxMKSB7CS8qIGFsbCBpb3JlbWFwIHRyaWVzIGZhaWxlZCAqLworCQkJCXByaW50aygiaHAxMDA6IEZhaWxlZCB0byBpb3JlbWFwIHRoZSBQQ0kgY2FyZCBtZW1vcnkuIFdpbGwgaGF2ZSB0byB1c2UgaS9vIG1hcHBlZCBtb2RlLlxuIik7CisJCQkJbG9jYWxfbW9kZSA9IDM7CisJCQkJdmlydF9tZW1vcnlfc2l6ZSA9IDA7CisJCQl9CisJCX0KKwl9CisKKwlpZiAobG9jYWxfbW9kZSA9PSAzKSB7CS8qIGlvIG1hcHBlZCBmb3JjZWQgKi8KKwkJbWVtX21hcHBlZCA9IDA7CisJCW1lbV9wdHJfcGh5cyA9IDA7CisJCW1lbV9wdHJfdmlydCA9IE5VTEw7CisJCXByaW50aygiaHAxMDA6IFVzaW5nIChzbG93KSBwcm9ncmFtbWVkIGkvbyBtb2RlLlxuIik7CisJfQorCisJLyogSW5pdGlhbGlzZSB0aGUgInByaXZhdGUiIGRhdGEgc3RydWN0dXJlIGZvciB0aGlzIGNhcmQuICovCisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKwlzdHJsY3B5KGxwLT5pZCwgZWlkLCBIUDEwMF9TSUdfTEVOKTsKKwlscC0+Y2hpcCA9IGNoaXA7CisJbHAtPm1vZGUgPSBsb2NhbF9tb2RlOworCWxwLT5idXMgPSBidXM7CisJbHAtPnBjaV9kZXYgPSBwY2lfZGV2OworCWxwLT5wcmlvcml0eV90eCA9IGhwMTAwX3ByaW9yaXR5X3R4OworCWxwLT5yeF9yYXRpbyA9IGhwMTAwX3J4X3JhdGlvOworCWxwLT5tZW1fcHRyX3BoeXMgPSBtZW1fcHRyX3BoeXM7CisJbHAtPm1lbV9wdHJfdmlydCA9IG1lbV9wdHJfdmlydDsKKwlocDEwMF9wYWdlKElEX01BQ19BRERSKTsKKwlscC0+c29mdF9tb2RlbCA9IGhwMTAwX2luYihTT0ZUX01PREVMKTsKKwlscC0+bWFjMV9tb2RlID0gSFAxMDBfTUFDMU1PREUzOworCWxwLT5tYWMyX21vZGUgPSBIUDEwMF9NQUMyTU9ERTM7CisJbWVtc2V0KCZscC0+aGFzaF9ieXRlcywgMHgwMCwgOCk7CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKworCWxwLT5tZW1vcnlfc2l6ZSA9IG1lbW9yeV9zaXplOworCWxwLT52aXJ0X21lbW9yeV9zaXplID0gdmlydF9tZW1vcnlfc2l6ZTsKKwlscC0+cnhfcmF0aW8gPSBocDEwMF9yeF9yYXRpbzsJLyogY2FuIGJlIGNvbmYnZCB3aXRoIGluc21vZCAqLworCisJZGV2LT5vcGVuID0gaHAxMDBfb3BlbjsKKwlkZXYtPnN0b3AgPSBocDEwMF9jbG9zZTsKKworCWlmIChscC0+bW9kZSA9PSAxKQkvKiBidXNtYXN0ZXIgKi8KKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBocDEwMF9zdGFydF94bWl0X2JtOworCWVsc2UKKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBocDEwMF9zdGFydF94bWl0OworCisJZGV2LT5nZXRfc3RhdHMgPSBocDEwMF9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmaHAxMDBfc2V0X211bHRpY2FzdF9saXN0OworCisJLyogQXNrIHRoZSBjYXJkIGZvciB3aGljaCBJUlEgbGluZSBpdCBpcyBjb25maWd1cmVkICovCisJaWYgKGJ1cyA9PSBIUDEwMF9CVVNfUENJKSB7CisJCWRldi0+aXJxID0gcGNpX2Rldi0+aXJxOworCX0gZWxzZSB7CisJCWhwMTAwX3BhZ2UoSFdfTUFQKTsKKwkJZGV2LT5pcnEgPSBocDEwMF9pbmIoSVJRX0NIQU5ORUwpICYgSFAxMDBfSVJRTUFTSzsKKwkJaWYgKGRldi0+aXJxID09IDIpCisJCQlkZXYtPmlycSA9IDk7CisJfQorCisJaWYgKGxwLT5tb2RlID09IDEpCS8qIGJ1c21hc3RlciAqLworCQlkZXYtPmRtYSA9IDQ7CisKKwkvKiBBc2sgdGhlIGNhcmQgZm9yIGl0cyBNQUMgYWRkcmVzcyBhbmQgc3RvcmUgaXQgZm9yIGxhdGVyIHVzZS4gKi8KKwlocDEwMF9wYWdlKElEX01BQ19BRERSKTsKKwlmb3IgKGkgPSB1YyA9IDA7IGkgPCA2OyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSBocDEwMF9pbmIoTEFOX0FERFIgKyBpKTsKKworCS8qIFJlc2V0IHN0YXRpc3RpY3MgKGNvdW50ZXJzKSAqLworCWhwMTAwX2NsZWFyX3N0YXRzKGxwLCBpb2FkZHIpOworCisJLyogSWYgYnVzbWFzdGVyIG1vZGUgaXMgd2FudGVkLCBhIGRtYS1jYXBhYmxlIG1lbW9yeSBhcmVhIGlzIG5lZWRlZCBmb3IKKwkgKiB0aGUgcnggYW5kIHR4IFBETHMgCisJICogUENJIGNhcmRzIGNhbiBhY2Nlc3MgdGhlIHdob2xlIFBDIG1lbW9yeS4gVGhlcmVmb3JlIEdGUF9ETUEgaXMgbm90CisJICogbmVlZGVkIGZvciB0aGUgYWxsb2NhdGlvbiBvZiB0aGUgbWVtb3J5IGFyZWEuIAorCSAqLworCisJLyogVE9ETzogV2UgZG8gbm90IG5lZWQgdGhpcyB3aXRoIG9sZCBjYXJkcywgd2hlcmUgUERMcyBhcmUgc3RvcmVkCisJICogaW4gdGhlIGNhcmRzIHNoYXJlZCBtZW1vcnkgYXJlYS4gQnV0IGN1cnJlbnRseSwgYnVzbWFzdGVyIGhhcyBiZWVuCisJICogaW1wbGVtZW50ZWQvdGVzdGVkIG9ubHkgd2l0aCB0aGUgbGFzc2VuIGNoaXAgYW55d2F5Li4uICovCisJaWYgKGxwLT5tb2RlID09IDEpIHsJLyogYnVzbWFzdGVyICovCisJCWRtYV9hZGRyX3QgcGFnZV9iYWRkcjsKKwkJLyogR2V0IHBoeXNpY2FsbHkgY29udGlub3VzIG1lbW9yeSBmb3IgVFggJiBSWCBQRExzICAgICovCisJCS8qIENvbnZlcnNpb24gdG8gbmV3IFBDSSBBUEkgOgorCQkgKiBQYWdlcyBhcmUgYWx3YXlzIGFsaWduZWQgYW5kIHplcm9lZCwgbm8gbmVlZCB0byBpdCBvdXJzZWxmLgorCQkgKiBEb2Mgc2F5cyBzaG91bGQgYmUgT0sgZm9yIEVJU0EgYnVzIGFzIHdlbGwgLSBKZWFuIElJICovCisJCWlmICgobHAtPnBhZ2VfdmFkZHJfYWxnbiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGxwLT5wY2lfZGV2LCBNQVhfUklOR1NJWkUsICZwYWdlX2JhZGRyKSkgPT0gTlVMTCkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0MjsKKwkJfQorCQlscC0+d2hhdGV2ZXJfb2Zmc2V0ID0gKCh1X2xvbmcpIHBhZ2VfYmFkZHIpIC0gKCh1X2xvbmcpIGxwLT5wYWdlX3ZhZGRyX2FsZ24pOworCisjaWZkZWYgSFAxMDBfREVCVUdfQk0KKwkJcHJpbnRrKCJocDEwMDogJXM6IFJlc2VydmVkIERNQSBtZW1vcnkgZnJvbSAweCV4IHRvIDB4JXhcbiIsIGRldi0+bmFtZSwgKHVfaW50KSBscC0+cGFnZV92YWRkcl9hbGduLCAodV9pbnQpIGxwLT5wYWdlX3ZhZGRyX2FsZ24gKyBNQVhfUklOR1NJWkUpOworI2VuZGlmCisJCWxwLT5yeHJjb21taXQgPSBscC0+dHhyY29tbWl0ID0gMDsKKwkJbHAtPnJ4cmhlYWQgPSBscC0+cnhydGFpbCA9ICYobHAtPnJ4cmluZ1swXSk7CisJCWxwLT50eHJoZWFkID0gbHAtPnR4cnRhaWwgPSAmKGxwLT50eHJpbmdbMF0pOworCX0KKworCS8qIEluaXRpYWxpc2UgdGhlIGNhcmQuICovCisJLyogKEknbSBub3QgcmVhbGx5IHN1cmUgaWYgaXQncyBhIGdvb2QgaWRlYSB0byBkbyB0aGlzIGR1cmluZyBwcm9iaW5nLCBidXQgCisJICogbGlrZSB0aGlzIGl0J3MgYXNzdXJlZCB0aGF0IHRoZSBsYW4gY29ubmVjdGlvbiB0eXBlIGNhbiBiZSBzZW5zZWQKKwkgKiBjb3JyZWN0bHkpCisJICovCisJaHAxMDBfaHdpbml0KGRldik7CisKKwkvKiBUcnkgdG8gZmluZCBvdXQgd2hpY2gga2luZCBvZiBMQU4gdGhlIGNhcmQgaXMgY29ubmVjdGVkIHRvLiAqLworCWxwLT5sYW5fdHlwZSA9IGhwMTAwX3NlbnNlX2xhbihkZXYpOworCisJLyogUHJpbnQgb3V0IGEgbWVzc2FnZSB3aGF0IGFib3V0IHdoYXQgd2UgdGhpbmsgd2UgaGF2ZSBwcm9iZWQuICovCisJcHJpbnRrKCJocDEwMDogYXQgMHgleCwgSVJRICVkLCAiLCBpb2FkZHIsIGRldi0+aXJxKTsKKwlzd2l0Y2ggKGJ1cykgeworCWNhc2UgSFAxMDBfQlVTX0VJU0E6CisJCXByaW50aygiRUlTQSIpOworCQlicmVhazsKKwljYXNlIEhQMTAwX0JVU19QQ0k6CisJCXByaW50aygiUENJIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygiSVNBIik7CisJCWJyZWFrOworCX0KKwlwcmludGsoIiBidXMsICVkayBTUkFNIChyeC90eCAlZCUlKS5cbiIsIGxwLT5tZW1vcnlfc2l6ZSA+PiAxMCwgbHAtPnJ4X3JhdGlvKTsKKworCWlmIChscC0+bW9kZSA9PSAyKSB7CS8qIG1lbW9yeSBtYXBwZWQgKi8KKwkJcHJpbnRrKCJocDEwMDogTWVtb3J5IGFyZWEgYXQgMHglbHgtMHglbHgiLCBtZW1fcHRyX3BoeXMsCisJCQkJKG1lbV9wdHJfcGh5cyArIChtZW1fcHRyX3BoeXMgPiAweDEwMDAwMCA/ICh1X2xvbmcpIGxwLT5tZW1vcnlfc2l6ZSA6IDE2ICogMTAyNCkpIC0gMSk7CisJCWlmIChtZW1fcHRyX3ZpcnQpCisJCQlwcmludGsoIiAodmlydHVhbCBiYXNlICVwKSIsIG1lbV9wdHJfdmlydCk7CisJCXByaW50aygiLlxuIik7CisKKwkJLyogU2V0IGZvciBpbmZvIHdoZW4gZG9pbmcgaWZjb25maWcgKi8KKwkJZGV2LT5tZW1fc3RhcnQgPSBtZW1fcHRyX3BoeXM7CisJCWRldi0+bWVtX2VuZCA9IG1lbV9wdHJfcGh5cyArIGxwLT5tZW1vcnlfc2l6ZTsKKwl9CisKKwlwcmludGsoImhwMTAwOiAiKTsKKwlpZiAobHAtPmxhbl90eXBlICE9IEhQMTAwX0xBTl9FUlIpCisJCXByaW50aygiQWRhcHRlciBpcyBhdHRhY2hlZCB0byAiKTsKKwlzd2l0Y2ggKGxwLT5sYW5fdHlwZSkgeworCWNhc2UgSFAxMDBfTEFOXzEwMDoKKwkJcHJpbnRrKCIxMDBNYi9zIFZvaWNlIEdyYWRlIEFueUxBTiBuZXR3b3JrLlxuIik7CisJCWJyZWFrOworCWNhc2UgSFAxMDBfTEFOXzEwOgorCQlwcmludGsoIjEwTWIvcyBuZXR3b3JrICgxMGJhc2VUKS5cbiIpOworCQlicmVhazsKKwljYXNlIEhQMTAwX0xBTl9DT0FYOgorCQlwcmludGsoIjEwTWIvcyBuZXR3b3JrIChjb2F4KS5cbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoIldhcm5pbmchIExpbmsgZG93bi5cbiIpOworCX0KKworCXJldHVybiAwOworb3V0MjoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEhQMTAwX1JFR0lPTl9TSVpFKTsKK291dDE6CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qIFRoaXMgcHJvY2VkdXJlIHB1dHMgdGhlIGNhcmQgaW50byBhIHN0YWJsZSBpbml0IHN0YXRlICovCitzdGF0aWMgdm9pZCBocDEwMF9od2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGhwMTAwX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworI2lmZGVmIEhQMTAwX0RFQlVHX0IKKwlocDEwMF9vdXR3KDB4NDIwMiwgVFJBQ0UpOworCXByaW50aygiaHAxMDA6ICVzOiBod2luaXRcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCS8qIEluaXRpYWxpc2UgdGhlIGNhcmQuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkvKiBDbGVhciBhbGwgcGVuZGluZyBJbnRzIGFuZCBkaXNhYmxlIEludHMgKi8KKwlocDEwMF9wYWdlKFBFUkZPUk1BTkNFKTsKKwlocDEwMF9vdXR3KDB4ZmVmZSwgSVJRX01BU0spOwkvKiBtYXNrIG9mZiBhbGwgaW50cyAqLworCWhwMTAwX291dHcoMHhmZmZmLCBJUlFfU1RBVFVTKTsJLyogY2xlYXIgYWxsIHBlbmRpbmcgaW50cyAqLworCisJaHAxMDBfb3V0dyhIUDEwMF9JTlRfRU4gfCBIUDEwMF9SRVNFVF9MQiwgT1BUSU9OX0xTVyk7CisJaHAxMDBfb3V0dyhIUDEwMF9UUklfSU5UIHwgSFAxMDBfU0VUX0hCLCBPUFRJT05fTFNXKTsKKworCWlmIChscC0+bW9kZSA9PSAxKSB7CisJCWhwMTAwX0JNX3NodXRkb3duKGRldik7CS8qIGRpc2FibGVzIEJNLCBwdXRzIGNhc2NhZGUgaW4gcmVzZXQgKi8KKwkJd2FpdCgpOworCX0gZWxzZSB7CisJCWhwMTAwX291dHcoSFAxMDBfSU5UX0VOIHwgSFAxMDBfUkVTRVRfTEIsIE9QVElPTl9MU1cpOworCQlocDEwMF9jYXNjYWRlX3Jlc2V0KGRldiwgMSk7CisJCWhwMTAwX3BhZ2UoTUFDX0NUUkwpOworCQlocDEwMF9hbmRiKH4oSFAxMDBfUlhfRU4gfCBIUDEwMF9UWF9FTiksIE1BQ19DRkdfMSk7CisJfQorCisJLyogSW5pdGlhdGUgRUVQUk9NIHJlbG9hZCAqLworCWhwMTAwX2xvYWRfZWVwcm9tKGRldiwgMCk7CisKKwl3YWl0KCk7CisKKwkvKiBHbyBpbnRvIHJlc2V0IGFnYWluLiAqLworCWhwMTAwX2Nhc2NhZGVfcmVzZXQoZGV2LCAxKTsKKworCS8qIFNldCBPcHRpb24gUmVnaXN0ZXJzIHRvIGEgc2FmZSBzdGF0ZSAgKi8KKwlocDEwMF9vdXR3KEhQMTAwX0RFQlVHX0VOIHwKKwkJICAgSFAxMDBfUlhfSERSIHwKKwkJICAgSFAxMDBfRUVfRU4gfAorCQkgICBIUDEwMF9CTV9XUklURSB8CisJCSAgIEhQMTAwX0JNX1JFQUQgfCBIUDEwMF9SRVNFVF9IQiB8CisJCSAgIEhQMTAwX0ZBS0VfSU5UIHwKKwkJICAgSFAxMDBfSU5UX0VOIHwKKwkJICAgSFAxMDBfTUVNX0VOIHwKKwkJICAgSFAxMDBfSU9fRU4gfCBIUDEwMF9SRVNFVF9MQiwgT1BUSU9OX0xTVyk7CisKKwlocDEwMF9vdXR3KEhQMTAwX1RSSV9JTlQgfAorCQkgICBIUDEwMF9NTUFQX0RJUyB8IEhQMTAwX1NFVF9IQiwgT1BUSU9OX0xTVyk7CisKKwlocDEwMF9vdXRiKEhQMTAwX1BSSU9SSVRZX1RYIHwKKwkJICAgSFAxMDBfQURWX05YVF9QS1QgfAorCQkgICBIUDEwMF9UWF9DTUQgfCBIUDEwMF9SRVNFVF9MQiwgT1BUSU9OX01TVyk7CisKKwkvKiBUT0RPOiBDb25maWd1cmUgTU1VIGZvciBSYW0gVGVzdC4gKi8KKwkvKiBUT0RPOiBSYW0gVGVzdC4gKi8KKworCS8qIFJlLWNoZWNrIGlmIGFkYXB0ZXIgaXMgc3RpbGwgYXQgc2FtZSBpL28gbG9jYXRpb24gICAgICAqLworCS8qIChJZiB0aGUgYmFzZSBpL28gaW4gZWVwcm9tIGhhcyBiZWVuIGNoYW5nZWQgYnV0IHRoZSAgICAqLworCS8qIHJlZ2lzdGVycyBoYWQgbm90IGJlZW4gY2hhbmdlZCwgYSByZWxvYWQgb2YgdGhlIGVlcHJvbSAqLworCS8qIHdvdWxkIG1vdmUgdGhlIGFkYXB0ZXIgdG8gdGhlIGFkZHJlc3Mgc3RvcmVkIGluIGVlcHJvbSAqLworCisJLyogVE9ETzogQ29kZSB0byBpbXBsZW1lbnQuICovCisKKwkvKiBVbnRpbCBoZXJlIGl0IHdhcyBjb2RlIGZyb20gSFdkaXNjb3ZlciBwcm9jZWR1cmUuICovCisJLyogTmV4dCBjb21lcyBjb2RlIGZyb20gbW11aW5pdCBwcm9jZWR1cmUgb2YgU0NPIEJNIGRyaXZlciB3aGljaCBpcworCSAqIGNhbGxlZCBmcm9tIEhXY29uZmlndXJlIGluIHRoZSBTQ08gZHJpdmVyLiAgKi8KKworCS8qIEluaXRpYWxpc2UgTU1VLCBldmVudHVhbGx5IHN3aXRjaCBvbiBCdXNtYXN0ZXIgTW9kZSwgaW5pdGlhbGlzZSAKKwkgKiBtdWx0aWNhc3QgZmlsdGVyLi4uCisJICovCisJaHAxMDBfbW11aW5pdChkZXYpOworCisJLyogV2UgZG9uJ3QgdHVybiB0aGUgaW50ZXJydXB0cyBvbiBoZXJlIC0gdGhpcyBpcyBkb25lIGJ5IHN0YXJ0X2ludGVyZmFjZS4gKi8KKwl3YWl0KCk7CQkJLyogVE9ETzogRG8gd2UgcmVhbGx5IG5lZWQgdGhpcz8gKi8KKworCS8qIEVuYWJsZSBIYXJkd2FyZSAoZS5nLiB1bnJlc2V0KSAqLworCWhwMTAwX2Nhc2NhZGVfcmVzZXQoZGV2LCAwKTsKKworCS8qIC0tLS0tLS0gaW5pdGlhbGlzYXRpb24gY29tcGxldGUgLS0tLS0tLS0tLS0gKi8KKworCS8qIEZpbmFsbHkgdHJ5IHRvIGxvZyBpbiB0aGUgSHViIGlmIHRoZXJlIG1heSBiZSBhIFZHIGNvbm5lY3Rpb24uICovCisJaWYgKChscC0+bGFuX3R5cGUgPT0gSFAxMDBfTEFOXzEwMCkgfHwgKGxwLT5sYW5fdHlwZSA9PSBIUDEwMF9MQU5fRVJSKSkKKwkJaHAxMDBfbG9naW5fdG9fdmdfaHViKGRldiwgMCk7CS8qIHJlbG9naW4gKi8KKworfQorDAorCisvKiAKKyAqIG1tdWluaXQgLSBSZWluaXRpYWxpc2UgQ2FzY2FkZSBNTVUgYW5kIE1BQyBzZXR0aW5ncy4KKyAqIE5vdGU6IE11c3QgYWxyZWFkeSBiZSBpbiByZXNldCBhbmQgbGVhdmVzIGNhcmQgaW4gcmVzZXQuIAorICovCitzdGF0aWMgdm9pZCBocDEwMF9tbXVpbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBocDEwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKyNpZmRlZiBIUDEwMF9ERUJVR19CCisJaHAxMDBfb3V0dygweDQyMDMsIFRSQUNFKTsKKwlwcmludGsoImhwMTAwOiAlczogbW11aW5pdFxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisjaWZkZWYgSFAxMDBfREVCVUcKKwlpZiAoMCAhPSAoaHAxMDBfaW53KE9QVElPTl9MU1cpICYgSFAxMDBfSFdfUlNUKSkgeworCQlwcmludGsoImhwMTAwOiAlczogTm90IGluIHJlc2V0IHdoZW4gZW50ZXJpbmcgbW11aW5pdC4gRml4IG1lLlxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJLyogTWFrZSBzdXJlIElSUXMgYXJlIG1hc2tlZCBvZmYgYW5kIGFjaydlZC4gKi8KKwlocDEwMF9wYWdlKFBFUkZPUk1BTkNFKTsKKwlocDEwMF9vdXR3KDB4ZmVmZSwgSVJRX01BU0spOwkvKiBtYXNrIG9mZiBhbGwgaW50cyAqLworCWhwMTAwX291dHcoMHhmZmZmLCBJUlFfU1RBVFVTKTsJLyogYWNrIElSUSAqLworCisJLyoKKwkgKiBFbmFibGUgSGFyZHdhcmUgCisJICogLSBDbGVhciBEZWJ1ZyBFbiwgUnggSGRyIFBpcGUsIEVFIEVuLCBJL08gRW4sIEZha2UgSW50IGFuZCBJbnRyIEVuCisJICogLSBTZXQgVHJpLVN0YXRlIEludCwgQnVzIE1hc3RlciBSZC9XciwgYW5kIE1lbSBNYXAgRGlzYWJsZQorCSAqIC0gQ2xlYXIgUHJpb3JpdHksIEFkdmFuY2UgUGt0IGFuZCBYbWl0IENtZAorCSAqLworCisJaHAxMDBfb3V0dyhIUDEwMF9ERUJVR19FTiB8CisJCSAgIEhQMTAwX1JYX0hEUiB8CisJCSAgIEhQMTAwX0VFX0VOIHwgSFAxMDBfUkVTRVRfSEIgfAorCQkgICBIUDEwMF9JT19FTiB8CisJCSAgIEhQMTAwX0ZBS0VfSU5UIHwKKwkJICAgSFAxMDBfSU5UX0VOIHwgSFAxMDBfUkVTRVRfTEIsIE9QVElPTl9MU1cpOworCisJaHAxMDBfb3V0dyhIUDEwMF9UUklfSU5UIHwgSFAxMDBfU0VUX0hCLCBPUFRJT05fTFNXKTsKKworCWlmIChscC0+bW9kZSA9PSAxKSB7CS8qIGJ1c21hc3RlciAqLworCQlocDEwMF9vdXR3KEhQMTAwX0JNX1dSSVRFIHwKKwkJCSAgIEhQMTAwX0JNX1JFQUQgfAorCQkJICAgSFAxMDBfTU1BUF9ESVMgfCBIUDEwMF9TRVRfSEIsIE9QVElPTl9MU1cpOworCX0gZWxzZSBpZiAobHAtPm1vZGUgPT0gMikgewkvKiBtZW1vcnkgbWFwcGVkICovCisJCWhwMTAwX291dHcoSFAxMDBfQk1fV1JJVEUgfAorCQkJICAgSFAxMDBfQk1fUkVBRCB8IEhQMTAwX1JFU0VUX0hCLCBPUFRJT05fTFNXKTsKKwkJaHAxMDBfb3V0dyhIUDEwMF9NTUFQX0RJUyB8IEhQMTAwX1JFU0VUX0hCLCBPUFRJT05fTFNXKTsKKwkJaHAxMDBfb3V0dyhIUDEwMF9NRU1fRU4gfCBIUDEwMF9TRVRfTEIsIE9QVElPTl9MU1cpOworCQlocDEwMF9vdXR3KEhQMTAwX0lPX0VOIHwgSFAxMDBfU0VUX0xCLCBPUFRJT05fTFNXKTsKKwl9IGVsc2UgaWYgKGxwLT5tb2RlID09IDMpIHsJLyogaS9vIG1hcHBlZCBtb2RlICovCisJCWhwMTAwX291dHcoSFAxMDBfTU1BUF9ESVMgfCBIUDEwMF9TRVRfSEIgfAorCQkJICAgSFAxMDBfSU9fRU4gfCBIUDEwMF9TRVRfTEIsIE9QVElPTl9MU1cpOworCX0KKworCWhwMTAwX3BhZ2UoSFdfTUFQKTsKKwlocDEwMF9vdXRiKDAsIEVBUkxZUlhDRkcpOworCWhwMTAwX291dHcoMCwgRUFSTFlUWENGRyk7CisKKwkvKgorCSAqIEVuYWJsZSBCdXMgTWFzdGVyIG1vZGUKKwkgKi8KKwlpZiAobHAtPm1vZGUgPT0gMSkgewkvKiBidXNtYXN0ZXIgKi8KKwkJLyogRXhwZXJpbWVudGFsOiBTZXQgc29tZSBQQ0kgY29uZmlndXJhdGlvbiBiaXRzICovCisJCWhwMTAwX3BhZ2UoSFdfTUFQKTsKKwkJaHAxMDBfYW5kYih+SFAxMDBfUERMX1VTRTMsIE1PREVDVFJMMSk7CS8qIEJNIGVuZ2luZSByZWFkIG1heGltdW0gKi8KKwkJaHAxMDBfYW5kYih+SFAxMDBfVFhfRFVBTFEsIE1PREVDVFJMMSk7CS8qIE5vIFF1ZXVlIGZvciBQcmlvcml0eSBUWCAqLworCisJCS8qIFBDSSBCdXMgZmFpbHVyZXMgc2hvdWxkIHJlc3VsdCBpbiBhIE1pc2MuIEludGVycnVwdCAqLworCQlocDEwMF9vcmIoSFAxMDBfRU5fQlVTX0ZBSUwsIE1PREVDVFJMMik7CisKKwkJaHAxMDBfb3V0dyhIUDEwMF9CTV9SRUFEIHwgSFAxMDBfQk1fV1JJVEUgfCBIUDEwMF9TRVRfSEIsIE9QVElPTl9MU1cpOworCQlocDEwMF9wYWdlKEhXX01BUCk7CisJCS8qIFVzZSBCdXJzdCBNb2RlIGFuZCBzd2l0Y2ggb24gUEFHRV9DSyAqLworCQlocDEwMF9vcmIoSFAxMDBfQk1fQlVSU1RfUkQgfCBIUDEwMF9CTV9CVVJTVF9XUiwgQk0pOworCQlpZiAoKGxwLT5jaGlwID09IEhQMTAwX0NISVBJRF9SQUlOSUVSKSB8fCAobHAtPmNoaXAgPT0gSFAxMDBfQ0hJUElEX1NIQVNUQSkpCisJCQlocDEwMF9vcmIoSFAxMDBfQk1fUEFHRV9DSywgQk0pOworCQlocDEwMF9vcmIoSFAxMDBfQk1fTUFTVEVSLCBCTSk7CisJfSBlbHNlIHsJCS8qIG5vdCBidXNtYXN0ZXIgKi8KKworCQlocDEwMF9wYWdlKEhXX01BUCk7CisJCWhwMTAwX2FuZGIofkhQMTAwX0JNX01BU1RFUiwgQk0pOworCX0KKworCS8qCisJICogRGl2aWRlIGNhcmQgbWVtb3J5IGludG8gcmVnaW9ucyBmb3IgUngsIFR4IGFuZCwgaWYgbm9uLUVUUiBjaGlwLCBQRExzCisJICovCisJaHAxMDBfcGFnZShNTVVfQ0ZHKTsKKwlpZiAobHAtPm1vZGUgPT0gMSkgewkvKiBvbmx5IG5lZWRlZCBmb3IgQnVzbWFzdGVyICovCisJCWludCB4bWl0X3N0b3AsIHJlY3Zfc3RvcDsKKworCQlpZiAoKGxwLT5jaGlwID09IEhQMTAwX0NISVBJRF9SQUlOSUVSKQorCQkgICAgfHwgKGxwLT5jaGlwID09IEhQMTAwX0NISVBJRF9TSEFTVEEpKSB7CisJCQlpbnQgcGRsX3N0b3A7CisKKwkJCS8qCisJCQkgKiBFYWNoIHBkbCBpcyA1MDggYnl0ZXMgbG9uZy4gKDYzIGZyYWdzICogNCBieXRlcyBmb3IgYWRkcmVzcyBhbmQKKwkJCSAqIDQgYnl0ZXMgZm9yIGhlYWRlcikuIFdlIHdpbGwgbGVhdmUgTlVNX1JYUERMUyAqIDUwOCAocm91bmRlZAorCQkJICogdG8gdGhlIG5leHQgaGlnaGVyIDFrIGJvdW5kYXJ5KSBieXRlcyBmb3IgdGhlIHJ4LXBkbCdzCisJCQkgKiBOb3RlOiBGb3Igbm9uLWV0ciBjaGlwcyB0aGUgdHJhbnNtaXQgc3RvcCByZWdpc3RlciBtdXN0IGJlCisJCQkgKiBwcm9ncmFtbWVkIG9uIGEgMWsgYm91bmRhcnksIGkuZS4gYml0cyA5OjAgbXVzdCBiZSB6ZXJvLiAKKwkJCSAqLworCQkJcGRsX3N0b3AgPSBscC0+bWVtb3J5X3NpemU7CisJCQl4bWl0X3N0b3AgPSAocGRsX3N0b3AgLSA1MDggKiAoTUFYX1JYX1BETCkgLSAxNikgJiB+KDB4MDNmZik7CisJCQlyZWN2X3N0b3AgPSAoeG1pdF9zdG9wICogKGxwLT5yeF9yYXRpbykgLyAxMDApICYgfigweDAzZmYpOworCQkJaHAxMDBfb3V0dygocGRsX3N0b3AgPj4gNCkgLSAxLCBQRExfTUVNX1NUT1ApOworI2lmZGVmIEhQMTAwX0RFQlVHX0JNCisJCQlwcmludGsoImhwMTAwOiAlczogUERMX1NUT1AgPSAweCV4XG4iLCBkZXYtPm5hbWUsIHBkbF9zdG9wKTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJLyogRVRSIGNoaXAgKExhc3NlbikgaW4gYnVzbWFzdGVyIG1vZGUgKi8KKwkJCXhtaXRfc3RvcCA9IChscC0+bWVtb3J5X3NpemUpIC0gMTsKKwkJCXJlY3Zfc3RvcCA9ICgobHAtPm1lbW9yeV9zaXplICogbHAtPnJ4X3JhdGlvKSAvIDEwMCkgJiB+KDB4MDNmZik7CisJCX0KKworCQlocDEwMF9vdXR3KHhtaXRfc3RvcCA+PiA0LCBUWF9NRU1fU1RPUCk7CisJCWhwMTAwX291dHcocmVjdl9zdG9wID4+IDQsIFJYX01FTV9TVE9QKTsKKyNpZmRlZiBIUDEwMF9ERUJVR19CTQorCQlwcmludGsoImhwMTAwOiAlczogVFhfU1RPUCAgPSAweCV4XG4iLCBkZXYtPm5hbWUsIHhtaXRfc3RvcCA+PiA0KTsKKwkJcHJpbnRrKCJocDEwMDogJXM6IFJYX1NUT1AgID0gMHgleFxuIiwgZGV2LT5uYW1lLCByZWN2X3N0b3AgPj4gNCk7CisjZW5kaWYKKwl9IGVsc2UgeworCQkvKiBTbGF2ZSBtb2RlcyAobWVtb3J5IG1hcHBlZCBhbmQgcHJvZ3JhbW1lZCBpbykgICovCisJCWhwMTAwX291dHcoKCgobHAtPm1lbW9yeV9zaXplICogbHAtPnJ4X3JhdGlvKSAvIDEwMCkgPj4gNCksIFJYX01FTV9TVE9QKTsKKwkJaHAxMDBfb3V0dygoKGxwLT5tZW1vcnlfc2l6ZSAtIDEpID4+IDQpLCBUWF9NRU1fU1RPUCk7CisjaWZkZWYgSFAxMDBfREVCVUcKKwkJcHJpbnRrKCJocDEwMDogJXM6IFRYX01FTV9TVE9QOiAweCV4XG4iLCBkZXYtPm5hbWUsIGhwMTAwX2ludyhUWF9NRU1fU1RPUCkpOworCQlwcmludGsoImhwMTAwOiAlczogUlhfTUVNX1NUT1A6IDB4JXhcbiIsIGRldi0+bmFtZSwgaHAxMDBfaW53KFJYX01FTV9TVE9QKSk7CisjZW5kaWYKKwl9CisKKwkvKiBXcml0ZSBNQUMgYWRkcmVzcyBpbnRvIHBhZ2UgMSAqLworCWhwMTAwX3BhZ2UoTUFDX0FERFJFU1MpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWhwMTAwX291dGIoZGV2LT5kZXZfYWRkcltpXSwgTUFDX0FERFIgKyBpKTsKKworCS8qIFplcm8gdGhlIG11bHRpY2FzdCBoYXNoIHJlZ2lzdGVycyAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWhwMTAwX291dGIoMHgwLCBIQVNIX0JZVEUwICsgaSk7CisKKwkvKiBTZXQgdXAgTUFDIGRlZmF1bHRzICovCisJaHAxMDBfcGFnZShNQUNfQ1RSTCk7CisKKwkvKiBHbyB0byBMQU4gUGFnZSBhbmQgemVybyBhbGwgZmlsdGVyIGJpdHMgKi8KKwkvKiBaZXJvIGFjY2VwdCBlcnJvciwgYWNjZXB0IG11bHRpY2FzdCwgYWNjZXB0IGJyb2FkY2FzdCBhbmQgYWNjZXB0ICovCisJLyogYWxsIGRpcmVjdGVkIHBhY2tldCBiaXRzICovCisJaHAxMDBfYW5kYih+KEhQMTAwX1JYX0VOIHwKKwkJICAgICBIUDEwMF9UWF9FTiB8CisJCSAgICAgSFAxMDBfQUNDX0VSUk9SRUQgfAorCQkgICAgIEhQMTAwX0FDQ19NQyB8CisJCSAgICAgSFAxMDBfQUNDX0JDIHwgSFAxMDBfQUNDX1BIWSksIE1BQ19DRkdfMSk7CisKKwlocDEwMF9vdXRiKDB4MDAsIE1BQ19DRkdfMik7CisKKwkvKiBaZXJvIHRoZSBmcmFtZSBmb3JtYXQgYml0LiBUaGlzIHdvcmtzIGFyb3VuZCBhIHRyYWluaW5nIGJ1ZyBpbiB0aGUgKi8KKwkvKiBuZXcgaHVicy4gKi8KKwlocDEwMF9vdXRiKDB4MDAsIFZHX0xBTl9DRkdfMik7CS8qICh1c2UgODAyLjMpICovCisKKwlpZiAobHAtPnByaW9yaXR5X3R4KQorCQlocDEwMF9vdXRiKEhQMTAwX1BSSU9SSVRZX1RYIHwgSFAxMDBfU0VUX0xCLCBPUFRJT05fTVNXKTsKKwllbHNlCisJCWhwMTAwX291dGIoSFAxMDBfUFJJT1JJVFlfVFggfCBIUDEwMF9SRVNFVF9MQiwgT1BUSU9OX01TVyk7CisKKwlocDEwMF9vdXRiKEhQMTAwX0FEVl9OWFRfUEtUIHwKKwkJICAgSFAxMDBfVFhfQ01EIHwgSFAxMDBfUkVTRVRfTEIsIE9QVElPTl9NU1cpOworCisJLyogSWYgYnVzbWFzdGVyLCBpbml0aWFsaXplIHRoZSBQRExzICovCisJaWYgKGxwLT5tb2RlID09IDEpCisJCWhwMTAwX2luaXRfcGRscyhkZXYpOworCisJLyogR28gdG8gcGVyZm9ybWFuY2UgcGFnZSBhbmQgaW5pdGFsaXplIGlzciBhbmQgaW1yIHJlZ2lzdGVycyAqLworCWhwMTAwX3BhZ2UoUEVSRk9STUFOQ0UpOworCWhwMTAwX291dHcoMHhmZWZlLCBJUlFfTUFTSyk7CS8qIG1hc2sgb2ZmIGFsbCBpbnRzICovCisJaHAxMDBfb3V0dygweGZmZmYsIElSUV9TVEFUVVMpOwkvKiBhY2sgSVJRICovCit9CisKKy8qCisgKiAgb3Blbi9jbG9zZSBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IGhwMTAwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworI2lmZGVmIEhQMTAwX0RFQlVHX0IKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisjZW5kaWYKKworI2lmZGVmIEhQMTAwX0RFQlVHX0IKKwlocDEwMF9vdXR3KDB4NDIwNCwgVFJBQ0UpOworCXByaW50aygiaHAxMDA6ICVzOiBvcGVuXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwkvKiBOZXc6IGlmIGJ1cyBpcyBQQ0kgb3IgRUlTQSwgaW50ZXJydXB0cyBtaWdodCBiZSBzaGFyZWQgaW50ZXJydXB0cyAqLworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgaHAxMDBfaW50ZXJydXB0LAorCQkJbHAtPmJ1cyA9PSBIUDEwMF9CVVNfUENJIHx8IGxwLT5idXMgPT0KKwkJCUhQMTAwX0JVU19FSVNBID8gU0FfU0hJUlEgOiBTQV9JTlRFUlJVUFQsCisJCQkiaHAxMDAiLCBkZXYpKSB7CisJCXByaW50aygiaHAxMDA6ICVzOiB1bmFibGUgdG8gZ2V0IElSUSAlZFxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlscC0+bGFuX3R5cGUgPSBocDEwMF9zZW5zZV9sYW4oZGV2KTsKKwlscC0+bWFjMV9tb2RlID0gSFAxMDBfTUFDMU1PREUzOworCWxwLT5tYWMyX21vZGUgPSBIUDEwMF9NQUMyTU9ERTM7CisJbWVtc2V0KCZscC0+aGFzaF9ieXRlcywgMHgwMCwgOCk7CisKKwlocDEwMF9zdG9wX2ludGVyZmFjZShkZXYpOworCisJaHAxMDBfaHdpbml0KGRldik7CisKKwlocDEwMF9zdGFydF9pbnRlcmZhY2UoZGV2KTsJLyogc2V0cyBtYWMgbW9kZXMsIGVuYWJsZXMgaW50ZXJydXB0cyAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBjbG9zZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgaW50ZXJmYWNlIGlzIHRvIGJlIGJyb3VnaHQgZG93biAqLworc3RhdGljIGludCBocDEwMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWhwMTAwX291dHcoMHg0MjA1LCBUUkFDRSk7CisJcHJpbnRrKCJocDEwMDogJXM6IGNsb3NlXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlocDEwMF9wYWdlKFBFUkZPUk1BTkNFKTsKKwlocDEwMF9vdXR3KDB4ZmVmZSwgSVJRX01BU0spOwkvKiBtYXNrIG9mZiBhbGwgSVJRcyAqLworCisJaHAxMDBfc3RvcF9pbnRlcmZhY2UoZGV2KTsKKworCWlmIChscC0+bGFuX3R5cGUgPT0gSFAxMDBfTEFOXzEwMCkKKwkJbHAtPmh1Yl9zdGF0dXMgPSBocDEwMF9sb2dpbl90b192Z19odWIoZGV2LCAwKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisjaWZkZWYgSFAxMDBfREVCVUcKKwlwcmludGsoImhwMTAwOiAlczogY2xvc2UgTFNXID0gMHgleFxuIiwgZGV2LT5uYW1lLAorCSAgICAgICBocDEwMF9pbncoT1BUSU9OX0xTVykpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKwwKKworLyoKKyAqIENvbmZpZ3VyZSB0aGUgUERMIFJ4IHJpbmdzIGFuZCBMQU4gCisgKi8KK3N0YXRpYyB2b2lkIGhwMTAwX2luaXRfcGRscyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBocDEwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaHAxMDBfcmluZ190ICpyaW5ncHRyOworCXVfaW50ICpwYWdlcHRyOwkJLyogV2FybmluZyA6IGluY3JlbWVudCBieSA0IC0gSmVhbiBJSSAqLworCWludCBpOworCisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyNlbmRpZgorCisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWhwMTAwX291dHcoMHg0MjA2LCBUUkFDRSk7CisJcHJpbnRrKCJocDEwMDogJXM6IGluaXQgcGRsc1xuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJaWYgKDAgPT0gbHAtPnBhZ2VfdmFkZHJfYWxnbikKKwkJcHJpbnRrKCJocDEwMDogJXM6IFdhcm5pbmc6IGxwLT5wYWdlX3ZhZGRyX2FsZ24gbm90IGluaXRpYWxpc2VkIVxuIiwgZGV2LT5uYW1lKTsKKwllbHNlIHsKKwkJLyogcGFnZXB0ciBzaGFsbCBwb2ludCBpbnRvIHRoZSBETUEgYWNjZXNzaWJsZSBtZW1vcnkgcmVnaW9uICAqLworCQkvKiB3ZSB1c2UgdGhpcyBwb2ludGVyIHRvIHN0YXR1cyB0aGUgdXBwZXIgbGltaXQgb2YgYWxsb2NhdGVkICovCisJCS8qIG1lbW9yeSBpbiB0aGUgYWxsb2NhdGVkIHBhZ2UuICovCisJCS8qIG5vdGU6IGFsaWduIHRoZSBwb2ludGVycyB0byB0aGUgcGNpIGNhY2hlIGxpbmUgc2l6ZSAqLworCQltZW1zZXQobHAtPnBhZ2VfdmFkZHJfYWxnbiwgMCwgTUFYX1JJTkdTSVpFKTsJLyogWmVybyAgUngvVHggcmluZyBwYWdlICovCisJCXBhZ2VwdHIgPSBscC0+cGFnZV92YWRkcl9hbGduOworCisJCWxwLT5yeHJjb21taXQgPSAwOworCQlyaW5ncHRyID0gbHAtPnJ4cmhlYWQgPSBscC0+cnhydGFpbCA9ICYobHAtPnJ4cmluZ1swXSk7CisKKwkJLyogSW5pdGlhbGlzZSBSeCBSaW5nICovCisJCWZvciAoaSA9IE1BWF9SWF9QREwgLSAxOyBpID49IDA7IGktLSkgeworCQkJbHAtPnJ4cmluZ1tpXS5uZXh0ID0gcmluZ3B0cjsKKwkJCXJpbmdwdHIgPSAmKGxwLT5yeHJpbmdbaV0pOworCQkJcGFnZXB0ciArPSBocDEwMF9pbml0X3J4cGRsKGRldiwgcmluZ3B0ciwgcGFnZXB0cik7CisJCX0KKworCQkvKiBJbml0aWFsaXNlIFR4IFJpbmcgKi8KKwkJbHAtPnR4cmNvbW1pdCA9IDA7CisJCXJpbmdwdHIgPSBscC0+dHhyaGVhZCA9IGxwLT50eHJ0YWlsID0gJihscC0+dHhyaW5nWzBdKTsKKwkJZm9yIChpID0gTUFYX1RYX1BETCAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQlscC0+dHhyaW5nW2ldLm5leHQgPSByaW5ncHRyOworCQkJcmluZ3B0ciA9ICYobHAtPnR4cmluZ1tpXSk7CisJCQlwYWdlcHRyICs9IGhwMTAwX2luaXRfdHhwZGwoZGV2LCByaW5ncHRyLCBwYWdlcHRyKTsKKwkJfQorCX0KK30KKwwKKworLyogVGhlc2UgZnVuY3Rpb25zICJmb3JtYXQiIHRoZSBlbnRyaWVzIGluIHRoZSBwZGwgc3RydWN0dXJlICAgKi8KKy8qIFRoZXkgcmV0dXJuIGhvdyBtdWNoIG1lbW9yeSB0aGUgZnJhZ21lbnRzIG5lZWQuICAgICAgICAgICAgKi8KK3N0YXRpYyBpbnQgaHAxMDBfaW5pdF9yeHBkbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHJlZ2lzdGVyIGhwMTAwX3JpbmdfdCAqIHJpbmdwdHIsCisJCQkgICAgcmVnaXN0ZXIgdTMyICogcGRscHRyKQoreworCS8qIHBkbHB0ciBpcyBzdGFydGluZyBhZGRyZXNzIGZvciB0aGlzIHBkbCAqLworCisJaWYgKDAgIT0gKCgodW5zaWduZWQgbG9uZykgcGRscHRyKSAmIDB4ZikpCisJCXByaW50aygiaHAxMDA6ICVzOiBJbml0IHJ4cGRsOiBVbmFsaWduZWQgcGRscHRyIDB4JWx4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgKHVuc2lnbmVkIGxvbmcpIHBkbHB0cik7CisKKwlyaW5ncHRyLT5wZGwgPSBwZGxwdHIgKyAxOworCXJpbmdwdHItPnBkbF9wYWRkciA9IHZpcnRfdG9fd2hhdGV2ZXIoZGV2LCBwZGxwdHIgKyAxKTsKKwlyaW5ncHRyLT5za2IgPSAodm9pZCAqKSBOVUxMOworCisJLyogCisJICogV3JpdGUgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIGZpcnN0IFBETCBGcmFnbWVudCAod2hpY2ggaXMgdXNlZCBmb3IKKwkgKiBzdG9yaW5nIHRoZSBSWC1IZWFkZXIKKwkgKiBXZSB1c2UgdGhlIDQgYnl0ZXMgX2JlZm9yZV8gdGhlIFBESCBpbiB0aGUgcGRsIG1lbW9yeSBhcmVhIHRvIAorCSAqIHN0b3JlIHRoaXMgaW5mb3JtYXRpb24uIChQREggaXMgYXQgb2Zmc2V0IDB4MDQpCisJICovCisJLyogTm90ZSB0aGF0IHBkbHB0cisxIGFuZCBub3QgcGRscHRyIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBQREggKi8KKworCSoocGRscHRyICsgMikgPSAodV9pbnQpIHZpcnRfdG9fd2hhdGV2ZXIoZGV2LCBwZGxwdHIpOwkvKiBBZGRyZXNzIEZyYWcgMSAqLworCSoocGRscHRyICsgMykgPSA0OwkvKiBMZW5ndGggIEZyYWcgMSAqLworCisJcmV0dXJuICgoKChNQVhfUlhfRlJBRyAqIDIgKyAyKSArIDMpIC8gNCkgKiA0KTsKK30KKworCitzdGF0aWMgaW50IGhwMTAwX2luaXRfdHhwZGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICByZWdpc3RlciBocDEwMF9yaW5nX3QgKiByaW5ncHRyLAorCQkJICAgIHJlZ2lzdGVyIHUzMiAqIHBkbHB0cikKK3sKKwlpZiAoMCAhPSAoKCh1bnNpZ25lZCBsb25nKSBwZGxwdHIpICYgMHhmKSkKKwkJcHJpbnRrKCJocDEwMDogJXM6IEluaXQgdHhwZGw6IFVuYWxpZ25lZCBwZGxwdHIgMHglbHguXG4iLCBkZXYtPm5hbWUsICh1bnNpZ25lZCBsb25nKSBwZGxwdHIpOworCisJcmluZ3B0ci0+cGRsID0gcGRscHRyOwkvKiArMTsgKi8KKwlyaW5ncHRyLT5wZGxfcGFkZHIgPSB2aXJ0X3RvX3doYXRldmVyKGRldiwgcGRscHRyKTsJLyogKzEgKi8KKwlyaW5ncHRyLT5za2IgPSAodm9pZCAqKSBOVUxMOworCisJcmV0dXJuICgoKChNQVhfVFhfRlJBRyAqIDIgKyAyKSArIDMpIC8gNCkgKiA0KTsKK30KKworLyoKKyAqIGhwMTAwX2J1aWxkX3J4X3BkbCBhbGxvY2F0ZXMgYW4gc2tiX2J1ZmYgb2YgbWF4aW11bSBzaXplIHBsdXMgdHdvIGJ5dGVzIAorICogZm9yIHBvc3NpYmxlIG9kZCB3b3JkIGFsaWdubWVudCByb3VuZGluZyB1cCB0byBuZXh0IGR3b3JkIGFuZCBzZXQgUERMCisgKiBhZGRyZXNzIGZvciBmcmFnbWVudCMyIAorICogUmV0dXJuczogMCBpZiB1bmFibGUgdG8gYWxsb2NhdGUgc2tiX2J1ZmYKKyAqICAgICAgICAgIDEgaWYgc3VjY2Vzc2Z1bAorICovCitzdGF0aWMgaW50IGhwMTAwX2J1aWxkX3J4X3BkbChocDEwMF9yaW5nX3QgKiByaW5ncHRyLAorCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZmRlZiBIUDEwMF9ERUJVR19CCisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworI2VuZGlmCisjaWZkZWYgSFAxMDBfREVCVUdfQk0KKwl1X2ludCAqcDsKKyNlbmRpZgorCisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWhwMTAwX291dHcoMHg0MjA3LCBUUkFDRSk7CisJcHJpbnRrKCJocDEwMDogJXM6IGJ1aWxkIHJ4IHBkbFxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogQWxsb2NhdGUgc2tiIGJ1ZmZlciBvZiBtYXhpbXVtIHNpemUgKi8KKwkvKiBOb3RlOiBUaGlzIGRlcGVuZHMgb24gdGhlIGFsbG9jX3NrYiBmdW5jdGlvbnMgYWxsb2NhdGluZyBtb3JlIAorCSAqIHNwYWNlIHRoYW4gcmVxdWVzdGVkLCBpLmUuIGFsaWduaW5nIHRvIDE2Ynl0ZXMgKi8KKworCXJpbmdwdHItPnNrYiA9IGRldl9hbGxvY19za2IoKChNQVhfRVRIRVJfU0laRSArIDIgKyAzKSAvIDQpICogNCk7CisKKwlpZiAoTlVMTCAhPSByaW5ncHRyLT5za2IpIHsKKwkJLyogCisJCSAqIFJlc2VydmUgMiBieXRlcyBhdCB0aGUgaGVhZCBvZiB0aGUgYnVmZmVyIHRvIGxhbmQgdGhlIElQIGhlYWRlcgorCQkgKiBvbiBhIGxvbmcgd29yZCBib3VuZGFyeSAoQWNjb3JkaW5nIHRvIHRoZSBOZXR3b3JrIERyaXZlciBzZWN0aW9uCisJCSAqIGluIHRoZSBMaW51eCBLSEcsIHRoaXMgc2hvdWxkIGhlbHAgdG8gaW5jcmVhc2UgcGVyZm9ybWFuY2UuKQorCQkgKi8KKwkJc2tiX3Jlc2VydmUocmluZ3B0ci0+c2tiLCAyKTsKKworCQlyaW5ncHRyLT5za2ItPmRldiA9IGRldjsKKwkJcmluZ3B0ci0+c2tiLT5kYXRhID0gKHVfY2hhciAqKSBza2JfcHV0KHJpbmdwdHItPnNrYiwgTUFYX0VUSEVSX1NJWkUpOworCisJCS8qIHJpbmdwdHItPnBkbCBwb2ludHMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgUERMLCBpLmUuIHRoZSBQREggKi8KKwkJLyogTm90ZTogMXN0IEZyYWdtZW50IGlzIHVzZWQgZm9yIHRoZSA0IGJ5dGUgcGFja2V0IHN0YXR1cworCQkgKiAocmVjZWl2ZSBoZWFkZXIpLiBJdHMgUERMIGVudHJpZXMgYXJlIHNldCB1cCBieSBpbml0X3J4cGRsLiBTbyAKKwkJICogaGVyZSB3ZSBvbmx5IGhhdmUgdG8gc2V0IHVwIHRoZSBQREwgZnJhZ21lbnQgZW50cmllcyBmb3IgdGhlIGRhdGEKKwkJICogcGFydC4gVGhvc2UgNCBieXRlcyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgRE1BIG1lbW9yeSByZWdpb24gCisJCSAqIGRpcmVjdGx5IGJlZm9yZSB0aGUgUERMLiAKKwkJICovCisjaWZkZWYgSFAxMDBfREVCVUdfQk0KKwkJcHJpbnRrKCJocDEwMDogJXM6IGJ1aWxkX3J4X3BkbDogUERIQDB4JXgsIHNrYi0+ZGF0YSAobGVuICVkKSBhdCAweCV4XG4iLAorCQkJCSAgICAgZGV2LT5uYW1lLCAodV9pbnQpIHJpbmdwdHItPnBkbCwKKwkJCQkgICAgICgoTUFYX0VUSEVSX1NJWkUgKyAyICsgMykgLyA0KSAqIDQsCisJCQkJICAgICAodW5zaWduZWQgaW50KSByaW5ncHRyLT5za2ItPmRhdGEpOworI2VuZGlmCisKKwkJLyogQ29udmVyc2lvbiB0byBuZXcgUENJIEFQSSA6IG1hcCBza2J1ZiBkYXRhIHRvIFBDSSBidXMuCisJCSAqIERvYyBzYXlzIGl0J3MgT0sgZm9yIEVJU0EgYXMgd2VsbCAtIEplYW4gSUkgKi8KKwkJcmluZ3B0ci0+cGRsWzBdID0gMHgwMDAyMDAwMDsJLyogV3JpdGUgUERIICovCisJCXJpbmdwdHItPnBkbFszXSA9IHBkbF9tYXBfZGF0YShuZXRkZXZfcHJpdihkZXYpLCAKKwkJCQkJICAgICAgIHJpbmdwdHItPnNrYi0+ZGF0YSk7CisJCXJpbmdwdHItPnBkbFs0XSA9IE1BWF9FVEhFUl9TSVpFOwkvKiBMZW5ndGggb2YgRGF0YSAqLworCisjaWZkZWYgSFAxMDBfREVCVUdfQk0KKwkJZm9yIChwID0gKHJpbmdwdHItPnBkbCk7IHAgPCAocmluZ3B0ci0+cGRsICsgNSk7IHArKykKKwkJCXByaW50aygiaHAxMDA6ICVzOiBBZHIgMHglLjh4ID0gMHglLjh4XG4iLCBkZXYtPm5hbWUsICh1X2ludCkgcCwgKHVfaW50KSAqIHApOworI2VuZGlmCisJCXJldHVybiAoMSk7CisJfQorCS8qIGVsc2U6ICovCisJLyogYWxsb2Nfc2tiIGZhaWxlZCAobm8gbWVtb3J5KSAtPiBzdGlsbCBjYW4gcmVjZWl2ZSB0aGUgaGVhZGVyCisJICogZnJhZ21lbnQgaW50byBQREwgbWVtb3J5LiBtYWtlIFBETCBzYWZlIGJ5IGNsZWFyaW5nIG1zZ3B0ciBhbmQKKwkgKiBtYWtpbmcgdGhlIFBETCBvbmx5IDEgZnJhZ21lbnQgKGkuZS4gdGhlIDQgYnl0ZSBwYWNrZXQgc3RhdHVzKQorCSAqLworI2lmZGVmIEhQMTAwX0RFQlVHX0JNCisJcHJpbnRrKCJocDEwMDogJXM6IGJ1aWxkX3J4X3BkbDogUERIQDB4JXgsIE5vIHNwYWNlIGZvciBza2IuXG4iLCBkZXYtPm5hbWUsICh1X2ludCkgcmluZ3B0ci0+cGRsKTsKKyNlbmRpZgorCisJcmluZ3B0ci0+cGRsWzBdID0gMHgwMDAxMDAwMDsJLyogUERIOiBDb3VudD0xIEZyYWdtZW50ICovCisKKwlyZXR1cm4gKDApOworfQorCisvKgorICogIGhwMTAwX3J4ZmlsbCAtIGF0dGVtcHQgdG8gZmlsbCB0aGUgUnggUmluZyB3aWxsIGVtcHR5IHNrYidzCisgKgorICogTWFrZXMgYXNzdW1wdGlvbiB0aGF0IHNrYidzIGFyZSBhbHdheXMgY29udGlndW91cyBtZW1vcnkgYXJlYXMgYW5kCisgKiB0aGVyZWZvcmUgUERMcyBjb250YWluIG9ubHkgMiBwaHlzaWNhbCBmcmFnbWVudHMuCisgKiAtICBXaGlsZSB0aGUgbnVtYmVyIG9mIFJ4IFBETHMgd2l0aCBidWZmZXJzIGlzIGxlc3MgdGhhbiBtYXhpbXVtCisgKiAgICAgIGEuICBHZXQgYSBtYXhpbXVtIHBhY2tldCBzaXplIHNrYgorICogICAgICBiLiAgUHV0IHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBidWZmZXIgaW50byB0aGUgUERMLgorICogICAgICBjLiAgT3V0cHV0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgUERMIHRvIGFkYXB0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIGhwMTAwX3J4ZmlsbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCXN0cnVjdCBocDEwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaHAxMDBfcmluZ190ICpyaW5ncHRyOworCisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWhwMTAwX291dHcoMHg0MjA4LCBUUkFDRSk7CisJcHJpbnRrKCJocDEwMDogJXM6IHJ4ZmlsbFxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJaHAxMDBfcGFnZShQRVJGT1JNQU5DRSk7CisKKwl3aGlsZSAobHAtPnJ4cmNvbW1pdCA8IE1BWF9SWF9QREwpIHsKKwkJLyoKKwkJICAgKiogQXR0ZW1wdCB0byBnZXQgYSBidWZmZXIgYW5kIGJ1aWxkIGEgUnggUERMLgorCQkgKi8KKwkJcmluZ3B0ciA9IGxwLT5yeHJ0YWlsOworCQlpZiAoMCA9PSBocDEwMF9idWlsZF9yeF9wZGwocmluZ3B0ciwgZGV2KSkgeworCQkJcmV0dXJuOwkvKiBOb25lIGF2YWlsYWJsZSwgcmV0dXJuICovCisJCX0KKworCQkvKiBIYW5kIHRoaXMgUERMIG92ZXIgdG8gdGhlIGNhcmQgKi8KKwkJLyogTm90ZTogVGhpcyBuZWVkcyBwZXJmb3JtYW5jZSBwYWdlIHNlbGVjdGVkISAqLworI2lmZGVmIEhQMTAwX0RFQlVHX0JNCisJCXByaW50aygiaHAxMDA6ICVzOiByeGZpbGw6IEhhbmQgdG8gY2FyZDogcGRsICMlZCBAMHgleCBwaHlzOjB4JXgsIGJ1ZmZlcjogMHgleFxuIiwKKwkJCQkgICAgIGRldi0+bmFtZSwgbHAtPnJ4cmNvbW1pdCwgKHVfaW50KSByaW5ncHRyLT5wZGwsCisJCQkJICAgICAodV9pbnQpIHJpbmdwdHItPnBkbF9wYWRkciwgKHVfaW50KSByaW5ncHRyLT5wZGxbM10pOworI2VuZGlmCisKKwkJaHAxMDBfb3V0bCgodTMyKSByaW5ncHRyLT5wZGxfcGFkZHIsIFJYX1BEQSk7CisKKwkJbHAtPnJ4cmNvbW1pdCArPSAxOworCQlscC0+cnhydGFpbCA9IHJpbmdwdHItPm5leHQ7CisJfQorfQorCisvKgorICogQk1fc2h1dGRvd24gLSBzaHV0ZG93biBidXMgbWFzdGVyaW5nIGFuZCBsZWF2ZSBjaGlwIGluIHJlc2V0IHN0YXRlCisgKi8KKworc3RhdGljIHZvaWQgaHAxMDBfQk1fc2h1dGRvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGhwMTAwX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHRpbWU7CisKKyNpZmRlZiBIUDEwMF9ERUJVR19CCisJaHAxMDBfb3V0dygweDQyMDksIFRSQUNFKTsKKwlwcmludGsoImhwMTAwOiAlczogYm0gc2h1dGRvd25cbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCWhwMTAwX3BhZ2UoUEVSRk9STUFOQ0UpOworCWhwMTAwX291dHcoMHhmZWZlLCBJUlFfTUFTSyk7CS8qIG1hc2sgb2ZmIGFsbCBpbnRzICovCisJaHAxMDBfb3V0dygweGZmZmYsIElSUV9TVEFUVVMpOwkvKiBBY2sgYWxsIGludHMgKi8KKworCS8qIEVuc3VyZSBJbnRlcnJ1cHRzIGFyZSBvZmYgKi8KKwlocDEwMF9vdXR3KEhQMTAwX0lOVF9FTiB8IEhQMTAwX1JFU0VUX0xCLCBPUFRJT05fTFNXKTsKKworCS8qIERpc2FibGUgYWxsIE1BQyBhY3Rpdml0eSAqLworCWhwMTAwX3BhZ2UoTUFDX0NUUkwpOworCWhwMTAwX2FuZGIofihIUDEwMF9SWF9FTiB8IEhQMTAwX1RYX0VOKSwgTUFDX0NGR18xKTsJLyogc3RvcCByeC90eCAqLworCisJLyogSWYgY2FzY2FkZSBNTVUgaXMgbm90IGFscmVhZHkgaW4gcmVzZXQgKi8KKwlpZiAoMCAhPSAoaHAxMDBfaW53KE9QVElPTl9MU1cpICYgSFAxMDBfSFdfUlNUKSkgeworCQkvKiBXYWl0IDEuM21zICgxME1iIG1heCBwYWNrZXQgdGltZSkgdG8gZW5zdXJlIE1BQyBpcyBpZGxlIHNvCisJCSAqIE1NVSBwb2ludGVycyB3aWxsIG5vdCBiZSByZXNldCBvdXQgZnJvbSB1bmRlcm5lYXRoCisJCSAqLworCQlocDEwMF9wYWdlKE1BQ19DVFJMKTsKKwkJZm9yICh0aW1lID0gMDsgdGltZSA8IDUwMDA7IHRpbWUrKykgeworCQkJaWYgKChocDEwMF9pbmIoTUFDX0NGR18xKSAmIChIUDEwMF9UWF9JRExFIHwgSFAxMDBfUlhfSURMRSkpID09IChIUDEwMF9UWF9JRExFIHwgSFAxMDBfUlhfSURMRSkpCisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBTaHV0ZG93biBhbGdvcml0aG0gZGVwZW5kcyBvbiB0aGUgZ2VuZXJhdGlvbiBvZiBDYXNjYWRlICovCisJCWlmIChscC0+Y2hpcCA9PSBIUDEwMF9DSElQSURfTEFTU0VOKSB7CS8qIEVUUiBzaHV0ZG93bi9yZXNldCAqLworCQkJLyogRGlzYWJsZSBCdXNtYXN0ZXIgbW9kZSBhbmQgd2FpdCBmb3IgYml0IHRvIGdvIHRvIHplcm8uICovCisJCQlocDEwMF9wYWdlKEhXX01BUCk7CisJCQlocDEwMF9hbmRiKH5IUDEwMF9CTV9NQVNURVIsIEJNKTsKKwkJCS8qIDEwMCBtcyB0aW1lb3V0ICovCisJCQlmb3IgKHRpbWUgPSAwOyB0aW1lIDwgMzIwMDA7IHRpbWUrKykgeworCQkJCWlmICgwID09IChocDEwMF9pbmIoQk0pICYgSFAxMDBfQk1fTUFTVEVSKSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CS8qIFNoYXN0YSBvciBSYWluaWVyIFNodXRkb3duL1Jlc2V0ICovCisJCQkvKiBUbyBlbnN1cmUgYWxsIGJ1cyBtYXN0ZXIgaW5sb2FkaW5nIGFjdGl2aXR5IGhhcyBjZWFzZWQsCisJCQkgKiB3YWl0IGZvciBubyBSeCBQREFzIG9yIG5vIFJ4IHBhY2tldHMgb24gY2FyZC4gCisJCQkgKi8KKwkJCWhwMTAwX3BhZ2UoUEVSRk9STUFOQ0UpOworCQkJLyogMTAwIG1zIHRpbWVvdXQgKi8KKwkJCWZvciAodGltZSA9IDA7IHRpbWUgPCAxMDAwMDsgdGltZSsrKSB7CisJCQkJLyogUlhfUERMOiBQRExzIG5vdCBleGVjdXRlZC4gKi8KKwkJCQkvKiBSWF9QS1RfQ05UOiBSWCdkIHBhY2tldHMgb24gY2FyZC4gKi8KKwkJCQlpZiAoKGhwMTAwX2luYihSWF9QREwpID09IDApICYmIChocDEwMF9pbmIoUlhfUEtUX0NOVCkgPT0gMCkpCisJCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAodGltZSA+PSAxMDAwMCkKKwkJCQlwcmludGsoImhwMTAwOiAlczogQk0gc2h1dGRvd24gZXJyb3IuXG4iLCBkZXYtPm5hbWUpOworCisJCQkvKiBUbyBlbnN1cmUgYWxsIGJ1cyBtYXN0ZXIgb3V0bG9hZGluZyBhY3Rpdml0eSBoYXMgY2Vhc2VkLAorCQkJICogd2FpdCB1bnRpbCB0aGUgVHggUERBIGNvdW50IGdvZXMgdG8gemVybyBvciBubyBtb3JlIFR4IHNwYWNlCisJCQkgKiBhdmFpbGFibGUgaW4gdGhlIFR4IHJlZ2lvbiBvZiB0aGUgY2FyZC4gCisJCQkgKi8KKwkJCS8qIDEwMCBtcyB0aW1lb3V0ICovCisJCQlmb3IgKHRpbWUgPSAwOyB0aW1lIDwgMTAwMDA7IHRpbWUrKykgeworCQkJCWlmICgoMCA9PSBocDEwMF9pbmIoVFhfUEtUX0NOVCkpICYmCisJCQkJICAgICgwICE9IChocDEwMF9pbmIoVFhfTUVNX0ZSRUUpICYgSFAxMDBfQVVUT19DT01QQVJFKSkpCisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBEaXNhYmxlIEJ1c21hc3RlciBtb2RlICovCisJCQlocDEwMF9wYWdlKEhXX01BUCk7CisJCQlocDEwMF9hbmRiKH5IUDEwMF9CTV9NQVNURVIsIEJNKTsKKwkJfQkvKiBlbmQgb2Ygc2h1dGRvd24gcHJvY2VkdXJlIGZvciBub24tZXRyIHBhcnRzICovCisKKwkJaHAxMDBfY2FzY2FkZV9yZXNldChkZXYsIDEpOworCX0KKwlocDEwMF9wYWdlKFBFUkZPUk1BTkNFKTsKKwkvKiBocDEwMF9vdXR3KCBIUDEwMF9CTV9SRUFEIHwgSFAxMDBfQk1fV1JJVEUgfCBIUDEwMF9SRVNFVF9IQiwgT1BUSU9OX0xTVyApOyAqLworCS8qIEJ1c21hc3RlciBtb2RlIHNob3VsZCBiZSBzaHV0IGRvd24gbm93LiAqLworfQorCitzdGF0aWMgaW50IGhwMTAwX2NoZWNrX2xhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBocDEwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAobHAtPmxhbl90eXBlIDwgMCkgewkvKiBubyBMQU4gdHlwZSBkZXRlY3RlZCB5ZXQ/ICovCisJCWhwMTAwX3N0b3BfaW50ZXJmYWNlKGRldik7CisJCWlmICgobHAtPmxhbl90eXBlID0gaHAxMDBfc2Vuc2VfbGFuKGRldikpIDwgMCkgeworCQkJcHJpbnRrKCJocDEwMDogJXM6IG5vIGNvbm5lY3Rpb24gZm91bmQgLSBjaGVjayB3aXJlXG4iLCBkZXYtPm5hbWUpOworCQkJaHAxMDBfc3RhcnRfaW50ZXJmYWNlKGRldik7CS8qIDEwTWIvcyBSWCBwYWNrZXRzIG1heWJlIGhhbmRsZWQgKi8KKwkJCXJldHVybiAtRUlPOworCQl9CisJCWlmIChscC0+bGFuX3R5cGUgPT0gSFAxMDBfTEFOXzEwMCkKKwkJCWxwLT5odWJfc3RhdHVzID0gaHAxMDBfbG9naW5fdG9fdmdfaHViKGRldiwgMCk7CS8qIHJlbG9naW4gKi8KKwkJaHAxMDBfc3RhcnRfaW50ZXJmYWNlKGRldik7CisJfQorCXJldHVybiAwOworfQorCisvKiAKKyAqICB0cmFuc21pdCBmdW5jdGlvbnMKKyAqLworCisvKiB0eCBmdW5jdGlvbiBmb3IgYnVzbWFzdGVyIG1vZGUgKi8KK3N0YXRpYyBpbnQgaHAxMDBfc3RhcnRfeG1pdF9ibShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGksIG9rX2ZsYWc7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBocDEwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaHAxMDBfcmluZ190ICpyaW5ncHRyOworCisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWhwMTAwX291dHcoMHg0MjEwLCBUUkFDRSk7CisJcHJpbnRrKCJocDEwMDogJXM6IHN0YXJ0X3htaXRfYm1cbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCWlmIChza2IgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc2tiLT5sZW4gPD0gMCkKKwkJcmV0dXJuIDA7CisJCQorCWlmIChza2ItPmxlbiA8IEVUSF9aTEVOICYmIGxwLT5jaGlwID09IEhQMTAwX0NISVBJRF9TSEFTVEEpIHsKKwkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBHZXQgVHggcmluZyB0YWlsIHBvaW50ZXIgKi8KKwlpZiAobHAtPnR4cnRhaWwtPm5leHQgPT0gbHAtPnR4cmhlYWQpIHsKKwkJLyogTm8gbWVtb3J5LiAqLworI2lmZGVmIEhQMTAwX0RFQlVHCisJCXByaW50aygiaHAxMDA6ICVzOiBzdGFydF94bWl0X2JtOiBObyBUWCBQREwgYXZhaWxhYmxlLlxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkvKiBub3Qgd2FpdGVkIGxvbmcgZW5vdWdoIHNpbmNlIGxhc3QgdHg/ICovCisJCWlmIChqaWZmaWVzIC0gZGV2LT50cmFuc19zdGFydCA8IEhaKQorCQkJcmV0dXJuIC1FQUdBSU47CisKKwkJaWYgKGhwMTAwX2NoZWNrX2xhbihkZXYpKQorCQkJcmV0dXJuIC1FSU87CisKKwkJaWYgKGxwLT5sYW5fdHlwZSA9PSBIUDEwMF9MQU5fMTAwICYmIGxwLT5odWJfc3RhdHVzIDwgMCkgeworCQkJLyogd2UgaGF2ZSBhIDEwME1iL3MgYWRhcHRlciBidXQgaXQgaXNuJ3QgY29ubmVjdGVkIHRvIGh1YiAqLworCQkJcHJpbnRrKCJocDEwMDogJXM6IGxvZ2luIHRvIDEwME1iL3MgaHViIHJldHJ5XG4iLCBkZXYtPm5hbWUpOworCQkJaHAxMDBfc3RvcF9pbnRlcmZhY2UoZGV2KTsKKwkJCWxwLT5odWJfc3RhdHVzID0gaHAxMDBfbG9naW5fdG9fdmdfaHViKGRldiwgMCk7CisJCQlocDEwMF9zdGFydF9pbnRlcmZhY2UoZGV2KTsKKwkJfSBlbHNlIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCQkJaHAxMDBfaW50c19vZmYoKTsJLyogVXNlZnVsID8gSmVhbiBJSSAqLworCQkJaSA9IGhwMTAwX3NlbnNlX2xhbihkZXYpOworCQkJaHAxMDBfaW50c19vbigpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChpID09IEhQMTAwX0xBTl9FUlIpCisJCQkJcHJpbnRrKCJocDEwMDogJXM6IGxpbmsgZG93biBkZXRlY3RlZFxuIiwgZGV2LT5uYW1lKTsKKwkJCWVsc2UgaWYgKGxwLT5sYW5fdHlwZSAhPSBpKSB7CS8qIGNhYmxlIGNoYW5nZSEgKi8KKwkJCQkvKiBpdCdzIHZlcnkgaGFyZCAtIGFsbCBuZXR3b3JrIHNldHRpbmdzIG11c3QgYmUgY2hhbmdlZCEhISAqLworCQkJCXByaW50aygiaHAxMDA6ICVzOiBjYWJsZSBjaGFuZ2UgMTBNYi9zIDwtPiAxMDBNYi9zIGRldGVjdGVkXG4iLCBkZXYtPm5hbWUpOworCQkJCWxwLT5sYW5fdHlwZSA9IGk7CisJCQkJaHAxMDBfc3RvcF9pbnRlcmZhY2UoZGV2KTsKKwkJCQlpZiAobHAtPmxhbl90eXBlID09IEhQMTAwX0xBTl8xMDApCisJCQkJCWxwLT5odWJfc3RhdHVzID0gaHAxMDBfbG9naW5fdG9fdmdfaHViKGRldiwgMCk7CisJCQkJaHAxMDBfc3RhcnRfaW50ZXJmYWNlKGRldik7CisJCQl9IGVsc2UgeworCQkJCXByaW50aygiaHAxMDA6ICVzOiBpbnRlcmZhY2UgcmVzZXRcbiIsIGRldi0+bmFtZSk7CisJCQkJaHAxMDBfc3RvcF9pbnRlcmZhY2UoZGV2KTsKKwkJCQlpZiAobHAtPmxhbl90eXBlID09IEhQMTAwX0xBTl8xMDApCisJCQkJCWxwLT5odWJfc3RhdHVzID0gaHAxMDBfbG9naW5fdG9fdmdfaHViKGRldiwgMCk7CisJCQkJaHAxMDBfc3RhcnRfaW50ZXJmYWNlKGRldik7CisJCQl9CisJCX0KKworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJLyoKKwkgKiB3ZSBoYXZlIHRvIHR1cm4gaW50J3Mgb2ZmIGJlZm9yZSBtb2RpZnlpbmcgdGhpcywgb3RoZXJ3aXNlCisJICogYSB0eF9wZGxfY2xlYW51cCBjb3VsZCBvY2N1ciBhdCB0aGUgc2FtZSB0aW1lCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJcmluZ3B0ciA9IGxwLT50eHJ0YWlsOworCWxwLT50eHJ0YWlsID0gcmluZ3B0ci0+bmV4dDsKKworCS8qIENoZWNrIHdoZXRoZXIgcGFja2V0IGhhcyBtaW5pbWFsIHBhY2tldCBzaXplICovCisJb2tfZmxhZyA9IHNrYi0+bGVuID49IEhQMTAwX01JTl9QQUNLRVRfU0laRTsKKwlpID0gb2tfZmxhZyA/IHNrYi0+bGVuIDogSFAxMDBfTUlOX1BBQ0tFVF9TSVpFOworCisJcmluZ3B0ci0+c2tiID0gc2tiOworCXJpbmdwdHItPnBkbFswXSA9ICgoMSA8PCAxNikgfCBpKTsJLyogUERIOiAxIEZyYWdtZW50ICYgbGVuZ3RoICovCisJaWYgKGxwLT5jaGlwID09IEhQMTAwX0NISVBJRF9TSEFTVEEpIHsKKwkJLyogVE9ETzpDb3VsZCBzb21lb25lIHdobyBoYXMgdGhlIEVJU0EgY2FyZCBwbGVhc2UgY2hlY2sgaWYgdGhpcyB3b3Jrcz8gKi8KKwkJcmluZ3B0ci0+cGRsWzJdID0gaTsKKwl9IGVsc2UgewkJLyogTGFzc2VuICovCisJCS8qIEluIHRoZSBQREwsIGRvbid0IHVzZSB0aGUgcGFkZGVkIHNpemUgYnV0IHRoZSByZWFsIHBhY2tldCBzaXplOiAqLworCQlyaW5ncHRyLT5wZGxbMl0gPSBza2ItPmxlbjsJLyogMXN0IEZyYWc6IExlbmd0aCBvZiBmcmFnICovCisJfQorCS8qIENvbnZlcnNpb24gdG8gbmV3IFBDSSBBUEkgOiBtYXAgc2tidWYgZGF0YSB0byBQQ0kgYnVzLgorCSAqIERvYyBzYXlzIGl0J3MgT0sgZm9yIEVJU0EgYXMgd2VsbCAtIEplYW4gSUkgKi8KKwlyaW5ncHRyLT5wZGxbMV0gPSAoKHUzMikgcGNpX21hcF9zaW5nbGUobHAtPnBjaV9kZXYsIHNrYi0+ZGF0YSwgcmluZ3B0ci0+cGRsWzJdLCBQQ0lfRE1BX1RPREVWSUNFKSk7CS8qIDFzdCBGcmFnOiBBZHIuIG9mIGRhdGEgKi8KKworCS8qIEhhbmQgdGhpcyBQREwgdG8gdGhlIGNhcmQuICovCisJaHAxMDBfb3V0bChyaW5ncHRyLT5wZGxfcGFkZHIsIFRYX1BEQV9MKTsJLyogTG93IFByaW8uIFF1ZXVlICovCisKKwlscC0+dHhyY29tbWl0Kys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCS8qIFVwZGF0ZSBzdGF0aXN0aWNzICovCisJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlscC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlyZXR1cm4gMDsKK30KKwwKKworLyogY2xlYW5fdHhyaW5nIGNoZWNrcyBpZiBwYWNrZXRzIGhhdmUgYmVlbiBzZW50IGJ5IHRoZSBjYXJkIGJ5IHJlYWRpbmcKKyAqIHRoZSBUWF9QREwgcmVnaXN0ZXIgZnJvbSB0aGUgcGVyZm9ybWFuY2UgcGFnZSBhbmQgY29tcGFyaW5nIGl0IHRvIHRoZQorICogbnVtYmVyIG9mIGNvbW1pdGVkIHBhY2tldHMuIEl0IHRoZW4gZnJlZXMgdGhlIHNrYidzIG9mIHRoZSBwYWNrZXRzIHRoYXQKKyAqIG9idmlvdXNseSBoYXZlIGJlZW4gc2VudCB0byB0aGUgbmV0d29yay4KKyAqCisgKiBOZWVkcyB0aGUgUEVSRk9STUFOQ0UgcGFnZSBzZWxlY3RlZC4gCisgKi8KK3N0YXRpYyB2b2lkIGhwMTAwX2NsZWFuX3R4cmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBocDEwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBkb25lY291bnQ7CisKKyNpZmRlZiBIUDEwMF9ERUJVR19CCisJaHAxMDBfb3V0dygweDQyMTEsIFRSQUNFKTsKKwlwcmludGsoImhwMTAwOiAlczogY2xlYW4gdHhyaW5nXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwkvKiBIb3cgbWFueSBQRExzIGhhdmUgYmVlbiB0cmFuc21pdHRlZD8gKi8KKwlkb25lY291bnQgPSAobHAtPnR4cmNvbW1pdCkgLSBocDEwMF9pbmIoVFhfUERMKTsKKworI2lmZGVmIEhQMTAwX0RFQlVHCisJaWYgKGRvbmVjb3VudCA+IE1BWF9UWF9QREwpCisJCXByaW50aygiaHAxMDA6ICVzOiBXYXJuaW5nOiBNb3JlIFBETHMgdHJhbnNtaXR0ZWQgdGhhbiBjb21taXRlZCB0byBjYXJkPz8/XG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlmb3IgKDsgMCAhPSBkb25lY291bnQ7IGRvbmVjb3VudC0tKSB7CisjaWZkZWYgSFAxMDBfREVCVUdfQk0KKwkJcHJpbnRrKCJocDEwMDogJXM6IEZyZWUgc2tiOiBkYXRhIEAweCUuOHggdHhyY29tbWl0PTB4JXggVFhQREw9MHgleCwgZG9uZT0weCV4XG4iLAorCQkJCWRldi0+bmFtZSwgKHVfaW50KSBscC0+dHhyaGVhZC0+c2tiLT5kYXRhLAorCQkJCWxwLT50eHJjb21taXQsIGhwMTAwX2luYihUWF9QREwpLCBkb25lY291bnQpOworI2VuZGlmCisJCS8qIENvbnZlcnNpb24gdG8gbmV3IFBDSSBBUEkgOiBOT1AgKi8KKwkJcGNpX3VubWFwX3NpbmdsZShscC0+cGNpX2RldiwgKGRtYV9hZGRyX3QpIGxwLT50eHJoZWFkLT5wZGxbMV0sIGxwLT50eHJoZWFkLT5wZGxbMl0sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlkZXZfa2ZyZWVfc2tiX2FueShscC0+dHhyaGVhZC0+c2tiKTsKKwkJbHAtPnR4cmhlYWQtPnNrYiA9ICh2b2lkICopIE5VTEw7CisJCWxwLT50eHJoZWFkID0gbHAtPnR4cmhlYWQtPm5leHQ7CisJCWxwLT50eHJjb21taXQtLTsKKwl9Cit9CisKKy8qIHR4IGZ1bmN0aW9uIGZvciBzbGF2ZSBtb2RlcyAqLworc3RhdGljIGludCBocDEwMF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaSwgb2tfZmxhZzsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdV9zaG9ydCB2YWw7CisJc3RydWN0IGhwMTAwX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworI2lmZGVmIEhQMTAwX0RFQlVHX0IKKwlocDEwMF9vdXR3KDB4NDIxMiwgVFJBQ0UpOworCXByaW50aygiaHAxMDA6ICVzOiBzdGFydF94bWl0XG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHNrYi0+bGVuIDw9IDApCisJCXJldHVybiAwOworCisJaWYgKGhwMTAwX2NoZWNrX2xhbihkZXYpKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggZnJlZSBtZW1vcnkgb24gdGhlIGNhcmQuLi4gKi8KKwlpID0gaHAxMDBfaW5sKFRYX01FTV9GUkVFKSAmIDB4N2ZmZmZmZmY7CisJaWYgKCEoKChpIC8gMikgLSA1MzkpID4gKHNrYi0+bGVuICsgMTYpICYmIChocDEwMF9pbmIoVFhfUEtUX0NOVCkgPCAyNTUpKSkgeworI2lmZGVmIEhQMTAwX0RFQlVHCisJCXByaW50aygiaHAxMDA6ICVzOiBzdGFydF94bWl0OiB0eCBmcmVlIG1lbSA9IDB4JXhcbiIsIGRldi0+bmFtZSwgaSk7CisjZW5kaWYKKwkJLyogbm90IHdhaXRlZCBsb25nIGVub3VnaCBzaW5jZSBsYXN0IGZhaWxlZCB0eCB0cnk/ICovCisJCWlmIChqaWZmaWVzIC0gZGV2LT50cmFuc19zdGFydCA8IEhaKSB7CisjaWZkZWYgSFAxMDBfREVCVUcKKwkJCXByaW50aygiaHAxMDA6ICVzOiB0cmFuc19zdGFydCB0aW1pbmcgcHJvYmxlbVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCQlpZiAobHAtPmxhbl90eXBlID09IEhQMTAwX0xBTl8xMDAgJiYgbHAtPmh1Yl9zdGF0dXMgPCAwKSB7CisJCQkvKiB3ZSBoYXZlIGEgMTAwTWIvcyBhZGFwdGVyIGJ1dCBpdCBpc24ndCBjb25uZWN0ZWQgdG8gaHViICovCisJCQlwcmludGsoImhwMTAwOiAlczogbG9naW4gdG8gMTAwTWIvcyBodWIgcmV0cnlcbiIsIGRldi0+bmFtZSk7CisJCQlocDEwMF9zdG9wX2ludGVyZmFjZShkZXYpOworCQkJbHAtPmh1Yl9zdGF0dXMgPSBocDEwMF9sb2dpbl90b192Z19odWIoZGV2LCAwKTsKKwkJCWhwMTAwX3N0YXJ0X2ludGVyZmFjZShkZXYpOworCQl9IGVsc2UgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJCQlocDEwMF9pbnRzX29mZigpOwkvKiBVc2VmdWwgPyBKZWFuIElJICovCisJCQlpID0gaHAxMDBfc2Vuc2VfbGFuKGRldik7CisJCQlocDEwMF9pbnRzX29uKCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCQkJaWYgKGkgPT0gSFAxMDBfTEFOX0VSUikKKwkJCQlwcmludGsoImhwMTAwOiAlczogbGluayBkb3duIGRldGVjdGVkXG4iLCBkZXYtPm5hbWUpOworCQkJZWxzZSBpZiAobHAtPmxhbl90eXBlICE9IGkpIHsJLyogY2FibGUgY2hhbmdlISAqLworCQkJCS8qIGl0J3MgdmVyeSBoYXJkIC0gYWxsIG5ldHdvcmsgc2V0dGluZyBtdXN0IGJlIGNoYW5nZWQhISEgKi8KKwkJCQlwcmludGsoImhwMTAwOiAlczogY2FibGUgY2hhbmdlIDEwTWIvcyA8LT4gMTAwTWIvcyBkZXRlY3RlZFxuIiwgZGV2LT5uYW1lKTsKKwkJCQlscC0+bGFuX3R5cGUgPSBpOworCQkJCWhwMTAwX3N0b3BfaW50ZXJmYWNlKGRldik7CisJCQkJaWYgKGxwLT5sYW5fdHlwZSA9PSBIUDEwMF9MQU5fMTAwKQorCQkJCQlscC0+aHViX3N0YXR1cyA9IGhwMTAwX2xvZ2luX3RvX3ZnX2h1YihkZXYsIDApOworCQkJCWhwMTAwX3N0YXJ0X2ludGVyZmFjZShkZXYpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoImhwMTAwOiAlczogaW50ZXJmYWNlIHJlc2V0XG4iLCBkZXYtPm5hbWUpOworCQkJCWhwMTAwX3N0b3BfaW50ZXJmYWNlKGRldik7CisJCQkJaWYgKGxwLT5sYW5fdHlwZSA9PSBIUDEwMF9MQU5fMTAwKQorCQkJCQlscC0+aHViX3N0YXR1cyA9IGhwMTAwX2xvZ2luX3RvX3ZnX2h1YihkZXYsIDApOworCQkJCWhwMTAwX3N0YXJ0X2ludGVyZmFjZShkZXYpOworCQkJCW1kZWxheSgxKTsKKwkJCX0KKwkJfQorCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJZm9yIChpID0gMDsgaSA8IDYwMDAgJiYgKGhwMTAwX2luYihPUFRJT05fTVNXKSAmIEhQMTAwX1RYX0NNRCk7IGkrKykgeworI2lmZGVmIEhQMTAwX0RFQlVHX1RYCisJCXByaW50aygiaHAxMDA6ICVzOiBzdGFydF94bWl0OiBidXN5XG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJaHAxMDBfaW50c19vZmYoKTsKKwl2YWwgPSBocDEwMF9pbncoSVJRX1NUQVRVUyk7CisJLyogQWNrIC8gY2xlYXIgdGhlIGludGVycnVwdCBUWF9DT01QTEVURSBpbnRlcnJ1cHQgLSB0aGlzIGludGVycnVwdCBpcyBzZXQKKwkgKiB3aGVuIHRoZSBjdXJyZW50IHBhY2tldCBiZWluZyB0cmFuc21pdHRlZCBvbiB0aGUgd2lyZSBpcyBjb21wbGV0ZWQuICovCisJaHAxMDBfb3V0dyhIUDEwMF9UWF9DT01QTEVURSwgSVJRX1NUQVRVUyk7CisjaWZkZWYgSFAxMDBfREVCVUdfVFgKKwlwcmludGsoImhwMTAwOiAlczogc3RhcnRfeG1pdDogaXJxX3N0YXR1cz0weCUuNHgsIGlycW1hc2s9MHglLjR4LCBsZW49JWRcbiIsCisJCQlkZXYtPm5hbWUsIHZhbCwgaHAxMDBfaW53KElSUV9NQVNLKSwgKGludCkgc2tiLT5sZW4pOworI2VuZGlmCisKKwlva19mbGFnID0gc2tiLT5sZW4gPj0gSFAxMDBfTUlOX1BBQ0tFVF9TSVpFOworCWkgPSBva19mbGFnID8gc2tiLT5sZW4gOiBIUDEwMF9NSU5fUEFDS0VUX1NJWkU7CisKKwlocDEwMF9vdXR3KGksIERBVEEzMik7CS8qIHRlbGwgY2FyZCB0aGUgdG90YWwgcGFja2V0IGxlbmd0aCAqLworCWhwMTAwX291dHcoaSwgRlJBR01FTlRfTEVOKTsJLyogYW5kIGZpcnN0L29ubHkgZnJhZ21lbnQgbGVuZ3RoICAgICovCisKKwlpZiAobHAtPm1vZGUgPT0gMikgewkvKiBtZW1vcnkgbWFwcGVkICovCisJCWlmIChscC0+bWVtX3B0cl92aXJ0KSB7CS8qIGhpZ2ggcGNpIG1lbW9yeSB3YXMgcmVtYXBwZWQgKi8KKwkJCS8qIE5vdGU6IFRoZSBKMjU4NUIgbmVlZHMgYWxpZ25tZW50IHRvIDMyYml0cyBoZXJlISAgKi8KKwkJCW1lbWNweV90b2lvKGxwLT5tZW1fcHRyX3ZpcnQsIHNrYi0+ZGF0YSwgKHNrYi0+bGVuICsgMykgJiB+Myk7CisJCQlpZiAoIW9rX2ZsYWcpCisJCQkJbWVtc2V0X2lvKGxwLT5tZW1fcHRyX3ZpcnQsIDAsIEhQMTAwX01JTl9QQUNLRVRfU0laRSAtIHNrYi0+bGVuKTsKKwkJfSBlbHNlIHsKKwkJCS8qIE5vdGU6IFRoZSBKMjU4NUIgbmVlZHMgYWxpZ25tZW50IHRvIDMyYml0cyBoZXJlISAgKi8KKwkJCWlzYV9tZW1jcHlfdG9pbyhscC0+bWVtX3B0cl9waHlzLCBza2ItPmRhdGEsIChza2ItPmxlbiArIDMpICYgfjMpOworCQkJaWYgKCFva19mbGFnKQorCQkJCWlzYV9tZW1zZXRfaW8obHAtPm1lbV9wdHJfcGh5cywgMCwgSFAxMDBfTUlOX1BBQ0tFVF9TSVpFIC0gc2tiLT5sZW4pOworCQl9CisJfSBlbHNlIHsJCS8qIHByb2dyYW1tZWQgaS9vICovCisJCW91dHNsKGlvYWRkciArIEhQMTAwX1JFR19EQVRBMzIsIHNrYi0+ZGF0YSwKKwkJICAgICAgKHNrYi0+bGVuICsgMykgPj4gMik7CisJCWlmICghb2tfZmxhZykKKwkJCWZvciAoaSA9IChza2ItPmxlbiArIDMpICYgfjM7IGkgPCBIUDEwMF9NSU5fUEFDS0VUX1NJWkU7IGkgKz0gNCkKKwkJCQlocDEwMF9vdXRsKDAsIERBVEEzMik7CisJfQorCisJaHAxMDBfb3V0YihIUDEwMF9UWF9DTUQgfCBIUDEwMF9TRVRfTEIsIE9QVElPTl9NU1cpOwkvKiBzZW5kIHBhY2tldCAqLworCisJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlscC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJaHAxMDBfaW50c19vbigpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCisjaWZkZWYgSFAxMDBfREVCVUdfVFgKKwlwcmludGsoImhwMTAwOiAlczogc3RhcnRfeG1pdDogZW5kXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKwwKKworLyoKKyAqIFJlY2VpdmUgRnVuY3Rpb24gKE5vbi1CdXNtYXN0ZXIgbW9kZSkKKyAqIENhbGxlZCB3aGVuIGFuICJSZWNlaXZlIFBhY2tldCIgaW50ZXJydXB0IG9jY3VycywgaS5lLiB0aGUgcmVjZWl2ZSAKKyAqIHBhY2tldCBjb3VudGVyIGlzIG5vbi16ZXJvLgorICogRm9yIG5vbi1idXNtYXN0ZXIsIHRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgd2hvbGUgd29yayBvZiB0cmFuc2ZlcmluZworICogdGhlIHBhY2tldCB0byB0aGUgaG9zdCBtZW1vcnkgYW5kIHRoZW4gdXAgdG8gaGlnaGVyIGxheWVycyB2aWEgc2tiCisgKiBhbmQgbmV0aWZfcnguIAorICovCisKK3N0YXRpYyB2b2lkIGhwMTAwX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHBhY2tldHMsIHBrdF9sZW47CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBocDEwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdV9pbnQgaGVhZGVyOworCXN0cnVjdCBza19idWZmICpza2I7CisKKyNpZmRlZiBERUJVR19CCisJaHAxMDBfb3V0dygweDQyMTMsIFRSQUNFKTsKKwlwcmludGsoImhwMTAwOiAlczogcnhcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCS8qIEZpcnN0IGdldCBpbmRpY2F0aW9uIG9mIHJlY2VpdmVkIGxhbiBwYWNrZXQgKi8KKwkvKiBSWF9QS1RfQ05EIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgd2hpY2ggaGF2ZSBiZWVuIGZ1bGx5ICovCisJLyogcmVjZWl2ZWQgb250byB0aGUgY2FyZCBidXQgaGF2ZSBub3QgYmVlbiBmdWxseSB0cmFuc2ZlcnJlZCBvZiB0aGUgY2FyZCAqLworCXBhY2tldHMgPSBocDEwMF9pbmIoUlhfUEtUX0NOVCk7CisjaWZkZWYgSFAxMDBfREVCVUdfUlgKKwlpZiAocGFja2V0cyA+IDEpCisJCXByaW50aygiaHAxMDA6ICVzOiByeDogd2FpdGluZyBwYWNrZXRzID0gJWRcbiIsIGRldi0+bmFtZSwgcGFja2V0cyk7CisjZW5kaWYKKworCXdoaWxlIChwYWNrZXRzLS0gPiAwKSB7CisJCS8qIElmIEFEVl9OWFRfUEtUIGlzIHN0aWxsIHNldCwgd2UgaGF2ZSB0byB3YWl0IHVudGlsIHRoZSBjYXJkIGhhcyAqLworCQkvKiByZWFsbHkgYWR2YW5jZWQgdG8gdGhlIG5leHQgcGFja2V0LiAqLworCQlmb3IgKHBrdF9sZW4gPSAwOyBwa3RfbGVuIDwgNjAwMCAmJiAoaHAxMDBfaW5iKE9QVElPTl9NU1cpICYgSFAxMDBfQURWX05YVF9QS1QpOyBwa3RfbGVuKyspIHsKKyNpZmRlZiBIUDEwMF9ERUJVR19SWAorCQkJcHJpbnRrICgiaHAxMDA6ICVzOiByeDogYnVzeSwgcmVtYWluaW5nIHBhY2tldHMgPSAlZFxuIiwgZGV2LT5uYW1lLCBwYWNrZXRzKTsKKyNlbmRpZgorCQl9CisKKwkJLyogRmlyc3Qgd2UgZ2V0IHRoZSBoZWFkZXIsIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSAqLworCQkvKiBhY3R1YWwgbGVuZ3RoIG9mIHRoZSByZWNlaXZlZCBwYWNrZXQuICovCisJCWlmIChscC0+bW9kZSA9PSAyKSB7CS8qIG1lbW9yeSBtYXBwZWQgbW9kZSAqLworCQkJaWYgKGxwLT5tZW1fcHRyX3ZpcnQpCS8qIGlmIG1lbW9yeSB3YXMgcmVtYXBwZWQgKi8KKwkJCQloZWFkZXIgPSByZWFkbChscC0+bWVtX3B0cl92aXJ0KTsKKwkJCWVsc2UKKwkJCQloZWFkZXIgPSBpc2FfcmVhZGwobHAtPm1lbV9wdHJfcGh5cyk7CisJCX0gZWxzZQkJLyogcHJvZ3JhbW1lZCBpL28gKi8KKwkJCWhlYWRlciA9IGhwMTAwX2lubChEQVRBMzIpOworCisJCXBrdF9sZW4gPSAoKGhlYWRlciAmIEhQMTAwX1BLVF9MRU5fTUFTSykgKyAzKSAmIH4zOworCisjaWZkZWYgSFAxMDBfREVCVUdfUlgKKwkJcHJpbnRrKCJocDEwMDogJXM6IHJ4OiBuZXcgcGFja2V0IC0gbGVuZ3RoPSVkLCBlcnJvcnM9MHgleCwgZGVzdD0weCV4XG4iLAorCQkJCSAgICAgZGV2LT5uYW1lLCBoZWFkZXIgJiBIUDEwMF9QS1RfTEVOX01BU0ssCisJCQkJICAgICAoaGVhZGVyID4+IDE2KSAmIDB4ZmZmOCwgKGhlYWRlciA+PiAxNikgJiA3KTsKKyNlbmRpZgorCisJCS8qIE5vdyB3ZSBhbGxvY2F0ZSB0aGUgc2tiIGFuZCB0cmFuc2ZlciB0aGUgZGF0YSBpbnRvIGl0LiAqLworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4rMik7CisJCWlmIChza2IgPT0gTlVMTCkgewkvKiBOb3QgZW5vdWdoIG1lbW9yeS0+ZHJvcCBwYWNrZXQgKi8KKyNpZmRlZiBIUDEwMF9ERUJVRworCQkJcHJpbnRrKCJocDEwMDogJXM6IHJ4OiBjb3VsZG4ndCBhbGxvY2F0ZSBhIHNrX2J1ZmYgb2Ygc2l6ZSAlZFxuIiwKKwkJCQkJICAgICBkZXYtPm5hbWUsIHBrdF9sZW4pOworI2VuZGlmCisJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQl9IGVsc2UgewkvKiBza2Igc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZCAqLworCisJCQl1X2NoYXIgKnB0cjsKKworCQkJc2tiX3Jlc2VydmUoc2tiLDIpOworCQkJc2tiLT5kZXYgPSBkZXY7CisKKwkJCS8qIHB0ciB0byBzdGFydCBvZiB0aGUgc2tfYnVmZiBkYXRhIGFyZWEgKi8KKwkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKwkJCXB0ciA9IHNrYi0+ZGF0YTsKKworCQkJLyogTm93IHRyYW5zZmVyIHRoZSBkYXRhIGZyb20gdGhlIGNhcmQgaW50byB0aGF0IGFyZWEgKi8KKwkJCWlmIChscC0+bW9kZSA9PSAyKSB7CisJCQkJaWYgKGxwLT5tZW1fcHRyX3ZpcnQpCisJCQkJCW1lbWNweV9mcm9taW8ocHRyLCBscC0+bWVtX3B0cl92aXJ0LHBrdF9sZW4pOworCQkJCS8qIE5vdGUgYWxpZ25tZW50IHRvIDMyYml0IHRyYW5zZmVycyAqLworCQkJCWVsc2UKKwkJCQkJaXNhX21lbWNweV9mcm9taW8ocHRyLCBscC0+bWVtX3B0cl9waHlzLCBwa3RfbGVuKTsKKwkJCX0gZWxzZQkvKiBpbyBtYXBwZWQgKi8KKwkJCQlpbnNsKGlvYWRkciArIEhQMTAwX1JFR19EQVRBMzIsIHB0ciwgcGt0X2xlbiA+PiAyKTsKKworCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworI2lmZGVmIEhQMTAwX0RFQlVHX1JYCisJCQlwcmludGsoImhwMTAwOiAlczogcng6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJCQlkZXYtPm5hbWUsIHB0clswXSwgcHRyWzFdLCBwdHJbMl0sIHB0clszXSwKKwkJIAkJCXB0cls0XSwgcHRyWzVdLCBwdHJbNl0sIHB0cls3XSwgcHRyWzhdLAorCQkJCQlwdHJbOV0sIHB0clsxMF0sIHB0clsxMV0pOworI2VuZGlmCisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJfQorCisJCS8qIEluZGljYXRlIHRoZSBjYXJkIHRoYXQgd2UgaGF2ZSBnb3QgdGhlIHBhY2tldCAqLworCQlocDEwMF9vdXRiKEhQMTAwX0FEVl9OWFRfUEtUIHwgSFAxMDBfU0VUX0xCLCBPUFRJT05fTVNXKTsKKworCQlzd2l0Y2ggKGhlYWRlciAmIDB4MDAwNzAwMDApIHsKKwkJY2FzZSAoSFAxMDBfTVVMVElfQUREUl9IQVNIIDw8IDE2KToKKwkJY2FzZSAoSFAxMDBfTVVMVElfQUREUl9OT19IQVNIIDw8IDE2KToKKwkJCWxwLT5zdGF0cy5tdWx0aWNhc3QrKzsKKwkJCWJyZWFrOworCQl9CisJfQkJCS8qIGVuZCBvZiB3aGlsZSh0aGVyZSBhcmUgcGFja2V0cykgbG9vcCAqLworI2lmZGVmIEhQMTAwX0RFQlVHX1JYCisJcHJpbnRrKCJocDEwMF9yeDogJXM6IGVuZFxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKiAKKyAqIFJlY2VpdmUgRnVuY3Rpb24gZm9yIEJ1c21hc3RlciBNb2RlCisgKi8KK3N0YXRpYyB2b2lkIGhwMTAwX3J4X2JtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBocDEwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaHAxMDBfcmluZ190ICpwdHI7CisJdV9pbnQgaGVhZGVyOworCWludCBwa3RfbGVuOworCisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWhwMTAwX291dHcoMHg0MjE0LCBUUkFDRSk7CisJcHJpbnRrKCJocDEwMDogJXM6IHJ4X2JtXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKyNpZmRlZiBIUDEwMF9ERUJVRworCWlmICgwID09IGxwLT5yeHJjb21taXQpIHsKKwkJcHJpbnRrKCJocDEwMDogJXM6IHJ4X2JtIGNhbGxlZCBhbHRob3VnaCBubyBQRExzIHdlcmUgY29tbWl0dGVkIHRvIGFkYXB0ZXI/XG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm47CisJfSBlbHNlCisJCS8qIFJYX1BLVF9DTlQgc3RhdGVzIGhvdyBtYW55IFBETHMgYXJlIGN1cnJlbnRseSBmb3JtYXR0ZWQgYW5kIGF2YWlsYWJsZSB0byAKKwkJICogdGhlIGNhcmRzIEJNIGVuZ2luZSAqLworCWlmICgoaHAxMDBfaW53KFJYX1BLVF9DTlQpICYgMHgwMGZmKSA+PSBscC0+cnhyY29tbWl0KSB7CisJCXByaW50aygiaHAxMDA6ICVzOiBNb3JlIHBhY2tldHMgcmVjZWl2ZWQgdGhhbiBjb21taXRlZD8gUlhfUEtUX0NOVD0weCV4LCBjb21taXQ9MHgleFxuIiwKKwkJCQkgICAgIGRldi0+bmFtZSwgaHAxMDBfaW53KFJYX1BLVF9DTlQpICYgMHgwMGZmLAorCQkJCSAgICAgbHAtPnJ4cmNvbW1pdCk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworCXdoaWxlICgobHAtPnJ4cmNvbW1pdCA+IGhwMTAwX2luYihSWF9QREwpKSkgeworCQkvKgorCQkgKiBUaGUgcGFja2V0IHdhcyByZWNlaXZlZCBpbnRvIHRoZSBwZGwgcG9pbnRlZCB0byBieSBscC0+cnhyaGVhZCAoCisJCSAqIHRoZSBvbGRlc3QgcGRsIGluIHRoZSByaW5nIAorCQkgKi8KKworCQkvKiBGaXJzdCB3ZSBnZXQgdGhlIGhlYWRlciwgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlICovCisJCS8qIGFjdHVhbCBsZW5ndGggb2YgdGhlIHJlY2VpdmVkIHBhY2tldC4gKi8KKworCQlwdHIgPSBscC0+cnhyaGVhZDsKKworCQloZWFkZXIgPSAqKHB0ci0+cGRsIC0gMSk7CisJCXBrdF9sZW4gPSAoaGVhZGVyICYgSFAxMDBfUEtUX0xFTl9NQVNLKTsKKworCQkvKiBDb252ZXJzaW9uIHRvIG5ldyBQQ0kgQVBJIDogTk9QICovCisJCXBjaV91bm1hcF9zaW5nbGUobHAtPnBjaV9kZXYsIChkbWFfYWRkcl90KSBwdHItPnBkbFszXSwgTUFYX0VUSEVSX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKyNpZmRlZiBIUDEwMF9ERUJVR19CTQorCQlwcmludGsoImhwMTAwOiAlczogcnhfYm06IGhlYWRlckAweCV4PTB4JXggbGVuZ3RoPSVkLCBlcnJvcnM9MHgleCwgZGVzdD0weCV4XG4iLAorCQkJCWRldi0+bmFtZSwgKHVfaW50KSAocHRyLT5wZGwgLSAxKSwgKHVfaW50KSBoZWFkZXIsCisJCQkJcGt0X2xlbiwgKGhlYWRlciA+PiAxNikgJiAweGZmZjgsIChoZWFkZXIgPj4gMTYpICYgNyk7CisJCXByaW50aygiaHAxMDA6ICVzOiBSWF9QRExfQ09VTlQ6MHgleCBUWF9QRExfQ09VTlQ6MHgleCwgUlhfUEtUX0NOVD0weCV4IFBESD0weCV4LCBEYXRhQDB4JXggbGVuPTB4JXhcbiIsCisJCSAgIAkJZGV2LT5uYW1lLCBocDEwMF9pbmIoUlhfUERMKSwgaHAxMDBfaW5iKFRYX1BETCksCisJCQkJaHAxMDBfaW5iKFJYX1BLVF9DTlQpLCAodV9pbnQpICogKHB0ci0+cGRsKSwKKwkJCQkodV9pbnQpICogKHB0ci0+cGRsICsgMyksICh1X2ludCkgKiAocHRyLT5wZGwgKyA0KSk7CisjZW5kaWYKKworCQlpZiAoKHBrdF9sZW4gPj0gTUlOX0VUSEVSX1NJWkUpICYmCisJCSAgICAocGt0X2xlbiA8PSBNQVhfRVRIRVJfU0laRSkpIHsKKwkJCWlmIChwdHItPnNrYiA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKCJocDEwMDogJXM6IHJ4X2JtOiBza2IgbnVsbFxuIiwgZGV2LT5uYW1lKTsKKwkJCQkvKiBjYW4gaGFwcGVuIGlmIHdlIG9ubHkgYWxsb2NhdGVkIHJvb20gZm9yIHRoZSBwZGggZHVlIHRvIG1lbW9yeSBzaG9ydGFnZS4gKi8KKwkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJfSBlbHNlIHsKKwkJCQlza2JfdHJpbShwdHItPnNrYiwgcGt0X2xlbik7CS8qIFNob3J0ZW4gaXQgKi8KKwkJCQlwdHItPnNrYi0+cHJvdG9jb2wgPQorCQkJCSAgICBldGhfdHlwZV90cmFucyhwdHItPnNrYiwgZGV2KTsKKworCQkJCW5ldGlmX3J4KHB0ci0+c2tiKTsJLyogVXAgYW5kIGF3YXkuLi4gKi8KKworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJCX0KKworCQkJc3dpdGNoIChoZWFkZXIgJiAweDAwMDcwMDAwKSB7CisJCQljYXNlIChIUDEwMF9NVUxUSV9BRERSX0hBU0ggPDwgMTYpOgorCQkJY2FzZSAoSFAxMDBfTVVMVElfQUREUl9OT19IQVNIIDw8IDE2KToKKwkJCQlscC0+c3RhdHMubXVsdGljYXN0Kys7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisjaWZkZWYgSFAxMDBfREVCVUcKKwkJCXByaW50aygiaHAxMDA6ICVzOiByeF9ibTogUmVjZWl2ZWQgYmFkIHBhY2tldCAobGVuZ3RoPSVkKVxuIiwgZGV2LT5uYW1lLCBwa3RfbGVuKTsKKyNlbmRpZgorCQkJaWYgKHB0ci0+c2tiICE9IE5VTEwpCisJCQkJZGV2X2tmcmVlX3NrYl9hbnkocHRyLT5za2IpOworCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQl9CisKKwkJbHAtPnJ4cmhlYWQgPSBscC0+cnhyaGVhZC0+bmV4dDsKKworCQkvKiBBbGxvY2F0ZSBhIG5ldyByeCBQREwgKHNvIGxwLT5yeHJjb21taXQgc3RheXMgdGhlIHNhbWUpICovCisJCWlmICgwID09IGhwMTAwX2J1aWxkX3J4X3BkbChscC0+cnhydGFpbCwgZGV2KSkgeworCQkJLyogTm8gc3BhY2UgZm9yIHNrYiwgaGVhZGVyIGNhbiBzdGlsbCBiZSByZWNlaXZlZC4gKi8KKyNpZmRlZiBIUDEwMF9ERUJVRworCQkJcHJpbnRrKCJocDEwMDogJXM6IHJ4X2JtOiBObyBzcGFjZSBmb3IgbmV3IFBETC5cbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsJLyogc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZCBuZXcgUERMIC0gcHV0IGl0IGluIHJpbmdsaXN0IGF0IHRhaWwuICovCisJCQlocDEwMF9vdXRsKCh1MzIpIGxwLT5yeHJ0YWlsLT5wZGxfcGFkZHIsIFJYX1BEQSk7CisJCQlscC0+cnhydGFpbCA9IGxwLT5yeHJ0YWlsLT5uZXh0OworCQl9CisKKwl9Cit9CisKKy8qCisgKiAgc3RhdGlzdGljcworICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmhwMTAwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBocDEwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKyNpZmRlZiBIUDEwMF9ERUJVR19CCisJaHAxMDBfb3V0dygweDQyMTUsIFRSQUNFKTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJaHAxMDBfaW50c19vZmYoKTsJLyogVXNlZnVsID8gSmVhbiBJSSAqLworCWhwMTAwX3VwZGF0ZV9zdGF0cyhkZXYpOworCWhwMTAwX2ludHNfb24oKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCXJldHVybiAmKGxwLT5zdGF0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGhwMTAwX3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1X3Nob3J0IHZhbDsKKwlzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWhwMTAwX291dHcoMHg0MjE2LCBUUkFDRSk7CisJcHJpbnRrKCJocDEwMDogJXM6IHVwZGF0ZS1zdGF0c1xuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogTm90ZTogU3RhdGlzdGljcyBjb3VudGVycyBjbGVhciB3aGVuIHJlYWQuICovCisJaHAxMDBfcGFnZShNQUNfQ1RSTCk7CisJdmFsID0gaHAxMDBfaW53KERST1BQRUQpICYgMHgwZmZmOworCWxwLT5zdGF0cy5yeF9lcnJvcnMgKz0gdmFsOworCWxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycyArPSB2YWw7CisJdmFsID0gaHAxMDBfaW5iKENSQyk7CisJbHAtPnN0YXRzLnJ4X2Vycm9ycyArPSB2YWw7CisJbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gdmFsOworCXZhbCA9IGhwMTAwX2luYihBQk9SVCk7CisJbHAtPnN0YXRzLnR4X2Vycm9ycyArPSB2YWw7CisJbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzICs9IHZhbDsKKwlocDEwMF9wYWdlKFBFUkZPUk1BTkNFKTsKK30KKworc3RhdGljIHZvaWQgaHAxMDBfbWlzY19pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZmRlZiBIUDEwMF9ERUJVR19CCisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworI2VuZGlmCisJc3RydWN0IGhwMTAwX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworI2lmZGVmIEhQMTAwX0RFQlVHX0IKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaHAxMDBfb3V0dygweDQyMTYsIFRSQUNFKTsKKwlwcmludGsoImhwMTAwOiAlczogbWlzY19pbnRlcnJ1cHRcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCS8qIE5vdGU6IFN0YXRpc3RpY3MgY291bnRlcnMgY2xlYXIgd2hlbiByZWFkLiAqLworCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwlscC0+c3RhdHMudHhfZXJyb3JzKys7Cit9CisKK3N0YXRpYyB2b2lkIGhwMTAwX2NsZWFyX3N0YXRzKHN0cnVjdCBocDEwMF9wcml2YXRlICpscCwgaW50IGlvYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgSFAxMDBfREVCVUdfQgorCWhwMTAwX291dHcoMHg0MjE3LCBUUkFDRSk7CisJcHJpbnRrKCJocDEwMDogJXM6IGNsZWFyX3N0YXRzXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwlocDEwMF9wYWdlKE1BQ19DVFJMKTsJLyogZ2V0IGFsbCBzdGF0aXN0aWNzIGJ5dGVzICovCisJaHAxMDBfaW53KERST1BQRUQpOworCWhwMTAwX2luYihDUkMpOworCWhwMTAwX2luYihBQk9SVCk7CisJaHAxMDBfcGFnZShQRVJGT1JNQU5DRSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKK30KKwwKKworLyoKKyAqICBtdWx0aWNhc3Qgc2V0dXAKKyAqLworCisvKgorICogIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdGVyLgorICovCisKK3N0YXRpYyB2b2lkIGhwMTAwX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBocDEwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKyNpZmRlZiBIUDEwMF9ERUJVR19CCisJaHAxMDBfb3V0dygweDQyMTgsIFRSQUNFKTsKKwlwcmludGsoImhwMTAwOiAlczogc2V0X21jX2xpc3RcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCWhwMTAwX2ludHNfb2ZmKCk7CisJaHAxMDBfcGFnZShNQUNfQ1RSTCk7CisJaHAxMDBfYW5kYih+KEhQMTAwX1JYX0VOIHwgSFAxMDBfVFhfRU4pLCBNQUNfQ0ZHXzEpOwkvKiBzdG9wIHJ4L3R4ICovCisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCWxwLT5tYWMyX21vZGUgPSBIUDEwMF9NQUMyTU9ERTY7CS8qIHByb21pc2N1b3VzIG1vZGUgPSBnZXQgYWxsIGdvb2QgKi8KKwkJbHAtPm1hYzFfbW9kZSA9IEhQMTAwX01BQzFNT0RFNjsJLyogcGFja2V0cyBvbiB0aGUgbmV0ICovCisJCW1lbXNldCgmbHAtPmhhc2hfYnl0ZXMsIDB4ZmYsIDgpOworCX0gZWxzZSBpZiAoZGV2LT5tY19jb3VudCB8fCAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKKwkJbHAtPm1hYzJfbW9kZSA9IEhQMTAwX01BQzJNT0RFNTsJLyogbXVsdGljYXN0IG1vZGUgPSBnZXQgcGFja2V0cyBmb3IgKi8KKwkJbHAtPm1hYzFfbW9kZSA9IEhQMTAwX01BQzFNT0RFNTsJLyogbWUsIGJyb2FkY2FzdHMgYW5kIGFsbCBtdWx0aWNhc3RzICovCisjaWZkZWYgSFAxMDBfTVVMVElDQVNUX0ZJTFRFUgkvKiBkb2Vzbid0IHdvcmshISEgKi8KKwkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwkJCS8qIHNldCBoYXNoIGZpbHRlciB0byByZWNlaXZlIGFsbCBtdWx0aWNhc3QgcGFja2V0cyAqLworCQkJbWVtc2V0KCZscC0+aGFzaF9ieXRlcywgMHhmZiwgOCk7CisJCX0gZWxzZSB7CisJCQlpbnQgaSwgaiwgaWR4OworCQkJdV9jaGFyICphZGRyczsKKwkJCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pOworCisJCQltZW1zZXQoJmxwLT5oYXNoX2J5dGVzLCAweDAwLCA4KTsKKyNpZmRlZiBIUDEwMF9ERUJVRworCQkJcHJpbnRrKCJocDEwMDogJXM6IGNvbXB1dGluZyBoYXNoIGZpbHRlciAtIG1jX2NvdW50ID0gJWlcbiIsIGRldi0+bmFtZSwgZGV2LT5tY19jb3VudCk7CisjZW5kaWYKKwkJCWZvciAoaSA9IDAsIGRtaSA9IGRldi0+bWNfbGlzdDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKywgZG1pID0gZG1pLT5uZXh0KSB7CisJCQkJYWRkcnMgPSBkbWktPmRtaV9hZGRyOworCQkJCWlmICgoKmFkZHJzICYgMHgwMSkgPT0gMHgwMSkgewkvKiBtdWx0aWNhc3QgYWRkcmVzcz8gKi8KKyNpZmRlZiBIUDEwMF9ERUJVRworCQkJCQlwcmludGsoImhwMTAwOiAlczogbXVsdGljYXN0ID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngsICIsCisJCQkJCQkgICAgIGRldi0+bmFtZSwgYWRkcnNbMF0sIGFkZHJzWzFdLCBhZGRyc1syXSwKKwkJCQkJCSAgICAgYWRkcnNbM10sIGFkZHJzWzRdLCBhZGRyc1s1XSk7CisjZW5kaWYKKwkJCQkJZm9yIChqID0gaWR4ID0gMDsgaiA8IDY7IGorKykgeworCQkJCQkJaWR4IF49ICphZGRycysrICYgMHgzZjsKKwkJCQkJCXByaW50aygiOiUwMng6IiwgaWR4KTsKKwkJCQkJfQorI2lmZGVmIEhQMTAwX0RFQlVHCisJCQkJCXByaW50aygiaWR4ID0gJWlcbiIsIGlkeCk7CisjZW5kaWYKKwkJCQkJbHAtPmhhc2hfYnl0ZXNbaWR4ID4+IDNdIHw9ICgxIDw8IChpZHggJiA3KSk7CisJCQkJfQorCQkJfQorCQl9CisjZWxzZQorCQltZW1zZXQoJmxwLT5oYXNoX2J5dGVzLCAweGZmLCA4KTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWxwLT5tYWMyX21vZGUgPSBIUDEwMF9NQUMyTU9ERTM7CS8qIG5vcm1hbCBtb2RlID0gZ2V0IHBhY2tldHMgZm9yIG1lICovCisJCWxwLT5tYWMxX21vZGUgPSBIUDEwMF9NQUMxTU9ERTM7CS8qIGFuZCBicm9hZGNhc3RzICovCisJCW1lbXNldCgmbHAtPmhhc2hfYnl0ZXMsIDB4MDAsIDgpOworCX0KKworCWlmICgoKGhwMTAwX2luYihNQUNfQ0ZHXzEpICYgMHgwZikgIT0gbHAtPm1hYzFfbW9kZSkgfHwKKwkgICAgKGhwMTAwX2luYihNQUNfQ0ZHXzIpICE9IGxwLT5tYWMyX21vZGUpKSB7CisJCWludCBpOworCisJCWhwMTAwX291dGIobHAtPm1hYzJfbW9kZSwgTUFDX0NGR18yKTsKKwkJaHAxMDBfYW5kYihIUDEwMF9NQUMxTU9ERU1BU0ssIE1BQ19DRkdfMSk7CS8qIGNsZWFyIG1hYzEgbW9kZSBiaXRzICovCisJCWhwMTAwX29yYihscC0+bWFjMV9tb2RlLCBNQUNfQ0ZHXzEpOwkvKiBhbmQgc2V0IHRoZSBuZXcgbW9kZSAqLworCisJCWhwMTAwX3BhZ2UoTUFDX0FERFJFU1MpOworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQkJaHAxMDBfb3V0YihscC0+aGFzaF9ieXRlc1tpXSwgSEFTSF9CWVRFMCArIGkpOworI2lmZGVmIEhQMTAwX0RFQlVHCisJCXByaW50aygiaHAxMDA6ICVzOiBtYWMxID0gMHgleCwgbWFjMiA9IDB4JXgsIG11bHRpY2FzdCBoYXNoID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJCSAgICAgZGV2LT5uYW1lLCBscC0+bWFjMV9tb2RlLCBscC0+bWFjMl9tb2RlLAorCQkJCSAgICAgbHAtPmhhc2hfYnl0ZXNbMF0sIGxwLT5oYXNoX2J5dGVzWzFdLAorCQkJCSAgICAgbHAtPmhhc2hfYnl0ZXNbMl0sIGxwLT5oYXNoX2J5dGVzWzNdLAorCQkJCSAgICAgbHAtPmhhc2hfYnl0ZXNbNF0sIGxwLT5oYXNoX2J5dGVzWzVdLAorCQkJCSAgICAgbHAtPmhhc2hfYnl0ZXNbNl0sIGxwLT5oYXNoX2J5dGVzWzddKTsKKyNlbmRpZgorCisJCWlmIChscC0+bGFuX3R5cGUgPT0gSFAxMDBfTEFOXzEwMCkgeworI2lmZGVmIEhQMTAwX0RFQlVHCisJCQlwcmludGsoImhwMTAwOiAlczogMTAwVkcgTUFDIHNldHRpbmdzIGhhdmUgY2hhbmdlZCAtIHJlbG9naW4uXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJCQlscC0+aHViX3N0YXR1cyA9IGhwMTAwX2xvZ2luX3RvX3ZnX2h1YihkZXYsIDEpOwkvKiBmb3JjZSBhIHJlbG9naW4gdG8gdGhlIGh1YiAqLworCQl9CisJfSBlbHNlIHsKKwkJaW50IGk7CisJCXVfY2hhciBvbGRfaGFzaF9ieXRlc1s4XTsKKworCQlocDEwMF9wYWdlKE1BQ19BRERSRVNTKTsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCW9sZF9oYXNoX2J5dGVzW2ldID0gaHAxMDBfaW5iKEhBU0hfQllURTAgKyBpKTsKKwkJaWYgKG1lbWNtcChvbGRfaGFzaF9ieXRlcywgJmxwLT5oYXNoX2J5dGVzLCA4KSkgeworCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCQlocDEwMF9vdXRiKGxwLT5oYXNoX2J5dGVzW2ldLCBIQVNIX0JZVEUwICsgaSk7CisjaWZkZWYgSFAxMDBfREVCVUcKKwkJCXByaW50aygiaHAxMDA6ICVzOiBtdWx0aWNhc3QgaGFzaCA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQkJZGV2LT5uYW1lLCBscC0+aGFzaF9ieXRlc1swXSwKKwkJCQkJbHAtPmhhc2hfYnl0ZXNbMV0sIGxwLT5oYXNoX2J5dGVzWzJdLAorCQkJCQlscC0+aGFzaF9ieXRlc1szXSwgbHAtPmhhc2hfYnl0ZXNbNF0sCisJCQkJCWxwLT5oYXNoX2J5dGVzWzVdLCBscC0+aGFzaF9ieXRlc1s2XSwKKwkJCQkJbHAtPmhhc2hfYnl0ZXNbN10pOworI2VuZGlmCisKKwkJCWlmIChscC0+bGFuX3R5cGUgPT0gSFAxMDBfTEFOXzEwMCkgeworI2lmZGVmIEhQMTAwX0RFQlVHCisJCQkJcHJpbnRrKCJocDEwMDogJXM6IDEwMFZHIE1BQyBzZXR0aW5ncyBoYXZlIGNoYW5nZWQgLSByZWxvZ2luLlxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkJCWxwLT5odWJfc3RhdHVzID0gaHAxMDBfbG9naW5fdG9fdmdfaHViKGRldiwgMSk7CS8qIGZvcmNlIGEgcmVsb2dpbiB0byB0aGUgaHViICovCisJCQl9CisJCX0KKwl9CisKKwlocDEwMF9wYWdlKE1BQ19DVFJMKTsKKwlocDEwMF9vcmIoSFAxMDBfUlhfRU4gfCBIUDEwMF9SWF9JRExFIHwJLyogZW5hYmxlIHJ4ICovCisJCSAgSFAxMDBfVFhfRU4gfCBIUDEwMF9UWF9JRExFLCBNQUNfQ0ZHXzEpOwkvKiBlbmFibGUgdHggKi8KKworCWhwMTAwX3BhZ2UoUEVSRk9STUFOQ0UpOworCWhwMTAwX2ludHNfb24oKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogIGhhcmR3YXJlIGludGVycnVwdCBoYW5kbGluZworICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBocDEwMF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaW50IGlvYWRkcjsKKwl1X2ludCB2YWw7CisKKwlpZiAoZGV2ID09IE5VTEwpCisJCXJldHVybiBJUlFfTk9ORTsKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCXNwaW5fbG9jaygmbHAtPmxvY2spOworCisJaHAxMDBfaW50c19vZmYoKTsKKworI2lmZGVmIEhQMTAwX0RFQlVHX0IKKwlocDEwMF9vdXR3KDB4NDIxOSwgVFJBQ0UpOworI2VuZGlmCisKKwkvKiAgaHAxMDBfcGFnZSggUEVSRk9STUFOQ0UgKTsgKi8KKwl2YWwgPSBocDEwMF9pbncoSVJRX1NUQVRVUyk7CisjaWZkZWYgSFAxMDBfREVCVUdfSVJRCisJcHJpbnRrKCJocDEwMDogJXM6IG1vZGU9JXgsSVJRX1NUQVQ9MHglLjR4LFJYUEtUQ05UPTB4JS4yeCBSWFBETD0weCUuMnggVFhQS1RDTlQ9MHglLjJ4IFRYUERMPTB4JS4yeFxuIiwKKwkJCSAgICAgZGV2LT5uYW1lLCBscC0+bW9kZSwgKHVfaW50KSB2YWwsIGhwMTAwX2luYihSWF9QS1RfQ05UKSwKKwkJCSAgICAgaHAxMDBfaW5iKFJYX1BETCksIGhwMTAwX2luYihUWF9QS1RfQ05UKSwgaHAxMDBfaW5iKFRYX1BETCkpOworI2VuZGlmCisKKwlpZiAodmFsID09IDApIHsJCS8qIG1pZ2h0IGJlIGEgc2hhcmVkIGludGVycnVwdCAqLworCQlzcGluX3VubG9jaygmbHAtPmxvY2spOworCQlocDEwMF9pbnRzX29uKCk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJLyogV2UncmUgb25seSBpbnRlcmVzdGVkIGluIHRob3NlIGludGVycnVwdHMgd2UgcmVhbGx5IGVuYWJsZWQuICovCisJLyogdmFsICY9IGhwMTAwX2ludyggSVJRX01BU0sgKTsgKi8KKworCS8qIAorCSAqIFJYX1BETF9GSUxMX0NPTVBMIGlzIHNldCB3aGVuZXZlciBhIFJYX1BETCBoYXMgYmVlbiBleGVjdXRlZC4gQSBSWF9QREwgCisJICogaXMgY29uc2lkZXJlZCBleGVjdXRlZCB3aGVuZXZlciB0aGUgUlhfUERMIGRhdGEgc3RydWN0dXJlIGlzIG5vIGxvbmdlciAKKwkgKiBuZWVkZWQuCisJICovCisJaWYgKHZhbCAmIEhQMTAwX1JYX1BETF9GSUxMX0NPTVBMKSB7CisJCWlmIChscC0+bW9kZSA9PSAxKQorCQkJaHAxMDBfcnhfYm0oZGV2KTsKKwkJZWxzZSB7CisJCQlwcmludGsoImhwMTAwOiAlczogcnhfcGRsX2ZpbGxfY29tcGwgaW50ZXJydXB0IGFsdGhvdWdoIG5vdCBidXNtYXN0ZXI/XG4iLCBkZXYtPm5hbWUpOworCQl9CisJfQorCisJLyogCisJICogVGhlIFJYX1BBQ0tFVCBpbnRlcnJ1cHQgaXMgc2V0LCB3aGVuIHRoZSByZWNlaXZlIHBhY2tldCBjb3VudGVyIGlzCisJICogbm9uIHplcm8uIFdlIHVzZSB0aGlzIGludGVycnVwdCBmb3IgcmVjZWl2aW5nIGluIHNsYXZlIG1vZGUuIEluCisJICogYnVzbWFzdGVyIG1vZGUsIHdlIHVzZSBpdCB0byBtYWtlIHN1cmUgd2UgZGlkIG5vdCBtaXNzIGFueSByeF9wZGxfZmlsbAorCSAqIGludGVycnVwdHMuIElmIHJ4X3BkbF9maWxsX2NvbXBsIGlzIG5vdCBzZXQgYW5kIHJ4X3BhY2tldCBpcyBzZXQsIHRoZW4KKwkgKiB3ZSBzb21laG93IGhhdmUgbWlzc2VkIGEgcnhfcGRsX2ZpbGxfY29tcGwgaW50ZXJydXB0LgorCSAqLworCisJaWYgKHZhbCAmIEhQMTAwX1JYX1BBQ0tFVCkgewkvKiBSZWNlaXZlIFBhY2tldCBDb3VudGVyIGlzIG5vbiB6ZXJvICovCisJCWlmIChscC0+bW9kZSAhPSAxKQkvKiBub24gYnVzbWFzdGVyICovCisJCQlocDEwMF9yeChkZXYpOworCQllbHNlIGlmICghKHZhbCAmIEhQMTAwX1JYX1BETF9GSUxMX0NPTVBMKSkgeworCQkJLyogU2hvdWxkbnQgaGFwcGVuIC0gbWF5YmUgd2UgbWlzc2VkIGEgUlhfUERMX0ZJTEwgSW50ZXJydXB0PyAgKi8KKwkJCWhwMTAwX3J4X2JtKGRldik7CisJCX0KKwl9CisKKwkvKgorCSAqIEFjay4gdGhhdCB3ZSBoYXZlIG5vdGljZWQgdGhlIGludGVycnVwdCBhbmQgdGhlcmVieSBhbGxvdyBuZXh0IG9uZS4KKwkgKiBOb3RlIHRoYXQgdGhpcyBpcyBub3cgZG9uZSBhZnRlciB0aGUgc2xhdmUgcnggZnVuY3Rpb24sIHNpbmNlIGZpcnN0CisJICogYWNrbm93bGVkZ2luZyBhbmQgdGhlbiBzZXR0aW5nIEFEVl9OWFRfUEtUIGNhdXNlZCBhbiBleHRyYSBpbnRlcnJ1cHQKKwkgKiBvbiB0aGUgSjI1NzMuCisJICovCisJaHAxMDBfb3V0dyh2YWwsIElSUV9TVEFUVVMpOworCisJLyoKKwkgKiBSWF9FUlJPUiBpcyBzZXQgd2hlbiBhIHBhY2tldCBpcyBkcm9wcGVkIGR1ZSB0byBubyBtZW1vcnkgcmVzb3VyY2VzIG9uIAorCSAqIHRoZSBjYXJkIG9yIHdoZW4gYSBSQ1ZfRVJSIG9jY3Vycy4gCisJICogVFhfRVJST1IgaXMgc2V0IHdoZW4gYSBUWF9BQk9SVCBjb25kaXRpb24gb2NjdXJzIGluIHRoZSBNQUMtPmV4aXN0cyAgCisJICogb25seSBpbiB0aGUgODAyLjMgTUFDIGFuZCBoYXBwZW5zIHdoZW4gMTYgY29sbGlzaW9ucyBvY2N1ciBkdXJpbmcgYSBUWCAKKwkgKi8KKwlpZiAodmFsICYgKEhQMTAwX1RYX0VSUk9SIHwgSFAxMDBfUlhfRVJST1IpKSB7CisjaWZkZWYgSFAxMDBfREVCVUdfSVJRCisJCXByaW50aygiaHAxMDA6ICVzOiBUWC9SWCBFcnJvciBJUlFcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJaHAxMDBfdXBkYXRlX3N0YXRzKGRldik7CisJCWlmIChscC0+bW9kZSA9PSAxKSB7CisJCQlocDEwMF9yeGZpbGwoZGV2KTsKKwkJCWhwMTAwX2NsZWFuX3R4cmluZyhkZXYpOworCQl9CisJfQorCisJLyogCisJICogUlhfUERBX1pFUk8gaXMgc2V0IHdoZW4gdGhlIFBEQSBjb3VudCBnb2VzIGZyb20gbm9uLXplcm8gdG8gemVyby4gCisJICovCisJaWYgKChscC0+bW9kZSA9PSAxKSAmJiAodmFsICYgKEhQMTAwX1JYX1BEQV9aRVJPKSkpCisJCWhwMTAwX3J4ZmlsbChkZXYpOworCisJLyogCisJICogSFAxMDBfVFhfQ09NUExFVEUgaW50ZXJydXB0IG9jY3VycyB3aGVuIHBhY2tldCB0cmFuc21pdHRlZCBvbiB3aXJlIAorCSAqIGlzIGNvbXBsZXRlZCAKKwkgKi8KKwlpZiAoKGxwLT5tb2RlID09IDEpICYmICh2YWwgJiAoSFAxMDBfVFhfQ09NUExFVEUpKSkKKwkJaHAxMDBfY2xlYW5fdHhyaW5nKGRldik7CisKKwkvKiAKKwkgKiBNSVNDX0VSUk9SIGlzIHNldCB3aGVuIGVpdGhlciB0aGUgTEFOIGxpbmsgZ29lcyBkb3duIG9yIGEgZGV0ZWN0ZWQKKwkgKiBidXMgZXJyb3Igb2NjdXJzLgorCSAqLworCWlmICh2YWwgJiBIUDEwMF9NSVNDX0VSUk9SKSB7CS8qIE5ldyBmb3IgSjI1ODVCICovCisjaWZkZWYgSFAxMDBfREVCVUdfSVJRCisJCXByaW50aworCQkgICAgKCJocDEwMDogJXM6IE1pc2MuIEVycm9yIEludGVycnVwdCAtIENoZWNrIGNhYmxpbmcuXG4iLAorCQkgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJaWYgKGxwLT5tb2RlID09IDEpIHsKKwkJCWhwMTAwX2NsZWFuX3R4cmluZyhkZXYpOworCQkJaHAxMDBfcnhmaWxsKGRldik7CisJCX0KKwkJaHAxMDBfbWlzY19pbnRlcnJ1cHQoZGV2KTsKKwl9CisKKwlzcGluX3VubG9jaygmbHAtPmxvY2spOworCWhwMTAwX2ludHNfb24oKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiAgc29tZSBtaXNjIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkIGhwMTAwX3N0YXJ0X2ludGVyZmFjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBocDEwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKyNpZmRlZiBIUDEwMF9ERUJVR19CCisJaHAxMDBfb3V0dygweDQyMjAsIFRSQUNFKTsKKwlwcmludGsoImhwMTAwOiAlczogaHAxMDBfc3RhcnRfaW50ZXJmYWNlXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCS8qIEVuc3VyZSB0aGUgYWRhcHRlciBkb2VzIG5vdCB3YW50IHRvIHJlcXVlc3QgYW4gaW50ZXJydXB0IHdoZW4gKi8KKwkvKiBlbmFibGluZyB0aGUgSVJRIGxpbmUgdG8gYmUgYWN0aXZlIG9uIHRoZSBidXMgKGkuZS4gbm90IHRyaS1zdGF0ZWQpICovCisJaHAxMDBfcGFnZShQRVJGT1JNQU5DRSk7CisJaHAxMDBfb3V0dygweGZlZmUsIElSUV9NQVNLKTsJLyogbWFzayBvZmYgYWxsIGludHMgKi8KKwlocDEwMF9vdXR3KDB4ZmZmZiwgSVJRX1NUQVRVUyk7CS8qIGFjayBhbGwgSVJRcyAqLworCWhwMTAwX291dHcoSFAxMDBfRkFLRV9JTlQgfCBIUDEwMF9JTlRfRU4gfCBIUDEwMF9SRVNFVF9MQiwKKwkJICAgT1BUSU9OX0xTVyk7CisJLyogVW4gVHJpLXN0YXRlIGludC4gVE9ETzogQ2hlY2sgaWYgc2hhcmVkIGludGVycnVwdHMgY2FuIGJlIHJlYWxpc2VkPyAqLworCWhwMTAwX291dHcoSFAxMDBfVFJJX0lOVCB8IEhQMTAwX1JFU0VUX0hCLCBPUFRJT05fTFNXKTsKKworCWlmIChscC0+bW9kZSA9PSAxKSB7CisJCS8qIE1ha2Ugc3VyZSBCTSBiaXQgaXMgc2V0Li4uICovCisJCWhwMTAwX3BhZ2UoSFdfTUFQKTsKKwkJaHAxMDBfb3JiKEhQMTAwX0JNX01BU1RFUiwgQk0pOworCQlocDEwMF9yeGZpbGwoZGV2KTsKKwl9IGVsc2UgaWYgKGxwLT5tb2RlID09IDIpIHsKKwkJLyogRW5hYmxlIG1lbW9yeSBtYXBwaW5nLiBOb3RlOiBEb24ndCBkbyB0aGlzIHdoZW4gYnVzbWFzdGVyLiAqLworCQlocDEwMF9vdXR3KEhQMTAwX01NQVBfRElTIHwgSFAxMDBfUkVTRVRfSEIsIE9QVElPTl9MU1cpOworCX0KKworCWhwMTAwX3BhZ2UoUEVSRk9STUFOQ0UpOworCWhwMTAwX291dHcoMHhmZWZlLCBJUlFfTUFTSyk7CS8qIG1hc2sgb2ZmIGFsbCBpbnRzICovCisJaHAxMDBfb3V0dygweGZmZmYsIElSUV9TVEFUVVMpOwkvKiBhY2sgSVJRICovCisKKwkvKiBlbmFibGUgYSBmZXcgaW50ZXJydXB0czogKi8KKwlpZiAobHAtPm1vZGUgPT0gMSkgewkvKiBidXNtYXN0ZXIgbW9kZSAqLworCQlocDEwMF9vdXR3KEhQMTAwX1JYX1BETF9GSUxMX0NPTVBMIHwKKwkJCSAgIEhQMTAwX1JYX1BEQV9aRVJPIHwgSFAxMDBfUlhfRVJST1IgfAorCQkJICAgLyogSFAxMDBfUlhfUEFDS0VUICAgIHwgKi8KKwkJCSAgIC8qIEhQMTAwX1JYX0VBUkxZX0lOVCB8ICAqLyBIUDEwMF9TRVRfSEIgfAorCQkJICAgLyogSFAxMDBfVFhfUERBX1pFUk8gIHwgICovCisJCQkgICBIUDEwMF9UWF9DT01QTEVURSB8CisJCQkgICAvKiBIUDEwMF9NSVNDX0VSUk9SICAgfCAgKi8KKwkJCSAgIEhQMTAwX1RYX0VSUk9SIHwgSFAxMDBfU0VUX0xCLCBJUlFfTUFTSyk7CisJfSBlbHNlIHsKKwkJaHAxMDBfb3V0dyhIUDEwMF9SWF9QQUNLRVQgfAorCQkJICAgSFAxMDBfUlhfRVJST1IgfCBIUDEwMF9TRVRfSEIgfAorCQkJICAgSFAxMDBfVFhfRVJST1IgfCBIUDEwMF9TRVRfTEIsIElSUV9NQVNLKTsKKwl9CisKKwkvKiBOb3RlIDogYmVmb3JlIGhwMTAwX3NldF9tdWx0aWNhc3RfbGlzdCgpLCBiZWNhdXNlIGl0IHdpbGwgcGxheSB3aXRoCisJICogc3BpbmxvY2sgaXRzZWxmLi4uIEplYW4gSUkgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJLyogRW5hYmxlIE1BQyBUeCBhbmQgUlgsIHNldCBNQUMgbW9kZXMsIC4uLiAqLworCWhwMTAwX3NldF9tdWx0aWNhc3RfbGlzdChkZXYpOworfQorCitzdGF0aWMgdm9pZCBocDEwMF9zdG9wX2ludGVyZmFjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBocDEwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVfaW50IHZhbDsKKworI2lmZGVmIEhQMTAwX0RFQlVHX0IKKwlwcmludGsoImhwMTAwOiAlczogaHAxMDBfc3RvcF9pbnRlcmZhY2VcbiIsIGRldi0+bmFtZSk7CisJaHAxMDBfb3V0dygweDQyMjEsIFRSQUNFKTsKKyNlbmRpZgorCisJaWYgKGxwLT5tb2RlID09IDEpCisJCWhwMTAwX0JNX3NodXRkb3duKGRldik7CisJZWxzZSB7CisJCS8qIE5vdGU6IE1NQVBfRElTIHdpbGwgYmUgcmVlbmFibGVkIGJ5IHN0YXJ0X2ludGVyZmFjZSAqLworCQlocDEwMF9vdXR3KEhQMTAwX0lOVF9FTiB8IEhQMTAwX1JFU0VUX0xCIHwKKwkJCSAgIEhQMTAwX1RSSV9JTlQgfCBIUDEwMF9NTUFQX0RJUyB8IEhQMTAwX1NFVF9IQiwKKwkJCSAgIE9QVElPTl9MU1cpOworCQl2YWwgPSBocDEwMF9pbncoT1BUSU9OX0xTVyk7CisKKwkJaHAxMDBfcGFnZShNQUNfQ1RSTCk7CisJCWhwMTAwX2FuZGIofihIUDEwMF9SWF9FTiB8IEhQMTAwX1RYX0VOKSwgTUFDX0NGR18xKTsKKworCQlpZiAoISh2YWwgJiBIUDEwMF9IV19SU1QpKQorCQkJcmV0dXJuOwkvKiBJZiByZXNldCwgaW1tLiByZXR1cm4gLi4uICovCisJCS8qIC4uLiBlbHNlOiBidXN5IHdhaXQgdW50aWwgaWRsZSAqLworCQlmb3IgKHZhbCA9IDA7IHZhbCA8IDYwMDA7IHZhbCsrKQorCQkJaWYgKChocDEwMF9pbmIoTUFDX0NGR18xKSAmIChIUDEwMF9UWF9JRExFIHwgSFAxMDBfUlhfSURMRSkpID09IChIUDEwMF9UWF9JRExFIHwgSFAxMDBfUlhfSURMRSkpIHsKKwkJCQlocDEwMF9wYWdlKFBFUkZPUk1BTkNFKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCXByaW50aygiaHAxMDA6ICVzOiBocDEwMF9zdG9wX2ludGVyZmFjZSAtIHRpbWVvdXRcbiIsIGRldi0+bmFtZSk7CisJCWhwMTAwX3BhZ2UoUEVSRk9STUFOQ0UpOworCX0KK30KKworc3RhdGljIHZvaWQgaHAxMDBfbG9hZF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9zaG9ydCBwcm9iZV9pb2FkZHIpCit7CisJaW50IGk7CisJaW50IGlvYWRkciA9IHByb2JlX2lvYWRkciA+IDAgPyBwcm9iZV9pb2FkZHIgOiBkZXYtPmJhc2VfYWRkcjsKKworI2lmZGVmIEhQMTAwX0RFQlVHX0IKKwlocDEwMF9vdXR3KDB4NDIyMiwgVFJBQ0UpOworI2VuZGlmCisKKwlocDEwMF9wYWdlKEVFUFJPTV9DVFJMKTsKKwlocDEwMF9hbmR3KH5IUDEwMF9FRVBST01fTE9BRCwgRUVQUk9NX0NUUkwpOworCWhwMTAwX29ydyhIUDEwMF9FRVBST01fTE9BRCwgRUVQUk9NX0NUUkwpOworCWZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKQorCQlpZiAoIShocDEwMF9pbmIoT1BUSU9OX01TVykgJiBIUDEwMF9FRV9MT0FEKSkKKwkJCXJldHVybjsKKwlwcmludGsoImhwMTAwOiAlczogaHAxMDBfbG9hZF9lZXByb20gLSB0aW1lb3V0XG4iLCBkZXYtPm5hbWUpOworfQorCisvKiAgU2Vuc2UgY29ubmVjdGlvbiBzdGF0dXMuCisgKiAgcmV0dXJuIHZhbHVlczogTEFOXzEwICAtIENvbm5lY3RlZCB0byAxME1iaXQvcyBuZXR3b3JrCisgKiAgICAgICAgICAgICAgICAgTEFOXzEwMCAtIENvbm5lY3RlZCB0byAxMDBNYml0L3MgbmV0d29yaworICogICAgICAgICAgICAgICAgIExBTl9FUlIgLSBub3QgY29ubmVjdGVkIG9yIDEwME1iaXQvcyBIdWIgZG93bgorICovCitzdGF0aWMgaW50IGhwMTAwX3NlbnNlX2xhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1X3Nob3J0IHZhbF9WRywgdmFsXzEwOworCXN0cnVjdCBocDEwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKyNpZmRlZiBIUDEwMF9ERUJVR19CCisJaHAxMDBfb3V0dygweDQyMjMsIFRSQUNFKTsKKyNlbmRpZgorCisJaHAxMDBfcGFnZShNQUNfQ1RSTCk7CisJdmFsXzEwID0gaHAxMDBfaW5iKDEwX0xBTl9DRkdfMSk7CisJdmFsX1ZHID0gaHAxMDBfaW5iKFZHX0xBTl9DRkdfMSk7CisJaHAxMDBfcGFnZShQRVJGT1JNQU5DRSk7CisjaWZkZWYgSFAxMDBfREVCVUcKKwlwcmludGsoImhwMTAwOiAlczogc2Vuc2VfbGFuOiB2YWxfVkcgPSAweCUwNHgsIHZhbF8xMCA9IDB4JTA0eFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCB2YWxfVkcsIHZhbF8xMCk7CisjZW5kaWYKKworCWlmICh2YWxfMTAgJiBIUDEwMF9MSU5LX0JFQVRfU1QpCS8qIDEwTWIgY29ubmVjdGlvbiBpcyBhY3RpdmUgKi8KKwkJcmV0dXJuIEhQMTAwX0xBTl8xMDsKKworCWlmICh2YWxfMTAgJiBIUDEwMF9BVUlfU1QpIHsJLyogaGF2ZSB3ZSBCTkMgb3IgQVVJIG9uYm9hcmQ/ICovCisJCS8qCisJCSAqIFRoaXMgY2FuIGJlIG92ZXJyaWRlbiBieSBkb3MgdXRpbGl0eSwgc28gaWYgdGhpcyBoYXMgbm8gZWZmZWN0LAorCQkgKiBwZXJoYXBzIHlvdSBuZWVkIHRvIGRvd25sb2FkIHRoYXQgdXRpbGl0eSBmcm9tIEhQIGFuZCBzZXQgY2FyZAorCQkgKiBiYWNrIHRvICJhdXRvIGRldGVjdCIuCisJCSAqLworCQl2YWxfMTAgfD0gSFAxMDBfQVVJX1NFTCB8IEhQMTAwX0xPV19USDsKKwkJaHAxMDBfcGFnZShNQUNfQ1RSTCk7CisJCWhwMTAwX291dGIodmFsXzEwLCAxMF9MQU5fQ0ZHXzEpOworCQlocDEwMF9wYWdlKFBFUkZPUk1BTkNFKTsKKwkJcmV0dXJuIEhQMTAwX0xBTl9DT0FYOworCX0KKworCS8qIFRob3NlIGNhcmRzIGRvbid0IGhhdmUgYSAxMDAgTWJpdCBjb25uZWN0b3IgKi8KKwlpZiAoICFzdHJjbXAobHAtPmlkLCAiSFdQMTkyMCIpICB8fAorCSAgICAgKGxwLT5wY2lfZGV2ICYmIAorCSAgICAgIGxwLT5wY2lfZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRCAmJiAKKwkgICAgICAobHAtPnBjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0hQX0oyOTcwQSB8fAorCSAgICAgICBscC0+cGNpX2Rldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSFBfSjI5NzNBKSkpCisJCXJldHVybiBIUDEwMF9MQU5fRVJSOworCQorCWlmICh2YWxfVkcgJiBIUDEwMF9MSU5LX0NBQkxFX1NUKQkvKiBDYW4gaGVhciB0aGUgSFVCcyB0b25lLiAqLworCQlyZXR1cm4gSFAxMDBfTEFOXzEwMDsKKwlyZXR1cm4gSFAxMDBfTEFOX0VSUjsKK30KKworc3RhdGljIGludCBocDEwMF9kb3duX3ZnX2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIHRpbWU7CisJbG9uZyBzYXZlbGFuLCBuZXdsYW47CisKKyNpZmRlZiBIUDEwMF9ERUJVR19CCisJaHAxMDBfb3V0dygweDQyMjQsIFRSQUNFKTsKKwlwcmludGsoImhwMTAwOiAlczogZG93bl92Z19saW5rXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlocDEwMF9wYWdlKE1BQ19DVFJMKTsKKwl0aW1lID0gamlmZmllcyArIChIWiAvIDQpOworCWRvIHsKKwkJaWYgKGhwMTAwX2luYihWR19MQU5fQ0ZHXzEpICYgSFAxMDBfTElOS19DQUJMRV9TVCkKKwkJCWJyZWFrOworCQlpZiAoIWluX2ludGVycnVwdCgpKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJfQorCX0gd2hpbGUgKHRpbWVfYWZ0ZXIodGltZSwgamlmZmllcykpOworCisJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdGltZSkpCS8qIG5vIHNpZ25hbC0+bm8gbG9nb3V0ICovCisJCXJldHVybiAwOworCisJLyogRHJvcCB0aGUgVkcgTGluayBieSBjbGVhcmluZyB0aGUgbGluayB1cCBjbWQgYW5kIGxvYWQgYWRkci4gKi8KKworCWhwMTAwX2FuZGIofihIUDEwMF9MT0FEX0FERFIgfCBIUDEwMF9MSU5LX0NNRCksIFZHX0xBTl9DRkdfMSk7CisJaHAxMDBfb3JiKEhQMTAwX1ZHX1NFTCwgVkdfTEFOX0NGR18xKTsKKworCS8qIENvbmRpdGlvbmFsbHkgc3RhbGwgZm9yID4yNTBtcyBvbiBMaW5rLVVwIFN0YXR1cyAodG8gZ28gZG93bikgKi8KKwl0aW1lID0gamlmZmllcyArIChIWiAvIDIpOworCWRvIHsKKwkJaWYgKCEoaHAxMDBfaW5iKFZHX0xBTl9DRkdfMSkgJiBIUDEwMF9MSU5LX1VQX1NUKSkKKwkJCWJyZWFrOworCQlpZiAoIWluX2ludGVycnVwdCgpKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJfQorCX0gd2hpbGUgKHRpbWVfYWZ0ZXIodGltZSwgamlmZmllcykpOworCisjaWZkZWYgSFAxMDBfREVCVUcKKwlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lKSkKKwkJcHJpbnRrKCJocDEwMDogJXM6IGRvd25fdmdfbGluazogTGluayBkb2VzIG5vdCBnbyBkb3duP1xuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogVG8gcHJldmVudCBjb25kaXRpb24gd2hlcmUgUmV2IDEgVkcgTUFDIGFuZCBvbGQgaHVicyBkbyBub3QgY29tcGxldGUgKi8KKwkvKiBsb2dvdXQgdW5kZXIgdHJhZmZpYyAoZXZlbiB0aG91Z2ggYWxsIHRoZSBzdGF0dXMgYml0cyBhcmUgY2xlYXJlZCksICAqLworCS8qIGRvIHRoaXMgd29ya2Fyb3VuZCB0byBnZXQgdGhlIFJldiAxIE1BQyBpbiBpdHMgaWRsZSBzdGF0ZSAqLworCWlmIChscC0+Y2hpcCA9PSBIUDEwMF9DSElQSURfTEFTU0VOKSB7CisJCS8qIFJlc2V0IFZHIE1BQyB0byBpbnN1cmUgaXQgbGVhdmVzIHRoZSBsb2dvZmYgc3RhdGUgZXZlbiBpZiAqLworCQkvKiB0aGUgSHViIGlzIHN0aWxsIGVtaXR0aW5nIHRvbmVzICovCisJCWhwMTAwX2FuZGIofkhQMTAwX1ZHX1JFU0VULCBWR19MQU5fQ0ZHXzEpOworCQl1ZGVsYXkoMTUwMCk7CS8qIHdhaXQgZm9yID4xbXMgKi8KKwkJaHAxMDBfb3JiKEhQMTAwX1ZHX1JFU0VULCBWR19MQU5fQ0ZHXzEpOwkvKiBSZWxlYXNlIFJlc2V0ICovCisJCXVkZWxheSgxNTAwKTsKKwl9CisKKwkvKiBOZXc6IEZvciBsYXNzZW4sIHN3aXRjaCB0byAxMCBNYnBzIG1hYyBicmllZmx5IHRvIGNsZWFyIHRyYWluaW5nIEFDSyAqLworCS8qIHRvIGdldCB0aGUgVkcgbWFjIHRvIGZ1bGwgcmVzZXQuIFRoaXMgaXMgbm90IHJlcS5kIHdpdGggbGF0ZXIgY2hpcHMgKi8KKwkvKiBOb3RlOiBJdCB3aWxsIHRha2UgdGhlIGJldHdlZW4gMSBhbmQgMiBzZWNvbmRzIGZvciB0aGUgVkcgbWFjIHRvIGJlICovCisJLyogc2VsZWN0ZWQgYWdhaW4hIFRoaXMgd2lsbCBiZSBsZWZ0IHRvIHRoZSBjb25uZWN0IGh1YiBmdW5jdGlvbiB0byAqLworCS8qIHBlcmZvcm0gaWYgZGVzaXJlZC4gICovCisJaWYgKGxwLT5jaGlwID09IEhQMTAwX0NISVBJRF9MQVNTRU4pIHsKKwkJLyogSGF2ZSB0byB3cml0ZSB0byAxMCBhbmQgMTAwVkcgY29udHJvbCByZWdpc3RlcnMgc2ltdWx0YW5lb3VzbHkgKi8KKwkJc2F2ZWxhbiA9IG5ld2xhbiA9IGhwMTAwX2lubCgxMF9MQU5fQ0ZHXzEpOwkvKiByZWFkIDEwKzEwMCBMQU5fQ0ZHIHJlZ3MgKi8KKwkJbmV3bGFuICY9IH4oSFAxMDBfVkdfU0VMIDw8IDE2KTsKKwkJbmV3bGFuIHw9IChIUDEwMF9ET1QzX01BQykgPDwgODsKKwkJaHAxMDBfYW5kYih+SFAxMDBfQVVUT19NT0RFLCBNQUNfQ0ZHXzMpOwkvKiBBdXRvc2VsIG9mZiAqLworCQlocDEwMF9vdXRsKG5ld2xhbiwgMTBfTEFOX0NGR18xKTsKKworCQkvKiBDb25kaXRpb25hbGx5IHN0YWxsIGZvciA1c2VjIG9uIFZHIHNlbGVjdGVkLiAqLworCQl0aW1lID0gamlmZmllcyArIChIWiAqIDUpOworCQlkbyB7CisJCQlpZiAoIShocDEwMF9pbmIoTUFDX0NGR180KSAmIEhQMTAwX01BQ19TRUxfU1QpKQorCQkJCWJyZWFrOworCQkJaWYgKCFpbl9pbnRlcnJ1cHQoKSkgeworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJCX0KKwkJfSB3aGlsZSAodGltZV9hZnRlcih0aW1lLCBqaWZmaWVzKSk7CisKKwkJaHAxMDBfb3JiKEhQMTAwX0FVVE9fTU9ERSwgTUFDX0NGR18zKTsJLyogQXV0b3NlbCBiYWNrIG9uICovCisJCWhwMTAwX291dGwoc2F2ZWxhbiwgMTBfTEFOX0NGR18xKTsKKwl9CisKKwl0aW1lID0gamlmZmllcyArICgzICogSFopOwkvKiBUaW1lb3V0IDNzICovCisJZG8geworCQlpZiAoKGhwMTAwX2luYihWR19MQU5fQ0ZHXzEpICYgSFAxMDBfTElOS19DQUJMRV9TVCkgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoIWluX2ludGVycnVwdCgpKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwkJfQorCX0gd2hpbGUgKHRpbWVfYWZ0ZXIodGltZSwgamlmZmllcykpOworCisJaWYgKHRpbWVfYmVmb3JlX2VxKHRpbWUsIGppZmZpZXMpKSB7CisjaWZkZWYgSFAxMDBfREVCVUcKKwkJcHJpbnRrKCJocDEwMDogJXM6IGRvd25fdmdfbGluazogdGltZW91dFxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQlyZXR1cm4gLUVJTzsKKwl9CisKKwl0aW1lID0gamlmZmllcyArICgyICogSFopOwkvKiBUaGlzIHNlZW1zIHRvIHRha2UgYSB3aGlsZS4uLi4gKi8KKwlkbyB7CisJCWlmICghaW5faW50ZXJydXB0KCkpIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQl9CisJfSB3aGlsZSAodGltZV9hZnRlcih0aW1lLCBqaWZmaWVzKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBocDEwMF9sb2dpbl90b192Z19odWIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9zaG9ydCBmb3JjZV9yZWxvZ2luKQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVfc2hvcnQgdmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIHRpbWU7CisJaW50IHN0YXJ0c3Q7CisKKyNpZmRlZiBIUDEwMF9ERUJVR19CCisJaHAxMDBfb3V0dygweDQyMjUsIFRSQUNFKTsKKwlwcmludGsoImhwMTAwOiAlczogbG9naW5fdG9fdmdfaHViXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwkvKiBJbml0aWF0ZSBhIGxvZ2luIHNlcXVlbmNlIGlmZiBWRyBNQUMgaXMgZW5hYmxlZCBhbmQgZWl0aGVyIExvYWQgQWRkcmVzcworCSAqIGJpdCBpcyB6ZXJvIG9yIHRoZSBmb3JjZSByZWxvZ2luIGZsYWcgaXMgc2V0IChlLmcuIGR1ZSB0byBNQUMgYWRkcmVzcyBvcgorCSAqIHByb21pc2N1b3VzIG1vZGUgY2hhbmdlKQorCSAqLworCWhwMTAwX3BhZ2UoTUFDX0NUUkwpOworCXN0YXJ0c3QgPSBocDEwMF9pbmIoVkdfTEFOX0NGR18xKTsKKwlpZiAoKGZvcmNlX3JlbG9naW4gPT0gMSkgfHwgKGhwMTAwX2luYihNQUNfQ0ZHXzQpICYgSFAxMDBfTUFDX1NFTF9TVCkpIHsKKyNpZmRlZiBIUDEwMF9ERUJVR19UUkFJTklORworCQlwcmludGsoImhwMTAwOiAlczogU3RhcnQgdHJhaW5pbmdcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCQkvKiBFbnN1cmUgVkcgUmVzZXQgYml0IGlzIDEgKGkuZS4sIGRvIG5vdCByZXNldCkgKi8KKwkJaHAxMDBfb3JiKEhQMTAwX1ZHX1JFU0VULCBWR19MQU5fQ0ZHXzEpOworCisJCS8qIElmIExhc3NlbiBBTkQgYXV0by1zZWxlY3QtbW9kZSBBTkQgVkcgdG9uZXMgd2VyZSBzZW5zZWQgb24gKi8KKwkJLyogZW50cnkgdGhlbiB0ZW1wb3JhcmlseSBwdXQgdGhlbSBpbnRvIGZvcmNlIDEwME1iaXQgbW9kZSAqLworCQlpZiAoKGxwLT5jaGlwID09IEhQMTAwX0NISVBJRF9MQVNTRU4pICYmIChzdGFydHN0ICYgSFAxMDBfTElOS19DQUJMRV9TVCkpCisJCQlocDEwMF9hbmRiKH5IUDEwMF9ET1QzX01BQywgMTBfTEFOX0NGR18yKTsKKworCQkvKiBEcm9wIHRoZSBWRyBsaW5rIGJ5IHplcm9pbmcgTGluayBVcCBDb21tYW5kIGFuZCBMb2FkIEFkZHJlc3MgICovCisJCWhwMTAwX2FuZGIofihIUDEwMF9MSU5LX0NNRCAvKiB8SFAxMDBfTE9BRF9BRERSICovICksIFZHX0xBTl9DRkdfMSk7CisKKyNpZmRlZiBIUDEwMF9ERUJVR19UUkFJTklORworCQlwcmludGsoImhwMTAwOiAlczogQnJpbmcgZG93biB0aGUgbGlua1xuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJCS8qIFdhaXQgZm9yIGxpbmsgdG8gZHJvcCAqLworCQl0aW1lID0gamlmZmllcyArIChIWiAvIDEwKTsKKwkJZG8geworCQkJaWYgKH4oaHAxMDBfaW5iKFZHX0xBTl9DRkdfMSkgJiBIUDEwMF9MSU5LX1VQX1NUKSkKKwkJCQlicmVhazsKKwkJCWlmICghaW5faW50ZXJydXB0KCkpIHsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCQl9CisJCX0gd2hpbGUgKHRpbWVfYWZ0ZXIodGltZSwgamlmZmllcykpOworCisJCS8qIFN0YXJ0IGFuIGFkZHJlc3NlZCB0cmFpbmluZyBhbmQgb3B0aW9uYWxseSByZXF1ZXN0IHByb21pc2N1b3VzIHBvcnQgKi8KKwkJaWYgKChkZXYtPmZsYWdzKSAmIElGRl9QUk9NSVNDKSB7CisJCQlocDEwMF9vcmIoSFAxMDBfUFJPTV9NT0RFLCBWR19MQU5fQ0ZHXzIpOworCQkJaWYgKGxwLT5jaGlwID09IEhQMTAwX0NISVBJRF9MQVNTRU4pCisJCQkJaHAxMDBfb3J3KEhQMTAwX01BQ1JRX1BST01TQywgVFJBSU5fUkVRVUVTVCk7CisJCX0gZWxzZSB7CisJCQlocDEwMF9hbmRiKH5IUDEwMF9QUk9NX01PREUsIFZHX0xBTl9DRkdfMik7CisJCQkvKiBGb3IgRVRSIHBhcnRzIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHByb20uIGJpdCBpbiB0aGUgdHJhaW5pbmcKKwkJCSAqIHJlZ2lzdGVyLCBvdGhlcndpc2UgcHJvbWlzY2lvdXMgbW9kZSB3b24ndCBiZSBkaXNhYmxlZC4KKwkJCSAqLworCQkJaWYgKGxwLT5jaGlwID09IEhQMTAwX0NISVBJRF9MQVNTRU4pIHsKKwkJCQlocDEwMF9hbmR3KH5IUDEwMF9NQUNSUV9QUk9NU0MsIFRSQUlOX1JFUVVFU1QpOworCQkJfQorCQl9CisKKwkJLyogV2l0aCBFVFIgcGFydHMsIGZyYW1lIGZvcm1hdCByZXF1ZXN0IGJpdHMgY2FuIGJlIHNldC4gKi8KKwkJaWYgKGxwLT5jaGlwID09IEhQMTAwX0NISVBJRF9MQVNTRU4pCisJCQlocDEwMF9vcmIoSFAxMDBfTUFDUlFfRlJBTUVGTVRfRUlUSEVSLCBUUkFJTl9SRVFVRVNUKTsKKworCQlocDEwMF9vcmIoSFAxMDBfTElOS19DTUQgfCBIUDEwMF9MT0FEX0FERFIgfCBIUDEwMF9WR19SRVNFVCwgVkdfTEFOX0NGR18xKTsKKworCQkvKiBOb3RlOiBOZXh0IHdhaXQgY291bGQgYmUgb21pdHRlZCBmb3IgSG9vZCBhbmQgZWFybGllciBjaGlwcyB1bmRlciAqLworCQkvKiBjZXJ0YWluIGNpcmN1bXN0YW5jZXMgKi8KKwkJLyogVE9ETzogY2hlY2sgaWYgaG9vZC9lYXJsaWVyIGFuZCBza2lwIHdhaXQuICovCisKKwkJLyogV2FpdCBmb3IgZWl0aGVyIHNob3J0IHRpbWVvdXQgZm9yIFZHIHRvbmVzIG9yIGxvbmcgZm9yIGxvZ2luICAgICovCisJCS8qIFdhaXQgZm9yIHRoZSBjYXJkIGhhcmR3YXJlIHRvIHNpZ25hbGlzZSBsaW5rIGNhYmxlIHN0YXR1cyBvay4uLiAqLworCQlocDEwMF9wYWdlKE1BQ19DVFJMKTsKKwkJdGltZSA9IGppZmZpZXMgKyAoMSAqIEhaKTsJLyogMSBzZWMgdGltZW91dCBmb3IgY2FibGUgc3QgKi8KKwkJZG8geworCQkJaWYgKGhwMTAwX2luYihWR19MQU5fQ0ZHXzEpICYgSFAxMDBfTElOS19DQUJMRV9TVCkKKwkJCQlicmVhazsKKwkJCWlmICghaW5faW50ZXJydXB0KCkpIHsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCQl9CisJCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWUpKTsKKworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lKSkgeworI2lmZGVmIEhQMTAwX0RFQlVHX1RSQUlOSU5HCisJCQlwcmludGsoImhwMTAwOiAlczogTGluayBjYWJsZSBzdGF0dXMgbm90IG9rPyBUcmFpbmluZyBhYm9ydGVkLlxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQl9IGVsc2UgeworI2lmZGVmIEhQMTAwX0RFQlVHX1RSQUlOSU5HCisJCQlwcmludGsKKwkJCSAgICAoImhwMTAwOiAlczogSFVCIHRvbmVzIGRldGVjdGVkLiBUcnlpbmcgdG8gdHJhaW4uXG4iLAorCQkJICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisKKwkJCXRpbWUgPSBqaWZmaWVzICsgKDIgKiBIWik7CS8qIGFnYWluIGEgdGltZW91dCAqLworCQkJZG8geworCQkJCXZhbCA9IGhwMTAwX2luYihWR19MQU5fQ0ZHXzEpOworCQkJCWlmICgodmFsICYgKEhQMTAwX0xJTktfVVBfU1QpKSkgeworI2lmZGVmIEhQMTAwX0RFQlVHX1RSQUlOSU5HCisJCQkJCXByaW50aygiaHAxMDA6ICVzOiBQYXNzZWQgdHJhaW5pbmcuXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAoIWluX2ludGVycnVwdCgpKSB7CisJCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCQkJfQorCQkJfSB3aGlsZSAodGltZV9hZnRlcih0aW1lLCBqaWZmaWVzKSk7CisJCX0KKworCQkvKiBJZiBMSU5LX1VQX1NUIGlzIHNldCwgdGhlbiB3ZSBhcmUgbG9nZ2VkIGludG8gdGhlIGh1Yi4gKi8KKwkJaWYgKHRpbWVfYmVmb3JlX2VxKGppZmZpZXMsIHRpbWUpICYmICh2YWwgJiBIUDEwMF9MSU5LX1VQX1NUKSkgeworI2lmZGVmIEhQMTAwX0RFQlVHX1RSQUlOSU5HCisJCQlwcmludGsoImhwMTAwOiAlczogU3VjY2Vzc2Z1bGx5IGxvZ2dlZCBpbnRvIHRoZSBIVUIuXG4iLCBkZXYtPm5hbWUpOworCQkJaWYgKGxwLT5jaGlwID09IEhQMTAwX0NISVBJRF9MQVNTRU4pIHsKKwkJCQl2YWwgPSBocDEwMF9pbncoVFJBSU5fQUxMT1cpOworCQkJCXByaW50aygiaHAxMDA6ICVzOiBDYXJkIHN1cHBvcnRzIDEwMFZHIE1BQyBWZXJzaW9uIFwiJXNcIiAiLAorCQkJCQkgICAgIGRldi0+bmFtZSwgKGhwMTAwX2ludyhUUkFJTl9SRVFVRVNUKSAmIEhQMTAwX0NBUkRfTUFDVkVSKSA/ICI4MDIuMTIiIDogIlByZSIpOworCQkJCXByaW50aygiRHJpdmVyIHdpbGwgdXNlIE1BQyBWZXJzaW9uIFwiJXNcIlxuIiwgKHZhbCAmIEhQMTAwX0hVQl9NQUNWRVIpID8gIjgwMi4xMiIgOiAiUHJlIik7CisJCQkJcHJpbnRrKCJocDEwMDogJXM6IEZyYW1lIGZvcm1hdCBpcyAlcy5cbiIsIGRldi0+bmFtZSwgKHZhbCAmIEhQMTAwX01BTExPV19GUkFNRUZNVCkgPyAiODAyLjUiIDogIjgwMi4zIik7CisJCQl9CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCS8qIElmIExJTktfVVBfU1QgaXMgbm90IHNldCwgbG9naW4gd2FzIG5vdCBzdWNjZXNzZnVsICovCisJCQlwcmludGsoImhwMTAwOiAlczogUHJvYmxlbSBsb2dnaW5nIGludG8gdGhlIEhVQi5cbiIsIGRldi0+bmFtZSk7CisJCQlpZiAobHAtPmNoaXAgPT0gSFAxMDBfQ0hJUElEX0xBU1NFTikgeworCQkJCS8qIENoZWNrIGFsbG93ZWQgUmVnaXN0ZXIgdG8gZmluZCBvdXQgd2h5IHRoZXJlIGlzIGEgcHJvYmxlbS4gKi8KKwkJCQl2YWwgPSBocDEwMF9pbncoVFJBSU5fQUxMT1cpOwkvKiB3b24ndCB3b3JrIG9uIG5vbi1FVFIgY2FyZCAqLworI2lmZGVmIEhQMTAwX0RFQlVHX1RSQUlOSU5HCisJCQkJcHJpbnRrKCJocDEwMDogJXM6IE1BQyBDb25maWd1cmF0aW9uIHJlcXVlc3RlZDogMHglMDR4LCBIVUIgYWxsb3dlZDogMHglMDR4XG4iLCBkZXYtPm5hbWUsIGhwMTAwX2ludyhUUkFJTl9SRVFVRVNUKSwgdmFsKTsKKyNlbmRpZgorCQkJCWlmICh2YWwgJiBIUDEwMF9NQUxMT1dfQUNDREVOSUVEKQorCQkJCQlwcmludGsoImhwMTAwOiAlczogSFVCIGFjY2VzcyBkZW5pZWQuXG4iLCBkZXYtPm5hbWUpOworCQkJCWlmICh2YWwgJiBIUDEwMF9NQUxMT1dfQ09ORklHVVJFKQorCQkJCQlwcmludGsoImhwMTAwOiAlczogTUFDIENvbmZpZ3VyYXRpb24gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIE5ldHdvcmsuXG4iLCBkZXYtPm5hbWUpOworCQkJCWlmICh2YWwgJiBIUDEwMF9NQUxMT1dfRFVQQUREUikKKwkJCQkJcHJpbnRrKCJocDEwMDogJXM6IER1cGxpY2F0ZSBNQUMgQWRkcmVzcyBvbiB0aGUgTmV0d29yay5cbiIsIGRldi0+bmFtZSk7CisJCQl9CisJCX0KKworCQkvKiBJZiB3ZSBoYXZlIHB1dCB0aGUgY2hpcCBpbnRvIGZvcmNlZCAxMDAgTWJpdCBtb2RlIGVhcmxpZXIsIGdvIGJhY2sgKi8KKwkJLyogdG8gYXV0by1zZWxlY3QgbW9kZSAqLworCisJCWlmICgobHAtPmNoaXAgPT0gSFAxMDBfQ0hJUElEX0xBU1NFTikgJiYgKHN0YXJ0c3QgJiBIUDEwMF9MSU5LX0NBQkxFX1NUKSkgeworCQkJaHAxMDBfcGFnZShNQUNfQ1RSTCk7CisJCQlocDEwMF9vcmIoSFAxMDBfRE9UM19NQUMsIDEwX0xBTl9DRkdfMik7CisJCX0KKworCQl2YWwgPSBocDEwMF9pbmIoVkdfTEFOX0NGR18xKTsKKworCQkvKiBDbGVhciB0aGUgTUlTQ19FUlJPUiBJbnRlcnJ1cHQsIHdoaWNoIG1pZ2h0IGJlIGdlbmVyYXRlZCB3aGVuIGRvaW5nIHRoZSByZWxvZ2luICovCisJCWhwMTAwX3BhZ2UoUEVSRk9STUFOQ0UpOworCQlocDEwMF9vdXR3KEhQMTAwX01JU0NfRVJST1IsIElSUV9TVEFUVVMpOworCisJCWlmICh2YWwgJiBIUDEwMF9MSU5LX1VQX1NUKQorCQkJcmV0dXJuICgwKTsJLyogbG9naW4gd2FzIG9rICovCisJCWVsc2UgeworCQkJcHJpbnRrKCJocDEwMDogJXM6IFRyYWluaW5nIGZhaWxlZC5cbiIsIGRldi0+bmFtZSk7CisJCQlocDEwMF9kb3duX3ZnX2xpbmsoZGV2KTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCS8qIG5vIGZvcmNlZCByZWxvZ2luICYgYWxyZWFkeSBsaW5rIHRoZXJlLT5ubyB0cmFpbmluZy4gKi8KKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIHZvaWQgaHAxMDBfY2FzY2FkZV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X3Nob3J0IGVuYWJsZSkKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGhwMTAwX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworI2lmZGVmIEhQMTAwX0RFQlVHX0IKKwlocDEwMF9vdXR3KDB4NDIyNiwgVFJBQ0UpOworCXByaW50aygiaHAxMDA6ICVzOiBjYXNjYWRlX3Jlc2V0XG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlpZiAoZW5hYmxlKSB7CisJCWhwMTAwX291dHcoSFAxMDBfSFdfUlNUIHwgSFAxMDBfUkVTRVRfTEIsIE9QVElPTl9MU1cpOworCQlpZiAobHAtPmNoaXAgPT0gSFAxMDBfQ0hJUElEX0xBU1NFTikgeworCQkJLyogTGFzc2VuIHJlcXVpcmVzIGEgUENJIHRyYW5zbWl0IGZpZm8gcmVzZXQgKi8KKwkJCWhwMTAwX3BhZ2UoSFdfTUFQKTsKKwkJCWhwMTAwX2FuZGIofkhQMTAwX1BDSV9SRVNFVCwgUENJQ1RSTDIpOworCQkJaHAxMDBfb3JiKEhQMTAwX1BDSV9SRVNFVCwgUENJQ1RSTDIpOworCQkJLyogV2FpdCBmb3IgbWluLiAzMDAgbnMgKi8KKwkJCS8qIHdlIGNhbid0IHVzZSBqaWZmaWVzIGhlcmUsIGJlY2F1c2UgaXQgbWF5IGJlICovCisJCQkvKiB0aGF0IHdlIGhhdmUgZGlzYWJsZWQgdGhlIHRpbWVyLi4uICovCisJCQl1ZGVsYXkoNDAwKTsKKwkJCWhwMTAwX2FuZGIofkhQMTAwX1BDSV9SRVNFVCwgUENJQ1RSTDIpOworCQkJaHAxMDBfcGFnZShQRVJGT1JNQU5DRSk7CisJCX0KKwl9IGVsc2UgewkJLyogYnJpbmcgb3V0IG9mIHJlc2V0ICovCisJCWhwMTAwX291dHcoSFAxMDBfSFdfUlNUIHwgSFAxMDBfU0VUX0xCLCBPUFRJT05fTFNXKTsKKwkJdWRlbGF5KDQwMCk7CisJCWhwMTAwX3BhZ2UoUEVSRk9STUFOQ0UpOworCX0KK30KKworI2lmZGVmIEhQMTAwX0RFQlVHCit2b2lkIGhwMTAwX1JlZ2lzdGVyRHVtcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgUGFnZTsKKwlpbnQgUmVnaXN0ZXI7CisKKwkvKiBEdW1wIGNvbW1vbiByZWdpc3RlcnMgKi8KKwlwcmludGsoImhwMTAwOiAlczogQ2FzY2FkZSBSZWdpc3RlciBEdW1wXG4iLCBkZXYtPm5hbWUpOworCXByaW50aygiaGFyZHdhcmUgaWQgIzE6IDB4JS4yeFxuIiwgaHAxMDBfaW5iKEhXX0lEKSk7CisJcHJpbnRrKCJoYXJkd2FyZSBpZCAjMi9wYWdpbmc6IDB4JS4yeFxuIiwgaHAxMDBfaW5iKFBBR0lORykpOworCXByaW50aygib3B0aW9uICMxOiAweCUuNHhcbiIsIGhwMTAwX2ludyhPUFRJT05fTFNXKSk7CisJcHJpbnRrKCJvcHRpb24gIzI6IDB4JS40eFxuIiwgaHAxMDBfaW53KE9QVElPTl9NU1cpKTsKKworCS8qIER1bXAgcGFnZWQgcmVnaXN0ZXJzICovCisJZm9yIChQYWdlID0gMDsgUGFnZSA8IDg7IFBhZ2UrKykgeworCQkvKiBEdW1wIHJlZ2lzdGVycyAqLworCQlwcmludGsoInBhZ2U6IDB4JS4yeFxuIiwgUGFnZSk7CisJCW91dHcoUGFnZSwgaW9hZGRyICsgMHgwMik7CisJCWZvciAoUmVnaXN0ZXIgPSAweDg7IFJlZ2lzdGVyIDwgMHgyMjsgUmVnaXN0ZXIgKz0gMikgeworCQkJLyogRGlzcGxheSBSZWdpc3RlciBjb250ZW50cyBleGNlcHQgZGF0YSBwb3J0ICovCisJCQlpZiAoKChSZWdpc3RlciAhPSAweDEwKSAmJiAoUmVnaXN0ZXIgIT0gMHgxMikpIHx8IChQYWdlID4gMCkpIHsKKwkJCQlwcmludGsoIjB4JS4yeCA9IDB4JS40eFxuIiwgUmVnaXN0ZXIsIGludyhpb2FkZHIgKyBSZWdpc3RlcikpOworCQkJfQorCQl9CisJfQorCWhwMTAwX3BhZ2UoUEVSRk9STUFOQ0UpOworfQorI2VuZGlmCisKKworc3RhdGljIHZvaWQgY2xlYW51cF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmQpCit7CisJc3RydWN0IGhwMTAwX3ByaXZhdGUgKnAgPSBuZXRkZXZfcHJpdihkKTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGQpOworCXJlbGVhc2VfcmVnaW9uKGQtPmJhc2VfYWRkciwgSFAxMDBfUkVHSU9OX1NJWkUpOworCisJaWYgKHAtPm1vZGUgPT0gMSkJLyogYnVzbWFzdGVyICovCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocC0+cGNpX2RldiwgTUFYX1JJTkdTSVpFICsgMHgwZiwgCisJCQkJICAgIHAtPnBhZ2VfdmFkZHJfYWxnbiwgCisJCQkJICAgIHZpcnRfdG9fd2hhdGV2ZXIoZCwgcC0+cGFnZV92YWRkcl9hbGduKSk7CisJaWYgKHAtPm1lbV9wdHJfdmlydCkKKwkJaW91bm1hcChwLT5tZW1fcHRyX3ZpcnQpOworCisJZnJlZV9uZXRkZXYoZCk7Cit9CisKKyNpZmRlZiBDT05GSUdfRUlTQQorc3RhdGljIGludCBfX2luaXQgaHAxMDBfZWlzYV9wcm9iZSAoc3RydWN0IGRldmljZSAqZ2VuZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGhwMTAwX3ByaXZhdGUpKTsKKwlzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVkZXYgPSB0b19laXNhX2RldmljZShnZW5kZXYpOworCWludCBlcnI7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmZWRldi0+ZGV2KTsKKworCWVyciA9IGhwMTAwX3Byb2JlMShkZXYsIGVkZXYtPmJhc2VfYWRkciArIDB4QzM4LCBIUDEwMF9CVVNfRUlTQSwgTlVMTCk7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQyOworCQorI2lmZGVmIEhQMTAwX0RFQlVHCisJcHJpbnRrKCJocDEwMDogJXM6IEVJU0EgYWRhcHRlciBmb3VuZCBhdCAweCV4XG4iLCBkZXYtPm5hbWUsIAorCSAgICAgICBkZXYtPmJhc2VfYWRkcik7CisjZW5kaWYKKwlnZW5kZXYtPmRyaXZlcl9kYXRhID0gZGV2OworCXJldHVybiAwOworIG91dDI6CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEhQMTAwX1JFR0lPTl9TSVpFKTsKKyBvdXQxOgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgaHAxMDBfZWlzYV9yZW1vdmUgKHN0cnVjdCBkZXZpY2UgKmdlbmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZ2VuZGV2LT5kcml2ZXJfZGF0YTsKKwljbGVhbnVwX2RldihkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGVpc2FfZHJpdmVyIGhwMTAwX2Vpc2FfZHJpdmVyID0geworICAgICAgICAuaWRfdGFibGUgPSBocDEwMF9laXNhX3RibCwKKyAgICAgICAgLmRyaXZlciAgID0geworICAgICAgICAgICAgICAgIC5uYW1lICAgID0gImhwMTAwIiwKKyAgICAgICAgICAgICAgICAucHJvYmUgICA9IGhwMTAwX2Vpc2FfcHJvYmUsCisgICAgICAgICAgICAgICAgLnJlbW92ZSAgPSBfX2RldmV4aXRfcCAoaHAxMDBfZWlzYV9yZW1vdmUpLAorICAgICAgICB9Cit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW50IF9fZGV2aW5pdCBocDEwMF9wY2lfcHJvYmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpb2FkZHI7CisJdV9zaG9ydCBwY2lfY29tbWFuZDsKKwlpbnQgZXJyOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgaHAxMDBfcHJpdmF0ZSkpOworCWlmICghZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0MDsKKwl9CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmcGNpX2NvbW1hbmQpOworCWlmICghKHBjaV9jb21tYW5kICYgUENJX0NPTU1BTkRfSU8pKSB7CisjaWZkZWYgSFAxMDBfREVCVUcKKwkJcHJpbnRrKCJocDEwMDogJXM6IFBDSSBJL08gQml0IGhhcyBub3QgYmVlbiBzZXQuIFNldHRpbmcuLi5cbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJcGNpX2NvbW1hbmQgfD0gUENJX0NPTU1BTkRfSU87CisJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgcGNpX2NvbW1hbmQpOworCX0KKworCWlmICghKHBjaV9jb21tYW5kICYgUENJX0NPTU1BTkRfTUFTVEVSKSkgeworI2lmZGVmIEhQMTAwX0RFQlVHCisJCXByaW50aygiaHAxMDA6ICVzOiBQQ0kgTWFzdGVyIEJpdCBoYXMgbm90IGJlZW4gc2V0LiBTZXR0aW5nLi4uXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJCXBjaV9jb21tYW5kIHw9IFBDSV9DT01NQU5EX01BU1RFUjsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBwY2lfY29tbWFuZCk7CisJfQorCQorCWlvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwllcnIgPSBocDEwMF9wcm9iZTEoZGV2LCBpb2FkZHIsIEhQMTAwX0JVU19QQ0ksIHBkZXYpOworCWlmIChlcnIpIAorCQlnb3RvIG91dDE7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQyOworCQorI2lmZGVmIEhQMTAwX0RFQlVHCisJcHJpbnRrKCJocDEwMDogJXM6IFBDSSBhZGFwdGVyIGZvdW5kIGF0IDB4JXhcbiIsIGRldi0+bmFtZSwgaW9hZGRyKTsKKyNlbmRpZgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCXJldHVybiAwOworIG91dDI6CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEhQMTAwX1JFR0lPTl9TSVpFKTsKKyBvdXQxOgorCWZyZWVfbmV0ZGV2KGRldik7Cisgb3V0MDoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGhwMTAwX3BjaV9yZW1vdmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwljbGVhbnVwX2RldihkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK30KKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaHAxMDBfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiaHAxMDAiLAorCS5pZF90YWJsZQk9IGhwMTAwX3BjaV90YmwsCisJLnByb2JlCQk9IGhwMTAwX3BjaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGhwMTAwX3BjaV9yZW1vdmUpLAorfTsKKyNlbmRpZgorCisvKgorICogIG1vZHVsZSBzZWN0aW9uCisgKi8KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PiwgIgorICAgICAgICAgICAgICAiU2llZ2ZyaWVkIFwiRnJpZWRlclwiIExvZWZmbGVyIChkZzFzZWspIDxmbG9lZmZAbWF0aGVtYXRpay51bmktc3R1dHRnYXJ0LmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIUCBDQVNDQURFIEFyY2hpdGVjdHVyZSBEcml2ZXIgZm9yIDEwMFZHLUFueUxhbiBOZXR3b3JrIEFkYXB0ZXJzIik7CisKKy8qCisgKiBOb3RlOiB0byByZWdpc3RlciB0aHJlZSBpc2EgZGV2aWNlcywgdXNlOgorICogb3B0aW9uIGhwMTAwIGhwMTAwX3BvcnQ9MCwwLDAKKyAqICAgICAgICB0byByZWdpc3RlciBvbmUgY2FyZCBhdCBpbyAweDI4MCBhcyBldGgyMzksIHVzZToKKyAqIG9wdGlvbiBocDEwMCBocDEwMF9wb3J0PTB4MjgwCisgKi8KKyNpZiBkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfSVNBKQorI2RlZmluZSBIUDEwMF9ERVZJQ0VTIDUKKy8qIFBhcmFtZXRlcnMgc2V0IGJ5IGluc21vZCAqLworc3RhdGljIGludCBocDEwMF9wb3J0W0hQMTAwX0RFVklDRVNdID0geyAwLCBbMSAuLi4gKEhQMTAwX0RFVklDRVMtMSldID0gLTEgfTsKK21vZHVsZV9wYXJhbV9hcnJheShocDEwMF9wb3J0LCBpbnQsIE5VTEwsIDApOworCisvKiBMaXN0IG9mIGRldmljZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqaHAxMDBfZGV2bGlzdFtIUDEwMF9ERVZJQ0VTXTsKKworc3RhdGljIGludCBfX2luaXQgaHAxMDBfaXNhX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpLCBlcnIsIGNhcmRzID0gMDsKKworCS8qIERvbid0IGF1dG9wcm9iZSBJU0EgYnVzICovCisJaWYgKGhwMTAwX3BvcnRbMF0gPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBMb29wIG9uIGFsbCBwb3NzaWJsZSBiYXNlIGFkZHJlc3NlcyAqLworCWZvciAoaSA9IDA7IGkgPCBIUDEwMF9ERVZJQ0VTICYmIGhwMTAwX3BvcnRbaV0gIT0gLTE7ICsraSkgeworCQlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGhwMTAwX3ByaXZhdGUpKTsKKwkJaWYgKCFkZXYpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImhwMTAwOiBubyBtZW1vcnkgZm9yIG5ldHdvcmsgZGV2aWNlXG4iKTsKKwkJCXdoaWxlIChjYXJkcyA+IDApCisJCQkJY2xlYW51cF9kZXYoaHAxMDBfZGV2bGlzdFstLWNhcmRzXSk7CisKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCQllcnIgPSBocDEwMF9pc2FfcHJvYmUoZGV2LCBocDEwMF9wb3J0W2ldKTsKKwkJaWYgKCFlcnIpIHsKKwkJCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCQkJaWYgKCFlcnIpIAorCQkJCWhwMTAwX2Rldmxpc3RbY2FyZHMrK10gPSBkZXY7CisJCQllbHNlCisJCQkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEhQMTAwX1JFR0lPTl9TSVpFKTsKKwkJfQorCisJCWlmIChlcnIpCisJCQlmcmVlX25ldGRldihkZXYpOworCX0KKworCXJldHVybiBjYXJkcyA+IDAgPyAwIDogLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGhwMTAwX2lzYV9jbGVhbnVwKHZvaWQpIAoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEhQMTAwX0RFVklDRVM7IGkrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaHAxMDBfZGV2bGlzdFtpXTsKKwkJaWYgKGRldikKKwkJCWNsZWFudXBfZGV2KGRldik7CisJfQorfQorI2Vsc2UKKyNkZWZpbmUgaHAxMDBfaXNhX2luaXQoKQkoMCkKKyNkZWZpbmUgaHAxMDBfaXNhX2NsZWFudXAoKQlkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBocDEwMF9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSBocDEwMF9pc2FfaW5pdCgpOworCWlmIChlcnIgJiYgZXJyICE9IC1FTk9ERVYpCisJCWdvdG8gb3V0OworI2lmZGVmIENPTkZJR19FSVNBCisJZXJyID0gZWlzYV9kcml2ZXJfcmVnaXN0ZXIoJmhwMTAwX2Vpc2FfZHJpdmVyKTsKKwlpZiAoZXJyICYmIGVyciAhPSAtRU5PREVWKSAKKwkJZ290byBvdXQyOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1BDSQorCWVyciA9IHBjaV9tb2R1bGVfaW5pdCgmaHAxMDBfcGNpX2RyaXZlcik7CisJaWYgKGVyciAmJiBlcnIgIT0gLUVOT0RFVikgCisJCWdvdG8gb3V0MzsKKyNlbmRpZgorIG91dDoKKwlyZXR1cm4gZXJyOworIG91dDM6CisjaWZkZWYgQ09ORklHX0VJU0EKKwllaXNhX2RyaXZlcl91bnJlZ2lzdGVyICgmaHAxMDBfZWlzYV9kcml2ZXIpOworIG91dDI6CisjZW5kaWYKKwlocDEwMF9pc2FfY2xlYW51cCgpOworCWdvdG8gb3V0OworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBocDEwMF9tb2R1bGVfZXhpdCh2b2lkKQoreworCWhwMTAwX2lzYV9jbGVhbnVwKCk7CisjaWZkZWYgQ09ORklHX0VJU0EKKwllaXNhX2RyaXZlcl91bnJlZ2lzdGVyICgmaHAxMDBfZWlzYV9kcml2ZXIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1BDSQorCXBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJmhwMTAwX3BjaV9kcml2ZXIpOworI2VuZGlmCit9CisKK21vZHVsZV9pbml0KGhwMTAwX21vZHVsZV9pbml0KQorbW9kdWxlX2V4aXQoaHAxMDBfbW9kdWxlX2V4aXQpCisKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURfX0tFUk5FTF9fIC1JL3Vzci9zcmMvbGludXgvbmV0L2luZXQgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLW00ODYgLWMgaHAxMDAuYyIKKyAqICBjLWluZGVudC1sZXZlbDogMgorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ocDEwMC5oIGIvZHJpdmVycy9uZXQvaHAxMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzZkOTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaHAxMDAuaApAQCAtMCwwICsxLDYxNSBAQAorLyoKKyAqIGhwMTAwLmg6IEhld2xldHQgUGFja2FyZCBIUDEwLzEwMFZHIEFOWSBMQU4gZXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiAkSWQ6IGhwMTAwLmgsdiAxLjUxIDE5OTcvMDQvMDggMTQ6MjY6NDIgZmxvZWZmIEV4cCBmbG9lZmYgJAorICoKKyAqIEF1dGhvcnM6ICBKYXJvc2xhdiBLeXNlbGEsIDxwZXJleEBwZi5qY3UuY3o+CisgKiAgICAgICAgICAgU2llZ2ZyaWVkIExvZWZmbGVyIDxmbG9lZmZAdHVuaXgubWF0aGVtYXRpay51bmktc3R1dHRnYXJ0LmRlPgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHRoZSAnaHBmZXBrdCcgY3J5bndyIHBhY2tldCBkcml2ZXIuCisgKgorICogVGhpcyBzb3VyY2UvY29kZSBpcyBwdWJsaWMgZnJlZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgCisgKiBpdCB1bmRlciB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbikgZWl0aGVyIHZlcnNpb24gdHdvIG9mIHRoaXMgTGljZW5zZSwgb3IgYW55IAorICogbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEhhcmR3YXJlIENvbnN0YW50cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIAorICogUGFnZSBJZGVudGlmaWVycworICogKFN3YXAgUGFnaW5nIFJlZ2lzdGVyLCBQQUdJTkcsIGJpdHMgMzowLCBPZmZzZXQgMHgwMikKKyAqLworCisjZGVmaW5lIEhQMTAwX1BBR0VfUEVSRk9STUFOQ0UJMHgwCS8qIFBhZ2UgMCAqLworI2RlZmluZSBIUDEwMF9QQUdFX01BQ19BRERSRVNTCTB4MQkvKiBQYWdlIDEgKi8KKyNkZWZpbmUgSFAxMDBfUEFHRV9IV19NQVAJMHgyCS8qIFBhZ2UgMiAqLworI2RlZmluZSBIUDEwMF9QQUdFX0VFUFJPTV9DVFJMCTB4MwkvKiBQYWdlIDMgKi8KKyNkZWZpbmUgSFAxMDBfUEFHRV9NQUNfQ1RSTAkweDQJLyogUGFnZSA0ICovCisjZGVmaW5lIEhQMTAwX1BBR0VfTU1VX0NGRwkweDUJLyogUGFnZSA1ICovCisjZGVmaW5lIEhQMTAwX1BBR0VfSURfTUFDX0FERFIJMHg2CS8qIFBhZ2UgNiAqLworI2RlZmluZSBIUDEwMF9QQUdFX01NVV9QT0lOVEVSCTB4NwkvKiBQYWdlIDcgKi8KKworCisvKiBSZWdpc3RlcnMgdGhhdCBhcmUgcHJlc2VudCBvbiBhbGwgcGFnZXMgICovCisKKyNkZWZpbmUgSFAxMDBfUkVHX0hXX0lECQkweDAwCS8qIFI6ICAoMTYpIFVuaXF1ZSBjYXJkIElEICAgICAgICAgICAqLworI2RlZmluZSBIUDEwMF9SRUdfVFJBQ0UJCTB4MDAJLyogVzogICgxNikgVXNlZCBmb3IgZGVidWcgb3V0cHV0ICAgICovCisjZGVmaW5lIEhQMTAwX1JFR19QQUdJTkcJMHgwMgkvKiBSOiAgKDE2KSwxNTo0IENhcmQgSUQgICAgICAgICAgICAgKi8KKwkJCQkJLyogVzogICgxNiksMzowIFN3aXRjaCBwYWdlcyAgICAgICAgICovCisjZGVmaW5lIEhQMTAwX1JFR19PUFRJT05fTFNXCTB4MDQJLyogUlc6ICgxNikgU2VsZWN0IGNhcmQgZnVuY3Rpb25zICAgICovCisjZGVmaW5lIEhQMTAwX1JFR19PUFRJT05fTVNXCTB4MDYJLyogUlc6ICgxNikgU2VsZWN0IGNhcmQgZnVuY3Rpb25zICAgICovCisKKy8qICBQYWdlIDAgLSBQZXJmb3JtYW5jZSAgKi8KKworI2RlZmluZSBIUDEwMF9SRUdfSVJRX1NUQVRVUwkweDA4CS8qIFJXOiAoMTYpIFdoaWNoIGludHMgYXJlIHBlbmRpbmcgICAqLworI2RlZmluZSBIUDEwMF9SRUdfSVJRX01BU0sJMHgwYQkvKiBSVzogKDE2KSBTZWxlY3QgaW50cyB0byBhbGxvdyAgICAgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX0ZSQUdNRU5UX0xFTgkweDBjCS8qIFc6ICgxNikxMjowIEN1cnJlbnQgZnJhZ21lbnQgbGVuICovCisvKiBOb3RlOiBGb3IgMzIgYml0IHN5c3RlbXMsIGZyYWdtZW50IGxlbiBhbmQgb2Zmc2V0IHJlZ2lzdGVycyBhcmUgYXZhaWxhYmxlICovCisvKiAgICAgICBhdCBvZmZzZXQgMHgyOCBhbmQgMHgyYywgd2hlcmUgdGhleSBjYW4gYmUgd3JpdHRlbiBhcyAzMmJpdCB2YWx1ZXMuICovCisjZGVmaW5lIEhQMTAwX1JFR19PRkZTRVQJMHgwZQkvKiBSVzogKDE2KTEyOjAgT2Zmc2V0IHRvIHN0YXJ0IHJlYWQgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX0RBVEEzMgkweDEwCS8qIFJXOiAoMzIpIEkvTyBtb2RlIGRhdGEgcG9ydCAgICAgICAqLworI2RlZmluZSBIUDEwMF9SRUdfREFUQTE2CTB4MTIJLyogUlc6IFdPUkRzIG11c3QgYmUgcmVhZCBmcm9tIGhlcmUgICovCisjZGVmaW5lIEhQMTAwX1JFR19UWF9NRU1fRlJFRQkweDE0CS8qIFJEOiAoMzIpIEFtb3VudCBvZiBmcmVlIFR4IG1lbSAgICAqLworI2RlZmluZSBIUDEwMF9SRUdfVFhfUERBX0wgICAgICAweDE0CS8qIFc6ICgzMikgQk06IFB0ciB0byBQREwsIExvdyBQcmkgICovCisjZGVmaW5lIEhQMTAwX1JFR19UWF9QREFfSCAgICAgIDB4MWMJLyogVzogKDMyKSBCTTogUHRyIHRvIFBETCwgSGlnaCBQcmkgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX1JYX1BLVF9DTlQJMHgxOAkvKiBSRDogKDgpIFJ4IGNvdW50IG9mIHBrdHMgb24gY2FyZCAgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX1RYX1BLVF9DTlQJMHgxOQkvKiBSRDogKDgpIFR4IGNvdW50IG9mIHBrdHMgb24gY2FyZCAgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX1JYX1BETCAgICAgICAgMHgxYQkvKiBSOiAoOCkgQk06ICMgcnggcGRsIG5vdCBleGVjdXRlZCAqLworI2RlZmluZSBIUDEwMF9SRUdfVFhfUERMICAgICAgICAweDFiCS8qIFI6ICg4KSBCTTogIyB0eCBwZGwgbm90IGV4ZWN1dGVkICovCisjZGVmaW5lIEhQMTAwX1JFR19SWF9QREEgICAgICAgIDB4MTgJLyogVzogKDMyKSBCTTogVXAgdG8gMzEgYWRkcmVzc2VzICovCisJCQkJCS8qICAgICAgICAgICAgIHdoaWNoIHBvaW50IHRvIGEgUERMICovCisjZGVmaW5lIEhQMTAwX1JFR19TTF9FQVJMWSAgICAgIDB4MWMJLyogICAgKDMyKSBFbmhhbmNlZCBTbGF2ZSBFYXJseSBSeCAqLworI2RlZmluZSBIUDEwMF9SRUdfU1RBVF9EUk9QUEVEICAweDIwCS8qIFIgKDEyKSBEcm9wcGVkIFBhY2tldCBDb3VudGVyICovCisjZGVmaW5lIEhQMTAwX1JFR19TVEFUX0VSUk9SRUQgIDB4MjIJLyogUiAoOCkgRXJyb3JlZCBQYWNrZXQgQ291bnRlciAqLworI2RlZmluZSBIUDEwMF9SRUdfU1RBVF9BQk9SVCAgICAweDIzCS8qIFIgKDgpIEFib3J0IENvdW50ZXIvT1cgQ29sbC4gRmxhZyAqLworI2RlZmluZSBIUDEwMF9SRUdfUlhfUklORyAgICAgICAweDI0CS8qIFcgKDMyKSBTbGF2ZTogUlggUmluZyBQb2ludGVycyAqLworI2RlZmluZSBIUDEwMF9SRUdfMzJfRlJBR01FTlRfTEVOIDB4MjgJLyogVyAoMTMpIFNsYXZlOiBGcmFnbWVudCBMZW5ndGggUmVnICovCisjZGVmaW5lIEhQMTAwX1JFR18zMl9PRkZTRVQgICAgIDB4MmMJLyogVyAoMTYpIFNsYXZlOiBPZmZzZXQgUmVnaXN0ZXIgKi8KKworLyogIFBhZ2UgMSAtIE1BQyBBZGRyZXNzL0hhc2ggVGFibGUgICovCisKKyNkZWZpbmUgSFAxMDBfUkVHX01BQ19BRERSCTB4MDgJLyogUlc6ICg4KSBDYXJkcyBNQUMgYWRkcmVzcyAgICAgICAgICovCisjZGVmaW5lIEhQMTAwX1JFR19IQVNIX0JZVEUwCTB4MTAJLyogUlc6ICg4KSBDYXJkcyBtdWx0aWNhc3QgZmlsdGVyICAgICovCisKKy8qICBQYWdlIDIgLSBIYXJkd2FyZSBNYXBwaW5nICAqLworCisjZGVmaW5lIEhQMTAwX1JFR19NRU1fTUFQX0xTVwkweDA4CS8qIFJXOiAoMTYpIExTVyBvZiBjYXJkcyBtZW0gYWRkciAgICAqLworI2RlZmluZSBIUDEwMF9SRUdfTUVNX01BUF9NU1cJMHgwYQkvKiBSVzogKDE2KSBNU1cgb2YgY2FyZHMgbWVtIGFkZHIgICAgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX0lPX01BUAkweDBjCS8qIFJXOiAoOCkgQ2FyZHMgSS9PIGFkZHJlc3MgICAgICAgICAqLworI2RlZmluZSBIUDEwMF9SRUdfSVJRX0NIQU5ORUwJMHgwZAkvKiBSVzogKDgpIElSUSBhbmQgZWRnZS9sZXZlbCBpbnQgICAgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX1NSQU0JCTB4MGUJLyogUlc6ICg4KSBIb3cgbXVjaCBSQU0gb24gY2FyZCAgICAgICovCisjZGVmaW5lIEhQMTAwX1JFR19CTQkJMHgwZgkvKiBSVzogKDgpIENvbnRyb2xzIEJNIGZ1bmN0aW9ucyAgICAgKi8KKworLyogTmV3IG9uIFBhZ2UgMiBmb3IgRVRSIGNoaXBzOiAqLworI2RlZmluZSBIUDEwMF9SRUdfTU9ERUNUUkwxICAgICAweDEwCS8qIFJXOiAoOCkgTW9kZSBDb250cm9sIDEgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX01PREVDVFJMMiAgICAgMHgxMQkvKiBSVzogKDgpIE1vZGUgQ29udHJvbCAyICovCisjZGVmaW5lIEhQMTAwX1JFR19QQ0lDVFJMMSAgICAgIDB4MTIJLyogUlc6ICg4KSBQQ0kgQ2ZnIDEgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX1BDSUNUUkwyICAgICAgMHgxMwkvKiBSVzogKDgpIFBDSSBDZmcgMiAqLworI2RlZmluZSBIUDEwMF9SRUdfUENJQlVTTUxBVCAgICAweDE1CS8qIFJXOiAoOCkgUENJIEJ1cyBNYXN0ZXIgTGF0ZW5jeSAqLworI2RlZmluZSBIUDEwMF9SRUdfRUFSTFlUWENGRyAgICAweDE2CS8qIFJXOiAoMTYpIEVhcmx5IFRYIENmZy9DbnRybCBSZWcgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX0VBUkxZUlhDRkcgICAgMHgxOAkvKiBSVzogKDgpIEVhcmx5IFJYIENmZy9DbnRybCBSZWcgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX0lTQVBOUENGRzEgICAgMHgxYQkvKiBSVzogKDgpIElTQSBQblAgQ2ZnL0NudHJsIFJlZyAxICovCisjZGVmaW5lIEhQMTAwX1JFR19JU0FQTlBDRkcyICAgIDB4MWIJLyogUlc6ICg4KSBJU0EgUG5QIENmZy9DbnRybCBSZWcgMiAqLworCisvKiAgUGFnZSAzIC0gRUVQUk9NL0Jvb3QgUk9NICAqLworCisjZGVmaW5lIEhQMTAwX1JFR19FRVBST01fQ1RSTAkweDA4CS8qIFJXOiAoMTYpIFVzZWQgdG8gbG9hZCBFRVBST00gICAgICAqLworI2RlZmluZSBIUDEwMF9SRUdfQk9PVFJPTV9DVFJMICAweDBhCisKKy8qICBQYWdlIDQgLSBMQU4gQ29uZmlndXJhdGlvbiAgKE1BQ19DVFJMKSAqLworCisjZGVmaW5lIEhQMTAwX1JFR18xMF9MQU5fQ0ZHXzEJMHgwOAkvKiBSVzogKDgpIFNldCAxME0gWENWUiBmdW5jdGlvbnMgICAqLworI2RlZmluZSBIUDEwMF9SRUdfMTBfTEFOX0NGR18yICAweDA5CS8qIFJXOiAoOCkgICAgIDEwTSBYQ1ZSIGZ1bmN0aW9ucyAgICovCisjZGVmaW5lIEhQMTAwX1JFR19WR19MQU5fQ0ZHXzEJMHgwYQkvKiBSVzogKDgpIFNldCAxMDBNIFhDVlIgZnVuY3Rpb25zICAqLworI2RlZmluZSBIUDEwMF9SRUdfVkdfTEFOX0NGR18yICAweDBiCS8qIFJXOiAoOCkgMTAwTSBMQU4gVHJhaW5pbmcgY2ZncmVncyAqLworI2RlZmluZSBIUDEwMF9SRUdfTUFDX0NGR18xCTB4MGMJLyogUlc6ICg4KSBUeXBlcyBvZiBwa3RzIHRvIGFjY2VwdCAgICovCisjZGVmaW5lIEhQMTAwX1JFR19NQUNfQ0ZHXzIJMHgwZAkvKiBSVzogKDgpIE1pc2MgTUFDIGZ1bmN0aW9ucyAgICAgICAgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX01BQ19DRkdfMyAgICAgMHgwZQkvKiBSVzogKDgpIE1pc2MgTUFDIGZ1bmN0aW9ucyAqLworI2RlZmluZSBIUDEwMF9SRUdfTUFDX0NGR180ICAgICAweDBmCS8qIFI6ICAoOCkgTWlzYyBNQUMgc3RhdGVzICovCisjZGVmaW5lIEhQMTAwX1JFR19EUk9QUEVECTB4MTAJLyogUjogICgxNiksMTE6MCBQa3RzIGNhbnQgZml0IGluIG1lbSAqLworI2RlZmluZSBIUDEwMF9SRUdfQ1JDCQkweDEyCS8qIFI6ICAoOCkgUGt0cyB3aXRoIENSQyAgICAgICAgICAgICAqLworI2RlZmluZSBIUDEwMF9SRUdfQUJPUlQJCTB4MTMJLyogUjogICg4KSBBYm9ydGVkIFR4IHBrdHMgICAgICAgICAgICovCisjZGVmaW5lIEhQMTAwX1JFR19UUkFJTl9SRVFVRVNUIDB4MTQJLyogUlc6ICgxNikgRW5kbm9kZSBNQUMgcmVnaXN0ZXIuICovCisjZGVmaW5lIEhQMTAwX1JFR19UUkFJTl9BTExPVyAgIDB4MTYJLyogUjogICgxNikgSHViIGFsbG93ZWQgcmVnaXN0ZXIgKi8KKworLyogIFBhZ2UgNSAtIE1NVSAgKi8KKworI2RlZmluZSBIUDEwMF9SRUdfUlhfTUVNX1NUT1AJMHgwYwkvKiBSVzogKDE2KSBFbmQgb2YgUnggcmluZyBhZGRyICAgICAgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX1RYX01FTV9TVE9QCTB4MGUJLyogUlc6ICgxNikgRW5kIG9mIFR4IHJpbmcgYWRkciAgICAgICovCisjZGVmaW5lIEhQMTAwX1JFR19QRExfTUVNX1NUT1AgIDB4MTAJLyogTm90IHVzZWQgYnkgODAyLjEyIGRldmljZXMgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX0VDQl9NRU1fU1RPUCAgMHgxNAkvKiBJJ3ZlIG5vIGlkZWEgd2hhdCB0aGlzIGlzICovCisKKy8qICBQYWdlIDYgLSBDYXJkIElEL1BoeXNpY2FsIExBTiBBZGRyZXNzICAqLworCisjZGVmaW5lIEhQMTAwX1JFR19CT0FSRF9JRAkweDA4CS8qIFI6ICAoOCkgRUlTQS9JU0EgY2FyZCBJRCAgICAgICAgICAqLworI2RlZmluZSBIUDEwMF9SRUdfQk9BUkRfSU9fQ0hDSyAweDBjCS8qIFI6ICAoOCkgQWRkZWQgdG8gSUQgdG8gZ2V0IEZGaCAgICAqLworI2RlZmluZSBIUDEwMF9SRUdfU09GVF9NT0RFTAkweDBkCS8qIFI6ICAoOCkgQ29uZmlnIHByb2dyYW0gZGVmaW5lZCAgICAqLworI2RlZmluZSBIUDEwMF9SRUdfTEFOX0FERFIJMHgxMAkvKiBSOiAgKDgpIE1BQyBhZGRyIG9mIGNhcmQgICAgICAgICAgKi8KKyNkZWZpbmUgSFAxMDBfUkVHX0xBTl9BRERSX0NIQ0sgMHgxNgkvKiBSOiAgKDgpIEFkZGVkIHRvIGFkZHIgdG8gZ2V0IEZGaCAgKi8KKworLyogIFBhZ2UgNyAtIE1NVSBDdXJyZW50IFBvaW50ZXJzICAqLworCisjZGVmaW5lIEhQMTAwX1JFR19QVFJfUlhTVEFSVAkweDA4CS8qIFI6ICAoMTYpIEN1cnJlbnQgYmVnaW4gb2YgUnggcmluZyAqLworI2RlZmluZSBIUDEwMF9SRUdfUFRSX1JYRU5ECTB4MGEJLyogUjogICgxNikgQ3VycmVudCBlbmQgb2YgUnggcmluZyAgICovCisjZGVmaW5lIEhQMTAwX1JFR19QVFJfVFhTVEFSVAkweDBjCS8qIFI6ICAoMTYpIEN1cnJlbnQgYmVnaW4gb2YgVHggcmluZyAqLworI2RlZmluZSBIUDEwMF9SRUdfUFRSX1RYRU5ECTB4MGUJLyogUjogICgxNikgQ3VycmVudCBlbmQgb2YgUnggcmluZyAgICovCisjZGVmaW5lIEhQMTAwX1JFR19QVFJfUlBETFNUQVJUIDB4MTAKKyNkZWZpbmUgSFAxMDBfUkVHX1BUUl9SUERMRU5EICAgMHgxMgorI2RlZmluZSBIUDEwMF9SRUdfUFRSX1JJTkdQVFJTICAweDE0CisjZGVmaW5lIEhQMTAwX1JFR19QVFJfTUVNREVCVUcgIDB4MWEKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIAorICogSGFyZHdhcmUgSUQgUmVnaXN0ZXIgSSAoQWx3YXlzIGF2YWlsYWJsZSwgSFdfSUQsIE9mZnNldCAweDAwKQorICovCisjZGVmaW5lIEhQMTAwX0hXX0lEX0NBU0NBREUgICAgIDB4NDg1MAkvKiBJZGVudGlmaWVzIENhc2NhZGUgQ2hpcCAqLworCisvKiAKKyAqIEhhcmR3YXJlIElEIFJlZ2lzdGVyIDIgJiBQYWdpbmcgUmVnaXN0ZXIKKyAqIChBbHdheXMgYXZhaWxhYmxlLCBQQUdJTkcsIE9mZnNldCAweDAyKQorICogQml0cyAxNTo0IGFyZSBmb3IgdGhlIENoaXAgSUQgCisgKi8KKyNkZWZpbmUgSFAxMDBfQ0hJUElEX01BU0sgICAgICAgIDB4RkZGMAorI2RlZmluZSBIUDEwMF9DSElQSURfU0hBU1RBICAgICAgMHg1MzUwCS8qIE5vdCA4MDIuMTIgY29tcGxpYW50ICovCisJCQkJCSAvKiBFSVNBIEJNL1NMLCBNQ0ExNi8zMiBTTCwgSVNBIFNMICovCisjZGVmaW5lIEhQMTAwX0NISVBJRF9SQUlOSUVSICAgICAweDUzNjAJLyogTm90IDgwMi4xMiBjb21wbGlhbnQgRUlTQSBCTSwgKi8KKwkJCQkJIC8qIFBDSSBTTCwgTUNBMTYvMzIgU0wsIElTQSBTTCAqLworI2RlZmluZSBIUDEwMF9DSElQSURfTEFTU0VOICAgICAgMHg1MzcwCS8qIDgwMi4xMiBjb21wbGlhbnQgUENJIEJNLCBQQ0kgU0wgKi8KKwkJCQkJIC8qIExSRiBzdXBwb3J0ZWQgKi8KKworLyoKKyAqICBPcHRpb24gUmVnaXN0ZXJzIEkgYW5kIElJIAorICogKEFsd2F5cyBhdmFpbGFibGUsIE9QVElPTl9MU1csIE9mZnNldCAweDA0LTB4MDUpCisgKi8KKyNkZWZpbmUgSFAxMDBfREVCVUdfRU4JCTB4ODAwMAkvKiAwOkRpcy4sIDE6RW5hYmxlIERlYnVnIER1bXAgUHRyLiAqLworI2RlZmluZSBIUDEwMF9SWF9IRFIJCTB4NDAwMAkvKiAwOkRpcy4sIDE6RW5hYmxlIHB1dHRpbmcgcGt0IGludG8gKi8KKwkJCQkJLyogICBzeXN0ZW0gbWVtLiBiZWZvcmUgUnggaW50ZXJydXB0ICovCisjZGVmaW5lIEhQMTAwX01NQVBfRElTCQkweDIwMDAJLyogMDpFbmFibGUsIDE6RGlzYWJsZSBtZW0ubWFwcGluZy4gKi8KKwkJCQkJLyogICBNTUFQX0RJUyBtdXN0IGJlIDAgYW5kIE1FTV9FTiAqLworCQkJCQkvKiAgIG11c3QgYmUgMSBmb3IgbWVtb3J5LW1hcHBlZCAqLworCQkJCQkvKiAgIG1vZGUgdG8gYmUgZW5hYmxlZCAqLworI2RlZmluZSBIUDEwMF9FRV9FTgkJMHgxMDAwCS8qIDA6RGlzYWJsZSwxOkVuYWJsZSBFRVBST00gd3JpdGluZyAqLworI2RlZmluZSBIUDEwMF9CTV9XUklURQkJMHgwODAwCS8qIDA6U2xhdmUsIDE6QnVzIE1hc3RlciBmb3IgVHggZGF0YSAqLworI2RlZmluZSBIUDEwMF9CTV9SRUFECQkweDA0MDAJLyogMDpTbGF2ZSwgMTpCdXMgTWFzdGVyIGZvciBSeCBkYXRhICovCisjZGVmaW5lIEhQMTAwX1RSSV9JTlQJCTB4MDIwMAkvKiAwOkRvbid0LCAxOkRvIHRyaS1zdGF0ZSB0aGUgaW50ICovCisjZGVmaW5lIEhQMTAwX01FTV9FTgkJMHgwMDQwCS8qIENvbmZpZyBwcm9ncmFtIHNldCB0aGlzIHRvICovCisJCQkJCS8qICAgMDpEaXNhYmxlLCAxOkVuYWJsZSBtZW0gbWFwLiAqLworCQkJCQkvKiAgIFNlZSBNTUFQX0RJUy4gKi8KKyNkZWZpbmUgSFAxMDBfSU9fRU4JCTB4MDAyMAkvKiAxOkVuYWJsZSBJL08gdHJhbnNmZXJzICovCisjZGVmaW5lIEhQMTAwX0JPT1RfRU4JCTB4MDAxMAkvKiAxOkVuYWJsZSBib290IFJPTSBhY2Nlc3MgKi8KKyNkZWZpbmUgSFAxMDBfRkFLRV9JTlQJCTB4MDAwOAkvKiAxOmludCAqLworI2RlZmluZSBIUDEwMF9JTlRfRU4JCTB4MDAwNAkvKiAxOkVuYWJsZSBpbnRzIGZyb20gY2FyZCAqLworI2RlZmluZSBIUDEwMF9IV19SU1QJCTB4MDAwMgkvKiAwOlJlc2V0LCAxOk91dCBvZiByZXNldCAqLworCQkJCQkvKiBOSUMgcmVzZXQgb24gMCB0byAxIHRyYW5zaXRpb24gKi8KKworLyoKKyAqICBPcHRpb24gUmVnaXN0ZXIgSUlJIAorICogKEFsd2F5cyBhdmFpbGFibGUsIE9QVElPTl9NU1csIE9mZnNldCAweDA2KQorICovCisjZGVmaW5lIEhQMTAwX1BSSU9SSVRZX1RYCTB4MDA4MAkvKiAxOkRvIGFsbCBUeCBwa3RzIGFzIHByaW9yaXR5ICovCisjZGVmaW5lIEhQMTAwX0VFX0xPQUQJCTB4MDA0MAkvKiAxOkVFUFJPTSBsb2FkaW5nLCAwIHdoZW4gZG9uZSAqLworI2RlZmluZSBIUDEwMF9BRFZfTlhUX1BLVAkweDAwMDQJLyogMTpBZHZhbmNlIHRvIG5leHQgcGt0IGluIFJ4IHF1ZXVlICovCisJCQkJCS8qICAgaC93IHdpbGwgc2V0IHRvIDAgd2hlbiBkb25lICovCisjZGVmaW5lIEhQMTAwX1RYX0NNRAkJMHgwMDAyCS8qIDE6VGVsbCBoL3cgZG93bmxvYWQgZG9uZSwgaC93ICovCisJCQkJCS8qICAgd2lsbCBzZXQgdG8gMCB3aGVuIGRvbmUgKi8KKworLyoKKyAqIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXJzIEkgYW5kIElJCisgKiAoUGFnZSBQRVJGT1JNQU5DRSwgSVJRX1NUQVRVUywgT2Zmc2V0IDB4MDgtMHgwOSkKKyAqIE5vdGU6IFdpdGggb2xkIGNoaXBzLCB0aGVzZSBSZWdpc3RlcnMgd2lsbCBjbGVhciB3aGVuIDEgaXMgd3JpdHRlbiB0byB0aGVtCisgKiAgICAgICB3aXRoIG5ldyBjaGlwcyB0aGlzIGRlcGVuZHMgb24gc2V0dGluZyBvZiBDTFJfSVNNT0RFCisgKi8KKyNkZWZpbmUgSFAxMDBfUlhfRUFSTFlfSU5UICAgICAgMHgyMDAwCisjZGVmaW5lIEhQMTAwX1JYX1BEQV9aRVJPICAgICAgIDB4MTAwMAorI2RlZmluZSBIUDEwMF9SWF9QRExfRklMTF9DT01QTCAweDA4MDAKKyNkZWZpbmUgSFAxMDBfUlhfUEFDS0VUCQkweDA0MDAJLyogMDpObywgMTpZZXMgcGt0IGhhcyBiZWVuIFJ4ICovCisjZGVmaW5lIEhQMTAwX1JYX0VSUk9SCQkweDAyMDAJLyogMDpObywgMTpZZXMgUnggcGt0IGhhZCBlcnJvciAqLworI2RlZmluZSBIUDEwMF9UWF9QREFfWkVSTyAgICAgICAweDAwMjAJLyogMSB3aGVuIFBEQSBjb3VudCBnb2VzIHRvIHplcm8gKi8KKyNkZWZpbmUgSFAxMDBfVFhfU1BBQ0VfQVZBSUwJMHgwMDEwCS8qIDA6PDgxOTIsIDE6Pj04MTkyIFR4IGZyZWUgYnl0ZXMgKi8KKyNkZWZpbmUgSFAxMDBfVFhfQ09NUExFVEUJMHgwMDA4CS8qIDA6Tm8sIDE6WWVzIGEgVHggaGFzIGNvbXBsZXRlZCAqLworI2RlZmluZSBIUDEwMF9NSVNDX0VSUk9SICAgICAgICAweDAwMDQJLyogMDpObywgMTpMYW4gTGluayBkb3duIG9yIGJ1cyBlcnJvciAqLworI2RlZmluZSBIUDEwMF9UWF9FUlJPUgkJMHgwMDAyCS8qIDA6Tm8sIDE6WWVzIFR4IHBrdCBoYWQgZXJyb3IgKi8KKworLyoKKyAqIFhtaXQgTWVtb3J5IEZyZWUgQ291bnQKKyAqIChQYWdlIFBFUkZPUk1BTkNFLCBUWF9NRU1fRlJFRSwgT2Zmc2V0IDB4MTQpIChSZWFkIG9ubHksIDMyYml0KQorICovCisjZGVmaW5lIEhQMTAwX0FVVE9fQ09NUEFSRQkweDgwMDAwMDAwCS8qIFR4IFNwYWNlIGF2YWlsICYgcGt0czwyNTUgKi8KKyNkZWZpbmUgSFAxMDBfRlJFRV9TUEFDRQkweDdmZmZmZmUwCS8qIFR4IGZyZWUgbWVtb3J5ICovCisKKy8qCisgKiAgSVJRIENoYW5uZWwKKyAqIChQYWdlIEhXX01BUCwgSVJRX0NIQU5ORUwsIE9mZnNldCAweDBkKQorICovCisjZGVmaW5lIEhQMTAwX1pFUk9fV0FJVF9FTgkweDgwCS8qIDA6Tm8sIDE6WWVzIGFzc2VydHMgTk9XUyBzaWduYWwgKi8KKyNkZWZpbmUgSFAxMDBfSVJRX1NDUkFNQkxFICAgICAgMHg0MAorI2RlZmluZSBIUDEwMF9CT05EX0hQICAgICAgICAgICAweDIwCisjZGVmaW5lIEhQMTAwX0xFVkVMX0lSUQkJMHgxMAkvKiAwOkVkZ2UsIDE6TGV2ZWwgdHlwZSBpbnRlcnJ1cHRzLiAqLworCQkJCQkvKiAoT25seSB2YWxpZCBvbiBFSVNBIGNhcmRzKSAqLworI2RlZmluZSBIUDEwMF9JUlFNQVNLCQkweDBGCS8qIElzb2xhdGUgdGhlIElSUSBiaXRzICovCisKKy8qCisgKiBTUkFNIFBhcmFtZXRlcnMKKyAqIChQYWdlIEhXX01BUCwgU1JBTSwgT2Zmc2V0IDB4MGUpCisgKi8KKyNkZWZpbmUgSFAxMDBfUkFNX1NJWkVfTUFTSwkweGUwCS8qIEFORCB0byBnZXQgU1JBTSBzaXplIGluZGV4ICovCisjZGVmaW5lIEhQMTAwX1JBTV9TSVpFX1NISUZUCTB4MDUJLyogU2hpZnQgY291bnQocHV0IGluZGV4IGluIGx3ciBiaXRzKSAqLworCisvKgorICogQnVzIE1hc3RlciBSZWdpc3RlcgorICogKFBhZ2UgSFdfTUFQLCBCTSwgT2Zmc2V0IDB4MGYpCisgKi8KKyNkZWZpbmUgSFAxMDBfQk1fQlVSU1RfUkQgICAgICAgMHgwMQkvKiBFSVNBIG9ubHk6IDE9VXNlIGJ1cnN0IHRyYW5zLiBmbSBzeXN0ZW0gKi8KKwkJCQkJLyogbWVtb3J5IHRvIGNoaXAgKHR4KSAqLworI2RlZmluZSBIUDEwMF9CTV9CVVJTVF9XUiAgICAgICAweDAyCS8qIEVJU0Egb25seTogMT1Vc2UgYnVyc3QgdHJhbnMuIGZtIHN5c3RlbSAqLworCQkJCQkvKiBtZW1vcnkgdG8gY2hpcCAocngpICovCisjZGVmaW5lIEhQMTAwX0JNX01BU1RFUgkJMHgwNAkvKiAwOlNsYXZlLCAxOkJNIG1vZGUgKi8KKyNkZWZpbmUgSFAxMDBfQk1fUEFHRV9DSyAgICAgICAgMHgwOAkvKiBUaGlzIGJpdCBzaG91bGQgYmUgc2V0IHdoZW5ldmVyIGluICovCisJCQkJCS8qIGFuIEVJU0Egc3lzdGVtICovCisjZGVmaW5lIEhQMTAwX0JNX1BDSV84Q0xLICAgICAgIDB4NDAJLyogLi4uIGN5Y2xlcyA4IGNsb2NrcyBhcGFydCAqLworCisKKy8qIAorICogTW9kZSBDb250cm9sIFJlZ2lzdGVyIEkKKyAqIChQYWdlIEhXX01BUCwgTU9ERUNUUkwxLCBPZmZzZXQweDEwKQorICovCisjZGVmaW5lIEhQMTAwX1RYX0RVQUxRICAgICAgICAgIDB4MTAKKyAgIC8qIElmIHNldCBhbmQgQk0gLT4gZHVhbCB0eCBwZGEgcXVldWVzICovCisjZGVmaW5lIEhQMTAwX0lTUl9DTFJNT0RFICAgICAgIDB4MDIJLyogSWYgc2V0IElTUiB3aWxsIGNsZWFyIGFsbCBwZW5kaW5nICovCisJCQkJICAgICAgIC8qIGludGVycnVwdHMgb24gcmVhZCAoZXRyIG9ubHk/KSAqLworI2RlZmluZSBIUDEwMF9FRV9OT0xPQUQgICAgICAgICAweDA0CS8qIFN0YXR1cyB3aGV0aGVyIHJlcyB3aWxsIGJlIGxvYWRlZCAqLworCQkJCSAgICAgICAvKiBmcm9tIHRoZSBlZXByb20gKi8KKyNkZWZpbmUgSFAxMDBfVFhfQ05UX0ZMRyAgICAgICAgMHgwOAkvKiBDb250cm9scyBFYXJseSBUWCBSZWcgQ250IEZpZWxkICovCisjZGVmaW5lIEhQMTAwX1BETF9VU0UzICAgICAgICAgIDB4MTAJLyogSWYgc2V0IEJNIGVuZ2luZSB3aWxsIHJlYWQgb25seSAqLworCQkJCSAgICAgICAvKiBmaXJzdCB0aHJlZSBkYXRhIGVsZW1lbnRzIG9mIGEgUERMICovCisJCQkJICAgICAgIC8qIG9uIHRoZSBmaXJzdCBhY2Nlc3MuICovCisjZGVmaW5lIEhQMTAwX0JVU1RZUEVfTUFTSyAgICAgIDB4ZTAJLyogVGhyZWUgYml0IGJ1cyB0eXBlIGluZm8gKi8KKworLyoKKyAqIE1vZGUgQ29udHJvbCBSZWdpc3RlciBJSQorICogKFBhZ2UgSFdfTUFQLCBNT0RFQ1RSTDIsIE9mZnNldDB4MTEpCisgKi8KKyNkZWZpbmUgSFAxMDBfRUVfTUFTSyAgICAgICAgICAgMHgwZgkvKiBUZWxsIEVFUFJPTSBjaXJjdWl0IG5vdCB0byBsb2FkICovCisJCQkJICAgICAgIC8qIGNlcnRhaW4gcmVzb3VyY2VzICovCisjZGVmaW5lIEhQMTAwX0RJU19DQU5DRUwgICAgICAgIDB4MjAJLyogRm9yIHR4IGR1YWxxIG1vZGUgb3BlcmF0aW9uICovCisjZGVmaW5lIEhQMTAwX0VOX1BETF9XQiAgICAgICAgIDB4NDAJLyogMTogU3RhdHVzIG9mIFBETCBjb21wbGV0aW9uIG1heSBiZSAqLworCQkJCSAgICAgICAvKiB3cml0dGVuIGJhY2sgdG8gc3lzdGVtIG1lbSAqLworI2RlZmluZSBIUDEwMF9FTl9CVVNfRkFJTCAgICAgICAweDgwCS8qIEVuYWJsZXMgYnVzLWZhaWwgcG9ydGlvbiBvZiBtaXNjICovCisJCQkJICAgICAgIC8qIGludGVycnVwdCAqLworCisvKiAKKyAqIFBDSSBDb25maWd1cmF0aW9uIGFuZCBDb250cm9sIFJlZ2lzdGVyIEkKKyAqIChQYWdlIEhXX01BUCwgUENJQ1RSTDEsIE9mZnNldCAweDEyKQorICovCisjZGVmaW5lIEhQMTAwX0xPX01FTSAgICAgICAgICAgIDB4MDEJLyogMTogTWFwcGVkIE1lbSByZXF1ZXN0ZWQgYmVsb3cgMU1CICovCisjZGVmaW5lIEhQMTAwX05PX01FTSAgICAgICAgICAgIDB4MDIJLyogMTogRGlzYWJsZXMgUmVxIGZvciBzeXNtZW0gdG8gUENJICovCisJCQkJICAgICAgIC8qIGJpb3MgKi8KKyNkZWZpbmUgSFAxMDBfVVNFX0lTQSAgICAgICAgICAgMHgwNAkvKiAxOiBpc2EgdHlwZSBkZWNvZGVzIHdpbGwgb2NjdXIgKi8KKwkJCQkgICAgICAgLyogc2ltdWx0YW5lb3VzbHkgd2l0aCBQQ0kgZGVjb2RlcyAqLworI2RlZmluZSBIUDEwMF9JUlFfSElfTUFTSyAgICAgICAweGYwCS8qIHBnbWVkIGJ5IHBjaSBiaW9zICovCisjZGVmaW5lIEhQMTAwX1BDSV9JUlFfSElfTUFTSyAgIDB4NzgJLyogSXNvbGF0ZSA0IGJpdHMgZm9yIFBDSSBJUlEgICovCisKKy8qCisgKiBQQ0kgQ29uZmlndXJhdGlvbiBhbmQgQ29udHJvbCBSZWdpc3RlciBJSQorICogKFBhZ2UgSFdfTUFQLCBQQ0lDVFJMMiwgT2Zmc2V0IDB4MTMpCisgKi8KKyNkZWZpbmUgSFAxMDBfUkRfTElORV9QREwgICAgICAgMHgwMQkvKiAxOiBQQ0kgY29tbWFuZCBNZW1vcnkgUmVhZCBMaW5lIGVuICovCisjZGVmaW5lIEhQMTAwX1JEX1RYX0RBVEFfTUFTSyAgIDB4MDYJLyogY2hvb3NlIFBDSSBtZW1yZWFkIGNtZHMgZm9yIFRYICovCisjZGVmaW5lIEhQMTAwX01XSSAgICAgICAgICAgICAgIDB4MDgJLyogMTogZW4uIFBDSSBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZSAqLworI2RlZmluZSBIUDEwMF9BUkJfTU9ERSAgICAgICAgICAweDEwCS8qIFNlbGVjdCBQQ0kgYXJiaXRvciB0eXBlICovCisjZGVmaW5lIEhQMTAwX1NUT1BfRU4gICAgICAgICAgIDB4MjAJLyogRW5hYmxlcyBQQ0kgc3RhdGUgbWFjaGluZSB0byBpc3N1ZSAqLworCQkJCSAgICAgICAvKiBwY2kgc3RvcCBpZiBjYXNjYWRlIG5vdCByZWFkeSAqLworI2RlZmluZSBIUDEwMF9JR05PUkVfUEFSICAgICAgICAweDQwCS8qIDE6IFBDSSBzdGF0ZSBtYWNoaW5lIGlnbm9yZXMgcGFyaXR5ICovCisjZGVmaW5lIEhQMTAwX1BDSV9SRVNFVCAgICAgICAgIDB4ODAJLyogMC0+MTogUmVzZXQgUENJIGJsb2NrICovCisKKy8qCisgKiBFYXJseSBUWCBDb25maWd1cmF0aW9uIGFuZCBDb250cm9sIFJlZ2lzdGVyCisgKiAoUGFnZSBIV19NQVAsIEVBUkxZVFhDRkcsIE9mZnNldCAweDE2KQorICovCisjZGVmaW5lIEhQMTAwX0VOX0VBUkxZX1RYICAgICAgIDB4ODAwMAkvKiAxPUVuYWJsZSBFYXJseSBUWCAqLworI2RlZmluZSBIUDEwMF9FTl9BREFQVElWRSAgICAgICAweDQwMDAJLyogMT1FbmFibGUgYWRhcHRpdmUgbW9kZSAqLworI2RlZmluZSBIUDEwMF9FTl9UWF9VUl9JUlEgICAgICAweDIwMDAJLyogcmVzZXJ2ZWQsIG11c3QgYmUgMCAqLworI2RlZmluZSBIUDEwMF9FTl9MT1dfVFggICAgICAgICAweDEwMDAJLyogcmVzZXJ2ZWQsIG11c3QgYmUgMCAqLworI2RlZmluZSBIUDEwMF9FVF9DTlRfTUFTSyAgICAgICAweDBmZmYJLyogYml0cyAxMS4uMDogRVQgY291bnRlcnMgKi8KKworLyoKKyAqIEVhcmx5IFJYIENvbmZpZ3VyYXRpb24gYW5kIENvbnRyb2wgUmVnaXN0ZXIKKyAqIChQYWdlIEhXX01BUCwgRUFSTFlSWENGRywgT2Zmc2V0IDB4MTgpCisgKi8KKyNkZWZpbmUgSFAxMDBfRU5fRUFSTFlfUlggICAgICAgMHg4MAkvKiAxPUVuYWJsZSBFYXJseSBSWCAqLworI2RlZmluZSBIUDEwMF9FTl9MT1dfUlggICAgICAgICAweDQwCS8qIHJlc2VydmVkLCBtdXN0IGJlIDAgKi8KKyNkZWZpbmUgSFAxMDBfUlhfVFJJUF9NQVNLICAgICAgMHgxZgkvKiBiaXRzIDQuLjA6IHRocmVzaG9sZCBhdCB3aGljaCB0aGUKKwkJCQkJICogZWFybHkgcnggY2lyY3VpdCB3aWxsIHN0YXJ0IHRoZQorCQkJCQkgKiBkbWEgb2YgcmVjZWl2ZWQgcGFja2V0IGludG8gc3lzdGVtCisJCQkJCSAqIG1lbW9yeSBmb3IgQk0gKi8KKworLyoKKyAqICBTZXJpYWwgRGV2aWNlcyBDb250cm9sIFJlZ2lzdGVyCisgKiAoUGFnZSBFRVBST01fQ1RSTCwgRUVQUk9NX0NUUkwsIE9mZnNldCAweDA4KQorICovCisjZGVmaW5lIEhQMTAwX0VFUFJPTV9MT0FECTB4MDAwMQkvKiAwLT4xIGxvYWRzIEVFUFJPTSBpbnRvIHJlZ2lzdGVycy4gKi8KKwkJCQkJLyogV2hlbiBpdCBnb2VzIGJhY2sgdG8gMCwgbG9hZCBpcyAgICovCisJCQkJCS8qIGNvbXBsZXRlLiBUaGlzIHNob3VsZCB0YWtlIH42MDB1cy4gKi8KKworLyoKKyAqIDEwTUIgTEFOIENvbnRyb2wgYW5kIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgSQorICogKFBhZ2UgTUFDX0NUUkwsIDEwX0xBTl9DRkdfMSwgT2Zmc2V0IDB4MDgpCisgKi8KKyNkZWZpbmUgSFAxMDBfTUFDMTBfU0VMCQkweGMwCS8qIEdldCBiaXRzIHRvIGluZGljYXRlIE1BQyAqLworI2RlZmluZSBIUDEwMF9BVUlfU0VMCQkweDIwCS8qIFN0YXR1cyBvZiBBVUkgc2VsZWN0aW9uICovCisjZGVmaW5lIEhQMTAwX0xPV19USAkJMHgxMAkvKiAwOk5vLCAxOlllcyBhbGxvdyBiZXR0ZXIgY2FibGluZyAqLworI2RlZmluZSBIUDEwMF9MSU5LX0JFQVRfRElTCTB4MDgJLyogMDpFbmFibGUsIDE6RGlzYWJsZSBsaW5rIGJlYXQgKi8KKyNkZWZpbmUgSFAxMDBfTElOS19CRUFUX1NUCTB4MDQJLyogMDpObywgMTpZZXMgbGluayBiZWF0IGJlaW5nIFJ4ICovCisjZGVmaW5lIEhQMTAwX1JfUk9MX1NUCQkweDAyCS8qIDA6Tm8sIDE6WWVzIFJ4IHR3aXN0ZWQgcGFpciBoYXMgKi8KKwkJCQkJLyogICAgICAgICAgICAgYmVlbiByZXZlcnNlZCAqLworI2RlZmluZSBIUDEwMF9BVUlfU1QJCTB4MDEJLyogMDpObywgMTpZZXMgdXNlIEFVSSBvbiBUUCBjYXJkICovCisKKy8qCisgKiAxMCBNQiBMQU4gQ29udHJvbCBhbmQgQ29uZmlndXJhdGlvbiBSZWdpc3RlciBJSQorICogKFBhZ2UgTUFDX0NUUkwsIDEwX0xBTl9DRkdfMiwgT2Zmc2V0IDB4MDkpCisgKi8KKyNkZWZpbmUgSFAxMDBfU1FVX1NUCQkweDAxCS8qIDA6Tm8sIDE6WWVzIGNvbGxpc2lvbiBzaWduYWwgc2VudCAqLworCQkJCQkvKiAgICAgICBhZnRlciBUeC5Pbmx5IHVzZWQgZm9yIEFVSS4gKi8KKyNkZWZpbmUgSFAxMDBfRlVMTERVUCAgICAgICAgICAgMHgwMgkvKiAxOiBMWFQ5MDEgWENWUiBmdWxsZHVwbHggZW5hYmxlZCAqLworI2RlZmluZSBIUDEwMF9ET1QzX01BQyAgICAgICAgICAweDA0CS8qIDE6IERPVCAzIE1hYyBzZWwuIHVubGVzcyBBdXRvc2VsICovCisKKy8qCisgKiBNQUMgU2VsZWN0aW9uLCB1c2Ugd2l0aCBNQUMxMF9TRUwgYml0cworICovCisjZGVmaW5lIEhQMTAwX0FVVE9fU0VMXzEwCTB4MAkvKiBBdXRvIHNlbGVjdCAqLworI2RlZmluZSBIUDEwMF9YQ1ZSX0xYVDkwMV8xMAkweDEJLyogTFhUOTAxIDEwQmFzZVQgdHJhbnNjZWl2ZXIgKi8KKyNkZWZpbmUgSFAxMDBfWENWUl83MjEzCQkweDIJLyogNzIxMyB0cmFuc2NlaXZlciAqLworI2RlZmluZSBIUDEwMF9YQ1ZSXzgyNTAzCTB4MwkvKiA4MjUwMyB0cmFuc2NlaXZlciAqLworCisvKgorICogIDEwME1CIExBTiBUcmFpbmluZyBSZWdpc3RlcgorICogKFBhZ2UgTUFDX0NUUkwsIFZHX0xBTl9DRkdfMiwgT2Zmc2V0IDB4MGIpIChvbGQsIHByZSA4MDIuMTIpCisgKi8KKyNkZWZpbmUgSFAxMDBfRlJBTUVfRk9STUFUCTB4MDgJLyogMDo4MDIuMywgMTo4MDIuNSBmcmFtZXMgKi8KKyNkZWZpbmUgSFAxMDBfQlJJREdFCQkweDA0CS8qIDA6Tm8sIDE6WWVzIHRlbGwgaHViIGkgYW0gYSBicmlkZ2UgKi8KKyNkZWZpbmUgSFAxMDBfUFJPTV9NT0RFCQkweDAyCS8qIDA6Tm8sIDE6WWVzIHRlbGwgaHViIGNhcmQgaXMgKi8KKwkJCQkJLyogICAgICAgICBwcm9taXNjdW91cyAqLworI2RlZmluZSBIUDEwMF9SRVBFQVRFUgkJMHgwMQkvKiAwOk5vLCAxOlllcyB0ZWxsIGh1YiBNQUMgd2FudHMgdG8gKi8KKwkJCQkJLyogICAgICAgICBiZSBhIGNhc2NhZGVkIHJlcGVhdGVyICovCisKKy8qCisgKiAxMDBNQiBMQU4gQ29udHJvbCBhbmQgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorICogKFBhZ2UgTUFDX0NUUkwsIFZHX0xBTl9DRkdfMSwgT2Zmc2V0IDB4MGEpIAorICovCisjZGVmaW5lIEhQMTAwX1ZHX1NFTAkgICAgICAgIDB4ODAJLyogMDpObywgMTpZZXMgdXNlIDEwMCBNYml0IE1BQyAqLworI2RlZmluZSBIUDEwMF9MSU5LX1VQX1NUCTB4NDAJLyogMDpObywgMTpZZXMgZW5kbm9kZSBsb2dnZWQgaW4gKi8KKyNkZWZpbmUgSFAxMDBfTElOS19DQUJMRV9TVAkweDIwCS8qIDA6Tm8sIDE6WWVzIGNhYmxlIGNhbiBoZWFyIHRvbmVzICovCisJCQkJCS8qICAgICAgICAgZnJvbSAgaHViICovCisjZGVmaW5lIEhQMTAwX0xPQURfQUREUgkJMHgxMAkvKiAwLT4xIGNhcmQgYWRkciB3aWxsIGJlIHNlbnQgICovCisJCQkJCS8qIDEwMG1zIGxhdGVyIHRoZSBsaW5rIHN0YXR1cyAgKi8KKwkJCQkJLyogYml0cyBhcmUgdmFsaWQgKi8KKyNkZWZpbmUgSFAxMDBfTElOS19DTUQJCTB4MDgJLyogMC0+MSBsaW5rIHdpbGwgYXR0ZW1wdCB0byBsb2cgaW4uICovCisJCQkJCS8qIDEwMG1zIGxhdGVyIHRoZSBsaW5rIHN0YXR1cyAqLworCQkJCQkvKiBiaXRzIGFyZSB2YWxpZCAqLworI2RlZmluZSBIUDEwMF9UUk5fRE9ORSAgICAgICAgICAweDA0CS8qIE5FVyBFVFItQ2hpcHMgb25seTogV2lsbCBiZSByZXNldCAqLworCQkJCQkvKiBhZnRlciBMaW5rVXAgQ21kIGlzIGdpdmVuIGFuZCBzZXQgKi8KKwkJCQkJLyogd2hlbiB0cmFpbmluZyBoYXMgY29tcGxldGVkLiAqLworI2RlZmluZSBIUDEwMF9MSU5LX0dPT0RfU1QJMHgwMgkvKiAwOk5vLCAxOlllcyBjYWJsZSBwYXNzZWQgdHJhaW5pbmcgKi8KKyNkZWZpbmUgSFAxMDBfVkdfUkVTRVQJCTB4MDEJLyogMDpZZXMsIDE6Tm8gcmVzZXQgdGhlIDEwMFZHIE1BQyAqLworCisKKy8qCisgKiAgTUFDIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgSQorICogKFBhZ2UgTUFDX0NUUkwsIE1BQ19DRkdfMSwgT2Zmc2V0IDB4MGMpCisgKi8KKyNkZWZpbmUgSFAxMDBfUlhfSURMRQkJMHg4MAkvKiAwOlllcywgMTpObyBjdXJyZW50bHkgcmVjZWl2aW5nIHBrdHMgKi8KKyNkZWZpbmUgSFAxMDBfVFhfSURMRQkJMHg0MAkvKiAwOlllcywgMTpObyBjdXJyZW50bHkgVHhpbmcgcGt0cyAqLworI2RlZmluZSBIUDEwMF9SWF9FTgkJMHgyMAkvKiAxOiBhbGxvdyByZWNlaXZpbmcgb2YgcGt0cyAqLworI2RlZmluZSBIUDEwMF9UWF9FTgkJMHgxMAkvKiAxOiBhbGxvdyB0cmFuc21pdHRpbmcgb2YgcGt0cyAqLworI2RlZmluZSBIUDEwMF9BQ0NfRVJST1JFRAkweDA4CS8qIDA6Tm8sIDE6WWVzIGFsbG93IFJ4IG9mIGVycm9yZWQgcGt0cyAqLworI2RlZmluZSBIUDEwMF9BQ0NfTUMJCTB4MDQJLyogMDpObywgMTpZZXMgYWxsb3cgUnggb2YgbXVsdGljYXN0IHBrdHMgKi8KKyNkZWZpbmUgSFAxMDBfQUNDX0JDCQkweDAyCS8qIDA6Tm8sIDE6WWVzIGFsbG93IFJ4IG9mIGJyb2FkY2FzdCBwa3RzICovCisjZGVmaW5lIEhQMTAwX0FDQ19QSFkJCTB4MDEJLyogMDpObywgMTpZZXMgYWxsb3cgUnggb2YgQUxMIHBoeXMuIHBrdHMgKi8KKyNkZWZpbmUgSFAxMDBfTUFDMU1PREVNQVNLCTB4ZjAJLyogSGlkZSBBQ0MgYml0cyAqLworI2RlZmluZSBIUDEwMF9NQUMxTU9ERTEJCTB4MDAJLyogUmVjZWl2ZSBub3RoaW5nLCBtdXN0IGFsc28gZGlzYWJsZSBSWCAqLworI2RlZmluZSBIUDEwMF9NQUMxTU9ERTIJCTB4MDAKKyNkZWZpbmUgSFAxMDBfTUFDMU1PREUzCQlIUDEwMF9NQUMxTU9ERTIgfCBIUDEwMF9BQ0NfQkMKKyNkZWZpbmUgSFAxMDBfTUFDMU1PREU0CQlIUDEwMF9NQUMxTU9ERTMgfCBIUDEwMF9BQ0NfTUMKKyNkZWZpbmUgSFAxMDBfTUFDMU1PREU1CQlIUDEwMF9NQUMxTU9ERTQJLyogc2V0IG1jIGhhc2ggdG8gYWxsIG9uZXMgYWxzbyAqLworI2RlZmluZSBIUDEwMF9NQUMxTU9ERTYJCUhQMTAwX01BQzFNT0RFNSB8IEhQMTAwX0FDQ19QSFkJLyogUHJvbWlzY3VvdXMgKi8KKy8qIE5vdGUgTU9ERTYgd2lsbCByZWNlaXZlIGFsbCBHT09EIHBhY2tldHMgb24gdGhlIExBTi4gVGhpcyByZWFsbHkgbmVlZHMKKyAgIGEgbW9kZSA3IGRlZmluZWQgdG8gYmUgTEFOIEFuYWx5emVyIG1vZGUsIHdoaWNoIHdpbGwgcmVjZWl2ZSBlcnJvcmVkIGFuZAorICAgcnVudCBwYWNrZXRzLCBhbmQga2VlcCB0aGUgQ1JDIGJ5dGVzLiAqLworI2RlZmluZSBIUDEwMF9NQUMxTU9ERTcJCUhQMTAwX01BQzFNT0RFNiB8IEhQMTAwX0FDQ19FUlJPUkVECisKKy8qCisgKiAgTUFDIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgSUkgCisgKiAoUGFnZSBNQUNfQ1RSTCwgTUFDX0NGR18yLCBPZmZzZXQgMHgwZCkKKyAqLworI2RlZmluZSBIUDEwMF9UUl9NT0RFCQkweDgwCS8qIDA6Tm8sIDE6WWVzIHN1cHBvcnQgVG9rZW4gUmluZyBmb3JtYXRzICovCisjZGVmaW5lIEhQMTAwX1RYX1NBTUUJCTB4NDAJLyogMDpObywgMTpZZXMgVHggc2FtZSBwYWNrZXQgY29udGludW91cyAqLworI2RlZmluZSBIUDEwMF9MQktfWENWUgkJMHgyMAkvKiAwOk5vLCAxOlllcyBsb29wYmFjayB0aHJvdWdoIE1BQyAmICovCisJCQkJCS8qICAgdHJhbnNjZWl2ZXIgKi8KKyNkZWZpbmUgSFAxMDBfTEJLX01BQwkJMHgxMAkvKiAwOk5vLCAxOlllcyBsb29wYmFjayB0aHJvdWdoIE1BQyAqLworI2RlZmluZSBIUDEwMF9DUkNfSQkJMHgwOAkvKiAwOk5vLCAxOlllcyBpbmhpYml0IENSQyBvbiBUeCBwYWNrZXRzICovCisjZGVmaW5lIEhQMTAwX0FDQ05BICAgICAgICAgICAgIDB4MDQJLyogMTogRm9yIDgwMi41OiBBY2NlcHQgb25seSB0b2tlbiByaW5nCisJCQkJCSAqIGdyb3VwIGFkZHIgdGhhdCBtYWNoZXMgTkEgbWFzayAqLworI2RlZmluZSBIUDEwMF9LRUVQX0NSQwkJMHgwMgkvKiAwOk5vLCAxOlllcyBrZWVwIENSQyBvbiBSeCBwYWNrZXRzLiAqLworCQkJCQkvKiAgIFRoZSBsZW5ndGggd2lsbCByZWZsZWN0IHRoaXMuICovCisjZGVmaW5lIEhQMTAwX0FDQ0ZBICAgICAgICAgICAgIDB4MDEJLyogMTogRm9yIDgwMi41OiBBY2NlcHQgb25seSBmdW5jdGlvbmFsCisJCQkJCSAqIGFkZHJzIHRoYXQgbWF0Y2ggRkEgbWFzayAocGFnZTEpICovCisjZGVmaW5lIEhQMTAwX01BQzJNT0RFTUFTSwkweDAyCisjZGVmaW5lIEhQMTAwX01BQzJNT0RFMQkJMHgwMAorI2RlZmluZSBIUDEwMF9NQUMyTU9ERTIJCTB4MDAKKyNkZWZpbmUgSFAxMDBfTUFDMk1PREUzCQkweDAwCisjZGVmaW5lIEhQMTAwX01BQzJNT0RFNAkJMHgwMAorI2RlZmluZSBIUDEwMF9NQUMyTU9ERTUJCTB4MDAKKyNkZWZpbmUgSFAxMDBfTUFDMk1PREU2CQkweDAwCisjZGVmaW5lIEhQMTAwX01BQzJNT0RFNwkJS0VFUF9DUkMKKworLyoKKyAqIE1BQyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIElJSSAKKyAqIChQYWdlIE1BQ19DVFJMLCBNQUNfQ0ZHXzMsIE9mZnNldCAweDBlKSAKKyAqLworI2RlZmluZSBIUDEwMF9QQUNLRVRfUEFDRSAgICAgICAweDAzCS8qIFBhY2tldCBQYWNpbmc6CisJCQkJCSAqIDAwOiBObyBwYWNrZXQgcGFjaW5nCisJCQkJCSAqIDAxOiA4IHRvIDE2IHVTIGRlbGF5CisJCQkJCSAqIDEwOiAxNiB0byAzMiB1UyBkZWxheQorCQkJCQkgKiAxMTogMzIgdG8gNjQgdVMgZGVsYXkKKwkJCQkJICovCisjZGVmaW5lIEhQMTAwX0xSRl9FTiAgICAgICAgICAgIDB4MDQJLyogMTogRXh0ZXJuYWwgTEFOIFJjdiBGaWx0ZXIgYW5kCisJCQkJCSAqIFRDUC9JUCBDaGVja3N1bW1pbmcgZW5hYmxlZC4gKi8KKyNkZWZpbmUgSFAxMDBfQVVUT19NT0RFICAgICAgICAgMHgxMAkvKiAxOiBBdXRvU2VsZWN0IGJldHdlZW4gMTAvMTAwICovCisKKy8qCisgKiBNQUMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciBJViAKKyAqIChQYWdlIE1BQ19DVFJMLCBNQUNfQ0ZHXzQsIE9mZnNldCAweDBmKQorICovCisjZGVmaW5lIEhQMTAwX01BQ19TRUxfU1QgICAgICAgIDB4MDEJLyogKFIpOiBTdGF0dXMgb2YgZXh0ZXJuYWwgVkdTRUwKKwkJCQkJICogU2lnbmFsLCAxPTEwMFZHLCAwPTEwTWJpdCBzZWwuICovCisjZGVmaW5lIEhQMTAwX0xJTktfRkFJTF9TVCAgICAgIDB4MDIJLyogKFIpOiBTdGF0dXMgb2YgTGluayBGYWlsIHBvcnRpb24KKwkJCQkJICogb2YgdGhlIE1pc2MuIEludGVycnVwdCAqLworCisvKiAKKyAqICAxMDAgTUIgTEFOIFRyYWluaW5nIFJlcXVlc3QvQWxsb3dlZCBSZWdpc3RlcnMgCisgKiAoUGFnZSBNQUNfQ1RSTCwgVFJBSU5fUkVRVUVTVCBhbmQgVFJBSU5fQUxMT1csIE9mZnNldCAweDE0LTB4MTYpKEVUUiBwYXJ0cyBvbmx5KQorICovCisjZGVmaW5lIEhQMTAwX01BQ1JRX1JFUEVBVEVSICAgICAgICAgMHgwMDAxCS8qIDE6IE1BQyB0ZWxscyBIVUIgaXQgd2FudHMgdG8gYmUgCisJCQkJCQkgKiAgICBhIGNhc2NhZGVkIHJlcGVhdGVyCisJCQkJCQkgKiAwOiAuLi4gd2FudHMgdG8gYmUgYSBEVEUgKi8KKyNkZWZpbmUgSFAxMDBfTUFDUlFfUFJPTVNDICAgICAgICAgICAweDAwMDYJLyogMiBiaXRzOiBQcm9taXNjaW91cyBtb2RlCisJCQkJCQkgKiAwMDogUmN2IG9ubHkgdW5pY2FzdCBwYWNrZXRzCisJCQkJCQkgKiAgICAgc3BlY2lmaWNhbGx5IGFkZHIgdG8gdGhpcworCQkJCQkJICogICAgIGVuZG5vZGUKKwkJCQkJCSAqIDEwOiBSY3YgYWxsIHBja3RzIGZ3ZGVkIGJ5IAorCQkJCQkJICogICAgIHRoZSBsb2NhbCByZXBlYXRlciAqLworI2RlZmluZSBIUDEwMF9NQUNSUV9GUkFNRUZNVF9FSVRIRVIgIDB4MDAxOAkvKiAxMTogZWl0aGVyIGZvcm1hdCBhbGxvd2VkICovCisjZGVmaW5lIEhQMTAwX01BQ1JRX0ZSQU1FRk1UXzgwMl8zICAgMHgwMDAwCS8qIDAwOiA4MDIuMyBpcyByZXF1ZXN0ZWQgKi8KKyNkZWZpbmUgSFAxMDBfTUFDUlFfRlJBTUVGTVRfODAyXzUgICAweDAwMTAJLyogMTA6IDgwMi41IGZvcm1hdCBpcyByZXF1ZXN0ZWQgKi8KKyNkZWZpbmUgSFAxMDBfQ0FSRF9NQUNWRVIgICAgICAgICAgICAweGUwMDAJLyogUjogMyBiaXQgQ2FyZHMgMTAwVkcgTUFDIHZlcnNpb24gKi8KKyNkZWZpbmUgSFAxMDBfTUFMTE9XX1JFUEVBVEVSICAgICAgICAweDAwMDEJLyogSWYgcmVzZXQsIHJlcXVlc3RlZCBhY2Nlc3MgYXMgYW4KKwkJCQkJCSAqIGVuZCBub2RlIGlzIGFsbG93ZWQgKi8KKyNkZWZpbmUgSFAxMDBfTUFMTE9XX1BST01TQyAgICAgICAgICAweDAwMDQJLyogMiBiaXRzOiBQcm9taXNjaW91cyBtb2RlCisJCQkJCQkgKiAwMDogUmN2IG9ubHkgdW5pY2FzdCBwYWNrZXRzCisJCQkJCQkgKiAgICAgc3BlY2lmaWNhbGx5IGFkZHIgdG8gdGhpcworCQkJCQkJICogICAgIGVuZG5vZGUKKwkJCQkJCSAqIDEwOiBSY3YgYWxsIHBja3RzIGZ3ZGVkIGJ5IAorCQkJCQkJICogICAgIHRoZSBsb2NhbCByZXBlYXRlciAqLworI2RlZmluZSBIUDEwMF9NQUxMT1dfRlJBTUVGTVQgICAgICAgIDB4MDBlMAkvKiAyIGJpdHM6IEZyYW1lIEZvcm1hdAorCQkJCQkJICogMDA6IDgwMi4zIGZvcm1hdCB3aWxsIGJlIHVzZWQKKwkJCQkJCSAqIDEwOiA4MDIuNSBmb3JtYXQgd2lsbCBiZSB1c2VkICovCisjZGVmaW5lIEhQMTAwX01BTExPV19BQ0NERU5JRUQgICAgICAgMHgwNDAwCS8qIE4gYml0ICovCisjZGVmaW5lIEhQMTAwX01BTExPV19DT05GSUdVUkUgICAgICAgMHgwZjAwCS8qIEMgYml0ICovCisjZGVmaW5lIEhQMTAwX01BTExPV19EVVBBRERSICAgICAgICAgMHgxMDAwCS8qIEQgYml0ICovCisjZGVmaW5lIEhQMTAwX0hVQl9NQUNWRVIgICAgICAgICAgICAgMHhlMDAwCS8qIFI6IDMgYml0IDgwMi4xMiBNQUMvUk1BQyB0cmFpbmluZyAqLworCQkJCQkgICAgIC8qICAgIHByb3RvY29sIG9mIHJlcGVhdGVyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKgorICogIFNldC9SZXNldCBiaXRzCisgKi8KKyNkZWZpbmUgSFAxMDBfU0VUX0hCCQkweDAxMDAJLyogMDpTZXQgZmllbGRzIHRvIDAgd2hvc2UgbWFzayBpcyAxICovCisjZGVmaW5lIEhQMTAwX1NFVF9MQgkJMHgwMDAxCS8qIEhCIHNldHMgdXBwZXIgYnl0ZSwgTEIgc2V0cyBsb3dlciBieXRlICovCisjZGVmaW5lIEhQMTAwX1JFU0VUX0hCCQkweDAwMDAJLyogRm9yIHJlYWRhYmlsaXR5IHdoZW4gcmVzZXR0aW5nIGJpdHMgKi8KKyNkZWZpbmUgSFAxMDBfUkVTRVRfTEIJCTB4MDAwMAkvKiBGb3IgcmVhZGFiaWxpdHkgd2hlbiByZXNldHRpbmcgYml0cyAqLworCisvKgorICogIE1pc2MuIENvbnN0YW50cworICovCisjZGVmaW5lIEhQMTAwX0xBTl8xMDAJCTEwMAkvKiBsYW5fdHlwZSB2YWx1ZSBmb3IgVkcgKi8KKyNkZWZpbmUgSFAxMDBfTEFOXzEwCQkxMAkvKiBsYW5fdHlwZSB2YWx1ZSBmb3IgMTBCYXNlVCAqLworI2RlZmluZSBIUDEwMF9MQU5fQ09BWAkJOQkvKiBsYW5fdHlwZSB2YWx1ZSBmb3IgQ29heCAqLworI2RlZmluZSBIUDEwMF9MQU5fRVJSCQkoLTEpCS8qIGxhbl90eXBlIHZhbHVlIGZvciBsaW5rIGRvd24gKi8KKworLyogCisgKiBCdXMgTWFzdGVyIERhdGEgU3RydWN0dXJlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNkZWZpbmUgTUFYX1JYX1BETCAgICAgICAgICAgICAgMzAJLyogQ2FyZCBsaW1pdCA9IDMxICovCisjZGVmaW5lIE1BWF9SWF9GUkFHICAgICAgICAgICAgIDIJLyogRG9uJ3QgbmVlZCBtb3JlLi4uICovCisjZGVmaW5lIE1BWF9UWF9QREwgICAgICAgICAgICAgIDI5CisjZGVmaW5lIE1BWF9UWF9GUkFHICAgICAgICAgICAgIDIJLyogTGltaXQgPSAzMSAqLworCisvKiBEZWZpbmUgdG90YWwgUERMIGFyZWEgc2l6ZSBpbiBieXRlcyAoc2hvdWxkIGJlIDQwOTYpICovCisvKiBUaGlzIGlzIHRoZSBzaXplIG9mIGtlcm5lbCAoZG1hKSBtZW1vcnkgdGhhdCB3aWxsIGJlIGFsbG9jYXRlZC4gKi8KKyNkZWZpbmUgTUFYX1JJTkdTSVpFICgoTUFYX1JYX0ZSQUcqOCs0KzQpKk1BWF9SWF9QREwrKE1BWF9UWF9GUkFHKjgrNCs0KSpNQVhfVFhfUERMKSsxNgorCisvKiBFdGhlcm5ldCBQYWNrZXQgU2l6ZXMgKi8KKyNkZWZpbmUgTUlOX0VUSEVSX1NJWkUgICAgICAgICAgNjAKKyNkZWZpbmUgTUFYX0VUSEVSX1NJWkUgICAgICAgICAgMTUxNAkvKiBOZWVkZWQgZm9yIHByZWFsbG9jYXRpb24gb2YgKi8KKwkJCQkJLyogc2tiIGJ1ZmZlciB3aGVuIGJ1c21hc3RlcmluZyAqLworCisvKiBUeCBvciBSeCBSaW5nIEVudHJ5ICovCit0eXBlZGVmIHN0cnVjdCBocDEwMF9yaW5nIHsKKwl1X2ludCAqcGRsOwkJLyogQWRkcmVzcyBvZiBQRExzIFBESCwgZHdvcmQgYmVmb3JlCisJCQkJICogdGhpcyBhZGRyZXNzIGlzIHVzZWQgZm9yIHJ4IGhkciAqLworCXVfaW50IHBkbF9wYWRkcjsJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiBQREwgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBocDEwMF9yaW5nICpuZXh0OworfSBocDEwMF9yaW5nX3Q7CisKKworCisvKiBNYXNrIGZvciBIZWFkZXIgRGVzY3JpcHRvciAqLworI2RlZmluZSBIUDEwMF9QS1RfTEVOX01BU0sJMHgxRkZGCS8qIEFORCB3aXRoIFJ4TGVuZ3RoIHRvIGdldCBsZW5ndGggKi8KKworCisvKiBSZWNlaXZlIFBhY2tldCBTdGF0dXMuICBOb3RlLCB0aGUgZXJyb3IgYml0cyBhcmUgb25seSB2YWxpZCBpZiBBQ0NfRVJST1JFRCAKKyAgIGJpdCBpbiB0aGUgTUFDIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMSBpcyBzZXQuICovCisjZGVmaW5lIEhQMTAwX1JYX1BSSQkJMHg4MDAwCS8qIDA6Tm8sIDE6WWVzIHBhY2tldCBpcyBwcmlvcml0eSAqLworI2RlZmluZSBIUDEwMF9TREZfRVJSCQkweDQwMDAJLyogMDpObywgMTpZZXMgc3RhcnQgb2YgZnJhbWUgZXJyb3IgKi8KKyNkZWZpbmUgSFAxMDBfU0tFV19FUlIJCTB4MjAwMAkvKiAwOk5vLCAxOlllcyBza2V3IG91dCBvZiByYW5nZSAqLworI2RlZmluZSBIUDEwMF9CQURfU1lNQk9MX0VSUgkweDEwMDAJLyogMDpObywgMTpZZXMgaW52YWxpZCBzeW1ib2wgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgSFAxMDBfUkNWX0lQTV9FUlIJMHgwODAwCS8qIDA6Tm8sIDE6WWVzIHBrdCBoYWQgYW4gaW52YWxpZCBwYWNrZXQgKi8KKwkJCQkJLyogICBtYXJrZXIgKi8KKyNkZWZpbmUgSFAxMDBfU1lNQk9MX0JBTF9FUlIJMHgwNDAwCS8qIDA6Tm8sIDE6WWVzIHN5bWJvbCBiYWxhbmNlIGVycm9yICovCisjZGVmaW5lIEhQMTAwX1ZHX0FMTl9FUlIJMHgwMjAwCS8qIDA6Tm8sIDE6WWVzIG5vbi1vY3RldCByZWNlaXZlZCAqLworI2RlZmluZSBIUDEwMF9UUlVOQ19FUlIJCTB4MDEwMAkvKiAwOk5vLCAxOlllcyB0aGUgcGFja2V0IHdhcyB0cnVuY2F0ZWQgKi8KKyNkZWZpbmUgSFAxMDBfUlVOVF9FUlIJCTB4MDA0MAkvKiAwOk5vLCAxOlllcyBwa3QgbGVuZ3RoIDwgTWluIFBrdCAqLworCQkJCQkvKiAgIExlbmd0aCBSZWcuICovCisjZGVmaW5lIEhQMTAwX0FMTl9FUlIJCTB4MDAxMAkvKiAwOk5vLCAxOlllcyBhbGlnbiBlcnJvci4gKi8KKyNkZWZpbmUgSFAxMDBfQ1JDX0VSUgkJMHgwMDA4CS8qIDA6Tm8sIDE6WWVzIENSQyBvY2N1cnJlZC4gKi8KKworLyogVGhlIGxhc3QgdGhyZWUgYml0cyBpbmRpY2F0ZSB0aGUgdHlwZSBvZiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisKKyNkZWZpbmUgSFAxMDBfTVVMVElfQUREUl9IQVNICTB4MDAwNgkvKiAxMTA6IEFkZHIgbXVsdGljYXN0LCBtYXRjaGVkIGhhc2ggKi8KKyNkZWZpbmUgSFAxMDBfQlJPQURDQVNUX0FERFIJMHgwMDAzCS8qIHgxMTogQWRkciBicm9hZGNhc3QgKi8KKyNkZWZpbmUgSFAxMDBfTVVMVElfQUREUl9OT19IQVNIIDB4MDAwMgkvKiAwMTA6IEFkZHIgbXVsdGljYXN0LCBkaWRuJ3QgbWF0Y2ggaGFzaCAqLworI2RlZmluZSBIUDEwMF9QSFlTX0FERFJfTUFUQ0gJMHgwMDAxCS8qIHgwMTogQWRkciB3YXMgcGh5c2ljYWwgYW5kIG1pbmUgKi8KKyNkZWZpbmUgSFAxMDBfUEhZU19BRERSX05PX01BVENIIDB4MDAwMAkvKiB4MDA6IEFkZHIgd2FzIHBoeXNpY2FsIGJ1dCBub3QgbWluZSAqLworCisvKgorICogIG1hY3JvcworICovCisKKyNkZWZpbmUgaHAxMDBfaW5iKCByZWcgKSBcCisgICAgICAgIGluYiggaW9hZGRyICsgSFAxMDBfUkVHXyMjcmVnICkKKyNkZWZpbmUgaHAxMDBfaW53KCByZWcgKSBcCisJaW53KCBpb2FkZHIgKyBIUDEwMF9SRUdfIyNyZWcgKQorI2RlZmluZSBocDEwMF9pbmwoIHJlZyApIFwKKwlpbmwoIGlvYWRkciArIEhQMTAwX1JFR18jI3JlZyApCisjZGVmaW5lIGhwMTAwX291dGIoIGRhdGEsIHJlZyApIFwKKwlvdXRiKCBkYXRhLCBpb2FkZHIgKyBIUDEwMF9SRUdfIyNyZWcgKQorI2RlZmluZSBocDEwMF9vdXR3KCBkYXRhLCByZWcgKSBcCisJb3V0dyggZGF0YSwgaW9hZGRyICsgSFAxMDBfUkVHXyMjcmVnICkKKyNkZWZpbmUgaHAxMDBfb3V0bCggZGF0YSwgcmVnICkgXAorCW91dGwoIGRhdGEsIGlvYWRkciArIEhQMTAwX1JFR18jI3JlZyApCisjZGVmaW5lIGhwMTAwX29yYiggZGF0YSwgcmVnICkgXAorCW91dGIoIGluYiggaW9hZGRyICsgSFAxMDBfUkVHXyMjcmVnICkgfCAoZGF0YSksIGlvYWRkciArIEhQMTAwX1JFR18jI3JlZyApCisjZGVmaW5lIGhwMTAwX29ydyggZGF0YSwgcmVnICkgXAorCW91dHcoIGludyggaW9hZGRyICsgSFAxMDBfUkVHXyMjcmVnICkgfCAoZGF0YSksIGlvYWRkciArIEhQMTAwX1JFR18jI3JlZyApCisjZGVmaW5lIGhwMTAwX2FuZGIoIGRhdGEsIHJlZyApIFwKKwlvdXRiKCBpbmIoIGlvYWRkciArIEhQMTAwX1JFR18jI3JlZyApICYgKGRhdGEpLCBpb2FkZHIgKyBIUDEwMF9SRUdfIyNyZWcgKQorI2RlZmluZSBocDEwMF9hbmR3KCBkYXRhLCByZWcgKSBcCisJb3V0dyggaW53KCBpb2FkZHIgKyBIUDEwMF9SRUdfIyNyZWcgKSAmIChkYXRhKSwgaW9hZGRyICsgSFAxMDBfUkVHXyMjcmVnICkKKworI2RlZmluZSBocDEwMF9wYWdlKCBwYWdlICkgXAorCW91dHcoIEhQMTAwX1BBR0VfIyNwYWdlLCBpb2FkZHIgKyBIUDEwMF9SRUdfUEFHSU5HICkKKyNkZWZpbmUgaHAxMDBfaW50c19vZmYoKSBcCisJb3V0dyggSFAxMDBfSU5UX0VOIHwgSFAxMDBfUkVTRVRfTEIsIGlvYWRkciArIEhQMTAwX1JFR19PUFRJT05fTFNXICkKKyNkZWZpbmUgaHAxMDBfaW50c19vbigpIFwKKwlvdXR3KCBIUDEwMF9JTlRfRU4gfCBIUDEwMF9TRVRfTEIsIGlvYWRkciArIEhQMTAwX1JFR19PUFRJT05fTFNXICkKKyNkZWZpbmUgaHAxMDBfbWVtX21hcF9lbmFibGUoKSBcCisJb3V0dyggSFAxMDBfTU1BUF9ESVMgfCBIUDEwMF9SRVNFVF9IQiwgaW9hZGRyICsgSFAxMDBfUkVHX09QVElPTl9MU1cgKQorI2RlZmluZSBocDEwMF9tZW1fbWFwX2Rpc2FibGUoKSBcCisJb3V0dyggSFAxMDBfTU1BUF9ESVMgfCBIUDEwMF9TRVRfSEIsIGlvYWRkciArIEhQMTAwX1JFR19PUFRJT05fTFNXICkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hwbGFuY2UuYyBiL2RyaXZlcnMvbmV0L2hwbGFuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODcwM2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaHBsYW5jZS5jCkBAIC0wLDAgKzEsMjMxIEBACisvKiBocGxhbmNlLmMgIDogdGhlICBMaW51eC9ocDMwMC9sYW5jZSBldGhlcm5ldCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDA1LzE5OTggUGV0ZXIgTWF5ZGVsbCA8cG1heWRlbGxAY2hpYXJrLmdyZWVuZW5kLm9yZy51az4KKyAqIEJhc2VkIG9uIHRoZSBTdW4gTGFuY2UgZHJpdmVyIGFuZCB0aGUgTmV0QlNEIEhQIExhbmNlIGRyaXZlcgorICogVXNlcyB0aGUgZ2VuZXJpYyA3OTkwLmMgTEFOQ0UgY29kZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKy8qIFVzZWQgZm9yIHRoZSB0ZW1wb3JhbCBpbmV0IGVudHJpZXMgYW5kIHJvdXRpbmcgKi8KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Rpby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKworI2luY2x1ZGUgImhwbGFuY2UuaCIKKworLyogV2UgaGF2ZSAxNjgzNCBieXRlcyBvZiBSQU0gZm9yIHRoZSBpbml0IGJsb2NrIGFuZCBidWZmZXJzLiBUaGlzIHBsYWNlcworICogYW4gdXBwZXIgbGltaXQgb24gdGhlIG51bWJlciBvZiBidWZmZXJzIHdlIGNhbiB1c2UuIE5ldEJTRCB1c2VzIDggUngKKyAqIGJ1ZmZlcnMgYW5kIDIgVHggYnVmZmVycy4KKyAqLworI2RlZmluZSBMQU5DRV9MT0dfVFhfQlVGRkVSUyAxCisjZGVmaW5lIExBTkNFX0xPR19SWF9CVUZGRVJTIDMKKworI2luY2x1ZGUgIjc5OTAuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2UgZ2VuZXJpYyBMQU5DRSBjb2RlICovCisKKy8qIE91ciBwcml2YXRlIGRhdGEgc3RydWN0dXJlICovCitzdHJ1Y3QgaHBsYW5jZV9wcml2YXRlIHsKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSBsYW5jZTsKK307CisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMuLi4gVGhpcyBpcyBlYXN5IGJlY2F1c2UgYWxsIHRoZSBncm90IGlzIGluIHRoZQorICogZ2VuZXJpYyBMQU5DRSBzdXBwb3J0LiBBbGwgd2UgaGF2ZSB0byBzdXBwb3J0IGlzIHByb2JpbmcgZm9yIGJvYXJkcywKKyAqIHBsdXMgYm9hcmQtc3BlY2lmaWMgaW5pdCwgb3BlbiBhbmQgY2xvc2UgYWN0aW9ucy4gCisgKiBPaCwgYW5kIHdlIG5lZWQgdG8gdGVsbCB0aGUgZ2VuZXJpYyBjb2RlIGhvdyB0byByZWFkIGFuZCB3cml0ZSBMQU5DRSByZWdpc3RlcnMuLi4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgaHBsYW5jZV9pbml0X29uZShzdHJ1Y3QgZGlvX2RldiAqZCwKKwkJCQljb25zdCBzdHJ1Y3QgZGlvX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBocGxhbmNlX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCisJCQkJc3RydWN0IGRpb19kZXYgKmQpOworc3RhdGljIHZvaWQgX19kZXZleGl0IGhwbGFuY2VfcmVtb3ZlX29uZShzdHJ1Y3QgZGlvX2RldiAqZCk7CitzdGF0aWMgdm9pZCBocGxhbmNlX3dyaXRlcmFwKHZvaWQgKnByaXYsIHVuc2lnbmVkIHNob3J0IHZhbHVlKTsKK3N0YXRpYyB2b2lkIGhwbGFuY2Vfd3JpdGVyZHAodm9pZCAqcHJpdiwgdW5zaWduZWQgc2hvcnQgdmFsdWUpOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGhwbGFuY2VfcmVhZHJkcCh2b2lkICpwcml2KTsKK3N0YXRpYyBpbnQgaHBsYW5jZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBocGxhbmNlX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgc3RydWN0IGRpb19kZXZpY2VfaWQgaHBsYW5jZV9kaW9fdGJsW10gPSB7CisJeyBESU9fSURfTEFOIH0sCisJeyAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZGlvX2RyaXZlciBocGxhbmNlX2RyaXZlciA9IHsKKwkubmFtZSAgICAgID0gImhwbGFuY2UiLAorCS5pZF90YWJsZSAgPSBocGxhbmNlX2Rpb190YmwsCisJLnByb2JlICAgICA9IGhwbGFuY2VfaW5pdF9vbmUsCisJLnJlbW92ZSAgICA9IF9fZGV2ZXhpdF9wKGhwbGFuY2VfcmVtb3ZlX29uZSksCit9OworCisvKiBGaW5kIGFsbCB0aGUgSFAgTGFuY2UgYm9hcmRzIGFuZCBpbml0aWFsaXNlIHRoZW0uLi4gKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGhwbGFuY2VfaW5pdF9vbmUoc3RydWN0IGRpb19kZXYgKmQsCisJCQkJY29uc3Qgc3RydWN0IGRpb19kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBlcnIgPSAtRU5PTUVNOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBocGxhbmNlX3ByaXZhdGUpKTsKKwlpZiAoIWRldikKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRUJVU1k7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oZGlvX3Jlc291cmNlX3N0YXJ0KGQpLAorCQkJCWRpb19yZXNvdXJjZV9sZW4oZCksIGQtPm5hbWUpKQorCQlnb3RvIG91dF9mcmVlX25ldGRldjsKKworCWhwbGFuY2VfaW5pdChkZXYsIGQpOworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjsKKworCWRpb19zZXRfZHJ2ZGF0YShkLCBkZXYpOworCXJldHVybiAwOworCisgb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjoKKwlyZWxlYXNlX21lbV9yZWdpb24oZGlvX3Jlc291cmNlX3N0YXJ0KGQpLCBkaW9fcmVzb3VyY2VfbGVuKGQpKTsKKyBvdXRfZnJlZV9uZXRkZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKKyBvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGhwbGFuY2VfcmVtb3ZlX29uZShzdHJ1Y3QgZGlvX2RldiAqZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGlvX2dldF9kcnZkYXRhKGQpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlyZWxlYXNlX21lbV9yZWdpb24oZGlvX3Jlc291cmNlX3N0YXJ0KGQpLCBkaW9fcmVzb3VyY2VfbGVuKGQpKTsKKwlmcmVlX25ldGRldihkZXYpOworfQorCisvKiBJbml0aWFsaXNlIGEgc2luZ2xlIGxhbmNlIGJvYXJkIGF0IHRoZSBnaXZlbiBESU8gZGV2aWNlICovCitzdGF0aWMgdm9pZCBfX2luaXQgaHBsYW5jZV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBkaW9fZGV2ICpkKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIHZhID0gKGQtPnJlc291cmNlLnN0YXJ0ICsgRElPX1ZJUkFERFJCQVNFKTsKKyAgICAgICAgc3RydWN0IGhwbGFuY2VfcHJpdmF0ZSAqbHA7CisgICAgICAgIGludCBpOworICAgICAgICAKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzOyBzZWxlY3QgY29kZSAlZCwgYWRkciIsIGRldi0+bmFtZSwgZC0+bmFtZSwgZC0+c2NvZGUpOworCisgICAgICAgIC8qIHJlc2V0IHRoZSBib2FyZCAqLworICAgICAgICBvdXRfOCh2YStESU9fSURPRkYsIDB4ZmYpOworICAgICAgICB1ZGVsYXkoMTAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcmliYSEgYXJpYmEhIHVkZWxheSEgdWRlbGF5ISAqLworCisgICAgICAgIC8qIEZpbGwgdGhlIGRldiBmaWVsZHMgKi8KKyAgICAgICAgZGV2LT5iYXNlX2FkZHIgPSB2YTsKKyAgICAgICAgZGV2LT5vcGVuID0gJmhwbGFuY2Vfb3BlbjsKKyAgICAgICAgZGV2LT5zdG9wID0gJmhwbGFuY2VfY2xvc2U7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKyAgICAgICAgZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBsYW5jZV9wb2xsOworI2VuZGlmCisgICAgICAgIGRldi0+aGFyZF9zdGFydF94bWl0ID0gJmxhbmNlX3N0YXJ0X3htaXQ7CisgICAgICAgIGRldi0+Z2V0X3N0YXRzID0gJmxhbmNlX2dldF9zdGF0czsKKyAgICAgICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmbGFuY2Vfc2V0X211bHRpY2FzdDsKKyAgICAgICAgZGV2LT5kbWEgPSAwOworICAgICAgICAKKyAgICAgICAgZm9yIChpPTA7IGk8NjsgaSsrKSB7CisgICAgICAgICAgICAgICAgLyogVGhlIE5WUkFNIGhvbGRzIG91ciBldGhlcm5ldCBhZGRyZXNzLCBvbmUgbmliYmxlIHBlciBieXRlLAorICAgICAgICAgICAgICAgICAqIGF0IGJ5dGVzIE5WUkFNT0ZGKzEsMyw1LDcsOS4uLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGRldi0+ZGV2X2FkZHJbaV0gPSAoKGluXzgodmEgKyBIUExBTkNFX05WUkFNT0ZGICsgaSo0ICsgMSkgJiAweEYpIDw8IDQpCisgICAgICAgICAgICAgICAgICAgICAgICB8IChpbl84KHZhICsgSFBMQU5DRV9OVlJBTU9GRiArIGkqNCArIDMpICYgMHhGKTsKKyAgICAgICAgICAgICAgICBwcmludGsoIiVjJTIuMngiLCBpID09IDAgPyAnICcgOiAnOicsIGRldi0+ZGV2X2FkZHJbaV0pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGxwLT5sYW5jZS5uYW1lID0gKGNoYXIqKWQtPm5hbWU7ICAgICAgICAgICAgICAgIC8qIGRpc2NhcmRzIGNvbnN0LCBzaHV0IHVwIGdjYyAqLworICAgICAgICBscC0+bGFuY2UuYmFzZSA9IHZhOworICAgICAgICBscC0+bGFuY2UuaW5pdF9ibG9jayA9IChzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqKSh2YSArIEhQTEFOQ0VfTUVNT0ZGKTsgLyogQ1BVIGFkZHIgKi8KKyAgICAgICAgbHAtPmxhbmNlLmxhbmNlX2luaXRfYmxvY2sgPSAwOyAgICAgICAgICAgICAgICAgLyogTEFOQ0UgYWRkciBvZiBzYW1lIFJBTSAqLworICAgICAgICBscC0+bGFuY2UuYnVzbWFzdGVyX3JlZ3ZhbCA9IExFX0MzX0JTV1A7ICAgICAgICAvKiB3ZSdyZSBiaWdlbmRpYW4gKi8KKyAgICAgICAgbHAtPmxhbmNlLmlycSA9IGQtPmlwbDsKKyAgICAgICAgbHAtPmxhbmNlLndyaXRlcmFwID0gaHBsYW5jZV93cml0ZXJhcDsKKyAgICAgICAgbHAtPmxhbmNlLndyaXRlcmRwID0gaHBsYW5jZV93cml0ZXJkcDsKKyAgICAgICAgbHAtPmxhbmNlLnJlYWRyZHAgPSBocGxhbmNlX3JlYWRyZHA7CisgICAgICAgIGxwLT5sYW5jZS5sYW5jZV9sb2dfcnhfYnVmcyA9IExBTkNFX0xPR19SWF9CVUZGRVJTOworICAgICAgICBscC0+bGFuY2UubGFuY2VfbG9nX3R4X2J1ZnMgPSBMQU5DRV9MT0dfVFhfQlVGRkVSUzsKKyAgICAgICAgbHAtPmxhbmNlLnJ4X3JpbmdfbW9kX21hc2sgPSBSWF9SSU5HX01PRF9NQVNLOworICAgICAgICBscC0+bGFuY2UudHhfcmluZ19tb2RfbWFzayA9IFRYX1JJTkdfTU9EX01BU0s7CisJcHJpbnRrKCIsIGlycSAlZFxuIiwgbHAtPmxhbmNlLmlycSk7Cit9CisKKy8qIFRoaXMgaXMgZGlzZ3VzdGluZy4gV2UgaGF2ZSB0byBjaGVjayB0aGUgRElPIHN0YXR1cyByZWdpc3RlciBmb3IgYWNrIGV2ZXJ5CisgKiB0aW1lIHdlIHJlYWQgb3Igd3JpdGUgdGhlIExBTkNFIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIHZvaWQgaHBsYW5jZV93cml0ZXJhcCh2b2lkICpwcml2LCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGxhbmNlX3ByaXZhdGUgKilwcml2OworCWRvIHsKKwkJb3V0X2JlMTYobHAtPmJhc2UgKyBIUExBTkNFX1JFR09GRiArIExBTkNFX1JBUCwgdmFsdWUpOworCX0gd2hpbGUgKChpbl84KGxwLT5iYXNlICsgSFBMQU5DRV9TVEFUVVMpICYgTEVfQUNLKSA9PSAwKTsKK30KKworc3RhdGljIHZvaWQgaHBsYW5jZV93cml0ZXJkcCh2b2lkICpwcml2LCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGxhbmNlX3ByaXZhdGUgKilwcml2OworCWRvIHsKKwkJb3V0X2JlMTYobHAtPmJhc2UgKyBIUExBTkNFX1JFR09GRiArIExBTkNFX1JEUCwgdmFsdWUpOworCX0gd2hpbGUgKChpbl84KGxwLT5iYXNlICsgSFBMQU5DRV9TVEFUVVMpICYgTEVfQUNLKSA9PSAwKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGhwbGFuY2VfcmVhZHJkcCh2b2lkICpwcml2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqKXByaXY7CisJX191MTYgdmFsdWU7CisJZG8geworCQl2YWx1ZSA9IGluX2JlMTYobHAtPmJhc2UgKyBIUExBTkNFX1JFR09GRiArIExBTkNFX1JEUCk7CisJfSB3aGlsZSAoKGluXzgobHAtPmJhc2UgKyBIUExBTkNFX1NUQVRVUykgJiBMRV9BQ0spID09IDApOworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCBocGxhbmNlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgaW50IHN0YXR1czsKKyAgICAgICAgc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgCisgICAgICAgIHN0YXR1cyA9IGxhbmNlX29wZW4oZGV2KTsgICAgICAgICAgICAgICAgIC8qIGNhbGwgZ2VuZXJpYyBsYW5jZSBvcGVuIGNvZGUgKi8KKyAgICAgICAgaWYgKHN0YXR1cykKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAvKiBlbmFibGUgaW50ZXJydXB0cyBhdCBib2FyZCBsZXZlbC4gKi8KKyAgICAgICAgb3V0XzgobHAtPmJhc2UgKyBIUExBTkNFX1NUQVRVUywgTEVfSUUpOworCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhwbGFuY2VfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICBvdXRfOChscC0+YmFzZSArIEhQTEFOQ0VfU1RBVFVTLCAwKTsJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIGF0IGJvYXJkbGV2ZWwgKi8KKyAgICAgICAgbGFuY2VfY2xvc2UoZGV2KTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCBfX2luaXQgaHBsYW5jZV9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBkaW9fbW9kdWxlX2luaXQoJmhwbGFuY2VfZHJpdmVyKTsKK30KKwordm9pZCBfX2V4aXQgaHBsYW5jZV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworICAgICAgICBkaW9fdW5yZWdpc3Rlcl9kcml2ZXIoJmhwbGFuY2VfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaHBsYW5jZV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChocGxhbmNlX2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHBsYW5jZS5oIGIvZHJpdmVycy9uZXQvaHBsYW5jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YWVlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ocGxhbmNlLmgKQEAgLTAsMCArMSwyNiBAQAorLyogUmFuZG9tIGRlZmluZXMgYW5kIHN0cnVjdHVyZXMgZm9yIHRoZSBIUCBMYW5jZSBkcml2ZXIuCisgKiBDb3B5cmlnaHQgKEMpIDA1LzE5OTggUGV0ZXIgTWF5ZGVsbCA8cG1heWRlbGxAY2hpYXJrLmdyZWVuZW5kLm9yZy51az4KKyAqIEJhc2VkIG9uIHRoZSBTdW4gTGFuY2UgZHJpdmVyIGFuZCB0aGUgTmV0QlNEIEhQIExhbmNlIGRyaXZlcgorICovCisKKy8qIFJlZ2lzdGVycyAqLworI2RlZmluZSBIUExBTkNFX0lECQkweDAxCQkvKiBESU8gcmVnaXN0ZXI6IElEIGJ5dGUgKi8KKyNkZWZpbmUgSFBMQU5DRV9TVEFUVVMJCTB4MDMJCS8qIERJTyByZWdpc3RlcjogaW50ZXJydXB0IGVuYWJsZS9zdGF0dXMgKi8KKworLyogQ29udHJvbCBhbmQgc3RhdHVzIGJpdHMgZm9yIHRoZSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTEVfSUUgMHg4MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBMRV9JUiAweDQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnRlcnJ1cHQgcmVxdWVzdGVkICovCisjZGVmaW5lIExFX0xPQ0sgMHgwOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvY2sgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIExFX0FDSyAweDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFjayBvZiBsb2NrICovCisjZGVmaW5lIExFX0pBQiAweDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvc3Mgb2YgdHggY2xvY2sgKD8/PykgKi8KKy8qIFdlIGNhbiBhbHNvIGV4dHJhY3QgdGhlIElQTCBmcm9tIHRoZSBzdGF0dXMgcmVnaXN0ZXIgd2l0aCB0aGUgc3RhbmRhcmQKKyAqIERJT19JUEwoaHBsYW5jZSkgbWFjcm8sIG9yIHVzaW5nIGRpb19zY29kZXRvaXBsKCkKKyAqLworCisvKiBUaGVzZSBhcmUgdGhlIG9mZnNldHMgZm9yIHRoZSBESU8gcmVncyAoaHBsYW5jZV9yZWcpLCBsYW5jZV9pb3JlZywKKyAqIG1lbW9yeSBhbmQgTlZSQU06CisgKi8KKyNkZWZpbmUgSFBMQU5DRV9JRE9GRiAwICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYm9hcmQgYmFzZWFkZHIgKi8KKyNkZWZpbmUgSFBMQU5DRV9SRUdPRkYgMHg0MDAwICAgICAgICAgICAgICAgICAgICAgLyogbGFuY2UgcmVnaXN0ZXJzICovCisjZGVmaW5lIEhQTEFOQ0VfTUVNT0ZGIDB4ODAwMCAgICAgICAgICAgICAgICAgICAgIC8qIHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICovCisjZGVmaW5lIEhQTEFOQ0VfTlZSQU1PRkYgMHhDMDA4ICAgICAgICAgICAgICAgICAgIC8qIGV0aGVyYWRkcmVzcyBhcyBvbmUgKm5pYmJsZSogcGVyIGJ5dGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2h5ZHJhLmMgYi9kcml2ZXJzL25ldC9oeWRyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMGNhNzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9oeWRyYS5jCkBAIC0wLDAgKzEsMjU2IEBACisvKiBOZXcgSHlkcmEgZHJpdmVyIHVzaW5nIGdlbmVyaWMgODM5MCBjb3JlICovCisvKiBCYXNlZCBvbiBvbGQgaHlkcmEgZHJpdmVyIGJ5IFRvcGkgS2FuZXJ2YSAodG9waUBzdXNhbm5hLm91bHUuZmkpICovCisKKy8qIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgICAgICAqLworLyogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlICAgICAgICovCisvKiBMaW51eCBkaXN0cmlidXRpb24gZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogUGV0ZXIgRGUgU2NocmlqdmVyIChwMkBtaW5kLmJlKSAqLworLyogT2xkZW5idXJnIDIwMDAgKi8KKworLyogVGhlIEFtaWdhbmV0IGlzIGEgWm9ycm8tSUkgYm9hcmQgbWFkZSBieSBIeWRyYSBTeXN0ZW1zLiBJdCBjb250YWlucyBhICAgICovCisvKiBOUzgzOTAgTklDIChuZXR3b3JrIGludGVyZmFjZSBjb250cm9sbGVyKSBjbG9uZSwgMTYgb3IgNjRLIG9uLWJvYXJkIFJBTSAgKi8KKy8qIGFuZCAxMEJBU0UtMiAodGhpbiBjb2F4KSBhbmQgQVVJIGNvbm5lY3RvcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaW50cy5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWh3Lmg+CisjaW5jbHVkZSA8bGludXgvem9ycm8uaD4KKworI2luY2x1ZGUgIjgzOTAuaCIKKworI2RlZmluZSBORV9FTjBfRENGRyAgICAgKDB4MGUqMikKKworI2RlZmluZSBORVNNX1NUQVJUX1BHICAgMHgwICAgIC8qIEZpcnN0IHBhZ2Ugb2YgVFggYnVmZmVyICovCisjZGVmaW5lIE5FU01fU1RPUF9QRyAgICAweDQwICAgIC8qIExhc3QgcGFnZSArMSBvZiBSWCByaW5nICovCisKKyNkZWZpbmUgSFlEUkFfTklDX0JBU0UgMHhmZmUxCisjZGVmaW5lIEhZRFJBX0FERFJQUk9NIDB4ZmZjMAorI2RlZmluZSBIWURSQV9WRVJTSU9OICJ2My4wYWxwaGEiCisKKyNkZWZpbmUgV09SRFNXQVAoYSkgICAgICgoKChhKT4+OCkmMHhmZikgfCAoKGEpPDw4KSkKKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBoeWRyYV9pbml0X29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6LAorCQkJCSAgICBjb25zdCBzdHJ1Y3Qgem9ycm9fZGV2aWNlX2lkICplbnQpOworc3RhdGljIGludCBfX2RldmluaXQgaHlkcmFfaW5pdChzdHJ1Y3Qgem9ycm9fZGV2ICp6KTsKK3N0YXRpYyBpbnQgaHlkcmFfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaHlkcmFfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBoeWRyYV9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaHlkcmFfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSk7CitzdGF0aWMgdm9pZCBoeWRyYV9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQgaHlkcmFfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydF9wYWdlKTsKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBoeWRyYV9yZW1vdmVfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnopOworCitzdGF0aWMgc3RydWN0IHpvcnJvX2RldmljZV9pZCBoeWRyYV96b3Jyb190YmxbXSBfX2RldmluaXRkYXRhID0geworICAgIHsgWk9SUk9fUFJPRF9IWURSQV9TWVNURU1TX0FNSUdBTkVUIH0sCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgem9ycm9fZHJpdmVyIGh5ZHJhX2RyaXZlciA9IHsKKyAgICAubmFtZQk9ICJoeWRyYSIsCisgICAgLmlkX3RhYmxlCT0gaHlkcmFfem9ycm9fdGJsLAorICAgIC5wcm9iZQk9IGh5ZHJhX2luaXRfb25lLAorICAgIC5yZW1vdmUJPSBfX2RldmV4aXRfcChoeWRyYV9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGh5ZHJhX2luaXRfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnosCisJCQkJICAgIGNvbnN0IHN0cnVjdCB6b3Jyb19kZXZpY2VfaWQgKmVudCkKK3sKKyAgICBpbnQgZXJyOworCisgICAgaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oei0+cmVzb3VyY2Uuc3RhcnQsIDB4MTAwMDAsICJIeWRyYSIpKQorCXJldHVybiAtRUJVU1k7CisgICAgaWYgKChlcnIgPSBoeWRyYV9pbml0KHopKSkgeworCXJlbGVhc2VfbWVtX3JlZ2lvbih6LT5yZXNvdXJjZS5zdGFydCwgMHgxMDAwMCk7CisJcmV0dXJuIC1FQlVTWTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGh5ZHJhX2luaXQoc3RydWN0IHpvcnJvX2RldiAqeikKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgIHVuc2lnbmVkIGxvbmcgYm9hcmQgPSBaVFdPX1ZBRERSKHotPnJlc291cmNlLnN0YXJ0KTsKKyAgICB1bnNpZ25lZCBsb25nIGlvYWRkciA9IGJvYXJkK0hZRFJBX05JQ19CQVNFOworICAgIGNvbnN0IGNoYXIgbmFtZVtdID0gIk5FMjAwMCI7CisgICAgaW50IHN0YXJ0X3BhZ2UsIHN0b3BfcGFnZTsKKyAgICBpbnQgajsKKyAgICBpbnQgZXJyOworCisgICAgc3RhdGljIHUzMiBoeWRyYV9vZmZzZXRzWzE2XSA9IHsKKwkweDAwLCAweDAyLCAweDA0LCAweDA2LCAweDA4LCAweDBhLCAweDBjLCAweDBlLAorCTB4MTAsIDB4MTIsIDB4MTQsIDB4MTYsIDB4MTgsIDB4MWEsIDB4MWMsIDB4MWUsCisgICAgfTsKKworICAgIGRldiA9IGFsbG9jX2VpX25ldGRldigpOworICAgIGlmICghZGV2KQorCXJldHVybiAtRU5PTUVNOworICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworICAgIGZvcihqID0gMDsgaiA8IEVUSEVSX0FERFJfTEVOOyBqKyspCisJZGV2LT5kZXZfYWRkcltqXSA9ICooKHU4ICopKGJvYXJkICsgSFlEUkFfQUREUlBST00gKyAyKmopKTsKKworICAgIC8qIFdlIG11c3Qgc2V0IHRoZSA4MzkwIGZvciB3b3JkIG1vZGUuICovCisgICAgel93cml0ZWIoMHg0YiwgaW9hZGRyICsgTkVfRU4wX0RDRkcpOworICAgIHN0YXJ0X3BhZ2UgPSBORVNNX1NUQVJUX1BHOworICAgIHN0b3BfcGFnZSA9IE5FU01fU1RPUF9QRzsKKworICAgIGRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworICAgIGRldi0+aXJxID0gSVJRX0FNSUdBX1BPUlRTOworCisgICAgLyogSW5zdGFsbCB0aGUgSW50ZXJydXB0IGhhbmRsZXIgKi8KKyAgICBpZiAocmVxdWVzdF9pcnEoSVJRX0FNSUdBX1BPUlRTLCBlaV9pbnRlcnJ1cHQsIFNBX1NISVJRLCAiSHlkcmEgRXRoZXJuZXQiLAorCQkgICAgZGV2KSkgeworCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIC1FQUdBSU47CisgICAgfQorCisgICAgZWlfc3RhdHVzLm5hbWUgPSBuYW1lOworICAgIGVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gc3RhcnRfcGFnZTsKKyAgICBlaV9zdGF0dXMuc3RvcF9wYWdlID0gc3RvcF9wYWdlOworICAgIGVpX3N0YXR1cy53b3JkMTYgPSAxOworICAgIGVpX3N0YXR1cy5iaWdlbmRpYW4gPSAxOworCisgICAgZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPSBzdGFydF9wYWdlICsgVFhfUEFHRVM7CisKKyAgICBlaV9zdGF0dXMucmVzZXRfODM5MCA9ICZoeWRyYV9yZXNldF84MzkwOworICAgIGVpX3N0YXR1cy5ibG9ja19pbnB1dCA9ICZoeWRyYV9ibG9ja19pbnB1dDsKKyAgICBlaV9zdGF0dXMuYmxvY2tfb3V0cHV0ID0gJmh5ZHJhX2Jsb2NrX291dHB1dDsKKyAgICBlaV9zdGF0dXMuZ2V0XzgzOTBfaGRyID0gJmh5ZHJhX2dldF84MzkwX2hkcjsKKyAgICBlaV9zdGF0dXMucmVnX29mZnNldCA9IGh5ZHJhX29mZnNldHM7CisgICAgZGV2LT5vcGVuID0gJmh5ZHJhX29wZW47CisgICAgZGV2LT5zdG9wID0gJmh5ZHJhX2Nsb3NlOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisgICAgZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlaV9wb2xsOworI2VuZGlmCisKKyAgICBOUzgzOTBfaW5pdChkZXYsIDApOworCisgICAgZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisgICAgaWYgKGVycikgeworCWZyZWVfaXJxKElSUV9BTUlHQV9QT1JUUywgZGV2KTsKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBlcnI7CisgICAgfQorCisgICAgem9ycm9fc2V0X2RydmRhdGEoeiwgZGV2KTsKKworICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBIeWRyYSBhdCAweCUwOGx4LCBhZGRyZXNzICIKKwkgICAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggKGh5ZHJhLmMgIiBIWURSQV9WRVJTSU9OICIpXG4iLAorCSAgIGRldi0+bmFtZSwgei0+cmVzb3VyY2Uuc3RhcnQsIGRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sCisJICAgZGV2LT5kZXZfYWRkclsyXSwgZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwKKwkgICBkZXYtPmRldl9hZGRyWzVdKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGh5ZHJhX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBlaV9vcGVuKGRldik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHlkcmFfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBpZiAoZWlfZGVidWcgPiAxKQorCXByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQuXG4iLCBkZXYtPm5hbWUpOworICAgIGVpX2Nsb3NlKGRldik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGh5ZHJhX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBwcmludGsoS0VSTl9JTkZPICJIeWRyYSBodyByZXNldCBub3QgdGhlcmVcbiIpOworfQorCitzdGF0aWMgdm9pZCBoeWRyYV9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQoreworICAgIGludCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIHNob3J0ICpwdHJzOworICAgIHVuc2lnbmVkIGxvbmcgaGRyX3N0YXJ0PSAobmljX2Jhc2UtSFlEUkFfTklDX0JBU0UpICsKKwkJCSAgICAgKChyaW5nX3BhZ2UgLSBORVNNX1NUQVJUX1BHKTw8OCk7CisgICAgcHRycyA9IChzaG9ydCAqKWhkcjsKKworICAgICoocHRycysrKSA9IHpfcmVhZHcoaGRyX3N0YXJ0KTsKKyAgICAqKChzaG9ydCAqKWhkcikgPSBXT1JEU1dBUCgqKChzaG9ydCAqKWhkcikpOworICAgIGhkcl9zdGFydCArPSAyOworICAgICoocHRycysrKSA9IHpfcmVhZHcoaGRyX3N0YXJ0KTsKKyAgICAqKChzaG9ydCAqKWhkcisxKSA9IFdPUkRTV0FQKCooKHNob3J0ICopaGRyKzEpKTsKK30KKworc3RhdGljIHZvaWQgaHlkcmFfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KQoreworICAgIHVuc2lnbmVkIGxvbmcgbmljX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB1bnNpZ25lZCBsb25nIG1lbV9iYXNlID0gbmljX2Jhc2UgLSBIWURSQV9OSUNfQkFTRTsKKyAgICB1bnNpZ25lZCBsb25nIHhmZXJfc3RhcnQgPSBtZW1fYmFzZSArIHJpbmdfb2Zmc2V0IC0gKE5FU01fU1RBUlRfUEc8PDgpOworCisgICAgaWYgKGNvdW50JjEpCisJY291bnQrKzsKKworICAgIGlmICh4ZmVyX3N0YXJ0K2NvdW50ID4gIG1lbV9iYXNlICsgKE5FU01fU1RPUF9QRzw8OCkpIHsKKwlpbnQgc2VtaV9jb3VudCA9IChtZW1fYmFzZSArIChORVNNX1NUT1BfUEc8PDgpKSAtIHhmZXJfc3RhcnQ7CisKKwl6X21lbWNweV9mcm9taW8oc2tiLT5kYXRhLHhmZXJfc3RhcnQsc2VtaV9jb3VudCk7CisJY291bnQgLT0gc2VtaV9jb3VudDsKKwl6X21lbWNweV9mcm9taW8oc2tiLT5kYXRhK3NlbWlfY291bnQsIG1lbV9iYXNlLCBjb3VudCk7CisgICAgfSBlbHNlCisJel9tZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgeGZlcl9zdGFydCxjb3VudCk7CisKK30KKworc3RhdGljIHZvaWQgaHlkcmFfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydF9wYWdlKQoreworICAgIHVuc2lnbmVkIGxvbmcgbmljX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB1bnNpZ25lZCBsb25nIG1lbV9iYXNlID0gbmljX2Jhc2UgLSBIWURSQV9OSUNfQkFTRTsKKworICAgIGlmIChjb3VudCYxKQorCWNvdW50Kys7CisKKyAgICB6X21lbWNweV90b2lvKG1lbV9iYXNlKygoc3RhcnRfcGFnZSAtIE5FU01fU1RBUlRfUEcpPDw4KSwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBoeWRyYV9yZW1vdmVfb25lKHN0cnVjdCB6b3Jyb19kZXYgKnopCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHpvcnJvX2dldF9kcnZkYXRhKHopOworCisgICAgdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKyAgICBmcmVlX2lycShJUlFfQU1JR0FfUE9SVFMsIGRldik7CisgICAgcmVsZWFzZV9tZW1fcmVnaW9uKFpUV09fUEFERFIoZGV2LT5iYXNlX2FkZHIpLUhZRFJBX05JQ19CQVNFLCAweDEwMDAwKTsKKyAgICBmcmVlX25ldGRldihkZXYpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBoeWRyYV9pbml0X21vZHVsZSh2b2lkKQoreworICAgIHJldHVybiB6b3Jyb19tb2R1bGVfaW5pdCgmaHlkcmFfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGh5ZHJhX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisgICAgem9ycm9fdW5yZWdpc3Rlcl9kcml2ZXIoJmh5ZHJhX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGh5ZHJhX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGh5ZHJhX2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHlkcmEuaCBiL2RyaXZlcnMvbmV0L2h5ZHJhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0MTQxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2h5ZHJhLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qCSRMaW51eDogaHlkcmEuaCx2IDEuMCAxOTk0LzEwLzI2IDAyOjAzOjQ3IGNnZCBFeHAgJAkqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk0IFRpbW8gUm9zc2kKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAgVGltbyBSb3NzaQorICogNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogVGhlIEh5ZHJhIFN5c3RlbXMgY2FyZCB1c2VzIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yCisgKiA4MzkwIE5JQyAoTmV0d29yayBJbnRlcmZhY2UgQ29udHJvbGxlcikgY2hpcCwgbG9jYXRlZAorICogYXQgY2FyZCBiYXNlIGFkZHJlc3MgKyAweGZmZTEuIE5JQyByZWdpc3RlcnMgYXJlIGFjY2Vzc2libGUKKyAqIG9ubHkgYXQgb2RkIGJ5dGUgYWRkcmVzc2VzLCBzbyB0aGUgcmVnaXN0ZXIgb2Zmc2V0cyBtdXN0CisgKiBiZSBtdWx0aXBsaWVkIGJ5IHR3by4KKyAqCisgKiBDYXJkIGFkZHJlc3MgUFJPTSBpcyBsb2NhdGVkIGF0IGNhcmQgYmFzZSArIDB4ZmZjMCAoZXZlbiBieXRlIGFkZHJlc3NlcykKKyAqCisgKiBSQU0gc3RhcnRzIGF0IHRoZSBjYXJkIGJhc2UgYWRkcmVzcywgYW5kIGlzIDE2SyBvciA2NEsuCisgKiBUaGUgY3VycmVudCBBbWlnYSBOZXRCU0QgaHlkcmEgZHJpdmVyIGlzIGhhcmR3aXJlZCBmb3IgMTZLLgorICogSXQgc2VlbXMgdGhhdCB0aGUgUkFNIHNob3VsZCBiZSBhY2Nlc3NlZCBhcyB3b3JkcyBvciBsb25nd29yZHMgb25seS4KKyAqCisgKi8KKworLyogYWRhcHRlZCBmb3IgTGludXggYnkgVG9waSBLYW5lcnZhIDAzLzI5Lzk1CisgICB3aXRoIG9yaWdpbmFsIGF1dGhvcidzIHBlcm1pc3Npb24gICAgICAgICAgKi8KKworI2RlZmluZSBIWURSQV9OSUNfQkFTRSAweGZmZTEKKworLyogUGFnZTAgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgTklDX0NSICAgICAwICAgICAgIC8qIENvbW1hbmQgcmVnaXN0ZXIgICAqLworI2RlZmluZSBOSUNfUFNUQVJUICgxKjIpICAgLyogUGFnZSBzdGFydCAod3JpdGUpICovCisjZGVmaW5lIE5JQ19QU1RPUCAgKDIqMikgICAvKiBQYWdlIHN0b3AgKHdyaXRlKSAgKi8KKyNkZWZpbmUgTklDX0JORFJZICAoMyoyKSAgIC8qIEJvdW5kYXJ5IHBvaW50ZXIgICAqLworI2RlZmluZSBOSUNfVFNSICAgICg0KjIpICAgLyogVHJhbnNtaXQgc3RhdHVzIChyZWFkKSAqLworI2RlZmluZSBOSUNfVFBTUiAgICg0KjIpICAgLyogVHJhbnNtaXQgcGFnZSBzdGFydCAod3JpdGUpICovCisjZGVmaW5lIE5JQ19OQ1IgICAgKDUqMikgICAvKiBOdW1iZXIgb2YgY29sbGlzaW9ucywgcmVhZCAgKi8KKyNkZWZpbmUgTklDX1RCQ1IwICAoNSoyKSAgIC8qIFRyYW5zbWl0IGJ5dGUgY291bnQgbG93ICh3cml0ZSkgICovCisjZGVmaW5lIE5JQ19GSUZPICAgKDYqMikgICAvKiBGSUZPIHJlZy4gKHJlYWQpICAgKi8KKyNkZWZpbmUgTklDX1RCQ1IxICAoNioyKSAgIC8qIFRyYW5zbWl0IGJ5dGUgY291bnQgaGlnaCAod3JpdGUpICovCisjZGVmaW5lIE5JQ19JU1IgICAgKDcqMikgICAvKiBJbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIE5JQ19SQkNSMCAgKDB4YSoyKSAvKiBSZW1vdGUgYnl0ZSBjb3VudCBsb3cgKHdyaXRlKSAgKi8KKyNkZWZpbmUgTklDX1JCQ1IxICAoMHhiKjIpIC8qIFJlbW90ZSBieXRlIGNvdW50IGhpZ2ggKHdyaXRlKSAqLworI2RlZmluZSBOSUNfUlNSICAgICgweGMqMikgLyogUmVjZWl2ZSBzdGF0dXMgKHJlYWQpICAqLworI2RlZmluZSBOSUNfUkNSICAgICgweGMqMikgLyogUmVjZWl2ZSBjb25maWcgKHdyaXRlKSAqLworI2RlZmluZSBOSUNfQ05UUjAgICgweGQqMikgLyogRnJhbWUgYWxpZ25tZW50IGVycm9yIGNvdW50IChyZWFkKSAqLworI2RlZmluZSBOSUNfVENSICAgICgweGQqMikgLyogVHJhbnNtaXQgY29uZmlnICh3cml0ZSkgICovCisjZGVmaW5lIE5JQ19DTlRSMSAgKDB4ZSoyKSAvKiBDUkMgZXJyb3IgY291bnRlciAocmVhZCkgKi8KKyNkZWZpbmUgTklDX0RDUiAgICAoMHhlKjIpIC8qIERhdGEgY29uZmlnICh3cml0ZSkgKi8KKyNkZWZpbmUgTklDX0NOVFIyICAoMHhmKjIpIC8qIG1pc3NlZCBwYWNrZXQgY291bnRlciAocmVhZCkgKi8KKyNkZWZpbmUgTklDX0lNUiAgICAoMHhmKjIpIC8qIEludGVycnVwdCBtYXNrIHJlZy4gKHdyaXRlKSAgKi8KKworLyogUGFnZTEgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgTklDX1BBUjAgICAoMSoyKSAgIC8qIFBoeXNpY2FsIGFkZHJlc3MgKi8KKyNkZWZpbmUgTklDX1BBUjEgICAoMioyKQorI2RlZmluZSBOSUNfUEFSMiAgICgzKjIpCisjZGVmaW5lIE5JQ19QQVIzICAgKDQqMikKKyNkZWZpbmUgTklDX1BBUjQgICAoNSoyKQorI2RlZmluZSBOSUNfUEFSNSAgICg2KjIpCisjZGVmaW5lIE5JQ19DVVJSICAgKDcqMikgICAvKiBDdXJyZW50IFJYIHJpbmctYnVmZmVyIHBhZ2UgKi8KKyNkZWZpbmUgTklDX01BUjAgICAoOCoyKSAgIC8qIE11bHRpY2FzdCBhZGRyZXNzICovCisjZGVmaW5lIE5JQ19NQVIxICAgKDkqMikKKyNkZWZpbmUgTklDX01BUjIgICAoMHhhKjIpCisjZGVmaW5lIE5JQ19NQVIzICAgKDB4YioyKQorI2RlZmluZSBOSUNfTUFSNCAgICgweGMqMikKKyNkZWZpbmUgTklDX01BUjUgICAoMHhkKjIpCisjZGVmaW5lIE5JQ19NQVI2ICAgKDB4ZSoyKQorI2RlZmluZSBOSUNfTUFSNyAgICgweGYqMikKKworLyogQ29tbWFuZCByZWdpc3RlciBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIENSX1NUT1AgICAweDAxIC8qIFN0b3AgLS0gc29mdHdhcmUgcmVzZXQgY29tbWFuZCAqLworI2RlZmluZSBDUl9TVEFSVCAgMHgwMiAvKiBTdGFydCAqLworI2RlZmluZSBDUl9UWFAgICAweDA0IC8qIFRyYW5zbWl0IHBhY2tldCAqLworCisjZGVmaW5lIENSX1JEMCAgICAweDA4IC8qIFJlbW90ZSBETUEgY21kICovCisjZGVmaW5lIENSX1JEMSAgICAweDEwCisjZGVmaW5lIENSX1JEMiAgICAweDIwCisKKyNkZWZpbmUgQ1JfTk9ETUEgIENSX1JEMgorCisjZGVmaW5lIENSX1BTMCAgICAweDQwIC8qIFBhZ2Ugc2VsZWN0ICovCisjZGVmaW5lIENSX1BTMSAgICAweDgwCisKKyNkZWZpbmUgQ1JfUEFHRTAgIDAKKyNkZWZpbmUgQ1JfUEFHRTEgIENSX1BTMAorI2RlZmluZSBDUl9QQUdFMiAgQ1JfUFMxCisKKy8qIEludGVycnVwdCBzdGF0dXMgcmVnLiBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIElTUl9QUlggICAweDAxIC8qIFBhY2tldCByZWNlaXZlZCB3aXRob3V0IGVycm9ycyAqLworI2RlZmluZSBJU1JfUFRYICAgMHgwMiAvKiBQYWNrZXQgdHJhbnNtaXR0ZWQgd2l0aG91dCBlcnJvcnMgKi8KKyNkZWZpbmUgSVNSX1JYRSAgIDB4MDQgLyogUmVjZWl2ZSBlcnJvciAgKi8KKyNkZWZpbmUgSVNSX1RYRSAgIDB4MDggLyogVHJhbnNtaXQgZXJyb3IgKi8KKyNkZWZpbmUgSVNSX09WVyAgIDB4MTAgLyogUmluZyBidWZmZXIgb3ZlcnJ1biAqLworI2RlZmluZSBJU1JfQ05UICAgMHgyMCAvKiBDb3VudGVyIG92ZXJmbG93ICAgICovCisjZGVmaW5lIElTUl9SREMgICAweDQwIC8qIFJlbW90ZSBETUEgY29tcGlsZSAqLworI2RlZmluZSBJU1JfUlNUICAgMHg4MCAvKiBSZXNldCBzdGF0dXMgICAgICAqLworCisvKiBEYXRhIGNvbmZpZyByZWcuIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgRENSX1dUUyAgIDB4MDEgLyogV29yZCB0cmFuc2ZlciBzZWxlY3QgICovCisjZGVmaW5lIERDUl9CT1MgICAweDAyIC8qIEJ5dGUgb3JkZXIgc2VsZWN0ICAgICAqLworI2RlZmluZSBEQ1JfTEFTICAgMHgwNCAvKiBMb25nIGFkZHJlc3Mgc2VsZWN0ICAgKi8KKyNkZWZpbmUgRENSX0xTICAgIDB4MDggLyogTG9vcGJhY2sgc2VsZWN0ICAgICAgICovCisjZGVmaW5lIERDUl9BUiAgICAweDEwIC8qIEF1dG8taW5pdCByZW1vdGUgICAgICAqLworI2RlZmluZSBEQ1JfRlQwICAgMHgyMCAvKiBGSUZPIHRocmVzaG9sZCBzZWxlY3QgKi8KKyNkZWZpbmUgRENSX0ZUMSAgIDB4NDAKKworLyogVHJhbnNtaXQgY29uZmlnIHJlZy4gZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBUQ1JfQ1JDICAweDAxIC8qIEluaGliaXQgQ1JDICovCisjZGVmaW5lIFRDUl9MQjAgIDB4MDIgLyogTG9vcGJhY2sgY29udHJvbCAqLworI2RlZmluZSBUQ1JfTEIxICAweDA0CisjZGVmaW5lIFRDUl9BVEQgIDB4MDggLyogQXV0byB0cmFuc21pdCBkaXNhYmxlICovCisjZGVmaW5lIFRDUl9PRlNUIDB4MTAgLyogQ29sbGlzaW9uIG9mZnNldCBlbmFibGUgKi8KKworLyogVHJhbnNtaXQgc3RhdHVzIHJlZy4gZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBUU1JfUFRYICAweDAxIC8qIFBhY2tldCB0cmFuc21pdHRlZCAqLworI2RlZmluZSBUU1JfQ09MICAweDA0IC8qIFRyYW5zbWl0IGNvbGxpZGVkICovCisjZGVmaW5lIFRTUl9BQlQgIDB4MDggLyogVHJhbnNtaXQgYWJvcnRlZCAqLworI2RlZmluZSBUU1JfQ1JTICAweDEwIC8qIENhcnJpZXIgc2Vuc2UgbG9zdCAqLworI2RlZmluZSBUU1JfRlUgICAweDIwIC8qIEZJRk8gdW5kZXJydW4gKi8KKyNkZWZpbmUgVFNSX0NESCAgMHg0MCAvKiBDRCBIZWFydGJlYXQgKi8KKyNkZWZpbmUgVFNSX09XQyAgMHg4MCAvKiBPdXQgb2YgV2luZG93IENvbGxpc2lvbiAqLworCisvKiBSZWNlaXZlciBjb25maWcgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBSQ1JfU0VQICAweDAxIC8qIFNhdmUgZXJyb3JlZCBwYWNrZXRzICovCisjZGVmaW5lIFJDUl9BUiAgIDB4MDIgLyogQWNjZXB0IHJ1bnQgcGFja2V0cyAqLworI2RlZmluZSBSQ1JfQUIgICAweDA0IC8qIEFjY2VwdCBicm9hZGNhc3QgKi8KKyNkZWZpbmUgUkNSX0FNICAgMHgwOCAvKiBBY2NlcHQgbXVsdGljYXN0ICovCisjZGVmaW5lIFJDUl9QUk8gIDB4MTAgLyogUHJvbWlzY3VvdXMgbW9kZSAqLworI2RlZmluZSBSQ1JfTU9OICAweDIwIC8qIE1vbml0b3IgbW9kZSAqLworCisvKiBSZWNlaXZlciBzdGF0dXMgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBSU1JfUFJYICAweDAxIC8qIFBhY2tldCByZWNlaXZlZCB3aXRob3V0IGVycm9yICovCisjZGVmaW5lIFJTUl9DUkMgIDB4MDIgLyogQ1JDIGVycm9yICovCisjZGVmaW5lIFJTUl9GQUUgIDB4MDQgLyogRnJhbWUgYWxpZ25tZW50IGVycm9yICovCisjZGVmaW5lIFJTUl9GTyAgIDB4MDggLyogRklGTyBvdmVycnVuICovCisjZGVmaW5lIFJTUl9NUEEgIDB4MTAgLyogTWlzc2VkIHBhY2tldCAqLworI2RlZmluZSBSU1JfUEhZICAweDIwIC8qIFBoeXNpY2FsIGFkZHJlc3MgKi8KKyNkZWZpbmUgUlNSX0RJUyAgMHg0MCAvKiBSZWNlaXZlZCBkaXNhYmxlZCAqLworI2RlZmluZSBSU1JfREZSICAweDgwIC8qIERlZmVycmluZyAoamFiYmVyKSAqLworCisvKiBIeWRyYSBTeXN0ZW0gY2FyZCBhZGRyZXNzIFBST00gb2Zmc2V0ICovCisKKyNkZWZpbmUgSFlEUkFfQUREUlBST00gMHhmZmMwCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX2VtYWMvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9pYm1fZW1hYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjU4M2EzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvTWFrZWZpbGUKQEAgLTAsMCArMSwxMiBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIElCTSBQUEM0eHggRU1BQyBjb250cm9sbGVycworIworCitvYmotJChDT05GSUdfSUJNX0VNQUMpICs9IGlibV9lbWFjLm8KKworaWJtX2VtYWMtb2JqcyA6PSBpYm1fZW1hY19tYWwubyBpYm1fZW1hY19jb3JlLm8gaWJtX2VtYWNfcGh5Lm8KKworIyBPbmx5IG5lZWQgdGhpcyBpZiB5b3Ugd2FudCB0byBzZWUgYWRkaXRpb25hbCBkZWJ1ZyBtZXNzYWdlcworaWZlcSAoJChDT05GSUdfSUJNX0VNQUNfRVJSTVNHKSwgeSkKK2libV9lbWFjLW9ianMgKz0gaWJtX2VtYWNfZGVidWcubworZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libV9lbWFjL2libV9lbWFjLmggYi9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZDVhMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hYy5oCkBAIC0wLDAgKzEsMjY3IEBACisvKgorICogaWJtX2VtYWMuaAorICoKKyAqCisgKiAgICAgIEFybWluIEt1c3RlciBha3VzdGVyQG12aXN0YS5jb20KKyAqICAgICAgSnVuZSwgMjAwMgorICoKKyAqIENvcHlyaWdodCAyMDAyIE1vbnRhVmlzdGEgU29mdGFyZSBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9JQk1fRU1BQ19IXworI2RlZmluZSBfSUJNX0VNQUNfSF8KKy8qIEdlbmVyYWwgZGVmaW5lcyBuZWVkZWQgZm9yIHRoZSBkcml2ZXIgKi8KKworLyogRW1hYyAqLwordHlwZWRlZiBzdHJ1Y3QgZW1hY19yZWdzIHsKKwl1MzIgZW0wbXIwOworCXUzMiBlbTBtcjE7CisJdTMyIGVtMHRtcjA7CisJdTMyIGVtMHRtcjE7CisJdTMyIGVtMHJtcjsKKwl1MzIgZW0waXNyOworCXUzMiBlbTBpc2VyOworCXUzMiBlbTBpYWhyOworCXUzMiBlbTBpYWxyOworCXUzMiBlbTB2dHBpZDsKKwl1MzIgZW0wdnRjaTsKKwl1MzIgZW0wcHRyOworCXUzMiBlbTBpYWh0MTsKKwl1MzIgZW0waWFodDI7CisJdTMyIGVtMGlhaHQzOworCXUzMiBlbTBpYWh0NDsKKwl1MzIgZW0wZ2FodDE7CisJdTMyIGVtMGdhaHQyOworCXUzMiBlbTBnYWh0MzsKKwl1MzIgZW0wZ2FodDQ7CisJdTMyIGVtMGxzYWg7CisJdTMyIGVtMGxzYWw7CisJdTMyIGVtMGlwZ3ZyOworCXUzMiBlbTBzdGFjcjsKKwl1MzIgZW0wdHJ0cjsKKwl1MzIgZW0wcndtcjsKK30gZW1hY190OworCisvKiBNT0RFIFJFRyAwICovCisjZGVmaW5lIEVNQUNfTTBfUlhJCQkJMHg4MDAwMDAwMAorI2RlZmluZSBFTUFDX00wX1RYSQkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgRU1BQ19NMF9TUlNUCQkJMHgyMDAwMDAwMAorI2RlZmluZSBFTUFDX00wX1RYRQkJCTB4MTAwMDAwMDAKKyNkZWZpbmUgRU1BQ19NMF9SWEUJCQkweDA4MDAwMDAwCisjZGVmaW5lIEVNQUNfTTBfV0tFCQkJMHgwNDAwMDAwMAorCisvKiBNT0RFIFJlZyAxICovCisjZGVmaW5lIEVNQUNfTTFfRkRFCQkJMHg4MDAwMDAwMAorI2RlZmluZSBFTUFDX00xX0lMRQkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgRU1BQ19NMV9WTEUJCQkweDIwMDAwMDAwCisjZGVmaW5lIEVNQUNfTTFfRUlGQwkJCTB4MTAwMDAwMDAKKyNkZWZpbmUgRU1BQ19NMV9BUFAJCQkweDA4MDAwMDAwCisjZGVmaW5lIEVNQUNfTTFfQUVNSQkJCTB4MDIwMDAwMDAKKyNkZWZpbmUgRU1BQ19NMV9JU1QJCQkweDAxMDAwMDAwCisjZGVmaW5lIEVNQUNfTTFfTUZfMTAwMEdQQ1MJCTB4MDBjMDAwMDAJLyogSW50ZXJuYWwgR1BDUyAqLworI2RlZmluZSBFTUFDX00xX01GXzEwMDBNQlBTCQkweDAwODAwMDAwCS8qIEV4dGVybmFsIEdQQ1MgKi8KKyNkZWZpbmUgRU1BQ19NMV9NRl8xMDBNQlBTCQkweDAwNDAwMDAwCisjZGVmaW5lIEVNQUNfTTFfUkZTXzE2SyAgICAgICAgICAgICAgICAgMHgwMDI4MDAwMAkvKiAwMDAgZm9yIDUxMiBieXRlICovCisjZGVmaW5lIEVNQUNfTTFfVFIJCQkweDAwMDA4MDAwCisjaWZkZWYgQ09ORklHX0lCTV9FTUFDNAorI2RlZmluZSBFTUFDX00xX1JGU184SyAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgRU1BQ19NMV9SRlNfNEsgICAgICAgICAgICAgICAgICAweDAwMTgwMDAwCisjZGVmaW5lIEVNQUNfTTFfUkZTXzJLICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBFTUFDX00xX1JGU18xSyAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgRU1BQ19NMV9UWF9GSUZPXzE2SyAgICAgICAgICAgICAweDAwMDUwMDAwCS8qIDAncyBmb3IgNTEyIGJ5dGUgKi8KKyNkZWZpbmUgRU1BQ19NMV9UWF9GSUZPXzhLICAgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIEVNQUNfTTFfVFhfRklGT180SyAgICAgICAgICAgICAgMHgwMDAzMDAwMAorI2RlZmluZSBFTUFDX00xX1RYX0ZJRk9fMksgICAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgRU1BQ19NMV9UWF9GSUZPXzFLICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEVNQUNfTTFfVFhfVFIgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBFTUFDX00xX1RYX01XU1cgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAJLyogMCB3YWl0IGZvciBzdGF0dXMgKi8KKyNkZWZpbmUgRU1BQ19NMV9KVU1CT19FTkFCTEUgICAgICAgICAgICAweDAwMDAwODAwCS8qIFVwdCB0byA5S3Igc3RhdHVzICovCisjZGVmaW5lIEVNQUNfTTFfT1BCX0NMS182NiAgICAgICAgICAgICAgMHgwMDAwMDAwOAkvKiA2Nk1oeiAqLworI2RlZmluZSBFTUFDX00xX09QQl9DTEtfODMgICAgICAgICAgICAgIDB4MDAwMDAwMTAJLyogODNNaHogKi8KKyNkZWZpbmUgRU1BQ19NMV9PUEJfQ0xLXzEwMCAgICAgICAgICAgICAweDAwMDAwMDE4CS8qIDEwME1oeiAqLworI2RlZmluZSBFTUFDX00xX09QQl9DTEtfMTAwUCAgICAgICAgICAgIDB4MDAwMDAwMjAJLyogMTAwTWh6KyAqLworI2Vsc2UJCQkJLyogQ09ORklHX0lCTV9FTUFDNCAqLworI2RlZmluZSBFTUFDX00xX1JGU180SwkJCTB4MDAzMDAwMDAJLyogfjRrIGZvciA1MTIgYnl0ZSAqLworI2RlZmluZSBFTUFDX00xX1JGU18ySwkJCTB4MDAyMDAwMDAKKyNkZWZpbmUgRU1BQ19NMV9SRlNfMUsJCQkweDAwMTAwMDAwCisjZGVmaW5lIEVNQUNfTTFfVFhfRklGT18ySwkJMHgwMDA4MDAwMAkvKiAwJ3MgZm9yIDUxMiBieXRlICovCisjZGVmaW5lIEVNQUNfTTFfVFhfRklGT18xSwkJMHgwMDA0MDAwMAorI2RlZmluZSBFTUFDX00xX1RSMF9ERVBFTkQJCTB4MDAwMTAwMDAJLyogMCd4IGZvciBzaW5nbGUgcGFja2V0ICovCisjZGVmaW5lIEVNQUNfTTFfVFIxX0RFUEVORAkJMHgwMDAwNDAwMAorI2RlZmluZSBFTUFDX00xX1RSMV9NVUxUSQkJMHgwMDAwMjAwMAorI2RlZmluZSBFTUFDX00xX0pVTUJPX0VOQUJMRQkJMHgwMDAwMTAwMAorI2VuZGlmCQkJCS8qIENPTkZJR19JQk1fRU1BQzQgKi8KKyNkZWZpbmUgRU1BQ19NMV9CQVNFCQkJKEVNQUNfTTFfVFhfRklGT18ySyB8IFwKKwkJCQkJRU1BQ19NMV9BUFAgfCBcCisJCQkJCUVNQUNfTTFfVFIgfCBFTUFDX00xX1ZMRSkKKworLyogVHJhbnNtaXQgTW9kZSBSZWdpc3RlciAwICovCisjZGVmaW5lIEVNQUNfVE1SMF9HTlAwCQkJMHg4MDAwMDAwMAorI2RlZmluZSBFTUFDX1RNUjBfR05QMQkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgRU1BQ19UTVIwX0dOUEQJCQkweDIwMDAwMDAwCisjZGVmaW5lIEVNQUNfVE1SMF9GQwkJCTB4MTAwMDAwMDAKKyNkZWZpbmUgRU1BQ19UTVIwX1RGQUVfMl8zMgkJMHgwMDAwMDAwMQorI2RlZmluZSBFTUFDX1RNUjBfVEZBRV80XzY0CQkweDAwMDAwMDAyCisjZGVmaW5lIEVNQUNfVE1SMF9URkFFXzhfMTI4CQkweDAwMDAwMDAzCisjZGVmaW5lIEVNQUNfVE1SMF9URkFFXzE2XzI1NgkJMHgwMDAwMDAwNAorI2RlZmluZSBFTUFDX1RNUjBfVEZBRV8zMl81MTIJCTB4MDAwMDAwMDUKKyNkZWZpbmUgRU1BQ19UTVIwX1RGQUVfNjRfMTAyNAkJMHgwMDAwMDAwNgorI2RlZmluZSBFTUFDX1RNUjBfVEZBRV8xMjhfMjA0OAkJMHgwMDAwMDAwNworCisvKiBSZWNlaXZlIE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU1BQ19STVJfU1AJCQkweDgwMDAwMDAwCisjZGVmaW5lIEVNQUNfUk1SX1NGQ1MJCQkweDQwMDAwMDAwCisjZGVmaW5lIEVNQUNfUk1SX0FSUlAJCQkweDIwMDAwMDAwCisjZGVmaW5lIEVNQUNfUk1SX0FSUAkJCTB4MTAwMDAwMDAKKyNkZWZpbmUgRU1BQ19STVJfQVJPUAkJCTB4MDgwMDAwMDAKKyNkZWZpbmUgRU1BQ19STVJfQVJQSQkJCTB4MDQwMDAwMDAKKyNkZWZpbmUgRU1BQ19STVJfUFBQCQkJMHgwMjAwMDAwMAorI2RlZmluZSBFTUFDX1JNUl9QTUUJCQkweDAxMDAwMDAwCisjZGVmaW5lIEVNQUNfUk1SX1BNTUUJCQkweDAwODAwMDAwCisjZGVmaW5lIEVNQUNfUk1SX0lBRQkJCTB4MDA0MDAwMDAKKyNkZWZpbmUgRU1BQ19STVJfTUlBRQkJCTB4MDAyMDAwMDAKKyNkZWZpbmUgRU1BQ19STVJfQkFFCQkJMHgwMDEwMDAwMAorI2RlZmluZSBFTUFDX1JNUl9NQUUJCQkweDAwMDgwMDAwCisjZGVmaW5lIEVNQUNfUk1SX1JGQUZfMl8zMgkJMHgwMDAwMDAwMQorI2RlZmluZSBFTUFDX1JNUl9SRkFGXzRfNjQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRU1BQ19STVJfUkZBRl84XzEyOAkJMHgwMDAwMDAwMworI2RlZmluZSBFTUFDX1JNUl9SRkFGXzE2XzI1NgkJMHgwMDAwMDAwNAorI2RlZmluZSBFTUFDX1JNUl9SRkFGXzMyXzUxMgkJMHgwMDAwMDAwNQorI2RlZmluZSBFTUFDX1JNUl9SRkFGXzY0XzEwMjQJCTB4MDAwMDAwMDYKKyNkZWZpbmUgRU1BQ19STVJfUkZBRl8xMjhfMjA0OAkJMHgwMDAwMDAwNworI2RlZmluZSBFTUFDX1JNUl9CQVNFCQkJKEVNQUNfUk1SX0lBRSB8IEVNQUNfUk1SX0JBRSkKKworLyogSW50ZXJydXB0IFN0YXR1cyAmIGVuYWJsZSBSZWdzICovCisjZGVmaW5lIEVNQUNfSVNSX09WUgkJCTB4MDIwMDAwMDAKKyNkZWZpbmUgRU1BQ19JU1JfUFAJCQkweDAxMDAwMDAwCisjZGVmaW5lIEVNQUNfSVNSX0JQCQkJMHgwMDgwMDAwMAorI2RlZmluZSBFTUFDX0lTUl9SUAkJCTB4MDA0MDAwMDAKKyNkZWZpbmUgRU1BQ19JU1JfU0UJCQkweDAwMjAwMDAwCisjZGVmaW5lIEVNQUNfSVNSX0FMRQkJCTB4MDAxMDAwMDAKKyNkZWZpbmUgRU1BQ19JU1JfQkZDUwkJCTB4MDAwODAwMDAKKyNkZWZpbmUgRU1BQ19JU1JfUFRMRQkJCTB4MDAwNDAwMDAKKyNkZWZpbmUgRU1BQ19JU1JfT1JFCQkJMHgwMDAyMDAwMAorI2RlZmluZSBFTUFDX0lTUl9JUkUJCQkweDAwMDEwMDAwCisjZGVmaW5lIEVNQUNfSVNSX0RCRE0JCQkweDAwMDAwMjAwCisjZGVmaW5lIEVNQUNfSVNSX0RCMAkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgRU1BQ19JU1JfU0UwCQkJMHgwMDAwMDA4MAorI2RlZmluZSBFTUFDX0lTUl9URTAJCQkweDAwMDAwMDQwCisjZGVmaW5lIEVNQUNfSVNSX0RCMQkJCTB4MDAwMDAwMjAKKyNkZWZpbmUgRU1BQ19JU1JfU0UxCQkJMHgwMDAwMDAxMAorI2RlZmluZSBFTUFDX0lTUl9URTEJCQkweDAwMDAwMDA4CisjZGVmaW5lIEVNQUNfSVNSX01PUwkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRU1BQ19JU1JfTU9GCQkJMHgwMDAwMDAwMQorCisvKiBTVEEgQ09OVFJPTCBSRUcgKi8KKyNkZWZpbmUgRU1BQ19TVEFDUl9PQwkJCTB4MDAwMDgwMDAKKyNkZWZpbmUgRU1BQ19TVEFDUl9QSFlFCQkJMHgwMDAwNDAwMAorI2RlZmluZSBFTUFDX1NUQUNSX1dSSVRFCQkweDAwMDAyMDAwCisjZGVmaW5lIEVNQUNfU1RBQ1JfUkVBRAkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgRU1BQ19TVEFDUl9DTEtfODNNSFoJCTB4MDAwMDA4MDAJLyogMCdzIGZvciA1ME1oeiAqLworI2RlZmluZSBFTUFDX1NUQUNSX0NMS182Nk1IWgkJMHgwMDAwMDQwMAorI2RlZmluZSBFTUFDX1NUQUNSX0NMS18xMDBNSFoJCTB4MDAwMDBDMDAKKworLyogVHJhbnNtaXQgUmVxdWVzdCBUaHJlc2hvbGQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU1BQ19UUlRSXzE2MDAJCQkweDE4MDAwMDAwCS8qIDAncyBmb3IgNjQgQnl0ZXMgKi8KKyNkZWZpbmUgRU1BQ19UUlRSXzEwMjQJCQkweDBmMDAwMDAwCisjZGVmaW5lIEVNQUNfVFJUUl81MTIJCQkweDA3MDAwMDAwCisjZGVmaW5lIEVNQUNfVFJUUl8yNTYJCQkweDAzMDAwMDAwCisjZGVmaW5lIEVNQUNfVFJUUl8xOTIJCQkweDEwMDAwMDAwCisjZGVmaW5lIEVNQUNfVFJUUl8xMjgJCQkweDAxMDAwMDAwCisKKyNkZWZpbmUgRU1BQ19UWF9DVFJMX0dGQ1MJCTB4MDIwMAorI2RlZmluZSBFTUFDX1RYX0NUUkxfR1AJCQkweDAxMDAKKyNkZWZpbmUgRU1BQ19UWF9DVFJMX0lTQQkJMHgwMDgwCisjZGVmaW5lIEVNQUNfVFhfQ1RSTF9SU0EJCTB4MDA0MAorI2RlZmluZSBFTUFDX1RYX0NUUkxfSVZUCQkweDAwMjAKKyNkZWZpbmUgRU1BQ19UWF9DVFJMX1JWVAkJMHgwMDEwCisjZGVmaW5lIEVNQUNfVFhfQ1RSTF9UQUhfQ1NVTQkJMHgwMDBlCS8qIFRBSCBvbmx5ICovCisjZGVmaW5lIEVNQUNfVFhfQ1RSTF9UQUhfU0VHNAkJMHgwMDBhCS8qIFRBSCBvbmx5ICovCisjZGVmaW5lIEVNQUNfVFhfQ1RSTF9UQUhfU0VHMwkJMHgwMDA4CS8qIFRBSCBvbmx5ICovCisjZGVmaW5lIEVNQUNfVFhfQ1RSTF9UQUhfU0VHMgkJMHgwMDA2CS8qIFRBSCBvbmx5ICovCisjZGVmaW5lIEVNQUNfVFhfQ1RSTF9UQUhfU0VHMQkJMHgwMDA0CS8qIFRBSCBvbmx5ICovCisjZGVmaW5lIEVNQUNfVFhfQ1RSTF9UQUhfU0VHMAkJMHgwMDAyCS8qIFRBSCBvbmx5ICovCisjZGVmaW5lIEVNQUNfVFhfQ1RSTF9UQUhfRElTCQkweDAwMDAJLyogVEFIIG9ubHkgKi8KKworI2RlZmluZSBFTUFDX1RYX0NUUkxfREZMVCAoIFwKKwlNQUxfVFhfQ1RSTF9JTlRSIHwgRU1BQ19UWF9DVFJMX0dGQ1MgfCBFTUFDX1RYX0NUUkxfR1AgKQorCisvKiBtYWRtYWwgdHJhbnNtaXQgc3RhdHVzIC8gQ29udHJvbCBiaXRzICovCisjZGVmaW5lIEVNQUNfVFhfU1RfQkZDUwkJCTB4MDIwMAorI2RlZmluZSBFTUFDX1RYX1NUX0JQUAkJCTB4MDEwMAorI2RlZmluZSBFTUFDX1RYX1NUX0xDUwkJCTB4MDA4MAorI2RlZmluZSBFTUFDX1RYX1NUX0VECQkJMHgwMDQwCisjZGVmaW5lIEVNQUNfVFhfU1RfRUMJCQkweDAwMjAKKyNkZWZpbmUgRU1BQ19UWF9TVF9MQwkJCTB4MDAxMAorI2RlZmluZSBFTUFDX1RYX1NUX01DCQkJMHgwMDA4CisjZGVmaW5lIEVNQUNfVFhfU1RfU0MJCQkweDAwMDQKKyNkZWZpbmUgRU1BQ19UWF9TVF9VUgkJCTB4MDAwMgorI2RlZmluZSBFTUFDX1RYX1NUX1NRRQkJCTB4MDAwMQorCisvKiBtYWRtYWwgcmVjZWl2ZSBzdGF0dXMgLyBDb250cm9sIGJpdHMgKi8KKyNkZWZpbmUgRU1BQ19SWF9TVF9PRQkJCTB4MDIwMAorI2RlZmluZSBFTUFDX1JYX1NUX1BQCQkJMHgwMTAwCisjZGVmaW5lIEVNQUNfUlhfU1RfQlAJCQkweDAwODAKKyNkZWZpbmUgRU1BQ19SWF9TVF9SUAkJCTB4MDA0MAorI2RlZmluZSBFTUFDX1JYX1NUX1NFCQkJMHgwMDIwCisjZGVmaW5lIEVNQUNfUlhfU1RfQUUJCQkweDAwMTAKKyNkZWZpbmUgRU1BQ19SWF9TVF9CRkNTCQkJMHgwMDA4CisjZGVmaW5lIEVNQUNfUlhfU1RfUFRMCQkJMHgwMDA0CisjZGVmaW5lIEVNQUNfUlhfU1RfT1JFCQkJMHgwMDAyCisjZGVmaW5lIEVNQUNfUlhfU1RfSVJFCQkJMHgwMDAxCisjZGVmaW5lIEVNQUNfQkFEX1JYX1BBQ0tFVAkJMHgwMmZmCisjZGVmaW5lIEVNQUNfQ1NVTV9WRVJfRVJST1IJCTB4MDAwMworCisvKiBpZGVudGlmeSBhIGJhZCByeCBwYWNrZXQgZGVwZW5kZW50IG9uIGVtYWMgZmVhdHVyZXMgKi8KKyNpZmRlZiBDT05GSUdfSUJNX0VNQUM0CisjZGVmaW5lIEVNQUNfSVNfQkFEX1JYX1BBQ0tFVChkZXNjKSBcCisJKCgoZGVzYyAmIChFTUFDX0JBRF9SWF9QQUNLRVQgJiB+RU1BQ19DU1VNX1ZFUl9FUlJPUikpIHx8IFwKKwkoKGRlc2MgJiBFTUFDX0NTVU1fVkVSX0VSUk9SKSA9PSBFTUFDX1JYX1NUX09SRSkgfHwgXAorCSgoZGVzYyAmIEVNQUNfQ1NVTV9WRVJfRVJST1IpID09IEVNQUNfUlhfU1RfSVJFKSkpCisjZWxzZQorI2RlZmluZSBFTUFDX0lTX0JBRF9SWF9QQUNLRVQoZGVzYykgXAorCSAoZGVzYyAmIEVNQUNfQkFEX1JYX1BBQ0tFVCkKKyNlbmRpZgorCisvKiBTb0MgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgRU1BQyByZWdpc3RlciBkZWZhdWx0cyAqLworI2lmIGRlZmluZWQoQ09ORklHXzQ0MEdQKQorI2RlZmluZSBFTUFDX1JXTVJfREVGQVVMVAkJMHg4MDAwOTAwMAorI2RlZmluZSBFTUFDX1RNUjBfREVGQVVMVAkJMHgwMDAwMDAwMAorI2RlZmluZSBFTUFDX1RNUjFfREVGQVVMVAkJMHhmODY0MDAwMAorI2VsaWYgZGVmaW5lZChDT05GSUdfNDQwR1gpCisjZGVmaW5lIEVNQUNfUldNUl9ERUZBVUxUCQkweDEwMDBhMjAwCisjZGVmaW5lIEVNQUNfVE1SMF9ERUZBVUxUCQlFTUFDX1RNUjBfVEZBRV8yXzMyCisjZGVmaW5lIEVNQUNfVE1SMV9ERUZBVUxUCQkweGEwMGYwMDAwCisjZWxpZiBkZWZpbmVkKENPTkZJR180NDBTUCkKKyNkZWZpbmUgRU1BQ19SV01SX0RFRkFVTFQJCTB4MDgwMDIwMDAKKyNkZWZpbmUgRU1BQ19UTVIwX0RFRkFVTFQJCUVNQUNfVE1SMF9URkFFXzEyOF8yMDQ4CisjZGVmaW5lIEVNQUNfVE1SMV9ERUZBVUxUCQkweGY4MjAwMDAwCisjZWxzZQorI2RlZmluZSBFTUFDX1JXTVJfREVGQVVMVAkJMHgwZjAwMjAwMAorI2RlZmluZSBFTUFDX1RNUjBfREVGQVVMVAkJMHgwMDAwMDAwMAorI2RlZmluZSBFTUFDX1RNUjFfREVGQVVMVAkJMHgzODBmMDAwMAorI2VuZGlmCQkJCS8qIENPTkZJR180NDBHUCAqLworCisvKiBSZXZpc2lvbiBzcGVjaWZpYyBFTUFDIHJlZ2lzdGVyIGRlZmF1bHRzICovCisjaWZkZWYgQ09ORklHX0lCTV9FTUFDNAorI2RlZmluZSBFTUFDX00xX0RFRkFVTFQJCQkoRU1BQ19NMV9CQVNFIHwgXAorCQkJCQlFTUFDX00xX09QQl9DTEtfODMgfCBcCisJCQkJCUVNQUNfTTFfVFhfTVdTVykKKyNkZWZpbmUgRU1BQ19STVJfREVGQVVMVAkJKEVNQUNfUk1SX0JBU0UgfCBcCisJCQkJCUVNQUNfUk1SX1JGQUZfMTI4XzIwNDgpCisjZGVmaW5lIEVNQUNfVE1SMF9YTUlUCQkJKEVNQUNfVE1SMF9HTlAwIHwgXAorCQkJCQlFTUFDX1RNUjBfREVGQVVMVCkKKyNkZWZpbmUgRU1BQ19UUlRSX0RFRkFVTFQJCUVNQUNfVFJUUl8xMDI0CisjZWxzZQkJCQkvKiAhQ09ORklHX0lCTV9FTUFDNCAqLworI2RlZmluZSBFTUFDX00xX0RFRkFVTFQJCQlFTUFDX00xX0JBU0UKKyNkZWZpbmUgRU1BQ19STVJfREVGQVVMVAkJRU1BQ19STVJfQkFTRQorI2RlZmluZSBFTUFDX1RNUjBfWE1JVAkJCUVNQUNfVE1SMF9HTlAwCisjZGVmaW5lIEVNQUNfVFJUUl9ERUZBVUxUCQlFTUFDX1RSVFJfMTYwMAorI2VuZGlmCQkJCS8qIENPTkZJR19JQk1fRU1BQzQgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19jb3JlLmMgYi9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI0NDM1OGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19jb3JlLmMKQEAgLTAsMCArMSwyMDEyIEBACisvKgorICogaWJtX2VtYWNfY29yZS5jCisgKgorICogRXRoZXJuZXQgZHJpdmVyIGZvciB0aGUgYnVpbHQgaW4gZXRoZXJuZXQgb24gdGhlIElCTSA0eHggUG93ZXJQQworICogcHJvY2Vzc29ycy4KKyAqIAorICogKGMpIDIwMDMgQmVuamFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgorICoKKyAqIEJhc2VkIG9uIG9yaWdpbmFsIHdvcmsgYnkKKyAqCisgKiAgICAgIEFybWluIEt1c3RlciA8YWt1c3RlckBtdmlzdGEuY29tPgorICogCUpvaG5uaWUgUGV0ZXJzIDxqcGV0ZXJzQG12aXN0YS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIFRPRE8KKyAqICAgICAgIC0gQ2hlY2sgZm9yIHJhY2VzIGluIHRoZSAicmVtb3ZlIiBjb2RlIHBhdGgKKyAqICAgICAgIC0gQWRkIHNvbWUgUG93ZXIgTWFuYWdlbWVudCB0byB0aGUgTUFDIGFuZCB0aGUgUEhZCisgKiAgICAgICAtIEF1ZGl0IHJlbWFpbmluZyBvZiBub24tcmV3cml0dGVuIGNvZGUgKC0tQmVuSCkKKyAqICAgICAgIC0gQ2xlYW51cCBtZXNzYWdlIGRpc3BsYXkgdXNpbmcgbXNnbGV2ZWwgbWVjYW5pc20KKyAqICAgICAgIC0gQWRkcmVzcyBhbGwgZXJyYXRhCisgKiAgICAgICAtIEF1ZGl0IGFsbCByZWdpc3RlciB1cGRhdGUgcGF0aHMgdG8gZW5zdXJlIHRoZXkKKyAqICAgICAgICAgYXJlIGJlaW5nIHdyaXR0ZW4gcG9zdCBzb2Z0IHJlc2V0IGlmIHJlcXVpcmVkLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9vY3AuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworI2luY2x1ZGUgImlibV9lbWFjX2NvcmUuaCIKKworLy8jZGVmaW5lIE1ESU9fREVCVUcoZm10KSBwcmludGsgZm10CisjZGVmaW5lIE1ESU9fREVCVUcoZm10KQorCisvLyNkZWZpbmUgTElOS19ERUJVRyhmbXQpIHByaW50ayBmbXQKKyNkZWZpbmUgTElOS19ERUJVRyhmbXQpCisKKy8vI2RlZmluZSBQS1RfREVCVUcoZm10KSBwcmludGsgZm10CisjZGVmaW5lIFBLVF9ERUJVRyhmbXQpCisKKyNkZWZpbmUgRFJWX05BTUUgICAgICAgICJlbWFjIgorI2RlZmluZSBEUlZfVkVSU0lPTiAgICAgIjIuMCIKKyNkZWZpbmUgRFJWX0FVVEhPUiAgICAgICJCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+IgorI2RlZmluZSBEUlZfREVTQyAgICAgICAgIklCTSBFTUFDIEV0aGVybmV0IGRyaXZlciIKKworLyoKKyAqIFdoZW4gbWRpb19pZHggPj0gMCwgY29udGFpbnMgYSBsaXN0IG9mIGVtYWMgb2NwX2RldnMKKyAqIHRoYXQgaGF2ZSBoYWQgdGhlaXIgaW5pdGlhbGl6YXRpb24gZGVmZXJyZWQgdW50aWwgdGhlCisgKiBjb21tb24gTURJTyBjb250cm9sbGVyIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICovCitMSVNUX0hFQUQoZW1hY19pbml0X2xpc3QpOworCitNT0RVTEVfQVVUSE9SKERSVl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBza2JfcmVzID0gU0tCX1JFUzsKK21vZHVsZV9wYXJhbShza2JfcmVzLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhza2JfcmVzLCAiQW1vdW50IG9mIGRhdGEgdG8gcmVzZXJ2ZSBvbiBza2IgYnVmZnNcbiIKKwkJICJUaGUgNDA1IGhhbmRsZXMgYSBtaXNhbGlnbmVkIElQIGhlYWRlciBmaW5lIGJ1dFxuIgorCQkgInRoaXMgY2FuIGhlbHAgaWYgeW91IGFyZSByb3V0aW5nIHRvIGEgdHVubmVsIG9yIGFcbiIKKwkJICJkZXZpY2UgdGhhdCBuZWVkcyBhbGlnbmVkIGRhdGEuIDAuLjIiKTsKKworI2RlZmluZSBSR01JSV9QUklWKG9jcGRldikgKChzdHJ1Y3QgaWJtX29jcF9yZ21paSopb2NwX2dldF9kcnZkYXRhKG9jcGRldikpCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmdtaWlfZW5hYmxlW10gPSB7CisJUkdNSUlfUlRCSSwKKwlSR01JSV9SR01JSSwKKwlSR01JSV9UQkksCisJUkdNSUlfR01JSQorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCByZ21paV9zcGVlZF9tYXNrW10gPSB7CisJUkdNSUlfTUlJMl9TUERNQVNLLAorCVJHTUlJX01JSTNfU1BETUFTSworfTsKKworc3RhdGljIHVuc2lnbmVkIGludCByZ21paV9zcGVlZDEwMFtdID0geworCVJHTUlJX01JSTJfMTAwTUIsCisJUkdNSUlfTUlJM18xMDBNQgorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCByZ21paV9zcGVlZDEwMDBbXSA9IHsKKwlSR01JSV9NSUkyXzEwMDBNQiwKKwlSR01JSV9NSUkzXzEwMDBNQgorfTsKKworI2RlZmluZSBaTUlJX1BSSVYob2NwZGV2KSAoKHN0cnVjdCBpYm1fb2NwX3ptaWkqKW9jcF9nZXRfZHJ2ZGF0YShvY3BkZXYpKQorCitzdGF0aWMgdW5zaWduZWQgaW50IHptaWlfZW5hYmxlW11bNF0gPSB7CisJe1pNSUlfU01JSTAsIFpNSUlfUk1JSTAsIFpNSUlfTUlJMCwKKwkgfihaTUlJX01ESTEgfCBaTUlJX01ESTIgfCBaTUlJX01ESTMpfSwKKwl7Wk1JSV9TTUlJMSwgWk1JSV9STUlJMSwgWk1JSV9NSUkxLAorCSB+KFpNSUlfTURJMCB8IFpNSUlfTURJMiB8IFpNSUlfTURJMyl9LAorCXtaTUlJX1NNSUkyLCBaTUlJX1JNSUkyLCBaTUlJX01JSTIsCisJIH4oWk1JSV9NREkwIHwgWk1JSV9NREkxIHwgWk1JSV9NREkzKX0sCisJe1pNSUlfU01JSTMsIFpNSUlfUk1JSTMsIFpNSUlfTUlJMywgfihaTUlJX01ESTAgfCBaTUlJX01ESTEgfCBaTUlJX01ESTIpfQorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBtZGlfZW5hYmxlW10gPSB7CisJWk1JSV9NREkwLAorCVpNSUlfTURJMSwKKwlaTUlJX01ESTIsCisJWk1JSV9NREkzCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IHptaWlfc3BlZWQgPSAweDA7CitzdGF0aWMgdW5zaWduZWQgaW50IHptaWlfc3BlZWQxMDBbXSA9IHsKKwlaTUlJX01JSTBfMTAwTUIsCisJWk1JSV9NSUkxXzEwME1CLAorCVpNSUlfTUlJMl8xMDBNQiwKKwlaTUlJX01JSTNfMTAwTUIKK307CisKKy8qIFNpbmNlIG11bHRpcGxlIEVNQUNzIHNoYXJlIE1ESU8gbGluZXMgaW4gdmFyaW91cyB3YXlzLCB3ZSBuZWVkCisgKiB0byBhdm9pZCByZS11c2luZyB0aGUgc2FtZSBQSFkgSUQgaW4gY2FzZXMgd2hlcmUgdGhlIGFyY2ggZGlkbid0CisgKiBzZXR1cCBwcmVjaXNlIHBoeV9tYXAgZW50cmllcworICovCitzdGF0aWMgdTMyIGJ1c3lfcGh5X21hcCA9IDA7CisKKy8qIElmIEVNQUNzIHNoYXJlIGEgY29tbW9uIE1ESU8gZGV2aWNlLCB0aGlzIHBvaW50cyB0byBpdCAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICptZGlvX25kZXYgPSBOVUxMOworCitzdHJ1Y3QgZW1hY19kZWZfZGV2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CisJc3RydWN0IG9jcF9kZXZpY2UgKm9jcGRldjsKKwlzdHJ1Y3QgaWJtX29jcF9tYWwgKm1hbDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZW1hY19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICpmZXAgPSBkZXYtPnByaXY7CisJcmV0dXJuICZmZXAtPnN0YXRzOworfTsKKworc3RhdGljIGludAorZW1hY19pbml0X3JnbWlpKHN0cnVjdCBvY3BfZGV2aWNlICpyZ21paV9kZXYsIGludCBpbnB1dCwgaW50IHBoeV9tb2RlKQoreworCXN0cnVjdCBpYm1fb2NwX3JnbWlpICpyZ21paSA9IFJHTUlJX1BSSVYocmdtaWlfZGV2KTsKKwljb25zdCBjaGFyICptb2RlX25hbWVbXSA9IHsgIlJUQkkiLCAiUkdNSUkiLCAiVEJJIiwgIkdNSUkiIH07CisJaW50IG1vZGUgPSAtMTsKKworCWlmICghcmdtaWkpIHsKKwkJcmdtaWkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWJtX29jcF9yZ21paSksIEdGUF9LRVJORUwpOworCisJCWlmIChyZ21paSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAicmdtaWklZDogT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIFJHTUlJIHN0cnVjdHVyZSFcbiIsCisJCQkgICAgICAgcmdtaWlfZGV2LT5kZWYtPmluZGV4KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJbWVtc2V0KHJnbWlpLCAwLCBzaXplb2YoKnJnbWlpKSk7CisKKwkJcmdtaWktPmJhc2UgPQorCQkgICAgKHN0cnVjdCByZ21paV9yZWdzICopaW9yZW1hcChyZ21paV9kZXYtPmRlZi0+cGFkZHIsCisJCQkJCQkgc2l6ZW9mKCpyZ21paS0+YmFzZSkpOworCQlpZiAocmdtaWktPmJhc2UgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgInJnbWlpJWQ6IENhbm5vdCBpb3JlbWFwIGJyaWRnZSByZWdpc3RlcnMhXG4iLAorCQkJICAgICAgIHJnbWlpX2Rldi0+ZGVmLT5pbmRleCk7CisKKwkJCWtmcmVlKHJnbWlpKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW9jcF9zZXRfZHJ2ZGF0YShyZ21paV9kZXYsIHJnbWlpKTsKKwl9CisKKwlpZiAocGh5X21vZGUpIHsKKwkJc3dpdGNoIChwaHlfbW9kZSkgeworCQljYXNlIFBIWV9NT0RFX0dNSUk6CisJCQltb2RlID0gR01JSTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV9NT0RFX1RCSToKKwkJCW1vZGUgPSBUQkk7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfTU9ERV9SVEJJOgorCQkJbW9kZSA9IFJUQkk7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfTU9ERV9SR01JSToKKwkJZGVmYXVsdDoKKwkJCW1vZGUgPSBSR01JSTsKKwkJfQorCQlyZ21paS0+YmFzZS0+ZmVyICY9IH5SR01JSV9GRVJfTUFTSyhpbnB1dCk7CisJCXJnbWlpLT5iYXNlLT5mZXIgfD0gcmdtaWlfZW5hYmxlW21vZGVdIDw8ICg0ICogaW5wdXQpOworCX0gZWxzZSB7CisJCXN3aXRjaCAoKHJnbWlpLT5iYXNlLT5mZXIgJiBSR01JSV9GRVJfTUFTSyhpbnB1dCkpID4+ICg0ICoKKwkJCQkJCQkJICAgICAgIGlucHV0KSkgeworCQljYXNlIFJHTUlJX1JUQkk6CisJCQltb2RlID0gUlRCSTsKKwkJCWJyZWFrOworCQljYXNlIFJHTUlJX1JHTUlJOgorCQkJbW9kZSA9IFJHTUlJOworCQkJYnJlYWs7CisJCWNhc2UgUkdNSUlfVEJJOgorCQkJbW9kZSA9IFRCSTsKKwkJCWJyZWFrOworCQljYXNlIFJHTUlJX0dNSUk6CisJCQltb2RlID0gR01JSTsKKwkJfQorCX0KKworCS8qIFNldCBtb2RlIHRvIFJHTUlJIGlmIG5vdGhpbmcgdmFsaWQgaXMgZGV0ZWN0ZWQgKi8KKwlpZiAobW9kZSA8IDApCisJCW1vZGUgPSBSR01JSTsKKworCXByaW50ayhLRVJOX05PVElDRSAicmdtaWklZDogaW5wdXQgJWQgaW4gJXMgbW9kZVxuIiwKKwkgICAgICAgcmdtaWlfZGV2LT5kZWYtPmluZGV4LCBpbnB1dCwgbW9kZV9uYW1lW21vZGVdKTsKKworCXJnbWlpLT5tb2RlW2lucHV0XSA9IG1vZGU7CisJcmdtaWktPnVzZXJzKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2VtYWNfcmdtaWlfcG9ydF9zcGVlZChzdHJ1Y3Qgb2NwX2RldmljZSAqb2NwZGV2LCBpbnQgaW5wdXQsIGludCBzcGVlZCkKK3sKKwlzdHJ1Y3QgaWJtX29jcF9yZ21paSAqcmdtaWkgPSBSR01JSV9QUklWKG9jcGRldik7CisJdW5zaWduZWQgaW50IHJnbWlpX3NwZWVkOworCisJcmdtaWlfc3BlZWQgPSBpbl9iZTMyKCZyZ21paS0+YmFzZS0+c3NyKTsKKworCXJnbWlpX3NwZWVkICY9IH5yZ21paV9zcGVlZF9tYXNrW2lucHV0XTsKKworCWlmIChzcGVlZCA9PSAxMDAwKQorCQlyZ21paV9zcGVlZCB8PSByZ21paV9zcGVlZDEwMDBbaW5wdXRdOworCWVsc2UgaWYgKHNwZWVkID09IDEwMCkKKwkJcmdtaWlfc3BlZWQgfD0gcmdtaWlfc3BlZWQxMDBbaW5wdXRdOworCisJb3V0X2JlMzIoJnJnbWlpLT5iYXNlLT5zc3IsIHJnbWlpX3NwZWVkKTsKK30KKworc3RhdGljIHZvaWQgZW1hY19jbG9zZV9yZ21paShzdHJ1Y3Qgb2NwX2RldmljZSAqb2NwZGV2KQoreworCXN0cnVjdCBpYm1fb2NwX3JnbWlpICpyZ21paSA9IFJHTUlJX1BSSVYob2NwZGV2KTsKKwlCVUdfT04oIXJnbWlpIHx8IHJnbWlpLT51c2VycyA9PSAwKTsKKworCWlmICghLS1yZ21paS0+dXNlcnMpIHsKKwkJb2NwX3NldF9kcnZkYXRhKG9jcGRldiwgTlVMTCk7CisJCWlvdW5tYXAoKHZvaWQgKilyZ21paS0+YmFzZSk7CisJCWtmcmVlKHJnbWlpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZW1hY19pbml0X3ptaWkoc3RydWN0IG9jcF9kZXZpY2UgKnptaWlfZGV2LCBpbnQgaW5wdXQsIGludCBwaHlfbW9kZSkKK3sKKwlzdHJ1Y3QgaWJtX29jcF96bWlpICp6bWlpID0gWk1JSV9QUklWKHptaWlfZGV2KTsKKwljb25zdCBjaGFyICptb2RlX25hbWVbXSA9IHsgIlNNSUkiLCAiUk1JSSIsICJNSUkiIH07CisJaW50IG1vZGUgPSAtMTsKKworCWlmICghem1paSkgeworCQl6bWlpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlibV9vY3Bfem1paSksIEdGUF9LRVJORUwpOworCQlpZiAoem1paSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiem1paSVkOiBPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgWk1JSSBzdHJ1Y3R1cmUhXG4iLAorCQkJICAgICAgIHptaWlfZGV2LT5kZWYtPmluZGV4KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW1lbXNldCh6bWlpLCAwLCBzaXplb2YoKnptaWkpKTsKKworCQl6bWlpLT5iYXNlID0KKwkJICAgIChzdHJ1Y3Qgem1paV9yZWdzICopaW9yZW1hcCh6bWlpX2Rldi0+ZGVmLT5wYWRkciwKKwkJCQkJCXNpemVvZigqem1paS0+YmFzZSkpOworCQlpZiAoem1paS0+YmFzZSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiem1paSVkOiBDYW5ub3QgaW9yZW1hcCBicmlkZ2UgcmVnaXN0ZXJzIVxuIiwKKwkJCSAgICAgICB6bWlpX2Rldi0+ZGVmLT5pbmRleCk7CisKKwkJCWtmcmVlKHptaWkpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJb2NwX3NldF9kcnZkYXRhKHptaWlfZGV2LCB6bWlpKTsKKwl9CisKKwlpZiAocGh5X21vZGUpIHsKKwkJc3dpdGNoIChwaHlfbW9kZSkgeworCQljYXNlIFBIWV9NT0RFX01JSToKKwkJCW1vZGUgPSBNSUk7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfTU9ERV9STUlJOgorCQkJbW9kZSA9IFJNSUk7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfTU9ERV9TTUlJOgorCQlkZWZhdWx0OgorCQkJbW9kZSA9IFNNSUk7CisJCX0KKwkJem1paS0+YmFzZS0+ZmVyICY9IH5aTUlJX0ZFUl9NQVNLKGlucHV0KTsKKwkJem1paS0+YmFzZS0+ZmVyIHw9IHptaWlfZW5hYmxlW2lucHV0XVttb2RlXTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKCh6bWlpLT5iYXNlLT5mZXIgJiBaTUlJX0ZFUl9NQVNLKGlucHV0KSkgPDwgKDQgKiBpbnB1dCkpIHsKKwkJY2FzZSBaTUlJX01JSTA6CisJCQltb2RlID0gTUlJOworCQkJYnJlYWs7CisJCWNhc2UgWk1JSV9STUlJMDoKKwkJCW1vZGUgPSBSTUlJOworCQkJYnJlYWs7CisJCWNhc2UgWk1JSV9TTUlJMDoKKwkJCW1vZGUgPSBTTUlJOworCQl9CisJfQorCisJLyogU2V0IG1vZGUgdG8gU01JSSBpZiBub3RoaW5nIHZhbGlkIGlzIGRldGVjdGVkICovCisJaWYgKG1vZGUgPCAwKQorCQltb2RlID0gU01JSTsKKworCXByaW50ayhLRVJOX05PVElDRSAiem1paSVkOiBpbnB1dCAlZCBpbiAlcyBtb2RlXG4iLAorCSAgICAgICB6bWlpX2Rldi0+ZGVmLT5pbmRleCwgaW5wdXQsIG1vZGVfbmFtZVttb2RlXSk7CisKKwl6bWlpLT5tb2RlW2lucHV0XSA9IG1vZGU7CisJem1paS0+dXNlcnMrKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbWFjX2VuYWJsZV96bWlpX3BvcnQoc3RydWN0IG9jcF9kZXZpY2UgKm9jcGRldiwgaW50IGlucHV0KQoreworCXUzMiBtYXNrOworCXN0cnVjdCBpYm1fb2NwX3ptaWkgKnptaWkgPSBaTUlJX1BSSVYob2NwZGV2KTsKKworCW1hc2sgPSBpbl9iZTMyKCZ6bWlpLT5iYXNlLT5mZXIpOworCW1hc2sgJj0gem1paV9lbmFibGVbaW5wdXRdW01ESV07CS8qIHR1cm4gYWxsIG5vbiBlbmFibGVkIE1ESSdzIG9mZiAqLworCW1hc2sgfD0gem1paV9lbmFibGVbaW5wdXRdW3ptaWktPm1vZGVbaW5wdXRdXSB8IG1kaV9lbmFibGVbaW5wdXRdOworCW91dF9iZTMyKCZ6bWlpLT5iYXNlLT5mZXIsIG1hc2spOworfQorCitzdGF0aWMgdm9pZAorZW1hY196bWlpX3BvcnRfc3BlZWQoc3RydWN0IG9jcF9kZXZpY2UgKm9jcGRldiwgaW50IGlucHV0LCBpbnQgc3BlZWQpCit7CisJc3RydWN0IGlibV9vY3Bfem1paSAqem1paSA9IFpNSUlfUFJJVihvY3BkZXYpOworCisJaWYgKHNwZWVkID09IDEwMCkKKwkJem1paV9zcGVlZCB8PSB6bWlpX3NwZWVkMTAwW2lucHV0XTsKKwllbHNlCisJCXptaWlfc3BlZWQgJj0gfnptaWlfc3BlZWQxMDBbaW5wdXRdOworCisJb3V0X2JlMzIoJnptaWktPmJhc2UtPnNzciwgem1paV9zcGVlZCk7Cit9CisKK3N0YXRpYyB2b2lkIGVtYWNfY2xvc2Vfem1paShzdHJ1Y3Qgb2NwX2RldmljZSAqb2NwZGV2KQoreworCXN0cnVjdCBpYm1fb2NwX3ptaWkgKnptaWkgPSBaTUlJX1BSSVYob2NwZGV2KTsKKwlCVUdfT04oIXptaWkgfHwgem1paS0+dXNlcnMgPT0gMCk7CisKKwlpZiAoIS0tem1paS0+dXNlcnMpIHsKKwkJb2NwX3NldF9kcnZkYXRhKG9jcGRldiwgTlVMTCk7CisJCWlvdW5tYXAoKHZvaWQgKil6bWlpLT5iYXNlKTsKKwkJa2ZyZWUoem1paSk7CisJfQorfQorCitpbnQgZW1hY19waHlfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnKQoreworCWludCBjb3VudDsKKwl1aW50MzJfdCBzdGFjcjsKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gZGV2LT5wcml2OworCWVtYWNfdCAqZW1hY3AgPSBmZXAtPmVtYWNwOworCisJTURJT19ERUJVRygoIiVzOiBwaHlfcmVhZCwgaWQ6IDB4JXgsIHJlZzogMHgleFxuIiwgZGV2LT5uYW1lLCBtaWlfaWQsCisJCSAgICByZWcpKTsKKworCS8qIEVuYWJsZSBwcm9wZXIgWk1JSSBwb3J0ICovCisJaWYgKGZlcC0+em1paV9kZXYpCisJCWVtYWNfZW5hYmxlX3ptaWlfcG9ydChmZXAtPnptaWlfZGV2LCBmZXAtPnptaWlfaW5wdXQpOworCisJLyogVXNlIHRoZSBFTUFDIHRoYXQgaGFzIHRoZSBNRElPIHBvcnQgKi8KKwlpZiAoZmVwLT5tZGlvX2RldikgeworCQlkZXYgPSBmZXAtPm1kaW9fZGV2OworCQlmZXAgPSBkZXYtPnByaXY7CisJCWVtYWNwID0gZmVwLT5lbWFjcDsKKwl9CisKKwljb3VudCA9IDA7CisJd2hpbGUgKCgoKHN0YWNyID0gaW5fYmUzMigmZW1hY3AtPmVtMHN0YWNyKSkgJiBFTUFDX1NUQUNSX09DKSA9PSAwKQorCQkJCQkmJiAoY291bnQrKyA8IE1ESU9fREVMQVkpKQorCQl1ZGVsYXkoMSk7CisJTURJT19ERUJVRygoIiAoY291bnQgd2FzICVkKVxuIiwgY291bnQpKTsKKworCWlmICgoc3RhY3IgJiBFTUFDX1NUQUNSX09DKSA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQSFkgcmVhZCB0aW1lb3V0ICMxIVxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIENsZWFyIHRoZSBzcGVlZCBiaXRzIGFuZCBtYWtlIGEgcmVhZCByZXF1ZXN0IHRvIHRoZSBQSFkgKi8KKwlzdGFjciA9ICgoRU1BQ19TVEFDUl9SRUFEIHwgKHJlZyAmIDB4MWYpKSAmIH5FTUFDX1NUQUNSX0NMS18xMDBNSFopOworCXN0YWNyIHw9ICgobWlpX2lkICYgMHgxRikgPDwgNSk7CisKKwlvdXRfYmUzMigmZW1hY3AtPmVtMHN0YWNyLCBzdGFjcik7CisKKwljb3VudCA9IDA7CisJd2hpbGUgKCgoKHN0YWNyID0gaW5fYmUzMigmZW1hY3AtPmVtMHN0YWNyKSkgJiBFTUFDX1NUQUNSX09DKSA9PSAwKQorCQkJCQkmJiAoY291bnQrKyA8IE1ESU9fREVMQVkpKQorCQl1ZGVsYXkoMSk7CisJTURJT19ERUJVRygoIiAoY291bnQgd2FzICVkKVxuIiwgY291bnQpKTsKKworCWlmICgoc3RhY3IgJiBFTUFDX1NUQUNSX09DKSA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQSFkgcmVhZCB0aW1lb3V0ICMyIVxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIENoZWNrIGZvciBhIHJlYWQgZXJyb3IgKi8KKwlpZiAoc3RhY3IgJiBFTUFDX1NUQUNSX1BIWUUpIHsKKwkJTURJT19ERUJVRygoIkVNQUMgTURJTyBQSFkgZXJyb3IgIVxuIikpOworCQlyZXR1cm4gLTE7CisJfQorCisJTURJT19ERUJVRygoIiAtPiAweCV4XG4iLCBzdGFjciA+PiAxNikpOworCisJcmV0dXJuIChzdGFjciA+PiAxNik7Cit9CisKK3ZvaWQgZW1hY19waHlfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1paV9pZCwgaW50IHJlZywgaW50IGRhdGEpCit7CisJaW50IGNvdW50OworCXVpbnQzMl90IHN0YWNyOworCXN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICpmZXAgPSBkZXYtPnByaXY7CisJZW1hY190ICplbWFjcCA9IGZlcC0+ZW1hY3A7CisKKwlNRElPX0RFQlVHKCgiJXMgcGh5X3dyaXRlLCBpZDogMHgleCwgcmVnOiAweCV4LCBkYXRhOiAweCV4XG4iLAorCQkgICAgZGV2LT5uYW1lLCBtaWlfaWQsIHJlZywgZGF0YSkpOworCisJLyogRW5hYmxlIHByb3BlciBaTUlJIHBvcnQgKi8KKwlpZiAoZmVwLT56bWlpX2RldikKKwkJZW1hY19lbmFibGVfem1paV9wb3J0KGZlcC0+em1paV9kZXYsIGZlcC0+em1paV9pbnB1dCk7CisKKwkvKiBVc2UgdGhlIEVNQUMgdGhhdCBoYXMgdGhlIE1ESU8gcG9ydCAqLworCWlmIChmZXAtPm1kaW9fZGV2KSB7CisJCWRldiA9IGZlcC0+bWRpb19kZXY7CisJCWZlcCA9IGRldi0+cHJpdjsKKwkJZW1hY3AgPSBmZXAtPmVtYWNwOworCX0KKworCWNvdW50ID0gMDsKKwl3aGlsZSAoKCgoc3RhY3IgPSBpbl9iZTMyKCZlbWFjcC0+ZW0wc3RhY3IpKSAmIEVNQUNfU1RBQ1JfT0MpID09IDApCisJCQkJCSYmIChjb3VudCsrIDwgTURJT19ERUxBWSkpCisJCXVkZWxheSgxKTsKKwlNRElPX0RFQlVHKCgiIChjb3VudCB3YXMgJWQpXG4iLCBjb3VudCkpOworCisJaWYgKChzdGFjciAmIEVNQUNfU1RBQ1JfT0MpID09IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFBIWSB3cml0ZSB0aW1lb3V0ICMyIVxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENsZWFyIHRoZSBzcGVlZCBiaXRzIGFuZCBtYWtlIGEgcmVhZCByZXF1ZXN0IHRvIHRoZSBQSFkgKi8KKworCXN0YWNyID0gKChFTUFDX1NUQUNSX1dSSVRFIHwgKHJlZyAmIDB4MWYpKSAmIH5FTUFDX1NUQUNSX0NMS18xMDBNSFopOworCXN0YWNyIHw9ICgobWlpX2lkICYgMHgxZikgPDwgNSkgfCAoKGRhdGEgJiAweGZmZmYpIDw8IDE2KTsKKworCW91dF9iZTMyKCZlbWFjcC0+ZW0wc3RhY3IsIHN0YWNyKTsKKworCWNvdW50ID0gMDsKKwl3aGlsZSAoKCgoc3RhY3IgPSBpbl9iZTMyKCZlbWFjcC0+ZW0wc3RhY3IpKSAmIEVNQUNfU1RBQ1JfT0MpID09IDApCisJCQkJCSYmIChjb3VudCsrIDwgTURJT19ERUxBWSkpCisJCXVkZWxheSgxKTsKKwlNRElPX0RFQlVHKCgiIChjb3VudCB3YXMgJWQpXG4iLCBjb3VudCkpOworCisJaWYgKChzdGFjciAmIEVNQUNfU1RBQ1JfT0MpID09IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQSFkgd3JpdGUgdGltZW91dCAjMiFcbiIsIGRldi0+bmFtZSk7CisKKwkvKiBDaGVjayBmb3IgYSB3cml0ZSBlcnJvciAqLworCWlmICgoc3RhY3IgJiBFTUFDX1NUQUNSX1BIWUUpICE9IDApIHsKKwkJTURJT19ERUJVRygoIkVNQUMgTURJTyBQSFkgZXJyb3IgIVxuIikpOworCX0KK30KKworc3RhdGljIHZvaWQgZW1hY190eGVvYl9kZXYodm9pZCAqcGFyYW0sIHUzMiBjaGFubWFzaykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGFyYW07CisJc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZlcC0+bG9jaywgZmxhZ3MpOworCisJUEtUX0RFQlVHKCgiZW1hY190eGVvYl9kZXYoKSBlbnRyeSwgdHhfY250OiAlZFxuIiwgZmVwLT50eF9jbnQpKTsKKworCXdoaWxlIChmZXAtPnR4X2NudCAmJgorCSAgICAgICAhKGZlcC0+dHhfZGVzY1tmZXAtPmFja19zbG90XS5jdHJsICYgTUFMX1RYX0NUUkxfUkVBRFkpKSB7CisKKwkJaWYgKGZlcC0+dHhfZGVzY1tmZXAtPmFja19zbG90XS5jdHJsICYgTUFMX1RYX0NUUkxfTEFTVCkgeworCQkJLyogVGVsbCB0aGUgc3lzdGVtIHRoZSB0cmFuc21pdCBjb21wbGV0ZWQuICovCisJCQlkbWFfdW5tYXBfc2luZ2xlKCZmZXAtPm9jcGRldi0+ZGV2LAorCQkJCQkgZmVwLT50eF9kZXNjW2ZlcC0+YWNrX3Nsb3RdLmRhdGFfcHRyLAorCQkJCQkgZmVwLT50eF9kZXNjW2ZlcC0+YWNrX3Nsb3RdLmRhdGFfbGVuLAorCQkJCQkgRE1BX1RPX0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShmZXAtPnR4X3NrYltmZXAtPmFja19zbG90XSk7CisKKwkJCWlmIChmZXAtPnR4X2Rlc2NbZmVwLT5hY2tfc2xvdF0uY3RybCAmCisJCQkgICAgKEVNQUNfVFhfU1RfRUMgfCBFTUFDX1RYX1NUX01DIHwgRU1BQ19UWF9TVF9TQykpCisJCQkJZmVwLT5zdGF0cy5jb2xsaXNpb25zKys7CisJCX0KKworCQlmZXAtPnR4X3NrYltmZXAtPmFja19zbG90XSA9IChzdHJ1Y3Qgc2tfYnVmZiAqKU5VTEw7CisJCWlmICgrK2ZlcC0+YWNrX3Nsb3QgPT0gTlVNX1RYX0JVRkYpCisJCQlmZXAtPmFja19zbG90ID0gMDsKKworCQlmZXAtPnR4X2NudC0tOworCX0KKwlpZiAoZmVwLT50eF9jbnQgPCBOVU1fVFhfQlVGRikKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJUEtUX0RFQlVHKCgiZW1hY190eGVvYl9kZXYoKSBleGl0LCB0eF9jbnQ6ICVkXG4iLCBmZXAtPnR4X2NudCkpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmVwLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgIEZpbGwvUmUtZmlsbCB0aGUgcnggY2hhaW4gd2l0aCB2YWxpZCBjdHJsL3B0cnMuCisgIFRoaXMgZnVuY3Rpb24gd2lsbCBmaWxsIGZyb20gcnhfc2xvdCB1cCB0byB0aGUgcGFybSBlbmQuCisgIFNvIHRvIGNvbXBsZXRlbHkgZmlsbCB0aGUgY2hhaW4gcHJlLXNldCByeF9zbG90IHRvIDAgYW5kCisgIHBhc3MgaW4gYW4gZW5kIG9mIDAuCisgKi8KK3N0YXRpYyB2b2lkIGVtYWNfcnhfZmlsbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZW5kKQoreworCWludCBpOworCXN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICpmZXAgPSBkZXYtPnByaXY7CisKKwlpID0gZmVwLT5yeF9zbG90OworCWRvIHsKKwkJLyogV2UgZG9uJ3Qgd2FudCB0aGUgMTYgYnl0ZXMgc2tiX3Jlc2VydmUgZG9uZSBieSBkZXZfYWxsb2Nfc2tiLAorCQkgKiBpdCBicmVha3Mgb3VyIGNhY2hlIGxpbmUgYWxpZ25lbWVudC4gSG93ZXZlciwgd2Ugc3RpbGwgYWxsb2NhdGUKKwkJICogKzE2IHNvIHRoYXQgd2UgZW5kIHVwIGFsbG9jYXRpbmcgdGhlIGV4YWN0IHNhbWUgc2l6ZSBhcworCQkgKiBkZXZfYWxsb2Nfc2tiKCkgd291bGQgZG8uCisJCSAqIEFsc28sIGJlY2F1c2Ugb2YgdGhlIHNrYl9yZXMsIHRoZSBtYXggRE1BIHNpemUgd2UgZ2l2ZSB0byBFTUFDCisJCSAqIGlzIHNsaWdobHkgd3JvbmcsIGNhdXNpbmcgaXQgdG8gcG90ZW50aWFsbHkgRE1BIDIgbW9yZSBieXRlcworCQkgKiBmcm9tIGEgYnJva2VuL292ZXJzaXplZCBwYWNrZXQuIFRoZXNlIDE2IGJ5dGVzIHdpbGwgdGFrZSBjYXJlCisJCSAqIHRoYXQgd2UgZG9uJ3Qgd2FsayBvbiBzb21lYm9keSBlbHNlIHRvZXMgd2l0aCB0aGF0LgorCQkgKi8KKwkJZmVwLT5yeF9za2JbaV0gPQorCQkgICAgYWxsb2Nfc2tiKGZlcC0+cnhfYnVmZmVyX3NpemUgKyAxNiwgR0ZQX0FUT01JQyk7CisKKwkJaWYgKGZlcC0+cnhfc2tiW2ldID09IE5VTEwpIHsKKwkJCS8qIEtlZXAgcnhfc2xvdCBoZXJlLCB0aGUgbmV4dCB0aW1lIGNsZWFuL2ZpbGwgaXMgY2FsbGVkCisJCQkgKiB3ZSB3aWxsIHRyeSBhZ2FpbiBiZWZvcmUgdGhlIE1BTCB3cmFwcyBiYWNrIGhlcmUKKwkJCSAqIElmIHRoZSBNQUwgdHJpZXMgdG8gdXNlIHRoaXMgZGVzY3JpcHRvciB3aXRoCisJCQkgKiB0aGUgRU1QVFkgYml0IG9mZiBpdCB3aWxsIGNhdXNlIHRoZQorCQkJICogcnhkZSBpbnRlcnJ1cHQuICBUaGF0IGlzIHdoZXJlIHdlIHdpbGwKKwkJCSAqIHRyeSBhZ2FpbiB0byBhbGxvY2F0ZSBhbiBza19idWZmLgorCQkJICovCisJCQlicmVhazsKKworCQl9CisKKwkJaWYgKHNrYl9yZXMpCisJCQlza2JfcmVzZXJ2ZShmZXAtPnJ4X3NrYltpXSwgc2tiX3Jlcyk7CisKKwkJLyogV2UgbXVzdCBOT1QgZG1hX21hcF9zaW5nbGUgdGhlIGNhY2hlIGxpbmUgcmlnaHQgYWZ0ZXIgdGhlCisJCSAqIGJ1ZmZlciwgc28gd2UgbXVzdCBjcm9wIG91ciBzeW5jIHNpemUgdG8gYWNjb3VudCBmb3IgdGhlCisJCSAqIHJlc2VydmVkIHNwYWNlCisJCSAqLworCQlmZXAtPnJ4X2Rlc2NbaV0uZGF0YV9wdHIgPQorCQkgICAgKHVuc2lnbmVkIGNoYXIgKilkbWFfbWFwX3NpbmdsZSgmZmVwLT5vY3BkZXYtPmRldiwKKwkJCQkJCSAgICAodm9pZCAqKWZlcC0+cnhfc2tiW2ldLT4KKwkJCQkJCSAgICBkYXRhLAorCQkJCQkJICAgIGZlcC0+cnhfYnVmZmVyX3NpemUgLQorCQkJCQkJICAgIHNrYl9yZXMsIERNQV9GUk9NX0RFVklDRSk7CisKKwkJLyoKKwkJICogU29tZSA0eHggaW1wbGVtZW50YXRpb25zIHVzZSB0aGUgcHJldmlvdXNseQorCQkgKiByZXNlcnZlZCBiaXRzIGluIGRhdGFfbGVuIHRvIGVuY29kZSB0aGUgTVMKKwkJICogNC1iaXRzIG9mIGEgMzYtYml0IHBoeXNpY2FsIGFkZHJlc3MgKEVSUE4pCisJCSAqIFRoaXMgbXVzdCBiZSBpbml0aWFsaXplZC4KKwkJICovCisJCWZlcC0+cnhfZGVzY1tpXS5kYXRhX2xlbiA9IDA7CisJCWZlcC0+cnhfZGVzY1tpXS5jdHJsID0gTUFMX1JYX0NUUkxfRU1QVFkgfCBNQUxfUlhfQ1RSTF9JTlRSIHwKKwkJICAgIChpID09IChOVU1fUlhfQlVGRiAtIDEpID8gTUFMX1JYX0NUUkxfV1JBUCA6IDApOworCisJfSB3aGlsZSAoKGkgPSAoaSArIDEpICUgTlVNX1JYX0JVRkYpICE9IGVuZCk7CisKKwlmZXAtPnJ4X3Nsb3QgPSBpOworfQorCitzdGF0aWMgdm9pZAorZW1hY19yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IGN0cmwsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCA9IGRldi0+cHJpdjsKKworCS8qIEV4aXQgaWYgaW50ZXJmYWNlIGhhcyBubyBUQUggZW5naW5lICovCisJaWYgKCFmZXAtPnRhaF9kZXYpIHsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQlyZXR1cm47CisJfQorCisJLyogQ2hlY2sgZm9yIFRDUC9VRFAvSVAgY3N1bSBlcnJvciAqLworCWlmIChjdHJsICYgRU1BQ19DU1VNX1ZFUl9FUlJPUikgeworCQkvKiBMZXQgdGhlIHN0YWNrIHZlcmlmeSBjaGVja3N1bSBlcnJvcnMgKi8KKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworLyoJCWFkYXB0ZXItPmh3X2NzdW1fZXJyKys7ICovCisJfSBlbHNlIHsKKwkJLyogQ3N1bSBpcyBnb29kICovCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisvKgkJYWRhcHRlci0+aHdfY3N1bV9nb29kKys7ICovCisJfQorfQorCitzdGF0aWMgaW50IGVtYWNfcnhfY2xlYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaSwgYiwgYm51bSA9IDAsIGJ1Zls2XTsKKwlpbnQgZXJyb3IsIGZyYW1lX2xlbmd0aDsKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gZGV2LT5wcml2OworCXVuc2lnbmVkIHNob3J0IGN0cmw7CisKKwlpID0gZmVwLT5yeF9zbG90OworCisJUEtUX0RFQlVHKCgiZW1hY19yeF9jbGVhbigpIGVudHJ5LCByeF9zbG90OiAlZFxuIiwgZmVwLT5yeF9zbG90KSk7CisKKwlkbyB7CisJCWlmIChmZXAtPnJ4X3NrYltpXSA9PSBOVUxMKQorCQkJY29udGludWU7CS8qd2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWQgdGhlIHBhY2tldCBidXQgaGF2ZWQgZmFpbGVkIHRvIGFsbG9jICovCisJCS8qIAorCQkgICBzaW5jZSByeF9kZXNjIGlzIGluIHVuY2FjaGVkIG1lbSB3ZSBkb24ndCBrZWVwIHJlYWRpbmcgaXQgZGlyZWN0bHkgCisJCSAgIHdlIHB1bGwgb3V0IGEgbG9jYWwgY29weSBvZiBjdHJsIGFuZCBkbyB0aGUgY2hlY2tzIG9uIHRoZSBjb3B5LgorCQkgKi8KKwkJY3RybCA9IGZlcC0+cnhfZGVzY1tpXS5jdHJsOworCQlpZiAoY3RybCAmIE1BTF9SWF9DVFJMX0VNUFRZKQorCQkJYnJlYWs7CS8qd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSByZWFkeSBwYWNrZXRzICovCisKKwkJaWYgKEVNQUNfSVNfQkFEX1JYX1BBQ0tFVChjdHJsKSkgeworCQkJZmVwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWZlcC0+c3RhdHMucnhfZHJvcHBlZCsrOworCisJCQlpZiAoY3RybCAmIEVNQUNfUlhfU1RfT0UpCisJCQkJZmVwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJaWYgKGN0cmwgJiBFTUFDX1JYX1NUX0FFKQorCQkJCWZlcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAoY3RybCAmIEVNQUNfUlhfU1RfQkZDUykKKwkJCQlmZXAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChjdHJsICYgKEVNQUNfUlhfU1RfUlAgfCBFTUFDX1JYX1NUX1BUTCB8CisJCQkJICAgIEVNQUNfUlhfU1RfT1JFIHwgRU1BQ19SWF9TVF9JUkUpKQorCQkJCWZlcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJaWYgKChjdHJsICYgKE1BTF9SWF9DVFJMX0ZJUlNUIHwgTUFMX1JYX0NUUkxfTEFTVCkpID09CisJCQkgICAgKE1BTF9SWF9DVFJMX0ZJUlNUIHwgTUFMX1JYX0NUUkxfTEFTVCkpIHsKKwkJCQkvKiBTaW5nbGUgZGVzY3JpcHRvciBwYWNrZXQgKi8KKwkJCQllbWFjX3J4X2NzdW0oZGV2LCBjdHJsLCBmZXAtPnJ4X3NrYltpXSk7CisJCQkJLyogU2VuZCB0aGUgc2tiIHVwIHRoZSBjaGFpbi4gKi8KKwkJCQlmcmFtZV9sZW5ndGggPSBmZXAtPnJ4X2Rlc2NbaV0uZGF0YV9sZW4gLSA0OworCQkJCXNrYl9wdXQoZmVwLT5yeF9za2JbaV0sIGZyYW1lX2xlbmd0aCk7CisJCQkJZmVwLT5yeF9za2JbaV0tPmRldiA9IGRldjsKKwkJCQlmZXAtPnJ4X3NrYltpXS0+cHJvdG9jb2wgPQorCQkJCSAgICBldGhfdHlwZV90cmFucyhmZXAtPnJ4X3NrYltpXSwgZGV2KTsKKwkJCQllcnJvciA9IG5ldGlmX3J4KGZlcC0+cnhfc2tiW2ldKTsKKworCQkJCWlmICgoZXJyb3IgPT0gTkVUX1JYX0RST1ApIHx8CisJCQkJICAgIChlcnJvciA9PSBORVRfUlhfQkFEKSkgeworCQkJCQlmZXAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQl9IGVsc2UgeworCQkJCQlmZXAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQkJZmVwLT5zdGF0cy5yeF9ieXRlcyArPSBmcmFtZV9sZW5ndGg7CisJCQkJfQorCQkJCWZlcC0+cnhfc2tiW2ldID0gTlVMTDsKKwkJCX0gZWxzZSB7CisJCQkJLyogTXVsdGlwbGUgZGVzY3JpcHRvciBwYWNrZXQgKi8KKwkJCQlpZiAoY3RybCAmIE1BTF9SWF9DVFJMX0ZJUlNUKSB7CisJCQkJCWlmIChmZXAtPnJ4X2Rlc2NbKGkgKyAxKSAlIE5VTV9SWF9CVUZGXS4KKwkJCQkJICAgIGN0cmwgJiBNQUxfUlhfQ1RSTF9FTVBUWSkKKwkJCQkJCWJyZWFrOworCQkJCQlibnVtID0gMDsKKwkJCQkJYnVmW2JudW1dID0gaTsKKwkJCQkJKytibnVtOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKCgoY3RybCAmIE1BTF9SWF9DVFJMX0ZJUlNUKSAhPQorCQkJCSAgICAgTUFMX1JYX0NUUkxfRklSU1QpICYmCisJCQkJICAgICgoY3RybCAmIE1BTF9SWF9DVFJMX0xBU1QpICE9CisJCQkJICAgICBNQUxfUlhfQ1RSTF9MQVNUKSkgeworCQkJCQlpZiAoZmVwLT5yeF9kZXNjWyhpICsgMSkgJQorCQkJCQkJCSBOVU1fUlhfQlVGRl0uY3RybCAmCisJCQkJCSAgICBNQUxfUlhfQ1RSTF9FTVBUWSkgeworCQkJCQkJaSA9IGJ1ZlswXTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWJ1ZltibnVtXSA9IGk7CisJCQkJCSsrYm51bTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmIChjdHJsICYgTUFMX1JYX0NUUkxfTEFTVCkgeworCQkJCQlidWZbYm51bV0gPSBpOworCQkJCQkrK2JudW07CisJCQkJCXNrYl9wdXQoZmVwLT5yeF9za2JbYnVmWzBdXSwKKwkJCQkJCWZlcC0+cnhfZGVzY1tidWZbMF1dLmRhdGFfbGVuKTsKKwkJCQkJZm9yIChiID0gMTsgYiA8IGJudW07IGIrKykgeworCQkJCQkJLyoKKwkJCQkJCSAqIE1BTCBpcyBicmFpbmRlYWQsIHdlIG5lZWQKKwkJCQkJCSAqIHRvIGNvcHkgdGhlIHJlbWFpbmRlcgorCQkJCQkJICogb2YgdGhlIHBhY2tldCBmcm9tIHRoZQorCQkJCQkJICogbGF0dGVyIGRlc2NyaXB0b3IgYnVmZmVycworCQkJCQkJICogdG8gdGhlIGZpcnN0IHNrYi4gVGhlbgorCQkJCQkJICogZGlzcG9zZSBvZiB0aGUgc291cmNlCisJCQkJCQkgKiBza2JzLgorCQkJCQkJICoKKwkJCQkJCSAqIE9uY2UgdGhlIHN0YWNrIGlzIGZpeGVkCisJCQkJCQkgKiB0byBoYW5kbGUgZnJhZ3Mgb24gbW9zdAorCQkJCQkJICogcHJvdG9jb2xzIHdlIGNhbiBnZW5lcmF0ZQorCQkJCQkJICogYSBmcmFnbWVudGVkIHNrYiB3aXRoCisJCQkJCQkgKiBubyBjb3BpZXMuCisJCQkJCQkgKi8KKwkJCQkJCW1lbWNweShmZXAtPnJ4X3NrYltidWZbMF1dLT4KKwkJCQkJCSAgICAgICBkYXRhICsKKwkJCQkJCSAgICAgICBmZXAtPnJ4X3NrYltidWZbMF1dLT5sZW4sCisJCQkJCQkgICAgICAgZmVwLT5yeF9za2JbYnVmW2JdXS0+CisJCQkJCQkgICAgICAgZGF0YSwKKwkJCQkJCSAgICAgICBmZXAtPnJ4X2Rlc2NbYnVmW2JdXS4KKwkJCQkJCSAgICAgICBkYXRhX2xlbik7CisJCQkJCQlza2JfcHV0KGZlcC0+cnhfc2tiW2J1ZlswXV0sCisJCQkJCQkJZmVwLT5yeF9kZXNjW2J1ZltiXV0uCisJCQkJCQkJZGF0YV9sZW4pOworCQkJCQkJZG1hX3VubWFwX3NpbmdsZSgmZmVwLT5vY3BkZXYtPgorCQkJCQkJCQkgZGV2LAorCQkJCQkJCQkgZmVwLT4KKwkJCQkJCQkJIHJ4X2Rlc2NbYnVmCisJCQkJCQkJCQkgW2JdXS4KKwkJCQkJCQkJIGRhdGFfcHRyLAorCQkJCQkJCQkgZmVwLT4KKwkJCQkJCQkJIHJ4X2Rlc2NbYnVmCisJCQkJCQkJCQkgW2JdXS4KKwkJCQkJCQkJIGRhdGFfbGVuLAorCQkJCQkJCQkgRE1BX0ZST01fREVWSUNFKTsKKwkJCQkJCWRldl9rZnJlZV9za2IoZmVwLT4KKwkJCQkJCQkgICAgICByeF9za2JbYnVmW2JdXSk7CisJCQkJCX0KKwkJCQkJZW1hY19yeF9jc3VtKGRldiwgY3RybCwKKwkJCQkJCSAgICAgZmVwLT5yeF9za2JbYnVmWzBdXSk7CisKKwkJCQkJZmVwLT5yeF9za2JbYnVmWzBdXS0+ZGV2ID0gZGV2OworCQkJCQlmZXAtPnJ4X3NrYltidWZbMF1dLT5wcm90b2NvbCA9CisJCQkJCSAgICBldGhfdHlwZV90cmFucyhmZXAtPnJ4X3NrYltidWZbMF1dLAorCQkJCQkJCSAgIGRldik7CisJCQkJCWVycm9yID0gbmV0aWZfcngoZmVwLT5yeF9za2JbYnVmWzBdXSk7CisKKwkJCQkJaWYgKChlcnJvciA9PSBORVRfUlhfRFJPUCkKKwkJCQkJICAgIHx8IChlcnJvciA9PSBORVRfUlhfQkFEKSkgeworCQkJCQkJZmVwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlmZXAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQkJCWZlcC0+c3RhdHMucnhfYnl0ZXMgKz0KKwkJCQkJCSAgICBmZXAtPnJ4X3NrYltidWZbMF1dLT5sZW47CisJCQkJCX0KKwkJCQkJZm9yIChiID0gMDsgYiA8IGJudW07IGIrKykKKwkJCQkJCWZlcC0+cnhfc2tiW2J1ZltiXV0gPSBOVUxMOworCQkJCX0KKwkJCX0KKwkJfQorCX0gd2hpbGUgKChpID0gKGkgKyAxKSAlIE5VTV9SWF9CVUZGKSAhPSBmZXAtPnJ4X3Nsb3QpOworCisJUEtUX0RFQlVHKCgiZW1hY19yeF9jbGVhbigpIGV4aXQsIHJ4X3Nsb3Q6ICVkXG4iLCBmZXAtPnJ4X3Nsb3QpKTsKKworCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBlbWFjX3J4ZW9iX2Rldih2b2lkICpwYXJhbSwgdTMyIGNoYW5tYXNrKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwYXJhbTsKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmVwLT5sb2NrLCBmbGFncyk7CisJaWYgKChuID0gZW1hY19yeF9jbGVhbihkZXYpKSAhPSBmZXAtPnJ4X3Nsb3QpCisJCWVtYWNfcnhfZmlsbChkZXYsIG4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZlcC0+bG9jaywgZmxhZ3MpOworfQorCisvKgorICogVGhpcyBpbnRlcnJ1cHQgc2hvdWxkIG5ldmVyIG9jY3Vyciwgd2UgZG9uJ3QgcHJvZ3JhbQorICogdGhlIE1BTCBmb3IgY29udGl1bm91cyBtb2RlLgorICovCitzdGF0aWMgdm9pZCBlbWFjX3R4ZGVfZGV2KHZvaWQgKnBhcmFtLCB1MzIgY2hhbm1hc2spCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBhcmFtOworCXN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICpmZXAgPSBkZXYtPnByaXY7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgZGVzY3JpcHRvciBlcnJvclxuIiwgZGV2LT5uYW1lKTsKKworCWVtYWNfbWFjX2R1bXAoZGV2KTsKKwllbWFjX21hbF9kdW1wKGRldik7CisKKwkvKiBSZWVuYWJsZSB0aGUgdHJhbnNtaXQgY2hhbm5lbCAqLworCW1hbF9lbmFibGVfdHhfY2hhbm5lbHMoZmVwLT5tYWwsIGZlcC0+Y29tbWFjLnR4X2NoYW5fbWFzayk7Cit9CisKKy8qCisgKiBUaGlzIGludGVycnVwdCBzaG91bGQgYmUgdmVyeSByYXJlIGF0IGJlc3QuICBUaGlzIG9jY3VycyB3aGVuCisgKiB0aGUgaGFyZHdhcmUgaGFzIGEgcHJvYmxlbSB3aXRoIHRoZSByZWNlaXZlIGRlc2NyaXB0b3JzLiAgVGhlIG1hbnVhbAorICogc3RhdGVzIHRoYXQgaXQgb2NjdXJzIHdoZW4gdGhlIGhhcmR3YXJlIGNhbm5vdCB0aGUgcmVjZWl2ZSBkZXNjcmlwdG9yCisgKiBlbXB0eSBiaXQgaXMgbm90IHNldC4gIFRoZSByZWNvdmVyeSBtZWNoYW5pc20gd2lsbCBiZSB0bworICogdHJhdmVyc2UgdGhyb3VnaCB0aGUgZGVzY3JpcHRvcnMsIGhhbmRsZSBhbnkgdGhhdCBhcmUgbWFya2VkIHRvIGJlCisgKiBoYW5kbGVkIGFuZCByZWluaXRpYWxpemUgZWFjaCBhbG9uZyB0aGUgd2F5LiAgQXQgdGhhdCBwb2ludCB0aGUgZHJpdmVyCisgKiB3aWxsIGJlIHJlc3RhcnRlZC4KKyAqLworc3RhdGljIHZvaWQgZW1hY19yeGRlX2Rldih2b2lkICpwYXJhbSwgdTMyIGNoYW5tYXNrKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwYXJhbTsKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByZWNlaXZlIGRlc2NyaXB0b3IgZXJyb3JcbiIsCisJCSAgICAgICBmZXAtPm5kZXYtPm5hbWUpOworCisJCWVtYWNfbWFjX2R1bXAoZGV2KTsKKwkJZW1hY19tYWxfZHVtcChkZXYpOworCQllbWFjX2Rlc2NfZHVtcChkZXYpOworCX0KKworCS8qIERpc2FibGUgUlggY2hhbm5lbCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZmZXAtPmxvY2ssIGZsYWdzKTsKKwltYWxfZGlzYWJsZV9yeF9jaGFubmVscyhmZXAtPm1hbCwgZmVwLT5jb21tYWMucnhfY2hhbl9tYXNrKTsKKworCS8qIEZvciBub3csIGNoYXJnZSB0aGUgZXJyb3IgYWdhaW5zdCBhbGwgZW1hY3MgKi8KKwlmZXAtPnN0YXRzLnJ4X2Vycm9ycysrOworCisJLyogc28gZG8gd2UgaGF2ZSBhbnkgZ29vZCBwYWNrZXRzIHN0aWxsPyAqLworCWVtYWNfcnhfY2xlYW4oZGV2KTsKKworCS8qIFdoZW4gdGhlIGludGVyZmFjZSBpcyByZXN0YXJ0ZWQgaXQgcmVzZXRzIHByb2Nlc3NpbmcgdG8gdGhlCisJICogIGZpcnN0IGRlc2NyaXB0b3IgaW4gdGhlIHRhYmxlLgorCSAqLworCisJZmVwLT5yeF9zbG90ID0gMDsKKwllbWFjX3J4X2ZpbGwoZGV2LCAwKTsKKworCXNldF9tYWxfZGNybihmZXAtPm1hbCwgRENSTl9NQUxSWEVPQklTUiwgZmVwLT5jb21tYWMucnhfY2hhbl9tYXNrKTsKKwlzZXRfbWFsX2Rjcm4oZmVwLT5tYWwsIERDUk5fTUFMUlhERUlSLCBmZXAtPmNvbW1hYy5yeF9jaGFuX21hc2spOworCisJLyogUmVlbmFibGUgdGhlIHJlY2VpdmUgY2hhbm5lbHMgKi8KKwltYWxfZW5hYmxlX3J4X2NoYW5uZWxzKGZlcC0+bWFsLCBmZXAtPmNvbW1hYy5yeF9jaGFuX21hc2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZlcC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QKK2VtYWNfbWFjX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCA9IGRldi0+cHJpdjsKKwllbWFjX3QgKmVtYWNwID0gZmVwLT5lbWFjcDsKKwl1bnNpZ25lZCBsb25nIHRtcF9lbTBpc3I7CisKKwkvKiBFTUFDIGludGVycnVwdCAqLworCXRtcF9lbTBpc3IgPSBpbl9iZTMyKCZlbWFjcC0+ZW0waXNyKTsKKwlpZiAodG1wX2VtMGlzciAmIChFTUFDX0lTUl9URTAgfCBFTUFDX0lTUl9URTEpKSB7CisJCS8qIFRoaXMgZXJyb3IgaXMgYSBoYXJkIHRyYW5zbWl0IGVycm9yIC0gY291bGQgcmV0cmFuc21pdCAqLworCQlmZXAtPnN0YXRzLnR4X2Vycm9ycysrOworCisJCS8qIFJlZW5hYmxlIHRoZSB0cmFuc21pdCBjaGFubmVsICovCisJCW1hbF9lbmFibGVfdHhfY2hhbm5lbHMoZmVwLT5tYWwsIGZlcC0+Y29tbWFjLnR4X2NoYW5fbWFzayk7CisKKwl9IGVsc2UgeworCQlmZXAtPnN0YXRzLnJ4X2Vycm9ycysrOworCX0KKworCWlmICh0bXBfZW0waXNyICYgRU1BQ19JU1JfUlApCisJCWZlcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCWlmICh0bXBfZW0waXNyICYgRU1BQ19JU1JfQUxFKQorCQlmZXAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCWlmICh0bXBfZW0waXNyICYgRU1BQ19JU1JfQkZDUykKKwkJZmVwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJaWYgKHRtcF9lbTBpc3IgJiBFTUFDX0lTUl9QVExFKQorCQlmZXAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwlpZiAodG1wX2VtMGlzciAmIEVNQUNfSVNSX09SRSkKKwkJZmVwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJaWYgKHRtcF9lbTBpc3IgJiBFTUFDX0lTUl9URTApCisJCWZlcC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKworCWVtYWNfZXJyX2R1bXAoZGV2LCB0bXBfZW0waXNyKTsKKworCW91dF9iZTMyKCZlbWFjcC0+ZW0waXNyLCB0bXBfZW0waXNyKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBlbWFjX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBzaG9ydCBjdHJsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCA9IGRldi0+cHJpdjsKKwllbWFjX3QgKmVtYWNwID0gZmVwLT5lbWFjcDsKKwlpbnQgbGVuID0gc2tiLT5sZW47CisJdW5zaWduZWQgaW50IG9mZnNldCA9IDAsIHNpemUsIGYsIHR4X3Nsb3RfZmlyc3Q7CisJdW5zaWduZWQgaW50IG5yX2ZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmZXAtPmxvY2ssIGZsYWdzKTsKKworCWxlbiAtPSBza2ItPmRhdGFfbGVuOworCisJaWYgKChmZXAtPnR4X2NudCArIG5yX2ZyYWdzICsgbGVuIC8gREVTQ19CVUZfU0laRSArIDEpID4gTlVNX1RYX0JVRkYpIHsKKwkJUEtUX0RFQlVHKCgiZW1hY19zdGFydF94bWl0KCkgc3RvcHBpbmcgcXVldWVcbiIpKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZXAtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwl0eF9zbG90X2ZpcnN0ID0gZmVwLT50eF9zbG90OworCisJd2hpbGUgKGxlbikgeworCQlzaXplID0gbWluKGxlbiwgREVTQ19CVUZfU0laRSk7CisKKwkJZmVwLT50eF9kZXNjW2ZlcC0+dHhfc2xvdF0uZGF0YV9sZW4gPSAoc2hvcnQpc2l6ZTsKKwkJZmVwLT50eF9kZXNjW2ZlcC0+dHhfc2xvdF0uZGF0YV9wdHIgPQorCQkgICAgKHVuc2lnbmVkIGNoYXIgKilkbWFfbWFwX3NpbmdsZSgmZmVwLT5vY3BkZXYtPmRldiwKKwkJCQkJCSAgICAodm9pZCAqKSgodW5zaWduZWQgaW50KXNrYi0+CisJCQkJCQkJICAgICBkYXRhICsgb2Zmc2V0KSwKKwkJCQkJCSAgICBzaXplLCBETUFfVE9fREVWSUNFKTsKKworCQljdHJsID0gRU1BQ19UWF9DVFJMX0RGTFQ7CisJCWlmIChmZXAtPnR4X3Nsb3QgIT0gdHhfc2xvdF9maXJzdCkKKwkJCWN0cmwgfD0gTUFMX1RYX0NUUkxfUkVBRFk7CisJCWlmICgoTlVNX1RYX0JVRkYgLSAxKSA9PSBmZXAtPnR4X3Nsb3QpCisJCQljdHJsIHw9IE1BTF9UWF9DVFJMX1dSQVA7CisJCWlmICghbnJfZnJhZ3MgJiYgKGxlbiA9PSBzaXplKSkgeworCQkJY3RybCB8PSBNQUxfVFhfQ1RSTF9MQVNUOworCQkJZmVwLT50eF9za2JbZmVwLT50eF9zbG90XSA9IHNrYjsKKwkJfQorCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpCisJCQljdHJsIHw9IEVNQUNfVFhfQ1RSTF9UQUhfQ1NVTTsKKworCQlmZXAtPnR4X2Rlc2NbZmVwLT50eF9zbG90XS5jdHJsID0gY3RybDsKKworCQlsZW4gLT0gc2l6ZTsKKwkJb2Zmc2V0ICs9IHNpemU7CisKKwkJLyogQnVtcCB0eCBjb3VudCAqLworCQlpZiAoKytmZXAtPnR4X2NudCA9PSBOVU1fVFhfQlVGRikKKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQkvKiBOZXh0IGRlc2NyaXB0b3IgKi8KKwkJaWYgKCsrZmVwLT50eF9zbG90ID09IE5VTV9UWF9CVUZGKQorCQkJZmVwLT50eF9zbG90ID0gMDsKKwl9CisKKwlmb3IgKGYgPSAwOyBmIDwgbnJfZnJhZ3M7IGYrKykgeworCQlzdHJ1Y3Qgc2tiX2ZyYWdfc3RydWN0ICpmcmFnOworCisJCWZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tmXTsKKwkJbGVuID0gZnJhZy0+c2l6ZTsKKwkJb2Zmc2V0ID0gMDsKKworCQl3aGlsZSAobGVuKSB7CisJCQlzaXplID0gbWluKGxlbiwgREVTQ19CVUZfU0laRSk7CisKKwkJCWRtYV9tYXBfcGFnZSgmZmVwLT5vY3BkZXYtPmRldiwKKwkJCQkgICAgIGZyYWctPnBhZ2UsCisJCQkJICAgICBmcmFnLT5wYWdlX29mZnNldCArIG9mZnNldCwKKwkJCQkgICAgIHNpemUsIERNQV9UT19ERVZJQ0UpOworCisJCQljdHJsID0gRU1BQ19UWF9DVFJMX0RGTFQgfCBNQUxfVFhfQ1RSTF9SRUFEWTsKKwkJCWlmICgoTlVNX1RYX0JVRkYgLSAxKSA9PSBmZXAtPnR4X3Nsb3QpCisJCQkJY3RybCB8PSBNQUxfVFhfQ1RSTF9XUkFQOworCQkJaWYgKChmID09IChucl9mcmFncyAtIDEpKSAmJiAobGVuID09IHNpemUpKSB7CisJCQkJY3RybCB8PSBNQUxfVFhfQ1RSTF9MQVNUOworCQkJCWZlcC0+dHhfc2tiW2ZlcC0+dHhfc2xvdF0gPSBza2I7CisJCQl9CisKKwkJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykKKwkJCQljdHJsIHw9IEVNQUNfVFhfQ1RSTF9UQUhfQ1NVTTsKKworCQkJZmVwLT50eF9kZXNjW2ZlcC0+dHhfc2xvdF0uZGF0YV9sZW4gPSAoc2hvcnQpc2l6ZTsKKwkJCWZlcC0+dHhfZGVzY1tmZXAtPnR4X3Nsb3RdLmRhdGFfcHRyID0KKwkJCSAgICAoY2hhciAqKSgocGFnZV90b19wZm4oZnJhZy0+cGFnZSkgPDwgUEFHRV9TSElGVCkgKworCQkJCSAgICAgZnJhZy0+cGFnZV9vZmZzZXQgKyBvZmZzZXQpOworCQkJZmVwLT50eF9kZXNjW2ZlcC0+dHhfc2xvdF0uY3RybCA9IGN0cmw7CisKKwkJCWxlbiAtPSBzaXplOworCQkJb2Zmc2V0ICs9IHNpemU7CisKKwkJCS8qIEJ1bXAgdHggY291bnQgKi8KKwkJCWlmICgrK2ZlcC0+dHhfY250ID09IE5VTV9UWF9CVUZGKQorCQkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQkJLyogTmV4dCBkZXNjcmlwdG9yICovCisJCQlpZiAoKytmZXAtPnR4X3Nsb3QgPT0gTlVNX1RYX0JVRkYpCisJCQkJZmVwLT50eF9zbG90ID0gMDsKKwkJfQorCX0KKworCS8qCisJICogRGVmZXJyZWQgc2V0IFJFQURZIG9uIGZpcnN0IGRlc2NyaXB0b3Igb2YgcGFja2V0IHRvCisJICogYXZvaWQgVFggTUFMIHJhY2UuCisJICovCisJZmVwLT50eF9kZXNjW3R4X3Nsb3RfZmlyc3RdLmN0cmwgfD0gTUFMX1RYX0NUUkxfUkVBRFk7CisKKwkvKiBTZW5kIHRoZSBwYWNrZXQgb3V0LiAqLworCW91dF9iZTMyKCZlbWFjcC0+ZW0wdG1yMCwgRU1BQ19UTVIwX1hNSVQpOworCisJZmVwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJZmVwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCVBLVF9ERUJVRygoImVtYWNfc3RhcnRfeG1pdCgpIGV4aXRuIikpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmVwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbWFjX2FkanVzdF90b19saW5rKHN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICpmZXApCit7CisJZW1hY190ICplbWFjcCA9IGZlcC0+ZW1hY3A7CisJdW5zaWduZWQgbG9uZyBtb2RlX3JlZzsKKwlpbnQgZnVsbF9kdXBsZXgsIHNwZWVkOworCisJZnVsbF9kdXBsZXggPSAwOworCXNwZWVkID0gU1BFRURfMTA7CisKKwkvKiBzZXQgbW9kZSByZWdpc3RlciAxIGRlZmF1bHRzICovCisJbW9kZV9yZWcgPSBFTUFDX00xX0RFRkFVTFQ7CisKKwkvKiBSZWFkIGxpbmsgbW9kZSBvbiBQSFkgKi8KKwlpZiAoZmVwLT5waHlfbWlpLmRlZi0+b3BzLT5yZWFkX2xpbmsoJmZlcC0+cGh5X21paSkgPT0gMCkgeworCQkvKiBJZiBhbiBlcnJvciBvY2N1cnJlZCwgd2UgZG9uJ3QgZGVhbCB3aXRoIGl0IHlldCAqLworCQlmdWxsX2R1cGxleCA9IChmZXAtPnBoeV9taWkuZHVwbGV4ID09IERVUExFWF9GVUxMKTsKKwkJc3BlZWQgPSBmZXAtPnBoeV9taWkuc3BlZWQ7CisJfQorCisKKwkvKiBzZXQgc3BlZWQgKGRlZmF1bHQgaXMgMTBNYikgKi8KKwlzd2l0Y2ggKHNwZWVkKSB7CisJY2FzZSBTUEVFRF8xMDAwOgorCQltb2RlX3JlZyB8PSBFTUFDX00xX1JGU18xNks7CisJCWlmIChmZXAtPnJnbWlpX2RldikgeworCQkJc3RydWN0IGlibV9vY3BfcmdtaWkgKnJnbWlpID0gUkdNSUlfUFJJVihmZXAtPnJnbWlpX2Rldik7CisKKwkJCWlmICgocmdtaWktPm1vZGVbZmVwLT5yZ21paV9pbnB1dF0gPT0gUlRCSSkKKwkJCSAgICB8fCAocmdtaWktPm1vZGVbZmVwLT5yZ21paV9pbnB1dF0gPT0gVEJJKSkKKwkJCQltb2RlX3JlZyB8PSBFTUFDX00xX01GXzEwMDBHUENTOworCQkJZWxzZQorCQkJCW1vZGVfcmVnIHw9IEVNQUNfTTFfTUZfMTAwME1CUFM7CisKKwkJCWVtYWNfcmdtaWlfcG9ydF9zcGVlZChmZXAtPnJnbWlpX2RldiwgZmVwLT5yZ21paV9pbnB1dCwKKwkJCQkJICAgICAgMTAwMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMDA6CisJCW1vZGVfcmVnIHw9IEVNQUNfTTFfTUZfMTAwTUJQUyB8IEVNQUNfTTFfUkZTXzRLOworCQlpZiAoZmVwLT5yZ21paV9kZXYpCisJCQllbWFjX3JnbWlpX3BvcnRfc3BlZWQoZmVwLT5yZ21paV9kZXYsIGZlcC0+cmdtaWlfaW5wdXQsCisJCQkJCSAgICAgIDEwMCk7CisJCWlmIChmZXAtPnptaWlfZGV2KQorCQkJZW1hY196bWlpX3BvcnRfc3BlZWQoZmVwLT56bWlpX2RldiwgZmVwLT56bWlpX2lucHV0LAorCQkJCQkgICAgIDEwMCk7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTA6CisJZGVmYXVsdDoKKwkJbW9kZV9yZWcgPSAobW9kZV9yZWcgJiB+RU1BQ19NMV9NRl8xMDBNQlBTKSB8IEVNQUNfTTFfUkZTXzRLOworCQlpZiAoZmVwLT5yZ21paV9kZXYpCisJCQllbWFjX3JnbWlpX3BvcnRfc3BlZWQoZmVwLT5yZ21paV9kZXYsIGZlcC0+cmdtaWlfaW5wdXQsCisJCQkJCSAgICAgIDEwKTsKKwkJaWYgKGZlcC0+em1paV9kZXYpCisJCQllbWFjX3ptaWlfcG9ydF9zcGVlZChmZXAtPnptaWlfZGV2LCBmZXAtPnptaWlfaW5wdXQsCisJCQkJCSAgICAgMTApOworCX0KKworCWlmIChmdWxsX2R1cGxleCkKKwkJbW9kZV9yZWcgfD0gRU1BQ19NMV9GREUgfCBFTUFDX00xX0VJRkMgfCBFTUFDX00xX0lTVDsKKwllbHNlCisJCW1vZGVfcmVnICY9IH4oRU1BQ19NMV9GREUgfCBFTUFDX00xX0VJRkMgfCBFTUFDX00xX0lMRSk7CisKKwlMSU5LX0RFQlVHKCgiJXM6IGFkanVzdCB0byBsaW5rLCBzcGVlZDogJWQsIGR1cGxleDogJWQsIG9wZW5lZDogJWRcbiIsCisJCSAgICBmZXAtPm5kZXYtPm5hbWUsIHNwZWVkLCBmdWxsX2R1cGxleCwgZmVwLT5vcGVuZWQpKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBTcGVlZDogJWQsICVzIGR1cGxleC5cbiIsCisJICAgICAgIGZlcC0+bmRldi0+bmFtZSwgc3BlZWQsIGZ1bGxfZHVwbGV4ID8gIkZ1bGwiIDogIkhhbGYiKTsKKwlpZiAoZmVwLT5vcGVuZWQpCisJCW91dF9iZTMyKCZlbWFjcC0+ZW0wbXIxLCBtb2RlX3JlZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbWFjX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmRldi0+cHJpdjsKKwllbWFjX3QgKmVtYWNwID0gZmVwLT5lbWFjcDsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKQorCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisKKwltZW1jcHkobmRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIG5kZXYtPmFkZHJfbGVuKTsKKworCS8qIHNldCB0aGUgaGlnaCBhZGRyZXNzICovCisJb3V0X2JlMzIoJmVtYWNwLT5lbTBpYWhyLAorCQkgKGZlcC0+bmRldi0+ZGV2X2FkZHJbMF0gPDwgOCkgfCBmZXAtPm5kZXYtPmRldl9hZGRyWzFdKTsKKworCS8qIHNldCB0aGUgbG93IGFkZHJlc3MgKi8KKwlvdXRfYmUzMigmZW1hY3AtPmVtMGlhbHIsCisJCSAoZmVwLT5uZGV2LT5kZXZfYWRkclsyXSA8PCAyNCkgfCAoZmVwLT5uZGV2LT5kZXZfYWRkclszXSA8PCAxNikKKwkJIHwgKGZlcC0+bmRldi0+ZGV2X2FkZHJbNF0gPDwgOCkgfCBmZXAtPm5kZXYtPmRldl9hZGRyWzVdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVtYWNfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gZGV2LT5wcml2OworCWludCBvbGRfbXR1ID0gZGV2LT5tdHU7CisJdW5zaWduZWQgbG9uZyBtb2RlX3JlZzsKKwllbWFjX3QgKmVtYWNwID0gZmVwLT5lbWFjcDsKKwl1MzIgZW0wbXIwOworCWludCBpLCBmdWxsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoKG5ld19tdHUgPCBFTUFDX01JTl9NVFUpIHx8IChuZXdfbXR1ID4gRU1BQ19NQVhfTVRVKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJlbWFjOiBJbnZhbGlkIE1UVSBzZXR0aW5nLCBNVFUgbXVzdCBiZSBiZXR3ZWVuICVkIGFuZCAlZFxuIiwKKwkJICAgICAgIEVNQUNfTUlOX01UVSwgRU1BQ19NQVhfTVRVKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG9sZF9tdHUgIT0gbmV3X210dSAmJiBuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJLyogU3RvcCByeCBlbmdpbmUgKi8KKwkJZW0wbXIwID0gaW5fYmUzMigmZW1hY3AtPmVtMG1yMCk7CisJCW91dF9iZTMyKCZlbWFjcC0+ZW0wbXIwLCBlbTBtcjAgJiB+RU1BQ19NMF9SWEUpOworCisJCS8qIFdhaXQgZm9yIGRlc2NyaXB0b3JzIHRvIGJlIGVtcHR5ICovCisJCWRvIHsKKwkJCWZ1bGwgPSAwOworCQkJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9CVUZGOyBpKyspCisJCQkJaWYgKCEoZmVwLT5yeF9kZXNjW2ldLmN0cmwgJiBNQUxfUlhfQ1RSTF9FTVBUWSkpIHsKKwkJCQkJcHJpbnRrKEtFUk5fTk9USUNFCisJCQkJCSAgICAgICAiZW1hYzogUlggcmluZyBpcyBzdGlsbCBmdWxsXG4iKTsKKwkJCQkJZnVsbCA9IDE7CisJCQkJfQorCQl9IHdoaWxlIChmdWxsKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZmVwLT5sb2NrLCBmbGFncyk7CisKKwkJbWFsX2Rpc2FibGVfcnhfY2hhbm5lbHMoZmVwLT5tYWwsIGZlcC0+Y29tbWFjLnJ4X2NoYW5fbWFzayk7CisKKwkJLyogRGVzdHJveSBhbGwgb2xkIHJ4IHNrYnMgKi8KKwkJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9CVUZGOyBpKyspIHsKKwkJCWRtYV91bm1hcF9zaW5nbGUoJmZlcC0+b2NwZGV2LT5kZXYsCisJCQkJCSBmZXAtPnJ4X2Rlc2NbaV0uZGF0YV9wdHIsCisJCQkJCSBmZXAtPnJ4X2Rlc2NbaV0uZGF0YV9sZW4sCisJCQkJCSBETUFfRlJPTV9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihmZXAtPnJ4X3NrYltpXSk7CisJCQlmZXAtPnJ4X3NrYltpXSA9IE5VTEw7CisJCX0KKworCQkvKiBTZXQgbmV3IHJ4X2J1ZmZlcl9zaXplLCBqdW1ibyBjYXAsIGFuZCBhZHZlcnRpc2UgbmV3IG10dSAqLworCQltb2RlX3JlZyA9IGluX2JlMzIoJmVtYWNwLT5lbTBtcjEpOworCQlpZiAobmV3X210dSA+IEVORVRfREVGX01UVV9TSVpFKSB7CisJCQltb2RlX3JlZyB8PSBFTUFDX00xX0pVTUJPX0VOQUJMRTsKKwkJCWZlcC0+cnhfYnVmZmVyX3NpemUgPSBFTUFDX01BWF9GUkFNRTsKKwkJfSBlbHNlIHsKKwkJCW1vZGVfcmVnICY9IH5FTUFDX00xX0pVTUJPX0VOQUJMRTsKKwkJCWZlcC0+cnhfYnVmZmVyX3NpemUgPSBFTkVUX0RFRl9CVUZfU0laRTsKKwkJfQorCQlkZXYtPm10dSA9IG5ld19tdHU7CisJCW91dF9iZTMyKCZlbWFjcC0+ZW0wbXIxLCBtb2RlX3JlZyk7CisKKwkJLyogUmUtaW5pdCByeCBza2JzICovCisJCWZlcC0+cnhfc2xvdCA9IDA7CisJCWVtYWNfcnhfZmlsbChkZXYsIDApOworCisJCS8qIFJlc3RhcnQgdGhlIHJ4IGVuZ2luZSAqLworCQltYWxfZW5hYmxlX3J4X2NoYW5uZWxzKGZlcC0+bWFsLCBmZXAtPmNvbW1hYy5yeF9jaGFuX21hc2spOworCQlvdXRfYmUzMigmZW1hY3AtPmVtMG1yMCwgZW0wbXIwIHwgRU1BQ19NMF9SWEUpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZlcC0+bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2VtYWNfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCA9IGRldi0+cHJpdjsKKwllbWFjX3QgKmVtYWNwID0gZmVwLT5lbWFjcDsKKwl1MzIgcm1yID0gaW5fYmUzMigmZW1hY3AtPmVtMHJtcik7CisKKwkvKiBGaXJzdCBjbGVhciBhbGwgc3BlY2lhbCBiaXRzLCB0aGV5IGNhbiBiZSBzZXQgbGF0ZXIgKi8KKwlybXIgJj0gfihFTUFDX1JNUl9QTUUgfCBFTUFDX1JNUl9QTU1FIHwgRU1BQ19STVJfTUFFKTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJcm1yIHw9IEVNQUNfUk1SX1BNRTsKKwl9IGVsc2UgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgfHwgMzIgPCBkZXYtPm1jX2NvdW50KSB7CisJCS8qCisJCSAqIE11c3QgYmUgc2V0dGluZyB1cCB0byB1c2UgbXVsdGljYXN0CisJCSAqIE5vdyBjaGVjayBmb3IgcHJvbWlzY3VvdXMgbXVsdGljYXN0CisJCSAqLworCQlybXIgfD0gRU1BQ19STVJfUE1NRTsKKwl9IGVsc2UgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfTVVMVElDQVNUICYmIDAgPCBkZXYtPm1jX2NvdW50KSB7CisJCXVuc2lnbmVkIHNob3J0IGVtMGdhaHRbNF0gPSB7IDAsIDAsIDAsIDAgfTsKKwkJc3RydWN0IGRldl9tY19saXN0ICpkbWk7CisKKwkJLyogTmVlZCB0byBoYXNoIG9uIHRoZSBtdWx0aWNhc3QgYWRkcmVzcy4gKi8KKwkJZm9yIChkbWkgPSBkZXYtPm1jX2xpc3Q7IGRtaTsgZG1pID0gZG1pLT5uZXh0KSB7CisJCQl1bnNpZ25lZCBsb25nIG1jX2NyYzsKKwkJCXVuc2lnbmVkIGludCBiaXRfbnVtYmVyOworCisJCQltY19jcmMgPSBldGhlcl9jcmMoNiwgKGNoYXIgKilkbWktPmRtaV9hZGRyKTsKKwkJCWJpdF9udW1iZXIgPSA2MyAtIChtY19jcmMgPj4gMjYpOwkvKiBNU0I6IDAgTFNCOiA2MyAqLworCQkJZW0wZ2FodFtiaXRfbnVtYmVyID4+IDRdIHw9CisJCQkgICAgMHg4MDAwID4+IChiaXRfbnVtYmVyICYgMHgwZik7CisJCX0KKwkJZW1hY3AtPmVtMGdhaHQxID0gZW0wZ2FodFswXTsKKwkJZW1hY3AtPmVtMGdhaHQyID0gZW0wZ2FodFsxXTsKKwkJZW1hY3AtPmVtMGdhaHQzID0gZW0wZ2FodFsyXTsKKwkJZW1hY3AtPmVtMGdhaHQ0ID0gZW0wZ2FodFszXTsKKworCQkvKiBUdXJuIG9uIG11bHRpY2FzdCBhZGRyZXNzaW5nICovCisJCXJtciB8PSBFTUFDX1JNUl9NQUU7CisJfQorCW91dF9iZTMyKCZlbWFjcC0+ZW0wcm1yLCBybXIpOworfQorCitzdGF0aWMgaW50IGVtYWNfaW5pdF90YWgoc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCkKK3sKKwl0YWhfdCAqdGFocDsKKworCS8qIEluaXRpYWxpemUgVEFIIGFuZCBlbmFibGUgY2hlY2tzdW0gdmVyaWZpY2F0aW9uICovCisJdGFocCA9ICh0YWhfdCAqKSBpb3JlbWFwKGZlcC0+dGFoX2Rldi0+ZGVmLT5wYWRkciwgc2l6ZW9mKCp0YWhwKSk7CisKKwlpZiAodGFocCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAidGFoJWQ6IENhbm5vdCBpb3JlbWFwIFRBSCByZWdpc3RlcnMhXG4iLAorCQkgICAgICAgZmVwLT50YWhfZGV2LT5kZWYtPmluZGV4KTsKKworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlvdXRfYmUzMigmdGFocC0+dGFoX21yLCBUQUhfTVJfU1IpOworCisJLyogd2FpdCBmb3IgcmVzZXQgdG8gY29tcGxldGUgKi8KKwl3aGlsZSAoaW5fYmUzMigmdGFocC0+dGFoX21yKSAmIFRBSF9NUl9TUikgOworCisJLyogMTBLQiBUQUggVFggRklGTyBhY2NvbW9kYXRlcyB0aGUgbWF4IE1UVSBvZiA5MDAwICovCisJb3V0X2JlMzIoJnRhaHAtPnRhaF9tciwKKwkJIFRBSF9NUl9DVlIgfCBUQUhfTVJfU1RfNzY4IHwgVEFIX01SX1RGU18xMEtCIHwgVEFIX01SX0RURlAgfAorCQkgVEFIX01SX0RJRyk7CisKKwlpb3VubWFwKCZ0YWhwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbWFjX2luaXRfcmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZXAgPSBkZXYtPnByaXY7CisJaW50IGxvb3A7CisKKwllcC0+dHhfZGVzYyA9IChzdHJ1Y3QgbWFsX2Rlc2NyaXB0b3IgKikoKGNoYXIgKillcC0+bWFsLT50eF92aXJ0X2FkZHIgKworCQkJCQkJKGVwLT5tYWxfdHhfY2hhbiAqCisJCQkJCQkgTUFMX0RUX0FMSUdOKSk7CisJZXAtPnJ4X2Rlc2MgPQorCSAgICAoc3RydWN0IG1hbF9kZXNjcmlwdG9yICopKChjaGFyICopZXAtPm1hbC0+cnhfdmlydF9hZGRyICsKKwkJCQkgICAgICAoZXAtPm1hbF9yeF9jaGFuICogTUFMX0RUX0FMSUdOKSk7CisKKwkvKiBGaWxsIGluIHRoZSB0cmFuc21pdCBkZXNjcmlwdG9yIHJpbmcuICovCisJZm9yIChsb29wID0gMDsgbG9vcCA8IE5VTV9UWF9CVUZGOyBsb29wKyspIHsKKwkJaWYgKGVwLT50eF9za2JbbG9vcF0pIHsKKwkJCWRtYV91bm1hcF9zaW5nbGUoJmVwLT5vY3BkZXYtPmRldiwKKwkJCQkJIGVwLT50eF9kZXNjW2xvb3BdLmRhdGFfcHRyLAorCQkJCQkgZXAtPnR4X2Rlc2NbbG9vcF0uZGF0YV9sZW4sCisJCQkJCSBETUFfVE9fREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2JfaXJxKGVwLT50eF9za2JbbG9vcF0pOworCQl9CisJCWVwLT50eF9za2JbbG9vcF0gPSBOVUxMOworCQllcC0+dHhfZGVzY1tsb29wXS5jdHJsID0gMDsKKwkJZXAtPnR4X2Rlc2NbbG9vcF0uZGF0YV9sZW4gPSAwOworCQllcC0+dHhfZGVzY1tsb29wXS5kYXRhX3B0ciA9IE5VTEw7CisJfQorCWVwLT50eF9kZXNjW2xvb3AgLSAxXS5jdHJsIHw9IE1BTF9UWF9DVFJMX1dSQVA7CisKKwkvKiBGb3JtYXQgdGhlIHJlY2VpdmUgZGVzY3JpcHRvciByaW5nLiAqLworCWVwLT5yeF9zbG90ID0gMDsKKwkvKiBEZWZhdWx0IGlzIE1UVT0xNTAwICsgRXRoZXJuZXQgb3ZlcmhlYWQgKi8KKwllcC0+cnhfYnVmZmVyX3NpemUgPSBkZXYtPm10dSArIEVORVRfSEVBREVSX1NJWkUgKyBFTkVUX0ZDU19TSVpFOworCWVtYWNfcnhfZmlsbChkZXYsIDApOworCWlmIChlcC0+cnhfc2xvdCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBOb3QgZW5vdWdoIG1lbSBmb3IgUnhDaGFpbiBkdXJuaW5nIE9wZW4/XG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJLypXZSBjb3VsZG4ndCBmaWxsIHRoZSByaW5nIGF0IHN0YXJ0dXA/CisJCSAqV2UgY291bGQgY2xlYW4gdXAgYW5kIGZhaWwgdG8gb3BlbiBidXQgcmlnaHQgbm93IHdlIHdpbGwgdHJ5IHRvCisJCSAqY2Fycnkgb24uIEl0IG1heSBiZSBhIHNpZ24gb2YgYSBiYWQgTlVNX1JYX0JVRkYgdmFsdWUKKwkJICovCisJfQorCisJZXAtPnR4X2NudCA9IDA7CisJZXAtPnR4X3Nsb3QgPSAwOworCWVwLT5hY2tfc2xvdCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGVtYWNfcmVzZXRfY29uZmlndXJlKHN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICpmZXApCit7CisJZW1hY190ICplbWFjcCA9IGZlcC0+ZW1hY3A7CisJaW50IGk7CisKKwltYWxfZGlzYWJsZV90eF9jaGFubmVscyhmZXAtPm1hbCwgZmVwLT5jb21tYWMudHhfY2hhbl9tYXNrKTsKKwltYWxfZGlzYWJsZV9yeF9jaGFubmVscyhmZXAtPm1hbCwgZmVwLT5jb21tYWMucnhfY2hhbl9tYXNrKTsKKworCS8qCisJICogQ2hlY2sgZm9yIGEgbGluaywgc29tZSBQSFlzIGRvbid0IHByb3ZpZGUgYSBjbG9jayBpZgorCSAqIG5vIGxpbmsgaXMgcHJlc2VudC4gIFNvbWUgRU1BQ3Mgd2lsbCBub3QgY29tZSBvdXQgb2YKKwkgKiBzb2Z0IHJlc2V0IHdpdGhvdXQgYSBQSFkgY2xvY2sgcHJlc2VudC4KKwkgKi8KKwlpZiAoZmVwLT5waHlfbWlpLmRlZi0+b3BzLT5wb2xsX2xpbmsoJmZlcC0+cGh5X21paSkpIHsKKwkJLyogUmVzZXQgdGhlIEVNQUMgKi8KKwkJb3V0X2JlMzIoJmVtYWNwLT5lbTBtcjAsIEVNQUNfTTBfU1JTVCk7CisJCXVkZWxheSgyMCk7CisJCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQkJaWYgKChpbl9iZTMyKCZlbWFjcC0+ZW0wbXIwKSAmIEVNQUNfTTBfU1JTVCkgPT0gMCkKKwkJCQlicmVhazsKKwkJCXVkZWxheSgxMCk7CisJCX0KKworCQlpZiAoaSA+PSAxMDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCByZXNldCBFTUFDXG4iLAorCQkJICAgICAgIGZlcC0+bmRldi0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBTd2l0Y2ggSVJRcyBvZmYgZm9yIG5vdyAqLworCW91dF9iZTMyKCZlbWFjcC0+ZW0waXNlciwgMCk7CisKKwkvKiBDb25maWd1cmUgTUFMIHJ4IGNoYW5uZWwgKi8KKwltYWxfc2V0X3JjYnMoZmVwLT5tYWwsIGZlcC0+bWFsX3J4X2NoYW4sIERFU0NfQlVGX1NJWkVfUkVHKTsKKworCS8qIHNldCB0aGUgaGlnaCBhZGRyZXNzICovCisJb3V0X2JlMzIoJmVtYWNwLT5lbTBpYWhyLAorCQkgKGZlcC0+bmRldi0+ZGV2X2FkZHJbMF0gPDwgOCkgfCBmZXAtPm5kZXYtPmRldl9hZGRyWzFdKTsKKworCS8qIHNldCB0aGUgbG93IGFkZHJlc3MgKi8KKwlvdXRfYmUzMigmZW1hY3AtPmVtMGlhbHIsCisJCSAoZmVwLT5uZGV2LT5kZXZfYWRkclsyXSA8PCAyNCkgfCAoZmVwLT5uZGV2LT5kZXZfYWRkclszXSA8PCAxNikKKwkJIHwgKGZlcC0+bmRldi0+ZGV2X2FkZHJbNF0gPDwgOCkgfCBmZXAtPm5kZXYtPmRldl9hZGRyWzVdKTsKKworCS8qIEFkanVzdCB0byBsaW5rICovCisJaWYgKG5ldGlmX2NhcnJpZXJfb2soZmVwLT5uZGV2KSkKKwkJZW1hY19hZGp1c3RfdG9fbGluayhmZXApOworCisJLyogZW5hYmxlIGJyb2FkY2FzdC9pbmRpdmlkdWFsIGFkZHJlc3MgYW5kIFJYIEZJRk8gZGVmYXVsdHMgKi8KKwlvdXRfYmUzMigmZW1hY3AtPmVtMHJtciwgRU1BQ19STVJfREVGQVVMVCk7CisKKwkvKiBzZXQgdHJhbnNtaXQgcmVxdWVzdCB0aHJlc2hvbGQgcmVnaXN0ZXIgKi8KKwlvdXRfYmUzMigmZW1hY3AtPmVtMHRydHIsIEVNQUNfVFJUUl9ERUZBVUxUKTsKKworCS8qIFJlY29uZmlndXJlIG11bHRpY2FzdCAqLworCV9fZW1hY19zZXRfbXVsdGljYXN0X2xpc3QoZmVwLT5uZGV2KTsKKworCS8qIFNldCByZWNlaXZlci90cmFuc21pdHRlciBkZWZhdWx0cyAqLworCW91dF9iZTMyKCZlbWFjcC0+ZW0wcndtciwgRU1BQ19SV01SX0RFRkFVTFQpOworCW91dF9iZTMyKCZlbWFjcC0+ZW0wdG1yMCwgRU1BQ19UTVIwX0RFRkFVTFQpOworCW91dF9iZTMyKCZlbWFjcC0+ZW0wdG1yMSwgRU1BQ19UTVIxX0RFRkFVTFQpOworCisJLyogc2V0IGZyYW1lIGdhcCAqLworCW91dF9iZTMyKCZlbWFjcC0+ZW0waXBndnIsIENPTkZJR19JQk1fRU1BQ19GR0FQKTsKKwkKKwkvKiBzZXQgVkxBTiBUYWcgUHJvdG9jb2wgSWRlbnRpZmllciAqLworCW91dF9iZTMyKCZlbWFjcC0+ZW0wdnRwaWQsIDB4ODEwMCk7CisKKwkvKiBJbml0IHJpbmcgYnVmZmVycyAqLworCWVtYWNfaW5pdF9yaW5ncyhmZXAtPm5kZXYpOworfQorCitzdGF0aWMgdm9pZCBlbWFjX2tpY2soc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCkKK3sKKwllbWFjX3QgKmVtYWNwID0gZmVwLT5lbWFjcDsKKwl1bnNpZ25lZCBsb25nIGVtYWNfaWVyOworCisJZW1hY19pZXIgPSBFTUFDX0lTUl9QUCB8IEVNQUNfSVNSX0JQIHwgRU1BQ19JU1JfUlAgfAorCSAgICBFTUFDX0lTUl9TRSB8IEVNQUNfSVNSX1BUTEUgfCBFTUFDX0lTUl9BTEUgfAorCSAgICBFTUFDX0lTUl9CRkNTIHwgRU1BQ19JU1JfT1JFIHwgRU1BQ19JU1JfSVJFOworCisJb3V0X2JlMzIoJmVtYWNwLT5lbTBpc2VyLCBlbWFjX2llcik7CisKKwkvKiBlbmFibGUgYWxsIE1BTCB0cmFuc21pdCBhbmQgcmVjZWl2ZSBjaGFubmVscyAqLworCW1hbF9lbmFibGVfdHhfY2hhbm5lbHMoZmVwLT5tYWwsIGZlcC0+Y29tbWFjLnR4X2NoYW5fbWFzayk7CisJbWFsX2VuYWJsZV9yeF9jaGFubmVscyhmZXAtPm1hbCwgZmVwLT5jb21tYWMucnhfY2hhbl9tYXNrKTsKKworCS8qIHNldCB0cmFuc21pdCBhbmQgcmVjZWl2ZSBlbmFibGUgKi8KKwlvdXRfYmUzMigmZW1hY3AtPmVtMG1yMCwgRU1BQ19NMF9UWEUgfCBFTUFDX00wX1JYRSk7Cit9CisKK3N0YXRpYyB2b2lkCitlbWFjX3N0YXJ0X2xpbmsoc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCwgc3RydWN0IGV0aHRvb2xfY21kICplcCkKK3sKKwl1MzIgYWR2ZXJ0aXNlOworCWludCBhdXRvbmVnOworCWludCBmb3JjZWRfc3BlZWQ7CisJaW50IGZvcmNlZF9kdXBsZXg7CisKKwkvKiBEZWZhdWx0IGFkdmVydGlzZSAqLworCWFkdmVydGlzZSA9IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfAorCSAgICBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwgfAorCSAgICBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbDsKKwlhdXRvbmVnID0gZmVwLT53YW50X2F1dG9uZWc7CisJZm9yY2VkX3NwZWVkID0gZmVwLT5waHlfbWlpLnNwZWVkOworCWZvcmNlZF9kdXBsZXggPSBmZXAtPnBoeV9taWkuZHVwbGV4OworCisJLyogU2V0dXAgbGluayBwYXJhbWV0ZXJzICovCisJaWYgKGVwKSB7CisJCWlmIChlcC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQkJYWR2ZXJ0aXNlID0gZXAtPmFkdmVydGlzaW5nOworCQkJYXV0b25lZyA9IDE7CisJCX0gZWxzZSB7CisJCQlhdXRvbmVnID0gMDsKKwkJCWZvcmNlZF9zcGVlZCA9IGVwLT5zcGVlZDsKKwkJCWZvcmNlZF9kdXBsZXggPSBlcC0+ZHVwbGV4OworCQl9CisJfQorCisJLyogQ29uZmlndXJlIFBIWSAmIHN0YXJ0IGFuZWcgKi8KKwlmZXAtPndhbnRfYXV0b25lZyA9IGF1dG9uZWc7CisJaWYgKGF1dG9uZWcpIHsKKwkJTElOS19ERUJVRygoIiVzOiBzdGFydCBsaW5rIGFuZWcsIGFkdmVydGlzZTogMHgleFxuIiwKKwkJCSAgICBmZXAtPm5kZXYtPm5hbWUsIGFkdmVydGlzZSkpOworCQlmZXAtPnBoeV9taWkuZGVmLT5vcHMtPnNldHVwX2FuZWcoJmZlcC0+cGh5X21paSwgYWR2ZXJ0aXNlKTsKKwl9IGVsc2UgeworCQlMSU5LX0RFQlVHKCgiJXM6IHN0YXJ0IGxpbmsgZm9yY2VkLCBzcGVlZDogJWQsIGR1cGxleDogJWRcbiIsCisJCQkgICAgZmVwLT5uZGV2LT5uYW1lLCBmb3JjZWRfc3BlZWQsIGZvcmNlZF9kdXBsZXgpKTsKKwkJZmVwLT5waHlfbWlpLmRlZi0+b3BzLT5zZXR1cF9mb3JjZWQoJmZlcC0+cGh5X21paSwgZm9yY2VkX3NwZWVkLAorCQkJCQkJICAgIGZvcmNlZF9kdXBsZXgpOworCX0KKwlmZXAtPnRpbWVyX3RpY2tzID0gMDsKKwltb2RfdGltZXIoJmZlcC0+bGlua190aW1lciwgamlmZmllcyArIEhaKTsKK30KKworc3RhdGljIHZvaWQgZW1hY19saW5rX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gKHN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICopZGF0YTsKKwlpbnQgbGluazsKKworCWlmIChmZXAtPmdvaW5nX2F3YXkpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnEoJmZlcC0+bG9jayk7CisKKwlsaW5rID0gZmVwLT5waHlfbWlpLmRlZi0+b3BzLT5wb2xsX2xpbmsoJmZlcC0+cGh5X21paSk7CisJTElOS19ERUJVRygoIiVzOiBwb2xsX2xpbms6ICVkXG4iLCBmZXAtPm5kZXYtPm5hbWUsIGxpbmspKTsKKworCWlmIChsaW5rID09IG5ldGlmX2NhcnJpZXJfb2soZmVwLT5uZGV2KSkgeworCQlpZiAoIWxpbmsgJiYgZmVwLT53YW50X2F1dG9uZWcgJiYgKCsrZmVwLT50aW1lcl90aWNrcykgPiAxMCkKKwkJCWVtYWNfc3RhcnRfbGluayhmZXAsIE5VTEwpOworCQlnb3RvIG91dDsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpbmsgaXMgJXNcbiIsIGZlcC0+bmRldi0+bmFtZSwKKwkgICAgICAgbGluayA/ICJVcCIgOiAiRG93biIpOworCWlmIChsaW5rKSB7CisJCW5ldGlmX2NhcnJpZXJfb24oZmVwLT5uZGV2KTsKKwkJLyogQ2hpcCBuZWVkcyBhIGZ1bGwgcmVzZXQgb24gY29uZmlnIGNoYW5nZS4gVGhhdCBzdWNrcywgc28gSQorCQkgKiBzaG91bGQgdWx0aW1hdGVseSBtb3ZlIHRoYXQgdG8gc29tZSB0YXNrbGV0IHRvIGxpbWl0CisJCSAqIGxhdGVuY3kgcGVha3MgY2F1c2VkIGJ5IHRoaXMgY29kZQorCQkgKi8KKwkJZW1hY19yZXNldF9jb25maWd1cmUoZmVwKTsKKwkJaWYgKGZlcC0+b3BlbmVkKQorCQkJZW1hY19raWNrKGZlcCk7CisJfSBlbHNlIHsKKwkJZmVwLT50aW1lcl90aWNrcyA9IDA7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKGZlcC0+bmRldik7CisJfQorICAgICAgb3V0OgorCW1vZF90aW1lcigmZmVwLT5saW5rX3RpbWVyLCBqaWZmaWVzICsgSFopOworCXNwaW5fdW5sb2NrX2lycSgmZmVwLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgZW1hY19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gZGV2LT5wcml2OworCisJc3Bpbl9sb2NrX2lycSgmZmVwLT5sb2NrKTsKKwlfX2VtYWNfc2V0X211bHRpY2FzdF9saXN0KGRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZmZXAtPmxvY2spOworfQorCitzdGF0aWMgaW50IGVtYWNfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmRldi0+cHJpdjsKKworCWNtZC0+c3VwcG9ydGVkID0gZmVwLT5waHlfbWlpLmRlZi0+ZmVhdHVyZXM7CisJY21kLT5wb3J0ID0gUE9SVF9NSUk7CisJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CisJY21kLT5waHlfYWRkcmVzcyA9IGZlcC0+bWlpX3BoeV9hZGRyOworCXNwaW5fbG9ja19pcnEoJmZlcC0+bG9jayk7CisJY21kLT5hdXRvbmVnID0gZmVwLT53YW50X2F1dG9uZWc7CisJY21kLT5zcGVlZCA9IGZlcC0+cGh5X21paS5zcGVlZDsKKwljbWQtPmR1cGxleCA9IGZlcC0+cGh5X21paS5kdXBsZXg7CisJc3Bpbl91bmxvY2tfaXJxKCZmZXAtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVtYWNfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZlYXR1cmVzID0gZmVwLT5waHlfbWlpLmRlZi0+ZmVhdHVyZXM7CisKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoY21kLT5hdXRvbmVnICE9IEFVVE9ORUdfRU5BQkxFICYmIGNtZC0+YXV0b25lZyAhPSBBVVRPTkVHX0RJU0FCTEUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUgJiYgY21kLT5hZHZlcnRpc2luZyA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY21kLT5kdXBsZXggIT0gRFVQTEVYX0hBTEYgJiYgY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFKQorCQlzd2l0Y2ggKGNtZC0+c3BlZWQpIHsKKwkJY2FzZSBTUEVFRF8xMDoKKwkJCWlmIChjbWQtPmR1cGxleCA9PSBEVVBMRVhfSEFMRiAmJgorCQkJICAgIChmZWF0dXJlcyAmIFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYpID09IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwgJiYKKwkJCSAgICAoZmVhdHVyZXMgJiBTVVBQT1JURURfMTBiYXNlVF9GdWxsKSA9PSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWNhc2UgU1BFRURfMTAwOgorCQkJaWYgKGNtZC0+ZHVwbGV4ID09IERVUExFWF9IQUxGICYmCisJCQkgICAgKGZlYXR1cmVzICYgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYpID09IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwgJiYKKwkJCSAgICAoZmVhdHVyZXMgJiBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCkgPT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQljYXNlIFNQRUVEXzEwMDA6CisJCQlpZiAoY21kLT5kdXBsZXggPT0gRFVQTEVYX0hBTEYgJiYKKwkJCSAgICAoZmVhdHVyZXMgJiBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYpID09IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwgJiYKKwkJCSAgICAoZmVhdHVyZXMgJiBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpID09IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoKGZlYXR1cmVzICYgU1VQUE9SVEVEX0F1dG9uZWcpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCXNwaW5fbG9ja19pcnEoJmZlcC0+bG9jayk7CisJZW1hY19zdGFydF9saW5rKGZlcCwgY21kKTsKKwlzcGluX3VubG9ja19pcnEoJmZlcC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitlbWFjX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICpmZXAgPSBuZGV2LT5wcml2OworCisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJaW5mby0+ZndfdmVyc2lvblswXSA9ICdcMCc7CisJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIklCTSBFTUFDICVkIiwgZmVwLT5vY3BkZXYtPmRlZi0+aW5kZXgpOworCWluZm8tPnJlZ2R1bXBfbGVuID0gMDsKK30KKworc3RhdGljIGludCBlbWFjX253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCA9IG5kZXYtPnByaXY7CisKKwlpZiAoIWZlcC0+d2FudF9hdXRvbmVnKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzcGluX2xvY2tfaXJxKCZmZXAtPmxvY2spOworCWVtYWNfc3RhcnRfbGluayhmZXAsIE5VTEwpOworCXNwaW5fdW5sb2NrX2lycSgmZmVwLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBlbWFjX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXJldHVybiBuZXRpZl9jYXJyaWVyX29rKG5kZXYpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGVtYWNfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncyA9IGVtYWNfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgPSBlbWFjX3NldF9zZXR0aW5ncywKKwkuZ2V0X2RydmluZm8gPSBlbWFjX2dldF9kcnZpbmZvLAorCS5ud2F5X3Jlc2V0ID0gZW1hY19ud2F5X3Jlc2V0LAorCS5nZXRfbGluayA9IGVtYWNfZ2V0X2xpbmsKK307CisKK3N0YXRpYyBpbnQgZW1hY19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICpmZXAgPSBkZXYtPnByaXY7CisJdWludCAqZGF0YSA9ICh1aW50ICopICYgcnEtPmlmcl9pZnJ1OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgorCQlkYXRhWzBdID0gZmVwLT5taWlfcGh5X2FkZHI7CisJCS8qIEZhbGwgdGhyb3VnaCAqLworCWNhc2UgU0lPQ0dNSUlSRUc6CisJCWRhdGFbM10gPSBlbWFjX3BoeV9yZWFkKGRldiwgZmVwLT5taWlfcGh5X2FkZHIsIGRhdGFbMV0pOworCQlyZXR1cm4gMDsKKwljYXNlIFNJT0NTTUlJUkVHOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWVtYWNfcGh5X3dyaXRlKGRldiwgZmVwLT5taWlfcGh5X2FkZHIsIGRhdGFbMV0sIGRhdGFbMl0pOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCitzdGF0aWMgaW50IGVtYWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICpmZXAgPSBkZXYtPnByaXY7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmZmVwLT5sb2NrKTsKKworCWZlcC0+b3BlbmVkID0gMTsKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJLyogUmVzZXQgJiBjb25maWd1cmUgdGhlIGNoaXAgKi8KKwllbWFjX3Jlc2V0X2NvbmZpZ3VyZShmZXApOworCisJc3Bpbl91bmxvY2tfaXJxKCZmZXAtPmxvY2spOworCisJLyogUmVxdWVzdCBvdXIgaW50ZXJydXB0IGxpbmVzICovCisJcmMgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgZW1hY19tYWNfaXJxLCAwLCAiSUJNIEVNQUMgTUFDIiwgZGV2KTsKKwlpZiAocmMgIT0gMCkgeworCQlwcmludGsoImRldi0+aXJxICVkIGZhaWxlZFxuIiwgZGV2LT5pcnEpOworCQlnb3RvIGJhaWw7CisJfQorCS8qIEtpY2sgdGhlIGNoaXAgcnggJiB0eCBjaGFubmVscyBpbnRvIGxpZmUgKi8KKwlzcGluX2xvY2tfaXJxKCZmZXAtPmxvY2spOworCWVtYWNfa2ljayhmZXApOworCXNwaW5fdW5sb2NrX2lycSgmZmVwLT5sb2NrKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgICBiYWlsOgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBlbWFjX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCA9IGRldi0+cHJpdjsKKwllbWFjX3QgKmVtYWNwID0gZmVwLT5lbWFjcDsKKworCS8qIFhYWCBTdG9wIElSUSBlbWl0dGluZyBoZXJlICovCisJc3Bpbl9sb2NrX2lycSgmZmVwLT5sb2NrKTsKKwlmZXAtPm9wZW5lZCA9IDA7CisJbWFsX2Rpc2FibGVfdHhfY2hhbm5lbHMoZmVwLT5tYWwsIGZlcC0+Y29tbWFjLnR4X2NoYW5fbWFzayk7CisJbWFsX2Rpc2FibGVfcnhfY2hhbm5lbHMoZmVwLT5tYWwsIGZlcC0+Y29tbWFjLnJ4X2NoYW5fbWFzayk7CisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKgorCSAqIENoZWNrIGZvciBhIGxpbmssIHNvbWUgUEhZcyBkb24ndCBwcm92aWRlIGEgY2xvY2sgaWYKKwkgKiBubyBsaW5rIGlzIHByZXNlbnQuICBTb21lIEVNQUNzIHdpbGwgbm90IGNvbWUgb3V0IG9mCisJICogc29mdCByZXNldCB3aXRob3V0IGEgUEhZIGNsb2NrIHByZXNlbnQuCisJICovCisJaWYgKGZlcC0+cGh5X21paS5kZWYtPm9wcy0+cG9sbF9saW5rKCZmZXAtPnBoeV9taWkpKSB7CisJCW91dF9iZTMyKCZlbWFjcC0+ZW0wbXIwLCBFTUFDX00wX1NSU1QpOworCQl1ZGVsYXkoMTApOworCisJCWlmIChlbWFjcC0+ZW0wbXIwICYgRU1BQ19NMF9TUlNUKSB7CisJCQkvKm5vdCBzdXJlIHdoYXQgdG8gZG8gaGVyZSBob3BlZnVsbHkgaXQgY2xlYXJzIGJlZm9yZSBhbm90aGVyIG9wZW4gKi8KKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICIlczogUGh5IFNvZnRSZXNldCBkaWRuJ3QgY2xlYXIsIG5vIGxpbms/XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCX0KKwl9CisKKwkvKiBGcmVlIHRoZSBpcnEncyAqLworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxKCZmZXAtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVtYWNfcmVtb3ZlKHN0cnVjdCBvY3BfZGV2aWNlICpvY3BkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG9jcF9nZXRfZHJ2ZGF0YShvY3BkZXYpOworCXN0cnVjdCBvY3BfZW5ldF9wcml2YXRlICplcCA9IGRldi0+cHJpdjsKKworCS8qIEZJWE1FOiBsb2NraW5nLCByYWNlcywgLi4uICovCisJZXAtPmdvaW5nX2F3YXkgPSAxOworCW9jcF9zZXRfZHJ2ZGF0YShvY3BkZXYsIE5VTEwpOworCWlmIChlcC0+cmdtaWlfZGV2KQorCQllbWFjX2Nsb3NlX3JnbWlpKGVwLT5yZ21paV9kZXYpOworCWlmIChlcC0+em1paV9kZXYpCisJCWVtYWNfY2xvc2Vfem1paShlcC0+em1paV9kZXYpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlkZWxfdGltZXJfc3luYygmZXAtPmxpbmtfdGltZXIpOworCW1hbF91bnJlZ2lzdGVyX2NvbW1hYyhlcC0+bWFsLCAmZXAtPmNvbW1hYyk7CisJaW91bm1hcCgodm9pZCAqKWVwLT5lbWFjcCk7CisJa2ZyZWUoZGV2KTsKK30KKworc3RydWN0IG1hbF9jb21tYWNfb3BzIGVtYWNfY29tbWFjX29wcyA9IHsKKwkudHhlb2IgPSAmZW1hY190eGVvYl9kZXYsCisJLnR4ZGUgPSAmZW1hY190eGRlX2RldiwKKwkucnhlb2IgPSAmZW1hY19yeGVvYl9kZXYsCisJLnJ4ZGUgPSAmZW1hY19yeGRlX2RldiwKK307CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIGludCBlbWFjX25ldHBvbGwoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJZW1hY19yeGVvYl9kZXYoKHZvaWQgKiluZGV2LCAwKTsKKwllbWFjX3R4ZW9iX2Rldigodm9pZCAqKW5kZXYsIDApOworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZW1hY19pbml0X2RldmljZShzdHJ1Y3Qgb2NwX2RldmljZSAqb2NwZGV2LCBzdHJ1Y3QgaWJtX29jcF9tYWwgKm1hbCkKK3sKKwlpbnQgZGVmZXJyZWRfaW5pdCA9IDA7CisJaW50IHJjID0gMCwgaTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZXA7CisJc3RydWN0IG9jcF9mdW5jX2VtYWNfZGF0YSAqZW1hY2RhdGE7CisJaW50IGNvbW1hY19yZWcgPSAwOworCXUzMiBwaHlfbWFwOworCisJZW1hY2RhdGEgPSAoc3RydWN0IG9jcF9mdW5jX2VtYWNfZGF0YSAqKW9jcGRldi0+ZGVmLT5hZGRpdGlvbnM7CisJaWYgKCFlbWFjZGF0YSkgeworCQlwcmludGsoS0VSTl9FUlIgImVtYWMlZDogTWlzc2luZyBhZGRpdGlvbmFsIGRhdGEhXG4iLAorCQkgICAgICAgb2NwZGV2LT5kZWYtPmluZGV4KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogQWxsb2NhdGUgb3VyIG5ldF9kZXZpY2Ugc3RydWN0dXJlICovCisJbmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSkpOworCWlmIChuZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiZW1hYyVkOiBDb3VsZCBub3QgYWxsb2NhdGUgZXRoZXJuZXQgZGV2aWNlLlxuIiwKKwkJICAgICAgIG9jcGRldi0+ZGVmLT5pbmRleCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwllcCA9IG5kZXYtPnByaXY7CisJZXAtPm5kZXYgPSBuZGV2OworCWVwLT5vY3BkZXYgPSBvY3BkZXY7CisJbmRldi0+aXJxID0gb2NwZGV2LT5kZWYtPmlycTsKKwllcC0+d29sX2lycSA9IGVtYWNkYXRhLT53b2xfaXJxOworCWlmIChlbWFjZGF0YS0+bWRpb19pZHggPj0gMCkgeworCQlpZiAoZW1hY2RhdGEtPm1kaW9faWR4ID09IG9jcGRldi0+ZGVmLT5pbmRleCkgeworCQkJLyogU2V0IHRoZSBjb21tb24gTURJTyBuZXRfZGV2aWNlICovCisJCQltZGlvX25kZXYgPSBuZGV2OworCQkJZGVmZXJyZWRfaW5pdCA9IDE7CisJCX0KKwkJZXAtPm1kaW9fZGV2ID0gbWRpb19uZGV2OworCX0gZWxzZSB7CisJCWVwLT5tZGlvX2RldiA9IG5kZXY7CisJfQorCisJb2NwX3NldF9kcnZkYXRhKG9jcGRldiwgbmRldik7CisKKwlzcGluX2xvY2tfaW5pdCgmZXAtPmxvY2spOworCisJLyogRmlsbCBvdXQgTUFMIGluZm9ybWF0aW9ucyBhbmQgcmVnaXN0ZXIgY29tbWFjICovCisJZXAtPm1hbCA9IG1hbDsKKwllcC0+bWFsX3R4X2NoYW4gPSBlbWFjZGF0YS0+bWFsX3R4X2NoYW47CisJZXAtPm1hbF9yeF9jaGFuID0gZW1hY2RhdGEtPm1hbF9yeF9jaGFuOworCWVwLT5jb21tYWMub3BzID0gJmVtYWNfY29tbWFjX29wczsKKwllcC0+Y29tbWFjLmRldiA9IG5kZXY7CisJZXAtPmNvbW1hYy50eF9jaGFuX21hc2sgPSBNQUxfQ0hBTl9NQVNLKGVwLT5tYWxfdHhfY2hhbik7CisJZXAtPmNvbW1hYy5yeF9jaGFuX21hc2sgPSBNQUxfQ0hBTl9NQVNLKGVwLT5tYWxfcnhfY2hhbik7CisJcmMgPSBtYWxfcmVnaXN0ZXJfY29tbWFjKGVwLT5tYWwsICZlcC0+Y29tbWFjKTsKKwlpZiAocmMgIT0gMCkKKwkJZ290byBiYWlsOworCWNvbW1hY19yZWcgPSAxOworCisJLyogTWFwIG91ciBNTUlPcyAqLworCWVwLT5lbWFjcCA9IChlbWFjX3QgKikgaW9yZW1hcChvY3BkZXYtPmRlZi0+cGFkZHIsIHNpemVvZihlbWFjX3QpKTsKKworCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gYXR0YWNoIHRvIGEgWk1JSSAqLworCWlmIChlbWFjZGF0YS0+em1paV9pZHggPj0gMCkgeworCQllcC0+em1paV9pbnB1dCA9IGVtYWNkYXRhLT56bWlpX211eDsKKwkJZXAtPnptaWlfZGV2ID0KKwkJICAgIG9jcF9maW5kX2RldmljZShPQ1BfQU5ZX0lELCBPQ1BfRlVOQ19aTUlJLAorCQkJCSAgICBlbWFjZGF0YS0+em1paV9pZHgpOworCQlpZiAoZXAtPnptaWlfZGV2ID09IE5VTEwpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgImVtYWMlZDogWk1JSSAlZCByZXF1ZXN0ZWQgYnV0IG5vdCBmb3VuZCAhXG4iLAorCQkJICAgICAgIG9jcGRldi0+ZGVmLT5pbmRleCwgZW1hY2RhdGEtPnptaWlfaWR4KTsKKwkJZWxzZSBpZiAoKHJjID0KKwkJCSAgZW1hY19pbml0X3ptaWkoZXAtPnptaWlfZGV2LCBlcC0+em1paV9pbnB1dCwKKwkJCQkJIGVtYWNkYXRhLT5waHlfbW9kZSkpICE9IDApCisJCQlnb3RvIGJhaWw7CisJfQorCisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBhdHRhY2ggdG8gYSBSR01JSSAqLworCWlmIChlbWFjZGF0YS0+cmdtaWlfaWR4ID49IDApIHsKKwkJZXAtPnJnbWlpX2lucHV0ID0gZW1hY2RhdGEtPnJnbWlpX211eDsKKwkJZXAtPnJnbWlpX2RldiA9CisJCSAgICBvY3BfZmluZF9kZXZpY2UoT0NQX0FOWV9JRCwgT0NQX0ZVTkNfUkdNSUksCisJCQkJICAgIGVtYWNkYXRhLT5yZ21paV9pZHgpOworCQlpZiAoZXAtPnJnbWlpX2RldiA9PSBOVUxMKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJlbWFjJWQ6IFJHTUlJICVkIHJlcXVlc3RlZCBidXQgbm90IGZvdW5kICFcbiIsCisJCQkgICAgICAgb2NwZGV2LT5kZWYtPmluZGV4LCBlbWFjZGF0YS0+cmdtaWlfaWR4KTsKKwkJZWxzZSBpZiAoKHJjID0KKwkJCSAgZW1hY19pbml0X3JnbWlpKGVwLT5yZ21paV9kZXYsIGVwLT5yZ21paV9pbnB1dCwKKwkJCQkJICBlbWFjZGF0YS0+cGh5X21vZGUpKSAhPSAwKQorCQkJZ290byBiYWlsOworCX0KKworCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gYXR0YWNoIHRvIGEgVEFIICovCisJaWYgKGVtYWNkYXRhLT50YWhfaWR4ID49IDApIHsKKwkJZXAtPnRhaF9kZXYgPQorCQkgICAgb2NwX2ZpbmRfZGV2aWNlKE9DUF9BTllfSUQsIE9DUF9GVU5DX1RBSCwKKwkJCQkgICAgZW1hY2RhdGEtPnRhaF9pZHgpOworCQlpZiAoZXAtPnRhaF9kZXYgPT0gTlVMTCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiZW1hYyVkOiBUQUggJWQgcmVxdWVzdGVkIGJ1dCBub3QgZm91bmQgIVxuIiwKKwkJCSAgICAgICBvY3BkZXYtPmRlZi0+aW5kZXgsIGVtYWNkYXRhLT50YWhfaWR4KTsKKwkJZWxzZSBpZiAoKHJjID0gZW1hY19pbml0X3RhaChlcCkpICE9IDApCisJCQlnb3RvIGJhaWw7CisJfQorCisJaWYgKGRlZmVycmVkX2luaXQpIHsKKwkJaWYgKCFsaXN0X2VtcHR5KCZlbWFjX2luaXRfbGlzdCkpIHsKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCQkJc3RydWN0IGVtYWNfZGVmX2RldiAqZGRldjsKKworCQkJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmVtYWNfaW5pdF9saXN0KSB7CisJCQkJZGRldiA9CisJCQkJICAgIGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBlbWFjX2RlZl9kZXYsCisJCQkJCSAgICAgICBsaW5rKTsKKwkJCQllbWFjX2luaXRfZGV2aWNlKGRkZXYtPm9jcGRldiwgZGRldi0+bWFsKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIEluaXQgbGluayBtb25pdG9yaW5nIHRpbWVyICovCisJaW5pdF90aW1lcigmZXAtPmxpbmtfdGltZXIpOworCWVwLT5saW5rX3RpbWVyLmZ1bmN0aW9uID0gZW1hY19saW5rX3RpbWVyOworCWVwLT5saW5rX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyllcDsKKwllcC0+dGltZXJfdGlja3MgPSAwOworCisJLyogRmlsbCB1cCB0aGUgbWlpX3BoeSBzdHJ1Y3R1cmUgKi8KKwllcC0+cGh5X21paS5kZXYgPSBuZGV2OworCWVwLT5waHlfbWlpLm1kaW9fcmVhZCA9IGVtYWNfcGh5X3JlYWQ7CisJZXAtPnBoeV9taWkubWRpb193cml0ZSA9IGVtYWNfcGh5X3dyaXRlOworCWVwLT5waHlfbWlpLm1vZGUgPSBlbWFjZGF0YS0+cGh5X21vZGU7CisKKwkvKiBGaW5kIFBIWSAqLworCXBoeV9tYXAgPSBlbWFjZGF0YS0+cGh5X21hcCB8IGJ1c3lfcGh5X21hcDsKKwlmb3IgKGkgPSAwOyBpIDw9IDB4MWY7IGkrKywgcGh5X21hcCA+Pj0gMSkgeworCQlpZiAoKHBoeV9tYXAgJiAweDEpID09IDApIHsKKwkJCWludCB2YWwgPSBlbWFjX3BoeV9yZWFkKG5kZXYsIGksIE1JSV9CTUNSKTsKKwkJCWlmICh2YWwgIT0gMHhmZmZmICYmIHZhbCAhPSAtMSkKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA9PSAweDIwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVtYWMlZDogQ2FuJ3QgZmluZCBQSFkuXG4iLAorCQkgICAgICAgb2NwZGV2LT5kZWYtPmluZGV4KTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGJhaWw7CisJfQorCWJ1c3lfcGh5X21hcCB8PSAxIDw8IGk7CisJZXAtPm1paV9waHlfYWRkciA9IGk7CisJcmMgPSBtaWlfcGh5X3Byb2JlKCZlcC0+cGh5X21paSwgaSk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVtYWMlZDogRmFpbGVkIHRvIHByb2JlIFBIWSB0eXBlLlxuIiwKKwkJICAgICAgIG9jcGRldi0+ZGVmLT5pbmRleCk7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBiYWlsOworCX0KKworCS8qIFNldHVwIGluaXRpYWwgUEhZIGNvbmZpZyAmIHN0YXJ0dXAgYW5lZyAqLworCWlmIChlcC0+cGh5X21paS5kZWYtPm9wcy0+aW5pdCkKKwkJZXAtPnBoeV9taWkuZGVmLT5vcHMtPmluaXQoJmVwLT5waHlfbWlpKTsKKwluZXRpZl9jYXJyaWVyX29mZihuZGV2KTsKKwlpZiAoZXAtPnBoeV9taWkuZGVmLT5mZWF0dXJlcyAmIFNVUFBPUlRFRF9BdXRvbmVnKQorCQllcC0+d2FudF9hdXRvbmVnID0gMTsKKwllbWFjX3N0YXJ0X2xpbmsoZXAsIE5VTEwpOworCisJLyogcmVhZCB0aGUgTUFDIEFkZHJlc3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQluZGV2LT5kZXZfYWRkcltpXSA9IGVtYWNkYXRhLT5tYWNfYWRkcltpXTsKKworCS8qIEZpbGwgaW4gdGhlIGRyaXZlciBmdW5jdGlvbiB0YWJsZSAqLworCW5kZXYtPm9wZW4gPSAmZW1hY19vcGVuOworCW5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZlbWFjX3N0YXJ0X3htaXQ7CisJbmRldi0+c3RvcCA9ICZlbWFjX2Nsb3NlOworCW5kZXYtPmdldF9zdGF0cyA9ICZlbWFjX3N0YXRzOworCWlmIChlbWFjZGF0YS0+anVtYm8pCisJCW5kZXYtPmNoYW5nZV9tdHUgPSAmZW1hY19jaGFuZ2VfbXR1OworCW5kZXYtPnNldF9tYWNfYWRkcmVzcyA9ICZlbWFjX3NldF9tYWNfYWRkcmVzczsKKwluZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmZW1hY19zZXRfbXVsdGljYXN0X2xpc3Q7CisJbmRldi0+ZG9faW9jdGwgPSAmZW1hY19pb2N0bDsKKwlTRVRfRVRIVE9PTF9PUFMobmRldiwgJmVtYWNfZXRodG9vbF9vcHMpOworCWlmIChlbWFjZGF0YS0+dGFoX2lkeCA+PSAwKQorCQluZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfU0c7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwluZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlbWFjX25ldHBvbGw7CisjZW5kaWYKKworCVNFVF9NT0RVTEVfT1dORVIobmRldik7CisKKwlyYyA9IHJlZ2lzdGVyX25ldGRldihuZGV2KTsKKwlpZiAocmMgIT0gMCkKKwkJZ290byBiYWlsOworCisJcHJpbnRrKCIlczogSUJNIGVtYWMsIE1BQyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgICAgbmRldi0+bmFtZSwKKwkgICAgICAgbmRldi0+ZGV2X2FkZHJbMF0sIG5kZXYtPmRldl9hZGRyWzFdLCBuZGV2LT5kZXZfYWRkclsyXSwKKwkgICAgICAgbmRldi0+ZGV2X2FkZHJbM10sIG5kZXYtPmRldl9hZGRyWzRdLCBuZGV2LT5kZXZfYWRkcls1XSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZvdW5kICVzIFBIWSAoMHglMDJ4KVxuIiwKKwkgICAgICAgbmRldi0+bmFtZSwgZXAtPnBoeV9taWkuZGVmLT5uYW1lLCBlcC0+bWlpX3BoeV9hZGRyKTsKKworICAgICAgYmFpbDoKKwlpZiAocmMgJiYgY29tbWFjX3JlZykKKwkJbWFsX3VucmVnaXN0ZXJfY29tbWFjKGVwLT5tYWwsICZlcC0+Y29tbWFjKTsKKwlpZiAocmMgJiYgbmRldikKKwkJa2ZyZWUobmRldik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZW1hY19wcm9iZShzdHJ1Y3Qgb2NwX2RldmljZSAqb2NwZGV2KQoreworCXN0cnVjdCBvY3BfZGV2aWNlICptYWxkZXY7CisJc3RydWN0IGlibV9vY3BfbWFsICptYWw7CisJc3RydWN0IG9jcF9mdW5jX2VtYWNfZGF0YSAqZW1hY2RhdGE7CisKKwllbWFjZGF0YSA9IChzdHJ1Y3Qgb2NwX2Z1bmNfZW1hY19kYXRhICopb2NwZGV2LT5kZWYtPmFkZGl0aW9uczsKKwlpZiAoZW1hY2RhdGEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImVtYWMlZDogTWlzc2luZyBhZGRpdGlvbmFsIGRhdGFzICFcbiIsCisJCSAgICAgICBvY3BkZXYtPmRlZi0+aW5kZXgpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBHZXQgdGhlIE1BTCBkZXZpY2UgICovCisJbWFsZGV2ID0gb2NwX2ZpbmRfZGV2aWNlKE9DUF9BTllfSUQsIE9DUF9GVU5DX01BTCwgZW1hY2RhdGEtPm1hbF9pZHgpOworCWlmIChtYWxkZXYgPT0gTlVMTCkgeworCQlwcmludGsoIk5vIG1hbGRldlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKgorCSAqIEdldCBNQUwgZHJpdmVyIGRhdGEsIGl0IG11c3QgYmUgaGVyZSBkdWUgdG8gbGluayBvcmRlci4KKwkgKiBXaGVuIHRoZSBkcml2ZXIgaXMgbW9kdWxhcml6ZWQsIHN5bWJvbCBkZXBlbmRlbmNpZXMgd2lsbAorCSAqIGVuc3VyZSB0aGUgTUFMIGRyaXZlciBpcyBhbHJlYWR5IHByZXNlbnQgaWYgYnVpbHQgYXMgYQorCSAqIG1vZHVsZS4KKwkgKi8KKwltYWwgPSAoc3RydWN0IGlibV9vY3BfbWFsICopb2NwX2dldF9kcnZkYXRhKG1hbGRldik7CisJaWYgKG1hbCA9PSBOVUxMKSB7CisJCXByaW50aygiTm8gbWFsZHJ2XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogSWYgd2UgZGVwZW5kIG9uIGFub3RoZXIgRU1BQyBmb3IgTURJTywgd2FpdCBmb3IgaXQgdG8gc2hvdyB1cCAqLworCWlmIChlbWFjZGF0YS0+bWRpb19pZHggPj0gMCAmJgorCSAgICAoZW1hY2RhdGEtPm1kaW9faWR4ICE9IG9jcGRldi0+ZGVmLT5pbmRleCkgJiYgIW1kaW9fbmRldikgeworCQlzdHJ1Y3QgZW1hY19kZWZfZGV2ICpkZGV2OworCQkvKiBBZGQgdGhpcyBpbmRleCB0byB0aGUgZGVmZXJyZWQgaW5pdCB0YWJsZSAqLworCQlkZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVtYWNfZGVmX2RldiksIEdGUF9LRVJORUwpOworCQlkZGV2LT5vY3BkZXYgPSBvY3BkZXY7CisJCWRkZXYtPm1hbCA9IG1hbDsKKwkJbGlzdF9hZGRfdGFpbCgmZGRldi0+bGluaywgJmVtYWNfaW5pdF9saXN0KTsKKwl9IGVsc2UgeworCQllbWFjX2luaXRfZGV2aWNlKG9jcGRldiwgbWFsKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogU3RydWN0dXJlIGZvciBhIGRldmljZSBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3Qgb2NwX2RldmljZV9pZCBlbWFjX2lkc1tdID0geworCXsudmVuZG9yID0gT0NQX0FOWV9JRCwuZnVuY3Rpb24gPSBPQ1BfRlVOQ19FTUFDfSwKKwl7LnZlbmRvciA9IE9DUF9WRU5ET1JfSU5WQUxJRH0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgb2NwX2RyaXZlciBlbWFjX2RyaXZlciA9IHsKKwkubmFtZSA9ICJlbWFjIiwKKwkuaWRfdGFibGUgPSBlbWFjX2lkcywKKworCS5wcm9iZSA9IGVtYWNfcHJvYmUsCisJLnJlbW92ZSA9IGVtYWNfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZW1hY19pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiOiAiIERSVl9ERVNDICIsIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJNYWludGFpbmVkIGJ5ICIgRFJWX0FVVEhPUiAiXG4iKTsKKworCWlmIChza2JfcmVzID4gMikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJJbnZhbGlkIHNrYl9yZXM6ICVkLCBjcm9wcGluZyB0byAyXG4iLAorCQkgICAgICAgc2tiX3Jlcyk7CisJCXNrYl9yZXMgPSAyOworCX0KKworCXJldHVybiBvY3BfcmVnaXN0ZXJfZHJpdmVyKCZlbWFjX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlbWFjX2V4aXQodm9pZCkKK3sKKwlvY3BfdW5yZWdpc3Rlcl9kcml2ZXIoJmVtYWNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZW1hY19pbml0KTsKK21vZHVsZV9leGl0KGVtYWNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19jb3JlLmggYi9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlNmUxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2libV9lbWFjL2libV9lbWFjX2NvcmUuaApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIGlibV9lbWFjX2NvcmUuaAorICoKKyAqIEV0aGVybmV0IGRyaXZlciBmb3IgdGhlIGJ1aWx0IGluIGV0aGVybmV0IG9uIHRoZSBJQk0gNDA1IFBvd2VyUEMKKyAqIHByb2Nlc3Nvci4KKyAqCisgKiAgICAgIEFybWluIEt1c3RlciBha3VzdGVyQG12aXN0YS5jb20KKyAqICAgICAgU2VwdCwgMjAwMQorICoKKyAqICAgICAgT3JpZ25pYWwgZHJpdmVyCisgKiAgICAgICAgIEpvaG5uaWUgUGV0ZXJzCisgKiAgICAgICAgIGpwZXRlcnNAbXZpc3RhLmNvbQorICoKKyAqIENvcHlyaWdodCAyMDAwIE1vbnRhVmlzdGEgU29mdGFyZSBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9JQk1fRU1BQ19DT1JFX0hfCisjZGVmaW5lIF9JQk1fRU1BQ19DT1JFX0hfCisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vb2NwLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgkJLyogRm9yIHBoeXNfYWRkcl90ICovCisKKyNpbmNsdWRlICJpYm1fZW1hYy5oIgorI2luY2x1ZGUgImlibV9lbWFjX3BoeS5oIgorI2luY2x1ZGUgImlibV9lbWFjX3JnbWlpLmgiCisjaW5jbHVkZSAiaWJtX2VtYWNfem1paS5oIgorI2luY2x1ZGUgImlibV9lbWFjX21hbC5oIgorI2luY2x1ZGUgImlibV9lbWFjX3RhaC5oIgorCisjaWZuZGVmIENPTkZJR19JQk1fRU1BQ19UWEIKKyNkZWZpbmUgTlVNX1RYX0JVRkYJCTY0CisjZGVmaW5lIE5VTV9SWF9CVUZGCQk2NAorI2Vsc2UKKyNkZWZpbmUgTlVNX1RYX0JVRkYJCUNPTkZJR19JQk1fRU1BQ19UWEIKKyNkZWZpbmUgTlVNX1JYX0JVRkYJCUNPTkZJR19JQk1fRU1BQ19SWEIKKyNlbmRpZgorCisvKiBUaGlzIGRvZXMgMTYgYnl0ZSBhbGlnbm1lbnQsIGV4YWN0bHkgd2hhdCB3ZSBuZWVkLgorICogVGhlIHBhY2tldCBsZW5ndGggaW5jbHVkZXMgRkNTLCBidXQgd2UgZG9uJ3Qgd2FudCB0bworICogaW5jbHVkZSB0aGF0IHdoZW4gcGFzc2luZyB1cHN0cmVhbSBhcyBpdCBtZXNzZXMgdXAKKyAqIGJyaWRnaW5nIGFwcGxpY2F0aW9ucy4KKyAqLworI2lmbmRlZiBDT05GSUdfSUJNX0VNQUNfU0tCUkVTCisjZGVmaW5lIFNLQl9SRVMgMgorI2Vsc2UKKyNkZWZpbmUgU0tCX1JFUyBDT05GSUdfSUJNX0VNQUNfU0tCUkVTCisjZW5kaWYKKworLyogTm90ZSBhYm91dCBhbGlnbmVtZW50LiBhbGxvY19za2IoKSByZXR1cm5zIGEgY2FjaGUgbGluZQorICogYWxpZ25lZCBidWZmZXIuIEhvd2V2ZXIsIGRldl9hbGxvY19za2IoKSB3aWxsIGFkZCAxNiBtb3JlCisgKiBieXRlcyBhbmQgInJlc2VydmUiIHRoZW0sIHNvIG91ciBidWZmZXIgd2lsbCBhY3R1YWxseSBlbmQKKyAqIG9uIGEgaGFsZiBjYWNoZSBsaW5lLiBXaGF0IHdlIGRvIGlzIHRvIHVzZSBkaXJlY3RseQorICogYWxsb2Nfc2tiLCBhbGxvY2F0ZSAxNiBtb3JlIGJ5dGVzIHRvIG1hdGNoIHRoZSB0b3RhbCBhbW91bnQKKyAqIGFsbG9jYXRlZCBieSBkZXZfYWxsb2Nfc2tiKCksIGJ1dCB3ZSBkb24ndCByZXNlcnZlLgorICovCisjZGVmaW5lIE1BWF9OVU1fQlVGX0RFU0MJMjU1CisjZGVmaW5lIERFU0NfQlVGX1NJWkUJCTQwODAJLyogbWF4IDQwOTYtMTYgKi8KKyNkZWZpbmUgREVTQ19CVUZfU0laRV9SRUcJKERFU0NfQlVGX1NJWkUgLyAxNikKKworLyogVHJhbnNtaXR0ZXIgdGltZW91dC4gKi8KKyNkZWZpbmUgVFhfVElNRU9VVAkJKDIqSFopCisKKy8qIE1ESU8gbGF0ZW5jeSBkZWxheSAqLworI2RlZmluZSBNRElPX0RFTEFZCQkyNTAKKworLyogUG93ZXIgbWFuYWdtZW50IHNoaWZ0IHJlZ2lzdGVycyAqLworI2RlZmluZSBJQk1fQ1BNX0VNTUlJCTAJLyogU2hpZnQgdmFsdWUgZm9yIE1JSSAqLworI2RlZmluZSBJQk1fQ1BNX0VNUlgJMQkvKiBTaGlmdCB2YWx1ZSBmb3IgcmVjdiAqLworI2RlZmluZSBJQk1fQ1BNX0VNVFgJMgkvKiBTaGlmdCB2YWx1ZSBmb3IgTUFDICovCisjZGVmaW5lIElCTV9DUE1fRU1BQyh4KQkoKCh4KT4+SUJNX0NQTV9FTU1JSSkgfCAoKHgpPj5JQk1fQ1BNX0VNUlgpIHwgKCh4KT4+SUJNX0NQTV9FTVRYKSkKKworI2RlZmluZSBFTkVUX0hFQURFUl9TSVpFCTE0CisjZGVmaW5lIEVORVRfRkNTX1NJWkUJCTQKKyNkZWZpbmUgRU5FVF9ERUZfTVRVX1NJWkUJMTUwMAorI2RlZmluZSBFTkVUX0RFRl9CVUZfU0laRQkoRU5FVF9ERUZfTVRVX1NJWkUgKyBFTkVUX0hFQURFUl9TSVpFICsgRU5FVF9GQ1NfU0laRSkKKyNkZWZpbmUgRU1BQ19NSU5fRlJBTUUJCTY0CisjZGVmaW5lIEVNQUNfTUFYX0ZSQU1FCQk5MDE4CisjZGVmaW5lIEVNQUNfTUlOX01UVQkJKEVNQUNfTUlOX0ZSQU1FIC0gRU5FVF9IRUFERVJfU0laRSAtIEVORVRfRkNTX1NJWkUpCisjZGVmaW5lIEVNQUNfTUFYX01UVQkJKEVNQUNfTUFYX0ZSQU1FIC0gRU5FVF9IRUFERVJfU0laRSAtIEVORVRfRkNTX1NJWkUpCisKKyNpZmRlZiBDT05GSUdfSUJNX0VNQUNfRVJSTVNHCit2b2lkIGVtYWNfc2Vycl9kdW1wXzAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIGVtYWNfc2Vycl9kdW1wXzEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIGVtYWNfZXJyX2R1bXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGVtMGlzcik7Cit2b2lkIGVtYWNfcGh5X2R1bXAoc3RydWN0IG5ldF9kZXZpY2UgKik7Cit2b2lkIGVtYWNfZGVzY19kdW1wKHN0cnVjdCBuZXRfZGV2aWNlICopOwordm9pZCBlbWFjX21hY19kdW1wKHN0cnVjdCBuZXRfZGV2aWNlICopOwordm9pZCBlbWFjX21hbF9kdW1wKHN0cnVjdCBuZXRfZGV2aWNlICopOworI2Vsc2UKKyNkZWZpbmUgZW1hY19zZXJyX2R1bXBfMChkZXYpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZW1hY19zZXJyX2R1bXBfMShkZXYpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZW1hY19lcnJfZHVtcChkZXYseCkgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBlbWFjX3BoeV9kdW1wKGRldikgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBlbWFjX2Rlc2NfZHVtcChkZXYpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZW1hY19tYWNfZHVtcChkZXYpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZW1hY19tYWxfZHVtcChkZXYpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSB7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYltOVU1fVFhfQlVGRl07CisJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYltOVU1fUlhfQlVGRl07CisJc3RydWN0IG1hbF9kZXNjcmlwdG9yICp0eF9kZXNjOworCXN0cnVjdCBtYWxfZGVzY3JpcHRvciAqcnhfZGVzYzsKKwlzdHJ1Y3QgbWFsX2Rlc2NyaXB0b3IgKnJ4X2RpcnR5OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCWludCB0eF9jbnQ7CisJaW50IHJ4X3Nsb3Q7CisJaW50IGRpcnR5X3J4OworCWludCB0eF9zbG90OworCWludCBhY2tfc2xvdDsKKwlpbnQgcnhfYnVmZmVyX3NpemU7CisKKwlzdHJ1Y3QgbWlpX3BoeSBwaHlfbWlpOworCWludCBtaWlfcGh5X2FkZHI7CisJaW50IHdhbnRfYXV0b25lZzsKKwlpbnQgdGltZXJfdGlja3M7CisJc3RydWN0IHRpbWVyX2xpc3QgbGlua190aW1lcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbWRpb19kZXY7CisKKwlzdHJ1Y3Qgb2NwX2RldmljZSAqcmdtaWlfZGV2OworCWludCByZ21paV9pbnB1dDsKKworCXN0cnVjdCBvY3BfZGV2aWNlICp6bWlpX2RldjsKKwlpbnQgem1paV9pbnB1dDsKKworCXN0cnVjdCBpYm1fb2NwX21hbCAqbWFsOworCWludCBtYWxfdHhfY2hhbiwgbWFsX3J4X2NoYW47CisJc3RydWN0IG1hbF9jb21tYWMgY29tbWFjOworCisJc3RydWN0IG9jcF9kZXZpY2UgKnRhaF9kZXY7CisKKwlpbnQgb3BlbmVkOworCWludCBnb2luZ19hd2F5OworCWludCB3b2xfaXJxOworCWVtYWNfdCAqZW1hY3A7CisJc3RydWN0IG9jcF9kZXZpY2UgKm9jcGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwlzcGlubG9ja190IGxvY2s7Cit9OworI2VuZGlmCQkJCS8qIF9JQk1fRU1BQ19DT1JFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODUxMjA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfZGVidWcuYwpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIGlibV9vY3BfZGVidWcuYworICoKKyAqIFRoaXMgaGFzIGFsbCB0aGUgZGVidWcgcm91dGluZXMgdGhhdCB3aGVyZSBpbiAqX2VuZXQuYworICoKKyAqICAgICAgQXJtaW4gS3VzdGVyIGFrdXN0ZXJAbXZpc3RhLmNvbQorICogICAgICBBcHJpbCAsIDIwMDIKKyAqCisgKiBDb3B5cmlnaHQgMjAwMiBNb250YVZpc3RhIFNvZnRhcmUgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgImlibV9vY3BfbWFsLmgiCisjaW5jbHVkZSAiaWJtX29jcF96bWlpLmgiCisjaW5jbHVkZSAiaWJtX29jcF9lbmV0LmgiCisKK2V4dGVybiBpbnQgZW1hY19waHlfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnKTsKKwordm9pZCBlbWFjX3BoeV9kdW1wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGk7CisJdWludCBkYXRhOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiBQcmVwYXJlIGZvciBQaHkgZHVtcC4uLi5cbiIpOworCWZvciAoaSA9IDA7IGkgPCAweDFBOyBpKyspIHsKKwkJZGF0YSA9IGVtYWNfcGh5X3JlYWQoZGV2LCBmZXAtPm1paV9waHlfYWRkciwgaSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJQaHkgcmVnIDB4JWx4ID09PiAlNHhcbiIsIGksIGRhdGEpOworCQlpZiAoaSA9PSAweDA3KQorCQkJaSA9IDB4MGY7CisJfQorfQorCit2b2lkIGVtYWNfZGVzY19kdW1wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKmZlcCA9IGRldi0+cHJpdjsKKwlpbnQgY3Vycl9zbG90OworCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgImR1bXBpbmcgdGhlIHJlY2VpdmUgZGVzY3JpcHRvcnM6ICBjdXJyZW50IHNsb3QgaXMgJWRcbiIsCisJICAgICAgIGZlcC0+cnhfc2xvdCk7CisJZm9yIChjdXJyX3Nsb3QgPSAwOyBjdXJyX3Nsb3QgPCBOVU1fUlhfQlVGRjsgY3Vycl9zbG90KyspIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJEZXNjICUwMmQ6IHN0YXR1cyAweCUwNHgsIGxlbmd0aCAlM2QsIGFkZHIgMHgleFxuIiwKKwkJICAgICAgIGN1cnJfc2xvdCwgZmVwLT5yeF9kZXNjW2N1cnJfc2xvdF0uY3RybCwKKwkJICAgICAgIGZlcC0+cnhfZGVzY1tjdXJyX3Nsb3RdLmRhdGFfbGVuLAorCQkgICAgICAgKHVuc2lnbmVkIGludClmZXAtPnJ4X2Rlc2NbY3Vycl9zbG90XS5kYXRhX3B0cik7CisJfQorfQorCit2b2lkIGVtYWNfbWFjX2R1bXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqZmVwID0gZGV2LT5wcml2OworCXZvbGF0aWxlIGVtYWNfdCAqZW1hY3AgPSBmZXAtPmVtYWNwOworCisJcHJpbnRrKEtFUk5fREVCVUcgIkVNQUMgREVCVUcgKioqKioqKioqKiBcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJFTUFDX00wICA9PT4gMHgleFxuIiwgaW5fYmUzMigmZW1hY3AtPmVtMG1yMCkpOworCXByaW50ayhLRVJOX0RFQlVHICJFTUFDX00xICA9PT4gMHgleFxuIiwgaW5fYmUzMigmZW1hY3AtPmVtMG1yMSkpOworCXByaW50ayhLRVJOX0RFQlVHICJFTUFDX1RYTTA9PT4gMHgleFxuIiwgaW5fYmUzMigmZW1hY3AtPmVtMHRtcjApKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiRU1BQ19UWE0xPT0+IDB4JXhcbiIsIGluX2JlMzIoJmVtYWNwLT5lbTB0bXIxKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIkVNQUNfUlhNID09PiAweCV4XG4iLCBpbl9iZTMyKCZlbWFjcC0+ZW0wcm1yKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIkVNQUNfSVNSID09PiAweCV4XG4iLCBpbl9iZTMyKCZlbWFjcC0+ZW0waXNyKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIkVNQUNfSUVSID09PiAweCV4XG4iLCBpbl9iZTMyKCZlbWFjcC0+ZW0waXNlcikpOworCXByaW50ayhLRVJOX0RFQlVHICJFTUFDX0lBSCA9PT4gMHgleFxuIiwgaW5fYmUzMigmZW1hY3AtPmVtMGlhaHIpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiRU1BQ19JQUwgPT0+IDB4JXhcbiIsIGluX2JlMzIoJmVtYWNwLT5lbTBpYWxyKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIkVNQUNfVkxBTl9UUElEX1JFRyA9PT4gMHgleFxuIiwKKwkgICAgICAgaW5fYmUzMigmZW1hY3AtPmVtMHZ0cGlkKSk7Cit9CisKK3ZvaWQgZW1hY19tYWxfZHVtcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpYm1fb2NwX21hbCAqbWFsID0gKChzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqKWRldi0+cHJpdiktPm1hbDsKKworCXByaW50ayhLRVJOX0RFQlVHICIgTUFMIERFQlVHICoqKioqKioqKiogXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiIE1DUiAgICAgID09PiAweCV4XG4iLAorCSAgICAgICAodW5zaWduZWQgaW50KWdldF9tYWxfZGNybihtYWwsIERDUk5fTUFMQ1IpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiIEVTUiAgICAgID09PiAweCV4XG4iLAorCSAgICAgICAodW5zaWduZWQgaW50KWdldF9tYWxfZGNybihtYWwsIERDUk5fTUFMRVNSKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBJRVIgICAgICA9PT4gMHgleFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGludClnZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTElFUikpOworI2lmZGVmIENPTkZJR180MHgKKwlwcmludGsoS0VSTl9ERUJVRyAiIERCUiAgICAgID09PiAweCV4XG4iLAorCSAgICAgICAodW5zaWduZWQgaW50KWdldF9tYWxfZGNybihtYWwsIERDUk5fTUFMREJSKSk7CisjZW5kaWYJCQkJLyogQ09ORklHXzQweCAqLworCXByaW50ayhLRVJOX0RFQlVHICIgVFhDQVNSICAgPT0+IDB4JXhcbiIsCisJICAgICAgICh1bnNpZ25lZCBpbnQpZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxUWENBU1IpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiIFRYQ0FSUiAgID09PiAweCV4XG4iLAorCSAgICAgICAodW5zaWduZWQgaW50KWdldF9tYWxfZGNybihtYWwsIERDUk5fTUFMVFhDQVJSKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBUWEVPQklTUiA9PT4gMHgleFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGludClnZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFRYRU9CSVNSKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBUWERFSVIgICA9PT4gMHgleFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGludClnZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFRYREVJUikpOworCXByaW50ayhLRVJOX0RFQlVHICIgUlhDQVNSICAgPT0+IDB4JXhcbiIsCisJICAgICAgICh1bnNpZ25lZCBpbnQpZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxSWENBU1IpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiIFJYQ0FSUiAgID09PiAweCV4XG4iLAorCSAgICAgICAodW5zaWduZWQgaW50KWdldF9tYWxfZGNybihtYWwsIERDUk5fTUFMUlhDQVJSKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBSWEVPQklTUiA9PT4gMHgleFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGludClnZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFJYRU9CSVNSKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBSWERFSVIgICA9PT4gMHgleFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGludClnZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFJYREVJUikpOworCXByaW50ayhLRVJOX0RFQlVHICIgVFhDVFAwUiAgPT0+IDB4JXhcbiIsCisJICAgICAgICh1bnNpZ25lZCBpbnQpZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxUWENUUDBSKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBUWENUUDFSICA9PT4gMHgleFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGludClnZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFRYQ1RQMVIpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiIFRYQ1RQMlIgID09PiAweCV4XG4iLAorCSAgICAgICAodW5zaWduZWQgaW50KWdldF9tYWxfZGNybihtYWwsIERDUk5fTUFMVFhDVFAyUikpOworCXByaW50ayhLRVJOX0RFQlVHICIgVFhDVFAzUiAgPT0+IDB4JXhcbiIsCisJICAgICAgICh1bnNpZ25lZCBpbnQpZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxUWENUUDNSKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBSWENUUDBSICA9PT4gMHgleFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGludClnZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFJYQ1RQMFIpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiIFJYQ1RQMVIgID09PiAweCV4XG4iLAorCSAgICAgICAodW5zaWduZWQgaW50KWdldF9tYWxfZGNybihtYWwsIERDUk5fTUFMUlhDVFAxUikpOworCXByaW50ayhLRVJOX0RFQlVHICIgUkNCUzAgICAgPT0+IDB4JXhcbiIsCisJICAgICAgICh1bnNpZ25lZCBpbnQpZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxSQ0JTMCkpOworCXByaW50ayhLRVJOX0RFQlVHICIgUkNCUzEgICAgPT0+IDB4JXhcbiIsCisJICAgICAgICh1bnNpZ25lZCBpbnQpZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxSQ0JTMSkpOworfQorCit2b2lkIGVtYWNfc2Vycl9kdW1wXzAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWJtX29jcF9tYWwgKm1hbCA9ICgoc3RydWN0IG9jcF9lbmV0X3ByaXZhdGUgKilkZXYtPnByaXYpLT5tYWw7CisJdW5zaWduZWQgbG9uZyBpbnQgbWFsX2Vycm9yLCBwbGJfZXJyb3IsIHBsYl9hZGRyOworCisJbWFsX2Vycm9yID0gZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxFU1IpOworCXByaW50ayhLRVJOX0RFQlVHICJwcGM0MDVfZXRoX3NlcnI6ICVzIGNoYW5uZWwgJWxkIFxuIiwKKwkgICAgICAgKG1hbF9lcnJvciAmIDB4NDAwMDAwMDApID8gIlJlY2VpdmUiIDoKKwkgICAgICAgIlRyYW5zbWl0IiwgKG1hbF9lcnJvciAmIDB4M2UwMDAwMDApID4+IDI1KTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICAtLS0tLSAgbGF0Y2hlZCBlcnJvciAgLS0tLS1cbiIpOworCWlmIChtYWxfZXJyb3IgJiBNQUxFU1JfREUpCisJCXByaW50ayhLRVJOX0RFQlVHICIgIERFOiBkZXNjcmlwdG9yIGVycm9yXG4iKTsKKwlpZiAobWFsX2Vycm9yICYgTUFMRVNSX09FTikKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgT05FOiBPUEIgbm9uLWZ1bGx3b3JkIGVycm9yXG4iKTsKKwlpZiAobWFsX2Vycm9yICYgTUFMRVNSX09URSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgT1RFOiBPUEIgdGltZW91dCBlcnJvclxuIik7CisJaWYgKG1hbF9lcnJvciAmIE1BTEVTUl9PU0UpCisJCXByaW50ayhLRVJOX0RFQlVHICIgIE9TRTogT1BCIHNsYXZlIGVycm9yXG4iKTsKKworCWlmIChtYWxfZXJyb3IgJiBNQUxFU1JfUEVJTikgeworCQlwbGJfZXJyb3IgPSBtZmRjcihEQ1JOX1BMQjBfQkVTUik7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiICBQRUlOOiBQTEIgZXJyb3IsIFBMQjBfQkVTUiBpcyAweCV4XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGludClwbGJfZXJyb3IpOworCQlwbGJfYWRkciA9IG1mZGNyKERDUk5fUExCMF9CRUFSKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICIgIFBFSU46IFBMQiBlcnJvciwgUExCMF9CRUFSIGlzIDB4JXhcbiIsCisJCSAgICAgICAodW5zaWduZWQgaW50KXBsYl9hZGRyKTsKKwl9Cit9CisKK3ZvaWQgZW1hY19zZXJyX2R1bXBfMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpYm1fb2NwX21hbCAqbWFsID0gKChzdHJ1Y3Qgb2NwX2VuZXRfcHJpdmF0ZSAqKWRldi0+cHJpdiktPm1hbDsKKwlpbnQgbWFsX2Vycm9yID0gZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxFU1IpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiAgLS0tLS0gIGN1bXVsYXRpdmUgZXJyb3JzICAtLS0tLVxuIik7CisJaWYgKG1hbF9lcnJvciAmIE1BTEVTUl9ERUkpCisJCXByaW50ayhLRVJOX0RFQlVHICIgIERFSTogZGVzY3JpcHRvciBlcnJvciBpbnRlcnJ1cHRcbiIpOworCWlmIChtYWxfZXJyb3IgJiBNQUxFU1JfT05FSSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgT1BCIG5vbi1mdWxsd29yZCBlcnJvciBpbnRlcnJ1cHRcbiIpOworCWlmIChtYWxfZXJyb3IgJiBNQUxFU1JfT1RFSSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgT1RFSTogdGltZW91dCBlcnJvciBpbnRlcnJ1cHRcbiIpOworCWlmIChtYWxfZXJyb3IgJiBNQUxFU1JfT1NFSSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgT1NFSTogc2xhdmUgZXJyb3IgaW50ZXJydXB0XG4iKTsKKwlpZiAobWFsX2Vycm9yICYgTUFMRVNSX1BCRUkpCisJCXByaW50ayhLRVJOX0RFQlVHICIgIFBCRUk6IFBMQiBidXMgZXJyb3IgaW50ZXJydXB0XG4iKTsKK30KKwordm9pZCBlbWFjX2Vycl9kdW1wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBlbTBpc3IpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBvbi1jaGlwIGV0aGVybmV0IGVycm9yOlxuIiwgZGV2LT5uYW1lKTsKKworCWlmIChlbTBpc3IgJiBFTUFDX0lTUl9PVlIpCisJCXByaW50ayhLRVJOX0RFQlVHICIgIE9WUjogb3ZlcnJ1blxuIik7CisJaWYgKGVtMGlzciAmIEVNQUNfSVNSX1BQKQorCQlwcmludGsoS0VSTl9ERUJVRyAiICBQUDogY29udHJvbCBwYXVzZSBwYWNrZXRcbiIpOworCWlmIChlbTBpc3IgJiBFTUFDX0lTUl9CUCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgQlA6IHBhY2tldCBlcnJvclxuIik7CisJaWYgKGVtMGlzciAmIEVNQUNfSVNSX1JQKQorCQlwcmludGsoS0VSTl9ERUJVRyAiICBSUDogcnVudCBwYWNrZXRcbiIpOworCWlmIChlbTBpc3IgJiBFTUFDX0lTUl9TRSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgU0U6IHNob3J0IGV2ZW50XG4iKTsKKwlpZiAoZW0waXNyICYgRU1BQ19JU1JfQUxFKQorCQlwcmludGsoS0VSTl9ERUJVRyAiICBBTEU6IG9kZCBudW1iZXIgb2YgbmliYmxlcyBpbiBwYWNrZXRcbiIpOworCWlmIChlbTBpc3IgJiBFTUFDX0lTUl9CRkNTKQorCQlwcmludGsoS0VSTl9ERUJVRyAiICBCRkNTOiBiYWQgRkNTXG4iKTsKKwlpZiAoZW0waXNyICYgRU1BQ19JU1JfUFRMRSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgUFRMRTogb3ZlcnNpemVkIHBhY2tldFxuIik7CisJaWYgKGVtMGlzciAmIEVNQUNfSVNSX09SRSkKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICIgIE9SRTogcGFja2V0IGxlbmd0aCBmaWVsZCA+IG1heCBhbGxvd2VkIExMQ1xuIik7CisJaWYgKGVtMGlzciAmIEVNQUNfSVNSX0lSRSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgSVJFOiBJbiBSYW5nZSBlcnJvclxuIik7CisJaWYgKGVtMGlzciAmIEVNQUNfSVNSX0RCRE0pCisJCXByaW50ayhLRVJOX0RFQlVHICIgIERCRE06IHhtaXQgZXJyb3Igb3IgU1FFXG4iKTsKKwlpZiAoZW0waXNyICYgRU1BQ19JU1JfREIwKQorCQlwcmludGsoS0VSTl9ERUJVRyAiICBEQjA6IHhtaXQgZXJyb3Igb3IgU1FFIG9uIFRYIGNoYW5uZWwgMFxuIik7CisJaWYgKGVtMGlzciAmIEVNQUNfSVNSX1NFMCkKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICIgIFNFMDogU2lnbmFsIFF1YWxpdHkgRXJyb3IgdGVzdCBmYWlsdXJlIGZyb20gVFggY2hhbm5lbCAwXG4iKTsKKwlpZiAoZW0waXNyICYgRU1BQ19JU1JfVEUwKQorCQlwcmludGsoS0VSTl9ERUJVRyAiICBURTA6IHhtaXQgY2hhbm5lbCAwIGFib3J0ZWRcbiIpOworCWlmIChlbTBpc3IgJiBFTUFDX0lTUl9EQjEpCisJCXByaW50ayhLRVJOX0RFQlVHICIgIERCMTogeG1pdCBlcnJvciBvciBTUUUgb24gVFggY2hhbm5lbCBcbiIpOworCWlmIChlbTBpc3IgJiBFTUFDX0lTUl9TRTEpCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiICBTRTE6IFNpZ25hbCBRdWFsaXR5IEVycm9yIHRlc3QgZmFpbHVyZSBmcm9tIFRYIGNoYW5uZWwgMVxuIik7CisJaWYgKGVtMGlzciAmIEVNQUNfSVNSX1RFMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgVEUxOiB4bWl0IGNoYW5uZWwgMSBhYm9ydGVkXG4iKTsKKwlpZiAoZW0waXNyICYgRU1BQ19JU1JfTU9TKQorCQlwcmludGsoS0VSTl9ERUJVRyAiICBNT1NcbiIpOworCWlmIChlbTBpc3IgJiBFTUFDX0lTUl9NT0YpCisJCXByaW50ayhLRVJOX0RFQlVHICIgIE1PRlxuIik7CisKKwllbWFjX21hY19kdW1wKGRldik7CisJZW1hY19tYWxfZHVtcChkZXYpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfbWFsLmMgYi9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19tYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTlmNTdmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfbWFsLmMKQEAgLTAsMCArMSw0NjMgQEAKKy8qCisgKiBpYm1fb2NwX21hbC5jCisgKgorICogICAgICBBcm1pbiBLdXN0ZXIgYWt1c3RlckBtdmlzdGEuY29tCisgKiAgICAgIEp1ZW4sIDIwMDIKKyAqCisgKiBDb3B5cmlnaHQgMjAwMiBNb250YVZpc3RhIFNvZnRhcmUgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL29jcC5oPgorCisjaW5jbHVkZSAiaWJtX2VtYWNfbWFsLmgiCisKKy8vIExvY2tpbmc6IFNob3VsZCB3ZSBzaGFyZSBhIGxvY2sgd2l0aCB0aGUgY2xpZW50ID8gVGhlIGNsaWVudCBjb3VsZCBwcm92aWRlCisvLyBhIGxvY2sgcG9pbnRlciAob3B0aW9uYWxseSkgaW4gdGhlIGNvbW1hYyBzdHJ1Y3R1cmUuLi4gSSBkb24ndCB0aGluayB0aGlzIGlzCisvLyByZWFsbHkgbmVjZXNzYXJ5IHRob3VnaAorCisvKiBUaGlzIGxvY2sgcHJvdGVjdHMgdGhlIGNvbW1hYyBsaXN0LiBPbiB0b2RheSBVUCBpbXBsZW1lbnRhdGlvbnMsIGl0J3MKKyAqIHJlYWxseSBvbmx5IHVzZWQgYXMgSVJRIHByb3RlY3Rpb24gaW4gbWFsX3tyZWdpc3Rlcix1bnJlZ2lzdGVyfV9jb21tYWMoKQorICovCitzdGF0aWMgREVGSU5FX1JXTE9DSyhtYWxfbGlzdF9sb2NrKTsKKworaW50IG1hbF9yZWdpc3Rlcl9jb21tYWMoc3RydWN0IGlibV9vY3BfbWFsICptYWwsIHN0cnVjdCBtYWxfY29tbWFjICpjb21tYWMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmbWFsX2xpc3RfbG9jaywgZmxhZ3MpOworCisJLyogRG9uJ3QgbGV0IG11bHRpcGxlIGNvbW1hY3MgY2xhaW0gdGhlIHNhbWUgY2hhbm5lbCAqLworCWlmICgobWFsLT50eF9jaGFuX21hc2sgJiBjb21tYWMtPnR4X2NoYW5fbWFzaykgfHwKKwkgICAgKG1hbC0+cnhfY2hhbl9tYXNrICYgY29tbWFjLT5yeF9jaGFuX21hc2spKSB7CisJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZtYWxfbGlzdF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJbWFsLT50eF9jaGFuX21hc2sgfD0gY29tbWFjLT50eF9jaGFuX21hc2s7CisJbWFsLT5yeF9jaGFuX21hc2sgfD0gY29tbWFjLT5yeF9jaGFuX21hc2s7CisKKwlsaXN0X2FkZCgmY29tbWFjLT5saXN0LCAmbWFsLT5jb21tYWMpOworCisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJm1hbF9saXN0X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitpbnQgbWFsX3VucmVnaXN0ZXJfY29tbWFjKHN0cnVjdCBpYm1fb2NwX21hbCAqbWFsLCBzdHJ1Y3QgbWFsX2NvbW1hYyAqY29tbWFjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJm1hbF9saXN0X2xvY2ssIGZsYWdzKTsKKworCW1hbC0+dHhfY2hhbl9tYXNrICY9IH5jb21tYWMtPnR4X2NoYW5fbWFzazsKKwltYWwtPnJ4X2NoYW5fbWFzayAmPSB+Y29tbWFjLT5yeF9jaGFuX21hc2s7CisKKwlsaXN0X2RlbF9pbml0KCZjb21tYWMtPmxpc3QpOworCisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJm1hbF9saXN0X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitpbnQgbWFsX3NldF9yY2JzKHN0cnVjdCBpYm1fb2NwX21hbCAqbWFsLCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXN3aXRjaCAoY2hhbm5lbCkgeworCWNhc2UgMDoKKwkJc2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxSQ0JTMCwgc2l6ZSk7CisJCWJyZWFrOworI2lmZGVmIERDUk5fTUFMUkNCUzEKKwljYXNlIDE6CisJCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMUkNCUzEsIHNpemUpOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIERDUk5fTUFMUkNCUzIKKwljYXNlIDI6CisJCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMUkNCUzIsIHNpemUpOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIERDUk5fTUFMUkNCUzMKKwljYXNlIDM6CisJCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMUkNCUzMsIHNpemUpOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbWFsX3NlcnIoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaWJtX29jcF9tYWwgKm1hbCA9IGRldl9pbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIG1hbF9lcnJvcjsKKworCS8qCisJICogVGhpcyBTRVJSIGFwcGxpZXMgdG8gb25lIG9mIHRoZSBkZXZpY2VzIG9uIHRoZSBNQUwsIGhlcmUgd2UgY2hhcmdlCisJICogaXQgYWdhaW5zdCB0aGUgZmlyc3QgRU1BQyByZWdpc3RlcmVkIGZvciB0aGUgTUFMLgorCSAqLworCisJbWFsX2Vycm9yID0gZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxFU1IpOworCisJcHJpbnRrKEtFUk5fRVJSICIlczogU3lzdGVtIEVycm9yIChNQUxFU1I9JWx4KVxuIiwKKwkgICAgICAgIk1BTCIgLyogRklYTUU6IGdldCB0aGUgbmFtZSByaWdodCAqLyAsIG1hbF9lcnJvcik7CisKKwkvKiBGSVhNRTogZGVjaXBoZXIgZXJyb3IgKi8KKwkvKiBESVhNRTogZGlzdHJpYnV0ZSB0byBjb21tYWNzLCBpZiBwb3NzaWJsZSAqLworCisJLyogQ2xlYXIgdGhlIGVycm9yIHN0YXR1cyByZWdpc3RlciAqLworCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMRVNSLCBtYWxfZXJyb3IpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbWFsX3R4ZW9iKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGlibV9vY3BfbWFsICptYWwgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IGxpc3RfaGVhZCAqbDsKKwl1bnNpZ25lZCBsb25nIGlzcjsKKworCWlzciA9IGdldF9tYWxfZGNybihtYWwsIERDUk5fTUFMVFhFT0JJU1IpOworCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMVFhFT0JJU1IsIGlzcik7CisKKwlyZWFkX2xvY2soJm1hbF9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2gobCwgJm1hbC0+Y29tbWFjKSB7CisJCXN0cnVjdCBtYWxfY29tbWFjICptYyA9IGxpc3RfZW50cnkobCwgc3RydWN0IG1hbF9jb21tYWMsIGxpc3QpOworCisJCWlmIChpc3IgJiBtYy0+dHhfY2hhbl9tYXNrKSB7CisJCQltYy0+b3BzLT50eGVvYihtYy0+ZGV2LCBpc3IgJiBtYy0+dHhfY2hhbl9tYXNrKTsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmbWFsX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtYWxfcnhlb2IoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaWJtX29jcF9tYWwgKm1hbCA9IGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsOworCXVuc2lnbmVkIGxvbmcgaXNyOworCisJaXNyID0gZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxSWEVPQklTUik7CisJc2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxSWEVPQklTUiwgaXNyKTsKKworCXJlYWRfbG9jaygmbWFsX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaChsLCAmbWFsLT5jb21tYWMpIHsKKwkJc3RydWN0IG1hbF9jb21tYWMgKm1jID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgbWFsX2NvbW1hYywgbGlzdCk7CisKKwkJaWYgKGlzciAmIG1jLT5yeF9jaGFuX21hc2spIHsKKwkJCW1jLT5vcHMtPnJ4ZW9iKG1jLT5kZXYsIGlzciAmIG1jLT5yeF9jaGFuX21hc2spOworCQl9CisJfQorCXJlYWRfdW5sb2NrKCZtYWxfbGlzdF9sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IG1hbF90eGRlKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGlibV9vY3BfbWFsICptYWwgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IGxpc3RfaGVhZCAqbDsKKwl1bnNpZ25lZCBsb25nIGRlaXI7CisKKwlkZWlyID0gZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxUWERFSVIpOworCisJLyogRklYTUU6IHByaW50IHdoaWNoIE1BTCBjb3JyZWN0bHkgKi8KKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHggZGVzY3JpcHRvciBlcnJvciAoTUFMVFhERUlSPSVseClcbiIsCisJICAgICAgICJNQUwiLCBkZWlyKTsKKworCXJlYWRfbG9jaygmbWFsX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaChsLCAmbWFsLT5jb21tYWMpIHsKKwkJc3RydWN0IG1hbF9jb21tYWMgKm1jID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgbWFsX2NvbW1hYywgbGlzdCk7CisKKwkJaWYgKGRlaXIgJiBtYy0+dHhfY2hhbl9tYXNrKSB7CisJCQltYy0+b3BzLT50eGRlKG1jLT5kZXYsIGRlaXIgJiBtYy0+dHhfY2hhbl9tYXNrKTsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmbWFsX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBUaGlzIGludGVycnVwdCBzaG91bGQgYmUgdmVyeSByYXJlIGF0IGJlc3QuICBUaGlzIG9jY3VycyB3aGVuCisgKiB0aGUgaGFyZHdhcmUgaGFzIGEgcHJvYmxlbSB3aXRoIHRoZSByZWNlaXZlIGRlc2NyaXB0b3JzLiAgVGhlIG1hbnVhbAorICogc3RhdGVzIHRoYXQgaXQgb2NjdXJzIHdoZW4gdGhlIGhhcmR3YXJlIGNhbm5vdCB0aGUgcmVjZWl2ZSBkZXNjcmlwdG9yCisgKiBlbXB0eSBiaXQgaXMgbm90IHNldC4gIFRoZSByZWNvdmVyeSBtZWNoYW5pc20gd2lsbCBiZSB0bworICogdHJhdmVyc2UgdGhyb3VnaCB0aGUgZGVzY3JpcHRvcnMsIGhhbmRsZSBhbnkgdGhhdCBhcmUgbWFya2VkIHRvIGJlCisgKiBoYW5kbGVkIGFuZCByZWluaXRpYWxpemUgZWFjaCBhbG9uZyB0aGUgd2F5LiAgQXQgdGhhdCBwb2ludCB0aGUgZHJpdmVyCisgKiB3aWxsIGJlIHJlc3RhcnRlZC4KKyAqLworc3RhdGljIGlycXJldHVybl90IG1hbF9yeGRlKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGlibV9vY3BfbWFsICptYWwgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IGxpc3RfaGVhZCAqbDsKKwl1bnNpZ25lZCBsb25nIGRlaXI7CisKKwlkZWlyID0gZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxSWERFSVIpOworCisJLyoKKwkgKiBUaGlzIHJlYWxseSBpcyBuZWVkZWQuICBUaGlzIGNhc2UgZW5jb3VudGVyZWQgaW4gc3RyZXNzIHRlc3RpbmcuCisJICovCisJaWYgKGRlaXIgPT0gMCkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJLyogRklYTUU6IHByaW50IHdoaWNoIE1BTCBjb3JyZWN0bHkgKi8KKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUnggZGVzY3JpcHRvciBlcnJvciAoTUFMUlhERUlSPSVseClcbiIsCisJICAgICAgICJNQUwiLCBkZWlyKTsKKworCXJlYWRfbG9jaygmbWFsX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaChsLCAmbWFsLT5jb21tYWMpIHsKKwkJc3RydWN0IG1hbF9jb21tYWMgKm1jID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgbWFsX2NvbW1hYywgbGlzdCk7CisKKwkJaWYgKGRlaXIgJiBtYy0+cnhfY2hhbl9tYXNrKSB7CisJCQltYy0+b3BzLT5yeGRlKG1jLT5kZXYsIGRlaXIgJiBtYy0+cnhfY2hhbl9tYXNrKTsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmbWFsX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG1hbF9wcm9iZShzdHJ1Y3Qgb2NwX2RldmljZSAqb2NwZGV2KQoreworCXN0cnVjdCBpYm1fb2NwX21hbCAqbWFsID0gTlVMTDsKKwlzdHJ1Y3Qgb2NwX2Z1bmNfbWFsX2RhdGEgKm1hbGRhdGE7CisJaW50IGVyciA9IDA7CisKKwltYWxkYXRhID0gKHN0cnVjdCBvY3BfZnVuY19tYWxfZGF0YSAqKW9jcGRldi0+ZGVmLT5hZGRpdGlvbnM7CisJaWYgKG1hbGRhdGEgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIm1hbCVkOiBNaXNzaW5nIGFkZGl0aW9uYWwgZGF0YXMgIVxuIiwKKwkJICAgICAgIG9jcGRldi0+ZGVmLT5pbmRleCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW1hbCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpYm1fb2NwX21hbCksIEdGUF9LRVJORUwpOworCWlmIChtYWwgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJtYWwlZDogT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIE1BTCBzdHJ1Y3R1cmUgIVxuIiwKKwkJICAgICAgIG9jcGRldi0+ZGVmLT5pbmRleCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQobWFsLCAwLCBzaXplb2YoKm1hbCkpOworCisJc3dpdGNoIChvY3BkZXYtPmRlZi0+aW5kZXgpIHsKKwljYXNlIDA6CisJCW1hbC0+ZGNyYmFzZSA9IERDUk5fTUFMX0JBU0U7CisJCWJyZWFrOworI2lmZGVmIERDUk5fTUFMMV9CQVNFCisJY2FzZSAxOgorCQltYWwtPmRjcmJhc2UgPSBEQ1JOX01BTDFfQkFTRTsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwlJTklUX0xJU1RfSEVBRCgmbWFsLT5jb21tYWMpOworCisJc2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxSWENBUlIsIDB4RkZGRkZGRkYpOworCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMVFhDQVJSLCAweEZGRkZGRkZGKTsKKworCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMQ1IsIE1BTENSX01NU1IpOwkvKiAzODQgKi8KKwkvKiBGSVhNRTogQWRkIGRlbGF5ICovCisKKwkvKiBTZXQgdGhlIE1BTCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJc2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxDUiwKKwkJICAgICBNQUxDUl9QTEJCIHwgTUFMQ1JfT1BCQkwgfCBNQUxDUl9MRUEgfAorCQkgICAgIE1BTENSX1BMQkxUX0RFRkFVTFQpOworCisJLyogSXQgd291bGQgYmUgbmljZSB0byBhbGxvY2F0ZSBidWZmZXJzIHNlcGFyYXRlbHkgZm9yIGVhY2gKKwkgKiBjaGFubmVsLCBidXQgd2UgY2FuJ3QgYmVjYXVzZSB0aGUgY2hhbm5lbHMgc2hhcmUgdGhlIHVwcGVyCisJICogMTMgYml0cyBvZiBhZGRyZXNzIGxpbmVzLiAgRWFjaCBjaGFubmVscyBidWZmZXIgbXVzdCBhbHNvCisJICogYmUgNGsgYWxpZ25lZCwgc28gd2UgYWxsb2NhdGUgNGsgZm9yIGVhY2ggY2hhbm5lbC4gIFRoaXMgaXMKKwkgKiBpbmVmZmljaWVudCBGSVhNRTogZG8gYmV0dGVyLCBpZiBwb3NzaWJsZSAqLworCW1hbC0+dHhfdmlydF9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZvY3BkZXYtPmRldiwKKwkJCQkJICAgICAgIE1BTF9EVF9BTElHTiAqCisJCQkJCSAgICAgICBtYWxkYXRhLT5udW1fdHhfY2hhbnMsCisJCQkJCSAgICAgICAmbWFsLT50eF9waHlzX2FkZHIsIEdGUF9LRVJORUwpOworCWlmIChtYWwtPnR4X3ZpcnRfYWRkciA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIm1hbCVkOiBPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgTUFMIGRlc2NyaXB0b3JzICFcbiIsCisJCSAgICAgICBvY3BkZXYtPmRlZi0+aW5kZXgpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogR29kLCBvaCwgZ29kLCBJIGhhdGUgRENScyAqLworCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMVFhDVFAwUiwgbWFsLT50eF9waHlzX2FkZHIpOworI2lmZGVmIERDUk5fTUFMVFhDVFAxUgorCWlmIChtYWxkYXRhLT5udW1fdHhfY2hhbnMgPiAxKQorCQlzZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFRYQ1RQMVIsCisJCQkgICAgIG1hbC0+dHhfcGh5c19hZGRyICsgTUFMX0RUX0FMSUdOKTsKKyNlbmRpZgkJCQkvKiBEQ1JOX01BTFRYQ1RQMVIgKi8KKyNpZmRlZiBEQ1JOX01BTFRYQ1RQMlIKKwlpZiAobWFsZGF0YS0+bnVtX3R4X2NoYW5zID4gMikKKwkJc2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxUWENUUDJSLAorCQkJICAgICBtYWwtPnR4X3BoeXNfYWRkciArIDIgKiBNQUxfRFRfQUxJR04pOworI2VuZGlmCQkJCS8qIERDUk5fTUFMVFhDVFAyUiAqLworI2lmZGVmIERDUk5fTUFMVFhDVFAzUgorCWlmIChtYWxkYXRhLT5udW1fdHhfY2hhbnMgPiAzKQorCQlzZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFRYQ1RQM1IsCisJCQkgICAgIG1hbC0+dHhfcGh5c19hZGRyICsgMyAqIE1BTF9EVF9BTElHTik7CisjZW5kaWYJCQkJLyogRENSTl9NQUxUWENUUDNSICovCisjaWZkZWYgRENSTl9NQUxUWENUUDRSCisJaWYgKG1hbGRhdGEtPm51bV90eF9jaGFucyA+IDQpCisJCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMVFhDVFA0UiwKKwkJCSAgICAgbWFsLT50eF9waHlzX2FkZHIgKyA0ICogTUFMX0RUX0FMSUdOKTsKKyNlbmRpZgkJCQkvKiBEQ1JOX01BTFRYQ1RQNFIgKi8KKyNpZmRlZiBEQ1JOX01BTFRYQ1RQNVIKKwlpZiAobWFsZGF0YS0+bnVtX3R4X2NoYW5zID4gNSkKKwkJc2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxUWENUUDVSLAorCQkJICAgICBtYWwtPnR4X3BoeXNfYWRkciArIDUgKiBNQUxfRFRfQUxJR04pOworI2VuZGlmCQkJCS8qIERDUk5fTUFMVFhDVFA1UiAqLworI2lmZGVmIERDUk5fTUFMVFhDVFA2UgorCWlmIChtYWxkYXRhLT5udW1fdHhfY2hhbnMgPiA2KQorCQlzZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFRYQ1RQNlIsCisJCQkgICAgIG1hbC0+dHhfcGh5c19hZGRyICsgNiAqIE1BTF9EVF9BTElHTik7CisjZW5kaWYJCQkJLyogRENSTl9NQUxUWENUUDZSICovCisjaWZkZWYgRENSTl9NQUxUWENUUDdSCisJaWYgKG1hbGRhdGEtPm51bV90eF9jaGFucyA+IDcpCisJCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMVFhDVFA3UiwKKwkJCSAgICAgbWFsLT50eF9waHlzX2FkZHIgKyA3ICogTUFMX0RUX0FMSUdOKTsKKyNlbmRpZgkJCQkvKiBEQ1JOX01BTFRYQ1RQN1IgKi8KKworCW1hbC0+cnhfdmlydF9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZvY3BkZXYtPmRldiwKKwkJCQkJICAgICAgIE1BTF9EVF9BTElHTiAqCisJCQkJCSAgICAgICBtYWxkYXRhLT5udW1fcnhfY2hhbnMsCisJCQkJCSAgICAgICAmbWFsLT5yeF9waHlzX2FkZHIsIEdGUF9LRVJORUwpOworCisJc2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxSWENUUDBSLCBtYWwtPnJ4X3BoeXNfYWRkcik7CisjaWZkZWYgRENSTl9NQUxSWENUUDFSCisJaWYgKG1hbGRhdGEtPm51bV9yeF9jaGFucyA+IDEpCisJCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMUlhDVFAxUiwKKwkJCSAgICAgbWFsLT5yeF9waHlzX2FkZHIgKyBNQUxfRFRfQUxJR04pOworI2VuZGlmCQkJCS8qIERDUk5fTUFMUlhDVFAxUiAqLworI2lmZGVmIERDUk5fTUFMUlhDVFAyUgorCWlmIChtYWxkYXRhLT5udW1fcnhfY2hhbnMgPiAyKQorCQlzZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFJYQ1RQMlIsCisJCQkgICAgIG1hbC0+cnhfcGh5c19hZGRyICsgMiAqIE1BTF9EVF9BTElHTik7CisjZW5kaWYJCQkJLyogRENSTl9NQUxSWENUUDJSICovCisjaWZkZWYgRENSTl9NQUxSWENUUDNSCisJaWYgKG1hbGRhdGEtPm51bV9yeF9jaGFucyA+IDMpCisJCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMUlhDVFAzUiwKKwkJCSAgICAgbWFsLT5yeF9waHlzX2FkZHIgKyAzICogTUFMX0RUX0FMSUdOKTsKKyNlbmRpZgkJCQkvKiBEQ1JOX01BTFJYQ1RQM1IgKi8KKworCWVyciA9IHJlcXVlc3RfaXJxKG1hbGRhdGEtPnNlcnJfaXJxLCBtYWxfc2VyciwgMCwgIk1BTCBTRVJSIiwgbWFsKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWw7CisJZXJyID0gcmVxdWVzdF9pcnEobWFsZGF0YS0+dHhkZV9pcnEsIG1hbF90eGRlLCAwLCAiTUFMIFRYIERFICIsIG1hbCk7CisJaWYgKGVycikKKwkJZ290byBmYWlsOworCWVyciA9IHJlcXVlc3RfaXJxKG1hbGRhdGEtPnR4ZW9iX2lycSwgbWFsX3R4ZW9iLCAwLCAiTUFMIFRYIEVPQiIsIG1hbCk7CisJaWYgKGVycikKKwkJZ290byBmYWlsOworCWVyciA9IHJlcXVlc3RfaXJxKG1hbGRhdGEtPnJ4ZGVfaXJxLCBtYWxfcnhkZSwgMCwgIk1BTCBSWCBERSIsIG1hbCk7CisJaWYgKGVycikKKwkJZ290byBmYWlsOworCWVyciA9IHJlcXVlc3RfaXJxKG1hbGRhdGEtPnJ4ZW9iX2lycSwgbWFsX3J4ZW9iLCAwLCAiTUFMIFJYIEVPQiIsIG1hbCk7CisJaWYgKGVycikKKwkJZ290byBmYWlsOworCisJc2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxJRVIsCisJCSAgICAgTUFMSUVSX0RFIHwgTUFMSUVSX05FIHwgTUFMSUVSX1RFIHwKKwkJICAgICBNQUxJRVJfT1BCRSB8IE1BTElFUl9QTEJFKTsKKworCS8qIEFkdmVydGlzZSBtZSB0byB0aGUgcmVzdCBvZiB0aGUgd29ybGQgKi8KKwlvY3Bfc2V0X2RydmRhdGEob2NwZGV2LCBtYWwpOworCisJcHJpbnRrKEtFUk5fSU5GTyAibWFsJWQ6IEluaXRpYWxpemVkLCAlZCB0eCBjaGFubmVscywgJWQgcnggY2hhbm5lbHNcbiIsCisJICAgICAgIG9jcGRldi0+ZGVmLT5pbmRleCwgbWFsZGF0YS0+bnVtX3R4X2NoYW5zLAorCSAgICAgICBtYWxkYXRhLT5udW1fcnhfY2hhbnMpOworCisJcmV0dXJuIDA7CisKKyAgICAgIGZhaWw6CisJLyogRklYTUU6IGRpc3Bvc2UgcmVxdWVzdGVkIElSUXMgISAqLworCWlmIChlcnIgJiYgbWFsKQorCQlrZnJlZShtYWwpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtYWxfcmVtb3ZlKHN0cnVjdCBvY3BfZGV2aWNlICpvY3BkZXYpCit7CisJc3RydWN0IGlibV9vY3BfbWFsICptYWwgPSBvY3BfZ2V0X2RydmRhdGEob2NwZGV2KTsKKwlzdHJ1Y3Qgb2NwX2Z1bmNfbWFsX2RhdGEgKm1hbGRhdGEgPSBvY3BkZXYtPmRlZi0+YWRkaXRpb25zOworCisJQlVHX09OKCFtYWxkYXRhKTsKKworCW9jcF9zZXRfZHJ2ZGF0YShvY3BkZXYsIE5VTEwpOworCisJLyogRklYTUU6IHNodXQgZG93biB0aGUgTUFMLCBkZWFsIHdpdGggZGVwZW5kZW5jeSB3aXRoIGVtYWMgKi8KKwlmcmVlX2lycShtYWxkYXRhLT5zZXJyX2lycSwgbWFsKTsKKwlmcmVlX2lycShtYWxkYXRhLT50eGRlX2lycSwgbWFsKTsKKwlmcmVlX2lycShtYWxkYXRhLT50eGVvYl9pcnEsIG1hbCk7CisJZnJlZV9pcnEobWFsZGF0YS0+cnhkZV9pcnEsIG1hbCk7CisJZnJlZV9pcnEobWFsZGF0YS0+cnhlb2JfaXJxLCBtYWwpOworCisJaWYgKG1hbC0+dHhfdmlydF9hZGRyKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmb2NwZGV2LT5kZXYsCisJCQkJICBNQUxfRFRfQUxJR04gKiBtYWxkYXRhLT5udW1fdHhfY2hhbnMsCisJCQkJICBtYWwtPnR4X3ZpcnRfYWRkciwgbWFsLT50eF9waHlzX2FkZHIpOworCisJaWYgKG1hbC0+cnhfdmlydF9hZGRyKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmb2NwZGV2LT5kZXYsCisJCQkJICBNQUxfRFRfQUxJR04gKiBtYWxkYXRhLT5udW1fcnhfY2hhbnMsCisJCQkJICBtYWwtPnJ4X3ZpcnRfYWRkciwgbWFsLT5yeF9waHlzX2FkZHIpOworCisJa2ZyZWUobWFsKTsKK30KKworLyogU3RydWN0dXJlIGZvciBhIGRldmljZSBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3Qgb2NwX2RldmljZV9pZCBtYWxfaWRzW10gPSB7CisJey52ZW5kb3IgPSBPQ1BfQU5ZX0lELC5mdW5jdGlvbiA9IE9DUF9GVU5DX01BTH0sCisJey52ZW5kb3IgPSBPQ1BfVkVORE9SX0lOVkFMSUR9Cit9OworCitzdGF0aWMgc3RydWN0IG9jcF9kcml2ZXIgbWFsX2RyaXZlciA9IHsKKwkubmFtZSA9ICJtYWwiLAorCS5pZF90YWJsZSA9IG1hbF9pZHMsCisKKwkucHJvYmUgPSBtYWxfcHJvYmUsCisJLnJlbW92ZSA9IG1hbF9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X21hbHModm9pZCkKK3sKKwlpbnQgcmM7CisKKwlyYyA9IG9jcF9yZWdpc3Rlcl9kcml2ZXIoJm1hbF9kcml2ZXIpOworCWlmIChyYyA8IDApIHsKKwkJb2NwX3VucmVnaXN0ZXJfZHJpdmVyKCZtYWxfZHJpdmVyKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X21hbHModm9pZCkKK3sKKwlvY3BfdW5yZWdpc3Rlcl9kcml2ZXIoJm1hbF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbml0X21hbHMpOworbW9kdWxlX2V4aXQoZXhpdF9tYWxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libV9lbWFjL2libV9lbWFjX21hbC5oIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfbWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ5ZjBkYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2libV9lbWFjL2libV9lbWFjX21hbC5oCkBAIC0wLDAgKzEsMTMxIEBACisjaWZuZGVmIF9JQk1fRU1BQ19NQUxfSAorI2RlZmluZSBfSUJNX0VNQUNfTUFMX0gKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2RlZmluZSBNQUxfRFRfQUxJR04JKDQwOTYpCS8qIEFsaWdubWVudCBmb3IgZWFjaCBjaGFubmVsJ3MgZGVzY3JpcHRvciB0YWJsZSAqLworCisjZGVmaW5lIE1BTF9DSEFOX01BU0soY2hhbikJKDB4ODAwMDAwMDAgPj4gKGNoYW4pKQorCisvKiBNQUwgQnVmZmVyIERlc2NyaXB0b3Igc3RydWN0dXJlICovCitzdHJ1Y3QgbWFsX2Rlc2NyaXB0b3IgeworCXVuc2lnbmVkIHNob3J0IGN0cmw7CS8qIE1BTCAvIENvbW1hYyBzdGF0dXMgY29udHJvbCBiaXRzICovCisJc2hvcnQgZGF0YV9sZW47CQkvKiBNYXggbGVuZ3RoIGlzIDRLLTEgKDEyIGJpdHMpICAgICAqLworCXVuc2lnbmVkIGNoYXIgKmRhdGFfcHRyOwkvKiBwb2ludGVyIHRvIGFjdHVhbCBkYXRhIGJ1ZmZlciAgICAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIHRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBNYWRNQUwgc3RhdHVzIGFuZCBjb250cm9sIHJlZ2lzdGVycy4gKi8KKy8qIE1BRE1BTCB0cmFuc21pdCBhbmQgcmVjZWl2ZSBzdGF0dXMvY29udHJvbCBiaXRzICAqLworI2RlZmluZSBNQUxfUlhfQ1RSTF9FTVBUWQkJMHg4MDAwCisjZGVmaW5lIE1BTF9SWF9DVFJMX1dSQVAJCTB4NDAwMAorI2RlZmluZSBNQUxfUlhfQ1RSTF9DTQkJCTB4MjAwMAorI2RlZmluZSBNQUxfUlhfQ1RSTF9MQVNUCQkweDEwMDAKKyNkZWZpbmUgTUFMX1JYX0NUUkxfRklSU1QJCTB4MDgwMAorI2RlZmluZSBNQUxfUlhfQ1RSTF9JTlRSCQkweDA0MDAKKworI2RlZmluZSBNQUxfVFhfQ1RSTF9SRUFEWQkJMHg4MDAwCisjZGVmaW5lIE1BTF9UWF9DVFJMX1dSQVAJCTB4NDAwMAorI2RlZmluZSBNQUxfVFhfQ1RSTF9DTQkJCTB4MjAwMAorI2RlZmluZSBNQUxfVFhfQ1RSTF9MQVNUCQkweDEwMDAKKyNkZWZpbmUgTUFMX1RYX0NUUkxfSU5UUgkJMHgwNDAwCisKK3N0cnVjdCBtYWxfY29tbWFjX29wcyB7CisJdm9pZCAoKnR4ZW9iKSAodm9pZCAqZGV2LCB1MzIgY2hhbm1hc2spOworCXZvaWQgKCp0eGRlKSAodm9pZCAqZGV2LCB1MzIgY2hhbm1hc2spOworCXZvaWQgKCpyeGVvYikgKHZvaWQgKmRldiwgdTMyIGNoYW5tYXNrKTsKKwl2b2lkICgqcnhkZSkgKHZvaWQgKmRldiwgdTMyIGNoYW5tYXNrKTsKK307CisKK3N0cnVjdCBtYWxfY29tbWFjIHsKKwlzdHJ1Y3QgbWFsX2NvbW1hY19vcHMgKm9wczsKKwl2b2lkICpkZXY7CisJdTMyIHR4X2NoYW5fbWFzaywgcnhfY2hhbl9tYXNrOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0cnVjdCBpYm1fb2NwX21hbCB7CisJaW50IGRjcmJhc2U7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNvbW1hYzsKKwl1MzIgdHhfY2hhbl9tYXNrLCByeF9jaGFuX21hc2s7CisKKwlkbWFfYWRkcl90IHR4X3BoeXNfYWRkcjsKKwlzdHJ1Y3QgbWFsX2Rlc2NyaXB0b3IgKnR4X3ZpcnRfYWRkcjsKKworCWRtYV9hZGRyX3QgcnhfcGh5c19hZGRyOworCXN0cnVjdCBtYWxfZGVzY3JpcHRvciAqcnhfdmlydF9hZGRyOworfTsKKworI2RlZmluZSBHRVRfTUFMX1NUQU5aQShiYXNlLGRjcm4pIFwKKwljYXNlIGJhc2U6IFwKKwkJeCA9IG1mZGNyKGRjcm4oYmFzZSkpOyBcCisJCWJyZWFrOworCisjZGVmaW5lIFNFVF9NQUxfU1RBTlpBKGJhc2UsZGNybiwgdmFsKSBcCisJY2FzZSBiYXNlOiBcCisJCW10ZGNyKGRjcm4oYmFzZSksICh2YWwpKTsgXAorCQlicmVhazsKKworI2RlZmluZSBHRVRfTUFMMF9TVEFOWkEoZGNybikgR0VUX01BTF9TVEFOWkEoRENSTl9NQUxfQkFTRSxkY3JuKQorI2RlZmluZSBTRVRfTUFMMF9TVEFOWkEoZGNybix2YWwpIFNFVF9NQUxfU1RBTlpBKERDUk5fTUFMX0JBU0UsZGNybix2YWwpCisKKyNpZmRlZiBEQ1JOX01BTDFfQkFTRQorI2RlZmluZSBHRVRfTUFMMV9TVEFOWkEoZGNybikgR0VUX01BTF9TVEFOWkEoRENSTl9NQUwxX0JBU0UsZGNybikKKyNkZWZpbmUgU0VUX01BTDFfU1RBTlpBKGRjcm4sdmFsKSBTRVRfTUFMX1NUQU5aQShEQ1JOX01BTDFfQkFTRSxkY3JuLHZhbCkKKyNlbHNlCQkJCS8qICEgRENSTl9NQUwxX0JBU0UgKi8KKyNkZWZpbmUgR0VUX01BTDFfU1RBTlpBKGRjcm4pCisjZGVmaW5lIFNFVF9NQUwxX1NUQU5aQShkY3JuLHZhbCkKKyNlbmRpZgorCisjZGVmaW5lIGdldF9tYWxfZGNybihtYWwsIGRjcm4pICh7IFwKKwl1MzIgeDsgXAorCXN3aXRjaCAoKG1hbCktPmRjcmJhc2UpIHsgXAorCQlHRVRfTUFMMF9TVEFOWkEoZGNybikgXAorCQlHRVRfTUFMMV9TVEFOWkEoZGNybikgXAorCWRlZmF1bHQ6IFwKKwkJeCA9IDA7IFwKKwkJQlVHKCk7IFwKKwl9IFwKK3g7IH0pCisKKyNkZWZpbmUgc2V0X21hbF9kY3JuKG1hbCwgZGNybiwgdmFsKSBkbyB7IFwKKwlzd2l0Y2ggKChtYWwpLT5kY3JiYXNlKSB7IFwKKwkJU0VUX01BTDBfU1RBTlpBKGRjcm4sdmFsKSBcCisJCVNFVF9NQUwxX1NUQU5aQShkY3JuLHZhbCkgXAorCWRlZmF1bHQ6IFwKKwkJQlVHKCk7IFwKKwl9IH0gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYWxfZW5hYmxlX3R4X2NoYW5uZWxzKHN0cnVjdCBpYm1fb2NwX21hbCAqbWFsLCB1MzIgY2hhbm1hc2spCit7CisJc2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxUWENBU1IsCisJCSAgICAgZ2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxUWENBU1IpIHwgY2hhbm1hc2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWFsX2Rpc2FibGVfdHhfY2hhbm5lbHMoc3RydWN0IGlibV9vY3BfbWFsICptYWwsCisJCQkJCSAgIHUzMiBjaGFubWFzaykKK3sKKwlzZXRfbWFsX2Rjcm4obWFsLCBEQ1JOX01BTFRYQ0FSUiwgY2hhbm1hc2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWFsX2VuYWJsZV9yeF9jaGFubmVscyhzdHJ1Y3QgaWJtX29jcF9tYWwgKm1hbCwgdTMyIGNoYW5tYXNrKQoreworCXNldF9tYWxfZGNybihtYWwsIERDUk5fTUFMUlhDQVNSLAorCQkgICAgIGdldF9tYWxfZGNybihtYWwsIERDUk5fTUFMUlhDQVNSKSB8IGNoYW5tYXNrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1hbF9kaXNhYmxlX3J4X2NoYW5uZWxzKHN0cnVjdCBpYm1fb2NwX21hbCAqbWFsLAorCQkJCQkgICB1MzIgY2hhbm1hc2spCit7CisJc2V0X21hbF9kY3JuKG1hbCwgRENSTl9NQUxSWENBUlIsIGNoYW5tYXNrKTsKK30KKworZXh0ZXJuIGludCBtYWxfcmVnaXN0ZXJfY29tbWFjKHN0cnVjdCBpYm1fb2NwX21hbCAqbWFsLAorCQkJICAgICAgIHN0cnVjdCBtYWxfY29tbWFjICpjb21tYWMpOworZXh0ZXJuIGludCBtYWxfdW5yZWdpc3Rlcl9jb21tYWMoc3RydWN0IGlibV9vY3BfbWFsICptYWwsCisJCQkJIHN0cnVjdCBtYWxfY29tbWFjICpjb21tYWMpOworCitleHRlcm4gaW50IG1hbF9zZXRfcmNicyhzdHJ1Y3QgaWJtX29jcF9tYWwgKm1hbCwgaW50IGNoYW5uZWwsCisJCQl1bnNpZ25lZCBsb25nIHNpemUpOworCisjZW5kaWYJCQkJLyogX0lCTV9FTUFDX01BTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19waHkuYyBiL2RyaXZlcnMvbmV0L2libV9lbWFjL2libV9lbWFjX3BoeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MjEzZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19waHkuYwpAQCAtMCwwICsxLDI5OCBAQAorLyoKKyAqIGlibV9vY3BfcGh5LmMKKyAqCisgKiBQSFkgZHJpdmVycyBmb3IgdGhlIGlibSBvY3AgZXRoZXJuZXQgZHJpdmVyLiBCb3Jyb3dlZAorICogZnJvbSBzdW5nZW1fcGh5LmMsIHRob3VnaCBJIG9ubHkga2VwdCB0aGUgZ2VuZXJpYyBNSUkKKyAqIGRyaXZlciBmb3Igbm93LgorICogCisgKiBUaGlzIGZpbGUgc2hvdWxkIGJlIHNoYXJlZCB3aXRoIG90aGVyIGRyaXZlcnMgb3IgZXZlbnR1YWxseQorICogbWVyZ2VkIGFzIHRoZSAibG93IGxldmVsIiBwYXJ0IG9mIG1paWxpYgorICogCisgKiAoYykgMjAwMywgQmVuamFtaW4gSGVycmVuc2NtaWR0IChiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmcpCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJpYm1fZW1hY19waHkuaCIKKworc3RhdGljIGludCByZXNldF9vbmVfbWlpX3BoeShzdHJ1Y3QgbWlpX3BoeSAqcGh5LCBpbnQgcGh5X2lkKQoreworCXUxNiB2YWw7CisJaW50IGxpbWl0ID0gMTAwMDA7CisKKwl2YWwgPSBfX3BoeV9yZWFkKHBoeSwgcGh5X2lkLCBNSUlfQk1DUik7CisJdmFsICY9IH5CTUNSX0lTT0xBVEU7CisJdmFsIHw9IEJNQ1JfUkVTRVQ7CisJX19waHlfd3JpdGUocGh5LCBwaHlfaWQsIE1JSV9CTUNSLCB2YWwpOworCisJdWRlbGF5KDEwMCk7CisKKwl3aGlsZSAobGltaXQtLSkgeworCQl2YWwgPSBfX3BoeV9yZWFkKHBoeSwgcGh5X2lkLCBNSUlfQk1DUik7CisJCWlmICgodmFsICYgQk1DUl9SRVNFVCkgPT0gMCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKwlpZiAoKHZhbCAmIEJNQ1JfSVNPTEFURSkgJiYgbGltaXQgPiAwKQorCQlfX3BoeV93cml0ZShwaHksIHBoeV9pZCwgTUlJX0JNQ1IsIHZhbCAmIH5CTUNSX0lTT0xBVEUpOworCisJcmV0dXJuIChsaW1pdCA8PSAwKTsKK30KKworc3RhdGljIGludCBjaXM4MjAxX2luaXQoc3RydWN0IG1paV9waHkgKnBoeSkKK3sKKwl1MTYgZXBjcjsKKworCWVwY3IgPSBwaHlfcmVhZChwaHksIE1JSV9DSVM4MjAxX0VQQ1IpOworCWVwY3IgJj0gfkVQQ1JfTU9ERV9NQVNLOworCisJc3dpdGNoIChwaHktPm1vZGUpIHsKKwljYXNlIFBIWV9NT0RFX1RCSToKKwkJZXBjciB8PSBFUENSX1RCSV9NT0RFOworCQlicmVhazsKKwljYXNlIFBIWV9NT0RFX1JUQkk6CisJCWVwY3IgfD0gRVBDUl9SVEJJX01PREU7CisJCWJyZWFrOworCWNhc2UgUEhZX01PREVfR01JSToKKwkJZXBjciB8PSBFUENSX0dNSUlfTU9ERTsKKwkJYnJlYWs7CisJY2FzZSBQSFlfTU9ERV9SR01JSToKKwlkZWZhdWx0OgorCQllcGNyIHw9IEVQQ1JfUkdNSUlfTU9ERTsKKwl9CisKKwlwaHlfd3JpdGUocGh5LCBNSUlfQ0lTODIwMV9FUENSLCBlcGNyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbm1paV9zZXR1cF9hbmVnKHN0cnVjdCBtaWlfcGh5ICpwaHksIHUzMiBhZHZlcnRpc2UpCit7CisJdTE2IGN0bCwgYWR2OworCisJcGh5LT5hdXRvbmVnID0gMTsKKwlwaHktPnNwZWVkID0gU1BFRURfMTA7CisJcGh5LT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwlwaHktPnBhdXNlID0gMDsKKwlwaHktPmFkdmVydGlzaW5nID0gYWR2ZXJ0aXNlOworCisJLyogU2V0dXAgc3RhbmRhcmQgYWR2ZXJ0aXNlICovCisJYWR2ID0gcGh5X3JlYWQocGh5LCBNSUlfQURWRVJUSVNFKTsKKwlhZHYgJj0gfihBRFZFUlRJU0VfQUxMIHwgQURWRVJUSVNFXzEwMEJBU0U0KTsKKwlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpCisJCWFkdiB8PSBBRFZFUlRJU0VfMTBIQUxGOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkKKwkJYWR2IHw9IEFEVkVSVElTRV8xMEZVTEw7CisJaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZikKKwkJYWR2IHw9IEFEVkVSVElTRV8xMDBIQUxGOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpCisJCWFkdiB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQURWRVJUSVNFLCBhZHYpOworCisJLyogU3RhcnQvUmVzdGFydCBhbmVnICovCisJY3RsID0gcGh5X3JlYWQocGh5LCBNSUlfQk1DUik7CisJY3RsIHw9IChCTUNSX0FORU5BQkxFIHwgQk1DUl9BTlJFU1RBUlQpOworCXBoeV93cml0ZShwaHksIE1JSV9CTUNSLCBjdGwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VubWlpX3NldHVwX2ZvcmNlZChzdHJ1Y3QgbWlpX3BoeSAqcGh5LCBpbnQgc3BlZWQsIGludCBmZCkKK3sKKwl1MTYgY3RsOworCisJcGh5LT5hdXRvbmVnID0gMDsKKwlwaHktPnNwZWVkID0gc3BlZWQ7CisJcGh5LT5kdXBsZXggPSBmZDsKKwlwaHktPnBhdXNlID0gMDsKKworCWN0bCA9IHBoeV9yZWFkKHBoeSwgTUlJX0JNQ1IpOworCWN0bCAmPSB+KEJNQ1JfRlVMTERQTFggfCBCTUNSX1NQRUVEMTAwIHwgQk1DUl9BTkVOQUJMRSk7CisKKwkvKiBGaXJzdCByZXNldCB0aGUgUEhZICovCisJcGh5X3dyaXRlKHBoeSwgTUlJX0JNQ1IsIGN0bCB8IEJNQ1JfUkVTRVQpOworCisJLyogU2VsZWN0IHNwZWVkICYgZHVwbGV4ICovCisJc3dpdGNoIChzcGVlZCkgeworCWNhc2UgU1BFRURfMTA6CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwOgorCQljdGwgfD0gQk1DUl9TUEVFRDEwMDsKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMDAwOgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoZmQgPT0gRFVQTEVYX0ZVTEwpCisJCWN0bCB8PSBCTUNSX0ZVTExEUExYOworCXBoeV93cml0ZShwaHksIE1JSV9CTUNSLCBjdGwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VubWlpX3BvbGxfbGluayhzdHJ1Y3QgbWlpX3BoeSAqcGh5KQoreworCXUxNiBzdGF0dXM7CisKKwkodm9pZClwaHlfcmVhZChwaHksIE1JSV9CTVNSKTsKKwlzdGF0dXMgPSBwaHlfcmVhZChwaHksIE1JSV9CTVNSKTsKKwlpZiAoKHN0YXR1cyAmIEJNU1JfTFNUQVRVUykgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKHBoeS0+YXV0b25lZyAmJiAhKHN0YXR1cyAmIEJNU1JfQU5FR0NPTVBMRVRFKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUJTUlJX0NJUzgyMDFfQUNTUgkweDFjCisjZGVmaW5lICBBQ1NSX0RVUExFWF9TVEFUVVMJMHgwMDIwCisjZGVmaW5lICBBQ1NSX1NQRUVEXzEwMDBCQVNFVAkweDAwMTAKKyNkZWZpbmUgIEFDU1JfU1BFRURfMTAwQkFTRVQJMHgwMDA4CisKK3N0YXRpYyBpbnQgY2lzODIwMV9yZWFkX2xpbmsoc3RydWN0IG1paV9waHkgKnBoeSkKK3sKKwl1MTYgYWNzcjsKKworCWlmIChwaHktPmF1dG9uZWcpIHsKKwkJYWNzciA9IHBoeV9yZWFkKHBoeSwgTUlJX0NJUzgyMDFfQUNTUik7CisKKwkJaWYgKGFjc3IgJiBBQ1NSX0RVUExFWF9TVEFUVVMpCisJCQlwaHktPmR1cGxleCA9IERVUExFWF9GVUxMOworCQllbHNlCisJCQlwaHktPmR1cGxleCA9IERVUExFWF9IQUxGOworCQlpZiAoYWNzciAmIEFDU1JfU1BFRURfMTAwMEJBU0VUKSB7CisJCQlwaHktPnNwZWVkID0gU1BFRURfMTAwMDsKKwkJfSBlbHNlIGlmIChhY3NyICYgQUNTUl9TUEVFRF8xMDBCQVNFVCkKKwkJCXBoeS0+c3BlZWQgPSBTUEVFRF8xMDA7CisJCWVsc2UKKwkJCXBoeS0+c3BlZWQgPSBTUEVFRF8xMDsKKwkJcGh5LT5wYXVzZSA9IDA7CisJfQorCS8qIE9uIG5vbi1hbmVnLCB3ZSBhc3N1bWUgd2hhdCB3ZSBwdXQgaW4gQk1DUiBpcyB0aGUgc3BlZWQsCisJICogdGhvdWdoIG1hZ2ljLWFuZWcgc2hvdWxkbid0IHByZXZlbnQgdGhpcyBjYXNlIGZyb20gb2NjdXJyaW5nCisJICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZW5taWlfcmVhZF9saW5rKHN0cnVjdCBtaWlfcGh5ICpwaHkpCit7CisJdTE2IGxwYTsKKworCWlmIChwaHktPmF1dG9uZWcpIHsKKwkJbHBhID0gcGh5X3JlYWQocGh5LCBNSUlfTFBBKSAmIHBoeV9yZWFkKHBoeSwgTUlJX0FEVkVSVElTRSk7CisKKwkJcGh5LT5zcGVlZCA9IFNQRUVEXzEwOworCQlwaHktPmR1cGxleCA9IERVUExFWF9IQUxGOworCQlwaHktPnBhdXNlID0gMDsKKworCQlpZiAobHBhICYgKExQQV8xMDBGVUxMIHwgTFBBXzEwMEhBTEYpKSB7CisJCQlwaHktPnNwZWVkID0gU1BFRURfMTAwOworCQkJaWYgKGxwYSAmIExQQV8xMDBGVUxMKQorCQkJCXBoeS0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCX0gZWxzZSBpZiAobHBhICYgTFBBXzEwRlVMTCkKKwkJCXBoeS0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJfQorCS8qIE9uIG5vbi1hbmVnLCB3ZSBhc3N1bWUgd2hhdCB3ZSBwdXQgaW4gQk1DUiBpcyB0aGUgc3BlZWQsCisJICogdGhvdWdoIG1hZ2ljLWFuZWcgc2hvdWxkbid0IHByZXZlbnQgdGhpcyBjYXNlIGZyb20gb2NjdXJyaW5nCisJICovCisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNSUlfQkFTSUNfRkVBVFVSRVMJKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwgXAorCQkJCSBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwgXAorCQkJCSBTVVBQT1JURURfQXV0b25lZyB8IFNVUFBPUlRFRF9UUCB8IFNVUFBPUlRFRF9NSUkpCisjZGVmaW5lIE1JSV9HQklUX0ZFQVRVUkVTCShNSUlfQkFTSUNfRkVBVFVSRVMgfCBcCisJCQkJIFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCkKKworLyogQ0lTODIwMSBwaHkgb3BzICovCitzdGF0aWMgc3RydWN0IG1paV9waHlfb3BzIGNpczgyMDFfcGh5X29wcyA9IHsKKwlpbml0OmNpczgyMDFfaW5pdCwKKwlzZXR1cF9hbmVnOmdlbm1paV9zZXR1cF9hbmVnLAorCXNldHVwX2ZvcmNlZDpnZW5taWlfc2V0dXBfZm9yY2VkLAorCXBvbGxfbGluazpnZW5taWlfcG9sbF9saW5rLAorCXJlYWRfbGluazpjaXM4MjAxX3JlYWRfbGluaworfTsKKworLyogR2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBmb3IgbW9zdCAxMC8xMDAgUEhZcyAqLworc3RhdGljIHN0cnVjdCBtaWlfcGh5X29wcyBnZW5lcmljX3BoeV9vcHMgPSB7CisJc2V0dXBfYW5lZzpnZW5taWlfc2V0dXBfYW5lZywKKwlzZXR1cF9mb3JjZWQ6Z2VubWlpX3NldHVwX2ZvcmNlZCwKKwlwb2xsX2xpbms6Z2VubWlpX3BvbGxfbGluaywKKwlyZWFkX2xpbms6Z2VubWlpX3JlYWRfbGluaworfTsKKworc3RhdGljIHN0cnVjdCBtaWlfcGh5X2RlZiBjaXM4MjAxX3BoeV9kZWYgPSB7CisJcGh5X2lkOjB4MDAwZmM0MTAsCisJcGh5X2lkX21hc2s6MHgwMDBmZmZmMCwKKwluYW1lOiJDSVM4MjAxIEdpZ2FiaXQgRXRoZXJuZXQiLAorCWZlYXR1cmVzOk1JSV9HQklUX0ZFQVRVUkVTLAorCW1hZ2ljX2FuZWc6MCwKKwlvcHM6JmNpczgyMDFfcGh5X29wcworfTsKKworc3RhdGljIHN0cnVjdCBtaWlfcGh5X2RlZiBnZW5taWlfcGh5X2RlZiA9IHsKKwlwaHlfaWQ6MHgwMDAwMDAwMCwKKwlwaHlfaWRfbWFzazoweDAwMDAwMDAwLAorCW5hbWU6IkdlbmVyaWMgTUlJIiwKKwlmZWF0dXJlczpNSUlfQkFTSUNfRkVBVFVSRVMsCisJbWFnaWNfYW5lZzowLAorCW9wczomZ2VuZXJpY19waHlfb3BzCit9OworCitzdGF0aWMgc3RydWN0IG1paV9waHlfZGVmICptaWlfcGh5X3RhYmxlW10gPSB7CisJJmNpczgyMDFfcGh5X2RlZiwKKwkmZ2VubWlpX3BoeV9kZWYsCisJTlVMTAorfTsKKworaW50IG1paV9waHlfcHJvYmUoc3RydWN0IG1paV9waHkgKnBoeSwgaW50IG1paV9pZCkKK3sKKwlpbnQgcmM7CisJdTMyIGlkOworCXN0cnVjdCBtaWlfcGh5X2RlZiAqZGVmOworCWludCBpOworCisJcGh5LT5hdXRvbmVnID0gMDsKKwlwaHktPmFkdmVydGlzaW5nID0gMDsKKwlwaHktPm1paV9pZCA9IG1paV9pZDsKKwlwaHktPnNwZWVkID0gMDsKKwlwaHktPmR1cGxleCA9IDA7CisJcGh5LT5wYXVzZSA9IDA7CisKKwkvKiBUYWtlIFBIWSBvdXQgb2YgaXNsb2F0ZSBtb2RlIGFuZCByZXNldCBpdC4gKi8KKwlyYyA9IHJlc2V0X29uZV9taWlfcGh5KHBoeSwgbWlpX2lkKTsKKwlpZiAocmMpCisJCXJldHVybiAtRU5PREVWOworCisJLyogUmVhZCBJRCBhbmQgZmluZCBtYXRjaGluZyBlbnRyeSAqLworCWlkID0gKHBoeV9yZWFkKHBoeSwgTUlJX1BIWVNJRDEpIDw8IDE2IHwgcGh5X3JlYWQocGh5LCBNSUlfUEhZU0lEMikpCisJICAgICYgMHhmZmZmZmZmMDsKKwlmb3IgKGkgPSAwOyAoZGVmID0gbWlpX3BoeV90YWJsZVtpXSkgIT0gTlVMTDsgaSsrKQorCQlpZiAoKGlkICYgZGVmLT5waHlfaWRfbWFzaykgPT0gZGVmLT5waHlfaWQpCisJCQlicmVhazsKKwkvKiBTaG91bGQgbmV2ZXIgYmUgTlVMTCAod2UgaGF2ZSBhIGdlbmVyaWMgZW50cnkpLCBidXQuLi4gKi8KKwlpZiAoZGVmID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJcGh5LT5kZWYgPSBkZWY7CisKKwkvKiBTZXR1cCBkZWZhdWx0IGFkdmVydGlzaW5nICovCisJcGh5LT5hZHZlcnRpc2luZyA9IGRlZi0+ZmVhdHVyZXM7CisKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfcGh5LmggYi9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19waHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWFmYmVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfcGh5LmgKQEAgLTAsMCArMSwxMzcgQEAKKworLyoKKyAqIGlibV9lbWFjX3BoeS5oCisgKgorICoKKyAqICAgICAgQmVuamFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgorICogICAgICBGZWJydWFyeSAyMDAzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgICBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCisgKiAgTk8gIEVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFICAgIExJQUJMRSBGT1IgQU5ZICAgRElSRUNULCAgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoKKyAqIFRoaXMgZmlsZSBiYXNpY2FsbHkgZHVwbGljYXRlcyBzdW5nZW1fcGh5LntjLGh9IHdpdGggZGlmZmVyZW50IFBIWXMKKyAqIHN1cHBvcnRlZC4gSSdtIGxvb2tpbmcgaW50byBtZXJnaW5nIHRoYXQgaW4gYSBzaW5nbGUgbWlpIGxheWVyIG1vcmUKKyAqIGZsZXhpYmxlIHRoYW4gbWlpLmMgCisgKi8KKworI2lmbmRlZiBfSUJNX0VNQUNfUEhZX0hfCisjZGVmaW5lIF9JQk1fRU1BQ19QSFlfSF8KKworLyoKKyAqIFBIWSBtb2RlIHNldHRpbmdzCisgKiBVc2VkIGZvciBtdWx0aS1tb2RlIGNhcGFibGUgUEhZcworICovCisjZGVmaW5lIFBIWV9NT0RFX05BCTAKKyNkZWZpbmUgUEhZX01PREVfTUlJCTEKKyNkZWZpbmUgUEhZX01PREVfUk1JSQkyCisjZGVmaW5lIFBIWV9NT0RFX1NNSUkJMworI2RlZmluZSBQSFlfTU9ERV9SR01JSQk0CisjZGVmaW5lIFBIWV9NT0RFX1RCSQk1CisjZGVmaW5lIFBIWV9NT0RFX0dNSUkJNgorI2RlZmluZSBQSFlfTU9ERV9SVEJJCTcKKyNkZWZpbmUgUEhZX01PREVfU0dNSUkJOAorCisvKgorICogUEhZIHNwZWNpZmljIHJlZ2lzdGVycy92YWx1ZXMKKyAqLworCisvKiBDSVM4MjAxICovCisjZGVmaW5lIE1JSV9DSVM4MjAxX0VQQ1IJMHgxNworI2RlZmluZSBFUENSX01PREVfTUFTSwkJMHgzMDAwCisjZGVmaW5lIEVQQ1JfR01JSV9NT0RFCQkweDAwMDAKKyNkZWZpbmUgRVBDUl9SR01JSV9NT0RFCQkweDEwMDAKKyNkZWZpbmUgRVBDUl9UQklfTU9ERQkJMHgyMDAwCisjZGVmaW5lIEVQQ1JfUlRCSV9NT0RFCQkweDMwMDAKKworc3RydWN0IG1paV9waHk7CisKKy8qIE9wZXJhdGlvbnMgc3VwcG9ydGVkIGJ5IGFueSBraW5kIG9mIFBIWSAqLworc3RydWN0IG1paV9waHlfb3BzIHsKKwlpbnQgKCppbml0KSAoc3RydWN0IG1paV9waHkgKiBwaHkpOworCWludCAoKnN1c3BlbmQpIChzdHJ1Y3QgbWlpX3BoeSAqIHBoeSwgaW50IHdvbF9vcHRpb25zKTsKKwlpbnQgKCpzZXR1cF9hbmVnKSAoc3RydWN0IG1paV9waHkgKiBwaHksIHUzMiBhZHZlcnRpc2UpOworCWludCAoKnNldHVwX2ZvcmNlZCkgKHN0cnVjdCBtaWlfcGh5ICogcGh5LCBpbnQgc3BlZWQsIGludCBmZCk7CisJaW50ICgqcG9sbF9saW5rKSAoc3RydWN0IG1paV9waHkgKiBwaHkpOworCWludCAoKnJlYWRfbGluaykgKHN0cnVjdCBtaWlfcGh5ICogcGh5KTsKK307CisKKy8qIFN0cnVjdHVyZSB1c2VkIHRvIHN0YXRpY2FsbHkgZGVmaW5lIGFuIG1paS9naWkgYmFzZWQgUEhZICovCitzdHJ1Y3QgbWlpX3BoeV9kZWYgeworCXUzMiBwaHlfaWQ7CQkvKiBDb25jYXRlbmF0ZWQgSUQxIDw8IDE2IHwgSUQyICovCisJdTMyIHBoeV9pZF9tYXNrOwkvKiBTaWduaWZpY2FudCBiaXRzICovCisJdTMyIGZlYXR1cmVzOwkJLyogRXRodG9vbCBTVVBQT1JURURfKiBkZWZpbmVzICovCisJaW50IG1hZ2ljX2FuZWc7CQkvKiBBdXRvbmVnIGRvZXMgYWxsIHNwZWVkIHRlc3QgZm9yIHVzICovCisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBzdHJ1Y3QgbWlpX3BoeV9vcHMgKm9wczsKK307CisKKy8qIEFuIGluc3RhbmNlIG9mIGEgUEhZLCBwYXJ0aWFsbHkgYm9ycm93ZWQgZnJvbSBtaWlfaWZfaW5mbyAqLworc3RydWN0IG1paV9waHkgeworCXN0cnVjdCBtaWlfcGh5X2RlZiAqZGVmOworCWludCBhZHZlcnRpc2luZzsKKwlpbnQgbWlpX2lkOworCisJLyogMTogYXV0b25lZyBlbmFibGVkLCAwOiBkaXNhYmxlZCAqLworCWludCBhdXRvbmVnOworCisJLyogZm9yY2VkIHNwZWVkICYgZHVwbGV4IChubyBhdXRvbmVnKQorCSAqIHBhcnRuZXIgc3BlZWQgJiBkdXBsZXggJiBwYXVzZSAoYXV0b25lZykKKwkgKi8KKwlpbnQgc3BlZWQ7CisJaW50IGR1cGxleDsKKwlpbnQgcGF1c2U7CisKKwkvKiBQSFkgbW9kZSAtIGlmIG5lZWRlZCAqLworCWludCBtb2RlOworCisJLyogUHJvdmlkZWQgYnkgaG9zdCBjaGlwICovCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgKCptZGlvX3JlYWQpIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgaW50IG1paV9pZCwgaW50IHJlZyk7CisJdm9pZCAoKm1kaW9fd3JpdGUpIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgaW50IG1paV9pZCwgaW50IHJlZywKKwkJCSAgICBpbnQgdmFsKTsKK307CisKKy8qIFBhc3MgaW4gYSBzdHJ1Y3QgbWlpX3BoeSB3aXRoIGRldiwgbWRpb19yZWFkIGFuZCBtZGlvX3dyaXRlCisgKiBmaWxsZWQsIHRoZSByZW1haW5pbmcgZmllbGRzIHdpbGwgYmUgZmlsbGVkIG9uIHJldHVybgorICovCitleHRlcm4gaW50IG1paV9waHlfcHJvYmUoc3RydWN0IG1paV9waHkgKnBoeSwgaW50IG1paV9pZCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fcGh5X3JlYWQoc3RydWN0IG1paV9waHkgKnBoeSwgaW50IGlkLCBpbnQgcmVnKQoreworCXJldHVybiBwaHktPm1kaW9fcmVhZChwaHktPmRldiwgaWQsIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3BoeV93cml0ZShzdHJ1Y3QgbWlpX3BoeSAqcGh5LCBpbnQgaWQsIGludCByZWcsIGludCB2YWwpCit7CisJcGh5LT5tZGlvX3dyaXRlKHBoeS0+ZGV2LCBpZCwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwaHlfcmVhZChzdHJ1Y3QgbWlpX3BoeSAqcGh5LCBpbnQgcmVnKQoreworCXJldHVybiBwaHktPm1kaW9fcmVhZChwaHktPmRldiwgcGh5LT5taWlfaWQsIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwaHlfd3JpdGUoc3RydWN0IG1paV9waHkgKnBoeSwgaW50IHJlZywgaW50IHZhbCkKK3sKKwlwaHktPm1kaW9fd3JpdGUocGh5LT5kZXYsIHBoeS0+bWlpX2lkLCByZWcsIHZhbCk7Cit9CisKKyNlbmRpZgkJCQkvKiBfSUJNX0VNQUNfUEhZX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY19yZ21paS5oIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfcmdtaWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWYxODhmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfcmdtaWkuaApAQCAtMCwwICsxLDY1IEBACisvKgorICogRGVmaW5lcyBmb3IgdGhlIElCTSBSR01JSSBicmlkZ2UKKyAqCisgKiBCYXNlZCBvbiBvY3Bfem1paS5oL2libV9lbWFjX3ptaWkuaAorICogQXJtaW4gS3VzdGVyIGFrdXN0ZXJAbXZpc3RhLmNvbQorICoKKyAqIENvcHlyaWdodCAyMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqIE1hdHQgUG9ydGVyIDxtcG9ydGVyQGtlcm5lbC5jcmFzaGluZy5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9JQk1fRU1BQ19SR01JSV9IXworI2RlZmluZSBfSUJNX0VNQUNfUkdNSUlfSF8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisvKiBSR01JSSBicmlkZ2UgKi8KK3R5cGVkZWYgc3RydWN0IHJnbWlpX3JlZ3MgeworCXUzMiBmZXI7CQkvKiBGdW5jdGlvbiBlbmFibGUgcmVnaXN0ZXIgKi8KKwl1MzIgc3NyOwkJLyogU3BlZWQgc2VsZWN0IHJlZ2lzdGVyICovCit9IHJnbWlpX3Q7CisKKyNkZWZpbmUgUkdNSUlfSU5QVVRTCQkJNAorCisvKiBSR01JSSBkZXZpY2UgKi8KK3N0cnVjdCBpYm1fb2NwX3JnbWlpIHsKKwlzdHJ1Y3QgcmdtaWlfcmVncyAqYmFzZTsKKwlpbnQgbW9kZVtSR01JSV9JTlBVVFNdOworCWludCB1c2VyczsJCS8qIG51bWJlciBvZiBFTUFDcyB1c2luZyB0aGlzIFJHTUlJIGJyaWRnZSAqLworfTsKKworLyogRnVjdGlvbmFsIEVuYWJsZSBSZWcgKi8KKyNkZWZpbmUgUkdNSUlfRkVSX01BU0soeCkJCSgweDAwMDAwMDA3IDw8ICg0KngpKQorI2RlZmluZSBSR01JSV9SVEJJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBSR01JSV9SR01JSQkJCTB4MDAwMDAwMDUKKyNkZWZpbmUgUkdNSUlfVEJJICAJCQkweDAwMDAwMDA2CisjZGVmaW5lIFJHTUlJX0dNSUkgCQkJMHgwMDAwMDAwNworCisvKiBTcGVlZCBTZWxlY3Rpb24gcmVnICovCisKKyNkZWZpbmUgUkdNSUlfU1AyXzEwMAkweDAwMDAwMDAyCisjZGVmaW5lIFJHTUlJX1NQMl8xMDAwCTB4MDAwMDAwMDQKKyNkZWZpbmUgUkdNSUlfU1AzXzEwMAkweDAwMDAwMjAwCisjZGVmaW5lIFJHTUlJX1NQM18xMDAwCTB4MDAwMDA0MDAKKworI2RlZmluZSBSR01JSV9NSUkyX1NQRE1BU0sJIDB4MDAwMDAwMDcKKyNkZWZpbmUgUkdNSUlfTUlJM19TUERNQVNLCSAweDAwMDAwNzAwCisKKyNkZWZpbmUgUkdNSUlfTUlJMl8xMDBNQgkgUkdNSUlfU1AyXzEwMCAmIH5SR01JSV9TUDJfMTAwMAorI2RlZmluZSBSR01JSV9NSUkyXzEwMDBNQiAJIFJHTUlJX1NQMl8xMDAwICYgflJHTUlJX1NQMl8xMDAKKyNkZWZpbmUgUkdNSUlfTUlJMl8xME1CCQkgfihSR01JSV9TUDJfMTAwIHwgUkdNSUlfU1AyXzEwMDApCisjZGVmaW5lIFJHTUlJX01JSTNfMTAwTUIJIFJHTUlJX1NQM18xMDAgJiB+UkdNSUlfU1AzXzEwMDAKKyNkZWZpbmUgUkdNSUlfTUlJM18xMDAwTUIgCSBSR01JSV9TUDNfMTAwMCAmIH5SR01JSV9TUDNfMTAwCisjZGVmaW5lIFJHTUlJX01JSTNfMTBNQgkJIH4oUkdNSUlfU1AzXzEwMCB8IFJHTUlJX1NQM18xMDAwKQorCisjZGVmaW5lIFJUQkkJCTAKKyNkZWZpbmUgUkdNSUkJCTEKKyNkZWZpbmUgVEJJCQkyCisjZGVmaW5lIEdNSUkJCTMKKworI2VuZGlmCQkJCS8qIF9JQk1fRU1BQ19SR01JSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfdGFoLmggYi9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY190YWguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2ZjNjk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaWJtX2VtYWMvaWJtX2VtYWNfdGFoLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIERlZmluZXMgZm9yIHRoZSBJQk0gVEFICisgKgorICogQ29weXJpZ2h0IDIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogTWF0dCBQb3J0ZXIgPG1wb3J0ZXJAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0lCTV9FTUFDX1RBSF9ICisjZGVmaW5lIF9JQk1fRU1BQ19UQUhfSAorCisvKiBUQUggKi8KK3R5cGVkZWYgc3RydWN0IHRhaF9yZWdzIHsKKwl1MzIgdGFoX3JldmlkOworCXUzMiBwYWRbM107CisJdTMyIHRhaF9tcjsKKwl1MzIgdGFoX3NzcjA7CisJdTMyIHRhaF9zc3IxOworCXUzMiB0YWhfc3NyMjsKKwl1MzIgdGFoX3NzcjM7CisJdTMyIHRhaF9zc3I0OworCXUzMiB0YWhfc3NyNTsKKwl1MzIgdGFoX3RzcjsKK30gdGFoX3Q7CisKKy8qIFRBSCBlbmdpbmUgKi8KKyNkZWZpbmUgVEFIX01SX0NWUgkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgVEFIX01SX1NSCQkJMHg0MDAwMDAwMAorI2RlZmluZSBUQUhfTVJfU1RfMjU2CQkJMHgwMTAwMDAwMAorI2RlZmluZSBUQUhfTVJfU1RfNTEyCQkJMHgwMjAwMDAwMAorI2RlZmluZSBUQUhfTVJfU1RfNzY4CQkJMHgwMzAwMDAwMAorI2RlZmluZSBUQUhfTVJfU1RfMTAyNAkJCTB4MDQwMDAwMDAKKyNkZWZpbmUgVEFIX01SX1NUXzEyODAJCQkweDA1MDAwMDAwCisjZGVmaW5lIFRBSF9NUl9TVF8xNTM2CQkJMHgwNjAwMDAwMAorI2RlZmluZSBUQUhfTVJfVEZTXzE2S0IJCQkweDAwMDAwMDAwCisjZGVmaW5lIFRBSF9NUl9URlNfMktCCQkJMHgwMDIwMDAwMAorI2RlZmluZSBUQUhfTVJfVEZTXzRLQgkJCTB4MDA0MDAwMDAKKyNkZWZpbmUgVEFIX01SX1RGU182S0IJCQkweDAwNjAwMDAwCisjZGVmaW5lIFRBSF9NUl9URlNfOEtCCQkJMHgwMDgwMDAwMAorI2RlZmluZSBUQUhfTVJfVEZTXzEwS0IJCQkweDAwYTAwMDAwCisjZGVmaW5lIFRBSF9NUl9EVEZQCQkJMHgwMDEwMDAwMAorI2RlZmluZSBUQUhfTVJfRElHCQkJMHgwMDA4MDAwMAorCisjZW5kaWYJCQkJLyogX0lCTV9FTUFDX1RBSF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY196bWlpLmggYi9kcml2ZXJzL25ldC9pYm1fZW1hYy9pYm1fZW1hY196bWlpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2Y2QyYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2libV9lbWFjL2libV9lbWFjX3ptaWkuaApAQCAtMCwwICsxLDkzIEBACisvKgorICogb2NwX3ptaWkuaAorICoKKyAqIERlZmluZXMgZm9yIHRoZSBJQk0gWk1JSSBicmlkZ2UKKyAqCisgKiAgICAgIEFybWluIEt1c3RlciBha3VzdGVyQG12aXN0YS5jb20KKyAqICAgICAgRGVjLCAyMDAxCisgKgorICogQ29weXJpZ2h0IDIwMDEgTW9udGFWaXN0YSBTb2Z0YXJlIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0lCTV9FTUFDX1pNSUlfSF8KKyNkZWZpbmUgX0lCTV9FTUFDX1pNSUlfSF8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisvKiBaTUlJIGJyaWRnZSByZWdpc3RlcnMgKi8KK3N0cnVjdCB6bWlpX3JlZ3MgeworCXUzMiBmZXI7CQkvKiBGdW5jdGlvbiBlbmFibGUgcmVnICovCisJdTMyIHNzcjsJCS8qIFNwZWVkIHNlbGVjdCByZWcgKi8KKwl1MzIgc21paXJzOwkJLyogU01JSSBzdGF0dXMgcmVnICovCit9OworCisjZGVmaW5lIFpNSUlfSU5QVVRTCTQKKworLyogWk1JSSBkZXZpY2UgKi8KK3N0cnVjdCBpYm1fb2NwX3ptaWkgeworCXN0cnVjdCB6bWlpX3JlZ3MgKmJhc2U7CisJaW50IG1vZGVbWk1JSV9JTlBVVFNdOworCWludCB1c2VyczsJCS8qIG51bWJlciBvZiBFTUFDcyB1c2luZyB0aGlzIFpNSUkgYnJpZGdlICovCit9OworCisvKiBGdWN0aW9uYWwgRW5hYmxlIFJlZyAqLworCisjZGVmaW5lIFpNSUlfRkVSX01BU0soeCkJKDB4ZjAwMDAwMDAgPj4gKDQqeCkpCisKKyNkZWZpbmUgWk1JSV9NREkwCTB4ODAwMDAwMDAKKyNkZWZpbmUgWk1JSV9TTUlJMAkweDQwMDAwMDAwCisjZGVmaW5lIFpNSUlfUk1JSTAJMHgyMDAwMDAwMAorI2RlZmluZSBaTUlJX01JSTAJMHgxMDAwMDAwMAorI2RlZmluZSBaTUlJX01ESTEJMHgwODAwMDAwMAorI2RlZmluZSBaTUlJX1NNSUkxCTB4MDQwMDAwMDAKKyNkZWZpbmUgWk1JSV9STUlJMQkweDAyMDAwMDAwCisjZGVmaW5lIFpNSUlfTUlJMQkweDAxMDAwMDAwCisjZGVmaW5lIFpNSUlfTURJMgkweDAwODAwMDAwCisjZGVmaW5lIFpNSUlfU01JSTIJMHgwMDQwMDAwMAorI2RlZmluZSBaTUlJX1JNSUkyCTB4MDAyMDAwMDAKKyNkZWZpbmUgWk1JSV9NSUkyCTB4MDAxMDAwMDAKKyNkZWZpbmUgWk1JSV9NREkzCTB4MDAwODAwMDAKKyNkZWZpbmUgWk1JSV9TTUlJMwkweDAwMDQwMDAwCisjZGVmaW5lIFpNSUlfUk1JSTMJMHgwMDAyMDAwMAorI2RlZmluZSBaTUlJX01JSTMJMHgwMDAxMDAwMAorCisvKiBTcGVlZCBTZWxlY3Rpb24gcmVnICovCisKKyNkZWZpbmUgWk1JSV9TQ0kwCTB4NDAwMDAwMDAKKyNkZWZpbmUgWk1JSV9GU1MwCTB4MjAwMDAwMDAKKyNkZWZpbmUgWk1JSV9TUDAJMHgxMDAwMDAwMAorI2RlZmluZSBaTUlJX1NDSTEJMHgwNDAwMDAwMAorI2RlZmluZSBaTUlJX0ZTUzEJMHgwMjAwMDAwMAorI2RlZmluZSBaTUlJX1NQMQkweDAxMDAwMDAwCisjZGVmaW5lIFpNSUlfU0NJMgkweDAwNDAwMDAwCisjZGVmaW5lIFpNSUlfRlNTMgkweDAwMjAwMDAwCisjZGVmaW5lIFpNSUlfU1AyCTB4MDAxMDAwMDAKKyNkZWZpbmUgWk1JSV9TQ0kzCTB4MDAwNDAwMDAKKyNkZWZpbmUgWk1JSV9GU1MzCTB4MDAwMjAwMDAKKyNkZWZpbmUgWk1JSV9TUDMJMHgwMDAxMDAwMAorCisjZGVmaW5lIFpNSUlfTUlJMF8xMDBNQglaTUlJX1NQMAorI2RlZmluZSBaTUlJX01JSTBfMTBNQgl+Wk1JSV9TUDAKKyNkZWZpbmUgWk1JSV9NSUkxXzEwME1CCVpNSUlfU1AxCisjZGVmaW5lIFpNSUlfTUlJMV8xME1CCX5aTUlJX1NQMQorI2RlZmluZSBaTUlJX01JSTJfMTAwTUIJWk1JSV9TUDIKKyNkZWZpbmUgWk1JSV9NSUkyXzEwTUIJflpNSUlfU1AyCisjZGVmaW5lIFpNSUlfTUlJM18xMDBNQglaTUlJX1NQMworI2RlZmluZSBaTUlJX01JSTNfMTBNQgl+Wk1JSV9TUDMKKworLyogU01JSSBTdGF0dXMgcmVnICovCisKKyNkZWZpbmUgWk1JSV9TVFMwIDB4RkYwMDAwMDAJLyogRU1BQzAgc21paSBzdGF0dXMgbWFzayAqLworI2RlZmluZSBaTUlJX1NUUzEgMHgwMEZGMDAwMAkvKiBFTUFDMSBzbWlpIHN0YXR1cyBtYXNrICovCisKKyNkZWZpbmUgU01JSQkwCisjZGVmaW5lIFJNSUkJMQorI2RlZmluZSBNSUkJMgorI2RlZmluZSBNREkJMworCisjZW5kaWYJCQkJLyogX0lCTV9FTUFDX1pNSUlfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libWxhbmEuYyBiL2RyaXZlcnMvbmV0L2libWxhbmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWFkOTA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaWJtbGFuYS5jCkBAIC0wLDAgKzEsMTA4MCBAQAorLyogCituZXQtMy1kcml2ZXIgZm9yIHRoZSBJQk0gTEFOIEFkYXB0ZXIvQQorCitUaGlzIGlzIGFuIGV4dGVuc2lvbiB0byB0aGUgTGludXggb3BlcmF0aW5nIHN5c3RlbSwgYW5kIGlzIGNvdmVyZWQgYnkgdGhlCitzYW1lIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoYXQgY292ZXJzIHRoYXQgd29yay4KKworQ29weXJpZ2h0IDE5OTkgYnkgQWxmcmVkIEFybm9sZCAoYWxmcmVkQGNjYWMucnd0aC1hYWNoZW4uZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGZyZWQuYXJub2xkQGxhbmNvbS5kZSkKKworVGhpcyBkcml2ZXIgaXMgYmFzZWQgYm90aCBvbiB0aGUgU0tfTUNBIGRyaXZlciwgd2hpY2ggaXMgaXRzZWxmIGJhc2VkIG9uIHRoZQorU0tfRzE2IGFuZCAzQzUyMyBkcml2ZXIuCisKK3BhcGVyIHNvdXJjZXM6CisgICdQQyBIYXJkd2FyZTogQXVmYmF1LCBGdW5rdGlvbnN3ZWlzZSwgUHJvZ3JhbW1pZXJ1bmcnIGJ5IAorICBIYW5zLVBldGVyIE1lc3NtZXIgZm9yIHRoZSBiYXNpYyBNaWNyb2NoYW5uZWwgc3R1ZmYKKyAgCisgICdMaW51eCBHZXJhZXRldHJlaWJlcicgYnkgQWxsZXNhbmRybyBSdWJpbmksIEthbGxlIERhbGhlaW1lcgorICBmb3IgaGVscCBvbiBFdGhlcm5ldCBkcml2ZXIgcHJvZ3JhbW1pbmcKKworICAnRFA4MzkzNENWVUwtMjAvMjUgTUh6IFNPTklDLVQgRXRoZXJuZXQgQ29udHJvbGxlciBEYXRhc2hlZXQnIGJ5IE5hdGlvbmFsCisgIFNlbWljb25kdWN0b3IgZm9yIGluZm8gb24gdGhlIE1BQyBjaGlwCisKKyAgJ0xBTiBUZWNobmljYWwgUmVmZXJlbmNlIEV0aGVybmV0IEFkYXB0ZXIgSW50ZXJmYWNlIFZlcnNpb24gMSBSZWxlYXNlIDEuMAorICAgRG9jdW1lbnQgTnVtYmVyIFNDMzAtMzY2MS0wMCcgYnkgSUJNIGZvciBpbmZvIG9uIHRoZSBhZGFwdGVyIGl0c2VsZgorCisgIEFsc28gc2VlIGh0dHA6Ly93d3cubmF0c2VtaS5jb20vCisKK3NwZWNpYWwgYWNrbm93bGVkZ2VtZW50cyB0bzoKKyAgLSBCb2IgRWFnZXIgZm9yIGhlbHBpbmcgbWUgb3V0IHdpdGggZG9jdW1lbnRhdGlvbiBmcm9tIElCTQorICAtIEppbSBTaG9ybmV5IGZvciBoaXMgZW5kbGVzcyBwYXRpZW5jZSB3aXRoIG1lIHdoaWxlIEkgd2FzIHVzaW5nIAorICAgIGhpbSBhcyBhIGJldGEgdGVzdGVyIHRvIHRyYWNlIGRvd24gdGhlIGFkZHJlc3MgZmlsdGVyIGJ1ZyA7LSkKKworICBNaXNzaW5nIHRoaW5nczoKKworICAtPiBzZXQgZGVidWcgbGV2ZWwgdmlhIGlvY3RsIGluc3RlYWQgb2YgY29tcGlsZS10aW1lIHN3aXRjaGVzCisgIC0+IEkgZGlkbid0IGZvbGxvdyB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhlIDIuMS54IGtlcm5lbHMsIHNvIG15CisgICAgIGFzc3VtcHRpb25zIGFib3V0IHdoaWNoIHRoaW5ncyBjaGFuZ2VkIHdpdGggd2hpY2gga2VybmVsIHZlcnNpb24gCisgICAgIGFyZSBwcm9iYWJseSBub25zZW5zZQorCitIaXN0b3J5OgorICBOb3YgNnRoLCAxOTk5CisgIAlzdGFydHVwIGZyb20gU0tfTUNBIGRyaXZlcgorICBEZWMgNnRoLCAxOTk5CisJZmluYWxseSBnb3QgZG9jcyBhYm91dCB0aGUgY2FyZC4gIEEgYmlnIHRoYW5rIHlvdSB0byBCb2IgRWFnZXIhCisgIERlYyAxMnRoLCAxOTk5CisJZmlyc3QgcGFja2V0IHJlY2VpdmVkCisgIERlYyAxM3RoLCAxOTk5CisJcmVjdiBxdWV1ZSBkb25lLCB0Y3BkdW1wIHdvcmtzCisgIERlYyAxNXRoLCAxOTk5CisJdHJhbnNtaXNzaW9uIHBhcnQgd29ya3MKKyAgRGVjIDI4dGgsIDE5OTkKKwlhZGRlZCB1c2FnZSBvZiB0aGUgaXNhX2Z1bmN0aW9ucyBmb3IgTGludXggMi4zIC4gIFRoaW5ncyBzaG91bGQKKwlzdGlsbCB3b3JrIHdpdGggMi4wLnguLi4uCisgIEphbiAyOHRoLCAyMDAwCisJaW4gTGludXggMi4yLjEzLCB0aGUgdmVyc2lvbi5oIGZpbGUgbXlzdGVyaW91c2x5IGRpZG4ndCBnZXQKKwlpbmNsdWRlZC4gIEFkZGVkIGEgd29ya2Fyb3VuZCBmb3IgdGhpcy4gIEZ1dGhlcm1vcmUsIGl0IG5vdworCW5vdCBvbmx5IGNvbXBpbGVzIGFzIGEgbW9kdWxlcyA7LSkKKyAgSmFuIDMwdGgsIDIwMDAKKwluZXdlciBrZXJuZWxzIGF1dG9tYXRpY2FsbHkgcHJvYmUgbW9yZSB0aGFuIG9uZSBib2FyZCwgc28gdGhlCisJJ3N0YXJ0c2xvdCcgYXMgYSB2YXJpYWJsZSBpcyBhbHNvIG5lZWRlZCBoZXJlCisgIEFwciAxMnRoLCAyMDAwCisJdGhlIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyIGlzIG5vdCBzZXQgJ2hhcmQnIGluc3RlYWQgb2YgaW5kaXZpZHVhbGx5CisJc2V0dGluZyByZWdpc3RlcnMsIHNpbmNlIHRoaXMgc2VlbXMgdG8gc2V0IGJpdHMgdGhhdCBzaG91bGRuJ3QgYmUKKwlzZXQKKyAgTWF5IDIxc3QsIDIwMDAKKwlyZXNldCBpbnRlcnJ1cHQgc3RhdHVzIGltbWVkaWF0ZWx5IGFmdGVyIENBTSBsb2FkCisJYWRkIGEgcmVjb3ZlcnkgZGVsYXkgYWZ0ZXIgcmVsZWFzaW5nIHRoZSBjaGlwJ3MgcmVzZXQgbGluZQorICBNYXkgMjR0aCwgMjAwMAorCWZpbmFsbHkgZm91bmQgdGhlIGJ1ZyBpbiB0aGUgYWRkcmVzcyBmaWx0ZXIgc2V0dXAgLSBkYW1uZWQgc2lnbmVkCisgICAgICAgIGNoYXJzIQorICBKdW5lIDFzdCwgMjAwMAorCWNvcnJlY3RlZCB2ZXJzaW9uIGNvZGVzLCBhZGRlZCBzdXBwb3J0IGZvciB0aGUgbGF0ZXN0IDIuMyBjaGFuZ2VzCisgIE9jdCAyOHRoLCAyMDAyCisgIAljbGVhbmVkIHVwIGZvciB0aGUgMi41IHRyZWUgPGFsYW5AcmVkaGF0LmNvbT4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2EtbGVnYWN5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBfSUJNX0xBTkFfRFJJVkVSXworI2luY2x1ZGUgImlibWxhbmEuaCIKKworI3VuZGVmIERFQlVHCisKKyNkZWZpbmUgRFJWX05BTUUgImlibWxhbmEiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZ2xvYmFsIHN0YXRpYyBkYXRhIC0gbm90IG1vcmUgc2luY2Ugd2UgY2FuIGhhbmRsZSBtdWx0aXBsZSBib2FyZHMgYW5kCisgKiBoYXZlIHRvIHBhY2sgYWxsIHN0YXRlIGluZm8gaW50byB0aGUgZGV2aWNlIHN0cnVjdCEKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY2hhciAqTWVkaWFOYW1lc1tNZWRpYV9Db3VudF0gPSB7CisJIjEwQmFzZVQiLCAiMTBCYXNlNSIsICJVbmtub3duIiwgIjEwQmFzZTIiCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHByaXZhdGUgc3ViZnVuY3Rpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIERFQlVHCisgIC8qIGR1bXAgYWxsIHJlZ2lzdGVycyAqLworCitzdGF0aWMgdm9pZCBkdW1wcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCB6OworCisJZm9yICh6ID0gMDsgeiA8IDE2MDsgeiArPSAyKSB7CisJCWlmICghKHogJiAxNSkpCisJCQlwcmludGsoIlJFR1M6ICUwNHg6Iiwgeik7CisJCXByaW50aygiICUwNHgiLCBpbncoZGV2LT5iYXNlX2FkZHIgKyB6KSk7CisJCWlmICgoeiAmIDE1KSA9PSAxNCkKKwkJCXByaW50aygiXG4iKTsKKwl9Cit9CisKKy8qIGR1bXAgcGFydHMgb2Ygc2hhcmVkIG1lbW9yeSAtIG9ubHkgbmVlZGVkIGR1cmluZyBkZWJ1Z2dpbmcgKi8KKworc3RhdGljIHZvaWQgZHVtcG1lbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RhcnQsIHUzMiBsZW4pCit7CisJaWJtbGFuYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgejsKKworCXByaW50aygiQWRkcmVzcyAlMDR4OlxuIiwgc3RhcnQpOworCWZvciAoeiA9IDA7IHogPCBsZW47IHorKykgeworCQlpZiAoKHogJiAxNSkgPT0gMCkKKwkJCXByaW50aygiJTA0eDoiLCB6KTsKKwkJcHJpbnRrKCIgJTAyeCIsIHJlYWRiKHByaXYtPmJhc2UgKyBzdGFydCArIHopKTsKKwkJaWYgKCh6ICYgMTUpID09IDE1KQorCQkJcHJpbnRrKCJcbiIpOworCX0KKwlpZiAoKHogJiAxNSkgIT0gMCkKKwkJcHJpbnRrKCJcbiIpOworfQorCisvKiBwcmludCBleGFjdCB0aW1lIC0gZGl0dG8gKi8KKworc3RhdGljIHZvaWQgUHJUaW1lKHZvaWQpCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisKKwlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwlwcmludGsoIiU5ZDolMDZkOiAiLCAoaW50KSB0di50dl9zZWMsIChpbnQpIHR2LnR2X3VzZWMpOworfQorI2VuZGlmCQkJCS8qIERFQlVHICovCisKKy8qIGRlZHVjZSByZXNvdXJjZXMgb3V0IG9mIFBPUyByZWdpc3RlcnMgKi8KKworc3RhdGljIHZvaWQgZ2V0YWRkcnMoaW50IHNsb3QsIGludCAqYmFzZSwgaW50ICptZW1sZW4sIGludCAqaW9iYXNlLAorCQkgICAgIGludCAqaXJxLCBpYm1sYW5hX21lZGl1bSAqIG1lZGl1bSkKK3sKKwl1X2NoYXIgcG9zMCwgcG9zMTsKKworCXBvczAgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDIpOworCXBvczEgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDMpOworCisJKmJhc2UgPSAweGMwMDAwICsgKChwb3MxICYgMHhmMCkgPDwgOSk7CisJKm1lbWxlbiA9IChwb3MxICYgMHgwMSkgPyAweDgwMDAgOiAweDQwMDA7CisJKmlvYmFzZSA9IChwb3MwICYgMHhlMCkgPDwgNzsKKwlzd2l0Y2ggKHBvczAgJiAweDA2KSB7CisJY2FzZSAwOgorCQkqaXJxID0gNTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkqaXJxID0gMTU7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJKmlycSA9IDEwOworCQlicmVhazsKKwljYXNlIDY6CisJCSppcnEgPSAxMTsKKwkJYnJlYWs7CisJfQorCSptZWRpdW0gPSAocG9zMCAmIDB4MTgpID4+IDM7Cit9CisKKy8qIHdhaXQgb24gcmVnaXN0ZXIgdmFsdWUgd2l0aCBtYXNrIGFuZCB0aW1lb3V0ICovCisKK3N0YXRpYyBpbnQgd2FpdF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWdvZmZzLCB1MTYgbWFzaywKKwkJCXUxNiB2YWx1ZSwgaW50IHRpbWVvdXQpCit7CisJdW5zaWduZWQgbG9uZyBmaW4gPSBqaWZmaWVzICsgdGltZW91dDsKKworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLGZpbikpCisJCWlmICgoaW53KGRldi0+YmFzZV9hZGRyICsgcmVnb2ZmcykgJiBtYXNrKSA9PSB2YWx1ZSkKKwkJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKworLyogcmVzZXQgdGhlIHdob2xlIGJvYXJkICovCisKK3N0YXRpYyB2b2lkIFJlc2V0Qm9hcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBjaGFyIGJjbXZhbDsKKworCS8qIHJlYWQgb3JpZ2luYWwgYm9hcmQgY29udHJvbCB2YWx1ZSAqLworCisJYmNtdmFsID0gaW5iKGRldi0+YmFzZV9hZGRyICsgQkNNUkVHKTsKKworCS8qIHNldCByZXNldCBiaXQgZm9yIGEgd2hpbGUgKi8KKworCWJjbXZhbCB8PSBCQ01SRUdfUkVTRVQ7CisJb3V0YihiY212YWwsIGRldi0+YmFzZV9hZGRyICsgQkNNUkVHKTsKKwl1ZGVsYXkoMTApOworCWJjbXZhbCAmPSB+QkNNUkVHX1JFU0VUOworCW91dGIoYmNtdmFsLCBkZXYtPmJhc2VfYWRkciArIEJDTVJFRyk7CisKKwkvKiBzd2l0Y2ggb3ZlciB0byBSQU0gYWdhaW4gKi8KKworCWJjbXZhbCB8PSBCQ01SRUdfUkFNRU4gfCBCQ01SRUdfUkFNV0lOOworCW91dGIoYmNtdmFsLCBkZXYtPmJhc2VfYWRkciArIEJDTVJFRyk7Cit9CisKKy8qIGNhbGN1bGF0ZSBSQU0gbGF5b3V0ICYgc2V0IHVwIGRlc2NyaXB0b3JzIGluIFJBTSAqLworCitzdGF0aWMgdm9pZCBJbml0RHNjcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpYm1sYW5hX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBhZGRyLCBiYWRkciwgcmFkZHI7CisJaW50IHo7CisJdGRhX3QgdGRhOworCXJkYV90IHJkYTsKKwlycmFfdCBycmE7CisKKwkvKiBpbml0aWFsaXplIFJBTSAqLworCisJbWVtc2V0X2lvKHByaXYtPmJhc2UsIDB4YWEsCisJCSAgICAgIGRldi0+bWVtX3N0YXJ0IC0gZGV2LT5tZW1fc3RhcnQpOwkvKiBYWFg6IHR5cG8/ICovCisKKwkvKiBzZXR1cCBuIFRYIGRlc2NyaXB0b3JzIC0gaW5kZXBlbmRlbnQgb2YgUkFNIHNpemUgKi8KKworCXByaXYtPnRkYXN0YXJ0ID0gYWRkciA9IDA7CisJcHJpdi0+dHhidWZzdGFydCA9IGJhZGRyID0gc2l6ZW9mKHRkYV90KSAqIFRYQlVGQ05UOworCWZvciAoeiA9IDA7IHogPCBUWEJVRkNOVDsgeisrKSB7CisJCXRkYS5zdGF0dXMgPSAwOworCQl0ZGEuY29uZmlnID0gMDsKKwkJdGRhLmxlbmd0aCA9IDA7CisJCXRkYS5mcmFnY291bnQgPSAxOworCQl0ZGEuc3RhcnRsbyA9IGJhZGRyOworCQl0ZGEuc3RhcnRoaSA9IDA7CisJCXRkYS5mcmFnbGVuZ3RoID0gMDsKKwkJaWYgKHogPT0gVFhCVUZDTlQgLSAxKQorCQkJdGRhLmxpbmsgPSBwcml2LT50ZGFzdGFydDsKKwkJZWxzZQorCQkJdGRhLmxpbmsgPSBhZGRyICsgc2l6ZW9mKHRkYV90KTsKKwkJdGRhLmxpbmsgfD0gMTsKKwkJbWVtY3B5X3RvaW8ocHJpdi0+YmFzZSArIGFkZHIsICZ0ZGEsIHNpemVvZih0ZGFfdCkpOworCQlhZGRyICs9IHNpemVvZih0ZGFfdCk7CisJCWJhZGRyICs9IFBLVFNJWkU7CisJfQorCisJLyogY2FsY3VsYXRlIGhvdyBtYW55IHJlY2VpdmUgYnVmZmVycyBmaXQgaW50byByZW1haW5pbmcgbWVtb3J5ICovCisKKwlwcml2LT5yeGJ1ZmNudCA9IChkZXYtPm1lbV9lbmQgLSBkZXYtPm1lbV9zdGFydCAtIGJhZGRyKSAvIChzaXplb2YocnJhX3QpICsgc2l6ZW9mKHJkYV90KSArIFBLVFNJWkUpOworCisJLyogY2FsY3VsYXRlIHJlY2VpdmUgYWRkcmVzc2VzICovCisKKwlwcml2LT5ycmFzdGFydCA9IHJhZGRyID0gcHJpdi0+dHhidWZzdGFydCArIChUWEJVRkNOVCAqIFBLVFNJWkUpOworCXByaXYtPnJkYXN0YXJ0ID0gYWRkciA9IHByaXYtPnJyYXN0YXJ0ICsgKHByaXYtPnJ4YnVmY250ICogc2l6ZW9mKHJyYV90KSk7CisJcHJpdi0+cnhidWZzdGFydCA9IGJhZGRyID0gcHJpdi0+cmRhc3RhcnQgKyAocHJpdi0+cnhidWZjbnQgKiBzaXplb2YocmRhX3QpKTsKKwkKKwlmb3IgKHogPSAwOyB6IDwgcHJpdi0+cnhidWZjbnQ7IHorKykgeworCQlycmEuc3RhcnRsbyA9IGJhZGRyOworCQlycmEuc3RhcnRoaSA9IDA7CisJCXJyYS5jbnRsbyA9IFBLVFNJWkUgPj4gMTsKKwkJcnJhLmNudGhpID0gMDsKKwkJbWVtY3B5X3RvaW8ocHJpdi0+YmFzZSArIHJhZGRyLCAmcnJhLCBzaXplb2YocnJhX3QpKTsKKworCQlyZGEuc3RhdHVzID0gMDsKKwkJcmRhLmxlbmd0aCA9IDA7CisJCXJkYS5zdGFydGxvID0gMDsKKwkJcmRhLnN0YXJ0aGkgPSAwOworCQlyZGEuc2Vxbm8gPSAwOworCQlpZiAoeiA8IHByaXYtPnJ4YnVmY250IC0gMSkKKwkJCXJkYS5saW5rID0gYWRkciArIHNpemVvZihyZGFfdCk7CisJCWVsc2UKKwkJCXJkYS5saW5rID0gMTsKKwkJcmRhLmludXNlID0gMTsKKwkJbWVtY3B5X3RvaW8ocHJpdi0+YmFzZSArIGFkZHIsICZyZGEsIHNpemVvZihyZGFfdCkpOworCisJCWJhZGRyICs9IFBLVFNJWkU7CisJCXJhZGRyICs9IHNpemVvZihycmFfdCk7CisJCWFkZHIgKz0gc2l6ZW9mKHJkYV90KTsKKwl9CisKKwkvKiBpbml0aWFsaXplIGN1cnJlbnQgcG9pbnRlcnMgKi8KKworCXByaXYtPm5leHRyeGRlc2NyID0gMDsKKwlwcml2LT5sYXN0cnhkZXNjciA9IHByaXYtPnJ4YnVmY250IC0gMTsKKwlwcml2LT5uZXh0dHhkZXNjciA9IDA7CisJcHJpdi0+Y3VycnR4ZGVzY3IgPSAwOworCXByaXYtPnR4dXNlZGNudCA9IDA7CisJbWVtc2V0KHByaXYtPnR4dXNlZCwgMCwgc2l6ZW9mKHByaXYtPnR4dXNlZCkpOworfQorCisvKiBzZXQgdXAgUnggKyBUeCBkZXNjcmlwdG9ycyBpbiBTT05JQyAqLworCitzdGF0aWMgaW50IEluaXRTT05JQyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlibWxhbmFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBzZXQgdXAgc3RhcnQgJiBlbmQgb2YgcmVzb3VyY2UgYXJlYSAqLworCisJb3V0dygwLCBTT05JQ19VUlJBKTsKKwlvdXR3KHByaXYtPnJyYXN0YXJ0LCBkZXYtPmJhc2VfYWRkciArIFNPTklDX1JTQSk7CisJb3V0dyhwcml2LT5ycmFzdGFydCArIChwcml2LT5yeGJ1ZmNudCAqIHNpemVvZihycmFfdCkpLCBkZXYtPmJhc2VfYWRkciArIFNPTklDX1JFQSk7CisJb3V0dyhwcml2LT5ycmFzdGFydCwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19SUlApOworCW91dHcocHJpdi0+cnJhc3RhcnQsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfUldQKTsKKworCS8qIHNldCBFT0JDIHNvIHRoYXQgb25seSBvbmUgcGFja2V0IGdvZXMgaW50byBvbmUgYnVmZmVyICovCisKKwlvdXR3KChQS1RTSVpFIC0gNCkgPj4gMSwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19FT0JDKTsKKworCS8qIGxldCBTT05JQyByZWFkIHRoZSBmaXJzdCBSUkEgZGVzY3JpcHRvciAqLworCisJb3V0dyhDTURSRUdfUlJSQSwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19DTURSRUcpOworCWlmICghd2FpdF90aW1lb3V0KGRldiwgU09OSUNfQ01EUkVHLCBDTURSRUdfUlJSQSwgMCwgMikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogU09OSUMgZGlkIG5vdCByZXNwb25kIG9uIFJSUkEgY29tbWFuZCAtIGdpdmluZyB1cC4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBwb2ludCBTT05JQyB0byB0aGUgZmlyc3QgUkRBICovCisKKwlvdXR3KDAsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfVVJEQSk7CisJb3V0dyhwcml2LT5yZGFzdGFydCwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19DUkRBKTsKKworCS8qIHNldCB1cHBlciBoYWxmIG9mIFREQSBhZGRyZXNzICovCisKKwlvdXR3KDAsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfVVREQSk7CisKKwlyZXR1cm4gMTsKK30KKworLyogc3RvcCBTT05JQyBzbyB3ZSBjYW4gcmVpbml0aWFsaXplIGl0ICovCisKK3N0YXRpYyB2b2lkIFN0b3BTT05JQyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCisJb3V0YihpbmIoZGV2LT5iYXNlX2FkZHIgKyBCQ01SRUcpICYgKH5CQ01SRUdfSUVOKSwgZGV2LT5iYXNlX2FkZHIgKyBCQ01SRUcpOworCW91dGIoMCwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19JTVJFRyk7CisKKwkvKiByZXNldCB0aGUgU09OSUMgKi8KKworCW91dHcoQ01EUkVHX1JTVCwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19DTURSRUcpOworCXVkZWxheSgxMCk7CisJb3V0dyhDTURSRUdfUlNULCBkZXYtPmJhc2VfYWRkciArIFNPTklDX0NNRFJFRyk7Cit9CisKKy8qIGluaXRpYWxpemUgY2FyZCBhbmQgU09OSUMgZm9yIHByb3BlciBvcGVyYXRpb24gKi8KKworc3RhdGljIHZvaWQgcHV0Y2FtKGNhbWVudHJ5X3QgKiBjYW1zLCBpbnQgKmNhbWNudCwgY2hhciAqYWRkcikKK3sKKwljYW1lbnRyeV90ICpwY2FtID0gY2FtcyArICgqY2FtY250KTsKKwl1OCAqdWFkZHIgPSAodTggKikgYWRkcjsKKworCXBjYW0tPmluZGV4ID0gKmNhbWNudDsKKwlwY2FtLT5hZGRyMCA9ICgoKHUxNikgdWFkZHJbMV0pIDw8IDgpIHwgdWFkZHJbMF07CisJcGNhbS0+YWRkcjEgPSAoKCh1MTYpIHVhZGRyWzNdKSA8PCA4KSB8IHVhZGRyWzJdOworCXBjYW0tPmFkZHIyID0gKCgodTE2KSB1YWRkcls1XSkgPDwgOCkgfCB1YWRkcls0XTsKKwkoKmNhbWNudCkrKzsKK30KKworc3RhdGljIHZvaWQgSW5pdEJvYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWJtbGFuYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgY2FtY250OworCWNhbWVudHJ5X3QgY2Ftc1sxNl07CisJdTMyIGNhbW1hc2s7CisJc3RydWN0IGRldl9tY19saXN0ICptY3B0cjsKKwl1MTYgcmNydmFsOworCisJLyogcmVzZXQgdGhlIFNPTklDICovCisKKwlvdXR3KENNRFJFR19SU1QsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfQ01EUkVHKTsKKwl1ZGVsYXkoMTApOworCisJLyogY2xlYXIgYWxsIHNwdXJpb3VzIGludGVycnVwdHMgKi8KKworCW91dHcoaW53KGRldi0+YmFzZV9hZGRyICsgU09OSUNfSVNSRUcpLCBkZXYtPmJhc2VfYWRkciArIFNPTklDX0lTUkVHKTsKKworCS8qIHNldCB1cCB0aGUgU09OSUMncyBidXMgaW50ZXJmYWNlIC0gY29uc3RhbnQgZm9yIHRoaXMgYWRhcHRlciAtCisJICAgbXVzdCBiZSBkb25lIHdoaWxlIHRoZSBTT05JQyBpcyBpbiByZXNldCAqLworCisJb3V0dyhEQ1JFR19VU1IxIHwgRENSRUdfVVNSMCB8IERDUkVHX1dDMSB8IERDUkVHX0RXMzIsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfRENSRUcpOworCW91dHcoMCwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19EQ1JFRzIpOworCisJLyogcmVtb3ZlIHJlc2V0IGZvcm0gdGhlIFNPTklDICovCisKKwlvdXR3KDAsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfQ01EUkVHKTsKKwl1ZGVsYXkoMTApOworCisJLyogZGF0YSBzaGVldCByZXF1aXJlcyBVUlJBIHRvIGJlIHByb2dyYW1tZWQgYmVmb3JlIHNldHRpbmcgdXAgdGhlIENBTSBjb250ZW50cyAqLworCisJb3V0dygwLCBkZXYtPmJhc2VfYWRkciArIFNPTklDX1VSUkEpOworCisJLyogcHJvZ3JhbSB0aGUgQ0FNIGVudHJ5IDAgdG8gdGhlIGRldmljZSBhZGRyZXNzICovCisKKwljYW1jbnQgPSAwOworCXB1dGNhbShjYW1zLCAmY2FtY250LCBkZXYtPmRldl9hZGRyKTsKKworCS8qIHN0YXJ0IHB1dHRpbmcgdGhlIG11bHRpY2FzdCBhZGRyZXNzZXMgaW50byB0aGUgQ0FNIGxpc3QuICBTdG9wIGlmCisJICAgaXQgaXMgZnVsbC4gKi8KKworCWZvciAobWNwdHIgPSBkZXYtPm1jX2xpc3Q7IG1jcHRyICE9IE5VTEw7IG1jcHRyID0gbWNwdHItPm5leHQpIHsKKwkJcHV0Y2FtKGNhbXMsICZjYW1jbnQsIG1jcHRyLT5kbWlfYWRkcik7CisJCWlmIChjYW1jbnQgPT0gMTYpCisJCQlicmVhazsKKwl9CisKKwkvKiBjYWxjdWxhdGUgQ0FNIG1hc2sgKi8KKworCWNhbW1hc2sgPSAoMSA8PCBjYW1jbnQpIC0gMTsKKworCS8qIGZlZWQgQ0RBIGludG8gU09OSUMsIGluaXRpYWxpemUgUkNSIHZhbHVlIChhbHdheXMgZ2V0IGJyb2FkY2FzdHMpICovCisKKwltZW1jcHlfdG9pbyhwcml2LT5iYXNlLCBjYW1zLCBzaXplb2YoY2FtZW50cnlfdCkgKiBjYW1jbnQpOworCW1lbWNweV90b2lvKHByaXYtPmJhc2UgKyAoc2l6ZW9mKGNhbWVudHJ5X3QpICogY2FtY250KSwgJmNhbW1hc2ssIHNpemVvZihjYW1tYXNrKSk7CisKKyNpZmRlZiBERUJVRworCXByaW50aygiQ0FNIHNldHVwOlxuIik7CisJZHVtcG1lbShkZXYsIDAsIHNpemVvZihjYW1lbnRyeV90KSAqIGNhbWNudCArIHNpemVvZihjYW1tYXNrKSk7CisjZW5kaWYKKworCW91dHcoMCwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19DQU1QVFIpOworCW91dHcoY2FtY250LCBkZXYtPmJhc2VfYWRkciArIFNPTklDX0NBTUNOVCk7CisJb3V0dyhDTURSRUdfTENBTSwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19DTURSRUcpOworCWlmICghd2FpdF90aW1lb3V0KGRldiwgU09OSUNfQ01EUkVHLCBDTURSRUdfTENBTSwgMCwgMikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczpTT05JQyBkaWQgbm90IHJlc3BvbmQgb24gTENBTSBjb21tYW5kIC0gZ2l2aW5nIHVwLiIsIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQkvKiBjbGVhciBpbnRlcnJ1cHQgY29uZGl0aW9uICovCisKKwkJb3V0dyhJU1JFR19MQ0QsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfSVNSRUcpOworCisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJMb2FkaW5nIENBTSBkb25lLCBhZGRyZXNzIHBvaW50ZXJzICUwNHg6JTA0eFxuIiwKKwkJICAgICAgIGludyhkZXYtPmJhc2VfYWRkciArIFNPTklDX1VSUkEpLAorCQkgICAgICAgaW53KGRldi0+YmFzZV9hZGRyICsgU09OSUNfQ0FNUFRSKSk7CisJCXsKKwkJCWludCB6OworCisJCQlwcmludGsoIlxuLS0+Q0FNOiBQVFIgJTA0eCBDTlQgJTA0eFxuIiwKKwkJCSAgICAgICBpbncoZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19DQU1QVFIpLAorCQkJICAgICAgIGludyhkZXYtPmJhc2VfYWRkciArIFNPTklDX0NBTUNOVCkpOworCQkJb3V0dyhDTURSRUdfUlNULCBkZXYtPmJhc2VfYWRkciArIFNPTklDX0NNRFJFRyk7CisJCQlmb3IgKHogPSAwOyB6IDwgY2FtY250OyB6KyspIHsKKwkJCQlvdXR3KHosIGRldi0+YmFzZV9hZGRyICsgU09OSUNfQ0FNRVBUUik7CisJCQkJcHJpbnRrKCJFbnRyeSAlZDogJTA0eCAlMDR4ICUwNHhcbiIsIHosCisJCQkJICAgICAgIGludyhkZXYtPmJhc2VfYWRkciArIFNPTklDX0NBTUFERFIwKSwKKwkJCQkgICAgICAgaW53KGRldi0+YmFzZV9hZGRyICsgU09OSUNfQ0FNQUREUjEpLAorCQkJCSAgICAgICBpbncoZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19DQU1BRERSMikpOworCQkJfQorCQkJb3V0dygwLCBkZXYtPmJhc2VfYWRkciArIFNPTklDX0NNRFJFRyk7CisJCX0KKyNlbmRpZgorCX0KKworCXJjcnZhbCA9IFJDUkVHX0JSRCB8IFJDUkVHX0xCX05PTkU7CisKKwkvKiBpZiBzdGlsbCBtdWx0aWNhc3QgYWRkcmVzc2VzIGxlZnQgb3IgQUxMTVVMVEkgaXMgc2V0LCBzZXQgdGhlIG11bHRpY2FzdAorCSAgIGVuYWJsZSBiaXQgKi8KKworCWlmICgoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgfHwgKG1jcHRyICE9IE5VTEwpKQorCQlyY3J2YWwgfD0gUkNSRUdfQU1DOworCisJLyogcHJvbWlzY291cyBtb2RlID8gKi8KKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCXJjcnZhbCB8PSBSQ1JFR19QUk87CisKKwkvKiBwcm9ncmFtIHJlY2VpdmUgbW9kZSAqLworCisJb3V0dyhyY3J2YWwsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfUkNSRUcpOworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJcblJDUlZBTDogJTA0eFxuIiwgcmNydmFsKTsKKyNlbmRpZgorCisJLyogc2V0IHVwIGRlc2NyaXB0b3JzIGluIHNoYXJlZCBtZW1vcnkgKyBmZWVkIHRoZW0gaW50byBTT05JQyByZWdpc3RlcnMgKi8KKworCUluaXREc2NycyhkZXYpOworCWlmICghSW5pdFNPTklDKGRldikpCisJCXJldHVybjsKKworCS8qIHJlc2V0IGFsbCBwZW5kaW5nIGludGVycnVwdHMgKi8KKworCW91dHcoMHhmZmZmLCBkZXYtPmJhc2VfYWRkciArIFNPTklDX0lTUkVHKTsKKworCS8qIGVuYWJsZSB0cmFuc21pdHRlciArIHJlY2VpdmVyIGludGVycnVwdHMgKi8KKworCW91dHcoQ01EUkVHX1JYRU4sIGRldi0+YmFzZV9hZGRyICsgU09OSUNfQ01EUkVHKTsKKwlvdXR3KElNUkVHX1BSWEVOIHwgSU1SRUdfUkJFRU4gfCBJTVJFR19QVFhFTiB8IElNUkVHX1RYRVJFTiwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19JTVJFRyk7CisKKwkvKiB0dXJuIG9uIGNhcmQgaW50ZXJydXB0cyAqLworCisJb3V0YihpbmIoZGV2LT5iYXNlX2FkZHIgKyBCQ01SRUcpIHwgQkNNUkVHX0lFTiwgZGV2LT5iYXNlX2FkZHIgKyBCQ01SRUcpOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoIlJlZ2lzdGVyIGR1bXAgYWZ0ZXIgaW5pdGlhbGl6YXRpb246XG4iKTsKKwlkdW1wcmVncyhkZXYpOworI2VuZGlmCit9CisKKy8qIHN0YXJ0IHRyYW5zbWlzc2lvbiBvZiBhIGRlc2NyaXB0b3IgKi8KKworc3RhdGljIHZvaWQgU3RhcnRUeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZGVzY3IpCit7CisJaWJtbGFuYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgYWRkcjsKKworCWFkZHIgPSBwcml2LT50ZGFzdGFydCArIChkZXNjciAqIHNpemVvZih0ZGFfdCkpOworCisJLyogcHV0IGRlc2NyaXB0b3IgYWRkcmVzcyBpbnRvIFNPTklDICovCisKKwlvdXR3KGFkZHIsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfQ1REQSk7CisKKwkvKiB0cmlnZ2VyIHRyYW5zbWl0dGVyICovCisKKwlwcml2LT5jdXJydHhkZXNjciA9IGRlc2NyOworCW91dHcoQ01EUkVHX1RYUCwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19DTURSRUcpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGludGVycnVwdCBoYW5kbGVyKHMpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogcmVjZWl2ZSBidWZmZXIgYXJlYSBleGhhdXN0ZWQgKi8KKworc3RhdGljIHZvaWQgaXJxcmJlX2hhbmRsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpYm1sYW5hX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogcG9pbnQgdGhlIFNPTklDIGJhY2sgdG8gdGhlIFJSQSBzdGFydCAqLworCisJb3V0dyhwcml2LT5ycmFzdGFydCwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19SUlApOworCW91dHcocHJpdi0+cnJhc3RhcnQsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfUldQKTsKK30KKworLyogcmVjZWl2ZSBpbnRlcnJ1cHQgKi8KKworc3RhdGljIHZvaWQgaXJxcnhfaGFuZGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlibWxhbmFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcmRhX3QgcmRhOworCXUzMiByZGFhZGRyLCBscmRhYWRkcjsKKworCS8qIGxvb3AgdW50aWwgLi4uICovCisKKwl3aGlsZSAoMSkgeworCQkvKiByZWFkIGRlc2NyaXB0b3IgdGhhdCB3YXMgbmV4dCB0byBiZSBmaWxsZWQgYnkgU09OSUMgKi8KKworCQlyZGFhZGRyID0gcHJpdi0+cmRhc3RhcnQgKyAocHJpdi0+bmV4dHJ4ZGVzY3IgKiBzaXplb2YocmRhX3QpKTsKKwkJbHJkYWFkZHIgPSBwcml2LT5yZGFzdGFydCArIChwcml2LT5sYXN0cnhkZXNjciAqIHNpemVvZihyZGFfdCkpOworCQltZW1jcHlfZnJvbWlvKCZyZGEsIHByaXYtPmJhc2UgKyByZGFhZGRyLCBzaXplb2YocmRhX3QpKTsKKworCQkvKiBpcm9uIG91dCB1cHBlciB3b3JkIGhhbHZlcyBvZiBmaWVsZHMgd2UgdXNlIC0gU09OSUMgd2lsbCBkdXBsaWNhdGUgCisJCSAgIGJpdHMgMC4uMTUgdG8gMTYuLjMxICovCisKKwkJcmRhLnN0YXR1cyAmPSAweGZmZmY7CisJCXJkYS5sZW5ndGggJj0gMHhmZmZmOworCQlyZGEuc3RhcnRsbyAmPSAweGZmZmY7CisKKwkJLyogc3RvcCBpZiB0aGUgU09OSUMgc3RpbGwgb3ducyBpdCwgaS5lLiB0aGVyZSBpcyBubyBkYXRhIGZvciB1cyAqLworCisJCWlmIChyZGEuaW51c2UpCisJCQlicmVhazsKKworCQkvKiBnb29kIHBhY2tldD8gKi8KKworCQllbHNlIGlmIChyZGEuc3RhdHVzICYgUkNSRUdfUFJYKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQkvKiBmZXRjaCBidWZmZXIgKi8KKworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihyZGEubGVuZ3RoICsgMik7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJcHJpdi0+c3RhdC5yeF9kcm9wcGVkKys7CisJCQllbHNlIHsKKwkJCQkvKiBjb3B5IG91dCBkYXRhICovCisKKwkJCQltZW1jcHlfZnJvbWlvKHNrYl9wdXQoc2tiLCByZGEubGVuZ3RoKSwKKwkJCQkJICAgICAgIHByaXYtPmJhc2UgKworCQkJCQkgICAgICAgcmRhLnN0YXJ0bG8sIHJkYS5sZW5ndGgpOworCisJCQkJLyogc2V0IHVwIHNrYiBmaWVsZHMgKi8KKworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCisJCQkJLyogYm9va2tlZXBpbmcgKi8KKwkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCXByaXYtPnN0YXQucnhfcGFja2V0cysrOworCQkJCXByaXYtPnN0YXQucnhfYnl0ZXMgKz0gcmRhLmxlbmd0aDsKKworCQkJCS8qIHBhc3MgdG8gdGhlIHVwcGVyIGxheWVycyAqLworCQkJCW5ldGlmX3J4KHNrYik7CisJCQl9CisJCX0KKworCQkvKiBvdGhlcndpc2UgY2hlY2sgZXJyb3Igc3RhdHVzIGJpdHMgYW5kIGluY3JlYXNlIHN0YXRpc3RpY3MgKi8KKworCQllbHNlIHsKKwkJCXByaXYtPnN0YXQucnhfZXJyb3JzKys7CisJCQlpZiAocmRhLnN0YXR1cyAmIFJDUkVHX0ZBRVIpCisJCQkJcHJpdi0+c3RhdC5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChyZGEuc3RhdHVzICYgUkNSRUdfQ1JDUikKKwkJCQlwcml2LT5zdGF0LnJ4X2NyY19lcnJvcnMrKzsKKwkJfQorCisJCS8qIGRlc2NyaXB0b3IgcHJvY2Vzc2VkLCB3aWxsIGJlY29tZSBuZXcgbGFzdCBkZXNjcmlwdG9yIGluIHF1ZXVlICovCisKKwkJcmRhLmxpbmsgPSAxOworCQlyZGEuaW51c2UgPSAxOworCQltZW1jcHlfdG9pbyhwcml2LT5iYXNlICsgcmRhYWRkciwgJnJkYSwKKwkJCSAgICAgc2l6ZW9mKHJkYV90KSk7CisKKwkJLyogc2V0IHVwIGxpbmsgYW5kIEVPTCA9IDAgaW4gY3VycmVudGx5IGxhc3QgZGVzY3JpcHRvci4gT25seSB3cml0ZQorCQkgICB0aGUgbGluayBmaWVsZCBzaW5jZSB0aGUgU09OSUMgbWF5IGN1cnJlbnRseSBhbHJlYWR5IGFjY2VzcyB0aGUKKwkJICAgb3RoZXIgZmllbGRzLiAqLworCisJCW1lbWNweV90b2lvKHByaXYtPmJhc2UgKyBscmRhYWRkciArIDIwLCAmcmRhYWRkciwgNCk7CisKKwkJLyogYWR2YW5jZSBpbmRpY2VzICovCisKKwkJcHJpdi0+bGFzdHJ4ZGVzY3IgPSBwcml2LT5uZXh0cnhkZXNjcjsKKwkJaWYgKCgrK3ByaXYtPm5leHRyeGRlc2NyKSA+PSBwcml2LT5yeGJ1ZmNudCkKKwkJCXByaXYtPm5leHRyeGRlc2NyID0gMDsKKwl9Cit9CisKKy8qIHRyYW5zbWl0IGludGVycnVwdCAqLworCitzdGF0aWMgdm9pZCBpcnF0eF9oYW5kbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWJtbGFuYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl0ZGFfdCB0ZGE7CisKKwkvKiBmZXRjaCBkZXNjcmlwdG9yICh3ZSBmb3Jnb3QgdGhlIHNpemUgOy0pICovCisJbWVtY3B5X2Zyb21pbygmdGRhLCBwcml2LT5iYXNlICsgcHJpdi0+dGRhc3RhcnQgKyAocHJpdi0+Y3VycnR4ZGVzY3IgKiBzaXplb2YodGRhX3QpKSwgc2l6ZW9mKHRkYV90KSk7CisKKwkvKiB1cGRhdGUgc3RhdGlzdGljcyAqLworCXByaXYtPnN0YXQudHhfcGFja2V0cysrOworCXByaXYtPnN0YXQudHhfYnl0ZXMgKz0gdGRhLmxlbmd0aDsKKworCS8qIHVwZGF0ZSBvdXIgcG9pbnRlcnMgKi8KKwlwcml2LT50eHVzZWRbcHJpdi0+Y3VycnR4ZGVzY3JdID0gMDsKKwlwcml2LT50eHVzZWRjbnQtLTsKKworCS8qIGlmIHRoZXJlIGFyZSBtb3JlIGRlc2NyaXB0b3JzIHByZXNlbnQgaW4gUkFNLCBzdGFydCB0aGVtICovCisJaWYgKHByaXYtPnR4dXNlZGNudCA+IDApCisJCVN0YXJ0VHgoZGV2LCAocHJpdi0+Y3VycnR4ZGVzY3IgKyAxKSAlIFRYQlVGQ05UKTsKKworCS8qIHRlbGwgdGhlIHVwcGVyIGxheWVyIHdlIGNhbiBnbyBvbiB0cmFuc21pdHRpbmcgKi8KKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGlycXR4ZXJyX2hhbmRsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpYm1sYW5hX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXRkYV90IHRkYTsKKworCS8qIGZldGNoIGRlc2NyaXB0b3IgdG8gY2hlY2sgc3RhdHVzICovCisJbWVtY3B5X2Zyb21pbygmdGRhLCBwcml2LT5iYXNlICsgcHJpdi0+dGRhc3RhcnQgKyAocHJpdi0+Y3VycnR4ZGVzY3IgKiBzaXplb2YodGRhX3QpKSwgc2l6ZW9mKHRkYV90KSk7CisKKwkvKiB1cGRhdGUgc3RhdGlzdGljcyAqLworCXByaXYtPnN0YXQudHhfZXJyb3JzKys7CisJaWYgKHRkYS5zdGF0dXMgJiAoVENSRUdfTkNSUyB8IFRDUkVHX0NSU0wpKQorCQlwcml2LT5zdGF0LnR4X2NhcnJpZXJfZXJyb3JzKys7CisJaWYgKHRkYS5zdGF0dXMgJiBUQ1JFR19FWEMpCisJCXByaXYtPnN0YXQudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwlpZiAodGRhLnN0YXR1cyAmIFRDUkVHX09XQykKKwkJcHJpdi0+c3RhdC50eF93aW5kb3dfZXJyb3JzKys7CisJaWYgKHRkYS5zdGF0dXMgJiBUQ1JFR19GVSkKKwkJcHJpdi0+c3RhdC50eF9maWZvX2Vycm9ycysrOworCisJLyogdXBkYXRlIG91ciBwb2ludGVycyAqLworCXByaXYtPnR4dXNlZFtwcml2LT5jdXJydHhkZXNjcl0gPSAwOworCXByaXYtPnR4dXNlZGNudC0tOworCisJLyogaWYgdGhlcmUgYXJlIG1vcmUgZGVzY3JpcHRvcnMgcHJlc2VudCBpbiBSQU0sIHN0YXJ0IHRoZW0gKi8KKwlpZiAocHJpdi0+dHh1c2VkY250ID4gMCkKKwkJU3RhcnRUeChkZXYsIChwcml2LT5jdXJydHhkZXNjciArIDEpICUgVFhCVUZDTlQpOworCisJLyogdGVsbCB0aGUgdXBwZXIgbGF5ZXIgd2UgY2FuIGdvIG9uIHRyYW5zbWl0dGluZyAqLworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyogZ2VuZXJhbCBpbnRlcnJ1cHQgZW50cnkgKi8KKworc3RhdGljIGlycXJldHVybl90IGlycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldmljZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZpY2U7CisJdTE2IGl2YWw7CisKKwkvKiBpbiBjYXNlIHdlJ3JlIG5vdCBtZWFudC4uLiAqLworCWlmICghKGluYihkZXYtPmJhc2VfYWRkciArIEJDTVJFRykgJiBCQ01SRUdfSVBFTkQpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkvKiBsb29wIHRocm91Z2ggdGhlIGludGVycnVwdCBiaXRzIHVudGlsIGV2ZXJ5dGhpbmcgaXMgY2xlYXIgKi8KKwl3aGlsZSAoMSkgeworCQlpdmFsID0gaW53KGRldi0+YmFzZV9hZGRyICsgU09OSUNfSVNSRUcpOworCisJCWlmIChpdmFsICYgSVNSRUdfUkJFKSB7CisJCQlpcnFyYmVfaGFuZGxlcihkZXYpOworCQkJb3V0dyhJU1JFR19SQkUsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfSVNSRUcpOworCQl9CisJCWlmIChpdmFsICYgSVNSRUdfUEtUUlgpIHsKKwkJCWlycXJ4X2hhbmRsZXIoZGV2KTsKKwkJCW91dHcoSVNSRUdfUEtUUlgsIGRldi0+YmFzZV9hZGRyICsgU09OSUNfSVNSRUcpOworCQl9CisJCWlmIChpdmFsICYgSVNSRUdfVFhETikgeworCQkJaXJxdHhfaGFuZGxlcihkZXYpOworCQkJb3V0dyhJU1JFR19UWEROLCBkZXYtPmJhc2VfYWRkciArIFNPTklDX0lTUkVHKTsKKwkJfQorCQlpZiAoaXZhbCAmIElTUkVHX1RYRVIpIHsKKwkJCWlycXR4ZXJyX2hhbmRsZXIoZGV2KTsKKwkJCW91dHcoSVNSRUdfVFhFUiwgZGV2LT5iYXNlX2FkZHIgKyBTT05JQ19JU1JFRyk7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBkcml2ZXIgbWV0aG9kcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIE1DQSBpbmZvICovCisKK3N0YXRpYyBpbnQgaWJtbGFuYV9nZXRpbmZvKGNoYXIgKmJ1ZiwgaW50IHNsb3QsIHZvaWQgKmQpCit7CisJaW50IGxlbiA9IDAsIGk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkOworCWlibWxhbmFfcHJpdiAqcHJpdjsKKworCS8qIGNhbid0IHNheSBhbnl0aGluZyBhYm91dCBhbiB1bmluaXRpYWxpemVkIGRldmljZS4uLiAqLworCisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gbGVuOworCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogcHJpbnQgaW5mbyAqLworCisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiSVJROiAlZFxuIiwgcHJpdi0+cmVhbGlycSk7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiSS9POiAlI2x4XG4iLCBkZXYtPmJhc2VfYWRkcik7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiTWVtb3J5OiAlI2x4LSUjbHhcbiIsIGRldi0+bWVtX3N0YXJ0LCBkZXYtPm1lbV9lbmQgLSAxKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJUcmFuc2NlaXZlcjogJXNcbiIsIE1lZGlhTmFtZXNbcHJpdi0+bWVkaXVtXSk7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiRGV2aWNlOiAlc1xuIiwgZGV2LT5uYW1lKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJNQUMgYWRkcmVzczoiKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIgJTAyeCIsIGRldi0+ZGV2X2FkZHJbaV0pOworCWJ1ZltsZW4rK10gPSAnXG4nOworCWJ1ZltsZW5dID0gMDsKKworCXJldHVybiBsZW47Cit9CisKKy8qIG9wZW4gZHJpdmVyLiAgTWVhbnMgYWxzbyBpbml0aWFsaXphdGlvbiBhbmQgc3RhcnQgb2YgTEFOQ0UgKi8KKworc3RhdGljIGludCBpYm1sYW5hX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmVzdWx0OworCWlibWxhbmFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiByZWdpc3RlciByZXNvdXJjZXMgLSBvbmx5IG5lY2Vzc2FyeSBmb3IgSVJRICovCisKKwlyZXN1bHQgPSByZXF1ZXN0X2lycShwcml2LT5yZWFsaXJxLCBpcnFfaGFuZGxlciwgU0FfU0hJUlEgfCBTQV9TQU1QTEVfUkFORE9NLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJlc3VsdCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZWdpc3RlciBpcnEgJWRcbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlkZXYtPmlycSA9IHByaXYtPnJlYWxpcnE7CisKKwkvKiBzZXQgdXAgdGhlIGNhcmQgYW5kIFNPTklDICovCisJSW5pdEJvYXJkKGRldik7CisKKwkvKiBpbml0aWFsaXplIG9wZXJhdGlvbmFsIGZsYWdzICovCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyogY2xvc2UgZHJpdmVyLiAgU2h1dCBkb3duIGJvYXJkIGFuZCBmcmVlIGFsbG9jYXRlZCByZXNvdXJjZXMgKi8KKworc3RhdGljIGludCBpYm1sYW5hX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogdHVybiBvZmYgYm9hcmQgKi8KKworCS8qIHJlbGVhc2UgcmVzb3VyY2VzICovCisJaWYgKGRldi0+aXJxICE9IDApCisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCWRldi0+aXJxID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyogdHJhbnNtaXQgYSBibG9jay4gKi8KKworc3RhdGljIGludCBpYm1sYW5hX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWJtbGFuYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0dmFsID0gMCwgdG1wbGVuLCBhZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdGRhX3QgdGRhOworCWludCBiYWRkcjsKKworCS8qIGZpbmQgb3V0IGlmIHRoZXJlIGFyZSBmcmVlIHNsb3RzIGZvciBhIGZyYW1lIHRvIHRyYW5zbWl0LiBJZiBub3QsCisJICAgdGhlIHVwcGVyIGxheWVyIGlzIGluIGRlZXAgZGVzcGVyYXRpb24gYW5kIHdlIHNpbXBseSBpZ25vcmUgdGhlIGZyYW1lLiAqLworCisJaWYgKHByaXYtPnR4dXNlZGNudCA+PSBUWEJVRkNOVCkgeworCQlyZXR2YWwgPSAtRUlPOworCQlwcml2LT5zdGF0LnR4X2Ryb3BwZWQrKzsKKwkJZ290byB0eF9kb25lOworCX0KKworCS8qIGNvcHkgdGhlIGZyYW1lIGRhdGEgaW50byB0aGUgbmV4dCBmcmVlIHRyYW5zbWl0IGJ1ZmZlciAtIGZpbGx1cCBtaXNzaW5nICovCisJdG1wbGVuID0gc2tiLT5sZW47CisJaWYgKHRtcGxlbiA8IDYwKQorCQl0bXBsZW4gPSA2MDsKKwliYWRkciA9IHByaXYtPnR4YnVmc3RhcnQgKyAocHJpdi0+bmV4dHR4ZGVzY3IgKiBQS1RTSVpFKTsKKwltZW1jcHlfdG9pbyhwcml2LT5iYXNlICsgYmFkZHIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCisJLyogY29weSBmaWxsZXIgaW50byBSQU0gLSBpbiBjYXNlIHdlJ3JlIGZpbGxpbmcgdXAuLi4gCisJICAgd2UncmUgZmlsbGluZyBhIGJpdCBtb3JlIHRoYW4gbmVjZXNzYXJ5LCBidXQgdGhhdCBkb2Vzbid0IGhhcm0KKwkgICBzaW5jZSB0aGUgYnVmZmVyIGlzIGZhciBsYXJnZXIuLi4gCisJICAgU29ycnkgTGludXMgZm9yIHRoZSBmaWxsZXIgc3RyaW5nIGJ1dCBJIGNvdWxkbid0IHJlc2lzdCA7LSkgKi8KKworCWlmICh0bXBsZW4gPiBza2ItPmxlbikgeworCQljaGFyICpmaWxsID0gIk5ldEJTRCBpcyBhIG5pY2UgT1MgdG9vISAiOworCQl1bnNpZ25lZCBpbnQgZGVzdG9mZnMgPSBza2ItPmxlbiwgbCA9IHN0cmxlbihmaWxsKTsKKworCQl3aGlsZSAoZGVzdG9mZnMgPCB0bXBsZW4pIHsKKwkJCW1lbWNweV90b2lvKHByaXYtPmJhc2UgKyBiYWRkciArIGRlc3RvZmZzLCBmaWxsLCBsKTsKKwkJCWRlc3RvZmZzICs9IGw7CisJCX0KKwl9CisKKwkvKiBzZXQgdXAgdGhlIG5ldyBmcmFtZSBkZXNjcmlwdG9yICovCisJYWRkciA9IHByaXYtPnRkYXN0YXJ0ICsgKHByaXYtPm5leHR0eGRlc2NyICogc2l6ZW9mKHRkYV90KSk7CisJbWVtY3B5X2Zyb21pbygmdGRhLCBwcml2LT5iYXNlICsgYWRkciwgc2l6ZW9mKHRkYV90KSk7CisJdGRhLmxlbmd0aCA9IHRkYS5mcmFnbGVuZ3RoID0gdG1wbGVuOworCW1lbWNweV90b2lvKHByaXYtPmJhc2UgKyBhZGRyLCAmdGRhLCBzaXplb2YodGRhX3QpKTsKKworCS8qIGlmIHRoZXJlIHdlcmUgbm8gYWN0aXZlIGRlc2NyaXB0b3JzLCB0cmlnZ2VyIHRoZSBTT05JQyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlwcml2LT50eHVzZWRjbnQrKzsKKwlwcml2LT50eHVzZWRbcHJpdi0+bmV4dHR4ZGVzY3JdID0gMTsKKworCS8qIGFyZSBhbGwgdHJhbnNtaXNzaW9uIHNsb3RzIHVzZWQgdXAgPyAqLworCWlmIChwcml2LT50eHVzZWRjbnQgPj0gVFhCVUZDTlQpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmIChwcml2LT50eHVzZWRjbnQgPT0gMSkKKwkJU3RhcnRUeChkZXYsIHByaXYtPm5leHR0eGRlc2NyKTsKKwlwcml2LT5uZXh0dHhkZXNjciA9IChwcml2LT5uZXh0dHhkZXNjciArIDEpICUgVFhCVUZDTlQ7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Cit0eF9kb25lOgorCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiByZXR1cm4gcG9pbnRlciB0byBFdGhlcm5ldCBzdGF0aXN0aWNzICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaWJtbGFuYV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlibWxhbmFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuICZwcml2LT5zdGF0OworfQorCisvKiBzd2l0Y2ggcmVjZWl2ZXIgbW9kZS4gKi8KKworc3RhdGljIHZvaWQgaWJtbGFuYV9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBmaXJzdCBzdG9wIHRoZSBTT05JQy4uLiAqLworCVN0b3BTT05JQyhkZXYpOworCS8qIC4uLnRoZW4gcmVpbml0IGl0IHdpdGggdGhlIG5ldyBmbGFncyAqLworCUluaXRCb2FyZChkZXYpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGhhcmR3YXJlIGNoZWNrCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBzdGFydHNsb3Q7CQkvKiBjb3VudHMgdGhyb3VnaCBzbG90cyB3aGVuIHByb2JpbmcgbXVsdGlwbGUgZGV2aWNlcyAqLworCitzdGF0aWMgaW50IGlibWxhbmFfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgc2xvdCwgejsKKwlpbnQgYmFzZSA9IDAsIGlycSA9IDAsIGlvYmFzZSA9IDAsIG1lbWxlbiA9IDA7CisJaWJtbGFuYV9wcml2ICpwcml2OworCWlibWxhbmFfbWVkaXVtIG1lZGl1bTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCS8qIGNhbid0IHdvcmsgd2l0aG91dCBhbiBNQ0EgYnVzIDstKSAqLworCWlmIChNQ0FfYnVzID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJYmFzZSA9IGRldi0+bWVtX3N0YXJ0OworCWlycSA9IGRldi0+aXJxOworCisJZm9yIChzbG90ID0gc3RhcnRzbG90OyAoc2xvdCA9IG1jYV9maW5kX2FkYXB0ZXIoSUJNX0xBTkFfSUQsIHNsb3QpKSAhPSAtMTsgc2xvdCsrKSB7CisJCS8qIGRlZHVjZSBjYXJkIGFkZHJlc3NlcyAqLworCQlnZXRhZGRycyhzbG90LCAmYmFzZSwgJm1lbWxlbiwgJmlvYmFzZSwgJmlycSwgJm1lZGl1bSk7CisKKwkJLyogc2xvdCBhbHJlYWR5IGluIHVzZSA/ICovCisJCWlmIChtY2FfaXNfYWRhcHRlcl91c2VkKHNsb3QpKQorCQkJY29udGludWU7CisJCS8qIHdlcmUgd2UgbG9va2luZyBmb3Igc29tZXRoaW5nIGRpZmZlcmVudCA/ICovCisJCWlmIChkZXYtPmlycSAmJiBkZXYtPmlycSAhPSBpcnEpCisJCQljb250aW51ZTsKKwkJaWYgKGRldi0+bWVtX3N0YXJ0ICYmIGRldi0+bWVtX3N0YXJ0ICE9IGJhc2UpCisJCQljb250aW51ZTsKKwkJLyogZm91bmQgc29tZXRoaW5nIHRoYXQgbWF0Y2hlcyAqLworCQlicmVhazsKKwl9CisKKwkvKiBub3RoaW5nIGZvdW5kID8gKi8KKwlpZiAoc2xvdCA9PSAtMSkKKwkJcmV0dXJuIChiYXNlICE9IDAgfHwgaXJxICE9IDApID8gLUVOWElPIDogLUVOT0RFVjsKKworCS8qIGFubm91bmNlIHN1Y2Nlc3MgKi8KKwlwcmludGsoS0VSTl9JTkZPICIlczogSUJNIExBTiBBZGFwdGVyL0EgZm91bmQgaW4gc2xvdCAlZFxuIiwgZGV2LT5uYW1lLCBzbG90ICsgMSk7CisKKwkvKiB0cnkgdG8gb2J0YWluIEkvTyByYW5nZSAqLworCWlmICghcmVxdWVzdF9yZWdpb24oaW9iYXNlLCBJQk1fTEFOQV9JT1JBTkdFLCBEUlZfTkFNRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IGFsbG9jYXRlIEkvTyByYW5nZSBhdCAlI3ghXG4iLCBEUlZfTkFNRSwgaW9iYXNlKTsKKwkJc3RhcnRzbG90ID0gc2xvdCArIDE7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcHJpdi0+c2xvdCA9IHNsb3Q7CisJcHJpdi0+cmVhbGlycSA9IGlycTsKKwlwcml2LT5tZWRpdW0gPSBtZWRpdW07CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOworCQkKKworCS8qIHNldCBiYXNlICsgaXJxIGZvciB0aGlzIGRldmljZSAoaXJxIG5vdCBhbGxvY2F0ZWQgc28gZmFyKSAqLworCisJZGV2LT5pcnEgPSAwOworCWRldi0+bWVtX3N0YXJ0ID0gYmFzZTsKKwlkZXYtPm1lbV9lbmQgPSBiYXNlICsgbWVtbGVuOworCWRldi0+YmFzZV9hZGRyID0gaW9iYXNlOworCisJcHJpdi0+YmFzZSA9IGlvcmVtYXAoYmFzZSwgbWVtbGVuKTsKKwlpZiAoIXByaXYtPmJhc2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IHJlbWFwIG1lbW9yeSFcbiIsIERSVl9OQU1FKTsKKwkJc3RhcnRzbG90ID0gc2xvdCArIDE7CisJCXJlbGVhc2VfcmVnaW9uKGlvYmFzZSwgSUJNX0xBTkFfSU9SQU5HRSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogbWFrZSBwcm9jZnMgZW50cmllcyAqLworCW1jYV9zZXRfYWRhcHRlcl9uYW1lKHNsb3QsICJJQk0gTEFOIEFkYXB0ZXIvQSIpOworCW1jYV9zZXRfYWRhcHRlcl9wcm9jZm4oc2xvdCwgKE1DQV9Qcm9jRm4pIGlibWxhbmFfZ2V0aW5mbywgZGV2KTsKKworCW1jYV9tYXJrX2FzX3VzZWQoc2xvdCk7CisKKwkvKiBzZXQgbWV0aG9kcyAqLworCisJZGV2LT5vcGVuID0gaWJtbGFuYV9vcGVuOworCWRldi0+c3RvcCA9IGlibWxhbmFfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBpYm1sYW5hX3R4OworCWRldi0+ZG9faW9jdGwgPSBOVUxMOworCWRldi0+Z2V0X3N0YXRzID0gaWJtbGFuYV9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGlibWxhbmFfc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+ZmxhZ3MgfD0gSUZGX01VTFRJQ0FTVDsKKworCS8qIGNvcHkgb3V0IE1BQyBhZGRyZXNzICovCisKKwlmb3IgKHogPSAwOyB6IDwgc2l6ZW9mKGRldi0+ZGV2X2FkZHIpOyB6KyspCisJCWRldi0+ZGV2X2FkZHJbel0gPSBpbmIoZGV2LT5iYXNlX2FkZHIgKyBNQUNBRERSUFJPTSArIHopOworCisJLyogcHJpbnQgY29uZmlnICovCisKKwlwcmludGsoS0VSTl9JTkZPICIlczogSVJRICVkLCBJL08gJSNseCwgbWVtb3J5ICUjbHgtJSNseCwgIgorCSAgICAgICAiTUFDIGFkZHJlc3MgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnguXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHByaXYtPnJlYWxpcnEsIGRldi0+YmFzZV9hZGRyLAorCSAgICAgICBkZXYtPm1lbV9zdGFydCwgZGV2LT5tZW1fZW5kIC0gMSwKKwkgICAgICAgZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKKwkgICAgICAgZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIG1lZGl1bVxuIiwgZGV2LT5uYW1lLCBNZWRpYU5hbWVzW3ByaXYtPm1lZGl1bV0pOworCisJLyogcmVzZXQgYm9hcmQgKi8KKworCVJlc2V0Qm9hcmQoZGV2KTsKKworCS8qIG5leHQgcHJvYmUgd2lsbCBzdGFydCBhdCBuZXh0IHNsb3QgKi8KKworCXN0YXJ0c2xvdCA9IHNsb3QgKyAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogbW9kdWxhcml6YXRpb24gc3VwcG9ydAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBNT0RVTEUKKworI2RlZmluZSBERVZNQVggNQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKm1vZGRldnNbREVWTUFYXTsKK3N0YXRpYyBpbnQgaXJxOworc3RhdGljIGludCBpbzsKKworbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSUJNIExBTi9BIElSUSBudW1iZXIiKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJJQk0gTEFOL0EgSS9PIGJhc2UgYWRkcmVzcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgejsKKworCXN0YXJ0c2xvdCA9IDA7CisJZm9yICh6ID0gMDsgeiA8IERFVk1BWDsgeisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoaWJtbGFuYV9wcml2KSk7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisJCWRldi0+aXJxID0gaXJxOworCQlkZXYtPmJhc2VfYWRkciA9IGlvOworCQlpZiAoaWJtbGFuYV9wcm9iZShkZXYpKSB7CisJCQlmcmVlX25ldGRldihkZXYpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CisJCQlpYm1sYW5hX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCQkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIElCTV9MQU5BX0lPUkFOR0UpOworCQkJbWNhX21hcmtfYXNfdW51c2VkKHByaXYtPnNsb3QpOworCQkJbWNhX3NldF9hZGFwdGVyX25hbWUocHJpdi0+c2xvdCwgIiIpOworCQkJbWNhX3NldF9hZGFwdGVyX3Byb2Nmbihwcml2LT5zbG90LCBOVUxMLCBOVUxMKTsKKwkJCWlvdW5tYXAocHJpdi0+YmFzZSk7CisJCQlmcmVlX25ldGRldihkZXYpOworCQkJYnJlYWs7CisJCX0KKwkJbW9kZGV2c1t6XSA9IGRldjsKKwl9CisJcmV0dXJuICh6ID4gMCkgPyAwIDogLUVJTzsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWludCB6OworCWZvciAoeiA9IDA7IHogPCBERVZNQVg7IHorKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbW9kZGV2c1t6XTsKKwkJaWYgKGRldikgeworCQkJaWJtbGFuYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQkvKkRlaW5pdEJvYXJkKGRldik7ICovCisJCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgSUJNX0xBTkFfSU9SQU5HRSk7CisJCQltY2FfbWFya19hc191bnVzZWQocHJpdi0+c2xvdCk7CisJCQltY2Ffc2V0X2FkYXB0ZXJfbmFtZShwcml2LT5zbG90LCAiIik7CisJCQltY2Ffc2V0X2FkYXB0ZXJfcHJvY2ZuKHByaXYtPnNsb3QsIE5VTEwsIE5VTEwpOworCQkJaW91bm1hcChwcml2LT5iYXNlKTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9Cit9CisjZW5kaWYJCQkJLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1sYW5hLmggYi9kcml2ZXJzL25ldC9pYm1sYW5hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU4ZWUyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2libWxhbmEuaApAQCAtMCwwICsxLDI3OSBAQAorI2lmbmRlZiBfSUJNX0xBTkFfSU5DTFVERV8KKyNkZWZpbmUgX0lCTV9MQU5BX0lOQ0xVREVfCisKKyNpZmRlZiBfSUJNX0xBTkFfRFJJVkVSXworCisvKiBtYXhpbXVtIHBhY2tldCBzaXplICovCisKKyNkZWZpbmUgUEtUU0laRSAxNTI0CisKKy8qIG51bWJlciBvZiB0cmFuc21pdCBidWZmZXJzICovCisKKyNkZWZpbmUgVFhCVUZDTlQgNAorCisvKiBBZGFwdGVyIElEJ3MgKi8KKyNkZWZpbmUgSUJNX0xBTkFfSUQgMHhmZmUwCisKKy8qIG1lZGlhIGVudW1lcmF0aW9uIC0gZGVmaW5lZCBpbiBhIHdheSB0aGF0IGl0IGZpdHMgb250byB0aGUgTEFOL0EncworICAgUE9TIHJlZ2lzdGVycy4uLiAqLworCit0eXBlZGVmIGVudW0geyAKKwlNZWRpYV8xMEJhc2VULCBNZWRpYV8xMEJhc2U1LAorCU1lZGlhX1Vua25vd24sIE1lZGlhXzEwQmFzZTIsIE1lZGlhX0NvdW50Cit9IGlibWxhbmFfbWVkaXVtOworCisvKiBwcml2YXRlIHN0cnVjdHVyZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IHNsb3Q7CQkvKiBNQ0EtU2xvdC0jICAgICAgICAgICAgICAgICAgICAgICAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXQ7CS8qIHBhY2tldCBzdGF0aXN0aWNzICAgICAgICAgICAgKi8KKwlpbnQgcmVhbGlycTsJCQkvKiBtZW1vcml6ZXMgYWN0dWFsIElSUSwgZXZlbiB3aGVuIAorCQkJCQkgICBjdXJyZW50bHkgbm90IGFsbG9jYXRlZCAgICAgICAgICAqLworCWlibWxhbmFfbWVkaXVtIG1lZGl1bTsJCS8qIHBoeXNpY2FsIGNhbm5lY3RvciAgICAgICAgICAgICAgICovCisJdTMyIAl0ZGFzdGFydCwgdHhidWZzdGFydCwJLyogYWRkcmVzc2VzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJcnJhc3RhcnQsIHJ4YnVmc3RhcnQsIHJkYXN0YXJ0LCByeGJ1ZmNudCwgdHh1c2VkY250OworCWludCAJbmV4dHJ4ZGVzY3IsCQkvKiBuZXh0IHJ4IGRlc2NyaXB0b3IgdG8gYmUgdXNlZCAgICAqLworCQlsYXN0cnhkZXNjciwJCS8qIGxhc3QgZnJlZSByeCBkZXNjcmlwdG9yICAgICAgICAgICovCisJCW5leHR0eGRlc2NyLAkJLyogbGFzdCB0eCBkZXNjcmlwdG9yIHRvIGJlIHVzZWQgICAgKi8KKwkJY3VycnR4ZGVzY3IsCQkvKiB0eCBkZXNjcmlwdG9yIGN1cnJlbnRseSB0eCdlZCAgICAqLworCQl0eHVzZWRbVFhCVUZDTlRdOwkvKiBidXN5IGZsYWdzICAgICAgICAgICAgICAgICAgICAgICAqLworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlzcGlubG9ja190IGxvY2s7Cit9IGlibWxhbmFfcHJpdjsKKworLyogdGhpcyBjYXJkIHVzZXMgcXVpdGUgYSBsb3Qgb2YgSS9PIHBvcnRzLi4ubHVja2lseSB0aGUgTUNBIGJ1cyBkZWNvZGVzIAorICAgYSBmdWxsIDY0SyBJL08gcmFuZ2UuLi4gKi8KKworI2RlZmluZSBJQk1fTEFOQV9JT1JBTkdFIDB4YTAKKworLyogQ29tbWFuZCBSZWdpc3RlcjogKi8KKworI2RlZmluZSBTT05JQ19DTURSRUcgICAgIDB4MDAKKyNkZWZpbmUgQ01EUkVHX0hUWCAgICAgICAweDAwMDEJLyogaGFsdCB0cmFuc21pc3Npb24gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ01EUkVHX1RYUCAgICAgICAweDAwMDIJLyogc3RhcnQgdHJhbnNtaXNzaW9uICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ01EUkVHX1JYRElTICAgICAweDAwMDQJLyogZGlzYWJsZSByZWNlaXZlciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ01EUkVHX1JYRU4gICAgICAweDAwMDgJLyogZW5hYmxlIHJlY2VpdmVyICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ01EUkVHX1NUUCAgICAgICAweDAwMTAJLyogc3RvcCB0aW1lciAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ01EUkVHX1NUICAgICAgICAweDAwMjAJLyogc3RhcnQgdGltZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ01EUkVHX1JTVCAgICAgICAweDAwODAJLyogc29mdHdhcmUgcmVzZXQgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ01EUkVHX1JSUkEgICAgICAweDAxMDAJLyogZm9yY2UgU09OSUMgdG8gcmVhZCBmaXJzdCBSUkEgICAgKi8KKyNkZWZpbmUgQ01EUkVHX0xDQU0gICAgICAweDAyMDAJLyogZm9yY2UgU09OSUMgdG8gcmVhZCBDQU0gZGVzY3JzICAgKi8KKworLyogRGF0YSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgU09OSUNfRENSRUcgICAgICAweDAyCisjZGVmaW5lIERDUkVHX0VYQlVTICAgICAgMHg4MDAwCS8qIEV4dGVuZGVkIEJ1cyBNb2RlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHX0xCUiAgICAgICAgMHgyMDAwCS8qIExhdGNoZWQgQnVzIFJldHJ5ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHX1BPMSAgICAgICAgMHgxMDAwCS8qIFByb2dyYW1tYWJsZSBPdXRwdXRzICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHX1BPMCAgICAgICAgMHgwODAwCisjZGVmaW5lIERDUkVHX1NCVVMgICAgICAgMHgwNDAwCS8qIFN5bmNocm9ub3VzIEJ1cyBNb2RlICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHX1VTUjEgICAgICAgMHgwMjAwCS8qIFVzZXIgRGVmaW5hYmxlIFBpbnMgICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHX1VTUjAgICAgICAgMHgwMTAwCisjZGVmaW5lIERDUkVHX1dDMCAgICAgICAgMHgwMDAwCS8qIDAuLjMgV2FpdCBTdGF0ZXMgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHX1dDMSAgICAgICAgMHgwMDQwCisjZGVmaW5lIERDUkVHX1dDMiAgICAgICAgMHgwMDgwCisjZGVmaW5lIERDUkVHX1dDMyAgICAgICAgMHgwMGMwCisjZGVmaW5lIERDUkVHX0RXMTYgICAgICAgMHgwMDAwCS8qIDE2IGJpdCBCdXMgTW9kZSAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHX0RXMzIgICAgICAgMHgwMDIwCS8qIDMyIGJpdCBCdXMgTW9kZSAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHX0JNUyAgICAgICAgMHgwMDEwCS8qIEJsb2NrIE1vZGUgU2VsZWN0ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHX1JGVDQgICAgICAgMHgwMDAwCS8qIDQvOC8xNi8yNCBieXRlcyBSWCAgVGhyZXNob2xkICAgICovCisjZGVmaW5lIERDUkVHX1JGVDggICAgICAgMHgwMDA0CisjZGVmaW5lIERDUkVHX1JGVDE2ICAgICAgMHgwMDA4CisjZGVmaW5lIERDUkVHX1JGVDI0ICAgICAgMHgwMDBjCisjZGVmaW5lIERDUkVHX1RGVDggICAgICAgMHgwMDAwCS8qIDgvMTYvMjQvMjggYnl0ZXMgVFggVGhyZXNob2xkICAgICovCisjZGVmaW5lIERDUkVHX1RGVDE2ICAgICAgMHgwMDAxCisjZGVmaW5lIERDUkVHX1RGVDI0ICAgICAgMHgwMDAyCisjZGVmaW5lIERDUkVHX1RGVDI4ICAgICAgMHgwMDAzCisKKy8qIFJlY2VpdmUgQ29udHJvbCBSZWdpc3RlciAqLworCisjZGVmaW5lIFNPTklDX1JDUkVHICAgICAgMHgwNAorI2RlZmluZSBSQ1JFR19FUlIgICAgICAgIDB4ODAwMAkvKiBhY2NlcHQgZGFtYWdlZCBhbmQgY29sbGlkZWQgcGt0cyAqLworI2RlZmluZSBSQ1JFR19STlQgICAgICAgIDB4NDAwMAkvKiBhY2NlcHQgcGFja2V0cyB0aGF0IGFyZSA8IDY0ICAgICAqLworI2RlZmluZSBSQ1JFR19CUkQgICAgICAgIDB4MjAwMAkvKiBhY2NlcHQgYnJvYWRjYXN0cyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19QUk8gICAgICAgIDB4MTAwMAkvKiBwcm9taXNjb3VzIG1vZGUgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19BTUMgICAgICAgIDB4MDgwMAkvKiBhY2NlcHQgYWxsIG11bHRpY2FzdHMgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19MQl9OT05FICAgIDB4MDAwMAkvKiBubyBsb29wYmFjayAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19MQl9NQUMgICAgIDB4MDIwMAkvKiBNQUMgbG9vcGJhY2sgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19MQl9FTkRFQyAgIDB4MDQwMAkvKiBFTkRFQyBsb29wYmFjayAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19MQl9YVlIgICAgIDB4MDYwMAkvKiBUcmFuc2NlaXZlciBsb29wYmFjayAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19NQyAgICAgICAgIDB4MDEwMAkvKiBNdWx0aWNhc3QgcmVjZWl2ZWQgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19CQyAgICAgICAgIDB4MDA4MAkvKiBCcm9hZGNhc3QgcmVjZWl2ZWQgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19MUEtUICAgICAgIDB4MDA0MAkvKiBsYXN0IHBhY2tldCBpbiBSQkEgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19DUlMgICAgICAgIDB4MDAyMAkvKiBjYXJyaWVyIHNlbnNlIHByZXNlbnQgICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19DT0wgICAgICAgIDB4MDAxMAkvKiByZWN2J2QgcGFja2V0IHdpdGggY29sbGlzaW9uICAgICAqLworI2RlZmluZSBSQ1JFR19DUkNSICAgICAgIDB4MDAwOAkvKiByZWN2J2QgcGFja2V0IHdpdGggQ1JDIGVycm9yICAgICAqLworI2RlZmluZSBSQ1JFR19GQUVSICAgICAgIDB4MDAwNAkvKiByZWN2J2QgcGFja2V0IHdpdGggaW52LiBmcmFtaW5nICAqLworI2RlZmluZSBSQ1JFR19MQksgICAgICAgIDB4MDAwMgkvKiByZWN2J2QgbG9vcGJhY2sgcGFja2V0ICAgICAgICAgICAqLworI2RlZmluZSBSQ1JFR19QUlggICAgICAgIDB4MDAwMQkvKiByZWN2J2QgcGFja2V0IGlzIE9LICAgICAgICAgICAgICAqLworCisvKiBUcmFuc21pdCBDb250cm9sIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgU09OSUNfVENSRUcgICAgICAweDA2CisjZGVmaW5lIFRDUkVHX1BJTlQgICAgICAgMHg4MDAwCS8qIGdlbmVyYXRlIGludGVycnVwdCBhZnRlciBUREEgcmVhZCAqLworI2RlZmluZSBUQ1JFR19QT1dDICAgICAgIDB4NDAwMAkvKiB0aW1lciBzdGFydCBvdXQgb2Ygd2luZG93IGRldGVjdCAqLworI2RlZmluZSBUQ1JFR19DUkNJICAgICAgIDB4MjAwMAkvKiBpbmhpYml0IENSQyBnZW5lcmF0aW9uICAgICAgICAgICAqLworI2RlZmluZSBUQ1JFR19FWERJUyAgICAgIDB4MTAwMAkvKiBkaXNhYmxlIGV4Y2Vzc2l2ZSBkZWZlcnJhbCB0aW1lciAqLworI2RlZmluZSBUQ1JFR19FWEQgICAgICAgIDB4MDQwMAkvKiBleGNlc3NpdmUgZGVmZXJyYWwgb2NjdXJyZWQgICAgICAgKi8KKyNkZWZpbmUgVENSRUdfREVGICAgICAgICAweDAyMDAJLyogc2luZ2xlIGRlZmVycmFsIG9jY3VycmVkICAgICAgICAgICovCisjZGVmaW5lIFRDUkVHX05DUlMgICAgICAgMHgwMTAwCS8qIG5vIGNhcnJpZXIgZGV0ZWN0ZWQgICAgICAgICAgICAgICovCisjZGVmaW5lIFRDUkVHX0NSU0wgICAgICAgMHgwMDgwCS8qIGNhcnJpZXIgbG9zdCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRDUkVHX0VYQyAgICAgICAgMHgwMDQwCS8qIGV4Y2Vzc2l2ZSBjb2xsaXNpb25zIG9jY3VycmVkICAgICAqLworI2RlZmluZSBUQ1JFR19PV0MgICAgICAgIDB4MDAyMAkvKiBvdXQgb2Ygd2luZG93IGNvbGxpc2lvbiBvY2N1cnJlZCAgKi8KKyNkZWZpbmUgVENSRUdfUE1CICAgICAgICAweDAwMDgJLyogcGFja2V0IG1vbml0b3JlZCBiYWQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVENSRUdfRlUgICAgICAgICAweDAwMDQJLyogRklGTyB1bmRlcnJ1biAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVENSRUdfQkNNICAgICAgICAweDAwMDIJLyogYnl0ZSBjb3VudCBtaXNtYXRjaCBvZiBmcmFnbWVudHMgKi8KKyNkZWZpbmUgVENSRUdfUFRYICAgICAgICAweDAwMDEJLyogcGFja2V0IHRyYW5zbWl0dGVkIE9LICAgICAgICAgICAgKi8KKworLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBTT05JQ19JTVJFRyAgICAgIDB4MDgKKyNkZWZpbmUgSU1SRUdfQlJFTiAgICAgICAweDQwMDAJLyogaW50ZXJydXB0IHdoZW4gYnVzIHJldHJ5IG9jY3VycmVkICovCisjZGVmaW5lIElNUkVHX0hCTEVOICAgICAgMHgyMDAwCS8qIGludGVycnVwdCB3aGVuIGhlYXJ0YmVhdCBsb3N0ICAgICovCisjZGVmaW5lIElNUkVHX0xDREVOICAgICAgMHgxMDAwCS8qIGludGVycnVwdCB3aGVuIENBTSBsb2FkZWQgICAgICAgICovCisjZGVmaW5lIElNUkVHX1BJTlRFTiAgICAgMHgwODAwCS8qIGludGVycnVwdCB3aGVuIFBJTlQgaW4gVERBIHNldCAgICovCisjZGVmaW5lIElNUkVHX1BSWEVOICAgICAgMHgwNDAwCS8qIGludGVycnVwdCB3aGVuIHBhY2tldCByZWNlaXZlZCAgICovCisjZGVmaW5lIElNUkVHX1BUWEVOICAgICAgMHgwMjAwCS8qIGludGVycnVwdCB3aGVuIHBhY2tldCB3YXMgc2VudCAgICovCisjZGVmaW5lIElNUkVHX1RYRVJFTiAgICAgMHgwMTAwCS8qIGludGVycnVwdCB3aGVuIHNlbmQgZmFpbGVkICAgICAgICovCisjZGVmaW5lIElNUkVHX1RDRU4gICAgICAgMHgwMDgwCS8qIGludGVycnVwdCB3aGVuIHRpbWVyIGNvbXBsZXRlZCAgICovCisjZGVmaW5lIElNUkVHX1JERUVOICAgICAgMHgwMDQwCS8qIGludGVycnVwdCB3aGVuIFJEQSBleGhhdXN0ZWQgICAgICovCisjZGVmaW5lIElNUkVHX1JCRUVOICAgICAgMHgwMDIwCS8qIGludGVycnVwdCB3aGVuIFJCQSBleGhhdXN0ZWQgICAgICovCisjZGVmaW5lIElNUkVHX1JCQUVFTiAgICAgMHgwMDEwCS8qIGludGVycnVwdCB3aGVuIFJCQSB0b28gc2hvcnQgICAgICovCisjZGVmaW5lIElNUkVHX0NSQ0VOICAgICAgMHgwMDA4CS8qIGludGVycnVwdCB3aGVuIENSQyBjb3VudGVyIHJvbGxzICovCisjZGVmaW5lIElNUkVHX0ZBRUVOICAgICAgMHgwMDA0CS8qIGludGVycnVwdCB3aGVuIEZBRSBjb3VudGVyIHJvbGxzICovCisjZGVmaW5lIElNUkVHX01QRU4gICAgICAgMHgwMDAyCS8qIGludGVycnVwdCB3aGVuIE1QIGNvdW50ZXIgcm9sbHMgICovCisjZGVmaW5lIElNUkVHX1JGT0VOICAgICAgMHgwMDAxCS8qIGludGVycnVwdCB3aGVuIFJ4IEZJRk8gb3ZlcmZsb3dzICovCisKKy8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBTT05JQ19JU1JFRyAgICAgIDB4MGEKKyNkZWZpbmUgSVNSRUdfQlIgICAgICAgICAweDQwMDAJLyogYnVzIHJldHJ5IG9jY3VycmVkICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX0hCTCAgICAgICAgMHgyMDAwCS8qIGhlYXJ0YmVhdCBsb3N0ICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX0xDRCAgICAgICAgMHgxMDAwCS8qIENBTSBsb2FkZWQgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX1BJTlQgICAgICAgMHgwODAwCS8qIFBJTlQgaW4gVERBIHNldCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX1BLVFJYICAgICAgMHgwNDAwCS8qIHBhY2tldCByZWNlaXZlZCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX1RYRE4gICAgICAgMHgwMjAwCS8qIHBhY2tldCB3YXMgc2VudCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX1RYRVIgICAgICAgMHgwMTAwCS8qIHNlbmQgZmFpbGVkICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX1RDICAgICAgICAgMHgwMDgwCS8qIHRpbWVyIGNvbXBsZXRlZCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX1JERSAgICAgICAgMHgwMDQwCS8qIFJEQSBleGhhdXN0ZWQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX1JCRSAgICAgICAgMHgwMDIwCS8qIFJCQSBleGhhdXN0ZWQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX1JCQUUgICAgICAgMHgwMDEwCS8qIFJCQSB0b28gc2hvcnQgZm9yIHJlY2VpdmVkIGZyYW1lICovCisjZGVmaW5lIElTUkVHX0NSQyAgICAgICAgMHgwMDA4CS8qIENSQyBjb3VudGVyIHJvbGxzIG92ZXIgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX0ZBRSAgICAgICAgMHgwMDA0CS8qIEZBRSBjb3VudGVyIHJvbGxzIG92ZXIgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX01QICAgICAgICAgMHgwMDAyCS8qIE1QIGNvdW50ZXIgcm9sbHMgIG92ZXIgICAgICAgICAgICovCisjZGVmaW5lIElTUkVHX1JGTyAgICAgICAgMHgwMDAxCS8qIFJ4IEZJRk8gb3ZlcmZsb3dzICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgU09OSUNfVVREQSAgICAgICAweDBjCS8qIGN1cnJlbnQgdHJhbnNtaXQgZGVzY3IgYWRkcmVzcyAgICovCisjZGVmaW5lIFNPTklDX0NUREEgICAgICAgMHgwZQorCisjZGVmaW5lIFNPTklDX1VSREEgICAgICAgMHgxYQkvKiBjdXJyZW50IHJlY2VpdmUgZGVzY3IgYWRkcmVzcyAgICAqLworI2RlZmluZSBTT05JQ19DUkRBICAgICAgIDB4MWMKKworI2RlZmluZSBTT05JQ19DUkJBMCAgICAgIDB4MWUJLyogY3VycmVudCByZWNlaXZlIGJ1ZmZlciBhZGRyZXNzICAgKi8KKyNkZWZpbmUgU09OSUNfQ1JCQTEgICAgICAweDIwCisKKyNkZWZpbmUgU09OSUNfUkJXQzAgICAgICAweDIyCS8qIHdvcmQgY291bnQgaW4gcmVjZWl2ZSBidWZmZXIgICAgICovCisjZGVmaW5lIFNPTklDX1JCV0MxICAgICAgMHgyNAorCisjZGVmaW5lIFNPTklDX0VPQkMgICAgICAgMHgyNgkvKiBtaW5pbXVtIHNwYWNlIHRvIGJlIGZyZWUgaW4gUkJBICAqLworCisjZGVmaW5lIFNPTklDX1VSUkEgICAgICAgMHgyOAkvKiB1cHBlciBhZGRyZXNzIG9mIENEQSAmIFJlY3YgQXJlYSAqLworCisjZGVmaW5lIFNPTklDX1JTQSAgICAgICAgMHgyYQkvKiBzdGFydCBvZiByZWNlaXZlIHJlc291cmNlIGFyZWEgICAqLworCisjZGVmaW5lIFNPTklDX1JFQSAgICAgICAgMHgyYwkvKiBlbmQgb2YgcmVjZWl2ZSByZXNvdXJjZSBhcmVhICAgICAqLworCisjZGVmaW5lIFNPTklDX1JSUCAgICAgICAgMHgyZQkvKiByZXNvdXJjZSByZWFkIHBvaW50ZXIgICAgICAgICAgICAqLworCisjZGVmaW5lIFNPTklDX1JXUCAgICAgICAgMHgzMAkvKiByZXNvdXJjZSB3cml0ZSBwb2ludGVyICAgICAgICAgICAqLworCisjZGVmaW5lIFNPTklDX0NBTUVQVFIgICAgMHg0MgkvKiBDQU0gZW50cnkgcG9pbnRlciAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFNPTklDX0NBTUFERFIyICAgMHg0NAkvKiBDQU0gYWRkcmVzcyBwb3J0cyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTT05JQ19DQU1BRERSMSAgIDB4NDYKKyNkZWZpbmUgU09OSUNfQ0FNQUREUjAgICAweDQ4CisKKyNkZWZpbmUgU09OSUNfQ0FNUFRSICAgICAweDRjCS8qIGxvd2VyIGFkZHJlc3Mgb2YgQ0RBICAgICAgICAgICAgICovCisKKyNkZWZpbmUgU09OSUNfQ0FNQ05UICAgICAweDRlCS8qICMgb2YgQ0FNIGRlc2NyaXB0b3JzIHRvIGxvYWQgICAgICovCisKKy8qIERhdGEgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyICAgICovCisKKyNkZWZpbmUgU09OSUNfRENSRUcyICAgICAweDdlCisjZGVmaW5lIERDUkVHMl9FWFBPMyAgICAgMHg4MDAwCS8qIGV4dGVuZGVkIHByb2dyYW1tYWJsZSBvdXRwdXRzICAgICovCisjZGVmaW5lIERDUkVHMl9FWFBPMiAgICAgMHg0MDAwCisjZGVmaW5lIERDUkVHMl9FWFBPMSAgICAgMHgyMDAwCisjZGVmaW5lIERDUkVHMl9FWFBPMCAgICAgMHgxMDAwCisjZGVmaW5lIERDUkVHMl9IRCAgICAgICAgMHgwODAwCS8qIGhlYXJ0YmVhdCBkaXNhYmxlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHMl9KRCAgICAgICAgMHgwMjAwCS8qIGphYmJlciB0aW1lciBkaXNhYmxlICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHMl9BVVRPICAgICAgMHgwMTAwCS8qIGVuYWJsZSBBVUkvVFAgYXV0byBzZWxlY3Rpb24gICAgICovCisjZGVmaW5lIERDUkVHMl9YV1JBUCAgICAgMHgwMDQwCS8qIFRQIHRyYW5zY2VpdmVyIGxvb3BiYWNrICAgICAgICAgICovCisjZGVmaW5lIERDUkVHMl9QSCAgICAgICAgMHgwMDEwCS8qIEhPTEQgcmVxdWVzdCB0aW1pbmcgICAgICAgICAgICAgICovCisjZGVmaW5lIERDUkVHMl9QQ00gICAgICAgMHgwMDA0CS8qIHBhY2tldCBjb21wcmVzcyB3aGVuIG1hdGNoZWQgICAgICovCisjZGVmaW5lIERDUkVHMl9QQ05NICAgICAgMHgwMDAyCS8qIHBhY2tldCBjb21wcmVzcyB3aGVuIG5vdCBtYXRjaGVkICovCisjZGVmaW5lIERDUkVHMl9SSkNNICAgICAgMHgwMDAxCS8qIGludmVyc2UgcGFja2V0IG1hdGNoIHZpYSBDQU0gICAgICovCisKKy8qIEJvYXJkIENvbnRyb2wgUmVnaXN0ZXI6IEVuYWJsZSBSQU0sIEludGVycnVwdHMuLi4gKi8KKworI2RlZmluZSBCQ01SRUcgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgQkNNUkVHX1JBTUVOICAgICAweDgwCS8qIHN3aXRjaCBvdmVyIHRvIFJBTSAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJDTVJFR19JUEVORCAgICAgMHg0MAkvKiBpbnRlcnJ1cHQgcGVuZGluZyA/ICAgICAgICAgICAgICAqLworI2RlZmluZSBCQ01SRUdfUkVTRVQgICAgIDB4MDgJLyogcmVzZXQgYm9hcmQgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQkNNUkVHXzE2QklUICAgICAweDA0CS8qIGFkYXB0ZXIgaW4gMTYtYml0IHNsb3QgICAgICAgICAgICovCisjZGVmaW5lIEJDTVJFR19SQU1XSU4gICAgMHgwMgkvKiBlbmFibGUgUkFNIHdpbmRvdyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCQ01SRUdfSUVOICAgICAgIDB4MDEJLyogaW50ZXJydXB0IGVuYWJsZSAgICAgICAgICAgICAgICAgKi8KKworLyogTUFDIEFkZHJlc3MgUFJPTSAqLworCisjZGVmaW5lIE1BQ0FERFJQUk9NICAgICAgMHg5MgorCisvKiBzdHJ1Y3R1cmUgb2YgYSBDQU0gZW50cnkgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBpbmRleDsJCS8qIHBvaW50ZXIgaW50byBDQU0gYXJlYSAgICAgICAgICAgICovCisJdTMyIGFkZHIwOwkJLyogYWRkcmVzcyBwYXJ0IChiaXRzIDAuLjE1IHVzZWQpICAgKi8KKwl1MzIgYWRkcjE7CisJdTMyIGFkZHIyOworfSBjYW1lbnRyeV90OworCisvKiBzdHJ1Y3R1cmUgb2YgYSByZWNlaXZlIHJlc291cmNlICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgc3RhcnRsbzsJCS8qIHN0YXJ0IGFkZHJlc3MgKGJpdHMgMC4uMTUgdXNlZCkgICovCisJdTMyIHN0YXJ0aGk7CisJdTMyIGNudGxvOwkJLyogc2l6ZSBpbiAxNi1iaXQgcXVhbnRpdGllcyAgICAgICAgKi8KKwl1MzIgY250aGk7Cit9IHJyYV90OworCisvKiBzdHJ1Y3R1cmUgb2YgYSByZWNlaXZlIGRlc2NyaXB0b3IgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBzdGF0dXM7CQkvKiBwYWNrZXQgc3RhdHVzICAgICAgICAgICAgICAgICAgICAqLworCXUzMiBsZW5ndGg7CQkvKiBsZW5ndGggaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAqLworCXUzMiBzdGFydGxvOwkJLyogc3RhcnQgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgKi8KKwl1MzIgc3RhcnRoaTsKKwl1MzIgc2Vxbm87CQkvKiBmcmFtZSBzZXF1ZW5jZSAgICAgICAgICAgICAgICAgICAqLworCXUzMiBsaW5rOwkJLyogcG9pbnRlciB0byBuZXh0IGRlc2NyaXB0b3IgICAgICAgKi8KKwkvKiBiaXQgMCA9IEVPTCAgICAgICAgICAgICAgICAgICAgICAqLworCXUzMiBpbnVzZTsJCS8qICE9MCAtLT4gZnJlZSBmb3IgU09OSUMgdG8gd3JpdGUgICovCit9IHJkYV90OworCisvKiBzdHJ1Y3R1cmUgb2YgYSB0cmFuc21pdCBkZXNjcmlwdG9yICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgc3RhdHVzOwkJLyogdHJhbnNtaXQgc3RhdHVzICAgICAgICAgICAgICAgICAgKi8KKwl1MzIgY29uZmlnOwkJLyogdmFsdWUgZm9yIFRDUiAgICAgICAgICAgICAgICAgICAgKi8KKwl1MzIgbGVuZ3RoOwkJLyogdG90YWwgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgKi8KKwl1MzIgZnJhZ2NvdW50OwkJLyogbnVtYmVyIG9mIGZyYWdtZW50cyAgICAgICAgICAgICAgKi8KKwl1MzIgc3RhcnRsbzsJCS8qIHN0YXJ0IGFkZHJlc3Mgb2YgZnJhZ21lbnQgICAgICAgICovCisJdTMyIHN0YXJ0aGk7CisJdTMyIGZyYWdsZW5ndGg7CQkvKiBsZW5ndGggb2YgdGhpcyBmcmFnbWVudCAgICAgICAgICAqLworCS8qIG1vcmUgYWRkcmVzcy9sZW5ndGggdHJpcGxldHMgbWF5ICovCisJLyogZm9sbG93IGhlcmUgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1MzIgbGluazsJCS8qIHBvaW50ZXIgdG8gbmV4dCBkZXNjcmlwdG9yICAgICAgICovCisJLyogYml0IDAgPSBFT0wgICAgICAgICAgICAgICAgICAgICAgKi8KK30gdGRhX3Q7CisKKyNlbmRpZgkJCQkvKiBfSUJNX0xBTkFfRFJJVkVSXyAqLworCisjZW5kaWYJLyogX0lCTV9MQU5BX0lOQ0xVREVfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm12ZXRoLmMgYi9kcml2ZXJzL25ldC9pYm12ZXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM5YjA2MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2libXZldGguYwpAQCAtMCwwICsxLDExNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIElCTSBlU2VydmVyIGkvcFNlcmllcyBWaXJ0dWFsIEV0aGVybmV0IERldmljZSBEcml2ZXIgICAgICAgICAgICAgICAgICAgKi8KKy8qIENvcHlyaWdodCAoQykgMjAwMyBJQk0gQ29ycC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgRGF2ZSBMYXJzb24gKGxhcnNvbjFAdXMuaWJtLmNvbSkgICAgICAgICAgICAgICAgKi8KKy8qICBNYWludGFpbmVkIGJ5IFNhbnRpYWdvIExlb24gKHNhbnRpbEB1cy5pYm0uY29tKSAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgKi8KKy8qICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgKi8KKy8qICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgKi8KKy8qICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgKi8KKy8qICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgKi8KKy8qICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgKi8KKy8qICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgKi8KKy8qICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgKi8KKy8qICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQSAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHZpcnR1YWwgZXRoZXJuZXQgZGV2aWNlICAgKi8KKy8qIGZvciB1c2Ugd2l0aCBJQk0gaS9wU2VyaWVzIExQQVIgTGludXguICBJdCB1dGlsaXplcyB0aGUgbG9naWNhbCBMQU4gICAgKi8KKy8qIG9wdGlvbiBvZiB0aGUgUlMvNjAwMCBQbGF0Zm9ybSBBcmNoaXRlY2h0dXJlIHRvIGludGVyZmFjZSB3aXRoIHZpcnR1YWwgKi8KKy8qIGV0aGVybmV0IE5JQ3MgdGhhdCBhcmUgcHJlc2VudGVkIHRvIHRoZSBwYXJ0aXRpb24gYnkgdGhlIGh5cGVydmlzb3IuICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICBUT0RPOgorICAtIHJlbW92ZSBmcmFnIHByb2Nlc3NpbmcgY29kZSAtIG5vIGxvbmdlciBuZWVkZWQKKyAgLSBhZGQgc3VwcG9ydCBmb3Igc3lzZnMKKyAgLSBwb3NzaWJseSByZW1vdmUgcHJvY2ZzIHN1cHBvcnQKKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9odmNhbGwuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CisjaW5jbHVkZSA8YXNtL3Zpby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2luY2x1ZGUgImlibXZldGguaCIKKworI2RlZmluZSBERUJVRyAxCisKKyNkZWZpbmUgaWJtdmV0aF9wcmludGsoZm10LCBhcmdzLi4uKSBcCisgIHByaW50ayhLRVJOX0lORk8gIiVzOiAiIGZtdCwgX19GSUxFX18sICMjIGFyZ3MpCisKKyNkZWZpbmUgaWJtdmV0aF9lcnJvcl9wcmludGsoZm10LCBhcmdzLi4uKSBcCisgIHByaW50ayhLRVJOX0VSUiAiKCVzOiUzLjNkIHVhOiV4KSBFUlJPUjogIiBmbXQsIF9fRklMRV9fLCBfX0xJTkVfXyAsIGFkYXB0ZXItPnZkZXYtPnVuaXRfYWRkcmVzcywgIyMgYXJncykKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIGlibXZldGhfZGVidWdfcHJpbnRrX25vX2FkYXB0ZXIoZm10LCBhcmdzLi4uKSBcCisgIHByaW50ayhLRVJOX0RFQlVHICIoJXM6JTMuM2QpOiAiIGZtdCwgX19GSUxFX18sIF9fTElORV9fICwgIyMgYXJncykKKyNkZWZpbmUgaWJtdmV0aF9kZWJ1Z19wcmludGsoZm10LCBhcmdzLi4uKSBcCisgIHByaW50ayhLRVJOX0RFQlVHICIoJXM6JTMuM2QgdWE6JXgpOiAiIGZtdCwgX19GSUxFX18sIF9fTElORV9fICwgYWRhcHRlci0+dmRldi0+dW5pdF9hZGRyZXNzLCAjIyBhcmdzKQorI2RlZmluZSBpYm12ZXRoX2Fzc2VydChleHByKSBcCisgIGlmKCEoZXhwcikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwcmludGsoS0VSTl9ERUJVRyAiYXNzZXJ0aW9uIGZhaWxlZCAoJXM6JTMuM2QgdWE6JXgpOiAlc1xuIiwgX19GSUxFX18sIF9fTElORV9fLCBhZGFwdGVyLT52ZGV2LT51bml0X2FkZHJlc3MsICNleHByKTsgXAorICAgIEJVRygpOyBcCisgIH0KKyNlbHNlCisjZGVmaW5lIGlibXZldGhfZGVidWdfcHJpbnRrX25vX2FkYXB0ZXIoZm10LCBhcmdzLi4uKQorI2RlZmluZSBpYm12ZXRoX2RlYnVnX3ByaW50ayhmbXQsIGFyZ3MuLi4pCisjZGVmaW5lIGlibXZldGhfYXNzZXJ0KGV4cHIpIAorI2VuZGlmCisKK3N0YXRpYyBpbnQgaWJtdmV0aF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpYm12ZXRoX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpYm12ZXRoX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgaWJtdmV0aF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KTsKK3N0YXRpYyBpbnQgaWJtdmV0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppYm12ZXRoX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGlibXZldGhfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpYm12ZXRoX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpOworc3RhdGljIHZvaWQgaWJtdmV0aF9wcm9jX3JlZ2lzdGVyX2RyaXZlcih2b2lkKTsKK3N0YXRpYyB2b2lkIGlibXZldGhfcHJvY191bnJlZ2lzdGVyX2RyaXZlcih2b2lkKTsKK3N0YXRpYyB2b2lkIGlibXZldGhfcHJvY19yZWdpc3Rlcl9hZGFwdGVyKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgaWJtdmV0aF9wcm9jX3VucmVnaXN0ZXJfYWRhcHRlcihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBpYm12ZXRoX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBpYm12ZXRoX3NjaGVkdWxlX3JlcGxlbmlzaGluZyhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyKik7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworI2RlZmluZSBJQk1WRVRIX1BST0NfRElSICJpYm12ZXRoIgorc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaWJtdmV0aF9wcm9jX2RpcjsKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciBpYm12ZXRoX2RyaXZlcl9uYW1lW10gPSAiaWJtdmV0aCI7CitzdGF0aWMgY29uc3QgY2hhciBpYm12ZXRoX2RyaXZlcl9zdHJpbmdbXSA9ICJJQk0gaS9wU2VyaWVzIFZpcnR1YWwgRXRoZXJuZXQgRHJpdmVyIjsKKyNkZWZpbmUgaWJtdmV0aF9kcml2ZXJfdmVyc2lvbiAiMS4wMyIKKworTU9EVUxFX0FVVEhPUigiU2FudGlhZ28gTGVvbiA8c2FudGlsQHVzLmlibS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklCTSBpL3BTZXJpZXMgVmlydHVhbCBFdGhlcm5ldCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKGlibXZldGhfZHJpdmVyX3ZlcnNpb24pOworCisvKiBzaW1wbGUgbWV0aG9kcyBvZiBnZXR0aW5nIGRhdGEgZnJvbSB0aGUgY3VycmVudCByeHEgZW50cnkgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX3BlbmRpbmdfYnVmZmVyKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIChhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9hZGRyW2FkYXB0ZXItPnJ4X3F1ZXVlLmluZGV4XS50b2dnbGUgPT0gYWRhcHRlci0+cnhfcXVldWUudG9nZ2xlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfYnVmZmVyX3ZhbGlkKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIChhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9hZGRyW2FkYXB0ZXItPnJ4X3F1ZXVlLmluZGV4XS52YWxpZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfcnhxX2ZyYW1lX29mZnNldChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiAoYWRhcHRlci0+cnhfcXVldWUucXVldWVfYWRkclthZGFwdGVyLT5yeF9xdWV1ZS5pbmRleF0ub2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaWJtdmV0aF9yeHFfZnJhbWVfbGVuZ3RoKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIChhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9hZGRyW2FkYXB0ZXItPnJ4X3F1ZXVlLmluZGV4XS5sZW5ndGgpOworfQorCisvKiBzZXR1cCB0aGUgaW5pdGlhbCBzZXR0aW5ncyBmb3IgYSBidWZmZXIgcG9vbCAqLworc3RhdGljIHZvaWQgaWJtdmV0aF9pbml0X2J1ZmZlcl9wb29sKHN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCAqcG9vbCwgdTMyIHBvb2xfaW5kZXgsIHUzMiBwb29sX3NpemUsIHUzMiBidWZmX3NpemUpCit7CisJcG9vbC0+c2l6ZSA9IHBvb2xfc2l6ZTsKKwlwb29sLT5pbmRleCA9IHBvb2xfaW5kZXg7CisJcG9vbC0+YnVmZl9zaXplID0gYnVmZl9zaXplOworCXBvb2wtPnRocmVzaG9sZCA9IHBvb2xfc2l6ZSAvIDI7Cit9CisKKy8qIGFsbG9jYXRlIGFuZCBzZXR1cCBhbiBidWZmZXIgcG9vbCAtIGNhbGxlZCBkdXJpbmcgb3BlbiAqLworc3RhdGljIGludCBpYm12ZXRoX2FsbG9jX2J1ZmZlcl9wb29sKHN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCAqcG9vbCkKK3sKKwlpbnQgaTsKKworCXBvb2wtPmZyZWVfbWFwID0ga21hbGxvYyhzaXplb2YodTE2KSAqIHBvb2wtPnNpemUsIEdGUF9LRVJORUwpOyAKKworCWlmKCFwb29sLT5mcmVlX21hcCkgeworCQlyZXR1cm4gLTE7CisJfQorCisJcG9vbC0+ZG1hX2FkZHIgPSBrbWFsbG9jKHNpemVvZihkbWFfYWRkcl90KSAqIHBvb2wtPnNpemUsIEdGUF9LRVJORUwpOyAKKwlpZighcG9vbC0+ZG1hX2FkZHIpIHsKKwkJa2ZyZWUocG9vbC0+ZnJlZV9tYXApOworCQlwb29sLT5mcmVlX21hcCA9IE5VTEw7CisJCXJldHVybiAtMTsKKwl9CisKKwlwb29sLT5za2J1ZmYgPSBrbWFsbG9jKHNpemVvZih2b2lkKikgKiBwb29sLT5zaXplLCBHRlBfS0VSTkVMKTsKKworCWlmKCFwb29sLT5za2J1ZmYpIHsKKwkJa2ZyZWUocG9vbC0+ZG1hX2FkZHIpOworCQlwb29sLT5kbWFfYWRkciA9IE5VTEw7CisKKwkJa2ZyZWUocG9vbC0+ZnJlZV9tYXApOworCQlwb29sLT5mcmVlX21hcCA9IE5VTEw7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1zZXQocG9vbC0+c2tidWZmLCAwLCBzaXplb2Yodm9pZCopICogcG9vbC0+c2l6ZSk7CisJbWVtc2V0KHBvb2wtPmRtYV9hZGRyLCAwLCBzaXplb2YoZG1hX2FkZHJfdCkgKiBwb29sLT5zaXplKTsKKworCWZvcihpID0gMDsgaSA8IHBvb2wtPnNpemU7ICsraSkgeworCQlwb29sLT5mcmVlX21hcFtpXSA9IGk7CisJfQorCisJYXRvbWljX3NldCgmcG9vbC0+YXZhaWxhYmxlLCAwKTsKKwlwb29sLT5wcm9kdWNlcl9pbmRleCA9IDA7CisJcG9vbC0+Y29uc3VtZXJfaW5kZXggPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHJlcGxlbmlzaCB0aGUgYnVmZmVycyBmb3IgYSBwb29sLiAgbm90ZSB0aGF0IHdlIGRvbid0IG5lZWQgdG8KKyAqIHNrYl9yZXNlcnZlIHRoZXNlIHNpbmNlIHRoZXkgYXJlIHVzZWQgZm9yIGluY29taW5nLi4uCisgKi8KK3N0YXRpYyB2b2lkIGlibXZldGhfcmVwbGVuaXNoX2J1ZmZlcl9wb29sKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCAqcG9vbCkKK3sKKwl1MzIgaTsKKwl1MzIgY291bnQgPSBwb29sLT5zaXplIC0gYXRvbWljX3JlYWQoJnBvb2wtPmF2YWlsYWJsZSk7CisJdTMyIGJ1ZmZlcnNfYWRkZWQgPSAwOworCisJbWIoKTsKKworCWZvcihpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdW5zaWduZWQgaW50IGZyZWVfaW5kZXgsIGluZGV4OworCQl1NjQgY29ycmVsYXRvcjsKKwkJdW5pb24gaWJtdmV0aF9idWZfZGVzYyBkZXNjOworCQl1bnNpZ25lZCBsb25nIGxwYXJfcmM7CisJCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisKKwkJc2tiID0gYWxsb2Nfc2tiKHBvb2wtPmJ1ZmZfc2l6ZSwgR0ZQX0FUT01JQyk7CisKKwkJaWYoIXNrYikgeworCQkJaWJtdmV0aF9kZWJ1Z19wcmludGsoInJlcGxlbmlzaDogdW5hYmxlIHRvIGFsbG9jYXRlIHNrYlxuIik7CisJCQlhZGFwdGVyLT5yZXBsZW5pc2hfbm9fbWVtKys7CisJCQlicmVhazsKKwkJfQorCisJCWZyZWVfaW5kZXggPSBwb29sLT5jb25zdW1lcl9pbmRleCsrICUgcG9vbC0+c2l6ZTsKKwkJaW5kZXggPSBwb29sLT5mcmVlX21hcFtmcmVlX2luZGV4XTsKKwkKKwkJaWJtdmV0aF9hc3NlcnQoaW5kZXggIT0gSUJNX1ZFVEhfSU5WQUxJRF9NQVApOworCQlpYm12ZXRoX2Fzc2VydChwb29sLT5za2J1ZmZbaW5kZXhdID09IE5VTEwpOworCisJCWRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUoJmFkYXB0ZXItPnZkZXYtPmRldiwgc2tiLT5kYXRhLAorCQkJCXBvb2wtPmJ1ZmZfc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKKworCQlwb29sLT5mcmVlX21hcFtmcmVlX2luZGV4XSA9IElCTV9WRVRIX0lOVkFMSURfTUFQOworCQlwb29sLT5kbWFfYWRkcltpbmRleF0gPSBkbWFfYWRkcjsKKwkJcG9vbC0+c2tidWZmW2luZGV4XSA9IHNrYjsKKworCQljb3JyZWxhdG9yID0gKCh1NjQpcG9vbC0+aW5kZXggPDwgMzIpIHwgaW5kZXg7CisJCSoodTY0Kilza2ItPmRhdGEgPSBjb3JyZWxhdG9yOworCisJCWRlc2MuZGVzYyA9IDA7CisJCWRlc2MuZmllbGRzLnZhbGlkID0gMTsKKwkJZGVzYy5maWVsZHMubGVuZ3RoID0gcG9vbC0+YnVmZl9zaXplOworCQlkZXNjLmZpZWxkcy5hZGRyZXNzID0gZG1hX2FkZHI7IAorCisJCWxwYXJfcmMgPSBoX2FkZF9sb2dpY2FsX2xhbl9idWZmZXIoYWRhcHRlci0+dmRldi0+dW5pdF9hZGRyZXNzLCBkZXNjLmRlc2MpOworCQkgICAgCisJCWlmKGxwYXJfcmMgIT0gSF9TdWNjZXNzKSB7CisJCQlwb29sLT5mcmVlX21hcFtmcmVlX2luZGV4XSA9IElCTV9WRVRIX0lOVkFMSURfTUFQOworCQkJcG9vbC0+c2tidWZmW2luZGV4XSA9IE5VTEw7CisJCQlwb29sLT5jb25zdW1lcl9pbmRleC0tOworCQkJZG1hX3VubWFwX3NpbmdsZSgmYWRhcHRlci0+dmRldi0+ZGV2LAorCQkJCQlwb29sLT5kbWFfYWRkcltpbmRleF0sIHBvb2wtPmJ1ZmZfc2l6ZSwKKwkJCQkJRE1BX0ZST01fREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQlhZGFwdGVyLT5yZXBsZW5pc2hfYWRkX2J1ZmZfZmFpbHVyZSsrOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlidWZmZXJzX2FkZGVkKys7CisJCQlhZGFwdGVyLT5yZXBsZW5pc2hfYWRkX2J1ZmZfc3VjY2VzcysrOworCQl9CisJfQorICAgIAorCW1iKCk7CisJYXRvbWljX2FkZChidWZmZXJzX2FkZGVkLCAmKHBvb2wtPmF2YWlsYWJsZSkpOworfQorCisvKiBjaGVjayBpZiByZXBsZW5pc2hpbmcgaXMgbmVlZGVkLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlibXZldGhfaXNfcmVwbGVuaXNoaW5nX25lZWRlZChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiAoKGF0b21pY19yZWFkKCZhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMF0uYXZhaWxhYmxlKSA8IGFkYXB0ZXItPnJ4X2J1ZmZfcG9vbFswXS50aHJlc2hvbGQpIHx8CisJCShhdG9taWNfcmVhZCgmYWRhcHRlci0+cnhfYnVmZl9wb29sWzFdLmF2YWlsYWJsZSkgPCBhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMV0udGhyZXNob2xkKSB8fAorCQkoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnJ4X2J1ZmZfcG9vbFsyXS5hdmFpbGFibGUpIDwgYWRhcHRlci0+cnhfYnVmZl9wb29sWzJdLnRocmVzaG9sZCkpOworfQorCisvKiBraWNrIHRoZSByZXBsZW5pc2ggdGFza2xldCBpZiB3ZSBuZWVkIHJlcGxlbmlzaGluZyBhbmQgaXQgaXNuJ3QgYWxyZWFkeSBydW5uaW5nICovCitzdGF0aWMgaW5saW5lIHZvaWQgaWJtdmV0aF9zY2hlZHVsZV9yZXBsZW5pc2hpbmcoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZihpYm12ZXRoX2lzX3JlcGxlbmlzaGluZ19uZWVkZWQoYWRhcHRlcikgJiYKKwkgICAoYXRvbWljX2RlY19pZl9wb3NpdGl2ZSgmYWRhcHRlci0+bm90X3JlcGxlbmlzaGluZykgPT0gMCkpIHsKKwkJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+cmVwbGVuaXNoX3Rhc2spOworCX0KK30KKworLyogcmVwbGVuaXNoIHRhc2tsZXQgcm91dGluZSAqLworc3RhdGljIHZvaWQgaWJtdmV0aF9yZXBsZW5pc2hfdGFzayhzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKSAKK3sKKwlhZGFwdGVyLT5yZXBsZW5pc2hfdGFza19jeWNsZXMrKzsKKworCWlibXZldGhfcmVwbGVuaXNoX2J1ZmZlcl9wb29sKGFkYXB0ZXIsICZhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMF0pOworCWlibXZldGhfcmVwbGVuaXNoX2J1ZmZlcl9wb29sKGFkYXB0ZXIsICZhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMV0pOworCWlibXZldGhfcmVwbGVuaXNoX2J1ZmZlcl9wb29sKGFkYXB0ZXIsICZhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMl0pOworCisJYWRhcHRlci0+cnhfbm9fYnVmZmVyID0gKih1NjQqKSgoKGNoYXIqKWFkYXB0ZXItPmJ1ZmZlcl9saXN0X2FkZHIpICsgNDA5NiAtIDgpOworCisJYXRvbWljX2luYygmYWRhcHRlci0+bm90X3JlcGxlbmlzaGluZyk7CisKKwlpYm12ZXRoX3NjaGVkdWxlX3JlcGxlbmlzaGluZyhhZGFwdGVyKTsKK30KKworLyogZW1wdHkgYW5kIGZyZWUgYW5hIGJ1ZmZlciBwb29sIC0gYWxzbyB1c2VkIHRvIGRvIGNsZWFudXAgaW4gZXJyb3IgcGF0aHMgKi8KK3N0YXRpYyB2b2lkIGlibXZldGhfZnJlZV9idWZmZXJfcG9vbChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgaWJtdmV0aF9idWZmX3Bvb2wgKnBvb2wpCit7CisJaW50IGk7CisKKwlpZihwb29sLT5mcmVlX21hcCkgeworCQlrZnJlZShwb29sLT5mcmVlX21hcCk7CisJCXBvb2wtPmZyZWVfbWFwICA9IE5VTEw7CisJfQorCisJaWYocG9vbC0+c2tidWZmICYmIHBvb2wtPmRtYV9hZGRyKSB7CisJCWZvcihpID0gMDsgaSA8IHBvb2wtPnNpemU7ICsraSkgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHBvb2wtPnNrYnVmZltpXTsKKwkJCWlmKHNrYikgeworCQkJCWRtYV91bm1hcF9zaW5nbGUoJmFkYXB0ZXItPnZkZXYtPmRldiwKKwkJCQkJCSBwb29sLT5kbWFfYWRkcltpXSwKKwkJCQkJCSBwb29sLT5idWZmX3NpemUsCisJCQkJCQkgRE1BX0ZST01fREVWSUNFKTsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJCXBvb2wtPnNrYnVmZltpXSA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisKKwlpZihwb29sLT5kbWFfYWRkcikgeworCQlrZnJlZShwb29sLT5kbWFfYWRkcik7CisJCXBvb2wtPmRtYV9hZGRyID0gTlVMTDsKKwl9CisKKwlpZihwb29sLT5za2J1ZmYpIHsKKwkJa2ZyZWUocG9vbC0+c2tidWZmKTsKKwkJcG9vbC0+c2tidWZmID0gTlVMTDsKKwl9Cit9CisKKy8qIHJlbW92ZSBhIGJ1ZmZlciBmcm9tIGEgcG9vbCAqLworc3RhdGljIHZvaWQgaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyLCB1NjQgY29ycmVsYXRvcikKK3sKKwl1bnNpZ25lZCBpbnQgcG9vbCAgPSBjb3JyZWxhdG9yID4+IDMyOworCXVuc2lnbmVkIGludCBpbmRleCA9IGNvcnJlbGF0b3IgJiAweGZmZmZmZmZmVUw7CisJdW5zaWduZWQgaW50IGZyZWVfaW5kZXg7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlibXZldGhfYXNzZXJ0KHBvb2wgPCBJYm1WZXRoTnVtQnVmZmVyUG9vbHMpOworCWlibXZldGhfYXNzZXJ0KGluZGV4IDwgYWRhcHRlci0+cnhfYnVmZl9wb29sW3Bvb2xdLnNpemUpOworCisJc2tiID0gYWRhcHRlci0+cnhfYnVmZl9wb29sW3Bvb2xdLnNrYnVmZltpbmRleF07CisKKwlpYm12ZXRoX2Fzc2VydChza2IgIT0gTlVMTCk7CisKKwlhZGFwdGVyLT5yeF9idWZmX3Bvb2xbcG9vbF0uc2tidWZmW2luZGV4XSA9IE5VTEw7CisKKwlkbWFfdW5tYXBfc2luZ2xlKCZhZGFwdGVyLT52ZGV2LT5kZXYsCisJCQkgYWRhcHRlci0+cnhfYnVmZl9wb29sW3Bvb2xdLmRtYV9hZGRyW2luZGV4XSwKKwkJCSBhZGFwdGVyLT5yeF9idWZmX3Bvb2xbcG9vbF0uYnVmZl9zaXplLAorCQkJIERNQV9GUk9NX0RFVklDRSk7CisKKwlmcmVlX2luZGV4ID0gYWRhcHRlci0+cnhfYnVmZl9wb29sW3Bvb2xdLnByb2R1Y2VyX2luZGV4KysgJSBhZGFwdGVyLT5yeF9idWZmX3Bvb2xbcG9vbF0uc2l6ZTsKKwlhZGFwdGVyLT5yeF9idWZmX3Bvb2xbcG9vbF0uZnJlZV9tYXBbZnJlZV9pbmRleF0gPSBpbmRleDsKKworCW1iKCk7CisKKwlhdG9taWNfZGVjKCYoYWRhcHRlci0+cnhfYnVmZl9wb29sW3Bvb2xdLmF2YWlsYWJsZSkpOworfQorCisvKiBnZXQgdGhlIGN1cnJlbnQgYnVmZmVyIG9uIHRoZSByeCBxdWV1ZSAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWJtdmV0aF9yeHFfZ2V0X2J1ZmZlcihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKQoreworCXU2NCBjb3JyZWxhdG9yID0gYWRhcHRlci0+cnhfcXVldWUucXVldWVfYWRkclthZGFwdGVyLT5yeF9xdWV1ZS5pbmRleF0uY29ycmVsYXRvcjsKKwl1bnNpZ25lZCBpbnQgcG9vbCA9IGNvcnJlbGF0b3IgPj4gMzI7CisJdW5zaWduZWQgaW50IGluZGV4ID0gY29ycmVsYXRvciAmIDB4ZmZmZmZmZmZVTDsKKworCWlibXZldGhfYXNzZXJ0KHBvb2wgPCBJYm1WZXRoTnVtQnVmZmVyUG9vbHMpOworCWlibXZldGhfYXNzZXJ0KGluZGV4IDwgYWRhcHRlci0+cnhfYnVmZl9wb29sW3Bvb2xdLnNpemUpOworCisJcmV0dXJuIGFkYXB0ZXItPnJ4X2J1ZmZfcG9vbFtwb29sXS5za2J1ZmZbaW5kZXhdOworfQorCisvKiByZWN5Y2xlIHRoZSBjdXJyZW50IGJ1ZmZlciBvbiB0aGUgcnggcXVldWUgKi8KK3N0YXRpYyB2b2lkIGlibXZldGhfcnhxX3JlY3ljbGVfYnVmZmVyKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIHFfaW5kZXggPSBhZGFwdGVyLT5yeF9xdWV1ZS5pbmRleDsKKwl1NjQgY29ycmVsYXRvciA9IGFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2FkZHJbcV9pbmRleF0uY29ycmVsYXRvcjsKKwl1bnNpZ25lZCBpbnQgcG9vbCA9IGNvcnJlbGF0b3IgPj4gMzI7CisJdW5zaWduZWQgaW50IGluZGV4ID0gY29ycmVsYXRvciAmIDB4ZmZmZmZmZmZVTDsKKwl1bmlvbiBpYm12ZXRoX2J1Zl9kZXNjIGRlc2M7CisJdW5zaWduZWQgbG9uZyBscGFyX3JjOworCisJaWJtdmV0aF9hc3NlcnQocG9vbCA8IElibVZldGhOdW1CdWZmZXJQb29scyk7CisJaWJtdmV0aF9hc3NlcnQoaW5kZXggPCBhZGFwdGVyLT5yeF9idWZmX3Bvb2xbcG9vbF0uc2l6ZSk7CisKKwlkZXNjLmRlc2MgPSAwOworCWRlc2MuZmllbGRzLnZhbGlkID0gMTsKKwlkZXNjLmZpZWxkcy5sZW5ndGggPSBhZGFwdGVyLT5yeF9idWZmX3Bvb2xbcG9vbF0uYnVmZl9zaXplOworCWRlc2MuZmllbGRzLmFkZHJlc3MgPSBhZGFwdGVyLT5yeF9idWZmX3Bvb2xbcG9vbF0uZG1hX2FkZHJbaW5kZXhdOworCisJbHBhcl9yYyA9IGhfYWRkX2xvZ2ljYWxfbGFuX2J1ZmZlcihhZGFwdGVyLT52ZGV2LT51bml0X2FkZHJlc3MsIGRlc2MuZGVzYyk7CisJCSAgICAKKwlpZihscGFyX3JjICE9IEhfU3VjY2VzcykgeworCQlpYm12ZXRoX2RlYnVnX3ByaW50aygiaF9hZGRfbG9naWNhbF9sYW5fYnVmZmVyIGZhaWxlZCBkdXJpbmcgcmVjeWNsZSByYz0lbGQiLCBscGFyX3JjKTsKKwkJaWJtdmV0aF9yZW1vdmVfYnVmZmVyX2Zyb21fcG9vbChhZGFwdGVyLCBhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9hZGRyW2FkYXB0ZXItPnJ4X3F1ZXVlLmluZGV4XS5jb3JyZWxhdG9yKTsKKwl9CisKKwlpZigrK2FkYXB0ZXItPnJ4X3F1ZXVlLmluZGV4ID09IGFkYXB0ZXItPnJ4X3F1ZXVlLm51bV9zbG90cykgeworCQlhZGFwdGVyLT5yeF9xdWV1ZS5pbmRleCA9IDA7CisJCWFkYXB0ZXItPnJ4X3F1ZXVlLnRvZ2dsZSA9ICFhZGFwdGVyLT5yeF9xdWV1ZS50b2dnbGU7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaWJtdmV0aF9yeHFfaGFydmVzdF9idWZmZXIoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpYm12ZXRoX3JlbW92ZV9idWZmZXJfZnJvbV9wb29sKGFkYXB0ZXIsIGFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2FkZHJbYWRhcHRlci0+cnhfcXVldWUuaW5kZXhdLmNvcnJlbGF0b3IpOworCisJaWYoKythZGFwdGVyLT5yeF9xdWV1ZS5pbmRleCA9PSBhZGFwdGVyLT5yeF9xdWV1ZS5udW1fc2xvdHMpIHsKKwkJYWRhcHRlci0+cnhfcXVldWUuaW5kZXggPSAwOworCQlhZGFwdGVyLT5yeF9xdWV1ZS50b2dnbGUgPSAhYWRhcHRlci0+cnhfcXVldWUudG9nZ2xlOworCX0KK30KKworc3RhdGljIHZvaWQgaWJtdmV0aF9jbGVhbnVwKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYoYWRhcHRlci0+YnVmZmVyX2xpc3RfYWRkciAhPSBOVUxMKSB7CisJCWlmKCFkbWFfbWFwcGluZ19lcnJvcihhZGFwdGVyLT5idWZmZXJfbGlzdF9kbWEpKSB7CisJCQlkbWFfdW5tYXBfc2luZ2xlKCZhZGFwdGVyLT52ZGV2LT5kZXYsCisJCQkJCWFkYXB0ZXItPmJ1ZmZlcl9saXN0X2RtYSwgNDA5NiwKKwkJCQkJRE1BX0JJRElSRUNUSU9OQUwpOworCQkJYWRhcHRlci0+YnVmZmVyX2xpc3RfZG1hID0gRE1BX0VSUk9SX0NPREU7CisJCX0KKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkYXB0ZXItPmJ1ZmZlcl9saXN0X2FkZHIpOworCQlhZGFwdGVyLT5idWZmZXJfbGlzdF9hZGRyID0gTlVMTDsKKwl9IAorCisJaWYoYWRhcHRlci0+ZmlsdGVyX2xpc3RfYWRkciAhPSBOVUxMKSB7CisJCWlmKCFkbWFfbWFwcGluZ19lcnJvcihhZGFwdGVyLT5maWx0ZXJfbGlzdF9kbWEpKSB7CisJCQlkbWFfdW5tYXBfc2luZ2xlKCZhZGFwdGVyLT52ZGV2LT5kZXYsCisJCQkJCWFkYXB0ZXItPmZpbHRlcl9saXN0X2RtYSwgNDA5NiwKKwkJCQkJRE1BX0JJRElSRUNUSU9OQUwpOworCQkJYWRhcHRlci0+ZmlsdGVyX2xpc3RfZG1hID0gRE1BX0VSUk9SX0NPREU7CisJCX0KKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkYXB0ZXItPmZpbHRlcl9saXN0X2FkZHIpOworCQlhZGFwdGVyLT5maWx0ZXJfbGlzdF9hZGRyID0gTlVMTDsKKwl9CisKKwlpZihhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9hZGRyICE9IE5VTEwpIHsKKwkJaWYoIWRtYV9tYXBwaW5nX2Vycm9yKGFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2RtYSkpIHsKKwkJCWRtYV91bm1hcF9zaW5nbGUoJmFkYXB0ZXItPnZkZXYtPmRldiwKKwkJCQkJYWRhcHRlci0+cnhfcXVldWUucXVldWVfZG1hLAorCQkJCQlhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9sZW4sCisJCQkJCURNQV9CSURJUkVDVElPTkFMKTsKKwkJCWFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2RtYSA9IERNQV9FUlJPUl9DT0RFOworCQl9CisJCWtmcmVlKGFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2FkZHIpOworCQlhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9hZGRyID0gTlVMTDsKKwl9CisKKwlpYm12ZXRoX2ZyZWVfYnVmZmVyX3Bvb2woYWRhcHRlciwgJmFkYXB0ZXItPnJ4X2J1ZmZfcG9vbFswXSk7CisJaWJtdmV0aF9mcmVlX2J1ZmZlcl9wb29sKGFkYXB0ZXIsICZhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMV0pOworCWlibXZldGhfZnJlZV9idWZmZXJfcG9vbChhZGFwdGVyLCAmYWRhcHRlci0+cnhfYnVmZl9wb29sWzJdKTsKK30KKworc3RhdGljIGludCBpYm12ZXRoX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXU2NCBtYWNfYWRkcmVzcyA9IDA7CisJaW50IHJ4cV9lbnRyaWVzOworCXVuc2lnbmVkIGxvbmcgbHBhcl9yYzsKKwlpbnQgcmM7CisJdW5pb24gaWJtdmV0aF9idWZfZGVzYyByeHFfZGVzYzsKKworCWlibXZldGhfZGVidWdfcHJpbnRrKCJvcGVuIHN0YXJ0aW5nXG4iKTsKKworCXJ4cV9lbnRyaWVzID0KKwkJYWRhcHRlci0+cnhfYnVmZl9wb29sWzBdLnNpemUgKworCQlhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMV0uc2l6ZSArCisJCWFkYXB0ZXItPnJ4X2J1ZmZfcG9vbFsyXS5zaXplICsgMTsKKyAgICAKKwlhZGFwdGVyLT5idWZmZXJfbGlzdF9hZGRyID0gKHZvaWQqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJYWRhcHRlci0+ZmlsdGVyX2xpc3RfYWRkciA9ICh2b2lkKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworIAorCWlmKCFhZGFwdGVyLT5idWZmZXJfbGlzdF9hZGRyIHx8ICFhZGFwdGVyLT5maWx0ZXJfbGlzdF9hZGRyKSB7CisJCWlibXZldGhfZXJyb3JfcHJpbnRrKCJ1bmFibGUgdG8gYWxsb2NhdGUgZmlsdGVyIG9yIGJ1ZmZlciBsaXN0IHBhZ2VzXG4iKTsKKwkJaWJtdmV0aF9jbGVhbnVwKGFkYXB0ZXIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9sZW4gPSBzaXplb2Yoc3RydWN0IGlibXZldGhfcnhfcV9lbnRyeSkgKiByeHFfZW50cmllczsKKwlhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9hZGRyID0ga21hbGxvYyhhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9sZW4sIEdGUF9LRVJORUwpOworCisJaWYoIWFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2FkZHIpIHsKKwkJaWJtdmV0aF9lcnJvcl9wcmludGsoInVuYWJsZSB0byBhbGxvY2F0ZSByeCBxdWV1ZSBwYWdlc1xuIik7CisJCWlibXZldGhfY2xlYW51cChhZGFwdGVyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYWRhcHRlci0+YnVmZmVyX2xpc3RfZG1hID0gZG1hX21hcF9zaW5nbGUoJmFkYXB0ZXItPnZkZXYtPmRldiwKKwkJCWFkYXB0ZXItPmJ1ZmZlcl9saXN0X2FkZHIsIDQwOTYsIERNQV9CSURJUkVDVElPTkFMKTsKKwlhZGFwdGVyLT5maWx0ZXJfbGlzdF9kbWEgPSBkbWFfbWFwX3NpbmdsZSgmYWRhcHRlci0+dmRldi0+ZGV2LAorCQkJYWRhcHRlci0+ZmlsdGVyX2xpc3RfYWRkciwgNDA5NiwgRE1BX0JJRElSRUNUSU9OQUwpOworCWFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2RtYSA9IGRtYV9tYXBfc2luZ2xlKCZhZGFwdGVyLT52ZGV2LT5kZXYsCisJCQlhZGFwdGVyLT5yeF9xdWV1ZS5xdWV1ZV9hZGRyLAorCQkJYWRhcHRlci0+cnhfcXVldWUucXVldWVfbGVuLCBETUFfQklESVJFQ1RJT05BTCk7CisKKwlpZigoZG1hX21hcHBpbmdfZXJyb3IoYWRhcHRlci0+YnVmZmVyX2xpc3RfZG1hKSApIHx8CisJICAgKGRtYV9tYXBwaW5nX2Vycm9yKGFkYXB0ZXItPmZpbHRlcl9saXN0X2RtYSkpIHx8CisJICAgKGRtYV9tYXBwaW5nX2Vycm9yKGFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2RtYSkpKSB7CisJCWlibXZldGhfZXJyb3JfcHJpbnRrKCJ1bmFibGUgdG8gbWFwIGZpbHRlciBvciBidWZmZXIgbGlzdCBwYWdlc1xuIik7CisJCWlibXZldGhfY2xlYW51cChhZGFwdGVyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYWRhcHRlci0+cnhfcXVldWUuaW5kZXggPSAwOworCWFkYXB0ZXItPnJ4X3F1ZXVlLm51bV9zbG90cyA9IHJ4cV9lbnRyaWVzOworCWFkYXB0ZXItPnJ4X3F1ZXVlLnRvZ2dsZSA9IDE7CisKKwlpZihpYm12ZXRoX2FsbG9jX2J1ZmZlcl9wb29sKCZhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMF0pIHx8CisJICAgaWJtdmV0aF9hbGxvY19idWZmZXJfcG9vbCgmYWRhcHRlci0+cnhfYnVmZl9wb29sWzFdKSB8fAorCSAgIGlibXZldGhfYWxsb2NfYnVmZmVyX3Bvb2woJmFkYXB0ZXItPnJ4X2J1ZmZfcG9vbFsyXSkpCisJeworCQlpYm12ZXRoX2Vycm9yX3ByaW50aygidW5hYmxlIHRvIGFsbG9jYXRlIGJ1ZmZlciBwb29sc1xuIik7CisJCWlibXZldGhfY2xlYW51cChhZGFwdGVyKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtY3B5KCZtYWNfYWRkcmVzcywgbmV0ZGV2LT5kZXZfYWRkciwgbmV0ZGV2LT5hZGRyX2xlbik7CisJbWFjX2FkZHJlc3MgPSBtYWNfYWRkcmVzcyA+PiAxNjsKKworCXJ4cV9kZXNjLmRlc2MgPSAwOworCXJ4cV9kZXNjLmZpZWxkcy52YWxpZCA9IDE7CisJcnhxX2Rlc2MuZmllbGRzLmxlbmd0aCA9IGFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2xlbjsKKwlyeHFfZGVzYy5maWVsZHMuYWRkcmVzcyA9IGFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2RtYTsKKworCWlibXZldGhfZGVidWdfcHJpbnRrKCJidWZmZXIgbGlzdCBAIDB4JXBcbiIsIGFkYXB0ZXItPmJ1ZmZlcl9saXN0X2FkZHIpOworCWlibXZldGhfZGVidWdfcHJpbnRrKCJmaWx0ZXIgbGlzdCBAIDB4JXBcbiIsIGFkYXB0ZXItPmZpbHRlcl9saXN0X2FkZHIpOworCWlibXZldGhfZGVidWdfcHJpbnRrKCJyZWNlaXZlIHEgICBAIDB4JXBcbiIsIGFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2FkZHIpOworCisgICAgCisJbHBhcl9yYyA9IGhfcmVnaXN0ZXJfbG9naWNhbF9sYW4oYWRhcHRlci0+dmRldi0+dW5pdF9hZGRyZXNzLAorCQkJCQkgYWRhcHRlci0+YnVmZmVyX2xpc3RfZG1hLAorCQkJCQkgcnhxX2Rlc2MuZGVzYywKKwkJCQkJIGFkYXB0ZXItPmZpbHRlcl9saXN0X2RtYSwKKwkJCQkJIG1hY19hZGRyZXNzKTsKKworCWlmKGxwYXJfcmMgIT0gSF9TdWNjZXNzKSB7CisJCWlibXZldGhfZXJyb3JfcHJpbnRrKCJoX3JlZ2lzdGVyX2xvZ2ljYWxfbGFuIGZhaWxlZCB3aXRoICVsZFxuIiwgbHBhcl9yYyk7CisJCWlibXZldGhfZXJyb3JfcHJpbnRrKCJidWZmZXIgVENFOjB4JXggZmlsdGVyIFRDRToweCV4IHJ4cSBkZXNjOjB4JWx4IE1BQzoweCVseFxuIiwKKwkJCQkgICAgIGFkYXB0ZXItPmJ1ZmZlcl9saXN0X2RtYSwKKwkJCQkgICAgIGFkYXB0ZXItPmZpbHRlcl9saXN0X2RtYSwKKwkJCQkgICAgIHJ4cV9kZXNjLmRlc2MsCisJCQkJICAgICBtYWNfYWRkcmVzcyk7CisJCWlibXZldGhfY2xlYW51cChhZGFwdGVyKTsKKwkJcmV0dXJuIC1FTk9ORVQ7IAorCX0KKworCWlibXZldGhfZGVidWdfcHJpbnRrKCJyZWdpc3RlcmluZyBpcnEgMHgleFxuIiwgbmV0ZGV2LT5pcnEpOworCWlmKChyYyA9IHJlcXVlc3RfaXJxKG5ldGRldi0+aXJxLCAmaWJtdmV0aF9pbnRlcnJ1cHQsIDAsIG5ldGRldi0+bmFtZSwgbmV0ZGV2KSkgIT0gMCkgeworCQlpYm12ZXRoX2Vycm9yX3ByaW50aygidW5hYmxlIHRvIHJlcXVlc3QgaXJxIDB4JXgsIHJjICVkXG4iLCBuZXRkZXYtPmlycSwgcmMpOworCQlkbyB7CisJCQlyYyA9IGhfZnJlZV9sb2dpY2FsX2xhbihhZGFwdGVyLT52ZGV2LT51bml0X2FkZHJlc3MpOworCQl9IHdoaWxlIChIX2lzTG9uZ0J1c3kocmMpIHx8IChyYyA9PSBIX0J1c3kpKTsKKworCQlpYm12ZXRoX2NsZWFudXAoYWRhcHRlcik7CisJCXJldHVybiByYzsKKwl9CisKKwluZXRpZl9zdGFydF9xdWV1ZShuZXRkZXYpOworCisJaWJtdmV0aF9kZWJ1Z19wcmludGsoInNjaGVkdWxpbmcgaW5pdGlhbCByZXBsZW5pc2ggY3ljbGVcbiIpOworCWlibXZldGhfc2NoZWR1bGVfcmVwbGVuaXNoaW5nKGFkYXB0ZXIpOworCisJaWJtdmV0aF9kZWJ1Z19wcmludGsoIm9wZW4gY29tcGxldGVcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWJtdmV0aF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJbG9uZyBscGFyX3JjOworICAgIAorCWlibXZldGhfZGVidWdfcHJpbnRrKCJjbG9zZSBzdGFydGluZ1xuIik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwlmcmVlX2lycShuZXRkZXYtPmlycSwgbmV0ZGV2KTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmFkYXB0ZXItPnJlcGxlbmlzaF90YXNrKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJZG8geworCQlscGFyX3JjID0gaF9mcmVlX2xvZ2ljYWxfbGFuKGFkYXB0ZXItPnZkZXYtPnVuaXRfYWRkcmVzcyk7CisJfSB3aGlsZSAoSF9pc0xvbmdCdXN5KGxwYXJfcmMpIHx8IChscGFyX3JjID09IEhfQnVzeSkpOworCisJaWYobHBhcl9yYyAhPSBIX1N1Y2Nlc3MpCisJeworCQlpYm12ZXRoX2Vycm9yX3ByaW50aygiaF9mcmVlX2xvZ2ljYWxfbGFuIGZhaWxlZCB3aXRoICVseCwgY29udGludWluZyB3aXRoIGNsb3NlXG4iLAorCQkJCSAgICAgbHBhcl9yYyk7CisJfQorCisJYWRhcHRlci0+cnhfbm9fYnVmZmVyID0gKih1NjQqKSgoKGNoYXIqKWFkYXB0ZXItPmJ1ZmZlcl9saXN0X2FkZHIpICsgNDA5NiAtIDgpOworCisJaWJtdmV0aF9jbGVhbnVwKGFkYXB0ZXIpOworCisJaWJtdmV0aF9kZWJ1Z19wcmludGsoImNsb3NlIGNvbXBsZXRlXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5ldGRldl9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpIHsKKwljbWQtPnN1cHBvcnRlZCA9IChTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfQXV0b25lZyB8IFNVUFBPUlRFRF9GSUJSRSk7CisJY21kLT5hZHZlcnRpc2luZyA9IChBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsIHwgQURWRVJUSVNFRF9BdXRvbmVnIHwgQURWRVJUSVNFRF9GSUJSRSk7CisJY21kLT5zcGVlZCA9IFNQRUVEXzEwMDA7CisJY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwljbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOworCWNtZC0+cGh5X2FkZHJlc3MgPSAwOworCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOworCWNtZC0+bWF4dHhwa3QgPSAwOworCWNtZC0+bWF4cnhwa3QgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pIHsKKwlzdHJuY3B5KGluZm8tPmRyaXZlciwgaWJtdmV0aF9kcml2ZXJfbmFtZSwgc2l6ZW9mKGluZm8tPmRyaXZlcikgLSAxKTsKKwlzdHJuY3B5KGluZm8tPnZlcnNpb24sIGlibXZldGhfZHJpdmVyX3ZlcnNpb24sIHNpemVvZihpbmZvLT52ZXJzaW9uKSAtIDEpOworfQorCitzdGF0aWMgdTMyIG5ldGRldl9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBuZXRkZXZfZ2V0X2RydmluZm8sCisJLmdldF9zZXR0aW5ncwkJPSBuZXRkZXZfZ2V0X3NldHRpbmdzLAorCS5nZXRfbGluawkJPSBuZXRkZXZfZ2V0X2xpbmssCisJLmdldF9zZwkJCT0gZXRodG9vbF9vcF9nZXRfc2csCisJLmdldF90eF9jc3VtCQk9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCit9OworCitzdGF0aWMgaW50IGlibXZldGhfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisjZGVmaW5lIHBhZ2Vfb2Zmc2V0KHYpICgodW5zaWduZWQgbG9uZykodikgJiAoKDEgPDwgMTIpIC0gMSkpCisKK3N0YXRpYyBpbnQgaWJtdmV0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwl1bmlvbiBpYm12ZXRoX2J1Zl9kZXNjIGRlc2NbSWJtVmV0aE1heFNlbmRGcmFnc107CisJdW5zaWduZWQgbG9uZyBscGFyX3JjOworCWludCBuZnJhZ3MgPSAwLCBjdXJmcmFnOworCXVuc2lnbmVkIGxvbmcgY29ycmVsYXRvcjsKKwl1bnNpZ25lZCBpbnQgcmV0cnlfY291bnQ7CisKKwlpZiAoKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgKyAxKSA+IElibVZldGhNYXhTZW5kRnJhZ3MpIHsKKwkJYWRhcHRlci0+c3RhdHMudHhfZHJvcHBlZCsrOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKworCW1lbXNldCgmZGVzYywgMCwgc2l6ZW9mKGRlc2MpKTsKKworCS8qIG5mcmFncyA9IG51bWJlciBvZiBmcmFncyBhZnRlciB0aGUgaW5pdGlhbCBmcmFnbWVudCAqLworCW5mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisKKwlpZihuZnJhZ3MpCisJCWFkYXB0ZXItPnR4X211bHRpZGVzY19zZW5kKys7CisKKwkvKiBtYXAgdGhlIGluaXRpYWwgZnJhZ21lbnQgKi8KKwlkZXNjWzBdLmZpZWxkcy5sZW5ndGggID0gbmZyYWdzID8gc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuIDogc2tiLT5sZW47CisJZGVzY1swXS5maWVsZHMuYWRkcmVzcyA9IGRtYV9tYXBfc2luZ2xlKCZhZGFwdGVyLT52ZGV2LT5kZXYsIHNrYi0+ZGF0YSwKKwkJCQkJZGVzY1swXS5maWVsZHMubGVuZ3RoLCBETUFfVE9fREVWSUNFKTsKKwlkZXNjWzBdLmZpZWxkcy52YWxpZCAgID0gMTsKKworCWlmKGRtYV9tYXBwaW5nX2Vycm9yKGRlc2NbMF0uZmllbGRzLmFkZHJlc3MpKSB7CisJCWlibXZldGhfZXJyb3JfcHJpbnRrKCJ0eDogdW5hYmxlIHRvIG1hcCBpbml0aWFsIGZyYWdtZW50XG4iKTsKKwkJYWRhcHRlci0+dHhfbWFwX2ZhaWxlZCsrOworCQlhZGFwdGVyLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY3VyZnJhZyA9IG5mcmFnczsKKworCS8qIG1hcCBmcmFnbWVudHMgcGFzdCB0aGUgaW5pdGlhbCBwb3J0aW9uIGlmIHRoZXJlIGFyZSBhbnkgKi8KKwl3aGlsZShjdXJmcmFnLS0pIHsKKwkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2N1cmZyYWddOworCQlkZXNjW2N1cmZyYWcrMV0uZmllbGRzLmFkZHJlc3MKKwkJCT0gZG1hX21hcF9zaW5nbGUoJmFkYXB0ZXItPnZkZXYtPmRldiwKKwkJCQlwYWdlX2FkZHJlc3MoZnJhZy0+cGFnZSkgKyBmcmFnLT5wYWdlX29mZnNldCwKKwkJCQlmcmFnLT5zaXplLCBETUFfVE9fREVWSUNFKTsKKwkJZGVzY1tjdXJmcmFnKzFdLmZpZWxkcy5sZW5ndGggPSBmcmFnLT5zaXplOworCQlkZXNjW2N1cmZyYWcrMV0uZmllbGRzLnZhbGlkICA9IDE7CisKKwkJaWYoZG1hX21hcHBpbmdfZXJyb3IoZGVzY1tjdXJmcmFnKzFdLmZpZWxkcy5hZGRyZXNzKSkgeworCQkJaWJtdmV0aF9lcnJvcl9wcmludGsoInR4OiB1bmFibGUgdG8gbWFwIGZyYWdtZW50ICVkXG4iLCBjdXJmcmFnKTsKKwkJCWFkYXB0ZXItPnR4X21hcF9mYWlsZWQrKzsKKwkJCWFkYXB0ZXItPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJCS8qIEZyZWUgYWxsIHRoZSBtYXBwaW5ncyB3ZSBqdXN0IGNyZWF0ZWQgKi8KKwkJCXdoaWxlKGN1cmZyYWcgPCBuZnJhZ3MpIHsKKwkJCQlkbWFfdW5tYXBfc2luZ2xlKCZhZGFwdGVyLT52ZGV2LT5kZXYsCisJCQkJCQkgZGVzY1tjdXJmcmFnKzFdLmZpZWxkcy5hZGRyZXNzLAorCQkJCQkJIGRlc2NbY3VyZnJhZysxXS5maWVsZHMubGVuZ3RoLAorCQkJCQkJIERNQV9UT19ERVZJQ0UpOworCQkJCWN1cmZyYWcrKzsKKwkJCX0KKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogc2VuZCB0aGUgZnJhbWUuIEFyYml0cmFyaWx5IHNldCByZXRyeWNvdW50IHRvIDEwMjQgKi8KKwljb3JyZWxhdG9yID0gMDsKKwlyZXRyeV9jb3VudCA9IDEwMjQ7CisJZG8geworCQlscGFyX3JjID0gaF9zZW5kX2xvZ2ljYWxfbGFuKGFkYXB0ZXItPnZkZXYtPnVuaXRfYWRkcmVzcywKKwkJCQkJICAgICBkZXNjWzBdLmRlc2MsCisJCQkJCSAgICAgZGVzY1sxXS5kZXNjLAorCQkJCQkgICAgIGRlc2NbMl0uZGVzYywKKwkJCQkJICAgICBkZXNjWzNdLmRlc2MsCisJCQkJCSAgICAgZGVzY1s0XS5kZXNjLAorCQkJCQkgICAgIGRlc2NbNV0uZGVzYywKKwkJCQkJICAgICBjb3JyZWxhdG9yKTsKKwl9IHdoaWxlICgobHBhcl9yYyA9PSBIX0J1c3kpICYmIChyZXRyeV9jb3VudC0tKSk7CisgICAgCisJaWYobHBhcl9yYyAhPSBIX1N1Y2Nlc3MgJiYgbHBhcl9yYyAhPSBIX0Ryb3BwZWQpIHsKKwkJaW50IGk7CisJCWlibXZldGhfZXJyb3JfcHJpbnRrKCJ0eDogaF9zZW5kX2xvZ2ljYWxfbGFuIGZhaWxlZCB3aXRoIHJjPSVsZFxuIiwgbHBhcl9yYyk7CisJCWZvcihpID0gMDsgaSA8IDY7IGkrKykgeworCQkJaWJtdmV0aF9lcnJvcl9wcmludGsoInR4OiBkZXNjWyVpXSB2YWxpZD0lZCwgbGVuPSVkLCBhZGRyZXNzPTB4JWRcbiIsIGksCisJCQkJCSAgICAgZGVzY1tpXS5maWVsZHMudmFsaWQsIGRlc2NbaV0uZmllbGRzLmxlbmd0aCwgZGVzY1tpXS5maWVsZHMuYWRkcmVzcyk7CisJCX0KKwkJYWRhcHRlci0+dHhfc2VuZF9mYWlsZWQrKzsKKwkJYWRhcHRlci0+c3RhdHMudHhfZHJvcHBlZCsrOworCX0gZWxzZSB7CisJCWFkYXB0ZXItPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJYWRhcHRlci0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJfQorCisJZG8geworCQlkbWFfdW5tYXBfc2luZ2xlKCZhZGFwdGVyLT52ZGV2LT5kZXYsCisJCQkJZGVzY1tuZnJhZ3NdLmZpZWxkcy5hZGRyZXNzLAorCQkJCWRlc2NbbmZyYWdzXS5maWVsZHMubGVuZ3RoLCBETUFfVE9fREVWSUNFKTsKKwl9IHdoaWxlKC0tbmZyYWdzID49IDApOworCisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlibXZldGhfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgKmJ1ZGdldCkKK3sKKwlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCWludCBtYXhfZnJhbWVzX3RvX3Byb2Nlc3MgPSBuZXRkZXYtPnF1b3RhOworCWludCBmcmFtZXNfcHJvY2Vzc2VkID0gMDsKKwlpbnQgbW9yZV93b3JrID0gMTsKKwl1bnNpZ25lZCBsb25nIGxwYXJfcmM7CisKKyByZXN0YXJ0X3BvbGw6CisJZG8geworCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCisJCWlmKGlibXZldGhfcnhxX3BlbmRpbmdfYnVmZmVyKGFkYXB0ZXIpKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlybWIoKTsKKworCQkJaWYoIWlibXZldGhfcnhxX2J1ZmZlcl92YWxpZChhZGFwdGVyKSkgeworCQkJCXdtYigpOyAvKiBzdWdnZXN0ZWQgYnkgbGFyc29uMSAqLworCQkJCWFkYXB0ZXItPnJ4X2ludmFsaWRfYnVmZmVyKys7CisJCQkJaWJtdmV0aF9kZWJ1Z19wcmludGsoInJlY3ljbGluZyBpbnZhbGlkIGJ1ZmZlclxuIik7CisJCQkJaWJtdmV0aF9yeHFfcmVjeWNsZV9idWZmZXIoYWRhcHRlcik7CisJCQl9IGVsc2UgeworCQkJCWludCBsZW5ndGggPSBpYm12ZXRoX3J4cV9mcmFtZV9sZW5ndGgoYWRhcHRlcik7CisJCQkJaW50IG9mZnNldCA9IGlibXZldGhfcnhxX2ZyYW1lX29mZnNldChhZGFwdGVyKTsKKwkJCQlza2IgPSBpYm12ZXRoX3J4cV9nZXRfYnVmZmVyKGFkYXB0ZXIpOworCisJCQkJaWJtdmV0aF9yeHFfaGFydmVzdF9idWZmZXIoYWRhcHRlcik7CisKKwkJCQlza2JfcmVzZXJ2ZShza2IsIG9mZnNldCk7CisJCQkJc2tiX3B1dChza2IsIGxlbmd0aCk7CisJCQkJc2tiLT5kZXYgPSBuZXRkZXY7CisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmV0ZGV2KTsKKworCQkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CS8qIHNlbmQgaXQgdXAgKi8KKworCQkJCWFkYXB0ZXItPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlhZGFwdGVyLT5zdGF0cy5yeF9ieXRlcyArPSBsZW5ndGg7CisJCQkJZnJhbWVzX3Byb2Nlc3NlZCsrOworCQkJfQorCQl9IGVsc2UgeworCQkJbW9yZV93b3JrID0gMDsKKwkJfQorCX0gd2hpbGUobW9yZV93b3JrICYmIChmcmFtZXNfcHJvY2Vzc2VkIDwgbWF4X2ZyYW1lc190b19wcm9jZXNzKSk7CisKKwlpYm12ZXRoX3NjaGVkdWxlX3JlcGxlbmlzaGluZyhhZGFwdGVyKTsKKworCWlmKG1vcmVfd29yaykgeworCQkvKiBtb3JlIHdvcmsgdG8gZG8gLSByZXR1cm4gdGhhdCB3ZSBhcmUgbm90IGRvbmUgeWV0ICovCisJCW5ldGRldi0+cXVvdGEgLT0gZnJhbWVzX3Byb2Nlc3NlZDsKKwkJKmJ1ZGdldCAtPSBmcmFtZXNfcHJvY2Vzc2VkOworCQlyZXR1cm4gMTsgCisJfQorCisJLyogd2UgdGhpbmsgd2UgYXJlIGRvbmUgLSByZWVuYWJsZSBpbnRlcnJ1cHRzLCB0aGVuIGNoZWNrIG9uY2UgbW9yZSB0byBtYWtlIHN1cmUgd2UgYXJlIGRvbmUgKi8KKwlscGFyX3JjID0gaF92aW9fc2lnbmFsKGFkYXB0ZXItPnZkZXYtPnVuaXRfYWRkcmVzcywgVklPX0lSUV9FTkFCTEUpOworCisJaWJtdmV0aF9hc3NlcnQobHBhcl9yYyA9PSBIX1N1Y2Nlc3MpOworCisJbmV0aWZfcnhfY29tcGxldGUobmV0ZGV2KTsKKworCWlmKGlibXZldGhfcnhxX3BlbmRpbmdfYnVmZmVyKGFkYXB0ZXIpICYmIG5ldGlmX3J4X3Jlc2NoZWR1bGUobmV0ZGV2LCBmcmFtZXNfcHJvY2Vzc2VkKSkKKwl7CisJCWxwYXJfcmMgPSBoX3Zpb19zaWduYWwoYWRhcHRlci0+dmRldi0+dW5pdF9hZGRyZXNzLCBWSU9fSVJRX0RJU0FCTEUpOworCQlpYm12ZXRoX2Fzc2VydChscGFyX3JjID09IEhfU3VjY2Vzcyk7CisJCW1vcmVfd29yayA9IDE7CisJCWdvdG8gcmVzdGFydF9wb2xsOworCX0KKworCW5ldGRldi0+cXVvdGEgLT0gZnJhbWVzX3Byb2Nlc3NlZDsKKwkqYnVkZ2V0IC09IGZyYW1lc19wcm9jZXNzZWQ7CisKKwkvKiB3ZSByZWFsbHkgYXJlIGRvbmUgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IGlibXZldGhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7ICAgCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgbHBhcl9yYzsKKworCWlmKG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAobmV0ZGV2KSkgeworCQlscGFyX3JjID0gaF92aW9fc2lnbmFsKGFkYXB0ZXItPnZkZXYtPnVuaXRfYWRkcmVzcywgVklPX0lSUV9ESVNBQkxFKTsKKwkJaWJtdmV0aF9hc3NlcnQobHBhcl9yYyA9PSBIX1N1Y2Nlc3MpOworCQlfX25ldGlmX3J4X3NjaGVkdWxlKG5ldGRldik7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppYm12ZXRoX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJcmV0dXJuICZhZGFwdGVyLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgaWJtdmV0aF9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgbHBhcl9yYzsKKworCWlmKChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHx8IChuZXRkZXYtPm1jX2NvdW50ID4gYWRhcHRlci0+bWNhc3RGaWx0ZXJTaXplKSkgeworCQlscGFyX3JjID0gaF9tdWx0aWNhc3RfY3RybChhZGFwdGVyLT52ZGV2LT51bml0X2FkZHJlc3MsCisJCQkJCSAgIElibVZldGhNY2FzdEVuYWJsZVJlY3YgfAorCQkJCQkgICBJYm1WZXRoTWNhc3REaXNhYmxlRmlsdGVyaW5nLAorCQkJCQkgICAwKTsKKwkJaWYobHBhcl9yYyAhPSBIX1N1Y2Nlc3MpIHsKKwkJCWlibXZldGhfZXJyb3JfcHJpbnRrKCJoX211bHRpY2FzdF9jdHJsIHJjPSVsZCB3aGVuIGVudGVyaW5nIHByb21pc2MgbW9kZVxuIiwgbHBhcl9yYyk7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdCA9IG5ldGRldi0+bWNfbGlzdDsKKwkJaW50IGk7CisJCS8qIGNsZWFyIHRoZSBmaWx0ZXIgdGFibGUgJiBkaXNhYmxlIGZpbHRlcmluZyAqLworCQlscGFyX3JjID0gaF9tdWx0aWNhc3RfY3RybChhZGFwdGVyLT52ZGV2LT51bml0X2FkZHJlc3MsCisJCQkJCSAgIElibVZldGhNY2FzdEVuYWJsZVJlY3YgfAorCQkJCQkgICBJYm1WZXRoTWNhc3REaXNhYmxlRmlsdGVyaW5nIHwKKwkJCQkJICAgSWJtVmV0aE1jYXN0Q2xlYXJGaWx0ZXJUYWJsZSwKKwkJCQkJICAgMCk7CisJCWlmKGxwYXJfcmMgIT0gSF9TdWNjZXNzKSB7CisJCQlpYm12ZXRoX2Vycm9yX3ByaW50aygiaF9tdWx0aWNhc3RfY3RybCByYz0lbGQgd2hlbiBhdHRlbXB0aW5nIHRvIGNsZWFyIGZpbHRlciB0YWJsZVxuIiwgbHBhcl9yYyk7CisJCX0KKwkJLyogYWRkIHRoZSBhZGRyZXNzZXMgdG8gdGhlIGZpbHRlciB0YWJsZSAqLworCQlmb3IoaSA9IDA7IGkgPCBuZXRkZXYtPm1jX2NvdW50OyArK2ksIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQkJLy8gYWRkIHRoZSBtdWx0aWNhc3QgYWRkcmVzcyB0byB0aGUgZmlsdGVyIHRhYmxlCisJCQl1bnNpZ25lZCBsb25nIG1jYXN0X2FkZHIgPSAwOworCQkJbWVtY3B5KCgoY2hhciAqKSZtY2FzdF9hZGRyKSsyLCBtY2xpc3QtPmRtaV9hZGRyLCA2KTsKKwkJCWxwYXJfcmMgPSBoX211bHRpY2FzdF9jdHJsKGFkYXB0ZXItPnZkZXYtPnVuaXRfYWRkcmVzcywKKwkJCQkJCSAgIElibVZldGhNY2FzdEFkZEZpbHRlciwKKwkJCQkJCSAgIG1jYXN0X2FkZHIpOworCQkJaWYobHBhcl9yYyAhPSBIX1N1Y2Nlc3MpIHsKKwkJCQlpYm12ZXRoX2Vycm9yX3ByaW50aygiaF9tdWx0aWNhc3RfY3RybCByYz0lbGQgd2hlbiBhZGRpbmcgYW4gZW50cnkgdG8gdGhlIGZpbHRlciB0YWJsZVxuIiwgbHBhcl9yYyk7CisJCQl9CisJCX0KKwkKKwkJLyogcmUtZW5hYmxlIGZpbHRlcmluZyAqLworCQlscGFyX3JjID0gaF9tdWx0aWNhc3RfY3RybChhZGFwdGVyLT52ZGV2LT51bml0X2FkZHJlc3MsCisJCQkJCSAgIElibVZldGhNY2FzdEVuYWJsZUZpbHRlcmluZywKKwkJCQkJICAgMCk7CisJCWlmKGxwYXJfcmMgIT0gSF9TdWNjZXNzKSB7CisJCQlpYm12ZXRoX2Vycm9yX3ByaW50aygiaF9tdWx0aWNhc3RfY3RybCByYz0lbGQgd2hlbiBlbmFibGluZyBmaWx0ZXJpbmdcbiIsIGxwYXJfcmMpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGlibXZldGhfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlpZiAoKG5ld19tdHUgPCA2OCkgfHwgKG5ld19tdHUgPiAoMTw8MjApKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGV2LT5tdHUgPSBuZXdfbXR1OworCXJldHVybiAwOwkKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaWJtdmV0aF9wcm9iZShzdHJ1Y3QgdmlvX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJjOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcjsKKworCXVuc2lnbmVkIGNoYXIgKm1hY19hZGRyX3A7CisJdW5zaWduZWQgaW50ICptY2FzdEZpbHRlclNpemVfcDsKKworCisJaWJtdmV0aF9kZWJ1Z19wcmludGtfbm9fYWRhcHRlcigiZW50ZXJpbmcgaWJtdmV0aF9wcm9iZSBmb3IgVUEgMHgleFxuIiwgCisJCQkJCWRldi0+dW5pdF9hZGRyZXNzKTsKKworCW1hY19hZGRyX3AgPSAodW5zaWduZWQgY2hhciAqKSB2aW9fZ2V0X2F0dHJpYnV0ZShkZXYsIFZFVEhfTUFDX0FERFIsIDApOworCWlmKCFtYWNfYWRkcl9wKSB7CisJCXByaW50ayhLRVJOX0VSUiAiKCVzOiUzLjNkKSBFUlJPUjogQ2FuJ3QgZmluZCBWRVRIX01BQ19BRERSICIKKwkJCQkiYXR0cmlidXRlXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOworCQlyZXR1cm4gMDsKKwl9CisJCisJbWNhc3RGaWx0ZXJTaXplX3A9ICh1bnNpZ25lZCBpbnQgKikgdmlvX2dldF9hdHRyaWJ1dGUoZGV2LCBWRVRIX01DQVNUX0ZJTFRFUl9TSVpFLCAwKTsKKwlpZighbWNhc3RGaWx0ZXJTaXplX3ApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIoJXM6JTMuM2QpIEVSUk9SOiBDYW4ndCBmaW5kICIKKwkJCQkiVkVUSF9NQ0FTVF9GSUxURVJfU0laRSBhdHRyaWJ1dGVcbiIsCisJCQkJX19GSUxFX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyKSk7CisKKwlpZighbmV0ZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCVNFVF9NT0RVTEVfT1dORVIobmV0ZGV2KTsKKworCWFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJbWVtc2V0KGFkYXB0ZXIsIDAsIHNpemVvZihhZGFwdGVyKSk7CisJZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSBuZXRkZXY7CisKKwlhZGFwdGVyLT52ZGV2ID0gZGV2OworCWFkYXB0ZXItPm5ldGRldiA9IG5ldGRldjsKKwlhZGFwdGVyLT5tY2FzdEZpbHRlclNpemU9ICptY2FzdEZpbHRlclNpemVfcDsKKwkKKwkvKiAJU29tZSBvbGRlciBib3hlcyBydW5uaW5nIFBIWVAgbm9uLW5hdGl2ZWx5IGhhdmUgYW4gT0YgdGhhdAorCQlyZXR1cm5zIGEgOC1ieXRlIGxvY2FsLW1hYy1hZGRyZXNzIGZpZWxkIChhbmQgdGhlIGZpcnN0IAorCQkyIGJ5dGVzIGhhdmUgdG8gYmUgaWdub3JlZCkgd2hpbGUgbmV3ZXIgYm94ZXMnIE9GIHJldHVybgorCQlhIDYtYnl0ZSBmaWVsZC4gTm90ZSB0aGF0IElFRUUgMTI3NSBzcGVjaWZpZXMgdGhhdCAKKwkJbG9jYWwtbWFjLWFkZHJlc3MgbXVzdCBiZSBhIDYtYnl0ZSBmaWVsZC4KKwkJVGhlIFJQQSBkb2Mgc3BlY2lmaWVzIHRoYXQgdGhlIGZpcnN0IGJ5dGUgbXVzdCBiZSAxMGIsIHNvIAorCQl3ZSdsbCBqdXN0IGxvb2sgZm9yIGl0IHRvIHNvbHZlIHRoaXMgOCB2cy4gNiBieXRlIGZpZWxkIGlzc3VlICovCisKKwlpZiAoKCptYWNfYWRkcl9wICYgMHgzKSAhPSAweDAyKQorCQltYWNfYWRkcl9wICs9IDI7CisKKwlhZGFwdGVyLT5tYWNfYWRkciA9IDA7CisJbWVtY3B5KCZhZGFwdGVyLT5tYWNfYWRkciwgbWFjX2FkZHJfcCwgNik7CisKKwlhZGFwdGVyLT5saW9ibiA9IGRldi0+aW9tbXVfdGFibGUtPml0X2luZGV4OworCQorCW5ldGRldi0+aXJxID0gZGV2LT5pcnE7CisJbmV0ZGV2LT5vcGVuICAgICAgICAgICAgICAgPSBpYm12ZXRoX29wZW47CisJbmV0ZGV2LT5wb2xsICAgICAgICAgICAgICAgPSBpYm12ZXRoX3BvbGw7CisJbmV0ZGV2LT53ZWlnaHQgICAgICAgICAgICAgPSAxNjsKKwluZXRkZXYtPnN0b3AgICAgICAgICAgICAgICA9IGlibXZldGhfY2xvc2U7CisJbmV0ZGV2LT5oYXJkX3N0YXJ0X3htaXQgICAgPSBpYm12ZXRoX3N0YXJ0X3htaXQ7CisJbmV0ZGV2LT5nZXRfc3RhdHMgICAgICAgICAgPSBpYm12ZXRoX2dldF9zdGF0czsKKwluZXRkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGlibXZldGhfc2V0X211bHRpY2FzdF9saXN0OworCW5ldGRldi0+ZG9faW9jdGwgICAgICAgICAgID0gaWJtdmV0aF9pb2N0bDsKKwluZXRkZXYtPmV0aHRvb2xfb3BzICAgICAgICAgICA9ICZuZXRkZXZfZXRodG9vbF9vcHM7CisJbmV0ZGV2LT5jaGFuZ2VfbXR1ICAgICAgICAgPSBpYm12ZXRoX2NoYW5nZV9tdHU7CisJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmZGV2LT5kZXYpOworCisJbWVtY3B5KCZuZXRkZXYtPmRldl9hZGRyLCAmYWRhcHRlci0+bWFjX2FkZHIsIG5ldGRldi0+YWRkcl9sZW4pOworCisJaWJtdmV0aF9pbml0X2J1ZmZlcl9wb29sKCZhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMF0sIDAsIElibVZldGhQb29sMERmdENudCwgSWJtVmV0aFBvb2wwRGZ0U2l6ZSk7CisJaWJtdmV0aF9pbml0X2J1ZmZlcl9wb29sKCZhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMV0sIDEsIElibVZldGhQb29sMURmdENudCwgSWJtVmV0aFBvb2wxRGZ0U2l6ZSk7CisJaWJtdmV0aF9pbml0X2J1ZmZlcl9wb29sKCZhZGFwdGVyLT5yeF9idWZmX3Bvb2xbMl0sIDIsIElibVZldGhQb29sMkRmdENudCwgSWJtVmV0aFBvb2wyRGZ0U2l6ZSk7CisKKwlpYm12ZXRoX2RlYnVnX3ByaW50aygiYWRhcHRlciBAIDB4JXBcbiIsIGFkYXB0ZXIpOworCisJSU5JVF9XT1JLKCZhZGFwdGVyLT5yZXBsZW5pc2hfdGFzaywgKHZvaWQqKWlibXZldGhfcmVwbGVuaXNoX3Rhc2ssICh2b2lkKilhZGFwdGVyKTsKKworCWFkYXB0ZXItPmJ1ZmZlcl9saXN0X2RtYSA9IERNQV9FUlJPUl9DT0RFOworCWFkYXB0ZXItPmZpbHRlcl9saXN0X2RtYSA9IERNQV9FUlJPUl9DT0RFOworCWFkYXB0ZXItPnJ4X3F1ZXVlLnF1ZXVlX2RtYSA9IERNQV9FUlJPUl9DT0RFOworCisJYXRvbWljX3NldCgmYWRhcHRlci0+bm90X3JlcGxlbmlzaGluZywgMSk7CisKKwlpYm12ZXRoX2RlYnVnX3ByaW50aygicmVnaXN0ZXJpbmcgbmV0ZGV2Li4uXG4iKTsKKworCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisKKwlpZihyYykgeworCQlpYm12ZXRoX2RlYnVnX3ByaW50aygiZmFpbGVkIHRvIHJlZ2lzdGVyIG5ldGRldiByYz0lZFxuIiwgcmMpOworCQlmcmVlX25ldGRldihuZXRkZXYpOworCQlyZXR1cm4gcmM7CisJfQorCisJaWJtdmV0aF9kZWJ1Z19wcmludGsoInJlZ2lzdGVyZWRcbiIpOworCisJaWJtdmV0aF9wcm9jX3JlZ2lzdGVyX2FkYXB0ZXIoYWRhcHRlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgaWJtdmV0aF9yZW1vdmUoc3RydWN0IHZpb19kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGV2LT5kZXYuZHJpdmVyX2RhdGE7CisJc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisKKwlpYm12ZXRoX3Byb2NfdW5yZWdpc3Rlcl9hZGFwdGVyKGFkYXB0ZXIpOworCisJZnJlZV9uZXRkZXYobmV0ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgdm9pZCBpYm12ZXRoX3Byb2NfcmVnaXN0ZXJfZHJpdmVyKHZvaWQpCit7CisJaWJtdmV0aF9wcm9jX2RpciA9IGNyZWF0ZV9wcm9jX2VudHJ5KElCTVZFVEhfUFJPQ19ESVIsIFNfSUZESVIsIHByb2NfbmV0KTsKKwlpZiAoaWJtdmV0aF9wcm9jX2RpcikgeworCQlTRVRfTU9EVUxFX09XTkVSKGlibXZldGhfcHJvY19kaXIpOworCX0KK30KKworc3RhdGljIHZvaWQgaWJtdmV0aF9wcm9jX3VucmVnaXN0ZXJfZHJpdmVyKHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoSUJNVkVUSF9QUk9DX0RJUiwgcHJvY19uZXQpOworfQorCitzdGF0aWMgdm9pZCAqaWJtdmV0aF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKSAKK3sKKwlpZiAoKnBvcyA9PSAwKSB7CisJCXJldHVybiAodm9pZCAqKTE7CisJfSBlbHNlIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCAqaWJtdmV0aF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKysqcG9zOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBpYm12ZXRoX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KSAKK3sKK30KKworc3RhdGljIGludCBpYm12ZXRoX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KSAKK3sKKwlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gc2VxLT5wcml2YXRlOworCWNoYXIgKmN1cnJlbnRfbWFjID0gKChjaGFyKikgJmFkYXB0ZXItPm5ldGRldi0+ZGV2X2FkZHIpOworCWNoYXIgKmZpcm13YXJlX21hYyA9ICgoY2hhciopICZhZGFwdGVyLT5tYWNfYWRkcikgOworCisJc2VxX3ByaW50ZihzZXEsICIlcyAlc1xuXG4iLCBpYm12ZXRoX2RyaXZlcl9zdHJpbmcsIGlibXZldGhfZHJpdmVyX3ZlcnNpb24pOworCQorCXNlcV9wcmludGYoc2VxLCAiVW5pdCBBZGRyZXNzOiAgICAweCV4XG4iLCBhZGFwdGVyLT52ZGV2LT51bml0X2FkZHJlc3MpOworCXNlcV9wcmludGYoc2VxLCAiTElPQk46ICAgICAgICAgICAweCVseFxuIiwgYWRhcHRlci0+bGlvYm4pOworCXNlcV9wcmludGYoc2VxLCAiQ3VycmVudCBNQUM6ICAgICAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkJICAgY3VycmVudF9tYWNbMF0sIGN1cnJlbnRfbWFjWzFdLCBjdXJyZW50X21hY1syXSwKKwkJICAgY3VycmVudF9tYWNbM10sIGN1cnJlbnRfbWFjWzRdLCBjdXJyZW50X21hY1s1XSk7CisJc2VxX3ByaW50ZihzZXEsICJGaXJtd2FyZSBNQUM6ICAgICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCQkgICBmaXJtd2FyZV9tYWNbMF0sIGZpcm13YXJlX21hY1sxXSwgZmlybXdhcmVfbWFjWzJdLAorCQkgICBmaXJtd2FyZV9tYWNbM10sIGZpcm13YXJlX21hY1s0XSwgZmlybXdhcmVfbWFjWzVdKTsKKwkKKwlzZXFfcHJpbnRmKHNlcSwgIlxuQWRhcHRlciBTdGF0aXN0aWNzOlxuIik7CisJc2VxX3ByaW50ZihzZXEsICIgIFRYOiAgc2tidWZmcyBsaW5lYXJpemVkOiAgICAgICAgICAlbGRcbiIsIGFkYXB0ZXItPnR4X2xpbmVhcml6ZWQpOworCXNlcV9wcmludGYoc2VxLCAiICAgICAgIG11bHRpLWRlc2NyaXB0b3Igc2VuZHM6ICAgICAgJWxkXG4iLCBhZGFwdGVyLT50eF9tdWx0aWRlc2Nfc2VuZCk7CisJc2VxX3ByaW50ZihzZXEsICIgICAgICAgc2tiX2xpbmVhcml6ZSBmYWlsdXJlczogICAgICAlbGRcbiIsIGFkYXB0ZXItPnR4X2xpbmVhcml6ZV9mYWlsZWQpOworCXNlcV9wcmludGYoc2VxLCAiICAgICAgIHZpb19tYXBfc2luZ2xlIGZhaWxyZXM6ICAgICAgJWxkXG4iLCBhZGFwdGVyLT50eF9tYXBfZmFpbGVkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgICAgICBzZW5kIGZhaWx1cmVzOiAgICAgICAgICAgICAgICVsZFxuIiwgYWRhcHRlci0+dHhfc2VuZF9mYWlsZWQpOworCXNlcV9wcmludGYoc2VxLCAiICBSWDogIHJlcGxlbmlzaCB0YXNrIGN5Y2xlczogICAgICAgJWxkXG4iLCBhZGFwdGVyLT5yZXBsZW5pc2hfdGFza19jeWNsZXMpOworCXNlcV9wcmludGYoc2VxLCAiICAgICAgIGFsbG9jX3NrYl9mYWlsdXJlczogICAgICAgICAgJWxkXG4iLCBhZGFwdGVyLT5yZXBsZW5pc2hfbm9fbWVtKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgICAgICBhZGQgYnVmZmVyIGZhaWx1cmVzOiAgICAgICAgICVsZFxuIiwgYWRhcHRlci0+cmVwbGVuaXNoX2FkZF9idWZmX2ZhaWx1cmUpOworCXNlcV9wcmludGYoc2VxLCAiICAgICAgIGludmFsaWQgYnVmZmVyczogICAgICAgICAgICAgJWxkXG4iLCBhZGFwdGVyLT5yeF9pbnZhbGlkX2J1ZmZlcik7CisJc2VxX3ByaW50ZihzZXEsICIgICAgICAgbm8gYnVmZmVyczogICAgICAgICAgICAgICAgICAlbGRcbiIsIGFkYXB0ZXItPnJ4X25vX2J1ZmZlcik7CisJCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGlibXZldGhfc2VxX29wcyA9IHsKKwkuc3RhcnQgPSBpYm12ZXRoX3NlcV9zdGFydCwKKwkubmV4dCAgPSBpYm12ZXRoX3NlcV9uZXh0LAorCS5zdG9wICA9IGlibXZldGhfc2VxX3N0b3AsCisJLnNob3cgID0gaWJtdmV0aF9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgaWJtdmV0aF9wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICpzZXE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jOworCWludCByYzsKKworCXJjID0gc2VxX29wZW4oZmlsZSwgJmlibXZldGhfc2VxX29wcyk7CisJaWYgKCFyYykgeworCQkvKiByZWNvdmVyIHRoZSBwb2ludGVyIGJ1cmllZCBpbiBwcm9jX2Rpcl9lbnRyeSBkYXRhICovCisJCXNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwkJcHJvYyA9IFBERShpbm9kZSk7CisJCXNlcS0+cHJpdmF0ZSA9IHByb2MtPmRhdGE7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaWJtdmV0aF9wcm9jX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gaWJtdmV0aF9wcm9jX29wZW4sCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIHZvaWQgaWJtdmV0aF9wcm9jX3JlZ2lzdGVyX2FkYXB0ZXIoc3RydWN0IGlibXZldGhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OworCWlmIChpYm12ZXRoX3Byb2NfZGlyKSB7CisJCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoYWRhcHRlci0+bmV0ZGV2LT5uYW1lLCBTX0lGUkVHLCBpYm12ZXRoX3Byb2NfZGlyKTsKKwkJaWYgKCFlbnRyeSkgeworCQkJaWJtdmV0aF9lcnJvcl9wcmludGsoIkNhbm5vdCBjcmVhdGUgYWRhcHRlciBwcm9jIGVudHJ5Iik7CisJCX0gZWxzZSB7CisJCQllbnRyeS0+ZGF0YSA9ICh2b2lkICopIGFkYXB0ZXI7CisJCQllbnRyeS0+cHJvY19mb3BzID0gJmlibXZldGhfcHJvY19mb3BzOworCQkJU0VUX01PRFVMRV9PV05FUihlbnRyeSk7CisJCX0KKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBpYm12ZXRoX3Byb2NfdW5yZWdpc3Rlcl9hZGFwdGVyKHN0cnVjdCBpYm12ZXRoX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKGlibXZldGhfcHJvY19kaXIpIHsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoYWRhcHRlci0+bmV0ZGV2LT5uYW1lLCBpYm12ZXRoX3Byb2NfZGlyKTsKKwl9Cit9CisKKyNlbHNlIC8qIENPTkZJR19QUk9DX0ZTICovCitzdGF0aWMgdm9pZCBpYm12ZXRoX3Byb2NfcmVnaXN0ZXJfYWRhcHRlcihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKSAKK3sKK30KKworc3RhdGljIHZvaWQgaWJtdmV0aF9wcm9jX3VucmVnaXN0ZXJfYWRhcHRlcihzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyKSAKK3sKK30KK3N0YXRpYyB2b2lkIGlibXZldGhfcHJvY19yZWdpc3Rlcl9kcml2ZXIodm9pZCkKK3sKK30KKworc3RhdGljIHZvaWQgaWJtdmV0aF9wcm9jX3VucmVnaXN0ZXJfZHJpdmVyKHZvaWQpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworc3RhdGljIHN0cnVjdCB2aW9fZGV2aWNlX2lkIGlibXZldGhfZGV2aWNlX3RhYmxlW10gX19kZXZpbml0ZGF0YT0geworCXsgIm5ldHdvcmsiLCAiSUJNLGwtbGFuIn0sCisJeyAwLH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodmlvLCBpYm12ZXRoX2RldmljZV90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgdmlvX2RyaXZlciBpYm12ZXRoX2RyaXZlciA9IHsKKwkubmFtZSAgICAgICAgPSAoY2hhciAqKWlibXZldGhfZHJpdmVyX25hbWUsCisJLmlkX3RhYmxlICAgID0gaWJtdmV0aF9kZXZpY2VfdGFibGUsCisJLnByb2JlICAgICAgID0gaWJtdmV0aF9wcm9iZSwKKwkucmVtb3ZlICAgICAgPSBpYm12ZXRoX3JlbW92ZQorfTsKKworc3RhdGljIGludCBfX2luaXQgaWJtdmV0aF9tb2R1bGVfaW5pdCh2b2lkKQoreworCWlibXZldGhfcHJpbnRrKCIlczogJXMgJXNcbiIsIGlibXZldGhfZHJpdmVyX25hbWUsIGlibXZldGhfZHJpdmVyX3N0cmluZywgaWJtdmV0aF9kcml2ZXJfdmVyc2lvbik7CisKKwlpYm12ZXRoX3Byb2NfcmVnaXN0ZXJfZHJpdmVyKCk7CisKKwlyZXR1cm4gdmlvX3JlZ2lzdGVyX2RyaXZlcigmaWJtdmV0aF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaWJtdmV0aF9tb2R1bGVfZXhpdCh2b2lkKQoreworCXZpb191bnJlZ2lzdGVyX2RyaXZlcigmaWJtdmV0aF9kcml2ZXIpOworCWlibXZldGhfcHJvY191bnJlZ2lzdGVyX2RyaXZlcigpOworfQkKKworbW9kdWxlX2luaXQoaWJtdmV0aF9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChpYm12ZXRoX21vZHVsZV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2libXZldGguaCBiL2RyaXZlcnMvbmV0L2libXZldGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWE0NzBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaWJtdmV0aC5oCkBAIC0wLDAgKzEsMTU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBJQk0gZVNlcnZlciBpL1tTZXJpZXMgVmlydHVhbCBFdGhlcm5ldCBEZXZpY2UgRHJpdmVyICAgICAgICAgICAgICAgICAgICovCisvKiBDb3B5cmlnaHQgKEMpIDIwMDMgSUJNIENvcnAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2ZSBMYXJzb24gKGxhcnNvbjFAdXMuaWJtLmNvbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2FudGlhZ28gTGVvbiAoc2FudGlsQHVzLmlibS5jb20pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICovCisvKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICovCisvKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgICAgICovCisvKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICovCisvKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICovCisvKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICovCisvKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICovCisvKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICovCisvKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0EgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0lCTVZFVEhfSAorI2RlZmluZSBfSUJNVkVUSF9ICisKKyNkZWZpbmUgSWJtVmV0aE1heFNlbmRGcmFncyA2CisKKy8qIGNvbnN0YW50cyBmb3IgSF9NVUxUSUNBU1RfQ1RSTCAqLworI2RlZmluZSBJYm1WZXRoTWNhc3RSZWNlcHRpb25Nb2RpZnlCaXQgICAgIDB4ODAwMDBVTAorI2RlZmluZSBJYm1WZXRoTWNhc3RSZWNlcHRpb25FbmFibGVCaXQgICAgIDB4MjAwMDBVTAorI2RlZmluZSBJYm1WZXRoTWNhc3RGaWx0ZXJNb2RpZnlCaXQgICAgICAgIDB4NDAwMDBVTAorI2RlZmluZSBJYm1WZXRoTWNhc3RGaWx0ZXJFbmFibGVCaXQgICAgICAgIDB4MTAwMDBVTAorCisjZGVmaW5lIElibVZldGhNY2FzdEVuYWJsZVJlY3YgICAgICAgKElibVZldGhNY2FzdFJlY2VwdGlvbk1vZGlmeUJpdCB8IElibVZldGhNY2FzdFJlY2VwdGlvbkVuYWJsZUJpdCkKKyNkZWZpbmUgSWJtVmV0aE1jYXN0RGlzYWJsZVJlY3YgICAgICAoSWJtVmV0aE1jYXN0UmVjZXB0aW9uTW9kaWZ5Qml0KQorI2RlZmluZSBJYm1WZXRoTWNhc3RFbmFibGVGaWx0ZXJpbmcgIChJYm1WZXRoTWNhc3RGaWx0ZXJNb2RpZnlCaXQgfCBJYm1WZXRoTWNhc3RGaWx0ZXJFbmFibGVCaXQpCisjZGVmaW5lIElibVZldGhNY2FzdERpc2FibGVGaWx0ZXJpbmcgKElibVZldGhNY2FzdEZpbHRlck1vZGlmeUJpdCkKKyNkZWZpbmUgSWJtVmV0aE1jYXN0QWRkRmlsdGVyICAgICAgICAweDFVTAorI2RlZmluZSBJYm1WZXRoTWNhc3RSZW1vdmVGaWx0ZXIgICAgIDB4MlVMCisjZGVmaW5lIElibVZldGhNY2FzdENsZWFyRmlsdGVyVGFibGUgMHgzVUwKKworLyogaGNhbGwgbnVtYmVycyAqLworI2RlZmluZSBIX1ZJT19TSUdOQUwgICAgICAgICAgICAgMHgxMDQKKyNkZWZpbmUgSF9SRUdJU1RFUl9MT0dJQ0FMX0xBTiAgIDB4MTE0CisjZGVmaW5lIEhfRlJFRV9MT0dJQ0FMX0xBTiAgICAgICAweDExOAorI2RlZmluZSBIX0FERF9MT0dJQ0FMX0xBTl9CVUZGRVIgMHgxMUMKKyNkZWZpbmUgSF9TRU5EX0xPR0lDQUxfTEFOICAgICAgIDB4MTIwCisjZGVmaW5lIEhfTVVMVElDQVNUX0NUUkwgICAgICAgICAweDEzMAorI2RlZmluZSBIX0NIQU5HRV9MT0dJQ0FMX0xBTl9NQUMgMHgxNEMKKworLyogaGNhbGwgbWFjcm9zICovCisjZGVmaW5lIGhfcmVnaXN0ZXJfbG9naWNhbF9sYW4odWEsIGJ1ZmxzdCwgcnhxLCBmbHRsc3QsIG1hYykgXAorICBwbHBhcl9oY2FsbF9ub3JldHMoSF9SRUdJU1RFUl9MT0dJQ0FMX0xBTiwgdWEsIGJ1ZmxzdCwgcnhxLCBmbHRsc3QsIG1hYykKKworI2RlZmluZSBoX2ZyZWVfbG9naWNhbF9sYW4odWEpIFwKKyAgcGxwYXJfaGNhbGxfbm9yZXRzKEhfRlJFRV9MT0dJQ0FMX0xBTiwgdWEpCisKKyNkZWZpbmUgaF9hZGRfbG9naWNhbF9sYW5fYnVmZmVyKHVhLCBidWYpIFwKKyAgcGxwYXJfaGNhbGxfbm9yZXRzKEhfQUREX0xPR0lDQUxfTEFOX0JVRkZFUiwgdWEsIGJ1ZikKKworI2RlZmluZSBoX3NlbmRfbG9naWNhbF9sYW4odWEsIGJ1ZjEsIGJ1ZjIsIGJ1ZjMsIGJ1ZjQsIGJ1ZjUsIGJ1ZjYsIGNvcnJlbGF0b3IpIFwKKyAgcGxwYXJfaGNhbGxfOGFyZ18ycmV0KEhfU0VORF9MT0dJQ0FMX0xBTiwgdWEsIGJ1ZjEsIGJ1ZjIsIGJ1ZjMsIGJ1ZjQsIGJ1ZjUsIGJ1ZjYsIGNvcnJlbGF0b3IsICZjb3JyZWxhdG9yKQorCisjZGVmaW5lIGhfbXVsdGljYXN0X2N0cmwodWEsIGNtZCwgbWFjKSBcCisgIHBscGFyX2hjYWxsX25vcmV0cyhIX01VTFRJQ0FTVF9DVFJMLCB1YSwgY21kLCBtYWMpCisKKyNkZWZpbmUgaF9jaGFuZ2VfbG9naWNhbF9sYW5fbWFjKHVhLCBtYWMpIFwKKyAgcGxwYXJfaGNhbGxfbm9yZXRzKEhfQ0hBTkdFX0xPR0lDQUxfTEFOX01BQywgdWEsIG1hYykKKworI2RlZmluZSBJYm1WZXRoTnVtQnVmZmVyUG9vbHMgMworI2RlZmluZSBJYm1WZXRoUG9vbDBEZnRTaXplICgxMDI0ICogMikKKyNkZWZpbmUgSWJtVmV0aFBvb2wxRGZ0U2l6ZSAoMTAyNCAqIDQpCisjZGVmaW5lIElibVZldGhQb29sMkRmdFNpemUgKDEwMjQgKiAxMCkKKyNkZWZpbmUgSWJtVmV0aFBvb2wwRGZ0Q250ICAyNTYKKyNkZWZpbmUgSWJtVmV0aFBvb2wxRGZ0Q250ICAyNTYKKyNkZWZpbmUgSWJtVmV0aFBvb2wyRGZ0Q250ICAyNTYKKworI2RlZmluZSBJQk1fVkVUSF9JTlZBTElEX01BUCAoKHUxNikweGZmZmYpCisKK3N0cnVjdCBpYm12ZXRoX2J1ZmZfcG9vbCB7CisgICAgdTMyIHNpemU7CisgICAgdTMyIGluZGV4OworICAgIHUzMiBidWZmX3NpemU7CisgICAgdTMyIHRocmVzaG9sZDsKKyAgICBhdG9taWNfdCBhdmFpbGFibGU7CisgICAgdTMyIGNvbnN1bWVyX2luZGV4OworICAgIHUzMiBwcm9kdWNlcl9pbmRleDsKKyAgICB1MTYgKmZyZWVfbWFwOworICAgIGRtYV9hZGRyX3QgKmRtYV9hZGRyOworICAgIHN0cnVjdCBza19idWZmICoqc2tidWZmOworfTsKKworc3RydWN0IGlibXZldGhfcnhfcSB7CisgICAgdTY0ICAgICAgICBpbmRleDsKKyAgICB1NjQgICAgICAgIG51bV9zbG90czsKKyAgICB1NjQgICAgICAgIHRvZ2dsZTsKKyAgICBkbWFfYWRkcl90IHF1ZXVlX2RtYTsKKyAgICB1MzIgICAgICAgIHF1ZXVlX2xlbjsKKyAgICBzdHJ1Y3QgaWJtdmV0aF9yeF9xX2VudHJ5ICpxdWV1ZV9hZGRyOworfTsKKworc3RydWN0IGlibXZldGhfYWRhcHRlciB7CisgICAgc3RydWN0IHZpb19kZXYgKnZkZXY7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKyAgICB1bnNpZ25lZCBpbnQgbWNhc3RGaWx0ZXJTaXplOworICAgIHVuc2lnbmVkIGxvbmcgbWFjX2FkZHI7CisgICAgdW5zaWduZWQgbG9uZyBsaW9ibjsKKyAgICB2b2lkICogYnVmZmVyX2xpc3RfYWRkcjsKKyAgICB2b2lkICogZmlsdGVyX2xpc3RfYWRkcjsKKyAgICBkbWFfYWRkcl90IGJ1ZmZlcl9saXN0X2RtYTsKKyAgICBkbWFfYWRkcl90IGZpbHRlcl9saXN0X2RtYTsKKyAgICBzdHJ1Y3QgaWJtdmV0aF9idWZmX3Bvb2wgcnhfYnVmZl9wb29sW0libVZldGhOdW1CdWZmZXJQb29sc107CisgICAgc3RydWN0IGlibXZldGhfcnhfcSByeF9xdWV1ZTsKKyAgICBhdG9taWNfdCBub3RfcmVwbGVuaXNoaW5nOworCisgICAgLyogaGVscGVyIHRhc2tzICovCisgICAgc3RydWN0IHdvcmtfc3RydWN0IHJlcGxlbmlzaF90YXNrOworCisgICAgLyogYWRhcHRlciBzcGVjaWZpYyBzdGF0cyAqLworICAgIHU2NCByZXBsZW5pc2hfdGFza19jeWNsZXM7CisgICAgdTY0IHJlcGxlbmlzaF9ub19tZW07CisgICAgdTY0IHJlcGxlbmlzaF9hZGRfYnVmZl9mYWlsdXJlOworICAgIHU2NCByZXBsZW5pc2hfYWRkX2J1ZmZfc3VjY2VzczsKKyAgICB1NjQgcnhfaW52YWxpZF9idWZmZXI7CisgICAgdTY0IHJ4X25vX2J1ZmZlcjsKKyAgICB1NjQgdHhfbXVsdGlkZXNjX3NlbmQ7CisgICAgdTY0IHR4X2xpbmVhcml6ZWQ7CisgICAgdTY0IHR4X2xpbmVhcml6ZV9mYWlsZWQ7CisgICAgdTY0IHR4X21hcF9mYWlsZWQ7CisgICAgdTY0IHR4X3NlbmRfZmFpbGVkOworfTsKKworc3RydWN0IGlibXZldGhfYnVmX2Rlc2NfZmllbGRzIHsJCisgICAgdTMyIHZhbGlkIDogMTsKKyAgICB1MzIgdG9nZ2xlIDogMTsKKyAgICB1MzIgcmVzZXJ2ZWQgOiA2OworICAgIHUzMiBsZW5ndGggOiAyNDsKKyAgICB1MzIgYWRkcmVzczsKK307CisKK3VuaW9uIGlibXZldGhfYnVmX2Rlc2MgeworICAgIHU2NCBkZXNjOwkKKyAgICBzdHJ1Y3QgaWJtdmV0aF9idWZfZGVzY19maWVsZHMgZmllbGRzOworfTsKKworc3RydWN0IGlibXZldGhfcnhfcV9lbnRyeSB7CisgICAgdTE2IHRvZ2dsZSA6IDE7CisgICAgdTE2IHZhbGlkIDogMTsKKyAgICB1MTYgcmVzZXJ2ZWQgOiAxNDsKKyAgICB1MTYgb2Zmc2V0OworICAgIHUzMiBsZW5ndGg7CisgICAgdTY0IGNvcnJlbGF0b3I7Cit9OworCisjZW5kaWYgLyogX0lCTVZFVEhfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaW9jMy1ldGguYyBiL2RyaXZlcnMvbmV0L2lvYzMtZXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyMGI1OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lvYzMtZXRoLmMKQEAgLTAsMCArMSwxNjUzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogRHJpdmVyIGZvciBTR0kncyBJT0MzIGJhc2VkIEV0aGVybmV0IGNhcmRzIGFzIGZvdW5kIGluIHRoZSBQQ0kgY2FyZC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMgUmFsZiBCYWVjaGxlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTksIDIwMDAsIDIwMDEgYnkgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICoKKyAqIFJlZmVyZW5jZXM6CisgKiAgbyBJT0MzIEFTSUMgc3BlY2lmaWNhdGlvbiA0LjUxLCAxOTk2LTA0LTE4CisgKiAgbyBJRUVFIDgwMi4zIHNwZWNpZmljYXRpb24sIDIwMDAgZWRpdGlvbgorICogIG8gRFAzODg0MEEgU3BlY2lmaWNhdGlvbiwgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciwgTWFyY2ggMTk5NworICoKKyAqIFRvIGRvOgorICoKKyAqICBvIEhhbmRsZSBhbGxvY2F0aW9uIGZhaWx1cmVzIGluIGlvYzNfYWxsb2Nfc2tiKCkgbW9yZSBncmFjZWZ1bGx5LgorICogIG8gSGFuZGxlIGFsbG9jYXRpb24gZmFpbHVyZXMgaW4gaW9jM19pbml0X3JpbmdzKCkuCisgKiAgbyBVc2UgcHJlZmV0Y2hpbmcgZm9yIGxhcmdlIHBhY2tldHMuICBXaGF0IGlzIGEgZ29vZCBsb3dlciBsaW1pdCBmb3IKKyAqICAgIHByZWZldGNoaW5nPworICogIG8gV2UncmUgcHJvYmFibHkgYWxsb2NhdGluZyBhIGJpdCB0b28gbXVjaCBtZW1vcnkuCisgKiAgbyBVc2UgaGFyZHdhcmUgY2hlY2tzdW1zLgorICogIG8gQ29udmVydCB0byB1c2luZyBhIElPQzMgbWV0YSBkcml2ZXIuCisgKiAgbyBXaGljaCBQSFlzIG1pZ2h0IHBvc3NpYmx5IGJlIGF0dGFjaGVkIHRvIHRoZSBJT0MzIGluIHJlYWwgbGl2ZSwKKyAqICAgIHdoaWNoIHdvcmthcm91bmRzIGFyZSByZXF1aXJlZCBmb3IgdGhlbT8gIERvIHdlIGV2ZXIgaGF2ZSBMdWNlbnQncz8KKyAqICBvIEZvciB0aGUgMi41IGJyYW5jaCBraWxsIHRoZSBtaWktdG9vbCBpb2N0bHMuCisgKi8KKworI2RlZmluZSBJT0MzX05BTUUJImlvYzMtZXRoIgorI2RlZmluZSBJT0MzX1ZFUlNJT04JIjIuNi4zLTMiCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisKKyNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTAKKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vc2VyaWFsLmg+CisjZGVmaW5lIElPQzNfQkFVRCAoMjIwMDAwMDAgLyAoMyoxNikpCisjZGVmaW5lIElPQzNfQ09NX0ZMQUdTIChBU1lOQ19CT09UX0FVVE9DT05GIHwgQVNZTkNfU0tJUF9URVNUKQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3NuL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3NuL3NuMC9hZGRycy5oPgorI2luY2x1ZGUgPGFzbS9zbi9zbjAvaHVibmkuaD4KKyNpbmNsdWRlIDxhc20vc24vc24wL2h1YmlvLmg+CisjaW5jbHVkZSA8YXNtL3NuL2tsY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL3NuL2lvYzMuaD4KKyNpbmNsdWRlIDxhc20vc24vc24wL2lwMjcuaD4KKyNpbmNsdWRlIDxhc20vcGNpL2JyaWRnZS5oPgorCisvKgorICogNjQgUlggYnVmZmVycy4gIFRoaXMgaXMgdHVuYWJsZSBpbiB0aGUgcmFuZ2Ugb2YgMTYgPD0geCA8IDUxMi4gIFRoZQorICogdmFsdWUgbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4KKyAqLworI2RlZmluZSBSWF9CVUZGUyA2NAorCisjZGVmaW5lIEVUQ1NSX0ZECSgoMTc8PEVUQ1NSX0lQR1IyX1NISUZUKSB8ICgxMTw8RVRDU1JfSVBHUjFfU0hJRlQpIHwgMjEpCisjZGVmaW5lIEVUQ1NSX0hECSgoMjE8PEVUQ1NSX0lQR1IyX1NISUZUKSB8ICgyMTw8RVRDU1JfSVBHUjFfU0hJRlQpIHwgMjEpCisKKy8qIFByaXZhdGUgcGVyIE5JQyBkYXRhIG9mIHRoZSBkcml2ZXIuICAqLworc3RydWN0IGlvYzNfcHJpdmF0ZSB7CisJc3RydWN0IGlvYzMgKnJlZ3M7CisJdW5zaWduZWQgbG9uZyAqcnhyOwkJLyogcG9pbnRlciB0byByZWNlaXZlciByaW5nICovCisJc3RydWN0IGlvYzNfZXR4ZCAqdHhyOworCXN0cnVjdCBza19idWZmICpyeF9za2JzWzUxMl07CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYnNbMTI4XTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlpbnQgcnhfY2k7CQkJLyogUlggY29uc3VtZXIgaW5kZXggKi8KKwlpbnQgcnhfcGk7CQkJLyogUlggcHJvZHVjZXIgaW5kZXggKi8KKwlpbnQgdHhfY2k7CQkJLyogVFggY29uc3VtZXIgaW5kZXggKi8KKwlpbnQgdHhfcGk7CQkJLyogVFggcHJvZHVjZXIgaW5kZXggKi8KKwlpbnQgdHhxbGVuOworCXUzMiBlbWNyLCBlaGFyX2gsIGVoYXJfbDsKKwlzcGlubG9ja190IGlvYzNfbG9jazsKKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJLyogTWVtYmVycyB1c2VkIGJ5IGF1dG9uZWdvdGlhdGlvbiAgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBpb2MzX3RpbWVyOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0X2RldmljZSAqcHJpdl9uZXRkZXYoc3RydWN0IGlvYzNfcHJpdmF0ZSAqZGV2KQoreworCXJldHVybiAodm9pZCAqKWRldiAtICgoc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlKSArIDMxKSAmIH4zMSk7Cit9CisKK3N0YXRpYyBpbnQgaW9jM19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyB2b2lkIGlvYzNfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpb2MzX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBpb2MzX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpb2MzX2hhc2goY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcik7CitzdGF0aWMgaW5saW5lIHZvaWQgaW9jM19zdG9wKHN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwKTsKK3N0YXRpYyB2b2lkIGlvYzNfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGNvbnN0IGNoYXIgaW9jM19zdHJbXSA9ICJJT0MzIEV0aGVybmV0IjsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgaW9jM19ldGh0b29sX29wczsKKworLyogV2UgdXNlIHRoaXMgdG8gYWNxdWlyZSByZWNlaXZlIHNrYidzIHRoYXQgd2UgY2FuIERNQSBkaXJlY3RseSBpbnRvLiAqLworCisjZGVmaW5lIElPQzNfQ0FDSEVMSU5FCTEyOFVMCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhbGlnbmVkX3J4X3NrYl9hZGRyKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlyZXR1cm4gKH5hZGRyICsgMSkgJiAoSU9DM19DQUNIRUxJTkUgLSAxVUwpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICogaW9jM19hbGxvY19za2IodW5zaWduZWQgbG9uZyBsZW5ndGgsCisJdW5zaWduZWQgaW50IGdmcF9tYXNrKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBhbGxvY19za2IobGVuZ3RoICsgSU9DM19DQUNIRUxJTkUgLSAxLCBnZnBfbWFzayk7CisJaWYgKGxpa2VseShza2IpKSB7CisJCWludCBvZmZzZXQgPSBhbGlnbmVkX3J4X3NrYl9hZGRyKCh1bnNpZ25lZCBsb25nKSBza2ItPmRhdGEpOworCQlpZiAob2Zmc2V0KQorCQkJc2tiX3Jlc2VydmUoc2tiLCBvZmZzZXQpOworCX0KKworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBpb2MzX21hcCh2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgdmRldikKK3sKKyNpZmRlZiBDT05GSUdfU0dJX0lQMjcKKwl2ZGV2IDw8PSA1ODsgICAvKiBTaGlmdCB0byBQQ0k2NF9BVFRSX1ZJUlRVQUwgKi8KKworCXJldHVybiB2ZGV2IHwgKDB4YVVMIDw8IFBDSTY0X0FUVFJfVEFSR19TSEZUKSB8IFBDSTY0X0FUVFJfUFJFRiB8CisJICAgICAgICgodW5zaWduZWQgbG9uZylwdHIgJiBUT19QSFlTX01BU0spOworI2Vsc2UKKwlyZXR1cm4gdmlydF90b19idXMocHRyKTsKKyNlbmRpZgorfQorCisvKiBCRVdBUkU6IFRoZSBJT0MzIGRvY3VtZW50YXRpb24gZG9jdW1lbnRzIHRoZSBzaXplIG9mIHJ4IGJ1ZmZlcnMgYXMKKyAgIDE2NDQgd2hpbGUgaXQncyBhY3R1YWxseSAxNjY0LiAgVGhpcyBvbmUgd2FzIG5hc3R5IHRvIHRyYWNrIGRvd24gLi4uICAqLworI2RlZmluZSBSWF9PRkZTRVQJCTEwCisjZGVmaW5lIFJYX0JVRl9BTExPQ19TSVpFCSgxNjY0ICsgUlhfT0ZGU0VUICsgSU9DM19DQUNIRUxJTkUpCisKKy8qIERNQSBiYXJyaWVyIHRvIHNlcGFyYXRlIGNhY2hlZCBhbmQgdW5jYWNoZWQgYWNjZXNzZXMuICAqLworI2RlZmluZSBCQVJSSUVSKCkJCQkJCQkJXAorCV9fYXNtX18oInN5bmMiIDo6OiAibWVtb3J5IikKKworCisjZGVmaW5lIElPQzNfU0laRSAweDEwMDAwMAorCisvKgorICogSU9DMyBpcyBhIGJpZyBlbmRpYW4gZGV2aWNlCisgKgorICogVW5vcnRob2RveCBidXQgbWFrZXMgdGhlIHVzZXJzIG9mIHRoZXNlIG1hY3JvcyBtb3JlIHJlYWRhYmxlIC0gdGhlIHBvaW50ZXIKKyAqIHRvIHRoZSBJT0MzJ3MgbWVtb3J5IG1hcHBlZCByZWdpc3RlcnMgaXMgZXhwZWN0ZWQgYXMgc3RydWN0IGlvYzMgKiBpb2MzCisgKiBpbiB0aGUgZW52aXJvbm1lbnQuCisgKi8KKyNkZWZpbmUgaW9jM19yX21jcigpCQliZTMyX3RvX2NwdShpb2MzLT5tY3IpCisjZGVmaW5lIGlvYzNfd19tY3IodikJCWRvIHsgaW9jMy0+bWNyID0gY3B1X3RvX2JlMzIodik7IH0gd2hpbGUgKDApCisjZGVmaW5lIGlvYzNfd19ncGNyX3ModikJZG8geyBpb2MzLT5ncGNyX3MgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VtY3IoKQkJYmUzMl90b19jcHUoaW9jMy0+ZW1jcikKKyNkZWZpbmUgaW9jM193X2VtY3IodikJCWRvIHsgaW9jMy0+ZW1jciA9IGNwdV90b19iZTMyKHYpOyB9IHdoaWxlICgwKQorI2RlZmluZSBpb2MzX3JfZWlzcigpCQliZTMyX3RvX2NwdShpb2MzLT5laXNyKQorI2RlZmluZSBpb2MzX3dfZWlzcih2KQkJZG8geyBpb2MzLT5laXNyID0gY3B1X3RvX2JlMzIodik7IH0gd2hpbGUgKDApCisjZGVmaW5lIGlvYzNfcl9laWVyKCkJCWJlMzJfdG9fY3B1KGlvYzMtPmVpZXIpCisjZGVmaW5lIGlvYzNfd19laWVyKHYpCQlkbyB7IGlvYzMtPmVpZXIgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VyY3NyKCkJCWJlMzJfdG9fY3B1KGlvYzMtPmVyY3NyKQorI2RlZmluZSBpb2MzX3dfZXJjc3IodikJCWRvIHsgaW9jMy0+ZXJjc3IgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VyYnJfaCgpCQliZTMyX3RvX2NwdShpb2MzLT5lcmJyX2gpCisjZGVmaW5lIGlvYzNfd19lcmJyX2godikJZG8geyBpb2MzLT5lcmJyX2ggPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VyYnJfbCgpCQliZTMyX3RvX2NwdShpb2MzLT5lcmJyX2wpCisjZGVmaW5lIGlvYzNfd19lcmJyX2wodikJZG8geyBpb2MzLT5lcmJyX2wgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VyYmFyKCkJCWJlMzJfdG9fY3B1KGlvYzMtPmVyYmFyKQorI2RlZmluZSBpb2MzX3dfZXJiYXIodikJCWRvIHsgaW9jMy0+ZXJiYXIgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VyY2lyKCkJCWJlMzJfdG9fY3B1KGlvYzMtPmVyY2lyKQorI2RlZmluZSBpb2MzX3dfZXJjaXIodikJCWRvIHsgaW9jMy0+ZXJjaXIgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VycGlyKCkJCWJlMzJfdG9fY3B1KGlvYzMtPmVycGlyKQorI2RlZmluZSBpb2MzX3dfZXJwaXIodikJCWRvIHsgaW9jMy0+ZXJwaXIgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VydHIoKQkJYmUzMl90b19jcHUoaW9jMy0+ZXJ0cikKKyNkZWZpbmUgaW9jM193X2VydHIodikJCWRvIHsgaW9jMy0+ZXJ0ciA9IGNwdV90b19iZTMyKHYpOyB9IHdoaWxlICgwKQorI2RlZmluZSBpb2MzX3JfZXRjc3IoKQkJYmUzMl90b19jcHUoaW9jMy0+ZXRjc3IpCisjZGVmaW5lIGlvYzNfd19ldGNzcih2KQkJZG8geyBpb2MzLT5ldGNzciA9IGNwdV90b19iZTMyKHYpOyB9IHdoaWxlICgwKQorI2RlZmluZSBpb2MzX3JfZXJzcigpCQliZTMyX3RvX2NwdShpb2MzLT5lcnNyKQorI2RlZmluZSBpb2MzX3dfZXJzcih2KQkJZG8geyBpb2MzLT5lcnNyID0gY3B1X3RvX2JlMzIodik7IH0gd2hpbGUgKDApCisjZGVmaW5lIGlvYzNfcl9ldGNkYygpCQliZTMyX3RvX2NwdShpb2MzLT5ldGNkYykKKyNkZWZpbmUgaW9jM193X2V0Y2RjKHYpCQlkbyB7IGlvYzMtPmV0Y2RjID0gY3B1X3RvX2JlMzIodik7IH0gd2hpbGUgKDApCisjZGVmaW5lIGlvYzNfcl9lYmlyKCkJCWJlMzJfdG9fY3B1KGlvYzMtPmViaXIpCisjZGVmaW5lIGlvYzNfd19lYmlyKHYpCQlkbyB7IGlvYzMtPmViaXIgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2V0YnJfaCgpCQliZTMyX3RvX2NwdShpb2MzLT5ldGJyX2gpCisjZGVmaW5lIGlvYzNfd19ldGJyX2godikJZG8geyBpb2MzLT5ldGJyX2ggPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2V0YnJfbCgpCQliZTMyX3RvX2NwdShpb2MzLT5ldGJyX2wpCisjZGVmaW5lIGlvYzNfd19ldGJyX2wodikJZG8geyBpb2MzLT5ldGJyX2wgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2V0Y2lyKCkJCWJlMzJfdG9fY3B1KGlvYzMtPmV0Y2lyKQorI2RlZmluZSBpb2MzX3dfZXRjaXIodikJCWRvIHsgaW9jMy0+ZXRjaXIgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2V0cGlyKCkJCWJlMzJfdG9fY3B1KGlvYzMtPmV0cGlyKQorI2RlZmluZSBpb2MzX3dfZXRwaXIodikJCWRvIHsgaW9jMy0+ZXRwaXIgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VtYXJfaCgpCQliZTMyX3RvX2NwdShpb2MzLT5lbWFyX2gpCisjZGVmaW5lIGlvYzNfd19lbWFyX2godikJZG8geyBpb2MzLT5lbWFyX2ggPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VtYXJfbCgpCQliZTMyX3RvX2NwdShpb2MzLT5lbWFyX2wpCisjZGVmaW5lIGlvYzNfd19lbWFyX2wodikJZG8geyBpb2MzLT5lbWFyX2wgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VoYXJfaCgpCQliZTMyX3RvX2NwdShpb2MzLT5laGFyX2gpCisjZGVmaW5lIGlvYzNfd19laGFyX2godikJZG8geyBpb2MzLT5laGFyX2ggPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX2VoYXJfbCgpCQliZTMyX3RvX2NwdShpb2MzLT5laGFyX2wpCisjZGVmaW5lIGlvYzNfd19laGFyX2wodikJZG8geyBpb2MzLT5laGFyX2wgPSBjcHVfdG9fYmUzMih2KTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9jM19yX21pY3IoKQkJYmUzMl90b19jcHUoaW9jMy0+bWljcikKKyNkZWZpbmUgaW9jM193X21pY3IodikJCWRvIHsgaW9jMy0+bWljciA9IGNwdV90b19iZTMyKHYpOyB9IHdoaWxlICgwKQorI2RlZmluZSBpb2MzX3JfbWlkcl9yKCkJCWJlMzJfdG9fY3B1KGlvYzMtPm1pZHJfcikKKyNkZWZpbmUgaW9jM193X21pZHJfcih2KQlkbyB7IGlvYzMtPm1pZHJfciA9IGNwdV90b19iZTMyKHYpOyB9IHdoaWxlICgwKQorI2RlZmluZSBpb2MzX3JfbWlkcl93KCkJCWJlMzJfdG9fY3B1KGlvYzMtPm1pZHJfdykKKyNkZWZpbmUgaW9jM193X21pZHJfdyh2KQlkbyB7IGlvYzMtPm1pZHJfdyA9IGNwdV90b19iZTMyKHYpOyB9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIHUzMiBtY3JfcGFjayh1MzIgcHVsc2UsIHUzMiBzYW1wbGUpCit7CisJcmV0dXJuIChwdWxzZSA8PCAxMCkgfCAoc2FtcGxlIDw8IDIpOworfQorCitzdGF0aWMgaW50IG5pY193YWl0KHN0cnVjdCBpb2MzICppb2MzKQoreworCXUzMiBtY3I7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgICAgIG1jciA9IGlvYzNfcl9tY3IoKTsKKyAgICAgICAgfSB3aGlsZSAoIShtY3IgJiAyKSk7CisKKyAgICAgICAgcmV0dXJuIG1jciAmIDE7Cit9CisKK3N0YXRpYyBpbnQgbmljX3Jlc2V0KHN0cnVjdCBpb2MzICppb2MzKQoreworICAgICAgICBpbnQgcHJlc2VuY2U7CisKKwlpb2MzX3dfbWNyKG1jcl9wYWNrKDUwMCwgNjUpKTsKKwlwcmVzZW5jZSA9IG5pY193YWl0KGlvYzMpOworCisJaW9jM193X21jcihtY3JfcGFjaygwLCA1MDApKTsKKwluaWNfd2FpdChpb2MzKTsKKworICAgICAgICByZXR1cm4gcHJlc2VuY2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5pY19yZWFkX2JpdChzdHJ1Y3QgaW9jMyAqaW9jMykKK3sKKwlpbnQgcmVzdWx0OworCisJaW9jM193X21jcihtY3JfcGFjayg2LCAxMykpOworCXJlc3VsdCA9IG5pY193YWl0KGlvYzMpOworCWlvYzNfd19tY3IobWNyX3BhY2soMCwgMTAwKSk7CisJbmljX3dhaXQoaW9jMyk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmljX3dyaXRlX2JpdChzdHJ1Y3QgaW9jMyAqaW9jMywgaW50IGJpdCkKK3sKKwlpZiAoYml0KQorCQlpb2MzX3dfbWNyKG1jcl9wYWNrKDYsIDExMCkpOworCWVsc2UKKwkJaW9jM193X21jcihtY3JfcGFjayg4MCwgMzApKTsKKworCW5pY193YWl0KGlvYzMpOworfQorCisvKgorICogUmVhZCBhIGJ5dGUgZnJvbSBhbiBpQnV0dG9uIGRldmljZQorICovCitzdGF0aWMgdTMyIG5pY19yZWFkX2J5dGUoc3RydWN0IGlvYzMgKmlvYzMpCit7CisJdTMyIHJlc3VsdCA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlyZXN1bHQgPSAocmVzdWx0ID4+IDEpIHwgKG5pY19yZWFkX2JpdChpb2MzKSA8PCA3KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBXcml0ZSBhIGJ5dGUgdG8gYW4gaUJ1dHRvbiBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgbmljX3dyaXRlX2J5dGUoc3RydWN0IGlvYzMgKmlvYzMsIGludCBieXRlKQoreworCWludCBpLCBiaXQ7CisKKwlmb3IgKGkgPSA4OyBpOyBpLS0pIHsKKwkJYml0ID0gYnl0ZSAmIDE7CisJCWJ5dGUgPj49IDE7CisKKwkJbmljX3dyaXRlX2JpdChpb2MzLCBiaXQpOworCX0KK30KKworc3RhdGljIHU2NCBuaWNfZmluZChzdHJ1Y3QgaW9jMyAqaW9jMywgaW50ICpsYXN0KQoreworCWludCBhLCBiLCBpbmRleCwgZGlzYzsKKwl1NjQgYWRkcmVzcyA9IDA7CisKKwluaWNfcmVzZXQoaW9jMyk7CisJLyogU2VhcmNoIFJPTS4gICovCisJbmljX3dyaXRlX2J5dGUoaW9jMywgMHhmMCk7CisKKwkvKiBBbGdvcml0aG0gZnJvbSBgYEJvb2sgb2YgaUJ1dHRvbiBTdGFuZGFyZHMnJy4gICovCisJZm9yIChpbmRleCA9IDAsIGRpc2MgPSAwOyBpbmRleCA8IDY0OyBpbmRleCsrKSB7CisJCWEgPSBuaWNfcmVhZF9iaXQoaW9jMyk7CisJCWIgPSBuaWNfcmVhZF9iaXQoaW9jMyk7CisKKwkJaWYgKGEgJiYgYikgeworCQkJcHJpbnRrKCJOSUMgc2VhcmNoIGZhaWxlZCAobm90IGZhdGFsKS5cbiIpOworCQkJKmxhc3QgPSAwOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIWEgJiYgIWIpIHsKKwkJCWlmIChpbmRleCA9PSAqbGFzdCkgeworCQkJCWFkZHJlc3MgfD0gMVVMIDw8IGluZGV4OworCQkJfSBlbHNlIGlmIChpbmRleCA+ICpsYXN0KSB7CisJCQkJYWRkcmVzcyAmPSB+KDFVTCA8PCBpbmRleCk7CisJCQkJZGlzYyA9IGluZGV4OworCQkJfSBlbHNlIGlmICgoYWRkcmVzcyAmICgxVUwgPDwgaW5kZXgpKSA9PSAwKQorCQkJCWRpc2MgPSBpbmRleDsKKwkJCW5pY193cml0ZV9iaXQoaW9jMywgYWRkcmVzcyAmICgxVUwgPDwgaW5kZXgpKTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJaWYgKGEpCisJCQkJYWRkcmVzcyB8PSAxVUwgPDwgaW5kZXg7CisJCQllbHNlCisJCQkJYWRkcmVzcyAmPSB+KDFVTCA8PCBpbmRleCk7CisJCQluaWNfd3JpdGVfYml0KGlvYzMsIGEpOworCQkJY29udGludWU7CisJCX0KKwl9CisKKwkqbGFzdCA9IGRpc2M7CisKKwlyZXR1cm4gYWRkcmVzczsKK30KKworc3RhdGljIGludCBuaWNfaW5pdChzdHJ1Y3QgaW9jMyAqaW9jMykKK3sKKwljb25zdCBjaGFyICp0eXBlOworCXU4IGNyYzsKKwl1OCBzZXJpYWxbNl07CisJaW50IHNhdmUgPSAwLCBpOworCisJdHlwZSA9ICJ1bmtub3duIjsKKworCXdoaWxlICgxKSB7CisJCXU2NCByZWc7CisJCXJlZyA9IG5pY19maW5kKGlvYzMsICZzYXZlKTsKKworCQlzd2l0Y2ggKHJlZyAmIDB4ZmYpIHsKKwkJY2FzZSAweDkxOgorCQkJdHlwZSA9ICJEUzE5ODFVIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKHNhdmUgPT0gMCkgeworCQkJCS8qIExldCB0aGUgY2FsbGVyIHRyeSBhZ2Fpbi4gICovCisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQluaWNfcmVzZXQoaW9jMyk7CisKKwkJLyogTWF0Y2ggUk9NLiAgKi8KKwkJbmljX3dyaXRlX2J5dGUoaW9jMywgMHg1NSk7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQluaWNfd3JpdGVfYnl0ZShpb2MzLCAocmVnID4+IChpIDw8IDMpKSAmIDB4ZmYpOworCisJCXJlZyA+Pj0gODsgLyogU2hpZnQgb3V0IHR5cGUuICAqLworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCQlzZXJpYWxbaV0gPSByZWcgJiAweGZmOworCQkJcmVnID4+PSA4OworCQl9CisJCWNyYyA9IHJlZyAmIDB4ZmY7CisJCWJyZWFrOworCX0KKworCXByaW50aygiRm91bmQgJXMgTklDIiwgdHlwZSk7CisJaWYgKHR5cGUgIT0gInVua25vd24iKSB7CisJCXByaW50ayAoIiByZWdpc3RyYXRpb24gbnVtYmVyICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LCIKKwkJCSIgQ1JDICUwMngiLCBzZXJpYWxbMF0sIHNlcmlhbFsxXSwgc2VyaWFsWzJdLAorCQkJc2VyaWFsWzNdLCBzZXJpYWxbNF0sIHNlcmlhbFs1XSwgY3JjKTsKKwl9CisJcHJpbnRrKCIuXG4iKTsKKworCXJldHVybiAwOworfQorCisvKgorICogUmVhZCB0aGUgTklDIChOdW1iZXItSW4tYS1DYW4pIGRldmljZSB1c2VkIHRvIHN0b3JlIHRoZSBNQUMgYWRkcmVzcyBvbgorICogU04wIC8gU04wMCBub2RlYm9hcmRzIGFuZCBQQ0kgY2FyZHMuCisgKi8KK3N0YXRpYyB2b2lkIGlvYzNfZ2V0X2VhZGRyX25pYyhzdHJ1Y3QgaW9jM19wcml2YXRlICppcCkKK3sKKwlzdHJ1Y3QgaW9jMyAqaW9jMyA9IGlwLT5yZWdzOworCXU4IG5pY1sxNF07CisJaW50IHRyaWVzID0gMjsgLyogVGhlcmUgbWF5IGJlIHNvbWUgcHJvYmxlbSB3aXRoIHRoZSBiYXR0ZXJ5PyAgKi8KKwlpbnQgaTsKKworCWlvYzNfd19ncGNyX3MoMSA8PCAyMSk7CisKKwl3aGlsZSAodHJpZXMtLSkgeworCQlpZiAoIW5pY19pbml0KGlvYzMpKQorCQkJYnJlYWs7CisJCXVkZWxheSg1MDApOworCX0KKworCWlmICh0cmllcyA8IDApIHsKKwkJcHJpbnRrKCJGYWlsZWQgdG8gcmVhZCBNQUMgYWRkcmVzc1xuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBSZWFkIE1lbW9yeS4gICovCisJbmljX3dyaXRlX2J5dGUoaW9jMywgMHhmMCk7CisJbmljX3dyaXRlX2J5dGUoaW9jMywgMHgwMCk7CisJbmljX3dyaXRlX2J5dGUoaW9jMywgMHgwMCk7CisKKwlmb3IgKGkgPSAxMzsgaSA+PSAwOyBpLS0pCisJCW5pY1tpXSA9IG5pY19yZWFkX2J5dGUoaW9jMyk7CisKKwlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQorCQlwcml2X25ldGRldihpcCktPmRldl9hZGRyW2kgLSAyXSA9IG5pY1tpXTsKK30KKworLyoKKyAqIE9rLCB0aGlzIGlzIGhvc2VkIGJ5IGRlc2lnbi4gIEl0J3MgbmVjZXNzYXJ5IHRvIGtub3cgd2hhdCBtYWNoaW5lIHRoZQorICogTklDIGlzIGluIGluIG9yZGVyIHRvIGtub3cgaG93IHRvIHJlYWQgdGhlIE5JQyBhZGRyZXNzLiAgV2UgYWxzbyBoYXZlCisgKiB0byBrbm93IGlmIGl0J3MgYSBQQ0kgY2FyZCBvciBhIE5JQyBpbiBvbiB0aGUgbm9kZSBib2FyZCAuLi4KKyAqLworc3RhdGljIHZvaWQgaW9jM19nZXRfZWFkZHIoc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXApCit7CisJaW50IGk7CisKKworCWlvYzNfZ2V0X2VhZGRyX25pYyhpcCk7CisKKwlwcmludGsoIkV0aGVybmV0IGFkZHJlc3MgaXMgIik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlwcmludGsoIiUwMngiLCBwcml2X25ldGRldihpcCktPmRldl9hZGRyW2ldKTsKKwkJaWYgKGkgPCA1KQorCQkJcHJpbnRrKCI6Iik7CisJfQorCXByaW50aygiLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIF9faW9jM19zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGlvYzMgKmlvYzMgPSBpcC0+cmVnczsKKworCWlvYzNfd19lbWFyX2goKGRldi0+ZGV2X2FkZHJbNV0gPDwgIDgpIHwgZGV2LT5kZXZfYWRkcls0XSk7CisJaW9jM193X2VtYXJfbCgoZGV2LT5kZXZfYWRkclszXSA8PCAyNCkgfCAoZGV2LT5kZXZfYWRkclsyXSA8PCAxNikgfAorCSAgICAgICAgICAgICAgKGRldi0+ZGV2X2FkZHJbMV0gPDwgIDgpIHwgZGV2LT5kZXZfYWRkclswXSk7Cit9CisKK3N0YXRpYyBpbnQgaW9jM19zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNvY2thZGRyICpzYSA9IGFkZHI7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgc2EtPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCisJc3Bpbl9sb2NrX2lycSgmaXAtPmlvYzNfbG9jayk7CisJX19pb2MzX3NldF9tYWNfYWRkcmVzcyhkZXYpOworCXNwaW5fdW5sb2NrX2lycSgmaXAtPmlvYzNfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGxlciBtdXN0IGhvbGQgdGhlIGlvYzNfbG9jayBldmVyIGZvciBNSUkgcmVhZGVycy4gIFRoaXMgaXMgYWxzbworICogdXNlZCB0byBwcm90ZWN0IHRoZSB0cmFuc21pdHRlciBzaWRlIGJ1dCBpdCdzIGxvdyBjb250ZW50aW9uLgorICovCitzdGF0aWMgaW50IGlvYzNfbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHksIGludCByZWcpCit7CisJc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpb2MzICppb2MzID0gaXAtPnJlZ3M7CisKKwl3aGlsZSAoaW9jM19yX21pY3IoKSAmIE1JQ1JfQlVTWSk7CisJaW9jM193X21pY3IoKHBoeSA8PCBNSUNSX1BIWUFERFJfU0hJRlQpIHwgcmVnIHwgTUlDUl9SRUFEVFJJRyk7CisJd2hpbGUgKGlvYzNfcl9taWNyKCkgJiBNSUNSX0JVU1kpOworCisJcmV0dXJuIGlvYzNfcl9taWNyKCkgJiBNSURSX0RBVEFfTUFTSzsKK30KKworc3RhdGljIHZvaWQgaW9jM19tZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHksIGludCByZWcsIGludCBkYXRhKQoreworCXN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaW9jMyAqaW9jMyA9IGlwLT5yZWdzOworCisJd2hpbGUgKGlvYzNfcl9taWNyKCkgJiBNSUNSX0JVU1kpOworCWlvYzNfd19taWRyX3coZGF0YSk7CisJaW9jM193X21pY3IoKHBoeSA8PCBNSUNSX1BIWUFERFJfU0hJRlQpIHwgcmVnKTsKKwl3aGlsZSAoaW9jM19yX21pY3IoKSAmIE1JQ1JfQlVTWSk7Cit9CisKK3N0YXRpYyBpbnQgaW9jM19taWlfaW5pdChzdHJ1Y3QgaW9jM19wcml2YXRlICppcCk7CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaW9jM19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGlvYzMgKmlvYzMgPSBpcC0+cmVnczsKKworCWlwLT5zdGF0cy5jb2xsaXNpb25zICs9IChpb2MzX3JfZXRjZGMoKSAmIEVUQ0RDX0NPTExDTlRfTUFTSyk7CisJcmV0dXJuICZpcC0+c3RhdHM7Cit9CisKKyNpZmRlZiBDT05GSUdfU0dJX0lPQzNfRVRIX0hXX1JYX0NTVU0KKworc3RhdGljIHZvaWQgaW9jM190Y3B1ZHBfY2hlY2tzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdWludDMyX3QgaHdzdW0sIGludCBsZW4pCit7CisJc3RydWN0IGV0aGhkciAqZWggPSBldGhfaGRyKHNrYik7CisJdWludDMyX3QgY3N1bSwgZWhzdW07CisJdW5zaWduZWQgaW50IHByb3RvOworCXN0cnVjdCBpcGhkciAqaWg7CisJdWludDE2X3QgKmV3OworCXVuc2lnbmVkIGNoYXIgKmNwOworCisJLyoKKwkgKiBEaWQgaGFyZHdhcmUgaGFuZGxlIHRoZSBjaGVja3N1bSBhdCBhbGw/ICBUaGUgY2FzZXMgd2UgY2FuIGhhbmRsZQorCSAqIGFyZToKKwkgKgorCSAqIC0gVENQIGFuZCBVRFAgY2hlY2tzdW1zIG9mIElQdjQgb25seS4KKwkgKiAtIElQdjYgd291bGQgYmUgZG9hYmxlIGJ1dCB3ZSBrZWVwIHRoYXQgZm9yIGxhdGVyIC4uLgorCSAqIC0gT25seSB1bmZyYWdtZW50ZWQgcGFja2V0cy4gIERpZCBzb21lYm9keSBhbHJlYWR5IHRlbGwgeW91CisJICogICBmcmFnbWVudGF0aW9uIGlzIGV2aWw/CisJICogLSBkb24ndCBjYXJlIGFib3V0IHBhY2tldCBzaXplLiAgV29yc3QgY2FzZSB3aGVuIHByb2Nlc3NpbmcgYQorCSAqICAgbWFsZm9ybWVkIHBhY2tldCB3ZSdsbCB0cnkgdG8gYWNjZXNzIHRoZSBwYWNrZXQgYXQgaXAgaGVhZGVyICsKKwkgKiAgIDY0IGJ5dGVzIHdoaWNoIGlzIHN0aWxsIGluc2lkZSB0aGUgc2tiLiAgRXZlbiBpbiB0aGUgdW5saWtlbHkKKwkgKiAgIGNhc2Ugd2hlcmUgdGhlIGNoZWNrc3VtIGlzIHJpZ2h0IHRoZSBoaWdoZXIgbGF5ZXJzIHdpbGwgc3RpbGwKKwkgKiAgIGRyb3AgdGhlIHBhY2tldCBhcyBhcHByb3ByaWF0ZS4KKwkgKi8KKwlpZiAoZWgtPmhfcHJvdG8gIT0gbnRvaHMoRVRIX1BfSVApKQorCQlyZXR1cm47CisKKwlpaCA9IChzdHJ1Y3QgaXBoZHIgKikgKChjaGFyICopZWggKyBFVEhfSExFTik7CisJaWYgKGloLT5mcmFnX29mZiAmIGh0b25zKElQX01GIHwgSVBfT0ZGU0VUKSkKKwkJcmV0dXJuOworCisJcHJvdG8gPSBpaC0+cHJvdG9jb2w7CisJaWYgKHByb3RvICE9IElQUFJPVE9fVENQICYmIHByb3RvICE9IElQUFJPVE9fVURQKQorCQlyZXR1cm47CisKKwkvKiBTYW1lIGFzIHR4IC0gY29tcHV0ZSBjc3VtIG9mIHBzZXVkbyBoZWFkZXIgICovCisJY3N1bSA9IGh3c3VtICsKKwkgICAgICAgKGloLT50b3RfbGVuIC0gKGloLT5paGwgPDwgMikpICsKKwkgICAgICAgaHRvbnMoKHVpbnQxNl90KWloLT5wcm90b2NvbCkgKworCSAgICAgICAoaWgtPnNhZGRyID4+IDE2KSArIChpaC0+c2FkZHIgJiAweGZmZmYpICsKKwkgICAgICAgKGloLT5kYWRkciA+PiAxNikgKyAoaWgtPmRhZGRyICYgMHhmZmZmKTsKKworCS8qIFN1bSB1cCBldGhlcm5ldCBkZXN0IGFkZHIsIHNyYyBhZGRyIGFuZCBwcm90b2NvbCAgKi8KKwlldyA9ICh1aW50MTZfdCAqKSBlaDsKKwllaHN1bSA9IGV3WzBdICsgZXdbMV0gKyBld1syXSArIGV3WzNdICsgZXdbNF0gKyBld1s1XSArIGV3WzZdOworCisJZWhzdW0gPSAoZWhzdW0gJiAweGZmZmYpICsgKGVoc3VtID4+IDE2KTsKKwllaHN1bSA9IChlaHN1bSAmIDB4ZmZmZikgKyAoZWhzdW0gPj4gMTYpOworCisJY3N1bSArPSAweGZmZmYgXiBlaHN1bTsKKworCS8qIEluIHRoZSBuZXh0IHN0ZXAgd2UgYWxzbyBzdWJ0cmFjdCB0aGUgMSdzIGNvbXBsZW1lbnQKKwkgICBjaGVja3N1bSBvZiB0aGUgdHJhaWxpbmcgZXRoZXJuZXQgQ1JDLiAgKi8KKwljcCA9IChjaGFyICopZWggKyBsZW47CS8qIHBvaW50cyBhdCB0cmFpbGluZyBDUkMgKi8KKwlpZiAobGVuICYgMSkgeworCQljc3VtICs9IDB4ZmZmZiBeICh1aW50MTZfdCkgKChjcFsxXSA8PCA4KSB8IGNwWzBdKTsKKwkJY3N1bSArPSAweGZmZmYgXiAodWludDE2X3QpICgoY3BbM10gPDwgOCkgfCBjcFsyXSk7CisJfSBlbHNlIHsKKwkJY3N1bSArPSAweGZmZmYgXiAodWludDE2X3QpICgoY3BbMF0gPDwgOCkgfCBjcFsxXSk7CisJCWNzdW0gKz0gMHhmZmZmIF4gKHVpbnQxNl90KSAoKGNwWzJdIDw8IDgpIHwgY3BbM10pOworCX0KKworCWNzdW0gPSAoY3N1bSAmIDB4ZmZmZikgKyAoY3N1bSA+PiAxNik7CisJY3N1bSA9IChjc3VtICYgMHhmZmZmKSArIChjc3VtID4+IDE2KTsKKworCWlmIChjc3VtID09IDB4ZmZmZikKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKK30KKyNlbmRpZiAvKiBDT05GSUdfU0dJX0lPQzNfRVRIX0hXX1JYX0NTVU0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIGlvYzNfcngoc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXApCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm5ld19za2I7CisJc3RydWN0IGlvYzMgKmlvYzMgPSBpcC0+cmVnczsKKwlpbnQgcnhfZW50cnksIG5fZW50cnksIGxlbjsKKwlzdHJ1Y3QgaW9jM19lcnhidWYgKnJ4YjsKKwl1bnNpZ25lZCBsb25nICpyeHI7CisJdTMyIHcwLCBlcnI7CisKKwlyeHIgPSAodW5zaWduZWQgbG9uZyAqKSBpcC0+cnhyOwkJLyogUmluZyBiYXNlICovCisJcnhfZW50cnkgPSBpcC0+cnhfY2k7CQkJCS8qIFJYIGNvbnN1bWUgaW5kZXggKi8KKwluX2VudHJ5ID0gaXAtPnJ4X3BpOworCisJc2tiID0gaXAtPnJ4X3NrYnNbcnhfZW50cnldOworCXJ4YiA9IChzdHJ1Y3QgaW9jM19lcnhidWYgKikgKHNrYi0+ZGF0YSAtIFJYX09GRlNFVCk7CisJdzAgPSBiZTMyX3RvX2NwdShyeGItPncwKTsKKworCXdoaWxlICh3MCAmIEVSWEJVRl9WKSB7CisJCWVyciA9IGJlMzJfdG9fY3B1KHJ4Yi0+ZXJyKTsJCS8qIEl0J3MgdmFsaWQgLi4uICAqLworCQlpZiAoZXJyICYgRVJYQlVGX0dPT0RQS1QpIHsKKwkJCWxlbiA9ICgodzAgPj4gRVJYQlVGX0JZVEVDTlRfU0hJRlQpICYgMHg3ZmYpIC0gNDsKKwkJCXNrYl90cmltKHNrYiwgbGVuKTsKKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHByaXZfbmV0ZGV2KGlwKSk7CisKKwkJCW5ld19za2IgPSBpb2MzX2FsbG9jX3NrYihSWF9CVUZfQUxMT0NfU0laRSwgR0ZQX0FUT01JQyk7CisJCQlpZiAoIW5ld19za2IpIHsKKwkJCQkvKiBPdWNoLCBkcm9wIHBhY2tldCBhbmQganVzdCByZWN5Y2xlIHBhY2tldAorCQkJCSAgIHRvIGtlZXAgdGhlIHJpbmcgZmlsbGVkLiAgKi8KKwkJCQlpcC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCW5ld19za2IgPSBza2I7CisJCQkJZ290byBuZXh0OworCQkJfQorCisjaWZkZWYgQ09ORklHX1NHSV9JT0MzX0VUSF9IV19SWF9DU1VNCisJCQlpb2MzX3RjcHVkcF9jaGVja3N1bShza2IsIHcwICYgRVJYQlVGX0lQQ0tTVU1fTUFTSyxsZW4pOworI2VuZGlmCisKKwkJCW5ldGlmX3J4KHNrYik7CisKKwkJCWlwLT5yeF9za2JzW3J4X2VudHJ5XSA9IE5VTEw7CS8qIFBvaXNvbiAgKi8KKworCQkJbmV3X3NrYi0+ZGV2ID0gcHJpdl9uZXRkZXYoaXApOworCisJCQkvKiBCZWNhdXNlIHdlIHJlc2VydmUgYWZ0ZXJ3YXJkcy4gKi8KKwkJCXNrYl9wdXQobmV3X3NrYiwgKDE2NjQgKyBSWF9PRkZTRVQpKTsKKwkJCXJ4YiA9IChzdHJ1Y3QgaW9jM19lcnhidWYgKikgbmV3X3NrYi0+ZGF0YTsKKwkJCXNrYl9yZXNlcnZlKG5ld19za2IsIFJYX09GRlNFVCk7CisKKwkJCXByaXZfbmV0ZGV2KGlwKS0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQlpcC0+c3RhdHMucnhfcGFja2V0cysrOwkJLyogU3RhdGlzdGljcyAqLworCQkJaXAtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJfSBlbHNlIHsKKyAJCQkvKiBUaGUgZnJhbWUgaXMgaW52YWxpZCBhbmQgdGhlIHNrYiBuZXZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhY2hlZCB0aGUgbmV0d29yayBsYXllciBzbyB3ZSBjYW4ganVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjeWNsZSBpdC4gICovCisgCQkJbmV3X3NrYiA9IHNrYjsKKyAJCQlpcC0+c3RhdHMucnhfZXJyb3JzKys7CisJCX0KKwkJaWYgKGVyciAmIEVSWEJVRl9DUkNFUlIpCS8qIFN0YXRpc3RpY3MgKi8KKwkJCWlwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCWlmIChlcnIgJiBFUlhCVUZfRlJBTUVSUikKKwkJCWlwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKK25leHQ6CisJCWlwLT5yeF9za2JzW25fZW50cnldID0gbmV3X3NrYjsKKwkJcnhyW25fZW50cnldID0gY3B1X3RvX2JlNjQoaW9jM19tYXAocnhiLCAxKSk7CisJCXJ4Yi0+dzAgPSAwOwkJCQkvKiBDbGVhciB2YWxpZCBmbGFnICovCisJCW5fZW50cnkgPSAobl9lbnRyeSArIDEpICYgNTExOwkJLyogVXBkYXRlIGVycGlyICovCisKKwkJLyogTm93IGdvIG9uIHRvIHRoZSBuZXh0IHJpbmcgZW50cnkuICAqLworCQlyeF9lbnRyeSA9IChyeF9lbnRyeSArIDEpICYgNTExOworCQlza2IgPSBpcC0+cnhfc2tic1tyeF9lbnRyeV07CisJCXJ4YiA9IChzdHJ1Y3QgaW9jM19lcnhidWYgKikgKHNrYi0+ZGF0YSAtIFJYX09GRlNFVCk7CisJCXcwID0gYmUzMl90b19jcHUocnhiLT53MCk7CisJfQorCWlvYzNfd19lcnBpcigobl9lbnRyeSA8PCAzKSB8IEVSUElSX0FSTSk7CisJaXAtPnJ4X3BpID0gbl9lbnRyeTsKKwlpcC0+cnhfY2kgPSByeF9lbnRyeTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlvYzNfdHgoc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXApCit7CisJdW5zaWduZWQgbG9uZyBwYWNrZXRzLCBieXRlczsKKwlzdHJ1Y3QgaW9jMyAqaW9jMyA9IGlwLT5yZWdzOworCWludCB0eF9lbnRyeSwgb19lbnRyeTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUzMiBldGNpcjsKKworCXNwaW5fbG9jaygmaXAtPmlvYzNfbG9jayk7CisJZXRjaXIgPSBpb2MzX3JfZXRjaXIoKTsKKworCXR4X2VudHJ5ID0gKGV0Y2lyID4+IDcpICYgMTI3OworCW9fZW50cnkgPSBpcC0+dHhfY2k7CisJcGFja2V0cyA9IDA7CisJYnl0ZXMgPSAwOworCisJd2hpbGUgKG9fZW50cnkgIT0gdHhfZW50cnkpIHsKKwkJcGFja2V0cysrOworCQlza2IgPSBpcC0+dHhfc2tic1tvX2VudHJ5XTsKKwkJYnl0ZXMgKz0gc2tiLT5sZW47CisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCWlwLT50eF9za2JzW29fZW50cnldID0gTlVMTDsKKworCQlvX2VudHJ5ID0gKG9fZW50cnkgKyAxKSAmIDEyNzsJCS8qIE5leHQgKi8KKworCQlldGNpciA9IGlvYzNfcl9ldGNpcigpOwkJCS8qIE1vcmUgcGt0cyBzZW50PyAgKi8KKwkJdHhfZW50cnkgPSAoZXRjaXIgPj4gNykgJiAxMjc7CisJfQorCisJaXAtPnN0YXRzLnR4X3BhY2tldHMgKz0gcGFja2V0czsKKwlpcC0+c3RhdHMudHhfYnl0ZXMgKz0gYnl0ZXM7CisJaXAtPnR4cWxlbiAtPSBwYWNrZXRzOworCisJaWYgKGlwLT50eHFsZW4gPCAxMjgpCisJCW5ldGlmX3dha2VfcXVldWUocHJpdl9uZXRkZXYoaXApKTsKKworCWlwLT50eF9jaSA9IG9fZW50cnk7CisJc3Bpbl91bmxvY2soJmlwLT5pb2MzX2xvY2spOworfQorCisvKgorICogRGVhbCB3aXRoIGZhdGFsIElPQzMgZXJyb3JzLiAgVGhpcyBjb25kaXRpb24gbWlnaHQgYmUgY2F1c2VkIGJ5IGEgaGFyZCBvcgorICogc29mdHdhcmUgcHJvYmxlbXMsIHNvIHdlIHNob3VsZCB0cnkgdG8gcmVjb3ZlcgorICogbW9yZSBncmFjZWZ1bGx5IGlmIHRoaXMgZXZlciBoYXBwZW5zLiAgSW4gdGhlb3J5IHdlIG1pZ2h0IGJlIGZsb29kZWQKKyAqIHdpdGggc3VjaCBlcnJvciBpbnRlcnJ1cHRzIGlmIHNvbWV0aGluZyByZWFsbHkgZ29lcyB3cm9uZywgc28gd2UgbWlnaHQKKyAqIGFsc28gY29uc2lkZXIgdG8gdGFrZSB0aGUgaW50ZXJmYWNlIGRvd24uCisgKi8KK3N0YXRpYyB2b2lkIGlvYzNfZXJyb3Ioc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXAsIHUzMiBlaXNyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2X25ldGRldihpcCk7CisJdW5zaWduZWQgY2hhciAqaWZhY2UgPSBkZXYtPm5hbWU7CisKKwlzcGluX2xvY2soJmlwLT5pb2MzX2xvY2spOworCisJaWYgKGVpc3IgJiBFSVNSX1JYT0ZMTykKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUlggb3ZlcmZsb3cuXG4iLCBpZmFjZSk7CisJaWYgKGVpc3IgJiBFSVNSX1JYQlVGT0ZMTykKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUlggYnVmZmVyIG92ZXJmbG93LlxuIiwgaWZhY2UpOworCWlmIChlaXNyICYgRUlTUl9SWE1FTUVSUikKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUlggUENJIGVycm9yLlxuIiwgaWZhY2UpOworCWlmIChlaXNyICYgRUlTUl9SWFBBUkVSUikKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUlggU1NSQU0gcGFyaXR5IGVycm9yLlxuIiwgaWZhY2UpOworCWlmIChlaXNyICYgRUlTUl9UWEJVRlVGTE8pCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRYIGJ1ZmZlciB1bmRlcmZsb3cuXG4iLCBpZmFjZSk7CisJaWYgKGVpc3IgJiBFSVNSX1RYTUVNRVJSKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUWCBQQ0kgZXJyb3IuXG4iLCBpZmFjZSk7CisKKwlpb2MzX3N0b3AoaXApOworCWlvYzNfaW5pdChkZXYpOworCWlvYzNfbWlpX2luaXQoaXApOworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJc3Bpbl91bmxvY2soJmlwLT5pb2MzX2xvY2spOworfQorCisvKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgZG9lcyBhbGwgb2YgdGhlIFJ4IHRocmVhZCB3b3JrIGFuZCBjbGVhbnMgdXAKKyAgIGFmdGVyIHRoZSBUeCB0aHJlYWQuICAqLworc3RhdGljIGlycXJldHVybl90IGlvYzNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKl9kZXYsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilfZGV2OworCXN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaW9jMyAqaW9jMyA9IGlwLT5yZWdzOworCWNvbnN0IHUzMiBlbmFibGVkID0gRUlTUl9SWFRJTUVSSU5UIHwgRUlTUl9SWE9GTE8gfCBFSVNSX1JYQlVGT0ZMTyB8CisJICAgICAgICAgICAgICAgICAgICBFSVNSX1JYTUVNRVJSIHwgRUlTUl9SWFBBUkVSUiB8IEVJU1JfVFhCVUZVRkxPIHwKKwkgICAgICAgICAgICAgICAgICAgIEVJU1JfVFhFWFBMSUNJVCB8IEVJU1JfVFhNRU1FUlI7CisJdTMyIGVpc3I7CisKKwllaXNyID0gaW9jM19yX2Vpc3IoKSAmIGVuYWJsZWQ7CisKKwlpb2MzX3dfZWlzcihlaXNyKTsKKwkodm9pZCkgaW9jM19yX2Vpc3IoKTsJCQkJLyogRmx1c2ggKi8KKworCWlmIChlaXNyICYgKEVJU1JfUlhPRkxPIHwgRUlTUl9SWEJVRk9GTE8gfCBFSVNSX1JYTUVNRVJSIHwKKwkgICAgICAgICAgICBFSVNSX1JYUEFSRVJSIHwgRUlTUl9UWEJVRlVGTE8gfCBFSVNSX1RYTUVNRVJSKSkKKwkJaW9jM19lcnJvcihpcCwgZWlzcik7CisJaWYgKGVpc3IgJiBFSVNSX1JYVElNRVJJTlQpCisJCWlvYzNfcngoaXApOworCWlmIChlaXNyICYgRUlTUl9UWEVYUExJQ0lUKQorCQlpb2MzX3R4KGlwKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlvYzNfc2V0dXBfZHVwbGV4KHN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwKQoreworCXN0cnVjdCBpb2MzICppb2MzID0gaXAtPnJlZ3M7CisKKwlpZiAoaXAtPm1paS5mdWxsX2R1cGxleCkgeworCQlpb2MzX3dfZXRjc3IoRVRDU1JfRkQpOworCQlpcC0+ZW1jciB8PSBFTUNSX0RVUExFWDsKKwl9IGVsc2UgeworCQlpb2MzX3dfZXRjc3IoRVRDU1JfSEQpOworCQlpcC0+ZW1jciAmPSB+RU1DUl9EVVBMRVg7CisJfQorCWlvYzNfd19lbWNyKGlwLT5lbWNyKTsKK30KKworc3RhdGljIHZvaWQgaW9jM190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXAgPSAoc3RydWN0IGlvYzNfcHJpdmF0ZSAqKSBkYXRhOworCisJLyogUHJpbnQgdGhlIGxpbmsgc3RhdHVzIGlmIGl0IGhhcyBjaGFuZ2VkICovCisJbWlpX2NoZWNrX21lZGlhKCZpcC0+bWlpLCAxLCAwKTsKKwlpb2MzX3NldHVwX2R1cGxleChpcCk7CisKKwlpcC0+aW9jM190aW1lci5leHBpcmVzID0gamlmZmllcyArICgoMTIgKiBIWikvMTApOyAvKiAxLjJzICovCisJYWRkX3RpbWVyKCZpcC0+aW9jM190aW1lcik7Cit9CisKKy8qCisgKiBUcnkgdG8gZmluZCBhIFBIWS4gIFRoZXJlIGlzIG5vIGFwcGFyZW50IHJlbGF0aW9uIGJldHdlZW4gdGhlIE1JSSBhZGRyZXNzZXMKKyAqIGluIHRoZSBTR0kgZG9jdW1lbnRhdGlvbiBhbmQgd2hhdCB3ZSBmaW5kIGluIHJlYWxpdHksIHNvIHdlIHNpbXBseSBwcm9iZQorICogZm9yIHRoZSBQSFkuICBJdCBzZWVtcyBJT0MzIFBIWXMgdXN1YWxseSBsaXZlIG9uIGFkZHJlc3MgMzEuICBPbmUgb2YgbXkKKyAqIG9uYm9hcmQgSU9DM3MgaGFzIHRoZSBzcGVjaWFsIG9kZGl0eSB0aGF0IHByb2JpbmcgZG9lc24ndCBzZWVtIHRvIGZpbmQgaXQKKyAqIHlldCB0aGUgaW50ZXJmYWNlIHNlZW1zIHRvIHdvcmsgZmluZSwgc28gaWYgcHJvYmluZyBmYWlscyB3ZSBmb3Igbm93IHdpbGwKKyAqIHNpbXBseSBkZWZhdWx0IHRvIFBIWSAzMSBpbnN0ZWFkIG9mIGJhaWxpbmcgb3V0LgorICovCitzdGF0aWMgaW50IGlvYzNfbWlpX2luaXQoc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXZfbmV0ZGV2KGlwKTsKKwlpbnQgaSwgZm91bmQgPSAwLCByZXMgPSAwOworCWludCBpb2MzX3BoeV93b3JrYXJvdW5kID0gMTsKKwl1MTYgd29yZDsKKworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCXdvcmQgPSBpb2MzX21kaW9fcmVhZChkZXYsIGksIE1JSV9QSFlTSUQxKTsKKworCQlpZiAod29yZCAhPSAweGZmZmYgJiYgd29yZCAhPSAweDAwMDApIHsKKwkJCWZvdW5kID0gMTsKKwkJCWJyZWFrOwkJCS8qIEZvdW5kIGEgUEhZCQkqLworCQl9CisJfQorCisJaWYgKCFmb3VuZCkgeworCQlpZiAoaW9jM19waHlfd29ya2Fyb3VuZCkKKwkJCWkgPSAzMTsKKwkJZWxzZSB7CisJCQlpcC0+bWlpLnBoeV9pZCA9IC0xOworCQkJcmVzID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaXAtPm1paS5waHlfaWQgPSBpOworCWlwLT5pb2MzX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKDEyICogSFopLzEwOyAgLyogMS4yIHNlYy4gKi8KKwlpcC0+aW9jM190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGlwOworCWlwLT5pb2MzX3RpbWVyLmZ1bmN0aW9uID0gJmlvYzNfdGltZXI7CisJYWRkX3RpbWVyKCZpcC0+aW9jM190aW1lcik7CisKK291dDoKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW9jM19jbGVhbl9yeF9yaW5nKHN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGk7CisKKwlmb3IgKGkgPSBpcC0+cnhfY2k7IGkgJiAxNTsgaSsrKSB7CisJCWlwLT5yeF9za2JzW2lwLT5yeF9waV0gPSBpcC0+cnhfc2tic1tpcC0+cnhfY2ldOworCQlpcC0+cnhyW2lwLT5yeF9waSsrXSA9IGlwLT5yeHJbaXAtPnJ4X2NpKytdOworCX0KKwlpcC0+cnhfcGkgJj0gNTExOworCWlwLT5yeF9jaSAmPSA1MTE7CisKKwlmb3IgKGkgPSBpcC0+cnhfY2k7IGkgIT0gaXAtPnJ4X3BpOyBpID0gKGkrMSkgJiA1MTEpIHsKKwkJc3RydWN0IGlvYzNfZXJ4YnVmICpyeGI7CisJCXNrYiA9IGlwLT5yeF9za2JzW2ldOworCQlyeGIgPSAoc3RydWN0IGlvYzNfZXJ4YnVmICopIChza2ItPmRhdGEgLSBSWF9PRkZTRVQpOworCQlyeGItPncwID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb2MzX2NsZWFuX3R4X3Jpbmcoc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXApCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpIDwgMTI4OyBpKyspIHsKKwkJc2tiID0gaXAtPnR4X3NrYnNbaV07CisJCWlmIChza2IpIHsKKwkJCWlwLT50eF9za2JzW2ldID0gTlVMTDsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCX0KKwkJaXAtPnR4cltpXS5jbWQgPSAwOworCX0KKwlpcC0+dHhfcGkgPSAwOworCWlwLT50eF9jaSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGlvYzNfZnJlZV9yaW5ncyhzdHJ1Y3QgaW9jM19wcml2YXRlICppcCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCByeF9lbnRyeSwgbl9lbnRyeTsKKworCWlmIChpcC0+dHhyKSB7CisJCWlvYzNfY2xlYW5fdHhfcmluZyhpcCk7CisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaXAtPnR4ciwgMik7CisJCWlwLT50eHIgPSBOVUxMOworCX0KKworCWlmIChpcC0+cnhyKSB7CisJCW5fZW50cnkgPSBpcC0+cnhfY2k7CisJCXJ4X2VudHJ5ID0gaXAtPnJ4X3BpOworCisJCXdoaWxlIChuX2VudHJ5ICE9IHJ4X2VudHJ5KSB7CisJCQlza2IgPSBpcC0+cnhfc2tic1tuX2VudHJ5XTsKKwkJCWlmIChza2IpCisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKworCQkJbl9lbnRyeSA9IChuX2VudHJ5ICsgMSkgJiA1MTE7CisJCX0KKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWlwLT5yeHIpOworCQlpcC0+cnhyID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlvYzNfYWxsb2NfcmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGlvYzNfZXJ4YnVmICpyeGI7CisJdW5zaWduZWQgbG9uZyAqcnhyOworCWludCBpOworCisJaWYgKGlwLT5yeHIgPT0gTlVMTCkgeworCQkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSByeCByaW5nLiAgNGtiID0gNTEyIGVudHJpZXMgICovCisJCWlwLT5yeHIgPSAodW5zaWduZWQgbG9uZyAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0FUT01JQyk7CisJCXJ4ciA9ICh1bnNpZ25lZCBsb25nICopIGlwLT5yeHI7CisJCWlmICghcnhyKQorCQkJcHJpbnRrKCJpb2MzX2FsbG9jX3JpbmdzKCk6IGdldF96ZXJvZWRfcGFnZSgpIGZhaWxlZCFcbiIpOworCisJCS8qIE5vdyB0aGUgcnggYnVmZmVycy4gIFRoZSBSWCByaW5nIG1heSBiZSBsYXJnZXIgYnV0CisJCSAgIHdlIG9ubHkgYWxsb2NhdGUgMTYgYnVmZmVycyBmb3Igbm93LiAgTmVlZCB0byB0dW5lCisJCSAgIHRoaXMgZm9yIHBlcmZvcm1hbmNlIGFuZCBtZW1vcnkgbGF0ZXIuICAqLworCQlmb3IgKGkgPSAwOyBpIDwgUlhfQlVGRlM7IGkrKykgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJc2tiID0gaW9jM19hbGxvY19za2IoUlhfQlVGX0FMTE9DX1NJWkUsIEdGUF9BVE9NSUMpOworCQkJaWYgKCFza2IpIHsKKwkJCQlzaG93X2ZyZWVfYXJlYXMoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaXAtPnJ4X3NrYnNbaV0gPSBza2I7CisJCQlza2ItPmRldiA9IGRldjsKKworCQkJLyogQmVjYXVzZSB3ZSByZXNlcnZlIGFmdGVyd2FyZHMuICovCisJCQlza2JfcHV0KHNrYiwgKDE2NjQgKyBSWF9PRkZTRVQpKTsKKwkJCXJ4YiA9IChzdHJ1Y3QgaW9jM19lcnhidWYgKikgc2tiLT5kYXRhOworCQkJcnhyW2ldID0gY3B1X3RvX2JlNjQoaW9jM19tYXAocnhiLCAxKSk7CisJCQlza2JfcmVzZXJ2ZShza2IsIFJYX09GRlNFVCk7CisJCX0KKwkJaXAtPnJ4X2NpID0gMDsKKwkJaXAtPnJ4X3BpID0gUlhfQlVGRlM7CisJfQorCisJaWYgKGlwLT50eHIgPT0gTlVMTCkgeworCQkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0eCByaW5ncy4gIDE2a2IgPSAxMjggYnVmcy4gICovCisJCWlwLT50eHIgPSAoc3RydWN0IGlvYzNfZXR4ZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgMik7CisJCWlmICghaXAtPnR4cikKKwkJCXByaW50aygiaW9jM19hbGxvY19yaW5ncygpOiBfX2dldF9mcmVlX3BhZ2VzKCkgZmFpbGVkIVxuIik7CisJCWlwLT50eF9waSA9IDA7CisJCWlwLT50eF9jaSA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBpb2MzX2luaXRfcmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGlvYzMgKmlvYzMgPSBpcC0+cmVnczsKKwl1bnNpZ25lZCBsb25nIHJpbmc7CisKKwlpb2MzX2ZyZWVfcmluZ3MoaXApOworCWlvYzNfYWxsb2NfcmluZ3MoZGV2KTsKKworCWlvYzNfY2xlYW5fcnhfcmluZyhpcCk7CisJaW9jM19jbGVhbl90eF9yaW5nKGlwKTsKKworCS8qIE5vdyB0aGUgcnggcmluZyBiYXNlLCBjb25zdW1lICYgcHJvZHVjZSByZWdpc3RlcnMuICAqLworCXJpbmcgPSBpb2MzX21hcChpcC0+cnhyLCAwKTsKKwlpb2MzX3dfZXJicl9oKHJpbmcgPj4gMzIpOworCWlvYzNfd19lcmJyX2wocmluZyAmIDB4ZmZmZmZmZmYpOworCWlvYzNfd19lcmNpcihpcC0+cnhfY2kgPDwgMyk7CisJaW9jM193X2VycGlyKChpcC0+cnhfcGkgPDwgMykgfCBFUlBJUl9BUk0pOworCisJcmluZyA9IGlvYzNfbWFwKGlwLT50eHIsIDApOworCisJaXAtPnR4cWxlbiA9IDA7CQkJCQkvKiBub3RoaW5nIHF1ZXVlZCAgKi8KKworCS8qIE5vdyB0aGUgdHggcmluZyBiYXNlLCBjb25zdW1lICYgcHJvZHVjZSByZWdpc3RlcnMuICAqLworCWlvYzNfd19ldGJyX2gocmluZyA+PiAzMik7CisJaW9jM193X2V0YnJfbChyaW5nICYgMHhmZmZmZmZmZik7CisJaW9jM193X2V0cGlyKGlwLT50eF9waSA8PCA3KTsKKwlpb2MzX3dfZXRjaXIoaXAtPnR4X2NpIDw8IDcpOworCSh2b2lkKSBpb2MzX3JfZXRjaXIoKTsJCQkJLyogRmx1c2ggKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIGlvYzNfc3NyYW1fZGlzYyhzdHJ1Y3QgaW9jM19wcml2YXRlICppcCkKK3sKKwlzdHJ1Y3QgaW9jMyAqaW9jMyA9IGlwLT5yZWdzOworCXZvbGF0aWxlIHUzMiAqc3NyYW0wID0gJmlvYzMtPnNzcmFtWzB4MDAwMF07CisJdm9sYXRpbGUgdTMyICpzc3JhbTEgPSAmaW9jMy0+c3NyYW1bMHg0MDAwXTsKKwl1bnNpZ25lZCBpbnQgcGF0dGVybiA9IDB4NTU1NTsKKworCS8qIEFzc3VtZSB0aGUgbGFyZ2VyIHNpemUgU1NSQU0gYW5kIGVuYWJsZSBwYXJpdHkgY2hlY2tpbmcgKi8KKwlpb2MzX3dfZW1jcihpb2MzX3JfZW1jcigpIHwgKEVNQ1JfQlVGU0laIHwgRU1DUl9SQU1QQVIpKTsKKworCSpzc3JhbTAgPSBwYXR0ZXJuOworCSpzc3JhbTEgPSB+cGF0dGVybiAmIElPQzNfU1NSQU1fRE07CisKKwlpZiAoKCpzc3JhbTAgJiBJT0MzX1NTUkFNX0RNKSAhPSBwYXR0ZXJuIHx8CisJICAgICgqc3NyYW0xICYgSU9DM19TU1JBTV9ETSkgIT0gKH5wYXR0ZXJuICYgSU9DM19TU1JBTV9ETSkpIHsKKwkJLyogc2V0IHNzcmFtIHNpemUgdG8gNjQgS0IgKi8KKwkJaXAtPmVtY3IgPSBFTUNSX1JBTVBBUjsKKwkJaW9jM193X2VtY3IoaW9jM19yX2VtY3IoKSAmIH5FTUNSX0JVRlNJWik7CisJfSBlbHNlCisJCWlwLT5lbWNyID0gRU1DUl9CVUZTSVogfCBFTUNSX1JBTVBBUjsKK30KKworc3RhdGljIHZvaWQgaW9jM19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpb2MzICppb2MzID0gaXAtPnJlZ3M7CisKKwlkZWxfdGltZXIoJmlwLT5pb2MzX3RpbWVyKTsJCS8qIEtpbGwgaWYgcnVubmluZwkqLworCisJaW9jM193X2VtY3IoRU1DUl9SU1QpOwkJCS8qIFJlc2V0CQkqLworCSh2b2lkKSBpb2MzX3JfZW1jcigpOwkJCS8qIEZsdXNoIFdCCQkqLworCXVkZWxheSg0KTsJCQkJLyogR2l2ZSBpdCB0aW1lIC4uLgkqLworCWlvYzNfd19lbWNyKDApOworCSh2b2lkKSBpb2MzX3JfZW1jcigpOworCisJLyogTWlzYyByZWdpc3RlcnMgICovCisjaWZkZWYgQ09ORklHX1NHSV9JUDI3CisJaW9jM193X2VyYmFyKFBDSTY0X0FUVFJfQkFSID4+IDMyKTsJLyogQmFycmllciBvbiBsYXN0IHN0b3JlICovCisjZWxzZQorCWlvYzNfd19lcmJhcigwKTsJCQkvKiBMZXQgUENJIEFQSSBnZXQgaXQgcmlnaHQgKi8KKyNlbmRpZgorCSh2b2lkKSBpb2MzX3JfZXRjZGMoKTsJCQkvKiBDbGVhciBvbiByZWFkICovCisJaW9jM193X2VyY3NyKDE1KTsJCQkvKiBSWCBsb3cgd2F0ZXJtYXJrICAqLworCWlvYzNfd19lcnRyKDApOwkJCQkvKiBJbnRlcnJ1cHQgaW1tZWRpYXRlbHkgKi8KKwlfX2lvYzNfc2V0X21hY19hZGRyZXNzKGRldik7CisJaW9jM193X2VoYXJfaChpcC0+ZWhhcl9oKTsKKwlpb2MzX3dfZWhhcl9sKGlwLT5laGFyX2wpOworCWlvYzNfd19lcnNyKDQyKTsJCQkvKiBYWFggc2hvdWxkIGJlIHJhbmRvbSAqLworCisJaW9jM19pbml0X3JpbmdzKGRldik7CisKKwlpcC0+ZW1jciB8PSAoKFJYX09GRlNFVCAvIDIpIDw8IEVNQ1JfUlhPRkZfU0hJRlQpIHwgRU1DUl9UWERNQUVOIHwKKwkgICAgICAgICAgICAgRU1DUl9UWEVOIHwgRU1DUl9SWERNQUVOIHwgRU1DUl9SWEVOIHwgRU1DUl9QQURFTjsKKwlpb2MzX3dfZW1jcihpcC0+ZW1jcik7CisJaW9jM193X2VpZXIoRUlTUl9SWFRJTUVSSU5UIHwgRUlTUl9SWE9GTE8gfCBFSVNSX1JYQlVGT0ZMTyB8CisJICAgICAgICAgICAgRUlTUl9SWE1FTUVSUiB8IEVJU1JfUlhQQVJFUlIgfCBFSVNSX1RYQlVGVUZMTyB8CisJICAgICAgICAgICAgRUlTUl9UWEVYUExJQ0lUIHwgRUlTUl9UWE1FTUVSUik7CisJKHZvaWQpIGlvYzNfcl9laWVyKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpb2MzX3N0b3Aoc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXApCit7CisJc3RydWN0IGlvYzMgKmlvYzMgPSBpcC0+cmVnczsKKworCWlvYzNfd19lbWNyKDApOwkJCQkvKiBTaHV0dXAgKi8KKwlpb2MzX3dfZWllcigwKTsJCQkJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJKHZvaWQpIGlvYzNfcl9laWVyKCk7CQkJLyogRmx1c2ggKi8KK30KKworc3RhdGljIGludCBpb2MzX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGlvYzNfaW50ZXJydXB0LCBTQV9TSElSUSwgaW9jM19zdHIsIGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgZ2V0IGlycSAlZFxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJaXAtPmVoYXJfaCA9IDA7CisJaXAtPmVoYXJfbCA9IDA7CisJaW9jM19pbml0KGRldik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlvYzNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlkZWxfdGltZXIoJmlwLT5pb2MzX3RpbWVyKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlvYzNfc3RvcChpcCk7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlpb2MzX2ZyZWVfcmluZ3MoaXApOworCXJldHVybiAwOworfQorCisvKgorICogTUVORVQgY2FyZHMgaGF2ZSBmb3VyIElPQzMgY2hpcHMsIHdoaWNoIGFyZSBhdHRhY2hlZCB0byB0d28gc2V0cyBvZgorICogUENJIHNsb3QgcmVzb3VyY2VzIGVhY2g6IHRoZSBwcmltYXJ5IGNvbm5lY3Rpb25zIGFyZSBvbiBzbG90cworICogMC4uMyBhbmQgdGhlIHNlY29uZGFyaWVzIGFyZSBvbiA0Li43CisgKgorICogQWxsIGZvdXIgZXRoZXJuZXRzIGFyZSBicm91Z2h0IG91dCB0byBjb25uZWN0b3JzOyBzaXggc2VyaWFsIHBvcnRzCisgKiAoYSBwYWlyIGZyb20gZWFjaCBvZiB0aGUgZmlyc3QgdGhyZWUgSU9DM3MpIGFyZSBicm91Z2h0IG91dCB0bworICogTWluaURJTnM7IGFsbCBvdGhlciBzdWJkZXZpY2VzIGFyZSBsZWZ0IHN3aW5naW5nIGluIHRoZSB3aW5kLCBsZWF2ZQorICogdGhlbSBkaXNhYmxlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgaW9jM19pc19tZW5ldChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCisJcmV0dXJuIHBkZXYtPmJ1cy0+cGFyZW50ID09IE5VTEwKKwkgICAgICAgJiYgKGRldiA9IHBjaV9maW5kX3Nsb3QocGRldi0+YnVzLT5udW1iZXIsIFBDSV9ERVZGTigwLCAwKSkpCisJICAgICAgICYmIGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfU0dJCisJICAgICAgICYmIGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0dJX0lPQzMKKwkgICAgICAgJiYgKGRldiA9IHBjaV9maW5kX3Nsb3QocGRldi0+YnVzLT5udW1iZXIsIFBDSV9ERVZGTigxLCAwKSkpCisJICAgICAgICYmIGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfU0dJCisJICAgICAgICYmIGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0dJX0lPQzMKKwkgICAgICAgJiYgKGRldiA9IHBjaV9maW5kX3Nsb3QocGRldi0+YnVzLT5udW1iZXIsIFBDSV9ERVZGTigyLCAwKSkpCisJICAgICAgICYmIGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfU0dJCisJICAgICAgICYmIGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0dJX0lPQzM7Cit9CisKKyNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTAKKy8qCisgKiBOb3RlIGFib3V0IHNlcmlhbCBwb3J0cyBhbmQgY29uc29sZXM6CisgKiBGb3IgY29uc29sZSBvdXRwdXQsIGV2ZXJ5b25lIHVzZXMgdGhlIElPQzMgVUFSVEEgKG9mZnNldCAweDE3OCkKKyAqIGNvbm5lY3RlZCB0byB0aGUgbWFzdGVyIG5vZGUgKGxvb2sgaW4gaXAyN19zZXR1cF9jb25zb2xlKCkgYW5kCisgKiBpcDI3cHJvbV9jb25zb2xlX3dyaXRlKCkpLgorICoKKyAqIEZvciBzZXJpYWwgKC9kZXYvdHR5UzAgZXRjKSwgd2UgY2FuIG5vdCBoYXZlIGhhcmRjb2RlZCBzZXJpYWwgcG9ydAorICogYWRkcmVzc2VzIG9uIGEgcGFydGl0aW9uZWQgbWFjaGluZS4gU2luY2Ugd2UgY3VycmVudGx5IHVzZSB0aGUgaW9jMworICogc2VyaWFsIHBvcnRzLCB3ZSB1c2UgZHluYW1pYyBzZXJpYWwgcG9ydCBkaXNjb3ZlcnkgdGhhdCB0aGUgc2VyaWFsLmMKKyAqIGRyaXZlciB1c2VzIGZvciBwY2kvcG5wIHBvcnRzICh0aGVyZSBpcyBhbiBlbnRyeSBmb3IgdGhlIFNHSSBpb2MzCisgKiBib2FyZHMgaW4gcGNpX2JvYXJkc1tdKS4gVW5mb3J0dW5hdGVseSwgVUFSVEEncyBwaW8gYWRkcmVzcyBpcyBncmVhdGVyCisgKiB0aGFuIFVBUlRCJ3MsIGFsdGhvdWdoIFVBUlRBIG9uIG8yMDBzIGhhcyB0cmFkaXRpb25hbGx5IGJlZW4ga25vd24gYXMKKyAqIHBvcnQgMC4gU28sIHdlIGp1c3QgdXNlIG9uZSBzZXJpYWwgcG9ydCBmcm9tIGVhY2ggaW9jMyAoc2luY2UgdGhlCisgKiBzZXJpYWwgZHJpdmVyIGFkZHMgYWRkcmVzc2VzIHRvIGdldCB0byBoaWdoZXIgcG9ydHMpLgorICoKKyAqIFRoZSBmaXJzdCBvbmUgdG8gZG8gYSByZWdpc3Rlcl9jb25zb2xlIGJlY29tZXMgdGhlIHByZWZlcnJlZCBjb25zb2xlCisgKiAoaWYgdGhlcmUgaXMgbm8ga2VybmVsIGNvbW1hbmQgbGluZSBjb25zb2xlPSBkaXJlY3RpdmUpLiAvZGV2L2NvbnNvbGUKKyAqIChpZSA1LCAxKSBpcyB0aGVuICJhbGlhc2VkIiBpbnRvIHRoZSBkZXZpY2UgbnVtYmVyIHJldHVybmVkIGJ5IHRoZQorICogImRldmljZSIgcm91dGluZSByZWZlcnJlZCB0byBpbiB0aGlzIGNvbnNvbGUgc3RydWN0dXJlCisgKiAoaXAyN3Byb21fY29uc29sZV9kZXYpLgorICoKKyAqIEFsc28gbG9vayBpbiBpcDI3LXBjaS5jOnBjaV9maXh1cF9pb2MzKCkgZm9yIHNvbWUgY29tbWVudHMgb24gd29ya2luZworICogYXJvdW5kIGlvYzMgb2RkaXRpZXMgaW4gdGhpcyByZXNwZWN0LgorICoKKyAqIFRoZSBJT0MzIHNlcmlhbHMgdXNlIGEgMjJNSHogY2xvY2sgcmF0ZSB3aXRoIGFuIGFkZGl0aW9uYWwgZGl2aWRlciBieSAzLgorICogKElPQzNfQkFVRCA9ICgyMjAwMDAwMCAvICgzKjE2KSkpCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGlvYzNfc2VyaWFsX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgaW9jMyAqaW9jMykKK3sKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCByZXE7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gcmVjb2duaWNlIGFuZCB0cmVhdCB0aGUgZm91cnRoIE1FTkVUIHNlcmlhbCBhcyBpdAorCSAqIGRvZXMgbm90IGhhdmUgYW4gU3VwZXJJTyBjaGlwIGF0dGFjaGVkIHRvIGl0LCB0aGVyZWZvcmUgYXR0ZW1wdGluZworCSAqIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCBpbiBidXMgZXJyb3JzLiAgV2UgY2FsbCBzb21ldGhpbmcgYW4KKwkgKiBNRU5FVCBpZiBQQ0kgc2xvdCAwLCAxLCAyIGFuZCAzIG9mIGEgbWFzdGVyIFBDSSBidXMgYWxsIGhhdmUgYW4gSU9DMworCSAqIGluIGl0LiAgVGhpcyBpcyBwYXJhbm9pZCBidXQgd2Ugd2FudCB0byBhdm9pZCBibG93aW5nIHVwIG9uIGEKKwkgKiBzaG93aG9ybiBQQ0kgYm94IHRoYXQgaGFwcGVucyB0byBoYXZlIDQgSU9DMyBjYXJkcyBpbiBpdCBzbyBpdCdzCisJICogbm90IHBhcmFub2lkIGVub3VnaCAuLi4KKwkgKi8KKwlpZiAoaW9jM19pc19tZW5ldChwZGV2KSAmJiBQQ0lfU0xPVChwZGV2LT5kZXZmbikgPT0gMykKKwkJcmV0dXJuOworCisJLyogUmVnaXN0ZXIgdG8gaW50ZXJydXB0IHplcm8gYmVjYXVzZSB3ZSBzaGFyZSB0aGUgaW50ZXJydXB0IHdpdGgKKwkgICB0aGUgc2VyaWFsIGRyaXZlciB3aGljaCB3ZSBkb24ndCBwcm9wZXJseSBzdXBwb3J0IHlldC4gICovCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKwlyZXEuaXJxICAgICAgICAgICAgID0gMDsKKwlyZXEuZmxhZ3MgICAgICAgICAgID0gSU9DM19DT01fRkxBR1M7CisJcmVxLmlvX3R5cGUgICAgICAgICA9IFNFUklBTF9JT19NRU07CisJcmVxLmlvbWVtX3JlZ19zaGlmdCA9IDA7CisJcmVxLmJhdWRfYmFzZSAgICAgICA9IElPQzNfQkFVRDsKKworCXJlcS5pb21lbV9iYXNlICAgICAgPSAodW5zaWduZWQgY2hhciAqKSAmaW9jMy0+c3JlZ3MudWFydGE7CisJcmVnaXN0ZXJfc2VyaWFsKCZyZXEpOworCisJcmVxLmlvbWVtX2Jhc2UgICAgICA9ICh1bnNpZ25lZCBjaGFyICopICZpb2MzLT5zcmVncy51YXJ0YjsKKwlyZWdpc3Rlcl9zZXJpYWwoJnJlcSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBpb2MzX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXVuc2lnbmVkIGludCBzd19waHlzaWQxLCBzd19waHlzaWQyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwOworCXN0cnVjdCBpb2MzICppb2MzOworCXVuc2lnbmVkIGxvbmcgaW9jM19iYXNlLCBpb2MzX3NpemU7CisJdTMyIHZlbmRvciwgbW9kZWwsIHJldjsKKwlpbnQgZXJyLCBwY2lfdXNpbmdfZGFjOworCisJLyogQ29uZmlndXJlIERNQSBhdHRyaWJ1dGVzLiAqLworCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKTsKKwlpZiAoIWVycikgeworCQlwY2lfdXNpbmdfZGFjID0gMTsKKwkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gb2J0YWluIDY0IGJpdCBETUEgIgorCQkJICAgICAgICJmb3IgY29uc2lzdGVudCBhbGxvY2F0aW9uc1xuIiwgcGNpX25hbWUocGRldikpOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgeworCQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZVTEwpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBObyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb24sICIKKwkJCSAgICAgICAiYWJvcnRpbmcuXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlwY2lfdXNpbmdfZGFjID0gMDsKKwl9CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCXJldHVybiAtRU5PREVWOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBpb2MzX3ByaXZhdGUpKTsKKwlpZiAoIWRldikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dF9kaXNhYmxlOworCX0KKworCWlmIChwY2lfdXNpbmdfZGFjKQorCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKKworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgImlvYzMiKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlpcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKworCWlvYzNfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlpb2MzX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOworCWlvYzMgPSAoc3RydWN0IGlvYzMgKikgaW9yZW1hcChpb2MzX2Jhc2UsIGlvYzNfc2l6ZSk7CisJaWYgKCFpb2MzKSB7CisJCXByaW50ayhLRVJOX0NSSVQgImlvYzNldGgoJXMpOiBpb3JlbWFwIGZhaWxlZCwgZ29vZGJ5ZS5cbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3JlczsKKwl9CisJaXAtPnJlZ3MgPSBpb2MzOworCisjaWZkZWYgQ09ORklHX1NFUklBTF84MjUwCisJaW9jM19zZXJpYWxfcHJvYmUocGRldiwgaW9jMyk7CisjZW5kaWYKKworCXNwaW5fbG9ja19pbml0KCZpcC0+aW9jM19sb2NrKTsKKwlpbml0X3RpbWVyKCZpcC0+aW9jM190aW1lcik7CisKKwlpb2MzX3N0b3AoaXApOworCWlvYzNfaW5pdChkZXYpOworCisJaXAtPnBkZXYgPSBwZGV2OworCisJaXAtPm1paS5waHlfaWRfbWFzayA9IDB4MWY7CisJaXAtPm1paS5yZWdfbnVtX21hc2sgPSAweDFmOworCWlwLT5taWkuZGV2ID0gZGV2OworCWlwLT5taWkubWRpb19yZWFkID0gaW9jM19tZGlvX3JlYWQ7CisJaXAtPm1paS5tZGlvX3dyaXRlID0gaW9jM19tZGlvX3dyaXRlOworCisJaW9jM19taWlfaW5pdChpcCk7CisKKwlpZiAoaXAtPm1paS5waHlfaWQgPT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiaW9jMy1ldGgoJXMpOiBEaWRuJ3QgZmluZCBhIFBIWSwgZ29vZGJ5ZS5cbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3N0b3A7CisJfQorCisJaW9jM19zc3JhbV9kaXNjKGlwKTsKKwlpb2MzX2dldF9lYWRkcihpcCk7CisKKwkvKiBUaGUgSU9DMy1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbgkJPSBpb2MzX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBpb2MzX3N0YXJ0X3htaXQ7CisJZGV2LT50eF90aW1lb3V0CQk9IGlvYzNfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gNSAqIEhaOworCWRldi0+c3RvcAkJPSBpb2MzX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzCQk9IGlvYzNfZ2V0X3N0YXRzOworCWRldi0+ZG9faW9jdGwJCT0gaW9jM19pb2N0bDsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdAk9IGlvYzNfc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+c2V0X21hY19hZGRyZXNzCT0gaW9jM19zZXRfbWFjX2FkZHJlc3M7CisJZGV2LT5ldGh0b29sX29wcwk9ICZpb2MzX2V0aHRvb2xfb3BzOworI2lmZGVmIENPTkZJR19TR0lfSU9DM19FVEhfSFdfVFhfQ1NVTQorCWRldi0+ZmVhdHVyZXMJCT0gTkVUSUZfRl9JUF9DU1VNOworI2VuZGlmCisKKwlpb2MzX3NldHVwX2R1cGxleChpcCk7CisJc3dfcGh5c2lkMSA9IGlvYzNfbWRpb19yZWFkKGRldiwgaXAtPm1paS5waHlfaWQsIE1JSV9QSFlTSUQxKTsKKwlzd19waHlzaWQyID0gaW9jM19tZGlvX3JlYWQoZGV2LCBpcC0+bWlpLnBoeV9pZCwgTUlJX1BIWVNJRDIpOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXRfc3RvcDsKKworCW1paV9jaGVja19tZWRpYSgmaXAtPm1paSwgMSwgMSk7CisKKwl2ZW5kb3IgPSAoc3dfcGh5c2lkMSA8PCAxMikgfCAoc3dfcGh5c2lkMiA+PiA0KTsKKwltb2RlbCAgPSAoc3dfcGh5c2lkMiA+PiA0KSAmIDB4M2Y7CisJcmV2ICAgID0gc3dfcGh5c2lkMiAmIDB4ZjsKKwlwcmludGsoS0VSTl9JTkZPICIlczogVXNpbmcgUEhZICVkLCB2ZW5kb3IgMHgleCwgbW9kZWwgJWQsICIKKwkgICAgICAgInJldiAlZC5cbiIsIGRldi0+bmFtZSwgaXAtPm1paS5waHlfaWQsIHZlbmRvciwgbW9kZWwsIHJldik7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElPQzMgU1NSQU0gaGFzICVkIGtieXRlLlxuIiwgZGV2LT5uYW1lLAorCSAgICAgICBpcC0+ZW1jciAmIEVNQ1JfQlVGU0laID8gMTI4IDogNjQpOworCisJcmV0dXJuIDA7CisKK291dF9zdG9wOgorCWlvYzNfc3RvcChpcCk7CisJaW9jM19mcmVlX3JpbmdzKGlwKTsKK291dF9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK291dF9mcmVlOgorCWZyZWVfbmV0ZGV2KGRldik7CitvdXRfZGlzYWJsZToKKwkvKgorCSAqIFdlIHNob3VsZCBjYWxsIHBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsgaGVyZSBpZiB0aGUgSU9DMyB3YXNuJ3QKKwkgKiBzdWNoIGEgd2VpcmQgZGV2aWNlIC4uLgorCSAqLworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpb2MzX3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpb2MzICppb2MzID0gaXAtPnJlZ3M7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCWlvdW5tYXAoaW9jMyk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlmcmVlX25ldGRldihkZXYpOworCS8qCisJICogV2Ugc2hvdWxkIGNhbGwgcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOyBoZXJlIGlmIHRoZSBJT0MzIHdhc24ndAorCSAqIHN1Y2ggYSB3ZWlyZCBkZXZpY2UgLi4uCisJICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpb2MzX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfU0dJLCBQQ0lfREVWSUNFX0lEX1NHSV9JT0MzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sCisJeyAwIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaW9jM19wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGlvYzNfZHJpdmVyID0geworCS5uYW1lCQk9ICJpb2MzLWV0aCIsCisJLmlkX3RhYmxlCT0gaW9jM19wY2lfdGJsLAorCS5wcm9iZQkJPSBpb2MzX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoaW9jM19yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlvYzNfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZpb2MzX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpb2MzX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpb2MzX2RyaXZlcik7Cit9CisKK3N0YXRpYyBpbnQgaW9jM19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCXN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaW9jMyAqaW9jMyA9IGlwLT5yZWdzOworCXVuc2lnbmVkIGludCBsZW47CisJc3RydWN0IGlvYzNfZXR4ZCAqZGVzYzsKKwl1aW50MzJfdCB3MCA9IDA7CisJaW50IHByb2R1Y2U7CisKKyNpZmRlZiBDT05GSUdfU0dJX0lPQzNfRVRIX0hXX1RYX0NTVU0KKwkvKgorCSAqIElPQzMgaGFzIGEgZmFpcmx5IHNpbXBsZSBtaW5kZWQgY2hlY2tzdW1taW5nIGhhcmR3YXJlIHdoaWNoIHNpbXBseQorCSAqIGFkZHMgdXAgdGhlIDEncyBjb21wbGVtZW50IGNoZWNrc3VtIGZvciB0aGUgZW50aXJlIHBhY2tldCBhbmQKKwkgKiBpbnNlcnRzIGl0IGF0IGFuIG9mZnNldCB3aGljaCBjYW4gYmUgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdG9yCisJICogaW50byB0aGUgdHJhbnNtaXQgcGFja2V0LiAgVGhpcyBtZWFucyB3ZSBoYXZlIHRvIGNvbXBlbnNhdGUgZm9yIHRoZQorCSAqIE1BQyBoZWFkZXIgd2hpY2ggc2hvdWxkIG5vdCBiZSBzdW1tZWQgYW5kIHRoZSBUQ1AvVURQIHBzZXVkbyBoZWFkZXJzCisJICogbWFudWFsbHkuCisJICovCisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSB7CisJCWludCBwcm90byA9IG50b2hzKHNrYi0+bmguaXBoLT5wcm90b2NvbCk7CisJCXVuc2lnbmVkIGludCBjc29mZjsKKwkJc3RydWN0IGlwaGRyICppaCA9IHNrYi0+bmguaXBoOworCQl1aW50MzJfdCBjc3VtLCBlaHN1bTsKKwkJdWludDE2X3QgKmVoOworCisJCS8qIFRoZSBNQUMgaGVhZGVyLiAgc2tiLT5tYWMgc2VlbSB0aGUgbG9naWMgYXBwcm9hY2gKKwkJICAgdG8gZmluZCB0aGUgTUFDIGhlYWRlciAtIGV4Y2VwdCBpdCdzIGEgTlVMTCBwb2ludGVyIC4uLiAgKi8KKwkJZWggPSAodWludDE2X3QgKikgc2tiLT5kYXRhOworCisJCS8qIFN1bSB1cCBkZXN0IGFkZHIsIHNyYyBhZGRyIGFuZCBwcm90b2NvbCAgKi8KKwkJZWhzdW0gPSBlaFswXSArIGVoWzFdICsgZWhbMl0gKyBlaFszXSArIGVoWzRdICsgZWhbNV0gKyBlaFs2XTsKKworCQkvKiBGb2xkIGVoc3VtLiAgY2FuJ3QgdXNlIGNzdW1fZm9sZCB3aGljaCBuZWdhdGVzIGFsc28gLi4uICAqLworCQllaHN1bSA9IChlaHN1bSAmIDB4ZmZmZikgKyAoZWhzdW0gPj4gMTYpOworCQllaHN1bSA9IChlaHN1bSAmIDB4ZmZmZikgKyAoZWhzdW0gPj4gMTYpOworCisJCS8qIFNraXAgSVAgaGVhZGVyOyBpdCdzIHN1bSBpcyBhbHdheXMgemVybyBhbmQgd2FzCisJCSAgIGFscmVhZHkgZmlsbGVkIGluIGJ5IGlwX291dHB1dC5jICovCisJCWNzdW0gPSBjc3VtX3RjcHVkcF9ub2ZvbGQoaWgtPnNhZGRyLCBpaC0+ZGFkZHIsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgaWgtPnRvdF9sZW4gLSAoaWgtPmlobCA8PCAyKSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90bywgMHhmZmZmIF4gZWhzdW0pOworCisJCWNzdW0gPSAoY3N1bSAmIDB4ZmZmZikgKyAoY3N1bSA+PiAxNik7CS8qIEZvbGQgYWdhaW4gKi8KKwkJY3N1bSA9IChjc3VtICYgMHhmZmZmKSArIChjc3VtID4+IDE2KTsKKworCQljc29mZiA9IEVUSF9ITEVOICsgKGloLT5paGwgPDwgMik7CisJCWlmIChwcm90byA9PSBJUFBST1RPX1VEUCkgeworCQkJY3NvZmYgKz0gb2Zmc2V0b2Yoc3RydWN0IHVkcGhkciwgY2hlY2spOworCQkJc2tiLT5oLnVoLT5jaGVjayA9IGNzdW07CisJCX0KKwkJaWYgKHByb3RvID09IElQUFJPVE9fVENQKSB7CisJCQljc29mZiArPSBvZmZzZXRvZihzdHJ1Y3QgdGNwaGRyLCBjaGVjayk7CisJCQlza2ItPmgudGgtPmNoZWNrID0gY3N1bTsKKwkJfQorCisJCXcwID0gRVRYRF9ET0NIRUNLU1VNIHwgKGNzb2ZmIDw8IEVUWERfQ0hLT0ZGX1NISUZUKTsKKwl9CisjZW5kaWYgLyogQ09ORklHX1NHSV9JT0MzX0VUSF9IV19UWF9DU1VNICovCisKKwlzcGluX2xvY2tfaXJxKCZpcC0+aW9jM19sb2NrKTsKKworCWRhdGEgPSAodW5zaWduZWQgbG9uZykgc2tiLT5kYXRhOworCWxlbiA9IHNrYi0+bGVuOworCisJcHJvZHVjZSA9IGlwLT50eF9waTsKKwlkZXNjID0gJmlwLT50eHJbcHJvZHVjZV07CisKKwlpZiAobGVuIDw9IDEwNCkgeworCQkvKiBTaG9ydCBwYWNrZXQsIGxldCdzIGNvcHkgaXQgZGlyZWN0bHkgaW50byB0aGUgcmluZy4gICovCisJCW1lbWNweShkZXNjLT5kYXRhLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJaWYgKGxlbiA8IEVUSF9aTEVOKSB7CisJCQkvKiBWZXJ5IHNob3J0IHBhY2tldCwgcGFkIHdpdGggemVyb3MgYXQgdGhlIGVuZC4gKi8KKwkJCW1lbXNldChkZXNjLT5kYXRhICsgbGVuLCAwLCBFVEhfWkxFTiAtIGxlbik7CisJCQlsZW4gPSBFVEhfWkxFTjsKKwkJfQorCQlkZXNjLT5jbWQgPSBjcHVfdG9fYmUzMihsZW4gfCBFVFhEX0lOVFdIRU5ET05FIHwgRVRYRF9EMFYgfCB3MCk7CisJCWRlc2MtPmJ1ZmNudCA9IGNwdV90b19iZTMyKGxlbik7CisJfSBlbHNlIGlmICgoZGF0YSBeIChkYXRhICsgbGVuIC0gMSkpICYgMHg0MDAwKSB7CisJCXVuc2lnbmVkIGxvbmcgYjIgPSAoZGF0YSB8IDB4M2ZmZlVMKSArIDFVTDsKKwkJdW5zaWduZWQgbG9uZyBzMSA9IGIyIC0gZGF0YTsKKwkJdW5zaWduZWQgbG9uZyBzMiA9IGRhdGEgKyBsZW4gLSBiMjsKKworCQlkZXNjLT5jbWQgICAgPSBjcHVfdG9fYmUzMihsZW4gfCBFVFhEX0lOVFdIRU5ET05FIHwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgRVRYRF9CMVYgfCBFVFhEX0IyViB8IHcwKTsKKwkJZGVzYy0+YnVmY250ID0gY3B1X3RvX2JlMzIoKHMxIDw8IEVUWERfQjFDTlRfU0hJRlQpIHwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMyIDw8IEVUWERfQjJDTlRfU0hJRlQpKTsKKwkJZGVzYy0+cDEgICAgID0gY3B1X3RvX2JlNjQoaW9jM19tYXAoc2tiLT5kYXRhLCAxKSk7CisJCWRlc2MtPnAyICAgICA9IGNwdV90b19iZTY0KGlvYzNfbWFwKCh2b2lkICopIGIyLCAxKSk7CisJfSBlbHNlIHsKKwkJLyogTm9ybWFsIHNpemVkIHBhY2tldCB0aGF0IGRvZXNuJ3QgY3Jvc3MgYSBwYWdlIGJvdW5kYXJ5LiAqLworCQlkZXNjLT5jbWQgPSBjcHVfdG9fYmUzMihsZW4gfCBFVFhEX0lOVFdIRU5ET05FIHwgRVRYRF9CMVYgfCB3MCk7CisJCWRlc2MtPmJ1ZmNudCA9IGNwdV90b19iZTMyKGxlbiA8PCBFVFhEX0IxQ05UX1NISUZUKTsKKwkJZGVzYy0+cDEgICAgID0gY3B1X3RvX2JlNjQoaW9jM19tYXAoc2tiLT5kYXRhLCAxKSk7CisJfQorCisJQkFSUklFUigpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJaXAtPnR4X3NrYnNbcHJvZHVjZV0gPSBza2I7CQkJLyogUmVtZW1iZXIgc2tiICovCisJcHJvZHVjZSA9IChwcm9kdWNlICsgMSkgJiAxMjc7CisJaXAtPnR4X3BpID0gcHJvZHVjZTsKKwlpb2MzX3dfZXRwaXIocHJvZHVjZSA8PCA3KTsJCQkvKiBGaXJlIC4uLiAqLworCisJaXAtPnR4cWxlbisrOworCisJaWYgKGlwLT50eHFsZW4gPj0gMTI3KQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlzcGluX3VubG9ja19pcnEoJmlwLT5pb2MzX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlvYzNfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgcmVzZXR0aW5nXG4iLCBkZXYtPm5hbWUpOworCisJc3Bpbl9sb2NrX2lycSgmaXAtPmlvYzNfbG9jayk7CisKKwlpb2MzX3N0b3AoaXApOworCWlvYzNfaW5pdChkZXYpOworCWlvYzNfbWlpX2luaXQoaXApOworCisJc3Bpbl91bmxvY2tfaXJxKCZpcC0+aW9jM19sb2NrKTsKKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyoKKyAqIEdpdmVuIGEgbXVsdGljYXN0IGV0aGVybmV0IGFkZHJlc3MsIHRoaXMgcm91dGluZSBjYWxjdWxhdGVzIHRoZQorICogYWRkcmVzcydzIGJpdCBpbmRleCBpbiB0aGUgbG9naWNhbCBhZGRyZXNzIGZpbHRlciBtYXNrCisgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaW9jM19oYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIpCit7CisJdW5zaWduZWQgaW50IHRlbXAgPSAwOworCXUzMiBjcmM7CisJaW50IGJpdHM7CisKKwljcmMgPSBldGhlcl9jcmNfbGUoRVRIX0FMRU4sIGFkZHIpOworCisJY3JjICY9IDB4M2Y7ICAgIC8qIGJpdCByZXZlcnNlIGxvd2VzdCA2IGJpdHMgZm9yIGhhc2ggaW5kZXggKi8KKwlmb3IgKGJpdHMgPSA2OyAtLWJpdHMgPj0gMDsgKSB7CisJCXRlbXAgPDw9IDE7CisJCXRlbXAgfD0gKGNyYyAmIDB4MSk7CisJCWNyYyA+Pj0gMTsKKwl9CisKKwlyZXR1cm4gdGVtcDsKK30KKworc3RhdGljIHZvaWQgaW9jM19nZXRfZHJ2aW5mbyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHN0cmNweSAoaW5mby0+ZHJpdmVyLCBJT0MzX05BTUUpOworICAgICAgICBzdHJjcHkgKGluZm8tPnZlcnNpb24sIElPQzNfVkVSU0lPTik7CisgICAgICAgIHN0cmNweSAoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGlwLT5wZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgaW9jM19nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IGlvYzNfcHJpdmF0ZSAqaXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByYzsKKworCXNwaW5fbG9ja19pcnEoJmlwLT5pb2MzX2xvY2spOworCXJjID0gbWlpX2V0aHRvb2xfZ3NldCgmaXAtPm1paSwgY21kKTsKKwlzcGluX3VubG9ja19pcnEoJmlwLT5pb2MzX2xvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGlvYzNfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxKCZpcC0+aW9jM19sb2NrKTsKKwlyYyA9IG1paV9ldGh0b29sX3NzZXQoJmlwLT5taWksIGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZpcC0+aW9jM19sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBpb2MzX253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmaXAtPmlvYzNfbG9jayk7CisJcmMgPSBtaWlfbndheV9yZXN0YXJ0KCZpcC0+bWlpKTsKKwlzcGluX3VubG9ja19pcnEoJmlwLT5pb2MzX2xvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdTMyIGlvYzNfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmaXAtPmlvYzNfbG9jayk7CisJcmMgPSBtaWlfbGlua19vaygmaXAtPm1paSk7CisJc3Bpbl91bmxvY2tfaXJxKCZpcC0+aW9jM19sb2NrKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBpb2MzX2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBpb2MzX2dldF9kcnZpbmZvLAorCS5nZXRfc2V0dGluZ3MJCT0gaW9jM19nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSBpb2MzX3NldF9zZXR0aW5ncywKKwkubndheV9yZXNldAkJPSBpb2MzX253YXlfcmVzZXQsCisJLmdldF9saW5rCQk9IGlvYzNfZ2V0X2xpbmssCit9OworCitzdGF0aWMgaW50IGlvYzNfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgaW9jM19wcml2YXRlICppcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmaXAtPmlvYzNfbG9jayk7CisJcmMgPSBnZW5lcmljX21paV9pb2N0bCgmaXAtPm1paSwgaWZfbWlpKHJxKSwgY21kLCBOVUxMKTsKKwlzcGluX3VubG9ja19pcnEoJmlwLT5pb2MzX2xvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBpb2MzX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pID0gZGV2LT5tY19saXN0OworCXN0cnVjdCBpb2MzX3ByaXZhdGUgKmlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaW9jMyAqaW9jMyA9IGlwLT5yZWdzOworCXU2NCBlaGFyID0gMDsKKwlpbnQgaTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsJCQkJLyogTG9jayBvdXQgb3RoZXJzLiAqLworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewkJCS8qIFNldCBwcm9taXNjdW91cy4gICovCisJCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJaXAtPmVtY3IgfD0gRU1DUl9QUk9NSVNDOworCQlpb2MzX3dfZW1jcihpcC0+ZW1jcik7CisJCSh2b2lkKSBpb2MzX3JfZW1jcigpOworCX0gZWxzZSB7CisJCWlwLT5lbWNyICY9IH5FTUNSX1BST01JU0M7CisJCWlvYzNfd19lbWNyKGlwLT5lbWNyKTsJCQkvKiBDbGVhciBwcm9taXNjdW91cy4gKi8KKwkJKHZvaWQpIGlvYzNfcl9lbWNyKCk7CisKKwkJaWYgKChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fCAoZGV2LT5tY19jb3VudCA+IDY0KSkgeworCQkJLyogVG9vIG1hbnkgZm9yIGhhc2hpbmcgdG8gbWFrZSBzZW5zZSBvciB3ZSB3YW50IGFsbAorCQkJICAgbXVsdGljYXN0IHBhY2tldHMgYW55d2F5LCAgc28gc2tpcCBjb21wdXRpbmcgYWxsIHRoZQorCQkJICAgaGFzaGVzIGFuZCBqdXN0IGFjY2VwdCBhbGwgcGFja2V0cy4gICovCisJCQlpcC0+ZWhhcl9oID0gMHhmZmZmZmZmZjsKKwkJCWlwLT5laGFyX2wgPSAweGZmZmZmZmZmOworCQl9IGVsc2UgeworCQkJZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKykgeworCQkJCWNoYXIgKmFkZHIgPSBkbWktPmRtaV9hZGRyOworCQkJCWRtaSA9IGRtaS0+bmV4dDsKKworCQkJCWlmICghKCphZGRyICYgMSkpCisJCQkJCWNvbnRpbnVlOworCisJCQkJZWhhciB8PSAoMVVMIDw8IGlvYzNfaGFzaChhZGRyKSk7CisJCQl9CisJCQlpcC0+ZWhhcl9oID0gZWhhciA+PiAzMjsKKwkJCWlwLT5laGFyX2wgPSBlaGFyICYgMHhmZmZmZmZmZjsKKwkJfQorCQlpb2MzX3dfZWhhcl9oKGlwLT5laGFyX2gpOworCQlpb2MzX3dfZWhhcl9sKGlwLT5laGFyX2wpOworCX0KKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsJCQkvKiBMZXQgdXMgZ2V0IGdvaW5nIGFnYWluLiAqLworfQorCitNT0RVTEVfQVVUSE9SKCJSYWxmIEJhZWNobGUgPHJhbGZAbGludXgtbWlwcy5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNHSSBJT0MzIEV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChpb2MzX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGlvYzNfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9LY29uZmlnIGIvZHJpdmVycy9uZXQvaXJkYS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NjQ4NDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL0tjb25maWcKQEAgLTAsMCArMSw0MDQgQEAKKworbWVudSAiSW5mcmFyZWQtcG9ydCBkZXZpY2UgZHJpdmVycyIKKwlkZXBlbmRzIG9uIElSREEhPW4KKworY29tbWVudCAiU0lSIGRldmljZSBkcml2ZXJzIgorCitjb25maWcgSVJUVFlfU0lSCisJdHJpc3RhdGUgIklyVFRZICh1c2VzIExpbnV4IHNlcmlhbCBkcml2ZXIpIgorCWRlcGVuZHMgb24gSVJEQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIElyVFRZIGxpbmUKKwkgIGRpc2NpcGxpbmUuICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBpcnR0eS1zaXIuIElyVFRZIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSBMaW51eCdzCisJICBvd24gc2VyaWFsIGRyaXZlciBmb3IgYWxsIElyREEgcG9ydHMgdGhhdCBhcmUgMTY1NTAgY29tcGF0aWJsZS4KKwkgIE1vc3QgSXJEQSBjaGlwcyBhcmUgMTY1NTAgY29tcGF0aWJsZSBzbyB5b3Ugc2hvdWxkIHByb2JhYmx5IHNheSBZCisJICB0byB0aGlzIG9wdGlvbi4gIFVzaW5nIElyVFRZIHdpbGwgaG93ZXZlciBsaW1pdCB0aGUgc3BlZWQgb2YgdGhlCisJICBjb25uZWN0aW9uIHRvIDExNTIwMCBicHMgKElyREEgU0lSIG1vZGUpLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb21tZW50ICJEb25nbGUgc3VwcG9ydCIKKworY29uZmlnIERPTkdMRQorCWJvb2wgIlNlcmlhbCBkb25nbGUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElSVFRZX1NJUgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYW4gaW5mcmFyZWQgZGV2aWNlIHRoYXQgY29ubmVjdHMgdG8geW91cgorCSAgY29tcHV0ZXIncyBzZXJpYWwgcG9ydC4gVGhlc2UgZGV2aWNlcyBhcmUgY2FsbGVkIGRvbmdsZXMuIFRoZW4gc2F5IFkKKwkgIG9yIE0gdG8gdGhlIGRyaXZlciBmb3IgeW91ciBwYXJ0aWN1bGFyIGRvbmdsZSBiZWxvdy4KKworCSAgTm90ZSB0aGF0IHRoZSBhbnN3ZXIgdG8gdGhpcyBxdWVzdGlvbiB3b24ndCBkaXJlY3RseSBhZmZlY3QgdGhlCisJICBrZXJuZWw6IHNheWluZyBOIHdpbGwganVzdCBjYXVzZSB0aGUgY29uZmlndXJhdG9yIHRvIHNraXAgYWxsCisJICB0aGUgcXVlc3Rpb25zIGFib3V0IHNlcmlhbCBkb25nbGVzLgorCitjb25maWcgRVNJX0RPTkdMRQorCXRyaXN0YXRlICJFU0kgSmV0RXllIFBDIGRvbmdsZSIKKwlkZXBlbmRzIG9uIERPTkdMRSAmJiBJUkRBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgRXh0ZW5kZWQgU3lzdGVtcworCSAgSmV0RXllIFBDIGRvbmdsZS4gIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZSBFU0kKKwkgIGRvbmdsZSBhdHRhY2hlcyB0byB0aGUgbm9ybWFsIDktcGluIHNlcmlhbCBwb3J0IGNvbm5lY3RvciwgYW5kIGNhbgorCSAgY3VycmVudGx5IG9ubHkgYmUgdXNlZCBieSBJclRUWS4gIFRvIGFjdGl2YXRlIHN1cHBvcnQgZm9yIEVTSQorCSAgZG9uZ2xlcyB5b3Ugd2lsbCBoYXZlIHRvIHN0YXJ0IGlyYXR0YWNoIGxpa2UgdGhpczoKKwkgICJpcmF0dGFjaCAtZCBlc2kiLgorCitjb25maWcgQUNUSVNZU19ET05HTEUKKwl0cmlzdGF0ZSAiQUNUaVNZUyBJUi0yMjBMIGFuZCBJUjIyMEwrIGRvbmdsZSIKKwlkZXBlbmRzIG9uIERPTkdMRSAmJiBJUkRBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgQUNUaVNZUyBJUi0yMjBMIGFuZAorCSAgSVIyMjBMKyBkb25nbGVzLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlCisJICBBQ1RpU1lTIGRvbmdsZXMgYXR0YWNoZXMgdG8gdGhlIG5vcm1hbCA5LXBpbiBzZXJpYWwgcG9ydCBjb25uZWN0b3IsCisJICBhbmQgY2FuIGN1cnJlbnRseSBvbmx5IGJlIHVzZWQgYnkgSXJUVFkuICBUbyBhY3RpdmF0ZSBzdXBwb3J0IGZvcgorCSAgQUNUaVNZUyBkb25nbGVzIHlvdSB3aWxsIGhhdmUgdG8gc3RhcnQgaXJhdHRhY2ggbGlrZSB0aGlzOgorCSAgImlyYXR0YWNoIC1kIGFjdGlzeXMiIG9yICJpcmF0dGFjaCAtZCBhY3Rpc3lzKyIuCisKK2NvbmZpZyBURUtSQU1fRE9OR0xFCisJdHJpc3RhdGUgIlRla3JhbSBJck1hdGUgMjEwQiBkb25nbGUiCisJZGVwZW5kcyBvbiBET05HTEUgJiYgSVJEQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIFRla3JhbSBJck1hdGUgMjEwQgorCSAgZG9uZ2xlLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlIFRla3JhbSBkb25nbGUKKwkgIGF0dGFjaGVzIHRvIHRoZSBub3JtYWwgOS1waW4gc2VyaWFsIHBvcnQgY29ubmVjdG9yLCBhbmQgY2FuCisJICBjdXJyZW50bHkgb25seSBiZSB1c2VkIGJ5IElyVFRZLiAgVG8gYWN0aXZhdGUgc3VwcG9ydCBmb3IgVGVrcmFtCisJICBkb25nbGVzIHlvdSB3aWxsIGhhdmUgdG8gc3RhcnQgaXJhdHRhY2ggbGlrZSB0aGlzOgorCSAgImlyYXR0YWNoIC1kIHRla3JhbSIuCisKK2NvbmZpZyBMSVRFTElOS19ET05HTEUKKwl0cmlzdGF0ZSAiUGFyYWxsYXggTGl0ZUxpbmsgZG9uZ2xlIgorCWRlcGVuZHMgb24gRE9OR0xFICYmIElSREEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBQYXJhbGxheCBMaXRlbGluaworCSAgZG9uZ2xlLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIFRoZSBQYXJhbGxheAorCSAgZG9uZ2xlIGF0dGFjaGVzIHRvIHRoZSBub3JtYWwgOS1waW4gc2VyaWFsIHBvcnQgY29ubmVjdG9yLCBhbmQgY2FuCisJICBjdXJyZW50bHkgb25seSBiZSB1c2VkIGJ5IElyVFRZLiAgVG8gYWN0aXZhdGUgc3VwcG9ydCBmb3IgUGFyYWxsYXgKKwkgIGRvbmdsZXMgeW91IHdpbGwgaGF2ZSB0byBzdGFydCBpcmF0dGFjaCBsaWtlIHRoaXM6CisJICAiaXJhdHRhY2ggLWQgbGl0ZWxpbmsiLgorCitjb25maWcgTUE2MDBfRE9OR0xFCisJdHJpc3RhdGUgIk1vYmlsZSBBY3Rpb24gTUE2MDAgZG9uZ2xlIgorCWRlcGVuZHMgb24gRE9OR0xFICYmIElSREEgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgTW9iaWxlIEFjdGlvbiBNQTYwMAorCSAgZG9uZ2xlLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlIE1BNjAwIGRvbmdsZQorCSAgYXR0YWNoZXMgdG8gdGhlIG5vcm1hbCA5LXBpbiBzZXJpYWwgcG9ydCBjb25uZWN0b3IsIGFuZCBjYW4KKwkgIGN1cnJlbnRseSBvbmx5IGJlIHVzZWQgYnkgSXJUVFkuICBUaGUgZHJpdmVyIHNob3VsZCBhbHNvIHN1cHBvcnQKKwkgIHRoZSBNQTYyMCBVU0IgdmVyc2lvbiBvZiB0aGUgZG9uZ2xlLCBpZiB0aGUgaW50ZWdyYXRlZCBVU0ItdG8tUlMyMzIKKwkgIGNvbnZlcnRlciBpcyBzdXBwb3J0ZWQgYnkgdXNic2VyaWFsLiBUbyBhY3RpdmF0ZSBzdXBwb3J0IGZvcgorCSAgTUE2MDAgZG9uZ2xlIHlvdSB3aWxsIGhhdmUgdG8gc3RhcnQgaXJhdHRhY2ggbGlrZSB0aGlzOgorCSAgImlyYXR0YWNoIC1kIG1hNjAwIi4KKworY29uZmlnIEdJUkJJTF9ET05HTEUKKwl0cmlzdGF0ZSAiR3JlZW53aWNoIEdJckJJTCBkb25nbGUiCisJZGVwZW5kcyBvbiBET05HTEUgJiYgSVJEQSAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBHcmVlbndpY2ggR0lyQklMCisJICBkb25nbGUuICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLgorCSAgVGhlIEdyZWVud2ljaCBkb25nbGUgYXR0YWNoZXMgdG8gdGhlIG5vcm1hbCA5LXBpbiBzZXJpYWwgcG9ydAorCSAgY29ubmVjdG9yLCBhbmQgY2FuIGN1cnJlbnRseSBvbmx5IGJlIHVzZWQgYnkgSXJUVFkuICBUbyBhY3RpdmF0ZQorCSAgc3VwcG9ydCBmb3IgR3JlZW53aWNoIGRvbmdsZXMgeW91IHdpbGwgaGF2ZSB0byBzdGFydCBpcmF0dGFjaAorCSAgbGlrZSB0aGlzOiAiaXJhdHRhY2ggLWQgZ2lyYmlsIi4KKworY29uZmlnIE1DUDIxMjBfRE9OR0xFCisJdHJpc3RhdGUgIk1pY3JvY2hpcCBNQ1AyMTIwIgorCWRlcGVuZHMgb24gRE9OR0xFICYmIElSREEgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgTWljcm9jaGlwIE1DUDIxMjAKKwkgIGRvbmdsZS4gIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuCisJICBUaGUgTUNQMjEyMCBkb25nbGUgYXR0YWNoZXMgdG8gdGhlIG5vcm1hbCA5LXBpbiBzZXJpYWwgcG9ydAorCSAgY29ubmVjdG9yLCBhbmQgY2FuIGN1cnJlbnRseSBvbmx5IGJlIHVzZWQgYnkgSXJUVFkuICBUbyBhY3RpdmF0ZQorCSAgc3VwcG9ydCBmb3IgTUNQMjEyMCBkb25nbGVzIHlvdSB3aWxsIGhhdmUgdG8gc3RhcnQgaXJhdHRhY2gKKwkgIGxpa2UgdGhpczogImlyYXR0YWNoIC1kIG1jcDIxMjAiLgorCisJICBZb3UgbXVzdCBidWlsZCB0aGlzIGRvbmdsZSB5b3Vyc2VsZi4gIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZToKKwkgIDxodHRwOi8vd3d3LmV5ZXRhcC5vcmcvfnRhbmdmL2lyZGFfc2lyX2xpbnV4Lmh0bWw+CisKK2NvbmZpZyBPTERfQkVMS0lOX0RPTkdMRQorCXRyaXN0YXRlICJPbGQgQmVsa2luIGRvbmdsZSIKKwlkZXBlbmRzIG9uIERPTkdMRSAmJiBJUkRBICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIEFkYXB0ZWMgQWlycG9ydCAxMDAwCisJICBhbmQgMjAwMCBkb25nbGVzLiAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlCisJICBNIGhlcmUuIFNvbWUgaW5mb3JtYXRpb24gaXMgY29udGFpbmVkIGluIHRoZSBjb21tZW50cworCSAgYXQgdGhlIHRvcCBvZiA8ZmlsZTpkcml2ZXJzL25ldC9pcmRhL29sZF9iZWxraW4uYz4uCisKK2NvbmZpZyBBQ1QyMDBMX0RPTkdMRQorCXRyaXN0YXRlICJBQ1RpU1lTIElSLTIwMEwgZG9uZ2xlIgorCWRlcGVuZHMgb24gRE9OR0xFICYmIElSREEgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgQUNUaVNZUyBJUi0yMDBMCisJICBkb25nbGUuIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuCisJICBUaGUgQUNUaVNZUyBJUi0yMDBMIGRvbmdsZSBhdHRhY2hlcyB0byB0aGUgbm9ybWFsIDktcGluIHNlcmlhbAorCSAgcG9ydCBjb25uZWN0b3IsIGFuZCBjYW4gY3VycmVudGx5IG9ubHkgYmUgdXNlZCBieSBJclRUWS4KKwkgIFRvIGFjdGl2YXRlIHN1cHBvcnQgZm9yIEFDVGlTWVMgSVItMjAwTCBkb25nbGUgeW91IHdpbGwgaGF2ZSB0bworCSAgc3RhcnQgaXJhdHRhY2ggbGlrZSB0aGlzOiAiaXJhdHRhY2ggLWQgYWN0MjAwbCIuCisKK2NvbW1lbnQgIk9sZCBTSVIgZGV2aWNlIGRyaXZlcnMiCisKK2NvbmZpZyBJUlBPUlRfU0lSCisJdHJpc3RhdGUgIklyUE9SVCAoSXJEQSBzZXJpYWwgZHJpdmVyKSIKKwlkZXBlbmRzIG9uIElSREEgJiYgQlJPS0VOX09OX1NNUAorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIElyUE9SVCBJckRBIGRldmljZQorCSAgZHJpdmVyLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgaXJwb3J0LiBJclBPUlQgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBJclRUWSBhbmQgc29tZXRpbWVzCisJICB0aGlzIGNhbiBiZSBiZXR0ZXIuICBPbmUgZXhhbXBsZSBpcyBpZiB5b3VyIElyREEgcG9ydCBkb2VzIG5vdAorCSAgaGF2ZSBlY2hvLWNhbmNlbGluZywgd2hpY2ggd2lsbCB3b3JrIE9LIHdpdGggSXJQT1JUIHNpbmNlIHRoaXMKKwkgIGRyaXZlciBpcyB3b3JraW5nIGluIGhhbGYtZHVwbGV4IG1vZGUgb25seS4gIFlvdSBkb24ndCBuZWVkIHRvIHVzZQorCSAgaXJhdHRhY2ggd2l0aCBJclBPUlQsIGJ1dCB5b3UganVzdCBpbnNlcnQgaXQgdGhlIHNhbWUgd2F5IGFzIEZJUgorCSAgZHJpdmVycyAoaW5zbW9kIGlycG9ydCBpbz0weDNlOCBpcnE9MTEpLiAgTm90aWNlIHRoYXQgSXJQT1JUIGlzIGEKKwkgIFNJUiBkZXZpY2UgZHJpdmVyIHdoaWNoIG1lYW5zIHRoYXQgc3BlZWQgaXMgbGltaXRlZCB0byAxMTUyMDAgYnBzLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb21tZW50ICJPbGQgU2VyaWFsIGRvbmdsZSBzdXBwb3J0IgorCitjb25maWcgRE9OR0xFX09MRAorCWJvb2wgIk9sZCBTZXJpYWwgZG9uZ2xlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiAoSVJUVFlfT0xEIHx8IElSUE9SVF9TSVIpICYmIEJST0tFTl9PTl9TTVAKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIGluZnJhcmVkIGRldmljZSB0aGF0IGNvbm5lY3RzIHRvIHlvdXIKKwkgIGNvbXB1dGVyJ3Mgc2VyaWFsIHBvcnQuIFRoZXNlIGRldmljZXMgYXJlIGNhbGxlZCBkb25nbGVzLiBUaGVuIHNheSBZCisJICBvciBNIHRvIHRoZSBkcml2ZXIgZm9yIHlvdXIgcGFydGljdWxhciBkb25nbGUgYmVsb3cuCisKKwkgIE5vdGUgdGhhdCB0aGUgYW5zd2VyIHRvIHRoaXMgcXVlc3Rpb24gd29uJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQorCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAorCSAgdGhlIHF1ZXN0aW9ucyBhYm91dCBzZXJpYWwgZG9uZ2xlcy4KKworY29uZmlnIEVTSV9ET05HTEVfT0xECisJdHJpc3RhdGUgIkVTSSBKZXRFeWUgUEMgZG9uZ2xlIgorCWRlcGVuZHMgb24gRE9OR0xFX09MRCAmJiBJUkRBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgRXh0ZW5kZWQgU3lzdGVtcworCSAgSmV0RXllIFBDIGRvbmdsZS4gIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBUaGUgRVNJCisJICBkb25nbGUgYXR0YWNoZXMgdG8gdGhlIG5vcm1hbCA5LXBpbiBzZXJpYWwgcG9ydCBjb25uZWN0b3IsIGFuZCBjYW4KKwkgIGN1cnJlbnRseSBvbmx5IGJlIHVzZWQgYnkgSXJUVFkuICBUbyBhY3RpdmF0ZSBzdXBwb3J0IGZvciBFU0kKKwkgIGRvbmdsZXMgeW91IHdpbGwgaGF2ZSB0byBzdGFydCBpcmF0dGFjaCBsaWtlIHRoaXM6CisJICAiaXJhdHRhY2ggLWQgZXNpIi4KKworY29uZmlnIEFDVElTWVNfRE9OR0xFX09MRAorCXRyaXN0YXRlICJBQ1RpU1lTIElSLTIyMEwgYW5kIElSMjIwTCsgZG9uZ2xlIgorCWRlcGVuZHMgb24gRE9OR0xFX09MRCAmJiBJUkRBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgQUNUaVNZUyBJUi0yMjBMIGFuZAorCSAgSVIyMjBMKyBkb25nbGVzLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIFRoZQorCSAgQUNUaVNZUyBkb25nbGVzIGF0dGFjaGVzIHRvIHRoZSBub3JtYWwgOS1waW4gc2VyaWFsIHBvcnQgY29ubmVjdG9yLAorCSAgYW5kIGNhbiBjdXJyZW50bHkgb25seSBiZSB1c2VkIGJ5IElyVFRZLiAgVG8gYWN0aXZhdGUgc3VwcG9ydCBmb3IKKwkgIEFDVGlTWVMgZG9uZ2xlcyB5b3Ugd2lsbCBoYXZlIHRvIHN0YXJ0IGlyYXR0YWNoIGxpa2UgdGhpczoKKwkgICJpcmF0dGFjaCAtZCBhY3Rpc3lzIiBvciAiaXJhdHRhY2ggLWQgYWN0aXN5cysiLgorCitjb25maWcgVEVLUkFNX0RPTkdMRV9PTEQKKwl0cmlzdGF0ZSAiVGVrcmFtIElyTWF0ZSAyMTBCIGRvbmdsZSIKKwlkZXBlbmRzIG9uIERPTkdMRV9PTEQgJiYgSVJEQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIFRla3JhbSBJck1hdGUgMjEwQgorCSAgZG9uZ2xlLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIFRoZSBUZWtyYW0gZG9uZ2xlCisJICBhdHRhY2hlcyB0byB0aGUgbm9ybWFsIDktcGluIHNlcmlhbCBwb3J0IGNvbm5lY3RvciwgYW5kIGNhbgorCSAgY3VycmVudGx5IG9ubHkgYmUgdXNlZCBieSBJclRUWS4gIFRvIGFjdGl2YXRlIHN1cHBvcnQgZm9yIFRla3JhbQorCSAgZG9uZ2xlcyB5b3Ugd2lsbCBoYXZlIHRvIHN0YXJ0IGlyYXR0YWNoIGxpa2UgdGhpczoKKwkgICJpcmF0dGFjaCAtZCB0ZWtyYW0iLgorCitjb25maWcgR0lSQklMX0RPTkdMRV9PTEQKKwl0cmlzdGF0ZSAiR3JlZW53aWNoIEdJckJJTCBkb25nbGUiCisJZGVwZW5kcyBvbiBET05HTEVfT0xEICYmIElSREEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBHcmVlbndpY2ggR0lyQklMCisJICBkb25nbGUuICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgVGhlIEdyZWVud2ljaAorCSAgZG9uZ2xlIGF0dGFjaGVzIHRvIHRoZSBub3JtYWwgOS1waW4gc2VyaWFsIHBvcnQgY29ubmVjdG9yLCBhbmQgY2FuCisJICBjdXJyZW50bHkgb25seSBiZSB1c2VkIGJ5IElyVFRZLiAgVG8gYWN0aXZhdGUgc3VwcG9ydCBmb3IgR3JlZW53aWNoCisJICBkb25nbGVzIHlvdSB3aWxsIGhhdmUgdG8gaW5zZXJ0ICJpcmF0dGFjaCAtZCBnaXJiaWwiIGluIHRoZQorCSAgL2V0Yy9pcmRhL2RyaXZlcnMgc2NyaXB0LgorCitjb25maWcgTElURUxJTktfRE9OR0xFX09MRAorCXRyaXN0YXRlICJQYXJhbGxheCBMaXRlTGluayBkb25nbGUiCisJZGVwZW5kcyBvbiBET05HTEVfT0xEICYmIElSREEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBQYXJhbGxheCBMaXRlbGluaworCSAgZG9uZ2xlLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIFRoZSBQYXJhbGxheAorCSAgZG9uZ2xlIGF0dGFjaGVzIHRvIHRoZSBub3JtYWwgOS1waW4gc2VyaWFsIHBvcnQgY29ubmVjdG9yLCBhbmQgY2FuCisJICBjdXJyZW50bHkgb25seSBiZSB1c2VkIGJ5IElyVFRZLiAgVG8gYWN0aXZhdGUgc3VwcG9ydCBmb3IgUGFyYWxsYXgKKwkgIGRvbmdsZXMgeW91IHdpbGwgaGF2ZSB0byBzdGFydCBpcmF0dGFjaCBsaWtlIHRoaXM6CisJICAiaXJhdHRhY2ggLWQgbGl0ZWxpbmsiLgorCitjb25maWcgTUNQMjEyMF9ET05HTEVfT0xECisJdHJpc3RhdGUgIk1pY3JvY2hpcCBNQ1AyMTIwIgorCWRlcGVuZHMgb24gRE9OR0xFX09MRCAmJiBJUkRBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgTWljcm9jaGlwIE1DUDIxMjAKKwkgIGRvbmdsZS4gIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBUaGUgTUNQMjEyMCBkb25nbGUKKwkgIGF0dGFjaGVzIHRvIHRoZSBub3JtYWwgOS1waW4gc2VyaWFsIHBvcnQgY29ubmVjdG9yLCBhbmQgY2FuCisJICBjdXJyZW50bHkgb25seSBiZSB1c2VkIGJ5IElyVFRZLiAgVG8gYWN0aXZhdGUgc3VwcG9ydCBmb3IgTUNQMjEyMAorCSAgZG9uZ2xlcyB5b3Ugd2lsbCBoYXZlIHRvIGluc2VydCAiaXJhdHRhY2ggLWQgbWNwMjEyMCIgaW4gdGhlCisJICAvZXRjL2lyZGEvZHJpdmVycyBzY3JpcHQuCisKKwkgIFlvdSBtdXN0IGJ1aWxkIHRoaXMgZG9uZ2xlIHlvdXJzZWxmLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlOgorCSAgPGh0dHA6Ly93d3cuZXlldGFwLm9yZy9+dGFuZ2YvaXJkYV9zaXJfbGludXguaHRtbD4KKworY29uZmlnIE9MRF9CRUxLSU5fRE9OR0xFX09MRAorCXRyaXN0YXRlICJPbGQgQmVsa2luIGRvbmdsZSIKKwlkZXBlbmRzIG9uIERPTkdMRV9PTEQgJiYgSVJEQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIEFkYXB0ZWMgQWlycG9ydCAxMDAwCisJICBhbmQgMjAwMCBkb25nbGVzLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgb2xkX2JlbGtpbi4gIFNvbWUgaW5mb3JtYXRpb24gaXMgY29udGFpbmVkIGluIHRoZQorCSAgY29tbWVudHMgYXQgdGhlIHRvcCBvZiA8ZmlsZTpkcml2ZXJzL25ldC9pcmRhL29sZF9iZWxraW4uYz4uCisKK2NvbmZpZyBBQ1QyMDBMX0RPTkdMRV9PTEQKKwl0cmlzdGF0ZSAiQUNUaVNZUyBJUi0yMDBMIGRvbmdsZSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIERPTkdMRV9PTEQgJiYgRVhQRVJJTUVOVEFMICYmIElSREEKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBBQ1RpU1lTIElSLTIwMEwKKwkgIGRvbmdsZS4gIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBUaGUgQUNUaVNZUworCSAgSVItMjAwTCBkb25nbGUgYXR0YWNoZXMgdG8gdGhlIG5vcm1hbCA5LXBpbiBzZXJpYWwgcG9ydCBjb25uZWN0b3IsCisJICBhbmQgY2FuIGN1cnJlbnRseSBvbmx5IGJlIHVzZWQgYnkgSXJUVFkuIFRvIGFjdGl2YXRlIHN1cHBvcnQgZm9yCisJICBBQ1RpU1lTIElSLTIwMEwgZG9uZ2xlcyB5b3Ugd2lsbCBoYXZlIHRvIHN0YXJ0IGlyYXR0YWNoIGxpa2UgdGhpczoKKwkgICJpcmF0dGFjaCAtZCBhY3QyMDBsIi4KKworY29uZmlnIE1BNjAwX0RPTkdMRV9PTEQKKwl0cmlzdGF0ZSAiTW9iaWxlIEFjdGlvbiBNQTYwMCBkb25nbGUgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBET05HTEVfT0xEICYmIEVYUEVSSU1FTlRBTCAmJiBJUkRBCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgTW9iaWxlIEFjdGlvbiBNQTYwMAorCSAgZG9uZ2xlLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlIE1BNjAwIGRvbmdsZQorCSAgYXR0YWNoZXMgdG8gdGhlIG5vcm1hbCA5LXBpbiBzZXJpYWwgcG9ydCBjb25uZWN0b3IsIGFuZCBjYW4KKwkgIGN1cnJlbnRseSBvbmx5IGJlIHRlc3RlZCBvbiBJckNPTU0uICBUbyBhY3RpdmF0ZSBzdXBwb3J0IGZvciBNQTYwMAorCSAgZG9uZ2xlcyB5b3Ugd2lsbCBoYXZlIHRvIGluc2VydCAiaXJhdHRhY2ggLWQgbWE2MDAiIGluIHRoZQorCSAgL2V0Yy9pcmRhL2RyaXZlcnMgc2NyaXB0LiAgTm90ZTogaXJ1dGlscyAwLjkuMTUgcmVxdWlyZXMgbm8KKwkgIG1vZGlmaWNhdGlvbi4gaXJ1dGlscyAwLjkuOSBuZWVkcyBtb2RpZmljYXRpb24uIEZvciBtb3JlCisJICBpbmZvcm1hdGlvbiwgZG93bmxvYWQgdGhlIGZvbGxvd2luZyB0YXIgZ3ppcCBmaWxlLgorCisJICBUaGVyZSBpcyBhIHByZS1jb21waWxlZCBtb2R1bGUgb24KKwkgIDxodHRwOi8vZW5nc3ZyLnVzdC5oay9+ZWV0d2w5NS9tYTYwMC5odG1sPgorCitjb25maWcgRVA3MjExX0lSCisJdHJpc3RhdGUgIkVQNzIxMSBJL1Igc3VwcG9ydCIKKwlkZXBlbmRzIG9uIERPTkdMRV9PTEQgJiYgQVJDSF9FUDcyMTEgJiYgSVJEQQorCitjb21tZW50ICJGSVIgZGV2aWNlIGRyaXZlcnMiCisKK2NvbmZpZyBVU0JfSVJEQQorCXRyaXN0YXRlICJJckRBIFVTQiBkb25nbGVzIgorCWRlcGVuZHMgb24gSVJEQSAmJiBVU0IKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBVU0IgSXJEQSBGSVIgRG9uZ2xlCisJICBkZXZpY2UgZHJpdmVyLiAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaXJkYS11c2IuICBJckRBLVVTQiBzdXBwb3J0IHRoZSB2YXJpb3VzIElyREEgVVNCCisJICBkb25nbGVzIGF2YWlsYWJsZSBhbmQgbW9zdCBvZiB0aGVpciBwZWN1bGFyaXRpZXMuICBUaG9zZSBkb25nbGVzCisJICBwbHVnIGluIHRoZSBVU0IgcG9ydCBvZiB5b3VyIGNvbXB1dGVyLCBhcmUgcGx1ZyBhbmQgcGxheSwgYW5kCisJICBzdXBwb3J0IFNJUiBhbmQgRklSICg0TWJwcykgc3BlZWRzLiAgT24gdGhlIG90aGVyIGhhbmQsIHRob3NlCisJICBkb25nbGVzIHRlbmQgdG8gYmUgbGVzcyBlZmZpY2llbnQgdGhhbiBhIEZJUiBjaGlwc2V0LgorCisJICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBkcml2ZXIgaXMgc3RpbGwgZXhwZXJpbWVudGFsLiAgQW5kIG9mIGNvdXJzZSwKKwkgIHlvdSB3aWxsIG5lZWQgYm90aCBVU0IgYW5kIElyREEgc3VwcG9ydCBpbiB5b3VyIGtlcm5lbC4uLgorCitjb25maWcgU0lHTUFURUxfRklSCisJdHJpc3RhdGUgIlNpZ21hVGVsIFNUSXI0MjAwIGJyaWRnZSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIElSREEgJiYgVVNCICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIFNpZ21hVGVsIFNUSXI0MjAwCisJICBVU0IgSXJEQSBGSVIgYnJpZGdlIGRldmljZSBkcml2ZXIuICAKKworCSAgVVNCIGJyaWRnZSBiYXNlZCBvbiB0aGUgU2lnbWFUZWwgU1RJcjQyMDAgZG9uJ3QgY29uZm9ybSB0byB0aGUKKwkgIElyREEtVVNCIGRldmljZSBjbGFzcyBzcGVjaWZpY2F0aW9uLCBhbmQgdGhlcmVmb3JlIG5lZWQgdGhlaXIKKwkgIG93biBzcGVjaWZpYyBkcml2ZXIuIFRob3NlIGRvbmdsZXMgc3VwcG9ydCBTSVIgYW5kIEZJUiAoNE1icHMpCisJICBzcGVlZHMuIAorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCisJICBzdGlyNDIwMC4KKworY29uZmlnIE5TQ19GSVIKKwl0cmlzdGF0ZSAiTlNDIFBDODcxMDgvUEM4NzMzOCIKKwlkZXBlbmRzIG9uIElSREEgJiYgSVNBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgTlNDIFBDODcxMDggYW5kCisJICBQQzg3MzM4IElyREEgY2hpcHNldHMuICBUaGlzIGRyaXZlciBzdXBwb3J0cyBTSVIsCisJICBNSVIgYW5kIEZJUiAoNE1icHMpIHNwZWVkcy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgbnNjLWlyY2MuCisKK2NvbmZpZyBXSU5CT05EX0ZJUgorCXRyaXN0YXRlICJXaW5ib25kIFc4Mzk3N0FGIChJUikiCisJZGVwZW5kcyBvbiBJUkRBICYmIElTQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgSXJEQSBzdXBwb3J0IGZvciB0aGUgV2luYm9uZAorCSAgVzgzOTc3QUYgc3VwZXItaW8gY2hpcHNldC4gIFRoaXMgZHJpdmVyIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgSXJEQQorCSAgY2hpcHNldCBpbiB0aGUgQ29yZWwgTmV0V2luZGVyLiAgVGhlIGRyaXZlciBzdXBwb3J0cyBTSVIsIE1JUiBhbmQKKwkgIEZJUiAoNE1icHMpIHNwZWVkcy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgdzgzOTc3YWZfaXIuCisKK2NvbmZpZyBUT1NISUJBX0ZJUgorCXRyaXN0YXRlICJUb3NoaWJhIFR5cGUtTyBJUiBQb3J0IgorCWRlcGVuZHMgb24gSVJEQSAmJiBQQ0kgJiYgITY0QklUCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgVG9zaGliYSBUeXBlLU8gSVIKKwkgIGFuZCBEb25hdSBvYm9lIGNoaXBzZXRzLiBUaGVzZSBjaGlwc2V0cyBhcmUgdXNlZCBieSB0aGUgVG9zaGliYQorCSAgTGlicmV0dG8gMTAwLzExMENULCBUZWNyYSA4MTAwLCBQb3J0ZWdlIDcwMjAgYW5kIG1hbnkgbW9yZSBsYXB0b3BzLgorCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgZG9uYXVib2UuCisKK2NvbmZpZyBBVTEwMDBfRklSCisJdHJpc3RhdGUgIkFsY2hlbXkgQXUxMDAwIFNJUi9GSVIiCisJZGVwZW5kcyBvbiBNSVBTX0FVMTAwMCAmJiBJUkRBCisKK2NvbmZpZyBTTUNfSVJDQ19GSVIKKwl0cmlzdGF0ZSAiU01TQyBJckNDIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIElSREEgJiYgSVNBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgU01DIEluZnJhcmVkCisJICBDb21tdW5pY2F0aW9ucyBDb250cm9sbGVyLiAgSXQgaXMgdXNlZCBpbiBhIHdpZGUgdmFyaWV0eSBvZgorCSAgbGFwdG9wcyAoRnVqaXRzdSwgU29ueSwgQ29tcGFxIGFuZCBzb21lIFRvc2hpYmEpLgorCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgc21zYy1pcmNjMi5vLgorCitjb25maWcgQUxJX0ZJUgorCXRyaXN0YXRlICJBTGkgTTUxMjMgRklSIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIElSREEgJiYgSVNBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgQUxpIE01MTIzIEZJUgorCSAgQ29udHJvbGxlci4gIFRoZSBBTGkgTTUxMjMgRklSIENvbnRyb2xsZXIgaXMgZW1iZWRkZWQgaW4gQUxpIE0xNTQzQywKKwkgIE0xNTM1LCBNMTUzNUQsIE0xNTM1KywgTTE1MzVEIFNvdXJ0aCBCcmlkZ2UuICBUaGlzIGRyaXZlciBzdXBwb3J0cworCSAgU0lSLCBNSVIgYW5kIEZJUiAoNE1icHMpIHNwZWVkcy4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgYWxpLWlyY2MuCisKK2NvbmZpZyBWTFNJX0ZJUgorCXRyaXN0YXRlICJWTFNJIDgyQzE0NyBTSVIvTUlSL0ZJUiAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBJUkRBICYmIFBDSQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIFZMU0kgODJDMTQ3CisJICBQQ0ktSXJEQSBDb250cm9sbGVyLiBUaGlzIGNvbnRyb2xsZXIgaXMgdXNlZCBieSB0aGUgSFAgT21uaUJvb2sgODAwCisJICBhbmQgNTUwMCBub3RlYm9va3MuIFRoZSBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgU0lSLCBNSVIgYW5kCisJICBGSVIgKDRNYnBzKSBzcGVlZHMuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKKwkgIHZsc2lfaXIuCisKK2NvbmZpZyBTQTExMDBfRklSCisJdHJpc3RhdGUgIlNBMTEwMCBJbnRlcm5hbCBJUiIKKwlkZXBlbmRzIG9uIEFSQ0hfU0ExMTAwICYmIElSREEKKworY29uZmlnIFZJQV9GSVIKKwl0cmlzdGF0ZSAiVklBIFZUODIzMS9WVDEyMTEgU0lSL01JUi9GSVIiCisJZGVwZW5kcyBvbiBJUkRBICYmIElTQSAmJiBQQ0kKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBWSUEgVlQ4MjMxCisJICBhbmQgVklBIFZUMTIxMSBJckRBIGNvbnRyb2xsZXJzLCBmb3VuZCBvbiB0aGUgbW90aGVyYm9hcmRzIHVzaW5nCisJICB0aG9zZSB0aG9zZSBWSUEgY2hpcHNldHMuIFRvIHVzZSB0aGlzIGNvbnRyb2xsZXIsIHlvdSB3aWxsIG5lZWQKKwkgIHRvIHBsdWcgYSBzcGVjaWZpYyA1IHBpbnMgRklSIElyREEgZG9uZ2xlIGluIHRoZSBzcGVjaWZpYworCSAgbW90aGVyYm9hcmQgY29ubmVjdG9yLiBUaGUgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIFNJUiwgTUlSCisJICBhbmQgRklSICg0TWJwcykgc3BlZWRzLgorCisJICBZb3Ugd2lsbCBuZWVkIHRvIHNwZWNpZnkgdGhlICdkb25nbGVfaWQnIG1vZHVsZSBwYXJhbWV0ZXIgdG8KKwkgIGluZGljYXRlIHRoZSBGSVIgZG9uZ2xlIGF0dGFjaGVkIHRvIHRoZSBjb250cm9sbGVyLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCisJICB2aWEtaXJjYy4KKworZW5kbWVudQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvaXJkYS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWE4YmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9NYWtlZmlsZQpAQCAtMCwwICsxLDQ3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggSXJEQSBpbmZyYXJlZCBwb3J0IGRldmljZSBkcml2ZXJzLgorIworIyA5IEF1ZyAyMDAwLCBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGluZnJhZGVhZC5vcmc+CisjIFJld3JpdHRlbiB0byB1c2UgbGlzdHMgaW5zdGVhZCBvZiBpZi1zdGF0ZW1lbnRzLgorIworCisjIE9sZCBTSVIgZHJpdmVycyAKK29iai0kKENPTkZJR19JUlBPUlRfU0lSKQkrPSAJCWlycG9ydC5vCisjIEZJUiBkcml2ZXJzCitvYmotJChDT05GSUdfVVNCX0lSREEpCQkrPSBpcmRhLXVzYi5vCitvYmotJChDT05GSUdfU0lHTUFURUxfRklSKQkrPSBzdGlyNDIwMC5vCitvYmotJChDT05GSUdfTlNDX0ZJUikJCSs9IG5zYy1pcmNjLm8KK29iai0kKENPTkZJR19XSU5CT05EX0ZJUikJKz0gdzgzOTc3YWZfaXIubworb2JqLSQoQ09ORklHX1NBMTEwMF9GSVIpCSs9IHNhMTEwMF9pci5vCitvYmotJChDT05GSUdfVE9TSElCQV9GSVIpCSs9IGRvbmF1Ym9lLm8KK29iai0kKENPTkZJR19TTUNfSVJDQ19GSVIpCSs9IHNtc2MtaXJjYzIubworb2JqLSQoQ09ORklHX0FMSV9GSVIpCQkrPSBhbGktaXJjYy5vCitvYmotJChDT05GSUdfVkxTSV9GSVIpCQkrPSB2bHNpX2lyLm8KK29iai0kKENPTkZJR19WSUFfRklSKQkJKz0gdmlhLWlyY2MubworIyBPbGQgZG9uZ2xlIGRyaXZlcnMgZm9yIG9sZCBTSVIgZHJpdmVycworb2JqLSQoQ09ORklHX0VTSV9ET05HTEVfT0xEKQkJKz0gZXNpLm8KK29iai0kKENPTkZJR19URUtSQU1fRE9OR0xFX09MRCkJKz0gdGVrcmFtLm8KK29iai0kKENPTkZJR19BQ1RJU1lTX0RPTkdMRV9PTEQpCSs9IGFjdGlzeXMubworb2JqLSQoQ09ORklHX0dJUkJJTF9ET05HTEVfT0xEKQkrPSBnaXJiaWwubworb2JqLSQoQ09ORklHX0xJVEVMSU5LX0RPTkdMRV9PTEQpCSs9IGxpdGVsaW5rLm8KK29iai0kKENPTkZJR19PTERfQkVMS0lOX0RPTkdMRV9PTEQpCSs9IG9sZF9iZWxraW4ubworb2JqLSQoQ09ORklHX01DUDIxMjBfRE9OR0xFX09MRCkJKz0gbWNwMjEyMC5vCitvYmotJChDT05GSUdfQUNUMjAwTF9ET05HTEVfT0xEKQkrPSBhY3QyMDBsLm8KK29iai0kKENPTkZJR19NQTYwMF9ET05HTEVfT0xEKQkrPSBtYTYwMC5vCitvYmotJChDT05GSUdfRVA3MjExX0lSKQkJKz0gZXA3MjExX2lyLm8KK29iai0kKENPTkZJR19BVTEwMDBfRklSKQkrPSBhdTFrX2lyLm8KKyMgTmV3IFNJUiBkcml2ZXJzCitvYmotJChDT05GSUdfSVJUVFlfU0lSKQkJKz0gaXJ0dHktc2lyLm8Jc2lyLWRldi5vCisjIE5ldyBkb25nbGVzIGRyaXZlcnMgZm9yIG5ldyBTSVIgZHJpdmVycworb2JqLSQoQ09ORklHX0VTSV9ET05HTEUpCSs9IGVzaS1zaXIubworb2JqLSQoQ09ORklHX1RFS1JBTV9ET05HTEUpCSs9IHRla3JhbS1zaXIubworb2JqLSQoQ09ORklHX0FDVElTWVNfRE9OR0xFKQkrPSBhY3Rpc3lzLXNpci5vCitvYmotJChDT05GSUdfTElURUxJTktfRE9OR0xFKQkrPSBsaXRlbGluay1zaXIubworb2JqLSQoQ09ORklHX0dJUkJJTF9ET05HTEUpCSs9IGdpcmJpbC1zaXIubworb2JqLSQoQ09ORklHX09MRF9CRUxLSU5fRE9OR0xFKQkrPSBvbGRfYmVsa2luLXNpci5vCitvYmotJChDT05GSUdfTUNQMjEyMF9ET05HTEUpCSs9IG1jcDIxMjAtc2lyLm8KK29iai0kKENPTkZJR19BQ1QyMDBMX0RPTkdMRSkJKz0gYWN0MjAwbC1zaXIubworb2JqLSQoQ09ORklHX01BNjAwX0RPTkdMRSkJKz0gbWE2MDAtc2lyLm8KKworIyBUaGUgU0lSIGhlbHBlciBtb2R1bGUKK3Npci1kZXYtb2JqcyA6PSBzaXJfY29yZS5vIHNpcl9kZXYubyBzaXJfZG9uZ2xlLm8gc2lyX2t0aHJlYWQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9hY3QyMDBsLXNpci5jIGIvZHJpdmVycy9uZXQvaXJkYS9hY3QyMDBsLXNpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Yjg5YzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2FjdDIwMGwtc2lyLmMKQEAgLTAsMCArMSwyNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGaWxlbmFtZTogICAgICBhY3QyMDBsLmMKKyAqIFZlcnNpb246ICAgICAgIDAuOAorICogRGVzY3JpcHRpb246ICAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBBQ1RpU1lTIEFDVC1JUjIwMEwgZG9uZ2xlCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBTSElNSVpVIFRha3V5YSA8dHNoaW1penVAZ2EyLnNvLW5ldC5uZS5qcD4KKyAqIENyZWF0ZWQgYXQ6ICAgIEZyaSBBdWcgIDMgMTc6MzU6NDIgMjAwMQorICogTW9kaWZpZWQgYXQ6ICAgRnJpIEF1ZyAxNyAxMDoyMjo0MCAyMDAxCisgKiBNb2RpZmllZCBieTogICBTSElNSVpVIFRha3V5YSA8dHNoaW1penVAZ2EyLnNvLW5ldC5uZS5qcD4KKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAxIFNISU1JWlUgVGFrdXlhLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorCisjaW5jbHVkZSAic2lyLWRldi5oIgorCitzdGF0aWMgaW50IGFjdDIwMGxfcmVzZXQoc3RydWN0IHNpcl9kZXYgKmRldik7CitzdGF0aWMgaW50IGFjdDIwMGxfb3BlbihzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKK3N0YXRpYyBpbnQgYWN0MjAwbF9jbG9zZShzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKK3N0YXRpYyBpbnQgYWN0MjAwbF9jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpOworCisvKiBSZWdzaXRlciAwOiBDb250cm9sIHJlZ2lzdGVyICMxICovCisjZGVmaW5lIEFDVDIwMExfUkVHMCAgICAweDAwCisjZGVmaW5lIEFDVDIwMExfVFhFTiAgICAweDAxIC8qIEVuYWJsZSB0cmFuc21pdHRlciAqLworI2RlZmluZSBBQ1QyMDBMX1JYRU4gICAgMHgwMiAvKiBFbmFibGUgcmVjZWl2ZXIgKi8KKworLyogUmVnaXN0ZXIgMTogQ29udHJvbCByZWdpc3RlciAjMiAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzEgICAgMHgxMAorI2RlZmluZSBBQ1QyMDBMX0xPREIgICAgMHgwMSAvKiBMb2FkIG5ldyBiYXVkIHJhdGUgY291bnQgdmFsdWUgKi8KKyNkZWZpbmUgQUNUMjAwTF9XSURFICAgIDB4MDQgLyogRXhwYW5kIHRoZSBtYXhpbXVtIGFsbG93YWJsZSBwdWxzZSAqLworCisvKiBSZWdpc3RlciA0OiBPdXRwdXQgUG93ZXIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUc0ICAgIDB4NDAKKyNkZWZpbmUgQUNUMjAwTF9PUDAgICAgIDB4MDEgLyogRW5hYmxlIExFRDFDIG91dHB1dCAqLworI2RlZmluZSBBQ1QyMDBMX09QMSAgICAgMHgwMiAvKiBFbmFibGUgTEVEMkMgb3V0cHV0ICovCisjZGVmaW5lIEFDVDIwMExfQkxLUiAgICAweDA0CisKKy8qIFJlZ2lzdGVyIDU6IFJlY2VpdmUgTW9kZSByZWdpc3RlciAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzUgICAgMHg1MAorI2RlZmluZSBBQ1QyMDBMX1JXSURMICAgMHgwMSAvKiBmaXhlZCAxLjZ1cyBwdWxzZSBtb2RlICovCisKKy8qIFJlZ2lzdGVyIDY6IFJlY2VpdmUgU2Vuc2l0aXZpdHkgcmVnaXN0ZXIgIzEgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUc2ICAgIDB4NjAKKyNkZWZpbmUgQUNUMjAwTF9SUzAgICAgIDB4MDEgLyogcmVjZWl2ZSB0aHJlc2hvbGQgYml0IDAgKi8KKyNkZWZpbmUgQUNUMjAwTF9SUzEgICAgIDB4MDIgLyogcmVjZWl2ZSB0aHJlc2hvbGQgYml0IDEgKi8KKworLyogUmVnaXN0ZXIgNzogUmVjZWl2ZSBTZW5zaXRpdml0eSByZWdpc3RlciAjMiAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzcgICAgMHg3MAorI2RlZmluZSBBQ1QyMDBMX0VOUE9TICAgMHgwNCAvKiBJZ25vcmUgdGhlIGZhbGxpbmcgZWRnZSAqLworCisvKiBSZWdpc3RlciA4LDk6IEJhdWQgUmF0ZSBEdmlkZXIgcmVnaXN0ZXIgIzEsIzIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUc4ICAgIDB4ODAKKyNkZWZpbmUgQUNUMjAwTF9SRUc5ICAgIDB4OTAKKworI2RlZmluZSBBQ1QyMDBMXzI0MDAgICAgMHg1ZgorI2RlZmluZSBBQ1QyMDBMXzk2MDAgICAgMHgxNworI2RlZmluZSBBQ1QyMDBMXzE5MjAwICAgMHgwYgorI2RlZmluZSBBQ1QyMDBMXzM4NDAwICAgMHgwNQorI2RlZmluZSBBQ1QyMDBMXzU3NjAwICAgMHgwMworI2RlZmluZSBBQ1QyMDBMXzExNTIwMCAgMHgwMQorCisvKiBSZWdpc3RlciAxMzogQ29udHJvbCByZWdpc3RlciAjMyAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzEzICAgMHhkMAorI2RlZmluZSBBQ1QyMDBMX1NIRFcgICAgMHgwMSAvKiBFbmFibGUgYWNjZXNzIHRvIHNoYWRvdyByZWdpc3RlcnMgKi8KKworLyogUmVnaXN0ZXIgMTU6IFN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzE1ICAgMHhmMAorCisvKiBSZWdpc3RlciAyMTogQ29udHJvbCByZWdpc3RlciAjNCAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzIxICAgMHg1MAorI2RlZmluZSBBQ1QyMDBMX0VYQ0sgICAgMHgwMiAvKiBEaXNhYmxlIGNsb2NrIG91dHB1dCBkcml2ZXIgKi8KKyNkZWZpbmUgQUNUMjAwTF9PU0NMICAgIDB4MDQgLyogb3NjaWxsYXRvciBpbiBsb3cgcG93ZXIsIG1lZGl1bSBhY2N1cmFjeSBtb2RlICovCisKK3N0YXRpYyBzdHJ1Y3QgZG9uZ2xlX2RyaXZlciBhY3QyMDBsID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJpdmVyX25hbWUJPSAiQUNUaVNZUyBBQ1QtSVIyMDBMIiwKKwkudHlwZQkJPSBJUkRBX0FDVDIwMExfRE9OR0xFLAorCS5vcGVuCQk9IGFjdDIwMGxfb3BlbiwKKwkuY2xvc2UJCT0gYWN0MjAwbF9jbG9zZSwKKwkucmVzZXQJCT0gYWN0MjAwbF9yZXNldCwKKwkuc2V0X3NwZWVkCT0gYWN0MjAwbF9jaGFuZ2Vfc3BlZWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhY3QyMDBsX3Npcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlyZGFfcmVnaXN0ZXJfZG9uZ2xlKCZhY3QyMDBsKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFjdDIwMGxfc2lyX2NsZWFudXAodm9pZCkKK3sKKwlpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKCZhY3QyMDBsKTsKK30KKworc3RhdGljIGludCBhY3QyMDBsX29wZW4oc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcW9zX2luZm8gKnFvcyA9ICZkZXYtPnFvczsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogUG93ZXIgb24gdGhlIGRvbmdsZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCisJLyogU2V0IHRoZSBzcGVlZHMgd2UgY2FuIGFjY2VwdCAqLworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHxJUl8xMTUyMDA7CisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDAzOworCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUocW9zKTsKKworCS8qIGlyZGEgdGhyZWFkIHdhaXRzIDUwIG1zZWMgZm9yIHBvd2VyIHNldHRsaW5nICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhY3QyMDBsX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwkvKiBQb3dlciBvZmYgdGhlIGRvbmdsZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBGQUxTRSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFjdDIwMGxfY2hhbmdlX3NwZWVkIChkZXYsIHNwZWVkKQorICoKKyAqICAgIFNldCB0aGUgc3BlZWQgZm9yIHRoZSBBQ1RpU1lTIEFDVC1JUjIwMEwgdHlwZSBkb25nbGUuCisgKgorICovCitzdGF0aWMgaW50IGFjdDIwMGxfY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICpkZXYsIHVuc2lnbmVkIHNwZWVkKQoreworCXU4IGNvbnRyb2xbM107CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCS8qIENsZWFyIERUUiBhbmQgc2V0IFJUUyB0byBlbnRlciBjb21tYW5kIG1vZGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgVFJVRSk7CisKKwlzd2l0Y2ggKHNwZWVkKSB7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSA5NjAwOgorCQljb250cm9sWzBdID0gQUNUMjAwTF9SRUc4IHwgIChBQ1QyMDBMXzk2MDAgICAgICAgJiAweDBmKTsKKwkJY29udHJvbFsxXSA9IEFDVDIwMExfUkVHOSB8ICgoQUNUMjAwTF85NjAwID4+IDQpICYgMHgwZik7CisJCWJyZWFrOworCWNhc2UgMTkyMDA6CisJCWNvbnRyb2xbMF0gPSBBQ1QyMDBMX1JFRzggfCAgKEFDVDIwMExfMTkyMDAgICAgICAgJiAweDBmKTsKKwkJY29udHJvbFsxXSA9IEFDVDIwMExfUkVHOSB8ICgoQUNUMjAwTF8xOTIwMCA+PiA0KSAmIDB4MGYpOworCQlicmVhazsKKwljYXNlIDM4NDAwOgorCQljb250cm9sWzBdID0gQUNUMjAwTF9SRUc4IHwgIChBQ1QyMDBMXzM4NDAwICAgICAgICYgMHgwZik7CisJCWNvbnRyb2xbMV0gPSBBQ1QyMDBMX1JFRzkgfCAoKEFDVDIwMExfMzg0MDAgPj4gNCkgJiAweDBmKTsKKwkJYnJlYWs7CisJY2FzZSA1NzYwMDoKKwkJY29udHJvbFswXSA9IEFDVDIwMExfUkVHOCB8ICAoQUNUMjAwTF81NzYwMCAgICAgICAmIDB4MGYpOworCQljb250cm9sWzFdID0gQUNUMjAwTF9SRUc5IHwgKChBQ1QyMDBMXzU3NjAwID4+IDQpICYgMHgwZik7CisJCWJyZWFrOworCWNhc2UgMTE1MjAwOgorCQljb250cm9sWzBdID0gQUNUMjAwTF9SRUc4IHwgIChBQ1QyMDBMXzExNTIwMCAgICAgICAmIDB4MGYpOworCQljb250cm9sWzFdID0gQUNUMjAwTF9SRUc5IHwgKChBQ1QyMDBMXzExNTIwMCA+PiA0KSAmIDB4MGYpOworCQlicmVhazsKKwl9CisJY29udHJvbFsyXSA9IEFDVDIwMExfUkVHMSB8IEFDVDIwMExfTE9EQiB8IEFDVDIwMExfV0lERTsKKworCS8qIFdyaXRlIGNvbnRyb2wgYnl0ZXMgKi8KKwlzaXJkZXZfcmF3X3dyaXRlKGRldiwgY29udHJvbCwgMyk7CisJbXNsZWVwKDUpOworCisJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCisJZGV2LT5zcGVlZCA9IHNwZWVkOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhY3QyMDBsX3Jlc2V0IChkcml2ZXIpCisgKgorICogICAgUmVzZXQgdGhlIEFDVGlTWVMgQUNULUlSMjAwTCB0eXBlIGRvbmdsZS4KKyAqLworCisjZGVmaW5lIEFDVDIwMExfU1RBVEVfV0FJVDFfUkVTRVQJKFNJUkRFVl9TVEFURV9ET05HTEVfUkVTRVQrMSkKKyNkZWZpbmUgQUNUMjAwTF9TVEFURV9XQUlUMl9SRVNFVAkoU0lSREVWX1NUQVRFX0RPTkdMRV9SRVNFVCsyKQorCitzdGF0aWMgaW50IGFjdDIwMGxfcmVzZXQoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBzdGF0ZSA9IGRldi0+ZnNtLnN1YnN0YXRlOworCXVuc2lnbmVkIGRlbGF5ID0gMDsKKwl1OCBjb250cm9sWzldID0geworCQlBQ1QyMDBMX1JFRzE1LAorCQlBQ1QyMDBMX1JFRzEzIHwgQUNUMjAwTF9TSERXLAorCQlBQ1QyMDBMX1JFRzIxIHwgQUNUMjAwTF9FWENLIHwgQUNUMjAwTF9PU0NMLAorCQlBQ1QyMDBMX1JFRzEzLAorCQlBQ1QyMDBMX1JFRzcgIHwgQUNUMjAwTF9FTlBPUywKKwkJQUNUMjAwTF9SRUc2ICB8IEFDVDIwMExfUlMwICB8IEFDVDIwMExfUlMxLAorCQlBQ1QyMDBMX1JFRzUgIHwgQUNUMjAwTF9SV0lETCwKKwkJQUNUMjAwTF9SRUc0ICB8IEFDVDIwMExfT1AwICB8IEFDVDIwMExfT1AxIHwgQUNUMjAwTF9CTEtSLAorCQlBQ1QyMDBMX1JFRzAgIHwgQUNUMjAwTF9UWEVOIHwgQUNUMjAwTF9SWEVOCisJfTsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0lSREVWX1NUQVRFX0RPTkdMRV9SRVNFVDoKKwkJLyogUmVzZXQgdGhlIGRvbmdsZSA6IHNldCBSVFMgbG93IGZvciAyNSBtcyAqLworCQlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBGQUxTRSk7CisJCXN0YXRlID0gQUNUMjAwTF9TVEFURV9XQUlUMV9SRVNFVDsKKwkJZGVsYXkgPSA1MDsKKwkJYnJlYWs7CisKKwljYXNlIEFDVDIwMExfU1RBVEVfV0FJVDFfUkVTRVQ6CisJCS8qIENsZWFyIERUUiBhbmQgc2V0IFJUUyB0byBlbnRlciBjb21tYW5kIG1vZGUgKi8KKwkJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgRkFMU0UsIFRSVUUpOworCisJCXVkZWxheSgyNSk7CQkJLyogYmV0dGVyIHdhaXQgZm9yIHNvbWUgc2hvcnQgd2hpbGUgKi8KKworCQkvKiBXcml0ZSBjb250cm9sIGJ5dGVzICovCisJCXNpcmRldl9yYXdfd3JpdGUoZGV2LCBjb250cm9sLCBzaXplb2YoY29udHJvbCkpOworCQlzdGF0ZSA9IEFDVDIwMExfU1RBVEVfV0FJVDJfUkVTRVQ7CisJCWRlbGF5ID0gMTU7CisJCWJyZWFrOworCisJY2FzZSBBQ1QyMDBMX1NUQVRFX1dBSVQyX1JFU0VUOgorCQkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlICovCisJCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCQlkZXYtPnNwZWVkID0gOTYwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9FUlJPUigiJXMoKSwgdW5rbm93biBzdGF0ZSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0ZSk7CisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJZGV2LT5mc20uc3Vic3RhdGUgPSBzdGF0ZTsKKwlyZXR1cm4gKGRlbGF5ID4gMCkgPyBkZWxheSA6IHJldDsKK30KKworTU9EVUxFX0FVVEhPUigiU0hJTUlaVSBUYWt1eWEgPHRzaGltaXp1QGdhMi5zby1uZXQubmUuanA+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFDVGlTWVMgQUNULUlSMjAwTCBkb25nbGUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTEwIik7IC8qIElSREFfQUNUMjAwTF9ET05HTEUgKi8KKworbW9kdWxlX2luaXQoYWN0MjAwbF9zaXJfaW5pdCk7Cittb2R1bGVfZXhpdChhY3QyMDBsX3Npcl9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvYWN0MjAwbC5jIGIvZHJpdmVycy9uZXQvaXJkYS9hY3QyMDBsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU2Y2Q0NGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2FjdDIwMGwuYwpAQCAtMCwwICsxLDI5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZpbGVuYW1lOiAgICAgIGFjdDIwMGwuYworICogVmVyc2lvbjogICAgICAgMC44CisgKiBEZXNjcmlwdGlvbjogICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEFDVGlTWVMgQUNULUlSMjAwTCBkb25nbGUKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIFNISU1JWlUgVGFrdXlhIDx0c2hpbWl6dUBnYTIuc28tbmV0Lm5lLmpwPgorICogQ3JlYXRlZCBhdDogICAgRnJpIEF1ZyAgMyAxNzozNTo0MiAyMDAxCisgKiBNb2RpZmllZCBhdDogICBGcmkgQXVnIDE3IDEwOjIyOjQwIDIwMDEKKyAqIE1vZGlmaWVkIGJ5OiAgIFNISU1JWlUgVGFrdXlhIDx0c2hpbWl6dUBnYTIuc28tbmV0Lm5lLmpwPgorICoKKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDEgU0hJTUlaVSBUYWt1eWEsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKworc3RhdGljIGludCAgYWN0MjAwbF9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKK3N0YXRpYyB2b2lkIGFjdDIwMGxfb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpOworc3RhdGljIHZvaWQgYWN0MjAwbF9jbG9zZShkb25nbGVfdCAqc2VsZik7CitzdGF0aWMgaW50ICBhY3QyMDBsX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKKworLyogUmVnc2l0ZXIgMDogQ29udHJvbCByZWdpc3RlciAjMSAqLworI2RlZmluZSBBQ1QyMDBMX1JFRzAgICAgMHgwMAorI2RlZmluZSBBQ1QyMDBMX1RYRU4gICAgMHgwMSAvKiBFbmFibGUgdHJhbnNtaXR0ZXIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SWEVOICAgIDB4MDIgLyogRW5hYmxlIHJlY2VpdmVyICovCisKKy8qIFJlZ2lzdGVyIDE6IENvbnRyb2wgcmVnaXN0ZXIgIzIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUcxICAgIDB4MTAKKyNkZWZpbmUgQUNUMjAwTF9MT0RCICAgIDB4MDEgLyogTG9hZCBuZXcgYmF1ZCByYXRlIGNvdW50IHZhbHVlICovCisjZGVmaW5lIEFDVDIwMExfV0lERSAgICAweDA0IC8qIEV4cGFuZCB0aGUgbWF4aW11bSBhbGxvd2FibGUgcHVsc2UgKi8KKworLyogUmVnaXN0ZXIgNDogT3V0cHV0IFBvd2VyIHJlZ2lzdGVyICovCisjZGVmaW5lIEFDVDIwMExfUkVHNCAgICAweDQwCisjZGVmaW5lIEFDVDIwMExfT1AwICAgICAweDAxIC8qIEVuYWJsZSBMRUQxQyBvdXRwdXQgKi8KKyNkZWZpbmUgQUNUMjAwTF9PUDEgICAgIDB4MDIgLyogRW5hYmxlIExFRDJDIG91dHB1dCAqLworI2RlZmluZSBBQ1QyMDBMX0JMS1IgICAgMHgwNAorCisvKiBSZWdpc3RlciA1OiBSZWNlaXZlIE1vZGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUc1ICAgIDB4NTAKKyNkZWZpbmUgQUNUMjAwTF9SV0lETCAgIDB4MDEgLyogZml4ZWQgMS42dXMgcHVsc2UgbW9kZSAqLworCisvKiBSZWdpc3RlciA2OiBSZWNlaXZlIFNlbnNpdGl2aXR5IHJlZ2lzdGVyICMxICovCisjZGVmaW5lIEFDVDIwMExfUkVHNiAgICAweDYwCisjZGVmaW5lIEFDVDIwMExfUlMwICAgICAweDAxIC8qIHJlY2VpdmUgdGhyZXNob2xkIGJpdCAwICovCisjZGVmaW5lIEFDVDIwMExfUlMxICAgICAweDAyIC8qIHJlY2VpdmUgdGhyZXNob2xkIGJpdCAxICovCisKKy8qIFJlZ2lzdGVyIDc6IFJlY2VpdmUgU2Vuc2l0aXZpdHkgcmVnaXN0ZXIgIzIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUc3ICAgIDB4NzAKKyNkZWZpbmUgQUNUMjAwTF9FTlBPUyAgIDB4MDQgLyogSWdub3JlIHRoZSBmYWxsaW5nIGVkZ2UgKi8KKworLyogUmVnaXN0ZXIgOCw5OiBCYXVkIFJhdGUgRHZpZGVyIHJlZ2lzdGVyICMxLCMyICovCisjZGVmaW5lIEFDVDIwMExfUkVHOCAgICAweDgwCisjZGVmaW5lIEFDVDIwMExfUkVHOSAgICAweDkwCisKKyNkZWZpbmUgQUNUMjAwTF8yNDAwICAgIDB4NWYKKyNkZWZpbmUgQUNUMjAwTF85NjAwICAgIDB4MTcKKyNkZWZpbmUgQUNUMjAwTF8xOTIwMCAgIDB4MGIKKyNkZWZpbmUgQUNUMjAwTF8zODQwMCAgIDB4MDUKKyNkZWZpbmUgQUNUMjAwTF81NzYwMCAgIDB4MDMKKyNkZWZpbmUgQUNUMjAwTF8xMTUyMDAgIDB4MDEKKworLyogUmVnaXN0ZXIgMTM6IENvbnRyb2wgcmVnaXN0ZXIgIzMgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUcxMyAgIDB4ZDAKKyNkZWZpbmUgQUNUMjAwTF9TSERXICAgIDB4MDEgLyogRW5hYmxlIGFjY2VzcyB0byBzaGFkb3cgcmVnaXN0ZXJzICovCisKKy8qIFJlZ2lzdGVyIDE1OiBTdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUcxNSAgIDB4ZjAKKworLyogUmVnaXN0ZXIgMjE6IENvbnRyb2wgcmVnaXN0ZXIgIzQgKi8KKyNkZWZpbmUgQUNUMjAwTF9SRUcyMSAgIDB4NTAKKyNkZWZpbmUgQUNUMjAwTF9FWENLICAgIDB4MDIgLyogRGlzYWJsZSBjbG9jayBvdXRwdXQgZHJpdmVyICovCisjZGVmaW5lIEFDVDIwMExfT1NDTCAgICAweDA0IC8qIG9zY2lsbGF0b3IgaW4gbG93IHBvd2VyLCBtZWRpdW0gYWNjdXJhY3kgbW9kZSAqLworCitzdGF0aWMgc3RydWN0IGRvbmdsZV9yZWcgZG9uZ2xlID0geworCS50eXBlID0gSVJEQV9BQ1QyMDBMX0RPTkdMRSwKKwkub3BlbiA9IGFjdDIwMGxfb3BlbiwKKwkuY2xvc2UgPSBhY3QyMDBsX2Nsb3NlLAorCS5yZXNldCA9IGFjdDIwMGxfcmVzZXQsCisJLmNoYW5nZV9zcGVlZCA9IGFjdDIwMGxfY2hhbmdlX3NwZWVkLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWN0MjAwbF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlyZGFfZGV2aWNlX3JlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFjdDIwMGxfY2xlYW51cCh2b2lkKQoreworCWlyZGFfZGV2aWNlX3VucmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworfQorCitzdGF0aWMgdm9pZCBhY3QyMDBsX29wZW4oZG9uZ2xlX3QgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogUG93ZXIgb24gdGhlIGRvbmdsZSAqLworCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CisKKwkvKiBTZXQgdGhlIHNwZWVkcyB3ZSBjYW4gYWNjZXB0ICovCisJcW9zLT5iYXVkX3JhdGUuYml0cyAmPSBJUl85NjAwfElSXzE5MjAwfElSXzM4NDAwfElSXzU3NjAwfElSXzExNTIwMDsKKwlxb3MtPm1pbl90dXJuX3RpbWUuYml0cyA9IDB4MDM7Cit9CisKK3N0YXRpYyB2b2lkIGFjdDIwMGxfY2xvc2UoZG9uZ2xlX3QgKnNlbGYpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwkvKiBQb3dlciBvZmYgdGhlIGRvbmdsZSAqLworCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIEZBTFNFKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFjdDIwMGxfY2hhbmdlX3NwZWVkIChkZXYsIHNwZWVkKQorICoKKyAqICAgIFNldCB0aGUgc3BlZWQgZm9yIHRoZSBBQ1RpU1lTIEFDVC1JUjIwMEwgdHlwZSBkb25nbGUuCisgKgorICovCitzdGF0aWMgaW50IGFjdDIwMGxfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CisJX191MzIgc3BlZWQgPSAoX191MzIpIHRhc2stPnBhcmFtOworCV9fdTggY29udHJvbFszXTsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJc2VsZi0+c3BlZWRfdGFzayA9IHRhc2s7CisKKwlzd2l0Y2ggKHRhc2stPnN0YXRlKSB7CisJY2FzZSBJUkRBX1RBU0tfSU5JVDoKKwkJaWYgKGlyZGFfdGFza19leGVjdXRlKHNlbGYsIGFjdDIwMGxfcmVzZXQsIE5VTEwsIHRhc2ssCisJCQkJKHZvaWQgKikgc3BlZWQpKQorCQl7CisJCQkvKiBEb25nbGUgbmVlZCBtb3JlIHRpbWUgdG8gcmVzZXQgKi8KKwkJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19DSElMRF9XQUlUKTsKKworCQkJLyogR2l2ZSByZXNldCAxIHNlYyB0byBmaW5pc2ggKi8KKwkJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfQ0hJTERfV0FJVDoKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCByZXNldHRpbmcgZG9uZ2xlIHRpbWVkIG91dCFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCXJldCA9IC0xOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19DSElMRF9ET05FOgorCQkvKiBDbGVhciBEVFIgYW5kIHNldCBSVFMgdG8gZW50ZXIgY29tbWFuZCBtb2RlICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIFRSVUUpOworCisJCXN3aXRjaCAoc3BlZWQpIHsKKwkJY2FzZSA5NjAwOgorCQlkZWZhdWx0OgorCQkJY29udHJvbFswXSA9IEFDVDIwMExfUkVHOCB8ICAoQUNUMjAwTF85NjAwICAgICAgICYgMHgwZik7CisJCQljb250cm9sWzFdID0gQUNUMjAwTF9SRUc5IHwgKChBQ1QyMDBMXzk2MDAgPj4gNCkgJiAweDBmKTsKKwkJCWJyZWFrOworCQljYXNlIDE5MjAwOgorCQkJY29udHJvbFswXSA9IEFDVDIwMExfUkVHOCB8ICAoQUNUMjAwTF8xOTIwMCAgICAgICAmIDB4MGYpOworCQkJY29udHJvbFsxXSA9IEFDVDIwMExfUkVHOSB8ICgoQUNUMjAwTF8xOTIwMCA+PiA0KSAmIDB4MGYpOworCQkJYnJlYWs7CisJCWNhc2UgMzg0MDA6CisJCQljb250cm9sWzBdID0gQUNUMjAwTF9SRUc4IHwgIChBQ1QyMDBMXzM4NDAwICAgICAgICYgMHgwZik7CisJCQljb250cm9sWzFdID0gQUNUMjAwTF9SRUc5IHwgKChBQ1QyMDBMXzM4NDAwID4+IDQpICYgMHgwZik7CisJCQlicmVhazsKKwkJY2FzZSA1NzYwMDoKKwkJCWNvbnRyb2xbMF0gPSBBQ1QyMDBMX1JFRzggfCAgKEFDVDIwMExfNTc2MDAgICAgICAgJiAweDBmKTsKKwkJCWNvbnRyb2xbMV0gPSBBQ1QyMDBMX1JFRzkgfCAoKEFDVDIwMExfNTc2MDAgPj4gNCkgJiAweDBmKTsKKwkJCWJyZWFrOworCQljYXNlIDExNTIwMDoKKwkJCWNvbnRyb2xbMF0gPSBBQ1QyMDBMX1JFRzggfCAgKEFDVDIwMExfMTE1MjAwICAgICAgICYgMHgwZik7CisJCQljb250cm9sWzFdID0gQUNUMjAwTF9SRUc5IHwgKChBQ1QyMDBMXzExNTIwMCA+PiA0KSAmIDB4MGYpOworCQkJYnJlYWs7CisJCX0KKwkJY29udHJvbFsyXSA9IEFDVDIwMExfUkVHMSB8IEFDVDIwMExfTE9EQiB8IEFDVDIwMExfV0lERTsKKworCQkvKiBXcml0ZSBjb250cm9sIGJ5dGVzICovCisJCXNlbGYtPndyaXRlKHNlbGYtPmRldiwgY29udHJvbCwgMyk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19XQUlUKTsKKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcyg1KTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfV0FJVDoKKwkJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwkJc2VsZi0+c3BlZWRfdGFzayA9IE5VTEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzKCksIHVua25vd24gc3RhdGUgJWRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHRhc2stPnN0YXRlKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5zcGVlZF90YXNrID0gTlVMTDsKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gYWN0MjAwbF9yZXNldCAoZHJpdmVyKQorICoKKyAqICAgIFJlc2V0IHRoZSBBQ1RpU1lTIEFDVC1JUjIwMEwgdHlwZSBkb25nbGUuCisgKi8KK3N0YXRpYyBpbnQgYWN0MjAwbF9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCWRvbmdsZV90ICpzZWxmID0gKGRvbmdsZV90ICopIHRhc2stPmluc3RhbmNlOworCV9fdTggY29udHJvbFs5XSA9IHsKKwkJQUNUMjAwTF9SRUcxNSwKKwkJQUNUMjAwTF9SRUcxMyB8IEFDVDIwMExfU0hEVywKKwkJQUNUMjAwTF9SRUcyMSB8IEFDVDIwMExfRVhDSyB8IEFDVDIwMExfT1NDTCwKKwkJQUNUMjAwTF9SRUcxMywKKwkJQUNUMjAwTF9SRUc3ICB8IEFDVDIwMExfRU5QT1MsCisJCUFDVDIwMExfUkVHNiAgfCBBQ1QyMDBMX1JTMCAgfCBBQ1QyMDBMX1JTMSwKKwkJQUNUMjAwTF9SRUc1ICB8IEFDVDIwMExfUldJREwsCisJCUFDVDIwMExfUkVHNCAgfCBBQ1QyMDBMX09QMCAgfCBBQ1QyMDBMX09QMSB8IEFDVDIwMExfQkxLUiwKKwkJQUNUMjAwTF9SRUcwICB8IEFDVDIwMExfVFhFTiB8IEFDVDIwMExfUlhFTgorCX07CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCXNlbGYtPnJlc2V0X3Rhc2sgPSB0YXNrOworCisJc3dpdGNoICh0YXNrLT5zdGF0ZSkgeworCWNhc2UgSVJEQV9UQVNLX0lOSVQ6CisJCS8qIFBvd2VyIG9uIHRoZSBkb25nbGUgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDEpOworCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDUwKTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfV0FJVDE6CisJCS8qIFJlc2V0IHRoZSBkb25nbGUgOiBzZXQgUlRTIGxvdyBmb3IgMjUgbXMgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBGQUxTRSk7CisKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQyKTsKKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcyg1MCk7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX1dBSVQyOgorCQkvKiBDbGVhciBEVFIgYW5kIHNldCBSVFMgdG8gZW50ZXIgY29tbWFuZCBtb2RlICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIFRSVUUpOworCisJCS8qIFdyaXRlIGNvbnRyb2wgYnl0ZXMgKi8KKwkJc2VsZi0+d3JpdGUoc2VsZi0+ZGV2LCBjb250cm9sLCA5KTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQzKTsKKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcygxNSk7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX1dBSVQzOgorCQkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CisKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5yZXNldF90YXNrID0gTlVMTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9FUlJPUigiJXMoKSwgdW5rbm93biBzdGF0ZSAlZFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgdGFzay0+c3RhdGUpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCXNlbGYtPnJlc2V0X3Rhc2sgPSBOVUxMOworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK01PRFVMRV9BVVRIT1IoIlNISU1JWlUgVGFrdXlhIDx0c2hpbWl6dUBnYTIuc28tbmV0Lm5lLmpwPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBQ1RpU1lTIEFDVC1JUjIwMEwgZG9uZ2xlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS0xMCIpOyAvKiBJUkRBX0FDVDIwMExfRE9OR0xFICovCisKKy8qCisgKiBGdW5jdGlvbiBpbml0X21vZHVsZSAodm9pZCkKKyAqCisgKiAgICBJbml0aWFsaXplIEFDVGlTWVMgQUNULUlSMjAwTCBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9pbml0KGFjdDIwMGxfaW5pdCk7CisKKy8qCisgKiBGdW5jdGlvbiBjbGVhbnVwX21vZHVsZSAodm9pZCkKKyAqCisgKiAgICBDbGVhbnVwIEFDVGlTWVMgQUNULUlSMjAwTCBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9leGl0KGFjdDIwMGxfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2FjdGlzeXMtc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2FjdGlzeXMtc2lyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcxNWFiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvYWN0aXN5cy1zaXIuYwpAQCAtMCwwICsxLDI0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBhY3Rpc3lzLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMQorICogRGVzY3JpcHRpb246ICAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBBQ1RpU1lTIElSLTIyMEwgYW5kIElSLTIyMEwrIAorICogICAgICAgICAgICAgICAgZG9uZ2xlcworICogU3RhdHVzOiAgICAgICAgQmV0YS4KKyAqIEF1dGhvcnM6ICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4gKGluaXRpYWxseSkKKyAqCQkgIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4gKG5ldyB2ZXJzaW9uKQorICoJCSAgTWFydGluIERpZWhsIDxtYWRAbWRpZWhsLmRlPiAobmV3IHZlcnNpb24gZm9yIHNpcl9kZXYpCisgKiBDcmVhdGVkIGF0OiAgICBXZWQgT2N0IDIxIDIwOjAyOjM1IDE5OTgKKyAqIE1vZGlmaWVkIGF0OiAgIFN1biBPY3QgMjcgMjI6MDI6MTMgMjAwMgorICogTW9kaWZpZWQgYnk6ICAgTWFydGluIERpZWhsIDxtYWRAbWRpZWhsLmRlPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5IEplYW4gVG91cnJpbGhlcworICogICAgIENvcHlyaWdodCAoYykgMjAwMiBNYXJ0aW4gRGllaGwKKyAqICAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ2hhbmdlbG9nCisgKgorICogMC44IC0+IDAuOTk5OSAtIEplYW4KKyAqCW8gTmV3IGluaXRpYWxpc2F0aW9uIHByb2NlZHVyZSA6IG11Y2ggc2FmZXIgYW5kIGNvcnJlY3QKKyAqCW8gTmV3IHByb2NlZHVyZSB0aGUgY2hhbmdlIHNwZWVkIDogbXVjaCBmYXN0ZXIgYW5kIHNpbXBsZXIKKyAqCW8gT3RoZXIgY2xlYW51cHMgJiBjb21tZW50cworICoJVGhhbmtzIHRvIExpY2hlbiBXYW5nIEAgQWN0aXN5cyBmb3IgaGlzIGV4Y2VsbGVudCBoZWxwLi4uCisgKgorICogMS4wIC0+IDEuMSAtIE1hcnRpbiBEaWVobAorICoJbW9kaWZpZWQgZm9yIG5ldyBzaXIgaW5mcmFzdHJ1Y3R1cmUKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisKKyNpbmNsdWRlICJzaXItZGV2LmgiCisKKy8qIAorICogRGVmaW5lIHRoZSB0aW1pbmcgb2YgdGhlIHB1bHNlcyB3ZSBzZW5kIHRvIHRoZSBkb25nbGUgKHRvIHJlc2V0IGl0LCBhbmQKKyAqIHRvIHRvZ2dsZSBzcGVlZHMpLiBCYXNpY2FsbHksIHRoZSBsaW1pdCBoZXJlIGlzIHRoZSBwcm9wYWdhdGlvbiBzcGVlZCBvZgorICogdGhlIHNpZ25hbHMgdGhyb3VnaCB0aGUgc2VyaWFsIHBvcnQsIHRoZSBkb25nbGUgYmVpbmcgbXVjaCBmYXN0ZXIuICBBbnkKKyAqIHNlcmlhbCBwb3J0IHN1cHBvcnQgMTE1IGtiL3MsIHNvIHdlIGFyZSBzdXJlIHRoYXQgcHVsc2VzIDguNSB1cyB3aWRlIGNhbgorICogZ28gdGhyb3VnaCBjbGVhbmx5IC4gSWYgeW91IGFyZSBvbiB0aGUgd2lsZCBzaWRlLCB5b3UgY2FuIHRyeSB0byBsb3dlcgorICogdGhpcyB2YWx1ZSAoQWN0aXN5cyByZWNvbW1lbmRlZCBtZSAyIHVzLCBhbmQgMCB1cyB3b3JrIGZvciBtZSBvbiBhIFAyMzMhKQorICovCisjZGVmaW5lIE1JTl9ERUxBWSAxMAkvKiAxMCB1cyB0byBiZSBvbiB0aGUgY29uc2VydmF0aXZlIHNpZGUgKi8KKworc3RhdGljIGludCBhY3Rpc3lzX29wZW4oc3RydWN0IHNpcl9kZXYgKik7CitzdGF0aWMgaW50IGFjdGlzeXNfY2xvc2Uoc3RydWN0IHNpcl9kZXYgKik7CitzdGF0aWMgaW50IGFjdGlzeXNfY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICosIHVuc2lnbmVkKTsKK3N0YXRpYyBpbnQgYWN0aXN5c19yZXNldChzdHJ1Y3Qgc2lyX2RldiAqKTsKKworLyogVGhlc2UgYXJlIHRoZSBiYXVkcmF0ZXMgc3VwcG9ydGVkLCBpbiB0aGUgb3JkZXIgYXZhaWxhYmxlICovCisvKiBOb3RlIDogdGhlIDIyMEwgZG9lc24ndCBzdXBwb3J0IDM4NDAwLCBidXQgd2Ugd2lsbCBmaXggdGhhdCBiZWxvdyAqLworc3RhdGljIHVuc2lnbmVkIGJhdWRfcmF0ZXNbXSA9IHsgOTYwMCwgMTkyMDAsIDU3NjAwLCAxMTUyMDAsIDM4NDAwIH07CisKKyNkZWZpbmUgTUFYX1NQRUVEUyAoc2l6ZW9mKGJhdWRfcmF0ZXMpL3NpemVvZihiYXVkX3JhdGVzWzBdKSkKKworc3RhdGljIHN0cnVjdCBkb25nbGVfZHJpdmVyIGFjdDIyMGwgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcml2ZXJfbmFtZQk9ICJBY3Rpc3lzIEFDVC0yMjBMIiwKKwkudHlwZQkJPSBJUkRBX0FDVElTWVNfRE9OR0xFLAorCS5vcGVuCQk9IGFjdGlzeXNfb3BlbiwKKwkuY2xvc2UJCT0gYWN0aXN5c19jbG9zZSwKKwkucmVzZXQJCT0gYWN0aXN5c19yZXNldCwKKwkuc2V0X3NwZWVkCT0gYWN0aXN5c19jaGFuZ2Vfc3BlZWQsCit9OworCitzdGF0aWMgc3RydWN0IGRvbmdsZV9kcml2ZXIgYWN0MjIwbF9wbHVzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJpdmVyX25hbWUJPSAiQWN0aXN5cyBBQ1QtMjIwTCsiLAorCS50eXBlCQk9IElSREFfQUNUSVNZU19QTFVTX0RPTkdMRSwKKwkub3BlbgkJPSBhY3Rpc3lzX29wZW4sCisJLmNsb3NlCQk9IGFjdGlzeXNfY2xvc2UsCisJLnJlc2V0CQk9IGFjdGlzeXNfcmVzZXQsCisJLnNldF9zcGVlZAk9IGFjdGlzeXNfY2hhbmdlX3NwZWVkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWN0aXN5c19zaXJfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwkvKiBGaXJzdCwgcmVnaXN0ZXIgYW4gQWN0aXN5cyAyMjBMIGRvbmdsZSAqLworCXJldCA9IGlyZGFfcmVnaXN0ZXJfZG9uZ2xlKCZhY3QyMjBsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIE5vdywgcmVnaXN0ZXIgYW4gQWN0aXN5cyAyMjBMKyBkb25nbGUgKi8KKwlyZXQgPSBpcmRhX3JlZ2lzdGVyX2RvbmdsZSgmYWN0MjIwbF9wbHVzKTsKKwlpZiAocmV0IDwgMCkgeworCQlpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKCZhY3QyMjBsKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhY3Rpc3lzX3Npcl9jbGVhbnVwKHZvaWQpCit7CisJLyogV2UgaGF2ZSB0byByZW1vdmUgYm90aCBkb25nbGVzICovCisJaXJkYV91bnJlZ2lzdGVyX2RvbmdsZSgmYWN0MjIwbF9wbHVzKTsKKwlpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKCZhY3QyMjBsKTsKK30KKworc3RhdGljIGludCBhY3Rpc3lzX29wZW4oc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcW9zX2luZm8gKnFvcyA9ICZkZXYtPnFvczsKKworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCisJLyogU2V0IHRoZSBzcGVlZHMgd2UgY2FuIGFjY2VwdCAqLworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHxJUl8xMTUyMDA7CisKKwkvKiBSZW1vdmUgc3VwcG9ydCBmb3IgMzg0MDAgaWYgdGhpcyBpcyBub3QgYSAyMjBMKyBkb25nbGUgKi8KKwlpZiAoZGV2LT5kb25nbGVfZHJ2LT50eXBlID09IElSREFfQUNUSVNZU19ET05HTEUpCisJCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gfklSXzM4NDAwOworCisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDdmOyAvKiBOZWVkcyAwLjAxIG1zICovCisJaXJkYV9xb3NfYml0c190b192YWx1ZShxb3MpOworCisJLyogaXJkYSB0aHJlYWQgd2FpdHMgNTAgbXNlYyBmb3IgcG93ZXIgc2V0dGxpbmcgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjdGlzeXNfY2xvc2Uoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwkvKiBQb3dlciBvZmYgdGhlIGRvbmdsZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBGQUxTRSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFjdGlzeXNfY2hhbmdlX3NwZWVkICh0YXNrKQorICoKKyAqICAgIENoYW5nZSBzcGVlZCBvZiB0aGUgQUNUaVNZUyBJUi0yMjBMIGFuZCBJUi0yMjBMKyB0eXBlIElyREEgZG9uZ2xlcy4KKyAqICAgIFRvIGN5Y2xlIHRocm91Z2ggdGhlIGF2YWlsYWJsZSBiYXVkIHJhdGVzLCBwdWxzZSBSVFMgbG93IGZvciBhIGZldyB1cy4KKyAqCisgKglGaXJzdCwgd2UgcmVzZXQgdGhlIGRvbmdsZSB0byBhbHdheXMgc3RhcnQgZnJvbSBhIGtub3duIHN0YXRlLgorICoJVGhlbiwgd2UgY3ljbGUgdGhyb3VnaCB0aGUgc3BlZWRzIGJ5IHB1bHNpbmcgUlRTIGxvdyBhbmQgdGhlbiB1cC4KKyAqCVRoZSBkb25nbGUgYWxsb3cgdXMgdG8gcHVsc2UgcXVpdGUgZmFzdCwgc2Ugd2UgY2FuIHNldCBzcGVlZCBpbiBvbmUgZ28sCisgKiB3aGljaCBpcyBtdXN0IGZhc3RlciAoIDwgMTAwIHVzKSBhbmQgbGVzcyBjb21wbGV4IHRoYW4gd2hhdCBpcyBmb3VuZAorICogaW4gc29tZSBvdGhlciBkb25nbGUgZHJpdmVycy4uLgorICoJTm90ZSB0aGF0IGV2ZW4gaWYgdGhlIG5ldyBzcGVlZCBpcyB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBzcGVlZCwKKyAqIHdlIHJlYXNzZXJ0IHRoZSBzcGVlZC4gVGhpcyBtYWtlIHN1cmUgdGhhdCB0aGluZ3MgYXJlIGFsbCByaWdodCwKKyAqIGFuZCBpdCdzIGZhc3QgYW55d2F5Li4uCisgKglCeSB0aGUgd2F5LCB0aGlzIGZ1bmN0aW9uIHdpbGwgd29yayBmb3IgYm90aCB0eXBlIG9mIGRvbmdsZXMsCisgKiBiZWNhdXNlIHRoZSBhZGRpdGlvbmFsIHNwZWVkIGlzIGF0IHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLi4uCisgKi8KK3N0YXRpYyBpbnQgYWN0aXN5c19jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpCit7CisJaW50IHJldCA9IDA7CisJaW50IGkgPSAwOworCisgICAgICAgIElSREFfREVCVUcoNCwgIiVzKCksIHNwZWVkPSVkICh3YXMgJWQpXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgIAlzcGVlZCwgZGV2LT5zcGVlZCk7CisKKwkvKiBkb25nbGUgd2FzIGFscmVhZHkgcmVzZXR0ZWQgZnJvbSBpcmRhX3JlcXVlc3Qgc3RhdGUgbWFjaGluZSwKKwkgKiB3ZSBhcmUgaW4ga25vd24gc3RhdGUgKGRvbmdsZSBkZWZhdWx0KQorCSAqLworCisJLyogCisJICogTm93LCB3ZSBjYW4gc2V0IHRoZSBzcGVlZCByZXF1ZXN0ZWQuIFNlbmQgUlRTIHB1bHNlcyB1bnRpbCB3ZQorICAgICAgICAgKiByZWFjaCB0aGUgdGFyZ2V0IHNwZWVkIAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfU1BFRURTOyBpKyspIHsKKwkJaWYgKHNwZWVkID09IGJhdWRfcmF0ZXNbaV0pIHsKKwkJCWRldi0+c3BlZWQgPSBzcGVlZDsKKwkJCWJyZWFrOworCQl9CisJCS8qIFNldCBSVFMgbG93IGZvciAxMCB1cyAqLworCQlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBGQUxTRSk7CisJCXVkZWxheShNSU5fREVMQVkpOworCisJCS8qIFNldCBSVFMgaGlnaCBmb3IgMTAgdXMgKi8KKwkJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisJCXVkZWxheShNSU5fREVMQVkpOworCX0KKworCS8qIENoZWNrIGlmIGxpZmUgaXMgc3dlZXQuLi4gKi8KKwlpZiAoaSA+PSBNQVhfU1BFRURTKSB7CisJCWFjdGlzeXNfcmVzZXQoZGV2KTsKKwkJcmV0ID0gLUVJTlZBTDsgIC8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwl9CisKKwkvKiBCYXN0YSBsYXZvcm8sIG9uIHNlIGNhc3NlIGQnaWNpLi4uICovCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFjdGlzeXNfcmVzZXQgKHRhc2spCisgKgorICogICAgICBSZXNldCB0aGUgQWN0aXN5cyB0eXBlIGRvbmdsZS4gV2FybmluZywgdGhpcyBmdW5jdGlvbiBtdXN0IG9ubHkgYmUKKyAqICAgICAgY2FsbGVkIHdpdGggYSBwcm9jZXNzIGNvbnRleHQhCisgKgorICogV2UgbmVlZCB0byBkbyB0d28gdGhpbmdzIGluIHRoaXMgZnVuY3Rpb24gOgorICoJbyBmaXJzdCBtYWtlIHN1cmUgdGhhdCB0aGUgZG9uZ2xlIGlzIGluIGEgc3RhdGUgd2hlcmUgaXQgY2FuIG9wZXJhdGUKKyAqCW8gc2Vjb25kIHB1dCB0aGUgZG9uZ2xlIGluIGEga25vdyBzdGF0ZQorICoKKyAqCVRoZSBkb25nbGUgaXMgcG93ZXJlZCBvZiB0aGUgUlRTIGFuZCBEVFIgbGluZXMuIEluIHRoZSBkb25nbGUsIHRoZXJlCisgKiBpcyBhIGJpZyBjYXBhY2l0b3IgdG8gYWNjb21tb2RhdGUgdGhlIGN1cnJlbnQgc3Bpa2VzLiBUaGlzIGNhcGFjaXRvcgorICogdGFrZXMgYSBsZWFzdCA1MCBtcyB0byBiZSBjaGFyZ2VkLiBJbiB0aGVvcnksIHRoZSBCaW9zIHNldCB0aG9zZSBsaW5lcworICogdXAsIHNvIGJ5IHRoZSB0aW1lIHdlIGFycml2ZSBoZXJlIHdlIHNob3VsZCBiZSBzZXQuIEl0IGRvZXNuJ3QgaHVydAorICogdG8gYmUgb24gdGhlIGNvbnNlcnZhdGl2ZSBzaWRlLCBzbyB3ZSB3aWxsIHdhaXQuLi4KKyAqIDxNYXJ0aW4gOiBtb3ZlIGFib3ZlIGNvbW1lbnQgdG8gaXJkYV9jb25maWdfZnNtPgorICoJVGhlbiwgd2Ugc2V0IHRoZSBzcGVlZCB0byA5NjAwIGIvcyB0byBnZXQgaW4gYSBrbm93biBzdGF0ZSAoc2VlIGluCisgKiBjaGFuZ2Vfc3BlZWQgZm9yIGRldGFpbHMpLiBJdCBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgSXJEQSBzdGFjaworICogaGFzIHRyaWVkIHRvIHNldCB0aGUgc3BlZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgb3VyIGZpcnN0IHJldHVybiwKKyAqIHNvIGJlZm9yZSB3ZSBjYW4gYmUgc3VyZSB0aGUgZG9uZ2xlIGlzIHVwIGFuZCBydW5uaW5nLgorICovCisKK3N0YXRpYyBpbnQgYWN0aXN5c19yZXNldChzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCS8qIFJlc2V0IHRoZSBkb25nbGUgOiBzZXQgRFRSIGxvdyBmb3IgMTAgdXMgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgVFJVRSk7CisJdWRlbGF5KE1JTl9ERUxBWSk7CisKKwkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisJCisJZGV2LT5zcGVlZCA9IDk2MDA7CS8qIFRoYXQncyB0aGUgZGVmYXVsdCAqLworCisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9BVVRIT1IoIkRhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4gLSBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFDVGlTWVMgSVItMjIwTCBhbmQgSVItMjIwTCsgZG9uZ2xlIGRyaXZlciIpOwkKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXJkYS1kb25nbGUtMiIpOyAvKiBJUkRBX0FDVElTWVNfRE9OR0xFICovCitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTMiKTsgLyogSVJEQV9BQ1RJU1lTX1BMVVNfRE9OR0xFICovCisKK21vZHVsZV9pbml0KGFjdGlzeXNfc2lyX2luaXQpOworbW9kdWxlX2V4aXQoYWN0aXN5c19zaXJfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2FjdGlzeXMuYyBiL2RyaXZlcnMvbmV0L2lyZGEvYWN0aXN5cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZTMxZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2FjdGlzeXMuYwpAQCAtMCwwICsxLDI4OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBhY3Rpc3lzLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMAorICogRGVzY3JpcHRpb246ICAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBBQ1RpU1lTIElSLTIyMEwgYW5kIElSLTIyMEwrIAorICogICAgICAgICAgICAgICAgZG9uZ2xlcworICogU3RhdHVzOiAgICAgICAgQmV0YS4KKyAqIEF1dGhvcnM6ICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4gKGluaXRpYWxseSkKKyAqCQkgIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4gKG5ldyB2ZXJzaW9uKQorICogQ3JlYXRlZCBhdDogICAgV2VkIE9jdCAyMSAyMDowMjozNSAxOTk4CisgKiBNb2RpZmllZCBhdDogICBGcmkgRGVjIDE3IDA5OjEwOjQzIDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIENvcHlyaWdodCAoYykgMTk5OSBKZWFuIFRvdXJyaWxoZXMKKyAqICAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ2hhbmdlbG9nCisgKgorICogMC44IC0+IDAuOTk5OSAtIEplYW4KKyAqCW8gTmV3IGluaXRpYWxpc2F0aW9uIHByb2NlZHVyZSA6IG11Y2ggc2FmZXIgYW5kIGNvcnJlY3QKKyAqCW8gTmV3IHByb2NlZHVyZSB0aGUgY2hhbmdlIHNwZWVkIDogbXVjaCBmYXN0ZXIgYW5kIHNpbXBsZXIKKyAqCW8gT3RoZXIgY2xlYW51cHMgJiBjb21tZW50cworICoJVGhhbmtzIHRvIExpY2hlbiBXYW5nIEAgQWN0aXN5cyBmb3IgaGlzIGV4Y2VsbGVudCBoZWxwLi4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisKKy8qIAorICogRGVmaW5lIHRoZSB0aW1pbmcgb2YgdGhlIHB1bHNlcyB3ZSBzZW5kIHRvIHRoZSBkb25nbGUgKHRvIHJlc2V0IGl0LCBhbmQKKyAqIHRvIHRvZ2dsZSBzcGVlZHMpLiBCYXNpY2FsbHksIHRoZSBsaW1pdCBoZXJlIGlzIHRoZSBwcm9wYWdhdGlvbiBzcGVlZCBvZgorICogdGhlIHNpZ25hbHMgdGhyb3VnaCB0aGUgc2VyaWFsIHBvcnQsIHRoZSBkb25nbGUgYmVpbmcgbXVjaCBmYXN0ZXIuICBBbnkKKyAqIHNlcmlhbCBwb3J0IHN1cHBvcnQgMTE1IGtiL3MsIHNvIHdlIGFyZSBzdXJlIHRoYXQgcHVsc2VzIDguNSB1cyB3aWRlIGNhbgorICogZ28gdGhyb3VnaCBjbGVhbmx5IC4gSWYgeW91IGFyZSBvbiB0aGUgd2lsZCBzaWRlLCB5b3UgY2FuIHRyeSB0byBsb3dlcgorICogdGhpcyB2YWx1ZSAoQWN0aXN5cyByZWNvbW1lbmRlZCBtZSAyIHVzLCBhbmQgMCB1cyB3b3JrIGZvciBtZSBvbiBhIFAyMzMhKQorICovCisjZGVmaW5lIE1JTl9ERUxBWSAxMAkvKiAxMCB1cyB0byBiZSBvbiB0aGUgY29uc2VydmF0aXZlIHNpZGUgKi8KKworc3RhdGljIGludCAgYWN0aXN5c19jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CitzdGF0aWMgaW50ICBhY3Rpc3lzX3Jlc2V0KHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOworc3RhdGljIHZvaWQgYWN0aXN5c19vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcyk7CitzdGF0aWMgdm9pZCBhY3Rpc3lzX2Nsb3NlKGRvbmdsZV90ICpzZWxmKTsKKworLyogVGhlc2UgYXJlIHRoZSBiYXVkcmF0ZXMgc3VwcG9ydGVkLCBpbiB0aGUgb3JkZXIgYXZhaWxhYmxlICovCisvKiBOb3RlIDogdGhlIDIyMEwgZG9lc24ndCBzdXBwb3J0IDM4NDAwLCBidXQgd2Ugd2lsbCBmaXggdGhhdCBiZWxvdyAqLworc3RhdGljIF9fdTMyIGJhdWRfcmF0ZXNbXSA9IHsgOTYwMCwgMTkyMDAsIDU3NjAwLCAxMTUyMDAsIDM4NDAwIH07CisjZGVmaW5lIE1BWF9TUEVFRFMgNQorCitzdGF0aWMgc3RydWN0IGRvbmdsZV9yZWcgZG9uZ2xlID0geworCS50eXBlID0gSVJEQV9BQ1RJU1lTX0RPTkdMRSwKKwkub3BlbiA9IGFjdGlzeXNfb3BlbiwKKwkuY2xvc2UgPSBhY3Rpc3lzX2Nsb3NlLAorCS5yZXNldCA9IGFjdGlzeXNfcmVzZXQsCisJLmNoYW5nZV9zcGVlZCA9IGFjdGlzeXNfY2hhbmdlX3NwZWVkLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHN0cnVjdCBkb25nbGVfcmVnIGRvbmdsZV9wbHVzID0geworCS50eXBlID0gSVJEQV9BQ1RJU1lTX1BMVVNfRE9OR0xFLAorCS5vcGVuID0gYWN0aXN5c19vcGVuLAorCS5jbG9zZSA9IGFjdGlzeXNfY2xvc2UsCisJLnJlc2V0ID0gYWN0aXN5c19yZXNldCwKKwkuY2hhbmdlX3NwZWVkID0gYWN0aXN5c19jaGFuZ2Vfc3BlZWQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCisvKgorICogRnVuY3Rpb24gYWN0aXN5c19jaGFuZ2Vfc3BlZWQgKHRhc2spCisgKgorICoJVGhlcmUgaXMgdHdvIG1vZGVsIG9mIEFjdGlzeXMgZG9uZ2xlIHdlIGFyZSBkZWFsaW5nIHdpdGgsCisgKiB0aGUgMjIwTCBhbmQgMjIwTCsuIEF0IHRoaXMgcG9pbnQsIG9ubHkgaXJhdHRhY2gga25vd3Mgd2l0aAorICoga2luZCB0aGUgdXNlciBoYXMgcmVxdWVzdGVkIChpdCB3YXMgYW4gYXJndW1lbnQgb24gaXJhdHRhY2gKKyAqIGNvbW1hbmQgbGluZSkuCisgKglTbywgd2UgcmVnaXN0ZXIgYSBkb25nbGUgb2YgZWFjaCBzb3J0IGFuZCBsZXQgaXJhdHRhY2gKKyAqIHBpY2sgdGhlIHJpZ2h0IG9uZS4uLgorICovCitzdGF0aWMgaW50IF9faW5pdCBhY3Rpc3lzX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJLyogRmlyc3QsIHJlZ2lzdGVyIGFuIEFjdGlzeXMgMjIwTCBkb25nbGUgKi8KKwlyZXQgPSBpcmRhX2RldmljZV9yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJLyogTm93LCByZWdpc3RlciBhbiBBY3Rpc3lzIDIyMEwrIGRvbmdsZSAqLworCXJldCA9IGlyZGFfZGV2aWNlX3JlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlX3BsdXMpOworCWlmIChyZXQgPCAwKSB7CisJCWlyZGFfZGV2aWNlX3VucmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworCQlyZXR1cm4gcmV0OworCX0JCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhY3Rpc3lzX2NsZWFudXAodm9pZCkKK3sKKwkvKiBXZSBoYXZlIHRvIHJlbW92ZSBib3RoIGRvbmdsZXMgKi8KKwlpcmRhX2RldmljZV91bnJlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKKwlpcmRhX2RldmljZV91bnJlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlX3BsdXMpOworfQorCitzdGF0aWMgdm9pZCBhY3Rpc3lzX29wZW4oZG9uZ2xlX3QgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKQoreworCS8qIFBvd2VyIG9uIHRoZSBkb25nbGUgKi8KKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCisJLyogU2V0IHRoZSBzcGVlZHMgd2UgY2FuIGFjY2VwdCAqLworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHxJUl8xMTUyMDA7CisKKwkvKiBSZW1vdmUgc3VwcG9ydCBmb3IgMzg0MDAgaWYgdGhpcyBpcyBub3QgYSAyMjBMKyBkb25nbGUgKi8KKwlpZiAoc2VsZi0+aXNzdWUtPnR5cGUgPT0gSVJEQV9BQ1RJU1lTX0RPTkdMRSkKKwkJcW9zLT5iYXVkX3JhdGUuYml0cyAmPSB+SVJfMzg0MDA7CisJCisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDdmOyAvKiBOZWVkcyAwLjAxIG1zICovCit9CisKK3N0YXRpYyB2b2lkIGFjdGlzeXNfY2xvc2UoZG9uZ2xlX3QgKnNlbGYpCit7CisJLyogUG93ZXIgb2ZmIHRoZSBkb25nbGUgKi8KKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBGQUxTRSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhY3Rpc3lzX2NoYW5nZV9zcGVlZCAodGFzaykKKyAqCisgKiAgICBDaGFuZ2Ugc3BlZWQgb2YgdGhlIEFDVGlTWVMgSVItMjIwTCBhbmQgSVItMjIwTCsgdHlwZSBJckRBIGRvbmdsZXMuCisgKiAgICBUbyBjeWNsZSB0aHJvdWdoIHRoZSBhdmFpbGFibGUgYmF1ZCByYXRlcywgcHVsc2UgUlRTIGxvdyBmb3IgYSBmZXcgdXMuCisgKgorICoJRmlyc3QsIHdlIHJlc2V0IHRoZSBkb25nbGUgdG8gYWx3YXlzIHN0YXJ0IGZyb20gYSBrbm93biBzdGF0ZS4KKyAqCVRoZW4sIHdlIGN5Y2xlIHRocm91Z2ggdGhlIHNwZWVkcyBieSBwdWxzaW5nIFJUUyBsb3cgYW5kIHRoZW4gdXAuCisgKglUaGUgZG9uZ2xlIGFsbG93IHVzIHRvIHB1bHNlIHF1aXRlIGZhc3QsIHNlIHdlIGNhbiBzZXQgc3BlZWQgaW4gb25lIGdvLAorICogd2hpY2ggaXMgbXVzdCBmYXN0ZXIgKCA8IDEwMCB1cykgYW5kIGxlc3MgY29tcGxleCB0aGFuIHdoYXQgaXMgZm91bmQKKyAqIGluIHNvbWUgb3RoZXIgZG9uZ2xlIGRyaXZlcnMuLi4KKyAqCU5vdGUgdGhhdCBldmVuIGlmIHRoZSBuZXcgc3BlZWQgaXMgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgc3BlZWQsCisgKiB3ZSByZWFzc2VydCB0aGUgc3BlZWQuIFRoaXMgbWFrZSBzdXJlIHRoYXQgdGhpbmdzIGFyZSBhbGwgcmlnaHQsCisgKiBhbmQgaXQncyBmYXN0IGFueXdheS4uLgorICoJQnkgdGhlIHdheSwgdGhpcyBmdW5jdGlvbiB3aWxsIHdvcmsgZm9yIGJvdGggdHlwZSBvZiBkb25nbGVzLAorICogYmVjYXVzZSB0aGUgYWRkaXRpb25hbCBzcGVlZCBpcyBhdCB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS4uLgorICovCitzdGF0aWMgaW50IGFjdGlzeXNfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CisJX191MzIgc3BlZWQgPSAoX191MzIpIHRhc2stPnBhcmFtOwkvKiBUYXJnZXQgc3BlZWQgKi8KKwlpbnQgcmV0ID0gMDsKKwlpbnQgaSA9IDA7CisKKyAgICAgICAgSVJEQV9ERUJVRyg0LCAiJXMoKSwgc3BlZWQ9JWQgKHdhcyAlZClcbiIsIF9fRlVOQ1RJT05fXywgc3BlZWQsIAorCQkgICBzZWxmLT5zcGVlZCk7CisKKwkvKiBHbyB0byBhIGtub3duIHN0YXRlIGJ5IHJlc2V0aW5nIHRoZSBkb25nbGUgKi8KKworCS8qIFJlc2V0IHRoZSBkb25nbGUgOiBzZXQgRFRSIGxvdyBmb3IgMTAgdXMgKi8KKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBUUlVFKTsKKwl1ZGVsYXkoTUlOX0RFTEFZKTsKKworCS8qIEdvIGJhY2sgdG8gbm9ybWFsIG1vZGUgKHdlIGFyZSBub3cgYXQgOTYwMCBiL3MpICovCisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKyAKKwkvKiAKKwkgKiBOb3csIHdlIGNhbiBzZXQgdGhlIHNwZWVkIHJlcXVlc3RlZC4gU2VuZCBSVFMgcHVsc2VzIHVudGlsIHdlCisgICAgICAgICAqIHJlYWNoIHRoZSB0YXJnZXQgc3BlZWQgCisJICovCisJZm9yIChpPTA7IGk8TUFYX1NQRUVEUzsgaSsrKSB7CisJCWlmIChzcGVlZCA9PSBiYXVkX3JhdGVzW2ldKSB7CisJCQlzZWxmLT5zcGVlZCA9IGJhdWRfcmF0ZXNbaV07CisJCQlicmVhazsKKwkJfQorCQkvKiBNYWtlIHN1cmUgcHJldmlvdXMgcHVsc2UgaXMgZmluaXNoZWQgKi8KKwkJdWRlbGF5KE1JTl9ERUxBWSk7CisKKwkJLyogU2V0IFJUUyBsb3cgZm9yIDEwIHVzICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgRkFMU0UpOworCQl1ZGVsYXkoTUlOX0RFTEFZKTsKKworCQkvKiBTZXQgUlRTIGhpZ2ggZm9yIDEwIHVzICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CisJfQorCisJLyogQ2hlY2sgaWYgbGlmZSBpcyBzd2VldC4uLiAqLworCWlmIChpID49IE1BWF9TUEVFRFMpCisJCXJldCA9IC0xOyAgLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiAqLworCisJLyogQmFzdGEgbGF2b3JvLCBvbiBzZSBjYXNzZSBkJ2ljaS4uLiAqLworCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhY3Rpc3lzX3Jlc2V0ICh0YXNrKQorICoKKyAqICAgICAgUmVzZXQgdGhlIEFjdGlzeXMgdHlwZSBkb25nbGUuIFdhcm5pbmcsIHRoaXMgZnVuY3Rpb24gbXVzdCBvbmx5IGJlCisgKiAgICAgIGNhbGxlZCB3aXRoIGEgcHJvY2VzcyBjb250ZXh0IQorICoKKyAqIFdlIG5lZWQgdG8gZG8gdHdvIHRoaW5ncyBpbiB0aGlzIGZ1bmN0aW9uIDoKKyAqCW8gZmlyc3QgbWFrZSBzdXJlIHRoYXQgdGhlIGRvbmdsZSBpcyBpbiBhIHN0YXRlIHdoZXJlIGl0IGNhbiBvcGVyYXRlCisgKglvIHNlY29uZCBwdXQgdGhlIGRvbmdsZSBpbiBhIGtub3cgc3RhdGUKKyAqCisgKglUaGUgZG9uZ2xlIGlzIHBvd2VyZWQgb2YgdGhlIFJUUyBhbmQgRFRSIGxpbmVzLiBJbiB0aGUgZG9uZ2xlLCB0aGVyZQorICogaXMgYSBiaWcgY2FwYWNpdG9yIHRvIGFjY29tbW9kYXRlIHRoZSBjdXJyZW50IHNwaWtlcy4gVGhpcyBjYXBhY2l0b3IKKyAqIHRha2VzIGEgbGVhc3QgNTAgbXMgdG8gYmUgY2hhcmdlZC4gSW4gdGhlb3J5LCB0aGUgQmlvcyBzZXQgdGhvc2UgbGluZXMKKyAqIHVwLCBzbyBieSB0aGUgdGltZSB3ZSBhcnJpdmUgaGVyZSB3ZSBzaG91bGQgYmUgc2V0LiBJdCBkb2Vzbid0IGh1cnQKKyAqIHRvIGJlIG9uIHRoZSBjb25zZXJ2YXRpdmUgc2lkZSwgc28gd2Ugd2lsbCB3YWl0Li4uCisgKglUaGVuLCB3ZSBzZXQgdGhlIHNwZWVkIHRvIDk2MDAgYi9zIHRvIGdldCBpbiBhIGtub3duIHN0YXRlIChzZWUgaW4KKyAqIGNoYW5nZV9zcGVlZCBmb3IgZGV0YWlscykuIEl0IGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBJckRBIHN0YWNrCisgKiBoYXMgdHJpZWQgdG8gc2V0IHRoZSBzcGVlZCBpbW1lZGlhdGVseSBhZnRlciBvdXIgZmlyc3QgcmV0dXJuLAorICogc28gYmVmb3JlIHdlIGNhbiBiZSBzdXJlIHRoZSBkb25nbGUgaXMgdXAgYW5kIHJ1bm5pbmcuCisgKi8KK3N0YXRpYyBpbnQgYWN0aXN5c19yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCWRvbmdsZV90ICpzZWxmID0gKGRvbmdsZV90ICopIHRhc2stPmluc3RhbmNlOworCWludCByZXQgPSAwOworCisJSVJEQV9BU1NFUlQodGFzayAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXNlbGYtPnJlc2V0X3Rhc2sgPSB0YXNrOworCisJc3dpdGNoICh0YXNrLT5zdGF0ZSkgeworCWNhc2UgSVJEQV9UQVNLX0lOSVQ6CisJCS8qIFNldCBib3RoIERUUiAmIFJUUyB0byBwb3dlciB1cCB0aGUgZG9uZ2xlICovCisJCS8qIEluIHRoZW9yeSByZWR1bmRhbnQgd2l0aCBwb3dlciB1cCBpbiBhY3Rpc3lzX29wZW4oKSAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCQkKKwkJLyogU2xlZXAgNTAgbXMgdG8gbWFrZSBzdXJlIGNhcGFjaXRvciBpcyBjaGFyZ2VkICovCisJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoNTApOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVCk7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX1dBSVQ6CQkJCisJCS8qIFJlc2V0IHRoZSBkb25nbGUgOiBzZXQgRFRSIGxvdyBmb3IgMTAgdXMgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgVFJVRSk7CisJCXVkZWxheShNSU5fREVMQVkpOworCisJCS8qIEdvIGJhY2sgdG8gbm9ybWFsIG1vZGUgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKwkKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5yZXNldF90YXNrID0gTlVMTDsKKwkJc2VsZi0+c3BlZWQgPSA5NjAwOwkvKiBUaGF0J3MgdGhlIGRlZmF1bHQgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9FUlJPUigiJXMoKSwgdW5rbm93biBzdGF0ZSAlZFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgdGFzay0+c3RhdGUpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCXNlbGYtPnJlc2V0X3Rhc2sgPSBOVUxMOworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK01PRFVMRV9BVVRIT1IoIkRhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4gLSBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFDVGlTWVMgSVItMjIwTCBhbmQgSVItMjIwTCsgZG9uZ2xlIGRyaXZlciIpOwkKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXJkYS1kb25nbGUtMiIpOyAvKiBJUkRBX0FDVElTWVNfRE9OR0xFICovCitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTMiKTsgLyogSVJEQV9BQ1RJU1lTX1BMVVNfRE9OR0xFICovCisKKwkJCisvKgorICogRnVuY3Rpb24gaW5pdF9tb2R1bGUgKHZvaWQpCisgKgorICogICAgSW5pdGlhbGl6ZSBBY3Rpc3lzIG1vZHVsZQorICoKKyAqLworbW9kdWxlX2luaXQoYWN0aXN5c19pbml0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGNsZWFudXBfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIENsZWFudXAgQWN0aXN5cyBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9leGl0KGFjdGlzeXNfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2FsaS1pcmNjLmMgYi9kcml2ZXJzL25ldC9pcmRhL2FsaS1pcmNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJmMzQ2OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuYwpAQCAtMCwwICsxLDIyNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgYWxpLWlyY2MuaAorICogVmVyc2lvbjogICAgICAgMC41CisgKiBEZXNjcmlwdGlvbjogICBEcml2ZXIgZm9yIHRoZSBBTEkgTTE1MzVEIGFuZCBNMTU0M0MgRklSIENvbnRyb2xsZXIKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIEJlbmphbWluIEtvbmcgPGJlbmphbWluX2tvbmdAYWxpLmNvbS50dz4KKyAqIENyZWF0ZWQgYXQ6ICAgIDIwMDAvMTAvMTYgMDM6NDZQTQorICogTW9kaWZpZWQgYXQ6ICAgMjAwMS8xLzMgMDI6NTVQTQorICogTW9kaWZpZWQgYnk6ICAgQmVuamFtaW4gS29uZyA8YmVuamFtaW5fa29uZ0BhbGkuY29tLnR3PgorICogTW9kaWZpZWQgYXQ6ICAgMjAwMy8xMS82IGFuZCBzdXBwb3J0IGZvciBBTGkgc291dGgtYnJpZGdlIGNoaXBzZXRzIE0xNTYzCisgKiBNb2RpZmllZCBieTogICBDbGVhciBaaGFuZyA8Y2xlYXJfemhhbmdAYWxpLmNvbS50dz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMjAwMCBCZW5qYW1pbiBLb25nIDxiZW5qYW1pbl9rb25nQGFsaS5jb20udHc+CisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvd3JhcHBlci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCisjaW5jbHVkZSAiYWxpLWlyY2MuaCIKKworI2RlZmluZSBDSElQX0lPX0VYVEVOVCA4CisjZGVmaW5lIEJST0tFTl9ET05HTEVfSUQKKworc3RhdGljIGNoYXIgKmRyaXZlcl9uYW1lID0gImFsaS1pcmNjIjsKKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyBpbnQgcW9zX210dF9iaXRzID0gMHgwNzsgIC8qIDEgbXMgb3IgbW9yZSAqLworCisvKiBVc2UgQklPUyBzZXR0aW9ucyBieSBkZWZhdWx0LCBidXQgdXNlciBtYXkgc3VwcGx5IG1vZHVsZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgdW5zaWduZWQgaW50IGlvW10gID0geyB+MCwgfjAsIH4wLCB+MCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBpcnFbXSA9IHsgMCwgMCwgMCwgMCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBkbWFbXSA9IHsgMCwgMCwgMCwgMCB9OworCitzdGF0aWMgaW50ICBhbGlfaXJjY19wcm9iZV81MyhhbGlfY2hpcF90ICpjaGlwLCBjaGlwaW9fdCAqaW5mbyk7CitzdGF0aWMgaW50ICBhbGlfaXJjY19pbml0XzQzKGFsaV9jaGlwX3QgKmNoaXAsIGNoaXBpb190ICppbmZvKTsKK3N0YXRpYyBpbnQgIGFsaV9pcmNjX2luaXRfNTMoYWxpX2NoaXBfdCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pOworCisvKiBUaGVzZSBhcmUgdGhlIGN1cnJlbnRseSBrbm93biBBTGkgc291cnRoLWJyaWRnZSBjaGlwc2V0cywgdGhlIG9ubHkgb25lIGRpZmZlcmVuY2UKKyAqIGlzIHRoYXQgTTE1NDNDIGRvZXNuJ3Qgc3VwcG9ydCBIUCBIRFNMLTM2MDAKKyAqLworc3RhdGljIGFsaV9jaGlwX3QgY2hpcHNbXSA9Cit7CisJeyAiTTE1NDMiLCB7IDB4M2YwLCAweDM3MCB9LCAweDUxLCAweDIzLCAweDIwLCAweDQzLCBhbGlfaXJjY19wcm9iZV81MywgYWxpX2lyY2NfaW5pdF80MyB9LAorCXsgIk0xNTM1IiwgeyAweDNmMCwgMHgzNzAgfSwgMHg1MSwgMHgyMywgMHgyMCwgMHg1MywgYWxpX2lyY2NfcHJvYmVfNTMsIGFsaV9pcmNjX2luaXRfNTMgfSwKKwl7ICJNMTU2MyIsIHsgMHgzZjAsIDB4MzcwIH0sIDB4NTEsIDB4MjMsIDB4MjAsIDB4NjMsIGFsaV9pcmNjX3Byb2JlXzUzLCBhbGlfaXJjY19pbml0XzUzIH0sCisJeyBOVUxMIH0KK307CisKKy8qIE1heCA0IGluc3RhbmNlcyBmb3Igbm93ICovCitzdGF0aWMgc3RydWN0IGFsaV9pcmNjX2NiICpkZXZfc2VsZltdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07CisKKy8qIERvbmdsZSBUeXBlcyAqLworc3RhdGljIGNoYXIgKmRvbmdsZV90eXBlc1tdID0geworCSJURkRTNjAwMCIsCisJIkhQIEhTREwtMzYwMCIsCisJIkhQIEhTREwtMTEwMCIsCQorCSJObyBkb25nbGUgY29ubmVjdGVkIiwKK307CisKKy8qIFNvbWUgcHJvdG90eXBlcyAqLworc3RhdGljIGludCAgYWxpX2lyY2Nfb3BlbihpbnQgaSwgY2hpcGlvX3QgKmluZm8pOworCitzdGF0aWMgaW50ICBhbGlfaXJjY19jbG9zZShzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYpOworCitzdGF0aWMgaW50ICBhbGlfaXJjY19zZXR1cChjaGlwaW9fdCAqaW5mbyk7CitzdGF0aWMgaW50ICBhbGlfaXJjY19pc19yZWNlaXZpbmcoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyBpbnQgIGFsaV9pcmNjX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgYWxpX2lyY2NfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgYWxpX2lyY2NfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIGludCAgYWxpX2lyY2NfcG1wcm9jKHN0cnVjdCBwbV9kZXYgKmRldiwgcG1fcmVxdWVzdF90IHJxc3QsIHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgYWxpX2lyY2NfY2hhbmdlX3NwZWVkKHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZiwgX191MzIgYmF1ZCk7CitzdGF0aWMgdm9pZCBhbGlfaXJjY19zdXNwZW5kKHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgdm9pZCBhbGlfaXJjY193YWtldXAoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYWxpX2lyY2NfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogU0lSIGZ1bmN0aW9uICovCitzdGF0aWMgaW50ICBhbGlfaXJjY19zaXJfaGFyZF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGFsaV9pcmNjX3Npcl9pbnRlcnJ1cHQoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyB2b2lkIGFsaV9pcmNjX3Npcl9yZWNlaXZlKHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgdm9pZCBhbGlfaXJjY19zaXJfd3JpdGVfd2FrZXVwKHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgaW50ICBhbGlfaXJjY19zaXJfd3JpdGUoaW50IGlvYmFzZSwgaW50IGZpZm9fc2l6ZSwgX191OCAqYnVmLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIGFsaV9pcmNjX3Npcl9jaGFuZ2Vfc3BlZWQoc3RydWN0IGFsaV9pcmNjX2NiICpwcml2LCBfX3UzMiBzcGVlZCk7CisKKy8qIEZJUiBmdW5jdGlvbiAqLworc3RhdGljIGludCAgYWxpX2lyY2NfZmlyX2hhcmRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGFsaV9pcmNjX2Zpcl9jaGFuZ2Vfc3BlZWQoc3RydWN0IGFsaV9pcmNjX2NiICpwcml2LCBfX3UzMiBzcGVlZCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgYWxpX2lyY2NfZmlyX2ludGVycnVwdChzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIGludCAgYWxpX2lyY2NfZG1hX3JlY2VpdmUoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKTsgCitzdGF0aWMgaW50ICBhbGlfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIGludCAgYWxpX2lyY2NfZG1hX3htaXRfY29tcGxldGUoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyB2b2lkIGFsaV9pcmNjX2RtYV94bWl0KHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZik7CisKKy8qIE15IEZ1bmN0aW9uICovCitzdGF0aWMgaW50ICBhbGlfaXJjY19yZWFkX2RvbmdsZV9pZCAoaW50IGksIGNoaXBpb190ICppbmZvKTsKK3N0YXRpYyB2b2lkIGFsaV9pcmNjX2NoYW5nZV9kb25nbGVfc3BlZWQoc3RydWN0IGFsaV9pcmNjX2NiICpwcml2LCBpbnQgc3BlZWQpOworCisvKiBBTGkgY2hpcCBmdW5jdGlvbiAqLworc3RhdGljIHZvaWQgU0lSMkZJUihpbnQgaW9iYXNlKTsKK3N0YXRpYyB2b2lkIEZJUjJTSVIoaW50IGlvYmFzZSk7CitzdGF0aWMgdm9pZCBTZXRDT01JbnRlcnJ1cHRzKHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZiAsIHVuc2lnbmVkIGNoYXIgZW5hYmxlKTsKKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX2luaXQgKCkKKyAqCisgKiAgICBJbml0aWFsaXplIGNoaXAuIEZpbmQgb3V0IHdoYXkga2luZHMgb2YgY2hpcHMgd2UgYXJlIGRlYWxpbmcgd2l0aAorICogICAgYW5kIHRoZWlyIGNvbmZpZ3VhdGlvbiByZWdpc3RlcnMgYWRkcmVzcworICovCitzdGF0aWMgaW50IF9faW5pdCBhbGlfaXJjY19pbml0KHZvaWQpCit7CisJYWxpX2NoaXBfdCAqY2hpcDsKKwljaGlwaW9fdCBpbmZvOworCWludCByZXQgPSAtRU5PREVWOworCWludCBjZmcsIGNmZ19iYXNlOworCWludCByZWcsIHJldmlzaW9uOworCWludCBpID0gMDsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CisJCisJLyogUHJvYmUgZm9yIGFsbCB0aGUgQUxpIGNoaXBzZXRzIHdlIGtub3cgYWJvdXQgKi8KKwlmb3IgKGNoaXA9IGNoaXBzOyBjaGlwLT5uYW1lOyBjaGlwKyssIGkrKykgCisJeworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBQcm9iaW5nIGZvciAlcyAuLi5cbiIsIF9fRlVOQ1RJT05fXywgY2hpcC0+bmFtZSk7CisJCQkJCisJCS8qIFRyeSBhbGwgY29uZmlnIHJlZ2lzdGVycyBmb3IgdGhpcyBjaGlwICovCisJCWZvciAoY2ZnPTA7IGNmZzwyOyBjZmcrKykKKwkJeworCQkJY2ZnX2Jhc2UgPSBjaGlwLT5jZmdbY2ZnXTsKKwkJCWlmICghY2ZnX2Jhc2UpCisJCQkJY29udGludWU7CisJCQkJCisJCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihjaGlwaW9fdCkpOworCQkJaW5mby5jZmdfYmFzZSA9IGNmZ19iYXNlOworCQkJaW5mby5maXJfYmFzZSA9IGlvW2ldOworCQkJaW5mby5kbWEgPSBkbWFbaV07CisJCQlpbmZvLmlycSA9IGlycVtpXTsKKwkJCQorCQkJCisJCQkvKiBFbnRlciBDb25maWd1cmF0aW9uICovCisJCQlvdXRiKGNoaXAtPmVudHIxLCBjZmdfYmFzZSk7CisJCQlvdXRiKGNoaXAtPmVudHIyLCBjZmdfYmFzZSk7CisJCQkKKwkJCS8qIFNlbGVjdCBMb2dpY2FsIERldmljZSA1IFJlZ2lzdGVycyAoVUFSVDIpICovCisJCQlvdXRiKDB4MDcsIGNmZ19iYXNlKTsKKwkJCW91dGIoMHgwNSwgY2ZnX2Jhc2UrMSk7CisJCQkKKwkJCS8qIFJlYWQgQ2hpcCBJZGVudGlmaWNhdGlvbiBSZWdpc3RlciAqLworCQkJb3V0YihjaGlwLT5jaWRfaW5kZXgsIGNmZ19iYXNlKTsJCisJCQlyZWcgPSBpbmIoY2ZnX2Jhc2UrMSk7CQorCQkJCQorCQkJaWYgKHJlZyA9PSBjaGlwLT5jaWRfdmFsdWUpCisJCQl7CisJCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgQ2hpcCBmb3VuZCBhdCAweCUwM3hcbiIsIF9fRlVOQ1RJT05fXywgY2ZnX2Jhc2UpOworCQkJCQkgICAKKwkJCQlvdXRiKDB4MUYsIGNmZ19iYXNlKTsKKwkJCQlyZXZpc2lvbiA9IGluYihjZmdfYmFzZSsxKTsKKwkJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBGb3VuZCAlcyBjaGlwLCByZXZpc2lvbj0lZFxuIiwgX19GVU5DVElPTl9fLAorCQkJCQkgICBjaGlwLT5uYW1lLCByZXZpc2lvbik7CQkJCQkKKwkJCQkKKwkJCQkvKiAKKwkJCQkgKiBJZiB0aGUgdXNlciBzdXBwbGllcyB0aGUgYmFzZSBhZGRyZXNzLCB0aGVuCisJCQkJICogd2UgaW5pdCB0aGUgY2hpcCwgaWYgbm90IHdlIHByb2JlIHRoZSB2YWx1ZXMKKwkJCQkgKiBzZXQgYnkgdGhlIEJJT1MKKwkJCQkgKi8JCQkJCisJCQkJaWYgKGlvW2ldIDwgMjAwMCkKKwkJCQl7CisJCQkJCWNoaXAtPmluaXQoY2hpcCwgJmluZm8pOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQljaGlwLT5wcm9iZShjaGlwLCAmaW5mbyk7CQorCQkJCX0KKwkJCQkKKwkJCQlpZiAoYWxpX2lyY2Nfb3BlbihpLCAmaW5mbykgPT0gMCkKKwkJCQkJcmV0ID0gMDsKKwkJCQlpKys7CQkJCQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUlSREFfREVCVUcoMiwgIiVzKCksIE5vICVzIGNoaXAgYXQgMHglMDN4XG4iLCBfX0ZVTkNUSU9OX18sIGNoaXAtPm5hbWUsIGNmZ19iYXNlKTsKKwkJCX0KKwkJCS8qIEV4aXQgY29uZmlndXJhdGlvbiAqLworCQkJb3V0YigweGJiLCBjZmdfYmFzZSk7CisJCX0KKwl9CQkKKwkJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18pOwkJCQkJICAgCQkKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2NfY2xlYW51cCAoKQorICoKKyAqICAgIENsb3NlIGFsbCBjb25maWd1cmVkIGNoaXBzCisgKgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxpX2lyY2NfY2xlYW51cCh2b2lkKQoreworCWludCBpOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18pOwkKKwkKKwlwbV91bnJlZ2lzdGVyX2FsbChhbGlfaXJjY19wbXByb2MpOworCisJZm9yIChpPTA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKGRldl9zZWxmW2ldKQorCQkJYWxpX2lyY2NfY2xvc2UoZGV2X3NlbGZbaV0pOworCX0KKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhbGlfaXJjY19vcGVuIChpbnQgaSwgY2hpcGlvX3QgKmluZikKKyAqCisgKiAgICBPcGVuIGRyaXZlciBpbnN0YW5jZQorICoKKyAqLworc3RhdGljIGludCBhbGlfaXJjY19vcGVuKGludCBpLCBjaGlwaW9fdCAqaW5mbykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZjsKKwlzdHJ1Y3QgcG1fZGV2ICpwbWRldjsKKwlpbnQgZG9uZ2xlX2lkOworCWludCBlcnI7CisJCQkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CQorCQorCS8qIFNldCBGSVIgRklGTyBhbmQgRE1BIFRocmVzaG9sZCAqLworCWlmICgoYWxpX2lyY2Nfc2V0dXAoaW5mbykpID09IC0xKQorCQlyZXR1cm4gLTE7CisJCQorCWRldiA9IGFsbG9jX2lyZGFkZXYoc2l6ZW9mKCpzZWxmKSk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCUlSREFfRVJST1IoIiVzKCksIGNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgY29udHJvbCBibG9jayFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzZWxmID0gZGV2LT5wcml2OworCXNlbGYtPm5ldGRldiA9IGRldjsKKwlzcGluX2xvY2tfaW5pdCgmc2VsZi0+bG9jayk7CisgICAKKwkvKiBOZWVkIHRvIHN0b3JlIHNlbGYgc29tZXdoZXJlICovCisJZGV2X3NlbGZbaV0gPSBzZWxmOworCXNlbGYtPmluZGV4ID0gaTsKKworCS8qIEluaXRpYWxpemUgSU8gKi8KKwlzZWxmLT5pby5jZmdfYmFzZSAgPSBpbmZvLT5jZmdfYmFzZTsJLyogSW4gYWxpX2lyY2NfcHJvYmVfNTMgYXNzaWduIAkJKi8KKwlzZWxmLT5pby5maXJfYmFzZSAgPSBpbmZvLT5maXJfYmFzZTsJLyogaW5mby0+c2lyX2Jhc2UgPSBpbmZvLT5maXJfYmFzZSAJKi8KKwlzZWxmLT5pby5zaXJfYmFzZSAgPSBpbmZvLT5zaXJfYmFzZTsgCS8qIEFMaSBTSVIgYW5kIEZJUiB1c2UgdGhlIHNhbWUgYWRkcmVzcyAqLworICAgICAgICBzZWxmLT5pby5pcnEgICAgICAgPSBpbmZvLT5pcnE7CisgICAgICAgIHNlbGYtPmlvLmZpcl9leHQgICA9IENISVBfSU9fRVhURU5UOworICAgICAgICBzZWxmLT5pby5kbWEgICAgICAgPSBpbmZvLT5kbWE7CisgICAgICAgIHNlbGYtPmlvLmZpZm9fc2l6ZSA9IDE2OwkJLyogU0lSOiAxNiwgRklSOiAzMiBCZW5qYW1pbiAyMDAwLzExLzEgKi8KKwkKKwkvKiBSZXNlcnZlIHRoZSBpb3BvcnRzIHRoYXQgd2UgbmVlZCAqLworCWlmICghcmVxdWVzdF9yZWdpb24oc2VsZi0+aW8uZmlyX2Jhc2UsIHNlbGYtPmlvLmZpcl9leHQsIGRyaXZlcl9uYW1lKSkgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIGNhbid0IGdldCBpb2Jhc2Ugb2YgMHglMDN4XG4iLCBfX0ZVTkNUSU9OX18sCisJCQlzZWxmLT5pby5maXJfYmFzZSk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDE7CisJfQorCisJLyogSW5pdGlhbGl6ZSBRb1MgZm9yIHRoaXMgZGV2aWNlICovCisJaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcygmc2VsZi0+cW9zKTsKKwkKKwkvKiBUaGUgb25seSB2YWx1ZSB3ZSBtdXN0IG92ZXJyaWRlIGl0IHRoZSBiYXVkcmF0ZSAqLworCXNlbGYtPnFvcy5iYXVkX3JhdGUuYml0cyA9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8CisJCUlSXzExNTIwMHxJUl81NzYwMDB8SVJfMTE1MjAwMHwoSVJfNDAwMDAwMCA8PCA4KTsgLy8gYmVuamFtaW4gMjAwMC8xMS84IDA1OjI3UE0KKwkJCQorCXNlbGYtPnFvcy5taW5fdHVybl90aW1lLmJpdHMgPSBxb3NfbXR0X2JpdHM7CisJCQkKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKCZzZWxmLT5xb3MpOworCQorCS8qIE1heCBETUEgYnVmZmVyIHNpemUgbmVlZGVkID0gKGRhdGFfc2l6ZSArIDYpICogKHdpbmRvd19zaXplKSArIDY7ICovCisJc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSA9IDE0Mzg0OyAKKwlzZWxmLT50eF9idWZmLnRydWVzaXplID0gMTQzODQ7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgaWYgbmVlZGVkICovCisJc2VsZi0+cnhfYnVmZi5oZWFkID0KKwkJZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICAgJnNlbGYtPnJ4X2J1ZmZfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2VsZi0+cnhfYnVmZi5oZWFkID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0MjsKKwl9CisJbWVtc2V0KHNlbGYtPnJ4X2J1ZmYuaGVhZCwgMCwgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSk7CisJCisJc2VsZi0+dHhfYnVmZi5oZWFkID0KKwkJZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICAgJnNlbGYtPnR4X2J1ZmZfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2VsZi0+dHhfYnVmZi5oZWFkID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0MzsKKwl9CisJbWVtc2V0KHNlbGYtPnR4X2J1ZmYuaGVhZCwgMCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSk7CisKKwlzZWxmLT5yeF9idWZmLmluX2ZyYW1lID0gRkFMU0U7CisJc2VsZi0+cnhfYnVmZi5zdGF0ZSA9IE9VVFNJREVfRlJBTUU7CisJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCXNlbGYtPnJ4X2J1ZmYuZGF0YSA9IHNlbGYtPnJ4X2J1ZmYuaGVhZDsKKwkKKwkvKiBSZXNldCBUeCBxdWV1ZSBpbmZvICovCisJc2VsZi0+dHhfZmlmby5sZW4gPSBzZWxmLT50eF9maWZvLnB0ciA9IHNlbGYtPnR4X2ZpZm8uZnJlZSA9IDA7CisJc2VsZi0+dHhfZmlmby50YWlsID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCisJCisJLyogS2VlcCB0cmFjayBvZiBtb2R1bGUgdXNhZ2UgKi8KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwkvKiBPdmVycmlkZSB0aGUgbmV0d29yayBmdW5jdGlvbnMgd2UgbmVlZCB0byB1c2UgKi8KKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGFsaV9pcmNjX3Npcl9oYXJkX3htaXQ7CisJZGV2LT5vcGVuICAgICAgICAgICAgPSBhbGlfaXJjY19uZXRfb3BlbjsKKwlkZXYtPnN0b3AgICAgICAgICAgICA9IGFsaV9pcmNjX25ldF9jbG9zZTsKKwlkZXYtPmRvX2lvY3RsICAgICAgICA9IGFsaV9pcmNjX25ldF9pb2N0bDsKKwlkZXYtPmdldF9zdGF0cwkgICAgID0gYWxpX2lyY2NfbmV0X2dldF9zdGF0czsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJSVJEQV9FUlJPUigiJXMoKSwgcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBlcnJfb3V0NDsKKwl9CisJSVJEQV9NRVNTQUdFKCJJckRBOiBSZWdpc3RlcmVkIGRldmljZSAlc1xuIiwgZGV2LT5uYW1lKTsKKworCS8qIENoZWNrIGRvbmdsZSBpZCAqLworCWRvbmdsZV9pZCA9IGFsaV9pcmNjX3JlYWRfZG9uZ2xlX2lkKGksIGluZm8pOworCUlSREFfTUVTU0FHRSgiJXMoKSwgJXMsIEZvdW5kIGRvbmdsZTogJXNcbiIsIF9fRlVOQ1RJT05fXywgZHJpdmVyX25hbWUsIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdKTsKKwkJCisJc2VsZi0+aW8uZG9uZ2xlX2lkID0gZG9uZ2xlX2lkOworCQorICAgICAgICBwbWRldiA9IHBtX3JlZ2lzdGVyKFBNX1NZU19ERVYsIFBNX1NZU19JUkRBLCBhbGlfaXJjY19wbXByb2MpOworICAgICAgICBpZiAocG1kZXYpCisgICAgICAgICAgICAgICAgcG1kZXYtPmRhdGEgPSBzZWxmOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18pOworCQorCXJldHVybiAwOworCisgZXJyX291dDQ6CisJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSwKKwkJCSAgc2VsZi0+dHhfYnVmZi5oZWFkLCBzZWxmLT50eF9idWZmX2RtYSk7CisgZXJyX291dDM6CisJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSwKKwkJCSAgc2VsZi0+cnhfYnVmZi5oZWFkLCBzZWxmLT5yeF9idWZmX2RtYSk7CisgZXJyX291dDI6CisJcmVsZWFzZV9yZWdpb24oc2VsZi0+aW8uZmlyX2Jhc2UsIHNlbGYtPmlvLmZpcl9leHQpOworIGVycl9vdXQxOgorCWRldl9zZWxmW2ldID0gTlVMTDsKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBlcnI7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX2Nsb3NlIChzZWxmKQorICoKKyAqICAgIENsb3NlIGRyaXZlciBpbnN0YW5jZQorICoKKyAqLworc3RhdGljIGludCBfX2V4aXQgYWxpX2lyY2NfY2xvc2Uoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKQoreworCWludCBpb2Jhc2U7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisgICAgICAgIGlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJLyogUmVtb3ZlIG5ldGRldmljZSAqLworCXVucmVnaXN0ZXJfbmV0ZGV2KHNlbGYtPm5ldGRldik7CisKKwkvKiBSZWxlYXNlIHRoZSBQT1JUIHRoYXQgdGhpcyBkcml2ZXIgaXMgdXNpbmcgKi8KKwlJUkRBX0RFQlVHKDQsICIlcygpLCBSZWxlYXNpbmcgUmVnaW9uICUwM3hcbiIsIF9fRlVOQ1RJT05fXywgc2VsZi0+aW8uZmlyX2Jhc2UpOworCXJlbGVhc2VfcmVnaW9uKHNlbGYtPmlvLmZpcl9iYXNlLCBzZWxmLT5pby5maXJfZXh0KTsKKworCWlmIChzZWxmLT50eF9idWZmLmhlYWQpCisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICBzZWxmLT50eF9idWZmLmhlYWQsIHNlbGYtPnR4X2J1ZmZfZG1hKTsKKwkKKwlpZiAoc2VsZi0+cnhfYnVmZi5oZWFkKQorCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAorCQkJCSAgc2VsZi0+cnhfYnVmZi5oZWFkLCBzZWxmLT5yeF9idWZmX2RtYSk7CisKKwlkZXZfc2VsZltzZWxmLT5pbmRleF0gPSBOVUxMOworCWZyZWVfbmV0ZGV2KHNlbGYtPm5ldGRldik7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18pOworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2NfaW5pdF80MyAoY2hpcCwgaW5mbykKKyAqCisgKiAgICBJbml0aWFsaXplIHRoZSBBTGkgTTE1NDMgY2hpcC4gCisgKi8KK3N0YXRpYyBpbnQgYWxpX2lyY2NfaW5pdF80MyhhbGlfY2hpcF90ICpjaGlwLCBjaGlwaW9fdCAqaW5mbykgCit7CisJLyogQWxsIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gbGlrZSBJL08gYWRkcmVzcywgRE1BIGNoYW5uZWwsIElSUQorCSAqIGFyZSBzZXQgYnkgQklPUworCSAqLworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2NfaW5pdF81MyAoY2hpcCwgaW5mbykKKyAqCisgKiAgICBJbml0aWFsaXplIHRoZSBBTGkgTTE1MzUgY2hpcC4gCisgKi8KK3N0YXRpYyBpbnQgYWxpX2lyY2NfaW5pdF81MyhhbGlfY2hpcF90ICpjaGlwLCBjaGlwaW9fdCAqaW5mbykgCit7CisJLyogQWxsIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gbGlrZSBJL08gYWRkcmVzcywgRE1BIGNoYW5uZWwsIElSUQorCSAqIGFyZSBzZXQgYnkgQklPUworCSAqLworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2NfcHJvYmVfNTMgKGNoaXAsIGluZm8pCisgKiAgICAJCisgKglQcm9iZXMgZm9yIHRoZSBBTGkgTTE1MzVEIG9yIE0xNTM1CisgKi8KK3N0YXRpYyBpbnQgYWxpX2lyY2NfcHJvYmVfNTMoYWxpX2NoaXBfdCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pCit7CisJaW50IGNmZ19iYXNlID0gaW5mby0+Y2ZnX2Jhc2U7CisJaW50IGhpLCBsb3csIHJlZzsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CisJCisJLyogRW50ZXIgQ29uZmlndXJhdGlvbiAqLworCW91dGIoY2hpcC0+ZW50cjEsIGNmZ19iYXNlKTsKKwlvdXRiKGNoaXAtPmVudHIyLCBjZmdfYmFzZSk7CisJCisJLyogU2VsZWN0IExvZ2ljYWwgRGV2aWNlIDUgUmVnaXN0ZXJzIChVQVJUMikgKi8KKwlvdXRiKDB4MDcsIGNmZ19iYXNlKTsKKwlvdXRiKDB4MDUsIGNmZ19iYXNlKzEpOworCQorCS8qIFJlYWQgYWRkcmVzcyBjb250cm9sIHJlZ2lzdGVyICovCisJb3V0YigweDYwLCBjZmdfYmFzZSk7CisJaGkgPSBpbmIoY2ZnX2Jhc2UrMSk7CQorCW91dGIoMHg2MSwgY2ZnX2Jhc2UpOworCWxvdyA9IGluYihjZmdfYmFzZSsxKTsKKwlpbmZvLT5maXJfYmFzZSA9IChoaTw8OCkgKyBsb3c7CisJCisJaW5mby0+c2lyX2Jhc2UgPSBpbmZvLT5maXJfYmFzZTsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBwcm9iaW5nIGZpcl9iYXNlPTB4JTAzeFxuIiwgX19GVU5DVElPTl9fLCBpbmZvLT5maXJfYmFzZSk7CisJCQorCS8qIFJlYWQgSVJRIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlvdXRiKDB4NzAsIGNmZ19iYXNlKTsKKwlyZWcgPSBpbmIoY2ZnX2Jhc2UrMSk7CisJaW5mby0+aXJxID0gcmVnICYgMHgwZjsKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBwcm9iaW5nIGlycT0lZFxuIiwgX19GVU5DVElPTl9fLCBpbmZvLT5pcnEpOworCQorCS8qIFJlYWQgRE1BIGNoYW5uZWwgKi8KKwlvdXRiKDB4NzQsIGNmZ19iYXNlKTsKKwlyZWcgPSBpbmIoY2ZnX2Jhc2UrMSk7CisJaW5mby0+ZG1hID0gcmVnICYgMHgwNzsKKwkKKwlpZihpbmZvLT5kbWEgPT0gMHgwNCkKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBObyBETUEgY2hhbm5lbCBhc3NpZ25lZCAhXG4iLCBfX0ZVTkNUSU9OX18pOworCWVsc2UKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgcHJvYmluZyBkbWE9JWRcbiIsIF9fRlVOQ1RJT05fXywgaW5mby0+ZG1hKTsKKwkKKwkvKiBSZWFkIEVuYWJsZWQgU3RhdHVzICovCisJb3V0YigweDMwLCBjZmdfYmFzZSk7CisJcmVnID0gaW5iKGNmZ19iYXNlKzEpOworCWluZm8tPmVuYWJsZWQgPSAocmVnICYgMHg4MCkgJiYgKHJlZyAmIDB4MDEpOworCUlSREFfREVCVUcoMiwgIiVzKCksIHByb2JpbmcgZW5hYmxlZD0lZFxuIiwgX19GVU5DVElPTl9fLCBpbmZvLT5lbmFibGVkKTsKKwkKKwkvKiBSZWFkIFBvd2VyIFN0YXR1cyAqLworCW91dGIoMHgyMiwgY2ZnX2Jhc2UpOworCXJlZyA9IGluYihjZmdfYmFzZSsxKTsKKwlpbmZvLT5zdXNwZW5kZWQgPSAocmVnICYgMHgyMCk7CisJSVJEQV9ERUJVRygyLCAiJXMoKSwgcHJvYmluZyBzdXNwZW5kZWQ9JWRcbiIsIF9fRlVOQ1RJT05fXywgaW5mby0+c3VzcGVuZGVkKTsKKwkKKwkvKiBFeGl0IGNvbmZpZ3VyYXRpb24gKi8KKwlvdXRiKDB4YmIsIGNmZ19iYXNlKTsKKwkJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18pOwkKKwkKKwlyZXR1cm4gMDsJCit9CisKKy8qCisgKiBGdW5jdGlvbiBhbGlfaXJjY19zZXR1cCAoaW5mbykKKyAqCisgKiAgICAJU2V0IEZJUiBGSUZPIGFuZCBETUEgVGhyZXNob2xkCisgKglSZXR1cm5zIG5vbi1uZWdhdGl2ZSBvbiBzdWNjZXNzLgorICoKKyAqLworc3RhdGljIGludCBhbGlfaXJjY19zZXR1cChjaGlwaW9fdCAqaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKwlpbnQgdmVyc2lvbjsKKwlpbnQgaW9iYXNlID0gaW5mby0+ZmlyX2Jhc2U7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18pOworCQorCS8qIExvY2tpbmcgY29tbWVudHMgOgorCSAqIE1vc3Qgb3BlcmF0aW9ucyBoZXJlIG5lZWQgdG8gYmUgcHJvdGVjdGVkLiBXZSBhcmUgY2FsbGVkIGJlZm9yZQorCSAqIHRoZSBkZXZpY2UgaW5zdGFuY2UgaXMgY3JlYXRlZCBpbiBhbGlfaXJjY19vcGVuKCksIHRoZXJlZm9yZSAKKwkgKiBub2JvZHkgY2FuIGJvdGhlciB1cyAtIEplYW4gSUkgKi8KKworCS8qIFN3aXRjaCB0byBGSVIgc3BhY2UgKi8KKwlTSVIyRklSKGlvYmFzZSk7CisJCisJLyogTWFzdGVyIFJlc2V0ICovCisJb3V0YigweDQwLCBpb2Jhc2UrRklSX01DUik7IC8vIGJlbmphbWluIDIwMDAvMTEvMzAgMTE6NDVBTQorCQorCS8qIFJlYWQgRklSIElEIFZlcnNpb24gUmVnaXN0ZXIgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkszKTsKKwl2ZXJzaW9uID0gaW5iKGlvYmFzZStGSVJfSURfVlIpOworCQorCS8qIFNob3VsZCBiZSAweDAwIGluIHRoZSBNMTUzNS9NMTUzNUQgKi8KKwlpZih2ZXJzaW9uICE9IDB4MDApCisJeworCQlJUkRBX0VSUk9SKCIlcywgV3JvbmcgY2hpcCB2ZXJzaW9uICUwMnhcbiIsIGRyaXZlcl9uYW1lLCB2ZXJzaW9uKTsKKwkJcmV0dXJuIC0xOworCX0KKwkKKwkvLyBJUkRBX01FU1NBR0UoIiVzLCBGb3VuZCBjaGlwIGF0IGJhc2U9MHglMDN4XG4iLCBkcml2ZXJfbmFtZSwgaW5mby0+Y2ZnX2Jhc2UpOworCQorCS8qIFNldCBGSVIgRklGTyBUaHJlc2hvbGQgUmVnaXN0ZXIgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksxKTsKKwlvdXRiKFJYX0ZJRk9fVGhyZXNob2xkLCBpb2Jhc2UrRklSX0ZJRk9fVFIpOworCQorCS8qIFNldCBGSVIgRE1BIFRocmVzaG9sZCBSZWdpc3RlciAqLworCW91dGIoUlhfRE1BX1RocmVzaG9sZCwgaW9iYXNlK0ZJUl9ETUFfVFIpOworCQorCS8qIENSQyBlbmFibGUgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksyKTsKKwlvdXRiKGluYihpb2Jhc2UrRklSX0lSREFfQ1IpIHwgSVJEQV9DUl9DUkMsIGlvYmFzZStGSVJfSVJEQV9DUik7CisJCisJLyogTkRJUyBkcml2ZXIgc2V0IFRYIExlbmd0aCBoZXJlIEJBTksyIEFsaWFzIDMsIEFsaWFzNCovCisJCisJLyogU3dpdGNoIHRvIEJhbmsgMCAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCQorCXRtcCA9IGluYihpb2Jhc2UrRklSX0xDUl9CKTsKKwl0bXAgJj1+MHgyMDsgLy8gZGlzYWJsZSBTSVAKKwl0bXAgfD0gMHg4MDsgLy8gdGhlc2UgdHdvIHN0ZXBzIG1ha2UgUlggbW9kZQorCXRtcCAmPSAweGJmOwkKKwlvdXRiKHRtcCwgaW9iYXNlK0ZJUl9MQ1JfQik7CisJCQorCS8qIERpc2FibGUgSW50ZXJydXB0ICovCisJb3V0YigweDAwLCBpb2Jhc2UrRklSX0lFUik7CisJCisJCisJLyogU3dpdGNoIHRvIFNJUiBzcGFjZSAqLworCUZJUjJTSVIoaW9iYXNlKTsKKwkKKwlJUkRBX01FU1NBR0UoIiVzLCBkcml2ZXIgbG9hZGVkIChCZW5qYW1pbiBLb25nKVxuIiwgZHJpdmVyX25hbWUpOworCQorCS8qIEVuYWJsZSByZWNlaXZlIGludGVycnVwdHMgKi8gCisJLy8gb3V0YihVQVJUX0lFUl9SREksIGlvYmFzZStVQVJUX0lFUik7IC8vYmVuamFtaW4gMjAwMC8xMS8yMyAwMToyNVBNCisJLy8gVHVybiBvbiB0aGUgaW50ZXJydXB0cyBpbiBhbGlfaXJjY19uZXRfb3BlbgorCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CQorCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2NfcmVhZF9kb25nbGVfaWQgKGludCBpbmRleCwgaW5mbykKKyAqCisgKiBUcnkgdG8gcmVhZCBkb25nbGUgaW5kZW50aWZpY2F0aW9uLiBUaGlzIHByb2NlZHVyZSBuZWVkcyB0byBiZSBleGVjdXRlZAorICogb25jZSBhZnRlciBwb3dlci1vbi9yZXNldC4gSXQgYWxzbyBuZWVkcyB0byBiZSB1c2VkIHdoZW5ldmVyIHlvdSBzdXNwZWN0CisgKiB0aGF0IHRoZSB1c2VyIG1heSBoYXZlIHBsdWdnZWQvdW5wbHVnZ2VkIHRoZSBJckRBIERvbmdsZS4KKyAqLworc3RhdGljIGludCBhbGlfaXJjY19yZWFkX2RvbmdsZV9pZCAoaW50IGksIGNoaXBpb190ICppbmZvKQoreworCWludCBkb25nbGVfaWQsIHJlZzsKKwlpbnQgY2ZnX2Jhc2UgPSBpbmZvLT5jZmdfYmFzZTsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQorCS8qIEVudGVyIENvbmZpZ3VyYXRpb24gKi8KKwlvdXRiKGNoaXBzW2ldLmVudHIxLCBjZmdfYmFzZSk7CisJb3V0YihjaGlwc1tpXS5lbnRyMiwgY2ZnX2Jhc2UpOworCQorCS8qIFNlbGVjdCBMb2dpY2FsIERldmljZSA1IFJlZ2lzdGVycyAoVUFSVDIpICovCisJb3V0YigweDA3LCBjZmdfYmFzZSk7CisJb3V0YigweDA1LCBjZmdfYmFzZSsxKTsKKwkKKwkvKiBSZWFkIERvbmdsZSBJRCAqLworCW91dGIoMHhmMCwgY2ZnX2Jhc2UpOworCXJlZyA9IGluYihjZmdfYmFzZSsxKTsJCisJZG9uZ2xlX2lkID0gKChyZWc+PjYpJjB4MDIpIHwgKChyZWc+PjUpJjB4MDEpOworCUlSREFfREVCVUcoMiwgIiVzKCksIHByb2JpbmcgZG9uZ2xlX2lkPSVkLCBkb25nbGVfdHlwZXM9JXNcbiIsIF9fRlVOQ1RJT05fXywgCisJCWRvbmdsZV9pZCwgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0pOworCQorCS8qIEV4aXQgY29uZmlndXJhdGlvbiAqLworCW91dGIoMHhiYiwgY2ZnX2Jhc2UpOworCQkJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fKTsJCisJCisJcmV0dXJuIGRvbmdsZV9pZDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX2ludGVycnVwdCAoaXJxLCBkZXZfaWQsIHJlZ3MpCisgKgorICogICAgQW4gaW50ZXJydXB0IGZyb20gdGhlIGNoaXAgaGFzIGFycml2ZWQuIFRpbWUgdG8gZG8gc29tZSB3b3JrCisgKgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYWxpX2lyY2NfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmOworCWludCByZXQ7CisJCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCisgCWlmICghZGV2KSB7CisJCUlSREFfV0FSTklORygiJXM6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBkcml2ZXJfbmFtZSwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0JCisJCisJc2VsZiA9IChzdHJ1Y3QgYWxpX2lyY2NfY2IgKikgZGV2LT5wcml2OworCQorCXNwaW5fbG9jaygmc2VsZi0+bG9jayk7CisJCisJLyogRGlzcGF0Y2ggaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBjdXJyZW50IHNwZWVkICovCisJaWYgKHNlbGYtPmlvLnNwZWVkID4gMTE1MjAwKQorCQlyZXQgPSBhbGlfaXJjY19maXJfaW50ZXJydXB0KHNlbGYpOworCWVsc2UKKwkJcmV0ID0gYWxpX2lyY2Nfc2lyX2ludGVycnVwdChzZWxmKTsKKwkJCisJc3Bpbl91bmxvY2soJnNlbGYtPmxvY2spOworCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIHJldDsKK30KKy8qCisgKiBGdW5jdGlvbiBhbGlfaXJjY19maXJfaW50ZXJydXB0KGlycSwgc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKQorICoKKyAqICAgIEhhbmRsZSBNSVIvRklSIGludGVycnVwdAorICoKKyAqLworc3RhdGljIGlycXJldHVybl90IGFsaV9pcmNjX2Zpcl9pbnRlcnJ1cHQoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKQoreworCV9fdTggZWlyLCBPbGRNZXNzYWdlQ291bnQ7CisJaW50IGlvYmFzZSwgdG1wOworCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fKTsKKwkKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwkKKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsJCisJc2VsZi0+SW50ZXJydXB0SUQgPSBpbmIoaW9iYXNlK0ZJUl9JSVIpOwkJCisJc2VsZi0+QnVzU3RhdHVzID0gaW5iKGlvYmFzZStGSVJfQlNSKTsJCisJCisJT2xkTWVzc2FnZUNvdW50ID0gKHNlbGYtPkxpbmVTdGF0dXMgKyAxKSAmIDB4MDc7CisJc2VsZi0+TGluZVN0YXR1cyA9IGluYihpb2Jhc2UrRklSX0xTUik7CQorCS8vc2VsZi0+aWVyID0gaW5iKGlvYmFzZStGSVJfSUVSKTsgCQkyMDAwLzEyLzEgMDQ6MzJQTQorCWVpciA9IHNlbGYtPkludGVycnVwdElEICYgc2VsZi0+aWVyOyAvKiBNYXNrIG91dCB0aGUgaW50ZXJlc3Rpbmcgb25lcyAqLyAKKwkKKwlJUkRBX0RFQlVHKDEsICIlcygpLCBzZWxmLT5JbnRlcnJ1cHRJRCA9ICV4XG4iLCBfX0ZVTkNUSU9OX18sc2VsZi0+SW50ZXJydXB0SUQpOworCUlSREFfREVCVUcoMSwgIiVzKCksIHNlbGYtPkxpbmVTdGF0dXMgPSAleFxuIiwgX19GVU5DVElPTl9fLHNlbGYtPkxpbmVTdGF0dXMpOworCUlSREFfREVCVUcoMSwgIiVzKCksIHNlbGYtPmllciA9ICV4XG4iLCBfX0ZVTkNUSU9OX18sc2VsZi0+aWVyKTsKKwlJUkRBX0RFQlVHKDEsICIlcygpLCBlaXIgPSAleFxuIiwgX19GVU5DVElPTl9fLGVpcik7CisJCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJIFNldENPTUludGVycnVwdHMoc2VsZiwgRkFMU0UpOworCQorCS8qIFR4IG9yIFJ4IEludGVycnVwdCAqLworCQorCWlmIChlaXIgJiBJSVJfRU9NKSAKKwl7CQkKKwkJaWYgKHNlbGYtPmlvLmRpcmVjdGlvbiA9PSBJT19YTUlUKSAvKiBUWCAqLworCQl7CisJCQlJUkRBX0RFQlVHKDEsICIlcygpLCAqKioqKioqIElJUl9FT00gKFR4KSAqKioqKioqXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCisJCQlpZihhbGlfaXJjY19kbWFfeG1pdF9jb21wbGV0ZShzZWxmKSkKKwkJCXsKKwkJCQlpZiAoaXJkYV9kZXZpY2VfdHhxdWV1ZV9lbXB0eShzZWxmLT5uZXRkZXYpKSAKKwkJCQl7CisJCQkJCS8qIFByZXBhcmUgZm9yIHJlY2VpdmUgKi8KKwkJCQkJYWxpX2lyY2NfZG1hX3JlY2VpdmUoc2VsZik7CQkJCQkKKwkJCQkJc2VsZi0+aWVyID0gSUVSX0VPTTsJCQkJCQkJCQkKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc2VsZi0+aWVyID0gSUVSX0VPTTsgCQkJCQkKKwkJCX0KKwkJCQkJCQkJCQorCQl9CQorCQllbHNlIC8qIFJYICovCisJCXsKKwkJCUlSREFfREVCVUcoMSwgIiVzKCksICoqKioqKiogSUlSX0VPTSAoUngpICoqKioqKipcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkKKwkJCWlmKE9sZE1lc3NhZ2VDb3VudCA+ICgoc2VsZi0+TGluZVN0YXR1cysxKSAmIDB4MDcpKQorCQkJeworCQkJCXNlbGYtPnJjdkZyYW1lc092ZXJmbG93ID0gVFJVRTsJCisJCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgKioqKioqKiBzZWxmLT5yY3ZGcmFtZXNPdmVyZmxvdyA9IFRSVUUgKioqKioqKiogXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJfQorCQkJCQkJCisJCQlpZiAoYWxpX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc2VsZikpCisJCQl7CisJCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgKioqKioqKiByZWNlaXZlIGNvbXBsZXRlICoqKioqKioqIFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQkKKwkJCQlzZWxmLT5pZXIgPSBJRVJfRU9NOwkJCQkKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlJUkRBX0RFQlVHKDEsICIlcygpLCAqKioqKioqIE5vdCByZWNlaXZlIGNvbXBsZXRlICoqKioqKioqIFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQkKKwkJCQlzZWxmLT5pZXIgPSBJRVJfRU9NIHwgSUVSX1RJTUVSOwkJCQkJCQkJCisJCQl9CQorCQkKKwkJfQkJCisJfQorCS8qIFRpbWVyIEludGVycnVwdCAqLworCWVsc2UgaWYgKGVpciAmIElJUl9USU1FUikKKwl7CQorCQlpZihPbGRNZXNzYWdlQ291bnQgPiAoKHNlbGYtPkxpbmVTdGF0dXMrMSkgJiAweDA3KSkKKwkJeworCQkJc2VsZi0+cmN2RnJhbWVzT3ZlcmZsb3cgPSBUUlVFOwkKKwkJCUlSREFfREVCVUcoMSwgIiVzKCksICoqKioqKiogc2VsZi0+cmN2RnJhbWVzT3ZlcmZsb3cgPSBUUlVFICoqKioqKiogXG4iLCBfX0ZVTkNUSU9OX18pOworCQl9CisJCS8qIERpc2FibGUgVGltZXIgKi8KKwkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMSk7CisJCXRtcCA9IGluYihpb2Jhc2UrRklSX0NSKTsKKwkJb3V0YiggdG1wJiB+Q1JfVElNRVJfRU4sIGlvYmFzZStGSVJfQ1IpOworCQkKKwkJLyogQ2hlY2sgaWYgdGhpcyBpcyBhIFR4IHRpbWVyIGludGVycnVwdCAqLworCQlpZiAoc2VsZi0+aW8uZGlyZWN0aW9uID09IElPX1hNSVQpCisJCXsKKwkJCWFsaV9pcmNjX2RtYV94bWl0KHNlbGYpOworCQkJCisJCQkvKiBJbnRlcnJ1cHQgb24gRU9NICovCisJCQlzZWxmLT5pZXIgPSBJRVJfRU9NOworCQkJCQkJCQkJCisJCX0KKwkJZWxzZSAvKiBSeCAqLworCQl7CisJCQlpZihhbGlfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzZWxmKSkgCisJCQl7CisJCQkJc2VsZi0+aWVyID0gSUVSX0VPTTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlzZWxmLT5pZXIgPSBJRVJfRU9NIHwgSUVSX1RJTUVSOworCQkJfQkKKwkJfQkJCisJfQorCQorCS8qIFJlc3RvcmUgSW50ZXJydXB0ICovCQorCVNldENPTUludGVycnVwdHMoc2VsZiwgVFJVRSk7CQorCQkKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18pOworCXJldHVybiBJUlFfUkVUVkFMKGVpcik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhbGlfaXJjY19zaXJfaW50ZXJydXB0IChpcnEsIHNlbGYsIGVpcikKKyAqCisgKiAgICBIYW5kbGUgU0lSIGludGVycnVwdAorICoKKyAqLworc3RhdGljIGlycXJldHVybl90IGFsaV9pcmNjX3Npcl9pbnRlcnJ1cHQoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKQoreworCWludCBpb2Jhc2U7CisJaW50IGlpciwgbHNyOworCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fKTsKKwkKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKworCWlpciA9IGluYihpb2Jhc2UrVUFSVF9JSVIpICYgVUFSVF9JSVJfSUQ7CisJaWYgKGlpcikgewkKKwkJLyogQ2xlYXIgaW50ZXJydXB0ICovCisJCWxzciA9IGluYihpb2Jhc2UrVUFSVF9MU1IpOworCisJCUlSREFfREVCVUcoNCwgIiVzKCksIGlpcj0lMDJ4LCBsc3I9JTAyeCwgaW9iYXNlPSUjeFxuIiwgX19GVU5DVElPTl9fLCAKKwkJCSAgIGlpciwgbHNyLCBpb2Jhc2UpOworCisJCXN3aXRjaCAoaWlyKSAKKwkJeworCQkJY2FzZSBVQVJUX0lJUl9STFNJOgorCQkJCUlSREFfREVCVUcoMiwgIiVzKCksIFJMU0lcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQkJYnJlYWs7CisJCQljYXNlIFVBUlRfSUlSX1JESToKKwkJCQkvKiBSZWNlaXZlIGludGVycnVwdCAqLworCQkJCWFsaV9pcmNjX3Npcl9yZWNlaXZlKHNlbGYpOworCQkJCWJyZWFrOworCQkJY2FzZSBVQVJUX0lJUl9USFJJOgorCQkJCWlmIChsc3IgJiBVQVJUX0xTUl9USFJFKQorCQkJCXsKKwkJCQkJLyogVHJhbnNtaXR0ZXIgcmVhZHkgZm9yIGRhdGEgKi8KKwkJCQkJYWxpX2lyY2Nfc2lyX3dyaXRlX3dha2V1cChzZWxmKTsJCQkJCisJCQkJfQkJCQkKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5oYW5kbGVkIElJUj0lI3hcbiIsIF9fRlVOQ1RJT05fXywgaWlyKTsKKwkJCQlicmVhazsKKwkJfSAKKwkJCisJfQorCQorCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CQorCisJcmV0dXJuIElSUV9SRVRWQUwoaWlyKTsKK30KKworCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2Nfc2lyX3JlY2VpdmUgKHNlbGYpCisgKgorICogICAgUmVjZWl2ZSBvbmUgZnJhbWUgZnJvbSB0aGUgaW5mcmFyZWQgcG9ydAorICoKKyAqLworc3RhdGljIHZvaWQgYWxpX2lyY2Nfc2lyX3JlY2VpdmUoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKSAKK3sKKwlpbnQgYm9ndXNjb3VudCA9IDA7CisJaW50IGlvYmFzZTsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyk7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCisJLyogIAorCSAqIFJlY2VpdmUgYWxsIGNoYXJhY3RlcnMgaW4gUnggRklGTywgdW53cmFwIGFuZCB1bnN0dWZmIHRoZW0uIAorICAgICAgICAgKiBhc3luY191bndyYXBfY2hhciB3aWxsIGRlbGl2ZXIgYWxsIGZvdW5kIGZyYW1lcyAgCisJICovCisJZG8geworCQlhc3luY191bndyYXBfY2hhcihzZWxmLT5uZXRkZXYsICZzZWxmLT5zdGF0cywgJnNlbGYtPnJ4X2J1ZmYsIAorCQkJCSAgaW5iKGlvYmFzZStVQVJUX1JYKSk7CisKKwkJLyogTWFrZSBzdXJlIHdlIGRvbid0IHN0YXkgaGVyZSB0b28gbG9uZyAqLworCQlpZiAoYm9ndXNjb3VudCsrID4gMzIpIHsKKwkJCUlSREFfREVCVUcoMiwiJXMoKSwgYnJlYWtpbmchXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChpbmIoaW9iYXNlK1VBUlRfTFNSKSAmIFVBUlRfTFNSX0RSKTsJCisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorfQorCisvKgorICogRnVuY3Rpb24gYWxpX2lyY2Nfc2lyX3dyaXRlX3dha2V1cCAodHR5KQorICoKKyAqICAgIENhbGxlZCBieSB0aGUgZHJpdmVyIHdoZW4gdGhlcmUncyByb29tIGZvciBtb3JlIGRhdGEuICBJZiB3ZSBoYXZlCisgKiAgICBtb3JlIHBhY2tldHMgdG8gc2VuZCwgd2Ugc2VuZCB0aGVtIGhlcmUuCisgKgorICovCitzdGF0aWMgdm9pZCBhbGlfaXJjY19zaXJfd3JpdGVfd2FrZXVwKHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgYWN0dWFsID0gMDsKKwlpbnQgaW9iYXNlOwkKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOworCQorCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCisJLyogRmluaXNoZWQgd2l0aCBmcmFtZT8gICovCisJaWYgKHNlbGYtPnR4X2J1ZmYubGVuID4gMCkgIAorCXsKKwkJLyogV3JpdGUgZGF0YSBsZWZ0IGluIHRyYW5zbWl0IGJ1ZmZlciAqLworCQlhY3R1YWwgPSBhbGlfaXJjY19zaXJfd3JpdGUoaW9iYXNlLCBzZWxmLT5pby5maWZvX3NpemUsIAorCQkJCSAgICAgIHNlbGYtPnR4X2J1ZmYuZGF0YSwgc2VsZi0+dHhfYnVmZi5sZW4pOworCQlzZWxmLT50eF9idWZmLmRhdGEgKz0gYWN0dWFsOworCQlzZWxmLT50eF9idWZmLmxlbiAgLT0gYWN0dWFsOworCX0gCisJZWxzZSAKKwl7CisJCWlmIChzZWxmLT5uZXdfc3BlZWQpIAorCQl7CisJCQkvKiBXZSBtdXN0IHdhaXQgdW50aWwgYWxsIGRhdGEgYXJlIGdvbmUgKi8KKwkJCXdoaWxlKCEoaW5iKGlvYmFzZStVQVJUX0xTUikgJiBVQVJUX0xTUl9URU1UKSkKKwkJCQlJUkRBX0RFQlVHKDEsICIlcygpLCBVQVJUX0xTUl9USFJFXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCQorCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgQ2hhbmdpbmcgc3BlZWQhIHNlbGYtPm5ld19zcGVlZCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18gLCBzZWxmLT5uZXdfc3BlZWQpOworCQkJYWxpX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIHNlbGYtPm5ld19zcGVlZCk7CisJCQlzZWxmLT5uZXdfc3BlZWQgPSAwOwkJCQorCQkJCisJCQkvLyBiZW5qYW1pbiAyMDAwLzExLzEwIDA2OjMyUE0KKwkJCWlmIChzZWxmLT5pby5zcGVlZCA+IDExNTIwMCkKKwkJCXsKKwkJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBhbGlfaXJjY19jaGFuZ2Vfc3BlZWQgZnJvbSBVQVJUX0xTUl9URU1UIFxuIiwgX19GVU5DVElPTl9fICk7CQkJCQorCQkJCQkKKwkJCQlzZWxmLT5pZXIgPSBJRVJfRU9NOworCQkJCS8vIFNldENPTUludGVycnVwdHMoc2VsZiwgVFJVRSk7CQkJCQkJCQorCQkJCXJldHVybjsJCQkJCQkJCisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CQorCQl9CisJCQkKKwkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworCQkKKwkJLyogVHVybiBvbiByZWNlaXZlIGludGVycnVwdHMgKi8KKwkJb3V0YihVQVJUX0lFUl9SREksIGlvYmFzZStVQVJUX0lFUik7CisJfQorCQkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsJCit9CisKK3N0YXRpYyB2b2lkIGFsaV9pcmNjX2NoYW5nZV9zcGVlZChzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYsIF9fdTMyIGJhdWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNlbGYtPm5ldGRldjsKKwlpbnQgaW9iYXNlOworCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgc2V0dGluZyBzcGVlZCA9ICVkIFxuIiwgX19GVU5DVElPTl9fICwgYmF1ZCk7CisJCisJLyogVGhpcyBmdW5jdGlvbiAqbXVzdCogYmUgY2FsbGVkIHdpdGggaXJxIG9mZiBhbmQgc3Bpbi1sb2NrLgorCSAqIC0gSmVhbiBJSSAqLworCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJCisJU2V0Q09NSW50ZXJydXB0cyhzZWxmLCBGQUxTRSk7IC8vIDIwMDAvMTEvMjQgMTE6NDNBTQorCQorCS8qIEdvIHRvIE1JUiwgRklSIFNwZWVkICovCisJaWYgKGJhdWQgPiAxMTUyMDApCisJeworCQkKKwkJCQkJCisJCWFsaV9pcmNjX2Zpcl9jaGFuZ2Vfc3BlZWQoc2VsZiwgYmF1ZCk7CQkJCisJCQorCQkvKiBJbnN0YWxsIEZJUiB4bWl0IGhhbmRsZXIqLworCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGFsaV9pcmNjX2Zpcl9oYXJkX3htaXQ7CQkKKwkJCQkKKwkJLyogRW5hYmxlIEludGVydXVwdCAqLworCQlzZWxmLT5pZXIgPSBJRVJfRU9NOyAvLyBiZW5qYW1pbiAyMDAwLzExLzIwIDA3OjI0UE0JCQkJCQorCQkJCQorCQkvKiBCZSByZWFkeSBmb3IgaW5jb21taW5nIGZyYW1lcyAqLworCQlhbGlfaXJjY19kbWFfcmVjZWl2ZShzZWxmKTsJLy8gYmVuYWptaW4gMjAwMC8xMS84IDA3OjQ2UE0gbm90IGNvbXBsZXRlCisJfQkKKwkvKiBHbyB0byBTSVIgU3BlZWQgKi8KKwllbHNlCisJeworCQlhbGlfaXJjY19zaXJfY2hhbmdlX3NwZWVkKHNlbGYsIGJhdWQpOworCQkJCQorCQkvKiBJbnN0YWxsIFNJUiB4bWl0IGhhbmRsZXIqLworCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGFsaV9pcmNjX3Npcl9oYXJkX3htaXQ7CisJfQorCQorCQkKKwlTZXRDT01JbnRlcnJ1cHRzKHNlbGYsIFRSVUUpOwkvLyAyMDAwLzExLzI0IDExOjQzQU0KKwkJCisJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOwkKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsJCit9CisKK3N0YXRpYyB2b2lkIGFsaV9pcmNjX2Zpcl9jaGFuZ2Vfc3BlZWQoc3RydWN0IGFsaV9pcmNjX2NiICpwcml2LCBfX3UzMiBiYXVkKQoreworCQkKKwlpbnQgaW9iYXNlOyAKKwlzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYgPSAoc3RydWN0IGFsaV9pcmNjX2NiICopIHByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CisJCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlkZXYgPSBzZWxmLT5uZXRkZXY7CisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgc2VsZi0+aW8uc3BlZWQgPSAlZCwgY2hhbmdlIHRvIHNwZWVkID0gJWRcbiIsIF9fRlVOQ1RJT05fXyAsc2VsZi0+aW8uc3BlZWQsYmF1ZCk7CisJCisJLyogQ29tZSBmcm9tIFNJUiBzcGVlZCAqLworCWlmKHNlbGYtPmlvLnNwZWVkIDw9MTE1MjAwKQorCXsKKwkJU0lSMkZJUihpb2Jhc2UpOworCX0KKwkJCisJLyogVXBkYXRlIGFjY291bnRpbmcgZm9yIG5ldyBzcGVlZCAqLworCXNlbGYtPmlvLnNwZWVkID0gYmF1ZDsKKwkJCisJLy8gU2V0IERvbmdsZSBTcGVlZCBtb2RlCisJYWxpX2lyY2NfY2hhbmdlX2RvbmdsZV9zcGVlZChzZWxmLCBiYXVkKTsKKwkJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorfQorCisvKgorICogRnVuY3Rpb24gYWxpX3Npcl9jaGFuZ2Vfc3BlZWQgKHNlbGYsIHNwZWVkKQorICoKKyAqICAgIFNldCBzcGVlZCBvZiBJckRBIHBvcnQgdG8gc3BlY2lmaWVkIGJhdWRyYXRlCisgKgorICovCitzdGF0aWMgdm9pZCBhbGlfaXJjY19zaXJfY2hhbmdlX3NwZWVkKHN0cnVjdCBhbGlfaXJjY19jYiAqcHJpdiwgX191MzIgc3BlZWQpCit7CisJc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmID0gKHN0cnVjdCBhbGlfaXJjY19jYiAqKSBwcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGlvYmFzZTsgCisJaW50IGZjcjsgICAgLyogRklGTyBjb250cm9sIHJlZyAqLworCWludCBsY3I7ICAgIC8qIExpbmUgY29udHJvbCByZWcgKi8KKwlpbnQgZGl2aXNvcjsKKworCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgU2V0dGluZyBzcGVlZCB0bzogJWRcbiIsIF9fRlVOQ1RJT05fXyAsIHNwZWVkKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKwkKKwkvKiBDb21lIGZyb20gTUlSIG9yIEZJUiBzcGVlZCAqLworCWlmKHNlbGYtPmlvLnNwZWVkID4xMTUyMDApCisJewkKKwkJLy8gU2V0IERvbmdsZSBTcGVlZCBtb2RlIGZpcnN0CisJCWFsaV9pcmNjX2NoYW5nZV9kb25nbGVfc3BlZWQoc2VsZiwgc3BlZWQpOworCQkJCisJCUZJUjJTSVIoaW9iYXNlKTsKKwl9CisJCQorCS8vIENsZWFyIExpbmUgYW5kIEF1eGlsdWFyeSBzdGF0dXMgcmVnaXN0ZXJzIDIwMDAvMTEvMjQgMTE6NDdBTQorCQkKKwlpbmIoaW9iYXNlK1VBUlRfTFNSKTsKKwlpbmIoaW9iYXNlK1VBUlRfU0NSKTsKKwkJCisJLyogVXBkYXRlIGFjY291bnRpbmcgZm9yIG5ldyBzcGVlZCAqLworCXNlbGYtPmlvLnNwZWVkID0gc3BlZWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJZGl2aXNvciA9IDExNTIwMC9zcGVlZDsKKwkKKwlmY3IgPSBVQVJUX0ZDUl9FTkFCTEVfRklGTzsKKworCS8qIAorCSAqIFVzZSB0cmlnZ2VyIGxldmVsIDEgdG8gYXZvaWQgMyBtcy4gdGltZW91dCBkZWxheSBhdCA5NjAwIGJwcywgYW5kCisJICogYWxtb3N0IDEsNyBtcyBhdCAxOTIwMCBicHMuIEF0IHNwZWVkcyBhYm92ZSB0aGF0IHdlIGNhbiBqdXN0IGZvcmdldAorCSAqIGFib3V0IHRoaXMgdGltZW91dCBzaW5jZSBpdCB3aWxsIGFsd2F5cyBiZSBmYXN0IGVub3VnaC4gCisJICovCisJaWYgKHNlbGYtPmlvLnNwZWVkIDwgMzg0MDApCisJCWZjciB8PSBVQVJUX0ZDUl9UUklHR0VSXzE7CisJZWxzZSAKKwkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfMTQ7CisgICAgICAgIAorCS8qIElyREEgcG9ydHMgdXNlIDhOMSAqLworCWxjciA9IFVBUlRfTENSX1dMRU44OworCQorCW91dGIoVUFSVF9MQ1JfRExBQiB8IGxjciwgaW9iYXNlK1VBUlRfTENSKTsgLyogU2V0IERMQUIgKi8KKwlvdXRiKGRpdmlzb3IgJiAweGZmLCAgICAgIGlvYmFzZStVQVJUX0RMTCk7IC8qIFNldCBzcGVlZCAqLworCW91dGIoZGl2aXNvciA+PiA4LAkgIGlvYmFzZStVQVJUX0RMTSk7CisJb3V0YihsY3IsCQkgIGlvYmFzZStVQVJUX0xDUik7IC8qIFNldCA4TjEJKi8KKwlvdXRiKGZjciwJCSAgaW9iYXNlK1VBUlRfRkNSKTsgLyogRW5hYmxlIEZJRk8ncyAqLworCisJLyogd2l0aG91dCB0aGlzLCB0aGUgY29uZWN0aW9uIHdpbGwgYmUgYnJva2VuIGFmdGVyIGNvbWUgYmFjayBmcm9tIEZJUiBzcGVlZCwKKwkgICBidXQgd2l0aCB0aGlzLCB0aGUgU0lSIGNvbm5lY3Rpb24gaXMgaGFyZGVyIHRvIGVzdGFibGlzaGVkICovCisJb3V0YigoVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTIHwgVUFSVF9NQ1JfT1VUMiksIGlvYmFzZStVQVJUX01DUik7CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKK30KKworc3RhdGljIHZvaWQgYWxpX2lyY2NfY2hhbmdlX2RvbmdsZV9zcGVlZChzdHJ1Y3QgYWxpX2lyY2NfY2IgKnByaXYsIGludCBzcGVlZCkKK3sKKwkKKwlzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYgPSAoc3RydWN0IGFsaV9pcmNjX2NiICopIHByaXY7CisJaW50IGlvYmFzZSxkb25nbGVfaWQ7CisJaW50IHRtcCA9IDA7CisJCQkKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKKwkKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsgCS8qIG9yIGlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOyAqLworCWRvbmdsZV9pZCA9IHNlbGYtPmlvLmRvbmdsZV9pZDsKKwkKKwkvKiBXZSBhcmUgYWxyZWFkeSBsb2NrZWQsIG5vIG5lZWQgdG8gZG8gaXQgYWdhaW4gKi8KKwkJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgU2V0IFNwZWVkIGZvciAlcyAsIFNwZWVkID0gJWRcbiIsIF9fRlVOQ1RJT05fXyAsIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdLCBzcGVlZCk7CQkKKwkKKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksyKTsKKwl0bXAgPSBpbmIoaW9iYXNlK0ZJUl9JUkRBX0NSKTsKKwkJCisJLyogSUJNIHR5cGUgZG9uZ2xlICovCisJaWYoZG9uZ2xlX2lkID09IDApCisJewkJCQkKKwkJaWYoc3BlZWQgPT0gNDAwMDAwMCkKKwkJeworCQkJLy8JICAgICAgX18gX18JCisJCQkvLyBTRC9NT0RFIF9ffCAgICAgfF9fIF9fCisJCQkvLyAgICAgICAgICAgICAgIF9fIF9fIAorCQkJLy8gSVJUWCAgICBfXyBfX3wgICAgIHxfXworCQkJLy8gICAgICAgICBUMSBUMiBUMyBUNCBUNQorCQkJCisJCQl0bXAgJj0gIH5JUkRBX0NSX0hETEM7CQkvLyBIRExDPTAKKwkJCXRtcCB8PSBJUkRBX0NSX0NSQzsJICAgCS8vIENSQz0xCisJCQkKKwkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzIpOworCQkJb3V0Yih0bXAsIGlvYmFzZStGSVJfSVJEQV9DUik7CisJCQkKKyAgICAgIAkJCS8vIFQxIC0+IFNEL01PREU6MCBJUlRYOjAKKyAgICAgIAkJCXRtcCAmPSB+MHgwOTsKKyAgICAgIAkJCXRtcCB8PSAweDAyOworICAgICAgCQkJb3V0Yih0bXAsIGlvYmFzZStGSVJfSVJEQV9DUik7CisgICAgICAJCQl1ZGVsYXkoMik7CisgICAgICAJCQkKKyAgICAgIAkJCS8vIFQyIC0+IFNEL01PREU6MSBJUlRYOjAKKyAgICAgIAkJCXRtcCAmPSB+MHgwMTsKKyAgICAgIAkJCXRtcCB8PSAweDBhOworICAgICAgCQkJb3V0Yih0bXAsIGlvYmFzZStGSVJfSVJEQV9DUik7CisgICAgICAJCQl1ZGVsYXkoMik7CisgICAgICAJCQkKKyAgICAgIAkJCS8vIFQzIC0+IFNEL01PREU6MSBJUlRYOjEKKyAgICAgIAkJCXRtcCB8PSAweDBiOworICAgICAgCQkJb3V0Yih0bXAsIGlvYmFzZStGSVJfSVJEQV9DUik7CisgICAgICAJCQl1ZGVsYXkoMik7CisgICAgICAJCQkKKyAgICAgIAkJCS8vIFQ0IC0+IFNEL01PREU6MCBJUlRYOjEKKyAgICAgIAkJCXRtcCAmPSB+MHgwODsKKyAgICAgIAkJCXRtcCB8PSAweDAzOworICAgICAgCQkJb3V0Yih0bXAsIGlvYmFzZStGSVJfSVJEQV9DUik7CisgICAgICAJCQl1ZGVsYXkoMik7CisgICAgICAJCQkKKyAgICAgIAkJCS8vIFQ1IC0+IFNEL01PREU6MCBJUlRYOjAKKyAgICAgIAkJCXRtcCAmPSB+MHgwOTsKKyAgICAgIAkJCXRtcCB8PSAweDAyOworICAgICAgCQkJb3V0Yih0bXAsIGlvYmFzZStGSVJfSVJEQV9DUik7CisgICAgICAJCQl1ZGVsYXkoMik7CisgICAgICAJCQkKKyAgICAgIAkJCS8vIHJlc2V0IC0+IE5vcm1hbCBUWCBvdXRwdXQgU2lnbmFsCisgICAgICAJCQlvdXRiKHRtcCAmIH4weDAyLCBpb2Jhc2UrRklSX0lSREFfQ1IpOyAgICAgIAkJCQorCQl9CisJCWVsc2UgLyogc3BlZWQgPD0xMTUyMDAwICovCisJCXsJCisJCQkvLwkgICAgICBfXwkKKwkJCS8vIFNEL01PREUgX198ICB8X18KKwkJCS8vCisJCQkvLyBJUlRYICAgIF9fX19fX19fCisJCQkvLyAgICAgICAgIFQxIFQyIFQzICAKKwkJCQorCQkJLyogTUlSIDExNTIwMCwgNTc2MDAgKi8KKwkJCWlmIChzcGVlZD09MTE1MjAwMCkKKwkJCXsKKwkJCQl0bXAgfD0gMHhBMDsJICAgLy9IRExDPTEsIDEuMTUyTWJwcz0xCisgICAgICAJCQl9CisgICAgICAJCQllbHNlCisgICAgICAJCQl7CisJCQkJdG1wICY9fjB4ODA7CSAgIC8vSERMQyAwLjU3Nk1icHMKKwkJCQl0bXAgfD0gMHgyMDsJICAgLy9IRExDPTEsCisgICAgICAJCQl9CQkJCisgICAgICAJCQkKKyAgICAgIAkJCXRtcCB8PSBJUkRBX0NSX0NSQzsJICAgCS8vIENSQz0xCisgICAgICAJCQkKKyAgICAgIAkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzIpOworICAgICAgCQkJb3V0Yih0bXAsIGlvYmFzZStGSVJfSVJEQV9DUik7CisJCQkJCQkKKwkJCS8qIE1JUiAxMTUyMDAsIDU3NjAwICovCQorCQkJCQkJCisJCQkvL3N3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzIpOwkJCQorCQkJLy8gVDEgLT4gU0QvTU9ERTowIElSVFg6MAorICAgICAgCQkJdG1wICY9IH4weDA5OworICAgICAgCQkJdG1wIHw9IDB4MDI7CisgICAgICAJCQlvdXRiKHRtcCwgaW9iYXNlK0ZJUl9JUkRBX0NSKTsKKyAgICAgIAkJCXVkZWxheSgyKTsKKyAgICAgIAkJCQorICAgICAgCQkJLy8gVDIgLT4gU0QvTU9ERToxIElSVFg6MAorICAgICAgCQkJdG1wICY9IH4weDAxOyAgICAgCisgICAgICAJCQl0bXAgfD0gMHgwYTsgICAgICAKKyAgICAgIAkJCW91dGIodG1wLCBpb2Jhc2UrRklSX0lSREFfQ1IpOworICAgICAgCQkJCisgICAgICAJCQkvLyBUMyAtPiBTRC9NT0RFOjAgSVJUWDowCisgICAgICAJCQl0bXAgJj0gfjB4MDk7CisgICAgICAJCQl0bXAgfD0gMHgwMjsKKyAgICAgIAkJCW91dGIodG1wLCBpb2Jhc2UrRklSX0lSREFfQ1IpOworICAgICAgCQkJdWRlbGF5KDIpOworICAgICAgCQkJCisgICAgICAJCQkvLyByZXNldCAtPiBOb3JtYWwgVFggb3V0cHV0IFNpZ25hbAorICAgICAgCQkJb3V0Yih0bXAgJiB+MHgwMiwgaW9iYXNlK0ZJUl9JUkRBX0NSKTsgICAgICAJCQkJCQkKKwkJfQkJCisJfQorCWVsc2UgaWYgKGRvbmdsZV9pZCA9PSAxKSAvKiBIUCBIRFNMLTM2MDAgKi8KKwl7CisJCXN3aXRjaChzcGVlZCkKKwkJeworCQljYXNlIDQwMDAwMDA6CisJCQl0bXAgJj0gIH5JUkRBX0NSX0hETEM7CS8vIEhETEM9MAorCQkJYnJlYWs7CQorCQkJCisJCWNhc2UgMTE1MjAwMDoKKwkJCXRtcCB8PSAweEEwOwkgICAJLy8gSERMQz0xLCAxLjE1Mk1icHM9MQorICAgICAgCQkJYnJlYWs7CisgICAgICAJCQkKKyAgICAgIAkJY2FzZSA1NzYwMDA6CisgICAgICAJCQl0bXAgJj1+MHg4MDsJICAgCS8vIEhETEMgMC41NzZNYnBzCisJCQl0bXAgfD0gMHgyMDsJICAgCS8vIEhETEM9MSwKKwkJCWJyZWFrOworICAgICAgCQl9CQkJCisJCQkKKwkJdG1wIHw9IElSREFfQ1JfQ1JDOwkgICAJLy8gQ1JDPTEKKwkJCQorCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksyKTsKKyAgICAgIAkJb3V0Yih0bXAsIGlvYmFzZStGSVJfSVJEQV9DUik7CQkKKwl9CisJZWxzZSAvKiBIUCBIRFNMLTExMDAgKi8KKwl7CisJCWlmKHNwZWVkIDw9IDExNTIwMCkgLyogU0lSICovCisJCXsKKwkJCQorCQkJdG1wICY9IH5JUkRBX0NSX0ZJUl9TSU47CS8vIEhQIHNpbiBzZWxlY3QgPSAwCisJCQkKKwkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzIpOworICAgICAgCQkJb3V0Yih0bXAsIGlvYmFzZStGSVJfSVJEQV9DUik7CQkJCisJCX0KKwkJZWxzZSAvKiBNSVIgRklSICovCisJCXsJCisJCQkKKwkJCXN3aXRjaChzcGVlZCkKKwkJCXsKKwkJCWNhc2UgNDAwMDAwMDoKKwkJCQl0bXAgJj0gIH5JUkRBX0NSX0hETEM7CS8vIEhETEM9MAorCQkJCWJyZWFrOwkKKwkJCQorCQkJY2FzZSAxMTUyMDAwOgorCQkJCXRtcCB8PSAweEEwOwkgICAJLy8gSERMQz0xLCAxLjE1Mk1icHM9MQorICAgICAgCQkJCWJyZWFrOworICAgICAgCQkJCisgICAgICAJCQljYXNlIDU3NjAwMDoKKyAgICAgIAkJCQl0bXAgJj1+MHg4MDsJICAgCS8vIEhETEMgMC41NzZNYnBzCisJCQkJdG1wIHw9IDB4MjA7CSAgIAkvLyBIRExDPTEsCisJCQkJYnJlYWs7CisgICAgICAJCQl9CQkJCisJCQkKKwkJCXRtcCB8PSBJUkRBX0NSX0NSQzsJICAgCS8vIENSQz0xCisJCQl0bXAgfD0gSVJEQV9DUl9GSVJfU0lOOwkJLy8gSFAgc2luIHNlbGVjdCA9IDEKKwkJCQorCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMik7CisgICAgICAJCQlvdXRiKHRtcCwgaW9iYXNlK0ZJUl9JUkRBX0NSKTsJCQkKKwkJfQorCX0KKwkJCQorCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkJCit9CisKKy8qCisgKiBGdW5jdGlvbiBhbGlfaXJjY19zaXJfd3JpdGUgKGRyaXZlcikKKyAqCisgKiAgICBGaWxsIFR4IEZJRk8gd2l0aCB0cmFuc21pdCBkYXRhCisgKgorICovCitzdGF0aWMgaW50IGFsaV9pcmNjX3Npcl93cml0ZShpbnQgaW9iYXNlLCBpbnQgZmlmb19zaXplLCBfX3U4ICpidWYsIGludCBsZW4pCit7CisJaW50IGFjdHVhbCA9IDA7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCisJLyogVHggRklGTyBzaG91bGQgYmUgZW1wdHkhICovCisJaWYgKCEoaW5iKGlvYmFzZStVQVJUX0xTUikgJiBVQVJUX0xTUl9USFJFKSkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBmYWlsZWQsIGZpZm8gbm90IGVtcHR5IVxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiAwOworCX0KKyAgICAgICAgCisJLyogRmlsbCBGSUZPIHdpdGggY3VycmVudCBmcmFtZSAqLworCXdoaWxlICgoZmlmb19zaXplLS0gPiAwKSAmJiAoYWN0dWFsIDwgbGVuKSkgeworCQkvKiBUcmFuc21pdCBuZXh0IGJ5dGUgKi8KKwkJb3V0YihidWZbYWN0dWFsXSwgaW9iYXNlK1VBUlRfVFgpOworCisJCWFjdHVhbCsrOworCX0KKwkKKyAgICAgICAgSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorCXJldHVybiBhY3R1YWw7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhbGlfaXJjY19uZXRfb3BlbiAoZGV2KQorICoKKyAqICAgIFN0YXJ0IHRoZSBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgYWxpX2lyY2NfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGY7CisJaW50IGlvYmFzZTsKKwljaGFyIGh3bmFtZVszMl07CisJCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCQorCXNlbGYgPSAoc3RydWN0IGFsaV9pcmNjX2NiICopIGRldi0+cHJpdjsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CisJCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJCisJLyogUmVxdWVzdCBJUlEgYW5kIGluc3RhbGwgSW50ZXJydXB0IEhhbmRsZXIgKi8KKwlpZiAocmVxdWVzdF9pcnEoc2VsZi0+aW8uaXJxLCBhbGlfaXJjY19pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSkgCisJeworCQlJUkRBX1dBUk5JTkcoIiVzLCB1bmFibGUgdG8gYWxsb2NhdGUgaXJxPSVkXG4iLCBkcml2ZXJfbmFtZSwKKwkJCSAgICAgc2VsZi0+aW8uaXJxKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCQorCS8qCisJICogQWx3YXlzIGFsbG9jYXRlIHRoZSBETUEgY2hhbm5lbCBhZnRlciB0aGUgSVJRLCBhbmQgY2xlYW4gdXAgb24gCisJICogZmFpbHVyZS4KKwkgKi8KKwlpZiAocmVxdWVzdF9kbWEoc2VsZi0+aW8uZG1hLCBkZXYtPm5hbWUpKSB7CisJCUlSREFfV0FSTklORygiJXMsIHVuYWJsZSB0byBhbGxvY2F0ZSBkbWE9JWRcbiIsIGRyaXZlcl9uYW1lLAorCQkJICAgICBzZWxmLT5pby5kbWEpOworCQlmcmVlX2lycShzZWxmLT5pby5pcnEsIHNlbGYpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJCisJLyogVHVybiBvbiBpbnRlcnJ1cHMgKi8KKwlvdXRiKFVBUlRfSUVSX1JESSAsIGlvYmFzZStVQVJUX0lFUik7CisKKwkvKiBSZWFkeSB0byBwbGF5ISAqLworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7IC8vYmVuamFtaW4gYnkgaXJwb3J0CisJCisJLyogR2l2ZSBzZWxmIGEgaGFyZHdhcmUgbmFtZSAqLworCXNwcmludGYoaHduYW1lLCAiQUxJLUZJUiBAIDB4JTAzeCIsIHNlbGYtPmlvLmZpcl9iYXNlKTsKKworCS8qIAorCSAqIE9wZW4gbmV3IElyTEFQIGxheWVyIGluc3RhbmNlLCBub3cgdGhhdCBldmVyeXRoaW5nIHNob3VsZCBiZQorCSAqIGluaXRpYWxpemVkIHByb3Blcmx5IAorCSAqLworCXNlbGYtPmlybGFwID0gaXJsYXBfb3BlbihkZXYsICZzZWxmLT5xb3MsIGh3bmFtZSk7CisJCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX25ldF9jbG9zZSAoZGV2KQorICoKKyAqICAgIFN0b3AgdGhlIGRldmljZQorICoKKyAqLworc3RhdGljIGludCBhbGlfaXJjY19uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sJCisKKwlzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGY7CisJLy9pbnQgaW9iYXNlOworCQkJCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCisJc2VsZiA9IChzdHJ1Y3QgYWxpX2lyY2NfY2IgKikgZGV2LT5wcml2OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKworCS8qIFN0b3AgZGV2aWNlICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCS8qIFN0b3AgYW5kIHJlbW92ZSBpbnN0YW5jZSBvZiBJckxBUCAqLworCWlmIChzZWxmLT5pcmxhcCkKKwkJaXJsYXBfY2xvc2Uoc2VsZi0+aXJsYXApOworCXNlbGYtPmlybGFwID0gTlVMTDsKKwkJCisJZGlzYWJsZV9kbWEoc2VsZi0+aW8uZG1hKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCVNldENPTUludGVycnVwdHMoc2VsZiwgRkFMU0UpOworCSAgICAgICAKKwlmcmVlX2lycShzZWxmLT5pby5pcnEsIGRldik7CisJZnJlZV9kbWEoc2VsZi0+aW8uZG1hKTsKKworCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX2Zpcl9oYXJkX3htaXQgKHNrYiwgZGV2KQorICoKKyAqICAgIFRyYW5zbWl0IHRoZSBmcmFtZQorICoKKyAqLworc3RhdGljIGludCBhbGlfaXJjY19maXJfaGFyZF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGlvYmFzZTsKKwlfX3UzMiBzcGVlZDsKKwlpbnQgbXR0LCBkaWZmOworCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKKwkKKwlzZWxmID0gKHN0cnVjdCBhbGlfaXJjY19jYiAqKSBkZXYtPnByaXY7CisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJLyogTWFrZSBzdXJlIHRlc3RzIComIHNwZWVkIGNoYW5nZSBhcmUgYXRvbWljICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBOb3RlIDogeW91IHNob3VsZCBtYWtlIHN1cmUgdGhhdCBzcGVlZCBjaGFuZ2VzIGFyZSBub3QgZ29pbmcKKwkgKiB0byBjb3JydXB0IGFueSBvdXRnb2luZyBmcmFtZS4gTG9vayBhdCBuc2MtaXJjYyBmb3IgdGhlIGdvcnkKKwkgKiBkZXRhaWxzIC0gSmVhbiBJSSAqLworCisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkICovCisJc3BlZWQgPSBpcmRhX2dldF9uZXh0X3NwZWVkKHNrYik7CisJaWYgKChzcGVlZCAhPSBzZWxmLT5pby5zcGVlZCkgJiYgKHNwZWVkICE9IC0xKSkgeworCQkvKiBDaGVjayBmb3IgZW1wdHkgZnJhbWUgKi8KKwkJaWYgKCFza2ItPmxlbikgeworCQkJYWxpX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIHNwZWVkKTsgCisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCXNlbGYtPm5ld19zcGVlZCA9IHNwZWVkOworCX0KKworCS8qIFJlZ2lzdGVyIGFuZCBjb3B5IHRoaXMgZnJhbWUgdG8gRE1BIG1lbW9yeSAqLworCXNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5mcmVlXS5zdGFydCA9IHNlbGYtPnR4X2ZpZm8udGFpbDsKKwlzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8uZnJlZV0ubGVuID0gc2tiLT5sZW47CisJc2VsZi0+dHhfZmlmby50YWlsICs9IHNrYi0+bGVuOworCisJc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwltZW1jcHkoc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLmZyZWVdLnN0YXJ0LCBza2ItPmRhdGEsIAorCSAgICAgICBza2ItPmxlbik7CisJCisJc2VsZi0+dHhfZmlmby5sZW4rKzsKKwlzZWxmLT50eF9maWZvLmZyZWUrKzsKKworCS8qIFN0YXJ0IHRyYW5zbWl0IG9ubHkgaWYgdGhlcmUgaXMgY3VycmVudGx5IG5vIHRyYW5zbWl0IGdvaW5nIG9uICovCisJaWYgKHNlbGYtPnR4X2ZpZm8ubGVuID09IDEpIAorCXsKKwkJLyogQ2hlY2sgaWYgd2UgbXVzdCB3YWl0IHRoZSBtaW4gdHVybiB0aW1lIG9yIG5vdCAqLworCQltdHQgPSBpcmRhX2dldF9tdHQoc2tiKTsKKwkJCQkKKwkJaWYgKG10dCkgCisJCXsKKwkJCS8qIENoZWNrIGhvdyBtdWNoIHRpbWUgd2UgaGF2ZSB1c2VkIGFscmVhZHkgKi8KKwkJCWRvX2dldHRpbWVvZmRheSgmc2VsZi0+bm93KTsKKwkJCQorCQkJZGlmZiA9IHNlbGYtPm5vdy50dl91c2VjIC0gc2VsZi0+c3RhbXAudHZfdXNlYzsKKwkJCS8qIHNlbGYtPnN0YW1wIGlzIHNldCBmcm9tIGFsaV9pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlKCkgKi8KKwkJCQkJCQkKKwkJCUlSREFfREVCVUcoMSwgIiVzKCksICoqKioqKiogZGlmZiA9ICVkICoqKioqKiogXG4iLCBfX0ZVTkNUSU9OX18gLCBkaWZmKTsJCisJCQkKKwkJCWlmIChkaWZmIDwgMCkgCisJCQkJZGlmZiArPSAxMDAwMDAwOworCQkJCisJCQkvKiBDaGVjayBpZiB0aGUgbXR0IGlzIGxhcmdlciB0aGFuIHRoZSB0aW1lIHdlIGhhdmUKKwkJCSAqIGFscmVhZHkgdXNlZCBieSBhbGwgdGhlIHByb3RvY29sIHByb2Nlc3NpbmcKKwkJCSAqLworCQkJaWYgKG10dCA+IGRpZmYpCisJCQl7CQkJCQorCQkJCW10dCAtPSBkaWZmOworCQkJCQkJCQkKKwkJCQkvKiAKKwkJCQkgKiBVc2UgdGltZXIgaWYgZGVsYXkgbGFyZ2VyIHRoYW4gMTAwMCB1cywgYW5kCisJCQkJICogdXNlIHVkZWxheSBmb3Igc21hbGxlciB2YWx1ZXMgd2hpY2ggc2hvdWxkCisJCQkJICogYmUgYWNjZXB0YWJsZQorCQkJCSAqLworCQkJCWlmIChtdHQgPiA1MDApIAorCQkJCXsKKwkJCQkJLyogQWRqdXN0IGZvciB0aW1lciByZXNvbHV0aW9uICovCisJCQkJCW10dCA9IChtdHQrMjUwKSAvIDUwMDsgCS8qIDQgZGlzY2FyZCwgNSBnZXQgYWR2YW5jZWQsIExldCdzIHJvdW5kIG9mZiAqLworCQkJCQkKKwkJCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgKioqKioqKioqKioqKiogbXR0ID0gJWQgKioqKioqKioqKipcbiIsIF9fRlVOQ1RJT05fXyAsIG10dCk7CQorCQkJCQkKKwkJCQkJLyogU2V0dXAgdGltZXIgKi8KKwkJCQkJaWYgKG10dCA9PSAxKSAvKiA1MDAgdXMgKi8KKwkJCQkJeworCQkJCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMSk7CisJCQkJCQlvdXRiKFRJTUVSX0lJUl81MDAsIGlvYmFzZStGSVJfVElNRVJfSUlSKTsKKwkJCQkJfQkKKwkJCQkJZWxzZSBpZiAobXR0ID09IDIpIC8qIDEgbXMgKi8KKwkJCQkJeworCQkJCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMSk7CisJCQkJCQlvdXRiKFRJTUVSX0lJUl8xbXMsIGlvYmFzZStGSVJfVElNRVJfSUlSKTsKKwkJCQkJfQkJCQkJCisJCQkJCWVsc2UgLyogPiAybXMgLT4gNG1zICovCisJCQkJCXsKKwkJCQkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzEpOworCQkJCQkJb3V0YihUSU1FUl9JSVJfMm1zLCBpb2Jhc2UrRklSX1RJTUVSX0lJUik7CisJCQkJCX0KKwkJCQkJCisJCQkJCQorCQkJCQkvKiBTdGFydCB0aW1lciAqLworCQkJCQlvdXRiKGluYihpb2Jhc2UrRklSX0NSKSB8IENSX1RJTUVSX0VOLCBpb2Jhc2UrRklSX0NSKTsKKwkJCQkJc2VsZi0+aW8uZGlyZWN0aW9uID0gSU9fWE1JVDsKKwkJCQkJCisJCQkJCS8qIEVuYWJsZSB0aW1lciBpbnRlcnJ1cHQgKi8KKwkJCQkJc2VsZi0+aWVyID0gSUVSX1RJTUVSOworCQkJCQlTZXRDT01JbnRlcnJ1cHRzKHNlbGYsIFRSVUUpOwkJCQkJCisJCQkJCQorCQkJCQkvKiBUaW1lciB3aWxsIHRha2UgY2FyZSBvZiB0aGUgcmVzdCAqLworCQkJCQlnb3RvIG91dDsgCisJCQkJfSAKKwkJCQllbHNlCisJCQkJCXVkZWxheShtdHQpOworCQkJfSAvLyBpZiAoaWYgKG10dCA+IGRpZmYpCisJCX0vLyBpZiAobXR0KSAKKwkJCQkKKwkJLyogRW5hYmxlIEVPTSBpbnRlcnJ1cHQgKi8KKwkJc2VsZi0+aWVyID0gSUVSX0VPTTsKKwkJU2V0Q09NSW50ZXJydXB0cyhzZWxmLCBUUlVFKTsKKwkJCisJCS8qIFRyYW5zbWl0IGZyYW1lICovCisJCWFsaV9pcmNjX2RtYV94bWl0KHNlbGYpOworCX0gLy8gaWYgKHNlbGYtPnR4X2ZpZm8ubGVuID09IDEpIAorCQorIG91dDoKKyAJCisJLyogTm90IGJ1c3kgdHJhbnNtaXR0aW5nIGFueW1vcmUgaWYgd2luZG93IGlzIG5vdCBmdWxsICovCisJaWYgKHNlbGYtPnR4X2ZpZm8uZnJlZSA8IE1BWF9UWF9XSU5ET1cpCisJCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKwkKKwkvKiBSZXN0b3JlIGJhbmsgcmVnaXN0ZXIgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsJCisJcmV0dXJuIDA7CQorfQorCisKK3N0YXRpYyB2b2lkIGFsaV9pcmNjX2RtYV94bWl0KHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlLCB0bXA7CisJdW5zaWduZWQgY2hhciBGSUZPX09QVEksIEhpLCBMbzsKKwkKKwkKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsJCisJCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJCisJLyogRklGTyB0aHJlc2hvbGQgLCB0aGlzIG1ldGhvZCBjb21lcyBmcm9tIE5ESVM1IGNvZGUgKi8KKwkKKwlpZihzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8ucHRyXS5sZW4gPCBUWF9GSUZPX1RocmVzaG9sZCkKKwkJRklGT19PUFRJID0gc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLnB0cl0ubGVuLTE7CisJZWxzZQorCQlGSUZPX09QVEkgPSBUWF9GSUZPX1RocmVzaG9sZDsKKwkKKwkvKiBEaXNhYmxlIERNQSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzEpOworCW91dGIoaW5iKGlvYmFzZStGSVJfQ1IpICYgfkNSX0RNQV9FTiwgaW9iYXNlK0ZJUl9DUik7CisJCisJc2VsZi0+aW8uZGlyZWN0aW9uID0gSU9fWE1JVDsKKwkKKwlpcmRhX3NldHVwX2RtYShzZWxmLT5pby5kbWEsIAorCQkgICAgICAgKCh1OCAqKXNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5wdHJdLnN0YXJ0IC0KKwkJCXNlbGYtPnR4X2J1ZmYuaGVhZCkgKyBzZWxmLT50eF9idWZmX2RtYSwKKwkJICAgICAgIHNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5wdHJdLmxlbiwgCisJCSAgICAgICBETUFfVFhfTU9ERSk7CisJCQorCS8qIFJlc2V0IFR4IEZJRk8gKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwlvdXRiKExDUl9BX0ZJRk9fUkVTRVQsIGlvYmFzZStGSVJfTENSX0EpOworCQorCS8qIFNldCBUeCBGSUZPIHRocmVzaG9sZCAqLworCWlmIChzZWxmLT5maWZvX29wdGlfYnVmIT1GSUZPX09QVEkpIAorCXsKKwkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMSk7CisJICAgIAlvdXRiKEZJRk9fT1BUSSwgaW9iYXNlK0ZJUl9GSUZPX1RSKSA7CisJICAgIAlzZWxmLT5maWZvX29wdGlfYnVmPUZJRk9fT1BUSTsKKwl9CisJCisJLyogU2V0IFR4IERNQSB0aHJlc2hvbGQgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksxKTsKKwlvdXRiKFRYX0RNQV9UaHJlc2hvbGQsIGlvYmFzZStGSVJfRE1BX1RSKTsKKwkKKwkvKiBTZXQgbWF4IFR4IGZyYW1lIHNpemUgKi8KKwlIaSA9IChzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8ucHRyXS5sZW4gPj4gOCkgJiAweDBmOworCUxvID0gc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLnB0cl0ubGVuICYgMHhmZjsKKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksyKTsKKwlvdXRiKEhpLCBpb2Jhc2UrRklSX1RYX0RTUl9ISSk7CisJb3V0YihMbywgaW9iYXNlK0ZJUl9UWF9EU1JfTE8pOworCQorCS8qIERpc2FibGUgU0lQICwgRGlzYWJsZSBCcmljayBXYWxsICh3ZSBkb24ndCBzdXBwb3J0IGluIFRYIG1vZGUpLCBDaGFuZ2UgdG8gVFggbW9kZSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOwkKKwl0bXAgPSBpbmIoaW9iYXNlK0ZJUl9MQ1JfQik7CisJdG1wICY9IH4weDIwOyAvLyBEaXNhYmxlIFNJUAorCW91dGIoKCh1bnNpZ25lZCBjaGFyKSh0bXAgJiAweDNmKSB8IExDUl9CX1RYX01PREUpICYgfkxDUl9CX0JXLCBpb2Jhc2UrRklSX0xDUl9CKTsKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAqKioqKioqIENoYW5nZSB0byBUWCBtb2RlOiBGSVJfTENSX0IgPSAweCV4ICoqKioqKiogXG4iLCBfX0ZVTkNUSU9OX18gLCBpbmIoaW9iYXNlK0ZJUl9MQ1JfQikpOworCQorCW91dGIoMCwgaW9iYXNlK0ZJUl9MU1IpOworCQkJCisJLyogRW5hYmxlIERNQSBhbmQgQnVyc3QgTW9kZSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzEpOworCW91dGIoaW5iKGlvYmFzZStGSVJfQ1IpIHwgQ1JfRE1BX0VOIHwgQ1JfRE1BX0JVUlNULCBpb2Jhc2UrRklSX0NSKTsKKwkKKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsgCisJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7Cit9CisKK3N0YXRpYyBpbnQgIGFsaV9pcmNjX2RtYV94bWl0X2NvbXBsZXRlKHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCWludCByZXQgPSBUUlVFOworCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKKwkKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwkKKwkvKiBEaXNhYmxlIERNQSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzEpOworCW91dGIoaW5iKGlvYmFzZStGSVJfQ1IpICYgfkNSX0RNQV9FTiwgaW9iYXNlK0ZJUl9DUik7CisJCisJLyogQ2hlY2sgZm9yIHVuZGVycnVuISAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCWlmKChpbmIoaW9iYXNlK0ZJUl9MU1IpICYgTFNSX0ZSQU1FX0FCT1JUKSA9PSBMU1JfRlJBTUVfQUJPUlQpCisJCisJeworCQlJUkRBX0VSUk9SKCIlcygpLCAqKioqKioqKiogTFNSX0ZSQU1FX0FCT1JUICoqKioqKioqKlxuIiwgX19GVU5DVElPTl9fKTsJCisJCXNlbGYtPnN0YXRzLnR4X2Vycm9ycysrOworCQlzZWxmLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwkJCisJfQorCWVsc2UgCisJeworCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CisJfQorCisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkICovCisJaWYgKHNlbGYtPm5ld19zcGVlZCkgCisJeworCQlhbGlfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc2VsZi0+bmV3X3NwZWVkKTsKKwkJc2VsZi0+bmV3X3NwZWVkID0gMDsKKwl9CisKKwkvKiBGaW5pc2hlZCB3aXRoIHRoaXMgZnJhbWUsIHNvIHByZXBhcmUgZm9yIG5leHQgKi8KKwlzZWxmLT50eF9maWZvLnB0cisrOworCXNlbGYtPnR4X2ZpZm8ubGVuLS07CisKKwkvKiBBbnkgZnJhbWVzIHRvIGJlIHNlbnQgYmFjay10by1iYWNrPyAqLworCWlmIChzZWxmLT50eF9maWZvLmxlbikgCisJeworCQlhbGlfaXJjY19kbWFfeG1pdChzZWxmKTsKKwkJCisJCS8qIE5vdCBmaW5pc2hlZCB5ZXQhICovCisJCXJldCA9IEZBTFNFOworCX0gCisJZWxzZSAKKwl7CS8qIFJlc2V0IFR4IEZJRk8gaW5mbyAqLworCQlzZWxmLT50eF9maWZvLmxlbiA9IHNlbGYtPnR4X2ZpZm8ucHRyID0gc2VsZi0+dHhfZmlmby5mcmVlID0gMDsKKwkJc2VsZi0+dHhfZmlmby50YWlsID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCX0KKworCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHJvb20gZm9yIG1vcmUgZnJhbWVzICovCisJaWYgKHNlbGYtPnR4X2ZpZm8uZnJlZSA8IE1BWF9UWF9XSU5ET1cpIHsKKwkJLyogTm90IGJ1c3kgdHJhbnNtaXR0aW5nIGFueW1vcmUgKi8KKwkJLyogVGVsbCB0aGUgbmV0d29yayBsYXllciwgdGhhdCB3ZSBjYW4gYWNjZXB0IG1vcmUgZnJhbWVzICovCisJCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKwl9CisJCQorCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOyAKKwkKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsJCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX2RtYV9yZWNlaXZlIChzZWxmKQorICoKKyAqICAgIEdldCByZWFkeSBmb3IgcmVjZWl2aW5nIGEgZnJhbWUuIFRoZSBkZXZpY2Ugd2lsbCBpbml0aWF0ZSBhIERNQQorICogICAgaWYgaXQgc3RhcnRzIHRvIHJlY2VpdmUgYSBmcmFtZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgYWxpX2lyY2NfZG1hX3JlY2VpdmUoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKSAKK3sKKwlpbnQgaW9iYXNlLCB0bXA7CisJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorCQorCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCQorCS8qIFJlc2V0IFR4IEZJRk8gaW5mbyAqLworCXNlbGYtPnR4X2ZpZm8ubGVuID0gc2VsZi0+dHhfZmlmby5wdHIgPSBzZWxmLT50eF9maWZvLmZyZWUgPSAwOworCXNlbGYtPnR4X2ZpZm8udGFpbCA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKKwkJCisJLyogRGlzYWJsZSBETUEgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksxKTsKKwlvdXRiKGluYihpb2Jhc2UrRklSX0NSKSAmIH5DUl9ETUFfRU4sIGlvYmFzZStGSVJfQ1IpOworCQorCS8qIFJlc2V0IE1lc3NhZ2UgQ291bnQgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwlvdXRiKDB4MDcsIGlvYmFzZStGSVJfTFNSKTsKKwkJCisJc2VsZi0+cmN2RnJhbWVzT3ZlcmZsb3cgPSBGQUxTRTsJCisJCisJc2VsZi0+TGluZVN0YXR1cyA9IGluYihpb2Jhc2UrRklSX0xTUikgOworCQorCS8qIFJlc2V0IFJ4IEZJRk8gaW5mbyAqLworCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1JFQ1Y7CisJc2VsZi0+cnhfYnVmZi5kYXRhID0gc2VsZi0+cnhfYnVmZi5oZWFkOworCQkKKwkvKiBSZXNldCBSeCBGSUZPICovCisJLy8gc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJb3V0YihMQ1JfQV9GSUZPX1JFU0VULCBpb2Jhc2UrRklSX0xDUl9BKTsgCisJCisJc2VsZi0+c3RfZmlmby5sZW4gPSBzZWxmLT5zdF9maWZvLnBlbmRpbmdfYnl0ZXMgPSAwOworCXNlbGYtPnN0X2ZpZm8udGFpbCA9IHNlbGYtPnN0X2ZpZm8uaGVhZCA9IDA7CisJCQorCWlyZGFfc2V0dXBfZG1hKHNlbGYtPmlvLmRtYSwgc2VsZi0+cnhfYnVmZl9kbWEsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCSAgICAgICBETUFfUlhfTU9ERSk7CisJIAorCS8qIFNldCBSZWNlaXZlIE1vZGUsQnJpY2sgV2FsbCAqLworCS8vc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJdG1wID0gaW5iKGlvYmFzZStGSVJfTENSX0IpOworCW91dGIoKHVuc2lnbmVkIGNoYXIpKHRtcCAmMHgzZikgfCBMQ1JfQl9SWF9NT0RFIHwgTENSX0JfQlcgLCBpb2Jhc2UgKyBGSVJfTENSX0IpOyAvLyAyMDAwLzEyLzEgMDU6MTZQTQorCUlSREFfREVCVUcoMSwgIiVzKCksICoqKiBDaGFuZ2UgVG8gUlggbW9kZTogRklSX0xDUl9CID0gMHgleCAqKiogXG4iLCBfX0ZVTkNUSU9OX18gLCBpbmIoaW9iYXNlK0ZJUl9MQ1JfQikpOworCQkJCisJLyogU2V0IFJ4IFRocmVzaG9sZCAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzEpOworCW91dGIoUlhfRklGT19UaHJlc2hvbGQsIGlvYmFzZStGSVJfRklGT19UUik7CisJb3V0YihSWF9ETUFfVGhyZXNob2xkLCBpb2Jhc2UrRklSX0RNQV9UUik7CisJCQorCS8qIEVuYWJsZSBETUEgYW5kIEJ1cnN0IE1vZGUgKi8KKwkvLyBzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksxKTsKKwlvdXRiKENSX0RNQV9FTiB8IENSX0RNQV9CVVJTVCwgaW9iYXNlK0ZJUl9DUik7CisJCQkJCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7IAorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCAgYWxpX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKQoreworCXN0cnVjdCBzdF9maWZvICpzdF9maWZvOworCXN0cnVjdCBza19idWZmICpza2I7CisJX191OCBzdGF0dXMsIE1lc3NhZ2VDb3VudDsKKwlpbnQgbGVuLCBpLCBpb2Jhc2UsIHZhbDsJCisKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsJCisKKwlzdF9maWZvID0gJnNlbGYtPnN0X2ZpZm87CQkKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsJCisJCQorCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCU1lc3NhZ2VDb3VudCA9IGluYihpb2Jhc2UrIEZJUl9MU1IpJjB4MDc7CisJCisJaWYgKE1lc3NhZ2VDb3VudCA+IDApCQorCQlJUkRBX0RFQlVHKDAsICIlcygpLCBNZXNzc2FnZSBjb3VudCA9ICVkLFxuIiwgX19GVU5DVElPTl9fICwgTWVzc2FnZUNvdW50KTsJCisJCQorCWZvciAoaT0wOyBpPD1NZXNzYWdlQ291bnQ7IGkrKykKKwl7CisJCS8qIEJhbmsgMCAqLworCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwkJc3RhdHVzID0gaW5iKGlvYmFzZStGSVJfTFNSKTsKKwkJCisJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzIpOworCQlsZW4gPSBpbmIoaW9iYXNlK0ZJUl9SWF9EU1JfSEkpICYgMHgwZjsKKwkJbGVuID0gbGVuIDw8IDg7IAorCQlsZW4gfD0gaW5iKGlvYmFzZStGSVJfUlhfRFNSX0xPKTsKKwkJCisJCUlSREFfREVCVUcoMSwgIiVzKCksIFJYIExlbmd0aCA9IDB4JS4yeCxcbiIsIF9fRlVOQ1RJT05fXyAsIGxlbik7CQorCQlJUkRBX0RFQlVHKDEsICIlcygpLCBSWCBTdGF0dXMgPSAweCUuMngsXG4iLCBfX0ZVTkNUSU9OX18gLCBzdGF0dXMpOworCQkKKwkJaWYgKHN0X2ZpZm8tPnRhaWwgPj0gTUFYX1JYX1dJTkRPVykgeworCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgd2luZG93IGlzIGZ1bGwhXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCQkKKwkJc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT50YWlsXS5zdGF0dXMgPSBzdGF0dXM7CisJCXN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+dGFpbF0ubGVuID0gbGVuOworCQlzdF9maWZvLT5wZW5kaW5nX2J5dGVzICs9IGxlbjsKKwkJc3RfZmlmby0+dGFpbCsrOworCQlzdF9maWZvLT5sZW4rKzsKKwl9CisJCQkKKwlmb3IgKGk9MDsgaTw9TWVzc2FnZUNvdW50OyBpKyspCisJewkKKwkJLyogR2V0IGZpcnN0IGVudHJ5ICovCisJCXN0YXR1cyA9IHN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0uc3RhdHVzOworCQlsZW4gICAgPSBzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPmhlYWRdLmxlbjsKKwkJc3RfZmlmby0+cGVuZGluZ19ieXRlcyAtPSBsZW47CisJCXN0X2ZpZm8tPmhlYWQrKzsKKwkJc3RfZmlmby0+bGVuLS07CQkJCisJCQorCQkvKiBDaGVjayBmb3IgZXJyb3JzICovCisJCWlmICgoc3RhdHVzICYgMHhkOCkgfHwgc2VsZi0+cmN2RnJhbWVzT3ZlcmZsb3cgfHwgKGxlbj09MCkpIAkJCisJCXsKKwkJCUlSREFfREVCVUcoMCwiJXMoKSwgKioqKioqKioqKioqKiBSWCBFcnJvcnMgKioqKioqKioqKioqIFxuIiwgX19GVU5DVElPTl9fICk7CQorCQkJCisJCQkvKiBTa2lwIGZyYW1lICovCisJCQlzZWxmLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQorCQkJc2VsZi0+cnhfYnVmZi5kYXRhICs9IGxlbjsKKwkJCQorCQkJaWYgKHN0YXR1cyAmIExTUl9GSUZPX1VSKSAKKwkJCXsKKwkJCQlzZWxmLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlJUkRBX0RFQlVHKDAsIiVzKCksICoqKioqKioqKioqKiogRklGTyBFcnJvcnMgKioqKioqKioqKioqIFxuIiwgX19GVU5DVElPTl9fICk7CisJCQl9CQorCQkJaWYgKHN0YXR1cyAmIExTUl9GUkFNRV9FUlJPUikKKwkJCXsKKwkJCQlzZWxmLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlJUkRBX0RFQlVHKDAsIiVzKCksICoqKioqKioqKioqKiogRlJBTUUgRXJyb3JzICoqKioqKioqKioqKiBcbiIsIF9fRlVOQ1RJT05fXyApOworCQkJfQorCQkJCQkJCQorCQkJaWYgKHN0YXR1cyAmIExTUl9DUkNfRVJST1IpIAorCQkJeworCQkJCXNlbGYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQlJUkRBX0RFQlVHKDAsIiVzKCksICoqKioqKioqKioqKiogQ1JDIEVycm9ycyAqKioqKioqKioqKiogXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCX0KKwkJCQorCQkJaWYoc2VsZi0+cmN2RnJhbWVzT3ZlcmZsb3cpCisJCQl7CisJCQkJc2VsZi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJSVJEQV9ERUJVRygwLCIlcygpLCAqKioqKioqKioqKioqIE92ZXJyYW4gRE1BIGJ1ZmZlciAqKioqKioqKioqKiogXG4iLCBfX0ZVTkNUSU9OX18gKTsJCQkJCQkJCQorCQkJfQorCQkJaWYobGVuID09IDApCisJCQl7CisJCQkJc2VsZi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJSVJEQV9ERUJVRygwLCIlcygpLCAqKioqKioqKioqIFJlY2VpdmUgRnJhbWUgU2l6ZSA9IDAgKioqKioqKioqIFxuIiwgX19GVU5DVElPTl9fICk7CisJCQl9CisJCX0JIAorCQllbHNlIAorCQl7CisJCQkKKwkJCWlmIChzdF9maWZvLT5wZW5kaW5nX2J5dGVzIDwgMzIpIAorCQkJeworCQkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCQkJCXZhbCA9IGluYihpb2Jhc2UrRklSX0JTUik7CQorCQkJCWlmICgodmFsJiBCU1JfRklGT19OT1RfRU1QVFkpPT0gMHg4MCkgCisJCQkJeworCQkJCQlJUkRBX0RFQlVHKDAsICIlcygpLCAqKioqKioqKioqKioqIEJTUl9GSUZPX05PVF9FTVBUWSAqKioqKioqKioqKiogXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCQkJCisJCQkJCS8qIFB1dCB0aGlzIGVudHJ5IGJhY2sgaW4gZmlmbyAqLworCQkJCQlzdF9maWZvLT5oZWFkLS07CisJCQkJCXN0X2ZpZm8tPmxlbisrOworCQkJCQlzdF9maWZvLT5wZW5kaW5nX2J5dGVzICs9IGxlbjsKKwkJCQkJc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT5oZWFkXS5zdGF0dXMgPSBzdGF0dXM7CisJCQkJCXN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0ubGVuID0gbGVuOworCQkJCQkJCisJCQkJCS8qICAKKwkJIAkJCSogRE1BIG5vdCBmaW5pc2hlZCB5ZXQsIHNvIHRyeSBhZ2FpbiAKKwkJIAkJCSogbGF0ZXIsIHNldCB0aW1lciB2YWx1ZSwgcmVzb2x1dGlvbiAKKwkJIAkJCSogNTAwIHVzIAorCQkgCQkJKi8KKwkJCQkJIAorCQkJCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksxKTsKKwkJCQkJb3V0YihUSU1FUl9JSVJfNTAwLCBpb2Jhc2UrRklSX1RJTUVSX0lJUik7IC8vIDIwMDEvMS8yIDA1OjA3UE0KKwkJCQkJCisJCQkJCS8qIEVuYWJsZSBUaW1lciAqLworCQkJCQlvdXRiKGluYihpb2Jhc2UrRklSX0NSKSB8IENSX1RJTUVSX0VOLCBpb2Jhc2UrRklSX0NSKTsKKwkJCQkJCQorCQkJCQlyZXR1cm4gRkFMU0U7IC8qIEknbGwgYmUgYmFjayEgKi8KKwkJCQl9CisJCQl9CQkKKwkJCQorCQkJLyogCisJCQkgKiBSZW1lbWJlciB0aGUgdGltZSB3ZSByZWNlaXZlZCB0aGlzIGZyYW1lLCBzbyB3ZSBjYW4KKwkJCSAqIHJlZHVjZSB0aGUgbWluIHR1cm4gdGltZSBhIGJpdCBzaW5jZSB3ZSB3aWxsIGtub3cKKwkJCSAqIGhvdyBtdWNoIHRpbWUgd2UgaGF2ZSB1c2VkIGZvciBwcm90b2NvbCBwcm9jZXNzaW5nCisJCQkgKi8KKwkJCWRvX2dldHRpbWVvZmRheSgmc2VsZi0+c3RhbXApOworCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbisxKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgIAorCQkJeworCQkJCUlSREFfV0FSTklORygiJXMoKSwgbWVtb3J5IHNxdWVlemUsICIKKwkJCQkJICAgICAiZHJvcHBpbmcgZnJhbWUuXG4iLAorCQkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQkJc2VsZi0+c3RhdHMucnhfZHJvcHBlZCsrOworCisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJCisJCQkvKiBNYWtlIHN1cmUgSVAgaGVhZGVyIGdldHMgYWxpZ25lZCAqLworCQkJc2tiX3Jlc2VydmUoc2tiLCAxKTsgCisJCQkKKwkJCS8qIENvcHkgZnJhbWUgd2l0aG91dCBDUkMsIENSQyBpcyByZW1vdmVkIGJ5IGhhcmR3YXJlKi8KKwkJCXNrYl9wdXQoc2tiLCBsZW4pOworCQkJbWVtY3B5KHNrYi0+ZGF0YSwgc2VsZi0+cnhfYnVmZi5kYXRhLCBsZW4pOworCisJCQkvKiBNb3ZlIHRvIG5leHQgZnJhbWUgKi8KKwkJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47CisJCQlzZWxmLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisKKwkJCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OworCQkJc2tiLT5tYWMucmF3ICA9IHNrYi0+ZGF0YTsKKwkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlzZWxmLT5uZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQl9CisJfQorCQorCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOwkKKwkJCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorCXJldHVybiBUUlVFOworfQorCisKKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX3Npcl9oYXJkX3htaXQgKHNrYiwgZGV2KQorICoKKyAqICAgIFRyYW5zbWl0IHRoZSBmcmFtZSEKKyAqCisgKi8KK3N0YXRpYyBpbnQgYWxpX2lyY2Nfc2lyX2hhcmRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpb2Jhc2U7CisJX191MzIgc3BlZWQ7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKwkKKwlzZWxmID0gKHN0cnVjdCBhbGlfaXJjY19jYiAqKSBkZXYtPnByaXY7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gMDspOworCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJLyogTWFrZSBzdXJlIHRlc3RzIComIHNwZWVkIGNoYW5nZSBhcmUgYXRvbWljICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCS8qIE5vdGUgOiB5b3Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHNwZWVkIGNoYW5nZXMgYXJlIG5vdCBnb2luZworCSAqIHRvIGNvcnJ1cHQgYW55IG91dGdvaW5nIGZyYW1lLiBMb29rIGF0IG5zYy1pcmNjIGZvciB0aGUgZ29yeQorCSAqIGRldGFpbHMgLSBKZWFuIElJICovCisKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgc3BlZWQgKi8KKwlzcGVlZCA9IGlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKKwlpZiAoKHNwZWVkICE9IHNlbGYtPmlvLnNwZWVkKSAmJiAoc3BlZWQgIT0gLTEpKSB7CisJCS8qIENoZWNrIGZvciBlbXB0eSBmcmFtZSAqLworCQlpZiAoIXNrYi0+bGVuKSB7CisJCQlhbGlfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc3BlZWQpOyAKKwkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZQorCQkJc2VsZi0+bmV3X3NwZWVkID0gc3BlZWQ7CisJfQorCisJLyogSW5pdCB0eCBidWZmZXIgKi8KKwlzZWxmLT50eF9idWZmLmRhdGEgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisKKyAgICAgICAgLyogQ29weSBza2IgdG8gdHhfYnVmZiB3aGlsZSB3cmFwcGluZywgc3R1ZmZpbmcgYW5kIG1ha2luZyBDUkMgKi8KKwlzZWxmLT50eF9idWZmLmxlbiA9IGFzeW5jX3dyYXBfc2tiKHNrYiwgc2VsZi0+dHhfYnVmZi5kYXRhLCAKKwkJCQkJICAgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSk7CisJCisJc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2VsZi0+dHhfYnVmZi5sZW47CisKKwkvKiBUdXJuIG9uIHRyYW5zbWl0IGZpbmlzaGVkIGludGVycnVwdC4gV2lsbCBmaXJlIGltbWVkaWF0ZWx5ISAgKi8KKwlvdXRiKFVBUlRfSUVSX1RIUkksIGlvYmFzZStVQVJUX0lFUik7IAorCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJZGV2X2tmcmVlX3NrYihza2IpOworCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKKwkKKwlyZXR1cm4gMDsJCit9CisKKworLyoKKyAqIEZ1bmN0aW9uIGFsaV9pcmNjX25ldF9pb2N0bCAoZGV2LCBycSwgY21kKQorICoKKyAqICAgIFByb2Nlc3MgSU9DVEwgY29tbWFuZHMgZm9yIHRoaXMgZGV2aWNlCisgKgorICovCitzdGF0aWMgaW50IGFsaV9pcmNjX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBpZl9pcmRhX3JlcSAqaXJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKSBycTsKKwlzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOworCQorCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXNlbGYgPSBkZXYtPnByaXY7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgJXMsIChjbWQ9MHglWClcbiIsIF9fRlVOQ1RJT05fXyAsIGRldi0+bmFtZSwgY21kKTsKKwkKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ1NCQU5EV0lEVEg6IC8qIFNldCBiYW5kd2lkdGggKi8KKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgU0lPQ1NCQU5EV0lEVEhcbiIsIF9fRlVOQ1RJT05fXyApOworCQkvKgorCQkgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxzbyBiZSB1c2VkIGJ5IElyTEFQIHRvIGNoYW5nZSB0aGUKKwkJICogc3BlZWQsIHNvIHdlIHN0aWxsIG11c3QgYWxsb3cgZm9yIHNwZWVkIGNoYW5nZSB3aXRoaW4KKwkJICogaW50ZXJydXB0IGNvbnRleHQuCisJCSAqLworCQlpZiAoIWluX2ludGVycnVwdCgpICYmICFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCWFsaV9pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBpcnEtPmlmcl9iYXVkcmF0ZSk7CQkKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKwljYXNlIFNJT0NTTUVESUFCVVNZOiAvKiBTZXQgbWVkaWEgYnVzeSAqLworCQlJUkRBX0RFQlVHKDEsICIlcygpLCBTSU9DU01FRElBQlVTWVxuIiwgX19GVU5DVElPTl9fICk7CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5KHNlbGYtPm5ldGRldiwgVFJVRSk7CisJCWJyZWFrOworCWNhc2UgU0lPQ0dSRUNFSVZJTkc6IC8qIENoZWNrIGlmIHdlIGFyZSByZWNlaXZpbmcgcmlnaHQgbm93ICovCisJCUlSREFfREVCVUcoMiwgIiVzKCksIFNJT0NHUkVDRUlWSU5HXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJLyogVGhpcyBpcyBwcm90ZWN0ZWQgKi8KKwkJaXJxLT5pZnJfcmVjZWl2aW5nID0gYWxpX2lyY2NfaXNfcmVjZWl2aW5nKHNlbGYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorCQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhbGlfaXJjY19pc19yZWNlaXZpbmcgKHNlbGYpCisgKgorICogICAgUmV0dXJuIFRSVUUgaXMgd2UgYXJlIGN1cnJlbnRseSByZWNlaXZpbmcgYSBmcmFtZQorICoKKyAqLworc3RhdGljIGludCBhbGlfaXJjY19pc19yZWNlaXZpbmcoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN0YXR1cyA9IEZBTFNFOworCWludCBpb2Jhc2U7CQkKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiBGQUxTRTspOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCWlmIChzZWxmLT5pby5zcGVlZCA+IDExNTIwMCkgCisJeworCQlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwkJCisJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzEpOworCQlpZigoaW5iKGlvYmFzZStGSVJfRklGT19GUikgJiAweDNmKSAhPSAwKSAJCQorCQl7CisJCQkvKiBXZSBhcmUgcmVjZWl2aW5nIHNvbWV0aGluZyAqLworCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgV2UgYXJlIHJlY2VpdmluZyBzb21ldGhpbmdcbiIsIF9fRlVOQ1RJT05fXyApOworCQkJc3RhdHVzID0gVFJVRTsKKwkJfQorCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsJCQorCX0gCisJZWxzZQorCXsgCisJCXN0YXR1cyA9IChzZWxmLT5yeF9idWZmLnN0YXRlICE9IE9VVFNJREVfRlJBTUUpOworCX0KKwkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphbGlfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmID0gKHN0cnVjdCBhbGlfaXJjY19jYiAqKSBkZXYtPnByaXY7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorCQorCXJldHVybiAmc2VsZi0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIGFsaV9pcmNjX3N1c3BlbmQoc3RydWN0IGFsaV9pcmNjX2NiICpzZWxmKQoreworCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9NRVNTQUdFKCIlcywgU3VzcGVuZGluZ1xuIiwgZHJpdmVyX25hbWUpOworCisJaWYgKHNlbGYtPmlvLnN1c3BlbmRlZCkKKwkJcmV0dXJuOworCisJYWxpX2lyY2NfbmV0X2Nsb3NlKHNlbGYtPm5ldGRldik7CisKKwlzZWxmLT5pby5zdXNwZW5kZWQgPSAxOworCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKK30KKworc3RhdGljIHZvaWQgYWxpX2lyY2Nfd2FrZXVwKHN0cnVjdCBhbGlfaXJjY19jYiAqc2VsZikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tIFN0YXJ0IC0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOworCQorCWlmICghc2VsZi0+aW8uc3VzcGVuZGVkKQorCQlyZXR1cm47CisJCisJYWxpX2lyY2NfbmV0X29wZW4oc2VsZi0+bmV0ZGV2KTsKKwkKKwlJUkRBX01FU1NBR0UoIiVzLCBXYWtpbmcgdXBcbiIsIGRyaXZlcl9uYW1lKTsKKworCXNlbGYtPmlvLnN1c3BlbmRlZCA9IDA7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLS0gRW5kIC0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CQorfQorCitzdGF0aWMgaW50IGFsaV9pcmNjX3BtcHJvYyhzdHJ1Y3QgcG1fZGV2ICpkZXYsIHBtX3JlcXVlc3RfdCBycXN0LCB2b2lkICpkYXRhKQoreworICAgICAgICBzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYgPSAoc3RydWN0IGFsaV9pcmNjX2NiKikgZGV2LT5kYXRhOworICAgICAgICAKKyAgICAgICAgSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0tLS0tLS0tLSBTdGFydCAtLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkKKyAgICAgICAgaWYgKHNlbGYpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHJxc3QpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFBNX1NVU1BFTkQ6CisgICAgICAgICAgICAgICAgICAgICAgICBhbGlfaXJjY19zdXNwZW5kKHNlbGYpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQTV9SRVNVTUU6CisgICAgICAgICAgICAgICAgICAgICAgICBhbGlfaXJjY193YWtldXAoc2VsZik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIElSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKKyAgICAgICAgCisJcmV0dXJuIDA7Cit9CisKKworLyogQUxpIENoaXAgRnVuY3Rpb24gKi8KKworc3RhdGljIHZvaWQgU2V0Q09NSW50ZXJydXB0cyhzdHJ1Y3QgYWxpX2lyY2NfY2IgKnNlbGYgLCB1bnNpZ25lZCBjaGFyIGVuYWJsZSkKK3sKKwkKKwl1bnNpZ25lZCBjaGFyIG5ld01hc2s7CisJCisJaW50IGlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOyAvKiBvciBzaXJfYmFzZSAqLworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0gKCBFbmFibGUgPSAlZCApXG4iLCBfX0ZVTkNUSU9OX18gLCBlbmFibGUpOwkKKwkKKwkvKiBFbmFibGUgdGhlIGludGVycnVwdCB3aGljaCB3ZSB3aXNoIHRvICovCisJaWYgKGVuYWJsZSl7CisJCWlmIChzZWxmLT5pby5kaXJlY3Rpb24gPT0gSU9fWE1JVCkKKwkJeworCQkJaWYgKHNlbGYtPmlvLnNwZWVkID4gMTE1MjAwKSAvKiBGSVIsIE1JUiAqLworCQkJeworCQkJCW5ld01hc2sgPSBzZWxmLT5pZXI7CisJCQl9CisJCQllbHNlIC8qIFNJUiAqLworCQkJeworCQkJCW5ld01hc2sgPSBVQVJUX0lFUl9USFJJIHwgVUFSVF9JRVJfUkRJOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJaWYgKHNlbGYtPmlvLnNwZWVkID4gMTE1MjAwKSAvKiBGSVIsIE1JUiAqLworCQkJeworCQkJCW5ld01hc2sgPSBzZWxmLT5pZXI7CisJCQl9CisJCQllbHNlIC8qIFNJUiAqLworCQkJeworCQkJCW5ld01hc2sgPSBVQVJUX0lFUl9SREk7CisJCQl9CisJCX0KKwl9CisJZWxzZSAvKiBEaXNhYmxlIGFsbCB0aGUgaW50ZXJydXB0cyAqLworCXsKKwkJbmV3TWFzayA9IDB4MDA7CisKKwl9CisKKwkvL1NJUiBhbmQgRklSIGhhcyBkaWZmZXJlbnQgcmVnaXN0ZXJzCisJaWYgKHNlbGYtPmlvLnNwZWVkID4gMTE1MjAwKQorCXsJCisJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCQlvdXRiKG5ld01hc2ssIGlvYmFzZStGSVJfSUVSKTsKKwl9CisJZWxzZQorCQlvdXRiKG5ld01hc2ssIGlvYmFzZStVQVJUX0lFUik7CisJCQorCUlSREFfREVCVUcoMiwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKK30KKworc3RhdGljIHZvaWQgU0lSMkZJUihpbnQgaW9iYXNlKQoreworCS8vdW5zaWduZWQgY2hhciB0bXA7CisJCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJLyogQWxyZWFkeSBwcm90ZWN0ZWQgKGNoYW5nZV9zcGVlZCgpIG9yIHNldHVwKCkpLCBubyBuZWVkIHRvIGxvY2suCisJICogSmVhbiBJSSAqLworCQorCW91dGIoMHgyOCwgaW9iYXNlK1VBUlRfTUNSKTsKKwlvdXRiKDB4NjgsIGlvYmFzZStVQVJUX01DUik7CisJb3V0YigweDg4LCBpb2Jhc2UrVUFSVF9NQ1IpOwkJCisJCisJb3V0YigweDYwLCBpb2Jhc2UrRklSX01DUik7IAkvKiAgTWFzdGVyIFJlc2V0ICovCisJb3V0YigweDIwLCBpb2Jhc2UrRklSX01DUik7IAkvKiAgTWFzdGVyIEludGVycnVwdCBFbmFibGUgKi8KKwkKKwkvL3RtcCA9IGluYihpb2Jhc2UrRklSX0xDUl9CKTsJLyogU0lQIGVuYWJsZSAqLworCS8vdG1wIHw9IDB4MjA7CisJLy9vdXRiKHRtcCwgaW9iYXNlK0ZJUl9MQ1JfQik7CQorCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCAtLS0tLS0tLS0tLS0tLS0tLS1cbiIsIF9fRlVOQ1RJT05fXyApOwkKK30KKworc3RhdGljIHZvaWQgRklSMlNJUihpbnQgaW9iYXNlKQoreworCXVuc2lnbmVkIGNoYXIgdmFsOworCQorCUlSREFfREVCVUcoMSwgIiVzKCksIC0tLS0tLS0tLS0tLS0tLS0gU3RhcnQgLS0tLS0tLS0tLS0tLS0tLVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJLyogQWxyZWFkeSBwcm90ZWN0ZWQgKGNoYW5nZV9zcGVlZCgpIG9yIHNldHVwKCkpLCBubyBuZWVkIHRvIGxvY2suCisJICogSmVhbiBJSSAqLworCQorCW91dGIoMHgyMCwgaW9iYXNlK0ZJUl9NQ1IpOyAJLyogSVJRIHRvIGxvdyAqLworCW91dGIoMHgwMCwgaW9iYXNlK1VBUlRfSUVSKTsgCQorCQkKKwlvdXRiKDB4QTAsIGlvYmFzZStGSVJfTUNSKTsgCS8qIERvbid0IHNldCBtYXN0ZXIgcmVzZXQgKi8KKwlvdXRiKDB4MDAsIGlvYmFzZStVQVJUX0ZDUik7CisJb3V0YigweDA3LCBpb2Jhc2UrVUFSVF9GQ1IpOwkJCisJCisJdmFsID0gaW5iKGlvYmFzZStVQVJUX1JYKTsKKwl2YWwgPSBpbmIoaW9iYXNlK1VBUlRfTFNSKTsKKwl2YWwgPSBpbmIoaW9iYXNlK1VBUlRfTVNSKTsKKwkKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgLS0tLS0tLS0tLS0tLS0tLS0tXG4iLCBfX0ZVTkNUSU9OX18gKTsKK30KKworTU9EVUxFX0FVVEhPUigiQmVuamFtaW4gS29uZyA8YmVuamFtaW5fa29uZ0BhbGkuY29tLnR3PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTGkgRklSIENvbnRyb2xsZXIgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkJhc2UgSS9PIGFkZHJlc3NlcyIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRIGxpbmVzIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoZG1hLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhkbWEsICJETUEgY2hhbm5lbHMiKTsKKworbW9kdWxlX2luaXQoYWxpX2lyY2NfaW5pdCk7Cittb2R1bGVfZXhpdChhbGlfaXJjY19jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuaCBiL2RyaXZlcnMvbmV0L2lyZGEvYWxpLWlyY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDg5YzY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9hbGktaXJjYy5oCkBAIC0wLDAgKzEsMjMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGFsaS1pcmNjLmgKKyAqIFZlcnNpb246ICAgICAgIDAuNQorICogRGVzY3JpcHRpb246ICAgRHJpdmVyIGZvciB0aGUgQUxJIE0xNTM1RCBhbmQgTTE1NDNDIEZJUiBDb250cm9sbGVyCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBCZW5qYW1pbiBLb25nIDxiZW5qYW1pbl9rb25nQGFsaS5jb20udHc+CisgKiBDcmVhdGVkIGF0OiAgICAyMDAwLzEwLzE2IDAzOjQ2UE0KKyAqIE1vZGlmaWVkIGF0OiAgIDIwMDEvMS8zIDAyOjU2UE0KKyAqIE1vZGlmaWVkIGJ5OiAgIEJlbmphbWluIEtvbmcgPGJlbmphbWluX2tvbmdAYWxpLmNvbS50dz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMjAwMCBCZW5qYW1pbiBLb25nIDxiZW5qYW1pbl9rb25nQGFsaS5jb20udHc+CisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEFMSV9JUkNDX0gKKyNkZWZpbmUgQUxJX0lSQ0NfSAorCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qIFNJUiBSZWdpc3RlciAqLworLyogVXNyIGRlZmluaXRpb24gb2YgbGludXgvc2VyaWFsX3JlZy5oICovCisKKy8qIEZJUiBSZWdpc3RlciAqLworI2RlZmluZSBCQU5LMAkJMHgyMAorI2RlZmluZSBCQU5LMQkJMHgyMQorI2RlZmluZSBCQU5LMgkJMHgyMgorI2RlZmluZSBCQU5LMwkJMHgyMworCisjZGVmaW5lIEZJUl9NQ1IJCTB4MDcJLyogTWFzdGVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKworLyogQmFuayAwICovCisjZGVmaW5lIEZJUl9EUgkJMHgwMAkvKiBBbGlhcyAwLCBGSVIgRGF0YSBSZWdpc3RlciAoUi9XKSAqLyAKKyNkZWZpbmUgRklSX0lFUgkJMHgwMQkvKiBBbGlhcyAxLCBGSVIgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAoUi9XKSAqLworI2RlZmluZSBGSVJfSUlSCQkweDAyCS8qIEFsaWFzIDIsIEZJUiBJbnRlcnJ1cHQgSWRlbnRpZmljYXRpb24gUmVnaXN0ZXIgKFJlYWQgb25seSkgKi8KKyNkZWZpbmUgRklSX0xDUl9BCTB4MDMJLyogQWxpYXMgMywgRklSIExpbmUgQ29udHJvbCBSZWdpc3RlciBBIChSL1cpICovCisjZGVmaW5lIEZJUl9MQ1JfQgkweDA0CS8qIEFsaWFzIDQsIEZJUiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgQiAoUi9XKSAqLworI2RlZmluZSBGSVJfTFNSCQkweDA1CS8qIEFsaWFzIDUsIEZJUiBMaW5lIFN0YXR1cyBSZWdpc3RlciAoUi9XKSAqLworI2RlZmluZSBGSVJfQlNSCQkweDA2CS8qIEFsaWFzIDYsIEZJUiBCdXMgU3RhdHVzIFJlZ2lzdGVyIChSZWFkIG9ubHkpICovCisKKworCS8qIEFsaWFzIDEgKi8KKwkjZGVmaW5lCUlFUl9GSUZPCTB4MTAJLyogRklSIEZJRk8gSW50ZXJydXB0IEVuYWJsZSAqLwkKKwkjZGVmaW5lCUlFUl9USU1FUgkweDIwIAkvKiBUaW1lciBJbnRlcnJ1cHQgRW5hYmxlICovIAorCSNkZWZpbmUJSUVSX0VPTQkJMHg0MAkvKiBFbmQgb2YgTWVzc2FnZSBJbnRlcnJ1cHQgRW5hYmxlICovCisJI2RlZmluZSBJRVJfQUNUCQkweDgwCS8qIEFjdGl2ZSBGcmFtZSBJbnRlcnJ1cHQgRW5hYmxlICovCisJCisJLyogQWxpYXMgMiAqLworCSNkZWZpbmUgSUlSX0ZJRk8JMHgxMAkvKiBGSVIgRklGTyBJbnRlcnJ1cHQgKi8KKwkjZGVmaW5lIElJUl9USU1FUgkweDIwCS8qIFRpbWVyIEludGVycnVwdCAqLworCSNkZWZpbmUgSUlSX0VPTQkJMHg0MAkvKiBFbmQgb2YgTWVzc2FnZSBJbnRlcnJ1cHQgKi8KKwkjZGVmaW5lIElJUl9BQ1QJCTB4ODAJLyogQWN0aXZlIEZyYW1lIEludGVycnVwdCAqLwkKKwkKKwkvKiBBbGlhcyAzICovCisJI2RlZmluZSBMQ1JfQV9GSUZPX1JFU0VUIDB4ODAJLyogRklGTyBSZXNldCAqLworCisJLyogQWxpYXMgNCAqLworCSNkZWZpbmUJTENSX0JfQlcJMHgxMAkvKiBCcmljayBXYWxsICovCisJI2RlZmluZSBMQ1JfQl9TSVAJMHgyMAkvKiBTSVAgRW5hYmxlICovCisJI2RlZmluZQlMQ1JfQl9UWF9NT0RFIAkweDQwCS8qIFRyYW5zbWl0IE1vZGUgKi8KKwkjZGVmaW5lIExDUl9CX1JYX01PREUJMHg4MAkvKiBSZWNlaXZlIE1vZGUgKi8KKwkKKwkvKiBBbGlhcyA1ICovCQorCSNkZWZpbmUgTFNSX0ZJUl9MU0EJMHgwMAkvKiBGSVIgTGluZSBTdGF0dXMgQWRkcmVzcyAqLworCSNkZWZpbmUgTFNSX0ZSQU1FX0FCT1JUCTB4MDgJLyogRnJhbWUgQWJvcnQgKi8KKwkjZGVmaW5lIExTUl9DUkNfRVJST1IJMHgxMAkvKiBDUkMgRXJyb3IgKi8KKwkjZGVmaW5lIExTUl9TSVpFX0VSUk9SCTB4MjAJLyogU2l6ZSBFcnJvciAqLworCSNkZWZpbmUgTFNSX0ZSQU1FX0VSUk9SCTB4NDAJLyogRnJhbWUgRXJyb3IgKi8KKwkjZGVmaW5lIExTUl9GSUZPX1VSCTB4ODAJLyogRklGTyBVbmRlcnJ1biAqLworCSNkZWZpbmUgTFNSX0ZJRk9fT1IJMHg4MAkvKiBGSUZPIE92ZXJydW4gKi8KKwkJCisJLyogQWxpYXMgNiAqLworCSNkZWZpbmUgQlNSX0ZJRk9fTk9UX0VNUFRZCTB4ODAJLyogRklGTyBOb3QgRW1wdHkgKi8KKwkKKy8qIEJhbmsgMSAqLworI2RlZmluZQlGSVJfQ1IJCTB4MDAgCS8qIEFsaWFzIDAsIEZJUiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIChSL1cpICovCisjZGVmaW5lIEZJUl9GSUZPX1RSCTB4MDEgICAJLyogQWxpYXMgMSwgRklSIEZJRk8gVGhyZXNob2xkIFJlZ2lzdGVyIChSL1cpICovCisjZGVmaW5lIEZJUl9ETUFfVFIJMHgwMgkvKiBBbGlhcyAyLCBGSVIgRE1BIFRocmVzaG9sZCBSZWdpc3RlciAoUi9XKSAqLworI2RlZmluZSBGSVJfVElNRVJfSUlSCTB4MDMJLyogQWxpYXMgMywgRklSIFRpbWVyIGludGVycnVwdCBpbnRlcnZhbCByZWdpc3RlciAoVy9PKSAqLworI2RlZmluZSBGSVJfRklGT19GUgkweDAzCS8qIEFsaWFzIDMsIEZJUiBGSUZPIEZsYWcgcmVnaXN0ZXIgKFIvTykgKi8KKyNkZWZpbmUgRklSX0ZJRk9fUkFSCTB4MDQgCS8qIEFsaWFzIDQsIEZJUiBGSUZPIFJlYWQgQWRkcmVzcyByZWdpc3RlciAoUi9PKSAqLworI2RlZmluZSBGSVJfRklGT19XQVIJMHgwNQkvKiBBbGlhcyA1LCBGSVIgRklGTyBXcml0ZSBBZGRyZXNzIHJlZ2lzdGVyIChSL08pICovCisjZGVmaW5lIEZJUl9UUgkJMHgwNgkvKiBBbGlhcyA2LCBUZXN0IFJFZ2lzdGVyIChXL08pICovCisKKwkvKiBBbGlhcyAwICovCisJI2RlZmluZSBDUl9ETUFfRU4JMHgwMQkvKiBETUEgRW5hYmxlICovCisJI2RlZmluZSBDUl9ETUFfQlVSU1QJMHgwMgkvKiBETUEgQnVyc3QgTW9kZSAqLworCSNkZWZpbmUgQ1JfVElNRVJfRU4gCTB4MDgJLyogVGltZXIgRW5hYmxlICovCisJCisJLyogQWxpYXMgMyAqLworCSNkZWZpbmUgVElNRVJfSUlSXzUwMAkweDAwCS8qIDUwMCB1cyAqLworCSNkZWZpbmUgVElNRVJfSUlSXzFtcwkweDAxCS8qIDEgICBtcyAqLworCSNkZWZpbmUgVElNRVJfSUlSXzJtcwkweDAyCS8qIDIgICBtcyAqLworCSNkZWZpbmUgVElNRVJfSUlSXzRtcwkweDAzCS8qIDQgICBtcyAqLworCQorLyogQmFuayAyICovCisjZGVmaW5lIEZJUl9JUkRBX0NSCTB4MDAJLyogQWxpYXMgMCwgSXJEQSBDb250cm9sIFJlZ2lzdGVyIChSL1cpICovCisjZGVmaW5lIEZJUl9CT0ZfQ1IJMHgwMQkvKiBBbGlhcyAxLCBCT0YgQ291bnQgUmVnaXN0ZXIgKFIvVykgKi8KKyNkZWZpbmUgRklSX0JXX0NSCTB4MDIJLyogQWxpYXMgMiwgQnJpY2sgV2FsbCBDb3VudCBSZWdpc3RlciAoUi9XKSAqLworI2RlZmluZSBGSVJfVFhfRFNSX0hJCTB4MDMJLyogQWxpYXMgMywgVFggRGF0YSBTaXplIFJlZ2lzdGVyIChoaWdoKSAoUi9XKSAqLworI2RlZmluZSBGSVJfVFhfRFNSX0xPCTB4MDQJLyogQWxpYXMgNCwgVFggRGF0YSBTaXplIFJlZ2lzdGVyIChsb3cpIChSL1cpICovCisjZGVmaW5lIEZJUl9SWF9EU1JfSEkJMHgwNQkvKiBBbGlhcyA1LCBSWCBEYXRhIFNpemUgUmVnaXN0ZXIgKGhpZ2gpIChSL1cpICovCisjZGVmaW5lIEZJUl9SWF9EU1JfTE8JMHgwNgkvKiBBbGlhcyA2LCBSWCBEYXRhIFNpemUgUmVnaXN0ZXIgKGxvdykgKFIvVykgKi8KKwkKKwkvKiBBbGlhcyAwICovCisJI2RlZmluZSBJUkRBX0NSX0hETEMxMTUyIDB4ODAJLyogMS4xNTJNYnBzIEhETEMgU2VsZWN0ICovCisJI2RlZmluZSBJUkRBX0NSX0NSQwkwWDQwCS8qIENSQyBTZWxlY3QuICovCisJI2RlZmluZSBJUkRBX0NSX0hETEMJMHgyMAkvKiBIRExDIHNlbGVjdC4gKi8KKwkjZGVmaW5lIElSREFfQ1JfSFBfTU9ERSAweDEwCS8qIEhQIG1vZGUgKHJlYWQgb25seSkgKi8KKwkjZGVmaW5lIElSREFfQ1JfU0RfU1QJMHgwOAkvKiBTRC9NT0RFIFN0YXRlLiAgKi8KKwkjZGVmaW5lIElSREFfQ1JfRklSX1NJTiAweDA0CS8qIEZJUiBTSU4gU2VsZWN0LiAqLworCSNkZWZpbmUgSVJEQV9DUl9JVFRYXzAJMHgwMgkvKiBTT1VUIFN0YXRlLiBJUlRYIGZvcmNlIHRvIDAgKi8KKwkjZGVmaW5lIElSREFfQ1JfSVRUWF8xCTB4MDMJLyogU09VVCBTdGF0ZS4gSVJUWCBmb3JjZSB0byAxICovCisJCisvKiBCYW5rIDMgKi8KKyNkZWZpbmUgRklSX0lEX1ZSCTB4MDAJLyogQWxpYXMgMCwgRklSIElEIFZlcnNpb24gUmVnaXN0ZXIgKFIvTykgKi8KKyNkZWZpbmUgRklSX01PRFVMRV9DUgkweDAxCS8qIEFsaWFzIDEsIEZJUiBNb2R1bGUgQ29udHJvbCBSZWdpc3RlciAoUi9XKSAqLworI2RlZmluZSBGSVJfSU9fQkFTRV9ISQkweDAyCS8qIEFsaWFzIDIsIEZJUiBIaWdoZXIgSS9PIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAoUi9PKSAqLworI2RlZmluZSBGSVJfSU9fQkFTRV9MTwkweDAzCS8qIEFsaWFzIDMsIEZJUiBMb3dlciBJL08gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIChSL08pICovCisjZGVmaW5lIEZJUl9JUlFfQ1IJMHgwNAkvKiBBbGlhcyA0LCBGSVIgSVJRIENoYW5uZWwgUmVnaXN0ZXIgKFIvTykgKi8KKyNkZWZpbmUgRklSX0RNQV9DUgkweDA1CS8qIEFsaWFzIDUsIEZJUiBETUEgQ2hhbm5lbCBSZWdpc3RlciAoUi9PKSAqLworCitzdHJ1Y3QgYWxpX2NoaXAgeworCWNoYXIgKm5hbWU7CisJaW50IGNmZ1syXTsKKwl1bnNpZ25lZCBjaGFyIGVudHIxOworCXVuc2lnbmVkIGNoYXIgZW50cjI7CisJdW5zaWduZWQgY2hhciBjaWRfaW5kZXg7CisJdW5zaWduZWQgY2hhciBjaWRfdmFsdWU7CisJaW50ICgqcHJvYmUpKHN0cnVjdCBhbGlfY2hpcCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pOworCWludCAoKmluaXQpKHN0cnVjdCBhbGlfY2hpcCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pOyAKK307Cit0eXBlZGVmIHN0cnVjdCBhbGlfY2hpcCBhbGlfY2hpcF90OworCisKKy8qIERNQSBtb2RlcyBuZWVkZWQgKi8KKyNkZWZpbmUgRE1BX1RYX01PREUgICAgIDB4MDggICAgLyogTWVtIHRvIEkvTywgKyssIGRlbWFuZC4gKi8KKyNkZWZpbmUgRE1BX1JYX01PREUgICAgIDB4MDQgICAgLyogSS9PIHRvIG1lbSwgKyssIGRlbWFuZC4gKi8KKworI2RlZmluZSBNQVhfVFhfV0lORE9XIAk3CisjZGVmaW5lIE1BWF9SWF9XSU5ET1cgCTcKKworI2RlZmluZSBUWF9GSUZPX1RocmVzaG9sZAk4CisjZGVmaW5lIFJYX0ZJRk9fVGhyZXNob2xkCTEKKyNkZWZpbmUgVFhfRE1BX1RocmVzaG9sZAkxCisjZGVmaW5lIFJYX0RNQV9UaHJlc2hvbGQJMQorCisvKiBGb3Igc3RvcmluZyBlbnRyaWVzIGluIHRoZSBzdGF0dXMgRklGTyAqLworCitzdHJ1Y3Qgc3RfZmlmb19lbnRyeSB7CisJaW50IHN0YXR1czsKKwlpbnQgbGVuOworfTsKKworc3RydWN0IHN0X2ZpZm8geworCXN0cnVjdCBzdF9maWZvX2VudHJ5IGVudHJpZXNbTUFYX1JYX1dJTkRPV107CisJaW50IHBlbmRpbmdfYnl0ZXM7CisJaW50IGhlYWQ7CisJaW50IHRhaWw7CisJaW50IGxlbjsKK307CisKK3N0cnVjdCBmcmFtZV9jYiB7CisJdm9pZCAqc3RhcnQ7IC8qIFN0YXJ0IG9mIGZyYW1lIGluIERNQSBtZW0gKi8KKwlpbnQgbGVuOyAgICAgLyogTGVuZ2h0IG9mIGZyYW1lIGluIERNQSBtZW0gKi8KK307CisKK3N0cnVjdCB0eF9maWZvIHsKKwlzdHJ1Y3QgZnJhbWVfY2IgcXVldWVbTUFYX1RYX1dJTkRPV107IC8qIEluZm8gYWJvdXQgZnJhbWVzIGluIHF1ZXVlICovCisJaW50ICAgICAgICAgICAgIHB0cjsgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50bHkgYmVpbmcgc2VudCAqLworCWludCAgICAgICAgICAgICBsZW47ICAgICAgICAgICAgICAgICAgLyogTGVuZ2h0IG9mIHF1ZXVlICovCisJaW50ICAgICAgICAgICAgIGZyZWU7ICAgICAgICAgICAgICAgICAvKiBOZXh0IGZyZWUgc2xvdCAqLworCXZvaWQgICAgICAgICAgICp0YWlsOyAgICAgICAgICAgICAgICAgLyogTmV4dCBmcmVlIHN0YXJ0IGluIERNQSBtZW0gKi8KK307CisKKy8qIFByaXZhdGUgZGF0YSBmb3IgZWFjaCBpbnN0YW5jZSAqLworc3RydWN0IGFsaV9pcmNjX2NiIHsKKworCXN0cnVjdCBzdF9maWZvIHN0X2ZpZm87ICAgIC8qIEluZm8gYWJvdXQgcmVjZWl2ZWQgZnJhbWVzICovCisJc3RydWN0IHR4X2ZpZm8gdHhfZmlmbzsgICAgLyogSW5mbyBhYm91dCBmcmFtZXMgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KKworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7ICAgICAvKiBZZXMhIHdlIGFyZSBzb21lIGtpbmQgb2YgbmV0ZGV2aWNlICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJCisJc3RydWN0IGlybGFwX2NiICppcmxhcDsgICAgLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLworCXN0cnVjdCBxb3NfaW5mbyBxb3M7ICAgICAgIC8qIFFvUyBjYXBhYmlsaXRpZXMgZm9yIHRoaXMgZGV2aWNlICovCisJCisJY2hpcGlvX3QgaW87ICAgICAgICAgICAgICAgLyogSXJEQSBjb250cm9sbGVyIGluZm9ybWF0aW9uICovCisJaW9idWZmX3QgdHhfYnVmZjsgICAgICAgICAgLyogVHJhbnNtaXQgYnVmZmVyICovCisJaW9idWZmX3QgcnhfYnVmZjsgICAgICAgICAgLyogUmVjZWl2ZSBidWZmZXIgKi8KKwlkbWFfYWRkcl90IHR4X2J1ZmZfZG1hOworCWRtYV9hZGRyX3QgcnhfYnVmZl9kbWE7CisKKwlfX3U4IGllcjsgICAgICAgICAgICAgICAgICAvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyICovCisJCisJX191OCBJbnRlcnJ1cHRJRDsJICAgLyogSW50ZXJydXB0IElEICovCQorCV9fdTggQnVzU3RhdHVzOwkJICAgLyogQnVzIFN0YXR1cyAqLwkKKwlfX3U4IExpbmVTdGF0dXM7CSAgIC8qIExpbmUgU3RhdHVzICovCQorCQorCXVuc2lnbmVkIGNoYXIgcmN2RnJhbWVzT3ZlcmZsb3c7CisJCQorCXN0cnVjdCB0aW1ldmFsIHN0YW1wOworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKworCXNwaW5sb2NrX3QgbG9jazsgICAgICAgICAgIC8qIEZvciBzZXJpYWxpemluZyBvcGVyYXRpb25zICovCisJCisJX191MzIgbmV3X3NwZWVkOworCWludCBpbmRleDsgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGluZGV4ICovCisJCisJdW5zaWduZWQgY2hhciBmaWZvX29wdGlfYnVmOworCisgICAgICAgIHN0cnVjdCBwbV9kZXYgKmRldjsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzd2l0Y2hfYmFuayhpbnQgaW9iYXNlLCBpbnQgYmFuaykKK3sKKwkJb3V0YihiYW5rLCBpb2Jhc2UrRklSX01DUik7Cit9CisKKyNlbmRpZiAvKiBBTElfSVJDQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2F1MTAwMF9pcmNjLmggYi9kcml2ZXJzL25ldC9pcmRhL2F1MTAwMF9pcmNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EzMWQ0NjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2F1MTAwMF9pcmNjLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKgorICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCisgKglBdTEwMDAgSXJEQSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqICAgICAgICAgCXBwb3BvdkBtdmlzdGEuY29tIG9yIHNvdXJjZUBtdmlzdGEuY29tCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KKyAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAorICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgQVUxMDAwX0lSQ0NfSAorI2RlZmluZSBBVTEwMDBfSVJDQ19ICisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgTlVNX0lSX0lGRiAgICAgICAgICAxCisjZGVmaW5lIE5VTV9JUl9ERVNDICAgICAgICA2NAorI2RlZmluZSBSSU5HX1NJWkVfNCAgICAgICAweDAKKyNkZWZpbmUgUklOR19TSVpFXzE2ICAgICAgMHgzCisjZGVmaW5lIFJJTkdfU0laRV82NCAgICAgIDB4RgorI2RlZmluZSBNQVhfTlVNX0lSX0RFU0MgICAgNjQKKyNkZWZpbmUgTUFYX0JVRl9TSVpFICAgICAyMDQ4CisKKyNkZWZpbmUgQlBTXzExNTIwMCAgICAgICAgICAwCisjZGVmaW5lIEJQU181NzYwMCAgICAgICAgICAgMQorI2RlZmluZSBCUFNfMzg0MDAgICAgICAgICAgIDIKKyNkZWZpbmUgQlBTXzE5MjAwICAgICAgICAgICA1CisjZGVmaW5lIEJQU185NjAwICAgICAgICAgICAxMQorI2RlZmluZSBCUFNfMjQwMCAgICAgICAgICAgNDcKKworLyogUmluZyBkZXNjcmlwdG9yIGZsYWdzICovCisjZGVmaW5lIEFVX09XTiAgICAgICAgICAgKDE8PDcpIC8qIHR4LHJ4ICovCisKKyNkZWZpbmUgSVJfRElTX0NSQyAgICAgICAoMTw8NikgLyogdHggKi8KKyNkZWZpbmUgSVJfQkFEX0NSQyAgICAgICAoMTw8NSkgLyogdHggKi8KKyNkZWZpbmUgSVJfTkVFRF9QVUxTRSAgICAoMTw8NCkgLyogdHggKi8KKyNkZWZpbmUgSVJfRk9SQ0VfVU5ERVIgICAoMTw8MykgLyogdHggKi8KKyNkZWZpbmUgSVJfRElTQUJMRV9UWCAgICAoMTw8MikgLyogdHggKi8KKyNkZWZpbmUgSVJfSFdfVU5ERVIgICAgICAoMTw8MCkgLyogdHggKi8KKyNkZWZpbmUgSVJfVFhfRVJST1IgICAgICAoSVJfRElTX0NSQ3xJUl9CQURfQ1JDfElSX0hXX1VOREVSKQorCisjZGVmaW5lIElSX1BIWV9FUlJPUiAgICAgKDE8PDYpIC8qIHJ4ICovCisjZGVmaW5lIElSX0NSQ19FUlJPUiAgICAgKDE8PDUpIC8qIHJ4ICovCisjZGVmaW5lIElSX01BWF9MRU4gICAgICAgKDE8PDQpIC8qIHJ4ICovCisjZGVmaW5lIElSX0ZJRk9fT1ZFUiAgICAgKDE8PDMpIC8qIHJ4ICovCisjZGVmaW5lIElSX1NJUl9FUlJPUiAgICAgKDE8PDIpIC8qIHJ4ICovCisjZGVmaW5lIElSX1JYX0VSUk9SICAgICAgKElSX1BIWV9FUlJPUnxJUl9DUkNfRVJST1J8IFwKKwkJSVJfTUFYX0xFTnxJUl9GSUZPX09WRVJ8SVJfU0lSX0VSUk9SKQorCit0eXBlZGVmIHN0cnVjdCBkYl9kZXN0IHsKKwlzdHJ1Y3QgZGJfZGVzdCAqcG5leHQ7CisJdm9sYXRpbGUgdTMyICp2YWRkcjsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworfSBkYl9kZXN0X3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgcmluZ19kZXNjIHsKKwl1OCBjb3VudF8wOyAgICAgICAgICAgICAgIC8qIDc6MCAgKi8KKwl1OCBjb3VudF8xOyAgICAgICAgICAgICAgIC8qIDEyOjggKi8KKwl1OCByZXNlcnZlZDsKKwl1OCBmbGFnczsKKwl1OCBhZGRyXzA7ICAgICAgICAgICAgICAgIC8qIDc6MCAgICovCisJdTggYWRkcl8xOyAgICAgICAgICAgICAgICAvKiAxNTo4ICAqLworCXU4IGFkZHJfMjsgICAgICAgICAgICAgICAgLyogMjM6MTYgKi8KKwl1OCBhZGRyXzM7ICAgICAgICAgICAgICAgIC8qIDMxOjI0ICovCit9IHJpbmdfZGVzdF90OworCisKKy8qIFByaXZhdGUgZGF0YSBmb3IgZWFjaCBpbnN0YW5jZSAqLworc3RydWN0IGF1MWtfcHJpdmF0ZSB7CisKKwlkYl9kZXN0X3QgKnBEQmZyZWU7CisJZGJfZGVzdF90IGRiWzIqTlVNX0lSX0RFU0NdOworCXZvbGF0aWxlIHJpbmdfZGVzdF90ICpyeF9yaW5nW05VTV9JUl9ERVNDXTsKKwl2b2xhdGlsZSByaW5nX2Rlc3RfdCAqdHhfcmluZ1tOVU1fSVJfREVTQ107CisJZGJfZGVzdF90ICpyeF9kYl9pbnVzZVtOVU1fSVJfREVTQ107CisJZGJfZGVzdF90ICp0eF9kYl9pbnVzZVtOVU1fSVJfREVTQ107CisJdTMyIHJ4X2hlYWQ7CisJdTMyIHR4X2hlYWQ7CisJdTMyIHR4X3RhaWw7CisJdTMyIHR4X2Z1bGw7CisKKwlpb2J1ZmZfdCByeF9idWZmOworCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwkKKwlzdHJ1Y3QgdGltZXZhbCBzdGFtcDsKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisJc3RydWN0IHFvc19pbmZvCQlxb3M7CisJc3RydWN0IGlybGFwX2NiCQkqaXJsYXA7CisJCisJdTggb3BlbjsKKwl1MzIgc3BlZWQ7CisJdTMyIG5ld3NwZWVkOworCQorCXUzMiBpbnRyX3dvcmtfZG9uZTsgLyogbnVtYmVyIG9mIFJ4IGFuZCBUeCBwa3RzIHByb2Nlc3NlZCBpbiB0aGUgaXNyICovCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisKKwlzcGlubG9ja190IGxvY2s7ICAgICAgICAgICAvKiBGb3Igc2VyaWFsaXppbmcgb3BlcmF0aW9ucyAqLworICAgICAgICBzdHJ1Y3QgcG1fZGV2ICpkZXY7Cit9OworI2VuZGlmIC8qIEFVMTAwMF9JUkNDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvYXUxa19pci5jIGIvZHJpdmVycy9uZXQvaXJkYS9hdTFrX2lyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiMTk4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvYXUxa19pci5jCkBAIC0wLDAgKzEsODUxIEBACisvKgorICogQWxjaGVteSBTZW1pIEF1MTAwMCBJckRBIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgIAlwcG9wb3ZAbXZpc3RhLmNvbSBvciBzb3VyY2VAbXZpc3RhLmNvbQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChWZXJzaW9uIDIpIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXUxMDAwLmg+CisjaWYgZGVmaW5lZChDT05GSUdfTUlQU19QQjEwMDApIHx8IGRlZmluZWQoQ09ORklHX01JUFNfUEIxMTAwKQorI2luY2x1ZGUgPGFzbS9wYjEwMDAuaD4KKyNlbGlmIGRlZmluZWQoQ09ORklHX01JUFNfREIxMDAwKSB8fCBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTEwMCkKKyNpbmNsdWRlIDxhc20vZGIxeDAwLmg+CisjZWxzZSAKKyNlcnJvciBhdTFrX2lyOiB1bnN1cHBvcnRlZCBib2FyZAorI2VuZGlmCisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJtb2QuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS93cmFwcGVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKyNpbmNsdWRlICJhdTEwMDBfaXJjYy5oIgorCitzdGF0aWMgaW50IGF1MWtfaXJkYV9uZXRfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgYXUxa19pcmRhX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCBhdTFrX2lyZGFfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYXUxa19pcmRhX2hhcmRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgYXUxa19pcmRhX3J4KHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHZvaWQgYXUxa19pcmRhX2ludGVycnVwdChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgdm9pZCBhdTFrX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmF1MWtfaXJkYV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgYXUxa19pcmRhX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBpZnJlcSAqLCBpbnQpOworc3RhdGljIGludCBhdTFrX2lyZGFfc2V0X3NwZWVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzcGVlZCk7CisKK3N0YXRpYyB2b2lkICpkbWFfYWxsb2Moc2l6ZV90LCBkbWFfYWRkcl90ICopOworc3RhdGljIHZvaWQgZG1hX2ZyZWUodm9pZCAqLCBzaXplX3QpOworCitzdGF0aWMgaW50IHFvc19tdHRfYml0cyA9IDB4MDc7ICAvKiAxIG1zIG9yIG1vcmUgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqaXJfZGV2c1tOVU1fSVJfSUZGXTsKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KKyAgICAiYXUxa19pcmNjOjEuMiBwcG9wb3ZAbXZpc3RhLmNvbVxuIjsKKworI2RlZmluZSBSVU5fQVQoeCkgKGppZmZpZXMgKyAoeCkpCisKKyNpZiBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTAwMCkgfHwgZGVmaW5lZChDT05GSUdfTUlQU19EQjExMDApCitzdGF0aWMgQkNTUiAqIGNvbnN0IGJjc3IgPSAoQkNTUiAqKTB4QUUwMDAwMDA7CisjZW5kaWYKKworc3RhdGljIERFRklORV9TUElOTE9DSyhpcl9sb2NrKTsKKworLyoKKyAqIElyREEgcGVyaXBoZXJhbCBidWcuIFlvdSBoYXZlIHRvIHJlYWQgdGhlIHJlZ2lzdGVyCisgKiB0d2ljZSB0byBnZXQgdGhlIHJpZ2h0IHZhbHVlLgorICovCit1MzIgcmVhZF9pcl9yZWcodTMyIGFkZHIpIAoreyAKKwlyZWFkbChhZGRyKTsKKwlyZXR1cm4gcmVhZGwoYWRkcik7Cit9CisKKworLyoKKyAqIEJ1ZmZlciBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiByb3V0aW5lcy4gVGhlIGJ1ZmZlciBkZXNjcmlwdG9yIHJldHVybmVkCisgKiBoYXMgdGhlIHZpcnR1YWwgYW5kIGRtYSBhZGRyZXNzIG9mIGEgYnVmZmVyIHN1aXRhYmxlIGZvciAKKyAqIGJvdGgsIHJlY2VpdmUgYW5kIHRyYW5zbWl0IG9wZXJhdGlvbnMuCisgKi8KK3N0YXRpYyBkYl9kZXN0X3QgKkdldEZyZWVEQihzdHJ1Y3QgYXUxa19wcml2YXRlICphdXApCit7CisJZGJfZGVzdF90ICpwREI7CisJcERCID0gYXVwLT5wREJmcmVlOworCisJaWYgKHBEQikgeworCQlhdXAtPnBEQmZyZWUgPSBwREItPnBuZXh0OworCX0KKwlyZXR1cm4gcERCOworfQorCitzdGF0aWMgdm9pZCBSZWxlYXNlREIoc3RydWN0IGF1MWtfcHJpdmF0ZSAqYXVwLCBkYl9kZXN0X3QgKnBEQikKK3sKKwlkYl9kZXN0X3QgKnBEQmZyZWUgPSBhdXAtPnBEQmZyZWU7CisJaWYgKHBEQmZyZWUpCisJCXBEQmZyZWUtPnBuZXh0ID0gcERCOworCWF1cC0+cERCZnJlZSA9IHBEQjsKK30KKworCisvKgorICBETUEgbWVtb3J5IGFsbG9jYXRpb24sIGRlcml2ZWQgZnJvbSBwY2lfYWxsb2NfY29uc2lzdGVudC4KKyAgSG93ZXZlciwgdGhlIEF1MTAwMCBkYXRhIGNhY2hlIGlzIGNvaGVyZW50ICh3aGVuIHByb2dyYW1tZWQKKyAgc28pLCB0aGVyZWZvcmUgd2UgcmV0dXJuIEtTRUcwIGFkZHJlc3MsIG5vdCBLU0VHMS4KKyovCitzdGF0aWMgdm9pZCAqZG1hX2FsbG9jKHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICogZG1hX2hhbmRsZSkKK3sKKwl2b2lkICpyZXQ7CisJaW50IGdmcCA9IEdGUF9BVE9NSUMgfCBHRlBfRE1BOworCisJcmV0ID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlcyhnZnAsIGdldF9vcmRlcihzaXplKSk7CisKKwlpZiAocmV0ICE9IE5VTEwpIHsKKwkJbWVtc2V0KHJldCwgMCwgc2l6ZSk7CisJCSpkbWFfaGFuZGxlID0gdmlydF90b19idXMocmV0KTsKKwkJcmV0ID0gKHZvaWQgKilLU0VHMEFERFIocmV0KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdm9pZCBkbWFfZnJlZSh2b2lkICp2YWRkciwgc2l6ZV90IHNpemUpCit7CisJdmFkZHIgPSAodm9pZCAqKUtTRUcwQUREUih2YWRkcik7CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgdmFkZHIsIGdldF9vcmRlcihzaXplKSk7Cit9CisKKworc3RhdGljIHZvaWQgCitzZXR1cF9od19yaW5ncyhzdHJ1Y3QgYXUxa19wcml2YXRlICphdXAsIHUzMiByeF9iYXNlLCB1MzIgdHhfYmFzZSkKK3sKKwlpbnQgaTsKKwlmb3IgKGk9MDsgaTxOVU1fSVJfREVTQzsgaSsrKSB7CisJCWF1cC0+cnhfcmluZ1tpXSA9ICh2b2xhdGlsZSByaW5nX2Rlc3RfdCAqKSAKKwkJCShyeF9iYXNlICsgc2l6ZW9mKHJpbmdfZGVzdF90KSppKTsKKwl9CisJZm9yIChpPTA7IGk8TlVNX0lSX0RFU0M7IGkrKykgeworCQlhdXAtPnR4X3JpbmdbaV0gPSAodm9sYXRpbGUgcmluZ19kZXN0X3QgKikgCisJCQkodHhfYmFzZSArIHNpemVvZihyaW5nX2Rlc3RfdCkqaSk7CisJfQorfQorCitzdGF0aWMgaW50IGF1MWtfaXJkYV9pbml0KHZvaWQpCit7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZCA9IDA7CisJc3RydWN0IGF1MWtfcHJpdmF0ZSAqYXVwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGVycjsKKworCWlmICh2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKSBwcmludGsodmVyc2lvbik7CisKKwlkZXYgPSBhbGxvY19pcmRhZGV2KHNpemVvZihzdHJ1Y3QgYXUxa19wcml2YXRlKSk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2LT5pcnEgPSBBVTEwMDBfSVJEQV9SWF9JTlQ7IC8qIFRYIGhhcyBpdHMgb3duIGludGVycnVwdCAqLworCWVyciA9IGF1MWtfaXJkYV9uZXRfaW5pdChkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlpcl9kZXZzWzBdID0gZGV2OworCXByaW50ayhLRVJOX0lORk8gIklyREE6IFJlZ2lzdGVyZWQgZGV2aWNlICVzXG4iLCBkZXYtPm5hbWUpOworCXJldHVybiAwOworCitvdXQxOgorCWF1cCA9IG5ldGRldl9wcml2KGRldik7CisJZG1hX2ZyZWUoKHZvaWQgKilhdXAtPmRiWzBdLnZhZGRyLAorCQlNQVhfQlVGX1NJWkUgKiAyKk5VTV9JUl9ERVNDKTsKKwlkbWFfZnJlZSgodm9pZCAqKWF1cC0+cnhfcmluZ1swXSwKKwkJMiAqIE1BWF9OVU1fSVJfREVTQyooc2l6ZW9mKHJpbmdfZGVzdF90KSkpOworCWtmcmVlKGF1cC0+cnhfYnVmZi5oZWFkKTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYXUxa19pcmRhX2luaXRfaW9idWYoaW9idWZmX3QgKmlvLCBpbnQgc2l6ZSkKK3sKKwlpby0+aGVhZCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGlvLT5oZWFkICE9IE5VTEwpIHsKKwkJaW8tPnRydWVzaXplID0gc2l6ZTsKKwkJaW8tPmluX2ZyYW1lID0gRkFMU0U7CisJCWlvLT5zdGF0ZSAgICA9IE9VVFNJREVfRlJBTUU7CisJCWlvLT5kYXRhICAgICA9IGlvLT5oZWFkOworCX0KKwlyZXR1cm4gaW8tPmhlYWQgPyAwIDogLUVOT01FTTsKK30KKworc3RhdGljIGludCBhdTFrX2lyZGFfbmV0X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXUxa19wcml2YXRlICphdXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpLCByZXR2YWwgPSAwLCBlcnI7CisJZGJfZGVzdF90ICpwREIsICpwREJmcmVlOworCWRtYV9hZGRyX3QgdGVtcDsKKworCWVyciA9IGF1MWtfaXJkYV9pbml0X2lvYnVmKCZhdXAtPnJ4X2J1ZmYsIDE0Mzg0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisKKwlkZXYtPm9wZW4gPSBhdTFrX2lyZGFfc3RhcnQ7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBhdTFrX2lyZGFfaGFyZF94bWl0OworCWRldi0+c3RvcCA9IGF1MWtfaXJkYV9zdG9wOworCWRldi0+Z2V0X3N0YXRzID0gYXUxa19pcmRhX3N0YXRzOworCWRldi0+ZG9faW9jdGwgPSBhdTFrX2lyZGFfaW9jdGw7CisJZGV2LT50eF90aW1lb3V0ID0gYXUxa190eF90aW1lb3V0OworCisJaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcygmYXVwLT5xb3MpOworCisJLyogVGhlIG9ubHkgdmFsdWUgd2UgbXVzdCBvdmVycmlkZSBpdCB0aGUgYmF1ZHJhdGUgKi8KKwlhdXAtPnFvcy5iYXVkX3JhdGUuYml0cyA9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8CisJCUlSXzExNTIwMHxJUl81NzYwMDAgfChJUl80MDAwMDAwIDw8IDgpOworCQorCWF1cC0+cW9zLm1pbl90dXJuX3RpbWUuYml0cyA9IHFvc19tdHRfYml0czsKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKCZhdXAtPnFvcyk7CisKKwlyZXR2YWwgPSAtRU5PTUVNOworCisJLyogVHggcmluZyBmb2xsb3dzIHJ4IHJpbmcgKyA1MTIgYnl0ZXMgKi8KKwkvKiB3ZSBuZWVkIGEgMWsgYWxpZ25lZCBidWZmZXIgKi8KKwlhdXAtPnJ4X3JpbmdbMF0gPSAocmluZ19kZXN0X3QgKikKKwkJZG1hX2FsbG9jKDIqTUFYX05VTV9JUl9ERVNDKihzaXplb2YocmluZ19kZXN0X3QpKSwgJnRlbXApOworCWlmICghYXVwLT5yeF9yaW5nWzBdKQorCQlnb3RvIG91dDI7CisKKwkvKiBhbGxvY2F0ZSB0aGUgZGF0YSBidWZmZXJzICovCisJYXVwLT5kYlswXS52YWRkciA9IAorCQkodm9pZCAqKWRtYV9hbGxvYyhNQVhfQlVGX1NJWkUgKiAyKk5VTV9JUl9ERVNDLCAmdGVtcCk7CisJaWYgKCFhdXAtPmRiWzBdLnZhZGRyKQorCQlnb3RvIG91dDM7CisKKwlzZXR1cF9od19yaW5ncyhhdXAsICh1MzIpYXVwLT5yeF9yaW5nWzBdLCAodTMyKWF1cC0+cnhfcmluZ1swXSArIDUxMik7CisKKwlwREJmcmVlID0gTlVMTDsKKwlwREIgPSBhdXAtPmRiOworCWZvciAoaT0wOyBpPCgyKk5VTV9JUl9ERVNDKTsgaSsrKSB7CisJCXBEQi0+cG5leHQgPSBwREJmcmVlOworCQlwREJmcmVlID0gcERCOworCQlwREItPnZhZGRyID0gCisJCQkodTMyICopKCh1bnNpZ25lZClhdXAtPmRiWzBdLnZhZGRyICsgTUFYX0JVRl9TSVpFKmkpOworCQlwREItPmRtYV9hZGRyID0gKGRtYV9hZGRyX3QpdmlydF90b19idXMocERCLT52YWRkcik7CisJCXBEQisrOworCX0KKwlhdXAtPnBEQmZyZWUgPSBwREJmcmVlOworCisJLyogYXR0YWNoIGEgZGF0YSBidWZmZXIgdG8gZWFjaCBkZXNjcmlwdG9yICovCisJZm9yIChpPTA7IGk8TlVNX0lSX0RFU0M7IGkrKykgeworCQlwREIgPSBHZXRGcmVlREIoYXVwKTsKKwkJaWYgKCFwREIpIGdvdG8gb3V0OworCQlhdXAtPnJ4X3JpbmdbaV0tPmFkZHJfMCA9ICh1OCkocERCLT5kbWFfYWRkciAmIDB4ZmYpOworCQlhdXAtPnJ4X3JpbmdbaV0tPmFkZHJfMSA9ICh1OCkoKHBEQi0+ZG1hX2FkZHI+PjgpICYgMHhmZik7CisJCWF1cC0+cnhfcmluZ1tpXS0+YWRkcl8yID0gKHU4KSgocERCLT5kbWFfYWRkcj4+MTYpICYgMHhmZik7CisJCWF1cC0+cnhfcmluZ1tpXS0+YWRkcl8zID0gKHU4KSgocERCLT5kbWFfYWRkcj4+MjQpICYgMHhmZik7CisJCWF1cC0+cnhfZGJfaW51c2VbaV0gPSBwREI7CisJfQorCWZvciAoaT0wOyBpPE5VTV9JUl9ERVNDOyBpKyspIHsKKwkJcERCID0gR2V0RnJlZURCKGF1cCk7CisJCWlmICghcERCKSBnb3RvIG91dDsKKwkJYXVwLT50eF9yaW5nW2ldLT5hZGRyXzAgPSAodTgpKHBEQi0+ZG1hX2FkZHIgJiAweGZmKTsKKwkJYXVwLT50eF9yaW5nW2ldLT5hZGRyXzEgPSAodTgpKChwREItPmRtYV9hZGRyPj44KSAmIDB4ZmYpOworCQlhdXAtPnR4X3JpbmdbaV0tPmFkZHJfMiA9ICh1OCkoKHBEQi0+ZG1hX2FkZHI+PjE2KSAmIDB4ZmYpOworCQlhdXAtPnR4X3JpbmdbaV0tPmFkZHJfMyA9ICh1OCkoKHBEQi0+ZG1hX2FkZHI+PjI0KSAmIDB4ZmYpOworCQlhdXAtPnR4X3JpbmdbaV0tPmNvdW50XzAgPSAwOworCQlhdXAtPnR4X3JpbmdbaV0tPmNvdW50XzEgPSAwOworCQlhdXAtPnR4X3JpbmdbaV0tPmZsYWdzID0gMDsKKwkJYXVwLT50eF9kYl9pbnVzZVtpXSA9IHBEQjsKKwl9CisKKyNpZiBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTAwMCkgfHwgZGVmaW5lZChDT05GSUdfTUlQU19EQjExMDApCisJLyogcG93ZXIgb24gKi8KKwliY3NyLT5yZXNldHMgJj0gfkJDU1JfUkVTRVRTX0lSREFfTU9ERV9NQVNLOworCWJjc3ItPnJlc2V0cyB8PSBCQ1NSX1JFU0VUU19JUkRBX01PREVfRlVMTDsKKwlhdV9zeW5jKCk7CisjZW5kaWYKKworCXJldHVybiAwOworCitvdXQzOgorCWRtYV9mcmVlKCh2b2lkICopYXVwLT5yeF9yaW5nWzBdLAorCQkyICogTUFYX05VTV9JUl9ERVNDKihzaXplb2YocmluZ19kZXN0X3QpKSk7CitvdXQyOgorCWtmcmVlKGF1cC0+cnhfYnVmZi5oZWFkKTsKK291dDE6CisJcHJpbnRrKEtFUk5fRVJSICJhdTFrX2luaXRfbW9kdWxlIGZhaWxlZC4gIFJldHVybnMgJWRcbiIsIHJldHZhbCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworCitzdGF0aWMgaW50IGF1MWtfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisJdTMyIGNvbnRyb2w7CisJdTMyIHJpbmdfYWRkcmVzczsKKworCS8qIGJyaW5nIHRoZSBkZXZpY2Ugb3V0IG9mIHJlc2V0ICovCisJY29udHJvbCA9IDB4ZTsgLyogY29oZXJlbnQsIGNsb2NrIGVuYWJsZSwgb25lIGhhbGYgc3lzdGVtIGNsb2NrICovCisJCQkgIAorI2lmbmRlZiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4KKwljb250cm9sIHw9IDE7CisjZW5kaWYKKwlhdXAtPnR4X2hlYWQgPSAwOworCWF1cC0+dHhfdGFpbCA9IDA7CisJYXVwLT5yeF9oZWFkID0gMDsKKworCWZvciAoaT0wOyBpPE5VTV9JUl9ERVNDOyBpKyspIHsKKwkJYXVwLT5yeF9yaW5nW2ldLT5mbGFncyA9IEFVX09XTjsKKwl9CisKKwl3cml0ZWwoY29udHJvbCwgSVJfSU5URVJGQUNFX0NPTkZJRyk7CisJYXVfc3luY19kZWxheSgxMCk7CisKKwl3cml0ZWwocmVhZF9pcl9yZWcoSVJfRU5BQkxFKSAmIH4weDgwMDAsIElSX0VOQUJMRSk7IC8qIGRpc2FibGUgUEhZICovCisJYXVfc3luY19kZWxheSgxKTsKKworCXdyaXRlbChNQVhfQlVGX1NJWkUsIElSX01BWF9QS1RfTEVOKTsKKworCXJpbmdfYWRkcmVzcyA9ICh1MzIpdmlydF90b19waHlzKCh2b2lkICopYXVwLT5yeF9yaW5nWzBdKTsKKwl3cml0ZWwocmluZ19hZGRyZXNzID4+IDI2LCBJUl9SSU5HX0JBU0VfQUREUl9IKTsKKwl3cml0ZWwoKHJpbmdfYWRkcmVzcyA+PiAxMCkgJiAweGZmZmYsIElSX1JJTkdfQkFTRV9BRERSX0wpOworCisJd3JpdGVsKFJJTkdfU0laRV82NDw8OCB8IFJJTkdfU0laRV82NDw8MTIsIElSX1JJTkdfU0laRSk7CisKKwl3cml0ZWwoMTw8MiB8IElSX09ORV9QSU4sIElSX0NPTkZJR18yKTsgLyogNDhNSHogKi8KKwl3cml0ZWwoMCwgSVJfUklOR19BRERSX0NNUFIpOworCisJYXUxa19pcmRhX3NldF9zcGVlZChkZXYsIDk2MDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1MWtfaXJkYV9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXR2YWw7CisJY2hhciBod25hbWVbMzJdOworCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoKHJldHZhbCA9IGF1MWtfaW5pdChkZXYpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciBpbiBhdTFrX2luaXRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShBVTEwMDBfSVJEQV9UWF9JTlQsICZhdTFrX2lyZGFfaW50ZXJydXB0LCAKKwkJCQkJMCwgZGV2LT5uYW1lLCBkZXYpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZ2V0IElSUSAlZFxuIiwgCisJCQkJZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCXJldHVybiByZXR2YWw7CisJfQorCWlmICgocmV0dmFsID0gcmVxdWVzdF9pcnEoQVUxMDAwX0lSREFfUlhfSU5ULCAmYXUxa19pcmRhX2ludGVycnVwdCwgCisJCQkJCTAsIGRldi0+bmFtZSwgZGV2KSkpIHsKKwkJZnJlZV9pcnEoQVUxMDAwX0lSREFfVFhfSU5ULCBkZXYpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZ2V0IElSUSAlZFxuIiwgCisJCQkJZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJLyogR2l2ZSBzZWxmIGEgaGFyZHdhcmUgbmFtZSAqLworCXNwcmludGYoaHduYW1lLCAiQXUxMDAwIFNJUi9GSVIiKTsKKwlhdXAtPmlybGFwID0gaXJsYXBfb3BlbihkZXYsICZhdXAtPnFvcywgaHduYW1lKTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJd3JpdGVsKHJlYWRfaXJfcmVnKElSX0NPTkZJR18yKSB8IDE8PDgsIElSX0NPTkZJR18yKTsgLyogaW50IGVuYWJsZSAqLworCisJYXVwLT50aW1lci5leHBpcmVzID0gUlVOX0FUKCgzKkhaKSk7IAorCWF1cC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdTFrX2lyZGFfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwl3cml0ZWwocmVhZF9pcl9yZWcoSVJfQ09ORklHXzIpICYgfigxPDw4KSwgSVJfQ09ORklHXzIpOworCXdyaXRlbCgwLCBJUl9DT05GSUdfMSk7IAorCXdyaXRlbCgwLCBJUl9JTlRFUkZBQ0VfQ09ORklHKTsgLyogZGlzYWJsZSBjbG9jayAqLworCWF1X3N5bmMoKTsKKworCWlmIChhdXAtPmlybGFwKSB7CisJCWlybGFwX2Nsb3NlKGF1cC0+aXJsYXApOworCQlhdXAtPmlybGFwID0gTlVMTDsKKwl9CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJZGVsX3RpbWVyKCZhdXAtPnRpbWVyKTsKKworCS8qIGRpc2FibGUgdGhlIGludGVycnVwdCAqLworCWZyZWVfaXJxKEFVMTAwMF9JUkRBX1RYX0lOVCwgZGV2KTsKKwlmcmVlX2lycShBVTEwMDBfSVJEQV9SWF9JTlQsIGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhdTFrX2lyZGFfZXhpdCh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpcl9kZXZzWzBdOworCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJZG1hX2ZyZWUoKHZvaWQgKilhdXAtPmRiWzBdLnZhZGRyLAorCQlNQVhfQlVGX1NJWkUgKiAyKk5VTV9JUl9ERVNDKTsKKwlkbWFfZnJlZSgodm9pZCAqKWF1cC0+cnhfcmluZ1swXSwKKwkJMiAqIE1BWF9OVU1fSVJfREVTQyooc2l6ZW9mKHJpbmdfZGVzdF90KSkpOworCWtmcmVlKGF1cC0+cnhfYnVmZi5oZWFkKTsKKwlmcmVlX25ldGRldihkZXYpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAKK3VwZGF0ZV90eF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RhdHVzLCB1MzIgcGt0X2xlbikKK3sKKwlzdHJ1Y3QgYXUxa19wcml2YXRlICphdXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwcyA9ICZhdXAtPnN0YXRzOworCisJcHMtPnR4X3BhY2tldHMrKzsKKwlwcy0+dHhfYnl0ZXMgKz0gcGt0X2xlbjsKKworCWlmIChzdGF0dXMgJiBJUl9UWF9FUlJPUikgeworCQlwcy0+dHhfZXJyb3JzKys7CisJCXBzLT50eF9hYm9ydGVkX2Vycm9ycysrOworCX0KK30KKworCitzdGF0aWMgdm9pZCBhdTFrX3R4X2FjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgcmluZ19kZXN0X3QgKnB0eGQ7CisKKwlwdHhkID0gYXVwLT50eF9yaW5nW2F1cC0+dHhfdGFpbF07CisJd2hpbGUgKCEocHR4ZC0+ZmxhZ3MgJiBBVV9PV04pICYmIChhdXAtPnR4X3RhaWwgIT0gYXVwLT50eF9oZWFkKSkgeworCQl1cGRhdGVfdHhfc3RhdHMoZGV2LCBwdHhkLT5mbGFncywgCisJCQkJcHR4ZC0+Y291bnRfMTw8OCB8IHB0eGQtPmNvdW50XzApOworCQlwdHhkLT5jb3VudF8wID0gMDsKKwkJcHR4ZC0+Y291bnRfMSA9IDA7CisJCWF1X3N5bmMoKTsKKworCQlhdXAtPnR4X3RhaWwgPSAoYXVwLT50eF90YWlsICsgMSkgJiAoTlVNX0lSX0RFU0MgLSAxKTsKKwkJcHR4ZCA9IGF1cC0+dHhfcmluZ1thdXAtPnR4X3RhaWxdOworCisJCWlmIChhdXAtPnR4X2Z1bGwpIHsKKwkJCWF1cC0+dHhfZnVsbCA9IDA7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0KKwl9CisKKwlpZiAoYXVwLT50eF90YWlsID09IGF1cC0+dHhfaGVhZCkgeworCQlpZiAoYXVwLT5uZXdzcGVlZCkgeworCQkJYXUxa19pcmRhX3NldF9zcGVlZChkZXYsIGF1cC0+bmV3c3BlZWQpOworCQkJYXVwLT5uZXdzcGVlZCA9IDA7CisJCX0KKwkJZWxzZSB7CisJCQl3cml0ZWwocmVhZF9pcl9yZWcoSVJfQ09ORklHXzEpICYgfklSX1RYX0VOQUJMRSwgCisJCQkJCUlSX0NPTkZJR18xKTsgCisJCQlhdV9zeW5jKCk7CisJCQl3cml0ZWwocmVhZF9pcl9yZWcoSVJfQ09ORklHXzEpIHwgSVJfUlhfRU5BQkxFLCAKKwkJCQkJSVJfQ09ORklHXzEpOyAKKwkJCXdyaXRlbCgwLCBJUl9SSU5HX1BST01QVCk7CisJCQlhdV9zeW5jKCk7CisJCX0KKwl9Cit9CisKKworLyoKKyAqIEF1MTAwMCB0cmFuc21pdCByb3V0aW5lLgorICovCitzdGF0aWMgaW50IGF1MWtfaXJkYV9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXUxa19wcml2YXRlICphdXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBzcGVlZCA9IGlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKKwl2b2xhdGlsZSByaW5nX2Rlc3RfdCAqcHR4ZDsKKwl1MzIgbGVuOworCisJdTMyIGZsYWdzOworCWRiX2Rlc3RfdCAqcERCOworCisJaWYgKHNwZWVkICE9IGF1cC0+c3BlZWQgJiYgc3BlZWQgIT0gLTEpIHsKKwkJYXVwLT5uZXdzcGVlZCA9IHNwZWVkOworCX0KKworCWlmICgoc2tiLT5sZW4gPT0gMCkgJiYgKGF1cC0+bmV3c3BlZWQpKSB7CisJCWlmIChhdXAtPnR4X3RhaWwgPT0gYXVwLT50eF9oZWFkKSB7CisJCQlhdTFrX2lyZGFfc2V0X3NwZWVkKGRldiwgc3BlZWQpOworCQkJYXVwLT5uZXdzcGVlZCA9IDA7CisJCX0KKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwdHhkID0gYXVwLT50eF9yaW5nW2F1cC0+dHhfaGVhZF07CisJZmxhZ3MgPSBwdHhkLT5mbGFnczsKKworCWlmIChmbGFncyAmIEFVX09XTikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR4X2Z1bGxcbiIsIGRldi0+bmFtZSk7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJYXVwLT50eF9mdWxsID0gMTsKKwkJcmV0dXJuIDE7CisJfQorCWVsc2UgaWYgKCgoYXVwLT50eF9oZWFkICsgMSkgJiAoTlVNX0lSX0RFU0MgLSAxKSkgPT0gYXVwLT50eF90YWlsKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHhfZnVsbFxuIiwgZGV2LT5uYW1lKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlhdXAtPnR4X2Z1bGwgPSAxOworCQlyZXR1cm4gMTsKKwl9CisKKwlwREIgPSBhdXAtPnR4X2RiX2ludXNlW2F1cC0+dHhfaGVhZF07CisKKyNpZiAwCisJaWYgKHJlYWRfaXJfcmVnKElSX1JYX0JZVEVfQ05UKSAhPSAwKSB7CisJCXByaW50aygidHggd2FybmluZzogcnggYnl0ZSBjbnQgJXhcbiIsIAorCQkJCXJlYWRfaXJfcmVnKElSX1JYX0JZVEVfQ05UKSk7CisJfQorI2VuZGlmCisJCisJaWYgKGF1cC0+c3BlZWQgPT0gNDAwMDAwMCkgeworCQkvKiBGSVIgKi8KKwkJbWVtY3B5KCh2b2lkICopcERCLT52YWRkciwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCXB0eGQtPmNvdW50XzAgPSBza2ItPmxlbiAmIDB4ZmY7CisJCXB0eGQtPmNvdW50XzEgPSAoc2tiLT5sZW4gPj4gOCkgJiAweGZmOworCisJfQorCWVsc2UgeworCQkvKiBTSVIgKi8KKwkJbGVuID0gYXN5bmNfd3JhcF9za2Ioc2tiLCAodTggKilwREItPnZhZGRyLCBNQVhfQlVGX1NJWkUpOworCQlwdHhkLT5jb3VudF8wID0gbGVuICYgMHhmZjsKKwkJcHR4ZC0+Y291bnRfMSA9IChsZW4gPj4gOCkgJiAweGZmOworCQlwdHhkLT5mbGFncyB8PSBJUl9ESVNfQ1JDOworCQlhdV93cml0ZWwoYXVfcmVhZGwoMHhhZTAwMDAwYykgJiB+KDE8PDEzKSwgMHhhZTAwMDAwYyk7CisJfQorCXB0eGQtPmZsYWdzIHw9IEFVX09XTjsKKwlhdV9zeW5jKCk7CisKKwl3cml0ZWwocmVhZF9pcl9yZWcoSVJfQ09ORklHXzEpIHwgSVJfVFhfRU5BQkxFLCBJUl9DT05GSUdfMSk7IAorCXdyaXRlbCgwLCBJUl9SSU5HX1BST01QVCk7CisJYXVfc3luYygpOworCisJZGV2X2tmcmVlX3NrYihza2IpOworCWF1cC0+dHhfaGVhZCA9IChhdXAtPnR4X2hlYWQgKyAxKSAmIChOVU1fSVJfREVTQyAtIDEpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAKK3VwZGF0ZV9yeF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RhdHVzLCB1MzIgY291bnQpCit7CisJc3RydWN0IGF1MWtfcHJpdmF0ZSAqYXVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcHMgPSAmYXVwLT5zdGF0czsKKworCXBzLT5yeF9wYWNrZXRzKys7CisKKwlpZiAoc3RhdHVzICYgSVJfUlhfRVJST1IpIHsKKwkJcHMtPnJ4X2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgKElSX1BIWV9FUlJPUnxJUl9GSUZPX09WRVIpKQorCQkJcHMtPnJ4X21pc3NlZF9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIElSX01BWF9MRU4pCisJCQlwcy0+cnhfbGVuZ3RoX2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgSVJfQ1JDX0VSUk9SKQorCQkJcHMtPnJ4X2NyY19lcnJvcnMrKzsKKwl9CisJZWxzZSAKKwkJcHMtPnJ4X2J5dGVzICs9IGNvdW50OworfQorCisvKgorICogQXUxMDAwIHJlY2VpdmUgcm91dGluZS4KKyAqLworc3RhdGljIGludCBhdTFrX2lyZGFfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXUxa19wcml2YXRlICphdXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBza19idWZmICpza2I7CisJdm9sYXRpbGUgcmluZ19kZXN0X3QgKnByeGQ7CisJdTMyIGZsYWdzLCBjb3VudDsKKwlkYl9kZXN0X3QgKnBEQjsKKworCXByeGQgPSBhdXAtPnJ4X3JpbmdbYXVwLT5yeF9oZWFkXTsKKwlmbGFncyA9IHByeGQtPmZsYWdzOworCisJd2hpbGUgKCEoZmxhZ3MgJiBBVV9PV04pKSAgeworCQlwREIgPSBhdXAtPnJ4X2RiX2ludXNlW2F1cC0+cnhfaGVhZF07CisJCWNvdW50ID0gcHJ4ZC0+Y291bnRfMTw8OCB8IHByeGQtPmNvdW50XzA7CisJCWlmICghKGZsYWdzICYgSVJfUlhfRVJST1IpKSAgeworCQkJLyogZ29vZCBmcmFtZSAqLworCQkJdXBkYXRlX3J4X3N0YXRzKGRldiwgZmxhZ3MsIGNvdW50KTsKKwkJCXNrYj1hbGxvY19za2IoY291bnQrMSxHRlBfQVRPTUlDKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCWF1cC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc2tiX3Jlc2VydmUoc2tiLCAxKTsKKwkJCWlmIChhdXAtPnNwZWVkID09IDQwMDAwMDApCisJCQkJc2tiX3B1dChza2IsIGNvdW50KTsKKwkJCWVsc2UKKwkJCQlza2JfcHV0KHNrYiwgY291bnQtMik7CisJCQltZW1jcHkoc2tiLT5kYXRhLCAodm9pZCAqKXBEQi0+dmFkZHIsIGNvdW50LTIpOworCQkJc2tiLT5kZXYgPSBkZXY7CisJCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CisJCQluZXRpZl9yeChza2IpOworCQkJcHJ4ZC0+Y291bnRfMCA9IDA7CisJCQlwcnhkLT5jb3VudF8xID0gMDsKKwkJfQorCQlwcnhkLT5mbGFncyB8PSBBVV9PV047CisJCWF1cC0+cnhfaGVhZCA9IChhdXAtPnJ4X2hlYWQgKyAxKSAmIChOVU1fSVJfREVTQyAtIDEpOworCQl3cml0ZWwoMCwgSVJfUklOR19QUk9NUFQpOworCQlhdV9zeW5jKCk7CisKKwkJLyogbmV4dCBkZXNjcmlwdG9yICovCisJCXByeGQgPSBhdXAtPnJ4X3JpbmdbYXVwLT5yeF9oZWFkXTsKKwkJZmxhZ3MgPSBwcnhkLT5mbGFnczsKKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworCX0KKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGF1MWtfaXJkYV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpc3I6IG51bGwgZGV2IHB0clxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXdyaXRlbCgwLCBJUl9JTlRfQ0xFQVIpOyAvKiBhY2sgaXJkYSBpbnRlcnJ1cHRzICovCisKKwlhdTFrX2lyZGFfcngoZGV2KTsKKwlhdTFrX3R4X2FjayhkZXYpOworfQorCisKKy8qCisgKiBUaGUgVHggcmluZyBoYXMgYmVlbiBmdWxsIGxvbmdlciB0aGFuIHRoZSB3YXRjaGRvZyB0aW1lb3V0CisgKiB2YWx1ZS4gVGhlIHRyYW5zbWl0dGVyIG11c3QgYmUgaHVuZz8KKyAqLworc3RhdGljIHZvaWQgYXUxa190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTMyIHNwZWVkOworCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlwcmludGsoS0VSTl9FUlIgIiVzOiB0eCB0aW1lb3V0XG4iLCBkZXYtPm5hbWUpOworCXNwZWVkID0gYXVwLT5zcGVlZDsKKwlhdXAtPnNwZWVkID0gMDsKKwlhdTFrX2lyZGFfc2V0X3NwZWVkKGRldiwgc3BlZWQpOworCWF1cC0+dHhfZnVsbCA9IDA7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisKKy8qCisgKiBTZXQgdGhlIElyREEgY29tbXVuaWNhdGlvbnMgc3BlZWQuCisgKi8KK3N0YXRpYyBpbnQgCithdTFrX2lyZGFfc2V0X3NwZWVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzcGVlZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIGNvbnRyb2w7CisJaW50IHJldCA9IDAsIHRpbWVvdXQgPSAxMCwgaTsKKwl2b2xhdGlsZSByaW5nX2Rlc3RfdCAqcHR4ZDsKKyNpZiBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTAwMCkgfHwgZGVmaW5lZChDT05GSUdfTUlQU19EQjExMDApCisJdW5zaWduZWQgbG9uZyBpcmRhX3Jlc2V0czsKKyNlbmRpZgorCisJaWYgKHNwZWVkID09IGF1cC0+c3BlZWQpCisJCXJldHVybiByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJfbG9jaywgZmxhZ3MpOworCisJLyogZGlzYWJsZSBQSFkgZmlyc3QgKi8KKwl3cml0ZWwocmVhZF9pcl9yZWcoSVJfRU5BQkxFKSAmIH4weDgwMDAsIElSX0VOQUJMRSk7CisKKwkvKiBkaXNhYmxlIFJYL1RYICovCisJd3JpdGVsKHJlYWRfaXJfcmVnKElSX0NPTkZJR18xKSAmIH4oSVJfUlhfRU5BQkxFfElSX1RYX0VOQUJMRSksIAorCQkJSVJfQ09ORklHXzEpOworCWF1X3N5bmNfZGVsYXkoMSk7CisJd2hpbGUgKHJlYWRfaXJfcmVnKElSX0VOQUJMRSkgJiAoSVJfUlhfU1RBVFVTIHwgSVJfVFhfU1RBVFVTKSkgeworCQltZGVsYXkoMSk7CisJCWlmICghdGltZW91dC0tKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiByeC90eCBkaXNhYmxlIHRpbWVvdXRcbiIsCisJCQkJCWRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIGRpc2FibGUgRE1BICovCisJd3JpdGVsKHJlYWRfaXJfcmVnKElSX0NPTkZJR18xKSAmIH5JUl9ETUFfRU5BQkxFLCBJUl9DT05GSUdfMSk7CisJYXVfc3luY19kZWxheSgxKTsKKworCS8qIAorCSAqICBBZnRlciB3ZSBkaXNhYmxlIHR4L3J4LiB0aGUgaW5kZXggcG9pbnRlcnMKKyAJICogZ28gYmFjayB0byB6ZXJvLgorCSAqLworCWF1cC0+dHhfaGVhZCA9IGF1cC0+dHhfdGFpbCA9IGF1cC0+cnhfaGVhZCA9IDA7CisJZm9yIChpPTA7IGk8TlVNX0lSX0RFU0M7IGkrKykgeworCQlwdHhkID0gYXVwLT50eF9yaW5nW2ldOworCQlwdHhkLT5mbGFncyA9IDA7CisJCXB0eGQtPmNvdW50XzAgPSAwOworCQlwdHhkLT5jb3VudF8xID0gMDsKKwl9CisKKwlmb3IgKGk9MDsgaTxOVU1fSVJfREVTQzsgaSsrKSB7CisJCXB0eGQgPSBhdXAtPnJ4X3JpbmdbaV07CisJCXB0eGQtPmNvdW50XzAgPSAwOworCQlwdHhkLT5jb3VudF8xID0gMDsKKwkJcHR4ZC0+ZmxhZ3MgPSBBVV9PV047CisJfQorCisJaWYgKHNwZWVkID09IDQwMDAwMDApIHsKKyNpZiBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTAwMCkgfHwgZGVmaW5lZChDT05GSUdfTUlQU19EQjExMDApCisJCWJjc3ItPnJlc2V0cyB8PSBCQ1NSX1JFU0VUU19GSVJfU0VMOworI2Vsc2UgLyogUGIxMDAwIGFuZCBQYjExMDAgKi8KKwkJd3JpdGVsKDE8PDEzLCBDUExEX0FVWDEpOworI2VuZGlmCisJfQorCWVsc2UgeworI2lmIGRlZmluZWQoQ09ORklHX01JUFNfREIxMDAwKSB8fCBkZWZpbmVkKENPTkZJR19NSVBTX0RCMTEwMCkKKwkJYmNzci0+cmVzZXRzICY9IH5CQ1NSX1JFU0VUU19GSVJfU0VMOworI2Vsc2UgLyogUGIxMDAwIGFuZCBQYjExMDAgKi8KKwkJd3JpdGVsKHJlYWRsKENQTERfQVVYMSkgJiB+KDE8PDEzKSwgQ1BMRF9BVVgxKTsKKyNlbmRpZgorCX0KKworCXN3aXRjaCAoc3BlZWQpIHsKKwljYXNlIDk2MDA6CQorCQl3cml0ZWwoMTE8PDEwIHwgMTI8PDUsIElSX1dSSVRFX1BIWV9DT05GSUcpOyAKKwkJd3JpdGVsKElSX1NJUl9NT0RFLCBJUl9DT05GSUdfMSk7IAorCQlicmVhazsKKwljYXNlIDE5MjAwOgkKKwkJd3JpdGVsKDU8PDEwIHwgMTI8PDUsIElSX1dSSVRFX1BIWV9DT05GSUcpOyAKKwkJd3JpdGVsKElSX1NJUl9NT0RFLCBJUl9DT05GSUdfMSk7IAorCQlicmVhazsKKwljYXNlIDM4NDAwOgorCQl3cml0ZWwoMjw8MTAgfCAxMjw8NSwgSVJfV1JJVEVfUEhZX0NPTkZJRyk7IAorCQl3cml0ZWwoSVJfU0lSX01PREUsIElSX0NPTkZJR18xKTsgCisJCWJyZWFrOworCWNhc2UgNTc2MDA6CQorCQl3cml0ZWwoMTw8MTAgfCAxMjw8NSwgSVJfV1JJVEVfUEhZX0NPTkZJRyk7IAorCQl3cml0ZWwoSVJfU0lSX01PREUsIElSX0NPTkZJR18xKTsgCisJCWJyZWFrOworCWNhc2UgMTE1MjAwOiAKKwkJd3JpdGVsKDEyPDw1LCBJUl9XUklURV9QSFlfQ09ORklHKTsgCisJCXdyaXRlbChJUl9TSVJfTU9ERSwgSVJfQ09ORklHXzEpOyAKKwkJYnJlYWs7CisJY2FzZSA0MDAwMDAwOgorCQl3cml0ZWwoMHhGLCBJUl9XUklURV9QSFlfQ09ORklHKTsKKwkJd3JpdGVsKElSX0ZJUnxJUl9ETUFfRU5BQkxFfElSX1JYX0VOQUJMRSwgSVJfQ09ORklHXzEpOyAKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyB1bnN1cHBvcnRlZCBzcGVlZCAleFxuIiwgZGV2LT5uYW1lLCBzcGVlZCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCWF1cC0+c3BlZWQgPSBzcGVlZDsKKwl3cml0ZWwocmVhZF9pcl9yZWcoSVJfRU5BQkxFKSB8IDB4ODAwMCwgSVJfRU5BQkxFKTsKKwlhdV9zeW5jKCk7CisKKwljb250cm9sID0gcmVhZF9pcl9yZWcoSVJfRU5BQkxFKTsKKwl3cml0ZWwoMCwgSVJfUklOR19QUk9NUFQpOworCWF1X3N5bmMoKTsKKworCWlmIChjb250cm9sICYgKDE8PDE0KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb25maWd1cmF0aW9uIGVycm9yXG4iLCBkZXYtPm5hbWUpOworCX0KKwllbHNlIHsKKwkJaWYgKGNvbnRyb2wgJiAoMTw8MTEpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIFZhbGlkIFNJUiBjb25maWdcbiIsIGRldi0+bmFtZSk7CisJCWlmIChjb250cm9sICYgKDE8PDEyKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlcyBWYWxpZCBNSVIgY29uZmlnXG4iLCBkZXYtPm5hbWUpOworCQlpZiAoY29udHJvbCAmICgxPDwxMykpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgVmFsaWQgRklSIGNvbmZpZ1xuIiwgZGV2LT5uYW1lKTsKKwkJaWYgKGNvbnRyb2wgJiAoMTw8MTApKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIFRYIGVuYWJsZWRcbiIsIGRldi0+bmFtZSk7CisJCWlmIChjb250cm9sICYgKDE8PDkpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIFJYIGVuYWJsZWRcbiIsIGRldi0+bmFtZSk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgCithdTFrX2lyZGFfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnJlcSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgaWZfaXJkYV9yZXEgKnJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKWlmcmVxOworCXN0cnVjdCBhdTFrX3ByaXZhdGUgKmF1cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJldCA9IC1FT1BOT1RTVVBQOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NTQkFORFdJRFRIOgorCQlpZiAoY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJLyoKKwkJCSAqIFdlIGFyZSB1bmFibGUgdG8gc2V0IHRoZSBzcGVlZCBpZiB0aGUKKwkJCSAqIGRldmljZSBpcyBub3QgcnVubmluZy4KKwkJCSAqLworCQkJaWYgKGF1cC0+b3BlbikKKwkJCQlyZXQgPSBhdTFrX2lyZGFfc2V0X3NwZWVkKGRldiwKKwkJCQkJCXJxLT5pZnJfYmF1ZHJhdGUpOworCQkJZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlcyBpb2N0bDogIW5ldGlmX3J1bm5pbmdcbiIsCisJCQkJCQlkZXYtPm5hbWUpOworCQkJCXJldCA9IDA7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTTUVESUFCVVNZOgorCQlyZXQgPSAtRVBFUk07CisJCWlmIChjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShkZXYsIFRSVUUpOworCQkJcmV0ID0gMDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0lPQ0dSRUNFSVZJTkc6CisJCXJxLT5pZnJfcmVjZWl2aW5nID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphdTFrX2lyZGFfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXUxa19wcml2YXRlICphdXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiAmYXVwLT5zdGF0czsKK30KKworTU9EVUxFX0FVVEhPUigiUGV0ZSBQb3BvdiA8cHBvcG92QG12aXN0YS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkF1MTAwMCBJckRBIERldmljZSBEcml2ZXIiKTsKKworbW9kdWxlX2luaXQoYXUxa19pcmRhX2luaXQpOworbW9kdWxlX2V4aXQoYXUxa19pcmRhX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5jIGIvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMDhjNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmMKQEAgLTAsMCArMSwxNzg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGaWxlbmFtZToJCWRvbmF1Ym9lLmMKKyAqIFZlcnNpb246IAkJMi4xNworICogRGVzY3JpcHRpb246ICAgRHJpdmVyIGZvciB0aGUgVG9zaGliYSBPQk9FIChvciB0eXBlLU8gb3IgNzAxKQorICogICAgICAgICAgICAgICAgRklSIENoaXBzZXQsIGFsc28gc3VwcG9ydHMgdGhlIERPTkFVT0JPRSAodHlwZS1ETworICogICAgICAgICAgICAgICAgb3IgZDAxKSBGSVIgY2hpcHNldCB3aGljaCBhcyBmYXIgYXMgSSBrbm93IGlzCisgKiAgICAgICAgICAgICAgICByZWdpc3RlciBjb21wYXRpYmxlLgorICogRG9jdW1lbnRhdGlvbjogaHR0cDovL2xpYnhnLmZyZWUuZnIvaXJkYS9saWItaXJkYS5odG1sCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBKYW1lcyBNY0tlbnppZSA8amFtZXNAZmlzaHNvdXAuZGhzLm9yZz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFNhdCBNYXkgOCAgMTI6MzU6MjcgMTk5OQorICogTW9kaWZpZWQ6ICAgICAgUGF1bCBCcmlzdG93IDxwYXVsLmJyaXN0b3dAdGVjaG5vbG9naXN0LmNvbT4KKyAqIE1vZGlmaWVkOiAgICAgIE1vbiBOb3YgMTEgMTk6MTA6MDUgMTk5OQorICogTW9kaWZpZWQ6ICAgICAgSmFtZXMgTWNLZW56aWUgPGphbWVzQGZpc2hzb3VwLmRocy5vcmc+CisgKiBNb2RpZmllZDogICAgICBUaHUgTWFyIDE2IDEyOjQ5OjAwIDIwMDAgKFN1YnN0YW50aWFsIHJld3JpdGUpCisgKiBNb2RpZmllZDogICAgICBTYXQgQXByIDI5IDAwOjIzOjAzIDIwMDAgKEFkZGVkIERPTkFVT0JPRSBzdXBwb3J0KQorICogTW9kaWZpZWQ6ICAgICAgV2VkIE1heSAyNCAyMzo0NTowMiAyMDAwIChGaXhlZCBjaGlwaW9fdCBzdHJ1Y3R1cmUpCisgKiBNb2RpZmllZDogMi4xMyBDaHJpc3RpYW4gR2VubmVyYXQgPGNocmlzdGlhbi5nZW5uZXJhdEBwb2x5dGVjaG5pcXVlLm9yZz4KKyAqIE1vZGlmaWVkOiAyLjEzIGRpbSBqYW4gMDcgMjE6NTc6MzkgMjAwMSAodGVzdGVkIHdpdGgga2VybmVsIDIuNCAmIGlybmV0L3BwcCkKKyAqIE1vZGlmaWVkOiAyLjE0IENocmlzdGlhbiBHZW5uZXJhdCA8Y2hyaXN0aWFuLmdlbm5lcmF0QHBvbHl0ZWNobmlxdWUub3JnPgorICogTW9kaWZpZWQ6IDIuMTQgbHVuIGZldiAwNSAxNzo1NTo1OSAyMDAxIChhZGFwdGVkIHRvIHBhdGNoLTIuNC4xLXByZTgtaXJkYTEpCisgKiBNb2RpZmllZDogMi4xNSBNYXJ0aW4gTHVjaW5hIDxtYXRvQGtvdGVsbmEuc2s+CisgKiBNb2RpZmllZDogMi4xNSBGcmkgSnVuIDIxIDIwOjQwOjU5IDIwMDIgKHN5bmMgd2l0aCAyLjQuMTgsIHN1YnN0YW50aWFsIGZpeGVzKQorICogTW9kaWZpZWQ6IDIuMTYgTWFydGluIEx1Y2luYSA8bWF0b0Brb3RlbG5hLnNrPgorICogTW9kaWZpZWQ6IDIuMTYgU2F0IEp1biAyMiAxODo1NDoyOSAyMDAyIChmaXggZnJlZXJlZ2lvbiwgZGVmYXVsdCB0byB2ZXJib3NlKQorICogTW9kaWZpZWQ6IDIuMTcgQ2hyaXN0aWFuIEdlbm5lcmF0IDxjaHJpc3RpYW4uZ2VubmVyYXRAcG9seXRlY2huaXF1ZS5vcmc+CisgKiBNb2RpZmllZDogMi4xNyBqZXUgc2VwIDEyIDA4OjUwOjIwIDIwMDIgKHNhdmVfZmxhZ3MoKTtjbGkoKTsgcmVwbGFjZWQgYnkgc3BpbmxvY2tzKQorICogTW9kaWZpZWQ6IDIuMTggQ2hyaXN0aWFuIEdlbm5lcmF0IDxjaHJpc3RpYW4uZ2VubmVyYXRAcG9seXRlY2huaXF1ZS5vcmc+CisgKiBNb2RpZmllZDogMi4xOCB2ZW4gamFuIDEwIDAzOjE0OjE2IDIwMDMgQ2hhbmdlIHByb2JlIGRlZmF1bHQgb3B0aW9ucworICoKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgSmFtZXMgTWNLZW56aWUsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIE5laXRoZXIgSmFtZXMgTWNLZW56aWUgbm9yIENhbWJyaWRnZSBVbml2ZXJzaXR5IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcworICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqCisgKiAgICAgQXBwbGljYWJsZSBNb2RlbHMgOiBMaWJyZXR0byAxMDAvMTEwQ1QgYW5kIG1hbnkgbW9yZS4KKyAqICAgICBUb3NoaWJhIHJlZmVycyB0byB0aGlzIGNoaXAgYXMgdGhlIHR5cGUtTyBJUiBwb3J0LAorICogICAgIG9yIHRoZSB0eXBlLURPIElSIHBvcnQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBMb29rIGF0IHRvc2hvYm9lLmggKGN1cnJlbnRseSBpbiBpbmNsdWRlL25ldC9pcmRhKSBmb3IgZGV0YWlscyBvZiAqLworLyogV2hlcmUgdG8gZ2V0IGRvY3VtZW50YXRpb24gb24gdGhlIGNoaXAgICAgICAgICAqLworCisKK3N0YXRpYyBjaGFyICpyY3NpZCA9CisgICIkSWQ6IGRvbmF1Ym9lLmMgVjIuMTggdmVuIGphbiAxMCAwMzoxNDoxNiAyMDAzJCI7CisKKy8qIFNlZSBiZWxvdyBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbG9naWMgaW4gdGhpcyBkcml2ZXIgKi8KKworLyogVXNlciBzZXJ2aWNhYmxlIHBhcnRzICovCisvKiBVU0VfUFJPQkUgQ3JlYXRlIHRoZSBjb2RlIHdoaWNoIHByb2JlcyB0aGUgY2hpcCBhbmQgZG9lcyBhIGZldyB0ZXN0cyAqLworLyogZG9fcHJvYmUgbW9kdWxlIHBhcmFtZXRlciBFbmFibGUgdGhpcyBjb2RlICovCisvKiBQcm9iZSBjb2RlIGlzIHZlcnkgdXNlZnVsIGZvciB1bmRlcnN0YW5kaW5nIGhvdyB0aGUgaGFyZHdhcmUgd29ya3MgKi8KKy8qIFVzZSBpdCB3aXRoIHZhcmlvdXMgY29tYmluYXRpb25zIG9mIFRUX0xFTiwgUlhfTEVOICovCisvKiBTdHJvbmdseSByZWNvbWVuZGVkLCBkaXNhYmxlIGlmIHRoZSBwcm9iZSBmYWlscyBvbiB5b3VyIG1hY2hpbmUgKi8KKy8qIGFuZCBzZW5kIG1lIDxqYW1lc0BmaXNoc291cC5kaHMub3JnPiB0aGUgb3V0cHV0IG9mIGRtZXNnICovCisjZGVmaW5lIFVTRV9QUk9CRSAxCisjdW5kZWYgIFVTRV9QUk9CRQorCisvKiBUcmFjZSBUcmFuc21pdCByaW5nLCBpbnRlcnJ1cHRzLCBSZWNlaXZlIHJpbmcgb3Igbm90ID8gKi8KKyNkZWZpbmUgUFJPQkVfVkVSQk9TRSAxCisKKy8qIERlYnVnIG9wdGlvbiwgZXhhbWluZSBzZW50IGFuZCByZWNlaXZlZCByYXcgZGF0YSAqLworLyogSXJkYWR1bXAgaXMgYmV0dGVyLCBidXQgZG9lcyBub3Qgc2VlIGFsbCBwYWNrZXRzLiBlbmFibGUgaXQgaWYgeW91IHdhbnQuICovCisjdW5kZWYgRFVNUF9QQUNLRVRTCisKKy8qIE1JUiBtb2RlIGhhcyBub3QgYmVlbiB0ZXN0ZWQuIFNvbWUgYmVoYXZpb3VyIGlzIGRpZmZlcmVudCAqLworLyogU2VlbXMgdG8gd29yayBhZ2FpbnN0IGFuIEVyaWNzc29uIFI1MjAgZm9yIG1lLiAtTWFydGluICovCisjZGVmaW5lIFVTRV9NSVIKKworLyogU2NoZWR1bGUgYmFjayB0byBiYWNrIGhhcmR3YXJlIHRyYW5zbWl0cyB3aGVyZXZlciBwb3NzaWJsZSwgb3RoZXJ3aXNlICovCisvKiB3ZSBuZWVkIGFuIGludGVycnVwdCBmb3IgZXZlcnkgZnJhbWUsIHVuc2V0IGlmIG9ib2Ugd29ya3MgZm9yIGEgYml0IGFuZCAqLworLyogdGhlbiBoYW5ncyAqLworI2RlZmluZSBPUFRJTUlaRV9UWAorCisvKiBTZXQgdGhlIG51bWJlciBvZiBzbG90cyBpbiB0aGUgcmluZ3MgKi8KKy8qIElmIHlvdSBnZXQgcngvdHggZmlmbyBvdmVyZmxvd3MgYXQgaGlnaCBiaXRyYXRlcywgeW91IGNhbiB0cnkgaW5jcmVhc2luZyAqLworLyogdGhlc2UgKi8KKworI2RlZmluZSBSSU5HX1NJWkUgKE9CT0VfUklOR19TSVpFX1JYOCB8IE9CT0VfUklOR19TSVpFX1RYOCkKKyNkZWZpbmUgVFhfU0xPVFMgICAgOAorI2RlZmluZSBSWF9TTE9UUyAgICA4CisKKworLyogTGVzcyB1c2VyIHNlcnZpY2FibGUgcGFydHMgYmVsb3cgaGVyZSAqLworCisvKiBUZXN0LCBUcmFuc21pdCBhbmQgcmVjZWl2ZSBidWZmZXIgc2l6ZXMsIGFkanVzdCBhdCB5b3VyIHBlcmlsICovCisvKiByZW1hcmtzOiBuZnMgdXN1YWxseSBuZWVkcyAxayBibG9ja3MgKi8KKy8qIHJlbWFya3M6IGluIFNJUiBtb2RlLCBDUkMgaXMgcmVjZWl2ZWQsIC0+IFJYX0xFTj1UWF9MRU4rMiAqLworLyogcmVtYXJrczogdGVzdCBhY2NlcHRzIGxhcmdlIGJsb2Nrcy4gU3RhbmRhcmQgaXMgMHg4MCAqLworLyogV2hlbiBUVF9MRU4gPiBSWF9MRU4gKFNJUiBtb2RlKSBkYXRhIGlzIHN0b3JlZCBpbiBzdWNjZXNzaXZlIHNsb3RzLiAqLworLyogV2hlbiAzIG9yIG1vcmUgc2xvdHMgYXJlIG5lZWRlZCBmb3IgZWFjaCB0ZXN0IHBhY2tldCwgKi8KKy8qIGRhdGEgcmVjZWl2ZWQgaW4gdGhlIGZpcnN0IHNsb3RzIGlzIG92ZXJ3cml0dGVuLCBldmVuICovCisvKiBpZiBPQk9FX0NUTF9SWF9IV19PV05TIGlzIG5vdCBzZXQsIHdpdGhvdXQgYW55IGVycm9yISAqLworI2RlZmluZSBUVF9MRU4gICAgICAweDgwCisjZGVmaW5lIFRYX0xFTiAgICAgIDB4YzAwCisjZGVmaW5lIFJYX0xFTiAgICAgIDB4YzA0CisvKiBSZWFsIHRyYW5zbWl0dGVkIGxlbmd0aCAoU0lSIG1vZGUpIGlzIGFib3V0IDE0KygyJSpUWF9MRU4pIG1vcmUgKi8KKy8qIGxvbmcgdGhhbiB1c2VyLWRlZmluZWQgbGVuZ3RoIChzZWUgYXN5bmNfd3JhcF9za2IpIGFuZCBpcyBsZXNzIHRoZW4gNEsgKi8KKy8qIFJlYWwgcmVjZWl2ZWQgbGVuZ3RoIGlzIChtYXggUlhfTEVOKSBkaWZmZXJzIGZyb20gdXNlci1kZWZpbmVkICovCisvKiBsZW5ndGggb25seSBiIHRoZSBDUkMgKDIgb3IgNCBieXRlcykgKi8KKyNkZWZpbmUgQlVGX1NBRkVUWSAgMHg3YQorI2RlZmluZSBSWF9CVUZfU1ogICAoUlhfTEVOKQorI2RlZmluZSBUWF9CVUZfU1ogICAoVFhfTEVOK0JVRl9TQUZFVFkpCisKKworLyogTG9naWMgb2YgdGhlIG5ldGRldiBwYXJ0IG9mIHRoaXMgZHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBUaGUgUlggcmluZyBpcyBmaWxsZWQgd2l0aCBidWZmZXJzLCB3aGVuIGEgcGFja2V0IGFycml2ZXMgICAgICAgICAgICovCisvKiBpdCBpcyBETUEnZCBpbnRvIHRoZSBidWZmZXIgd2hpY2ggaXMgbWFya2VkIHVzZWQgYW5kIFJ4RG9uZSBjYWxsZWQgICovCisvKiBSeERvbmUgZm9ybXMgYW4gc2tiIChhbmQgY2hlY2tzIHRoZSBDUkMgaWYgaW4gU0lSIG1vZGUpIGFuZCBzaGlwcyAgICovCisvKiB0aGUgcGFja2V0IG9mZiB1cHN0YWlycyAqLworCisvKiBUaGUgdHJhbnNtaXR0ZXIgb24gdGhlIG9ib2UgY2hpcCBjYW4gd29yayBpbiBvbmUgb2YgdHdvIG1vZGVzICAgICAgICovCisvKiBmb3IgZWFjaCByaW5nLT50eFtdIHRoZSB0cmFuc21pdHRlciBjYW4gZWl0aGVyICAgICAgICAgICAgICAgICAgICAgICovCisvKiBhKSB0cmFuc21pdCB0aGUgcGFja2V0LCBsZWF2ZSB0aGUgdHJhc21pdHRlciBlbmFibGVkIGFuZCBwcm9jZWVkIHRvICovCisvKiAgICB0aGUgbmV4dCByaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBiKSB0cmFuc21pdCB0aGUgcGFja2V0LCBzd2l0Y2ggb2ZmIHRoZSB0cmFuc21pdHRlciBhbmQgaXNzdWUgVHhEb25lICovCisKKy8qIEFsbCBwYWNrZXRzIGFyZSBlbnRlcmVkIGludG8gdGhlIHJpbmcgaW4gbW9kZSBiKSwgaWYgdGhlIHJpbmcgd2FzICAgKi8KKy8qIGVtcHR5IHRoZSB0cmFuc21pdHRlciBpcyBzdGFydGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogSWYgT1BUSU1JWkVfVFggaXMgZGVmaW5lZCB0aGVuIGluIFR4RG9uZSBpZiB0aGUgcmluZyBjb250YWlucyAgICAgICAqLworLyogbW9yZSB0aGFuIG9uZSBwYWNrZXQsIGFsbCBidXQgdGhlIGxhc3QgYXJlIHNldCB0byBtb2RlIGEpIFtIT1dFVkVSICAqLworLyogdGhlIGhhcmR3YXJlIG1heSBub3Qgbm90aWNlIHRoaXMsIHRoaXMgaXMgd2h5IHdlIHN0YXJ0IGluIG1vZGUgYikgXSAqLworLyogdGhlbiByZXN0YXJ0IHRoZSB0cmFuc21pdHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBJZiBPUFRJTUlaRV9UWCBpcyBub3QgZGVmaW5lZCB0aGVuIHdlIGp1c3QgcmVzdGFydCB0aGUgdHJhbnNtaXR0ZXIgICovCisvKiBpZiB0aGUgcmluZyBpc24ndCBlbXB0eSAqLworCisvKiBTcGVlZCBjaGFuZ2VzIGFyZSBkZWxheWVkIHVudGlsIHRoZSBUeFJpbmcgaXMgZW1wdHkgICAgICAgICAgICAgICAgICovCisvKiBtdHQgaXMgaGFuZGxlZCBieSBnZW5lcmF0aW5nIHBhY2tldHMgd2l0aCBiYWQgQ1JDcywgYmVmb3JlIHRoZSBkYXRhICovCisKKy8qIFRPRE86ICovCisvKiBjaGVjayB0aGUgbXR0IHdvcmtzIG9rICAgICAgKi8KKy8qIGZpbmlzaCB0aGUgd2F0Y2hkb2cgICAgICAgICAqLworCisvKiBObyB1c2VyIHNlcnZpY2FibGUgcGFydHMgYmVsb3cgaGVyZSAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL3dyYXBwZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisvLyNpbmNsdWRlIDxuZXQvaXJkYS9pcm1vZC5oPgorLy8jaW5jbHVkZSA8bmV0L2lyZGEvaXJsYXBfZnJhbWUuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2NyYy5oPgorCisjaW5jbHVkZSAiZG9uYXVib2UuaCIKKworI2RlZmluZSBJTkIocG9ydCkgICAgICAgaW5iX3AocG9ydCkKKyNkZWZpbmUgT1VUQih2YWwscG9ydCkgIG91dGJfcCh2YWwscG9ydCkKKyNkZWZpbmUgT1VUQlAodmFsLHBvcnQpIG91dGJfcCh2YWwscG9ydCkKKworI2RlZmluZSBQUk9NUFQgIE9VVEIoT0JPRV9QUk9NUFRfQklULE9CT0VfUFJPTVBUKTsKKworI2lmIFBST0JFX1ZFUkJPU0UKKyNkZWZpbmUgUFJPQkVfREVCVUcoYXJncy4uLikgKHByaW50ayAoYXJncykpCisjZWxzZQorI2RlZmluZSBQUk9CRV9ERUJVRyhhcmdzLi4uKSA7CisjZW5kaWYKKworLyogU2V0IHRoZSBETUEgdG8gYmUgYnl0ZSBhdCBhIHRpbWUgKi8KKyNkZWZpbmUgQ09ORklHMEhfRE1BX09GRiBPQk9FX0NPTkZJRzBIX1JDVkFOWQorI2RlZmluZSBDT05GSUcwSF9ETUFfT05fTk9SWCBDT05GSUcwSF9ETUFfT0ZGfCBPQk9FX0NPTkZJRzBIX0VORE1BQworI2RlZmluZSBDT05GSUcwSF9ETUFfT04gQ09ORklHMEhfRE1BX09OX05PUlggfCBPQk9FX0NPTkZJRzBIX0VOUlgKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHRvc2hvYm9lX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfVE9TSElCQSwgUENJX0RFVklDRV9JRF9GSVI3MDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyBQQ0lfVkVORE9SX0lEX1RPU0hJQkEsIFBDSV9ERVZJQ0VfSURfRklSRDAxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgfQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHRvc2hvYm9lX3BjaV90YmwpOworCisjZGVmaW5lIERSSVZFUl9OQU1FICJ0b3Nob2JvZSIKK3N0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9IERSSVZFUl9OQU1FOworCitzdGF0aWMgaW50IG1heF9iYXVkID0gNDAwMDAwMDsKKyNpZmRlZiBVU0VfUFJPQkUKK3N0YXRpYyBpbnQgZG9fcHJvYmUgPSAwOworI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50Cit0b3Nob2JvZV9jaGVja2ZjcyAodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQoreworICBpbnQgaTsKKyAgdW5pb24KKyAgeworICAgIF9fdTE2IHZhbHVlOworICAgIF9fdTggYnl0ZXNbMl07CisgIH0KKyAgZmNzOworCisgIGZjcy52YWx1ZSA9IElOSVRfRkNTOworCisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKyAgICBmY3MudmFsdWUgPSBpcmRhX2ZjcyAoZmNzLnZhbHVlLCAqKGJ1ZisrKSk7CisKKyAgcmV0dXJuIChmY3MudmFsdWUgPT0gR09PRF9GQ1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBHZW5lcmljIGNoaXAgaGFuZGxpbmcgY29kZSAqLworI2lmZGVmIERVTVBfUEFDS0VUUworc3RhdGljIHVuc2lnbmVkIGNoYXIgZHVtcFs1MF07CitzdGF0aWMgdm9pZAorX2R1bXBidWZzICh1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuLCBjaGFyIHRldGUpCit7CitpbnQgaSxqOworY2hhciBoZWFkPXRldGU7Citmb3IgKGk9MDtpPGxlbjtpKz0xNikgeworICAgIGZvciAoaj0wO2o8MTYgJiYgaStqPGxlbjtqKyspIHsgc3ByaW50ZigmZHVtcFszKmpdLCIlMDJ4LiIsZGF0YVtpK2pdKTsgfQorICAgIGR1bXAgWzMqal09MDsKKyAgICBJUkRBX0RFQlVHICgyLCAiJWMlc1xuIixoZWFkICwgZHVtcCk7CisgICAgaGVhZD0nKyc7CisgICAgfQorfQorI2VuZGlmCisKKyNpZmRlZiBVU0VfUFJPQkUKKy8qIER1bXAgdGhlIHJlZ2lzdGVycyAqLworc3RhdGljIHZvaWQKK3Rvc2hvYm9lX2R1bXByZWdzIChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYpCit7CisgIF9fdTMyIHJpbmdiYXNlOworCisgIElSREFfREVCVUcgKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisgIHJpbmdiYXNlID0gSU5CIChPQk9FX1JJTkdfQkFTRTApIDw8IDEwOworICByaW5nYmFzZSB8PSBJTkIgKE9CT0VfUklOR19CQVNFMSkgPDwgMTg7CisgIHJpbmdiYXNlIHw9IElOQiAoT0JPRV9SSU5HX0JBU0UyKSA8PCAyNjsKKworICBwcmludGsgKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6IFJlZ2lzdGVyIGR1bXA6XG4iKTsKKyAgcHJpbnRrIChLRVJOX0VSUiAiSW50ZXJydXB0czogVHg6JWQgUng6JWQgVHhVbmRlcjolZCBSeE92ZXI6JWQgU2lwOiVkXG4iLAorICAgICAgICAgIHNlbGYtPmludF90eCwgc2VsZi0+aW50X3J4LCBzZWxmLT5pbnRfdHh1bmRlciwgc2VsZi0+aW50X3J4b3ZlciwKKyAgICAgICAgICBzZWxmLT5pbnRfc2lwKTsKKyAgcHJpbnRrIChLRVJOX0VSUiAiUlggJTAyeCBUWCAlMDJ4IFJpbmdCYXNlICUwOHhcbiIsCisgICAgICAgICAgSU5CIChPQk9FX1JYU0xPVCksIElOQiAoT0JPRV9UWFNMT1QpLCByaW5nYmFzZSk7CisgIHByaW50ayAoS0VSTl9FUlIgIlJJTkdfU0laRSAlMDJ4IElFUiAlMDJ4IElTUiAlMDJ4XG4iLAorICAgICAgICAgIElOQiAoT0JPRV9SSU5HX1NJWkUpLCBJTkIgKE9CT0VfSUVSKSwgSU5CIChPQk9FX0lTUikpOworICBwcmludGsgKEtFUk5fRVJSICJDT05GSUcxICUwMnggU1RBVFVTICUwMnhcbiIsCisgICAgICAgICAgSU5CIChPQk9FX0NPTkZJRzEpLCBJTkIgKE9CT0VfU1RBVFVTKSk7CisgIHByaW50ayAoS0VSTl9FUlIgIkNPTkZJRzAgJTAyeCUwMnggRU5BQkxFICUwMnglMDJ4XG4iLAorICAgICAgICAgIElOQiAoT0JPRV9DT05GSUcwSCksIElOQiAoT0JPRV9DT05GSUcwTCksCisgICAgICAgICAgSU5CIChPQk9FX0VOQUJMRUgpLCBJTkIgKE9CT0VfRU5BQkxFTCkpOworICBwcmludGsgKEtFUk5fRVJSICJORVdfUENPTkZJRyAlMDJ4JTAyeCBDVVJSX1BDT05GSUcgJTAyeCUwMnhcbiIsCisgICAgICAgICAgSU5CIChPQk9FX05FV19QQ09ORklHSCksIElOQiAoT0JPRV9ORVdfUENPTkZJR0wpLAorICAgICAgICAgIElOQiAoT0JPRV9DVVJSX1BDT05GSUdIKSwgSU5CIChPQk9FX0NVUlJfUENPTkZJR0wpKTsKKyAgcHJpbnRrIChLRVJOX0VSUiAiTUFYTEVOICUwMnglMDJ4IFJYQ09VTlQgJTAyeCUwMnhcbiIsCisgICAgICAgICAgSU5CIChPQk9FX01BWExFTkgpLCBJTkIgKE9CT0VfTUFYTEVOTCksCisgICAgICAgICAgSU5CIChPQk9FX1JYQ09VTlRMKSwgSU5CIChPQk9FX1JYQ09VTlRIKSk7CisKKyAgaWYgKHNlbGYtPnJpbmcpCisgICAgeworICAgICAgaW50IGk7CisgICAgICByaW5nYmFzZSA9IHZpcnRfdG9fYnVzIChzZWxmLT5yaW5nKTsKKyAgICAgIHByaW50ayAoS0VSTl9FUlIgIlJpbmcgYXQgJTA4eDpcbiIsIHJpbmdiYXNlKTsKKyAgICAgIHByaW50ayAoS0VSTl9FUlIgIlJYOiIpOworICAgICAgZm9yIChpID0gMDsgaSA8IFJYX1NMT1RTOyArK2kpCisgICAgICAgIHByaW50ayAoIiAoJWQsJTAyeCkiLHNlbGYtPnJpbmctPnJ4W2ldLmxlbixzZWxmLT5yaW5nLT5yeFtpXS5jb250cm9sKTsKKyAgICAgIHByaW50ayAoIlxuIik7CisgICAgICBwcmludGsgKEtFUk5fRVJSICJUWDoiKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBSWF9TTE9UUzsgKytpKQorICAgICAgICBwcmludGsgKCIgKCVkLCUwMngpIixzZWxmLT5yaW5nLT50eFtpXS5sZW4sc2VsZi0+cmluZy0+dHhbaV0uY29udHJvbCk7CisgICAgICBwcmludGsgKCJcbiIpOworICAgIH0KK30KKyNlbmRpZgorCisvKkRvbid0IGxldCB0aGUgY2hpcCBsb29rIGF0IG1lbW9yeSAqLworc3RhdGljIHZvaWQKK3Rvc2hvYm9lX2Rpc2FibGVibSAoc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmKQoreworICBfX3U4IGNvbW1hbmQ7CisgIElSREFfREVCVUcgKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisgIHBjaV9yZWFkX2NvbmZpZ19ieXRlIChzZWxmLT5wZGV2LCBQQ0lfQ09NTUFORCwgJmNvbW1hbmQpOworICBjb21tYW5kICY9IH5QQ0lfQ09NTUFORF9NQVNURVI7CisgIHBjaV93cml0ZV9jb25maWdfYnl0ZSAoc2VsZi0+cGRldiwgUENJX0NPTU1BTkQsIGNvbW1hbmQpOworCit9CisKKy8qIFNodXRkb3duIHRoZSBjaGlwIGFuZCBwb2ludCB0aGUgdGFza2ZpbGUgcmVnIHNvbWV3aGVyZSBlbHNlICovCitzdGF0aWMgdm9pZAordG9zaG9ib2Vfc3RvcGNoaXAgKHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZikKK3sKKyAgSVJEQV9ERUJVRyAoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgLypEaXNhYmxlIGludGVycnVwdHMgKi8KKyAgT1VUQiAoMHgwLCBPQk9FX0lFUik7CisgIC8qRGlzYWJsZSBETUEsIERpc2FibGUgUngsIERpc2FibGUgVHggKi8KKyAgT1VUQiAoQ09ORklHMEhfRE1BX09GRiwgT0JPRV9DT05GSUcwSCk7CisgIC8qRGlzYWJsZSBTSVIgTUlSIEZJUiwgVHggYW5kIFJ4ICovCisgIE9VVEIgKDB4MDAsIE9CT0VfRU5BQkxFSCk7CisgIC8qUG9pbnQgdGhlIHJpbmcgc29tZXdoZXJlIHNhZmUgKi8KKyAgT1VUQiAoMHgzZiwgT0JPRV9SSU5HX0JBU0UyKTsKKyAgT1VUQiAoMHhmZiwgT0JPRV9SSU5HX0JBU0UxKTsKKyAgT1VUQiAoMHhmZiwgT0JPRV9SSU5HX0JBU0UwKTsKKworICBPVVRCIChSWF9MRU4gPj4gOCwgT0JPRV9NQVhMRU5IKTsKKyAgT1VUQiAoUlhfTEVOICYgMHhmZiwgT0JPRV9NQVhMRU5MKTsKKworICAvKkFja25vbGVkZ2UgYW55IHBlbmRpbmcgaW50ZXJydXB0cyAqLworICBPVVRCICgweGZmLCBPQk9FX0lTUik7CisKKyAgLypXaHkgKi8KKyAgT1VUQiAoT0JPRV9FTkFCTEVIX1BIWUFORENMT0NLLCBPQk9FX0VOQUJMRUgpOworCisgIC8qc3dpdGNoIGl0IG9mZiAqLworICBPVVRCIChPQk9FX0NPTkZJRzFfT0ZGLCBPQk9FX0NPTkZJRzEpOworCisgIHRvc2hvYm9lX2Rpc2FibGVibSAoc2VsZik7Cit9CisKKy8qIFRyYW5zbWl0dGVyIGluaXRpYWxpemF0aW9uICovCitzdGF0aWMgdm9pZAordG9zaG9ib2Vfc3RhcnRfRE1BIChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYsIGludCBvcHRzKQoreworICBPVVRCICgweDAsIE9CT0VfRU5BQkxFSCk7CisgIE9VVEIgKENPTkZJRzBIX0RNQV9PTiB8IG9wdHMsICBPQk9FX0NPTkZJRzBIKTsKKyAgT1VUQiAoT0JPRV9FTkFCTEVIX1BIWUFORENMT0NLLCBPQk9FX0VOQUJMRUgpOworICBQUk9NUFQ7Cit9CisKKy8qU2V0IHRoZSBiYXVkIHJhdGUgKi8KK3N0YXRpYyB2b2lkCit0b3Nob2JvZV9zZXRiYXVkIChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYpCit7CisgIF9fdTE2IHBjb25maWcgPSAwOworICBfX3U4IGNvbmZpZzBsID0gMDsKKworICBJUkRBX0RFQlVHICgyLCAiJXMoJWQvJWQpXG4iLCBfX0ZVTkNUSU9OX18sIHNlbGYtPnNwZWVkLCBzZWxmLT5pby5zcGVlZCk7CisKKyAgc3dpdGNoIChzZWxmLT5zcGVlZCkKKyAgICB7CisgICAgY2FzZSAyNDAwOgorICAgIGNhc2UgNDgwMDoKKyAgICBjYXNlIDk2MDA6CisgICAgY2FzZSAxOTIwMDoKKyAgICBjYXNlIDM4NDAwOgorICAgIGNhc2UgNTc2MDA6CisgICAgY2FzZSAxMTUyMDA6CisjaWZkZWYgVVNFX01JUgorICAgIGNhc2UgMTE1MjAwMDoKKyNlbmRpZgorICAgIGNhc2UgNDAwMDAwMDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisKKyAgICAgIHByaW50ayAoS0VSTl9FUlIgRFJJVkVSX05BTUUgIjogc3dpdGNoIHRvIHVuc3VwcG9ydGVkIGJhdWRyYXRlICVkXG4iLAorICAgICAgICAgICAgICBzZWxmLT5zcGVlZCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHN3aXRjaCAoc2VsZi0+c3BlZWQpCisgICAgeworICAgICAgLyogRm9yIFNJUiB0aGUgcHJlYW1ibGUgaXMgZG9uZSBieSBhZGRpbmcgWEJPRnMgKi8KKyAgICAgIC8qIHRvIHRoZSBwYWNrZXQgKi8KKyAgICAgIC8qIHNldCB0byBmaWx0ZXJlZCBTSVIgbW9kZSwgZmlsdGVyIGxvb2tzIGZvciBCT0YgYW5kIEVPRiAqLworICAgIGNhc2UgMjQwMDoKKyAgICAgIHBjb25maWcgfD0gNDcgPDwgT0JPRV9QQ09ORklHX0JBVURTSElGVDsKKyAgICAgIHBjb25maWcgfD0gMjUgPDwgT0JPRV9QQ09ORklHX1dJRFRIU0hJRlQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ4MDA6CisgICAgICBwY29uZmlnIHw9IDIzIDw8IE9CT0VfUENPTkZJR19CQVVEU0hJRlQ7CisgICAgICBwY29uZmlnIHw9IDI1IDw8IE9CT0VfUENPTkZJR19XSURUSFNISUZUOworICAgICAgYnJlYWs7CisgICAgY2FzZSA5NjAwOgorICAgICAgcGNvbmZpZyB8PSAxMSA8PCBPQk9FX1BDT05GSUdfQkFVRFNISUZUOworICAgICAgcGNvbmZpZyB8PSAyNSA8PCBPQk9FX1BDT05GSUdfV0lEVEhTSElGVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTkyMDA6CisgICAgICBwY29uZmlnIHw9IDUgPDwgT0JPRV9QQ09ORklHX0JBVURTSElGVDsKKyAgICAgIHBjb25maWcgfD0gMjUgPDwgT0JPRV9QQ09ORklHX1dJRFRIU0hJRlQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM4NDAwOgorICAgICAgcGNvbmZpZyB8PSAyIDw8IE9CT0VfUENPTkZJR19CQVVEU0hJRlQ7CisgICAgICBwY29uZmlnIHw9IDI1IDw8IE9CT0VfUENPTkZJR19XSURUSFNISUZUOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1NzYwMDoKKyAgICAgIHBjb25maWcgfD0gMSA8PCBPQk9FX1BDT05GSUdfQkFVRFNISUZUOworICAgICAgcGNvbmZpZyB8PSAyNSA8PCBPQk9FX1BDT05GSUdfV0lEVEhTSElGVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTE1MjAwOgorICAgICAgcGNvbmZpZyB8PSAwIDw8IE9CT0VfUENPTkZJR19CQVVEU0hJRlQ7CisgICAgICBwY29uZmlnIHw9IDI1IDw8IE9CT0VfUENPTkZJR19XSURUSFNISUZUOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qU2V0IHRvIHBhY2tldCBiYXNlZCByZWNlcHRpb24gKi8KKyAgICAgIE9VVEIgKFJYX0xFTiA+PiA4LCBPQk9FX01BWExFTkgpOworICAgICAgT1VUQiAoUlhfTEVOICYgMHhmZiwgT0JPRV9NQVhMRU5MKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBzd2l0Y2ggKHNlbGYtPnNwZWVkKQorICAgIHsKKyAgICBjYXNlIDI0MDA6CisgICAgY2FzZSA0ODAwOgorICAgIGNhc2UgOTYwMDoKKyAgICBjYXNlIDE5MjAwOgorICAgIGNhc2UgMzg0MDA6CisgICAgY2FzZSA1NzYwMDoKKyAgICBjYXNlIDExNTIwMDoKKyAgICAgIGNvbmZpZzBsID0gT0JPRV9DT05GSUcwTF9FTlNJUjsKKyAgICAgIGlmIChzZWxmLT5hc3luYykKKyAgICAgICAgeworICAgICAgICAgIC8qU2V0IHRvIGNoYXJhY3RlciBiYXNlZCByZWNlcHRpb24gKi8KKyAgICAgICAgICAvKlN5c3RlbSB3aWxsIGxvY2sgaWYgTUFYTEVOPTAgKi8KKyAgICAgICAgICAvKnNvIGhhdmUgdG8gYmUgY2FyZWZ1bCAqLworICAgICAgICAgIE9VVEIgKDB4MDEsIE9CT0VfTUFYTEVOSCk7CisgICAgICAgICAgT1VUQiAoMHgwMSwgT0JPRV9NQVhMRU5MKTsKKyAgICAgICAgICBPVVRCICgweDAwLCBPQk9FX01BWExFTkgpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKlNldCB0byBwYWNrZXQgYmFzZWQgcmVjZXB0aW9uICovCisgICAgICAgICAgY29uZmlnMGwgfD0gT0JPRV9DT05GSUcwTF9FTlNJUkY7CisgICAgICAgICAgT1VUQiAoUlhfTEVOID4+IDgsIE9CT0VfTUFYTEVOSCk7CisgICAgICAgICAgT1VUQiAoUlhfTEVOICYgMHhmZiwgT0JPRV9NQVhMRU5MKTsKKyAgICAgICAgfQorICAgICAgYnJlYWs7CisKKyNpZmRlZiBVU0VfTUlSCisgICAgICAvKiBNSVIgbW9kZSAqLworICAgICAgLyogU2V0IGZvciAxNiBiaXQgQ1JDIGFuZCBlbmFibGUgTUlSICovCisgICAgICAvKiBQcmVhbWJsZSBub3cgaGFuZGxlZCBieSB0aGUgY2hpcCAqLworICAgIGNhc2UgMTE1MjAwMDoKKyAgICAgIHBjb25maWcgfD0gMCA8PCBPQk9FX1BDT05GSUdfQkFVRFNISUZUOworICAgICAgcGNvbmZpZyB8PSA4IDw8IE9CT0VfUENPTkZJR19XSURUSFNISUZUOworICAgICAgcGNvbmZpZyB8PSAxIDw8IE9CT0VfUENPTkZJR19QUkVBTUJMRVNISUZUOworICAgICAgY29uZmlnMGwgPSBPQk9FX0NPTkZJRzBMX0NSQzE2IHwgT0JPRV9DT05GSUcwTF9FTk1JUjsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAvKiBGSVIgbW9kZSAqLworICAgICAgLyogU2V0IGZvciAzMiBiaXQgQ1JDIGFuZCBlbmFibGUgRklSICovCisgICAgICAvKiBQcmVhbWJsZSBoYW5kbGVkIGJ5IHRoZSBjaGlwICovCisgICAgY2FzZSA0MDAwMDAwOgorICAgICAgcGNvbmZpZyB8PSAwIDw8IE9CT0VfUENPTkZJR19CQVVEU0hJRlQ7CisgICAgICAvKiBEb2N1bWVudGF0aW9uIHNheXMgMTQsIGJ1dCB0b3NoaWJhIHVzZSAxNSBpbiB0aGVpciBkcml2ZXJzICovCisgICAgICBwY29uZmlnIHw9IDE1IDw8IE9CT0VfUENPTkZJR19QUkVBTUJMRVNISUZUOworICAgICAgY29uZmlnMGwgPSBPQk9FX0NPTkZJRzBMX0VORklSOworICAgICAgYnJlYWs7CisgICAgfQorCisgIC8qIENvcHkgaW50byBuZXcgUEhZIGNvbmZpZyBidWZmZXIgKi8KKyAgT1VUQlAgKHBjb25maWcgPj4gOCwgT0JPRV9ORVdfUENPTkZJR0gpOworICBPVVRCIChwY29uZmlnICYgMHhmZiwgT0JPRV9ORVdfUENPTkZJR0wpOworICBPVVRCIChjb25maWcwbCwgT0JPRV9DT05GSUcwTCk7CisKKyAgLyogTm93IG1ha2UgT0JPRSBjb3B5IGZyb20gbmV3IFBIWSB0byBjdXJyZW50IFBIWSAqLworICBPVVRCICgweDAsIE9CT0VfRU5BQkxFSCk7CisgIE9VVEIgKE9CT0VfRU5BQkxFSF9QSFlBTkRDTE9DSywgT0JPRV9FTkFCTEVIKTsKKyAgUFJPTVBUOworCisgIC8qIHNwZWVkIGNoYW5nZSBleGVjdXRlZCAqLworICBzZWxmLT5uZXdfc3BlZWQgPSAwOworICBzZWxmLT5pby5zcGVlZCA9IHNlbGYtPnNwZWVkOworfQorCisvKkxldCB0aGUgY2hpcCBsb29rIGF0IG1lbW9yeSAqLworc3RhdGljIHZvaWQKK3Rvc2hvYm9lX2VuYWJsZWJtIChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYpCit7CisgIElSREFfREVCVUcgKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworICBwY2lfc2V0X21hc3RlciAoc2VsZi0+cGRldik7Cit9CisKKy8qc2V0dXAgdGhlIHJpbmcgKi8KK3N0YXRpYyB2b2lkCit0b3Nob2JvZV9pbml0cmluZyAoc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmKQoreworICBpbnQgaTsKKworICBJUkRBX0RFQlVHICg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworICBmb3IgKGkgPSAwOyBpIDwgVFhfU0xPVFM7ICsraSkKKyAgICB7CisgICAgICBzZWxmLT5yaW5nLT50eFtpXS5sZW4gPSAwOworICAgICAgc2VsZi0+cmluZy0+dHhbaV0uY29udHJvbCA9IDB4MDA7CisgICAgICBzZWxmLT5yaW5nLT50eFtpXS5hZGRyZXNzID0gdmlydF90b19idXMgKHNlbGYtPnR4X2J1ZnNbaV0pOworICAgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgUlhfU0xPVFM7ICsraSkKKyAgICB7CisgICAgICBzZWxmLT5yaW5nLT5yeFtpXS5sZW4gPSBSWF9MRU47CisgICAgICBzZWxmLT5yaW5nLT5yeFtpXS5sZW4gPSAwOworICAgICAgc2VsZi0+cmluZy0+cnhbaV0uYWRkcmVzcyA9IHZpcnRfdG9fYnVzIChzZWxmLT5yeF9idWZzW2ldKTsKKyAgICAgIHNlbGYtPnJpbmctPnJ4W2ldLmNvbnRyb2wgPSBPQk9FX0NUTF9SWF9IV19PV05TOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3Rvc2hvYm9lX3Jlc2V0cHRycyAoc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmKQoreworICAvKiBDYW4gcmVzZXQgcG9pbnRlcnMgYnkgdHdpZGxpbmcgRE1BICovCisgIE9VVEIgKDB4MCwgT0JPRV9FTkFCTEVIKTsKKyAgT1VUQlAgKENPTkZJRzBIX0RNQV9PRkYsIE9CT0VfQ09ORklHMEgpOworICBPVVRCIChPQk9FX0VOQUJMRUhfUEhZQU5EQ0xPQ0ssIE9CT0VfRU5BQkxFSCk7CisKKyAgc2VsZi0+cnhzID0gaW5iX3AgKE9CT0VfUlhTTE9UKSAmIE9CT0VfU0xPVF9NQVNLOworICBzZWxmLT50eHMgPSBpbmJfcCAoT0JPRV9UWFNMT1QpICYgT0JPRV9TTE9UX01BU0s7Cit9CisKKy8qIENhbGxlZCBpbiBsb2NrZWQgc3RhdGUgKi8KK3N0YXRpYyB2b2lkCit0b3Nob2JvZV9pbml0cHRycyAoc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmKQoreworCisgIC8qIHNwaW5fbG9ja19pcnFzYXZlKHNlbGYtPnNwaW5sb2NrLCBmbGFncyk7ICovCisgIC8qIHNhdmVfZmxhZ3MgKGZsYWdzKTsgKi8KKworICAvKiBDYW4gcmVzZXQgcG9pbnRlcnMgYnkgdHdpZGxpbmcgRE1BICovCisgIHRvc2hvYm9lX3Jlc2V0cHRycyAoc2VsZik7CisKKyAgT1VUQiAoMHgwLCBPQk9FX0VOQUJMRUgpOworICBPVVRCIChDT05GSUcwSF9ETUFfT04sIE9CT0VfQ09ORklHMEgpOworICBPVVRCIChPQk9FX0VOQUJMRUhfUEhZQU5EQ0xPQ0ssIE9CT0VfRU5BQkxFSCk7CisKKyAgc2VsZi0+dHhwZW5kaW5nID0gMDsKKworICAvKiBzcGluX3VubG9ja19pcnFyZXN0b3JlKHNlbGYtPnNwaW5sb2NrLCBmbGFncyk7ICovCisgIC8qIHJlc3RvcmVfZmxhZ3MgKGZsYWdzKTsgKi8KK30KKworLyogV2FrZSB0aGUgY2hpcCB1cCBhbmQgZ2V0IGl0IGxvb2tpbmcgYXQgdGhlIHJpbmdzICovCisvKiBDYWxsZWQgaW4gbG9ja2VkIHN0YXRlICovCitzdGF0aWMgdm9pZAordG9zaG9ib2Vfc3RhcnRjaGlwIChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYpCit7CisgIF9fdTMyIHBoeXNhZGRyOworCisgIElSREFfREVCVUcgKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisgIHRvc2hvYm9lX2luaXRyaW5nIChzZWxmKTsKKyAgdG9zaG9ib2VfZW5hYmxlYm0gKHNlbGYpOworICBPVVRCUCAoT0JPRV9DT05GSUcxX1JFU0VULCBPQk9FX0NPTkZJRzEpOworICBPVVRCUCAoT0JPRV9DT05GSUcxX09OLCBPQk9FX0NPTkZJRzEpOworCisgIC8qIFN0b3AgdGhlIGNsb2NrcyAqLworICBPVVRCICgwLCBPQk9FX0VOQUJMRUgpOworCisgIC8qU2V0IHNpemUgb2YgcmluZ3MgKi8KKyAgT1VUQiAoUklOR19TSVpFLCBPQk9FX1JJTkdfU0laRSk7CisKKyAgLypBY2tub2xlZGdlIGFueSBwZW5kaW5nIGludGVycnVwdHMgKi8KKyAgT1VUQiAoMHhmZiwgT0JPRV9JU1IpOworCisgIC8qRW5hYmxlIGludHMgKi8KKyAgT1VUQiAoT0JPRV9JTlRfVFhET05FICB8IE9CT0VfSU5UX1JYRE9ORSB8CisgICAgICAgIE9CT0VfSU5UX1RYVU5ERVIgfCBPQk9FX0lOVF9SWE9WRVIgfCBPQk9FX0lOVF9TSVAgLCBPQk9FX0lFUik7CisKKyAgLypBY2tub2xlZGdlIGFueSBwZW5kaW5nIGludGVycnVwdHMgKi8KKyAgT1VUQiAoMHhmZiwgT0JPRV9JU1IpOworCisgIC8qU2V0IHRoZSBtYXhpbXVtIHBhY2tldCBsZW5ndGggdG8gMHhmZmYgKDQwOTUpICovCisgIE9VVEIgKFJYX0xFTiA+PiA4LCBPQk9FX01BWExFTkgpOworICBPVVRCIChSWF9MRU4gJiAweGZmLCBPQk9FX01BWExFTkwpOworCisgIC8qU2h1dGRvd24gRE1BICovCisgIE9VVEIgKENPTkZJRzBIX0RNQV9PRkYsIE9CT0VfQ09ORklHMEgpOworCisgIC8qRmluZCBvdXQgd2hlcmUgdGhlIHJpbmdzIGxpdmUgKi8KKyAgcGh5c2FkZHIgPSB2aXJ0X3RvX2J1cyAoc2VsZi0+cmluZyk7CisKKyAgSVJEQV9BU1NFUlQgKChwaHlzYWRkciAmIDB4M2ZmKSA9PSAwLAorCSAgICAgICBwcmludGsgKEtFUk5fRVJSIERSSVZFUl9OQU1FICJyaW5nIG5vdCBjb3JyZWN0bHkgYWxpZ25lZFxuIik7CisJICAgICAgIHJldHVybjspOworCisgIE9VVEIgKChwaHlzYWRkciA+PiAxMCkgJiAweGZmLCBPQk9FX1JJTkdfQkFTRTApOworICBPVVRCICgocGh5c2FkZHIgPj4gMTgpICYgMHhmZiwgT0JPRV9SSU5HX0JBU0UxKTsKKyAgT1VUQiAoKHBoeXNhZGRyID4+IDI2KSAmIDB4M2YsIE9CT0VfUklOR19CQVNFMik7CisKKyAgLypFbmFibGUgRE1BIGNvbnRyb2xlciBpbiBieXRlIG1vZGUgYW5kIFJYICovCisgIE9VVEIgKENPTkZJRzBIX0RNQV9PTiwgT0JPRV9DT05GSUcwSCk7CisKKyAgLyogU3RhcnQgdXAgdGhlIGNsb2NrcyAqLworICBPVVRCIChPQk9FX0VOQUJMRUhfUEhZQU5EQ0xPQ0ssIE9CT0VfRU5BQkxFSCk7CisKKyAgLypzZXQgdG8gc2Vuc2libGUgc3BlZWQgKi8KKyAgc2VsZi0+c3BlZWQgPSA5NjAwOworICB0b3Nob2JvZV9zZXRiYXVkIChzZWxmKTsKKyAgdG9zaG9ib2VfaW5pdHB0cnMgKHNlbGYpOworfQorCitzdGF0aWMgdm9pZAordG9zaG9ib2VfaXNudHN0dWNrIChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYpCit7Cit9CisKK3N0YXRpYyB2b2lkCit0b3Nob2JvZV9jaGVja3N0dWNrIChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYpCit7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgaWYgKDApCisgICAgeworICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgICAgIC8qIFRoaXMgd2lsbCByZXNldCB0aGUgY2hpcCBjb21wbGV0ZWx5ICovCisgICAgICBwcmludGsgKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6IFJlc2V0dGluZyBjaGlwXG4iKTsKKworICAgICAgdG9zaG9ib2Vfc3RvcGNoaXAgKHNlbGYpOworICAgICAgdG9zaG9ib2Vfc3RhcnRjaGlwIChzZWxmKTsKKyAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgICAgfQorfQorCisvKkdlbmVyYXRlIHBhY2tldCBvZiBhYm91dCBtdHQgdXMgbG9uZyAqLworc3RhdGljIGludAordG9zaG9ib2VfbWFrZW10dHBhY2tldCAoc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmLCB2b2lkICpidWYsIGludCBtdHQpCit7CisgIGludCB4Ym9mczsKKworICB4Ym9mcyA9ICgoaW50KSAobXR0LzEwMCkpICogKGludCkgKHNlbGYtPnNwZWVkKTsKKyAgeGJvZnM9eGJvZnMvODAwMDA7IC8qRWlnaHQgYml0cyBwZXIgYnl0ZSwgYW5kIG10dCBpcyBpbiB1cyovCisgIHhib2ZzKys7CisKKyAgSVJEQV9ERUJVRyAoMiwgRFJJVkVSX05BTUUKKyAgICAgICI6IGdlbmVyYXRlZCBtdHQgb2YgJWQgYnl0ZXMgZm9yICVkIHVzIGF0ICVkIGJhdWRcbiIKKwkgICwgeGJvZnMsbXR0LHNlbGYtPnNwZWVkKTsKKworICBpZiAoeGJvZnMgPiBUWF9MRU4pCisgICAgeworICAgICAgcHJpbnRrIChLRVJOX0VSUiBEUklWRVJfTkFNRSAiOiB3YW50ZWQgJWQgYnl0ZXMgTVRUIGJ1dCBUWF9MRU4gaXMgJWRcbiIsCisgICAgICAgICAgICAgIHhib2ZzLCBUWF9MRU4pOworICAgICAgeGJvZnMgPSBUWF9MRU47CisgICAgfQorCisgIC8qeGJvZnMgd2lsbCBkbyBmb3IgU0lSLCBNSVIgYW5kIEZJUixTSVIgbW9kZSBkb2Vzbid0IGdlbmVyYXRlIGEgY2hlY2tzdW0gYW55d2F5ICovCisgIG1lbXNldCAoYnVmLCBYQk9GLCB4Ym9mcyk7CisKKyAgcmV0dXJuIHhib2ZzOworfQorCitzdGF0aWMgaW50IHRvc2hvYm9lX2ludmFsaWRfZGV2KGludCBpcnEpCit7CisgIHByaW50ayAoS0VSTl9XQVJOSU5HIERSSVZFUl9OQU1FICI6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBpcnEpOworICByZXR1cm4gMTsKK30KKworI2lmZGVmIFVTRV9QUk9CRQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUHJvYmUgY29kZSAqLworCitzdGF0aWMgdm9pZAordG9zaG9ib2VfZHVtcHR4IChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYpCit7CisgIGludCBpOworICBQUk9CRV9ERUJVRyhLRVJOX1dBUk5JTkcgIlRYOiIpOworICBmb3IgKGkgPSAwOyBpIDwgUlhfU0xPVFM7ICsraSkKKyAgICBQUk9CRV9ERUJVRygiICglZCwlMDJ4KSIsc2VsZi0+cmluZy0+dHhbaV0ubGVuLHNlbGYtPnJpbmctPnR4W2ldLmNvbnRyb2wpOworICBQUk9CRV9ERUJVRygiIFslZF1cbiIsc2VsZi0+c3BlZWQpOworfQorCitzdGF0aWMgdm9pZAordG9zaG9ib2VfZHVtcHJ4IChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYsIGludCBzY29yZSkKK3sKKyAgaW50IGk7CisgIFBST0JFX0RFQlVHKCIgJWRcblJYOiIsc2NvcmUpOworICBmb3IgKGkgPSAwOyBpIDwgUlhfU0xPVFM7ICsraSkKKyAgICBQUk9CRV9ERUJVRygiICglZCwlMDJ4KSIsc2VsZi0+cmluZy0+cnhbaV0ubGVuLHNlbGYtPnJpbmctPnJ4W2ldLmNvbnRyb2wpOworICBQUk9CRV9ERUJVRygiXG4iKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3N0dWZmX2J5dGUgKF9fdTggYnl0ZSwgX191OCAqIGJ1ZikKK3sKKyAgc3dpdGNoIChieXRlKQorICAgIHsKKyAgICBjYXNlIEJPRjogICAgICAgICAgICAgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgIGNhc2UgRU9GOiAgICAgICAgICAgICAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgY2FzZSBDRToKKyAgICAgIC8qIEluc2VydCB0cmFuc3BhcmVudGx5IGNvZGVkICovCisgICAgICBidWZbMF0gPSBDRTsgICAgICAgICAgICAgIC8qIFNlbmQgbGluayBlc2NhcGUgKi8KKyAgICAgIGJ1ZlsxXSA9IGJ5dGUgXiBJUkRBX1RSQU5TOyAvKiBDb21wbGVtZW50IGJpdCA1ICovCisgICAgICByZXR1cm4gMjsKKyAgICAgIC8qIGJyZWFrOyAqLworICAgIGRlZmF1bHQ6CisgICAgICAvKiBOb24tc3BlY2lhbCB2YWx1ZSwgbm8gdHJhbnNwYXJlbmN5IHJlcXVpcmVkICovCisgICAgICBidWZbMF0gPSBieXRlOworICAgICAgcmV0dXJuIDE7CisgICAgICAvKiBicmVhazsgKi8KKyAgICB9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAordG9zaG9ib2VfcHJvYmVpbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgIHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZiA9IChzdHJ1Y3QgdG9zaG9ib2VfY2IgKikgZGV2X2lkOworICBfX3U4IGlycXN0YXQ7CisKKyAgaWYgKHNlbGYgPT0gTlVMTCAmJiB0b3Nob2JvZV9pbnZhbGlkX2RldihpcnEpKQorICAgIHJldHVybiBJUlFfTk9ORTsKKworICBpcnFzdGF0ID0gSU5CIChPQk9FX0lTUik7CisKKy8qIHdhcyBpdCB1cyAqLworICBpZiAoIShpcnFzdGF0ICYgT0JPRV9JTlRfTUFTSykpCisgICAgcmV0dXJuIElSUV9OT05FOworCisvKiBBY2sgYWxsIHRoZSBpbnRlcnJ1cHRzICovCisgIE9VVEIgKGlycXN0YXQsIE9CT0VfSVNSKTsKKworICBpZiAoaXJxc3RhdCAmIE9CT0VfSU5UX1RYRE9ORSkKKyAgICB7CisgICAgICBpbnQgdHhwOworCisgICAgICBzZWxmLT5pbnRfdHgrKzsKKyAgICAgIFBST0JFX0RFQlVHKCJUIik7CisKKyAgICAgIHR4cCA9IElOQiAoT0JPRV9UWFNMT1QpICYgT0JPRV9TTE9UX01BU0s7CisgICAgICBpZiAoc2VsZi0+cmluZy0+dHhbdHhwXS5jb250cm9sICYgT0JPRV9DVExfVFhfSFdfT1dOUykKKyAgICAgICAgeworICAgICAgICAgIHNlbGYtPmludF90eCs9MTAwOworICAgICAgICAgIFBST0JFX0RFQlVHKCJTIik7CisgICAgICAgICAgdG9zaG9ib2Vfc3RhcnRfRE1BKHNlbGYsIE9CT0VfQ09ORklHMEhfRU5UWCB8IE9CT0VfQ09ORklHMEhfTE9PUCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgaWYgKGlycXN0YXQgJiBPQk9FX0lOVF9SWERPTkUpIHsKKyAgICBzZWxmLT5pbnRfcngrKzsKKyAgICBQUk9CRV9ERUJVRygiUiIpOyB9CisgIGlmIChpcnFzdGF0ICYgT0JPRV9JTlRfVFhVTkRFUikgeworICAgIHNlbGYtPmludF90eHVuZGVyKys7CisgICAgUFJPQkVfREVCVUcoIlUiKTsgfQorICBpZiAoaXJxc3RhdCAmIE9CT0VfSU5UX1JYT1ZFUikgeworICAgIHNlbGYtPmludF9yeG92ZXIrKzsKKyAgICBQUk9CRV9ERUJVRygiTyIpOyB9CisgIGlmIChpcnFzdGF0ICYgT0JPRV9JTlRfU0lQKSB7CisgICAgc2VsZi0+aW50X3NpcCsrOworICAgIFBST0JFX0RFQlVHKCJJIik7IH0KKyAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50Cit0b3Nob2JvZV9tYWtldGVzdHBhY2tldCAodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYmFkY3JjLCBpbnQgZmlyKQoreworICBpbnQgaTsKKyAgaW50IGxlbiA9IDA7CisgIHVuaW9uCisgIHsKKyAgICBfX3UxNiB2YWx1ZTsKKyAgICBfX3U4IGJ5dGVzWzJdOworICB9CisgIGZjczsKKworICBpZiAoZmlyKQorICAgIHsKKyAgICAgIG1lbXNldCAoYnVmLCAwLCBUVF9MRU4pOworICAgICAgcmV0dXJuIChUVF9MRU4pOworICAgIH0KKworICBmY3MudmFsdWUgPSBJTklUX0ZDUzsKKworICBtZW1zZXQgKGJ1ZiwgWEJPRiwgMTApOworICBsZW4gKz0gMTA7CisgIGJ1ZltsZW4rK10gPSBCT0Y7CisKKyAgZm9yIChpID0gMDsgaSA8IFRUX0xFTjsgKytpKQorICAgIHsKKyAgICAgIGxlbiArPSBzdHVmZl9ieXRlIChpLCBidWYgKyBsZW4pOworICAgICAgZmNzLnZhbHVlID0gaXJkYV9mY3MgKGZjcy52YWx1ZSwgaSk7CisgICAgfQorCisgIGxlbiArPSBzdHVmZl9ieXRlIChmY3MuYnl0ZXNbMF0gXiBiYWRjcmMsIGJ1ZiArIGxlbik7CisgIGxlbiArPSBzdHVmZl9ieXRlIChmY3MuYnl0ZXNbMV0gXiBiYWRjcmMsIGJ1ZiArIGxlbik7CisgIGJ1ZltsZW4rK10gPSBFT0Y7CisgIGxlbisrOworICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50Cit0b3Nob2JvZV9wcm9iZWZhaWwgKHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZiwgY2hhciAqbXNnKQoreworICBwcmludGsgKEtFUk5fRVJSIERSSVZFUl9OQU1FICJwcm9iZSglZCkgZmFpbGVkICVzXG4iLHNlbGYtPiBzcGVlZCwgbXNnKTsKKyAgdG9zaG9ib2VfZHVtcHJlZ3MgKHNlbGYpOworICB0b3Nob2JvZV9zdG9wY2hpcCAoc2VsZik7CisgIGZyZWVfaXJxIChzZWxmLT5pby5pcnEsICh2b2lkICopIHNlbGYpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAordG9zaG9ib2VfbnVtdmFsaWRyY3ZzIChzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYpCit7CisgIGludCBpLCByZXQgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgUlhfU0xPVFM7ICsraSkKKyAgICBpZiAoKHNlbGYtPnJpbmctPnJ4W2ldLmNvbnRyb2wgJiAweGUwKSA9PSAwKQorICAgICAgcmV0Kys7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAordG9zaG9ib2VfbnVtcmN2cyAoc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmKQoreworICBpbnQgaSwgcmV0ID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IFJYX1NMT1RTOyArK2kpCisgICAgaWYgKCEoc2VsZi0+cmluZy0+cnhbaV0uY29udHJvbCAmIE9CT0VfQ1RMX1JYX0hXX09XTlMpKQorICAgICAgcmV0Kys7CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAordG9zaG9ib2VfcHJvYmUgKHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZikKK3sKKyAgaW50IGksIGosIG47CisjaWZkZWYgVVNFX01JUgorICBpbnQgYmF1ZHNbXSA9IHsgOTYwMCwgMTE1MjAwLCA0MDAwMDAwLCAxMTUyMDAwIH07CisjZWxzZQorICBpbnQgYmF1ZHNbXSA9IHsgOTYwMCwgMTE1MjAwLCA0MDAwMDAwIH07CisjZW5kaWYKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICBJUkRBX0RFQlVHICg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworICBpZiAocmVxdWVzdF9pcnEgKHNlbGYtPmlvLmlycSwgdG9zaG9ib2VfcHJvYmVpbnRlcnJ1cHQsCisgICAgICAgICAgICAgICAgICAgc2VsZi0+aW8uaXJxZmxhZ3MsICJ0b3Nob2JvZSIsICh2b2lkICopIHNlbGYpKQorICAgIHsKKyAgICAgIHByaW50ayAoS0VSTl9FUlIgRFJJVkVSX05BTUUgIjogcHJvYmUgZmFpbGVkIHRvIGFsbG9jYXRlIGlycSAlZFxuIiwKKyAgICAgICAgICAgICAgc2VsZi0+aW8uaXJxKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAvKiB0ZXN0IDE6IFNJUiBmaWx0ZXIgYW5kIGJhY2sgdG8gYmFjayAqLworCisgIGZvciAoaiA9IDA7IGogPCAoc2l6ZW9mIChiYXVkcykgLyBzaXplb2YgKGludCkpOyArK2opCisgICAgeworICAgICAgaW50IGZpciA9IChqID4gMSk7CisgICAgICB0b3Nob2JvZV9zdG9wY2hpcCAoc2VsZik7CisKKworICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgICAgICAvKkFkZHJlc3MgaXMgYWxyZWFkeSBzZXR1cCAqLworICAgICAgdG9zaG9ib2Vfc3RhcnRjaGlwIChzZWxmKTsKKyAgICAgIHNlbGYtPmludF9yeCA9IHNlbGYtPmludF90eCA9IDA7CisgICAgICBzZWxmLT5zcGVlZCA9IGJhdWRzW2pdOworICAgICAgdG9zaG9ib2Vfc2V0YmF1ZCAoc2VsZik7CisgICAgICB0b3Nob2JvZV9pbml0cHRycyAoc2VsZik7CisgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworCisgICAgICBzZWxmLT5yaW5nLT50eFtzZWxmLT50eHNdLmNvbnRyb2wgPQorLyogICAoRklSIG9ubHkpIE9CT0VfQ1RMX1RYX1NJUCBuZWVkZWQgZm9yIHN3aXRjaGluZyB0byBuZXh0IHNsb3QgKi8KKy8qICAgIE1JUjogYWxsIHJlY2VpdmVkIGRhdGEgaXMgc3RvcmVkIGluIG9uZSBzbG90ICovCisgICAgICAgIChmaXIpID8gT0JPRV9DVExfVFhfSFdfT1dOUyB8IE9CT0VfQ1RMX1RYX1JUQ0VOVFgKKyAgICAgICAgICAgICAgOiBPQk9FX0NUTF9UWF9IV19PV05TIDsKKyAgICAgIHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10ubGVuID0KKyAgICAgICAgdG9zaG9ib2VfbWFrZXRlc3RwYWNrZXQgKHNlbGYtPnR4X2J1ZnNbc2VsZi0+dHhzXSwgMCwgZmlyKTsKKyAgICAgIHNlbGYtPnR4cysrOworICAgICAgc2VsZi0+dHhzICU9IFRYX1NMT1RTOworCisgICAgICBzZWxmLT5yaW5nLT50eFtzZWxmLT50eHNdLmNvbnRyb2wgPQorICAgICAgICAoZmlyKSA/IE9CT0VfQ1RMX1RYX0hXX09XTlMgfCBPQk9FX0NUTF9UWF9TSVAKKyAgICAgICAgICAgICAgOiBPQk9FX0NUTF9UWF9IV19PV05TIHwgT0JPRV9DVExfVFhfUlRDRU5UWCA7CisgICAgICBzZWxmLT5yaW5nLT50eFtzZWxmLT50eHNdLmxlbiA9CisgICAgICAgIHRvc2hvYm9lX21ha2V0ZXN0cGFja2V0IChzZWxmLT50eF9idWZzW3NlbGYtPnR4c10sIDAsIGZpcik7CisgICAgICBzZWxmLT50eHMrKzsKKyAgICAgIHNlbGYtPnR4cyAlPSBUWF9TTE9UUzsKKworICAgICAgc2VsZi0+cmluZy0+dHhbc2VsZi0+dHhzXS5jb250cm9sID0KKyAgICAgICAgKGZpcikgPyBPQk9FX0NUTF9UWF9IV19PV05TIHwgT0JPRV9DVExfVFhfUlRDRU5UWAorICAgICAgICAgICAgICA6IE9CT0VfQ1RMX1RYX0hXX09XTlMgOworICAgICAgc2VsZi0+cmluZy0+dHhbc2VsZi0+dHhzXS5sZW4gPQorICAgICAgICB0b3Nob2JvZV9tYWtldGVzdHBhY2tldCAoc2VsZi0+dHhfYnVmc1tzZWxmLT50eHNdLCAwLCBmaXIpOworICAgICAgc2VsZi0+dHhzKys7CisgICAgICBzZWxmLT50eHMgJT0gVFhfU0xPVFM7CisKKyAgICAgIHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10uY29udHJvbCA9CisgICAgICAgIChmaXIpID8gT0JPRV9DVExfVFhfSFdfT1dOUyB8IE9CT0VfQ1RMX1RYX1JUQ0VOVFgKKyAgICAgICAgICAgICAgfCBPQk9FX0NUTF9UWF9TSVAgICAgIHwgT0JPRV9DVExfVFhfQkFEX0NSQworICAgICAgICAgICAgICA6IE9CT0VfQ1RMX1RYX0hXX09XTlMgfCBPQk9FX0NUTF9UWF9SVENFTlRYIDsKKyAgICAgIHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10ubGVuID0KKyAgICAgICAgdG9zaG9ib2VfbWFrZXRlc3RwYWNrZXQgKHNlbGYtPnR4X2J1ZnNbc2VsZi0+dHhzXSwgMCwgZmlyKTsKKyAgICAgIHNlbGYtPnR4cysrOworICAgICAgc2VsZi0+dHhzICU9IFRYX1NMT1RTOworCisgICAgICB0b3Nob2JvZV9kdW1wdHggKHNlbGYpOworICAgICAgLyogVHVybiBvbiBUWCBhbmQgUlggYW5kIGxvb3BiYWNrICovCisgICAgICB0b3Nob2JvZV9zdGFydF9ETUEoc2VsZiwgT0JPRV9DT05GSUcwSF9FTlRYIHwgT0JPRV9DT05GSUcwSF9MT09QKTsKKworICAgICAgaSA9IDA7CisgICAgICBuID0gZmlyID8gMSA6IDQ7CisgICAgICB3aGlsZSAodG9zaG9ib2VfbnVtdmFsaWRyY3ZzIChzZWxmKSAhPSBuKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGkgPiA0ODAwKQorICAgICAgICAgICAgICByZXR1cm4gdG9zaG9ib2VfcHJvYmVmYWlsIChzZWxmLCAiZmlsdGVyIHRlc3QiKTsKKyAgICAgICAgICB1ZGVsYXkgKCg5NjAwKihUVF9MRU4rMTYpKS9zZWxmLT5zcGVlZCk7CisgICAgICAgICAgaSsrOworICAgICAgICB9CisKKyAgICAgIG4gPSBmaXIgPyAyMDMgOiAxMDI7CisgICAgICB3aGlsZSAoKHRvc2hvYm9lX251bXJjdnMoc2VsZikgIT0gc2VsZi0+aW50X3J4KSB8fCAoc2VsZi0+aW50X3R4ICE9IG4pKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGkgPiA0ODAwKQorICAgICAgICAgICAgICByZXR1cm4gdG9zaG9ib2VfcHJvYmVmYWlsIChzZWxmLCAiaW50ZXJydXB0IHRlc3QiKTsKKyAgICAgICAgICB1ZGVsYXkgKCg5NjAwKihUVF9MRU4rMTYpKS9zZWxmLT5zcGVlZCk7CisgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgIHRvc2hvYm9lX2R1bXByeCAoc2VsZixpKTsKKworICAgICB9CisKKyAgLyogdGVzdCAyOiBTSVIgaW4gY2hhciBhdCBhIHRpbWUgKi8KKworICB0b3Nob2JvZV9zdG9wY2hpcCAoc2VsZik7CisgIHNlbGYtPmludF9yeCA9IHNlbGYtPmludF90eCA9IDA7CisKKyAgc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgIHRvc2hvYm9lX3N0YXJ0Y2hpcCAoc2VsZik7CisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgc2VsZi0+YXN5bmMgPSAxOworICBzZWxmLT5zcGVlZCA9IDExNTIwMDsKKyAgdG9zaG9ib2Vfc2V0YmF1ZCAoc2VsZik7CisgIHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10uY29udHJvbCA9CisgICAgT0JPRV9DVExfVFhfUlRDRU5UWCB8IE9CT0VfQ1RMX1RYX0hXX09XTlM7CisgIHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10ubGVuID0gNDsKKworICAoKHVuc2lnbmVkIGNoYXIgKikgc2VsZi0+dHhfYnVmc1tzZWxmLT50eHNdKVswXSA9ICdmJzsKKyAgKCh1bnNpZ25lZCBjaGFyICopIHNlbGYtPnR4X2J1ZnNbc2VsZi0+dHhzXSlbMV0gPSAnaSc7CisgICgodW5zaWduZWQgY2hhciAqKSBzZWxmLT50eF9idWZzW3NlbGYtPnR4c10pWzJdID0gJ3MnOworICAoKHVuc2lnbmVkIGNoYXIgKikgc2VsZi0+dHhfYnVmc1tzZWxmLT50eHNdKVszXSA9ICdoJzsKKyAgdG9zaG9ib2VfZHVtcHR4IChzZWxmKTsKKyAgdG9zaG9ib2Vfc3RhcnRfRE1BKHNlbGYsIE9CT0VfQ09ORklHMEhfRU5UWCB8IE9CT0VfQ09ORklHMEhfTE9PUCk7CisKKyAgaSA9IDA7CisgIHdoaWxlICh0b3Nob2JvZV9udW12YWxpZHJjdnMgKHNlbGYpICE9IDQpCisgICAgeworICAgICAgaWYgKGkgPiAxMDApCisgICAgICAgICAgcmV0dXJuIHRvc2hvYm9lX3Byb2JlZmFpbCAoc2VsZiwgIkFzeW5jIHRlc3QiKTsKKyAgICAgIHVkZWxheSAoMTAwKTsKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgd2hpbGUgKCh0b3Nob2JvZV9udW1yY3ZzIChzZWxmKSAhPSBzZWxmLT5pbnRfcngpIHx8IChzZWxmLT5pbnRfdHggIT0gMSkpCisgICAgeworICAgICAgaWYgKGkgPiAxMDApCisgICAgICAgICAgcmV0dXJuIHRvc2hvYm9lX3Byb2JlZmFpbCAoc2VsZiwgIkFzeW5jIGludGVycnVwdCB0ZXN0Iik7CisgICAgICB1ZGVsYXkgKDEwMCk7CisgICAgICBpKys7CisgICAgfQorICB0b3Nob2JvZV9kdW1wcnggKHNlbGYsaSk7CisKKyAgc2VsZi0+YXN5bmMgPSAwOworICBzZWxmLT5zcGVlZCA9IDk2MDA7CisgIHRvc2hvYm9lX3NldGJhdWQgKHNlbGYpOworICB0b3Nob2JvZV9zdG9wY2hpcCAoc2VsZik7CisKKyAgZnJlZV9pcnEgKHNlbGYtPmlvLmlycSwgKHZvaWQgKikgc2VsZik7CisKKyAgcHJpbnRrIChLRVJOX1dBUk5JTkcgRFJJVkVSX05BTUUgIjogU2VsZiB0ZXN0IHBhc3NlZCBva1xuIik7CisKKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5ldGRldiBzdHlsZSBjb2RlICovCisKKy8qIFRyYW5zbWl0IHNvbWV0aGluZyAqLworc3RhdGljIGludAordG9zaG9ib2VfaGFyZF94bWl0IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICBzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGY7CisgIF9fczMyIHNwZWVkOworICBpbnQgbXR0LCBsZW4sIGN0bDsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgc3RydWN0IGlyZGFfc2tiX2NiICpjYiA9IChzdHJ1Y3QgaXJkYV9za2JfY2IgKikgc2tiLT5jYjsKKworICBzZWxmID0gKHN0cnVjdCB0b3Nob2JvZV9jYiAqKSBkZXYtPnByaXY7CisKKyAgSVJEQV9BU1NFUlQgKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7ICk7CisKKyAgSVJEQV9ERUJVRyAoMSwgIiVzLnR4OiV4KCV4KSV4XG4iLCBfX0ZVTkNUSU9OX18KKyAgICAgICxza2ItPmxlbixzZWxmLT50eHBlbmRpbmcsSU5CIChPQk9FX0VOQUJMRUgpKTsKKyAgaWYgKCFjYi0+bWFnaWMpIHsKKyAgICAgIElSREFfREVCVUcgKDIsICIlcy5Ob3QgSXJMQVA6JXhcbiIsIF9fRlVOQ1RJT05fXywgY2ItPm1hZ2ljKTsKKyNpZmRlZiBEVU1QX1BBQ0tFVFMKKyAgICAgIF9kdW1wYnVmcyhza2ItPmRhdGEsc2tiLT5sZW4sJz4nKTsKKyNlbmRpZgorICAgIH0KKworICAvKiBjaGFuZ2Ugc3BlZWQgcGVuZGluZywgd2FpdCBmb3IgaXRzIGV4ZWN1dGlvbiAqLworICBpZiAoc2VsZi0+bmV3X3NwZWVkKQorICAgICAgcmV0dXJuIC1FQlVTWTsKKworICAvKiBkZXZpY2Ugc3RvcHBlZCAoYXBtKSB3YWl0IGZvciByZXN0YXJ0ICovCisgIGlmIChzZWxmLT5zdG9wcGVkKQorICAgICAgcmV0dXJuIC1FQlVTWTsKKworICB0b3Nob2JvZV9jaGVja3N0dWNrIChzZWxmKTsKKworICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworIC8qIENoZWNrIGlmIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBzcGVlZCAqLworICAvKiBCdXQgbm90IG5vdy4gV2FpdCBhZnRlciB0cmFuc21pc3Npb24gaWYgbXR0IG5vdCByZXF1aXJlZCAqLworICBzcGVlZD1pcmRhX2dldF9uZXh0X3NwZWVkKHNrYik7CisgIGlmICgoc3BlZWQgIT0gc2VsZi0+aW8uc3BlZWQpICYmIChzcGVlZCAhPSAtMSkpCisgICAgeworICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgICAgIGlmIChzZWxmLT50eHBlbmRpbmcgfHwgc2tiLT5sZW4pCisgICAgICAgIHsKKyAgICAgICAgICBzZWxmLT5uZXdfc3BlZWQgPSBzcGVlZDsKKyAgICAgICAgICBJUkRBX0RFQlVHICgxLCAiJXM6IFF1ZXVlZCBUeERvbmUgc2NoZWR1bGVkIHNwZWVkIGNoYW5nZSAlZFxuIiAsCisJCSAgICAgIF9fRlVOQ1RJT05fXywgc3BlZWQpOworICAgICAgICAgIC8qIGlmIG5vIGRhdGEsIHRoYXQncyBhbGwhICovCisgICAgICAgICAgaWYgKCFza2ItPmxlbikKKyAgICAgICAgICAgIHsKKwkgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiIChza2IpOworICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAvKiBUcnVlIHBhY2tldCwgZ28gb24sIGJ1dCAqLworICAgICAgICAgIC8qIGRvIG5vdCBhY2NlcHQgYW55dGhpbmcgYmVmb3JlIGNoYW5nZSBzcGVlZCBleGVjdXRpb24gKi8KKyAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgICAgICAgLyogcmVhZHkgdG8gcHJvY2VzcyBUeERvbmUgaW50ZXJydXB0ICovCisJICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBpZGxlIGFuZCBubyBkYXRhLCBjaGFuZ2Ugc3BlZWQgbm93ICovCisgICAgICAgICAgc2VsZi0+c3BlZWQgPSBzcGVlZDsKKyAgICAgICAgICB0b3Nob2JvZV9zZXRiYXVkIChzZWxmKTsKKwkgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgICAgICAgICAgZGV2X2tmcmVlX3NrYiAoc2tiKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgfQorCisgIGlmICgobXR0ID0gaXJkYV9nZXRfbXR0KHNrYikpKQorICAgIHsKKyAgICAgIC8qIFRoaXMgaXMgZmFpciBzaW5jZSB0aGUgcXVldWUgc2hvdWxkIGJlIGVtcHR5IGFueXdheSAqLworICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgICAgIGlmIChzZWxmLT50eHBlbmRpbmcpCisgICAgICAgIHsKKwkgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgfQorCisgICAgICAvKiBJZiBpbiBTSVIgbW9kZSB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgc3RyaW5nIG9mIFhCT0ZzICovCisgICAgICAvKiBJbiBNSVIgYW5kIEZJUiB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgc3RyaW5nIG9mIGRhdGEgKi8KKyAgICAgIC8qIHdoaWNoIHdlIHdpbGwgYWRkIGEgd3JvbmcgY2hlY2tzdW0gdG8gKi8KKworICAgICAgbXR0ID0gdG9zaG9ib2VfbWFrZW10dHBhY2tldCAoc2VsZiwgc2VsZi0+dHhfYnVmc1tzZWxmLT50eHNdLCBtdHQpOworICAgICAgSVJEQV9ERUJVRyAoMSwgIiVzLm10dDoleCgleCklZFxuIiwgX19GVU5DVElPTl9fCisgICAgICAgICAgLHNrYi0+bGVuLG10dCxzZWxmLT50eHBlbmRpbmcpOworICAgICAgaWYgKG10dCkKKyAgICAgICAgeworICAgICAgICAgIHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10ubGVuID0gbXR0ICYgMHhmZmY7CisKKyAgICAgICAgICBjdGwgPSBPQk9FX0NUTF9UWF9IV19PV05TIHwgT0JPRV9DVExfVFhfUlRDRU5UWDsKKyAgICAgICAgICBpZiAoSU5CIChPQk9FX0VOQUJMRUgpICYgT0JPRV9FTkFCTEVIX0ZJUk9OKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBjdGwgfD0gT0JPRV9DVExfVFhfQkFEX0NSQyB8IE9CT0VfQ1RMX1RYX1NJUCA7CisgICAgICAgICAgICB9CisjaWZkZWYgVVNFX01JUgorICAgICAgICAgIGVsc2UgaWYgKElOQiAoT0JPRV9FTkFCTEVIKSAmIE9CT0VfRU5BQkxFSF9NSVJPTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY3RsIHw9IE9CT0VfQ1RMX1RYX0JBRF9DUkM7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICBzZWxmLT5yaW5nLT50eFtzZWxmLT50eHNdLmNvbnRyb2wgPSBjdGw7CisKKyAgICAgICAgICBPVVRCICgweDAsIE9CT0VfRU5BQkxFSCk7CisgICAgICAgICAgLyogSXQgaXMgb25seSBhIHRpbWVyLiBEbyBub3Qgc2VuZCBtdHQgcGFja2V0IG91dHNpZGUhICovCisgICAgICAgICAgdG9zaG9ib2Vfc3RhcnRfRE1BKHNlbGYsIE9CT0VfQ09ORklHMEhfRU5UWCB8IE9CT0VfQ09ORklHMEhfTE9PUCk7CisKKyAgICAgICAgICBzZWxmLT50eHBlbmRpbmcrKzsKKworICAgICAgICAgIHNlbGYtPnR4cysrOworICAgICAgICAgIHNlbGYtPnR4cyAlPSBUWF9TTE9UUzsKKworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGsoS0VSTl9FUlIgRFJJVkVSX05BTUUgIjogcHJvYmxlbSB3aXRoIG10dCBwYWNrZXQgLSBpZ25vcmVkXG4iKTsKKyAgICAgICAgfQorICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgICB9CisKKyNpZmRlZiBEVU1QX1BBQ0tFVFMKK2R1bXBidWZzKHNrYi0+ZGF0YSxza2ItPmxlbiwnPicpOworI2VuZGlmCisKKyAgc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgaWYgKHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10uY29udHJvbCAmIE9CT0VfQ1RMX1RYX0hXX09XTlMpCisgICAgeworICAgICAgSVJEQV9ERUJVRyAoMCwgIiVzLmZ1bDoleCgleCkleFxuIiwgX19GVU5DVElPTl9fCisgICAgICAgICAgLHNrYi0+bGVuLCBzZWxmLT5yaW5nLT50eFtzZWxmLT50eHNdLmNvbnRyb2wsIHNlbGYtPnR4cGVuZGluZyk7CisgICAgICB0b3Nob2JvZV9zdGFydF9ETUEoc2VsZiwgT0JPRV9DT05GSUcwSF9FTlRYKTsKKyAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgICAgICByZXR1cm4gLUVCVVNZOworICAgIH0KKworICBpZiAoSU5CIChPQk9FX0VOQUJMRUgpICYgT0JPRV9FTkFCTEVIX1NJUk9OKQorICAgIHsKKyAgICAgIGxlbiA9IGFzeW5jX3dyYXBfc2tiIChza2IsIHNlbGYtPnR4X2J1ZnNbc2VsZi0+dHhzXSwgVFhfQlVGX1NaKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsZW4gPSBza2ItPmxlbjsKKyAgICAgIG1lbWNweSAoc2VsZi0+dHhfYnVmc1tzZWxmLT50eHNdLCBza2ItPmRhdGEsIGxlbik7CisgICAgfQorICBzZWxmLT5yaW5nLT50eFtzZWxmLT50eHNdLmxlbiA9IGxlbiAmIDB4MGZmZjsKKworICAvKlNvbWV0aW1lcyB0aGUgSFcgZG9lc24ndCBzZWUgdXMgYXNzZXJ0IFJUQ0VOVFggaW4gdGhlIGludGVycnVwdCBjb2RlICovCisgIC8qbGF0ZXIgdGhpcyBwbGF5cyBzYWZlLCB3ZSBnYXJ1bnRlZSB0aGUgbGFzdCBwYWNrZXQgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KKyAgLypoYXMgUlRDRU5UWCBzZXQgKi8KKworICBjdGwgPSBPQk9FX0NUTF9UWF9IV19PV05TIHwgT0JPRV9DVExfVFhfUlRDRU5UWDsKKyAgaWYgKElOQiAoT0JPRV9FTkFCTEVIKSAmIE9CT0VfRU5BQkxFSF9GSVJPTikKKyAgICB7CisgICAgICBjdGwgfD0gT0JPRV9DVExfVFhfU0lQIDsKKyAgICB9CisgIHNlbGYtPnJpbmctPnR4W3NlbGYtPnR4c10uY29udHJvbCA9IGN0bDsKKworICAvKiBJZiB0cmFuc21pdHRlciBpcyBpZGxlIHN0YXJ0IGluIG9uZS1zaG90IG1vZGUgKi8KKworICBpZiAoIXNlbGYtPnR4cGVuZGluZykKKyAgICAgIHRvc2hvYm9lX3N0YXJ0X0RNQShzZWxmLCBPQk9FX0NPTkZJRzBIX0VOVFgpOworCisgIHNlbGYtPnR4cGVuZGluZysrOworCisgIHNlbGYtPnR4cysrOworICBzZWxmLT50eHMgJT0gVFhfU0xPVFM7CisKKyAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgZGV2X2tmcmVlX3NrYiAoc2tiKTsKKworICByZXR1cm4gMDsKK30KKworLyppbnRlcnJ1cHQgaGFuZGxlciAqLworc3RhdGljIGlycXJldHVybl90Cit0b3Nob2JvZV9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgIHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZiA9IChzdHJ1Y3QgdG9zaG9ib2VfY2IgKikgZGV2X2lkOworICBfX3U4IGlycXN0YXQ7CisgIHN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCisgIGlmIChzZWxmID09IE5VTEwgJiYgdG9zaG9ib2VfaW52YWxpZF9kZXYoaXJxKSkKKyAgICByZXR1cm4gSVJRX05PTkU7CisKKyAgaXJxc3RhdCA9IElOQiAoT0JPRV9JU1IpOworCisvKiB3YXMgaXQgdXMgKi8KKyAgaWYgKCEoaXJxc3RhdCAmIE9CT0VfSU5UX01BU0spKQorICAgICAgcmV0dXJuIElSUV9OT05FOworCisvKiBBY2sgYWxsIHRoZSBpbnRlcnJ1cHRzICovCisgIE9VVEIgKGlycXN0YXQsIE9CT0VfSVNSKTsKKworICB0b3Nob2JvZV9pc250c3R1Y2sgKHNlbGYpOworCisvKiBUeGRvbmUgKi8KKyAgaWYgKGlycXN0YXQgJiBPQk9FX0lOVF9UWERPTkUpCisgICAgeworICAgICAgaW50IHR4cCwgdHhwYzsKKyAgICAgIGludCBpOworCisgICAgICB0eHAgPSBzZWxmLT50eHBlbmRpbmc7CisgICAgICBzZWxmLT50eHBlbmRpbmcgPSAwOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgVFhfU0xPVFM7ICsraSkKKyAgICAgICAgeworICAgICAgICAgIGlmIChzZWxmLT5yaW5nLT50eFtpXS5jb250cm9sICYgT0JPRV9DVExfVFhfSFdfT1dOUykKKyAgICAgICAgICAgICAgc2VsZi0+dHhwZW5kaW5nKys7CisgICAgICAgIH0KKyAgICAgIElSREFfREVCVUcgKDEsICIlcy50eGQoJXgpJXgvJXhcbiIsIF9fRlVOQ1RJT05fXworICAgICAgICAgICxpcnFzdGF0LHR4cCxzZWxmLT50eHBlbmRpbmcpOworCisgICAgICB0eHAgPSBJTkIgKE9CT0VfVFhTTE9UKSAmIE9CT0VfU0xPVF9NQVNLOworCisgICAgICAvKiBHb3QgYW55dGhpbmcgcXVldWVkID8gc3RhcnQgaXQgdG9nZXRoZXIgKi8KKyAgICAgIGlmIChzZWxmLT5yaW5nLT50eFt0eHBdLmNvbnRyb2wgJiBPQk9FX0NUTF9UWF9IV19PV05TKQorICAgICAgICB7CisgICAgICAgICAgdHhwYyA9IHR4cDsKKyNpZmRlZiBPUFRJTUlaRV9UWAorICAgICAgICAgIHdoaWxlIChzZWxmLT5yaW5nLT50eFt0eHBjXS5jb250cm9sICYgT0JPRV9DVExfVFhfSFdfT1dOUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgdHhwID0gdHhwYzsKKyAgICAgICAgICAgICAgdHhwYysrOworICAgICAgICAgICAgICB0eHBjICU9IFRYX1NMT1RTOworICAgICAgICAgICAgICBzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CisgICAgICAgICAgICAgIGlmIChzZWxmLT5yaW5nLT50eFt0eHBjXS5jb250cm9sICYgT0JPRV9DVExfVFhfSFdfT1dOUykKKyAgICAgICAgICAgICAgICAgIHNlbGYtPnJpbmctPnR4W3R4cF0uY29udHJvbCAmPSB+T0JPRV9DVExfVFhfUlRDRU5UWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBzZWxmLT5zdGF0cy50eF9wYWNrZXRzLS07CisjZWxzZQorICAgICAgICAgIHNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKyNlbmRpZgorICAgICAgICAgIHRvc2hvYm9lX3N0YXJ0X0RNQShzZWxmLCBPQk9FX0NPTkZJRzBIX0VOVFgpOworICAgICAgICB9CisKKyAgICAgIGlmICgoIXNlbGYtPnR4cGVuZGluZykgJiYgKHNlbGYtPm5ld19zcGVlZCkpCisgICAgICAgIHsKKyAgICAgICAgICBzZWxmLT5zcGVlZCA9IHNlbGYtPm5ld19zcGVlZDsKKyAgICAgICAgICBJUkRBX0RFQlVHICgxLCAiJXM6IEV4ZWN1dGVkIFR4RG9uZSBzY2hlZHVsZWQgc3BlZWQgY2hhbmdlICVkXG4iLAorCQkgICAgICBfX0ZVTkNUSU9OX18sIHNlbGYtPnNwZWVkKTsKKyAgICAgICAgICB0b3Nob2JvZV9zZXRiYXVkIChzZWxmKTsKKyAgICAgICAgfQorCisgICAgICAvKiBUZWxsIG5ldHdvcmsgbGF5ZXIgdGhhdCB3ZSB3YW50IG1vcmUgZnJhbWVzICovCisgICAgICBpZiAoIXNlbGYtPm5ld19zcGVlZCkKKyAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CisgICAgfQorCisgIGlmIChpcnFzdGF0ICYgT0JPRV9JTlRfUlhET05FKQorICAgIHsKKyAgICAgIHdoaWxlICghKHNlbGYtPnJpbmctPnJ4W3NlbGYtPnJ4c10uY29udHJvbCAmIE9CT0VfQ1RMX1JYX0hXX09XTlMpKQorICAgICAgICB7CisgICAgICAgICAgaW50IGxlbiA9IHNlbGYtPnJpbmctPnJ4W3NlbGYtPnJ4c10ubGVuOworICAgICAgICAgIHNrYiA9IE5VTEw7CisgICAgICAgICAgSVJEQV9ERUJVRyAoMywgIiVzLnJjdjoleCgleClcbiIsIF9fRlVOQ1RJT05fXworCQkgICAgICAsbGVuLHNlbGYtPnJpbmctPnJ4W3NlbGYtPnJ4c10uY29udHJvbCk7CisKKyNpZmRlZiBEVU1QX1BBQ0tFVFMKK2R1bXBidWZzKHNlbGYtPnJ4X2J1ZnNbc2VsZi0+cnhzXSxsZW4sJzwnKTsKKyNlbmRpZgorCisgICAgICAgICAgaWYgKHNlbGYtPnJpbmctPnJ4W3NlbGYtPnJ4c10uY29udHJvbCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfX3U4IGVuYWJsZSA9IElOQiAoT0JPRV9FTkFCTEVIKTsKKworICAgICAgICAgICAgICAvKiBJbiBTSVIgbW9kZSB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBDUkMgYXMgdGhpcyAqLworICAgICAgICAgICAgICAvKiBoYXNuJ3QgYmVlbiBkb25lIGJ5IHRoZSBoYXJkd2FyZSAqLworICAgICAgICAgICAgICBpZiAoZW5hYmxlICYgT0JPRV9FTkFCTEVIX1NJUk9OKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmICghdG9zaG9ib2VfY2hlY2tmY3MgKHNlbGYtPnJ4X2J1ZnNbc2VsZi0+cnhzXSwgbGVuKSkKKyAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgLypUcmltIG9mZiB0aGUgQ1JDICovCisgICAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gMjsKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgSVJEQV9ERUJVRyAoMSwgIiVzLlNJUjoleCgleClcbiIsIF9fRlVOQ1RJT05fXywgbGVuLGVuYWJsZSk7CisgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgVVNFX01JUgorICAgICAgICAgICAgICBlbHNlIGlmIChlbmFibGUgJiBPQk9FX0VOQUJMRUhfTUlST04pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IDI7CisgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgbGVuID0gMDsKKyAgICAgICAgICAgICAgICAgIElSREFfREVCVUcgKDIsICIlcy5NSVI6JXgoJXgpXG4iLCBfX0ZVTkNUSU9OX18sIGxlbixlbmFibGUpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICBlbHNlIGlmIChlbmFibGUgJiBPQk9FX0VOQUJMRUhfRklST04pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDMpCisgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IDQ7ICAgLypGSVhNRTogY2hlY2sgdGhpcyAqLworICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICBJUkRBX0RFQlVHICgxLCAiJXMuRklSOiV4KCV4KVxuIiwgX19GVU5DVElPTl9fLCBsZW4sZW5hYmxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIElSREFfREVCVUcgKDAsICIlcy4/SVI6JXgoJXgpXG4iLCBfX0ZVTkNUSU9OX18sIGxlbixlbmFibGUpOworCisgICAgICAgICAgICAgIGlmIChsZW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgc2tiID0gZGV2X2FsbG9jX3NrYiAobGVuICsgMSk7CisgICAgICAgICAgICAgICAgICBpZiAoc2tiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgc2tiX3Jlc2VydmUgKHNrYiwgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICBza2JfcHV0IChza2IsIGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5IChza2ItPmRhdGEsIHNlbGYtPnJ4X2J1ZnNbc2VsZi0+cnhzXSwgbGVuKTsKKworICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKyAgICAgICAgICAgICAgICAgICAgICBza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKKyAgICAgICAgICAgICAgICAgICAgICBza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisgICAgICAgICAgICAgICAgICAgICAgc2tiLT5wcm90b2NvbCA9IGh0b25zIChFVEhfUF9JUkRBKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrIChLRVJOX0lORk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpLCBtZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgZnJhbWUuXG4iLAorCQkJICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvKiBUT0RPOiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisgICAgICAgICAgICAvKiAgaWYgT0JPRV9DVExfUlhfTEVOR1RILCBvdXIgYnVmZmVycyBhcmUgdG9vIHNtYWxsICovCisgICAgICAgICAgICAvKiAoTUlSIG9yIEZJUikgZGF0YSBpcyBsb3N0LiAqLworICAgICAgICAgICAgLyogKFNJUikgZGF0YSBpcyBzcGxpdHRlZCBpbiBzZXZlcmFsIHNsb3RzLiAqLworICAgICAgICAgICAgLyogd2UgaGF2ZSB0byBqb2luIGFsbCB0aGUgcmVjZWl2ZWQgYnVmZmVycyByZWNlaXZlZCAqLworICAgICAgICAgICAgLyppbiBhIGxhcmdlIGJ1ZmZlciBiZWZvcmUgY2hlY2tpbmcgQ1JDLiAqLworICAgICAgICAgICAgSVJEQV9ERUJVRyAoMCwgIiVzLmVycjoleCgleClcbiIsIF9fRlVOQ1RJT05fXworICAgICAgICAgICAgICAgICxsZW4sc2VsZi0+cmluZy0+cnhbc2VsZi0+cnhzXS5jb250cm9sKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgIHNlbGYtPnJpbmctPnJ4W3NlbGYtPnJ4c10ubGVuID0gMHgwOworICAgICAgICAgIHNlbGYtPnJpbmctPnJ4W3NlbGYtPnJ4c10uY29udHJvbCA9IE9CT0VfQ1RMX1JYX0hXX09XTlM7CisKKyAgICAgICAgICBzZWxmLT5yeHMrKzsKKyAgICAgICAgICBzZWxmLT5yeHMgJT0gUlhfU0xPVFM7CisKKyAgICAgICAgICBpZiAoc2tiKQorICAgICAgICAgICAgICBuZXRpZl9yeCAoc2tiKTsKKworICAgICAgICB9CisgICAgfQorCisgIGlmIChpcnFzdGF0ICYgT0JPRV9JTlRfVFhVTkRFUikKKyAgICB7CisgICAgICBwcmludGsgKEtFUk5fV0FSTklORyBEUklWRVJfTkFNRSAiOiB0eCBmaWZvIHVuZGVyZmxvd1xuIik7CisgICAgfQorICBpZiAoaXJxc3RhdCAmIE9CT0VfSU5UX1JYT1ZFUikKKyAgICB7CisgICAgICBwcmludGsgKEtFUk5fV0FSTklORyBEUklWRVJfTkFNRSAiOiByeCBmaWZvIG92ZXJmbG93XG4iKTsKKyAgICB9CisvKiBUaGlzIG11c3QgYmUgdXNlZnVsIGZvciBzb21ldGhpbmcuLi4gKi8KKyAgaWYgKGlycXN0YXQgJiBPQk9FX0lOVF9TSVApCisgICAgeworICAgICAgc2VsZi0+aW50X3NpcCsrOworICAgICAgSVJEQV9ERUJVRyAoMSwgIiVzLnNpcDoleCgleCkleFxuIiwgX19GVU5DVElPTl9fCisJICAgICAgLHNlbGYtPmludF9zaXAsaXJxc3RhdCxzZWxmLT50eHBlbmRpbmcpOworICAgIH0KKyAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKK3N0YXRpYyBpbnQKK3Rvc2hvYm9lX25ldF9vcGVuIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICBzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGY7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgSVJEQV9ERUJVRyAoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgSVJEQV9BU1NFUlQgKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7ICk7CisgIHNlbGYgPSAoc3RydWN0IHRvc2hvYm9lX2NiICopIGRldi0+cHJpdjsKKworICBJUkRBX0FTU0VSVCAoc2VsZiAhPSBOVUxMLCByZXR1cm4gMDsgKTsKKworICBpZiAoc2VsZi0+YXN5bmMpCisgICAgcmV0dXJuIC1FQlVTWTsKKworICBpZiAoc2VsZi0+c3RvcHBlZCkKKyAgICByZXR1cm4gMDsKKworICBpZiAocmVxdWVzdF9pcnEgKHNlbGYtPmlvLmlycSwgdG9zaG9ib2VfaW50ZXJydXB0LAorICAgICAgICAgICAgICAgICAgIFNBX1NISVJRIHwgU0FfSU5URVJSVVBULCBkZXYtPm5hbWUsICh2b2lkICopIHNlbGYpKQorICAgIHsKKyAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKworICBzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgdG9zaG9ib2Vfc3RhcnRjaGlwIChzZWxmKTsKKyAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKworICAvKiBSZWFkeSB0byBwbGF5ISAqLworICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisgIC8qCisgICAqIE9wZW4gbmV3IElyTEFQIGxheWVyIGluc3RhbmNlLCBub3cgdGhhdCBldmVyeXRoaW5nIHNob3VsZCBiZQorICAgKiBpbml0aWFsaXplZCBwcm9wZXJseQorICAgKi8KKyAgc2VsZi0+aXJsYXAgPSBpcmxhcF9vcGVuIChkZXYsICZzZWxmLT5xb3MsIGRyaXZlcl9uYW1lKTsKKworICBzZWxmLT5pcmRhZCA9IDE7CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Rvc2hvYm9lX25ldF9jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmOworCisgIElSREFfREVCVUcgKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisgIElSREFfQVNTRVJUIChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyApOworICBzZWxmID0gKHN0cnVjdCB0b3Nob2JvZV9jYiAqKSBkZXYtPnByaXY7CisKKyAgLyogU3RvcCBkZXZpY2UgKi8KKyAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgIC8qIFN0b3AgYW5kIHJlbW92ZSBpbnN0YW5jZSBvZiBJckxBUCAqLworICBpZiAoc2VsZi0+aXJsYXApCisgICAgaXJsYXBfY2xvc2UgKHNlbGYtPmlybGFwKTsKKyAgc2VsZi0+aXJsYXAgPSBOVUxMOworCisgIHNlbGYtPmlyZGFkID0gMDsKKworICBmcmVlX2lycSAoc2VsZi0+aW8uaXJxLCAodm9pZCAqKSBzZWxmKTsKKworICBpZiAoIXNlbGYtPnN0b3BwZWQpCisgICAgeworICAgICAgdG9zaG9ib2Vfc3RvcGNoaXAgKHNlbGYpOworICAgIH0KKworICByZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHRvc2hvYm9lX25ldF9pb2N0bCAoZGV2LCBycSwgY21kKQorICoKKyAqICAgIFByb2Nlc3MgSU9DVEwgY29tbWFuZHMgZm9yIHRoaXMgZGV2aWNlCisgKgorICovCitzdGF0aWMgaW50Cit0b3Nob2JvZV9uZXRfaW9jdGwgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisgIHN0cnVjdCBpZl9pcmRhX3JlcSAqaXJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKSBycTsKKyAgc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmOworICB1bnNpZ25lZCBsb25nIGZsYWdzOworICBpbnQgcmV0ID0gMDsKKworICBJUkRBX0FTU0VSVCAoZGV2ICE9IE5VTEwsIHJldHVybiAtMTsgKTsKKworICBzZWxmID0gZGV2LT5wcml2OworCisgIElSREFfQVNTRVJUIChzZWxmICE9IE5VTEwsIHJldHVybiAtMTsgKTsKKworICBJUkRBX0RFQlVHICg1LCAiJXMoKSwgJXMsIChjbWQ9MHglWClcbiIsIF9fRlVOQ1RJT05fXywgZGV2LT5uYW1lLCBjbWQpOworCisgIC8qIERpc2FibGUgaW50ZXJydXB0cyAmIHNhdmUgZmxhZ3MgKi8KKyAgc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgc3dpdGNoIChjbWQpCisgICAgeworICAgIGNhc2UgU0lPQ1NCQU5EV0lEVEg6ICAgICAgIC8qIFNldCBiYW5kd2lkdGggKi8KKyAgICAgIC8qIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGJlIHVzZWQgYnkgSXJMQVAgdG8gY2hhbmdlIHRoZQorICAgICAgICogc3BlZWQsIHNvIHdlIHN0aWxsIG11c3QgYWxsb3cgZm9yIHNwZWVkIGNoYW5nZSB3aXRoaW4KKyAgICAgICAqIGludGVycnVwdCBjb250ZXh0LgorICAgICAgICovCisgICAgICBJUkRBX0RFQlVHICgxLCAiJXMoQkFORFdJRFRIKSwgJXMsICglWC8lbGRcbiIsIF9fRlVOQ1RJT05fXworICAgICAgICAgICxkZXYtPm5hbWUsIElOQiAoT0JPRV9TVEFUVVMpLCBpcnEtPmlmcl9iYXVkcmF0ZSApOworICAgICAgaWYgKCFpbl9pbnRlcnJ1cHQgKCkgJiYgIWNhcGFibGUgKENBUF9ORVRfQURNSU4pKQorICAgICAgICByZXR1cm4gLUVQRVJNOworCisgICAgICAvKiBzZWxmLT5zcGVlZD1pcnEtPmlmcl9iYXVkcmF0ZTsgKi8KKyAgICAgIC8qIHRvc2hvYm9lX3NldGJhdWQoc2VsZik7ICovCisgICAgICAvKiBKdXN0IGNoYW5nZSBzcGVlZCBvbmNlIC0gaW5zZXJ0ZWQgYnkgUGF1bCBCcmlzdG93ICovCisgICAgICBzZWxmLT5uZXdfc3BlZWQgPSBpcnEtPmlmcl9iYXVkcmF0ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0lPQ1NNRURJQUJVU1k6ICAgICAgIC8qIFNldCBtZWRpYSBidXN5ICovCisgICAgICBJUkRBX0RFQlVHICgxLCAiJXMoTUVESUFCVVNZKSwgJXMsICglWC8leClcbiIsIF9fRlVOQ1RJT05fXworICAgICAgICAgICxkZXYtPm5hbWUsIElOQiAoT0JPRV9TVEFUVVMpLCBjYXBhYmxlIChDQVBfTkVUX0FETUlOKSApOworICAgICAgaWYgKCFjYXBhYmxlIChDQVBfTkVUX0FETUlOKSkKKyAgICAgICAgcmV0dXJuIC1FUEVSTTsKKyAgICAgIGlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5IChzZWxmLT5uZXRkZXYsIFRSVUUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTSU9DR1JFQ0VJVklORzogICAgICAgLyogQ2hlY2sgaWYgd2UgYXJlIHJlY2VpdmluZyByaWdodCBub3cgKi8KKyAgICAgIGlycS0+aWZyX3JlY2VpdmluZyA9IChJTkIgKE9CT0VfU1RBVFVTKSAmIE9CT0VfU1RBVFVTX1JYQlVTWSkgPyAxIDogMDsKKyAgICAgIElSREFfREVCVUcgKDMsICIlcyhSRUNFSVZJTkcpLCAlcywgKCVYLyV4KVxuIiwgX19GVU5DVElPTl9fCisgICAgICAgICAgLGRldi0+bmFtZSwgSU5CIChPQk9FX1NUQVRVUyksIGlycS0+aWZyX3JlY2VpdmluZyApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIElSREFfREVCVUcgKDEsICIlcyg/KSwgJXMsIChjbWQ9MHglWClcbiIsIF9fRlVOQ1RJT05fXywgZGV2LT5uYW1lLCBjbWQpOworICAgICAgcmV0ID0gLUVPUE5PVFNVUFA7CisgICAgfQorCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgIHJldHVybiByZXQ7CisKK30KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJUb3NoaWJhIE9CT0UgSXJEQSBEZXZpY2UgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJKYW1lcyBNY0tlbnppZSA8amFtZXNAZmlzaHNvdXAuZGhzLm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtIChtYXhfYmF1ZCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2JhdWQsICJNYXhpbXVtIGJhdWQgcmF0ZSIpOworCisjaWZkZWYgVVNFX1BST0JFCittb2R1bGVfcGFyYW0gKGRvX3Byb2JlLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZG9fcHJvYmUsICJFbmFibGUvZGlzYWJsZSBjaGlwIHByb2JpbmcgYW5kIHNlbGYtdGVzdCIpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkCit0b3Nob2JvZV9jbG9zZSAoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisgIGludCBpOworICBzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYgPSAoc3RydWN0IHRvc2hvYm9lX2NiKilwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisKKyAgSVJEQV9ERUJVRyAoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgSVJEQV9BU1NFUlQgKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyApOworCisgIGlmICghc2VsZi0+c3RvcHBlZCkKKyAgICB7CisgICAgICB0b3Nob2JvZV9zdG9wY2hpcCAoc2VsZik7CisgICAgfQorCisgIHJlbGVhc2VfcmVnaW9uIChzZWxmLT5pby5maXJfYmFzZSwgc2VsZi0+aW8uZmlyX2V4dCk7CisKKyAgZm9yIChpID0gMDsgaSA8IFRYX1NMT1RTOyArK2kpCisgICAgeworICAgICAga2ZyZWUgKHNlbGYtPnR4X2J1ZnNbaV0pOworICAgICAgc2VsZi0+dHhfYnVmc1tpXSA9IE5VTEw7CisgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBSWF9TTE9UUzsgKytpKQorICAgIHsKKyAgICAgIGtmcmVlIChzZWxmLT5yeF9idWZzW2ldKTsKKyAgICAgIHNlbGYtPnJ4X2J1ZnNbaV0gPSBOVUxMOworICAgIH0KKworICB1bnJlZ2lzdGVyX25ldGRldihzZWxmLT5uZXRkZXYpOworCisgIGtmcmVlIChzZWxmLT5yaW5nYnVmKTsKKyAgc2VsZi0+cmluZ2J1ZiA9IE5VTEw7CisgIHNlbGYtPnJpbmcgPSBOVUxMOworCisgIGZyZWVfbmV0ZGV2KHNlbGYtPm5ldGRldik7Cit9CisKK3N0YXRpYyBpbnQKK3Rvc2hvYm9lX29wZW4gKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGRpZCkKK3sKKyAgc3RydWN0IHRvc2hvYm9lX2NiICpzZWxmOworICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICBpbnQgaSA9IDA7CisgIGludCBvayA9IDA7CisgIGludCBlcnI7CisKKyAgSVJEQV9ERUJVRyAoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgaWYgKChlcnI9cGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpKQorICAgIHJldHVybiBlcnI7CisKKyAgZGV2ID0gYWxsb2NfaXJkYWRldihzaXplb2YgKHN0cnVjdCB0b3Nob2JvZV9jYikpOworICBpZiAoZGV2ID09IE5VTEwpCisgICAgeworICAgICAgcHJpbnRrIChLRVJOX0VSUiBEUklWRVJfTkFNRSAiOiBjYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKKyAgICAgICAgICAgICAgIklyREEgY29udHJvbCBibG9ja1xuIik7CisgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CisKKyAgc2VsZiA9IGRldi0+cHJpdjsKKyAgc2VsZi0+bmV0ZGV2ID0gZGV2OworICBzZWxmLT5wZGV2ID0gcGNpX2RldjsKKyAgc2VsZi0+YmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LDApOworCisgIHNlbGYtPmlvLmZpcl9iYXNlID0gc2VsZi0+YmFzZTsKKyAgc2VsZi0+aW8uZmlyX2V4dCA9IE9CT0VfSU9fRVhURU5UOworICBzZWxmLT5pby5pcnEgPSBwY2lfZGV2LT5pcnE7CisgIHNlbGYtPmlvLmlycWZsYWdzID0gU0FfU0hJUlEgfCBTQV9JTlRFUlJVUFQ7CisKKyAgc2VsZi0+c3BlZWQgPSBzZWxmLT5pby5zcGVlZCA9IDk2MDA7CisgIHNlbGYtPmFzeW5jID0gMDsKKworICAvKiBMb2NrIHRoZSBwb3J0IHRoYXQgd2UgbmVlZCAqLworICBpZiAoTlVMTD09cmVxdWVzdF9yZWdpb24gKHNlbGYtPmlvLmZpcl9iYXNlLCBzZWxmLT5pby5maXJfZXh0LCBkcml2ZXJfbmFtZSkpCisgICAgeworICAgICAgcHJpbnRrIChLRVJOX0VSUiBEUklWRVJfTkFNRSAiOiBjYW4ndCBnZXQgaW9iYXNlIG9mIDB4JTAzeFxuIgorCSAgICAgICxzZWxmLT5pby5maXJfYmFzZSk7CisgICAgICBlcnIgPSAtRUJVU1k7CisgICAgICBnb3RvIGZyZWVzZWxmOworICAgIH0KKworICBzcGluX2xvY2tfaW5pdCgmc2VsZi0+c3BpbmxvY2spOworCisgIGlyZGFfaW5pdF9tYXhfcW9zX2NhcGFiaWxpZXMgKCZzZWxmLT5xb3MpOworICBzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMgPSAwOworCisgIGlmIChtYXhfYmF1ZCA+PSAyNDAwKQorICAgIHNlbGYtPnFvcy5iYXVkX3JhdGUuYml0cyB8PSBJUl8yNDAwOworICAvKmlmIChtYXhfYmF1ZD49NDgwMCkgaWRldi0+cW9zLmJhdWRfcmF0ZS5iaXRzfD1JUl80ODAwOyAqLworICBpZiAobWF4X2JhdWQgPj0gOTYwMCkKKyAgICBzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMgfD0gSVJfOTYwMDsKKyAgaWYgKG1heF9iYXVkID49IDE5MjAwKQorICAgIHNlbGYtPnFvcy5iYXVkX3JhdGUuYml0cyB8PSBJUl8xOTIwMDsKKyAgaWYgKG1heF9iYXVkID49IDExNTIwMCkKKyAgICBzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMgfD0gSVJfMTE1MjAwOworI2lmZGVmIFVTRV9NSVIKKyAgaWYgKG1heF9iYXVkID49IDExNTIwMDApCisgICAgeworICAgICAgc2VsZi0+cW9zLmJhdWRfcmF0ZS5iaXRzIHw9IElSXzExNTIwMDA7CisgICAgfQorI2VuZGlmCisgIGlmIChtYXhfYmF1ZCA+PSA0MDAwMDAwKQorICAgIHsKKyAgICAgIHNlbGYtPnFvcy5iYXVkX3JhdGUuYml0cyB8PSAoSVJfNDAwMDAwMCA8PCA4KTsKKyAgICB9CisKKyAgLypGSVhNRTogd29yayB0aGlzIG91dC4uLiAqLworICBzZWxmLT5xb3MubWluX3R1cm5fdGltZS5iaXRzID0gMHhmZjsKKworICBpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlICgmc2VsZi0+cW9zKTsKKworICAvKiBBbGxvY2F0ZSB0d2ljZSB0aGUgc2l6ZSB0byBndWFyYW50ZWUgYWxpZ25tZW50ICovCisgIHNlbGYtPnJpbmdidWYgPSAodm9pZCAqKSBrbWFsbG9jIChPQk9FX1JJTkdfTEVOIDw8IDEsIEdGUF9LRVJORUwpOworICBpZiAoIXNlbGYtPnJpbmdidWYpCisgICAgeworICAgICAgcHJpbnRrIChLRVJOX0VSUiBEUklWRVJfTkFNRSAiOiBjYW4ndCBhbGxvY2F0ZSBETUEgYnVmZmVyc1xuIik7CisgICAgICBlcnIgPSAtRU5PTUVNOworICAgICAgZ290byBmcmVlcmVnaW9uOworICAgIH0KKworI2lmIChCSVRTX1BFUl9MT05HID09IDY0KQorI2Vycm9yIGJyb2tlbiBvbiA2NC1iaXQ6ICBjYXN0cyBwb2ludGVyIHRvIDMyLWJpdCwgYW5kIHRoZW4gYmFjayB0byBwb2ludGVyLgorI2VuZGlmCisKKyAgLypXZSBuZWVkIHRvIGFsaWduIHRoZSB0YXNrZmlsZSBvbiBhIHRhc2tmaWxlIHNpemUgYm91bmRhcnkgKi8KKyAgeworICAgIHVuc2lnbmVkIGxvbmcgYWRkcjsKKworICAgIGFkZHIgPSAoX191MzIpIHNlbGYtPnJpbmdidWY7CisgICAgYWRkciAmPSB+KE9CT0VfUklOR19MRU4gLSAxKTsKKyAgICBhZGRyICs9IE9CT0VfUklOR19MRU47CisgICAgc2VsZi0+cmluZyA9IChzdHJ1Y3QgT2JvZVJpbmcgKikgYWRkcjsKKyAgfQorCisgIG1lbXNldCAoc2VsZi0+cmluZywgMCwgT0JPRV9SSU5HX0xFTik7CisgIHNlbGYtPmlvLm1lbV9iYXNlID0gKF9fdTMyKSBzZWxmLT5yaW5nOworCisgIG9rID0gMTsKKyAgZm9yIChpID0gMDsgaSA8IFRYX1NMT1RTOyArK2kpCisgICAgeworICAgICAgc2VsZi0+dHhfYnVmc1tpXSA9IGttYWxsb2MgKFRYX0JVRl9TWiwgR0ZQX0tFUk5FTCk7CisgICAgICBpZiAoIXNlbGYtPnR4X2J1ZnNbaV0pCisgICAgICAgIG9rID0gMDsKKyAgICB9CisKKyAgZm9yIChpID0gMDsgaSA8IFJYX1NMT1RTOyArK2kpCisgICAgeworICAgICAgc2VsZi0+cnhfYnVmc1tpXSA9IGttYWxsb2MgKFJYX0JVRl9TWiwgR0ZQX0tFUk5FTCk7CisgICAgICBpZiAoIXNlbGYtPnJ4X2J1ZnNbaV0pCisgICAgICAgIG9rID0gMDsKKyAgICB9CisKKyAgaWYgKCFvaykKKyAgICB7CisgICAgICBwcmludGsgKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6IGNhbid0IGFsbG9jYXRlIHJ4L3R4IGJ1ZmZlcnNcbiIpOworICAgICAgZXJyID0gLUVOT01FTTsKKyAgICAgIGdvdG8gZnJlZWJ1ZnM7CisgICAgfQorCisKKyNpZmRlZiBVU0VfUFJPQkUKKyAgaWYgKGRvX3Byb2JlKQorICAgIGlmICghdG9zaG9ib2VfcHJvYmUgKHNlbGYpKQorICAgICAgeworICAgICAgICBlcnIgPSAtRU5PREVWOworICAgICAgICBnb3RvIGZyZWVidWZzOworICAgICAgfQorI2VuZGlmCisKKyAgU0VUX01PRFVMRV9PV05FUihkZXYpOworICBTRVRfTkVUREVWX0RFVihkZXYsICZwY2lfZGV2LT5kZXYpOworICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHRvc2hvYm9lX2hhcmRfeG1pdDsKKyAgZGV2LT5vcGVuID0gdG9zaG9ib2VfbmV0X29wZW47CisgIGRldi0+c3RvcCA9IHRvc2hvYm9lX25ldF9jbG9zZTsKKyAgZGV2LT5kb19pb2N0bCA9IHRvc2hvYm9lX25ldF9pb2N0bDsKKworICBlcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKyAgaWYgKGVycikKKyAgICB7CisgICAgICBwcmludGsgKEtFUk5fRVJSIERSSVZFUl9OQU1FICI6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7CisgICAgICBlcnIgPSAtRU5PTUVNOworICAgICAgZ290byBmcmVlYnVmczsKKyAgICB9CisgIHByaW50ayAoS0VSTl9JTkZPICJJckRBOiBSZWdpc3RlcmVkIGRldmljZSAlc1xuIiwgZGV2LT5uYW1lKTsKKworICBwY2lfc2V0X2RydmRhdGEocGNpX2RldixzZWxmKTsKKworICBwcmludGsgKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiBVc2luZyBtdWx0aXBsZSB0YXNrcywgdmVyc2lvbiAlc1xuIiwgcmNzaWQpOworCisgIHJldHVybiAwOworCitmcmVlYnVmczoKKyAgZm9yIChpID0gMDsgaSA8IFRYX1NMT1RTOyArK2kpCisgICAgaWYgKHNlbGYtPnR4X2J1ZnNbaV0pCisgICAgICBrZnJlZSAoc2VsZi0+dHhfYnVmc1tpXSk7CisgIGZvciAoaSA9IDA7IGkgPCBSWF9TTE9UUzsgKytpKQorICAgIGlmIChzZWxmLT5yeF9idWZzW2ldKQorICAgICAga2ZyZWUgKHNlbGYtPnJ4X2J1ZnNbaV0pOworICBrZnJlZShzZWxmLT5yaW5nYnVmKTsKKworZnJlZXJlZ2lvbjoKKyAgcmVsZWFzZV9yZWdpb24gKHNlbGYtPmlvLmZpcl9iYXNlLCBzZWxmLT5pby5maXJfZXh0KTsKKworZnJlZXNlbGY6CisgIGZyZWVfbmV0ZGV2KGRldik7CisKKyAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAordG9zaG9ib2VfZ290b3NsZWVwIChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgcG1fbWVzc2FnZV90IGNyYXApCit7CisgIHN0cnVjdCB0b3Nob2JvZV9jYiAqc2VsZiA9IChzdHJ1Y3QgdG9zaG9ib2VfY2IqKXBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgaW50IGkgPSAxMDsKKworICBJUkRBX0RFQlVHICg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworICBpZiAoIXNlbGYgfHwgc2VsZi0+c3RvcHBlZCkKKyAgICByZXR1cm4gMDsKKworICBpZiAoKCFzZWxmLT5pcmRhZCkgJiYgKCFzZWxmLT5hc3luYykpCisgICAgcmV0dXJuIDA7CisKKy8qIEZsdXNoIGFsbCBwYWNrZXRzICovCisgIHdoaWxlICgoaS0tKSAmJiAoc2VsZi0+dHhwZW5kaW5nKSkKKyAgICB1ZGVsYXkgKDEwMDAwKTsKKworICBzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKworICB0b3Nob2JvZV9zdG9wY2hpcCAoc2VsZik7CisgIHNlbGYtPnN0b3BwZWQgPSAxOworICBzZWxmLT50eHBlbmRpbmcgPSAwOworCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0b3Nob2JvZV93YWtldXAgKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworICBzdHJ1Y3QgdG9zaG9ib2VfY2IgKnNlbGYgPSAoc3RydWN0IHRvc2hvYm9lX2NiKilwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgSVJEQV9ERUJVRyAoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgaWYgKCFzZWxmIHx8ICFzZWxmLT5zdG9wcGVkKQorICAgIHJldHVybiAwOworCisgIGlmICgoIXNlbGYtPmlyZGFkKSAmJiAoIXNlbGYtPmFzeW5jKSkKKyAgICByZXR1cm4gMDsKKworICBzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+c3BpbmxvY2ssIGZsYWdzKTsKKworICB0b3Nob2JvZV9zdGFydGNoaXAgKHNlbGYpOworICBzZWxmLT5zdG9wcGVkID0gMDsKKworICBuZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPnNwaW5sb2NrLCBmbGFncyk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZG9uYXVib2VfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiZG9uYXVib2UiLAorCS5pZF90YWJsZQk9IHRvc2hvYm9lX3BjaV90YmwsCisJLnByb2JlCQk9IHRvc2hvYm9lX29wZW4sCisJLnJlbW92ZQkJPSB0b3Nob2JvZV9jbG9zZSwKKwkuc3VzcGVuZAk9IHRvc2hvYm9lX2dvdG9zbGVlcCwKKwkucmVzdW1lCQk9IHRvc2hvYm9lX3dha2V1cCAKK307CisKK3N0YXRpYyBpbnQgX19pbml0Citkb25hdWJvZV9pbml0ICh2b2lkKQoreworICByZXR1cm4gcGNpX21vZHVsZV9pbml0KCZkb25hdWJvZV9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0Citkb25hdWJvZV9jbGVhbnVwICh2b2lkKQoreworICBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRvbmF1Ym9lX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChkb25hdWJvZV9pbml0KTsKK21vZHVsZV9leGl0KGRvbmF1Ym9lX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5oIGIvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYjE3M2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmgKQEAgLTAsMCArMSwzNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgdG9zaG9ib2UuaAorICogVmVyc2lvbjogICAgICAgMi4xNgorICogRGVzY3JpcHRpb246ICAgRHJpdmVyIGZvciB0aGUgVG9zaGliYSBPQk9FIChvciB0eXBlLU8gb3IgNzAxKQorICogICAgICAgICAgICAgICAgRklSIENoaXBzZXQsIGFsc28gc3VwcG9ydHMgdGhlIERPTkFVT0JPRSAodHlwZS1ETworICogICAgICAgICAgICAgICAgb3IgZDAxKSBGSVIgY2hpcHNldCB3aGljaCBhcyBmYXIgYXMgSSBrbm93IGlzCisgKiAgICAgICAgICAgICAgICByZWdpc3RlciBjb21wYXRpYmxlLgorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgSmFtZXMgTWNLZW56aWUgPGphbWVzQGZpc2hzb3VwLmRocy5vcmc+CisgKiBDcmVhdGVkIGF0OiAgICBTYXQgTWF5IDggIDEyOjM1OjI3IDE5OTkKKyAqIE1vZGlmaWVkOiAyLjE2IE1hcnRpbiBMdWNpbmEgPG1hdG9Aa290ZWxuYS5zaz4KKyAqIE1vZGlmaWVkOiAyLjE2IFNhdCBKdW4gMjIgMTg6NTQ6MjkgMjAwMiAoc3luYyBoZWFkZXJzKQorICogTW9kaWZpZWQ6IDIuMTcgQ2hyaXN0aWFuIEdlbm5lcmF0IDxjaHJpc3RpYW4uZ2VubmVyYXRAcG9seXRlY2huaXF1ZS5vcmc+CisgKiBNb2RpZmllZDogMi4xNyBqZXUgc2VwIDEyIDA4OjUwOjIwIDIwMDIgKGFkZCBsb2NrIHRvIGJlIHVzZWQgYnkgc3BpbmxvY2tzKQorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5IEphbWVzIE1jS2VuemllLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIE5laXRoZXIgSmFtZXMgTWNLZW56aWUgbm9yIENhbWJyaWRnZSBVbml2ZXJzaXR5IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKiAKKyAqICAgICBBcHBsaWNhYmxlIE1vZGVscyA6IExpYnJldHRvIDEwMC8xMTBDVCBhbmQgbWFueSBtb3JlLgorICogICAgIFRvc2hpYmEgcmVmZXJzIHRvIHRoaXMgY2hpcCBhcyB0aGUgdHlwZS1PIElSIHBvcnQsCisgKiAgICAgb3IgdGhlIHR5cGUtRE8gSVIgcG9ydC4KKyAqCisgKiBJckRBIGNoaXAgc2V0IGxpc3QgZnJvbSBUb3NoaWJhIENvbXB1dGVyIEVuZ2luZWVyaW5nIENvcnAuCisgKiBtb2RlbAkJCW1ldGhvZAltYWtlcgljb250cm9sZXIJCVZlcnNpb24gCisgKiBQb3J0ZWdlIDMyMENUCUZJUixTSVIgVG9zaGliYSBPYm9lKFRyaWFuZ2xlKSAKKyAqIFBvcnRlZ2UgMzAxMENUCUZJUixTSVIgVG9zaGliYSBPYm9lKFN5ZG5leSkgCisgKiBQb3J0ZWdlIDMwMTVDVAlGSVIsU0lSIFRvc2hpYmEgT2JvZShTeWRuZXkpIAorICogUG9ydGVnZSAzMDIwQ1QJRklSLFNJUiBUb3NoaWJhIE9ib2UoU3lkbmV5KSAKKyAqIFBvcnRlZ2UgNzAyMENUCUZJUixTSVIgPwkJPworICogCisgKiBTYXRlbGwuIDQwOTBYQ0RUCUZJUixTSVIgPwkJPworICogCisgKiBMaWJyZXR0byAxMDBDVAlGSVIsU0lSIFRvc2hpYmEgT2JvZSAKKyAqIExpYnJldHRvIDEwMDBDVAlGSVIsU0lSIFRvc2hpYmEgT2JvZSAKKyAqIAorICogVEVDUkE3NTBEVkQJCUZJUixTSVIgVG9zaGliYSBPYm9lKFRyaWFuZ2xlKQlSRVYgSUQ9MTRoIAorICogVEVDUkE3ODAJCQlGSVIsU0lSIFRvc2hpYmEgT2JvZShTYW5kbG90KQlSRVYgSUQ9MzJoLDMzaCAKKyAqIFRFQ1JBNzUwQ0RUCQlGSVIsU0lSIFRvc2hpYmEgT2JvZShUcmlhbmdsZSkJUkVWIElEPTEzaCwxNGggCisgKiBURUNSQTgwMDAJCUZJUixTSVIgVG9zaGliYSBPYm9lKElTS1VSKQkJUkVWIElEPTIzaCAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjaGlwIGlzIGFsbGVnZWRseSByZWxlYXNlZCAgICAgICAgICovCisvKiBIb3dldmVyIEkgaGF2ZSBub3Qgc2VlbiBpdCwgbm90IGhhdmUgSSBtYW5hZ2VkIHRvIGNvbnRhY3QgICAgICovCisvKiBhbnlvbmUgd2hvIGhhcy4gSE9XRVZFUiB0aGUgY2hpcCBiZWFycyBhIHN0cmlraW5nIHJlc2VtYmxlbmNlICovCisvKiB0byB0aGUgSXJEQSBjb250cm9sbGVyIGluIHRoZSBUb3NoaWJhIFJJU0MgVE1QUjM5MjIgY2hpcCAgICAgICovCisvKiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBpcyBmcmVlbHkgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICovCisvKiBodHRwOi8vd3d3LnRvc2hpYmEuY29tL3RhZWMvY29tcG9uZW50cy9HZW5lcmljL1RNUFIzOTIyLnNodG1sICovCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHRoZSByZWdpc3RlcnMgaW4gdGhhdCBkb2N1bWVudCBhbmQgdGhlICAgICovCisvKiBSZWdpc3RlcnMgaW4gdGhlIDcwMSBvYm9lIGNoaXAgYXJlIGFzIGZvbGxvd3MgICAgKi8KKworCisvKiAzOTIyIHJlZyAgICAgNzAxIHJlZ3MsIGJ5IGJpdCBudW1iZXJzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgNy0gMCAgMTUtIDggIDI0LTE2ICAzMS0yNSAgICAgICAgICAgICAgICAgICAgICAqLworLyogJDI4ICAgICAgICAgICAgMHgwICAgIDB4MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAkMmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VFIE5PVEUgMSAgICAgICAgICAgKi8KKy8qICQzMCAgICAgICAgICAgIDB4NiAgICAweDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogJDM0ICAgICAgICAgICAgMHg4ICAgIDB4OSAgICAgICAgICAgICAgIFNFRSBOT1RFIDIgICAgICAgICAgICovCisvKiAkMzggICAgICAgICAgIDB4MTAgICAweDExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICQzQyAgICAgICAgICAgICAgICAgICAweGUgICAgICAgICAgICAgICBTRUUgTk9URSAzICAgICAgICAgICAqLworLyogJDQwICAgICAgICAgICAweDEyICAgMHgxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAkNDQgICAgICAgICAgIDB4MTQgICAweDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICQ0OCAgICAgICAgICAgMHgxNiAgIDB4MTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogJDRjICAgICAgICAgICAweDE4ICAgMHgxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAkNTAgICAgICAgICAgIDB4MWEgICAweDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogRklYTUU6IGNvdWxkIGJlIDB4MWIgMHgxYSBoZXJlICovCisKKy8qICQ1NCAgICAgICAgICAgMHgxZCAgIDB4MWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogJDVDICAgICAgICAgICAweGYgICAgICAgICAgICAgICAgICAgICAgIFNFRSBOT1RFIDQgICAgICAgICAgICovCisvKiAkMTMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VFIE5PVEUgNSAgICAgICAgICAgKi8KKy8qICQxMzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUUgTk9URSA2ICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDEuIFRoZSBwb2ludGVyIHRvIHJpbmcgaXMgcGFja2VkIGluIG1vc3QgdW5jZXJlbW9uaXVzbHkgICAgICAqLworLyogICAgNzAxIFJlZ2lzdGVyICAgICAgQWRkcmVzcyBiaXRzICAgIChBOS1BMCBtdXN0IGJlIHplcm8pICAgICovCisvKiAgICAgICAgICAgIDB4NDogICAgICBBMTcgQTE2IEExNSBBMTQgQTEzIEExMiBBMTEgQTEwICAgICAgICAgKi8KKy8qICAgICAgICAgICAgMHg1OiAgICAgIEEyNSBBMjQgQTIzIEEyMiBBMjEgQTIwIEExOSBBMTggICAgICAgICAqLworLyogICAgICAgICAgICAweDI6ICAgICAgICAwICAgMCBBMzEgQTMwIEEyOSBBMjggQTI3IEEyNiAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDIuIFRoZSBNJCBkcml2ZXJzIGRvIGEgd3JpdGUgMHgxIHRvIDB4OSwgaG93ZXZlciB0aGUgMzkyMiAgICAqLworLyogICAgZG9jdW1lbnRhdGlvbiB3b3VsZCBzdWdnZXN0IHRoYXQgYSB3cml0ZSBvZiAweDEgdG8gMHg4ICAgICovCisvKiAgICB3b3VsZCBiZSBtb3JlIGFwcHJvcHJpYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogMy4gVGhpcyBhc3NpZ25tZW50IGlzIHRlbnVvdXMgYXQgYmVzdCwgcmVnaXN0ZXIgMHhlIHNlZW1zIHRvICovCisvKiAgICBoYXZlIGJpdHMgYXJyYW5nZWQgMCAwIDAgUi9XIFIvVyBSL1cgUi9XIFIvVyAgICAgICAgICAgICAgKi8KKy8qICAgIGlmIGVpdGhlciBvZiB0aGUgbG93ZXIgdHdvIGJpdHMgYXJlIHNldCB0aGUgY2hpcCBzZWVtcyB0byAqLworLyogICAgc3dpdGNoIG9mZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDQuIEJpdHMgNy00IHNlZW0gdG8gYmUgZGlmZmVyZW50IDQgc2VlbXMganVzdCB0byBiZSBnZW5lcmljICAqLworLyogICAgcmVjZWl2ZXIgYnVzeSBmbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDUuIGFuZCA2LiBUaGUgSUVSIGFuZCBJU1IgaGF2ZSBhIGRpZmZlcmVudCBiaXQgYXNzaWdubWVudCAgICAqLworLyogICAgVGhlIGxvd2VyIHRocmVlIGJpdHMgb2YgYm90aCByZWFkIGJhY2sgYXMgb25lcyAgICAgICAgICAgICovCisvKiBJU1IgaXMgcmVnaXN0ZXIgMHhjLCBJRVIgaXMgcmVnaXN0ZXIgMHhkICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICA3ICAgICAgNiAgICAgIDUgICAgICA0ICAgICAgMyAgICAgIDIgICAgICAxICAgICAgMCAqLworLyogMHhjOiBUeERvbmUgUnhEb25lIFR4VW5kciBSeE92ZXIgU2lwUmN2ICAgICAgMSAgICAgIDEgICAgICAxICovCisvKiAweGQ6IFR4RG9uZSBSeERvbmUgVHhVbmRyIFJ4T3ZlciBTaXBSY3YgICAgICAxICAgICAgMSAgICAgIDEgKi8KKy8qIFR4RG9uZSB4bWl0dCBkb25lIChnZW5lcmF0ZWQgb25seSBpZiBnZW5lcmF0ZSBpbnRlcnJ1cHQgYml0ICAqLworLyogICBpcyBzZXQgaW4gdGhlIHJpbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSeERvbmUgcmVjdiBjb21wbGV0ZWQgKG9yIG90aGVyIHJlY3YgY29uZGl0aW9uIGlmIHlvdSBzZXQgaXQgKi8KKy8qICAgdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVHhVbmRlciB1bmRlcmZsb3cgaW4gVHJhbnNtaXQgRklGTyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSeE92ZXIgIG92ZXJmbG93IGluIFJlY3YgRklGTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFNpcFJjdiAgcmVjZWl2ZWQgc2VyaWFsIGdhcCAgKG9yIG90aGVyIGNvbmRpdGlvbiB5b3Ugc2V0KSAgICAqLworLyogSW50ZXJydXB0cyBhcmUgZW5hYmxlZCBieSB3cml0aW5nIGEgb25lIHRvIHRoZSBJRVIgcmVnaXN0ZXIgICovCisvKiBJbnRlcnJ1cHRzIGFyZSBjbGVhcmVkIGJ5IHdyaXR0aW5nIGEgb25lIHRvIHRoZSBJU1IgcmVnaXN0ZXIgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogNi4gVGhlIHJlbWFpbmluZyByZWdpc3RlcnM6IDB4NiBhbmQgMHgzIGFwcGVhciB0byBiZSAgICAgICAgICovCisvKiAgICByZXNlcnZlZCBwYXJ0cyBvZiAxNiBvciAzMiBiaXQgcmVnaXN0ZXJzdGhlIHJlbWFpbmRlciAgICAgKi8KKy8qICAgIDB4YSAweGIgMHgxZSAweDFmIGNvdWxkIHBvc3NpYmx5IGJlIChieSB0aGVpciBiZWhhdmlvdXIpICAqLworLyogICAgdGhlIFVuaWNhc3QgRmlsdGVyIHJlZ2lzdGVyIGF0ICQ1OC4gICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIDcuIFdoaWxlIHRoZSBjb3JlIG9idmlvdXNseSBleHBlY3RzIDMyIGJpdCBhY2Nlc3NlcyBhbGwgdGhlICAqLworLyogICAgTSQgZHJpdmVycyBkbyA4IGJpdCBhY2Nlc3NlcywgaW5mYWN0IHRoZSBNaW5pcG9ydCBvbmVzICAgICovCisvKiAgICB3cml0ZSBhbmQgcmVhZCBiYWNrIHRoZSBieXRlIHNlcnZlcmFsIHRpbWVzICh3aHk/KSAgICAgICAgKi8KKworCisjaWZuZGVmIFRPU0hPQk9FX0gKKyNkZWZpbmUgVE9TSE9CT0VfSAorCisvKiBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBPQk9FX0lPX0VYVEVOVAkweDFmCisKKy8qUmVjZWl2ZSBhbmQgdHJhbnNtaXQgc2xvdCBwb2ludGVycyAqLworI2RlZmluZSBPQk9FX1JFRyhpKQkoaSsoc2VsZi0+YmFzZSkpCisjZGVmaW5lIE9CT0VfUlhTTE9UCU9CT0VfUkVHKDB4MCkKKyNkZWZpbmUgT0JPRV9UWFNMT1QJT0JPRV9SRUcoMHgxKQorI2RlZmluZSBPQk9FX1NMT1RfTUFTSwkweDNmCisKKyNkZWZpbmUgT0JPRV9UWFJJTkdfT0ZGU0VUCQkweDIwMAorI2RlZmluZSBPQk9FX1RYUklOR19PRkZTRVRfSU5fU0xPVFMJMHg0MAorCisvKnBvaW50ZXIgdG8gdGhlIHJpbmcgKi8KKyNkZWZpbmUgT0JPRV9SSU5HX0JBU0UwCU9CT0VfUkVHKDB4NCkKKyNkZWZpbmUgT0JPRV9SSU5HX0JBU0UxCU9CT0VfUkVHKDB4NSkKKyNkZWZpbmUgT0JPRV9SSU5HX0JBU0UyCU9CT0VfUkVHKDB4MikKKyNkZWZpbmUgT0JPRV9SSU5HX0JBU0UzCU9CT0VfUkVHKDB4MykKKworLypOdW1iZXIgb2Ygc2xvdHMgaW4gdGhlIHJpbmcgKi8KKyNkZWZpbmUgT0JPRV9SSU5HX1NJWkUgIE9CT0VfUkVHKDB4NykKKyNkZWZpbmUgT0JPRV9SSU5HX1NJWkVfUlg0CTB4MDAKKyNkZWZpbmUgT0JPRV9SSU5HX1NJWkVfUlg4CTB4MDEKKyNkZWZpbmUgT0JPRV9SSU5HX1NJWkVfUlgxNgkweDAzCisjZGVmaW5lIE9CT0VfUklOR19TSVpFX1JYMzIJMHgwNworI2RlZmluZSBPQk9FX1JJTkdfU0laRV9SWDY0CTB4MGYKKyNkZWZpbmUgT0JPRV9SSU5HX1NJWkVfVFg0CTB4MDAKKyNkZWZpbmUgT0JPRV9SSU5HX1NJWkVfVFg4CTB4MTAKKyNkZWZpbmUgT0JPRV9SSU5HX1NJWkVfVFgxNgkweDMwCisjZGVmaW5lIE9CT0VfUklOR19TSVpFX1RYMzIJMHg3MAorI2RlZmluZSBPQk9FX1JJTkdfU0laRV9UWDY0CTB4ZjAKKworI2RlZmluZSBPQk9FX1JJTkdfTUFYX1NJWkUJNjQKKworLypDYXVzZXMgdGhlIGd1YmJpbnMgdG8gcmUtZXhhbWluZSB0aGUgcmluZyAqLworI2RlZmluZSBPQk9FX1BST01QVAlPQk9FX1JFRygweDkpCisjZGVmaW5lIE9CT0VfUFJPTVBUX0JJVAkJMHgxCisKKy8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgT0JPRV9JU1IJT0JPRV9SRUcoMHhjKQorLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBPQk9FX0lFUglPQk9FX1JFRygweGQpCisvKiBJbnRlcnJ1cHQgYml0cyBmb3IgSUVSIGFuZCBJU1IgKi8KKyNkZWZpbmUgT0JPRV9JTlRfVFhET05FCQkweDgwCisjZGVmaW5lIE9CT0VfSU5UX1JYRE9ORQkJMHg0MAorI2RlZmluZSBPQk9FX0lOVF9UWFVOREVSCTB4MjAKKyNkZWZpbmUgT0JPRV9JTlRfUlhPVkVSCQkweDEwCisjZGVmaW5lIE9CT0VfSU5UX1NJUAkJMHgwOAorI2RlZmluZSBPQk9FX0lOVF9NQVNLCQkweGY4CisKKy8qUmVzZXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgT0JPRV9DT05GSUcxCU9CT0VfUkVHKDB4ZSkKKyNkZWZpbmUgT0JPRV9DT05GSUcxX1JTVAkweDAxCisjZGVmaW5lIE9CT0VfQ09ORklHMV9ESVNBQkxFCTB4MDIKKyNkZWZpbmUgT0JPRV9DT05GSUcxXzQJCTB4MDgKKyNkZWZpbmUgT0JPRV9DT05GSUcxXzgJCTB4MDgKKworI2RlZmluZSBPQk9FX0NPTkZJRzFfT04JCTB4OAorI2RlZmluZSBPQk9FX0NPTkZJRzFfUkVTRVQJMHhmCisjZGVmaW5lIE9CT0VfQ09ORklHMV9PRkYJMHhlCisKKyNkZWZpbmUgT0JPRV9TVEFUVVMJT0JPRV9SRUcoMHhmKQorI2RlZmluZSBPQk9FX1NUQVRVU19SWEJVU1kJMHgxMAorI2RlZmluZSBPQk9FX1NUQVRVU19GSVJSWAkweDA0CisjZGVmaW5lIE9CT0VfU1RBVFVTX01JUlJYCTB4MDIKKyNkZWZpbmUgT0JPRV9TVEFUVVNfU0lSUlgJMHgwMQorCisKKy8qU3BlZWQgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgT0JPRV9DT05GSUcwTAlPQk9FX1JFRygweDEwKQorI2RlZmluZSBPQk9FX0NPTkZJRzBICU9CT0VfUkVHKDB4MTEpCisKKyNkZWZpbmUgT0JPRV9DT05GSUcwSF9UWE9OTE9PUCAgMHg4MCAvKlRyYW5zbWl0IHdoZW4gbG9vcGluZyAoZGFuZ2Vyb3VzKSAqLworI2RlZmluZSBPQk9FX0NPTkZJRzBIX0xPT1AJMHg0MCAvKkxvb3BiYWNrIFR4LT5SeCAqLworI2RlZmluZSBPQk9FX0NPTkZJRzBIX0VOVFgJMHgxMCAvKkVuYWJsZSBUeCAqLworI2RlZmluZSBPQk9FX0NPTkZJRzBIX0VOUlgJMHgwOCAvKkVuYWJsZSBSeCAqLworI2RlZmluZSBPQk9FX0NPTkZJRzBIX0VORE1BQwkweDA0IC8qRW5hYmxlL3Jlc2V0KiB0aGUgRE1BIGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgT0JPRV9DT05GSUcwSF9SQ1ZBTlkJMHgwMiAvKkRNQSBtb2RlIDE9Ynl0ZXMsIDA9ZHdvcmRzICovCisKKyNkZWZpbmUgT0JPRV9DT05GSUcwTF9DUkMxNgkweDgwIC8qQ1JDIDE9MTYgYml0IDA9MzIgYml0ICovCisjZGVmaW5lIE9CT0VfQ09ORklHMExfRU5GSVIJMHg0MCAvKkVuYWJsZSBGSVIgKi8KKyNkZWZpbmUgT0JPRV9DT05GSUcwTF9FTk1JUgkweDIwIC8qRW5hYmxlIE1JUiAqLworI2RlZmluZSBPQk9FX0NPTkZJRzBMX0VOU0lSCTB4MTAgLypFbmFibGUgU0lSICovCisjZGVmaW5lIE9CT0VfQ09ORklHMExfRU5TSVJGCTB4MDggLypFbmFibGUgU0lSIGZyYW1lciAqLworI2RlZmluZSBPQk9FX0NPTkZJRzBMX1NJUlRFU1QJMHgwNCAvKkVuYWJsZSBTSVIgZnJhbWVyIGluIE1JUiBhbmQgRklSICovCisjZGVmaW5lIE9CT0VfQ09ORklHMExfSU5WRVJUVFggIDB4MDIgLypJbnZlcnQgVHggTGluZSAqLworI2RlZmluZSBPQk9FX0NPTkZJRzBMX0lOVkVSVFJYICAweDAxIC8qSW52ZXJ0IFJ4IExpbmUgKi8KKworI2RlZmluZSBPQk9FX0JPRglPQk9FX1JFRygweDEyKQorI2RlZmluZSBPQk9FX0VPRglPQk9FX1JFRygweDEzKQorCisjZGVmaW5lIE9CT0VfRU5BQkxFTAlPQk9FX1JFRygweDE0KQorI2RlZmluZSBPQk9FX0VOQUJMRUgJT0JPRV9SRUcoMHgxNSkKKworI2RlZmluZSBPQk9FX0VOQUJMRUhfUEhZQU5EQ0xPQ0sJMHg4MCAvKlRvZ2dsZSBsb3cgdG8gY29weSBjb25maWcgaW4gKi8KKyNkZWZpbmUgT0JPRV9FTkFCTEVIX0NPTkZJR0VSUgkJMHg0MAorI2RlZmluZSBPQk9FX0VOQUJMRUhfRklST04JCTB4MjAKKyNkZWZpbmUgT0JPRV9FTkFCTEVIX01JUk9OCQkweDEwCisjZGVmaW5lIE9CT0VfRU5BQkxFSF9TSVJPTgkJMHgwOAorI2RlZmluZSBPQk9FX0VOQUJMRUhfRU5UWAkJMHgwNAorI2RlZmluZSBPQk9FX0VOQUJMRUhfRU5SWAkJMHgwMgorI2RlZmluZSBPQk9FX0VOQUJMRUhfQ1JDMTYJCTB4MDEKKworI2RlZmluZSBPQk9FX0VOQUJMRUxfQlJPQURDQVNUCQkweDAxCisKKyNkZWZpbmUgT0JPRV9DVVJSX1BDT05GSUdMCQlPQk9FX1JFRygweDE2KSAvKkN1cnJlbnQgY29uZmlnICovCisjZGVmaW5lIE9CT0VfQ1VSUl9QQ09ORklHSAkJT0JPRV9SRUcoMHgxNykKKworI2RlZmluZSBPQk9FX05FV19QQ09ORklHTAkJT0JPRV9SRUcoMHgxOCkKKyNkZWZpbmUgT0JPRV9ORVdfUENPTkZJR0gJCU9CT0VfUkVHKDB4MTkpCisKKyNkZWZpbmUgT0JPRV9QQ09ORklHSF9CQVVETUFTSwkJMHhmYworI2RlZmluZSBPQk9FX1BDT05GSUdIX1dJRFRITUFTSwkJMHgwNAorI2RlZmluZSBPQk9FX1BDT05GSUdMX1dJRFRITUFTSwkJMHhlMAorI2RlZmluZSBPQk9FX1BDT05GSUdMX1BSRUFNQkxFTUFTSwkweDFmCisKKyNkZWZpbmUgT0JPRV9QQ09ORklHX0JBVURNQVNLCQkweGZjMDAKKyNkZWZpbmUgT0JPRV9QQ09ORklHX0JBVURTSElGVAkJMTAKKyNkZWZpbmUgT0JPRV9QQ09ORklHX1dJRFRITUFTSwkJMHgwNGUwCisjZGVmaW5lIE9CT0VfUENPTkZJR19XSURUSFNISUZUCQk1CisjZGVmaW5lIE9CT0VfUENPTkZJR19QUkVBTUJMRU1BU0sJMHgwMDFmCisjZGVmaW5lIE9CT0VfUENPTkZJR19QUkVBTUJMRVNISUZUCTAKKworI2RlZmluZSBPQk9FX01BWExFTkwJCQlPQk9FX1JFRygweDFhKQorI2RlZmluZSBPQk9FX01BWExFTkgJCQlPQk9FX1JFRygweDFiKQorCisjZGVmaW5lIE9CT0VfUlhDT1VOVEgJCQlPQk9FX1JFRygweDFjKSAvKlJlc2V0IG9uIHJlY2lwdCAqLworI2RlZmluZSBPQk9FX1JYQ09VTlRMCQkJT0JPRV9SRUcoMHgxZCkgLypvZiB3aG9sZSBwYWNrZXQgKi8KKworLyogVGhlIFBDSSBJRCBvZiB0aGUgT0JPRSBjaGlwICovCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfRklSNzAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRklSNzAxIAkweDA3MDEKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfRklSRDAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRklSRDAxIAkweDBkMDEKKyNlbmRpZgorCitzdHJ1Y3QgT2JvZVNsb3QKK3sKKyAgX191MTYgbGVuOyAgICAgICAgICAgICAgICAgICAgLypUd2VsZXZlIGJpdHMgb2YgcGFja2V0IGxlbmd0aCAqLworICBfX3U4IHVudXNlZDsKKyAgX191OCBjb250cm9sOyAgICAgICAgICAgICAgICAgLypTbG90IGNvbnRyb2wvc3RhdHVzIHNlZSBiZWxvdyAqLworICBfX3UzMiBhZGRyZXNzOyAgICAgICAgICAgICAgICAvKlNsb3QgYnVmZmVyIGFkZHJlc3MgKi8KK30KK19fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBPQk9FX05UQVNLUyBPQk9FX1RYUklOR19PRkZTRVRfSU5fU0xPVFMKKworc3RydWN0IE9ib2VSaW5nCit7CisgIHN0cnVjdCBPYm9lU2xvdCByeFtPQk9FX05UQVNLU107CisgIHN0cnVjdCBPYm9lU2xvdCB0eFtPQk9FX05UQVNLU107Cit9OworCisjZGVmaW5lIE9CT0VfUklOR19MRU4gKHNpemVvZihzdHJ1Y3QgT2JvZVJpbmcpKQorCisKKyNkZWZpbmUgT0JPRV9DVExfVFhfSFdfT1dOUwkweDgwIC8qVy9SIFRoaXMgc2xvdCBvd25lZCBieSB0aGUgaGFyZHdhcmUgKi8KKyNkZWZpbmUgT0JPRV9DVExfVFhfRElTVFhfQ1JDCTB4NDAgLypXIERpc2FibGUgQ1JDIGdlbmVyYXRpb24gZm9yIFtGTV1JUiAqLworI2RlZmluZSBPQk9FX0NUTF9UWF9CQURfQ1JDICAgICAweDIwIC8qVyBHZW5lcmF0ZSBiYWQgQ1JDICovCisjZGVmaW5lIE9CT0VfQ1RMX1RYX1NJUAkJMHgxMCAgIC8qVyBHZW5lcmF0ZSBhbiBTSVAgYWZ0ZXIgeG1pdHRpb24gKi8KKyNkZWZpbmUgT0JPRV9DVExfVFhfTUtVTkRFUgkweDA4IC8qVyBHZW5lcmF0ZSBhbiB1bmRlcnJ1biBlcnJvciAqLworI2RlZmluZSBPQk9FX0NUTF9UWF9SVENFTlRYCTB4MDQgLypXIEVuYWJsZSByZWNlaXZlciBhbmQgZ2VuZXJhdGUgVFhkb25lICovCisgICAgIC8qICBBZnRlciB0aGlzIHNsb3QgaXMgcHJvY2Vzc2VkICAgICAgICAqLworI2RlZmluZSBPQk9FX0NUTF9UWF9VTkRFUgkweDAxICAvKlIgU2V0IGJ5IGhhcmR3YXJlIHRvIGluZGljYXRlIHVuZGVycnVuICovCisKKworI2RlZmluZSBPQk9FX0NUTF9SWF9IV19PV05TCTB4ODAgLypXL1IgVGhpcyBzbG90IG93bmVkIGJ5IGhhcmR3YXJlICovCisjZGVmaW5lIE9CT0VfQ1RMX1JYX1BIWUVSUgkweDQwIC8qUiBEZWNvZGVyIGVycm9yIG9uIHJlY2VpcHRpb24gKi8KKyNkZWZpbmUgT0JPRV9DVExfUlhfQ1JDRVJSCTB4MjAgLypSIENSQyBlcnJvciBvbmx5IHNldCBmb3IgW0ZNXUlSICovCisjZGVmaW5lIE9CT0VfQ1RMX1JYX0xFTkdUSAkweDEwIC8qUiBQYWNrZXQgPiBtYXggUnggbGVuZ3RoICAqLworI2RlZmluZSBPQk9FX0NUTF9SWF9PVkVSCTB4MDggICAvKlIgc2V0IHRvIGluZGljYXRlIGFuIG92ZXJmbG93ICovCisjZGVmaW5lIE9CT0VfQ1RMX1JYX1NJUkJBRAkweDA0IC8qUiBTSVIgaGFkIEJPRiBpbiBwYWNrZXQgb3IgQUJPUlQgc2VxdWVuY2UgKi8KKyNkZWZpbmUgT0JPRV9DVExfUlhfUlhFT0YJMHgwMiAgLypSIEZpbmlzaGVkIHJlY2VpdmluZyBvbiB0aGlzIHNsb3QgKi8KKworCitzdHJ1Y3QgdG9zaG9ib2VfY2IKK3sKKyAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsgICAgLyogWWVzISB3ZSBhcmUgc29tZSBraW5kIG9mIG5ldGRldmljZSAqLworICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKyAgc3RydWN0IHR0eV9kcml2ZXIgdHR5ZGV2OworCisgIHN0cnVjdCBpcmxhcF9jYiAqaXJsYXA7ICAgICAgIC8qIFRoZSBsaW5rIGxheWVyIHdlIGFyZSBiaW5kZWQgdG8gKi8KKworICBjaGlwaW9fdCBpbzsgICAgICAgICAgICAgICAgICAvKiBJckRBIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gKi8KKyAgc3RydWN0IHFvc19pbmZvIHFvczsgICAgICAgICAgLyogUW9TIGNhcGFiaWxpdGllcyBmb3IgdGhpcyBkZXZpY2UgKi8KKworICBfX3UzMiBmbGFnczsgICAgICAgICAgICAgICAgICAvKiBJbnRlcmZhY2UgZmxhZ3MgKi8KKworICBzdHJ1Y3QgcGNpX2RldiAqcGRldjsgICAgICAgICAvKlBDSSBkZXZpY2UgKi8KKyAgaW50IGJhc2U7ICAgICAgICAgICAgICAgICAgICAgLypJTyBiYXNlICovCisKKworICBpbnQgdHhwZW5kaW5nOyAgICAgICAgICAgICAgICAvKmhvdyBtYW55IHR4J3MgYXJlIHBlbmRpbmcgKi8KKyAgaW50IHR4cywgcnhzOyAgICAgICAgICAgICAgICAgLypXaGljaCBzbG90cyBhcmUgd2UgYXQgICovCisKKyAgaW50IGlyZGFkOyAgICAgICAgICAgICAgICAgICAgLypEcml2ZXIgdW5kZXIgY29udHJvbCBvZiBuZXRkZXYgZW5kICAqLworICBpbnQgYXN5bmM7ICAgICAgICAgICAgICAgICAgICAvKkRyaXZlciB1bmRlciBjb250cm9sIG9mIGFzeW5jIGVuZCAgICovCisKKworICBpbnQgc3RvcHBlZDsgICAgICAgICAgICAgICAgICAvKlN0b3BwZWQgYnkgc29tZSBvciBvdGhlciBBUE0gc3R1ZmYgKi8KKworICBpbnQgZmlsdGVyOyAgICAgICAgICAgICAgICAgICAvKkluIFNJUiBtb2RlIGRvIHdlIHdhbnQgdG8gcmVjZWl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXMgb3IgYnl0ZSByYW5nZXMgKi8KKworICB2b2lkICpyaW5nYnVmOyAgICAgICAgICAgICAgICAvKlRoZSByaW5nIGJ1ZmZlciAqLworICBzdHJ1Y3QgT2JvZVJpbmcgKnJpbmc7ICAgICAgICAvKlRoZSByaW5nICovCisKKyAgdm9pZCAqdHhfYnVmc1tPQk9FX1JJTkdfTUFYX1NJWkVdOyAvKlRoZSBidWZmZXJzICAgKi8KKyAgdm9pZCAqcnhfYnVmc1tPQk9FX1JJTkdfTUFYX1NJWkVdOworCisKKyAgaW50IHNwZWVkOyAgICAgICAgICAgICAgICAgICAgLypDdXJyZW50IHNldHRpbmcgb2YgdGhlIHNwZWVkICovCisgIGludCBuZXdfc3BlZWQ7ICAgICAgICAgICAgICAgIC8qU2V0IHRvIHJlcXVlc3QgYSBzcGVlZCBjaGFuZ2UgKi8KKworLyogVGhlIHNwaW5sb2NrIHByb3RlY3QgY3JpdGljYWwgcGFydHMgb2YgdGhlIGRyaXZlci4KKyAqCUxvY2tpbmcgaXMgZG9uZSBsaWtlIHRoaXMgOgorICoJCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworICoJUmVsZWFzaW5nIHRoZSBsb2NrIDoKKyAqCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5zcGlubG9jaywgZmxhZ3MpOworICovCisgIHNwaW5sb2NrX3Qgc3BpbmxvY2s7CQkKKyAgLyogVXNlZCBmb3IgdGhlIHByb2JlIGFuZCBkaWFnbm9zdGljcyBjb2RlICovCisgIGludCBpbnRfcng7CisgIGludCBpbnRfdHg7CisgIGludCBpbnRfdHh1bmRlcjsKKyAgaW50IGludF9yeG92ZXI7CisgIGludCBpbnRfc2lwOworfTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvZXA3MjExX2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2VwNzIxMV9pci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxODk2MjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2VwNzIxMV9pci5jCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogSVIgcG9ydCBkcml2ZXIgZm9yIHRoZSBDaXJydXMgTG9naWMgRVA3MjExIHByb2Nlc3Nvci4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMSwgQmx1ZSBNdWcgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorCisjZGVmaW5lIE1JTl9ERUxBWSAyNSAgICAgIC8qIDE1IHVzLCBidXQgd2FpdCBhIGxpdHRsZSBtb3JlIHRvIGJlIHN1cmUgKi8KKyNkZWZpbmUgTUFYX0RFTEFZIDEwMDAwICAgLyogMSBtcyAqLworCitzdGF0aWMgdm9pZCBlcDcyMTFfaXJfb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpOworc3RhdGljIHZvaWQgZXA3MjExX2lyX2Nsb3NlKGRvbmdsZV90ICpzZWxmKTsKK3N0YXRpYyBpbnQgIGVwNzIxMV9pcl9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CitzdGF0aWMgaW50ICBlcDcyMTFfaXJfcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CisKK3N0YXRpYyBzdHJ1Y3QgZG9uZ2xlX3JlZyBkb25nbGUgPSB7CisJLnR5cGUgPSBJUkRBX0VQNzIxMV9JUiwKKwkub3BlbiA9IGVwNzIxMV9pcl9vcGVuLAorCS5jbG9zZSA9IGVwNzIxMV9pcl9jbG9zZSwKKwkucmVzZXQgPSBlcDcyMTFfaXJfcmVzZXQsCisJLmNoYW5nZV9zcGVlZCA9IGVwNzIxMV9pcl9jaGFuZ2Vfc3BlZWQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgdm9pZCBlcDcyMTFfaXJfb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpCit7CisJdW5zaWduZWQgaW50IHN5c2NvbjEsIGZsYWdzOworCisJc2F2ZV9mbGFncyhmbGFncyk7IGNsaSgpOworCisJLyogVHVybiBvbiB0aGUgU0lSIGVuY29kZXIuICovCisJc3lzY29uMSA9IGNscHNfcmVhZGwoU1lTQ09OMSk7CisJc3lzY29uMSB8PSBTWVNDT04xX1NJUkVOOworCWNscHNfd3JpdGVsKHN5c2NvbjEsIFNZU0NPTjEpOworCisJLyogWFhYOiBXZSBzaG91bGQgZGlzYWJsZSBtb2RlbSBzdGF0dXMgaW50ZXJydXB0cyBvbiB0aGUgZmlyc3QKKwkJVUFSVCAoaW50ZXJydXB0ICMxNCkuICovCisKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZXA3MjExX2lyX2Nsb3NlKGRvbmdsZV90ICpzZWxmKQoreworCXVuc2lnbmVkIGludCBzeXNjb24xLCBmbGFnczsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKKworCS8qIFR1cm4gb2ZmIHRoZSBTSVIgZW5jb2Rlci4gKi8KKwlzeXNjb24xID0gY2xwc19yZWFkbChTWVNDT04xKTsKKwlzeXNjb24xICY9IH5TWVNDT04xX1NJUkVOOworCWNscHNfd3JpdGVsKHN5c2NvbjEsIFNZU0NPTjEpOworCisJLyogWFhYOiBJZiB3ZSd2ZSBkaXNhYmxlZCB0aGUgbW9kZW0gc3RhdHVzIGludGVycnVwdHMsIHdlIHNob3VsZAorCQlyZXNldCB0aGVtIGJhY2sgdG8gdGhlaXIgb3JpZ2luYWwgc3RhdGUuICovCisKKwlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGVwNzIxMV9pcl9jaGFuZ2Vfc3BlZWQgKHRhc2spCisgKgorICogICAgQ2hhbmdlIHNwZWVkIG9mIHRoZSBFUDcyMTEgSS9SIHBvcnQuIFdlIGRvbid0IHJlYWxseSBoYXZlIHRvIGRvIGFueXRoaW5nCisgKiAgICBmb3IgdGhlIEVQNzIxMSBhcyBsb25nIGFzIHRoZSByYXRlIGlzIGJlaW5nIGNoYW5nZWQgYXQgdGhlIHNlcmlhbCBwb3J0CisgKiAgICBsZXZlbC4KKyAqLworc3RhdGljIGludCBlcDcyMTFfaXJfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gZXA3MjExX2lyX3Jlc2V0ICh0YXNrKQorICoKKyAqICAgICAgUmVzZXQgdGhlIEVQNzIxMSBJL1IuIFdlIGRvbid0IHJlYWxseSBoYXZlIHRvIGRvIGFueXRoaW5nLgorICoKKyAqLworc3RhdGljIGludCBlcDcyMTFfaXJfcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBlcDcyMTFfaXJfaW5pdCh2b2lkKQorICoKKyAqICAgIEluaXRpYWxpemUgRVA3MjExIEkvUiBtb2R1bGUKKyAqCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGVwNzIxMV9pcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlyZGFfZGV2aWNlX3JlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGVwNzIxMV9pcl9jbGVhbnVwKHZvaWQpCisgKgorICogICAgQ2xlYW51cCBFUDcyMTEgSS9SIG1vZHVsZQorICoKKyAqLworc3RhdGljIHZvaWQgX19leGl0IGVwNzIxMV9pcl9jbGVhbnVwKHZvaWQpCit7CisJaXJkYV9kZXZpY2VfdW5yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7Cit9CisKK01PRFVMRV9BVVRIT1IoIkpvbiBNY0NsaW50b2NrIDxqb25tQGJsdWVtdWcuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFUDcyMTEgSS9SIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS04Iik7IC8qIElSREFfRVA3MjExX0lSICovCisJCQorbW9kdWxlX2luaXQoZXA3MjExX2lyX2luaXQpOworbW9kdWxlX2V4aXQoZXA3MjExX2lyX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9lc2ktc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2VzaS1zaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTA4ZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9lc2ktc2lyLmMKQEAgLTAsMCArMSwxNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgZXNpLmMKKyAqIFZlcnNpb246ICAgICAgIDEuNgorICogRGVzY3JpcHRpb246ICAgRHJpdmVyIGZvciB0aGUgRXh0ZW5kZWQgU3lzdGVtcyBKZXRFeWUgUEMgZG9uZ2xlCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBTYXQgRmViIDIxIDE4OjU0OjM4IDE5OTgKKyAqIE1vZGlmaWVkIGF0OiAgIFN1biBPY3QgMjcgMjI6MDE6MDQgMjAwMgorICogTW9kaWZpZWQgYnk6ICAgTWFydGluIERpZWhsIDxtYWRAbWRpZWhsLmRlPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5IERhZyBCcmF0dGxpLCA8ZGFnYkBjcy51aXQubm8+LAorICogICAgIENvcHlyaWdodCAoYykgMTk5OCBUaG9tYXMgRGF2aXMsIDxyYXRiZXJ0QHJhZGlrcy5uZXQ+LAorICogICAgIENvcHlyaWdodCAoYykgMjAwMiBNYXJ0aW4gRGllaGwsIDxtYWRAbWRpZWhsLmRlPiwKKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqICAgICBNQSAwMjExMS0xMzA3IFVTQQorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisKKyNpbmNsdWRlICJzaXItZGV2LmgiCisKK3N0YXRpYyBpbnQgZXNpX29wZW4oc3RydWN0IHNpcl9kZXYgKik7CitzdGF0aWMgaW50IGVzaV9jbG9zZShzdHJ1Y3Qgc2lyX2RldiAqKTsKK3N0YXRpYyBpbnQgZXNpX2NoYW5nZV9zcGVlZChzdHJ1Y3Qgc2lyX2RldiAqLCB1bnNpZ25lZCk7CitzdGF0aWMgaW50IGVzaV9yZXNldChzdHJ1Y3Qgc2lyX2RldiAqKTsKKworc3RhdGljIHN0cnVjdCBkb25nbGVfZHJpdmVyIGVzaSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRyaXZlcl9uYW1lCT0gIkpldEV5ZSBQQyBFU0ktOTY4MCBQQyIsCisJLnR5cGUJCT0gSVJEQV9FU0lfRE9OR0xFLAorCS5vcGVuCQk9IGVzaV9vcGVuLAorCS5jbG9zZQkJPSBlc2lfY2xvc2UsCisJLnJlc2V0CQk9IGVzaV9yZXNldCwKKwkuc2V0X3NwZWVkCT0gZXNpX2NoYW5nZV9zcGVlZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGVzaV9zaXJfaW5pdCh2b2lkKQoreworCXJldHVybiBpcmRhX3JlZ2lzdGVyX2RvbmdsZSgmZXNpKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGVzaV9zaXJfY2xlYW51cCh2b2lkKQoreworCWlyZGFfdW5yZWdpc3Rlcl9kb25nbGUoJmVzaSk7Cit9CisKK3N0YXRpYyBpbnQgZXNpX29wZW4oc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcW9zX2luZm8gKnFvcyA9ICZkZXYtPnFvczsKKworCS8qIFBvd2VyIHVwIGFuZCBzZXQgZG9uZ2xlIHRvIDk2MDAgYmF1ZCAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBUUlVFKTsKKworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfOTYwMHxJUl8xOTIwMHxJUl8xMTUyMDA7CisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDAxOyAvKiBOZWVkcyBhdCBsZWFzdCAxMCBtcyAqLworCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUocW9zKTsKKworCS8qIGlyZGEgdGhyZWFkIHdhaXRzIDUwIG1zZWMgZm9yIHBvd2VyIHNldHRsaW5nICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlc2lfY2xvc2Uoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwkvKiBQb3dlciBvZmYgZG9uZ2xlICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgRkFMU0UsIEZBTFNFKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gZXNpX2NoYW5nZV9zcGVlZCAodGFzaykKKyAqCisgKiBTZXQgdGhlIHNwZWVkIGZvciB0aGUgRXh0ZW5kZWQgU3lzdGVtcyBKZXRFeWUgUEMgRVNJLTk2ODAgdHlwZSBkb25nbGUKKyAqIEFwcGFyZW50bHkgKHNlZSBvbGQgZXNpLWRyaXZlcikgbm8gZGVsYXlzIGFyZSBuZWVkZWQgaGVyZS4uLgorICoKKyAqLworc3RhdGljIGludCBlc2lfY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICpkZXYsIHVuc2lnbmVkIHNwZWVkKQoreworCWludCByZXQgPSAwOworCWludCBkdHIsIHJ0czsKKwkKKwlzd2l0Y2ggKHNwZWVkKSB7CisJY2FzZSAxOTIwMDoKKwkJZHRyID0gVFJVRTsKKwkJcnRzID0gRkFMU0U7CisJCWJyZWFrOworCWNhc2UgMTE1MjAwOgorCQlkdHIgPSBydHMgPSBUUlVFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlzcGVlZCA9IDk2MDA7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgOTYwMDoKKwkJZHRyID0gRkFMU0U7CisJCXJ0cyA9IFRSVUU7CisJCWJyZWFrOworCX0KKworCS8qIENoYW5nZSBzcGVlZCBvZiBkb25nbGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBkdHIsIHJ0cyk7CisJZGV2LT5zcGVlZCA9IHNwZWVkOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGVzaV9yZXNldCAodGFzaykKKyAqCisgKiAgICBSZXNldCBkb25nbGU7CisgKgorICovCitzdGF0aWMgaW50IGVzaV9yZXNldChzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBGQUxTRSk7CisKKwkvKiBIbSwgdGhlIG9sZCBlc2ktZHJpdmVyIGxlZnQgdGhlIGRvbmdsZSB1bnBvd2VyZWQgcmVseWluZyBvbgorCSAqIHRoZSBmb2xsb3dpbmcgc3BlZWQgY2hhbmdlIHRvIHJlcG93ZXIuIFRoaXMgbWlnaHQgd29yayBmb3IKKwkgKiB0aGUgZXNpIGJlY2F1c2Ugd2Ugb25seSBuZWVkIHRoZSBtb2RlbSBsaW5lcy4gSG93ZXZlciwgbm93IHRoZQorCSAqIGdlbmVyYWwgcnVsZSBpcyByZXNldCBtdXN0IGJyaW5nIHRoZSBkb25nbGUgdG8gc29tZSB3b3JraW5nCisJICogd2VsbC1rbm93biBzdGF0ZSBiZWNhdXNlIHNwZWVkIGNoYW5nZSBtaWdodCB3cml0ZSB0byByZWdpc3RlcnMuCisJICogVGhlIG9sZCBlc2ktZHJpdmVyIGRpZG4ndCBhbnkgZGVsYXkgaGVyZSAtIGxldCdzIGhvcGUgaXQnIGZpbmUuCisJICovCisKKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgVFJVRSk7CisJZGV2LT5zcGVlZCA9IDk2MDA7CisKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFeHRlbmRlZCBTeXN0ZW1zIEpldEV5ZSBQQyBkb25nbGUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTEiKTsgLyogSVJEQV9FU0lfRE9OR0xFICovCisKK21vZHVsZV9pbml0KGVzaV9zaXJfaW5pdCk7Cittb2R1bGVfZXhpdChlc2lfc2lyX2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2VzaS5jIGIvZHJpdmVycy9uZXQvaXJkYS9lc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2E2MWFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9lc2kuYwpAQCAtMCwwICsxLDE0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBlc2kuYworICogVmVyc2lvbjogICAgICAgMS41CisgKiBEZXNjcmlwdGlvbjogICBEcml2ZXIgZm9yIHRoZSBFeHRlbmRlZCBTeXN0ZW1zIEpldEV5ZSBQQyBkb25nbGUKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFNhdCBGZWIgMjEgMTg6NTQ6MzggMTk5OAorICogTW9kaWZpZWQgYXQ6ICAgRnJpIERlYyAxNyAwOToxNDowNCAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgRGFnIEJyYXR0bGksIDxkYWdiQGNzLnVpdC5ubz4sCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4IFRob21hcyBEYXZpcywgPHJhdGJlcnRAcmFkaWtzLm5ldD4sCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisgKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgKiAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisKK3N0YXRpYyB2b2lkIGVzaV9vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcyk7CitzdGF0aWMgdm9pZCBlc2lfY2xvc2UoZG9uZ2xlX3QgKnNlbGYpOworc3RhdGljIGludCAgZXNpX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKK3N0YXRpYyBpbnQgIGVzaV9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKKworc3RhdGljIHN0cnVjdCBkb25nbGVfcmVnIGRvbmdsZSA9IHsKKwkudHlwZSA9IElSREFfRVNJX0RPTkdMRSwKKwkub3BlbiA9IGVzaV9vcGVuLAorCS5jbG9zZSA9IGVzaV9jbG9zZSwKKwkucmVzZXQgPSBlc2lfcmVzZXQsCisJLmNoYW5nZV9zcGVlZCA9IGVzaV9jaGFuZ2Vfc3BlZWQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlc2lfaW5pdCh2b2lkKQoreworCXJldHVybiBpcmRhX2RldmljZV9yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlc2lfY2xlYW51cCh2b2lkKQoreworCWlyZGFfZGV2aWNlX3VucmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworfQorCitzdGF0aWMgdm9pZCBlc2lfb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpCit7CisJcW9zLT5iYXVkX3JhdGUuYml0cyAmPSBJUl85NjAwfElSXzE5MjAwfElSXzExNTIwMDsKKwlxb3MtPm1pbl90dXJuX3RpbWUuYml0cyA9IDB4MDE7IC8qIE5lZWRzIGF0IGxlYXN0IDEwIG1zICovCit9CisKK3N0YXRpYyB2b2lkIGVzaV9jbG9zZShkb25nbGVfdCAqZG9uZ2xlKQorewkJCisJLyogUG93ZXIgb2ZmIGRvbmdsZSAqLworCWRvbmdsZS0+c2V0X2R0cl9ydHMoZG9uZ2xlLT5kZXYsIEZBTFNFLCBGQUxTRSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBlc2lfY2hhbmdlX3NwZWVkICh0YXNrKQorICoKKyAqICAgIFNldCB0aGUgc3BlZWQgZm9yIHRoZSBFeHRlbmRlZCBTeXN0ZW1zIEpldEV5ZSBQQyBFU0ktOTY4MCB0eXBlIGRvbmdsZQorICoKKyAqLworc3RhdGljIGludCBlc2lfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CisJX191MzIgc3BlZWQgPSAoX191MzIpIHRhc2stPnBhcmFtOworCWludCBkdHIsIHJ0czsKKwkKKwlzd2l0Y2ggKHNwZWVkKSB7CisJY2FzZSAxOTIwMDoKKwkJZHRyID0gVFJVRTsKKwkJcnRzID0gRkFMU0U7CisJCWJyZWFrOworCWNhc2UgMTE1MjAwOgorCQlkdHIgPSBydHMgPSBUUlVFOworCQlicmVhazsKKwljYXNlIDk2MDA6CisJZGVmYXVsdDoKKwkJZHRyID0gRkFMU0U7CisJCXJ0cyA9IFRSVUU7CisJCWJyZWFrOworCX0KKworCS8qIENoYW5nZSBzcGVlZCBvZiBkb25nbGUgKi8KKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIGR0ciwgcnRzKTsKKwlzZWxmLT5zcGVlZCA9IHNwZWVkOworCisJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBlc2lfcmVzZXQgKHRhc2spCisgKgorICogICAgUmVzZXQgZG9uZ2xlOworICoKKyAqLworc3RhdGljIGludCBlc2lfcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlkb25nbGVfdCAqc2VsZiA9IChkb25nbGVfdCAqKSB0YXNrLT5pbnN0YW5jZTsKKwkKKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBGQUxTRSk7CisJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9BVVRIT1IoIkRhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRXh0ZW5kZWQgU3lzdGVtcyBKZXRFeWUgUEMgZG9uZ2xlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS0xIik7IC8qIElSREFfRVNJX0RPTkdMRSAqLworCisvKgorICogRnVuY3Rpb24gaW5pdF9tb2R1bGUgKHZvaWQpCisgKgorICogICAgSW5pdGlhbGl6ZSBFU0kgbW9kdWxlCisgKgorICovCittb2R1bGVfaW5pdChlc2lfaW5pdCk7CisKKy8qCisgKiBGdW5jdGlvbiBjbGVhbnVwX21vZHVsZSAodm9pZCkKKyAqCisgKiAgICBDbGVhbnVwIEVTSSBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9leGl0KGVzaV9jbGVhbnVwKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9naXJiaWwtc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2dpcmJpbC1zaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDJmZTg3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvZ2lyYmlsLXNpci5jCkBAIC0wLDAgKzEsMjU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRmlsZW5hbWU6ICAgICAgZ2lyYmlsLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMgorICogRGVzY3JpcHRpb246ICAgSW1wbGVtZW50YXRpb24gZm9yIHRoZSBHcmVlbndpY2ggR0lyQklMIGRvbmdsZQorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgU2F0IEZlYiAgNiAyMTowMjozMyAxOTk5CisgKiBNb2RpZmllZCBhdDogICBGcmkgRGVjIDE3IDA5OjEzOjIwIDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisKKyNpbmNsdWRlICJzaXItZGV2LmgiCisKK3N0YXRpYyBpbnQgZ2lyYmlsX3Jlc2V0KHN0cnVjdCBzaXJfZGV2ICpkZXYpOworc3RhdGljIGludCBnaXJiaWxfb3BlbihzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKK3N0YXRpYyBpbnQgZ2lyYmlsX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICpkZXYpOworc3RhdGljIGludCBnaXJiaWxfY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICpkZXYsIHVuc2lnbmVkIHNwZWVkKTsKKworLyogQ29udHJvbCByZWdpc3RlciAxICovCisjZGVmaW5lIEdJUkJJTF9UWEVOICAgIDB4MDEgLyogRW5hYmxlIHRyYW5zbWl0dGVyICovCisjZGVmaW5lIEdJUkJJTF9SWEVOICAgIDB4MDIgLyogRW5hYmxlIHJlY2VpdmVyICovCisjZGVmaW5lIEdJUkJJTF9FQ0FOICAgIDB4MDQgLyogQ2FuY2VsIHNlbGYgZW1taXRlZCBkYXRhICovCisjZGVmaW5lIEdJUkJJTF9FQ0hPICAgIDB4MDggLyogRWNobyBjb250cm9sIGNoYXJhY3RlcnMgKi8KKworLyogTEVEIEN1cnJlbnQgUmVnaXN0ZXIgKDB4MikgKi8KKyNkZWZpbmUgR0lSQklMX0hJR0ggICAgMHgyMAorI2RlZmluZSBHSVJCSUxfTUVESVVNICAweDIxCisjZGVmaW5lIEdJUkJJTF9MT1cgICAgIDB4MjIKKworLyogQmF1ZCByZWdpc3RlciAoMHgzKSAqLworI2RlZmluZSBHSVJCSUxfMjQwMCAgICAweDMwCisjZGVmaW5lIEdJUkJJTF80ODAwICAgIDB4MzEKKyNkZWZpbmUgR0lSQklMXzk2MDAgICAgMHgzMgorI2RlZmluZSBHSVJCSUxfMTkyMDAgICAweDMzCisjZGVmaW5lIEdJUkJJTF8zODQwMCAgIDB4MzQKKyNkZWZpbmUgR0lSQklMXzU3NjAwICAgMHgzNQorI2RlZmluZSBHSVJCSUxfMTE1MjAwICAweDM2CisKKy8qIE1vZGUgcmVnaXN0ZXIgKDB4NCkgKi8KKyNkZWZpbmUgR0lSQklMX0lSREEgICAgMHg0MAorI2RlZmluZSBHSVJCSUxfQVNLICAgICAweDQxCisKKy8qIENvbnRyb2wgcmVnaXN0ZXIgMiAoMHg1KSAqLworI2RlZmluZSBHSVJCSUxfTE9BRCAgICAweDUxIC8qIExvYWQgdGhlIG5ldyBiYXVkIHJhdGUgdmFsdWUgKi8KKworc3RhdGljIHN0cnVjdCBkb25nbGVfZHJpdmVyIGdpcmJpbCA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRyaXZlcl9uYW1lCT0gIkdyZWVud2ljaCBHSXJCSUwiLAorCS50eXBlCQk9IElSREFfR0lSQklMX0RPTkdMRSwKKwkub3BlbgkJPSBnaXJiaWxfb3BlbiwKKwkuY2xvc2UJCT0gZ2lyYmlsX2Nsb3NlLAorCS5yZXNldAkJPSBnaXJiaWxfcmVzZXQsCisJLnNldF9zcGVlZAk9IGdpcmJpbF9jaGFuZ2Vfc3BlZWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBnaXJiaWxfc2lyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaXJkYV9yZWdpc3Rlcl9kb25nbGUoJmdpcmJpbCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBnaXJiaWxfc2lyX2NsZWFudXAodm9pZCkKK3sKKwlpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKCZnaXJiaWwpOworfQorCitzdGF0aWMgaW50IGdpcmJpbF9vcGVuKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJc3RydWN0IHFvc19pbmZvICpxb3MgPSAmZGV2LT5xb3M7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogUG93ZXIgb24gZG9uZ2xlICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisKKwlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8SVJfMTE1MjAwOworCXFvcy0+bWluX3R1cm5fdGltZS5iaXRzID0gMHgwMzsKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKHFvcyk7CisKKwkvKiBpcmRhIHRocmVhZCB3YWl0cyA1MCBtc2VjIGZvciBwb3dlciBzZXR0bGluZyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2lyYmlsX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFBvd2VyIG9mZiBkb25nbGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgRkFMU0UpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBnaXJiaWxfY2hhbmdlX3NwZWVkIChkZXYsIHNwZWVkKQorICoKKyAqICAgIFNldCB0aGUgc3BlZWQgZm9yIHRoZSBHaXJiaWwgdHlwZSBkb25nbGUuCisgKgorICovCisKKyNkZWZpbmUgR0lSQklMX1NUQVRFX1dBSVRfU1BFRUQJKFNJUkRFVl9TVEFURV9ET05HTEVfU1BFRUQgKyAxKQorCitzdGF0aWMgaW50IGdpcmJpbF9jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpCit7CisJdW5zaWduZWQgc3RhdGUgPSBkZXYtPmZzbS5zdWJzdGF0ZTsKKwl1bnNpZ25lZCBkZWxheSA9IDA7CisJdTggY29udHJvbFsyXTsKKwlzdGF0aWMgaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogZG9uZ2xlIGFscmVhZCByZXNldCAtIHBvcnQgYW5kIGRvbmdsZSBhdCBkZWZhdWx0IHNwZWVkICovCisKKwlzd2l0Y2goc3RhdGUpIHsKKworCWNhc2UgU0lSREVWX1NUQVRFX0RPTkdMRV9TUEVFRDoKKworCQkvKiBTZXQgRFRSIGFuZCBDbGVhciBSVFMgdG8gZW50ZXIgY29tbWFuZCBtb2RlICovCisJCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBUUlVFKTsKKworCQl1ZGVsYXkoMjUpOwkJLyogYmV0dGVyIHdhaXQgYSBsaXR0bGUgd2hpbGUgKi8KKworCQlyZXQgPSAwOworCQlzd2l0Y2ggKHNwZWVkKSB7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUlOVkFMOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgOTYwMDoKKwkJCWNvbnRyb2xbMF0gPSBHSVJCSUxfOTYwMDsKKwkJCWJyZWFrOworCQljYXNlIDE5MjAwOgorCQkJY29udHJvbFswXSA9IEdJUkJJTF8xOTIwMDsKKwkJCWJyZWFrOworCQljYXNlIDM0ODAwOgorCQkJY29udHJvbFswXSA9IEdJUkJJTF8zODQwMDsKKwkJCWJyZWFrOworCQljYXNlIDU3NjAwOgorCQkJY29udHJvbFswXSA9IEdJUkJJTF81NzYwMDsKKwkJCWJyZWFrOworCQljYXNlIDExNTIwMDoKKwkJCWNvbnRyb2xbMF0gPSBHSVJCSUxfMTE1MjAwOworCQkJYnJlYWs7CisJCX0KKwkJY29udHJvbFsxXSA9IEdJUkJJTF9MT0FEOworCQorCQkvKiBXcml0ZSBjb250cm9sIGJ5dGVzICovCisJCXNpcmRldl9yYXdfd3JpdGUoZGV2LCBjb250cm9sLCAyKTsKKworCQlkZXYtPnNwZWVkID0gc3BlZWQ7CisKKwkJc3RhdGUgPSBHSVJCSUxfU1RBVEVfV0FJVF9TUEVFRDsKKwkJZGVsYXkgPSAxMDA7CisJCWJyZWFrOworCisJY2FzZSBHSVJCSUxfU1RBVEVfV0FJVF9TUEVFRDoKKwkJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCQlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBUUlVFKTsKKworCQl1ZGVsYXkoMjUpOwkJLyogYmV0dGVyIHdhaXQgYSBsaXR0bGUgd2hpbGUgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlJUkRBX0VSUk9SKCIlcyAtIHVuZGVmaW5lZCBzdGF0ZSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0ZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlkZXYtPmZzbS5zdWJzdGF0ZSA9IHN0YXRlOworCXJldHVybiAoZGVsYXkgPiAwKSA/IGRlbGF5IDogcmV0OworfQorCisvKgorICogRnVuY3Rpb24gZ2lyYmlsX3Jlc2V0IChkcml2ZXIpCisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgZ2lyYmlsIGRvbmdsZS4KKyAqCisgKiAgICAgIEFsZ29yaXRobToKKyAqICAgIAkgIDAuIHNldCBSVFMsIGFuZCB3YWl0IGF0IGxlYXN0IDUgbXMKKyAqICAgICAgICAxLiBjbGVhciBSVFMKKyAqLworCisKKyNkZWZpbmUgR0lSQklMX1NUQVRFX1dBSVQxX1JFU0VUCShTSVJERVZfU1RBVEVfRE9OR0xFX1JFU0VUICsgMSkKKyNkZWZpbmUgR0lSQklMX1NUQVRFX1dBSVQyX1JFU0VUCShTSVJERVZfU1RBVEVfRE9OR0xFX1JFU0VUICsgMikKKyNkZWZpbmUgR0lSQklMX1NUQVRFX1dBSVQzX1JFU0VUCShTSVJERVZfU1RBVEVfRE9OR0xFX1JFU0VUICsgMykKKworc3RhdGljIGludCBnaXJiaWxfcmVzZXQoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBzdGF0ZSA9IGRldi0+ZnNtLnN1YnN0YXRlOworCXVuc2lnbmVkIGRlbGF5ID0gMDsKKwl1OCBjb250cm9sID0gR0lSQklMX1RYRU4gfCBHSVJCSUxfUlhFTjsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBTSVJERVZfU1RBVEVfRE9OR0xFX1JFU0VUOgorCQkvKiBSZXNldCBkb25nbGUgKi8KKwkJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgRkFMU0UpOworCQkvKiBTbGVlcCBhdCBsZWFzdCA1IG1zICovCisJCWRlbGF5ID0gMjA7CisJCXN0YXRlID0gR0lSQklMX1NUQVRFX1dBSVQxX1JFU0VUOworCQlicmVhazsKKworCWNhc2UgR0lSQklMX1NUQVRFX1dBSVQxX1JFU0VUOgorCQkvKiBTZXQgRFRSIGFuZCBjbGVhciBSVFMgdG8gZW50ZXIgY29tbWFuZCBtb2RlICovCisJCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBUUlVFKTsKKwkJZGVsYXkgPSAyMDsKKwkJc3RhdGUgPSBHSVJCSUxfU1RBVEVfV0FJVDJfUkVTRVQ7CisJCWJyZWFrOworCisJY2FzZSBHSVJCSUxfU1RBVEVfV0FJVDJfUkVTRVQ6CisJCS8qIFdyaXRlIGNvbnRyb2wgYnl0ZSAqLworCQlzaXJkZXZfcmF3X3dyaXRlKGRldiwgJmNvbnRyb2wsIDEpOworCQlkZWxheSA9IDIwOworCQlzdGF0ZSA9IEdJUkJJTF9TVEFURV9XQUlUM19SRVNFVDsKKwkJYnJlYWs7CisKKwljYXNlIEdJUkJJTF9TVEFURV9XQUlUM19SRVNFVDoKKwkJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCQlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBUUlVFKTsKKwkJZGV2LT5zcGVlZCA9IDk2MDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJSVJEQV9FUlJPUigiJXMoKSwgdW5kZWZpbmVkIHN0YXRlICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXRlKTsKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCX0KKwlkZXYtPmZzbS5zdWJzdGF0ZSA9IHN0YXRlOworCXJldHVybiAoZGVsYXkgPiAwKSA/IGRlbGF5IDogcmV0OworfQorCitNT0RVTEVfQVVUSE9SKCJEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkdyZWVud2ljaCBHSXJCSUwgZG9uZ2xlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS00Iik7IC8qIElSREFfR0lSQklMX0RPTkdMRSAqLworCittb2R1bGVfaW5pdChnaXJiaWxfc2lyX2luaXQpOworbW9kdWxlX2V4aXQoZ2lyYmlsX3Npcl9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvZ2lyYmlsLmMgYi9kcml2ZXJzL25ldC9pcmRhL2dpcmJpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OGFlYjBjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9naXJiaWwuYwpAQCAtMCwwICsxLDI1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBnaXJiaWwuYworICogVmVyc2lvbjogICAgICAgMS4yCisgKiBEZXNjcmlwdGlvbjogICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEdyZWVud2ljaCBHSXJCSUwgZG9uZ2xlCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBTYXQgRmViICA2IDIxOjAyOjMzIDE5OTkKKyAqIE1vZGlmaWVkIGF0OiAgIEZyaSBEZWMgMTcgMDk6MTM6MjAgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCitzdGF0aWMgaW50ICBnaXJiaWxfcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CitzdGF0aWMgdm9pZCBnaXJiaWxfb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpOworc3RhdGljIHZvaWQgZ2lyYmlsX2Nsb3NlKGRvbmdsZV90ICpzZWxmKTsKK3N0YXRpYyBpbnQgIGdpcmJpbF9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CisKKy8qIENvbnRyb2wgcmVnaXN0ZXIgMSAqLworI2RlZmluZSBHSVJCSUxfVFhFTiAgICAweDAxIC8qIEVuYWJsZSB0cmFuc21pdHRlciAqLworI2RlZmluZSBHSVJCSUxfUlhFTiAgICAweDAyIC8qIEVuYWJsZSByZWNlaXZlciAqLworI2RlZmluZSBHSVJCSUxfRUNBTiAgICAweDA0IC8qIENhbmNlbCBzZWxmIGVtbWl0ZWQgZGF0YSAqLworI2RlZmluZSBHSVJCSUxfRUNITyAgICAweDA4IC8qIEVjaG8gY29udHJvbCBjaGFyYWN0ZXJzICovCisKKy8qIExFRCBDdXJyZW50IFJlZ2lzdGVyICgweDIpICovCisjZGVmaW5lIEdJUkJJTF9ISUdIICAgIDB4MjAKKyNkZWZpbmUgR0lSQklMX01FRElVTSAgMHgyMQorI2RlZmluZSBHSVJCSUxfTE9XICAgICAweDIyCisKKy8qIEJhdWQgcmVnaXN0ZXIgKDB4MykgKi8KKyNkZWZpbmUgR0lSQklMXzI0MDAgICAgMHgzMAorI2RlZmluZSBHSVJCSUxfNDgwMCAgICAweDMxCQorI2RlZmluZSBHSVJCSUxfOTYwMCAgICAweDMyCisjZGVmaW5lIEdJUkJJTF8xOTIwMCAgIDB4MzMKKyNkZWZpbmUgR0lSQklMXzM4NDAwICAgMHgzNAkKKyNkZWZpbmUgR0lSQklMXzU3NjAwICAgMHgzNQkKKyNkZWZpbmUgR0lSQklMXzExNTIwMCAgMHgzNgorCisvKiBNb2RlIHJlZ2lzdGVyICgweDQpICovCisjZGVmaW5lIEdJUkJJTF9JUkRBICAgIDB4NDAKKyNkZWZpbmUgR0lSQklMX0FTSyAgICAgMHg0MQorCisvKiBDb250cm9sIHJlZ2lzdGVyIDIgKDB4NSkgKi8KKyNkZWZpbmUgR0lSQklMX0xPQUQgICAgMHg1MSAvKiBMb2FkIHRoZSBuZXcgYmF1ZCByYXRlIHZhbHVlICovCisKK3N0YXRpYyBzdHJ1Y3QgZG9uZ2xlX3JlZyBkb25nbGUgPSB7CisJLnR5cGUgPSBJUkRBX0dJUkJJTF9ET05HTEUsCisJLm9wZW4gPSBnaXJiaWxfb3BlbiwKKwkuY2xvc2UgPSBnaXJiaWxfY2xvc2UsCisJLnJlc2V0ID0gZ2lyYmlsX3Jlc2V0LAorCS5jaGFuZ2Vfc3BlZWQgPSBnaXJiaWxfY2hhbmdlX3NwZWVkLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZ2lyYmlsX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaXJkYV9kZXZpY2VfcmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZ2lyYmlsX2NsZWFudXAodm9pZCkKK3sKKwlpcmRhX2RldmljZV91bnJlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKK30KKworc3RhdGljIHZvaWQgZ2lyYmlsX29wZW4oZG9uZ2xlX3QgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKQoreworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHxJUl8xMTUyMDA7CisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDAzOworfQorCitzdGF0aWMgdm9pZCBnaXJiaWxfY2xvc2UoZG9uZ2xlX3QgKnNlbGYpCit7CisJLyogUG93ZXIgb2ZmIGRvbmdsZSAqLworCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIEZBTFNFKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGdpcmJpbF9jaGFuZ2Vfc3BlZWQgKGRldiwgc3BlZWQpCisgKgorICogICAgU2V0IHRoZSBzcGVlZCBmb3IgdGhlIEdpcmJpbCB0eXBlIGRvbmdsZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgZ2lyYmlsX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCWRvbmdsZV90ICpzZWxmID0gKGRvbmdsZV90ICopIHRhc2stPmluc3RhbmNlOworCV9fdTMyIHNwZWVkID0gKF9fdTMyKSB0YXNrLT5wYXJhbTsKKwlfX3U4IGNvbnRyb2xbMl07CisJaW50IHJldCA9IDA7CisKKwlzZWxmLT5zcGVlZF90YXNrID0gdGFzazsKKworCXN3aXRjaCAodGFzay0+c3RhdGUpIHsKKwljYXNlIElSREFfVEFTS19JTklUOgorCQkvKiBOZWVkIHRvIHJlc2V0IHRoZSBkb25nbGUgYW5kIGdvIHRvIDk2MDAgYnBzIGJlZm9yZQorICAgICAgICAgICAgICAgICAgIHByb2dyYW1taW5nICovCisJCWlmIChpcmRhX3Rhc2tfZXhlY3V0ZShzZWxmLCBnaXJiaWxfcmVzZXQsIE5VTEwsIHRhc2ssIAorCQkJCSAgICAgICh2b2lkICopIHNwZWVkKSkKKwkJeworCQkJLyogRG9uZ2xlIG5lZWQgbW9yZSB0aW1lIHRvIHJlc2V0ICovCisJCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfQ0hJTERfV0FJVCk7CisKKwkJCS8qIEdpdmUgcmVzZXQgMSBzZWMgdG8gZmluaXNoICovCisJCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCQl9CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX0NISUxEX1dBSVQ6CisJCUlSREFfV0FSTklORygiJXMoKSwgcmVzZXR0aW5nIGRvbmdsZSB0aW1lZCBvdXQhXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfQ0hJTERfRE9ORToKKwkJLyogU2V0IERUUiBhbmQgQ2xlYXIgUlRTIHRvIGVudGVyIGNvbW1hbmQgbW9kZSAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBUUlVFKTsKKworCQlzd2l0Y2ggKHNwZWVkKSB7CisJCWNhc2UgOTYwMDoKKwkJZGVmYXVsdDoKKwkJCWNvbnRyb2xbMF0gPSBHSVJCSUxfOTYwMDsKKwkJCWJyZWFrOworCQljYXNlIDE5MjAwOgorCQkJY29udHJvbFswXSA9IEdJUkJJTF8xOTIwMDsKKwkJCWJyZWFrOworCQljYXNlIDM0ODAwOgorCQkJY29udHJvbFswXSA9IEdJUkJJTF8zODQwMDsKKwkJCWJyZWFrOworCQljYXNlIDU3NjAwOgorCQkJY29udHJvbFswXSA9IEdJUkJJTF81NzYwMDsKKwkJCWJyZWFrOworCQljYXNlIDExNTIwMDoKKwkJCWNvbnRyb2xbMF0gPSBHSVJCSUxfMTE1MjAwOworCQkJYnJlYWs7CisJCX0KKwkJY29udHJvbFsxXSA9IEdJUkJJTF9MT0FEOworCQkKKwkJLyogV3JpdGUgY29udHJvbCBieXRlcyAqLworCQlzZWxmLT53cml0ZShzZWxmLT5kZXYsIGNvbnRyb2wsIDIpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVCk7CisJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfV0FJVDoKKwkJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCXNlbGYtPnNwZWVkX3Rhc2sgPSBOVUxMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0VSUk9SKCIlcygpLCB1bmtub3duIHN0YXRlICVkXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCB0YXNrLT5zdGF0ZSk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwkJc2VsZi0+c3BlZWRfdGFzayA9IE5VTEw7CisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGdpcmJpbF9yZXNldCAoZHJpdmVyKQorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIGdpcmJpbCBkb25nbGUuCisgKgorICogICAgICBBbGdvcml0aG06CisgKiAgICAJICAwLiBzZXQgUlRTLCBhbmQgd2FpdCBhdCBsZWFzdCA1IG1zIAorICogICAgICAgIDEuIGNsZWFyIFJUUyAKKyAqLworc3RhdGljIGludCBnaXJiaWxfcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlkb25nbGVfdCAqc2VsZiA9IChkb25nbGVfdCAqKSB0YXNrLT5pbnN0YW5jZTsKKwlfX3U4IGNvbnRyb2wgPSBHSVJCSUxfVFhFTiB8IEdJUkJJTF9SWEVOOworCWludCByZXQgPSAwOworCisJc2VsZi0+cmVzZXRfdGFzayA9IHRhc2s7CisKKwlzd2l0Y2ggKHRhc2stPnN0YXRlKSB7CisJY2FzZSBJUkRBX1RBU0tfSU5JVDoKKwkJLyogUmVzZXQgZG9uZ2xlICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgRkFMU0UpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDEpOworCQkvKiBTbGVlcCBhdCBsZWFzdCA1IG1zICovCisJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMjApOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19XQUlUMToKKwkJLyogU2V0IERUUiBhbmQgY2xlYXIgUlRTIHRvIGVudGVyIGNvbW1hbmQgbW9kZSAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBUUlVFKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQyKTsKKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcygyMCk7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX1dBSVQyOgorCQkvKiBXcml0ZSBjb250cm9sIGJ5dGUgKi8KKwkJc2VsZi0+d3JpdGUoc2VsZi0+ZGV2LCAmY29udHJvbCwgMSk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19XQUlUMyk7CisJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMjApOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19XQUlUMzoKKwkJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCXNlbGYtPnJlc2V0X3Rhc2sgPSBOVUxMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJUkRBX0VSUk9SKCIlcygpLCB1bmtub3duIHN0YXRlICVkXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCB0YXNrLT5zdGF0ZSk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwkJc2VsZi0+cmVzZXRfdGFzayA9IE5VTEw7CisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJHcmVlbndpY2ggR0lyQklMIGRvbmdsZSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXJkYS1kb25nbGUtNCIpOyAvKiBJUkRBX0dJUkJJTF9ET05HTEUgKi8KKwkKKy8qCisgKiBGdW5jdGlvbiBpbml0X21vZHVsZSAodm9pZCkKKyAqCisgKiAgICBJbml0aWFsaXplIEdpcmJpbCBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9pbml0KGdpcmJpbF9pbml0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGNsZWFudXBfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIENsZWFudXAgR2lyYmlsIG1vZHVsZQorICoKKyAqLworbW9kdWxlX2V4aXQoZ2lyYmlsX2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmMgYi9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZlMDAyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuYwpAQCAtMCwwICsxLDE2MDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZpbGVuYW1lOiAgICAgIGlyZGEtdXNiLmMKKyAqIFZlcnNpb246ICAgICAgIDAuOWIKKyAqIERlc2NyaXB0aW9uOiAgIElyREEtVVNCIERyaXZlcgorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsIAorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ0BicmF0dGxpLm5ldD4KKyAqCisgKglDb3B5cmlnaHQgKEMpIDIwMDAsIFJvbWFuIFdlaXNzZ2FlcmJlciA8d2Vpc3NnQHZpZW5uYS5hdD4KKyAqICAgICAgQ29weXJpZ2h0IChDKSAyMDAxLCBEYWcgQnJhdHRsaSA8ZGFnQGJyYXR0bGkubmV0PgorICogICAgICBDb3B5cmlnaHQgKEMpIDIwMDEsIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KKyAqICAgICAgICAgIAorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJCQkgICAgSU1QT1JUQU5UIE5PVEUKKyAqCQkJICAgIC0tLS0tLS0tLS0tLS0tCisgKgorICogQXMgb2Yga2VybmVsIDIuNS4yMCwgdGhpcyBpcyB0aGUgc3RhdGUgb2YgY29tcGxpYW5jZSBhbmQgdGVzdGluZyBvZgorICogdGhpcyBkcml2ZXIgKGlyZGEtdXNiKSB3aXRoIHJlZ2FyZHMgdG8gdGhlIFVTQiBsb3cgbGV2ZWwgZHJpdmVycy4uLgorICoKKyAqIFRoaXMgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZCBTVUNDRVNTRlVMTFkgd2l0aCB0aGUgZm9sbG93aW5nIGRyaXZlcnMgOgorICoJbyB1c2ItdWhjaS1oY2QJKEZvciBJbnRlbC9WaWEgVVNCIGNvbnRyb2xsZXJzKQorICoJbyB1aGNpLWhjZAkoQWx0ZXJuYXRlL0pFIGRyaXZlciBmb3IgSW50ZWwvVmlhIFVTQiBjb250cm9sbGVycykKKyAqCW8gb2hjaS1oY2QJKEZvciBvdGhlciBVU0IgY29udHJvbGxlcnMpCisgKgorICogVGhpcyBkcml2ZXIgaGFzIE5PVCBiZWVuIHRlc3RlZCB3aXRoIHRoZSBmb2xsb3dpbmcgZHJpdmVycyA6CisgKglvIGVoY2ktaGNkCShVU0IgMi4wIGNvbnRyb2xsZXJzKQorICoKKyAqIE5vdGUgdGhhdCBhbGwgSENEIGRyaXZlcnMgZG8gVVJCX1pFUk9fUEFDS0VUIGFuZCB0aW1lb3V0IHByb3Blcmx5LAorICogc28gd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGF0IGFueW1vcmUuCisgKiBPbmUgY29tbW9uIHByb2JsZW0gaXMgdGhlIGZhaWx1cmUgdG8gc2V0IHRoZSBhZGRyZXNzIG9uIHRoZSBkb25nbGUsCisgKiBidXQgdGhpcyBoYXBwZW5zIGJlZm9yZSB0aGUgZHJpdmVyIGdldHMgbG9hZGVkLi4uCisgKgorICogSmVhbiBJSQorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisjaW5jbHVkZSAiaXJkYS11c2IuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IHFvc19tdHRfYml0cyA9IDA7CisKKy8qIFRoZXNlIGFyZSB0aGUgY3VycmVudGx5IGtub3duIElyREEgVVNCIGRvbmdsZXMuIEFkZCBuZXcgZG9uZ2xlcyBoZXJlICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgZG9uZ2xlc1tdID0geworCS8qIEFDVGlTWVMgQ29ycC4sICBBQ1QtSVIyMDAwVSBGSVItVVNCIEFkYXB0ZXIgKi8KKwl7IFVTQl9ERVZJQ0UoMHg5YzQsIDB4MDExKSwgLmRyaXZlcl9pbmZvID0gSVVDX1NQRUVEX0JVRyB8IElVQ19OT19XSU5ET1cgfSwKKwkvKiBMb29rIGxpa2UgQUNUaVNZUywgUmVwb3J0IDogSUJNIENvcnAuLCBJQk0gVWx0cmFQb3J0IElyREEgKi8KKwl7IFVTQl9ERVZJQ0UoMHg0NDI4LCAweDAxMiksIC5kcml2ZXJfaW5mbyA9IElVQ19TUEVFRF9CVUcgfCBJVUNfTk9fV0lORE9XIH0sCisJLyogS0MgVGVjaG5vbG9neSBJbmMuLCAgS0MtMTgwIFVTQiBJckRBIERldmljZSAqLworCXsgVVNCX0RFVklDRSgweDUwZiwgMHgxODApLCAuZHJpdmVyX2luZm8gPSBJVUNfU1BFRURfQlVHIHwgSVVDX05PX1dJTkRPVyB9LAorCS8qIEV4dGVuZGVkIFN5c3RlbXMsIEluYy4sICBYVE5EQWNjZXNzIElyREEgVVNCIChFU0ktOTY4NSkgKi8KKwl7IFVTQl9ERVZJQ0UoMHg4ZTksIDB4MTAwKSwgLmRyaXZlcl9pbmZvID0gSVVDX1NQRUVEX0JVRyB8IElVQ19OT19XSU5ET1cgfSwKKwl7IC5tYXRjaF9mbGFncyA9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0NMQVNTIHwKKwkgICAgICAgICAgICAgICBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9TVUJDTEFTUywKKwkgIC5iSW50ZXJmYWNlQ2xhc3MgPSBVU0JfQ0xBU1NfQVBQX1NQRUMsCisJICAuYkludGVyZmFjZVN1YkNsYXNzID0gVVNCX0NMQVNTX0lSREEsCisJICAuZHJpdmVyX2luZm8gPSBJVUNfREVGQVVMVCwgfSwKKwl7IH0sIC8qIFRoZSBlbmQgKi8KK307CisKKy8qCisgKiBJbXBvcnRhbnQgbm90ZSA6CisgKiBEZXZpY2VzIGJhc2VkIG9uIHRoZSBTaWdtYVRlbCBjaGlwc2V0ICgweDY2ZiwgMHg0MjAwKSBhcmUgbm90IGRlc2lnbmVkCisgKiB1c2luZyB0aGUgIlVTQi1JckRBIHNwZWNpZmljYXRpb24iICh5ZXMsIHRoZXJlIGV4aXN0IHN1Y2ggYSB0aGluZyksIGFuZAorICogdGhlcmVmb3JlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIgKGRvbid0IGFkZCB0aGVtIGFib3ZlKS4KKyAqIFRoZXJlIGlzIGEgTGludXggZHJpdmVyLCBzdGlyNDIwMCwgdGhhdCBzdXBwb3J0IHRob3NlIFVTQiBkZXZpY2VzLgorICogSmVhbiBJSQorICovCisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBkb25nbGVzKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgc3RydWN0IGlyZGFfY2xhc3NfZGVzYyAqaXJkYV91c2JfZmluZF9jbGFzc19kZXNjKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKK3N0YXRpYyB2b2lkIGlyZGFfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOworc3RhdGljIHZvaWQgaXJkYV91c2JfY2hhbmdlX3NwZWVkX3hib2ZzKHN0cnVjdCBpcmRhX3VzYl9jYiAqc2VsZik7CitzdGF0aWMgaW50IGlyZGFfdXNiX2hhcmRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaXJkYV91c2Jfb3BlbihzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYpOworc3RhdGljIHZvaWQgaXJkYV91c2JfY2xvc2Uoc3RydWN0IGlyZGFfdXNiX2NiICpzZWxmKTsKK3N0YXRpYyB2b2lkIHNwZWVkX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCB3cml0ZV9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgaXJkYV91c2JfcmVjZWl2ZShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgaXJkYV91c2JfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGlyZGFfdXNiX25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaXJkYV91c2JfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIHZvaWQgaXJkYV91c2JfbmV0X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlyZGFfdXNiX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogVFJBTlNNSVQgUk9VVElORVMgKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFJlY2VpdmUgcGFja2V0cyBmcm9tIHRoZSBJckRBIHN0YWNrIGFuZCBzZW5kIHRoZW0gb24gdGhlIFVTQiBwaXBlLgorICogSGFuZGxlIHNwZWVkIGNoYW5nZSwgdGltZW91dCBhbmQgbG90J3Mgb2YgdWdsaW5lc3MuLi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJkYV91c2JfYnVpbGRfaGVhZGVyKHNlbGYsIHNrYiwgaGVhZGVyKQorICoKKyAqICAgQnVpbGRzIFVTQi1JckRBIG91dGJvdW5kIGhlYWRlcgorICoKKyAqIFdoZW4gd2Ugc2VuZCBhbiBJckRBIGZyYW1lIG92ZXIgYW4gVVNCIHBpcGUsIHdlIGFkZCB0byBpdCBhIDEgYnl0ZQorICogaGVhZGVyLiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZSB0aGlzIGhlYWRlciB3aXRoIHRoZSBwcm9wZXIgdmFsdWVzLgorICoKKyAqIEltcG9ydGFudCBub3RlIDogdGhlIFVTQi1JckRBIHNwZWMgMS4wIHNheSB2ZXJ5IGNsZWFybHkgaW4gY2hhcHRlciA1LjQuMi4yCisgKiB0aGF0IHRoZSBzZXR0aW5nIG9mIHRoZSBsaW5rIHNwZWVkIGFuZCB4Ym9mIG51bWJlciBpbiB0aGlzIG91dGJvdW5kIGhlYWRlcgorICogc2hvdWxkIGJlIGFwcGxpZWQgKkFGVEVSKiB0aGUgZnJhbWUgaGFzIGJlZW4gc2VudC4KKyAqIFVuZm9ydHVuYXRlbHksIHNvbWUgZGV2aWNlcyBhcmUgbm90IGNvbXBsaWFudCB3aXRoIHRoYXQuLi4gSXQgc2VlbXMgdGhhdAorICogcmVhZGluZyB0aGUgc3BlYyBpcyBmYXIgdG9vIGRpZmZpY3VsdC4uLgorICogSmVhbiBJSQorICovCitzdGF0aWMgdm9pZCBpcmRhX3VzYl9idWlsZF9oZWFkZXIoc3RydWN0IGlyZGFfdXNiX2NiICpzZWxmLAorCQkJCSAgX191OCAqaGVhZGVyLAorCQkJCSAgaW50CWZvcmNlKQoreworCS8qIFNldCB0aGUgbmVnb3RpYXRlZCBsaW5rIHNwZWVkICovCisJaWYgKHNlbGYtPm5ld19zcGVlZCAhPSAtMSkgeworCQkvKiBIdW0uLi4gVWdseSBoYWNrIDotKAorCQkgKiBTb21lIGRldmljZSBhcmUgbm90IGNvbXBsaWFudCB3aXRoIHRoZSBzcGVjIGFuZCBjaGFuZ2UKKwkJICogcGFyYW1ldGVycyAqYmVmb3JlKiBzZW5kaW5nIHRoZSBmcmFtZS4gLSBKZWFuIElJCisJCSAqLworCQlpZiAoKHNlbGYtPmNhcGFiaWxpdHkgJiBJVUNfU1BFRURfQlVHKSAmJgorCQkgICAgKCFmb3JjZSkgJiYgKHNlbGYtPnNwZWVkICE9IC0xKSkgeworCQkJLyogTm8gc3BlZWQgYW5kIHhib2ZzIGNoYW5nZSBoZXJlCisJCQkgKiAod2UnbGwgZG8gaXQgbGF0ZXIgaW4gdGhlIHdyaXRlIGNhbGxiYWNrKSAqLworCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgbm90IGNoYW5naW5nIHNwZWVkIHlldFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCSpoZWFkZXIgPSAwOworCQkJcmV0dXJuOworCQl9CisKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSwgY2hhbmdpbmcgc3BlZWQgdG8gJWRcbiIsIF9fRlVOQ1RJT05fXywgc2VsZi0+bmV3X3NwZWVkKTsKKwkJc2VsZi0+c3BlZWQgPSBzZWxmLT5uZXdfc3BlZWQ7CisJCS8qIFdlIHdpbGwgZG8gYCBzZWxmLT5uZXdfc3BlZWQgPSAtMTsgJyBpbiB0aGUgY29tcGxldGlvbgorCQkgKiBoYW5kbGVyIGp1c3QgaW4gY2FzZSB0aGUgY3VycmVudCBVUkIgZmFpbCAtIEplYW4gSUkgKi8KKworCQlzd2l0Y2ggKHNlbGYtPnNwZWVkKSB7CisJCWNhc2UgMjQwMDoKKwkJICAgICAgICAqaGVhZGVyID0gU1BFRURfMjQwMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQljYXNlIDk2MDA6CisJCQkqaGVhZGVyID0gU1BFRURfOTYwMDsKKwkJCWJyZWFrOworCQljYXNlIDE5MjAwOgorCQkJKmhlYWRlciA9IFNQRUVEXzE5MjAwOworCQkJYnJlYWs7CisJCWNhc2UgMzg0MDA6CisJCQkqaGVhZGVyID0gU1BFRURfMzg0MDA7CisJCQlicmVhazsKKwkJY2FzZSA1NzYwMDoKKwkJICAgICAgICAqaGVhZGVyID0gU1BFRURfNTc2MDA7CisJCQlicmVhazsKKwkJY2FzZSAxMTUyMDA6CisJCSAgICAgICAgKmhlYWRlciA9IFNQRUVEXzExNTIwMDsKKwkJCWJyZWFrOworCQljYXNlIDU3NjAwMDoKKwkJICAgICAgICAqaGVhZGVyID0gU1BFRURfNTc2MDAwOworCQkJYnJlYWs7CisJCWNhc2UgMTE1MjAwMDoKKwkJICAgICAgICAqaGVhZGVyID0gU1BFRURfMTE1MjAwMDsKKwkJCWJyZWFrOworCQljYXNlIDQwMDAwMDA6CisJCSAgICAgICAgKmhlYWRlciA9IFNQRUVEXzQwMDAwMDA7CisJCQlzZWxmLT5uZXdfeGJvZnMgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UKKwkJLyogTm8gY2hhbmdlICovCisJCSpoZWFkZXIgPSAwOworCQorCS8qIFNldCB0aGUgbmVnb3RpYXRlZCBhZGRpdGlvbmFsIFhCT0ZTICovCisJaWYgKHNlbGYtPm5ld194Ym9mcyAhPSAtMSkgeworCQlJUkRBX0RFQlVHKDIsICIlcygpLCBjaGFuZ2luZyB4Ym9mcyB0byAlZFxuIiwgX19GVU5DVElPTl9fLCBzZWxmLT5uZXdfeGJvZnMpOworCQlzZWxmLT54Ym9mcyA9IHNlbGYtPm5ld194Ym9mczsKKwkJLyogV2Ugd2lsbCBkbyBgIHNlbGYtPm5ld194Ym9mcyA9IC0xOyAnIGluIHRoZSBjb21wbGV0aW9uCisJCSAqIGhhbmRsZXIganVzdCBpbiBjYXNlIHRoZSBjdXJyZW50IFVSQiBmYWlsIC0gSmVhbiBJSSAqLworCisJCXN3aXRjaCAoc2VsZi0+eGJvZnMpIHsKKwkJY2FzZSA0ODoKKwkJCSpoZWFkZXIgfD0gMHgxMDsKKwkJCWJyZWFrOworCQljYXNlIDI4OgorCQljYXNlIDI0OgkvKiBVU0Igc3BlYyAxLjAgc2F5cyAyNCAqLworCQkJKmhlYWRlciB8PSAweDIwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCWNhc2UgMTI6CisJCQkqaGVhZGVyIHw9IDB4MzA7CisJCQlicmVhazsKKwkJY2FzZSA1OiAvKiBCdWcgaW4gSXJMQVAgc3BlYz8gKHNob3VsZCBiZSA2KSAqLworCQljYXNlIDY6CisJCQkqaGVhZGVyIHw9IDB4NDA7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJKmhlYWRlciB8PSAweDUwOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCSpoZWFkZXIgfD0gMHg2MDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQkqaGVhZGVyIHw9IDB4NzA7CisJCQlicmVhazsKKwkJY2FzZSAwOgorCQkJKmhlYWRlciB8PSAweDgwOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTZW5kIGEgY29tbWFuZCB0byBjaGFuZ2UgdGhlIHNwZWVkIG9mIHRoZSBkb25nbGUKKyAqIE5lZWQgdG8gYmUgY2FsbGVkIHdpdGggc3BpbmxvY2sgb24uCisgKi8KK3N0YXRpYyB2b2lkIGlyZGFfdXNiX2NoYW5nZV9zcGVlZF94Ym9mcyhzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYpCit7CisJX191OCAqZnJhbWU7CisJc3RydWN0IHVyYiAqdXJiOworCWludCByZXQ7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBzcGVlZD0lZCwgeGJvZnM9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgc2VsZi0+bmV3X3NwZWVkLCBzZWxmLT5uZXdfeGJvZnMpOworCisJLyogR3JhYiB0aGUgc3BlZWQgVVJCICovCisJdXJiID0gc2VsZi0+c3BlZWRfdXJiOworCWlmICh1cmItPnN0YXR1cyAhPSAwKSB7CisJCUlSREFfV0FSTklORygiJXMoKSwgVVJCIHN0aWxsIGluIHVzZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBBbGxvY2F0ZSB0aGUgZmFrZSBmcmFtZSAqLworCWZyYW1lID0gc2VsZi0+c3BlZWRfYnVmZjsKKworCS8qIFNldCB0aGUgbmV3IHNwZWVkIGFuZCB4Ym9mcyBpbiB0aGlzIGZha2UgZnJhbWUgKi8KKwlpcmRhX3VzYl9idWlsZF9oZWFkZXIoc2VsZiwgZnJhbWUsIDEpOworCisJLyogU3VibWl0IHRoZSAwIGxlbmd0aCBJckRBIGZyYW1lIHRvIHRyaWdnZXIgbmV3IHNwZWVkIHNldHRpbmdzICovCisgICAgICAgIHVzYl9maWxsX2J1bGtfdXJiKHVyYiwgc2VsZi0+dXNiZGV2LAorCQkgICAgICB1c2Jfc25kYnVsa3BpcGUoc2VsZi0+dXNiZGV2LCBzZWxmLT5idWxrX291dF9lcCksCisgICAgICAgICAgICAgICAgICAgICAgZnJhbWUsIElSREFfVVNCX1NQRUVEX01UVSwKKyAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9idWxrX2NhbGxiYWNrLCBzZWxmKTsKKwl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBVU0JfSVJEQV9IRUFERVI7CisJdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9BU1lOQ19VTkxJTks7CisKKwkvKiBJcnEgZGlzYWJsZWQgLT4gR0ZQX0FUT01JQyAqLworCWlmICgocmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSkpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBmYWlsZWQgU3BlZWQgVVJCXG4iLCBfX0ZVTkNUSU9OX18pOworCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNwZWVkIFVSQiBjYWxsYmFjaworICogTm93LCB3ZSBjYW4gb25seSBnZXQgY2FsbGVkIGZvciB0aGUgc3BlZWQgVVJCLgorICovCitzdGF0aWMgdm9pZCBzcGVlZF9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGlyZGFfdXNiX2NiICpzZWxmID0gdXJiLT5jb250ZXh0OworCQorCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBXZSBzaG91bGQgYWx3YXlzIGhhdmUgYSBjb250ZXh0ICovCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwkvKiBXZSBzaG91bGQgYWx3YXlzIGJlIGNhbGxlZCBmb3IgdGhlIHNwZWVkIFVSQiAqLworCUlSREFfQVNTRVJUKHVyYiA9PSBzZWxmLT5zcGVlZF91cmIsIHJldHVybjspOworCisJLyogQ2hlY2sgZm9yIHRpbWVvdXQgYW5kIG90aGVyIFVTQiBuYXN0aWVzICovCisJaWYgKHVyYi0+c3RhdHVzICE9IDApIHsKKwkJLyogSSBnZXQgYSBsb3Qgb2YgLUVDT05OQUJPUlRFRCA9IC0xMDMgaGVyZSAtIEplYW4gSUkgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVVJCIGNvbXBsZXRlIHN0YXR1cyAlZCwgdHJhbnNmZXJfZmxhZ3MgMHglMDRYXG4iLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzLCB1cmItPnRyYW5zZmVyX2ZsYWdzKTsKKworCQkvKiBEb24ndCBkbyBhbnl0aGluZyBoZXJlLCB0aGF0IG1pZ2h0IGNvbmZ1c2UgdGhlIFVTQiBsYXllci4KKwkJICogSW5zdGVhZCwgd2Ugd2lsbCB3YWl0IGZvciBpcmRhX3VzYl9uZXRfdGltZW91dCgpLCB0aGUKKwkJICogbmV0d29yayBsYXllciB3YXRjaGRvZywgdG8gZml4IHRoZSBzaXR1YXRpb24uCisJCSAqIEplYW4gSUkgKi8KKwkJLyogQSByZXNldCBvZiB0aGUgZG9uZ2xlIG1pZ2h0IGJlIHdlbGNvbWVkIGhlcmUgLSBKZWFuIElJICovCisJCXJldHVybjsKKwl9CisKKwkvKiB1cmIgaXMgbm93IGF2YWlsYWJsZSAqLworCS8vdXJiLT5zdGF0dXMgPSAwOyAtPiB0ZXN0ZWQgYWJvdmUKKworCS8qIE5ldyBzcGVlZCBhbmQgeGJvZiBpcyBub3cgY29tbWl0ZWQgaW4gaGFyZHdhcmUgKi8KKwlzZWxmLT5uZXdfc3BlZWQgPSAtMTsKKwlzZWxmLT5uZXdfeGJvZnMgPSAtMTsKKworCS8qIEFsbG93IHRoZSBzdGFjayB0byBzZW5kIG1vcmUgcGFja2V0cyAqLworCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNlbmQgYW4gSXJEQSBmcmFtZSB0byB0aGUgVVNCIGRvbmdsZSAoZm9yIHRyYW5zbWlzc2lvbikKKyAqLworc3RhdGljIGludCBpcmRhX3VzYl9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IHVyYiAqdXJiID0gc2VsZi0+dHhfdXJiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJczMyIHNwZWVkOworCXMxNiB4Ym9mczsKKwlpbnQgcmVzLCBtdHQ7CisJaW50CWVyciA9IDE7CS8qIEZhaWxlZCAqLworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSBvbiAlc1xuIiwgX19GVU5DVElPTl9fLCBuZXRkZXYtPm5hbWUpOworCisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCisJLyogUHJvdGVjdCB1cyBmcm9tIFVTQiBjYWxsYmFja3MsIG5ldCB3YXRjaGRvZyBhbmQgZWxzZS4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgaWYgdGhlIGRldmljZSBpcyBzdGlsbCB0aGVyZS4KKwkgKiBXZSBuZWVkIHRvIGNoZWNrIHNlbGYtPnByZXNlbnQgdW5kZXIgdGhlIHNwaW5sb2NrIGJlY2F1c2UKKwkgKiBvZiBpcmRhX3VzYl9kaXNjb25uZWN0KCkgaXMgc3luY2hyb25vdXMgLSBKZWFuIElJICovCisJaWYgKCFzZWxmLT5wcmVzZW50KSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIERldmljZSBpcyBnb25lLi4uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGRyb3A7CisJfQorCisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIG51bWJlciBvZiB4Ym9mcyAqLworICAgICAgICB4Ym9mcyA9IGlyZGFfZ2V0X25leHRfeGJvZnMoc2tiKTsKKyAgICAgICAgaWYgKCh4Ym9mcyAhPSBzZWxmLT54Ym9mcykgJiYgKHhib2ZzICE9IC0xKSkgeworCQlzZWxmLT5uZXdfeGJvZnMgPSB4Ym9mczsKKwl9CisKKyAgICAgICAgLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkICovCisJc3BlZWQgPSBpcmRhX2dldF9uZXh0X3NwZWVkKHNrYik7CisJaWYgKChzcGVlZCAhPSBzZWxmLT5zcGVlZCkgJiYgKHNwZWVkICE9IC0xKSkgeworCQkvKiBTZXQgdGhlIGRlc2lyZWQgc3BlZWQgKi8KKwkJc2VsZi0+bmV3X3NwZWVkID0gc3BlZWQ7CisKKwkJLyogQ2hlY2sgZm9yIGVtcHR5IGZyYW1lICovCisJCWlmICghc2tiLT5sZW4pIHsKKwkJCS8qIElyTEFQIHNlbmQgdXMgYW4gZW1wdHkgZnJhbWUgdG8gbWFrZSB1cyBjaGFuZ2UgdGhlCisJCQkgKiBzcGVlZC4gQ2hhbmdpbmcgc3BlZWQgd2l0aCB0aGUgVVNCIGFkYXB0ZXIgaXMgaW4KKwkJCSAqIGZhY3Qgc2VuZGluZyBhbiBlbXB0eSBmcmFtZSB0byB0aGUgYWRhcHRlciwgc28gd2UKKwkJCSAqIGNvdWxkIGp1c3QgbGV0IHRoZSBwcmVzZW50IGZ1bmN0aW9uIGRvIGl0cyBqb2IuCisJCQkgKiBIb3dldmVyLCB3ZSB3b3VsZCB3YWl0IGZvciBtaW4gdHVybiB0aW1lLAorCQkJICogZG8gYW4gZXh0cmEgbWVtY3B5IGFuZCBpbmNyZW1lbnQgcGFja2V0IGNvdW50ZXJzLi4uCisJCQkgKiBKZWFuIElJICovCisJCQlpcmRhX3VzYl9jaGFuZ2Vfc3BlZWRfeGJvZnMoc2VsZik7CisJCQluZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCS8qIFdpbGwgbmV0aWZfd2FrZV9xdWV1ZSgpIGluIGNhbGxiYWNrICovCisJCQllcnIgPSAwOwkvKiBObyBlcnJvciAqLworCQkJZ290byBkcm9wOworCQl9CisJfQorCisJaWYgKHVyYi0+c3RhdHVzICE9IDApIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBVUkIgc3RpbGwgaW4gdXNlIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBkcm9wOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyByb29tIGZvciBJckRBLVVTQiBoZWFkZXIuIFRoZSBhY3R1YWwKKwkgKiBhbGxvY2F0aW9uIHdpbGwgYmUgZG9uZSBsb3dlciBpbiBza2JfcHVzaCgpLgorCSAqIEFsc28sIHdlIGRvbid0IHVzZSBkaXJlY3RseSBza2JfY293KCksIGJlY2F1c2UgaXQgcmVxdWlyZQorCSAqIGhlYWRyb29tID49IDE2LCB3aGljaCBmb3JjZSB1bm5lY2Vzc2FyeSBjb3BpZXMgLSBKZWFuIElJICovCisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgVVNCX0lSREFfSEVBREVSKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIEluc3VmaWNpZW50IHNrYiBoZWFkcm9vbS5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWlmIChza2JfY293KHNrYiwgVVNCX0lSREFfSEVBREVSKSkgeworCQkJSVJEQV9XQVJOSU5HKCIlcygpLCBmYWlsZWQgc2tiX2NvdygpICEhIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCX0KKworCS8qIENoYW5nZSBzZXR0aW5nIGZvciBuZXh0IGZyYW1lICovCisJaXJkYV91c2JfYnVpbGRfaGVhZGVyKHNlbGYsIHNrYl9wdXNoKHNrYiwgVVNCX0lSREFfSEVBREVSKSwgMCk7CisKKwkvKiBGSVhNRTogTWFrZSBtYWNybyBvdXQgb2YgdGhpcyBvbmUgKi8KKwkoKHN0cnVjdCBpcmRhX3NrYl9jYiAqKXNrYi0+Y2IpLT5jb250ZXh0ID0gc2VsZjsKKworICAgICAgICB1c2JfZmlsbF9idWxrX3VyYih1cmIsIHNlbGYtPnVzYmRldiwgCisJCSAgICAgIHVzYl9zbmRidWxrcGlwZShzZWxmLT51c2JkZXYsIHNlbGYtPmJ1bGtfb3V0X2VwKSwKKyAgICAgICAgICAgICAgICAgICAgICBza2ItPmRhdGEsIElSREFfU0tCX01BWF9NVFUsCisgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYnVsa19jYWxsYmFjaywgc2tiKTsKKwl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBza2ItPmxlbjsKKwkvKiBOb3RlIDogdW5saW5rICptdXN0KiBiZSBBc3luY2hyb25vdXMgYmVjYXVzZSBvZiB0aGUgY29kZSBpbiAKKwkgKiBpcmRhX3VzYl9uZXRfdGltZW91dCgpIC0+IGNhbGwgaW4gaXJxIC0gSmVhbiBJSSAqLworCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfQVNZTkNfVU5MSU5LOworCS8qIFRoaXMgZmxhZyAoVVJCX1pFUk9fUEFDS0VUKSBpbmRpY2F0ZXMgdGhhdCB3aGF0IHdlIHNlbmQgaXMgbm90CisJICogYSBjb250aW51b3VzIHN0cmVhbSBvZiBkYXRhIGJ1dCBzZXBhcmF0ZSBwYWNrZXRzLgorCSAqIEluIHRoaXMgY2FzZSwgdGhlIFVTQiBsYXllciB3aWxsIGluc2VydCBhbiBlbXB0eSBVU0IgZnJhbWUgKFREKQorCSAqIGFmdGVyIGVhY2ggb2Ygb3VyIHBhY2tldHMgdGhhdCBpcyBleGFjdCBtdWx0aXBsZSBvZiB0aGUgZnJhbWUgc2l6ZS4KKwkgKiBUaGlzIGlzIGhvdyB0aGUgZG9uZ2xlIHdpbGwgZGV0ZWN0IHRoZSBlbmQgb2YgcGFja2V0IC0gSmVhbiBJSSAqLworCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX1pFUk9fUEFDS0VUOworCisJLyogR2VuZXJhdGUgbWluIHR1cm4gdGltZS4gRklYTUU6IGNhbiB3ZSBkbyBiZXR0ZXIgdGhhbiB0aGlzPyAqLworCS8qIFRyeWluZyB0byBhIHR1cm5hcm91bmQgdGltZSBhdCB0aGlzIGxldmVsIGlzIHRyeWluZyB0byBtZWFzdXJlCisJICogcHJvY2Vzc29yIGNsb2NrIGN5Y2xlIHdpdGggYSB3cmlzdC13YXRjaCwgYXBwcm94aW1hdGUgYXQgYmVzdC4uLgorCSAqCisJICogV2hhdCB3ZSBrbm93IGlzIHRoZSBsYXN0IHRpbWUgd2UgcmVjZWl2ZWQgYSBmcmFtZSBvdmVyIFVTQi4KKwkgKiBEdWUgdG8gbGF0ZW5jeSBvdmVyIFVTQiB0aGF0IGRlcGVuZCBvbiB0aGUgVVNCIGxvYWQsIHdlIGRvbid0CisJICoga25vdyB3aGVuIHRoaXMgZnJhbWUgd2FzIHJlY2VpdmVkIG92ZXIgSXJEQSAoYSBmZXcgbXMgYmVmb3JlID8pCisJICogVGhlbiwgc2FtZSBzdG9yeSBmb3Igb3VyIG91dGdvaW5nIGZyYW1lLi4uCisJICoKKwkgKiBJbiB0aGVvcnksIHRoZSBVU0IgZG9uZ2xlIGlzIHN1cHBvc2VkIHRvIGhhbmRsZSB0aGUgdHVybmFyb3VuZAorCSAqIGJ5IGl0c2VsZiAoc3BlYyAxLjAsIGNoYXRlciA0LCBwYWdlIDYpLiBXaG8ga25vd3MgPz8/IFRoYXQncworCSAqIHdoeSB0aGlzIGNvZGUgaXMgZW5hYmxlZCBvbmx5IGZvciBkb25nbGVzIHRoYXQgZG9lc24ndCBtZWV0CisJICogdGhlIHNwZWMuCisJICogSmVhbiBJSSAqLworCWlmIChzZWxmLT5jYXBhYmlsaXR5ICYgSVVDX05PX1RVUk4pIHsKKwkJbXR0ID0gaXJkYV9nZXRfbXR0KHNrYik7CisJCWlmIChtdHQpIHsKKwkJCWludCBkaWZmOworCQkJZG9fZ2V0dGltZW9mZGF5KCZzZWxmLT5ub3cpOworCQkJZGlmZiA9IHNlbGYtPm5vdy50dl91c2VjIC0gc2VsZi0+c3RhbXAudHZfdXNlYzsKKyNpZmRlZiBJVV9VU0JfTUlOX1JUVAorCQkJLyogRmFjdG9yIGluIFVTQiBkZWxheXMgLT4gR2V0IHJpZCBvZiB1ZGVsYXkoKSB0aGF0CisJCQkgKiB3b3VsZCBiZSBsb3N0IGluIHRoZSBub2lzZSAtIEplYW4gSUkgKi8KKwkJCWRpZmYgKz0gSVVfVVNCX01JTl9SVFQ7CisjZW5kaWYgLyogSVVfVVNCX01JTl9SVFQgKi8KKwkJCS8qIElmIHRoZSB1c2VjIGNvdW50ZXIgZGlkIHdyYXBhcm91bmQsIHRoZSBkaWZmIHdpbGwKKwkJCSAqIGdvIG5lZ2F0aXZlICh0dl91c2VjIGlzIGEgbG9uZyksIHNvIHdlIG5lZWQgdG8KKwkJCSAqIGNvcnJlY3QgaXQgYnkgb25lIHNlY29uZC4gSmVhbiBJSSAqLworCQkJaWYgKGRpZmYgPCAwKQorCQkJCWRpZmYgKz0gMTAwMDAwMDsKKworCQkgICAgICAgIC8qIENoZWNrIGlmIHRoZSBtdHQgaXMgbGFyZ2VyIHRoYW4gdGhlIHRpbWUgd2UgaGF2ZQorCQkJICogYWxyZWFkeSB1c2VkIGJ5IGFsbCB0aGUgcHJvdG9jb2wgcHJvY2Vzc2luZworCQkJICovCisJCQlpZiAobXR0ID4gZGlmZikgeworCQkJCW10dCAtPSBkaWZmOworCQkJCWlmIChtdHQgPiAxMDAwKQorCQkJCQltZGVsYXkobXR0LzEwMDApOworCQkJCWVsc2UKKwkJCQkJdWRlbGF5KG10dCk7CisJCQl9CisJCX0KKwl9CisJCisJLyogQXNrIFVTQiB0byBzZW5kIHRoZSBwYWNrZXQgLSBJcnEgZGlzYWJsZWQgLT4gR0ZQX0FUT01JQyAqLworCWlmICgocmVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSkpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBmYWlsZWQgVHggVVJCXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzZWxmLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJLyogTGV0IFVTQiByZWNvdmVyIDogV2Ugd2lsbCBjYXRjaCB0aGF0IGluIHRoZSB3YXRjaGRvZyAqLworCQkvKm5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7Ki8KKwl9IGVsc2UgeworCQkvKiBJbmNyZW1lbnQgcGFja2V0IHN0YXRzICovCisJCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKyAgICAgICAgICAgICAgICBzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCisJCW5ldGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCisJcmV0dXJuIDA7CisKK2Ryb3A6CisJLyogRHJvcCBzaWxlbnRseSB0aGUgc2tiIGFuZCBleGl0ICovCisJZGV2X2tmcmVlX3NrYihza2IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZXJyOwkJLyogVXN1YWxseSAxICovCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBOb3RlIDogdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBvbmx5IGZvciB0eF91cmIuLi4KKyAqLworc3RhdGljIHZvaWQgd3JpdGVfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYgPSAoKHN0cnVjdCBpcmRhX3NrYl9jYiAqKSBza2ItPmNiKS0+Y29udGV4dDsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogV2Ugc2hvdWxkIGFsd2F5cyBoYXZlIGEgY29udGV4dCAqLworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJLyogV2Ugc2hvdWxkIGFsd2F5cyBiZSBjYWxsZWQgZm9yIHRoZSBzcGVlZCBVUkIgKi8KKwlJUkRBX0FTU0VSVCh1cmIgPT0gc2VsZi0+dHhfdXJiLCByZXR1cm47KTsKKworCS8qIEZyZWUgdXAgdGhlIHNrYiAqLworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJdXJiLT5jb250ZXh0ID0gTlVMTDsKKworCS8qIENoZWNrIGZvciB0aW1lb3V0IGFuZCBvdGhlciBVU0IgbmFzdGllcyAqLworCWlmICh1cmItPnN0YXR1cyAhPSAwKSB7CisJCS8qIEkgZ2V0IGEgbG90IG9mIC1FQ09OTkFCT1JURUQgPSAtMTAzIGhlcmUgLSBKZWFuIElJICovCisJCUlSREFfREVCVUcoMCwgIiVzKCksIFVSQiBjb21wbGV0ZSBzdGF0dXMgJWQsIHRyYW5zZmVyX2ZsYWdzIDB4JTA0WFxuIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cywgdXJiLT50cmFuc2Zlcl9mbGFncyk7CisKKwkJLyogRG9uJ3QgZG8gYW55dGhpbmcgaGVyZSwgdGhhdCBtaWdodCBjb25mdXNlIHRoZSBVU0IgbGF5ZXIsCisJCSAqIGFuZCB3ZSBjb3VsZCBnbyBpbiByZWN1cnNpb24gYW5kIGJsb3cgdGhlIGtlcm5lbCBzdGFjay4uLgorCQkgKiBJbnN0ZWFkLCB3ZSB3aWxsIHdhaXQgZm9yIGlyZGFfdXNiX25ldF90aW1lb3V0KCksIHRoZQorCQkgKiBuZXR3b3JrIGxheWVyIHdhdGNoZG9nLCB0byBmaXggdGhlIHNpdHVhdGlvbi4KKwkJICogSmVhbiBJSSAqLworCQkvKiBBIHJlc2V0IG9mIHRoZSBkb25nbGUgbWlnaHQgYmUgd2VsY29tZWQgaGVyZSAtIEplYW4gSUkgKi8KKwkJcmV0dXJuOworCX0KKworCS8qIHVyYiBpcyBub3cgYXZhaWxhYmxlICovCisJLy91cmItPnN0YXR1cyA9IDA7IC0+IHRlc3RlZCBhYm92ZQorCisJLyogTWFrZSBzdXJlIHdlIHJlYWQgc2VsZi0+cHJlc2VudCBwcm9wZXJseSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKwkvKiBJZiB0aGUgbmV0d29yayBpcyBjbG9zZWQsIHN0b3AgZXZlcnl0aGluZyAqLworCWlmICgoIXNlbGYtPm5ldG9wZW4pIHx8ICghc2VsZi0+cHJlc2VudCkpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgTmV0d29yayBpcyBnb25lLi4uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBJZiBjaGFuZ2VzIHRvIHNwZWVkIG9yIHhib2ZzIGlzIHBlbmRpbmcuLi4gKi8KKwlpZiAoKHNlbGYtPm5ld19zcGVlZCAhPSAtMSkgfHwgKHNlbGYtPm5ld194Ym9mcyAhPSAtMSkpIHsKKwkJaWYgKChzZWxmLT5uZXdfc3BlZWQgIT0gc2VsZi0+c3BlZWQpIHx8CisJCSAgICAoc2VsZi0+bmV3X3hib2ZzICE9IHNlbGYtPnhib2ZzKSkgeworCQkJLyogV2UgaGF2ZW4ndCBjaGFuZ2VkIHNwZWVkIHlldCAoYmVjYXVzZSBvZgorCQkJICogSVVDX1NQRUVEX0JVRyksIHNvIGRvIGl0IG5vdyAtIEplYW4gSUkgKi8KKwkJCUlSREFfREVCVUcoMSwgIiVzKCksIENoYW5naW5nIHNwZWVkIG5vdy4uLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWlyZGFfdXNiX2NoYW5nZV9zcGVlZF94Ym9mcyhzZWxmKTsKKwkJfSBlbHNlIHsKKwkJCS8qIE5ldyBzcGVlZCBhbmQgeGJvZiBpcyBub3cgY29tbWl0ZWQgaW4gaGFyZHdhcmUgKi8KKwkJCXNlbGYtPm5ld19zcGVlZCA9IC0xOworCQkJc2VsZi0+bmV3X3hib2ZzID0gLTE7CisJCQkvKiBEb25lLCB3YWl0aW5nIGZvciBuZXh0IHBhY2tldCAqLworCQkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworCQl9CisJfSBlbHNlIHsKKwkJLyogT3RoZXJ3aXNlLCBhbGxvdyB0aGUgc3RhY2sgdG8gc2VuZCBtb3JlIHBhY2tldHMgKi8KKwkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXYXRjaGRvZyB0aW1lciBmcm9tIHRoZSBuZXR3b3JrIGxheWVyLgorICogQWZ0ZXIgYSBwcmVkZXRlcm1pbmVkIHRpbWVvdXQsIGlmIHdlIGRvbid0IGdpdmUgY29uZmlybWF0aW9uIHRoYXQKKyAqIHRoZSBwYWNrZXQgaGFzIGJlZW4gc2VudCAoaS5lLiBubyBjYWxsIHRvIG5ldGlmX3dha2VfcXVldWUoKSksCisgKiB0aGUgbmV0d29yayBsYXllciB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbi4KKyAqIE5vdGUgdGhhdCBVUkIgdGhhdCB3ZSBzdWJtaXQgaGF2ZSBhbHNvIGEgdGltZW91dC4gV2hlbiB0aGUgVVJCIHRpbWVvdXQKKyAqIGV4cGlyZSwgdGhlIG5vcm1hbCBVUkIgY2FsbGJhY2sgaXMgY2FsbGVkICh3cml0ZV9idWxrX2NhbGxiYWNrKCkpLgorICovCitzdGF0aWMgdm9pZCBpcmRhX3VzYl9uZXRfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlyZGFfdXNiX2NiICpzZWxmID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCB1cmIgKnVyYjsKKwlpbnQJZG9uZSA9IDA7CS8qIElmIHdlIGhhdmUgbWFkZSBhbnkgcHJvZ3Jlc3MgKi8KKworCUlSREFfREVCVUcoMCwgIiVzKCksIE5ldHdvcmsgbGF5ZXIgdGhpbmtzIHdlIHRpbWVkIG91dCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKworCS8qIFByb3RlY3QgdXMgZnJvbSBVU0IgY2FsbGJhY2tzLCBuZXQgVHggYW5kIGVsc2UuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCS8qIHNlbGYtPnByZXNlbnQgKk1VU1QqIGJlIHJlYWQgdW5kZXIgc3BpbmxvY2sgKi8KKwlpZiAoIXNlbGYtPnByZXNlbnQpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBkZXZpY2Ugbm90IHByZXNlbnQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENoZWNrIHNwZWVkIFVSQiAqLworCXVyYiA9IHNlbGYtPnNwZWVkX3VyYjsKKwlpZiAodXJiLT5zdGF0dXMgIT0gMCkgeworCQlJUkRBX0RFQlVHKDAsICIlczogU3BlZWQgY2hhbmdlIHRpbWVkIG91dCwgdXJiLT5zdGF0dXM9JWQsIHVyYi0+dHJhbnNmZXJfZmxhZ3M9MHglMDRYXG4iLCBuZXRkZXYtPm5hbWUsIHVyYi0+c3RhdHVzLCB1cmItPnRyYW5zZmVyX2ZsYWdzKTsKKworCQlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJCWNhc2UgLUVJTlBST0dSRVNTOgorCQkJdXNiX3VubGlua191cmIodXJiKTsKKwkJCS8qIE5vdGUgOiBhYm92ZSB3aWxsICAqTk9UKiBjYWxsIG5ldGlmX3dha2VfcXVldWUoKQorCQkJICogaW4gY29tcGxldGlvbiBoYW5kbGVyLCB3ZSB3aWxsIGNvbWUgYmFjayBoZXJlLgorCQkJICogSmVhbiBJSSAqLworCQkJZG9uZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAtRUNPTk5BQk9SVEVEOgkJLyogLTEwMyAqLworCQljYXNlIC1FQ09OTlJFU0VUOgkJLyogLTEwNCAqLworCQljYXNlIC1FVElNRURPVVQ6CQkvKiAtMTEwICovCisJCWNhc2UgLUVOT0VOVDoJCQkvKiAtMiAodXJiIHVubGlua2VkIGJ5IHVzKSAgKi8KKwkJZGVmYXVsdDoJCQkvKiA/Pz8gLSBQbGF5IHNhZmUgKi8KKwkJCXVyYi0+c3RhdHVzID0gMDsKKwkJCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKwkJCWRvbmUgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBDaGVjayBUeCBVUkIgKi8KKwl1cmIgPSBzZWxmLT50eF91cmI7CisJaWYgKHVyYi0+c3RhdHVzICE9IDApIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHVyYi0+Y29udGV4dDsKKworCQlJUkRBX0RFQlVHKDAsICIlczogVHggdGltZWQgb3V0LCB1cmItPnN0YXR1cz0lZCwgdXJiLT50cmFuc2Zlcl9mbGFncz0weCUwNFhcbiIsIG5ldGRldi0+bmFtZSwgdXJiLT5zdGF0dXMsIHVyYi0+dHJhbnNmZXJfZmxhZ3MpOworCisJCS8qIEluY3JlYXNlIGVycm9yIGNvdW50ICovCisJCXNlbGYtPnN0YXRzLnR4X2Vycm9ycysrOworCisjaWZkZWYgSVVfQlVHX0tJQ0tfVElNRU9VVAorCQkvKiBDYW4ndCBiZSBhIGJhZCBpZGVhIHRvIHJlc2V0IHRoZSBzcGVlZCA7LSkgLSBKZWFuIElJICovCisJCWlmKHNlbGYtPm5ld19zcGVlZCA9PSAtMSkKKwkJCXNlbGYtPm5ld19zcGVlZCA9IHNlbGYtPnNwZWVkOworCQlpZihzZWxmLT5uZXdfeGJvZnMgPT0gLTEpCisJCQlzZWxmLT5uZXdfeGJvZnMgPSBzZWxmLT54Ym9mczsKKwkJaXJkYV91c2JfY2hhbmdlX3NwZWVkX3hib2ZzKHNlbGYpOworI2VuZGlmIC8qIElVX0JVR19LSUNLX1RJTUVPVVQgKi8KKworCQlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJCWNhc2UgLUVJTlBST0dSRVNTOgorCQkJdXNiX3VubGlua191cmIodXJiKTsKKwkJCS8qIE5vdGUgOiBhYm92ZSB3aWxsICAqTk9UKiBjYWxsIG5ldGlmX3dha2VfcXVldWUoKQorCQkJICogaW4gY29tcGxldGlvbiBoYW5kbGVyLCBiZWNhdXNlIHVyYi0+c3RhdHVzIHdpbGwKKwkJCSAqIGJlIC1FTk9FTlQuIFdlIHdpbGwgZml4IHRoYXQgYXQgdGhlIG5leHQgd2F0Y2hkb2csCisJCQkgKiBsZWF2aW5nIG1vcmUgdGltZSB0byBVU0IgdG8gcmVjb3Zlci4uLgorCQkJICogQWxzbywgd2UgYXJlIGluIGludGVycnVwdCwgc28gd2UgbmVlZCB0byBoYXZlCisJCQkgKiBVUkJfQVNZTkNfVU5MSU5LIHRvIHdvcmsgcHJvcGVybHkuLi4KKwkJCSAqIEplYW4gSUkgKi8KKwkJCWRvbmUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgLUVDT05OQUJPUlRFRDoJCS8qIC0xMDMgKi8KKwkJY2FzZSAtRUNPTk5SRVNFVDoJCS8qIC0xMDQgKi8KKwkJY2FzZSAtRVRJTUVET1VUOgkJLyogLTExMCAqLworCQljYXNlIC1FTk9FTlQ6CQkJLyogLTIgKHVyYiB1bmxpbmtlZCBieSB1cykgICovCisJCWRlZmF1bHQ6CQkJLyogPz8/IC0gUGxheSBzYWZlICovCisJCQlpZihza2IgIT0gTlVMTCkgeworCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQkJdXJiLT5jb250ZXh0ID0gTlVMTDsKKwkJCX0KKwkJCXVyYi0+c3RhdHVzID0gMDsKKwkJCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKwkJCWRvbmUgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJLyogTWF5YmUgd2UgbmVlZCBhIHJlc2V0ICovCisJLyogTm90ZSA6IFNvbWUgZHJpdmVycyBzZWVtIHRvIHVzZSBhIHVzYl9zZXRfaW50ZXJmYWNlKCkgd2hlbiB0aGV5CisJICogbmVlZCB0byByZXNldCB0aGUgaGFyZHdhcmUuIEh1bS4uLgorCSAqLworCisJLyogaWYoZG9uZSA9PSAwKSAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBSRUNFSVZFIFJPVVRJTkVTICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogUmVjZWl2ZSBwYWNrZXRzIGZyb20gdGhlIFVTQiBsYXllciBzdGFjayBhbmQgcGFzcyB0aGVtIHRvIHRoZSBJckRBIHN0YWNrLgorICogVHJ5IHRvIHdvcmsgYXJvdW5kIFVTQiBmYWlsdXJlcy4uLgorICovCisKKy8qCisgKiBOb3RlIDoKKyAqIFNvbWUgb2YgeW91IG1heSBoYXZlIG5vdGljZWQgdGhhdCBtb3N0IGRvbmdsZSBoYXZlIGFuIGludGVycnVwdCBpbiBwaXBlCisgKiB0aGF0IHdlIGRvbid0IHVzZS4gSGVyZSBpcyB0aGUgbGl0dGxlIHNlY3JldC4uLgorICogV2hlbiB3ZSBoYW5nIGEgUnggVVJCIG9uIHRoZSBidWxrIGluIHBpcGUsIGl0IGdlbmVyYXRlcyBzb21lIFVTQiB0cmFmZmljCisgKiBpbiBldmVyeSBVU0IgZnJhbWUuIFRoaXMgaXMgdW5uZWNlc3Nhcnkgb3ZlcmhlYWQuCisgKiBUaGUgaW50ZXJydXB0IGluIHBpcGUgd2lsbCBnZW5lcmF0ZSBhbiBldmVudCBldmVyeSB0aW1lIGEgcGFja2V0IGlzCisgKiByZWNlaXZlZC4gUmVhZGluZyBhbiBpbnRlcnJ1cHQgcGlwZSBhZGRzIG1pbmltYWwgb3ZlcmhlYWQsIGJ1dCBoYXMgc29tZQorICogbGF0ZW5jeSAofjFtcykuCisgKiBJZiB3ZSBhcmUgY29ubmVjdGVkIChzcGVlZCAhPSA5NjAwKSwgd2Ugd2FudCB0byBtaW5pbWlzZSBsYXRlbmN5LCBzbworICogd2UganVzdCBhbHdheXMgaGFuZyB0aGUgUnggVVJCIGFuZCBpZ25vcmUgdGhlIGludGVycnVwdC4KKyAqIElmIHdlIGFyZSBub3QgY29ubmVjdGVkIChzcGVlZCA9PSA5NjAwKSwgdGhlcmUgaXMgdXN1YWxseSBubyBSeCB0cmFmZmljLAorICogYW5kIHdlIHdhbnQgdG8gbWluaW1pc2UgdGhlIFVTQiBvdmVyaGVhZC4gSW4gdGhpcyBjYXNlIHdlIHNob3VsZCB3YWl0CisgKiBvbiB0aGUgaW50ZXJydXB0IHBpcGUgYW5kIGhhbmcgdGhlIFJ4IFVSQiBvbmx5IHdoZW4gYW4gaW50ZXJydXB0IGlzCisgKiByZWNlaXZlZC4KKyAqIEplYW4gSUkKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU3VibWl0IGEgUnggVVJCIHRvIHRoZSBVU0IgbGF5ZXIgdG8gaGFuZGxlIHJlY2VwdGlvbiBvZiBhIGZyYW1lCisgKiBNb3N0bHkgY2FsbGVkIGJ5IHRoZSBjb21wbGV0aW9uIGNhbGxiYWNrIG9mIHRoZSBwcmV2aW91cyBVUkIuCisgKgorICogSmVhbiBJSQorICovCitzdGF0aWMgdm9pZCBpcmRhX3VzYl9zdWJtaXQoc3RydWN0IGlyZGFfdXNiX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IGlyZGFfc2tiX2NiICpjYjsKKwlpbnQgcmV0OworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVCh1cmIgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwkvKiBTYXZlIG91cnNlbHZlcyBpbiB0aGUgc2tiICovCisJY2IgPSAoc3RydWN0IGlyZGFfc2tiX2NiICopIHNrYi0+Y2I7CisJY2ItPmNvbnRleHQgPSBzZWxmOworCisJLyogUmVpbml0aWFsaXplIFVSQiAqLworCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgc2VsZi0+dXNiZGV2LCAKKwkJICAgICAgdXNiX3JjdmJ1bGtwaXBlKHNlbGYtPnVzYmRldiwgc2VsZi0+YnVsa19pbl9lcCksIAorCQkgICAgICBza2ItPmRhdGEsIHNrYi0+dHJ1ZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgaXJkYV91c2JfcmVjZWl2ZSwgc2tiKTsKKwkvKiBOb3RlIDogdW5saW5rICptdXN0KiBiZSBzeW5jaHJvbm91cyBiZWNhdXNlIG9mIHRoZSBjb2RlIGluIAorCSAqIGlyZGFfdXNiX25ldF9jbG9zZSgpIC0+IGZyZWUgdGhlIHNrYiAtIEplYW4gSUkgKi8KKwl1cmItPnN0YXR1cyA9IDA7CisKKwkvKiBDYW4gYmUgY2FsbGVkIGZyb20gaXJkYV91c2JfcmVjZWl2ZSAoaXJxIGhhbmRsZXIpIC0+IEdGUF9BVE9NSUMgKi8KKwlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCWlmIChyZXQpIHsKKwkJLyogSWYgdGhpcyBldmVyIGhhcHBlbiwgd2UgYXJlIGluIGRlZXAgcyoqKi4KKwkJICogQmFzaWNhbGx5LCB0aGUgUnggcGF0aCB3aWxsIHN0b3AuLi4gKi8KKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBGYWlsZWQgdG8gc3VibWl0IFJ4IFVSQiAlZFxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fLCByZXQpOworCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfdXNiX3JlY2VpdmUodXJiKQorICoKKyAqICAgICBDYWxsZWQgYnkgdGhlIFVTQiBzdWJzeXN0ZW0gd2hlbiBhIGZyYW1lIGhhcyBiZWVuIHJlY2VpdmVkCisgKgorICovCitzdGF0aWMgdm9pZCBpcmRhX3VzYl9yZWNlaXZlKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSB1cmItPmNvbnRleHQ7CisJc3RydWN0IGlyZGFfdXNiX2NiICpzZWxmOyAKKwlzdHJ1Y3QgaXJkYV9za2JfY2IgKmNiOworCXN0cnVjdCBza19idWZmICpuZXdza2I7CisJc3RydWN0IHNrX2J1ZmYgKmRhdGFza2I7CisJaW50CQlkb2NvcHk7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBsZW49JWRcbiIsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkKKwkvKiBGaW5kIG91cnNlbHZlcyAqLworCWNiID0gKHN0cnVjdCBpcmRhX3NrYl9jYiAqKSBza2ItPmNiOworCUlSREFfQVNTRVJUKGNiICE9IE5VTEwsIHJldHVybjspOworCXNlbGYgPSAoc3RydWN0IGlyZGFfdXNiX2NiICopIGNiLT5jb250ZXh0OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwkvKiBJZiB0aGUgbmV0d29yayBpcyBjbG9zZWQgb3IgdGhlIGRldmljZSBnb25lLCBzdG9wIGV2ZXJ5dGhpbmcgKi8KKwlpZiAoKCFzZWxmLT5uZXRvcGVuKSB8fCAoIXNlbGYtPnByZXNlbnQpKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIE5ldHdvcmsgaXMgZ29uZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCS8qIERvbid0IHJlLXN1Ym1pdCB0aGUgVVJCIDogd2lsbCBzdGFsbCB0aGUgUnggcGF0aCAqLworCQlyZXR1cm47CisJfQorCQorCS8qIENoZWNrIHRoZSBzdGF0dXMgKi8KKwlpZiAodXJiLT5zdGF0dXMgIT0gMCkgeworCQlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJCWNhc2UgLUVJTFNFUToKKwkJCXNlbGYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJc2VsZi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwkKKwkJCWJyZWFrOworCQljYXNlIC1FQ09OTlJFU0VUOgkJLyogLTEwNCAqLworCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgQ29ubmVjdGlvbiBSZXNldCAoLTEwNCksIHRyYW5zZmVyX2ZsYWdzIDB4JTA0WCBcbiIsIF9fRlVOQ1RJT05fXywgdXJiLT50cmFuc2Zlcl9mbGFncyk7CisJCQkvKiB1aGNpX2NsZWFudXBfdW5saW5rKCkgaXMgZ29pbmcgdG8ga2lsbCB0aGUgUngKKwkJCSAqIFVSQiBqdXN0IGFmdGVyIHdlIHJldHVybi4gTm8gcHJvYmxlbSwgYXQgdGhpcworCQkJICogcG9pbnQgdGhlIFVSQiB3aWxsIGJlIGlkbGUgOy0pIC0gSmVhbiBJSSAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlJUkRBX0RFQlVHKDAsICIlcygpLCBSWCBzdGF0dXMgJWQsdHJhbnNmZXJfZmxhZ3MgMHglMDRYIFxuIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cywgdXJiLT50cmFuc2Zlcl9mbGFncyk7CisJCQlicmVhazsKKwkJfQorCQlnb3RvIGRvbmU7CisJfQorCQorCS8qIENoZWNrIGZvciBlbXB0eSBmcmFtZXMgKi8KKwlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoIDw9IFVTQl9JUkRBX0hFQURFUikgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIGVtcHR5IGZyYW1lIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBkb25lOworCX0KKworCS8qICAKKwkgKiBSZW1lbWJlciB0aGUgdGltZSB3ZSByZWNlaXZlZCB0aGlzIGZyYW1lLCBzbyB3ZSBjYW4KKwkgKiByZWR1Y2UgdGhlIG1pbiB0dXJuIHRpbWUgYSBiaXQgc2luY2Ugd2Ugd2lsbCBrbm93CisJICogaG93IG11Y2ggdGltZSB3ZSBoYXZlIHVzZWQgZm9yIHByb3RvY29sIHByb2Nlc3NpbmcKKwkgKi8KKyAgICAgICAgZG9fZ2V0dGltZW9mZGF5KCZzZWxmLT5zdGFtcCk7CisKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvcHkgdGhlIGRhdGEgdG8gYSBuZXcgc2tiIG9yIG5vdC4KKwkgKiBGb3IgbW9zdCBmcmFtZXMsIHdlIHVzZSBaZXJvQ29weSBhbmQgcGFzcyB0aGUgYWxyZWFkeQorCSAqIGFsbG9jYXRlZCBza2IgdXAgdGhlIHN0YWNrLgorCSAqIElmIHRoZSBmcmFtZSBpcyBzbWFsbCwgaXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gY29weSBpdAorCSAqIHRvIHNhdmUgbWVtb3J5IChjb3B5IHdpbGwgYmUgZmFzdCBhbnl3YXkgLSB0aGF0J3MKKwkgKiBjYWxsZWQgUngtY29weS1icmVhaykuIEplYW4gSUkgKi8KKwlkb2NvcHkgPSAodXJiLT5hY3R1YWxfbGVuZ3RoIDwgSVJEQV9SWF9DT1BZX1RIUkVTSE9MRCk7CisKKwkvKiBBbGxvY2F0ZSBhIG5ldyBza2IgKi8KKwluZXdza2IgPSBkZXZfYWxsb2Nfc2tiKGRvY29weSA/IHVyYi0+YWN0dWFsX2xlbmd0aCA6IElSREFfU0tCX01BWF9NVFUpOworCWlmICghbmV3c2tiKSAgeworCQlzZWxmLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCS8qIFdlIGNvdWxkIGRlbGl2ZXIgdGhlIGN1cnJlbnQgc2tiLCBidXQgdGhpcyB3b3VsZCBzdGFsbAorCQkgKiB0aGUgUnggcGF0aC4gQmV0dGVyIGRyb3AgdGhlIHBhY2tldC4uLiBKZWFuIElJICovCisJCWdvdG8gZG9uZTsgIAorCX0KKworCS8qIE1ha2Ugc3VyZSBJUCBoZWFkZXIgZ2V0IGFsaWduZWQgKElyREEgaGVhZGVyIGlzIDUgYnl0ZXMpICovCisJLyogQnV0IElyREEtVVNCIGhlYWRlciBpcyAxIGJ5dGUuIEplYW4gSUkgKi8KKwkvL3NrYl9yZXNlcnZlKG5ld3NrYiwgVVNCX0lSREFfSEVBREVSIC0gMSk7CisKKwlpZihkb2NvcHkpIHsKKwkJLyogQ29weSBwYWNrZXQsIHNvIHdlIGNhbiByZWN5Y2xlIHRoZSBvcmlnaW5hbCAqLworCQltZW1jcHkobmV3c2tiLT5kYXRhLCBza2ItPmRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCS8qIERlbGl2ZXIgdGhpcyBuZXcgc2tiICovCisJCWRhdGFza2IgPSBuZXdza2I7CisJCS8qIEFuZCBob29rIHRoZSBvbGQgc2tiIHRvIHRoZSBVUkIKKwkJICogTm90ZSA6IHdlIGRvbid0IG5lZWQgdG8gImNsZWFuIHVwIiB0aGUgb2xkIHNrYiwKKwkJICogYXMgd2UgbmV2ZXIgdG91Y2hlZCBpdC4gSmVhbiBJSSAqLworCX0gZWxzZSB7CisJCS8qIFdlIGFyZSB1c2luZyBaZXJvQ29weS4gRGVsaXZlciBvbGQgc2tiICovCisJCWRhdGFza2IgPSBza2I7CisJCS8qIEFuZCBob29rIHRoZSBuZXcgc2tiIHRvIHRoZSBVUkIgKi8KKwkJc2tiID0gbmV3c2tiOworCX0KKworCS8qIFNldCBwcm9wZXIgbGVuZ3RoIG9uIHNrYiAmIHJlbW92ZSBVU0ItSXJEQSBoZWFkZXIgKi8KKwlza2JfcHV0KGRhdGFza2IsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJc2tiX3B1bGwoZGF0YXNrYiwgVVNCX0lSREFfSEVBREVSKTsKKworCS8qIEFzayB0aGUgbmV0d29ya2luZyBsYXllciB0byBxdWV1ZSB0aGUgcGFja2V0IGZvciB0aGUgSXJEQSBzdGFjayAqLworCWRhdGFza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKKwlkYXRhc2tiLT5tYWMucmF3ICA9IGRhdGFza2ItPmRhdGE7CisJZGF0YXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKKwluZXRpZl9yeChkYXRhc2tiKTsKKworCS8qIEtlZXAgc3RhdHMgdXAgdG8gZGF0ZSAqLworCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9IGRhdGFza2ItPmxlbjsKKwlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJc2VsZi0+bmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworZG9uZToKKwkvKiBOb3RlIDogYXQgdGhpcyBwb2ludCwgdGhlIFVSQiB3ZSd2ZSBqdXN0IHJlY2VpdmVkICh1cmIpCisJICogaXMgc3RpbGwgcmVmZXJlbmNlZCBieSB0aGUgVVNCIGxheWVyLiBGb3IgZXhhbXBsZSwgaWYgd2UKKwkgKiBoYXZlIHJlY2VpdmVkIGEgLUVDT05OUkVTRVQsIHVoY2lfY2xlYW51cF91bmxpbmsoKSB3aWxsCisJICogY29udGludWUgdG8gcHJvY2VzcyBpdCAoaW4gZmFjdCwgY2xlYW5pbmcgaXQgdXApLgorCSAqIElmIHdlIHdlcmUgdG8gc3VibWl0IHRoaXMgVVJCLCBkaXNhc3RlciB3b3VsZCBlbnN1ZS4KKwkgKiBUaGVyZWZvcmUsIHdlIHN1Ym1pdCBvdXIgaWRsZSBVUkIsIGFuZCBwdXQgdGhpcyBVUkIgaW4gb3VyCisJICogaWRsZSBzbG90Li4uLgorCSAqIEplYW4gSUkgKi8KKwkvKiBOb3RlIDogd2l0aCB0aGlzIHNjaGVtZSwgd2UgY291bGQgc3VibWl0IHRoZSBpZGxlIFVSQiBiZWZvcmUKKwkgKiBwcm9jZXNzaW5nIHRoZSBSeCBVUkIuIEFub3RoZXIgdGltZS4uLiBKZWFuIElJICovCisKKwkvKiBTdWJtaXQgdGhlIGlkbGUgVVJCIHRvIHJlcGxhY2UgdGhlIFVSQiB3ZSd2ZSBqdXN0IHJlY2VpdmVkICovCisJaXJkYV91c2Jfc3VibWl0KHNlbGYsIHNrYiwgc2VsZi0+aWRsZV9yeF91cmIpOworCS8qIFJlY3ljbGUgUnggVVJCIDogTm93LCB0aGUgaWRsZSBVUkIgaXMgdGhlIHByZXNlbnQgb25lICovCisJdXJiLT5jb250ZXh0ID0gTlVMTDsKKwlzZWxmLT5pZGxlX3J4X3VyYiA9IHVyYjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIENhbGxiYWsgZnJvbSBJckRBIGxheWVyLiBJckRBIHdhbnRzIHRvIGtub3cgaWYgd2UgaGF2ZQorICogc3RhcnRlZCByZWNlaXZpbmcgYW55dGhpbmcuCisgKi8KK3N0YXRpYyBpbnQgaXJkYV91c2JfaXNfcmVjZWl2aW5nKHN0cnVjdCBpcmRhX3VzYl9jYiAqc2VsZikKK3sKKwkvKiBOb3RlIDogYmVjYXVzZSBvZiB0aGUgd2F5IFVIQ0kgd29ya3MsIGl0J3MgYWxtb3N0IGltcG9zc2libGUKKwkgKiB0byBnZXQgdGhpcyBpbmZvLiBUaGUgQ29udHJvbGxlciBETUEgZGlyZWN0bHkgdG8gbWVtb3J5IGFuZAorCSAqIHNpZ25hbCBvbmx5IHdoZW4gdGhlIHdob2xlIGZyYW1lIGlzIGZpbmlzaGVkLiBUbyBrbm93IGlmIHRoZQorCSAqIGZpcnN0IFREIG9mIHRoZSBVUkIgaGFzIGJlZW4gZmlsbGVkIG9yIG5vdCBzZWVtcyBoYXJkIHdvcmsuLi4KKwkgKgorCSAqIFRoZSBvdGhlciBzb2x1dGlvbiB3b3VsZCBiZSB0byB1c2UgdGhlICJyZWNlaXZpbmciIGNvbW1hbmQKKwkgKiBvbiB0aGUgZGVmYXVsdCBkZWNyaXB0b3Igd2l0aCBhIHVzYl9jb250cm9sX21zZygpLCBidXQgdGhhdAorCSAqIHdvdWxkIGFkZCBVU0IgdHJhZmZpYyBhbmQgd291bGQgcmV0dXJuIHJlc3VsdCBvbmx5IGluIHRoZQorCSAqIG5leHQgVVNCIGZyYW1lICh+MW1zKS4KKwkgKgorCSAqIEkndmUgYmVlbiB0b2xkIHRoYXQgY3VycmVudCBkb25nbGVzIHNlbmQgc3RhdHVzIGluZm8gb24gdGhlaXIKKwkgKiBpbnRlcnJ1cHQgZW5kcG9pbnQsIGFuZCB0aGF0J3Mgd2hhdCB0aGUgV2luZG93cyBkcml2ZXIgdXNlcworCSAqIHRvIGtub3cgdGhpcyBpbmZvLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzIG5vdCB5ZXQgaW4gdGhlIHNwZWMuLi4KKwkgKgorCSAqIEplYW4gSUkKKwkgKi8KKworCXJldHVybiAwOyAvKiBGb3Igbm93ICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqIElSREEgREVWSUNFIENBTExCQUNLUyAqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIE1haW4gY2FsbHMgZnJvbSB0aGUgSXJEQS9OZXR3b3JrIHN1YnN5c3RlbS4KKyAqIE1vc3RseSByZWdpc3RlcmluZyBhIG5ldyBpcmRhLXVzYiBkZXZpY2UgYW5kIHJlbW92aW5nIGl0Li4uLgorICogV2Ugb25seSBkZWFsIHdpdGggdGhlIElyREEgc2lkZSBvZiB0aGUgYnVzaW5lc3MsIHRoZSBVU0Igc2lkZSB3aWxsCisgKiBiZSBkZWFsdCB3aXRoIGJlbG93Li4uCisgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnVuY3Rpb24gaXJkYV91c2JfbmV0X29wZW4gKGRldikKKyAqCisgKiAgICBOZXR3b3JrIGRldmljZSBpcyB0YWtlbiB1cC4gVXN1YWxseSB0aGlzIGlzIGRvbmUgYnkgImlmY29uZmlnIGlyZGEwIHVwIiAKKyAqICAgCisgKiBOb3RlIDogZG9uJ3QgbWVzcyB3aXRoIHNlbGYtPm5ldG9wZW4gLSBKZWFuIElJCisgKi8KK3N0YXRpYyBpbnQgaXJkYV91c2JfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGY7CisJY2hhcglod25hbWVbMTZdOworCWludCBpOworCQorCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChuZXRkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJc2VsZiA9IChzdHJ1Y3QgaXJkYV91c2JfY2IgKikgbmV0ZGV2LT5wcml2OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkvKiBDYW4gb25seSBvcGVuIHRoZSBkZXZpY2UgaWYgaXQncyB0aGVyZSAqLworCWlmKCFzZWxmLT5wcmVzZW50KSB7CisJCUlSREFfV0FSTklORygiJXMoKSwgZGV2aWNlIG5vdCBwcmVzZW50IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIEluaXRpYWxpc2UgZGVmYXVsdCBzcGVlZCBhbmQgeGJvZnMgdmFsdWUKKwkgKiAoSXJMQVAgd2lsbCBjaGFuZ2UgdGhhdCBzb29uKSAqLworCXNlbGYtPnNwZWVkID0gLTE7CisJc2VsZi0+eGJvZnMgPSAtMTsKKwlzZWxmLT5uZXdfc3BlZWQgPSAtMTsKKwlzZWxmLT5uZXdfeGJvZnMgPSAtMTsKKworCS8qIFRvIGRvICpiZWZvcmUqIHN1Ym1pdHRpbmcgUnggdXJicyBhbmQgc3RhcnRpbmcgbmV0IFR4IHF1ZXVlCisJICogSmVhbiBJSSAqLworCXNlbGYtPm5ldG9wZW4gPSAxOworCisJLyogCisJICogTm93IHRoYXQgZXZlcnl0aGluZyBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgcHJvcGVybHksCisJICogT3BlbiBuZXcgSXJMQVAgbGF5ZXIgaW5zdGFuY2UgdG8gdGFrZSBjYXJlIG9mIHVzLi4uCisJICogTm90ZSA6IHdpbGwgc2VuZCBpbW1lZGlhdGVseSBhIHNwZWVkIGNoYW5nZS4uLgorCSAqLworCXNwcmludGYoaHduYW1lLCAidXNiIyVkIiwgc2VsZi0+dXNiZGV2LT5kZXZudW0pOworCXNlbGYtPmlybGFwID0gaXJsYXBfb3BlbihuZXRkZXYsICZzZWxmLT5xb3MsIGh3bmFtZSk7CisJSVJEQV9BU1NFUlQoc2VsZi0+aXJsYXAgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwkvKiBBbGxvdyBJckxBUCB0byBzZW5kIGRhdGEgdG8gdXMgKi8KKwluZXRpZl9zdGFydF9xdWV1ZShuZXRkZXYpOworCisJLyogV2Ugc3VibWl0IGFsbCB0aGUgUnggVVJCIGV4Y2VwdCBmb3Igb25lIHRoYXQgd2Uga2VlcCBpZGxlLgorCSAqIE5lZWQgdG8gYmUgaW5pdGlhbGlzZWQgYmVmb3JlIHN1Ym1pdHRpbmcgb3RoZXIgVVNCcywgYmVjYXVzZQorCSAqIGluIHNvbWUgY2FzZXMgYXMgc29vbiBhcyB3ZSBzdWJtaXQgdGhlIFVSQnMgdGhlIFVTQiBsYXllcgorCSAqIHdpbGwgdHJpZ2dlciBhIGR1bW15IHJlY2VpdmUgLSBKZWFuIElJICovCisJc2VsZi0+aWRsZV9yeF91cmIgPSBzZWxmLT5yeF91cmJbSVVfTUFYX0FDVElWRV9SWF9VUkJTXTsKKwlzZWxmLT5pZGxlX3J4X3VyYi0+Y29udGV4dCA9IE5VTEw7CisKKwkvKiBOb3cgdGhhdCB3ZSBjYW4gcGFzcyBkYXRhIHRvIElyTEFQLCBhbGxvdyB0aGUgVVNCIGxheWVyCisJICogdG8gc2VuZCB1cyBzb21lIGRhdGEuLi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgSVVfTUFYX0FDVElWRV9SWF9VUkJTOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IoSVJEQV9TS0JfTUFYX01UVSk7CisJCWlmICghc2tiKSB7CisJCQkvKiBJZiB0aGlzIGV2ZXIgaGFwcGVuLCB3ZSBhcmUgaW4gZGVlcCBzKioqLgorCQkJICogQmFzaWNhbGx5LCB3ZSBjYW4ndCBzdGFydCB0aGUgUnggcGF0aC4uLiAqLworCQkJSVJEQV9XQVJOSU5HKCIlcygpLCBGYWlsZWQgdG8gYWxsb2NhdGUgUnggc2tiXG4iLAorCQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkvL3NrYl9yZXNlcnZlKG5ld3NrYiwgVVNCX0lSREFfSEVBREVSIC0gMSk7CisJCWlyZGFfdXNiX3N1Ym1pdChzZWxmLCBza2IsIHNlbGYtPnJ4X3VyYltpXSk7CisJfQorCisJLyogUmVhZHkgdG8gcGxheSAhISEgKi8KKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfdXNiX25ldF9jbG9zZSAoc2VsZikKKyAqCisgKiAgICBOZXR3b3JrIGRldmljZSBpcyB0YWtlbiBkb3duLiBVc3VhbGx5IHRoaXMgaXMgZG9uZSBieSAKKyAqICAgICJpZmNvbmZpZyBpcmRhMCBkb3duIiAKKyAqLworc3RhdGljIGludCBpcmRhX3VzYl9uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGY7CisJaW50CWk7CisKKwlJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQobmV0ZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCXNlbGYgPSAoc3RydWN0IGlyZGFfdXNiX2NiICopIG5ldGRldi0+cHJpdjsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJLyogQ2xlYXIgdGhpcyBmbGFnICpiZWZvcmUqIHVubGlua2luZyB0aGUgdXJicyBhbmQgKmJlZm9yZSoKKwkgKiBzdG9wcGluZyB0aGUgbmV0d29yayBUeCBxdWV1ZSAtIEplYW4gSUkgKi8KKwlzZWxmLT5uZXRvcGVuID0gMDsKKworCS8qIFN0b3AgbmV0d29yayBUeCBxdWV1ZSAqLworCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKworCS8qIERlYWxsb2NhdGUgYWxsIHRoZSBSeCBwYXRoIGJ1ZmZlcnMgKFVSQnMgYW5kIHNrYikgKi8KKwlmb3IgKGkgPSAwOyBpIDwgSVVfTUFYX1JYX1VSQlM7IGkrKykgeworCQlzdHJ1Y3QgdXJiICp1cmIgPSBzZWxmLT5yeF91cmJbaV07CisJCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgdXJiLT5jb250ZXh0OworCQkvKiBDYW5jZWwgdGhlIHJlY2VpdmUgY29tbWFuZCAqLworCQl1c2Jfa2lsbF91cmIodXJiKTsKKwkJLyogVGhlIHNrYiBpcyBvdXJzLCBmcmVlIGl0ICovCisJCWlmKHNrYikgeworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJdXJiLT5jb250ZXh0ID0gTlVMTDsKKwkJfQorCX0KKwkvKiBDYW5jZWwgVHggYW5kIHNwZWVkIFVSQiAtIG5lZWQgdG8gYmUgc3luY2hyb25vdXMgdG8gYXZvaWQgcmFjZXMgKi8KKwlzZWxmLT50eF91cmItPnRyYW5zZmVyX2ZsYWdzICY9IH5VUkJfQVNZTkNfVU5MSU5LOworCXVzYl9raWxsX3VyYihzZWxmLT50eF91cmIpOworCXNlbGYtPnNwZWVkX3VyYi0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9BU1lOQ19VTkxJTks7CisJdXNiX2tpbGxfdXJiKHNlbGYtPnNwZWVkX3VyYik7CisKKwkvKiBTdG9wIGFuZCByZW1vdmUgaW5zdGFuY2Ugb2YgSXJMQVAgKi8KKwlpZiAoc2VsZi0+aXJsYXApCisJCWlybGFwX2Nsb3NlKHNlbGYtPmlybGFwKTsKKwlzZWxmLT5pcmxhcCA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIElPQ1RMcyA6IEV4dHJhIG91dC1vZi1iYW5kIG5ldHdvcmsgY29tbWFuZHMuLi4KKyAqLworc3RhdGljIGludCBpcmRhX3VzYl9uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpZl9pcmRhX3JlcSAqaXJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKSBycTsKKwlzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGY7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJc2VsZiA9IGRldi0+cHJpdjsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgJXMsIChjbWQ9MHglWClcbiIsIF9fRlVOQ1RJT05fXywgZGV2LT5uYW1lLCBjbWQpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NTQkFORFdJRFRIOiAvKiBTZXQgYmFuZHdpZHRoICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCS8qIFByb3RlY3QgdXMgZnJvbSBVU0IgY2FsbGJhY2tzLCBuZXQgd2F0Y2hkb2cgYW5kIGVsc2UuICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCS8qIENoZWNrIGlmIHRoZSBkZXZpY2UgaXMgc3RpbGwgdGhlcmUgKi8KKwkJaWYoc2VsZi0+cHJlc2VudCkgeworCQkJLyogU2V0IHRoZSBkZXNpcmVkIHNwZWVkICovCisJCQlzZWxmLT5uZXdfc3BlZWQgPSBpcnEtPmlmcl9iYXVkcmF0ZTsKKwkJCWlyZGFfdXNiX2NoYW5nZV9zcGVlZF94Ym9mcyhzZWxmKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCWNhc2UgU0lPQ1NNRURJQUJVU1k6IC8qIFNldCBtZWRpYSBidXN5ICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCS8qIENoZWNrIGlmIHRoZSBJckRBIHN0YWNrIGlzIHN0aWxsIHRoZXJlICovCisJCWlmKHNlbGYtPm5ldG9wZW4pCisJCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShzZWxmLT5uZXRkZXYsIFRSVUUpOworCQlicmVhazsKKwljYXNlIFNJT0NHUkVDRUlWSU5HOiAvKiBDaGVjayBpZiB3ZSBhcmUgcmVjZWl2aW5nIHJpZ2h0IG5vdyAqLworCQlpcnEtPmlmcl9yZWNlaXZpbmcgPSBpcmRhX3VzYl9pc19yZWNlaXZpbmcoc2VsZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKwkKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2V0IGRldmljZSBzdGF0cyAoZm9yIC9wcm9jL25ldC9kZXYgYW5kIGlmY29uZmlnKQorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlyZGFfdXNiX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYgPSBkZXYtPnByaXY7CisJcmV0dXJuICZzZWxmLT5zdGF0czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKiBJUkRBIENPTkZJRyBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVmFyaW91cyBzdWJyb3V0aW5lcyBkZWFsaW5nIHdpdGggSXJEQSBhbmQgbmV0d29yayBzdHVmZiB3ZSB1c2UgdG8KKyAqIGNvbmZpZ3VyZSBhbmQgaW5pdGlhbGlzZSBlYWNoIGlyZGEtdXNiIGluc3RhbmNlLgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGJlbG93IGluIHRoZSBtYWluIGNhbGxzIG9mIHRoZSBkcml2ZXIuLi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU2V0IHByb3BlciB2YWx1ZXMgaW4gdGhlIElyREEgUU9TIHN0cnVjdHVyZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXJkYV91c2JfaW5pdF9xb3Moc3RydWN0IGlyZGFfdXNiX2NiICpzZWxmKQoreworCXN0cnVjdCBpcmRhX2NsYXNzX2Rlc2MgKmRlc2M7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCQorCWRlc2MgPSBzZWxmLT5pcmRhX2Rlc2M7CisJCisJLyogSW5pdGlhbGl6ZSBRb1MgZm9yIHRoaXMgZGV2aWNlICovCisJaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcygmc2VsZi0+cW9zKTsKKworCS8qIFNlZSBzcGVjIHNlY3Rpb24gNy4yIGZvciBtZWFuaW5nLgorCSAqIFZhbHVlcyBhcmUgbGl0dGxlIGVuZGlhbiAoYXMgbW9zdCBVU0Igc3R1ZmYpLCB0aGUgSXJEQSBzdGFjaworCSAqIHVzZSBpdCBpbiBuYXRpdmUgb3JkZXIgKHNlZSBwYXJhbWV0ZXJzLmMpLiAtIEplYW4gSUkgKi8KKwlzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMgICAgICAgPSBsZTE2X3RvX2NwdShkZXNjLT53QmF1ZFJhdGUpOworCXNlbGYtPnFvcy5taW5fdHVybl90aW1lLmJpdHMgICA9IGRlc2MtPmJtTWluVHVybmFyb3VuZFRpbWU7CisJc2VsZi0+cW9zLmFkZGl0aW9uYWxfYm9mcy5iaXRzID0gZGVzYy0+Ym1BZGRpdGlvbmFsQk9GczsKKwlzZWxmLT5xb3Mud2luZG93X3NpemUuYml0cyAgICAgPSBkZXNjLT5ibVdpbmRvd1NpemU7CisJc2VsZi0+cW9zLmRhdGFfc2l6ZS5iaXRzICAgICAgID0gZGVzYy0+Ym1EYXRhU2l6ZTsKKworCUlSREFfREVCVUcoMCwgIiVzKCksIGRvbmdsZSBzYXlzIHNwZWVkPTB4JVgsIHNpemU9MHglWCwgd2luZG93PTB4JVgsIGJvZnM9MHglWCwgdHVybj0weCVYXG4iLCAKKwkJX19GVU5DVElPTl9fLCBzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMsIHNlbGYtPnFvcy5kYXRhX3NpemUuYml0cywgc2VsZi0+cW9zLndpbmRvd19zaXplLmJpdHMsIHNlbGYtPnFvcy5hZGRpdGlvbmFsX2JvZnMuYml0cywgc2VsZi0+cW9zLm1pbl90dXJuX3RpbWUuYml0cyk7CisKKwkvKiBEb24ndCBhbHdheXMgdHJ1c3Qgd2hhdCB0aGUgZG9uZ2xlIHRlbGwgdXMgKi8KKwlpZihzZWxmLT5jYXBhYmlsaXR5ICYgSVVDX1NJUl9PTkxZKQorCQlzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMJJj0gMHgwMGZmOworCWlmKHNlbGYtPmNhcGFiaWxpdHkgJiBJVUNfU01BTExfUEtUKQorCQlzZWxmLT5xb3MuZGF0YV9zaXplLmJpdHMJID0gMHgwNzsKKwlpZihzZWxmLT5jYXBhYmlsaXR5ICYgSVVDX05PX1dJTkRPVykKKwkJc2VsZi0+cW9zLndpbmRvd19zaXplLmJpdHMJID0gMHgwMTsKKwlpZihzZWxmLT5jYXBhYmlsaXR5ICYgSVVDX01BWF9XSU5ET1cpCisJCXNlbGYtPnFvcy53aW5kb3dfc2l6ZS5iaXRzCSA9IDB4N2Y7CisJaWYoc2VsZi0+Y2FwYWJpbGl0eSAmIElVQ19NQVhfWEJPRlMpCisJCXNlbGYtPnFvcy5hZGRpdGlvbmFsX2JvZnMuYml0cwkgPSAweDAxOworCisjaWYgMQorCS8qIE1vZHVsZSBwYXJhbWV0ZXIgY2FuIG92ZXJyaWRlIHRoZSByeCB3aW5kb3cgc2l6ZSAqLworCWlmIChxb3NfbXR0X2JpdHMpCisJCXNlbGYtPnFvcy5taW5fdHVybl90aW1lLmJpdHMgPSBxb3NfbXR0X2JpdHM7CisjZW5kaWYJICAgIAorCS8qIAorCSAqIE5vdGUgOiBtb3N0IG9mIHRob3NlIHZhbHVlcyBhcHBseSBvbmx5IGZvciB0aGUgcmVjZWl2ZSBwYXRoLAorCSAqIHRoZSB0cmFuc21pdCBwYXRoIHdpbGwgYmUgc2V0IGRpZmZlcmVudGx5IC0gSmVhbiBJSSAKKwkgKi8KKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKCZzZWxmLT5xb3MpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogSW5pdGlhbGlzZSB0aGUgbmV0d29yayBzaWRlIG9mIHRoZSBpcmRhLXVzYiBpbnN0YW5jZQorICogQ2FsbGVkIHdoZW4gYSBuZXcgVVNCIGluc3RhbmNlIGlzIHJlZ2lzdGVyZWQgaW4gaXJkYV91c2JfcHJvYmUoKQorICovCitzdGF0aWMgaW5saW5lIGludCBpcmRhX3VzYl9vcGVuKHN0cnVjdCBpcmRhX3VzYl9jYiAqc2VsZikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gc2VsZi0+bmV0ZGV2OworCisJSVJEQV9ERUJVRygxLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWlyZGFfdXNiX2luaXRfcW9zKHNlbGYpOworCisJLyogT3ZlcnJpZGUgdGhlIG5ldHdvcmsgZnVuY3Rpb25zIHdlIG5lZWQgdG8gdXNlICovCisJbmV0ZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBpcmRhX3VzYl9oYXJkX3htaXQ7CisJbmV0ZGV2LT50eF90aW1lb3V0CT0gaXJkYV91c2JfbmV0X3RpbWVvdXQ7CisJbmV0ZGV2LT53YXRjaGRvZ190aW1lbyAgPSAyNTAqSFovMTAwMDsJLyogMjUwIG1zID4gVVNCIHRpbWVvdXQgKi8KKwluZXRkZXYtPm9wZW4gICAgICAgICAgICA9IGlyZGFfdXNiX25ldF9vcGVuOworCW5ldGRldi0+c3RvcCAgICAgICAgICAgID0gaXJkYV91c2JfbmV0X2Nsb3NlOworCW5ldGRldi0+Z2V0X3N0YXRzCT0gaXJkYV91c2JfbmV0X2dldF9zdGF0czsKKwluZXRkZXYtPmRvX2lvY3RsICAgICAgICA9IGlyZGFfdXNiX25ldF9pb2N0bDsKKworCXJldHVybiByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIENsZWFudXAgdGhlIG5ldHdvcmsgc2lkZSBvZiB0aGUgaXJkYS11c2IgaW5zdGFuY2UKKyAqIENhbGxlZCB3aGVuIGEgVVNCIGluc3RhbmNlIGlzIHJlbW92ZWQgaW4gaXJkYV91c2JfZGlzY29ubmVjdCgpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpcmRhX3VzYl9jbG9zZShzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYpCit7CisJSVJEQV9ERUJVRygxLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFJlbW92ZSBuZXRkZXZpY2UgKi8KKwl1bnJlZ2lzdGVyX25ldGRldihzZWxmLT5uZXRkZXYpOworCisJLyogUmVtb3ZlIHRoZSBzcGVlZCBidWZmZXIgKi8KKwlpZiAoc2VsZi0+c3BlZWRfYnVmZiAhPSBOVUxMKSB7CisJCWtmcmVlKHNlbGYtPnNwZWVkX2J1ZmYpOworCQlzZWxmLT5zcGVlZF9idWZmID0gTlVMTDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqIFVTQiBDT05GSUcgU1VCUk9VVElORVMgKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBWYXJpb3VzIHN1YnJvdXRpbmVzIGRlYWxpbmcgd2l0aCBVU0Igc3R1ZmYgd2UgdXNlIHRvIGNvbmZpZ3VyZSBhbmQKKyAqIGluaXRpYWxpc2UgZWFjaCBpcmRhLXVzYiBpbnN0YW5jZS4KKyAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBiZWxvdyBpbiB0aGUgbWFpbiBjYWxscyBvZiB0aGUgZHJpdmVyLi4uCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEZ1bmN0aW9uIGlyZGFfdXNiX3BhcnNlX2VuZHBvaW50cyhkZXYsIGlmbnVtKQorICoKKyAqICAgIFBhcnNlIHRoZSB2YXJpb3VzIGVuZHBvaW50cyBhbmQgZmluZCB0aGUgb25lIHdlIG5lZWQuCisgKgorICogVGhlIGVuZHBvaW50IGFyZSB0aGUgcGlwZXMgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBVU0IgZGV2aWNlLgorICogVGhlIHNwZWMgZGVmaW5lcyAyIGVuZHBvaW50cyBvZiB0eXBlIGJ1bGsgdHJhbnNmZXIsIG9uZSBpbiwgYW5kIG9uZSBvdXQuCisgKiBUaGVzZSBhcmUgdXNlZCB0byBwYXNzIGZyYW1lcyBiYWNrIGFuZCBmb3J0aCB3aXRoIHRoZSBkb25nbGUuCisgKiBNb3N0IGRvbmdsZSBoYXZlIGFsc28gYW4gaW50ZXJydXB0IGVuZHBvaW50LCB0aGF0IHdpbGwgYmUgcHJvYmFibHkKKyAqIGRvY3VtZW50ZWQgaW4gdGhlIG5leHQgc3BlYy4uLgorICovCitzdGF0aWMgaW5saW5lIGludCBpcmRhX3VzYl9wYXJzZV9lbmRwb2ludHMoc3RydWN0IGlyZGFfdXNiX2NiICpzZWxmLCBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVuZHBvaW50LCBpbnQgZW5udW0pCit7CisJaW50IGk7CQkvKiBFbmRwb2ludCBpbmRleCBpbiB0YWJsZSAqLworCQkKKwkvKiBJbml0IDogbm8gZW5kcG9pbnRzICovCisJc2VsZi0+YnVsa19pbl9lcCA9IDA7CisJc2VsZi0+YnVsa19vdXRfZXAgPSAwOworCXNlbGYtPmJ1bGtfaW50X2VwID0gMDsKKworCS8qIExldCdzIGxvb2sgYXQgYWxsIHRob3NlIGVuZHBvaW50cyAqLworCWZvcihpID0gMDsgaSA8IGVubnVtOyBpKyspIHsKKwkJLyogQWxsIHRob3NlIHZhcmlhYmxlcyB3aWxsIGdldCBvcHRpbWlzZWQgYnkgdGhlIGNvbXBpbGVyLAorCQkgKiBzbyBsZXQncyBhaW0gZm9yIGNsYXJpdHkuLi4gLSBKZWFuIElJICovCisJCV9fdTggZXA7CS8qIEVuZHBvaW50IGFkZHJlc3MgKi8KKwkJX191OCBkaXI7CS8qIEVuZHBvaW50IGRpcmVjdGlvbiAqLworCQlfX3U4IGF0dHI7CS8qIEVuZHBvaW50IGF0dHJpYnV0ZSAqLworCQlfX3UxNiBwc2l6ZTsJLyogRW5kcG9pbnQgbWF4IHBhY2tldCBzaXplIGluIGJ5dGVzICovCisKKwkJLyogR2V0IGVuZHBvaW50IGFkZHJlc3MsIGRpcmVjdGlvbiBhbmQgYXR0cmlidXRlICovCisJCWVwID0gZW5kcG9pbnRbaV0uZGVzYy5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOworCQlkaXIgPSBlbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0s7CisJCWF0dHIgPSBlbmRwb2ludFtpXS5kZXNjLmJtQXR0cmlidXRlczsKKwkJcHNpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludFtpXS5kZXNjLndNYXhQYWNrZXRTaXplKTsKKworCQkvKiBJcyBpdCBhIGJ1bGsgZW5kcG9pbnQgPz8/ICovCisJCWlmKGF0dHIgPT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSykgeworCQkJLyogV2UgbmVlZCB0byBmaW5kIGFuIElOIGFuZCBhbiBPVVQgKi8KKwkJCWlmKGRpciA9PSBVU0JfRElSX0lOKSB7CisJCQkJLyogVGhpcyBpcyBvdXIgUnggZW5kcG9pbnQgKi8KKwkJCQlzZWxmLT5idWxrX2luX2VwID0gZXA7CisJCQl9IGVsc2UgeworCQkJCS8qIFRoaXMgaXMgb3VyIFR4IGVuZHBvaW50ICovCisJCQkJc2VsZi0+YnVsa19vdXRfZXAgPSBlcDsKKwkJCQlzZWxmLT5idWxrX291dF9tdHUgPSBwc2l6ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmKChhdHRyID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkgJiYKKwkJCSAgIChkaXIgPT0gVVNCX0RJUl9JTikpIHsKKwkJCQkvKiBUaGlzIGlzIG91ciBpbnRlcnJ1cHQgZW5kcG9pbnQgKi8KKwkJCQlzZWxmLT5idWxrX2ludF9lcCA9IGVwOworCQkJfSBlbHNlIHsKKwkJCQlJUkRBX0VSUk9SKCIlcygpLCBVbnJlY29nbmlzZWQgZW5kcG9pbnQgJTAyWC5cbiIsIF9fRlVOQ1RJT05fXywgZXApOworCQkJfQorCQl9CisJfQorCisJSVJEQV9ERUJVRygwLCAiJXMoKSwgQW5kIG91ciBlbmRwb2ludHMgYXJlIDogaW49JTAyWCwgb3V0PSUwMlggKCVkKSwgaW50PSUwMlhcbiIsCisJCV9fRlVOQ1RJT05fXywgc2VsZi0+YnVsa19pbl9lcCwgc2VsZi0+YnVsa19vdXRfZXAsIHNlbGYtPmJ1bGtfb3V0X210dSwgc2VsZi0+YnVsa19pbnRfZXApOworCS8qIFNob3VsZCBiZSA4LCAxNiwgMzIgb3IgNjQgYnl0ZXMgKi8KKwlJUkRBX0FTU0VSVChzZWxmLT5idWxrX291dF9tdHUgPT0gNjQsIDspOworCisJcmV0dXJuKChzZWxmLT5idWxrX2luX2VwICE9IDApICYmIChzZWxmLT5idWxrX291dF9lcCAhPSAwKSk7Cit9CisKKyNpZmRlZiBJVV9EVU1QX0NMQVNTX0RFU0MKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiB1c2JfaXJkYV9kdW1wX2NsYXNzX2Rlc2MoZGVzYykKKyAqCisgKiAgICBQcmludHMgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgSXJEQSBjbGFzcyBkZXNjcmlwdG9yCisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXJkYV91c2JfZHVtcF9jbGFzc19kZXNjKHN0cnVjdCBpcmRhX2NsYXNzX2Rlc2MgKmRlc2MpCit7CisJLyogVmFsdWVzIGFyZSBsaXR0bGUgZW5kaWFuICovCisJcHJpbnRrKCJiTGVuZ3RoPSV4XG4iLCBkZXNjLT5iTGVuZ3RoKTsKKwlwcmludGsoImJEZXNjcmlwdG9yVHlwZT0leFxuIiwgZGVzYy0+YkRlc2NyaXB0b3JUeXBlKTsKKwlwcmludGsoImJjZFNwZWNSZXZpc2lvbj0leFxuIiwgbGUxNl90b19jcHUoZGVzYy0+YmNkU3BlY1JldmlzaW9uKSk7IAorCXByaW50aygiYm1EYXRhU2l6ZT0leFxuIiwgZGVzYy0+Ym1EYXRhU2l6ZSk7CisJcHJpbnRrKCJibVdpbmRvd1NpemU9JXhcbiIsIGRlc2MtPmJtV2luZG93U2l6ZSk7CisJcHJpbnRrKCJibU1pblR1cm5hcm91bmRUaW1lPSVkXG4iLCBkZXNjLT5ibU1pblR1cm5hcm91bmRUaW1lKTsKKwlwcmludGsoIndCYXVkUmF0ZT0leFxuIiwgbGUxNl90b19jcHUoZGVzYy0+d0JhdWRSYXRlKSk7CisJcHJpbnRrKCJibUFkZGl0aW9uYWxCT0ZzPSV4XG4iLCBkZXNjLT5ibUFkZGl0aW9uYWxCT0ZzKTsKKwlwcmludGsoImJJcmRhUmF0ZVNuaWZmPSV4XG4iLCBkZXNjLT5iSXJkYVJhdGVTbmlmZik7CisJcHJpbnRrKCJiTWF4VW5pY2FzdExpc3Q9JXhcbiIsIGRlc2MtPmJNYXhVbmljYXN0TGlzdCk7Cit9CisjZW5kaWYgLyogSVVfRFVNUF9DTEFTU19ERVNDICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBGdW5jdGlvbiBpcmRhX3VzYl9maW5kX2NsYXNzX2Rlc2MoaW50ZikKKyAqCisgKiAgICBSZXR1cm5zIGluc3RhbmNlIG9mIElyREEgY2xhc3MgZGVzY3JpcHRvciwgb3IgTlVMTCBpZiBub3QgZm91bmQKKyAqCisgKiBUaGUgY2xhc3MgZGVzY3JpcHRvciBpcyBzb21lIGV4dHJhIGluZm8gdGhhdCBJckRBIFVTQiBkZXZpY2VzIHdpbGwKKyAqIG9mZmVyIHRvIHVzLCBkZXNjcmliaW5nIHRoZWlyIElyREEgY2hhcmFjdGVyaXN0aWNzLiBXZSB3aWxsIHVzZSB0aGF0IGluCisgKiBpcmRhX3VzYl9pbml0X3FvcygpCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlyZGFfY2xhc3NfZGVzYyAqaXJkYV91c2JfZmluZF9jbGFzc19kZXNjKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2IChpbnRmKTsKKwlzdHJ1Y3QgaXJkYV9jbGFzc19kZXNjICpkZXNjOworCWludCByZXQ7CisKKwlkZXNjID0ga21hbGxvYyhzaXplb2YgKCpkZXNjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRlc2MgPT0gTlVMTCkgCisJCXJldHVybiBOVUxMOworCW1lbXNldChkZXNjLCAwLCBzaXplb2YoKmRlc2MpKTsKKworCS8qIFVTQi1JckRBIGNsYXNzIHNwZWMgMS4wOgorCSAqCTYuMS4zOiBTdGFuZGFyZCAiR2V0IERlc2NyaXB0b3IiIERldmljZSBSZXF1ZXN0IGlzIG5vdAorCSAqCSAgICAgICBhcHByb3ByaWF0ZSB0byByZXRyaWV2ZSBjbGFzcy1zcGVjaWZpYyBkZXNjcmlwdG9yCisJICoJNi4yLjU6IENsYXNzIFNwZWNpZmljICJHZXQgQ2xhc3MgRGVzY3JpcHRvciIgSW50ZXJmYWNlIFJlcXVlc3QKKwkgKgkgICAgICAgaXMgbWFuZGF0b3J5IGFuZCByZXR1cm5zIHRoZSBVU0ItSXJEQSBjbGFzcyBkZXNjcmlwdG9yCisJICovCisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2JfcmN2Y3RybHBpcGUoZGV2LDApLAorCQlJVV9SRVFfR0VUX0NMQVNTX0RFU0MsCisJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UsCisJCTAsIGludGYtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlciwgZGVzYywKKwkJc2l6ZW9mKCpkZXNjKSwgNTAwKTsKKwkKKwlJUkRBX0RFQlVHKDEsICIlcygpLCByZXQ9JWRcbiIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKwlpZiAocmV0IDwgc2l6ZW9mKCpkZXNjKSkgeworCQlJUkRBX1dBUk5JTkcoInVzYi1pcmRhOiBjbGFzc19kZXNjcmlwdG9yIHJlYWQgJXMgKCVkKVxuIiwKKwkJCSAgICAgKHJldDwwKSA/ICJmYWlsZWQiIDogInRvbyBzaG9ydCIsIHJldCk7CisJfQorCWVsc2UgaWYgKGRlc2MtPmJEZXNjcmlwdG9yVHlwZSAhPSBVU0JfRFRfSVJEQSkgeworCQlJUkRBX1dBUk5JTkcoInVzYi1pcmRhOiBiYWQgY2xhc3NfZGVzY3JpcHRvciB0eXBlXG4iKTsKKwl9CisJZWxzZSB7CisjaWZkZWYgSVVfRFVNUF9DTEFTU19ERVNDCisJCWlyZGFfdXNiX2R1bXBfY2xhc3NfZGVzYyhkZXNjKTsKKyNlbmRpZgkvKiBJVV9EVU1QX0NMQVNTX0RFU0MgKi8KKworCQlyZXR1cm4gZGVzYzsKKwl9CisJa2ZyZWUoZGVzYyk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBVU0IgREVWSUNFIENBTExCQUNLUyAqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBNYWluIGNhbGxzIGZyb20gdGhlIFVTQiBzdWJzeXN0ZW0uCisgKiBNb3N0bHkgcmVnaXN0ZXJpbmcgYSBuZXcgaXJkYS11c2IgZGV2aWNlIGFuZCByZW1vdmluZyBpdC4uLi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgVVNCIHN1YnN5c3RlbSBmb3IgZWFjaCBuZXcgZGV2aWNlCisgKiBpbiB0aGUgc3lzdGVtLiBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgb3VycywgYW5kIGluCisgKiB0aGlzIGNhc2Ugc3RhcnQgaGFuZGxpbmcgaXQuCisgKiBUaGUgVVNCIGxheWVyIHByb3RlY3QgdXMgZnJvbSByZWVudHJhbmN5ICh2aWEgQktMKSwgc28gd2UgZG9uJ3QgbmVlZAorICogdG8gc3BpbmxvY2sgaW4gdGhlcmUuLi4gSmVhbiBJSQorICovCitzdGF0aWMgaW50IGlyZGFfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3QgaXJkYV91c2JfY2IgKnNlbGYgPSBOVUxMOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmludGVyZmFjZTsKKwlzdHJ1Y3QgaXJkYV9jbGFzc19kZXNjICppcmRhX2Rlc2M7CisJaW50IHJldCA9IC1FTk9NRU07CisJaW50IGk7CQkvKiBEcml2ZXIgaW5zdGFuY2UgaW5kZXggLyBSeCBVUkIgaW5kZXggKi8KKworCS8qIE5vdGUgOiB0aGUgcHJvYmUgbWFrZSBzdXJlIHRvIGNhbGwgdXMgb25seSBmb3IgZGV2aWNlcyB0aGF0CisJICogbWF0Y2hlcyB0aGUgbGlzdCBvZiBkb25nbGUgKHRvcCBvZiB0aGUgZmlsZSkuIFNvLCB3ZQorCSAqIGRvbid0IG5lZWQgdG8gY2hlY2sgaWYgdGhlIGRvbmdsZSBpcyByZWFsbHkgb3Vycy4KKwkgKiBKZWFuIElJICovCisKKwlJUkRBX01FU1NBR0UoIklSREEtVVNCIGZvdW5kIGF0IGFkZHJlc3MgJWQsIFZlbmRvcjogJXgsIFByb2R1Y3Q6ICV4XG4iLAorCQkgICAgIGRldi0+ZGV2bnVtLCBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAorCQkgICAgIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKKworCW5ldCA9IGFsbG9jX2lyZGFkZXYoc2l6ZW9mKCpzZWxmKSk7CisJaWYgKCFuZXQpIAorCQlnb3RvIGVycl9vdXQ7CisKKwlTRVRfTU9EVUxFX09XTkVSKG5ldCk7CisJU0VUX05FVERFVl9ERVYobmV0LCAmaW50Zi0+ZGV2KTsKKwlzZWxmID0gbmV0LT5wcml2OworCXNlbGYtPm5ldGRldiA9IG5ldDsKKwlzcGluX2xvY2tfaW5pdCgmc2VsZi0+bG9jayk7CisKKwkvKiBDcmVhdGUgYWxsIG9mIHRoZSBuZWVkZWQgdXJicyAqLworCWZvciAoaSA9IDA7IGkgPCBJVV9NQVhfUlhfVVJCUzsgaSsrKSB7CisJCXNlbGYtPnJ4X3VyYltpXSA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJCWlmICghc2VsZi0+cnhfdXJiW2ldKSB7CisJCQlnb3RvIGVycl9vdXRfMTsKKwkJfQorCX0KKwlzZWxmLT50eF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghc2VsZi0+dHhfdXJiKSB7CisJCWdvdG8gZXJyX291dF8xOworCX0KKwlzZWxmLT5zcGVlZF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghc2VsZi0+c3BlZWRfdXJiKSB7CisJCWdvdG8gZXJyX291dF8yOworCX0KKworCS8qIElzIHRoaXMgcmVhbGx5IG5lY2Vzc2FyeT8gKG5vLCBleGNlcHQgbWF5YmUgZm9yIGJyb2tlbiBkZXZpY2VzKSAqLworCWlmICh1c2JfcmVzZXRfY29uZmlndXJhdGlvbiAoZGV2KSA8IDApIHsKKwkJZXJyKCJyZXNldF9jb25maWd1cmF0aW9uIGZhaWxlZCIpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycl9vdXRfMzsKKwl9CisKKwkvKiBJcyB0aGlzIHJlYWxseSBuZWNlc3Nhcnk/ICovCisJLyogTm90ZSA6IHNvbWUgZHJpdmVyIGRvIGhhcmRjb2RlIHRoZSBpbnRlcmZhY2UgbnVtYmVyLCBzb21lIG90aGVycworCSAqIHNwZWNpZnkgYW4gYWx0ZXJuYXRlLCBidXQgdmVyeSBmZXcgZHJpdmVyIGRvIGxpa2UgdGhpcy4KKwkgKiBKZWFuIElJICovCisJcmV0ID0gdXNiX3NldF9pbnRlcmZhY2UoZGV2LCBpbnRmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIsIDApOworCUlSREFfREVCVUcoMSwgInVzYi1pcmRhOiBzZXQgaW50ZXJmYWNlICVkIHJlc3VsdCAlZFxuIiwgaW50Zi0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCByZXQpOworCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoKKwkJCWJyZWFrOworCQljYXNlIC1FUElQRToJCS8qIC1FUElQRSA9IC0zMiAqLworCQkJLyogTWFydGluIERpZWhsIHNheXMgaWYgd2UgZ2V0IGEgLUVQSVBFIHdlIHNob3VsZAorCQkJICogYmUgZmluZSBhbmQgd2UgZG9uJ3QgbmVlZCB0byBkbyBhIHVzYl9jbGVhcl9oYWx0KCkuCisJCQkgKiAtIEplYW4gSUkgKi8KKwkJCUlSREFfREVCVUcoMCwgIiVzKCksIFJlY2VpdmVkIC1FUElQRSwgaWdub3JpbmcuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVycl9vdXRfMzsKKwl9CisKKwkvKiBGaW5kIG91ciBlbmRwb2ludHMgKi8KKwlpbnRlcmZhY2UgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKwlpZighaXJkYV91c2JfcGFyc2VfZW5kcG9pbnRzKHNlbGYsIGludGVyZmFjZS0+ZW5kcG9pbnQsCisJCQkJICAgICBpbnRlcmZhY2UtPmRlc2MuYk51bUVuZHBvaW50cykpIHsKKwkJSVJEQV9FUlJPUigiJXMoKSwgQm9ndXMgZW5kcG9pbnRzLi4uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycl9vdXRfMzsKKwl9CisKKwkvKiBGaW5kIElyREEgY2xhc3MgZGVzY3JpcHRvciAqLworCWlyZGFfZGVzYyA9IGlyZGFfdXNiX2ZpbmRfY2xhc3NfZGVzYyhpbnRmKTsKKwlyZXQgPSAtRU5PREVWOworCWlmIChpcmRhX2Rlc2MgPT0gTlVMTCkKKwkJZ290byBlcnJfb3V0XzM7CisKKwlzZWxmLT5pcmRhX2Rlc2MgPSAgaXJkYV9kZXNjOworCXNlbGYtPnByZXNlbnQgPSAxOworCXNlbGYtPm5ldG9wZW4gPSAwOworCXNlbGYtPmNhcGFiaWxpdHkgPSBpZC0+ZHJpdmVyX2luZm87CisJc2VsZi0+dXNiZGV2ID0gZGV2OworCXNlbGYtPnVzYmludGYgPSBpbnRmOworCisJLyogQWxsb2NhdGUgdGhlIGJ1ZmZlciBmb3Igc3BlZWQgY2hhbmdlcyAqLworCS8qIERvbid0IGNoYW5nZSB0aGlzIGJ1ZmZlciBzaXplIGFuZCBhbGxvY2F0aW9uIHdpdGhvdXQgZG9pbmcKKwkgKiBzb21lIGhlYXZ5IGFuZCBjb21wbGV0ZSB0ZXN0aW5nLiBEb24ndCBhc2sgd2h5IDotKAorCSAqIEplYW4gSUkgKi8KKwlzZWxmLT5zcGVlZF9idWZmID0gKGNoYXIgKikga21hbGxvYyhJUkRBX1VTQl9TUEVFRF9NVFUsIEdGUF9LRVJORUwpOworCWlmIChzZWxmLT5zcGVlZF9idWZmID09IE5VTEwpIAorCQlnb3RvIGVycl9vdXRfMzsKKworCW1lbXNldChzZWxmLT5zcGVlZF9idWZmLCAwLCBJUkRBX1VTQl9TUEVFRF9NVFUpOworCisJcmV0ID0gaXJkYV91c2Jfb3BlbihzZWxmKTsKKwlpZiAocmV0KSAKKwkJZ290byBlcnJfb3V0XzQ7CisKKwlJUkRBX01FU1NBR0UoIklyREE6IFJlZ2lzdGVyZWQgZGV2aWNlICVzXG4iLCBuZXQtPm5hbWUpOworCXVzYl9zZXRfaW50ZmRhdGEoaW50Ziwgc2VsZik7CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfNDoKKwlrZnJlZShzZWxmLT5zcGVlZF9idWZmKTsKK2Vycl9vdXRfMzoKKwkvKiBGcmVlIGFsbCB1cmJzIHRoYXQgd2UgbWF5IGhhdmUgY3JlYXRlZCAqLworCXVzYl9mcmVlX3VyYihzZWxmLT5zcGVlZF91cmIpOworZXJyX291dF8yOgorCXVzYl9mcmVlX3VyYihzZWxmLT50eF91cmIpOworZXJyX291dF8xOgorCWZvciAoaSA9IDA7IGkgPCBJVV9NQVhfUlhfVVJCUzsgaSsrKSB7CisJCWlmIChzZWxmLT5yeF91cmJbaV0pCisJCQl1c2JfZnJlZV91cmIoc2VsZi0+cnhfdXJiW2ldKTsKKwl9CisJZnJlZV9uZXRkZXYobmV0KTsKK2Vycl9vdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoZSBjdXJyZW50IGlyZGEtdXNiIGRldmljZSBpcyByZW1vdmVkLCB0aGUgVVNCIGxheWVyIHRlbGwgdXMKKyAqIHRvIHNodXQgaXQgZG93bi4uLgorICogT25lIG9mIHRoZSBjb25zdHJhaW50cyBpcyB0aGF0IHdoZW4gd2UgZXhpdCB0aGlzIGZ1bmN0aW9uLAorICogd2UgY2Fubm90IHVzZSB0aGUgdXNiX2RldmljZSBubyBtb3JlLiBHb25lLiBEZXN0cm95ZWQuIGtmcmVlKCkuCisgKiBNb3N0IG90aGVyIHN1YnN5c3RlbSBhbGxvdyB5b3UgdG8gZGVzdHJveSB0aGUgaW5zdGFuY2UgYXQgYSB0aW1lCisgKiB3aGVuIGl0J3MgY29udmVuaWVudCB0byB5b3UsIHRvIHBvc3Rwb25lIGl0IHRvIGEgbGF0ZXIgZGF0ZSwgYnV0CisgKiBub3QgdGhlIFVTQiBzdWJzeXN0ZW0uCisgKiBTbywgd2UgbXVzdCBtYWtlIGJsb29keSBzdXJlIHRoYXQgZXZlcnl0aGluZyBnZXRzIGRlYWN0aXZhdGVkLgorICogSmVhbiBJSQorICovCitzdGF0aWMgdm9pZCBpcmRhX3VzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlyZGFfdXNiX2NiICpzZWxmID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlpbnQgaTsKKworCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCWlmICghc2VsZikKKwkJcmV0dXJuOworCisJLyogTWFrZSBzdXJlIHRoYXQgdGhlIFR4IHBhdGggaXMgbm90IGV4ZWN1dGluZy4gLSBKZWFuIElJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCS8qIE91cHMgISBXZSBhcmUgbm90IHRoZXJlIGFueSBtb3JlLgorCSAqIFRoaXMgd2lsbCBzdG9wL2Rlc2FjdGl2YXRlIHRoZSBUeCBwYXRoLiAtIEplYW4gSUkgKi8KKwlzZWxmLT5wcmVzZW50ID0gMDsKKworCS8qIFdlIG5lZWQgdG8gaGF2ZSBpcnEgZW5hYmxlZCB0byB1bmxpbmsgdGhlIFVSQnMuIFRoYXQncyBPSywKKwkgKiBhdCB0aGlzIHBvaW50IHRoZSBUeCBwYXRoIGlzIGdvbmUgLSBKZWFuIElJICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJLyogSHVtLi4uIENoZWNrIGlmIG5ldHdvcmtpbmcgaXMgc3RpbGwgYWN0aXZlIChhdm9pZCByYWNlcykgKi8KKwlpZigoc2VsZi0+bmV0b3BlbikgfHwgKHNlbGYtPmlybGFwKSkgeworCQkvKiBBY2NlcHQgbm8gbW9yZSB0cmFuc21pc3Npb25zICovCisJCS8qbmV0aWZfZGV2aWNlX2RldGFjaChzZWxmLT5uZXRkZXYpOyovCisJCW5ldGlmX3N0b3BfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKwkJLyogU3RvcCBhbGwgdGhlIHJlY2VpdmUgVVJCcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgSVVfTUFYX1JYX1VSQlM7IGkrKykKKwkJCXVzYl9raWxsX3VyYihzZWxmLT5yeF91cmJbaV0pOworCQkvKiBDYW5jZWwgVHggYW5kIHNwZWVkIFVSQi4KKwkJICogVG9nZ2xlIGZsYWdzIHRvIG1ha2Ugc3VyZSBpdCdzIHN5bmNocm9ub3VzLiAqLworCQlzZWxmLT50eF91cmItPnRyYW5zZmVyX2ZsYWdzICY9IH5VUkJfQVNZTkNfVU5MSU5LOworCQl1c2Jfa2lsbF91cmIoc2VsZi0+dHhfdXJiKTsKKwkJc2VsZi0+c3BlZWRfdXJiLT50cmFuc2Zlcl9mbGFncyAmPSB+VVJCX0FTWU5DX1VOTElOSzsKKwkJdXNiX2tpbGxfdXJiKHNlbGYtPnNwZWVkX3VyYik7CisJfQorCisJLyogQ2xlYW51cCB0aGUgZGV2aWNlIHN0dWZmICovCisJaXJkYV91c2JfY2xvc2Uoc2VsZik7CisJLyogTm8gbG9uZ2VyIGF0dGFjaGVkIHRvIFVTQiBidXMgKi8KKwlzZWxmLT51c2JkZXYgPSBOVUxMOworCXNlbGYtPnVzYmludGYgPSBOVUxMOworCisJLyogQ2xlYW4gdXAgb3VyIHVyYnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgSVVfTUFYX1JYX1VSQlM7IGkrKykKKwkJdXNiX2ZyZWVfdXJiKHNlbGYtPnJ4X3VyYltpXSk7CisJLyogQ2xlYW4gdXAgVHggYW5kIHNwZWVkIFVSQiAqLworCXVzYl9mcmVlX3VyYihzZWxmLT50eF91cmIpOworCXVzYl9mcmVlX3VyYihzZWxmLT5zcGVlZF91cmIpOworCisJLyogRnJlZSBzZWxmIGFuZCBuZXR3b3JrIGRldmljZSAqLworCWZyZWVfbmV0ZGV2KHNlbGYtPm5ldGRldik7CisJSVJEQV9ERUJVRygwLCAiJXMoKSwgVVNCIElyREEgRGlzY29ubmVjdGVkXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVVNCIGRldmljZSBjYWxsYmFja3MKKyAqLworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGlyZGFfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiaXJkYS11c2IiLAorCS5wcm9iZQkJPSBpcmRhX3VzYl9wcm9iZSwKKwkuZGlzY29ubmVjdAk9IGlyZGFfdXNiX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCT0gZG9uZ2xlcywKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIE1PRFVMRSBDQUxMQkFDS1MgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBEZWFsIHdpdGggbW9kdWxlIGluc2VydGlvbi9yZW1vdmFsCisgKiBNb3N0bHkgdGVsbCBVU0IgYWJvdXQgb3VyIGV4aXN0ZW5jZQorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBNb2R1bGUgaW5zZXJ0aW9uCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHVzYl9pcmRhX2luaXQodm9pZCkKK3sKKwlpbnQJcmV0OworCisJcmV0ID0gdXNiX3JlZ2lzdGVyKCZpcmRhX2RyaXZlcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlJUkRBX01FU1NBR0UoIlVTQiBJckRBIHN1cHBvcnQgcmVnaXN0ZXJlZFxuIik7CisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdCh1c2JfaXJkYV9pbml0KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIE1vZHVsZSByZW1vdmFsCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCB1c2JfaXJkYV9jbGVhbnVwKHZvaWQpCit7CisJLyogRGVyZWdpc3RlciB0aGUgZHJpdmVyIGFuZCByZW1vdmUgYWxsIHBlbmRpbmcgaW5zdGFuY2VzICovCisJdXNiX2RlcmVnaXN0ZXIoJmlyZGFfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHVzYl9pcmRhX2NsZWFudXApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogTW9kdWxlIHBhcmFtZXRlcnMKKyAqLworbW9kdWxlX3BhcmFtKHFvc19tdHRfYml0cywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocW9zX210dF9iaXRzLCAiTWluaW11bSBUdXJuIFRpbWUiKTsKK01PRFVMRV9BVVRIT1IoIlJvbWFuIFdlaXNzZ2FlcmJlciA8d2Vpc3NnQHZpZW5uYS5hdD4sIERhZyBCcmF0dGxpIDxkYWdAYnJhdHRsaS5uZXQ+IGFuZCBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklyREEtVVNCIERvbmdsZSBEcml2ZXIiKTsgCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmggYi9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ4ZjY2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuaApAQCAtMCwwICsxLDE2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRmlsZW5hbWU6ICAgICAgaXJkYS11c2IuaAorICogVmVyc2lvbjogICAgICAgMC45YgorICogRGVzY3JpcHRpb246ICAgSXJEQS1VU0IgRHJpdmVyCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwgCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnQGJyYXR0bGkubmV0PgorICoKKyAqCUNvcHlyaWdodCAoQykgMjAwMSwgUm9tYW4gV2Vpc3NnYWVyYmVyIDx3ZWlzc2dAdmllbm5hLmF0PgorICogICAgICBDb3B5cmlnaHQgKEMpIDIwMDAsIERhZyBCcmF0dGxpIDxkYWdAYnJhdHRsaS5uZXQ+CisgKiAgICAgIENvcHlyaWdodCAoQykgMjAwMSwgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgorICogICAgICAgICAgCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4gICAgICAvKiBzdHJ1Y3QgaXJsYXBfY2IgKi8KKworI2RlZmluZSBSWF9DT1BZX1RIUkVTSE9MRCAyMDAKKyNkZWZpbmUgSVJEQV9VU0JfTUFYX01UVSAyMDUxCisjZGVmaW5lIElSREFfVVNCX1NQRUVEX01UVSA2NAkJLyogV2VpcmQsIGJ1dCB3b3JrIGxpa2UgdGhpcyAqLworCisvKiBNYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgVVJCIG9uIHRoZSBSeCBwYXRoCisgKiBUaGlzIGlzIHRoZSBhbW91bnQgb2YgYnVmZmVycyB0aGUgd2Uga2VlcCBiZXR3ZWVuIHRoZSBVU0IgaGFyd2FyZSBhbmQgdGhlCisgKiBJckRBIHN0YWNrLgorICoKKyAqIE5vdGUgOiB0aGUgbmV0d29yayBsYXllciBkb2VzIGFsc28gcXVldWUgdGhlIHBhY2tldHMgYmV0d2VlbiB1cyBhbmQgdGhlCisgKiBJckRBIHN0YWNrLCBhbmQgaXMgYWN0dWFsbHkgcHJldHR5IGZhc3QgYW5kIGVmZmljaWVudCBpbiBkb2luZyB0aGF0LgorICogVGhlcmVmb3JlLCB3ZSBkb24ndCBuZWVkIHRvIGhhdmUgYSBsYXJnZSBudW1iZXIgb2YgVVJCcywgYW5kIHdlIGNhbgorICogcGVyZmVjdGx5IGxpdmUgaGFwcHkgd2l0aCBvbmx5IG9uZS4gV2UgY2VydGFpbmx5IGRvbid0IG5lZWQgdG8ga2VlcCB0aGUKKyAqIGZ1bGwgSXJUVFAgd2luZG93IGFyb3VuZCBoZXJlLi4uCisgKiBJIHJlcGVhdCBmb3IgdGhvc2Ugd2hvIGhhdmUgdHJvdWJsZSB0byB1bmRlcnN0YW5kIDogMSBVUkIgaXMgcGxlbnR5CisgKiBnb29kIGVub3VnaCB0byBoYW5kbGUgYmFjay10by1iYWNrIChicmlja3dhbGxlZCkgZnJhbWVzLiBJIHRyaWVkIGl0LAorICogaXQgd29ya3MgKGl0J3MgdGhlIGhhcmR3YXJlIHRoYXQgaGFzIHRyb3VibGUgZG9pbmcgaXQpLgorICoKKyAqIEhhdmluZyAyIFVSQnMgd291bGQgYWxsb3cgdGhlIFVTQiBzdGFjayB0byBwcm9jZXNzIG9uZSBVUkIgd2hpbGUgd2UgdGFrZQorICogY2FyZSBvZiB0aGUgb3RoZXIgYW5kIHRoZW4gc3dhcCB0aGUgVVJCcy4uLgorICogT24gdGhlIG90aGVyIGhhbmQsIGluY3JlYXNpbmcgdGhlIG51bWJlciBvZiBVUkIgd2lsbCBoYXZlIHBlbmFsaXRpZXMKKyAqIGluIHRlcm0gb2YgbGF0ZW5jeSBhbmQgd2lsbCBpbnRlcmFjdCB3aXRoIHRoZSBsaW5rIG1hbmFnZW1lbnQgaW4gSXJMQVAuLi4KKyAqIEplYW4gSUkgKi8KKyNkZWZpbmUgSVVfTUFYX0FDVElWRV9SWF9VUkJTCTEJLyogRG9uJ3QgdG91Y2ggISEhICovCisKKy8qIFdoZW4gYSBSeCBVUkIgaXMgcGFzc2VkIGJhY2sgdG8gdXMsIHdlIGNhbid0IHJldXNlIGl0IGltbWVkaWF0ZWx5LAorICogYmVjYXVzZSBpdCBtYXkgc3RpbGwgYmUgcmVmZXJlbmNlZCBieSB0aGUgVVNCIGxheWVyLiBUaGVyZWZvcmUgd2UKKyAqIG5lZWQgdG8ga2VlcCBvbmUgZXh0cmEgVVJCIGluIHRoZSBSeCBwYXRoLgorICogSmVhbiBJSSAqLworI2RlZmluZSBJVV9NQVhfUlhfVVJCUwkoSVVfTUFYX0FDVElWRV9SWF9VUkJTICsgMSkKKworLyogVmFyaW91cyB1Z2x5IHN0dWZmIHRvIHRyeSB0byB3b3JrYXJvdW5kIGdlbmVyaWMgcHJvYmxlbXMgKi8KKy8qIFNlbmQgc3BlZWQgY29tbWFuZCBpbiBjYXNlIG9mIHRpbWVvdXQsIGp1c3QgZm9yIHRyeWluZyB0byBnZXQgdGhpbmdzIHNhbmUgKi8KKyNkZWZpbmUgSVVfQlVHX0tJQ0tfVElNRU9VVAorLyogU2hvdyB0aGUgVVNCIGNsYXNzIGRlc2NyaXB0b3IgKi8KKyN1bmRlZiBJVV9EVU1QX0NMQVNTX0RFU0MgCisvKiBBc3N1bWUgYSBtaW5pbXVtIHJvdW5kIHRyaXAgbGF0ZW5jeSBmb3IgVVNCIHRyYW5zZmVyIChpbiB1cykuLi4KKyAqIFVTQiB0cmFuc2ZlciBhcmUgZG9uZSBpbiB0aGUgbmV4dCBVU0Igc2xvdCBpZiB0aGVyZSBpcyBubyB0cmFmZmljCisgKiAoMS8xOSBtc2VjKSBhbmQgaXMgZG9uZSBhdCAxMiBNYi9zIDoKKyAqIFdhaXRpbmcgZm9yIHNsb3QgKyB0eCA9ICg1M3VzICsgMTZ1cykgKiAyID0gMTM3dXMgbWluaW11bS4KKyAqIFJ4IG5vdGlmaWNhdGlvbiB3aWxsIG9ubHkgYmUgZG9uZSBhdCB0aGUgZW5kIG9mIHRoZSBVU0IgZnJhbWUgcGVyaW9kIDoKKyAqIE9IQ0kgOiBmcmFtZSBwZXJpb2QgPSAxbXMKKyAqIFVIQ0kgOiBmcmFtZSBwZXJpb2QgPSAxbXMsIGJ1dCBub3RpZmljYXRpb24gY2FuIHRha2UgMiBvciAzIG1zIDotKAorICogRUhDSSA6IGZyYW1lIHBlcmlvZCA9IDEyNXVzICovCisjZGVmaW5lIElVX1VTQl9NSU5fUlRUCQk1MDAJLyogVGhpcyBzaG91bGQgYmUgc2FmZSBpbiBtb3N0IGNhc2VzICovCisKKy8qIEluYm91bmQgaGVhZGVyICovCisjZGVmaW5lIE1FRElBX0JVU1kgICAgMHg4MAorCisjZGVmaW5lIFNQRUVEXzI0MDAgICAgMHgwMQorI2RlZmluZSBTUEVFRF85NjAwICAgIDB4MDIKKyNkZWZpbmUgU1BFRURfMTkyMDAgICAweDAzCisjZGVmaW5lIFNQRUVEXzM4NDAwICAgMHgwNAorI2RlZmluZSBTUEVFRF81NzYwMCAgIDB4MDUKKyNkZWZpbmUgU1BFRURfMTE1MjAwICAweDA2CisjZGVmaW5lIFNQRUVEXzU3NjAwMCAgMHgwNworI2RlZmluZSBTUEVFRF8xMTUyMDAwIDB4MDgKKyNkZWZpbmUgU1BFRURfNDAwMDAwMCAweDA5CisKKy8qIEJhc2ljIGNhcGFiaWxpdGllcyAqLworI2RlZmluZSBJVUNfREVGQVVMVAkweDAwCS8qIEJhc2ljIGRldmljZSBjb21wbGlhbnQgd2l0aCAxLjAgc3BlYyAqLworLyogTWFpbiBidWdzICovCisjZGVmaW5lIElVQ19TUEVFRF9CVUcJMHgwMQkvKiBEZXZpY2UgZG9lc24ndCBzZXQgc3BlZWQgYWZ0ZXIgdGhlIGZyYW1lICovCisjZGVmaW5lIElVQ19OT19XSU5ET1cJMHgwMgkvKiBEZXZpY2UgZG9lc24ndCBiZWhhdmUgd2l0aCBiaWcgUnggd2luZG93ICovCisjZGVmaW5lIElVQ19OT19UVVJOCTB4MDQJLyogRGV2aWNlIGRvZXNuJ3QgZG8gdHVybmFyb3VuZCBieSBpdHNlbGYgKi8KKy8qIE5vdCBjdXJyZW50bHkgdXNlZCAqLworI2RlZmluZSBJVUNfU0lSX09OTFkJMHgwOAkvKiBEZXZpY2UgZG9lc24ndCBiZWhhdmUgYXQgRklSIHNwZWVkcyAqLworI2RlZmluZSBJVUNfU01BTExfUEtUCTB4MTAJLyogRGV2aWNlIGRvZXNuJ3QgYmVoYXZlIHdpdGggYmlnIFJ4IHBhY2tldHMgKi8KKyNkZWZpbmUgSVVDX01BWF9XSU5ET1cJMHgyMAkvKiBEZXZpY2UgdW5kZXJlc3RpbWF0ZSB0aGUgUnggd2luZG93ICovCisjZGVmaW5lIElVQ19NQVhfWEJPRlMJMHg0MAkvKiBEZXZpY2UgbmVlZCBtb3JlIHhib2ZzIHRoYW4gYWR2ZXJ0aXNlZCAqLworCisvKiBVU0IgY2xhc3MgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVVNCX0lSREFfSEVBREVSICAgMHgwMQorI2RlZmluZSBVU0JfQ0xBU1NfSVJEQSAgICAweDAyIC8qIFVTQl9DTEFTU19BUFBfU1BFQyBzdWJjbGFzcyAqLyAKKyNkZWZpbmUgVVNCX0RUX0lSREEgICAgICAgMHgyMQorCitzdHJ1Y3QgaXJkYV9jbGFzc19kZXNjIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKwlfX3UxNiBiY2RTcGVjUmV2aXNpb247CisJX191OCAgYm1EYXRhU2l6ZTsKKwlfX3U4ICBibVdpbmRvd1NpemU7CisJX191OCAgYm1NaW5UdXJuYXJvdW5kVGltZTsKKwlfX3UxNiB3QmF1ZFJhdGU7CisJX191OCAgYm1BZGRpdGlvbmFsQk9GczsKKwlfX3U4ICBiSXJkYVJhdGVTbmlmZjsKKwlfX3U4ICBiTWF4VW5pY2FzdExpc3Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogY2xhc3Mgc3BlY2lmaWMgaW50ZXJmYWNlIHJlcXVlc3QgdG8gZ2V0IHRoZSBJckRBLVVTQiBjbGFzcyBkZXNjcmlwdG9yCisgKiAoNi4yLjUsIFVTQi1JckRBIGNsYXNzIHNwZWMgMS4wKSAqLworCisjZGVmaW5lIElVX1JFUV9HRVRfQ0xBU1NfREVTQwkweDA2CisKK3N0cnVjdCBpcmRhX3VzYl9jYiB7CisJc3RydWN0IGlyZGFfY2xhc3NfZGVzYyAqaXJkYV9kZXNjOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CS8qIGluaXQ6IHByb2JlX2lyZGEgKi8KKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdXNiaW50ZjsJLyogaW5pdDogcHJvYmVfaXJkYSAqLworCWludCBuZXRvcGVuOwkJCS8qIERldmljZSBpcyBhY3RpdmUgZm9yIG5ldHdvcmsgKi8KKwlpbnQgcHJlc2VudDsJCQkvKiBEZXZpY2UgaXMgcHJlc2VudCBvbiB0aGUgYnVzICovCisJX191MzIgY2FwYWJpbGl0eTsJCS8qIENhcGFiaWxpdHkgb2YgdGhlIGhhcmR3YXJlICovCisJX191OCAgYnVsa19pbl9lcDsJCS8qIFJ4IEVuZHBvaW50IGFzc2lnbm1lbnRzICovCisJX191OCAgYnVsa19vdXRfZXA7CQkvKiBUeCBFbmRwb2ludCBhc3NpZ25tZW50cyAqLworCV9fdTE2IGJ1bGtfb3V0X210dTsJCS8qIE1heCBUeCBwYWNrZXQgc2l6ZSBpbiBieXRlcyAqLworCV9fdTggIGJ1bGtfaW50X2VwOwkJLyogSW50ZXJydXB0IEVuZHBvaW50IGFzc2lnbm1lbnRzICovCisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3E7CS8qIGZvciB0aW1lb3V0cyAqLworCisJc3RydWN0IHVyYiAqcnhfdXJiW0lVX01BWF9SWF9VUkJTXTsJLyogVVJCcyB1c2VkIHRvIHJlY2VpdmUgZGF0YSBmcmFtZXMgKi8KKwlzdHJ1Y3QgdXJiICppZGxlX3J4X3VyYjsJLyogUG9pbnRlciB0byBpZGxlIFVSQiBpbiBSeCBwYXRoICovCisJc3RydWN0IHVyYiAqdHhfdXJiOwkJLyogVVJCIHVzZWQgdG8gc2VuZCBkYXRhIGZyYW1lcyAqLworCXN0cnVjdCB1cmIgKnNwZWVkX3VyYjsJCS8qIFVSQiB1c2VkIHRvIHNlbmQgc3BlZWQgY29tbWFuZHMgKi8KKwkKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwkvKiBZZXMhIHdlIGFyZSBzb21lIGtpbmQgb2YgbmV0ZGV2LiAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBpcmxhcF9jYiAgICppcmxhcDsJLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLworCXN0cnVjdCBxb3NfaW5mbyBxb3M7CisJaGFzaGJpbl90ICp0eF9saXN0OwkJLyogUXVldWVkIHRyYW5zbWl0IHNrYidzICovCisJY2hhciAqc3BlZWRfYnVmZjsJCS8qIEJ1ZmZlciBmb3Igc3BlZWQgY2hhbmdlcyAqLworCisJc3RydWN0IHRpbWV2YWwgc3RhbXA7CisJc3RydWN0IHRpbWV2YWwgbm93OworCisJc3BpbmxvY2tfdCBsb2NrOwkJLyogRm9yIHNlcmlhbGl6aW5nIG9wZXJhdGlvbnMgKi8KKworCV9fdTE2IHhib2ZzOwkJCS8qIEN1cnJlbnQgeGJvZnMgc2V0dGluZyAqLworCV9fczE2IG5ld194Ym9mczsJCS8qIHhib2ZzIHdlIG5lZWQgdG8gc2V0ICovCisJX191MzIgc3BlZWQ7CQkJLyogQ3VycmVudCBzcGVlZCAqLworCV9fczMyIG5ld19zcGVlZDsJCS8qIHNwZWVkIHdlIG5lZWQgdG8gc2V0ICovCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2lycG9ydC5jIGIvZHJpdmVycy9uZXQvaXJkYS9pcnBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTcxMzE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9pcnBvcnQuYwpAQCAtMCwwICsxLDExNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAorICogRmlsZW5hbWU6CSAgaXJwb3J0LmMKKyAqIFZlcnNpb246CSAgMS4wCisgKiBEZXNjcmlwdGlvbjogICBIYWxmIGR1cGxleCBzZXJpYWwgcG9ydCBTSVIgZHJpdmVyIGZvciBJckRBLiAKKyAqIFN0YXR1czoJICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6CSAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDoJICBTdW4gQXVnICAzIDEzOjQ5OjU5IDE5OTcKKyAqIE1vZGlmaWVkIGF0OiAgIEZyaSBKYW4gMjggMjA6MjI6MzggMjAwMAorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogU291cmNlczoJICBzZXJpYWwuYyBieSBMaW51cyBUb3J2YWxkcyAKKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5NywgMTk5OCwgMTk5OS0yMDAwIERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIEplYW4gVG91cnJpbGhlcywgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisgKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgKiAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICAgVGhpcyBkcml2ZXIgaXMgbWVudCB0byBiZSBhIHNtYWxsIGhhbGYgZHVwbGV4IHNlcmlhbCBkcml2ZXIgdG8gYmUKKyAqICAgICB1c2VkIGZvciBJUi1jaGlwc2V0cyB0aGF0IGhhcyBhIFVBUlQgKDE2NTUwKSBjb21wYXRpYmlsaXR5IG1vZGUuIAorICogICAgIEV2ZW50dWFsbHkgaXQgd2lsbCByZXBsYWNlIGlydHR5LCBiZWNhdXNlIG9mIGlydHR5IGhhcyBzb21lIAorICogICAgIHByb2JsZW1zIHRoYXQgaXMgaGFyZCB0byBnZXQgYXJvdW5kIHdoZW4gd2UgZG9uJ3QgaGF2ZSBjb250cm9sCisgKiAgICAgb3ZlciB0aGUgc2VyaWFsIGRyaXZlci4gVGhpcyBkcml2ZXIgbWF5IGFsc28gYmUgdXNlZCBieSBGSVIgCisgKiAgICAgZHJpdmVycyB0byBoYW5kbGUgU0lSIG1vZGUgZm9yIHRoZW0uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3dyYXBwZXIuaD4KKyNpbmNsdWRlICJpcnBvcnQuaCIKKworI2RlZmluZSBJT19FWFRFTlQgOAorCisvKiAKKyAqIEN1cnJlbnRseSB5b3UnbGwgbmVlZCB0byBzZXQgdGhlc2UgdmFsdWVzIHVzaW5nIGluc21vZCBsaWtlIHRoaXM6CisgKiBpbnNtb2QgaXJwb3J0IGlvPTB4M2U4IGlycT0xMQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGlvW10gID0geyB+MCwgfjAsIH4wLCB+MCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBpcnFbXSA9IHsgMCwgMCwgMCwgMCB9OworCitzdGF0aWMgdW5zaWduZWQgaW50IHFvc19tdHRfYml0cyA9IDB4MDM7CisKK3N0YXRpYyBzdHJ1Y3QgaXJwb3J0X2NiICpkZXZfc2VsZltdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfTsKK3N0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9ICJpcnBvcnQiOworCitzdGF0aWMgaW5saW5lIHZvaWQgaXJwb3J0X3dyaXRlX3dha2V1cChzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmKTsKK3N0YXRpYyBpbmxpbmUgaW50ICBpcnBvcnRfd3JpdGUoaW50IGlvYmFzZSwgaW50IGZpZm9fc2l6ZSwgX191OCAqYnVmLCBpbnQgbGVuKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcnBvcnRfcmVjZWl2ZShzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmKTsKKworc3RhdGljIGludCAgaXJwb3J0X25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCAKKwkJCSAgICAgaW50IGNtZCk7CitzdGF0aWMgaW5saW5lIGludCAgaXJwb3J0X2lzX3JlY2VpdmluZyhzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmKTsKK3N0YXRpYyBpbnQgIGlycG9ydF9zZXRfZHRyX3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZHRyLCBpbnQgcnRzKTsKK3N0YXRpYyBpbnQgIGlycG9ydF9yYXdfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191OCAqYnVmLCBpbnQgbGVuKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXJwb3J0X25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGlycG9ydF9jaGFuZ2Vfc3BlZWRfY29tcGxldGUoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CitzdGF0aWMgdm9pZCBpcnBvcnRfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGlycXJldHVybl90IGlycG9ydF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IGlycG9ydF9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBpcnBvcnRfY2hhbmdlX3NwZWVkKHZvaWQgKnByaXYsIF9fdTMyIHNwZWVkKTsKK3N0YXRpYyBpbnQgaXJwb3J0X25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpcnBvcnRfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgc3RydWN0IGlycG9ydF9jYiAqCitpcnBvcnRfb3BlbihpbnQgaSwgdW5zaWduZWQgaW50IGlvYmFzZSwgdW5zaWduZWQgaW50IGlycSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBpcnBvcnRfY2IgKnNlbGY7CisKKwlJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogTG9jayB0aGUgcG9ydCB0aGF0IHdlIG5lZWQgKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgSU9fRVhURU5ULCBkcml2ZXJfbmFtZSkpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgY2FuJ3QgZ2V0IGlvYmFzZSBvZiAweCUwM3hcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGlvYmFzZSk7CisJCWdvdG8gZXJyX291dDE7CisJfQorCisJLyoKKwkgKiAgQWxsb2NhdGUgbmV3IGluc3RhbmNlIG9mIHRoZSBkcml2ZXIKKwkgKi8KKwlkZXYgPSBhbGxvY19pcmRhZGV2KHNpemVvZihzdHJ1Y3QgaXJwb3J0X2NiKSk7CisJaWYgKCFkZXYpIHsKKwkJSVJEQV9FUlJPUigiJXMoKSwgY2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciAiCisJCQkgICAiaXJkYSBkZXZpY2UhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGVycl9vdXQyOworCX0KKworCXNlbGYgPSBkZXYtPnByaXY7CisJc3Bpbl9sb2NrX2luaXQoJnNlbGYtPmxvY2spOworCisJLyogTmVlZCB0byBzdG9yZSBzZWxmIHNvbWV3aGVyZSAqLworCWRldl9zZWxmW2ldID0gc2VsZjsKKwlzZWxmLT5wcml2ID0gc2VsZjsKKwlzZWxmLT5pbmRleCA9IGk7CisKKwkvKiBJbml0aWFsaXplIElPICovCisJc2VsZi0+aW8uc2lyX2Jhc2UgID0gaW9iYXNlOworICAgICAgICBzZWxmLT5pby5zaXJfZXh0ICAgPSBJT19FWFRFTlQ7CisgICAgICAgIHNlbGYtPmlvLmlycSAgICAgICA9IGlycTsKKyAgICAgICAgc2VsZi0+aW8uZmlmb19zaXplID0gMTY7CQkvKiAxNjU1MEEgYW5kIGNvbXBhdGlibGUgKi8KKworCS8qIEluaXRpYWxpemUgUW9TIGZvciB0aGlzIGRldmljZSAqLworCWlyZGFfaW5pdF9tYXhfcW9zX2NhcGFiaWxpZXMoJnNlbGYtPnFvcyk7CisJCisJc2VsZi0+cW9zLmJhdWRfcmF0ZS5iaXRzID0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHwKKwkJSVJfMTE1MjAwOworCisJc2VsZi0+cW9zLm1pbl90dXJuX3RpbWUuYml0cyA9IHFvc19tdHRfYml0czsKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKCZzZWxmLT5xb3MpOworCQorCS8qIEJvb3RzdHJhcCBaZXJvQ29weSBSeCAqLworCXNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUgPSBJUkRBX1NLQl9NQVhfTVRVOworCXNlbGYtPnJ4X2J1ZmYuc2tiID0gX19kZXZfYWxsb2Nfc2tiKHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoc2VsZi0+cnhfYnVmZi5za2IgPT0gTlVMTCkgeworCQlJUkRBX0VSUk9SKCIlcygpLCBjYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKKwkJCSAgICJyZWNlaXZlIGJ1ZmZlciFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gZXJyX291dDM7CisJfQorCXNrYl9yZXNlcnZlKHNlbGYtPnJ4X2J1ZmYuc2tiLCAxKTsKKwlzZWxmLT5yeF9idWZmLmhlYWQgPSBzZWxmLT5yeF9idWZmLnNrYi0+ZGF0YTsKKwkvKiBObyBuZWVkIHRvIG1lbXNldCB0aGUgYnVmZmVyLCB1bmxlc3MgeW91IGFyZSByZWFsbHkgcGVkYW50aWMgKi8KKworCS8qIEZpbmlzaCBzZXR1cCB0aGUgUnggYnVmZmVyIGRlc2NyaXB0b3IgKi8KKwlzZWxmLT5yeF9idWZmLmluX2ZyYW1lID0gRkFMU0U7CisJc2VsZi0+cnhfYnVmZi5zdGF0ZSA9IE9VVFNJREVfRlJBTUU7CisJc2VsZi0+cnhfYnVmZi5kYXRhID0gc2VsZi0+cnhfYnVmZi5oZWFkOworCisJLyogU3BlY2lmeSBob3cgbXVjaCBtZW1vcnkgd2Ugd2FudCAqLworCXNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUgPSA0MDAwOworCQorCS8qIEFsbG9jYXRlIG1lbW9yeSBpZiBuZWVkZWQgKi8KKwlpZiAoc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSA+IDApIHsKKwkJc2VsZi0+dHhfYnVmZi5oZWFkID0gKF9fdTggKikga21hbGxvYyhzZWxmLT50eF9idWZmLnRydWVzaXplLCAKKwkJCQkJCSAgICAgIEdGUF9LRVJORUwpOworCQlpZiAoc2VsZi0+dHhfYnVmZi5oZWFkID09IE5VTEwpIHsKKwkJCUlSREFfRVJST1IoIiVzKCksIGNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgIgorCQkJCSAgICJ0cmFuc21pdCBidWZmZXIhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJZ290byBlcnJfb3V0NDsKKwkJfQorCQltZW1zZXQoc2VsZi0+dHhfYnVmZi5oZWFkLCAwLCBzZWxmLT50eF9idWZmLnRydWVzaXplKTsKKwl9CQorCXNlbGYtPnR4X2J1ZmYuZGF0YSA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKKworCXNlbGYtPm5ldGRldiA9IGRldjsKKwkvKiBLZWVwIHRyYWNrIG9mIG1vZHVsZSB1c2FnZSAqLworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCS8qIE1heSBiZSBvdmVycmlkZGVuIGJ5IHBpZ2d5YmFjayBkcml2ZXJzICovCisJc2VsZi0+aW50ZXJydXB0ICAgID0gaXJwb3J0X2ludGVycnVwdDsKKwlzZWxmLT5jaGFuZ2Vfc3BlZWQgPSBpcnBvcnRfY2hhbmdlX3NwZWVkOworCisJLyogT3ZlcnJpZGUgdGhlIG5ldHdvcmsgZnVuY3Rpb25zIHdlIG5lZWQgdG8gdXNlICovCisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBpcnBvcnRfaGFyZF94bWl0OworCWRldi0+dHhfdGltZW91dAkgICAgID0gaXJwb3J0X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyAgPSBIWjsgIC8qIEFsbG93IHRpbWUgZW5vdWdoIGZvciBzcGVlZCBjaGFuZ2UgKi8KKwlkZXYtPm9wZW4gICAgICAgICAgICA9IGlycG9ydF9uZXRfb3BlbjsKKwlkZXYtPnN0b3AgICAgICAgICAgICA9IGlycG9ydF9uZXRfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMJICAgICA9IGlycG9ydF9uZXRfZ2V0X3N0YXRzOworCWRldi0+ZG9faW9jdGwgICAgICAgID0gaXJwb3J0X25ldF9pb2N0bDsKKworCS8qIE1ha2UgaWZjb25maWcgZGlzcGxheSBzb21lIGRldGFpbHMgKi8KKwlkZXYtPmJhc2VfYWRkciA9IGlvYmFzZTsKKwlkZXYtPmlycSA9IGlycTsKKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkgeworCQlJUkRBX0VSUk9SKCIlcygpLCByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGVycl9vdXQ1OworCX0KKwlJUkRBX01FU1NBR0UoIklyREE6IFJlZ2lzdGVyZWQgZGV2aWNlICVzIChpcnBvcnQgaW89MHglWCBpcnE9JWQpXG4iLAorCQlkZXYtPm5hbWUsIGlvYmFzZSwgaXJxKTsKKworCXJldHVybiBzZWxmOworIGVycl9vdXQ1OgorCWtmcmVlKHNlbGYtPnR4X2J1ZmYuaGVhZCk7CisgZXJyX291dDQ6CisJa2ZyZWVfc2tiKHNlbGYtPnJ4X2J1ZmYuc2tiKTsKKyBlcnJfb3V0MzoKKwlmcmVlX25ldGRldihkZXYpOworCWRldl9zZWxmW2ldID0gTlVMTDsKKyBlcnJfb3V0MjoKKwlyZWxlYXNlX3JlZ2lvbihpb2Jhc2UsIElPX0VYVEVOVCk7CisgZXJyX291dDE6CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgaXJwb3J0X2Nsb3NlKHN0cnVjdCBpcnBvcnRfY2IgKnNlbGYpCit7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCS8qIFdlIGFyZSBub3QgdXNpbmcgYW55IGRvbmdsZSBhbnltb3JlISAqLworCWlmIChzZWxmLT5kb25nbGUpCisJCWlyZGFfZGV2aWNlX2RvbmdsZV9jbGVhbnVwKHNlbGYtPmRvbmdsZSk7CisJc2VsZi0+ZG9uZ2xlID0gTlVMTDsKKwkKKwkvKiBSZW1vdmUgbmV0ZGV2aWNlICovCisJdW5yZWdpc3Rlcl9uZXRkZXYoc2VsZi0+bmV0ZGV2KTsKKworCS8qIFJlbGVhc2UgdGhlIElPLXBvcnQgdGhhdCB0aGlzIGRyaXZlciBpcyB1c2luZyAqLworCUlSREFfREVCVUcoMCAsICIlcygpLCBSZWxlYXNpbmcgUmVnaW9uICUwM3hcbiIsIAorCQkgICBfX0ZVTkNUSU9OX18sIHNlbGYtPmlvLnNpcl9iYXNlKTsKKwlyZWxlYXNlX3JlZ2lvbihzZWxmLT5pby5zaXJfYmFzZSwgc2VsZi0+aW8uc2lyX2V4dCk7CisKKwlpZiAoc2VsZi0+dHhfYnVmZi5oZWFkKQorCQlrZnJlZShzZWxmLT50eF9idWZmLmhlYWQpOworCQorCWlmIChzZWxmLT5yeF9idWZmLnNrYikKKwkJa2ZyZWVfc2tiKHNlbGYtPnJ4X2J1ZmYuc2tiKTsKKwlzZWxmLT5yeF9idWZmLnNrYiA9IE5VTEw7CisJCisJLyogUmVtb3ZlIG91cnNlbHZlcyAqLworCWRldl9zZWxmW3NlbGYtPmluZGV4XSA9IE5VTEw7CisJZnJlZV9uZXRkZXYoc2VsZi0+bmV0ZGV2KTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXJwb3J0X3N0b3Aoc3RydWN0IGlycG9ydF9jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwkvKiBXZSBjYW4ndCBsb2NrLCB3ZSBtYXkgYmUgY2FsbGVkIGZyb20gYSBGSVIgZHJpdmVyIC0gSmVhbiBJSSAqLworCisJLyogV2UgYXJlIG5vdCB0cmFuc21pdHRpbmcgYW55IG1vcmUgKi8KKwlzZWxmLT50cmFuc21pdHRpbmcgPSAwOworCisJLyogUmVzZXQgVUFSVCAqLworCW91dGIoMCwgaW9iYXNlK1VBUlRfTUNSKTsKKwkKKwkvKiBUdXJuIG9mZiBpbnRlcnJ1cHRzICovCisJb3V0YigwLCBpb2Jhc2UrVUFSVF9JRVIpOworfQorCitzdGF0aWMgdm9pZCBpcnBvcnRfc3RhcnQoc3RydWN0IGlycG9ydF9jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwlpcnBvcnRfc3RvcChzZWxmKTsKKwkKKwkvKiBXZSBjYW4ndCBsb2NrLCB3ZSBtYXkgYmUgY2FsbGVkIGZyb20gYSBGSVIgZHJpdmVyIC0gSmVhbiBJSSAqLworCisJLyogSW5pdGlhbGl6ZSBVQVJUICovCisJb3V0YihVQVJUX0xDUl9XTEVOOCwgaW9iYXNlK1VBUlRfTENSKTsgIC8qIFJlc2V0IERMQUIgKi8KKwlvdXRiKChVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMgfCBVQVJUX01DUl9PVVQyKSwgaW9iYXNlK1VBUlRfTUNSKTsKKwkKKwkvKiBUdXJuIG9uIGludGVycnVwcyAqLworCW91dGIoVUFSVF9JRVJfUkxTSSB8IFVBUlRfSUVSX1JESSB8VUFSVF9JRVJfVEhSSSwgaW9iYXNlK1VBUlRfSUVSKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlycG9ydF9wcm9iZSAodm9pZCkKKyAqCisgKiAgICBTdGFydCBJTyBwb3J0IAorICoKKyAqLworaW50IGlycG9ydF9wcm9iZShpbnQgaW9iYXNlKQoreworCUlSREFfREVCVUcoNCwgIiVzKCksIGlvYmFzZT0lI3hcbiIsIF9fRlVOQ1RJT05fXywgaW9iYXNlKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJwb3J0X2dldF9mY3IgKHNwZWVkKQorICoKKyAqICAgIENvbXB1dGUgdmFsdWUgb2YgZmNyCisgKgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpcnBvcnRfZ2V0X2ZjcihfX3UzMiBzcGVlZCkKK3sKKwl1bnNpZ25lZCBpbnQgZmNyOyAgICAvKiBGSUZPIGNvbnRyb2wgcmVnICovCisKKwkvKiBFbmFibGUgZmlmb3MgKi8KKwlmY3IgPSBVQVJUX0ZDUl9FTkFCTEVfRklGTzsKKworCS8qIAorCSAqIFVzZSB0cmlnZ2VyIGxldmVsIDEgdG8gYXZvaWQgMyBtcy4gdGltZW91dCBkZWxheSBhdCA5NjAwIGJwcywgYW5kCisJICogYWxtb3N0IDEsNyBtcyBhdCAxOTIwMCBicHMuIEF0IHNwZWVkcyBhYm92ZSB0aGF0IHdlIGNhbiBqdXN0IGZvcmdldAorCSAqIGFib3V0IHRoaXMgdGltZW91dCBzaW5jZSBpdCB3aWxsIGFsd2F5cyBiZSBmYXN0IGVub3VnaC4gCisJICovCisJaWYgKHNwZWVkIDwgMzg0MDApCisJCWZjciB8PSBVQVJUX0ZDUl9UUklHR0VSXzE7CisJZWxzZSAKKwkJLy9mY3IgfD0gVUFSVF9GQ1JfVFJJR0dFUl8xNDsKKwkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfODsKKworCXJldHVybihmY3IpOworfQorIAorLyoKKyAqIEZ1bmN0aW9uIGlycG9ydF9jaGFuZ2Vfc3BlZWQgKHNlbGYsIHNwZWVkKQorICoKKyAqICAgIFNldCBzcGVlZCBvZiBJckRBIHBvcnQgdG8gc3BlY2lmaWVkIGJhdWRyYXRlCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGggaXJxIG9mZiBhbmQgc3Bpbi1sb2NrLgorICovCitzdGF0aWMgdm9pZCBpcnBvcnRfY2hhbmdlX3NwZWVkKHZvaWQgKnByaXYsIF9fdTMyIHNwZWVkKQoreworCXN0cnVjdCBpcnBvcnRfY2IgKnNlbGYgPSAoc3RydWN0IGlycG9ydF9jYiAqKSBwcml2OworCWludCBpb2Jhc2U7IAorCXVuc2lnbmVkIGludCBmY3I7ICAgIC8qIEZJRk8gY29udHJvbCByZWcgKi8KKwl1bnNpZ25lZCBpbnQgbGNyOyAgICAvKiBMaW5lIGNvbnRyb2wgcmVnICovCisJaW50IGRpdmlzb3I7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNwZWVkICE9IDAsIHJldHVybjspOworCisJSVJEQV9ERUJVRygxLCAiJXMoKSwgU2V0dGluZyBzcGVlZCB0bzogJWQgLSBpb2Jhc2U9JSN4XG4iLAorCQkgICAgX19GVU5DVElPTl9fLCBzcGVlZCwgc2VsZi0+aW8uc2lyX2Jhc2UpOworCisJLyogV2UgY2FuJ3QgbG9jaywgd2UgbWF5IGJlIGNhbGxlZCBmcm9tIGEgRklSIGRyaXZlciAtIEplYW4gSUkgKi8KKworCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCQorCS8qIFVwZGF0ZSBhY2NvdW50aW5nIGZvciBuZXcgc3BlZWQgKi8KKwlzZWxmLT5pby5zcGVlZCA9IHNwZWVkOworCisJLyogVHVybiBvZmYgaW50ZXJydXB0cyAqLworCW91dGIoMCwgaW9iYXNlK1VBUlRfSUVSKTsgCisKKwlkaXZpc29yID0gU1BFRURfTUFYL3NwZWVkOworCQorCS8qIEdldCBwcm9wZXIgZmlmbyBjb25maWd1cmF0aW9uICovCisJZmNyID0gaXJwb3J0X2dldF9mY3Ioc3BlZWQpOworCisJLyogSXJEQSBwb3J0cyB1c2UgOE4xICovCisJbGNyID0gVUFSVF9MQ1JfV0xFTjg7CisJCisJb3V0YihVQVJUX0xDUl9ETEFCIHwgbGNyLCBpb2Jhc2UrVUFSVF9MQ1IpOyAvKiBTZXQgRExBQiAqLworCW91dGIoZGl2aXNvciAmIDB4ZmYsICAgICAgaW9iYXNlK1VBUlRfRExMKTsgLyogU2V0IHNwZWVkICovCisJb3V0YihkaXZpc29yID4+IDgsCSAgaW9iYXNlK1VBUlRfRExNKTsKKwlvdXRiKGxjciwJCSAgaW9iYXNlK1VBUlRfTENSKTsgLyogU2V0IDhOMQkqLworCW91dGIoZmNyLAkJICBpb2Jhc2UrVUFSVF9GQ1IpOyAvKiBFbmFibGUgRklGTydzICovCisKKwkvKiBUdXJuIG9uIGludGVycnVwcyAqLworCS8qIFRoaXMgd2lsbCBnZW5lcmF0ZSBhIGZhdGFsIGludGVycnVwdCBzdG9ybS4KKwkgKiBQZW9wbGUgY2FsbGluZyB1cyB3aWxsIGRvIHRoYXQgcHJvcGVybHkgLSBKZWFuIElJICovCisJLy9vdXRiKC8qVUFSVF9JRVJfUkxTSXwqL1VBUlRfSUVSX1JESS8qfFVBUlRfSUVSX1RIUkkqLywgaW9iYXNlK1VBUlRfSUVSKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIF9faXJwb3J0X2NoYW5nZV9zcGVlZCAoaW5zdGFuY2UsIHN0YXRlLCBwYXJhbSkKKyAqCisgKiAgICBTdGF0ZSBtYWNoaW5lIGZvciBjaGFuZ2luZyBzcGVlZCBvZiB0aGUgZGV2aWNlLiBXZSBkbyBpdCB0aGlzIHdheSBzaW5jZQorICogICAgd2UgY2Fubm90IHVzZSBzY2hlZHVsZV90aW1lb3V0KCkgd2hlbiB3ZSBhcmUgaW4gaW50ZXJydXB0IGNvbnRleHQKKyAqCisgKi8KK2ludCBfX2lycG9ydF9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmOworCV9fdTMyIHNwZWVkID0gKF9fdTMyKSB0YXNrLT5wYXJhbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlpbnQgd2FzdW5sb2NrZWQgPSAwOworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgPCVsZD5cbiIsIF9fRlVOQ1RJT05fXywgamlmZmllcyk7IAorCisJc2VsZiA9IChzdHJ1Y3QgaXJwb3J0X2NiICopIHRhc2stPmluc3RhbmNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCS8qIExvY2tpbmcgbm90ZXMgOiB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgZnJvbSBpcnEgY29udGV4dCB3aXRoCisJICogc3BpbmxvY2ssIHZpYSBpcnBvcnRfd3JpdGVfd2FrZXVwKCksIG9yIGZyb20gbm9uLWludGVycnVwdCB3aXRob3V0CisJICogc3BpbmxvY2sgKGZyb20gdGhlIHRhc2sgdGltZXIpLiBZdWNrICEKKwkgKiBUaGlzIGlzIHVnbHksIGFuZCB1bnNhZmUgaXMgdGhlIHNwaW5sb2NrIGlzIG5vdCBhbHJlYWR5IGFxdWlyZWQuCisJICogVGhpcyB3aWxsIGJlIGZpeGVkIHdoZW4gaXJkYS10YXNrIGdldCByZXdyaXR0ZW4uCisJICogSmVhbiBJSSAqLworCWlmICghc3Bpbl9pc19sb2NrZWQoJnNlbGYtPmxvY2spKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCXdhc3VubG9ja2VkID0gMTsKKwl9CisKKwlzd2l0Y2ggKHRhc2stPnN0YXRlKSB7CisJY2FzZSBJUkRBX1RBU0tfSU5JVDoKKwljYXNlIElSREFfVEFTS19XQUlUOgorCQkvKiBBcmUgd2UgcmVhZHkgdG8gY2hhbmdlIHNwZWVkIHlldD8gKi8KKwkJaWYgKHNlbGYtPnR4X2J1ZmYubGVuID4gMCkgeworCQkJdGFzay0+c3RhdGUgPSBJUkRBX1RBU0tfV0FJVDsKKworCQkJLyogVHJ5IGFnYWluIGxhdGVyICovCisJCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDIwKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNlbGYtPmRvbmdsZSkKKwkJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19DSElMRF9JTklUKTsKKwkJZWxzZQorCQkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0NISUxEX0RPTkUpOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19DSElMRF9JTklUOgorCQkvKiBHbyB0byBkZWZhdWx0IHNwZWVkICovCisJCXNlbGYtPmNoYW5nZV9zcGVlZChzZWxmLT5wcml2LCA5NjAwKTsKKworCQkvKiBDaGFuZ2Ugc3BlZWQgb2YgZG9uZ2xlICovCisJCWlmIChpcmRhX3Rhc2tfZXhlY3V0ZShzZWxmLT5kb25nbGUsCisJCQkJICAgICAgc2VsZi0+ZG9uZ2xlLT5pc3N1ZS0+Y2hhbmdlX3NwZWVkLCAKKwkJCQkgICAgICBOVUxMLCB0YXNrLCAodm9pZCAqKSBzcGVlZCkpCisJCXsKKwkJCS8qIERvbmdsZSBuZWVkIG1vcmUgdGltZSB0byBjaGFuZ2UgaXRzIHNwZWVkICovCisJCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfQ0hJTERfV0FJVCk7CisKKwkJCS8qIEdpdmUgZG9uZ2xlIDEgc2VjIHRvIGZpbmlzaCAqLworCQkJcmV0ID0gbXNlY3NfdG9famlmZmllcygxMDAwKTsKKwkJfSBlbHNlCisJCQkvKiBDaGlsZCBmaW5pc2hlZCBpbW1lZGlhdGVseSAqLworCQkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0NISUxEX0RPTkUpOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19DSElMRF9XQUlUOgorCQlJUkRBX1dBUk5JTkcoIiVzKCksIGNoYW5naW5nIHNwZWVkIG9mIGRvbmdsZSB0aW1lZCBvdXQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXQgPSAtMTsJCQorCQlicmVhazsKKwljYXNlIElSREFfVEFTS19DSElMRF9ET05FOgorCQkvKiBGaW5hbGx5IHdlIGFyZSByZWFkeSB0byBjaGFuZ2UgdGhlIHNwZWVkICovCisJCXNlbGYtPmNoYW5nZV9zcGVlZChzZWxmLT5wcml2LCBzcGVlZCk7CisJCQorCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzKCksIHVua25vd24gc3RhdGUgJWRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHRhc2stPnN0YXRlKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJfQorCS8qIFB1dCBzdHVmZiBpbiB0aGUgc3RhdGUgd2UgZm91bmQgdGhlbSAtIEplYW4gSUkgKi8KKwlpZih3YXN1bmxvY2tlZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlycG9ydF9jaGFuZ2Vfc3BlZWRfY29tcGxldGUgKHRhc2spCisgKgorICogICAgQ2FsbGVkIHdoZW4gdGhlIGNoYW5nZSBzcGVlZCBvcGVyYXRpb24gY29tcGxldGVzCisgKgorICovCitzdGF0aWMgaW50IGlycG9ydF9jaGFuZ2Vfc3BlZWRfY29tcGxldGUoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmOworCisJSVJEQV9ERUJVRygxLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXNlbGYgPSAoc3RydWN0IGlycG9ydF9jYiAqKSB0YXNrLT5pbnN0YW5jZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bmV0ZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCisJLyogRmluaXNoZWQgY2hhbmdpbmcgc3BlZWQsIHNvIHdlIGFyZSBub3QgYnVzeSBhbnkgbG9uZ2VyICovCisJLyogU2lnbmFsIG5ldHdvcmsgbGF5ZXIgc28gaXQgY2FuIHRyeSB0byBzZW5kIHRoZSBmcmFtZSAqLworCisJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJwb3J0X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCisgKgorICogICAgVGhlIG5ldHdvcmtpbmcgbGF5ZXIgdGhpbmtzIHdlIHRpbWVkIG91dC4KKyAqCisgKi8KKworc3RhdGljIHZvaWQgaXJwb3J0X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmOworCWludCBpb2Jhc2U7CisJaW50IGlpciwgbHNyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzZWxmID0gKHN0cnVjdCBpcnBvcnRfY2IgKikgZGV2LT5wcml2OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisJCisJSVJEQV9XQVJOSU5HKCIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBqaWZmaWVzID0gJWxkLCB0cmFuc19zdGFydCA9ICVsZFxuIiwKKwkJZGV2LT5uYW1lLCBqaWZmaWVzLCBkZXYtPnRyYW5zX3N0YXJ0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJLyogRGVidWcgd2hhdCdzIGhhcHBlbmluZy4uLiAqLworCisJLyogR2V0IGludGVycnVwdCBzdGF0dXMgKi8KKwlsc3IgPSBpbmIoaW9iYXNlK1VBUlRfTFNSKTsKKwkvKiBSZWFkIGludGVycnVwdCByZWdpc3RlciAqLworCWlpciA9IGluYihpb2Jhc2UrVUFSVF9JSVIpOworCUlSREFfREVCVUcoMCwgIiVzKCksIGlpcj0lMDJ4LCBsc3I9JTAyeCwgaW9iYXNlPSUjeFxuIiwgCisJCSAgIF9fRlVOQ1RJT05fXywgaWlyLCBsc3IsIGlvYmFzZSk7CisKKwlJUkRBX0RFQlVHKDAsICIlcygpLCB0cmFuc21pdHRpbmc9JWQsIHJlbWFpbj0lZCwgZG9uZT0lZFxuIiwgCisJCSAgIF9fRlVOQ1RJT05fXywgc2VsZi0+dHJhbnNtaXR0aW5nLCBzZWxmLT50eF9idWZmLmxlbiwKKwkJICAgc2VsZi0+dHhfYnVmZi5kYXRhIC0gc2VsZi0+dHhfYnVmZi5oZWFkKTsKKworCS8qIE5vdywgcmVzdGFydCB0aGUgcG9ydCAqLworCWlycG9ydF9zdGFydChzZWxmKTsKKwlzZWxmLT5jaGFuZ2Vfc3BlZWQoc2VsZi0+cHJpdiwgc2VsZi0+aW8uc3BlZWQpOworCS8qIFRoaXMgd2lsbCByZS1lbmFibGUgaXJxcyAqLworCW91dGIoLypVQVJUX0lFUl9STFNJfCovVUFSVF9JRVJfUkRJLyp8VUFSVF9JRVJfVEhSSSovLCBpb2Jhc2UrVUFSVF9JRVIpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKyAKKy8qCisgKiBGdW5jdGlvbiBpcnBvcnRfd2FpdF9od190cmFuc21pdHRlcl9maW5pc2ggKCkKKyAqCisgKiAgICBXYWl0IGZvciB0aGUgcmVhbCBlbmQgb2YgSFcgdHJhbnNtaXNzaW9uCisgKgorICogVGhlIFVBUlQgaXMgYSBzdHJpY3QgRklGTywgYW5kIHdlIGdldCBjYWxsZWQgb25seSB3aGVuIHdlIGhhdmUgZmluaXNoZWQKKyAqIHB1c2hpbmcgZGF0YSB0byB0aGUgRklGTywgc28gdGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgd2UgbXVzdCB3YWl0CisgKiBpcyBvbmx5IGZvciB0aGUgRklGTyB0byBkcmFpbiBvdXQuCisgKgorICogV2UgdXNlIGEgc2ltcGxlIGNhbGlicmF0ZWQgbG9vcC4gV2UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZSBsb29wCisgKiBkZWxheSAodWRlbGF5KSB0byBiYWxhbmNlIEkvTyB0cmFmZmljIGFuZCBsYXRlbmN5LiBBbmQgd2UgYWxzbyBuZWVkIHRvCisgKiBhZGp1c3QgdGhlIG1heGltdW0gdGltZW91dC4KKyAqIEl0IHdvdWxkIHByb2JhYmx5IGJlIGJldHRlciB0byB3YWl0IGZvciB0aGUgcHJvcGVyIGludGVycnVwdCwKKyAqIGJ1dCBpdCBkb2Vzbid0IHNlZW0gdG8gYmUgYXZhaWxhYmxlLgorICoKKyAqIFdlIGNhbid0IHVzZSBqaWZmaWVzIG9yIGtlcm5lbCB0aW1lcnMgYmVjYXVzZSA6CisgKiAxKSBXZSBhcmUgY2FsbGVkIGZyb20gdGhlIGludGVycnVwdCBoYW5kbGVyLCB3aGljaCBkaXNhYmxlIHNvZnRpcnFzLAorICogc28gamlmZmllcyB3b24ndCBiZSBpbmNyZWFzZWQKKyAqIDIpIEppZmZpZXMgZ3JhbnVsYXJpdHkgaXMgdXN1YWxseSB2ZXJ5IGNvYXJzZSAoMTBtcyksIGFuZCB3ZSBkb24ndAorICogd2FudCB0byB3YWl0IHRoYXQgbG9uZyB0byBkZXRlY3Qgc3R1Y2sgaGFyZHdhcmUuCisgKiBKZWFuIElJCisgKi8KKworc3RhdGljIHZvaWQgaXJwb3J0X3dhaXRfaHdfdHJhbnNtaXR0ZXJfZmluaXNoKHN0cnVjdCBpcnBvcnRfY2IgKnNlbGYpCit7CisJaW50IGlvYmFzZTsKKwlpbnQgY291bnQgPSAxMDAwOwkvKiAxIG1zICovCisJCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwkvKiBDYWxpYnJhdGVkIGJ1c3kgbG9vcCAqLworCXdoaWxlKChjb3VudC0tID4gMCkgJiYgIShpbmIoaW9iYXNlK1VBUlRfTFNSKSAmIFVBUlRfTFNSX1RFTVQpKQorCQl1ZGVsYXkoMSk7CisKKwlpZihjb3VudCA9PSAwKQorCQlJUkRBX0RFQlVHKDAsICIlcygpOiBzdHVjayB0cmFuc21pdHRlclxuIiwgX19GVU5DVElPTl9fKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlycG9ydF9oYXJkX3N0YXJ0X3htaXQgKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCisgKgorICogICAgVHJhbnNtaXRzIHRoZSBjdXJyZW50IGZyYW1lIHVudGlsIEZJRk8gaXMgZnVsbCwgdGhlbgorICogICAgd2FpdHMgdW50aWwgdGhlIG5leHQgdHJhbnNtaXR0IGludGVycnVwdCwgYW5kIGNvbnRpbnVlcyB1bnRpbCB0aGUKKyAqICAgIGZyYW1lIGlzIHRyYW5zbWl0dGVkLgorICovCitzdGF0aWMgaW50IGlycG9ydF9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGlvYmFzZTsKKwlzMzIgc3BlZWQ7CisKKwlJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAwOyk7CisJCisJc2VsZiA9IChzdHJ1Y3QgaXJwb3J0X2NiICopIGRldi0+cHJpdjsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIE1ha2Ugc3VyZSB0ZXN0cyAmIHNwZWVkIGNoYW5nZSBhcmUgYXRvbWljICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBzcGVlZCAqLworCXNwZWVkID0gaXJkYV9nZXRfbmV4dF9zcGVlZChza2IpOworCWlmICgoc3BlZWQgIT0gc2VsZi0+aW8uc3BlZWQpICYmIChzcGVlZCAhPSAtMSkpIHsKKwkJLyogQ2hlY2sgZm9yIGVtcHR5IGZyYW1lICovCisJCWlmICghc2tiLT5sZW4pIHsKKwkJCS8qCisJCQkgKiBXZSBzZW5kIGZyYW1lcyBvbmUgYnkgb25lIGluIFNJUiBtb2RlIChubworCQkJICogcGlwZWxpbmluZyksIHNvIGF0IHRoaXMgcG9pbnQsIGlmIHdlIHdlcmUgc2VuZGluZworCQkJICogYSBwcmV2aW91cyBmcmFtZSwgd2UganVzdCByZWNlaXZlZCB0aGUgaW50ZXJydXB0CisJCQkgKiB0ZWxsaW5nIHVzIGl0IGlzIGZpbmlzaGVkIChVQVJUX0lJUl9USFJJKS4KKwkJCSAqIFRoZXJlZm9yZSwgd2FpdGluZyBmb3IgdGhlIHRyYW5zbWl0dGVyIHRvIHJlYWxseQorCQkJICogZmluaXNoIGRyYWluaW5nIHRoZSBmaWZvIHdvbid0IHRha2UgdG9vIGxvbmcuCisJCQkgKiBBbmQgdGhlIGludGVycnVwdCBoYW5kbGVyIGlzIG5vdCBleHBlY3RlZCB0byBydW4uCisJCQkgKiAtIEplYW4gSUkgKi8KKwkJCWlycG9ydF93YWl0X2h3X3RyYW5zbWl0dGVyX2ZpbmlzaChzZWxmKTsKKwkJCS8qIEJldHRlciBnbyB0aGVyZSBhbHJlYWR5IGxvY2tlZCAtIEplYW4gSUkgKi8KKwkJCWlyZGFfdGFza19leGVjdXRlKHNlbGYsIF9faXJwb3J0X2NoYW5nZV9zcGVlZCwgCisJCQkJCSAgaXJwb3J0X2NoYW5nZV9zcGVlZF9jb21wbGV0ZSwgCisJCQkJCSAgTlVMTCwgKHZvaWQgKikgc3BlZWQpOworCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQlzZWxmLT5uZXdfc3BlZWQgPSBzcGVlZDsKKwl9CisKKwkvKiBJbml0IHR4IGJ1ZmZlciAqLworCXNlbGYtPnR4X2J1ZmYuZGF0YSA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKKworICAgICAgICAvKiBDb3B5IHNrYiB0byB0eF9idWZmIHdoaWxlIHdyYXBwaW5nLCBzdHVmZmluZyBhbmQgbWFraW5nIENSQyAqLworCXNlbGYtPnR4X2J1ZmYubGVuID0gYXN5bmNfd3JhcF9za2Ioc2tiLCBzZWxmLT50eF9idWZmLmRhdGEsIAorCQkJCQkgICBzZWxmLT50eF9idWZmLnRydWVzaXplKTsKKwkKKwlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBzZWxmLT50eF9idWZmLmxlbjsKKworCS8qIFdlIGFyZSB0cmFuc21pdHRpbmcgKi8KKwlzZWxmLT50cmFuc21pdHRpbmcgPSAxOworCisJLyogVHVybiBvbiB0cmFuc21pdCBmaW5pc2hlZCBpbnRlcnJ1cHQuIFdpbGwgZmlyZSBpbW1lZGlhdGVseSEgICovCisJb3V0YihVQVJUX0lFUl9USFJJLCBpb2Jhc2UrVUFSVF9JRVIpOyAKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkKKwlyZXR1cm4gMDsKK30KKyAgICAgICAgCisvKgorICogRnVuY3Rpb24gaXJwb3J0X3dyaXRlIChkcml2ZXIpCisgKgorICogICAgRmlsbCBUeCBGSUZPIHdpdGggdHJhbnNtaXQgZGF0YQorICoKKyAqIENhbGxlZCBvbmx5IGZyb20gaXJwb3J0X3dyaXRlX3dha2V1cCgpCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlycG9ydF93cml0ZShpbnQgaW9iYXNlLCBpbnQgZmlmb19zaXplLCBfX3U4ICpidWYsIGludCBsZW4pCit7CisJaW50IGFjdHVhbCA9IDA7CisKKwkvKiBGaWxsIEZJRk8gd2l0aCBjdXJyZW50IGZyYW1lICovCisJd2hpbGUgKChhY3R1YWwgPCBmaWZvX3NpemUpICYmIChhY3R1YWwgPCBsZW4pKSB7CisJCS8qIFRyYW5zbWl0IG5leHQgYnl0ZSAqLworCQlvdXRiKGJ1ZlthY3R1YWxdLCBpb2Jhc2UrVUFSVF9UWCk7CisKKwkJYWN0dWFsKys7CisJfQorICAgICAgICAKKwlyZXR1cm4gYWN0dWFsOworfQorCisvKgorICogRnVuY3Rpb24gaXJwb3J0X3dyaXRlX3dha2V1cCAodHR5KQorICoKKyAqICAgIENhbGxlZCBieSB0aGUgZHJpdmVyIHdoZW4gdGhlcmUncyByb29tIGZvciBtb3JlIGRhdGEuICBJZiB3ZSBoYXZlCisgKiAgICBtb3JlIHBhY2tldHMgdG8gc2VuZCwgd2Ugc2VuZCB0aGVtIGhlcmUuCisgKgorICogQ2FsbGVkIG9ubHkgZnJvbSBpcnBvcnRfaW50ZXJydXB0KCkKKyAqIE1ha2Ugc3VyZSB0aGlzIGZ1bmN0aW9uIGlzICpub3QqIGNhbGxlZCB3aGlsZSB3ZSBhcmUgcmVjZWl2aW5nLAorICogb3RoZXJ3aXNlIHdlIHdpbGwgcmVzZXQgZmlmbyBhbmQgbG9vc2UgZGF0YSA6LSgKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGlycG9ydF93cml0ZV93YWtldXAoc3RydWN0IGlycG9ydF9jYiAqc2VsZikKK3sKKwlpbnQgYWN0dWFsID0gMDsKKwlpbnQgaW9iYXNlOworCXVuc2lnbmVkIGludCBmY3I7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCisJLyogRmluaXNoZWQgd2l0aCBmcmFtZT8gICovCisJaWYgKHNlbGYtPnR4X2J1ZmYubGVuID4gMCkgIHsKKwkJLyogV3JpdGUgZGF0YSBsZWZ0IGluIHRyYW5zbWl0IGJ1ZmZlciAqLworCQlhY3R1YWwgPSBpcnBvcnRfd3JpdGUoaW9iYXNlLCBzZWxmLT5pby5maWZvX3NpemUsIAorCQkJCSAgICAgIHNlbGYtPnR4X2J1ZmYuZGF0YSwgc2VsZi0+dHhfYnVmZi5sZW4pOworCQlzZWxmLT50eF9idWZmLmRhdGEgKz0gYWN0dWFsOworCQlzZWxmLT50eF9idWZmLmxlbiAgLT0gYWN0dWFsOworCX0gZWxzZSB7CisJCS8qIAorCQkgKiAgTm93IHNlcmlhbCBidWZmZXIgaXMgYWxtb3N0IGZyZWUgJiB3ZSBjYW4gc3RhcnQgCisJCSAqICB0cmFuc21pc3Npb24gb2YgYW5vdGhlciBwYWNrZXQuIEJ1dCBmaXJzdCB3ZSBtdXN0IGNoZWNrCisJCSAqICBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgc3BlZWQgb2YgdGhlIGhhcmR3YXJlCisJCSAqLworCQlpZiAoc2VsZi0+bmV3X3NwZWVkKSB7CisJCQlpcnBvcnRfd2FpdF9od190cmFuc21pdHRlcl9maW5pc2goc2VsZik7CisJCQlpcmRhX3Rhc2tfZXhlY3V0ZShzZWxmLCBfX2lycG9ydF9jaGFuZ2Vfc3BlZWQsIAorCQkJCQkgIGlycG9ydF9jaGFuZ2Vfc3BlZWRfY29tcGxldGUsIAorCQkJCQkgIE5VTEwsICh2b2lkICopIHNlbGYtPm5ld19zcGVlZCk7CisJCQlzZWxmLT5uZXdfc3BlZWQgPSAwOworCQl9IGVsc2UgeworCQkJLyogVGVsbCBuZXR3b3JrIGxheWVyIHRoYXQgd2Ugd2FudCBtb3JlIGZyYW1lcyAqLworCQkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworCQl9CisJCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKworCQkvKiAKKwkJICogUmVzZXQgUnggRklGTyB0byBtYWtlIHN1cmUgdGhhdCBhbGwgcmVmbGVjdGVkIHRyYW5zbWl0IGRhdGEKKwkJICogaXMgZGlzY2FyZGVkLiBUaGlzIGlzIG5lZWRlZCBmb3IgaGFsZiBkdXBsZXggb3BlcmF0aW9uCisJCSAqLworCQlmY3IgPSBpcnBvcnRfZ2V0X2ZjcihzZWxmLT5pby5zcGVlZCk7CisJCWZjciB8PSBVQVJUX0ZDUl9DTEVBUl9SQ1ZSOworCQlvdXRiKGZjciwgaW9iYXNlK1VBUlRfRkNSKTsKKworCQkvKiBGaW5pc2hlZCB0cmFuc21pdHRpbmcgKi8KKwkJc2VsZi0+dHJhbnNtaXR0aW5nID0gMDsKKworCQkvKiBUdXJuIG9uIHJlY2VpdmUgaW50ZXJydXB0cyAqLworCQlvdXRiKFVBUlRfSUVSX1JESSwgaW9iYXNlK1VBUlRfSUVSKTsKKworCQlJUkRBX0RFQlVHKDEsICIlcygpIDogZmluaXNoZWQgVHhcbiIsIF9fRlVOQ1RJT05fXyk7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gaXJwb3J0X3JlY2VpdmUgKHNlbGYpCisgKgorICogICAgUmVjZWl2ZSBvbmUgZnJhbWUgZnJvbSB0aGUgaW5mcmFyZWQgcG9ydAorICoKKyAqIENhbGxlZCBvbmx5IGZyb20gaXJwb3J0X2ludGVycnVwdCgpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpcnBvcnRfcmVjZWl2ZShzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmKSAKK3sKKwlpbnQgYm9ndXNjb3VudCA9IDA7CisJaW50IGlvYmFzZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKworCS8qICAKKwkgKiBSZWNlaXZlIGFsbCBjaGFyYWN0ZXJzIGluIFJ4IEZJRk8sIHVud3JhcCBhbmQgdW5zdHVmZiB0aGVtLiAKKyAgICAgICAgICogYXN5bmNfdW53cmFwX2NoYXIgd2lsbCBkZWxpdmVyIGFsbCBmb3VuZCBmcmFtZXMgIAorCSAqLworCWRvIHsKKwkJYXN5bmNfdW53cmFwX2NoYXIoc2VsZi0+bmV0ZGV2LCAmc2VsZi0+c3RhdHMsICZzZWxmLT5yeF9idWZmLCAKKwkJCQkgIGluYihpb2Jhc2UrVUFSVF9SWCkpOworCisJCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBzdGF5IGhlcmUgdG9vIGxvbmcgKi8KKwkJaWYgKGJvZ3VzY291bnQrKyA+IDMyKSB7CisJCQlJUkRBX0RFQlVHKDIsIiVzKCksIGJyZWFraW5nIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoaW5iKGlvYmFzZStVQVJUX0xTUikgJiBVQVJUX0xTUl9EUik7CQorfQorCisvKgorICogRnVuY3Rpb24gaXJwb3J0X2ludGVycnVwdCAoaXJxLCBkZXZfaWQsIHJlZ3MpCisgKgorICogICAgSW50ZXJydXB0IGhhbmRsZXIKKyAqLworc3RhdGljIGlycXJldHVybl90IGlycG9ydF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykgCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IGlycG9ydF9jYiAqc2VsZjsKKwlpbnQgYm9ndXNjb3VudCA9IDA7CisJaW50IGlvYmFzZTsKKwlpbnQgaWlyLCBsc3I7CisJaW50IGhhbmRsZWQgPSAwOworCisJaWYgKCFkZXYpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpIGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBfX0ZVTkNUSU9OX18sIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJc2VsZiA9IChzdHJ1Y3QgaXJwb3J0X2NiICopIGRldi0+cHJpdjsKKworCXNwaW5fbG9jaygmc2VsZi0+bG9jayk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKworCS8qIEN1dCduJ3Bhc3RlIGludGVycnVwdCByb3V0aW5lIGZyb20gc2VyaWFsLmMKKwkgKiBUaGlzIHZlcnNpb24gdHJ5IHRvIG1pbmltaXNlIGxhdGVuY3kgYW5kIEkvTyBvcGVyYXRpb25zLgorCSAqIFNpbXBsaWZpZWQgYW5kIG1vZGlmaWVkIHRvIGVuZm9yY2UgaGFsZiBkdXBsZXggb3BlcmF0aW9uLgorCSAqIC0gSmVhbiBJSSAqLworCisJLyogQ2hlY2sgc3RhdHVzIGV2ZW4gaXMgaWlyIHJlZyBpcyBjbGVhcmVkLCBtb3JlIHJvYnVzdCBhbmQKKwkgKiBlbGltaW5hdGUgYSByZWFkIG9uIHRoZSBJL08gYnVzIC0gSmVhbiBJSSAqLworCWRvIHsKKwkJLyogR2V0IGludGVycnVwdCBzdGF0dXMgOyBDbGVhciBpbnRlcnJ1cHQgKi8KKwkJbHNyID0gaW5iKGlvYmFzZStVQVJUX0xTUik7CisJCQorCQkvKiBBcmUgd2UgcmVjZWl2aW5nIG9yIHRyYW5zbWl0dGluZyA/ICovCisJCWlmKCFzZWxmLT50cmFuc21pdHRpbmcpIHsKKwkJCS8qIFJlY2VpdmVkIHNvbWV0aGluZyA/ICovCisJCQlpZiAobHNyICYgVUFSVF9MU1JfRFIpCisJCQkJaXJwb3J0X3JlY2VpdmUoc2VsZik7CisJCX0gZWxzZSB7CisJCQkvKiBSb29tIGluIFR4IGZpZm8gPyAqLworCQkJaWYgKGxzciAmIChVQVJUX0xTUl9USFJFIHwgVUFSVF9MU1JfVEVNVCkpCisJCQkJaXJwb3J0X3dyaXRlX3dha2V1cChzZWxmKTsKKwkJfQorCisJCS8qIEEgYml0IGhhY2tpc2gsIGJ1dCB3b3JraW5nIGFzIGV4cGVjdGVkLi4uIEplYW4gSUkgKi8KKwkJaWYobHNyICYgKFVBUlRfTFNSX1RIUkUgfCBVQVJUX0xTUl9URU1UIHwgVUFSVF9MU1JfRFIpKQorCQkJaGFuZGxlZCA9IDE7CisKKwkJLyogTWFrZSBzdXJlIHdlIGRvbid0IHN0YXkgaGVyZSB0byBsb25nICovCisJCWlmIChib2d1c2NvdW50KysgPiAxMCkgeworCQkJSVJEQV9XQVJOSU5HKCIlcygpIGlycSBoYW5kbGVyIGxvb3BpbmcgOiBsc3I9JTAyeFxuIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXywgbHNyKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogUmVhZCBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KKyAJICAgICAgICBpaXIgPSBpbmIoaW9iYXNlK1VBUlRfSUlSKTsKKworCQkvKiBFbmFibGUgdGhpcyBkZWJ1ZyBvbmx5IHdoZW4gbm8gb3RoZXIgb3B0aW9ucyBhbmQgYXQgbG93CisJCSAqIGJpdCByYXRlcywgb3RoZXJ3aXNlIGl0IG1heSBjYXVzZSBSeCBvdmVycnVucyAobHNyPTYzKS4KKwkJICogLSBKZWFuIElJICovCisJCUlSREFfREVCVUcoNiwgIiVzKCksIGlpcj0lMDJ4LCBsc3I9JTAyeCwgaW9iYXNlPSUjeFxuIiwgCisJCQkgICAgX19GVU5DVElPTl9fLCBpaXIsIGxzciwgaW9iYXNlKTsKKworCQkvKiBBcyBsb25nIGFzIGludGVycnVwdCBwZW5kaW5nLi4uICovCisJfSB3aGlsZSAoKGlpciAmIFVBUlRfSUlSX05PX0lOVCkgPT0gMCk7CisKKwlzcGluX3VubG9jaygmc2VsZi0+bG9jayk7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnBvcnRfbmV0X29wZW4gKGRldikKKyAqCisgKiAgICBOZXR3b3JrIGRldmljZSBpcyB0YWtlbiB1cC4gVXN1YWxseSB0aGlzIGlzIGRvbmUgYnkgImlmY29uZmlnIGlyZGEwIHVwIiAKKyAqICAgCisgKi8KK3N0YXRpYyBpbnQgaXJwb3J0X25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlycG9ydF9jYiAqc2VsZjsKKwlpbnQgaW9iYXNlOworCWNoYXIgaHduYW1lWzE2XTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlzZWxmID0gKHN0cnVjdCBpcnBvcnRfY2IgKikgZGV2LT5wcml2OworCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwlpZiAocmVxdWVzdF9pcnEoc2VsZi0+aW8uaXJxLCBzZWxmLT5pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgCisJCQkodm9pZCAqKSBkZXYpKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIHVuYWJsZSB0byBhbGxvY2F0ZSBpcnE9JWRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHNlbGYtPmlvLmlycSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJLyogSW5pdCB1YXJ0ICovCisJaXJwb3J0X3N0YXJ0KHNlbGYpOworCS8qIFNldCA5NjAwIGJhdWRzIHBlciBkZWZhdWx0LCBpbmNsdWRpbmcgYXQgdGhlIGRvbmdsZSAqLworCWlyZGFfdGFza19leGVjdXRlKHNlbGYsIF9faXJwb3J0X2NoYW5nZV9zcGVlZCwgCisJCQkgIGlycG9ydF9jaGFuZ2Vfc3BlZWRfY29tcGxldGUsIAorCQkJICBOVUxMLCAodm9pZCAqKSA5NjAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKworCS8qIEdpdmUgc2VsZiBhIGhhcmR3YXJlIG5hbWUgKi8KKwlzcHJpbnRmKGh3bmFtZSwgIlNJUiBAIDB4JTAzeCIsIHNlbGYtPmlvLnNpcl9iYXNlKTsKKworCS8qIAorCSAqIE9wZW4gbmV3IElyTEFQIGxheWVyIGluc3RhbmNlLCBub3cgdGhhdCBldmVyeXRoaW5nIHNob3VsZCBiZQorCSAqIGluaXRpYWxpemVkIHByb3Blcmx5IAorCSAqLworCXNlbGYtPmlybGFwID0gaXJsYXBfb3BlbihkZXYsICZzZWxmLT5xb3MsIGh3bmFtZSk7CisKKwkvKiBSZWFkeSB0byBwbGF5ISAqLworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJwb3J0X25ldF9jbG9zZSAoc2VsZikKKyAqCisgKiAgICBOZXR3b3JrIGRldmljZSBpcyB0YWtlbiBkb3duLiBVc3VhbGx5IHRoaXMgaXMgZG9uZSBieSAKKyAqICAgICJpZmNvbmZpZyBpcmRhMCBkb3duIiAKKyAqLworc3RhdGljIGludCBpcnBvcnRfbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlycG9ydF9jYiAqc2VsZjsKKwlpbnQgaW9iYXNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCXNlbGYgPSAoc3RydWN0IGlycG9ydF9jYiAqKSBkZXYtPnByaXY7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwkvKiBTdG9wIGRldmljZSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwkvKiBTdG9wIGFuZCByZW1vdmUgaW5zdGFuY2Ugb2YgSXJMQVAgKi8KKwlpZiAoc2VsZi0+aXJsYXApCisJCWlybGFwX2Nsb3NlKHNlbGYtPmlybGFwKTsKKwlzZWxmLT5pcmxhcCA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCWlycG9ydF9zdG9wKHNlbGYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCWZyZWVfaXJxKHNlbGYtPmlvLmlycSwgZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJwb3J0X2lzX3JlY2VpdmluZyAoc2VsZikKKyAqCisgKiAgICBSZXR1cm5zIHRydWUgaXMgd2UgYXJlIGN1cnJlbnRseSByZWNlaXZpbmcgZGF0YQorICoKKyAqLworc3RhdGljIGlubGluZSBpbnQgaXJwb3J0X2lzX3JlY2VpdmluZyhzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmKQoreworCXJldHVybiAoc2VsZi0+cnhfYnVmZi5zdGF0ZSAhPSBPVVRTSURFX0ZSQU1FKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlycG9ydF9zZXRfZHRyX3J0cyAodHR5LCBkdHIsIHJ0cykKKyAqCisgKiAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5IGRvbmdsZXMgZXRjLiB0byBzZXQgb3IgcmVzZXQgdGhlIHN0YXR1cworICogICAgb2YgdGhlIGR0ciBhbmQgcnRzIGxpbmVzCisgKi8KK3N0YXRpYyBpbnQgaXJwb3J0X3NldF9kdHJfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBkdHIsIGludCBydHMpCit7CisJc3RydWN0IGlycG9ydF9jYiAqc2VsZiA9IGRldi0+cHJpdjsKKwlpbnQgaW9iYXNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCisJaWYgKGR0cikKKwkJZHRyID0gVUFSVF9NQ1JfRFRSOworCWlmIChydHMpCisJCXJ0cyA9IFVBUlRfTUNSX1JUUzsKKworCW91dGIoZHRyfHJ0c3xVQVJUX01DUl9PVVQyLCBpb2Jhc2UrVUFSVF9NQ1IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXJwb3J0X3Jhd193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3U4ICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGlycG9ydF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJwb3J0X2NiICopIGRldi0+cHJpdjsKKwlpbnQgYWN0dWFsID0gMDsKKwlpbnQgaW9iYXNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCisJLyogVHggRklGTyBzaG91bGQgYmUgZW1wdHkhICovCisJaWYgKCEoaW5iKGlvYmFzZStVQVJUX0xTUikgJiBVQVJUX0xTUl9USFJFKSkgeworCQlJUkRBX0RFQlVHKCAwLCAiJXMoKSwgZmFpbGVkLCBmaWZvIG5vdCBlbXB0eSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtMTsKKwl9CisgICAgICAgIAorCS8qIEZpbGwgRklGTyB3aXRoIGN1cnJlbnQgZnJhbWUgKi8KKwl3aGlsZSAoYWN0dWFsIDwgbGVuKSB7CisJCS8qIFRyYW5zbWl0IG5leHQgYnl0ZSAqLworCQlvdXRiKGJ1ZlthY3R1YWxdLCBpb2Jhc2UrVUFSVF9UWCk7CisJCWFjdHVhbCsrOworCX0KKworCXJldHVybiBhY3R1YWw7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnBvcnRfbmV0X2lvY3RsIChkZXYsIHJxLCBjbWQpCisgKgorICogICAgUHJvY2VzcyBJT0NUTCBjb21tYW5kcyBmb3IgdGhpcyBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJwb3J0X25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBpZl9pcmRhX3JlcSAqaXJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKSBycTsKKwlzdHJ1Y3QgaXJwb3J0X2NiICpzZWxmOworCWRvbmdsZV90ICpkb25nbGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXNlbGYgPSBkZXYtPnByaXY7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgJXMsIChjbWQ9MHglWClcbiIsIF9fRlVOQ1RJT05fXywgZGV2LT5uYW1lLCBjbWQpOworCQorCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DU0JBTkRXSURUSDogLyogU2V0IGJhbmR3aWR0aCAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXQgPSAtRVBFUk07CisgICAgICAgICAgICAgICAgZWxzZQorCQkJaXJkYV90YXNrX2V4ZWN1dGUoc2VsZiwgX19pcnBvcnRfY2hhbmdlX3NwZWVkLCBOVUxMLCAKKwkJCQkJICBOVUxMLCAodm9pZCAqKSBpcnEtPmlmcl9iYXVkcmF0ZSk7CisJCWJyZWFrOworCWNhc2UgU0lPQ1NET05HTEU6IC8qIFNldCBkb25nbGUgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlyZXQgPSAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCisJCS8qIExvY2tpbmcgOgorCQkgKiBpcmRhX2RldmljZV9kb25nbGVfaW5pdCgpIGNhbid0IGJlIGxvY2tlZC4KKwkJICogaXJkYV90YXNrX2V4ZWN1dGUoKSBkb2Vzbid0IG5lZWQgdG8gYmUgbG9ja2VkLgorCQkgKiBKZWFuIElJCisJCSAqLworCisJCS8qIEluaXRpYWxpemUgZG9uZ2xlICovCisJCWRvbmdsZSA9IGlyZGFfZGV2aWNlX2RvbmdsZV9pbml0KGRldiwgaXJxLT5pZnJfZG9uZ2xlKTsKKwkJaWYgKCFkb25nbGUpCisJCQlicmVhazsKKwkJCisJCWRvbmdsZS0+c2V0X21vZGUgICAgPSBOVUxMOworCQlkb25nbGUtPnJlYWQgICAgICAgID0gTlVMTDsKKwkJZG9uZ2xlLT53cml0ZSAgICAgICA9IGlycG9ydF9yYXdfd3JpdGU7CisJCWRvbmdsZS0+c2V0X2R0cl9ydHMgPSBpcnBvcnRfc2V0X2R0cl9ydHM7CisJCQorCQkvKiBOb3cgaW5pdGlhbGl6ZSB0aGUgZG9uZ2xlISAgKi8KKwkJZG9uZ2xlLT5pc3N1ZS0+b3Blbihkb25nbGUsICZzZWxmLT5xb3MpOworCQkKKwkJLyogUmVzZXQgZG9uZ2xlICovCisJCWlyZGFfdGFza19leGVjdXRlKGRvbmdsZSwgZG9uZ2xlLT5pc3N1ZS0+cmVzZXQsIE5VTEwsIE5VTEwsIAorCQkJCSAgTlVMTCk7CQorCisJCS8qIE1ha2UgZG9uZ2xlIGF2YWlsYWJsZSB0byBkcml2ZXIgb25seSBub3cgdG8gYXZvaWQKKwkJICogcmFjZSBjb25kaXRpb25zIC0gSmVhbiBJSSAqLworCQlzZWxmLT5kb25nbGUgPSBkb25nbGU7CisJCWJyZWFrOworCWNhc2UgU0lPQ1NNRURJQUJVU1k6IC8qIFNldCBtZWRpYSBidXN5ICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJcmV0ID0gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKworCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShzZWxmLT5uZXRkZXYsIFRSVUUpOworCQlicmVhazsKKwljYXNlIFNJT0NHUkVDRUlWSU5HOiAvKiBDaGVjayBpZiB3ZSBhcmUgcmVjZWl2aW5nIHJpZ2h0IG5vdyAqLworCQlpcnEtPmlmcl9yZWNlaXZpbmcgPSBpcnBvcnRfaXNfcmVjZWl2aW5nKHNlbGYpOworCQlicmVhazsKKwljYXNlIFNJT0NTRFRSUlRTOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXJldCA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogTm8gcmVhbCBuZWVkIHRvIGxvY2suLi4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkJaXJwb3J0X3NldF9kdHJfcnRzKGRldiwgaXJxLT5pZnJfZHRyLCBpcnEtPmlmcl9ydHMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKwkKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlycG9ydF9uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlycG9ydF9jYiAqc2VsZiA9IChzdHJ1Y3QgaXJwb3J0X2NiICopIGRldi0+cHJpdjsKKwkKKwlyZXR1cm4gJnNlbGYtPnN0YXRzOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpcnBvcnRfaW5pdCh2b2lkKQoreworIAlpbnQgaTsKKworIAlmb3IgKGk9MDsgKGlvW2ldIDwgMjAwMCkgJiYgKGkgPCA0KTsgaSsrKSB7CisgCQlpZiAoaXJwb3J0X29wZW4oaSwgaW9baV0sIGlycVtpXSkgIT0gTlVMTCkKKyAJCQlyZXR1cm4gMDsKKyAJfQorCS8qIAorCSAqIE1heWJlIHNvbWV0aGluZyBmYWlsZWQsIGJ1dCB3ZSBjYW4gc3RpbGwgYmUgdXNhYmxlIGZvciBGSVIgZHJpdmVycyAKKwkgKi8KKyAJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnBvcnRfY2xlYW51cCAoKQorICoKKyAqICAgIENsb3NlIGFsbCBjb25maWd1cmVkIHBvcnRzCisgKgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgaXJwb3J0X2NsZWFudXAodm9pZCkKK3sKKyAJaW50IGk7CisKKyAgICAgICAgSVJEQV9ERUJVRyggNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlmb3IgKGk9MDsgaSA8IDQ7IGkrKykgeworIAkJaWYgKGRldl9zZWxmW2ldKQorIAkJCWlycG9ydF9jbG9zZShkZXZfc2VsZltpXSk7CisgCX0KK30KKworTU9EVUxFX1BBUk0oaW8sICIxLTRpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiQmFzZSBJL08gYWRkcmVzc2VzIik7CitNT0RVTEVfUEFSTShpcnEsICIxLTRpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSBsaW5lcyIpOworCitNT0RVTEVfQVVUSE9SKCJEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhhbGYgZHVwbGV4IHNlcmlhbCBkcml2ZXIgZm9yIElyREEgU0lSIG1vZGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoaXJwb3J0X2luaXQpOworbW9kdWxlX2V4aXQoaXJwb3J0X2NsZWFudXApOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2lycG9ydC5oIGIvZHJpdmVycy9uZXQvaXJkYS9pcnBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzg5YzhjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9pcnBvcnQuaApAQCAtMCwwICsxLDgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGlycG9ydC5oCisgKiBWZXJzaW9uOiAgICAgICAwLjEKKyAqIERlc2NyaXB0aW9uOiAgIFNlcmlhbCBkcml2ZXIgZm9yIElyREEKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFN1biBBdWcgIDMgMTM6NDk6NTkgMTk5NworICogTW9kaWZpZWQgYXQ6ICAgRnJpIEphbiAxNCAxMDoyMToxMCAyMDAwCisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTgtMjAwMCBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBJUlBPUlRfSAorI2RlZmluZSBJUlBPUlRfSAorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKworI2RlZmluZSBTUEVFRF9ERUZBVUxUIDk2MDAKKyNkZWZpbmUgU1BFRURfTUFYICAgICAxMTUyMDAKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgc3VwcG9ydGVkIHNlcmlhbCB0eXBlcy4KKyAqLworI2RlZmluZSBQT1JUX1VOS05PV04gICAgMAorI2RlZmluZSBQT1JUXzgyNTAgICAgICAgMQorI2RlZmluZSBQT1JUXzE2NDUwICAgICAgMgorI2RlZmluZSBQT1JUXzE2NTUwICAgICAgMworI2RlZmluZSBQT1JUXzE2NTUwQSAgICAgNAorI2RlZmluZSBQT1JUX0NJUlJVUyAgICAgNQorI2RlZmluZSBQT1JUXzE2NjUwICAgICAgNgorI2RlZmluZSBQT1JUX01BWCAgICAgICAgNiAgCisKKyNkZWZpbmUgRlJBTUVfTUFYX1NJWkUgMjA0OAorCitzdHJ1Y3QgaXJwb3J0X2NiIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OyAvKiBZZXMhIHdlIGFyZSBzb21lIGtpbmQgb2YgbmV0ZGV2aWNlICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisKKwlzdHJ1Y3QgaXJsYXBfY2IgKmlybGFwOyAgICAvKiBUaGUgbGluayBsYXllciB3ZSBhcmUgYXR0YWNoZWQgdG8gKi8KKworCWNoaXBpb190IGlvOyAgICAgICAgICAgICAgIC8qIElyREEgY29udHJvbGxlciBpbmZvcm1hdGlvbiAqLworCWlvYnVmZl90IHR4X2J1ZmY7ICAgICAgICAgIC8qIFRyYW5zbWl0IGJ1ZmZlciAqLworCWlvYnVmZl90IHJ4X2J1ZmY7ICAgICAgICAgIC8qIFJlY2VpdmUgYnVmZmVyICovCisKKwlzdHJ1Y3QgcW9zX2luZm8gcW9zOyAgICAgICAvKiBRb1MgY2FwYWJpbGl0aWVzIGZvciB0aGlzIGRldmljZSAqLworCWRvbmdsZV90ICpkb25nbGU7ICAgICAgICAgIC8qIERvbmdsZSBkcml2ZXIgKi8KKworIAlfX3UzMiBmbGFnczsgICAgICAgICAgICAgICAvKiBJbnRlcmZhY2UgZmxhZ3MgKi8KKwlfX3UzMiBuZXdfc3BlZWQ7CisJaW50IG1vZGU7CisJaW50IGluZGV4OyAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaW5kZXggKi8KKwlpbnQgdHJhbnNtaXR0aW5nOwkgICAvKiBBcmUgd2UgdHJhbnNtaXR0aW5nID8gKi8KKworCXNwaW5sb2NrX3QgbG9jazsgICAgICAgICAgIC8qIEZvciBzZXJpYWxpemluZyBvcGVyYXRpb25zICovCisKKwkvKiBGb3IgcGlnZ3liYWNrIGRyaXZlcnMgKi8KKwl2b2lkICpwcml2OyAgICAgICAgICAgICAgICAKKwl2b2lkICgqY2hhbmdlX3NwZWVkKSh2b2lkICpwcml2LCBfX3UzMiBzcGVlZCk7CisJaW50ICgqaW50ZXJydXB0KShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK307CisKKyNlbmRpZiAvKiBJUlBPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9pcnR0eS1zaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvaXJ0dHktc2lyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QyM2FhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvaXJ0dHktc2lyLmMKQEAgLTAsMCArMSw2NDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgaXJ0dHktc2lyLmMKKyAqIFZlcnNpb246ICAgICAgIDIuMAorICogRGVzY3JpcHRpb246ICAgSXJEQSBsaW5lIGRpc2NpcGxpbmUgaW1wbGVtZW50YXRpb24KKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIFR1ZSBEZWMgIDkgMjE6MTg6MzggMTk5NworICogTW9kaWZpZWQgYXQ6ICAgU3VuIE9jdCAyNyAyMjoxMzozMCAyMDAyCisgKiBNb2RpZmllZCBieTogICBNYXJ0aW4gRGllaGwgPG1hZEBtZGllaGwuZGU+CisgKiBTb3VyY2VzOiAgICAgICBzbGlwLmMgYnkgTGF1cmVuY2UgQ3VsaGFuZSwgICA8bG96QGhvbG1lcy5kZW1vbi5jby51az4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdXdhbHQubmwubXVnbmV0Lm9yZz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIERhZyBCcmF0dGxpLAorICogICAgIENvcHlyaWdodCAoYykgMjAwMiBNYXJ0aW4gRGllaGwsCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCisjaW5jbHVkZSAic2lyLWRldi5oIgorI2luY2x1ZGUgImlydHR5LXNpci5oIgorCitzdGF0aWMgaW50IHFvc19tdHRfYml0cyA9IDB4MDM7ICAgICAgLyogNSBtcyBvciBtb3JlICovCisKK21vZHVsZV9wYXJhbShxb3NfbXR0X2JpdHMsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHFvc19tdHRfYml0cywgIk1pbmltdW0gVHVybiBUaW1lIik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogZGV2aWNlIGNvbmZpZ3VyYXRpb24gY2FsbGJhY2tzIGFsd2F5cyBpbnZva2VkIHdpdGggaXJkYS10aHJlYWQgY29udGV4dCAqLworCisvKiBmaW5kIG91dCwgaG93IG1hbnkgY2hhcnMgd2UgaGF2ZSBpbiBidWZmZXJzIGJlbG93IHVzCisgKiB0aGlzIGlzIGFsbG93ZWQgdG8gbGllLCBpLmUuIHJldHVybiBsZXNzIGNoYXJzIHRoYW4gd2UKKyAqIGFjdHVhbGx5IGhhdmUuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyB1c2VkIHRvIGRldGVybWluZQorICogaG93IGxvbmcgdGhlIGlyZGF0aHJlYWQgc2hvdWxkIHdhaXQgYmVmb3JlIGRvaW5nIHRoZQorICogcmVhbCBibG9ja2luZyB3YWl0X3VudGlsX3NlbnQoKQorICovCisKK3N0YXRpYyBpbnQgaXJ0dHlfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJc3RydWN0IHNpcnR0eV9jYiAqcHJpdiA9IGRldi0+cHJpdjsKKworCUlSREFfQVNTRVJUKHByaXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQocHJpdi0+bWFnaWMgPT0gSVJUVFlfTUFHSUMsIHJldHVybiAtMTspOworCisJcmV0dXJuIHByaXYtPnR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIocHJpdi0+dHR5KTsKK30KKworLyogV2FpdCAoc2xlZXApIHVudGlsIHVuZGVybGF5aW5nIGhhcmR3YXJlIGZpbmlzaGVkIHRyYW5zbWlzc2lvbgorICogaS5lLiBoYXJkd2FyZSBidWZmZXJzIGFyZSBkcmFpbmVkCisgKiB0aGlzIG11c3QgYmxvY2sgYW5kIG5vdCByZXR1cm4gYmVmb3JlIGFsbCBjaGFyYWN0ZXJzIGFyZSByZWFsbHkgc2VudAorICoKKyAqIElmIHRoZSB0dHkgc2l0cyBvbiB0b3Agb2YgYSAxNjU1MEEtbGlrZSB1YXJ0LCB0aGVyZSBhcmUgdHlwaWNhbGx5CisgKiB1cCB0byAxNiBieXRlcyBpbiB0aGUgZmlmbyAtIGYuZS4gOTYwMCBicHMgOE4xIG5lZWRzIDE2LjcgbXNlYworICoKKyAqIFdpdGggdXNic2VyaWFsIHRoZSB1YXJ0LWZpZm8gaXMgYmFzaWNhbGx5IHJlcGxhY2VkIGJ5IHRoZSBjb252ZXJ0ZXIncworICogb3V0Z29pbmcgZW5kcG9pbnQgYnVmZmVyLCB3aGljaCBjYW4gdXN1YWxseSBob2xkIDY0IGJ5dGVzIChhdCBsZWFzdCkuCisgKiBXaXRoIHBsMjMwMyBpdCBhcHBlYXJzIHdlIGFyZSBzYWZlIHdpdGggNjBtc2VjIGhlcmUuCisgKgorICogSSByZWFsbHkgd2lzaCBhbGwgc2VyaWFsIGRyaXZlcnMgd291bGQgcHJvdmlkZQorICogY29ycmVjdCBpbXBsZW1lbnRhdGlvbiBvZiB3YWl0X3VudGlsX3NlbnQoKQorICovCisKKyNkZWZpbmUgVVNCU0VSSUFMX1RYX0RPTkVfREVMQVkJNjAKKworc3RhdGljIHZvaWQgaXJ0dHlfd2FpdF91bnRpbF9zZW50KHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJc3RydWN0IHNpcnR0eV9jYiAqcHJpdiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCisJSVJEQV9BU1NFUlQocHJpdiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChwcml2LT5tYWdpYyA9PSBJUlRUWV9NQUdJQywgcmV0dXJuOyk7CisKKwl0dHkgPSBwcml2LT50dHk7CisJaWYgKHR0eS0+ZHJpdmVyLT53YWl0X3VudGlsX3NlbnQpIHsKKwkJbG9ja19rZXJuZWwoKTsKKwkJdHR5LT5kcml2ZXItPndhaXRfdW50aWxfc2VudCh0dHksIG1zZWNzX3RvX2ppZmZpZXMoMTAwKSk7CisJCXVubG9ja19rZXJuZWwoKTsKKwl9CisJZWxzZSB7CisJCW1zbGVlcChVU0JTRVJJQUxfVFhfRE9ORV9ERUxBWSk7CisJfQorfQorCisvKiAKKyAqICBGdW5jdGlvbiBpcnR0eV9jaGFuZ2Vfc3BlZWQgKGRldiwgc3BlZWQpCisgKgorICogICAgQ2hhbmdlIHRoZSBzcGVlZCBvZiB0aGUgc2VyaWFsIHBvcnQuCisgKgorICogVGhpcyBtYXkgc2xlZXAgaW4gc2V0X3Rlcm1pb3MgKHVzYnNlcmlhbCBkcml2ZXIgZi5lLikgYW5kIG11c3QKKyAqIG5vdCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQvdGltZXIvdGFza2xldCB0aGVyZWZvcmUuCisgKiBBbGwgc3VjaCBpbnZvY2F0aW9ucyBhcmUgZGVmZXJyZWQgdG8ga0lyREFkIG5vdyBzbyB3ZSBjYW4gc2xlZXAgdGhlcmUuCisgKi8KKworc3RhdGljIGludCBpcnR0eV9jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpCit7CisJc3RydWN0IHNpcnR0eV9jYiAqcHJpdiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworICAgICAgICBzdHJ1Y3QgdGVybWlvcyBvbGRfdGVybWlvczsKKwlpbnQgY2ZsYWc7CisKKwlJUkRBX0FTU0VSVChwcml2ICE9IE5VTEwsIHJldHVybiAtMTspOworCUlSREFfQVNTRVJUKHByaXYtPm1hZ2ljID09IElSVFRZX01BR0lDLCByZXR1cm4gLTE7KTsKKworCXR0eSA9IHByaXYtPnR0eTsKKworCWxvY2tfa2VybmVsKCk7CisJb2xkX3Rlcm1pb3MgPSAqKHR0eS0+dGVybWlvcyk7CisJY2ZsYWcgPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisKKwljZmxhZyAmPSB+Q0JBVUQ7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBTZXR0aW5nIHNwZWVkIHRvICVkXG4iLCBfX0ZVTkNUSU9OX18sIHNwZWVkKTsKKworCXN3aXRjaCAoc3BlZWQpIHsKKwljYXNlIDEyMDA6CisJCWNmbGFnIHw9IEIxMjAwOworCQlicmVhazsKKwljYXNlIDI0MDA6CisJCWNmbGFnIHw9IEIyNDAwOworCQlicmVhazsKKwljYXNlIDQ4MDA6CisJCWNmbGFnIHw9IEI0ODAwOworCQlicmVhazsKKwljYXNlIDE5MjAwOgorCQljZmxhZyB8PSBCMTkyMDA7CisJCWJyZWFrOworCWNhc2UgMzg0MDA6CisJCWNmbGFnIHw9IEIzODQwMDsKKwkJYnJlYWs7CisJY2FzZSA1NzYwMDoKKwkJY2ZsYWcgfD0gQjU3NjAwOworCQlicmVhazsKKwljYXNlIDExNTIwMDoKKwkJY2ZsYWcgfD0gQjExNTIwMDsKKwkJYnJlYWs7CisJY2FzZSA5NjAwOgorCWRlZmF1bHQ6CisJCWNmbGFnIHw9IEI5NjAwOworCQlicmVhazsKKwl9CQorCisJdHR5LT50ZXJtaW9zLT5jX2NmbGFnID0gY2ZsYWc7CisJaWYgKHR0eS0+ZHJpdmVyLT5zZXRfdGVybWlvcykKKwkJdHR5LT5kcml2ZXItPnNldF90ZXJtaW9zKHR0eSwgJm9sZF90ZXJtaW9zKTsKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlwcml2LT5pby5zcGVlZCA9IHNwZWVkOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnR0eV9zZXRfZHRyX3J0cyAoZGV2LCBkdHIsIHJ0cykKKyAqCisgKiAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5IGRvbmdsZXMgZXRjLiB0byBzZXQgb3IgcmVzZXQgdGhlIHN0YXR1cworICogICAgb2YgdGhlIGR0ciBhbmQgcnRzIGxpbmVzCisgKi8KKworc3RhdGljIGludCBpcnR0eV9zZXRfZHRyX3J0cyhzdHJ1Y3Qgc2lyX2RldiAqZGV2LCBpbnQgZHRyLCBpbnQgcnRzKQoreworCXN0cnVjdCBzaXJ0dHlfY2IgKnByaXYgPSBkZXYtPnByaXY7CisJaW50IHNldCA9IDA7CisJaW50IGNsZWFyID0gMDsKKworCUlSREFfQVNTRVJUKHByaXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJSVJEQV9BU1NFUlQocHJpdi0+bWFnaWMgPT0gSVJUVFlfTUFHSUMsIHJldHVybiAtMTspOworCisJaWYgKHJ0cykKKwkJc2V0IHw9IFRJT0NNX1JUUzsKKwllbHNlCisJCWNsZWFyIHw9IFRJT0NNX1JUUzsKKwlpZiAoZHRyKQorCQlzZXQgfD0gVElPQ01fRFRSOworCWVsc2UKKwkJY2xlYXIgfD0gVElPQ01fRFRSOworCisJLyoKKwkgKiBXZSBjYW4ndCB1c2UgaW9jdGwoKSBiZWNhdXNlIGl0IGV4cGVjdHMgYSBub24tbnVsbCBmaWxlIHN0cnVjdHVyZSwKKwkgKiBhbmQgd2UgZG9uJ3QgaGF2ZSB0aGF0IGhlcmUuCisJICogVGhpcyBmdW5jdGlvbiBpcyBub3QgeWV0IGRlZmluZWQgZm9yIGFsbCB0dHkgZHJpdmVyLCBzbworCSAqIGxldCdzIGJlIGNhcmVmdWwuLi4gSmVhbiBJSQorCSAqLworCUlSREFfQVNTRVJUKHByaXYtPnR0eS0+ZHJpdmVyLT50aW9jbXNldCAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlwcml2LT50dHktPmRyaXZlci0+dGlvY21zZXQocHJpdi0+dHR5LCBOVUxMLCBzZXQsIGNsZWFyKTsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGNhbGxlZCBmcm9tIHNpcl9kZXYgd2hlbiB0aGVyZSBpcyBtb3JlIGRhdGEgdG8gc2VuZAorICogY29udGV4dCBpcyBlaXRoZXIgbmV0ZGV2LT5oYXJkX3htaXQgb3Igc29tZSB0cmFuc21pdC1jb21wbGV0aW9uIGJoCisgKiBpLmUuIHdlIGFyZSB1bmRlciBzcGlubG9jayBoZXJlIGFuZCBtdXN0IG5vdCBzbGVlcC4KKyAqLworCitzdGF0aWMgaW50IGlydHR5X2RvX3dyaXRlKHN0cnVjdCBzaXJfZGV2ICpkZXYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0ciwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc2lydHR5X2NiICpwcml2ID0gZGV2LT5wcml2OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJaW50IHdyaXRlbGVuOworCisJSVJEQV9BU1NFUlQocHJpdiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChwcml2LT5tYWdpYyA9PSBJUlRUWV9NQUdJQywgcmV0dXJuIC0xOyk7CisKKwl0dHkgPSBwcml2LT50dHk7CisJaWYgKCF0dHktPmRyaXZlci0+d3JpdGUpCisJCXJldHVybiAwOworCXR0eS0+ZmxhZ3MgfD0gKDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCk7CisJaWYgKHR0eS0+ZHJpdmVyLT53cml0ZV9yb29tKSB7CisJCXdyaXRlbGVuID0gdHR5LT5kcml2ZXItPndyaXRlX3Jvb20odHR5KTsKKwkJaWYgKHdyaXRlbGVuID4gbGVuKQorCQkJd3JpdGVsZW4gPSBsZW47CisJfQorCWVsc2UKKwkJd3JpdGVsZW4gPSBsZW47CisJcmV0dXJuIHR0eS0+ZHJpdmVyLT53cml0ZSh0dHksIHB0ciwgd3JpdGVsZW4pOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGlyZGEgbGluZSBkaXNjaXBsaW5lIGNhbGxiYWNrcyAqLworCisvKiAKKyAqICBGdW5jdGlvbiBpcnR0eV9yZWNlaXZlX2J1ZiggdHR5LCBjcCwgY291bnQpCisgKgorICogICAgSGFuZGxlIHRoZSAncmVjZWl2ZXIgZGF0YSByZWFkeScgaW50ZXJydXB0LiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqICAgIGJ5IHRoZSAndHR5X2lvJyBtb2R1bGUgaW4gdGhlIGtlcm5lbCB3aGVuIGEgYmxvY2sgb2YgSXJEQSBkYXRhIGhhcworICogICAgYmVlbiByZWNlaXZlZCwgd2hpY2ggY2FuIG5vdyBiZSBkZWNhcHN1bGF0ZWQgYW5kIGRlbGl2ZXJlZCBmb3IKKyAqICAgIGZ1cnRoZXIgcHJvY2Vzc2luZyAKKyAqCisgKiBjYWxsaW5nIGNvbnRleHQgZGVwZW5kcyBvbiB1bmRlcmx5aW5nIGRyaXZlciBhbmQgdHR5LT5sb3dfbGF0ZW5jeSEKKyAqIGZvciBleGFtcGxlIChsb3dfbGF0ZW5jeTogMSAvIDApOgorICogc2VyaWFsLmM6CXVhcnQtaW50ZXJydXB0IC8gc29mdGludAorICogdXNic2VyaWFsOgl1cmItY29tcGxldGUtaW50ZXJydXB0IC8gc29mdGludAorICovCisKK3N0YXRpYyB2b2lkIGlydHR5X3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLAorCQkJICAgICAgY2hhciAqZnAsIGludCBjb3VudCkgCit7CisJc3RydWN0IHNpcl9kZXYgKmRldjsKKwlzdHJ1Y3Qgc2lydHR5X2NiICpwcml2ID0gdHR5LT5kaXNjX2RhdGE7CisJaW50CWk7CisKKwlJUkRBX0FTU0VSVChwcml2ICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHByaXYtPm1hZ2ljID09IElSVFRZX01BR0lDLCByZXR1cm47KTsKKworCWlmICh1bmxpa2VseShjb3VudD09MCkpCQkvKiB5ZXMsIHRoaXMgaGFwcGVucyAqLworCQlyZXR1cm47CisKKwlkZXYgPSBwcml2LT5kZXY7CisJaWYgKCFkZXYpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBub3QgcmVhZHkgeWV0IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCS8qIAorCQkgKiAgQ2hhcmFjdGVycyByZWNlaXZlZCB3aXRoIGEgcGFyaXR5IGVycm9yLCBldGM/CisJCSAqLworIAkJaWYgKGZwICYmICpmcCsrKSB7IAorCQkJSVJEQV9ERUJVRygwLCAiRnJhbWluZyBvciBwYXJpdHkgZXJyb3IhXG4iKTsKKwkJCXNpcmRldl9yZWNlaXZlKGRldiwgTlVMTCwgMCk7CS8qIG5vdGlmeSBzaXJfZGV2ICh1cGRhdGluZyBzdGF0cykgKi8KKwkJCXJldHVybjsKKyAJCX0KKwl9CisKKwlzaXJkZXZfcmVjZWl2ZShkZXYsIGNwLCBjb3VudCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnR0eV9yZWNlaXZlX3Jvb20gKHR0eSkKKyAqCisgKiAgICBVc2VkIGJ5IHRoZSBUVFkgdG8gZmluZCBvdXQgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmVjZWl2ZSBhdCBhIHRpbWUKKyAqIAorKi8KK3N0YXRpYyBpbnQgaXJ0dHlfcmVjZWl2ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpIAoreworCXN0cnVjdCBzaXJ0dHlfY2IgKnByaXYgPSB0dHktPmRpc2NfZGF0YTsKKworCUlSREFfQVNTRVJUKHByaXYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKwlJUkRBX0FTU0VSVChwcml2LT5tYWdpYyA9PSBJUlRUWV9NQUdJQywgcmV0dXJuIDA7KTsKKworCXJldHVybiA2NTUzNjsgIC8qIFdlIGNhbiBoYW5kbGUgYW4gaW5maW5pdGUgYW1vdW50IG9mIGRhdGEuIDotKSAqLworfQorCisvKgorICogRnVuY3Rpb24gaXJ0dHlfd3JpdGVfd2FrZXVwICh0dHkpCisgKgorICogICAgQ2FsbGVkIGJ5IHRoZSBkcml2ZXIgd2hlbiB0aGVyZSdzIHJvb20gZm9yIG1vcmUgZGF0YS4gIElmIHdlIGhhdmUKKyAqICAgIG1vcmUgcGFja2V0cyB0byBzZW5kLCB3ZSBzZW5kIHRoZW0gaGVyZS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGlydHR5X3dyaXRlX3dha2V1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KSAKK3sKKwlzdHJ1Y3Qgc2lydHR5X2NiICpwcml2ID0gdHR5LT5kaXNjX2RhdGE7CisKKwlJUkRBX0FTU0VSVChwcml2ICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHByaXYtPm1hZ2ljID09IElSVFRZX01BR0lDLCByZXR1cm47KTsKKworCXR0eS0+ZmxhZ3MgJj0gfigxIDw8IFRUWV9ET19XUklURV9XQUtFVVApOworCisJaWYgKHByaXYtPmRldikKKwkJc2lyZGV2X3dyaXRlX2NvbXBsZXRlKHByaXYtPmRldik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIEZ1bmN0aW9uIGlydHR5X3N0b3BfcmVjZWl2ZXIgKHR0eSwgc3RvcCkKKyAqCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGlydHR5X3N0b3BfcmVjZWl2ZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHN0b3ApCit7CisJc3RydWN0IHRlcm1pb3Mgb2xkX3Rlcm1pb3M7CisJaW50IGNmbGFnOworCisJbG9ja19rZXJuZWwoKTsKKwlvbGRfdGVybWlvcyA9ICoodHR5LT50ZXJtaW9zKTsKKwljZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKwkKKwlpZiAoc3RvcCkKKwkJY2ZsYWcgJj0gfkNSRUFEOworCWVsc2UKKwkJY2ZsYWcgfD0gQ1JFQUQ7CisKKwl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgPSBjZmxhZzsKKwlpZiAodHR5LT5kcml2ZXItPnNldF90ZXJtaW9zKQorCQl0dHktPmRyaXZlci0+c2V0X3Rlcm1pb3ModHR5LCAmb2xkX3Rlcm1pb3MpOworCXVubG9ja19rZXJuZWwoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBzZXJpYWxpemUgbGRpc2Mgb3Blbi9jbG9zZSB3aXRoIHNpcl9kZXYgKi8KK3N0YXRpYyBERUNMQVJFX01VVEVYKGlydHR5X3NlbSk7CisKKy8qIG5vdGlmaWVyIGZyb20gc2lyX2RldiB3aGVuIGlyZGElIGRldmljZSBnZXRzIG9wZW5lZCAoaWZ1cCkgKi8KKworc3RhdGljIGludCBpcnR0eV9zdGFydF9kZXYoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3Qgc2lydHR5X2NiICpwcml2OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKKwkvKiBzZXJpYWxpemUgd2l0aCBsZGlzYyBvcGVuL2Nsb3NlICovCisJZG93bigmaXJ0dHlfc2VtKTsKKworCXByaXYgPSBkZXYtPnByaXY7CisJaWYgKHVubGlrZWx5KCFwcml2IHx8IHByaXYtPm1hZ2ljIT1JUlRUWV9NQUdJQykpIHsKKwkJdXAoJmlydHR5X3NlbSk7CisJCXJldHVybiAtRVNUQUxFOworCX0KKworCXR0eSA9IHByaXYtPnR0eTsKKworCWlmICh0dHktPmRyaXZlci0+c3RhcnQpCisJCXR0eS0+ZHJpdmVyLT5zdGFydCh0dHkpOworCS8qIE1ha2Ugc3VyZSB3ZSBjYW4gcmVjZWl2ZSBtb3JlIGRhdGEgKi8KKwlpcnR0eV9zdG9wX3JlY2VpdmVyKHR0eSwgRkFMU0UpOworCisJdXAoJmlydHR5X3NlbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIG5vdGlmaWVyIGZyb20gc2lyX2RldiB3aGVuIGlyZGElIGRldmljZSBnZXRzIGNsb3NlZCAoaWZkb3duKSAqLworCitzdGF0aWMgaW50IGlydHR5X3N0b3BfZGV2KHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJc3RydWN0IHNpcnR0eV9jYiAqcHJpdjsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCisJLyogc2VyaWFsaXplIHdpdGggbGRpc2Mgb3Blbi9jbG9zZSAqLworCWRvd24oJmlydHR5X3NlbSk7CisKKwlwcml2ID0gZGV2LT5wcml2OworCWlmICh1bmxpa2VseSghcHJpdiB8fCBwcml2LT5tYWdpYyE9SVJUVFlfTUFHSUMpKSB7CisJCXVwKCZpcnR0eV9zZW0pOworCQlyZXR1cm4gLUVTVEFMRTsKKwl9CisKKwl0dHkgPSBwcml2LT50dHk7CisKKwkvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVjZWl2ZSBtb3JlIGRhdGEgKi8KKwlpcnR0eV9zdG9wX3JlY2VpdmVyKHR0eSwgVFJVRSk7CisJaWYgKHR0eS0+ZHJpdmVyLT5zdG9wKQorCQl0dHktPmRyaXZlci0+c3RvcCh0dHkpOworCisJdXAoJmlydHR5X3NlbSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHNpcl9kcml2ZXIgc2lyX3R0eV9kcnYgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuZHJpdmVyX25hbWUJCT0gInNpcl90dHkiLAorCS5zdGFydF9kZXYJCT0gaXJ0dHlfc3RhcnRfZGV2LAorCS5zdG9wX2RldgkJPSBpcnR0eV9zdG9wX2RldiwKKwkuZG9fd3JpdGUJCT0gaXJ0dHlfZG9fd3JpdGUsCisJLmNoYXJzX2luX2J1ZmZlcgk9IGlydHR5X2NoYXJzX2luX2J1ZmZlciwKKwkud2FpdF91bnRpbF9zZW50CT0gaXJ0dHlfd2FpdF91bnRpbF9zZW50LAorCS5zZXRfc3BlZWQJCT0gaXJ0dHlfY2hhbmdlX3NwZWVkLAorCS5zZXRfZHRyX3J0cwkJPSBpcnR0eV9zZXRfZHRyX3J0cywKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIEZ1bmN0aW9uIGlydHR5X2lvY3RsICh0dHksIGZpbGUsIGNtZCwgYXJnKQorICoKKyAqICAgICBUaGUgU3dpc3MgYXJteSBrbmlmZSBvZiBzeXN0ZW0gY2FsbHMgOi0pCisgKgorICovCitzdGF0aWMgaW50IGlydHR5X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaXJ0dHlfaW5mbyB7IGNoYXIgbmFtZVs2XTsgfSBpbmZvOworCXN0cnVjdCBzaXJfZGV2ICpkZXY7CisJc3RydWN0IHNpcnR0eV9jYiAqcHJpdiA9IHR0eS0+ZGlzY19kYXRhOworCWludCBlcnIgPSAwOworCisJSVJEQV9BU1NFUlQocHJpdiAhPSBOVUxMLCByZXR1cm4gLUVOT0RFVjspOworCUlSREFfQVNTRVJUKHByaXYtPm1hZ2ljID09IElSVFRZX01BR0lDLCByZXR1cm4gLUVCQURSOyk7CisKKwlJUkRBX0RFQlVHKDMsICIlcyhjbWQ9MHglWClcbiIsIF9fRlVOQ1RJT05fXywgY21kKTsKKworCWRldiA9IHByaXYtPmRldjsKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVENHRVRTOgorCWNhc2UgVENHRVRBOgorCQllcnIgPSBuX3R0eV9pb2N0bCh0dHksIGZpbGUsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIElSVFRZX0lPQ1RET05HTEU6CisJCS8qIHRoaXMgY2FsbCBibG9ja3MgZm9yIGNvbXBsZXRpb24gKi8KKwkJZXJyID0gc2lyZGV2X3NldF9kb25nbGUoZGV2LCAoSVJEQV9ET05HTEUpIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBJUlRUWV9JT0NHRVQ6CisJCUlSREFfQVNTRVJUKGRldi0+bmV0ZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCisJCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsgCisJCXN0cm5jcHkoaW5mby5uYW1lLCBkZXYtPm5ldGRldi0+bmFtZSwgc2l6ZW9mKGluZm8ubmFtZSktMSk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJZXJyID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKwl9CisJcmV0dXJuIGVycjsKK30KKworCisvKiAKKyAqICBGdW5jdGlvbiBpcnR0eV9vcGVuKHR0eSkKKyAqCisgKiAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgVFRZIG1vZHVsZSB3aGVuIHRoZSBJckRBIGxpbmUKKyAqICAgIGRpc2NpcGxpbmUgaXMgY2FsbGVkIGZvci4gIEJlY2F1c2Ugd2UgYXJlIHN1cmUgdGhlIHR0eSBsaW5lIGV4aXN0cywKKyAqICAgIHdlIG9ubHkgaGF2ZSB0byBsaW5rIGl0IHRvIGEgZnJlZSBJckRBIGNoYW5uZWwuICAKKyAqLworc3RhdGljIGludCBpcnR0eV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpIAoreworCXN0cnVjdCBzaXJfZGV2ICpkZXY7CisJc3RydWN0IHNpcnR0eV9jYiAqcHJpdjsKKwlpbnQgcmV0ID0gMDsKKworCS8qIE1vZHVsZSBzdHVmZiBoYW5kbGVkIHZpYSBpcmRhX2xkaXNjLm93bmVyIC0gSmVhbiBJSSAqLworCisJLyogRmlyc3QgbWFrZSBzdXJlIHdlJ3JlIG5vdCBhbHJlYWR5IGNvbm5lY3RlZC4gKi8KKwlpZiAodHR5LT5kaXNjX2RhdGEgIT0gTlVMTCkgeworCQlwcml2ID0gdHR5LT5kaXNjX2RhdGE7CisJCWlmIChwcml2ICYmIHByaXYtPm1hZ2ljID09IElSVFRZX01BR0lDKSB7CisJCQlyZXQgPSAtRUVYSVNUOworCQkJZ290byBvdXQ7CisJCX0KKwkJdHR5LT5kaXNjX2RhdGEgPSBOVUxMOwkJLyogIyMjICovCisJfQorCisJLyogc3RvcCB0aGUgdW5kZXJseWluZyAgZHJpdmVyICovCisJaXJ0dHlfc3RvcF9yZWNlaXZlcih0dHksIFRSVUUpOworCWlmICh0dHktPmRyaXZlci0+c3RvcCkKKwkJdHR5LT5kcml2ZXItPnN0b3AodHR5KTsKKworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJCisJLyogYXBwbHkgbXR0IG92ZXJyaWRlICovCisJc2lyX3R0eV9kcnYucW9zX210dF9iaXRzID0gcW9zX210dF9iaXRzOworCisJLyogZ2V0IGEgc2lyIGRldmljZSBpbnN0YW5jZSBmb3IgdGhpcyBkcml2ZXIgKi8KKwlkZXYgPSBzaXJkZXZfZ2V0X2luc3RhbmNlKCZzaXJfdHR5X2RydiwgdHR5LT5uYW1lKTsKKwlpZiAoIWRldikgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBhbGxvY2F0ZSBwcml2YXRlIGRldmljZSBpbmZvIGJsb2NrICovCisJcHJpdiA9IGttYWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlnb3RvIG91dF9wdXQ7CisJbWVtc2V0KHByaXYsIDAsIHNpemVvZigqcHJpdikpOworCisJcHJpdi0+bWFnaWMgPSBJUlRUWV9NQUdJQzsKKwlwcml2LT50dHkgPSB0dHk7CisJcHJpdi0+ZGV2ID0gZGV2OworCisJLyogc2VyaWFsaXplIHdpdGggc3RhcnRfZGV2IC0gaW4gY2FzZSB3ZSB3ZXJlIHJhY2luZyB3aXRoIGlmdXAgKi8KKwlkb3duKCZpcnR0eV9zZW0pOworCisJZGV2LT5wcml2ID0gcHJpdjsKKwl0dHktPmRpc2NfZGF0YSA9IHByaXY7CisKKwl1cCgmaXJ0dHlfc2VtKTsKKworCUlSREFfREVCVUcoMCwgIiVzIC0gJXM6IGlyZGEgbGluZSBkaXNjaXBsaW5lIG9wZW5lZFxuIiwgX19GVU5DVElPTl9fLCB0dHktPm5hbWUpOworCisJcmV0dXJuIDA7CisKK291dF9wdXQ6CisJc2lyZGV2X3B1dF9pbnN0YW5jZShkZXYpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIAorICogIEZ1bmN0aW9uIGlydHR5X2Nsb3NlICh0dHkpCisgKgorICogICAgQ2xvc2UgZG93biBhIElyREEgY2hhbm5lbC4gVGhpcyBtZWFucyBmbHVzaGluZyBvdXQgYW55IHBlbmRpbmcgcXVldWVzLAorICogICAgYW5kIHRoZW4gcmVzdG9yaW5nIHRoZSBUVFkgbGluZSBkaXNjaXBsaW5lIHRvIHdoYXQgaXQgd2FzIGJlZm9yZSBpdCBnb3QKKyAqICAgIGhvb2tlZCB0byBJckRBICh3aGljaCB1c3VhbGx5IGlzIFRUWSBhZ2FpbikuICAKKyAqLworc3RhdGljIHZvaWQgaXJ0dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkgCit7CisJc3RydWN0IHNpcnR0eV9jYiAqcHJpdiA9IHR0eS0+ZGlzY19kYXRhOworCisJSVJEQV9BU1NFUlQocHJpdiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChwcml2LT5tYWdpYyA9PSBJUlRUWV9NQUdJQywgcmV0dXJuOyk7CisKKwkvKiBIbSwgd2l0aCBhIGRvbmdsZSBhdHRhY2hlZCB0aGUgZG9uZ2xlIGRyaXZlciB3YW50cworCSAqIHRvIGNsb3NlIHRoZSBkb25nbGUgLSB3aGljaCByZXF1aXJlcyB0aGUgdXNlIG9mCisJICogc29tZSB0dHkgd3JpdGUgYW5kL29yIHRlcm1pb3Mgb3IgaW9jdGwgb3BlcmF0aW9ucy4KKwkgKiBBcmUgd2UgYWxsb3dlZCB0byBjYWxsIHRob3NlIHdoZW4gYWxyZWFkeSByZXF1ZXN0ZWQKKwkgKiB0byBzaHV0ZG93biB0aGUgbGRpc2M/CisJICogSWYgbm90LCB3ZSBzaG91bGQgc29tZWhvdyBtYXJrIHRoZSBkZXYgYmVpbmcgc3RhbGVkLgorCSAqIFF1ZXN0aW9uIHJlbWFpbnMsIGhvdyB0byBjbG9zZSB0aGUgZG9uZ2xlIGluIHRoaXMgY2FzZS4uLgorCSAqIEZvciBub3cgbGV0J3MgYXNzdW1lIHdlIGFyZSBncmFudGVkIHRvIGlzc3VlIHR0eSBkcml2ZXIgY2FsbHMKKwkgKiB1bnRpbCB3ZSByZXR1cm4gaGVyZSBmcm9tIHRoZSBsZGlzYyBjbG9zZS4gSSdtIGp1c3Qgd29uZGVyaW5nCisJICogaG93IHRoaXMgYmVoYXZlcyB3aXRoIGhvdHBsdWdnYWJsZSBzZXJpYWwgaGFyZHdhcmUgbGlrZQorCSAqIHJzMjMyLXBjbWNpYSBjYXJkIG9yIHVzYi1zZXJpYWwuLi4KKwkgKgorCSAqIHByaXYtPnR0eSA9IE5VTEw/OworCSAqLworCisJLyogd2UgYXJlIGRlYWQgbm93ICovCisJdHR5LT5kaXNjX2RhdGEgPSBOVUxMOworCisJc2lyZGV2X3B1dF9pbnN0YW5jZShwcml2LT5kZXYpOworCisJLyogU3RvcCB0dHkgKi8KKwlpcnR0eV9zdG9wX3JlY2VpdmVyKHR0eSwgVFJVRSk7CisJdHR5LT5mbGFncyAmPSB+KDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCk7CisJaWYgKHR0eS0+ZHJpdmVyLT5zdG9wKQorCQl0dHktPmRyaXZlci0+c3RvcCh0dHkpOworCisJa2ZyZWUocHJpdik7CisKKwlJUkRBX0RFQlVHKDAsICIlcyAtICVzOiBpcmRhIGxpbmUgZGlzY2lwbGluZSBjbG9zZWRcbiIsIF9fRlVOQ1RJT05fXywgdHR5LT5uYW1lKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHR0eV9sZGlzYyBpcmRhX2xkaXNjID0geworCS5tYWdpYwkJPSBUVFlfTERJU0NfTUFHSUMsCisgCS5uYW1lCQk9ICJpcmRhIiwKKwkuZmxhZ3MJCT0gMCwKKwkub3BlbgkJPSBpcnR0eV9vcGVuLAorCS5jbG9zZQkJPSBpcnR0eV9jbG9zZSwKKwkucmVhZAkJPSBOVUxMLAorCS53cml0ZQkJPSBOVUxMLAorCS5pb2N0bAkJPSBpcnR0eV9pb2N0bCwKKyAJLnBvbGwJCT0gTlVMTCwKKwkucmVjZWl2ZV9idWYJPSBpcnR0eV9yZWNlaXZlX2J1ZiwKKwkucmVjZWl2ZV9yb29tCT0gaXJ0dHlfcmVjZWl2ZV9yb29tLAorCS53cml0ZV93YWtldXAJPSBpcnR0eV93cml0ZV93YWtldXAsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IF9faW5pdCBpcnR0eV9zaXJfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IHR0eV9yZWdpc3Rlcl9sZGlzYyhOX0lSREEsICZpcmRhX2xkaXNjKSkgIT0gMCkKKwkJSVJEQV9FUlJPUigiSXJEQTogY2FuJ3QgcmVnaXN0ZXIgbGluZSBkaXNjaXBsaW5lIChlcnIgPSAlZClcbiIsCisJCQkgICBlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpcnR0eV9zaXJfY2xlYW51cCh2b2lkKSAKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSB0dHlfcmVnaXN0ZXJfbGRpc2MoTl9JUkRBLCBOVUxMKSkpIHsKKwkJSVJEQV9FUlJPUigiJXMoKSwgY2FuJ3QgdW5yZWdpc3RlciBsaW5lIGRpc2NpcGxpbmUgKGVyciA9ICVkKVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgZXJyKTsKKwl9Cit9CisKK21vZHVsZV9pbml0KGlydHR5X3Npcl9pbml0KTsKK21vZHVsZV9leGl0KGlydHR5X3Npcl9jbGVhbnVwKTsKKworTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJckRBIFRUWSBkZXZpY2UgZHJpdmVyIik7CitNT0RVTEVfQUxJQVNfTERJU0MoTl9JUkRBKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9pcnR0eS1zaXIuaCBiL2RyaXZlcnMvbmV0L2lyZGEvaXJ0dHktc2lyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzMmQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvaXJ0dHktc2lyLmgKQEAgLTAsMCArMSwzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCXNpcl90dHkuaDoJZGVmaW5pdGlvbnMgZm9yIHRoZSBpcnR0eV9zaXIgY2xpZW50IGRyaXZlciAoZm9ybWVyIGlydHR5KQorICoKKyAqCUNvcHlyaWdodCAoYykgMjAwMiBNYXJ0aW4gRGllaGwKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKglwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqCXRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBJUlRUWVNJUl9ICisjZGVmaW5lIElSVFRZU0lSX0gKKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgkJLy8gY2hpcGlvX3QKKworI2RlZmluZSBJUlRUWV9JT0NfTUFHSUMgJ2UnCisjZGVmaW5lIElSVFRZX0lPQ1RET05HTEUgIF9JTyhJUlRUWV9JT0NfTUFHSUMsIDEpCisjZGVmaW5lIElSVFRZX0lPQ0dFVCAgICAgX0lPUihJUlRUWV9JT0NfTUFHSUMsIDIsIHN0cnVjdCBpcnR0eV9pbmZvKQorI2RlZmluZSBJUlRUWV9JT0NfTUFYTlIgICAyCisKK3N0cnVjdCBzaXJ0dHlfY2IgeworCW1hZ2ljX3QgbWFnaWM7CisKKwlzdHJ1Y3Qgc2lyX2RldiAqZGV2OworCXN0cnVjdCB0dHlfc3RydWN0ICAqdHR5OworCisJY2hpcGlvX3QgaW87ICAgICAgICAgICAgICAgLyogSXJEQSBjb250cm9sbGVyIGluZm9ybWF0aW9uICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvbGl0ZWxpbmstc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2xpdGVsaW5rLXNpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMjYxYzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL2xpdGVsaW5rLXNpci5jCkBAIC0wLDAgKzEsMjA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIGxpdGVsaW5rLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMQorICogRGVzY3JpcHRpb246ICAgRHJpdmVyIGZvciB0aGUgUGFyYWxsYXggTGl0ZUxpbmsgZG9uZ2xlCisgKiBTdGF0dXM6ICAgICAgICBTdGFibGUKKyAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIENyZWF0ZWQgYXQ6ICAgIEZyaSBNYXkgIDcgMTI6NTA6MzMgMTk5OQorICogTW9kaWZpZWQgYXQ6ICAgRnJpIERlYyAxNyAwOToxNDoyMyAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIAorICogICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICogICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBNb2RpZmllZCBhdDogICBUaHUgSmFuIDE1IDIwMDMKKyAqIE1vZGlmaWVkIGJ5OiAgIEV1Z2VuZSBDcm9zc2VyIDxjcm9zc2VyQGF2ZXJhZ2Uub3JnPgorICoKKyAqIENvbnZlcnQgdG8gIm5ldyIgSVJEQSBpbmZyYXN0cnVjdHVyZSBmb3Iga2VybmVsIDIuNgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKworI2luY2x1ZGUgInNpci1kZXYuaCIKKworI2RlZmluZSBNSU5fREVMQVkgMjUgICAgICAvKiAxNSB1cywgYnV0IHdhaXQgYSBsaXR0bGUgbW9yZSB0byBiZSBzdXJlICovCisjZGVmaW5lIE1BWF9ERUxBWSAxMDAwMCAgIC8qIDEgbXMgKi8KKworc3RhdGljIGludCBsaXRlbGlua19vcGVuKHN0cnVjdCBzaXJfZGV2ICpkZXYpOworc3RhdGljIGludCBsaXRlbGlua19jbG9zZShzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKK3N0YXRpYyBpbnQgbGl0ZWxpbmtfY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICpkZXYsIHVuc2lnbmVkIHNwZWVkKTsKK3N0YXRpYyBpbnQgbGl0ZWxpbmtfcmVzZXQoc3RydWN0IHNpcl9kZXYgKmRldik7CisKKy8qIFRoZXNlIGFyZSB0aGUgYmF1ZHJhdGVzIHN1cHBvcnRlZCAtIDk2MDAgbXVzdCBiZSBsYXN0IG9uZSEgKi8KK3N0YXRpYyB1bnNpZ25lZCBiYXVkX3JhdGVzW10gPSB7IDExNTIwMCwgNTc2MDAsIDM4NDAwLCAxOTIwMCwgOTYwMCB9OworCitzdGF0aWMgc3RydWN0IGRvbmdsZV9kcml2ZXIgbGl0ZWxpbmsgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcml2ZXJfbmFtZQk9ICJQYXJhbGxheCBMaXRlTGluayIsCisJLnR5cGUJCT0gSVJEQV9MSVRFTElOS19ET05HTEUsCisJLm9wZW4JCT0gbGl0ZWxpbmtfb3BlbiwKKwkuY2xvc2UJCT0gbGl0ZWxpbmtfY2xvc2UsCisJLnJlc2V0CQk9IGxpdGVsaW5rX3Jlc2V0LAorCS5zZXRfc3BlZWQJPSBsaXRlbGlua19jaGFuZ2Vfc3BlZWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBsaXRlbGlua19zaXJfaW5pdCh2b2lkKQoreworCXJldHVybiBpcmRhX3JlZ2lzdGVyX2RvbmdsZSgmbGl0ZWxpbmspOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbGl0ZWxpbmtfc2lyX2NsZWFudXAodm9pZCkKK3sKKwlpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKCZsaXRlbGluayk7Cit9CisKK3N0YXRpYyBpbnQgbGl0ZWxpbmtfb3BlbihzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCXN0cnVjdCBxb3NfaW5mbyAqcW9zID0gJmRldi0+cW9zOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFBvd2VyIHVwIGRvbmdsZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCisJLyogU2V0IHRoZSBzcGVlZHMgd2UgY2FuIGFjY2VwdCAqLworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfMTE1MjAwfElSXzU3NjAwfElSXzM4NDAwfElSXzE5MjAwfElSXzk2MDA7CisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDdmOyAvKiBOZWVkcyAwLjAxIG1zICovCisJaXJkYV9xb3NfYml0c190b192YWx1ZShxb3MpOworCisJLyogaXJkYSB0aHJlYWQgd2FpdHMgNTAgbXNlYyBmb3IgcG93ZXIgc2V0dGxpbmcgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxpdGVsaW5rX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFBvd2VyIG9mZiBkb25nbGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgRkFMU0UpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBsaXRlbGlua19jaGFuZ2Vfc3BlZWQgKHRhc2spCisgKgorICogICAgQ2hhbmdlIHNwZWVkIG9mIHRoZSBMaXRlbGluayBkb25nbGUuIFRvIGN5Y2xlIHRocm91Z2ggdGhlIGF2YWlsYWJsZSAKKyAqICAgIGJhdWQgcmF0ZXMsIHB1bHNlIFJUUyBsb3cgZm9yIGEgZmV3IG1zLiAgCisgKi8KK3N0YXRpYyBpbnQgbGl0ZWxpbmtfY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICpkZXYsIHVuc2lnbmVkIHNwZWVkKQoreworICAgICAgICBpbnQgaTsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBkb25nbGUgYWxyZWFkeSByZXNldCBieSBpcmRhLXRocmVhZCAtIGN1cnJlbnQgc3BlZWQgKGRvbmdsZSBhbmQKKwkgKiBwb3J0KSBpcyB0aGUgZGVmYXVsdCBzcGVlZCAoMTE1MjAwIGZvciBsaXRlbGluayEpCisJICovCisKKwkvKiBDeWNsZSB0aHJvdWdoIGF2YWlhYmxlIGJhdWRyYXRlcyB1bnRpbCB3ZSByZWFjaCB0aGUgY29ycmVjdCBvbmUgKi8KKwlmb3IgKGkgPSAwOyBiYXVkX3JhdGVzW2ldICE9IHNwZWVkOyBpKyspIHsKKworCQkvKiBlbmQtb2YtbGlzdCByZWFjaGVkIGR1ZSB0byBpbnZhbGlkIHNwZWVkIHJlcXVlc3QgKi8KKwkJaWYgKGJhdWRfcmF0ZXNbaV0gPT0gOTYwMCkKKwkJCWJyZWFrOworCisJCS8qIFNldCBEVFIsIGNsZWFyIFJUUyAqLworCQlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgVFJVRSk7CisKKwkJLyogU2xlZXAgYSBtaW5pbXVtIG9mIDE1IHVzICovCisJCXVkZWxheShNSU5fREVMQVkpOworCisJCS8qIFNldCBEVFIsIFNldCBSVFMgKi8KKwkJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisKKwkJLyogU2xlZXAgYSBtaW5pbXVtIG9mIDE1IHVzICovCisJCXVkZWxheShNSU5fREVMQVkpOworICAgICAgICB9CisKKwlkZXYtPnNwZWVkID0gYmF1ZF9yYXRlc1tpXTsKKworCS8qIGludmFsaWQgYmF1ZHJhdGUgc2hvdWxkIG5vdCBoYXBwZW4gLSBidXQgaWYsIHdlIHJldHVybiAtRUlOVkFMIGFuZAorCSAqIHRoZSBkb25nbGUgY29uZmlndXJlZCBmb3IgOTYwMCBzbyB0aGUgc3RhY2sgaGFzIGEgY2hhbmNlIHRvIHJlY292ZXIKKwkgKi8KKworCXJldHVybiAoZGV2LT5zcGVlZCA9PSBzcGVlZCkgPyAwIDogLUVJTlZBTDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGxpdGVsaW5rX3Jlc2V0ICh0YXNrKQorICoKKyAqICAgICAgUmVzZXQgdGhlIExpdGVsaW5rIHR5cGUgZG9uZ2xlLgorICoKKyAqLworc3RhdGljIGludCBsaXRlbGlua19yZXNldChzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBwcm9iYWJseSB0aGUgcG93ZXItdXAgY2FuIGJlIGRyb3BwZWQgaGVyZSwgYnV0IHdpdGggb25seQorCSAqIDE1IHVzZWMgZGVsYXkgaXQncyBub3Qgd29ydGggdGhlIHJpc2sgdW5sZXNzIHNvbWVib2R5IHdpdGgKKwkgKiB0aGUgaGFyZHdhcmUgY29uZmlybXMgaXQgZG9lc24ndCBicmVhayBhbnl0aGluZy4uLgorCSAqLworCisJLyogUG93ZXIgb24gZG9uZ2xlICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisKKwkvKiBTbGVlcCBhIG1pbmltdW0gb2YgMTUgdXMgKi8KKwl1ZGVsYXkoTUlOX0RFTEFZKTsKKworCS8qIENsZWFyIFJUUyB0byByZXNldCBkb25nbGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBGQUxTRSk7CisKKwkvKiBTbGVlcCBhIG1pbmltdW0gb2YgMTUgdXMgKi8KKwl1ZGVsYXkoTUlOX0RFTEFZKTsKKworCS8qIEdvIGJhY2sgdG8gbm9ybWFsIG1vZGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBUUlVFKTsKKworCS8qIFNsZWVwIGEgbWluaW11bSBvZiAxNSB1cyAqLworCXVkZWxheShNSU5fREVMQVkpOworCisJLyogVGhpcyBkb25nbGVzIHNwZWVkIGRlZmF1bHRzIHRvIDExNTIwMCBicHMgKi8KKwlkZXYtPnNwZWVkID0gMTE1MjAwOworCisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9BVVRIT1IoIkRhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUGFyYWxsYXggTGl0ZWxpbmsgZG9uZ2xlIGRyaXZlciIpOwkKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXJkYS1kb25nbGUtNSIpOyAvKiBJUkRBX0xJVEVMSU5LX0RPTkdMRSAqLworCisvKgorICogRnVuY3Rpb24gaW5pdF9tb2R1bGUgKHZvaWQpCisgKgorICogICAgSW5pdGlhbGl6ZSBMaXRlbGluayBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9pbml0KGxpdGVsaW5rX3Npcl9pbml0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGNsZWFudXBfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIENsZWFudXAgTGl0ZWxpbmsgbW9kdWxlCisgKgorICovCittb2R1bGVfZXhpdChsaXRlbGlua19zaXJfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2xpdGVsaW5rLmMgYi9kcml2ZXJzL25ldC9pcmRhL2xpdGVsaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiMTE0MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvbGl0ZWxpbmsuYwpAQCAtMCwwICsxLDE3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBsaXRlbGluay5jCisgKiBWZXJzaW9uOiAgICAgICAxLjEKKyAqIERlc2NyaXB0aW9uOiAgIERyaXZlciBmb3IgdGhlIFBhcmFsbGF4IExpdGVMaW5rIGRvbmdsZQorICogU3RhdHVzOiAgICAgICAgU3RhYmxlCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBGcmkgTWF5ICA3IDEyOjUwOjMzIDE5OTkKKyAqIE1vZGlmaWVkIGF0OiAgIEZyaSBEZWMgMTcgMDk6MTQ6MjMgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqICAgICBNQSAwMjExMS0xMzA3IFVTQQorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKworI2RlZmluZSBNSU5fREVMQVkgMjUgICAgICAvKiAxNSB1cywgYnV0IHdhaXQgYSBsaXR0bGUgbW9yZSB0byBiZSBzdXJlICovCisjZGVmaW5lIE1BWF9ERUxBWSAxMDAwMCAgIC8qIDEgbXMgKi8KKworc3RhdGljIHZvaWQgbGl0ZWxpbmtfb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpOworc3RhdGljIHZvaWQgbGl0ZWxpbmtfY2xvc2UoZG9uZ2xlX3QgKnNlbGYpOworc3RhdGljIGludCAgbGl0ZWxpbmtfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOworc3RhdGljIGludCAgbGl0ZWxpbmtfcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CisKKy8qIFRoZXNlIGFyZSB0aGUgYmF1ZHJhdGVzIHN1cHBvcnRlZCAqLworc3RhdGljIF9fdTMyIGJhdWRfcmF0ZXNbXSA9IHsgMTE1MjAwLCA1NzYwMCwgMzg0MDAsIDE5MjAwLCA5NjAwIH07CisKK3N0YXRpYyBzdHJ1Y3QgZG9uZ2xlX3JlZyBkb25nbGUgPSB7CisJLnR5cGUgPSBJUkRBX0xJVEVMSU5LX0RPTkdMRSwKKwkub3BlbiA9IGxpdGVsaW5rX29wZW4sCisJLmNsb3NlID0gbGl0ZWxpbmtfY2xvc2UsCisJLnJlc2V0ID0gbGl0ZWxpbmtfcmVzZXQsCisJLmNoYW5nZV9zcGVlZCA9IGxpdGVsaW5rX2NoYW5nZV9zcGVlZCwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGxpdGVsaW5rX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaXJkYV9kZXZpY2VfcmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbGl0ZWxpbmtfY2xlYW51cCh2b2lkKQoreworCWlyZGFfZGV2aWNlX3VucmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworfQorCitzdGF0aWMgdm9pZCBsaXRlbGlua19vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcykKK3sKKwlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8SVJfMTE1MjAwOworCXFvcy0+bWluX3R1cm5fdGltZS5iaXRzID0gMHg3ZjsgLyogTmVlZHMgMC4wMSBtcyAqLworfQorCitzdGF0aWMgdm9pZCBsaXRlbGlua19jbG9zZShkb25nbGVfdCAqc2VsZikKK3sKKwkvKiBQb3dlciBvZmYgZG9uZ2xlICovCisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgRkFMU0UpOworfQorCisvKgorICogRnVuY3Rpb24gbGl0ZWxpbmtfY2hhbmdlX3NwZWVkICh0YXNrKQorICoKKyAqICAgIENoYW5nZSBzcGVlZCBvZiB0aGUgTGl0ZWxpbmsgZG9uZ2xlLiBUbyBjeWNsZSB0aHJvdWdoIHRoZSBhdmFpbGFibGUgCisgKiAgICBiYXVkIHJhdGVzLCBwdWxzZSBSVFMgbG93IGZvciBhIGZldyBtcy4gIAorICovCitzdGF0aWMgaW50IGxpdGVsaW5rX2NoYW5nZV9zcGVlZChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCWRvbmdsZV90ICpzZWxmID0gKGRvbmdsZV90ICopIHRhc2stPmluc3RhbmNlOworCV9fdTMyIHNwZWVkID0gKF9fdTMyKSB0YXNrLT5wYXJhbTsKKyAgICAgICAgaW50IGk7CisJCisJLyogQ2xlYXIgUlRTIHRvIHJlc2V0IGRvbmdsZSAqLworCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgRkFMU0UpOworCisJLyogU2xlZXAgYSBtaW5pbXVtIG9mIDE1IHVzICovCisJdWRlbGF5KE1JTl9ERUxBWSk7CisKKwkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlICovCisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKwkKKwkvKiBTbGVlcCBhIG1pbmltdW0gb2YgMTUgdXMgKi8KKwl1ZGVsYXkoTUlOX0RFTEFZKTsKKwkKKwkvKiBDeWNsZSB0aHJvdWdoIGF2YWlhYmxlIGJhdWRyYXRlcyB1bnRpbCB3ZSByZWFjaCB0aGUgY29ycmVjdCBvbmUgKi8KKwlmb3IgKGk9MDsgaTw1ICYmIGJhdWRfcmF0ZXNbaV0gIT0gc3BlZWQ7IGkrKykgeworCQkvKiBTZXQgRFRSLCBjbGVhciBSVFMgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgVFJVRSk7CisJCQorCQkvKiBTbGVlcCBhIG1pbmltdW0gb2YgMTUgdXMgKi8KKwkJdWRlbGF5KE1JTl9ERUxBWSk7CisJCQorCQkvKiBTZXQgRFRSLCBTZXQgUlRTICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgVFJVRSk7CisJCQorCQkvKiBTbGVlcCBhIG1pbmltdW0gb2YgMTUgdXMgKi8KKwkJdWRlbGF5KE1JTl9ERUxBWSk7CisgICAgICAgIH0KKwlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGxpdGVsaW5rX3Jlc2V0ICh0YXNrKQorICoKKyAqICAgICAgUmVzZXQgdGhlIExpdGVsaW5rIHR5cGUgZG9uZ2xlLgorICoKKyAqLworc3RhdGljIGludCBsaXRlbGlua19yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCWRvbmdsZV90ICpzZWxmID0gKGRvbmdsZV90ICopIHRhc2stPmluc3RhbmNlOworCisJLyogUG93ZXIgb24gZG9uZ2xlICovCisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKworCS8qIFNsZWVwIGEgbWluaW11bSBvZiAxNSB1cyAqLworCXVkZWxheShNSU5fREVMQVkpOworCisJLyogQ2xlYXIgUlRTIHRvIHJlc2V0IGRvbmdsZSAqLworCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgVFJVRSwgRkFMU0UpOworCisJLyogU2xlZXAgYSBtaW5pbXVtIG9mIDE1IHVzICovCisJdWRlbGF5KE1JTl9ERUxBWSk7CisKKwkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlICovCisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKwkKKwkvKiBTbGVlcCBhIG1pbmltdW0gb2YgMTUgdXMgKi8KKwl1ZGVsYXkoTUlOX0RFTEFZKTsKKworCS8qIFRoaXMgZG9uZ2xlcyBzcGVlZCBkZWZhdWx0cyB0byAxMTUyMDAgYnBzICovCisJc2VsZi0+c3BlZWQgPSAxMTUyMDA7CisKKwlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQYXJhbGxheCBMaXRlbGluayBkb25nbGUgZHJpdmVyIik7CQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS01Iik7IC8qIElSREFfTElURUxJTktfRE9OR0xFICovCisJCQorLyoKKyAqIEZ1bmN0aW9uIGluaXRfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIEluaXRpYWxpemUgTGl0ZWxpbmsgbW9kdWxlCisgKgorICovCittb2R1bGVfaW5pdChsaXRlbGlua19pbml0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGNsZWFudXBfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIENsZWFudXAgTGl0ZWxpbmsgbW9kdWxlCisgKgorICovCittb2R1bGVfZXhpdChsaXRlbGlua19jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvbWE2MDAtc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL21hNjAwLXNpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZWQxNjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL21hNjAwLXNpci5jCkBAIC0wLDAgKzEsMjY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIG1hNjAwLmMKKyAqIFZlcnNpb246ICAgICAgIDAuMQorICogRGVzY3JpcHRpb246ICAgSW1wbGVtZW50YXRpb24gb2YgdGhlIE1BNjAwIGRvbmdsZQorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgTGV1bmcgPDk1RXR3bEBhbHVtbmkuZWUudXN0LmhrPiBodHRwOi8vd3d3LmVuZ3N2ci51c3QvfmVldHdsOTUKKyAqIENyZWF0ZWQgYXQ6ICAgIFNhdCBKdW4gMTAgMjA6MDI6MzUgMjAwMAorICogTW9kaWZpZWQgYXQ6ICAgU2F0IEF1ZyAxNiAwOTozNDoxMyAyMDAzCisgKiBNb2RpZmllZCBieTogICBNYXJ0aW4gRGllaGwgPG1hZEBtZGllaGwuZGU+IChtb2RpZmllZCBmb3IgbmV3IHNpcl9kZXYpCisgKgorICogTm90ZTogdmVyeSB0aGFua3MgdG8gTXIuIE1hcnUgV2FuZyA8bWFydUBtb2JpbGVhY3Rpb24uY29tLnR3PiBmb3IgcHJvdmlkaW5nIAorICogICAgICAgaW5mb3JtYXRpb24gb24gdGhlIE1BNjAwIGRvbmdsZQorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwIExldW5nLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIAorICogICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICogICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorCisjaW5jbHVkZSAic2lyLWRldi5oIgorCitzdGF0aWMgaW50IG1hNjAwX29wZW4oc3RydWN0IHNpcl9kZXYgKik7CitzdGF0aWMgaW50IG1hNjAwX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICopOworc3RhdGljIGludCBtYTYwMF9jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKiwgdW5zaWduZWQpOworc3RhdGljIGludCBtYTYwMF9yZXNldChzdHJ1Y3Qgc2lyX2RldiAqKTsKKworLyogY29udHJvbCBieXRlIGZvciBNQTYwMCAqLworI2RlZmluZSBNQTYwMF85NjAwCTB4MDAKKyNkZWZpbmUgTUE2MDBfMTkyMDAJMHgwMQorI2RlZmluZSBNQTYwMF8zODQwMAkweDAyCisjZGVmaW5lIE1BNjAwXzU3NjAwCTB4MDMKKyNkZWZpbmUgTUE2MDBfMTE1MjAwCTB4MDQKKyNkZWZpbmUgTUE2MDBfREVWX0lEMQkweDA1CisjZGVmaW5lIE1BNjAwX0RFVl9JRDIJMHgwNgorI2RlZmluZSBNQTYwMF8yNDAwCTB4MDgKKworc3RhdGljIHN0cnVjdCBkb25nbGVfZHJpdmVyIG1hNjAwID0geworCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5kcml2ZXJfbmFtZSAgICA9ICJNQTYwMCIsCisJLnR5cGUgICAgICAgICAgID0gSVJEQV9NQTYwMF9ET05HTEUsCisJLm9wZW4gICAgICAgICAgID0gbWE2MDBfb3BlbiwKKwkuY2xvc2UgICAgICAgICAgPSBtYTYwMF9jbG9zZSwKKwkucmVzZXQgICAgICAgICAgPSBtYTYwMF9yZXNldCwKKwkuc2V0X3NwZWVkICAgICAgPSBtYTYwMF9jaGFuZ2Vfc3BlZWQsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IG1hNjAwX3Npcl9pbml0KHZvaWQpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gaXJkYV9yZWdpc3Rlcl9kb25nbGUoJm1hNjAwKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1hNjAwX3Npcl9jbGVhbnVwKHZvaWQpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKCZtYTYwMCk7Cit9CisKKy8qCisJUG93ZXIgb246CisJCSgwKSBDbGVhciBSVFMgYW5kIERUUiBmb3IgMSBzZWNvbmQKKwkJKDEpIFNldCBSVFMgYW5kIERUUiBmb3IgMSBzZWNvbmQKKwkJKDIpIDk2MDAgYnBzIG5vdworCU5vdGU6IGFzc3VtZSBSVFMsIERUUiBhcmUgY2xlYXIgYmVmb3JlCisqLworc3RhdGljIGludCBtYTYwMF9vcGVuKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJc3RydWN0IHFvc19pbmZvICpxb3MgPSAmZGV2LT5xb3M7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisKKwkvKiBFeHBsaWNpdGx5IHNldCB0aGUgc3BlZWRzIHdlIGNhbiBhY2NlcHQgKi8KKwlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IElSXzI0MDB8SVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMAorCQkJCXxJUl81NzYwMHxJUl8xMTUyMDA7CisJLyogSG0sIDB4MDEgbWVhbnMgMTBtcyAtIGZvciA+PSAxbXMgd2Ugd291bGQgbmVlZCAweDA3ICovCisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDAxOwkJLyogTmVlZHMgYXQgbGVhc3QgMSBtcyAqLwkKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKHFvcyk7CisKKwkvKiBpcmRhIHRocmVhZCB3YWl0cyA1MCBtc2VjIGZvciBwb3dlciBzZXR0bGluZyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWE2MDBfY2xvc2Uoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogUG93ZXIgb2ZmIGRvbmdsZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBGQUxTRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9fdTggZ2V0X2NvbnRyb2xfYnl0ZShfX3UzMiBzcGVlZCkKK3sKKwlfX3U4IGJ5dGU7CisKKwlzd2l0Y2ggKHNwZWVkKSB7CisJZGVmYXVsdDoKKwljYXNlIDExNTIwMDoKKwkJYnl0ZSA9IE1BNjAwXzExNTIwMDsKKwkJYnJlYWs7CisJY2FzZSA1NzYwMDoKKwkJYnl0ZSA9IE1BNjAwXzU3NjAwOworCQlicmVhazsKKwljYXNlIDM4NDAwOgorCQlieXRlID0gTUE2MDBfMzg0MDA7CisJCWJyZWFrOworCWNhc2UgMTkyMDA6CisJCWJ5dGUgPSBNQTYwMF8xOTIwMDsKKwkJYnJlYWs7CisJY2FzZSA5NjAwOgorCQlieXRlID0gTUE2MDBfOTYwMDsKKwkJYnJlYWs7CisJY2FzZSAyNDAwOgorCQlieXRlID0gTUE2MDBfMjQwMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGJ5dGU7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBtYTYwMF9jaGFuZ2Vfc3BlZWQgKGRldiwgc3BlZWQpCisgKgorICogICAgU2V0IHRoZSBzcGVlZCBmb3IgdGhlIE1BNjAwIHR5cGUgZG9uZ2xlLgorICoKKyAqICAgIFRoZSBkb25nbGUgaGFzIGFscmVhZHkgYmVlbiByZXNldCB0byBhIGtub3duIHN0YXRlIChkb25nbGUgZGVmYXVsdCkKKyAqICAgIFdlIGN5Y2xlIHRocm91Z2ggc3BlZWRzIGJ5IHB1bHNpbmcgUlRTIGxvdyBhbmQgdGhlbiBoaWdoLgorICovCisKKy8qCisgKiBGdW5jdGlvbiBtYTYwMF9jaGFuZ2Vfc3BlZWQgKGRldiwgc3BlZWQpCisgKgorICogICAgU2V0IHRoZSBzcGVlZCBmb3IgdGhlIE1BNjAwIHR5cGUgZG9uZ2xlLgorICoKKyAqICAgIEFsZ29yaXRobQorICogICAgMS4gUmVzZXQgKGFscmVhZHkgZG9uZSBieSBpcmRhIHRocmVhZCBzdGF0ZSBtYWNoaW5lKQorICogICAgMi4gY2xlYXIgUlRTLCBzZXQgRFRSIGFuZCB3YWl0IGZvciAxbXMKKyAqICAgIDMuIHNlbmQgQ29udHJvbCBCeXRlIHRvIHRoZSBNQTYwMCB0aHJvdWdoIFRYRCB0byBzZXQgbmV3IGJhdWQgcmF0ZQorICogICAgICAgd2FpdCB1bnRpbCB0aGUgc3RvcCBiaXQgb2YgQ29udHJvbCBCeXRlIGlzIHNlbnQgKGZvciA5NjAwIGJhdWQgcmF0ZSwgCisgKiAgICAgICBpdCB0YWtlcyBhYm91dCAxMCBtc2VjKQorICogICAgNC4gc2V0IFJUUywgc2V0IERUUiAocmV0dXJuIHRvIE5PUk1BTCBPcGVyYXRpb24pCisgKiAgICA1LiB3YWl0IGF0IGxlYXN0IDEwIG1zLCBuZXcgc2V0dGluZyAoYmF1ZCByYXRlLCBldGMpIHRha2VzIGVmZmVjdCBoZXJlIAorICogICAgICAgYWZ0ZXIKKyAqLworCisvKiB0b3RhbCBkZWxheXMgYXJlIG9ubHkgYWJvdXQgMjBtcyAtIGxldCdzIGp1c3Qgc2xlZXAgZm9yIG5vdyB0bworICogYXZvaWQgdGhlIHN0YXRlIG1hY2hpbmUgY29tcGxleGl0eSBiZWZvcmUgd2UgZ2V0IHRoaW5ncyB3b3JraW5nCisgKi8KKworc3RhdGljIGludCBtYTYwMF9jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpCit7CisJdTgJYnl0ZTsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpLCBzcGVlZD0lZCAod2FzICVkKVxuIiwgX19GVU5DVElPTl9fLAorCQlzcGVlZCwgZGV2LT5zcGVlZCk7CisKKwkvKiBkb25nbGUgYWxyZWFkeSByZXNldCwgZG9uZ2xlIGFuZCBwb3J0IGF0IGRlZmF1bHQgc3BlZWQgKDk2MDApICovCisKKwkvKiBTZXQgUlRTIGxvdyBmb3IgMSBtcyAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIEZBTFNFKTsKKwltZGVsYXkoMSk7CisKKwkvKiBXcml0ZSBjb250cm9sIGJ5dGUgKi8KKwlieXRlID0gZ2V0X2NvbnRyb2xfYnl0ZShzcGVlZCk7CisJc2lyZGV2X3Jhd193cml0ZShkZXYsICZieXRlLCBzaXplb2YoYnl0ZSkpOworCisJLyogV2FpdCBhdCBsZWFzdCAxMG1zOiBmYWtlIHdhaXRfdW50aWxfc2VudCAtIDEwIGJpdHMgYXQgOTYwMCBiYXVkKi8KKwltc2xlZXAoMTUpOwkJCQkJLyogb2xkIG1hNjAwIHVzZXMgMTVtcyAqLworCisjaWYgMQorCS8qIHJlYWQtYmFjayBvZiB0aGUgY29udHJvbCBieXRlLiBtYTYwMCBpcyB0aGUgZmlyc3QgZG9uZ2xlIGRyaXZlcgorCSAqIHdoaWNoIHVzZXMgdGhpcyBzbyB0aGVyZSBtaWdodCBiZSBzb21lIHVuaWRlbnRpZmllZCBpc3N1ZXMuCisJICogRGlzYWJsZSB0aGlzIGluIGNhc2Ugb2YgcHJvYmxlbXMgd2l0aCByZWFkYmFjay4KKwkgKi8KKworCXNpcmRldl9yYXdfcmVhZChkZXYsICZieXRlLCBzaXplb2YoYnl0ZSkpOworCWlmIChieXRlICE9IGdldF9jb250cm9sX2J5dGUoc3BlZWQpKSAgeworCQlJUkRBX1dBUk5JTkcoIiVzKCk6IGJhZCBjb250cm9sIGJ5dGUgcmVhZC1iYWNrICUwMnggIT0gJTAyeFxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fLCAodW5zaWduZWQpIGJ5dGUsCisJCQkgICAgICh1bnNpZ25lZCkgZ2V0X2NvbnRyb2xfYnl0ZShzcGVlZCkpOworCQlyZXR1cm4gLTE7CisJfQorCWVsc2UKKwkJSVJEQV9ERUJVRygyLCAiJXMoKSBjb250cm9sIGJ5dGUgd3JpdGUgcmVhZCBPS1xuIiwgX19GVU5DVElPTl9fKTsKKyNlbmRpZgorCisJLyogU2V0IERUUiwgU2V0IFJUUyAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCisJLyogV2FpdCBhdCBsZWFzdCAxMG1zICovCisJbXNsZWVwKDEwKTsKKworCS8qIGRvbmdsZSBpcyBub3cgc3dpdGNoZWQgdG8gdGhlIG5ldyBzcGVlZCAqLworCWRldi0+c3BlZWQgPSBzcGVlZDsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gbWE2MDBfcmVzZXQgKGRldikKKyAqCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBtYTYwMCBkb25nbGUuCisgKgorICogICAgICBBbGdvcml0aG06CisgKiAgICAJICAwLiBEVFI9MCwgUlRTPTEgYW5kIHdhaXQgMTAgbXMKKyAqICAgIAkgIDEuIERUUj0xLCBSVFM9MSBhbmQgd2FpdCAxMCBtcworICogICAgICAgIDIuIDk2MDAgYnBzIG5vdworICovCisKKy8qIHRvdGFsIGRlbGF5cyBhcmUgb25seSBhYm91dCAyMG1zIC0gbGV0J3MganVzdCBzbGVlcCBmb3Igbm93IHRvCisgKiBhdm9pZCB0aGUgc3RhdGUgbWFjaGluZSBjb21wbGV4aXR5IGJlZm9yZSB3ZSBnZXQgdGhpbmdzIHdvcmtpbmcKKyAqLworCitpbnQgbWE2MDBfcmVzZXQoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogUmVzZXQgdGhlIGRvbmdsZSA6IHNldCBEVFIgbG93IGZvciAxMCBtcyAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBUUlVFKTsKKwltc2xlZXAoMTApOworCisJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCW1zbGVlcCgxMCk7CisKKwlkZXYtPnNwZWVkID0gOTYwMDsgICAgICAvKiBUaGF0J3MgdGhlIGRvbmdsZS1kZWZhdWx0ICovCisKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FVVEhPUigiTGV1bmcgPDk1RXR3bEBhbHVtbmkuZWUudXN0LmhrPiBodHRwOi8vd3d3LmVuZ3N2ci51c3QvfmVldHdsOTUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUE2MDAgZG9uZ2xlIGRyaXZlciB2ZXJzaW9uIDAuMSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS0xMSIpOyAvKiBJUkRBX01BNjAwX0RPTkdMRSAqLworCQkKK21vZHVsZV9pbml0KG1hNjAwX3Npcl9pbml0KTsKK21vZHVsZV9leGl0KG1hNjAwX3Npcl9jbGVhbnVwKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9tYTYwMC5jIGIvZHJpdmVycy9uZXQvaXJkYS9tYTYwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZTY4MzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL21hNjAwLmMKQEAgLTAsMCArMSwzNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgbWE2MDAuYworICogVmVyc2lvbjogICAgICAgMC4xCisgKiBEZXNjcmlwdGlvbjogICBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTUE2MDAgZG9uZ2xlCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBMZXVuZyA8OTVFdHdsQGFsdW1uaS5lZS51c3QuaGs+IGh0dHA6Ly93d3cuZW5nc3ZyLnVzdC9+ZWV0d2w5NQorICogQ3JlYXRlZCBhdDogICAgU2F0IEp1biAxMCAyMDowMjozNSAyMDAwCisgKiBNb2RpZmllZCBhdDogICAKKyAqIE1vZGlmaWVkIGJ5OiAgIAorICoKKyAqIE5vdGU6IHZlcnkgdGhhbmtzIHRvIE1yLiBNYXJ1IFdhbmcgPG1hcnVAbW9iaWxlYWN0aW9uLmNvbS50dz4gZm9yIHByb3ZpZGluZyAKKyAqICAgICAgIGluZm9ybWF0aW9uIG9uIHRoZSBNQTYwMCBkb25nbGUKKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMjAwMCBMZXVuZywgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqICAgICBNQSAwMjExMS0xMzA3IFVTQQorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkZWZpbmUgdGhpcyBtYWNybyBmb3IgcmVsZWFzZSB2ZXJzaW9uICovCisvLyNkZWZpbmUgTkRFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCisjaWZuZGVmIE5ERUJVRworCSN1bmRlZiBJUkRBX0RFQlVHCisJI2RlZmluZSBJUkRBX0RFQlVHKG4sIGFyZ3MuLi4pIChwcmludGsoS0VSTl9ERUJVRyBhcmdzKSkKKworCSN1bmRlZiBBU1NFUlQKKwkjZGVmaW5lIEFTU0VSVChleHByLCBmdW5jKSBcCisJaWYoIShleHByKSkgeyBcCisJICAgICAgICBwcmludGsoICJBc3NlcnRpb24gZmFpbGVkISAlcywlcywlcyxsaW5lPSVkXG4iLFwKKyAgICAgICAgCSNleHByLF9fRklMRV9fLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7IFwKKwkgICAgICAgIGZ1bmN9CisjZW5kaWYKKworLyogY29udmVydCBoZXggdmFsdWUgdG8gYXNjaWkgaGV4ICovCitzdGF0aWMgY29uc3QgY2hhciBoZXhUYmxbXSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKKworCitzdGF0aWMgdm9pZCBtYTYwMF9vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcyk7CitzdGF0aWMgdm9pZCBtYTYwMF9jbG9zZShkb25nbGVfdCAqc2VsZik7CitzdGF0aWMgaW50ICBtYTYwMF9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CitzdGF0aWMgaW50ICBtYTYwMF9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKTsKKworLyogY29udHJvbCBieXRlIGZvciBNQTYwMCAqLworI2RlZmluZSBNQTYwMF85NjAwCTB4MDAKKyNkZWZpbmUgTUE2MDBfMTkyMDAJMHgwMQorI2RlZmluZSBNQTYwMF8zODQwMAkweDAyCisjZGVmaW5lIE1BNjAwXzU3NjAwCTB4MDMKKyNkZWZpbmUgTUE2MDBfMTE1MjAwCTB4MDQKKyNkZWZpbmUgTUE2MDBfREVWX0lEMQkweDA1CisjZGVmaW5lIE1BNjAwX0RFVl9JRDIJMHgwNgorI2RlZmluZSBNQTYwMF8yNDAwCTB4MDgKKworc3RhdGljIHN0cnVjdCBkb25nbGVfcmVnIGRvbmdsZSA9IHsKKwkudHlwZSA9IElSREFfTUE2MDBfRE9OR0xFLAorCS5vcGVuID0gbWE2MDBfb3BlbiwKKwkuY2xvc2UgPSBtYTYwMF9jbG9zZSwKKwkucmVzZXQgPSBtYTYwMF9yZXNldCwKKwkuY2hhbmdlX3NwZWVkID0gbWE2MDBfY2hhbmdlX3NwZWVkLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWE2MDBfaW5pdCh2b2lkKQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIGlyZGFfZGV2aWNlX3JlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1hNjAwX2NsZWFudXAodm9pZCkKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCWlyZGFfZGV2aWNlX3VucmVnaXN0ZXJfZG9uZ2xlKCZkb25nbGUpOworfQorCisvKgorCVBvd2VyIG9uOgorCQkoMCkgQ2xlYXIgUlRTIGFuZCBEVFIgZm9yIDEgc2Vjb25kCisJCSgxKSBTZXQgUlRTIGFuZCBEVFIgZm9yIDEgc2Vjb25kCisJCSgyKSA5NjAwIGJwcyBub3cKKwlOb3RlOiBhc3N1bWUgUlRTLCBEVFIgYXJlIGNsZWFyIGJlZm9yZQorKi8KK3N0YXRpYyB2b2lkIG1hNjAwX29wZW4oZG9uZ2xlX3QgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IElSXzI0MDB8SVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMAorCQkJCXxJUl81NzYwMHxJUl8xMTUyMDA7CisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDAxOwkJLyogTmVlZHMgYXQgbGVhc3QgMSBtcyAqLwkKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKHFvcyk7CisKKwkvL3NlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIEZBTFNFKTsKKwkvLyBzaG91bGQgd2FpdCAxIHNlY29uZAorCisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKwkvLyBzaG91bGQgd2FpdCAxIHNlY29uZAorfQorCitzdGF0aWMgdm9pZCBtYTYwMF9jbG9zZShkb25nbGVfdCAqc2VsZikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogUG93ZXIgb2ZmIGRvbmdsZSAqLworCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIEZBTFNFKTsKK30KKworc3RhdGljIF9fdTggZ2V0X2NvbnRyb2xfYnl0ZShfX3UzMiBzcGVlZCkKK3sKKwlfX3U4IGJ5dGU7CisKKwlzd2l0Y2ggKHNwZWVkKSB7CisJZGVmYXVsdDoKKwljYXNlIDExNTIwMDoKKwkJYnl0ZSA9IE1BNjAwXzExNTIwMDsKKwkJYnJlYWs7CisJY2FzZSA1NzYwMDoKKwkJYnl0ZSA9IE1BNjAwXzU3NjAwOworCQlicmVhazsKKwljYXNlIDM4NDAwOgorCQlieXRlID0gTUE2MDBfMzg0MDA7CisJCWJyZWFrOworCWNhc2UgMTkyMDA6CisJCWJ5dGUgPSBNQTYwMF8xOTIwMDsKKwkJYnJlYWs7CisJY2FzZSA5NjAwOgorCQlieXRlID0gTUE2MDBfOTYwMDsKKwkJYnJlYWs7CisJY2FzZSAyNDAwOgorCQlieXRlID0gTUE2MDBfMjQwMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGJ5dGU7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBtYTYwMF9jaGFuZ2Vfc3BlZWQgKGRldiwgc3RhdGUsIHNwZWVkKQorICoKKyAqICAgIFNldCB0aGUgc3BlZWQgZm9yIHRoZSBNQTYwMCB0eXBlIGRvbmdsZS4gV2FybmluZywgdGhpcyAKKyAqICAgIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggYSBwcm9jZXNzIGNvbnRleHQhCisgKgorICogICAgQWxnb3JpdGhtCisgKiAgICAxLiBSZXNldAorICogICAgMi4gY2xlYXIgUlRTLCBzZXQgRFRSIGFuZCB3YWl0IGZvciAxbXMKKyAqICAgIDMuIHNlbmQgQ29udHJvbCBCeXRlIHRvIHRoZSBNQTYwMCB0aHJvdWdoIFRYRCB0byBzZXQgbmV3IGJhdWQgcmF0ZQorICogICAgICAgd2FpdCB1bnRpbCB0aGUgc3RvcCBiaXQgb2YgQ29udHJvbCBCeXRlIGlzIHNlbnQgKGZvciA5NjAwIGJhdWQgcmF0ZSwgCisgKiAgICAgICBpdCB0YWtlcyBhYm91dCAxMCBtc2VjKQorICogICAgNC4gc2V0IFJUUywgc2V0IERUUiAocmV0dXJuIHRvIE5PUk1BTCBPcGVyYXRpb24pCisgKiAgICA1LiB3YWl0IGF0IGxlYXN0IDEwIG1zLCBuZXcgc2V0dGluZyAoYmF1ZCByYXRlLCBldGMpIHRha2VzIGVmZmVjdCBoZXJlIAorICogICAgICAgYWZ0ZXIKKyAqLworc3RhdGljIGludCBtYTYwMF9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlkb25nbGVfdCAqc2VsZiA9IChkb25nbGVfdCAqKSB0YXNrLT5pbnN0YW5jZTsKKwlfX3UzMiBzcGVlZCA9IChfX3UzMikgdGFzay0+cGFyYW07CisJc3RhdGljIF9fdTggYnl0ZTsKKwlfX3U4IGJ5dGVfZWNobzsKKwlpbnQgcmV0ID0gMDsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJQVNTRVJUKHRhc2sgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlpZiAoc2VsZi0+c3BlZWRfdGFzayAmJiBzZWxmLT5zcGVlZF90YXNrICE9IHRhc2spIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgYnVzeSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBtc2Vjc190b19qaWZmaWVzKDEwKTsKKwl9IGVsc2UgeworCQlzZWxmLT5zcGVlZF90YXNrID0gdGFzazsKKwl9CisKKwlzd2l0Y2ggKHRhc2stPnN0YXRlKSB7CisJY2FzZSBJUkRBX1RBU0tfSU5JVDoKKwljYXNlIElSREFfVEFTS19DSElMRF9JTklUOgorCQkvKiAKKwkJICogTmVlZCB0byByZXNldCB0aGUgZG9uZ2xlIGFuZCBnbyB0byA5NjAwIGJwcyBiZWZvcmUKKyAgICAgICAgICAgICAgICAgKiBwcm9ncmFtbWluZyAKKwkJICovCisJCWlmIChpcmRhX3Rhc2tfZXhlY3V0ZShzZWxmLCBtYTYwMF9yZXNldCwgTlVMTCwgdGFzaywgCisJCQkJICAgICAgKHZvaWQgKikgc3BlZWQpKSB7CisJCQkvKiBEb25nbGUgbmVlZCBtb3JlIHRpbWUgdG8gcmVzZXQgKi8KKwkJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19DSElMRF9XQUlUKTsKKwkKKwkJCS8qIGdpdmUgMSBzZWNvbmQgdG8gZmluaXNoICovCisJCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCQl9IGVsc2UgeworCQkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0NISUxEX0RPTkUpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBJUkRBX1RBU0tfQ0hJTERfV0FJVDoKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCByZXNldHRpbmcgZG9uZ2xlIHRpbWVkIG91dCFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCXJldCA9IC0xOworCQlicmVhazsKKworCWNhc2UgSVJEQV9UQVNLX0NISUxEX0RPTkU6CisJCS8qIFNldCBEVFIsIENsZWFyIFJUUyAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIEZBTFNFKTsKKwkKKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcygxKTsJCS8qIFNsZWVwIDEgbXMgKi8KKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQpOworCQlicmVhazsKKworCWNhc2UgSVJEQV9UQVNLX1dBSVQ6CisJCXNwZWVkID0gKF9fdTMyKSB0YXNrLT5wYXJhbTsKKwkJYnl0ZSA9IGdldF9jb250cm9sX2J5dGUoc3BlZWQpOworCisJCS8qIFdyaXRlIGNvbnRyb2wgYnl0ZSAqLworCQlzZWxmLT53cml0ZShzZWxmLT5kZXYsICZieXRlLCBzaXplb2YoYnl0ZSkpOworCQkKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQxKTsKKworCQkvKiBXYWl0IGF0IGxlYXN0IDEwIG1zICovCisJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMTUpOworCQlicmVhazsKKworCWNhc2UgSVJEQV9UQVNLX1dBSVQxOgorCQkvKiBSZWFkIGNvbnRyb2wgYnl0ZSBlY2hvICovCisJCXNlbGYtPnJlYWQoc2VsZi0+ZGV2LCAmYnl0ZV9lY2hvLCBzaXplb2YoYnl0ZV9lY2hvKSk7CisKKwkJaWYoYnl0ZSAhPSBieXRlX2VjaG8pIHsKKwkJCS8qIGlmIGNvbnRyb2wgYnl0ZSAhPSBlY2hvLCBJIGRvbid0IGtub3cgd2hhdCB0byBkbyAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMoKSBjb250cm9sIGJ5dGUgd3JpdHRlbiAhPSByZWFkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNvbnRyb2wgYnl0ZSA9IDB4JWMlY1xuIiwgCisJCQkgICAgICAgaGV4VGJsWyhieXRlPj40KSYweDBmXSwgaGV4VGJsW2J5dGUmMHgwZl0pOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnl0ZSBlY2hvID0gMHglYyVjXG4iLCAKKwkJCSAgICAgICBoZXhUYmxbKGJ5dGVfZWNobz4+NCkgJiAweDBmXSwgCisJCQkgICAgICAgaGV4VGJsW2J5dGVfZWNobyAmIDB4MGZdKTsKKwkJI2lmbmRlZiBOREVCVUcKKwkJfSBlbHNlIHsKKwkJCUlSREFfREVCVUcoMiwgIiVzKCkgY29udHJvbCBieXRlIHdyaXRlIHJlYWQgT0tcbiIsIF9fRlVOQ1RJT05fXyk7CisJCSNlbmRpZgorCQl9CisKKwkJLyogU2V0IERUUiwgU2V0IFJUUyAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19XQUlUMik7CisKKwkJLyogV2FpdCBhdCBsZWFzdCAxMCBtcyAqLworCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDEwKTsKKwkJYnJlYWs7CisKKwljYXNlIElSREFfVEFTS19XQUlUMjoKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5zcGVlZF90YXNrID0gTlVMTDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlJUkRBX0VSUk9SKCIlcygpLCB1bmtub3duIHN0YXRlICVkXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCB0YXNrLT5zdGF0ZSk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwkJc2VsZi0+c3BlZWRfdGFzayA9IE5VTEw7CisJCXJldCA9IC0xOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG1hNjAwX3Jlc2V0IChkcml2ZXIpCisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgbWE2MDAgZG9uZ2xlLiBXYXJuaW5nLCB0aGlzIGZ1bmN0aW9uIAorICogICAgICBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgcHJvY2VzcyBjb250ZXh0ISEgCisgKgorICogICAgICBBbGdvcml0aG06CisgKiAgICAJICAwLiBEVFI9MCwgUlRTPTEgYW5kIHdhaXQgMTAgbXMKKyAqICAgIAkgIDEuIERUUj0xLCBSVFM9MSBhbmQgd2FpdCAxMCBtcworICogICAgICAgIDIuIDk2MDAgYnBzIG5vdworICovCitpbnQgbWE2MDBfcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlkb25nbGVfdCAqc2VsZiA9IChkb25nbGVfdCAqKSB0YXNrLT5pbnN0YW5jZTsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlBU1NFUlQodGFzayAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCWlmIChzZWxmLT5yZXNldF90YXNrICYmIHNlbGYtPnJlc2V0X3Rhc2sgIT0gdGFzaykgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBidXN5IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIG1zZWNzX3RvX2ppZmZpZXMoMTApOworCX0gZWxzZQorCQlzZWxmLT5yZXNldF90YXNrID0gdGFzazsKKwkKKwlzd2l0Y2ggKHRhc2stPnN0YXRlKSB7CisJY2FzZSBJUkRBX1RBU0tfSU5JVDoKKwkJLyogQ2xlYXIgRFRSIGFuZCBTZXQgUlRTICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIFRSVUUpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDEpOworCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDEwKTsJCS8qIFNsZWVwIDEwIG1zICovCisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX1dBSVQxOgorCQkvKiBTZXQgRFRSIGFuZCBSVFMgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQyKTsKKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcygxMCk7CQkvKiBTbGVlcCAxMCBtcyAqLworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19XQUlUMjoKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5yZXNldF90YXNrID0gTlVMTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9FUlJPUigiJXMoKSwgdW5rbm93biBzdGF0ZSAlZFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgdGFzay0+c3RhdGUpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CQkKKwkJc2VsZi0+cmVzZXRfdGFzayA9IE5VTEw7CisJCXJldCA9IC0xOworCX0KKwlyZXR1cm4gcmV0OworfQorCitNT0RVTEVfQVVUSE9SKCJMZXVuZyA8OTVFdHdsQGFsdW1uaS5lZS51c3QuaGs+IGh0dHA6Ly93d3cuZW5nc3ZyLnVzdC9+ZWV0d2w5NSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNQTYwMCBkb25nbGUgZHJpdmVyIHZlcnNpb24gMC4xIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTExIik7IC8qIElSREFfTUE2MDBfRE9OR0xFICovCisJCQorLyoKKyAqIEZ1bmN0aW9uIGluaXRfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIEluaXRpYWxpemUgTUE2MDAgbW9kdWxlCisgKgorICovCittb2R1bGVfaW5pdChtYTYwMF9pbml0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGNsZWFudXBfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIENsZWFudXAgTUE2MDAgbW9kdWxlCisgKgorICovCittb2R1bGVfZXhpdChtYTYwMF9jbGVhbnVwKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9tY3AyMTIwLXNpci5jIGIvZHJpdmVycy9uZXQvaXJkYS9tY3AyMTIwLXNpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YmQwMTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL21jcDIxMjAtc2lyLmMKQEAgLTAsMCArMSwyMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgCisgKiAgICAKKyAqIEZpbGVuYW1lOiAgICAgIG1jcDIxMjAuYworICogVmVyc2lvbjogICAgICAgMS4wCisgKiBEZXNjcmlwdGlvbjogICBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE1DUDIxMjAgKE1pY3JvY2hpcCkKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIEZlbGl4IFRhbmcgKHRhbmdmQGV5ZXRhcC5vcmcpCisgKiBDcmVhdGVkIGF0OiAgICBTdW4gTWFyIDMxIDE5OjMyOjEyIEVTVCAyMDAyCisgKiBCYXNlZCBvbiBjb2RlIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMjAwMiBGZWxpeCBUYW5nLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisKKyNpbmNsdWRlICJzaXItZGV2LmgiCisKK3N0YXRpYyBpbnQgbWNwMjEyMF9yZXNldChzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKK3N0YXRpYyBpbnQgbWNwMjEyMF9vcGVuKHN0cnVjdCBzaXJfZGV2ICpkZXYpOworc3RhdGljIGludCBtY3AyMTIwX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICpkZXYpOworc3RhdGljIGludCBtY3AyMTIwX2NoYW5nZV9zcGVlZChzdHJ1Y3Qgc2lyX2RldiAqZGV2LCB1bnNpZ25lZCBzcGVlZCk7CisKKyNkZWZpbmUgTUNQMjEyMF85NjAwICAgIDB4ODcKKyNkZWZpbmUgTUNQMjEyMF8xOTIwMCAgIDB4OEIKKyNkZWZpbmUgTUNQMjEyMF8zODQwMCAgIDB4ODUKKyNkZWZpbmUgTUNQMjEyMF81NzYwMCAgIDB4ODMKKyNkZWZpbmUgTUNQMjEyMF8xMTUyMDAgIDB4ODEKKworI2RlZmluZSBNQ1AyMTIwX0NPTU1JVCAgMHgxMQorCitzdGF0aWMgc3RydWN0IGRvbmdsZV9kcml2ZXIgbWNwMjEyMCA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRyaXZlcl9uYW1lCT0gIk1pY3JvY2hpcCBNQ1AyMTIwIiwKKwkudHlwZQkJPSBJUkRBX01DUDIxMjBfRE9OR0xFLAorCS5vcGVuCQk9IG1jcDIxMjBfb3BlbiwKKwkuY2xvc2UJCT0gbWNwMjEyMF9jbG9zZSwKKwkucmVzZXQJCT0gbWNwMjEyMF9yZXNldCwKKwkuc2V0X3NwZWVkCT0gbWNwMjEyMF9jaGFuZ2Vfc3BlZWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtY3AyMTIwX3Npcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlyZGFfcmVnaXN0ZXJfZG9uZ2xlKCZtY3AyMTIwKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1jcDIxMjBfc2lyX2NsZWFudXAodm9pZCkKK3sKKwlpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKCZtY3AyMTIwKTsKK30KKworc3RhdGljIGludCBtY3AyMTIwX29wZW4oc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcW9zX2luZm8gKnFvcyA9ICZkZXYtPnFvczsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBzZWVtcyBubyBleHBsaWNpdCBwb3dlci1vbiByZXF1aXJlZCBoZXJlIGFuZCByZXNldCBzd2l0Y2hpbmcgaXQgb24gYW55d2F5ICovCisKKwlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8SVJfMTE1MjAwOworCXFvcy0+bWluX3R1cm5fdGltZS5iaXRzID0gMHgwMTsKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKHFvcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtY3AyMTIwX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFBvd2VyIG9mZiBkb25nbGUgKi8KKyAgICAgICAgLyogcmVzZXQgYW5kIGluaGliaXQgbWNwMjEyMCAqLworCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIFRSVUUpOworCS8vIHNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBGQUxTRSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG1jcDIxMjBfY2hhbmdlX3NwZWVkIChkZXYsIHNwZWVkKQorICoKKyAqICAgIFNldCB0aGUgc3BlZWQgZm9yIHRoZSBNQ1AyMTIwLgorICoKKyAqLworCisjZGVmaW5lIE1DUDIxMjBfU1RBVEVfV0FJVF9TUEVFRAkoU0lSREVWX1NUQVRFX0RPTkdMRV9TUEVFRCsxKQorCitzdGF0aWMgaW50IG1jcDIxMjBfY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICpkZXYsIHVuc2lnbmVkIHNwZWVkKQoreworCXVuc2lnbmVkIHN0YXRlID0gZGV2LT5mc20uc3Vic3RhdGU7CisJdW5zaWduZWQgZGVsYXkgPSAwOworCXU4IGNvbnRyb2xbMl07CisJc3RhdGljIGludCByZXQgPSAwOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFNJUkRFVl9TVEFURV9ET05HTEVfU1BFRUQ6CisJCS8qIFNldCBEVFIgdG8gZW50ZXIgY29tbWFuZCBtb2RlICovCisJCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIFRSVUUsIEZBTFNFKTsKKyAgICAgICAgICAgICAgICB1ZGVsYXkoNTAwKTsKKworCQlyZXQgPSAwOworCQlzd2l0Y2ggKHNwZWVkKSB7CisJCWRlZmF1bHQ6CisJCQlzcGVlZCA9IDk2MDA7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgOTYwMDoKKwkJCWNvbnRyb2xbMF0gPSBNQ1AyMTIwXzk2MDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygibWNwMjEyMCA5NjAwXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDE5MjAwOgorCQkJY29udHJvbFswXSA9IE1DUDIxMjBfMTkyMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygibWNwMjEyMCAxOTIwMFxuIik7CisJCQlicmVhazsKKwkJY2FzZSAzNDgwMDoKKwkJCWNvbnRyb2xbMF0gPSBNQ1AyMTIwXzM4NDAwOworICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjAgMzg0MDBcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgNTc2MDA6CisJCQljb250cm9sWzBdID0gTUNQMjEyMF81NzYwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJtY3AyMTIwIDU3NjAwXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDExNTIwMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xbMF0gPSBNQ1AyMTIwXzExNTIwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJtY3AyMTIwIDExNTIwMFxuIik7CisJCQlicmVhazsKKwkJfQorCQljb250cm9sWzFdID0gTUNQMjEyMF9DT01NSVQ7CisJCisJCS8qIFdyaXRlIGNvbnRyb2wgYnl0ZXMgKi8KKwkJc2lyZGV2X3Jhd193cml0ZShkZXYsIGNvbnRyb2wsIDIpOworCQlkZXYtPnNwZWVkID0gc3BlZWQ7CisKKwkJc3RhdGUgPSBNQ1AyMTIwX1NUQVRFX1dBSVRfU1BFRUQ7CisJCWRlbGF5ID0gMTAwOworICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJtY3AyMTIwX2NoYW5nZV9zcGVlZDogZG9uZ2xlX3NwZWVkXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIE1DUDIxMjBfU1RBVEVfV0FJVF9TUEVFRDoKKwkJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCQlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgRkFMU0UpOworICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJtY3AyMTIwX2NoYW5nZV9zcGVlZDogbWNwX3dhaXRcbiIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzKCksIHVuZGVmaW5lIHN0YXRlICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXRlKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCWRldi0+ZnNtLnN1YnN0YXRlID0gc3RhdGU7CisJcmV0dXJuIChkZWxheSA+IDApID8gZGVsYXkgOiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBtY3AyMTIwX3Jlc2V0IChkcml2ZXIpCisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgbWNwMjEyMCBkb25nbGUuCisgKiAgICAgIAorICogICAgICBJbmZvOiAtc2V0IFJUUyB0byByZXNldCBtY3AyMTIwCisgKiAgICAgICAgICAgIC1zZXQgRFRSIHRvIHNldCBtY3AyMTIwIHNvZnR3YXJlIGNvbW1hbmQgbW9kZQorICogICAgICAgICAgICAtbWNwMjEyMCBkZWZhdWx0cyB0byA5NjAwIGJhdWQgYWZ0ZXIgcmVzZXQKKyAqCisgKiAgICAgIEFsZ29yaXRobToKKyAqICAgICAgMC4gU2V0IFJUUyB0byByZXNldCBtY3AyMTIwLgorICogICAgICAxLiBDbGVhciBSVFMgYW5kIHdhaXQgZm9yIGRldmljZSByZXNldCB0aW1lciBvZiAzMCBtcyAobWF4KS4KKyAqICAgICAgCisgKi8KKworI2RlZmluZSBNQ1AyMTIwX1NUQVRFX1dBSVQxX1JFU0VUCShTSVJERVZfU1RBVEVfRE9OR0xFX1JFU0VUKzEpCisjZGVmaW5lIE1DUDIxMjBfU1RBVEVfV0FJVDJfUkVTRVQJKFNJUkRFVl9TVEFURV9ET05HTEVfUkVTRVQrMikKKworc3RhdGljIGludCBtY3AyMTIwX3Jlc2V0KHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJdW5zaWduZWQgc3RhdGUgPSBkZXYtPmZzbS5zdWJzdGF0ZTsKKwl1bnNpZ25lZCBkZWxheSA9IDA7CisJaW50IHJldCA9IDA7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgU0lSREVWX1NUQVRFX0RPTkdMRV9SRVNFVDoKKyAgICAgICAgICAgICAgICAvL3ByaW50aygibWNwMjEyMF9yZXNldDogZG9uZ2xlX3Jlc2V0XG4iKTsKKwkJLyogUmVzZXQgZG9uZ2xlIGJ5IHNldHRpbmcgUlRTKi8KKwkJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisJCXN0YXRlID0gTUNQMjEyMF9TVEFURV9XQUlUMV9SRVNFVDsKKwkJZGVsYXkgPSA1MDsKKwkJYnJlYWs7CisKKwljYXNlIE1DUDIxMjBfU1RBVEVfV0FJVDFfUkVTRVQ6CisgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjBfcmVzZXQ6IG1jcDIxMjBfd2FpdDFcbiIpOworICAgICAgICAgICAgICAgIC8qIGNsZWFyIFJUUyBhbmQgd2FpdCBmb3IgYXQgbGVhc3QgMzAgbXMuICovCisJCXNpcmRldl9zZXRfZHRyX3J0cyhkZXYsIEZBTFNFLCBGQUxTRSk7CisJCXN0YXRlID0gTUNQMjEyMF9TVEFURV9XQUlUMl9SRVNFVDsKKwkJZGVsYXkgPSA1MDsKKwkJYnJlYWs7CisKKwljYXNlIE1DUDIxMjBfU1RBVEVfV0FJVDJfUkVTRVQ6CisgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjBfcmVzZXQgbWNwMjEyMF93YWl0MlxuIik7CisJCS8qIEdvIGJhY2sgdG8gbm9ybWFsIG1vZGUgKi8KKwkJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgRkFMU0UsIEZBTFNFKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlJUkRBX0VSUk9SKCIlcygpLCB1bmRlZmluZWQgc3RhdGUgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdGUpOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJZGV2LT5mc20uc3Vic3RhdGUgPSBzdGF0ZTsKKwlyZXR1cm4gKGRlbGF5ID4gMCkgPyBkZWxheSA6IHJldDsKK30KKworTU9EVUxFX0FVVEhPUigiRmVsaXggVGFuZyA8dGFuZ2ZAZXlldGFwLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWljcm9jaGlwIE1DUDIxMjAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXJkYS1kb25nbGUtOSIpOyAvKiBJUkRBX01DUDIxMjBfRE9OR0xFICovCisKK21vZHVsZV9pbml0KG1jcDIxMjBfc2lyX2luaXQpOworbW9kdWxlX2V4aXQobWNwMjEyMF9zaXJfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL21jcDIxMjAuYyBiL2RyaXZlcnMvbmV0L2lyZGEvbWNwMjEyMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNjE5OWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL21jcDIxMjAuYwpAQCAtMCwwICsxLDI0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAKKyAqICAgIAorICogRmlsZW5hbWU6ICAgICAgbWNwMjEyMC5jCisgKiBWZXJzaW9uOiAgICAgICAxLjAKKyAqIERlc2NyaXB0aW9uOiAgIEltcGxlbWVudGF0aW9uIGZvciB0aGUgTUNQMjEyMCAoTWljcm9jaGlwKQorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRmVsaXggVGFuZyAodGFuZ2ZAZXlldGFwLm9yZykKKyAqIENyZWF0ZWQgYXQ6ICAgIFN1biBNYXIgMzEgMTk6MzI6MTIgRVNUIDIwMDIKKyAqIEJhc2VkIG9uIGNvZGUgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAyIEZlbGl4IFRhbmcsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCitzdGF0aWMgaW50ICBtY3AyMTIwX3Jlc2V0KHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOworc3RhdGljIHZvaWQgbWNwMjEyMF9vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcyk7CitzdGF0aWMgdm9pZCBtY3AyMTIwX2Nsb3NlKGRvbmdsZV90ICpzZWxmKTsKK3N0YXRpYyBpbnQgIG1jcDIxMjBfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOworCisjZGVmaW5lIE1DUDIxMjBfOTYwMCAgICAweDg3CisjZGVmaW5lIE1DUDIxMjBfMTkyMDAgICAweDhCCisjZGVmaW5lIE1DUDIxMjBfMzg0MDAgICAweDg1CisjZGVmaW5lIE1DUDIxMjBfNTc2MDAgICAweDgzCisjZGVmaW5lIE1DUDIxMjBfMTE1MjAwICAweDgxCisKKyNkZWZpbmUgTUNQMjEyMF9DT01NSVQgIDB4MTEKKworc3RhdGljIHN0cnVjdCBkb25nbGVfcmVnIGRvbmdsZSA9IHsKKwkudHlwZSA9IElSREFfTUNQMjEyMF9ET05HTEUsCisJLm9wZW4gPSBtY3AyMTIwX29wZW4sCisJLmNsb3NlID0gbWNwMjEyMF9jbG9zZSwKKwkucmVzZXQgPSBtY3AyMTIwX3Jlc2V0LAorCS5jaGFuZ2Vfc3BlZWQgPSBtY3AyMTIwX2NoYW5nZV9zcGVlZCwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1jcDIxMjBfaW5pdCh2b2lkKQoreworCXJldHVybiBpcmRhX2RldmljZV9yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtY3AyMTIwX2NsZWFudXAodm9pZCkKK3sKKwlpcmRhX2RldmljZV91bnJlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKK30KKworc3RhdGljIHZvaWQgbWNwMjEyMF9vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcykKK3sKKwlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8SVJfMTE1MjAwOworCXFvcy0+bWluX3R1cm5fdGltZS5iaXRzID0gMHgwMTsKK30KKworc3RhdGljIHZvaWQgbWNwMjEyMF9jbG9zZShkb25nbGVfdCAqc2VsZikKK3sKKwkvKiBQb3dlciBvZmYgZG9uZ2xlICovCisgICAgICAgIC8qIHJlc2V0IGFuZCBpbmhpYml0IG1jcDIxMjAgKi8KKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCS8vc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgRkFMU0UpOworfQorCisvKgorICogRnVuY3Rpb24gbWNwMjEyMF9jaGFuZ2Vfc3BlZWQgKGRldiwgc3BlZWQpCisgKgorICogICAgU2V0IHRoZSBzcGVlZCBmb3IgdGhlIE1DUDIxMjAuCisgKgorICovCitzdGF0aWMgaW50IG1jcDIxMjBfY2hhbmdlX3NwZWVkKHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CisJX191MzIgc3BlZWQgPSAoX191MzIpIHRhc2stPnBhcmFtOworCV9fdTggY29udHJvbFsyXTsKKwlpbnQgcmV0ID0gMDsKKworCXNlbGYtPnNwZWVkX3Rhc2sgPSB0YXNrOworCisJc3dpdGNoICh0YXNrLT5zdGF0ZSkgeworCWNhc2UgSVJEQV9UQVNLX0lOSVQ6CisJCS8qIE5lZWQgdG8gcmVzZXQgdGhlIGRvbmdsZSBhbmQgZ28gdG8gOTYwMCBicHMgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgcHJvZ3JhbW1pbmcgKi8KKyAgICAgICAgICAgICAgICAvL3ByaW50aygiRG1jcDIxMjBfY2hhbmdlX3NwZWVkIGlyZGFfdGFza19pbml0XG4iKTsKKwkJaWYgKGlyZGFfdGFza19leGVjdXRlKHNlbGYsIG1jcDIxMjBfcmVzZXQsIE5VTEwsIHRhc2ssIAorCQkJCSAgICAgICh2b2lkICopIHNwZWVkKSkKKwkJeworCQkJLyogRG9uZ2xlIG5lZWQgbW9yZSB0aW1lIHRvIHJlc2V0ICovCisJCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfQ0hJTERfV0FJVCk7CisKKwkJCS8qIEdpdmUgcmVzZXQgMSBzZWMgdG8gZmluaXNoICovCisJCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCQl9CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX0NISUxEX1dBSVQ6CisJCUlSREFfV0FSTklORygiJXMoKSwgcmVzZXR0aW5nIGRvbmdsZSB0aW1lZCBvdXQhXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXQgPSAtMTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfQ0hJTERfRE9ORToKKwkJLyogU2V0IERUUiB0byBlbnRlciBjb21tYW5kIG1vZGUgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgdWRlbGF5KDUwMCk7CisKKwkJc3dpdGNoIChzcGVlZCkgeworCQljYXNlIDk2MDA6CisJCWRlZmF1bHQ6CisJCQljb250cm9sWzBdID0gTUNQMjEyMF85NjAwOworICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjAgOTYwMFxuIik7CisJCQlicmVhazsKKwkJY2FzZSAxOTIwMDoKKwkJCWNvbnRyb2xbMF0gPSBNQ1AyMTIwXzE5MjAwOworICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjAgMTkyMDBcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMzQ4MDA6CisJCQljb250cm9sWzBdID0gTUNQMjEyMF8zODQwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJtY3AyMTIwIDM4NDAwXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDU3NjAwOgorCQkJY29udHJvbFswXSA9IE1DUDIxMjBfNTc2MDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygibWNwMjEyMCA1NzYwMFxuIik7CisJCQlicmVhazsKKwkJY2FzZSAxMTUyMDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sWzBdID0gTUNQMjEyMF8xMTUyMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50aygibWNwMjEyMCAxMTUyMDBcbiIpOworCQkJYnJlYWs7CisJCX0KKwkgICAgICAgIGNvbnRyb2xbMV0gPSBNQ1AyMTIwX0NPTU1JVDsKKwkKKwkJLyogV3JpdGUgY29udHJvbCBieXRlcyAqLworICAgICAgICAgICAgICAgIHNlbGYtPndyaXRlKHNlbGYtPmRldiwgY29udHJvbCwgMik7CisgCisgICAgICAgICAgICAgICAgaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQpOworCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDEwMCk7CisgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjBfY2hhbmdlX3NwZWVkIGlyZGFfY2hpbGRfZG9uZVxuIik7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX1dBSVQ6CisJCS8qIEdvIGJhY2sgdG8gbm9ybWFsIG1vZGUgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgRkFMU0UpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisJCXNlbGYtPnNwZWVkX3Rhc2sgPSBOVUxMOworICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJtY3AyMTIwX2NoYW5nZV9zcGVlZCBpcmRhX3Rhc2tfd2FpdFxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzKCksIHVua25vd24gc3RhdGUgJWRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHRhc2stPnN0YXRlKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5zcGVlZF90YXNrID0gTlVMTDsKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gbWNwMjEyMF9yZXNldCAoZHJpdmVyKQorICoKKyAqICAgICAgVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIG1jcDIxMjAgZG9uZ2xlLgorICogICAgICAKKyAqICAgICAgSW5mbzogLXNldCBSVFMgdG8gcmVzZXQgbWNwMjEyMAorICogICAgICAgICAgICAtc2V0IERUUiB0byBzZXQgbWNwMjEyMCBzb2Z0d2FyZSBjb21tYW5kIG1vZGUKKyAqICAgICAgICAgICAgLW1jcDIxMjAgZGVmYXVsdHMgdG8gOTYwMCBiYXVkIGFmdGVyIHJlc2V0CisgKgorICogICAgICBBbGdvcml0aG06CisgKiAgICAgIDAuIFNldCBSVFMgdG8gcmVzZXQgbWNwMjEyMC4KKyAqICAgICAgMS4gQ2xlYXIgUlRTIGFuZCB3YWl0IGZvciBkZXZpY2UgcmVzZXQgdGltZXIgb2YgMzAgbXMgKG1heCkuCisgKiAgICAgIAorICovCisKKworc3RhdGljIGludCBtY3AyMTIwX3Jlc2V0KHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spCit7CisJZG9uZ2xlX3QgKnNlbGYgPSAoZG9uZ2xlX3QgKikgdGFzay0+aW5zdGFuY2U7CisJaW50IHJldCA9IDA7CisKKwlzZWxmLT5yZXNldF90YXNrID0gdGFzazsKKworCXN3aXRjaCAodGFzay0+c3RhdGUpIHsKKwljYXNlIElSREFfVEFTS19JTklUOgorICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJtY3AyMTIwX3Jlc2V0IGlyZGFfdGFza19pbml0XG4iKTsKKwkJLyogUmVzZXQgZG9uZ2xlIGJ5IHNldHRpbmcgUlRTKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQxKTsKKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcyg1MCk7CisJCWJyZWFrOworCWNhc2UgSVJEQV9UQVNLX1dBSVQxOgorICAgICAgICAgICAgICAgIC8vcHJpbnRrKCJtY3AyMTIwX3Jlc2V0IGlyZGFfdGFza193YWl0MVxuIik7CisgICAgICAgICAgICAgICAgLyogY2xlYXIgUlRTIGFuZCB3YWl0IGZvciBhdCBsZWFzdCAzMCBtcy4gKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgRkFMU0UpOworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDIpOworCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDUwKTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfV0FJVDI6CisgICAgICAgICAgICAgICAgLy9wcmludGsoIm1jcDIxMjBfcmVzZXQgaXJkYV90YXNrX3dhaXQyXG4iKTsKKwkJLyogR28gYmFjayB0byBub3JtYWwgbW9kZSAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBGQUxTRSk7CisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwkJc2VsZi0+cmVzZXRfdGFzayA9IE5VTEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzKCksIHVua25vd24gc3RhdGUgJWRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHRhc2stPnN0YXRlKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5yZXNldF90YXNrID0gTlVMTDsKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitNT0RVTEVfQVVUSE9SKCJGZWxpeCBUYW5nIDx0YW5nZkBleWV0YXAub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNaWNyb2NoaXAgTUNQMjEyMCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS05Iik7IC8qIElSREFfTUNQMjEyMF9ET05HTEUgKi8KKwkKKy8qCisgKiBGdW5jdGlvbiBpbml0X21vZHVsZSAodm9pZCkKKyAqCisgKiAgICBJbml0aWFsaXplIE1DUDIxMjAgbW9kdWxlCisgKgorICovCittb2R1bGVfaW5pdChtY3AyMTIwX2luaXQpOworCisvKgorICogRnVuY3Rpb24gY2xlYW51cF9tb2R1bGUgKHZvaWQpCisgKgorICogICAgQ2xlYW51cCBNQ1AyMTIwIG1vZHVsZQorICoKKyAqLworbW9kdWxlX2V4aXQobWNwMjEyMF9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvbnNjLWlyY2MuYyBiL2RyaXZlcnMvbmV0L2lyZGEvbnNjLWlyY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDU3MTRlYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvbnNjLWlyY2MuYwpAQCAtMCwwICsxLDIyMjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgbnNjLWlyY2MuYworICogVmVyc2lvbjogICAgICAgMS4wCisgKiBEZXNjcmlwdGlvbjogICBEcml2ZXIgZm9yIHRoZSBOU0MgUEMnMTA4IGFuZCBQQyczMzggSXJEQSBjaGlwc2V0cworICogU3RhdHVzOiAgICAgICAgU3RhYmxlLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgU2F0IE5vdiAgNyAyMTo0MzoxNSAxOTk4CisgKiBNb2RpZmllZCBhdDogICBXZWQgTWFyICAxIDExOjI5OjM0IDIwMDAKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTggTGljaGVuIFdhbmcsIDxsd2FuZ0BhY3Rpc3lzLmNvbT4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTggQWN0aXN5cyBDb3JwLiwgd3d3LmFjdGlzeXMuY29tCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICogICAgIE5vdGljZSB0aGF0IGFsbCBmdW5jdGlvbnMgdGhhdCBuZWVkcyB0byBhY2Nlc3MgdGhlIGNoaXAgaW4gX2FueV8KKyAqICAgICB3YXksIG11c3Qgc2F2ZSBCU1IgcmVnaXN0ZXIgb24gZW50cnksIGFuZCByZXN0b3JlIGl0IG9uIGV4aXQuIAorICogICAgIEl0IGlzIF92ZXJ5XyBpbXBvcnRhbnQgdG8gZm9sbG93IHRoaXMgcG9saWN5IQorICoKKyAqICAgICAgICAgX191OCBiYW5rOworICogICAgIAorICogICAgICAgICBiYW5rID0gaW5iKGlvYmFzZStCU1IpOworICogIAorICogICAgICAgICBkb195b3VyX3N0dWZmX2hlcmUoKTsKKyAqCisgKiAgICAgICAgIG91dGIoYmFuaywgaW9iYXNlK0JTUik7CisgKgorICogICAgSWYgeW91IGZpbmQgYnVncyBpbiB0aGlzIGZpbGUsIGl0cyB2ZXJ5IGxpa2VseSB0aGF0IHRoZSBzYW1lIGJ1ZworICogICAgd2lsbCBhbHNvIGJlIGluIHc4Mzk3N2FmX2lyLmMgc2luY2UgdGhlIGltcGxlbWVudGF0aW9ucyBhcmUgcXVpdGUKKyAqICAgIHNpbWlsYXIuCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSA8bGludXgvcG0uaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL3dyYXBwZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKworI2luY2x1ZGUgIm5zYy1pcmNjLmgiCisKKyNkZWZpbmUgQ0hJUF9JT19FWFRFTlQgOAorI2RlZmluZSBCUk9LRU5fRE9OR0xFX0lECisKK3N0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9ICJuc2MtaXJjYyI7CisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgaW50IHFvc19tdHRfYml0cyA9IDB4MDc7ICAvKiAxIG1zIG9yIG1vcmUgKi8KK3N0YXRpYyBpbnQgZG9uZ2xlX2lkOworCisvKiBVc2UgQklPUyBzZXR0aW9ucyBieSBkZWZhdWx0LCBidXQgdXNlciBtYXkgc3VwcGx5IG1vZHVsZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgdW5zaWduZWQgaW50IGlvW10gID0geyB+MCwgfjAsIH4wLCB+MCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBpcnFbXSA9IHsgMCwgMCwgMCwgMCwgMCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBkbWFbXSA9IHsgMCwgMCwgMCwgMCwgMCB9OworCitzdGF0aWMgaW50IG5zY19pcmNjX3Byb2JlXzEwOChuc2NfY2hpcF90ICpjaGlwLCBjaGlwaW9fdCAqaW5mbyk7CitzdGF0aWMgaW50IG5zY19pcmNjX3Byb2JlXzMzOChuc2NfY2hpcF90ICpjaGlwLCBjaGlwaW9fdCAqaW5mbyk7CitzdGF0aWMgaW50IG5zY19pcmNjX3Byb2JlXzM5eChuc2NfY2hpcF90ICpjaGlwLCBjaGlwaW9fdCAqaW5mbyk7CitzdGF0aWMgaW50IG5zY19pcmNjX2luaXRfMTA4KG5zY19jaGlwX3QgKmNoaXAsIGNoaXBpb190ICppbmZvKTsKK3N0YXRpYyBpbnQgbnNjX2lyY2NfaW5pdF8zMzgobnNjX2NoaXBfdCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pOworc3RhdGljIGludCBuc2NfaXJjY19pbml0XzM5eChuc2NfY2hpcF90ICpjaGlwLCBjaGlwaW9fdCAqaW5mbyk7CisKKy8qIFRoZXNlIGFyZSB0aGUga25vd24gTlNDIGNoaXBzICovCitzdGF0aWMgbnNjX2NoaXBfdCBjaGlwc1tdID0geworLyogIE5hbWUsIHtjZmcgcmVnaXN0ZXJzfSwgY2hpcCBpZCBpbmRleCByZWcsIGNoaXAgaWQgZXhwZWN0ZWQgdmFsdWUsIHJldmlzaW9uIG1hc2sgKi8KKwl7ICJQQzg3MTA4IiwgeyAweDE1MCwgMHgzOTgsIDB4ZWEgfSwgMHgwNSwgMHgxMCwgMHhmMCwgCisJICBuc2NfaXJjY19wcm9iZV8xMDgsIG5zY19pcmNjX2luaXRfMTA4IH0sCisJeyAiUEM4NzMzOCIsIHsgMHgzOTgsIDB4MTVjLCAweDJlIH0sIDB4MDgsIDB4YjAsIDB4ZjgsIAorCSAgbnNjX2lyY2NfcHJvYmVfMzM4LCBuc2NfaXJjY19pbml0XzMzOCB9LAorCS8qIENvbnRyaWJ1dGVkIGJ5IFN0ZWZmZW4gUGluZ2VsIC0gSUJNIFg0MCAqLworCXsgIlBDODczOHgiLCB7IDB4MTY0ZSwgMHg0ZSwgMHgwIH0sIDB4MjAsIDB4ZjQsIDB4ZmYsCisJICBuc2NfaXJjY19wcm9iZV8zOXgsIG5zY19pcmNjX2luaXRfMzl4IH0sCisJLyogQ29udHJpYnV0ZWQgYnkgSmFuIEZyZXkgLSBJQk0gQTMwL0EzMSAqLworCXsgIlBDODczOXgiLCB7IDB4MmUsIDB4NGUsIDB4MCB9LCAweDIwLCAweGVhLCAweGZmLCAKKwkgIG5zY19pcmNjX3Byb2JlXzM5eCwgbnNjX2lyY2NfaW5pdF8zOXggfSwKKwl7IE5VTEwgfQorfTsKKworLyogTWF4IDQgaW5zdGFuY2VzIGZvciBub3cgKi8KK3N0YXRpYyBzdHJ1Y3QgbnNjX2lyY2NfY2IgKmRldl9zZWxmW10gPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKworc3RhdGljIGNoYXIgKmRvbmdsZV90eXBlc1tdID0geworCSJEaWZmZXJlbnRpYWwgc2VyaWFsIGludGVyZmFjZSIsCisJIkRpZmZlcmVudGlhbCBzZXJpYWwgaW50ZXJmYWNlIiwKKwkiUmVzZXJ2ZWQiLAorCSJSZXNlcnZlZCIsCisJIlNoYXJwIFJZNUhEMDEiLAorCSJSZXNlcnZlZCIsCisJIlNpbmdsZS1lbmRlZCBzZXJpYWwgaW50ZXJmYWNlIiwKKwkiQ29uc3VtZXItSVIgb25seSIsCisJIkhQIEhTREwtMjMwMCwgSFAgSFNETC0zNjAwL0hTREwtMzYxMCIsCisJIklCTTMxVDExMDAgb3IgVGVtaWMgVEZEUzYwMDAvVEZEUzY1MDAiLAorCSJSZXNlcnZlZCIsCisJIlJlc2VydmVkIiwKKwkiSFAgSFNETC0xMTAwL0hTREwtMjEwMCIsCisJIkhQIEhTREwtMTEwMC9IU0RMLTIxMDAiLAorCSJTdXBwb3J0cyBTSVIgTW9kZSBvbmx5IiwKKwkiTm8gZG9uZ2xlIGNvbm5lY3RlZCIsCit9OworCisvKiBTb21lIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBpbnQgIG5zY19pcmNjX29wZW4oaW50IGksIGNoaXBpb190ICppbmZvKTsKK3N0YXRpYyBpbnQgIG5zY19pcmNjX2Nsb3NlKHN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgaW50ICBuc2NfaXJjY19zZXR1cChjaGlwaW9fdCAqaW5mbyk7CitzdGF0aWMgdm9pZCBuc2NfaXJjY19waW9fcmVjZWl2ZShzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIGludCAgbnNjX2lyY2NfZG1hX3JlY2VpdmUoc3RydWN0IG5zY19pcmNjX2NiICpzZWxmKTsgCitzdGF0aWMgaW50ICBuc2NfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYsIGludCBpb2Jhc2UpOworc3RhdGljIGludCAgbnNjX2lyY2NfaGFyZF94bWl0X3NpcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIG5zY19pcmNjX2hhcmRfeG1pdF9maXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICBuc2NfaXJjY19waW9fd3JpdGUoaW50IGlvYmFzZSwgX191OCAqYnVmLCBpbnQgbGVuLCBpbnQgZmlmb19zaXplKTsKK3N0YXRpYyB2b2lkIG5zY19pcmNjX2RtYV94bWl0KHN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSk7CitzdGF0aWMgX191OCBuc2NfaXJjY19jaGFuZ2Vfc3BlZWQoc3RydWN0IG5zY19pcmNjX2NiICpzZWxmLCBfX3UzMiBiYXVkKTsKK3N0YXRpYyBpbnQgIG5zY19pcmNjX2lzX3JlY2VpdmluZyhzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIGludCAgbnNjX2lyY2NfcmVhZF9kb25nbGVfaWQgKGludCBpb2Jhc2UpOworc3RhdGljIHZvaWQgbnNjX2lyY2NfaW5pdF9kb25nbGVfaW50ZXJmYWNlIChpbnQgaW9iYXNlLCBpbnQgZG9uZ2xlX2lkKTsKKworc3RhdGljIGludCAgbnNjX2lyY2NfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICBuc2NfaXJjY19uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICBuc2NfaXJjY19uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5zY19pcmNjX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG5zY19pcmNjX3BtcHJvYyhzdHJ1Y3QgcG1fZGV2ICpkZXYsIHBtX3JlcXVlc3RfdCBycXN0LCB2b2lkICpkYXRhKTsKKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX2luaXQgKCkKKyAqCisgKiAgICBJbml0aWFsaXplIGNoaXAuIEp1c3QgdHJ5IHRvIGZpbmQgb3V0IGhvdyBtYW55IGNoaXBzIHdlIGFyZSBkZWFsaW5nIHdpdGgKKyAqICAgIGFuZCB3aGVyZSB0aGV5IGFyZQorICovCitzdGF0aWMgaW50IF9faW5pdCBuc2NfaXJjY19pbml0KHZvaWQpCit7CisJY2hpcGlvX3QgaW5mbzsKKwluc2NfY2hpcF90ICpjaGlwOworCWludCByZXQgPSAtRU5PREVWOworCWludCBjZmdfYmFzZTsKKwlpbnQgY2ZnLCBpZDsKKwlpbnQgcmVnOworCWludCBpID0gMDsKKworCS8qIFByb2JlIGZvciBhbGwgdGhlIE5TQyBjaGlwc2V0cyB3ZSBrbm93IGFib3V0ICovCisJZm9yIChjaGlwPWNoaXBzOyBjaGlwLT5uYW1lIDsgY2hpcCsrKSB7CisJCUlSREFfREVCVUcoMiwgIiVzKCksIFByb2JpbmcgZm9yICVzIC4uLlxuIiwgX19GVU5DVElPTl9fLAorCQkJICAgY2hpcC0+bmFtZSk7CisJCQorCQkvKiBUcnkgYWxsIGNvbmZpZyByZWdpc3RlcnMgZm9yIHRoaXMgY2hpcCAqLworCQlmb3IgKGNmZz0wOyBjZmc8MzsgY2ZnKyspIHsKKwkJCWNmZ19iYXNlID0gY2hpcC0+Y2ZnW2NmZ107CisJCQlpZiAoIWNmZ19iYXNlKQorCQkJCWNvbnRpbnVlOworCQkJCisJCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihjaGlwaW9fdCkpOworCQkJaW5mby5jZmdfYmFzZSA9IGNmZ19iYXNlOworCQkJaW5mby5maXJfYmFzZSA9IGlvW2ldOworCQkJaW5mby5kbWEgPSBkbWFbaV07CisJCQlpbmZvLmlycSA9IGlycVtpXTsKKworCQkJLyogUmVhZCBpbmRleCByZWdpc3RlciAqLworCQkJcmVnID0gaW5iKGNmZ19iYXNlKTsKKwkJCWlmIChyZWcgPT0gMHhmZikgeworCQkJCUlSREFfREVCVUcoMiwgIiVzKCkgbm8gY2hpcCBhdCAweCUwM3hcbiIsIF9fRlVOQ1RJT05fXywgY2ZnX2Jhc2UpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJCisJCQkvKiBSZWFkIGNoaXAgaWRlbnRpZmljYXRpb24gcmVnaXN0ZXIgKi8KKwkJCW91dGIoY2hpcC0+Y2lkX2luZGV4LCBjZmdfYmFzZSk7CisJCQlpZCA9IGluYihjZmdfYmFzZSsxKTsKKwkJCWlmICgoaWQgJiBjaGlwLT5jaWRfbWFzaykgPT0gY2hpcC0+Y2lkX3ZhbHVlKSB7CisJCQkJSVJEQV9ERUJVRygyLCAiJXMoKSBGb3VuZCAlcyBjaGlwLCByZXZpc2lvbj0lZFxuIiwKKwkJCQkJICAgX19GVU5DVElPTl9fLCBjaGlwLT5uYW1lLCBpZCAmIH5jaGlwLT5jaWRfbWFzayk7CisJCQkJLyogCisJCQkJICogSWYgdGhlIHVzZXIgc3VwcGxpZXMgdGhlIGJhc2UgYWRkcmVzcywgdGhlbgorCQkJCSAqIHdlIGluaXQgdGhlIGNoaXAsIGlmIG5vdCB3ZSBwcm9iZSB0aGUgdmFsdWVzCisJCQkJICogc2V0IGJ5IHRoZSBCSU9TCisJCQkJICovCQkJCQorCQkJCWlmIChpb1tpXSA8IDB4MjAwMCkgeworCQkJCQljaGlwLT5pbml0KGNoaXAsICZpbmZvKTsKKwkJCQl9IGVsc2UKKwkJCQkJY2hpcC0+cHJvYmUoY2hpcCwgJmluZm8pOworCisJCQkJaWYgKG5zY19pcmNjX29wZW4oaSwgJmluZm8pID09IDApCisJCQkJCXJldCA9IDA7CisJCQkJaSsrOworCQkJfSBlbHNlIHsKKwkJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBXcm9uZyBjaGlwIGlkPTB4JTAyeFxuIiwgX19GVU5DVElPTl9fLCBpZCk7CisJCQl9CisJCX0gCisJCQorCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19jbGVhbnVwICgpCisgKgorICogICAgQ2xvc2UgYWxsIGNvbmZpZ3VyZWQgY2hpcHMKKyAqCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBuc2NfaXJjY19jbGVhbnVwKHZvaWQpCit7CisJaW50IGk7CisKKwlwbV91bnJlZ2lzdGVyX2FsbChuc2NfaXJjY19wbXByb2MpOworCisJZm9yIChpPTA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKGRldl9zZWxmW2ldKQorCQkJbnNjX2lyY2NfY2xvc2UoZGV2X3NlbGZbaV0pOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX29wZW4gKGlvYmFzZSwgaXJxKQorICoKKyAqICAgIE9wZW4gZHJpdmVyIGluc3RhbmNlCisgKgorICovCitzdGF0aWMgaW50IF9faW5pdCBuc2NfaXJjY19vcGVuKGludCBpLCBjaGlwaW9fdCAqaW5mbykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZjsKKyAgICAgICAgc3RydWN0IHBtX2RldiAqcG1kZXY7CisJdm9pZCAqcmV0OworCWludCBlcnI7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9NRVNTQUdFKCIlcywgRm91bmQgY2hpcCBhdCBiYXNlPTB4JTAzeFxuIiwgZHJpdmVyX25hbWUsCisJCSAgICAgaW5mby0+Y2ZnX2Jhc2UpOworCisJaWYgKChuc2NfaXJjY19zZXR1cChpbmZvKSkgPT0gLTEpCisJCXJldHVybiAtMTsKKworCUlSREFfTUVTU0FHRSgiJXMsIGRyaXZlciBsb2FkZWQgKERhZyBCcmF0dGxpKVxuIiwgZHJpdmVyX25hbWUpOworCisJZGV2ID0gYWxsb2NfaXJkYWRldihzaXplb2Yoc3RydWN0IG5zY19pcmNjX2NiKSk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCUlSREFfRVJST1IoIiVzKCksIGNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgIgorCQkJICAgImNvbnRyb2wgYmxvY2shXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzZWxmID0gZGV2LT5wcml2OworCXNlbGYtPm5ldGRldiA9IGRldjsKKwlzcGluX2xvY2tfaW5pdCgmc2VsZi0+bG9jayk7CisgICAKKwkvKiBOZWVkIHRvIHN0b3JlIHNlbGYgc29tZXdoZXJlICovCisJZGV2X3NlbGZbaV0gPSBzZWxmOworCXNlbGYtPmluZGV4ID0gaTsKKworCS8qIEluaXRpYWxpemUgSU8gKi8KKwlzZWxmLT5pby5jZmdfYmFzZSAgPSBpbmZvLT5jZmdfYmFzZTsKKwlzZWxmLT5pby5maXJfYmFzZSAgPSBpbmZvLT5maXJfYmFzZTsKKyAgICAgICAgc2VsZi0+aW8uaXJxICAgICAgID0gaW5mby0+aXJxOworICAgICAgICBzZWxmLT5pby5maXJfZXh0ICAgPSBDSElQX0lPX0VYVEVOVDsKKyAgICAgICAgc2VsZi0+aW8uZG1hICAgICAgID0gaW5mby0+ZG1hOworICAgICAgICBzZWxmLT5pby5maWZvX3NpemUgPSAzMjsKKwkKKwkvKiBSZXNlcnZlIHRoZSBpb3BvcnRzIHRoYXQgd2UgbmVlZCAqLworCXJldCA9IHJlcXVlc3RfcmVnaW9uKHNlbGYtPmlvLmZpcl9iYXNlLCBzZWxmLT5pby5maXJfZXh0LCBkcml2ZXJfbmFtZSk7CisJaWYgKCFyZXQpIHsKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCBjYW4ndCBnZXQgaW9iYXNlIG9mIDB4JTAzeFxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fLCBzZWxmLT5pby5maXJfYmFzZSk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0MTsKKwl9CisKKwkvKiBJbml0aWFsaXplIFFvUyBmb3IgdGhpcyBkZXZpY2UgKi8KKwlpcmRhX2luaXRfbWF4X3Fvc19jYXBhYmlsaWVzKCZzZWxmLT5xb3MpOworCQorCS8qIFRoZSBvbmx5IHZhbHVlIHdlIG11c3Qgb3ZlcnJpZGUgaXQgdGhlIGJhdWRyYXRlICovCisJc2VsZi0+cW9zLmJhdWRfcmF0ZS5iaXRzID0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHwKKwkJSVJfMTE1MjAwfElSXzU3NjAwMHxJUl8xMTUyMDAwIHwoSVJfNDAwMDAwMCA8PCA4KTsKKwkKKwlzZWxmLT5xb3MubWluX3R1cm5fdGltZS5iaXRzID0gcW9zX210dF9iaXRzOworCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUoJnNlbGYtPnFvcyk7CisJCisJLyogTWF4IERNQSBidWZmZXIgc2l6ZSBuZWVkZWQgPSAoZGF0YV9zaXplICsgNikgKiAod2luZG93X3NpemUpICsgNjsgKi8KKwlzZWxmLT5yeF9idWZmLnRydWVzaXplID0gMTQzODQ7IAorCXNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUgPSAxNDM4NDsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBpZiBuZWVkZWQgKi8KKwlzZWxmLT5yeF9idWZmLmhlYWQgPQorCQlkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSwKKwkJCQkgICAmc2VsZi0+cnhfYnVmZl9kbWEsIEdGUF9LRVJORUwpOworCWlmIChzZWxmLT5yeF9idWZmLmhlYWQgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDI7CisKKwl9CisJbWVtc2V0KHNlbGYtPnJ4X2J1ZmYuaGVhZCwgMCwgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSk7CisJCisJc2VsZi0+dHhfYnVmZi5oZWFkID0KKwkJZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICAgJnNlbGYtPnR4X2J1ZmZfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2VsZi0+dHhfYnVmZi5oZWFkID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQzOworCX0KKwltZW1zZXQoc2VsZi0+dHhfYnVmZi5oZWFkLCAwLCBzZWxmLT50eF9idWZmLnRydWVzaXplKTsKKworCXNlbGYtPnJ4X2J1ZmYuaW5fZnJhbWUgPSBGQUxTRTsKKwlzZWxmLT5yeF9idWZmLnN0YXRlID0gT1VUU0lERV9GUkFNRTsKKwlzZWxmLT50eF9idWZmLmRhdGEgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisJc2VsZi0+cnhfYnVmZi5kYXRhID0gc2VsZi0+cnhfYnVmZi5oZWFkOworCQorCS8qIFJlc2V0IFR4IHF1ZXVlIGluZm8gKi8KKwlzZWxmLT50eF9maWZvLmxlbiA9IHNlbGYtPnR4X2ZpZm8ucHRyID0gc2VsZi0+dHhfZmlmby5mcmVlID0gMDsKKwlzZWxmLT50eF9maWZvLnRhaWwgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisKKwkvKiBPdmVycmlkZSB0aGUgbmV0d29yayBmdW5jdGlvbnMgd2UgbmVlZCB0byB1c2UgKi8KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBuc2NfaXJjY19oYXJkX3htaXRfc2lyOworCWRldi0+b3BlbiAgICAgICAgICAgID0gbnNjX2lyY2NfbmV0X29wZW47CisJZGV2LT5zdG9wICAgICAgICAgICAgPSBuc2NfaXJjY19uZXRfY2xvc2U7CisJZGV2LT5kb19pb2N0bCAgICAgICAgPSBuc2NfaXJjY19uZXRfaW9jdGw7CisJZGV2LT5nZXRfc3RhdHMJICAgICA9IG5zY19pcmNjX25ldF9nZXRfc3RhdHM7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCUlSREFfRVJST1IoIiVzKCksIHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0NDsKKwl9CisJSVJEQV9NRVNTQUdFKCJJckRBOiBSZWdpc3RlcmVkIGRldmljZSAlc1xuIiwgZGV2LT5uYW1lKTsKKworCS8qIENoZWNrIGlmIHVzZXIgaGFzIHN1cHBsaWVkIGEgdmFsaWQgZG9uZ2xlIGlkIG9yIG5vdCAqLworCWlmICgoZG9uZ2xlX2lkIDw9IDApIHx8CisJICAgIChkb25nbGVfaWQgPj0gKHNpemVvZihkb25nbGVfdHlwZXMpIC8gc2l6ZW9mKGRvbmdsZV90eXBlc1swXSkpKSApIHsKKwkJZG9uZ2xlX2lkID0gbnNjX2lyY2NfcmVhZF9kb25nbGVfaWQoc2VsZi0+aW8uZmlyX2Jhc2UpOworCQkKKwkJSVJEQV9NRVNTQUdFKCIlcywgRm91bmQgZG9uZ2xlOiAlc1xuIiwgZHJpdmVyX25hbWUsCisJCQkgICAgIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdKTsKKwl9IGVsc2UgeworCQlJUkRBX01FU1NBR0UoIiVzLCBVc2luZyBkb25nbGU6ICVzXG4iLCBkcml2ZXJfbmFtZSwKKwkJCSAgICAgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0pOworCX0KKwkKKwlzZWxmLT5pby5kb25nbGVfaWQgPSBkb25nbGVfaWQ7CisJbnNjX2lyY2NfaW5pdF9kb25nbGVfaW50ZXJmYWNlKHNlbGYtPmlvLmZpcl9iYXNlLCBkb25nbGVfaWQpOworCisgICAgICAgIHBtZGV2ID0gcG1fcmVnaXN0ZXIoUE1fU1lTX0RFViwgUE1fU1lTX0lSREEsIG5zY19pcmNjX3BtcHJvYyk7CisgICAgICAgIGlmIChwbWRldikKKyAgICAgICAgICAgICAgICBwbWRldi0+ZGF0YSA9IHNlbGY7CisKKwlyZXR1cm4gMDsKKyBvdXQ0OgorCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsCisJCQkgIHNlbGYtPnR4X2J1ZmYuaGVhZCwgc2VsZi0+dHhfYnVmZl9kbWEpOworIG91dDM6CisJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSwKKwkJCSAgc2VsZi0+cnhfYnVmZi5oZWFkLCBzZWxmLT5yeF9idWZmX2RtYSk7Cisgb3V0MjoKKwlyZWxlYXNlX3JlZ2lvbihzZWxmLT5pby5maXJfYmFzZSwgc2VsZi0+aW8uZmlyX2V4dCk7Cisgb3V0MToKKwlmcmVlX25ldGRldihkZXYpOworCWRldl9zZWxmW2ldID0gTlVMTDsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfY2xvc2UgKHNlbGYpCisgKgorICogICAgQ2xvc2UgZHJpdmVyIGluc3RhbmNlCisgKgorICovCitzdGF0aWMgaW50IF9fZXhpdCBuc2NfaXJjY19jbG9zZShzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYpCit7CisJaW50IGlvYmFzZTsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisgICAgICAgIGlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJLyogUmVtb3ZlIG5ldGRldmljZSAqLworCXVucmVnaXN0ZXJfbmV0ZGV2KHNlbGYtPm5ldGRldik7CisKKwkvKiBSZWxlYXNlIHRoZSBQT1JUIHRoYXQgdGhpcyBkcml2ZXIgaXMgdXNpbmcgKi8KKwlJUkRBX0RFQlVHKDQsICIlcygpLCBSZWxlYXNpbmcgUmVnaW9uICUwM3hcbiIsIAorCQkgICBfX0ZVTkNUSU9OX18sIHNlbGYtPmlvLmZpcl9iYXNlKTsKKwlyZWxlYXNlX3JlZ2lvbihzZWxmLT5pby5maXJfYmFzZSwgc2VsZi0+aW8uZmlyX2V4dCk7CisKKwlpZiAoc2VsZi0+dHhfYnVmZi5oZWFkKQorCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT50eF9idWZmLnRydWVzaXplLAorCQkJCSAgc2VsZi0+dHhfYnVmZi5oZWFkLCBzZWxmLT50eF9idWZmX2RtYSk7CisJCisJaWYgKHNlbGYtPnJ4X2J1ZmYuaGVhZCkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSwKKwkJCQkgIHNlbGYtPnJ4X2J1ZmYuaGVhZCwgc2VsZi0+cnhfYnVmZl9kbWEpOworCisJZGV2X3NlbGZbc2VsZi0+aW5kZXhdID0gTlVMTDsKKwlmcmVlX25ldGRldihzZWxmLT5uZXRkZXYpOworCQorCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfaW5pdF8xMDggKGlvYmFzZSwgY2ZnX2Jhc2UsIGlycSwgZG1hKQorICoKKyAqICAgIEluaXRpYWxpemUgdGhlIE5TQyAnMTA4IGNoaXAKKyAqCisgKi8KK3N0YXRpYyBpbnQgbnNjX2lyY2NfaW5pdF8xMDgobnNjX2NoaXBfdCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pCit7CisJaW50IGNmZ19iYXNlID0gaW5mby0+Y2ZnX2Jhc2U7CisJX191OCB0ZW1wPTA7CisKKwlvdXRiKDIsIGNmZ19iYXNlKTsgICAgICAvKiBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgKE1DVEwpICovCisJb3V0YigweDAwLCBjZmdfYmFzZSsxKTsgLyogRGlzYWJsZSBkZXZpY2UgKi8KKwkKKwkvKiBCYXNlIEFkZHJlc3MgYW5kIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyIChCQUlDKSAqLworCW91dGIoQ0ZHXzEwOF9CQUlDLCBjZmdfYmFzZSk7CisJc3dpdGNoIChpbmZvLT5maXJfYmFzZSkgeworCWNhc2UgMHgzZTg6IG91dGIoMHgxNCwgY2ZnX2Jhc2UrMSk7IGJyZWFrOworCWNhc2UgMHgyZTg6IG91dGIoMHgxNSwgY2ZnX2Jhc2UrMSk7IGJyZWFrOworCWNhc2UgMHgzZjg6IG91dGIoMHgxNiwgY2ZnX2Jhc2UrMSk7IGJyZWFrOworCWNhc2UgMHgyZjg6IG91dGIoMHgxNywgY2ZnX2Jhc2UrMSk7IGJyZWFrOworCWRlZmF1bHQ6IElSREFfRVJST1IoIiVzKCksIGludmFsaWQgYmFzZV9hZGRyZXNzIiwgX19GVU5DVElPTl9fKTsKKwl9CisJCisJLyogQ29udHJvbCBTaWduYWwgUm91dGluZyBSZWdpc3RlciAoQ1NSVCkgKi8KKwlzd2l0Y2ggKGluZm8tPmlycSkgeworCWNhc2UgMzogIHRlbXAgPSAweDAxOyBicmVhazsKKwljYXNlIDQ6ICB0ZW1wID0gMHgwMjsgYnJlYWs7CisJY2FzZSA1OiAgdGVtcCA9IDB4MDM7IGJyZWFrOworCWNhc2UgNzogIHRlbXAgPSAweDA0OyBicmVhazsKKwljYXNlIDk6ICB0ZW1wID0gMHgwNTsgYnJlYWs7CisJY2FzZSAxMTogdGVtcCA9IDB4MDY7IGJyZWFrOworCWNhc2UgMTU6IHRlbXAgPSAweDA3OyBicmVhazsKKwlkZWZhdWx0OiBJUkRBX0VSUk9SKCIlcygpLCBpbnZhbGlkIGlycSIsIF9fRlVOQ1RJT05fXyk7CisJfQorCW91dGIoQ0ZHXzEwOF9DU1JULCBjZmdfYmFzZSk7CisJCisJc3dpdGNoIChpbmZvLT5kbWEpIHsJCisJY2FzZSAwOiBvdXRiKDB4MDgrdGVtcCwgY2ZnX2Jhc2UrMSk7IGJyZWFrOworCWNhc2UgMTogb3V0YigweDEwK3RlbXAsIGNmZ19iYXNlKzEpOyBicmVhazsKKwljYXNlIDM6IG91dGIoMHgxOCt0ZW1wLCBjZmdfYmFzZSsxKTsgYnJlYWs7CisJZGVmYXVsdDogSVJEQV9FUlJPUigiJXMoKSwgaW52YWxpZCBkbWEiLCBfX0ZVTkNUSU9OX18pOworCX0KKwkKKwlvdXRiKENGR18xMDhfTUNUTCwgY2ZnX2Jhc2UpOyAgICAgIC8qIE1vZGUgQ29udHJvbCBSZWdpc3RlciAoTUNUTCkgKi8KKwlvdXRiKDB4MDMsIGNmZ19iYXNlKzEpOyAvKiBFbmFibGUgZGV2aWNlICovCisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX3Byb2JlXzEwOCAoY2hpcCwgaW5mbykKKyAqCisgKiAgICAKKyAqCisgKi8KK3N0YXRpYyBpbnQgbnNjX2lyY2NfcHJvYmVfMTA4KG5zY19jaGlwX3QgKmNoaXAsIGNoaXBpb190ICppbmZvKSAKK3sKKwlpbnQgY2ZnX2Jhc2UgPSBpbmZvLT5jZmdfYmFzZTsKKwlpbnQgcmVnOworCisJLyogUmVhZCBhZGRyZXNzIGFuZCBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciAoQkFJQykgKi8KKwlvdXRiKENGR18xMDhfQkFJQywgY2ZnX2Jhc2UpOworCXJlZyA9IGluYihjZmdfYmFzZSsxKTsKKwkKKwlzd2l0Y2ggKHJlZyAmIDB4MDMpIHsKKwljYXNlIDA6CisJCWluZm8tPmZpcl9iYXNlID0gMHgzZTg7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaW5mby0+ZmlyX2Jhc2UgPSAweDJlODsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpbmZvLT5maXJfYmFzZSA9IDB4M2Y4OworCQlicmVhazsKKwljYXNlIDM6CisJCWluZm8tPmZpcl9iYXNlID0gMHgyZjg7CisJCWJyZWFrOworCX0KKwlpbmZvLT5zaXJfYmFzZSA9IGluZm8tPmZpcl9iYXNlOworCUlSREFfREVCVUcoMiwgIiVzKCksIHByb2JpbmcgZmlyX2Jhc2U9MHglMDN4XG4iLCBfX0ZVTkNUSU9OX18sCisJCSAgIGluZm8tPmZpcl9iYXNlKTsKKworCS8qIFJlYWQgY29udHJvbCBzaWduYWxzIHJvdXRpbmcgcmVnaXN0ZXIgKENTUlQpICovCisJb3V0YihDRkdfMTA4X0NTUlQsIGNmZ19iYXNlKTsKKwlyZWcgPSBpbmIoY2ZnX2Jhc2UrMSk7CisKKwlzd2l0Y2ggKHJlZyAmIDB4MDcpIHsKKwljYXNlIDA6CisJCWluZm8tPmlycSA9IC0xOworCQlicmVhazsKKwljYXNlIDE6CisJCWluZm8tPmlycSA9IDM7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaW5mby0+aXJxID0gNDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlpbmZvLT5pcnEgPSA1OworCQlicmVhazsKKwljYXNlIDQ6CisJCWluZm8tPmlycSA9IDc7CisJCWJyZWFrOworCWNhc2UgNToKKwkJaW5mby0+aXJxID0gOTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlpbmZvLT5pcnEgPSAxMTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlpbmZvLT5pcnEgPSAxNTsKKwkJYnJlYWs7CisJfQorCUlSREFfREVCVUcoMiwgIiVzKCksIHByb2JpbmcgaXJxPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGluZm8tPmlycSk7CisKKwkvKiBDdXJyZW50bHkgd2Ugb25seSByZWFkIFJ4IERNQSBidXQgaXQgd2lsbCBhbHNvIGJlIHVzZWQgZm9yIFR4ICovCisJc3dpdGNoICgocmVnID4+IDMpICYgMHgwMykgeworCWNhc2UgMDoKKwkJaW5mby0+ZG1hID0gLTE7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaW5mby0+ZG1hID0gMDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpbmZvLT5kbWEgPSAxOworCQlicmVhazsKKwljYXNlIDM6CisJCWluZm8tPmRtYSA9IDM7CisJCWJyZWFrOworCX0KKwlJUkRBX0RFQlVHKDIsICIlcygpLCBwcm9iaW5nIGRtYT0lZFxuIiwgX19GVU5DVElPTl9fLCBpbmZvLT5kbWEpOworCisJLyogUmVhZCBtb2RlIGNvbnRyb2wgcmVnaXN0ZXIgKE1DVEwpICovCisJb3V0YihDRkdfMTA4X01DVEwsIGNmZ19iYXNlKTsKKwlyZWcgPSBpbmIoY2ZnX2Jhc2UrMSk7CisKKwlpbmZvLT5lbmFibGVkID0gcmVnICYgMHgwMTsKKwlpbmZvLT5zdXNwZW5kZWQgPSAhKChyZWcgPj4gMSkgJiAweDAxKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfaW5pdF8zMzggKGNoaXAsIGluZm8pCisgKgorICogICAgSW5pdGlhbGl6ZSB0aGUgTlNDICczMzggY2hpcC4gUmVtZW1iZXIgdGhhdCB0aGUgODczMzggbmVlZHMgdHdvIAorICogICAgY29uc2VjdXRpdmUgd3JpdGVzIHRvIHRoZSBkYXRhIHJlZ2lzdGVycyB3aGlsZSBDUFUgaW50ZXJydXB0cyBhcmUKKyAqICAgIGRpc2FibGVkLiBUaGUgOTczMzggZG9lcyBub3QgcmVxdWlyZSB0aGlzLCBidXQgc2hvdWxkbid0IGJlIGFueQorICogICAgaGFybSBpZiB3ZSBkbyBpdCBhbnl3YXkuCisgKi8KK3N0YXRpYyBpbnQgbnNjX2lyY2NfaW5pdF8zMzgobnNjX2NoaXBfdCAqY2hpcCwgY2hpcGlvX3QgKmluZm8pIAoreworCS8qIE5vIGluaXQgeWV0ICovCisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19wcm9iZV8zMzggKGNoaXAsIGluZm8pCisgKgorICogICAgCisgKgorICovCitzdGF0aWMgaW50IG5zY19pcmNjX3Byb2JlXzMzOChuc2NfY2hpcF90ICpjaGlwLCBjaGlwaW9fdCAqaW5mbykgCit7CisJaW50IGNmZ19iYXNlID0gaW5mby0+Y2ZnX2Jhc2U7CisJaW50IHJlZywgY29tID0gMDsKKwlpbnQgcG5wOworCisJLyogUmVhZCBmdW50aW9uIGVuYWJsZSByZWdpc3RlciAoRkVSKSAqLworCW91dGIoQ0ZHXzMzOF9GRVIsIGNmZ19iYXNlKTsKKwlyZWcgPSBpbmIoY2ZnX2Jhc2UrMSk7CisKKwlpbmZvLT5lbmFibGVkID0gKHJlZyA+PiAyKSAmIDB4MDE7CisKKwkvKiBDaGVjayBpZiB3ZSBhcmUgaW4gTGVnYWN5IG9yIFBuUCBtb2RlICovCisJb3V0YihDRkdfMzM4X1BOUDAsIGNmZ19iYXNlKTsKKwlyZWcgPSBpbmIoY2ZnX2Jhc2UrMSk7CisJCisJcG5wID0gKHJlZyA+PiAzKSAmIDB4MDE7CisJaWYgKHBucCkgeworCQlJUkRBX0RFQlVHKDIsICIoKSwgQ2hpcCBpcyBpbiBQblAgbW9kZVxuIik7CisJCW91dGIoMHg0NiwgY2ZnX2Jhc2UpOworCQlyZWcgPSAoaW5iKGNmZ19iYXNlKzEpICYgMHhmZSkgPDwgMjsKKworCQlvdXRiKDB4NDcsIGNmZ19iYXNlKTsKKwkJcmVnIHw9ICgoaW5iKGNmZ19iYXNlKzEpICYgMHhmYykgPDwgOCk7CisKKwkJaW5mby0+ZmlyX2Jhc2UgPSByZWc7CisJfSBlbHNlIHsKKwkJLyogUmVhZCBmdW5jdGlvbiBhZGRyZXNzIHJlZ2lzdGVyIChGQVIpICovCisJCW91dGIoQ0ZHXzMzOF9GQVIsIGNmZ19iYXNlKTsKKwkJcmVnID0gaW5iKGNmZ19iYXNlKzEpOworCQkKKwkJc3dpdGNoICgocmVnID4+IDQpICYgMHgwMykgeworCQljYXNlIDA6CisJCQlpbmZvLT5maXJfYmFzZSA9IDB4M2Y4OworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWluZm8tPmZpcl9iYXNlID0gMHgyZjg7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJY29tID0gMzsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQljb20gPSA0OworCQkJYnJlYWs7CisJCX0KKwkJCisJCWlmIChjb20pIHsKKwkJCXN3aXRjaCAoKHJlZyA+PiA2KSAmIDB4MDMpIHsKKwkJCWNhc2UgMDoKKwkJCQlpZiAoY29tID09IDMpCisJCQkJCWluZm8tPmZpcl9iYXNlID0gMHgzZTg7CisJCQkJZWxzZQorCQkJCQlpbmZvLT5maXJfYmFzZSA9IDB4MmU4OworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCWlmIChjb20gPT0gMykKKwkJCQkJaW5mby0+ZmlyX2Jhc2UgPSAweDMzODsKKwkJCQllbHNlCisJCQkJCWluZm8tPmZpcl9iYXNlID0gMHgyMzg7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJaWYgKGNvbSA9PSAzKQorCQkJCQlpbmZvLT5maXJfYmFzZSA9IDB4MmU4OworCQkJCWVsc2UKKwkJCQkJaW5mby0+ZmlyX2Jhc2UgPSAweDJlMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlpZiAoY29tID09IDMpCisJCQkJCWluZm8tPmZpcl9iYXNlID0gMHgyMjA7CisJCQkJZWxzZQorCQkJCQlpbmZvLT5maXJfYmFzZSA9IDB4MjI4OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWluZm8tPnNpcl9iYXNlID0gaW5mby0+ZmlyX2Jhc2U7CisKKwkvKiBSZWFkIFBuUCByZWdpc3RlciAxIChQTlAxKSAqLworCW91dGIoQ0ZHXzMzOF9QTlAxLCBjZmdfYmFzZSk7CisJcmVnID0gaW5iKGNmZ19iYXNlKzEpOworCQorCWluZm8tPmlycSA9IHJlZyA+PiA0OworCQorCS8qIFJlYWQgUG5QIHJlZ2lzdGVyIDMgKFBOUDMpICovCisJb3V0YihDRkdfMzM4X1BOUDMsIGNmZ19iYXNlKTsKKwlyZWcgPSBpbmIoY2ZnX2Jhc2UrMSk7CisKKwlpbmZvLT5kbWEgPSAocmVnICYgMHgwNykgLSAxOworCisJLyogUmVhZCBwb3dlciBhbmQgdGVzdCByZWdpc3RlciAoUFRSKSAqLworCW91dGIoQ0ZHXzMzOF9QVFIsIGNmZ19iYXNlKTsKKwlyZWcgPSBpbmIoY2ZnX2Jhc2UrMSk7CisKKwlpbmZvLT5zdXNwZW5kZWQgPSByZWcgJiAweDAxOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX2luaXRfMzl4IChjaGlwLCBpbmZvKQorICoKKyAqICAgIE5vdyB0aGF0IHdlIGtub3cgaXQncyBhICczOXggKHNlZSBwcm9iZSBiZWxvdyksIHdlIG5lZWQgdG8KKyAqICAgIGNvbmZpZ3VyZSBpdCBzbyB3ZSBjYW4gdXNlIGl0LgorICoKKyAqIFRoZSBOU0MgJzMzOCBjaGlwIGlzIGEgU3VwZXIgSS9PIGNoaXAgd2l0aCBhICJiYW5rIiBhcmNoaXRlY3R1cmUsCisgKiB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgZGlmZmVyZW50IGZ1bmN0aW9uYWxpdHkgKHNlcmlhbCwgcGFyYWxsZWwsCisgKiBmbG9wcHkuLi4pIGFyZSBlYWNoIGluIGEgZGlmZmVyZW50IGJhbmsgKExvZ2ljYWwgRGV2aWNlIE51bWJlcikuCisgKiBUaGUgYmFzZSBhZGRyZXNzLCBpcnEgYW5kIGRtYSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBhcmUgY29tbW9uCisgKiB0byBhbGwgZnVuY3Rpb25hbGl0aWVzIChpbmRleCAweDMwIHRvIDB4N0YpLgorICogVGhlcmUgaXMgb25seSBvbmUgY29uZmlndXJhdGlvbiByZWdpc3RlciBzcGVjaWZpYyB0byB0aGUKKyAqIHNlcmlhbCBwb3J0LCBDRkdfMzlYX1NQQy4KKyAqIEplYW5JSQorICoKKyAqIE5vdGUgOiB0aGlzIGNvZGUgd2FzIHdyaXR0ZW4gYnkgSmFuIEZyZXkgPGphbmZyZXlAd2ViLmRlPgorICovCitzdGF0aWMgaW50IG5zY19pcmNjX2luaXRfMzl4KG5zY19jaGlwX3QgKmNoaXAsIGNoaXBpb190ICppbmZvKSAKK3sKKwlpbnQgY2ZnX2Jhc2UgPSBpbmZvLT5jZmdfYmFzZTsKKwlpbnQgZW5hYmxlZDsKKworCS8qIFVzZXIgaXMgc2h1cmUgYWJvdXQgaGlzIGNvbmZpZy4uLiBhY2NlcHQgaXQuICovCisJSVJEQV9ERUJVRygyLCAiJXMoKTogbnNjX2lyY2NfaW5pdF8zOXggKHVzZXIgc2V0dGluZ3MpOiAiCisJCSAgICJpbz0weCUwNHgsIGlycT0lZCwgZG1hPSVkXG4iLCAKKwkJICAgX19GVU5DVElPTl9fLCBpbmZvLT5maXJfYmFzZSwgaW5mby0+aXJxLCBpbmZvLT5kbWEpOworCisJLyogQWNjZXNzIGJhbmsgZm9yIFNQMiAqLworCW91dGIoQ0ZHXzM5WF9MRE4sIGNmZ19iYXNlKTsKKwlvdXRiKDB4MDIsIGNmZ19iYXNlKzEpOworCisJLyogQ29uZmlndXJlIFNQMiAqLworCisJLyogV2Ugd2FudCB0byBlbmFibGUgdGhlIGRldmljZSBpZiBub3QgZW5hYmxlZCAqLworCW91dGIoQ0ZHXzM5WF9BQ1QsIGNmZ19iYXNlKTsKKwllbmFibGVkID0gaW5iKGNmZ19iYXNlKzEpICYgMHgwMTsKKwkKKwlpZiAoIWVuYWJsZWQpIHsKKwkJLyogRW5hYmxlIHRoZSBkZXZpY2UgKi8KKwkJb3V0YihDRkdfMzlYX1NJT0NGMSwgY2ZnX2Jhc2UpOworCQlvdXRiKDB4MDEsIGNmZ19iYXNlKzEpOworCQkvKiBNYXkgd2FudCB0byB1cGRhdGUgaW5mby0+ZW5hYmxlZC4gSmVhbiBJSSAqLworCX0KKworCS8qIEVuYWJsZSBVQVJUIGJhbmsgc3dpdGNoaW5nIChiaXQgNykgOyBTZXRzIHRoZSBjaGlwIHRvIG5vcm1hbAorCSAqIHBvd2VyIG1vZGUgKHdha2UgdXAgZnJvbSBzbGVlcCBtb2RlKSAoYml0IDEpICovCisJb3V0YihDRkdfMzlYX1NQQywgY2ZnX2Jhc2UpOworCW91dGIoMHg4MiwgY2ZnX2Jhc2UrMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX3Byb2JlXzM5eCAoY2hpcCwgaW5mbykKKyAqCisgKiAgICBUZXN0IGlmIHdlIHJlYWxseSBoYXZlIGEgJzM5eCBjaGlwIGF0IHRoZSBnaXZlbiBhZGRyZXNzCisgKgorICogTm90ZSA6IHRoaXMgY29kZSB3YXMgd3JpdHRlbiBieSBKYW4gRnJleSA8amFuZnJleUB3ZWIuZGU+CisgKi8KK3N0YXRpYyBpbnQgbnNjX2lyY2NfcHJvYmVfMzl4KG5zY19jaGlwX3QgKmNoaXAsIGNoaXBpb190ICppbmZvKSAKK3sKKwlpbnQgY2ZnX2Jhc2UgPSBpbmZvLT5jZmdfYmFzZTsKKwlpbnQgcmVnMSwgcmVnMiwgaXJxLCBpcnF0LCBkbWExLCBkbWEyOworCWludCBlbmFibGVkLCBzdXNwOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgbnNjX2lyY2NfcHJvYmVfMzl4LCBiYXNlPSVkXG4iLAorCQkgICBfX0ZVTkNUSU9OX18sIGNmZ19iYXNlKTsKKworCS8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGV4ZWN1dGVkIHdpdGggaXJxIG9mZiB0byBhdm9pZAorCSAqIGFub3RoZXIgZHJpdmVyIG1lc3Npbmcgd2l0aCB0aGUgU3VwZXIgSS9PIGJhbmsgLSBKZWFuIElJICovCisKKwkvKiBBY2Nlc3MgYmFuayBmb3IgU1AyICovCisJb3V0YihDRkdfMzlYX0xETiwgY2ZnX2Jhc2UpOworCW91dGIoMHgwMiwgY2ZnX2Jhc2UrMSk7CisKKwkvKiBSZWFkIGluZm9zIGFib3V0IFNQMiA7IHN0b3JlIGluIGluZm8gc3RydWN0ICovCisJb3V0YihDRkdfMzlYX0JBU0VILCBjZmdfYmFzZSk7CisJcmVnMSA9IGluYihjZmdfYmFzZSsxKTsKKwlvdXRiKENGR18zOVhfQkFTRUwsIGNmZ19iYXNlKTsKKwlyZWcyID0gaW5iKGNmZ19iYXNlKzEpOworCWluZm8tPmZpcl9iYXNlID0gKHJlZzEgPDwgOCkgfCByZWcyOworCisJb3V0YihDRkdfMzlYX0lSUU5VTSwgY2ZnX2Jhc2UpOworCWlycSA9IGluYihjZmdfYmFzZSsxKTsKKwlvdXRiKENGR18zOVhfSVJRU0VMLCBjZmdfYmFzZSk7CisJaXJxdCA9IGluYihjZmdfYmFzZSsxKTsKKwlpbmZvLT5pcnEgPSBpcnE7CisKKwlvdXRiKENGR18zOVhfRE1BMCwgY2ZnX2Jhc2UpOworCWRtYTEgPSBpbmIoY2ZnX2Jhc2UrMSk7CisJb3V0YihDRkdfMzlYX0RNQTEsIGNmZ19iYXNlKTsKKwlkbWEyID0gaW5iKGNmZ19iYXNlKzEpOworCWluZm8tPmRtYSA9IGRtYTEgLTE7CisKKwlvdXRiKENGR18zOVhfQUNULCBjZmdfYmFzZSk7CisJaW5mby0+ZW5hYmxlZCA9IGVuYWJsZWQgPSBpbmIoY2ZnX2Jhc2UrMSkgJiAweDAxOworCQorCW91dGIoQ0ZHXzM5WF9TUEMsIGNmZ19iYXNlKTsKKwlzdXNwID0gMSAtICgoaW5iKGNmZ19iYXNlKzEpICYgMHgwMikgPj4gMSk7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpOiBpbz0weCUwMnglMDJ4LCBpcnE9JWQgKHR5cGUgJWQpLCByeGRtYT0lZCwgdHhkbWE9JWQsIGVuYWJsZWQ9JWQgKHN1c3BlbmRlZD0lZClcbiIsIF9fRlVOQ1RJT05fXywgcmVnMSxyZWcyLGlycSxpcnF0LGRtYTEsZG1hMixlbmFibGVkLHN1c3ApOworCisJLyogQ29uZmlndXJlIFNQMiAqLworCisJLyogV2Ugd2FudCB0byBlbmFibGUgdGhlIGRldmljZSBpZiBub3QgZW5hYmxlZCAqLworCW91dGIoQ0ZHXzM5WF9BQ1QsIGNmZ19iYXNlKTsKKwllbmFibGVkID0gaW5iKGNmZ19iYXNlKzEpICYgMHgwMTsKKwkKKwlpZiAoIWVuYWJsZWQpIHsKKwkJLyogRW5hYmxlIHRoZSBkZXZpY2UgKi8KKwkJb3V0YihDRkdfMzlYX1NJT0NGMSwgY2ZnX2Jhc2UpOworCQlvdXRiKDB4MDEsIGNmZ19iYXNlKzEpOworCQkvKiBNYXkgd2FudCB0byB1cGRhdGUgaW5mby0+ZW5hYmxlZC4gSmVhbiBJSSAqLworCX0KKworCS8qIEVuYWJsZSBVQVJUIGJhbmsgc3dpdGNoaW5nIChiaXQgNykgOyBTZXRzIHRoZSBjaGlwIHRvIG5vcm1hbAorCSAqIHBvd2VyIG1vZGUgKHdha2UgdXAgZnJvbSBzbGVlcCBtb2RlKSAoYml0IDEpICovCisJb3V0YihDRkdfMzlYX1NQQywgY2ZnX2Jhc2UpOworCW91dGIoMHg4MiwgY2ZnX2Jhc2UrMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX3NldHVwIChpbmZvKQorICoKKyAqICAgIFJldHVybnMgbm9uLW5lZ2F0aXZlIG9uIHN1Y2Nlc3MuCisgKgorICovCitzdGF0aWMgaW50IG5zY19pcmNjX3NldHVwKGNoaXBpb190ICppbmZvKQoreworCWludCB2ZXJzaW9uOworCWludCBpb2Jhc2UgPSBpbmZvLT5maXJfYmFzZTsKKworCS8qIFJlYWQgdGhlIE1vZHVsZSBJRCAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzMpOworCXZlcnNpb24gPSBpbmIoaW9iYXNlK01JRCk7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpIERyaXZlciAlcyBGb3VuZCBjaGlwIHZlcnNpb24gJTAyeFxuIiwKKwkJICAgX19GVU5DVElPTl9fLCBkcml2ZXJfbmFtZSwgdmVyc2lvbik7CisKKwkvKiBTaG91bGQgYmUgMHgyPyAqLworCWlmICgweDIwICE9ICh2ZXJzaW9uICYgMHhmMCkpIHsKKwkJSVJEQV9FUlJPUigiJXMsIFdyb25nIGNoaXAgdmVyc2lvbiAlMDJ4XG4iLAorCQkJICAgZHJpdmVyX25hbWUsIHZlcnNpb24pOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogU3dpdGNoIHRvIGFkdmFuY2VkIG1vZGUgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksyKTsKKwlvdXRiKEVDUjFfRVhUX1NMLCBpb2Jhc2UrRUNSMSk7CisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJCisJLyogU2V0IEZJRk8gdGhyZXNob2xkIHRvIFRYMTcsIFJYMTYsIHJlc2V0IGFuZCBlbmFibGUgRklGTydzICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJb3V0YihGQ1JfUlhUSHxGQ1JfVFhUSHxGQ1JfVFhTUnxGQ1JfUlhTUnxGQ1JfRklGT19FTiwgaW9iYXNlK0ZDUik7CisKKwlvdXRiKDB4MDMsIGlvYmFzZStMQ1IpOyAJLyogOCBiaXQgd29yZCBsZW5ndGggKi8KKwlvdXRiKE1DUl9TSVIsIGlvYmFzZStNQ1IpOyAJLyogU3RhcnQgYXQgU0lSLW1vZGUsIGFsc28gY2xlYXJzIExTUiovCisKKwkvKiBTZXQgRklGTyBzaXplIHRvIDMyICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMik7CisJb3V0YihFWENSMl9SRlNJWnxFWENSMl9URlNJWiwgaW9iYXNlK0VYQ1IyKTsKKworCS8qIElSQ1IyOiBGRU5EX01EIGlzIG5vdCBzZXQgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTks1KTsKKyAJb3V0YigweDAyLCBpb2Jhc2UrNCk7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCBzb21lIGRlZmF1bHRzIGFyZSBPSyAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzYpOworCW91dGIoMHgyMCwgaW9iYXNlKzApOyAvKiBTZXQgMzIgYml0cyBGSVIgQ1JDICovCisJb3V0YigweDBhLCBpb2Jhc2UrMSk7IC8qIFNldCBNSVIgcHVsc2Ugd2lkdGggKi8KKwlvdXRiKDB4MGQsIGlvYmFzZSsyKTsgLyogU2V0IFNJUiBwdWxzZSB3aWR0aCB0byAxLjZ1cyAqLworCW91dGIoMHgyYSwgaW9iYXNlKzQpOyAvKiBTZXQgYmVnaW5uaW5nIGZyYWcsIGFuZCBwcmVhbWJsZSBsZW5ndGggKi8KKworCS8qIEVuYWJsZSByZWNlaXZlIGludGVycnVwdHMgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwlvdXRiKElFUl9SWEhETF9JRSwgaW9iYXNlK0lFUik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX3JlYWRfZG9uZ2xlX2lkICh2b2lkKQorICoKKyAqIFRyeSB0byByZWFkIGRvbmdsZSBpbmRlbnRpZmljYXRpb24uIFRoaXMgcHJvY2VkdXJlIG5lZWRzIHRvIGJlIGV4ZWN1dGVkCisgKiBvbmNlIGFmdGVyIHBvd2VyLW9uL3Jlc2V0LiBJdCBhbHNvIG5lZWRzIHRvIGJlIHVzZWQgd2hlbmV2ZXIgeW91IHN1c3BlY3QKKyAqIHRoYXQgdGhlIHVzZXIgbWF5IGhhdmUgcGx1Z2dlZC91bnBsdWdnZWQgdGhlIElyREEgRG9uZ2xlLgorICovCitzdGF0aWMgaW50IG5zY19pcmNjX3JlYWRfZG9uZ2xlX2lkIChpbnQgaW9iYXNlKQoreworCWludCBkb25nbGVfaWQ7CisJX191OCBiYW5rOworCisJYmFuayA9IGluYihpb2Jhc2UrQlNSKTsKKworCS8qIFNlbGVjdCBCYW5rIDcgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTks3KTsKKwkKKwkvKiBJUkNGRzQ6IElSU0wwX0RTIGFuZCBJUlNMMjFfRFMgYXJlIGNsZWFyZWQgKi8KKwlvdXRiKDB4MDAsIGlvYmFzZSs3KTsKKwkKKwkvKiBJRDAsIDEsIGFuZCAyIGFyZSBwdWxsZWQgdXAvZG93biB2ZXJ5IHNsb3dseSAqLworCXVkZWxheSg1MCk7CisJCisJLyogSVJDRkcxOiByZWFkIHRoZSBJRCBiaXRzICovCisJZG9uZ2xlX2lkID0gaW5iKGlvYmFzZSs0KSAmIDB4MGY7CisKKyNpZmRlZiBCUk9LRU5fRE9OR0xFX0lECisJaWYgKGRvbmdsZV9pZCA9PSAweDBhKQorCQlkb25nbGVfaWQgPSAweDA5OworI2VuZGlmCQorCS8qIEdvIGJhY2sgdG8gIGJhbmsgMCBiZWZvcmUgcmV0dXJuaW5nICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisKKwlvdXRiKGJhbmssIGlvYmFzZStCU1IpOworCisJcmV0dXJuIGRvbmdsZV9pZDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX2luaXRfZG9uZ2xlX2ludGVyZmFjZSAoaW9iYXNlLCBkb25nbGVfaWQpCisgKgorICogICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGRvbmdsZSBmb3IgdGhlIHRyYW5zY2VpdmVyIHRoYXQgaXMKKyAqICAgICB1c2VkLiBUaGlzIHByb2NlZHVyZSBuZWVkcyB0byBiZSBleGVjdXRlZCBvbmNlIGFmdGVyCisgKiAgICAgcG93ZXItb24vcmVzZXQuIEl0IGFsc28gbmVlZHMgdG8gYmUgdXNlZCB3aGVuZXZlciB5b3Ugc3VzcGVjdCB0aGF0CisgKiAgICAgdGhlIGRvbmdsZSBpcyBjaGFuZ2VkLiAKKyAqLworc3RhdGljIHZvaWQgbnNjX2lyY2NfaW5pdF9kb25nbGVfaW50ZXJmYWNlIChpbnQgaW9iYXNlLCBpbnQgZG9uZ2xlX2lkKQoreworCWludCBiYW5rOworCisJLyogU2F2ZSBjdXJyZW50IGJhbmsgKi8KKwliYW5rID0gaW5iKGlvYmFzZStCU1IpOworCisJLyogU2VsZWN0IEJhbmsgNyAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzcpOworCQorCS8qIElSQ0ZHNDogc2V0IGFjY29yZGluZyB0byBkb25nbGVfaWQgKi8KKwlzd2l0Y2ggKGRvbmdsZV9pZCkgeworCWNhc2UgMHgwMDogLyogc2FtZSBhcyAqLworCWNhc2UgMHgwMTogLyogRGlmZmVyZW50aWFsIHNlcmlhbCBpbnRlcmZhY2UgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgJXMgbm90IGRlZmluZWQgYnkgaXJkYSB5ZXRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdKTsgCisJCWJyZWFrOworCWNhc2UgMHgwMjogLyogc2FtZSBhcyAqLworCWNhc2UgMHgwMzogLyogUmVzZXJ2ZWQgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgJXMgbm90IGRlZmluZWQgYnkgaXJkYSB5ZXRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdKTsgCisJCWJyZWFrOworCWNhc2UgMHgwNDogLyogU2hhcnAgUlk1SEQwMSAqLworCQlicmVhazsKKwljYXNlIDB4MDU6IC8qIFJlc2VydmVkLCBidXQgdGhpcyBpcyB3aGF0IHRoZSBUaGlua3BhZCByZXBvcnRzICovCisJCUlSREFfREVCVUcoMCwgIiVzKCksICVzIG5vdCBkZWZpbmVkIGJ5IGlyZGEgeWV0XG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBkb25nbGVfdHlwZXNbZG9uZ2xlX2lkXSk7IAorCQlicmVhazsKKwljYXNlIDB4MDY6IC8qIFNpbmdsZS1lbmRlZCBzZXJpYWwgaW50ZXJmYWNlICovCisJCUlSREFfREVCVUcoMCwgIiVzKCksICVzIG5vdCBkZWZpbmVkIGJ5IGlyZGEgeWV0XG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBkb25nbGVfdHlwZXNbZG9uZ2xlX2lkXSk7IAorCQlicmVhazsKKwljYXNlIDB4MDc6IC8qIENvbnN1bWVyLUlSIG9ubHkgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgJXMgaXMgbm90IGZvciBJckRBIG1vZGVcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdKTsgCisJCWJyZWFrOworCWNhc2UgMHgwODogLyogSFAgSFNETC0yMzAwLCBIUCBIU0RMLTM2MDAvSFNETC0zNjEwICovCisJCUlSREFfREVCVUcoMCwgIiVzKCksICVzXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBkb25nbGVfdHlwZXNbZG9uZ2xlX2lkXSk7CisJCWJyZWFrOworCWNhc2UgMHgwOTogLyogSUJNMzFUMTEwMCBvciBUZW1pYyBURkRTNjAwMC9URkRTNjUwMCAqLworCQlvdXRiKDB4MjgsIGlvYmFzZSs3KTsgLyogU2V0IGlyc2xbMC0yXSBhcyBvdXRwdXQgKi8KKwkJYnJlYWs7CisJY2FzZSAweDBBOiAvKiBzYW1lIGFzICovCisJY2FzZSAweDBCOiAvKiBSZXNlcnZlZCAqLworCQlJUkRBX0RFQlVHKDAsICIlcygpLCAlcyBub3QgZGVmaW5lZCBieSBpcmRhIHlldFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0pOyAKKwkJYnJlYWs7CisJY2FzZSAweDBDOiAvKiBzYW1lIGFzICovCisJY2FzZSAweDBEOiAvKiBIUCBIU0RMLTExMDAvSFNETC0yMTAwICovCisJCS8qIAorCQkgKiBTZXQgaXJzbDAgYXMgaW5wdXQsIGlyc2xbMS0yXSBhcyBvdXRwdXQsIGFuZCBzZXBhcmF0ZSAKKwkJICogaW5wdXRzIGFyZSB1c2VkIGZvciBTSVIgYW5kIE1JUi9GSVIgCisJCSAqLworCQlvdXRiKDB4NDgsIGlvYmFzZSs3KTsgCisJCWJyZWFrOworCWNhc2UgMHgwRTogLyogU3VwcG9ydHMgU0lSIE1vZGUgb25seSAqLworCQlvdXRiKDB4MjgsIGlvYmFzZSs3KTsgLyogU2V0IGlyc2xbMC0yXSBhcyBvdXRwdXQgKi8KKwkJYnJlYWs7CisJY2FzZSAweDBGOiAvKiBObyBkb25nbGUgY29ubmVjdGVkICovCisJCUlSREFfREVCVUcoMCwgIiVzKCksICVzXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBkb25nbGVfdHlwZXNbZG9uZ2xlX2lkXSk7IAorCisJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCQlvdXRiKDB4NjIsIGlvYmFzZStNQ1IpOworCQlicmVhazsKKwlkZWZhdWx0OiAKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgaW52YWxpZCBkb25nbGVfaWQgJSN4IiwgCisJCQkgICBfX0ZVTkNUSU9OX18sIGRvbmdsZV9pZCk7CisJfQorCQorCS8qIElSQ0ZHMTogSVJTTDEgYW5kIDIgYXJlIHNldCB0byBJckRBIG1vZGUgKi8KKwlvdXRiKDB4MDAsIGlvYmFzZSs0KTsKKworCS8qIFJlc3RvcmUgYmFuayByZWdpc3RlciAqLworCW91dGIoYmFuaywgaW9iYXNlK0JTUik7CisJCit9IC8qIHNldF91cF9kb25nbGVfaW50ZXJmYWNlICovCisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19jaGFuZ2VfZG9uZ2xlX3NwZWVkIChpb2Jhc2UsIHNwZWVkLCBkb25nbGVfaWQpCisgKgorICogICAgQ2hhbmdlIHNwZWVkIG9mIHRoZSBhdHRhY2ggZG9uZ2xlCisgKgorICovCitzdGF0aWMgdm9pZCBuc2NfaXJjY19jaGFuZ2VfZG9uZ2xlX3NwZWVkKGludCBpb2Jhc2UsIGludCBzcGVlZCwgaW50IGRvbmdsZV9pZCkKK3sKKwlfX3U4IGJhbms7CisKKwkvKiBTYXZlIGN1cnJlbnQgYmFuayAqLworCWJhbmsgPSBpbmIoaW9iYXNlK0JTUik7CisKKwkvKiBTZWxlY3QgQmFuayA3ICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LNyk7CisJCisJLyogSVJDRkcxOiBzZXQgYWNjb3JkaW5nIHRvIGRvbmdsZV9pZCAqLworCXN3aXRjaCAoZG9uZ2xlX2lkKSB7CisJY2FzZSAweDAwOiAvKiBzYW1lIGFzICovCisJY2FzZSAweDAxOiAvKiBEaWZmZXJlbnRpYWwgc2VyaWFsIGludGVyZmFjZSAqLworCQlJUkRBX0RFQlVHKDAsICIlcygpLCAlcyBub3QgZGVmaW5lZCBieSBpcmRhIHlldFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0pOyAKKwkJYnJlYWs7CisJY2FzZSAweDAyOiAvKiBzYW1lIGFzICovCisJY2FzZSAweDAzOiAvKiBSZXNlcnZlZCAqLworCQlJUkRBX0RFQlVHKDAsICIlcygpLCAlcyBub3QgZGVmaW5lZCBieSBpcmRhIHlldFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0pOyAKKwkJYnJlYWs7CisJY2FzZSAweDA0OiAvKiBTaGFycCBSWTVIRDAxICovCisJCWJyZWFrOworCWNhc2UgMHgwNTogLyogUmVzZXJ2ZWQgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgJXMgbm90IGRlZmluZWQgYnkgaXJkYSB5ZXRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdKTsgCisJCWJyZWFrOworCWNhc2UgMHgwNjogLyogU2luZ2xlLWVuZGVkIHNlcmlhbCBpbnRlcmZhY2UgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgJXMgbm90IGRlZmluZWQgYnkgaXJkYSB5ZXRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdKTsgCisJCWJyZWFrOworCWNhc2UgMHgwNzogLyogQ29uc3VtZXItSVIgb25seSAqLworCQlJUkRBX0RFQlVHKDAsICIlcygpLCAlcyBpcyBub3QgZm9yIElyREEgbW9kZVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgZG9uZ2xlX3R5cGVzW2RvbmdsZV9pZF0pOyAKKwkJYnJlYWs7CisJY2FzZSAweDA4OiAvKiBIUCBIU0RMLTIzMDAsIEhQIEhTREwtMzYwMC9IU0RMLTM2MTAgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgJXNcbiIsIAorCQkJICAgX19GVU5DVElPTl9fLCBkb25nbGVfdHlwZXNbZG9uZ2xlX2lkXSk7IAorCQlvdXRiKDB4MDAsIGlvYmFzZSs0KTsKKwkJaWYgKHNwZWVkID4gMTE1MjAwKQorCQkJb3V0YigweDAxLCBpb2Jhc2UrNCk7CisJCWJyZWFrOworCWNhc2UgMHgwOTogLyogSUJNMzFUMTEwMCBvciBUZW1pYyBURkRTNjAwMC9URkRTNjUwMCAqLworCQlvdXRiKDB4MDEsIGlvYmFzZSs0KTsKKworCQlpZiAoc3BlZWQgPT0gNDAwMDAwMCkgeworCQkJLyogVGhlcmUgd2FzIGEgY2xpKCkgdGhlcmUsIGJ1dCB3ZSBub3cgYXJlIGFscmVhZHkKKwkJCSAqIHVuZGVyIHNwaW5fbG9ja19pcnFzYXZlKCkgLSBKZWFuSUkgKi8KKwkJCW91dGIoMHg4MSwgaW9iYXNlKzQpOworCQkJb3V0YigweDgwLCBpb2Jhc2UrNCk7CisJCX0gZWxzZQorCQkJb3V0YigweDAwLCBpb2Jhc2UrNCk7CisJCWJyZWFrOworCWNhc2UgMHgwQTogLyogc2FtZSBhcyAqLworCWNhc2UgMHgwQjogLyogUmVzZXJ2ZWQgKi8KKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgJXMgbm90IGRlZmluZWQgYnkgaXJkYSB5ZXRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGRvbmdsZV90eXBlc1tkb25nbGVfaWRdKTsgCisJCWJyZWFrOworCWNhc2UgMHgwQzogLyogc2FtZSBhcyAqLworCWNhc2UgMHgwRDogLyogSFAgSFNETC0xMTAwL0hTREwtMjEwMCAqLworCQlicmVhazsKKwljYXNlIDB4MEU6IC8qIFN1cHBvcnRzIFNJUiBNb2RlIG9ubHkgKi8KKwkJYnJlYWs7CisJY2FzZSAweDBGOiAvKiBObyBkb25nbGUgY29ubmVjdGVkICovCisJCUlSREFfREVCVUcoMCwgIiVzKCksICVzIGlzIG5vdCBmb3IgSXJEQSBtb2RlXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBkb25nbGVfdHlwZXNbZG9uZ2xlX2lkXSk7CisKKwkJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7IAorCQlvdXRiKDB4NjIsIGlvYmFzZStNQ1IpOworCQlicmVhazsKKwlkZWZhdWx0OiAKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgaW52YWxpZCBkYXRhX3JhdGVcbiIsIF9fRlVOQ1RJT05fXyk7CisJfQorCS8qIFJlc3RvcmUgYmFuayByZWdpc3RlciAqLworCW91dGIoYmFuaywgaW9iYXNlK0JTUik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19jaGFuZ2Vfc3BlZWQgKHNlbGYsIGJhdWQpCisgKgorICogICAgQ2hhbmdlIHRoZSBzcGVlZCBvZiB0aGUgZGV2aWNlCisgKgorICogVGhpcyBmdW5jdGlvbiAqbXVzdCogYmUgY2FsbGVkIHdpdGggaXJxIG9mZiBhbmQgc3Bpbi1sb2NrLgorICovCitzdGF0aWMgX191OCBuc2NfaXJjY19jaGFuZ2Vfc3BlZWQoc3RydWN0IG5zY19pcmNjX2NiICpzZWxmLCBfX3UzMiBzcGVlZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2VsZi0+bmV0ZGV2OworCV9fdTggbWNyID0gTUNSX1NJUjsKKwlpbnQgaW9iYXNlOyAKKwlfX3U4IGJhbms7CisJX191OCBpZXI7ICAgICAgICAgICAgICAgICAgLyogSW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgc3BlZWQ9JWRcbiIsIF9fRlVOQ1RJT05fXywgc3BlZWQpOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gMDspOworCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwkvKiBVcGRhdGUgYWNjb3VudGluZyBmb3IgbmV3IHNwZWVkICovCisJc2VsZi0+aW8uc3BlZWQgPSBzcGVlZDsKKworCS8qIFNhdmUgY3VycmVudCBiYW5rICovCisJYmFuayA9IGluYihpb2Jhc2UrQlNSKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCW91dGIoMCwgaW9iYXNlK0lFUik7CisKKwkvKiBTZWxlY3QgQmFuayAyICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMik7CisKKwlvdXRiKDB4MDAsIGlvYmFzZStCR0RIKTsKKwlzd2l0Y2ggKHNwZWVkKSB7CisJY2FzZSA5NjAwOiAgIG91dGIoMHgwYywgaW9iYXNlK0JHREwpOyBicmVhazsKKwljYXNlIDE5MjAwOiAgb3V0YigweDA2LCBpb2Jhc2UrQkdETCk7IGJyZWFrOworCWNhc2UgMzg0MDA6ICBvdXRiKDB4MDMsIGlvYmFzZStCR0RMKTsgYnJlYWs7CisJY2FzZSA1NzYwMDogIG91dGIoMHgwMiwgaW9iYXNlK0JHREwpOyBicmVhazsKKwljYXNlIDExNTIwMDogb3V0YigweDAxLCBpb2Jhc2UrQkdETCk7IGJyZWFrOworCWNhc2UgNTc2MDAwOgorCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTks1KTsKKwkJCisJCS8qIElSQ1IyOiBNRFJTIGlzIHNldCAqLworCQlvdXRiKGluYihpb2Jhc2UrNCkgfCAweDA0LCBpb2Jhc2UrNCk7CisJICAgICAgIAorCQltY3IgPSBNQ1JfTUlSOworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBoYW5kbGluZyBiYXVkIG9mIDU3NjAwMFxuIiwgX19GVU5DVElPTl9fKTsKKwkJYnJlYWs7CisJY2FzZSAxMTUyMDAwOgorCQltY3IgPSBNQ1JfTUlSOworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBoYW5kbGluZyBiYXVkIG9mIDExNTIwMDBcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWJyZWFrOworCWNhc2UgNDAwMDAwMDoKKwkJbWNyID0gTUNSX0ZJUjsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgaGFuZGxpbmcgYmF1ZCBvZiA0MDAwMDAwXG4iLCBfX0ZVTkNUSU9OX18pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltY3IgPSBNQ1JfRklSOworCQlJUkRBX0RFQlVHKDAsICIlcygpLCB1bmtub3duIGJhdWQgcmF0ZSBvZiAlZFxuIiwgCisJCQkgICBfX0ZVTkNUSU9OX18sIHNwZWVkKTsKKwkJYnJlYWs7CisJfQorCisJLyogU2V0IGFwcHJvcHJpYXRlIHNwZWVkIG1vZGUgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwlvdXRiKG1jciB8IE1DUl9UWF9ERlIsIGlvYmFzZStNQ1IpOworCisJLyogR2l2ZSBzb21lIGhpdHMgdG8gdGhlIHRyYW5zY2VpdmVyICovCisJbnNjX2lyY2NfY2hhbmdlX2RvbmdsZV9zcGVlZChpb2Jhc2UsIHNwZWVkLCBzZWxmLT5pby5kb25nbGVfaWQpOworCisJLyogU2V0IEZJRk8gdGhyZXNob2xkIHRvIFRYMTcsIFJYMTYgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwlvdXRiKDB4MDAsIGlvYmFzZStGQ1IpOworCW91dGIoRkNSX0ZJRk9fRU4sIGlvYmFzZStGQ1IpOworCW91dGIoRkNSX1JYVEh8ICAgICAvKiBTZXQgUnggRklGTyB0aHJlc2hvbGQgKi8KKwkgICAgIEZDUl9UWFRIfCAgICAgLyogU2V0IFR4IEZJRk8gdGhyZXNob2xkICovCisJICAgICBGQ1JfVFhTUnwgICAgIC8qIFJlc2V0IFR4IEZJRk8gKi8KKwkgICAgIEZDUl9SWFNSfCAgICAgLyogUmVzZXQgUnggRklGTyAqLworCSAgICAgRkNSX0ZJRk9fRU4sICAvKiBFbmFibGUgRklGT3MgKi8KKwkgICAgIGlvYmFzZStGQ1IpOworCQorCS8qIFNldCBGSUZPIHNpemUgdG8gMzIgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksyKTsKKwlvdXRiKEVYQ1IyX1JGU0lafEVYQ1IyX1RGU0laLCBpb2Jhc2UrRVhDUjIpOworCQorCS8qIEVuYWJsZSBzb21lIGludGVycnVwdHMgc28gd2UgY2FuIHJlY2VpdmUgZnJhbWVzICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7IAorCWlmIChzcGVlZCA+IDExNTIwMCkgeworCQkvKiBJbnN0YWxsIEZJUiB4bWl0IGhhbmRsZXIgKi8KKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBuc2NfaXJjY19oYXJkX3htaXRfZmlyOworCQlpZXIgPSBJRVJfU0ZJRl9JRTsKKwkJbnNjX2lyY2NfZG1hX3JlY2VpdmUoc2VsZik7CisJfSBlbHNlIHsKKwkJLyogSW5zdGFsbCBTSVIgeG1pdCBoYW5kbGVyICovCisJCWRldi0+aGFyZF9zdGFydF94bWl0ID0gbnNjX2lyY2NfaGFyZF94bWl0X3NpcjsKKwkJaWVyID0gSUVSX1JYSERMX0lFOworCX0KKwkvKiBTZXQgb3VyIGN1cnJlbnQgaW50ZXJydXB0IG1hc2sgKi8KKwlvdXRiKGllciwgaW9iYXNlK0lFUik7CisgICAgCQorCS8qIFJlc3RvcmUgQlNSICovCisJb3V0YihiYW5rLCBpb2Jhc2UrQlNSKTsKKworCS8qIE1ha2Ugc3VyZSBpbnRlcnJ1cHQgaGFuZGxlcnMga2VlcCB0aGUgcHJvcGVyIGludGVycnVwdCBtYXNrICovCisJcmV0dXJuKGllcik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19oYXJkX3htaXQgKHNrYiwgZGV2KQorICoKKyAqICAgIFRyYW5zbWl0IHRoZSBmcmFtZSEKKyAqCisgKi8KK3N0YXRpYyBpbnQgbnNjX2lyY2NfaGFyZF94bWl0X3NpcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpb2Jhc2U7CisJX19zMzIgc3BlZWQ7CisJX191OCBiYW5rOworCQorCXNlbGYgPSAoc3RydWN0IG5zY19pcmNjX2NiICopIGRldi0+cHJpdjsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkKKwkvKiBNYWtlIHN1cmUgdGVzdHMgKiYgc3BlZWQgY2hhbmdlIGFyZSBhdG9taWMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCQorCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBzcGVlZCAqLworCXNwZWVkID0gaXJkYV9nZXRfbmV4dF9zcGVlZChza2IpOworCWlmICgoc3BlZWQgIT0gc2VsZi0+aW8uc3BlZWQpICYmIChzcGVlZCAhPSAtMSkpIHsKKwkJLyogQ2hlY2sgZm9yIGVtcHR5IGZyYW1lLiAqLworCQlpZiAoIXNrYi0+bGVuKSB7CisJCQkvKiBJZiB3ZSBqdXN0IHNlbnQgYSBmcmFtZSwgd2UgZ2V0IGNhbGxlZCBiZWZvcmUKKwkJCSAqIHRoZSBsYXN0IGJ5dGVzIGdldCBvdXQgKGJlY2F1c2Ugb2YgdGhlIFNJUiBGSUZPKS4KKwkJCSAqIElmIHRoaXMgaXMgdGhlIGNhc2UsIGxldCBpbnRlcnJ1cHQgaGFuZGxlciBjaGFuZ2UKKwkJCSAqIHRoZSBzcGVlZCBpdHNlbGYuLi4gSmVhbiBJSSAqLworCQkJaWYgKHNlbGYtPmlvLmRpcmVjdGlvbiA9PSBJT19SRUNWKSB7CisJCQkJbnNjX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIHNwZWVkKTsgCisJCQkJLyogVE9ETyA6IEZvciBTSVItPlNJUiwgdGhlIG5leHQgcGFja2V0CisJCQkJICogbWF5IGdldCBjb3JydXB0ZWQgLSBKZWFuIElJICovCisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJfSBlbHNlIHsKKwkJCQlzZWxmLT5uZXdfc3BlZWQgPSBzcGVlZDsKKwkJCQkvKiBRdWV1ZSB3aWxsIGJlIHJlc3RhcnRlZCBhZnRlciBzcGVlZCBjaGFuZ2UKKwkJCQkgKiB0byBtYWtlIHN1cmUgcGFja2V0cyBnZXRzIHRocm91Z2ggdGhlCisJCQkJICogcHJvcGVyIHhtaXQgaGFuZGxlciAtIEplYW4gSUkgKi8KKwkJCX0KKwkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZQorCQkJc2VsZi0+bmV3X3NwZWVkID0gc3BlZWQ7CisJfQorCisJLyogU2F2ZSBjdXJyZW50IGJhbmsgKi8KKwliYW5rID0gaW5iKGlvYmFzZStCU1IpOworCQorCXNlbGYtPnR4X2J1ZmYuZGF0YSA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKKwkKKwlzZWxmLT50eF9idWZmLmxlbiA9IGFzeW5jX3dyYXBfc2tiKHNrYiwgc2VsZi0+dHhfYnVmZi5kYXRhLCAKKwkJCQkJICAgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSk7CisKKwlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBzZWxmLT50eF9idWZmLmxlbjsKKwkKKwkvKiBBZGQgaW50ZXJydXB0IG9uIHR4IGxvdyBsZXZlbCAod2lsbCBmaXJlIGltbWVkaWF0ZWx5KSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCW91dGIoSUVSX1RYTERMX0lFLCBpb2Jhc2UrSUVSKTsKKwkKKwkvKiBSZXN0b3JlIGJhbmsgcmVnaXN0ZXIgKi8KKwlvdXRiKGJhbmssIGlvYmFzZStCU1IpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnNjX2lyY2NfaGFyZF94bWl0X2ZpcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpb2Jhc2U7CisJX19zMzIgc3BlZWQ7CisJX191OCBiYW5rOworCWludCBtdHQsIGRpZmY7CisJCisJc2VsZiA9IChzdHJ1Y3QgbnNjX2lyY2NfY2IgKikgZGV2LT5wcml2OworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCS8qIE1ha2Ugc3VyZSB0ZXN0cyAqJiBzcGVlZCBjaGFuZ2UgYXJlIGF0b21pYyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgc3BlZWQgKi8KKwlzcGVlZCA9IGlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKKwlpZiAoKHNwZWVkICE9IHNlbGYtPmlvLnNwZWVkKSAmJiAoc3BlZWQgIT0gLTEpKSB7CisJCS8qIENoZWNrIGZvciBlbXB0eSBmcmFtZS4gKi8KKwkJaWYgKCFza2ItPmxlbikgeworCQkJLyogSWYgd2UgYXJlIGN1cnJlbnRseSB0cmFuc21pdHRpbmcsIGRlZmVyIHRvCisJCQkgKiBpbnRlcnJ1cHQgaGFuZGxlci4gLSBKZWFuIElJICovCisJCQlpZihzZWxmLT50eF9maWZvLmxlbiA9PSAwKSB7CisJCQkJbnNjX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIHNwZWVkKTsgCisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJfSBlbHNlIHsKKwkJCQlzZWxmLT5uZXdfc3BlZWQgPSBzcGVlZDsKKwkJCQkvKiBLZWVwIHF1ZXVlIHN0b3BwZWQgOgorCQkJCSAqIHRoZSBzcGVlZCBjaGFuZ2Ugb3BlcmF0aW9uIG1heSBjaGFuZ2UgdGhlCisJCQkJICogeG1pdCBoYW5kbGVyLCBhbmQgd2Ugd2FudCB0byBtYWtlIHN1cmUKKwkJCQkgKiB0aGUgbmV4dCBwYWNrZXQgZ2V0IHRocm91Z2ggdGhlIHByb3BlcgorCQkJCSAqIFR4IHBhdGgsIHNvIGJsb2NrIHRoZSBUeCBxdWV1ZSB1bnRpbAorCQkJCSAqIHRoZSBzcGVlZCBjaGFuZ2UgaGFzIGJlZW4gZG9uZS4KKwkJCQkgKiBKZWFuIElJICovCisJCQl9CisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJLyogQ2hhbmdlIHNwZWVkIGFmdGVyIGN1cnJlbnQgZnJhbWUgKi8KKwkJCXNlbGYtPm5ld19zcGVlZCA9IHNwZWVkOworCQl9CisJfQorCisJLyogU2F2ZSBjdXJyZW50IGJhbmsgKi8KKwliYW5rID0gaW5iKGlvYmFzZStCU1IpOworCisJLyogUmVnaXN0ZXIgYW5kIGNvcHkgdGhpcyBmcmFtZSB0byBETUEgbWVtb3J5ICovCisJc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLmZyZWVdLnN0YXJ0ID0gc2VsZi0+dHhfZmlmby50YWlsOworCXNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5mcmVlXS5sZW4gPSBza2ItPmxlbjsKKwlzZWxmLT50eF9maWZvLnRhaWwgKz0gc2tiLT5sZW47CisKKwlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCW1lbWNweShzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8uZnJlZV0uc3RhcnQsIHNrYi0+ZGF0YSwgCisJICAgICAgIHNrYi0+bGVuKTsKKwkKKwlzZWxmLT50eF9maWZvLmxlbisrOworCXNlbGYtPnR4X2ZpZm8uZnJlZSsrOworCisJLyogU3RhcnQgdHJhbnNtaXQgb25seSBpZiB0aGVyZSBpcyBjdXJyZW50bHkgbm8gdHJhbnNtaXQgZ29pbmcgb24gKi8KKwlpZiAoc2VsZi0+dHhfZmlmby5sZW4gPT0gMSkgeworCQkvKiBDaGVjayBpZiB3ZSBtdXN0IHdhaXQgdGhlIG1pbiB0dXJuIHRpbWUgb3Igbm90ICovCisJCW10dCA9IGlyZGFfZ2V0X210dChza2IpOworCQlpZiAobXR0KSB7CisJCQkvKiBDaGVjayBob3cgbXVjaCB0aW1lIHdlIGhhdmUgdXNlZCBhbHJlYWR5ICovCisJCQlkb19nZXR0aW1lb2ZkYXkoJnNlbGYtPm5vdyk7CisJCQlkaWZmID0gc2VsZi0+bm93LnR2X3VzZWMgLSBzZWxmLT5zdGFtcC50dl91c2VjOworCQkJaWYgKGRpZmYgPCAwKSAKKwkJCQlkaWZmICs9IDEwMDAwMDA7CisJCQkKKwkJCS8qIENoZWNrIGlmIHRoZSBtdHQgaXMgbGFyZ2VyIHRoYW4gdGhlIHRpbWUgd2UgaGF2ZQorCQkJICogYWxyZWFkeSB1c2VkIGJ5IGFsbCB0aGUgcHJvdG9jb2wgcHJvY2Vzc2luZworCQkJICovCisJCQlpZiAobXR0ID4gZGlmZikgeworCQkJCW10dCAtPSBkaWZmOworCisJCQkJLyogCisJCQkJICogVXNlIHRpbWVyIGlmIGRlbGF5IGxhcmdlciB0aGFuIDEyNSB1cywgYW5kCisJCQkJICogdXNlIHVkZWxheSBmb3Igc21hbGxlciB2YWx1ZXMgd2hpY2ggc2hvdWxkCisJCQkJICogYmUgYWNjZXB0YWJsZQorCQkJCSAqLworCQkJCWlmIChtdHQgPiAxMjUpIHsKKwkJCQkJLyogQWRqdXN0IGZvciB0aW1lciByZXNvbHV0aW9uICovCisJCQkJCW10dCA9IG10dCAvIDEyNTsKKwkJCQkJCisJCQkJCS8qIFNldHVwIHRpbWVyICovCisJCQkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzQpOworCQkJCQlvdXRiKG10dCAmIDB4ZmYsIGlvYmFzZStUTVJMKTsKKwkJCQkJb3V0YigobXR0ID4+IDgpICYgMHgwZiwgaW9iYXNlK1RNUkgpOworCQkJCQkKKwkJCQkJLyogU3RhcnQgdGltZXIgKi8KKwkJCQkJb3V0YihJUkNSMV9UTVJfRU4sIGlvYmFzZStJUkNSMSk7CisJCQkJCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1hNSVQ7CisJCQkJCQorCQkJCQkvKiBFbmFibGUgdGltZXIgaW50ZXJydXB0ICovCisJCQkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCQkJCQlvdXRiKElFUl9UTVJfSUUsIGlvYmFzZStJRVIpOworCQkJCQkKKwkJCQkJLyogVGltZXIgd2lsbCB0YWtlIGNhcmUgb2YgdGhlIHJlc3QgKi8KKwkJCQkJZ290byBvdXQ7IAorCQkJCX0gZWxzZQorCQkJCQl1ZGVsYXkobXR0KTsKKwkJCX0KKwkJfQkJCisJCS8qIEVuYWJsZSBETUEgaW50ZXJydXB0ICovCisJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCQlvdXRiKElFUl9ETUFfSUUsIGlvYmFzZStJRVIpOworCisJCS8qIFRyYW5zbWl0IGZyYW1lICovCisJCW5zY19pcmNjX2RtYV94bWl0KHNlbGYsIGlvYmFzZSk7CisJfQorIG91dDoKKwkvKiBOb3QgYnVzeSB0cmFuc21pdHRpbmcgYW55bW9yZSBpZiB3aW5kb3cgaXMgbm90IGZ1bGwsCisJICogYW5kIGlmIHdlIGRvbid0IG5lZWQgdG8gY2hhbmdlIHNwZWVkICovCisJaWYgKChzZWxmLT50eF9maWZvLmZyZWUgPCBNQVhfVFhfV0lORE9XKSAmJiAoc2VsZi0+bmV3X3NwZWVkID09IDApKQorCQluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CisKKwkvKiBSZXN0b3JlIGJhbmsgcmVnaXN0ZXIgKi8KKwlvdXRiKGJhbmssIGlvYmFzZStCU1IpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfZG1hX3htaXQgKHNlbGYsIGlvYmFzZSkKKyAqCisgKiAgICBUcmFuc21pdCBkYXRhIHVzaW5nIERNQQorICoKKyAqLworc3RhdGljIHZvaWQgbnNjX2lyY2NfZG1hX3htaXQoc3RydWN0IG5zY19pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlKQoreworCWludCBic3I7CisKKwkvKiBTYXZlIGN1cnJlbnQgYmFuayAqLworCWJzciA9IGluYihpb2Jhc2UrQlNSKTsKKworCS8qIERpc2FibGUgRE1BICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJb3V0YihpbmIoaW9iYXNlK01DUikgJiB+TUNSX0RNQV9FTiwgaW9iYXNlK01DUik7CisJCisJc2VsZi0+aW8uZGlyZWN0aW9uID0gSU9fWE1JVDsKKwkKKwkvKiBDaG9vc2UgdHJhbnNtaXQgRE1BIGNoYW5uZWwgICovIAorCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzIpOworCW91dGIoRUNSMV9ETUFTV1B8RUNSMV9ETUFORnxFQ1IxX0VYVF9TTCwgaW9iYXNlK0VDUjEpOworCQorCWlyZGFfc2V0dXBfZG1hKHNlbGYtPmlvLmRtYSwgCisJCSAgICAgICAoKHU4ICopc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLnB0cl0uc3RhcnQgLQorCQkJc2VsZi0+dHhfYnVmZi5oZWFkKSArIHNlbGYtPnR4X2J1ZmZfZG1hLAorCQkgICAgICAgc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLnB0cl0ubGVuLCAKKwkJICAgICAgIERNQV9UWF9NT0RFKTsKKworCS8qIEVuYWJsZSBETUEgYW5kIFNJUiBpbnRlcmFjdGlvbiBwdWxzZSAqLworIAlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsJCisJb3V0YihpbmIoaW9iYXNlK01DUil8TUNSX1RYX0RGUnxNQ1JfRE1BX0VOfE1DUl9JUl9QTFMsIGlvYmFzZStNQ1IpOworCisJLyogUmVzdG9yZSBiYW5rIHJlZ2lzdGVyICovCisJb3V0Yihic3IsIGlvYmFzZStCU1IpOworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfcGlvX3htaXQgKHNlbGYsIGlvYmFzZSkKKyAqCisgKiAgICBUcmFuc21pdCBkYXRhIHVzaW5nIFBJTy4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYWN0dWFsbHkKKyAqICAgIGdvdCB0cmFuc2ZlcnJlZAorICoKKyAqLworc3RhdGljIGludCBuc2NfaXJjY19waW9fd3JpdGUoaW50IGlvYmFzZSwgX191OCAqYnVmLCBpbnQgbGVuLCBpbnQgZmlmb19zaXplKQoreworCWludCBhY3R1YWwgPSAwOworCV9fdTggYmFuazsKKwkKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogU2F2ZSBjdXJyZW50IGJhbmsgKi8KKwliYW5rID0gaW5iKGlvYmFzZStCU1IpOworCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJaWYgKCEoaW5iX3AoaW9iYXNlK0xTUikgJiBMU1JfVFhFTVApKSB7CisJCUlSREFfREVCVUcoNCwgIiVzKCksIHdhcm5pbmcsIEZJRk8gbm90IGVtcHR5IHlldCFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCisJCS8qIEZJRk8gbWF5IHN0aWxsIGJlIGZpbGxlZCB0byB0aGUgVHggaW50ZXJydXB0IHRocmVzaG9sZCAqLworCQlmaWZvX3NpemUgLT0gMTc7CisJfQorCisJLyogRmlsbCBGSUZPIHdpdGggY3VycmVudCBmcmFtZSAqLworCXdoaWxlICgoZmlmb19zaXplLS0gPiAwKSAmJiAoYWN0dWFsIDwgbGVuKSkgeworCQkvKiBUcmFuc21pdCBuZXh0IGJ5dGUgKi8KKwkJb3V0YihidWZbYWN0dWFsKytdLCBpb2Jhc2UrVFhEKTsKKwl9CisgICAgICAgIAorCUlSREFfREVCVUcoNCwgIiVzKCksIGZpZm9fc2l6ZSAlZCA7ICVkIHNlbnQgb2YgJWRcbiIsIAorCQkgICBfX0ZVTkNUSU9OX18sIGZpZm9fc2l6ZSwgYWN0dWFsLCBsZW4pOworCQorCS8qIFJlc3RvcmUgYmFuayAqLworCW91dGIoYmFuaywgaW9iYXNlK0JTUik7CisKKwlyZXR1cm4gYWN0dWFsOworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfZG1hX3htaXRfY29tcGxldGUgKHNlbGYpCisgKgorICogICAgVGhlIHRyYW5zZmVyIG9mIGEgZnJhbWUgaW4gZmluaXNoZWQuIFRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IGJlIGNhbGxlZCAKKyAqICAgIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgorICoKKyAqLworc3RhdGljIGludCBuc2NfaXJjY19kbWFfeG1pdF9jb21wbGV0ZShzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYpCit7CisJaW50IGlvYmFzZTsKKwlfX3U4IGJhbms7CisJaW50IHJldCA9IFRSVUU7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwkvKiBTYXZlIGN1cnJlbnQgYmFuayAqLworCWJhbmsgPSBpbmIoaW9iYXNlK0JTUik7CisKKwkvKiBEaXNhYmxlIERNQSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworICAgICAgICBvdXRiKGluYihpb2Jhc2UrTUNSKSAmIH5NQ1JfRE1BX0VOLCBpb2Jhc2UrTUNSKTsKKwkKKwkvKiBDaGVjayBmb3IgdW5kZXJycnVuISAqLworCWlmIChpbmIoaW9iYXNlK0FTQ1IpICYgQVNDUl9UWFVSKSB7CisJCXNlbGYtPnN0YXRzLnR4X2Vycm9ycysrOworCQlzZWxmLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkKKwkJLyogQ2xlYXIgYml0LCBieSB3cml0aW5nIDEgaW50byBpdCAqLworCQlvdXRiKEFTQ1JfVFhVUiwgaW9iYXNlK0FTQ1IpOworCX0gZWxzZSB7CisJCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwl9CisKKwkvKiBGaW5pc2hlZCB3aXRoIHRoaXMgZnJhbWUsIHNvIHByZXBhcmUgZm9yIG5leHQgKi8KKwlzZWxmLT50eF9maWZvLnB0cisrOworCXNlbGYtPnR4X2ZpZm8ubGVuLS07CisKKwkvKiBBbnkgZnJhbWVzIHRvIGJlIHNlbnQgYmFjay10by1iYWNrPyAqLworCWlmIChzZWxmLT50eF9maWZvLmxlbikgeworCQluc2NfaXJjY19kbWFfeG1pdChzZWxmLCBpb2Jhc2UpOworCQkKKwkJLyogTm90IGZpbmlzaGVkIHlldCEgKi8KKwkJcmV0ID0gRkFMU0U7CisJfSBlbHNlIHsKKwkJLyogUmVzZXQgVHggRklGTyBpbmZvICovCisJCXNlbGYtPnR4X2ZpZm8ubGVuID0gc2VsZi0+dHhfZmlmby5wdHIgPSBzZWxmLT50eF9maWZvLmZyZWUgPSAwOworCQlzZWxmLT50eF9maWZvLnRhaWwgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisJfQorCisJLyogTWFrZSBzdXJlIHdlIGhhdmUgcm9vbSBmb3IgbW9yZSBmcmFtZXMgYW5kCisJICogdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGNoYW5nZSBzcGVlZCAqLworCWlmICgoc2VsZi0+dHhfZmlmby5mcmVlIDwgTUFYX1RYX1dJTkRPVykgJiYgKHNlbGYtPm5ld19zcGVlZCA9PSAwKSkgeworCQkvKiBOb3QgYnVzeSB0cmFuc21pdHRpbmcgYW55bW9yZSAqLworCQkvKiBUZWxsIHRoZSBuZXR3b3JrIGxheWVyLCB0aGF0IHdlIGNhbiBhY2NlcHQgbW9yZSBmcmFtZXMgKi8KKwkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworCX0KKworCS8qIFJlc3RvcmUgYmFuayAqLworCW91dGIoYmFuaywgaW9iYXNlK0JTUik7CisJCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX2RtYV9yZWNlaXZlIChzZWxmKQorICoKKyAqICAgIEdldCByZWFkeSBmb3IgcmVjZWl2aW5nIGEgZnJhbWUuIFRoZSBkZXZpY2Ugd2lsbCBpbml0aWF0ZSBhIERNQQorICogICAgaWYgaXQgc3RhcnRzIHRvIHJlY2VpdmUgYSBmcmFtZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgbnNjX2lyY2NfZG1hX3JlY2VpdmUoc3RydWN0IG5zY19pcmNjX2NiICpzZWxmKSAKK3sKKwlpbnQgaW9iYXNlOworCV9fdTggYnNyOworCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwkvKiBSZXNldCBUeCBGSUZPIGluZm8gKi8KKwlzZWxmLT50eF9maWZvLmxlbiA9IHNlbGYtPnR4X2ZpZm8ucHRyID0gc2VsZi0+dHhfZmlmby5mcmVlID0gMDsKKwlzZWxmLT50eF9maWZvLnRhaWwgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisKKwkvKiBTYXZlIGN1cnJlbnQgYmFuayAqLworCWJzciA9IGluYihpb2Jhc2UrQlNSKTsKKworCS8qIERpc2FibGUgRE1BICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJb3V0YihpbmIoaW9iYXNlK01DUikgJiB+TUNSX0RNQV9FTiwgaW9iYXNlK01DUik7CisKKwkvKiBDaG9vc2UgRE1BIFJ4LCBETUEgRmFpcm5lc3MsIGFuZCBBZHZhbmNlZCBtb2RlICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMik7CisJb3V0YihFQ1IxX0RNQU5GfEVDUjFfRVhUX1NMLCBpb2Jhc2UrRUNSMSk7CisKKwlzZWxmLT5pby5kaXJlY3Rpb24gPSBJT19SRUNWOworCXNlbGYtPnJ4X2J1ZmYuZGF0YSA9IHNlbGYtPnJ4X2J1ZmYuaGVhZDsKKwkKKwkvKiBSZXNldCBSeCBGSUZPLiBUaGlzIHdpbGwgYWxzbyBmbHVzaCB0aGUgU1RfRklGTyAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCW91dGIoRkNSX1JYU1J8RkNSX0ZJRk9fRU4sIGlvYmFzZStGQ1IpOworCisJc2VsZi0+c3RfZmlmby5sZW4gPSBzZWxmLT5zdF9maWZvLnBlbmRpbmdfYnl0ZXMgPSAwOworCXNlbGYtPnN0X2ZpZm8udGFpbCA9IHNlbGYtPnN0X2ZpZm8uaGVhZCA9IDA7CisJCisJaXJkYV9zZXR1cF9kbWEoc2VsZi0+aW8uZG1hLCBzZWxmLT5yeF9idWZmX2RtYSwgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSwKKwkJICAgICAgIERNQV9SWF9NT0RFKTsKKworCS8qIEVuYWJsZSBETUEgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwlvdXRiKGluYihpb2Jhc2UrTUNSKXxNQ1JfRE1BX0VOLCBpb2Jhc2UrTUNSKTsKKworCS8qIFJlc3RvcmUgYmFuayByZWdpc3RlciAqLworCW91dGIoYnNyLCBpb2Jhc2UrQlNSKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlIChzZWxmKQorICoKKyAqICAgIEZpbmlzaGVkIHdpdGggcmVjZWl2aW5nIGZyYW1lcworICoKKyAqICAgIAorICovCitzdGF0aWMgaW50IG5zY19pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSkKK3sKKwlzdHJ1Y3Qgc3RfZmlmbyAqc3RfZmlmbzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCV9fdTggc3RhdHVzOworCV9fdTggYmFuazsKKwlpbnQgbGVuOworCisJc3RfZmlmbyA9ICZzZWxmLT5zdF9maWZvOworCisJLyogU2F2ZSBjdXJyZW50IGJhbmsgKi8KKwliYW5rID0gaW5iKGlvYmFzZStCU1IpOworCQorCS8qIFJlYWQgYWxsIGVudHJpZXMgaW4gc3RhdHVzIEZJRk8gKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTks1KTsKKwl3aGlsZSAoKHN0YXR1cyA9IGluYihpb2Jhc2UrRlJNX1NUKSkgJiBGUk1fU1RfVkxEKSB7CisJCS8qIFdlIG11c3QgZW1wdHkgdGhlIHN0YXR1cyBGSUZPIG5vIG1hdHRlciB3aGF0ICovCisJCWxlbiA9IGluYihpb2Jhc2UrUkZMRkwpIHwgKChpbmIoaW9iYXNlK1JGTEZIKSAmIDB4MWYpIDw8IDgpOworCisJCWlmIChzdF9maWZvLT50YWlsID49IE1BWF9SWF9XSU5ET1cpIHsKKwkJCUlSREFfREVCVUcoMCwgIiVzKCksIHdpbmRvdyBpcyBmdWxsIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCQkKKwkJc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT50YWlsXS5zdGF0dXMgPSBzdGF0dXM7CisJCXN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+dGFpbF0ubGVuID0gbGVuOworCQlzdF9maWZvLT5wZW5kaW5nX2J5dGVzICs9IGxlbjsKKwkJc3RfZmlmby0+dGFpbCsrOworCQlzdF9maWZvLT5sZW4rKzsKKwl9CisJLyogVHJ5IHRvIHByb2Nlc3MgYWxsIGVudHJpZXMgaW4gc3RhdHVzIEZJRk8gKi8KKwl3aGlsZSAoc3RfZmlmby0+bGVuID4gMCkgeworCQkvKiBHZXQgZmlyc3QgZW50cnkgKi8KKwkJc3RhdHVzID0gc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT5oZWFkXS5zdGF0dXM7CisJCWxlbiAgICA9IHN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0ubGVuOworCQlzdF9maWZvLT5wZW5kaW5nX2J5dGVzIC09IGxlbjsKKwkJc3RfZmlmby0+aGVhZCsrOworCQlzdF9maWZvLT5sZW4tLTsKKworCQkvKiBDaGVjayBmb3IgZXJyb3JzICovCisJCWlmIChzdGF0dXMgJiBGUk1fU1RfRVJSX01TSykgeworCQkJaWYgKHN0YXR1cyAmIEZSTV9TVF9MT1NUX0ZSKSB7CisJCQkJLyogQWRkIG51bWJlciBvZiBsb3N0IGZyYW1lcyB0byBzdGF0cyAqLworCQkJCXNlbGYtPnN0YXRzLnJ4X2Vycm9ycyArPSBsZW47CQorCQkJfSBlbHNlIHsKKwkJCQkvKiBTa2lwIGZyYW1lICovCisJCQkJc2VsZi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCisJCQkJc2VsZi0+cnhfYnVmZi5kYXRhICs9IGxlbjsKKwkJCQorCQkJCWlmIChzdGF0dXMgJiBGUk1fU1RfTUFYX0xFTikKKwkJCQkJc2VsZi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCQorCQkJCWlmIChzdGF0dXMgJiBGUk1fU1RfUEhZX0VSUikgCisJCQkJCXNlbGYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCQorCQkJCWlmIChzdGF0dXMgJiBGUk1fU1RfQkFEX0NSQykgCisJCQkJCXNlbGYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCX0KKwkJCS8qIFRoZSBlcnJvcnMgYmVsb3cgY2FuIGJlIHJlcG9ydGVkIGluIGJvdGggY2FzZXMgKi8KKwkJCWlmIChzdGF0dXMgJiBGUk1fU1RfT1ZSMSkKKwkJCQlzZWxmLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwkJICAgICAgIAorCQkJCisJCQlpZiAoc3RhdHVzICYgRlJNX1NUX09WUjIpCisJCQkJc2VsZi0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJfSBlbHNlIHsKKwkJCS8qICAKKwkJCSAqIEZpcnN0IHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgdGhlIGZyYW1lIHdlCisJCQkgKiB3YW50IHRvIGRlbGl2ZXIgaXMgYWxsIGluIG1haW4gbWVtb3J5LiBJZiB3ZQorCQkJICogY2Fubm90IHRlbGwsIHRoZW4gd2UgY2hlY2sgaWYgdGhlIFJ4IEZJRk8gaXMKKwkJCSAqIGVtcHR5LiBJZiBub3QgdGhlbiB3ZSB3aWxsIGhhdmUgdG8gdGFrZSBhIG5hcAorCQkJICogYW5kIHRyeSBhZ2FpbiBsYXRlci4gIAorCQkJICovCisJCQlpZiAoc3RfZmlmby0+cGVuZGluZ19ieXRlcyA8IHNlbGYtPmlvLmZpZm9fc2l6ZSkgeworCQkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCQkJCWlmIChpbmIoaW9iYXNlK0xTUikgJiBMU1JfUlhEQSkgeworCQkJCQkvKiBQdXQgdGhpcyBlbnRyeSBiYWNrIGluIGZpZm8gKi8KKwkJCQkJc3RfZmlmby0+aGVhZC0tOworCQkJCQlzdF9maWZvLT5sZW4rKzsKKwkJCQkJc3RfZmlmby0+cGVuZGluZ19ieXRlcyArPSBsZW47CisJCQkJCXN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0uc3RhdHVzID0gc3RhdHVzOworCQkJCQlzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPmhlYWRdLmxlbiA9IGxlbjsKKwkJCQkJLyogIAorCQkJCQkgKiBETUEgbm90IGZpbmlzaGVkIHlldCwgc28gdHJ5IGFnYWluIAorCQkJCQkgKiBsYXRlciwgc2V0IHRpbWVyIHZhbHVlLCByZXNvbHV0aW9uIAorCQkJCQkgKiAxMjUgdXMgCisJCQkJCSAqLworCQkJCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTks0KTsKKwkJCQkJb3V0YigweDAyLCBpb2Jhc2UrVE1STCk7IC8qIHggMTI1IHVzICovCisJCQkJCW91dGIoMHgwMCwgaW9iYXNlK1RNUkgpOworCisJCQkJCS8qIFN0YXJ0IHRpbWVyICovCisJCQkJCW91dGIoSVJDUjFfVE1SX0VOLCBpb2Jhc2UrSVJDUjEpOworCisJCQkJCS8qIFJlc3RvcmUgYmFuayByZWdpc3RlciAqLworCQkJCQlvdXRiKGJhbmssIGlvYmFzZStCU1IpOworCQkJCQkKKwkJCQkJcmV0dXJuIEZBTFNFOyAvKiBJJ2xsIGJlIGJhY2shICovCisJCQkJfQorCQkJfQorCisJCQkvKiAKKwkJCSAqIFJlbWVtYmVyIHRoZSB0aW1lIHdlIHJlY2VpdmVkIHRoaXMgZnJhbWUsIHNvIHdlIGNhbgorCQkJICogcmVkdWNlIHRoZSBtaW4gdHVybiB0aW1lIGEgYml0IHNpbmNlIHdlIHdpbGwga25vdworCQkJICogaG93IG11Y2ggdGltZSB3ZSBoYXZlIHVzZWQgZm9yIHByb3RvY29sIHByb2Nlc3NpbmcKKwkJCSAqLworCQkJZG9fZ2V0dGltZW9mZGF5KCZzZWxmLT5zdGFtcCk7CisKKwkJCXNrYiA9IGRldl9hbGxvY19za2IobGVuKzEpOworCQkJaWYgKHNrYiA9PSBOVUxMKSAgeworCQkJCUlSREFfV0FSTklORygiJXMoKSwgbWVtb3J5IHNxdWVlemUsICIKKwkJCQkJICAgICAiZHJvcHBpbmcgZnJhbWUuXG4iLAorCQkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQkJc2VsZi0+c3RhdHMucnhfZHJvcHBlZCsrOworCisJCQkJLyogUmVzdG9yZSBiYW5rIHJlZ2lzdGVyICovCisJCQkJb3V0YihiYW5rLCBpb2Jhc2UrQlNSKTsKKworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCQorCQkJLyogTWFrZSBzdXJlIElQIGhlYWRlciBnZXRzIGFsaWduZWQgKi8KKwkJCXNrYl9yZXNlcnZlKHNrYiwgMSk7IAorCisJCQkvKiBDb3B5IGZyYW1lIHdpdGhvdXQgQ1JDICovCisJCQlpZiAoc2VsZi0+aW8uc3BlZWQgPCA0MDAwMDAwKSB7CisJCQkJc2tiX3B1dChza2IsIGxlbi0yKTsKKwkJCQltZW1jcHkoc2tiLT5kYXRhLCBzZWxmLT5yeF9idWZmLmRhdGEsIGxlbi0yKTsKKwkJCX0gZWxzZSB7CisJCQkJc2tiX3B1dChza2IsIGxlbi00KTsKKwkJCQltZW1jcHkoc2tiLT5kYXRhLCBzZWxmLT5yeF9idWZmLmRhdGEsIGxlbi00KTsKKwkJCX0KKworCQkJLyogTW92ZSB0byBuZXh0IGZyYW1lICovCisJCQlzZWxmLT5yeF9idWZmLmRhdGEgKz0gbGVuOworCQkJc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQkJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOworCisJCQlza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKKwkJCXNrYi0+bWFjLnJhdyAgPSBza2ItPmRhdGE7CisJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CisJCQluZXRpZl9yeChza2IpOworCQkJc2VsZi0+bmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJfQorCX0KKwkvKiBSZXN0b3JlIGJhbmsgcmVnaXN0ZXIgKi8KKwlvdXRiKGJhbmssIGlvYmFzZStCU1IpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19waW9fcmVjZWl2ZSAoc2VsZikKKyAqCisgKiAgICBSZWNlaXZlIGFsbCBkYXRhIGluIHJlY2VpdmVyIEZJRk8KKyAqCisgKi8KK3N0YXRpYyB2b2lkIG5zY19pcmNjX3Bpb19yZWNlaXZlKHN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZikgCit7CisJX191OCBieXRlOworCWludCBpb2Jhc2U7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwkKKwkvKiAgUmVjZWl2ZSBhbGwgY2hhcmFjdGVycyBpbiBSeCBGSUZPICovCisJZG8geworCQlieXRlID0gaW5iKGlvYmFzZStSWEQpOworCQlhc3luY191bndyYXBfY2hhcihzZWxmLT5uZXRkZXYsICZzZWxmLT5zdGF0cywgJnNlbGYtPnJ4X2J1ZmYsIAorCQkJCSAgYnl0ZSk7CisJfSB3aGlsZSAoaW5iKGlvYmFzZStMU1IpICYgTFNSX1JYREEpOyAvKiBEYXRhIGF2YWlsYWJsZSAqLwkKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX3Npcl9pbnRlcnJ1cHQgKHNlbGYsIGVpcikKKyAqCisgKiAgICBIYW5kbGUgU0lSIGludGVycnVwdAorICoKKyAqLworc3RhdGljIHZvaWQgbnNjX2lyY2Nfc2lyX2ludGVycnVwdChzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYsIGludCBlaXIpCit7CisJaW50IGFjdHVhbDsKKworCS8qIENoZWNrIGlmIHRyYW5zbWl0IEZJRk8gaXMgbG93IG9uIGRhdGEgKi8KKwlpZiAoZWlyICYgRUlSX1RYTERMX0VWKSB7CisJCS8qIFdyaXRlIGRhdGEgbGVmdCBpbiB0cmFuc21pdCBidWZmZXIgKi8KKwkJYWN0dWFsID0gbnNjX2lyY2NfcGlvX3dyaXRlKHNlbGYtPmlvLmZpcl9iYXNlLCAKKwkJCQkJICAgc2VsZi0+dHhfYnVmZi5kYXRhLCAKKwkJCQkJICAgc2VsZi0+dHhfYnVmZi5sZW4sIAorCQkJCQkgICBzZWxmLT5pby5maWZvX3NpemUpOworCQlzZWxmLT50eF9idWZmLmRhdGEgKz0gYWN0dWFsOworCQlzZWxmLT50eF9idWZmLmxlbiAgLT0gYWN0dWFsOworCQkKKwkJc2VsZi0+aW8uZGlyZWN0aW9uID0gSU9fWE1JVDsKKworCQkvKiBDaGVjayBpZiBmaW5pc2hlZCAqLworCQlpZiAoc2VsZi0+dHhfYnVmZi5sZW4gPiAwKQorCQkJc2VsZi0+aWVyID0gSUVSX1RYTERMX0lFOworCQllbHNlIHsgCisKKwkJCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKwkJCXNlbGYtPmllciA9IElFUl9UWEVNUF9JRTsKKwkJfQorCQkJCisJfQorCS8qIENoZWNrIGlmIHRyYW5zbWlzc2lvbiBoYXMgY29tcGxldGVkICovCisJaWYgKGVpciAmIEVJUl9UWEVNUF9FVikgeworCQkvKiBUdXJuIGFyb3VuZCBhbmQgZ2V0IHJlYWR5IHRvIHJlY2VpdmUgc29tZSBkYXRhICovCisJCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1JFQ1Y7CisJCXNlbGYtPmllciA9IElFUl9SWEhETF9JRTsKKwkJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkPworCQkgKiBOZWVkIHRvIGJlIGFmdGVyIHNlbGYtPmlvLmRpcmVjdGlvbiB0byBhdm9pZCByYWNlIHdpdGgKKwkJICogbnNjX2lyY2NfaGFyZF94bWl0X3NpcigpIC0gSmVhbiBJSSAqLworCQlpZiAoc2VsZi0+bmV3X3NwZWVkKSB7CisJCQlJUkRBX0RFQlVHKDIsICIlcygpLCBDaGFuZ2luZyBzcGVlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlzZWxmLT5pZXIgPSBuc2NfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwKKwkJCQkJCQkgIHNlbGYtPm5ld19zcGVlZCk7CisJCQlzZWxmLT5uZXdfc3BlZWQgPSAwOworCQkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworCisJCQkvKiBDaGVjayBpZiB3ZSBhcmUgZ29pbmcgdG8gRklSICovCisJCQlpZiAoc2VsZi0+aW8uc3BlZWQgPiAxMTUyMDApIHsKKwkJCQkvKiBObyBuZWVkIHRvIGRvIGFueW1vcmUgU0lSIHN0dWZmICovCisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorCisJLyogUnggRklGTyB0aHJlc2hvbGQgb3IgdGltZW91dCAqLworCWlmIChlaXIgJiBFSVJfUlhIRExfRVYpIHsKKwkJbnNjX2lyY2NfcGlvX3JlY2VpdmUoc2VsZik7CisKKwkJLyogS2VlcCByZWNlaXZpbmcgKi8KKwkJc2VsZi0+aWVyID0gSUVSX1JYSERMX0lFOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX2Zpcl9pbnRlcnJ1cHQgKHNlbGYsIGVpcikKKyAqCisgKiAgICBIYW5kbGUgTUlSL0ZJUiBpbnRlcnJ1cHQKKyAqCisgKi8KK3N0YXRpYyB2b2lkIG5zY19pcmNjX2Zpcl9pbnRlcnJ1cHQoc3RydWN0IG5zY19pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlLCAKKwkJCQkgICBpbnQgZWlyKQoreworCV9fdTggYmFuazsKKworCWJhbmsgPSBpbmIoaW9iYXNlK0JTUik7CisJCisJLyogU3RhdHVzIEZJRk8gZXZlbnQqLworCWlmIChlaXIgJiBFSVJfU0ZJRl9FVikgeworCQkvKiBDaGVjayBpZiBETUEgaGFzIGZpbmlzaGVkICovCisJCWlmIChuc2NfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzZWxmLCBpb2Jhc2UpKSB7CisJCQkvKiBXYWl0IGZvciBuZXh0IHN0YXR1cyBGSUZPIGludGVycnVwdCAqLworCQkJc2VsZi0+aWVyID0gSUVSX1NGSUZfSUU7CisJCX0gZWxzZSB7CisJCQlzZWxmLT5pZXIgPSBJRVJfU0ZJRl9JRSB8IElFUl9UTVJfSUU7CisJCX0KKwl9IGVsc2UgaWYgKGVpciAmIEVJUl9UTVJfRVYpIHsgLyogVGltZXIgZmluaXNoZWQgKi8KKwkJLyogRGlzYWJsZSB0aW1lciAqLworCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTks0KTsKKwkJb3V0YigwLCBpb2Jhc2UrSVJDUjEpOworCisJCS8qIENsZWFyIHRpbWVyIGV2ZW50ICovCisJCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOworCQlvdXRiKEFTQ1JfQ1RFLCBpb2Jhc2UrQVNDUik7CisKKwkJLyogQ2hlY2sgaWYgdGhpcyBpcyBhIFR4IHRpbWVyIGludGVycnVwdCAqLworCQlpZiAoc2VsZi0+aW8uZGlyZWN0aW9uID09IElPX1hNSVQpIHsKKwkJCW5zY19pcmNjX2RtYV94bWl0KHNlbGYsIGlvYmFzZSk7CisKKwkJCS8qIEludGVycnVwdCBvbiBETUEgKi8KKwkJCXNlbGYtPmllciA9IElFUl9ETUFfSUU7CisJCX0gZWxzZSB7CisJCQkvKiBDaGVjayAoYWdhaW4pIGlmIERNQSBoYXMgZmluaXNoZWQgKi8KKwkJCWlmIChuc2NfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzZWxmLCBpb2Jhc2UpKSB7CisJCQkJc2VsZi0+aWVyID0gSUVSX1NGSUZfSUU7CisJCQl9IGVsc2UgeworCQkJCXNlbGYtPmllciA9IElFUl9TRklGX0lFIHwgSUVSX1RNUl9JRTsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoZWlyICYgRUlSX0RNQV9FVikgeworCQkvKiBGaW5pc2hlZCB3aXRoIGFsbCB0cmFuc21pc3Npb25zPyAqLworCQlpZiAobnNjX2lyY2NfZG1hX3htaXRfY29tcGxldGUoc2VsZikpIHsKKwkJCWlmKHNlbGYtPm5ld19zcGVlZCAhPSAwKSB7CisJCQkJLyogQXMgd2Ugc3RvcCB0aGUgVHggcXVldWUsIHRoZSBzcGVlZCBjaGFuZ2UKKwkJCQkgKiBuZWVkIHRvIGJlIGRvbmUgd2hlbiB0aGUgVHggZmlmbyBpcworCQkJCSAqIGVtcHR5LiBBc2sgZm9yIGEgVHggZG9uZSBpbnRlcnJ1cHQgKi8KKwkJCQlzZWxmLT5pZXIgPSBJRVJfVFhFTVBfSUU7CisJCQl9IGVsc2UgeworCQkJCS8qIENoZWNrIGlmIHRoZXJlIGFyZSBtb3JlIGZyYW1lcyB0byBiZQorCQkJCSAqIHRyYW5zbWl0dGVkICovCisJCQkJaWYgKGlyZGFfZGV2aWNlX3R4cXVldWVfZW1wdHkoc2VsZi0+bmV0ZGV2KSkgeworCQkJCQkvKiBQcmVwYXJlIGZvciByZWNlaXZlICovCisJCQkJCW5zY19pcmNjX2RtYV9yZWNlaXZlKHNlbGYpOworCQkJCQlzZWxmLT5pZXIgPSBJRVJfU0ZJRl9JRTsKKwkJCQl9IGVsc2UKKwkJCQkJSVJEQV9XQVJOSU5HKCIlcygpLCBwb3RlbnRpYWwgIgorCQkJCQkJICAgICAiVHggcXVldWUgbG9ja3VwICFcbiIsCisJCQkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiAgTm90IGZpbmlzaGVkIHlldCwgc28gaW50ZXJydXB0IG9uIERNQSBhZ2FpbiAqLworCQkJc2VsZi0+aWVyID0gSUVSX0RNQV9JRTsKKwkJfQorCX0gZWxzZSBpZiAoZWlyICYgRUlSX1RYRU1QX0VWKSB7CisJCS8qIFRoZSBUeCBGSUZPIGhhcyB0b3RhbGx5IGRyYWluZWQgb3V0LCBzbyBub3cgd2UgY2FuIGNoYW5nZQorCQkgKiB0aGUgc3BlZWQuLi4gLSBKZWFuIElJICovCisJCXNlbGYtPmllciA9IG5zY19pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBzZWxmLT5uZXdfc3BlZWQpOworCQlzZWxmLT5uZXdfc3BlZWQgPSAwOworCQluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CisJCS8qIE5vdGUgOiBuc2NfaXJjY19jaGFuZ2Vfc3BlZWQoKSByZXN0YXJ0ZWQgUnggZmlmbyAqLworCX0KKworCW91dGIoYmFuaywgaW9iYXNlK0JTUik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuc2NfaXJjY19pbnRlcnJ1cHQgKGlycSwgZGV2X2lkLCByZWdzKQorICoKKyAqICAgIEFuIGludGVycnVwdCBmcm9tIHRoZSBjaGlwIGhhcyBhcnJpdmVkLiBUaW1lIHRvIGRvIHNvbWUgd29yaworICoKKyAqLworc3RhdGljIGlycXJldHVybl90IG5zY19pcmNjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IG5zY19pcmNjX2NiICpzZWxmOworCV9fdTggYnNyLCBlaXI7CisJaW50IGlvYmFzZTsKKworCWlmICghZGV2KSB7CisJCUlSREFfV0FSTklORygiJXM6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLAorCQkJICAgICBkcml2ZXJfbmFtZSwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKwlzZWxmID0gKHN0cnVjdCBuc2NfaXJjY19jYiAqKSBkZXYtPnByaXY7CisKKwlzcGluX2xvY2soJnNlbGYtPmxvY2spOwkKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJYnNyID0gaW5iKGlvYmFzZStCU1IpOyAJLyogU2F2ZSBjdXJyZW50IGJhbmsgKi8KKworCXN3aXRjaF9iYW5rKGlvYmFzZSwgQkFOSzApOwkKKwlzZWxmLT5pZXIgPSBpbmIoaW9iYXNlK0lFUik7IAorCWVpciA9IGluYihpb2Jhc2UrRUlSKSAmIHNlbGYtPmllcjsgLyogTWFzayBvdXQgdGhlIGludGVyZXN0aW5nIG9uZXMgKi8gCisKKwlvdXRiKDAsIGlvYmFzZStJRVIpOyAvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwkKKwlpZiAoZWlyKSB7CisJCS8qIERpc3BhdGNoIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgY3VycmVudCBzcGVlZCAqLworCQlpZiAoc2VsZi0+aW8uc3BlZWQgPiAxMTUyMDApCisJCQluc2NfaXJjY19maXJfaW50ZXJydXB0KHNlbGYsIGlvYmFzZSwgZWlyKTsKKwkJZWxzZQorCQkJbnNjX2lyY2Nfc2lyX2ludGVycnVwdChzZWxmLCBlaXIpOworCX0KKwkKKwlvdXRiKHNlbGYtPmllciwgaW9iYXNlK0lFUik7IC8qIFJlc3RvcmUgaW50ZXJydXB0cyAqLworCW91dGIoYnNyLCBpb2Jhc2UrQlNSKTsgICAgICAgLyogUmVzdG9yZSBiYW5rIHJlZ2lzdGVyICovCisKKwlzcGluX3VubG9jaygmc2VsZi0+bG9jayk7CisJcmV0dXJuIElSUV9SRVRWQUwoZWlyKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX2lzX3JlY2VpdmluZyAoc2VsZikKKyAqCisgKiAgICBSZXR1cm4gVFJVRSBpcyB3ZSBhcmUgY3VycmVudGx5IHJlY2VpdmluZyBhIGZyYW1lCisgKgorICovCitzdGF0aWMgaW50IG5zY19pcmNjX2lzX3JlY2VpdmluZyhzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc3RhdHVzID0gRkFMU0U7CisJaW50IGlvYmFzZTsKKwlfX3U4IGJhbms7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiBGQUxTRTspOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCWlmIChzZWxmLT5pby5zcGVlZCA+IDExNTIwMCkgeworCQlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCQkvKiBDaGVjayBpZiByeCBGSUZPIGlzIG5vdCBlbXB0eSAqLworCQliYW5rID0gaW5iKGlvYmFzZStCU1IpOworCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTksyKTsKKwkJaWYgKChpbmIoaW9iYXNlK1JYRkxWKSAmIDB4M2YpICE9IDApIHsKKwkJCS8qIFdlIGFyZSByZWNlaXZpbmcgc29tZXRoaW5nICovCisJCQlzdGF0dXMgPSAgVFJVRTsKKwkJfQorCQlvdXRiKGJhbmssIGlvYmFzZStCU1IpOworCX0gZWxzZSAKKwkJc3RhdHVzID0gKHNlbGYtPnJ4X2J1ZmYuc3RhdGUgIT0gT1VUU0lERV9GUkFNRSk7CisJCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX25ldF9vcGVuIChkZXYpCisgKgorICogICAgU3RhcnQgdGhlIGRldmljZQorICoKKyAqLworc3RhdGljIGludCBuc2NfaXJjY19uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZjsKKwlpbnQgaW9iYXNlOworCWNoYXIgaHduYW1lWzMyXTsKKwlfX3U4IGJhbms7CisJCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwkKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJc2VsZiA9IChzdHJ1Y3QgbnNjX2lyY2NfY2IgKikgZGV2LT5wcml2OworCQorCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKwkKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwkKKwlpZiAocmVxdWVzdF9pcnEoc2VsZi0+aW8uaXJxLCBuc2NfaXJjY19pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSkgeworCQlJUkRBX1dBUk5JTkcoIiVzLCB1bmFibGUgdG8gYWxsb2NhdGUgaXJxPSVkXG4iLAorCQkJICAgICBkcml2ZXJfbmFtZSwgc2VsZi0+aW8uaXJxKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCS8qCisJICogQWx3YXlzIGFsbG9jYXRlIHRoZSBETUEgY2hhbm5lbCBhZnRlciB0aGUgSVJRLCBhbmQgY2xlYW4gdXAgb24gCisJICogZmFpbHVyZS4KKwkgKi8KKwlpZiAocmVxdWVzdF9kbWEoc2VsZi0+aW8uZG1hLCBkZXYtPm5hbWUpKSB7CisJCUlSREFfV0FSTklORygiJXMsIHVuYWJsZSB0byBhbGxvY2F0ZSBkbWE9JWRcbiIsCisJCQkgICAgIGRyaXZlcl9uYW1lLCBzZWxmLT5pby5kbWEpOworCQlmcmVlX2lycShzZWxmLT5pby5pcnEsIGRldik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwkKKwkvKiBTYXZlIGN1cnJlbnQgYmFuayAqLworCWJhbmsgPSBpbmIoaW9iYXNlK0JTUik7CisJCisJLyogdHVybiBvbiBpbnRlcnJ1cHRzICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBCQU5LMCk7CisJb3V0YihJRVJfTFNfSUUgfCBJRVJfUlhIRExfSUUsIGlvYmFzZStJRVIpOworCisJLyogUmVzdG9yZSBiYW5rIHJlZ2lzdGVyICovCisJb3V0YihiYW5rLCBpb2Jhc2UrQlNSKTsKKworCS8qIFJlYWR5IHRvIHBsYXkhICovCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkKKwkvKiBHaXZlIHNlbGYgYSBoYXJkd2FyZSBuYW1lICovCisJc3ByaW50Zihod25hbWUsICJOU0MtRklSIEAgMHglMDN4Iiwgc2VsZi0+aW8uZmlyX2Jhc2UpOworCisJLyogCisJICogT3BlbiBuZXcgSXJMQVAgbGF5ZXIgaW5zdGFuY2UsIG5vdyB0aGF0IGV2ZXJ5dGhpbmcgc2hvdWxkIGJlCisJICogaW5pdGlhbGl6ZWQgcHJvcGVybHkgCisJICovCisJc2VsZi0+aXJsYXAgPSBpcmxhcF9vcGVuKGRldiwgJnNlbGYtPnFvcywgaHduYW1lKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gbnNjX2lyY2NfbmV0X2Nsb3NlIChkZXYpCisgKgorICogICAgU3RvcCB0aGUgZGV2aWNlCisgKgorICovCitzdGF0aWMgaW50IG5zY19pcmNjX25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZjsKKwlpbnQgaW9iYXNlOworCV9fdTggYmFuazsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCisJc2VsZiA9IChzdHJ1Y3QgbnNjX2lyY2NfY2IgKikgZGV2LT5wcml2OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKworCS8qIFN0b3AgZGV2aWNlICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCS8qIFN0b3AgYW5kIHJlbW92ZSBpbnN0YW5jZSBvZiBJckxBUCAqLworCWlmIChzZWxmLT5pcmxhcCkKKwkJaXJsYXBfY2xvc2Uoc2VsZi0+aXJsYXApOworCXNlbGYtPmlybGFwID0gTlVMTDsKKwkKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCWRpc2FibGVfZG1hKHNlbGYtPmlvLmRtYSk7CisKKwkvKiBTYXZlIGN1cnJlbnQgYmFuayAqLworCWJhbmsgPSBpbmIoaW9iYXNlK0JTUik7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIEJBTkswKTsKKwlvdXRiKDAsIGlvYmFzZStJRVIpOyAKKyAgICAgICAKKwlmcmVlX2lycShzZWxmLT5pby5pcnEsIGRldik7CisJZnJlZV9kbWEoc2VsZi0+aW8uZG1hKTsKKworCS8qIFJlc3RvcmUgYmFuayByZWdpc3RlciAqLworCW91dGIoYmFuaywgaW9iYXNlK0JTUik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG5zY19pcmNjX25ldF9pb2N0bCAoZGV2LCBycSwgY21kKQorICoKKyAqICAgIFByb2Nlc3MgSU9DVEwgY29tbWFuZHMgZm9yIHRoaXMgZGV2aWNlCisgKgorICovCitzdGF0aWMgaW50IG5zY19pcmNjX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBpZl9pcmRhX3JlcSAqaXJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKSBycTsKKwlzdHJ1Y3QgbnNjX2lyY2NfY2IgKnNlbGY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXNlbGYgPSBkZXYtPnByaXY7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgJXMsIChjbWQ9MHglWClcbiIsIF9fRlVOQ1RJT05fXywgZGV2LT5uYW1lLCBjbWQpOworCQorCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DU0JBTkRXSURUSDogLyogU2V0IGJhbmR3aWR0aCAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXJldCA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCW5zY19pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBpcnEtPmlmcl9iYXVkcmF0ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DU01FRElBQlVTWTogLyogU2V0IG1lZGlhIGJ1c3kgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlyZXQgPSAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShzZWxmLT5uZXRkZXYsIFRSVUUpOworCQlicmVhazsKKwljYXNlIFNJT0NHUkVDRUlWSU5HOiAvKiBDaGVjayBpZiB3ZSBhcmUgcmVjZWl2aW5nIHJpZ2h0IG5vdyAqLworCQkvKiBUaGlzIGlzIGFscmVhZHkgcHJvdGVjdGVkICovCisJCWlycS0+aWZyX3JlY2VpdmluZyA9IG5zY19pcmNjX2lzX3JlY2VpdmluZyhzZWxmKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbnNjX2lyY2NfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZiA9IChzdHJ1Y3QgbnNjX2lyY2NfY2IgKikgZGV2LT5wcml2OworCQorCXJldHVybiAmc2VsZi0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIG5zY19pcmNjX3N1c3BlbmQoc3RydWN0IG5zY19pcmNjX2NiICpzZWxmKQoreworCUlSREFfTUVTU0FHRSgiJXMsIFN1c3BlbmRpbmdcbiIsIGRyaXZlcl9uYW1lKTsKKworCWlmIChzZWxmLT5pby5zdXNwZW5kZWQpCisJCXJldHVybjsKKworCW5zY19pcmNjX25ldF9jbG9zZShzZWxmLT5uZXRkZXYpOworCisJc2VsZi0+aW8uc3VzcGVuZGVkID0gMTsKK30KKworc3RhdGljIHZvaWQgbnNjX2lyY2Nfd2FrZXVwKHN0cnVjdCBuc2NfaXJjY19jYiAqc2VsZikKK3sKKwlpZiAoIXNlbGYtPmlvLnN1c3BlbmRlZCkKKwkJcmV0dXJuOworCisJbnNjX2lyY2Nfc2V0dXAoJnNlbGYtPmlvKTsKKwluc2NfaXJjY19uZXRfb3BlbihzZWxmLT5uZXRkZXYpOworCQorCUlSREFfTUVTU0FHRSgiJXMsIFdha2luZyB1cFxuIiwgZHJpdmVyX25hbWUpOworCisJc2VsZi0+aW8uc3VzcGVuZGVkID0gMDsKK30KKworc3RhdGljIGludCBuc2NfaXJjY19wbXByb2Moc3RydWN0IHBtX2RldiAqZGV2LCBwbV9yZXF1ZXN0X3QgcnFzdCwgdm9pZCAqZGF0YSkKK3sKKyAgICAgICAgc3RydWN0IG5zY19pcmNjX2NiICpzZWxmID0gKHN0cnVjdCBuc2NfaXJjY19jYiopIGRldi0+ZGF0YTsKKyAgICAgICAgaWYgKHNlbGYpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHJxc3QpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFBNX1NVU1BFTkQ6CisgICAgICAgICAgICAgICAgICAgICAgICBuc2NfaXJjY19zdXNwZW5kKHNlbGYpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQTV9SRVNVTUU6CisgICAgICAgICAgICAgICAgICAgICAgICBuc2NfaXJjY193YWtldXAoc2VsZik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOU0MgSXJEQSBEZXZpY2UgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworbW9kdWxlX3BhcmFtKHFvc19tdHRfYml0cywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocW9zX210dF9iaXRzLCAiTWluaW11bSBUdXJuIFRpbWUiKTsKK21vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJCYXNlIEkvTyBhZGRyZXNzZXMiKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSBsaW5lcyIpOworbW9kdWxlX3BhcmFtX2FycmF5KGRtYSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZG1hLCAiRE1BIGNoYW5uZWxzIik7Cittb2R1bGVfcGFyYW0oZG9uZ2xlX2lkLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkb25nbGVfaWQsICJUeXBlLWlkIG9mIHVzZWQgZG9uZ2xlIik7CisKK21vZHVsZV9pbml0KG5zY19pcmNjX2luaXQpOworbW9kdWxlX2V4aXQobnNjX2lyY2NfY2xlYW51cCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvbnNjLWlyY2MuaCBiL2RyaXZlcnMvbmV0L2lyZGEvbnNjLWlyY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWRmN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9uc2MtaXJjYy5oCkBAIC0wLDAgKzEsMjgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIG5zYy1pcmNjLmgKKyAqIFZlcnNpb246ICAgICAgIAorICogRGVzY3JpcHRpb246ICAgCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBGcmkgTm92IDEzIDE0OjM3OjQwIDE5OTgKKyAqIE1vZGlmaWVkIGF0OiAgIFN1biBKYW4gMjMgMTc6NDc6MDAgMjAwMAorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogICAgIENvcHlyaWdodCAoYykgMTk5OCBMaWNoZW4gV2FuZywgPGx3YW5nQGFjdGlzeXMuY29tPgorICogICAgIENvcHlyaWdodCAoYykgMTk5OCBBY3Rpc3lzIENvcnAuLCB3d3cuYWN0aXN5cy5jb20KKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAorICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBOU0NfSVJDQ19ICisjZGVmaW5lIE5TQ19JUkNDX0gKKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisvKiBETUEgbW9kZXMgbmVlZGVkICovCisjZGVmaW5lIERNQV9UWF9NT0RFICAgICAweDA4ICAgIC8qIE1lbSB0byBJL08sICsrLCBkZW1hbmQuICovCisjZGVmaW5lIERNQV9SWF9NT0RFICAgICAweDA0ICAgIC8qIEkvTyB0byBtZW0sICsrLCBkZW1hbmQuICovCisKKy8qIENvbmZpZyByZWdpc3RlcnMgZm9yIHRoZSAnMTA4ICovCisjZGVmaW5lIENGR18xMDhfQkFJQyAweDAwCisjZGVmaW5lIENGR18xMDhfQ1NSVCAweDAxCisjZGVmaW5lIENGR18xMDhfTUNUTCAweDAyCisKKy8qIENvbmZpZyByZWdpc3RlcnMgZm9yIHRoZSAnMzM4ICovCisjZGVmaW5lIENGR18zMzhfRkVSICAweDAwCisjZGVmaW5lIENGR18zMzhfRkFSICAweDAxCisjZGVmaW5lIENGR18zMzhfUFRSICAweDAyCisjZGVmaW5lIENGR18zMzhfUE5QMCAweDFiCisjZGVmaW5lIENGR18zMzhfUE5QMSAweDFjCisjZGVmaW5lIENGR18zMzhfUE5QMyAweDRmCisKKy8qIENvbmZpZyByZWdpc3RlcnMgZm9yIHRoZSAnMzl4IChpbiB0aGUgbG9naWNhbCBkZXZpY2UgYmFuaykgKi8KKyNkZWZpbmUgQ0ZHXzM5WF9MRE4JMHgwNwkvKiBMb2dpY2FsIGRldmljZSBudW1iZXIgKFN1cGVyIEkvTyBiYW5rKSAqLworI2RlZmluZSBDRkdfMzlYX1NJT0NGMQkweDIxCS8qIFN1cGVySS9PIENvbmZpZyAqLworI2RlZmluZSBDRkdfMzlYX0FDVAkweDMwCS8qIERldmljZSBhY3RpdmF0aW9uICovCisjZGVmaW5lIENGR18zOVhfQkFTRUgJMHg2MAkvKiBEZXZpY2UgYmFzZSBhZGRyZXNzIChoaWdoIGJpdHMpICovCisjZGVmaW5lIENGR18zOVhfQkFTRUwJMHg2MQkvKiBEZXZpY2UgYmFzZSBhZGRyZXNzIChsb3cgYml0cykgKi8KKyNkZWZpbmUgQ0ZHXzM5WF9JUlFOVU0JMHg3MAkvKiBJbnRlcnJ1cHQgbnVtYmVyICYgd2FrZSB1cCBlbmFibGUgKi8KKyNkZWZpbmUgQ0ZHXzM5WF9JUlFTRUwJMHg3MQkvKiBJbnRlcnJ1cHQgc2VsZWN0IChlZGdlL2xldmVsICsgcG9sYXJpdHkpICovCisjZGVmaW5lIENGR18zOVhfRE1BMAkweDc0CS8qIERNQSAwIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQ0ZHXzM5WF9ETUExCTB4NzUJLyogRE1BIDEgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBDRkdfMzlYX1NQQwkweEYwCS8qIFNlcmlhbCBwb3J0IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKworLyogRmxhZ3MgZm9yIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgQ1JGMCAqLworI2RlZmluZSBBUEVEQ1JDCQkweDAyCisjZGVmaW5lIEVOQk5LU0VMCTB4MDEKKworLyogU2V0IDAgKi8KKyNkZWZpbmUgVFhEICAgICAgICAgICAgIDB4MDAgLyogVHJhbnNtaXQgZGF0YSBwb3J0ICovCisjZGVmaW5lIFJYRCAgICAgICAgICAgICAweDAwIC8qIFJlY2VpdmUgZGF0YSBwb3J0ICovCisKKy8qIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgSUVSCQkweDAxIC8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIqLworI2RlZmluZSBJRVJfUlhIRExfSUUgICAgMHgwMSAvKiBSZWNlaXZlciBoaWdoIGRhdGEgbGV2ZWwgaW50ZXJydXB0ICovCisjZGVmaW5lIElFUl9UWExETF9JRSAgICAweDAyIC8qIFRyYW5zZWl2ZXIgbG93IGRhdGEgbGV2ZWwgaW50ZXJydXB0ICovCisjZGVmaW5lIElFUl9MU19JRQkweDA0Ly8qIExpbmsgU3RhdHVzIEludGVycnVwdCAqLworI2RlZmluZSBJRVJfRVRYVVJJICAgICAgMHgwNCAvKiBUeCB1bmRlcnJ1biAqLworI2RlZmluZSBJRVJfRE1BX0lFCTB4MTAgLyogRE1BIGZpbmlzaGVkIGludGVycnVwdCAqLworI2RlZmluZSBJRVJfVFhFTVBfSUUgICAgMHgyMAorI2RlZmluZSBJRVJfU0ZJRl9JRSAgICAgMHg0MCAvKiBGcmFtZSBzdGF0dXMgRklGTyBpbnRyICovCisjZGVmaW5lIElFUl9UTVJfSUUgICAgICAweDgwIC8qIFRpbWVyIGV2ZW50ICovCisKKyNkZWZpbmUgRkNSCQkweDAyIC8qICh3cml0ZSBvbmx5KSAqLworI2RlZmluZSBGQ1JfRklGT19FTiAgICAgMHgwMSAvKiBFbmFibGUgRklGTydzICovCisjZGVmaW5lIEZDUl9SWFNSICAgICAgICAweDAyIC8qIFJ4IEZJRk8gc29mdCByZXNldCAqLworI2RlZmluZSBGQ1JfVFhTUiAgICAgICAgMHgwNCAvKiBUeCBGSUZPIHNvZnQgcmVzZXQgKi8KKyNkZWZpbmUgRkNSX1JYVEgJMHg0MCAvKiBSeCBGSUZPIHRocmVzaG9sZCAoc2V0IHRvIDE2KSAqLworI2RlZmluZSBGQ1JfVFhUSAkweDIwIC8qIFR4IEZJRk8gdGhyZXNob2xkIChzZXQgdG8gMTcpICovCisKKyNkZWZpbmUgRUlSCQkweDAyIC8qIChyZWFkIG9ubHkpICovCisjZGVmaW5lIEVJUl9SWEhETF9FVgkweDAxCisjZGVmaW5lIEVJUl9UWExETF9FViAgICAweDAyCisjZGVmaW5lIEVJUl9MU19FVgkweDA0CisjZGVmaW5lIEVJUl9ETUFfRVYJMHgxMAorI2RlZmluZSBFSVJfVFhFTVBfRVYJMHgyMAorI2RlZmluZSBFSVJfU0ZJRl9FViAgICAgMHg0MAorI2RlZmluZSBFSVJfVE1SX0VWICAgICAgMHg4MAorCisjZGVmaW5lIExDUiAgICAgICAgICAgICAweDAzIC8qIExpbmsgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBMQ1JfV0xTXzggICAgICAgMHgwMyAvKiA4IGJpdHMgKi8KKworI2RlZmluZSBCU1IgCSAgICAgICAgMHgwMyAvKiBCYW5rIHNlbGVjdCByZWdpc3RlciAqLworI2RlZmluZSBCU1JfQktTRSAgICAgICAgMHg4MAorI2RlZmluZSBCQU5LMCAJICAgICAgICBMQ1JfV0xTXzggLyogTXVzdCBtYWtlIHN1cmUgdGhhdCB3ZSBzZXQgOE4xICovCisjZGVmaW5lIEJBTksxCSAgICAgICAgMHg4MAorI2RlZmluZSBCQU5LMgkgICAgICAgIDB4ZTAKKyNkZWZpbmUgQkFOSzMJICAgICAgICAweGU0CisjZGVmaW5lIEJBTks0CSAgICAgICAgMHhlOAorI2RlZmluZSBCQU5LNQkgICAgICAgIDB4ZWMKKyNkZWZpbmUgQkFOSzYJICAgICAgICAweGYwCisjZGVmaW5lIEJBTks3ICAgICAJMHhmNAorCisjZGVmaW5lIE1DUgkJMHgwNCAvKiBNb2RlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUNSX01PREVfTUFTSwl+KDB4ZDApCisjZGVmaW5lIE1DUl9VQVJUICAgICAgICAweDAwCisjZGVmaW5lIE1DUl9SRVNFUlZFRCAgCTB4MjAJCisjZGVmaW5lIE1DUl9TSEFSUF9JUiAgICAweDQwCisjZGVmaW5lIE1DUl9TSVIgICAgICAgICAweDYwCisjZGVmaW5lIE1DUl9NSVIgIAkweDgwCisjZGVmaW5lIE1DUl9GSVIJCTB4YTAKKyNkZWZpbmUgTUNSX0NFSVIgICAgICAgIDB4YjAKKyNkZWZpbmUgTUNSX0lSX1BMUyAgICAgIDB4MTAKKyNkZWZpbmUgTUNSX0RNQV9FTgkweDA0CisjZGVmaW5lIE1DUl9FTl9JUlEJMHgwOAorI2RlZmluZSBNQ1JfVFhfREZSCTB4MDgKKworI2RlZmluZSBMU1IgICAgICAgICAgICAgMHgwNSAvKiBMaW5rIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBMU1JfUlhEQSAgICAgICAgMHgwMSAvKiBSZWNlaXZlciBkYXRhIGF2YWlsYWJsZSAqLworI2RlZmluZSBMU1JfVFhSRFkgICAgICAgMHgyMCAvKiBUcmFuc21pdHRlciByZWFkeSAqLworI2RlZmluZSBMU1JfVFhFTVAgICAgICAgMHg0MCAvKiBUcmFuc21pdHRlciBlbXB0eSAqLworCisjZGVmaW5lIEFTQ1IgICAgICAgICAgICAweDA3IC8qIEF1eGlsbGFyeSBTdGF0dXMgYW5kIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVNDUl9SWEZfVE9VVCAgIDB4MDEgLyogUnggRklGTyB0aW1lb3V0ICovCisjZGVmaW5lIEFTQ1JfRkVORF9JTkYgICAweDAyIC8qIEZyYW1lIGVuZCBieXRlcyBpbiByeCBGSUZPICovCisjZGVmaW5lIEFTQ1JfU19FT1QgICAgICAweDA0IC8qIFNldCBlbmQgb2YgdHJhbnNtaXNzaW9uICovCisjZGVmaW5lIEFTQ1RfUlhCU1kgICAgICAweDIwIC8qIFJ4IGJ1c3kgKi8KKyNkZWZpbmUgQVNDUl9UWFVSICAgICAgIDB4NDAgLyogVHJhbnNlaXZlciB1bmRlcnJ1biAqLworI2RlZmluZSBBU0NSX0NURSAgICAgICAgMHg4MCAvKiBDbGVhciB0aW1lciBldmVudCAqLworCisvKiBCYW5rIDIgKi8KKyNkZWZpbmUgQkdETCAgICAgICAgICAgIDB4MDAgLyogQmF1ZCBHZW5lcmF0b3IgRGl2aXNvciBQb3J0IChMb3cgQnl0ZSkgKi8KKyNkZWZpbmUgQkdESCAgICAgICAgICAgIDB4MDEgLyogQmF1ZCBHZW5lcmF0b3IgRGl2aXNvciBQb3J0IChIaWdoIEJ5dGUpICovCisKKyNkZWZpbmUgRUNSMQkJMHgwMiAvKiBFeHRlbmRlZCBDb250cm9sIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgRUNSMV9FWFRfU0wJMHgwMSAvKiBFeHRlbmRlZCBNb2RlIFNlbGVjdCAqLworI2RlZmluZSBFQ1IxX0RNQU5GCTB4MDIgLyogRE1BIEZhaXJuZXNzICovCisjZGVmaW5lIEVDUjFfRE1BVEggICAgICAweDA0IC8qIERNQSBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgRUNSMV9ETUFTV1AJMHgwOCAvKiBETUEgU3dhcCAqLworCisjZGVmaW5lIEVYQ1IyCQkweDA0CisjZGVmaW5lIEVYQ1IyX1RGU0laCTB4MDEgLyogUnggRklGTyBzaXplID0gMzIgKi8KKyNkZWZpbmUgRVhDUjJfUkZTSVoJMHgwNCAvKiBUeCBGSUZPIHNpemUgPSAzMiAqLworCisjZGVmaW5lIFRYRkxWICAgICAgICAgICAweDA2IC8qIFR4IEZJRk8gbGV2ZWwgKi8KKyNkZWZpbmUgUlhGTFYgICAgICAgICAgIDB4MDcgLyogUnggRklGTyBsZXZlbCAqLworCisvKiBCYW5rIDMgKi8KKyNkZWZpbmUgTUlECQkweDAwCisKKy8qIEJhbmsgNCAqLworI2RlZmluZSBUTVJMICAgICAgICAgICAgMHgwMCAvKiBUaW1lciBsb3cgYnl0ZSAqLworI2RlZmluZSBUTVJIICAgICAgICAgICAgMHgwMSAvKiBUaW1lciBoaWdoIGJ5dGUgKi8KKyNkZWZpbmUgSVJDUjEgICAgICAgICAgIDB4MDIgLyogSW5mcmFyZWQgY29udHJvbCByZWdpc3RlciAxICovCisjZGVmaW5lIElSQ1IxX1RNUl9FTiAgICAweDAxIC8qIFRpbWVyIGVuYWJsZSAqLworCisjZGVmaW5lIFRGUkxMCQkweDA0CisjZGVmaW5lIFRGUkxICQkweDA1CisjZGVmaW5lIFJGUkxMCQkweDA2CisjZGVmaW5lIFJGUkxICQkweDA3CisKKy8qIEJhbmsgNSAqLworI2RlZmluZSBJUkNSMiAgICAgICAgICAgMHgwNCAvKiBJbmZyYXJlZCBjb250cm9sIHJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgSVJDUjJfTURSUyAgICAgIDB4MDQgLyogTUlSIGRhdGEgcmF0ZSBzZWxlY3QgKi8KKyNkZWZpbmUgSVJDUjJfRkVORF9NRCAgIDB4MjAgLyogKi8KKworI2RlZmluZSBGUk1fU1QgICAgICAgICAgMHgwNSAvKiBGcmFtZSBzdGF0dXMgRklGTyAqLworI2RlZmluZSBGUk1fU1RfVkxEICAgICAgMHg4MCAvKiBGcmFtZSBzdGF0dXMgRklGTyBkYXRhIHZhbGlkICovCisjZGVmaW5lIEZSTV9TVF9FUlJfTVNLICAweDVmCisjZGVmaW5lIEZSTV9TVF9MT1NUX0ZSICAweDQwIC8qIEZyYW1lIGxvc3QgKi8KKyNkZWZpbmUgRlJNX1NUX01BWF9MRU4gIDB4MTAgLyogTWF4IGZyYW1lIGxlbiBleGNlZWRlZCAqLworI2RlZmluZSBGUk1fU1RfUEhZX0VSUiAgMHgwOCAvKiBQaHlzaWNhbCBsYXllciBlcnJvciAqLworI2RlZmluZSBGUk1fU1RfQkFEX0NSQyAgMHgwNCAKKyNkZWZpbmUgRlJNX1NUX09WUjEgICAgIDB4MDIgLyogUnggRklGTyBvdmVycnVuICovCisjZGVmaW5lIEZSTV9TVF9PVlIyICAgICAweDAxIC8qIEZyYW1lIHN0YXR1cyBGSUZPIG92ZXJydW4gKi8KKworI2RlZmluZSBSRkxGTCAgICAgICAgICAgMHgwNgorI2RlZmluZSBSRkxGSCAgICAgICAgICAgMHgwNworCisvKiBCYW5rIDYgKi8KKyNkZWZpbmUgSVJfQ0ZHMgkJMHgwMAorI2RlZmluZSBJUl9DRkcyX0RJU19DUkMJMHgwMgorCisvKiBCYW5rIDcgKi8KKyNkZWZpbmUgSVJNX0NSCQkweDA3IC8qIEluZnJhcmVkIG1vZHVsZSBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIElSTV9DUl9JUlhfTVNMCTB4NDAKKyNkZWZpbmUgSVJNX0NSX0FGX01OVCAgIDB4ODAgLyogQXV0b21hdGljIGZvcm1hdCAqLworCisvKiBOU0MgY2hpcCBpbmZvcm1hdGlvbiAqLworc3RydWN0IG5zY19jaGlwIHsKKwljaGFyICpuYW1lOyAgICAgICAgICAvKiBOYW1lIG9mIGNoaXBzZXQgKi8KKwlpbnQgY2ZnWzNdOyAgICAgICAgICAvKiBDb25maWcgcmVnaXN0ZXJzICovCisJdV9pbnQ4X3QgY2lkX2luZGV4OyAgLyogQ2hpcCBpZGVudGlmaWNhdGlvbiBpbmRleCByZWcgKi8KKwl1X2ludDhfdCBjaWRfdmFsdWU7ICAvKiBDaGlwIGlkZW50aWZpY2F0aW9uIGV4cGVjdGVkIHZhbHVlICovCisJdV9pbnQ4X3QgY2lkX21hc2s7ICAgLyogQ2hpcCBpZGVudGlmaWNhdGlvbiByZXZpc2lvbiBtYXNrICovCisKKwkvKiBGdW5jdGlvbnMgZm9yIHByb2JpbmcgYW5kIGluaXRpYWxpemluZyB0aGUgc3BlY2lmaWMgY2hpcCAqLworCWludCAoKnByb2JlKShzdHJ1Y3QgbnNjX2NoaXAgKmNoaXAsIGNoaXBpb190ICppbmZvKTsKKwlpbnQgKCppbml0KShzdHJ1Y3QgbnNjX2NoaXAgKmNoaXAsIGNoaXBpb190ICppbmZvKTsKK307Cit0eXBlZGVmIHN0cnVjdCBuc2NfY2hpcCBuc2NfY2hpcF90OworCisvKiBGb3Igc3RvcmluZyBlbnRyaWVzIGluIHRoZSBzdGF0dXMgRklGTyAqLworc3RydWN0IHN0X2ZpZm9fZW50cnkgeworCWludCBzdGF0dXM7CisJaW50IGxlbjsKK307CisKKyNkZWZpbmUgTUFYX1RYX1dJTkRPVyA3CisjZGVmaW5lIE1BWF9SWF9XSU5ET1cgNworCitzdHJ1Y3Qgc3RfZmlmbyB7CisJc3RydWN0IHN0X2ZpZm9fZW50cnkgZW50cmllc1tNQVhfUlhfV0lORE9XXTsKKwlpbnQgcGVuZGluZ19ieXRlczsKKwlpbnQgaGVhZDsKKwlpbnQgdGFpbDsKKwlpbnQgbGVuOworfTsKKworc3RydWN0IGZyYW1lX2NiIHsKKwl2b2lkICpzdGFydDsgLyogU3RhcnQgb2YgZnJhbWUgaW4gRE1BIG1lbSAqLworCWludCBsZW47ICAgICAvKiBMZW5naHQgb2YgZnJhbWUgaW4gRE1BIG1lbSAqLworfTsKKworc3RydWN0IHR4X2ZpZm8geworCXN0cnVjdCBmcmFtZV9jYiBxdWV1ZVtNQVhfVFhfV0lORE9XXTsgLyogSW5mbyBhYm91dCBmcmFtZXMgaW4gcXVldWUgKi8KKwlpbnQgICAgICAgICAgICAgcHRyOyAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnRseSBiZWluZyBzZW50ICovCisJaW50ICAgICAgICAgICAgIGxlbjsgICAgICAgICAgICAgICAgICAvKiBMZW5naHQgb2YgcXVldWUgKi8KKwlpbnQgICAgICAgICAgICAgZnJlZTsgICAgICAgICAgICAgICAgIC8qIE5leHQgZnJlZSBzbG90ICovCisJdm9pZCAgICAgICAgICAgKnRhaWw7ICAgICAgICAgICAgICAgICAvKiBOZXh0IGZyZWUgc3RhcnQgaW4gRE1BIG1lbSAqLworfTsKKworLyogUHJpdmF0ZSBkYXRhIGZvciBlYWNoIGluc3RhbmNlICovCitzdHJ1Y3QgbnNjX2lyY2NfY2IgeworCXN0cnVjdCBzdF9maWZvIHN0X2ZpZm87ICAgIC8qIEluZm8gYWJvdXQgcmVjZWl2ZWQgZnJhbWVzICovCisJc3RydWN0IHR4X2ZpZm8gdHhfZmlmbzsgICAgLyogSW5mbyBhYm91dCBmcmFtZXMgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KKworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7ICAgICAvKiBZZXMhIHdlIGFyZSBzb21lIGtpbmQgb2YgbmV0ZGV2aWNlICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJCisJc3RydWN0IGlybGFwX2NiICppcmxhcDsgICAgLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLworCXN0cnVjdCBxb3NfaW5mbyBxb3M7ICAgICAgIC8qIFFvUyBjYXBhYmlsaXRpZXMgZm9yIHRoaXMgZGV2aWNlICovCisJCisJY2hpcGlvX3QgaW87ICAgICAgICAgICAgICAgLyogSXJEQSBjb250cm9sbGVyIGluZm9ybWF0aW9uICovCisJaW9idWZmX3QgdHhfYnVmZjsgICAgICAgICAgLyogVHJhbnNtaXQgYnVmZmVyICovCisJaW9idWZmX3QgcnhfYnVmZjsgICAgICAgICAgLyogUmVjZWl2ZSBidWZmZXIgKi8KKwlkbWFfYWRkcl90IHR4X2J1ZmZfZG1hOworCWRtYV9hZGRyX3QgcnhfYnVmZl9kbWE7CisKKwlfX3U4IGllcjsgICAgICAgICAgICAgICAgICAvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyICovCisKKwlzdHJ1Y3QgdGltZXZhbCBzdGFtcDsKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisKKwlzcGlubG9ja190IGxvY2s7ICAgICAgICAgICAvKiBGb3Igc2VyaWFsaXppbmcgb3BlcmF0aW9ucyAqLworCQorCV9fdTMyIG5ld19zcGVlZDsKKwlpbnQgaW5kZXg7ICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBpbmRleCAqLworCisgICAgICAgIHN0cnVjdCBwbV9kZXYgKmRldjsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzd2l0Y2hfYmFuayhpbnQgaW9iYXNlLCBpbnQgYmFuaykKK3sKKwkJb3V0YihiYW5rLCBpb2Jhc2UrQlNSKTsKK30KKworI2VuZGlmIC8qIE5TQ19JUkNDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvb2xkX2JlbGtpbi1zaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvb2xkX2JlbGtpbi1zaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzIyYzczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9vbGRfYmVsa2luLXNpci5jCkBAIC0wLDAgKzEsMTU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIG9sZF9iZWxraW4uYworICogVmVyc2lvbjogICAgICAgMS4xCisgKiBEZXNjcmlwdGlvbjogICBEcml2ZXIgZm9yIHRoZSBCZWxraW4gKG9sZCkgU21hcnRCZWFtIGRvbmdsZQorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLi4uCisgKiBBdXRob3I6ICAgICAgICBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CisgKiBDcmVhdGVkIGF0OiAgICAyMi8xMS85OQorICogTW9kaWZpZWQgYXQ6ICAgRnJpIERlYyAxNyAwOToxMzozMiAxOTk5CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTkgSmVhbiBUb3VycmlsaGVzLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqICAgICBNQSAwMjExMS0xMzA3IFVTQQorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisvLyAjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKworI2luY2x1ZGUgInNpci1kZXYuaCIKKworLyoKKyAqIEJlbGtpbiBpcyBzZWxsaW5nIGEgZG9uZ2xlIGNhbGxlZCB0aGUgU21hcnRCZWFtLgorICogSW4gZmFjdCwgdGhlcmUgaXMgdHdvIGhhcmR3YXJlIHZlcnNpb24gb2YgdGhpcyBkb25nbGUsIG9mIGNvdXJzZSB3aXRoCisgKiB0aGUgc2FtZSBuYW1lIGFuZCBsb29raW5nIHRoZSBleGFjdGx5IHNhbWUgKGdycnIuLi4pLgorICogSSBndWVzcyB0aGF0IEkndmUgZ290IHRoZSBvbGQgb25lLCBiZWNhdXNlIGluc2lkZSBJIGRvbid0IGhhdmUKKyAqIGEganVtcGVyIGZvciBJckRBL0FTSy4uLgorICoKKyAqIEFzIGZhciBhcyBJIGNhbiBtYWtlIGl0IGZyb20gaW5mbyBvbiB0aGVpciB3ZWIgc2l0ZSwgdGhlIG9sZCBkb25nbGUgCisgKiBzdXBwb3J0IG9ubHkgOTYwMCBiL3MsIHdoaWNoIG1ha2Ugb3VyIGxpZmUgbXVjaCBzaW1wbGVyIGFzIGZhciBhcworICogdGhlIGRyaXZlciBpcyBjb25jZXJuZWQsIGJ1dCB5b3UgbWlnaHQgbm90IGxpa2UgaXQgdmVyeSBtdWNoIDstKQorICogVGhlIG5ldyBTbWFydEJlYW0gZG9lcyAxMTUga2IvcywgYW5kIEkndmUgbm90IHRlc3RlZCBpdC4uLgorICoKKyAqIEJlbGtpbiBjbGFpbSB0aGF0IHRoZSBjb3JyZWN0IGRyaXZlciBmb3IgdGhlIG9sZCBkb25nbGUgKGluIFdpbmRvd3MpCisgKiBpcyB0aGUgZ2VuZXJpYyBQYXJhbGxheCA5NTAwYSBkcml2ZXIsIGJ1dCB0aGUgTGludXggTGl0ZUxpbmsgZHJpdmVyCisgKiBmYWlscyBmb3IgbWUgKHByb2JhYmx5IGJlY2F1c2UgTGludXgtSXJEQSBkb2Vzbid0IHJhdGUgZmFsbGJhY2spLAorICogc28gSSBjcmVhdGVkIHRoaXMgcmVhbGx5IGR1bWIgZHJpdmVyLi4uCisgKgorICogSW4gZmFjdCwgdGhpcyBkcml2ZXIgZG9lc24ndCBkbyBtdWNoLiBUaGUgb25seSB0aGluZyBpdCBkb2VzIGlzIHRvCisgKiBwcmV2ZW50IExpbnV4LUlyREEgdG8gdXNlIGFueSBvdGhlciBzcGVlZCB0aGFuIDk2MDAgYi9zIDstKSBUaGlzCisgKiBkcml2ZXIgaXMgY2FsbGVkICJvbGRfYmVsa2luIiBzbyB0aGF0IHdoZW4gdGhlIG5ldyBTbWFydEJlYW0gaXMgc3VwcG9ydGVkCisgKiBpdHMgZHJpdmVyIGNhbiBiZSBjYWxsZWQgImJlbGtpbiIgaW5zdGVhZCBvZiAibmV3X2JlbGtpbiIuCisgKgorICogTm90ZSA6IHRoaXMgZHJpdmVyIHdhcyB3cml0dGVuIHdpdGhvdXQgYW55IGluZm8vaGVscCBmcm9tIEJlbGtpbiwKKyAqIHNvIGEgbG90IG9mIGluZm8gaGVyZSBtaWdodCBiZSB0b3RhbGx5IHdyb25nLiBCbGFtZSBtZSA7LSkKKyAqLworCitzdGF0aWMgaW50IG9sZF9iZWxraW5fb3BlbihzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKK3N0YXRpYyBpbnQgb2xkX2JlbGtpbl9jbG9zZShzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKK3N0YXRpYyBpbnQgb2xkX2JlbGtpbl9jaGFuZ2Vfc3BlZWQoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpOworc3RhdGljIGludCBvbGRfYmVsa2luX3Jlc2V0KHN0cnVjdCBzaXJfZGV2ICpkZXYpOworCitzdGF0aWMgc3RydWN0IGRvbmdsZV9kcml2ZXIgb2xkX2JlbGtpbiA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRyaXZlcl9uYW1lCT0gIk9sZCBCZWxraW4gU21hcnRCZWFtIiwKKwkudHlwZQkJPSBJUkRBX09MRF9CRUxLSU5fRE9OR0xFLAorCS5vcGVuCQk9IG9sZF9iZWxraW5fb3BlbiwKKwkuY2xvc2UJCT0gb2xkX2JlbGtpbl9jbG9zZSwKKwkucmVzZXQJCT0gb2xkX2JlbGtpbl9yZXNldCwKKwkuc2V0X3NwZWVkCT0gb2xkX2JlbGtpbl9jaGFuZ2Vfc3BlZWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBvbGRfYmVsa2luX3Npcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlyZGFfcmVnaXN0ZXJfZG9uZ2xlKCZvbGRfYmVsa2luKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG9sZF9iZWxraW5fc2lyX2NsZWFudXAodm9pZCkKK3sKKwlpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKCZvbGRfYmVsa2luKTsKK30KKworc3RhdGljIGludCBvbGRfYmVsa2luX29wZW4oc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcW9zX2luZm8gKnFvcyA9ICZkZXYtPnFvczsKKworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBQb3dlciBvbiBkb25nbGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBUUlVFLCBUUlVFKTsKKworCS8qIE5vdCB0b28gZmFzdCwgcGxlYXNlLi4uICovCisJcW9zLT5iYXVkX3JhdGUuYml0cyAmPSBJUl85NjAwOworCS8qIE5lZWRzIGF0IGxlYXN0IDEwIG1zICh0b3RhbGx5IHdpbGQgZ3Vlc3MsIGNhbiBkbyBwcm9iYWJseSBiZXR0ZXIpICovCisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDAxOworCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUocW9zKTsKKworCS8qIGlyZGEgdGhyZWFkIHdhaXRzIDUwIG1zZWMgZm9yIHBvd2VyIHNldHRsaW5nICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbGRfYmVsa2luX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFBvd2VyIG9mZiBkb25nbGUgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgRkFMU0UpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBvbGRfYmVsa2luX2NoYW5nZV9zcGVlZCAodGFzaykKKyAqCisgKiAgICBXaXRoIG9ubHkgb25lIHNwZWVkIGF2YWlsYWJsZSwgbm90IG11Y2ggdG8gZG8uLi4KKyAqLworc3RhdGljIGludCBvbGRfYmVsa2luX2NoYW5nZV9zcGVlZChzdHJ1Y3Qgc2lyX2RldiAqZGV2LCB1bnNpZ25lZCBzcGVlZCkKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJZGV2LT5zcGVlZCA9IDk2MDA7CisJcmV0dXJuIChzcGVlZD09ZGV2LT5zcGVlZCkgPyAwIDogLUVJTlZBTDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG9sZF9iZWxraW5fcmVzZXQgKHRhc2spCisgKgorICogICAgICBSZXNldCB0aGUgT2xkLUJlbGtpbiB0eXBlIGRvbmdsZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgb2xkX2JlbGtpbl9yZXNldChzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBUaGlzIGRvbmdsZXMgc3BlZWQgImRlZmF1bHRzIiB0byA5NjAwIGJwcyA7LSkgKi8KKwlkZXYtPnNwZWVkID0gOTYwMDsKKworCXJldHVybiAwOworfQorCitNT0RVTEVfQVVUSE9SKCJKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJlbGtpbiAob2xkKSBTbWFydEJlYW0gZG9uZ2xlIGRyaXZlciIpOwkKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXJkYS1kb25nbGUtNyIpOyAvKiBJUkRBX09MRF9CRUxLSU5fRE9OR0xFICovCisKK21vZHVsZV9pbml0KG9sZF9iZWxraW5fc2lyX2luaXQpOworbW9kdWxlX2V4aXQob2xkX2JlbGtpbl9zaXJfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL29sZF9iZWxraW4uYyBiL2RyaXZlcnMvbmV0L2lyZGEvb2xkX2JlbGtpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZjgxZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL29sZF9iZWxraW4uYwpAQCAtMCwwICsxLDE2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICBvbGRfYmVsa2luLmMKKyAqIFZlcnNpb246ICAgICAgIDEuMQorICogRGVzY3JpcHRpb246ICAgRHJpdmVyIGZvciB0aGUgQmVsa2luIChvbGQpIFNtYXJ0QmVhbSBkb25nbGUKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4uLgorICogQXV0aG9yOiAgICAgICAgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgorICogQ3JlYXRlZCBhdDogICAgMjIvMTEvOTkKKyAqIE1vZGlmaWVkIGF0OiAgIEZyaSBEZWMgMTcgMDk6MTM6MzIgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5IEplYW4gVG91cnJpbGhlcywgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisgKiAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgKiAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisKKy8qCisgKiBCZWxraW4gaXMgc2VsbGluZyBhIGRvbmdsZSBjYWxsZWQgdGhlIFNtYXJ0QmVhbS4KKyAqIEluIGZhY3QsIHRoZXJlIGlzIHR3byBoYXJkd2FyZSB2ZXJzaW9uIG9mIHRoaXMgZG9uZ2xlLCBvZiBjb3Vyc2Ugd2l0aAorICogdGhlIHNhbWUgbmFtZSBhbmQgbG9va2luZyB0aGUgZXhhY3RseSBzYW1lIChncnJyLi4uKS4KKyAqIEkgZ3Vlc3MgdGhhdCBJJ3ZlIGdvdCB0aGUgb2xkIG9uZSwgYmVjYXVzZSBpbnNpZGUgSSBkb24ndCBoYXZlCisgKiBhIGp1bXBlciBmb3IgSXJEQS9BU0suLi4KKyAqCisgKiBBcyBmYXIgYXMgSSBjYW4gbWFrZSBpdCBmcm9tIGluZm8gb24gdGhlaXIgd2ViIHNpdGUsIHRoZSBvbGQgZG9uZ2xlIAorICogc3VwcG9ydCBvbmx5IDk2MDAgYi9zLCB3aGljaCBtYWtlIG91ciBsaWZlIG11Y2ggc2ltcGxlciBhcyBmYXIgYXMKKyAqIHRoZSBkcml2ZXIgaXMgY29uY2VybmVkLCBidXQgeW91IG1pZ2h0IG5vdCBsaWtlIGl0IHZlcnkgbXVjaCA7LSkKKyAqIFRoZSBuZXcgU21hcnRCZWFtIGRvZXMgMTE1IGtiL3MsIGFuZCBJJ3ZlIG5vdCB0ZXN0ZWQgaXQuLi4KKyAqCisgKiBCZWxraW4gY2xhaW0gdGhhdCB0aGUgY29ycmVjdCBkcml2ZXIgZm9yIHRoZSBvbGQgZG9uZ2xlIChpbiBXaW5kb3dzKQorICogaXMgdGhlIGdlbmVyaWMgUGFyYWxsYXggOTUwMGEgZHJpdmVyLCBidXQgdGhlIExpbnV4IExpdGVMaW5rIGRyaXZlcgorICogZmFpbHMgZm9yIG1lIChwcm9iYWJseSBiZWNhdXNlIExpbnV4LUlyREEgZG9lc24ndCByYXRlIGZhbGxiYWNrKSwKKyAqIHNvIEkgY3JlYXRlZCB0aGlzIHJlYWxseSBkdW1iIGRyaXZlci4uLgorICoKKyAqIEluIGZhY3QsIHRoaXMgZHJpdmVyIGRvZXNuJ3QgZG8gbXVjaC4gVGhlIG9ubHkgdGhpbmcgaXQgZG9lcyBpcyB0bworICogcHJldmVudCBMaW51eC1JckRBIHRvIHVzZSBhbnkgb3RoZXIgc3BlZWQgdGhhbiA5NjAwIGIvcyA7LSkgVGhpcworICogZHJpdmVyIGlzIGNhbGxlZCAib2xkX2JlbGtpbiIgc28gdGhhdCB3aGVuIHRoZSBuZXcgU21hcnRCZWFtIGlzIHN1cHBvcnRlZAorICogaXRzIGRyaXZlciBjYW4gYmUgY2FsbGVkICJiZWxraW4iIGluc3RlYWQgb2YgIm5ld19iZWxraW4iLgorICoKKyAqIE5vdGUgOiB0aGlzIGRyaXZlciB3YXMgd3JpdHRlbiB3aXRob3V0IGFueSBpbmZvL2hlbHAgZnJvbSBCZWxraW4sCisgKiBzbyBhIGxvdCBvZiBpbmZvIGhlcmUgbWlnaHQgYmUgdG90YWxseSB3cm9uZy4gQmxhbWUgbWUgOy0pCisgKi8KKworLyogTGV0J3MgZ3Vlc3MgKi8KKyNkZWZpbmUgTUlOX0RFTEFZIDI1ICAgICAgLyogMTUgdXMsIGJ1dCB3YWl0IGEgbGl0dGxlIG1vcmUgdG8gYmUgc3VyZSAqLworCitzdGF0aWMgdm9pZCBvbGRfYmVsa2luX29wZW4oZG9uZ2xlX3QgKnNlbGYsIHN0cnVjdCBxb3NfaW5mbyAqcW9zKTsKK3N0YXRpYyB2b2lkIG9sZF9iZWxraW5fY2xvc2UoZG9uZ2xlX3QgKnNlbGYpOworc3RhdGljIGludCAgb2xkX2JlbGtpbl9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CitzdGF0aWMgaW50ICBvbGRfYmVsa2luX3Jlc2V0KHN0cnVjdCBpcmRhX3Rhc2sgKnRhc2spOworCisvKiBUaGVzZSBhcmUgdGhlIGJhdWRyYXRlcyBzdXBwb3J0ZWQgKi8KKy8qIHN0YXRpYyBfX3UzMiBiYXVkX3JhdGVzW10gPSB7IDk2MDAgfTsgKi8KKworc3RhdGljIHN0cnVjdCBkb25nbGVfcmVnIGRvbmdsZSA9IHsKKwkudHlwZSA9IElSREFfT0xEX0JFTEtJTl9ET05HTEUsCisJLm9wZW4gPSBvbGRfYmVsa2luX29wZW4sCisJLmNsb3NlID0gb2xkX2JlbGtpbl9jbG9zZSwKKwkucmVzZXQgPSBvbGRfYmVsa2luX3Jlc2V0LAorCS5jaGFuZ2Vfc3BlZWQgPSBvbGRfYmVsa2luX2NoYW5nZV9zcGVlZCwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9sZF9iZWxraW5faW5pdCh2b2lkKQoreworCXJldHVybiBpcmRhX2RldmljZV9yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvbGRfYmVsa2luX2NsZWFudXAodm9pZCkKK3sKKwlpcmRhX2RldmljZV91bnJlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKK30KKworc3RhdGljIHZvaWQgb2xkX2JlbGtpbl9vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcykKK3sKKwkvKiBOb3QgdG9vIGZhc3QsIHBsZWFzZS4uLiAqLworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfOTYwMDsKKwkvKiBOZWVkcyBhdCBsZWFzdCAxMCBtcyAodG90YWxseSB3aWxkIGd1ZXNzLCBjYW4gZG8gcHJvYmFibHkgYmV0dGVyKSAqLworCXFvcy0+bWluX3R1cm5fdGltZS5iaXRzID0gMHgwMTsKK30KKworc3RhdGljIHZvaWQgb2xkX2JlbGtpbl9jbG9zZShkb25nbGVfdCAqc2VsZikKK3sKKwkvKiBQb3dlciBvZmYgZG9uZ2xlICovCisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBGQUxTRSwgRkFMU0UpOworfQorCisvKgorICogRnVuY3Rpb24gb2xkX2JlbGtpbl9jaGFuZ2Vfc3BlZWQgKHRhc2spCisgKgorICogICAgV2l0aCBvbmx5IG9uZSBzcGVlZCBhdmFpbGFibGUsIG5vdCBtdWNoIHRvIGRvLi4uCisgKi8KK3N0YXRpYyBpbnQgb2xkX2JlbGtpbl9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfRE9ORSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIG9sZF9iZWxraW5fcmVzZXQgKHRhc2spCisgKgorICogICAgICBSZXNldCB0aGUgT2xkLUJlbGtpbiB0eXBlIGRvbmdsZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgb2xkX2JlbGtpbl9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCWRvbmdsZV90ICpzZWxmID0gKGRvbmdsZV90ICopIHRhc2stPmluc3RhbmNlOworCisJLyogUG93ZXIgb24gZG9uZ2xlICovCisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKworCS8qIFNsZWVwIGEgbWluaW11bSBvZiAxNSB1cyAqLworCXVkZWxheShNSU5fREVMQVkpOworCisJLyogVGhpcyBkb25nbGVzIHNwZWVkICJkZWZhdWx0cyIgdG8gOTYwMCBicHMgOy0pICovCisJc2VsZi0+c3BlZWQgPSA5NjAwOworCisJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9BVVRIT1IoIkplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmVsa2luIChvbGQpIFNtYXJ0QmVhbSBkb25nbGUgZHJpdmVyIik7CQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS03Iik7IC8qIElSREFfT0xEX0JFTEtJTl9ET05HTEUgKi8KKworLyoKKyAqIEZ1bmN0aW9uIGluaXRfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIEluaXRpYWxpemUgT2xkLUJlbGtpbiBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9pbml0KG9sZF9iZWxraW5faW5pdCk7CisKKy8qCisgKiBGdW5jdGlvbiBjbGVhbnVwX21vZHVsZSAodm9pZCkKKyAqCisgKiAgICBDbGVhbnVwIE9sZC1CZWxraW4gbW9kdWxlCisgKgorICovCittb2R1bGVfZXhpdChvbGRfYmVsa2luX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zYTExMDBfaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvc2ExMTAwX2lyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlmNTA5NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc2ExMTAwX2lyLmMKQEAgLTAsMCArMSwxMDQ1IEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvbmV0L2lyZGEvc2ExMTAwX2lyLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgSW5mcmEtcmVkIGRyaXZlciBmb3IgdGhlIFN0cm9uZ0FSTSBTQTExMDAgZW1iZWRkZWQgbWljcm9wcm9jZXNzb3IKKyAqCisgKiAgTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIFNBMTExMSdzIERNQSBidWdzIGluIGhlcmUsCisgKiAgc28gd2UgdXNlIHRoZSBzdHJhaWdodCBmb3J3YXJkIGRtYV9tYXBfKiBmdW5jdGlvbnMgd2l0aCBhIG51bGwgcG9pbnRlci4KKyAqCisgKiAgVGhpcyBkcml2ZXIgdGFrZXMgb25lIGtlcm5lbCBjb21tYW5kIGxpbmUgcGFyYW1ldGVyLCBzYTExMDBpcj0sIHdpdGgKKyAqICB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisgKgltYXhfcmF0ZTpiYXVkcmF0ZQktIHNldCB0aGUgbWF4aW11bSBiYXVkIHJhdGUKKyAqCXBvd2VyX2xldmU6bGV2ZWwJLSBzZXQgdGhlIHRyYW5zbWl0dGVyIHBvd2VyIGxldmVsCisgKgl0eF9scG06MHwxCQktIHNldCB0cmFuc21pdCBsb3cgcG93ZXIgbW9kZQorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvd3JhcHBlci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lyZGEuaD4KKworc3RhdGljIGludCBwb3dlcl9sZXZlbCA9IDM7CitzdGF0aWMgaW50IHR4X2xwbTsKK3N0YXRpYyBpbnQgbWF4X3JhdGUgPSA0MDAwMDAwOworCitzdHJ1Y3Qgc2ExMTAwX2lyZGEgeworCXVuc2lnbmVkIGNoYXIJCWhzY3IwOworCXVuc2lnbmVkIGNoYXIJCXV0Y3I0OworCXVuc2lnbmVkIGNoYXIJCXBvd2VyOworCXVuc2lnbmVkIGNoYXIJCW9wZW47CisKKwlpbnQJCQlzcGVlZDsKKwlpbnQJCQluZXdzcGVlZDsKKworCXN0cnVjdCBza19idWZmCQkqdHhza2I7CisJc3RydWN0IHNrX2J1ZmYJCSpyeHNrYjsKKwlkbWFfYWRkcl90CQl0eGJ1Zl9kbWE7CisJZG1hX2FkZHJfdAkJcnhidWZfZG1hOworCWRtYV9yZWdzX3QJCSp0eGRtYTsKKwlkbWFfcmVnc190CQkqcnhkbWE7CisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXN0cnVjdCBpcmRhX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCBpcmxhcF9jYgkJKmlybGFwOworCXN0cnVjdCBxb3NfaW5mbwkJcW9zOworCisJaW9idWZmX3QJCXR4X2J1ZmY7CisJaW9idWZmX3QJCXJ4X2J1ZmY7Cit9OworCisjZGVmaW5lIElTX0ZJUihzaSkJCSgoc2kpLT5zcGVlZCA+PSA0MDAwMDAwKQorCisjZGVmaW5lIEhQU0lSX01BWF9SWExFTgkJMjA0NworCisvKgorICogQWxsb2NhdGUgYW5kIG1hcCB0aGUgcmVjZWl2ZSBidWZmZXIsIHVubGVzcyBpdCBpcyBhbHJlYWR5IGFsbG9jYXRlZC4KKyAqLworc3RhdGljIGludCBzYTExMDBfaXJkYV9yeF9hbGxvYyhzdHJ1Y3Qgc2ExMTAwX2lyZGEgKnNpKQoreworCWlmIChzaS0+cnhza2IpCisJCXJldHVybiAwOworCisJc2ktPnJ4c2tiID0gYWxsb2Nfc2tiKEhQU0lSX01BWF9SWExFTiArIDEsIEdGUF9BVE9NSUMpOworCisJaWYgKCFzaS0+cnhza2IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzYTExMDBfaXI6IG91dCBvZiBtZW1vcnkgZm9yIFJYIFNLQlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qCisJICogQWxpZ24gYW55IElQIGhlYWRlcnMgdGhhdCBtYXkgYmUgY29udGFpbmVkCisJICogd2l0aGluIHRoZSBmcmFtZS4KKwkgKi8KKwlza2JfcmVzZXJ2ZShzaS0+cnhza2IsIDEpOworCisJc2ktPnJ4YnVmX2RtYSA9IGRtYV9tYXBfc2luZ2xlKHNpLT5kZXYsIHNpLT5yeHNrYi0+ZGF0YSwKKwkJCQkJSFBTSVJfTUFYX1JYTEVOLAorCQkJCQlETUFfRlJPTV9ERVZJQ0UpOworCXJldHVybiAwOworfQorCisvKgorICogV2Ugd2FudCB0byBnZXQgaGVyZSBhcyBzb29uIGFzIHBvc3NpYmxlLCBhbmQgZ2V0IHRoZSByZWNlaXZlciBzZXR1cC4KKyAqIFdlIHVzZSB0aGUgZXhpc3RpbmcgYnVmZmVyLgorICovCitzdGF0aWMgdm9pZCBzYTExMDBfaXJkYV9yeF9kbWFfc3RhcnQoc3RydWN0IHNhMTEwMF9pcmRhICpzaSkKK3sKKwlpZiAoIXNpLT5yeHNrYikgeworCQlwcmludGsoS0VSTl9FUlIgInNhMTEwMF9pcjogcnggYnVmZmVyIHdlbnQgbWlzc2luZ1xuIik7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIEZpcnN0IGVtcHR5IHJlY2VpdmUgRklGTworCSAqLworCVNlcjJIU0NSMCA9IHNpLT5oc2NyMCB8IEhTQ1IwX0hTU1A7CisKKwkvKgorCSAqIEVuYWJsZSB0aGUgRE1BLCByZWNlaXZlciBhbmQgcmVjZWl2ZSBpbnRlcnJ1cHQuCisJICovCisJc2ExMTAwX2NsZWFyX2RtYShzaS0+cnhkbWEpOworCXNhMTEwMF9zdGFydF9kbWEoc2ktPnJ4ZG1hLCBzaS0+cnhidWZfZG1hLCBIUFNJUl9NQVhfUlhMRU4pOworCVNlcjJIU0NSMCA9IHNpLT5oc2NyMCB8IEhTQ1IwX0hTU1AgfCBIU0NSMF9SWEU7Cit9CisKKy8qCisgKiBTZXQgdGhlIElyREEgY29tbXVuaWNhdGlvbnMgc3BlZWQuCisgKi8KK3N0YXRpYyBpbnQgc2ExMTAwX2lyZGFfc2V0X3NwZWVkKHN0cnVjdCBzYTExMDBfaXJkYSAqc2ksIGludCBzcGVlZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBicmQsIHJldCA9IC1FSU5WQUw7CisKKwlzd2l0Y2ggKHNwZWVkKSB7CisJY2FzZSA5NjAwOgljYXNlIDE5MjAwOgljYXNlIDM4NDAwOgorCWNhc2UgNTc2MDA6CWNhc2UgMTE1MjAwOgorCQlicmQgPSAzNjg2NDAwIC8gKDE2ICogc3BlZWQpIC0gMTsKKworCQkvKgorCQkgKiBTdG9wIHRoZSByZWNlaXZlIERNQS4KKwkJICovCisJCWlmIChJU19GSVIoc2kpKQorCQkJc2ExMTAwX3N0b3BfZG1hKHNpLT5yeGRtYSk7CisKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJCVNlcjJVVENSMyA9IDA7CisJCVNlcjJIU0NSMCA9IEhTQ1IwX1VBUlQ7CisKKwkJU2VyMlVUQ1IxID0gYnJkID4+IDg7CisJCVNlcjJVVENSMiA9IGJyZDsKKworCQkvKgorCQkgKiBDbGVhciBzdGF0dXMgcmVnaXN0ZXIKKwkJICovCisJCVNlcjJVVFNSMCA9IFVUU1IwX1JFQiB8IFVUU1IwX1JCQiB8IFVUU1IwX1JJRDsKKwkJU2VyMlVUQ1IzID0gVVRDUjNfUklFIHwgVVRDUjNfUlhFIHwgVVRDUjNfVFhFOworCisJCWlmIChzaS0+cGRhdGEtPnNldF9zcGVlZCkKKwkJCXNpLT5wZGF0YS0+c2V0X3NwZWVkKHNpLT5kZXYsIHNwZWVkKTsKKworCQlzaS0+c3BlZWQgPSBzcGVlZDsKKworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXJldCA9IDA7CisJCWJyZWFrOworCisJY2FzZSA0MDAwMDAwOgorCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkJc2ktPmhzY3IwID0gMDsKKworCQlTZXIySFNTUjAgPSAweGZmOworCQlTZXIySFNDUjAgPSBzaS0+aHNjcjAgfCBIU0NSMF9IU1NQOworCQlTZXIyVVRDUjMgPSAwOworCisJCXNpLT5zcGVlZCA9IHNwZWVkOworCisJCWlmIChzaS0+cGRhdGEtPnNldF9zcGVlZCkKKwkJCXNpLT5wZGF0YS0+c2V0X3NwZWVkKHNpLT5kZXYsIHNwZWVkKTsKKworCQlzYTExMDBfaXJkYV9yeF9hbGxvYyhzaSk7CisJCXNhMTEwMF9pcmRhX3J4X2RtYV9zdGFydChzaSk7CisKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIENvbnRyb2wgdGhlIHBvd2VyIHN0YXRlIG9mIHRoZSBJckRBIHRyYW5zbWl0dGVyLgorICogU3RhdGU6CisgKiAgMCAtIG9mZgorICogIDEgLSBzaG9ydCByYW5nZSwgbG93ZXN0IHBvd2VyCisgKiAgMiAtIG1lZGl1bSByYW5nZSwgbWVkaXVtIHBvd2VyCisgKiAgMyAtIG1heGltdW0gcmFuZ2UsIGhpZ2ggcG93ZXIKKyAqCisgKiBDdXJyZW50bHksIG9ubHkgYXNzYWJldCBpcyBrbm93biB0byBzdXBwb3J0IHRoaXMuCisgKi8KK3N0YXRpYyBpbnQKK19fc2ExMTAwX2lyZGFfc2V0X3Bvd2VyKHN0cnVjdCBzYTExMDBfaXJkYSAqc2ksIHVuc2lnbmVkIGludCBzdGF0ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpZiAoc2ktPnBkYXRhLT5zZXRfcG93ZXIpCisJCXJldCA9IHNpLT5wZGF0YS0+c2V0X3Bvd2VyKHNpLT5kZXYsIHN0YXRlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludAorc2ExMTAwX3NldF9wb3dlcihzdHJ1Y3Qgc2ExMTAwX2lyZGEgKnNpLCB1bnNpZ25lZCBpbnQgc3RhdGUpCit7CisJaW50IHJldDsKKworCXJldCA9IF9fc2ExMTAwX2lyZGFfc2V0X3Bvd2VyKHNpLCBzdGF0ZSk7CisJaWYgKHJldCA9PSAwKQorCQlzaS0+cG93ZXIgPSBzdGF0ZTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2ExMTAwX2lyZGFfc3RhcnR1cChzdHJ1Y3Qgc2ExMTAwX2lyZGEgKnNpKQoreworCWludCByZXQ7CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IHRoZSBwb3J0cyBmb3IgdGhpcyBkZXZpY2UgYXJlIHNldHVwIGNvcnJlY3RseS4KKwkgKi8KKwlpZiAoc2ktPnBkYXRhLT5zdGFydHVwKQorCQlzaS0+cGRhdGEtPnN0YXJ0dXAoc2ktPmRldik7CisKKwkvKgorCSAqIENvbmZpZ3VyZSBQUEMgZm9yIElSREEgLSB3ZSB3YW50IHRvIGRyaXZlIFRYRDIgbG93LgorCSAqIFdlIGFsc28gd2FudCB0byBkcml2ZSB0aGlzIHBpbiBsb3cgZHVyaW5nIHNsZWVwLgorCSAqLworCVBQU1IgJj0gflBQQ19UWEQyOworCVBTRFIgJj0gflBQQ19UWEQyOworCVBQRFIgfD0gUFBDX1RYRDI7CisKKwkvKgorCSAqIEVuYWJsZSBIUC1TSVIgbW9kdWxhdGlvbiwgYW5kIGVuc3VyZSB0aGF0IHRoZSBwb3J0IGlzIGRpc2FibGVkLgorCSAqLworCVNlcjJVVENSMyA9IDA7CisJU2VyMkhTQ1IwID0gSFNDUjBfVUFSVDsKKwlTZXIyVVRDUjQgPSBzaS0+dXRjcjQ7CisJU2VyMlVUQ1IwID0gVVRDUjBfOEJpdERhdGE7CisJU2VyMkhTQ1IyID0gSFNDUjJfVHJEYXRhSCB8IEhTQ1IyX1JjRGF0YUw7CisKKwkvKgorCSAqIENsZWFyIHN0YXR1cyByZWdpc3RlcgorCSAqLworCVNlcjJVVFNSMCA9IFVUU1IwX1JFQiB8IFVUU1IwX1JCQiB8IFVUU1IwX1JJRDsKKworCXJldCA9IHNhMTEwMF9pcmRhX3NldF9zcGVlZChzaSwgc2ktPnNwZWVkID0gOTYwMCk7CisJaWYgKHJldCkgeworCQlTZXIyVVRDUjMgPSAwOworCQlTZXIySFNDUjAgPSAwOworCisJCWlmIChzaS0+cGRhdGEtPnNodXRkb3duKQorCQkJc2ktPnBkYXRhLT5zaHV0ZG93bihzaS0+ZGV2KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzYTExMDBfaXJkYV9zaHV0ZG93bihzdHJ1Y3Qgc2ExMTAwX2lyZGEgKnNpKQoreworCS8qCisJICogU3RvcCBhbGwgRE1BIGFjdGl2aXR5LgorCSAqLworCXNhMTEwMF9zdG9wX2RtYShzaS0+cnhkbWEpOworCXNhMTEwMF9zdG9wX2RtYShzaS0+dHhkbWEpOworCisJLyogRGlzYWJsZSB0aGUgcG9ydC4gKi8KKwlTZXIyVVRDUjMgPSAwOworCVNlcjJIU0NSMCA9IDA7CisKKwlpZiAoc2ktPnBkYXRhLT5zaHV0ZG93bikKKwkJc2ktPnBkYXRhLT5zaHV0ZG93bihzaS0+ZGV2KTsKK30KKworI2lmZGVmIENPTkZJR19QTQorLyoKKyAqIFN1c3BlbmQgdGhlIElyREEgaW50ZXJmYWNlLgorICovCitzdGF0aWMgaW50IHNhMTEwMF9pcmRhX3N1c3BlbmQoc3RydWN0IGRldmljZSAqX2RldiwgdTMyIHN0YXRlLCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9nZXRfZHJ2ZGF0YShfZGV2KTsKKwlzdHJ1Y3Qgc2ExMTAwX2lyZGEgKnNpOworCisJaWYgKCFkZXYgfHwgbGV2ZWwgIT0gU1VTUEVORF9ESVNBQkxFKQorCQlyZXR1cm4gMDsKKworCXNpID0gZGV2LT5wcml2OworCWlmIChzaS0+b3BlbikgeworCQkvKgorCQkgKiBTdG9wIHRoZSB0cmFuc21pdCBxdWV1ZQorCQkgKi8KKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJCXNhMTEwMF9pcmRhX3NodXRkb3duKHNpKTsKKwkJX19zYTExMDBfaXJkYV9zZXRfcG93ZXIoc2ksIDApOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogUmVzdW1lIHRoZSBJckRBIGludGVyZmFjZS4KKyAqLworc3RhdGljIGludCBzYTExMDBfaXJkYV9yZXN1bWUoc3RydWN0IGRldmljZSAqX2RldiwgdTMyIGxldmVsKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoX2Rldik7CisJc3RydWN0IHNhMTEwMF9pcmRhICpzaTsKKworCWlmICghZGV2IHx8IGxldmVsICE9IFJFU1VNRV9FTkFCTEUpCisJCXJldHVybiAwOworCisJc2kgPSBkZXYtPnByaXY7CisJaWYgKHNpLT5vcGVuKSB7CisJCS8qCisJCSAqIElmIHdlIG1pc3NlZCBhIHNwZWVkIGNoYW5nZSwgaW5pdGlhbGlzZSBhdCB0aGUgbmV3IHNwZWVkCisJCSAqIGRpcmVjdGx5LiAgSXQgaXMgZGViYXRhYmxlIHdoZXRoZXIgdGhpcyBpcyBhY3R1YWxseQorCQkgKiByZXF1aXJlZCwgYnV0IGluIHRoZSBpbnRlcmVzdHMgb2YgY29udGludWluZyBmcm9tIHdoZXJlCisJCSAqIHdlIGxlZnQgb2ZmIGl0IGlzIGRlc2lyZWFibGUuICBUaGUgY29udmVyc2UgYXJndW1lbnQgaXMKKwkJICogdGhhdCB3ZSBzaG91bGQgcmUtbmVnb3RpYXRlIGF0IDk2MDAgYmF1ZCBhZ2Fpbi4KKwkJICovCisJCWlmIChzaS0+bmV3c3BlZWQpIHsKKwkJCXNpLT5zcGVlZCA9IHNpLT5uZXdzcGVlZDsKKwkJCXNpLT5uZXdzcGVlZCA9IDA7CisJCX0KKworCQlzYTExMDBfaXJkYV9zdGFydHVwKHNpKTsKKwkJX19zYTExMDBfaXJkYV9zZXRfcG93ZXIoc2ksIHNpLT5wb3dlcik7CisJCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCisJCS8qCisJCSAqIFRoaXMgYXV0b21hdGljYWxseSB3YWtlcyB1cCB0aGUgcXVldWUKKwkJICovCisJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIHNhMTEwMF9pcmRhX3N1c3BlbmQJTlVMTAorI2RlZmluZSBzYTExMDBfaXJkYV9yZXN1bWUJTlVMTAorI2VuZGlmCisKKy8qCisgKiBIUC1TSVIgZm9ybWF0IGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmVzLgorICovCitzdGF0aWMgdm9pZCBzYTExMDBfaXJkYV9ocHNpcl9pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2ExMTAwX2lyZGEgKnNpID0gZGV2LT5wcml2OworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBTZXIyVVRTUjA7CisKKwkvKgorCSAqIERlYWwgd2l0aCBhbnkgcmVjZWl2ZSBlcnJvcnMgZmlyc3QuICBUaGUgYnl0ZXMgaW4gZXJyb3IgbWF5IGJlCisJICogdGhlIG9ubHkgYnl0ZXMgaW4gdGhlIHJlY2VpdmUgRklGTywgc28gd2UgZG8gdGhpcyBmaXJzdC4KKwkgKi8KKwl3aGlsZSAoc3RhdHVzICYgVVRTUjBfRUlGKSB7CisJCWludCBzdGF0LCBkYXRhOworCisJCXN0YXQgPSBTZXIyVVRTUjE7CisJCWRhdGEgPSBTZXIyVVREUjsKKworCQlpZiAoc3RhdCAmIChVVFNSMV9GUkUgfCBVVFNSMV9ST1IpKSB7CisJCQlzaS0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAoc3RhdCAmIFVUU1IxX0ZSRSkKKwkJCQlzaS0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAoc3RhdCAmIFVUU1IxX1JPUikKKwkJCQlzaS0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJfSBlbHNlCisJCQlhc3luY191bndyYXBfY2hhcihkZXYsICZzaS0+c3RhdHMsICZzaS0+cnhfYnVmZiwgZGF0YSk7CisKKwkJc3RhdHVzID0gU2VyMlVUU1IwOworCX0KKworCS8qCisJICogV2UgbXVzdCBjbGVhciBjZXJ0YWluIGJpdHMuCisJICovCisJU2VyMlVUU1IwID0gc3RhdHVzICYgKFVUU1IwX1JJRCB8IFVUU1IwX1JCQiB8IFVUU1IwX1JFQik7CisKKwlpZiAoc3RhdHVzICYgVVRTUjBfUkZTKSB7CisJCS8qCisJCSAqIFRoZXJlIGFyZSBhdCBsZWFzdCA0IGJ5dGVzIGluIHRoZSBGSUZPLiAgUmVhZCAzIGJ5dGVzCisJCSAqIGFuZCBsZWF2ZSB0aGUgcmVzdCB0byB0aGUgYmxvY2sgYmVsb3cuCisJCSAqLworCQlhc3luY191bndyYXBfY2hhcihkZXYsICZzaS0+c3RhdHMsICZzaS0+cnhfYnVmZiwgU2VyMlVURFIpOworCQlhc3luY191bndyYXBfY2hhcihkZXYsICZzaS0+c3RhdHMsICZzaS0+cnhfYnVmZiwgU2VyMlVURFIpOworCQlhc3luY191bndyYXBfY2hhcihkZXYsICZzaS0+c3RhdHMsICZzaS0+cnhfYnVmZiwgU2VyMlVURFIpOworCX0KKworCWlmIChzdGF0dXMgJiAoVVRTUjBfUkZTIHwgVVRTUjBfUklEKSkgeworCQkvKgorCQkgKiBGaWZvIGNvbnRhaW5zIG1vcmUgdGhhbiAxIGNoYXJhY3Rlci4KKwkJICovCisJCWRvIHsKKwkJCWFzeW5jX3Vud3JhcF9jaGFyKGRldiwgJnNpLT5zdGF0cywgJnNpLT5yeF9idWZmLAorCQkJCQkgIFNlcjJVVERSKTsKKwkJfSB3aGlsZSAoU2VyMlVUU1IxICYgVVRTUjFfUk5FKTsKKworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCX0KKworCWlmIChzdGF0dXMgJiBVVFNSMF9URlMgJiYgc2ktPnR4X2J1ZmYubGVuKSB7CisJCS8qCisJCSAqIFRyYW5zbWl0dGVyIEZJRk8gaXMgbm90IGZ1bGwKKwkJICovCisJCWRvIHsKKwkJCVNlcjJVVERSID0gKnNpLT50eF9idWZmLmRhdGErKzsKKwkJCXNpLT50eF9idWZmLmxlbiAtPSAxOworCQl9IHdoaWxlIChTZXIyVVRTUjEgJiBVVFNSMV9UTkYgJiYgc2ktPnR4X2J1ZmYubGVuKTsKKworCQlpZiAoc2ktPnR4X2J1ZmYubGVuID09IDApIHsKKwkJCXNpLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlzaS0+c3RhdHMudHhfYnl0ZXMgKz0gc2ktPnR4X2J1ZmYuZGF0YSAtCisJCQkJCSAgICAgIHNpLT50eF9idWZmLmhlYWQ7CisKKwkJCS8qCisJCQkgKiBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSB0cmFuc21pdHRlciBoYXMKKwkJCSAqIGZpbmlzaGVkLgorCQkJICovCisJCQlkbworCQkJCXJtYigpOworCQkJd2hpbGUgKFNlcjJVVFNSMSAmIFVUU1IxX1RCWSk7CisKKwkJCS8qCisJCQkgKiBPaywgd2UndmUgZmluaXNoZWQgdHJhbnNtaXR0aW5nLiAgTm93IGVuYWJsZQorCQkJICogdGhlIHJlY2VpdmVyLiAgU29tZXRpbWVzIHdlIGdldCBhIHJlY2VpdmUgSVJRCisJCQkgKiBpbW1lZGlhdGVseSBhZnRlciBhIHRyYW5zbWl0Li4uCisJCQkgKi8KKwkJCVNlcjJVVFNSMCA9IFVUU1IwX1JFQiB8IFVUU1IwX1JCQiB8IFVUU1IwX1JJRDsKKwkJCVNlcjJVVENSMyA9IFVUQ1IzX1JJRSB8IFVUQ1IzX1JYRSB8IFVUQ1IzX1RYRTsKKworCQkJaWYgKHNpLT5uZXdzcGVlZCkgeworCQkJCXNhMTEwMF9pcmRhX3NldF9zcGVlZChzaSwgc2ktPm5ld3NwZWVkKTsKKwkJCQlzaS0+bmV3c3BlZWQgPSAwOworCQkJfQorCisJCQkvKiBJJ20gaHVuZ3J5ISAqLworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzYTExMDBfaXJkYV9maXJfZXJyb3Ioc3RydWN0IHNhMTEwMF9pcmRhICpzaSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2ktPnJ4c2tiOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJdW5zaWduZWQgaW50IGxlbiwgc3RhdCwgZGF0YTsKKworCWlmICghc2tiKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2ExMTAwX2lyOiBTS0IgaXMgTlVMTCFcbiIpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBHZXQgdGhlIGN1cnJlbnQgZGF0YSBwb3NpdGlvbi4KKwkgKi8KKwlkbWFfYWRkciA9IHNhMTEwMF9nZXRfZG1hX3BvcyhzaS0+cnhkbWEpOworCWxlbiA9IGRtYV9hZGRyIC0gc2ktPnJ4YnVmX2RtYTsKKwlpZiAobGVuID4gSFBTSVJfTUFYX1JYTEVOKQorCQlsZW4gPSBIUFNJUl9NQVhfUlhMRU47CisJZG1hX3VubWFwX3NpbmdsZShzaS0+ZGV2LCBzaS0+cnhidWZfZG1hLCBsZW4sIERNQV9GUk9NX0RFVklDRSk7CisKKwlkbyB7CisJCS8qCisJCSAqIFJlYWQgU3RhdHVzLCBhbmQgdGhlbiBEYXRhLgorCQkgKi8KKwkJc3RhdCA9IFNlcjJIU1NSMTsKKwkJcm1iKCk7CisJCWRhdGEgPSBTZXIySFNEUjsKKworCQlpZiAoc3RhdCAmIChIU1NSMV9DUkUgfCBIU1NSMV9ST1IpKSB7CisJCQlzaS0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAoc3RhdCAmIEhTU1IxX0NSRSkKKwkJCQlzaS0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJaWYgKHN0YXQgJiBIU1NSMV9ST1IpCisJCQkJc2ktPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQl9IGVsc2UKKwkJCXNrYi0+ZGF0YVtsZW4rK10gPSBkYXRhOworCisJCS8qCisJCSAqIElmIHdlIGhpdCB0aGUgZW5kIG9mIGZyYW1lLCB0aGVyZSdzCisJCSAqIG5vIHBvaW50IGluIGNvbnRpbnVpbmcuCisJCSAqLworCQlpZiAoc3RhdCAmIEhTU1IxX0VPRikKKwkJCWJyZWFrOworCX0gd2hpbGUgKFNlcjJIU1NSMCAmIEhTU1IwX0VJRik7CisKKwlpZiAoc3RhdCAmIEhTU1IxX0VPRikgeworCQlzaS0+cnhza2IgPSBOVUxMOworCisJCXNrYl9wdXQoc2tiLCBsZW4pOworCQlza2ItPmRldiA9IGRldjsKKwkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CisJCXNpLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCXNpLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisKKwkJLyoKKwkJICogQmVmb3JlIHdlIHBhc3MgdGhlIGJ1ZmZlciB1cCwgYWxsb2NhdGUgYSBuZXcgb25lLgorCQkgKi8KKwkJc2ExMTAwX2lyZGFfcnhfYWxsb2Moc2kpOworCisJCW5ldGlmX3J4KHNrYik7CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogUmVtYXAgdGhlIGJ1ZmZlci4KKwkJICovCisJCXNpLT5yeGJ1Zl9kbWEgPSBkbWFfbWFwX3NpbmdsZShzaS0+ZGV2LCBzaS0+cnhza2ItPmRhdGEsCisJCQkJCQlIUFNJUl9NQVhfUlhMRU4sCisJCQkJCQlETUFfRlJPTV9ERVZJQ0UpOworCX0KK30KKworLyoKKyAqIEZJUiBmb3JtYXQgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4gIFdlIG9ubHkgaGF2ZSB0bworICogaGFuZGxlIFJYIGV2ZW50czsgdHJhbnNtaXQgZXZlbnRzIGdvIHZpYSB0aGUgVFggRE1BIGhhbmRsZXIuCisgKgorICogTm8gbWF0dGVyIHdoYXQsIHdlIGRpc2FibGUgUlgsIHByb2Nlc3MsIGFuZCB0aGUgcmVzdGFydCBSWC4KKyAqLworc3RhdGljIHZvaWQgc2ExMTAwX2lyZGFfZmlyX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzYTExMDBfaXJkYSAqc2kgPSBkZXYtPnByaXY7CisKKwkvKgorCSAqIFN0b3AgUlggRE1BCisJICovCisJc2ExMTAwX3N0b3BfZG1hKHNpLT5yeGRtYSk7CisKKwkvKgorCSAqIEZyYW1pbmcgZXJyb3IgLSB3ZSB0aHJvdyBhd2F5IHRoZSBwYWNrZXQgY29tcGxldGVseS4KKwkgKiBDbGVhcmluZyBSWEUgZmx1c2hlcyB0aGUgZXJyb3IgY29uZGl0aW9ucyBhbmQgZGF0YQorCSAqIGZyb20gdGhlIGZpZm8uCisJICovCisJaWYgKFNlcjJIU1NSMCAmIChIU1NSMF9GUkUgfCBIU1NSMF9SQUIpKSB7CisJCXNpLT5zdGF0cy5yeF9lcnJvcnMrKzsKKworCQlpZiAoU2VyMkhTU1IwICYgSFNTUjBfRlJFKQorCQkJc2ktPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCisJCS8qCisJCSAqIENsZWFyIG91dCB0aGUgRE1BLi4uCisJCSAqLworCQlTZXIySFNDUjAgPSBzaS0+aHNjcjAgfCBIU0NSMF9IU1NQOworCisJCS8qCisJCSAqIENsZWFyIHNlbGVjdGVkIHN0YXR1cyBiaXRzIG5vdywgc28gd2UKKwkJICogZG9uJ3QgbWlzcyB0aGVtIG5leHQgdGltZSBhcm91bmQuCisJCSAqLworCQlTZXIySFNTUjAgPSBIU1NSMF9GUkUgfCBIU1NSMF9SQUI7CisJfQorCisJLyoKKwkgKiBEZWFsIHdpdGggYW55IHJlY2VpdmUgZXJyb3JzLiAgVGhlIGFueSBvZiB0aGUgbG93ZXN0CisJICogOCBieXRlcyBpbiB0aGUgRklGTyBtYXkgY29udGFpbiBhbiBlcnJvci4gIFdlIG11c3QgcmVhZAorCSAqIHRoZW0gb25lIGJ5IG9uZS4gIFRoZSAiZXJyb3IiIGNvdWxkIGV2ZW4gYmUgdGhlIGVuZCBvZgorCSAqIHBhY2tldCEKKwkgKi8KKwlpZiAoU2VyMkhTU1IwICYgSFNTUjBfRUlGKQorCQlzYTExMDBfaXJkYV9maXJfZXJyb3Ioc2ksIGRldik7CisKKwkvKgorCSAqIE5vIG1hdHRlciB3aGF0IGhhcHBlbnMsIHdlIG11c3QgcmVzdGFydCByZWNlcHRpb24uCisJICovCisJc2ExMTAwX2lyZGFfcnhfZG1hX3N0YXJ0KHNpKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHNhMTEwMF9pcmRhX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJaWYgKElTX0ZJUigoKHN0cnVjdCBzYTExMDBfaXJkYSAqKWRldi0+cHJpdikpKQorCQlzYTExMDBfaXJkYV9maXJfaXJxKGRldik7CisJZWxzZQorCQlzYTExMDBfaXJkYV9ocHNpcl9pcnEoZGV2KTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBUWCBETUEgY29tcGxldGlvbiBoYW5kbGVyLgorICovCitzdGF0aWMgdm9pZCBzYTExMDBfaXJkYV90eGRtYV9pcnEodm9pZCAqaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGlkOworCXN0cnVjdCBzYTExMDBfaXJkYSAqc2kgPSBkZXYtPnByaXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNpLT50eHNrYjsKKworCXNpLT50eHNrYiA9IE5VTEw7CisKKwkvKgorCSAqIFdhaXQgZm9yIHRoZSB0cmFuc21pc3Npb24gdG8gY29tcGxldGUuICBVbmZvcnR1bmF0ZWx5LAorCSAqIHRoZSBoYXJkd2FyZSBkb2Vzbid0IGdpdmUgdXMgYW4gaW50ZXJydXB0IHRvIGluZGljYXRlCisJICogImVuZCBvZiBmcmFtZSIuCisJICovCisJZG8KKwkJcm1iKCk7CisJd2hpbGUgKCEoU2VyMkhTU1IwICYgSFNTUjBfVFVSKSB8fCBTZXIySFNTUjEgJiBIU1NSMV9UQlkpOworCisJLyoKKwkgKiBDbGVhciB0aGUgdHJhbnNtaXQgdW5kZXJydW4gYml0LgorCSAqLworCVNlcjJIU1NSMCA9IEhTU1IwX1RVUjsKKworCS8qCisJICogRG8gd2UgbmVlZCB0byBjaGFuZ2Ugc3BlZWQ/ICBOb3RlIHRoYXQgd2UncmUgbGF6eQorCSAqIGhlcmUgLSB3ZSBkb24ndCBmcmVlIHRoZSBvbGQgcnhza2IuICBXZSBkb24ndCBuZWVkCisJICogdG8gYWxsb2NhdGUgYSBidWZmZXIgZWl0aGVyLgorCSAqLworCWlmIChzaS0+bmV3c3BlZWQpIHsKKwkJc2ExMTAwX2lyZGFfc2V0X3NwZWVkKHNpLCBzaS0+bmV3c3BlZWQpOworCQlzaS0+bmV3c3BlZWQgPSAwOworCX0KKworCS8qCisJICogU3RhcnQgcmVjZXB0aW9uLiAgVGhpcyBkaXNhYmxlcyB0aGUgdHJhbnNtaXR0ZXIgZm9yCisJICogdXMuICBUaGlzIHdpbGwgYmUgdXNpbmcgdGhlIGV4aXN0aW5nIFJYIGJ1ZmZlci4KKwkgKi8KKwlzYTExMDBfaXJkYV9yeF9kbWFfc3RhcnQoc2kpOworCisJLyoKKwkgKiBBY2NvdW50IGFuZCBmcmVlIHRoZSBwYWNrZXQuCisJICovCisJaWYgKHNrYikgeworCQlkbWFfdW5tYXBfc2luZ2xlKHNpLT5kZXYsIHNpLT50eGJ1Zl9kbWEsIHNrYi0+bGVuLCBETUFfVE9fREVWSUNFKTsKKwkJc2ktPnN0YXRzLnR4X3BhY2tldHMgKys7CisJCXNpLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwl9CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBUWCBxdWV1ZSBpcyBhdmFpbGFibGUgZm9yIHNlbmRpbmcKKwkgKiAoZm9yIHJldHJpZXMpLiAgVFggaGFzIHByaW9yaXR5IG92ZXIgUlggYXQgYWxsIHRpbWVzLgorCSAqLworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBzYTExMDBfaXJkYV9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2ExMTAwX2lyZGEgKnNpID0gZGV2LT5wcml2OworCWludCBzcGVlZCA9IGlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKKworCS8qCisJICogRG9lcyB0aGlzIHBhY2tldCBjb250YWluIGEgcmVxdWVzdCB0byBjaGFuZ2UgdGhlIGludGVyZmFjZQorCSAqIHNwZWVkPyAgSWYgc28sIHJlbWVtYmVyIGl0IHVudGlsIHdlIGNvbXBsZXRlIHRoZSB0cmFuc21pc3Npb24KKwkgKiBvZiB0aGlzIGZyYW1lLgorCSAqLworCWlmIChzcGVlZCAhPSBzaS0+c3BlZWQgJiYgc3BlZWQgIT0gLTEpCisJCXNpLT5uZXdzcGVlZCA9IHNwZWVkOworCisJLyoKKwkgKiBJZiB0aGlzIGlzIGFuIGVtcHR5IGZyYW1lLCB3ZSBjYW4gYnlwYXNzIGEgbG90LgorCSAqLworCWlmIChza2ItPmxlbiA9PSAwKSB7CisJCWlmIChzaS0+bmV3c3BlZWQpIHsKKwkJCXNpLT5uZXdzcGVlZCA9IDA7CisJCQlzYTExMDBfaXJkYV9zZXRfc3BlZWQoc2ksIHNwZWVkKTsKKwkJfQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKworCWlmICghSVNfRklSKHNpKSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkJc2ktPnR4X2J1ZmYuZGF0YSA9IHNpLT50eF9idWZmLmhlYWQ7CisJCXNpLT50eF9idWZmLmxlbiAgPSBhc3luY193cmFwX3NrYihza2IsIHNpLT50eF9idWZmLmRhdGEsCisJCQkJCQkgIHNpLT50eF9idWZmLnRydWVzaXplKTsKKworCQkvKgorCQkgKiBTZXQgdGhlIHRyYW5zbWl0IGludGVycnVwdCBlbmFibGUuICBUaGlzIHdpbGwgZmlyZQorCQkgKiBvZmYgYW4gaW50ZXJydXB0IGltbWVkaWF0ZWx5LiAgTm90ZSB0aGF0IHdlIGRpc2FibGUKKwkJICogdGhlIHJlY2VpdmVyIHNvIHdlIHdvbid0IGdldCBzcHVyaW91cyBjaGFyYWN0ZXJlcworCQkgKiByZWNlaXZlZC4KKwkJICovCisJCVNlcjJVVENSMyA9IFVUQ1IzX1RJRSB8IFVUQ1IzX1RYRTsKKworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfSBlbHNlIHsKKwkJaW50IG10dCA9IGlyZGFfZ2V0X210dChza2IpOworCisJCS8qCisJCSAqIFdlIG11c3Qgbm90IGJlIHRyYW5zbWl0dGluZy4uLgorCQkgKi8KKwkJaWYgKHNpLT50eHNrYikKKwkJCUJVRygpOworCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQlzaS0+dHhza2IgPSBza2I7CisJCXNpLT50eGJ1Zl9kbWEgPSBkbWFfbWFwX3NpbmdsZShzaS0+ZGV2LCBza2ItPmRhdGEsCisJCQkJCSBza2ItPmxlbiwgRE1BX1RPX0RFVklDRSk7CisKKwkJc2ExMTAwX3N0YXJ0X2RtYShzaS0+dHhkbWEsIHNpLT50eGJ1Zl9kbWEsIHNrYi0+bGVuKTsKKworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIGEgbWVhbiB0dXJuLWFyb3VuZCB0aW1lLCBpbXBvc2UgdGhlIHNwZWNpZmllZAorCQkgKiBzcGVjaWZpZWQgZGVsYXkuICBXZSBjb3VsZCBzaG9ydGVuIHRoaXMgYnkgdGltaW5nIGZyb20KKwkJICogdGhlIHBvaW50IHdlIHJlY2VpdmVkIHRoZSBwYWNrZXQuCisJCSAqLworCQlpZiAobXR0KQorCQkJdWRlbGF5KG10dCk7CisKKwkJU2VyMkhTQ1IwID0gc2ktPmhzY3IwIHwgSFNDUjBfSFNTUCB8IEhTQ1IwX1RYRTsKKwl9CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzYTExMDBfaXJkYV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmcmVxLCBpbnQgY21kKQoreworCXN0cnVjdCBpZl9pcmRhX3JlcSAqcnEgPSAoc3RydWN0IGlmX2lyZGFfcmVxICopaWZyZXE7CisJc3RydWN0IHNhMTEwMF9pcmRhICpzaSA9IGRldi0+cHJpdjsKKwlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ1NCQU5EV0lEVEg6CisJCWlmIChjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQkvKgorCQkJICogV2UgYXJlIHVuYWJsZSB0byBzZXQgdGhlIHNwZWVkIGlmIHRoZQorCQkJICogZGV2aWNlIGlzIG5vdCBydW5uaW5nLgorCQkJICovCisJCQlpZiAoc2ktPm9wZW4pIHsKKwkJCQlyZXQgPSBzYTExMDBfaXJkYV9zZXRfc3BlZWQoc2ksCisJCQkJCQlycS0+aWZyX2JhdWRyYXRlKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKCJzYTExMDBfaXJkYV9pb2N0bDogU0lPQ1NCQU5EV0lEVEg6ICFuZXRpZl9ydW5uaW5nXG4iKTsKKwkJCQlyZXQgPSAwOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBTSU9DU01FRElBQlVTWToKKwkJcmV0ID0gLUVQRVJNOworCQlpZiAoY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3koZGV2LCBUUlVFKTsKKwkJCXJldCA9IDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHUkVDRUlWSU5HOgorCQlycS0+aWZyX3JlY2VpdmluZyA9IElTX0ZJUihzaSkgPyAwCisJCQkJCTogc2ktPnJ4X2J1ZmYuc3RhdGUgIT0gT1VUU0lERV9GUkFNRTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJCQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2ExMTAwX2lyZGFfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2ExMTAwX2lyZGEgKnNpID0gZGV2LT5wcml2OworCXJldHVybiAmc2ktPnN0YXRzOworfQorCitzdGF0aWMgaW50IHNhMTEwMF9pcmRhX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNhMTEwMF9pcmRhICpzaSA9IGRldi0+cHJpdjsKKwlpbnQgZXJyOworCisJc2ktPnNwZWVkID0gOTYwMDsKKworCWVyciA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBzYTExMDBfaXJkYV9pcnEsIDAsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9pcnE7CisKKwllcnIgPSBzYTExMDBfcmVxdWVzdF9kbWEoRE1BX1NlcjJIU1NQUmQsICJJckRBIHJlY2VpdmUiLAorCQkJCSBOVUxMLCBOVUxMLCAmc2ktPnJ4ZG1hKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9yeF9kbWE7CisKKwllcnIgPSBzYTExMDBfcmVxdWVzdF9kbWEoRE1BX1NlcjJIU1NQV3IsICJJckRBIHRyYW5zbWl0IiwKKwkJCQkgc2ExMTAwX2lyZGFfdHhkbWFfaXJxLCBkZXYsICZzaS0+dHhkbWEpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3R4X2RtYTsKKworCS8qCisJICogVGhlIGludGVycnVwdCBtdXN0IHJlbWFpbiBkaXNhYmxlZCBmb3Igbm93LgorCSAqLworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKworCS8qCisJICogU2V0dXAgdGhlIHNlcmlhbCBwb3J0IGZvciB0aGUgc3BlY2lmaWVkIHNwZWVkLgorCSAqLworCWVyciA9IHNhMTEwMF9pcmRhX3N0YXJ0dXAoc2kpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3N0YXJ0dXA7CisKKwkvKgorCSAqIE9wZW4gYSBuZXcgSXJMQVAgbGF5ZXIgaW5zdGFuY2UuCisJICovCisJc2ktPmlybGFwID0gaXJsYXBfb3BlbihkZXYsICZzaS0+cW9zLCAic2ExMTAwIik7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIXNpLT5pcmxhcCkKKwkJZ290byBlcnJfaXJsYXA7CisKKwkvKgorCSAqIE5vdyBlbmFibGUgdGhlIGludGVycnVwdCBhbmQgc3RhcnQgdGhlIHF1ZXVlCisJICovCisJc2ktPm9wZW4gPSAxOworCXNhMTEwMF9zZXRfcG93ZXIoc2ksIHBvd2VyX2xldmVsKTsgLyogbG93IHBvd2VyIG1vZGUgKi8KKwllbmFibGVfaXJxKGRldi0+aXJxKTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworCitlcnJfaXJsYXA6CisJc2ktPm9wZW4gPSAwOworCXNhMTEwMF9pcmRhX3NodXRkb3duKHNpKTsKK2Vycl9zdGFydHVwOgorCXNhMTEwMF9mcmVlX2RtYShzaS0+dHhkbWEpOworZXJyX3R4X2RtYToKKwlzYTExMDBfZnJlZV9kbWEoc2ktPnJ4ZG1hKTsKK2Vycl9yeF9kbWE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CitlcnJfaXJxOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2ExMTAwX2lyZGFfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzYTExMDBfaXJkYSAqc2kgPSBkZXYtPnByaXY7CisKKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJc2ExMTAwX2lyZGFfc2h1dGRvd24oc2kpOworCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGJlZW4gZG9pbmcgRE1BIHJlY2VpdmUsIG1ha2Ugc3VyZSB3ZQorCSAqIHRpZHkgdGhhdCB1cCBjbGVhbmx5LgorCSAqLworCWlmIChzaS0+cnhza2IpIHsKKwkJZG1hX3VubWFwX3NpbmdsZShzaS0+ZGV2LCBzaS0+cnhidWZfZG1hLCBIUFNJUl9NQVhfUlhMRU4sCisJCQkJIERNQV9GUk9NX0RFVklDRSk7CisJCWRldl9rZnJlZV9za2Ioc2ktPnJ4c2tiKTsKKwkJc2ktPnJ4c2tiID0gTlVMTDsKKwl9CisKKwkvKiBTdG9wIElyTEFQICovCisJaWYgKHNpLT5pcmxhcCkgeworCQlpcmxhcF9jbG9zZShzaS0+aXJsYXApOworCQlzaS0+aXJsYXAgPSBOVUxMOworCX0KKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlzaS0+b3BlbiA9IDA7CisKKwkvKgorCSAqIEZyZWUgcmVzb3VyY2VzCisJICovCisJc2ExMTAwX2ZyZWVfZG1hKHNpLT50eGRtYSk7CisJc2ExMTAwX2ZyZWVfZG1hKHNpLT5yeGRtYSk7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlzYTExMDBfc2V0X3Bvd2VyKHNpLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNhMTEwMF9pcmRhX2luaXRfaW9idWYoaW9idWZmX3QgKmlvLCBpbnQgc2l6ZSkKK3sKKwlpby0+aGVhZCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCWlmIChpby0+aGVhZCAhPSBOVUxMKSB7CisJCWlvLT50cnVlc2l6ZSA9IHNpemU7CisJCWlvLT5pbl9mcmFtZSA9IEZBTFNFOworCQlpby0+c3RhdGUgICAgPSBPVVRTSURFX0ZSQU1FOworCQlpby0+ZGF0YSAgICAgPSBpby0+aGVhZDsKKwl9CisJcmV0dXJuIGlvLT5oZWFkID8gMCA6IC1FTk9NRU07Cit9CisKK3N0YXRpYyBpbnQgc2ExMTAwX2lyZGFfcHJvYmUoc3RydWN0IGRldmljZSAqX2RldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKF9kZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHNhMTEwMF9pcmRhICpzaTsKKwl1bnNpZ25lZCBpbnQgYmF1ZHJhdGVfbWFzazsKKwlpbnQgZXJyOworCisJaWYgKCFwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSByZXF1ZXN0X21lbV9yZWdpb24oX19QUkVHKFNlcjJVVENSMCksIDB4MjQsICJJckRBIikgPyAwIDogLUVCVVNZOworCWlmIChlcnIpCisJCWdvdG8gZXJyX21lbV8xOworCWVyciA9IHJlcXVlc3RfbWVtX3JlZ2lvbihfX1BSRUcoU2VyMkhTQ1IwKSwgMHgxYywgIklyREEiKSA/IDAgOiAtRUJVU1k7CisJaWYgKGVycikKKwkJZ290byBlcnJfbWVtXzI7CisJZXJyID0gcmVxdWVzdF9tZW1fcmVnaW9uKF9fUFJFRyhTZXIySFNDUjIpLCAweDA0LCAiSXJEQSIpID8gMCA6IC1FQlVTWTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9tZW1fMzsKKworCWRldiA9IGFsbG9jX2lyZGFkZXYoc2l6ZW9mKHN0cnVjdCBzYTExMDBfaXJkYSkpOworCWlmICghZGV2KQorCQlnb3RvIGVycl9tZW1fNDsKKworCXNpID0gZGV2LT5wcml2OworCXNpLT5kZXYgPSAmcGRldi0+ZGV2OworCXNpLT5wZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJLyoKKwkgKiBJbml0aWFsaXNlIHRoZSBIUC1TSVIgYnVmZmVycworCSAqLworCWVyciA9IHNhMTEwMF9pcmRhX2luaXRfaW9idWYoJnNpLT5yeF9idWZmLCAxNDM4NCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfbWVtXzU7CisJZXJyID0gc2ExMTAwX2lyZGFfaW5pdF9pb2J1Zigmc2ktPnR4X2J1ZmYsIDQwMDApOworCWlmIChlcnIpCisJCWdvdG8gZXJyX21lbV81OworCisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBzYTExMDBfaXJkYV9oYXJkX3htaXQ7CisJZGV2LT5vcGVuCQk9IHNhMTEwMF9pcmRhX3N0YXJ0OworCWRldi0+c3RvcAkJPSBzYTExMDBfaXJkYV9zdG9wOworCWRldi0+ZG9faW9jdGwJCT0gc2ExMTAwX2lyZGFfaW9jdGw7CisJZGV2LT5nZXRfc3RhdHMJCT0gc2ExMTAwX2lyZGFfc3RhdHM7CisJZGV2LT5pcnEJCT0gSVJRX1NlcjJJQ1A7CisKKwlpcmRhX2luaXRfbWF4X3Fvc19jYXBhYmlsaWVzKCZzaS0+cW9zKTsKKworCS8qCisJICogV2Ugc3VwcG9ydCBvcmlnaW5hbCBJUkRBIHVwIHRvIDExNWsyLiAod2UgZG9uJ3QgY3VycmVudGx5CisJICogc3VwcG9ydCA0TWJwcykuICBNaW4gVHVybiBUaW1lIHNldCB0byAxbXMgb3IgZ3JlYXRlci4KKwkgKi8KKwliYXVkcmF0ZV9tYXNrID0gSVJfOTYwMDsKKworCXN3aXRjaCAobWF4X3JhdGUpIHsKKwljYXNlIDQwMDAwMDA6CQliYXVkcmF0ZV9tYXNrIHw9IElSXzQwMDAwMDAgPDwgODsKKwljYXNlIDExNTIwMDoJCWJhdWRyYXRlX21hc2sgfD0gSVJfMTE1MjAwOworCWNhc2UgNTc2MDA6CQliYXVkcmF0ZV9tYXNrIHw9IElSXzU3NjAwOworCWNhc2UgMzg0MDA6CQliYXVkcmF0ZV9tYXNrIHw9IElSXzM4NDAwOworCWNhc2UgMTkyMDA6CQliYXVkcmF0ZV9tYXNrIHw9IElSXzE5MjAwOworCX0KKwkJCisJc2ktPnFvcy5iYXVkX3JhdGUuYml0cyAmPSBiYXVkcmF0ZV9tYXNrOworCXNpLT5xb3MubWluX3R1cm5fdGltZS5iaXRzID0gNzsKKworCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUoJnNpLT5xb3MpOworCisJc2ktPnV0Y3I0ID0gVVRDUjRfSFBTSVI7CisJaWYgKHR4X2xwbSkKKwkJc2ktPnV0Y3I0IHw9IFVUQ1I0X1oxXzZ1czsKKworCS8qCisJICogSW5pdGlhbGx5IGVuYWJsZSBIUC1TSVIgbW9kdWxhdGlvbiwgYW5kIGVuc3VyZSB0aGF0IHRoZSBwb3J0CisJICogaXMgZGlzYWJsZWQuCisJICovCisJU2VyMlVUQ1IzID0gMDsKKwlTZXIyVVRDUjQgPSBzaS0+dXRjcjQ7CisJU2VyMkhTQ1IwID0gSFNDUjBfVUFSVDsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIgPT0gMCkKKwkJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIGRldik7CisKKwlpZiAoZXJyKSB7CisgZXJyX21lbV81OgorCQlrZnJlZShzaS0+dHhfYnVmZi5oZWFkKTsKKwkJa2ZyZWUoc2ktPnJ4X2J1ZmYuaGVhZCk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisgZXJyX21lbV80OgorCQlyZWxlYXNlX21lbV9yZWdpb24oX19QUkVHKFNlcjJIU0NSMiksIDB4MDQpOworIGVycl9tZW1fMzoKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKF9fUFJFRyhTZXIySFNDUjApLCAweDFjKTsKKyBlcnJfbWVtXzI6CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihfX1BSRUcoU2VyMlVUQ1IwKSwgMHgyNCk7CisJfQorIGVycl9tZW1fMToKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNhMTEwMF9pcmRhX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoX2Rldik7CisKKwlpZiAoZGV2KSB7CisJCXN0cnVjdCBzYTExMDBfaXJkYSAqc2kgPSBkZXYtPnByaXY7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCWtmcmVlKHNpLT50eF9idWZmLmhlYWQpOworCQlrZnJlZShzaS0+cnhfYnVmZi5oZWFkKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwl9CisKKwlyZWxlYXNlX21lbV9yZWdpb24oX19QUkVHKFNlcjJIU0NSMiksIDB4MDQpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihfX1BSRUcoU2VyMkhTQ1IwKSwgMHgxYyk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKF9fUFJFRyhTZXIyVVRDUjApLCAweDI0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgc2ExMTAwaXJfZHJpdmVyID0geworCS5uYW1lCQk9ICJzYTExeDAtaXIiLAorCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZQkJPSBzYTExMDBfaXJkYV9wcm9iZSwKKwkucmVtb3ZlCQk9IHNhMTEwMF9pcmRhX3JlbW92ZSwKKwkuc3VzcGVuZAk9IHNhMTEwMF9pcmRhX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzYTExMDBfaXJkYV9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzYTExMDBfaXJkYV9pbml0KHZvaWQpCit7CisJLyoKKwkgKiBMaW1pdCBwb3dlciBsZXZlbCBhIHNlbnNpYmxlIHJhbmdlLgorCSAqLworCWlmIChwb3dlcl9sZXZlbCA8IDEpCisJCXBvd2VyX2xldmVsID0gMTsKKwlpZiAocG93ZXJfbGV2ZWwgPiAzKQorCQlwb3dlcl9sZXZlbCA9IDM7CisKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZzYTExMDBpcl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2ExMTAwX2lyZGFfZXhpdCh2b2lkKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZzYTExMDBpcl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzYTExMDBfaXJkYV9pbml0KTsKK21vZHVsZV9leGl0KHNhMTEwMF9pcmRhX2V4aXQpOworbW9kdWxlX3BhcmFtKHBvd2VyX2xldmVsLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHR4X2xwbSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShtYXhfcmF0ZSwgaW50LCAwKTsKKworTU9EVUxFX0FVVEhPUigiUnVzc2VsbCBLaW5nIDxybWtAYXJtLmxpbnV4Lm9yZy51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3Ryb25nQVJNIFNBMTEwMCBJckRBIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1BBUk1fREVTQyhwb3dlcl9sZXZlbCwgIklyREEgcG93ZXIgbGV2ZWwsIDEgKGxvdykgdG8gMyAoaGlnaCkiKTsKK01PRFVMRV9QQVJNX0RFU0ModHhfbHBtLCAiRW5hYmxlIHRyYW5zbWl0dGVyIGxvdyBwb3dlciAoMS42dXMpIG1vZGUiKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X3JhdGUsICJNYXhpbXVtIGJhdWQgcmF0ZSAoNDAwMDAwMCwgMTE1MjAwLCA1NzYwMCwgMzg0MDAsIDE5MjAwLCA5NjAwKSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zaXItZGV2LmggYi9kcml2ZXJzL25ldC9pcmRhL3Npci1kZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGI4YmMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zaXItZGV2LmgKQEAgLTAsMCArMSwyMDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglzaXIuaDoJaW5jbHVkZSBmaWxlIGZvciBpcmRhLXNpciBkZXZpY2UgYWJzdHJhY3Rpb24gbGF5ZXIKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDIgTWFydGluIERpZWhsCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICoJcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKgl0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgSVJEQV9TSVJfSAorI2RlZmluZSBJUkRBX1NJUl9ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgkJLy8gaW9idWZmX3QKKworLyogRklYTUU6IHVuaWZ5IGlyZGFfcmVxdWVzdCB3aXRoIHNpcl9mc20hICovCisKK3N0cnVjdCBpcmRhX3JlcXVlc3QgeworCXN0cnVjdCBsaXN0X2hlYWQgbGhfcmVxdWVzdDsKKwl1bnNpZ25lZCBsb25nIHBlbmRpbmc7CisJdm9pZCAoKmZ1bmMpKHZvaWQgKik7CisJdm9pZCAqZGF0YTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKK307CisKK3N0cnVjdCBzaXJfZnNtIHsKKwlzdHJ1Y3Qgc2VtYXBob3JlCXNlbTsKKwlzdHJ1Y3QgaXJkYV9yZXF1ZXN0CXJxOworCXVuc2lnbmVkCQlzdGF0ZSwgc3Vic3RhdGU7CisJaW50CQkJcGFyYW07CisJaW50CQkJcmVzdWx0OworfTsKKworI2RlZmluZSBTSVJERVZfU1RBVEVfV0FJVF9UWF9DT01QTEVURQkweDAxMDAKKworLyogc3Vic3RhdGVzIGZvciB3YWl0X3R4X2NvbXBsZXRlICovCisjZGVmaW5lIFNJUkRFVl9TVEFURV9XQUlUX1hNSVQJCTB4MDEwMQorI2RlZmluZSBTSVJERVZfU1RBVEVfV0FJVF9VTlRJTF9TRU5UCTB4MDEwMgorI2RlZmluZSBTSVJERVZfU1RBVEVfVFhfRE9ORQkJMHgwMTAzCisKKyNkZWZpbmUgU0lSREVWX1NUQVRFX0RPTkdMRV9PUEVOCQkweDAzMDAKKworLyogMHgwMzAxLTB4MDNmZiByZXNlcnZlZCBmb3IgaW5kaXZpZHVhbCBkb25nbGUgc3Vic3RhdGVzICovCisKKyNkZWZpbmUgU0lSREVWX1NUQVRFX0RPTkdMRV9DTE9TRQkweDA0MDAKKworLyogMHgwNDAxLTB4MDRmZiByZXNlcnZlZCBmb3IgaW5kaXZpZHVhbCBkb25nbGUgc3Vic3RhdGVzICovCisKKyNkZWZpbmUgU0lSREVWX1NUQVRFX1NFVF9EVFJfUlRTCQkweDA1MDAKKworI2RlZmluZSBTSVJERVZfU1RBVEVfU0VUX1NQRUVECQkweDA3MDAKKyNkZWZpbmUgU0lSREVWX1NUQVRFX0RPTkdMRV9DSEVDSwkweDA4MDAKKyNkZWZpbmUgU0lSREVWX1NUQVRFX0RPTkdMRV9SRVNFVAkweDA5MDAKKworLyogMHgwOTAxLTB4MDlmZiByZXNlcnZlZCBmb3IgaW5kaXZpZHVhbCBkb25nbGUgc3Vic3RhdGVzICovCisKKyNkZWZpbmUgU0lSREVWX1NUQVRFX0RPTkdMRV9TUEVFRAkweDBhMDAKKy8qIDB4MGEwMS0weDBhZmYgcmVzZXJ2ZWQgZm9yIGluZGl2aWR1YWwgZG9uZ2xlIHN1YnN0YXRlcyAqLworCisjZGVmaW5lIFNJUkRFVl9TVEFURV9QT1JUX1NQRUVECQkweDBiMDAKKyNkZWZpbmUgU0lSREVWX1NUQVRFX0RPTkUJCTB4MGMwMAorI2RlZmluZSBTSVJERVZfU1RBVEVfRVJST1IJCTB4MGQwMAorI2RlZmluZSBTSVJERVZfU1RBVEVfQ09NUExFVEUJCTB4MGUwMAorCisjZGVmaW5lIFNJUkRFVl9TVEFURV9ERUFECQkweGZmZmYKKworCitzdHJ1Y3Qgc2lyX2RldjsKKworc3RydWN0IGRvbmdsZV9kcml2ZXIgeworCisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisKKwljb25zdCBjaGFyICpkcml2ZXJfbmFtZTsKKworCUlSREFfRE9OR0xFIHR5cGU7CisKKwlpbnQJKCpvcGVuKShzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKKwlpbnQJKCpjbG9zZSkoc3RydWN0IHNpcl9kZXYgKmRldik7CisJaW50CSgqcmVzZXQpKHN0cnVjdCBzaXJfZGV2ICpkZXYpOworCWludAkoKnNldF9zcGVlZCkoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpOworCisJc3RydWN0IGxpc3RfaGVhZCBkb25nbGVfbGlzdDsKK307CisKK3N0cnVjdCBzaXJfZHJpdmVyIHsKKworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworCisJY29uc3QgY2hhciAqZHJpdmVyX25hbWU7CisKKwlpbnQgcW9zX210dF9iaXRzOworCisJaW50ICgqY2hhcnNfaW5fYnVmZmVyKShzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKKwl2b2lkICgqd2FpdF91bnRpbF9zZW50KShzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKKwlpbnQgKCpzZXRfc3BlZWQpKHN0cnVjdCBzaXJfZGV2ICpkZXYsIHVuc2lnbmVkIHNwZWVkKTsKKwlpbnQgKCpzZXRfZHRyX3J0cykoc3RydWN0IHNpcl9kZXYgKmRldiwgaW50IGR0ciwgaW50IHJ0cyk7CisKKwlpbnQgKCpkb193cml0ZSkoc3RydWN0IHNpcl9kZXYgKmRldiwgY29uc3QgdW5zaWduZWQgY2hhciAqcHRyLCBzaXplX3QgbGVuKTsKKworCWludCAoKnN0YXJ0X2Rldikoc3RydWN0IHNpcl9kZXYgKmRldik7CisJaW50ICgqc3RvcF9kZXYpKHN0cnVjdCBzaXJfZGV2ICpkZXYpOworfTsKKworCisvKiBleHBvcnRlZCAqLworCitleHRlcm4gaW50IGlyZGFfcmVnaXN0ZXJfZG9uZ2xlKHN0cnVjdCBkb25nbGVfZHJpdmVyICpuZXcpOworZXh0ZXJuIGludCBpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKHN0cnVjdCBkb25nbGVfZHJpdmVyICpkcnYpOworCitleHRlcm4gc3RydWN0IHNpcl9kZXYgKiBzaXJkZXZfZ2V0X2luc3RhbmNlKGNvbnN0IHN0cnVjdCBzaXJfZHJpdmVyICpkcnYsIGNvbnN0IGNoYXIgKm5hbWUpOworZXh0ZXJuIGludCBzaXJkZXZfcHV0X2luc3RhbmNlKHN0cnVjdCBzaXJfZGV2ICpzZWxmKTsKKworZXh0ZXJuIGludCBzaXJkZXZfc2V0X2RvbmdsZShzdHJ1Y3Qgc2lyX2RldiAqZGV2LCBJUkRBX0RPTkdMRSB0eXBlKTsKK2V4dGVybiB2b2lkIHNpcmRldl93cml0ZV9jb21wbGV0ZShzdHJ1Y3Qgc2lyX2RldiAqZGV2KTsKK2V4dGVybiBpbnQgc2lyZGV2X3JlY2VpdmUoc3RydWN0IHNpcl9kZXYgKmRldiwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsIHNpemVfdCBjb3VudCk7CisKKy8qIGxvdyBsZXZlbCBoZWxwZXJzIGZvciBTSVIgZGV2aWNlL2RvbmdsZSBzZXR1cCAqLworZXh0ZXJuIGludCBzaXJkZXZfcmF3X3dyaXRlKHN0cnVjdCBzaXJfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbik7CitleHRlcm4gaW50IHNpcmRldl9yYXdfcmVhZChzdHJ1Y3Qgc2lyX2RldiAqZGV2LCBjaGFyICpidWYsIGludCBsZW4pOworZXh0ZXJuIGludCBzaXJkZXZfc2V0X2R0cl9ydHMoc3RydWN0IHNpcl9kZXYgKmRldiwgaW50IGR0ciwgaW50IHJ0cyk7CisKKy8qIG5vdCBleHBvcnRlZCAqLworCitleHRlcm4gaW50IHNpcmRldl9nZXRfZG9uZ2xlKHN0cnVjdCBzaXJfZGV2ICpzZWxmLCBJUkRBX0RPTkdMRSB0eXBlKTsKK2V4dGVybiBpbnQgc2lyZGV2X3B1dF9kb25nbGUoc3RydWN0IHNpcl9kZXYgKnNlbGYpOworCitleHRlcm4gdm9pZCBzaXJkZXZfZW5hYmxlX3J4KHN0cnVjdCBzaXJfZGV2ICpkZXYpOworZXh0ZXJuIGludCBzaXJkZXZfc2NoZWR1bGVfcmVxdWVzdChzdHJ1Y3Qgc2lyX2RldiAqZGV2LCBpbnQgc3RhdGUsIHVuc2lnbmVkIHBhcmFtKTsKK2V4dGVybiBpbnQgX19pbml0IGlyZGFfdGhyZWFkX2NyZWF0ZSh2b2lkKTsKK2V4dGVybiB2b2lkIF9fZXhpdCBpcmRhX3RocmVhZF9qb2luKHZvaWQpOworCisvKiBpbmxpbmUgaGVscGVycyAqLworCitzdGF0aWMgaW5saW5lIGludCBzaXJkZXZfc2NoZWR1bGVfc3BlZWQoc3RydWN0IHNpcl9kZXYgKmRldiwgdW5zaWduZWQgc3BlZWQpCit7CisJcmV0dXJuIHNpcmRldl9zY2hlZHVsZV9yZXF1ZXN0KGRldiwgU0lSREVWX1NUQVRFX1NFVF9TUEVFRCwgc3BlZWQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBzaXJkZXZfc2NoZWR1bGVfZG9uZ2xlX29wZW4oc3RydWN0IHNpcl9kZXYgKmRldiwgaW50IGRvbmdsZV9pZCkKK3sKKwlyZXR1cm4gc2lyZGV2X3NjaGVkdWxlX3JlcXVlc3QoZGV2LCBTSVJERVZfU1RBVEVfRE9OR0xFX09QRU4sIGRvbmdsZV9pZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNpcmRldl9zY2hlZHVsZV9kb25nbGVfY2xvc2Uoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlyZXR1cm4gc2lyZGV2X3NjaGVkdWxlX3JlcXVlc3QoZGV2LCBTSVJERVZfU1RBVEVfRE9OR0xFX0NMT1NFLCAwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2lyZGV2X3NjaGVkdWxlX2R0cl9ydHMoc3RydWN0IHNpcl9kZXYgKmRldiwgaW50IGR0ciwgaW50IHJ0cykKK3sKKwlpbnQJZHRycnRzOworCisJZHRycnRzID0gKChkdHIpID8gMHgwMiA6IDB4MDApIHwgKChydHMpID8gMHgwMSA6IDB4MDApOworCXJldHVybiBzaXJkZXZfc2NoZWR1bGVfcmVxdWVzdChkZXYsIFNJUkRFVl9TVEFURV9TRVRfRFRSX1JUUywgZHRycnRzKTsKK30KKworI2lmIDAKK3N0YXRpYyBpbmxpbmUgaW50IHNpcmRldl9zY2hlZHVsZV9tb2RlKHN0cnVjdCBzaXJfZGV2ICpkZXYsIGludCBtb2RlKQoreworCXJldHVybiBzaXJkZXZfc2NoZWR1bGVfcmVxdWVzdChkZXYsIFNJUkRFVl9TVEFURV9TRVRfTU9ERSwgbW9kZSk7Cit9CisjZW5kaWYKKworCitzdHJ1Y3Qgc2lyX2RldiB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKworCXN0cnVjdCBpcmxhcF9jYiAgICAqaXJsYXA7CisKKwlzdHJ1Y3QgcW9zX2luZm8gcW9zOworCisJY2hhciBod25hbWVbMzJdOworCisJc3RydWN0IHNpcl9mc20gZnNtOworCWF0b21pY190IGVuYWJsZV9yeDsKKwlpbnQgcmF3X3R4OworCXNwaW5sb2NrX3QgdHhfbG9jazsKKworCXUzMiBuZXdfc3BlZWQ7CisgCXUzMiBmbGFnczsKKworCXVuc2lnbmVkCXNwZWVkOworCisJaW9idWZmX3QgdHhfYnVmZjsgICAgICAgICAgLyogVHJhbnNtaXQgYnVmZmVyICovCisJaW9idWZmX3QgcnhfYnVmZjsgICAgICAgICAgLyogUmVjZWl2ZSBidWZmZXIgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOworCisJY29uc3Qgc3RydWN0IGRvbmdsZV9kcml2ZXIgKiBkb25nbGVfZHJ2OworCWNvbnN0IHN0cnVjdCBzaXJfZHJpdmVyICogZHJ2OworCXZvaWQgKnByaXY7CisKK307CisKKyNlbmRpZgkvKiBJUkRBX1NJUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Npcl9jb3JlLmMgYi9kcml2ZXJzL25ldC9pcmRhL3Npcl9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5ZjkxMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2NvcmUuYwpAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJc2lyX2NvcmUuYzoJbW9kdWxlIGNvcmUgZm9yIGlyZGEtc2lyIGFic3RyYWN0aW9uIGxheWVyCisgKgorICoJQ29weXJpZ2h0IChjKSAyMDAyIE1hcnRpbiBEaWVobAorICogCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKglwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqCXRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisKKyNpbmNsdWRlICJzaXItZGV2LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK01PRFVMRV9BVVRIT1IoIk1hcnRpbiBEaWVobCA8aW5mb0BtZGllaGwuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklyREEgU0lSIGNvcmUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworRVhQT1JUX1NZTUJPTChpcmRhX3JlZ2lzdGVyX2RvbmdsZSk7CitFWFBPUlRfU1lNQk9MKGlyZGFfdW5yZWdpc3Rlcl9kb25nbGUpOworCitFWFBPUlRfU1lNQk9MKHNpcmRldl9nZXRfaW5zdGFuY2UpOworRVhQT1JUX1NZTUJPTChzaXJkZXZfcHV0X2luc3RhbmNlKTsKKworRVhQT1JUX1NZTUJPTChzaXJkZXZfc2V0X2RvbmdsZSk7CitFWFBPUlRfU1lNQk9MKHNpcmRldl93cml0ZV9jb21wbGV0ZSk7CitFWFBPUlRfU1lNQk9MKHNpcmRldl9yZWNlaXZlKTsKKworRVhQT1JUX1NZTUJPTChzaXJkZXZfcmF3X3dyaXRlKTsKK0VYUE9SVF9TWU1CT0woc2lyZGV2X3Jhd19yZWFkKTsKK0VYUE9SVF9TWU1CT0woc2lyZGV2X3NldF9kdHJfcnRzKTsKKworc3RhdGljIGludCBfX2luaXQgc2lyX2NvcmVfaW5pdCh2b2lkKQoreworCXJldHVybiBpcmRhX3RocmVhZF9jcmVhdGUoKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNpcl9jb3JlX2V4aXQodm9pZCkKK3sKKwlpcmRhX3RocmVhZF9qb2luKCk7Cit9CisKK21vZHVsZV9pbml0KHNpcl9jb3JlX2luaXQpOworbW9kdWxlX2V4aXQoc2lyX2NvcmVfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2Rldi5jIGIvZHJpdmVycy9uZXQvaXJkYS9zaXJfZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZjNWE4OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2Rldi5jCkBAIC0wLDAgKzEsNjc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJc2lyX2Rldi5jOglpcmRhIHNpciBuZXR3b3JrIGRldmljZQorICogCisgKglDb3B5cmlnaHQgKGMpIDIwMDIgTWFydGluIERpZWhsCisgKiAKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqCXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICoJdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvd3JhcHBlci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisKKyNpbmNsdWRlICJzaXItZGV2LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgc2lyZGV2X2VuYWJsZV9yeChzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmZGV2LT5lbmFibGVfcngpKSkKKwkJcmV0dXJuOworCisJLyogZmx1c2ggcngtYnVmZmVyIC0gc2hvdWxkIGFsc28gaGVscCBpbiBjYXNlIG9mIHByb2JsZW1zIHdpdGggZWNobyBjYW5jZWxhdGlvbiAqLworCWRldi0+cnhfYnVmZi5kYXRhID0gZGV2LT5yeF9idWZmLmhlYWQ7CisJZGV2LT5yeF9idWZmLmxlbiA9IDA7CisJZGV2LT5yeF9idWZmLmluX2ZyYW1lID0gRkFMU0U7CisJZGV2LT5yeF9idWZmLnN0YXRlID0gT1VUU0lERV9GUkFNRTsKKwlhdG9taWNfc2V0KCZkZXYtPmVuYWJsZV9yeCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgc2lyZGV2X2lzX3JlY2VpdmluZyhzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCWlmICghYXRvbWljX3JlYWQoJmRldi0+ZW5hYmxlX3J4KSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKGRldi0+cnhfYnVmZi5zdGF0ZSAhPSBPVVRTSURFX0ZSQU1FKTsKK30KKworaW50IHNpcmRldl9zZXRfZG9uZ2xlKHN0cnVjdCBzaXJfZGV2ICpkZXYsIElSREFfRE9OR0xFIHR5cGUpCit7CisJaW50IGVycjsKKworCUlSREFfREVCVUcoMywgIiVzIDogcmVxdWVzdGluZyBkb25nbGUgJWQuXG4iLCBfX0ZVTkNUSU9OX18sIHR5cGUpOworCisJZXJyID0gc2lyZGV2X3NjaGVkdWxlX2RvbmdsZV9vcGVuKGRldiwgdHlwZSk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCXJldHVybiBlcnI7CisJZG93bigmZGV2LT5mc20uc2VtKTsJCS8qIGJsb2NrIHVudGlsIGNvbmZpZyBjaGFuZ2UgY29tcGxldGVkICovCisJZXJyID0gZGV2LT5mc20ucmVzdWx0OworCXVwKCZkZXYtPmZzbS5zZW0pOworCXJldHVybiBlcnI7Cit9CisKKy8qIHVzZWQgYnkgZG9uZ2xlIGRyaXZlcnMgZm9yIGRvbmdsZSBwcm9ncmFtbWluZyAqLworCitpbnQgc2lyZGV2X3Jhd193cml0ZShzdHJ1Y3Qgc2lyX2RldiAqZGV2LCBjb25zdCBjaGFyICpidWYsIGludCBsZW4pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJaWYgKHVubGlrZWx5KGxlbiA+IGRldi0+dHhfYnVmZi50cnVlc2l6ZSkpCisJCXJldHVybiAtRU5PU1BDOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dHhfbG9jaywgZmxhZ3MpOwkvKiBzZXJpYWxpemUgd2l0aCBvdGhlciB0eCBvcGVyYXRpb25zICovCisJd2hpbGUgKGRldi0+dHhfYnVmZi5sZW4gPiAwKSB7CQkJLyogd2FpdCB1bnRpbCB0eCBpZGxlICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dHhfbG9jaywgZmxhZ3MpOworCQltc2xlZXAoMTApOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT50eF9sb2NrLCBmbGFncyk7CisJfQorCisJZGV2LT50eF9idWZmLmRhdGEgPSBkZXYtPnR4X2J1ZmYuaGVhZDsKKwltZW1jcHkoZGV2LT50eF9idWZmLmRhdGEsIGJ1ZiwgbGVuKTsJCisJZGV2LT50eF9idWZmLmxlbiA9IGxlbjsKKworCXJldCA9IGRldi0+ZHJ2LT5kb193cml0ZShkZXYsIGRldi0+dHhfYnVmZi5kYXRhLCBkZXYtPnR4X2J1ZmYubGVuKTsKKwlpZiAocmV0ID4gMCkgeworCQlJUkRBX0RFQlVHKDMsICIlcygpLCByYXctdHggc3RhcnRlZFxuIiwgX19GVU5DVElPTl9fKTsKKworCQlkZXYtPnR4X2J1ZmYuZGF0YSArPSByZXQ7CisJCWRldi0+dHhfYnVmZi5sZW4gLT0gcmV0OworCQlkZXYtPnJhd190eCA9IDE7CisJCXJldCA9IGxlbjsJCS8qIGFsbCBkYXRhIGlzIGdvaW5nIHRvIGJlIHNlbnQgKi8KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT50eF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworLyogc2VlbXMgc29tZSBkb25nbGUgZHJpdmVycyBtYXkgbmVlZCB0aGlzICovCisKK2ludCBzaXJkZXZfcmF3X3JlYWQoc3RydWN0IHNpcl9kZXYgKmRldiwgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWludCBjb3VudDsKKworCWlmIChhdG9taWNfcmVhZCgmZGV2LT5lbmFibGVfcngpKQorCQlyZXR1cm4gLUVJTzsJCS8qIGZhaWwgaWYgd2UgZXhwZWN0IGlyZGEtZnJhbWVzICovCisKKwljb3VudCA9IChsZW4gPCBkZXYtPnJ4X2J1ZmYubGVuKSA/IGxlbiA6IGRldi0+cnhfYnVmZi5sZW47CisKKwlpZiAoY291bnQgPiAwKSB7CisJCW1lbWNweShidWYsIGRldi0+cnhfYnVmZi5kYXRhLCBjb3VudCk7CisJCWRldi0+cnhfYnVmZi5kYXRhICs9IGNvdW50OworCQlkZXYtPnJ4X2J1ZmYubGVuIC09IGNvdW50OworCX0KKworCS8qIHJlbWFpbmluZyBzdHVmZiBnZXRzIGZsdXNoZWQgd2hlbiByZS1lbmFibGluZyBub3JtYWwgcnggKi8KKworCXJldHVybiBjb3VudDsKK30KKworaW50IHNpcmRldl9zZXRfZHRyX3J0cyhzdHJ1Y3Qgc2lyX2RldiAqZGV2LCBpbnQgZHRyLCBpbnQgcnRzKQoreworCWludCByZXQgPSAtRU5YSU87CisJaWYgKGRldi0+ZHJ2LT5zZXRfZHRyX3J0cyAhPSAwKQorCQlyZXQgPSAgZGV2LT5kcnYtPnNldF9kdHJfcnRzKGRldiwgZHRyLCBydHMpOworCXJldHVybiByZXQ7Cit9CisJCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogY2FsbGVkIGZyb20gY2xpZW50IGRyaXZlciAtIGxpa2VseSB3aXRoIGJoLWNvbnRleHQgLSB0byBpbmRpY2F0ZQorICogaXQgbWFkZSBzb21lIHByb2dyZXNzIHdpdGggdHJhbnNtaXNzaW9uLiBIZW5jZSB3ZSBzZW5kIHRoZSBuZXh0CisgKiBjaHVuaywgaWYgYW55LCBvciBjb21wbGV0ZSB0aGUgc2tiIG90aGVyd2lzZQorICovCisKK3ZvaWQgc2lyZGV2X3dyaXRlX2NvbXBsZXRlKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBhY3R1YWwgPSAwOworCWludCBlcnI7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dHhfbG9jaywgZmxhZ3MpOworCisJSVJEQV9ERUJVRygzLCAiJXMoKSAtIGRldi0+dHhfYnVmZi5sZW4gPSAlZFxuIiwKKwkJICAgX19GVU5DVElPTl9fLCBkZXYtPnR4X2J1ZmYubGVuKTsKKworCWlmIChsaWtlbHkoZGV2LT50eF9idWZmLmxlbiA+IDApKSAgeworCQkvKiBXcml0ZSBkYXRhIGxlZnQgaW4gdHJhbnNtaXQgYnVmZmVyICovCisJCWFjdHVhbCA9IGRldi0+ZHJ2LT5kb193cml0ZShkZXYsIGRldi0+dHhfYnVmZi5kYXRhLCBkZXYtPnR4X2J1ZmYubGVuKTsKKworCQlpZiAobGlrZWx5KGFjdHVhbD4wKSkgeworCQkJZGV2LT50eF9idWZmLmRhdGEgKz0gYWN0dWFsOworCQkJZGV2LT50eF9idWZmLmxlbiAgLT0gYWN0dWFsOworCQl9CisJCWVsc2UgaWYgKHVubGlrZWx5KGFjdHVhbDwwKSkgeworCQkJLyogY291bGQgYmUgZHJvcHBlZCBsYXRlciB3aGVuIHdlIGhhdmUgdHhfdGltZW91dCB0byByZWNvdmVyICovCisJCQlJUkRBX0VSUk9SKCIlczogZHJ2LT5kb193cml0ZSBmYWlsZWQgKCVkKVxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18sIGFjdHVhbCk7CisJCQlpZiAoKHNrYj1kZXYtPnR4X3NrYikgIT0gTlVMTCkgeworCQkJCWRldi0+dHhfc2tiID0gTlVMTDsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CQkgICAgICAKKwkJCQlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsJCSAgICAgIAorCQkJfQorCQkJZGV2LT50eF9idWZmLmxlbiA9IDA7CisJCX0KKwkJaWYgKGRldi0+dHhfYnVmZi5sZW4gPiAwKQorCQkJZ290byBkb25lOwkvKiBtb3JlIGRhdGEgdG8gc2VuZCBsYXRlciAqLworCX0KKworCWlmICh1bmxpa2VseShkZXYtPnJhd190eCAhPSAwKSkgeworCQkvKiBpbiByYXcgbW9kZSB3ZSBhcmUganVzdCBkb25lIG5vdyBhZnRlciB0aGUgYnVmZmVyIHdhcyBzZW50CisJCSAqIGNvbXBsZXRlbHkuIFNpbmNlIHRoaXMgd2FzIHJlcXVlc3RlZCBieSBzb21lIGRvbmdsZSBkcml2ZXIKKwkJICogcnVubmluZyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgaXJkYS10aHJlYWQgd2UgbXVzdCB0YWtlCisJCSAqIGNhcmUgaGVyZSBub3QgdG8gcmUtZW5hYmxlIHRoZSBxdWV1ZS4gVGhlIHF1ZXVlIHdpbGwgYmUKKwkJICogcmVzdGFydGVkIHdoZW4gdGhlIGlyZGEtdGhyZWFkIGhhcyBjb21wbGV0ZWQgdGhlIHJlcXVlc3QuCisJCSAqLworCisJCUlSREFfREVCVUcoMywgIiVzKCksIHJhdy10eCBkb25lXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXYtPnJhd190eCA9IDA7CisJCWdvdG8gZG9uZTsJLyogbm8gcG9zdC1mcmFtZSBoYW5kbGluZyBpbiByYXcgbW9kZSAqLworCX0KKworCS8qIHdlIGhhdmUgZmluaXNoZWQgbm93IHNlbmRpbmcgdGhpcyBza2IuCisJICogdXBkYXRlIHN0YXRpc3RpY3MgYW5kIGZyZWUgdGhlIHNrYi4KKwkgKiBmaW5hbGx5IHdlIGNoZWNrIGFuZCB0cmlnZ2VyIGEgcGVuZGluZyBzcGVlZCBjaGFuZ2UsIGlmIGFueS4KKwkgKiBpZiBub3Qgd2Ugc3dpdGNoIHRvIHJ4IG1vZGUgYW5kIHdha2UgdGhlIHF1ZXVlIGZvciBmdXJ0aGVyCisJICogcGFja2V0cy4KKwkgKiBub3RlIHRoZSBzY2hlZHVsZWQgc3BlZWQgcmVxdWVzdCBibG9ja3MgdW50aWwgdGhlIGxvd2VyCisJICogY2xpZW50IGRyaXZlciBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgaGFyZHdhcmUgaGFzIHJlYWxseQorCSAqIGZpbmlzaGVkIHNlbmRpbmcgYWxsIGRhdGEgKHhtaXQgZmlmbyBkcmFpbmVkIGYuZS4pCisJICogYmVmb3JlIHRoZSBzcGVlZCBjaGFuZ2UgZ2V0cyBmaW5hbGx5IGRvbmUgYW5kIHRoZSBxdWV1ZQorCSAqIHJlLWFjdGl2YXRlZC4KKwkgKi8KKworCUlSREFfREVCVUcoNSwgIiVzKCksIGZpbmlzaGVkIHdpdGggZnJhbWUhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkKKwlpZiAoKHNrYj1kZXYtPnR4X3NrYikgIT0gTlVMTCkgeworCQlkZXYtPnR4X3NrYiA9IE5VTEw7CisJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOwkJICAgICAgCisJCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfQorCisJaWYgKHVubGlrZWx5KGRldi0+bmV3X3NwZWVkID4gMCkpIHsKKwkJSVJEQV9ERUJVRyg1LCAiJXMoKSwgQ2hhbmdpbmcgc3BlZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQllcnIgPSBzaXJkZXZfc2NoZWR1bGVfc3BlZWQoZGV2LCBkZXYtPm5ld19zcGVlZCk7CisJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuCisJCQkgKiBmb3JnZXQgdGhlIHNwZWVkIGNoYW5nZSBhbmQgaG9wZSB0aGUgc3RhY2sgcmVjb3ZlcnMKKwkJCSAqLworCQkJSVJEQV9FUlJPUigiJXMgLSBzY2hlZHVsZSBzcGVlZCBjaGFuZ2UgZmFpbGVkOiAlZFxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18sIGVycik7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldi0+bmV0ZGV2KTsKKwkJfQorCQkvKiBlbHNlOiBzdWNjZXNzCisJCSAqCXNwZWVkIGNoYW5nZSBpbiBwcm9ncmVzcyBub3cKKwkJICoJb24gY29tcGxldGlvbiBkZXYtPm5ld19zcGVlZCBnZXRzIGNsZWFyZWQsCisJCSAqCXJ4LXJlZW5hYmxlZCBhbmQgdGhlIHF1ZXVlIHJlc3RhcnRlZAorCQkgKi8KKwl9CisJZWxzZSB7CisJCXNpcmRldl9lbmFibGVfcngoZGV2KTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYtPm5ldGRldik7CisJfQorCitkb25lOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dHhfbG9jaywgZmxhZ3MpOworfQorCisvKiBjYWxsZWQgZnJvbSBjbGllbnQgZHJpdmVyIC0gbGlrZWx5IHdpdGggYmgtY29udGV4dCAtIHRvIGdpdmUgdXMKKyAqIHNvbWUgbW9yZSByZWNlaXZlZCBieXRlcy4gV2UgcHV0IHRoZW0gaW50byB0aGUgcngtYnVmZmVyLAorICogbm9ybWFsbHkgdW53cmFwcGluZyBhbmQgYnVpbGRpbmcgTEFQLXNrYidzICh1bmxlc3MgcnggZGlzYWJsZWQpCisgKi8KKworaW50IHNpcmRldl9yZWNlaXZlKHN0cnVjdCBzaXJfZGV2ICpkZXYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLCBzaXplX3QgY291bnQpIAoreworCWlmICghZGV2IHx8ICFkZXYtPm5ldGRldikgeworCQlJUkRBX1dBUk5JTkcoIiVzKCksIG5vdCByZWFkeSB5ZXQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCFkZXYtPmlybGFwKSB7CisJCUlSREFfV0FSTklORygiJXMgLSB0b28gZWFybHk6ICVwIC8gJXpkIVxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fLCBjcCwgY291bnQpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGNwPT1OVUxMKSB7CisJCS8qIGVycm9yIGFscmVhZHkgYXQgbG93ZXIgbGV2ZWwgcmVjZWl2ZQorCQkgKiBqdXN0IHVwZGF0ZSBzdGF0cyBhbmQgc2V0IG1lZGlhIGJ1c3kKKwkJICovCisJCWlyZGFfZGV2aWNlX3NldF9tZWRpYV9idXN5KGRldi0+bmV0ZGV2LCBUUlVFKTsKKwkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCUlSREFfREVCVUcoMCwgIiVzOyByeC1kcm9wOiAlemRcbiIsIF9fRlVOQ1RJT05fXywgY291bnQpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBSZWFkIHRoZSBjaGFyYWN0ZXJzIGludG8gdGhlIGJ1ZmZlciAqLworCWlmIChsaWtlbHkoYXRvbWljX3JlYWQoJmRldi0+ZW5hYmxlX3J4KSkpIHsKKwkJd2hpbGUgKGNvdW50LS0pCisJCQkvKiBVbndyYXAgYW5kIGRlc3R1ZmYgb25lIGJ5dGUgKi8KKwkJCWFzeW5jX3Vud3JhcF9jaGFyKGRldi0+bmV0ZGV2LCAmZGV2LT5zdGF0cywgCisJCQkJCSAgJmRldi0+cnhfYnVmZiwgKmNwKyspOworCX0gZWxzZSB7CisJCXdoaWxlIChjb3VudC0tKSB7CisJCQkvKiByeCBub3QgZW5hYmxlZDogc2F2ZSB0aGUgcmF3IGJ5dGVzIGFuZCBuZXZlcgorCQkJICogdHJpZ2dlciBhbnkgbmV0aWZfcnguIFRoZSByZWNlaXZlZCBieXRlcyBhcmUgZmx1c2hlZAorCQkJICogbGF0ZXIgd2hlbiB3ZSByZS1lbmFibGUgcnggYnV0IG1pZ2h0IGJlIHJlYWQgbWVhbndoaWxlCisJCQkgKiBieSB0aGUgZG9uZ2xlIGRyaXZlci4KKwkJCSAqLworCQkJZGV2LT5yeF9idWZmLmRhdGFbZGV2LT5yeF9idWZmLmxlbisrXSA9ICpjcCsrOworCisJCQkvKiBXaGF0IHNob3VsZCB3ZSBkbyB3aGVuIHRoZSBidWZmZXIgaXMgZnVsbD8gKi8KKwkJCWlmICh1bmxpa2VseShkZXYtPnJ4X2J1ZmYubGVuID09IGRldi0+cnhfYnVmZi50cnVlc2l6ZSkpCisJCQkJZGV2LT5yeF9idWZmLmxlbiA9IDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGNhbGxiYWNrcyBmcm9tIG5ldHdvcmsgbGF5ZXIgKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzaXJkZXZfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBzaXJfZGV2ICpkZXYgPSBuZGV2LT5wcml2OworCisJcmV0dXJuIChkZXYpID8gJmRldi0+c3RhdHMgOiBOVUxMOworfQorCitzdGF0aWMgaW50IHNpcmRldl9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IHNpcl9kZXYgKmRldiA9IG5kZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgYWN0dWFsID0gMDsKKwlpbnQgZXJyOworCXMzMiBzcGVlZDsKKworCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gMDspOworCisJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKworCUlSREFfREVCVUcoMywgIiVzKCksIHNrYi0+bGVuID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgc2tiLT5sZW4pOworCisJc3BlZWQgPSBpcmRhX2dldF9uZXh0X3NwZWVkKHNrYik7CisJaWYgKChzcGVlZCAhPSBkZXYtPnNwZWVkKSAmJiAoc3BlZWQgIT0gLTEpKSB7CisJCWlmICghc2tiLT5sZW4pIHsKKwkJCWVyciA9IHNpcmRldl9zY2hlZHVsZV9zcGVlZChkZXYsIHNwZWVkKTsKKwkJCWlmICh1bmxpa2VseShlcnIgPT0gLUVXT1VMREJMT0NLKSkgeworCQkJCS8qIEZhaWxlZCB0byBpbml0aWF0ZSB0aGUgc3BlZWQgY2hhbmdlLCBsaWtlbHkgdGhlIGZzbQorCQkJCSAqIGlzIHN0aWxsIGJ1c3kgKHByZXR0eSB1bmxpa2VseSwgYnV0Li4uKQorCQkJCSAqIFdlIHJlZnVzZSB0byBhY2NlcHQgdGhlIHNrYiBhbmQgcmV0dXJuIHdpdGggdGhlIHF1ZXVlCisJCQkJICogc3RvcHBlZCBzbyB0aGUgbmV0d29yayBsYXllciB3aWxsIHJldHJ5IGFmdGVyIHRoZQorCQkJCSAqIGZzbSBjb21wbGV0ZXMgYW5kIHdha2VzIHRoZSBxdWV1ZS4KKwkJCQkgKi8KKwkJCQkgcmV0dXJuIDE7CisJCQl9CisJCQllbHNlIGlmICh1bmxpa2VseShlcnIpKSB7CisJCQkJLyogb3RoZXIgZmF0YWwgZXJyb3IgLSBmb3JnZXQgdGhlIHNwZWVkIGNoYW5nZSBhbmQKKwkJCQkgKiBob3BlIHRoZSBzdGFjayB3aWxsIHJlY292ZXIgc29tZWhvdworCQkJCSAqLworCQkJCSBuZXRpZl9zdGFydF9xdWV1ZShuZGV2KTsKKwkJCX0KKwkJCS8qIGVsc2U6IHN1Y2Nlc3MKKwkJCSAqCXNwZWVkIGNoYW5nZSBpbiBwcm9ncmVzcyBub3cKKwkJCSAqCW9uIGNvbXBsZXRpb24gdGhlIHF1ZXVlIGdldHMgcmVzdGFydGVkCisJCQkgKi8KKworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCWRldi0+bmV3X3NwZWVkID0gc3BlZWQ7CisJfQorCisJLyogSW5pdCB0eCBidWZmZXIqLworCWRldi0+dHhfYnVmZi5kYXRhID0gZGV2LT50eF9idWZmLmhlYWQ7CisKKwkvKiBDaGVjayBwcm9ibGVtcyAqLworCWlmKHNwaW5faXNfbG9ja2VkKCZkZXYtPnR4X2xvY2spKSB7CisJCUlSREFfREVCVUcoMywgIiVzKCksIHdyaXRlIG5vdCBjb21wbGV0ZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJfQorCisJLyogc2VyaWFsaXplIHdpdGggd3JpdGUgY29tcGxldGlvbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnR4X2xvY2ssIGZsYWdzKTsKKworICAgICAgICAvKiBDb3B5IHNrYiB0byB0eF9idWZmIHdoaWxlIHdyYXBwaW5nLCBzdHVmZmluZyBhbmQgbWFraW5nIENSQyAqLworCWRldi0+dHhfYnVmZi5sZW4gPSBhc3luY193cmFwX3NrYihza2IsIGRldi0+dHhfYnVmZi5kYXRhLCBkZXYtPnR4X2J1ZmYudHJ1ZXNpemUpOyAKKworCS8qIHRyYW5zbWlzc2lvbiB3aWxsIHN0YXJ0IG5vdyAtIGRpc2FibGUgcmVjZWl2ZS4KKwkgKiBpZiB3ZSBhcmUganVzdCBpbiB0aGUgbWlkZGxlIG9mIGFuIGluY29taW5nIGZyYW1lLAorCSAqIHRyZWF0IGl0IGFzIGNvbGxpc2lvbi4gcHJvYmFibHkgaXQncyBhIGdvb2QgaWRlYSB0bworCSAqIHJlc2V0IHRoZSByeF9idWYgT1VUU0lERV9GUkFNRSBpbiB0aGlzIGNhc2UgdG9vPworCSAqLworCWF0b21pY19zZXQoJmRldi0+ZW5hYmxlX3J4LCAwKTsKKwlpZiAodW5saWtlbHkoc2lyZGV2X2lzX3JlY2VpdmluZyhkZXYpKSkKKwkJZGV2LT5zdGF0cy5jb2xsaXNpb25zKys7CisKKwlhY3R1YWwgPSBkZXYtPmRydi0+ZG9fd3JpdGUoZGV2LCBkZXYtPnR4X2J1ZmYuZGF0YSwgZGV2LT50eF9idWZmLmxlbik7CisKKwlpZiAobGlrZWx5KGFjdHVhbCA+IDApKSB7CisJCWRldi0+dHhfc2tiID0gc2tiOworCQluZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCWRldi0+dHhfYnVmZi5kYXRhICs9IGFjdHVhbDsKKwkJZGV2LT50eF9idWZmLmxlbiAtPSBhY3R1YWw7CisJfQorCWVsc2UgaWYgKHVubGlrZWx5KGFjdHVhbCA8IDApKSB7CisJCS8qIGNvdWxkIGJlIGRyb3BwZWQgbGF0ZXIgd2hlbiB3ZSBoYXZlIHR4X3RpbWVvdXQgdG8gcmVjb3ZlciAqLworCQlJUkRBX0VSUk9SKCIlczogZHJ2LT5kb193cml0ZSBmYWlsZWQgKCVkKVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgYWN0dWFsKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsJCSAgICAgIAorCQlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsJCSAgICAgIAorCQluZXRpZl93YWtlX3F1ZXVlKG5kZXYpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnR4X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKiBjYWxsZWQgZnJvbSBuZXR3b3JrIGxheWVyIHdpdGggcnRubCBob2xkICovCisKK3N0YXRpYyBpbnQgc2lyZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBpZl9pcmRhX3JlcSAqaXJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKSBycTsKKwlzdHJ1Y3Qgc2lyX2RldiAqZGV2ID0gbmRldi0+cHJpdjsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCUlSREFfREVCVUcoMywgIiVzKCksICVzLCAoY21kPTB4JVgpXG4iLCBfX0ZVTkNUSU9OX18sIG5kZXYtPm5hbWUsIGNtZCk7CisJCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NTQkFORFdJRFRIOiAvKiBTZXQgYmFuZHdpZHRoICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldCA9IC1FUEVSTTsKKwkJZWxzZQorCQkJcmV0ID0gc2lyZGV2X3NjaGVkdWxlX3NwZWVkKGRldiwgaXJxLT5pZnJfYmF1ZHJhdGUpOworCQkvKiBjYW5ub3Qgc2xlZXAgaGVyZSBmb3IgY29tcGxldGlvbgorCQkgKiB3ZSBhcmUgY2FsbGVkIGZyb20gbmV0d29yayBsYXllciB3aXRoIHJ0bmwgaG9sZAorCQkgKi8KKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTRE9OR0xFOiAvKiBTZXQgZG9uZ2xlICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldCA9IC1FUEVSTTsKKwkJZWxzZQorCQkJcmV0ID0gc2lyZGV2X3NjaGVkdWxlX2RvbmdsZV9vcGVuKGRldiwgaXJxLT5pZnJfZG9uZ2xlKTsKKwkJLyogY2Fubm90IHNsZWVwIGhlcmUgZm9yIGNvbXBsZXRpb24KKwkJICogd2UgYXJlIGNhbGxlZCBmcm9tIG5ldHdvcmsgbGF5ZXIgd2l0aCBydG5sIGhvbGQKKwkJICovCisJCWJyZWFrOworCisJY2FzZSBTSU9DU01FRElBQlVTWTogLyogU2V0IG1lZGlhIGJ1c3kgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0ID0gLUVQRVJNOworCQllbHNlCisJCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShkZXYtPm5ldGRldiwgVFJVRSk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR1JFQ0VJVklORzogLyogQ2hlY2sgaWYgd2UgYXJlIHJlY2VpdmluZyByaWdodCBub3cgKi8KKwkJaXJxLT5pZnJfcmVjZWl2aW5nID0gc2lyZGV2X2lzX3JlY2VpdmluZyhkZXYpOworCQlicmVhazsKKworCWNhc2UgU0lPQ1NEVFJSVFM6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldCA9IC1FUEVSTTsKKwkJZWxzZQorCQkJcmV0ID0gc2lyZGV2X3NjaGVkdWxlX2R0cl9ydHMoZGV2LCBpcnEtPmlmcl9kdHIsIGlycS0+aWZyX3J0cyk7CisJCS8qIGNhbm5vdCBzbGVlcCBoZXJlIGZvciBjb21wbGV0aW9uCisJCSAqIHdlIGFyZSBjYWxsZWQgZnJvbSBuZXR3b3JrIGxheWVyIHdpdGggcnRubCBob2xkCisJCSAqLworCQlicmVhazsKKworCWNhc2UgU0lPQ1NNT0RFOgorI2lmIDAKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0ID0gLUVQRVJNOworCQllbHNlCisJCQlyZXQgPSBzaXJkZXZfc2NoZWR1bGVfbW9kZShkZXYsIGlycS0+aWZyX21vZGUpOworCQkvKiBjYW5ub3Qgc2xlZXAgaGVyZSBmb3IgY29tcGxldGlvbgorCQkgKiB3ZSBhcmUgY2FsbGVkIGZyb20gbmV0d29yayBsYXllciB3aXRoIHJ0bmwgaG9sZAorCQkgKi8KKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisJCisJcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBTSVJCVUZfQUxMT0NTSVpFIDQyNjkJLyogd29yc3QgY2FzZSBzaXplIG9mIGEgd3JhcHBlZCBJckxBUCBmcmFtZSAqLworCitzdGF0aWMgaW50IHNpcmRldl9hbGxvY19idWZmZXJzKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJZGV2LT50eF9idWZmLnRydWVzaXplID0gU0lSQlVGX0FMTE9DU0laRTsKKwlkZXYtPnJ4X2J1ZmYudHJ1ZXNpemUgPSBJUkRBX1NLQl9NQVhfTVRVOyAKKworCS8qIEJvb3RzdHJhcCBaZXJvQ29weSBSeCAqLworCWRldi0+cnhfYnVmZi5za2IgPSBfX2Rldl9hbGxvY19za2IoZGV2LT5yeF9idWZmLnRydWVzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGV2LT5yeF9idWZmLnNrYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlza2JfcmVzZXJ2ZShkZXYtPnJ4X2J1ZmYuc2tiLCAxKTsKKwlkZXYtPnJ4X2J1ZmYuaGVhZCA9IGRldi0+cnhfYnVmZi5za2ItPmRhdGE7CisKKwlkZXYtPnR4X2J1ZmYuaGVhZCA9IGttYWxsb2MoZGV2LT50eF9idWZmLnRydWVzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGV2LT50eF9idWZmLmhlYWQgPT0gTlVMTCkgeworCQlrZnJlZV9za2IoZGV2LT5yeF9idWZmLnNrYik7CisJCWRldi0+cnhfYnVmZi5za2IgPSBOVUxMOworCQlkZXYtPnJ4X2J1ZmYuaGVhZCA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRldi0+dHhfYnVmZi5kYXRhID0gZGV2LT50eF9idWZmLmhlYWQ7CisJZGV2LT5yeF9idWZmLmRhdGEgPSBkZXYtPnJ4X2J1ZmYuaGVhZDsKKwlkZXYtPnR4X2J1ZmYubGVuID0gMDsKKwlkZXYtPnJ4X2J1ZmYubGVuID0gMDsKKworCWRldi0+cnhfYnVmZi5pbl9mcmFtZSA9IEZBTFNFOworCWRldi0+cnhfYnVmZi5zdGF0ZSA9IE9VVFNJREVfRlJBTUU7CisJcmV0dXJuIDA7Cit9OworCitzdGF0aWMgdm9pZCBzaXJkZXZfZnJlZV9idWZmZXJzKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJaWYgKGRldi0+cnhfYnVmZi5za2IpCisJCWtmcmVlX3NrYihkZXYtPnJ4X2J1ZmYuc2tiKTsKKwlpZiAoZGV2LT50eF9idWZmLmhlYWQpCisJCWtmcmVlKGRldi0+dHhfYnVmZi5oZWFkKTsKKwlkZXYtPnJ4X2J1ZmYuaGVhZCA9IGRldi0+dHhfYnVmZi5oZWFkID0gTlVMTDsKKwlkZXYtPnJ4X2J1ZmYuc2tiID0gTlVMTDsKK30KKworc3RhdGljIGludCBzaXJkZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3Qgc2lyX2RldiAqZGV2ID0gbmRldi0+cHJpdjsKKwljb25zdCBzdHJ1Y3Qgc2lyX2RyaXZlciAqZHJ2ID0gZGV2LT5kcnY7CisKKwlpZiAoIWRydikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBpbmNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBkcml2ZXIgbW9kdWxlIGJlZm9yZSBkb2luZyBzZXJpb3VzIHN0dWZmICovCisJaWYgKCF0cnlfbW9kdWxlX2dldChkcnYtPm93bmVyKSkKKwkJcmV0dXJuIC1FU1RBTEU7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaWYgKHNpcmRldl9hbGxvY19idWZmZXJzKGRldikpCisJCWdvdG8gZXJyb3V0X2RlYzsKKworCWlmICghZGV2LT5kcnYtPnN0YXJ0X2RldiAgfHwgIGRldi0+ZHJ2LT5zdGFydF9kZXYoZGV2KSkKKwkJZ290byBlcnJvdXRfZnJlZTsKKworCXNpcmRldl9lbmFibGVfcngoZGV2KTsKKwlkZXYtPnJhd190eCA9IDA7CisKKwluZXRpZl9zdGFydF9xdWV1ZShuZGV2KTsKKwlkZXYtPmlybGFwID0gaXJsYXBfb3BlbihuZGV2LCAmZGV2LT5xb3MsIGRldi0+aHduYW1lKTsKKwlpZiAoIWRldi0+aXJsYXApCisJCWdvdG8gZXJyb3V0X3N0b3A7CisKKwluZXRpZl93YWtlX3F1ZXVlKG5kZXYpOworCisJSVJEQV9ERUJVRygyLCAiJXMgLSBkb25lLCBzcGVlZCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGRldi0+c3BlZWQpOworCisJcmV0dXJuIDA7CisKK2Vycm91dF9zdG9wOgorCWF0b21pY19zZXQoJmRldi0+ZW5hYmxlX3J4LCAwKTsKKwlpZiAoZGV2LT5kcnYtPnN0b3BfZGV2KQorCQlkZXYtPmRydi0+c3RvcF9kZXYoZGV2KTsKK2Vycm91dF9mcmVlOgorCXNpcmRldl9mcmVlX2J1ZmZlcnMoZGV2KTsKK2Vycm91dF9kZWM6CisJbW9kdWxlX3B1dChkcnYtPm93bmVyKTsKKwlyZXR1cm4gLUVBR0FJTjsKK30KKworc3RhdGljIGludCBzaXJkZXZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IHNpcl9kZXYgKmRldiA9IG5kZXYtPnByaXY7CisJY29uc3Qgc3RydWN0IHNpcl9kcml2ZXIgKmRydjsKKworLy8JSVJEQV9ERUJVRygwLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCisJZG93bigmZGV2LT5mc20uc2VtKTsJCS8qIGJsb2NrIG9uIHBlbmRpbmcgY29uZmlnIGNvbXBsZXRpb24gKi8KKworCWF0b21pY19zZXQoJmRldi0+ZW5hYmxlX3J4LCAwKTsKKworCWlmICh1bmxpa2VseSghZGV2LT5pcmxhcCkpCisJCWdvdG8gb3V0OworCWlybGFwX2Nsb3NlKGRldi0+aXJsYXApOworCWRldi0+aXJsYXAgPSBOVUxMOworCisJZHJ2ID0gZGV2LT5kcnY7CisJaWYgKHVubGlrZWx5KCFkcnYgIHx8ICAhZGV2LT5wcml2KSkKKwkJZ290byBvdXQ7CisKKwlpZiAoZHJ2LT5zdG9wX2RldikKKwkJZHJ2LT5zdG9wX2RldihkZXYpOworCisJc2lyZGV2X2ZyZWVfYnVmZmVycyhkZXYpOworCW1vZHVsZV9wdXQoZHJ2LT5vd25lcik7CisKK291dDoKKwlkZXYtPnNwZWVkID0gMDsKKwl1cCgmZGV2LT5mc20uc2VtKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IHNpcl9kZXYgKiBzaXJkZXZfZ2V0X2luc3RhbmNlKGNvbnN0IHN0cnVjdCBzaXJfZHJpdmVyICpkcnYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJc3RydWN0IHNpcl9kZXYgKmRldjsKKworCUlSREFfREVCVUcoMCwgIiVzIC0gJXNcbiIsIF9fRlVOQ1RJT05fXywgbmFtZSk7CisKKwkvKiBpbnN0ZWFkIG9mIGFkZGluZyB0ZXN0cyB0byBwcm90ZWN0IGFnYWluc3QgZHJ2LT5kb193cml0ZT09TlVMTAorCSAqIGF0IHNldmVyYWwgcGxhY2VzIHdlIHJlZnVzZSB0byBjcmVhdGUgYSBzaXJfZGV2IGluc3RhbmNlIGZvcgorCSAqIGRyaXZlcnMgd2hpY2ggZG9uJ3QgaW1wbGVtZW50IGRvX3dyaXRlLgorCSAqLworCWlmICghZHJ2IHx8ICAhZHJ2LT5kb193cml0ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqICBBbGxvY2F0ZSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGRldmljZQorCSAqLworCW5kZXYgPSBhbGxvY19pcmRhZGV2KHNpemVvZigqZGV2KSk7CisJaWYgKG5kZXYgPT0gTlVMTCkgeworCQlJUkRBX0VSUk9SKCIlcyAtIENhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgSXJEQSBjb250cm9sIGJsb2NrIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXQ7CisJfQorCWRldiA9IG5kZXYtPnByaXY7CisKKwlpcmRhX2luaXRfbWF4X3Fvc19jYXBhYmlsaWVzKCZkZXYtPnFvcyk7CisJZGV2LT5xb3MuYmF1ZF9yYXRlLmJpdHMgPSBJUl85NjAwfElSXzE5MjAwfElSXzM4NDAwfElSXzU3NjAwfElSXzExNTIwMDsKKwlkZXYtPnFvcy5taW5fdHVybl90aW1lLmJpdHMgPSBkcnYtPnFvc19tdHRfYml0czsKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKCZkZXYtPnFvcyk7CisKKwlzdHJuY3B5KGRldi0+aHduYW1lLCBuYW1lLCBzaXplb2YoZGV2LT5od25hbWUpLTEpOworCisJYXRvbWljX3NldCgmZGV2LT5lbmFibGVfcngsIDApOworCWRldi0+dHhfc2tiID0gTlVMTDsKKworCXNwaW5fbG9ja19pbml0KCZkZXYtPnR4X2xvY2spOworCWluaXRfTVVURVgoJmRldi0+ZnNtLnNlbSk7CisKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5mc20ucnEubGhfcmVxdWVzdCk7CisJZGV2LT5mc20ucnEucGVuZGluZyA9IDA7CisJaW5pdF90aW1lcigmZGV2LT5mc20ucnEudGltZXIpOworCisJZGV2LT5kcnYgPSBkcnY7CisJZGV2LT5uZXRkZXYgPSBuZGV2OworCisJU0VUX01PRFVMRV9PV05FUihuZGV2KTsKKworCS8qIE92ZXJyaWRlIHRoZSBuZXR3b3JrIGZ1bmN0aW9ucyB3ZSBuZWVkIHRvIHVzZSAqLworCW5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHNpcmRldl9oYXJkX3htaXQ7CisJbmRldi0+b3BlbiA9IHNpcmRldl9vcGVuOworCW5kZXYtPnN0b3AgPSBzaXJkZXZfY2xvc2U7CisJbmRldi0+Z2V0X3N0YXRzID0gc2lyZGV2X2dldF9zdGF0czsKKwluZGV2LT5kb19pb2N0bCA9IHNpcmRldl9pb2N0bDsKKworCWlmIChyZWdpc3Rlcl9uZXRkZXYobmRldikpIHsKKwkJSVJEQV9FUlJPUigiJXMoKSwgcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXRfZnJlZW5ldGRldjsKKwl9CisKKwlyZXR1cm4gZGV2OworCitvdXRfZnJlZW5ldGRldjoKKwlmcmVlX25ldGRldihuZGV2KTsKK291dDoKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IHNpcmRldl9wdXRfaW5zdGFuY2Uoc3RydWN0IHNpcl9kZXYgKmRldikKK3sKKwlpbnQgZXJyID0gMDsKKworCUlSREFfREVCVUcoMCwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJYXRvbWljX3NldCgmZGV2LT5lbmFibGVfcngsIDApOworCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2LT5uZXRkZXYpOworCW5ldGlmX2RldmljZV9kZXRhY2goZGV2LT5uZXRkZXYpOworCisJaWYgKGRldi0+ZG9uZ2xlX2RydikKKwkJZXJyID0gc2lyZGV2X3NjaGVkdWxlX2RvbmdsZV9jbG9zZShkZXYpOworCWlmIChlcnIpCisJCUlSREFfRVJST1IoIiVzIC0gZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKworCXNpcmRldl9jbG9zZShkZXYtPm5ldGRldik7CisKKwlkb3duKCZkZXYtPmZzbS5zZW0pOworCWRldi0+ZnNtLnN0YXRlID0gU0lSREVWX1NUQVRFX0RFQUQ7CS8qIG1hcmsgc3RhbGVkICovCisJZGV2LT5kb25nbGVfZHJ2ID0gTlVMTDsKKwlkZXYtPnByaXYgPSBOVUxMOworCXVwKCZkZXYtPmZzbS5zZW0pOworCisJLyogUmVtb3ZlIG5ldGRldmljZSAqLworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldi0+bmV0ZGV2KTsKKworCWZyZWVfbmV0ZGV2KGRldi0+bmV0ZGV2KTsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Npcl9kb25nbGUuYyBiL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2RvbmdsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1Yjc2NzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3Npcl9kb25nbGUuYwpAQCAtMCwwICsxLDEzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCXNpcl9kb25nbGUuYzoJbWFuYWdlciBmb3Igc2VyaWFsIGRvbmdsZSBwcm90b2NvbCBkcml2ZXJzCisgKgorICoJQ29weXJpZ2h0IChjKSAyMDAyIE1hcnRpbiBEaWVobAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqCXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICoJdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKworI2luY2x1ZGUgInNpci1kZXYuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZG9uZ2xlIHJlZ2lzdHJhdGlvbiBhbmQgYXR0YWNobWVudAorICoKKyAqLworCitzdGF0aWMgTElTVF9IRUFEKGRvbmdsZV9saXN0KTsJCQkvKiBsaXN0IG9mIHJlZ2lzdGVyZWQgZG9uZ2xlIGRyaXZlcnMgKi8KK3N0YXRpYyBERUNMQVJFX01VVEVYKGRvbmdsZV9saXN0X2xvY2spOwkJLyogcHJvdGVjdHMgdGhlIGxpc3QgKi8KKworaW50IGlyZGFfcmVnaXN0ZXJfZG9uZ2xlKHN0cnVjdCBkb25nbGVfZHJpdmVyICpuZXcpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisJc3RydWN0IGRvbmdsZV9kcml2ZXIgKmRydjsKKworCUlSREFfREVCVUcoMCwgIiVzIDogcmVnaXN0ZXJpbmcgZG9uZ2xlIFwiJXNcIiAoJWQpLlxuIiwKKwkJICAgX19GVU5DVElPTl9fLCBuZXctPmRyaXZlcl9uYW1lLCBuZXctPnR5cGUpOworCisJZG93bigmZG9uZ2xlX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmRvbmdsZV9saXN0KSB7CisJCWRydiA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBkb25nbGVfZHJpdmVyLCBkb25nbGVfbGlzdCk7CisJCWlmIChuZXctPnR5cGUgPT0gZHJ2LT50eXBlKSB7CisJCQl1cCgmZG9uZ2xlX2xpc3RfbG9jayk7CisJCQlyZXR1cm4gLUVFWElTVDsKKwkJfQorCX0KKwlsaXN0X2FkZCgmbmV3LT5kb25nbGVfbGlzdCwgJmRvbmdsZV9saXN0KTsKKwl1cCgmZG9uZ2xlX2xpc3RfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKHN0cnVjdCBkb25nbGVfZHJpdmVyICpkcnYpCit7CisJZG93bigmZG9uZ2xlX2xpc3RfbG9jayk7CisJbGlzdF9kZWwoJmRydi0+ZG9uZ2xlX2xpc3QpOworCXVwKCZkb25nbGVfbGlzdF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNpcmRldl9nZXRfZG9uZ2xlKHN0cnVjdCBzaXJfZGV2ICpkZXYsIElSREFfRE9OR0xFIHR5cGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisJY29uc3Qgc3RydWN0IGRvbmdsZV9kcml2ZXIgKmRydiA9IE5VTEw7CisJaW50IGVyciA9IC1FSU5WQUw7CisKKyNpZmRlZiBDT05GSUdfS01PRAorCXJlcXVlc3RfbW9kdWxlKCJpcmRhLWRvbmdsZS0lZCIsIHR5cGUpOworI2VuZGlmCisKKwlpZiAoZGV2LT5kb25nbGVfZHJ2ICE9IE5VTEwpCisJCXJldHVybiAtRUJVU1k7CisJCisJLyogc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIGRvbmdsZXMgKi8KKwlkb3duKCZkb25nbGVfbGlzdF9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2goZW50cnksICZkb25nbGVfbGlzdCkgeworCQlkcnYgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZG9uZ2xlX2RyaXZlciwgZG9uZ2xlX2xpc3QpOworCQlpZiAoZHJ2LT50eXBlID09IHR5cGUpCisJCQlicmVhazsKKwkJZWxzZQorCQkJZHJ2ID0gTlVMTDsKKwl9CisKKwlpZiAoIWRydikgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dF91bmxvY2s7CS8qIG5vIHN1Y2ggZG9uZ2xlICovCisJfQorCisJLyogaGFuZGxpbmcgb2YgU01QIHJhY2VzIHdpdGggZG9uZ2xlIG1vZHVsZSByZW1vdmFsIC0gdGhyZWUgY2FzZXM6CisJICogMSkgZG9uZ2xlIGRyaXZlciB3YXMgYWxyZWFkeSB1bnJlZ2lzdGVyZWQgLSB0aGVuIHdlIGhhdmVuJ3QgZm91bmQgdGhlCisJICoJcmVxdWVzdGVkIGRvbmdsZSBhYm92ZSBhbmQgYXJlIGFscmVhZHkgb3V0IGhlcmUKKwkgKiAyKSB0aGUgbW9kdWxlIGlzIGFscmVhZHkgbWFya2VkIGRlbGV0ZWQgYnV0IHRoZSBkcml2ZXIgaXMgc3RpbGwKKwkgKglyZWdpc3RlcmVkIC0gdGhlbiB0aGUgdHJ5X21vZHVsZV9nZXQoKSBiZWxvdyB3aWxsIGZhaWwKKwkgKiAzKSB0aGUgdHJ5X21vZHVsZV9nZXQoKSBiZWxvdyBzdWNjZWVkcyBiZWZvcmUgdGhlIG1vZHVsZSBpcyBtYXJrZWQKKwkgKglkZWxldGVkIC0gdGhlbiBzeXNfZGVsZXRlX21vZHVsZSgpIGZhaWxzIGFuZCBwcmV2ZW50cyB0aGUgcmVtb3ZhbAorCSAqCWJlY2F1c2UgdGhlIG1vZHVsZSBpcyBpbiB1c2UuCisJICovCisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KGRydi0+b3duZXIpKSB7CisJCWVyciA9IC1FU1RBTEU7CisJCWdvdG8gb3V0X3VubG9jazsJLyogcm1tb2QgYWxyZWFkeSBwZW5kaW5nICovCisJfQorCWRldi0+ZG9uZ2xlX2RydiA9IGRydjsKKworCWlmICghZHJ2LT5vcGVuICB8fCAgKGVycj1kcnYtPm9wZW4oZGV2KSkhPTApCisJCWdvdG8gb3V0X3JlamVjdDsJCS8qIGZhaWxlZCB0byBvcGVuIGRyaXZlciAqLworCisJdXAoJmRvbmdsZV9saXN0X2xvY2spOworCXJldHVybiAwOworCitvdXRfcmVqZWN0OgorCWRldi0+ZG9uZ2xlX2RydiA9IE5VTEw7CisJbW9kdWxlX3B1dChkcnYtPm93bmVyKTsKK291dF91bmxvY2s6CisJdXAoJmRvbmdsZV9saXN0X2xvY2spOworCXJldHVybiBlcnI7Cit9CisKK2ludCBzaXJkZXZfcHV0X2RvbmdsZShzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCWNvbnN0IHN0cnVjdCBkb25nbGVfZHJpdmVyICpkcnYgPSBkZXYtPmRvbmdsZV9kcnY7CisKKwlpZiAoZHJ2KSB7CisJCWlmIChkcnYtPmNsb3NlKQorCQkJZHJ2LT5jbG9zZShkZXYpOwkJLyogY2xvc2UgdGhpcyBkb25nbGUgaW5zdGFuY2UgKi8KKworCQlkZXYtPmRvbmdsZV9kcnYgPSBOVUxMOwkJCS8qIHVubGluayB0aGUgZG9uZ2xlIGRyaXZlciAqLworCQltb2R1bGVfcHV0KGRydi0+b3duZXIpOy8qIGRlY3JlbWVudCBkcml2ZXIncyBtb2R1bGUgcmVmY291bnQgKi8KKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2t0aHJlYWQuYyBiL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2t0aHJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGNlYTEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zaXJfa3RocmVhZC5jCkBAIC0wLDAgKzEsNTAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJc2lyX2t0aHJlYWQuYzoJCWRlZGljYXRlZCB0aHJlYWQgdG8gcHJvY2VzcyBzY2hlZHVsZWQKKyAqCQkJCXNpciBkZXZpY2Ugc2V0dXAgcmVxdWVzdHMKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDIgTWFydGluIERpZWhsCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICoJcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKgl0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorCisjaW5jbHVkZSAic2lyLWRldi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBrSXJEQWQga2VybmVsIHRocmVhZCBhbmQgY29uZmlnIHN0YXRlIG1hY2hpbmUKKyAqCisgKi8KKworc3RydWN0IGlyZGFfcmVxdWVzdF9xdWV1ZSB7CisJc3RydWN0IGxpc3RfaGVhZCByZXF1ZXN0X2xpc3Q7CisJc3BpbmxvY2tfdCBsb2NrOworCXRhc2tfdCAqdGhyZWFkOworCXN0cnVjdCBjb21wbGV0aW9uIGV4aXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3Qga2ljaywgZG9uZTsKKwlhdG9taWNfdCBudW1fcGVuZGluZzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXJkYV9yZXF1ZXN0X3F1ZXVlIGlyZGFfcnFfcXVldWU7CisKK3N0YXRpYyBpbnQgaXJkYV9xdWV1ZV9yZXF1ZXN0KHN0cnVjdCBpcmRhX3JlcXVlc3QgKnJxKQoreworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoMCwgJnJxLT5wZW5kaW5nKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaXJkYV9ycV9xdWV1ZS5sb2NrLCBmbGFncyk7CisJCWxpc3RfYWRkX3RhaWwoJnJxLT5saF9yZXF1ZXN0LCAmaXJkYV9ycV9xdWV1ZS5yZXF1ZXN0X2xpc3QpOworCQl3YWtlX3VwKCZpcmRhX3JxX3F1ZXVlLmtpY2spOworCQlhdG9taWNfaW5jKCZpcmRhX3JxX3F1ZXVlLm51bV9wZW5kaW5nKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJkYV9ycV9xdWV1ZS5sb2NrLCBmbGFncyk7CisJCXJldCA9IDE7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGlyZGFfcmVxdWVzdF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGlyZGFfcmVxdWVzdCAqcnEgPSAoc3RydWN0IGlyZGFfcmVxdWVzdCAqKWRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJkYV9ycV9xdWV1ZS5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmcnEtPmxoX3JlcXVlc3QsICZpcmRhX3JxX3F1ZXVlLnJlcXVlc3RfbGlzdCk7CisJd2FrZV91cCgmaXJkYV9ycV9xdWV1ZS5raWNrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcmRhX3JxX3F1ZXVlLmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBpcmRhX3F1ZXVlX2RlbGF5ZWRfcmVxdWVzdChzdHJ1Y3QgaXJkYV9yZXF1ZXN0ICpycSwgdW5zaWduZWQgbG9uZyBkZWxheSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIgPSAmcnEtPnRpbWVyOworCisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KDAsICZycS0+cGVuZGluZykpIHsKKwkJdGltZXItPmV4cGlyZXMgPSBqaWZmaWVzICsgZGVsYXk7CisJCXRpbWVyLT5mdW5jdGlvbiA9IGlyZGFfcmVxdWVzdF90aW1lcjsKKwkJdGltZXItPmRhdGEgPSAodW5zaWduZWQgbG9uZylycTsKKwkJYXRvbWljX2luYygmaXJkYV9ycV9xdWV1ZS5udW1fcGVuZGluZyk7CisJCWFkZF90aW1lcih0aW1lcik7CisJCXJldCA9IDE7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHJ1bl9pcmRhX3F1ZXVlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSwgKnRtcDsKKwlzdHJ1Y3QgaXJkYV9yZXF1ZXN0ICpycTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpcmRhX3JxX3F1ZXVlLmxvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgJmlyZGFfcnFfcXVldWUucmVxdWVzdF9saXN0KSB7CisJCXJxID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGlyZGFfcmVxdWVzdCwgbGhfcmVxdWVzdCk7CisJCWxpc3RfZGVsX2luaXQoZW50cnkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcmRhX3JxX3F1ZXVlLmxvY2ssIGZsYWdzKTsKKworCQljbGVhcl9iaXQoMCwgJnJxLT5wZW5kaW5nKTsKKwkJcnEtPmZ1bmMocnEtPmRhdGEpOworCisJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZpcmRhX3JxX3F1ZXVlLm51bV9wZW5kaW5nKSkKKwkJCXdha2VfdXAoJmlyZGFfcnFfcXVldWUuZG9uZSk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlyZGFfcnFfcXVldWUubG9jaywgZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcmRhX3JxX3F1ZXVlLmxvY2ssIGZsYWdzKTsKK30JCQorCitzdGF0aWMgaW50IGlyZGFfdGhyZWFkKHZvaWQgKnN0YXJ0dXApCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlkYWVtb25pemUoImtJckRBZCIpOworCisJaXJkYV9ycV9xdWV1ZS50aHJlYWQgPSBjdXJyZW50OworCisJY29tcGxldGUoKHN0cnVjdCBjb21wbGV0aW9uICopc3RhcnR1cCk7CisKKwl3aGlsZSAoaXJkYV9ycV9xdWV1ZS50aHJlYWQgIT0gTlVMTCkgeworCisJCS8qIFdlIHVzZSBUQVNLX0lOVEVSUlVQVElCTEUsIHJhdGhlciB0aGFuCisJCSAqIFRBU0tfVU5JTlRFUlJVUFRJQkxFLiAgQW5kcmV3IE1vcnRvbiBtYWRlIHRoaXMKKwkJICogY2hhbmdlIDsgaGUgdG9sZCBtZSB0aGF0IGl0IGlzIHNhZmUsIGJlY2F1c2UgInNpZ25hbAorCQkgKiBibG9ja2luZyBpcyBub3cgaGFuZGxlZCBpbiBkYWVtb25pemUoKSIsIGhlIGFkZGVkCisJCSAqIHRoYXQgdGhlIHByb2JsZW0gaXMgdGhhdCAidW5pbnRlcnJ1cHRpYmxlIHNsZWVwCisJCSAqIGNvbnRyaWJ1dGVzIHRvIGxvYWQgYXZlcmFnZSIsIG1ha2luZyB1c2VyIHdvcnJ5LgorCQkgKiBKZWFuIElJICovCisJCXNldF90YXNrX3N0YXRlKGN1cnJlbnQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWFkZF93YWl0X3F1ZXVlKCZpcmRhX3JxX3F1ZXVlLmtpY2ssICZ3YWl0KTsKKwkJaWYgKGxpc3RfZW1wdHkoJmlyZGFfcnFfcXVldWUucmVxdWVzdF9saXN0KSkKKwkJCXNjaGVkdWxlKCk7CisJCWVsc2UKKwkJCV9fc2V0X3Rhc2tfc3RhdGUoY3VycmVudCwgVEFTS19SVU5OSU5HKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJmlyZGFfcnFfcXVldWUua2ljaywgJndhaXQpOworCisJCS8qIG1ha2Ugc3dzdXNwIGhhcHB5IHdpdGggb3VyIHRocmVhZCAqLworCQlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9GUkVFWkUpCisJCQlyZWZyaWdlcmF0b3IoUEZfRlJFRVpFKTsKKworCQlydW5faXJkYV9xdWV1ZSgpOworCX0KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSwzNSkKKwlyZXBhcmVudF90b19pbml0KCk7CisjZW5kaWYKKwljb21wbGV0ZV9hbmRfZXhpdCgmaXJkYV9ycV9xdWV1ZS5leGl0LCAwKTsKKwkvKiBuZXZlciByZWFjaGVkICovCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgZmx1c2hfaXJkYV9xdWV1ZSh2b2lkKQoreworCWlmIChhdG9taWNfcmVhZCgmaXJkYV9ycV9xdWV1ZS5udW1fcGVuZGluZykpIHsKKworCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCQlpZiAoIWxpc3RfZW1wdHkoJmlyZGFfcnFfcXVldWUucmVxdWVzdF9saXN0KSkKKwkJCXJ1bl9pcmRhX3F1ZXVlKCk7CisKKwkJc2V0X3Rhc2tfc3RhdGUoY3VycmVudCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlhZGRfd2FpdF9xdWV1ZSgmaXJkYV9ycV9xdWV1ZS5kb25lLCAmd2FpdCk7CisJCWlmIChhdG9taWNfcmVhZCgmaXJkYV9ycV9xdWV1ZS5udW1fcGVuZGluZykpCisJCQlzY2hlZHVsZSgpOworCQllbHNlCisJCQlfX3NldF90YXNrX3N0YXRlKGN1cnJlbnQsIFRBU0tfUlVOTklORyk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZpcmRhX3JxX3F1ZXVlLmRvbmUsICZ3YWl0KTsKKwl9Cit9CisKKy8qIHN1YnN0YXRlIGhhbmRsZXIgb2YgdGhlIGNvbmZpZy1mc20gdG8gaGFuZGxlIHRoZSBjYXNlcyB3aGVyZSB3ZSB3YW50CisgKiB0byB3YWl0IGZvciB0cmFuc21pdCBjb21wbGV0aW9uIGJlZm9yZSBjaGFuZ2luZyB0aGUgcG9ydCBjb25maWd1cmF0aW9uCisgKi8KKworc3RhdGljIGludCBpcmRhX3R4X2NvbXBsZXRlX2ZzbShzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCXN0cnVjdCBzaXJfZnNtICpmc20gPSAmZGV2LT5mc207CisJdW5zaWduZWQgbmV4dF9zdGF0ZSwgZGVsYXk7CisJdW5zaWduZWQgYnl0ZXNfbGVmdDsKKworCWRvIHsKKwkJbmV4dF9zdGF0ZSA9IGZzbS0+c3Vic3RhdGU7CS8qIGRlZmF1bHQ6IHN0YXkgaW4gY3VycmVudCBzdWJzdGF0ZSAqLworCQlkZWxheSA9IDA7CisKKwkJc3dpdGNoKGZzbS0+c3Vic3RhdGUpIHsKKworCQljYXNlIFNJUkRFVl9TVEFURV9XQUlUX1hNSVQ6CisJCQlpZiAoZGV2LT5kcnYtPmNoYXJzX2luX2J1ZmZlcikKKwkJCQlieXRlc19sZWZ0ID0gZGV2LT5kcnYtPmNoYXJzX2luX2J1ZmZlcihkZXYpOworCQkJZWxzZQorCQkJCWJ5dGVzX2xlZnQgPSAwOworCQkJaWYgKCFieXRlc19sZWZ0KSB7CisJCQkJbmV4dF9zdGF0ZSA9IFNJUkRFVl9TVEFURV9XQUlUX1VOVElMX1NFTlQ7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChkZXYtPnNwZWVkID4gMTE1MjAwKQorCQkJCWRlbGF5ID0gKGJ5dGVzX2xlZnQqOCoxMDAwMCkgLyAoZGV2LT5zcGVlZC8xMDApOworCQkJZWxzZSBpZiAoZGV2LT5zcGVlZCA+IDApCisJCQkJZGVsYXkgPSAoYnl0ZXNfbGVmdCoxMCoxMDAwMCkgLyAoZGV2LT5zcGVlZC8xMDApOworCQkJZWxzZQorCQkJCWRlbGF5ID0gMDsKKwkJCS8qIGV4cGVjdGVkIGRlbGF5ICh1c2VjKSB1bnRpbCByZW1haW5pbmcgYnl0ZXMgYXJlIHNlbnQgKi8KKwkJCWlmIChkZWxheSA8IDEwMCkgeworCQkJCXVkZWxheShkZWxheSk7CisJCQkJZGVsYXkgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogc2xlZXAgc29tZSBsb25nZXIgZGVsYXkgKG1zZWMpICovCisJCQlkZWxheSA9IChkZWxheSs5OTkpIC8gMTAwMDsKKwkJCWJyZWFrOworCisJCWNhc2UgU0lSREVWX1NUQVRFX1dBSVRfVU5USUxfU0VOVDoKKwkJCS8qIGJsb2NrIHVudGlsIHVuZGVybGF5aW5nIGhhcmR3YXJlIGJ1ZmZlciBhcmUgZW1wdHkgKi8KKwkJCWlmIChkZXYtPmRydi0+d2FpdF91bnRpbF9zZW50KQorCQkJCWRldi0+ZHJ2LT53YWl0X3VudGlsX3NlbnQoZGV2KTsKKwkJCW5leHRfc3RhdGUgPSBTSVJERVZfU1RBVEVfVFhfRE9ORTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0lSREVWX1NUQVRFX1RYX0RPTkU6CisJCQlyZXR1cm4gMDsKKworCQlkZWZhdWx0OgorCQkJSVJEQV9FUlJPUigiJXMgLSB1bmRlZmluZWQgc3RhdGVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlmc20tPnN1YnN0YXRlID0gbmV4dF9zdGF0ZTsKKwl9IHdoaWxlIChkZWxheSA9PSAwKTsKKwlyZXR1cm4gZGVsYXk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmRhX2NvbmZpZ19mc20KKyAqCisgKiBTdGF0ZSBtYWNoaW5lIHRvIGhhbmRsZSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgZGV2aWNlIChhbmQgYXR0YWNoZWQgZG9uZ2xlLCBpZiBhbnkpLgorICogVGhpcyBoYW5kbGVyIGlzIHNjaGVkdWxlZCBmb3IgZXhlY3V0aW9uIGluIGtJckRBZCBjb250ZXh0LCBzbyB3ZSBjYW4gc2xlZXAuCisgKiBob3dldmVyLCBrSXJEQWQgaXMgc2hhcmVkIGJ5IGFsbCBzaXJfZGV2IGRldmljZXMgc28gd2UgYmV0dGVyIGRvbid0IHNsZWVwIHRoZXJlIHRvbworICogbG9uZy4gSW5zdGVhZCwgZm9yIGxvbmdlciBkZWxheXMgd2Ugc3RhcnQgYSB0aW1lciB0byByZXNjaGVkdWxlIHVzIGxhdGVyLgorICogT24gZW50cnksIGZzbS0+c2VtIGlzIGFsd2F5cyBsb2NrZWQgYW5kIHRoZSBuZXRkZXYgeG1pdCBxdWV1ZSBzdG9wcGVkLgorICogQm90aCBtdXN0IGJlIHVubG9ja2VkL3Jlc3RhcnRlZCBvbiBjb21wbGV0aW9uIC0gYnV0IG9ubHkgb24gZmluYWwgZXhpdC4KKyAqLworCitzdGF0aWMgdm9pZCBpcmRhX2NvbmZpZ19mc20odm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc2lyX2RldiAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3Qgc2lyX2ZzbSAqZnNtID0gJmRldi0+ZnNtOworCWludCBuZXh0X3N0YXRlOworCWludCByZXQgPSAtMTsKKwl1bnNpZ25lZCBkZWxheTsKKworCUlSREFfREVCVUcoMiwgIiVzKCksIDwlbGQ+XG4iLCBfX0ZVTkNUSU9OX18sIGppZmZpZXMpOyAKKworCWRvIHsKKwkJSVJEQV9ERUJVRygzLCAiJXMgLSBzdGF0ZT0weCUwNHggLyBzdWJzdGF0ZT0weCUwNHhcbiIsCisJCQlfX0ZVTkNUSU9OX18sIGZzbS0+c3RhdGUsIGZzbS0+c3Vic3RhdGUpOworCisJCW5leHRfc3RhdGUgPSBmc20tPnN0YXRlOworCQlkZWxheSA9IDA7CisKKwkJc3dpdGNoKGZzbS0+c3RhdGUpIHsKKworCQljYXNlIFNJUkRFVl9TVEFURV9ET05HTEVfT1BFTjoKKwkJCWlmIChkZXYtPmRvbmdsZV9kcnYgIT0gTlVMTCkgeworCQkJCXJldCA9IHNpcmRldl9wdXRfZG9uZ2xlKGRldik7CisJCQkJaWYgKHJldCkgeworCQkJCQlmc20tPnJlc3VsdCA9IC1FSU5WQUw7CisJCQkJCW5leHRfc3RhdGUgPSBTSVJERVZfU1RBVEVfRVJST1I7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJLyogSW5pdGlhbGl6ZSBkb25nbGUgKi8KKwkJCXJldCA9IHNpcmRldl9nZXRfZG9uZ2xlKGRldiwgZnNtLT5wYXJhbSk7CisJCQlpZiAocmV0KSB7CisJCQkJZnNtLT5yZXN1bHQgPSByZXQ7CisJCQkJbmV4dF9zdGF0ZSA9IFNJUkRFVl9TVEFURV9FUlJPUjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogRG9uZ2xlcyBhcmUgcG93ZXJlZCB0aHJvdWdoIHRoZSBtb2RlbSBjb250cm9sIGxpbmVzIHdoaWNoCisJCQkgKiB3ZXJlIGp1c3Qgc2V0IGR1cmluZyBvcGVuLiBCZWZvcmUgcmVzZXR0aW5nLCBsZXQncyB3YWl0IGZvcgorCQkJICogdGhlIHBvd2VyIHRvIHN0YWJpbGl6ZS4gVGhpcyBpcyB3aGF0IHNvbWUgZG9uZ2xlIGRyaXZlcnMgZGlkCisJCQkgKiBpbiBvcGVuIGJlZm9yZSwgd2hpbGUgb3RoZXJzIGRpZG4ndCAtIHNob3VsZCBiZSBzYWZlIGFueXdheS4KKwkJCSAqLworCisJCQlkZWxheSA9IDUwOworCQkJZnNtLT5zdWJzdGF0ZSA9IFNJUkRFVl9TVEFURV9ET05HTEVfUkVTRVQ7CisJCQluZXh0X3N0YXRlID0gU0lSREVWX1NUQVRFX0RPTkdMRV9SRVNFVDsKKworCQkJZnNtLT5wYXJhbSA9IDk2MDA7CisKKwkJCWJyZWFrOworCisJCWNhc2UgU0lSREVWX1NUQVRFX0RPTkdMRV9DTE9TRToKKwkJCS8qIHNob3VsZG4ndCB3ZSBqdXN0IHRyZWF0IHRoaXMgYXMgc3VjY2Vzcz0/ICovCisJCQlpZiAoZGV2LT5kb25nbGVfZHJ2ID09IE5VTEwpIHsKKwkJCQlmc20tPnJlc3VsdCA9IC1FSU5WQUw7CisJCQkJbmV4dF9zdGF0ZSA9IFNJUkRFVl9TVEFURV9FUlJPUjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcmV0ID0gc2lyZGV2X3B1dF9kb25nbGUoZGV2KTsKKwkJCWlmIChyZXQpIHsKKwkJCQlmc20tPnJlc3VsdCA9IHJldDsKKwkJCQluZXh0X3N0YXRlID0gU0lSREVWX1NUQVRFX0VSUk9SOworCQkJCWJyZWFrOworCQkJfQorCQkJbmV4dF9zdGF0ZSA9IFNJUkRFVl9TVEFURV9ET05FOworCQkJYnJlYWs7CisKKwkJY2FzZSBTSVJERVZfU1RBVEVfU0VUX0RUUl9SVFM6CisJCQlyZXQgPSBzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LAorCQkJCShmc20tPnBhcmFtJjB4MDIpID8gVFJVRSA6IEZBTFNFLAorCQkJCShmc20tPnBhcmFtJjB4MDEpID8gVFJVRSA6IEZBTFNFKTsKKwkJCW5leHRfc3RhdGUgPSBTSVJERVZfU1RBVEVfRE9ORTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0lSREVWX1NUQVRFX1NFVF9TUEVFRDoKKwkJCWZzbS0+c3Vic3RhdGUgPSBTSVJERVZfU1RBVEVfV0FJVF9YTUlUOworCQkJbmV4dF9zdGF0ZSA9IFNJUkRFVl9TVEFURV9ET05HTEVfQ0hFQ0s7CisJCQlicmVhazsKKworCQljYXNlIFNJUkRFVl9TVEFURV9ET05HTEVfQ0hFQ0s6CisJCQlyZXQgPSBpcmRhX3R4X2NvbXBsZXRlX2ZzbShkZXYpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlmc20tPnJlc3VsdCA9IHJldDsKKwkJCQluZXh0X3N0YXRlID0gU0lSREVWX1NUQVRFX0VSUk9SOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKChkZWxheT1yZXQpICE9IDApCisJCQkJYnJlYWs7CisKKwkJCWlmIChkZXYtPmRvbmdsZV9kcnYpIHsKKwkJCQlmc20tPnN1YnN0YXRlID0gU0lSREVWX1NUQVRFX0RPTkdMRV9SRVNFVDsKKwkJCQluZXh0X3N0YXRlID0gU0lSREVWX1NUQVRFX0RPTkdMRV9SRVNFVDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWRldi0+c3BlZWQgPSBmc20tPnBhcmFtOworCQkJCW5leHRfc3RhdGUgPSBTSVJERVZfU1RBVEVfUE9SVF9TUEVFRDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU0lSREVWX1NUQVRFX0RPTkdMRV9SRVNFVDoKKwkJCWlmIChkZXYtPmRvbmdsZV9kcnYtPnJlc2V0KSB7CisJCQkJcmV0ID0gZGV2LT5kb25nbGVfZHJ2LT5yZXNldChkZXYpOwkKKwkJCQlpZiAocmV0IDwgMCkgeworCQkJCQlmc20tPnJlc3VsdCA9IHJldDsKKwkJCQkJbmV4dF9zdGF0ZSA9IFNJUkRFVl9TVEFURV9FUlJPUjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJCXJldCA9IDA7CisJCQlpZiAoKGRlbGF5PXJldCkgPT0gMCkgeworCQkJCS8qIHNldCBzZXJpYWwgcG9ydCBhY2NvcmRpbmcgdG8gZG9uZ2xlIGRlZmF1bHQgc3BlZWQgKi8KKwkJCQlpZiAoZGV2LT5kcnYtPnNldF9zcGVlZCkKKwkJCQkJZGV2LT5kcnYtPnNldF9zcGVlZChkZXYsIGRldi0+c3BlZWQpOworCQkJCWZzbS0+c3Vic3RhdGUgPSBTSVJERVZfU1RBVEVfRE9OR0xFX1NQRUVEOworCQkJCW5leHRfc3RhdGUgPSBTSVJERVZfU1RBVEVfRE9OR0xFX1NQRUVEOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTSVJERVZfU1RBVEVfRE9OR0xFX1NQRUVEOgkJCQkKKwkJCWlmIChkZXYtPmRvbmdsZV9kcnYtPnJlc2V0KSB7CisJCQkJcmV0ID0gZGV2LT5kb25nbGVfZHJ2LT5zZXRfc3BlZWQoZGV2LCBmc20tPnBhcmFtKTsKKwkJCQlpZiAocmV0IDwgMCkgeworCQkJCQlmc20tPnJlc3VsdCA9IHJldDsKKwkJCQkJbmV4dF9zdGF0ZSA9IFNJUkRFVl9TVEFURV9FUlJPUjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJCXJldCA9IDA7CisJCQlpZiAoKGRlbGF5PXJldCkgPT0gMCkKKwkJCQluZXh0X3N0YXRlID0gU0lSREVWX1NUQVRFX1BPUlRfU1BFRUQ7CisJCQlicmVhazsKKworCQljYXNlIFNJUkRFVl9TVEFURV9QT1JUX1NQRUVEOgorCQkJLyogRmluYWxseSB3ZSBhcmUgcmVhZHkgdG8gY2hhbmdlIHRoZSBzZXJpYWwgcG9ydCBzcGVlZCAqLworCQkJaWYgKGRldi0+ZHJ2LT5zZXRfc3BlZWQpCisJCQkJZGV2LT5kcnYtPnNldF9zcGVlZChkZXYsIGRldi0+c3BlZWQpOworCQkJZGV2LT5uZXdfc3BlZWQgPSAwOworCQkJbmV4dF9zdGF0ZSA9IFNJUkRFVl9TVEFURV9ET05FOworCQkJYnJlYWs7CisKKwkJY2FzZSBTSVJERVZfU1RBVEVfRE9ORToKKwkJCS8qIFNpZ25hbCBuZXR3b3JrIGxheWVyIHNvIGl0IGNhbiBzZW5kIG1vcmUgZnJhbWVzICovCisJCQluZXRpZl93YWtlX3F1ZXVlKGRldi0+bmV0ZGV2KTsKKwkJCW5leHRfc3RhdGUgPSBTSVJERVZfU1RBVEVfQ09NUExFVEU7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJSVJEQV9FUlJPUigiJXMgLSB1bmRlZmluZWQgc3RhdGVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlmc20tPnJlc3VsdCA9IC1FSU5WQUw7CisJCQkvKiBmYWxsIHRocnUgKi8KKworCQljYXNlIFNJUkRFVl9TVEFURV9FUlJPUjoKKwkJCUlSREFfRVJST1IoIiVzIC0gZXJyb3I6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGZzbS0+cmVzdWx0KTsKKworI2lmIDAJLyogZG9uJ3QgZW5hYmxlIHRoaXMgYmVmb3JlIHdlIGhhdmUgbmV0ZGV2LT50eF90aW1lb3V0IHRvIHJlY292ZXIgKi8KKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2LT5uZXRkZXYpOworI2Vsc2UKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2LT5uZXRkZXYpOworI2VuZGlmCisJCQkvKiBmYWxsIHRocnUgKi8KKworCQljYXNlIFNJUkRFVl9TVEFURV9DT01QTEVURToKKwkJCS8qIGNvbmZpZyBjaGFuZ2UgZmluaXNoZWQsIHNvIHdlIGFyZSBub3QgYnVzeSBhbnkgbG9uZ2VyICovCisJCQlzaXJkZXZfZW5hYmxlX3J4KGRldik7CisJCQl1cCgmZnNtLT5zZW0pOworCQkJcmV0dXJuOworCQl9CisJCWZzbS0+c3RhdGUgPSBuZXh0X3N0YXRlOworCX0gd2hpbGUoIWRlbGF5KTsKKworCWlyZGFfcXVldWVfZGVsYXllZF9yZXF1ZXN0KCZmc20tPnJxLCBtc2Vjc190b19qaWZmaWVzKGRlbGF5KSk7Cit9CisKKy8qIHNjaGVkdWxlIHNvbWUgZGV2aWNlIGNvbmZpZ3VyYXRpb24gdGFzayBmb3IgZXhlY3V0aW9uIGJ5IGtJckRBZAorICogb24gYmVoYWxmIG9mIHRoZSBhYm92ZSBzdGF0ZSBtYWNoaW5lLgorICogY2FuIGJlIGNhbGxlZCBmcm9tIHByb2Nlc3Mgb3IgaW50ZXJydXB0L3Rhc2tsZXQgY29udGV4dC4KKyAqLworCitpbnQgc2lyZGV2X3NjaGVkdWxlX3JlcXVlc3Qoc3RydWN0IHNpcl9kZXYgKmRldiwgaW50IGluaXRpYWxfc3RhdGUsIHVuc2lnbmVkIHBhcmFtKQoreworCXN0cnVjdCBzaXJfZnNtICpmc20gPSAmZGV2LT5mc207CisJaW50IHhtaXRfd2FzX2Rvd247CisKKwlJUkRBX0RFQlVHKDIsICIlcyAtIHN0YXRlPTB4JTA0eCAvIHBhcmFtPSV1XG4iLCBfX0ZVTkNUSU9OX18sIGluaXRpYWxfc3RhdGUsIHBhcmFtKTsKKworCWlmIChkb3duX3RyeWxvY2soJmZzbS0+c2VtKSkgeworCQlpZiAoaW5faW50ZXJydXB0KCkgIHx8ICBpbl9hdG9taWMoKSAgfHwgIGlycXNfZGlzYWJsZWQoKSkgeworCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgc3RhdGUgbWFjaGluZSBidXN5IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtRVdPVUxEQkxPQ0s7CisJCX0gZWxzZQorCQkJZG93bigmZnNtLT5zZW0pOworCX0KKworCWlmIChmc20tPnN0YXRlID09IFNJUkRFVl9TVEFURV9ERUFEKSB7CisJCS8qIHJhY2Ugd2l0aCBzaXJkZXZfY2xvc2Ugc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQlJUkRBX0VSUk9SKCIlcygpLCBpbnN0YW5jZSBzdGFsZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQl1cCgmZnNtLT5zZW0pOworCQlyZXR1cm4gLUVTVEFMRTsJCS8qIG9yIGJldHRlciBFUElQRT8gKi8KKwl9CisKKwl4bWl0X3dhc19kb3duID0gbmV0aWZfcXVldWVfc3RvcHBlZChkZXYtPm5ldGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYtPm5ldGRldik7CisJYXRvbWljX3NldCgmZGV2LT5lbmFibGVfcngsIDApOworCisJZnNtLT5zdGF0ZSA9IGluaXRpYWxfc3RhdGU7CisJZnNtLT5wYXJhbSA9IHBhcmFtOworCWZzbS0+cmVzdWx0ID0gMDsKKworCUlOSVRfTElTVF9IRUFEKCZmc20tPnJxLmxoX3JlcXVlc3QpOworCWZzbS0+cnEucGVuZGluZyA9IDA7CisJZnNtLT5ycS5mdW5jID0gaXJkYV9jb25maWdfZnNtOworCWZzbS0+cnEuZGF0YSA9IGRldjsKKworCWlmICghaXJkYV9xdWV1ZV9yZXF1ZXN0KCZmc20tPnJxKSkgewkvKiByZXR1cm5zIDAgb24gZXJyb3IhICovCisJCWF0b21pY19zZXQoJmRldi0+ZW5hYmxlX3J4LCAxKTsKKwkJaWYgKCF4bWl0X3dhc19kb3duKQorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYtPm5ldGRldik7CQkKKwkJdXAoJmZzbS0+c2VtKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCXJldHVybiAwOworfQorCitpbnQgX19pbml0IGlyZGFfdGhyZWFkX2NyZWF0ZSh2b2lkKQoreworCXN0cnVjdCBjb21wbGV0aW9uIHN0YXJ0dXA7CisJaW50IHBpZDsKKworCXNwaW5fbG9ja19pbml0KCZpcmRhX3JxX3F1ZXVlLmxvY2spOworCWlyZGFfcnFfcXVldWUudGhyZWFkID0gTlVMTDsKKwlJTklUX0xJU1RfSEVBRCgmaXJkYV9ycV9xdWV1ZS5yZXF1ZXN0X2xpc3QpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmlyZGFfcnFfcXVldWUua2ljayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaXJkYV9ycV9xdWV1ZS5kb25lKTsKKwlhdG9taWNfc2V0KCZpcmRhX3JxX3F1ZXVlLm51bV9wZW5kaW5nLCAwKTsKKworCWluaXRfY29tcGxldGlvbigmc3RhcnR1cCk7CisJcGlkID0ga2VybmVsX3RocmVhZChpcmRhX3RocmVhZCwgJnN0YXJ0dXAsIENMT05FX0ZTfENMT05FX0ZJTEVTKTsKKwlpZiAocGlkIDw9IDApCisJCXJldHVybiAtRUFHQUlOOworCWVsc2UKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmc3RhcnR1cCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2V4aXQgaXJkYV90aHJlYWRfam9pbih2b2lkKSAKK3sKKwlpZiAoaXJkYV9ycV9xdWV1ZS50aHJlYWQpIHsKKwkJZmx1c2hfaXJkYV9xdWV1ZSgpOworCQlpbml0X2NvbXBsZXRpb24oJmlyZGFfcnFfcXVldWUuZXhpdCk7CisJCWlyZGFfcnFfcXVldWUudGhyZWFkID0gTlVMTDsKKwkJd2FrZV91cCgmaXJkYV9ycV9xdWV1ZS5raWNrKTsJCQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZpcmRhX3JxX3F1ZXVlLmV4aXQpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMgYi9kcml2ZXJzL25ldC9pcmRhL3Ntc2MtaXJjYzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDEyNWExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKQEAgLTAsMCArMSwyMzk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAkSWQ6IHNtc2MtaXJjYzIuYyx2IDEuMTkuMi41IDIwMDIvMTAvMjcgMTE6MzQ6MjYgZGlwIEV4cCAkCisgKgorICogRGVzY3JpcHRpb246ICAgRHJpdmVyIGZvciB0aGUgU01DIEluZnJhcmVkIENvbW11bmljYXRpb25zIENvbnRyb2xsZXIKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIERhbmllbGUgUGVyaSAocGVyaUBjc2FpLnVuaXBhLml0KQorICogQ3JlYXRlZCBhdDogICAgCisgKiBNb2RpZmllZCBhdDogICAKKyAqIE1vZGlmaWVkIGJ5OiAgIAorICogCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAyICAgICAgRGFuaWVsZSBQZXJpCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDIgICAgICBKZWFuIFRvdXJyaWxoZXMKKyAqCisgKgorICogQmFzZWQgb24gc21jLWlyY2MuYzoKKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAxICAgICAgU3RlZmFuaSBTZWlib2xkCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgRGFnIEJyYXR0bGkKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBUaG9tYXMgRGF2aXMsIAorICoKKyAqCWFuZCBpcnBvcnQuYzoKKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk3LCAxOTk4LCAxOTk5LTIwMDAgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIAorICogICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICogICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvd3JhcHBlci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCisjaW5jbHVkZSAic21zYy1pcmNjMi5oIgorI2luY2x1ZGUgInNtc2Mtc2lvLmgiCisKKy8qIFR5cGVzICovCisKK3N0cnVjdCBzbXNjX3RyYW5zY2VpdmVyIHsKKwljaGFyICpuYW1lOworCXZvaWQgKCpzZXRfZm9yX3NwZWVkKShpbnQgZmlyX2Jhc2UsIHUzMiBzcGVlZCk7CQorCWludCAgKCpwcm9iZSkoaW50IGZpcl9iYXNlKTsKK307Cit0eXBlZGVmIHN0cnVjdCBzbXNjX3RyYW5zY2VpdmVyIHNtc2NfdHJhbnNjZWl2ZXJfdDsKKworI2lmIDAKK3N0cnVjdCBzbWNfY2hpcCB7CisJY2hhciAqbmFtZTsKKwl1MTYgZmxhZ3M7CisJdTggZGV2aWQ7CisJdTggcmV2OworfTsKK3R5cGVkZWYgc3RydWN0IHNtY19jaGlwIHNtY19jaGlwX3Q7CisjZW5kaWYKKworc3RydWN0IHNtc2NfY2hpcCB7CisJY2hhciAqbmFtZTsKKwkjaWYgMAorCXU4CXR5cGU7CisJI2VuZGlmCisJdTE2IGZsYWdzOworCXU4IGRldmlkOworCXU4IHJldjsKK307Cit0eXBlZGVmIHN0cnVjdCBzbXNjX2NoaXAgc21zY19jaGlwX3Q7CisKK3N0cnVjdCBzbXNjX2NoaXBfYWRkcmVzcyB7CisJdW5zaWduZWQgaW50IGNmZ19iYXNlOworCXVuc2lnbmVkIGludCB0eXBlOworfTsKK3R5cGVkZWYgc3RydWN0IHNtc2NfY2hpcF9hZGRyZXNzIHNtc2NfY2hpcF9hZGRyZXNzX3Q7CisKKy8qIFByaXZhdGUgZGF0YSBmb3IgZWFjaCBpbnN0YW5jZSAqLworc3RydWN0IHNtc2NfaXJjY19jYiB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsgICAgIC8qIFllcyEgd2UgYXJlIHNvbWUga2luZCBvZiBuZXRkZXZpY2UgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgaXJsYXBfY2IgICAgKmlybGFwOyAvKiBUaGUgbGluayBsYXllciB3ZSBhcmUgYmluZGVkIHRvICovCisJCisJY2hpcGlvX3QgaW87ICAgICAgICAgICAgICAgLyogSXJEQSBjb250cm9sbGVyIGluZm9ybWF0aW9uICovCisJaW9idWZmX3QgdHhfYnVmZjsgICAgICAgICAgLyogVHJhbnNtaXQgYnVmZmVyICovCisJaW9idWZmX3QgcnhfYnVmZjsgICAgICAgICAgLyogUmVjZWl2ZSBidWZmZXIgKi8KKwlkbWFfYWRkcl90IHR4X2J1ZmZfZG1hOworCWRtYV9hZGRyX3QgcnhfYnVmZl9kbWE7CisKKwlzdHJ1Y3QgcW9zX2luZm8gcW9zOyAgICAgICAvKiBRb1MgY2FwYWJpbGl0aWVzIGZvciB0aGlzIGRldmljZSAqLworCisJc3BpbmxvY2tfdCBsb2NrOyAgICAgICAgICAgLyogRm9yIHNlcmlhbGl6aW5nIG9wZXJhdGlvbnMgKi8KKwkKKwlfX3UzMiBuZXdfc3BlZWQ7CisJX191MzIgZmxhZ3M7ICAgICAgICAgICAgICAgLyogSW50ZXJmYWNlIGZsYWdzICovCisKKwlpbnQgdHhfYnVmZl9vZmZzZXRzWzEwXTsgICAvKiBPZmZzZXRzIGJldHdlZW4gZnJhbWVzIGluIHR4X2J1ZmYgKi8KKwlpbnQgdHhfbGVuOyAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZnJhbWVzIGluIHR4X2J1ZmYgKi8KKworCWludCB0cmFuc2NlaXZlcjsKKwlzdHJ1Y3QgcG1fZGV2ICpwbWRldjsKK307CisKKy8qIENvbnN0YW50cyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqZHJpdmVyX25hbWUgPSAic21zYy1pcmNjMiI7CisjZGVmaW5lCURJTSh4KQkoc2l6ZW9mKHgpLyhzaXplb2YoKih4KSkpKQorI2RlZmluZSBTTVNDX0lSQ0MyX0NfSVJEQV9GQUxMQkFDS19TUEVFRAk5NjAwCisjZGVmaW5lIFNNU0NfSVJDQzJfQ19ERUZBVUxUX1RSQU5TQ0VJVkVSCTEKKyNkZWZpbmUgU01TQ19JUkNDMl9DX05FVF9USU1FT1VUCQkJMAorI2RlZmluZSBTTVNDX0lSQ0MyX0NfU0lSX1NUT1AJCQkwCisKKy8qIFByb3RvdHlwZXMgKi8KKworc3RhdGljIGludCBzbXNjX2lyY2Nfb3Blbih1bnNpZ25lZCBpbnQgZmlyYmFzZSwgdW5zaWduZWQgaW50IHNpcmJhc2UsIHU4IGRtYSwgdTggaXJxKTsKK3N0YXRpYyBpbnQgc21zY19pcmNjX3ByZXNlbnQodW5zaWduZWQgaW50IGZpcl9iYXNlLCB1bnNpZ25lZCBpbnQgc2lyX2Jhc2UpOworc3RhdGljIHZvaWQgc21zY19pcmNjX3NldHVwX2lvKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIHVuc2lnbmVkIGludCBmaXJfYmFzZSwgdW5zaWduZWQgaW50IHNpcl9iYXNlLCB1OCBkbWEsIHU4IGlycSk7CitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2V0dXBfcW9zKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIHZvaWQgc21zY19pcmNjX2luaXRfY2hpcChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyBpbnQgX19leGl0IHNtc2NfaXJjY19jbG9zZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyBpbnQgIHNtc2NfaXJjY19kbWFfcmVjZWl2ZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlKTsgCitzdGF0aWMgdm9pZCBzbXNjX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSk7CitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2lyX3JlY2VpdmUoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgaW50ICBzbXNjX2lyY2NfaGFyZF94bWl0X3NpcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIHNtc2NfaXJjY19oYXJkX3htaXRfZmlyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc21zY19pcmNjX2RtYV94bWl0KHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIGludCBpb2Jhc2UsIGludCBib2ZzKTsKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19kbWFfeG1pdF9jb21wbGV0ZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlKTsKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19jaGFuZ2Vfc3BlZWQodm9pZCAqcHJpdiwgdTMyIHNwZWVkKTsKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXRfc2lyX3NwZWVkKHZvaWQgKnByaXYsIHUzMiBzcGVlZCk7CitzdGF0aWMgaXJxcmV0dXJuX3Qgc21zY19pcmNjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBzbXNjX2lyY2NfaW50ZXJydXB0X3NpcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zaXJfc3RhcnQoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7CisjaWYgU01TQ19JUkNDMl9DX1NJUl9TVE9QCitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2lyX3N0b3Aoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zaXJfd3JpdGVfd2FrZXVwKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpOworc3RhdGljIGludCAgc21zY19pcmNjX3Npcl93cml0ZShpbnQgaW9iYXNlLCBpbnQgZmlmb19zaXplLCBfX3U4ICpidWYsIGludCBsZW4pOworc3RhdGljIGludCAgc21zY19pcmNjX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgc21zY19pcmNjX25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIHNtc2NfaXJjY19uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CisjaWYgU01TQ19JUkNDMl9DX05FVF9USU1FT1VUCitzdGF0aWMgdm9pZCBzbXNjX2lyY2NfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzbXNjX2lyY2NfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIHNtc2NfaXJjY19wbXByb2Moc3RydWN0IHBtX2RldiAqZGV2LCBwbV9yZXF1ZXN0X3QgcnFzdCwgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50IHNtc2NfaXJjY19pc19yZWNlaXZpbmcoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgdm9pZCBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXIoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX2Zvcl9zcGVlZChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCB1MzIgc3BlZWQpOworc3RhdGljIHZvaWQgc21zY19pcmNjX3Npcl93YWl0X2h3X3RyYW5zbWl0dGVyX2ZpbmlzaChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKKworLyogUHJvYmluZyAqLworc3RhdGljIGludCBfX2luaXQgc21zY19pcmNjX2xvb2tfZm9yX2NoaXBzKHZvaWQpOworc3RhdGljIGNvbnN0IHNtc2NfY2hpcF90ICogX19pbml0IHNtc2NfaXJjY19wcm9iZSh1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSx1OCByZWcsY29uc3Qgc21zY19jaGlwX3QgKmNoaXAsY2hhciAqdHlwZSk7CitzdGF0aWMgaW50IF9faW5pdCBzbXNjX3N1cGVyaW9fZmxhdChjb25zdCBzbXNjX2NoaXBfdCAqY2hpcHMsIHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlLCBjaGFyICp0eXBlKTsKK3N0YXRpYyBpbnQgX19pbml0IHNtc2Nfc3VwZXJpb19wYWdlZChjb25zdCBzbXNjX2NoaXBfdCAqY2hpcHMsIHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlLCBjaGFyICp0eXBlKTsKK3N0YXRpYyBpbnQgX19pbml0IHNtc2Nfc3VwZXJpb19mZGModW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UpOworc3RhdGljIGludCBfX2luaXQgc21zY19zdXBlcmlvX2xwYyh1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSk7CisKKy8qIFRyYW5zY2VpdmVycyBzcGVjaWZpYyBmdW5jdGlvbnMgKi8KKworc3RhdGljIHZvaWQgc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl90b3NoaWJhX3NhdDE4MDAoaW50IGZpcl9iYXNlLCB1MzIgc3BlZWQpOworc3RhdGljIGludCAgc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyX3Rvc2hpYmFfc2F0MTgwMChpbnQgZmlyX2Jhc2UpOworc3RhdGljIHZvaWQgc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl9zbXNjX2lyY2NfZmFzdF9waW5fc2VsZWN0KGludCBmaXJfYmFzZSwgdTMyIHNwZWVkKTsKK3N0YXRpYyBpbnQgIHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcl9zbXNjX2lyY2NfZmFzdF9waW5fc2VsZWN0KGludCBmaXJfYmFzZSk7CitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19hdGMoaW50IGZpcl9iYXNlLCB1MzIgc3BlZWQpOworc3RhdGljIGludCAgc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19hdGMoaW50IGZpcl9iYXNlKTsKKworLyogUG93ZXIgTWFuYWdlbWVudCAqLworCitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc3VzcGVuZChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY193YWtldXAoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgaW50IHNtc2NfaXJjY19wbXByb2Moc3RydWN0IHBtX2RldiAqZGV2LCBwbV9yZXF1ZXN0X3QgcnFzdCwgdm9pZCAqZGF0YSk7CisKKworLyogVHJhbnNjZWl2ZXJzIGZvciBTTVNDLWlyY2MgKi8KKworc3RhdGljIHNtc2NfdHJhbnNjZWl2ZXJfdCBzbXNjX3RyYW5zY2VpdmVyc1tdPQoreworCXsgIlRvc2hpYmEgU2F0ZWxsaXRlIDE4MDAgKEdQIGRhdGEgcGluIHNlbGVjdCkiLCBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX3Rvc2hpYmFfc2F0MTgwMCwgc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyX3Rvc2hpYmFfc2F0MTgwMH0sCisJeyAiRmFzdCBwaW4gc2VsZWN0Iiwgc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl9zbXNjX2lyY2NfZmFzdF9waW5fc2VsZWN0LCBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2Zhc3RfcGluX3NlbGVjdH0sCisJeyAiQVRDIElSTW9kZSIsIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2F0Yywgc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19hdGN9LAorCXsgTlVMTCwgTlVMTH0KK307CisjZGVmaW5lIFNNU0NfSVJDQzJfQ19OVU1CRVJfT0ZfVFJBTlNDRUlWRVJTIChESU0oc21zY190cmFuc2NlaXZlcnMpLTEpCisKKy8qICBTTUMgU3VwZXJJTyBjaGlwc2V0cyBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lCUtFWTU1XzEJMAkvKiBTdXBlcklPIENvbmZpZ3VyYXRpb24gbW9kZSB3aXRoIEtleSA8MHg1NT4gKi8KKyNkZWZpbmUJS0VZNTVfMgkxCS8qIFN1cGVySU8gQ29uZmlndXJhdGlvbiBtb2RlIHdpdGggS2V5IDwweDU1LDB4NTU+ICovCisjZGVmaW5lCU5vSVJEQQkyCS8qIFN1cGVySU8gQ2hpcCBoYXMgbm8gSVJEQSBQb3J0ICovCisjZGVmaW5lCVNJUgkwCS8qIFN1cGVySU8gQ2hpcCBoYXMgb25seSBzbG93IElSREEgKi8KKyNkZWZpbmUJRklSCTQJLyogU3VwZXJJTyBDaGlwIGhhcyBmYXN0IElSREEgKi8KKyNkZWZpbmUJU0VSeDQJOAkvKiBTdXBlcklPIENoaXAgc3VwcG9ydHMgMTE1LDIgS0JhdWQgKiA0PTQ2MCw4IEtCYXVkICovCisKK3N0YXRpYyBzbXNjX2NoaXBfdCBfX2luaXRkYXRhIGZkY19jaGlwc19mbGF0W109Cit7CisJLyogQmFzZSBhZGRyZXNzIDB4M2YwIG9yIDB4MzcwICovCisJeyAiMzdDNDQiLAlLRVk1NV8xfE5vSVJEQSwJCTB4MDAsIDB4MDAgfSwgLyogVGhpcyBjaGlwIGNhbm5vdCBiZSBkZXRlY3RlZCAqLworCXsgIjM3QzY2NUdUIiwJS0VZNTVfMnxOb0lSREEsCQkweDY1LCAweDAxIH0sCisJeyAiMzdDNjY1R1QiLAlLRVk1NV8yfE5vSVJEQSwJCTB4NjYsIDB4MDEgfSwKKwl7ICIzN0M2NjkiLAlLRVk1NV8yfFNJUnxTRVJ4NCwJMHgwMywgMHgwMiB9LAorCXsgIjM3QzY2OSIsCUtFWTU1XzJ8U0lSfFNFUng0LAkweDA0LCAweDAyIH0sIC8qIElEPyAqLworCXsgIjM3Qzc4IiwJS0VZNTVfMnxOb0lSREEsCQkweDc4LCAweDAwIH0sCisJeyAiMzdONzY5IiwJS0VZNTVfMXxGSVJ8U0VSeDQsCTB4MjgsIDB4MDAgfSwKKwl7ICIzN044NjkiLAlLRVk1NV8xfEZJUnxTRVJ4NCwJMHgyOSwgMHgwMCB9LAorCXsgTlVMTCB9Cit9OworCitzdGF0aWMgc21zY19jaGlwX3QgX19pbml0ZGF0YSBmZGNfY2hpcHNfcGFnZWRbXT0KK3sKKwkvKiBCYXNlIGFkZHJlc3MgMHgzZjAgb3IgMHgzNzAgKi8KKwl7ICIzN0I3MlgiLAlLRVk1NV8xfFNJUnxTRVJ4NCwJMHg0YywgMHgwMCB9LAorCXsgIjM3Qjc3WCIsCUtFWTU1XzF8U0lSfFNFUng0LAkweDQzLCAweDAwIH0sCisJeyAiMzdCNzhYIiwJS0VZNTVfMXxTSVJ8U0VSeDQsCTB4NDQsIDB4MDAgfSwKKwl7ICIzN0I4MFgiLAlLRVk1NV8xfFNJUnxTRVJ4NCwJMHg0MiwgMHgwMCB9LAorCXsgIjM3QzY3WCIsCUtFWTU1XzF8RklSfFNFUng0LAkweDQwLCAweDAwIH0sCisJeyAiMzdDOTNYIiwJS0VZNTVfMnxTSVJ8U0VSeDQsCTB4MDIsIDB4MDEgfSwKKwl7ICIzN0M5M1hBUE0iLAlLRVk1NV8xfFNJUnxTRVJ4NCwJMHgzMCwgMHgwMSB9LAorCXsgIjM3QzkzWEZSIiwJS0VZNTVfMnxGSVJ8U0VSeDQsCTB4MDMsIDB4MDEgfSwKKwl7ICIzN003MDciLAlLRVk1NV8xfFNJUnxTRVJ4NCwJMHg0MiwgMHgwMCB9LAorCXsgIjM3TTgxWCIsCUtFWTU1XzF8U0lSfFNFUng0LAkweDRkLCAweDAwIH0sCisJeyAiMzdOOTU4RlIiLAlLRVk1NV8xfEZJUnxTRVJ4NCwJMHgwOSwgMHgwNCB9LAorCXsgIjM3Tjk3MSIsCUtFWTU1XzF8RklSfFNFUng0LAkweDBhLCAweDAwIH0sCisJeyAiMzdOOTcyIiwJS0VZNTVfMXxGSVJ8U0VSeDQsCTB4MGIsIDB4MDAgfSwKKwl7IE5VTEwgfQorfTsKKworc3RhdGljIHNtc2NfY2hpcF90IF9faW5pdGRhdGEgbHBjX2NoaXBzX2ZsYXRbXT0KK3sKKwkvKiBCYXNlIGFkZHJlc3MgMHgyRSBvciAweDRFICovCisJeyAiNDdOMjI3IiwJS0VZNTVfMXxGSVJ8U0VSeDQsCTB4NWEsIDB4MDAgfSwKKwl7ICI0N04yNjciLAlLRVk1NV8xfEZJUnxTRVJ4NCwJMHg1ZSwgMHgwMCB9LAorCXsgTlVMTCB9Cit9OworCitzdGF0aWMgc21zY19jaGlwX3QgX19pbml0ZGF0YSBscGNfY2hpcHNfcGFnZWRbXT0KK3sKKwkvKiBCYXNlIGFkZHJlc3MgMHgyRSBvciAweDRFICovCisJeyAiNDdCMjdYIiwJS0VZNTVfMXxTSVJ8U0VSeDQsCTB4NTEsIDB4MDAgfSwKKwl7ICI0N0IzN1giLAlLRVk1NV8xfFNJUnxTRVJ4NCwJMHg1MiwgMHgwMCB9LAorCXsgIjQ3TTEwWCIsCUtFWTU1XzF8U0lSfFNFUng0LAkweDU5LCAweDAwIH0sCisJeyAiNDdNMTIwIiwJS0VZNTVfMXxOb0lSREF8U0VSeDQsCTB4NWMsIDB4MDAgfSwKKwl7ICI0N00xM1giLAlLRVk1NV8xfFNJUnxTRVJ4NCwJMHg1OSwgMHgwMCB9LAorCXsgIjQ3TTE0WCIsCUtFWTU1XzF8U0lSfFNFUng0LAkweDVmLCAweDAwIH0sCisJeyAiNDdOMjUyIiwJS0VZNTVfMXxGSVJ8U0VSeDQsCTB4MGUsIDB4MDAgfSwKKwl7ICI0N1M0MlgiLAlLRVk1NV8xfFNJUnxTRVJ4NCwJMHg1NywgMHgwMCB9LAorCXsgTlVMTCB9Cit9OworCisjZGVmaW5lIFNNU0NTSU9fVFlQRV9GREMJMQorI2RlZmluZSBTTVNDU0lPX1RZUEVfTFBDCTIKKyNkZWZpbmUgU01TQ1NJT19UWVBFX0ZMQVQJNAorI2RlZmluZSBTTVNDU0lPX1RZUEVfUEFHRUQJOAorCitzdGF0aWMgc21zY19jaGlwX2FkZHJlc3NfdCBfX2luaXRkYXRhIHBvc3NpYmxlX2FkZHJlc3Nlc1tdPQoreworCXsweDNmMCwgU01TQ1NJT19UWVBFX0ZEQ3xTTVNDU0lPX1RZUEVfRkxBVHxTTVNDU0lPX1RZUEVfUEFHRUR9LAorCXsweDM3MCwgU01TQ1NJT19UWVBFX0ZEQ3xTTVNDU0lPX1RZUEVfRkxBVHxTTVNDU0lPX1RZUEVfUEFHRUR9LAorCXsweGUwLCBTTVNDU0lPX1RZUEVfRkRDfFNNU0NTSU9fVFlQRV9GTEFUfFNNU0NTSU9fVFlQRV9QQUdFRH0sCisJezB4MmUsIFNNU0NTSU9fVFlQRV9MUEN8U01TQ1NJT19UWVBFX0ZMQVR8U01TQ1NJT19UWVBFX1BBR0VEfSwKKwl7MHg0ZSwgU01TQ1NJT19UWVBFX0xQQ3xTTVNDU0lPX1RZUEVfRkxBVHxTTVNDU0lPX1RZUEVfUEFHRUR9LAorCXswLDB9Cit9OworCisvKiBHbG9iYWxzICovCisKK3N0YXRpYyBzdHJ1Y3Qgc21zY19pcmNjX2NiICpkZXZfc2VsZltdID0geyBOVUxMLCBOVUxMfTsKKworc3RhdGljIGludCBpcmNjX2lycT0yNTU7CitzdGF0aWMgaW50IGlyY2NfZG1hPTI1NTsKK3N0YXRpYyBpbnQgaXJjY19maXI9MDsKK3N0YXRpYyBpbnQgaXJjY19zaXI9MDsKK3N0YXRpYyBpbnQgaXJjY19jZmc9MDsKK3N0YXRpYyBpbnQgaXJjY190cmFuc2NlaXZlcj0wOworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQJZGV2X2NvdW50PTA7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWdpc3Rlcl9iYW5rKGludCBpb2Jhc2UsIGludCBiYW5rKQoreworICAgICAgICBvdXRiKCgoaW5iKGlvYmFzZStJUkNDX01BU1RFUikgJiAweGYwKSB8IChiYW5rICYgMHgwNykpLAorICAgICAgICAgICAgICAgaW9iYXNlK0lSQ0NfTUFTVEVSKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCisgKiBTTVNDLWlyY2Mgc3R1ZmYKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfaW5pdCAoKQorICoKKyAqICAgIEluaXRpYWxpemUgY2hpcC4gSnVzdCB0cnkgdG8gZmluZCBvdXQgaG93IG1hbnkgY2hpcHMgd2UgYXJlIGRlYWxpbmcgd2l0aAorICogICAgYW5kIHdoZXJlIHRoZXkgYXJlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNtc2NfaXJjY19pbml0KHZvaWQpCit7CisJaW50IHJldD0tRU5PREVWOworCisJSVJEQV9ERUJVRygxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlkZXZfY291bnQ9MDsKKyAKKwlpZiAoKGlyY2NfZmlyPjApJiYoaXJjY19zaXI+MCkpIHsKKwkJSVJEQV9NRVNTQUdFKCIgT3ZlcnJpZGluZyBGSVIgYWRkcmVzcyAweCUwNHhcbiIsIGlyY2NfZmlyKTsKKwkJSVJEQV9NRVNTQUdFKCIgT3ZlcnJpZGluZyBTSVIgYWRkcmVzcyAweCUwNHhcbiIsIGlyY2Nfc2lyKTsKKworCQlpZiAoc21zY19pcmNjX29wZW4oaXJjY19maXIsIGlyY2Nfc2lyLCBpcmNjX2RtYSwgaXJjY19pcnEpID09IDApCisJCQlyZXR1cm4gMDsKKworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiB0cnkgdXNlciBwcm92aWRlZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyAqLworCWlmIChpcmNjX2NmZz4wKSB7CisJICAgICAgICBJUkRBX01FU1NBR0UoIiBPdmVycmlkaW5nIGNvbmZpZ3VyYXRpb24gYWRkcmVzcyAweCUwNHhcbiIsCisJCQkgICAgIGlyY2NfY2ZnKTsKKwkJaWYgKCFzbXNjX3N1cGVyaW9fZmRjKGlyY2NfY2ZnKSkKKwkJCXJldCA9IDA7CisJCWlmICghc21zY19zdXBlcmlvX2xwYyhpcmNjX2NmZykpCisJCQlyZXQgPSAwOworCX0KKwkKKwlpZihzbXNjX2lyY2NfbG9va19mb3JfY2hpcHMoKT4wKSByZXQgPSAwOworCQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2Nfb3BlbiAoZmlyYmFzZSwgc2lyYmFzZSwgZG1hLCBpcnEpCisgKgorICogICAgVHJ5IHRvIG9wZW4gZHJpdmVyIGluc3RhbmNlCisgKgorICovCitzdGF0aWMgaW50IF9faW5pdCBzbXNjX2lyY2Nfb3Blbih1bnNpZ25lZCBpbnQgZmlyX2Jhc2UsIHVuc2lnbmVkIGludCBzaXJfYmFzZSwgdTggZG1hLCB1OCBpcnEpCit7CisJc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBlcnI7CisJCisJSVJEQV9ERUJVRygxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwllcnIgPSBzbXNjX2lyY2NfcHJlc2VudChmaXJfYmFzZSwgc2lyX2Jhc2UpOworCWlmKGVycikgCisJCWdvdG8gZXJyX291dDsKKwkJCisJZXJyID0gLUVOT01FTTsKKwlpZiAoZGV2X2NvdW50ID4gRElNKGRldl9zZWxmKSkgeworCSAgICAgICAgSVJEQV9XQVJOSU5HKCIlcygpLCB0b28gbWFueSBkZXZpY2VzIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBlcnJfb3V0MTsKKwl9CisKKwkvKgorCSAqICBBbGxvY2F0ZSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGRyaXZlcgorCSAqLworCWRldiA9IGFsbG9jX2lyZGFkZXYoc2l6ZW9mKHN0cnVjdCBzbXNjX2lyY2NfY2IpKTsKKwlpZiAoIWRldikgeworCQlJUkRBX1dBUk5JTkcoIiVzKCkgY2FuJ3QgYWxsb2NhdGUgbmV0IGRldmljZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBlcnJfb3V0MTsKKwl9CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHNtc2NfaXJjY19oYXJkX3htaXRfc2lyOworI2lmIFNNU0NfSVJDQzJfQ19ORVRfVElNRU9VVAorCWRldi0+dHhfdGltZW91dAkgICAgID0gc21zY19pcmNjX3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyAgPSBIWioyOyAgLyogQWxsb3cgZW5vdWdoIHRpbWUgZm9yIHNwZWVkIGNoYW5nZSAqLworI2VuZGlmCisJZGV2LT5vcGVuICAgICAgICAgICAgPSBzbXNjX2lyY2NfbmV0X29wZW47CisJZGV2LT5zdG9wICAgICAgICAgICAgPSBzbXNjX2lyY2NfbmV0X2Nsb3NlOworCWRldi0+ZG9faW9jdGwgICAgICAgID0gc21zY19pcmNjX25ldF9pb2N0bDsKKwlkZXYtPmdldF9zdGF0cwkgICAgID0gc21zY19pcmNjX25ldF9nZXRfc3RhdHM7CisJCisJc2VsZiA9IGRldi0+cHJpdjsKKwlzZWxmLT5uZXRkZXYgPSBkZXY7CisKKwkvKiBNYWtlIGlmY29uZmlnIGRpc3BsYXkgc29tZSBkZXRhaWxzICovCisJZGV2LT5iYXNlX2FkZHIgPSBzZWxmLT5pby5maXJfYmFzZSA9IGZpcl9iYXNlOworCWRldi0+aXJxID0gc2VsZi0+aW8uaXJxID0gaXJxOworCisJLyogTmVlZCB0byBzdG9yZSBzZWxmIHNvbWV3aGVyZSAqLworCWRldl9zZWxmW2Rldl9jb3VudCsrXSA9IHNlbGY7CisJc3Bpbl9sb2NrX2luaXQoJnNlbGYtPmxvY2spOworCisJc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSA9IFNNU0NfSVJDQzJfUlhfQlVGRl9UUlVFU0laRTsgCisJc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSA9IFNNU0NfSVJDQzJfVFhfQlVGRl9UUlVFU0laRTsKKworCXNlbGYtPnJ4X2J1ZmYuaGVhZCA9CisJCWRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAorCQkJCSAgICZzZWxmLT5yeF9idWZmX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNlbGYtPnJ4X2J1ZmYuaGVhZCA9PSBOVUxMKSB7CisJCUlSREFfRVJST1IoIiVzLCBDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlY2VpdmUgYnVmZmVyIVxuIiwKKwkJCSAgIGRyaXZlcl9uYW1lKTsKKwkJZ290byBlcnJfb3V0MjsKKwl9CisKKwlzZWxmLT50eF9idWZmLmhlYWQgPQorCQlkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSwKKwkJCQkgICAmc2VsZi0+dHhfYnVmZl9kbWEsIEdGUF9LRVJORUwpOworCWlmIChzZWxmLT50eF9idWZmLmhlYWQgPT0gTlVMTCkgeworCQlJUkRBX0VSUk9SKCIlcywgQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0cmFuc21pdCBidWZmZXIhXG4iLAorCQkJICAgZHJpdmVyX25hbWUpOworCQlnb3RvIGVycl9vdXQzOworCX0KKworCW1lbXNldChzZWxmLT5yeF9idWZmLmhlYWQsIDAsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUpOworCW1lbXNldChzZWxmLT50eF9idWZmLmhlYWQsIDAsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUpOworCisJc2VsZi0+cnhfYnVmZi5pbl9mcmFtZSA9IEZBTFNFOworCXNlbGYtPnJ4X2J1ZmYuc3RhdGUgPSBPVVRTSURFX0ZSQU1FOworCXNlbGYtPnR4X2J1ZmYuZGF0YSA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKKwlzZWxmLT5yeF9idWZmLmRhdGEgPSBzZWxmLT5yeF9idWZmLmhlYWQ7CisJICAgCisJc21zY19pcmNjX3NldHVwX2lvKHNlbGYsIGZpcl9iYXNlLCBzaXJfYmFzZSwgZG1hLCBpcnEpOworCisJc21zY19pcmNjX3NldHVwX3FvcyhzZWxmKTsKKworCXNtc2NfaXJjY19pbml0X2NoaXAoc2VsZik7CisJCisJaWYoaXJjY190cmFuc2NlaXZlciA+IDAgICYmIAorCSAgIGlyY2NfdHJhbnNjZWl2ZXIgPCBTTVNDX0lSQ0MyX0NfTlVNQkVSX09GX1RSQU5TQ0VJVkVSUykKKwkJc2VsZi0+dHJhbnNjZWl2ZXIgPSBpcmNjX3RyYW5zY2VpdmVyOworCWVsc2UKKwkJc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyKHNlbGYpOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KHNlbGYtPm5ldGRldik7CisJaWYoZXJyKSB7CisJCUlSREFfRVJST1IoIiVzLCBOZXR3b3JrIGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkIVxuIiwKKwkJCSAgIGRyaXZlcl9uYW1lKTsKKwkJZ290byBlcnJfb3V0NDsKKwl9CisKKwlzZWxmLT5wbWRldiA9IHBtX3JlZ2lzdGVyKFBNX1NZU19ERVYsIFBNX1NZU19JUkRBLCBzbXNjX2lyY2NfcG1wcm9jKTsKKwlpZiAoc2VsZi0+cG1kZXYpCisJCXNlbGYtPnBtZGV2LT5kYXRhID0gc2VsZjsKKworCUlSREFfTUVTU0FHRSgiSXJEQTogUmVnaXN0ZXJlZCBkZXZpY2UgJXNcbiIsIGRldi0+bmFtZSk7CisKKwlyZXR1cm4gMDsKKyBlcnJfb3V0NDoKKwlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT50eF9idWZmLnRydWVzaXplLAorCQkJICBzZWxmLT50eF9idWZmLmhlYWQsIHNlbGYtPnR4X2J1ZmZfZG1hKTsKKyBlcnJfb3V0MzoKKwlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAorCQkJICBzZWxmLT5yeF9idWZmLmhlYWQsIHNlbGYtPnJ4X2J1ZmZfZG1hKTsKKyBlcnJfb3V0MjoKKwlmcmVlX25ldGRldihzZWxmLT5uZXRkZXYpOworCWRldl9zZWxmWy0tZGV2X2NvdW50XSA9IE5VTEw7CisgZXJyX291dDE6CisJcmVsZWFzZV9yZWdpb24oZmlyX2Jhc2UsIFNNU0NfSVJDQzJfRklSX0NISVBfSU9fRVhURU5UKTsKKwlyZWxlYXNlX3JlZ2lvbihzaXJfYmFzZSwgU01TQ19JUkNDMl9TSVJfQ0hJUF9JT19FWFRFTlQpOworIGVycl9vdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19wcmVzZW50KGZpcl9iYXNlLCBzaXJfYmFzZSkKKyAqCisgKiAgICBDaGVjayB0aGUgc21zYy1pcmNjIGNoaXAgcHJlc2VuY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgc21zY19pcmNjX3ByZXNlbnQodW5zaWduZWQgaW50IGZpcl9iYXNlLCB1bnNpZ25lZCBpbnQgc2lyX2Jhc2UpCit7CisJdW5zaWduZWQgY2hhciBsb3csIGhpZ2gsIGNoaXAsIGNvbmZpZywgZG1hLCBpcnEsIHZlcnNpb247CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGZpcl9iYXNlLCBTTVNDX0lSQ0MyX0ZJUl9DSElQX0lPX0VYVEVOVCwKKwkJCSAgICBkcml2ZXJfbmFtZSkpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogY2FuJ3QgZ2V0IGZpcl9iYXNlIG9mIDB4JTAzeFxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fLCBmaXJfYmFzZSk7CisJCWdvdG8gb3V0MTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHNpcl9iYXNlLCBTTVNDX0lSQ0MyX1NJUl9DSElQX0lPX0VYVEVOVCwKKwkJCSAgICBkcml2ZXJfbmFtZSkpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogY2FuJ3QgZ2V0IHNpcl9iYXNlIG9mIDB4JTAzeFxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fLCBzaXJfYmFzZSk7CisJCWdvdG8gb3V0MjsKKwl9CisKKwlyZWdpc3Rlcl9iYW5rKGZpcl9iYXNlLCAzKTsKKworCWhpZ2ggICAgPSBpbmIoZmlyX2Jhc2UrSVJDQ19JRF9ISUdIKTsKKwlsb3cgICAgID0gaW5iKGZpcl9iYXNlK0lSQ0NfSURfTE9XKTsKKwljaGlwICAgID0gaW5iKGZpcl9iYXNlK0lSQ0NfQ0hJUF9JRCk7CisJdmVyc2lvbiA9IGluYihmaXJfYmFzZStJUkNDX1ZFUlNJT04pOworCWNvbmZpZyAgPSBpbmIoZmlyX2Jhc2UrSVJDQ19JTlRFUkZBQ0UpOworCWRtYSAgICAgPSBjb25maWcgJiBJUkNDX0lOVEVSRkFDRV9ETUFfTUFTSzsKKwlpcnEgICAgID0gKGNvbmZpZyAmIElSQ0NfSU5URVJGQUNFX0lSUV9NQVNLKSA+PiA0OworCisJaWYgKGhpZ2ggIT0gMHgxMCB8fCBsb3cgIT0gMHhiOCB8fCAoY2hpcCAhPSAweGYxICYmIGNoaXAgIT0gMHhmMikpIHsgCisJICAgICAgICBJUkRBX1dBUk5JTkcoIiVzKCksIGFkZHIgMHglMDR4IC0gbm8gZGV2aWNlIGZvdW5kIVxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fLCBmaXJfYmFzZSk7CisJCWdvdG8gb3V0MzsKKwl9CisJSVJEQV9NRVNTQUdFKCJTTXNDIElyREEgQ29udHJvbGxlciBmb3VuZFxuIElyQ0MgdmVyc2lvbiAlZC4lZCwgIgorCQkgICAgICJmaXJwb3J0IDB4JTAzeCwgc2lycG9ydCAweCUwM3ggZG1hPSVkLCBpcnE9JWRcbiIsCisJCSAgICAgY2hpcCAmIDB4MGYsIHZlcnNpb24sIGZpcl9iYXNlLCBzaXJfYmFzZSwgZG1hLCBpcnEpOworCisJcmV0dXJuIDA7Cisgb3V0MzoKKwlyZWxlYXNlX3JlZ2lvbihzaXJfYmFzZSwgU01TQ19JUkNDMl9TSVJfQ0hJUF9JT19FWFRFTlQpOworIG91dDI6CisJcmVsZWFzZV9yZWdpb24oZmlyX2Jhc2UsIFNNU0NfSVJDQzJfRklSX0NISVBfSU9fRVhURU5UKTsKKyBvdXQxOgorCXJldHVybiAtRU5PREVWOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX3NldHVwX2lvKHNlbGYsIGZpcl9iYXNlLCBzaXJfYmFzZSwgZG1hLCBpcnEpCisgKgorICogICAgU2V0dXAgSS9PCisgKgorICovCitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2V0dXBfaW8oc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgCisJCQkgICAgICAgdW5zaWduZWQgaW50IGZpcl9iYXNlLCB1bnNpZ25lZCBpbnQgc2lyX2Jhc2UsIAorCQkJICAgICAgIHU4IGRtYSwgdTggaXJxKQoreworCXVuc2lnbmVkIGNoYXIgY29uZmlnLCBjaGlwX2RtYSwgY2hpcF9pcnE7CisKKwlyZWdpc3Rlcl9iYW5rKGZpcl9iYXNlLCAzKTsKKwljb25maWcgID0gaW5iKGZpcl9iYXNlK0lSQ0NfSU5URVJGQUNFKTsKKwljaGlwX2RtYSAgICAgPSBjb25maWcgJiBJUkNDX0lOVEVSRkFDRV9ETUFfTUFTSzsKKwljaGlwX2lycSAgICAgPSAoY29uZmlnICYgSVJDQ19JTlRFUkZBQ0VfSVJRX01BU0spID4+IDQ7CisKKwlzZWxmLT5pby5maXJfYmFzZSAgPSBmaXJfYmFzZTsKKwlzZWxmLT5pby5zaXJfYmFzZSAgPSBzaXJfYmFzZTsKKwlzZWxmLT5pby5maXJfZXh0ICAgPSBTTVNDX0lSQ0MyX0ZJUl9DSElQX0lPX0VYVEVOVDsKKwlzZWxmLT5pby5zaXJfZXh0ICAgPSBTTVNDX0lSQ0MyX1NJUl9DSElQX0lPX0VYVEVOVDsKKwlzZWxmLT5pby5maWZvX3NpemUgPSBTTVNDX0lSQ0MyX0ZJRk9fU0laRTsKKwlzZWxmLT5pby5zcGVlZCA9IFNNU0NfSVJDQzJfQ19JUkRBX0ZBTExCQUNLX1NQRUVEOworCisJaWYgKGlycSA8IDI1NSkgeworCQlpZiAoaXJxICE9IGNoaXBfaXJxKQorCQkJSVJEQV9NRVNTQUdFKCIlcywgT3ZlcnJpZGluZyBJUlEgLSBjaGlwIHNheXMgJWQsIHVzaW5nICVkXG4iLAorCQkJCSAgICAgZHJpdmVyX25hbWUsIGNoaXBfaXJxLCBpcnEpOworCQlzZWxmLT5pby5pcnEgPSBpcnE7CisJfQorCWVsc2UKKwkJc2VsZi0+aW8uaXJxID0gY2hpcF9pcnE7CisJCisJaWYgKGRtYSA8IDI1NSkgeworCQlpZiAoZG1hICE9IGNoaXBfZG1hKQorCQkJSVJEQV9NRVNTQUdFKCIlcywgT3ZlcnJpZGluZyBETUEgLSBjaGlwIHNheXMgJWQsIHVzaW5nICVkXG4iLAorCQkJCSAgICAgZHJpdmVyX25hbWUsIGNoaXBfZG1hLCBkbWEpOworCQlzZWxmLT5pby5kbWEgPSBkbWE7CisJfQorCWVsc2UKKwkJc2VsZi0+aW8uZG1hID0gY2hpcF9kbWE7CisKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19zZXR1cF9xb3Moc2VsZikKKyAqCisgKiAgICBTZXR1cCBxb3MKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXR1cF9xb3Moc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikKK3sKKwkvKiBJbml0aWFsaXplIFFvUyBmb3IgdGhpcyBkZXZpY2UgKi8KKwlpcmRhX2luaXRfbWF4X3Fvc19jYXBhYmlsaWVzKCZzZWxmLT5xb3MpOworCQorCXNlbGYtPnFvcy5iYXVkX3JhdGUuYml0cyA9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8CisJCUlSXzExNTIwMHxJUl81NzYwMDB8SVJfMTE1MjAwMHwoSVJfNDAwMDAwMCA8PCA4KTsKKworCXNlbGYtPnFvcy5taW5fdHVybl90aW1lLmJpdHMgPSBTTVNDX0lSQ0MyX01JTl9UVVJOX1RJTUU7CisJc2VsZi0+cW9zLndpbmRvd19zaXplLmJpdHMgPSBTTVNDX0lSQ0MyX1dJTkRPV19TSVpFOworCWlyZGFfcW9zX2JpdHNfdG9fdmFsdWUoJnNlbGYtPnFvcyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfaW5pdF9jaGlwKHNlbGYpCisgKgorICogICAgSW5pdCBjaGlwCisgKgorICovCitzdGF0aWMgdm9pZCBzbXNjX2lyY2NfaW5pdF9jaGlwKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpCit7CisJaW50IGlvYmFzZSwgaXJfbW9kZSwgY3RybCwgZmFzdDsgCisJCisJSVJEQV9BU1NFUlQoIHNlbGYgIT0gTlVMTCwgcmV0dXJuOyApOworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJaXJfbW9kZSA9IElSQ0NfQ0ZHQV9JUkRBX1NJUl9BOworCWN0cmwgPSAwOworCWZhc3QgPSAwOworCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOworCW91dGIoSVJDQ19NQVNURVJfUkVTRVQsIGlvYmFzZStJUkNDX01BU1RFUik7CisJb3V0YigweDAwLCBpb2Jhc2UrSVJDQ19NQVNURVIpOworCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDEpOworCW91dGIoKChpbmIoaW9iYXNlK0lSQ0NfU0NFX0NGR0EpICYgMHg4NykgfCBpcl9tb2RlKSwgCisJICAgICBpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQSk7CisKKyNpZmRlZiBzbXNjXzY2OSAvKiBVc2VzIHBpbiA4OC84OSBmb3IgUngvVHggKi8KKwlvdXRiKCgoaW5iKGlvYmFzZStJUkNDX1NDRV9DRkdCKSAmIDB4M2YpIHwgSVJDQ19DRkdCX01VWF9DT00pLCAKKwkgICAgIGlvYmFzZStJUkNDX1NDRV9DRkdCKTsKKyNlbHNlCQorCW91dGIoKChpbmIoaW9iYXNlK0lSQ0NfU0NFX0NGR0IpICYgMHgzZikgfCBJUkNDX0NGR0JfTVVYX0lSKSwKKwkgICAgIGlvYmFzZStJUkNDX1NDRV9DRkdCKTsKKyNlbmRpZgkKKwkodm9pZCkgaW5iKGlvYmFzZStJUkNDX0ZJRk9fVEhSRVNIT0xEKTsKKwlvdXRiKFNNU0NfSVJDQzJfRklGT19USFJFU0hPTEQsIGlvYmFzZStJUkNDX0ZJRk9fVEhSRVNIT0xEKTsKKwkKKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgNCk7CisJb3V0YigoaW5iKGlvYmFzZStJUkNDX0NPTlRST0wpICYgMHgzMCkgfCBjdHJsLCBpb2Jhc2UrSVJDQ19DT05UUk9MKTsKKwkKKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7CisJb3V0YihmYXN0LCBpb2Jhc2UrSVJDQ19MQ1JfQSk7CisKKwlzbXNjX2lyY2Nfc2V0X3Npcl9zcGVlZChzZWxmLCBTTVNDX0lSQ0MyX0NfSVJEQV9GQUxMQkFDS19TUEVFRCk7CisJCisJLyogUG93ZXIgb24gZGV2aWNlICovCisJb3V0YigweDAwLCBpb2Jhc2UrSVJDQ19NQVNURVIpOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX25ldF9pb2N0bCAoZGV2LCBycSwgY21kKQorICoKKyAqICAgIFByb2Nlc3MgSU9DVEwgY29tbWFuZHMgZm9yIHRoaXMgZGV2aWNlCisgKgorICovCitzdGF0aWMgaW50IHNtc2NfaXJjY19uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgaWZfaXJkYV9yZXEgKmlycSA9IChzdHJ1Y3QgaWZfaXJkYV9yZXEgKikgcnE7CisJc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCisJc2VsZiA9IGRldi0+cHJpdjsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpLCAlcywgKGNtZD0weCVYKVxuIiwgX19GVU5DVElPTl9fLCBkZXYtPm5hbWUsIGNtZCk7CisJCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NTQkFORFdJRFRIOiAvKiBTZXQgYmFuZHdpZHRoICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldCA9IC1FUEVSTTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKwkJCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgdGhlIG9ubHkgb25lIHRvdWNoaW5nCisJCQkgKiBzZWxmLT5pby5zcGVlZCBhbmQgdGhlIGhhcmR3YXJlIC0gSmVhbiBJSSAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkJCXNtc2NfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgaXJxLT5pZnJfYmF1ZHJhdGUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCQl9CisJCWJyZWFrOworCWNhc2UgU0lPQ1NNRURJQUJVU1k6IC8qIFNldCBtZWRpYSBidXN5ICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJcmV0ID0gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKworCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShzZWxmLT5uZXRkZXYsIFRSVUUpOworCQlicmVhazsKKwljYXNlIFNJT0NHUkVDRUlWSU5HOiAvKiBDaGVjayBpZiB3ZSBhcmUgcmVjZWl2aW5nIHJpZ2h0IG5vdyAqLworCQlpcnEtPmlmcl9yZWNlaXZpbmcgPSBzbXNjX2lyY2NfaXNfcmVjZWl2aW5nKHNlbGYpOworCQlicmVhazsKKwkjaWYgMAorCWNhc2UgU0lPQ1NEVFJSVFM6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJcmV0ID0gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKwkJc21zY19pcmNjX3Npcl9zZXRfZHRyX3J0cyhkZXYsIGlycS0+aWZyX2R0ciwgaXJxLT5pZnJfcnRzKTsKKwkJYnJlYWs7CisJI2VuZGlmCisJZGVmYXVsdDoKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJfQorCQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc21zY19pcmNjX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmID0gKHN0cnVjdCBzbXNjX2lyY2NfY2IgKikgZGV2LT5wcml2OworCQorCXJldHVybiAmc2VsZi0+c3RhdHM7Cit9CisKKyNpZiBTTVNDX0lSQ0MyX0NfTkVUX1RJTUVPVVQKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKyAqCisgKiAgICBUaGUgbmV0d29ya2luZyB0aW1lb3V0IG1hbmFnZW1lbnQuCisgKgorICovCisKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY190aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2VsZiA9IChzdHJ1Y3Qgc21zY19pcmNjX2NiICopIGRldi0+cHJpdjsKKwkKKwlJUkRBX1dBUk5JTkcoIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIGNoYW5naW5nIHNwZWVkIHRvOiAlZFxuIiwKKwkJICAgICBkZXYtPm5hbWUsIHNlbGYtPmlvLnNwZWVkKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCXNtc2NfaXJjY19zaXJfc3RhcnQoc2VsZik7CisJc21zY19pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBzZWxmLT5pby5zcGVlZCk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKK30KKyNlbmRpZgorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX2hhcmRfeG1pdF9zaXIgKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCisgKgorICogICAgVHJhbnNtaXRzIHRoZSBjdXJyZW50IGZyYW1lIHVudGlsIEZJRk8gaXMgZnVsbCwgdGhlbgorICogICAgd2FpdHMgdW50aWwgdGhlIG5leHQgdHJhbnNtaXQgaW50ZXJydXB0LCBhbmQgY29udGludWVzIHVudGlsIHRoZQorICogICAgZnJhbWUgaXMgdHJhbnNtaXR0ZWQuCisgKi8KK2ludCBzbXNjX2lyY2NfaGFyZF94bWl0X3NpcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaW9iYXNlOworCXMzMiBzcGVlZDsKKworCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAwOyk7CisJCisJc2VsZiA9IChzdHJ1Y3Qgc21zY19pcmNjX2NiICopIGRldi0+cHJpdjsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwkvKiBNYWtlIHN1cmUgdGVzdCBvZiBzZWxmLT5pby5zcGVlZCAmIHNwZWVkIGNoYW5nZSBhcmUgYXRvbWljICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBzcGVlZCAqLworCXNwZWVkID0gaXJkYV9nZXRfbmV4dF9zcGVlZChza2IpOworCWlmICgoc3BlZWQgIT0gc2VsZi0+aW8uc3BlZWQpICYmIChzcGVlZCAhPSAtMSkpIHsKKwkJLyogQ2hlY2sgZm9yIGVtcHR5IGZyYW1lICovCisJCWlmICghc2tiLT5sZW4pIHsKKwkJCS8qCisJCQkgKiBXZSBzZW5kIGZyYW1lcyBvbmUgYnkgb25lIGluIFNJUiBtb2RlIChubworCQkJICogcGlwZWxpbmluZyksIHNvIGF0IHRoaXMgcG9pbnQsIGlmIHdlIHdlcmUgc2VuZGluZworCQkJICogYSBwcmV2aW91cyBmcmFtZSwgd2UganVzdCByZWNlaXZlZCB0aGUgaW50ZXJydXB0CisJCQkgKiB0ZWxsaW5nIHVzIGl0IGlzIGZpbmlzaGVkIChVQVJUX0lJUl9USFJJKS4KKwkJCSAqIFRoZXJlZm9yZSwgd2FpdGluZyBmb3IgdGhlIHRyYW5zbWl0dGVyIHRvIHJlYWxseQorCQkJICogZmluaXNoIGRyYWluaW5nIHRoZSBmaWZvIHdvbid0IHRha2UgdG9vIGxvbmcuCisJCQkgKiBBbmQgdGhlIGludGVycnVwdCBoYW5kbGVyIGlzIG5vdCBleHBlY3RlZCB0byBydW4uCisJCQkgKiAtIEplYW4gSUkgKi8KKwkJCXNtc2NfaXJjY19zaXJfd2FpdF9od190cmFuc21pdHRlcl9maW5pc2goc2VsZik7CisJCQlzbXNjX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIHNwZWVkKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJc2VsZi0+bmV3X3NwZWVkID0gc3BlZWQ7CisJCX0KKwl9CisKKwkvKiBJbml0IHR4IGJ1ZmZlciAqLworCXNlbGYtPnR4X2J1ZmYuZGF0YSA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKKworCS8qIENvcHkgc2tiIHRvIHR4X2J1ZmYgd2hpbGUgd3JhcHBpbmcsIHN0dWZmaW5nIGFuZCBtYWtpbmcgQ1JDICovCisJc2VsZi0+dHhfYnVmZi5sZW4gPSBhc3luY193cmFwX3NrYihza2IsIHNlbGYtPnR4X2J1ZmYuZGF0YSwgCisJCQkJCSAgIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUpOworCQorCXNlbGYtPnN0YXRzLnR4X2J5dGVzICs9IHNlbGYtPnR4X2J1ZmYubGVuOworCisJLyogVHVybiBvbiB0cmFuc21pdCBmaW5pc2hlZCBpbnRlcnJ1cHQuIFdpbGwgZmlyZSBpbW1lZGlhdGVseSEgICovCisJb3V0YihVQVJUX0lFUl9USFJJLCBpb2Jhc2UrVUFSVF9JRVIpOyAKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19zZXRfZmlyX3NwZWVkIChzZWxmLCBiYXVkKQorICoKKyAqICAgIENoYW5nZSB0aGUgc3BlZWQgb2YgdGhlIGRldmljZQorICoKKyAqLworc3RhdGljIHZvaWQgc21zY19pcmNjX3NldF9maXJfc3BlZWQoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgdTMyIHNwZWVkKQoreworCWludCBmaXJfYmFzZSwgaXJfbW9kZSwgY3RybCwgZmFzdDsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJZmlyX2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCXNlbGYtPmlvLnNwZWVkID0gc3BlZWQ7CisKKwlzd2l0Y2goc3BlZWQpIHsKKwlkZWZhdWx0OgorCWNhc2UgNTc2MDAwOgkJCisJCWlyX21vZGUgPSBJUkNDX0NGR0FfSVJEQV9IRExDOworCQljdHJsID0gSVJDQ19DUkM7CisJCWZhc3QgPSAwOworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBoYW5kbGluZyBiYXVkIG9mIDU3NjAwMFxuIiwgX19GVU5DVElPTl9fKTsKKwkJYnJlYWs7CisJY2FzZSAxMTUyMDAwOgorCQlpcl9tb2RlID0gSVJDQ19DRkdBX0lSREFfSERMQzsKKwkJY3RybCA9IElSQ0NfMTE1MiB8IElSQ0NfQ1JDOworCQlmYXN0ID0gSVJDQ19MQ1JfQV9GQVNUIHwgSVJDQ19MQ1JfQV9HUF9EQVRBOworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBoYW5kbGluZyBiYXVkIG9mIDExNTIwMDBcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlicmVhazsKKwljYXNlIDQwMDAwMDA6CisJCWlyX21vZGUgPSBJUkNDX0NGR0FfSVJEQV80UFBNOworCQljdHJsID0gSVJDQ19DUkM7CisJCWZhc3QgPSBJUkNDX0xDUl9BX0ZBU1Q7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGhhbmRsaW5nIGJhdWQgb2YgNDAwMDAwMFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXyk7CisJCWJyZWFrOworCX0KKwkjaWYgMAorCU5vdyBpbiB0cmFuY2VpdmVyIQorCS8qIFRoaXMgY2F1c2VzIGFuIGludGVycnVwdCAqLworCXJlZ2lzdGVyX2JhbmsoZmlyX2Jhc2UsIDApOworCW91dGIoKGluYihmaXJfYmFzZStJUkNDX0xDUl9BKSAmICAweGJmKSB8IGZhc3QsIGZpcl9iYXNlK0lSQ0NfTENSX0EpOworCSNlbmRpZgorCQorCXJlZ2lzdGVyX2JhbmsoZmlyX2Jhc2UsIDEpOworCW91dGIoKChpbmIoZmlyX2Jhc2UrSVJDQ19TQ0VfQ0ZHQSkgJiBJUkNDX1NDRV9DRkdBX0JMT0NLX0NUUkxfQklUU19NQVNLKSB8IGlyX21vZGUpLCBmaXJfYmFzZStJUkNDX1NDRV9DRkdBKTsKKwkKKwlyZWdpc3Rlcl9iYW5rKGZpcl9iYXNlLCA0KTsKKwlvdXRiKChpbmIoZmlyX2Jhc2UrSVJDQ19DT05UUk9MKSAmIDB4MzApIHwgY3RybCwgZmlyX2Jhc2UrSVJDQ19DT05UUk9MKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19maXJfc3RhcnQoc2VsZikKKyAqCisgKiAgICBDaGFuZ2UgdGhlIHNwZWVkIG9mIHRoZSBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19maXJfc3RhcnQoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBmaXJfYmFzZTsKKworCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlkZXYgPSBzZWxmLT5uZXRkZXY7CisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybjspOworCisJZmlyX2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCS8qIFJlc2V0IGV2ZXJ5dGhpbmcgKi8KKworCS8qIEluc3RhbGwgRklSIHRyYW5zbWl0IGhhbmRsZXIgKi8KKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHNtc2NfaXJjY19oYXJkX3htaXRfZmlyOwkKKworCS8qIENsZWFyIEZJRk8gKi8KKwlvdXRiKGluYihmaXJfYmFzZStJUkNDX0xDUl9BKXxJUkNDX0xDUl9BX0ZJRk9fUkVTRVQsIGZpcl9iYXNlK0lSQ0NfTENSX0EpOworCisJLyogRW5hYmxlIGludGVycnVwdCAqLworCS8qb3V0YihJUkNDX0lFUl9BQ1RJVkVfRlJBTUV8SVJDQ19JRVJfRU9NLCBmaXJfYmFzZStJUkNDX0lFUik7Ki8KKworCXJlZ2lzdGVyX2JhbmsoZmlyX2Jhc2UsIDEpOworCisJLyogU2VsZWN0IHRoZSBUWC9SWCBpbnRlcmZhY2UgKi8JCisjaWZkZWYgU01TQ182NjkgLyogVXNlcyBwaW4gODgvODkgZm9yIFJ4L1R4ICovCisJb3V0YigoKGluYihmaXJfYmFzZStJUkNDX1NDRV9DRkdCKSAmIDB4M2YpIHwgSVJDQ19DRkdCX01VWF9DT00pLCAKKwkgICAgIGZpcl9iYXNlK0lSQ0NfU0NFX0NGR0IpOworI2Vsc2UJCisJb3V0YigoKGluYihmaXJfYmFzZStJUkNDX1NDRV9DRkdCKSAmIDB4M2YpIHwgSVJDQ19DRkdCX01VWF9JUiksCisJICAgICBmaXJfYmFzZStJUkNDX1NDRV9DRkdCKTsKKyNlbmRpZgkKKwkodm9pZCkgaW5iKGZpcl9iYXNlK0lSQ0NfRklGT19USFJFU0hPTEQpOworCisJLyogRW5hYmxlIFNDRSBpbnRlcnJ1cHRzICovCisJb3V0YigwLCBmaXJfYmFzZStJUkNDX01BU1RFUik7CisJcmVnaXN0ZXJfYmFuayhmaXJfYmFzZSwgMCk7CisJb3V0YihJUkNDX0lFUl9BQ1RJVkVfRlJBTUV8SVJDQ19JRVJfRU9NLCBmaXJfYmFzZStJUkNDX0lFUik7CisJb3V0YihJUkNDX01BU1RFUl9JTlRfRU4sIGZpcl9iYXNlK0lSQ0NfTUFTVEVSKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19maXJfc3RvcChzZWxmLCBiYXVkKQorICoKKyAqICAgIENoYW5nZSB0aGUgc3BlZWQgb2YgdGhlIGRldmljZQorICoKKyAqLworc3RhdGljIHZvaWQgc21zY19pcmNjX2Zpcl9zdG9wKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpCit7CisJaW50IGZpcl9iYXNlOworCisJSVJEQV9ERUJVRygxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKworCWZpcl9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJcmVnaXN0ZXJfYmFuayhmaXJfYmFzZSwgMCk7CisJLypvdXRiKElSQ0NfTUFTVEVSX1JFU0VULCBmaXJfYmFzZStJUkNDX01BU1RFUik7Ki8JCisJb3V0YihpbmIoZmlyX2Jhc2UrSVJDQ19MQ1JfQikgJiBJUkNDX0xDUl9CX1NJUF9FTkFCTEUsIGZpcl9iYXNlK0lSQ0NfTENSX0IpOworfQorCisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIGJhdWQpCisgKgorICogICAgQ2hhbmdlIHRoZSBzcGVlZCBvZiB0aGUgZGV2aWNlCisgKgorICogVGhpcyBmdW5jdGlvbiAqbXVzdCogYmUgY2FsbGVkIHdpdGggc3BpbmxvY2sgaGVsZCwgYmVjYXVzZSBpdCBtYXkKKyAqIGJlIGNhbGxlZCBmcm9tIHRoZSBpcnEgaGFuZGxlci4gLSBKZWFuIElJCisgKi8KK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19jaGFuZ2Vfc3BlZWQodm9pZCAqcHJpdiwgdTMyIHNwZWVkKQoreworCXN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYgPSAoc3RydWN0IHNtc2NfaXJjY19jYiAqKSBwcml2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGlvYmFzZTsKKwlpbnQgbGFzdF9zcGVlZF93YXNfc2lyOworCQorCUlSREFfREVCVUcoMCwgIiVzKCkgY2hhbmdpbmcgc3BlZWQgdG86ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHNwZWVkKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJZGV2ID0gc2VsZi0+bmV0ZGV2OworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJbGFzdF9zcGVlZF93YXNfc2lyID0gc2VsZi0+aW8uc3BlZWQgPD0gU01TQ19JUkNDMl9NQVhfU0lSX1NQRUVEOworCisJI2lmIDAKKwkvKiBUZW1wIEhhY2sgKi8KKwlzcGVlZD0gMTE1MjAwMDsKKwlzZWxmLT5pby5zcGVlZCA9IHNwZWVkOworCWxhc3Rfc3BlZWRfd2FzX3NpciA9IDA7CisJc21zY19pcmNjX2Zpcl9zdGFydChzZWxmKTsJCisJI2VuZGlmCisJCisJaWYoc2VsZi0+aW8uc3BlZWQgPT0gMCkKKwkJc21zY19pcmNjX3Npcl9zdGFydChzZWxmKTsKKworCSNpZiAwCisJaWYoIWxhc3Rfc3BlZWRfd2FzX3Npcikgc3BlZWQgPSBzZWxmLT5pby5zcGVlZDsKKwkjZW5kaWYKKworCWlmKHNlbGYtPmlvLnNwZWVkICE9IHNwZWVkKSBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX2Zvcl9zcGVlZChzZWxmLCBzcGVlZCk7CisKKwlzZWxmLT5pby5zcGVlZCA9IHNwZWVkOworCQorCWlmKHNwZWVkIDw9IFNNU0NfSVJDQzJfTUFYX1NJUl9TUEVFRCkgeworCQlpZighbGFzdF9zcGVlZF93YXNfc2lyKSB7CisJCQlzbXNjX2lyY2NfZmlyX3N0b3Aoc2VsZik7CisJCQlzbXNjX2lyY2Nfc2lyX3N0YXJ0KHNlbGYpOworCQl9CisJCXNtc2NfaXJjY19zZXRfc2lyX3NwZWVkKHNlbGYsIHNwZWVkKTsgCisJfQorCWVsc2UgeworCQlpZihsYXN0X3NwZWVkX3dhc19zaXIpIHsKKwkJCSNpZiBTTVNDX0lSQ0MyX0NfU0lSX1NUT1AJCQorCQkJc21zY19pcmNjX3Npcl9zdG9wKHNlbGYpOworCQkJI2VuZGlmCisJCQlzbXNjX2lyY2NfZmlyX3N0YXJ0KHNlbGYpOworCQl9CisJCXNtc2NfaXJjY19zZXRfZmlyX3NwZWVkKHNlbGYsIHNwZWVkKTsKKworCQkjaWYgMAorCQlzZWxmLT50eF9idWZmLmxlbiA9IDEwOworCQlzZWxmLT50eF9idWZmLmRhdGEgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisJCQorCQlzbXNjX2lyY2NfZG1hX3htaXQoc2VsZiwgaW9iYXNlLCA0MDAwKTsKKwkJI2VuZGlmCisJCS8qIEJlIHJlYWR5IGZvciBpbmNvbWluZyBmcmFtZXMgKi8KKwkJc21zY19pcmNjX2RtYV9yZWNlaXZlKHNlbGYsIGlvYmFzZSk7CisJfQorCQorCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19zZXRfc2lyX3NwZWVkIChzZWxmLCBzcGVlZCkKKyAqCisgKiAgICBTZXQgc3BlZWQgb2YgSXJEQSBwb3J0IHRvIHNwZWNpZmllZCBiYXVkcmF0ZQorICoKKyAqLwordm9pZCBzbXNjX2lyY2Nfc2V0X3Npcl9zcGVlZCh2b2lkICpwcml2LCBfX3UzMiBzcGVlZCkKK3sKKwlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmID0gKHN0cnVjdCBzbXNjX2lyY2NfY2IgKikgcHJpdjsKKwlpbnQgaW9iYXNlOyAKKwlpbnQgZmNyOyAgICAvKiBGSUZPIGNvbnRyb2wgcmVnICovCisJaW50IGxjcjsgICAgLyogTGluZSBjb250cm9sIHJlZyAqLworCWludCBkaXZpc29yOworCisJSVJEQV9ERUJVRygwLCAiJXMoKSwgU2V0dGluZyBzcGVlZCB0bzogJWRcbiIsIF9fRlVOQ1RJT05fXywgc3BlZWQpOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlpb2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKwkKKwkvKiBVcGRhdGUgYWNjb3VudGluZyBmb3IgbmV3IHNwZWVkICovCisJc2VsZi0+aW8uc3BlZWQgPSBzcGVlZDsKKworCS8qIFR1cm4gb2ZmIGludGVycnVwdHMgKi8KKwlvdXRiKDAsIGlvYmFzZStVQVJUX0lFUik7IAorCisJZGl2aXNvciA9IFNNU0NfSVJDQzJfTUFYX1NJUl9TUEVFRC9zcGVlZDsKKwkKKwlmY3IgPSBVQVJUX0ZDUl9FTkFCTEVfRklGTzsKKworCS8qIAorCSAqIFVzZSB0cmlnZ2VyIGxldmVsIDEgdG8gYXZvaWQgMyBtcy4gdGltZW91dCBkZWxheSBhdCA5NjAwIGJwcywgYW5kCisJICogYWxtb3N0IDEsNyBtcyBhdCAxOTIwMCBicHMuIEF0IHNwZWVkcyBhYm92ZSB0aGF0IHdlIGNhbiBqdXN0IGZvcmdldAorCSAqIGFib3V0IHRoaXMgdGltZW91dCBzaW5jZSBpdCB3aWxsIGFsd2F5cyBiZSBmYXN0IGVub3VnaC4gCisJICovCisJaWYgKHNlbGYtPmlvLnNwZWVkIDwgMzg0MDApCisJCWZjciB8PSBVQVJUX0ZDUl9UUklHR0VSXzE7CisJZWxzZSAKKwkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfMTQ7CisgICAgICAgIAorCS8qIElyREEgcG9ydHMgdXNlIDhOMSAqLworCWxjciA9IFVBUlRfTENSX1dMRU44OworCQorCW91dGIoVUFSVF9MQ1JfRExBQiB8IGxjciwgaW9iYXNlK1VBUlRfTENSKTsgLyogU2V0IERMQUIgKi8KKwlvdXRiKGRpdmlzb3IgJiAweGZmLCAgICAgIGlvYmFzZStVQVJUX0RMTCk7IC8qIFNldCBzcGVlZCAqLworCW91dGIoZGl2aXNvciA+PiA4LAkgIGlvYmFzZStVQVJUX0RMTSk7CisJb3V0YihsY3IsCQkgIGlvYmFzZStVQVJUX0xDUik7IC8qIFNldCA4TjEJKi8KKwlvdXRiKGZjciwJCSAgaW9iYXNlK1VBUlRfRkNSKTsgLyogRW5hYmxlIEZJRk8ncyAqLworCisJLyogVHVybiBvbiBpbnRlcnJ1cHMgKi8KKwlvdXRiKFVBUlRfSUVSX1JMU0l8VUFSVF9JRVJfUkRJfFVBUlRfSUVSX1RIUkksIGlvYmFzZStVQVJUX0lFUik7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpIHNwZWVkIGNoYW5nZWQgdG86ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHNwZWVkKTsKK30KKworCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX2hhcmRfeG1pdF9maXIgKHNrYiwgZGV2KQorICoKKyAqICAgIFRyYW5zbWl0IHRoZSBmcmFtZSEKKyAqCisgKi8KK3N0YXRpYyBpbnQgc21zY19pcmNjX2hhcmRfeG1pdF9maXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJczMyIHNwZWVkOworCWludCBpb2Jhc2U7CisJaW50IG10dDsKKworCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gMDspOworCXNlbGYgPSAoc3RydWN0IHNtc2NfaXJjY19jYiAqKSBkZXYtPnByaXY7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gMDspOworCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBNYWtlIHN1cmUgdGVzdCBvZiBzZWxmLT5pby5zcGVlZCAmIHNwZWVkIGNoYW5nZSBhcmUgYXRvbWljICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBzcGVlZCBhZnRlciB0aGlzIGZyYW1lICovCisJc3BlZWQgPSBpcmRhX2dldF9uZXh0X3NwZWVkKHNrYik7CisJaWYgKChzcGVlZCAhPSBzZWxmLT5pby5zcGVlZCkgJiYgKHNwZWVkICE9IC0xKSkgeworCQkvKiBDaGVjayBmb3IgZW1wdHkgZnJhbWUgKi8KKwkJaWYgKCFza2ItPmxlbikgeworCQkJLyogTm90ZSA6IHlvdSBzaG91bGQgbWFrZSBzdXJlIHRoYXQgc3BlZWQgY2hhbmdlcworCQkJICogYXJlIG5vdCBnb2luZyB0byBjb3JydXB0IGFueSBvdXRnb2luZyBmcmFtZS4KKwkJCSAqIExvb2sgYXQgbnNjLWlyY2MgZm9yIHRoZSBnb3J5IGRldGFpbHMgLSBKZWFuIElJICovCisJCQlzbXNjX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIHNwZWVkKTsgCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQlzZWxmLT5uZXdfc3BlZWQgPSBzcGVlZDsKKwl9CisJCisJbWVtY3B5KHNlbGYtPnR4X2J1ZmYuaGVhZCwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKwlzZWxmLT50eF9idWZmLmxlbiA9IHNrYi0+bGVuOworCXNlbGYtPnR4X2J1ZmYuZGF0YSA9IHNlbGYtPnR4X2J1ZmYuaGVhZDsKKwkKKwltdHQgPSBpcmRhX2dldF9tdHQoc2tiKTsJCisJaWYgKG10dCkgeworCQlpbnQgYm9mczsKKworCQkvKiAKKwkJICogQ29tcHV0ZSBob3cgbWFueSBCT0ZzIChTVEEgb3IgUEEncykgd2UgbmVlZCB0byB3YXN0ZSB0aGUKKwkJICogbWluIHR1cm4gdGltZSBnaXZlbiB0aGUgc3BlZWQgb2YgdGhlIGxpbmsuCisJCSAqLworCQlib2ZzID0gbXR0ICogKHNlbGYtPmlvLnNwZWVkIC8gMTAwMCkgLyA4MDAwOworCQlpZiAoYm9mcyA+IDQwOTUpCisJCQlib2ZzID0gNDA5NTsKKworCQlzbXNjX2lyY2NfZG1hX3htaXQoc2VsZiwgaW9iYXNlLCBib2ZzKTsKKwl9IGVsc2UgeworCQkvKiBUcmFuc21pdCBmcmFtZSAqLworCQlzbXNjX2lyY2NfZG1hX3htaXQoc2VsZiwgaW9iYXNlLCAwKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX2RtYV94bWl0IChzZWxmLCBpb2Jhc2UpCisgKgorICogICAgVHJhbnNtaXQgZGF0YSB1c2luZyBETUEKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19kbWFfeG1pdChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlLCBpbnQgYm9mcykKK3sKKwl1OCBjdHJsOworCisJSVJEQV9ERUJVRygzLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisjaWYgMQorCS8qIERpc2FibGUgUnggKi8KKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7CisJb3V0YigweDAwLCBpb2Jhc2UrSVJDQ19MQ1JfQik7CisjZW5kaWYKKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMSk7CisJb3V0YihpbmIoaW9iYXNlK0lSQ0NfU0NFX0NGR0IpICYgfklSQ0NfQ0ZHQl9ETUFfRU5BQkxFLCAKKwkgICAgIGlvYmFzZStJUkNDX1NDRV9DRkdCKTsKKworCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1hNSVQ7CisKKwkvKiBTZXQgQk9GIGFkZGl0aW9uYWwgY291bnQgZm9yIGdlbmVyYXRpbmcgdGhlIG1pbiB0dXJuIHRpbWUgKi8KKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgNCk7CisJb3V0Yihib2ZzICYgMHhmZiwgaW9iYXNlK0lSQ0NfQk9GX0NPVU5UX0xPKTsKKwljdHJsID0gaW5iKGlvYmFzZStJUkNDX0NPTlRST0wpICYgMHhmMDsKKwlvdXRiKGN0cmwgfCAoKGJvZnMgPj4gOCkgJiAweDBmKSwgaW9iYXNlK0lSQ0NfQk9GX0NPVU5UX0hJKTsKKworCS8qIFNldCBtYXggVHggZnJhbWUgc2l6ZSAqLworCW91dGIoc2VsZi0+dHhfYnVmZi5sZW4gPj4gOCwgaW9iYXNlK0lSQ0NfVFhfU0laRV9ISSk7CisJb3V0YihzZWxmLT50eF9idWZmLmxlbiAmIDB4ZmYsIGlvYmFzZStJUkNDX1RYX1NJWkVfTE8pOworCisJLypvdXRiKFVBUlRfTUNSX09VVDIsIHNlbGYtPmlvLnNpcl9iYXNlICsgVUFSVF9NQ1IpOyovCisJCisJLyogRW5hYmxlIGJ1cnN0IG1vZGUgY2hpcCBUeCBETUEgKi8KKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMSk7CisJb3V0YihpbmIoaW9iYXNlK0lSQ0NfU0NFX0NGR0IpIHwgSVJDQ19DRkdCX0RNQV9FTkFCTEUgfAorCSAgICAgSVJDQ19DRkdCX0RNQV9CVVJTVCwgaW9iYXNlK0lSQ0NfU0NFX0NGR0IpOworCisJLyogU2V0dXAgRE1BIGNvbnRyb2xsZXIgKG11c3QgYmUgZG9uZSBhZnRlciBlbmFibGluZyBjaGlwIERNQSkgKi8KKwlpcmRhX3NldHVwX2RtYShzZWxmLT5pby5kbWEsIHNlbGYtPnR4X2J1ZmZfZG1hLCBzZWxmLT50eF9idWZmLmxlbiwKKwkJICAgICAgIERNQV9UWF9NT0RFKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHQgKi8KKworCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKKwlvdXRiKElSQ0NfSUVSX0FDVElWRV9GUkFNRSB8IElSQ0NfSUVSX0VPTSwgaW9iYXNlK0lSQ0NfSUVSKTsKKwlvdXRiKElSQ0NfTUFTVEVSX0lOVF9FTiwgaW9iYXNlK0lSQ0NfTUFTVEVSKTsKKwkKKwkvKiBFbmFibGUgdHJhbnNtaXQgKi8KKwlvdXRiKElSQ0NfTENSX0JfU0NFX1RSQU5TTUlUIHwgSVJDQ19MQ1JfQl9TSVBfRU5BQkxFLCBpb2Jhc2UrSVJDQ19MQ1JfQik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfZG1hX3htaXRfY29tcGxldGUgKHNlbGYpCisgKgorICogICAgVGhlIHRyYW5zZmVyIG9mIGEgZnJhbWUgaW4gZmluaXNoZWQuIFRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IGJlIGNhbGxlZCAKKyAqICAgIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgorICoKKyAqLworc3RhdGljIHZvaWQgc21zY19pcmNjX2RtYV94bWl0X2NvbXBsZXRlKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIGludCBpb2Jhc2UpCit7CisJSVJEQV9ERUJVRygzLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisjaWYgMAorCS8qIERpc2FibGUgVHggKi8KKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7CisJb3V0YigweDAwLCBpb2Jhc2UrSVJDQ19MQ1JfQik7CisjZW5kaWYKKwlyZWdpc3Rlcl9iYW5rKHNlbGYtPmlvLmZpcl9iYXNlLCAxKTsKKwlvdXRiKGluYihzZWxmLT5pby5maXJfYmFzZStJUkNDX1NDRV9DRkdCKSAmIH5JUkNDX0NGR0JfRE1BX0VOQUJMRSwKKwkgICAgIHNlbGYtPmlvLmZpcl9iYXNlK0lSQ0NfU0NFX0NGR0IpOworCisJLyogQ2hlY2sgZm9yIHVuZGVycnVuISAqLworCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKKwlpZiAoaW5iKGlvYmFzZStJUkNDX0xTUikgJiBJUkNDX0xTUl9VTkRFUlJVTikgeworCQlzZWxmLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJc2VsZi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKworCQkvKiBSZXNldCBlcnJvciBjb25kaXRpb24gKi8KKwkJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOworCQlvdXRiKElSQ0NfTUFTVEVSX0VSUk9SX1JFU0VULCBpb2Jhc2UrSVJDQ19NQVNURVIpOworCQlvdXRiKDB4MDAsIGlvYmFzZStJUkNDX01BU1RFUik7CisJfSBlbHNlIHsKKwkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworCQlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSAgc2VsZi0+dHhfYnVmZi5sZW47CisJfQorCisJLyogQ2hlY2sgaWYgaXQncyB0aW1lIHRvIGNoYW5nZSB0aGUgc3BlZWQgKi8KKwlpZiAoc2VsZi0+bmV3X3NwZWVkKSB7CisJCXNtc2NfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc2VsZi0+bmV3X3NwZWVkKTsJCQorCQlzZWxmLT5uZXdfc3BlZWQgPSAwOworCX0KKworCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19kbWFfcmVjZWl2ZShzZWxmKQorICoKKyAqICAgIEdldCByZWFkeSBmb3IgcmVjZWl2aW5nIGEgZnJhbWUuIFRoZSBkZXZpY2Ugd2lsbCBpbml0aWF0ZSBhIERNQQorICogICAgaWYgaXQgc3RhcnRzIHRvIHJlY2VpdmUgYSBmcmFtZS4KKyAqCisgKi8KK3N0YXRpYyBpbnQgc21zY19pcmNjX2RtYV9yZWNlaXZlKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIGludCBpb2Jhc2UpIAoreworI2lmIDAKKwkvKiBUdXJuIG9mZiBjaGlwIERNQSAqLworCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAxKTsKKwlvdXRiKGluYihpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQikgJiB+SVJDQ19DRkdCX0RNQV9FTkFCTEUsIAorCSAgICAgaW9iYXNlK0lSQ0NfU0NFX0NGR0IpOworI2VuZGlmCisJCisJLyogRGlzYWJsZSBUeCAqLworCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKKwlvdXRiKDB4MDAsIGlvYmFzZStJUkNDX0xDUl9CKTsKKworCS8qIFR1cm4gb2ZmIGNoaXAgRE1BICovCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDEpOworCW91dGIoaW5iKGlvYmFzZStJUkNDX1NDRV9DRkdCKSAmIH5JUkNDX0NGR0JfRE1BX0VOQUJMRSwgCisJICAgICBpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQik7CisKKwlzZWxmLT5pby5kaXJlY3Rpb24gPSBJT19SRUNWOworCXNlbGYtPnJ4X2J1ZmYuZGF0YSA9IHNlbGYtPnJ4X2J1ZmYuaGVhZDsKKworCS8qIFNldCBtYXggUnggZnJhbWUgc2l6ZSAqLworCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCA0KTsKKwlvdXRiKCgyMDUwID4+IDgpICYgMHgwZiwgaW9iYXNlK0lSQ0NfUlhfU0laRV9ISSk7CisJb3V0YigyMDUwICYgMHhmZiwgaW9iYXNlK0lSQ0NfUlhfU0laRV9MTyk7CisKKwkvKiBTZXR1cCBETUEgY29udHJvbGxlciAqLworCWlyZGFfc2V0dXBfZG1hKHNlbGYtPmlvLmRtYSwgc2VsZi0+cnhfYnVmZl9kbWEsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCSAgICAgICBETUFfUlhfTU9ERSk7CisKKwkvKiBFbmFibGUgYnVyc3QgbW9kZSBjaGlwIFJ4IERNQSAqLworCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAxKTsKKwlvdXRiKGluYihpb2Jhc2UrSVJDQ19TQ0VfQ0ZHQikgfCBJUkNDX0NGR0JfRE1BX0VOQUJMRSB8IAorCSAgICAgSVJDQ19DRkdCX0RNQV9CVVJTVCwgaW9iYXNlK0lSQ0NfU0NFX0NGR0IpOworCisJLyogRW5hYmxlIGludGVycnVwdCAqLworCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAwKTsKKwlvdXRiKElSQ0NfSUVSX0FDVElWRV9GUkFNRSB8IElSQ0NfSUVSX0VPTSwgaW9iYXNlK0lSQ0NfSUVSKTsKKwlvdXRiKElSQ0NfTUFTVEVSX0lOVF9FTiwgaW9iYXNlK0lSQ0NfTUFTVEVSKTsKKworCisJLyogRW5hYmxlIHJlY2VpdmVyICovCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOworCW91dGIoSVJDQ19MQ1JfQl9TQ0VfUkVDRUlWRSB8IElSQ0NfTENSX0JfU0lQX0VOQUJMRSwgCisJICAgICBpb2Jhc2UrSVJDQ19MQ1JfQik7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc2VsZiwgaW9iYXNlKQorICoKKyAqICAgIEZpbmlzaGVkIHdpdGggcmVjZWl2aW5nIGZyYW1lcworICoKKyAqLworc3RhdGljIHZvaWQgc21zY19pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYsIGludCBpb2Jhc2UpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgbGVuLCBtc2djbnQsIGxzcjsKKwkKKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7CisJCisJSVJEQV9ERUJVRygzLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisjaWYgMAorCS8qIERpc2FibGUgUnggKi8KKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7CisJb3V0YigweDAwLCBpb2Jhc2UrSVJDQ19MQ1JfQik7CisjZW5kaWYKKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7CisJb3V0YihpbmIoaW9iYXNlK0lSQ0NfTFNBUikgJiB+SVJDQ19MU0FSX0FERFJFU1NfTUFTSywgaW9iYXNlK0lSQ0NfTFNBUik7CisJbHNyPSBpbmIoaW9iYXNlK0lSQ0NfTFNSKTsKKwltc2djbnQgPSBpbmIoaW9iYXNlK0lSQ0NfTENSX0IpICYgMHgwODsKKworCUlSREFfREVCVUcoMiwgIiVzOiBkbWEgY291bnQgPSAlZFxuIiwgX19GVU5DVElPTl9fLAorCQkgICBnZXRfZG1hX3Jlc2lkdWUoc2VsZi0+aW8uZG1hKSk7CisKKwlsZW4gPSBzZWxmLT5yeF9idWZmLnRydWVzaXplIC0gZ2V0X2RtYV9yZXNpZHVlKHNlbGYtPmlvLmRtYSk7CisKKwkvKiBMb29rIGZvciBlcnJvcnMgCisJICovCQorCisJaWYobHNyICYgKElSQ0NfTFNSX0ZSQU1FX0VSUk9SIHwgSVJDQ19MU1JfQ1JDX0VSUk9SIHwgSVJDQ19MU1JfU0laRV9FUlJPUikpIHsKKwkJc2VsZi0+c3RhdHMucnhfZXJyb3JzKys7CisJCWlmKGxzciAmIElSQ0NfTFNSX0ZSQU1FX0VSUk9SKSBzZWxmLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJaWYobHNyICYgSVJDQ19MU1JfQ1JDX0VSUk9SKSBzZWxmLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCWlmKGxzciAmIElSQ0NfTFNSX1NJWkVfRVJST1IpIHNlbGYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJaWYobHNyICYgKElSQ0NfTFNSX1VOREVSUlVOIHwgSVJDQ19MU1JfT1ZFUlJVTikpIHNlbGYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJcmV0dXJuOworCX0KKwkvKiBSZW1vdmUgQ1JDICovCisJaWYgKHNlbGYtPmlvLnNwZWVkIDwgNDAwMDAwMCkKKwkJbGVuIC09IDI7CisJZWxzZQorCQlsZW4gLT0gNDsKKworCWlmICgobGVuIDwgMikgfHwgKGxlbiA+IDIwNTApKSB7CisJCUlSREFfV0FSTklORygiJXMoKSwgYm9ndXMgbGVuPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGxlbik7CisJCXJldHVybjsKKwl9CisJSVJEQV9ERUJVRygyLCAiJXM6IG1zZ2NudCA9ICVkLCBsZW49JWRcbiIsIF9fRlVOQ1RJT05fXywgbXNnY250LCBsZW4pOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4rMSk7CisJaWYgKCFza2IpICB7CisJCUlSREFfV0FSTklORygiJXMoKSwgbWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIGZyYW1lLlxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0JCQkKKwkvKiBNYWtlIHN1cmUgSVAgaGVhZGVyIGdldHMgYWxpZ25lZCAqLworCXNrYl9yZXNlcnZlKHNrYiwgMSk7IAorCisJbWVtY3B5KHNrYl9wdXQoc2tiLCBsZW4pLCBzZWxmLT5yeF9idWZmLmRhdGEsIGxlbik7CisJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOworCXNlbGYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKworCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OworCXNrYi0+bWFjLnJhdyAgPSBza2ItPmRhdGE7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOworCW5ldGlmX3J4KHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2Nfc2lyX3JlY2VpdmUgKHNlbGYpCisgKgorICogICAgUmVjZWl2ZSBvbmUgZnJhbWUgZnJvbSB0aGUgaW5mcmFyZWQgcG9ydAorICoKKyAqLworc3RhdGljIHZvaWQgc21zY19pcmNjX3Npcl9yZWNlaXZlKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpIAoreworCWludCBib2d1c2NvdW50ID0gMDsKKwlpbnQgaW9iYXNlOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCisJLyogIAorCSAqIFJlY2VpdmUgYWxsIGNoYXJhY3RlcnMgaW4gUnggRklGTywgdW53cmFwIGFuZCB1bnN0dWZmIHRoZW0uIAorICAgICAgICAgKiBhc3luY191bndyYXBfY2hhciB3aWxsIGRlbGl2ZXIgYWxsIGZvdW5kIGZyYW1lcyAgCisJICovCisJZG8geworCQlhc3luY191bndyYXBfY2hhcihzZWxmLT5uZXRkZXYsICZzZWxmLT5zdGF0cywgJnNlbGYtPnJ4X2J1ZmYsIAorCQkJCSAgaW5iKGlvYmFzZStVQVJUX1JYKSk7CisKKwkJLyogTWFrZSBzdXJlIHdlIGRvbid0IHN0YXkgaGVyZSB0byBsb25nICovCisJCWlmIChib2d1c2NvdW50KysgPiAzMikgeworCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgYnJlYWtpbmchXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChpbmIoaW9iYXNlK1VBUlRfTFNSKSAmIFVBUlRfTFNSX0RSKTsJCit9CisKKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19pbnRlcnJ1cHQgKGlycSwgZGV2X2lkLCByZWdzKQorICoKKyAqICAgIEFuIGludGVycnVwdCBmcm9tIHRoZSBjaGlwIGhhcyBhcnJpdmVkLiBUaW1lIHRvIGRvIHNvbWUgd29yaworICoKKyAqLworc3RhdGljIGlycXJldHVybl90IHNtc2NfaXJjY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmOworCWludCBpb2Jhc2UsIGlpciwgbGNyYSwgbHNyOworCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpcnEgJWQgZm9yIHVua25vd24gZGV2aWNlLlxuIiwgCisJCSAgICAgICBkcml2ZXJfbmFtZSwgaXJxKTsKKwkJZ290byBpcnFfcmV0OworCX0KKwlzZWxmID0gKHN0cnVjdCBzbXNjX2lyY2NfY2IgKikgZGV2LT5wcml2OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIElSUV9OT05FOyk7CisKKwkvKiBTZXJpYWxpc2UgdGhlIGludGVycnVwdCBoYW5kbGVyIGluIHZhcmlvdXMgQ1BVcywgc3RvcCBUeCBwYXRoICovCisJc3Bpbl9sb2NrKCZzZWxmLT5sb2NrKTsJCisKKwkvKiBDaGVjayBpZiB3ZSBzaG91bGQgdXNlIHRoZSBTSVIgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlpZiAoc2VsZi0+aW8uc3BlZWQgPD0gIFNNU0NfSVJDQzJfTUFYX1NJUl9TUEVFRCkgeworCQlyZXQgPSBzbXNjX2lyY2NfaW50ZXJydXB0X3NpcihkZXYpOworCQlnb3RvIGlycV9yZXRfdW5sb2NrOworCX0KKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOworCWlpciA9IGluYihpb2Jhc2UrSVJDQ19JSVIpOworCWlmIChpaXIgPT0gMCkgCisJCWdvdG8gaXJxX3JldF91bmxvY2s7CisJcmV0ID0gSVJRX0hBTkRMRUQ7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlvdXRiKDAsIGlvYmFzZStJUkNDX0lFUik7CisJbGNyYSA9IGluYihpb2Jhc2UrSVJDQ19MQ1JfQSk7CisJbHNyID0gaW5iKGlvYmFzZStJUkNDX0xTUik7CisJCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgaWlyID0gMHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18sIGlpcik7CisKKwlpZiAoaWlyICYgSVJDQ19JSVJfRU9NKSB7CisJCWlmIChzZWxmLT5pby5kaXJlY3Rpb24gPT0gSU9fUkVDVikKKwkJCXNtc2NfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzZWxmLCBpb2Jhc2UpOworCQllbHNlCisJCQlzbXNjX2lyY2NfZG1hX3htaXRfY29tcGxldGUoc2VsZiwgaW9iYXNlKTsKKwkJCisJCXNtc2NfaXJjY19kbWFfcmVjZWl2ZShzZWxmLCBpb2Jhc2UpOworCX0KKworCWlmIChpaXIgJiBJUkNDX0lJUl9BQ1RJVkVfRlJBTUUpIHsKKwkJLypwcmludGsoS0VSTl9XQVJOSU5HICIlcygpOiBBY3RpdmUgRnJhbWVcbiIsIF9fRlVOQ1RJT05fXyk7Ki8KKwl9CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhZ2FpbiAqLworCisJcmVnaXN0ZXJfYmFuayhpb2Jhc2UsIDApOworCW91dGIoSVJDQ19JRVJfQUNUSVZFX0ZSQU1FfElSQ0NfSUVSX0VPTSwgaW9iYXNlK0lSQ0NfSUVSKTsKKworIGlycV9yZXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrKCZzZWxmLT5sb2NrKTsKKyBpcnFfcmV0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcnBvcnRfaW50ZXJydXB0X3NpciAoaXJxLCBkZXZfaWQsIHJlZ3MpCisgKgorICogICAgSW50ZXJydXB0IGhhbmRsZXIgZm9yIFNJUiBtb2RlcworICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgc21zY19pcmNjX2ludGVycnVwdF9zaXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmID0gZGV2LT5wcml2OworCWludCBib2d1c2NvdW50ID0gMDsKKwlpbnQgaW9iYXNlOworCWludCBpaXIsIGxzcjsKKworCS8qIEFscmVhZHkgbG9ja2VkIGNvbW1pbmcgaGVyZSBpbiBzbXNjX2lyY2NfaW50ZXJydXB0KCkgKi8KKwkvKnNwaW5fbG9jaygmc2VsZi0+bG9jayk7Ki8KKworCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCisJaWlyID0gaW5iKGlvYmFzZStVQVJUX0lJUikgJiBVQVJUX0lJUl9JRDsKKwlpZiAoaWlyID09IDApCisJCXJldHVybiBJUlFfTk9ORTsKKwl3aGlsZSAoaWlyKSB7CisJCS8qIENsZWFyIGludGVycnVwdCAqLworCQlsc3IgPSBpbmIoaW9iYXNlK1VBUlRfTFNSKTsKKworCQlJUkRBX0RFQlVHKDQsICIlcygpLCBpaXI9JTAyeCwgbHNyPSUwMngsIGlvYmFzZT0lI3hcbiIsIAorCQkJICAgIF9fRlVOQ1RJT05fXywgaWlyLCBsc3IsIGlvYmFzZSk7CisKKwkJc3dpdGNoIChpaXIpIHsKKwkJY2FzZSBVQVJUX0lJUl9STFNJOgorCQkJSVJEQV9ERUJVRygyLCAiJXMoKSwgUkxTSVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWJyZWFrOworCQljYXNlIFVBUlRfSUlSX1JESToKKwkJCS8qIFJlY2VpdmUgaW50ZXJydXB0ICovCisJCQlzbXNjX2lyY2Nfc2lyX3JlY2VpdmUoc2VsZik7CisJCQlicmVhazsKKwkJY2FzZSBVQVJUX0lJUl9USFJJOgorCQkJaWYgKGxzciAmIFVBUlRfTFNSX1RIUkUpCisJCQkJLyogVHJhbnNtaXR0ZXIgcmVhZHkgZm9yIGRhdGEgKi8KKwkJCQlzbXNjX2lyY2Nfc2lyX3dyaXRlX3dha2V1cChzZWxmKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5oYW5kbGVkIElJUj0lI3hcbiIsCisJCQkJICAgX19GVU5DVElPTl9fLCBpaXIpOworCQkJYnJlYWs7CisJCX0gCisJCQorCQkvKiBNYWtlIHN1cmUgd2UgZG9uJ3Qgc3RheSBoZXJlIHRvIGxvbmcgKi8KKwkJaWYgKGJvZ3VzY291bnQrKyA+IDEwMCkKKwkJCWJyZWFrOworCisgCSAgICAgICAgaWlyID0gaW5iKGlvYmFzZSArIFVBUlRfSUlSKSAmIFVBUlRfSUlSX0lEOworCX0KKwkvKnNwaW5fdW5sb2NrKCZzZWxmLT5sb2NrKTsqLworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisjaWYgMCAvKiB1bnVzZWQgKi8KKy8qCisgKiBGdW5jdGlvbiBpcmNjX2lzX3JlY2VpdmluZyAoc2VsZikKKyAqCisgKiAgICBSZXR1cm4gVFJVRSBpcyB3ZSBhcmUgY3VycmVudGx5IHJlY2VpdmluZyBhIGZyYW1lCisgKgorICovCitzdGF0aWMgaW50IGlyY2NfaXNfcmVjZWl2aW5nKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpCit7CisJaW50IHN0YXR1cyA9IEZBTFNFOworCS8qIGludCBpb2Jhc2U7ICovCisKKwlJUkRBX0RFQlVHKDEsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIEZBTFNFOyk7CisKKwlJUkRBX0RFQlVHKDAsICIlczogZG1hIGNvdW50ID0gJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJICAgZ2V0X2RtYV9yZXNpZHVlKHNlbGYtPmlvLmRtYSkpOworCisJc3RhdHVzID0gKHNlbGYtPnJ4X2J1ZmYuc3RhdGUgIT0gT1VUU0lERV9GUkFNRSk7CisJCisJcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiB1bnVzZWQgKi8KKworCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX25ldF9vcGVuIChkZXYpCisgKgorICogICAgU3RhcnQgdGhlIGRldmljZQorICoKKyAqLworc3RhdGljIGludCBzbXNjX2lyY2NfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmOworCWludCBpb2Jhc2U7CisJY2hhciBod25hbWVbMTZdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlJUkRBX0RFQlVHKDEsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwkKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJc2VsZiA9IChzdHJ1Y3Qgc21zY19pcmNjX2NiICopIGRldi0+cHJpdjsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CisJCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwlpZiAocmVxdWVzdF9pcnEoc2VsZi0+aW8uaXJxLCBzbXNjX2lyY2NfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIAorCQkJKHZvaWQgKikgZGV2KSkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCB1bmFibGUgdG8gYWxsb2NhdGUgaXJxPSVkXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBzZWxmLT5pby5pcnEpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCS8qc21zY19pcmNjX3Npcl9zdGFydChzZWxmKTsqLworCXNlbGYtPmlvLnNwZWVkID0gMDsKKwlzbXNjX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIFNNU0NfSVJDQzJfQ19JUkRBX0ZBTExCQUNLX1NQRUVEKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJCisJLyogR2l2ZSBzZWxmIGEgaGFyZHdhcmUgbmFtZSAqLworCS8qIEl0IHdvdWxkIGJlIGNvb2wgdG8gb2ZmZXIgdGhlIGNoaXAgcmV2aXNpb24gaGVyZSAtIEplYW4gSUkgKi8KKwlzcHJpbnRmKGh3bmFtZSwgIlNNU0MgQCAweCUwM3giLCBzZWxmLT5pby5maXJfYmFzZSk7CisKKwkvKiAKKwkgKiBPcGVuIG5ldyBJckxBUCBsYXllciBpbnN0YW5jZSwgbm93IHRoYXQgZXZlcnl0aGluZyBzaG91bGQgYmUKKwkgKiBpbml0aWFsaXplZCBwcm9wZXJseSAKKwkgKi8KKwlzZWxmLT5pcmxhcCA9IGlybGFwX29wZW4oZGV2LCAmc2VsZi0+cW9zLCBod25hbWUpOworCisJLyoKKwkgKiBBbHdheXMgYWxsb2NhdGUgdGhlIERNQSBjaGFubmVsIGFmdGVyIHRoZSBJUlEsCisJICogYW5kIGNsZWFuIHVwIG9uIGZhaWx1cmUuCisJICovCisJaWYgKHJlcXVlc3RfZG1hKHNlbGYtPmlvLmRtYSwgZGV2LT5uYW1lKSkgeworCQlzbXNjX2lyY2NfbmV0X2Nsb3NlKGRldik7CisKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCB1bmFibGUgdG8gYWxsb2NhdGUgRE1BPSVkXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18sIHNlbGYtPmlvLmRtYSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwkKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2NfbmV0X2Nsb3NlIChkZXYpCisgKgorICogICAgU3RvcCB0aGUgZGV2aWNlCisgKgorICovCitzdGF0aWMgaW50IHNtc2NfaXJjY19uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmOworCWludCBpb2Jhc2U7CisKKwlJUkRBX0RFQlVHKDEsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwkKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJc2VsZiA9IChzdHJ1Y3Qgc21zY19pcmNjX2NiICopIGRldi0+cHJpdjsJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gMDspOworCQorCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJLyogU3RvcCBkZXZpY2UgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJLyogU3RvcCBhbmQgcmVtb3ZlIGluc3RhbmNlIG9mIElyTEFQICovCisJaWYgKHNlbGYtPmlybGFwKQorCQlpcmxhcF9jbG9zZShzZWxmLT5pcmxhcCk7CisJc2VsZi0+aXJsYXAgPSBOVUxMOworCisJZnJlZV9pcnEoc2VsZi0+aW8uaXJxLCBkZXYpOworCisJZGlzYWJsZV9kbWEoc2VsZi0+aW8uZG1hKTsKKworCWZyZWVfZG1hKHNlbGYtPmlvLmRtYSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc3VzcGVuZChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKQoreworCUlSREFfTUVTU0FHRSgiJXMsIFN1c3BlbmRpbmdcbiIsIGRyaXZlcl9uYW1lKTsKKworCWlmIChzZWxmLT5pby5zdXNwZW5kZWQpCisJCXJldHVybjsKKworCXNtc2NfaXJjY19uZXRfY2xvc2Uoc2VsZi0+bmV0ZGV2KTsKKworCXNlbGYtPmlvLnN1c3BlbmRlZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY193YWtldXAoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikKK3sKKwlpZiAoIXNlbGYtPmlvLnN1c3BlbmRlZCkKKwkJcmV0dXJuOworCisJLyogVGhlIGNvZGUgd2FzIGRvaW5nIGEgImNsaSgpIiBoZXJlLCBidXQgdGhpcyBjYW4ndCBiZSByaWdodC4KKwkgKiBJZiB5b3UgbmVlZCBwcm90ZWN0aW9uLCBkbyBpdCBpbiBuZXRfb3BlbiB3aXRoIGEgc3BpbmxvY2sKKwkgKiBvciBnaXZlIGEgZ29vZCByZWFzb24uIC0gSmVhbiBJSSAqLworCisJc21zY19pcmNjX25ldF9vcGVuKHNlbGYtPm5ldGRldik7CisJCisJSVJEQV9NRVNTQUdFKCIlcywgV2FraW5nIHVwXG4iLCBkcml2ZXJfbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgc21zY19pcmNjX3BtcHJvYyhzdHJ1Y3QgcG1fZGV2ICpkZXYsIHBtX3JlcXVlc3RfdCBycXN0LCB2b2lkICpkYXRhKQoreworICAgICAgICBzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmID0gKHN0cnVjdCBzbXNjX2lyY2NfY2IqKSBkZXYtPmRhdGE7CisgICAgICAgIGlmIChzZWxmKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChycXN0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBQTV9TVVNQRU5EOgorICAgICAgICAgICAgICAgICAgICAgICAgc21zY19pcmNjX3N1c3BlbmQoc2VsZik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBNX1JFU1VNRToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtc2NfaXJjY193YWtldXAoc2VsZik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19jbG9zZSAoc2VsZikKKyAqCisgKiAgICBDbG9zZSBkcml2ZXIgaW5zdGFuY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgX19leGl0IHNtc2NfaXJjY19jbG9zZShzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKQoreworCWludCBpb2Jhc2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJaWYgKHNlbGYtPnBtZGV2KQorCQlwbV91bnJlZ2lzdGVyKHNlbGYtPnBtZGV2KTsKKworCS8qIFJlbW92ZSBuZXRkZXZpY2UgKi8KKwl1bnJlZ2lzdGVyX25ldGRldihzZWxmLT5uZXRkZXYpOworCisJLyogTWFrZSBzdXJlIHRoZSBpcnEgaGFuZGxlciBpcyBub3QgZXhlY3R1dGluZyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisKKwkvKiBTdG9wIGludGVycnVwdHMgKi8KKwlyZWdpc3Rlcl9iYW5rKGlvYmFzZSwgMCk7CisJb3V0YigwLCBpb2Jhc2UrSVJDQ19JRVIpOworCW91dGIoSVJDQ19NQVNURVJfUkVTRVQsIGlvYmFzZStJUkNDX01BU1RFUik7CisJb3V0YigweDAwLCBpb2Jhc2UrSVJDQ19NQVNURVIpOworI2lmIDAKKwkvKiBSZXNldCB0byBTSVIgbW9kZSAqLworCXJlZ2lzdGVyX2JhbmsoaW9iYXNlLCAxKTsKKyAgICAgICAgb3V0YihJUkNDX0NGR0FfSVJEQV9TSVJfQXxJUkNDX0NGR0FfVFhfUE9MQVJJVFksIGlvYmFzZStJUkNDX1NDRV9DRkdBKTsKKyAgICAgICAgb3V0YihJUkNDX0NGR0JfSVIsIGlvYmFzZStJUkNDX1NDRV9DRkdCKTsKKyNlbmRpZgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCS8qIFJlbGVhc2UgdGhlIFBPUlRTIHRoYXQgdGhpcyBkcml2ZXIgaXMgdXNpbmcgKi8KKwlJUkRBX0RFQlVHKDAsICIlcygpLCByZWxlYXNpbmcgMHglMDN4XG4iLCAgX19GVU5DVElPTl9fLAorCQkgICBzZWxmLT5pby5maXJfYmFzZSk7CisKKwlyZWxlYXNlX3JlZ2lvbihzZWxmLT5pby5maXJfYmFzZSwgc2VsZi0+aW8uZmlyX2V4dCk7CisKKwlJUkRBX0RFQlVHKDAsICIlcygpLCByZWxlYXNpbmcgMHglMDN4XG4iLCBfX0ZVTkNUSU9OX18sIAorCQkgICBzZWxmLT5pby5zaXJfYmFzZSk7CisKKwlyZWxlYXNlX3JlZ2lvbihzZWxmLT5pby5zaXJfYmFzZSwgc2VsZi0+aW8uc2lyX2V4dCk7CisKKwlpZiAoc2VsZi0+dHhfYnVmZi5oZWFkKQorCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT50eF9idWZmLnRydWVzaXplLAorCQkJCSAgc2VsZi0+dHhfYnVmZi5oZWFkLCBzZWxmLT50eF9idWZmX2RtYSk7CisJCisJaWYgKHNlbGYtPnJ4X2J1ZmYuaGVhZCkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSwKKwkJCQkgIHNlbGYtPnJ4X2J1ZmYuaGVhZCwgc2VsZi0+cnhfYnVmZl9kbWEpOworCisJZnJlZV9uZXRkZXYoc2VsZi0+bmV0ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc21zY19pcmNjX2NsZWFudXAodm9pZCkKK3sKKwlpbnQgaTsKKworCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJZm9yIChpPTA7IGkgPCAyOyBpKyspIHsKKwkJaWYgKGRldl9zZWxmW2ldKQorCQkJc21zY19pcmNjX2Nsb3NlKGRldl9zZWxmW2ldKTsKKwl9Cit9CisKKy8qCisgKglTdGFydCBTSVIgb3BlcmF0aW9ucworICoKKyAqIFRoaXMgZnVuY3Rpb24gKm11c3QqIGJlIGNhbGxlZCB3aXRoIHNwaW5sb2NrIGhlbGQsIGJlY2F1c2UgaXQgbWF5CisgKiBiZSBjYWxsZWQgZnJvbSB0aGUgaXJxIGhhbmRsZXIgKHZpYSBzbXNjX2lyY2NfY2hhbmdlX3NwZWVkKCkpLiAtIEplYW4gSUkKKyAqLwordm9pZCBzbXNjX2lyY2Nfc2lyX3N0YXJ0KHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgZmlyX2Jhc2UsIHNpcl9iYXNlOworCisJSVJEQV9ERUJVRygzLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwkKKwlkZXY9IHNlbGYtPm5ldGRldjsKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuOyk7CQkKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZzbXNjX2lyY2NfaGFyZF94bWl0X3NpcjsKKworCWZpcl9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisJc2lyX2Jhc2UgPSBzZWxmLT5pby5zaXJfYmFzZTsKKworCS8qIFJlc2V0IGV2ZXJ5dGhpbmcgKi8KKwlvdXRiKElSQ0NfTUFTVEVSX1JFU0VULCBmaXJfYmFzZStJUkNDX01BU1RFUik7CisKKwkjaWYgU01TQ19JUkNDMl9DX1NJUl9TVE9QCisJLypzbXNjX2lyY2Nfc2lyX3N0b3Aoc2VsZik7Ki8KKwkjZW5kaWYKKworCXJlZ2lzdGVyX2JhbmsoZmlyX2Jhc2UsIDEpOworCW91dGIoKChpbmIoZmlyX2Jhc2UrSVJDQ19TQ0VfQ0ZHQSkgJiBJUkNDX1NDRV9DRkdBX0JMT0NLX0NUUkxfQklUU19NQVNLKSB8IElSQ0NfQ0ZHQV9JUkRBX1NJUl9BKSwgZmlyX2Jhc2UrSVJDQ19TQ0VfQ0ZHQSk7CisKKwkvKiBJbml0aWFsaXplIFVBUlQgKi8KKwlvdXRiKFVBUlRfTENSX1dMRU44LCBzaXJfYmFzZStVQVJUX0xDUik7ICAvKiBSZXNldCBETEFCICovCisJb3V0YigoVUFSVF9NQ1JfRFRSIHwgVUFSVF9NQ1JfUlRTIHwgVUFSVF9NQ1JfT1VUMiksIHNpcl9iYXNlK1VBUlRfTUNSKTsKKwkKKwkvKiBUdXJuIG9uIGludGVycnVwcyAqLworCW91dGIoVUFSVF9JRVJfUkxTSSB8IFVBUlRfSUVSX1JESSB8VUFSVF9JRVJfVEhSSSwgc2lyX2Jhc2UrVUFSVF9JRVIpOworCisJSVJEQV9ERUJVRygzLCAiJXMoKSAtIGV4aXRcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlvdXRiKDB4MDAsIGZpcl9iYXNlK0lSQ0NfTUFTVEVSKTsKK30KKworI2lmIFNNU0NfSVJDQzJfQ19TSVJfU1RPUAordm9pZCBzbXNjX2lyY2Nfc2lyX3N0b3Aoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCisJSVJEQV9ERUJVRygzLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJaW9iYXNlID0gc2VsZi0+aW8uc2lyX2Jhc2U7CisKKwkvKiBSZXNldCBVQVJUICovCisJb3V0YigwLCBpb2Jhc2UrVUFSVF9NQ1IpOworCQorCS8qIFR1cm4gb2ZmIGludGVycnVwdHMgKi8KKwlvdXRiKDAsIGlvYmFzZStVQVJUX0lFUik7Cit9CisjZW5kaWYKKworLyoKKyAqIEZ1bmN0aW9uIHNtc2Nfc2lyX3dyaXRlX3dha2V1cCAoc2VsZikKKyAqCisgKiAgICBDYWxsZWQgYnkgdGhlIFNJUiBpbnRlcnJ1cHQgaGFuZGxlciB3aGVuIHRoZXJlJ3Mgcm9vbSBmb3IgbW9yZSBkYXRhLgorICogICAgSWYgd2UgaGF2ZSBtb3JlIHBhY2tldHMgdG8gc2VuZCwgd2Ugc2VuZCB0aGVtIGhlcmUuCisgKgorICovCitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2lyX3dyaXRlX3dha2V1cChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKQoreworCWludCBhY3R1YWwgPSAwOworCWludCBpb2Jhc2U7CisJaW50IGZjcjsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlJUkRBX0RFQlVHKDQsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCisJLyogRmluaXNoZWQgd2l0aCBmcmFtZT8gICovCisJaWYgKHNlbGYtPnR4X2J1ZmYubGVuID4gMCkgIHsKKwkJLyogV3JpdGUgZGF0YSBsZWZ0IGluIHRyYW5zbWl0IGJ1ZmZlciAqLworCQlhY3R1YWwgPSBzbXNjX2lyY2Nfc2lyX3dyaXRlKGlvYmFzZSwgc2VsZi0+aW8uZmlmb19zaXplLCAKKwkJCQkgICAgICBzZWxmLT50eF9idWZmLmRhdGEsIHNlbGYtPnR4X2J1ZmYubGVuKTsKKwkJc2VsZi0+dHhfYnVmZi5kYXRhICs9IGFjdHVhbDsKKwkJc2VsZi0+dHhfYnVmZi5sZW4gIC09IGFjdHVhbDsKKwl9IGVsc2UgeworCQorCS8qaWYgKHNlbGYtPnR4X2J1ZmYubGVuID09MCkgIHsqLworCQkKKwkJLyogCisJCSAqICBOb3cgc2VyaWFsIGJ1ZmZlciBpcyBhbG1vc3QgZnJlZSAmIHdlIGNhbiBzdGFydCAKKwkJICogIHRyYW5zbWlzc2lvbiBvZiBhbm90aGVyIHBhY2tldC4gQnV0IGZpcnN0IHdlIG11c3QgY2hlY2sKKwkJICogIGlmIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBzcGVlZCBvZiB0aGUgaGFyZHdhcmUKKwkJICovCisJCWlmIChzZWxmLT5uZXdfc3BlZWQpIHsKKwkJCUlSREFfREVCVUcoNSwgIiVzKCksIENoYW5naW5nIHNwZWVkIHRvICVkLlxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18sIHNlbGYtPm5ld19zcGVlZCk7CisJCQlzbXNjX2lyY2Nfc2lyX3dhaXRfaHdfdHJhbnNtaXR0ZXJfZmluaXNoKHNlbGYpOworCQkJc21zY19pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBzZWxmLT5uZXdfc3BlZWQpOworCQkJc2VsZi0+bmV3X3NwZWVkID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIFRlbGwgbmV0d29yayBsYXllciB0aGF0IHdlIHdhbnQgbW9yZSBmcmFtZXMgKi8KKwkJCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKwkJfQorCQlzZWxmLT5zdGF0cy50eF9wYWNrZXRzKys7CisKKwkJaWYoc2VsZi0+aW8uc3BlZWQgPD0gMTE1MjAwKSB7CisJCS8qIAorCQkgKiBSZXNldCBSeCBGSUZPIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbCByZWZsZWN0ZWQgdHJhbnNtaXQgZGF0YQorCQkgKiBpcyBkaXNjYXJkZWQuIFRoaXMgaXMgbmVlZGVkIGZvciBoYWxmIGR1cGxleCBvcGVyYXRpb24KKwkJICovCisJCWZjciA9IFVBUlRfRkNSX0VOQUJMRV9GSUZPIHwgVUFSVF9GQ1JfQ0xFQVJfUkNWUjsKKwkJaWYgKHNlbGYtPmlvLnNwZWVkIDwgMzg0MDApCisJCQlmY3IgfD0gVUFSVF9GQ1JfVFJJR0dFUl8xOworCQllbHNlIAorCQkJZmNyIHw9IFVBUlRfRkNSX1RSSUdHRVJfMTQ7CisKKwkJb3V0YihmY3IsIGlvYmFzZStVQVJUX0ZDUik7CisKKwkJLyogVHVybiBvbiByZWNlaXZlIGludGVycnVwdHMgKi8KKwkJb3V0YihVQVJUX0lFUl9SREksIGlvYmFzZStVQVJUX0lFUik7CisJCX0KKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2Nfc2lyX3dyaXRlIChpb2Jhc2UsIGZpZm9fc2l6ZSwgYnVmLCBsZW4pCisgKgorICogICAgRmlsbCBUeCBGSUZPIHdpdGggdHJhbnNtaXQgZGF0YQorICoKKyAqLworc3RhdGljIGludCBzbXNjX2lyY2Nfc2lyX3dyaXRlKGludCBpb2Jhc2UsIGludCBmaWZvX3NpemUsIF9fdTggKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgYWN0dWFsID0gMDsKKwkKKwkvKiBUeCBGSUZPIHNob3VsZCBiZSBlbXB0eSEgKi8KKwlpZiAoIShpbmIoaW9iYXNlK1VBUlRfTFNSKSAmIFVBUlRfTFNSX1RIUkUpKSB7CisJCUlSREFfV0FSTklORygiJXMoKSwgZmFpbGVkLCBmaWZvIG5vdCBlbXB0eSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAwOworCX0KKyAgICAgICAgCisJLyogRmlsbCBGSUZPIHdpdGggY3VycmVudCBmcmFtZSAqLworCXdoaWxlICgoZmlmb19zaXplLS0gPiAwKSAmJiAoYWN0dWFsIDwgbGVuKSkgeworCQkvKiBUcmFuc21pdCBuZXh0IGJ5dGUgKi8KKwkJb3V0YihidWZbYWN0dWFsXSwgaW9iYXNlK1VBUlRfVFgpOworCQlhY3R1YWwrKzsKKwl9CisJcmV0dXJuIGFjdHVhbDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19pc19yZWNlaXZpbmcgKHNlbGYpCisgKgorICogICAgUmV0dXJucyB0cnVlIGlzIHdlIGFyZSBjdXJyZW50bHkgcmVjZWl2aW5nIGRhdGEKKyAqCisgKi8KK3N0YXRpYyBpbnQgc21zY19pcmNjX2lzX3JlY2VpdmluZyhzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKQoreworCXJldHVybiAoc2VsZi0+cnhfYnVmZi5zdGF0ZSAhPSBPVVRTSURFX0ZSQU1FKTsKK30KKworCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyKHNlbGYpCisgKgorICogICAgVHJpZXMgdG8gZmluZCB0aGUgdXNlZCBUcmFuc2NlaXZlcgorICoKKyAqLworc3RhdGljIHZvaWQgc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyKHN0cnVjdCBzbXNjX2lyY2NfY2IgKnNlbGYpCit7CisJdW5zaWduZWQgaW50CWk7CisJCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwkKKwlmb3IoaT0wOyBzbXNjX3RyYW5zY2VpdmVyc1tpXS5uYW1lIT1OVUxMOyBpKyspIAorCQlpZigoKnNtc2NfdHJhbnNjZWl2ZXJzW2ldLnByb2JlKShzZWxmLT5pby5maXJfYmFzZSkpIHsKKwkJCUlSREFfTUVTU0FHRSgiICVzIHRyYW5zY2VpdmVyIGZvdW5kXG4iLAorCQkJCSAgICAgc21zY190cmFuc2NlaXZlcnNbaV0ubmFtZSk7CisJCQlzZWxmLT50cmFuc2NlaXZlcj0gaSsxOworCQkJcmV0dXJuOworCQl9CisJSVJEQV9NRVNTQUdFKCJObyB0cmFuc2NlaXZlciBmb3VuZC4gRGVmYXVsdGluZyB0byAlc1xuIiwKKwkJICAgICBzbXNjX3RyYW5zY2VpdmVyc1tTTVNDX0lSQ0MyX0NfREVGQVVMVF9UUkFOU0NFSVZFUl0ubmFtZSk7CisJCQkKKwlzZWxmLT50cmFuc2NlaXZlcj0gU01TQ19JUkNDMl9DX0RFRkFVTFRfVFJBTlNDRUlWRVI7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfZm9yX3NwZWVkKHNlbGYsIHNwZWVkKQorICoKKyAqICAgIFNldCB0aGUgdHJhbnNjZWl2ZXIgYWNjb3JkaW5nIHRvIHRoZSBzcGVlZAorICoKKyAqLworc3RhdGljIHZvaWQgc21zY19pcmNjX3NldF90cmFuc2NlaXZlcl9mb3Jfc3BlZWQoc3RydWN0IHNtc2NfaXJjY19jYiAqc2VsZiwgdTMyIHNwZWVkKQoreworCXVuc2lnbmVkIGludCB0cng7CisJCisJdHJ4ID0gc2VsZi0+dHJhbnNjZWl2ZXI7CisJaWYodHJ4PjApICgqc21zY190cmFuc2NlaXZlcnNbdHJ4LTFdLnNldF9mb3Jfc3BlZWQpKHNlbGYtPmlvLmZpcl9iYXNlLCBzcGVlZCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2Nfd2FpdF9od190cmFuc21pdHRlcl9maW5pc2ggKCkKKyAqCisgKiAgICBXYWl0IGZvciB0aGUgcmVhbCBlbmQgb2YgSFcgdHJhbnNtaXNzaW9uCisgKgorICogVGhlIFVBUlQgaXMgYSBzdHJpY3QgRklGTywgYW5kIHdlIGdldCBjYWxsZWQgb25seSB3aGVuIHdlIGhhdmUgZmluaXNoZWQKKyAqIHB1c2hpbmcgZGF0YSB0byB0aGUgRklGTywgc28gdGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgd2UgbXVzdCB3YWl0CisgKiBpcyBvbmx5IGZvciB0aGUgRklGTyB0byBkcmFpbiBvdXQuCisgKgorICogV2UgdXNlIGEgc2ltcGxlIGNhbGlicmF0ZWQgbG9vcC4gV2UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZSBsb29wCisgKiBkZWxheSAodWRlbGF5KSB0byBiYWxhbmNlIEkvTyB0cmFmZmljIGFuZCBsYXRlbmN5LiBBbmQgd2UgYWxzbyBuZWVkIHRvCisgKiBhZGp1c3QgdGhlIG1heGltdW0gdGltZW91dC4KKyAqIEl0IHdvdWxkIHByb2JhYmx5IGJlIGJldHRlciB0byB3YWl0IGZvciB0aGUgcHJvcGVyIGludGVycnVwdCwKKyAqIGJ1dCBpdCBkb2Vzbid0IHNlZW0gdG8gYmUgYXZhaWxhYmxlLgorICoKKyAqIFdlIGNhbid0IHVzZSBqaWZmaWVzIG9yIGtlcm5lbCB0aW1lcnMgYmVjYXVzZSA6CisgKiAxKSBXZSBhcmUgY2FsbGVkIGZyb20gdGhlIGludGVycnVwdCBoYW5kbGVyLCB3aGljaCBkaXNhYmxlIHNvZnRpcnFzLAorICogc28gamlmZmllcyB3b24ndCBiZSBpbmNyZWFzZWQKKyAqIDIpIEppZmZpZXMgZ3JhbnVsYXJpdHkgaXMgdXN1YWxseSB2ZXJ5IGNvYXJzZSAoMTBtcyksIGFuZCB3ZSBkb24ndAorICogd2FudCB0byB3YWl0IHRoYXQgbG9uZyB0byBkZXRlY3Qgc3R1Y2sgaGFyZHdhcmUuCisgKiBKZWFuIElJCisgKi8KKworc3RhdGljIHZvaWQgc21zY19pcmNjX3Npcl93YWl0X2h3X3RyYW5zbWl0dGVyX2ZpbmlzaChzdHJ1Y3Qgc21zY19pcmNjX2NiICpzZWxmKQoreworCWludCBpb2Jhc2U7CisJaW50IGNvdW50ID0gU01TQ19JUkNDMl9IV19UUkFOU01JVFRFUl9USU1FT1VUX1VTOworCQorCWlvYmFzZSA9IHNlbGYtPmlvLnNpcl9iYXNlOworCQorCS8qIENhbGlicmF0ZWQgYnVzeSBsb29wICovCisJd2hpbGUoKGNvdW50LS0gPiAwKSAmJiAhKGluYihpb2Jhc2UrVUFSVF9MU1IpICYgVUFSVF9MU1JfVEVNVCkpCisJCXVkZWxheSgxKTsKKworCWlmKGNvdW50ID09IDApCisJCUlSREFfREVCVUcoMCwgIiVzKCk6IHN0dWNrIHRyYW5zbWl0dGVyXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisKKy8qIFBST0JJTkcKKyAqCisgKgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IHNtc2NfaXJjY19sb29rX2Zvcl9jaGlwcyh2b2lkKQoreworCXNtc2NfY2hpcF9hZGRyZXNzX3QgKmFkZHJlc3M7CisJY2hhcgkqdHlwZTsKKwl1bnNpZ25lZCBpbnQgY2ZnX2Jhc2UsIGZvdW5kOworCQorCWZvdW5kID0gMDsKKwlhZGRyZXNzID0gcG9zc2libGVfYWRkcmVzc2VzOworCQorCXdoaWxlKGFkZHJlc3MtPmNmZ19iYXNlKXsKKwkJY2ZnX2Jhc2UgPSBhZGRyZXNzLT5jZmdfYmFzZTsKKwkJCisJCS8qcHJpbnRrKEtFUk5fV0FSTklORyAiJXMoKTogcHJvYmluZzogMHglMDJ4IGZvcjogMHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18sIGNmZ19iYXNlLCBhZGRyZXNzLT50eXBlKTsqLworCQkKKwkJaWYoIGFkZHJlc3MtPnR5cGUgJiBTTVNDU0lPX1RZUEVfRkRDKXsKKwkJCXR5cGUgPSAiRkRDIjsKKwkJCWlmKChhZGRyZXNzLT50eXBlKSAmIFNNU0NTSU9fVFlQRV9GTEFUKSB7CisJCQkJaWYoIXNtc2Nfc3VwZXJpb19mbGF0KGZkY19jaGlwc19mbGF0LGNmZ19iYXNlLCB0eXBlKSkgZm91bmQrKzsKKwkJCX0KKwkJCWlmKChhZGRyZXNzLT50eXBlKSAmIFNNU0NTSU9fVFlQRV9QQUdFRCkgeworCQkJCWlmKCFzbXNjX3N1cGVyaW9fcGFnZWQoZmRjX2NoaXBzX3BhZ2VkLGNmZ19iYXNlLCB0eXBlKSkgZm91bmQrKzsJCQorCQkJfQkJCQorCQl9CisJCWlmKCBhZGRyZXNzLT50eXBlICYgU01TQ1NJT19UWVBFX0xQQyl7CisJCQl0eXBlID0gIkxQQyI7CisJCQlpZigoYWRkcmVzcy0+dHlwZSkgJiBTTVNDU0lPX1RZUEVfRkxBVCkgeworCQkJCWlmKCFzbXNjX3N1cGVyaW9fZmxhdChscGNfY2hpcHNfZmxhdCxjZmdfYmFzZSx0eXBlKSkgZm91bmQrKzsKKwkJCX0KKwkJCWlmKChhZGRyZXNzLT50eXBlKSAmIFNNU0NTSU9fVFlQRV9QQUdFRCkgeworCQkJCWlmKCFzbXNjX3N1cGVyaW9fcGFnZWQobHBjX2NoaXBzX3BhZ2VkLGNmZ19iYXNlLCJMUEMiKSkgZm91bmQrKzsJCQorCQkJfQkJCQorCQl9CisJCWFkZHJlc3MrKzsKKwl9CisJcmV0dXJuIGZvdW5kOworfSAKKworLyoKKyAqIEZ1bmN0aW9uIHNtc2Nfc3VwZXJpb19mbGF0IChjaGlwLCBiYXNlLCB0eXBlKQorICoKKyAqICAgIFRyeSB0byBnZXQgY29uZmlndXJhdGlvbiBvZiBhIHNtYyBTdXBlcklPIGNoaXAgd2l0aCBmbGF0IHJlZ2lzdGVyIG1vZGVsCisgKgorICovCitzdGF0aWMgaW50IF9faW5pdCBzbXNjX3N1cGVyaW9fZmxhdChjb25zdCBzbXNjX2NoaXBfdCAqY2hpcHMsIHVuc2lnbmVkIHNob3J0IGNmZ2Jhc2UsIGNoYXIgKnR5cGUpCit7CisJdW5zaWduZWQgc2hvcnQgZmlyYmFzZSwgc2lyYmFzZTsKKwl1OCBtb2RlLCBkbWEsIGlycTsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKworCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaWYgKHNtc2NfaXJjY19wcm9iZShjZmdiYXNlLCBTTVNDU0lPRkxBVF9ERVZJQ0VJRF9SRUcsIGNoaXBzLCB0eXBlKT09TlVMTCkKKwkJcmV0dXJuIHJldDsKKworCW91dGIoU01TQ1NJT0ZMQVRfVUFSVE1PREUwQ19SRUcsIGNmZ2Jhc2UpOworCW1vZGUgPSBpbmIoY2ZnYmFzZSsxKTsKKwkKKwkvKnByaW50ayhLRVJOX1dBUk5JTkcgIiVzKCk6IG1vZGU6IDB4JTAyeFxuIiwgX19GVU5DVElPTl9fLCBtb2RlKTsqLworCQorCWlmKCEobW9kZSAmIFNNU0NTSU9GTEFUX1VBUlQyTU9ERV9WQUxfSVJEQSkpCisJCUlSREFfV0FSTklORygiJXMoKTogSXJEQSBub3QgZW5hYmxlZFxuIiwgX19GVU5DVElPTl9fKTsKKworCW91dGIoU01TQ1NJT0ZMQVRfVUFSVDJCQVNFQUREUl9SRUcsIGNmZ2Jhc2UpOworCXNpcmJhc2UgPSBpbmIoY2ZnYmFzZSsxKSA8PCAyOworCisgICAJLyogRklSIGlvYmFzZSAqLworCW91dGIoU01TQ1NJT0ZMQVRfRklSQkFTRUFERFJfUkVHLCBjZmdiYXNlKTsKKwlmaXJiYXNlID0gaW5iKGNmZ2Jhc2UrMSkgPDwgMzsKKworCS8qIERNQSAqLworCW91dGIoU01TQ1NJT0ZMQVRfRklSRE1BU0VMRUNUX1JFRywgY2ZnYmFzZSk7CisJZG1hID0gaW5iKGNmZ2Jhc2UrMSkgJiBTTVNDU0lPRkxBVF9GSVJETUFTRUxFQ1RfTUFTSzsKKwkKKwkvKiBJUlEgKi8KKwlvdXRiKFNNU0NTSU9GTEFUX1VBUlRJUlFTRUxFQ1RfUkVHLCBjZmdiYXNlKTsKKwlpcnEgPSBpbmIoY2ZnYmFzZSsxKSAmIFNNU0NTSU9GTEFUX1VBUlQySVJRU0VMRUNUX01BU0s7CisKKwlJUkRBX01FU1NBR0UoIiVzKCk6IGZpcjogMHglMDJ4LCBzaXI6IDB4JTAyeCwgZG1hOiAlMDJkLCBpcnE6ICVkLCBtb2RlOiAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgZmlyYmFzZSwgc2lyYmFzZSwgZG1hLCBpcnEsIG1vZGUpOworCisJaWYgKGZpcmJhc2UpIHsKKwkJaWYgKHNtc2NfaXJjY19vcGVuKGZpcmJhc2UsIHNpcmJhc2UsIGRtYSwgaXJxKSA9PSAwKQorCQkJcmV0PTA7IAorCX0KKwkKKwkvKiBFeGl0IGNvbmZpZ3VyYXRpb24gKi8KKwlvdXRiKFNNU0NTSU9fQ0ZHRVhJVEtFWSwgY2ZnYmFzZSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gc21zY19zdXBlcmlvX3BhZ2VkIChjaGlwLCBiYXNlLCB0eXBlKQorICoKKyAqICAgIFRyeSAgdG8gZ2V0IGNvbmZpZ3VyYXRpb24gb2YgYSBzbWMgU3VwZXJJTyBjaGlwIHdpdGggcGFnZWQgcmVnaXN0ZXIgbW9kZWwKKyAqCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNtc2Nfc3VwZXJpb19wYWdlZChjb25zdCBzbXNjX2NoaXBfdCAqY2hpcHMsIHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlLCBjaGFyICp0eXBlKQoreworCXVuc2lnbmVkIHNob3J0IGZpcl9pbywgc2lyX2lvOworCWludCByZXQgPSAtRU5PREVWOworCQorCUlSREFfREVCVUcoMSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaWYgKHNtc2NfaXJjY19wcm9iZShjZmdfYmFzZSwweDIwLGNoaXBzLHR5cGUpPT1OVUxMKQorCQlyZXR1cm4gcmV0OworCQorCS8qIFNlbGVjdCBsb2dpY2FsIGRldmljZSAoVUFSVDIpICovCisJb3V0YigweDA3LCBjZmdfYmFzZSk7CisJb3V0YigweDA1LCBjZmdfYmFzZSArIDEpOworCQkKKwkvKiBTSVIgaW9iYXNlICovCisJb3V0YigweDYwLCBjZmdfYmFzZSk7CisJc2lyX2lvICA9IGluYihjZmdfYmFzZSArIDEpIDw8IDg7CisJb3V0YigweDYxLCBjZmdfYmFzZSk7CisJc2lyX2lvIHw9IGluYihjZmdfYmFzZSArIDEpOworCQkKKwkvKiBSZWFkIEZJUiBiYXNlICovCisJb3V0YigweDYyLCBjZmdfYmFzZSk7CisJZmlyX2lvID0gaW5iKGNmZ19iYXNlICsgMSkgPDwgODsKKwlvdXRiKDB4NjMsIGNmZ19iYXNlKTsKKwlmaXJfaW8gfD0gaW5iKGNmZ19iYXNlICsgMSk7CisJb3V0YigweDJiLCBjZmdfYmFzZSk7IC8qID8/PyAqLworCisJaWYgKGZpcl9pbykgeworCQlpZiAoc21zY19pcmNjX29wZW4oZmlyX2lvLCBzaXJfaW8sIGlyY2NfZG1hLCBpcmNjX2lycSkgPT0gMCkKKwkJCXJldD0wOyAKKwl9CisJCisJLyogRXhpdCBjb25maWd1cmF0aW9uICovCisJb3V0YihTTVNDU0lPX0NGR0VYSVRLRVksIGNmZ19iYXNlKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgc21zY19hY2Nlc3ModW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UsdW5zaWduZWQgY2hhciByZWcpCit7CisJSVJEQV9ERUJVRygxLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlvdXRiKHJlZywgY2ZnX2Jhc2UpOworCisJaWYgKGluYihjZmdfYmFzZSkhPXJlZykKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzbXNjX2NoaXBfdCAqIF9faW5pdCBzbXNjX2lyY2NfcHJvYmUodW5zaWduZWQgc2hvcnQgY2ZnX2Jhc2UsdTggcmVnLGNvbnN0IHNtc2NfY2hpcF90ICpjaGlwLGNoYXIgKnR5cGUpCit7CisJdTggZGV2aWQseGRldmlkLHJldjsgCisKKwlJUkRBX0RFQlVHKDEsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIExlYXZlIGNvbmZpZ3VyYXRpb24gKi8KKworCW91dGIoU01TQ1NJT19DRkdFWElUS0VZLCBjZmdfYmFzZSk7CisKKwlpZiAoaW5iKGNmZ19iYXNlKSA9PSBTTVNDU0lPX0NGR0VYSVRLRVkpCS8qIG5vdCBhIHNtYyBzdXBlcmlvIGNoaXAgKi8KKwkJcmV0dXJuIE5VTEw7CisKKwlvdXRiKHJlZywgY2ZnX2Jhc2UpOworCisJeGRldmlkPWluYihjZmdfYmFzZSsxKTsKKworCS8qIEVudGVyIGNvbmZpZ3VyYXRpb24gKi8KKworCW91dGIoU01TQ1NJT19DRkdBQ0NFU1NLRVksIGNmZ19iYXNlKTsKKworCSNpZiAwCisJaWYgKHNtc2NfYWNjZXNzKGNmZ19iYXNlLDB4NTUpKQkvKiBzZW5kIHNlY29uZCBrZXkgYW5kIGNoZWNrICovCisJCXJldHVybiBOVUxMOworCSNlbmRpZgorCQorCS8qIHByb2JlIGRldmljZSBJRCAqLworCisJaWYgKHNtc2NfYWNjZXNzKGNmZ19iYXNlLHJlZykpCisJCXJldHVybiBOVUxMOworCisJZGV2aWQ9aW5iKGNmZ19iYXNlKzEpOworCQorCWlmIChkZXZpZD09MCkJCQkvKiB0eXBpY2FsIHZhbHVlIGZvciB1bnVzZWQgcG9ydCAqLworCQlyZXR1cm4gTlVMTDsKKworCWlmIChkZXZpZD09MHhmZikJCS8qIHR5cGljYWwgdmFsdWUgZm9yIHVudXNlZCBwb3J0ICovCisJCXJldHVybiBOVUxMOworCisJLyogcHJvYmUgcmV2aXNpb24gSUQgKi8KKworCWlmIChzbXNjX2FjY2VzcyhjZmdfYmFzZSxyZWcrMSkpCisJCXJldHVybiBOVUxMOworCisJcmV2PWluYihjZmdfYmFzZSsxKTsKKworCWlmIChyZXY+PTEyOCkJCQkvKiBpIHRoaW5rIHRoaXMgd2lsbCBtYWtlIG5vIHNlbnNlICovCisJCXJldHVybiBOVUxMOworCisJaWYgKGRldmlkPT14ZGV2aWQpCQkvKiBwcm90ZWN0aW9uIGFnYWluc3QgZmFsc2UgcG9zaXRpdmVzICovICAgICAgICAKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBDaGVjayBmb3IgZXhwZWN0ZWQgZGV2aWNlIElEOyBhcmUgdGhlcmUgb3RoZXJzPyAqLworCisJd2hpbGUoY2hpcC0+ZGV2aWQhPWRldmlkKSB7CisKKwkJY2hpcCsrOworCisJCWlmIChjaGlwLT5uYW1lPT1OVUxMKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJSVJEQV9NRVNTQUdFKCJmb3VuZCBTTUMgU3VwZXJJTyBDaGlwIChkZXZpZD0weCUwMnggcmV2PSUwMlggYmFzZT0weCUwNHgpOiAlcyVzXG4iLGRldmlkLHJldixjZmdfYmFzZSx0eXBlLGNoaXAtPm5hbWUpOworCisJaWYgKGNoaXAtPnJldj5yZXYpeworCQlJUkRBX01FU1NBR0UoIlJldmlzaW9uIGhpZ2hlciB0aGFuIGV4cGVjdGVkXG4iKTsJCisJCXJldHVybiBOVUxMOworCX0KKwkKKwlpZiAoY2hpcC0+ZmxhZ3MmTm9JUkRBKQorCQlJUkRBX01FU1NBR0UoImNoaXBzZXQgZG9lcyBub3Qgc3VwcG9ydCBJUkRBXG4iKTsKKworCXJldHVybiBjaGlwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzbXNjX3N1cGVyaW9fZmRjKHVuc2lnbmVkIHNob3J0IGNmZ19iYXNlKQoreworCWludCByZXQgPSAtMTsKKworCWlmICghcmVxdWVzdF9yZWdpb24oY2ZnX2Jhc2UsIDIsIGRyaXZlcl9uYW1lKSkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBjYW4ndCBnZXQgY2ZnX2Jhc2Ugb2YgMHglMDN4XG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18sIGNmZ19iYXNlKTsKKwl9IGVsc2UgeworCQlpZiAoIXNtc2Nfc3VwZXJpb19mbGF0KGZkY19jaGlwc19mbGF0LGNmZ19iYXNlLCJGREMiKQorCQkgICAgfHwhc21zY19zdXBlcmlvX3BhZ2VkKGZkY19jaGlwc19wYWdlZCxjZmdfYmFzZSwiRkRDIikpCisJCQlyZXQgPSAgMDsKKworCQlyZWxlYXNlX3JlZ2lvbihjZmdfYmFzZSwgMik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2luaXQgc21zY19zdXBlcmlvX2xwYyh1bnNpZ25lZCBzaG9ydCBjZmdfYmFzZSkKK3sKKwlpbnQgcmV0ID0gLTE7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGNmZ19iYXNlLCAyLCBkcml2ZXJfbmFtZSkpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogY2FuJ3QgZ2V0IGNmZ19iYXNlIG9mIDB4JTAzeFxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fLCBjZmdfYmFzZSk7CisJfSBlbHNlIHsKKwkJaWYgKCFzbXNjX3N1cGVyaW9fZmxhdChscGNfY2hpcHNfZmxhdCxjZmdfYmFzZSwiTFBDIikKKwkJICAgIHx8IXNtc2Nfc3VwZXJpb19wYWdlZChscGNfY2hpcHNfcGFnZWQsY2ZnX2Jhc2UsIkxQQyIpKQorCQkJcmV0ID0gMDsKKwkJcmVsZWFzZV9yZWdpb24oY2ZnX2Jhc2UsIDIpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVHJhbnNjZWl2ZXJzIHNwZWNpZmljIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2F0YyhmaXJfYmFzZSwgc3BlZWQpCisgKgorICogICAgUHJvZ3JhbSB0cmFuc2NlaXZlciB0aHJvdWdoIHNtc2MtaXJjYyBBVEMgY2lyY3VpdHJ5CisgKgorICovCisKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2F0YyhpbnQgZmlyX2Jhc2UsIHUzMiBzcGVlZCkKK3sKKwl1bnNpZ25lZCBsb25nIGppZmZpZXNfbm93LCBqaWZmaWVzX3RpbWVvdXQ7CisJdTgJdmFsOworCQorCWppZmZpZXNfbm93PSBqaWZmaWVzOworCWppZmZpZXNfdGltZW91dD0gamlmZmllcytTTVNDX0lSQ0MyX0FUQ19QUk9HUkFNTUlOR19USU1FT1VUX0pJRkZJRVM7CisJCisJLyogQVRDICovCisJcmVnaXN0ZXJfYmFuayhmaXJfYmFzZSwgNCk7CisJb3V0YigoaW5iKGZpcl9iYXNlK0lSQ0NfQVRDKSAmIElSQ0NfQVRDX01BU0spIHxJUkNDX0FUQ19uUFJPR1JFQURZfElSQ0NfQVRDX0VOQUJMRSwgZmlyX2Jhc2UrSVJDQ19BVEMpOworCXdoaWxlKCh2YWw9KGluYihmaXJfYmFzZStJUkNDX0FUQykgJiBJUkNDX0FUQ19uUFJPR1JFQURZKSkgJiYgIXRpbWVfYWZ0ZXIoamlmZmllcywgamlmZmllc190aW1lb3V0KSk7CisJaWYodmFsKQorCQlJUkRBX1dBUk5JTkcoIiVzKCk6IEFUQzogMHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgIGluYihmaXJfYmFzZStJUkNDX0FUQykpOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19hdGMoZmlyX2Jhc2UpCisgKgorICogICAgUHJvYmUgdHJhbnNjZWl2ZXIgc21zYy1pcmNjIEFUQyBjaXJjdWl0cnkKKyAqCisgKi8KKworc3RhdGljIGludCBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXJfc21zY19pcmNjX2F0YyhpbnQgZmlyX2Jhc2UpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19mYXN0X3Bpbl9zZWxlY3Qoc2VsZiwgc3BlZWQpCisgKgorICogICAgU2V0IHRyYW5zY2VpdmVyIAorICoKKyAqLworCitzdGF0aWMgdm9pZCBzbXNjX2lyY2Nfc2V0X3RyYW5zY2VpdmVyX3Ntc2NfaXJjY19mYXN0X3Bpbl9zZWxlY3QoaW50IGZpcl9iYXNlLCB1MzIgc3BlZWQpCit7CisJdTgJZmFzdF9tb2RlOworCQorCXN3aXRjaChzcGVlZCkKKwl7CisJCWRlZmF1bHQ6CisJCWNhc2UgNTc2MDAwIDoKKwkJZmFzdF9tb2RlID0gMDsgCisJCWJyZWFrOworCQljYXNlIDExNTIwMDAgOgorCQljYXNlIDQwMDAwMDAgOgorCQlmYXN0X21vZGUgPSBJUkNDX0xDUl9BX0ZBU1Q7CisJCWJyZWFrOworCQkKKwl9CisJcmVnaXN0ZXJfYmFuayhmaXJfYmFzZSwgMCk7CisJb3V0YigoaW5iKGZpcl9iYXNlK0lSQ0NfTENSX0EpICYgIDB4YmYpIHwgZmFzdF9tb2RlLCBmaXJfYmFzZStJUkNDX0xDUl9BKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcl9zbXNjX2lyY2NfZmFzdF9waW5fc2VsZWN0KGZpcl9iYXNlKQorICoKKyAqICAgIFByb2JlIHRyYW5zY2VpdmVyIAorICoKKyAqLworCitzdGF0aWMgaW50IHNtc2NfaXJjY19wcm9iZV90cmFuc2NlaXZlcl9zbXNjX2lyY2NfZmFzdF9waW5fc2VsZWN0KGludCBmaXJfYmFzZSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfdG9zaGliYV9zYXQxODAwKGZpcl9iYXNlLCBzcGVlZCkKKyAqCisgKiAgICBTZXQgdHJhbnNjZWl2ZXIgCisgKgorICovCisKK3N0YXRpYyB2b2lkIHNtc2NfaXJjY19zZXRfdHJhbnNjZWl2ZXJfdG9zaGliYV9zYXQxODAwKGludCBmaXJfYmFzZSwgdTMyIHNwZWVkKQoreworCXU4CWZhc3RfbW9kZTsKKwkKKwlzd2l0Y2goc3BlZWQpCisJeworCQlkZWZhdWx0OgorCQljYXNlIDU3NjAwMCA6CisJCWZhc3RfbW9kZSA9IDA7IAorCQlicmVhazsKKwkJY2FzZSAxMTUyMDAwIDoKKwkJY2FzZSA0MDAwMDAwIDoKKwkJZmFzdF9tb2RlID0gLypJUkNDX0xDUl9BX0ZBU1QgfCovIElSQ0NfTENSX0FfR1BfREFUQTsKKwkJYnJlYWs7CisJCQorCX0KKwkvKiBUaGlzIGNhdXNlcyBhbiBpbnRlcnJ1cHQgKi8KKwlyZWdpc3Rlcl9iYW5rKGZpcl9iYXNlLCAwKTsKKwlvdXRiKChpbmIoZmlyX2Jhc2UrSVJDQ19MQ1JfQSkgJiAgMHhiZikgfCBmYXN0X21vZGUsIGZpcl9iYXNlK0lSQ0NfTENSX0EpOworfQorCisvKgorICogRnVuY3Rpb24gc21zY19pcmNjX3Byb2JlX3RyYW5zY2VpdmVyX3Rvc2hpYmFfc2F0MTgwMChmaXJfYmFzZSkKKyAqCisgKiAgICBQcm9iZSB0cmFuc2NlaXZlciAKKyAqCisgKi8KKworc3RhdGljIGludCBzbXNjX2lyY2NfcHJvYmVfdHJhbnNjZWl2ZXJfdG9zaGliYV9zYXQxODAwKGludCBmaXJfYmFzZSkKK3sKKwlyZXR1cm4gMDsKK30KKworCittb2R1bGVfaW5pdChzbXNjX2lyY2NfaW5pdCk7Cittb2R1bGVfZXhpdChzbXNjX2lyY2NfY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoIkRhbmllbGUgUGVyaSA8cGVyaUBjc2FpLnVuaXBhLml0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTTUMgSXJDQyBTSVIvRklSIGNvbnRyb2xsZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShpcmNjX2RtYSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJjY19kbWEsICJETUEgY2hhbm5lbCIpOworbW9kdWxlX3BhcmFtKGlyY2NfaXJxLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcmNjX2lycSwgIklSUSBsaW5lIik7Cittb2R1bGVfcGFyYW0oaXJjY19maXIsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlyY2NfZmlyLCAiRklSIEJhc2UgQWRkcmVzcyIpOworbW9kdWxlX3BhcmFtKGlyY2Nfc2lyLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcmNjX3NpciwgIlNJUiBCYXNlIEFkZHJlc3MiKTsKK21vZHVsZV9wYXJhbShpcmNjX2NmZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJjY19jZmcsICJDb25maWd1cmF0aW9uIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcyIpOworbW9kdWxlX3BhcmFtKGlyY2NfdHJhbnNjZWl2ZXIsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlyY2NfdHJhbnNjZWl2ZXIsICJUcmFuc2NlaXZlciB0eXBlIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Ntc2MtaXJjYzIuaCBiL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ODYxMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3Ntc2MtaXJjYzIuaApAQCAtMCwwICsxLDE5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogJElkOiBzbXNjLWlyY2MyLmgsdiAxLjEyLjIuMSAyMDAyLzEwLzI3IDEwOjUyOjM3IGRpcCBFeHAgJCAgICAgICAgICAgICAgIAorICoKKyAqIERlc2NyaXB0aW9uOiAgIERlZmluaXRpb25zIGZvciB0aGUgU01DIElyQ0MgY2hpcHNldAorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFuaWVsZSBQZXJpIChwZXJpQGNzYWkudW5pcGEuaXQpCisgKgorICogICAgIENvcHlyaWdodCAoYykgMjAwMiAgICAgIERhbmllbGUgUGVyaQorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogQmFzZWQgb24gc21jLWlyY2MuaDoKKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OS0yMDAwLCBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTksIFRob21hcyBEYXZpcyAodGFkYXZpc0BqcHMubmV0PgorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCAKKyAqICAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTTVNDX0lSQ0MyX0gKKyNkZWZpbmUgU01TQ19JUkNDMl9ICisKKy8qIERNQSBtb2RlcyBuZWVkZWQgKi8KKyNkZWZpbmUgRE1BX1RYX01PREUgICAgICAgICAgICAgICAgMHgwOCAgICAvKiBNZW0gdG8gSS9PLCArKywgZGVtYW5kLiAqLworI2RlZmluZSBETUFfUlhfTU9ERSAgICAgICAgICAgICAgICAweDA0ICAgIC8qIEkvTyB0byBtZW0sICsrLCBkZW1hbmQuICovCisKKy8qIE1hc3RlciBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIElSQ0NfTUFTVEVSICAgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgICBJUkNDX01BU1RFUl9QT1dFUkRPV04JICAgMHg4MAorI2RlZmluZSAgIElSQ0NfTUFTVEVSX1JFU0VUICAgICAgICAweDQwCisjZGVmaW5lICAgSVJDQ19NQVNURVJfSU5UX0VOICAgICAgIDB4MjAKKyNkZWZpbmUgICBJUkNDX01BU1RFUl9FUlJPUl9SRVNFVCAgMHgxMAorCisvKiBSZWdpc3RlciBibG9jayAwICovCisKKy8qIEludGVycnVwdCBJZGVudGlmaWNhdGlvbiAqLworI2RlZmluZSBJUkNDX0lJUgkJCQkJMHgwMQorI2RlZmluZSAgIElSQ0NfSUlSX0FDVElWRV9GUkFNRQkJMHg4MAorI2RlZmluZSAgIElSQ0NfSUlSX0VPTQkJCQkweDQwCisjZGVmaW5lICAgSVJDQ19JSVJfUkFXX01PREUJCQkweDIwCisjZGVmaW5lICAgSVJDQ19JSVJfRklGTwkJCQkweDEwCisKKy8qIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgSVJDQ19JRVIJCQkJCTB4MDIKKyNkZWZpbmUgICBJUkNDX0lFUl9BQ1RJVkVfRlJBTUUJCTB4ODAKKyNkZWZpbmUgICBJUkNDX0lFUl9FT00JCQkJMHg0MAorI2RlZmluZSAgIElSQ0NfSUVSX1JBV19NT0RFCQkJMHgyMAorI2RlZmluZSAgIElSQ0NfSUVSX0ZJRk8JCQkJMHgxMAorCisvKiBMaW5lIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBJUkNDX0xTUgkJCQkJMHgwMworI2RlZmluZSAgIElSQ0NfTFNSX1VOREVSUlVOCQkJMHg4MAorI2RlZmluZSAgIElSQ0NfTFNSX09WRVJSVU4JCQkweDQwCisjZGVmaW5lICAgSVJDQ19MU1JfRlJBTUVfRVJST1IJCTB4MjAKKyNkZWZpbmUgICBJUkNDX0xTUl9TSVpFX0VSUk9SCQkweDEwCisjZGVmaW5lICAgSVJDQ19MU1JfQ1JDX0VSUk9SCQkweDgwCisjZGVmaW5lICAgSVJDQ19MU1JfRlJBTUVfQUJPUlQJCTB4NDAKKworLyogTGluZSBTdGF0dXMgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZSBJUkNDX0xTQVIJCQkJCTB4MDMKKyNkZWZpbmUgSVJDQ19MU0FSX0FERFJFU1NfTUFTSwkJMHgwNworCisvKiBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgQSAqLworI2RlZmluZSBJUkNDX0xDUl9BICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lICAgSVJDQ19MQ1JfQV9GSUZPX1JFU0VUICAgIDB4ODAKKyNkZWZpbmUgICBJUkNDX0xDUl9BX0ZBU1QgICAgICAgICAgMHg0MAorI2RlZmluZSAgIElSQ0NfTENSX0FfR1BfREFUQSAgICAgICAweDIwCisjZGVmaW5lICAgSVJDQ19MQ1JfQV9SQVdfVFggICAgICAgIDB4MTAKKyNkZWZpbmUgICBJUkNDX0xDUl9BX1JBV19SWCAgICAgICAgMHgwOAorI2RlZmluZSAgIElSQ0NfTENSX0FfQUJPUlQgICAgICAgICAweDA0CisjZGVmaW5lICAgSVJDQ19MQ1JfQV9EQVRBX0RPTkUgICAgIDB4MDIKKworLyogTGluZSBDb250cm9sIFJlZ2lzdGVyIEIgKi8KKyNkZWZpbmUgSVJDQ19MQ1JfQiAgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSAgIElSQ0NfTENSX0JfU0NFX0RJU0FCTEVEICAweDAwCisjZGVmaW5lICAgSVJDQ19MQ1JfQl9TQ0VfVFJBTlNNSVQgIDB4NDAKKyNkZWZpbmUgICBJUkNDX0xDUl9CX1NDRV9SRUNFSVZFICAgMHg4MAorI2RlZmluZSAgIElSQ0NfTENSX0JfU0NFX1VOREVGSU5FRCAweGMwCisjZGVmaW5lICAgSVJDQ19MQ1JfQl9TSVBfRU5BQkxFCSAgIDB4MjAKKyNkZWZpbmUgICBJUkNDX0xDUl9CX0JSSUNLX1dBTEwgICAgMHgxMAorCisvKiBCdXMgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIElSQ0NfQlNSICAgICAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgICBJUkNDX0JTUl9OT1RfRU1QVFkJICAgMHg4MAorI2RlZmluZSAgIElSQ0NfQlNSX0ZJRk9fRlVMTAkgICAweDQwCisjZGVmaW5lICAgSVJDQ19CU1JfVElNRU9VVAkgICAweDIwCisKKy8qIFJlZ2lzdGVyIGJsb2NrIDEgKi8KKworI2RlZmluZSBJUkNDX0ZJRk9fVEhSRVNIT0xECQkJMHgwMgorCisjZGVmaW5lIElSQ0NfU0NFX0NGR0EJCQkJMHgwMAorI2RlZmluZSAgIElSQ0NfQ0ZHQV9BVVhfSVIJCQkweDgwCisjZGVmaW5lICAgSVJDQ19DRkdBX0hBTEZfRFVQTEVYCQkweDA0CisjZGVmaW5lICAgSVJDQ19DRkdBX1RYX1BPTEFSSVRZCQkweDAyCisjZGVmaW5lICAgSVJDQ19DRkdBX1JYX1BPTEFSSVRZCQkweDAxCisKKyNkZWZpbmUgICBJUkNDX0NGR0FfQ09NCQkJCTB4MDAKKyNkZWZpbmUJCUlSQ0NfU0NFX0NGR0FfQkxPQ0tfQ1RSTF9CSVRTX01BU0sJMHg4NworI2RlZmluZSAgIAlJUkNDX0NGR0FfSVJEQV9TSVJfQQkweDA4CisjZGVmaW5lICAgCUlSQ0NfQ0ZHQV9BU0tfU0lSCQkweDEwCisjZGVmaW5lICAgCUlSQ0NfQ0ZHQV9JUkRBX1NJUl9CCTB4MTgKKyNkZWZpbmUgICAJSVJDQ19DRkdBX0lSREFfSERMQwkJMHgyMAorI2RlZmluZQkJSVJDQ19DRkdBX0lSREFfNFBQTQkJMHgyOAorI2RlZmluZQkJSVJDQ19DRkdBX0NPTlNVTUVSCQkweDMwCisjZGVmaW5lCQlJUkNDX0NGR0FfUkFXX0lSCQkweDM4CisjZGVmaW5lICAgICBJUkNDX0NGR0FfT1RIRVIJCQkweDQwCisKKyNkZWZpbmUgSVJDQ19JUl9IRExDICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBJUkNDX0lSXzRQUE0gICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIElSQ0NfSVJfQ09OU1VNRVIgICAgICAgICAgIDB4MDIKKworI2RlZmluZSBJUkNDX1NDRV9DRkdCCSAgICAgICAgICAgMHgwMQorI2RlZmluZSBJUkNDX0NGR0JfTE9PUEJBQ0sgICAgICAgICAweDIwCisjZGVmaW5lIElSQ0NfQ0ZHQl9MUEJDS19UWF9DUkMJICAgMHgxMAorI2RlZmluZSBJUkNDX0NGR0JfTk9XQUlUCSAgIDB4MDgKKyNkZWZpbmUgSVJDQ19DRkdCX1NUUklOR19NT1ZFCSAgIDB4MDQKKyNkZWZpbmUgSVJDQ19DRkdCX0RNQV9CVVJTVCAJICAgMHgwMgorI2RlZmluZSBJUkNDX0NGR0JfRE1BX0VOQUJMRQkgICAweDAxCisKKyNkZWZpbmUgSVJDQ19DRkdCX01VWF9DT00gICAgICAgICAgMHgwMAorI2RlZmluZSBJUkNDX0NGR0JfTVVYX0lSICAgICAgICAgICAweDQwCisjZGVmaW5lIElSQ0NfQ0ZHQl9NVVhfQVVYICAgICAgICAgIDB4ODAKKyNkZWZpbmUgSVJDQ19DRkdCX01VWF9JTkFDVElWRQkgICAweGMwCisKKy8qIFJlZ2lzdGVyIGJsb2NrIDMgLSBJZGVudGlmaWNhdGlvbiBSZWdpc3RlcnMhICovCisjZGVmaW5lIElSQ0NfSURfSElHSAkgICAgICAgICAgIDB4MDAgICAvKiAweDEwICovCisjZGVmaW5lIElSQ0NfSURfTE9XCSAgICAgICAgICAgMHgwMSAgIC8qIDB4QjggKi8KKyNkZWZpbmUgSVJDQ19DSElQX0lEIAkgICAgICAgICAgIDB4MDIgICAvKiAweEYxICovCisjZGVmaW5lIElSQ0NfVkVSU0lPTgkgICAgICAgICAgIDB4MDMgICAvKiAweDAxICovCisjZGVmaW5lIElSQ0NfSU5URVJGQUNFCSAgICAgICAgICAgMHgwNCAgIC8qIGxvdyA0ID0gRE1BLCBoaWdoIDQgPSBJUlEgKi8KKyNkZWZpbmUgCUlSQ0NfSU5URVJGQUNFX0RNQV9NQVNLCTB4MEYgICAvKiBsb3cgNCA9IERNQSwgaGlnaCA0ID0gSVJRICovCisjZGVmaW5lIAlJUkNDX0lOVEVSRkFDRV9JUlFfTUFTSwkweEYwICAgLyogbG93IDQgPSBETUEsIGhpZ2ggNCA9IElSUSAqLworCisvKiBSZWdpc3RlciBibG9jayA0IC0gSXJEQSAqLworI2RlZmluZSBJUkNDX0NPTlRST0wgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIElSQ0NfQk9GX0NPVU5UX0xPICAgICAgICAgIDB4MDEgLyogTG93IGJ5dGUgKi8KKyNkZWZpbmUgSVJDQ19CT0ZfQ09VTlRfSEkgICAgICAgICAgMHgwMCAvKiBIaWdoIG5pYmJsZSAoYml0IDAtMykgKi8KKyNkZWZpbmUgSVJDQ19CUklDS1dBTExfQ05UX0xPICAgICAgMHgwMiAvKiBMb3cgYnl0ZSAqLworI2RlZmluZSBJUkNDX0JSSUNLV0FMTF9DTlRfSEkgICAgICAweDAzIC8qIEhpZ2ggbmliYmxlIChiaXQgNC03KSAqLworI2RlZmluZSBJUkNDX1RYX1NJWkVfTE8gICAgICAgICAgICAweDA0IC8qIExvdyBieXRlICovCisjZGVmaW5lIElSQ0NfVFhfU0laRV9ISSAgICAgICAgICAgIDB4MDMgLyogSGlnaCBuaWJibGUgKGJpdCAwLTMpICovCisjZGVmaW5lIElSQ0NfUlhfU0laRV9ISSAgICAgICAgICAgIDB4MDUgLyogSGlnaCBuaWJibGUgKGJpdCAwLTMpICovCisjZGVmaW5lIElSQ0NfUlhfU0laRV9MTyAgICAgICAgICAgIDB4MDYgLyogTG93IGJ5dGUgKi8KKworI2RlZmluZSBJUkNDXzExNTIgICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIElSQ0NfQ1JDICAgICAgICAgICAgICAgICAgIDB4NDAKKworLyogUmVnaXN0ZXIgYmxvY2sgNSAtIElyREEgKi8KKyNkZWZpbmUgSVJDQ19BVEMJCQkJCTB4MDAKKyNkZWZpbmUgCUlSQ0NfQVRDX25QUk9HUkVBRFkJCTB4ODAKKyNkZWZpbmUgCUlSQ0NfQVRDX1NQRUVECQkJMHg0MAorI2RlZmluZSAJSVJDQ19BVENfRU5BQkxFCQkJMHgyMAorI2RlZmluZSAJSVJDQ19BVENfTUFTSwkJCTB4RTAKKworCisjZGVmaW5lIElSQ0NfSVJIQUxGRFVQTEVYX1RJTUVPVVQJMHgwMQorCisjZGVmaW5lIElSQ0NfU0NFX1RYX0RFTEFZX1RJTUVSCQkweDAyCisKKy8qCisgKiBPdGhlciBkZWZpbml0aW9ucworICovCisKKyNkZWZpbmUgU01TQ19JUkNDMl9NQVhfU0lSX1NQRUVECQkxMTUyMDAKKyNkZWZpbmUgU01TQ19JUkNDMl9GSVJfQ0hJUF9JT19FWFRFTlQgCTgKKyNkZWZpbmUgU01TQ19JUkNDMl9TSVJfQ0hJUF9JT19FWFRFTlQgCTgKKyNkZWZpbmUgU01TQ19JUkNDMl9GSUZPX1NJWkUJCQkxNgorI2RlZmluZSBTTVNDX0lSQ0MyX0ZJRk9fVEhSRVNIT0xECQk2NAorLyogTWF4IERNQSBidWZmZXIgc2l6ZSBuZWVkZWQgPSAoZGF0YV9zaXplICsgNikgKiAod2luZG93X3NpemUpICsgNjsgKi8KKyNkZWZpbmUgU01TQ19JUkNDMl9SWF9CVUZGX1RSVUVTSVpFCQkxNDM4NAorI2RlZmluZSBTTVNDX0lSQ0MyX1RYX0JVRkZfVFJVRVNJWkUJCTE0Mzg0CisjZGVmaW5lIFNNU0NfSVJDQzJfTUlOX1RVUk5fVElNRQkJMHgwNworI2RlZmluZSBTTVNDX0lSQ0MyX1dJTkRPV19TSVpFCQkJMHgwNworLyogTWF4aW11bSB3YWl0IGZvciBodyB0cmFuc21pdHRlciB0byBmaW5pc2ggKi8KKyNkZWZpbmUgU01TQ19JUkNDMl9IV19UUkFOU01JVFRFUl9USU1FT1VUX1VTCTEwMDAJLyogMSBtcyAqLworLyogTWF4aW11bSB3YWl0IGZvciBBVEMgdHJhbnNjZWl2ZXIgcHJvZ3JhbW1pbmcgdG8gZmluaXNoICovCisjZGVmaW5lIFNNU0NfSVJDQzJfQVRDX1BST0dSQU1NSU5HX1RJTUVPVVRfSklGRklFUyAxCisjZW5kaWYgLyogU01TQ19JUkNDMl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Ntc2Mtc2lvLmggYi9kcml2ZXJzL25ldC9pcmRhL3Ntc2Mtc2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllMjBlNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1zaW8uaApAQCAtMCwwICsxLDEwMCBAQAorI2lmbmRlZiBTTVNDX1NJT19ICisjZGVmaW5lIFNNU0NfU0lPX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEtleXMuIFRoZXkgc2hvdWxkIHdvcmsgd2l0aCBldmVyeSBTTXNDIFNJTworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTTVNDU0lPX0NGR0FDQ0VTU0tFWQkJMHg1NQorI2RlZmluZSBTTVNDU0lPX0NGR0VYSVRLRVkJCQkweGFhCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR2VuZXJpYyBTSU8gRmxhdCAoIT8pICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCisvKiBSZWdpc3RlciAweDBkICovCisjZGVmaW5lIFNNU0NTSU9GTEFUX0RFVklDRUlEX1JFRwkJCQkweDBkCisKKy8qIFJlZ2lzdGVyIDB4MGMgKi8KKyNkZWZpbmUgU01TQ1NJT0ZMQVRfVUFSVE1PREUwQ19SRUcJCQkJMHgwYworI2RlZmluZSAJU01TQ1NJT0ZMQVRfVUFSVDJNT0RFX01BU0sJCQkweDM4CisjZGVmaW5lIAlTTVNDU0lPRkxBVF9VQVJUMk1PREVfVkFMX0NPTQkJMHgwMAorI2RlZmluZSAJU01TQ1NJT0ZMQVRfVUFSVDJNT0RFX1ZBTF9JUkRBCQkweDA4CisjZGVmaW5lIAlTTVNDU0lPRkxBVF9VQVJUMk1PREVfVkFMX0FTS0lSCQkweDEwCisKKy8qIFJlZ2lzdGVyIDB4MjUgKi8KKyNkZWZpbmUgU01TQ1NJT0ZMQVRfVUFSVDJCQVNFQUREUl9SRUcJCQkweDI1CisKKy8qIFJlZ2lzdGVyIDB4MmIgKi8KKyNkZWZpbmUgU01TQ1NJT0ZMQVRfRklSQkFTRUFERFJfUkVHCQkJCTB4MmIKKworLyogUmVnaXN0ZXIgMHgyYyAqLworI2RlZmluZSBTTVNDU0lPRkxBVF9GSVJETUFTRUxFQ1RfUkVHCQkJMHgyYworI2RlZmluZSAJU01TQ1NJT0ZMQVRfRklSRE1BU0VMRUNUX01BU0sJCTB4MGYKKworLyogUmVnaXN0ZXIgMHgyOCAqLworI2RlZmluZSBTTVNDU0lPRkxBVF9VQVJUSVJRU0VMRUNUX1JFRwkJCTB4MjgKKyNkZWZpbmUgCVNNU0NTSU9GTEFUX1VBUlQySVJRU0VMRUNUX01BU0sJCTB4MGYKKyNkZWZpbmUgCVNNU0NTSU9GTEFUX1VBUlQxSVJRU0VMRUNUX01BU0sJCTB4ZjAKKyNkZWZpbmUgCVNNU0NTSU9GTEFUX1VBUlRJUlFTRUxFQ1RfVkFMX05PTkUJMHgwMAorCisKKy8qKioqKioqKioqKioqKioqKioqKioKKyAqIExQQzQ3TjIyNyAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTFBDNDdOMjI3X0NGR0FDQ0VTU0tFWQkJMHg1NQorI2RlZmluZSBMUEM0N04yMjdfQ0ZHRVhJVEtFWQkJMHhhYQorCisvKiBSZWdpc3RlciAweDAwICovCisjZGVmaW5lIExQQzQ3TjIyN19GRENQT1dFUlZBTElEQ09ORl9SRUcJCTB4MDAKKyNkZWZpbmUgCUxQQzQ3TjIyN19GRENQT1dFUl9NQVNLCQkJMHgwOAorI2RlZmluZSAJTFBDNDdOMjI3X1ZBTElEX01BU0sJCQkJMHg4MAorCisvKiBSZWdpc3RlciAweDAyICovCisjZGVmaW5lIExQQzQ3TjIyN19VQVJUMTJQT1dFUl9SRUcJCQkJMHgwMgorI2RlZmluZSAJTFBDNDdOMjI3X1VBUlQxUE9XRVJET1dOX01BU0sJCTB4MDgKKyNkZWZpbmUgCUxQQzQ3TjIyN19VQVJUMlBPV0VSRE9XTl9NQVNLCQkweDgwCisKKy8qIFJlZ2lzdGVyIDB4MDcgKi8KKyNkZWZpbmUgTFBDNDdOMjI3X0FQTUJPT1REUklWRV9SRUcJCQkJMHgwNworI2RlZmluZSAJTFBDNDdOMjI3X1BBUlBPUlQyQVVUT1BXUkRPV05fTUFTSwkweDEwIC8qIGF1dG8gcG93ZXIgZG93biBvbiBpZiBzZXQgKi8KKyNkZWZpbmUgCUxQQzQ3TjIyN19VQVJUMkFVVE9QV1JET1dOX01BU0sJMHgyMCAvKiBhdXRvIHBvd2VyIGRvd24gb24gaWYgc2V0ICovCisjZGVmaW5lIAlMUEM0N04yMjdfVUFSVDFBVVRPUFdSRE9XTl9NQVNLCTB4NDAgLyogYXV0byBwb3dlciBkb3duIG9uIGlmIHNldCAqLworCisvKiBSZWdpc3RlciAweDBjICovCisjZGVmaW5lIExQQzQ3TjIyN19VQVJUTU9ERTBDX1JFRwkJCQkweDBjCisjZGVmaW5lIAlMUEM0N04yMjdfVUFSVDJNT0RFX01BU0sJCQkweDM4CisjZGVmaW5lIAlMUEM0N04yMjdfVUFSVDJNT0RFX1ZBTF9DT00JCTB4MDAKKyNkZWZpbmUgCUxQQzQ3TjIyN19VQVJUMk1PREVfVkFMX0lSREEJCTB4MDgKKyNkZWZpbmUgCUxQQzQ3TjIyN19VQVJUMk1PREVfVkFMX0FTS0lSCQkweDEwCisKKy8qIFJlZ2lzdGVyIDB4MGQgKi8KKyNkZWZpbmUgTFBDNDdOMjI3X0RFVklDRUlEX1JFRwkJCQkJMHgwZAorI2RlZmluZSAJTFBDNDdOMjI3X0RFVklDRUlEX0RFRlZBTAkJCTB4NWEKKworLyogUmVnaXN0ZXIgMHgwZSAqLworI2RlZmluZSBMUEM0N04yMjdfUkVWSVNJT05JRF9SRUcJCQkJMHgwZQorCisvKiBSZWdpc3RlciAweDI1ICovCisjZGVmaW5lIExQQzQ3TjIyN19VQVJUMkJBU0VBRERSX1JFRwkJCTB4MjUKKworLyogUmVnaXN0ZXIgMHgyOCAqLworI2RlZmluZSBMUEM0N04yMjdfVUFSVElSUVNFTEVDVF9SRUcJCQkweDI4CisjZGVmaW5lIAlMUEM0N04yMjdfVUFSVDJJUlFTRUxFQ1RfTUFTSwkJMHgwZgorI2RlZmluZSAJTFBDNDdOMjI3X1VBUlQxSVJRU0VMRUNUX01BU0sJCTB4ZjAKKyNkZWZpbmUgCUxQQzQ3TjIyN19VQVJUSVJRU0VMRUNUX1ZBTF9OT05FCTB4MDAKKworLyogUmVnaXN0ZXIgMHgyYiAqLworI2RlZmluZSBMUEM0N04yMjdfRklSQkFTRUFERFJfUkVHCQkJCTB4MmIKKworLyogUmVnaXN0ZXIgMHgyYyAqLworI2RlZmluZSBMUEM0N04yMjdfRklSRE1BU0VMRUNUX1JFRwkJCQkweDJjCisjZGVmaW5lIAlMUEM0N04yMjdfRklSRE1BU0VMRUNUX01BU0sJCTB4MGYKKyNkZWZpbmUgCUxQQzQ3TjIyN19GSVJETUFTRUxFQ1RfVkFMX0RNQTEJMHgwMSAvKiA0N24yMjcgaGFzIHRocmVlIGRtYSBjaGFubmVscyAqLworI2RlZmluZSAJTFBDNDdOMjI3X0ZJUkRNQVNFTEVDVF9WQUxfRE1BMgkweDAyCisjZGVmaW5lIAlMUEM0N04yMjdfRklSRE1BU0VMRUNUX1ZBTF9ETUEzCTB4MDMKKyNkZWZpbmUgCUxQQzQ3TjIyN19GSVJETUFTRUxFQ1RfVkFMX05PTkUJMHgwZgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zdGlyNDIwMC5jIGIvZHJpdmVycy9uZXQvaXJkYS9zdGlyNDIwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYzYwNWU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zdGlyNDIwMC5jCkBAIC0wLDAgKzEsMTE4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZpbGVuYW1lOiAgICAgIHN0aXI0MjAwLmMKKyogVmVyc2lvbjogICAgICAgMC40CisqIERlc2NyaXB0aW9uOiAgIElyZGEgU2lnbWFUZWwgVVNCIERvbmdsZQorKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwKKyogQXV0aG9yOiAgICAgICAgU3RlcGhlbiBIZW1taW5nZXIgPHNoZW1taW5nZXJAb3NkbC5vcmc+CisqCisqICAJQmFzZWQgb24gZWFybGllciBkcml2ZXIgYnkgUGF1bCBTdGV3YXJ0IDxzdGV3YXJ0QHBhcmMuY29tPgorKgorKglDb3B5cmlnaHQgKEMpIDIwMDAsIFJvbWFuIFdlaXNzZ2FlcmJlciA8d2Vpc3NnQHZpZW5uYS5hdD4KKyoJQ29weXJpZ2h0IChDKSAyMDAxLCBEYWcgQnJhdHRsaSA8ZGFnQGJyYXR0bGkubmV0PgorKglDb3B5cmlnaHQgKEMpIDIwMDEsIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KKyoJQ29weXJpZ2h0IChDKSAyMDA0LCBTdGVwaGVuIEhlbW1pbmdlciA8c2hlbW1pbmdlckBvc2RsLm9yZz4KKyoKKyoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyoJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoaXMgZG9uZ2xlIGRvZXMgbm8gZnJhbWluZywgYW5kIHJlcXVpcmVzIHBvbGxpbmcgdG8gcmVjZWl2ZSB0aGUKKyAqIGRhdGEuICBUaGUgU1RJcjQyMDAgaGFzIGJ1bGsgaW4gYW5kIG91dCBlbmRwb2ludHMganVzdCBsaWtlCisgKiB1c3ItaXJkYSBkZXZpY2VzLCBidXQgdGhlIGRhdGEgaXQgc2VuZHMgYW5kIHJlY2VpdmVzIGlzIHJhdzsgbGlrZQorICogaXJ0dHksIGl0IG5lZWRzIHRvIGNhbGwgdGhlIHdyYXAgYW5kIHVud3JhcCBmdW5jdGlvbnMgdG8gYWRkIGFuZAorICogcmVtb3ZlIFNPRi9CT0YgYW5kIGVzY2FwZSBjaGFyYWN0ZXJzIHRvL2Zyb20gdGhlIGZyYW1lLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFwLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS93cmFwcGVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvY3JjLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworTU9EVUxFX0FVVEhPUigiU3RlcGhlbiBIZW1taW5nZXIgPHNoZW1taW5nZXJAb3NkbC5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklyREEtVVNCIERvbmdsZSBEcml2ZXIgZm9yIFNpZ21hVGVsIFNUSXI0MjAwIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgcW9zX210dF9iaXRzID0gMHgwNzsJLyogMSBtcyBvciBtb3JlICovCittb2R1bGVfcGFyYW0ocW9zX210dF9iaXRzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhxb3NfbXR0X2JpdHMsICJNaW5pbXVtIFR1cm4gVGltZSIpOworCitzdGF0aWMgaW50IHJ4X3NlbnNpdGl2aXR5ID0gMTsJLyogRklSIDAuLjQsIFNJUiAwLi42ICovCittb2R1bGVfcGFyYW0ocnhfc2Vuc2l0aXZpdHksIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ4X3NlbnNpdGl2aXR5LCAiU2V0IFJlY2VpdmVyIHNlbnNpdGl2aXR5ICgwLTYsIDAgaXMgbW9zdCBzZW5zaXRpdmUpIik7CisKK3N0YXRpYyBpbnQgdHhfcG93ZXIgPSAwOwkvKiAwID0gaGlnaGVzdCAuLi4gMyA9IGxvd2VzdCAqLworbW9kdWxlX3BhcmFtKHR4X3Bvd2VyLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0eF9wb3dlciwgIlNldCBUcmFuc21pdHRlciBwb3dlciAoMC0zLCAwIGlzIGhpZ2hlc3QgcG93ZXIpIik7CisKKyNkZWZpbmUgU1RJUl9JUkRBX0hFQURFUiAgCTQKKyNkZWZpbmUgQ1RSTF9USU1FT1VUCQkxMDAJICAgLyogbWlsbGlzZWNvbmRzICovCisjZGVmaW5lIFRSQU5TTUlUX1RJTUVPVVQJMjAwCSAgIC8qIG1pbGxpc2Vjb25kcyAqLworI2RlZmluZSBTVElSX0ZJRk9fU0laRQkJNDA5NgorI2RlZmluZSBGSUZPX1JFR1NfU0laRQkJMworCitlbnVtIEZpckNoYXJzIHsKKwlGSVJfQ0UgICA9IDB4N2QsCisJRklSX1hCT0YgPSAweDdmLAorCUZJUl9FT0YgID0gMHg3ZSwKK307CisKK2VudW0gU3RpclJlcXVlc3RzIHsKKwlSRVFfV1JJVEVfUkVHID0JCTB4MDAsCisJUkVRX1JFQURfUkVHID0JCTB4MDEsCisJUkVRX1JFQURfUk9NID0JCTB4MDIsCisJUkVRX1dSSVRFX1NJTkdMRSA9CTB4MDMsCit9OworCisvKiBSZWdpc3RlciBvZmZzZXRzICovCitlbnVtIFN0aXJSZWdzIHsKKwlSRUdfUlNWRD0wLAorCVJFR19NT0RFLAorCVJFR19QRENMSywKKwlSRUdfQ1RSTDEsCisJUkVHX0NUUkwyLAorCVJFR19GSUZPQ1RMLAorCVJFR19GSUZPTFNCLAorCVJFR19GSUZPTVNCLAorCVJFR19EUExMLAorCVJFR19JUkRJRywKKwlSRUdfVEVTVD0xNSwKK307CisKK2VudW0gU3Rpck1vZGVNYXNrIHsKKwlNT0RFX0ZJUiA9IDB4ODAsCisJTU9ERV9TSVIgPSAweDIwLAorCU1PREVfQVNLID0gMHgxMCwKKwlNT0RFX0ZBU1RSWCA9IDB4MDgsCisJTU9ERV9GRlJTVEVOID0gMHgwNCwKKwlNT0RFX05SRVNFVCA9IDB4MDIsCisJTU9ERV8yNDAwID0gMHgwMSwKK307CisKK2VudW0gU3RpclBkY2xrTWFzayB7CisJUERDTEtfNDAwMDAwMCA9IDB4MDIsCisJUERDTEtfMTE1MjAwID0gMHgwOSwKKwlQRENMS181NzYwMCA9IDB4MTMsCisJUERDTEtfMzg0MDAgPSAweDFELAorCVBEQ0xLXzE5MjAwID0gMHgzQiwKKwlQRENMS185NjAwID0gMHg3NywKKwlQRENMS18yNDAwID0gMHhERiwKK307CisKK2VudW0gU3RpckN0cmwxTWFzayB7CisJQ1RSTDFfU0RNT0RFID0gMHg4MCwKKwlDVFJMMV9SWFNMT1cgPSAweDQwLAorCUNUUkwxX1RYUFdEID0gMHgxMCwKKwlDVFJMMV9SWFBXRCA9IDB4MDgsCisJQ1RSTDFfU1JFU0VUID0gMHgwMSwKK307CisKK2VudW0gU3RpckN0cmwyTWFzayB7CisJQ1RSTDJfU1BXSURUSCA9IDB4MDgsCisJQ1RSTDJfUkVWSUQgPSAweDAzLAorfTsKKworZW51bSBTdGlyRmlmb0N0bE1hc2sgeworCUZJRk9DVExfRU9GID0gMHg4MCwKKwlGSUZPQ1RMX1VOREVSID0gMHg0MCwKKwlGSUZPQ1RMX09WRVIgPSAweDIwLAorCUZJRk9DVExfRElSID0gMHgxMCwKKwlGSUZPQ1RMX0NMUiA9IDB4MDgsCisJRklGT0NUTF9FTVBUWSA9IDB4MDQsCisJRklGT0NUTF9SWEVSUiA9IDB4MDIsCisJRklGT0NUTF9UWEVSUiA9IDB4MDEsCit9OworCitlbnVtIFN0aXJEaWFnTWFzayB7CisJSVJESUdfUlhISUdIID0gMHg4MCwKKwlJUkRJR19SWExPVyA9IDB4NDAsCit9OworCitlbnVtIFN0aXJUZXN0TWFzayB7CisJVEVTVF9QTExET1dOID0gMHg4MCwKKwlURVNUX0xPT1BJUiA9IDB4NDAsCisJVEVTVF9MT09QVVNCID0gMHgyMCwKKwlURVNUX1RTVEVOQSA9IDB4MTAsCisJVEVTVF9UU1RPU0MgPSAweDBGLAorfTsKKworc3RydWN0IHN0aXJfY2IgeworICAgICAgICBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OyAgICAgIC8qIGluaXQ6IHByb2JlX2lyZGEgKi8KKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsgICAgICAvKiBuZXR3b3JrIGxheWVyICovCisgICAgICAgIHN0cnVjdCBpcmxhcF9jYiAgICppcmxhcDsgICAgICAgLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJLyogbmV0d29yayBzdGF0aXN0aWNzICovCisgICAgICAgIHN0cnVjdCBxb3NfaW5mbyAgIHFvczsKKwl1bnNpZ25lZCAJICBzcGVlZDsJLyogQ3VycmVudCBzcGVlZCAqLworCisJd2FpdF9xdWV1ZV9oZWFkX3QgdGhyX3dhaXQ7CS8qIHRyYW5zbWl0IHRocmVhZCB3YWtldXAgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiB0aHJfZXhpdGVkOworCXBpZF90CQkgIHRocl9waWQ7CisKKwlzdHJ1Y3Qgc2tfYnVmZgkgICp0eF9wZW5kaW5nOworCXZvaWQJCSAgKmlvX2J1ZjsJLyogdHJhbnNtaXQvcmVjZWl2ZSBidWZmZXIgKi8KKwlfX3U4CQkgICpmaWZvX3N0YXR1czsKKworCWlvYnVmZl90ICAJICByeF9idWZmOwkvKiByZWNlaXZlIHVud3JhcCBzdGF0ZSBtYWNoaW5lICovCisJc3RydWN0IHRpbWV2YWwJICByeF90aW1lOworCWludAkJICByZWNlaXZpbmc7CisJc3RydWN0IHVyYgkgKnJ4X3VyYjsKK307CisKKworLyogVGhlc2UgYXJlIHRoZSBjdXJyZW50bHkga25vd24gVVNCIGlkcyAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRvbmdsZXNbXSA9IHsKKyAgICAvKiBTaWdtYVRlbCwgSW5jLCAgU1RJcjQyMDAgSXJEQS9VU0IgQnJpZGdlICovCisgICAgeyBVU0JfREVWSUNFKDB4MDY2ZiwgMHg0MjAwKSB9LAorICAgIHsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGRvbmdsZXMpOworCisvKiBTZW5kIGNvbnRyb2wgbWVzc2FnZSB0byBzZXQgZG9uZ2xlIHJlZ2lzdGVyICovCitzdGF0aWMgaW50IHdyaXRlX3JlZyhzdHJ1Y3Qgc3Rpcl9jYiAqc3RpciwgX191MTYgcmVnLCBfX3U4IHZhbHVlKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBzdGlyLT51c2JkZXY7CisKKwlwcl9kZWJ1ZygiJXM6IHdyaXRlIHJlZyAlZCA9IDB4JXhcbiIsCisJCSBzdGlyLT5uZXRkZXYtPm5hbWUsIHJlZywgdmFsdWUpOworCXJldHVybiB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKKwkJCSAgICAgICBSRVFfV1JJVEVfU0lOR0xFLAorCQkJICAgICAgIFVTQl9ESVJfT1VUfFVTQl9UWVBFX1ZFTkRPUnxVU0JfUkVDSVBfREVWSUNFLAorCQkJICAgICAgIHZhbHVlLCByZWcsIE5VTEwsIDAsCisJCQkgICAgICAgQ1RSTF9USU1FT1VUKTsKK30KKworLyogU2VuZCBjb250cm9sIG1lc3NhZ2UgdG8gcmVhZCBtdWx0aXBsZSByZWdpc3RlcnMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJlYWRfcmVnKHN0cnVjdCBzdGlyX2NiICpzdGlyLCBfX3UxNiByZWcsCisJCSAgICBfX3U4ICpkYXRhLCBfX3UxNiBjb3VudCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gc3Rpci0+dXNiZGV2OworCisJcmV0dXJuIHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsIDApLAorCQkJICAgICAgIFJFUV9SRUFEX1JFRywKKwkJCSAgICAgICBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCSAgICAgICAwLCByZWcsIGRhdGEsIGNvdW50LAorCQkJICAgICAgIENUUkxfVElNRU9VVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzZmlyKHUzMiBzcGVlZCkKK3sKKwlyZXR1cm4gKHNwZWVkID09IDQwMDAwMDApOworfQorCisvKgorICogUHJlcGFyZSBhIEZJUiBJckRBIGZyYW1lIGZvciB0cmFuc21pc3Npb24gdG8gdGhlIFVTQiBkb25nbGUuICBUaGUKKyAqIEZJUiB0cmFuc21pdCBmcmFtZSBpcyBkb2N1bWVudGVkIGluIHRoZSBkYXRhc2hlZXQuICBJdCBjb25zaXN0cyBvZgorICogYSB0d28gYnl0ZSAweDU1IDB4QUEgc2VxdWVuY2UsIHR3byBsaXR0bGUtZW5kaWFuIGxlbmd0aCBieXRlcywgYQorICogc2VxdWVuY2Ugb2YgZXhhY3RseSAxNiBYQk9GIGJ5dGVzIG9mIDB4N0UsIHR3byBCT0YgYnl0ZXMgb2YgMHg3RSwKKyAqIHRoZW4gdGhlIGRhdGEgZXNjYXBlZCBhcyBmb2xsb3dzOgorICoKKyAqICAgIDB4N0QgLT4gMHg3RCAweDVECisgKiAgICAweDdFIC0+IDB4N0QgMHg1RQorICogICAgMHg3RiAtPiAweDdEIDB4NUYKKyAqCisgKiBUaGVuLCA0IGJ5dGVzIG9mIGxpdHRsZSBlbmRpYW4gKHN0dWZmZWQpIEZDUyBmb2xsb3csIHRoZW4gdHdvCisgKiB0cmFpbGluZyBFT0YgYnl0ZXMgb2YgMHg3RS4KKyAqLworc3RhdGljIGlubGluZSBfX3U4ICpzdHVmZl9maXIoX191OCAqcCwgX191OCBjKQoreworCXN3aXRjaChjKSB7CisJY2FzZSAweDdkOgorCWNhc2UgMHg3ZToKKwljYXNlIDB4N2Y6CisJCSpwKysgPSAweDdkOworCQljIF49IElSREFfVFJBTlM7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWRlZmF1bHQ6CisJCSpwKysgPSBjOworCX0KKwlyZXR1cm4gcDsKK30KKworLyogVGFrZSByYXcgZGF0YSBpbiBza2IgYW5kIHB1dCBpdCB3cmFwcGVkIGludG8gYnVmICovCitzdGF0aWMgdW5zaWduZWQgd3JhcF9maXJfc2tiKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIF9fdTggKmJ1ZikKK3sKKwlfX3U4ICpwdHIgPSBidWY7CisJX191MzIgZmNzID0gfihjcmMzMl9sZSh+MCwgc2tiLT5kYXRhLCBza2ItPmxlbikpOworCV9fdTE2IHdyYXBsZW47CisJaW50IGk7CisKKwkvKiBIZWFkZXIgKi8KKwlidWZbMF0gPSAweDU1OworCWJ1ZlsxXSA9IDB4QUE7CisKKwlwdHIgPSBidWYgKyBTVElSX0lSREFfSEVBREVSOworCW1lbXNldChwdHIsIDB4N2YsIDE2KTsKKwlwdHIgKz0gMTY7CisKKwkvKiBCT0YgKi8KKwkqcHRyKysgID0gMHg3ZTsKKwkqcHRyKysgID0gMHg3ZTsKKworCS8qIEFkZHJlc3MgLyBDb250cm9sIC8gSW5mb3JtYXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2tiLT5sZW47IGkrKykKKwkJcHRyID0gc3R1ZmZfZmlyKHB0ciwgc2tiLT5kYXRhW2ldKTsKKworCS8qIEZDUyAqLworCXB0ciA9IHN0dWZmX2ZpcihwdHIsIGZjcyAmIDB4ZmYpOworCXB0ciA9IHN0dWZmX2ZpcihwdHIsIChmY3MgPj4gOCkgJiAweGZmKTsKKwlwdHIgPSBzdHVmZl9maXIocHRyLCAoZmNzID4+IDE2KSAmIDB4ZmYpOworCXB0ciA9IHN0dWZmX2ZpcihwdHIsIChmY3MgPj4gMjQpICYgMHhmZik7CisKKwkvKiBFT0ZzICovCisJKnB0cisrID0gMHg3ZTsKKwkqcHRyKysgPSAweDdlOworCisJLyogVG90YWwgbGVuZ3RoLCBtaW51cyB0aGUgaGVhZGVyICovCisJd3JhcGxlbiA9IChwdHIgLSBidWYpIC0gU1RJUl9JUkRBX0hFQURFUjsKKwlidWZbMl0gPSB3cmFwbGVuICYgMHhmZjsKKwlidWZbM10gPSAod3JhcGxlbiA+PiA4KSAmIDB4ZmY7CisKKwlyZXR1cm4gd3JhcGxlbiArIFNUSVJfSVJEQV9IRUFERVI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCB3cmFwX3Npcl9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgX191OCAqYnVmKQoreworCV9fdTE2IHdyYXBsZW47CisKKwl3cmFwbGVuID0gYXN5bmNfd3JhcF9za2Ioc2tiLCBidWYgKyBTVElSX0lSREFfSEVBREVSLAorCQkJCSBTVElSX0ZJRk9fU0laRSAtIFNUSVJfSVJEQV9IRUFERVIpOworCWJ1ZlswXSA9IDB4NTU7CisJYnVmWzFdID0gMHhBQTsKKwlidWZbMl0gPSB3cmFwbGVuICYgMHhmZjsKKwlidWZbM10gPSAod3JhcGxlbiA+PiA4KSAmIDB4ZmY7CisKKwlyZXR1cm4gd3JhcGxlbiArIFNUSVJfSVJEQV9IRUFERVI7Cit9CisKKy8qCisgKiBGcmFtZSBpcyBmdWxseSBmb3JtZWQgaW4gdGhlIHJ4X2J1ZmYgc28gY2hlY2sgY3JjCisgKiBhbmQgcGFzcyB1cCB0byBpcmxhcAorICogc2V0dXAgZm9yIG5leHQgcmVjZWl2ZQorICovCitzdGF0aWMgdm9pZCBmaXJfZW9mKHN0cnVjdCBzdGlyX2NiICpzdGlyKQoreworCWlvYnVmZl90ICpyeF9idWZmID0gJnN0aXItPnJ4X2J1ZmY7CisJaW50IGxlbiA9IHJ4X2J1ZmYtPmxlbiAtIDQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm5za2I7CisJX191MzIgZmNzOworCisJaWYgKHVubGlrZWx5KGxlbiA8PSAwKSkgeworCQlwcl9kZWJ1ZygiJXM6IHNob3J0IGZyYW1lIGxlbiAlZFxuIiwKKwkJCSBzdGlyLT5uZXRkZXYtPm5hbWUsIGxlbik7CisKKwkJKytzdGlyLT5zdGF0cy5yeF9lcnJvcnM7CisJCSsrc3Rpci0+c3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKKwkJcmV0dXJuOworCX0KKworCWZjcyA9IH4oY3JjMzJfbGUofjAsIHJ4X2J1ZmYtPmRhdGEsIGxlbikpOworCWlmIChmY3MgIT0gbGUzMl90b19jcHUoZ2V0X3VuYWxpZ25lZCgodTMyICopKHJ4X2J1ZmYtPmRhdGErbGVuKSkpKSB7CisJCXByX2RlYnVnKCJjcmMgZXJyb3IgY2FsYyAweCV4IGxlbiAlZFxuIiwgZmNzLCBsZW4pOworCQlzdGlyLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJc3Rpci0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQlyZXR1cm47CisJfQorCisJLyogaWYgZnJhbWUgaXMgc2hvcnQgdGhlbiBqdXN0IGNvcHkgaXQgKi8KKwlpZiAobGVuIDwgSVJEQV9SWF9DT1BZX1RIUkVTSE9MRCkgeworCQluc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyAxKTsKKwkJaWYgKHVubGlrZWx5KCFuc2tiKSkgeworCQkJKytzdGlyLT5zdGF0cy5yeF9kcm9wcGVkOworCQkJcmV0dXJuOworCQl9CisJCXNrYl9yZXNlcnZlKG5za2IsIDEpOworCQlza2IgPSBuc2tiOworCQltZW1jcHkobnNrYi0+ZGF0YSwgcnhfYnVmZi0+ZGF0YSwgbGVuKTsKKwl9IGVsc2UgeworCQluc2tiID0gZGV2X2FsbG9jX3NrYihyeF9idWZmLT50cnVlc2l6ZSk7CisJCWlmICh1bmxpa2VseSghbnNrYikpIHsKKwkJCSsrc3Rpci0+c3RhdHMucnhfZHJvcHBlZDsKKwkJCXJldHVybjsKKwkJfQorCQlza2JfcmVzZXJ2ZShuc2tiLCAxKTsKKwkJc2tiID0gcnhfYnVmZi0+c2tiOworCQlyeF9idWZmLT5za2IgPSBuc2tiOworCQlyeF9idWZmLT5oZWFkID0gbnNrYi0+ZGF0YTsKKwl9CisKKwlza2JfcHV0KHNrYiwgbGVuKTsKKworCXNrYi0+bWFjLnJhdyAgPSBza2ItPmRhdGE7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOworCXNrYi0+ZGV2ID0gc3Rpci0+bmV0ZGV2OworCisJbmV0aWZfcngoc2tiKTsKKworCXN0aXItPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlzdGlyLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisKKwlyeF9idWZmLT5kYXRhID0gcnhfYnVmZi0+aGVhZDsKKwlyeF9idWZmLT5sZW4gPSAwOworfQorCisvKiBVbndyYXAgRklSIHN0dWZmZWQgZGF0YSBhbmQgYnVtcCBpdCB0byBJckxBUCAqLworc3RhdGljIHZvaWQgc3Rpcl9maXJfY2hhcnMoc3RydWN0IHN0aXJfY2IgKnN0aXIsCisJCQkgICAgY29uc3QgX191OCAqYnl0ZXMsIGludCBsZW4pCit7CisJaW9idWZmX3QgKnJ4X2J1ZmYgPSAmc3Rpci0+cnhfYnVmZjsKKwlpbnQJaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlfX3U4CWJ5dGUgPSBieXRlc1tpXTsKKworCQlzd2l0Y2gocnhfYnVmZi0+c3RhdGUpIHsKKwkJY2FzZSBPVVRTSURFX0ZSQU1FOgorCQkJLyogaWdub3JlIGdhcmJhZ2UgdGlsbCBzdGFydCBvZiBmcmFtZSAqLworCQkJaWYgKHVubGlrZWx5KGJ5dGUgIT0gRklSX0VPRikpCisJCQkJY29udGludWU7CisJCQkvKiBOb3cgcmVjZWl2aW5nIGZyYW1lICovCisJCQlyeF9idWZmLT5zdGF0ZSA9IEJFR0lOX0ZSQU1FOworCisJCQkvKiBUaW1lIHRvIGluaXRpYWxpemUgcmVjZWl2ZSBidWZmZXIgKi8KKwkJCXJ4X2J1ZmYtPmRhdGEgPSByeF9idWZmLT5oZWFkOworCQkJcnhfYnVmZi0+bGVuID0gMDsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgTElOS19FU0NBUEU6CisJCQlpZiAoYnl0ZSA9PSBGSVJfRU9GKSB7CisJCQkJcHJfZGVidWcoIiVzOiBnb3QgRU9GIGFmdGVyIGVzY2FwZVxuIiwKKwkJCQkJIHN0aXItPm5ldGRldi0+bmFtZSk7CisJCQkJZ290byBmcmFtZV9lcnJvcjsKKwkJCX0KKwkJCXJ4X2J1ZmYtPnN0YXRlID0gSU5TSURFX0ZSQU1FOworCQkJYnl0ZSBePSBJUkRBX1RSQU5TOworCQkJYnJlYWs7CisKKwkJY2FzZSBCRUdJTl9GUkFNRToKKwkJCS8qIGlnbm9yZSBtdWx0aXBsZSBCT0YvRU9GICovCisJCQlpZiAoYnl0ZSA9PSBGSVJfRU9GKQorCQkJCWNvbnRpbnVlOworCQkJcnhfYnVmZi0+c3RhdGUgPSBJTlNJREVfRlJBTUU7CisJCQlyeF9idWZmLT5pbl9mcmFtZSA9IFRSVUU7CisKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIElOU0lERV9GUkFNRToKKwkJCXN3aXRjaChieXRlKSB7CisJCQljYXNlIEZJUl9DRToKKwkJCQlyeF9idWZmLT5zdGF0ZSA9IExJTktfRVNDQVBFOworCQkJCWNvbnRpbnVlOworCQkJY2FzZSBGSVJfWEJPRjoKKwkJCQkvKiAweDdmIGlzIG5vdCB1c2VkIGluIHRoaXMgZnJhbWluZyAqLworCQkJCXByX2RlYnVnKCIlczogZ290IFhCT0Ygd2l0aG91dCBlc2NhcGVcbiIsCisJCQkJCSBzdGlyLT5uZXRkZXYtPm5hbWUpOworCQkJCWdvdG8gZnJhbWVfZXJyb3I7CisJCQljYXNlIEZJUl9FT0Y6CisJCQkJcnhfYnVmZi0+c3RhdGUgPSBPVVRTSURFX0ZSQU1FOworCQkJCXJ4X2J1ZmYtPmluX2ZyYW1lID0gRkFMU0U7CisJCQkJZmlyX2VvZihzdGlyKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLyogYWRkIGJ5dGUgdG8gcnggYnVmZmVyICovCisJCWlmICh1bmxpa2VseShyeF9idWZmLT5sZW4gPj0gcnhfYnVmZi0+dHJ1ZXNpemUpKSB7CisJCQlwcl9kZWJ1ZygiJXM6IGZpciBmcmFtZSBleGNlZWRzICVkXG4iLAorCQkJCSBzdGlyLT5uZXRkZXYtPm5hbWUsIHJ4X2J1ZmYtPnRydWVzaXplKTsKKwkJCSsrc3Rpci0+c3RhdHMucnhfb3Zlcl9lcnJvcnM7CisJCQlnb3RvIGVycm9yX3JlY292ZXJ5OworCQl9CisKKwkJcnhfYnVmZi0+ZGF0YVtyeF9idWZmLT5sZW4rK10gPSBieXRlOworCQljb250aW51ZTsKKworCWZyYW1lX2Vycm9yOgorCQkrK3N0aXItPnN0YXRzLnJ4X2ZyYW1lX2Vycm9yczsKKworCWVycm9yX3JlY292ZXJ5OgorCQkrK3N0aXItPnN0YXRzLnJ4X2Vycm9yczsKKwkJcnhfYnVmZi0+c3RhdGUgPSBPVVRTSURFX0ZSQU1FOworCQlyeF9idWZmLT5pbl9mcmFtZSA9IEZBTFNFOworCX0KK30KKworLyogVW53cmFwIFNJUiBzdHVmZmVkIGRhdGEgYW5kIGJ1bXAgaXQgdXAgdG8gSXJMQVAgKi8KK3N0YXRpYyB2b2lkIHN0aXJfc2lyX2NoYXJzKHN0cnVjdCBzdGlyX2NiICpzdGlyLAorCQkJICAgIGNvbnN0IF9fdTggKmJ5dGVzLCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlhc3luY191bndyYXBfY2hhcihzdGlyLT5uZXRkZXYsICZzdGlyLT5zdGF0cywKKwkJCQkgICZzdGlyLT5yeF9idWZmLCBieXRlc1tpXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1bndyYXBfY2hhcnMoc3RydWN0IHN0aXJfY2IgKnN0aXIsCisJCQkJY29uc3QgX191OCAqYnl0ZXMsIGludCBsZW5ndGgpCit7CisJaWYgKGlzZmlyKHN0aXItPnNwZWVkKSkKKwkJc3Rpcl9maXJfY2hhcnMoc3RpciwgYnl0ZXMsIGxlbmd0aCk7CisJZWxzZQorCQlzdGlyX3Npcl9jaGFycyhzdGlyLCBieXRlcywgbGVuZ3RoKTsKK30KKworLyogTW9kZSBwYXJhbWV0ZXJzIGZvciBlYWNoIHNwZWVkICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1bnNpZ25lZCBzcGVlZDsKKwlfX3U4IHBkY2xrOworfSBzdGlyX21vZGVzW10gPSB7CisgICAgICAgIHsgMjQwMCwgICAgUERDTEtfMjQwMCB9LAorICAgICAgICB7IDk2MDAsICAgIFBEQ0xLXzk2MDAgfSwKKyAgICAgICAgeyAxOTIwMCwgICBQRENMS18xOTIwMCB9LAorICAgICAgICB7IDM4NDAwLCAgIFBEQ0xLXzM4NDAwIH0sCisgICAgICAgIHsgNTc2MDAsICAgUERDTEtfNTc2MDAgfSwKKyAgICAgICAgeyAxMTUyMDAsICBQRENMS18xMTUyMDAgfSwKKyAgICAgICAgeyA0MDAwMDAwLCBQRENMS180MDAwMDAwIH0sCit9OworCisKKy8qCisgKiBTZXR1cCBjaGlwIGZvciBzcGVlZC4KKyAqICBDYWxsZWQgYXQgc3RhcnR1cCB0byBpbml0aWFsaXplIHRoZSBjaGlwCisgKiAgYW5kIG9uIHNwZWVkIGNoYW5nZXMuCisgKgorICogTm90ZTogV3JpdGUgbXVsdGlwbGUgcmVnaXN0ZXJzIGRvZXNuJ3QgYXBwZWFyIHRvIHdvcmsKKyAqLworc3RhdGljIGludCBjaGFuZ2Vfc3BlZWQoc3RydWN0IHN0aXJfY2IgKnN0aXIsIHVuc2lnbmVkIHNwZWVkKQoreworCWludCBpLCBlcnI7CisJX191OCBtb2RlOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3Rpcl9tb2Rlcyk7ICsraSkgeworCQlpZiAoc3BlZWQgPT0gc3Rpcl9tb2Rlc1tpXS5zcGVlZCkKKwkJCWdvdG8gZm91bmQ7CisJfQorCisJd2FybigiJXM6IGludmFsaWQgc3BlZWQgJWQiLCBzdGlyLT5uZXRkZXYtPm5hbWUsIHNwZWVkKTsKKwlyZXR1cm4gLUVJTlZBTDsKKworIGZvdW5kOgorCXByX2RlYnVnKCJzcGVlZCBjaGFuZ2UgZnJvbSAlZCB0byAlZFxuIiwgc3Rpci0+c3BlZWQsIHNwZWVkKTsKKworCS8qIFJlc2V0IG1vZHVsYXRvciAqLworCWVyciA9IHdyaXRlX3JlZyhzdGlyLCBSRUdfQ1RSTDEsIENUUkwxX1NSRVNFVCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwkvKiBVbmRvY3VtZW50ZWQgbWFnaWMgdG8gdHdlYWsgdGhlIERQTEwgKi8KKwllcnIgPSB3cml0ZV9yZWcoc3RpciwgUkVHX0RQTEwsIDB4MTUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyogU2V0IGNsb2NrICovCisJZXJyID0gd3JpdGVfcmVnKHN0aXIsIFJFR19QRENMSywgc3Rpcl9tb2Rlc1tpXS5wZGNsayk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwltb2RlID0gTU9ERV9OUkVTRVQgfCBNT0RFX0ZBU1RSWDsKKwlpZiAoaXNmaXIoc3BlZWQpKQorCQltb2RlIHw9IE1PREVfRklSIHwgTU9ERV9GRlJTVEVOOworCWVsc2UKKwkJbW9kZSB8PSBNT0RFX1NJUjsKKworCWlmIChzcGVlZCA9PSAyNDAwKQorCQltb2RlIHw9IE1PREVfMjQwMDsKKworCWVyciA9IHdyaXRlX3JlZyhzdGlyLCBSRUdfTU9ERSwgbW9kZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwkvKiBUaGlzIHJlc2V0cyBURU1JQyBzdHlsZSB0cmFuc2NlaXZlciBpZiBhbnkuICovCisJZXJyID0gd3JpdGVfcmVnKHN0aXIsIFJFR19DVFJMMSwKKwkJCUNUUkwxX1NETU9ERSB8ICh0eF9wb3dlciAmIDMpIDw8IDEpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gd3JpdGVfcmVnKHN0aXIsIFJFR19DVFJMMSwgKHR4X3Bvd2VyICYgMykgPDwgMSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwkvKiBSZXNldCBzZW5zaXRpdml0eSAqLworCWVyciA9IHdyaXRlX3JlZyhzdGlyLCBSRUdfQ1RSTDIsIChyeF9zZW5zaXRpdml0eSAmIDcpIDw8IDUpOworIG91dDoKKwlzdGlyLT5zcGVlZCA9IHNwZWVkOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDYWxsZWQgZnJvbSBuZXQvY29yZSB3aGVuIG5ldyBmcmFtZSBpcyBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBpbnQgc3Rpcl9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qgc3Rpcl9jYiAqc3RpciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwkvKiB0aGUgSVJEQSB3cmFwcGluZyByb3V0aW5lcyBkb24ndCBkZWFsIHdpdGggbm9uIGxpbmVhciBza2IgKi8KKwlTS0JfTElORUFSX0FTU0VSVChza2IpOworCisJc2tiID0geGNoZygmc3Rpci0+dHhfcGVuZGluZywgc2tiKTsKKwl3YWtlX3VwKCZzdGlyLT50aHJfd2FpdCk7CisJCisJLyogdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIHVubGVzcyBzdG9wL3dha2V1cCBwcm9ibGVtICovCisJaWYgKHVubGlrZWx5KHNrYikpIHsKKwkJV0FSTl9PTigxKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogV2FpdCBmb3IgdGhlIHRyYW5zbWl0IEZJRk8gdG8gaGF2ZSBzcGFjZSBmb3IgbmV4dCBkYXRhCisgKgorICogSWYgc3BhY2UgPCAwIHRoZW4gd2FpdCB0aWxsIEZJRk8gY29tcGxldGVseSBkcmFpbnMuCisgKiBGWUk6IGNhbiB0YWtlIHVwIHRvIDEzIHNlY29uZHMgYXQgMjQwMGJhdWQuCisgKi8KK3N0YXRpYyBpbnQgZmlmb190eHdhaXQoc3RydWN0IHN0aXJfY2IgKnN0aXIsIGludCBzcGFjZSkKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgY291bnQsIHN0YXR1czsKKworCS8qIFJlYWQgRklGTyBzdGF0dXMgYW5kIGNvdW50ICovCisJZm9yKDs7KSB7CisJCWVyciA9IHJlYWRfcmVnKHN0aXIsIFJFR19GSUZPQ1RMLCBzdGlyLT5maWZvX3N0YXR1cywgCisJCQkJICAgRklGT19SRUdTX1NJWkUpOworCQlpZiAodW5saWtlbHkoZXJyICE9IEZJRk9fUkVHU19TSVpFKSkgeworCQkJd2FybigiJXM6IEZJRk8gcmVnaXN0ZXIgcmVhZCBlcnJvcjogJWQiLCAKKwkJCSAgICAgc3Rpci0+bmV0ZGV2LT5uYW1lLCBlcnIpOworCisJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJc3RhdHVzID0gc3Rpci0+Zmlmb19zdGF0dXNbMF07CisJCWNvdW50ID0gKHVuc2lnbmVkKShzdGlyLT5maWZvX3N0YXR1c1syXSAmIDB4MWYpIDw8IDggCisJCQl8IHN0aXItPmZpZm9fc3RhdHVzWzFdOworCisJCXByX2RlYnVnKCJmaWZvIHN0YXR1cyAweCVseCBjb3VudCAlbHVcbiIsIHN0YXR1cywgY291bnQpOworCisJCS8qIGVycm9yIHdoZW4gcmVjZWl2ZS90cmFuc21pdCBmaWZvIGdldHMgY29uZnVzZWQgKi8KKwkJaWYgKHN0YXR1cyAmIEZJRk9DVExfUlhFUlIpIHsKKwkJCXN0aXItPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQlzdGlyLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHN0YXR1cyAmIEZJRk9DVExfVFhFUlIpIHsKKwkJCXN0aXItPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQlzdGlyLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogaXMgZmlmbyByZWNlaXZpbmcgYWxyZWFkeSwgb3IgZW1wdHkgKi8KKwkJaWYgKCEoc3RhdHVzICYgRklGT0NUTF9ESVIpCisJCSAgICB8fCAoc3RhdHVzICYgRklGT0NUTF9FTVBUWSkpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVJTlRSOworCisJCS8qIHNodXR0aW5nIGRvd24/ICovCisJCWlmICghbmV0aWZfcnVubmluZyhzdGlyLT5uZXRkZXYpCisJCSAgICB8fCAhbmV0aWZfZGV2aWNlX3ByZXNlbnQoc3Rpci0+bmV0ZGV2KSkKKwkJCXJldHVybiAtRVNIVVRET1dOOworCisJCS8qIG9ubHkgd2FpdGluZyBmb3Igc29tZSBzcGFjZSAqLworCQlpZiAoc3BhY2UgPj0gMCAmJiBTVElSX0ZJRk9fU0laRSAtIDQgPiBzcGFjZSArIGNvdW50KQorCQkJcmV0dXJuIDA7CisKKwkJLyogZXN0aW1hdGUgdHJhbnNmZXIgdGltZSBmb3IgcmVtYWluaW5nIGNoYXJzICovCisJCW1zbGVlcCgoY291bnQgKiA4MDAwKSAvIHN0aXItPnNwZWVkKTsKKwl9CisJCQkKKwllcnIgPSB3cml0ZV9yZWcoc3RpciwgUkVHX0ZJRk9DVEwsIEZJRk9DVExfQ0xSKTsKKwlpZiAoZXJyKSAKKwkJcmV0dXJuIGVycjsKKwllcnIgPSB3cml0ZV9yZWcoc3RpciwgUkVHX0ZJRk9DVEwsIDApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBXYWl0IGZvciB0dXJuYXJvdW5kIGRlbGF5IGJlZm9yZSBzdGFydGluZyB0cmFuc21pdC4gICovCitzdGF0aWMgdm9pZCB0dXJuYXJvdW5kX2RlbGF5KGNvbnN0IHN0cnVjdCBzdGlyX2NiICpzdGlyLCBsb25nIHVzKQoreworCWxvbmcgdGlja3M7CisJc3RydWN0IHRpbWV2YWwgbm93OworCisJaWYgKHVzIDw9IDApCisJCXJldHVybjsKKworCWRvX2dldHRpbWVvZmRheSgmbm93KTsKKwlpZiAobm93LnR2X3NlYyAtIHN0aXItPnJ4X3RpbWUudHZfc2VjID4gMCkKKwkJdXMgLT0gVVNFQ19QRVJfU0VDOworCXVzIC09IG5vdy50dl91c2VjIC0gc3Rpci0+cnhfdGltZS50dl91c2VjOworCWlmICh1cyA8IDEwKQorCQlyZXR1cm47CisKKwl0aWNrcyA9IHVzIC8gKDEwMDAwMDAgLyBIWik7CisJaWYgKHRpY2tzID4gMCkgeworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwkJc2NoZWR1bGVfdGltZW91dCgxICsgdGlja3MpOworCX0gZWxzZQorCQl1ZGVsYXkodXMpOworfQorCisvKgorICogU3RhcnQgcmVjZWl2ZXIgYnkgc3VibWl0dGluZyBhIHJlcXVlc3QgdG8gdGhlIHJlY2VpdmUgcGlwZS4KKyAqIElmIG5vdGhpbmcgaXMgYXZhaWxhYmxlIGl0IHdpbGwgcmV0dXJuIGFmdGVyIHJ4X2ludGVydmFsLgorICovCitzdGF0aWMgaW50IHJlY2VpdmVfc3RhcnQoc3RydWN0IHN0aXJfY2IgKnN0aXIpCit7CisJLyogcmVzZXQgc3RhdGUgKi8KKwlzdGlyLT5yZWNlaXZpbmcgPSAxOworCisJc3Rpci0+cnhfYnVmZi5pbl9mcmFtZSA9IEZBTFNFOworCXN0aXItPnJ4X2J1ZmYuc3RhdGUgPSBPVVRTSURFX0ZSQU1FOworCisJc3Rpci0+cnhfdXJiLT5zdGF0dXMgPSAwOworCXJldHVybiB1c2Jfc3VibWl0X3VyYihzdGlyLT5yeF91cmIsIEdGUF9LRVJORUwpOworfQorCisvKiBTdG9wIGFsbCBwZW5kaW5nIHJlY2VpdmUgVXJiJ3MgKi8KK3N0YXRpYyB2b2lkIHJlY2VpdmVfc3RvcChzdHJ1Y3Qgc3Rpcl9jYiAqc3RpcikKK3sKKwlzdGlyLT5yZWNlaXZpbmcgPSAwOworCXVzYl9raWxsX3VyYihzdGlyLT5yeF91cmIpOworCisJaWYgKHN0aXItPnJ4X2J1ZmYuaW5fZnJhbWUpIAorCQlzdGlyLT5zdGF0cy5jb2xsaXNpb25zKys7Cit9CisvKgorICogV3JhcCBkYXRhIGluIHNvY2tldCBidWZmZXIgYW5kIHNlbmQgaXQuCisgKi8KK3N0YXRpYyB2b2lkIHN0aXJfc2VuZChzdHJ1Y3Qgc3Rpcl9jYiAqc3Rpciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1bnNpZ25lZCB3cmFwbGVuOworCWludCBmaXJzdF9mcmFtZSA9IDA7CisKKwkvKiBpZiByZWNlaXZpbmcsIG5lZWQgdG8gdHVybmFyb3VuZCAqLworCWlmIChzdGlyLT5yZWNlaXZpbmcpIHsKKwkJcmVjZWl2ZV9zdG9wKHN0aXIpOworCQl0dXJuYXJvdW5kX2RlbGF5KHN0aXIsIGlyZGFfZ2V0X210dChza2IpKTsKKwkJZmlyc3RfZnJhbWUgPSAxOworCX0KKworCWlmIChpc2ZpcihzdGlyLT5zcGVlZCkpCisJCXdyYXBsZW4gPSB3cmFwX2Zpcl9za2Ioc2tiLCBzdGlyLT5pb19idWYpOworCWVsc2UKKwkJd3JhcGxlbiA9IHdyYXBfc2lyX3NrYihza2IsIHN0aXItPmlvX2J1Zik7CisJCQorCS8qIGNoZWNrIGZvciBzcGFjZSBhdmFpbGFibGUgaW4gZmlmbyAqLworCWlmICghZmlyc3RfZnJhbWUpCisJCWZpZm9fdHh3YWl0KHN0aXIsIHdyYXBsZW4pOworCisJc3Rpci0+c3RhdHMudHhfcGFja2V0cysrOworCXN0aXItPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCXN0aXItPm5ldGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXByX2RlYnVnKCJzZW5kICVkICglZClcbiIsIHNrYi0+bGVuLCB3cmFwbGVuKTsKKworCWlmICh1c2JfYnVsa19tc2coc3Rpci0+dXNiZGV2LCB1c2Jfc25kYnVsa3BpcGUoc3Rpci0+dXNiZGV2LCAxKSwKKwkJCSBzdGlyLT5pb19idWYsIHdyYXBsZW4sCisJCQkgTlVMTCwgVFJBTlNNSVRfVElNRU9VVCkpCisJCXN0aXItPnN0YXRzLnR4X2Vycm9ycysrOworfQorCisvKgorICogVHJhbnNtaXQgc3RhdGUgbWFjaGluZSB0aHJlYWQKKyAqLworc3RhdGljIGludCBzdGlyX3RyYW5zbWl0X3RocmVhZCh2b2lkICphcmcpCit7CisJc3RydWN0IHN0aXJfY2IgKnN0aXIgPSBhcmc7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHN0aXItPm5ldGRldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJZGFlbW9uaXplKCIlcyIsIGRldi0+bmFtZSk7CisJYWxsb3dfc2lnbmFsKFNJR1RFUk0pOworCisJd2hpbGUgKG5ldGlmX3J1bm5pbmcoZGV2KQorCSAgICAgICAmJiBuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpCisJICAgICAgICYmICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwl7CisjaWZkZWYgQ09ORklHX1BNCisJCS8qIGlmIHN1c3BlbmRpbmcsIHRoZW4gcG93ZXIgb2ZmIGFuZCB3YWl0ICovCisJCWlmICh1bmxpa2VseShjdXJyZW50LT5mbGFncyAmIFBGX0ZSRUVaRSkpIHsKKwkJCWlmIChzdGlyLT5yZWNlaXZpbmcpCisJCQkJcmVjZWl2ZV9zdG9wKHN0aXIpOworCQkJZWxzZQorCQkJCWZpZm9fdHh3YWl0KHN0aXIsIC0xKTsKKworCQkJd3JpdGVfcmVnKHN0aXIsIFJFR19DVFJMMSwgQ1RSTDFfVFhQV0R8Q1RSTDFfUlhQV0QpOworCisJCQlyZWZyaWdlcmF0b3IoUEZfRlJFRVpFKTsKKworCQkJaWYgKGNoYW5nZV9zcGVlZChzdGlyLCBzdGlyLT5zcGVlZCkpCisJCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCisJCS8qIGlmIHNvbWV0aGluZyB0byBzZW5kPyAqLworCQlza2IgPSB4Y2hnKCZzdGlyLT50eF9wZW5kaW5nLCBOVUxMKTsKKwkJaWYgKHNrYikgeworCQkJdW5zaWduZWQgbmV3X3NwZWVkID0gaXJkYV9nZXRfbmV4dF9zcGVlZChza2IpOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJCQlpZiAoc2tiLT5sZW4gPiAwKQorCQkJCXN0aXJfc2VuZChzdGlyLCBza2IpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCisJCQlpZiAoKG5ld19zcGVlZCAhPSAtMSkgJiYgKHN0aXItPnNwZWVkICE9IG5ld19zcGVlZCkpIHsKKwkJCQlpZiAoZmlmb190eHdhaXQoc3RpciwgLTEpIHx8CisJCQkJICAgIGNoYW5nZV9zcGVlZChzdGlyLCBuZXdfc3BlZWQpKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogbm90aGluZyB0byBzZW5kPyBzdGFydCByZWNlaXZpbmcgKi8KKwkJaWYgKCFzdGlyLT5yZWNlaXZpbmcgCisJCSAgICAmJiBpcmRhX2RldmljZV90eHF1ZXVlX2VtcHR5KGRldikpIHsKKwkJCS8qIFdhaXQgb3RoZXJ3aXNlIGNoaXAgZ2V0cyBjb25mdXNlZC4gKi8KKwkJCWlmIChmaWZvX3R4d2FpdChzdGlyLCAtMSkpCisJCQkJYnJlYWs7CisKKwkJCWlmICh1bmxpa2VseShyZWNlaXZlX3N0YXJ0KHN0aXIpKSkgeworCQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQkJCWluZm8oIiVzOiByZWNlaXZlIHVzYiBzdWJtaXQgZmFpbGVkIiwKKwkJCQkJICAgICBzdGlyLT5uZXRkZXYtPm5hbWUpOworCQkJCXN0aXItPnJlY2VpdmluZyA9IDA7CisJCQkJbXNsZWVwKDEwKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qIHNsZWVwIGlmIG5vdGhpbmcgdG8gc2VuZCAqLworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc3Rpci0+dGhyX3dhaXQsIHN0aXItPnR4X3BlbmRpbmcpOworCX0KKworCWNvbXBsZXRlX2FuZF9leGl0ICgmc3Rpci0+dGhyX2V4aXRlZCwgMCk7Cit9CisKKworLyoKKyAqIFVTQiBidWxrIHJlY2VpdmUgY29tcGxldGlvbiBjYWxsYmFjay4KKyAqIFdha2VzIHVwIGV2ZXJ5IG1zICh1c2Igcm91bmQgdHJpcCkgd2l0aCB3cmFwcGVkIAorICogZGF0YS4KKyAqLworc3RhdGljIHZvaWQgc3Rpcl9yY3ZfaXJxKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHN0aXJfY2IgKnN0aXIgPSB1cmItPmNvbnRleHQ7CisJaW50IGVycjsKKworCS8qIGluIHByb2Nlc3Mgb2Ygc3RvcHBpbmcsIGp1c3QgZHJvcCBkYXRhICovCisJaWYgKCFuZXRpZl9ydW5uaW5nKHN0aXItPm5ldGRldikpCisJCXJldHVybjsKKworCS8qIHVubGluaywgc2h1dGRvd24sIHVucGx1Zywgb3RoZXIgbmFzdGllcyAqLworCWlmICh1cmItPnN0YXR1cyAhPSAwKSAKKwkJcmV0dXJuOworCisJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+IDApIHsKKwkJcHJfZGVidWcoInJlY2VpdmUgJWRcbiIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCXVud3JhcF9jaGFycyhzdGlyLCB1cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJCSAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJCisJCXN0aXItPm5ldGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCWRvX2dldHRpbWVvZmRheSgmc3Rpci0+cnhfdGltZSk7CisJfQorCisJLyoga2VybmVsIHRocmVhZCBpcyBzdG9wcGluZyByZWNlaXZlciBkb24ndCByZXN1Ym1pdCAqLworCWlmICghc3Rpci0+cmVjZWl2aW5nKQorCQlyZXR1cm47CisKKwkvKiByZXN1Ym1pdCBleGlzdGluZyB1cmIgKi8KKwllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCisJLyogaW4gY2FzZSBvZiBlcnJvciwgdGhlIGtlcm5lbCB0aHJlYWQgd2lsbCByZXN0YXJ0IHVzICovCisJaWYgKGVycikgeworCQl3YXJuKCIlczogdXNiIHJlY2VpdmUgc3VibWl0IGVycm9yOiAlZCIsCisJCQlzdGlyLT5uZXRkZXYtPm5hbWUsIGVycik7CisJCXN0aXItPnJlY2VpdmluZyA9IDA7CisJCXdha2VfdXAoJnN0aXItPnRocl93YWl0KTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzdGlyX25ldF9vcGVuIChkZXYpCisgKgorICogICAgTmV0d29yayBkZXZpY2UgaXMgdGFrZW4gdXAuIFVzdWFsbHkgdGhpcyBpcyBkb25lIGJ5ICJpZmNvbmZpZyBpcmRhMCB1cCIKKyAqLworc3RhdGljIGludCBzdGlyX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IHN0aXJfY2IgKnN0aXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBlcnI7CisJY2hhciBod25hbWVbMTZdOworCisJZXJyID0gdXNiX2NsZWFyX2hhbHQoc3Rpci0+dXNiZGV2LCB1c2Jfc25kYnVsa3BpcGUoc3Rpci0+dXNiZGV2LCAxKSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0MTsKKwllcnIgPSB1c2JfY2xlYXJfaGFsdChzdGlyLT51c2JkZXYsIHVzYl9yY3ZidWxrcGlwZShzdGlyLT51c2JkZXYsIDIpKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXQxOworCisJZXJyID0gY2hhbmdlX3NwZWVkKHN0aXIsIDk2MDApOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dDE7CisKKwllcnIgPSAtRU5PTUVNOworCisJLyogSW5pdGlhbGl6ZSBmb3IgU0lSL0ZJUiB0byBjb3B5IGRhdGEgZGlyZWN0bHkgaW50byBza2IuICAqLworCXN0aXItPnJlY2VpdmluZyA9IDA7CisJc3Rpci0+cnhfYnVmZi50cnVlc2l6ZSA9IElSREFfU0tCX01BWF9NVFU7CisJc3Rpci0+cnhfYnVmZi5za2IgPSBkZXZfYWxsb2Nfc2tiKElSREFfU0tCX01BWF9NVFUpOworCWlmICghc3Rpci0+cnhfYnVmZi5za2IpIAorCQlnb3RvIGVycl9vdXQxOworCisJc2tiX3Jlc2VydmUoc3Rpci0+cnhfYnVmZi5za2IsIDEpOworCXN0aXItPnJ4X2J1ZmYuaGVhZCA9IHN0aXItPnJ4X2J1ZmYuc2tiLT5kYXRhOworCWRvX2dldHRpbWVvZmRheSgmc3Rpci0+cnhfdGltZSk7CisKKwlzdGlyLT5yeF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghc3Rpci0+cnhfdXJiKSAKKwkJZ290byBlcnJfb3V0MjsKKworCXN0aXItPmlvX2J1ZiA9IGttYWxsb2MoU1RJUl9GSUZPX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghc3Rpci0+aW9fYnVmKQorCQlnb3RvIGVycl9vdXQzOworCisJdXNiX2ZpbGxfYnVsa191cmIoc3Rpci0+cnhfdXJiLCBzdGlyLT51c2JkZXYsCisJCQkgIHVzYl9yY3ZidWxrcGlwZShzdGlyLT51c2JkZXYsIDIpLAorCQkJICBzdGlyLT5pb19idWYsIFNUSVJfRklGT19TSVpFLAorCQkJICBzdGlyX3Jjdl9pcnEsIHN0aXIpOworCisJc3Rpci0+Zmlmb19zdGF0dXMgPSBrbWFsbG9jKEZJRk9fUkVHU19TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0aXItPmZpZm9fc3RhdHVzKSAKKwkJZ290byBlcnJfb3V0NDsKKwkJCisJLyoKKwkgKiBOb3cgdGhhdCBldmVyeXRoaW5nIHNob3VsZCBiZSBpbml0aWFsaXplZCBwcm9wZXJseSwKKwkgKiBPcGVuIG5ldyBJckxBUCBsYXllciBpbnN0YW5jZSB0byB0YWtlIGNhcmUgb2YgdXMuLi4KKwkgKiBOb3RlIDogd2lsbCBzZW5kIGltbWVkaWF0ZWx5IGEgc3BlZWQgY2hhbmdlLi4uCisJICovCisJc3ByaW50Zihod25hbWUsICJ1c2IjJWQiLCBzdGlyLT51c2JkZXYtPmRldm51bSk7CisJc3Rpci0+aXJsYXAgPSBpcmxhcF9vcGVuKG5ldGRldiwgJnN0aXItPnFvcywgaHduYW1lKTsKKwlpZiAoIXN0aXItPmlybGFwKSB7CisJCWVycigic3RpcjQyMDA6IGlybGFwX29wZW4gZmFpbGVkIik7CisJCWdvdG8gZXJyX291dDU7CisJfQorCisJLyoqIFN0YXJ0IGtlcm5lbCB0aHJlYWQgZm9yIHRyYW5zbWl0LiAgKi8KKwlzdGlyLT50aHJfcGlkID0ga2VybmVsX3RocmVhZChzdGlyX3RyYW5zbWl0X3RocmVhZCwgc3RpciwKKwkJCQkgICAgICBDTE9ORV9GU3xDTE9ORV9GSUxFUyk7CisJaWYgKHN0aXItPnRocl9waWQgPCAwKSB7CisJCWVyciA9IHN0aXItPnRocl9waWQ7CisJCWVycigic3RpcjQyMDA6IHVuYWJsZSB0byBzdGFydCBrZXJuZWwgdGhyZWFkIik7CisJCWdvdG8gZXJyX291dDY7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKKworCXJldHVybiAwOworCisgZXJyX291dDY6CisJaXJsYXBfY2xvc2Uoc3Rpci0+aXJsYXApOworIGVycl9vdXQ1OgorCWtmcmVlKHN0aXItPmZpZm9fc3RhdHVzKTsKKyBlcnJfb3V0NDoKKwlrZnJlZShzdGlyLT5pb19idWYpOworIGVycl9vdXQzOgorCXVzYl9mcmVlX3VyYihzdGlyLT5yeF91cmIpOworIGVycl9vdXQyOgorCWtmcmVlX3NrYihzdGlyLT5yeF9idWZmLnNrYik7CisgZXJyX291dDE6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHN0aXJfbmV0X2Nsb3NlIChzdGlyKQorICoKKyAqICAgIE5ldHdvcmsgZGV2aWNlIGlzIHRha2VuIGRvd24uIFVzdWFsbHkgdGhpcyBpcyBkb25lIGJ5CisgKiAgICAiaWZjb25maWcgaXJkYTAgZG93biIKKyAqLworc3RhdGljIGludCBzdGlyX25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBzdGlyX2NiICpzdGlyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCS8qIFN0b3AgdHJhbnNtaXQgcHJvY2Vzc2luZyAqLworCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKworCS8qIEtpbGwgdHJhbnNtaXQgdGhyZWFkICovCisJa2lsbF9wcm9jKHN0aXItPnRocl9waWQsIFNJR1RFUk0sIDEpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnN0aXItPnRocl9leGl0ZWQpOworCWtmcmVlKHN0aXItPmZpZm9fc3RhdHVzKTsKKworCS8qIE1vcCB1cCByZWNlaXZlIHVyYidzICovCisJdXNiX2tpbGxfdXJiKHN0aXItPnJ4X3VyYik7CisJCisJa2ZyZWUoc3Rpci0+aW9fYnVmKTsKKwl1c2JfZnJlZV91cmIoc3Rpci0+cnhfdXJiKTsKKwlrZnJlZV9za2Ioc3Rpci0+cnhfYnVmZi5za2IpOworCisJLyogU3RvcCBhbmQgcmVtb3ZlIGluc3RhbmNlIG9mIElyTEFQICovCisJaWYgKHN0aXItPmlybGFwKQorCQlpcmxhcF9jbG9zZShzdGlyLT5pcmxhcCk7CisKKwlzdGlyLT5pcmxhcCA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIElPQ1RMcyA6IEV4dHJhIG91dC1vZi1iYW5kIG5ldHdvcmsgY29tbWFuZHMuLi4KKyAqLworc3RhdGljIGludCBzdGlyX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBpZl9pcmRhX3JlcSAqaXJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKSBycTsKKwlzdHJ1Y3Qgc3Rpcl9jYiAqc3RpciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ1NCQU5EV0lEVEg6IC8qIFNldCBiYW5kd2lkdGggKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQkvKiBDaGVjayBpZiB0aGUgZGV2aWNlIGlzIHN0aWxsIHRoZXJlICovCisJCWlmIChuZXRpZl9kZXZpY2VfcHJlc2VudChzdGlyLT5uZXRkZXYpKQorCQkJcmV0ID0gY2hhbmdlX3NwZWVkKHN0aXIsIGlycS0+aWZyX2JhdWRyYXRlKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTTUVESUFCVVNZOiAvKiBTZXQgbWVkaWEgYnVzeSAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCS8qIENoZWNrIGlmIHRoZSBJckRBIHN0YWNrIGlzIHN0aWxsIHRoZXJlICovCisJCWlmIChuZXRpZl9ydW5uaW5nKHN0aXItPm5ldGRldikpCisJCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShzdGlyLT5uZXRkZXYsIFRSVUUpOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dSRUNFSVZJTkc6CisJCS8qIE9ubHkgYXBwcm94aW1hdGVseSB0cnVlICovCisJCWlycS0+aWZyX3JlY2VpdmluZyA9IHN0aXItPnJlY2VpdmluZzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogR2V0IGRldmljZSBzdGF0cyAoZm9yIC9wcm9jL25ldC9kZXYgYW5kIGlmY29uZmlnKQorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0aXJfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBzdGlyX2NiICpzdGlyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlyZXR1cm4gJnN0aXItPnN0YXRzOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgVVNCIHN1YnN5c3RlbSBmb3IgZWFjaCBuZXcgZGV2aWNlCisgKiBpbiB0aGUgc3lzdGVtLiBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgb3VycywgYW5kIGluCisgKiB0aGlzIGNhc2Ugc3RhcnQgaGFuZGxpbmcgaXQuCisgKiBOb3RlIDogaXQgbWlnaHQgYmUgd29ydGggcHJvdGVjdGluZyB0aGlzIGZ1bmN0aW9uIGJ5IGEgZ2xvYmFsCisgKiBzcGlubG9jay4uLiBPciBub3QsIGJlY2F1c2UgbWF5YmUgVVNCIGFscmVhZHkgZGVhbCB3aXRoIHRoYXQuLi4KKyAqLworc3RhdGljIGludCBzdGlyX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHN0aXJfY2IgKnN0aXIgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQ7CisJaW50IHJldCA9IC1FTk9NRU07CisKKwkvKiBBbGxvY2F0ZSBuZXR3b3JrIGRldmljZSBjb250YWluZXIuICovCisJbmV0ID0gYWxsb2NfaXJkYWRldihzaXplb2YoKnN0aXIpKTsKKwlpZighbmV0KQorCQlnb3RvIGVycl9vdXQxOworCisJU0VUX01PRFVMRV9PV05FUihuZXQpOworCVNFVF9ORVRERVZfREVWKG5ldCwgJmludGYtPmRldik7CisJc3RpciA9IG5ldGRldl9wcml2KG5ldCk7CisJc3Rpci0+bmV0ZGV2ID0gbmV0OworCXN0aXItPnVzYmRldiA9IGRldjsKKworCXJldCA9IHVzYl9yZXNldF9jb25maWd1cmF0aW9uKGRldik7CisJaWYgKHJldCAhPSAwKSB7CisJCWVycigic3RpcjQyMDA6IHVzYiByZXNldCBjb25maWd1cmF0aW9uIGZhaWxlZCIpOworCQlnb3RvIGVycl9vdXQyOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIlNpZ21hVGVsIFNUSXI0MjAwIElSREEvVVNCIGZvdW5kIGF0IGFkZHJlc3MgJWQsICIKKwkJIlZlbmRvcjogJXgsIFByb2R1Y3Q6ICV4XG4iLAorCSAgICAgICBkZXYtPmRldm51bSwgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKKwkgICAgICAgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOworCisJLyogSW5pdGlhbGl6ZSBRb1MgZm9yIHRoaXMgZGV2aWNlICovCisJaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcygmc3Rpci0+cW9zKTsKKworCS8qIFRoYXQncyB0aGUgUnggY2FwYWJpbGl0eS4gKi8KKwlzdGlyLT5xb3MuYmF1ZF9yYXRlLmJpdHMgICAgICAgJj0gSVJfMjQwMCB8IElSXzk2MDAgfCBJUl8xOTIwMCB8CisJCQkJCSBJUl8zODQwMCB8IElSXzU3NjAwIHwgSVJfMTE1MjAwIHwKKwkJCQkJIChJUl80MDAwMDAwIDw8IDgpOworCXN0aXItPnFvcy5taW5fdHVybl90aW1lLmJpdHMgICAmPSBxb3NfbXR0X2JpdHM7CisJaXJkYV9xb3NfYml0c190b192YWx1ZSgmc3Rpci0+cW9zKTsKKworCWluaXRfY29tcGxldGlvbiAoJnN0aXItPnRocl9leGl0ZWQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQgKCZzdGlyLT50aHJfd2FpdCk7CisKKwkvKiBPdmVycmlkZSB0aGUgbmV0d29yayBmdW5jdGlvbnMgd2UgbmVlZCB0byB1c2UgKi8KKwluZXQtPmhhcmRfc3RhcnRfeG1pdCA9IHN0aXJfaGFyZF94bWl0OworCW5ldC0+b3BlbiAgICAgICAgICAgID0gc3Rpcl9uZXRfb3BlbjsKKwluZXQtPnN0b3AgICAgICAgICAgICA9IHN0aXJfbmV0X2Nsb3NlOworCW5ldC0+Z2V0X3N0YXRzCSAgICAgPSBzdGlyX25ldF9nZXRfc3RhdHM7CisJbmV0LT5kb19pb2N0bCAgICAgICAgPSBzdGlyX25ldF9pb2N0bDsKKworCXJldCA9IHJlZ2lzdGVyX25ldGRldihuZXQpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byBlcnJfb3V0MjsKKworCWluZm8oIklyREE6IFJlZ2lzdGVyZWQgU2lnbWFUZWwgZGV2aWNlICVzIiwgbmV0LT5uYW1lKTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50Ziwgc3Rpcik7CisKKwlyZXR1cm4gMDsKKworZXJyX291dDI6CisJZnJlZV9uZXRkZXYobmV0KTsKK2Vycl9vdXQxOgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGUgY3VycmVudCBkZXZpY2UgaXMgcmVtb3ZlZCwgdGhlIFVTQiBsYXllciB0ZWxsIHVzIHRvIHNodXQgaXQgZG93bi4uLgorICovCitzdGF0aWMgdm9pZCBzdGlyX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHN0aXJfY2IgKnN0aXIgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJaWYgKCFzdGlyKQorCQlyZXR1cm47CisKKwl1bnJlZ2lzdGVyX25ldGRldihzdGlyLT5uZXRkZXYpOworCWZyZWVfbmV0ZGV2KHN0aXItPm5ldGRldik7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworfQorCisjaWZkZWYgQ09ORklHX1BNCisvKiBQb3dlciBtYW5hZ2VtZW50IHN1c3BlbmQsIHNvIHBvd2VyIG9mZiB0aGUgdHJhbnNtaXR0ZXIvcmVjZWl2ZXIgKi8KK3N0YXRpYyBpbnQgc3Rpcl9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCB1MzIgc3RhdGUpCit7CisJc3RydWN0IHN0aXJfY2IgKnN0aXIgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJbmV0aWZfZGV2aWNlX2RldGFjaChzdGlyLT5uZXRkZXYpOworCXJldHVybiAwOworfQorCisvKiBDb21pbmcgb3V0IG9mIHN1c3BlbmQsIHNvIHJlc2V0IGhhcmR3YXJlICovCitzdGF0aWMgaW50IHN0aXJfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBzdGlyX2NiICpzdGlyID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCW5ldGlmX2RldmljZV9hdHRhY2goc3Rpci0+bmV0ZGV2KTsKKworCS8qIHJlY2VpdmVyIHJlc3RhcnRlZCB3aGVuIHNlbmQgdGhyZWFkIHdha2VzIHVwICovCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyoKKyAqIFVTQiBkZXZpY2UgY2FsbGJhY2tzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBpcmRhX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInN0aXI0MjAwIiwKKwkucHJvYmUJCT0gc3Rpcl9wcm9iZSwKKwkuZGlzY29ubmVjdAk9IHN0aXJfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUJPSBkb25nbGVzLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gc3Rpcl9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc3Rpcl9yZXN1bWUsCisjZW5kaWYKK307CisKKy8qCisgKiBNb2R1bGUgaW5zZXJ0aW9uCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHN0aXJfaW5pdCh2b2lkKQoreworCXJldHVybiB1c2JfcmVnaXN0ZXIoJmlyZGFfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHN0aXJfaW5pdCk7CisKKy8qCisgKiBNb2R1bGUgcmVtb3ZhbAorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgc3Rpcl9jbGVhbnVwKHZvaWQpCit7CisJLyogRGVyZWdpc3RlciB0aGUgZHJpdmVyIGFuZCByZW1vdmUgYWxsIHBlbmRpbmcgaW5zdGFuY2VzICovCisJdXNiX2RlcmVnaXN0ZXIoJmlyZGFfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHN0aXJfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Rla3JhbS1zaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvdGVrcmFtLXNpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZDZiYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3Rla3JhbS1zaXIuYwpAQCAtMCwwICsxLDIzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICB0ZWtyYW0uYworICogVmVyc2lvbjogICAgICAgMS4zCisgKiBEZXNjcmlwdGlvbjogICBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGVrcmFtIElyTWF0ZSBJUi0yMTBCIGRvbmdsZQorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgV2VkIE9jdCAyMSAyMDowMjozNSAxOTk4CisgKiBNb2RpZmllZCBhdDogICBTdW4gT2N0IDI3IDIyOjAyOjM4IDIwMDIKKyAqIE1vZGlmaWVkIGJ5OiAgIE1hcnRpbiBEaWVobCA8bWFkQG1kaWVobC5kZT4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpLAorICogICAgIENvcHlyaWdodCAoYykgMjAwMiBNYXJ0aW4gRGllaGwsCisgKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqICAgICAgCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisKKyNpbmNsdWRlICJzaXItZGV2LmgiCisKK3N0YXRpYyBpbnQgdGVrcmFtX2RlbGF5ID0gMTUwOwkJLyogZGVmYXVsdCBpcyAxNTAgbXMgKi8KK21vZHVsZV9wYXJhbSh0ZWtyYW1fZGVsYXksIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRla3JhbV9kZWxheSwgInRla3JhbSBkb25nbGUgd3JpdGUgY29tcGxldGUgZGVsYXkiKTsKKworc3RhdGljIGludCB0ZWtyYW1fb3BlbihzdHJ1Y3Qgc2lyX2RldiAqKTsKK3N0YXRpYyBpbnQgdGVrcmFtX2Nsb3NlKHN0cnVjdCBzaXJfZGV2ICopOworc3RhdGljIGludCB0ZWtyYW1fY2hhbmdlX3NwZWVkKHN0cnVjdCBzaXJfZGV2ICosIHVuc2lnbmVkKTsKK3N0YXRpYyBpbnQgdGVrcmFtX3Jlc2V0KHN0cnVjdCBzaXJfZGV2ICopOworCisjZGVmaW5lIFRFS1JBTV8xMTUyMDAgMHgwMAorI2RlZmluZSBURUtSQU1fNTc2MDAgIDB4MDEKKyNkZWZpbmUgVEVLUkFNXzM4NDAwICAweDAyCisjZGVmaW5lIFRFS1JBTV8xOTIwMCAgMHgwMworI2RlZmluZSBURUtSQU1fOTYwMCAgIDB4MDQKKworI2RlZmluZSBURUtSQU1fUFcgICAgIDB4MTAgLyogUHVsc2Ugc2VsZWN0IGJpdCAqLworCitzdGF0aWMgc3RydWN0IGRvbmdsZV9kcml2ZXIgdGVrcmFtID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJpdmVyX25hbWUJPSAiVGVrcmFtIElSLTIxMEIiLAorCS50eXBlCQk9IElSREFfVEVLUkFNX0RPTkdMRSwKKwkub3BlbgkJPSB0ZWtyYW1fb3BlbiwKKwkuY2xvc2UJCT0gdGVrcmFtX2Nsb3NlLAorCS5yZXNldAkJPSB0ZWtyYW1fcmVzZXQsCisJLnNldF9zcGVlZAk9IHRla3JhbV9jaGFuZ2Vfc3BlZWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0ZWtyYW1fc2lyX2luaXQodm9pZCkKK3sKKwlpZiAodGVrcmFtX2RlbGF5IDwgMSAgfHwgIHRla3JhbV9kZWxheSA+IDUwMCkKKwkJdGVrcmFtX2RlbGF5ID0gMjAwOworCUlSREFfREVCVUcoMSwgIiVzIC0gdXNpbmcgJWQgbXMgZGVsYXlcbiIsCisJCXRla3JhbS5kcml2ZXJfbmFtZSwgdGVrcmFtX2RlbGF5KTsKKwlyZXR1cm4gaXJkYV9yZWdpc3Rlcl9kb25nbGUoJnRla3JhbSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0ZWtyYW1fc2lyX2NsZWFudXAodm9pZCkKK3sKKwlpcmRhX3VucmVnaXN0ZXJfZG9uZ2xlKCZ0ZWtyYW0pOworfQorCitzdGF0aWMgaW50IHRla3JhbV9vcGVuKHN0cnVjdCBzaXJfZGV2ICpkZXYpCit7CisJc3RydWN0IHFvc19pbmZvICpxb3MgPSAmZGV2LT5xb3M7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisKKwlxb3MtPmJhdWRfcmF0ZS5iaXRzICY9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8SVJfMTE1MjAwOworCXFvcy0+bWluX3R1cm5fdGltZS5iaXRzID0gMHgwMTsgLyogTmVlZHMgYXQgbGVhc3QgMTAgbXMgKi8JCisJaXJkYV9xb3NfYml0c190b192YWx1ZShxb3MpOworCisJLyogaXJkYSB0aHJlYWQgd2FpdHMgNTAgbXNlYyBmb3IgcG93ZXIgc2V0dGxpbmcgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRla3JhbV9jbG9zZShzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBQb3dlciBvZmYgZG9uZ2xlICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgRkFMU0UsIEZBTFNFKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gdGVrcmFtX2NoYW5nZV9zcGVlZCAoZGV2LCBzdGF0ZSwgc3BlZWQpCisgKgorICogICAgU2V0IHRoZSBzcGVlZCBmb3IgdGhlIFRla3JhbSBJUk1hdGUgMjEwIHR5cGUgZG9uZ2xlLiBXYXJuaW5nLCB0aGlzIAorICogICAgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBhIHByb2Nlc3MgY29udGV4dCEKKyAqCisgKiAgICBBbGdvcml0aG0KKyAqICAgIDEuIGNsZWFyIERUUiAKKyAqICAgIDIuIHNldCBSVFMsIGFuZCB3YWl0IGF0IGxlYXN0IDcgdXMKKyAqICAgIDMuIHNlbmQgQ29udHJvbCBCeXRlIHRvIHRoZSBJUi0yMTAgdGhyb3VnaCBUWEQgdG8gc2V0IG5ldyBiYXVkIHJhdGUKKyAqICAgICAgIHdhaXQgdW50aWwgdGhlIHN0b3AgYml0IG9mIENvbnRyb2wgQnl0ZSBpcyBzZW50IChmb3IgOTYwMCBiYXVkIHJhdGUsIAorICogICAgICAgaXQgdGFrZXMgYWJvdXQgMTAwIG1zZWMpCisgKgorICoJW29vcHMsIHdoeSAxMDAgbXNlYz8gc2VuZGluZyAxIGJ5dGUgKDEwIGJpdHMpIHRha2VzIDEuMDUgbXNlYworICoJIC0gaXMgdGhpcyBwcm9iYWJseSB0byBjb21wZW5zYXRlIGZvciBkZWxheXMgaW4gdHR5IGxheWVyP10KKyAqCisgKiAgICA1LiBjbGVhciBSVFMgKHJldHVybiB0byBOT1JNQUwgT3BlcmF0aW9uKQorICogICAgNi4gd2FpdCBhdCBsZWFzdCA1MCB1cywgbmV3IHNldHRpbmcgKGJhdWQgcmF0ZSwgZXRjKSB0YWtlcyBlZmZlY3QgaGVyZSAKKyAqICAgICAgIGFmdGVyCisgKi8KKworI2RlZmluZSBURUtSQU1fU1RBVEVfV0FJVF9TUEVFRAkoU0lSREVWX1NUQVRFX0RPTkdMRV9TUEVFRCArIDEpCisKK3N0YXRpYyBpbnQgdGVrcmFtX2NoYW5nZV9zcGVlZChzdHJ1Y3Qgc2lyX2RldiAqZGV2LCB1bnNpZ25lZCBzcGVlZCkKK3sKKwl1bnNpZ25lZCBzdGF0ZSA9IGRldi0+ZnNtLnN1YnN0YXRlOworCXVuc2lnbmVkIGRlbGF5ID0gMDsKKwl1OCBieXRlOworCXN0YXRpYyBpbnQgcmV0ID0gMDsKKwkKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc3dpdGNoKHN0YXRlKSB7CisJY2FzZSBTSVJERVZfU1RBVEVfRE9OR0xFX1NQRUVEOgorCisJCXN3aXRjaCAoc3BlZWQpIHsKKwkJZGVmYXVsdDoKKwkJCXNwZWVkID0gOTYwMDsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQkvKiBmYWxsIHRocnUgKi8KKwkJY2FzZSA5NjAwOgorCQkJYnl0ZSA9IFRFS1JBTV9QV3xURUtSQU1fOTYwMDsKKwkJCWJyZWFrOworCQljYXNlIDE5MjAwOgorCQkJYnl0ZSA9IFRFS1JBTV9QV3xURUtSQU1fMTkyMDA7CisJCQlicmVhazsKKwkJY2FzZSAzODQwMDoKKwkJCWJ5dGUgPSBURUtSQU1fUFd8VEVLUkFNXzM4NDAwOworCQkJYnJlYWs7CisJCWNhc2UgNTc2MDA6CisJCQlieXRlID0gVEVLUkFNX1BXfFRFS1JBTV81NzYwMDsKKwkJCWJyZWFrOworCQljYXNlIDExNTIwMDoKKwkJCWJ5dGUgPSBURUtSQU1fMTE1MjAwOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBTZXQgRFRSLCBDbGVhciBSVFMgKi8KKwkJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgRkFMU0UpOworCQorCQkvKiBXYWl0IGF0IGxlYXN0IDd1cyAqLworCQl1ZGVsYXkoMTQpOworCisJCS8qIFdyaXRlIGNvbnRyb2wgYnl0ZSAqLworCQlzaXJkZXZfcmF3X3dyaXRlKGRldiwgJmJ5dGUsIDEpOworCQkKKwkJZGV2LT5zcGVlZCA9IHNwZWVkOworCisJCXN0YXRlID0gVEVLUkFNX1NUQVRFX1dBSVRfU1BFRUQ7CisJCWRlbGF5ID0gdGVrcmFtX2RlbGF5OworCQlicmVhazsKKworCWNhc2UgVEVLUkFNX1NUQVRFX1dBSVRfU1BFRUQ6CisJCS8qIFNldCBEVFIsIFNldCBSVFMgKi8KKwkJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisJCXVkZWxheSg1MCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJSVJEQV9FUlJPUigiJXMgLSB1bmRlZmluZWQgc3RhdGUgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdGUpOworCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlkZXYtPmZzbS5zdWJzdGF0ZSA9IHN0YXRlOworCXJldHVybiAoZGVsYXkgPiAwKSA/IGRlbGF5IDogcmV0OworfQorCisvKgorICogRnVuY3Rpb24gdGVrcmFtX3Jlc2V0IChkcml2ZXIpCisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgdGVrcmFtIGRvbmdsZS4gV2FybmluZywgdGhpcyBmdW5jdGlvbiAKKyAqICAgICAgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIHByb2Nlc3MgY29udGV4dCEhIAorICoKKyAqICAgICAgQWxnb3JpdGhtOgorICogICAgCSAgMC4gQ2xlYXIgUlRTIGFuZCBEVFIsIGFuZCB3YWl0IDUwIG1zIChwb3dlciBvZmYgdGhlIElSLTIxMCApCisgKiAgICAgICAgMS4gY2xlYXIgUlRTIAorICogICAgICAgIDIuIHNldCBEVFIsIGFuZCB3YWl0IGF0IGxlYXN0IDEgbXMgCisgKiAgICAgICAgMy4gY2xlYXIgRFRSIHRvIFNQQUNFIHN0YXRlLCB3YWl0IGF0IGxlYXN0IDUwIHVzIGZvciBmdXJ0aGVyIAorICogICAgICAgICBvcGVyYXRpb24KKyAqLworCitzdGF0aWMgaW50IHRla3JhbV9yZXNldChzdHJ1Y3Qgc2lyX2RldiAqZGV2KQoreworCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBDbGVhciBEVFIsIFNldCBSVFMgKi8KKwlzaXJkZXZfc2V0X2R0cl9ydHMoZGV2LCBGQUxTRSwgVFJVRSk7IAorCisJLyogU2hvdWxkIHNsZWVwIDEgbXMgKi8KKwltc2xlZXAoMSk7CisKKwkvKiBTZXQgRFRSLCBTZXQgUlRTICovCisJc2lyZGV2X3NldF9kdHJfcnRzKGRldiwgVFJVRSwgVFJVRSk7CisJCisJLyogV2FpdCBhdCBsZWFzdCA1MCB1cyAqLworCXVkZWxheSg3NSk7CisKKwlkZXYtPnNwZWVkID0gOTYwMDsKKworCXJldHVybiAwOworfQorCitNT0RVTEVfQVVUSE9SKCJEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRla3JhbSBJck1hdGUgSVItMjEwQiBkb25nbGUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlyZGEtZG9uZ2xlLTAiKTsgLyogSVJEQV9URUtSQU1fRE9OR0xFICovCisJCQorbW9kdWxlX2luaXQodGVrcmFtX3Npcl9pbml0KTsKK21vZHVsZV9leGl0KHRla3JhbV9zaXJfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Rla3JhbS5jIGIvZHJpdmVycy9uZXQvaXJkYS90ZWtyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjYyNTgyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS90ZWtyYW0uYwpAQCAtMCwwICsxLDI4MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICB0ZWtyYW0uYworICogVmVyc2lvbjogICAgICAgMS4yCisgKiBEZXNjcmlwdGlvbjogICBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGVrcmFtIElyTWF0ZSBJUi0yMTBCIGRvbmdsZQorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgV2VkIE9jdCAyMSAyMDowMjozNSAxOTk4CisgKiBNb2RpZmllZCBhdDogICBGcmkgRGVjIDE3IDA5OjEzOjA5IDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCitzdGF0aWMgdm9pZCB0ZWtyYW1fb3Blbihkb25nbGVfdCAqc2VsZiwgc3RydWN0IHFvc19pbmZvICpxb3MpOworc3RhdGljIHZvaWQgdGVrcmFtX2Nsb3NlKGRvbmdsZV90ICpzZWxmKTsKK3N0YXRpYyBpbnQgIHRla3JhbV9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CitzdGF0aWMgaW50ICB0ZWtyYW1fcmVzZXQoc3RydWN0IGlyZGFfdGFzayAqdGFzayk7CisKKyNkZWZpbmUgVEVLUkFNXzExNTIwMCAweDAwCisjZGVmaW5lIFRFS1JBTV81NzYwMCAgMHgwMQorI2RlZmluZSBURUtSQU1fMzg0MDAgIDB4MDIKKyNkZWZpbmUgVEVLUkFNXzE5MjAwICAweDAzCisjZGVmaW5lIFRFS1JBTV85NjAwICAgMHgwNAorCisjZGVmaW5lIFRFS1JBTV9QVyAgICAgMHgxMCAvKiBQdWxzZSBzZWxlY3QgYml0ICovCisKK3N0YXRpYyBzdHJ1Y3QgZG9uZ2xlX3JlZyBkb25nbGUgPSB7CisJLnR5cGUgPSBJUkRBX1RFS1JBTV9ET05HTEUsCisJLm9wZW4gID0gdGVrcmFtX29wZW4sCisJLmNsb3NlID0gdGVrcmFtX2Nsb3NlLAorCS5yZXNldCA9IHRla3JhbV9yZXNldCwKKwkuY2hhbmdlX3NwZWVkID0gdGVrcmFtX2NoYW5nZV9zcGVlZCwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRla3JhbV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGlyZGFfZGV2aWNlX3JlZ2lzdGVyX2RvbmdsZSgmZG9uZ2xlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRla3JhbV9jbGVhbnVwKHZvaWQpCit7CisJaXJkYV9kZXZpY2VfdW5yZWdpc3Rlcl9kb25nbGUoJmRvbmdsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRla3JhbV9vcGVuKGRvbmdsZV90ICpzZWxmLCBzdHJ1Y3QgcW9zX2luZm8gKnFvcykKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCXFvcy0+YmF1ZF9yYXRlLmJpdHMgJj0gSVJfOTYwMHxJUl8xOTIwMHxJUl8zODQwMHxJUl81NzYwMHxJUl8xMTUyMDA7CisJcW9zLT5taW5fdHVybl90aW1lLmJpdHMgPSAweDAxOyAvKiBOZWVkcyBhdCBsZWFzdCAxMCBtcyAqLwkKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKHFvcyk7Cit9CisKK3N0YXRpYyB2b2lkIHRla3JhbV9jbG9zZShkb25nbGVfdCAqc2VsZikKK3sKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCS8qIFBvd2VyIG9mZiBkb25nbGUgKi8KKwlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBGQUxTRSk7CisKKwlpZiAoc2VsZi0+cmVzZXRfdGFzaykKKwkJaXJkYV90YXNrX2RlbGV0ZShzZWxmLT5yZXNldF90YXNrKTsKKwlpZiAoc2VsZi0+c3BlZWRfdGFzaykKKwkJaXJkYV90YXNrX2RlbGV0ZShzZWxmLT5zcGVlZF90YXNrKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHRla3JhbV9jaGFuZ2Vfc3BlZWQgKGRldiwgc3RhdGUsIHNwZWVkKQorICoKKyAqICAgIFNldCB0aGUgc3BlZWQgZm9yIHRoZSBUZWtyYW0gSVJNYXRlIDIxMCB0eXBlIGRvbmdsZS4gV2FybmluZywgdGhpcyAKKyAqICAgIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggYSBwcm9jZXNzIGNvbnRleHQhCisgKgorICogICAgQWxnb3JpdGhtCisgKiAgICAxLiBjbGVhciBEVFIgCisgKiAgICAyLiBzZXQgUlRTLCBhbmQgd2FpdCBhdCBsZWFzdCA3IHVzCisgKiAgICAzLiBzZW5kIENvbnRyb2wgQnl0ZSB0byB0aGUgSVItMjEwIHRocm91Z2ggVFhEIHRvIHNldCBuZXcgYmF1ZCByYXRlCisgKiAgICAgICB3YWl0IHVudGlsIHRoZSBzdG9wIGJpdCBvZiBDb250cm9sIEJ5dGUgaXMgc2VudCAoZm9yIDk2MDAgYmF1ZCByYXRlLCAKKyAqICAgICAgIGl0IHRha2VzIGFib3V0IDEwMCBtc2VjKQorICogICAgNS4gY2xlYXIgUlRTIChyZXR1cm4gdG8gTk9STUFMIE9wZXJhdGlvbikKKyAqICAgIDYuIHdhaXQgYXQgbGVhc3QgNTAgdXMsIG5ldyBzZXR0aW5nIChiYXVkIHJhdGUsIGV0YykgdGFrZXMgZWZmZWN0IGhlcmUgCisgKiAgICAgICBhZnRlcgorICovCitzdGF0aWMgaW50IHRla3JhbV9jaGFuZ2Vfc3BlZWQoc3RydWN0IGlyZGFfdGFzayAqdGFzaykKK3sKKwlkb25nbGVfdCAqc2VsZiA9IChkb25nbGVfdCAqKSB0YXNrLT5pbnN0YW5jZTsKKwlfX3UzMiBzcGVlZCA9IChfX3UzMikgdGFzay0+cGFyYW07CisJX191OCBieXRlOworCWludCByZXQgPSAwOworCQorCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQodGFzayAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCWlmIChzZWxmLT5zcGVlZF90YXNrICYmIHNlbGYtPnNwZWVkX3Rhc2sgIT0gdGFzaykgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBidXN5IVxuIiwgX19GVU5DVElPTl9fICk7CisJCXJldHVybiBtc2Vjc190b19qaWZmaWVzKDEwKTsKKwl9IGVsc2UKKwkJc2VsZi0+c3BlZWRfdGFzayA9IHRhc2s7CisKKwlzd2l0Y2ggKHNwZWVkKSB7CisJZGVmYXVsdDoKKwljYXNlIDk2MDA6CisJCWJ5dGUgPSBURUtSQU1fUFd8VEVLUkFNXzk2MDA7CisJCWJyZWFrOworCWNhc2UgMTkyMDA6CisJCWJ5dGUgPSBURUtSQU1fUFd8VEVLUkFNXzE5MjAwOworCQlicmVhazsKKwljYXNlIDM4NDAwOgorCQlieXRlID0gVEVLUkFNX1BXfFRFS1JBTV8zODQwMDsKKwkJYnJlYWs7CisJY2FzZSA1NzYwMDoKKwkJYnl0ZSA9IFRFS1JBTV9QV3xURUtSQU1fNTc2MDA7CisJCWJyZWFrOworCWNhc2UgMTE1MjAwOgorCQlieXRlID0gVEVLUkFNXzExNTIwMDsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICh0YXNrLT5zdGF0ZSkgeworCWNhc2UgSVJEQV9UQVNLX0lOSVQ6CisJY2FzZSBJUkRBX1RBU0tfQ0hJTERfSU5JVDoJCQorCQkvKiAKKwkJICogTmVlZCB0byByZXNldCB0aGUgZG9uZ2xlIGFuZCBnbyB0byA5NjAwIGJwcyBiZWZvcmUKKyAgICAgICAgICAgICAgICAgKiBwcm9ncmFtbWluZyAKKwkJICovCisJCWlmIChpcmRhX3Rhc2tfZXhlY3V0ZShzZWxmLCB0ZWtyYW1fcmVzZXQsIE5VTEwsIHRhc2ssIAorCQkJCSAgICAgICh2b2lkICopIHNwZWVkKSkKKwkJeworCQkJLyogRG9uZ2xlIG5lZWQgbW9yZSB0aW1lIHRvIHJlc2V0ICovCisJCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfQ0hJTERfV0FJVCk7CisKKwkJCS8qIEdpdmUgcmVzZXQgMSBzZWMgdG8gZmluaXNoICovCisJCQlyZXQgPSBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCQl9IGVsc2UKKwkJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19DSElMRF9ET05FKTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfQ0hJTERfV0FJVDoKKwkJSVJEQV9XQVJOSU5HKCIlcygpLCByZXNldHRpbmcgZG9uZ2xlIHRpbWVkIG91dCFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCXJldCA9IC0xOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19DSElMRF9ET05FOgorCQkvKiBTZXQgRFRSLCBDbGVhciBSVFMgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBGQUxTRSk7CisJCisJCS8qIFdhaXQgYXQgbGVhc3QgN3VzICovCisJCXVkZWxheSgxNCk7CisKKwkJLyogV3JpdGUgY29udHJvbCBieXRlICovCisJCXNlbGYtPndyaXRlKHNlbGYtPmRldiwgJmJ5dGUsIDEpOworCQkKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX1dBSVQpOworCisJCS8qIFdhaXQgYXQgbGVhc3QgMTAwIG1zICovCisJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoMTUwKTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfV0FJVDoKKwkJLyogU2V0IERUUiwgU2V0IFJUUyAqLworCQlzZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIFRSVUUsIFRSVUUpOworCisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwkJc2VsZi0+c3BlZWRfdGFzayA9IE5VTEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzKCksIHVua25vd24gc3RhdGUgJWRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHRhc2stPnN0YXRlKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOworCQlzZWxmLT5zcGVlZF90YXNrID0gTlVMTDsKKwkJcmV0ID0gLTE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gdGVrcmFtX3Jlc2V0IChkcml2ZXIpCisgKgorICogICAgICBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgdGVrcmFtIGRvbmdsZS4gV2FybmluZywgdGhpcyBmdW5jdGlvbiAKKyAqICAgICAgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIHByb2Nlc3MgY29udGV4dCEhIAorICoKKyAqICAgICAgQWxnb3JpdGhtOgorICogICAgCSAgMC4gQ2xlYXIgUlRTIGFuZCBEVFIsIGFuZCB3YWl0IDUwIG1zIChwb3dlciBvZmYgdGhlIElSLTIxMCApCisgKiAgICAgICAgMS4gY2xlYXIgUlRTIAorICogICAgICAgIDIuIHNldCBEVFIsIGFuZCB3YWl0IGF0IGxlYXN0IDEgbXMgCisgKiAgICAgICAgMy4gY2xlYXIgRFRSIHRvIFNQQUNFIHN0YXRlLCB3YWl0IGF0IGxlYXN0IDUwIHVzIGZvciBmdXJ0aGVyIAorICogICAgICAgICBvcGVyYXRpb24KKyAqLworaW50IHRla3JhbV9yZXNldChzdHJ1Y3QgaXJkYV90YXNrICp0YXNrKQoreworCWRvbmdsZV90ICpzZWxmID0gKGRvbmdsZV90ICopIHRhc2stPmluc3RhbmNlOworCWludCByZXQgPSAwOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVCh0YXNrICE9IE5VTEwsIHJldHVybiAtMTspOworCisJaWYgKHNlbGYtPnJlc2V0X3Rhc2sgJiYgc2VsZi0+cmVzZXRfdGFzayAhPSB0YXNrKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGJ1c3khXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJcmV0dXJuIG1zZWNzX3RvX2ppZmZpZXMoMTApOworCX0gZWxzZQorCQlzZWxmLT5yZXNldF90YXNrID0gdGFzazsKKwkKKwkvKiBQb3dlciBvZmYgZG9uZ2xlICovCisJLy9zZWxmLT5zZXRfZHRyX3J0cyhzZWxmLT5kZXYsIEZBTFNFLCBGQUxTRSk7CisJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKworCXN3aXRjaCAodGFzay0+c3RhdGUpIHsKKwljYXNlIElSREFfVEFTS19JTklUOgorCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDEpOworCisJCS8qIFNsZWVwIDUwIG1zICovCisJCXJldCA9IG1zZWNzX3RvX2ppZmZpZXMoNTApOworCQlicmVhazsKKwljYXNlIElSREFfVEFTS19XQUlUMToKKwkJLyogQ2xlYXIgRFRSLCBTZXQgUlRTICovCisJCXNlbGYtPnNldF9kdHJfcnRzKHNlbGYtPmRldiwgRkFMU0UsIFRSVUUpOyAKKworCQlpcmRhX3Rhc2tfbmV4dF9zdGF0ZSh0YXNrLCBJUkRBX1RBU0tfV0FJVDIpOworCQkKKwkJLyogU2hvdWxkIHNsZWVwIDEgbXMgKi8KKwkJcmV0ID0gbXNlY3NfdG9famlmZmllcygxKTsKKwkJYnJlYWs7CisJY2FzZSBJUkRBX1RBU0tfV0FJVDI6CisJCS8qIFNldCBEVFIsIFNldCBSVFMgKi8KKwkJc2VsZi0+c2V0X2R0cl9ydHMoc2VsZi0+ZGV2LCBUUlVFLCBUUlVFKTsKKwkKKwkJLyogV2FpdCBhdCBsZWFzdCA1MCB1cyAqLworCQl1ZGVsYXkoNzUpOworCisJCWlyZGFfdGFza19uZXh0X3N0YXRlKHRhc2ssIElSREFfVEFTS19ET05FKTsKKwkJc2VsZi0+cmVzZXRfdGFzayA9IE5VTEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzKCksIHVua25vd24gc3RhdGUgJWRcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIHRhc2stPnN0YXRlKTsKKwkJaXJkYV90YXNrX25leHRfc3RhdGUodGFzaywgSVJEQV9UQVNLX0RPTkUpOwkJCisJCXNlbGYtPnJlc2V0X3Rhc2sgPSBOVUxMOworCQlyZXQgPSAtMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUZWtyYW0gSXJNYXRlIElSLTIxMEIgZG9uZ2xlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcmRhLWRvbmdsZS0wIik7IC8qIElSREFfVEVLUkFNX0RPTkdMRSAqLworCQkKKy8qCisgKiBGdW5jdGlvbiBpbml0X21vZHVsZSAodm9pZCkKKyAqCisgKiAgICBJbml0aWFsaXplIFRla3JhbSBtb2R1bGUKKyAqCisgKi8KK21vZHVsZV9pbml0KHRla3JhbV9pbml0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGNsZWFudXBfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIENsZWFudXAgVGVrcmFtIG1vZHVsZQorICoKKyAqLworbW9kdWxlX2V4aXQodGVrcmFtX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5jIGIvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYWZiNDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3ZpYS1pcmNjLmMKQEAgLTAsMCArMSwxNjc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGaWxlbmFtZTogICAgICB2aWEtaXJjYy5jCisgVmVyc2lvbjogICAgICAgMS4wIAorIERlc2NyaXB0aW9uOiAgIERyaXZlciBmb3IgdGhlIFZJQSBWVDgyMzEvVlQ4MjMzIElyREEgY2hpcHNldHMKKyBBdXRob3I6ICAgICAgICBWSUEgVGVjaG5vbG9naWVzLGluYworIERhdGUgIDoJMDgvMDYvMjAwMworCitDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBWSUEgVGVjaG5vbG9naWVzLCBJbmMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCitBTlkgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlM7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKK0YwMSBPY3QvMDIvMDI6IE1vZGlmeSBjb2RlIGZvciBWMC4xMShtb3ZlIG91dCBiYWNrIHRvIGJhY2sgdHJhbnNmZXIpCitGMDIgT2N0LzI4LzAyOiBBZGQgU0IgZGV2aWNlIElEIGZvciAzMTQ3IGFuZCAzMTc3LgorIENvbW1lbnQgOgorICAgICAgIGp1bC8wOS8yMDAyIDogb25seSBpbXBsZW1lbnQgdHdvIGtpbmQgb2YgZG9uZ2xlIGN1cnJlbnRseS4KKyAgICAgICBPY3QvMDIvMjAwMiA6IHdvcmsgb24gVlQ4MjMxIGFuZCBWVDgyMzMgLgorICAgICAgIEF1Zy8wNi8yMDAzIDogY2hhbmdlIGRyaXZlciBmb3JtYXQgdG8gcGNpIGRyaXZlciAuCisKKzIwMDQtMDItMTY6IDxzZGFAYmRpdC5kZT4KKy0gUmVtb3ZlZCB1bm5lZWRlZCAnbGVnYWN5JyBwY2kgc3R1ZmYuCistIE1ha2Ugc3VyZSBTSVIgbW9kZSBpcyBzZXQgKGh3X2luaXQoKSkgYmVmb3JlIGNhbGxpbmcgbW9kZS1kZXBlbmRhbnQgc3R1ZmYuCistIE9uIHNwZWVkIGNoYW5nZSBmcm9tIGNvcmUsIGRvbid0IHNlbmQgU0lSIGZyYW1lIHdpdGggbmV3IHNwZWVkLiAKKyAgVXNlIGN1cnJlbnQgc3BlZWQgYW5kIGNoYW5nZSBzcGVlZHMgbGF0ZXIuCistIE1ha2UgbW9kdWxlLXBhcmFtIGRvbmdsZV9pZCBhY3R1YWxseSB3b3JrLgorLSBOZXcgZG9uZ2xlX2lkIDE3ICgweDExKTogVERGUzQ1MDAuIFNpbmdsZS1lbmRlZCBTSVIgb25seS4gCisgIFRlc3RlZCB3aXRoIGhvbWUtZ3Jvd24gUENCIG9uIEVQSUEgYm9hcmRzLgorLSBDb2RlIGNsZWFudXAuCisgICAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvd3JhcHBlci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorCisjaW5jbHVkZSAidmlhLWlyY2MuaCIKKworI2RlZmluZSBWSUFfTU9EVUxFX05BTUUgInZpYS1pcmNjIgorI2RlZmluZSBDSElQX0lPX0VYVEVOVCAweDQwCisKK3N0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9IFZJQV9NT0RVTEVfTkFNRTsKKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyBpbnQgcW9zX210dF9iaXRzID0gMHgwNzsJLyogMSBtcyBvciBtb3JlICovCitzdGF0aWMgaW50IGRvbmdsZV9pZCA9IDA7CS8qIGRlZmF1bHQ6IHByb2JlICovCisKKy8qIFdlIGNhbid0IGd1ZXNzIHRoZSB0eXBlIG9mIGNvbm5lY3RlZCBkb25nbGUsIHVzZXIgKm11c3QqIHN1cHBseSBpdC4gKi8KK21vZHVsZV9wYXJhbShkb25nbGVfaWQsIGludCwgMCk7CisKKy8qIEZJWE1FIDogd2Ugc2hvdWxkIG5vdCBuZWVkIHRoaXMsIGJlY2F1c2UgaW5zdGFuY2VzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5CisgKiBtYW5hZ2VkIGJ5IHRoZSBQQ0kgbGF5ZXIuIEVzcGVjaWFsbHkgdGhhdCB3ZSBzZWVtIHRvIG9ubHkgYmUgdXNpbmcgdGhlCisgKiBmaXJzdCBlbnRyeS4gSmVhbiBJSSAqLworLyogTWF4IDQgaW5zdGFuY2VzIGZvciBub3cgKi8KK3N0YXRpYyBzdHJ1Y3QgdmlhX2lyY2NfY2IgKmRldl9zZWxmW10gPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKworLyogU29tZSBwcm90b3R5cGVzICovCitzdGF0aWMgaW50IHZpYV9pcmNjX29wZW4oaW50IGksIGNoaXBpb190ICogaW5mbywgdW5zaWduZWQgaW50IGlkKTsKK3N0YXRpYyBpbnQgdmlhX2lyY2NfY2xvc2Uoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyBpbnQgdmlhX2lyY2NfZG1hX3JlY2VpdmUoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmKTsKK3N0YXRpYyBpbnQgdmlhX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmLAorCQkJCQkgaW50IGlvYmFzZSk7CitzdGF0aWMgaW50IHZpYV9pcmNjX2hhcmRfeG1pdF9zaXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCB2aWFfaXJjY19oYXJkX3htaXRfZmlyKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHZpYV9od19pbml0KHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgdm9pZCB2aWFfaXJjY19jaGFuZ2Vfc3BlZWQoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmLCBfX3UzMiBiYXVkKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCB2aWFfaXJjY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgdmlhX2lyY2NfaXNfcmVjZWl2aW5nKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgaW50IHZpYV9pcmNjX3JlYWRfZG9uZ2xlX2lkKGludCBpb2Jhc2UpOworCitzdGF0aWMgaW50IHZpYV9pcmNjX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCB2aWFfaXJjY19uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHZpYV9pcmNjX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLAorCQkJICAgICAgaW50IGNtZCk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnZpYV9pcmNjX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UKKwkJCQkJCSAgICAgICAqZGV2KTsKK3N0YXRpYyB2b2lkIHZpYV9pcmNjX2NoYW5nZV9kb25nbGVfc3BlZWQoaW50IGlvYmFzZSwgaW50IHNwZWVkLAorCQkJCQkgaW50IGRvbmdsZV9pZCk7CitzdGF0aWMgaW50IFJ4VGltZXJIYW5kbGVyKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZiwgaW50IGlvYmFzZSk7CitzdGF0aWMgdm9pZCBod3Jlc2V0KHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZik7CitzdGF0aWMgaW50IHZpYV9pcmNjX2RtYV94bWl0KHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZiwgdTE2IGlvYmFzZSk7CitzdGF0aWMgaW50IHVwbG9hZF9yeGRhdGEoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlKTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZpYV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKTsKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB2aWFfcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworCisvKiBGSVhNRSA6IFNob3VsZCB1c2UgdWRlbGF5KCkgaW5zdGVhZCwgZXZlbiBpZiB3ZSBhcmUgeDg2IG9ubHkgLSBKZWFuIElJICovCitzdGF0aWMgdm9pZCBpb2RlbGF5KGludCB1ZGVsYXkpCit7CisJdTggZGF0YTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB1ZGVsYXk7IGkrKykgeworCQlkYXRhID0gaW5iKDB4ODApOworCX0KK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZpYV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX1ZJQSwgMHg4MjMxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELDAsMCwwIH0sCisJeyBQQ0lfVkVORE9SX0lEX1ZJQSwgMHgzMTA5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELDAsMCwxIH0sCisJeyBQQ0lfVkVORE9SX0lEX1ZJQSwgMHgzMDc0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELDAsMCwyIH0sCisJeyBQQ0lfVkVORE9SX0lEX1ZJQSwgMHgzMTQ3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELDAsMCwzIH0sCisJeyBQQ0lfVkVORE9SX0lEX1ZJQSwgMHgzMTc3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELDAsMCw0IH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSx2aWFfcGNpX3RibCk7CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHZpYV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gVklBX01PRFVMRV9OQU1FLAorCS5pZF90YWJsZQk9IHZpYV9wY2lfdGJsLAorCS5wcm9iZQkJPSB2aWFfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh2aWFfcmVtb3ZlX29uZSksCit9OworCisKKy8qCisgKiBGdW5jdGlvbiB2aWFfaXJjY19pbml0ICgpCisgKgorICogICAgSW5pdGlhbGl6ZSBjaGlwLiBKdXN0IGZpbmQgb3V0IGNoaXAgdHlwZSBhbmQgcmVzb3VyY2UuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHZpYV9pcmNjX2luaXQodm9pZCkKK3sKKwlpbnQgcmM7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJcmMgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ2aWFfZHJpdmVyKTsKKwlpZiAocmMgPCAwKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCk6IGVycm9yIHJjID0gJWQsIHJldHVybmluZyAgLUVOT0RFVi4uLlxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgcmMpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZpYV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWludCByYzsKKyAgICAgICAgdTggdGVtcCxvbGRQQ0lfNDAsb2xkUENJXzQ0LGJUbXAsYlRtcDE7CisJdTE2IENoaXBzZXQsRmlyRFJRMSxGaXJEUlEwLEZpcklSUSxGaXJJT0Jhc2U7CisJY2hpcGlvX3QgaW5mbzsKKworCUlSREFfREVCVUcoMiwgIiVzKCk6IERldmljZSBJRD0oMFglWClcbiIsIF9fRlVOQ1RJT05fXywgaWQtPmRldmljZSk7CisKKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlIChwY2lkZXYpOworCWlmIChyYykgeworCQlJUkRBX0RFQlVHKDAsICIlcygpOiBlcnJvciByYyA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLy8gU291dGggQnJpZGdlIGV4aXN0CisgICAgICAgIGlmICggUmVhZExQQ1JlZygweDIwKSAhPSAweDNDICkKKwkJQ2hpcHNldD0weDMwOTY7CisJZWxzZQorCQlDaGlwc2V0PTB4MzA3NjsKKworCWlmIChDaGlwc2V0PT0weDMwNzYpIHsKKwkJSVJEQV9ERUJVRygyLCAiJXMoKTogQ2hpcHNldCA9IDMwNzZcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJV3JpdGVMUENSZWcoNywweDBjICk7CisJCXRlbXA9UmVhZExQQ1JlZygweDMwKTsvL2NoZWNrIGlmIEJJT1MgRW5hYmxlIEZpcgorCQlpZigodGVtcCYweDAxKT09MSkgeyAgIC8vIEJJT1MgY2xvc2Ugb3Igbm8gRklSCisJCQlXcml0ZUxQQ1JlZygweDFkLCAweDgyICk7CisJCQlXcml0ZUxQQ1JlZygweDIzLDB4MTgpOworCQkJdGVtcD1SZWFkTFBDUmVnKDB4RjApOworCQkJaWYoKHRlbXAmMHgwMSk9PTApIHsKKwkJCQl0ZW1wPShSZWFkTFBDUmVnKDB4NzQpJjB4MDMpOyAgICAvL0RNQQorCQkJCUZpckRSUTA9dGVtcCArIDQ7CisJCQkJdGVtcD0oUmVhZExQQ1JlZygweDc0KSYweDBDKSA+PiAyOworCQkJCUZpckRSUTE9dGVtcCArIDQ7CisJCQl9IGVsc2UgeworCQkJCXRlbXA9KFJlYWRMUENSZWcoMHg3NCkmMHgwQykgPj4gMjsgICAgLy9ETUEKKwkJCQlGaXJEUlEwPXRlbXAgKyA0OworCQkJCUZpckRSUTE9RmlyRFJRMDsKKwkJCX0KKwkJCUZpcklSUT0oUmVhZExQQ1JlZygweDcwKSYweDBmKTsJCS8vSVJRCisJCQlGaXJJT0Jhc2U9UmVhZExQQ1JlZygweDYwICkgPDwgODsJLy9JTyBTcGFjZSA6aGlnaCBieXRlCisJCQlGaXJJT0Jhc2U9RmlySU9CYXNlfCBSZWFkTFBDUmVnKDB4NjEpIDsJLy9sb3cgYnl0ZQorCQkJRmlySU9CYXNlPUZpcklPQmFzZSAgOworCQkJaW5mby5maXJfYmFzZT1GaXJJT0Jhc2U7CisJCQlpbmZvLmlycT1GaXJJUlE7CisJCQlpbmZvLmRtYT1GaXJEUlExOworCQkJaW5mby5kbWEyPUZpckRSUTA7CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsMHg0MCwmYlRtcCk7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpZGV2LDB4NDAsKChiVG1wIHwgMHgwOCkgJiAweGZlKSk7CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsMHg0MiwmYlRtcCk7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpZGV2LDB4NDIsKGJUbXAgfCAweGYwKSk7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpZGV2LDB4NWEsMHhjMCk7CisJCQlXcml0ZUxQQ1JlZygweDI4LCAweDcwICk7CisJCQlpZiAodmlhX2lyY2Nfb3BlbigwLCAmaW5mbywweDMwNzYpID09IDApCisJCQkJcmM9MDsKKwkJfSBlbHNlCisJCQlyYyA9IC1FTk9ERVY7IC8vSVIgbm90IHR1cm4gb24JIAorCX0gZWxzZSB7IC8vTm90IFZUMTIxMQorCQlJUkRBX0RFQlVHKDIsICIlcygpOiBDaGlwc2V0ID0gMzA5NlxuIiwgX19GVU5DVElPTl9fKTsKKworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsMHg2NywmYlRtcCk7Ly9jaGVjayBpZiBCSU9TIEVuYWJsZSBGaXIKKwkJaWYoKGJUbXAmMHgwMSk9PTEpIHsgIC8vIEJJT1MgZW5hYmxlIEZJUgorCQkJLy9FbmFibGUgRG91YmxlIERNQSBjbG9jaworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LDB4NDIsJm9sZFBDSV80MCk7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpZGV2LDB4NDIsb2xkUENJXzQwIHwgMHg4MCk7CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsMHg0MCwmb2xkUENJXzQwKTsKKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lkZXYsMHg0MCxvbGRQQ0lfNDAgJiAweGY3KTsKKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaWRldiwweDQ0LCZvbGRQQ0lfNDQpOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaWRldiwweDQ0LDB4NGUpOworICAvLy0tLS0tLS0tLS0gcmVhZCBjb25maWd1cmF0aW9uIGZyb20gRnVuY3Rpb24wIG9mIHNvdXRoIGJyaWRnZQorCQkJaWYoKGJUbXAmMHgwMik9PTApIHsKKwkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsMHg0NCwmYlRtcDEpOyAvL0RNQQorCQkJCUZpckRSUTAgPSAoYlRtcDEgJiAweDMwKSA+PiA0OworCQkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaWRldiwweDQ0LCZiVG1wMSk7CisJCQkJRmlyRFJRMSA9IChiVG1wMSAmIDB4YzApID4+IDY7CisJCQl9IGVsc2UgIHsKKwkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsMHg0NCwmYlRtcDEpOyAgICAvL0RNQQorCQkJCUZpckRSUTAgPSAoYlRtcDEgJiAweDMwKSA+PiA0IDsKKwkJCQlGaXJEUlExPTA7CisJCQl9CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lkZXYsMHg0NywmYlRtcDEpOyAgLy9JUlEKKwkJCUZpcklSUSA9IGJUbXAxICYgMHgwZjsKKworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LDB4NjksJmJUbXApOworCQkJRmlySU9CYXNlID0gYlRtcCA8PCA4Oy8vaGlnaHQgYnl0ZQorCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LDB4NjgsJmJUbXApOworCQkJRmlySU9CYXNlID0gKEZpcklPQmFzZSB8IGJUbXAgKSAmIDB4ZmZmMDsKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlpbmZvLmZpcl9iYXNlPUZpcklPQmFzZTsKKwkJCWluZm8uaXJxPUZpcklSUTsKKwkJCWluZm8uZG1hPUZpckRSUTE7CisJCQlpbmZvLmRtYTI9RmlyRFJRMDsKKwkJCWlmICh2aWFfaXJjY19vcGVuKDAsICZpbmZvLDB4MzA5NikgPT0gMCkKKwkJCQlyYz0wOworCQl9IGVsc2UKKwkJCXJjID0gLUVOT0RFVjsgLy9JUiBub3QgdHVybiBvbiAhISEhIQorCX0vL05vdCBWVDEyMTEKKworCUlSREFfREVCVUcoMiwgIiVzKCk6IEVuZCAtIHJjID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgcmMpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX2NsZWFuICgpCisgKgorICogICAgQ2xvc2UgYWxsIGNvbmZpZ3VyZWQgY2hpcHMKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHZpYV9pcmNjX2NsZWFuKHZvaWQpCit7CisJaW50IGk7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJZm9yIChpPTA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKGRldl9zZWxmW2ldKQorCQkJdmlhX2lyY2NfY2xvc2UoZGV2X3NlbGZbaV0pOworCX0KK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHZpYV9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogRklYTUUgOiBUaGlzIGlzIHVnbHkuIFdlIHNob3VsZCB1c2UgcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCSAqIHRvIGdldCBvdXIgZHJpdmVyIGluc3RhbmNlIGFuZCBjYWxsIGRpcmVjdGx5IHZpYV9pcmNjX2Nsb3NlKCkuCisJICogU2VlIHZsc2lfaXIgZm9yIGRldGFpbHMuLi4KKwkgKiBKZWFuIElJICovCisJdmlhX2lyY2NfY2xlYW4oKTsKKworCS8qIEZJWE1FIDogVGhpcyBzaG91bGQgYmUgaW4gdmlhX2lyY2NfY2xvc2UoKSwgYmVjYXVzZSBoZXJlIHdlIG1heQorCSAqIHRoZW9yaXRpY2FsbHkgZGlzYWJsZSBzdGlsbCBjb25maWd1cmVkIGRldmljZXMgOi0oIC0gSmVhbiBJSSAqLworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHZpYV9pcmNjX2NsZWFudXAodm9pZCkKK3sKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogRklYTUUgOiBUaGlzIHNob3VsZCBiZSByZWR1bmRhbnQsIGFzIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigpCisJICogc2hvdWxkIGNhbGwgdmlhX3JlbW92ZV9vbmUoKSBvbiBlYWNoIGRldmljZS4KKwkgKiBKZWFuIElJICovCisJdmlhX2lyY2NfY2xlYW4oKTsKKworCS8qIENsZWFudXAgYWxsIGluc3RhbmNlcyBvZiB0aGUgZHJpdmVyICovCisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmdmlhX2RyaXZlcik7IAorfQorCisvKgorICogRnVuY3Rpb24gdmlhX2lyY2Nfb3BlbiAoaW9iYXNlLCBpcnEpCisgKgorICogICAgT3BlbiBkcml2ZXIgaW5zdGFuY2UKKyAqCisgKi8KK3N0YXRpYyBfX2RldmluaXQgaW50IHZpYV9pcmNjX29wZW4oaW50IGksIGNoaXBpb190ICogaW5mbywgdW5zaWduZWQgaW50IGlkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmOworCWludCBlcnI7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyogQWxsb2NhdGUgbmV3IGluc3RhbmNlIG9mIHRoZSBkcml2ZXIgKi8KKwlkZXYgPSBhbGxvY19pcmRhZGV2KHNpemVvZihzdHJ1Y3QgdmlhX2lyY2NfY2IpKTsKKwlpZiAoZGV2ID09IE5VTEwpIAorCQlyZXR1cm4gLUVOT01FTTsKKworCXNlbGYgPSBkZXYtPnByaXY7CisJc2VsZi0+bmV0ZGV2ID0gZGV2OworCXNwaW5fbG9ja19pbml0KCZzZWxmLT5sb2NrKTsKKworCS8qIEZJWE1FIDogV2Ugc2hvdWxkIHN0b3JlIG91ciBkcml2ZXIgaW5zdGFuY2UgaW4gdGhlIFBDSSBsYXllciwKKwkgKiB1c2luZyBwY2lfc2V0X2RydmRhdGEoKSwgbm90IGluIHRoaXMgYXJyYXkuCisJICogU2VlIHZsc2lfaXIgZm9yIGRldGFpbHMuLi4gLSBKZWFuIElJICovCisJLyogRklYTUUgOiAnaScgaXMgYWx3YXlzIDAgKHNlZSB2aWFfaW5pdF9vbmUoKSkgOi0oIC0gSmVhbiBJSSAqLworCS8qIE5lZWQgdG8gc3RvcmUgc2VsZiBzb21ld2hlcmUgKi8KKwlkZXZfc2VsZltpXSA9IHNlbGY7CisJc2VsZi0+aW5kZXggPSBpOworCS8qIEluaXRpYWxpemUgUmVzb3VyY2UgKi8KKwlzZWxmLT5pby5jZmdfYmFzZSA9IGluZm8tPmNmZ19iYXNlOworCXNlbGYtPmlvLmZpcl9iYXNlID0gaW5mby0+ZmlyX2Jhc2U7CisJc2VsZi0+aW8uaXJxID0gaW5mby0+aXJxOworCXNlbGYtPmlvLmZpcl9leHQgPSBDSElQX0lPX0VYVEVOVDsKKwlzZWxmLT5pby5kbWEgPSBpbmZvLT5kbWE7CisJc2VsZi0+aW8uZG1hMiA9IGluZm8tPmRtYTI7CisJc2VsZi0+aW8uZmlmb19zaXplID0gMzI7CisJc2VsZi0+Y2hpcF9pZCA9IGlkOworCXNlbGYtPnN0X2ZpZm8ubGVuID0gMDsKKwlzZWxmLT5SeERhdGFSZWFkeSA9IDA7CisKKwkvKiBSZXNlcnZlIHRoZSBpb3BvcnRzIHRoYXQgd2UgbmVlZCAqLworCWlmICghcmVxdWVzdF9yZWdpb24oc2VsZi0+aW8uZmlyX2Jhc2UsIHNlbGYtPmlvLmZpcl9leHQsIGRyaXZlcl9uYW1lKSkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBjYW4ndCBnZXQgaW9iYXNlIG9mIDB4JTAzeFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgc2VsZi0+aW8uZmlyX2Jhc2UpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXQxOworCX0KKwkKKwkvKiBJbml0aWFsaXplIFFvUyBmb3IgdGhpcyBkZXZpY2UgKi8KKwlpcmRhX2luaXRfbWF4X3Fvc19jYXBhYmlsaWVzKCZzZWxmLT5xb3MpOworCisJLyogQ2hlY2sgaWYgdXNlciBoYXMgc3VwcGxpZWQgdGhlIGRvbmdsZSBpZCBvciBub3QgKi8KKwlpZiAoIWRvbmdsZV9pZCkKKwkJZG9uZ2xlX2lkID0gdmlhX2lyY2NfcmVhZF9kb25nbGVfaWQoc2VsZi0+aW8uZmlyX2Jhc2UpOworCXNlbGYtPmlvLmRvbmdsZV9pZCA9IGRvbmdsZV9pZDsKKworCS8qIFRoZSBvbmx5IHZhbHVlIHdlIG11c3Qgb3ZlcnJpZGUgaXQgdGhlIGJhdWRyYXRlICovCisJLyogTWF4aW11bSBzcGVlZHMgYW5kIGNhcGFiaWxpdGllcyBhcmUgZG9uZ2xlLWRlcGVuZGFudC4gKi8KKwlzd2l0Y2goIHNlbGYtPmlvLmRvbmdsZV9pZCApeworCWNhc2UgMHgwZDoKKwkJc2VsZi0+cW9zLmJhdWRfcmF0ZS5iaXRzID0KKwkJICAgIElSXzk2MDAgfCBJUl8xOTIwMCB8IElSXzM4NDAwIHwgSVJfNTc2MDAgfCBJUl8xMTUyMDAgfAorCQkgICAgSVJfNTc2MDAwIHwgSVJfMTE1MjAwMCB8IChJUl80MDAwMDAwIDw8IDgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMgPQorCQkgICAgSVJfOTYwMCB8IElSXzE5MjAwIHwgSVJfMzg0MDAgfCBJUl81NzYwMCB8IElSXzExNTIwMDsKKwkJYnJlYWs7CisJfQorCisJLyogRm9sbG93aW5nIHdhcyB1c2VkIGZvciB0ZXN0aW5nOgorCSAqCisJICogICBzZWxmLT5xb3MuYmF1ZF9yYXRlLmJpdHMgPSBJUl85NjAwOworCSAqCisJICogSXMgaXMgbm8gZ29vZCwgYXMgaXQgcHJvaGliaXRzIChlcnJvci1wcm9uZSkgc3BlZWQtY2hhbmdlcy4KKwkgKi8KKworCXNlbGYtPnFvcy5taW5fdHVybl90aW1lLmJpdHMgPSBxb3NfbXR0X2JpdHM7CisJaXJkYV9xb3NfYml0c190b192YWx1ZSgmc2VsZi0+cW9zKTsKKworCS8qIE1heCBETUEgYnVmZmVyIHNpemUgbmVlZGVkID0gKGRhdGFfc2l6ZSArIDYpICogKHdpbmRvd19zaXplKSArIDY7ICovCisJc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSA9IDE0Mzg0ICsgMjA0ODsKKwlzZWxmLT50eF9idWZmLnRydWVzaXplID0gMTQzODQgKyAyMDQ4OworCisJLyogQWxsb2NhdGUgbWVtb3J5IGlmIG5lZWRlZCAqLworCXNlbGYtPnJ4X2J1ZmYuaGVhZCA9CisJCWRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAorCQkJCSAgICZzZWxmLT5yeF9idWZmX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNlbGYtPnJ4X2J1ZmYuaGVhZCA9PSBOVUxMKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDI7CisJfQorCW1lbXNldChzZWxmLT5yeF9idWZmLmhlYWQsIDAsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUpOworCisJc2VsZi0+dHhfYnVmZi5oZWFkID0KKwkJZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICAgJnNlbGYtPnR4X2J1ZmZfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2VsZi0+dHhfYnVmZi5oZWFkID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0MzsKKwl9CisJbWVtc2V0KHNlbGYtPnR4X2J1ZmYuaGVhZCwgMCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSk7CisKKwlzZWxmLT5yeF9idWZmLmluX2ZyYW1lID0gRkFMU0U7CisJc2VsZi0+cnhfYnVmZi5zdGF0ZSA9IE9VVFNJREVfRlJBTUU7CisJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCXNlbGYtPnJ4X2J1ZmYuZGF0YSA9IHNlbGYtPnJ4X2J1ZmYuaGVhZDsKKworCS8qIFJlc2V0IFR4IHF1ZXVlIGluZm8gKi8KKwlzZWxmLT50eF9maWZvLmxlbiA9IHNlbGYtPnR4X2ZpZm8ucHRyID0gc2VsZi0+dHhfZmlmby5mcmVlID0gMDsKKwlzZWxmLT50eF9maWZvLnRhaWwgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisKKwkvKiBLZWVwIHRyYWNrIG9mIG1vZHVsZSB1c2FnZSAqLworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCS8qIE92ZXJyaWRlIHRoZSBuZXR3b3JrIGZ1bmN0aW9ucyB3ZSBuZWVkIHRvIHVzZSAqLworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gdmlhX2lyY2NfaGFyZF94bWl0X3NpcjsKKwlkZXYtPm9wZW4gPSB2aWFfaXJjY19uZXRfb3BlbjsKKwlkZXYtPnN0b3AgPSB2aWFfaXJjY19uZXRfY2xvc2U7CisJZGV2LT5kb19pb2N0bCA9IHZpYV9pcmNjX25ldF9pb2N0bDsKKwlkZXYtPmdldF9zdGF0cyA9IHZpYV9pcmNjX25ldF9nZXRfc3RhdHM7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXQ0OworCisJSVJEQV9NRVNTQUdFKCJJckRBOiBSZWdpc3RlcmVkIGRldmljZSAlcyAodmlhLWlyY2MpXG4iLCBkZXYtPm5hbWUpOworCisJLyogSW5pdGlhbGlzZSB0aGUgaGFyZHdhcmUuLgorCSovCisJc2VsZi0+aW8uc3BlZWQgPSA5NjAwOworCXZpYV9od19pbml0KHNlbGYpOworCXJldHVybiAwOworIGVycl9vdXQ0OgorCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUsCisJCQkgIHNlbGYtPnR4X2J1ZmYuaGVhZCwgc2VsZi0+dHhfYnVmZl9kbWEpOworIGVycl9vdXQzOgorCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCQkgIHNlbGYtPnJ4X2J1ZmYuaGVhZCwgc2VsZi0+cnhfYnVmZl9kbWEpOworIGVycl9vdXQyOgorCXJlbGVhc2VfcmVnaW9uKHNlbGYtPmlvLmZpcl9iYXNlLCBzZWxmLT5pby5maXJfZXh0KTsKKyBlcnJfb3V0MToKKwlmcmVlX25ldGRldihkZXYpOworCWRldl9zZWxmW2ldID0gTlVMTDsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogRnVuY3Rpb24gdmlhX2lyY2NfY2xvc2UgKHNlbGYpCisgKgorICogICAgQ2xvc2UgZHJpdmVyIGluc3RhbmNlCisgKgorICovCitzdGF0aWMgaW50IHZpYV9pcmNjX2Nsb3NlKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCisJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCVJlc2V0Q2hpcChpb2Jhc2UsIDUpOwkvL2hhcmR3YXJlIHJlc2V0LgorCS8qIFJlbW92ZSBuZXRkZXZpY2UgKi8KKwl1bnJlZ2lzdGVyX25ldGRldihzZWxmLT5uZXRkZXYpOworCisJLyogUmVsZWFzZSB0aGUgUE9SVCB0aGF0IHRoaXMgZHJpdmVyIGlzIHVzaW5nICovCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgUmVsZWFzaW5nIFJlZ2lvbiAlMDN4XG4iLAorCQkgICBfX0ZVTkNUSU9OX18sIHNlbGYtPmlvLmZpcl9iYXNlKTsKKwlyZWxlYXNlX3JlZ2lvbihzZWxmLT5pby5maXJfYmFzZSwgc2VsZi0+aW8uZmlyX2V4dCk7CisJaWYgKHNlbGYtPnR4X2J1ZmYuaGVhZCkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSwKKwkJCQkgIHNlbGYtPnR4X2J1ZmYuaGVhZCwgc2VsZi0+dHhfYnVmZl9kbWEpOworCWlmIChzZWxmLT5yeF9idWZmLmhlYWQpCisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICBzZWxmLT5yeF9idWZmLmhlYWQsIHNlbGYtPnJ4X2J1ZmZfZG1hKTsKKwlkZXZfc2VsZltzZWxmLT5pbmRleF0gPSBOVUxMOworCisJZnJlZV9uZXRkZXYoc2VsZi0+bmV0ZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gdmlhX2h3X2luaXQoc2VsZikKKyAqCisgKiAgICBSZXR1cm5zIG5vbi1uZWdhdGl2ZSBvbiBzdWNjZXNzLgorICoKKyAqIEZvcm1lcmx5IHZpYV9pcmNjX3NldHVwIAorICovCitzdGF0aWMgdm9pZCB2aWFfaHdfaW5pdChzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYpCit7CisJaW50IGlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCVNldE1heFJ4UGFja2V0U2l6ZShpb2Jhc2UsIDB4MGZmZik7CS8vc2V0IHRvIG1heDo0MDk1CisJLy8gRklGTyBJbml0CisJRW5SWEZJRk9SZWFkeUludChpb2Jhc2UsIE9GRik7CisJRW5SWEZJRk9IYWxmTGV2ZWxJbnQoaW9iYXNlLCBPRkYpOworCUVuVFhGSUZPSGFsZkxldmVsSW50KGlvYmFzZSwgT0ZGKTsKKwlFblRYRklGT1VuZGVycnVuRU9NSW50KGlvYmFzZSwgT04pOworCUVuVFhGSUZPUmVhZHlJbnQoaW9iYXNlLCBPRkYpOworCUludmVydFRYKGlvYmFzZSwgT0ZGKTsKKwlJbnZlcnRSWChpb2Jhc2UsIE9GRik7CisKKwlpZiAoUmVhZExQQ1JlZygweDIwKSA9PSAweDNjKQorCQlXcml0ZUxQQ1JlZygweEYwLCAwKTsJLy8gZm9yIFZUMTIxMQorCS8qIEludCBJbml0ICovCisJRW5SWFNwZWNJbnQoaW9iYXNlLCBPTik7CisKKwkvKiBUaGUgZm9sbG93aW5nIGlzIGJhc2ljYWxseSBod3Jlc2V0ICovCisJLyogSWYgdGhpcyBpcyB0aGUgY2FzZSwgd2h5IG5vdCBqdXN0IGNhbGwgaHdyZXNldCgpID8gSmVhbiBJSSAqLworCVJlc2V0Q2hpcChpb2Jhc2UsIDUpOworCUVuYWJsZURNQShpb2Jhc2UsIE9GRik7CisJRW5hYmxlVFgoaW9iYXNlLCBPRkYpOworCUVuYWJsZVJYKGlvYmFzZSwgT0ZGKTsKKwlFblJYRE1BKGlvYmFzZSwgT0ZGKTsKKwlFblRYRE1BKGlvYmFzZSwgT0ZGKTsKKwlSWFN0YXJ0KGlvYmFzZSwgT0ZGKTsKKwlUWFN0YXJ0KGlvYmFzZSwgT0ZGKTsKKwlJbml0Q2FyZChpb2Jhc2UpOworCUNvbW1vbkluaXQoaW9iYXNlKTsKKwlTSVJGaWx0ZXIoaW9iYXNlLCBPTik7CisJU2V0U0lSKGlvYmFzZSwgT04pOworCUNSQzE2KGlvYmFzZSwgT04pOworCUVuVFhDUkMoaW9iYXNlLCAwKTsKKwlXcml0ZVJlZyhpb2Jhc2UsIElfU1RfQ1RfMCwgMHgwMCk7CisJU2V0QmF1ZFJhdGUoaW9iYXNlLCA5NjAwKTsKKwlTZXRQdWxzZVdpZHRoKGlvYmFzZSwgMTIpOworCVNldFNlbmRQcmVhbWJsZUNvdW50KGlvYmFzZSwgMCk7CisKKwlzZWxmLT5pby5zcGVlZCA9IDk2MDA7CisJc2VsZi0+c3RfZmlmby5sZW4gPSAwOworCisJdmlhX2lyY2NfY2hhbmdlX2RvbmdsZV9zcGVlZChpb2Jhc2UsIHNlbGYtPmlvLnNwZWVkLAorCQkJCSAgICAgc2VsZi0+aW8uZG9uZ2xlX2lkKTsKKworCVdyaXRlUmVnKGlvYmFzZSwgSV9TVF9DVF8wLCAweDgwKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX3JlYWRfZG9uZ2xlX2lkICh2b2lkKQorICoKKyAqLworc3RhdGljIGludCB2aWFfaXJjY19yZWFkX2RvbmdsZV9pZChpbnQgaW9iYXNlKQoreworCWludCBkb25nbGVfaWQgPSA5OwkvKiBEZWZhdWx0IHRvIElCTSAqLworCisJSVJEQV9FUlJPUigidmlhLWlyY2M6IGRvbmdsZSBwcm9iaW5nIG5vdCBzdXBwb3J0ZWQsIHBsZWFzZSBzcGVjaWZ5IGRvbmdsZV9pZCBtb2R1bGUgcGFyYW1ldGVyLlxuIik7CisJcmV0dXJuIGRvbmdsZV9pZDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX2NoYW5nZV9kb25nbGVfc3BlZWQgKGlvYmFzZSwgc3BlZWQsIGRvbmdsZV9pZCkKKyAqICAgIENoYW5nZSBzcGVlZCBvZiB0aGUgYXR0YWNoIGRvbmdsZQorICogICAgb25seSBpbXBsZW1lbnQgdHdvIHR5cGUgb2YgZG9uZ2xlIGN1cnJlbnRseS4KKyAqLworc3RhdGljIHZvaWQgdmlhX2lyY2NfY2hhbmdlX2RvbmdsZV9zcGVlZChpbnQgaW9iYXNlLCBpbnQgc3BlZWQsCisJCQkJCSBpbnQgZG9uZ2xlX2lkKQoreworCXU4IG1vZGUgPSAwOworCisJLyogc3BlZWQgaXMgdW51c2VkLCBhcyB3ZSB1c2UgSXNTSVJPbigpL0lzTUlST24oKSAqLworCXNwZWVkID0gc3BlZWQ7CisKKwlJUkRBX0RFQlVHKDEsICIlcygpOiBjaGFuZ2VfZG9uZ2xlX3NwZWVkIHRvICVkIGZvciAweCV4LCAlZFxuIiwKKwkJICAgX19GVU5DVElPTl9fLCBzcGVlZCwgaW9iYXNlLCBkb25nbGVfaWQpOworCisJc3dpdGNoIChkb25nbGVfaWQpIHsKKworCQkvKiBOb3RlOiBUaGUgZG9uZ2xlX2lkJ3MgbGlzdGVkIGhlcmUgYXJlIGRlcml2ZWQgZnJvbQorCQkgKiBuc2MtaXJjYy5jICovIAorCisJY2FzZSAweDA4OgkJLyogSFAgSFNETC0yMzAwLCBIUCBIU0RMLTM2MDAvSFNETC0zNjEwICovCisJCVVzZU9uZVJYKGlvYmFzZSwgT04pOwkvLyB1c2Ugb25lIFJYIHBpbiAgIFJYMSxSWDIKKwkJSW52ZXJ0VFgoaW9iYXNlLCBPRkYpOworCQlJbnZlcnRSWChpb2Jhc2UsIE9GRik7CisKKwkJRW5SWDIoaW9iYXNlLCBPTik7CS8vc2lyIHRvIHJ4MgorCQlFbkdQSU90b1JYMihpb2Jhc2UsIE9GRik7CisKKwkJaWYgKElzU0lST24oaW9iYXNlKSkgewkvL3NpcgorCQkJLy8gTW9kZSBzZWxlY3QgT2ZmCisJCQlTbG93SVJSWExvd0FjdGl2ZShpb2Jhc2UsIE9OKTsKKwkJCXVkZWxheSgxMDAwKTsKKwkJCVNsb3dJUlJYTG93QWN0aXZlKGlvYmFzZSwgT0ZGKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChJc01JUk9uKGlvYmFzZSkpIHsJLy9taXIKKwkJCQkvLyBNb2RlIHNlbGVjdCBPbgorCQkJCVNsb3dJUlJYTG93QWN0aXZlKGlvYmFzZSwgT0ZGKTsKKwkJCQl1ZGVsYXkoMjApOworCQkJfSBlbHNlIHsJLy8gZmlyCisJCQkJaWYgKElzRklST24oaW9iYXNlKSkgewkvL2ZpcgorCQkJCQkvLyBNb2RlIHNlbGVjdCBPbgorCQkJCQlTbG93SVJSWExvd0FjdGl2ZShpb2Jhc2UsIE9GRik7CisJCQkJCXVkZWxheSgyMCk7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSAweDA5OgkJLyogSUJNMzFUMTEwMCBvciBUZW1pYyBURkRTNjAwMC9URkRTNjUwMCAqLworCQlVc2VPbmVSWChpb2Jhc2UsIE9OKTsJLy91c2UgT05FIFJYLi4uLlJYMQorCQlJbnZlcnRUWChpb2Jhc2UsIE9GRik7CisJCUludmVydFJYKGlvYmFzZSwgT0ZGKTsJLy8gaW52ZXJ0IFJYIHBpbgorCisJCUVuUlgyKGlvYmFzZSwgT04pOworCQlFbkdQSU90b1JYMihpb2Jhc2UsIE9GRik7CisJCWlmIChJc1NJUk9uKGlvYmFzZSkpIHsJLy9zaXIKKwkJCS8vIE1vZGUgc2VsZWN0IE9uCisJCQlTbG93SVJSWExvd0FjdGl2ZShpb2Jhc2UsIE9OKTsKKwkJCXVkZWxheSgyMCk7CisJCQkvLyBNb2RlIHNlbGVjdCBPZmYKKwkJCVNsb3dJUlJYTG93QWN0aXZlKGlvYmFzZSwgT0ZGKTsKKwkJfQorCQlpZiAoSXNNSVJPbihpb2Jhc2UpKSB7CS8vbWlyCisJCQkvLyBNb2RlIHNlbGVjdCBPbgorCQkJU2xvd0lSUlhMb3dBY3RpdmUoaW9iYXNlLCBPRkYpOworCQkJdWRlbGF5KDIwKTsKKwkJCS8vIE1vZGUgc2VsZWN0IE9mZgorCQkJU2xvd0lSUlhMb3dBY3RpdmUoaW9iYXNlLCBPTik7CisJCX0gZWxzZSB7CS8vIGZpcgorCQkJaWYgKElzRklST24oaW9iYXNlKSkgewkvL2ZpcgorCQkJCS8vIE1vZGUgc2VsZWN0IE9uCisJCQkJU2xvd0lSUlhMb3dBY3RpdmUoaW9iYXNlLCBPRkYpOworCQkJCS8vIFRYIE9uCisJCQkJV3JpdGVUWChpb2Jhc2UsIE9OKTsKKwkJCQl1ZGVsYXkoMjApOworCQkJCS8vIE1vZGUgc2VsZWN0IE9GRgorCQkJCVNsb3dJUlJYTG93QWN0aXZlKGlvYmFzZSwgT04pOworCQkJCXVkZWxheSgyMCk7CisJCQkJLy8gVFggT2ZmCisJCQkJV3JpdGVUWChpb2Jhc2UsIE9GRik7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDB4MGQ6CisJCVVzZU9uZVJYKGlvYmFzZSwgT0ZGKTsJLy8gdXNlIHR3byBSWCBwaW4gICBSWDEsUlgyCisJCUludmVydFRYKGlvYmFzZSwgT0ZGKTsKKwkJSW52ZXJ0UlgoaW9iYXNlLCBPRkYpOworCQlTbG93SVJSWExvd0FjdGl2ZShpb2Jhc2UsIE9GRik7CisJCWlmIChJc1NJUk9uKGlvYmFzZSkpIHsJLy9zaXIKKwkJCUVuR1BJT3RvUlgyKGlvYmFzZSwgT0ZGKTsKKwkJCVdyaXRlR0lPKGlvYmFzZSwgT0ZGKTsKKwkJCUVuUlgyKGlvYmFzZSwgT0ZGKTsJLy9zaXIgdG8gcngyCisJCX0gZWxzZSB7CS8vIGZpciBtaXIKKwkJCUVuR1BJT3RvUlgyKGlvYmFzZSwgT0ZGKTsKKwkJCVdyaXRlR0lPKGlvYmFzZSwgT0ZGKTsKKwkJCUVuUlgyKGlvYmFzZSwgT0ZGKTsJLy9maXIgdG8gcngKKwkJfQorCQlicmVhazsKKworCWNhc2UgMHgxMToJCS8qIFRlbWljIFRGRFM0NTAwICovCisKKwkJSVJEQV9ERUJVRygyLCAiJXM6IFRlbWljIFRGRFM0NTAwOiBPbmUgUlggcGluLCBUWCBub3JtYWwsIFJYIGludmVydGVkLlxuIiwgX19GVU5DVElPTl9fKTsKKworCQlVc2VPbmVSWChpb2Jhc2UsIE9OKTsJLy91c2UgT05FIFJYLi4uLlJYMQorCQlJbnZlcnRUWChpb2Jhc2UsIE9GRik7CisJCUludmVydFJYKGlvYmFzZSwgT04pOwkvLyBpbnZlcnQgUlggcGluCisJCisJCUVuUlgyKGlvYmFzZSwgT04pOwkvL3NpciB0byByeDIKKwkJRW5HUElPdG9SWDIoaW9iYXNlLCBPRkYpOworCisJCWlmKCBJc1NJUk9uKGlvYmFzZSkgKXsJLy9zaXIKKworCQkJLy8gTW9kZSBzZWxlY3QgT24KKwkJCVNsb3dJUlJYTG93QWN0aXZlKGlvYmFzZSwgT04pOworCQkJdWRlbGF5KDIwKTsKKwkJCS8vIE1vZGUgc2VsZWN0IE9mZgorCQkJU2xvd0lSUlhMb3dBY3RpdmUoaW9iYXNlLCBPRkYpOworCisJCX0gZWxzZXsKKwkJCUlSREFfREVCVUcoMCwgIiVzOiBXYXJuaW5nOiBURkRTNDUwMCBub3QgcnVubmluZyBpbiBTSVIgbW9kZSAhXG4iLCBfX0ZVTkNUSU9OX18pOworCQl9CisJCWJyZWFrOworCisJY2FzZSAweDBmZjoJCS8qIFZpc2hheSAqLworCQlpZiAoSXNTSVJPbihpb2Jhc2UpKQorCQkJbW9kZSA9IDA7CisJCWVsc2UgaWYgKElzTUlST24oaW9iYXNlKSkKKwkJCW1vZGUgPSAxOworCQllbHNlIGlmIChJc0ZJUk9uKGlvYmFzZSkpCisJCQltb2RlID0gMjsKKwkJZWxzZSBpZiAoSXNWRklST24oaW9iYXNlKSkKKwkJCW1vZGUgPSA1OwkvL1ZGSVItMTYKKwkJU0lfU2V0TW9kZShpb2Jhc2UsIG1vZGUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUlSREFfRVJST1IoIiVzOiBFcnJvcjogZG9uZ2xlX2lkICVkIHVuc3VwcG9ydGVkICFcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIGRvbmdsZV9pZCk7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gdmlhX2lyY2NfY2hhbmdlX3NwZWVkIChzZWxmLCBiYXVkKQorICoKKyAqICAgIENoYW5nZSB0aGUgc3BlZWQgb2YgdGhlIGRldmljZQorICoKKyAqLworc3RhdGljIHZvaWQgdmlhX2lyY2NfY2hhbmdlX3NwZWVkKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZiwgX191MzIgc3BlZWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNlbGYtPm5ldGRldjsKKwl1MTYgaW9iYXNlOworCXU4IHZhbHVlID0gMCwgYlRtcDsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCS8qIFVwZGF0ZSBhY2NvdW50aW5nIGZvciBuZXcgc3BlZWQgKi8KKwlzZWxmLT5pby5zcGVlZCA9IHNwZWVkOworCUlSREFfREVCVUcoMSwgIiVzOiBjaGFuZ2Vfc3BlZWQgdG8gJWQgYnBzLlxuIiwgX19GVU5DVElPTl9fLCBzcGVlZCk7CisKKwlXcml0ZVJlZyhpb2Jhc2UsIElfU1RfQ1RfMCwgMHgwKTsKKworCS8qIENvbnRyb2xsZXIgbW9kZSBzZWxsZWN0aW9uICovCisJc3dpdGNoIChzcGVlZCkgeworCWNhc2UgMjQwMDoKKwljYXNlIDk2MDA6CisJY2FzZSAxOTIwMDoKKwljYXNlIDM4NDAwOgorCWNhc2UgNTc2MDA6CisJY2FzZSAxMTUyMDA6CisJCXZhbHVlID0gKDExNTIwMC9zcGVlZCktMTsKKwkJU2V0U0lSKGlvYmFzZSwgT04pOworCQlDUkMxNihpb2Jhc2UsIE9OKTsKKwkJYnJlYWs7CisJY2FzZSA1NzYwMDA6CisJCS8qIEZJWE1FOiB0aGlzIGNhbid0IGJlIHJpZ2h0LCBhcyBpdCdzIHRoZSBzYW1lIGFzIDExNTIwMCwKKwkJICogYW5kIDU3NjAwMCBpcyBNSVIsIG5vdCBTSVIuICovCisJCXZhbHVlID0gMDsKKwkJU2V0U0lSKGlvYmFzZSwgT04pOworCQlDUkMxNihpb2Jhc2UsIE9OKTsKKwkJYnJlYWs7CisJY2FzZSAxMTUyMDAwOgorCQl2YWx1ZSA9IDA7CisJCVNldE1JUihpb2Jhc2UsIE9OKTsKKwkJLyogRklYTUU6IENSQyA/Pz8gKi8KKwkJYnJlYWs7CisJY2FzZSA0MDAwMDAwOgorCQl2YWx1ZSA9IDA7CisJCVNldEZJUihpb2Jhc2UsIE9OKTsKKwkJU2V0UHVsc2VXaWR0aChpb2Jhc2UsIDApOworCQlTZXRTZW5kUHJlYW1ibGVDb3VudChpb2Jhc2UsIDE0KTsKKwkJQ1JDMTYoaW9iYXNlLCBPRkYpOworCQlFblRYQ1JDKGlvYmFzZSwgT04pOworCQlicmVhazsKKwljYXNlIDE2MDAwMDAwOgorCQl2YWx1ZSA9IDA7CisJCVNldFZGSVIoaW9iYXNlLCBPTik7CisJCS8qIEZJWE1FOiBDUkMgPz8/ICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZhbHVlID0gMDsKKwkJYnJlYWs7CisJfQorCisJLyogU2V0IGJhdWRyYXRlIHRvIDB4MTlbMi4uN10gKi8KKwliVG1wID0gKFJlYWRSZWcoaW9iYXNlLCBJX0NGX0hfMSkgJiAweDAzKTsKKwliVG1wIHw9IHZhbHVlIDw8IDI7CisJV3JpdGVSZWcoaW9iYXNlLCBJX0NGX0hfMSwgYlRtcCk7CisKKwkvKiBTb21lIGRvbmdsZXMgbWF5IG5lZWQgdG8gYmUgaW5mb3JtZWQgYWJvdXQgc3BlZWQgY2hhbmdlcy4gKi8KKwl2aWFfaXJjY19jaGFuZ2VfZG9uZ2xlX3NwZWVkKGlvYmFzZSwgc3BlZWQsIHNlbGYtPmlvLmRvbmdsZV9pZCk7CisKKwkvKiBTZXQgRklGTyBzaXplIHRvIDY0ICovCisJU2V0RklGTyhpb2Jhc2UsIDY0KTsKKworCS8qIEVuYWJsZSBJUiAqLworCVdyaXRlUmVnKGlvYmFzZSwgSV9TVF9DVF8wLCAweDgwKTsKKworCS8vIEVuVFhGSUZPSGFsZkxldmVsSW50KGlvYmFzZSxPTik7CisKKwkvKiBFbmFibGUgc29tZSBpbnRlcnJ1cHRzIHNvIHdlIGNhbiByZWNlaXZlIGZyYW1lcyAqLworCS8vRW5BbGxJbnQoaW9iYXNlLE9OKTsKKworCWlmIChJc1NJUk9uKGlvYmFzZSkpIHsKKwkJU0lSRmlsdGVyKGlvYmFzZSwgT04pOworCQlTSVJSZWN2QW55KGlvYmFzZSwgT04pOworCX0gZWxzZSB7CisJCVNJUkZpbHRlcihpb2Jhc2UsIE9GRik7CisJCVNJUlJlY3ZBbnkoaW9iYXNlLCBPRkYpOworCX0KKworCWlmIChzcGVlZCA+IDExNTIwMCkgeworCQkvKiBJbnN0YWxsIEZJUiB4bWl0IGhhbmRsZXIgKi8KKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB2aWFfaXJjY19oYXJkX3htaXRfZmlyOworCQl2aWFfaXJjY19kbWFfcmVjZWl2ZShzZWxmKTsKKwl9IGVsc2UgeworCQkvKiBJbnN0YWxsIFNJUiB4bWl0IGhhbmRsZXIgKi8KKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB2aWFfaXJjY19oYXJkX3htaXRfc2lyOworCX0KKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB2aWFfaXJjY19oYXJkX3htaXQgKHNrYiwgZGV2KQorICoKKyAqICAgIFRyYW5zbWl0IHRoZSBmcmFtZSEKKyAqCisgKi8KK3N0YXRpYyBpbnQgdmlhX2lyY2NfaGFyZF94bWl0X3NpcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgaW9iYXNlOworCV9fdTMyIHNwZWVkOworCisJc2VsZiA9IChzdHJ1Y3QgdmlhX2lyY2NfY2IgKikgZGV2LT5wcml2OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgc3BlZWQgKi8KKwlzcGVlZCA9IGlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKKwlpZiAoKHNwZWVkICE9IHNlbGYtPmlvLnNwZWVkKSAmJiAoc3BlZWQgIT0gLTEpKSB7CisJCS8qIENoZWNrIGZvciBlbXB0eSBmcmFtZSAqLworCQlpZiAoIXNrYi0+bGVuKSB7CisJCQl2aWFfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc3BlZWQpOworCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQlzZWxmLT5uZXdfc3BlZWQgPSBzcGVlZDsKKwl9CisJSW5pdENhcmQoaW9iYXNlKTsKKwlDb21tb25Jbml0KGlvYmFzZSk7CisJU0lSRmlsdGVyKGlvYmFzZSwgT04pOworCVNldFNJUihpb2Jhc2UsIE9OKTsKKwlDUkMxNihpb2Jhc2UsIE9OKTsKKwlFblRYQ1JDKGlvYmFzZSwgMCk7CisJV3JpdGVSZWcoaW9iYXNlLCBJX1NUX0NUXzAsIDB4MDApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwlzZWxmLT50eF9idWZmLmRhdGEgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisJc2VsZi0+dHhfYnVmZi5sZW4gPQorCSAgICBhc3luY193cmFwX3NrYihza2IsIHNlbGYtPnR4X2J1ZmYuZGF0YSwKKwkJCSAgIHNlbGYtPnR4X2J1ZmYudHJ1ZXNpemUpOworCisJc2VsZi0+c3RhdHMudHhfYnl0ZXMgKz0gc2VsZi0+dHhfYnVmZi5sZW47CisJLyogU2VuZCB0aGlzIGZyYW1lIHdpdGggb2xkIHNwZWVkICovCisJU2V0QmF1ZFJhdGUoaW9iYXNlLCBzZWxmLT5pby5zcGVlZCk7CisJU2V0UHVsc2VXaWR0aChpb2Jhc2UsIDEyKTsKKwlTZXRTZW5kUHJlYW1ibGVDb3VudChpb2Jhc2UsIDApOworCVdyaXRlUmVnKGlvYmFzZSwgSV9TVF9DVF8wLCAweDgwKTsKKworCUVuYWJsZVRYKGlvYmFzZSwgT04pOworCUVuYWJsZVJYKGlvYmFzZSwgT0ZGKTsKKworCVJlc2V0Q2hpcChpb2Jhc2UsIDApOworCVJlc2V0Q2hpcChpb2Jhc2UsIDEpOworCVJlc2V0Q2hpcChpb2Jhc2UsIDIpOworCVJlc2V0Q2hpcChpb2Jhc2UsIDMpOworCVJlc2V0Q2hpcChpb2Jhc2UsIDQpOworCisJRW5BbGxJbnQoaW9iYXNlLCBPTik7CisJRW5UWERNQShpb2Jhc2UsIE9OKTsKKwlFblJYRE1BKGlvYmFzZSwgT0ZGKTsKKworCWlyZGFfc2V0dXBfZG1hKHNlbGYtPmlvLmRtYSwgc2VsZi0+dHhfYnVmZl9kbWEsIHNlbGYtPnR4X2J1ZmYubGVuLAorCQkgICAgICAgRE1BX1RYX01PREUpOworCisJU2V0U2VuZEJ5dGUoaW9iYXNlLCBzZWxmLT50eF9idWZmLmxlbik7CisJUlhTdGFydChpb2Jhc2UsIE9GRik7CisJVFhTdGFydChpb2Jhc2UsIE9OKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlhX2lyY2NfaGFyZF94bWl0X2ZpcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGY7CisJdTE2IGlvYmFzZTsKKwlfX3UzMiBzcGVlZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2VsZiA9IChzdHJ1Y3QgdmlhX2lyY2NfY2IgKikgZGV2LT5wcml2OworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJaWYgKHNlbGYtPnN0X2ZpZm8ubGVuKQorCQlyZXR1cm4gMDsKKwlpZiAoc2VsZi0+Y2hpcF9pZCA9PSAweDMwNzYpCisJCWlvZGVsYXkoMTUwMCk7CisJZWxzZQorCQl1ZGVsYXkoMTUwMCk7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXNwZWVkID0gaXJkYV9nZXRfbmV4dF9zcGVlZChza2IpOworCWlmICgoc3BlZWQgIT0gc2VsZi0+aW8uc3BlZWQpICYmIChzcGVlZCAhPSAtMSkpIHsKKwkJaWYgKCFza2ItPmxlbikgeworCQkJdmlhX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIHNwZWVkKTsKKwkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZQorCQkJc2VsZi0+bmV3X3NwZWVkID0gc3BlZWQ7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLmZyZWVdLnN0YXJ0ID0gc2VsZi0+dHhfZmlmby50YWlsOworCXNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5mcmVlXS5sZW4gPSBza2ItPmxlbjsKKworCXNlbGYtPnR4X2ZpZm8udGFpbCArPSBza2ItPmxlbjsKKwlzZWxmLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwltZW1jcHkoc2VsZi0+dHhfZmlmby5xdWV1ZVtzZWxmLT50eF9maWZvLmZyZWVdLnN0YXJ0LCBza2ItPmRhdGEsCisJICAgICAgIHNrYi0+bGVuKTsKKwlzZWxmLT50eF9maWZvLmxlbisrOworCXNlbGYtPnR4X2ZpZm8uZnJlZSsrOworLy9GMDEgICBpZiAoc2VsZi0+dHhfZmlmby5sZW4gPT0gMSkgeworCXZpYV9pcmNjX2RtYV94bWl0KHNlbGYsIGlvYmFzZSk7CisvL0YwMSAgIH0KKy8vRjAxICAgaWYgKHNlbGYtPnR4X2ZpZm8uZnJlZSA8IChNQVhfVFhfV0lORE9XIC0xICkpIG5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgdmlhX2lyY2NfZG1hX3htaXQoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmLCB1MTYgaW9iYXNlKQoreworCUVuVFhETUEoaW9iYXNlLCBPRkYpOworCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1hNSVQ7CisJRW5QaHlzKGlvYmFzZSwgT04pOworCUVuYWJsZVRYKGlvYmFzZSwgT04pOworCUVuYWJsZVJYKGlvYmFzZSwgT0ZGKTsKKwlSZXNldENoaXAoaW9iYXNlLCAwKTsKKwlSZXNldENoaXAoaW9iYXNlLCAxKTsKKwlSZXNldENoaXAoaW9iYXNlLCAyKTsKKwlSZXNldENoaXAoaW9iYXNlLCAzKTsKKwlSZXNldENoaXAoaW9iYXNlLCA0KTsKKwlFbkFsbEludChpb2Jhc2UsIE9OKTsKKwlFblRYRE1BKGlvYmFzZSwgT04pOworCUVuUlhETUEoaW9iYXNlLCBPRkYpOworCWlyZGFfc2V0dXBfZG1hKHNlbGYtPmlvLmRtYSwKKwkJICAgICAgICgodTggKilzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8ucHRyXS5zdGFydCAtCisJCQlzZWxmLT50eF9idWZmLmhlYWQpICsgc2VsZi0+dHhfYnVmZl9kbWEsCisJCSAgICAgICBzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8ucHRyXS5sZW4sIERNQV9UWF9NT0RFKTsKKwlJUkRBX0RFQlVHKDEsICIlczogdHhfZmlmby5wdHI9JXgsbGVuPSV4LHR4X2ZpZm8ubGVuPSV4Li5cbiIsCisJCSAgIF9fRlVOQ1RJT05fXywgc2VsZi0+dHhfZmlmby5wdHIsCisJCSAgIHNlbGYtPnR4X2ZpZm8ucXVldWVbc2VsZi0+dHhfZmlmby5wdHJdLmxlbiwKKwkJICAgc2VsZi0+dHhfZmlmby5sZW4pOworCisJU2V0U2VuZEJ5dGUoaW9iYXNlLCBzZWxmLT50eF9maWZvLnF1ZXVlW3NlbGYtPnR4X2ZpZm8ucHRyXS5sZW4pOworCVJYU3RhcnQoaW9iYXNlLCBPRkYpOworCVRYU3RhcnQoaW9iYXNlLCBPTik7CisJcmV0dXJuIDA7CisKK30KKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX2RtYV94bWl0X2NvbXBsZXRlIChzZWxmKQorICoKKyAqICAgIFRoZSB0cmFuc2ZlciBvZiBhIGZyYW1lIGluIGZpbmlzaGVkLiBUaGlzIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQgCisgKiAgICBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIKKyAqCisgKi8KK3N0YXRpYyBpbnQgdmlhX2lyY2NfZG1hX3htaXRfY29tcGxldGUoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmKQoreworCWludCBpb2Jhc2U7CisJaW50IHJldCA9IFRSVUU7CisJdTggVHhfc3RhdHVzOworCisJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCS8qIERpc2FibGUgRE1BICovCisvLyAgICAgIERpc2FibGVEbWFDaGFubmVsKHNlbGYtPmlvLmRtYSk7CisJLyogQ2hlY2sgZm9yIHVuZGVycnJ1biEgKi8KKwkvKiBDbGVhciBiaXQsIGJ5IHdyaXRpbmcgMSBpbnRvIGl0ICovCisJVHhfc3RhdHVzID0gR2V0VFhTdGF0dXMoaW9iYXNlKTsKKwlpZiAoVHhfc3RhdHVzICYgMHgwOCkgeworCQlzZWxmLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJc2VsZi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJaHdyZXNldChzZWxmKTsKKy8vIGhvdyB0byBjbGVhciB1bmRlcnJydW4gPworCX0gZWxzZSB7CisJCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJUmVzZXRDaGlwKGlvYmFzZSwgMyk7CisJCVJlc2V0Q2hpcChpb2Jhc2UsIDQpOworCX0KKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgc3BlZWQgKi8KKwlpZiAoc2VsZi0+bmV3X3NwZWVkKSB7CisJCXZpYV9pcmNjX2NoYW5nZV9zcGVlZChzZWxmLCBzZWxmLT5uZXdfc3BlZWQpOworCQlzZWxmLT5uZXdfc3BlZWQgPSAwOworCX0KKworCS8qIEZpbmlzaGVkIHdpdGggdGhpcyBmcmFtZSwgc28gcHJlcGFyZSBmb3IgbmV4dCAqLworCWlmIChJc0ZJUk9uKGlvYmFzZSkpIHsKKwkJaWYgKHNlbGYtPnR4X2ZpZm8ubGVuKSB7CisJCQlzZWxmLT50eF9maWZvLmxlbi0tOworCQkJc2VsZi0+dHhfZmlmby5wdHIrKzsKKwkJfQorCX0KKwlJUkRBX0RFQlVHKDEsCisJCSAgICIlczogdHhfZmlmby5sZW49JXggLHR4X2ZpZm8ucHRyPSV4LHR4X2ZpZm8uZnJlZT0leC4uLlxuIiwKKwkJICAgX19GVU5DVElPTl9fLAorCQkgICBzZWxmLT50eF9maWZvLmxlbiwgc2VsZi0+dHhfZmlmby5wdHIsIHNlbGYtPnR4X2ZpZm8uZnJlZSk7CisvKiBGMDFfUworCS8vIEFueSBmcmFtZXMgdG8gYmUgc2VudCBiYWNrLXRvLWJhY2s/IAorCWlmIChzZWxmLT50eF9maWZvLmxlbikgeworCQkvLyBOb3QgZmluaXNoZWQgeWV0ISAKKwkgIAl2aWFfaXJjY19kbWFfeG1pdChzZWxmLCBpb2Jhc2UpOworCQlyZXQgPSBGQUxTRTsKKwl9IGVsc2UgeyAKK0YwMV9FKi8KKwkvLyBSZXNldCBUeCBGSUZPIGluZm8gCisJc2VsZi0+dHhfZmlmby5sZW4gPSBzZWxmLT50eF9maWZvLnB0ciA9IHNlbGYtPnR4X2ZpZm8uZnJlZSA9IDA7CisJc2VsZi0+dHhfZmlmby50YWlsID0gc2VsZi0+dHhfYnVmZi5oZWFkOworLy9GMDEgICB9CisKKwkvLyBNYWtlIHN1cmUgd2UgaGF2ZSByb29tIGZvciBtb3JlIGZyYW1lcyAKKy8vRjAxICAgaWYgKHNlbGYtPnR4X2ZpZm8uZnJlZSA8IChNQVhfVFhfV0lORE9XIC0xICkpIHsKKwkvLyBOb3QgYnVzeSB0cmFuc21pdHRpbmcgYW55bW9yZSAKKwkvLyBUZWxsIHRoZSBuZXR3b3JrIGxheWVyLCB0aGF0IHdlIGNhbiBhY2NlcHQgbW9yZSBmcmFtZXMgCisJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworLy9GMDEgICB9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX2RtYV9yZWNlaXZlIChzZWxmKQorICoKKyAqICAgIFNldCBjb25maWd1cmF0aW9uIGZvciByZWNlaXZlIGEgZnJhbWUuCisgKgorICovCitzdGF0aWMgaW50IHZpYV9pcmNjX2RtYV9yZWNlaXZlKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc2VsZi0+dHhfZmlmby5sZW4gPSBzZWxmLT50eF9maWZvLnB0ciA9IHNlbGYtPnR4X2ZpZm8uZnJlZSA9IDA7CisJc2VsZi0+dHhfZmlmby50YWlsID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCXNlbGYtPlJ4RGF0YVJlYWR5ID0gMDsKKwlzZWxmLT5pby5kaXJlY3Rpb24gPSBJT19SRUNWOworCXNlbGYtPnJ4X2J1ZmYuZGF0YSA9IHNlbGYtPnJ4X2J1ZmYuaGVhZDsKKwlzZWxmLT5zdF9maWZvLmxlbiA9IHNlbGYtPnN0X2ZpZm8ucGVuZGluZ19ieXRlcyA9IDA7CisJc2VsZi0+c3RfZmlmby50YWlsID0gc2VsZi0+c3RfZmlmby5oZWFkID0gMDsKKworCUVuUGh5cyhpb2Jhc2UsIE9OKTsKKwlFbmFibGVUWChpb2Jhc2UsIE9GRik7CisJRW5hYmxlUlgoaW9iYXNlLCBPTik7CisKKwlSZXNldENoaXAoaW9iYXNlLCAwKTsKKwlSZXNldENoaXAoaW9iYXNlLCAxKTsKKwlSZXNldENoaXAoaW9iYXNlLCAyKTsKKwlSZXNldENoaXAoaW9iYXNlLCAzKTsKKwlSZXNldENoaXAoaW9iYXNlLCA0KTsKKworCUVuQWxsSW50KGlvYmFzZSwgT04pOworCUVuVFhETUEoaW9iYXNlLCBPRkYpOworCUVuUlhETUEoaW9iYXNlLCBPTik7CisJaXJkYV9zZXR1cF9kbWEoc2VsZi0+aW8uZG1hMiwgc2VsZi0+cnhfYnVmZl9kbWEsCisJCSAgc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSwgRE1BX1JYX01PREUpOworCVRYU3RhcnQoaW9iYXNlLCBPRkYpOworCVJYU3RhcnQoaW9iYXNlLCBPTik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX2RtYV9yZWNlaXZlX2NvbXBsZXRlIChzZWxmKQorICoKKyAqICAgIENvbnRyb2xsZXIgRmluaXNoZWQgd2l0aCByZWNlaXZpbmcgZnJhbWVzLAorICogICAgYW5kIHRoaXMgcm91dGluZSBpcyBjYWxsIGJ5IElTUgorICogICAgCisgKi8KK3N0YXRpYyBpbnQgdmlhX2lyY2NfZG1hX3JlY2VpdmVfY29tcGxldGUoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmLAorCQkJCQkgaW50IGlvYmFzZSkKK3sKKwlzdHJ1Y3Qgc3RfZmlmbyAqc3RfZmlmbzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBsZW4sIGk7CisJdTggc3RhdHVzID0gMDsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCXN0X2ZpZm8gPSAmc2VsZi0+c3RfZmlmbzsKKworCWlmIChzZWxmLT5pby5zcGVlZCA8IDQwMDAwMDApIHsJLy9TcGVlZCBiZWxvdyBGSVIKKwkJbGVuID0gR2V0UmVjdkJ5dGUoaW9iYXNlLCBzZWxmKTsKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyAxKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJcmV0dXJuIEZBTFNFOworCQkvLyBNYWtlIHN1cmUgSVAgaGVhZGVyIGdldHMgYWxpZ25lZCAKKwkJc2tiX3Jlc2VydmUoc2tiLCAxKTsKKwkJc2tiX3B1dChza2IsIGxlbiAtIDIpOworCQlpZiAoc2VsZi0+Y2hpcF9pZCA9PSAweDMwNzYpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW4gLSAyOyBpKyspCisJCQkJc2tiLT5kYXRhW2ldID0gc2VsZi0+cnhfYnVmZi5kYXRhW2kgKiAyXTsKKwkJfSBlbHNlIHsKKwkJCWlmIChzZWxmLT5jaGlwX2lkID09IDB4MzA5NikgeworCQkJCWZvciAoaSA9IDA7IGkgPCBsZW4gLSAyOyBpKyspCisJCQkJCXNrYi0+ZGF0YVtpXSA9CisJCQkJCSAgICBzZWxmLT5yeF9idWZmLmRhdGFbaV07CisJCQl9CisJCX0KKwkJLy8gTW92ZSB0byBuZXh0IGZyYW1lIAorCQlzZWxmLT5yeF9idWZmLmRhdGEgKz0gbGVuOworCQlzZWxmLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJc2tiLT5kZXYgPSBzZWxmLT5uZXRkZXY7CisJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOworCQluZXRpZl9yeChza2IpOworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwllbHNlIHsJCQkvL0ZJUiBtb2RlCisJCWxlbiA9IEdldFJlY3ZCeXRlKGlvYmFzZSwgc2VsZik7CisJCWlmIChsZW4gPT0gMCkKKwkJCXJldHVybiBUUlVFOwkvL2ludGVycnVwdCBvbmx5LCBkYXRhIG1heWJlIG1vdmUgYnkgUnhUICAKKwkJaWYgKCgobGVuIC0gNCkgPCAyKSB8fCAoKGxlbiAtIDQpID4gMjA0OCkpIHsKKwkJCUlSREFfREVCVUcoMSwgIiVzKCk6IFRyb3VibGU6bGVuPSV4LEN1ckNvdW50PSV4LExhc3RDb3VudD0leC4uXG4iLAorCQkJCSAgIF9fRlVOQ1RJT05fXywgbGVuLCBSeEN1ckNvdW50KGlvYmFzZSwgc2VsZiksCisJCQkJICAgc2VsZi0+UnhMYXN0Q291bnQpOworCQkJaHdyZXNldChzZWxmKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCQlJUkRBX0RFQlVHKDIsICIlcygpOiBmaWZvLmxlbj0leCxsZW49JXgsQ3VyQ291bnQ9JXguLlxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywKKwkJCSAgIHN0X2ZpZm8tPmxlbiwgbGVuIC0gNCwgUnhDdXJDb3VudChpb2Jhc2UsIHNlbGYpKTsKKworCQlzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPnRhaWxdLnN0YXR1cyA9IHN0YXR1czsKKwkJc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT50YWlsXS5sZW4gPSBsZW47CisJCXN0X2ZpZm8tPnBlbmRpbmdfYnl0ZXMgKz0gbGVuOworCQlzdF9maWZvLT50YWlsKys7CisJCXN0X2ZpZm8tPmxlbisrOworCQlpZiAoc3RfZmlmby0+dGFpbCA+IE1BWF9SWF9XSU5ET1cpCisJCQlzdF9maWZvLT50YWlsID0gMDsKKwkJc2VsZi0+UnhEYXRhUmVhZHkgPSAwOworCisJCS8vIEl0IG1heWJlIGhhdmUgTUFYX1JYX1dJTkRPVyBwYWNrYWdlIHJlY2VpdmUgYnkKKwkJLy8gcmVjZWl2ZV9jb21wbGV0ZSBiZWZvcmUgVGltZXIgSVJRCisvKiBGMDFfUworICAgICAgICAgIGlmIChzdF9maWZvLT5sZW4gPCAoTUFYX1JYX1dJTkRPVysyICkpIHsgCisJCSAgUlhTdGFydChpb2Jhc2UsT04pOworCSAgCSAgU2V0VGltZXIoaW9iYXNlLDQpOworCSAgfQorCSAgZWxzZQkgIHsgCitGMDFfRSAqLworCQlFbmFibGVSWChpb2Jhc2UsIE9GRik7CisJCUVuUlhETUEoaW9iYXNlLCBPRkYpOworCQlSWFN0YXJ0KGlvYmFzZSwgT0ZGKTsKKy8vRjAxX1MKKwkJLy8gUHV0IHRoaXMgZW50cnkgYmFjayBpbiBmaWZvIAorCQlpZiAoc3RfZmlmby0+aGVhZCA+IE1BWF9SWF9XSU5ET1cpCisJCQlzdF9maWZvLT5oZWFkID0gMDsKKwkJc3RhdHVzID0gc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT5oZWFkXS5zdGF0dXM7CisJCWxlbiA9IHN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0ubGVuOworCQlzdF9maWZvLT5oZWFkKys7CisJCXN0X2ZpZm8tPmxlbi0tOworCisJCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgMSAtIDQpOworCQkvKgorCQkgKiBpZiBmcmFtZSBzaXplLGRhdGEgcHRyLG9yIHNrYiBwdHIgYXJlIHdyb25nICx0aGUgZ2V0IG5leHQKKwkJICogZW50cnkuCisJCSAqLworCQlpZiAoKHNrYiA9PSBOVUxMKSB8fCAoc2tiLT5kYXRhID09IE5VTEwpCisJCSAgICB8fCAoc2VsZi0+cnhfYnVmZi5kYXRhID09IE5VTEwpIHx8IChsZW4gPCA2KSkgeworCQkJc2VsZi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJcmV0dXJuIFRSVUU7CisJCX0KKwkJc2tiX3Jlc2VydmUoc2tiLCAxKTsKKwkJc2tiX3B1dChza2IsIGxlbiAtIDQpOworCisJCW1lbWNweShza2ItPmRhdGEsIHNlbGYtPnJ4X2J1ZmYuZGF0YSwgbGVuIC0gNCk7CisJCUlSREFfREVCVUcoMiwgIiVzKCk6IGxlbj0leC5yeF9idWZmPSVwXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgICBsZW4gLSA0LCBzZWxmLT5yeF9idWZmLmRhdGEpOworCisJCS8vIE1vdmUgdG8gbmV4dCBmcmFtZSAKKwkJc2VsZi0+cnhfYnVmZi5kYXRhICs9IGxlbjsKKwkJc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCXNrYi0+ZGV2ID0gc2VsZi0+bmV0ZGV2OworCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKKwkJbmV0aWZfcngoc2tiKTsKKworLy9GMDFfRQorCX0JCQkvL0ZJUgorCXJldHVybiBUUlVFOworCit9CisKKy8qCisgKiBpZiBmcmFtZSBpcyByZWNlaXZlZCAsIGJ1dCBubyBJTlQgLHRoZW4gdXNlIHRoaXMgcm91dGluZSB0byB1cGxvYWQgZnJhbWUuCisgKi8KK3N0YXRpYyBpbnQgdXBsb2FkX3J4ZGF0YShzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYsIGludCBpb2Jhc2UpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgbGVuOworCXN0cnVjdCBzdF9maWZvICpzdF9maWZvOworCXN0X2ZpZm8gPSAmc2VsZi0+c3RfZmlmbzsKKworCWxlbiA9IEdldFJlY3ZCeXRlKGlvYmFzZSwgc2VsZik7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpOiBsZW49JXhcbiIsIF9fRlVOQ1RJT05fXywgbGVuKTsKKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgMSk7CisJaWYgKChza2IgPT0gTlVMTCkgfHwgKChsZW4gLSA0KSA8IDIpKSB7CisJCXNlbGYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlza2JfcmVzZXJ2ZShza2IsIDEpOworCXNrYl9wdXQoc2tiLCBsZW4gLSA0ICsgMSk7CisJbWVtY3B5KHNrYi0+ZGF0YSwgc2VsZi0+cnhfYnVmZi5kYXRhLCBsZW4gLSA0ICsgMSk7CisJc3RfZmlmby0+dGFpbCsrOworCXN0X2ZpZm8tPmxlbisrOworCWlmIChzdF9maWZvLT50YWlsID4gTUFYX1JYX1dJTkRPVykKKwkJc3RfZmlmby0+dGFpbCA9IDA7CisJLy8gTW92ZSB0byBuZXh0IGZyYW1lIAorCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47CisJc2VsZi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lSREEpOworCW5ldGlmX3J4KHNrYik7CisJaWYgKHN0X2ZpZm8tPmxlbiA8IChNQVhfUlhfV0lORE9XICsgMikpIHsKKwkJUlhTdGFydChpb2Jhc2UsIE9OKTsKKwl9IGVsc2UgeworCQlFbmFibGVSWChpb2Jhc2UsIE9GRik7CisJCUVuUlhETUEoaW9iYXNlLCBPRkYpOworCQlSWFN0YXJ0KGlvYmFzZSwgT0ZGKTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBJbXBsZW1lbnQgYmFjayB0byBiYWNrIHJlY2VpdmUgLCB1c2UgdGhpcyByb3V0aW5lIHRvIHVwbG9hZCBkYXRhLgorICovCisKK3N0YXRpYyBpbnQgUnhUaW1lckhhbmRsZXIoc3RydWN0IHZpYV9pcmNjX2NiICpzZWxmLCBpbnQgaW9iYXNlKQoreworCXN0cnVjdCBzdF9maWZvICpzdF9maWZvOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGxlbjsKKwl1OCBzdGF0dXM7CisKKwlzdF9maWZvID0gJnNlbGYtPnN0X2ZpZm87CisKKwlpZiAoQ2tSeFJlY3YoaW9iYXNlLCBzZWxmKSkgeworCQkvLyBpZiBzdGlsbCByZWNlaXZpbmcgLHRoZW4gcmV0dXJuICxkb24ndCB1cGxvYWQgZnJhbWUgCisJCXNlbGYtPlJldHJ5Q291bnQgPSAwOworCQlTZXRUaW1lcihpb2Jhc2UsIDIwKTsKKwkJc2VsZi0+UnhEYXRhUmVhZHkrKzsKKwkJcmV0dXJuIEZBTFNFOworCX0gZWxzZQorCQlzZWxmLT5SZXRyeUNvdW50Kys7CisKKwlpZiAoKHNlbGYtPlJldHJ5Q291bnQgPj0gMSkgfHwKKwkgICAgKChzdF9maWZvLT5wZW5kaW5nX2J5dGVzICsgMjA0OCkgPiBzZWxmLT5yeF9idWZmLnRydWVzaXplKQorCSAgICB8fCAoc3RfZmlmby0+bGVuID49IChNQVhfUlhfV0lORE9XKSkpIHsKKwkJd2hpbGUgKHN0X2ZpZm8tPmxlbiA+IDApIHsJLy91cGxvYWQgZnJhbWUKKwkJCS8vIFB1dCB0aGlzIGVudHJ5IGJhY2sgaW4gZmlmbyAKKwkJCWlmIChzdF9maWZvLT5oZWFkID4gTUFYX1JYX1dJTkRPVykKKwkJCQlzdF9maWZvLT5oZWFkID0gMDsKKwkJCXN0YXR1cyA9IHN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0uc3RhdHVzOworCQkJbGVuID0gc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT5oZWFkXS5sZW47CisJCQlzdF9maWZvLT5oZWFkKys7CisJCQlzdF9maWZvLT5sZW4tLTsKKworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyAxIC0gNCk7CisJCQkvKgorCQkJICogaWYgZnJhbWUgc2l6ZSwgZGF0YSBwdHIsIG9yIHNrYiBwdHIgYXJlIHdyb25nLAorCQkJICogdGhlbiBnZXQgbmV4dCBlbnRyeS4KKwkJCSAqLworCQkJaWYgKChza2IgPT0gTlVMTCkgfHwgKHNrYi0+ZGF0YSA9PSBOVUxMKQorCQkJICAgIHx8IChzZWxmLT5yeF9idWZmLmRhdGEgPT0gTlVMTCkgfHwgKGxlbiA8IDYpKSB7CisJCQkJc2VsZi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc2tiX3Jlc2VydmUoc2tiLCAxKTsKKwkJCXNrYl9wdXQoc2tiLCBsZW4gLSA0KTsKKwkJCW1lbWNweShza2ItPmRhdGEsIHNlbGYtPnJ4X2J1ZmYuZGF0YSwgbGVuIC0gNCk7CisKKwkJCUlSREFfREVCVUcoMiwgIiVzKCk6IGxlbj0leC5oZWFkPSV4XG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJICAgbGVuIC0gNCwgc3RfZmlmby0+aGVhZCk7CisKKwkJCS8vIE1vdmUgdG8gbmV4dCBmcmFtZSAKKwkJCXNlbGYtPnJ4X2J1ZmYuZGF0YSArPSBsZW47CisJCQlzZWxmLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJCQlzZWxmLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKKwkJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCX0JCS8vd2hpbGUKKwkJc2VsZi0+UmV0cnlDb3VudCA9IDA7CisKKwkJSVJEQV9ERUJVRygyLAorCQkJICAgIiVzKCk6IEVuZCBvZiB1cGxvYWQgSG9zdFN0YXR1cz0leCxSeFN0YXR1cz0leFxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywKKwkJCSAgIEdldEhvc3RTdGF0dXMoaW9iYXNlKSwgR2V0UlhTdGF0dXMoaW9iYXNlKSk7CisKKwkJLyoKKwkJICogaWYgZnJhbWUgaXMgcmVjZWl2ZSBjb21wbGV0ZSBhdCB0aGlzIHJvdXRpbmUgLHRoZW4gdXBsb2FkCisJCSAqIGZyYW1lLgorCQkgKi8KKwkJaWYgKChHZXRSWFN0YXR1cyhpb2Jhc2UpICYgMHgxMCkKKwkJICAgICYmIChSeEN1ckNvdW50KGlvYmFzZSwgc2VsZikgIT0gc2VsZi0+UnhMYXN0Q291bnQpKSB7CisJCQl1cGxvYWRfcnhkYXRhKHNlbGYsIGlvYmFzZSk7CisJCQlpZiAoaXJkYV9kZXZpY2VfdHhxdWV1ZV9lbXB0eShzZWxmLT5uZXRkZXYpKQorCQkJCXZpYV9pcmNjX2RtYV9yZWNlaXZlKHNlbGYpOworCQl9CisJfQkJCS8vIHRpbWVyIGRldGVjdCBjb21wbGV0ZQorCWVsc2UKKwkJU2V0VGltZXIoaW9iYXNlLCA0KTsKKwlyZXR1cm4gVFJVRTsKKworfQorCisKKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX2ludGVycnVwdCAoaXJxLCBkZXZfaWQsIHJlZ3MpCisgKgorICogICAgQW4gaW50ZXJydXB0IGZyb20gdGhlIGNoaXAgaGFzIGFycml2ZWQuIFRpbWUgdG8gZG8gc29tZSB3b3JrCisgKgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgdmlhX2lyY2NfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGY7CisJaW50IGlvYmFzZTsKKwl1OCBpSG9zdEludFR5cGUsIGlSeEludFR5cGUsIGlUeEludFR5cGU7CisKKwlpZiAoIWRldikgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBpcnEgJWQgZm9yIHVua25vd24gZGV2aWNlLlxuIiwgZHJpdmVyX25hbWUsCisJCQkgICAgIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJc2VsZiA9IChzdHJ1Y3QgdmlhX2lyY2NfY2IgKikgZGV2LT5wcml2OworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCXNwaW5fbG9jaygmc2VsZi0+bG9jayk7CisJaUhvc3RJbnRUeXBlID0gR2V0SG9zdFN0YXR1cyhpb2Jhc2UpOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKTogaUhvc3RJbnRUeXBlICUwMng6ICAlcyAlcyAlcyAgJTAyeFxuIiwKKwkJICAgX19GVU5DVElPTl9fLCBpSG9zdEludFR5cGUsCisJCSAgIChpSG9zdEludFR5cGUgJiAweDQwKSA/ICJUaW1lciIgOiAiIiwKKwkJICAgKGlIb3N0SW50VHlwZSAmIDB4MjApID8gIlR4IiA6ICIiLAorCQkgICAoaUhvc3RJbnRUeXBlICYgMHgxMCkgPyAiUngiIDogIiIsCisJCSAgIChpSG9zdEludFR5cGUgJiAweDBlKSA+PiAxKTsKKworCWlmICgoaUhvc3RJbnRUeXBlICYgMHg0MCkgIT0gMCkgewkvL1RpbWVyIEV2ZW50CisJCXNlbGYtPkV2ZW50RmxhZy5UaW1lT3V0Kys7CisJCUNsZWFyVGltZXJJbnQoaW9iYXNlLCAxKTsKKwkJaWYgKHNlbGYtPmlvLmRpcmVjdGlvbiA9PSBJT19YTUlUKSB7CisJCQl2aWFfaXJjY19kbWFfeG1pdChzZWxmLCBpb2Jhc2UpOworCQl9CisJCWlmIChzZWxmLT5pby5kaXJlY3Rpb24gPT0gSU9fUkVDVikgeworCQkJLyoKKwkJCSAqIGZyYW1lIHJlYWR5IGhvbGQgdG9vIGxvbmcsIG11c3QgcmVzZXQuCisJCQkgKi8KKwkJCWlmIChzZWxmLT5SeERhdGFSZWFkeSA+IDMwKSB7CisJCQkJaHdyZXNldChzZWxmKTsKKwkJCQlpZiAoaXJkYV9kZXZpY2VfdHhxdWV1ZV9lbXB0eShzZWxmLT5uZXRkZXYpKSB7CisJCQkJCXZpYV9pcmNjX2RtYV9yZWNlaXZlKHNlbGYpOworCQkJCX0KKwkJCX0gZWxzZSB7CS8vIGNhbGwgdGhpcyB0byB1cGxvYWQgZnJhbWUuCisJCQkJUnhUaW1lckhhbmRsZXIoc2VsZiwgaW9iYXNlKTsKKwkJCX0KKwkJfQkJLy9SRUNWCisJfQkJCS8vVGltZXIgRXZlbnQKKwlpZiAoKGlIb3N0SW50VHlwZSAmIDB4MjApICE9IDApIHsJLy9UeCBFdmVudAorCQlpVHhJbnRUeXBlID0gR2V0VFhTdGF0dXMoaW9iYXNlKTsKKworCQlJUkRBX0RFQlVHKDQsICIlcygpOiBpVHhJbnRUeXBlICUwMng6ICAlcyAlcyAlcyAlc1xuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgaVR4SW50VHlwZSwKKwkJCSAgIChpVHhJbnRUeXBlICYgMHgwOCkgPyAiRklGTyB1bmRlcnIuIiA6ICIiLAorCQkJICAgKGlUeEludFR5cGUgJiAweDA0KSA/ICJFT00iIDogIiIsCisJCQkgICAoaVR4SW50VHlwZSAmIDB4MDIpID8gIkZJRk8gcmVhZHkiIDogIiIsCisJCQkgICAoaVR4SW50VHlwZSAmIDB4MDEpID8gIkVhcmx5IEVPTSIgOiAiIik7CisKKwkJaWYgKGlUeEludFR5cGUgJiAweDQpIHsKKwkJCXNlbGYtPkV2ZW50RmxhZy5FT01lc3NhZ2UrKzsJLy8gcmVhZCBhbmQgd2lsbCBhdXRvIGNsZWFuCisJCQlpZiAodmlhX2lyY2NfZG1hX3htaXRfY29tcGxldGUoc2VsZikpIHsKKwkJCQlpZiAoaXJkYV9kZXZpY2VfdHhxdWV1ZV9lbXB0eQorCQkJCSAgICAoc2VsZi0+bmV0ZGV2KSkgeworCQkJCQl2aWFfaXJjY19kbWFfcmVjZWl2ZShzZWxmKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXNlbGYtPkV2ZW50RmxhZy5Vbmtub3duKys7CisJCQl9CisJCX0JCS8vRU9QCisJfQkJCS8vVHggRXZlbnQKKwkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlpZiAoKGlIb3N0SW50VHlwZSAmIDB4MTApICE9IDApIHsJLy9SeCBFdmVudAorCQkvKiBDaGVjayBpZiBETUEgaGFzIGZpbmlzaGVkICovCisJCWlSeEludFR5cGUgPSBHZXRSWFN0YXR1cyhpb2Jhc2UpOworCisJCUlSREFfREVCVUcoNCwgIiVzKCk6IGlSeEludFR5cGUgJTAyeDogICVzICVzICVzICVzICVzICVzICVzXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBpUnhJbnRUeXBlLAorCQkJICAgKGlSeEludFR5cGUgJiAweDgwKSA/ICJQSFkgZXJyLiIJOiAiIiwKKwkJCSAgIChpUnhJbnRUeXBlICYgMHg0MCkgPyAiQ1JDIGVyciIJOiAiIiwKKwkJCSAgIChpUnhJbnRUeXBlICYgMHgyMCkgPyAiRklGTyBvdmVyci4iCTogIiIsCisJCQkgICAoaVJ4SW50VHlwZSAmIDB4MTApID8gIkVPRiIJCTogIiIsCisJCQkgICAoaVJ4SW50VHlwZSAmIDB4MDgpID8gIlJ4RGF0YSIJOiAiIiwKKwkJCSAgIChpUnhJbnRUeXBlICYgMHgwMikgPyAiUnhNYXhMZW4iCTogIiIsCisJCQkgICAoaVJ4SW50VHlwZSAmIDB4MDEpID8gIlNJUiBiYWQiCTogIiIpOworCQlpZiAoIWlSeEludFR5cGUpCisJCQlJUkRBX0RFQlVHKDMsICIlcygpOiBSeElSUSA9MFxuIiwgX19GVU5DVElPTl9fKTsKKworCQlpZiAoaVJ4SW50VHlwZSAmIDB4MTApIHsKKwkJCWlmICh2aWFfaXJjY19kbWFfcmVjZWl2ZV9jb21wbGV0ZShzZWxmLCBpb2Jhc2UpKSB7CisvL0YwMSAgICAgICBpZighKElzRklST24oaW9iYXNlKSkpICB2aWFfaXJjY19kbWFfcmVjZWl2ZShzZWxmKTsKKwkJCQl2aWFfaXJjY19kbWFfcmVjZWl2ZShzZWxmKTsKKwkJCX0KKwkJfQkJLy8gTm8gRVJSICAgICAKKwkJZWxzZSB7CQkvL0VSUgorCQkJSVJEQV9ERUJVRyg0LCAiJXMoKTogUnhJUlEgRVJSOmlSeEludFR5cGU9JXgsSG9zdEludFR5cGU9JXgsQ3VyQ291bnQ9JXgsUnhMYXN0Q291bnQ9JXhfX19fX1xuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18sIGlSeEludFR5cGUsIGlIb3N0SW50VHlwZSwKKwkJCQkgICBSeEN1ckNvdW50KGlvYmFzZSwgc2VsZiksCisJCQkJICAgc2VsZi0+UnhMYXN0Q291bnQpOworCisJCQlpZiAoaVJ4SW50VHlwZSAmIDB4MjApIHsJLy9GSUZPIE92ZXJSdW4gRVJSCisJCQkJUmVzZXRDaGlwKGlvYmFzZSwgMCk7CisJCQkJUmVzZXRDaGlwKGlvYmFzZSwgMSk7CisJCQl9IGVsc2UgewkvL1BIWSxDUkMgRVJSCisKKwkJCQlpZiAoaVJ4SW50VHlwZSAhPSAweDA4KQorCQkJCQlod3Jlc2V0KHNlbGYpOwkvL0YwMQorCQkJfQorCQkJdmlhX2lyY2NfZG1hX3JlY2VpdmUoc2VsZik7CisJCX0JCS8vRVJSCisKKwl9CQkJLy9SeCBFdmVudAorCXNwaW5fdW5sb2NrKCZzZWxmLT5sb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChpSG9zdEludFR5cGUpOworfQorCitzdGF0aWMgdm9pZCBod3Jlc2V0KHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCVJlc2V0Q2hpcChpb2Jhc2UsIDUpOworCUVuYWJsZURNQShpb2Jhc2UsIE9GRik7CisJRW5hYmxlVFgoaW9iYXNlLCBPRkYpOworCUVuYWJsZVJYKGlvYmFzZSwgT0ZGKTsKKwlFblJYRE1BKGlvYmFzZSwgT0ZGKTsKKwlFblRYRE1BKGlvYmFzZSwgT0ZGKTsKKwlSWFN0YXJ0KGlvYmFzZSwgT0ZGKTsKKwlUWFN0YXJ0KGlvYmFzZSwgT0ZGKTsKKwlJbml0Q2FyZChpb2Jhc2UpOworCUNvbW1vbkluaXQoaW9iYXNlKTsKKwlTSVJGaWx0ZXIoaW9iYXNlLCBPTik7CisJU2V0U0lSKGlvYmFzZSwgT04pOworCUNSQzE2KGlvYmFzZSwgT04pOworCUVuVFhDUkMoaW9iYXNlLCAwKTsKKwlXcml0ZVJlZyhpb2Jhc2UsIElfU1RfQ1RfMCwgMHgwMCk7CisJU2V0QmF1ZFJhdGUoaW9iYXNlLCA5NjAwKTsKKwlTZXRQdWxzZVdpZHRoKGlvYmFzZSwgMTIpOworCVNldFNlbmRQcmVhbWJsZUNvdW50KGlvYmFzZSwgMCk7CisJV3JpdGVSZWcoaW9iYXNlLCBJX1NUX0NUXzAsIDB4ODApOworCisJLyogUmVzdG9yZSBzcGVlZC4gKi8KKwl2aWFfaXJjY19jaGFuZ2Vfc3BlZWQoc2VsZiwgc2VsZi0+aW8uc3BlZWQpOworCisJc2VsZi0+c3RfZmlmby5sZW4gPSAwOworfQorCisvKgorICogRnVuY3Rpb24gdmlhX2lyY2NfaXNfcmVjZWl2aW5nIChzZWxmKQorICoKKyAqICAgIFJldHVybiBUUlVFIGlzIHdlIGFyZSBjdXJyZW50bHkgcmVjZWl2aW5nIGEgZnJhbWUKKyAqCisgKi8KK3N0YXRpYyBpbnQgdmlhX2lyY2NfaXNfcmVjZWl2aW5nKHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZikKK3sKKwlpbnQgc3RhdHVzID0gRkFMU0U7CisJaW50IGlvYmFzZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIEZBTFNFOyk7CisKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwlpZiAoQ2tSeFJlY3YoaW9iYXNlLCBzZWxmKSkKKwkJc3RhdHVzID0gVFJVRTsKKworCUlSREFfREVCVUcoMiwgIiVzKCk6IHN0YXR1cz0leC4uLi5cbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX25ldF9vcGVuIChkZXYpCisgKgorICogICAgU3RhcnQgdGhlIGRldmljZQorICoKKyAqLworc3RhdGljIGludCB2aWFfaXJjY19uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZjsKKwlpbnQgaW9iYXNlOworCWNoYXIgaHduYW1lWzMyXTsKKworCUlSREFfREVCVUcoMywgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJc2VsZiA9IChzdHJ1Y3QgdmlhX2lyY2NfY2IgKikgZGV2LT5wcml2OworCXNlbGYtPnN0YXRzLnJ4X3BhY2tldHMgPSAwOworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwlpZiAocmVxdWVzdF9pcnEoc2VsZi0+aW8uaXJxLCB2aWFfaXJjY19pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSkgeworCQlJUkRBX1dBUk5JTkcoIiVzLCB1bmFibGUgdG8gYWxsb2NhdGUgaXJxPSVkXG4iLCBkcml2ZXJfbmFtZSwKKwkJCSAgICAgc2VsZi0+aW8uaXJxKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCS8qCisJICogQWx3YXlzIGFsbG9jYXRlIHRoZSBETUEgY2hhbm5lbCBhZnRlciB0aGUgSVJRLCBhbmQgY2xlYW4gdXAgb24gCisJICogZmFpbHVyZS4KKwkgKi8KKwlpZiAocmVxdWVzdF9kbWEoc2VsZi0+aW8uZG1hLCBkZXYtPm5hbWUpKSB7CisJCUlSREFfV0FSTklORygiJXMsIHVuYWJsZSB0byBhbGxvY2F0ZSBkbWE9JWRcbiIsIGRyaXZlcl9uYW1lLAorCQkJICAgICBzZWxmLT5pby5kbWEpOworCQlmcmVlX2lycShzZWxmLT5pby5pcnEsIHNlbGYpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJaWYgKHNlbGYtPmlvLmRtYTIgIT0gc2VsZi0+aW8uZG1hKSB7CisJCWlmIChyZXF1ZXN0X2RtYShzZWxmLT5pby5kbWEyLCBkZXYtPm5hbWUpKSB7CisJCQlJUkRBX1dBUk5JTkcoIiVzLCB1bmFibGUgdG8gYWxsb2NhdGUgZG1hMj0lZFxuIiwKKwkJCQkgICAgIGRyaXZlcl9uYW1lLCBzZWxmLT5pby5kbWEyKTsKKwkJCWZyZWVfaXJxKHNlbGYtPmlvLmlycSwgc2VsZik7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCX0KKworCisJLyogdHVybiBvbiBpbnRlcnJ1cHRzICovCisJRW5BbGxJbnQoaW9iYXNlLCBPTik7CisJRW5JbnRlcm5hbExvb3AoaW9iYXNlLCBPRkYpOworCUVuRXh0ZXJuYWxMb29wKGlvYmFzZSwgT0ZGKTsKKworCS8qICovCisJdmlhX2lyY2NfZG1hX3JlY2VpdmUoc2VsZik7CisKKwkvKiBSZWFkeSB0byBwbGF5ISAqLworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwkvKiAKKwkgKiBPcGVuIG5ldyBJckxBUCBsYXllciBpbnN0YW5jZSwgbm93IHRoYXQgZXZlcnl0aGluZyBzaG91bGQgYmUKKwkgKiBpbml0aWFsaXplZCBwcm9wZXJseSAKKwkgKi8KKwlzcHJpbnRmKGh3bmFtZSwgIlZJQSBAIDB4JXgiLCBpb2Jhc2UpOworCXNlbGYtPmlybGFwID0gaXJsYXBfb3BlbihkZXYsICZzZWxmLT5xb3MsIGh3bmFtZSk7CisKKwlzZWxmLT5SeExhc3RDb3VudCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHZpYV9pcmNjX25ldF9jbG9zZSAoZGV2KQorICoKKyAqICAgIFN0b3AgdGhlIGRldmljZQorICoKKyAqLworc3RhdGljIGludCB2aWFfaXJjY19uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGY7CisJaW50IGlvYmFzZTsKKworCUlSREFfREVCVUcoMywgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChkZXYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CisJc2VsZiA9IChzdHJ1Y3QgdmlhX2lyY2NfY2IgKikgZGV2LT5wcml2OworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKworCS8qIFN0b3AgZGV2aWNlICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCS8qIFN0b3AgYW5kIHJlbW92ZSBpbnN0YW5jZSBvZiBJckxBUCAqLworCWlmIChzZWxmLT5pcmxhcCkKKwkJaXJsYXBfY2xvc2Uoc2VsZi0+aXJsYXApOworCXNlbGYtPmlybGFwID0gTlVMTDsKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwlFblRYRE1BKGlvYmFzZSwgT0ZGKTsKKwlFblJYRE1BKGlvYmFzZSwgT0ZGKTsKKwlEaXNhYmxlRG1hQ2hhbm5lbChzZWxmLT5pby5kbWEpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJRW5BbGxJbnQoaW9iYXNlLCBPRkYpOworCWZyZWVfaXJxKHNlbGYtPmlvLmlycSwgZGV2KTsKKwlmcmVlX2RtYShzZWxmLT5pby5kbWEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB2aWFfaXJjY19uZXRfaW9jdGwgKGRldiwgcnEsIGNtZCkKKyAqCisgKiAgICBQcm9jZXNzIElPQ1RMIGNvbW1hbmRzIGZvciB0aGlzIGRldmljZQorICoKKyAqLworc3RhdGljIGludCB2aWFfaXJjY19uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwKKwkJCSAgICAgIGludCBjbWQpCit7CisJc3RydWN0IGlmX2lyZGFfcmVxICppcnEgPSAoc3RydWN0IGlmX2lyZGFfcmVxICopIHJxOworCXN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCXNlbGYgPSBkZXYtPnByaXY7CisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0RFQlVHKDEsICIlcygpLCAlcywgKGNtZD0weCVYKVxuIiwgX19GVU5DVElPTl9fLCBkZXYtPm5hbWUsCisJCSAgIGNtZCk7CisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICYgc2F2ZSBmbGFncyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NTQkFORFdJRFRIOgkvKiBTZXQgYmFuZHdpZHRoICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJcmV0ID0gLUVQRVJNOworCQkJZ290byBvdXQ7CisJCX0KKwkJdmlhX2lyY2NfY2hhbmdlX3NwZWVkKHNlbGYsIGlycS0+aWZyX2JhdWRyYXRlKTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DU01FRElBQlVTWToJLyogU2V0IG1lZGlhIGJ1c3kgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlyZXQgPSAtRVBFUk07CisJCQlnb3RvIG91dDsKKwkJfQorCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShzZWxmLT5uZXRkZXYsIFRSVUUpOworCQlicmVhazsKKwljYXNlIFNJT0NHUkVDRUlWSU5HOgkvKiBDaGVjayBpZiB3ZSBhcmUgcmVjZWl2aW5nIHJpZ2h0IG5vdyAqLworCQlpcnEtPmlmcl9yZWNlaXZpbmcgPSB2aWFfaXJjY19pc19yZWNlaXZpbmcoc2VsZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKyAgICAgIG91dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp2aWFfaXJjY19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlCisJCQkJCQkgICAgICAgKmRldikKK3sKKwlzdHJ1Y3QgdmlhX2lyY2NfY2IgKnNlbGYgPSAoc3RydWN0IHZpYV9pcmNjX2NiICopIGRldi0+cHJpdjsKKworCXJldHVybiAmc2VsZi0+c3RhdHM7Cit9CisKK01PRFVMRV9BVVRIT1IoIlZJQSBUZWNobm9sb2dpZXMsaW5jIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlZJQSBJckRBIERldmljZSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQodmlhX2lyY2NfaW5pdCk7Cittb2R1bGVfZXhpdCh2aWFfaXJjY19jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuaCBiL2RyaXZlcnMvbmV0L2lyZGEvdmlhLWlyY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDRiMWIzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS92aWEtaXJjYy5oCkBAIC0wLDAgKzEsODUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIHZpYS1pcmNjLmgKKyAqIFZlcnNpb246ICAgICAgIDEuMAorICogRGVzY3JpcHRpb246ICAgRHJpdmVyIGZvciB0aGUgVklBIFZUODIzMS9WVDgyMzMgSXJEQSBjaGlwc2V0cworICogQXV0aG9yOiAgICAgICAgVklBIFRlY2hub2xvZ2llcywgaW5jCisgKiBEYXRlICA6CSAgMDgvMDYvMjAwMworCitDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBWSUEgVGVjaG5vbG9naWVzLCBJbmMuCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCitBTlkgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlM7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCit0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyAqIENvbW1lbnQ6CisgKiBqdWwvMDgvMjAwMiA6IFJ4IGJ1ZmZlciBsZW5ndGggc2hvdWxkIHVzZSBSeCByaW5nIHB0ci4JCisgKiBPY3QvMjgvMjAwMiA6IEFkZCBTQiBpZCBmb3IgMzE0NyBhbmQgMzE3Ny4JCisgKiBqdWwvMDkvMjAwMiA6IG9ubHkgaW1wbGVtZW50IHR3byBraW5kIG9mIGRvbmdsZSBjdXJyZW50bHkuCisgKiBPY3QvMDIvMjAwMiA6IHdvcmsgb24gVlQ4MjMxIGFuZCBWVDgyMzMgLgorICogQXVnLzA2LzIwMDMgOiBjaGFuZ2UgZHJpdmVyIGZvcm1hdCB0byBwY2kgZHJpdmVyIC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgdmlhX0lSQ0NfSAorI2RlZmluZSB2aWFfSVJDQ19ICisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIE1BWF9UWF9XSU5ET1cgNworI2RlZmluZSBNQVhfUlhfV0lORE9XIDcKKworc3RydWN0IHN0X2ZpZm9fZW50cnkgeworCWludCBzdGF0dXM7CisJaW50IGxlbjsKK307CisKK3N0cnVjdCBzdF9maWZvIHsKKwlzdHJ1Y3Qgc3RfZmlmb19lbnRyeSBlbnRyaWVzW01BWF9SWF9XSU5ET1cgKyAyXTsKKwlpbnQgcGVuZGluZ19ieXRlczsKKwlpbnQgaGVhZDsKKwlpbnQgdGFpbDsKKwlpbnQgbGVuOworfTsKKworc3RydWN0IGZyYW1lX2NiIHsKKwl2b2lkICpzdGFydDsJCS8qIFN0YXJ0IG9mIGZyYW1lIGluIERNQSBtZW0gKi8KKwlpbnQgbGVuOwkJLyogTGVuZ2h0IG9mIGZyYW1lIGluIERNQSBtZW0gKi8KK307CisKK3N0cnVjdCB0eF9maWZvIHsKKwlzdHJ1Y3QgZnJhbWVfY2IgcXVldWVbTUFYX1RYX1dJTkRPVyArIDJdOwkvKiBJbmZvIGFib3V0IGZyYW1lcyBpbiBxdWV1ZSAqLworCWludCBwdHI7CQkvKiBDdXJyZW50bHkgYmVpbmcgc2VudCAqLworCWludCBsZW47CQkvKiBMZW5naHQgb2YgcXVldWUgKi8KKwlpbnQgZnJlZTsJCS8qIE5leHQgZnJlZSBzbG90ICovCisJdm9pZCAqdGFpbDsJCS8qIE5leHQgZnJlZSBzdGFydCBpbiBETUEgbWVtICovCit9OworCisKK3N0cnVjdCBldmVudGZsYWcJCS8vIGZvciBrZWVwaW5nIHRyYWNrIG9mIEludGVycnVwdCBFdmVudHMKK3sKKwkvLy0tLS0tLS0tdHggcGFydAorCXVuc2lnbmVkIGNoYXIgVHhGSUZPVW5kZXJSdW47CisJdW5zaWduZWQgY2hhciBFT01lc3NhZ2U7CisJdW5zaWduZWQgY2hhciBUeEZJRk9SZWFkeTsKKwl1bnNpZ25lZCBjaGFyIEVhcmx5RU9NOworCS8vLS0tLS0tLS1yeCBwYXJ0CisJdW5zaWduZWQgY2hhciBQSFlFcnI7CisJdW5zaWduZWQgY2hhciBDUkNFcnI7CisJdW5zaWduZWQgY2hhciBSeEZJRk9PdmVyUnVuOworCXVuc2lnbmVkIGNoYXIgRU9QYWNrZXQ7CisJdW5zaWduZWQgY2hhciBSeEF2YWlsOworCXVuc2lnbmVkIGNoYXIgVG9vTGFyZ2VQYWNrZXQ7CisJdW5zaWduZWQgY2hhciBTSVJCYWQ7CisJLy8tLS0tLS0tLXVua25vd24KKwl1bnNpZ25lZCBjaGFyIFVua25vd247CisJLy8tLS0tLS0tLS0tCisJdW5zaWduZWQgY2hhciBUaW1lT3V0OworCXVuc2lnbmVkIGNoYXIgUnhETUFUQzsKKwl1bnNpZ25lZCBjaGFyIFR4RE1BVEM7Cit9OworCisvKiBQcml2YXRlIGRhdGEgZm9yIGVhY2ggaW5zdGFuY2UgKi8KK3N0cnVjdCB2aWFfaXJjY19jYiB7CisJc3RydWN0IHN0X2ZpZm8gc3RfZmlmbzsJLyogSW5mbyBhYm91dCByZWNlaXZlZCBmcmFtZXMgKi8KKwlzdHJ1Y3QgdHhfZmlmbyB0eF9maWZvOwkvKiBJbmZvIGFib3V0IGZyYW1lcyB0byBiZSB0cmFuc21pdHRlZCAqLworCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsJLyogWWVzISB3ZSBhcmUgc29tZSBraW5kIG9mIG5ldGRldmljZSAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCisJc3RydWN0IGlybGFwX2NiICppcmxhcDsJLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLworCXN0cnVjdCBxb3NfaW5mbyBxb3M7CS8qIFFvUyBjYXBhYmlsaXRpZXMgZm9yIHRoaXMgZGV2aWNlICovCisKKwljaGlwaW9fdCBpbzsJCS8qIElyREEgY29udHJvbGxlciBpbmZvcm1hdGlvbiAqLworCWlvYnVmZl90IHR4X2J1ZmY7CS8qIFRyYW5zbWl0IGJ1ZmZlciAqLworCWlvYnVmZl90IHJ4X2J1ZmY7CS8qIFJlY2VpdmUgYnVmZmVyICovCisJZG1hX2FkZHJfdCB0eF9idWZmX2RtYTsKKwlkbWFfYWRkcl90IHJ4X2J1ZmZfZG1hOworCisJX191OCBpZXI7CQkvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyICovCisKKwlzdHJ1Y3QgdGltZXZhbCBzdGFtcDsKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisKKwlzcGlubG9ja190IGxvY2s7CS8qIEZvciBzZXJpYWxpemluZyBvcGVyYXRpb25zICovCisKKwlfX3UzMiBmbGFnczsJCS8qIEludGVyZmFjZSBmbGFncyAqLworCV9fdTMyIG5ld19zcGVlZDsKKwlpbnQgaW5kZXg7CQkvKiBJbnN0YW5jZSBpbmRleCAqLworCisJc3RydWN0IGV2ZW50ZmxhZyBFdmVudEZsYWc7CisJc3RydWN0IHBtX2RldiAqZGV2OworCXVuc2lnbmVkIGludCBjaGlwX2lkOwkvKiB0byByZW1lbWJlciBjaGlwIGlkICovCisJdW5zaWduZWQgaW50IFJldHJ5Q291bnQ7CisJdW5zaWduZWQgaW50IFJ4RGF0YVJlYWR5OworCXVuc2lnbmVkIGludCBSeExhc3RDb3VudDsKK307CisKKworLy8tLS0tLS0tLS1JPUluZnJhcmVkLCAgSD1Ib3N0LCBNPU1pc2MsIFQ9VHgsIFI9UngsIFNUPVN0YXR1cywKKy8vICAgICAgICAgQ0Y9Q29uZmlnLCBDVD1Db250cm9sLCBMPUxvdywgSD1IaWdoLCBDPUNvdW50CisjZGVmaW5lICBJX0NGX0xfMCAgCQkweDEwCisjZGVmaW5lICBJX0NGX0hfMAkJMHgxMQorI2RlZmluZSAgSV9TSVJfQk9GCQkweDEyCisjZGVmaW5lICBJX1NJUl9FT0YJCTB4MTMKKyNkZWZpbmUgIElfU1RfQ1RfMAkJMHgxNQorI2RlZmluZSAgSV9TVF9MXzEJCTB4MTYKKyNkZWZpbmUgIElfU1RfSF8xCQkweDE3CisjZGVmaW5lICBJX0NGX0xfMQkJMHgxOAorI2RlZmluZSAgSV9DRl9IXzEJCTB4MTkKKyNkZWZpbmUgIElfQ0ZfTF8yCQkweDFhCisjZGVmaW5lICBJX0NGX0hfMgkJMHgxYgorI2RlZmluZSAgSV9DRl8zCQkweDFlCisjZGVmaW5lICBIX0NUCQkJMHgyMAorI2RlZmluZSAgSF9TVAkJCTB4MjEKKyNkZWZpbmUgIE1fQ1QJCQkweDIyCisjZGVmaW5lICBUWF9DVF8xCQkweDIzCisjZGVmaW5lICBUWF9DVF8yCQkweDI0CisjZGVmaW5lICBUWF9TVAkJCTB4MjUKKyNkZWZpbmUgIFJYX0NUCQkJMHgyNgorI2RlZmluZSAgUlhfU1QJCQkweDI3CisjZGVmaW5lICBSRVNFVAkJCTB4MjgKKyNkZWZpbmUgIFBfQUREUgkJMHgyOQorI2RlZmluZSAgUlhfQ19MCQkweDJhCisjZGVmaW5lICBSWF9DX0gJCTB4MmIKKyNkZWZpbmUgIFJYX1BfTAkJMHgyYworI2RlZmluZSAgUlhfUF9ICQkweDJkCisjZGVmaW5lICBUWF9DX0wJCTB4MmUKKyNkZWZpbmUgIFRYX0NfSAkJMHgyZgorI2RlZmluZSAgVElNRVIgICAgICAgICAJMHgzMgorI2RlZmluZSAgSV9DRl80ICAgICAgICAgCTB4MzMKKyNkZWZpbmUgIElfVF9DX0wJCTB4MzQKKyNkZWZpbmUgIElfVF9DX0gJCTB4MzUKKyNkZWZpbmUgIFZFUlNJT04JCTB4M2YKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBTdGFydEFkZHIgCTB4MTAJLy8gdGhlIGZpcnN0IHJlZ2lzdGVyIGFkZHJlc3MKKyNkZWZpbmUgRW5kQWRkciAJMHgzZgkvLyB0aGUgbGFzdCByZWdpc3RlciBhZGRyZXNzCisjZGVmaW5lIEdldEJpdCh2YWwsYml0KSAgdmFsID0gKHVuc2lnbmVkIGNoYXIpICgodmFsPj5iaXQpICYgMHgxKQorCQkJLy8gUmV0dXJucyB0aGUgYml0CisjZGVmaW5lIFNldEJpdCh2YWwsYml0KSAgdmFsPSAodW5zaWduZWQgY2hhciApICh2YWwgfCAoMHgxIDw8IGJpdCkpCisJCQkvLyBTZXRzIGJpdCB0byAxCisjZGVmaW5lIFJlc2V0Qml0KHZhbCxiaXQpIHZhbD0gKHVuc2lnbmVkIGNoYXIgKSAodmFsICYgfigweDEgPDwgYml0KSkKKwkJCS8vIFNldHMgYml0IHRvIDAKKworI2RlZmluZSBPRkYgICAwCisjZGVmaW5lIE9OICAgMQorI2RlZmluZSBETUFfVFhfTU9ERSAgIDB4MDgKKyNkZWZpbmUgRE1BX1JYX01PREUgICAweDA0CisKKyNkZWZpbmUgRE1BMSAgIDAKKyNkZWZpbmUgRE1BMiAgIDB4YzAKKyNkZWZpbmUgTUFTSzEgICBETUExKzB4MGEKKyNkZWZpbmUgTUFTSzIgICBETUEyKzB4MTQKKworI2RlZmluZSBDbGtfYml0IDB4NDAKKyNkZWZpbmUgVHhfYml0IDB4MDEKKyNkZWZpbmUgUmRfVmFsaWQgMHgwOAorI2RlZmluZSBSeEJpdCAweDA4CisKK3N0YXRpYyB2b2lkIERpc2FibGVEbWFDaGFubmVsKHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXN3aXRjaCAoY2hhbm5lbCkgewkvLyA4IEJpdCBETUEgY2hhbm5lbHMgRE1BQzEKKwljYXNlIDA6CisJCW91dGIoNCwgTUFTSzEpOwkvL21hc2sgY2hhbm5lbCAwCisJCWJyZWFrOworCWNhc2UgMToKKwkJb3V0Yig1LCBNQVNLMSk7CS8vTWFzayBjaGFubmVsIDEKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlvdXRiKDYsIE1BU0sxKTsJLy9NYXNrIGNoYW5uZWwgMgorCQlicmVhazsKKwljYXNlIDM6CisJCW91dGIoNywgTUFTSzEpOwkvL01hc2sgY2hhbm5lbCAzCisJCWJyZWFrOworCWNhc2UgNToKKwkJb3V0Yig1LCBNQVNLMik7CS8vTWFzayBjaGFubmVsIDUKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlvdXRiKDYsIE1BU0syKTsJLy9NYXNrIGNoYW5uZWwgNgorCQlicmVhazsKKwljYXNlIDc6CisJCW91dGIoNywgTUFTSzIpOwkvL01hc2sgY2hhbm5lbCA3CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX07CQkJLy9Td2l0Y2gKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgUmVhZExQQ1JlZyhpbnQgaVJlZ051bSkKK3sKKwl1bnNpZ25lZCBjaGFyIGlWYWw7CisKKwlvdXRiKDB4ODcsIDB4MmUpOworCW91dGIoMHg4NywgMHgyZSk7CisJb3V0YihpUmVnTnVtLCAweDJlKTsKKwlpVmFsID0gaW5iKDB4MmYpOworCW91dGIoMHhhYSwgMHgyZSk7CisKKwlyZXR1cm4gaVZhbDsKK30KKworc3RhdGljIHZvaWQgV3JpdGVMUENSZWcoaW50IGlSZWdOdW0sIHVuc2lnbmVkIGNoYXIgaVZhbCkKK3sKKworCW91dGIoMHg4NywgMHgyZSk7CisJb3V0YigweDg3LCAweDJlKTsKKwlvdXRiKGlSZWdOdW0sIDB4MmUpOworCW91dGIoaVZhbCwgMHgyZik7CisJb3V0YigweEFBLCAweDJlKTsKK30KKworc3RhdGljIF9fdTggUmVhZFJlZyh1bnNpZ25lZCBpbnQgQmFzZUFkZHIsIGludCBpUmVnTnVtKQoreworCXJldHVybiAoKF9fdTgpIGluYihCYXNlQWRkciArIGlSZWdOdW0pKTsKK30KKworc3RhdGljIHZvaWQgV3JpdGVSZWcodW5zaWduZWQgaW50IEJhc2VBZGRyLCBpbnQgaVJlZ051bSwgdW5zaWduZWQgY2hhciBpVmFsKQoreworCW91dGIoaVZhbCwgQmFzZUFkZHIgKyBpUmVnTnVtKTsKK30KKworc3RhdGljIGludCBXcml0ZVJlZ0JpdCh1bnNpZ25lZCBpbnQgQmFzZUFkZHIsIHVuc2lnbmVkIGNoYXIgUmVnTnVtLAorCQl1bnNpZ25lZCBjaGFyIEJpdFBvcywgdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKwlfX3U4IFJ0ZW1wLCBXdGVtcDsKKworCWlmIChCaXRQb3MgPiA3KSB7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKChSZWdOdW0gPCBTdGFydEFkZHIpIHx8IChSZWdOdW0gPiBFbmRBZGRyKSkKKwkJcmV0dXJuIC0xOworCVJ0ZW1wID0gUmVhZFJlZyhCYXNlQWRkciwgUmVnTnVtKTsKKwlpZiAodmFsdWUgPT0gMCkKKwkJV3RlbXAgPSBSZXNldEJpdChSdGVtcCwgQml0UG9zKTsKKwllbHNlIHsKKwkJaWYgKHZhbHVlID09IDEpCisJCQlXdGVtcCA9IFNldEJpdChSdGVtcCwgQml0UG9zKTsKKwkJZWxzZQorCQkJcmV0dXJuIC0xOworCX0KKwlXcml0ZVJlZyhCYXNlQWRkciwgUmVnTnVtLCBXdGVtcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX3U4IENoZWNrUmVnQml0KHVuc2lnbmVkIGludCBCYXNlQWRkciwgdW5zaWduZWQgY2hhciBSZWdOdW0sCisJCSB1bnNpZ25lZCBjaGFyIEJpdFBvcykKK3sKKwlfX3U4IHRlbXA7CisKKwlpZiAoQml0UG9zID4gNykKKwkJcmV0dXJuIDB4ZmY7CisJaWYgKChSZWdOdW0gPCBTdGFydEFkZHIpIHx8IChSZWdOdW0gPiBFbmRBZGRyKSkgeworLy8gICAgIHByaW50Zigid2hhdCBpcyB0aGUgcmVnaXN0ZXIgJXghXG4iLFJlZ051bSk7CisJfQorCXRlbXAgPSBSZWFkUmVnKEJhc2VBZGRyLCBSZWdOdW0pOworCXJldHVybiBHZXRCaXQodGVtcCwgQml0UG9zKTsKK30KKworc3RhdGljIHZvaWQgU2V0TWF4UnhQYWNrZXRTaXplKF9fdTE2IGlvYmFzZSwgX191MTYgc2l6ZSkKK3sKKwlfX3UxNiBsb3csIGhpZ2g7CisJaWYgKChzaXplICYgMHhlMDAwKSA9PSAwKSB7CisJCWxvdyA9IHNpemUgJiAweDAwZmY7CisJCWhpZ2ggPSAoc2l6ZSAmIDB4MWYwMCkgPj4gODsKKwkJV3JpdGVSZWcoaW9iYXNlLCBJX0NGX0xfMiwgbG93KTsKKwkJV3JpdGVSZWcoaW9iYXNlLCBJX0NGX0hfMiwgaGlnaCk7CisKKwl9CisKK30KKworLy9mb3IgYm90aCBSeCBhbmQgVHgKKworc3RhdGljIHZvaWQgU2V0RklGTyhfX3UxNiBpb2Jhc2UsIF9fdTE2IHZhbHVlKQoreworCXN3aXRjaCAodmFsdWUpIHsKKwljYXNlIDEyODoKKwkJV3JpdGVSZWdCaXQoaW9iYXNlLCAweDExLCAwLCAwKTsKKwkJV3JpdGVSZWdCaXQoaW9iYXNlLCAweDExLCA3LCAxKTsKKwkJYnJlYWs7CisJY2FzZSA2NDoKKwkJV3JpdGVSZWdCaXQoaW9iYXNlLCAweDExLCAwLCAwKTsKKwkJV3JpdGVSZWdCaXQoaW9iYXNlLCAweDExLCA3LCAwKTsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJV3JpdGVSZWdCaXQoaW9iYXNlLCAweDExLCAwLCAxKTsKKwkJV3JpdGVSZWdCaXQoaW9iYXNlLCAweDExLCA3LCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV3JpdGVSZWdCaXQoaW9iYXNlLCAweDExLCAwLCAwKTsKKwkJV3JpdGVSZWdCaXQoaW9iYXNlLCAweDExLCA3LCAwKTsKKwl9CisKK30KKworI2RlZmluZSBDUkMxNihCYXNlQWRkcix2YWwpICAgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl9MXzAsNyx2YWwpCS8vMCBmb3IgMzIgQ1JDCisvKgorI2RlZmluZSBTZXRWRklSKEJhc2VBZGRyLHZhbCkgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl9IXzAsNSx2YWwpCisjZGVmaW5lIFNldEZJUihCYXNlQWRkcix2YWwpICAgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGX0xfMCw2LHZhbCkKKyNkZWZpbmUgU2V0TUlSKEJhc2VBZGRyLHZhbCkgICAgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfTF8wLDUsdmFsKQorI2RlZmluZSBTZXRTSVIoQmFzZUFkZHIsdmFsKSAgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl9MXzAsNCx2YWwpCisqLworI2RlZmluZSBTSVJGaWx0ZXIoQmFzZUFkZHIsdmFsKSAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl9MXzAsMyx2YWwpCisjZGVmaW5lIEZpbHRlcihCYXNlQWRkcix2YWwpICAgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGX0xfMCwyLHZhbCkKKyNkZWZpbmUgSW52ZXJ0VFgoQmFzZUFkZHIsdmFsKSAgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfTF8wLDEsdmFsKQorI2RlZmluZSBJbnZlcnRSWChCYXNlQWRkcix2YWwpICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl9MXzAsMCx2YWwpCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKipJX0NGX0hfMAorI2RlZmluZSBFbmFibGVUWChCYXNlQWRkcix2YWwpICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl9IXzAsNCx2YWwpCisjZGVmaW5lIEVuYWJsZVJYKEJhc2VBZGRyLHZhbCkgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGX0hfMCwzLHZhbCkKKyNkZWZpbmUgRW5hYmxlRE1BKEJhc2VBZGRyLHZhbCkgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfSF8wLDIsdmFsKQorI2RlZmluZSBTSVJSZWN2QW55KEJhc2VBZGRyLHZhbCkgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9DRl9IXzAsMSx2YWwpCisjZGVmaW5lIERpYWJsZVRyYW5zKEJhc2VBZGRyLHZhbCkgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGX0hfMCwwLHZhbCkKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqSV9TSVJfQk9GLElfU0lSX0VPRgorI2RlZmluZSBTZXRTSVJCT0YoQmFzZUFkZHIsdmFsKSAgICAgV3JpdGVSZWcoQmFzZUFkZHIsSV9TSVJfQk9GLHZhbCkKKyNkZWZpbmUgU2V0U0lSRU9GKEJhc2VBZGRyLHZhbCkgICAgIFdyaXRlUmVnKEJhc2VBZGRyLElfU0lSX0VPRix2YWwpCisjZGVmaW5lIEdldFNJUkJPRihCYXNlQWRkcikgICAgICAgIFJlYWRSZWcoQmFzZUFkZHIsSV9TSVJfQk9GKQorI2RlZmluZSBHZXRTSVJFT0YoQmFzZUFkZHIpICAgICAgICBSZWFkUmVnKEJhc2VBZGRyLElfU0lSX0VPRikKKy8vKioqKioqKioqKioqKioqKioqKklfU1RfQ1RfMAorI2RlZmluZSBFblBoeXMoQmFzZUFkZHIsdmFsKSAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfU1RfQ1RfMCw3LHZhbCkKKyNkZWZpbmUgSXNNb2RlRXJyb3IoQmFzZUFkZHIpIENoZWNrUmVnQml0KEJhc2VBZGRyLElfU1RfQ1RfMCw2KQkvL1JPCisjZGVmaW5lIElzVkZJUk9uKEJhc2VBZGRyKSAgICAgQ2hlY2tSZWdCaXQoQmFzZUFkZHIsMHgxNCwwKQkvL1JPIGZvciBWVDEyMTEgb25seQorI2RlZmluZSBJc0ZJUk9uKEJhc2VBZGRyKSAgICAgQ2hlY2tSZWdCaXQoQmFzZUFkZHIsSV9TVF9DVF8wLDUpCS8vUk8KKyNkZWZpbmUgSXNNSVJPbihCYXNlQWRkcikgICAgIENoZWNrUmVnQml0KEJhc2VBZGRyLElfU1RfQ1RfMCw0KQkvL1JPCisjZGVmaW5lIElzU0lST24oQmFzZUFkZHIpICAgICBDaGVja1JlZ0JpdChCYXNlQWRkcixJX1NUX0NUXzAsMykJLy9STworI2RlZmluZSBJc0VuYWJsZVRYKEJhc2VBZGRyKSAgQ2hlY2tSZWdCaXQoQmFzZUFkZHIsSV9TVF9DVF8wLDIpCS8vUk8KKyNkZWZpbmUgSXNFbmFibGVSWChCYXNlQWRkcikgIENoZWNrUmVnQml0KEJhc2VBZGRyLElfU1RfQ1RfMCwxKQkvL1JPCisjZGVmaW5lIElzMTZDUkMoQmFzZUFkZHIpICAgICBDaGVja1JlZ0JpdChCYXNlQWRkcixJX1NUX0NUXzAsMCkJLy9STworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKipJX0NGXzMKKyNkZWZpbmUgRGlzYWJsZUFkamFjZW50UHVsc2VXaWR0aChCYXNlQWRkcix2YWwpIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfMyw1LHZhbCkJLy8xIGRpc2FibGUKKyNkZWZpbmUgRGlzYWJsZVB1bHNlV2lkdGhBZGp1c3QoQmFzZUFkZHIsdmFsKSAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfMyw0LHZhbCkJLy8xIGRpc2FibGUKKyNkZWZpbmUgVXNlT25lUlgoQmFzZUFkZHIsdmFsKSAgICAgICAgICAgICAgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfMywxLHZhbCkJLy8wIHVzZSB0d28gUlgKKyNkZWZpbmUgU2xvd0lSUlhMb3dBY3RpdmUoQmFzZUFkZHIsdmFsKSAgICAgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfMywwLHZhbCkJLy8wIHNob3cgUlggaGlnaD0xIGluIFNJUgorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKipIX0NUCisjZGVmaW5lIEVuQWxsSW50KEJhc2VBZGRyLHZhbCkgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixIX0NULDcsdmFsKQorI2RlZmluZSBUWFN0YXJ0KEJhc2VBZGRyLHZhbCkgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSF9DVCw2LHZhbCkKKyNkZWZpbmUgUlhTdGFydChCYXNlQWRkcix2YWwpICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLEhfQ1QsNSx2YWwpCisjZGVmaW5lIENsZWFyUlhJbnQoQmFzZUFkZHIsdmFsKSAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLEhfQ1QsNCx2YWwpCS8vIDEgY2xlYXIKKy8vKioqKioqKioqKioqKioqKipIX1NUCisjZGVmaW5lIElzUlhJbnQoQmFzZUFkZHIpICAgICAgICAgICBDaGVja1JlZ0JpdChCYXNlQWRkcixIX1NULDQpCisjZGVmaW5lIEdldEludEluZGVudGlmeShCYXNlQWRkcikgICAoKFJlYWRSZWcoQmFzZUFkZHIsSF9TVCkmMHhmMSkgPj4xKQorI2RlZmluZSBJc0hvc3RCdXN5KEJhc2VBZGRyKSAgICAgICAgQ2hlY2tSZWdCaXQoQmFzZUFkZHIsSF9TVCwwKQorI2RlZmluZSBHZXRIb3N0U3RhdHVzKEJhc2VBZGRyKSAgICAgUmVhZFJlZyhCYXNlQWRkcixIX1NUKQkvL1JPCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqTV9DVAorI2RlZmluZSBFblRYRE1BKEJhc2VBZGRyLHZhbCkgICAgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixNX0NULDcsdmFsKQorI2RlZmluZSBFblJYRE1BKEJhc2VBZGRyLHZhbCkgICAgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixNX0NULDYsdmFsKQorI2RlZmluZSBTd2FwRE1BKEJhc2VBZGRyLHZhbCkgICAgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixNX0NULDUsdmFsKQorI2RlZmluZSBFbkludGVybmFsTG9vcChCYXNlQWRkcix2YWwpICBXcml0ZVJlZ0JpdChCYXNlQWRkcixNX0NULDQsdmFsKQorI2RlZmluZSBFbkV4dGVybmFsTG9vcChCYXNlQWRkcix2YWwpICBXcml0ZVJlZ0JpdChCYXNlQWRkcixNX0NULDMsdmFsKQorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKlRYX0NUXzEKKyNkZWZpbmUgRW5UWEZJRk9IYWxmTGV2ZWxJbnQoQmFzZUFkZHIsdmFsKSAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLFRYX0NUXzEsNCx2YWwpCS8vaGFsZiBlbXB0eSBpbnQgKDEgaGFsZikKKyNkZWZpbmUgRW5UWEZJRk9VbmRlcnJ1bkVPTUludChCYXNlQWRkcix2YWwpIFdyaXRlUmVnQml0KEJhc2VBZGRyLFRYX0NUXzEsNSx2YWwpCisjZGVmaW5lIEVuVFhGSUZPUmVhZHlJbnQoQmFzZUFkZHIsdmFsKSAgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixUWF9DVF8xLDYsdmFsKQkvL2ludCB3aGVuIHJlYWNoIGl0IHRocmVzaG9sZCAoc2V0dGluZyBieSBiaXQgNCkKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKipUWF9DVF8yCisjZGVmaW5lIEZvcmNlVW5kZXJydW4oQmFzZUFkZHIsdmFsKSAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLFRYX0NUXzIsNyx2YWwpCS8vIGZvcmNlIGFuIHVuZGVycnVuIGludAorI2RlZmluZSBFblRYQ1JDKEJhc2VBZGRyLHZhbCkgICAgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixUWF9DVF8yLDYsdmFsKQkvLzEgZm9yIEZJUixNSVIuLi4wIChub3QgU0lSKQorI2RlZmluZSBGb3JjZUJBRENSQyhCYXNlQWRkcix2YWwpICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixUWF9DVF8yLDUsdmFsKQkvL2ZvcmNlIGFuIGJhZCBDUkMKKyNkZWZpbmUgU2VuZFNJUChCYXNlQWRkcix2YWwpICAgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsVFhfQ1RfMiw0LHZhbCkJLy9zZW5kIGluZGljYXRpb24gcHVsc2UgZm9yIHByZXZlbnQgU0lSIGRpc3R1cmIKKyNkZWZpbmUgQ2xlYXJFblRYKEJhc2VBZGRyLHZhbCkgICAgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsVFhfQ1RfMiwzLHZhbCkJLy8gb3Bwb3NpdGUgdG8gRW5UWAorLy8qKioqKioqKioqKioqKioqKlRYX1NUCisjZGVmaW5lIEdldFRYU3RhdHVzKEJhc2VBZGRyKSAJUmVhZFJlZyhCYXNlQWRkcixUWF9TVCkJLy9STworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKlJYX0NUCisjZGVmaW5lIEVuUlhTcGVjSW50KEJhc2VBZGRyLHZhbCkgICAgICAgICAgIFdyaXRlUmVnQml0KEJhc2VBZGRyLFJYX0NULDAsdmFsKQorI2RlZmluZSBFblJYRklGT1JlYWR5SW50KEJhc2VBZGRyLHZhbCkgICAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixSWF9DVCwxLHZhbCkJLy9lbmFibGUgaW50IHdoZW4gcmVhY2ggaXQgdGhyZXNob2xkIChzZXR0aW5nIGJ5IGJpdCA3KQorI2RlZmluZSBFblJYRklGT0hhbGZMZXZlbEludChCYXNlQWRkcix2YWwpICBXcml0ZVJlZ0JpdChCYXNlQWRkcixSWF9DVCw3LHZhbCkJLy9lbmFibGUgaW50IHdoZW4gKDEpIGhhbGYgZnVsbC4uLm9yICgwKSBqdXN0IG5vdCBmdWxsCisvLyoqKioqKioqKioqKioqKioqUlhfU1QKKyNkZWZpbmUgR2V0UlhTdGF0dXMoQmFzZUFkZHIpIAlSZWFkUmVnKEJhc2VBZGRyLFJYX1NUKQkvL1JPCisvLyoqKioqKioqKioqKioqKioqKioqKioqUF9BRERSCisjZGVmaW5lIFNldFBhY2tldEFkZHIoQmFzZUFkZHIsYWRkcikgICAgICAgIFdyaXRlUmVnKEJhc2VBZGRyLFBfQUREUixhZGRyKQorLy8qKioqKioqKioqKioqKioqKioqKioqKklfQ0ZfNAorI2RlZmluZSBFbkdQSU90b1JYMihCYXNlQWRkcix2YWwpCVdyaXRlUmVnQml0KEJhc2VBZGRyLElfQ0ZfNCw3LHZhbCkKKyNkZWZpbmUgRW5UaW1lckludChCYXNlQWRkcix2YWwpCQlXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGXzQsMSx2YWwpCisjZGVmaW5lIENsZWFyVGltZXJJbnQoQmFzZUFkZHIsdmFsKQlXcml0ZVJlZ0JpdChCYXNlQWRkcixJX0NGXzQsMCx2YWwpCisvLyoqKioqKioqKioqKioqKioqKioqKioqSV9UX0NfTAorI2RlZmluZSBXcml0ZUdJTyhCYXNlQWRkcix2YWwpCSAgICBXcml0ZVJlZ0JpdChCYXNlQWRkcixJX1RfQ19MLDcsdmFsKQorI2RlZmluZSBSZWFkR0lPKEJhc2VBZGRyKQkJICAgIENoZWNrUmVnQml0KEJhc2VBZGRyLElfVF9DX0wsNykKKyNkZWZpbmUgUmVhZFJYKEJhc2VBZGRyKQkJICAgIENoZWNrUmVnQml0KEJhc2VBZGRyLElfVF9DX0wsMykJLy9STworI2RlZmluZSBXcml0ZVRYKEJhc2VBZGRyLHZhbCkJCVdyaXRlUmVnQml0KEJhc2VBZGRyLElfVF9DX0wsMCx2YWwpCisvLyoqKioqKioqKioqKioqKioqKioqKioqSV9UX0NfSAorI2RlZmluZSBFblJYMihCYXNlQWRkcix2YWwpCQkgICAgV3JpdGVSZWdCaXQoQmFzZUFkZHIsSV9UX0NfSCw3LHZhbCkKKyNkZWZpbmUgUmVhZFJYMihCYXNlQWRkcikgICAgICAgICAgIENoZWNrUmVnQml0KEJhc2VBZGRyLElfVF9DX0gsNykKKy8vKioqKioqKioqKioqKioqKioqKioqKlZlcnNpb24KKyNkZWZpbmUgR2V0RklSVmVyc2lvbihCYXNlQWRkcikJCVJlYWRSZWcoQmFzZUFkZHIsVkVSU0lPTikKKworCitzdGF0aWMgdm9pZCBTZXRUaW1lcihfX3UxNiBpb2Jhc2UsIF9fdTggY291bnQpCit7CisJRW5UaW1lckludChpb2Jhc2UsIE9GRik7CisJV3JpdGVSZWcoaW9iYXNlLCBUSU1FUiwgY291bnQpOworCUVuVGltZXJJbnQoaW9iYXNlLCBPTik7Cit9CisKKworc3RhdGljIHZvaWQgU2V0U2VuZEJ5dGUoX191MTYgaW9iYXNlLCBfX3UzMiBjb3VudCkKK3sKKwlfX3UzMiBsb3csIGhpZ2g7CisKKwlpZiAoKGNvdW50ICYgMHhmMDAwKSA9PSAwKSB7CisJCWxvdyA9IGNvdW50ICYgMHgwMGZmOworCQloaWdoID0gKGNvdW50ICYgMHgwZjAwKSA+PiA4OworCQlXcml0ZVJlZyhpb2Jhc2UsIFRYX0NfTCwgbG93KTsKKwkJV3JpdGVSZWcoaW9iYXNlLCBUWF9DX0gsIGhpZ2gpOworCX0KK30KKworc3RhdGljIHZvaWQgUmVzZXRDaGlwKF9fdTE2IGlvYmFzZSwgX191OCB0eXBlKQoreworCV9fdTggdmFsdWU7CisKKwl2YWx1ZSA9ICh0eXBlICsgMikgPDwgNDsKKwlXcml0ZVJlZyhpb2Jhc2UsIFJFU0VULCB0eXBlKTsKK30KKworc3RhdGljIGludCBDa1J4UmVjdihfX3UxNiBpb2Jhc2UsIHN0cnVjdCB2aWFfaXJjY19jYiAqc2VsZikKK3sKKwlfX3U4IGxvdywgaGlnaDsKKwlfX3UxNiB3VG1wID0gMCwgd1RtcDEgPSAwLCB3VG1wX25ldyA9IDA7CisKKwlsb3cgPSBSZWFkUmVnKGlvYmFzZSwgUlhfQ19MKTsKKwloaWdoID0gUmVhZFJlZyhpb2Jhc2UsIFJYX0NfSCk7CisJd1RtcDEgPSBoaWdoOworCXdUbXAgPSAod1RtcDEgPDwgOCkgfCBsb3c7CisJdWRlbGF5KDEwKTsKKwlsb3cgPSBSZWFkUmVnKGlvYmFzZSwgUlhfQ19MKTsKKwloaWdoID0gUmVhZFJlZyhpb2Jhc2UsIFJYX0NfSCk7CisJd1RtcDEgPSBoaWdoOworCXdUbXBfbmV3ID0gKHdUbXAxIDw8IDgpIHwgbG93OworCWlmICh3VG1wX25ldyAhPSB3VG1wKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworCit9CisKK3N0YXRpYyBfX3UxNiBSeEN1ckNvdW50KF9fdTE2IGlvYmFzZSwgc3RydWN0IHZpYV9pcmNjX2NiICogc2VsZikKK3sKKwlfX3U4IGxvdywgaGlnaDsKKwlfX3UxNiB3VG1wID0gMCwgd1RtcDEgPSAwOworCisJbG93ID0gUmVhZFJlZyhpb2Jhc2UsIFJYX1BfTCk7CisJaGlnaCA9IFJlYWRSZWcoaW9iYXNlLCBSWF9QX0gpOworCXdUbXAxID0gaGlnaDsKKwl3VG1wID0gKHdUbXAxIDw8IDgpIHwgbG93OworCXJldHVybiB3VG1wOworfQorCisvKiBUaGlzIFJvdXRpbmUgY2FuIG9ubHkgdXNlIGluIHJlY2V2aWVfY29tcGxldGUKKyAqIGZvciBpdCB3aWxsIHVwZGF0ZSBsYXN0IGNvdW50LgorICovCisKK3N0YXRpYyBfX3UxNiBHZXRSZWN2Qnl0ZShfX3UxNiBpb2Jhc2UsIHN0cnVjdCB2aWFfaXJjY19jYiAqIHNlbGYpCit7CisJX191OCBsb3csIGhpZ2g7CisJX191MTYgd1RtcCwgd1RtcDEsIHJldDsKKworCWxvdyA9IFJlYWRSZWcoaW9iYXNlLCBSWF9QX0wpOworCWhpZ2ggPSBSZWFkUmVnKGlvYmFzZSwgUlhfUF9IKTsKKwl3VG1wMSA9IGhpZ2g7CisJd1RtcCA9ICh3VG1wMSA8PCA4KSB8IGxvdzsKKworCisJaWYgKHdUbXAgPj0gc2VsZi0+UnhMYXN0Q291bnQpCisJCXJldCA9IHdUbXAgLSBzZWxmLT5SeExhc3RDb3VudDsKKwllbHNlCisJCXJldCA9ICgweDgwMDAgLSBzZWxmLT5SeExhc3RDb3VudCkgKyB3VG1wOworCXNlbGYtPlJ4TGFzdENvdW50ID0gd1RtcDsKKworLyogUlhfUCBpcyBtb3JlIGFjdHVhbGx5IHRoZSBSWF9DCisgbG93PVJlYWRSZWcoaW9iYXNlLFJYX0NfTCk7CisgaGlnaD1SZWFkUmVnKGlvYmFzZSxSWF9DX0gpOworCisgaWYoIShoaWdoJjB4ZTAwMCkpIHsKKwkgdGVtcD0oaGlnaDw8OCkrbG93OworCSByZXR1cm4gdGVtcDsKKyB9CisgZWxzZSByZXR1cm4gMDsKKyovCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgU2RlbGF5KF9fdTE2IHNjYWxlKQoreworCV9fdTggYlRtcDsKKwlpbnQgaSwgajsKKworCWZvciAoaiA9IDA7IGogPCBzY2FsZTsgaisrKSB7CisJCWZvciAoaSA9IDA7IGkgPCAweDIwOyBpKyspIHsKKwkJCWJUbXAgPSBpbmIoMHhlYik7CisJCQlvdXRiKGJUbXAsIDB4ZWIpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBUZGVsYXkoX191MTYgc2NhbGUpCit7CisJX191OCBiVG1wOworCWludCBpLCBqOworCisJZm9yIChqID0gMDsgaiA8IHNjYWxlOyBqKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IDB4NTA7IGkrKykgeworCQkJYlRtcCA9IGluYigweGViKTsKKwkJCW91dGIoYlRtcCwgMHhlYik7CisJCX0KKwl9Cit9CisKKworc3RhdGljIHZvaWQgQWN0Q2xrKF9fdTE2IGlvYmFzZSwgX191OCB2YWx1ZSkKK3sKKwlfX3U4IGJUbXA7CisJYlRtcCA9IFJlYWRSZWcoaW9iYXNlLCAweDM0KTsKKwlpZiAodmFsdWUpCisJCVdyaXRlUmVnKGlvYmFzZSwgMHgzNCwgYlRtcCB8IENsa19iaXQpOworCWVsc2UKKwkJV3JpdGVSZWcoaW9iYXNlLCAweDM0LCBiVG1wICYgfkNsa19iaXQpOworfQorCitzdGF0aWMgdm9pZCBDbGtUeChfX3UxNiBpb2Jhc2UsIF9fdTggQ2xrLCBfX3U4IFR4KQoreworCV9fdTggYlRtcDsKKworCWJUbXAgPSBSZWFkUmVnKGlvYmFzZSwgMHgzNCk7CisJaWYgKENsayA9PSAwKQorCQliVG1wICY9IH5DbGtfYml0OworCWVsc2UgeworCQlpZiAoQ2xrID09IDEpCisJCQliVG1wIHw9IENsa19iaXQ7CisJfQorCVdyaXRlUmVnKGlvYmFzZSwgMHgzNCwgYlRtcCk7CisJU2RlbGF5KDEpOworCWlmIChUeCA9PSAwKQorCQliVG1wICY9IH5UeF9iaXQ7CisJZWxzZSB7CisJCWlmIChUeCA9PSAxKQorCQkJYlRtcCB8PSBUeF9iaXQ7CisJfQorCVdyaXRlUmVnKGlvYmFzZSwgMHgzNCwgYlRtcCk7Cit9CisKK3N0YXRpYyB2b2lkIFdyX0J5dGUoX191MTYgaW9iYXNlLCBfX3U4IGRhdGEpCit7CisJX191OCBiRGF0YSA9IGRhdGE7CisvLyAgICAgIF9fdTggYnRtcDsKKwlpbnQgaTsKKworCUNsa1R4KGlvYmFzZSwgMCwgMSk7CisKKwlUZGVsYXkoMik7CisJQWN0Q2xrKGlvYmFzZSwgMSk7CisJVGRlbGF5KDEpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewkvL0xETgorCisJCWlmICgoYkRhdGEgPj4gaSkgJiAweDAxKSB7CisJCQlDbGtUeChpb2Jhc2UsIDAsIDEpOwkvL2JpdCBkYXRhID0gMTsKKwkJfSBlbHNlIHsKKwkJCUNsa1R4KGlvYmFzZSwgMCwgMCk7CS8vYml0IGRhdGEgPSAxOworCQl9CisJCVRkZWxheSgyKTsKKwkJU2RlbGF5KDEpOworCQlBY3RDbGsoaW9iYXNlLCAxKTsJLy9jbGsgaGkKKwkJVGRlbGF5KDEpOworCX0KK30KKworc3RhdGljIF9fdTggUmRfSW5keChfX3UxNiBpb2Jhc2UsIF9fdTggYWRkciwgX191OCBpbmRleCkKK3sKKwlfX3U4IGRhdGEgPSAwLCBiVG1wLCBkYXRhX2JpdDsKKwlpbnQgaTsKKworCWJUbXAgPSBhZGRyIHwgKGluZGV4IDw8IDEpIHwgMDsKKwlDbGtUeChpb2Jhc2UsIDAsIDApOworCVRkZWxheSgyKTsKKwlBY3RDbGsoaW9iYXNlLCAxKTsKKwl1ZGVsYXkoMSk7CisJV3JfQnl0ZShpb2Jhc2UsIGJUbXApOworCVNkZWxheSgxKTsKKwlDbGtUeChpb2Jhc2UsIDAsIDApOworCVRkZWxheSgyKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQlBY3RDbGsoaW9iYXNlLCAxKTsKKwkJVGRlbGF5KDEpOworCQlBY3RDbGsoaW9iYXNlLCAwKTsKKwkJVGRlbGF5KDEpOworCQlDbGtUeChpb2Jhc2UsIDAsIDEpOworCQlUZGVsYXkoMSk7CisJCWJUbXAgPSBSZWFkUmVnKGlvYmFzZSwgMHgzNCk7CisJCWlmICghKGJUbXAgJiBSZF9WYWxpZCkpCisJCQlicmVhazsKKwl9CisJaWYgKCEoYlRtcCAmIFJkX1ZhbGlkKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlBY3RDbGsoaW9iYXNlLCAxKTsKKwkJCVRkZWxheSgxKTsKKwkJCUFjdENsayhpb2Jhc2UsIDApOworCQkJYlRtcCA9IFJlYWRSZWcoaW9iYXNlLCAweDM0KTsKKwkJCWRhdGFfYml0ID0gMSA8PCBpOworCQkJaWYgKGJUbXAgJiBSeEJpdCkKKwkJCQlkYXRhIHw9IGRhdGFfYml0OworCQkJZWxzZQorCQkJCWRhdGEgJj0gfmRhdGFfYml0OworCQkJVGRlbGF5KDIpOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJQWN0Q2xrKGlvYmFzZSwgMSk7CisJCQlUZGVsYXkoMSk7CisJCQlBY3RDbGsoaW9iYXNlLCAwKTsKKwkJCVRkZWxheSgyKTsKKwkJfQorCQliVG1wID0gUmVhZFJlZyhpb2Jhc2UsIDB4MzQpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgMTsgaSsrKSB7CisJCUFjdENsayhpb2Jhc2UsIDEpOworCQlUZGVsYXkoMSk7CisJCUFjdENsayhpb2Jhc2UsIDApOworCQlUZGVsYXkoMik7CisJfQorCUNsa1R4KGlvYmFzZSwgMCwgMCk7CisJVGRlbGF5KDEpOworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJQWN0Q2xrKGlvYmFzZSwgMSk7CisJCVRkZWxheSgxKTsKKwkJQWN0Q2xrKGlvYmFzZSwgMCk7CisJCVRkZWxheSgyKTsKKwl9CisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkIFdyX0luZHgoX191MTYgaW9iYXNlLCBfX3U4IGFkZHIsIF9fdTggaW5kZXgsIF9fdTggZGF0YSkKK3sKKwlpbnQgaTsKKwlfX3U4IGJUbXA7CisKKwlDbGtUeChpb2Jhc2UsIDAsIDApOworCXVkZWxheSgyKTsKKwlBY3RDbGsoaW9iYXNlLCAxKTsKKwl1ZGVsYXkoMSk7CisJYlRtcCA9IGFkZHIgfCAoaW5kZXggPDwgMSkgfCAxOworCVdyX0J5dGUoaW9iYXNlLCBiVG1wKTsKKwlXcl9CeXRlKGlvYmFzZSwgZGF0YSk7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlDbGtUeChpb2Jhc2UsIDAsIDApOworCQlUZGVsYXkoMik7CisJCUFjdENsayhpb2Jhc2UsIDEpOworCQlUZGVsYXkoMSk7CisJfQorCUFjdENsayhpb2Jhc2UsIDApOworfQorCitzdGF0aWMgdm9pZCBSZXNldERvbmdsZShfX3UxNiBpb2Jhc2UpCit7CisJaW50IGk7CisJQ2xrVHgoaW9iYXNlLCAwLCAwKTsKKwlUZGVsYXkoMSk7CisJZm9yIChpID0gMDsgaSA8IDMwOyBpKyspIHsKKwkJQWN0Q2xrKGlvYmFzZSwgMSk7CisJCVRkZWxheSgxKTsKKwkJQWN0Q2xrKGlvYmFzZSwgMCk7CisJCVRkZWxheSgxKTsKKwl9CisJQWN0Q2xrKGlvYmFzZSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIFNldFNJVG1vZGUoX191MTYgaW9iYXNlKQoreworCisJX191OCBiVG1wOworCisJYlRtcCA9IFJlYWRMUENSZWcoMHgyOCk7CisJV3JpdGVMUENSZWcoMHgyOCwgYlRtcCB8IDB4MTApOwkvL3NlbGVjdCBJVE1PRkYKKwliVG1wID0gUmVhZFJlZyhpb2Jhc2UsIDB4MzUpOworCVdyaXRlUmVnKGlvYmFzZSwgMHgzNSwgYlRtcCB8IDB4NDApOwkvLyBEcml2ZXIgSVRNT0ZGCisJV3JpdGVSZWcoaW9iYXNlLCAweDI4LCBiVG1wIHwgMHg4MCk7CS8vIGVuYWJsZSBBbGwgaW50ZXJydXB0Cit9CisKK3N0YXRpYyB2b2lkIFNJX1NldE1vZGUoX191MTYgaW9iYXNlLCBpbnQgbW9kZSkKK3sKKwkvL19fdTMyIGRUbXA7CisJX191OCBiVG1wOworCisJV3JpdGVMUENSZWcoMHgyOCwgMHg3MCk7CS8vIFMvVyBSZXNldAorCVNldFNJVG1vZGUoaW9iYXNlKTsKKwlSZXNldERvbmdsZShpb2Jhc2UpOworCXVkZWxheSgxMCk7CisJV3JfSW5keChpb2Jhc2UsIDB4NDAsIDB4MCwgMHgxNyk7CS8vUlggLEFQRU4gZW5hYmxlLE5vcm1hbCBwb3dlcgorCVdyX0luZHgoaW9iYXNlLCAweDQwLCAweDEsIG1vZGUpOwkvL1NldCBNb2RlCisJV3JfSW5keChpb2Jhc2UsIDB4NDAsIDB4MiwgMHhmZik7CS8vU2V0IHBvd2VyIHRvIEZJUiBWRklSID4gMW0KKwliVG1wID0gUmRfSW5keChpb2Jhc2UsIDB4NDAsIDEpOworfQorCitzdGF0aWMgdm9pZCBJbml0Q2FyZChfX3UxNiBpb2Jhc2UpCit7CisJUmVzZXRDaGlwKGlvYmFzZSwgNSk7CisJV3JpdGVSZWcoaW9iYXNlLCBJX1NUX0NUXzAsIDB4MDApOwkvLyBvcGVuIENISVAgb24KKwlTZXRTSVJCT0YoaW9iYXNlLCAweGMwKTsJLy8gaGFyZHdhcmUgZGVmYXVsdCB2YWx1ZQorCVNldFNJUkVPRihpb2Jhc2UsIDB4YzEpOworfQorCitzdGF0aWMgdm9pZCBDb21tb25Jbml0KF9fdTE2IGlvYmFzZSkKK3sKKy8vICBFblRYQ1JDKGlvYmFzZSwwKTsKKwlTd2FwRE1BKGlvYmFzZSwgT0ZGKTsKKwlTZXRNYXhSeFBhY2tldFNpemUoaW9iYXNlLCAweDBmZmYpOwkvL3NldCB0byBtYXg6NDA5NQorCUVuUlhGSUZPUmVhZHlJbnQoaW9iYXNlLCBPRkYpOworCUVuUlhGSUZPSGFsZkxldmVsSW50KGlvYmFzZSwgT0ZGKTsKKwlFblRYRklGT0hhbGZMZXZlbEludChpb2Jhc2UsIE9GRik7CisJRW5UWEZJRk9VbmRlcnJ1bkVPTUludChpb2Jhc2UsIE9OKTsKKy8vICBFblRYRklGT1JlYWR5SW50KGlvYmFzZSxPTik7CisJSW52ZXJ0VFgoaW9iYXNlLCBPRkYpOworCUludmVydFJYKGlvYmFzZSwgT0ZGKTsKKy8vICBXcml0ZUxQQ1JlZygweEYwLDApOyAvLyhpZiBWVDEyMTEgdGhlbiBkbyB0aGlzKQorCWlmIChJc1NJUk9uKGlvYmFzZSkpIHsKKwkJU0lSRmlsdGVyKGlvYmFzZSwgT04pOworCQlTSVJSZWN2QW55KGlvYmFzZSwgT04pOworCX0gZWxzZSB7CisJCVNJUkZpbHRlcihpb2Jhc2UsIE9GRik7CisJCVNJUlJlY3ZBbnkoaW9iYXNlLCBPRkYpOworCX0KKwlFblJYU3BlY0ludChpb2Jhc2UsIE9OKTsKKwlXcml0ZVJlZyhpb2Jhc2UsIElfU1RfQ1RfMCwgMHg4MCk7CisJRW5hYmxlRE1BKGlvYmFzZSwgT04pOworfQorCitzdGF0aWMgdm9pZCBTZXRCYXVkUmF0ZShfX3UxNiBpb2Jhc2UsIF9fdTMyIHJhdGUpCit7CisJX191OCB2YWx1ZSA9IDExLCB0ZW1wOworCisJaWYgKElzU0lST24oaW9iYXNlKSkgeworCQlzd2l0Y2ggKHJhdGUpIHsKKwkJY2FzZSAoX191MzIpICgyNDAwTCk6CisJCQl2YWx1ZSA9IDQ3OworCQkJYnJlYWs7CisJCWNhc2UgKF9fdTMyKSAoOTYwMEwpOgorCQkJdmFsdWUgPSAxMTsKKwkJCWJyZWFrOworCQljYXNlIChfX3UzMikgKDE5MjAwTCk6CisJCQl2YWx1ZSA9IDU7CisJCQlicmVhazsKKwkJY2FzZSAoX191MzIpICgzODQwMEwpOgorCQkJdmFsdWUgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgKF9fdTMyKSAoNTc2MDBMKToKKwkJCXZhbHVlID0gMTsKKwkJCWJyZWFrOworCQljYXNlIChfX3UzMikgKDExNTIwMEwpOgorCQkJdmFsdWUgPSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfTsKKwl9IGVsc2UgaWYgKElzTUlST24oaW9iYXNlKSkgeworCQl2YWx1ZSA9IDA7CS8vIHdpbGwgYXV0b21hdGljYWxseSBiZSBmaXhlZCBpbiAxLjE1Mk0KKwl9IGVsc2UgaWYgKElzRklST24oaW9iYXNlKSkgeworCQl2YWx1ZSA9IDA7CS8vIHdpbGwgYXV0b21hdGljYWxseSBiZSBmaXhlZCBpbiA0TQorCX0KKwl0ZW1wID0gKFJlYWRSZWcoaW9iYXNlLCBJX0NGX0hfMSkgJiAweDAzKTsKKwl0ZW1wIHw9IHZhbHVlIDw8IDI7CisJV3JpdGVSZWcoaW9iYXNlLCBJX0NGX0hfMSwgdGVtcCk7Cit9CisKK3N0YXRpYyB2b2lkIFNldFB1bHNlV2lkdGgoX191MTYgaW9iYXNlLCBfX3U4IHdpZHRoKQoreworCV9fdTggdGVtcCwgdGVtcDEsIHRlbXAyOworCisJdGVtcCA9IChSZWFkUmVnKGlvYmFzZSwgSV9DRl9MXzEpICYgMHgxZik7CisJdGVtcDEgPSAoUmVhZFJlZyhpb2Jhc2UsIElfQ0ZfSF8xKSAmIDB4ZmMpOworCXRlbXAyID0gKHdpZHRoICYgMHgwNykgPDwgNTsKKwl0ZW1wIHw9IHRlbXAyOworCXRlbXAyID0gKHdpZHRoICYgMHgxOCkgPj4gMzsKKwl0ZW1wMSB8PSB0ZW1wMjsKKwlXcml0ZVJlZyhpb2Jhc2UsIElfQ0ZfTF8xLCB0ZW1wKTsKKwlXcml0ZVJlZyhpb2Jhc2UsIElfQ0ZfSF8xLCB0ZW1wMSk7Cit9CisKK3N0YXRpYyB2b2lkIFNldFNlbmRQcmVhbWJsZUNvdW50KF9fdTE2IGlvYmFzZSwgX191OCBjb3VudCkKK3sKKwlfX3U4IHRlbXA7CisKKwl0ZW1wID0gUmVhZFJlZyhpb2Jhc2UsIElfQ0ZfTF8xKSAmIDB4ZTA7CisJdGVtcCB8PSBjb3VudDsKKwlXcml0ZVJlZyhpb2Jhc2UsIElfQ0ZfTF8xLCB0ZW1wKTsKKworfQorCitzdGF0aWMgdm9pZCBTZXRWRklSKF9fdTE2IEJhc2VBZGRyLCBfX3U4IHZhbCkKK3sKKwlfX3U4IHRtcDsKKworCXRtcCA9IFJlYWRSZWcoQmFzZUFkZHIsIElfQ0ZfTF8wKTsKKwlXcml0ZVJlZyhCYXNlQWRkciwgSV9DRl9MXzAsIHRtcCAmIDB4OGYpOworCVdyaXRlUmVnQml0KEJhc2VBZGRyLCBJX0NGX0hfMCwgNSwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgU2V0RklSKF9fdTE2IEJhc2VBZGRyLCBfX3U4IHZhbCkKK3sKKwlfX3U4IHRtcDsKKworCVdyaXRlUmVnQml0KEJhc2VBZGRyLCBJX0NGX0hfMCwgNSwgMCk7CisJdG1wID0gUmVhZFJlZyhCYXNlQWRkciwgSV9DRl9MXzApOworCVdyaXRlUmVnKEJhc2VBZGRyLCBJX0NGX0xfMCwgdG1wICYgMHg4Zik7CisJV3JpdGVSZWdCaXQoQmFzZUFkZHIsIElfQ0ZfTF8wLCA2LCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBTZXRNSVIoX191MTYgQmFzZUFkZHIsIF9fdTggdmFsKQoreworCV9fdTggdG1wOworCisJV3JpdGVSZWdCaXQoQmFzZUFkZHIsIElfQ0ZfSF8wLCA1LCAwKTsKKwl0bXAgPSBSZWFkUmVnKEJhc2VBZGRyLCBJX0NGX0xfMCk7CisJV3JpdGVSZWcoQmFzZUFkZHIsIElfQ0ZfTF8wLCB0bXAgJiAweDhmKTsKKwlXcml0ZVJlZ0JpdChCYXNlQWRkciwgSV9DRl9MXzAsIDUsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIFNldFNJUihfX3UxNiBCYXNlQWRkciwgX191OCB2YWwpCit7CisJX191OCB0bXA7CisKKwlXcml0ZVJlZ0JpdChCYXNlQWRkciwgSV9DRl9IXzAsIDUsIDApOworCXRtcCA9IFJlYWRSZWcoQmFzZUFkZHIsIElfQ0ZfTF8wKTsKKwlXcml0ZVJlZyhCYXNlQWRkciwgSV9DRl9MXzAsIHRtcCAmIDB4OGYpOworCVdyaXRlUmVnQml0KEJhc2VBZGRyLCBJX0NGX0xfMCwgNCwgdmFsKTsKK30KKworI2VuZGlmCQkJCS8qIHZpYV9JUkNDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5jIGIvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmYWQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5jCkBAIC0wLDAgKzEsMTkxMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCXZsc2lfaXIuYzoJVkxTSTgyQzE0NyBQQ0kgSXJEQSBjb250cm9sbGVyIGRyaXZlciBmb3IgTGludXgKKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMyBNYXJ0aW4gRGllaGwKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKglwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqCXRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgCisgKglNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorIAorI2RlZmluZSBEUklWRVJfTkFNRSAJCSJ2bHNpX2lyIgorI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJInYwLjUiCisjZGVmaW5lIERSSVZFUl9ERVNDUklQVElPTgkiSXJEQSBTSVIvTUlSL0ZJUiBkcml2ZXIgZm9yIFZMU0kgODJDMTQ3IgorI2RlZmluZSBEUklWRVJfQVVUSE9SCQkiTWFydGluIERpZWhsIDxpbmZvQG1kaWVobC5kZT4iCisKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQ1JJUFRJT04pOworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvd3JhcHBlci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2NyYy5oPgorCisjaW5jbHVkZSAidmxzaV9pci5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyAvKiBjb25zdCAqLyBjaGFyIGRyaXZlcm5hbWVbXSA9IERSSVZFUl9OQU1FOworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgdmxzaV9pcmRhX3RhYmxlIFtdID0geworCXsKKwkJLmNsYXNzID0gICAgICAgIFBDSV9DTEFTU19XSVJFTEVTU19JUkRBIDw8IDgsCisJCS5jbGFzc19tYXNrID0JUENJX0NMQVNTX1NVQkNMQVNTX01BU0sgPDwgOCwgCisJCS52ZW5kb3IgPSAgICAgICBQQ0lfVkVORE9SX0lEX1ZMU0ksCisJCS5kZXZpY2UgPSAgICAgICBQQ0lfREVWSUNFX0lEX1ZMU0lfODJDMTQ3LAorCQkuc3VidmVuZG9yID0gCVBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgPQlQQ0lfQU5ZX0lELAorCX0sCisJeyAvKiBhbGwgemVyb2VzICovIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB2bHNpX2lyZGFfdGFibGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCWNsa3NyYzogd2hpY2ggY2xvY2sgc291cmNlIHRvIGJlIHVzZWQKKyAqCQkwOiBhdXRvIC0gdHJ5IFBMTCwgZmFsbGJhY2sgdG8gNDBNSHogWENMSworICoJCTE6IG9uLWNoaXAgNDhNSHogUExMCisgKgkJMjogZXh0ZXJuYWwgNDhNSHogWENMSworICoJCTM6IGV4dGVybmFsIDQwTUh6IFhDTEsgKEhQIE9CLTgwMCkKKyAqLworCitzdGF0aWMgaW50IGNsa3NyYyA9IDA7CQkJLyogZGVmYXVsdCBpcyAwKGF1dG8pICovCittb2R1bGVfcGFyYW0oY2xrc3JjLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhjbGtzcmMsICJjbG9jayBpbnB1dCBzb3VyY2Ugc2VsZWN0aW9uIik7CisKKy8qCXJpbmdzaXplOiBzaXplIG9mIHRoZSB0eCBhbmQgcnggZGVzY3JpcHRvciByaW5ncworICoJCWluZGVwZW5kZW50IGZvciB0eCBhbmQgcngKKyAqCQlzcGVjaWZ5IGFzIHJpbmdzaXplPXR4WyxyeF0KKyAqCQlhbGxvd2VkIHZhbHVlczogNCwgOCwgMTYsIDMyLCA2NAorICoJCUR1ZSB0byB0aGUgSXJEQSAxLnggbWF4LiBhbGxvd2VkIHdpbmRvdyBzaXplPTcsCisgKgkJdGhlcmUgc2hvdWxkIGJlIG5vIGdhaW4gd2hlbiB1c2luZyByaW5ncyBsYXJnZXIgdGhhbiA4CisgKi8KKworc3RhdGljIGludCByaW5nc2l6ZVtdID0gezgsOH07CQkvKiBkZWZhdWx0IGlzIHR4PTggLyByeD04ICovCittb2R1bGVfcGFyYW1fYXJyYXkocmluZ3NpemUsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJpbmdzaXplLCAiVFgsIFJYIHJpbmcgZGVzY3JpcHRvciBzaXplIik7CisKKy8qCXNpcnB1bHNlOiB0dW5pbmcgb2YgdGhlIFNJUiBwdWxzZSB3aWR0aCB3aXRoaW4gSXJQSFkgMS4zIGxpbWl0cworICoJCTA6IHZlcnkgc2hvcnQsIDEuNXVzIChleGNlcHRpb246IDZ1cyBhdCAyLjQga2JhdWQpCisgKgkJMTogbm9taW5hbCAzLzE2IGJpdHRpbWUgd2lkdGgKKyAqCW5vdGU6IElyREEgY29tcGxpYW50IHBlZXIgZGV2aWNlcyBzaG91bGQgYmUgaGFwcHkgcmVnYXJkbGVzcworICoJCXdoaWNoIG9uZSBpcyB1c2VkLiBQcmltYXJ5IGdvYWwgaXMgdG8gc2F2ZSBzb21lIHBvd2VyCisgKgkJb24gdGhlIHNlbmRlcidzIHNpZGUgLSBhdCA5LjZrYmF1ZCBmb3IgZXhhbXBsZSB0aGUgc2hvcnQKKyAqCQlwdWxzZSB3aWR0aCBzYXZlcyBtb3JlIHRoYW4gOTAlIG9mIHRoZSB0cmFuc21pdHRlZCBJUiBwb3dlci4KKyAqLworCitzdGF0aWMgaW50IHNpcnB1bHNlID0gMTsJCS8qIGRlZmF1bHQgaXMgMy8xNiBiaXR0aW1lICovCittb2R1bGVfcGFyYW0oc2lycHVsc2UsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNpcnB1bHNlLCAiU0lSIHB1bHNlIHdpZHRoIHR1bmluZyIpOworCisvKglxb3NfbXR0X2JpdHM6IGVuY29kZWQgbWluLXR1cm4tdGltZSB2YWx1ZSB3ZSByZXF1aXJlIHRoZSBwZWVyIGRldmljZQorICoJCSB0byB1c2UgYmVmb3JlIHRyYW5zbWl0dGluZyB0byB1cy4gIlR5cGUgMSIgKHBlci1zdGF0aW9uKQorICoJCSBiaXRmaWVsZCBhY2NvcmRpbmcgdG8gSXJMQVAgZGVmaW5pdGlvbiAoc2VjdGlvbiA2LjYuOCkKKyAqCQkgRG9uJ3Qga25vdyB3aGljaCB0cmFuc2NlaXZlciBpcyB1c2VkIGJ5IG15IE9CODAwIC0gdGhlCisgKgkJIHByZXR0eSBjb21tb24gSFAgSERMUy0xMTAwIHJlcXVpcmVzIDEgbXNlYyAtIHNvIGxldHMgdXNlIHRoaXMuCisgKi8KKworc3RhdGljIGludCBxb3NfbXR0X2JpdHMgPSAweDA3OwkJLyogZGVmYXVsdCBpcyAxIG1zIG9yIG1vcmUgKi8KK21vZHVsZV9wYXJhbShxb3NfbXR0X2JpdHMsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHFvc19tdHRfYml0cywgIklyTEFQIGJpdGZpZWxkIHJlcHJlc2VudGluZyBtaW4tdHVybi10aW1lIik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgdmxzaV9yZWdfZGVidWcodW5zaWduZWQgaW9iYXNlLCBjb25zdCBjaGFyICpzKQoreworCWludAlpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiLCBzKTsKKwlmb3IgKGkgPSAwOyBpIDwgMHgyMDsgaSsrKQorCQlwcmludGsoIiUwMngiLCAodW5zaWduZWQpaW5iKChpb2Jhc2UraSkpKTsKKwlwcmludGsoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHZsc2lfcmluZ19kZWJ1ZyhzdHJ1Y3QgdmxzaV9yaW5nICpyKQoreworCXN0cnVjdCByaW5nX2Rlc2NyICpyZDsKKwl1bnNpZ25lZCBpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzIC0gcmluZyAlcCAvIHNpemUgJXUgLyBtYXNrIDB4JTA0eCAvIGxlbiAldSAvIGRpciAlZCAvIGh3ICVwXG4iLAorCQlfX0ZVTkNUSU9OX18sIHIsIHItPnNpemUsIHItPm1hc2ssIHItPmxlbiwgci0+ZGlyLCByLT5yZFswXS5odyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzIC0gaGVhZCA9ICVkIC8gdGFpbCA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCWF0b21pY19yZWFkKCZyLT5oZWFkKSAmIHItPm1hc2ssIGF0b21pY19yZWFkKCZyLT50YWlsKSAmIHItPm1hc2spOworCWZvciAoaSA9IDA7IGkgPCByLT5zaXplOyBpKyspIHsKKwkJcmQgPSAmci0+cmRbaV07CisJCXByaW50ayhLRVJOX0RFQlVHICIlcyAtIHJpbmcgZGVzY3IgJXU6ICIsIF9fRlVOQ1RJT05fXywgaSk7CisJCXByaW50aygic2tiPSVwIGRhdGE9JXAgaHc9JXBcbiIsIHJkLT5za2IsIHJkLT5idWYsIHJkLT5odyk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlcyAtIGh3OiBzdGF0dXM9JTAyeCBjb3VudD0ldSBhZGRyPTB4JTA4eFxuIiwKKwkJCV9fRlVOQ1RJT05fXywgKHVuc2lnbmVkKSByZF9nZXRfc3RhdHVzKHJkKSwKKwkJCSh1bnNpZ25lZCkgcmRfZ2V0X2NvdW50KHJkKSwgKHVuc2lnbmVkKSByZF9nZXRfYWRkcihyZCkpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBuZWVkZWQgcmVnYXJkbGVzcyBvZiBDT05GSUdfUFJPQ19GUyAqLworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqdmxzaV9wcm9jX3Jvb3QgPSBOVUxMOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworc3RhdGljIHZvaWQgdmxzaV9wcm9jX3BkZXYoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXVuc2lnbmVkIGlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwl1bnNpZ25lZCBpOworCisJc2VxX3ByaW50ZihzZXEsICJcbiVzICh2aWQvZGlkOiAlMDR4LyUwNHgpXG4iLAorCQkgICBQQ0lERVZfTkFNRShwZGV2KSwgKGludClwZGV2LT52ZW5kb3IsIChpbnQpcGRldi0+ZGV2aWNlKTsKKwlzZXFfcHJpbnRmKHNlcSwgInBjaS1wb3dlci1zdGF0ZTogJXVcbiIsICh1bnNpZ25lZCkgcGRldi0+Y3VycmVudF9zdGF0ZSk7CisJc2VxX3ByaW50ZihzZXEsICJyZXNvdXJjZXM6IGlycT0ldSAvIGlvPTB4JTA0eCAvIGRtYV9tYXNrPTB4JTAxNkx4XG4iLAorCQkgICBwZGV2LT5pcnEsICh1bnNpZ25lZClwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksICh1bnNpZ25lZCBsb25nIGxvbmcpcGRldi0+ZG1hX21hc2spOworCXNlcV9wcmludGYoc2VxLCAiaHcgcmVnaXN0ZXJzOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgMHgyMDsgaSsrKQorCQlzZXFfcHJpbnRmKHNlcSwgIiUwMngiLCAodW5zaWduZWQpaW5iKChpb2Jhc2UraSkpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlxuIik7Cit9CisJCQorc3RhdGljIHZvaWQgdmxzaV9wcm9jX25kZXYoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXZsc2lfaXJkYV9kZXZfdCAqaWRldiA9IG5kZXYtPnByaXY7CisJdTggYnl0ZTsKKwl1MTYgd29yZDsKKwl1bnNpZ25lZCBkZWx0YTEsIGRlbHRhMjsKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisJdW5zaWduZWQgaW9iYXNlID0gbmRldi0+YmFzZV9hZGRyOworCisJc2VxX3ByaW50ZihzZXEsICJcbiVzIGxpbmsgc3RhdGU6ICVzIC8gJXMgLyAlcyAvICVzXG4iLCBuZGV2LT5uYW1lLAorCQluZXRpZl9kZXZpY2VfcHJlc2VudChuZGV2KSA/ICJhdHRhY2hlZCIgOiAiZGV0YWNoZWQiLCAKKwkJbmV0aWZfcnVubmluZyhuZGV2KSA/ICJydW5uaW5nIiA6ICJub3QgcnVubmluZyIsCisJCW5ldGlmX2NhcnJpZXJfb2sobmRldikgPyAiY2FycmllciBvayIgOiAibm8gY2FycmllciIsCisJCW5ldGlmX3F1ZXVlX3N0b3BwZWQobmRldikgPyAicXVldWUgc3RvcHBlZCIgOiAicXVldWUgcnVubmluZyIpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKG5kZXYpKQorCQlyZXR1cm47CisKKwlzZXFfcHJpbnRmKHNlcSwgIlxuaHctc3RhdGU6XG4iKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShpZGV2LT5wZGV2LCBWTFNJX1BDSV9JUk1JU0MsICZieXRlKTsKKwlzZXFfcHJpbnRmKHNlcSwgIklSTUlTQzolcyVzJXMgdWFydCVzIiwKKwkJKGJ5dGUmSVJNSVNDX0lSUkFJTCkgPyAiIGlycmFpbCIgOiAiIiwKKwkJKGJ5dGUmSVJNSVNDX0lSUEQpID8gIiBpcnBkIiA6ICIiLAorCQkoYnl0ZSZJUk1JU0NfVUFSVFRTVCkgPyAiIHVhcnR0ZXN0IiA6ICIiLAorCQkoYnl0ZSZJUk1JU0NfVUFSVEVOKSA/ICJAIiA6ICIgZGlzYWJsZWRcbiIpOworCWlmIChieXRlJklSTUlTQ19VQVJURU4pIHsKKwkJc2VxX3ByaW50ZihzZXEsICIweCVzXG4iLAorCQkJKGJ5dGUmMikgPyAoKGJ5dGUmMSkgPyAiM2U4IiA6ICIyZTgiKQorCQkJCSA6ICgoYnl0ZSYxKSA/ICIzZjgiIDogIjJmOCIpKTsKKwl9CisJcGNpX3JlYWRfY29uZmlnX2J5dGUoaWRldi0+cGRldiwgVkxTSV9QQ0lfQ0xLQ1RMLCAmYnl0ZSk7CisJc2VxX3ByaW50ZihzZXEsICJDTEtDVEw6IFBMTCAlcyVzJXMgLyBjbG9jayAlcyAvIHdha2V1cCAlc1xuIiwKKwkJKGJ5dGUmQ0xLQ1RMX1BEX0lOVikgPyAicG93ZXJlZCIgOiAiZG93biIsCisJCShieXRlJkNMS0NUTF9MT0NLKSA/ICIgbG9ja2VkIiA6ICIiLAorCQkoYnl0ZSZDTEtDVExfRVhUQ0xLKSA/ICgoYnl0ZSZDTEtDVExfWENLU0VMKT8iIC8gNDAgTUh6IFhDTEsiOiIgLyA0OCBNSHogWENMSyIpIDogIiIsCisJCShieXRlJkNMS0NUTF9DTEtTVFApID8gInN0b3BwZWQiIDogInJ1bm5pbmciLAorCQkoYnl0ZSZDTEtDVExfV0FLRSkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShpZGV2LT5wZGV2LCBWTFNJX1BDSV9NU1RSUEFHRSwgJmJ5dGUpOworCXNlcV9wcmludGYoc2VxLCAiTVNUUlBBR0U6IDB4JTAyeFxuIiwgKHVuc2lnbmVkKWJ5dGUpOworCisJYnl0ZSA9IGluYihpb2Jhc2UrVkxTSV9QSU9fSVJJTlRSKTsKKwlzZXFfcHJpbnRmKHNlcSwgIklSSU5UUjolcyVzJXMlcyVzJXMlcyVzXG4iLAorCQkoYnl0ZSZJUklOVFJfQUNURU4pID8gIiBBQ1RFTiIgOiAiIiwKKwkJKGJ5dGUmSVJJTlRSX1JQS1RFTikgPyAiIFJQS1RFTiIgOiAiIiwKKwkJKGJ5dGUmSVJJTlRSX1RQS1RFTikgPyAiIFRQS1RFTiIgOiAiIiwKKwkJKGJ5dGUmSVJJTlRSX09FX0VOKSA/ICIgT0VfRU4iIDogIiIsCisJCShieXRlJklSSU5UUl9BQ1RJVklUWSkgPyAiIEFDVElWSVRZIiA6ICIiLAorCQkoYnl0ZSZJUklOVFJfUlBLVElOVCkgPyAiIFJQS1RJTlQiIDogIiIsCisJCShieXRlJklSSU5UUl9UUEtUSU5UKSA/ICIgVFBLVElOVCIgOiAiIiwKKwkJKGJ5dGUmSVJJTlRSX09FX0lOVCkgPyAiIE9FX0lOVCIgOiAiIik7CisJd29yZCA9IGludyhpb2Jhc2UrVkxTSV9QSU9fUklOR1BUUik7CisJc2VxX3ByaW50ZihzZXEsICJSSU5HUFRSOiByeD0ldSAvIHR4PSV1XG4iLCBSSU5HUFRSX0dFVF9SWCh3b3JkKSwgUklOR1BUUl9HRVRfVFgod29yZCkpOworCXdvcmQgPSBpbncoaW9iYXNlK1ZMU0lfUElPX1JJTkdCQVNFKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlJJTkdCQVNFOiBidXNtYXA9MHglMDh4XG4iLAorCQkoKHVuc2lnbmVkKXdvcmQgPDwgMTApfChNU1RSUEFHRV9WQUxVRTw8MjQpKTsKKwl3b3JkID0gaW53KGlvYmFzZStWTFNJX1BJT19SSU5HU0laRSk7CisJc2VxX3ByaW50ZihzZXEsICJSSU5HU0laRTogcng9JXUgLyB0eD0ldVxuIiwgUklOR1NJWkVfVE9fUlhTSVpFKHdvcmQpLAorCQlSSU5HU0laRV9UT19UWFNJWkUod29yZCkpOworCisJd29yZCA9IGludyhpb2Jhc2UrVkxTSV9QSU9fSVJDRkcpOworCXNlcV9wcmludGYoc2VxLCAiSVJDRkc6JXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXNcbiIsCisJCSh3b3JkJklSQ0ZHX0xPT1ApID8gIiBMT09QIiA6ICIiLAorCQkod29yZCZJUkNGR19FTlRYKSA/ICIgRU5UWCIgOiAiIiwKKwkJKHdvcmQmSVJDRkdfRU5SWCkgPyAiIEVOUlgiIDogIiIsCisJCSh3b3JkJklSQ0ZHX01TVFIpID8gIiBNU1RSIiA6ICIiLAorCQkod29yZCZJUkNGR19SWEFOWSkgPyAiIFJYQU5ZIiA6ICIiLAorCQkod29yZCZJUkNGR19DUkMxNikgPyAiIENSQzE2IiA6ICIiLAorCQkod29yZCZJUkNGR19GSVIpID8gIiBGSVIiIDogIiIsCisJCSh3b3JkJklSQ0ZHX01JUikgPyAiIE1JUiIgOiAiIiwKKwkJKHdvcmQmSVJDRkdfU0lSKSA/ICIgU0lSIiA6ICIiLAorCQkod29yZCZJUkNGR19TSVJGSUxUKSA/ICIgU0lSRklMVCIgOiAiIiwKKwkJKHdvcmQmSVJDRkdfU0lSVEVTVCkgPyAiIFNJUlRFU1QiIDogIiIsCisJCSh3b3JkJklSQ0ZHX1RYUE9MKSA/ICIgVFhQT0wiIDogIiIsCisJCSh3b3JkJklSQ0ZHX1JYUE9MKSA/ICIgUlhQT0wiIDogIiIpOworCXdvcmQgPSBpbncoaW9iYXNlK1ZMU0lfUElPX0lSRU5BQkxFKTsKKwlzZXFfcHJpbnRmKHNlcSwgIklSRU5BQkxFOiVzJXMlcyVzJXMlcyVzJXNcbiIsCisJCSh3b3JkJklSRU5BQkxFX1BIWUFORENMT0NLKSA/ICIgUEhZQU5EQ0xPQ0siIDogIiIsCisJCSh3b3JkJklSRU5BQkxFX0NGR0VSKSA/ICIgQ0ZHRVJSIiA6ICIiLAorCQkod29yZCZJUkVOQUJMRV9GSVJfT04pID8gIiBGSVJfT04iIDogIiIsCisJCSh3b3JkJklSRU5BQkxFX01JUl9PTikgPyAiIE1JUl9PTiIgOiAiIiwKKwkJKHdvcmQmSVJFTkFCTEVfU0lSX09OKSA/ICIgU0lSX09OIiA6ICIiLAorCQkod29yZCZJUkVOQUJMRV9FTlRYU1QpID8gIiBFTlRYU1QiIDogIiIsCisJCSh3b3JkJklSRU5BQkxFX0VOUlhTVCkgPyAiIEVOUlhTVCIgOiAiIiwKKwkJKHdvcmQmSVJFTkFCTEVfQ1JDMTZfT04pID8gIiBDUkMxNl9PTiIgOiAiIik7CisJd29yZCA9IGludyhpb2Jhc2UrVkxTSV9QSU9fUEhZQ1RMKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlBIWUNUTDogYmF1ZC1kaXZpc29yPSV1IC8gcHVsc2V3aWR0aD0ldSAvIHByZWFtYmxlPSV1XG4iLAorCQkodW5zaWduZWQpUEhZQ1RMX1RPX0JBVUQod29yZCksCisJCSh1bnNpZ25lZClQSFlDVExfVE9fUExTV0lEKHdvcmQpLAorCQkodW5zaWduZWQpUEhZQ1RMX1RPX1BSRUFNQih3b3JkKSk7CisJd29yZCA9IGludyhpb2Jhc2UrVkxTSV9QSU9fTlBIWUNUTCk7CisJc2VxX3ByaW50ZihzZXEsICJOUEhZQ1RMOiBiYXVkLWRpdmlzb3I9JXUgLyBwdWxzZXdpZHRoPSV1IC8gcHJlYW1ibGU9JXVcbiIsCisJCSh1bnNpZ25lZClQSFlDVExfVE9fQkFVRCh3b3JkKSwKKwkJKHVuc2lnbmVkKVBIWUNUTF9UT19QTFNXSUQod29yZCksCisJCSh1bnNpZ25lZClQSFlDVExfVE9fUFJFQU1CKHdvcmQpKTsKKwl3b3JkID0gaW53KGlvYmFzZStWTFNJX1BJT19NQVhQS1QpOworCXNlcV9wcmludGYoc2VxLCAiTUFYUEtUOiBtYXguIHJ4IHBhY2tldCBzaXplID0gJXVcbiIsIHdvcmQpOworCXdvcmQgPSBpbncoaW9iYXNlK1ZMU0lfUElPX1JDVkJDTlQpICYgUkNWQkNOVF9NQVNLOworCXNlcV9wcmludGYoc2VxLCAiUkNWQkNOVDogcngtZmlmbyBmaWxsaW5nIGxldmVsID0gJXVcbiIsIHdvcmQpOworCisJc2VxX3ByaW50ZihzZXEsICJcbnN3LXN0YXRlOlxuIik7CisJc2VxX3ByaW50ZihzZXEsICJJclBIWSBzZXR1cDogJWQgYmF1ZCAtICVzIGVuY29kaW5nXG4iLCBpZGV2LT5iYXVkLCAKKwkJKGlkZXYtPm1vZGU9PUlGRl9TSVIpPyJTSVIiOigoaWRldi0+bW9kZT09SUZGX01JUik/Ik1JUiI6IkZJUiIpKTsKKwlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7CisJaWYgKG5vdy50dl91c2VjID49IGlkZXYtPmxhc3RfcngudHZfdXNlYykgeworCQlkZWx0YTIgPSBub3cudHZfdXNlYyAtIGlkZXYtPmxhc3RfcngudHZfdXNlYzsKKwkJZGVsdGExID0gMDsKKwl9CisJZWxzZSB7CisJCWRlbHRhMiA9IDEwMDAwMDAgKyBub3cudHZfdXNlYyAtIGlkZXYtPmxhc3RfcngudHZfdXNlYzsKKwkJZGVsdGExID0gMTsKKwl9CisJc2VxX3ByaW50ZihzZXEsICJsYXN0IHJ4OiAlbHUuJTA2dSBzZWNcbiIsCisJCW5vdy50dl9zZWMgLSBpZGV2LT5sYXN0X3J4LnR2X3NlYyAtIGRlbHRhMSwgZGVsdGEyKTsJCisKKwlzZXFfcHJpbnRmKHNlcSwgIlJYOiBwYWNrZXRzPSVsdSAvIGJ5dGVzPSVsdSAvIGVycm9ycz0lbHUgLyBkcm9wcGVkPSVsdSIsCisJCWlkZXYtPnN0YXRzLnJ4X3BhY2tldHMsIGlkZXYtPnN0YXRzLnJ4X2J5dGVzLCBpZGV2LT5zdGF0cy5yeF9lcnJvcnMsCisJCWlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQpOworCXNlcV9wcmludGYoc2VxLCAiIC8gb3ZlcnJ1bj0lbHUgLyBsZW5ndGg9JWx1IC8gZnJhbWU9JWx1IC8gY3JjPSVsdVxuIiwKKwkJaWRldi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMsIGlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMsCisJCWlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycywgaWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycyk7CisJc2VxX3ByaW50ZihzZXEsICJUWDogcGFja2V0cz0lbHUgLyBieXRlcz0lbHUgLyBlcnJvcnM9JWx1IC8gZHJvcHBlZD0lbHUgLyBmaWZvPSVsdVxuIiwKKwkJaWRldi0+c3RhdHMudHhfcGFja2V0cywgaWRldi0+c3RhdHMudHhfYnl0ZXMsIGlkZXYtPnN0YXRzLnR4X2Vycm9ycywKKwkJaWRldi0+c3RhdHMudHhfZHJvcHBlZCwgaWRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMpOworCit9CisJCQorc3RhdGljIHZvaWQgdmxzaV9wcm9jX3Jpbmcoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCB2bHNpX3JpbmcgKnIpCit7CisJc3RydWN0IHJpbmdfZGVzY3IgKnJkOworCXVuc2lnbmVkIGksIGo7CisJaW50IGgsIHQ7CisKKwlzZXFfcHJpbnRmKHNlcSwgInNpemUgJXUgLyBtYXNrIDB4JTA0eCAvIGxlbiAldSAvIGRpciAlZCAvIGh3ICVwXG4iLAorCQlyLT5zaXplLCByLT5tYXNrLCByLT5sZW4sIHItPmRpciwgci0+cmRbMF0uaHcpOworCWggPSBhdG9taWNfcmVhZCgmci0+aGVhZCkgJiByLT5tYXNrOworCXQgPSBhdG9taWNfcmVhZCgmci0+dGFpbCkgJiByLT5tYXNrOworCXNlcV9wcmludGYoc2VxLCAiaGVhZCA9ICVkIC8gdGFpbCA9ICVkICIsIGgsIHQpOworCWlmIChoID09IHQpCisJCXNlcV9wcmludGYoc2VxLCAiKGVtcHR5KVxuIik7CisJZWxzZSB7CisJCWlmICgoKHQrMSkmci0+bWFzaykgPT0gaCkKKwkJCXNlcV9wcmludGYoc2VxLCAiKGZ1bGwpXG4iKTsKKwkJZWxzZQorCQkJc2VxX3ByaW50ZihzZXEsICIobGV2ZWwgPSAlZClcbiIsICgodW5zaWduZWQpKHQtaCkgJiByLT5tYXNrKSk7IAorCQlyZCA9ICZyLT5yZFtoXTsKKwkJaiA9ICh1bnNpZ25lZCkgcmRfZ2V0X2NvdW50KHJkKTsKKwkJc2VxX3ByaW50ZihzZXEsICJjdXJyZW50OiByZCA9ICVkIC8gc3RhdHVzID0gJTAyeCAvIGxlbiA9ICV1XG4iLAorCQkJCWgsICh1bnNpZ25lZClyZF9nZXRfc3RhdHVzKHJkKSwgaik7CisJCWlmIChqID4gMCkgeworCQkJc2VxX3ByaW50ZihzZXEsICIgICBkYXRhOiIpOworCQkJaWYgKGogPiAyMCkKKwkJCQlqID0gMjA7CisJCQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKQorCQkJCXNlcV9wcmludGYoc2VxLCAiICUwMngiLCAodW5zaWduZWQpKCh1bnNpZ25lZCBjaGFyICopcmQtPmJ1ZilbaV0pOworCQkJc2VxX3ByaW50ZihzZXEsICJcbiIpOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCByLT5zaXplOyBpKyspIHsKKwkJcmQgPSAmci0+cmRbaV07CisJCXNlcV9wcmludGYoc2VxLCAiPiByaW5nIGRlc2NyICV1OiAiLCBpKTsKKwkJc2VxX3ByaW50ZihzZXEsICJza2I9JXAgZGF0YT0lcCBodz0lcFxuIiwgcmQtPnNrYiwgcmQtPmJ1ZiwgcmQtPmh3KTsKKwkJc2VxX3ByaW50ZihzZXEsICIgIGh3OiBzdGF0dXM9JTAyeCBjb3VudD0ldSBidXNhZGRyPTB4JTA4eFxuIiwKKwkJCSh1bnNpZ25lZCkgcmRfZ2V0X3N0YXR1cyhyZCksCisJCQkodW5zaWduZWQpIHJkX2dldF9jb3VudChyZCksICh1bnNpZ25lZCkgcmRfZ2V0X2FkZHIocmQpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdmxzaV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHNlcS0+cHJpdmF0ZTsKKwl2bHNpX2lyZGFfZGV2X3QgKmlkZXYgPSBuZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzZXFfcHJpbnRmKHNlcSwgIlxuJXMgJXNcblxuIiwgRFJJVkVSX05BTUUsIERSSVZFUl9WRVJTSU9OKTsKKwlzZXFfcHJpbnRmKHNlcSwgImNsa3NyYzogJXNcbiIsIAorCQkoY2xrc3JjPj0yKSA/ICgoY2xrc3JjPT0zKT8iNDBNSHogWENMSyI6IjQ4TUh6IFhDTEsiKQorCQkJICAgIDogKChjbGtzcmM9PTEpPyI0OE1IeiBQTEwiOiJhdXRvZGV0ZWN0IikpOworCXNlcV9wcmludGYoc2VxLCAicmluZ3NpemU6IHR4PSVkIC8gcng9JWRcbiIsCisJCXJpbmdzaXplWzBdLCByaW5nc2l6ZVsxXSk7CisJc2VxX3ByaW50ZihzZXEsICJzaXJwdWxzZTogJXNcbiIsIChzaXJwdWxzZSk/IjMvMTYgYml0dGltZSI6InNob3J0Iik7CisJc2VxX3ByaW50ZihzZXEsICJxb3NfbXR0X2JpdHM6IDB4JTAyeFxuIiwgKHVuc2lnbmVkKXFvc19tdHRfYml0cyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWRldi0+bG9jaywgZmxhZ3MpOworCWlmIChpZGV2LT5wZGV2ICE9IE5VTEwpIHsKKwkJdmxzaV9wcm9jX3BkZXYoc2VxLCBpZGV2LT5wZGV2KTsKKworCQlpZiAoaWRldi0+cGRldi0+Y3VycmVudF9zdGF0ZSA9PSAwKQorCQkJdmxzaV9wcm9jX25kZXYoc2VxLCBuZGV2KTsKKwkJZWxzZQorCQkJc2VxX3ByaW50ZihzZXEsICJcblBDSSBjb250cm9sbGVyIGRvd24gLSByZXN1bWVfb2sgPSAlZFxuIiwKKwkJCQlpZGV2LT5yZXN1bWVfb2spOworCQlpZiAobmV0aWZfcnVubmluZyhuZGV2KSAmJiBpZGV2LT5yeF9yaW5nICYmIGlkZXYtPnR4X3JpbmcpIHsKKwkJCXNlcV9wcmludGYoc2VxLCAiXG4tLS0tLS0tLS0gUlggcmluZyAtLS0tLS0tLS0tLVxuXG4iKTsKKwkJCXZsc2lfcHJvY19yaW5nKHNlcSwgaWRldi0+cnhfcmluZyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIlxuLS0tLS0tLS0tIFRYIHJpbmcgLS0tLS0tLS0tLS1cblxuIik7CisJCQl2bHNpX3Byb2NfcmluZyhzZXEsIGlkZXYtPnR4X3JpbmcpOworCQl9CisJfQorCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGV2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bHNpX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCB2bHNpX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmxzaV9wcm9jX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vcGVuICAgID0gdmxzaV9zZXFfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCisjZGVmaW5lIFZMU0lfUFJPQ19GT1BTCQkoJnZsc2lfcHJvY19mb3BzKQorCisjZWxzZQkvKiBDT05GSUdfUFJPQ19GUyAqLworI2RlZmluZSBWTFNJX1BST0NfRk9QUwkJTlVMTAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCB2bHNpX3JpbmcgKnZsc2lfYWxsb2NfcmluZyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHJpbmdfZGVzY3JfaHcgKmh3bWFwLAorCQkJCQkJdW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgbGVuLCBpbnQgZGlyKQoreworCXN0cnVjdCB2bHNpX3JpbmcgKnI7CisJc3RydWN0IHJpbmdfZGVzY3IgKnJkOworCXVuc2lnbmVkCWksIGo7CisJZG1hX2FkZHJfdAlidXNhZGRyOworCisJaWYgKCFzaXplICB8fCAgKChzaXplLTEpJnNpemUpIT0wKQkvKiBtdXN0IGJlID4wIGFuZCBwb3dlciBvZiAyICovCisJCXJldHVybiBOVUxMOworCisJciA9IGttYWxsb2Moc2l6ZW9mKCpyKSArIHNpemUgKiBzaXplb2Yoc3RydWN0IHJpbmdfZGVzY3IpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXIpCisJCXJldHVybiBOVUxMOworCW1lbXNldChyLCAwLCBzaXplb2YoKnIpKTsKKworCXItPnBkZXYgPSBwZGV2OworCXItPmRpciA9IGRpcjsKKwlyLT5sZW4gPSBsZW47CisJci0+cmQgPSAoc3RydWN0IHJpbmdfZGVzY3IgKikocisxKTsKKwlyLT5tYXNrID0gc2l6ZSAtIDE7CisJci0+c2l6ZSA9IHNpemU7CisJYXRvbWljX3NldCgmci0+aGVhZCwgMCk7CisJYXRvbWljX3NldCgmci0+dGFpbCwgMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCXJkID0gci0+cmQgKyBpOworCQltZW1zZXQocmQsIDAsIHNpemVvZigqcmQpKTsKKwkJcmQtPmh3ID0gaHdtYXAgKyBpOworCQlyZC0+YnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUx8R0ZQX0RNQSk7CisJCWlmIChyZC0+YnVmID09IE5VTEwKKwkJICAgIHx8ICAhKGJ1c2FkZHIgPSBwY2lfbWFwX3NpbmdsZShwZGV2LCByZC0+YnVmLCBsZW4sIGRpcikpKSB7CisJCQlpZiAocmQtPmJ1ZikgeworCQkJCUlSREFfRVJST1IoIiVzOiBmYWlsZWQgdG8gY3JlYXRlIFBDSS1NQVAgZm9yICVwIiwKKwkJCQkJICAgX19GVU5DVElPTl9fLCByZC0+YnVmKTsKKwkJCQlrZnJlZShyZC0+YnVmKTsKKwkJCQlyZC0+YnVmID0gTlVMTDsKKwkJCX0KKwkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJCQlyZCA9IHItPnJkICsgajsKKwkJCQlidXNhZGRyID0gcmRfZ2V0X2FkZHIocmQpOworCQkJCXJkX3NldF9hZGRyX3N0YXR1cyhyZCwgMCwgMCk7CisJCQkJaWYgKGJ1c2FkZHIpCisJCQkJCXBjaV91bm1hcF9zaW5nbGUocGRldiwgYnVzYWRkciwgbGVuLCBkaXIpOworCQkJCWtmcmVlKHJkLT5idWYpOworCQkJCXJkLT5idWYgPSBOVUxMOworCQkJfQorCQkJa2ZyZWUocik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlyZF9zZXRfYWRkcl9zdGF0dXMocmQsIGJ1c2FkZHIsIDApOworCQkvKiBpbml0aWFsbHksIHRoZSBkbWEgYnVmZmVyIGlzIG93bmVkIGJ5IHRoZSBDUFUgKi8KKwkJcmQtPnNrYiA9IE5VTEw7CisJfQorCXJldHVybiByOworfQorCitzdGF0aWMgaW50IHZsc2lfZnJlZV9yaW5nKHN0cnVjdCB2bHNpX3JpbmcgKnIpCit7CisJc3RydWN0IHJpbmdfZGVzY3IgKnJkOworCXVuc2lnbmVkCWk7CisJZG1hX2FkZHJfdAlidXNhZGRyOworCisJZm9yIChpID0gMDsgaSA8IHItPnNpemU7IGkrKykgeworCQlyZCA9IHItPnJkICsgaTsKKwkJaWYgKHJkLT5za2IpCisJCQlkZXZfa2ZyZWVfc2tiX2FueShyZC0+c2tiKTsKKwkJYnVzYWRkciA9IHJkX2dldF9hZGRyKHJkKTsKKwkJcmRfc2V0X2FkZHJfc3RhdHVzKHJkLCAwLCAwKTsKKwkJaWYgKGJ1c2FkZHIpCisJCQlwY2lfdW5tYXBfc2luZ2xlKHItPnBkZXYsIGJ1c2FkZHIsIHItPmxlbiwgci0+ZGlyKTsKKwkJaWYgKHJkLT5idWYpCisJCQlrZnJlZShyZC0+YnVmKTsKKwl9CisJa2ZyZWUocik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmxzaV9jcmVhdGVfaHdpZih2bHNpX2lyZGFfZGV2X3QgKmlkZXYpCit7CisJY2hhciAJCQkqcmluZ2FyZWE7CisJc3RydWN0IHJpbmdfZGVzY3JfaHcJKmh3bWFwOworCisJaWRldi0+dmlydGFkZHIgPSBOVUxMOworCWlkZXYtPmJ1c2FkZHIgPSAwOworCisJcmluZ2FyZWEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChpZGV2LT5wZGV2LCBIV19SSU5HX0FSRUFfU0laRSwgJmlkZXYtPmJ1c2FkZHIpOworCWlmICghcmluZ2FyZWEpIHsKKwkJSVJEQV9FUlJPUigiJXM6IGluc3VmZmljaWVudCBtZW1vcnkgZm9yIGRlc2NyaXB0b3IgcmluZ3NcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dDsKKwl9CisJbWVtc2V0KHJpbmdhcmVhLCAwLCBIV19SSU5HX0FSRUFfU0laRSk7CisKKwlod21hcCA9IChzdHJ1Y3QgcmluZ19kZXNjcl9odyAqKXJpbmdhcmVhOworCWlkZXYtPnJ4X3JpbmcgPSB2bHNpX2FsbG9jX3JpbmcoaWRldi0+cGRldiwgaHdtYXAsIHJpbmdzaXplWzFdLAorCQkJCQlYRkVSX0JVRl9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCWlmIChpZGV2LT5yeF9yaW5nID09IE5VTEwpCisJCWdvdG8gb3V0X3VubWFwOworCisJaHdtYXAgKz0gTUFYX1JJTkdfREVTQ1I7CisJaWRldi0+dHhfcmluZyA9IHZsc2lfYWxsb2NfcmluZyhpZGV2LT5wZGV2LCBod21hcCwgcmluZ3NpemVbMF0sCisJCQkJCVhGRVJfQlVGX1NJWkUsIFBDSV9ETUFfVE9ERVZJQ0UpOworCWlmIChpZGV2LT50eF9yaW5nID09IE5VTEwpCisJCWdvdG8gb3V0X2ZyZWVfcng7CisKKwlpZGV2LT52aXJ0YWRkciA9IHJpbmdhcmVhOworCXJldHVybiAwOworCitvdXRfZnJlZV9yeDoKKwl2bHNpX2ZyZWVfcmluZyhpZGV2LT5yeF9yaW5nKTsKK291dF91bm1hcDoKKwlpZGV2LT5yeF9yaW5nID0gaWRldi0+dHhfcmluZyA9IE5VTEw7CisJcGNpX2ZyZWVfY29uc2lzdGVudChpZGV2LT5wZGV2LCBIV19SSU5HX0FSRUFfU0laRSwgcmluZ2FyZWEsIGlkZXYtPmJ1c2FkZHIpOworCWlkZXYtPmJ1c2FkZHIgPSAwOworb3V0OgorCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgaW50IHZsc2lfZGVzdHJveV9od2lmKHZsc2lfaXJkYV9kZXZfdCAqaWRldikKK3sKKwl2bHNpX2ZyZWVfcmluZyhpZGV2LT5yeF9yaW5nKTsKKwl2bHNpX2ZyZWVfcmluZyhpZGV2LT50eF9yaW5nKTsKKwlpZGV2LT5yeF9yaW5nID0gaWRldi0+dHhfcmluZyA9IE5VTEw7CisKKwlpZiAoaWRldi0+YnVzYWRkcikKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChpZGV2LT5wZGV2LEhXX1JJTkdfQVJFQV9TSVpFLGlkZXYtPnZpcnRhZGRyLGlkZXYtPmJ1c2FkZHIpOworCisJaWRldi0+dmlydGFkZHIgPSBOVUxMOworCWlkZXYtPmJ1c2FkZHIgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCB2bHNpX3Byb2Nlc3Nfcngoc3RydWN0IHZsc2lfcmluZyAqciwgc3RydWN0IHJpbmdfZGVzY3IgKnJkKQoreworCXUxNgkJc3RhdHVzOworCWludAkJY3JjbGVuLCBsZW4gPSAwOworCXN0cnVjdCBza19idWZmCSpza2I7CisJaW50CQlyZXQgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopcGNpX2dldF9kcnZkYXRhKHItPnBkZXYpOworCXZsc2lfaXJkYV9kZXZfdCAqaWRldiA9IG5kZXYtPnByaXY7CisKKwlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoci0+cGRldiwgcmRfZ2V0X2FkZHIocmQpLCByLT5sZW4sIHItPmRpcik7CisJLyogZG1hIGJ1ZmZlciBub3cgb3duZWQgYnkgdGhlIENQVSAqLworCXN0YXR1cyA9IHJkX2dldF9zdGF0dXMocmQpOworCWlmIChzdGF0dXMgJiBSRF9SWF9FUlJPUikgeworCQlpZiAoc3RhdHVzICYgUkRfUlhfT1ZFUikgIAorCQkJcmV0IHw9IFZMU0lfUlhfT1ZFUjsKKwkJaWYgKHN0YXR1cyAmIFJEX1JYX0xFTkdUSCkgIAorCQkJcmV0IHw9IFZMU0lfUlhfTEVOR1RIOworCQlpZiAoc3RhdHVzICYgUkRfUlhfUEhZRVJSKSAgCisJCQlyZXQgfD0gVkxTSV9SWF9GUkFNRTsKKwkJaWYgKHN0YXR1cyAmIFJEX1JYX0NSQ0VSUikgIAorCQkJcmV0IHw9IFZMU0lfUlhfQ1JDOworCQlnb3RvIGRvbmU7CisJfQorCisJbGVuID0gcmRfZ2V0X2NvdW50KHJkKTsKKwljcmNsZW4gPSAoaWRldi0+bW9kZT09SUZGX0ZJUikgPyBzaXplb2YodTMyKSA6IHNpemVvZih1MTYpOworCWxlbiAtPSBjcmNsZW47CQkvKiByZW1vdmUgdHJhaWxpbmcgQ1JDICovCisJaWYgKGxlbiA8PSAwKSB7CisJCUlSREFfREVCVUcoMCwgIiVzOiBzdHJhbmdlIGZyYW1lIChsZW49JWQpXG4iLCBfX0ZVTkNUSU9OX18sIGxlbik7CisJCXJldCB8PSBWTFNJX1JYX0RST1A7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoaWRldi0+bW9kZSA9PSBJRkZfU0lSKSB7CS8qIGh3IGNoZWNrcyBDUkMgaW4gTUlSLCBGSVIgbW9kZSAqLworCisJCS8qIHJkLT5idWYgaXMgYSBzdHJlYW1pbmcgUENJX0RNQV9GUk9NREVWSUNFIG1hcC4gRG9pbmcgdGhlCisJCSAqIGVuZGlhbi1hZGp1c3RtZW50IHRoZXJlIGp1c3QgaW4gcGxhY2Ugd2lsbCBkaXJ0eSBhIGNhY2hlIGxpbmUKKwkJICogd2hpY2ggYmVsb25ncyB0byB0aGUgbWFwIGFuZCB0aHVzIHdlIG11c3QgYmUgc3VyZSBpdCB3aWxsCisJCSAqIGdldCBmbHVzaGVkIGJlZm9yZSBnaXZpbmcgdGhlIGJ1ZmZlciBiYWNrIHRvIGhhcmR3YXJlLgorCQkgKiB2bHNpX2ZpbGxfcngoKSB3aWxsIGRvIHRoaXMgYW55d2F5IC0gYnV0IGhlcmUgd2UgcmVseSBvbi4KKwkJICovCisJCWxlMTZfdG9fY3B1cyhyZC0+YnVmK2xlbik7CisJCWlmIChpcmRhX2NhbGNfY3JjMTYoSU5JVF9GQ1MscmQtPmJ1ZixsZW4rY3JjbGVuKSAhPSBHT09EX0ZDUykgeworCQkJSVJEQV9ERUJVRygwLCAiJXM6IGNyYyBlcnJvclxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldCB8PSBWTFNJX1JYX0NSQzsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCWlmICghcmQtPnNrYikgeworCQlJUkRBX1dBUk5JTkcoIiVzOiByeCBwYWNrZXQgbG9zdFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0IHw9IFZMU0lfUlhfRFJPUDsKKwkJZ290byBkb25lOworCX0KKworCXNrYiA9IHJkLT5za2I7CisJcmQtPnNrYiA9IE5VTEw7CisJc2tiLT5kZXYgPSBuZGV2OworCW1lbWNweShza2JfcHV0KHNrYixsZW4pLCByZC0+YnVmLCBsZW4pOworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCW5ldGlmX3J4KHNrYik7CisJZWxzZQorCQluZXRpZl9yeF9uaShza2IpOworCW5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCitkb25lOgorCXJkX3NldF9zdGF0dXMocmQsIDApOworCXJkX3NldF9jb3VudChyZCwgMCk7CisJLyogYnVmZmVyIHN0aWxsIG93bmVkIGJ5IENQVSAqLworCisJcmV0dXJuIChyZXQpID8gLXJldCA6IGxlbjsKK30KKworc3RhdGljIHZvaWQgdmxzaV9maWxsX3J4KHN0cnVjdCB2bHNpX3JpbmcgKnIpCit7CisJc3RydWN0IHJpbmdfZGVzY3IgKnJkOworCisJZm9yIChyZCA9IHJpbmdfbGFzdChyKTsgcmQgIT0gTlVMTDsgcmQgPSByaW5nX3B1dChyKSkgeworCQlpZiAocmRfaXNfYWN0aXZlKHJkKSkgeworCQkJSVJEQV9XQVJOSU5HKCIlczogZHJpdmVyIGJ1ZzogcnggZGVzY3IgcmFjZSB3aXRoIGh3XG4iLAorCQkJCSAgICAgX19GVU5DVElPTl9fKTsKKwkJCXZsc2lfcmluZ19kZWJ1ZyhyKTsKKwkJCWJyZWFrOworCQl9CisJCWlmICghcmQtPnNrYikgeworCQkJcmQtPnNrYiA9IGRldl9hbGxvY19za2IoSVJMQVBfU0tCX0FMTE9DU0laRSk7CisJCQlpZiAocmQtPnNrYikgeworCQkJCXNrYl9yZXNlcnZlKHJkLT5za2IsMSk7CisJCQkJcmQtPnNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUkRBKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlicmVhazsJLyogcHJvYmFibHkgbm90IHdvcnRoIGxvZ2dpbmc/ICovCisJCX0KKwkJLyogZ2l2ZSBkbWEgYnVmZmVyIGJhY2sgdG8gYnVzbWFzdGVyICovCisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShyLT5wZGV2LCByZF9nZXRfYWRkcihyZCksIHItPmxlbiwgci0+ZGlyKTsKKwkJcmRfYWN0aXZhdGUocmQpOworCX0KK30KKworc3RhdGljIHZvaWQgdmxzaV9yeF9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJdmxzaV9pcmRhX2Rldl90ICppZGV2ID0gbmRldi0+cHJpdjsKKwlzdHJ1Y3QgdmxzaV9yaW5nICpyID0gaWRldi0+cnhfcmluZzsKKwlzdHJ1Y3QgcmluZ19kZXNjciAqcmQ7CisJaW50IHJldDsKKworCWZvciAocmQgPSByaW5nX2ZpcnN0KHIpOyByZCAhPSBOVUxMOyByZCA9IHJpbmdfZ2V0KHIpKSB7CisKKwkJaWYgKHJkX2lzX2FjdGl2ZShyZCkpCisJCQlicmVhazsKKworCQlyZXQgPSB2bHNpX3Byb2Nlc3NfcngociwgcmQpOworCisJCWlmIChyZXQgPCAwKSB7CisJCQlyZXQgPSAtcmV0OworCQkJaWRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAocmV0ICYgVkxTSV9SWF9EUk9QKSAgCisJCQkJaWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJaWYgKHJldCAmIFZMU0lfUlhfT1ZFUikgIAorCQkJCWlkZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAocmV0ICYgVkxTSV9SWF9MRU5HVEgpICAKKwkJCQlpZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpZiAocmV0ICYgVkxTSV9SWF9GUkFNRSkgIAorCQkJCWlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKHJldCAmIFZMU0lfUlhfQ1JDKSAgCisJCQkJaWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQl9CisJCWVsc2UgaWYgKHJldCA+IDApIHsKKwkJCWlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCWlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHJldDsKKwkJfQorCX0KKworCWRvX2dldHRpbWVvZmRheSgmaWRldi0+bGFzdF9yeCk7IC8qIHJlbWVtYmVyICJub3ciIGZvciBsYXRlciBtdHQgZGVsYXkgKi8KKworCXZsc2lfZmlsbF9yeChyKTsKKworCWlmIChyaW5nX2ZpcnN0KHIpID09IE5VTEwpIHsKKwkJLyogd2UgYXJlIGluIGJpZyB0cm91YmxlLCBpZiB0aGlzIHNob3VsZCBldmVyIGhhcHBlbiAqLworCQlJUkRBX0VSUk9SKCIlczogcnggcmluZyBleGhhdXN0ZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQl2bHNpX3JpbmdfZGVidWcocik7CisJfQorCWVsc2UKKwkJb3V0dygwLCBuZGV2LT5iYXNlX2FkZHIrVkxTSV9QSU9fUFJPTVBUKTsKK30KKworLyogY2FsbGVyIG11c3QgaGF2ZSBzdG9wcGVkIHRoZSBjb250cm9sbGVyIGZyb20gYnVzbWFzdGVyaW5nICovCisKK3N0YXRpYyB2b2lkIHZsc2lfdW5hcm1fcngodmxzaV9pcmRhX2Rldl90ICppZGV2KQoreworCXN0cnVjdCB2bHNpX3JpbmcgKnIgPSBpZGV2LT5yeF9yaW5nOworCXN0cnVjdCByaW5nX2Rlc2NyICpyZDsKKwlpbnQgcmV0OworCisJZm9yIChyZCA9IHJpbmdfZmlyc3Qocik7IHJkICE9IE5VTEw7IHJkID0gcmluZ19nZXQocikpIHsKKworCQlyZXQgPSAwOworCQlpZiAocmRfaXNfYWN0aXZlKHJkKSkgeworCQkJcmRfc2V0X3N0YXR1cyhyZCwgMCk7CisJCQlpZiAocmRfZ2V0X2NvdW50KHJkKSkgeworCQkJCUlSREFfREVCVUcoMCwgIiVzIC0gZHJvcHBpbmcgcnggcGFja2V0XG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCXJldCA9IC1WTFNJX1JYX0RST1A7CisJCQl9CisJCQlyZF9zZXRfY291bnQocmQsIDApOworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHItPnBkZXYsIHJkX2dldF9hZGRyKHJkKSwgci0+bGVuLCByLT5kaXIpOworCQkJaWYgKHJkLT5za2IpIHsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShyZC0+c2tiKTsKKwkJCQlyZC0+c2tiID0gTlVMTDsKKwkJCX0KKwkJfQorCQllbHNlCisJCQlyZXQgPSB2bHNpX3Byb2Nlc3NfcngociwgcmQpOworCisJCWlmIChyZXQgPCAwKSB7CisJCQlyZXQgPSAtcmV0OworCQkJaWRldi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAocmV0ICYgVkxTSV9SWF9EUk9QKSAgCisJCQkJaWRldi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJaWYgKHJldCAmIFZMU0lfUlhfT1ZFUikgIAorCQkJCWlkZXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAocmV0ICYgVkxTSV9SWF9MRU5HVEgpICAKKwkJCQlpZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpZiAocmV0ICYgVkxTSV9SWF9GUkFNRSkgIAorCQkJCWlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKHJldCAmIFZMU0lfUlhfQ1JDKSAgCisJCQkJaWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQl9CisJCWVsc2UgaWYgKHJldCA+IDApIHsKKwkJCWlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCWlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHJldDsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHZsc2lfcHJvY2Vzc190eChzdHJ1Y3QgdmxzaV9yaW5nICpyLCBzdHJ1Y3QgcmluZ19kZXNjciAqcmQpCit7CisJdTE2CQlzdGF0dXM7CisJaW50CQlsZW47CisJaW50CQlyZXQ7CisKKwlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoci0+cGRldiwgcmRfZ2V0X2FkZHIocmQpLCByLT5sZW4sIHItPmRpcik7CisJLyogZG1hIGJ1ZmZlciBub3cgb3duZWQgYnkgdGhlIENQVSAqLworCXN0YXR1cyA9IHJkX2dldF9zdGF0dXMocmQpOworCWlmIChzdGF0dXMgJiBSRF9UWF9VTkRSTikKKwkJcmV0ID0gVkxTSV9UWF9GSUZPOworCWVsc2UKKwkJcmV0ID0gMDsKKwlyZF9zZXRfc3RhdHVzKHJkLCAwKTsKKworCWlmIChyZC0+c2tiKSB7CisJCWxlbiA9IHJkLT5za2ItPmxlbjsKKwkJZGV2X2tmcmVlX3NrYl9hbnkocmQtPnNrYik7CisJCXJkLT5za2IgPSBOVUxMOworCX0KKwllbHNlCS8qIHR4LXNrYiBhbHJlYWR5IGZyZWVkPyAtIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJbGVuID0gcmRfZ2V0X2NvdW50KHJkKTsJCS8qIGluY29ycmVjdCBmb3IgU0lSISAoZHVlIHRvIHdyYXBwaW5nKSAqLworCisJcmRfc2V0X2NvdW50KHJkLCAwKTsKKwkvKiBkbWEgYnVmZmVyIHN0aWxsIG93bmVkIGJ5IHRoZSBDUFUgKi8KKworCXJldHVybiAocmV0KSA/IC1yZXQgOiBsZW47Cit9CisKK3N0YXRpYyBpbnQgdmxzaV9zZXRfYmF1ZCh2bHNpX2lyZGFfZGV2X3QgKmlkZXYsIHVuc2lnbmVkIGlvYmFzZSkKK3sKKwl1MTYgbnBoeWN0bDsKKwl1MTYgY29uZmlnOworCXVuc2lnbmVkIG1vZGU7CisJaW50CXJldDsKKwlpbnQJYmF1ZHJhdGU7CisJaW50CWZpZm9jbnQ7CisKKwliYXVkcmF0ZSA9IGlkZXYtPm5ld19iYXVkOworCUlSREFfREVCVUcoMiwgIiVzOiAlZCAtPiAlZFxuIiwgX19GVU5DVElPTl9fLCBpZGV2LT5iYXVkLCBpZGV2LT5uZXdfYmF1ZCk7CisJaWYgKGJhdWRyYXRlID09IDQwMDAwMDApIHsKKwkJbW9kZSA9IElGRl9GSVI7CisJCWNvbmZpZyA9IElSQ0ZHX0ZJUjsKKwkJbnBoeWN0bCA9IFBIWUNUTF9GSVI7CisJfQorCWVsc2UgaWYgKGJhdWRyYXRlID09IDExNTIwMDApIHsKKwkJbW9kZSA9IElGRl9NSVI7CisJCWNvbmZpZyA9IElSQ0ZHX01JUiB8IElSQ0ZHX0NSQzE2OworCQlucGh5Y3RsID0gUEhZQ1RMX01JUihjbGtzcmM9PTMpOworCX0KKwllbHNlIHsKKwkJbW9kZSA9IElGRl9TSVI7CisJCWNvbmZpZyA9IElSQ0ZHX1NJUiB8IElSQ0ZHX1NJUkZJTFQgIHwgSVJDRkdfUlhBTlk7CisJCXN3aXRjaChiYXVkcmF0ZSkgeworCQkJZGVmYXVsdDoKKwkJCQlJUkRBX1dBUk5JTkcoIiVzOiB1bmRlZmluZWQgYmF1ZHJhdGUgJWQgLSBmYWxsYmFjayB0byA5NjAwIVxuIiwKKwkJCQkJICAgICBfX0ZVTkNUSU9OX18sIGJhdWRyYXRlKTsKKwkJCQliYXVkcmF0ZSA9IDk2MDA7CisJCQkJLyogZmFsbHRocnUgKi8KKwkJCWNhc2UgMjQwMDoKKwkJCWNhc2UgOTYwMDoKKwkJCWNhc2UgMTkyMDA6CisJCQljYXNlIDM4NDAwOgorCQkJY2FzZSA1NzYwMDoKKwkJCWNhc2UgMTE1MjAwOgorCQkJCW5waHljdGwgPSBQSFlDVExfU0lSKGJhdWRyYXRlLHNpcnB1bHNlLGNsa3NyYz09Myk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJY29uZmlnIHw9IElSQ0ZHX01TVFIgfCBJUkNGR19FTlJYOworCisJZmlmb2NudCA9IGludyhpb2Jhc2UrVkxTSV9QSU9fUkNWQkNOVCkgJiBSQ1ZCQ05UX01BU0s7CisJaWYgKGZpZm9jbnQgIT0gMCkgeworCQlJUkRBX0RFQlVHKDAsICIlczogcnggZmlmbyBub3QgZW1wdHkoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIGZpZm9jbnQpOworCX0KKworCW91dHcoMCwgaW9iYXNlK1ZMU0lfUElPX0lSRU5BQkxFKTsKKwlvdXR3KGNvbmZpZywgaW9iYXNlK1ZMU0lfUElPX0lSQ0ZHKTsKKwlvdXR3KG5waHljdGwsIGlvYmFzZStWTFNJX1BJT19OUEhZQ1RMKTsKKwl3bWIoKTsKKwlvdXR3KElSRU5BQkxFX1BIWUFORENMT0NLLCBpb2Jhc2UrVkxTSV9QSU9fSVJFTkFCTEUpOworCW1iKCk7CisKKwl1ZGVsYXkoMSk7CS8qIGNoaXAgYXBwbGllcyBJUkNGRyBvbiBuZXh0IHJpc2luZyBlZGdlIG9mIGl0cyA4TUh6IGNsb2NrICovCisKKwkvKiByZWFkIGJhY2sgc2V0dGluZ3MgZm9yIHZhbGlkYXRpb24gKi8KKworCWNvbmZpZyA9IGludyhpb2Jhc2UrVkxTSV9QSU9fSVJFTkFCTEUpICYgSVJFTkFCTEVfTUFTSzsKKworCWlmIChtb2RlID09IElGRl9GSVIpCisJCWNvbmZpZyBePSBJUkVOQUJMRV9GSVJfT047CisJZWxzZSBpZiAobW9kZSA9PSBJRkZfTUlSKQorCQljb25maWcgXj0gKElSRU5BQkxFX01JUl9PTnxJUkVOQUJMRV9DUkMxNl9PTik7CisJZWxzZQorCQljb25maWcgXj0gSVJFTkFCTEVfU0lSX09OOworCisJaWYgKGNvbmZpZyAhPSAoSVJFTkFCTEVfUEhZQU5EQ0xPQ0t8SVJFTkFCTEVfRU5SWFNUKSkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBmYWlsZWQgdG8gc2V0ICVzIG1vZGUhXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkobW9kZT09SUZGX1NJUik/IlNJUiI6KChtb2RlPT1JRkZfTUlSKT8iTUlSIjoiRklSIikpOworCQlyZXQgPSAtMTsKKwl9CisJZWxzZSB7CisJCWlmIChpbncoaW9iYXNlK1ZMU0lfUElPX1BIWUNUTCkgIT0gbnBoeWN0bCkgeworCQkJSVJEQV9XQVJOSU5HKCIlczogZmFpbGVkIHRvIGFwcGx5IGJhdWRyYXRlICVkXG4iLAorCQkJCSAgICAgX19GVU5DVElPTl9fLCBiYXVkcmF0ZSk7CisJCQlyZXQgPSAtMTsKKwkJfQorCQllbHNlIHsKKwkJCWlkZXYtPm1vZGUgPSBtb2RlOworCQkJaWRldi0+YmF1ZCA9IGJhdWRyYXRlOworCQkJaWRldi0+bmV3X2JhdWQgPSAwOworCQkJcmV0ID0gMDsKKwkJfQorCX0KKworCWlmIChyZXQpCisJCXZsc2lfcmVnX2RlYnVnKGlvYmFzZSxfX0ZVTkNUSU9OX18pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2bHNpX2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwl2bHNpX2lyZGFfZGV2X3QgKmlkZXYgPSBuZGV2LT5wcml2OworCXN0cnVjdCB2bHNpX3JpbmcJKnIgPSBpZGV2LT50eF9yaW5nOworCXN0cnVjdCByaW5nX2Rlc2NyICpyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGlvYmFzZSA9IG5kZXYtPmJhc2VfYWRkcjsKKwl1OCBzdGF0dXM7CisJdTE2IGNvbmZpZzsKKwlpbnQgbXR0OworCWludCBsZW4sIHNwZWVkOworCXN0cnVjdCB0aW1ldmFsICBub3csIHJlYWR5OworCWNoYXIgKm1zZyA9IE5VTEw7CisKKwlzcGVlZCA9IGlyZGFfZ2V0X25leHRfc3BlZWQoc2tiKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWRldi0+bG9jaywgZmxhZ3MpOworCWlmIChzcGVlZCAhPSAtMSAgJiYgIHNwZWVkICE9IGlkZXYtPmJhdWQpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKwkJaWRldi0+bmV3X2JhdWQgPSBzcGVlZDsKKwkJc3RhdHVzID0gUkRfVFhfQ0xSRU5UWDsgIC8qIHN0b3AgdHgtcmluZyBhZnRlciB0aGlzIGZyYW1lICovCisJfQorCWVsc2UKKwkJc3RhdHVzID0gMDsKKworCWlmIChza2ItPmxlbiA9PSAwKSB7CisJCS8qIGhhbmRsZSB6ZXJvIHBhY2tldHMgLSBzaG91bGQgYmUgc3BlZWQgY2hhbmdlICovCisJCWlmIChzdGF0dXMgPT0gMCkgeworCQkJbXNnID0gImJvZ3VzIHplcm8tbGVuZ3RoIHBhY2tldCI7CisJCQlnb3RvIGRyb3BfdW5sb2NrOworCQl9CisKKwkJLyogZHVlIHRvIHRoZSBjb21wbGV0ZWx5IGFzeW5jaCB0eCBvcGVyYXRpb24gd2UgbWlnaHQgaGF2ZQorCQkgKiBJckxBUCByYWNpbmcgd2l0aCB0aGUgaGFyZHdhcmUgaGVyZSwgZi5lLiBpZiB0aGUgY29udHJvbGxlcgorCQkgKiBpcyBqdXN0IHNlbmRpbmcgdGhlIGxhc3QgcGFja2V0IHdpdGggY3VycmVudCBzcGVlZCB3aGlsZQorCQkgKiB0aGUgTEFQIGlzIGFscmVhZHkgc3dpdGNoaW5nIHRoZSBzcGVlZCB1c2luZyBzeW5jaHJvbm91cworCQkgKiBsZW49MCBwYWNrZXQuIEltbWVkaWF0ZSBleGVjdXRpb24gd291bGQgbGVhZCB0byBodyBsb2NrdXAKKwkJICogcmVxdWlyaW5nIGEgcG93ZXJjeWNsZSB0byByZXNldC4gR29vZCBjYW5kaWRhdGUgdG8gdHJpZ2dlcgorCQkgKiB0aGlzIGlzIHRoZSBmaW5hbCBVQTpSU1AgcGFja2V0IGFmdGVyIHJlY2VpdmluZyBhIERJU0M6Q01ECisJCSAqIHdoZW4gZ2V0dGluZyB0aGUgTEFQIGRvd24uCisJCSAqIE5vdGUgdGhhdCB3ZSBhcmUgbm90IHByb3RlY3RlZCBieSB0aGUgcXVldWVfc3RvcCBhcHByb2FjaAorCQkgKiBiZWNhdXNlIHRoZSBmaW5hbCBVQTpSU1AgYXJyaXZlcyBfd2l0aG91dF8gcmVxdWVzdCB0byBhcHBseQorCQkgKiBuZXctc3BlZWQtYWZ0ZXItdGhpcy1wYWNrZXQgLSBoZW5jZSB0aGUgZHJpdmVyIGRvZXNuJ3Qga25vdworCQkgKiB0aGlzIHdhcyB0aGUgbGFzdCBwYWNrZXQgYW5kIGRvZXNuJ3Qgc3RvcCB0aGUgcXVldWUuIFNvIHRoZQorCQkgKiBmb3JjZWQgc3dpdGNoIHRvIGRlZmF1bHQgc3BlZWQgZnJvbSBMQVAgZ2V0cyB0aHJvdWdoIGFzIGZhc3QKKwkJICogYXMgb25seSBzb21lIDEwIHVzZWMgbGF0ZXIgd2hpbGUgdGhlIFVBOlJTUCBpcyBzdGlsbCBwcm9jZXNzZWQKKwkJICogYnkgdGhlIGhhcmR3YXJlIGFuZCB3ZSB3b3VsZCBnZXQgc2NyZXdlZC4KKwkJICovCisKKwkJaWYgKHJpbmdfZmlyc3QoaWRldi0+dHhfcmluZykgPT0gTlVMTCkgeworCQkJLyogbm8gcmFjZSAtIHR4LXJpbmcgYWxyZWFkeSBlbXB0eSAqLworCQkJdmxzaV9zZXRfYmF1ZChpZGV2LCBpb2Jhc2UpOworCQkJbmV0aWZfd2FrZV9xdWV1ZShuZGV2KTsKKwkJfQorCQllbHNlCisJCQk7CisJCQkvKiBrZWVwIHRoZSBzcGVlZCBjaGFuZ2UgcGVuZGluZyBsaWtlIGl0IHdvdWxkCisJCQkgKiBmb3IgYW55IGxlbj4wIHBhY2tldC4gdHggY29tcGxldGlvbiBpbnRlcnJ1cHQKKwkJCSAqIHdpbGwgYXBwbHkgaXQgd2hlbiB0aGUgdHggcmluZyBiZWNvbWVzIGVtcHR5LgorCQkJICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZXYtPmxvY2ssIGZsYWdzKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogc2FuaXR5IGNoZWNrcyAtIHNpbXBseSBkcm9wIHRoZSBwYWNrZXQgKi8KKworCXJkID0gcmluZ19sYXN0KHIpOworCWlmICghcmQpIHsKKwkJbXNnID0gInJpbmcgZnVsbCwgYnV0IHF1ZXVlIHdhc24ndCBzdG9wcGVkIjsKKwkJZ290byBkcm9wX3VubG9jazsKKwl9CisKKwlpZiAocmRfaXNfYWN0aXZlKHJkKSkgeworCQltc2cgPSAiZW50cnkgc3RpbGwgb3duZWQgYnkgaHciOworCQlnb3RvIGRyb3BfdW5sb2NrOworCX0KKworCWlmICghcmQtPmJ1ZikgeworCQltc2cgPSAidHggcmluZyBlbnRyeSB3aXRob3V0IHBjaSBidWZmZXIiOworCQlnb3RvIGRyb3BfdW5sb2NrOworCX0KKworCWlmIChyZC0+c2tiKSB7CisJCW1zZyA9ICJyaW5nIGVudHJ5IHdpdGggb2xkIHNrYiBzdGlsbCBhdHRhY2hlZCI7CisJCWdvdG8gZHJvcF91bmxvY2s7CisJfQorCisJLyogbm8gbmVlZCBmb3Igc2VyaWFsaXphdGlvbiBvciBpbnRlcnJ1cHQgZGlzYWJsZSBkdXJpbmcgbXR0ICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRldi0+bG9jaywgZmxhZ3MpOworCisJaWYgKChtdHQgPSBpcmRhX2dldF9tdHQoc2tiKSkgPiAwKSB7CisJCisJCXJlYWR5LnR2X3VzZWMgPSBpZGV2LT5sYXN0X3J4LnR2X3VzZWMgKyBtdHQ7CisJCXJlYWR5LnR2X3NlYyA9IGlkZXYtPmxhc3RfcngudHZfc2VjOworCQlpZiAocmVhZHkudHZfdXNlYyA+PSAxMDAwMDAwKSB7CisJCQlyZWFkeS50dl91c2VjIC09IDEwMDAwMDA7CisJCQlyZWFkeS50dl9zZWMrKzsJCS8qIElyTEFQIDEuMTogbXR0IGFsd2F5cyA8IDEgc2VjICovCisJCX0KKwkJZm9yKDs7KSB7CisJCQlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7CisJCQlpZiAobm93LnR2X3NlYyA+IHJlYWR5LnR2X3NlYworCQkJICAgIHx8ICAobm93LnR2X3NlYz09cmVhZHkudHZfc2VjICYmIG5vdy50dl91c2VjPj1yZWFkeS50dl91c2VjKSkKKwkJCSAgICAJYnJlYWs7CisJCQl1ZGVsYXkoMTAwKTsKKwkJCS8qIG11c3Qgbm90IHNsZWVwIGhlcmUgLSB3ZSBhcmUgY2FsbGVkIHVuZGVyIHhtaXRfbG9jayEgKi8KKwkJfQorCX0KKworCS8qIHR4IGJ1ZmZlciBhbHJlYWR5IG93bmVkIGJ5IENQVSBkdWUgdG8gcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KCkKKwkgKiBhZnRlciBzdWJzZXF1ZW50IHR4LWNvbXBsZXRpb24KKwkgKi8KKworCWlmIChpZGV2LT5tb2RlID09IElGRl9TSVIpIHsKKwkJc3RhdHVzIHw9IFJEX1RYX0RJU0NSQzsJCS8qIG5vIGh3LWNyYyBjcmVhdGlvbiAqLworCQlsZW4gPSBhc3luY193cmFwX3NrYihza2IsIHJkLT5idWYsIHItPmxlbik7CisKKwkJLyogU29tZSByYXJlIHdvcnN0IGNhc2Ugc2l0dWF0aW9uIGluIFNJUiBtb2RlIG1pZ2h0IGxlYWQgdG8KKwkJICogcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvdy4gVGhlIHdyYXBwZXIgZGV0ZWN0cyB0aGlzLCByZXR1cm5zCisJCSAqIHdpdGggYSBzaG9ydGVuZWQgZnJhbWUgKHdpdGhvdXQgRkNTL0VPRikgYnV0IGRvZXNuJ3QgcHJvdmlkZQorCQkgKiBhbnkgZXJyb3IgaW5kaWNhdGlvbiBhYm91dCB0aGUgaW52YWxpZCBwYWNrZXQgd2hpY2ggd2UgYXJlCisJCSAqIGdvaW5nIHRvIHRyYW5zbWl0LgorCQkgKiBUaGVyZWZvcmUgd2UgbG9nIGlmIHRoZSBidWZmZXIgZ290IGZpbGxlZCB0byB0aGUgcG9pbnQsIHdoZXJlIHRoZQorCQkgKiB3cmFwcGVyIHdvdWxkIGFib3J0LCBpLmUuIHdoZW4gdGhlcmUgYXJlIGxlc3MgdGhhbiA1IGJ5dGVzIGxlZnQgdG8KKwkJICogYWxsb3cgYXBwZW5kaW5nIHRoZSBGQ1MvRU9GLgorCQkgKi8KKworCQlpZiAobGVuID49IHItPmxlbi01KQorCQkJIElSREFfV0FSTklORygiJXM6IHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvdyB3aXRoIFNJUiB3cmFwcGluZyFcbiIsCisJCQkJICAgICAgX19GVU5DVElPTl9fKTsKKwl9CisJZWxzZSB7CisJCS8qIGh3IGRlYWxzIHdpdGggTUlSL0ZJUiBtb2RlIHdyYXBwaW5nICovCisJCXN0YXR1cyB8PSBSRF9UWF9QVUxTRTsJCS8qIHNlbmQgMiB1cyBoaWdoc3BlZWQgaW5kaWNhdGlvbiBwdWxzZSAqLworCQlsZW4gPSBza2ItPmxlbjsKKwkJaWYgKGxlbiA+IHItPmxlbikgeworCQkJbXNnID0gImZyYW1lIGV4Y2VlZHMgdHggYnVmZmVyIGxlbmd0aCI7CisJCQlnb3RvIGRyb3A7CisJCX0KKwkJZWxzZQorCQkJbWVtY3B5KHJkLT5idWYsIHNrYi0+ZGF0YSwgbGVuKTsKKwl9CisKKwlyZC0+c2tiID0gc2tiOwkJCS8qIHJlbWVtYmVyIHNrYiBmb3IgdHgtY29tcGxldGUgc3RhdHMgKi8KKworCXJkX3NldF9jb3VudChyZCwgbGVuKTsKKwlyZF9zZXRfc3RhdHVzKHJkLCBzdGF0dXMpOwkvKiBub3QgeWV0IGFjdGl2ZSEgKi8KKworCS8qIGdpdmUgZG1hIGJ1ZmZlciBiYWNrIHRvIGJ1c21hc3Rlci1odyAoZmx1c2ggY2FjaGVzIHRvIG1ha2UKKwkgKiBDUFUtZHJpdmVuIGNoYW5nZXMgdmlzaWJsZSBmcm9tIHRoZSBwY2kgYnVzKS4KKwkgKi8KKworCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShyLT5wZGV2LCByZF9nZXRfYWRkcihyZCksIHItPmxlbiwgci0+ZGlyKTsKKworLyoJU3dpdGNoaW5nIHRvIFRYIG1vZGUgaGVyZSByYWNlcyB3aXRoIHRoZSBjb250cm9sbGVyCisgKgl3aGljaCBtYXkgc3RvcCBUWCBhdCBhbnkgdGltZSB3aGVuIGZldGNoaW5nIGFuIGluYWN0aXZlIGRlc2NyaXB0b3IKKyAqCW9yIG9uZSB3aXRoIENMUl9FTlRYIHNldC4gU28gd2Ugc3dpdGNoIG9uIFRYIG9ubHksIGlmIFRYIHdhcyBub3QgcnVubmluZworICoJX2FmdGVyXyB0aGUgbmV3IGRlc2NyaXB0b3Igd2FzIGFjdGl2YXRlZCBvbiB0aGUgcmluZy4gVGhpcyBlbnN1cmVzCisgKgl3ZSB3aWxsIGVpdGhlciBmaW5kIFRYIGFscmVhZHkgc3RvcHBlZCBvciB3ZSBjYW4gYmUgc3VyZSwgdGhlcmUKKyAqCXdpbGwgYmUgYSBUWC1jb21wbGV0ZSBpbnRlcnJ1cHQgZXZlbiBpZiB0aGUgY2hpcCBzdG9wcGVkIGRvaW5nCisgKglUWCBqdXN0IGFmdGVyIHdlIGZvdW5kIGl0IHN0aWxsIHJ1bm5pbmcuIFRoZSBJU1Igd2lsbCB0aGVuIGZpbmQKKyAqCXRoZSBub24tZW1wdHkgcmluZyBhbmQgcmVzdGFydCBUWCBwcm9jZXNzaW5nLiBUaGUgZW5jbG9zaW5nCisgKglzcGlubG9jayBwcm92aWRlcyB0aGUgY29ycmVjdCBzZXJpYWxpemF0aW9uIHRvIHByZXZlbnQgcmFjZSB3aXRoIGlzci4KKyAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZXYtPmxvY2ssZmxhZ3MpOworCisJcmRfYWN0aXZhdGUocmQpOworCisJaWYgKCEoaW53KGlvYmFzZStWTFNJX1BJT19JUkVOQUJMRSkgJiBJUkVOQUJMRV9FTlRYU1QpKSB7CisJCWludCBmaWZvY250OworCisJCWZpZm9jbnQgPSBpbncobmRldi0+YmFzZV9hZGRyK1ZMU0lfUElPX1JDVkJDTlQpICYgUkNWQkNOVF9NQVNLOworCQlpZiAoZmlmb2NudCAhPSAwKSB7CisJCQlJUkRBX0RFQlVHKDAsICIlczogcnggZmlmbyBub3QgZW1wdHkoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIGZpZm9jbnQpOworCQl9CisKKwkJY29uZmlnID0gaW53KGlvYmFzZStWTFNJX1BJT19JUkNGRyk7CisJCW1iKCk7CisJCW91dHcoY29uZmlnIHwgSVJDRkdfRU5UWCwgaW9iYXNlK1ZMU0lfUElPX0lSQ0ZHKTsKKwkJd21iKCk7CisJCW91dHcoMCwgaW9iYXNlK1ZMU0lfUElPX1BST01QVCk7CisJfQorCW5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCWlmIChyaW5nX3B1dChyKSA9PSBOVUxMKSB7CisJCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJCUlSREFfREVCVUcoMywgIiVzOiB0eCByaW5nIGZ1bGwgLSBxdWV1ZSBzdG9wcGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGV2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKKworZHJvcF91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRldi0+bG9jaywgZmxhZ3MpOworZHJvcDoKKwlJUkRBX1dBUk5JTkcoIiVzOiBkcm9wcGluZyBwYWNrZXQgLSAlc1xuIiwgX19GVU5DVElPTl9fLCBtc2cpOworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJaWRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJaWRldi0+c3RhdHMudHhfZHJvcHBlZCsrOworCS8qIERvbid0IGV2ZW4gdGhpbmsgYWJvdXQgcmV0dXJuaW5nIE5FVF9YTUlUX0RST1AgKD0xKSBoZXJlIQorCSAqIEluIGZhY3QgYW55IHJldHZhbCE9MCBjYXVzZXMgdGhlIHBhY2tldCBzY2hlZHVsZXIgdG8gcmVxdWV1ZSB0aGUKKwkgKiBwYWNrZXQgZm9yIGxhdGVyIHJldHJ5IG9mIHRyYW5zbWlzc2lvbiAtIHdoaWNoIGlzbid0IGV4YWN0bHkKKwkgKiB3aGF0IHdlIHdhbnQgYWZ0ZXIgd2UndmUganVzdCBjYWxsZWQgZGV2X2tmcmVlX3NrYl9hbnkgOy0pCisJICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZsc2lfdHhfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXZsc2lfaXJkYV9kZXZfdCAqaWRldiA9IG5kZXYtPnByaXY7CisJc3RydWN0IHZsc2lfcmluZwkqciA9IGlkZXYtPnR4X3Jpbmc7CisJc3RydWN0IHJpbmdfZGVzY3IJKnJkOworCXVuc2lnbmVkCWlvYmFzZTsKKwlpbnQJcmV0OworCXUxNgljb25maWc7CisKKwlmb3IgKHJkID0gcmluZ19maXJzdChyKTsgcmQgIT0gTlVMTDsgcmQgPSByaW5nX2dldChyKSkgeworCisJCWlmIChyZF9pc19hY3RpdmUocmQpKQorCQkJYnJlYWs7CisKKwkJcmV0ID0gdmxzaV9wcm9jZXNzX3R4KHIsIHJkKTsKKworCQlpZiAocmV0IDwgMCkgeworCQkJcmV0ID0gLXJldDsKKwkJCWlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJaWYgKHJldCAmIFZMU0lfVFhfRFJPUCkKKwkJCQlpZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CisJCQlpZiAocmV0ICYgVkxTSV9UWF9GSUZPKQorCQkJCWlkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCX0KKwkJZWxzZSBpZiAocmV0ID4gMCl7CisJCQlpZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlpZGV2LT5zdGF0cy50eF9ieXRlcyArPSByZXQ7CisJCX0KKwl9CisKKwlpb2Jhc2UgPSBuZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoaWRldi0+bmV3X2JhdWQgICYmICByZCA9PSBOVUxMKQkvKiB0eCByaW5nIGVtcHR5IGFuZCBzcGVlZCBjaGFuZ2UgcGVuZGluZyAqLworCQl2bHNpX3NldF9iYXVkKGlkZXYsIGlvYmFzZSk7CisKKwljb25maWcgPSBpbncoaW9iYXNlK1ZMU0lfUElPX0lSQ0ZHKTsKKwlpZiAocmQgPT0gTlVMTCkJCQkvKiB0eCByaW5nIGVtcHR5OiByZS1lbmFibGUgcnggKi8KKwkJb3V0dygoY29uZmlnICYgfklSQ0ZHX0VOVFgpIHwgSVJDRkdfRU5SWCwgaW9iYXNlK1ZMU0lfUElPX0lSQ0ZHKTsKKworCWVsc2UgaWYgKCEoaW53KGlvYmFzZStWTFNJX1BJT19JUkVOQUJMRSkgJiBJUkVOQUJMRV9FTlRYU1QpKSB7CisJCWludCBmaWZvY250OworCisJCWZpZm9jbnQgPSBpbncoaW9iYXNlK1ZMU0lfUElPX1JDVkJDTlQpICYgUkNWQkNOVF9NQVNLOworCQlpZiAoZmlmb2NudCAhPSAwKSB7CisJCQlJUkRBX0RFQlVHKDAsICIlczogcnggZmlmbyBub3QgZW1wdHkoJWQpXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgZmlmb2NudCk7CisJCX0KKwkJb3V0dyhjb25maWcgfCBJUkNGR19FTlRYLCBpb2Jhc2UrVkxTSV9QSU9fSVJDRkcpOworCX0KKworCW91dHcoMCwgaW9iYXNlK1ZMU0lfUElPX1BST01QVCk7CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChuZGV2KSAgJiYgICFpZGV2LT5uZXdfYmF1ZCkgeworCQluZXRpZl93YWtlX3F1ZXVlKG5kZXYpOworCQlJUkRBX0RFQlVHKDMsICIlczogcXVldWUgYXdva2VuXG4iLCBfX0ZVTkNUSU9OX18pOworCX0KK30KKworLyogY2FsbGVyIG11c3QgaGF2ZSBzdG9wcGVkIHRoZSBjb250cm9sbGVyIGZyb20gYnVzbWFzdGVyaW5nICovCisKK3N0YXRpYyB2b2lkIHZsc2lfdW5hcm1fdHgodmxzaV9pcmRhX2Rldl90ICppZGV2KQoreworCXN0cnVjdCB2bHNpX3JpbmcgKnIgPSBpZGV2LT50eF9yaW5nOworCXN0cnVjdCByaW5nX2Rlc2NyICpyZDsKKwlpbnQgcmV0OworCisJZm9yIChyZCA9IHJpbmdfZmlyc3Qocik7IHJkICE9IE5VTEw7IHJkID0gcmluZ19nZXQocikpIHsKKworCQlyZXQgPSAwOworCQlpZiAocmRfaXNfYWN0aXZlKHJkKSkgeworCQkJcmRfc2V0X3N0YXR1cyhyZCwgMCk7CisJCQlyZF9zZXRfY291bnQocmQsIDApOworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHItPnBkZXYsIHJkX2dldF9hZGRyKHJkKSwgci0+bGVuLCByLT5kaXIpOworCQkJaWYgKHJkLT5za2IpIHsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShyZC0+c2tiKTsKKwkJCQlyZC0+c2tiID0gTlVMTDsKKwkJCX0KKwkJCUlSREFfREVCVUcoMCwgIiVzIC0gZHJvcHBpbmcgdHggcGFja2V0XG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0ID0gLVZMU0lfVFhfRFJPUDsKKwkJfQorCQllbHNlCisJCQlyZXQgPSB2bHNpX3Byb2Nlc3NfdHgociwgcmQpOworCisJCWlmIChyZXQgPCAwKSB7CisJCQlyZXQgPSAtcmV0OworCQkJaWRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJCQlpZiAocmV0ICYgVkxTSV9UWF9EUk9QKQorCQkJCWlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJCWlmIChyZXQgJiBWTFNJX1RYX0ZJRk8pCisJCQkJaWRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJfQorCQllbHNlIGlmIChyZXQgPiAwKXsKKwkJCWlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCWlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHJldDsKKwkJfQorCX0KKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgdmxzaV9zdGFydF9jbG9jayhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1OAljbGtjdGwsIGxvY2s7CisJaW50CWksIGNvdW50OworCisJaWYgKGNsa3NyYyA8IDIpIHsgLyogYXV0byBvciBQTEw6IHRyeSBQTEwgKi8KKwkJY2xrY3RsID0gQ0xLQ1RMX1BEX0lOViB8IENMS0NUTF9DTEtTVFA7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBWTFNJX1BDSV9DTEtDVEwsIGNsa2N0bCk7CisKKwkJLyogcHJvY2VkdXJlIHRvIGRldGVjdCBQTEwgbG9jayBzeW5jaHJvbmlzYXRpb246CisJCSAqIGFmdGVyIDAuNSBtc2VjIGluaXRpYWwgZGVsYXkgd2UgZXhwZWN0IHRvIGZpbmQgMyBQTEwgbG9jaworCQkgKiBpbmRpY2F0aW9ucyB3aXRoaW4gMTAgbXNlYyBmb3Igc3VjY2Vzc2Z1bCBQTEwgZGV0ZWN0aW9uLgorCQkgKi8KKwkJdWRlbGF5KDUwMCk7CisJCWNvdW50ID0gMDsKKwkJZm9yIChpID0gNTAwOyBpIDw9IDEwMDAwOyBpICs9IDUwKSB7IC8qIG1heCAxMCBtc2VjICovCisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBWTFNJX1BDSV9DTEtDVEwsICZsb2NrKTsKKwkJCWlmIChsb2NrJkNMS0NUTF9MT0NLKSB7CisJCQkJaWYgKCsrY291bnQgPj0gMykKKwkJCQkJYnJlYWs7CisJCQl9CisJCQl1ZGVsYXkoNTApOworCQl9CisJCWlmIChjb3VudCA8IDMpIHsKKwkJCWlmIChjbGtzcmMgPT0gMSkgeyAvKiBleHBsaWNpdGx5IGFza2VkIGZvciBQTEwgaGVuY2UgYmFpbCBvdXQgKi8KKwkJCQlJUkRBX0VSUk9SKCIlczogbm8gUExMIG9yIGZhaWxlZCB0byBsb2NrIVxuIiwKKwkJCQkJICAgX19GVU5DVElPTl9fKTsKKwkJCQljbGtjdGwgPSBDTEtDVExfQ0xLU1RQOworCQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBWTFNJX1BDSV9DTEtDVEwsIGNsa2N0bCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJZWxzZQkJCS8qIHdhczogY2xrc3JjPTAoYXV0bykgKi8KKwkJCQljbGtzcmMgPSAzOwkvKiBmYWxsYmFjayB0byA0ME1IeiBYQ0xLIChPQjgwMCkgKi8KKworCQkJSVJEQV9ERUJVRygwLCAiJXM6IFBMTCBub3QgbG9ja2VkLCBmYWxsYmFjayB0byBjbGtzcmM9JWRcbiIsCisJCQkJX19GVU5DVElPTl9fLCBjbGtzcmMpOworCQl9CisJCWVsc2UKKwkJCWNsa3NyYyA9IDE7CS8qIGdvdCBzdWNjZXNzZnVsIFBMTCBsb2NrICovCisJfQorCisJaWYgKGNsa3NyYyAhPSAxKSB7CisJCS8qIHdlIGdldCBoZXJlIGlmIGVpdGhlciBubyBQTEwgZGV0ZWN0ZWQgaW4gYXV0by1tb2RlIG9yCisJCSAgIGFuIGV4dGVybmFsIGNsb2NrIHNvdXJjZSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQgKi8KKworCQljbGtjdGwgPSBDTEtDVExfRVhUQ0xLIHwgQ0xLQ1RMX0NMS1NUUDsKKwkJaWYgKGNsa3NyYyA9PSAzKQorCQkJY2xrY3RsIHw9IENMS0NUTF9YQ0tTRUw7CQorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgVkxTSV9QQ0lfQ0xLQ1RMLCBjbGtjdGwpOworCisJCS8qIG5vIHdheSB0byB0ZXN0IGZvciB3b3JraW5nIFhDTEsgKi8KKwl9CisJZWxzZQorCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBWTFNJX1BDSV9DTEtDVEwsICZjbGtjdGwpOworCisJLyogb2ssIG5vdyBnb2luZyB0byBjb25uZWN0IHRoZSBjaGlwIHdpdGggdGhlIGNsb2NrIHNvdXJjZSAqLworCisJY2xrY3RsICY9IH5DTEtDVExfQ0xLU1RQOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBWTFNJX1BDSV9DTEtDVEwsIGNsa2N0bCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmxzaV9zdG9wX2Nsb2NrKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXU4CWNsa2N0bDsKKworCS8qIGRpc2Nvbm5lY3QgY2hpcCBmcm9tIGNsb2NrIHNvdXJjZSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFZMU0lfUENJX0NMS0NUTCwgJmNsa2N0bCk7CisJY2xrY3RsIHw9IENMS0NUTF9DTEtTVFA7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFZMU0lfUENJX0NMS0NUTCwgY2xrY3RsKTsKKworCS8qIGRpc2FibGUgYWxsIGNsb2NrIHNvdXJjZXMgKi8KKwljbGtjdGwgJj0gfihDTEtDVExfRVhUQ0xLIHwgQ0xLQ1RMX1BEX0lOVik7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFZMU0lfUENJX0NMS0NUTCwgY2xrY3RsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB3cml0aW5nIGFsbC16ZXJvIHRvIHRoZSBWTFNJIFBDSSBJTyByZWdpc3RlciBhcmVhIHNlZW1zIHRvIHByZXZlbnQKKyAqIHNvbWUgb2NjYXNpb25hbCBzaXR1YXRpb25zIHdoZXJlIHRoZSBoYXJkd2FyZSBmYWlscyAoc3ltcHRvbXMgYXJlIAorICogd2hhdCBhcHBlYXJzIGFzIHN0YWxsZWQgdHgvcnggc3RhdGUgbWFjaGluZXMsIGkuZS4gZXZlcnl0aGluZyBvayBmb3IKKyAqIHJlY2VpdmUgb3IgdHJhbnNtaXQgYnV0IGh3IG1ha2VzIG5vIHByb2dyZXNzIG9yIGlzIHVuYWJsZSB0byBhY2Nlc3MKKyAqIHRoZSBidXMgbWVtb3J5IGxvY2F0aW9ucykuCisgKiBCZXN0IHBsYWNlIHRvIGNhbGwgdGhpcyBpcyBpbW1lZGlhdGVseSBhZnRlci9iZWZvcmUgdGhlIGludGVybmFsIGNsb2NrCisgKiBnZXRzIHN0YXJ0ZWQvc3RvcHBlZC4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdmxzaV9jbGVhcl9yZWdzKHVuc2lnbmVkIGlvYmFzZSkKK3sKKwl1bnNpZ25lZAlpOworCWNvbnN0IHVuc2lnbmVkCWNoaXBfaW9fZXh0ZW50ID0gMzI7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2hpcF9pb19leHRlbnQ7IGkgKz0gc2l6ZW9mKHUxNikpCisJCW91dHcoMCwgaW9iYXNlICsgaSk7Cit9CisKK3N0YXRpYyBpbnQgdmxzaV9pbml0X2NoaXAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdmxzaV9pcmRhX2Rldl90ICppZGV2ID0gbmRldi0+cHJpdjsKKwl1bnNpZ25lZAlpb2Jhc2U7CisJdTE2IHB0cjsKKworCS8qIHN0YXJ0IHRoZSBjbG9jayBhbmQgY2xlYW4gdGhlIHJlZ2lzdGVycyAqLworCisJaWYgKHZsc2lfc3RhcnRfY2xvY2socGRldikpIHsKKwkJSVJEQV9FUlJPUigiJXM6IG5vIHZhbGlkIGNsb2NrIHNvdXJjZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpb2Jhc2UgPSBuZGV2LT5iYXNlX2FkZHI7CisJdmxzaV9jbGVhcl9yZWdzKGlvYmFzZSk7CisKKwlvdXRiKElSSU5UUl9JTlRfTUFTSywgaW9iYXNlK1ZMU0lfUElPX0lSSU5UUik7IC8qIHcvYyBwZW5kaW5nIElSUSwgZGlzYWJsZSBhbGwgSU5UICovCisKKwlvdXR3KDAsIGlvYmFzZStWTFNJX1BJT19JUkVOQUJMRSk7CS8qIGRpc2FibGUgSXJQSFktaW50ZXJmYWNlICovCisKKwkvKiBkaXNhYmxlIGV2ZXJ5dGhpbmcsIHBhcnRpY3VsYXJseSBJUkNGR19NU1RSIC0gKGFsc28gcmVzZXR0aW5nIHRoZSBSSU5HX1BUUikgKi8KKworCW91dHcoMCwgaW9iYXNlK1ZMU0lfUElPX0lSQ0ZHKTsKKwl3bWIoKTsKKworCW91dHcoTUFYX1BBQ0tFVF9MRU5HVEgsIGlvYmFzZStWTFNJX1BJT19NQVhQS1QpOyAgLyogbWF4IHBvc3NpYmxlIHZhbHVlPTB4MGZmZiAqLworCisJb3V0dyhCVVNfVE9fUklOR0JBU0UoaWRldi0+YnVzYWRkciksIGlvYmFzZStWTFNJX1BJT19SSU5HQkFTRSk7CisKKwlvdXR3KFRYX1JYX1RPX1JJTkdTSVpFKGlkZXYtPnR4X3JpbmctPnNpemUsIGlkZXYtPnJ4X3JpbmctPnNpemUpLAorCQlpb2Jhc2UrVkxTSV9QSU9fUklOR1NJWkUpOwkKKworCXB0ciA9IGludyhpb2Jhc2UrVkxTSV9QSU9fUklOR1BUUik7CisJYXRvbWljX3NldCgmaWRldi0+cnhfcmluZy0+aGVhZCwgUklOR1BUUl9HRVRfUlgocHRyKSk7CisJYXRvbWljX3NldCgmaWRldi0+cnhfcmluZy0+dGFpbCwgUklOR1BUUl9HRVRfUlgocHRyKSk7CisJYXRvbWljX3NldCgmaWRldi0+dHhfcmluZy0+aGVhZCwgUklOR1BUUl9HRVRfVFgocHRyKSk7CisJYXRvbWljX3NldCgmaWRldi0+dHhfcmluZy0+dGFpbCwgUklOR1BUUl9HRVRfVFgocHRyKSk7CisKKwl2bHNpX3NldF9iYXVkKGlkZXYsIGlvYmFzZSk7CS8qIGlkZXYtPm5ld19iYXVkIHVzZWQgYXMgcHJvdmlkZWQgYnkgY2FsbGVyICovCisKKwlvdXRiKElSSU5UUl9JTlRfTUFTSywgaW9iYXNlK1ZMU0lfUElPX0lSSU5UUik7CS8qIGp1c3QgaW4gY2FzZSAtIHcvYyBwZW5kaW5nIElSUSdzICovCisJd21iKCk7CisKKwkvKiBETyBOT1QgQkxJTkRMWSBFTkFCTEUgSVJJTlRSX0FDVEVOIQorCSAqIGJhc2ljYWxseSBldmVyeSByZWNlaXZlZCBwdWxzZSBmaXJlcyBhbiBBQ1RJVklUWS1JTlQKKwkgKiBsZWFkaW5nIHRvID4+MTAwMCBJTlQncyBwZXIgc2Vjb25kIGluc3RlYWQgb2YgZmV3IDEwCisJICovCisKKwlvdXRiKElSSU5UUl9SUEtURU58SVJJTlRSX1RQS1RFTiwgaW9iYXNlK1ZMU0lfUElPX0lSSU5UUik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bHNpX3N0YXJ0X2h3KHZsc2lfaXJkYV9kZXZfdCAqaWRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGlkZXYtPnBkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgaW9iYXNlID0gbmRldi0+YmFzZV9hZGRyOworCXU4IGJ5dGU7CisKKwkvKiB3ZSBkb24ndCB1c2UgdGhlIGxlZ2FjeSBVQVJULCBkaXNhYmxlIGl0cyBhZGRyZXNzIGRlY29kaW5nICovCisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBWTFNJX1BDSV9JUk1JU0MsICZieXRlKTsKKwlieXRlICY9IH4oSVJNSVNDX1VBUlRFTiB8IElSTUlTQ19VQVJUVFNUKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgVkxTSV9QQ0lfSVJNSVNDLCBieXRlKTsKKworCS8qIGVuYWJsZSBQQ0kgYnVzbWFzdGVyIGFjY2VzcyB0byBvdXIgMTZNQiBwYWdlICovCisKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgVkxTSV9QQ0lfTVNUUlBBR0UsIE1TVFJQQUdFX1ZBTFVFKTsKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlmICh2bHNpX2luaXRfY2hpcChwZGV2KSA8IDApIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlyZXR1cm4gLTE7CisJfQorCisJdmxzaV9maWxsX3J4KGlkZXYtPnJ4X3JpbmcpOworCisJZG9fZ2V0dGltZW9mZGF5KCZpZGV2LT5sYXN0X3J4KTsJLyogZmlyc3QgbXR0IG1heSBzdGFydCBmcm9tIG5vdyBvbiAqLworCisJb3V0dygwLCBpb2Jhc2UrVkxTSV9QSU9fUFJPTVBUKTsJLyoga2ljayBodyBzdGF0ZSBtYWNoaW5lICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bHNpX3N0b3BfaHcodmxzaV9pcmRhX2Rldl90ICppZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaWRldi0+cGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBpb2Jhc2UgPSBuZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZGV2LT5sb2NrLGZsYWdzKTsKKwlvdXR3KDAsIGlvYmFzZStWTFNJX1BJT19JUkVOQUJMRSk7CisJb3V0dygwLCBpb2Jhc2UrVkxTSV9QSU9fSVJDRkcpOwkJCS8qIGRpc2FibGUgZXZlcnl0aGluZyAqLworCisJLyogZGlzYWJsZSBhbmQgdy9jIGlycXMgKi8KKwlvdXRiKDAsIGlvYmFzZStWTFNJX1BJT19JUklOVFIpOworCXdtYigpOworCW91dGIoSVJJTlRSX0lOVF9NQVNLLCBpb2Jhc2UrVkxTSV9QSU9fSVJJTlRSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGV2LT5sb2NrLGZsYWdzKTsKKworCXZsc2lfdW5hcm1fdHgoaWRldik7CisJdmxzaV91bmFybV9yeChpZGV2KTsKKworCXZsc2lfY2xlYXJfcmVncyhpb2Jhc2UpOworCXZsc2lfc3RvcF9jbG9jayhwZGV2KTsKKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqIHZsc2lfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXZsc2lfaXJkYV9kZXZfdCAqaWRldiA9IG5kZXYtPnByaXY7CisKKwlyZXR1cm4gJmlkZXYtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCB2bHNpX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJdmxzaV9pcmRhX2Rldl90ICppZGV2ID0gbmRldi0+cHJpdjsKKworCisJdmxzaV9yZWdfZGVidWcobmRldi0+YmFzZV9hZGRyLCBfX0ZVTkNUSU9OX18pOworCXZsc2lfcmluZ19kZWJ1ZyhpZGV2LT50eF9yaW5nKTsKKworCWlmIChuZXRpZl9ydW5uaW5nKG5kZXYpKQorCQluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCisJdmxzaV9zdG9wX2h3KGlkZXYpOworCisJLyogbm93IHNpbXBseSByZXN0YXJ0IHRoZSB3aG9sZSB0aGluZyAqLworCisJaWYgKCFpZGV2LT5uZXdfYmF1ZCkKKwkJaWRldi0+bmV3X2JhdWQgPSBpZGV2LT5iYXVkOwkJLyoga2VlcCBjdXJyZW50IGJhdWRyYXRlICovCisKKwlpZiAodmxzaV9zdGFydF9odyhpZGV2KSkKKwkJSVJEQV9FUlJPUigiJXM6IGZhaWxlZCB0byByZXN0YXJ0IGh3IC0gJXMoJXMpIHVudXNhYmxlIVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgUENJREVWX05BTUUoaWRldi0+cGRldiksIG5kZXYtPm5hbWUpOworCWVsc2UKKwkJbmV0aWZfc3RhcnRfcXVldWUobmRldik7Cit9CisKK3N0YXRpYyBpbnQgdmxzaV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwl2bHNpX2lyZGFfZGV2X3QgKmlkZXYgPSBuZGV2LT5wcml2OworCXN0cnVjdCBpZl9pcmRhX3JlcSAqaXJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKSBycTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiBmaWZvY250OworCWludCByZXQgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBTSU9DU0JBTkRXSURUSDoKKwkJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJCXJldCA9IC1FUEVSTTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpZGV2LT5sb2NrLCBmbGFncyk7CisJCQlpZGV2LT5uZXdfYmF1ZCA9IGlycS0+aWZyX2JhdWRyYXRlOworCQkJLyogd2hlbiBjYWxsZWQgZnJvbSB1c2VybGFuZCB0aGVyZSBtaWdodCBiZSBhIG1pbm9yIHJhY2Ugd2luZG93IGhlcmUKKwkJCSAqIGlmIHRoZSBzdGFjayB0cmllcyB0byBjaGFuZ2Ugc3BlZWQgY29uY3VycmVudGx5IC0gd2hpY2ggd291bGQgYmUKKwkJCSAqIHByZXR0eSBzdHJhbmdlIGFueXdheSB3aXRoIHRoZSB1c2VybGFuZCBoYXZpbmcgZnVsbCBjb250cm9sLi4uCisJCQkgKi8KKwkJCXZsc2lfc2V0X2JhdWQoaWRldiwgbmRldi0+YmFzZV9hZGRyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZXYtPmxvY2ssIGZsYWdzKTsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NTTUVESUFCVVNZOgorCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQkJcmV0ID0gLUVQRVJNOworCQkJCWJyZWFrOworCQkJfQorCQkJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3kobmRldiwgVFJVRSk7CisJCQlicmVhazsKKwkJY2FzZSBTSU9DR1JFQ0VJVklORzoKKwkJCS8qIHRoZSBiZXN0IHdlIGNhbiBkbzogY2hlY2sgd2hldGhlciB0aGVyZSBhcmUgYW55IGJ5dGVzIGluIHJ4IGZpZm8uCisJCQkgKiBUaGUgdHJ1c3RhYmxlIHdpbmRvdyAoaW4gY2FzZSBzb21lIGRhdGEgYXJyaXZlcyBqdXN0IGFmdGVyd2FyZHMpCisJCQkgKiBtYXkgYmUgYXMgc2hvcnQgYXMgMXVzZWMgb3Igc28gYXQgNE1icHMuCisJCQkgKi8KKwkJCWZpZm9jbnQgPSBpbncobmRldi0+YmFzZV9hZGRyK1ZMU0lfUElPX1JDVkJDTlQpICYgUkNWQkNOVF9NQVNLOworCQkJaXJxLT5pZnJfcmVjZWl2aW5nID0gKGZpZm9jbnQhPTApID8gMSA6IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUlSREFfV0FSTklORygiJXM6IG5vdHN1cHAgLSBjbWQ9JTA0eFxuIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXywgY21kKTsKKwkJCXJldCA9IC1FT1BOT1RTVVBQOworCX0JCisJCisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgdmxzaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLAorCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGRldl9pbnN0YW5jZTsKKwl2bHNpX2lyZGFfZGV2X3QgKmlkZXYgPSBuZGV2LT5wcml2OworCXVuc2lnbmVkCWlvYmFzZTsKKwl1OAkJaXJpbnRyOworCWludCAJCWJvZ3VzY291bnQgPSA1OworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJaW50CQloYW5kbGVkID0gMDsKKworCWlvYmFzZSA9IG5kZXYtPmJhc2VfYWRkcjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWRldi0+bG9jayxmbGFncyk7CisJZG8geworCQlpcmludHIgPSBpbmIoaW9iYXNlK1ZMU0lfUElPX0lSSU5UUik7CisJCW1iKCk7CisJCW91dGIoaXJpbnRyLCBpb2Jhc2UrVkxTSV9QSU9fSVJJTlRSKTsJLyogYWNrbm93bGVkZ2UgYXNhcCAqLworCisJCWlmICghKGlyaW50ciY9SVJJTlRSX0lOVF9NQVNLKSkJCS8qIG5vdCBvdXIgSU5UIC0gcHJvYmFibHkgc2hhcmVkICovCisJCQlicmVhazsKKworCQloYW5kbGVkID0gMTsKKworCQlpZiAodW5saWtlbHkoIShpcmludHIgJiB+SVJJTlRSX0FDVElWSVRZKSkpCisJCQlicmVhazsJCQkJLyogbm90aGluZyB0b2RvIGlmIG9ubHkgYWN0aXZpdHkgKi8KKworCQlpZiAoaXJpbnRyJklSSU5UUl9SUEtUSU5UKQorCQkJdmxzaV9yeF9pbnRlcnJ1cHQobmRldik7CisKKwkJaWYgKGlyaW50ciZJUklOVFJfVFBLVElOVCkKKwkJCXZsc2lfdHhfaW50ZXJydXB0KG5kZXYpOworCisJfSB3aGlsZSAoLS1ib2d1c2NvdW50ID4gMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRldi0+bG9jayxmbGFncyk7CisKKwlpZiAoYm9ndXNjb3VudCA8PSAwKQorCQlJUkRBX01FU1NBR0UoIiVzOiB0b28gbXVjaCB3b3JrIGluIGludGVycnVwdCFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCB2bHNpX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJdmxzaV9pcmRhX2Rldl90ICppZGV2ID0gbmRldi0+cHJpdjsKKwlpbnQJZXJyID0gLUVBR0FJTjsKKwljaGFyCWh3bmFtZVszMl07CisKKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhpZGV2LT5wZGV2LCBkcml2ZXJuYW1lKSkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBpbyByZXNvdXJjZSBidXN5XG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGVycm91dDsKKwl9CisJbmRldi0+YmFzZV9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KGlkZXYtPnBkZXYsMCk7CisJbmRldi0+aXJxID0gaWRldi0+cGRldi0+aXJxOworCisJLyogdW5kZXIgc29tZSByYXJlIG9jY2FzaW9ucyB0aGUgY2hpcCBhcHBhcmVudGx5IGNvbWVzIHVwIHdpdGgKKwkgKiBJUlEncyBwZW5kaW5nLiBXZSBiZXR0ZXIgdy9jIHBlbmRpbmcgSVJRIGFuZCBkaXNhYmxlIHRoZW0gYWxsCisJICovCisKKwlvdXRiKElSSU5UUl9JTlRfTUFTSywgbmRldi0+YmFzZV9hZGRyK1ZMU0lfUElPX0lSSU5UUik7CisKKwlpZiAocmVxdWVzdF9pcnEobmRldi0+aXJxLCB2bHNpX2ludGVycnVwdCwgU0FfU0hJUlEsCisJCQlkcml2ZXJuYW1lLCBuZGV2KSkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBjb3VsZG4ndCBnZXQgSVJROiAlZFxuIiwKKwkJCSAgICAgX19GVU5DVElPTl9fLCBuZGV2LT5pcnEpOworCQlnb3RvIGVycm91dF9pbzsKKwl9CisKKwlpZiAoKGVyciA9IHZsc2lfY3JlYXRlX2h3aWYoaWRldikpICE9IDApCisJCWdvdG8gZXJyb3V0X2lycTsKKworCXNwcmludGYoaHduYW1lLCAiVkxTSS1GSVIgQCAweCUwNHgiLCAodW5zaWduZWQpbmRldi0+YmFzZV9hZGRyKTsKKwlpZGV2LT5pcmxhcCA9IGlybGFwX29wZW4obmRldiwmaWRldi0+cW9zLGh3bmFtZSk7CisJaWYgKCFpZGV2LT5pcmxhcCkKKwkJZ290byBlcnJvdXRfZnJlZV9yaW5nOworCisJZG9fZ2V0dGltZW9mZGF5KCZpZGV2LT5sYXN0X3J4KTsgIC8qIGZpcnN0IG10dCBtYXkgc3RhcnQgZnJvbSBub3cgb24gKi8KKworCWlkZXYtPm5ld19iYXVkID0gOTYwMDsJCS8qIHN0YXJ0IHdpdGggSXJQSFkgdXNpbmcgOTYwMChTSVIpIG1vZGUgKi8KKworCWlmICgoZXJyID0gdmxzaV9zdGFydF9odyhpZGV2KSkgIT0gMCkKKwkJZ290byBlcnJvdXRfY2xvc2VfaXJsYXA7CisKKwluZXRpZl9zdGFydF9xdWV1ZShuZGV2KTsKKworCUlSREFfTUVTU0FHRSgiJXM6IGRldmljZSAlcyBvcGVyYXRpb25hbFxuIiwgX19GVU5DVElPTl9fLCBuZGV2LT5uYW1lKTsKKworCXJldHVybiAwOworCitlcnJvdXRfY2xvc2VfaXJsYXA6CisJaXJsYXBfY2xvc2UoaWRldi0+aXJsYXApOworZXJyb3V0X2ZyZWVfcmluZzoKKwl2bHNpX2Rlc3Ryb3lfaHdpZihpZGV2KTsKK2Vycm91dF9pcnE6CisJZnJlZV9pcnEobmRldi0+aXJxLG5kZXYpOworZXJyb3V0X2lvOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMoaWRldi0+cGRldik7CitlcnJvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2bHNpX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXZsc2lfaXJkYV9kZXZfdCAqaWRldiA9IG5kZXYtPnByaXY7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCisJaWYgKGlkZXYtPmlybGFwKQorCQlpcmxhcF9jbG9zZShpZGV2LT5pcmxhcCk7CisJaWRldi0+aXJsYXAgPSBOVUxMOworCisJdmxzaV9zdG9wX2h3KGlkZXYpOworCisJdmxzaV9kZXN0cm95X2h3aWYoaWRldik7CisKKwlmcmVlX2lycShuZGV2LT5pcnEsbmRldik7CisKKwlwY2lfcmVsZWFzZV9yZWdpb25zKGlkZXYtPnBkZXYpOworCisJSVJEQV9NRVNTQUdFKCIlczogZGV2aWNlICVzIHN0b3BwZWRcbiIsIF9fRlVOQ1RJT05fXywgbmRldi0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2bHNpX2lyZGFfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwl2bHNpX2lyZGFfZGV2X3QgKmlkZXYgPSBuZGV2LT5wcml2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaWRldi0+cGRldjsKKworCVNFVF9NT0RVTEVfT1dORVIobmRldik7CisKKwluZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJbmRldi0+YmFzZV9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsMCk7CisKKwkvKiBQQ0kgYnVzbWFzdGVyaW5nCisJICogc2VlIGluY2x1ZGUgZmlsZSBmb3IgZGV0YWlscyB3aHkgd2UgbmVlZCB0aGVzZSAyIG1hc2tzLCBpbiB0aGlzIG9yZGVyIQorCSAqLworCisJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldixETUFfTUFTS19VU0VEX0JZX0hXKQorCSAgICB8fCBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsRE1BX01BU0tfTVNUUlBBR0UpKSB7CisJCUlSREFfRVJST1IoIiVzOiBhYm9ydGluZyBkdWUgdG8gUENJIEJNLURNQSBhZGRyZXNzIGxpbWl0YXRpb25zXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLTE7CisJfQorCisJaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcygmaWRldi0+cW9zKTsKKworCS8qIHRoZSBWTFNJODJDMTQ3IGRvZXMgbm90IHN1cHBvcnQgNTc2MDAwISAqLworCisJaWRldi0+cW9zLmJhdWRfcmF0ZS5iaXRzID0gSVJfMjQwMCB8IElSXzk2MDAKKwkJfCBJUl8xOTIwMCB8IElSXzM4NDAwIHwgSVJfNTc2MDAgfCBJUl8xMTUyMDAKKwkJfCBJUl8xMTUyMDAwIHwgKElSXzQwMDAwMDAgPDwgOCk7CisKKwlpZGV2LT5xb3MubWluX3R1cm5fdGltZS5iaXRzID0gcW9zX210dF9iaXRzOworCisJaXJkYV9xb3NfYml0c190b192YWx1ZSgmaWRldi0+cW9zKTsKKworCS8qIGN1cnJlbnRseSBubyBwdWJsaWMgbWVkaWEgZGVmaW5pdGlvbnMgZm9yIElyREEgKi8KKworCW5kZXYtPmZsYWdzIHw9IElGRl9QT1JUU0VMIHwgSUZGX0FVVE9NRURJQTsKKwluZGV2LT5pZl9wb3J0ID0gSUZfUE9SVF9VTktOT1dOOworIAorCW5kZXYtPm9wZW4JICAgICAgPSB2bHNpX29wZW47CisJbmRldi0+c3RvcAkgICAgICA9IHZsc2lfY2xvc2U7CisJbmRldi0+Z2V0X3N0YXRzCSAgICAgID0gdmxzaV9nZXRfc3RhdHM7CisJbmRldi0+aGFyZF9zdGFydF94bWl0ID0gdmxzaV9oYXJkX3N0YXJ0X3htaXQ7CisJbmRldi0+ZG9faW9jdGwJICAgICAgPSB2bHNpX2lvY3RsOworCW5kZXYtPnR4X3RpbWVvdXQgICAgICA9IHZsc2lfdHhfdGltZW91dDsKKwluZGV2LT53YXRjaGRvZ190aW1lbyAgPSA1MDAqSFovMTAwMDsJLyogbWF4LiBhbGxvd2VkIHR1cm4gdGltZSBmb3IgSXJMQVAgKi8KKworCVNFVF9ORVRERVZfREVWKG5kZXYsICZwZGV2LT5kZXYpOworCisJcmV0dXJuIDA7Cit9CQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0Cit2bHNpX2lyZGFfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZQkqbmRldjsKKwl2bHNpX2lyZGFfZGV2X3QJCSppZGV2OworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlnb3RvIG91dDsKKwllbHNlCisJCXBkZXYtPmN1cnJlbnRfc3RhdGUgPSAwOyAvKiBodyBtdXN0IGJlIHJ1bm5pbmcgbm93ICovCisKKwlJUkRBX01FU1NBR0UoIiVzOiBJckRBIFBDSSBjb250cm9sbGVyICVzIGRldGVjdGVkXG4iLAorCQkgICAgIGRyaXZlcm5hbWUsIFBDSURFVl9OQU1FKHBkZXYpKTsKKworCWlmICggIXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LDApCisJICAgICB8fCAhKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LDApICYgSU9SRVNPVVJDRV9JTykgKSB7CisJCUlSREFfRVJST1IoIiVzOiBiYXIgMCBpbnZhbGlkIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXRfZGlzYWJsZTsKKwl9CisKKwluZGV2ID0gYWxsb2NfaXJkYWRldihzaXplb2YoKmlkZXYpKTsKKwlpZiAobmRldj09TlVMTCkgeworCQlJUkRBX0VSUk9SKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGRldmljZSBtZW1vcnkuXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXRfZGlzYWJsZTsKKwl9CisKKwlpZGV2ID0gbmRldi0+cHJpdjsKKworCXNwaW5fbG9ja19pbml0KCZpZGV2LT5sb2NrKTsKKwlpbml0X01VVEVYKCZpZGV2LT5zZW0pOworCWRvd24oJmlkZXYtPnNlbSk7CisJaWRldi0+cGRldiA9IHBkZXY7CisKKwlpZiAodmxzaV9pcmRhX2luaXQobmRldikgPCAwKQorCQlnb3RvIG91dF9mcmVlZGV2OworCisJaWYgKHJlZ2lzdGVyX25ldGRldihuZGV2KSA8IDApIHsKKwkJSVJEQV9FUlJPUigiJXM6IHJlZ2lzdGVyX25ldGRldiBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0X2ZyZWVkZXY7CisJfQorCisJaWYgKHZsc2lfcHJvY19yb290ICE9IE5VTEwpIHsKKwkJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CisKKwkJZW50ID0gY3JlYXRlX3Byb2NfZW50cnkobmRldi0+bmFtZSwgU19JRlJFR3xTX0lSVUdPLCB2bHNpX3Byb2Nfcm9vdCk7CisJCWlmICghZW50KSB7CisJCQlJUkRBX1dBUk5JTkcoIiVzOiBmYWlsZWQgdG8gY3JlYXRlIHByb2MgZW50cnlcbiIsCisJCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQl9IGVsc2UgeworCQkJZW50LT5kYXRhID0gbmRldjsKKwkJCWVudC0+cHJvY19mb3BzID0gVkxTSV9QUk9DX0ZPUFM7CisJCQllbnQtPnNpemUgPSAwOworCQl9CisJCWlkZXYtPnByb2NfZW50cnkgPSBlbnQ7CisJfQorCUlSREFfTUVTU0FHRSgiJXM6IHJlZ2lzdGVyZWQgZGV2aWNlICVzXG4iLCBkcml2ZXJuYW1lLCBuZGV2LT5uYW1lKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBuZGV2KTsKKwl1cCgmaWRldi0+c2VtKTsKKworCXJldHVybiAwOworCitvdXRfZnJlZWRldjoKKwl1cCgmaWRldi0+c2VtKTsKKwlmcmVlX25ldGRldihuZGV2KTsKK291dF9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK291dDoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB2bHNpX2lyZGFfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXZsc2lfaXJkYV9kZXZfdCAqaWRldjsKKworCWlmICghbmRldikgeworCQlJUkRBX0VSUk9SKCIlczogbG9zdCBuZXRkZXZpY2U/XG4iLCBkcml2ZXJuYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOworCisJaWRldiA9IG5kZXYtPnByaXY7CisJZG93bigmaWRldi0+c2VtKTsKKwlpZiAoaWRldi0+cHJvY19lbnRyeSkgeworCQlyZW1vdmVfcHJvY19lbnRyeShuZGV2LT5uYW1lLCB2bHNpX3Byb2Nfcm9vdCk7CisJCWlkZXYtPnByb2NfZW50cnkgPSBOVUxMOworCX0KKwl1cCgmaWRldi0+c2VtKTsKKworCWZyZWVfbmV0ZGV2KG5kZXYpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJSVJEQV9NRVNTQUdFKCIlczogJXMgcmVtb3ZlZFxuIiwgZHJpdmVybmFtZSwgUENJREVWX05BTUUocGRldikpOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKKy8qIFRoZSBDb250cm9sbGVyIGRvZXNuJ3QgcHJvdmlkZSBQQ0kgUE0gY2FwYWJpbGl0aWVzIGFzIGRlZmluZWQgYnkgUENJIHNwZWNzLgorICogU29tZSBvZiB0aGUgTGludXggUENJLVBNIGNvZGUgaG93ZXZlciBkZXBlbmRzIG9uIHRoaXMsIGZvciBleGFtcGxlIGluCisgKiBwY2lfc2V0X3Bvd2VyX3N0YXRlKCkuIFNvIHdlIGhhdmUgdG8gdGFrZSBjYXJlIHRvIHBlcmZvcm0gdGhlIHJlcXVpcmVkCisgKiBvcGVyYXRpb25zIG9uIG91ciBvd24gKHBhcnRpY3VsYXJseSByZWZsZWN0aW5nIHRoZSBwZGV2LT5jdXJyZW50X3N0YXRlKQorICogb3RoZXJ3aXNlIHdlIG1pZ2h0IGdldCBjaGVhdGVkIGJ5IHBjaS1wbS4KKyAqLworCisKK3N0YXRpYyBpbnQgdmxzaV9pcmRhX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2bHNpX2lyZGFfZGV2X3QgKmlkZXY7CisKKwlpZiAoc3RhdGUgPCAxIHx8IHN0YXRlID4gMyApIHsKKwkJSVJEQV9FUlJPUigiJXMgLSAlczogaW52YWxpZCBwbSBzdGF0ZSByZXF1ZXN0OiAldVxuIiwKKwkJCSAgIF9fRlVOQ1RJT05fXywgUENJREVWX05BTUUocGRldiksIHN0YXRlKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghbmRldikgeworCQlJUkRBX0VSUk9SKCIlcyAtICVzOiBubyBuZXRkZXZpY2UgXG4iLAorCQkJICAgX19GVU5DVElPTl9fLCBQQ0lERVZfTkFNRShwZGV2KSk7CisJCXJldHVybiAwOworCX0KKwlpZGV2ID0gbmRldi0+cHJpdjsJCisJZG93bigmaWRldi0+c2VtKTsKKwlpZiAocGRldi0+Y3VycmVudF9zdGF0ZSAhPSAwKSB7CQkJLyogYWxyZWFkeSBzdXNwZW5kZWQgKi8KKwkJaWYgKHN0YXRlID4gcGRldi0+Y3VycmVudF9zdGF0ZSkgewkvKiBzaW1wbHkgZ28gZGVlcGVyICovCisJCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsc3RhdGUpOworCQkJcGRldi0+Y3VycmVudF9zdGF0ZSA9IHN0YXRlOworCQl9CisJCWVsc2UKKwkJCUlSREFfRVJST1IoIiVzIC0gJXM6IGludmFsaWQgc3VzcGVuZCByZXF1ZXN0ICV1IC0+ICV1XG4iLCBfX0ZVTkNUSU9OX18sIFBDSURFVl9OQU1FKHBkZXYpLCBwZGV2LT5jdXJyZW50X3N0YXRlLCBzdGF0ZSk7CisJCXVwKCZpZGV2LT5zZW0pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobmV0aWZfcnVubmluZyhuZGV2KSkgeworCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5kZXYpOworCQl2bHNpX3N0b3BfaHcoaWRldik7CisJCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCQlpZiAoIWlkZXYtPm5ld19iYXVkKQorCQkJLyogcmVtZW1iZXIgc3BlZWQgc2V0dGluZ3MgdG8gcmVzdG9yZSBvbiByZXN1bWUgKi8KKwkJCWlkZXYtPm5ld19iYXVkID0gaWRldi0+YmF1ZDsKKwl9CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsc3RhdGUpOworCXBkZXYtPmN1cnJlbnRfc3RhdGUgPSBzdGF0ZTsKKwlpZGV2LT5yZXN1bWVfb2sgPSAxOworCXVwKCZpZGV2LT5zZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZsc2lfaXJkYV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdmxzaV9pcmRhX2Rldl90CSppZGV2OworCisJaWYgKCFuZGV2KSB7CisJCUlSREFfRVJST1IoIiVzIC0gJXM6IG5vIG5ldGRldmljZSBcbiIsCisJCQkgICBfX0ZVTkNUSU9OX18sIFBDSURFVl9OQU1FKHBkZXYpKTsKKwkJcmV0dXJuIDA7CisJfQorCWlkZXYgPSBuZGV2LT5wcml2OwkKKwlkb3duKCZpZGV2LT5zZW0pOworCWlmIChwZGV2LT5jdXJyZW50X3N0YXRlID09IDApIHsKKwkJdXAoJmlkZXYtPnNlbSk7CisJCUlSREFfV0FSTklORygiJXMgLSAlczogYWxyZWFkeSByZXN1bWVkXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18sIFBDSURFVl9OQU1FKHBkZXYpKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgMCk7CisJcGRldi0+Y3VycmVudF9zdGF0ZSA9IDA7CisKKwlpZiAoIWlkZXYtPnJlc3VtZV9vaykgeworCQkvKiBzaG91bGQgYmUgb2Jzb2xldGUgbm93IC0gYnV0IHVzZWQgdG8gaGFwcGVuIGR1ZSB0bzoKKwkJICogLSBwY2kgbGF5ZXIgaW5pdGlhbGx5IHNldHRpbmcgcGRldi0+Y3VycmVudF9zdGF0ZSA9IDQgKHVua25vd24pCisJCSAqIC0gcGNpIGxheWVyIGRpZCBub3Qgd2FsayB0aGUgc2F2ZV9zdGF0ZS10cmVlIChtaWdodCBiZSBBUE0gcHJvYmxlbSkKKwkJICogICBzbyB3ZSBjb3VsZCBub3QgcmVmdXNlIHRvIHN1c3BlbmQgZnJvbSB1bmRlZmluZWQgc3RhdGUKKwkJICogLSB2bHNpX2lyZGFfc3VzcGVuZCBkZXRlY3RlZCBpbnZhbGlkIHN0YXRlIGFuZCByZWZ1c2VkIHRvIHNhdmUKKwkJICogICBjb25maWd1cmF0aW9uIGZvciByZXN1bWUgLSBidXQgd2FzIHRvbyBsYXRlIHRvIHN0b3Agc3VzcGVuZGluZworCQkgKiAtIHZsc2lfaXJkYV9yZXN1bWUgZ290IHNjcmV3ZWQgd2hlbiB0cnlpbmcgdG8gcmVzdW1lIGZyb20gZ2FyYmFnZQorCQkgKgorCQkgKiBub3cgd2UgZXhwbGljaXRseSBzZXQgcGRldi0+Y3VycmVudF9zdGF0ZSA9IDAgYWZ0ZXIgZW5hYmxpbmcgdGhlCisJCSAqIGRldmljZSBhbmQgaW5kZXBlbmRlbnRseSByZXN1bWVfb2sgc2hvdWxkIGNhdGNoIGFueSBnYXJiYWdlIGNvbmZpZy4KKwkJICovCisJCUlSREFfV0FSTklORygiJXMgLSBobSwgbm90aGluZyB0byByZXN1bWU/XG4iLCBfX0ZVTkNUSU9OX18pOworCQl1cCgmaWRldi0+c2VtKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG5ldGlmX3J1bm5pbmcobmRldikpIHsKKwkJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJCXZsc2lfc3RhcnRfaHcoaWRldik7CisJCW5ldGlmX2RldmljZV9hdHRhY2gobmRldik7CisJfQorCWlkZXYtPnJlc3VtZV9vayA9IDA7CisJdXAoJmlkZXYtPnNlbSk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHZsc2lfaXJkYV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gZHJpdmVybmFtZSwKKwkuaWRfdGFibGUJPSB2bHNpX2lyZGFfdGFibGUsCisJLnByb2JlCQk9IHZsc2lfaXJkYV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHZsc2lfaXJkYV9yZW1vdmUpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gdmxzaV9pcmRhX3N1c3BlbmQsCisJLnJlc3VtZQkJPSB2bHNpX2lyZGFfcmVzdW1lLAorI2VuZGlmCit9OworCisjZGVmaW5lIFBST0NfRElSICgiZHJpdmVyLyIgRFJJVkVSX05BTUUpCisKK3N0YXRpYyBpbnQgX19pbml0IHZsc2lfbW9kX2luaXQodm9pZCkKK3sKKwlpbnQJaSwgcmV0OworCisJaWYgKGNsa3NyYyA8IDAgIHx8ICBjbGtzcmMgPiAzKSB7CisJCUlSREFfRVJST1IoIiVzOiBpbnZhbGlkIGNsa3NyYz0lZFxuIiwgZHJpdmVybmFtZSwgY2xrc3JjKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJc3dpdGNoKHJpbmdzaXplW2ldKSB7CisJCQljYXNlIDQ6CisJCQljYXNlIDg6CisJCQljYXNlIDE2OgorCQkJY2FzZSAzMjoKKwkJCWNhc2UgNjQ6CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUlSREFfV0FSTklORygiJXM6IGludmFsaWQgJXMgcmluZ3NpemUgJWQsIHVzaW5nIGRlZmF1bHQ9OCIsIGRyaXZlcm5hbWUsIChpKT8icngiOiJ0eCIsIHJpbmdzaXplW2ldKTsKKwkJCQlyaW5nc2l6ZVtpXSA9IDg7CisJCQkJYnJlYWs7CisJCX0KKwl9IAorCisJc2lycHVsc2UgPSAhIXNpcnB1bHNlOworCisJLyogY3JlYXRlX3Byb2NfZW50cnkgcmV0dXJucyBOVUxMIGlmICFDT05GSUdfUFJPQ19GUy4KKwkgKiBGYWlsdXJlIHRvIGNyZWF0ZSB0aGUgcHJvY2ZzIGVudHJ5IGlzIGhhbmRsZWQgbGlrZSBydW5uaW5nCisJICogd2l0aG91dCBwcm9jZnMgLSBpdCdzIG5vdCByZXF1aXJlZCBmb3IgdGhlIGRyaXZlciB0byB3b3JrLgorCSAqLworCXZsc2lfcHJvY19yb290ID0gY3JlYXRlX3Byb2NfZW50cnkoUFJPQ19ESVIsIFNfSUZESVIsIE5VTEwpOworCWlmICh2bHNpX3Byb2Nfcm9vdCkgeworCQkvKiBwcm90ZWN0IHJlZ2lzdGVyZWQgcHJvY2RpciBhZ2FpbnN0IG1vZHVsZSByZW1vdmFsLgorCQkgKiBCZWNhdXNlIHdlIGFyZSBpbiB0aGUgbW9kdWxlIGluaXQgcGF0aCB0aGVyZSdzIG5vIHJhY2UKKwkJICogd2luZG93IGFmdGVyIGNyZWF0ZV9wcm9jX2VudHJ5IChhbmQgbm8gYmFycmllciBuZWVkZWQpLgorCQkgKi8KKwkJdmxzaV9wcm9jX3Jvb3QtPm93bmVyID0gVEhJU19NT0RVTEU7CisJfQorCisJcmV0ID0gcGNpX21vZHVsZV9pbml0KCZ2bHNpX2lyZGFfZHJpdmVyKTsKKworCWlmIChyZXQgJiYgdmxzaV9wcm9jX3Jvb3QpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRElSLCBOVUxMKTsKKwlyZXR1cm4gcmV0OworCit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB2bHNpX21vZF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ2bHNpX2lyZGFfZHJpdmVyKTsKKwlpZiAodmxzaV9wcm9jX3Jvb3QpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfRElSLCBOVUxMKTsKK30KKworbW9kdWxlX2luaXQodmxzaV9tb2RfaW5pdCk7Cittb2R1bGVfZXhpdCh2bHNpX21vZF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5oIGIvZHJpdmVycy9uZXQvaXJkYS92bHNpX2lyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0Njk0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5oCkBAIC0wLDAgKzEsNzk4IEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgl2bHNpX2lyLmg6CVZMU0k4MkMxNDcgUENJIElyREEgY29udHJvbGxlciBkcml2ZXIgZm9yIExpbnV4CisgKgorICoJVmVyc2lvbjoJMC41CisgKgorICoJQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMgTWFydGluIERpZWhsCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICoJcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKgl0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgCisgKglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIAorICoJTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgSVJEQV9WTFNJX0ZJUl9ICisjZGVmaW5lIElSREFfVkxTSV9GSVJfSAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBjb21wYXRpYmlsaXR5IHN0dWZmCisgKi8KKworLyogZGVmaW5pdGlvbnMgbm90IHByZXNlbnQgaW4gcGNpX2lkcy5oICovCisKKyNpZm5kZWYgUENJX0NMQVNTX1dJUkVMRVNTX0lSREEKKyNkZWZpbmUgUENJX0NMQVNTX1dJUkVMRVNTX0lSREEJCTB4MGQwMAorI2VuZGlmCisKKyNpZm5kZWYgUENJX0NMQVNTX1NVQkNMQVNTX01BU0sKKyNkZWZpbmUgUENJX0NMQVNTX1NVQkNMQVNTX01BU0sJCTB4ZmZmZgorI2VuZGlmCisKKy8qIGluIHJlY2VudCAyLjUgaW50ZXJydXB0IGhhbmRsZXJzIGhhdmUgbm9uLXZvaWQgcmV0dXJuIHZhbHVlICovCisjaWZuZGVmIElSUV9SRVRWQUwKK3R5cGVkZWYgdm9pZCBpcnFyZXR1cm5fdDsKKyNkZWZpbmUgSVJRX05PTkUKKyNkZWZpbmUgSVJRX0hBTkRMRUQKKyNkZWZpbmUgSVJRX1JFVFZBTCh4KQorI2VuZGlmCisKKy8qIHNvbWUgc3R1ZmYgbmVlZCB0byBjaGVjayBrZXJuZWx2ZXJzaW9uLiBOb3QgYWxsIDIuNSBzdHVmZiB3YXMgcHJlc2VudAorICogaW4gZWFybHkgMi41LnggLSB0aGUgdGVzdCBpcyBtZXJlbHkgdG8gc2VwYXJhdGUgMi40IGZyb20gMi41CisgKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKworLyogUERFKCkgaW50cm9kdWNlZCBpbiAyLjUuNCAqLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisjZGVmaW5lIFBERShpbm9kZSkgKChpbm9kZSktPnUuZ2VuZXJpY19pcCkKKyNlbmRpZgorCisvKiBpcmRhIGNyYzE2IGNhbGN1bGF0aW9uIGV4cG9ydGVkIGluIDIuNS40MiAqLworI2RlZmluZSBpcmRhX2NhbGNfY3JjMTYoZmNzLGJ1ZixsZW4pCShHT09EX0ZDUykKKworLyogd2UgdXNlIHRoaXMgZm9yIHVuaWZpZWQgcGNpIGRldmljZSBuYW1lIGFjY2VzcyAqLworI2RlZmluZSBQQ0lERVZfTkFNRShwZGV2KQkoKHBkZXYpLT5uYW1lKQorCisjZWxzZSAvKiAyLjUgb3IgbGF0ZXIgKi8KKworLyogcmVjZW50IDIuNS8yLjYgc3RvcmVzIHBjaSBkZXZpY2UgbmFtZXMgYXQgdmFyeWluZyBwbGFjZXMgOy0pICovCisjaWZkZWYgQ09ORklHX1BDSV9OQU1FUworLyogaHVtYW4gcmVhZGFibGUgbmFtZSAqLworI2RlZmluZSBQQ0lERVZfTkFNRShwZGV2KQkoKHBkZXYpLT5wcmV0dHlfbmFtZSkKKyNlbHNlCisvKiB3aGF0ZXZlciB3ZSBnZXQgZnJvbSB0aGUgYXNzb2NpYXRlZCBzdHJ1Y3QgZGV2aWNlIC0gYnVzOnNsb3Q6ZGV2LmZuIGlkICovCisjZGVmaW5lIFBDSURFVl9OQU1FKHBkZXYpCShwY2lfbmFtZShwZGV2KSkKKyNlbmRpZgorCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBub24tc3RhbmRhcmQgUENJIHJlZ2lzdGVycyAqLworCitlbnVtIHZsc2lfcGNpX3JlZ3MgeworCVZMU0lfUENJX0NMS0NUTAkJPSAweDQwLAkJLyogY2hpcCBjbG9jayBpbnB1dCBjb250cm9sICovCisJVkxTSV9QQ0lfTVNUUlBBR0UJPSAweDQxLAkJLyogYWRkciBbMzE6MjRdIGZvciBhbGwgYnVzbWFzdGVyIGN5Y2xlcyAqLworCVZMU0lfUENJX0lSTUlTQwkJPSAweDQyCQkvKiBtYWlubHkgbGVnYWN5IFVBUlQgcmVsYXRlZCAqLworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFZMU0lfUENJX0NMS0NUTDogQ2xvY2sgQ29udHJvbCBSZWdpc3RlciAodTgsIHJ3KSAqLworCisvKiBUaHJlZSBwb3NzaWJsZSBjbG9jayBzb3VyY2VzOiBlaXRoZXIgb24tY2hpcCA0OE1IeiBQTEwgb3IKKyAqIGV4dGVybmFsIGNsb2NrIGFwcGxpZWQgdG8gRVhUQ0xLIHBpbi4gRXh0ZXJuYWwgY2xvY2sgbWF5CisgKiBiZSBlaXRoZXIgNDhNSHogb3IgNDBNSHosIHdoaWNoIGlzIGluZGljYXRlZCBieSBYQ0tTRUwuCisgKiBDTEtTVFAgY29udHJvbHMgd2hldGhlciB0aGUgc2VsZWN0ZWQgY2xvY2sgc291cmNlIGdldHMKKyAqIGNvbm5lY3RlZCB0byB0aGUgSXJEQSBibG9jay4KKyAqCisgKiBPbiBteSBIUCBPQi04MDAgdGhlIEJJT1Mgc2V0cyBleHRlcm5hbCA0ME1IeiBjbG9jayBhcyBzb3VyY2UKKyAqIHdoZW4gSXJEQSBlbmFibGVkIGFuZCBJJ3ZlIG5ldmVyIGRldGVjdGVkIGFueSBQTEwgbG9jayBzdWNjZXNzLgorICogQXBwYXJlbnRseSB0aGUgMTQuMy4uLk1IeiBPU0MgaW5wdXQgcmVxdWlyZWQgZm9yIHRoZSBQTEwgdG8gd29yaworICogaXMgbm90IGNvbm5lY3RlZCBhbmQgdGhlIDQwTUh6IEVYVENMSyBpcyBwcm92aWRlZCBleHRlcm5hbGx5LgorICogQXQgbGVhc3QgdGhpcyBpcyB3aGF0IG1ha2VzIHRoZSBkcml2ZXIgd29ya2luZyBmb3IgbWUuCisgKi8KKworZW51bSB2bHNpX3BjaV9jbGtjdGwgeworCisJLyogUExMIGNvbnRyb2wgKi8KKworCUNMS0NUTF9QRF9JTlYJCT0gMHgwNCwJCS8qIFBEIzogaW52ZXJ0ZWQgcG93ZXIgZG93biBzaWduYWwsCisJCQkJCQkgKiBpLmUuIFBMTCBpcyBwb3dlcmVkLCBpZiBQRF9JTlYgc2V0ICovCisJQ0xLQ1RMX0xPQ0sJCT0gMHg0MCwJCS8qIChybykgc2V0LCBpZiBQTEwgaXMgbG9ja2VkICovCisKKwkvKiBjbG9jayBzb3VyY2Ugc2VsZWN0aW9uICovCisKKwlDTEtDVExfRVhUQ0xLCQk9IDB4MjAsCQkvKiBzZXQgdG8gc2VsZWN0IGV4dGVybmFsIGNsb2NrIGlucHV0LCBub3QgUExMICovCisJQ0xLQ1RMX1hDS1NFTAkJPSAweDEwLAkJLyogc2V0IHRvIGluZGljYXRlIEVYVENMSyBpcyA0ME1Ieiwgbm90IDQ4TUh6ICovCisKKwkvKiBJckRBIGJsb2NrIGNvbnRyb2wgKi8KKworCUNMS0NUTF9DTEtTVFAJCT0gMHg4MCwJCS8qIHNldCB0byBkaXNjb25uZWN0IGZyb20gc2VsZWN0ZWQgY2xvY2sgc291cmNlICovCisJQ0xLQ1RMX1dBS0UJCT0gMHgwOAkJLyogc2V0IHRvIGVuYWJsZSB3YWtldXAgZmVhdHVyZTogd2hlbmV2ZXIgSVIgYWN0aXZpdHkKKwkJCQkJCSAqIGlzIGRldGVjdGVkLCBQRF9JTlYgZ2V0cyBzZXQoPykgYW5kIENMS1NUUCBjbGVhcmVkICovCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVkxTSV9QQ0lfTVNUUlBBR0U6IE1hc3RlciBQYWdlIFJlZ2lzdGVyICh1OCwgcncpIGFuZCBidXNtYXN0ZXJpbmcgc3R1ZmYgKi8KKworI2RlZmluZSBETUFfTUFTS19VU0VEX0JZX0hXCTB4ZmZmZmZmZmYKKyNkZWZpbmUgRE1BX01BU0tfTVNUUlBBR0UJMHgwMGZmZmZmZgorI2RlZmluZSBNU1RSUEFHRV9WQUxVRQkJKERNQV9NQVNLX01TVFJQQUdFID4+IDI0KQorCisJLyogUENJIGJ1c21hc3RlcmluZyBpcyBzb21ld2hhdCBzcGVjaWFsIGZvciB0aGlzIGd1eSAtIGluIHNob3J0OgorCSAqCisJICogV2Ugc2VsZWN0IHRvIG9wZXJhdGUgdXNpbmcgZml4ZWQgTVNUUlBBR0U9MCwgdXNlIElTQSBETUEKKwkgKiBhZGRyZXNzIHJlc3RyaWN0aW9ucyB0byBtYWtlIHRoZSBQQ0kgQk0gYXBpIGF3YXJlIG9mIHRoaXMsCisJICogYnV0IGVuc3VyZSB0aGUgaGFyZHdhcmUgaXMgZGVhbGluZyB3aXRoIHJlYWwgMzJiaXQgYWNjZXNzLgorCSAqCisJICogSW4gZGV0YWlsOgorCSAqIFRoZSBjaGlwIGV4ZWN1dGVzIG5vcm1hbCAzMmJpdCBidXNtYXN0ZXIgY3ljbGVzLCBpLmUuCisJICogZHJpdmVzIGFsbCAzMiBhZGRyZXNzIGxpbmVzLiBUaGVzZSBhZGRyZXNzZXMgaG93ZXZlciBhcmUKKwkgKiBjb21wb3NlZCBvZiBbMDoyM10gdGFrZW4gZnJvbSB2YXJpb3VzIGJ1c2FkZHItcG9pbnRlcnMKKwkgKiBhbmQgWzI0OjMxXSB0YWtlbiBmcm9tIHRoZSBNU1RSUEFHRSByZWdpc3RlciBpbiB0aGUgVkxTSTgyQzE0NworCSAqIGNvbmZpZyBzcGFjZS4gVGhlcmVmb3JlIF9hbGxfIGJ1c21hc3RlcmluZyBtdXN0IGJlCisJICogdGFyZ2V0ZWQgdG8vZnJvbSBvbmUgc2luZ2xlIDE2TUIgKGJ1c2FkZHItKSBzdXBlcnBhZ2UhCisJICogVGhlIHBvaW50IGlzIHRvIG1ha2Ugc3VyZSBhbGwgdGhlIGFsbG9jYXRpb25zIGZvciBtZW1vcnkKKwkgKiBsb2NhdGlvbnMgd2l0aCBidXNtYXN0ZXIgYWNjZXNzIChyaW5nIGRlc2NyaXB0b3JzLCBidWZmZXJzKQorCSAqIGFyZSBpbmRlZWQgYnVzLW1hcHBhYmxlIHRvIHRoZSBzYW1lIDE2TUIgcmFuZ2UgKGZvciB4ODYgdGhpcworCSAqIG1lYW5zIHRoZXkgbXVzdCByZXNpZGUgaW4gdGhlIHNhbWUgMTZNQiBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzcworCSAqIHJhbmdlKS4gVGhlIG9ubHkgY29uc3RyYWludCB3ZSBoYXZlIHdoaWNoIHN1cHBvcnRzICJzZXZlcmFsIG9iamVjdHMKKwkgKiBtYXBwYWJsZSB0byBjb21tb24gMTZNQiByYW5nZSIgcGFyYWRpZ21hLCBpcyB0aGUgb2xkIElTQSBETUEKKwkgKiByZXN0cmljdGlvbiB0byB0aGUgZmlyc3QgMTZNQiBvZiBwaHlzaWNhbCBhZGRyZXNzIHJhbmdlLgorCSAqIEhlbmNlIHRoZSBhcHByb2FjaCBoZXJlIGlzIHRvIGVuYWJsZSBQQ0kgYnVzbWFzdGVyIHN1cHBvcnQgdXNpbmcKKwkgKiB0aGUgY29ycmVjdCAzMmJpdCBkbWEtbWFzayB1c2VkIGJ5IHRoZSBjaGlwLiBBZnRlcndhcmRzIHRoZSBkZXZpY2UncworCSAqIGRtYS1tYXNrIGdldHMgcmVzdHJpY3RlZCB0byAyNGJpdCwgd2hpY2ggbXVzdCBiZSBob25vdXJlZCBzb21laG93IGJ5CisJICogYWxsIGFsbG9jYXRpb25zIGZvciBtZW1vcnkgYXJlYXMgdG8gYmUgZXhwb3NlZCB0byB0aGUgY2hpcCAuLi4KKwkgKgorCSAqIE5vdGU6CisJICogRG9uJ3QgYmUgc3VycHJpc2VkIHRvIGdldCAiU2V0dGluZyBsYXRlbmN5IHRpbWVyLi4uIiBtZXNzYWdlcyBldmVyeQorCSAqIHRpbWUgd2hlbiBQQ0kgYnVzbWFzdGVyaW5nIGlzIGVuYWJsZWQgZm9yIHRoZSBjaGlwLgorCSAqIFRoZSBjaGlwIGhhcyBpdHMgUENJIGxhdGVuY3kgdGltZXIgUk8gZml4ZWQgYXQgMCAtIHdoaWNoIGlzIG5vdCBhCisJICogcHJvYmxlbSBoZXJlLCBiZWNhdXNlIGl0IGlzIG5ldmVyIHJlcXVlc3RpbmcgX2J1cnN0XyB0cmFuc2FjdGlvbnMuCisJICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBWTFNJX1BDSUlSTUlTQzogSVIgTWlzY2VsbGFuZW91cyBSZWdpc3RlciAodTgsIHJ3KSAqLworCisvKiBsZWdhY3kgVUFSVCBlbXVsYXRpb24gLSBub3QgdXNlZCBieSB0aGlzIGRyaXZlciAtIHdvdWxkIHJlcXVpcmU6CisgKiAoc2VlIGJlbG93IGZvciBzb21lIHJlZ2lzdGVyLXZhbHVlIGRlZmluaXRpb25zKQorICoKKyAqCS0gSVJNSVNDX1VBUlRFTiBtdXN0IGJlIHNldCB0byBlbmFibGUgVUFSVCBhZGRyZXNzIGRlY29kaW5nCisgKgktIElSTUlTQ19VQVJUU0VMIGNvbmZpZ3VyZWQKKyAqCS0gSVJDRkdfTUFTVEVSIG11c3QgYmUgY2xlYXJlZAorICoJLSBJUkNGR19TSVIgbXVzdCBiZSBzZXQKKyAqCS0gSVJFTkFCTEVfUEhZQU5EQ0xPQ0sgbXVzdCBiZSBhc3NlcnRlZCAwLT4xIChhbmQgaGVuY2UgSVJFTkFCTEVfU0lSX09OKQorICovCisKK2VudW0gdmxzaV9wY2lfaXJtaXNjIHsKKworCS8qIElSIHRyYW5zY2VpdmVyIGNvbnRyb2wgKi8KKworCUlSTUlTQ19JUlJBSUwJCT0gMHg0MCwJCS8qIChybz8pIElSIHJhaWwgcG93ZXIgaW5kaWNhdGlvbiAoYW5kIGNvbnRyb2w/KQorCQkJCQkJICogMD0zLjNWIC8gMT01Vi4gUHJvYmFibHkgc2V0IGR1cmluZyBwb3dlci1vbj8KKwkJCQkJCSAqIHVuY2xlYXIgLSBub3QgdG91Y2hlZCBieSBkcml2ZXIgKi8KKwlJUk1JU0NfSVJQRAkJPSAweDA4LAkJLyogdHJhbnNjZWl2ZXIgcG93ZXIgZG93biwgaWYgc2V0ICovCisKKwkvKiBsZWdhY3kgVUFSVCBjb250cm9sICovCisKKwlJUk1JU0NfVUFSVFRTVAkJPSAweDgwLAkJLyogVUFSVCB0ZXN0IG1vZGUgLSAiYWx3YXlzIHdyaXRlIDAiICovCisJSVJNSVNDX1VBUlRFTgkJPSAweDA0LAkJLyogZW5hYmxlIFVBUlQgYWRkcmVzcyBkZWNvZGluZyAqLworCisJLyogYml0cyBbMTowXSBJUk1JU0NfVUFSVFNFTCB0byBzZWxlY3QgbGVnYWN5IFVBUlQgYWRkcmVzcyAqLworCisJSVJNSVNDX1VBUlRTRUxfM2Y4CT0gMHgwMCwKKwlJUk1JU0NfVUFSVFNFTF8yZjgJPSAweDAxLAorCUlSTUlTQ19VQVJUU0VMXzNlOAk9IDB4MDIsCisJSVJNSVNDX1VBUlRTRUxfMmU4CT0gMHgwMworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiByZWdpc3RlcnMgbWFwcGVkIHRvIDMyIGJ5dGUgUENJIElPIHNwYWNlICovCisKKy8qIG5vdGU6IGJldHRlciBhY2Nlc3MgYWxsIHJlZ2lzdGVycyBhdCB0aGUgaW5kaWNhdGVkIHU4L3UxNiBzaXplCisgKgkgYWx0aG91Z2ggc29tZSBvZiB0aGVtIGNvbnRhaW4gb25seSAxIGJ5dGUgb2YgaW5mb3JtYXRpb24uCisgKgkgc29tZSBvZiB0aGVtIChwYXJ0aWNhbHVhcmx5IFBST01QVCBhbmQgSVJDRkcpIGlnbm9yZQorICoJIGFjY2VzcyB3aGVuIHVzaW5nIHRoZSB3cm9uZyBhZGRyZXNzaW5nIG1vZGUhCisgKi8KKworZW51bSB2bHNpX3Bpb19yZWdzIHsKKwlWTFNJX1BJT19JUklOVFIJCT0gMHgwMCwJCS8qIGludGVycnVwdCBlbmFibGUvcmVxdWVzdCAodTgsIHJ3KSAqLworCVZMU0lfUElPX1JJTkdQVFIJPSAweDAyLAkJLyogcngvdHggcmluZyBwb2ludGVyICh1MTYsIHJvKSAqLworCVZMU0lfUElPX1JJTkdCQVNFCT0gMHgwNCwJCS8qIFsyMzoxMF0gb2YgcmluZyBhZGRyZXNzICh1MTYsIHJ3KSAqLworCVZMU0lfUElPX1JJTkdTSVpFCT0gMHgwNiwJCS8qIHJ4L3R4IHJpbmcgc2l6ZSAodTE2LCBydykgKi8KKwlWTFNJX1BJT19QUk9NUFQJCT0gMHgwOCwgCS8qIHRyaWdnZXJzIHJpbmcgcHJvY2Vzc2luZyAodTE2LCB3bykgKi8KKwkvKiAweDBhLTB4MGY6IHJlc2VydmVkIC8gZHVwbGljYXRlZCBVQVJUIHJlZ3MgKi8KKwlWTFNJX1BJT19JUkNGRwkJPSAweDEwLAkJLyogY29uZmlndXJhdGlvbiBzZWxlY3QgKHUxNiwgcncpICovCisJVkxTSV9QSU9fU0lSRkxBRwk9IDB4MTIsCQkvKiBCT0YvRU9GIGZvciBmaWx0ZXJlZCBTSVIgKHUxNiwgcm8pICovCisJVkxTSV9QSU9fSVJFTkFCTEUJPSAweDE0LAkJLyogZW5hYmxlIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKHUxNiwgcncvcm8pICovCisJVkxTSV9QSU9fUEhZQ1RMCQk9IDB4MTYsCQkvKiBwaHlzaWNhbCBsYXllciBjdXJyZW50IHN0YXR1cyAodTE2LCBybykgKi8KKwlWTFNJX1BJT19OUEhZQ1RMCT0gMHgxOCwJCS8qIG5leHQgcGh5c2ljYWwgbGF5ZXIgc2VsZWN0ICh1MTYsIHJ3KSAqLworCVZMU0lfUElPX01BWFBLVAkJPSAweDFhLAkJLyogWzExOjBdIG1heCBsZW4gZm9yIHBhY2tldCByZWNlaXZlICh1MTYsIHJ3KSAqLworCVZMU0lfUElPX1JDVkJDTlQJPSAweDFjCQkvKiBjdXJyZW50IHJlY2VpdmUtRklGTyBieXRlIGNvdW50ICh1MTYsIHJvKSAqLworCS8qIDB4MWUtMHgxZjogcmVzZXJ2ZWQgLyBkdXBsaWNhdGVkIFVBUlQgcmVncyAqLworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFZMU0lfUElPX0lSSU5UUjogSW50ZXJydXB0IFJlZ2lzdGVyICh1OCwgcncpICovCisKKy8qIGVuYWJsZS1iaXRzOgorICoJCTEgPSBlbmFibGUgLyAwID0gZGlzYWJsZQorICogaW50ZXJydXB0IGNvbmRpdGlvbiBiaXRzOgorICogCQlzZXQgYWNjb3JkaW5nIHRvIGNvcnJlc3BvbmRpbmcgaW50ZXJydXB0IHNvdXJjZQorICoJCShyZWdhcmRsZXNzIG9mIHRoZSBzdGF0ZSBvZiB0aGUgZW5hYmxlIGJpdHMpCisgKgkJZW5hYmxlIGJpdCBzdGF0dXMgaW5kaWNhdGVzIHdoZXRoZXIgaW50ZXJydXB0IGdldHMgcmFpc2VkCisgKgkJd3JpdGUtdG8tY2xlYXIKKyAqIG5vdGU6IFJQS1RJTlQgYW5kIFRQS1RJTlQgYmVoYXZlIGRpZmZlcmVudCBpbiBsZWdhY3kgVUFSVCBtb2RlICh3aGljaCB3ZSBkb24ndCB1c2UgOi0pCisgKi8KKworZW51bSB2bHNpX3Bpb19pcmludHIgeworCUlSSU5UUl9BQ1RFTgk9IDB4ODAsCS8qIGFjdGl2aXR5IGludGVycnVwdCBlbmFibGUgKi8KKwlJUklOVFJfQUNUSVZJVFkJPSAweDQwLAkvKiBhY3Rpdml0eSBtb25pdG9yICh0cmFmZmljIGRldGVjdGVkKSAqLworCUlSSU5UUl9SUEtURU4JPSAweDIwLAkvKiByZWNlaXZlIHBhY2tldCBpbnRlcnJ1cHQgZW5hYmxlKi8KKwlJUklOVFJfUlBLVElOVAk9IDB4MTAsCS8qIHJ4LXBhY2tldCB0cmFuc2ZlcmVkIGZyb20gZmlmbyB0byBtZW1vcnkgZmluaXNoZWQgKi8KKwlJUklOVFJfVFBLVEVOCT0gMHgwOCwJLyogdHJhbnNtaXQgcGFja2V0IGludGVycnVwdCBlbmFibGUgKi8KKwlJUklOVFJfVFBLVElOVAk9IDB4MDQsCS8qIGxhc3QgYml0IG9mIHR4LXBhY2tldCtjcmMgc2hpZnRlZCB0byBpci1wdWxzZXIgKi8KKwlJUklOVFJfT0VfRU4JPSAweDAyLAkvKiBVQVJUIHJ4IGZpZm8gb3ZlcnJ1biBlcnJvciBpbnRlcnJ1cHQgZW5hYmxlICovCisJSVJJTlRSX09FX0lOVAk9IDB4MDEJLyogVUFSVCByeCBmaWZvIG92ZXJydW4gZXJyb3IgKHJlYWQgTFNSIHRvIGNsZWFyKSAqLworfTsKKworLyogd2UgdXNlIHRoaXMgbWFzayB0byBjaGVjayB3aGV0aGVyIHRoZSAoc2hhcmVkIFBDSSkgaW50ZXJydXB0IGlzIG91cnMgKi8KKworI2RlZmluZSBJUklOVFJfSU5UX01BU0sJCShJUklOVFJfQUNUSVZJVFl8SVJJTlRSX1JQS1RJTlR8SVJJTlRSX1RQS1RJTlQpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBWTFNJX1BJT19SSU5HUFRSOiBSaW5nIFBvaW50ZXIgUmVhZC1CYWNrIFJlZ2lzdGVyICh1MTYsIHJvKSAqLworCisvKiBfYm90aF8gcmluZyBwb2ludGVycyBhcmUgaW5kaWNlcyByZWxhdGl2ZSB0byB0aGUgX2VudGlyZV8gcngsdHgtcmluZyEKKyAqIGkuZS4gdGhlIHJlZmVyZW5jZWQgZGVzY3JpcHRvciBpcyBsb2NhdGVkCisgKiBhdCBSSU5HQkFTRSArIFBUUiAqIHNpemVvZihkZXNjcikgZm9yIHJ4IGFuZCB0eAorICogdGhlcmVmb3JlLCB0aGUgdHgtcG9pbnRlciBoYXMgb2Zmc2V0IE1BWF9SSU5HX0RFU0NSCisgKi8KKworI2RlZmluZSBNQVhfUklOR19ERVNDUgkJNjQJLyogdHgsIHJ4IHJpbmdzIG1heSBjb250YWluIHVwIHRvIDY0IGRlc2NyIGVhY2ggKi8KKworI2RlZmluZSBSSU5HUFRSX1JYX01BU0sJCShNQVhfUklOR19ERVNDUi0xKQorI2RlZmluZSBSSU5HUFRSX1RYX01BU0sJCSgoTUFYX1JJTkdfREVTQ1ItMSk8PDgpCisKKyNkZWZpbmUgUklOR1BUUl9HRVRfUlgocCkJKChwKSZSSU5HUFRSX1JYX01BU0spCisjZGVmaW5lIFJJTkdQVFJfR0VUX1RYKHApCSgoKHApJlJJTkdQVFJfVFhfTUFTSyk+PjgpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBWTFNJX1BJT19SSU5HQkFTRTogUmluZyBQb2ludGVyIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAodTE2LCBybykgKi8KKworLyogQ29udGFpbnMgWzIzOjEwXSBwYXJ0IG9mIHRoZSByaW5nIGJhc2UgKGJ1cy0pIGFkZHJlc3MKKyAqIHdoaWNoIG11c3QgYmUgMWstYWxpbmdlZC4gWzMxOjI0XSBpcyB0YWtlbiBmcm9tCisgKiBWTFNJX1BDSV9NU1RSUEFHRSBhYm92ZS4KKyAqIFRoZSBjb250cm9sbGVyIGluaXRpYXRlcyBub24tYnVyc3QgUENJIEJNIGN5Y2xlcyB0bworICogZmV0Y2ggYW5kIHVwZGF0ZSB0aGUgZGVzY3JpcHRvcnMgaW4gdGhlIHJpbmcuCisgKiBPbmNlIGZldGNoZWQsIHRoZSBkZXNjcmlwdG9yIHJlbWFpbnMgY2FjaGVkIG9uY2hpcAorICogdW50aWwgaXQgZ2V0cyBjbG9zZWQgYW5kIHVwZGF0ZWQgZHVlIHRvIHRoZSByaW5nCisgKiBwcm9jZXNzaW5nIHN0YXRlIG1hY2hpbmUuCisgKiBUaGUgZW50aXJlIHJpbmcgYXJlYSBpcyBzcGxpdCBpbiByeCBhbmQgdHggYXJlYXMgd2l0aCBlYWNoCisgKiBhcmVhIGNvbnNpc3Rpbmcgb2YgNjQgZGVzY3JpcHRvcnMgb2YgOCBieXRlcyBlYWNoLgorICogVGhlIHJ4KHR4KSByaW5nIGlzIGxvY2F0ZWQgYXQgcmluZ2Jhc2UrMCAocmluZ2Jhc2UrNjQqOCkuCisgKi8KKworI2RlZmluZSBCVVNfVE9fUklOR0JBU0UocCkJKCgocCk+PjEwKSYweDNmZmYpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBWTFNJX1BJT19SSU5HU0laRTogUmluZyBTaXplIFJlZ2lzdGVyICh1MTYsIHJ3KSAqLworCisvKiBiaXQgbWFzayB0byBpbmRpY2F0ZSB0aGUgcmluZyBzaXplIHRvIGJlIHVzZWQgZm9yIHJ4IGFuZCB0eC4KKyAqIAlwb3NzaWJsZSB2YWx1ZXMJCWVuY29kZWQgYml0cworICoJCSA0CQkgICAwMDAwCisgKgkJIDgJCSAgIDAwMDEKKyAqCQkxNgkJICAgMDAxMQorICoJCTMyCQkgICAwMTExCisgKgkJNjQJCSAgIDExMTEKKyAqIGxvY2F0ZWQgYXQgWzE1OjEyXSBmb3IgdHggYW5kIFsxMTo4XSBmb3IgcnggKFs3OjBdIHVudXNlZCkKKyAqCisgKiBub3RlOiBwcm9iYWJseSBhIGdvb2QgaWRlYSB0byBoYXZlIElSQ0ZHX01TVFIgY2xlYXJlZCB3aGVuIHdyaXRpbmcKKyAqCSB0aGlzIHNvIHRoZSBzdGF0ZSBtYWNoaW5lcyBhcmUgc3RvcHBlZCBhbmQgdGhlIFJJTkdQVFIgaXMgcmVzZXQhCisgKi8KKworI2RlZmluZSBTSVpFX1RPX0JJVFMobnVtKQkJKCgoKG51bSktMSk+PjIpJjB4MGYpCisjZGVmaW5lIFRYX1JYX1RPX1JJTkdTSVpFKHR4LHJ4KQkoKFNJWkVfVE9fQklUUyh0eCk8PDEyKXwoU0laRV9UT19CSVRTKHJ4KTw8OCkpCisjZGVmaW5lIFJJTkdTSVpFX1RPX1JYU0laRShycykJCSgoKChycykmMHgwZjAwKT4+NikrNCkKKyNkZWZpbmUgUklOR1NJWkVfVE9fVFhTSVpFKHJzKQkJKCgoKHJzKSYweGYwMDApPj4xMCkrNCkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVkxTSV9QSU9fUFJPTVBUOiBSaW5nIFByb21wdGluZyBSZWdpc3RlciAodTE2LCB3cml0ZS10by1zdGFydCkgKi8KKworLyogd3JpdGluZyBhbnkgdmFsdWUga2lja3MgdGhlIHJpbmcgcHJvY2Vzc2luZyBzdGF0ZSBtYWNoaW5lcworICogZm9yIGJvdGggdHgsIHJ4IHJpbmdzIGFzIGZvbGxvd3M6CisgKiAJLSBhY3RpdmUgcmluZ3MgKGN1cnJlbnRseSBvd25pbmcgYW4gYWN0aXZlIGRlc2NyaXB0b3IpCisgKgkgIGlnbm9yZSB0aGUgcHJvbXB0IGFuZCBjb250aW51ZQorICoJLSBpZGxlIHJpbmdzIGZldGNoIHRoZSBuZXh0IGRlc2NyIGZyb20gdGhlIHJpbmcgYW5kIHN0YXJ0CisgKgkgIHRoZWlyIHByb2Nlc3NpbmcKKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVkxTSV9QSU9fSVJDRkc6IElSIENvbmZpZyBSZWdpc3RlciAodTE2LCBydykgKi8KKworLyogbm90ZXM6CisgKgktIG5vdCBtb3JlIHRoYW4gb25lIFNJUi9NSVIvRklSIGJpdCBtdXN0IGJlIHNldCBhdCBhbnkgdGltZQorICoJLSBTSVIsIE1JUiwgRklSIGFuZCBDUkMxNiBzZWxlY3QgdGhlIGNvbmZpZ3VyYXRpb24gd2hpY2ggd2lsbAorICoJICBiZSBhcHBsaWVkIG9uIG5leHQgMC0+MSB0cmFuc2l0aW9uIG9mIElSRU5BQkxFX1BIWUFORENMT0NLIChzZWUgYmVsb3cpLgorICoJLSBiZXNpZGVzIGFsbG93aW5nIHRoZSBQQ0kgaW50ZXJmYWNlIHRvIGV4ZWN1dGUgYnVzbWFzdGVyIGN5Y2xlcworICoJICBhbmQgdGhlcmVmb3JlIHRoZSByaW5nIFNNIHRvIG9wZXJhdGUsIHRoZSBNU1RSIGJpdCBoYXMgc2lkZS1lZmZlY3RzOgorICoJICB3aGVuIE1TVFIgaXMgY2xlYXJlZCwgdGhlIFJJTkdQVFIncyBnZXQgcmVzZXQgYW5kIHRoZSBsZWdhY3kgVUFSVCBtb2RlCisgKgkgIChpbiBjb250cmFzdCB0byBidXNtYXN0ZXIgYWNjZXNzIG1vZGUpIGdldHMgZW5hYmxlZC4KKyAqCS0gY2xlYXJpbmcgRU5SWCBvciBzZXR0aW5nIEVOVFggd2hpbGUgZGF0YSBpcyByZWNlaXZlZCBtYXkgc3RhbGwgdGhlCisgKgkgIHJlY2VpdmUgZmlmbyB1bnRpbCBFTlJYIHJlZW5hYmxlZCBfYW5kXyBhbm90aGVyIHBhY2tldCBhcnJpdmVzCisgKgktIFNJUkZJTFQgbWVhbnMgdGhlIGNoaXAgcGVyZm9ybXMgdGhlIHJlcXVpcmVkIHVud3JhcHBpbmcgb2YgaGFyZHdhcmUKKyAqCSAgaGVhZGVycyAoWEJPRidzLCBCT0YvRU9GKSBhbmQgdW4tZXNjYXBpbmcgaW4gdGhlIF9yZWNlaXZlXyBkaXJlY3Rpb24uCisgKgkgIE9ubHkgdGhlIHJlc3VsdGluZyBJckxBUCBwYXlsb2FkIGlzIGNvcGllZCB0byB0aGUgcmVjZWl2ZSBidWZmZXJzIC0KKyAqCSAgYnV0IHdpdGggdGhlIDE2Yml0IEZDUyBzdGlsbCBlbmNsdWRlZC4gUXVlc3Rpb24gcmVtYWlucywgd2hldGhlciBpdAorICoJICB3YXMgYWxyZWFkeSBjaGVja2VkIG9yIHdlIHNob3VsZCBkbyBpdCBiZWZvcmUgcGFzc2luZyB0aGUgcGFja2V0IHRvIElyTEFQPworICovCisKK2VudW0gdmxzaV9waW9faXJjZmcgeworCUlSQ0ZHX0xPT1AJPSAweDQwMDAsCS8qIGVuYWJsZSBsb29wYmFjayB0ZXN0IG1vZGUgKi8KKwlJUkNGR19FTlRYCT0gMHgxMDAwLAkvKiB0cmFuc21pdCBlbmFibGUgKi8KKwlJUkNGR19FTlJYCT0gMHgwODAwLAkvKiByZWNlaXZlIGVuYWJsZSAqLworCUlSQ0ZHX01TVFIJPSAweDA0MDAsCS8qIG1hc3RlciBlbmFibGUgKi8KKwlJUkNGR19SWEFOWQk9IDB4MDIwMCwJLyogcmVjZWl2ZSBhbnkgcGFja2V0ICovCisJSVJDRkdfQ1JDMTYJPSAweDAwODAsCS8qIDE2Yml0IChub3QgMzJiaXQpIENSQyBzZWxlY3QgZm9yIE1JUi9GSVIgKi8KKwlJUkNGR19GSVIJPSAweDAwNDAsCS8qIEZJUiA0UFBNIGVuY29kaW5nIG1vZGUgZW5hYmxlICovCisJSVJDRkdfTUlSCT0gMHgwMDIwLAkvKiBNSVIgSERMQyBlbmNvZGluZyBtb2RlIGVuYWJsZSAqLworCUlSQ0ZHX1NJUgk9IDB4MDAxMCwJLyogU0lSIGVuY29kaW5nIG1vZGUgZW5hYmxlICovCisJSVJDRkdfU0lSRklMVAk9IDB4MDAwOCwJLyogZW5hYmxlIFNJUiBkZWNvZGUgZmlsdGVyIChyZWNlaXZlciB1bndyYXBwaW5nKSAqLworCUlSQ0ZHX1NJUlRFU1QJPSAweDAwMDQsCS8qIGFsbG93IFNJUiBkZWNvZGUgZmlsdGVyIHdoZW4gbm90IGluIFNJUiBtb2RlICovCisJSVJDRkdfVFhQT0wJPSAweDAwMDIsCS8qIGludmVydCB0eCBwb2xhcml0eSB3aGVuIHNldCAqLworCUlSQ0ZHX1JYUE9MCT0gMHgwMDAxCS8qIGludmVydCByeCBwb2xhcml0eSB3aGVuIHNldCAqLworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFZMU0lfUElPX1NJUkZMQUc6IFNJUiBGbGFnIFJlZ2lzdGVyICh1MTYsIHJvKSAqLworCisvKiByZWdpc3RlciBjb250YWlucyBoYXJkY29kZWQgQk9GPTB4YzAgYXQgWzc6MF0gYW5kIEVPRj0weGMxIGF0IFsxNTo4XQorICogd2hpY2ggaXMgdXNlZCBmb3IgdW53cmFwcGluZyByZWNlaXZlZCBmcmFtZXMgaW4gU0lSIGRlY29kZS1maWx0ZXIgbW9kZQorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBWTFNJX1BJT19JUkVOQUJMRTogSVIgRW5hYmxlIFJlZ2lzdGVyICh1MTYsIHJ3L3JvKSAqLworCisvKiBub3RlczoKKyAqCS0gSVJFTiBhY3RzIGFzIGdhdGUgZm9yIGxhdGNoaW5nIHRoZSBjb25maWd1cmVkIElSIG1vZGUgaW5mb3JtYXRpb24KKyAqCSAgZnJvbSBJUkNGRyBhbmQgSVJQSFlDVEwgd2hlbiBJUkVOPXJlc2V0IGFuZCBhcHBseWluZyB0aGVtIHdoZW4KKyAqCSAgSVJFTiBnZXRzIHNldCBhZnRlcndhcmRzLgorICoJLSBFTlRYU1QgcmVmbGVjdHMgSVJDRkdfRU5UWAorICoJLSBFTlJYU1QgPSBJUkNGR19FTlJYICYmICghSVJDRkdfRU5UWCB8fCBJUkNGR19MT09QKQorICovCisKK2VudW0gdmxzaV9waW9faXJlbmFibGUgeworCUlSRU5BQkxFX1BIWUFORENMT0NLCT0gMHg4MDAwLCAgLyogZW5hYmxlIElSIHBoeSBhbmQgZ2F0ZSB0aGUgbW9kZSBjb25maWcgKHJ3KSAqLworCUlSRU5BQkxFX0NGR0VSCQk9IDB4NDAwMCwgIC8qIG1vZGUgY29uZmlndXJhdGlvbiBlcnJvciAocm8pICovCisJSVJFTkFCTEVfRklSX09OCQk9IDB4MjAwMCwgIC8qIEZJUiBvbiBzdGF0dXMgKHJvKSAqLworCUlSRU5BQkxFX01JUl9PTgkJPSAweDEwMDAsICAvKiBNSVIgb24gc3RhdHVzIChybykgKi8KKwlJUkVOQUJMRV9TSVJfT04JCT0gMHgwODAwLCAgLyogU0lSIG9uIHN0YXR1cyAocm8pICovCisJSVJFTkFCTEVfRU5UWFNUCQk9IDB4MDQwMCwgIC8qIHRyYW5zbWl0IGVuYWJsZSBzdGF0dXMgKHJvKSAqLworCUlSRU5BQkxFX0VOUlhTVAkJPSAweDAyMDAsICAvKiBSZWNlaXZlIGVuYWJsZSBzdGF0dXMgKHJvKSAqLworCUlSRU5BQkxFX0NSQzE2X09OCT0gMHgwMTAwICAgLyogMTZiaXQgKG5vdCAzMmJpdCkgQ1JDIGVuYWJsZWQgc3RhdHVzIChybykgKi8KK307CisKKyNkZWZpbmUJICBJUkVOQUJMRV9NQVNLCSAgICAweGZmMDAgIC8qIFJlYWQgbWFzayAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVkxTSV9QSU9fUEhZQ1RMOiBJUiBQaHlzaWNhbCBMYXllciBDdXJyZW50IENvbnRyb2wgUmVnaXN0ZXIgKHUxNiwgcm8pICovCisKKy8qIHJlYWQtYmFjayBvZiB0aGUgY3VycmVudGx5IGFwcGxpZWQgcGh5c2ljYWwgbGF5ZXIgc3RhdHVzLgorICogYXBwbGllZCBmcm9tIFZMU0lfUElPX05QSFlDVEwgYXQgcmlzaW5nIGVkZ2Ugb2YgSVJFTkFCTEVfUEhZQU5EQ0xPQ0sKKyAqIGNvbnRlbnRzIGlkZW50aWNhbCB0byBWTFNJX1BJT19OUEhZQ1RMIChzZWUgYmVsb3cpCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFZMU0lfUElPX05QSFlDVEw6IElSIFBoeXNpY2FsIExheWVyIE5leHQgQ29udHJvbCBSZWdpc3RlciAodTE2LCBydykgKi8KKworLyogbGF0Y2hlZCBkdXJpbmcgSVJFTkFCTEVfUEhZQU5EQ0xPQ0s9MCBhbmQgYXBwbGllZCBhdCAwLTEgdHJhbnNpdGlvbgorICoKKyAqIGNvbnNpc3RzIG9mIEJBVURbMTU6MTBdLCBQTFNXSURbOTo1XSBhbmQgUFJFQU1CWzQ6MF0gYml0cyBkZWZpbmVkIGFzIGZvbGxvd3M6CisgKgorICogU0lSLW1vZGU6CUJBVUQgPSAoMTE1LjJrSHogLyBiYXVkcmF0ZSkgLSAxCisgKgkJUExTV0lEID0gKHB1bHNldGltZSAqIGZyZXEgLyAoQkFVRCsxKSkgLSAxCisgKgkJCXdoZXJlIHB1bHNldGltZSBpcyB0aGUgcmVxdWVzdGVkIElyUEhZIHB1bHNlIHdpZHRoCisgKgkJCWFuZCBmcmVxIGlzIDgoMTYpTUh6IGZvciA0MCg0OClNSHogcHJpbWFyeSBpbnB1dCBjbG9jaworICoJCVBSRUFNQjogZG9uJ3QgY2FyZSBmb3IgU0lSCisgKgorICoJCVRoZSBub21pbmFsIFNJUiBwdWxzZSB3aWR0aCBpcyAzLzE2IGJpdCB0aW1lIHNvIHdlIGhhdmUgUExTV0lEPTEyCisgKgkJZml4ZWQgZm9yIGFsbCBTSVIgc3BlZWRzIGF0IDQwTUh6IGlucHV0IGNsb2NrIChQTFNXSUQ9MjQgYXQgNDhNSHopLgorICoJCUlyUEhZIGFsc28gYWxsb3dzIHNob3J0ZXIgcHVsc2VzIGRvd24gdG8gdGhlIG5vbWluYWwgcHVsc2UgZHVyYXRpb24KKyAqCQlhdCAxMTUuMmtiYXVkIChtaW51cyBzb21lIHRvbGVyYW5jZSkgd2hpY2ggaXMgMS40MSB1c2VjLgorICoJCVVzaW5nIHRoZSBleHByZXNzaW9uIFBMU1dJRCA9IDEyLyhCQVVEKzEpLTEgKG11bHRpcGxpZWQgYnkgdHdvIGZvciA0OE1IeikKKyAqCQl3ZSBnZXQgdGhlIG1pbmltdW0gYWNjZXB0YWJsZSBQTFNXSUQgdmFsdWVzIGFjY29yZGluZyB0byB0aGUgVkxTSQorICoJCXNwZWNpZmljYXRpb24sIHdoaWNoIHByb3ZpZGVzIDEuNSB1c2VjIHB1bHNlIHdpZHRoIGZvciBhbGwgc3BlZWRzIChleGNlcHQKKyAqCQlmb3IgMi40a2JhdWQgZ2V0dGluZyA2dXNlYykuIFRoaXMgaXMgZmluZSB3aXRoIElyUEhZIHYxLjMgc3BlY3MgYW5kCisgKgkJcmVkdWNlcyB0aGUgdHJhbnNjZWl2ZXIgcG93ZXIgd2hpY2ggZHJhaW5zIHRoZSBiYXR0ZXJ5LiBBdCA5LjZrYmF1ZCBmb3IKKyAqCQlleGFtcGxlIHRoaXMgYW1vdW50cyB0byBtb3JlIHRoYW4gOTAlIGJhdHRlcnkgcG93ZXIgc2F2aW5nIQorICoKKyAqIE1JUi1tb2RlOglCQVVEID0gMAorICoJCVBMU1dJRCA9IDkoMTApIGZvciA0MCg0OCkgTUh6IGlucHV0IGNsb2NrCisgKgkJCXRvIGdldCBub21pbmFsIE1JUiBwdWxzZSB3aWR0aAorICoJCVBSRUFNQiA9IDEKKyAqCisgKiBGSVItbW9kZToJQkFVRCA9IDAKKyAqCQlQTFNXSUQ6IGRvbid0IGNhcmUKKyAqCQlQUkVBTUIgPSAxNQorICovCisKKyNkZWZpbmUgUEhZQ1RMX0JBVURfU0hJRlQJMTAKKyNkZWZpbmUgUEhZQ1RMX0JBVURfTUFTSwkweGZjMDAKKyNkZWZpbmUgUEhZQ1RMX1BMU1dJRF9TSElGVAk1CisjZGVmaW5lIFBIWUNUTF9QTFNXSURfTUFTSwkweDAzZTAKKyNkZWZpbmUgUEhZQ1RMX1BSRUFNQl9TSElGVAkwCisjZGVmaW5lIFBIWUNUTF9QUkVBTUJfTUFTSwkweDAwMWYKKworI2RlZmluZSBQSFlDVExfVE9fQkFVRChid3ApCSgoKGJ3cCkmUEhZQ1RMX0JBVURfTUFTSyk+PlBIWUNUTF9CQVVEX1NISUZUKQorI2RlZmluZSBQSFlDVExfVE9fUExTV0lEKGJ3cCkJKCgoYndwKSZQSFlDVExfUExTV0lEX01BU0spPj5QSFlDVExfUExTV0lEX1NISUZUKQorI2RlZmluZSBQSFlDVExfVE9fUFJFQU1CKGJ3cCkJKCgoYndwKSZQSFlDVExfUFJFQU1CX01BU0spPj5QSFlDVExfUFJFQU1CX1NISUZUKQorCisjZGVmaW5lIEJXUF9UT19QSFlDVEwoYix3LHApCSgoKChiKTw8UEhZQ1RMX0JBVURfU0hJRlQpJlBIWUNUTF9CQVVEX01BU0spIFwKKwkJCQkgfCAoKCh3KTw8UEhZQ1RMX1BMU1dJRF9TSElGVCkmUEhZQ1RMX1BMU1dJRF9NQVNLKSBcCisJCQkJIHwgKCgocCk8PFBIWUNUTF9QUkVBTUJfU0hJRlQpJlBIWUNUTF9QUkVBTUJfTUFTSykpCisKKyNkZWZpbmUgQkFVRF9CSVRTKGJyKQkJKCgxMTUyMDAvKGJyKSktMSkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZAorY2FsY193aWR0aF9iaXRzKHVuc2lnbmVkIGJhdWRyYXRlLCB1bnNpZ25lZCB3aWR0aHNlbGVjdCwgdW5zaWduZWQgY2xvY2tzZWxlY3QpCit7CisJdW5zaWduZWQJdG1wOworCisJaWYgKHdpZHRoc2VsZWN0KQkvKiBub21pbmFsIDMvMTYgcHVscyB3aWR0aCAqLworCQlyZXR1cm4gKGNsb2Nrc2VsZWN0KSA/IDEyIDogMjQ7CisKKwl0bXAgPSAoKGNsb2Nrc2VsZWN0KSA/IDEyIDogMjQpIC8gKEJBVURfQklUUyhiYXVkcmF0ZSkrMSk7CisKKwkvKiBpbnRlcm1lZGlhdGUgcmVzdWx0IG9mIGludGVnZXIgZGl2aXNpb24gbmVlZGVkIGhlcmUgKi8KKworCXJldHVybiAodG1wPjApID8gKHRtcC0xKSA6IDA7Cit9CisKKyNkZWZpbmUgUEhZQ1RMX1NJUihicix3cyxjcykJQldQX1RPX1BIWUNUTChCQVVEX0JJVFMoYnIpLGNhbGNfd2lkdGhfYml0cygoYnIpLCh3cyksKGNzKSksMCkKKyNkZWZpbmUgUEhZQ1RMX01JUihjcykJCUJXUF9UT19QSFlDVEwoMCwoKGNzKT85OjEwKSwxKQorI2RlZmluZSBQSFlDVExfRklSCQlCV1BfVE9fUEhZQ1RMKDAsMCwxNSkKKworLyogcXVpdGUgdWdseSwgSSBrbm93LiBCdXQgaW1wbGVtZW50aW5nIHRoZXNlIGNhbGN1bGF0aW9ucyBoZXJlIGF2b2lkcworICogaGF2aW5nIG1hZ2ljIG51bWJlcnMgaW4gdGhlIGNvZGUgYW5kIGFsbG93cyBzb21lIHBsYXlpbmcgd2l0aCBwdWxzZXdpZHRocworICogd2l0aG91dCByaXNrIHRvIHZpb2xhdGUgdGhlIHN0YW5kYXJkcy4KKyAqIEZXSVcsIGhlcmUgaXMgdGhlIHRhYmxlIGZvciByZWZlcmVuY2U6CisgKgorICogYmF1ZHJhdGUJQkFVRAltaW4tUExTV0lECW5vbS1QTFNXSUQJUFJFQU1CCisgKiAgICAgMjQwMAkgIDQ3CSAgIDAoMCkJCSAgIDEyKDI0KQkgICAwCisgKiAgICAgOTYwMAkgIDExCSAgIDAoMCkJCSAgIDEyKDI0KQkgICAwCisgKiAgICAxOTIwMAkgICA1CSAgIDEoMikJCSAgIDEyKDI0KQkgICAwCisgKiAgICAzODQwMAkgICAyCSAgIDMoNikJICAgICAgICAgICAxMigyNCkJICAgMAorICogICAgNTc2MDAJICAgMQkgICA1KDEwKQkgICAxMigyNCkJICAgMAorICogICAxMTUyMDAJICAgMAkgIDExKDIyKQkgICAxMigyNCkJICAgMAorICoJTUlSCSAgIDAJICAgIC0JCSAgICA5KDEwKQkgICAxCisgKglGSVIJICAgMCAgICAgICAgLSAgICAgICAgICAgICAgIDAJCSAgMTUKKyAqCisgKiBub3RlOiB4KHkpIG1lYW5zIHgtdmFsdWUgZm9yIDQwTUh6IC8geS12YWx1ZSBmb3IgNDhNSHogcHJpbWFyeSBpbnB1dCBjbG9jaworICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIFZMU0lfUElPX01BWFBLVDogTWF4aW11bSBQYWNrZXQgTGVuZ3RoIHJlZ2lzdGVyICh1MTYsIHJ3KSAqLworCisvKiBtYXhpbXVtIGFjY2VwdGFibGUgbGVuZ3RoIGZvciByZWNlaXZlZCBwYWNrZXRzICovCisKKy8qIGh3IGltcG9zZWQgbGltaXRhdGlvbiAtIHJlZ2lzdGVyIHVzZXMgb25seSBbMTE6MF0gKi8KKyNkZWZpbmUgTUFYX1BBQ0tFVF9MRU5HVEgJMHgwZmZmCisKKy8qIElyTEFQIEktZmllbGQgKGFwcGFyZW50bHkgbm90IGRlZmluZWQgZWxzZXdoZXJlKSAqLworI2RlZmluZSBJUkRBX01UVQkJMjA0OAorCisvKiBjb21wbGV0ZSBwYWNrZXQgY29uc2lzdHMgb2YgQSgxKStDKDEpK0koPD1JUkRBX01UVSkgKi8KKyNkZWZpbmUgSVJMQVBfU0tCX0FMTE9DU0laRQkoMSsxK0lSREFfTVRVKQorCisvKiB0aGUgYnVmZmVycyB3ZSB1c2UgdG8gZXhjaGFuZ2UgZnJhbWVzIHdpdGggdGhlIGhhcmR3YXJlIG5lZWQgdG8gYmUKKyAqIGxhcmdlciB0aGFuIElSTEFQX1NLQl9BTExPQ1NJWkUgYmVjYXVzZSB3ZSBtYXkgaGF2ZSB1cCB0byA0IGJ5dGVzIEZDUworICogYXBwZW5kZWQgYW5kLCBpbiBTSVIgbW9kZSwgYSBsb3Qgb2YgZnJhbWUgd3JhcHBpbmcgYnl0ZXMuIFRoZSB3b3JzdAorICogY2FzZSBhcHBlYXJzIHRvIGJlIGEgU0lSIHBhY2tldCB3aXRoIEktc2l6ZT09SVJEQV9NVFUgYW5kIGFsbCBieXRlcworICogcmVxdWlyaW5nIHRvIGJlIGVzY2FwZWQgdG8gcHJvdmlkZSB0cmFuc3BhcmVuY3kuIEZ1cnRoZXJtb3JlLCB0aGUgcGVlcgorICogbWlnaHQgYXNrIGZvciBxdWl0ZSBhIG51bWJlciBvZiBhZGRpdGlvbmFsIFhCT0ZzOgorICoJdXAgdG8gMTE1KzQ4IFhCT0ZTCQkgMTYzCisgKglyZWd1bGFyIEJPRgkJCSAgIDEKKyAqCUEtZmllbGQJCQkJICAgMQorICoJQy1maWVsZAkJCQkgICAxCisgKglJLWZpZWxkLCBJUkRBX01UVSwgYWxsIGVzY2FwZWQJNDA5NgorICoJRkNTICgxNiBiaXQgYXQgU0lSLCBlc2NhcGVkKQkgICA0CisgKglFT0YJCQkJICAgMQorICogQUZBSUNTIG5vdGhpbmcgaW4gSXJMQVAgZ3VhcmFudGVlcyBBL0MgZmllbGQgbm90IHRvIG5lZWQgZXNjYXBpbmcKKyAqIChmLmUuIDB4YzAvMHhjMSAtIGkuZS4gQk9GL0VPRiAtIGFyZSBsZWdhbCB2YWx1ZXMgdGhlcmUpIHNvIGluIHRoZQorICogd29yc3QgY2FzZSB3ZSBoYXZlIDQyNjkgYnl0ZXMgdG90YWwgZnJhbWUgc2l6ZS4KKyAqIEhvd2V2ZXIsIHRoZSBWTFNJIHVzZXMgMTIgYml0cyBvbmx5IGZvciBhbGwgYnVmZmVyIGxlbmd0aCB2YWx1ZXMsCisgKiB3aGljaCBsaW1pdHMgdGhlIG1heGltdW0gdXNlYWJsZSBidWZmZXIgc2l6ZSA8PSA0MDk1LgorICogTm90ZSB0aGlzIGlzIG5vdCBhIGxpbWl0YXRpb24gaW4gdGhlIHJlY2VpdmUgY2FzZSBiZWNhdXNlIHdlIHVzZQorICogdGhlIFNJUiBmaWx0ZXJpbmcgbW9kZSB3aGVyZSB0aGUgaHcgdW53cmFwcyB0aGUgZnJhbWUgYW5kIG9ubHkgdGhlCisgKiBiYXJlIHBhY2tldCtmY3MgaXMgc3RvcmVkIGludG8gdGhlIGJ1ZmZlciAtIGluIGNvbnRyYXN0IHRvIHRoZSBTSVIKKyAqIHR4IGNhc2Ugd2hlcmUgd2UgaGF2ZSB0byBwYXNzIGZyYW1lLXdyYXBwZWQgcGFja2V0cyB0byB0aGUgaHcuCisgKiBJZiB0aGlzIHdvdWxkIGV2ZXIgYmVjb21lIGFuIGlzc3VlIGluIHJlYWwgbGlmZSwgdGhlIG9ubHkgd29ya2Fyb3VuZAorICogSSBzZWUgd291bGQgYmUgdXNpbmcgdGhlIGxlZ2FjeSBVQVJUIGVtdWxhdGlvbiBpbiBTSVIgbW9kZS4KKyAqLworCisjZGVmaW5lIFhGRVJfQlVGX1NJWkUJCU1BWF9QQUNLRVRfTEVOR1RICisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBWTFNJX1BJT19SQ1ZCQ05UOiBSZWNlaXZlIEJ5dGUgQ291bnQgUmVnaXN0ZXIgKHUxNiwgcm8pICovCisKKy8qIHJlY2VpdmUgcGFja2V0IGNvdW50ZXIgZ2V0cyBpbmNyZW1lbnRlZCBvbiBldmVyeSBub24tZmlsdGVyZWQKKyAqIGJ5dGUgd2hpY2ggd2FzIHB1dCBpbiB0aGUgcmVjZWl2ZSBmaWZvIGFuZCByZXNldCBmb3IgZWFjaAorICogbmV3IHBhY2tldC4gVXNlZCB0byBkZWNpZGUgd2hldGhlciB3ZSBhcmUganVzdCBpbiB0aGUgbWlkZGxlCisgKiBvZiByZWNlaXZpbmcKKyAqLworCisvKiBiZXR0ZXIgYXBwbHkgdGhlIFsxMTowXSBtYXNrIHdoZW4gcmVhZGluZywgYXMgc29tZSBkb2NzIHNheSB0aGUKKyAqIHJlc2VydmVkIFsxNToxMl0gd291bGQgcmV0dXJuIDEgd2hlbiByZWFkaW5nIC0gd2hpY2ggaXMgd3JvbmcgQUZBSUNTCisgKi8KKyNkZWZpbmUgUkNWQkNOVF9NQVNLCTB4MGZmZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkZXNjcmlwdG9ycyBmb3IgcngvdHggcmluZworICoKKyAqIGFjY2Vzc2VkIGJ5IGhhcmR3YXJlIC0gZG9uJ3QgY2hhbmdlIQorICoKKyAqIHRoZSBkZXNjcmlwdG9yIGlzIG93bmVkIGJ5IGhhcmR3YXJlLCB3aGVuIHRoZSBBQ1RJVkUgc3RhdHVzIGJpdAorICogaXMgc2V0IGFuZCBub3RoaW5nIChiZXNpZGVzIHJlYWRpbmcgc3RhdHVzIHRvIHRlc3QgdGhlIGJpdCkKKyAqIHNoYWxsIGJlIGRvbmUuIFRoZSBiaXQgZ2V0cyBjbGVhcmVkIGJ5IGh3LCB3aGVuIHRoZSBkZXNjcmlwdG9yCisgKiBnZXRzIGNsb3NlZC4gUHJlbWF0dXJlIHJlYXBpbmcgb2YgZGVzY3JpcHRvcnMgb3duZWQgYmUgdGhlIGNoaXAKKyAqIGNhbiBiZSBhY2hpZXZlZCBieSBkaXNhYmxpbmcgSVJDRkdfTVNUUgorICoKKyAqIEF0dGVudGlvbjogV3JpdGluZyBhZGRyIG92ZXJ3cml0ZXMgc3RhdHVzIQorICoKKyAqICMjIyBGSVhNRTogZGVwZW5kcyBvbiBlbmRpYW5lc3MgKGJ1dCB0aGVyZSBhaW4ndCBubyBub24taTU4NiBvYjgwMCA7LSkKKyAqLworCitzdHJ1Y3QgcmluZ19kZXNjcl9odyB7CisJdm9sYXRpbGUgdTE2CXJkX2NvdW50OwkvKiB0eC9yeCBjb3VudCBbMTE6MF0gKi8KKwl1MTYJCXJlc2VydmVkOworCXVuaW9uIHsKKwkJdTMyCWFkZHI7CQkvKiBbMjM6MF0gb2YgdGhlIGJ1ZmZlcidzIGJ1c2FkZHJlc3MgKi8KKwkJc3RydWN0IHsKKwkJCXU4CQlhZGRyX3Jlc1szXTsKKwkJCXZvbGF0aWxlIHU4CXN0YXR1czsJCS8qIGRlc2NyaXB0b3Igc3RhdHVzICovCisJCX0gcmRfcyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwl9IHJkX3UgX19hdHRyaWJ1dGUoKHBhY2tlZCkpOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgcmRfYWRkcgkJcmRfdS5hZGRyCisjZGVmaW5lIHJkX3N0YXR1cwlyZF91LnJkX3Muc3RhdHVzCisKKy8qIHJpbmcgZGVzY3JpcHRvciBzdGF0dXMgYml0cyAqLworCisjZGVmaW5lIFJEX0FDVElWRQkJMHg4MAkvKiBkZXNjcmlwdG9yIG93bmVkIGJ5IGh3IChib3RoIFRYLFJYKSAqLworCisvKiBUWCByaW5nIGRlc2NyaXB0b3Igc3RhdHVzICovCisKKyNkZWZpbmUJUkRfVFhfRElTQ1JDCQkweDQwCS8qIGRvIG5vdCBzZW5kIENSQyAoZm9yIFNJUikgKi8KKyNkZWZpbmUJUkRfVFhfQkFEQ1JDCQkweDIwCS8qIGZvcmNlIGEgYmFkIENSQyAqLworI2RlZmluZQlSRF9UWF9QVUxTRQkJMHgxMAkvKiBzZW5kIGluZGljYXRpb24gcHVsc2UgYWZ0ZXIgdGhpcyBmcmFtZSAoTUlSL0ZJUikgKi8KKyNkZWZpbmUJUkRfVFhfRlJDRVVORAkJMHgwOAkvKiBmb3JjZSB1bmRlcnJ1biAqLworI2RlZmluZQlSRF9UWF9DTFJFTlRYCQkweDA0CS8qIGNsZWFyIEVOVFggYWZ0ZXIgdGhpcyBmcmFtZSAqLworI2RlZmluZQlSRF9UWF9VTkRSTgkJMHgwMQkvKiBUWCBmaWZvIHVuZGVycnVuIChwcm9iYWJseSBQQ0kgcHJvYmxlbSkgKi8KKworLyogUlggcmluZyBkZXNjcmlwdG9yIHN0YXR1cyAqLworCisjZGVmaW5lIFJEX1JYX1BIWUVSUgkJMHg0MAkvKiBwaHlzaWNhbCBlbmNvZGluZyBlcnJvciAqLworI2RlZmluZSBSRF9SWF9DUkNFUlIJCTB4MjAJLyogQ1JDIGVycm9yIChNSVIvRklSKSAqLworI2RlZmluZSBSRF9SWF9MRU5HVEgJCTB4MTAJLyogZnJhbWUgZXhjZWVkcyBidWZmZXIgbGVuZ3RoICovCisjZGVmaW5lIFJEX1JYX09WRVIJCTB4MDgJLyogUlggZmlmbyBvdmVycnVuIChwcm9iYWJseSBQQ0kgcHJvYmxlbSkgKi8KKyNkZWZpbmUgUkRfUlhfU0lSQkFECQkweDA0CS8qIEVPRiBtaXNzaW5nOiBCT0YgZm9sbG93cyBCT0YgKFNJUiwgZmlsdGVyZWQpICovCisKKyNkZWZpbmUgUkRfUlhfRVJST1IJCTB4N2MJLyogYW55IGVycm9yIGluIHJlY2VpdmVkIGZyYW1lICovCisKKy8qIHRoZSBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgMiBkZXNjcmlwdG9yIHJpbmdzICovCisjZGVmaW5lIEhXX1JJTkdfQVJFQV9TSVpFCSgyICogTUFYX1JJTkdfREVTQ1IgKiBzaXplb2Yoc3RydWN0IHJpbmdfZGVzY3JfaHcpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBzdy1yaW5nIGRlc2NyaXB0b3JzIGNvbnNpc3RzIG9mIGEgYnVzLW1hcHBlZCB0cmFuc2ZlciBidWZmZXIgd2l0aAorICogYXNzb2NpYXRlZCBza2IgYW5kIGEgcG9pbnRlciB0byB0aGUgaHcgZW50cnkgZGVzY3JpcHRvcgorICovCisKK3N0cnVjdCByaW5nX2Rlc2NyIHsKKwlzdHJ1Y3QgcmluZ19kZXNjcl9odwkqaHc7CisJc3RydWN0IHNrX2J1ZmYJCSpza2I7CisJdm9pZAkJCSpidWY7Cit9OworCisvKiB3cmFwcGVycyBmb3Igb3BlcmF0aW9ucyBvbiBody1leHBvc2VkIHJpbmcgZGVzY3JpcHRvcnMKKyAqIGFjY2VzcyB0byB0aGUgaHctcGFydCBvZiB0aGUgZGVzY3JpcHRvcnMgbXVzdCB1c2UgdGhlc2UuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgcmRfaXNfYWN0aXZlKHN0cnVjdCByaW5nX2Rlc2NyICpyZCkKK3sKKwlyZXR1cm4gKChyZC0+aHctPnJkX3N0YXR1cyAmIFJEX0FDVElWRSkgIT0gMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZF9hY3RpdmF0ZShzdHJ1Y3QgcmluZ19kZXNjciAqcmQpCit7CisJcmQtPmh3LT5yZF9zdGF0dXMgfD0gUkRfQUNUSVZFOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmRfc2V0X3N0YXR1cyhzdHJ1Y3QgcmluZ19kZXNjciAqcmQsIHU4IHMpCit7CisJcmQtPmh3LT5yZF9zdGF0dXMgPSBzOwkgLyogbWF5IHBhc3Mgb3duZXJzaGlwIHRvIHRoZSBoYXJkd2FyZSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmRfc2V0X2FkZHJfc3RhdHVzKHN0cnVjdCByaW5nX2Rlc2NyICpyZCwgZG1hX2FkZHJfdCBhLCB1OCBzKQoreworCS8qIG9yZGVyIGlzIGltcG9ydGFudCBmb3IgdHdvIHJlYXNvbnM6CisJICogIC0gb3ZlcmxheWVkOiB3cml0aW5nIGFkZHIgb3ZlcndyaXRlcyBzdGF0dXMKKwkgKiAgLSB3ZSB3YW50IHRvIHdyaXRlIHN0YXR1cyBsYXN0IHNvIHdlIGhhdmUgdmFsaWQgYWRkcmVzcyBpbgorCSAqICAgIGNhc2Ugc3RhdHVzIGhhcyBSRF9BQ1RJVkUgc2V0CisJICovCisKKwlpZiAoKGEgJiB+RE1BX01BU0tfTVNUUlBBR0UpPj4yNCAhPSBNU1RSUEFHRV9WQUxVRSkgeworCQlJUkRBX0VSUk9SKCIlczogcGNpIGJ1c2FkZHIgaW5jb25zaXN0ZW5jeSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWR1bXBfc3RhY2soKTsKKwkJcmV0dXJuOworCX0KKworCWEgJj0gRE1BX01BU0tfTVNUUlBBR0U7ICAvKiBjbGVhciBoaWdoYnl0ZSB0byBtYWtlIHN1cmUgd2Ugd29uJ3Qgd3JpdGUKKwkJCQkgICogdG8gc3RhdHVzIC0ganVzdCBpbiBjYXNlIE1TVFJQQUdFX1ZBTFVFIT0wCisJCQkJICAqLworCXJkLT5ody0+cmRfYWRkciA9IGNwdV90b19sZTMyKGEpOworCXdtYigpOworCXJkX3NldF9zdGF0dXMocmQsIHMpOwkgLyogbWF5IHBhc3Mgb3duZXJzaGlwIHRvIHRoZSBoYXJkd2FyZSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmRfc2V0X2NvdW50KHN0cnVjdCByaW5nX2Rlc2NyICpyZCwgdTE2IGMpCit7CisJcmQtPmh3LT5yZF9jb3VudCA9IGNwdV90b19sZTE2KGMpOworfQorCitzdGF0aWMgaW5saW5lIHU4IHJkX2dldF9zdGF0dXMoc3RydWN0IHJpbmdfZGVzY3IgKnJkKQoreworCXJldHVybiByZC0+aHctPnJkX3N0YXR1czsKK30KKworc3RhdGljIGlubGluZSBkbWFfYWRkcl90IHJkX2dldF9hZGRyKHN0cnVjdCByaW5nX2Rlc2NyICpyZCkKK3sKKwlkbWFfYWRkcl90CWE7CisKKwlhID0gbGUzMl90b19jcHUocmQtPmh3LT5yZF9hZGRyKTsKKwlyZXR1cm4gKGEgJiBETUFfTUFTS19NU1RSUEFHRSkgfCAoTVNUUlBBR0VfVkFMVUUgPDwgMjQpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiByZF9nZXRfY291bnQoc3RydWN0IHJpbmdfZGVzY3IgKnJkKQoreworCXJldHVybiBsZTE2X3RvX2NwdShyZC0+aHctPnJkX2NvdW50KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogc3cgZGVzY3JpcHRvciByaW5ncyBmb3IgcngsIHR4OgorICoKKyAqIG9wZXJhdGlvbnMgZm9sbG93IHByb2R1Y2VyLWNvbnN1bWVyIHBhcmFkaWdtLCB3aXRoIHRoZSBodworICogaW4gdGhlIG1pZGRsZSBkb2luZyB0aGUgcHJvY2Vzc2luZy4KKyAqIHJpbmcgc2l6ZSBtdXN0IGJlIHBvd2VyIG9mIHR3by4KKyAqCisgKiBwcm9kdWNlciBhZHZhbmNlcyByLT50YWlsIGFmdGVyIGluc2VydGluZyBmb3IgcHJvY2Vzc2luZworICogY29uc3VtZXIgYWR2YW5jZXMgci0+aGVhZCBhZnRlciByZW1vdmluZyBwcm9jZXNzZWQgcmQKKyAqIHJpbmcgaXMgZW1wdHkgaWYgaGVhZD09dGFpbCAvIGZ1bGwgaWYgKHRhaWwrMSk9PWhlYWQKKyAqLworCitzdHJ1Y3QgdmxzaV9yaW5nIHsKKwlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7CisJaW50CQkJZGlyOworCXVuc2lnbmVkCQlsZW47CisJdW5zaWduZWQJCXNpemU7CisJdW5zaWduZWQJCW1hc2s7CisJYXRvbWljX3QJCWhlYWQsIHRhaWw7CisJc3RydWN0IHJpbmdfZGVzY3IJKnJkOworfTsKKworLyogcmluZyBwcm9jZXNzaW5nIGhlbHBlcnMgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmluZ19kZXNjciAqcmluZ19sYXN0KHN0cnVjdCB2bHNpX3JpbmcgKnIpCit7CisJaW50IHQ7CisKKwl0ID0gYXRvbWljX3JlYWQoJnItPnRhaWwpICYgci0+bWFzazsKKwlyZXR1cm4gKCgodCsxKSAmIHItPm1hc2spID09IChhdG9taWNfcmVhZCgmci0+aGVhZCkgJiByLT5tYXNrKSkgPyBOVUxMIDogJnItPnJkW3RdOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCByaW5nX2Rlc2NyICpyaW5nX3B1dChzdHJ1Y3QgdmxzaV9yaW5nICpyKQoreworCWF0b21pY19pbmMoJnItPnRhaWwpOworCXJldHVybiByaW5nX2xhc3Qocik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJpbmdfZGVzY3IgKnJpbmdfZmlyc3Qoc3RydWN0IHZsc2lfcmluZyAqcikKK3sKKwlpbnQgaDsKKworCWggPSBhdG9taWNfcmVhZCgmci0+aGVhZCkgJiByLT5tYXNrOworCXJldHVybiAoaCA9PSAoYXRvbWljX3JlYWQoJnItPnRhaWwpICYgci0+bWFzaykpID8gTlVMTCA6ICZyLT5yZFtoXTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmluZ19kZXNjciAqcmluZ19nZXQoc3RydWN0IHZsc2lfcmluZyAqcikKK3sKKwlhdG9taWNfaW5jKCZyLT5oZWFkKTsKKwlyZXR1cm4gcmluZ19maXJzdChyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogb3VyIHByaXZhdGUgY29tcG91bmQgVkxTSS1QQ0ktSVJEQSBkZXZpY2UgaW5mb3JtYXRpb24gKi8KKwordHlwZWRlZiBzdHJ1Y3QgdmxzaV9pcmRhX2RldiB7CisJc3RydWN0IHBjaV9kZXYJCSpwZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOworCisJc3RydWN0IGlybGFwX2NiCQkqaXJsYXA7CisKKwlzdHJ1Y3QgcW9zX2luZm8JCXFvczsKKworCXVuc2lnbmVkCQltb2RlOworCWludAkJCWJhdWQsIG5ld19iYXVkOworCisJZG1hX2FkZHJfdAkJYnVzYWRkcjsKKwl2b2lkCQkJKnZpcnRhZGRyOworCXN0cnVjdCB2bHNpX3JpbmcJKnR4X3JpbmcsICpyeF9yaW5nOworCisJc3RydWN0IHRpbWV2YWwJCWxhc3Rfcng7CisKKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCBzZW1hcGhvcmUJc2VtOworCisJdTgJCQlyZXN1bWVfb2s7CQorCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqcHJvY19lbnRyeTsKKworfSB2bHNpX2lyZGFfZGV2X3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogdGhlIHJlbWFwcGVkIGVycm9yIGZsYWdzIHdlIHVzZSBmb3IgcmV0dXJuaW5nIGZyb20gZnJhbWUKKyAqIHBvc3QtcHJvY2Vzc2luZyBpbiB2bHNpX3Byb2Nlc3NfdHgvcngoKSBhZnRlciBpdCB3YXMgY29tcGxldGVkCisgKiBieSB0aGUgaGFyZHdhcmUuIFRoZXNlIGZ1bmN0aW9ucyBlaXRoZXIgcmV0dXJuIHRoZSA+PTAgbnVtYmVyCisgKiBvZiB0cmFuc2ZlcmVkIGJ5dGVzIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciB0aGUgbmVnYXRpdmUgKC0pCisgKiBvZiB0aGUgb3InZWQgZXJyb3IgZmxhZ3MuCisgKi8KKworI2RlZmluZSBWTFNJX1RYX0RST1AJCTB4MDAwMQorI2RlZmluZSBWTFNJX1RYX0ZJRk8JCTB4MDAwMgorCisjZGVmaW5lIFZMU0lfUlhfRFJPUAkJMHgwMTAwCisjZGVmaW5lIFZMU0lfUlhfT1ZFUgkJMHgwMjAwCisjZGVmaW5lIFZMU0lfUlhfTEVOR1RIICAJMHgwNDAwCisjZGVmaW5lIFZMU0lfUlhfRlJBTUUJCTB4MDgwMAorI2RlZmluZSBWTFNJX1JYX0NSQwkJMHgxMDAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2VuZGlmIC8qIElSREFfVkxTSV9GSVJfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmLmggYi9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ0NzZjMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWYuaApAQCAtMCwwICsxLDUzIEBACisjaWZuZGVmIFc4Mzk3N0FGX0gKKyNkZWZpbmUgVzgzOTc3QUZfSAorCisjZGVmaW5lIFc5NzdfRUZJT19CQVNFIDB4MzcwCisjZGVmaW5lIFc5NzdfRUZJTzJfQkFTRSAweDNmMAorI2RlZmluZSBXOTc3X0RFVklDRV9JUiAweDA2CisKKworLyoKKyAqIEVudGVyIGV4dGVuZGVkIGZ1bmN0aW9uIG1vZGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHc5NzdfZWZtX2VudGVyKHVuc2lnbmVkIGludCBlZmlvKQoreworICAgICAgICBvdXRiKDB4ODcsIGVmaW8pOworICAgICAgICBvdXRiKDB4ODcsIGVmaW8pOworfQorCisvKgorICogU2VsZWN0IGEgZGV2aWNlIHRvIGNvbmZpZ3VyZSAKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdzk3N19zZWxlY3RfZGV2aWNlKF9fdTggZGV2bnVtLCB1bnNpZ25lZCBpbnQgZWZpbykKK3sKKwlvdXRiKDB4MDcsIGVmaW8pOworCW91dGIoZGV2bnVtLCBlZmlvKzEpOworfSAKKworLyogCisgKiBXcml0ZSBhIGJ5dGUgdG8gYSByZWdpc3RlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdzk3N193cml0ZV9yZWcoX191OCByZWcsIF9fdTggdmFsdWUsIHVuc2lnbmVkIGludCBlZmlvKQoreworCW91dGIocmVnLCBlZmlvKTsKKwlvdXRiKHZhbHVlLCBlZmlvKzEpOworfQorCisvKgorICogcmVhZCBhIGJ5dGUgZnJvbSBhIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgX191OCB3OTc3X3JlYWRfcmVnKF9fdTggcmVnLCB1bnNpZ25lZCBpbnQgZWZpbykKK3sKKwlvdXRiKHJlZywgZWZpbyk7CisJcmV0dXJuIGluYihlZmlvKzEpOworfQorCisvKgorICogRXhpdCBleHRlbmRlZCBmdW5jdGlvbiBtb2RlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3OTc3X2VmbV9leGl0KHVuc2lnbmVkIGludCBlZmlvKQoreworCW91dGIoMHhBQSwgZWZpbyk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWZfaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvdzgzOTc3YWZfaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWE2NWM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5jCkBAIC0wLDAgKzEsMTM3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgCisgKiBGaWxlbmFtZTogICAgICB3ODM5NzdhZl9pci5jCisgKiBWZXJzaW9uOiAgICAgICAxLjAKKyAqIERlc2NyaXB0aW9uOiAgIEZJUiBkcml2ZXIgZm9yIHRoZSBXaW5ib25kIFc4Mzk3N0FGIFN1cGVyIEkvTyBjaGlwCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBQYXVsIFZhbmRlclNwZWsKKyAqIENyZWF0ZWQgYXQ6ICAgIFdlZCBOb3YgIDQgMTE6NDY6MTYgMTk5OAorICogTW9kaWZpZWQgYXQ6ICAgRnJpIEphbiAyOCAxMjoxMDo1OSAyMDAwCisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgUmViZWwuY29tCisgKiAgICAgIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgCisgKiAgICAgTmVpdGhlciBQYXVsIFZhbmRlclNwZWsgbm9yIFJlYmVsLmNvbSBhZG1pdCBsaWFiaWxpdHkgbm9yIHByb3ZpZGUKKyAqICAgICB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgIkFTLUlTIgorICogICAgIGFuZCBhdCBubyBjaGFyZ2UuCisgKiAgICAgCisgKiAgICAgSWYgeW91IGZpbmQgYnVncyBpbiB0aGlzIGZpbGUsIGl0cyB2ZXJ5IGxpa2VseSB0aGF0IHRoZSBzYW1lIGJ1ZworICogICAgIHdpbGwgYWxzbyBiZSBpbiBwYzg3MTA4LmMgc2luY2UgdGhlIGltcGxlbWVudGF0aW9ucyBhcmUgcXVpdGUKKyAqICAgICBzaW1pbGFyLgorICoKKyAqICAgICBOb3RpY2UgdGhhdCBhbGwgZnVuY3Rpb25zIHRoYXQgbmVlZHMgdG8gYWNjZXNzIHRoZSBjaGlwIGluIF9hbnlfCisgKiAgICAgd2F5LCBtdXN0IHNhdmUgQlNSIHJlZ2lzdGVyIG9uIGVudHJ5LCBhbmQgcmVzdG9yZSBpdCBvbiBleGl0LiAKKyAqICAgICBJdCBpcyBfdmVyeV8gaW1wb3J0YW50IHRvIGZvbGxvdyB0aGlzIHBvbGljeSEKKyAqCisgKiAgICAgICAgIF9fdTggYmFuazsKKyAqICAgICAKKyAqICAgICAgICAgYmFuayA9IGluYiggaW9iYXNlK0JTUik7CisgKiAgCisgKiAgICAgICAgIGRvX3lvdXJfc3R1ZmZfaGVyZSgpOworICoKKyAqICAgICAgICAgb3V0YiggYmFuaywgaW9iYXNlK0JTUik7CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+IAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL3dyYXBwZXIuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhX2RldmljZS5oPgorI2luY2x1ZGUgInc4Mzk3N2FmLmgiCisjaW5jbHVkZSAidzgzOTc3YWZfaXIuaCIKKworI2lmZGVmICBDT05GSUdfQVJDSF9ORVRXSU5ERVIgICAgICAgICAgICAvKiBBZGp1c3QgdG8gTmV0V2luZGVyIGRpZmZlcmVuY2VzICovCisjdW5kZWYgIENPTkZJR19ORVRXSU5ERVJfVFhfRE1BX1BST0JMRU1TIC8qIE5vdCBuZWVkZWQgKi8KKyNkZWZpbmUgQ09ORklHX05FVFdJTkRFUl9SWF9ETUFfUFJPQkxFTVMgLyogTXVzdCBoYXZlIHRoaXMgb25lISAqLworI2VuZGlmCisjdW5kZWYgIENPTkZJR19VU0VfSU5URVJOQUxfVElNRVIgIC8qIEp1c3QgY2Fubm90IG1ha2UgdGhhdCB0aW1lciB3b3JrICovCisjZGVmaW5lIENPTkZJR19VU0VfVzk3N19QTlAgICAgICAgIC8qIEN1cnJlbnRseSBuZWVkZWQgKi8KKyNkZWZpbmUgUElPX01BWF9TUEVFRCAgICAgICAxMTUyMDAgCisKK3N0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9ICJ3ODM5NzdhZl9pciI7CitzdGF0aWMgaW50ICBxb3NfbXR0X2JpdHMgPSAweDA3OyAgIC8qIDEgbXMgb3IgbW9yZSAqLworCisjZGVmaW5lIENISVBfSU9fRVhURU5UIDgKKworc3RhdGljIHVuc2lnbmVkIGludCBpb1tdID0geyAweDE4MCwgfjAsIH4wLCB+MCB9OworI2lmZGVmIENPTkZJR19BUkNIX05FVFdJTkRFUiAgICAgICAgICAgICAvKiBBZGp1c3QgdG8gTmV0V2luZGVyIGRpZmZlcmVuY2VzICovCitzdGF0aWMgdW5zaWduZWQgaW50IGlycVtdID0geyA2LCAwLCAwLCAwIH07CisjZWxzZQorc3RhdGljIHVuc2lnbmVkIGludCBpcnFbXSA9IHsgMTEsIDAsIDAsIDAgfTsKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGludCBkbWFbXSA9IHsgMSwgMCwgMCwgMCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBlZmJhc2VbXSA9IHsgVzk3N19FRklPX0JBU0UsIFc5NzdfRUZJTzJfQkFTRSB9Oworc3RhdGljIHVuc2lnbmVkIGludCBlZmlvID0gVzk3N19FRklPX0JBU0U7CisKK3N0YXRpYyBzdHJ1Y3QgdzgzOTc3YWZfaXIgKmRldl9zZWxmW10gPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9OworCisvKiBTb21lIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBpbnQgIHc4Mzk3N2FmX29wZW4oaW50IGksIHVuc2lnbmVkIGludCBpb2Jhc2UsIHVuc2lnbmVkIGludCBpcnEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZG1hKTsKK3N0YXRpYyBpbnQgIHc4Mzk3N2FmX2Nsb3NlKHN0cnVjdCB3ODM5NzdhZl9pciAqc2VsZik7CitzdGF0aWMgaW50ICB3ODM5NzdhZl9wcm9iZShpbnQgaW9iYXNlLCBpbnQgaXJxLCBpbnQgZG1hKTsKK3N0YXRpYyBpbnQgIHc4Mzk3N2FmX2RtYV9yZWNlaXZlKHN0cnVjdCB3ODM5NzdhZl9pciAqc2VsZik7IAorc3RhdGljIGludCAgdzgzOTc3YWZfZG1hX3JlY2VpdmVfY29tcGxldGUoc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmKTsKK3N0YXRpYyBpbnQgIHc4Mzk3N2FmX2hhcmRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIHc4Mzk3N2FmX3Bpb193cml0ZShpbnQgaW9iYXNlLCBfX3U4ICpidWYsIGludCBsZW4sIGludCBmaWZvX3NpemUpOworc3RhdGljIHZvaWQgdzgzOTc3YWZfZG1hX3dyaXRlKHN0cnVjdCB3ODM5NzdhZl9pciAqc2VsZiwgaW50IGlvYmFzZSk7CitzdGF0aWMgdm9pZCB3ODM5NzdhZl9jaGFuZ2Vfc3BlZWQoc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmLCBfX3UzMiBzcGVlZCk7CitzdGF0aWMgaW50ICB3ODM5NzdhZl9pc19yZWNlaXZpbmcoc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmKTsKKworc3RhdGljIGludCAgdzgzOTc3YWZfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICB3ODM5NzdhZl9uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICB3ODM5NzdhZl9uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnc4Mzk3N2FmX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qCisgKiBGdW5jdGlvbiB3ODM5NzdhZl9pbml0ICgpCisgKgorICogICAgSW5pdGlhbGl6ZSBjaGlwLiBKdXN0IHRyeSB0byBmaW5kIG91dCBob3cgbWFueSBjaGlwcyB3ZSBhcmUgZGVhbGluZyB3aXRoCisgKiAgICBhbmQgd2hlcmUgdGhleSBhcmUKKyAqLworc3RhdGljIGludCBfX2luaXQgdzgzOTc3YWZfaW5pdCh2b2lkKQoreworICAgICAgICBpbnQgaTsKKworCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJZm9yIChpPTA7IChpb1tpXSA8IDIwMDApICYmIChpIDwgNCk7IGkrKykgeyAKKwkJaWYgKHc4Mzk3N2FmX29wZW4oaSwgaW9baV0sIGlycVtpXSwgZG1hW2ldKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PREVWOworfQorCisvKgorICogRnVuY3Rpb24gdzgzOTc3YWZfY2xlYW51cCAoKQorICoKKyAqICAgIENsb3NlIGFsbCBjb25maWd1cmVkIGNoaXBzCisgKgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgdzgzOTc3YWZfY2xlYW51cCh2b2lkKQoreworCWludCBpOworCisgICAgICAgIElSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJZm9yIChpPTA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKGRldl9zZWxmW2ldKQorCQkJdzgzOTc3YWZfY2xvc2UoZGV2X3NlbGZbaV0pOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIHc4Mzk3N2FmX29wZW4gKGlvYmFzZSwgaXJxKQorICoKKyAqICAgIE9wZW4gZHJpdmVyIGluc3RhbmNlCisgKgorICovCitpbnQgdzgzOTc3YWZfb3BlbihpbnQgaSwgdW5zaWduZWQgaW50IGlvYmFzZSwgdW5zaWduZWQgaW50IGlycSwgCisJCSAgdW5zaWduZWQgaW50IGRtYSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgICAgICBzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGY7CisJaW50IGVycjsKKworCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJLyogTG9jayB0aGUgcG9ydCB0aGF0IHdlIG5lZWQgKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgQ0hJUF9JT19FWFRFTlQsIGRyaXZlcl9uYW1lKSkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBjYW4ndCBnZXQgaW9iYXNlIG9mIDB4JTAzeFxuIiwKKwkJICAgICAgX19GVU5DVElPTl9fICwgaW9iYXNlKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHc4Mzk3N2FmX3Byb2JlKGlvYmFzZSwgaXJxLCBkbWEpID09IC0xKSB7CisJCWVyciA9IC0xOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qCisJICogIEFsbG9jYXRlIG5ldyBpbnN0YW5jZSBvZiB0aGUgZHJpdmVyCisJICovCisJZGV2ID0gYWxsb2NfaXJkYWRldihzaXplb2Yoc3RydWN0IHc4Mzk3N2FmX2lyKSk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayggS0VSTl9FUlIgIklyREE6IENhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgIgorCQkJIklyREEgY29udHJvbCBibG9jayFcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJc2VsZiA9IGRldi0+cHJpdjsKKwlzcGluX2xvY2tfaW5pdCgmc2VsZi0+bG9jayk7CisgICAKKworCS8qIEluaXRpYWxpemUgSU8gKi8KKwlzZWxmLT5pby5maXJfYmFzZSAgID0gaW9iYXNlOworICAgICAgICBzZWxmLT5pby5pcnEgICAgICAgPSBpcnE7CisgICAgICAgIHNlbGYtPmlvLmZpcl9leHQgICA9IENISVBfSU9fRVhURU5UOworICAgICAgICBzZWxmLT5pby5kbWEgICAgICAgPSBkbWE7CisgICAgICAgIHNlbGYtPmlvLmZpZm9fc2l6ZSA9IDMyOworCisJLyogSW5pdGlhbGl6ZSBRb1MgZm9yIHRoaXMgZGV2aWNlICovCisJaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcygmc2VsZi0+cW9zKTsKKwkKKwkvKiBUaGUgb25seSB2YWx1ZSB3ZSBtdXN0IG92ZXJyaWRlIGl0IHRoZSBiYXVkcmF0ZSAqLworCisJLyogRklYTUU6IFRoZSBIUCBIRExTLTExMDAgZG9lcyBub3Qgc3VwcG9ydCAxMTUyMDAwISAqLworCXNlbGYtPnFvcy5iYXVkX3JhdGUuYml0cyA9IElSXzk2MDB8SVJfMTkyMDB8SVJfMzg0MDB8SVJfNTc2MDB8CisJCUlSXzExNTIwMHxJUl81NzYwMDB8SVJfMTE1MjAwMHwoSVJfNDAwMDAwMCA8PCA4KTsKKworCS8qIFRoZSBIUCBIRExTLTExMDAgbmVlZHMgMSBtcyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNzICovCisJc2VsZi0+cW9zLm1pbl90dXJuX3RpbWUuYml0cyA9IHFvc19tdHRfYml0czsKKwlpcmRhX3Fvc19iaXRzX3RvX3ZhbHVlKCZzZWxmLT5xb3MpOworCQorCS8qIE1heCBETUEgYnVmZmVyIHNpemUgbmVlZGVkID0gKGRhdGFfc2l6ZSArIDYpICogKHdpbmRvd19zaXplKSArIDY7ICovCisJc2VsZi0+cnhfYnVmZi50cnVlc2l6ZSA9IDE0Mzg0OyAKKwlzZWxmLT50eF9idWZmLnRydWVzaXplID0gNDAwMDsKKwkKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgaWYgbmVlZGVkICovCisJc2VsZi0+cnhfYnVmZi5oZWFkID0KKwkJZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICAgJnNlbGYtPnJ4X2J1ZmZfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2VsZi0+cnhfYnVmZi5oZWFkID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0MTsKKwl9CisKKwltZW1zZXQoc2VsZi0+cnhfYnVmZi5oZWFkLCAwLCBzZWxmLT5yeF9idWZmLnRydWVzaXplKTsKKwkKKwlzZWxmLT50eF9idWZmLmhlYWQgPQorCQlkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSwKKwkJCQkgICAmc2VsZi0+dHhfYnVmZl9kbWEsIEdGUF9LRVJORUwpOworCWlmIChzZWxmLT50eF9idWZmLmhlYWQgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQyOworCX0KKwltZW1zZXQoc2VsZi0+dHhfYnVmZi5oZWFkLCAwLCBzZWxmLT50eF9idWZmLnRydWVzaXplKTsKKworCXNlbGYtPnJ4X2J1ZmYuaW5fZnJhbWUgPSBGQUxTRTsKKwlzZWxmLT5yeF9idWZmLnN0YXRlID0gT1VUU0lERV9GUkFNRTsKKwlzZWxmLT50eF9idWZmLmRhdGEgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisJc2VsZi0+cnhfYnVmZi5kYXRhID0gc2VsZi0+cnhfYnVmZi5oZWFkOworCXNlbGYtPm5ldGRldiA9IGRldjsKKworCS8qIEtlZXAgdHJhY2sgb2YgbW9kdWxlIHVzYWdlICovCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJLyogT3ZlcnJpZGUgdGhlIG5ldHdvcmsgZnVuY3Rpb25zIHdlIG5lZWQgdG8gdXNlICovCisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB3ODM5NzdhZl9oYXJkX3htaXQ7CisJZGV2LT5vcGVuICAgICAgICAgICAgPSB3ODM5NzdhZl9uZXRfb3BlbjsKKwlkZXYtPnN0b3AgICAgICAgICAgICA9IHc4Mzk3N2FmX25ldF9jbG9zZTsKKwlkZXYtPmRvX2lvY3RsICAgICAgICA9IHc4Mzk3N2FmX25ldF9pb2N0bDsKKwlkZXYtPmdldF9zdGF0cwkgICAgID0gdzgzOTc3YWZfbmV0X2dldF9zdGF0czsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJSVJEQV9FUlJPUigiJXMoKSwgcmVnaXN0ZXJfbmV0ZGV2aWNlKCkgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBlcnJfb3V0MzsKKwl9CisJSVJEQV9NRVNTQUdFKCJJckRBOiBSZWdpc3RlcmVkIGRldmljZSAlc1xuIiwgZGV2LT5uYW1lKTsKKworCS8qIE5lZWQgdG8gc3RvcmUgc2VsZiBzb21ld2hlcmUgKi8KKwlkZXZfc2VsZltpXSA9IHNlbGY7CisJCisJcmV0dXJuIDA7CitlcnJfb3V0MzoKKwlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT50eF9idWZmLnRydWVzaXplLAorCQkJICBzZWxmLT50eF9idWZmLmhlYWQsIHNlbGYtPnR4X2J1ZmZfZG1hKTsKK2Vycl9vdXQyOgkKKwlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAorCQkJICBzZWxmLT5yeF9idWZmLmhlYWQsIHNlbGYtPnJ4X2J1ZmZfZG1hKTsKK2Vycl9vdXQxOgorCWZyZWVfbmV0ZGV2KGRldik7CitlcnJfb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYmFzZSwgQ0hJUF9JT19FWFRFTlQpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB3ODM5NzdhZl9jbG9zZSAoc2VsZikKKyAqCisgKiAgICBDbG9zZSBkcml2ZXIgaW5zdGFuY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgdzgzOTc3YWZfY2xvc2Uoc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmKQoreworCWludCBpb2Jhc2U7CisKKwlJUkRBX0RFQlVHKDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworICAgICAgICBpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworI2lmZGVmIENPTkZJR19VU0VfVzk3N19QTlAKKwkvKiBlbnRlciBQblAgY29uZmlndXJhdGlvbiBtb2RlICovCisJdzk3N19lZm1fZW50ZXIoZWZpbyk7CisKKwl3OTc3X3NlbGVjdF9kZXZpY2UoVzk3N19ERVZJQ0VfSVIsIGVmaW8pOworCisJLyogRGVhY3RpdmF0ZSBkZXZpY2UgKi8KKwl3OTc3X3dyaXRlX3JlZygweDMwLCAweDAwLCBlZmlvKTsKKworCXc5NzdfZWZtX2V4aXQoZWZpbyk7CisjZW5kaWYgLyogQ09ORklHX1VTRV9XOTc3X1BOUCAqLworCisJLyogUmVtb3ZlIG5ldGRldmljZSAqLworCXVucmVnaXN0ZXJfbmV0ZGV2KHNlbGYtPm5ldGRldik7CisKKwkvKiBSZWxlYXNlIHRoZSBQT1JUIHRoYXQgdGhpcyBkcml2ZXIgaXMgdXNpbmcgKi8KKwlJUkRBX0RFQlVHKDAgLCAiJXMoKSwgUmVsZWFzaW5nIFJlZ2lvbiAlMDN4XG4iLCAKKwkgICAgICBfX0ZVTkNUSU9OX18gLCBzZWxmLT5pby5maXJfYmFzZSk7CisJcmVsZWFzZV9yZWdpb24oc2VsZi0+aW8uZmlyX2Jhc2UsIHNlbGYtPmlvLmZpcl9leHQpOworCisJaWYgKHNlbGYtPnR4X2J1ZmYuaGVhZCkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSwKKwkJCQkgIHNlbGYtPnR4X2J1ZmYuaGVhZCwgc2VsZi0+dHhfYnVmZl9kbWEpOworCQorCWlmIChzZWxmLT5yeF9idWZmLmhlYWQpCisJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUsCisJCQkJICBzZWxmLT5yeF9idWZmLmhlYWQsIHNlbGYtPnJ4X2J1ZmZfZG1hKTsKKworCWZyZWVfbmV0ZGV2KHNlbGYtPm5ldGRldik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHc4Mzk3N2FmX3Byb2JlKCBpbnQgaW9iYXNlLCBpbnQgaXJxLCBpbnQgZG1hKQoreworICAJaW50IHZlcnNpb247CisJaW50IGk7CisgIAkKKyAJZm9yIChpPTA7IGkgPCAyOyBpKyspIHsKKyAJCUlSREFfREVCVUcoIDAsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKKyNpZmRlZiBDT05GSUdfVVNFX1c5NzdfUE5QCisgCQkvKiBFbnRlciBQblAgY29uZmlndXJhdGlvbiBtb2RlICovCisJCXc5NzdfZWZtX2VudGVyKGVmYmFzZVtpXSk7CisgIAorIAkJdzk3N19zZWxlY3RfZGV2aWNlKFc5NzdfREVWSUNFX0lSLCBlZmJhc2VbaV0pOworICAKKyAJCS8qIENvbmZpZ3VyZSBQblAgcG9ydCwgSVJRLCBhbmQgRE1BIGNoYW5uZWwgKi8KKyAJCXc5Nzdfd3JpdGVfcmVnKDB4NjAsIChpb2Jhc2UgPj4gOCkgJiAweGZmLCBlZmJhc2VbaV0pOworIAkJdzk3N193cml0ZV9yZWcoMHg2MSwgKGlvYmFzZSkgJiAweGZmLCBlZmJhc2VbaV0pOworICAKKyAJCXc5Nzdfd3JpdGVfcmVnKDB4NzAsIGlycSwgZWZiYXNlW2ldKTsKKyNpZmRlZiBDT05GSUdfQVJDSF9ORVRXSU5ERVIKKwkJLyogTmV0d2luZGVyIHVzZXMgMSBoaWdoZXIgdGhhbiBMaW51eCAqLworIAkJdzk3N193cml0ZV9yZWcoMHg3NCwgZG1hKzEsIGVmYmFzZVtpXSk7CisjZWxzZQorIAkJdzk3N193cml0ZV9yZWcoMHg3NCwgZG1hLCBlZmJhc2VbaV0pOyAgIAorI2VuZGlmIC8qQ09ORklHX0FSQ0hfTkVUV0lOREVSICovCisgCQl3OTc3X3dyaXRlX3JlZygweDc1LCAweDA0LCBlZmJhc2VbaV0pOyAgLyogRGlzYWJsZSBUeCBETUEgKi8KKyAgCQorIAkJLyogU2V0IGFwcGVuZCBoYXJkd2FyZSBDUkMsIGVuYWJsZSBJUiBiYW5rIHNlbGVjdGlvbiAqLwkKKyAJCXc5Nzdfd3JpdGVfcmVnKDB4ZjAsIEFQRURDUkN8RU5CTktTRUwsIGVmYmFzZVtpXSk7CisgIAorIAkJLyogQWN0aXZhdGUgZGV2aWNlICovCisgCQl3OTc3X3dyaXRlX3JlZygweDMwLCAweDAxLCBlZmJhc2VbaV0pOworICAKKyAJCXc5NzdfZWZtX2V4aXQoZWZiYXNlW2ldKTsKKyNlbmRpZiAvKiBDT05GSUdfVVNFX1c5NzdfUE5QICovCisgIAkJLyogRGlzYWJsZSBBZHZhbmNlZCBtb2RlICovCisgIAkJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQyKTsKKyAgCQlvdXRiKGlvYmFzZSsyLCAweDAwKTsgIAorIAorIAkJLyogVHVybiBvbiBVQVJUIChnbG9iYWwpIGludGVycnVwdHMgKi8KKyAJCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMCk7CisgIAkJb3V0YihIQ1JfRU5fSVJRLCBpb2Jhc2UrSENSKTsKKyAgCQorICAJCS8qIFN3aXRjaCB0byBhZHZhbmNlZCBtb2RlICovCisgIAkJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQyKTsKKyAgCQlvdXRiKGluYihpb2Jhc2UrQURDUjEpIHwgQURDUjFfQURWX1NMLCBpb2Jhc2UrQURDUjEpOworICAKKyAgCQkvKiBTZXQgZGVmYXVsdCBJUi1tb2RlICovCisgIAkJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKyAgCQlvdXRiKEhDUl9TSVIsIGlvYmFzZStIQ1IpOworICAKKyAgCQkvKiBSZWFkIHRoZSBBZHZhbmNlZCBJUiBJRCAqLworICAJCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMyk7CisgIAkJdmVyc2lvbiA9IGluYihpb2Jhc2UrQVVJRCk7CisgIAkKKyAgCQkvKiBTaG91bGQgYmUgMHgxPyAqLworICAJCWlmICgweDEwID09ICh2ZXJzaW9uICYgMHhmMCkpIHsKKyAJCQllZmlvID0gZWZiYXNlW2ldOworIAorIAkJCS8qIFNldCBGSUZPIHNpemUgdG8gMzIgKi8KKyAJCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDIpOworIAkJCW91dGIoQURDUjJfUlhGUzMyfEFEQ1IyX1RYRlMzMiwgaW9iYXNlK0FEQ1IyKTsJCisgCQorIAkJCS8qIFNldCBGSUZPIHRocmVzaG9sZCB0byBUWDE3LCBSWDE2ICovCisgCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsJCisgCQkJb3V0YihVRlJfUlhUTHxVRlJfVFhUTHxVRlJfVFhGX1JTVHxVRlJfUlhGX1JTVHwKKwkJCSAgICAgVUZSX0VOX0ZJRk8saW9iYXNlK1VGUik7CisgCisgCQkJLyogUmVjZWl2ZXIgZnJhbWUgbGVuZ3RoICovCisgCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQ0KTsKKwkJCW91dGIoMjA0OCAmIDB4ZmYsIGlvYmFzZSs2KTsKKwkJCW91dGIoKDIwNDggPj4gOCkgJiAweDFmLCBpb2Jhc2UrNyk7CisKKwkJCS8qIAorCQkJICogSW5pdCBIUCBIU0RMLTExMDAgdHJhbnNjZWl2ZXIuIAorCQkJICogCisJCQkgKiBTZXQgSVJYX01TTCBzaW5jZSB3ZSBoYXZlIDIgKiByZWNlaXZlIHBhdGhzIElSUlgsIAorCQkJICogYW5kIElSUlhILiBDbGVhciBJUlNMMEQgc2luY2Ugd2Ugd2FudCBJUlNMMCAqIHRvIAorCQkJICogYmUgYSBpbnB1dCBwaW4gdXNlZCBmb3IgSVJSWEggCisJCQkgKgorCQkJICogICBJUlJYICBwaW4gMzcgY29ubmVjdGVkIHRvIHJlY2VpdmVyIAorCQkJICogICBJUlRYICBwaW4gMzggY29ubmVjdGVkIHRvIHRyYW5zbWl0dGVyCisJCQkgKiAgIEZJUlJYIHBpbiAzOSBjb25uZWN0ZWQgdG8gcmVjZWl2ZXIgICAgICAoSVJTTDApIAorCQkJICogICBDSVJSWCBwaW4gNDAgY29ubmVjdGVkIHRvIHBpbiAzNworCQkJICovCisJCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDcpOworCQkJb3V0YigweDQwLCBpb2Jhc2UrNyk7CisJCQkKKwkJCUlSREFfTUVTU0FHRSgiVzgzOTc3QUYgKElSKSBkcml2ZXIgbG9hZGVkLiAiCisJCQkJICAgICAiVmVyc2lvbjogMHglMDJ4XG4iLCB2ZXJzaW9uKTsKKwkJCQorCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQkvKiBUcnkgbmV4dCBleHRlbnRlZCBmdW5jdGlvbiByZWdpc3RlciBhZGRyZXNzICovCisJCQlJUkRBX0RFQlVHKCAwLCAiJXMoKSwgV3JvbmcgY2hpcCB2ZXJzaW9uIiwgX19GVU5DVElPTl9fICk7CisJCX0KKyAgCX0gICAJCisJcmV0dXJuIC0xOworfQorCit2b2lkIHc4Mzk3N2FmX2NoYW5nZV9zcGVlZChzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGYsIF9fdTMyIHNwZWVkKQoreworCWludCBpcl9tb2RlID0gSENSX1NJUjsKKwlpbnQgaW9iYXNlOyAKKwlfX3U4IHNldDsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJLyogVXBkYXRlIGFjY291bnRpbmcgZm9yIG5ldyBzcGVlZCAqLworCXNlbGYtPmlvLnNwZWVkID0gc3BlZWQ7CisKKwkvKiBTYXZlIGN1cnJlbnQgYmFuayAqLworCXNldCA9IGluYihpb2Jhc2UrU1NSKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMCk7CisJb3V0YigwLCBpb2Jhc2UrSUNSKTsKKworCS8qIFNlbGVjdCBTZXQgMiAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMik7CisJb3V0YigweDAwLCBpb2Jhc2UrQUJITCk7CisKKwlzd2l0Y2ggKHNwZWVkKSB7CisJY2FzZSA5NjAwOiAgIG91dGIoMHgwYywgaW9iYXNlK0FCTEwpOyBicmVhazsKKwljYXNlIDE5MjAwOiAgb3V0YigweDA2LCBpb2Jhc2UrQUJMTCk7IGJyZWFrOworCWNhc2UgMzg0MDA6ICBvdXRiKDB4MDMsIGlvYmFzZStBQkxMKTsgYnJlYWs7CisJY2FzZSA1NzYwMDogIG91dGIoMHgwMiwgaW9iYXNlK0FCTEwpOyBicmVhazsKKwljYXNlIDExNTIwMDogb3V0YigweDAxLCBpb2Jhc2UrQUJMTCk7IGJyZWFrOworCWNhc2UgNTc2MDAwOgorCQlpcl9tb2RlID0gSENSX01JUl81NzY7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIGhhbmRsaW5nIGJhdWQgb2YgNTc2MDAwXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJYnJlYWs7CisJY2FzZSAxMTUyMDAwOgorCQlpcl9tb2RlID0gSENSX01JUl8xMTUyOworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBoYW5kbGluZyBiYXVkIG9mIDExNTIwMDBcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwljYXNlIDQwMDAwMDA6CisJCWlyX21vZGUgPSBIQ1JfRklSOworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBoYW5kbGluZyBiYXVkIG9mIDQwMDAwMDBcbiIsIF9fRlVOQ1RJT05fXyApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpcl9tb2RlID0gSENSX0ZJUjsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5rbm93biBiYXVkIHJhdGUgb2YgJWRcbiIsIF9fRlVOQ1RJT05fXyAsIHNwZWVkKTsKKwkJYnJlYWs7CisJfQorCisJLyogU2V0IHNwZWVkIG1vZGUgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworCW91dGIoaXJfbW9kZSwgaW9iYXNlK0hDUik7CisKKwkvKiBzZXQgRklGTyBzaXplIHRvIDMyICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQyKTsKKwlvdXRiKEFEQ1IyX1JYRlMzMnxBRENSMl9UWEZTMzIsIGlvYmFzZStBRENSMik7CQorCQorCS8qIHNldCBGSUZPIHRocmVzaG9sZCB0byBUWDE3LCBSWDE2ICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKwlvdXRiKDB4MDAsIGlvYmFzZStVRlIpOyAgICAgICAgLyogUmVzZXQgKi8KKwlvdXRiKFVGUl9FTl9GSUZPLCBpb2Jhc2UrVUZSKTsgLyogRmlyc3Qgd2UgbXVzdCBlbmFibGUgRklGTyAqLworCW91dGIoMHhhNywgaW9iYXNlK1VGUik7CisKKwluZXRpZl93YWtlX3F1ZXVlKHNlbGYtPm5ldGRldik7CisJCQorCS8qIEVuYWJsZSBzb21lIGludGVycnVwdHMgc28gd2UgY2FuIHJlY2VpdmUgZnJhbWVzICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKwlpZiAoc3BlZWQgPiBQSU9fTUFYX1NQRUVEKSB7CisJCW91dGIoSUNSX0VGU0ZJLCBpb2Jhc2UrSUNSKTsKKwkJdzgzOTc3YWZfZG1hX3JlY2VpdmUoc2VsZik7CisJfSBlbHNlCisJCW91dGIoSUNSX0VSQlJJLCBpb2Jhc2UrSUNSKTsKKyAgICAJCisJLyogUmVzdG9yZSBTU1IgKi8KKwlvdXRiKHNldCwgaW9iYXNlK1NTUik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB3ODM5NzdhZl9oYXJkX3htaXQgKHNrYiwgZGV2KQorICoKKyAqICAgIFNldHMgdXAgYSBETUEgdHJhbnNmZXIgdG8gc2VuZCB0aGUgY3VycmVudCBmcmFtZS4KKyAqCisgKi8KK2ludCB3ODM5NzdhZl9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGY7CisJX19zMzIgc3BlZWQ7CisJaW50IGlvYmFzZTsKKwlfX3U4IHNldDsKKwlpbnQgbXR0OworCQorCXNlbGYgPSAoc3RydWN0IHc4Mzk3N2FmX2lyICopIGRldi0+cHJpdjsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJSVJEQV9ERUJVRyg0LCAiJXMoJWxkKSwgc2tiLT5sZW49JWRcbiIsIF9fRlVOQ1RJT05fXyAsIGppZmZpZXMsIAorCQkgICAoaW50KSBza2ItPmxlbik7CisJCisJLyogTG9jayB0cmFuc21pdCBidWZmZXIgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkICovCisJc3BlZWQgPSBpcmRhX2dldF9uZXh0X3NwZWVkKHNrYik7CisJaWYgKChzcGVlZCAhPSBzZWxmLT5pby5zcGVlZCkgJiYgKHNwZWVkICE9IC0xKSkgeworCQkvKiBDaGVjayBmb3IgZW1wdHkgZnJhbWUgKi8KKwkJaWYgKCFza2ItPmxlbikgeworCQkJdzgzOTc3YWZfY2hhbmdlX3NwZWVkKHNlbGYsIHNwZWVkKTsgCisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCXNlbGYtPm5ld19zcGVlZCA9IHNwZWVkOworCX0KKworCS8qIFNhdmUgY3VycmVudCBzZXQgKi8KKwlzZXQgPSBpbmIoaW9iYXNlK1NTUik7CisJCisJLyogRGVjaWRlIGlmIHdlIHNob3VsZCB1c2UgUElPIG9yIERNQSB0cmFuc2ZlciAqLworCWlmIChzZWxmLT5pby5zcGVlZCA+IFBJT19NQVhfU1BFRUQpIHsKKwkJc2VsZi0+dHhfYnVmZi5kYXRhID0gc2VsZi0+dHhfYnVmZi5oZWFkOworCQltZW1jcHkoc2VsZi0+dHhfYnVmZi5kYXRhLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJc2VsZi0+dHhfYnVmZi5sZW4gPSBza2ItPmxlbjsKKwkJCisJCW10dCA9IGlyZGFfZ2V0X210dChza2IpOworI2lmZGVmIENPTkZJR19VU0VfSU5URVJOQUxfVElNRVIKKwkgICAgICAgIGlmIChtdHQgPiA1MCkgeworCQkJLyogQWRqdXN0IGZvciB0aW1lciByZXNvbHV0aW9uICovCisJCQltdHQgLz0gMTAwMCsxOworCisJCQkvKiBTZXR1cCB0aW1lciAqLworCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQ0KTsKKwkJCW91dGIobXR0ICYgMHhmZiwgaW9iYXNlK1RNUkwpOworCQkJb3V0YigobXR0ID4+IDgpICYgMHgwZiwgaW9iYXNlK1RNUkgpOworCQkJCisJCQkvKiBTdGFydCB0aW1lciAqLworCQkJb3V0YihJUl9NU0xfRU5fVE1SLCBpb2Jhc2UrSVJfTVNMKTsKKwkJCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1hNSVQ7CisJCQkKKwkJCS8qIEVuYWJsZSB0aW1lciBpbnRlcnJ1cHQgKi8KKwkJCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMCk7CisJCQlvdXRiKElDUl9FVE1SSSwgaW9iYXNlK0lDUik7CisJCX0gZWxzZSB7CisjZW5kaWYKKwkJCUlSREFfREVCVUcoNCwgIiVzKCVsZCksIG10dD0lZFxuIiwgX19GVU5DVElPTl9fICwgamlmZmllcywgbXR0KTsKKwkJCWlmIChtdHQpCisJCQkJdWRlbGF5KG10dCk7CisKKwkJCS8qIEVuYWJsZSBETUEgaW50ZXJydXB0ICovCisJCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworCSAJCW91dGIoSUNSX0VETUFJLCBpb2Jhc2UrSUNSKTsKKwkgICAgIAkJdzgzOTc3YWZfZG1hX3dyaXRlKHNlbGYsIGlvYmFzZSk7CisjaWZkZWYgQ09ORklHX1VTRV9JTlRFUk5BTF9USU1FUgorCQl9CisjZW5kaWYKKwl9IGVsc2UgeworCQlzZWxmLT50eF9idWZmLmRhdGEgPSBzZWxmLT50eF9idWZmLmhlYWQ7CisJCXNlbGYtPnR4X2J1ZmYubGVuID0gYXN5bmNfd3JhcF9za2Ioc2tiLCBzZWxmLT50eF9idWZmLmRhdGEsIAorCQkJCQkJICAgc2VsZi0+dHhfYnVmZi50cnVlc2l6ZSk7CisJCQorCQkvKiBBZGQgaW50ZXJydXB0IG9uIHR4IGxvdyBsZXZlbCAod2lsbCBmaXJlIGltbWVkaWF0ZWx5KSAqLworCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworCQlvdXRiKElDUl9FVFhUSEksIGlvYmFzZStJQ1IpOworCX0KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwkvKiBSZXN0b3JlIHNldCByZWdpc3RlciAqLworCW91dGIoc2V0LCBpb2Jhc2UrU1NSKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gdzgzOTc3YWZfZG1hX3dyaXRlIChzZWxmLCBpb2Jhc2UpCisgKgorICogICAgU2VuZCBmcmFtZSB1c2luZyBETUEKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHc4Mzk3N2FmX2RtYV93cml0ZShzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGYsIGludCBpb2Jhc2UpCit7CisJX191OCBzZXQ7CisjaWZkZWYgQ09ORklHX05FVFdJTkRFUl9UWF9ETUFfUFJPQkxFTVMKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCV9fdTggaGNyOworI2VuZGlmCisgICAgICAgIElSREFfREVCVUcoNCwgIiVzKCksIGxlbj0lZFxuIiwgX19GVU5DVElPTl9fICwgc2VsZi0+dHhfYnVmZi5sZW4pOworCisJLyogU2F2ZSBjdXJyZW50IHNldCAqLworCXNldCA9IGluYihpb2Jhc2UrU1NSKTsKKworCS8qIERpc2FibGUgRE1BICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKwlvdXRiKGluYihpb2Jhc2UrSENSKSAmIH5IQ1JfRU5fRE1BLCBpb2Jhc2UrSENSKTsKKworCS8qIENob29zZSB0cmFuc21pdCBETUEgY2hhbm5lbCAgKi8gCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQyKTsKKwlvdXRiKEFEQ1IxX0RfQ0hTV3wvKkFEQ1IxX0RNQV9GfCovQURDUjFfQURWX1NMLCBpb2Jhc2UrQURDUjEpOworI2lmZGVmIENPTkZJR19ORVRXSU5ERVJfVFhfRE1BX1BST0JMRU1TCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKworCWRpc2FibGVfZG1hKHNlbGYtPmlvLmRtYSk7CisJY2xlYXJfZG1hX2ZmKHNlbGYtPmlvLmRtYSk7CisJc2V0X2RtYV9tb2RlKHNlbGYtPmlvLmRtYSwgRE1BX01PREVfUkVBRCk7CisJc2V0X2RtYV9hZGRyKHNlbGYtPmlvLmRtYSwgc2VsZi0+dHhfYnVmZl9kbWEpOworCXNldF9kbWFfY291bnQoc2VsZi0+aW8uZG1hLCBzZWxmLT50eF9idWZmLmxlbik7CisjZWxzZQorCWlyZGFfc2V0dXBfZG1hKHNlbGYtPmlvLmRtYSwgc2VsZi0+dHhfYnVmZl9kbWEsIHNlbGYtPnR4X2J1ZmYubGVuLAorCQkgICAgICAgRE1BX01PREVfV1JJVEUpOwkKKyNlbmRpZgorCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1hNSVQ7CisJCisJLyogRW5hYmxlIERNQSAqLworIAlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworI2lmZGVmIENPTkZJR19ORVRXSU5ERVJfVFhfRE1BX1BST0JMRU1TCisJaGNyID0gaW5iKGlvYmFzZStIQ1IpOworCW91dGIoaGNyIHwgSENSX0VOX0RNQSwgaW9iYXNlK0hDUik7CisJZW5hYmxlX2RtYShzZWxmLT5pby5kbWEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlbGYtPmxvY2ssIGZsYWdzKTsKKyNlbHNlCQorCW91dGIoaW5iKGlvYmFzZStIQ1IpIHwgSENSX0VOX0RNQSB8IEhDUl9UWF9XVCwgaW9iYXNlK0hDUik7CisjZW5kaWYKKworCS8qIFJlc3RvcmUgc2V0IHJlZ2lzdGVyICovCisJb3V0YihzZXQsIGlvYmFzZStTU1IpOworfQorCisvKgorICogRnVuY3Rpb24gdzgzOTc3YWZfcGlvX3dyaXRlIChpb2Jhc2UsIGJ1ZiwgbGVuLCBmaWZvX3NpemUpCisgKgorICogICAgCisgKgorICovCitzdGF0aWMgaW50IHc4Mzk3N2FmX3Bpb193cml0ZShpbnQgaW9iYXNlLCBfX3U4ICpidWYsIGludCBsZW4sIGludCBmaWZvX3NpemUpCit7CisJaW50IGFjdHVhbCA9IDA7CisJX191OCBzZXQ7CisJCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwkvKiBTYXZlIGN1cnJlbnQgYmFuayAqLworCXNldCA9IGluYihpb2Jhc2UrU1NSKTsKKworCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMCk7CisJaWYgKCEoaW5iX3AoaW9iYXNlK1VTUikgJiBVU1JfVFNSRSkpIHsKKwkJSVJEQV9ERUJVRyg0LAorCQkJICAgIiVzKCksIHdhcm5pbmcsIEZJRk8gbm90IGVtcHR5IHlldCFcbiIsIF9fRlVOQ1RJT05fXyAgKTsKKworCQlmaWZvX3NpemUgLT0gMTc7CisJCUlSREFfREVCVUcoNCwgIiVzKCksICVkIGJ5dGVzIGxlZnQgaW4gdHggZmlmb1xuIiwgCisJCQkgICBfX0ZVTkNUSU9OX18gLCBmaWZvX3NpemUpOworCX0KKworCS8qIEZpbGwgRklGTyB3aXRoIGN1cnJlbnQgZnJhbWUgKi8KKwl3aGlsZSAoKGZpZm9fc2l6ZS0tID4gMCkgJiYgKGFjdHVhbCA8IGxlbikpIHsKKwkJLyogVHJhbnNtaXQgbmV4dCBieXRlICovCisJCW91dGIoYnVmW2FjdHVhbCsrXSwgaW9iYXNlK1RCUik7CisJfQorICAgICAgICAKKwlJUkRBX0RFQlVHKDQsICIlcygpLCBmaWZvX3NpemUgJWQgOyAlZCBzZW50IG9mICVkXG4iLCAKKwkJICAgX19GVU5DVElPTl9fICwgZmlmb19zaXplLCBhY3R1YWwsIGxlbik7CisKKwkvKiBSZXN0b3JlIGJhbmsgKi8KKwlvdXRiKHNldCwgaW9iYXNlK1NTUik7CisKKwlyZXR1cm4gYWN0dWFsOworfQorCisvKgorICogRnVuY3Rpb24gdzgzOTc3YWZfZG1hX3htaXRfY29tcGxldGUgKHNlbGYpCisgKgorICogICAgVGhlIHRyYW5zZmVyIG9mIGEgZnJhbWUgaW4gZmluaXNoZWQuIFNvIGRvIHRoZSBuZWNlc3NhcnkgdGhpbmdzCisgKgorICogICAgCisgKi8KK3N0YXRpYyB2b2lkIHc4Mzk3N2FmX2RtYV94bWl0X2NvbXBsZXRlKHN0cnVjdCB3ODM5NzdhZl9pciAqc2VsZikKK3sKKwlpbnQgaW9iYXNlOworCV9fdTggc2V0OworCisJSVJEQV9ERUJVRyg0LCAiJXMoJWxkKVxuIiwgX19GVU5DVElPTl9fICwgamlmZmllcyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwkvKiBTYXZlIGN1cnJlbnQgc2V0ICovCisJc2V0ID0gaW5iKGlvYmFzZStTU1IpOworCisJLyogRGlzYWJsZSBETUEgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworCW91dGIoaW5iKGlvYmFzZStIQ1IpICYgfkhDUl9FTl9ETUEsIGlvYmFzZStIQ1IpOworCQorCS8qIENoZWNrIGZvciB1bmRlcnJydW4hICovCisJaWYgKGluYihpb2Jhc2UrQVVEUikgJiBBVURSX1VORFIpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVHJhbnNtaXQgdW5kZXJydW4hXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJCisJCXNlbGYtPnN0YXRzLnR4X2Vycm9ycysrOworCQlzZWxmLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCisJCS8qIENsZWFyIGJpdCwgYnkgd3JpdGluZyAxIHRvIGl0ICovCisJCW91dGIoQVVEUl9VTkRSLCBpb2Jhc2UrQVVEUik7CisJfSBlbHNlCisJCXNlbGYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKworCQorCWlmIChzZWxmLT5uZXdfc3BlZWQpIHsKKwkJdzgzOTc3YWZfY2hhbmdlX3NwZWVkKHNlbGYsIHNlbGYtPm5ld19zcGVlZCk7CisJCXNlbGYtPm5ld19zcGVlZCA9IDA7CisJfQorCisJLyogVW5sb2NrIHR4X2J1ZmYgYW5kIHJlcXVlc3QgYW5vdGhlciBmcmFtZSAqLworCS8qIFRlbGwgdGhlIG5ldHdvcmsgbGF5ZXIsIHRoYXQgd2Ugd2FudCBtb3JlIGZyYW1lcyAqLworCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKKwkKKwkvKiBSZXN0b3JlIHNldCAqLworCW91dGIoc2V0LCBpb2Jhc2UrU1NSKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHc4Mzk3N2FmX2RtYV9yZWNlaXZlIChzZWxmKQorICoKKyAqICAgIEdldCByZWFkeSBmb3IgcmVjZWl2aW5nIGEgZnJhbWUuIFRoZSBkZXZpY2Ugd2lsbCBpbml0aWF0ZSBhIERNQQorICogICAgaWYgaXQgc3RhcnRzIHRvIHJlY2VpdmUgYSBmcmFtZS4KKyAqCisgKi8KK2ludCB3ODM5NzdhZl9kbWFfcmVjZWl2ZShzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGYpIAoreworCWludCBpb2Jhc2U7CisJX191OCBzZXQ7CisjaWZkZWYgQ09ORklHX05FVFdJTkRFUl9SWF9ETUFfUFJPQkxFTVMKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCV9fdTggaGNyOworI2VuZGlmCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCUlSREFfREVCVUcoNCwgIiVzXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCWlvYmFzZT0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwkvKiBTYXZlIGN1cnJlbnQgc2V0ICovCisJc2V0ID0gaW5iKGlvYmFzZStTU1IpOworCisJLyogRGlzYWJsZSBETUEgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworCW91dGIoaW5iKGlvYmFzZStIQ1IpICYgfkhDUl9FTl9ETUEsIGlvYmFzZStIQ1IpOworCisJLyogQ2hvb3NlIERNQSBSeCwgRE1BIEZhaXJuZXNzLCBhbmQgQWR2YW5jZWQgbW9kZSAqLworCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMik7CisJb3V0YigoaW5iKGlvYmFzZStBRENSMSkgJiB+QURDUjFfRF9DSFNXKS8qfEFEQ1IxX0RNQV9GKi98QURDUjFfQURWX1NMLAorCSAgICAgaW9iYXNlK0FEQ1IxKTsKKworCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1JFQ1Y7CisJc2VsZi0+cnhfYnVmZi5kYXRhID0gc2VsZi0+cnhfYnVmZi5oZWFkOworCisjaWZkZWYgQ09ORklHX05FVFdJTkRFUl9SWF9ETUFfUFJPQkxFTVMKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJZGlzYWJsZV9kbWEoc2VsZi0+aW8uZG1hKTsKKwljbGVhcl9kbWFfZmYoc2VsZi0+aW8uZG1hKTsKKwlzZXRfZG1hX21vZGUoc2VsZi0+aW8uZG1hLCBETUFfTU9ERV9SRUFEKTsKKwlzZXRfZG1hX2FkZHIoc2VsZi0+aW8uZG1hLCBzZWxmLT5yeF9idWZmX2RtYSk7CisJc2V0X2RtYV9jb3VudChzZWxmLT5pby5kbWEsIHNlbGYtPnJ4X2J1ZmYudHJ1ZXNpemUpOworI2Vsc2UKKwlpcmRhX3NldHVwX2RtYShzZWxmLT5pby5kbWEsIHNlbGYtPnJ4X2J1ZmZfZG1hLCBzZWxmLT5yeF9idWZmLnRydWVzaXplLAorCQkgICAgICAgRE1BX01PREVfUkVBRCk7CisjZW5kaWYKKwkvKiAKKwkgKiBSZXNldCBSeCBGSUZPLiBUaGlzIHdpbGwgYWxzbyBmbHVzaCB0aGUgU1RfRklGTywgaXQncyB2ZXJ5IAorCSAqIGltcG9ydGFudCB0aGF0IHdlIGRvbid0IHJlc2V0IHRoZSBUeCBGSUZPIHNpbmNlIGl0IG1pZ2h0IG5vdAorCSAqIGJlIGZpbmlzaGVkIHRyYW5zbWl0dGluZyB5ZXQKKwkgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworCW91dGIoVUZSX1JYVEx8VUZSX1RYVEx8VUZSX1JYRl9SU1R8VUZSX0VOX0ZJRk8sIGlvYmFzZStVRlIpOworCXNlbGYtPnN0X2ZpZm8ubGVuID0gc2VsZi0+c3RfZmlmby50YWlsID0gc2VsZi0+c3RfZmlmby5oZWFkID0gMDsKKwkKKwkvKiBFbmFibGUgRE1BICovCisJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKyNpZmRlZiBDT05GSUdfTkVUV0lOREVSX1JYX0RNQV9QUk9CTEVNUworCWhjciA9IGluYihpb2Jhc2UrSENSKTsKKwlvdXRiKGhjciB8IEhDUl9FTl9ETUEsIGlvYmFzZStIQ1IpOworCWVuYWJsZV9kbWEoc2VsZi0+aW8uZG1hKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisjZWxzZQkKKwlvdXRiKGluYihpb2Jhc2UrSENSKSB8IEhDUl9FTl9ETUEsIGlvYmFzZStIQ1IpOworI2VuZGlmCisJLyogUmVzdG9yZSBzZXQgKi8KKwlvdXRiKHNldCwgaW9iYXNlK1NTUik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHc4Mzk3N2FmX3JlY2VpdmVfY29tcGxldGUgKHNlbGYpCisgKgorICogICAgRmluaXNoZWQgd2l0aCByZWNlaXZpbmcgYSBmcmFtZQorICoKKyAqLworaW50IHc4Mzk3N2FmX2RtYV9yZWNlaXZlX2NvbXBsZXRlKHN0cnVjdCB3ODM5NzdhZl9pciAqc2VsZikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBzdF9maWZvICpzdF9maWZvOworCWludCBsZW47CisJaW50IGlvYmFzZTsKKwlfX3U4IHNldDsKKwlfX3U4IHN0YXR1czsKKworCUlSREFfREVCVUcoNCwgIiVzXG4iLCBfX0ZVTkNUSU9OX18gKTsKKworCXN0X2ZpZm8gPSAmc2VsZi0+c3RfZmlmbzsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCisJLyogU2F2ZSBjdXJyZW50IHNldCAqLworCXNldCA9IGluYihpb2Jhc2UrU1NSKTsKKwkKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCS8qIFJlYWQgc3RhdHVzIEZJRk8gKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDUpOworCXdoaWxlICgoc3RhdHVzID0gaW5iKGlvYmFzZStGU19GTykpICYgRlNfRk9fRlNGRFIpIHsKKwkJc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT50YWlsXS5zdGF0dXMgPSBzdGF0dXM7CisJCQorCQlzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPnRhaWxdLmxlbiAgPSBpbmIoaW9iYXNlK1JGTEZMKTsKKwkJc3RfZmlmby0+ZW50cmllc1tzdF9maWZvLT50YWlsXS5sZW4gfD0gaW5iKGlvYmFzZStSRkxGSCkgPDwgODsKKwkJCisJCXN0X2ZpZm8tPnRhaWwrKzsKKwkJc3RfZmlmby0+bGVuKys7CisJfQorCQorCXdoaWxlIChzdF9maWZvLT5sZW4pIHsKKwkJLyogR2V0IGZpcnN0IGVudHJ5ICovCisJCXN0YXR1cyA9IHN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0uc3RhdHVzOworCQlsZW4gICAgPSBzdF9maWZvLT5lbnRyaWVzW3N0X2ZpZm8tPmhlYWRdLmxlbjsKKwkJc3RfZmlmby0+aGVhZCsrOworCQlzdF9maWZvLT5sZW4tLTsKKworCQkvKiBDaGVjayBmb3IgZXJyb3JzICovCisJCWlmIChzdGF0dXMgJiBGU19GT19FUlJfTVNLKSB7CisJCQlpZiAoc3RhdHVzICYgRlNfRk9fTFNUX0ZSKSB7CisJCQkJLyogQWRkIG51bWJlciBvZiBsb3N0IGZyYW1lcyB0byBzdGF0cyAqLworCQkJCXNlbGYtPnN0YXRzLnJ4X2Vycm9ycyArPSBsZW47CQorCQkJfSBlbHNlIHsKKwkJCQkvKiBTa2lwIGZyYW1lICovCisJCQkJc2VsZi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCisJCQkJc2VsZi0+cnhfYnVmZi5kYXRhICs9IGxlbjsKKwkJCQkKKwkJCQlpZiAoc3RhdHVzICYgRlNfRk9fTVhfTEVYKQorCQkJCQlzZWxmLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJCisJCQkJaWYgKHN0YXR1cyAmIEZTX0ZPX1BIWV9FUlIpIAorCQkJCQlzZWxmLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQkKKwkJCQlpZiAoc3RhdHVzICYgRlNfRk9fQ1JDX0VSUikgCisJCQkJCXNlbGYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCX0KKwkJCS8qIFRoZSBlcnJvcnMgYmVsb3cgY2FuIGJlIHJlcG9ydGVkIGluIGJvdGggY2FzZXMgKi8KKwkJCWlmIChzdGF0dXMgJiBGU19GT19SWF9PVikKKwkJCQlzZWxmLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJCisJCQlpZiAoc3RhdHVzICYgRlNfRk9fRlNGX09WKQorCQkJCXNlbGYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQkKKwkJfSBlbHNlIHsKKwkJCS8qIENoZWNrIGlmIHdlIGhhdmUgdHJhbnNmZXJyZWQgYWxsIGRhdGEgdG8gbWVtb3J5ICovCisJCQlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworCQkJaWYgKGluYihpb2Jhc2UrVVNSKSAmIFVTUl9SRFIpIHsKKyNpZmRlZiBDT05GSUdfVVNFX0lOVEVSTkFMX1RJTUVSCisJCQkJLyogUHV0IHRoaXMgZW50cnkgYmFjayBpbiBmaWZvICovCisJCQkJc3RfZmlmby0+aGVhZC0tOworCQkJCXN0X2ZpZm8tPmxlbisrOworCQkJCXN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0uc3RhdHVzID0gc3RhdHVzOworCQkJCXN0X2ZpZm8tPmVudHJpZXNbc3RfZmlmby0+aGVhZF0ubGVuID0gbGVuOworCQkJCQorCQkJCS8qIFJlc3RvcmUgc2V0IHJlZ2lzdGVyICovCisJCQkJb3V0YihzZXQsIGlvYmFzZStTU1IpOworCQkJCisJCQkJcmV0dXJuIEZBTFNFOyAJLyogSSdsbCBiZSBiYWNrISAqLworI2Vsc2UKKwkJCQl1ZGVsYXkoODApOyAvKiBTaG91bGQgYmUgZW5vdWdoIT8gKi8KKyNlbmRpZgorCQkJfQorCQkJCQkJCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbisxKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJICAgICAgICIlcygpLCBtZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgZnJhbWUuXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCS8qIFJlc3RvcmUgc2V0IHJlZ2lzdGVyICovCisJCQkJb3V0YihzZXQsIGlvYmFzZStTU1IpOworCisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJCisJCQkvKiAgQWxpZ24gdG8gMjAgYnl0ZXMgKi8KKwkJCXNrYl9yZXNlcnZlKHNrYiwgMSk7IAorCQkJCisJCQkvKiBDb3B5IGZyYW1lIHdpdGhvdXQgQ1JDICovCisJCQlpZiAoc2VsZi0+aW8uc3BlZWQgPCA0MDAwMDAwKSB7CisJCQkJc2tiX3B1dChza2IsIGxlbi0yKTsKKwkJCQltZW1jcHkoc2tiLT5kYXRhLCBzZWxmLT5yeF9idWZmLmRhdGEsIGxlbi0yKTsKKwkJCX0gZWxzZSB7CisJCQkJc2tiX3B1dChza2IsIGxlbi00KTsKKwkJCQltZW1jcHkoc2tiLT5kYXRhLCBzZWxmLT5yeF9idWZmLmRhdGEsIGxlbi00KTsKKwkJCX0KKworCQkJLyogTW92ZSB0byBuZXh0IGZyYW1lICovCisJCQlzZWxmLT5yeF9idWZmLmRhdGEgKz0gbGVuOworCQkJc2VsZi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCisJCQlza2ItPmRldiA9IHNlbGYtPm5ldGRldjsKKwkJCXNrYi0+bWFjLnJhdyAgPSBza2ItPmRhdGE7CisJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CisJCQluZXRpZl9yeChza2IpOworCQkJc2VsZi0+bmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJfQorCX0KKwkvKiBSZXN0b3JlIHNldCByZWdpc3RlciAqLworCW91dGIoc2V0LCBpb2Jhc2UrU1NSKTsKKworCXJldHVybiBUUlVFOworfQorCisvKgorICogRnVuY3Rpb24gcGM4NzEwOF9waW9fcmVjZWl2ZSAoc2VsZikKKyAqCisgKiAgICBSZWNlaXZlIGFsbCBkYXRhIGluIHJlY2VpdmVyIEZJRk8KKyAqCisgKi8KK3N0YXRpYyB2b2lkIHc4Mzk3N2FmX3Bpb19yZWNlaXZlKHN0cnVjdCB3ODM5NzdhZl9pciAqc2VsZikgCit7CisJX191OCBieXRlID0gMHgwMDsKKwlpbnQgaW9iYXNlOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCQorCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCQorCS8qICBSZWNlaXZlIGFsbCBjaGFyYWN0ZXJzIGluIFJ4IEZJRk8gKi8KKwlkbyB7CisJCWJ5dGUgPSBpbmIoaW9iYXNlK1JCUik7CisJCWFzeW5jX3Vud3JhcF9jaGFyKHNlbGYtPm5ldGRldiwgJnNlbGYtPnN0YXRzLCAmc2VsZi0+cnhfYnVmZiwgCisJCQkJICBieXRlKTsKKwl9IHdoaWxlIChpbmIoaW9iYXNlK1VTUikgJiBVU1JfUkRSKTsgLyogRGF0YSBhdmFpbGFibGUgKi8JCit9CisKKy8qCisgKiBGdW5jdGlvbiB3ODM5NzdhZl9zaXJfaW50ZXJydXB0IChzZWxmLCBlaXIpCisgKgorICogICAgSGFuZGxlIFNJUiBpbnRlcnJ1cHQKKyAqCisgKi8KK3N0YXRpYyBfX3U4IHc4Mzk3N2FmX3Npcl9pbnRlcnJ1cHQoc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmLCBpbnQgaXNyKQoreworCWludCBhY3R1YWw7CisJX191OCBuZXdfaWNyID0gMDsKKwlfX3U4IHNldDsKKwlpbnQgaW9iYXNlOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgaXNyPSUjeFxuIiwgX19GVU5DVElPTl9fICwgaXNyKTsKKwkKKwlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKwkvKiBUcmFuc21pdCBGSUZPIGxvdyBvbiBkYXRhICovCisJaWYgKGlzciAmIElTUl9UWFRIX0kpIHsKKwkJLyogV3JpdGUgZGF0YSBsZWZ0IGluIHRyYW5zbWl0IGJ1ZmZlciAqLworCQlhY3R1YWwgPSB3ODM5NzdhZl9waW9fd3JpdGUoc2VsZi0+aW8uZmlyX2Jhc2UsIAorCQkJCQkgICAgc2VsZi0+dHhfYnVmZi5kYXRhLCAKKwkJCQkJICAgIHNlbGYtPnR4X2J1ZmYubGVuLCAKKwkJCQkJICAgIHNlbGYtPmlvLmZpZm9fc2l6ZSk7CisKKwkJc2VsZi0+dHhfYnVmZi5kYXRhICs9IGFjdHVhbDsKKwkJc2VsZi0+dHhfYnVmZi5sZW4gIC09IGFjdHVhbDsKKwkJCisJCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1hNSVQ7CisKKwkJLyogQ2hlY2sgaWYgZmluaXNoZWQgKi8KKwkJaWYgKHNlbGYtPnR4X2J1ZmYubGVuID4gMCkgeworCQkJbmV3X2ljciB8PSBJQ1JfRVRYVEhJOworCQl9IGVsc2UgeworCQkJc2V0ID0gaW5iKGlvYmFzZStTU1IpOworCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsKKwkJCW91dGIoQVVEUl9TRkVORCwgaW9iYXNlK0FVRFIpOworCQkJb3V0YihzZXQsIGlvYmFzZStTU1IpOyAKKworCQkJc2VsZi0+c3RhdHMudHhfcGFja2V0cysrOworCisJCQkvKiBGZWVkIG1lIG1vcmUgcGFja2V0cyAqLworCQkJbmV0aWZfd2FrZV9xdWV1ZShzZWxmLT5uZXRkZXYpOworCQkJbmV3X2ljciB8PSBJQ1JfRVRCUkVJOworCQl9CisJfQorCS8qIENoZWNrIGlmIHRyYW5zbWlzc2lvbiBoYXMgY29tcGxldGVkICovCisJaWYgKGlzciAmIElTUl9UWEVNUF9JKSB7CQkKKwkJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHNwZWVkPyAqLworCQlpZiAoc2VsZi0+bmV3X3NwZWVkKSB7CisJCQlJUkRBX0RFQlVHKDIsCisJCQkJICAgIiVzKCksIENoYW5naW5nIHNwZWVkIVxuIiwgX19GVU5DVElPTl9fICk7CisJCQl3ODM5NzdhZl9jaGFuZ2Vfc3BlZWQoc2VsZiwgc2VsZi0+bmV3X3NwZWVkKTsKKwkJCXNlbGYtPm5ld19zcGVlZCA9IDA7CisJCX0KKworCQkvKiBUdXJuIGFyb3VuZCBhbmQgZ2V0IHJlYWR5IHRvIHJlY2VpdmUgc29tZSBkYXRhICovCisJCXNlbGYtPmlvLmRpcmVjdGlvbiA9IElPX1JFQ1Y7CisJCW5ld19pY3IgfD0gSUNSX0VSQlJJOworCX0KKworCS8qIFJ4IEZJRk8gdGhyZXNob2xkIG9yIHRpbWVvdXQgKi8KKwlpZiAoaXNyICYgSVNSX1JYVEhfSSkgeworCQl3ODM5NzdhZl9waW9fcmVjZWl2ZShzZWxmKTsKKworCQkvKiBLZWVwIHJlY2VpdmluZyAqLworCQluZXdfaWNyIHw9IElDUl9FUkJSSTsKKwl9CisJcmV0dXJuIG5ld19pY3I7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBwYzg3MTA4X2Zpcl9pbnRlcnJ1cHQgKHNlbGYsIGVpcikKKyAqCisgKiAgICBIYW5kbGUgTUlSL0ZJUiBpbnRlcnJ1cHQKKyAqCisgKi8KK3N0YXRpYyBfX3U4IHc4Mzk3N2FmX2Zpcl9pbnRlcnJ1cHQoc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmLCBpbnQgaXNyKQoreworCV9fdTggbmV3X2ljciA9IDA7CisJX191OCBzZXQ7CisJaW50IGlvYmFzZTsKKworCWlvYmFzZSA9IHNlbGYtPmlvLmZpcl9iYXNlOworCXNldCA9IGluYihpb2Jhc2UrU1NSKTsKKwkKKwkvKiBFbmQgb2YgZnJhbWUgZGV0ZWN0ZWQgaW4gRklGTyAqLworCWlmIChpc3IgJiAoSVNSX0ZFTkRfSXxJU1JfRlNGX0kpKSB7CisJCWlmICh3ODM5NzdhZl9kbWFfcmVjZWl2ZV9jb21wbGV0ZShzZWxmKSkgeworCQkJCisJCQkvKiBXYWl0IGZvciBuZXh0IHN0YXR1cyBGSUZPIGludGVycnVwdCAqLworCQkJbmV3X2ljciB8PSBJQ1JfRUZTRkk7CisJCX0gZWxzZSB7CisJCQkvKiBETUEgbm90IGZpbmlzaGVkIHlldCAqLworCisJCQkvKiBTZXQgdGltZXIgdmFsdWUsIHJlc29sdXRpb24gMSBtcyAqLworCQkJc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQ0KTsKKwkJCW91dGIoMHgwMSwgaW9iYXNlK1RNUkwpOyAvKiAxIG1zICovCisJCQlvdXRiKDB4MDAsIGlvYmFzZStUTVJIKTsKKworCQkJLyogU3RhcnQgdGltZXIgKi8KKwkJCW91dGIoSVJfTVNMX0VOX1RNUiwgaW9iYXNlK0lSX01TTCk7CisKKwkJCW5ld19pY3IgfD0gSUNSX0VUTVJJOworCQl9CisJfQorCS8qIFRpbWVyIGZpbmlzaGVkICovCisJaWYgKGlzciAmIElTUl9UTVJfSSkgeworCQkvKiBEaXNhYmxlIHRpbWVyICovCisJCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUNCk7CisJCW91dGIoMCwgaW9iYXNlK0lSX01TTCk7CisKKwkJLyogQ2xlYXIgdGltZXIgZXZlbnQgKi8KKwkJLyogc3dpdGNoX2JhbmsoaW9iYXNlLCBTRVQwKTsgKi8KKy8qIAkJb3V0YihBU0NSX0NURSwgaW9iYXNlK0FTQ1IpOyAqLworCisJCS8qIENoZWNrIGlmIHRoaXMgaXMgYSBUWCB0aW1lciBpbnRlcnJ1cHQgKi8KKwkJaWYgKHNlbGYtPmlvLmRpcmVjdGlvbiA9PSBJT19YTUlUKSB7CisJCQl3ODM5NzdhZl9kbWFfd3JpdGUoc2VsZiwgaW9iYXNlKTsKKworCQkJbmV3X2ljciB8PSBJQ1JfRURNQUk7CisJCX0gZWxzZSB7CisJCQkvKiBDaGVjayBpZiBETUEgaGFzIG5vdyBmaW5pc2hlZCAqLworCQkJdzgzOTc3YWZfZG1hX3JlY2VpdmVfY29tcGxldGUoc2VsZik7CisKKwkJCW5ld19pY3IgfD0gSUNSX0VGU0ZJOworCQl9CisJfQkKKwkvKiBGaW5pc2hlZCB3aXRoIERNQSAqLworCWlmIChpc3IgJiBJU1JfRE1BX0kpIHsKKwkJdzgzOTc3YWZfZG1hX3htaXRfY29tcGxldGUoc2VsZik7CisKKwkJLyogQ2hlY2sgaWYgdGhlcmUgYXJlIG1vcmUgZnJhbWVzIHRvIGJlIHRyYW5zbWl0dGVkICovCisJCS8qIGlmIChpcmRhX2RldmljZV90eHF1ZXVlX2VtcHR5KHNlbGYpKSB7ICovCisJCQorCQkvKiBQcmVwYXJlIGZvciByZWNlaXZlIAorCQkgKiAKKwkJICogKiogTmV0d2luZGVyIFR4IERNQSBsaWtlcyB0aGF0IHdlIGRvIHRoaXMgYW55d2F5ICoqCisJCSAqLworCQl3ODM5NzdhZl9kbWFfcmVjZWl2ZShzZWxmKTsKKwkJbmV3X2ljciA9IElDUl9FRlNGSTsKKwkgICAgICAgLyogfSAqLworCX0KKwkKKwkvKiBSZXN0b3JlIHNldCAqLworCW91dGIoc2V0LCBpb2Jhc2UrU1NSKTsKKworCXJldHVybiBuZXdfaWNyOworfQorCisvKgorICogRnVuY3Rpb24gdzgzOTc3YWZfaW50ZXJydXB0IChpcnEsIGRldl9pZCwgcmVncykKKyAqCisgKiAgICBBbiBpbnRlcnJ1cHQgZnJvbSB0aGUgY2hpcCBoYXMgYXJyaXZlZC4gVGltZSB0byBkbyBzb21lIHdvcmsKKyAqCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB3ODM5NzdhZl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGY7CisJX191OCBzZXQsIGljciwgaXNyOworCWludCBpb2Jhc2U7CisKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIAorCQkJZHJpdmVyX25hbWUsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJc2VsZiA9IChzdHJ1Y3QgdzgzOTc3YWZfaXIgKikgZGV2LT5wcml2OworCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwkvKiBTYXZlIGN1cnJlbnQgYmFuayAqLworCXNldCA9IGluYihpb2Jhc2UrU1NSKTsKKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworCQorCWljciA9IGluYihpb2Jhc2UrSUNSKTsgCisJaXNyID0gaW5iKGlvYmFzZStJU1IpICYgaWNyOyAvKiBNYXNrIG91dCB0aGUgaW50ZXJlc3Rpbmcgb25lcyAqLyAKKworCW91dGIoMCwgaW9iYXNlK0lDUik7IC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCQorCWlmIChpc3IpIHsKKwkJLyogRGlzcGF0Y2ggaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBjdXJyZW50IHNwZWVkICovCisJCWlmIChzZWxmLT5pby5zcGVlZCA+IFBJT19NQVhfU1BFRUQgKQorCQkJaWNyID0gdzgzOTc3YWZfZmlyX2ludGVycnVwdChzZWxmLCBpc3IpOworCQllbHNlCisJCQlpY3IgPSB3ODM5NzdhZl9zaXJfaW50ZXJydXB0KHNlbGYsIGlzcik7CisJfQorCisJb3V0YihpY3IsIGlvYmFzZStJQ1IpOyAgICAvKiBSZXN0b3JlIChuZXcpIGludGVycnVwdHMgKi8KKwlvdXRiKHNldCwgaW9iYXNlK1NTUik7ICAgIC8qIFJlc3RvcmUgYmFuayByZWdpc3RlciAqLworCXJldHVybiBJUlFfUkVUVkFMKGlzcik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB3ODM5NzdhZl9pc19yZWNlaXZpbmcgKHNlbGYpCisgKgorICogICAgUmV0dXJuIFRSVUUgaXMgd2UgYXJlIGN1cnJlbnRseSByZWNlaXZpbmcgYSBmcmFtZQorICoKKyAqLworc3RhdGljIGludCB3ODM5NzdhZl9pc19yZWNlaXZpbmcoc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmKQoreworCWludCBzdGF0dXMgPSBGQUxTRTsKKwlpbnQgaW9iYXNlOworCV9fdTggc2V0OworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gRkFMU0U7KTsKKworCWlmIChzZWxmLT5pby5zcGVlZCA+IDExNTIwMCkgeworCQlpb2Jhc2UgPSBzZWxmLT5pby5maXJfYmFzZTsKKworCQkvKiBDaGVjayBpZiByeCBGSUZPIGlzIG5vdCBlbXB0eSAqLworCQlzZXQgPSBpbmIoaW9iYXNlK1NTUik7CisJCXN3aXRjaF9iYW5rKGlvYmFzZSwgU0VUMik7CisJCWlmICgoaW5iKGlvYmFzZStSWEZEVEgpICYgMHgzZikgIT0gMCkgeworCQkJLyogV2UgYXJlIHJlY2VpdmluZyBzb21ldGhpbmcgKi8KKwkJCXN0YXR1cyA9ICBUUlVFOworCQl9CisJCW91dGIoc2V0LCBpb2Jhc2UrU1NSKTsKKwl9IGVsc2UgCisJCXN0YXR1cyA9IChzZWxmLT5yeF9idWZmLnN0YXRlICE9IE9VVFNJREVfRlJBTUUpOworCQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBGdW5jdGlvbiB3ODM5NzdhZl9uZXRfb3BlbiAoZGV2KQorICoKKyAqICAgIFN0YXJ0IHRoZSBkZXZpY2UKKyAqCisgKi8KK3N0YXRpYyBpbnQgdzgzOTc3YWZfbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGY7CisJaW50IGlvYmFzZTsKKwljaGFyIGh3bmFtZVszMl07CisJX191OCBzZXQ7CisJCisJSVJEQV9ERUJVRygwLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CisJCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCXNlbGYgPSAoc3RydWN0IHc4Mzk3N2FmX2lyICopIGRldi0+cHJpdjsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CisJCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwlpZiAocmVxdWVzdF9pcnEoc2VsZi0+aW8uaXJxLCB3ODM5NzdhZl9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgCisJCQkodm9pZCAqKSBkZXYpKSB7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwkvKgorCSAqIEFsd2F5cyBhbGxvY2F0ZSB0aGUgRE1BIGNoYW5uZWwgYWZ0ZXIgdGhlIElSUSwKKwkgKiBhbmQgY2xlYW4gdXAgb24gZmFpbHVyZS4KKwkgKi8KKwlpZiAocmVxdWVzdF9kbWEoc2VsZi0+aW8uZG1hLCBkZXYtPm5hbWUpKSB7CisJCWZyZWVfaXJxKHNlbGYtPmlvLmlycSwgc2VsZik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwkJCisJLyogU2F2ZSBjdXJyZW50IHNldCAqLworCXNldCA9IGluYihpb2Jhc2UrU1NSKTsKKworIAkvKiBFbmFibGUgc29tZSBpbnRlcnJ1cHRzIHNvIHdlIGNhbiByZWNlaXZlIGZyYW1lcyBhZ2FpbiAqLworIAlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworIAlpZiAoc2VsZi0+aW8uc3BlZWQgPiAxMTUyMDApIHsKKyAJCW91dGIoSUNSX0VGU0ZJLCBpb2Jhc2UrSUNSKTsKKyAJCXc4Mzk3N2FmX2RtYV9yZWNlaXZlKHNlbGYpOworIAl9IGVsc2UKKyAJCW91dGIoSUNSX0VSQlJJLCBpb2Jhc2UrSUNSKTsKKworCS8qIFJlc3RvcmUgYmFuayByZWdpc3RlciAqLworCW91dGIoc2V0LCBpb2Jhc2UrU1NSKTsKKworCS8qIFJlYWR5IHRvIHBsYXkhICovCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkKKwkvKiBHaXZlIHNlbGYgYSBoYXJkd2FyZSBuYW1lICovCisJc3ByaW50Zihod25hbWUsICJ3ODM5NzdhZiBAIDB4JTAzeCIsIHNlbGYtPmlvLmZpcl9iYXNlKTsKKworCS8qIAorCSAqIE9wZW4gbmV3IElyTEFQIGxheWVyIGluc3RhbmNlLCBub3cgdGhhdCBldmVyeXRoaW5nIHNob3VsZCBiZQorCSAqIGluaXRpYWxpemVkIHByb3Blcmx5IAorCSAqLworCXNlbGYtPmlybGFwID0gaXJsYXBfb3BlbihkZXYsICZzZWxmLT5xb3MsIGh3bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHc4Mzk3N2FmX25ldF9jbG9zZSAoZGV2KQorICoKKyAqICAgIFN0b3AgdGhlIGRldmljZQorICoKKyAqLworc3RhdGljIGludCB3ODM5NzdhZl9uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGY7CisJaW50IGlvYmFzZTsKKwlfX3U4IHNldDsKKworCUlSREFfREVCVUcoMCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOworCisJSVJEQV9BU1NFUlQoZGV2ICE9IE5VTEwsIHJldHVybiAtMTspOworCQorCXNlbGYgPSAoc3RydWN0IHc4Mzk3N2FmX2lyICopIGRldi0+cHJpdjsKKwkKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAwOyk7CisJCisJaW9iYXNlID0gc2VsZi0+aW8uZmlyX2Jhc2U7CisKKwkvKiBTdG9wIGRldmljZSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwkvKiBTdG9wIGFuZCByZW1vdmUgaW5zdGFuY2Ugb2YgSXJMQVAgKi8KKwlpZiAoc2VsZi0+aXJsYXApCisJCWlybGFwX2Nsb3NlKHNlbGYtPmlybGFwKTsKKwlzZWxmLT5pcmxhcCA9IE5VTEw7CisKKwlkaXNhYmxlX2RtYShzZWxmLT5pby5kbWEpOworCisJLyogU2F2ZSBjdXJyZW50IHNldCAqLworCXNldCA9IGluYihpb2Jhc2UrU1NSKTsKKwkKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlzd2l0Y2hfYmFuayhpb2Jhc2UsIFNFVDApOworCW91dGIoMCwgaW9iYXNlK0lDUik7IAorCisJZnJlZV9pcnEoc2VsZi0+aW8uaXJxLCBkZXYpOworCWZyZWVfZG1hKHNlbGYtPmlvLmRtYSk7CisKKwkvKiBSZXN0b3JlIGJhbmsgcmVnaXN0ZXIgKi8KKwlvdXRiKHNldCwgaW9iYXNlK1NTUik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHc4Mzk3N2FmX25ldF9pb2N0bCAoZGV2LCBycSwgY21kKQorICoKKyAqICAgIFByb2Nlc3MgSU9DVEwgY29tbWFuZHMgZm9yIHRoaXMgZGV2aWNlCisgKgorICovCitzdGF0aWMgaW50IHc4Mzk3N2FmX25ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBpZl9pcmRhX3JlcSAqaXJxID0gKHN0cnVjdCBpZl9pcmRhX3JlcSAqKSBycTsKKwlzdHJ1Y3QgdzgzOTc3YWZfaXIgKnNlbGY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCUlSREFfQVNTRVJUKGRldiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKworCXNlbGYgPSBkZXYtPnByaXY7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybiAtMTspOworCisJSVJEQV9ERUJVRygyLCAiJXMoKSwgJXMsIChjbWQ9MHglWClcbiIsIF9fRlVOQ1RJT05fXyAsIGRldi0+bmFtZSwgY21kKTsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VsZi0+bG9jaywgZmxhZ3MpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NTQkFORFdJRFRIOiAvKiBTZXQgYmFuZHdpZHRoICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJcmV0ID0gLUVQRVJNOworCQkJZ290byBvdXQ7CisJCX0KKwkJdzgzOTc3YWZfY2hhbmdlX3NwZWVkKHNlbGYsIGlycS0+aWZyX2JhdWRyYXRlKTsKKwkJYnJlYWs7CisJY2FzZSBTSU9DU01FRElBQlVTWTogLyogU2V0IG1lZGlhIGJ1c3kgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlyZXQgPSAtRVBFUk07CisJCQlnb3RvIG91dDsKKwkJfQorCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShzZWxmLT5uZXRkZXYsIFRSVUUpOworCQlicmVhazsKKwljYXNlIFNJT0NHUkVDRUlWSU5HOiAvKiBDaGVjayBpZiB3ZSBhcmUgcmVjZWl2aW5nIHJpZ2h0IG5vdyAqLworCQlpcnEtPmlmcl9yZWNlaXZpbmcgPSB3ODM5NzdhZl9pc19yZWNlaXZpbmcoc2VsZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZWxmLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp3ODM5NzdhZl9uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHc4Mzk3N2FmX2lyICpzZWxmID0gKHN0cnVjdCB3ODM5NzdhZl9pciAqKSBkZXYtPnByaXY7CisJCisJcmV0dXJuICZzZWxmLT5zdGF0czsKK30KKworTU9EVUxFX0FVVEhPUigiRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJXaW5ib25kIFc4Mzk3N0FGIElyREEgRGV2aWNlIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKK21vZHVsZV9wYXJhbShxb3NfbXR0X2JpdHMsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHFvc19tdHRfYml0cywgIk1pbWltdW0gVHVybiBUaW1lIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiQmFzZSBJL08gYWRkcmVzc2VzIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJJUlEgbGluZXMiKTsKKworLyoKKyAqIEZ1bmN0aW9uIGluaXRfbW9kdWxlICh2b2lkKQorICoKKyAqICAgIAorICoKKyAqLworbW9kdWxlX2luaXQodzgzOTc3YWZfaW5pdCk7CisKKy8qCisgKiBGdW5jdGlvbiBjbGVhbnVwX21vZHVsZSAodm9pZCkKKyAqCisgKiAgICAKKyAqCisgKi8KK21vZHVsZV9leGl0KHc4Mzk3N2FmX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5oIGIvZHJpdmVycy9uZXQvaXJkYS93ODM5NzdhZl9pci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNzY2MWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9pcmRhL3c4Mzk3N2FmX2lyLmgKQEAgLTAsMCArMSwxOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgIAorICogRmlsZW5hbWU6ICAgICAgdzgzOTc3YWZfaXIuaAorICogVmVyc2lvbjogICAgICAgCisgKiBEZXNjcmlwdGlvbjogICAKKyAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KKyAqIEF1dGhvcjogICAgICAgIFBhdWwgVmFuZGVyU3BlaworICogQ3JlYXRlZCBhdDogICAgVGh1IE5vdiAxOSAxMzo1NTozNCAxOTk4CisgKiBNb2RpZmllZCBhdDogICBUdWUgSmFuIDExIDEzOjA4OjE5IDIwMDAKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIAorICogICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgICAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogIAorICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKKyAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgVzgzOTc3QUZfSVJfSAorI2RlZmluZSBXODM5NzdBRl9JUl9ICisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBGbGFncyBmb3IgY29uZmlndXJhdGlvbiByZWdpc3RlciBDUkYwICovCisjZGVmaW5lIEVOQk5LU0VMCTB4MDEKKyNkZWZpbmUgQVBFRENSQwkJMHgwMgorI2RlZmluZSBUWFc0QyAgICAgICAgICAgMHgwNAorI2RlZmluZSBSWFc0QyAgICAgICAgICAgMHgwOAorCisvKiBCYW5rIDAgKi8KKyNkZWZpbmUgUkJSICAgICAgICAgICAgIDB4MDAgLyogUmVjZWl2ZXIgYnVmZmVyIHJlZ2lzdGVyICovCisjZGVmaW5lIFRCUiAgICAgICAgICAgICAweDAwIC8qIFRyYW5zbWl0dGVyIGJ1ZmZlciByZWdpc3RlciAqLworCisjZGVmaW5lIElDUgkJMHgwMSAvKiBJbnRlcnJ1cHQgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworI2RlZmluZSBJQ1JfRVJCUkkgICAgICAgMHgwMSAvKiBSZWNlaXZlciBidWZmZXIgcmVnaXN0ZXIgaW50ZXJydXB0ICovCisjZGVmaW5lIElDUl9FVEJSRUkgICAgICAweDAyIC8qIFRyYW5zZWl2ZXIgZW1wdHkgaW50ZXJydXB0ICovCisjZGVmaW5lIElDUl9FVVNSSQkweDA0Ly8qIElSIHN0YXR1cyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSUNSX0VIU1JJICAgICAgIDB4MDQKKyNkZWZpbmUgSUNSX0VUWFVSSSAgICAgIDB4MDQgLyogVHggdW5kZXJydW4gKi8KKyNkZWZpbmUgSUNSX0VETUFJCTB4MTAgLyogRE1BIGludGVycnVwdCAqLworI2RlZmluZSBJQ1JfRVRYVEhJICAgICAgMHgyMCAvKiBUcmFuc21pdHRlciB0aHJlc2hvbGQgaW50ZXJydXB0ICovCisjZGVmaW5lIElDUl9FRlNGSSAgICAgICAweDQwIC8qIEZyYW1lIHN0YXR1cyBGSUZPIGludGVycnVwdCAqLworI2RlZmluZSBJQ1JfRVRNUkkgICAgICAgMHg4MCAvKiBUaW1lciBpbnRlcnJ1cHQgKi8KKworI2RlZmluZSBVRlIJCTB4MDIgLyogRklGTyBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFVGUl9FTl9GSUZPICAgICAweDAxIC8qIEVuYWJsZSBGSUZPJ3MgKi8KKyNkZWZpbmUgVUZSX1JYRl9SU1QgICAgIDB4MDIgLyogUmVzZXQgUnggRklGTyAqLworI2RlZmluZSBVRlJfVFhGX1JTVCAgICAgMHgwNCAvKiBSZXNldCBUeCBGSUZPICovCisjZGVmaW5lIFVGUl9SWFRMCTB4ODAgLyogUnggRklGTyB0aHJlc2hvbGQgKHNldCB0byAxNikgKi8KKyNkZWZpbmUgVUZSX1RYVEwJMHgyMCAvKiBUeCBGSUZPIHRocmVzaG9sZCAoc2V0IHRvIDE3KSAqLworCisjZGVmaW5lIElTUgkJMHgwMiAvKiBJbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIElTUl9SWFRIX0kJMHgwMSAvKiBSZWNlaXZlIHRocmVzaG9sZCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVNSX1RYRU1QX0kgICAgIDB4MDIgLyogVHJhbnNtaXR0ZXIgZW1wdHkgaW50ZXJydXB0ICovCisjZGVmaW5lIElTUl9GRU5EX0kJMHgwNAorI2RlZmluZSBJU1JfRE1BX0kJMHgxMAorI2RlZmluZSBJU1JfVFhUSF9JCTB4MjAgLyogVHJhbnNtaXR0ZXIgdGhyZXNob2xkIGludGVycnVwdCAqLworI2RlZmluZSBJU1JfRlNGX0kgICAgICAgMHg0MAorI2RlZmluZSBJU1JfVE1SX0kgICAgICAgMHg4MCAvKiBUaW1lciBpbnRlcnJ1cHQgKi8KKworI2RlZmluZSBVQ1IgICAgICAgICAgICAgMHgwMyAvKiBVYXJ0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVUNSX0RMUzggICAgICAgIDB4MDMgLyogOE4xICovCisKKyNkZWZpbmUgU1NSIAkgICAgICAgIDB4MDMgLyogU2V0cyBzZWxlY3QgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0VUMCAJICAgICAgICBVQ1JfRExTOCAgICAgICAgLyogTWFrZSBzdXJlIHdlIGtlZXAgOE4xICovCisjZGVmaW5lIFNFVDEJICAgICAgICAoMHg4MHxVQ1JfRExTOCkgLyogTWFrZSBzdXJlIHdlIGtlZXAgOE4xICovCisjZGVmaW5lIFNFVDIJICAgICAgICAweEUwCisjZGVmaW5lIFNFVDMJICAgICAgICAweEU0CisjZGVmaW5lIFNFVDQJICAgICAgICAweEU4CisjZGVmaW5lIFNFVDUJICAgICAgICAweEVDCisjZGVmaW5lIFNFVDYJICAgICAgICAweEYwCisjZGVmaW5lIFNFVDcJICAgICAgICAweEY0CisKKyNkZWZpbmUgSENSCQkweDA0CisjZGVmaW5lIEhDUl9NT0RFX01BU0sJfigweEQwKQorI2RlZmluZSBIQ1JfU0lSICAgICAgICAgMHg2MAorI2RlZmluZSBIQ1JfTUlSXzU3NiAgCTB4MjAJCisjZGVmaW5lIEhDUl9NSVJfMTE1MgkweDgwCisjZGVmaW5lIEhDUl9GSVIJCTB4QTAKKyNkZWZpbmUgSENSX0VOX0RNQQkweDA0CisjZGVmaW5lIEhDUl9FTl9JUlEJMHgwOAorI2RlZmluZSBIQ1JfVFhfV1QJMHgwOAorCisjZGVmaW5lIFVTUiAgICAgICAgICAgICAweDA1IC8qIElSIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBVU1JfUkRSICAgICAgICAgMHgwMSAvKiBSZWNlaXZlIGRhdGEgcmVhZHkgKi8KKyNkZWZpbmUgVVNSX1RTUkUgICAgICAgIDB4NDAgLyogVHJhbnNtaXR0ZXIgZW1wdHk/ICovCisKKyNkZWZpbmUgQVVEUiAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgQVVEUl9TRkVORCAgICAgIDB4MDggLyogU2V0IGEgZnJhbWUgZW5kICovCisjZGVmaW5lIEFVRFJfUlhCU1kgICAgICAweDIwIC8qIFJ4IGJ1c3kgKi8KKyNkZWZpbmUgQVVEUl9VTkRSICAgICAgIDB4NDAgLyogVHJhbnNlaXZlciB1bmRlcnJ1biAqLworCisvKiBTZXQgMiAqLworI2RlZmluZSBBQkxMICAgICAgICAgICAgMHgwMCAvKiBBZHZhbmNlZCBiYXVkIHJhdGUgZGl2aXNvciBsYXRjaCAobG93IGJ5dGUpICovCisjZGVmaW5lIEFCSEwgICAgICAgICAgICAweDAxIC8qIEFkdmFuY2VkIGJhdWQgcmF0ZSBkaXZpc29yIGxhdGNoIChoaWdoIGJ5dGUpICovCisKKyNkZWZpbmUgQURDUjEJCTB4MDIKKyNkZWZpbmUgQURDUjFfQURWX1NMCTB4MDEJCisjZGVmaW5lIEFEQ1IxX0RfQ0hTVwkweDA4CS8qIHRoZSBzcGVjcyBhcmUgd3JvbmcuIGl0cyBiaXQgMywgbm90IDQgKi8KKyNkZWZpbmUgQURDUjFfRE1BX0YJMHgwMgorCisjZGVmaW5lIEFEQ1IyCQkweDA0CisjZGVmaW5lIEFEQ1IyX1RYRlMzMgkweDAxCisjZGVmaW5lIEFEQ1IyX1JYRlMzMgkweDA0CisKKyNkZWZpbmUgUlhGRFRIICAgICAgICAgIDB4MDcKKworLyogU2V0IDMgKi8KKyNkZWZpbmUgQVVJRAkJMHgwMAorCisvKiBTZXQgNCAqLworI2RlZmluZSBUTVJMICAgICAgICAgICAgMHgwMCAvKiBUaW1lciB2YWx1ZSByZWdpc3RlciAobG93IGJ5dGUpICovCisjZGVmaW5lIFRNUkggICAgICAgICAgICAweDAxIC8qIFRpbWVyIHZhbHVlIHJlZ2lzdGVyIChoaWdoIGJ5dGUpICovCisKKyNkZWZpbmUgSVJfTVNMICAgICAgICAgIDB4MDIgLyogSW5mcmFyZWQgbW9kZSBzZWxlY3QgKi8KKyNkZWZpbmUgSVJfTVNMX0VOX1RNUiAgIDB4MDEgLyogRW5hYmxlIHRpbWVyICovCisKKyNkZWZpbmUgVEZSTEwJCTB4MDQgLyogVHJhbnNtaXR0ZXIgZnJhbWUgbGVuZ3RoIChsb3cgYnl0ZSkgKi8KKyNkZWZpbmUgVEZSTEgJCTB4MDUgLyogVHJhbnNtaXR0ZXIgZnJhbWUgbGVuZ3RoIChoaWdoIGJ5dGUpICovCisjZGVmaW5lIFJGUkxMCQkweDA2IC8qIFJlY2VpdmVyIGZyYW1lIGxlbmd0aCAobG93IGJ5dGUpICovCisjZGVmaW5lIFJGUkxICQkweDA3IC8qIFJlY2VpdmVyIGZyYW1lIGxlbmd0aCAoaGlnaCBieXRlKSAqLworCisvKiBTZXQgNSAqLworCisjZGVmaW5lIEZTX0ZPICAgICAgICAgICAweDA1IC8qIEZyYW1lIHN0YXR1cyBGSUZPICovCisjZGVmaW5lIEZTX0ZPX0ZTRkRSICAgICAweDgwIC8qIEZyYW1lIHN0YXR1cyBGSUZPIGRhdGEgcmVhZHkgKi8KKyNkZWZpbmUgRlNfRk9fTFNUX0ZSICAgIDB4NDAgLyogRnJhbWUgbG9zdCAqLworI2RlZmluZSBGU19GT19NWF9MRVggICAgMHgxMCAvKiBNYXggZnJhbWUgbGVuIGV4Y2VlZGVkICovCisjZGVmaW5lIEZTX0ZPX1BIWV9FUlIgICAweDA4IC8qIFBoeXNpY2FsIGxheWVyIGVycm9yICovCisjZGVmaW5lIEZTX0ZPX0NSQ19FUlIgICAweDA0IAorI2RlZmluZSBGU19GT19SWF9PViAgICAgMHgwMiAvKiBSZWNlaXZlIG92ZXJydW4gKi8KKyNkZWZpbmUgRlNfRk9fRlNGX09WICAgIDB4MDEgLyogRnJhbWUgc3RhdHVzIEZJRk8gb3ZlcnJ1biAqLworI2RlZmluZSBGU19GT19FUlJfTVNLICAgMHg1ZiAvKiBFcnJvciBtYXNrICovCisKKyNkZWZpbmUgUkZMRkwgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgUkZMRkggICAgICAgICAgIDB4MDcKKworLyogU2V0IDYgKi8KKyNkZWZpbmUgSVJfQ0ZHMgkJMHgwMAorI2RlZmluZSBJUl9DRkcyX0RJU19DUkMJMHgwMgorCisvKiBTZXQgNyAqLworI2RlZmluZSBJUk1fQ1IJCTB4MDcgLyogSW5mcmFyZWQgbW9kdWxlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVJNX0NSX0lSWF9NU0wJMHg0MAorI2RlZmluZSBJUk1fQ1JfQUZfTU5UICAgMHg4MCAvKiBBdXRvbWF0aWMgZm9ybWF0ICovCisKKy8qIEZvciBzdG9yaW5nIGVudHJpZXMgaW4gdGhlIHN0YXR1cyBGSUZPICovCitzdHJ1Y3Qgc3RfZmlmb19lbnRyeSB7CisJaW50IHN0YXR1czsKKwlpbnQgbGVuOworfTsKKworc3RydWN0IHN0X2ZpZm8geworCXN0cnVjdCBzdF9maWZvX2VudHJ5IGVudHJpZXNbMTBdOworCWludCBoZWFkOworCWludCB0YWlsOworCWludCBsZW47Cit9OworCisvKiBQcml2YXRlIGRhdGEgZm9yIGVhY2ggaW5zdGFuY2UgKi8KK3N0cnVjdCB3ODM5NzdhZl9pciB7CisJc3RydWN0IHN0X2ZpZm8gc3RfZmlmbzsKKworCWludCB0eF9idWZmX29mZnNldHNbMTBdOyAvKiBPZmZzZXRzIGJldHdlZW4gZnJhbWVzIGluIHR4X2J1ZmYgKi8KKwlpbnQgdHhfbGVuOyAgICAgICAgICAvKiBOdW1iZXIgb2YgZnJhbWVzIGluIHR4X2J1ZmYgKi8KKworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7IC8qIFllcyEgd2UgYXJlIHNvbWUga2luZCBvZiBuZXRkZXZpY2UgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwkKKwlzdHJ1Y3QgaXJsYXBfY2IgICAgKmlybGFwOyAvKiBUaGUgbGluayBsYXllciB3ZSBhcmUgYmluZGVkIHRvICovCisJc3RydWN0IHFvc19pbmZvICAgICBxb3M7ICAgLyogUW9TIGNhcGFiaWxpdGllcyBmb3IgdGhpcyBkZXZpY2UgKi8KKwkKKwljaGlwaW9fdCBpbzsgICAgICAgICAgICAgICAvKiBJckRBIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gKi8KKwlpb2J1ZmZfdCB0eF9idWZmOyAgICAgICAgICAvKiBUcmFuc21pdCBidWZmZXIgKi8KKwlpb2J1ZmZfdCByeF9idWZmOyAgICAgICAgICAvKiBSZWNlaXZlIGJ1ZmZlciAqLworCWRtYV9hZGRyX3QgdHhfYnVmZl9kbWE7CisJZG1hX2FkZHJfdCByeF9idWZmX2RtYTsKKworCS8qIE5vdGUgOiBjdXJyZW50bHkgbG9ja2luZyBpcyAqdmVyeSogaW5jb21wbGV0ZSwgYnV0IHRoaXMKKwkgKiB3aWxsIGdldCB5b3Ugc3RhcnRlZC4gQ2hlY2sgaW4gbnNjLWlyY2MuYyBmb3IgYSBwcm9wZXIKKwkgKiBsb2NraW5nIHN0cmF0ZWd5LiAtIEplYW4gSUkgKi8KKwlzcGlubG9ja190IGxvY2s7ICAgICAgICAgICAvKiBGb3Igc2VyaWFsaXppbmcgb3BlcmF0aW9ucyAqLworCQorCV9fdTMyIG5ld19zcGVlZDsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzd2l0Y2hfYmFuayggaW50IGlvYmFzZSwgaW50IHNldCkKK3sKKwlvdXRiKHNldCwgaW9iYXNlK1NTUik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXNhLXNrZWxldG9uLmMgYi9kcml2ZXJzL25ldC9pc2Etc2tlbGV0b24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGJlYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXNhLXNrZWxldG9uLmMKQEAgLTAsMCArMSw3MjQgQEAKKy8qIGlzYS1za2VsZXRvbi5jOiBBIG5ldHdvcmsgZHJpdmVyIG91dGxpbmUgZm9yIGxpbnV4LgorICoKKyAqCVdyaXR0ZW4gMTk5My05NCBieSBEb25hbGQgQmVja2VyLgorICoKKyAqCUNvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKyAqCURpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCisgKgorICoJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICoJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKglUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworICoJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisgKgk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorICoJQW5uYXBvbGlzIE1EIDIxNDAzCisgKgorICoJVGhpcyBmaWxlIGlzIGFuIG91dGxpbmUgZm9yIHdyaXRpbmcgYSBuZXR3b3JrIGRldmljZSBkcml2ZXIgZm9yIHRoZQorICoJdGhlIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0uCisgKgorICoJVG8gd3JpdGUgKG9yIHVuZGVyc3RhbmQpIGEgZHJpdmVyLCBoYXZlIGEgbG9vayBhdCB0aGUgImxvb3BiYWNrLmMiIGZpbGUgdG8KKyAqCWdldCBhIGZlZWwgb2Ygd2hhdCBpcyBnb2luZyBvbiwgYW5kIHRoZW4gdXNlIHRoZSBjb2RlIGJlbG93IGFzIGEgc2tlbGV0b24KKyAqCWZvciB0aGUgbmV3IGRyaXZlci4KKyAqCisgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb24gPQorCSJpc2Etc2tlbGV0b24uYzp2MS41MSA5LzI0Lzk0IERvbmFsZCBCZWNrZXIgKGJlY2tlckBjZXNkaXMuZ3NmYy5uYXNhLmdvdilcbiI7CisKKy8qCisgKiAgU291cmNlczoKKyAqCUxpc3QgeW91ciBzb3VyY2VzIG9mIHByb2dyYW1taW5nIGluZm9ybWF0aW9uIHRvIGRvY3VtZW50IHRoYXQKKyAqCXRoZSBkcml2ZXIgaXMgeW91ciBvd24gY3JlYXRpb24sIGFuZCBnaXZlIGR1ZSBjcmVkaXQgdG8gb3RoZXJzCisgKgl0aGF0IGNvbnRyaWJ1dGVkIHRvIHRoZSB3b3JrLiBSZW1lbWJlciB0aGF0IEdOVSBwcm9qZWN0IGNvZGUKKyAqCWNhbm5vdCB1c2UgcHJvcHJpZXRhcnkgb3IgdHJhZGUgc2VjcmV0IGluZm9ybWF0aW9uLiBJbnRlcmZhY2UKKyAqCWRlZmluaXRpb25zIGFyZSBnZW5lcmFsbHkgY29uc2lkZXJlZCBub24tY29weXJpZ2h0YWJsZSB0byB0aGUKKyAqCWV4dGVudCB0aGF0IHRoZSBzYW1lIG5hbWVzIGFuZCBzdHJ1Y3R1cmVzIG11c3QgYmUgdXNlZCB0byBiZQorICoJY29tcGF0aWJsZS4KKyAqCisgKglGaW5hbGx5LCBrZWVwIGluIG1pbmQgdGhhdCB0aGUgTGludXgga2VybmVsIGlzIGhhcyBhbiBBUEksIG5vdAorICoJQUJJLiBQcm9wcmlldGFyeSBvYmplY3QtY29kZS1vbmx5IGRpc3RyaWJ1dGlvbnMgYXJlIG5vdCBwZXJtaXR0ZWQKKyAqCXVuZGVyIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisvKgorICogVGhlIG5hbWUgb2YgdGhlIGNhcmQuIElzIHVzZWQgZm9yIG1lc3NhZ2VzIGFuZCBpbiB0aGUgcmVxdWVzdHMgZm9yCisgKiBpbyByZWdpb25zLCBpcnFzIGFuZCBkbWEgY2hhbm5lbHMKKyAqLworc3RhdGljIGNvbnN0IGNoYXIqIGNhcmRuYW1lID0gIm5ldGNhcmQiOworCisvKiBGaXJzdCwgYSBmZXcgZGVmaW5pdGlvbnMgdGhhdCB0aGUgYnJhdmUgbWlnaHQgY2hhbmdlLiAqLworCisvKiBBIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIEkvTyBhZGRyZXNzZXMgdG8gYmUgcHJvYmVkLiAqLworc3RhdGljIHVuc2lnbmVkIGludCBuZXRjYXJkX3BvcnRsaXN0W10gX19pbml0ZGF0YSA9CisgICB7IDB4MjAwLCAweDI0MCwgMHgyODAsIDB4MkMwLCAweDMwMCwgMHgzMjAsIDB4MzQwLCAwfTsKKworLyogdXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgPjIgZm9yIGRlYnVnICovCisjaWZuZGVmIE5FVF9ERUJVRworI2RlZmluZSBORVRfREVCVUcgMgorI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgaW50IG5ldF9kZWJ1ZyA9IE5FVF9ERUJVRzsKKworLyogVGhlIG51bWJlciBvZiBsb3cgSS9PIHBvcnRzIHVzZWQgYnkgdGhlIGV0aGVyY2FyZC4gKi8KKyNkZWZpbmUgTkVUQ0FSRF9JT19FWFRFTlQJMzIKKworI2RlZmluZSBNWV9UWF9USU1FT1VUICAoKDQwMCpIWikvMTAwMCkKKworLyogSW5mb3JtYXRpb24gdGhhdCBuZWVkIHRvIGJlIGtlcHQgZm9yIGVhY2ggYm9hcmQuICovCitzdHJ1Y3QgbmV0X2xvY2FsIHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlsb25nIG9wZW5fdGltZTsJCQkvKiBVc2VsZXNzIGV4YW1wbGUgbG9jYWwgaW5mby4gKi8KKworCS8qIFR4IGNvbnRyb2wgbG9jay4gIFRoaXMgcHJvdGVjdHMgdGhlIHRyYW5zbWl0IGJ1ZmZlciByaW5nCisJICogc3RhdGUgYWxvbmcgd2l0aCB0aGUgInR4IGZ1bGwiIHN0YXRlIG9mIHRoZSBkcml2ZXIuICBUaGlzCisJICogbWVhbnMgYWxsIG5ldGlmX3F1ZXVlIGZsb3cgY29udHJvbCBhY3Rpb25zIGFyZSBwcm90ZWN0ZWQKKwkgKiBieSB0aGlzIGxvY2sgYXMgd2VsbC4KKwkgKi8KKwlzcGlubG9ja190IGxvY2s7Cit9OworCisvKiBUaGUgc3RhdGlvbiAoZXRoZXJuZXQpIGFkZHJlc3MgcHJlZml4LCB1c2VkIGZvciBJRGluZyB0aGUgYm9hcmQuICovCisjZGVmaW5lIFNBX0FERFIwIDB4MDAKKyNkZWZpbmUgU0FfQUREUjEgMHg0MgorI2RlZmluZSBTQV9BRERSMiAweDY1CisKKy8qIEluZGV4IHRvIGZ1bmN0aW9ucywgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4gKi8KKworc3RhdGljIGludAluZXRjYXJkX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKTsKK3N0YXRpYyBpbnQJbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CW5ldF9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBuZXRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQJbmV0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludAluZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0CW5ldF9kZXZpY2Vfc3RhdHMgKm5ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAlzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICAgbmV0X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworLyogRXhhbXBsZSByb3V0aW5lcyB5b3UgbXVzdCB3cml0ZSA7LT4uICovCisjZGVmaW5lIHR4X2RvbmUoZGV2KSAxCitzdGF0aWMgdm9pZAloYXJkd2FyZV9zZW5kX3BhY2tldChzaG9ydCBpb2FkZHIsIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCAJY2hpcHNldF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdGFydHApOworCisvKgorICogQ2hlY2sgZm9yIGEgbmV0d29yayBhZGFwdG9yIG9mIHRoaXMgdHlwZSwgYW5kIHJldHVybiAnMCcgaWZmIG9uZSBleGlzdHMuCisgKiBJZiBkZXYtPmJhc2VfYWRkciA9PSAwLCBwcm9iZSBhbGwgbGlrZWx5IGxvY2F0aW9ucy4KKyAqIElmIGRldi0+YmFzZV9hZGRyID09IDEsIGFsd2F5cyByZXR1cm4gZmFpbHVyZS4KKyAqIElmIGRldi0+YmFzZV9hZGRyID09IDIsIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgZGV2aWNlIGFuZCByZXR1cm4gc3VjY2VzcworICogKGRldGFjaGFibGUgZGV2aWNlcyBvbmx5KS4KKyAqLworc3RhdGljIGludCBfX2luaXQgZG9fbmV0Y2FyZF9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCWludCBiYXNlX2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaXJxID0gZGV2LT5pcnE7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZiAoYmFzZV9hZGRyID4gMHgxZmYpICAgIC8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KKwkJcmV0dXJuIG5ldGNhcmRfcHJvYmUxKGRldiwgYmFzZV9hZGRyKTsKKwllbHNlIGlmIChiYXNlX2FkZHIgIT0gMCkgIC8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKwkJcmV0dXJuIC1FTlhJTzsKKworCWZvciAoaSA9IDA7IG5ldGNhcmRfcG9ydGxpc3RbaV07IGkrKykgeworCQlpbnQgaW9hZGRyID0gbmV0Y2FyZF9wb3J0bGlzdFtpXTsKKwkJaWYgKG5ldGNhcmRfcHJvYmUxKGRldiwgaW9hZGRyKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJCWRldi0+aXJxID0gaXJxOworCX0KKworCXJldHVybiAtRU5PREVWOworfQorIAorc3RhdGljIHZvaWQgY2xlYW51cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisjaWZkZWYganVtcGVyZWRfZG1hCisJZnJlZV9kbWEoZGV2LT5kbWEpOworI2VuZGlmCisjaWZkZWYganVtcGVyZWRfaW50ZXJydXB0cworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworI2VuZGlmCisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIE5FVENBUkRfSU9fRVhURU5UKTsKK30KKworI2lmbmRlZiBNT0RVTEUKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IG5ldGNhcmRfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCisJZXJyID0gZG9fbmV0Y2FyZF9wcm9iZShkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlyZXR1cm4gZGV2Oworb3V0MToKKwljbGVhbnVwX2NhcmQoZGV2KTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisjZW5kaWYKKworLyoKKyAqIFRoaXMgaXMgdGhlIHJlYWwgcHJvYmUgcm91dGluZS4gTGludXggaGFzIGEgaGlzdG9yeSBvZiBmcmllbmRseSBkZXZpY2UKKyAqIHByb2JlcyBvbiB0aGUgSVNBIGJ1cy4gQSBnb29kIGRldmljZSBwcm9iZXMgYXZvaWRzIGRvaW5nIHdyaXRlcywgYW5kCisgKiB2ZXJpZmllcyB0aGF0IHRoZSBjb3JyZWN0IGRldmljZSBleGlzdHMgYW5kIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIGludCBfX2luaXQgbmV0Y2FyZF9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpucDsKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCWludCBpOworCWludCBlcnIgPSAtRU5PREVWOworCisJLyogR3JhYiB0aGUgcmVnaW9uIHNvIHRoYXQgbm8gb25lIGVsc2UgdHJpZXMgdG8gcHJvYmUgb3VyIGlvcG9ydHMuICovCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIE5FVENBUkRfSU9fRVhURU5ULCBjYXJkbmFtZSkpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKgorCSAqIEZvciBldGhlcm5ldCBhZGFwdG9ycyB0aGUgZmlyc3QgdGhyZWUgb2N0ZXRzIG9mIHRoZSBzdGF0aW9uIGFkZHJlc3MgCisJICogY29udGFpbnMgdGhlIG1hbnVmYWN0dXJlcidzIHVuaXF1ZSBjb2RlLiBUaGF0IG1pZ2h0IGJlIGEgZ29vZCBwcm9iZQorCSAqIG1ldGhvZC4gSWRlYWxseSB5b3Ugd291bGQgYWRkIGFkZGl0aW9uYWwgY2hlY2tzLgorCSAqLyAKKwlpZiAoaW5iKGlvYWRkciArIDApICE9IFNBX0FERFIwCisJCXx8CSBpbmIoaW9hZGRyICsgMSkgIT0gU0FfQUREUjEKKwkJfHwJIGluYihpb2FkZHIgKyAyKSAhPSBTQV9BRERSMikKKwkJZ290byBvdXQ7CisKKwlpZiAobmV0X2RlYnVnICAmJiAgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIiwgdmVyc2lvbik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgZm91bmQgYXQgJSMzeCwgIiwgZGV2LT5uYW1lLCBjYXJkbmFtZSwgaW9hZGRyKTsKKworCS8qIEZpbGwgaW4gdGhlICdkZXYnIGZpZWxkcy4gKi8KKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKworCS8qIFJldHJpZXZlIGFuZCBwcmludCB0aGUgZXRoZXJuZXQgYWRkcmVzcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiAlMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0gPSBpbmIoaW9hZGRyICsgaSkpOworCisJZXJyID0gLUVBR0FJTjsKKyNpZmRlZiBqdW1wZXJlZF9pbnRlcnJ1cHRzCisJLyoKKwkgKiBJZiB0aGlzIGJvYXJkIGhhcyBqdW1wZXJlZCBpbnRlcnJ1cHRzLCBhbGxvY2F0ZSB0aGUgaW50ZXJydXB0CisJICogdmVjdG9yIG5vdy4gVGhlcmUgaXMgbm8gcG9pbnQgaW4gd2FpdGluZyBzaW5jZSBubyBvdGhlciBkZXZpY2UKKwkgKiBjYW4gdXNlIHRoZSBpbnRlcnJ1cHQsIGFuZCB0aGlzIG1hcmtzIHRoZSBpcnEgYXMgYnVzeS4gSnVtcGVyZWQKKwkgKiBpbnRlcnJ1cHRzIGFyZSB0eXBpY2FsbHkgbm90IHJlcG9ydGVkIGJ5IHRoZSBib2FyZHMsIGFuZCB3ZSBtdXN0CisJICogdXNlZCBhdXRvSVJRIHRvIGZpbmQgdGhlbS4KKwkgKi8KKworCWlmIChkZXYtPmlycSA9PSAtMSkKKwkJOwkvKiBEbyBub3RoaW5nOiBhIHVzZXItbGV2ZWwgcHJvZ3JhbSB3aWxsIHNldCBpdC4gKi8KKwllbHNlIGlmIChkZXYtPmlycSA8IDIpIHsJLyogIkF1dG8tSVJRIiAqLworCQl1bnNpZ25lZCBsb25nIGlycV9tYXNrID0gcHJvYmVfaXJxX29uKCk7CisJCS8qIFRyaWdnZXIgYW4gaW50ZXJydXB0IGhlcmUuICovCisKKwkJZGV2LT5pcnEgPSBwcm9iZV9pcnFfb2ZmKGlycV9tYXNrKTsKKwkJaWYgKG5ldF9kZWJ1ZyA+PSAyKQorCQkJcHJpbnRrKCIgYXV0b2lycSBpcyAlZCIsIGRldi0+aXJxKTsKKwl9IGVsc2UgaWYgKGRldi0+aXJxID09IDIpCisJCS8qCisJCSAqIEZpeHVwIGZvciB1c2VycyB0aGF0IGRvbid0IGtub3cgdGhhdCBJUlEgMiBpcyByZWFsbHkKKwkJICogSVJROSwgb3IgZG9uJ3Qga25vdyB3aGljaCBvbmUgdG8gc2V0LgorCQkgKi8KKwkJZGV2LT5pcnEgPSA5OworCisJeworCQlpbnQgaXJxdmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZuZXRfaW50ZXJydXB0LCAwLCBjYXJkbmFtZSwgZGV2KTsKKwkJaWYgKGlycXZhbCkgeworCQkJcHJpbnRrKCIlczogdW5hYmxlIHRvIGdldCBJUlEgJWQgKGlycXZhbD0lZCkuXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgZGV2LT5pcnEsIGlycXZhbCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKyNlbmRpZgkvKiBqdW1wZXJlZCBpbnRlcnJ1cHQgKi8KKyNpZmRlZiBqdW1wZXJlZF9kbWEKKwkvKgorCSAqIElmIHdlIHVzZSBhIGp1bXBlcmVkIERNQSBjaGFubmVsLCB0aGF0IHNob3VsZCBiZSBwcm9iZWQgZm9yIGFuZAorCSAqIGFsbG9jYXRlZCBoZXJlIGFzIHdlbGwuIFNlZSBsYW5jZS5jIGZvciBhbiBleGFtcGxlLgorCSAqLworCWlmIChkZXYtPmRtYSA9PSAwKSB7CisJCWlmIChyZXF1ZXN0X2RtYShkZXYtPmRtYSwgY2FyZG5hbWUpKSB7CisJCQlwcmludGsoIkRNQSAlZCBhbGxvY2F0aW9uIGZhaWxlZC5cbiIsIGRldi0+ZG1hKTsKKwkJCWdvdG8gb3V0MTsKKwkJfSBlbHNlCisJCQlwcmludGsoIiwgYXNzaWduZWQgRE1BICVkLlxuIiwgZGV2LT5kbWEpOworCX0gZWxzZSB7CisJCXNob3J0IGRtYV9zdGF0dXMsIG5ld19kbWFfc3RhdHVzOworCisJCS8qIFJlYWQgdGhlIERNQSBjaGFubmVsIHN0YXR1cyByZWdpc3RlcnMuICovCisJCWRtYV9zdGF0dXMgPSAoKGluYihETUExX1NUQVRfUkVHKSA+PiA0KSAmIDB4MGYpIHwKKwkJCShpbmIoRE1BMl9TVEFUX1JFRykgJiAweGYwKTsKKwkJLyogVHJpZ2dlciBhIERNQSByZXF1ZXN0LCBwZXJoYXBzIHBhdXNlIGEgYml0LiAqLworCQlvdXR3KDB4MTIzNCwgaW9hZGRyICsgOCk7CisJCS8qIFJlLXJlYWQgdGhlIERNQSBzdGF0dXMgcmVnaXN0ZXJzLiAqLworCQluZXdfZG1hX3N0YXR1cyA9ICgoaW5iKERNQTFfU1RBVF9SRUcpID4+IDQpICYgMHgwZikgfAorCQkJKGluYihETUEyX1NUQVRfUkVHKSAmIDB4ZjApOworCQkvKgorCQkgKiBFbGltaW5hdGUgdGhlIG9sZCBhbmQgZmxvYXRpbmcgcmVxdWVzdHMsCisJCSAqIGFuZCBETUE0IHRoZSBjYXNjYWRlLgorCQkgKi8KKwkJbmV3X2RtYV9zdGF0dXMgXj0gZG1hX3N0YXR1czsKKwkJbmV3X2RtYV9zdGF0dXMgJj0gfjB4MTA7CisJCWZvciAoaSA9IDc7IGkgPiAwOyBpLS0pCisJCQlpZiAodGVzdF9iaXQoaSwgJm5ld19kbWFfc3RhdHVzKSkgeworCQkJCWRldi0+ZG1hID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJaWYgKGkgPD0gMCkgeworCQkJcHJpbnRrKCJETUEgcHJvYmUgZmFpbGVkLlxuIik7CisJCQlnb3RvIG91dDE7CisJCX0gCisJCWlmIChyZXF1ZXN0X2RtYShkZXYtPmRtYSwgY2FyZG5hbWUpKSB7CisJCQlwcmludGsoInByb2JlZCBETUEgJWQgYWxsb2NhdGlvbiBmYWlsZWQuXG4iLCBkZXYtPmRtYSk7CisJCQlnb3RvIG91dDE7CisJCX0KKwl9CisjZW5kaWYJLyoganVtcGVyZWQgRE1BICovCisKKwlucCA9IG5ldGRldl9wcml2KGRldik7CisJc3Bpbl9sb2NrX2luaXQoJm5wLT5sb2NrKTsKKworCWRldi0+b3BlbgkJPSBuZXRfb3BlbjsKKwlkZXYtPnN0b3AJCT0gbmV0X2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gbmV0X3NlbmRfcGFja2V0OworCWRldi0+Z2V0X3N0YXRzCQk9IG5ldF9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OworCisgICAgICAgIGRldi0+dHhfdGltZW91dAkJPSAmbmV0X3R4X3RpbWVvdXQ7CisgICAgICAgIGRldi0+d2F0Y2hkb2dfdGltZW8JPSBNWV9UWF9USU1FT1VUOyAKKwlyZXR1cm4gMDsKK291dDE6CisjaWZkZWYganVtcGVyZWRfaW50ZXJydXB0cworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworI2VuZGlmCitvdXQ6CisJcmVsZWFzZV9yZWdpb24oYmFzZV9hZGRyLCBORVRDQVJEX0lPX0VYVEVOVCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgbmV0X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCAlcz9cbiIsIGRldi0+bmFtZSwKKwkgICAgICAgdHhfZG9uZShkZXYpID8gIklSUSBjb25mbGljdCIgOiAibmV0d29yayBjYWJsZSBwcm9ibGVtIik7CisKKwkvKiBUcnkgdG8gcmVzdGFydCB0aGUgYWRhcHRvci4gKi8KKwljaGlwc2V0X2luaXQoZGV2LCAxKTsKKworCW5wLT5zdGF0cy50eF9lcnJvcnMrKzsKKworCS8qIElmIHdlIGhhdmUgc3BhY2UgYXZhaWxhYmxlIHRvIGFjY2VwdCBuZXcgdHJhbnNtaXQKKwkgKiByZXF1ZXN0cywgd2FrZSB1cCB0aGUgcXVldWVpbmcgbGF5ZXIuICBUaGlzIHdvdWxkCisJICogYmUgdGhlIGNhc2UgaWYgdGhlIGNoaXBzZXRfaW5pdCgpIGNhbGwgYWJvdmUganVzdAorCSAqIGZsdXNoZXMgb3V0IHRoZSB0eCBxdWV1ZSBhbmQgZW1wdGllcyBpdC4KKwkgKgorCSAqIElmIGluc3RlYWQsIHRoZSB0eCBxdWV1ZSBpcyByZXRhaW5lZCB0aGVuIHRoZQorCSAqIG5ldGlmX3dha2VfcXVldWUoKSBjYWxsIHNob3VsZCBiZSBwbGFjZWQgaW4gdGhlCisJICogVFggY29tcGxldGlvbiBpbnRlcnJ1cHQgaGFuZGxlciBvZiB0aGUgZHJpdmVyIGluc3RlYWQKKwkgKiBvZiBoZXJlLgorCSAqLworCWlmICghdHhfZnVsbChkZXYpKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qCisgKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQorICogc29tZXRpbWUgYWZ0ZXIgYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgorICoKKyAqIFRoaXMgcm91dGluZSBzaG91bGQgc2V0IGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4KKyAqIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0CisgKiB0aGVyZSBpcyBub24tcmVib290IHdheSB0byByZWNvdmVyIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgorICovCitzdGF0aWMgaW50CituZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJLyoKKwkgKiBUaGlzIGlzIHVzZWQgaWYgdGhlIGludGVycnVwdCBsaW5lIGNhbiB0dXJuZWQgb2ZmIChzaGFyZWQpLgorCSAqIFNlZSAzYzUwMy5jIGZvciBhbiBleGFtcGxlIG9mIHNlbGVjdGluZyB0aGUgSVJRIGF0IGNvbmZpZy10aW1lLgorCSAqLworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgJm5ldF9pbnRlcnJ1cHQsIDAsIGNhcmRuYW1lLCBkZXYpKSB7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwkvKgorCSAqIEFsd2F5cyBhbGxvY2F0ZSB0aGUgRE1BIGNoYW5uZWwgYWZ0ZXIgdGhlIElSUSwKKwkgKiBhbmQgY2xlYW4gdXAgb24gZmFpbHVyZS4KKwkgKi8KKwlpZiAocmVxdWVzdF9kbWEoZGV2LT5kbWEsIGNhcmRuYW1lKSkgeworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJLyogUmVzZXQgdGhlIGhhcmR3YXJlIGhlcmUuIERvbid0IGZvcmdldCB0byBzZXQgdGhlIHN0YXRpb24gYWRkcmVzcy4gKi8KKwljaGlwc2V0X2luaXQoZGV2LCAxKTsKKwlvdXRiKDB4MDAsIGlvYWRkcik7CisJbnAtPm9wZW5fdGltZSA9IGppZmZpZXM7CisKKwkvKiBXZSBhcmUgbm93IHJlYWR5IHRvIGFjY2VwdCB0cmFuc21pdCByZXF1ZXVzdHMgZnJvbQorCSAqIHRoZSBxdWV1ZWluZyBsYXllciBvZiB0aGUgbmV0d29ya2luZy4KKwkgKi8KKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgd2lsbCBvbmx5IGJlIGludm9rZWQgaWYgeW91ciBkcml2ZXIgaXMgX25vdF8gaW4gWE9GRiBzdGF0ZS4KKyAqIFdoYXQgdGhpcyBtZWFucyBpcyB0aGF0IHlvdSBuZWVkIG5vdCBjaGVjayBpdCwgYW5kIHRoYXQgdGhpcworICogaW52YXJpYW50IHdpbGwgaG9sZCBpZiB5b3UgbWFrZSBzdXJlIHRoYXQgdGhlIG5ldGlmXypfcXVldWUoKQorICogY2FsbHMgYXJlIGRvbmUgYXQgdGhlIHByb3BlciB0aW1lcy4KKyAqLworc3RhdGljIGludCBuZXRfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXNob3J0IGxlbmd0aCA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKKworCS8qIElmIHNvbWUgZXJyb3Igb2NjdXJzIHdoaWxlIHRyeWluZyB0byB0cmFuc21pdCB0aGlzCisJICogcGFja2V0LCB5b3Ugc2hvdWxkIHJldHVybiAnMScgZnJvbSB0aGlzIGZ1bmN0aW9uLgorCSAqIEluIHN1Y2ggYSBjYXNlIHlvdSBfbWF5IG5vdF8gZG8gYW55dGhpbmcgdG8gdGhlCisJICogU0tCLCBpdCBpcyBzdGlsbCBvd25lZCBieSB0aGUgbmV0d29yayBxdWV1ZWluZworCSAqIGxheWVyIHdoZW4gYW4gZXJyb3IgaXMgcmV0dXJuZWQuICBUaGlzIG1lYW5zIHlvdQorCSAqIG1heSBub3QgbW9kaWZ5IGFueSBTS0IgZmllbGRzLCB5b3UgbWF5IG5vdCBmcmVlCisJICogdGhlIFNLQiwgZXRjLgorCSAqLworCisjaWYgVFhfUklORworCS8qIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIGNhc2UgZm9yIG1vZGVybiBoYXJkd2FyZS4KKwkgKiBUaGUgc3BpbmxvY2sgcHJvdGVjdHMgdGhpcyBjb2RlIGZyb20gdGhlIFRYIGNvbXBsZXRlCisJICogaGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIuICBRdWV1ZSBmbG93IGNvbnRyb2wgaXMKKwkgKiB0aHVzIG1hbmFnZWQgdW5kZXIgdGhpcyBsb2NrIGFzIHdlbGwuCisJICovCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCisJYWRkX3RvX3R4X3JpbmcobnAsIHNrYiwgbGVuZ3RoKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIElmIHdlIGp1c3QgdXNlZCB1cCB0aGUgdmVyeSBsYXN0IGVudHJ5IGluIHRoZQorCSAqIFRYIHJpbmcgb24gdGhpcyBkZXZpY2UsIHRlbGwgdGhlIHF1ZXVlaW5nCisJICogbGF5ZXIgdG8gc2VuZCBubyBtb3JlLgorCSAqLworCWlmICh0eF9mdWxsKGRldikpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIFdoZW4gdGhlIFRYIGNvbXBsZXRpb24gaHcgaW50ZXJydXB0IGFycml2ZXMsIHRoaXMKKwkgKiBpcyB3aGVuIHRoZSB0cmFuc21pdCBzdGF0aXN0aWNzIGFyZSB1cGRhdGVkLgorCSAqLworCisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisjZWxzZQorCS8qIFRoaXMgaXMgdGhlIGNhc2UgZm9yIG9sZGVyIGhhcmR3YXJlIHdoaWNoIHRha2VzCisJICogYSBzaW5nbGUgdHJhbnNtaXQgYnVmZmVyIGF0IGEgdGltZSwgYW5kIGl0IGlzCisJICoganVzdCB3cml0dGVuIHRvIHRoZSBkZXZpY2UgdmlhIFBJTy4KKwkgKgorCSAqIE5vIHNwaW4gbG9ja2luZyBpcyBuZWVkZWQgc2luY2UgdGhlcmUgaXMgbm8gVFggY29tcGxldGUKKwkgKiBldmVudC4gIElmIGJ5IGNoYW5jZSB5b3VyIGNhcmQgZG9lcyBoYXZlIGEgVFggY29tcGxldGUKKwkgKiBoYXJkd2FyZSBJUlEgdGhlbiB5b3UgbWF5IG5lZWQgdG8gdXRpbGl6ZSBucC0+bG9jayBoZXJlLgorCSAqLworCWhhcmR3YXJlX3NlbmRfcGFja2V0KGlvYWRkciwgYnVmLCBsZW5ndGgpOworCW5wLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJLyogWW91IG1pZ2h0IG5lZWQgdG8gY2xlYW4gdXAgYW5kIHJlY29yZCBUeCBzdGF0aXN0aWNzIGhlcmUuICovCisJaWYgKGludyhpb2FkZHIpID09IC8qUlUqLzgxKQorCQlucC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwlkZXZfa2ZyZWVfc2tiIChza2IpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworI2lmIFRYX1JJTkcKKy8qIFRoaXMgaGFuZGxlcyBUWCBjb21wbGV0ZSBldmVudHMgcG9zdGVkIGJ5IHRoZSBkZXZpY2UKKyAqIHZpYSBpbnRlcnJ1cHRzLgorICovCit2b2lkIG5ldF90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZW50cnk7CisKKwkvKiBUaGlzIHByb3RlY3RzIHVzIGZyb20gY29uY3VycmVudCBleGVjdXRpb24gb2YKKwkgKiBvdXIgZGV2LT5oYXJkX3N0YXJ0X3htaXQgZnVuY3Rpb24gYWJvdmUuCisJICovCisJc3Bpbl9sb2NrKCZucC0+bG9jayk7CisKKwllbnRyeSA9IG5wLT50eF9vbGQ7CisJd2hpbGUgKHR4X2VudHJ5X2lzX3NlbnQobnAsIGVudHJ5KSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbnAtPnNrYnNbZW50cnldOworCisJCW5wLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJZGV2X2tmcmVlX3NrYl9pcnEgKHNrYik7CisKKwkJZW50cnkgPSBuZXh0X3R4X2VudHJ5KG5wLCBlbnRyeSk7CisJfQorCW5wLT50eF9vbGQgPSBlbnRyeTsKKworCS8qIElmIHdlIGhhZCBzdG9wcGVkIHRoZSBxdWV1ZSBkdWUgdG8gYSAidHggZnVsbCIKKwkgKiBjb25kaXRpb24sIGFuZCBzcGFjZSBoYXMgbm93IGJlZW4gbWFkZSBhdmFpbGFibGUsCisJICogd2FrZSB1cCB0aGUgcXVldWUuCisJICovCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJiAhIHR4X2Z1bGwoZGV2KSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKK30KKyNlbmRpZgorCisvKgorICogVGhlIHR5cGljYWwgd29ya2xvYWQgb2YgdGhlIGRyaXZlcjoKKyAqIEhhbmRsZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaW50ZXJydXB0cy4KKyAqLworc3RhdGljIGlycXJldHVybl90IG5ldF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpucDsKKwlpbnQgaW9hZGRyLCBzdGF0dXM7CisJaW50IGhhbmRsZWQgPSAwOworCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlucCA9IG5ldGRldl9wcml2KGRldik7CisJc3RhdHVzID0gaW53KGlvYWRkciArIDApOworCisJaWYgKHN0YXR1cyA9PSAwKQorCQlnb3RvIG91dDsKKwloYW5kbGVkID0gMTsKKworCWlmIChzdGF0dXMgJiBSWF9JTlRSKSB7CisJCS8qIEdvdCBhIHBhY2tldChzKS4gKi8KKwkJbmV0X3J4KGRldik7CisJfQorI2lmIFRYX1JJTkcKKwlpZiAoc3RhdHVzICYgVFhfSU5UUikgeworCQkvKiBUcmFuc21pdCBjb21wbGV0ZS4gKi8KKwkJbmV0X3R4KGRldik7CisJCW5wLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisjZW5kaWYKKwlpZiAoc3RhdHVzICYgQ09VTlRFUlNfSU5UUikgeworCQkvKiBJbmNyZW1lbnQgdGhlIGFwcHJvcHJpYXRlICdsb2NhbHN0YXRzJyBmaWVsZC4gKi8KKwkJbnAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwl9CitvdXQ6CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qIFdlIGhhdmUgYSBnb29kIHBhY2tldChzKSwgZ2V0IGl0L3RoZW0gb3V0IG9mIHRoZSBidWZmZXJzLiAqLworc3RhdGljIHZvaWQKK25ldF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGJvZ3VzY291bnQgPSAxMDsKKworCWRvIHsKKwkJaW50IHN0YXR1cyA9IGludyhpb2FkZHIpOworCQlpbnQgcGt0X2xlbiA9IGludyhpb2FkZHIpOworCSAgCisJCWlmIChwa3RfbGVuID09IDApCQkvKiBSZWFkIGFsbCB0aGUgZnJhbWVzPyAqLworCQkJYnJlYWs7CQkJLyogRG9uZSBmb3Igbm93ICovCisKKwkJaWYgKHN0YXR1cyAmIDB4NDApIHsJLyogVGhlcmUgd2FzIGFuIGVycm9yLiAqLworCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIDB4MjApIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiAweDEwKSBscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiAweDA4KSBscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIDB4MDQpIGxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuICovCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlscC0+c3RhdHMucnhfYnl0ZXMrPXBrdF9sZW47CisJCQkKKwkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbik7CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lKTsKKwkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWJyZWFrOworCQkJfQorCQkJc2tiLT5kZXYgPSBkZXY7CisKKwkJCS8qICdza2ItPmRhdGEnIHBvaW50cyB0byB0aGUgc3RhcnQgb2Ygc2tfYnVmZiBkYXRhIGFyZWEuICovCisJCQltZW1jcHkoc2tiX3B1dChza2IscGt0X2xlbiksICh2b2lkKilkZXYtPnJtZW1fc3RhcnQsCisJCQkJICAgcGt0X2xlbik7CisJCQkvKiBvciAqLworCQkJaW5zdyhpb2FkZHIsIHNrYi0+ZGF0YSwgKHBrdF9sZW4gKyAxKSA+PiAxKTsKKworCQkJbmV0aWZfcngoc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCX0KKwl9IHdoaWxlICgtLWJvZ3VzY291bnQpOworCisJcmV0dXJuOworfQorCisvKiBUaGUgaW52ZXJzZSByb3V0aW5lIHRvIG5ldF9vcGVuKCkuICovCitzdGF0aWMgaW50CituZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJbHAtPm9wZW5fdGltZSA9IDA7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBGbHVzaCB0aGUgVHggYW5kIGRpc2FibGUgUnggaGVyZS4gKi8KKworCWRpc2FibGVfZG1hKGRldi0+ZG1hKTsKKworCS8qIElmIG5vdCBJUlEgb3IgRE1BIGp1bXBlcmVkLCBmcmVlIHVwIHRoZSBsaW5lLiAqLworCW91dHcoMHgwMCwgaW9hZGRyKzApOwkvKiBSZWxlYXNlIHRoZSBwaHlzaWNhbCBpbnRlcnJ1cHQgbGluZS4gKi8KKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCWZyZWVfZG1hKGRldi0+ZG1hKTsKKworCS8qIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyBoZXJlLiAqLworCisJcmV0dXJuIDA7CisKK30KKworLyoKKyAqIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLgorICogVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvciBjbG9zZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCS8qIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyBmcm9tIHRoZSBkZXZpY2UgcmVnaXN0ZXJzLiAqLworCWxwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gaW53KGlvYWRkcisxKTsKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworLyoKKyAqIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICogbnVtX2FkZHJzID09IC0xCVByb21pc2N1b3VzIG1vZGUsIHJlY2VpdmUgYWxsIHBhY2tldHMKKyAqIG51bV9hZGRycyA9PSAwCU5vcm1hbCBtb2RlLCBjbGVhciBtdWx0aWNhc3QgbGlzdAorICogbnVtX2FkZHJzID4gMAlNdWx0aWNhc3QgbW9kZSwgcmVjZWl2ZSBub3JtYWwgYW5kIE1DIHBhY2tldHMsCisgKgkJCWFuZCBkbyBiZXN0LWVmZm9ydCBmaWx0ZXJpbmcuCisgKi8KK3N0YXRpYyB2b2lkCitzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpZiAoZGV2LT5mbGFncyZJRkZfUFJPTUlTQykKKwl7CisJCS8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJCW91dHcoTVVMVElDQVNUfFBST01JU0MsIGlvYWRkcik7CisJfQorCWVsc2UgaWYoKGRldi0+ZmxhZ3MmSUZGX0FMTE1VTFRJKSB8fCBkZXYtPm1jX2NvdW50ID4gSFdfTUFYX0FERFJTKQorCXsKKwkJLyogRGlzYWJsZSBwcm9taXNjdW91cyBtb2RlLCB1c2Ugbm9ybWFsIG1vZGUuICovCisJCWhhcmR3YXJlX3NldF9maWx0ZXIoTlVMTCk7CisKKwkJb3V0dyhNVUxUSUNBU1QsIGlvYWRkcik7CisJfQorCWVsc2UgaWYoZGV2LT5tY19jb3VudCkKKwl7CisJCS8qIFdhbGsgdGhlIGFkZHJlc3MgbGlzdCwgYW5kIGxvYWQgdGhlIGZpbHRlciAqLworCQloYXJkd2FyZV9zZXRfZmlsdGVyKGRldi0+bWNfbGlzdCk7CisKKwkJb3V0dyhNVUxUSUNBU1QsIGlvYWRkcik7CisJfQorCWVsc2UgCisJCW91dHcoMCwgaW9hZGRyKTsKK30KKworI2lmZGVmIE1PRFVMRQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnRoaXNfZGV2aWNlOworc3RhdGljIGludCBpbyA9IDB4MzAwOworc3RhdGljIGludCBpcnE7CitzdGF0aWMgaW50IGRtYTsKK3N0YXRpYyBpbnQgbWVtOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCByZXN1bHQ7CisKKwlpZiAoaW8gPT0gMCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFlvdSBzaG91bGRuJ3QgdXNlIGF1dG8tcHJvYmluZyB3aXRoIGluc21vZCFcbiIsCisJCQkgICBjYXJkbmFtZSk7CisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBDb3B5IHRoZSBwYXJhbWV0ZXJzIGZyb20gaW5zbW9kIGludG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5iYXNlX2FkZHIgPSBpbzsKKwlkZXYtPmlycSAgICAgICA9IGlycTsKKwlkZXYtPmRtYSAgICAgICA9IGRtYTsKKwlkZXYtPm1lbV9zdGFydCA9IG1lbTsKKwlpZiAoZG9fbmV0Y2FyZF9wcm9iZShkZXYpID09IDApIHsKKwkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApCisJCQl0aGlzX2RldmljZSA9IGRldjsKKwkJCXJldHVybiAwOworCQl9CisJCWNsZWFudXBfY2FyZChkZXYpOworCX0KKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiAtRU5YSU87Cit9CisKK3ZvaWQKK2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYodGhpc19kZXZpY2UpOworCWNsZWFudXBfY2FyZCh0aGlzX2RldmljZSk7CisJZnJlZV9uZXRkZXYodGhpc19kZXZpY2UpOworfQorCisjZW5kaWYgLyogTU9EVUxFICovCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOgorICoJZ2NjIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xd3JpdGUtc3RyaW5ncworICoJLVdyZWR1bmRhbnQtZGVjbHMgLU8yIC1tNDg2IC1jIHNrZWxldG9uLmMKKyAqICB2ZXJzaW9uLWNvbnRyb2w6IHQKKyAqICBrZXB0LW5ldy12ZXJzaW9uczogNQorICogIHRhYi13aWR0aDogNAorICogIGMtaW5kZW50LWxldmVsOiA0CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lzZXJpZXNfdmV0aC5jIGIvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU1ZjhiMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lzZXJpZXNfdmV0aC5jCkBAIC0wLDAgKzEsMTQyMiBAQAorLyogRmlsZSB2ZXRoLmMgY3JlYXRlZCBieSBLeWxlIEEuIEx1Y2tlIG9uIE1vbiBBdWcgIDcgMjAwMC4gKi8KKy8qCisgKiBJQk0gZVNlcnZlciBpU2VyaWVzIFZpcnR1YWwgRXRoZXJuZXQgRGV2aWNlIERyaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDAxIEt5bGUgQS4gTHVja2UgKGtsdWNrZUB1cy5pYm0uY29tKSwgSUJNIENvcnAuCisgKiBTdWJzdGFudGlhbGx5IGNsZWFuZWQgdXAgYnk6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgRGF2aWQgR2lic29uIDxkd2dAYXUxLmlibS5jb20+LCBJQk0gQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNworICogVVNBCisgKgorICoKKyAqIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIHZpcnR1YWwgZXRoZXJuZXQgZGV2aWNlIGZvciBpU2VyaWVzIExQQVIKKyAqIExpbnV4LiAgSXQgdXNlcyBoeXBlcnZpc29yIG1lc3NhZ2UgcGFzc2luZyB0byBpbXBsZW1lbnQgYW4KKyAqIGV0aGVybmV0LWxpa2UgbmV0d29yayBkZXZpY2UgY29tbXVuaWNhdGluZyBiZXR3ZWVuIHBhcnRpdGlvbnMgb24KKyAqIHRoZSBpU2VyaWVzLgorICoKKyAqIFRoZSBpU2VyaWVzIExQQVIgaHlwZXJ2aXNvciBjdXJyZW50bHkgYWxsb3dzIGZvciB1cCB0byAxNiBkaWZmZXJlbnQKKyAqIHZpcnR1YWwgZXRoZXJuZXRzLiAgVGhlc2UgYXJlIGFsbCBkeW5hbWljYWxseSBjb25maWd1cmFibGUgb24KKyAqIE9TLzQwMCBwYXJ0aXRpb25zLCBidXQgZHluYW1pYyBjb25maWd1cmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIKKyAqIExpbnV4IHlldC4gIEFuIGV0aFhYIG5ldHdvcmsgZGV2aWNlIHdpbGwgYmUgY3JlYXRlZCBmb3IgZWFjaAorICogdmlydHVhbCBldGhlcm5ldCB0aGlzIHBhcnRpdGlvbiBpcyBjb25uZWN0ZWQgdG8uCisgKgorICogLSBUaGlzIGRyaXZlciBpcyByZXNwb25zaWJsZSBmb3Igcm91dGluZyBwYWNrZXRzIHRvIGFuZCBmcm9tIG90aGVyCisgKiAgIHBhcnRpdGlvbnMuICBUaGUgTUFDIGFkZHJlc3NlcyB1c2VkIGJ5IHRoZSB2aXJ0dWFsIGV0aGVybmV0cworICogICBjb250YWlucyBtZWFuaW5nIGFuZCBtdXN0IG5vdCBiZSBtb2RpZmllZC4KKyAqCisgKiAtIEhhdmluZyAyIHZpcnR1YWwgZXRoZXJuZXRzIHRvIHRoZSBzYW1lIHJlbW90ZSBwYXJ0aXRpb24gRE9FUyBOT1QKKyAqICAgZG91YmxlIHRoZSBhdmFpbGFibGUgYmFuZHdpZHRoLiAgVGhlIDIgZGV2aWNlcyB3aWxsIHNoYXJlIHRoZQorICogICBhdmFpbGFibGUgaHlwZXJ2aXNvciBiYW5kd2lkdGguCisgKgorICogLSBJZiB5b3Ugc2VuZCBhIHBhY2tldCB0byB5b3VyIG93biBtYWMgYWRkcmVzcywgaXQgd2lsbCBqdXN0IGJlCisgKiAgIGRyb3BwZWQsIHlvdSB3b24ndCBnZXQgaXQgb24gdGhlIHJlY2VpdmUgc2lkZS4KKyAqCisgKiAtIE11bHRpY2FzdCBpcyBpbXBsZW1lbnRlZCBieSBzZW5kaW5nIHRoZSBmcmFtZSBmcmFtZSB0byBldmVyeQorICogICBvdGhlciBwYXJ0aXRpb24uICBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHJlY2VpdmluZworICogICBwYXJ0aXRpb24gdG8gZmlsdGVyIHRoZSBhZGRyZXNzZXMgZGVzaXJlZC4KKyAqCisgKiBUdW5hYmxlIHBhcmFtZXRlcnM6CisgKgorICogVkVUSF9OVU1CVUZGRVJTOiBUaGlzIGNvbXBpbGUgdGltZSBvcHRpb24gZGVmYXVsdHMgdG8gMTIwLiAgSXQKKyAqIGNvbnRyb2xzIGhvdyBtdWNoIG1lbW9yeSBMaW51eCB3aWxsIGFsbG9jYXRlIHBlciByZW1vdGUgcGFydGl0aW9uCisgKiBpdCBpcyBjb21tdW5pY2F0aW5nIHdpdGguICBJdCBjYW4gYmUgdGhvdWdodCBvZiBhcyB0aGUgbWF4aW11bQorICogbnVtYmVyIG9mIHBhY2tldHMgb3V0c3RhbmRpbmcgdG8gYSByZW1vdGUgcGFydGl0aW9uIGF0IGEgdGltZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGFzbS9pU2VyaWVzL21mLmg+CisjaW5jbHVkZSA8YXNtL2lTZXJpZXMvaVNlcmllc19wY2kuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8YXNtL2lTZXJpZXMvSHZMcENvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9pU2VyaWVzL0h2VHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaVNlcmllcy9IdkxwRXZlbnQuaD4KKyNpbmNsdWRlIDxhc20vaW9tbXUuaD4KKyNpbmNsdWRlIDxhc20vdmlvLmg+CisKKyNpbmNsdWRlICJpc2VyaWVzX3ZldGguaCIKKworTU9EVUxFX0FVVEhPUigiS3lsZSBMdWNrZSA8a2x1Y2tlQHVzLmlibS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlTZXJpZXMgVmlydHVhbCBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBWRVRIX05VTUJVRkZFUlMJCSgxMjApCisjZGVmaW5lIFZFVEhfQUNLVElNRU9VVCAJKDEwMDAwMDApIC8qIG1pY3Jvc2Vjb25kcyAqLworI2RlZmluZSBWRVRIX01BWF9NQ0FTVAkJKDEyKQorCisjZGVmaW5lIFZFVEhfTUFYX01UVQkJKDkwMDApCisKKyNpZiBWRVRIX05VTUJVRkZFUlMgPCAxMAorI2RlZmluZSBBQ0tfVEhSRVNIT0xEIAkJKDEpCisjZWxpZiBWRVRIX05VTUJVRkZFUlMgPCAyMAorI2RlZmluZSBBQ0tfVEhSRVNIT0xEIAkJKDQpCisjZWxpZiBWRVRIX05VTUJVRkZFUlMgPCA0MAorI2RlZmluZSBBQ0tfVEhSRVNIT0xEIAkJKDEwKQorI2Vsc2UKKyNkZWZpbmUgQUNLX1RIUkVTSE9MRCAJCSgyMCkKKyNlbmRpZgorCisjZGVmaW5lCVZFVEhfU1RBVEVfU0hVVERPV04JKDB4MDAwMSkKKyNkZWZpbmUgVkVUSF9TVEFURV9PUEVOCQkoMHgwMDAyKQorI2RlZmluZSBWRVRIX1NUQVRFX1JFU0VUCSgweDAwMDQpCisjZGVmaW5lIFZFVEhfU1RBVEVfU0VOVE1PTgkoMHgwMDA4KQorI2RlZmluZSBWRVRIX1NUQVRFX1NFTlRDQVBTCSgweDAwMTApCisjZGVmaW5lIFZFVEhfU1RBVEVfR09UQ0FQQUNLCSgweDAwMjApCisjZGVmaW5lIFZFVEhfU1RBVEVfR09UQ0FQUwkoMHgwMDQwKQorI2RlZmluZSBWRVRIX1NUQVRFX1NFTlRDQVBBQ0sJKDB4MDA4MCkKKyNkZWZpbmUgVkVUSF9TVEFURV9SRUFEWQkoMHgwMTAwKQorCitzdHJ1Y3QgdmV0aF9tc2cgeworCXN0cnVjdCB2ZXRoX21zZyAqbmV4dDsKKwlzdHJ1Y3QgVmV0aEZyYW1lc0RhdGEgZGF0YTsKKwlpbnQgdG9rZW47CisJdW5zaWduZWQgbG9uZyBpbl91c2U7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7Cit9OworCitzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24geworCUh2THBJbmRleCByZW1vdGVfbHA7CisJc3RydWN0IHdvcmtfc3RydWN0IHN0YXRlbWFjaGluZV93cTsKKwlzdHJ1Y3QgdmV0aF9tc2cgKm1zZ3M7CisJaW50IG51bV9ldmVudHM7CisJc3RydWN0IFZldGhDYXBEYXRhIGxvY2FsX2NhcHM7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCBhY2tfdGltZXI7CisKKwlzcGlubG9ja190IGxvY2s7CisJdW5zaWduZWQgbG9uZyBzdGF0ZTsKKwlIdkxwSW5zdGFuY2VJZCBzcmNfaW5zdDsKKwlIdkxwSW5zdGFuY2VJZCBkc3RfaW5zdDsKKwlzdHJ1Y3QgVmV0aExwRXZlbnQgY2FwX2V2ZW50LCBjYXBfYWNrX2V2ZW50OworCXUxNiBwZW5kaW5nX2Fja3NbVkVUSF9NQVhfQUNLU19QRVJfTVNHXTsKKwl1MzIgbnVtX3BlbmRpbmdfYWNrczsKKworCWludCBudW1fYWNrX2V2ZW50czsKKwlzdHJ1Y3QgVmV0aENhcERhdGEgcmVtb3RlX2NhcHM7CisJdTMyIGFja190aW1lb3V0OworCisJc3BpbmxvY2tfdCBtc2dfc3RhY2tfbG9jazsKKwlzdHJ1Y3QgdmV0aF9tc2cgKm1zZ19zdGFja19oZWFkOworfTsKKworc3RydWN0IHZldGhfcG9ydCB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXU2NCBtYWNfYWRkcjsKKwlIdkxwSW5kZXhNYXAgbHBhcl9tYXA7CisKKwlzcGlubG9ja190IHBlbmRpbmdfZ2F0ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGVuZGluZ19za2I7CisJSHZMcEluZGV4TWFwIHBlbmRpbmdfbHBtYXNrOworCisJcndsb2NrX3QgbWNhc3RfZ2F0ZTsKKwlpbnQgcHJvbWlzY3VvdXM7CisJaW50IGFsbF9tY2FzdDsKKwlpbnQgbnVtX21jYXN0OworCXU2NCBtY2FzdF9hZGRyW1ZFVEhfTUFYX01DQVNUXTsKK307CisKK3N0YXRpYyBIdkxwSW5kZXggdGhpc19scDsKK3N0YXRpYyBzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKnZldGhfY254W0hWTUFYQVJDSElURUNURURMUFNdOyAvKiA9IDAgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqdmV0aF9kZXZbSFZNQVhBUkNISVRFQ1RFRFZJUlRVQUxMQU5TXTsgLyogPSAwICovCisKK3N0YXRpYyBpbnQgdmV0aF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgdmV0aF9yZWN5Y2xlX21zZyhzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKiwgc3RydWN0IHZldGhfbXNnICopOworc3RhdGljIHZvaWQgdmV0aF9mbHVzaF9wZW5kaW5nKHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254KTsKK3N0YXRpYyB2b2lkIHZldGhfcmVjZWl2ZShzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKiwgc3RydWN0IFZldGhMcEV2ZW50ICopOworc3RhdGljIHZvaWQgdmV0aF90aW1lZF9hY2sodW5zaWduZWQgbG9uZyBjb25uZWN0aW9uUHRyKTsKKworLyoKKyAqIFV0aWxpdHkgZnVuY3Rpb25zCisgKi8KKworI2RlZmluZSB2ZXRoX3ByaW50ayhwcmlvLCBmbXQsIGFyZ3MuLi4pIFwKKwlwcmludGsocHJpbyAiJXM6ICIgZm10LCBfX0ZJTEVfXywgIyMgYXJncykKKworI2RlZmluZSB2ZXRoX2Vycm9yKGZtdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0VSUiAiKCVzOiUzLjNkKSBFUlJPUjogIiBmbXQsIF9fRklMRV9fLCBfX0xJTkVfXyAsICMjIGFyZ3MpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2ZXRoX3N0YWNrX3B1c2goc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbngsCisJCQkJICAgc3RydWN0IHZldGhfbXNnICptc2cpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjbngtPm1zZ19zdGFja19sb2NrLCBmbGFncyk7CisJbXNnLT5uZXh0ID0gY254LT5tc2dfc3RhY2tfaGVhZDsKKwljbngtPm1zZ19zdGFja19oZWFkID0gbXNnOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNueC0+bXNnX3N0YWNrX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdmV0aF9tc2cgKnZldGhfc3RhY2tfcG9wKHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHZldGhfbXNnICptc2c7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY254LT5tc2dfc3RhY2tfbG9jaywgZmxhZ3MpOworCW1zZyA9IGNueC0+bXNnX3N0YWNrX2hlYWQ7CisJaWYgKG1zZykKKwkJY254LT5tc2dfc3RhY2tfaGVhZCA9IGNueC0+bXNnX3N0YWNrX2hlYWQtPm5leHQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY254LT5tc2dfc3RhY2tfbG9jaywgZmxhZ3MpOworCXJldHVybiBtc2c7Cit9CisKK3N0YXRpYyBpbmxpbmUgSHZMcEV2ZW50X1JjCit2ZXRoX3NpZ25hbGV2ZW50KHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254LCB1MTYgc3VidHlwZSwKKwkJIEh2THBFdmVudF9BY2tJbmQgYWNraW5kLCBIdkxwRXZlbnRfQWNrVHlwZSBhY2t0eXBlLAorCQkgdTY0IHRva2VuLAorCQkgdTY0IGRhdGExLCB1NjQgZGF0YTIsIHU2NCBkYXRhMywgdTY0IGRhdGE0LCB1NjQgZGF0YTUpCit7CisJcmV0dXJuIEh2Q2FsbEV2ZW50X3NpZ25hbExwRXZlbnRGYXN0KGNueC0+cmVtb3RlX2xwLAorCQkJCQkgICAgIEh2THBFdmVudF9UeXBlX1ZpcnR1YWxMYW4sCisJCQkJCSAgICAgc3VidHlwZSwgYWNraW5kLCBhY2t0eXBlLAorCQkJCQkgICAgIGNueC0+c3JjX2luc3QsCisJCQkJCSAgICAgY254LT5kc3RfaW5zdCwKKwkJCQkJICAgICB0b2tlbiwgZGF0YTEsIGRhdGEyLCBkYXRhMywKKwkJCQkJICAgICBkYXRhNCwgZGF0YTUpOworfQorCitzdGF0aWMgaW5saW5lIEh2THBFdmVudF9SYyB2ZXRoX3NpZ25hbGRhdGEoc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbngsCisJCQkJCSAgIHUxNiBzdWJ0eXBlLCB1NjQgdG9rZW4sIHZvaWQgKmRhdGEpCit7CisJdTY0ICpwID0gKHU2NCAqKSBkYXRhOworCisJcmV0dXJuIHZldGhfc2lnbmFsZXZlbnQoY254LCBzdWJ0eXBlLCBIdkxwRXZlbnRfQWNrSW5kX05vQWNrLAorCQkJCUh2THBFdmVudF9BY2tUeXBlX0ltbWVkaWF0ZUFjaywKKwkJCQl0b2tlbiwgcFswXSwgcFsxXSwgcFsyXSwgcFszXSwgcFs0XSk7Cit9CisKK3N0cnVjdCB2ZXRoX2FsbG9jYXRpb24geworCXN0cnVjdCBjb21wbGV0aW9uIGM7CisJaW50IG51bTsKK307CisKK3N0YXRpYyB2b2lkIHZldGhfY29tcGxldGVfYWxsb2NhdGlvbih2b2lkICpwYXJtLCBpbnQgbnVtYmVyKQoreworCXN0cnVjdCB2ZXRoX2FsbG9jYXRpb24gKnZjID0gKHN0cnVjdCB2ZXRoX2FsbG9jYXRpb24gKilwYXJtOworCisJdmMtPm51bSA9IG51bWJlcjsKKwljb21wbGV0ZSgmdmMtPmMpOworfQorCitzdGF0aWMgaW50IHZldGhfYWxsb2NhdGVfZXZlbnRzKEh2THBJbmRleCBybHAsIGludCBudW1iZXIpCit7CisJc3RydWN0IHZldGhfYWxsb2NhdGlvbiB2YyA9IHsgQ09NUExFVElPTl9JTklUSUFMSVpFUih2Yy5jKSwgMCB9OworCisJbWZfYWxsb2NhdGVfbHBfZXZlbnRzKHJscCwgSHZMcEV2ZW50X1R5cGVfVmlydHVhbExhbiwKKwkJCSAgICBzaXplb2Yoc3RydWN0IFZldGhMcEV2ZW50KSwgbnVtYmVyLAorCQkJICAgICZ2ZXRoX2NvbXBsZXRlX2FsbG9jYXRpb24sICZ2Yyk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmdmMuYyk7CisKKwlyZXR1cm4gdmMubnVtOworfQorCisvKgorICogTFBBUiBjb25uZWN0aW9uIGNvZGUKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdmV0aF9raWNrX3N0YXRlbWFjaGluZShzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCkKK3sKKwlzY2hlZHVsZV93b3JrKCZjbngtPnN0YXRlbWFjaGluZV93cSk7Cit9CisKK3N0YXRpYyB2b2lkIHZldGhfdGFrZV9jYXAoc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbngsCisJCQkgIHN0cnVjdCBWZXRoTHBFdmVudCAqZXZlbnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjbngtPmxvY2ssIGZsYWdzKTsKKwkvKiBSZWNlaXZpbmcgY2FwcyBtYXkgbWVhbiB0aGUgb3RoZXIgZW5kIGhhcyBqdXN0IGNvbWUgdXAsIHNvCisJICogd2UgbmVlZCB0byByZWxvYWQgdGhlIGluc3RhbmNlIElEIG9mIHRoZSBmYXIgZW5kICovCisJY254LT5kc3RfaW5zdCA9CisJCUh2Q2FsbEV2ZW50X2dldFRhcmdldExwSW5zdGFuY2VJZChjbngtPnJlbW90ZV9scCwKKwkJCQkJCSAgSHZMcEV2ZW50X1R5cGVfVmlydHVhbExhbik7CisKKwlpZiAoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfR09UQ0FQUykgeworCQl2ZXRoX2Vycm9yKCJSZWNlaXZlZCBhIHNlY29uZCBjYXBhYmlsaXRpZXMgZnJvbSBscGFyICVkXG4iLAorCQkJICAgY254LT5yZW1vdGVfbHApOworCQlldmVudC0+YmFzZV9ldmVudC54UmMgPSBIdkxwRXZlbnRfUmNfQnVmZmVyTm90QXZhaWxhYmxlOworCQlIdkNhbGxFdmVudF9hY2tMcEV2ZW50KChzdHJ1Y3QgSHZMcEV2ZW50ICopIGV2ZW50KTsKKwl9IGVsc2UgeworCQltZW1jcHkoJmNueC0+Y2FwX2V2ZW50LCBldmVudCwgc2l6ZW9mKGNueC0+Y2FwX2V2ZW50KSk7CisJCWNueC0+c3RhdGUgfD0gVkVUSF9TVEFURV9HT1RDQVBTOworCQl2ZXRoX2tpY2tfc3RhdGVtYWNoaW5lKGNueCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNueC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB2ZXRoX3Rha2VfY2FwX2FjayhzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCwKKwkJCSAgICAgIHN0cnVjdCBWZXRoTHBFdmVudCAqZXZlbnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjbngtPmxvY2ssIGZsYWdzKTsKKwlpZiAoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfR09UQ0FQQUNLKSB7CisJCXZldGhfZXJyb3IoIlJlY2VpdmVkIGEgc2Vjb25kIGNhcGFiaWxpdGllcyBhY2sgZnJvbSBscGFyICVkXG4iLAorCQkJICAgY254LT5yZW1vdGVfbHApOworCX0gZWxzZSB7CisJCW1lbWNweSgmY254LT5jYXBfYWNrX2V2ZW50LCBldmVudCwKKwkJICAgICAgIHNpemVvZigmY254LT5jYXBfYWNrX2V2ZW50KSk7CisJCWNueC0+c3RhdGUgfD0gVkVUSF9TVEFURV9HT1RDQVBBQ0s7CisJCXZldGhfa2lja19zdGF0ZW1hY2hpbmUoY254KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY254LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHZldGhfdGFrZV9tb25pdG9yX2FjayhzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCwKKwkJCQkgIHN0cnVjdCBWZXRoTHBFdmVudCAqZXZlbnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjbngtPmxvY2ssIGZsYWdzKTsKKwl2ZXRoX3ByaW50ayhLRVJOX0RFQlVHLCAiTW9uaXRvciBhY2sgcmV0dXJuZWQgZm9yIGxwYXIgJWRcbiIsCisJCSAgICBjbngtPnJlbW90ZV9scCk7CisJY254LT5zdGF0ZSB8PSBWRVRIX1NUQVRFX1JFU0VUOworCXZldGhfa2lja19zdGF0ZW1hY2hpbmUoY254KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbngtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgdmV0aF9oYW5kbGVfYWNrKHN0cnVjdCBWZXRoTHBFdmVudCAqZXZlbnQpCit7CisJSHZMcEluZGV4IHJscCA9IGV2ZW50LT5iYXNlX2V2ZW50LnhUYXJnZXRMcDsKKwlzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCA9IHZldGhfY254W3JscF07CisKKwlCVUdfT04oISBjbngpOworCisJc3dpdGNoIChldmVudC0+YmFzZV9ldmVudC54U3VidHlwZSkgeworCWNhc2UgVmV0aEV2ZW50VHlwZUNhcDoKKwkJdmV0aF90YWtlX2NhcF9hY2soY254LCBldmVudCk7CisJCWJyZWFrOworCWNhc2UgVmV0aEV2ZW50VHlwZU1vbml0b3I6CisJCXZldGhfdGFrZV9tb25pdG9yX2FjayhjbngsIGV2ZW50KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmV0aF9lcnJvcigiVW5rbm93biBhY2sgdHlwZSAlZCBmcm9tIGxwYXIgJWRcbiIsCisJCQkgICBldmVudC0+YmFzZV9ldmVudC54U3VidHlwZSwgcmxwKTsKKwl9OworfQorCitzdGF0aWMgdm9pZCB2ZXRoX2hhbmRsZV9pbnQoc3RydWN0IFZldGhMcEV2ZW50ICpldmVudCkKK3sKKwlIdkxwSW5kZXggcmxwID0gZXZlbnQtPmJhc2VfZXZlbnQueFNvdXJjZUxwOworCXN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254ID0gdmV0aF9jbnhbcmxwXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJQlVHX09OKCEgY254KTsKKworCXN3aXRjaCAoZXZlbnQtPmJhc2VfZXZlbnQueFN1YnR5cGUpIHsKKwljYXNlIFZldGhFdmVudFR5cGVDYXA6CisJCXZldGhfdGFrZV9jYXAoY254LCBldmVudCk7CisJCWJyZWFrOworCWNhc2UgVmV0aEV2ZW50VHlwZU1vbml0b3I6CisJCS8qIGRvIG5vdGhpbmcuLi4gdGhpcydsbCBoYW5nIG91dCBoZXJlIHRpbCB3ZSdyZSBkZWFkLAorCQkgKiBhbmQgdGhlIGh5cGVydmlzb3Igd2lsbCByZXR1cm4gaXQgZm9yIHVzLiAqLworCQlicmVhazsKKwljYXNlIFZldGhFdmVudFR5cGVGcmFtZXNBY2s6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjbngtPmxvY2ssIGZsYWdzKTsKKwkJZm9yIChpID0gMDsgaSA8IFZFVEhfTUFYX0FDS1NfUEVSX01TRzsgKytpKSB7CisJCQl1MTYgbXNnbnVtID0gZXZlbnQtPnUuZnJhbWVzX2Fja19kYXRhLnRva2VuW2ldOworCisJCQlpZiAobXNnbnVtIDwgVkVUSF9OVU1CVUZGRVJTKQorCQkJCXZldGhfcmVjeWNsZV9tc2coY254LCBjbngtPm1zZ3MgKyBtc2dudW0pOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNueC0+bG9jaywgZmxhZ3MpOworCQl2ZXRoX2ZsdXNoX3BlbmRpbmcoY254KTsKKwkJYnJlYWs7CisJY2FzZSBWZXRoRXZlbnRUeXBlRnJhbWVzOgorCQl2ZXRoX3JlY2VpdmUoY254LCBldmVudCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZldGhfZXJyb3IoIlVua25vd24gaW50ZXJydXB0IHR5cGUgJWQgZnJvbSBscGFyICVkXG4iLAorCQkJICAgZXZlbnQtPmJhc2VfZXZlbnQueFN1YnR5cGUsIHJscCk7CisJfTsKK30KKworc3RhdGljIHZvaWQgdmV0aF9oYW5kbGVfZXZlbnQoc3RydWN0IEh2THBFdmVudCAqZXZlbnQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBWZXRoTHBFdmVudCAqdmV0aF9ldmVudCA9IChzdHJ1Y3QgVmV0aExwRXZlbnQgKilldmVudDsKKworCWlmIChldmVudC0+eEZsYWdzLnhGdW5jdGlvbiA9PSBIdkxwRXZlbnRfRnVuY3Rpb25fQWNrKQorCQl2ZXRoX2hhbmRsZV9hY2sodmV0aF9ldmVudCk7CisJZWxzZSBpZiAoZXZlbnQtPnhGbGFncy54RnVuY3Rpb24gPT0gSHZMcEV2ZW50X0Z1bmN0aW9uX0ludCkKKwkJdmV0aF9oYW5kbGVfaW50KHZldGhfZXZlbnQpOworfQorCitzdGF0aWMgaW50IHZldGhfcHJvY2Vzc19jYXBzKHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254KQoreworCXN0cnVjdCBWZXRoQ2FwRGF0YSAqcmVtb3RlX2NhcHMgPSAmY254LT5yZW1vdGVfY2FwczsKKwlpbnQgbnVtX2Fja3NfbmVlZGVkOworCisJLyogQ29udmVydCB0aW1lciB0byBqaWZmaWVzICovCisJY254LT5hY2tfdGltZW91dCA9IHJlbW90ZV9jYXBzLT5hY2tfdGltZW91dCAqIEhaIC8gMTAwMDAwMDsKKworCWlmICggKHJlbW90ZV9jYXBzLT5udW1fYnVmZmVycyA9PSAwKQorCSAgICAgfHwgKHJlbW90ZV9jYXBzLT5hY2tfdGhyZXNob2xkID4gVkVUSF9NQVhfQUNLU19QRVJfTVNHKQorCSAgICAgfHwgKHJlbW90ZV9jYXBzLT5hY2tfdGhyZXNob2xkID09IDApCisJICAgICB8fCAoY254LT5hY2tfdGltZW91dCA9PSAwKSApIHsKKwkJdmV0aF9lcnJvcigiUmVjZWl2ZWQgaW5jb21wYXRpYmxlIGNhcGFiaWxpdGllcyBmcm9tIGxwYXIgJWRcbiIsCisJCQkgICBjbngtPnJlbW90ZV9scCk7CisJCXJldHVybiBIdkxwRXZlbnRfUmNfSW52YWxpZFN1YnR5cGVEYXRhOworCX0KKworCW51bV9hY2tzX25lZWRlZCA9IChyZW1vdGVfY2Fwcy0+bnVtX2J1ZmZlcnMKKwkJCSAgIC8gcmVtb3RlX2NhcHMtPmFja190aHJlc2hvbGQpICsgMTsKKworCS8qIEZJWE1FOiBsb2NraW5nIG9uIG51bV9hY2tfZXZlbnRzPyAqLworCWlmIChjbngtPm51bV9hY2tfZXZlbnRzIDwgbnVtX2Fja3NfbmVlZGVkKSB7CisJCWludCBudW07CisKKwkJbnVtID0gdmV0aF9hbGxvY2F0ZV9ldmVudHMoY254LT5yZW1vdGVfbHAsCisJCQkJCSAgIG51bV9hY2tzX25lZWRlZC1jbngtPm51bV9hY2tfZXZlbnRzKTsKKwkJaWYgKG51bSA+IDApCisJCQljbngtPm51bV9hY2tfZXZlbnRzICs9IG51bTsKKworCQlpZiAoY254LT5udW1fYWNrX2V2ZW50cyA8IG51bV9hY2tzX25lZWRlZCkgeworCQkJdmV0aF9lcnJvcigiQ291bGRuJ3QgYWxsb2NhdGUgZW5vdWdoIGFjayBldmVudHMgZm9yIGxwYXIgJWRcbiIsCisJCQkJICAgY254LT5yZW1vdGVfbHApOworCisJCQlyZXR1cm4gSHZMcEV2ZW50X1JjX0J1ZmZlck5vdEF2YWlsYWJsZTsKKwkJfQorCX0KKworCisJcmV0dXJuIEh2THBFdmVudF9SY19Hb29kOworfQorCisvKiBGSVhNRTogVGhlIGdvdG9zIGhlcmUgYXJlIGEgYml0IGR1YmlvdXMgKi8KK3N0YXRpYyB2b2lkIHZldGhfc3RhdGVtYWNoaW5lKHZvaWQgKnApCit7CisJc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbnggPSAoc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICopcDsKKwlpbnQgcmxwID0gY254LT5yZW1vdGVfbHA7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmY254LT5sb2NrKTsKKworIHJlc3RhcnQ6CisJaWYgKGNueC0+c3RhdGUgJiBWRVRIX1NUQVRFX1JFU0VUKSB7CisJCWludCBpOworCisJCWRlbF90aW1lcigmY254LT5hY2tfdGltZXIpOworCisJCWlmIChjbngtPnN0YXRlICYgVkVUSF9TVEFURV9PUEVOKQorCQkJSHZDYWxsRXZlbnRfY2xvc2VMcEV2ZW50UGF0aChjbngtPnJlbW90ZV9scCwKKwkJCQkJCSAgICAgSHZMcEV2ZW50X1R5cGVfVmlydHVhbExhbik7CisKKwkJLyogcmVzZXQgYWNrIGRhdGEgKi8KKwkJbWVtc2V0KCZjbngtPnBlbmRpbmdfYWNrcywgMHhmZiwgc2l6ZW9mIChjbngtPnBlbmRpbmdfYWNrcykpOworCQljbngtPm51bV9wZW5kaW5nX2Fja3MgPSAwOworCisJCWNueC0+c3RhdGUgJj0gfihWRVRIX1NUQVRFX1JFU0VUIHwgVkVUSF9TVEFURV9TRU5UTU9OCisJCQkJfCBWRVRIX1NUQVRFX09QRU4gfCBWRVRIX1NUQVRFX1NFTlRDQVBTCisJCQkJfCBWRVRIX1NUQVRFX0dPVENBUEFDSyB8IFZFVEhfU1RBVEVfR09UQ0FQUworCQkJCXwgVkVUSF9TVEFURV9TRU5UQ0FQQUNLIHwgVkVUSF9TVEFURV9SRUFEWSk7CisKKwkJLyogQ2xlYW4gdXAgYW55IGxlZnRvdmVyIG1lc3NhZ2VzICovCisJCWlmIChjbngtPm1zZ3MpCisJCQlmb3IgKGkgPSAwOyBpIDwgVkVUSF9OVU1CVUZGRVJTOyArK2kpCisJCQkJdmV0aF9yZWN5Y2xlX21zZyhjbngsIGNueC0+bXNncyArIGkpOworCQlzcGluX3VubG9ja19pcnEoJmNueC0+bG9jayk7CisJCXZldGhfZmx1c2hfcGVuZGluZyhjbngpOworCQlzcGluX2xvY2tfaXJxKCZjbngtPmxvY2spOworCQlpZiAoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfUkVTRVQpCisJCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJaWYgKGNueC0+c3RhdGUgJiBWRVRIX1NUQVRFX1NIVVRET1dOKQorCQkvKiBJdCdzIGFsbCBvdmVyLCBkbyBub3RoaW5nICovCisJCWdvdG8gb3V0OworCisJaWYgKCAhKGNueC0+c3RhdGUgJiBWRVRIX1NUQVRFX09QRU4pICkgeworCQlpZiAoISBjbngtPm1zZ3MgfHwgKGNueC0+bnVtX2V2ZW50cyA8ICgyICsgVkVUSF9OVU1CVUZGRVJTKSkgKQorCQkJZ290byBjYW50X2NvcGU7CisKKwkJSHZDYWxsRXZlbnRfb3BlbkxwRXZlbnRQYXRoKHJscCwgSHZMcEV2ZW50X1R5cGVfVmlydHVhbExhbik7CisJCWNueC0+c3JjX2luc3QgPQorCQkJSHZDYWxsRXZlbnRfZ2V0U291cmNlTHBJbnN0YW5jZUlkKHJscCwKKwkJCQkJCQkgIEh2THBFdmVudF9UeXBlX1ZpcnR1YWxMYW4pOworCQljbngtPmRzdF9pbnN0ID0KKwkJCUh2Q2FsbEV2ZW50X2dldFRhcmdldExwSW5zdGFuY2VJZChybHAsCisJCQkJCQkJICBIdkxwRXZlbnRfVHlwZV9WaXJ0dWFsTGFuKTsKKwkJY254LT5zdGF0ZSB8PSBWRVRIX1NUQVRFX09QRU47CisJfQorCisJaWYgKCAoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfT1BFTikKKwkgICAgICYmICEoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfU0VOVE1PTikgKSB7CisJCXJjID0gdmV0aF9zaWduYWxldmVudChjbngsIFZldGhFdmVudFR5cGVNb25pdG9yLAorCQkJCSAgICAgIEh2THBFdmVudF9BY2tJbmRfRG9BY2ssCisJCQkJICAgICAgSHZMcEV2ZW50X0Fja1R5cGVfRGVmZXJyZWRBY2ssCisJCQkJICAgICAgMCwgMCwgMCwgMCwgMCwgMCk7CisKKwkJaWYgKHJjID09IEh2THBFdmVudF9SY19Hb29kKSB7CisJCQljbngtPnN0YXRlIHw9IFZFVEhfU1RBVEVfU0VOVE1PTjsKKwkJfSBlbHNlIHsKKwkJCWlmICggKHJjICE9IEh2THBFdmVudF9SY19QYXJ0aXRpb25EZWFkKQorCQkJICAgICAmJiAocmMgIT0gSHZMcEV2ZW50X1JjX1BhdGhDbG9zZWQpICkKKwkJCQl2ZXRoX2Vycm9yKCJFcnJvciBzZW5kaW5nIG1vbml0b3IgdG8gIgorCQkJCQkgICAibHBhciAlZCwgcmM9JXhcbiIsCisJCQkJCSAgIHJscCwgKGludCkgcmMpOworCisJCQkvKiBPaCB3ZWxsLCBob3BlIHdlIGdldCBhIGNhcCBmcm9tIHRoZSBvdGhlcgorCQkJICogZW5kIGFuZCBkbyBiZXR0ZXIgd2hlbiB0aGF0IGtpY2tzIHVzICovCisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmICggKGNueC0+c3RhdGUgJiBWRVRIX1NUQVRFX09QRU4pCisJICAgICAmJiAhKGNueC0+c3RhdGUgJiBWRVRIX1NUQVRFX1NFTlRDQVBTKSkgeworCQl1NjQgKnJhd2NhcCA9ICh1NjQgKikmY254LT5sb2NhbF9jYXBzOworCisJCXJjID0gdmV0aF9zaWduYWxldmVudChjbngsIFZldGhFdmVudFR5cGVDYXAsCisJCQkJICAgICAgSHZMcEV2ZW50X0Fja0luZF9Eb0FjaywKKwkJCQkgICAgICBIdkxwRXZlbnRfQWNrVHlwZV9JbW1lZGlhdGVBY2ssCisJCQkJICAgICAgMCwgcmF3Y2FwWzBdLCByYXdjYXBbMV0sIHJhd2NhcFsyXSwKKwkJCQkgICAgICByYXdjYXBbM10sIHJhd2NhcFs0XSk7CisKKwkJaWYgKHJjID09IEh2THBFdmVudF9SY19Hb29kKSB7CisJCQljbngtPnN0YXRlIHw9IFZFVEhfU1RBVEVfU0VOVENBUFM7CisJCX0gZWxzZSB7CisJCQlpZiAoIChyYyAhPSBIdkxwRXZlbnRfUmNfUGFydGl0aW9uRGVhZCkKKwkJCSAgICAgJiYgKHJjICE9IEh2THBFdmVudF9SY19QYXRoQ2xvc2VkKSApCisJCQkJdmV0aF9lcnJvcigiRXJyb3Igc2VuZGluZyBjYXBzIHRvICIKKwkJCQkJICAgImxwYXIgJWQsIHJjPSV4XG4iLAorCQkJCQkgICBybHAsIChpbnQpIHJjKTsKKwkJCS8qIE9oIHdlbGwsIGhvcGUgd2UgZ2V0IGEgY2FwIGZyb20gdGhlIG90aGVyCisJCQkgKiBlbmQgYW5kIGRvIGJldHRlciB3aGVuIHRoYXQga2lja3MgdXMgKi8KKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKChjbngtPnN0YXRlICYgVkVUSF9TVEFURV9HT1RDQVBTKQorCSAgICAmJiAhKGNueC0+c3RhdGUgJiBWRVRIX1NUQVRFX1NFTlRDQVBBQ0spKSB7CisJCXN0cnVjdCBWZXRoQ2FwRGF0YSAqcmVtb3RlX2NhcHMgPSAmY254LT5yZW1vdGVfY2FwczsKKworCQltZW1jcHkocmVtb3RlX2NhcHMsICZjbngtPmNhcF9ldmVudC51LmNhcHNfZGF0YSwKKwkJICAgICAgIHNpemVvZigqcmVtb3RlX2NhcHMpKTsKKworCQlzcGluX3VubG9ja19pcnEoJmNueC0+bG9jayk7CisJCXJjID0gdmV0aF9wcm9jZXNzX2NhcHMoY254KTsKKwkJc3Bpbl9sb2NrX2lycSgmY254LT5sb2NrKTsKKworCQkvKiBXZSBkcm9wcGVkIHRoZSBsb2NrLCBzbyByZWNoZWNrIGZvciBhbnl0aGluZyB3aGljaAorCQkgKiBtaWdodCBtZXNzIHVzIHVwICovCisJCWlmIChjbngtPnN0YXRlICYgKFZFVEhfU1RBVEVfUkVTRVR8VkVUSF9TVEFURV9TSFVURE9XTikpCisJCQlnb3RvIHJlc3RhcnQ7CisKKwkJY254LT5jYXBfZXZlbnQuYmFzZV9ldmVudC54UmMgPSByYzsKKwkJSHZDYWxsRXZlbnRfYWNrTHBFdmVudCgoc3RydWN0IEh2THBFdmVudCAqKSZjbngtPmNhcF9ldmVudCk7CisJCWlmIChyYyA9PSBIdkxwRXZlbnRfUmNfR29vZCkKKwkJCWNueC0+c3RhdGUgfD0gVkVUSF9TVEFURV9TRU5UQ0FQQUNLOworCQllbHNlCisJCQlnb3RvIGNhbnRfY29wZTsKKwl9CisKKwlpZiAoKGNueC0+c3RhdGUgJiBWRVRIX1NUQVRFX0dPVENBUEFDSykKKwkgICAgJiYgKGNueC0+c3RhdGUgJiBWRVRIX1NUQVRFX0dPVENBUFMpCisJICAgICYmICEoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfUkVBRFkpKSB7CisJCWlmIChjbngtPmNhcF9hY2tfZXZlbnQuYmFzZV9ldmVudC54UmMgPT0gSHZMcEV2ZW50X1JjX0dvb2QpIHsKKwkJCS8qIFN0YXJ0IHRoZSBBQ0sgdGltZXIgKi8KKwkJCWNueC0+YWNrX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgY254LT5hY2tfdGltZW91dDsKKwkJCWFkZF90aW1lcigmY254LT5hY2tfdGltZXIpOworCQkJY254LT5zdGF0ZSB8PSBWRVRIX1NUQVRFX1JFQURZOworCQl9IGVsc2UgeworCQkJdmV0aF9wcmludGsoS0VSTl9FUlIsICJDYXBzIHJlamVjdGVkIChyYz0lZCkgYnkgIgorCQkJCSAgICAibHBhciAlZFxuIiwKKwkJCQkgICAgY254LT5jYXBfYWNrX2V2ZW50LmJhc2VfZXZlbnQueFJjLAorCQkJCSAgICBybHApOworCQkJZ290byBjYW50X2NvcGU7CisJCX0KKwl9CisKKyBvdXQ6CisJc3Bpbl91bmxvY2tfaXJxKCZjbngtPmxvY2spOworCXJldHVybjsKKworIGNhbnRfY29wZToKKwkvKiBGSVhNRTogd2UgZ2V0IGhlcmUgaWYgc29tZXRoaW5nIGhhcHBlbnMgd2UgcmVhbGx5IGNhbid0CisJICogY29wZSB3aXRoLiAgVGhlIGxpbmsgd2lsbCBuZXZlciB3b3JrIG9uY2Ugd2UgZ2V0IGhlcmUsIGFuZAorCSAqIGFsbCB3ZSBjYW4gZG8gaXMgbm90IGxvY2sgdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbSB1cCAqLworCXZldGhfZXJyb3IoIkJhZG5lc3Mgb24gY29ubmVjdGlvbiB0byBscGFyICVkIChzdGF0ZT0lMDRseCkgIgorCQkgICAiIC0gc2h1dHRpbmcgZG93blxuIiwgcmxwLCBjbngtPnN0YXRlKTsKKwljbngtPnN0YXRlIHw9IFZFVEhfU1RBVEVfU0hVVERPV047CisJc3Bpbl91bmxvY2tfaXJxKCZjbngtPmxvY2spOworfQorCitzdGF0aWMgaW50IHZldGhfaW5pdF9jb25uZWN0aW9uKHU4IHJscCkKK3sKKwlzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueDsKKwlzdHJ1Y3QgdmV0aF9tc2cgKm1zZ3M7CisJaW50IGk7CisKKwlpZiAoIChybHAgPT0gdGhpc19scCkKKwkgICAgIHx8ICEgSHZMcENvbmZpZ19kb0xwc0NvbW11bmljYXRlT25WaXJ0dWFsTGFuKHRoaXNfbHAsIHJscCkgKQorCQlyZXR1cm4gMDsKKworCWNueCA9IGttYWxsb2Moc2l6ZW9mKCpjbngpLCBHRlBfS0VSTkVMKTsKKwlpZiAoISBjbngpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChjbngsIDAsIHNpemVvZigqY254KSk7CisKKwljbngtPnJlbW90ZV9scCA9IHJscDsKKwlzcGluX2xvY2tfaW5pdCgmY254LT5sb2NrKTsKKwlJTklUX1dPUksoJmNueC0+c3RhdGVtYWNoaW5lX3dxLCB2ZXRoX3N0YXRlbWFjaGluZSwgY254KTsKKwlpbml0X3RpbWVyKCZjbngtPmFja190aW1lcik7CisJY254LT5hY2tfdGltZXIuZnVuY3Rpb24gPSB2ZXRoX3RpbWVkX2FjazsKKwljbngtPmFja190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGNueDsKKwltZW1zZXQoJmNueC0+cGVuZGluZ19hY2tzLCAweGZmLCBzaXplb2YgKGNueC0+cGVuZGluZ19hY2tzKSk7CisKKwl2ZXRoX2NueFtybHBdID0gY254OworCisJbXNncyA9IGttYWxsb2MoVkVUSF9OVU1CVUZGRVJTICogc2l6ZW9mKHN0cnVjdCB2ZXRoX21zZyksIEdGUF9LRVJORUwpOworCWlmICghIG1zZ3MpIHsKKwkJdmV0aF9lcnJvcigiQ2FuJ3QgYWxsb2NhdGUgYnVmZmVycyBmb3IgbHBhciAlZFxuIiwgcmxwKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY254LT5tc2dzID0gbXNnczsKKwltZW1zZXQobXNncywgMCwgVkVUSF9OVU1CVUZGRVJTICogc2l6ZW9mKHN0cnVjdCB2ZXRoX21zZykpOworCXNwaW5fbG9ja19pbml0KCZjbngtPm1zZ19zdGFja19sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBWRVRIX05VTUJVRkZFUlM7IGkrKykgeworCQltc2dzW2ldLnRva2VuID0gaTsKKwkJdmV0aF9zdGFja19wdXNoKGNueCwgbXNncyArIGkpOworCX0KKworCWNueC0+bnVtX2V2ZW50cyA9IHZldGhfYWxsb2NhdGVfZXZlbnRzKHJscCwgMiArIFZFVEhfTlVNQlVGRkVSUyk7CisKKwlpZiAoY254LT5udW1fZXZlbnRzIDwgKDIgKyBWRVRIX05VTUJVRkZFUlMpKSB7CisJCXZldGhfZXJyb3IoIkNhbid0IGFsbG9jYXRlIGV2ZW50cyBmb3IgbHBhciAlZCwgb25seSBnb3QgJWRcbiIsCisJCQkgICBybHAsIGNueC0+bnVtX2V2ZW50cyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNueC0+bG9jYWxfY2Fwcy5udW1fYnVmZmVycyA9IFZFVEhfTlVNQlVGRkVSUzsKKwljbngtPmxvY2FsX2NhcHMuYWNrX3RocmVzaG9sZCA9IEFDS19USFJFU0hPTEQ7CisJY254LT5sb2NhbF9jYXBzLmFja190aW1lb3V0ID0gVkVUSF9BQ0tUSU1FT1VUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZldGhfc3RvcF9jb25uZWN0aW9uKHU4IHJscCkKK3sKKwlzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCA9IHZldGhfY254W3JscF07CisKKwlpZiAoISBjbngpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnEoJmNueC0+bG9jayk7CisJY254LT5zdGF0ZSB8PSBWRVRIX1NUQVRFX1JFU0VUIHwgVkVUSF9TVEFURV9TSFVURE9XTjsKKwl2ZXRoX2tpY2tfc3RhdGVtYWNoaW5lKGNueCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjbngtPmxvY2spOworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCS8qIEZJWE1FOiBub3Qgc3VyZSBpZiB0aGlzIGlzIG5lY2Vzc2FyeSAtIHdpbGwgYWxyZWFkeSBoYXZlCisJICogYmVlbiBkZWxldGVkIGJ5IHRoZSBzdGF0ZSBtYWNoaW5lLCBqdXN0IHdhbnQgdG8gbWFrZSBzdXJlCisJICogaXRzIG5vdCBydW5uaW5nIGFueSBtb3JlICovCisJZGVsX3RpbWVyX3N5bmMoJmNueC0+YWNrX3RpbWVyKTsKKworCWlmIChjbngtPm51bV9ldmVudHMgPiAwKQorCQltZl9kZWFsbG9jYXRlX2xwX2V2ZW50cyhjbngtPnJlbW90ZV9scCwKKwkJCQkgICAgICBIdkxwRXZlbnRfVHlwZV9WaXJ0dWFsTGFuLAorCQkJCSAgICAgIGNueC0+bnVtX2V2ZW50cywKKwkJCQkgICAgICBOVUxMLCBOVUxMKTsKKwlpZiAoY254LT5udW1fYWNrX2V2ZW50cyA+IDApCisJCW1mX2RlYWxsb2NhdGVfbHBfZXZlbnRzKGNueC0+cmVtb3RlX2xwLAorCQkJCSAgICAgIEh2THBFdmVudF9UeXBlX1ZpcnR1YWxMYW4sCisJCQkJICAgICAgY254LT5udW1fYWNrX2V2ZW50cywKKwkJCQkgICAgICBOVUxMLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgdmV0aF9kZXN0cm95X2Nvbm5lY3Rpb24odTggcmxwKQoreworCXN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254ID0gdmV0aF9jbnhbcmxwXTsKKworCWlmICghIGNueCkKKwkJcmV0dXJuOworCisJa2ZyZWUoY254LT5tc2dzKTsKKwlrZnJlZShjbngpOworCXZldGhfY254W3JscF0gPSBOVUxMOworfQorCisvKgorICogbmV0X2RldmljZSBjb2RlCisgKi8KKworc3RhdGljIGludCB2ZXRoX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmV0aF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB2ZXRoX3BvcnQgKikgZGV2LT5wcml2OworCisJbWVtc2V0KCZwb3J0LT5zdGF0cywgMCwgc2l6ZW9mIChwb3J0LT5zdGF0cykpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmV0aF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp2ZXRoX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2ZXRoX3BvcnQgKnBvcnQgPSAoc3RydWN0IHZldGhfcG9ydCAqKSBkZXYtPnByaXY7CisKKwlyZXR1cm4gJnBvcnQtPnN0YXRzOworfQorCitzdGF0aWMgaW50IHZldGhfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlpZiAoKG5ld19tdHUgPCA2OCkgfHwgKG5ld19tdHUgPiBWRVRIX01BWF9NVFUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZXYtPm10dSA9IG5ld19tdHU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZldGhfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZldGhfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdmV0aF9wb3J0ICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJd3JpdGVfbG9ja19pcnFzYXZlKCZwb3J0LT5tY2FzdF9nYXRlLCBmbGFncyk7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CS8qIHNldCBwcm9taXNjdW91cyBtb2RlICovCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcG9ydC0+cHJvbWlzY3VvdXMgPSAxOworCX0gZWxzZSBpZiAoIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQorCQkgICAgfHwgKGRldi0+bWNfY291bnQgPiBWRVRIX01BWF9NQ0FTVCkgKSB7CisJCXBvcnQtPmFsbF9tY2FzdCA9IDE7CisJfSBlbHNlIHsKKwkJc3RydWN0IGRldl9tY19saXN0ICpkbWkgPSBkZXYtPm1jX2xpc3Q7CisJCWludCBpOworCisJCS8qIFVwZGF0ZSB0YWJsZSAqLworCQlwb3J0LT5udW1fbWNhc3QgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyspIHsKKwkJCXU4ICphZGRyID0gZG1pLT5kbWlfYWRkcjsKKwkJCXU2NCB4YWRkciA9IDA7CisKKwkJCWlmIChhZGRyWzBdICYgMHgwMSkgey8qIG11bHRpY2FzdCBhZGRyZXNzPyAqLworCQkJCW1lbWNweSgmeGFkZHIsIGFkZHIsIEVUSF9BTEVOKTsKKwkJCQlwb3J0LT5tY2FzdF9hZGRyW3BvcnQtPm51bV9tY2FzdF0gPSB4YWRkcjsKKwkJCQlwb3J0LT5udW1fbWNhc3QrKzsKKwkJCX0KKwkJCWRtaSA9IGRtaS0+bmV4dDsKKwkJfQorCX0KKworCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5tY2FzdF9nYXRlLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHZldGhfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJuY3B5KGluZm8tPmRyaXZlciwgInZldGgiLCBzaXplb2YoaW5mby0+ZHJpdmVyKSAtIDEpOworCWluZm8tPmRyaXZlcltzaXplb2YoaW5mby0+ZHJpdmVyKSAtIDFdID0gJ1wwJzsKKwlzdHJuY3B5KGluZm8tPnZlcnNpb24sICIxLjAiLCBzaXplb2YoaW5mby0+dmVyc2lvbikgLSAxKTsKK30KKworc3RhdGljIGludCB2ZXRoX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJZWNtZC0+c3VwcG9ydGVkID0gKFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbAorCQkJICB8IFNVUFBPUlRFRF9BdXRvbmVnIHwgU1VQUE9SVEVEX0ZJQlJFKTsKKwllY21kLT5hZHZlcnRpc2luZyA9IChTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwKKwkJCSAgICB8IFNVUFBPUlRFRF9BdXRvbmVnIHwgU1VQUE9SVEVEX0ZJQlJFKTsKKwllY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKKwllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisJZWNtZC0+cGh5X2FkZHJlc3MgPSAwOworCWVjbWQtPnNwZWVkID0gU1BFRURfMTAwMDsKKwllY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwllY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJZWNtZC0+bWF4dHhwa3QgPSAxMjA7CisJZWNtZC0+bWF4cnhwa3QgPSAxMjA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgdmV0aF9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG9wcyA9IHsKKwkuZ2V0X2RydmluZm8gPSB2ZXRoX2dldF9kcnZpbmZvLAorCS5nZXRfc2V0dGluZ3MgPSB2ZXRoX2dldF9zZXR0aW5ncywKKwkuZ2V0X2xpbmsgPSB2ZXRoX2dldF9saW5rLAorfTsKKworc3RhdGljIHZvaWQgdmV0aF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZldGhfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdmV0aF9wb3J0ICopZGV2LT5wcml2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwb3J0LT5zdGF0czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJc3RhdHMtPnR4X2Vycm9ycysrOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPnBlbmRpbmdfZ2F0ZSwgZmxhZ3MpOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFR4IHRpbWVvdXQhICBSZXNldHRpbmcgbHAgY29ubmVjdGlvbnM6ICUwOHhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgcG9ydC0+cGVuZGluZ19scG1hc2spOworCisJLyogSWYgd2UndmUgdGltZWQgb3V0IHRoZSBxdWV1ZSBtdXN0IGJlIHN0b3BwZWQsIHdoaWNoIHNob3VsZAorCSAqIG9ubHkgZXZlciBoYXBwZW4gd2hlbiB0aGVyZSBpcyBhIHBlbmRpbmcgcGFja2V0LiAqLworCVdBUk5fT04oISBwb3J0LT5wZW5kaW5nX2xwbWFzayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSFZNQVhBUkNISVRFQ1RFRExQUzsgaSsrKSB7CisJCXN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254ID0gdmV0aF9jbnhbaV07CisKKwkJaWYgKCEgKHBvcnQtPnBlbmRpbmdfbHBtYXNrICYgKDE8PGkpKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIElmIHdlJ3JlIHBlbmRpbmcgb24gaXQsIHdlIG11c3QgYmUgY29ubmVjdGVkIHRvIGl0LAorCQkgKiBzbyB3ZSBzaG91bGQgY2VydGFpbmx5IGhhdmUgYSBzdHJ1Y3R1cmUgZm9yIGl0LiAqLworCQlCVUdfT04oISBjbngpOworCisJCS8qIFRoZW9yZXRpY2FsbHkgd2UgY291bGQgYmUga2lja2luZyBhIGNvbm5lY3Rpb24KKwkJICogd2hpY2ggZG9lc24ndCBkZXNlcnZlIGl0LCBidXQgaW4gcHJhY3RpY2UgaWYgd2UndmUKKwkJICogaGFkIGEgVHggdGltZW91dCwgdGhlIHBlbmRpbmdfbHBtYXNrIHdpbGwgaGF2ZQorCQkgKiBleGFjdGx5IG9uZSBiaXQgc2V0IC0gdGhlIGNvbm5lY3Rpb24gY2F1c2luZyB0aGUKKwkJICogcHJvYmxlbS4gKi8KKwkJc3Bpbl9sb2NrKCZjbngtPmxvY2spOworCQljbngtPnN0YXRlIHw9IFZFVEhfU1RBVEVfUkVTRVQ7CisJCXZldGhfa2lja19zdGF0ZW1hY2hpbmUoY254KTsKKwkJc3Bpbl91bmxvY2soJmNueC0+bG9jayk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+cGVuZGluZ19nYXRlLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCB2ZXRoX3Byb2JlX29uZShpbnQgdmxhbiwgc3RydWN0IGRldmljZSAqdmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCB2ZXRoX3BvcnQgKnBvcnQ7CisJaW50IGksIHJjOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mIChzdHJ1Y3QgdmV0aF9wb3J0KSk7CisJaWYgKCEgZGV2KSB7CisJCXZldGhfZXJyb3IoIlVuYWJsZSB0byBhbGxvY2F0ZSBuZXRfZGV2aWNlIHN0cnVjdHVyZSFcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwb3J0ID0gKHN0cnVjdCB2ZXRoX3BvcnQgKikgZGV2LT5wcml2OworCisJc3Bpbl9sb2NrX2luaXQoJnBvcnQtPnBlbmRpbmdfZ2F0ZSk7CisJcndsb2NrX2luaXQoJnBvcnQtPm1jYXN0X2dhdGUpOworCisJZm9yIChpID0gMDsgaSA8IEhWTUFYQVJDSElURUNURURMUFM7IGkrKykgeworCQlIdkxwVmlydHVhbExhbkluZGV4TWFwIG1hcDsKKworCQlpZiAoaSA9PSB0aGlzX2xwKQorCQkJY29udGludWU7CisJCW1hcCA9IEh2THBDb25maWdfZ2V0VmlydHVhbExhbkluZGV4TWFwRm9yTHAoaSk7CisJCWlmIChtYXAgJiAoMHg4MDAwID4+IHZsYW4pKQorCQkJcG9ydC0+bHBhcl9tYXAgfD0gKDEgPDwgaSk7CisJfQorCXBvcnQtPmRldiA9IHZkZXY7CisKKwlkZXYtPmRldl9hZGRyWzBdID0gMHgwMjsKKwlkZXYtPmRldl9hZGRyWzFdID0gMHgwMTsKKwlkZXYtPmRldl9hZGRyWzJdID0gMHhmZjsKKwlkZXYtPmRldl9hZGRyWzNdID0gdmxhbjsKKwlkZXYtPmRldl9hZGRyWzRdID0gMHhmZjsKKwlkZXYtPmRldl9hZGRyWzVdID0gdGhpc19scDsKKworCWRldi0+bXR1ID0gVkVUSF9NQVhfTVRVOworCisJbWVtY3B5KCZwb3J0LT5tYWNfYWRkciwgZGV2LT5kZXZfYWRkciwgNik7CisKKwlkZXYtPm9wZW4gPSB2ZXRoX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB2ZXRoX3N0YXJ0X3htaXQ7CisJZGV2LT5zdG9wID0gdmV0aF9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9IHZldGhfZ2V0X3N0YXRzOworCWRldi0+Y2hhbmdlX210dSA9IHZldGhfY2hhbmdlX210dTsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IE5VTEw7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSB2ZXRoX3NldF9tdWx0aWNhc3RfbGlzdDsKKwlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmb3BzKTsKKworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSAyICogKFZFVEhfQUNLVElNRU9VVCAqIEhaIC8gMTAwMDAwMCk7CisJZGV2LT50eF90aW1lb3V0ID0gdmV0aF90eF90aW1lb3V0OworCisJU0VUX05FVERFVl9ERVYoZGV2LCB2ZGV2KTsKKworCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJjICE9IDApIHsKKwkJdmV0aF9wcmludGsoS0VSTl9FUlIsCisJCQkgICAgIkZhaWxlZCB0byByZWdpc3RlciBldGhlcm5ldCBkZXZpY2UgZm9yIHZsYW4gJWRcbiIsCisJCQkgICAgdmxhbik7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBOVUxMOworCX0KKworCXZldGhfcHJpbnRrKEtFUk5fREVCVUcsICIlcyBhdHRhY2hlZCB0byBpU2VyaWVzIHZsYW4gJWQgKGxwYXJfbWFwPTB4JTA0eClcbiIsCisJCSAgICBkZXYtPm5hbWUsIHZsYW4sIHBvcnQtPmxwYXJfbWFwKTsKKworCXJldHVybiBkZXY7Cit9CisKKy8qCisgKiBUeCBwYXRoCisgKi8KKworc3RhdGljIGludCB2ZXRoX3RyYW5zbWl0X3RvX29uZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBIdkxwSW5kZXggcmxwLAorCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbnggPSB2ZXRoX2NueFtybHBdOworCXN0cnVjdCB2ZXRoX3BvcnQgKnBvcnQgPSAoc3RydWN0IHZldGhfcG9ydCAqKSBkZXYtPnByaXY7CisJSHZMcEV2ZW50X1JjIHJjOworCXUzMiBkbWFfYWRkcmVzcywgZG1hX2xlbmd0aDsKKwlzdHJ1Y3QgdmV0aF9tc2cgKm1zZyA9IE5VTEw7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghIGNueCkgeworCQlwb3J0LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY254LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoISBjbngtPnN0YXRlICYgVkVUSF9TVEFURV9SRUFEWSkKKwkJZ290byBkcm9wOworCisJaWYgKChza2ItPmxlbiAtIDE0KSA+IFZFVEhfTUFYX01UVSkKKwkJZ290byBkcm9wOworCisJbXNnID0gdmV0aF9zdGFja19wb3AoY254KTsKKworCWlmICghIG1zZykgeworCQllcnIgPSAxOworCQlnb3RvIGRyb3A7CisJfQorCisJZG1hX2xlbmd0aCA9IHNrYi0+bGVuOworCWRtYV9hZGRyZXNzID0gZG1hX21hcF9zaW5nbGUocG9ydC0+ZGV2LCBza2ItPmRhdGEsCisJCQkJICAgICBkbWFfbGVuZ3RoLCBETUFfVE9fREVWSUNFKTsKKworCWlmIChkbWFfbWFwcGluZ19lcnJvcihkbWFfYWRkcmVzcykpCisJCWdvdG8gcmVjeWNsZV9hbmRfZHJvcDsKKworCS8qIElzIGl0IHJlYWxseSBuZWNlc3NhcnkgdG8gY2hlY2sgdGhlIGxlbmd0aCBhbmQgYWRkcmVzcworCSAqIGZpZWxkcyBvZiB0aGUgZmlyc3QgZW50cnkgaGVyZT8gKi8KKwltc2ctPnNrYiA9IHNrYjsKKwltc2ctPmRldiA9IHBvcnQtPmRldjsKKwltc2ctPmRhdGEuYWRkclswXSA9IGRtYV9hZGRyZXNzOworCW1zZy0+ZGF0YS5sZW5bMF0gPSBkbWFfbGVuZ3RoOworCW1zZy0+ZGF0YS5lb2ZtYXNrID0gMSA8PCBWRVRIX0VPRl9TSElGVDsKKwlzZXRfYml0KDAsICYobXNnLT5pbl91c2UpKTsKKwlyYyA9IHZldGhfc2lnbmFsZGF0YShjbngsIFZldGhFdmVudFR5cGVGcmFtZXMsIG1zZy0+dG9rZW4sICZtc2ctPmRhdGEpOworCisJaWYgKHJjICE9IEh2THBFdmVudF9SY19Hb29kKQorCQlnb3RvIHJlY3ljbGVfYW5kX2Ryb3A7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbngtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKKworIHJlY3ljbGVfYW5kX2Ryb3A6CisJbXNnLT5za2IgPSBOVUxMOworCS8qIG5lZWQgdG8gc2V0IGluIHVzZSB0byBtYWtlIHZldGhfcmVjeWNsZV9tc2cgaW4gY2FzZSB0aGlzCisJICogd2FzIGEgbWFwcGluZyBmYWlsdXJlICovCisJc2V0X2JpdCgwLCAmbXNnLT5pbl91c2UpOworCXZldGhfcmVjeWNsZV9tc2coY254LCBtc2cpOworIGRyb3A6CisJcG9ydC0+c3RhdHMudHhfZXJyb3JzKys7CisJZGV2X2tmcmVlX3NrYihza2IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNueC0+bG9jaywgZmxhZ3MpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBIdkxwSW5kZXhNYXAgdmV0aF90cmFuc21pdF90b19tYW55KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgSHZMcEluZGV4TWFwIGxwbWFzaywKKwkJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2ZXRoX3BvcnQgKnBvcnQgPSAoc3RydWN0IHZldGhfcG9ydCAqKSBkZXYtPnByaXY7CisJaW50IGk7CisJaW50IHJjOworCisJZm9yIChpID0gMDsgaSA8IEhWTUFYQVJDSElURUNURURMUFM7IGkrKykgeworCQlpZiAoKGxwbWFzayAmICgxIDw8IGkpKSA9PSAwKQorCQkJY29udGludWU7CisKKwkJcmMgPSB2ZXRoX3RyYW5zbWl0X3RvX29uZShza2JfZ2V0KHNrYiksIGksIGRldik7CisJCWlmICghIHJjKQorCQkJbHBtYXNrICY9IH4oMTw8aSk7CisJfQorCisJaWYgKCEgbHBtYXNrKSB7CisJCXBvcnQtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJcG9ydC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJfQorCisJcmV0dXJuIGxwbWFzazsKK30KKworc3RhdGljIGludCB2ZXRoX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBjaGFyICpmcmFtZSA9IHNrYi0+ZGF0YTsKKwlzdHJ1Y3QgdmV0aF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB2ZXRoX3BvcnQgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJSHZMcEluZGV4TWFwIGxwbWFzazsKKworCWlmICghIChmcmFtZVswXSAmIDB4MDEpKSB7CisJCS8qIHVuaWNhc3QgcGFja2V0ICovCisJCUh2THBJbmRleCBybHAgPSBmcmFtZVs1XTsKKworCQlpZiAoICEgKCgxIDw8IHJscCkgJiBwb3J0LT5scGFyX21hcCkgKSB7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWxwbWFzayA9IDEgPDwgcmxwOworCX0gZWxzZSB7CisJCWxwbWFzayA9IHBvcnQtPmxwYXJfbWFwOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5wZW5kaW5nX2dhdGUsIGZsYWdzKTsKKworCWxwbWFzayA9IHZldGhfdHJhbnNtaXRfdG9fbWFueShza2IsIGxwbWFzaywgZGV2KTsKKworCWlmICghIGxwbWFzaykgeworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfSBlbHNlIHsKKwkJaWYgKHBvcnQtPnBlbmRpbmdfc2tiKSB7CisJCQl2ZXRoX2Vycm9yKCIlczogVHggd2hpbGUgc2tiIHdhcyBwZW5kaW5nIVxuIiwKKwkJCQkgICBkZXYtPm5hbWUpOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+cGVuZGluZ19nYXRlLCBmbGFncyk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCXBvcnQtPnBlbmRpbmdfc2tiID0gc2tiOworCQlwb3J0LT5wZW5kaW5nX2xwbWFzayA9IGxwbWFzazsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPnBlbmRpbmdfZ2F0ZSwgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZldGhfcmVjeWNsZV9tc2coc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbngsCisJCQkgICAgIHN0cnVjdCB2ZXRoX21zZyAqbXNnKQoreworCXUzMiBkbWFfYWRkcmVzcywgZG1hX2xlbmd0aDsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgJm1zZy0+aW5fdXNlKSkgeworCQlkbWFfYWRkcmVzcyA9IG1zZy0+ZGF0YS5hZGRyWzBdOworCQlkbWFfbGVuZ3RoID0gbXNnLT5kYXRhLmxlblswXTsKKworCQlkbWFfdW5tYXBfc2luZ2xlKG1zZy0+ZGV2LCBkbWFfYWRkcmVzcywgZG1hX2xlbmd0aCwKKwkJCQkgRE1BX1RPX0RFVklDRSk7CisKKwkJaWYgKG1zZy0+c2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShtc2ctPnNrYik7CisJCQltc2ctPnNrYiA9IE5VTEw7CisJCX0KKworCQltZW1zZXQoJm1zZy0+ZGF0YSwgMCwgc2l6ZW9mKG1zZy0+ZGF0YSkpOworCQl2ZXRoX3N0YWNrX3B1c2goY254LCBtc2cpOworCX0gZWxzZQorCQlpZiAoY254LT5zdGF0ZSAmIFZFVEhfU1RBVEVfT1BFTikKKwkJCXZldGhfZXJyb3IoIkJvZ3VzIGZyYW1lcyBhY2sgZnJvbSBscGFyICVkICgjJWQpXG4iLAorCQkJCSAgIGNueC0+cmVtb3RlX2xwLCBtc2ctPnRva2VuKTsKK30KKworc3RhdGljIHZvaWQgdmV0aF9mbHVzaF9wZW5kaW5nKHN0cnVjdCB2ZXRoX2xwYXJfY29ubmVjdGlvbiAqY254KQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBIVk1BWEFSQ0hJVEVDVEVEVklSVFVBTExBTlM7IGkrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdmV0aF9kZXZbaV07CisJCXN0cnVjdCB2ZXRoX3BvcnQgKnBvcnQ7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJaWYgKCEgZGV2KQorCQkJY29udGludWU7CisKKwkJcG9ydCA9IChzdHJ1Y3QgdmV0aF9wb3J0ICopZGV2LT5wcml2OworCisJCWlmICghIChwb3J0LT5scGFyX21hcCAmICgxPDxjbngtPnJlbW90ZV9scCkpKQorCQkJY29udGludWU7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPnBlbmRpbmdfZ2F0ZSwgZmxhZ3MpOworCQlpZiAocG9ydC0+cGVuZGluZ19za2IpIHsKKwkJCXBvcnQtPnBlbmRpbmdfbHBtYXNrID0KKwkJCQl2ZXRoX3RyYW5zbWl0X3RvX21hbnkocG9ydC0+cGVuZGluZ19za2IsCisJCQkJCQkgICAgICBwb3J0LT5wZW5kaW5nX2xwbWFzaywKKwkJCQkJCSAgICAgIGRldik7CisJCQlpZiAoISBwb3J0LT5wZW5kaW5nX2xwbWFzaykgeworCQkJCWRldl9rZnJlZV9za2JfYW55KHBvcnQtPnBlbmRpbmdfc2tiKTsKKwkJCQlwb3J0LT5wZW5kaW5nX3NrYiA9IE5VTEw7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPnBlbmRpbmdfZ2F0ZSwgZmxhZ3MpOworCX0KK30KKworLyoKKyAqIFJ4IHBhdGgKKyAqLworCitzdGF0aWMgaW5saW5lIGludCB2ZXRoX2ZyYW1lX3dhbnRlZChzdHJ1Y3QgdmV0aF9wb3J0ICpwb3J0LCB1NjQgbWFjX2FkZHIpCit7CisJaW50IHdhbnRlZCA9IDA7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICggKG1hY19hZGRyID09IHBvcnQtPm1hY19hZGRyKSB8fCAobWFjX2FkZHIgPT0gMHhmZmZmZmZmZmZmZmYwMDAwKSApCisJCXJldHVybiAxOworCisJaWYgKCEgKCgoY2hhciAqKSAmbWFjX2FkZHIpWzBdICYgMHgwMSkpCisJCXJldHVybiAwOworCisJcmVhZF9sb2NrX2lycXNhdmUoJnBvcnQtPm1jYXN0X2dhdGUsIGZsYWdzKTsKKworCWlmIChwb3J0LT5wcm9taXNjdW91cyB8fCBwb3J0LT5hbGxfbWNhc3QpIHsKKwkJd2FudGVkID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHBvcnQtPm51bV9tY2FzdDsgKytpKSB7CisJCWlmIChwb3J0LT5tY2FzdF9hZGRyW2ldID09IG1hY19hZGRyKSB7CisJCQl3YW50ZWQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKyBvdXQ6CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bWNhc3RfZ2F0ZSwgZmxhZ3MpOworCisJcmV0dXJuIHdhbnRlZDsKK30KKworc3RydWN0IGRtYV9jaHVuayB7CisJdTY0IGFkZHI7CisJdTY0IHNpemU7Cit9OworCisjZGVmaW5lIFZFVEhfTUFYX1BBR0VTX1BFUl9GUkFNRSAoIChWRVRIX01BWF9NVFUrUEFHRV9TSVpFLTIpL1BBR0VfU0laRSArIDEgKQorCitzdGF0aWMgaW5saW5lIHZvaWQgdmV0aF9idWlsZF9kbWFfbGlzdChzdHJ1Y3QgZG1hX2NodW5rICpsaXN0LAorCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpwLCB1bnNpZ25lZCBsb25nIGxlbmd0aCkKK3sKKwl1bnNpZ25lZCBsb25nIGRvbmU7CisJaW50IGkgPSAxOworCisJLyogRklYTUU6IHNrYnMgYXJlIGNvbnRpbmd1b3VzIGluIHJlYWwgYWRkcmVzc2VzLiAgRG8gd2UKKwkgKiByZWFsbHkgbmVlZCB0byBicmVhayBpdCBpbnRvIFBBR0VfU0laRSBjaHVua3MsIG9yIGNhbiB3ZSBkbworCSAqIGl0IGp1c3QgYXQgdGhlIGdyYW51bGFyaXR5IG9mIGlTZXJpZXMgcmVhbC0+YWJzb2x1dGUKKwkgKiBtYXBwaW5nPyAgSW5kZWVkLCBnaXZlbiB0aGUgd2F5IHRoZSBhbGxvY2F0b3Igd29ya3MsIGNhbiB3ZQorCSAqIGNvdW50IG9uIHRoZW0gYmVpbmcgYWJzb2x1dGVseSBjb250aWd1b3VzPyAqLworCWxpc3RbMF0uYWRkciA9IElTRVJJRVNfSFZfQUREUihwKTsKKwlsaXN0WzBdLnNpemUgPSBtaW4obGVuZ3RoLAorCQkJICAgUEFHRV9TSVpFIC0gKCh1bnNpZ25lZCBsb25nKXAgJiB+UEFHRV9NQVNLKSk7CisKKwlkb25lID0gbGlzdFswXS5zaXplOworCXdoaWxlIChkb25lIDwgbGVuZ3RoKSB7CisJCWxpc3RbaV0uYWRkciA9IElTRVJJRVNfSFZfQUREUihwICsgZG9uZSk7CisJCWxpc3RbaV0uc2l6ZSA9IG1pbihsZW5ndGgtZG9uZSwgUEFHRV9TSVpFKTsKKwkJZG9uZSArPSBsaXN0W2ldLnNpemU7CisJCWkrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHZldGhfZmx1c2hfYWNrcyhzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCkKK3sKKwlIdkxwRXZlbnRfUmMgcmM7CisKKwlyYyA9IHZldGhfc2lnbmFsZGF0YShjbngsIFZldGhFdmVudFR5cGVGcmFtZXNBY2ssCisJCQkgICAgIDAsICZjbngtPnBlbmRpbmdfYWNrcyk7CisKKwlpZiAocmMgIT0gSHZMcEV2ZW50X1JjX0dvb2QpCisJCXZldGhfZXJyb3IoIkVycm9yIDB4JXggYWNraW5nIGZyYW1lcyBmcm9tIGxwYXIgJWQhXG4iLAorCQkJICAgKHVuc2lnbmVkKXJjLCBjbngtPnJlbW90ZV9scCk7CisKKwljbngtPm51bV9wZW5kaW5nX2Fja3MgPSAwOworCW1lbXNldCgmY254LT5wZW5kaW5nX2Fja3MsIDB4ZmYsIHNpemVvZihjbngtPnBlbmRpbmdfYWNrcykpOworfQorCitzdGF0aWMgdm9pZCB2ZXRoX3JlY2VpdmUoc3RydWN0IHZldGhfbHBhcl9jb25uZWN0aW9uICpjbngsCisJCQkgc3RydWN0IFZldGhMcEV2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgVmV0aEZyYW1lc0RhdGEgKnNlbmRkYXRhID0gJmV2ZW50LT51LmZyYW1lc19kYXRhOworCWludCBzdGFydGNodW5rID0gMDsKKwlpbnQgbmNodW5rczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCUh2THBEbWFfUmMgcmM7CisKKwlkbyB7CisJCXUxNiBsZW5ndGggPSAwOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlzdHJ1Y3QgZG1hX2NodW5rIGxvY2FsX2xpc3RbVkVUSF9NQVhfUEFHRVNfUEVSX0ZSQU1FXTsKKwkJc3RydWN0IGRtYV9jaHVuayByZW1vdGVfbGlzdFtWRVRIX01BWF9GUkFNRVNfUEVSX01TR107CisJCXU2NCBkZXN0OworCQlIdkxwVmlydHVhbExhbkluZGV4IHZsYW47CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJCXN0cnVjdCB2ZXRoX3BvcnQgKnBvcnQ7CisKKwkJLyogRklYTUU6IGRvIHdlIG5lZWQgdGhpcz8gKi8KKwkJbWVtc2V0KGxvY2FsX2xpc3QsIDAsIHNpemVvZihsb2NhbF9saXN0KSk7CisJCW1lbXNldChyZW1vdGVfbGlzdCwgMCwgc2l6ZW9mKFZFVEhfTUFYX0ZSQU1FU19QRVJfTVNHKSk7CisKKwkJLyogYSAwIGFkZHJlc3MgbWFya3MgdGhlIGVuZCBvZiB0aGUgdmFsaWQgZW50cmllcyAqLworCQlpZiAoc2VuZGRhdGEtPmFkZHJbc3RhcnRjaHVua10gPT0gMCkKKwkJCWJyZWFrOworCisJCS8qIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYXQgbGVhc3QgMSBFT0YgZW50cnkgaW4gdGhlCisJCSAqIHJlbWFpbmluZyBlbnRyaWVzICovCisJCWlmICghIChzZW5kZGF0YS0+ZW9mbWFzayA+PiAoc3RhcnRjaHVuayArIFZFVEhfRU9GX1NISUZUKSkpIHsKKwkJCXZldGhfZXJyb3IoIm1pc3NpbmcgRU9GIGZyYWcgaW4gZXZlbnQgIgorCQkJCSAgICJlb2ZtYXNrPTB4JXggc3RhcnRjaHVuaz0lZFxuIiwKKwkJCQkgICAodW5zaWduZWQpIHNlbmRkYXRhLT5lb2ZtYXNrLCBzdGFydGNodW5rKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogYnVpbGQgbGlzdCBvZiBjaHVua3MgaW4gdGhpcyBmcmFtZSAqLworCQluY2h1bmtzID0gMDsKKwkJZG8geworCQkJcmVtb3RlX2xpc3RbbmNodW5rc10uYWRkciA9CisJCQkJKHU2NCkgc2VuZGRhdGEtPmFkZHJbc3RhcnRjaHVuaytuY2h1bmtzXSA8PCAzMjsKKwkJCXJlbW90ZV9saXN0W25jaHVua3NdLnNpemUgPQorCQkJCXNlbmRkYXRhLT5sZW5bc3RhcnRjaHVuaytuY2h1bmtzXTsKKwkJCWxlbmd0aCArPSByZW1vdGVfbGlzdFtuY2h1bmtzXS5zaXplOworCQl9IHdoaWxlICghIChzZW5kZGF0YS0+ZW9mbWFzayAmCisJCQkgICAgKDEgPDwgKFZFVEhfRU9GX1NISUZUICsgc3RhcnRjaHVuayArIG5jaHVua3MrKykpKSk7CisKKwkJLyogbGVuZ3RoID09IHRvdGFsIGxlbmd0aCBvZiBhbGwgY2h1bmtzICovCisJCS8qIG5jaHVua3MgPT0gIyBvZiBjaHVua3MgaW4gdGhpcyBmcmFtZSAqLworCisJCWlmICgobGVuZ3RoIC0gRVRIX0hMRU4pID4gVkVUSF9NQVhfTVRVKSB7CisJCQl2ZXRoX2Vycm9yKCJSZWNlaXZlZCBvdmVyc2l6ZSBmcmFtZSBmcm9tIGxwYXIgJWQgIgorCQkJCSAgICIobGVuZ3RoPSVkKVxuIiwgY254LT5yZW1vdGVfbHAsIGxlbmd0aCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXNrYiA9IGFsbG9jX3NrYihsZW5ndGgsIEdGUF9BVE9NSUMpOworCQlpZiAoIXNrYikKKwkJCWNvbnRpbnVlOworCisJCXZldGhfYnVpbGRfZG1hX2xpc3QobG9jYWxfbGlzdCwgc2tiLT5kYXRhLCBsZW5ndGgpOworCisJCXJjID0gSHZDYWxsRXZlbnRfZG1hQnVmTGlzdChIdkxwRXZlbnRfVHlwZV9WaXJ0dWFsTGFuLAorCQkJCQkgICAgZXZlbnQtPmJhc2VfZXZlbnQueFNvdXJjZUxwLAorCQkJCQkgICAgSHZMcERtYV9EaXJlY3Rpb25fUmVtb3RlVG9Mb2NhbCwKKwkJCQkJICAgIGNueC0+c3JjX2luc3QsCisJCQkJCSAgICBjbngtPmRzdF9pbnN0LAorCQkJCQkgICAgSHZMcERtYV9BZGRyZXNzVHlwZV9SZWFsQWRkcmVzcywKKwkJCQkJICAgIEh2THBEbWFfQWRkcmVzc1R5cGVfVGNlSW5kZXgsCisJCQkJCSAgICBJU0VSSUVTX0hWX0FERFIoJmxvY2FsX2xpc3QpLAorCQkJCQkgICAgSVNFUklFU19IVl9BRERSKCZyZW1vdGVfbGlzdCksCisJCQkJCSAgICBsZW5ndGgpOworCQlpZiAocmMgIT0gSHZMcERtYV9SY19Hb29kKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQkJY29udGludWU7CisJCX0KKworCQl2bGFuID0gc2tiLT5kYXRhWzldOworCQlkZXYgPSB2ZXRoX2Rldlt2bGFuXTsKKwkJaWYgKCEgZGV2KQorCQkJLyogU29tZSBlYXJsaWVyIHZlcnNpb25zIG9mIHRoZSBkcml2ZXIgc2VudAorCQkJICAgYnJvYWRjYXN0cyBkb3duIGFsbCBjb25uZWN0aW9ucywgZXZlbiB0bworCQkJICAgbHBhcnMgdGhhdCB3ZXJlbid0IG9uIHRoZSByZWxldmFudCB2bGFuLgorCQkJICAgU28gaWdub3JlIHBhY2tldHMgYmVsb25naW5nIHRvIGEgdmxhbiB3ZSdyZQorCQkJICAgbm90IG9uLiAqLworCQkJY29udGludWU7CisKKwkJcG9ydCA9IChzdHJ1Y3QgdmV0aF9wb3J0ICopZGV2LT5wcml2OworCQlkZXN0ID0gKigodTY0ICopIHNrYi0+ZGF0YSkgJiAweEZGRkZGRkZGRkZGRjAwMDA7CisKKwkJaWYgKCh2bGFuID4gSFZNQVhBUkNISVRFQ1RFRFZJUlRVQUxMQU5TKSB8fCAhcG9ydCkgeworCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghIHZldGhfZnJhbWVfd2FudGVkKHBvcnQsIGRlc3QpKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQkJY29udGludWU7CisJCX0KKworCQlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJbmV0aWZfcngoc2tiKTsJLyogc2VuZCBpdCB1cCAqLworCQlwb3J0LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCXBvcnQtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbmd0aDsKKwl9IHdoaWxlIChzdGFydGNodW5rICs9IG5jaHVua3MsIHN0YXJ0Y2h1bmsgPCBWRVRIX01BWF9GUkFNRVNfUEVSX01TRyk7CisKKwkvKiBBY2sgaXQgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY254LT5sb2NrLCBmbGFncyk7CisJQlVHX09OKGNueC0+bnVtX3BlbmRpbmdfYWNrcyA+IFZFVEhfTUFYX0FDS1NfUEVSX01TRyk7CisKKwljbngtPnBlbmRpbmdfYWNrc1tjbngtPm51bV9wZW5kaW5nX2Fja3MrK10gPQorCQlldmVudC0+YmFzZV9ldmVudC54Q29ycmVsYXRpb25Ub2tlbjsKKworCWlmICggKGNueC0+bnVtX3BlbmRpbmdfYWNrcyA+PSBjbngtPnJlbW90ZV9jYXBzLmFja190aHJlc2hvbGQpCisJICAgICB8fCAoY254LT5udW1fcGVuZGluZ19hY2tzID49IFZFVEhfTUFYX0FDS1NfUEVSX01TRykgKQorCQl2ZXRoX2ZsdXNoX2Fja3MoY254KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNueC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB2ZXRoX3RpbWVkX2Fjayh1bnNpZ25lZCBsb25nIHB0cikKK3sKKwlzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKmNueCA9IChzdHJ1Y3QgdmV0aF9scGFyX2Nvbm5lY3Rpb24gKikgcHRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBBY2sgYWxsIHRoZSBldmVudHMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY254LT5sb2NrLCBmbGFncyk7CisJaWYgKGNueC0+bnVtX3BlbmRpbmdfYWNrcyA+IDApCisJCXZldGhfZmx1c2hfYWNrcyhjbngpOworCisJLyogUmVzY2hlZHVsZSB0aGUgdGltZXIgKi8KKwljbngtPmFja190aW1lci5leHBpcmVzID0gamlmZmllcyArIGNueC0+YWNrX3RpbWVvdXQ7CisJYWRkX3RpbWVyKCZjbngtPmFja190aW1lcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY254LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgdmV0aF9yZW1vdmUoc3RydWN0IHZpb19kZXYgKnZkZXYpCit7CisJaW50IGkgPSB2ZGV2LT51bml0X2FkZHJlc3M7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCWRldiA9IHZldGhfZGV2W2ldOworCWlmIChkZXYgIT0gTlVMTCkgeworCQl2ZXRoX2RldltpXSA9IE5VTEw7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZldGhfcHJvYmUoc3RydWN0IHZpb19kZXYgKnZkZXYsIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgaSA9IHZkZXYtPnVuaXRfYWRkcmVzczsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJZGV2ID0gdmV0aF9wcm9iZV9vbmUoaSwgJnZkZXYtPmRldik7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXZldGhfcmVtb3ZlKHZkZXYpOworCQlyZXR1cm4gMTsKKwl9CisJdmV0aF9kZXZbaV0gPSBkZXY7CisKKwkvKiBTdGFydCB0aGUgc3RhdGUgbWFjaGluZSBvbiBlYWNoIGNvbm5lY3Rpb24sIHRvIGNvbW1lbmNlCisJICogbGluayBuZWdvdGlhdGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCBIVk1BWEFSQ0hJVEVDVEVETFBTOyBpKyspCisJCWlmICh2ZXRoX2NueFtpXSkKKwkJCXZldGhfa2lja19zdGF0ZW1hY2hpbmUodmV0aF9jbnhbaV0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdmV0aF9kZXZpY2VfdGFibGU6IFVzZWQgYnkgdmlvLmMgdG8gbWF0Y2ggZGV2aWNlcyB0aGF0IHdlCisgKiBzdXBwb3J0LgorICovCitzdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgdmV0aF9kZXZpY2VfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCXsgInZsYW4iLCAiIiB9LAorCXsgTlVMTCwgTlVMTCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh2aW8sIHZldGhfZGV2aWNlX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCB2aW9fZHJpdmVyIHZldGhfZHJpdmVyID0geworCS5uYW1lID0gImlzZXJpZXNfdmV0aCIsCisJLmlkX3RhYmxlID0gdmV0aF9kZXZpY2VfdGFibGUsCisJLnByb2JlID0gdmV0aF9wcm9iZSwKKwkucmVtb3ZlID0gdmV0aF9yZW1vdmUKK307CisKKy8qCisgKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24vY2xlYW51cAorICovCisKK3ZvaWQgX19leGl0IHZldGhfbW9kdWxlX2NsZWFudXAodm9pZCkKK3sKKwlpbnQgaTsKKworCXZpb191bnJlZ2lzdGVyX2RyaXZlcigmdmV0aF9kcml2ZXIpOworCisJZm9yIChpID0gMDsgaSA8IEhWTUFYQVJDSElURUNURURMUFM7ICsraSkKKwkJdmV0aF9zdG9wX2Nvbm5lY3Rpb24oaSk7CisKKwlIdkxwRXZlbnRfdW5yZWdpc3RlckhhbmRsZXIoSHZMcEV2ZW50X1R5cGVfVmlydHVhbExhbik7CisKKwkvKiBIeXBlcnZpc29yIGNhbGxiYWNrcyBtYXkgaGF2ZSBzY2hlZHVsZWQgbW9yZSB3b3JrIHdoaWxlIHdlCisJICogd2VyZSBkZXN0cm95aW5nIGNvbm5lY3Rpb25zLiBOb3cgdGhhdCB3ZSd2ZSBkaXNjb25uZWN0ZWQgZnJvbQorCSAqIHRoZSBoeXBlcnZpc29yIG1ha2Ugc3VyZSBldmVyeXRoaW5nJ3MgZmluaXNoZWQuICovCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCWZvciAoaSA9IDA7IGkgPCBIVk1BWEFSQ0hJVEVDVEVETFBTOyArK2kpCisJCXZldGhfZGVzdHJveV9jb25uZWN0aW9uKGkpOworCit9Cittb2R1bGVfZXhpdCh2ZXRoX21vZHVsZV9jbGVhbnVwKTsKKworaW50IF9faW5pdCB2ZXRoX21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IGk7CisJaW50IHJjOworCisJdGhpc19scCA9IEh2THBDb25maWdfZ2V0THBJbmRleF9vdXRsaW5lKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSFZNQVhBUkNISVRFQ1RFRExQUzsgKytpKSB7CisJCXJjID0gdmV0aF9pbml0X2Nvbm5lY3Rpb24oaSk7CisJCWlmIChyYyAhPSAwKSB7CisJCQl2ZXRoX21vZHVsZV9jbGVhbnVwKCk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwlIdkxwRXZlbnRfcmVnaXN0ZXJIYW5kbGVyKEh2THBFdmVudF9UeXBlX1ZpcnR1YWxMYW4sCisJCQkJICAmdmV0aF9oYW5kbGVfZXZlbnQpOworCisJcmV0dXJuIHZpb19yZWdpc3Rlcl9kcml2ZXIoJnZldGhfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHZldGhfbW9kdWxlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmggYi9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTM3MGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmgKQEAgLTAsMCArMSw0NiBAQAorLyogRmlsZSB2ZXRoLmggY3JlYXRlZCBieSBLeWxlIEEuIEx1Y2tlIG9uIE1vbiBBdWcgIDcgMjAwMC4gKi8KKworI2lmbmRlZiBfSVNFUklFU19WRVRIX0gKKyNkZWZpbmUgX0lTRVJJRVNfVkVUSF9ICisKKyNkZWZpbmUgVmV0aEV2ZW50VHlwZUNhcAkoMCkKKyNkZWZpbmUgVmV0aEV2ZW50VHlwZUZyYW1lcwkoMSkKKyNkZWZpbmUgVmV0aEV2ZW50VHlwZU1vbml0b3IJKDIpCisjZGVmaW5lIFZldGhFdmVudFR5cGVGcmFtZXNBY2sJKDMpCisKKyNkZWZpbmUgVkVUSF9NQVhfQUNLU19QRVJfTVNHCSgyMCkKKyNkZWZpbmUgVkVUSF9NQVhfRlJBTUVTX1BFUl9NU0cJKDYpCisKK3N0cnVjdCBWZXRoRnJhbWVzRGF0YSB7CisJdTMyIGFkZHJbVkVUSF9NQVhfRlJBTUVTX1BFUl9NU0ddOworCXUxNiBsZW5bVkVUSF9NQVhfRlJBTUVTX1BFUl9NU0ddOworCXUzMiBlb2ZtYXNrOworfTsKKyNkZWZpbmUgVkVUSF9FT0ZfU0hJRlQJCSgzMi1WRVRIX01BWF9GUkFNRVNfUEVSX01TRykKKworc3RydWN0IFZldGhGcmFtZXNBY2tEYXRhIHsKKwl1MTYgdG9rZW5bVkVUSF9NQVhfQUNLU19QRVJfTVNHXTsKK307CisKK3N0cnVjdCBWZXRoQ2FwRGF0YSB7CisJdTggY2Fwc192ZXJzaW9uOworCXU4IHJzdmQxOworCXUxNiBudW1fYnVmZmVyczsKKwl1MTYgYWNrX3RocmVzaG9sZDsKKwl1MTYgcnN2ZDI7CisJdTMyIGFja190aW1lb3V0OworCXUzMiByc3ZkMzsKKwl1NjQgcnN2ZDRbM107Cit9OworCitzdHJ1Y3QgVmV0aExwRXZlbnQgeworCXN0cnVjdCBIdkxwRXZlbnQgYmFzZV9ldmVudDsKKwl1bmlvbiB7CisJCXN0cnVjdCBWZXRoQ2FwRGF0YSBjYXBzX2RhdGE7CisJCXN0cnVjdCBWZXRoRnJhbWVzRGF0YSBmcmFtZXNfZGF0YTsKKwkJc3RydWN0IFZldGhGcmFtZXNBY2tEYXRhIGZyYW1lc19hY2tfZGF0YTsKKwl9IHU7CisKK307CisKKyNlbmRpZgkvKiBfSVNFUklFU19WRVRIX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2IvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9peGdiL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjN2FmZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9peGdiL01ha2VmaWxlCkBAIC0wLDAgKzEsMzUgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIAorIyBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDIgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIAorIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCAKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgCisjIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgCisjIGFueSBsYXRlciB2ZXJzaW9uLgorIyAKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIAorIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgCisjIG1vcmUgZGV0YWlscy4KKyMgCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyMgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IAorIyBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyMgCisjIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorIyBmaWxlIGNhbGxlZCBMSUNFTlNFLgorIyAKKyMgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyMgTGludXggTklDUyA8bGludXgubmljc0BpbnRlbC5jb20+CisjIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBJbnRlbChSKSBQUk8vMTBHYkUgZHJpdmVyCisjCisKK29iai0kKENPTkZJR19JWEdCKSArPSBpeGdiLm8KKworaXhnYi1vYmpzIDo9IGl4Z2JfbWFpbi5vIGl4Z2JfaHcubyBpeGdiX2VlLm8gaXhnYl9ldGh0b29sLm8gaXhnYl9wYXJhbS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiL2l4Z2IuaCBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YzRmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2IuaApAQCAtMCwwICsxLDIwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAKKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA1IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIAorICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAorICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCAKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIAorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIAorICBtb3JlIGRldGFpbHMuCisgIAorICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSAKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgIAorICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAgCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0lYR0JfSF8KKyNkZWZpbmUgX0lYR0JfSF8KKworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2lmZGVmIE5FVElGX0ZfVFNPCisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisKKyNkZWZpbmUgQkFSXzAJCTAKKyNkZWZpbmUgQkFSXzEJCTEKKyNkZWZpbmUgQkFSXzUJCTUKKworc3RydWN0IGl4Z2JfYWRhcHRlcjsKKyNpbmNsdWRlICJpeGdiX2h3LmgiCisjaW5jbHVkZSAiaXhnYl9lZS5oIgorI2luY2x1ZGUgIml4Z2JfaWRzLmgiCisKKyNpZmRlZiBfREVCVUdfRFJJVkVSXworI2RlZmluZSBJWEdCX0RCRyhhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyAiaXhnYjogIiBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgSVhHQl9EQkcoYXJncy4uLikKKyNlbmRpZgorCisjZGVmaW5lIElYR0JfRVJSKGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiAiaXhnYjogIiBhcmdzKQorCisvKiBUWC9SWCBkZXNjcmlwdG9yIGRlZmluZXMgKi8KKyNkZWZpbmUgREVGQVVMVF9UWEQJIDI1NgorI2RlZmluZSBNQVhfVFhEICAgCTQwOTYKKyNkZWZpbmUgTUlOX1RYRAkgIDY0CisKKy8qIGhhcmR3YXJlIGNhbm5vdCByZWxpYWJseSBzdXBwb3J0IG1vcmUgdGhhbiA1MTIgZGVzY3JpcHRvcnMgb3duZWQgYnkKKyAqIGhhcmR3YXJlIGRlc2NyaW9wdG9yIGNhY2hlIG90aGVyd2lzZSBhbiB1bnJlbGlhYmxlIHJpbmcgdW5kZXIgaGVhdnkgCisgKiByZWNpZXZlIGxvYWQgbWF5IHJlc3VsdCAqLworLyogI2RlZmluZSBERUZBVUxUX1JYRAkgICAxMDI0ICovCisvKiAjZGVmaW5lIE1BWF9SWEQJICAgNDA5NiAqLworI2RlZmluZSBERUZBVUxUX1JYRAk1MTIKKyNkZWZpbmUgTUFYX1JYRAk1MTIKKyNkZWZpbmUgTUlOX1JYRAkgNjQKKworLyogU3VwcG9ydGVkIFJ4IEJ1ZmZlciBTaXplcyAqLworI2RlZmluZSBJWEdCX1JYQlVGRkVSXzIwNDggIDIwNDgKKyNkZWZpbmUgSVhHQl9SWEJVRkZFUl80MDk2ICA0MDk2CisjZGVmaW5lIElYR0JfUlhCVUZGRVJfODE5MiAgODE5MgorI2RlZmluZSBJWEdCX1JYQlVGRkVSXzE2Mzg0IDE2Mzg0CisKKy8qIEhvdyBtYW55IFR4IERlc2NyaXB0b3JzIGRvIHdlIG5lZWQgdG8gY2FsbCBuZXRpZl93YWtlX3F1ZXVlPyAqLworI2RlZmluZSBJWEdCX1RYX1FVRVVFX1dBS0UgMTYKKworLyogSG93IG1hbnkgUnggQnVmZmVycyBkbyB3ZSBidW5kbGUgaW50byBvbmUgd3JpdGUgdG8gdGhlIGhhcmR3YXJlID8gKi8KKyNkZWZpbmUgSVhHQl9SWF9CVUZGRVJfV1JJVEUJMTYJLyogTXVzdCBiZSBwb3dlciBvZiAyICovCisKKy8qIG9ubHkgd29ya3MgZm9yIHNpemVzIHRoYXQgYXJlIHBvd2VycyBvZiAyICovCisjZGVmaW5lIElYR0JfUk9VTkRVUChpLCBzaXplKSAoKGkpID0gKCgoaSkgKyAoc2l6ZSkgLSAxKSAmIH4oKHNpemUpIC0gMSkpKQorCisvKiB3cmFwcGVyIGFyb3VuZCBhIHBvaW50ZXIgdG8gYSBzb2NrZXQgYnVmZmVyLAorICogc28gYSBETUEgaGFuZGxlIGNhbiBiZSBzdG9yZWQgYWxvbmcgd2l0aCB0aGUgYnVmZmVyICovCitzdHJ1Y3QgaXhnYl9idWZmZXIgeworCXN0cnVjdCBza19idWZmICpza2I7CisJdWludDY0X3QgZG1hOworCXVuc2lnbmVkIGxvbmcgdGltZV9zdGFtcDsKKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDE2X3QgbmV4dF90b193YXRjaDsKK307CisKK3N0cnVjdCBpeGdiX2Rlc2NfcmluZyB7CisJLyogcG9pbnRlciB0byB0aGUgZGVzY3JpcHRvciByaW5nIG1lbW9yeSAqLworCXZvaWQgKmRlc2M7CisJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgZGVzY3JpcHRvciByaW5nICovCisJZG1hX2FkZHJfdCBkbWE7CisJLyogbGVuZ3RoIG9mIGRlc2NyaXB0b3IgcmluZyBpbiBieXRlcyAqLworCXVuc2lnbmVkIGludCBzaXplOworCS8qIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiB0aGUgcmluZyAqLworCXVuc2lnbmVkIGludCBjb3VudDsKKwkvKiBuZXh0IGRlc2NyaXB0b3IgdG8gYXNzb2NpYXRlIGEgYnVmZmVyIHdpdGggKi8KKwl1bnNpZ25lZCBpbnQgbmV4dF90b191c2U7CisJLyogbmV4dCBkZXNjcmlwdG9yIHRvIGNoZWNrIGZvciBERCBzdGF0dXMgYml0ICovCisJdW5zaWduZWQgaW50IG5leHRfdG9fY2xlYW47CisJLyogYXJyYXkgb2YgYnVmZmVyIGluZm9ybWF0aW9uIHN0cnVjdHMgKi8KKwlzdHJ1Y3QgaXhnYl9idWZmZXIgKmJ1ZmZlcl9pbmZvOworfTsKKworI2RlZmluZSBJWEdCX0RFU0NfVU5VU0VEKFIpIFwKKwkoKCgoUiktPm5leHRfdG9fY2xlYW4gPiAoUiktPm5leHRfdG9fdXNlKSA/IDAgOiAoUiktPmNvdW50KSArIFwKKwkoUiktPm5leHRfdG9fY2xlYW4gLSAoUiktPm5leHRfdG9fdXNlIC0gMSkKKworI2RlZmluZSBJWEdCX0dFVF9ERVNDKFIsIGksIHR5cGUpCSgmKCgoc3RydWN0IHR5cGUgKikoKFIpLmRlc2MpKVtpXSkpCisjZGVmaW5lIElYR0JfUlhfREVTQyhSLCBpKQkJSVhHQl9HRVRfREVTQyhSLCBpLCBpeGdiX3J4X2Rlc2MpCisjZGVmaW5lIElYR0JfVFhfREVTQyhSLCBpKQkJSVhHQl9HRVRfREVTQyhSLCBpLCBpeGdiX3R4X2Rlc2MpCisjZGVmaW5lIElYR0JfQ09OVEVYVF9ERVNDKFIsIGkpCUlYR0JfR0VUX0RFU0MoUiwgaSwgaXhnYl9jb250ZXh0X2Rlc2MpCisKKy8qIGJvYXJkIHNwZWNpZmljIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IGl4Z2JfYWRhcHRlciB7CisJc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hkb2dfdGltZXI7CisJc3RydWN0IHZsYW5fZ3JvdXAgKnZsZ3JwOworCXVpbnQzMl90IGJkX251bWJlcjsKKwl1aW50MzJfdCByeF9idWZmZXJfbGVuOworCXVpbnQzMl90IHBhcnRfbnVtOworCXVpbnQxNl90IGxpbmtfc3BlZWQ7CisJdWludDE2X3QgbGlua19kdXBsZXg7CisJc3BpbmxvY2tfdCB0eF9sb2NrOworCWF0b21pY190IGlycV9zZW07CisJc3RydWN0IHdvcmtfc3RydWN0IHR4X3RpbWVvdXRfdGFzazsKKworCXN0cnVjdCB0aW1lcl9saXN0IGJsaW5rX3RpbWVyOworCXVuc2lnbmVkIGxvbmcgbGVkX3N0YXR1czsKKworCS8qIFRYICovCisJc3RydWN0IGl4Z2JfZGVzY19yaW5nIHR4X3Jpbmc7CisJdW5zaWduZWQgbG9uZyB0aW1lb19zdGFydDsKKwl1aW50MzJfdCB0eF9jbWRfdHlwZTsKKwl1aW50NjRfdCBod19jc3VtX3R4X2dvb2Q7CisJdWludDY0X3QgaHdfY3N1bV90eF9lcnJvcjsKKwl1aW50MzJfdCB0eF9pbnRfZGVsYXk7CisJYm9vbGVhbl90IHR4X2ludF9kZWxheV9lbmFibGU7CisJYm9vbGVhbl90IGRldGVjdF90eF9odW5nOworCisJLyogUlggKi8KKwlzdHJ1Y3QgaXhnYl9kZXNjX3JpbmcgcnhfcmluZzsKKwl1aW50NjRfdCBod19jc3VtX3J4X2Vycm9yOworCXVpbnQ2NF90IGh3X2NzdW1fcnhfZ29vZDsKKwl1aW50MzJfdCByeF9pbnRfZGVsYXk7CisJYm9vbGVhbl90IHJ4X2NzdW07CisKKwkvKiBPUyBkZWZpbmVkIHN0cnVjdHMgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsKKworCS8qIHN0cnVjdHMgZGVmaW5lZCBpbiBpeGdiX2h3LmggKi8KKwlzdHJ1Y3QgaXhnYl9odyBodzsKKwlzdHJ1Y3QgaXhnYl9od19zdGF0cyBzdGF0czsKKyNpZmRlZiBDT05GSUdfUENJX01TSQorCWJvb2xlYW5fdCBoYXZlX21zaTsKKyNlbmRpZgorfTsKKyNlbmRpZiAvKiBfSVhHQl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYi9peGdiX2VlLmMgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2JfZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTNlOTlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX2VlLmMKQEAgLTAsMCArMSw3NzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IAorICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSAKKyAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSAKKyAgYW55IGxhdGVyIHZlcnNpb24uCisgIAorICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciAKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciAKKyAgbW9yZSBkZXRhaWxzLgorICAKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgCisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICAKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgIAorICBDb250YWN0IEluZm9ybWF0aW9uOgorICBMaW51eCBOSUNTIDxsaW51eC5uaWNzQGludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiaXhnYl9ody5oIgorI2luY2x1ZGUgIml4Z2JfZWUuaCIKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB1aW50MTZfdCBpeGdiX3NoaWZ0X2luX2JpdHMoc3RydWN0IGl4Z2JfaHcgKmh3KTsKKworc3RhdGljIHZvaWQgaXhnYl9zaGlmdF9vdXRfYml0cyhzdHJ1Y3QgaXhnYl9odyAqaHcsCisJCQkJdWludDE2X3QgZGF0YSwKKwkJCQl1aW50MTZfdCBjb3VudCk7CitzdGF0aWMgdm9pZCBpeGdiX3N0YW5kYnlfZWVwcm9tKHN0cnVjdCBpeGdiX2h3ICpodyk7CisKK3N0YXRpYyBib29sZWFuX3QgaXhnYl93YWl0X2VlcHJvbV9jb21tYW5kKHN0cnVjdCBpeGdiX2h3ICpodyk7CisKK3N0YXRpYyB2b2lkIGl4Z2JfY2xlYW51cF9lZXByb20oc3RydWN0IGl4Z2JfaHcgKmh3KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFpc2VzIHRoZSBFRVBST00ncyBjbG9jayBpbnB1dC4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogZWVjZF9yZWcgLSBFRUNEJ3MgY3VycmVudCB2YWx1ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2l4Z2JfcmFpc2VfY2xvY2soc3RydWN0IGl4Z2JfaHcgKmh3LAorCQkgIHVpbnQzMl90ICplZWNkX3JlZykKK3sKKwkvKiBSYWlzZSB0aGUgY2xvY2sgaW5wdXQgdG8gdGhlIEVFUFJPTSAoYnkgc2V0dGluZyB0aGUgU0sgYml0KSwgYW5kIHRoZW4KKwkgKiAgd2FpdCA1MCBtaWNyb3NlY29uZHMuCisJICovCisJKmVlY2RfcmVnID0gKmVlY2RfcmVnIHwgSVhHQl9FRUNEX1NLOworCUlYR0JfV1JJVEVfUkVHKGh3LCBFRUNELCAqZWVjZF9yZWcpOworCXVkZWxheSg1MCk7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMb3dlcnMgdGhlIEVFUFJPTSdzIGNsb2NrIGlucHV0LgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBlZWNkX3JlZyAtIEVFQ0QncyBjdXJyZW50IHZhbHVlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXhnYl9sb3dlcl9jbG9jayhzdHJ1Y3QgaXhnYl9odyAqaHcsCisJCSAgdWludDMyX3QgKmVlY2RfcmVnKQoreworCS8qIExvd2VyIHRoZSBjbG9jayBpbnB1dCB0byB0aGUgRUVQUk9NIChieSBjbGVhcmluZyB0aGUgU0sgYml0KSwgYW5kIHRoZW4KKwkgKiB3YWl0IDUwIG1pY3Jvc2Vjb25kcy4KKwkgKi8KKwkqZWVjZF9yZWcgPSAqZWVjZF9yZWcgJiB+SVhHQl9FRUNEX1NLOworCUlYR0JfV1JJVEVfUkVHKGh3LCBFRUNELCAqZWVjZF9yZWcpOworCXVkZWxheSg1MCk7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTaGlmdCBkYXRhIGJpdHMgb3V0IHRvIHRoZSBFRVBST00uCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIGRhdGEgLSBkYXRhIHRvIHNlbmQgdG8gdGhlIEVFUFJPTQorICogY291bnQgLSBudW1iZXIgb2YgYml0cyB0byBzaGlmdCBvdXQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpeGdiX3NoaWZ0X291dF9iaXRzKHN0cnVjdCBpeGdiX2h3ICpodywKKwkJCQkJIHVpbnQxNl90IGRhdGEsCisJCQkJCSB1aW50MTZfdCBjb3VudCkKK3sKKwl1aW50MzJfdCBlZWNkX3JlZzsKKwl1aW50MzJfdCBtYXNrOworCisJLyogV2UgbmVlZCB0byBzaGlmdCAiY291bnQiIGJpdHMgb3V0IHRvIHRoZSBFRVBST00uIFNvLCB2YWx1ZSBpbiB0aGUKKwkgKiAiZGF0YSIgcGFyYW1ldGVyIHdpbGwgYmUgc2hpZnRlZCBvdXQgdG8gdGhlIEVFUFJPTSBvbmUgYml0IGF0IGEgdGltZS4KKwkgKiBJbiBvcmRlciB0byBkbyB0aGlzLCAiZGF0YSIgbXVzdCBiZSBicm9rZW4gZG93biBpbnRvIGJpdHMuCisJICovCisJbWFzayA9IDB4MDEgPDwgKGNvdW50IC0gMSk7CisJZWVjZF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBFRUNEKTsKKwllZWNkX3JlZyAmPSB+KElYR0JfRUVDRF9ETyB8IElYR0JfRUVDRF9ESSk7CisJZG8geworCQkvKiBBICIxIiBpcyBzaGlmdGVkIG91dCB0byB0aGUgRUVQUk9NIGJ5IHNldHRpbmcgYml0ICJESSIgdG8gYSAiMSIsCisJCSAqIGFuZCB0aGVuIHJhaXNpbmcgYW5kIHRoZW4gbG93ZXJpbmcgdGhlIGNsb2NrICh0aGUgU0sgYml0IGNvbnRyb2xzCisJCSAqIHRoZSBjbG9jayBpbnB1dCB0byB0aGUgRUVQUk9NKS4gIEEgIjAiIGlzIHNoaWZ0ZWQgb3V0IHRvIHRoZSBFRVBST00KKwkJICogYnkgc2V0dGluZyAiREkiIHRvICIwIiBhbmQgdGhlbiByYWlzaW5nIGFuZCB0aGVuIGxvd2VyaW5nIHRoZSBjbG9jay4KKwkJICovCisJCWVlY2RfcmVnICY9IH5JWEdCX0VFQ0RfREk7CisKKwkJaWYoZGF0YSAmIG1hc2spCisJCQllZWNkX3JlZyB8PSBJWEdCX0VFQ0RfREk7CisKKwkJSVhHQl9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2RfcmVnKTsKKworCQl1ZGVsYXkoNTApOworCisJCWl4Z2JfcmFpc2VfY2xvY2soaHcsICZlZWNkX3JlZyk7CisJCWl4Z2JfbG93ZXJfY2xvY2soaHcsICZlZWNkX3JlZyk7CisKKwkJbWFzayA9IG1hc2sgPj4gMTsKKworCX0gd2hpbGUobWFzayk7CisKKwkvKiBXZSBsZWF2ZSB0aGUgIkRJIiBiaXQgc2V0IHRvICIwIiB3aGVuIHdlIGxlYXZlIHRoaXMgcm91dGluZS4gKi8KKwllZWNkX3JlZyAmPSB+SVhHQl9FRUNEX0RJOworCUlYR0JfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkX3JlZyk7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTaGlmdCBkYXRhIGJpdHMgaW4gZnJvbSB0aGUgRUVQUk9NCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1aW50MTZfdAoraXhnYl9zaGlmdF9pbl9iaXRzKHN0cnVjdCBpeGdiX2h3ICpodykKK3sKKwl1aW50MzJfdCBlZWNkX3JlZzsKKwl1aW50MzJfdCBpOworCXVpbnQxNl90IGRhdGE7CisKKwkvKiBJbiBvcmRlciB0byByZWFkIGEgcmVnaXN0ZXIgZnJvbSB0aGUgRUVQUk9NLCB3ZSBuZWVkIHRvIHNoaWZ0IDE2IGJpdHMKKwkgKiBpbiBmcm9tIHRoZSBFRVBST00uIEJpdHMgYXJlICJzaGlmdGVkIGluIiBieSByYWlzaW5nIHRoZSBjbG9jayBpbnB1dCB0bworCSAqIHRoZSBFRVBST00gKHNldHRpbmcgdGhlIFNLIGJpdCksIGFuZCB0aGVuIHJlYWRpbmcgdGhlIHZhbHVlIG9mIHRoZSAiRE8iCisJICogYml0LiAgRHVyaW5nIHRoaXMgInNoaWZ0aW5nIGluIiBwcm9jZXNzIHRoZSAiREkiIGJpdCBzaG91bGQgYWx3YXlzIGJlCisJICogY2xlYXIuLgorCSAqLworCisJZWVjZF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBFRUNEKTsKKworCWVlY2RfcmVnICY9IH4oSVhHQl9FRUNEX0RPIHwgSVhHQl9FRUNEX0RJKTsKKwlkYXRhID0gMDsKKworCWZvcihpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJZGF0YSA9IGRhdGEgPDwgMTsKKwkJaXhnYl9yYWlzZV9jbG9jayhodywgJmVlY2RfcmVnKTsKKworCQllZWNkX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIEVFQ0QpOworCisJCWVlY2RfcmVnICY9IH4oSVhHQl9FRUNEX0RJKTsKKwkJaWYoZWVjZF9yZWcgJiBJWEdCX0VFQ0RfRE8pCisJCQlkYXRhIHw9IDE7CisKKwkJaXhnYl9sb3dlcl9jbG9jayhodywgJmVlY2RfcmVnKTsKKwl9CisKKwlyZXR1cm4gZGF0YTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUHJlcGFyZXMgRUVQUk9NIGZvciBhY2Nlc3MKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIExvd2VycyBFRVBST00gY2xvY2suIENsZWFycyBpbnB1dCBwaW4uIFNldHMgdGhlIGNoaXAgc2VsZWN0IHBpbi4gVGhpcworICogZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgaXNzdWluZyBhIGNvbW1hbmQgdG8gdGhlIEVFUFJPTS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpeGdiX3NldHVwX2VlcHJvbShzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJdWludDMyX3QgZWVjZF9yZWc7CisKKwllZWNkX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIEVFQ0QpOworCisJLyogIENsZWFyIFNLIGFuZCBESSAgKi8KKwllZWNkX3JlZyAmPSB+KElYR0JfRUVDRF9TSyB8IElYR0JfRUVDRF9ESSk7CisJSVhHQl9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2RfcmVnKTsKKworCS8qICBTZXQgQ1MgICovCisJZWVjZF9yZWcgfD0gSVhHQl9FRUNEX0NTOworCUlYR0JfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkX3JlZyk7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZXR1cm5zIEVFUFJPTSB0byBhICJzdGFuZGJ5IiBzdGF0ZQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXhnYl9zdGFuZGJ5X2VlcHJvbShzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJdWludDMyX3QgZWVjZF9yZWc7CisKKwllZWNkX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIEVFQ0QpOworCisJLyogIERlc2VsY3QgRUVQUk9NICAqLworCWVlY2RfcmVnICY9IH4oSVhHQl9FRUNEX0NTIHwgSVhHQl9FRUNEX1NLKTsKKwlJWEdCX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZF9yZWcpOworCXVkZWxheSg1MCk7CisKKwkvKiAgQ2xvY2sgaGlnaCAgKi8KKwllZWNkX3JlZyB8PSBJWEdCX0VFQ0RfU0s7CisJSVhHQl9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2RfcmVnKTsKKwl1ZGVsYXkoNTApOworCisJLyogIFNlbGVjdCBFRVBST00gICovCisJZWVjZF9yZWcgfD0gSVhHQl9FRUNEX0NTOworCUlYR0JfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkX3JlZyk7CisJdWRlbGF5KDUwKTsKKworCS8qICBDbG9jayBsb3cgICovCisJZWVjZF9yZWcgJj0gfklYR0JfRUVDRF9TSzsKKwlJWEdCX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZF9yZWcpOworCXVkZWxheSg1MCk7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWlzZXMgdGhlbiBsb3dlcnMgdGhlIEVFUFJPTSdzIGNsb2NrIHBpbgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXhnYl9jbG9ja19lZXByb20oc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXVpbnQzMl90IGVlY2RfcmVnOworCisJZWVjZF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBFRUNEKTsKKworCS8qICBSaXNpbmcgZWRnZSBvZiBjbG9jayAgKi8KKwllZWNkX3JlZyB8PSBJWEdCX0VFQ0RfU0s7CisJSVhHQl9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2RfcmVnKTsKKwl1ZGVsYXkoNTApOworCisJLyogIEZhbGxpbmcgZWRnZSBvZiBjbG9jayAgKi8KKwllZWNkX3JlZyAmPSB+SVhHQl9FRUNEX1NLOworCUlYR0JfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkX3JlZyk7CisJdWRlbGF5KDUwKTsKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlcm1pbmF0ZXMgYSBjb21tYW5kIGJ5IGxvd2VyaW5nIHRoZSBFRVBST00ncyBjaGlwIHNlbGVjdCBwaW4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2l4Z2JfY2xlYW51cF9lZXByb20oc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXVpbnQzMl90IGVlY2RfcmVnOworCisJZWVjZF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBFRUNEKTsKKworCWVlY2RfcmVnICY9IH4oSVhHQl9FRUNEX0NTIHwgSVhHQl9FRUNEX0RJKTsKKworCUlYR0JfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkX3JlZyk7CisKKwlpeGdiX2Nsb2NrX2VlcHJvbShodyk7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBXYWl0cyBmb3IgdGhlIEVFUFJPTSB0byBmaW5pc2ggdGhlIGN1cnJlbnQgY29tbWFuZC4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFRoZSBjb21tYW5kIGlzIGRvbmUgd2hlbiB0aGUgRUVQUk9NJ3MgZGF0YSBvdXQgcGluIGdvZXMgaGlnaC4KKyAqCisgKiBSZXR1cm5zOgorICogICAgICBUUlVFOiBFRVBST00gZGF0YSBwaW4gaXMgaGlnaCBiZWZvcmUgdGltZW91dC4KKyAqICAgICAgRkFMU0U6ICBUaW1lIGV4cGlyZWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYm9vbGVhbl90CitpeGdiX3dhaXRfZWVwcm9tX2NvbW1hbmQoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXVpbnQzMl90IGVlY2RfcmVnOworCXVpbnQzMl90IGk7CisKKwkvKiBUb2dnbGUgdGhlIENTIGxpbmUuICBUaGlzIGluIGVmZmVjdCB0ZWxscyB0byBFRVBST00gdG8gYWN0dWFsbHkgZXhlY3V0ZQorCSAqIHRoZSBjb21tYW5kIGluIHF1ZXN0aW9uLgorCSAqLworCWl4Z2Jfc3RhbmRieV9lZXByb20oaHcpOworCisJLyogTm93IHJlYWQgRE8gcmVwZWF0ZWRseSB1bnRpbCBpcyBoaWdoIChlcXVhbCB0byAnMScpLiAgVGhlIEVFRVBST00gd2lsbAorCSAqIHNpZ25hbCB0aGF0IHRoZSBjb21tYW5kIGhhcyBiZWVuIGNvbXBsZXRlZCBieSByYWlzaW5nIHRoZSBETyBzaWduYWwuCisJICogSWYgRE8gZG9lcyBub3QgZ28gaGlnaCBpbiAxMCBtaWxsaXNlY29uZHMsIHRoZW4gZXJyb3Igb3V0LgorCSAqLworCWZvcihpID0gMDsgaSA8IDIwMDsgaSsrKSB7CisJCWVlY2RfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgRUVDRCk7CisKKwkJaWYoZWVjZF9yZWcgJiBJWEdCX0VFQ0RfRE8pCisJCQlyZXR1cm4gKFRSVUUpOworCisJCXVkZWxheSg1MCk7CisJfQorCUFTU0VSVCgwKTsKKwlyZXR1cm4gKEZBTFNFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmVyaWZpZXMgdGhhdCB0aGUgRUVQUk9NIGhhcyBhIHZhbGlkIGNoZWNrc3VtCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBSZWFkcyB0aGUgZmlyc3QgNjQgMTYgYml0IHdvcmRzIG9mIHRoZSBFRVBST00gYW5kIHN1bXMgdGhlIHZhbHVlcyByZWFkLgorICogSWYgdGhlIHRoZSBzdW0gb2YgdGhlIDY0IDE2IGJpdCB3b3JkcyBpcyAweEJBQkEsIHRoZSBFRVBST00ncyBjaGVja3N1bSBpcworICogdmFsaWQuCisgKgorICogUmV0dXJuczoKKyAqICBUUlVFOiBDaGVja3N1bSBpcyB2YWxpZAorICogIEZBTFNFOiBDaGVja3N1bSBpcyBub3QgdmFsaWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sZWFuX3QKK2l4Z2JfdmFsaWRhdGVfZWVwcm9tX2NoZWNrc3VtKHN0cnVjdCBpeGdiX2h3ICpodykKK3sKKwl1aW50MTZfdCBjaGVja3N1bSA9IDA7CisJdWludDE2X3QgaTsKKworCWZvcihpID0gMDsgaSA8IChFRVBST01fQ0hFQ0tTVU1fUkVHICsgMSk7IGkrKykKKwkJY2hlY2tzdW0gKz0gaXhnYl9yZWFkX2VlcHJvbShodywgaSk7CisKKwlpZihjaGVja3N1bSA9PSAodWludDE2X3QpIEVFUFJPTV9TVU0pCisJCXJldHVybiAoVFJVRSk7CisJZWxzZQorCQlyZXR1cm4gKEZBTFNFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2FsY3VsYXRlcyB0aGUgRUVQUk9NIGNoZWNrc3VtIGFuZCB3cml0ZXMgaXQgdG8gdGhlIEVFUFJPTQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogU3VtcyB0aGUgZmlyc3QgNjMgMTYgYml0IHdvcmRzIG9mIHRoZSBFRVBST00uIFN1YnRyYWN0cyB0aGUgc3VtIGZyb20gMHhCQUJBLgorICogV3JpdGVzIHRoZSBkaWZmZXJlbmNlIHRvIHdvcmQgb2Zmc2V0IDYzIG9mIHRoZSBFRVBST00uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitpeGdiX3VwZGF0ZV9lZXByb21fY2hlY2tzdW0oc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXVpbnQxNl90IGNoZWNrc3VtID0gMDsKKwl1aW50MTZfdCBpOworCisJZm9yKGkgPSAwOyBpIDwgRUVQUk9NX0NIRUNLU1VNX1JFRzsgaSsrKQorCQljaGVja3N1bSArPSBpeGdiX3JlYWRfZWVwcm9tKGh3LCBpKTsKKworCWNoZWNrc3VtID0gKHVpbnQxNl90KSBFRVBST01fU1VNIC0gY2hlY2tzdW07CisKKwlpeGdiX3dyaXRlX2VlcHJvbShodywgRUVQUk9NX0NIRUNLU1VNX1JFRywgY2hlY2tzdW0pOworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV3JpdGVzIGEgMTYgYml0IHdvcmQgdG8gYSBnaXZlbiBvZmZzZXQgaW4gdGhlIEVFUFJPTS4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogcmVnIC0gb2Zmc2V0IHdpdGhpbiB0aGUgRUVQUk9NIHRvIGJlIHdyaXR0ZW4gdG8KKyAqIGRhdGEgLSAxNiBiaXQgd29yZCB0byBiZSB3cml0ZW4gdG8gdGhlIEVFUFJPTQorICoKKyAqIElmIGl4Z2JfdXBkYXRlX2VlcHJvbV9jaGVja3N1bSBpcyBub3QgY2FsbGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24sIHRoZQorICogRUVQUk9NIHdpbGwgbW9zdCBsaWtlbHkgY29udGFpbiBhbiBpbnZhbGlkIGNoZWNrc3VtLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2l4Z2Jfd3JpdGVfZWVwcm9tKHN0cnVjdCBpeGdiX2h3ICpodywgdWludDE2X3Qgb2Zmc2V0LCB1aW50MTZfdCBkYXRhKQoreworCXN0cnVjdCBpeGdiX2VlX21hcF90eXBlICplZV9tYXAgPSAoc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKilody0+ZWVwcm9tOworCisJLyogUHJlcGFyZSB0aGUgRUVQUk9NIGZvciB3cml0aW5nICovCisJaXhnYl9zZXR1cF9lZXByb20oaHcpOworCisJLyogIFNlbmQgdGhlIDktYml0IEVXRU4gKHdyaXRlIGVuYWJsZSkgY29tbWFuZCB0byB0aGUgRUVQUk9NICg1LWJpdCBvcGNvZGUKKwkgKiAgcGx1cyA0LWJpdCBkdW1teSkuICBUaGlzIHB1dHMgdGhlIEVFUFJPTSBpbnRvIHdyaXRlL2VyYXNlIG1vZGUuCisJICovCisJaXhnYl9zaGlmdF9vdXRfYml0cyhodywgRUVQUk9NX0VXRU5fT1BDT0RFLCA1KTsKKwlpeGdiX3NoaWZ0X291dF9iaXRzKGh3LCAwLCA0KTsKKworCS8qICBQcmVwYXJlIHRoZSBFRVBST00gICovCisJaXhnYl9zdGFuZGJ5X2VlcHJvbShodyk7CisKKwkvKiAgU2VuZCB0aGUgV3JpdGUgY29tbWFuZCAoMy1iaXQgb3Bjb2RlICsgNi1iaXQgYWRkcikgICovCisJaXhnYl9zaGlmdF9vdXRfYml0cyhodywgRUVQUk9NX1dSSVRFX09QQ09ERSwgMyk7CisJaXhnYl9zaGlmdF9vdXRfYml0cyhodywgb2Zmc2V0LCA2KTsKKworCS8qICBTZW5kIHRoZSBkYXRhICAqLworCWl4Z2Jfc2hpZnRfb3V0X2JpdHMoaHcsIGRhdGEsIDE2KTsKKworCWl4Z2Jfd2FpdF9lZXByb21fY29tbWFuZChodyk7CisKKwkvKiAgUmVjb3ZlciBmcm9tIHdyaXRlICAqLworCWl4Z2Jfc3RhbmRieV9lZXByb20oaHcpOworCisJLyogU2VuZCB0aGUgOS1iaXQgRVdEUyAod3JpdGUgZGlzYWJsZSkgY29tbWFuZCB0byB0aGUgRUVQUk9NICg1LWJpdAorCSAqIG9wY29kZSBwbHVzIDQtYml0IGR1bW15KS4gIFRoaXMgdGFrZXMgdGhlIEVFUFJPTSBvdXQgb2Ygd3JpdGUvZXJhc2UKKwkgKiBtb2RlLgorCSAqLworCWl4Z2Jfc2hpZnRfb3V0X2JpdHMoaHcsIEVFUFJPTV9FV0RTX09QQ09ERSwgNSk7CisJaXhnYl9zaGlmdF9vdXRfYml0cyhodywgMCwgNCk7CisKKwkvKiAgRG9uZSB3aXRoIHdyaXRpbmcgICovCisJaXhnYl9jbGVhbnVwX2VlcHJvbShodyk7CisKKwkvKiBjbGVhciB0aGUgaW5pdF9jdHJsX3JlZ18xIHRvIHNpZ25pZnkgdGhhdCB0aGUgY2FjaGUgaXMgaW52YWxpZGF0ZWQgKi8KKwllZV9tYXAtPmluaXRfY3RybF9yZWdfMSA9IEVFUFJPTV9JQ1cxX1NJR05BVFVSRV9DTEVBUjsKKworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVhZHMgYSAxNiBiaXQgd29yZCBmcm9tIHRoZSBFRVBST00uCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIG9mZnNldCAtIG9mZnNldCBvZiAxNiBiaXQgd29yZCBpbiB0aGUgRUVQUk9NIHRvIHJlYWQKKyAqCisgKiBSZXR1cm5zOgorICogIFRoZSAxNi1iaXQgdmFsdWUgcmVhZCBmcm9tIHRoZSBlZXByb20KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQxNl90CitpeGdiX3JlYWRfZWVwcm9tKHN0cnVjdCBpeGdiX2h3ICpodywKKwkJICB1aW50MTZfdCBvZmZzZXQpCit7CisJdWludDE2X3QgZGF0YTsKKworCS8qICBQcmVwYXJlIHRoZSBFRVBST00gZm9yIHJlYWRpbmcgICovCisJaXhnYl9zZXR1cF9lZXByb20oaHcpOworCisJLyogIFNlbmQgdGhlIFJFQUQgY29tbWFuZCAob3Bjb2RlICsgYWRkcikgICovCisJaXhnYl9zaGlmdF9vdXRfYml0cyhodywgRUVQUk9NX1JFQURfT1BDT0RFLCAzKTsKKwkvKgorCSAqIFdlIGhhdmUgYSA2NCB3b3JkIEVFUFJPTSwgdGhlcmUgYXJlIDYgYWRkcmVzcyBiaXRzCisJICovCisJaXhnYl9zaGlmdF9vdXRfYml0cyhodywgb2Zmc2V0LCA2KTsKKworCS8qICBSZWFkIHRoZSBkYXRhICAqLworCWRhdGEgPSBpeGdiX3NoaWZ0X2luX2JpdHMoaHcpOworCisJLyogIEVuZCB0aGlzIHJlYWQgb3BlcmF0aW9uICAqLworCWl4Z2Jfc3RhbmRieV9lZXByb20oaHcpOworCisJcmV0dXJuIChkYXRhKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVhZHMgZWVwcm9tIGFuZCBzdG9yZXMgZGF0YSBpbiBzaGFyZWQgc3RydWN0dXJlLgorICogVmFsaWRhdGVzIGVlcHJvbSBjaGVja3N1bSBhbmQgZWVwcm9tIHNpZ25hdHVyZS4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFJldHVybnM6CisgKiAgICAgIFRSVUU6IGlmIGVlcHJvbSByZWFkIGlzIHN1Y2Nlc3NmdWwKKyAqICAgICAgRkFMU0U6IG90aGVyd2lzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2xlYW5fdAoraXhnYl9nZXRfZWVwcm9tX2RhdGEoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXVpbnQxNl90IGk7CisJdWludDE2X3QgY2hlY2tzdW0gPSAwOworCXN0cnVjdCBpeGdiX2VlX21hcF90eXBlICplZV9tYXA7CisKKwlERUJVR0ZVTkMoIml4Z2JfZ2V0X2VlcHJvbV9kYXRhIik7CisKKwllZV9tYXAgPSAoc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKilody0+ZWVwcm9tOworCisJREVCVUdPVVQoIml4Z2JfZWU6IFJlYWRpbmcgZWVwcm9tIGRhdGFcbiIpOworCWZvcihpID0gMDsgaSA8IElYR0JfRUVQUk9NX1NJWkUgOyBpKyspIHsKKwkJdWludDE2X3QgZWVfZGF0YTsKKwkJZWVfZGF0YSA9IGl4Z2JfcmVhZF9lZXByb20oaHcsIGkpOworCQljaGVja3N1bSArPSBlZV9kYXRhOworCQlody0+ZWVwcm9tW2ldID0gbGUxNl90b19jcHUoZWVfZGF0YSk7CisJfQorCisJaWYgKGNoZWNrc3VtICE9ICh1aW50MTZfdCkgRUVQUk9NX1NVTSkgeworCQlERUJVR09VVCgiaXhnYl9lZTogQ2hlY2tzdW0gaW52YWxpZC5cbiIpOworCQkvKiBjbGVhciB0aGUgaW5pdF9jdHJsX3JlZ18xIHRvIHNpZ25pZnkgdGhhdCB0aGUgY2FjaGUgaXMKKwkJICogaW52YWxpZGF0ZWQgKi8KKwkJZWVfbWFwLT5pbml0X2N0cmxfcmVnXzEgPSBFRVBST01fSUNXMV9TSUdOQVRVUkVfQ0xFQVI7CisJCXJldHVybiAoRkFMU0UpOworCX0KKworCWlmICgoZWVfbWFwLT5pbml0X2N0cmxfcmVnXzEgJiBsZTE2X3RvX2NwdShFRVBST01fSUNXMV9TSUdOQVRVUkVfTUFTSykpCisJCSAhPSBsZTE2X3RvX2NwdShFRVBST01fSUNXMV9TSUdOQVRVUkVfVkFMSUQpKSB7CisJCURFQlVHT1VUKCJpeGdiX2VlOiBTaWduYXR1cmUgaW52YWxpZC5cbiIpOworCQlyZXR1cm4oRkFMU0UpOworCX0KKworCXJldHVybihUUlVFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTG9jYWwgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGVlcHJvbSBzaWduYXR1cmUgaXMgZ29vZAorICogSWYgdGhlIGVlcHJvbSBzaWduYXR1cmUgaXMgZ29vZCwgY2FsbHMgaXhnYilnZXRfZWVwcm9tX2RhdGEuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBSZXR1cm5zOgorICogICAgICBUUlVFOiBlZXByb20gc2lnbmF0dXJlIHdhcyBnb29kIGFuZCB0aGUgZWVwcm9tIHJlYWQgd2FzIHN1Y2Nlc3NmdWwKKyAqICAgICAgRkFMU0U6IG90aGVyd2lzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYm9vbGVhbl90CitpeGdiX2NoZWNrX2FuZF9nZXRfZWVwcm9tX2RhdGEgKHN0cnVjdCBpeGdiX2h3KiBodykKK3sKKwlzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSAqZWVfbWFwID0gKHN0cnVjdCBpeGdiX2VlX21hcF90eXBlICopaHctPmVlcHJvbTsKKworCWlmICgoZWVfbWFwLT5pbml0X2N0cmxfcmVnXzEgJiBsZTE2X3RvX2NwdShFRVBST01fSUNXMV9TSUdOQVRVUkVfTUFTSykpCisJICAgID09IGxlMTZfdG9fY3B1KEVFUFJPTV9JQ1cxX1NJR05BVFVSRV9WQUxJRCkpIHsKKwkJcmV0dXJuIChUUlVFKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gaXhnYl9nZXRfZWVwcm9tX2RhdGEoaHcpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcmV0dXJuIGEgd29yZCBmcm9tIHRoZSBlZXByb20KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogaW5kZXggLSBPZmZzZXQgb2YgZWVwcm9tIHdvcmQKKyAqCisgKiBSZXR1cm5zOgorICogICAgICAgICAgV29yZCBhdCBpbmRleGVkIG9mZnNldCBpbiBlZXByb20sIGlmIHZhbGlkLCAwIG90aGVyd2lzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MTZfdAoraXhnYl9nZXRfZWVwcm9tX3dvcmQoc3RydWN0IGl4Z2JfaHcgKmh3LCB1aW50MTZfdCBpbmRleCkKK3sKKworCWlmICgoaW5kZXggPCBJWEdCX0VFUFJPTV9TSVpFKSAmJgorCQkoaXhnYl9jaGVja19hbmRfZ2V0X2VlcHJvbV9kYXRhKGh3KSA9PSBUUlVFKSkgeworCSAgIHJldHVybihody0+ZWVwcm9tW2luZGV4XSk7CisJfQorCisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiByZXR1cm4gdGhlIG1hYyBhZGRyZXNzIGZyb20gRUVQUk9NCisgKgorICogaHcgICAgICAgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqIG1hY19hZGRyIC0gRXRoZXJuZXQgQWRkcmVzcyBpZiBFRVBST00gY29udGVudHMgYXJlIHZhbGlkLCAwIG90aGVyd2lzZQorICoKKyAqIFJldHVybnM6IE5vbmUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAoraXhnYl9nZXRfZWVfbWFjX2FkZHIoc3RydWN0IGl4Z2JfaHcgKmh3LAorCQkJdWludDhfdCAqbWFjX2FkZHIpCit7CisJaW50IGk7CisJc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKmVlX21hcCA9IChzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSAqKWh3LT5lZXByb207CisKKwlERUJVR0ZVTkMoIml4Z2JfZ2V0X2VlX21hY19hZGRyIik7CisKKwlpZiAoaXhnYl9jaGVja19hbmRfZ2V0X2VlcHJvbV9kYXRhKGh3KSA9PSBUUlVFKSB7CisJCWZvciAoaSA9IDA7IGkgPCBJWEdCX0VUSF9MRU5HVEhfT0ZfQUREUkVTUzsgaSsrKSB7CisJCQltYWNfYWRkcltpXSA9IGVlX21hcC0+bWFjX2FkZHJbaV07CisJCQlERUJVR09VVDIoIm1hYyglZCkgPSAlLjJYXG4iLCBpLCBtYWNfYWRkcltpXSk7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHJldHVybiB0aGUgY29tcGF0aWJpbGl0eSBmbGFncyBmcm9tIEVFUFJPTQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogUmV0dXJuczoKKyAqICAgICAgICAgIGNvbXBhdGliaWxpdHkgZmxhZ3MgaWYgRUVQUk9NIGNvbnRlbnRzIGFyZSB2YWxpZCwgMCBvdGhlcndpc2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MTZfdAoraXhnYl9nZXRfZWVfY29tcGF0aWJpbGl0eShzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKmVlX21hcCA9IChzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSAqKWh3LT5lZXByb207CisKKwlpZihpeGdiX2NoZWNrX2FuZF9nZXRfZWVwcm9tX2RhdGEoaHcpID09IFRSVUUpCisJCXJldHVybihlZV9tYXAtPmNvbXBhdGliaWxpdHkpOworCisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiByZXR1cm4gdGhlIFByaW50ZWQgQm9hcmQgQXNzZW1ibHkgbnVtYmVyIGZyb20gRUVQUk9NCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBSZXR1cm5zOgorICogICAgICAgICAgUEJBIG51bWJlciBpZiBFRVBST00gY29udGVudHMgYXJlIHZhbGlkLCAwIG90aGVyd2lzZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQzMl90CitpeGdiX2dldF9lZV9wYmFfbnVtYmVyKHN0cnVjdCBpeGdiX2h3ICpodykKK3sKKwlpZihpeGdiX2NoZWNrX2FuZF9nZXRfZWVwcm9tX2RhdGEoaHcpID09IFRSVUUpCisJCXJldHVybiAobGUxNl90b19jcHUoaHctPmVlcHJvbVtFRVBST01fUEJBXzFfMl9SRUddKQorCQkJfCAobGUxNl90b19jcHUoaHctPmVlcHJvbVtFRVBST01fUEJBXzNfNF9SRUddKTw8MTYpKTsKKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcmV0dXJuIHRoZSBJbml0aWFsaXphdGlvbiBDb250cm9sIFdvcmQgMSBmcm9tIEVFUFJPTQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogUmV0dXJuczoKKyAqICAgICAgICAgIEluaXRpYWxpemF0aW9uIENvbnRyb2wgV29yZCAxIGlmIEVFUFJPTSBjb250ZW50cyBhcmUgdmFsaWQsIDAgb3RoZXJ3aXNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDE2X3QKK2l4Z2JfZ2V0X2VlX2luaXRfY3RybF9yZWdfMShzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKmVlX21hcCA9IChzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSAqKWh3LT5lZXByb207CisKKwlpZihpeGdiX2NoZWNrX2FuZF9nZXRfZWVwcm9tX2RhdGEoaHcpID09IFRSVUUpCisJCXJldHVybihlZV9tYXAtPmluaXRfY3RybF9yZWdfMSk7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHJldHVybiB0aGUgSW5pdGlhbGl6YXRpb24gQ29udHJvbCBXb3JkIDIgZnJvbSBFRVBST00KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFJldHVybnM6CisgKiAgICAgICAgICBJbml0aWFsaXphdGlvbiBDb250cm9sIFdvcmQgMiBpZiBFRVBST00gY29udGVudHMgYXJlIHZhbGlkLCAwIG90aGVyd2lzZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQxNl90CitpeGdiX2dldF9lZV9pbml0X2N0cmxfcmVnXzIoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXN0cnVjdCBpeGdiX2VlX21hcF90eXBlICplZV9tYXAgPSAoc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKilody0+ZWVwcm9tOworCisJaWYoaXhnYl9jaGVja19hbmRfZ2V0X2VlcHJvbV9kYXRhKGh3KSA9PSBUUlVFKQorCQlyZXR1cm4oZWVfbWFwLT5pbml0X2N0cmxfcmVnXzIpOworCisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiByZXR1cm4gdGhlIFN1YnN5c3RlbSBJZCBmcm9tIEVFUFJPTQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogUmV0dXJuczoKKyAqICAgICAgICAgIFN1YnN5c3RlbSBJZCBpZiBFRVBST00gY29udGVudHMgYXJlIHZhbGlkLCAwIG90aGVyd2lzZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3VpbnQxNl90CitpeGdiX2dldF9lZV9zdWJzeXN0ZW1faWQoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXN0cnVjdCBpeGdiX2VlX21hcF90eXBlICplZV9tYXAgPSAoc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKilody0+ZWVwcm9tOworCisJaWYoaXhnYl9jaGVja19hbmRfZ2V0X2VlcHJvbV9kYXRhKGh3KSA9PSBUUlVFKQorCSAgIHJldHVybihlZV9tYXAtPnN1YnN5c3RlbV9pZCk7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHJldHVybiB0aGUgU3ViIFZlbmRvciBJZCBmcm9tIEVFUFJPTQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKgorICogUmV0dXJuczoKKyAqICAgICAgICAgIFN1YiBWZW5kb3IgSWQgaWYgRUVQUk9NIGNvbnRlbnRzIGFyZSB2YWxpZCwgMCBvdGhlcndpc2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MTZfdAoraXhnYl9nZXRfZWVfc3VidmVuZG9yX2lkKHN0cnVjdCBpeGdiX2h3ICpodykKK3sKKwlzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSAqZWVfbWFwID0gKHN0cnVjdCBpeGdiX2VlX21hcF90eXBlICopaHctPmVlcHJvbTsKKworCWlmKGl4Z2JfY2hlY2tfYW5kX2dldF9lZXByb21fZGF0YShodykgPT0gVFJVRSkKKwkJcmV0dXJuKGVlX21hcC0+c3VidmVuZG9yX2lkKTsKKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcmV0dXJuIHRoZSBEZXZpY2UgSWQgZnJvbSBFRVBST00KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFJldHVybnM6CisgKiAgICAgICAgICBEZXZpY2UgSWQgaWYgRUVQUk9NIGNvbnRlbnRzIGFyZSB2YWxpZCwgMCBvdGhlcndpc2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MTZfdAoraXhnYl9nZXRfZWVfZGV2aWNlX2lkKHN0cnVjdCBpeGdiX2h3ICpodykKK3sKKwlzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSAqZWVfbWFwID0gKHN0cnVjdCBpeGdiX2VlX21hcF90eXBlICopaHctPmVlcHJvbTsKKworCWlmKGl4Z2JfY2hlY2tfYW5kX2dldF9lZXByb21fZGF0YShodykgPT0gVFJVRSkKKwkJcmV0dXJuKGVlX21hcC0+ZGV2aWNlX2lkKTsKKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcmV0dXJuIHRoZSBWZW5kb3IgSWQgZnJvbSBFRVBST00KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFJldHVybnM6CisgKiAgICAgICAgICBEZXZpY2UgSWQgaWYgRUVQUk9NIGNvbnRlbnRzIGFyZSB2YWxpZCwgMCBvdGhlcndpc2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MTZfdAoraXhnYl9nZXRfZWVfdmVuZG9yX2lkKHN0cnVjdCBpeGdiX2h3ICpodykKK3sKKwlzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSAqZWVfbWFwID0gKHN0cnVjdCBpeGdiX2VlX21hcF90eXBlICopaHctPmVlcHJvbTsKKworCWlmKGl4Z2JfY2hlY2tfYW5kX2dldF9lZXByb21fZGF0YShodykgPT0gVFJVRSkKKwkJcmV0dXJuKGVlX21hcC0+dmVuZG9yX2lkKTsKKworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcmV0dXJuIHRoZSBTb2Z0d2FyZSBEZWZpbmVkIFBpbnMgUmVnaXN0ZXIgZnJvbSBFRVBST00KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoKKyAqIFJldHVybnM6CisgKiAgICAgICAgICBTRFAgUmVnaXN0ZXIgaWYgRUVQUk9NIGNvbnRlbnRzIGFyZSB2YWxpZCwgMCBvdGhlcndpc2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MTZfdAoraXhnYl9nZXRfZWVfc3dkcGluc19yZWcoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXN0cnVjdCBpeGdiX2VlX21hcF90eXBlICplZV9tYXAgPSAoc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKilody0+ZWVwcm9tOworCisJaWYoaXhnYl9jaGVja19hbmRfZ2V0X2VlcHJvbV9kYXRhKGh3KSA9PSBUUlVFKQorCQlyZXR1cm4oZWVfbWFwLT5zd2RwaW5zX3JlZyk7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHJldHVybiB0aGUgRDMgUG93ZXIgTWFuYWdlbWVudCBCaXRzIGZyb20gRUVQUk9NCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBSZXR1cm5zOgorICogICAgICAgICAgRDMgUG93ZXIgTWFuYWdlbWVudCBCaXRzIGlmIEVFUFJPTSBjb250ZW50cyBhcmUgdmFsaWQsIDAgb3RoZXJ3aXNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDhfdAoraXhnYl9nZXRfZWVfZDNfcG93ZXIoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXN0cnVjdCBpeGdiX2VlX21hcF90eXBlICplZV9tYXAgPSAoc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKilody0+ZWVwcm9tOworCisJaWYoaXhnYl9jaGVja19hbmRfZ2V0X2VlcHJvbV9kYXRhKGh3KSA9PSBUUlVFKQorCQlyZXR1cm4oZWVfbWFwLT5kM19wb3dlcik7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHJldHVybiB0aGUgRDAgUG93ZXIgTWFuYWdlbWVudCBCaXRzIGZyb20gRUVQUk9NCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBSZXR1cm5zOgorICogICAgICAgICAgRDAgUG93ZXIgTWFuYWdlbWVudCBCaXRzIGlmIEVFUFJPTSBjb250ZW50cyBhcmUgdmFsaWQsIDAgb3RoZXJ3aXNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDhfdAoraXhnYl9nZXRfZWVfZDBfcG93ZXIoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXN0cnVjdCBpeGdiX2VlX21hcF90eXBlICplZV9tYXAgPSAoc3RydWN0IGl4Z2JfZWVfbWFwX3R5cGUgKilody0+ZWVwcm9tOworCisJaWYoaXhnYl9jaGVja19hbmRfZ2V0X2VlcHJvbV9kYXRhKGh3KSA9PSBUUlVFKQorCQlyZXR1cm4oZWVfbWFwLT5kMF9wb3dlcik7CisKKwlyZXR1cm4oMCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfZWUuaCBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9lZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOTBhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2JfZWUuaApAQCAtMCwwICsxLDEwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAKKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA1IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIAorICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAorICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCAKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIAorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIAorICBtb3JlIGRldGFpbHMuCisgIAorICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSAKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgIAorICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAgCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0lYR0JfRUVfSF8KKyNkZWZpbmUgX0lYR0JfRUVfSF8KKworI2RlZmluZSBJWEdCX0VFUFJPTV9TSVpFICAgIDY0CS8qIFNpemUgaW4gd29yZHMgKi8KKworI2RlZmluZSBJWEdCX0VUSF9MRU5HVEhfT0ZfQUREUkVTUyAgIDYKKworLyogRUVQUk9NIENvbW1hbmRzICovCisjZGVmaW5lIEVFUFJPTV9SRUFEX09QQ09ERSAgMHg2CS8qIEVFUlBPTSByZWFkIG9wY29kZSAqLworI2RlZmluZSBFRVBST01fV1JJVEVfT1BDT0RFIDB4NQkvKiBFRVJQT00gd3JpdGUgb3Bjb2RlICovCisjZGVmaW5lIEVFUFJPTV9FUkFTRV9PUENPREUgMHg3CS8qIEVFUlBPTSBlcmFzZSBvcGNvZGUgKi8KKyNkZWZpbmUgRUVQUk9NX0VXRU5fT1BDT0RFICAweDEzCS8qIEVFUlBPTSBlcmFzZS93cml0ZSBlbmFibGUgKi8KKyNkZWZpbmUgRUVQUk9NX0VXRFNfT1BDT0RFICAweDEwCS8qIEVFUlBPTSBlcmFzdC93cml0ZSBkaXNhYmxlICovCisKKy8qIEVFUFJPTSBNQVAgKFdvcmQgT2Zmc2V0cykgKi8KKyNkZWZpbmUgRUVQUk9NX0lBXzFfMl9SRUcgICAgICAgIDB4MDAwMAorI2RlZmluZSBFRVBST01fSUFfM180X1JFRyAgICAgICAgMHgwMDAxCisjZGVmaW5lIEVFUFJPTV9JQV81XzZfUkVHICAgICAgICAweDAwMDIKKyNkZWZpbmUgRUVQUk9NX0NPTVBBVElCSUxJVFlfUkVHIDB4MDAwMworI2RlZmluZSBFRVBST01fUEJBXzFfMl9SRUcgICAgICAgMHgwMDA4CisjZGVmaW5lIEVFUFJPTV9QQkFfM180X1JFRyAgICAgICAweDAwMDkKKyNkZWZpbmUgRUVQUk9NX0lOSVRfQ09OVFJPTDFfUkVHIDB4MDAwQQorI2RlZmluZSBFRVBST01fU1VCU1lTX0lEX1JFRyAgICAgMHgwMDBCCisjZGVmaW5lIEVFUFJPTV9TVUJWRU5EX0lEX1JFRyAgICAweDAwMEMKKyNkZWZpbmUgRUVQUk9NX0RFVklDRV9JRF9SRUcgICAgIDB4MDAwRAorI2RlZmluZSBFRVBST01fVkVORE9SX0lEX1JFRyAgICAgMHgwMDBFCisjZGVmaW5lIEVFUFJPTV9JTklUX0NPTlRST0wyX1JFRyAweDAwMEYKKyNkZWZpbmUgRUVQUk9NX1NXRFBJTlNfUkVHICAgICAgIDB4MDAyMAorI2RlZmluZSBFRVBST01fQ0lSQ1VJVF9DVFJMX1JFRyAgMHgwMDIxCisjZGVmaW5lIEVFUFJPTV9EMF9EM19QT1dFUl9SRUcgICAweDAwMjIKKyNkZWZpbmUgRUVQUk9NX0ZMQVNIX1ZFUlNJT04gICAgIDB4MDAzMgorI2RlZmluZSBFRVBST01fQ0hFQ0tTVU1fUkVHICAgICAgMHgwMDNGCisKKy8qIE1hc2sgYml0cyBmb3IgZmllbGRzIGluIFdvcmQgMHgwYSBvZiB0aGUgRUVQUk9NICovCisKKyNkZWZpbmUgRUVQUk9NX0lDVzFfU0lHTkFUVVJFX01BU0sgIDB4QzAwMAorI2RlZmluZSBFRVBST01fSUNXMV9TSUdOQVRVUkVfVkFMSUQgMHg0MDAwCisjZGVmaW5lIEVFUFJPTV9JQ1cxX1NJR05BVFVSRV9DTEVBUiAweDAwMDAKKworLyogRm9yIGNoZWNrc3VtbWluZywgdGhlIHN1bSBvZiBhbGwgd29yZHMgaW4gdGhlIEVFUFJPTSBzaG91bGQgZXF1YWwgMHhCQUJBLiAqLworI2RlZmluZSBFRVBST01fU1VNIDB4QkFCQQorCisvKiBFRVBST00gTWFwIFNpemVzIChCeXRlIENvdW50cykgKi8KKyNkZWZpbmUgUEJBX1NJWkUgNAorCisvKiBFRVBST00gTWFwIGRlZmluZXMgKFdPUkQgT0ZGU0VUUykqLworCisvKiBFRVBST00gc3RydWN0dXJlICovCitzdHJ1Y3QgaXhnYl9lZV9tYXBfdHlwZSB7CisJdWludDhfdCBtYWNfYWRkcltJWEdCX0VUSF9MRU5HVEhfT0ZfQUREUkVTU107CisJdWludDE2X3QgY29tcGF0aWJpbGl0eTsKKwl1aW50MTZfdCByZXNlcnZlZDFbNF07CisJdWludDMyX3QgcGJhX251bWJlcjsKKwl1aW50MTZfdCBpbml0X2N0cmxfcmVnXzE7CisJdWludDE2X3Qgc3Vic3lzdGVtX2lkOworCXVpbnQxNl90IHN1YnZlbmRvcl9pZDsKKwl1aW50MTZfdCBkZXZpY2VfaWQ7CisJdWludDE2X3QgdmVuZG9yX2lkOworCXVpbnQxNl90IGluaXRfY3RybF9yZWdfMjsKKwl1aW50MTZfdCBvZW1fcmVzZXJ2ZWRbMTZdOworCXVpbnQxNl90IHN3ZHBpbnNfcmVnOworCXVpbnQxNl90IGNpcmN1aXRfY3RybF9yZWc7CisJdWludDhfdCBkM19wb3dlcjsKKwl1aW50OF90IGQwX3Bvd2VyOworCXVpbnQxNl90IHJlc2VydmVkMlsyOF07CisJdWludDE2X3QgY2hlY2tzdW07Cit9OworCisvKiBFRVBST00gRnVuY3Rpb25zICovCit1aW50MTZfdCBpeGdiX3JlYWRfZWVwcm9tKHN0cnVjdCBpeGdiX2h3ICpodywgdWludDE2X3QgcmVnKTsKKworYm9vbGVhbl90IGl4Z2JfdmFsaWRhdGVfZWVwcm9tX2NoZWNrc3VtKHN0cnVjdCBpeGdiX2h3ICpodyk7CisKK3ZvaWQgaXhnYl91cGRhdGVfZWVwcm9tX2NoZWNrc3VtKHN0cnVjdCBpeGdiX2h3ICpodyk7CisKK3ZvaWQgaXhnYl93cml0ZV9lZXByb20oc3RydWN0IGl4Z2JfaHcgKmh3LCB1aW50MTZfdCByZWcsIHVpbnQxNl90IGRhdGEpOworCisjZW5kaWYJCQkJLyogSVhHQl9FRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX2V0aHRvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWExMGU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX2V0aHRvb2wuYwpAQCAtMCwwICsxLDcwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAKKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA1IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIAorICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAorICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCAKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIAorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIAorICBtb3JlIGRldGFpbHMuCisgIAorICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSAKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgIAorICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAgCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGV0aHRvb2wgc3VwcG9ydCBmb3IgaXhnYiAqLworCisjaW5jbHVkZSAiaXhnYi5oIgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworZXh0ZXJuIGNoYXIgaXhnYl9kcml2ZXJfbmFtZVtdOworZXh0ZXJuIGNoYXIgaXhnYl9kcml2ZXJfdmVyc2lvbltdOworCitleHRlcm4gaW50IGl4Z2JfdXAoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcik7CitleHRlcm4gdm9pZCBpeGdiX2Rvd24oc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciwgYm9vbGVhbl90IGtpbGxfd2F0Y2hkb2cpOworZXh0ZXJuIHZvaWQgaXhnYl9yZXNldChzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKK2V4dGVybiBpbnQgaXhnYl9zZXR1cF9yeF9yZXNvdXJjZXMoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcik7CitleHRlcm4gaW50IGl4Z2Jfc2V0dXBfdHhfcmVzb3VyY2VzKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpOworZXh0ZXJuIHZvaWQgaXhnYl9mcmVlX3J4X3Jlc291cmNlcyhzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKK2V4dGVybiB2b2lkIGl4Z2JfZnJlZV90eF9yZXNvdXJjZXMoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcik7CitleHRlcm4gdm9pZCBpeGdiX3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKKworc3RydWN0IGl4Z2Jfc3RhdHMgeworCWNoYXIgc3RhdF9zdHJpbmdbRVRIX0dTVFJJTkdfTEVOXTsKKwlpbnQgc2l6ZW9mX3N0YXQ7CisJaW50IHN0YXRfb2Zmc2V0OworfTsKKworI2RlZmluZSBJWEdCX1NUQVQobSkgc2l6ZW9mKCgoc3RydWN0IGl4Z2JfYWRhcHRlciAqKTApLT5tKSwgXAorCQkgICAgICBvZmZzZXRvZihzdHJ1Y3QgaXhnYl9hZGFwdGVyLCBtKQorc3RhdGljIHN0cnVjdCBpeGdiX3N0YXRzIGl4Z2JfZ3N0cmluZ3Nfc3RhdHNbXSA9IHsKKwl7InJ4X3BhY2tldHMiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnJ4X3BhY2tldHMpfSwKKwl7InR4X3BhY2tldHMiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnR4X3BhY2tldHMpfSwKKwl7InJ4X2J5dGVzIiwgSVhHQl9TVEFUKG5ldF9zdGF0cy5yeF9ieXRlcyl9LAorCXsidHhfYnl0ZXMiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnR4X2J5dGVzKX0sCisJeyJyeF9lcnJvcnMiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnJ4X2Vycm9ycyl9LAorCXsidHhfZXJyb3JzIiwgSVhHQl9TVEFUKG5ldF9zdGF0cy50eF9lcnJvcnMpfSwKKwl7InJ4X2Ryb3BwZWQiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnJ4X2Ryb3BwZWQpfSwKKwl7InR4X2Ryb3BwZWQiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnR4X2Ryb3BwZWQpfSwKKwl7Im11bHRpY2FzdCIsIElYR0JfU1RBVChuZXRfc3RhdHMubXVsdGljYXN0KX0sCisJeyJjb2xsaXNpb25zIiwgSVhHQl9TVEFUKG5ldF9zdGF0cy5jb2xsaXNpb25zKX0sCisKKy8qCXsgInJ4X2xlbmd0aF9lcnJvcnMiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMpIH0sCSovCisJeyJyeF9vdmVyX2Vycm9ycyIsIElYR0JfU1RBVChuZXRfc3RhdHMucnhfb3Zlcl9lcnJvcnMpfSwKKwl7InJ4X2NyY19lcnJvcnMiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnJ4X2NyY19lcnJvcnMpfSwKKwl7InJ4X2ZyYW1lX2Vycm9ycyIsIElYR0JfU1RBVChuZXRfc3RhdHMucnhfZnJhbWVfZXJyb3JzKX0sCisJeyJyeF9maWZvX2Vycm9ycyIsIElYR0JfU1RBVChuZXRfc3RhdHMucnhfZmlmb19lcnJvcnMpfSwKKwl7InJ4X21pc3NlZF9lcnJvcnMiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnMpfSwKKwl7InR4X2Fib3J0ZWRfZXJyb3JzIiwgSVhHQl9TVEFUKG5ldF9zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyl9LAorCXsidHhfY2Fycmllcl9lcnJvcnMiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKX0sCisJeyJ0eF9maWZvX2Vycm9ycyIsIElYR0JfU1RBVChuZXRfc3RhdHMudHhfZmlmb19lcnJvcnMpfSwKKwl7InR4X2hlYXJ0YmVhdF9lcnJvcnMiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMpfSwKKwl7InR4X3dpbmRvd19lcnJvcnMiLCBJWEdCX1NUQVQobmV0X3N0YXRzLnR4X3dpbmRvd19lcnJvcnMpfSwKKwl7InR4X2RlZmVycmVkX29rIiwgSVhHQl9TVEFUKHN0YXRzLmRjKX0sCisJeyJyeF9sb25nX2xlbmd0aF9lcnJvcnMiLCBJWEdCX1NUQVQoc3RhdHMucm9jKX0sCisJeyJyeF9zaG9ydF9sZW5ndGhfZXJyb3JzIiwgSVhHQl9TVEFUKHN0YXRzLnJ1Yyl9LAorI2lmZGVmIE5FVElGX0ZfVFNPCisJeyJ0eF90Y3Bfc2VnX2dvb2QiLCBJWEdCX1NUQVQoc3RhdHMudHNjdGMpfSwKKwl7InR4X3RjcF9zZWdfZmFpbGVkIiwgSVhHQl9TVEFUKHN0YXRzLnRzY3RmYyl9LAorI2VuZGlmCisJeyJyeF9mbG93X2NvbnRyb2xfeG9uIiwgSVhHQl9TVEFUKHN0YXRzLnhvbnJ4Yyl9LAorCXsicnhfZmxvd19jb250cm9sX3hvZmYiLCBJWEdCX1NUQVQoc3RhdHMueG9mZnJ4Yyl9LAorCXsidHhfZmxvd19jb250cm9sX3hvbiIsIElYR0JfU1RBVChzdGF0cy54b250eGMpfSwKKwl7InR4X2Zsb3dfY29udHJvbF94b2ZmIiwgSVhHQl9TVEFUKHN0YXRzLnhvZmZ0eGMpfSwKKwl7InJ4X2NzdW1fb2ZmbG9hZF9nb29kIiwgSVhHQl9TVEFUKGh3X2NzdW1fcnhfZ29vZCl9LAorCXsicnhfY3N1bV9vZmZsb2FkX2Vycm9ycyIsIElYR0JfU1RBVChod19jc3VtX3J4X2Vycm9yKX0sCisJeyJ0eF9jc3VtX29mZmxvYWRfZ29vZCIsIElYR0JfU1RBVChod19jc3VtX3R4X2dvb2QpfSwKKwl7InR4X2NzdW1fb2ZmbG9hZF9lcnJvcnMiLCBJWEdCX1NUQVQoaHdfY3N1bV90eF9lcnJvcil9Cit9OworCisjZGVmaW5lIElYR0JfU1RBVFNfTEVOCVwKKwlzaXplb2YoaXhnYl9nc3RyaW5nc19zdGF0cykgLyBzaXplb2Yoc3RydWN0IGl4Z2Jfc3RhdHMpCisKK3N0YXRpYyBpbnQKK2l4Z2JfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCisJZWNtZC0+c3VwcG9ydGVkID0gKFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfRklCUkUpOworCWVjbWQtPmFkdmVydGlzaW5nID0gKFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfRklCUkUpOworCWVjbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOworCWVjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9FWFRFUk5BTDsKKworCWlmKG5ldGlmX2NhcnJpZXJfb2soYWRhcHRlci0+bmV0ZGV2KSkgeworCQllY21kLT5zcGVlZCA9IFNQRUVEXzEwMDAwOworCQllY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwl9IGVsc2UgeworCQllY21kLT5zcGVlZCA9IC0xOworCQllY21kLT5kdXBsZXggPSAtMTsKKwl9CisKKwllY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpeGdiX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKworCWlmKGVjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUgfHwKKwkgICBlY21kLT5zcGVlZCArIGVjbWQtPmR1cGxleCAhPSBTUEVFRF8xMDAwMCArIERVUExFWF9GVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkKKwlpZihuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsKKwkJaXhnYl9kb3duKGFkYXB0ZXIsIFRSVUUpOworCQlpeGdiX3Jlc2V0KGFkYXB0ZXIpOworCQlpeGdiX3VwKGFkYXB0ZXIpOworCX0gZWxzZQorCQlpeGdiX3Jlc2V0KGFkYXB0ZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitpeGdiX2dldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqcGF1c2UpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXhnYl9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJCisJcGF1c2UtPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CisJCQorCWlmKGh3LT5mYy50eXBlID09IGl4Z2JfZmNfcnhfcGF1c2UpCisJCXBhdXNlLT5yeF9wYXVzZSA9IDE7CisJZWxzZSBpZihody0+ZmMudHlwZSA9PSBpeGdiX2ZjX3R4X3BhdXNlKQorCQlwYXVzZS0+dHhfcGF1c2UgPSAxOworCWVsc2UgaWYoaHctPmZjLnR5cGUgPT0gaXhnYl9mY19mdWxsKSB7CisJCXBhdXNlLT5yeF9wYXVzZSA9IDE7CisJCXBhdXNlLT50eF9wYXVzZSA9IDE7CisJfQorfQorCitzdGF0aWMgaW50CitpeGdiX3NldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqcGF1c2UpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXhnYl9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJCisJaWYocGF1c2UtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYocGF1c2UtPnJ4X3BhdXNlICYmIHBhdXNlLT50eF9wYXVzZSkKKwkJaHctPmZjLnR5cGUgPSBpeGdiX2ZjX2Z1bGw7CisJZWxzZSBpZihwYXVzZS0+cnhfcGF1c2UgJiYgIXBhdXNlLT50eF9wYXVzZSkKKwkJaHctPmZjLnR5cGUgPSBpeGdiX2ZjX3J4X3BhdXNlOworCWVsc2UgaWYoIXBhdXNlLT5yeF9wYXVzZSAmJiBwYXVzZS0+dHhfcGF1c2UpCisJCWh3LT5mYy50eXBlID0gaXhnYl9mY190eF9wYXVzZTsKKwllbHNlIGlmKCFwYXVzZS0+cnhfcGF1c2UgJiYgIXBhdXNlLT50eF9wYXVzZSkKKwkJaHctPmZjLnR5cGUgPSBpeGdiX2ZjX25vbmU7CisKKwlpZihuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsKKwkJaXhnYl9kb3duKGFkYXB0ZXIsIFRSVUUpOworCQlpeGdiX3VwKGFkYXB0ZXIpOworCX0gZWxzZQorCQlpeGdiX3Jlc2V0KGFkYXB0ZXIpOworCQkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90CitpeGdiX2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlyZXR1cm4gYWRhcHRlci0+cnhfY3N1bTsKK30KKworc3RhdGljIGludAoraXhnYl9zZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MzJfdCBkYXRhKQoreworCXN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJYWRhcHRlci0+cnhfY3N1bSA9IGRhdGE7CisKKwlpZihuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKKwkJaXhnYl9kb3duKGFkYXB0ZXIsVFJVRSk7CisJCWl4Z2JfdXAoYWRhcHRlcik7CisJfSBlbHNlCisJCWl4Z2JfcmVzZXQoYWRhcHRlcik7CisJcmV0dXJuIDA7Cit9CisJCitzdGF0aWMgdWludDMyX3QKK2l4Z2JfZ2V0X3R4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlyZXR1cm4gKG5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX0NTVU0pICE9IDA7Cit9CisKK3N0YXRpYyBpbnQKK2l4Z2Jfc2V0X3R4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDMyX3QgZGF0YSkKK3sKKwlpZiAoZGF0YSkKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX0NTVU07CisJZWxzZQorCQluZXRkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX0hXX0NTVU07CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIE5FVElGX0ZfVFNPCitzdGF0aWMgaW50CitpeGdiX3NldF90c28oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDMyX3QgZGF0YSkKK3sKKwlpZihkYXRhKQorCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOworCWVsc2UKKwkJbmV0ZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9UU087CisJcmV0dXJuIDA7Cit9IAorI2VuZGlmIC8qIE5FVElGX0ZfVFNPICovCisKKyNkZWZpbmUgSVhHQl9HRVRfU1RBVChfQV8sIF9SXykgX0FfLT5zdGF0cy5fUl8KKworc3RhdGljIGludCAKK2l4Z2JfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisjZGVmaW5lIElYR0JfUkVHX0RVTVBfTEVOICAxMzYqc2l6ZW9mKHVpbnQzMl90KQorCXJldHVybiBJWEdCX1JFR19EVU1QX0xFTjsKK30KKworc3RhdGljIHZvaWQKK2l4Z2JfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJICAgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBpeGdiX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1aW50MzJfdCAqcmVnID0gcDsKKwl1aW50MzJfdCAqcmVnX3N0YXJ0ID0gcmVnOworCXVpbnQ4X3QgaTsKKworCXJlZ3MtPnZlcnNpb24gPSAoYWRhcHRlci0+aHcuZGV2aWNlX2lkIDw8IDE2KSB8IGFkYXB0ZXItPmh3LnN1YnN5c3RlbV9pZDsKKworCS8qIEdlbmVyYWwgUmVnaXN0ZXJzICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgQ1RSTDApOwkvKiAgIDAgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBDVFJMMSk7CS8qICAgMSAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIFNUQVRVUyk7CS8qICAgMiAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIEVFQ0QpOwkvKiAgIDMgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBNRlMpOwkvKiAgIDQgKi8KKworCS8qIEludGVycnVwdCAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIElDUik7CS8qICAgNSAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIElDUyk7CS8qICAgNiAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIElNUyk7CS8qICAgNyAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIElNQyk7CS8qICAgOCAqLworCisJLyogUmVjZWl2ZSAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIFJDVEwpOwkvKiAgIDkgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBGQ1JUTCk7CS8qICAxMCAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIEZDUlRIKTsJLyogIDExICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgUkRCQUwpOwkvKiAgMTIgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBSREJBSCk7CS8qICAxMyAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIFJETEVOKTsJLyogIDE0ICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgUkRIKTsJLyogIDE1ICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgUkRUKTsJLyogIDE2ICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgUkRUUik7CS8qICAxNyAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIFJYRENUTCk7CS8qICAxOCAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIFJBSURDKTsJLyogIDE5ICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgUlhDU1VNKTsJLyogIDIwICovCisKKwlmb3IgKGkgPSAwOyBpIDwgSVhHQl9SQVJfRU5UUklFUzsgaSsrKSB7CisJCSpyZWcrKyA9IElYR0JfUkVBRF9SRUdfQVJSQVkoaHcsIFJBTCwgKGkgPDwgMSkpOyAvKjIxLC4uLiw1MSAqLworCQkqcmVnKysgPSBJWEdCX1JFQURfUkVHX0FSUkFZKGh3LCBSQUgsIChpIDw8IDEpKTsgLyoyMiwuLi4sNTIgKi8KKwl9CisKKwkvKiBUcmFuc21pdCAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIFRDVEwpOwkvKiAgNTMgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBUREJBTCk7CS8qICA1NCAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIFREQkFIKTsJLyogIDU1ICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgVERMRU4pOwkvKiAgNTYgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBUREgpOwkvKiAgNTcgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBURFQpOwkvKiAgNTggKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBUSURWKTsJLyogIDU5ICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgVFhEQ1RMKTsJLyogIDYwICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgVFNQTVQpOwkvKiAgNjEgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBQQVApOwkvKiAgNjIgKi8KKworCS8qIFBoeXNpY2FsICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgUENTQzEpOwkvKiAgNjMgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBQQ1NDMik7CS8qICA2NCAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIFBDU1MxKTsJLyogIDY1ICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgUENTUzIpOwkvKiAgNjYgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBYUENTUyk7CS8qICA2NyAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIFVDQ1IpOwkvKiAgNjggKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBYUENTVEMpOwkvKiAgNjkgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBNQUNBKTsJLyogIDcwICovCisJKnJlZysrID0gSVhHQl9SRUFEX1JFRyhodywgQVBBRSk7CS8qICA3MSAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIEFSRCk7CS8qICA3MiAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIEFJUyk7CS8qICA3MyAqLworCSpyZWcrKyA9IElYR0JfUkVBRF9SRUcoaHcsIE1TQ0EpOwkvKiAgNzQgKi8KKwkqcmVnKysgPSBJWEdCX1JFQURfUkVHKGh3LCBNU1JXRCk7CS8qICA3NSAqLworCisJLyogU3RhdGlzdGljcyAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgdHBybCk7CS8qICA3NiAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgdHByaCk7CS8qICA3NyAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgZ3ByY2wpOwkvKiAgNzggKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIGdwcmNoKTsJLyogIDc5ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBicHJjbCk7CS8qICA4MCAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgYnByY2gpOwkvKiAgODEgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIG1wcmNsKTsJLyogIDgyICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBtcHJjaCk7CS8qICA4MyAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgdXByY2wpOwkvKiAgODQgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIHVwcmNoKTsJLyogIDg1ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCB2cHJjbCk7CS8qICA4NiAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgdnByY2gpOwkvKiAgODcgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIGpwcmNsKTsJLyogIDg4ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBqcHJjaCk7CS8qICA4OSAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgZ29yY2wpOwkvKiAgOTAgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIGdvcmNoKTsJLyogIDkxICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCB0b3JsKTsJLyogIDkyICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCB0b3JoKTsJLyogIDkzICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBybmJjKTsJLyogIDk0ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBydWMpOwkvKiAgOTUgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIHJvYyk7CS8qICA5NiAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgcmxlYyk7CS8qICA5NyAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgY3JjZXJycyk7CS8qICA5OCAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgaWNiYyk7CS8qICA5OSAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgZWNiYyk7CS8qIDEwMCAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgbXBjKTsJLyogMTAxICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCB0cHRsKTsJLyogMTAyICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCB0cHRoKTsJLyogMTAzICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBncHRjbCk7CS8qIDEwNCAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgZ3B0Y2gpOwkvKiAxMDUgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIGJwdGNsKTsJLyogMTA2ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBicHRjaCk7CS8qIDEwNyAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgbXB0Y2wpOwkvKiAxMDggKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIG1wdGNoKTsJLyogMTA5ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCB1cHRjbCk7CS8qIDExMCAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgdXB0Y2gpOwkvKiAxMTEgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIHZwdGNsKTsJLyogMTEyICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCB2cHRjaCk7CS8qIDExMyAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwganB0Y2wpOwkvKiAxMTQgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIGpwdGNoKTsJLyogMTE1ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBnb3RjbCk7CS8qIDExNiAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgZ290Y2gpOwkvKiAxMTcgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIHRvdGwpOwkvKiAxMTggKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIHRvdGgpOwkvKiAxMTkgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIGRjKTsJLyogMTIwICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBwbHQ2NGMpOwkvKiAxMjEgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIHRzY3RjKTsJLyogMTIyICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCB0c2N0ZmMpOwkvKiAxMjMgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIGliaWMpOwkvKiAxMjQgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIHJmYyk7CS8qIDEyNSAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgbGZjKTsJLyogMTI2ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBwZnJjKTsJLyogMTI3ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBwZnRjKTsJLyogMTI4ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCBtY2ZyYyk7CS8qIDEyOSAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgbWNmdGMpOwkvKiAxMzAgKi8KKwkqcmVnKysgPSBJWEdCX0dFVF9TVEFUKGFkYXB0ZXIsIHhvbnJ4Yyk7CS8qIDEzMSAqLworCSpyZWcrKyA9IElYR0JfR0VUX1NUQVQoYWRhcHRlciwgeG9udHhjKTsJLyogMTMyICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCB4b2ZmcnhjKTsJLyogMTMzICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCB4b2ZmdHhjKTsJLyogMTM0ICovCisJKnJlZysrID0gSVhHQl9HRVRfU1RBVChhZGFwdGVyLCByamMpOwkvKiAxMzUgKi8KKworCXJlZ3MtPmxlbiA9IChyZWcgLSByZWdfc3RhcnQpICogc2l6ZW9mKHVpbnQzMl90KTsKK30KKworc3RhdGljIGludAoraXhnYl9nZXRfZWVwcm9tX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCS8qIHJldHVybiBzaXplIGluIGJ5dGVzICovCisJcmV0dXJuIChJWEdCX0VFUFJPTV9TSVpFIDw8IDEpOworfQorCitzdGF0aWMgaW50CitpeGdiX2dldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdWludDhfdCAqYnl0ZXMpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXhnYl9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdWludDE2X3QgKmVlcHJvbV9idWZmOworCWludCBpLCBtYXhfbGVuLCBmaXJzdF93b3JkLCBsYXN0X3dvcmQ7CisJaW50IHJldF92YWwgPSAwOworCisJaWYoZWVwcm9tLT5sZW4gPT0gMCkgeworCQlyZXRfdmFsID0gLUVJTlZBTDsKKwkJZ290byBnZWVwcm9tX2Vycm9yOworCX0KKworCWVlcHJvbS0+bWFnaWMgPSBody0+dmVuZG9yX2lkIHwgKGh3LT5kZXZpY2VfaWQgPDwgMTYpOworCisJbWF4X2xlbiA9IGl4Z2JfZ2V0X2VlcHJvbV9sZW4obmV0ZGV2KTsKKworCWlmKGVlcHJvbS0+b2Zmc2V0ID4gZWVwcm9tLT5vZmZzZXQgKyBlZXByb20tPmxlbikgeworCQlyZXRfdmFsID0gLUVJTlZBTDsKKwkJZ290byBnZWVwcm9tX2Vycm9yOworCX0KKworCWlmKChlZXByb20tPm9mZnNldCArIGVlcHJvbS0+bGVuKSA+IG1heF9sZW4pCisJCWVlcHJvbS0+bGVuID0gKG1heF9sZW4gLSBlZXByb20tPm9mZnNldCk7CisKKwlmaXJzdF93b3JkID0gZWVwcm9tLT5vZmZzZXQgPj4gMTsKKwlsYXN0X3dvcmQgPSAoZWVwcm9tLT5vZmZzZXQgKyBlZXByb20tPmxlbiAtIDEpID4+IDE7CisKKwllZXByb21fYnVmZiA9IGttYWxsb2Moc2l6ZW9mKHVpbnQxNl90KSAqCisJCQkobGFzdF93b3JkIC0gZmlyc3Rfd29yZCArIDEpLCBHRlBfS0VSTkVMKTsKKwlpZighZWVwcm9tX2J1ZmYpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogbm90ZSB0aGUgZWVwcm9tIHdhcyBnb29kIGJlY2F1c2UgdGhlIGRyaXZlciBsb2FkZWQgKi8KKwlmb3IoaSA9IDA7IGkgPD0gKGxhc3Rfd29yZCAtIGZpcnN0X3dvcmQpOyBpKyspIHsKKwkJZWVwcm9tX2J1ZmZbaV0gPSBpeGdiX2dldF9lZXByb21fd29yZChodywgKGZpcnN0X3dvcmQgKyBpKSk7CisJfQorCisJbWVtY3B5KGJ5dGVzLCAodWludDhfdCAqKWVlcHJvbV9idWZmICsgKGVlcHJvbS0+b2Zmc2V0ICYgMSksCisJCQllZXByb20tPmxlbik7CisJa2ZyZWUoZWVwcm9tX2J1ZmYpOworCitnZWVwcm9tX2Vycm9yOgorCXJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgaW50CitpeGdiX3NldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdWludDhfdCAqYnl0ZXMpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgaXhnYl9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdWludDE2X3QgKmVlcHJvbV9idWZmOworCXZvaWQgKnB0cjsKKwlpbnQgbWF4X2xlbiwgZmlyc3Rfd29yZCwgbGFzdF93b3JkOworCXVpbnQxNl90IGk7CisKKwlpZihlZXByb20tPmxlbiA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmKGVlcHJvbS0+bWFnaWMgIT0gKGh3LT52ZW5kb3JfaWQgfCAoaHctPmRldmljZV9pZCA8PCAxNikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW1heF9sZW4gPSBpeGdiX2dldF9lZXByb21fbGVuKG5ldGRldik7CisKKwlpZihlZXByb20tPm9mZnNldCA+IGVlcHJvbS0+b2Zmc2V0ICsgZWVwcm9tLT5sZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYoKGVlcHJvbS0+b2Zmc2V0ICsgZWVwcm9tLT5sZW4pID4gbWF4X2xlbikKKwkJZWVwcm9tLT5sZW4gPSAobWF4X2xlbiAtIGVlcHJvbS0+b2Zmc2V0KTsKKworCWZpcnN0X3dvcmQgPSBlZXByb20tPm9mZnNldCA+PiAxOworCWxhc3Rfd29yZCA9IChlZXByb20tPm9mZnNldCArIGVlcHJvbS0+bGVuIC0gMSkgPj4gMTsKKwllZXByb21fYnVmZiA9IGttYWxsb2MobWF4X2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYoIWVlcHJvbV9idWZmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXB0ciA9ICh2b2lkICopZWVwcm9tX2J1ZmY7CisKKwlpZihlZXByb20tPm9mZnNldCAmIDEpIHsKKwkJLyogbmVlZCByZWFkL21vZGlmeS93cml0ZSBvZiBmaXJzdCBjaGFuZ2VkIEVFUFJPTSB3b3JkICovCisJCS8qIG9ubHkgdGhlIHNlY29uZCBieXRlIG9mIHRoZSB3b3JkIGlzIGJlaW5nIG1vZGlmaWVkICovCisJCWVlcHJvbV9idWZmWzBdID0gaXhnYl9yZWFkX2VlcHJvbShodywgZmlyc3Rfd29yZCk7CisJCXB0cisrOworCX0KKwlpZigoZWVwcm9tLT5vZmZzZXQgKyBlZXByb20tPmxlbikgJiAxKSB7CisJCS8qIG5lZWQgcmVhZC9tb2RpZnkvd3JpdGUgb2YgbGFzdCBjaGFuZ2VkIEVFUFJPTSB3b3JkICovCisJCS8qIG9ubHkgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHdvcmQgaXMgYmVpbmcgbW9kaWZpZWQgKi8KKwkJZWVwcm9tX2J1ZmZbbGFzdF93b3JkIC0gZmlyc3Rfd29yZF0gCisJCQk9IGl4Z2JfcmVhZF9lZXByb20oaHcsIGxhc3Rfd29yZCk7CisJfQorCisJbWVtY3B5KHB0ciwgYnl0ZXMsIGVlcHJvbS0+bGVuKTsKKwlmb3IoaSA9IDA7IGkgPD0gKGxhc3Rfd29yZCAtIGZpcnN0X3dvcmQpOyBpKyspCisJCWl4Z2Jfd3JpdGVfZWVwcm9tKGh3LCBmaXJzdF93b3JkICsgaSwgZWVwcm9tX2J1ZmZbaV0pOworCisJLyogVXBkYXRlIHRoZSBjaGVja3N1bSBvdmVyIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBFRVBST00gaWYgbmVlZGVkICovCisJaWYoZmlyc3Rfd29yZCA8PSBFRVBST01fQ0hFQ0tTVU1fUkVHKQorCQlpeGdiX3VwZGF0ZV9lZXByb21fY2hlY2tzdW0oaHcpOworCisJa2ZyZWUoZWVwcm9tX2J1ZmYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoraXhnYl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICpkcnZpbmZvKQoreworCXN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisKKwlzdHJuY3B5KGRydmluZm8tPmRyaXZlciwgIGl4Z2JfZHJpdmVyX25hbWUsIDMyKTsKKwlzdHJuY3B5KGRydmluZm8tPnZlcnNpb24sIGl4Z2JfZHJpdmVyX3ZlcnNpb24sIDMyKTsKKwlzdHJuY3B5KGRydmluZm8tPmZ3X3ZlcnNpb24sICJOL0EiLCAzMik7CisJc3RybmNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYWRhcHRlci0+cGRldiksIDMyKTsKKwlkcnZpbmZvLT5uX3N0YXRzID0gSVhHQl9TVEFUU19MRU47CisJZHJ2aW5mby0+cmVnZHVtcF9sZW4gPSBpeGdiX2dldF9yZWdzX2xlbihuZXRkZXYpOworCWRydmluZm8tPmVlZHVtcF9sZW4gPSBpeGdiX2dldF9lZXByb21fbGVuKG5ldGRldik7Cit9CisKK3N0YXRpYyB2b2lkCitpeGdiX2dldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpyaW5nKQoreworCXN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGl4Z2JfZGVzY19yaW5nICp0eGRyID0gJmFkYXB0ZXItPnR4X3Jpbmc7CisJc3RydWN0IGl4Z2JfZGVzY19yaW5nICpyeGRyID0gJmFkYXB0ZXItPnJ4X3Jpbmc7CisKKwlyaW5nLT5yeF9tYXhfcGVuZGluZyA9IE1BWF9SWEQ7IAorCXJpbmctPnR4X21heF9wZW5kaW5nID0gTUFYX1RYRDsKKwlyaW5nLT5yeF9taW5pX21heF9wZW5kaW5nID0gMDsKKwlyaW5nLT5yeF9qdW1ib19tYXhfcGVuZGluZyA9IDA7CisJcmluZy0+cnhfcGVuZGluZyA9IHJ4ZHItPmNvdW50OworCXJpbmctPnR4X3BlbmRpbmcgPSB0eGRyLT5jb3VudDsKKwlyaW5nLT5yeF9taW5pX3BlbmRpbmcgPSAwOworCXJpbmctPnJ4X2p1bWJvX3BlbmRpbmcgPSAwOworfQorCitzdGF0aWMgaW50IAoraXhnYl9zZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCXN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcmluZykKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBpeGdiX2Rlc2NfcmluZyAqdHhkciA9ICZhZGFwdGVyLT50eF9yaW5nOworCXN0cnVjdCBpeGdiX2Rlc2NfcmluZyAqcnhkciA9ICZhZGFwdGVyLT5yeF9yaW5nOworCXN0cnVjdCBpeGdiX2Rlc2NfcmluZyB0eF9vbGQsIHR4X25ldywgcnhfb2xkLCByeF9uZXc7CisJaW50IGVycjsKKworCXR4X29sZCA9IGFkYXB0ZXItPnR4X3Jpbmc7CisJcnhfb2xkID0gYWRhcHRlci0+cnhfcmluZzsKKworCWlmKChyaW5nLT5yeF9taW5pX3BlbmRpbmcpIHx8IChyaW5nLT5yeF9qdW1ib19wZW5kaW5nKSkgCisJCXJldHVybiAtRUlOVkFMOworCisJaWYobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKQorCQlpeGdiX2Rvd24oYWRhcHRlcixUUlVFKTsKKworCXJ4ZHItPmNvdW50ID0gbWF4KHJpbmctPnJ4X3BlbmRpbmcsKHVpbnQzMl90KU1JTl9SWEQpOworCXJ4ZHItPmNvdW50ID0gbWluKHJ4ZHItPmNvdW50LCh1aW50MzJfdClNQVhfUlhEKTsKKwlJWEdCX1JPVU5EVVAocnhkci0+Y291bnQsIElYR0JfUkVRX1JYX0RFU0NSSVBUT1JfTVVMVElQTEUpOyAKKworCXR4ZHItPmNvdW50ID0gbWF4KHJpbmctPnR4X3BlbmRpbmcsKHVpbnQzMl90KU1JTl9UWEQpOworCXR4ZHItPmNvdW50ID0gbWluKHR4ZHItPmNvdW50LCh1aW50MzJfdClNQVhfVFhEKTsKKwlJWEdCX1JPVU5EVVAodHhkci0+Y291bnQsIElYR0JfUkVRX1RYX0RFU0NSSVBUT1JfTVVMVElQTEUpOyAKKworCWlmKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgeworCQkvKiBUcnkgdG8gZ2V0IG5ldyByZXNvdXJjZXMgYmVmb3JlIGRlbGV0aW5nIG9sZCAqLworCQlpZigoZXJyID0gaXhnYl9zZXR1cF9yeF9yZXNvdXJjZXMoYWRhcHRlcikpKQorCQkJZ290byBlcnJfc2V0dXBfcng7CisJCWlmKChlcnIgPSBpeGdiX3NldHVwX3R4X3Jlc291cmNlcyhhZGFwdGVyKSkpCisJCQlnb3RvIGVycl9zZXR1cF90eDsKKworCQkvKiBzYXZlIHRoZSBuZXcsIHJlc3RvcmUgdGhlIG9sZCBpbiBvcmRlciB0byBmcmVlIGl0LAorCQkgKiB0aGVuIHJlc3RvcmUgdGhlIG5ldyBiYWNrIGFnYWluICovCisKKwkJcnhfbmV3ID0gYWRhcHRlci0+cnhfcmluZzsKKwkJdHhfbmV3ID0gYWRhcHRlci0+dHhfcmluZzsKKwkJYWRhcHRlci0+cnhfcmluZyA9IHJ4X29sZDsKKwkJYWRhcHRlci0+dHhfcmluZyA9IHR4X29sZDsKKwkJaXhnYl9mcmVlX3J4X3Jlc291cmNlcyhhZGFwdGVyKTsKKwkJaXhnYl9mcmVlX3R4X3Jlc291cmNlcyhhZGFwdGVyKTsKKwkJYWRhcHRlci0+cnhfcmluZyA9IHJ4X25ldzsKKwkJYWRhcHRlci0+dHhfcmluZyA9IHR4X25ldzsKKwkJaWYoKGVyciA9IGl4Z2JfdXAoYWRhcHRlcikpKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK2Vycl9zZXR1cF90eDoKKwlpeGdiX2ZyZWVfcnhfcmVzb3VyY2VzKGFkYXB0ZXIpOworZXJyX3NldHVwX3J4OgorCWFkYXB0ZXItPnJ4X3JpbmcgPSByeF9vbGQ7CisJYWRhcHRlci0+dHhfcmluZyA9IHR4X29sZDsKKwlpeGdiX3VwKGFkYXB0ZXIpOworCXJldHVybiBlcnI7Cit9CisKKy8qIHRvZ2dsZSBMRUQgNCB0aW1lcyBwZXIgc2Vjb25kID0gMiAiYmxpbmtzIiBwZXIgc2Vjb25kICovCisjZGVmaW5lIElYR0JfSURfSU5URVJWQUwJKEhaLzQpCisKKy8qIGJpdCBkZWZpbmVzIGZvciBhZGFwdGVyLT5sZWRfc3RhdHVzICovCisjZGVmaW5lIElYR0JfTEVEX09OCQkwCisKK3N0YXRpYyB2b2lkCitpeGdiX2xlZF9ibGlua19jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgaXhnYl9hZGFwdGVyICopZGF0YTsKKworCWlmKHRlc3RfYW5kX2NoYW5nZV9iaXQoSVhHQl9MRURfT04sICZhZGFwdGVyLT5sZWRfc3RhdHVzKSkKKwkJaXhnYl9sZWRfb2ZmKCZhZGFwdGVyLT5odyk7CisJZWxzZQorCQlpeGdiX2xlZF9vbigmYWRhcHRlci0+aHcpOworCisJbW9kX3RpbWVyKCZhZGFwdGVyLT5ibGlua190aW1lciwgamlmZmllcyArIElYR0JfSURfSU5URVJWQUwpOworfQorCitzdGF0aWMgaW50CitpeGdiX3BoeXNfaWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDMyX3QgZGF0YSkKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCisJaWYoIWRhdGEgfHwgZGF0YSA+ICh1aW50MzJfdCkoTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWikpCisJCWRhdGEgPSAodWludDMyX3QpKE1BWF9TQ0hFRFVMRV9USU1FT1VUIC8gSFopOworCisJaWYoIWFkYXB0ZXItPmJsaW5rX3RpbWVyLmZ1bmN0aW9uKSB7CisJCWluaXRfdGltZXIoJmFkYXB0ZXItPmJsaW5rX3RpbWVyKTsKKwkJYWRhcHRlci0+YmxpbmtfdGltZXIuZnVuY3Rpb24gPSBpeGdiX2xlZF9ibGlua19jYWxsYmFjazsKKwkJYWRhcHRlci0+YmxpbmtfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWFkYXB0ZXI7CisJfQorCisJbW9kX3RpbWVyKCZhZGFwdGVyLT5ibGlua190aW1lciwgamlmZmllcyk7CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCWlmKGRhdGEpCisJCXNjaGVkdWxlX3RpbWVvdXQoZGF0YSAqIEhaKTsKKwllbHNlCisJCXNjaGVkdWxlX3RpbWVvdXQoTUFYX1NDSEVEVUxFX1RJTUVPVVQpOworCisJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPmJsaW5rX3RpbWVyKTsKKwlpeGdiX2xlZF9vZmYoJmFkYXB0ZXItPmh3KTsKKwljbGVhcl9iaXQoSVhHQl9MRURfT04sICZhZGFwdGVyLT5sZWRfc3RhdHVzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IAoraXhnYl9nZXRfc3RhdHNfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlyZXR1cm4gSVhHQl9TVEFUU19MRU47Cit9CisKK3N0YXRpYyB2b2lkIAoraXhnYl9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCAKKwkJc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1aW50NjRfdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCWludCBpOworCisJaXhnYl91cGRhdGVfc3RhdHMoYWRhcHRlcik7CisJZm9yKGkgPSAwOyBpIDwgSVhHQl9TVEFUU19MRU47IGkrKykgeworCQljaGFyICpwID0gKGNoYXIgKilhZGFwdGVyK2l4Z2JfZ3N0cmluZ3Nfc3RhdHNbaV0uc3RhdF9vZmZzZXQ7CQorCQlkYXRhW2ldID0gKGl4Z2JfZ3N0cmluZ3Nfc3RhdHNbaV0uc2l6ZW9mX3N0YXQgPT0gCisJCQlzaXplb2YodWludDY0X3QpKSA/ICoodWludDY0X3QgKilwIDogKih1aW50MzJfdCAqKXA7CisJfQorfQorCitzdGF0aWMgdm9pZCAKK2l4Z2JfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDMyX3Qgc3RyaW5nc2V0LCB1aW50OF90ICpkYXRhKQoreworCWludCBpOworCisJc3dpdGNoKHN0cmluZ3NldCkgeworCWNhc2UgRVRIX1NTX1NUQVRTOgorCQlmb3IoaT0wOyBpIDwgSVhHQl9TVEFUU19MRU47IGkrKykgeworCQkJbWVtY3B5KGRhdGEgKyBpICogRVRIX0dTVFJJTkdfTEVOLCAKKwkJCWl4Z2JfZ3N0cmluZ3Nfc3RhdHNbaV0uc3RhdF9zdHJpbmcsCisJCQlFVEhfR1NUUklOR19MRU4pOworCQl9CisJCWJyZWFrOworCX0KK30KKworc3RydWN0IGV0aHRvb2xfb3BzIGl4Z2JfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncyA9IGl4Z2JfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgPSBpeGdiX3NldF9zZXR0aW5ncywKKwkuZ2V0X2RydmluZm8gPSBpeGdiX2dldF9kcnZpbmZvLAorCS5nZXRfcmVnc19sZW4gPSBpeGdiX2dldF9yZWdzX2xlbiwKKwkuZ2V0X3JlZ3MgPSBpeGdiX2dldF9yZWdzLAorCS5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9lZXByb21fbGVuID0gaXhnYl9nZXRfZWVwcm9tX2xlbiwKKwkuZ2V0X2VlcHJvbSA9IGl4Z2JfZ2V0X2VlcHJvbSwKKwkuc2V0X2VlcHJvbSA9IGl4Z2Jfc2V0X2VlcHJvbSwKKwkuZ2V0X3JpbmdwYXJhbSA9IGl4Z2JfZ2V0X3JpbmdwYXJhbSwKKwkuc2V0X3JpbmdwYXJhbSA9IGl4Z2Jfc2V0X3JpbmdwYXJhbSwKKwkuZ2V0X3BhdXNlcGFyYW0JPSBpeGdiX2dldF9wYXVzZXBhcmFtLAorCS5zZXRfcGF1c2VwYXJhbQk9IGl4Z2Jfc2V0X3BhdXNlcGFyYW0sCisJLmdldF9yeF9jc3VtID0gaXhnYl9nZXRfcnhfY3N1bSwKKwkuc2V0X3J4X2NzdW0gPSBpeGdiX3NldF9yeF9jc3VtLAorCS5nZXRfdHhfY3N1bSA9IGl4Z2JfZ2V0X3R4X2NzdW0sCisJLnNldF90eF9jc3VtID0gaXhnYl9zZXRfdHhfY3N1bSwKKwkuZ2V0X3NnCT0gZXRodG9vbF9vcF9nZXRfc2csCisJLnNldF9zZwk9IGV0aHRvb2xfb3Bfc2V0X3NnLAorI2lmZGVmIE5FVElGX0ZfVFNPCisJLmdldF90c28gPSBldGh0b29sX29wX2dldF90c28sCisJLnNldF90c28gPSBpeGdiX3NldF90c28sCisjZW5kaWYKKwkuZ2V0X3N0cmluZ3MgPSBpeGdiX2dldF9zdHJpbmdzLAorCS5waHlzX2lkID0gaXhnYl9waHlzX2lkLAorCS5nZXRfc3RhdHNfY291bnQgPSBpeGdiX2dldF9zdGF0c19jb3VudCwKKwkuZ2V0X2V0aHRvb2xfc3RhdHMgPSBpeGdiX2dldF9ldGh0b29sX3N0YXRzLAorfTsKKwordm9pZCBpeGdiX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZpeGdiX2V0aHRvb2xfb3BzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9ody5jIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX2h3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkzMjljNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9ody5jCkBAIC0wLDAgKzEsMTIwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAKKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA1IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIAorICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAorICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCAKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIAorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIAorICBtb3JlIGRldGFpbHMuCisgIAorICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSAKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgIAorICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAgCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGl4Z2JfaHcuYworICogU2hhcmVkIGZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIGFuZCBjb25maWd1cmluZyB0aGUgYWRhcHRlcgorICovCisKKyNpbmNsdWRlICJpeGdiX2h3LmgiCisjaW5jbHVkZSAiaXhnYl9pZHMuaCIKKworLyogIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHVpbnQzMl90IGl4Z2JfaGFzaF9tY19hZGRyKHN0cnVjdCBpeGdiX2h3ICpodywgdWludDhfdCAqIG1jX2FkZHIpOworCitzdGF0aWMgdm9pZCBpeGdiX210YV9zZXQoc3RydWN0IGl4Z2JfaHcgKmh3LCB1aW50MzJfdCBoYXNoX3ZhbHVlKTsKKworc3RhdGljIHZvaWQgaXhnYl9nZXRfYnVzX2luZm8oc3RydWN0IGl4Z2JfaHcgKmh3KTsKKworc3RhdGljIGJvb2xlYW5fdCBpeGdiX2xpbmtfcmVzZXQoc3RydWN0IGl4Z2JfaHcgKmh3KTsKKworc3RhdGljIHZvaWQgaXhnYl9vcHRpY3NfcmVzZXQoc3RydWN0IGl4Z2JfaHcgKmh3KTsKKworc3RhdGljIGl4Z2JfcGh5X3R5cGUgaXhnYl9pZGVudGlmeV9waHkoc3RydWN0IGl4Z2JfaHcgKmh3KTsKKwordWludDMyX3QgaXhnYl9tYWNfcmVzZXQoc3RydWN0IGl4Z2JfaHcgKmh3KTsKKwordWludDMyX3QgaXhnYl9tYWNfcmVzZXQoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXVpbnQzMl90IGN0cmxfcmVnOworCisJY3RybF9yZWcgPSAgSVhHQl9DVFJMMF9SU1QgfAorCQkJCUlYR0JfQ1RSTDBfU0RQM19ESVIgfCAgIC8qIEFsbCBwaW5zIGFyZSBPdXRwdXQ9MSAqLworCQkJCUlYR0JfQ1RSTDBfU0RQMl9ESVIgfAorCQkJCUlYR0JfQ1RSTDBfU0RQMV9ESVIgfAorCQkJCUlYR0JfQ1RSTDBfU0RQMF9ESVIgfAorCQkJCUlYR0JfQ1RSTDBfU0RQMwkgfCAgIC8qIEluaXRpYWwgdmFsdWUgMTEwMSAgICovCisJCQkJSVhHQl9DVFJMMF9TRFAyCSB8CisJCQkJSVhHQl9DVFJMMF9TRFAwOworCisjaWZkZWYgSFBfWlgxCisJLyogV29ya2Fyb3VuZCBmb3IgODI1OTdFWCByZXNldCBlcnJhdGEgKi8KKwlJWEdCX1dSSVRFX1JFR19JTyhodywgQ1RSTDAsIGN0cmxfcmVnKTsKKyNlbHNlCisJSVhHQl9XUklURV9SRUcoaHcsIENUUkwwLCBjdHJsX3JlZyk7CisjZW5kaWYKKworCS8qIERlbGF5IGEgZmV3IG1zIGp1c3QgdG8gYWxsb3cgdGhlIHJlc2V0IHRvIGNvbXBsZXRlICovCisJbXNlY19kZWxheShJWEdCX0RFTEFZX0FGVEVSX1JFU0VUKTsKKwljdHJsX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIENUUkwwKTsKKyNpZmRlZiBEQkcKKwkvKiBNYWtlIHN1cmUgdGhlIHNlbGYtY2xlYXJpbmcgZ2xvYmFsIHJlc2V0IGJpdCBkaWQgc2VsZiBjbGVhciAqLworCUFTU0VSVCghKGN0cmxfcmVnICYgSVhHQl9DVFJMMF9SU1QpKTsKKyNlbmRpZgorCisJaWYgKGh3LT5waHlfdHlwZSA9PSBpeGdiX3BoeV90eXBlX3R4bjE3NDAxKSB7CisJCWl4Z2Jfb3B0aWNzX3Jlc2V0KGh3KTsKKwl9CisKKwlyZXR1cm4gY3RybF9yZWc7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlc2V0IHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSB1bml0czsgbWFzayBhbmQgY2xlYXIgYWxsIGludGVycnVwdHMuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2xlYW5fdAoraXhnYl9hZGFwdGVyX3N0b3Aoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXVpbnQzMl90IGN0cmxfcmVnOworCXVpbnQzMl90IGljcl9yZWc7CisKKwlERUJVR0ZVTkMoIml4Z2JfYWRhcHRlcl9zdG9wIik7CisKKwkvKiBJZiB3ZSBhcmUgc3RvcHBlZCBvciByZXNldHRpbmcgZXhpdCBncmFjZWZ1bGx5IGFuZCB3YWl0IHRvIGJlCisJICogc3RhcnRlZCBhZ2FpbiBiZWZvcmUgYWNjZXNzaW5nIHRoZSBoYXJkd2FyZS4KKwkgKi8KKwlpZihody0+YWRhcHRlcl9zdG9wcGVkKSB7CisJCURFQlVHT1VUKCJFeGl0aW5nIGJlY2F1c2UgdGhlIGFkYXB0ZXIgaXMgYWxyZWFkeSBzdG9wcGVkISEhXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8qIFNldCB0aGUgQWRhcHRlciBTdG9wcGVkIGZsYWcgc28gb3RoZXIgZHJpdmVyIGZ1bmN0aW9ucyBzdG9wCisJICogdG91Y2hpbmcgdGhlIEhhcmR3YXJlLgorCSAqLworCWh3LT5hZGFwdGVyX3N0b3BwZWQgPSBUUlVFOworCisJLyogQ2xlYXIgaW50ZXJydXB0IG1hc2sgdG8gc3RvcCBib2FyZCBmcm9tIGdlbmVyYXRpbmcgaW50ZXJydXB0cyAqLworCURFQlVHT1VUKCJNYXNraW5nIG9mZiBhbGwgaW50ZXJydXB0c1xuIik7CisJSVhHQl9XUklURV9SRUcoaHcsIElNQywgMHhGRkZGRkZGRik7CisKKwkvKiBEaXNhYmxlIHRoZSBUcmFuc21pdCBhbmQgUmVjZWl2ZSB1bml0cy4gIFRoZW4gZGVsYXkgdG8gYWxsb3cKKwkgKiBhbnkgcGVuZGluZyB0cmFuc2FjdGlvbnMgdG8gY29tcGxldGUgYmVmb3JlIHdlIGhpdCB0aGUgTUFDIHdpdGgKKwkgKiB0aGUgZ2xvYmFsIHJlc2V0LgorCSAqLworCUlYR0JfV1JJVEVfUkVHKGh3LCBSQ1RMLCBJWEdCX1JFQURfUkVHKGh3LCBSQ1RMKSAmIH5JWEdCX1JDVExfUlhFTik7CisJSVhHQl9XUklURV9SRUcoaHcsIFRDVEwsIElYR0JfUkVBRF9SRUcoaHcsIFRDVEwpICYgfklYR0JfVENUTF9UWEVOKTsKKwltc2VjX2RlbGF5KElYR0JfREVMQVlfQkVGT1JFX1JFU0VUKTsKKworCS8qIElzc3VlIGEgZ2xvYmFsIHJlc2V0IHRvIHRoZSBNQUMuICBUaGlzIHdpbGwgcmVzZXQgdGhlIGNoaXAncworCSAqIHRyYW5zbWl0LCByZWNlaXZlLCBETUEsIGFuZCBsaW5rIHVuaXRzLiAgSXQgd2lsbCBub3QgZWZmZWN0CisJICogdGhlIGN1cnJlbnQgUENJIGNvbmZpZ3VyYXRpb24uICBUaGUgZ2xvYmFsIHJlc2V0IGJpdCBpcyBzZWxmLQorCSAqIGNsZWFyaW5nLCBhbmQgc2hvdWxkIGNsZWFyIHdpdGhpbiBhIG1pY3Jvc2Vjb25kLgorCSAqLworCURFQlVHT1VUKCJJc3N1aW5nIGEgZ2xvYmFsIHJlc2V0IHRvIE1BQ1xuIik7CisKKwljdHJsX3JlZyA9IGl4Z2JfbWFjX3Jlc2V0KGh3KTsKKworCS8qIENsZWFyIGludGVycnVwdCBtYXNrIHRvIHN0b3AgYm9hcmQgZnJvbSBnZW5lcmF0aW5nIGludGVycnVwdHMgKi8KKwlERUJVR09VVCgiTWFza2luZyBvZmYgYWxsIGludGVycnVwdHNcbiIpOworCUlYR0JfV1JJVEVfUkVHKGh3LCBJTUMsIDB4ZmZmZmZmZmYpOworCisJLyogQ2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0IGV2ZW50cy4gKi8KKwlpY3JfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgSUNSKTsKKworCXJldHVybiAoY3RybF9yZWcgJiBJWEdCX0NUUkwwX1JTVCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSWRlbnRpZmllcyB0aGUgdmVuZG9yIG9mIHRoZSBvcHRpY3MgbW9kdWxlIG9uIHRoZSBhZGFwdGVyLiAgVGhlIFNSIGFkYXB0ZXJzCisgKiBzdXBwb3J0IHR3byBkaWZmZXJlbnQgdHlwZXMgb2YgWFBBSyBvcHRpY3MsIHNvIGl0IGlzIG5lY2Vzc2FyeSB0byBkZXRlcm1pbmUKKyAqIHdoaWNoIG9wdGljcyBhcmUgcHJlc2VudCBiZWZvcmUgYXBwbHlpbmcgYW55IG9wdGljcy1zcGVjaWZpYyB3b3JrYXJvdW5kcy4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZS4KKyAqCisgKiBSZXR1cm5zOiB0aGUgdmVuZG9yIG9mIHRoZSBYUEFLIG9wdGljcyBtb2R1bGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaXhnYl94cGFrX3ZlbmRvcgoraXhnYl9pZGVudGlmeV94cGFrX3ZlbmRvcihzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJdWludDMyX3QgaTsKKwl1aW50MTZfdCB2ZW5kb3JfbmFtZVs1XTsKKwlpeGdiX3hwYWtfdmVuZG9yIHhwYWtfdmVuZG9yOworCisJREVCVUdGVU5DKCJpeGdiX2lkZW50aWZ5X3hwYWtfdmVuZG9yIik7CisKKwkvKiBSZWFkIHRoZSBmaXJzdCBmZXcgYnl0ZXMgb2YgdGhlIHZlbmRvciBzdHJpbmcgZnJvbSB0aGUgWFBBSyBOVlIKKwkgKiByZWdpc3RlcnMuICBUaGVzZSBhcmUgc3RhbmRhcmQgWEVOUEFLL1hQQUsgcmVnaXN0ZXJzLCBzbyBhbGwgWFBBSworCSAqIGRldmljZXMgc2hvdWxkIGltcGxlbWVudCB0aGVtLiAqLworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJdmVuZG9yX25hbWVbaV0gPSBpeGdiX3JlYWRfcGh5X3JlZyhodywKKwkJCQkJCSAgIE1ESU9fUE1BX1BNRF9YUEFLX1ZFTkRPUl9OQU1FCisJCQkJCQkgICArIGksIElYR0JfUEhZX0FERFJFU1MsCisJCQkJCQkgICBNRElPX1BNQV9QTURfRElEKTsKKwl9CisKKwkvKiBEZXRlcm1pbmUgdGhlIGFjdHVhbCB2ZW5kb3IgKi8KKwlpZiAodmVuZG9yX25hbWVbMF0gPT0gJ0knICYmCisJICAgIHZlbmRvcl9uYW1lWzFdID09ICdOJyAmJgorCSAgICB2ZW5kb3JfbmFtZVsyXSA9PSAnVCcgJiYKKwkgICAgdmVuZG9yX25hbWVbM10gPT0gJ0UnICYmIHZlbmRvcl9uYW1lWzRdID09ICdMJykgeworCQl4cGFrX3ZlbmRvciA9IGl4Z2JfeHBha192ZW5kb3JfaW50ZWw7CisJfSBlbHNlIHsKKwkJeHBha192ZW5kb3IgPSBpeGdiX3hwYWtfdmVuZG9yX2luZmluZW9uOworCX0KKworCXJldHVybiAoeHBha192ZW5kb3IpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZXRlcm1pbmUgdGhlIHBoeXNpY2FsIGxheWVyIG1vZHVsZSBvbiB0aGUgYWRhcHRlci4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZS4gIFRoZSBkZXZpY2VfaWQKKyAqICAgICAgZmllbGQgbXVzdCBiZSAoY29ycmVjdGx5KSBwb3B1bGF0ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLgorICoKKyAqIFJldHVybnM6IHRoZSBwaHkgdHlwZSBvZiB0aGUgYWRhcHRlci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpeGdiX3BoeV90eXBlCitpeGdiX2lkZW50aWZ5X3BoeShzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJaXhnYl9waHlfdHlwZSBwaHlfdHlwZTsKKwlpeGdiX3hwYWtfdmVuZG9yIHhwYWtfdmVuZG9yOworCisJREVCVUdGVU5DKCJpeGdiX2lkZW50aWZ5X3BoeSIpOworCisJLyogSW5mZXIgdGhlIHRyYW5zY2VpdmVyL3BoeSB0eXBlIGZyb20gdGhlIGRldmljZSBpZCAqLworCXN3aXRjaCAoaHctPmRldmljZV9pZCkgeworCWNhc2UgSVhHQl9ERVZJQ0VfSURfODI1OTdFWDoKKwkJREVCVUdPVVQoIklkZW50aWZpZWQgVFhOMTc0MDEgb3B0aWNzXG4iKTsKKwkJcGh5X3R5cGUgPSBpeGdiX3BoeV90eXBlX3R4bjE3NDAxOworCQlicmVhazsKKworCWNhc2UgSVhHQl9ERVZJQ0VfSURfODI1OTdFWF9TUjoKKwkJLyogVGhlIFNSIGFkYXB0ZXJzIGNhcnJ5IHR3byBkaWZmZXJlbnQgdHlwZXMgb2YgWFBBSyBvcHRpY3MKKwkJICogbW9kdWxlczsgcmVhZCB0aGUgdmVuZG9yIGlkZW50aWZpZXIgdG8gZGV0ZXJtaW5lIHRoZSBleGFjdAorCQkgKiB0eXBlIG9mIG9wdGljcy4gKi8KKwkJeHBha192ZW5kb3IgPSBpeGdiX2lkZW50aWZ5X3hwYWtfdmVuZG9yKGh3KTsKKwkJaWYgKHhwYWtfdmVuZG9yID09IGl4Z2JfeHBha192ZW5kb3JfaW50ZWwpIHsKKwkJCURFQlVHT1VUKCJJZGVudGlmaWVkIFRYTjE3MjAxIG9wdGljc1xuIik7CisJCQlwaHlfdHlwZSA9IGl4Z2JfcGh5X3R5cGVfdHhuMTcyMDE7CisJCX0gZWxzZSB7CisJCQlERUJVR09VVCgiSWRlbnRpZmllZCBHNjAwNSBvcHRpY3NcbiIpOworCQkJcGh5X3R5cGUgPSBpeGdiX3BoeV90eXBlX2c2MDA1OworCQl9CisJCWJyZWFrOworCWNhc2UgSVhHQl9ERVZJQ0VfSURfODI1OTdFWF9MUjoKKwkJREVCVUdPVVQoIklkZW50aWZpZWQgRzYxMDQgb3B0aWNzXG4iKTsKKwkJcGh5X3R5cGUgPSBpeGdiX3BoeV90eXBlX2c2MTA0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR09VVCgiVW5rbm93biBwaHlzaWNhbCBsYXllciBtb2R1bGVcbiIpOworCQlwaHlfdHlwZSA9IGl4Z2JfcGh5X3R5cGVfdW5rbm93bjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIChwaHlfdHlwZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBlcmZvcm1zIGJhc2ljIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGFkYXB0ZXIuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBSZXNldHMgdGhlIGNvbnRyb2xsZXIuCisgKiBSZWFkcyBhbmQgdmFsaWRhdGVzIHRoZSBFRVBST00uCisgKiBJbml0aWFsaXplcyB0aGUgcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVycy4KKyAqIEluaXRpYWxpemVzIHRoZSBtdWx0aWNhc3QgdGFibGUuCisgKiBDbGVhcnMgYWxsIG9uLWNoaXAgY291bnRlcnMuCisgKiBDYWxscyByb3V0aW5lIHRvIHNldHVwIGZsb3cgY29udHJvbCBzZXR0aW5ncy4KKyAqIExlYXZlcyB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgdW5pdHMgZGlzYWJsZWQgYW5kIHVuaW5pdGlhbGl6ZWQuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgVFJVRSBpZiBzdWNjZXNzZnVsLAorICogICAgICBGQUxTRSBpZiB1bnJlY292ZXJhYmxlIHByb2JsZW1zIHdlcmUgZW5jb3VudGVyZWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sZWFuX3QKK2l4Z2JfaW5pdF9odyhzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJdWludDMyX3QgaTsKKwl1aW50MzJfdCBjdHJsX3JlZzsKKwlib29sZWFuX3Qgc3RhdHVzOworCisJREVCVUdGVU5DKCJpeGdiX2luaXRfaHciKTsKKworCS8qIElzc3VlIGEgZ2xvYmFsIHJlc2V0IHRvIHRoZSBNQUMuICBUaGlzIHdpbGwgcmVzZXQgdGhlIGNoaXAncworCSAqIHRyYW5zbWl0LCByZWNlaXZlLCBETUEsIGFuZCBsaW5rIHVuaXRzLiAgSXQgd2lsbCBub3QgZWZmZWN0CisJICogdGhlIGN1cnJlbnQgUENJIGNvbmZpZ3VyYXRpb24uICBUaGUgZ2xvYmFsIHJlc2V0IGJpdCBpcyBzZWxmLQorCSAqIGNsZWFyaW5nLCBhbmQgc2hvdWxkIGNsZWFyIHdpdGhpbiBhIG1pY3Jvc2Vjb25kLgorCSAqLworCURFQlVHT1VUKCJJc3N1aW5nIGEgZ2xvYmFsIHJlc2V0IHRvIE1BQ1xuIik7CisKKwljdHJsX3JlZyA9IGl4Z2JfbWFjX3Jlc2V0KGh3KTsKKworCURFQlVHT1VUKCJJc3N1aW5nIGFuIEVFIHJlc2V0IHRvIE1BQ1xuIik7CisjaWZkZWYgSFBfWlgxCisJLyogV29ya2Fyb3VuZCBmb3IgODI1OTdFWCByZXNldCBlcnJhdGEgKi8KKwlJWEdCX1dSSVRFX1JFR19JTyhodywgQ1RSTDEsIElYR0JfQ1RSTDFfRUVfUlNUKTsKKyNlbHNlCisJSVhHQl9XUklURV9SRUcoaHcsIENUUkwxLCBJWEdCX0NUUkwxX0VFX1JTVCk7CisjZW5kaWYKKworCS8qIERlbGF5IGEgZmV3IG1zIGp1c3QgdG8gYWxsb3cgdGhlIHJlc2V0IHRvIGNvbXBsZXRlICovCisJbXNlY19kZWxheShJWEdCX0RFTEFZX0FGVEVSX0VFX1JFU0VUKTsKKworCWlmIChpeGdiX2dldF9lZXByb21fZGF0YShodykgPT0gRkFMU0UpIHsKKwkJcmV0dXJuKEZBTFNFKTsKKwl9CisKKwkvKiBVc2UgdGhlIGRldmljZSBpZCB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgcGh5L3RyYW5zY2VpdmVyLiAqLworCWh3LT5kZXZpY2VfaWQgPSBpeGdiX2dldF9lZV9kZXZpY2VfaWQoaHcpOworCWh3LT5waHlfdHlwZSA9IGl4Z2JfaWRlbnRpZnlfcGh5KGh3KTsKKworCS8qIFNldHVwIHRoZSByZWNlaXZlIGFkZHJlc3Nlcy4KKwkgKiBSZWNlaXZlIEFkZHJlc3MgUmVnaXN0ZXJzIChSQVJzIDAgLSAxNSkuCisJICovCisJaXhnYl9pbml0X3J4X2FkZHJzKGh3KTsKKworCS8qCisJICogQ2hlY2sgdGhhdCBhIHZhbGlkIE1BQyBhZGRyZXNzIGhhcyBiZWVuIHNldC4KKwkgKiBJZiBpdCBpcyBub3QgdmFsaWQsIHdlIGZhaWwgaGFyZHdhcmUgaW5pdC4KKwkgKi8KKwlpZiAoIW1hY19hZGRyX3ZhbGlkKGh3LT5jdXJyX21hY19hZGRyKSkgeworCQlERUJVR09VVCgiTUFDIGFkZHJlc3MgaW52YWxpZCBhZnRlciBpeGdiX2luaXRfcnhfYWRkcnNcbiIpOworCQlyZXR1cm4oRkFMU0UpOworCX0KKworCS8qIHRlbGwgdGhlIHJvdXRpbmVzIGluIHRoaXMgZmlsZSB0aGV5IGNhbiBhY2Nlc3MgaGFyZHdhcmUgYWdhaW4gKi8KKwlody0+YWRhcHRlcl9zdG9wcGVkID0gRkFMU0U7CisKKwkvKiBGaWxsIGluIHRoZSBidXNfaW5mbyBzdHJ1Y3R1cmUgKi8KKwlpeGdiX2dldF9idXNfaW5mbyhodyk7CisKKwkvKiBaZXJvIG91dCB0aGUgTXVsdGljYXN0IEhBU0ggdGFibGUgKi8KKwlERUJVR09VVCgiWmVyb2luZyB0aGUgTVRBXG4iKTsKKwlmb3IoaSA9IDA7IGkgPCBJWEdCX01DX1RCTF9TSVpFOyBpKyspCisJCUlYR0JfV1JJVEVfUkVHX0FSUkFZKGh3LCBNVEEsIGksIDApOworCisJLyogWmVybyBvdXQgdGhlIFZMQU4gRmlsdGVyIFRhYmxlIEFycmF5ICovCisJaXhnYl9jbGVhcl92ZnRhKGh3KTsKKworCS8qIFplcm8gYWxsIG9mIHRoZSBoYXJkd2FyZSBjb3VudGVycyAqLworCWl4Z2JfY2xlYXJfaHdfY250cnMoaHcpOworCisJLyogQ2FsbCBhIHN1YnJvdXRpbmUgdG8gc2V0dXAgZmxvdyBjb250cm9sLiAqLworCXN0YXR1cyA9IGl4Z2Jfc2V0dXBfZmMoaHcpOworCisJLyogODI1OTdFWCBlcnJhdGE6IENhbGwgY2hlY2stZm9yLWxpbmsgaW4gY2FzZSBsYW5lIGRlc2tldyBpcyBsb2NrZWQgKi8KKwlpeGdiX2NoZWNrX2Zvcl9saW5rKGh3KTsKKworCXJldHVybiAoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW5pdGlhbGl6ZXMgcmVjZWl2ZSBhZGRyZXNzIGZpbHRlcnMuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqCisgKiBQbGFjZXMgdGhlIE1BQyBhZGRyZXNzIGluIHJlY2VpdmUgYWRkcmVzcyByZWdpc3RlciAwIGFuZCBjbGVhcnMgdGhlIHJlc3QKKyAqIG9mIHRoZSByZWNlaXZlIGFkZHJlc3NzIHJlZ2lzdGVycy4gQ2xlYXJzIHRoZSBtdWx0aWNhc3QgdGFibGUuIEFzc3VtZXMKKyAqIHRoZSByZWNlaXZlciBpcyBpbiByZXNldCB3aGVuIHRoZSByb3V0aW5lIGlzIGNhbGxlZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2l4Z2JfaW5pdF9yeF9hZGRycyhzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJdWludDMyX3QgaTsKKworCURFQlVHRlVOQygiaXhnYl9pbml0X3J4X2FkZHJzIik7CisKKwkvKgorCSAqIElmIHRoZSBjdXJyZW50IG1hYyBhZGRyZXNzIGlzIHZhbGlkLCBhc3N1bWUgaXQgaXMgYSBzb2Z0d2FyZSBvdmVycmlkZQorCSAqIHRvIHRoZSBwZXJtYW5lbnQgYWRkcmVzcy4KKwkgKiBPdGhlcndpc2UsIHVzZSB0aGUgcGVybWFuZW50IGFkZHJlc3MgZnJvbSB0aGUgZWVwcm9tLgorCSAqLworCWlmICghbWFjX2FkZHJfdmFsaWQoaHctPmN1cnJfbWFjX2FkZHIpKSB7CisKKwkJLyogR2V0IHRoZSBNQUMgYWRkcmVzcyBmcm9tIHRoZSBlZXByb20gZm9yIGxhdGVyIHJlZmVyZW5jZSAqLworCQlpeGdiX2dldF9lZV9tYWNfYWRkcihodywgaHctPmN1cnJfbWFjX2FkZHIpOworCisJCURFQlVHT1VUMygiIEtlZXBpbmcgUGVybWFuZW50IE1BQyBBZGRyID0lLjJYICUuMlggJS4yWCAiLAorCQkJICBody0+Y3Vycl9tYWNfYWRkclswXSwKKwkJCSAgaHctPmN1cnJfbWFjX2FkZHJbMV0sIGh3LT5jdXJyX21hY19hZGRyWzJdKTsKKwkJREVCVUdPVVQzKCIlLjJYICUuMlggJS4yWFxuIiwKKwkJCSAgaHctPmN1cnJfbWFjX2FkZHJbM10sCisJCQkgIGh3LT5jdXJyX21hY19hZGRyWzRdLCBody0+Y3Vycl9tYWNfYWRkcls1XSk7CisJfSBlbHNlIHsKKworCQkvKiBTZXR1cCB0aGUgcmVjZWl2ZSBhZGRyZXNzLiAqLworCQlERUJVR09VVCgiT3ZlcnJpZGluZyBNQUMgQWRkcmVzcyBpbiBSQVJbMF1cbiIpOworCQlERUJVR09VVDMoIiBOZXcgTUFDIEFkZHIgPSUuMlggJS4yWCAlLjJYICIsCisJCQkgIGh3LT5jdXJyX21hY19hZGRyWzBdLAorCQkJICBody0+Y3Vycl9tYWNfYWRkclsxXSwgaHctPmN1cnJfbWFjX2FkZHJbMl0pOworCQlERUJVR09VVDMoIiUuMlggJS4yWCAlLjJYXG4iLAorCQkJICBody0+Y3Vycl9tYWNfYWRkclszXSwKKwkJCSAgaHctPmN1cnJfbWFjX2FkZHJbNF0sIGh3LT5jdXJyX21hY19hZGRyWzVdKTsKKworCQlpeGdiX3Jhcl9zZXQoaHcsIGh3LT5jdXJyX21hY19hZGRyLCAwKTsKKwl9CisKKwkvKiBaZXJvIG91dCB0aGUgb3RoZXIgMTUgcmVjZWl2ZSBhZGRyZXNzZXMuICovCisJREVCVUdPVVQoIkNsZWFyaW5nIFJBUlsxLTE1XVxuIik7CisJZm9yKGkgPSAxOyBpIDwgSVhHQl9SQVJfRU5UUklFUzsgaSsrKSB7CisJCUlYR0JfV1JJVEVfUkVHX0FSUkFZKGh3LCBSQSwgKGkgPDwgMSksIDApOworCQlJWEdCX1dSSVRFX1JFR19BUlJBWShodywgUkEsICgoaSA8PCAxKSArIDEpLCAwKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFVwZGF0ZXMgdGhlIE1BQydzIGxpc3Qgb2YgbXVsdGljYXN0IGFkZHJlc3Nlcy4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogbWNfYWRkcl9saXN0IC0gdGhlIGxpc3Qgb2YgbmV3IG11bHRpY2FzdCBhZGRyZXNzZXMKKyAqIG1jX2FkZHJfY291bnQgLSBudW1iZXIgb2YgYWRkcmVzc2VzCisgKiBwYWQgLSBudW1iZXIgb2YgYnl0ZXMgYmV0d2VlbiBhZGRyZXNzZXMgaW4gdGhlIGxpc3QKKyAqCisgKiBUaGUgZ2l2ZW4gbGlzdCByZXBsYWNlcyBhbnkgZXhpc3RpbmcgbGlzdC4gQ2xlYXJzIHRoZSBsYXN0IDE1IHJlY2VpdmUKKyAqIGFkZHJlc3MgcmVnaXN0ZXJzIGFuZCB0aGUgbXVsdGljYXN0IHRhYmxlLiBVc2VzIHJlY2VpdmUgYWRkcmVzcyByZWdpc3RlcnMKKyAqIGZvciB0aGUgZmlyc3QgMTUgbXVsdGljYXN0IGFkZHJlc3NlcywgYW5kIGhhc2hlcyB0aGUgcmVzdCBpbnRvIHRoZQorICogbXVsdGljYXN0IHRhYmxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAoraXhnYl9tY19hZGRyX2xpc3RfdXBkYXRlKHN0cnVjdCBpeGdiX2h3ICpodywKKwkJCSAgdWludDhfdCAqbWNfYWRkcl9saXN0LAorCQkJICB1aW50MzJfdCBtY19hZGRyX2NvdW50LAorCQkJICB1aW50MzJfdCBwYWQpCit7CisJdWludDMyX3QgaGFzaF92YWx1ZTsKKwl1aW50MzJfdCBpOworCXVpbnQzMl90IHJhcl91c2VkX2NvdW50ID0gMTsJCS8qIFJBUlswXSBpcyB1c2VkIGZvciBvdXIgTUFDIGFkZHJlc3MgKi8KKworCURFQlVHRlVOQygiaXhnYl9tY19hZGRyX2xpc3RfdXBkYXRlIik7CisKKwkvKiBTZXQgdGhlIG5ldyBudW1iZXIgb2YgTUMgYWRkcmVzc2VzIHRoYXQgd2UgYXJlIGJlaW5nIHJlcXVlc3RlZCB0byB1c2UuICovCisJaHctPm51bV9tY19hZGRycyA9IG1jX2FkZHJfY291bnQ7CisKKwkvKiBDbGVhciBSQVJbMS0xNV0gKi8KKwlERUJVR09VVCgiIENsZWFyaW5nIFJBUlsxLTE1XVxuIik7CisJZm9yKGkgPSByYXJfdXNlZF9jb3VudDsgaSA8IElYR0JfUkFSX0VOVFJJRVM7IGkrKykgeworCQlJWEdCX1dSSVRFX1JFR19BUlJBWShodywgUkEsIChpIDw8IDEpLCAwKTsKKwkJSVhHQl9XUklURV9SRUdfQVJSQVkoaHcsIFJBLCAoKGkgPDwgMSkgKyAxKSwgMCk7CisJfQorCisJLyogQ2xlYXIgdGhlIE1UQSAqLworCURFQlVHT1VUKCIgQ2xlYXJpbmcgTVRBXG4iKTsKKwlmb3IoaSA9IDA7IGkgPCBJWEdCX01DX1RCTF9TSVpFOyBpKyspIHsKKwkJSVhHQl9XUklURV9SRUdfQVJSQVkoaHcsIE1UQSwgaSwgMCk7CisJfQorCisJLyogQWRkIHRoZSBuZXcgYWRkcmVzc2VzICovCisJZm9yKGkgPSAwOyBpIDwgbWNfYWRkcl9jb3VudDsgaSsrKSB7CisJCURFQlVHT1VUKCIgQWRkaW5nIHRoZSBtdWx0aWNhc3QgYWRkcmVzc2VzOlxuIik7CisJCURFQlVHT1VUNygiIE1DIEFkZHIgIyVkID0lLjJYICUuMlggJS4yWCAlLjJYICUuMlggJS4yWFxuIiwgaSwKKwkJCSAgbWNfYWRkcl9saXN0W2kgKiAoSVhHQl9FVEhfTEVOR1RIX09GX0FERFJFU1MgKyBwYWQpXSwKKwkJCSAgbWNfYWRkcl9saXN0W2kgKiAoSVhHQl9FVEhfTEVOR1RIX09GX0FERFJFU1MgKyBwYWQpICsKKwkJCQkgICAgICAgMV0sCisJCQkgIG1jX2FkZHJfbGlzdFtpICogKElYR0JfRVRIX0xFTkdUSF9PRl9BRERSRVNTICsgcGFkKSArCisJCQkJICAgICAgIDJdLAorCQkJICBtY19hZGRyX2xpc3RbaSAqIChJWEdCX0VUSF9MRU5HVEhfT0ZfQUREUkVTUyArIHBhZCkgKworCQkJCSAgICAgICAzXSwKKwkJCSAgbWNfYWRkcl9saXN0W2kgKiAoSVhHQl9FVEhfTEVOR1RIX09GX0FERFJFU1MgKyBwYWQpICsKKwkJCQkgICAgICAgNF0sCisJCQkgIG1jX2FkZHJfbGlzdFtpICogKElYR0JfRVRIX0xFTkdUSF9PRl9BRERSRVNTICsgcGFkKSArCisJCQkJICAgICAgIDVdKTsKKworCQkvKiBQbGFjZSB0aGlzIG11bHRpY2FzdCBhZGRyZXNzIGluIHRoZSBSQVIgaWYgdGhlcmUgaXMgcm9vbSwgKgorCQkgKiBlbHNlIHB1dCBpdCBpbiB0aGUgTVRBCisJCSAqLworCQlpZihyYXJfdXNlZF9jb3VudCA8IElYR0JfUkFSX0VOVFJJRVMpIHsKKwkJCWl4Z2JfcmFyX3NldChodywKKwkJCQkgICAgIG1jX2FkZHJfbGlzdCArCisJCQkJICAgICAoaSAqIChJWEdCX0VUSF9MRU5HVEhfT0ZfQUREUkVTUyArIHBhZCkpLAorCQkJCSAgICAgcmFyX3VzZWRfY291bnQpOworCQkJREVCVUdPVVQxKCJBZGRlZCBhIG11bHRpY2FzdCBhZGRyZXNzIHRvIFJBUlslZF1cbiIsIGkpOworCQkJcmFyX3VzZWRfY291bnQrKzsKKwkJfSBlbHNlIHsKKwkJCWhhc2hfdmFsdWUgPSBpeGdiX2hhc2hfbWNfYWRkcihodywKKwkJCQkJCSAgICAgICBtY19hZGRyX2xpc3QgKworCQkJCQkJICAgICAgIChpICoKKwkJCQkJCQkoSVhHQl9FVEhfTEVOR1RIX09GX0FERFJFU1MKKwkJCQkJCQkgKyBwYWQpKSk7CisKKwkJCURFQlVHT1VUMSgiIEhhc2ggdmFsdWUgPSAweCUwM1hcbiIsIGhhc2hfdmFsdWUpOworCisJCQlpeGdiX210YV9zZXQoaHcsIGhhc2hfdmFsdWUpOworCQl9CisJfQorCisJREVCVUdPVVQoIk1DIFVwZGF0ZSBDb21wbGV0ZVxuIik7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBIYXNoZXMgYW4gYWRkcmVzcyB0byBkZXRlcm1pbmUgaXRzIGxvY2F0aW9uIGluIHRoZSBtdWx0aWNhc3QgdGFibGUKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogbWNfYWRkciAtIHRoZSBtdWx0aWNhc3QgYWRkcmVzcyB0byBoYXNoCisgKgorICogUmV0dXJuczoKKyAqICAgICAgVGhlIGhhc2ggdmFsdWUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1aW50MzJfdAoraXhnYl9oYXNoX21jX2FkZHIoc3RydWN0IGl4Z2JfaHcgKmh3LAorCQkgICB1aW50OF90ICptY19hZGRyKQoreworCXVpbnQzMl90IGhhc2hfdmFsdWUgPSAwOworCisJREVCVUdGVU5DKCJpeGdiX2hhc2hfbWNfYWRkciIpOworCisJLyogVGhlIHBvcnRpb24gb2YgdGhlIGFkZHJlc3MgdGhhdCBpcyB1c2VkIGZvciB0aGUgaGFzaCB0YWJsZSBpcworCSAqIGRldGVybWluZWQgYnkgdGhlIG1jX2ZpbHRlcl90eXBlIHNldHRpbmcuCisJICovCisJc3dpdGNoIChody0+bWNfZmlsdGVyX3R5cGUpIHsKKwkJLyogWzBdIFsxXSBbMl0gWzNdIFs0XSBbNV0KKwkJICogMDEgIEFBICAwMCAgMTIgIDM0ICA1NgorCQkgKiBMU0IgICAgICAgICAgICAgICAgIE1TQiAtIEFjY29yZGluZyB0byBIL1cgZG9jcyAqLworCWNhc2UgMDoKKwkJLyogWzQ3OjM2XSBpLmUuIDB4NTYzIGZvciBhYm92ZSBleGFtcGxlIGFkZHJlc3MgKi8KKwkJaGFzaF92YWx1ZSA9CisJCSAgICAoKG1jX2FkZHJbNF0gPj4gNCkgfCAoKCh1aW50MTZfdCkgbWNfYWRkcls1XSkgPDwgNCkpOworCQlicmVhazsKKwljYXNlIDE6CQkvKiBbNDY6MzVdIGkuZS4gMHhBQzYgZm9yIGFib3ZlIGV4YW1wbGUgYWRkcmVzcyAqLworCQloYXNoX3ZhbHVlID0KKwkJICAgICgobWNfYWRkcls0XSA+PiAzKSB8ICgoKHVpbnQxNl90KSBtY19hZGRyWzVdKSA8PCA1KSk7CisJCWJyZWFrOworCWNhc2UgMjoJCS8qIFs0NTozNF0gaS5lLiAweDVEOCBmb3IgYWJvdmUgZXhhbXBsZSBhZGRyZXNzICovCisJCWhhc2hfdmFsdWUgPQorCQkgICAgKChtY19hZGRyWzRdID4+IDIpIHwgKCgodWludDE2X3QpIG1jX2FkZHJbNV0pIDw8IDYpKTsKKwkJYnJlYWs7CisJY2FzZSAzOgkJLyogWzQzOjMyXSBpLmUuIDB4NjM0IGZvciBhYm92ZSBleGFtcGxlIGFkZHJlc3MgKi8KKwkJaGFzaF92YWx1ZSA9ICgobWNfYWRkcls0XSkgfCAoKCh1aW50MTZfdCkgbWNfYWRkcls1XSkgPDwgOCkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBJbnZhbGlkIG1jX2ZpbHRlcl90eXBlLCB3aGF0IHNob3VsZCB3ZSBkbz8gKi8KKwkJREVCVUdPVVQoIk1DIGZpbHRlciB0eXBlIHBhcmFtIHNldCBpbmNvcnJlY3RseVxuIik7CisJCUFTU0VSVCgwKTsKKwkJYnJlYWs7CisJfQorCisJaGFzaF92YWx1ZSAmPSAweEZGRjsKKwlyZXR1cm4gKGhhc2hfdmFsdWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTZXRzIHRoZSBiaXQgaW4gdGhlIG11bHRpY2FzdCB0YWJsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBoYXNoIHZhbHVlLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBoYXNoX3ZhbHVlIC0gTXVsdGljYXN0IGFkZHJlc3MgaGFzaCB2YWx1ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2l4Z2JfbXRhX3NldChzdHJ1Y3QgaXhnYl9odyAqaHcsCisJCSAgdWludDMyX3QgaGFzaF92YWx1ZSkKK3sKKwl1aW50MzJfdCBoYXNoX2JpdCwgaGFzaF9yZWc7CisJdWludDMyX3QgbXRhX3JlZzsKKworCS8qIFRoZSBNVEEgaXMgYSByZWdpc3RlciBhcnJheSBvZiAxMjggMzItYml0IHJlZ2lzdGVycy4KKwkgKiBJdCBpcyB0cmVhdGVkIGxpa2UgYW4gYXJyYXkgb2YgNDA5NiBiaXRzLiAgV2Ugd2FudCB0byBzZXQKKwkgKiBiaXQgQml0QXJyYXlbaGFzaF92YWx1ZV0uIFNvIHdlIGZpZ3VyZSBvdXQgd2hhdCByZWdpc3RlcgorCSAqIHRoZSBiaXQgaXMgaW4sIHJlYWQgaXQsIE9SIGluIHRoZSBuZXcgYml0LCB0aGVuIHdyaXRlCisJICogYmFjayB0aGUgbmV3IHZhbHVlLiAgVGhlIHJlZ2lzdGVyIGlzIGRldGVybWluZWQgYnkgdGhlCisJICogdXBwZXIgNyBiaXRzIG9mIHRoZSBoYXNoIHZhbHVlIGFuZCB0aGUgYml0IHdpdGhpbiB0aGF0CisJICogcmVnaXN0ZXIgYXJlIGRldGVybWluZWQgYnkgdGhlIGxvd2VyIDUgYml0cyBvZiB0aGUgdmFsdWUuCisJICovCisJaGFzaF9yZWcgPSAoaGFzaF92YWx1ZSA+PiA1KSAmIDB4N0Y7CisJaGFzaF9iaXQgPSBoYXNoX3ZhbHVlICYgMHgxRjsKKworCW10YV9yZWcgPSBJWEdCX1JFQURfUkVHX0FSUkFZKGh3LCBNVEEsIGhhc2hfcmVnKTsKKworCW10YV9yZWcgfD0gKDEgPDwgaGFzaF9iaXQpOworCisJSVhHQl9XUklURV9SRUdfQVJSQVkoaHcsIE1UQSwgaGFzaF9yZWcsIG10YV9yZWcpOworCisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQdXRzIGFuIGV0aGVybmV0IGFkZHJlc3MgaW50byBhIHJlY2VpdmUgYWRkcmVzcyByZWdpc3Rlci4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICogYWRkciAtIEFkZHJlc3MgdG8gcHV0IGludG8gcmVjZWl2ZSBhZGRyZXNzIHJlZ2lzdGVyCisgKiBpbmRleCAtIFJlY2VpdmUgYWRkcmVzcyByZWdpc3RlciB0byB3cml0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAoraXhnYl9yYXJfc2V0KHN0cnVjdCBpeGdiX2h3ICpodywKKwkJICB1aW50OF90ICphZGRyLAorCQkgIHVpbnQzMl90IGluZGV4KQoreworCXVpbnQzMl90IHJhcl9sb3csIHJhcl9oaWdoOworCisJREVCVUdGVU5DKCJpeGdiX3Jhcl9zZXQiKTsKKworCS8qIEhXIGV4cGVjdHMgdGhlc2UgaW4gbGl0dGxlIGVuZGlhbiBzbyB3ZSByZXZlcnNlIHRoZSBieXRlIG9yZGVyCisJICogZnJvbSBuZXR3b3JrIG9yZGVyIChiaWcgZW5kaWFuKSB0byBsaXR0bGUgZW5kaWFuCisJICovCisJcmFyX2xvdyA9ICgodWludDMyX3QpIGFkZHJbMF0gfAorCQkgICAoKHVpbnQzMl90KWFkZHJbMV0gPDwgOCkgfAorCQkgICAoKHVpbnQzMl90KWFkZHJbMl0gPDwgMTYpIHwKKwkJICAgKCh1aW50MzJfdClhZGRyWzNdIDw8IDI0KSk7CisKKwlyYXJfaGlnaCA9ICgodWludDMyX3QpIGFkZHJbNF0gfAorCQkJKCh1aW50MzJfdClhZGRyWzVdIDw8IDgpIHwKKwkJCUlYR0JfUkFIX0FWKTsKKworCUlYR0JfV1JJVEVfUkVHX0FSUkFZKGh3LCBSQSwgKGluZGV4IDw8IDEpLCByYXJfbG93KTsKKwlJWEdCX1dSSVRFX1JFR19BUlJBWShodywgUkEsICgoaW5kZXggPDwgMSkgKyAxKSwgcmFyX2hpZ2gpOworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV3JpdGVzIGEgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBvZmZzZXQgaW4gdGhlIFZMQU4gZmlsdGVyIHRhYmxlLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKiBvZmZzZXQgLSBPZmZzZXQgaW4gVkxBTiBmaWxlciB0YWJsZSB0byB3cml0ZQorICogdmFsdWUgLSBWYWx1ZSB0byB3cml0ZSBpbnRvIFZMQU4gZmlsdGVyIHRhYmxlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitpeGdiX3dyaXRlX3ZmdGEoc3RydWN0IGl4Z2JfaHcgKmh3LAorCQkgdWludDMyX3Qgb2Zmc2V0LAorCQkgdWludDMyX3QgdmFsdWUpCit7CisJSVhHQl9XUklURV9SRUdfQVJSQVkoaHcsIFZGVEEsIG9mZnNldCwgdmFsdWUpOworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2xlYXJzIHRoZSBWTEFOIGZpbGVyIHRhYmxlCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2l4Z2JfY2xlYXJfdmZ0YShzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJdWludDMyX3Qgb2Zmc2V0OworCisJZm9yKG9mZnNldCA9IDA7IG9mZnNldCA8IElYR0JfVkxBTl9GSUxURVJfVEJMX1NJWkU7IG9mZnNldCsrKQorCQlJWEdCX1dSSVRFX1JFR19BUlJBWShodywgVkZUQSwgb2Zmc2V0LCAwKTsKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvbmZpZ3VyZXMgdGhlIGZsb3cgY29udHJvbCBzZXR0aW5ncyBiYXNlZCBvbiBTVyBjb25maWd1cmF0aW9uLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2Jvb2xlYW5fdAoraXhnYl9zZXR1cF9mYyhzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJdWludDMyX3QgY3RybF9yZWc7CisJdWludDMyX3QgcGFwX3JlZyA9IDA7ICAgLyogYnkgZGVmYXVsdCwgYXNzdW1lIG5vIHBhdXNlIHRpbWUgKi8KKwlib29sZWFuX3Qgc3RhdHVzID0gVFJVRTsKKworCURFQlVHRlVOQygiaXhnYl9zZXR1cF9mYyIpOworCisJLyogR2V0IHRoZSBjdXJyZW50IGNvbnRyb2wgcmVnIDAgc2V0dGluZ3MgKi8KKwljdHJsX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIENUUkwwKTsKKworCS8qIENsZWFyIHRoZSBSZWNlaXZlIFBhdXNlIEVuYWJsZSBhbmQgVHJhbnNtaXQgUGF1c2UgRW5hYmxlIGJpdHMgKi8KKwljdHJsX3JlZyAmPSB+KElYR0JfQ1RSTDBfUlBFIHwgSVhHQl9DVFJMMF9UUEUpOworCisJLyogVGhlIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgImZsb3dfY29udHJvbCIgcGFyYW1ldGVyIGFyZToKKwkgKiAgICAgIDA6ICBGbG93IGNvbnRyb2wgaXMgY29tcGxldGVseSBkaXNhYmxlZAorCSAqICAgICAgMTogIFJ4IGZsb3cgY29udHJvbCBpcyBlbmFibGVkICh3ZSBjYW4gcmVjZWl2ZSBwYXVzZSBmcmFtZXMKKwkgKiAgICAgICAgICBidXQgbm90IHNlbmQgcGF1c2UgZnJhbWVzKS4KKwkgKiAgICAgIDI6ICBUeCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAod2UgY2FuIHNlbmQgcGF1c2UgZnJhbWVzCisJICogICAgICAgICAgYnV0IHdlIGRvIG5vdCBzdXBwb3J0IHJlY2VpdmluZyBwYXVzZSBmcmFtZXMpLgorCSAqICAgICAgMzogIEJvdGggUnggYW5kIFRYIGZsb3cgY29udHJvbCAoc3ltbWV0cmljKSBhcmUgZW5hYmxlZC4KKwkgKiAgb3RoZXI6ICBJbnZhbGlkLgorCSAqLworCXN3aXRjaCAoaHctPmZjLnR5cGUpIHsKKwljYXNlIGl4Z2JfZmNfbm9uZToJLyogMCAqLworCQkvKiBTZXQgQ01EQyBiaXQgdG8gZGlzYWJsZSBSeCBGbG93IGNvbnRyb2wgKi8KKwkJY3RybF9yZWcgfD0gKElYR0JfQ1RSTDBfQ01EQyk7CisJCWJyZWFrOworCWNhc2UgaXhnYl9mY19yeF9wYXVzZToJLyogMSAqLworCQkvKiBSWCBGbG93IGNvbnRyb2wgaXMgZW5hYmxlZCwgYW5kIFRYIEZsb3cgY29udHJvbCBpcworCQkgKiBkaXNhYmxlZC4KKwkJICovCisJCWN0cmxfcmVnIHw9IChJWEdCX0NUUkwwX1JQRSk7CisJCWJyZWFrOworCWNhc2UgaXhnYl9mY190eF9wYXVzZToJLyogMiAqLworCQkvKiBUWCBGbG93IGNvbnRyb2wgaXMgZW5hYmxlZCwgYW5kIFJYIEZsb3cgY29udHJvbCBpcworCQkgKiBkaXNhYmxlZCwgYnkgYSBzb2Z0d2FyZSBvdmVyLXJpZGUuCisJCSAqLworCQljdHJsX3JlZyB8PSAoSVhHQl9DVFJMMF9UUEUpOworCQlwYXBfcmVnID0gaHctPmZjLnBhdXNlX3RpbWU7CisJCWJyZWFrOworCWNhc2UgaXhnYl9mY19mdWxsOgkvKiAzICovCisJCS8qIEZsb3cgY29udHJvbCAoYm90aCBSWCBhbmQgVFgpIGlzIGVuYWJsZWQgYnkgYSBzb2Z0d2FyZQorCQkgKiBvdmVyLXJpZGUuCisJCSAqLworCQljdHJsX3JlZyB8PSAoSVhHQl9DVFJMMF9SUEUgfCBJWEdCX0NUUkwwX1RQRSk7CisJCXBhcF9yZWcgPSBody0+ZmMucGF1c2VfdGltZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLiAgVGhlIHZhbHVlIHNob3VsZCBiZSAwLTMuICovCisJCURFQlVHT1VUKCJGbG93IGNvbnRyb2wgcGFyYW0gc2V0IGluY29ycmVjdGx5XG4iKTsKKwkJQVNTRVJUKDApOworCQlicmVhazsKKwl9CisKKwkvKiBXcml0ZSB0aGUgbmV3IHNldHRpbmdzICovCisJSVhHQl9XUklURV9SRUcoaHcsIENUUkwwLCBjdHJsX3JlZyk7CisKKwlpZiAocGFwX3JlZyAhPSAwKSB7CisJCUlYR0JfV1JJVEVfUkVHKGh3LCBQQVAsIHBhcF9yZWcpOworCX0KKworCS8qIFNldCB0aGUgZmxvdyBjb250cm9sIHJlY2VpdmUgdGhyZXNob2xkIHJlZ2lzdGVycy4gIE5vcm1hbGx5LAorCSAqIHRoZXNlIHJlZ2lzdGVycyB3aWxsIGJlIHNldCB0byBhIGRlZmF1bHQgdGhyZXNob2xkIHRoYXQgbWF5IGJlCisJICogYWRqdXN0ZWQgbGF0ZXIgYnkgdGhlIGRyaXZlcidzIHJ1bnRpbWUgY29kZS4gIEhvd2V2ZXIsIGlmIHRoZQorCSAqIGFiaWxpdHkgdG8gdHJhbnNtaXQgcGF1c2UgZnJhbWVzIGluIG5vdCBlbmFibGVkLCB0aGVuIHRoZXNlCisJICogcmVnaXN0ZXJzIHdpbGwgYmUgc2V0IHRvIDAuCisJICovCisJaWYoIShody0+ZmMudHlwZSAmIGl4Z2JfZmNfdHhfcGF1c2UpKSB7CisJCUlYR0JfV1JJVEVfUkVHKGh3LCBGQ1JUTCwgMCk7CisJCUlYR0JfV1JJVEVfUkVHKGh3LCBGQ1JUSCwgMCk7CisJfSBlbHNlIHsKKwkgICAvKiBXZSBuZWVkIHRvIHNldCB1cCB0aGUgUmVjZWl2ZSBUaHJlc2hvbGQgaGlnaCBhbmQgbG93IHdhdGVyCisJICAgICogbWFya3MgYXMgd2VsbCBhcyAob3B0aW9uYWxseSkgZW5hYmxpbmcgdGhlIHRyYW5zbWlzc2lvbiBvZiBYT04KKwkgICAgKiBmcmFtZXMuICovCisJCWlmKGh3LT5mYy5zZW5kX3hvbikgeworCQkJSVhHQl9XUklURV9SRUcoaHcsIEZDUlRMLAorCQkJCShody0+ZmMubG93X3dhdGVyIHwgSVhHQl9GQ1JUTF9YT05FKSk7CisJCX0gZWxzZSB7CisJCQlJWEdCX1dSSVRFX1JFRyhodywgRkNSVEwsIGh3LT5mYy5sb3dfd2F0ZXIpOworCQl9CisJCUlYR0JfV1JJVEVfUkVHKGh3LCBGQ1JUSCwgaHctPmZjLmhpZ2hfd2F0ZXIpOworCX0KKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlYWRzIGEgd29yZCBmcm9tIGEgZGV2aWNlIG92ZXIgdGhlIE1hbmFnZW1lbnQgRGF0YSBJbnRlcmZhY2UgKE1ESSkgYnVzLgorICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBtYW5hZ2UgUGh5c2ljYWwgbGF5ZXIgZGV2aWNlcy4KKyAqCisgKiBodyAgICAgICAgICAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBodyBjb2RlCisgKiByZWdfYWRkcmVzcyAtIE9mZnNldCBvZiBkZXZpY2UgcmVnaXN0ZXIgYmVpbmcgcmVhZC4KKyAqIHBoeV9hZGRyZXNzIC0gQWRkcmVzcyBvZiBkZXZpY2Ugb24gTURJLgorICoKKyAqIFJldHVybnM6ICBEYXRhIHdvcmQgKDE2IGJpdHMpIGZyb20gTURJIGRldmljZS4KKyAqCisgKiBUaGUgODI1OTdFWCBoYXMgc3VwcG9ydCBmb3Igc2V2ZXJhbCBNREkgYWNjZXNzIG1ldGhvZHMuICBUaGlzIHJvdXRpbmUKKyAqIHVzZXMgdGhlIG5ldyBwcm90b2NvbCBNREkgU2luZ2xlIENvbW1hbmQgYW5kIEFkZHJlc3MgT3BlcmF0aW9uLgorICogVGhpcyByZXF1aXJlcyB0aGF0IGZpcnN0IGFuIGFkZHJlc3MgY3ljbGUgY29tbWFuZCBpcyBzZW50LCBmb2xsb3dlZCBieSBhCisgKiByZWFkIGNvbW1hbmQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MTZfdAoraXhnYl9yZWFkX3BoeV9yZWcoc3RydWN0IGl4Z2JfaHcgKmh3LAorCQl1aW50MzJfdCByZWdfYWRkcmVzcywKKwkJdWludDMyX3QgcGh5X2FkZHJlc3MsCisJCXVpbnQzMl90IGRldmljZV90eXBlKQoreworCXVpbnQzMl90IGk7CisJdWludDMyX3QgZGF0YTsKKwl1aW50MzJfdCBjb21tYW5kID0gMDsKKworCUFTU0VSVChyZWdfYWRkcmVzcyA8PSBJWEdCX01BWF9QSFlfUkVHX0FERFJFU1MpOworCUFTU0VSVChwaHlfYWRkcmVzcyA8PSBJWEdCX01BWF9QSFlfQUREUkVTUyk7CisJQVNTRVJUKGRldmljZV90eXBlIDw9IElYR0JfTUFYX1BIWV9ERVZfVFlQRSk7CisKKwkvKiBTZXR1cCBhbmQgd3JpdGUgdGhlIGFkZHJlc3MgY3ljbGUgY29tbWFuZCAqLworCWNvbW1hbmQgPSAoKHJlZ19hZGRyZXNzIDw8IElYR0JfTVNDQV9OUF9BRERSX1NISUZUKSB8CisJCSAgIChkZXZpY2VfdHlwZSA8PCBJWEdCX01TQ0FfREVWX1RZUEVfU0hJRlQpIHwKKwkJICAgKHBoeV9hZGRyZXNzIDw8IElYR0JfTVNDQV9QSFlfQUREUl9TSElGVCkgfAorCQkgICAoSVhHQl9NU0NBX0FERFJfQ1lDTEUgfCBJWEdCX01TQ0FfTURJX0NPTU1BTkQpKTsKKworCUlYR0JfV1JJVEVfUkVHKGh3LCBNU0NBLCBjb21tYW5kKTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICoqIENoZWNrIGV2ZXJ5IDEwIHVzZWMgdG8gc2VlIGlmIHRoZSBhZGRyZXNzIGN5Y2xlIGNvbXBsZXRlZAorICAgICoqIFRoZSBDT01NQU5EIGJpdCB3aWxsIGNsZWFyIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4KKyAgICAqKiBUaGlzIG1heSB0YWtlIGFzIGxvbmcgYXMgNjQgdXNlY3MgKHdlJ2xsIHdhaXQgMTAwIHVzZWNzIG1heCkKKyAgICAqKiBmcm9tIHRoZSBDUFUgV3JpdGUgdG8gdGhlIFJlYWR5IGJpdCBhc3NlcnRpb24uCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwlmb3IoaSA9IDA7IGkgPCAxMDsgaSsrKQorCXsKKwkJdWRlbGF5KDEwKTsKKworCQljb21tYW5kID0gSVhHQl9SRUFEX1JFRyhodywgTVNDQSk7CisKKwkJaWYgKChjb21tYW5kICYgSVhHQl9NU0NBX01ESV9DT01NQU5EKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJQVNTRVJUKChjb21tYW5kICYgSVhHQl9NU0NBX01ESV9DT01NQU5EKSA9PSAwKTsKKworCS8qIEFkZHJlc3MgY3ljbGUgY29tcGxldGUsIHNldHVwIGFuZCB3cml0ZSB0aGUgcmVhZCBjb21tYW5kICovCisJY29tbWFuZCA9ICgocmVnX2FkZHJlc3MgPDwgSVhHQl9NU0NBX05QX0FERFJfU0hJRlQpIHwKKwkJICAgKGRldmljZV90eXBlIDw8IElYR0JfTVNDQV9ERVZfVFlQRV9TSElGVCkgfAorCQkgICAocGh5X2FkZHJlc3MgPDwgSVhHQl9NU0NBX1BIWV9BRERSX1NISUZUKSB8CisJCSAgIChJWEdCX01TQ0FfUkVBRCB8IElYR0JfTVNDQV9NRElfQ09NTUFORCkpOworCisJSVhHQl9XUklURV9SRUcoaHcsIE1TQ0EsIGNvbW1hbmQpOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgKiogQ2hlY2sgZXZlcnkgMTAgdXNlYyB0byBzZWUgaWYgdGhlIHJlYWQgY29tbWFuZCBjb21wbGV0ZWQKKyAgICAqKiBUaGUgQ09NTUFORCBiaXQgd2lsbCBjbGVhciB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGUuCisgICAgKiogVGhlIHJlYWQgbWF5IHRha2UgYXMgbG9uZyBhcyA2NCB1c2VjcyAod2UnbGwgd2FpdCAxMDAgdXNlY3MgbWF4KQorICAgICoqIGZyb20gdGhlIENQVSBXcml0ZSB0byB0aGUgUmVhZHkgYml0IGFzc2VydGlvbi4KKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCWZvcihpID0gMDsgaSA8IDEwOyBpKyspCisJeworCQl1ZGVsYXkoMTApOworCisJCWNvbW1hbmQgPSBJWEdCX1JFQURfUkVHKGh3LCBNU0NBKTsKKworCQlpZiAoKGNvbW1hbmQgJiBJWEdCX01TQ0FfTURJX0NPTU1BTkQpID09IDApCisJCQlicmVhazsKKwl9CisKKwlBU1NFUlQoKGNvbW1hbmQgJiBJWEdCX01TQ0FfTURJX0NPTU1BTkQpID09IDApOworCisJLyogT3BlcmF0aW9uIGlzIGNvbXBsZXRlLCBnZXQgdGhlIGRhdGEgZnJvbSB0aGUgTURJTyBSZWFkL1dyaXRlIERhdGEKKwkgKiByZWdpc3RlciBhbmQgcmV0dXJuLgorCSAqLworCWRhdGEgPSBJWEdCX1JFQURfUkVHKGh3LCBNU1JXRCk7CisJZGF0YSA+Pj0gSVhHQl9NU1JXRF9SRUFEX0RBVEFfU0hJRlQ7CisJcmV0dXJuKCh1aW50MTZfdCkgZGF0YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFdyaXRlcyBhIHdvcmQgdG8gYSBkZXZpY2Ugb3ZlciB0aGUgTWFuYWdlbWVudCBEYXRhIEludGVyZmFjZSAoTURJKSBidXMuCisgKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIG1hbmFnZSBQaHlzaWNhbCBsYXllciBkZXZpY2VzLgorICoKKyAqIGh3ICAgICAgICAgIC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IGh3IGNvZGUKKyAqIHJlZ19hZGRyZXNzIC0gT2Zmc2V0IG9mIGRldmljZSByZWdpc3RlciBiZWluZyByZWFkLgorICogcGh5X2FkZHJlc3MgLSBBZGRyZXNzIG9mIGRldmljZSBvbiBNREkuCisgKiBkZXZpY2VfdHlwZSAtIEFsc28ga25vd24gYXMgdGhlIERldmljZSBJRCBvciBESUQuCisgKiBkYXRhICAgICAgICAtIDE2LWJpdCB2YWx1ZSB0byBiZSB3cml0dGVuCisgKgorICogUmV0dXJuczogIHZvaWQuCisgKgorICogVGhlIDgyNTk3RVggaGFzIHN1cHBvcnQgZm9yIHNldmVyYWwgTURJIGFjY2VzcyBtZXRob2RzLiAgVGhpcyByb3V0aW5lCisgKiB1c2VzIHRoZSBuZXcgcHJvdG9jb2wgTURJIFNpbmdsZSBDb21tYW5kIGFuZCBBZGRyZXNzIE9wZXJhdGlvbi4KKyAqIFRoaXMgcmVxdWlyZXMgdGhhdCBmaXJzdCBhbiBhZGRyZXNzIGN5Y2xlIGNvbW1hbmQgaXMgc2VudCwgZm9sbG93ZWQgYnkgYQorICogd3JpdGUgY29tbWFuZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2l4Z2Jfd3JpdGVfcGh5X3JlZyhzdHJ1Y3QgaXhnYl9odyAqaHcsCisJCQl1aW50MzJfdCByZWdfYWRkcmVzcywKKwkJCXVpbnQzMl90IHBoeV9hZGRyZXNzLAorCQkJdWludDMyX3QgZGV2aWNlX3R5cGUsCisJCQl1aW50MTZfdCBkYXRhKQoreworCXVpbnQzMl90IGk7CisJdWludDMyX3QgY29tbWFuZCA9IDA7CisKKwlBU1NFUlQocmVnX2FkZHJlc3MgPD0gSVhHQl9NQVhfUEhZX1JFR19BRERSRVNTKTsKKwlBU1NFUlQocGh5X2FkZHJlc3MgPD0gSVhHQl9NQVhfUEhZX0FERFJFU1MpOworCUFTU0VSVChkZXZpY2VfdHlwZSA8PSBJWEdCX01BWF9QSFlfREVWX1RZUEUpOworCisJLyogUHV0IHRoZSBkYXRhIGluIHRoZSBNRElPIFJlYWQvV3JpdGUgRGF0YSByZWdpc3RlciAqLworCUlYR0JfV1JJVEVfUkVHKGh3LCBNU1JXRCwgKHVpbnQzMl90KWRhdGEpOworCisJLyogU2V0dXAgYW5kIHdyaXRlIHRoZSBhZGRyZXNzIGN5Y2xlIGNvbW1hbmQgKi8KKwljb21tYW5kID0gKChyZWdfYWRkcmVzcyA8PCBJWEdCX01TQ0FfTlBfQUREUl9TSElGVCkgIHwKKwkJCSAgIChkZXZpY2VfdHlwZSA8PCBJWEdCX01TQ0FfREVWX1RZUEVfU0hJRlQpIHwKKwkJCSAgIChwaHlfYWRkcmVzcyA8PCBJWEdCX01TQ0FfUEhZX0FERFJfU0hJRlQpIHwKKwkJCSAgIChJWEdCX01TQ0FfQUREUl9DWUNMRSB8IElYR0JfTVNDQV9NRElfQ09NTUFORCkpOworCisJSVhHQl9XUklURV9SRUcoaHcsIE1TQ0EsIGNvbW1hbmQpOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKiogQ2hlY2sgZXZlcnkgMTAgdXNlYyB0byBzZWUgaWYgdGhlIGFkZHJlc3MgY3ljbGUgY29tcGxldGVkCisJKiogVGhlIENPTU1BTkQgYml0IHdpbGwgY2xlYXIgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLgorCSoqIFRoaXMgbWF5IHRha2UgYXMgbG9uZyBhcyA2NCB1c2VjcyAod2UnbGwgd2FpdCAxMDAgdXNlY3MgbWF4KQorCSoqIGZyb20gdGhlIENQVSBXcml0ZSB0byB0aGUgUmVhZHkgYml0IGFzc2VydGlvbi4KKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCWZvcihpID0gMDsgaSA8IDEwOyBpKyspCisJeworCQl1ZGVsYXkoMTApOworCisJCWNvbW1hbmQgPSBJWEdCX1JFQURfUkVHKGh3LCBNU0NBKTsKKworCQlpZiAoKGNvbW1hbmQgJiBJWEdCX01TQ0FfTURJX0NPTU1BTkQpID09IDApCisJCQlicmVhazsKKwl9CisKKwlBU1NFUlQoKGNvbW1hbmQgJiBJWEdCX01TQ0FfTURJX0NPTU1BTkQpID09IDApOworCisJLyogQWRkcmVzcyBjeWNsZSBjb21wbGV0ZSwgc2V0dXAgYW5kIHdyaXRlIHRoZSB3cml0ZSBjb21tYW5kICovCisJY29tbWFuZCA9ICgocmVnX2FkZHJlc3MgPDwgSVhHQl9NU0NBX05QX0FERFJfU0hJRlQpICB8CisJCQkgICAoZGV2aWNlX3R5cGUgPDwgSVhHQl9NU0NBX0RFVl9UWVBFX1NISUZUKSB8CisJCQkgICAocGh5X2FkZHJlc3MgPDwgSVhHQl9NU0NBX1BIWV9BRERSX1NISUZUKSB8CisJCQkgICAoSVhHQl9NU0NBX1dSSVRFIHwgSVhHQl9NU0NBX01ESV9DT01NQU5EKSk7CisKKwlJWEdCX1dSSVRFX1JFRyhodywgTVNDQSwgY29tbWFuZCk7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkqKiBDaGVjayBldmVyeSAxMCB1c2VjIHRvIHNlZSBpZiB0aGUgcmVhZCBjb21tYW5kIGNvbXBsZXRlZAorCSoqIFRoZSBDT01NQU5EIGJpdCB3aWxsIGNsZWFyIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4KKwkqKiBUaGUgd3JpdGUgbWF5IHRha2UgYXMgbG9uZyBhcyA2NCB1c2VjcyAod2UnbGwgd2FpdCAxMDAgdXNlY3MgbWF4KQorCSoqIGZyb20gdGhlIENQVSBXcml0ZSB0byB0aGUgUmVhZHkgYml0IGFzc2VydGlvbi4KKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCWZvcihpID0gMDsgaSA8IDEwOyBpKyspCisJeworCQl1ZGVsYXkoMTApOworCisJCWNvbW1hbmQgPSBJWEdCX1JFQURfUkVHKGh3LCBNU0NBKTsKKworCQlpZiAoKGNvbW1hbmQgJiBJWEdCX01TQ0FfTURJX0NPTU1BTkQpID09IDApCisJCQlicmVhazsKKwl9CisKKwlBU1NFUlQoKGNvbW1hbmQgJiBJWEdCX01TQ0FfTURJX0NPTU1BTkQpID09IDApOworCisJLyogT3BlcmF0aW9uIGlzIGNvbXBsZXRlLCByZXR1cm4uICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGxpbmsgc3RhdHVzIG9mIHRoZSBoYXJkd2FyZSBoYXMgY2hhbmdlZC4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBodyBjb2RlCisgKgorICogQ2FsbGVkIGJ5IGFueSBmdW5jdGlvbiB0aGF0IG5lZWRzIHRvIGNoZWNrIHRoZSBsaW5rIHN0YXR1cyBvZiB0aGUgYWRhcHRlci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2l4Z2JfY2hlY2tfZm9yX2xpbmsoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXVpbnQzMl90IHN0YXR1c19yZWc7CisJdWludDMyX3QgeHBjc3NfcmVnOworCisJREVCVUdGVU5DKCJpeGdiX2NoZWNrX2Zvcl9saW5rIik7CisKKwl4cGNzc19yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBYUENTUyk7CisJc3RhdHVzX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIFNUQVRVUyk7CisKKwlpZiAoKHhwY3NzX3JlZyAmIElYR0JfWFBDU1NfQUxJR05fU1RBVFVTKSAmJgorCSAgICAoc3RhdHVzX3JlZyAmIElYR0JfU1RBVFVTX0xVKSkgeworCQlody0+bGlua191cCA9IFRSVUU7CisJfSBlbHNlIGlmICghKHhwY3NzX3JlZyAmIElYR0JfWFBDU1NfQUxJR05fU1RBVFVTKSAmJgorCQkgICAoc3RhdHVzX3JlZyAmIElYR0JfU1RBVFVTX0xVKSkgeworCQlERUJVR09VVCgiWFBDU1MgTm90IEFsaWduZWQgd2hpbGUgU3RhdHVzOkxVIGlzIHNldC5cbiIpOworCQlody0+bGlua191cCA9IGl4Z2JfbGlua19yZXNldChodyk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogODI1OTdFWCBlcnJhdGEuICBTaW5jZSB0aGUgbGFuZSBkZXNrZXcgcHJvYmxlbSBtYXkgcHJldmVudAorCQkgKiBsaW5rLCByZXNldCB0aGUgbGluayBiZWZvcmUgcmVwb3J0aW5nIGxpbmsgZG93bi4KKwkJICovCisJCWh3LT5saW5rX3VwID0gaXhnYl9saW5rX3Jlc2V0KGh3KTsKKwl9CisJLyogIEFueXRoaW5nIGVsc2UgZm9yIDEwIEdpZz8/ICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENoZWNrIGZvciBhIGJhZCBsaW5rIGNvbmRpdGlvbiB0aGF0IG1heSBoYXZlIG9jY3VyZWQuCisgKiBUaGUgaW5kaWNhdGlvbiBpcyB0aGF0IHRoZSBSRkMgLyBMRkMgcmVnaXN0ZXJzIG1heSBiZSBpbmNyZW1lbnRpbmcKKyAqIGNvbnRpbnVhbGx5LiAgQSBmdWxsIGFkYXB0ZXIgcmVzZXQgaXMgcmVxdWlyZWQgdG8gcmVjb3Zlci4KKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBodyBjb2RlCisgKgorICogQ2FsbGVkIGJ5IGFueSBmdW5jdGlvbiB0aGF0IG5lZWRzIHRvIGNoZWNrIHRoZSBsaW5rIHN0YXR1cyBvZiB0aGUgYWRhcHRlci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2xlYW5fdCBpeGdiX2NoZWNrX2Zvcl9iYWRfbGluayhzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJdWludDMyX3QgbmV3TEZDLCBuZXdSRkM7CisJYm9vbGVhbl90IGJhZF9saW5rX3JldHVybmNvZGUgPSBGQUxTRTsKKworCWlmIChody0+cGh5X3R5cGUgPT0gaXhnYl9waHlfdHlwZV90eG4xNzQwMSkgeworCQluZXdMRkMgPSBJWEdCX1JFQURfUkVHKGh3LCBMRkMpOworCQluZXdSRkMgPSBJWEdCX1JFQURfUkVHKGh3LCBSRkMpOworCQlpZiAoKGh3LT5sYXN0TEZDICsgMjUwIDwgbmV3TEZDKQorCQkgICAgfHwgKGh3LT5sYXN0UkZDICsgMjUwIDwgbmV3UkZDKSkgeworCQkJREVCVUdPVVQKKwkJCSAgICAoIkJBRCBMSU5LISB0b28gbWFueSBMRkMvUkZDIHNpbmNlIGxhc3QgY2hlY2tcbiIpOworCQkJYmFkX2xpbmtfcmV0dXJuY29kZSA9IFRSVUU7CisJCX0KKwkJaHctPmxhc3RMRkMgPSBuZXdMRkM7CisJCWh3LT5sYXN0UkZDID0gbmV3UkZDOworCX0KKworCXJldHVybiBiYWRfbGlua19yZXR1cm5jb2RlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDbGVhcnMgYWxsIGhhcmR3YXJlIHN0YXRpc3RpY3MgY291bnRlcnMuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2l4Z2JfY2xlYXJfaHdfY250cnMoc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXZvbGF0aWxlIHVpbnQzMl90IHRlbXBfcmVnOworCisJREVCVUdGVU5DKCJpeGdiX2NsZWFyX2h3X2NudHJzIik7CisKKwkvKiBpZiB3ZSBhcmUgc3RvcHBlZCBvciByZXNldHRpbmcgZXhpdCBncmFjZWZ1bGx5ICovCisJaWYoaHctPmFkYXB0ZXJfc3RvcHBlZCkgeworCQlERUJVR09VVCgiRXhpdGluZyBiZWNhdXNlIHRoZSBhZGFwdGVyIGlzIHN0b3BwZWQhISFcbiIpOworCQlyZXR1cm47CisJfQorCisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBUUFJMKTsKKwl0ZW1wX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIFRQUkgpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgR1BSQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgR1BSQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgQlBSQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgQlBSQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgTVBSQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgTVBSQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgVVBSQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgVVBSQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgVlBSQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgVlBSQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgSlBSQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgSlBSQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgR09SQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgR09SQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgVE9STCk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBUT1JIKTsKKwl0ZW1wX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIFJOQkMpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgUlVDKTsKKwl0ZW1wX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIFJPQyk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBSTEVDKTsKKwl0ZW1wX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIENSQ0VSUlMpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgSUNCQyk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBFQ0JDKTsKKwl0ZW1wX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIE1QQyk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBUUFRMKTsKKwl0ZW1wX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIFRQVEgpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgR1BUQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgR1BUQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgQlBUQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgQlBUQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgTVBUQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgTVBUQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgVVBUQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgVVBUQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgVlBUQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgVlBUQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgSlBUQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgSlBUQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgR09UQ0wpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgR09UQ0gpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgVE9UTCk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBUT1RIKTsKKwl0ZW1wX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIERDKTsKKwl0ZW1wX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIFBMVDY0Qyk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBUU0NUQyk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBUU0NURkMpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgSUJJQyk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBSRkMpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgTEZDKTsKKwl0ZW1wX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIFBGUkMpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgUEZUQyk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBNQ0ZSQyk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBNQ0ZUQyk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBYT05SWEMpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgWE9OVFhDKTsKKwl0ZW1wX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIFhPRkZSWEMpOworCXRlbXBfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgWE9GRlRYQyk7CisJdGVtcF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBSSkMpOworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVHVybnMgb24gdGhlIHNvZnR3YXJlIGNvbnRyb2xsYWJsZSBMRUQKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAoraXhnYl9sZWRfb24oc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXVpbnQzMl90IGN0cmwwX3JlZyA9IElYR0JfUkVBRF9SRUcoaHcsIENUUkwwKTsKKworCS8qIFRvIHR1cm4gb24gdGhlIExFRCwgY2xlYXIgc29mdHdhcmUtZGVmaW5hYmxlIHBpbiAwIChTRFAwKS4gKi8KKwljdHJsMF9yZWcgJj0gfklYR0JfQ1RSTDBfU0RQMDsKKwlJWEdCX1dSSVRFX1JFRyhodywgQ1RSTDAsIGN0cmwwX3JlZyk7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUdXJucyBvZmYgdGhlIHNvZnR3YXJlIGNvbnRyb2xsYWJsZSBMRUQKKyAqCisgKiBodyAtIFN0cnVjdCBjb250YWluaW5nIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSBzaGFyZWQgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAoraXhnYl9sZWRfb2ZmKHN0cnVjdCBpeGdiX2h3ICpodykKK3sKKwl1aW50MzJfdCBjdHJsMF9yZWcgPSBJWEdCX1JFQURfUkVHKGh3LCBDVFJMMCk7CisKKwkvKiBUbyB0dXJuIG9mZiB0aGUgTEVELCBzZXQgc29mdHdhcmUtZGVmaW5hYmxlIHBpbiAwIChTRFAwKS4gKi8KKwljdHJsMF9yZWcgfD0gSVhHQl9DVFJMMF9TRFAwOworCUlYR0JfV1JJVEVfUkVHKGh3LCBDVFJMMCwgY3RybDBfcmVnKTsKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdldHMgdGhlIGN1cnJlbnQgUENJIGJ1cyB0eXBlLCBzcGVlZCwgYW5kIHdpZHRoIG9mIHRoZSBoYXJkd2FyZQorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraXhnYl9nZXRfYnVzX2luZm8oc3RydWN0IGl4Z2JfaHcgKmh3KQoreworCXVpbnQzMl90IHN0YXR1c19yZWc7CisKKwlzdGF0dXNfcmVnID0gSVhHQl9SRUFEX1JFRyhodywgU1RBVFVTKTsKKworCWh3LT5idXMudHlwZSA9IChzdGF0dXNfcmVnICYgSVhHQl9TVEFUVVNfUENJWF9NT0RFKSA/CisJCWl4Z2JfYnVzX3R5cGVfcGNpeCA6IGl4Z2JfYnVzX3R5cGVfcGNpOworCisJaWYgKGh3LT5idXMudHlwZSA9PSBpeGdiX2J1c190eXBlX3BjaSkgeworCQlody0+YnVzLnNwZWVkID0gKHN0YXR1c19yZWcgJiBJWEdCX1NUQVRVU19QQ0lfU1BEKSA/CisJCQlpeGdiX2J1c19zcGVlZF82NiA6IGl4Z2JfYnVzX3NwZWVkXzMzOworCX0gZWxzZSB7CisJCXN3aXRjaCAoc3RhdHVzX3JlZyAmIElYR0JfU1RBVFVTX1BDSVhfU1BEX01BU0spIHsKKwkJY2FzZSBJWEdCX1NUQVRVU19QQ0lYX1NQRF82NjoKKwkJCWh3LT5idXMuc3BlZWQgPSBpeGdiX2J1c19zcGVlZF82NjsKKwkJCWJyZWFrOworCQljYXNlIElYR0JfU1RBVFVTX1BDSVhfU1BEXzEwMDoKKwkJCWh3LT5idXMuc3BlZWQgPSBpeGdiX2J1c19zcGVlZF8xMDA7CisJCQlicmVhazsKKwkJY2FzZSBJWEdCX1NUQVRVU19QQ0lYX1NQRF8xMzM6CisJCQlody0+YnVzLnNwZWVkID0gaXhnYl9idXNfc3BlZWRfMTMzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlody0+YnVzLnNwZWVkID0gaXhnYl9idXNfc3BlZWRfcmVzZXJ2ZWQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCWh3LT5idXMud2lkdGggPSAoc3RhdHVzX3JlZyAmIElYR0JfU1RBVFVTX0JVUzY0KSA/CisJCWl4Z2JfYnVzX3dpZHRoXzY0IDogaXhnYl9idXNfd2lkdGhfMzI7CisKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlc3RzIGEgTUFDIGFkZHJlc3MgdG8gZW5zdXJlIGl0IGlzIGEgdmFsaWQgSW5kaXZpZHVhbCBBZGRyZXNzCisgKgorICogbWFjX2FkZHIgLSBwb2ludGVyIHRvIE1BQyBhZGRyZXNzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2xlYW5fdAorbWFjX2FkZHJfdmFsaWQodWludDhfdCAqbWFjX2FkZHIpCit7CisJYm9vbGVhbl90IGlzX3ZhbGlkID0gVFJVRTsKKwlERUJVR0ZVTkMoIm1hY19hZGRyX3ZhbGlkIik7CisKKwkvKiBNYWtlIHN1cmUgaXQgaXMgbm90IGEgbXVsdGljYXN0IGFkZHJlc3MgKi8KKwlpZiAoSVNfTVVMVElDQVNUKG1hY19hZGRyKSkgeworCQlERUJVR09VVCgiTUFDIGFkZHJlc3MgaXMgbXVsdGljYXN0XG4iKTsKKwkJaXNfdmFsaWQgPSBGQUxTRTsKKwl9CisJLyogTm90IGEgYnJvYWRjYXN0IGFkZHJlc3MgKi8KKwllbHNlIGlmIChJU19CUk9BRENBU1QobWFjX2FkZHIpKSB7CisJCURFQlVHT1VUKCJNQUMgYWRkcmVzcyBpcyBicm9hZGNhc3RcbiIpOworCQlpc192YWxpZCA9IEZBTFNFOworCX0KKwkvKiBSZWplY3QgdGhlIHplcm8gYWRkcmVzcyAqLworCWVsc2UgaWYgKG1hY19hZGRyWzBdID09IDAgJiYKKwkJCSBtYWNfYWRkclsxXSA9PSAwICYmCisJCQkgbWFjX2FkZHJbMl0gPT0gMCAmJgorCQkJIG1hY19hZGRyWzNdID09IDAgJiYKKwkJCSBtYWNfYWRkcls0XSA9PSAwICYmCisJCQkgbWFjX2FkZHJbNV0gPT0gMCkgeworCQlERUJVR09VVCgiTUFDIGFkZHJlc3MgaXMgYWxsIHplcm9zXG4iKTsKKwkJaXNfdmFsaWQgPSBGQUxTRTsKKwl9CisJcmV0dXJuIChpc192YWxpZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlc2V0cyB0aGUgMTBHYkUgbGluay4gIFdhaXRzIHRoZSBzZXR0bGUgdGltZSBhbmQgcmV0dXJucyB0aGUgc3RhdGUgb2YKKyAqIHRoZSBsaW5rLgorICoKKyAqIGh3IC0gU3RydWN0IGNvbnRhaW5pbmcgdmFyaWFibGVzIGFjY2Vzc2VkIGJ5IHNoYXJlZCBjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sZWFuX3QKK2l4Z2JfbGlua19yZXNldChzdHJ1Y3QgaXhnYl9odyAqaHcpCit7CisJYm9vbGVhbl90IGxpbmtfc3RhdHVzID0gRkFMU0U7CisJdWludDhfdCB3YWl0X3JldHJpZXMgPSBNQVhfUkVTRVRfSVRFUkFUSU9OUzsKKwl1aW50OF90IGxyc3RfcmV0cmllcyA9IE1BWF9SRVNFVF9JVEVSQVRJT05TOworCisJZG8geworCQkvKiBSZXNldCB0aGUgbGluayAqLworCQlJWEdCX1dSSVRFX1JFRyhodywgQ1RSTDAsCisJCQkgICAgICAgSVhHQl9SRUFEX1JFRyhodywgQ1RSTDApIHwgSVhHQl9DVFJMMF9MUlNUKTsKKworCQkvKiBXYWl0IGZvciBsaW5rLXVwIGFuZCBsYW5lIHJlLWFsaWdubWVudCAqLworCQlkbyB7CisJCQl1ZGVsYXkoSVhHQl9ERUxBWV9VU0VDU19BRlRFUl9MSU5LX1JFU0VUKTsKKwkJCWxpbmtfc3RhdHVzID0KKwkJCSAgICAoKElYR0JfUkVBRF9SRUcoaHcsIFNUQVRVUykgJiBJWEdCX1NUQVRVU19MVSkKKwkJCSAgICAgJiYgKElYR0JfUkVBRF9SRUcoaHcsIFhQQ1NTKSAmCisJCQkJIElYR0JfWFBDU1NfQUxJR05fU1RBVFVTKSkgPyBUUlVFIDogRkFMU0U7CisJCX0gd2hpbGUgKCFsaW5rX3N0YXR1cyAmJiAtLXdhaXRfcmV0cmllcyk7CisKKwl9IHdoaWxlICghbGlua19zdGF0dXMgJiYgLS1scnN0X3JldHJpZXMpOworCisJcmV0dXJuIGxpbmtfc3RhdHVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZXNldHMgdGhlIDEwR2JFIG9wdGljcyBtb2R1bGUuCisgKgorICogaHcgLSBTdHJ1Y3QgY29udGFpbmluZyB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgc2hhcmVkIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2l4Z2Jfb3B0aWNzX3Jlc2V0KHN0cnVjdCBpeGdiX2h3ICpodykKK3sKKwlpZiAoaHctPnBoeV90eXBlID09IGl4Z2JfcGh5X3R5cGVfdHhuMTc0MDEpIHsKKwkJdWludDE2X3QgbWRpb19yZWc7CisKKwkJaXhnYl93cml0ZV9waHlfcmVnKGh3LAorCQkJCQlNRElPX1BNQV9QTURfQ1IxLAorCQkJCQlJWEdCX1BIWV9BRERSRVNTLAorCQkJCQlNRElPX1BNQV9QTURfRElELAorCQkJCQlNRElPX1BNQV9QTURfQ1IxX1JFU0VUKTsKKworCQltZGlvX3JlZyA9IGl4Z2JfcmVhZF9waHlfcmVnKCBodywKKwkJCQkJCU1ESU9fUE1BX1BNRF9DUjEsCisJCQkJCQlJWEdCX1BIWV9BRERSRVNTLAorCQkJCQkJTURJT19QTUFfUE1EX0RJRCk7CisJfQorCisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYi9peGdiX2h3LmggYi9kcml2ZXJzL25ldC9peGdiL2l4Z2JfaHcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Nzg5OGVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX2h3LmgKQEAgLTAsMCArMSw4NDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IAorICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSAKKyAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSAKKyAgYW55IGxhdGVyIHZlcnNpb24uCisgIAorICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciAKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciAKKyAgbW9yZSBkZXRhaWxzLgorICAKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgCisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICAKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgIAorICBDb250YWN0IEluZm9ybWF0aW9uOgorICBMaW51eCBOSUNTIDxsaW51eC5uaWNzQGludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9JWEdCX0hXX0hfCisjZGVmaW5lIF9JWEdCX0hXX0hfCisKKyNpbmNsdWRlICJpeGdiX29zZGVwLmgiCisKKy8qIEVudW1zICovCit0eXBlZGVmIGVudW0geworCWl4Z2JfbWFjX3Vua25vd24gPSAwLAorCWl4Z2JfODI1OTcsCisJaXhnYl9udW1fbWFjcworfSBpeGdiX21hY190eXBlOworCisvKiBUeXBlcyBvZiBwaHlzaWNhbCBsYXllciBtb2R1bGVzICovCit0eXBlZGVmIGVudW0geworCWl4Z2JfcGh5X3R5cGVfdW5rbm93biA9IDAsCisJaXhnYl9waHlfdHlwZV9nNjAwNSwJLyogODUwbm0sIE1NIGZpYmVyLCBYUEFLIHRyYW5zY2VpdmVyICovCisJaXhnYl9waHlfdHlwZV9nNjEwNCwJLyogMTMxMG5tLCBTTSBmaWJlciwgWFBBSyB0cmFuc2NlaXZlciAqLworCWl4Z2JfcGh5X3R5cGVfdHhuMTcyMDEsCS8qIDg1MG5tLCBNTSBmaWJlciwgWFBBSyB0cmFuc2NlaXZlciAqLworCWl4Z2JfcGh5X3R5cGVfdHhuMTc0MDEJLyogMTMxMG5tLCBTTSBmaWJlciwgWEVOUEFLIHRyYW5zY2VpdmVyICovCit9IGl4Z2JfcGh5X3R5cGU7CisKKy8qIFhQQUsgdHJhbnNjZWl2ZXIgdmVuZG9ycywgZm9yIHRoZSBTUiBhZGFwdGVycyAqLwordHlwZWRlZiBlbnVtIHsKKwlpeGdiX3hwYWtfdmVuZG9yX2ludGVsLAorCWl4Z2JfeHBha192ZW5kb3JfaW5maW5lb24KK30gaXhnYl94cGFrX3ZlbmRvcjsKKworLyogTWVkaWEgVHlwZXMgKi8KK3R5cGVkZWYgZW51bSB7CisJaXhnYl9tZWRpYV90eXBlX3Vua25vd24gPSAwLAorCWl4Z2JfbWVkaWFfdHlwZV9maWJlciA9IDEsCisJaXhnYl9udW1fbWVkaWFfdHlwZXMKK30gaXhnYl9tZWRpYV90eXBlOworCisvKiBGbG93IENvbnRyb2wgU2V0dGluZ3MgKi8KK3R5cGVkZWYgZW51bSB7CisJaXhnYl9mY19ub25lID0gMCwKKwlpeGdiX2ZjX3J4X3BhdXNlID0gMSwKKwlpeGdiX2ZjX3R4X3BhdXNlID0gMiwKKwlpeGdiX2ZjX2Z1bGwgPSAzLAorCWl4Z2JfZmNfZGVmYXVsdCA9IDB4RkYKK30gaXhnYl9mY190eXBlOworCisvKiBQQ0kgYnVzIHR5cGVzICovCit0eXBlZGVmIGVudW0geworCWl4Z2JfYnVzX3R5cGVfdW5rbm93biA9IDAsCisJaXhnYl9idXNfdHlwZV9wY2ksCisJaXhnYl9idXNfdHlwZV9wY2l4Cit9IGl4Z2JfYnVzX3R5cGU7CisKKy8qIFBDSSBidXMgc3BlZWRzICovCit0eXBlZGVmIGVudW0geworCWl4Z2JfYnVzX3NwZWVkX3Vua25vd24gPSAwLAorCWl4Z2JfYnVzX3NwZWVkXzMzLAorCWl4Z2JfYnVzX3NwZWVkXzY2LAorCWl4Z2JfYnVzX3NwZWVkXzEwMCwKKwlpeGdiX2J1c19zcGVlZF8xMzMsCisJaXhnYl9idXNfc3BlZWRfcmVzZXJ2ZWQKK30gaXhnYl9idXNfc3BlZWQ7CisKKy8qIFBDSSBidXMgd2lkdGhzICovCit0eXBlZGVmIGVudW0geworCWl4Z2JfYnVzX3dpZHRoX3Vua25vd24gPSAwLAorCWl4Z2JfYnVzX3dpZHRoXzMyLAorCWl4Z2JfYnVzX3dpZHRoXzY0Cit9IGl4Z2JfYnVzX3dpZHRoOworCisjZGVmaW5lIElYR0JfRVRIX0xFTkdUSF9PRl9BRERSRVNTICAgNgorCisjZGVmaW5lIElYR0JfRUVQUk9NX1NJWkUgICAgNjQJLyogU2l6ZSBpbiB3b3JkcyAqLworCisjZGVmaW5lIFNQRUVEXzEwMDAwICAxMDAwMAorI2RlZmluZSBGVUxMX0RVUExFWCAgMgorCisjZGVmaW5lIE1JTl9OVU1CRVJfT0ZfREVTQ1JJUFRPUlMgICAgICAgOAorI2RlZmluZSBNQVhfTlVNQkVSX09GX0RFU0NSSVBUT1JTICAweEZGRjgJLyogMTMgYml0cyBpbiBSRExFTi9URExFTiwgMTI4QiBhbGlnbmVkICAgICAqLworCisjZGVmaW5lIElYR0JfREVMQVlfQkVGT1JFX1JFU0VUICAgICAgICAxMAkvKiBhbGxvdyAxMG1zIGFmdGVyIGlkbGluZyByeC90eCB1bml0cyAgICAgICovCisjZGVmaW5lIElYR0JfREVMQVlfQUZURVJfUkVTRVQgICAgICAgICAgMQkvKiBhbGxvdyAxbXMgYWZ0ZXIgdGhlIHJlc2V0ICAgICAgICAgICAgICAgICovCisjZGVmaW5lIElYR0JfREVMQVlfQUZURVJfRUVfUkVTRVQgICAgICAxMAkvKiBhbGxvdyAxMG1zIGFmdGVyIHRoZSBFRVBST00gcmVzZXQgICAgICAgICovCisKKyNkZWZpbmUgSVhHQl9ERUxBWV9VU0VDU19BRlRFUl9MSU5LX1JFU0VUICAgIDEzCS8qIGFsbG93IDEzIG1pY3Jvc2Vjb25kcyBhZnRlciB0aGUgcmVzZXQgICAgKi8KKwkJCQkJICAgLyogTk9URTogdGhpcyBpcyBNSUNST1NFQ09ORFMgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQVhfUkVTRVRfSVRFUkFUSU9OUyAgICAgICAgICAgIDgJLyogbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gZ2V0IHRoaW5ncyByaWdodCAqLworCisvKiBHZW5lcmFsIFJlZ2lzdGVycyAqLworI2RlZmluZSBJWEdCX0NUUkwwICAgMHgwMDAwMAkvKiBEZXZpY2UgQ29udHJvbCBSZWdpc3RlciAwIC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9DVFJMMSAgIDB4MDAwMDgJLyogRGV2aWNlIENvbnRyb2wgUmVnaXN0ZXIgMSAtIFJXICovCisjZGVmaW5lIElYR0JfU1RBVFVTICAweDAwMDEwCS8qIERldmljZSBTdGF0dXMgUmVnaXN0ZXIgLSBSTyAqLworI2RlZmluZSBJWEdCX0VFQ0QgICAgMHgwMDAxOAkvKiBFRVBST00vRmxhc2ggQ29udHJvbC9EYXRhIFJlZ2lzdGVyIC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9NRlMgICAgIDB4MDAwMjAJLyogTWF4aW11bSBGcmFtZSBTaXplIC0gUlcgKi8KKworLyogSW50ZXJydXB0ICovCisjZGVmaW5lIElYR0JfSUNSICAgICAweDAwMDgwCS8qIEludGVycnVwdCBDYXVzZSBSZWFkIC0gUi9jbHIgKi8KKyNkZWZpbmUgSVhHQl9JQ1MgICAgIDB4MDAwODgJLyogSW50ZXJydXB0IENhdXNlIFNldCAtIFJXICovCisjZGVmaW5lIElYR0JfSU1TICAgICAweDAwMDkwCS8qIEludGVycnVwdCBNYXNrIFNldC9SZWFkIC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9JTUMgICAgIDB4MDAwOTgJLyogSW50ZXJydXB0IE1hc2sgQ2xlYXIgLSBXTyAqLworCisvKiBSZWNlaXZlICovCisjZGVmaW5lIElYR0JfUkNUTCAgICAweDAwMTAwCS8qIFJYIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBJWEdCX0ZDUlRMICAgMHgwMDEwOAkvKiBGbG93IENvbnRyb2wgUmVjZWl2ZSBUaHJlc2hvbGQgTG93IC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9GQ1JUSCAgIDB4MDAxMTAJLyogRmxvdyBDb250cm9sIFJlY2VpdmUgVGhyZXNob2xkIEhpZ2ggLSBSVyAqLworI2RlZmluZSBJWEdCX1JEQkFMICAgMHgwMDExOAkvKiBSWCBEZXNjcmlwdG9yIEJhc2UgTG93IC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9SREJBSCAgIDB4MDAxMUMJLyogUlggRGVzY3JpcHRvciBCYXNlIEhpZ2ggLSBSVyAqLworI2RlZmluZSBJWEdCX1JETEVOICAgMHgwMDEyMAkvKiBSWCBEZXNjcmlwdG9yIExlbmd0aCAtIFJXICovCisjZGVmaW5lIElYR0JfUkRIICAgICAweDAwMTI4CS8qIFJYIERlc2NyaXB0b3IgSGVhZCAtIFJXICovCisjZGVmaW5lIElYR0JfUkRUICAgICAweDAwMTMwCS8qIFJYIERlc2NyaXB0b3IgVGFpbCAtIFJXICovCisjZGVmaW5lIElYR0JfUkRUUiAgICAweDAwMTM4CS8qIFJYIERlbGF5IFRpbWVyIFJpbmcgLSBSVyAqLworI2RlZmluZSBJWEdCX1JYRENUTCAgMHgwMDE0MAkvKiBSZWNlaXZlIERlc2NyaXB0b3IgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIElYR0JfUkFJREMgICAweDAwMTQ4CS8qIFJlY2VpdmUgQWRhcHRpdmUgSW50ZXJydXB0IERlbGF5IENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBJWEdCX1JYQ1NVTSAgMHgwMDE1OAkvKiBSZWNlaXZlIENoZWNrc3VtIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBJWEdCX1JBICAgICAgMHgwMDE4MAkvKiBSZWNlaXZlIEFkZHJlc3MgQXJyYXkgQmFzZSAtIFJXICovCisjZGVmaW5lIElYR0JfUkFMICAgICAweDAwMTgwCS8qIFJlY2VpdmUgQWRkcmVzcyBMb3cgWzA6MTVdIC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9SQUggICAgIDB4MDAxODQJLyogUmVjZWl2ZSBBZGRyZXNzIEhpZ2ggWzA6MTVdIC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9NVEEgICAgIDB4MDAyMDAJLyogTXVsdGljYXN0IFRhYmxlIEFycmF5IFswOjEyN10gLSBSVyAqLworI2RlZmluZSBJWEdCX1ZGVEEgICAgMHgwMDQwMAkvKiBWTEFOIEZpbHRlciBUYWJsZSBBcnJheSBbMDoxMjddIC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9SRVFfUlhfREVTQ1JJUFRPUl9NVUxUSVBMRSA4CisKKy8qIFRyYW5zbWl0ICovCisjZGVmaW5lIElYR0JfVENUTCAgICAweDAwNjAwCS8qIFRYIENvbnRyb2wgLSBSVyAqLworI2RlZmluZSBJWEdCX1REQkFMICAgMHgwMDYwOAkvKiBUWCBEZXNjcmlwdG9yIEJhc2UgTG93IC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9UREJBSCAgIDB4MDA2MEMJLyogVFggRGVzY3JpcHRvciBCYXNlIEhpZ2ggLSBSVyAqLworI2RlZmluZSBJWEdCX1RETEVOICAgMHgwMDYxMAkvKiBUWCBEZXNjcmlwdG9yIExlbmd0aCAtIFJXICovCisjZGVmaW5lIElYR0JfVERIICAgICAweDAwNjE4CS8qIFRYIERlc2NyaXB0b3IgSGVhZCAtIFJXICovCisjZGVmaW5lIElYR0JfVERUICAgICAweDAwNjIwCS8qIFRYIERlc2NyaXB0b3IgVGFpbCAtIFJXICovCisjZGVmaW5lIElYR0JfVElEViAgICAweDAwNjI4CS8qIFRYIEludGVycnVwdCBEZWxheSBWYWx1ZSAtIFJXICovCisjZGVmaW5lIElYR0JfVFhEQ1RMICAweDAwNjMwCS8qIFRyYW5zbWl0IERlc2NyaXB0b3IgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIElYR0JfVFNQTVQgICAweDAwNjM4CS8qIFRDUCBTZWdtZW50YXRpb24gUEFEICYgTWluIFRocmVzaG9sZCAtIFJXICovCisjZGVmaW5lIElYR0JfUEFQICAgICAweDAwNjQwCS8qIFBhdXNlIGFuZCBQYWNlIC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9SRVFfVFhfREVTQ1JJUFRPUl9NVUxUSVBMRSA4CisKKy8qIFBoeXNpY2FsICovCisjZGVmaW5lIElYR0JfUENTQzEgICAweDAwNzAwCS8qIFBDUyBDb250cm9sIDEgLSBSVyAqLworI2RlZmluZSBJWEdCX1BDU0MyICAgMHgwMDcwOAkvKiBQQ1MgQ29udHJvbCAyIC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9QQ1NTMSAgIDB4MDA3MTAJLyogUENTIFN0YXR1cyAxIC0gUk8gKi8KKyNkZWZpbmUgSVhHQl9QQ1NTMiAgIDB4MDA3MTgJLyogUENTIFN0YXR1cyAyIC0gUk8gKi8KKyNkZWZpbmUgSVhHQl9YUENTUyAgIDB4MDA3MjAJLyogMTBHQkFTRS1YIFBDUyBTdGF0dXMgKG9yIFhHWFMgTGFuZSBTdGF0dXMpIC0gUk8gKi8KKyNkZWZpbmUgSVhHQl9VQ0NSICAgIDB4MDA3MjgJLyogVW5pbGluayBDaXJjdWl0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVhHQl9YUENTVEMgIDB4MDA3MzAJLyogMTBHQkFTRS1YIFBDUyBUZXN0IENvbnRyb2wgKi8KKyNkZWZpbmUgSVhHQl9NQUNBICAgIDB4MDA3MzgJLyogTURJIEF1dG9zY2FuIENvbW1hbmQgYW5kIEFkZHJlc3MgLSBSVyAqLworI2RlZmluZSBJWEdCX0FQQUUgICAgMHgwMDc0MAkvKiBBdXRvc2NhbiBQSFkgQWRkcmVzcyBFbmFibGUgLSBSVyAqLworI2RlZmluZSBJWEdCX0FSRCAgICAgMHgwMDc0OAkvKiBBdXRvc2NhbiBSZWFkIERhdGEgLSBSTyAqLworI2RlZmluZSBJWEdCX0FJUyAgICAgMHgwMDc1MAkvKiBBdXRvc2NhbiBJbnRlcnJ1cHQgU3RhdHVzIC0gUk8gKi8KKyNkZWZpbmUgSVhHQl9NU0NBICAgIDB4MDA3NTgJLyogTURJIFNpbmdsZSBDb21tYW5kIGFuZCBBZGRyZXNzIC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9NU1JXRCAgIDB4MDA3NjAJLyogTURJIFNpbmdsZSBSZWFkIGFuZCBXcml0ZSBEYXRhIC0gUlcsIFJPICovCisKKy8qIFdha2UtdXAgKi8KKyNkZWZpbmUgSVhHQl9XVUZDICAgIDB4MDA4MDgJLyogV2FrZSBVcCBGaWx0ZXIgQ29udHJvbCAtIFJXICovCisjZGVmaW5lIElYR0JfV1VTICAgICAweDAwODEwCS8qIFdha2UgVXAgU3RhdHVzIC0gUk8gKi8KKyNkZWZpbmUgSVhHQl9GRkxUICAgIDB4MDEwMDAJLyogRmxleGlibGUgRmlsdGVyIExlbmd0aCBUYWJsZSAtIFJXICovCisjZGVmaW5lIElYR0JfRkZNVCAgICAweDAxMDIwCS8qIEZsZXhpYmxlIEZpbHRlciBNYXNrIFRhYmxlIC0gUlcgKi8KKyNkZWZpbmUgSVhHQl9GVFZUICAgIDB4MDE0MjAJLyogRmxleGlibGUgRmlsdGVyIFZhbHVlIFRhYmxlIC0gUlcgKi8KKworLyogU3RhdGlzdGljcyAqLworI2RlZmluZSBJWEdCX1RQUkwgICAgMHgwMjAwMAkvKiBUb3RhbCBQYWNrZXRzIFJlY2VpdmVkIChMb3cpICovCisjZGVmaW5lIElYR0JfVFBSSCAgICAweDAyMDA0CS8qIFRvdGFsIFBhY2tldHMgUmVjZWl2ZWQgKEhpZ2gpICovCisjZGVmaW5lIElYR0JfR1BSQ0wgICAweDAyMDA4CS8qIEdvb2QgUGFja2V0cyBSZWNlaXZlZCBDb3VudCAoTG93KSAqLworI2RlZmluZSBJWEdCX0dQUkNIICAgMHgwMjAwQwkvKiBHb29kIFBhY2tldHMgUmVjZWl2ZWQgQ291bnQgKEhpZ2gpICovCisjZGVmaW5lIElYR0JfQlBSQ0wgICAweDAyMDEwCS8qIEJyb2FkY2FzdCBQYWNrZXRzIFJlY2VpdmVkIENvdW50IChMb3cpICovCisjZGVmaW5lIElYR0JfQlBSQ0ggICAweDAyMDE0CS8qIEJyb2FkY2FzdCBQYWNrZXRzIFJlY2VpdmVkIENvdW50IChIaWdoKSAqLworI2RlZmluZSBJWEdCX01QUkNMICAgMHgwMjAxOAkvKiBNdWx0aWNhc3QgUGFja2V0cyBSZWNlaXZlZCBDb3VudCAoTG93KSAqLworI2RlZmluZSBJWEdCX01QUkNIICAgMHgwMjAxQwkvKiBNdWx0aWNhc3QgUGFja2V0cyBSZWNlaXZlZCBDb3VudCAoSGlnaCkgKi8KKyNkZWZpbmUgSVhHQl9VUFJDTCAgIDB4MDIwMjAJLyogVW5pY2FzdCBQYWNrZXRzIFJlY2VpdmVkIENvdW50IChMb3cpICovCisjZGVmaW5lIElYR0JfVVBSQ0ggICAweDAyMDI0CS8qIFVuaWNhc3QgUGFja2V0cyBSZWNlaXZlZCBDb3VudCAoSGlnaCkgKi8KKyNkZWZpbmUgSVhHQl9WUFJDTCAgIDB4MDIwMjgJLyogVkxBTiBQYWNrZXRzIFJlY2VpdmVkIENvdW50IChMb3cpICovCisjZGVmaW5lIElYR0JfVlBSQ0ggICAweDAyMDJDCS8qIFZMQU4gUGFja2V0cyBSZWNlaXZlZCBDb3VudCAoSGlnaCkgKi8KKyNkZWZpbmUgSVhHQl9KUFJDTCAgIDB4MDIwMzAJLyogSnVtYm8gUGFja2V0cyBSZWNlaXZlZCBDb3VudCAoTG93KSAqLworI2RlZmluZSBJWEdCX0pQUkNIICAgMHgwMjAzNAkvKiBKdW1ibyBQYWNrZXRzIFJlY2VpdmVkIENvdW50IChIaWdoKSAqLworI2RlZmluZSBJWEdCX0dPUkNMICAgMHgwMjAzOAkvKiBHb29kIE9jdGV0cyBSZWNlaXZlZCBDb3VudCAoTG93KSAqLworI2RlZmluZSBJWEdCX0dPUkNIICAgMHgwMjAzQwkvKiBHb29kIE9jdGV0cyBSZWNlaXZlZCBDb3VudCAoSGlnaCkgKi8KKyNkZWZpbmUgSVhHQl9UT1JMICAgIDB4MDIwNDAJLyogVG90YWwgT2N0ZXRzIFJlY2VpdmVkIChMb3cpICovCisjZGVmaW5lIElYR0JfVE9SSCAgICAweDAyMDQ0CS8qIFRvdGFsIE9jdGV0cyBSZWNlaXZlZCAoSGlnaCkgKi8KKyNkZWZpbmUgSVhHQl9STkJDICAgIDB4MDIwNDgJLyogUmVjZWl2ZSBObyBCdWZmZXJzIENvdW50ICovCisjZGVmaW5lIElYR0JfUlVDICAgICAweDAyMDUwCS8qIFJlY2VpdmUgVW5kZXJzaXplIENvdW50ICovCisjZGVmaW5lIElYR0JfUk9DICAgICAweDAyMDU4CS8qIFJlY2VpdmUgT3ZlcnNpemUgQ291bnQgKi8KKyNkZWZpbmUgSVhHQl9STEVDICAgIDB4MDIwNjAJLyogUmVjZWl2ZSBMZW5ndGggRXJyb3IgQ291bnQgKi8KKyNkZWZpbmUgSVhHQl9DUkNFUlJTIDB4MDIwNjgJLyogQ1JDIEVycm9yIENvdW50ICovCisjZGVmaW5lIElYR0JfSUNCQyAgICAweDAyMDcwCS8qIElsbGVnYWwgY29udHJvbCBieXRlIGluIG1pZC1wYWNrZXQgQ291bnQgKi8KKyNkZWZpbmUgSVhHQl9FQ0JDICAgIDB4MDIwNzgJLyogRXJyb3IgQ29udHJvbCBieXRlIGluIG1pZC1wYWNrZXQgQ291bnQgKi8KKyNkZWZpbmUgSVhHQl9NUEMgICAgIDB4MDIwODAJLyogTWlzc2VkIFBhY2tldHMgQ291bnQgKi8KKyNkZWZpbmUgSVhHQl9UUFRMICAgIDB4MDIxMDAJLyogVG90YWwgUGFja2V0cyBUcmFuc21pdHRlZCAoTG93KSAqLworI2RlZmluZSBJWEdCX1RQVEggICAgMHgwMjEwNAkvKiBUb3RhbCBQYWNrZXRzIFRyYW5zbWl0dGVkIChIaWdoKSAqLworI2RlZmluZSBJWEdCX0dQVENMICAgMHgwMjEwOAkvKiBHb29kIFBhY2tldHMgVHJhbnNtaXR0ZWQgQ291bnQgKExvdykgKi8KKyNkZWZpbmUgSVhHQl9HUFRDSCAgIDB4MDIxMEMJLyogR29vZCBQYWNrZXRzIFRyYW5zbWl0dGVkIENvdW50IChIaWdoKSAqLworI2RlZmluZSBJWEdCX0JQVENMICAgMHgwMjExMAkvKiBCcm9hZGNhc3QgUGFja2V0cyBUcmFuc21pdHRlZCBDb3VudCAoTG93KSAqLworI2RlZmluZSBJWEdCX0JQVENIICAgMHgwMjExNAkvKiBCcm9hZGNhc3QgUGFja2V0cyBUcmFuc21pdHRlZCBDb3VudCAoSGlnaCkgKi8KKyNkZWZpbmUgSVhHQl9NUFRDTCAgIDB4MDIxMTgJLyogTXVsdGljYXN0IFBhY2tldHMgVHJhbnNtaXR0ZWQgQ291bnQgKExvdykgKi8KKyNkZWZpbmUgSVhHQl9NUFRDSCAgIDB4MDIxMUMJLyogTXVsdGljYXN0IFBhY2tldHMgVHJhbnNtaXR0ZWQgQ291bnQgKEhpZ2gpICovCisjZGVmaW5lIElYR0JfVVBUQ0wgICAweDAyMTIwCS8qIFVuaWNhc3QgUGFja2V0cyBUcmFuc21pdHRlZCBDb3VudCAoTG93KSAqLworI2RlZmluZSBJWEdCX1VQVENIICAgMHgwMjEyNAkvKiBVbmljYXN0IFBhY2tldHMgVHJhbnNtaXR0ZWQgQ291bnQgKEhpZ2gpICovCisjZGVmaW5lIElYR0JfVlBUQ0wgICAweDAyMTI4CS8qIFZMQU4gUGFja2V0cyBUcmFuc21pdHRlZCBDb3VudCAoTG93KSAqLworI2RlZmluZSBJWEdCX1ZQVENIICAgMHgwMjEyQwkvKiBWTEFOIFBhY2tldHMgVHJhbnNtaXR0ZWQgQ291bnQgKEhpZ2gpICovCisjZGVmaW5lIElYR0JfSlBUQ0wgICAweDAyMTMwCS8qIEp1bWJvIFBhY2tldHMgVHJhbnNtaXR0ZWQgQ291bnQgKExvdykgKi8KKyNkZWZpbmUgSVhHQl9KUFRDSCAgIDB4MDIxMzQJLyogSnVtYm8gUGFja2V0cyBUcmFuc21pdHRlZCBDb3VudCAoSGlnaCkgKi8KKyNkZWZpbmUgSVhHQl9HT1RDTCAgIDB4MDIxMzgJLyogR29vZCBPY3RldHMgVHJhbnNtaXR0ZWQgQ291bnQgKExvdykgKi8KKyNkZWZpbmUgSVhHQl9HT1RDSCAgIDB4MDIxM0MJLyogR29vZCBPY3RldHMgVHJhbnNtaXR0ZWQgQ291bnQgKEhpZ2gpICovCisjZGVmaW5lIElYR0JfVE9UTCAgICAweDAyMTQwCS8qIFRvdGFsIE9jdGV0cyBUcmFuc21pdHRlZCBDb3VudCAoTG93KSAqLworI2RlZmluZSBJWEdCX1RPVEggICAgMHgwMjE0NAkvKiBUb3RhbCBPY3RldHMgVHJhbnNtaXR0ZWQgQ291bnQgKEhpZ2gpICovCisjZGVmaW5lIElYR0JfREMgICAgICAweDAyMTQ4CS8qIERlZmVyIENvdW50ICovCisjZGVmaW5lIElYR0JfUExUNjRDICAweDAyMTUwCS8qIFBhY2tldCBUcmFuc21pdHRlZCB3YXMgbGVzcyB0aGFuIDY0IGJ5dGVzIENvdW50ICovCisjZGVmaW5lIElYR0JfVFNDVEMgICAweDAyMTcwCS8qIFRDUCBTZWdtZW50YXRpb24gQ29udGV4dCBUcmFuc21pdHRlZCBDb3VudCAqLworI2RlZmluZSBJWEdCX1RTQ1RGQyAgMHgwMjE3OAkvKiBUQ1AgU2VnbWVudGF0aW9uIENvbnRleHQgVHggRmFpbCBDb3VudCAqLworI2RlZmluZSBJWEdCX0lCSUMgICAgMHgwMjE4MAkvKiBJbGxlZ2FsIGJ5dGUgZHVyaW5nIElkbGUgc3RyZWFtIGNvdW50ICovCisjZGVmaW5lIElYR0JfUkZDICAgICAweDAyMTg4CS8qIFJlbW90ZSBGYXVsdCBDb3VudCAqLworI2RlZmluZSBJWEdCX0xGQyAgICAgMHgwMjE5MAkvKiBMb2NhbCBGYXVsdCBDb3VudCAqLworI2RlZmluZSBJWEdCX1BGUkMgICAgMHgwMjE5OAkvKiBQYXVzZSBGcmFtZSBSZWNlaXZlIENvdW50ICovCisjZGVmaW5lIElYR0JfUEZUQyAgICAweDAyMUEwCS8qIFBhdXNlIEZyYW1lIFRyYW5zbWl0IENvdW50ICovCisjZGVmaW5lIElYR0JfTUNGUkMgICAweDAyMUE4CS8qIE1BQyBDb250cm9sIEZyYW1lcyAobm9uLVBhdXNlKSBSZWNlaXZlZCBDb3VudCAqLworI2RlZmluZSBJWEdCX01DRlRDICAgMHgwMjFCMAkvKiBNQUMgQ29udHJvbCBGcmFtZXMgKG5vbi1QYXVzZSkgVHJhbnNtaXR0ZWQgQ291bnQgKi8KKyNkZWZpbmUgSVhHQl9YT05SWEMgIDB4MDIxQjgJLyogWE9OIFJlY2VpdmVkIENvdW50ICovCisjZGVmaW5lIElYR0JfWE9OVFhDICAweDAyMUMwCS8qIFhPTiBUcmFuc21pdHRlZCBDb3VudCAqLworI2RlZmluZSBJWEdCX1hPRkZSWEMgMHgwMjFDOAkvKiBYT0ZGIFJlY2VpdmVkIENvdW50ICovCisjZGVmaW5lIElYR0JfWE9GRlRYQyAweDAyMUQwCS8qIFhPRkYgVHJhbnNtaXR0ZWQgQ291bnQgKi8KKyNkZWZpbmUgSVhHQl9SSkMgICAgIDB4MDIxRDgJLyogUmVjZWl2ZSBKYWJiZXIgQ291bnQgKi8KKworLyogQ1RSTDAgQml0IE1hc2tzICovCisjZGVmaW5lIElYR0JfQ1RSTDBfTFJTVCAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBJWEdCX0NUUkwwX0pGRSAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSVhHQl9DVFJMMF9YTEUgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIElYR0JfQ1RSTDBfTURDUyAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBJWEdCX0NUUkwwX0NNREMgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgSVhHQl9DVFJMMF9TRFAwICAgICAweDAwMDQwMDAwCisjZGVmaW5lIElYR0JfQ1RSTDBfU0RQMSAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBJWEdCX0NUUkwwX1NEUDIgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgSVhHQl9DVFJMMF9TRFAzICAgICAweDAwMjAwMDAwCisjZGVmaW5lIElYR0JfQ1RSTDBfU0RQMF9ESVIgMHgwMDQwMDAwMAorI2RlZmluZSBJWEdCX0NUUkwwX1NEUDFfRElSIDB4MDA4MDAwMDAKKyNkZWZpbmUgSVhHQl9DVFJMMF9TRFAyX0RJUiAweDAxMDAwMDAwCisjZGVmaW5lIElYR0JfQ1RSTDBfU0RQM19ESVIgMHgwMjAwMDAwMAorI2RlZmluZSBJWEdCX0NUUkwwX1JTVCAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgSVhHQl9DVFJMMF9SUEUgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIElYR0JfQ1RSTDBfVFBFICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBJWEdCX0NUUkwwX1ZNRSAgICAgIDB4NDAwMDAwMDAKKworLyogQ1RSTDEgQml0IE1hc2tzICovCisjZGVmaW5lIElYR0JfQ1RSTDFfR1BJMF9FTiAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBJWEdCX0NUUkwxX0dQSTFfRU4gICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSVhHQl9DVFJMMV9HUEkyX0VOICAgICAweDAwMDAwMDA0CisjZGVmaW5lIElYR0JfQ1RSTDFfR1BJM19FTiAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBJWEdCX0NUUkwxX1NEUDQgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSVhHQl9DVFJMMV9TRFA1ICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIElYR0JfQ1RSTDFfU0RQNiAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBJWEdCX0NUUkwxX1NEUDcgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgSVhHQl9DVFJMMV9TRFA0X0RJUiAgICAweDAwMDAwMTAwCisjZGVmaW5lIElYR0JfQ1RSTDFfU0RQNV9ESVIgICAgMHgwMDAwMDIwMAorI2RlZmluZSBJWEdCX0NUUkwxX1NEUDZfRElSICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgSVhHQl9DVFJMMV9TRFA3X0RJUiAgICAweDAwMDAwODAwCisjZGVmaW5lIElYR0JfQ1RSTDFfRUVfUlNUICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBJWEdCX0NUUkwxX1JPX0RJUyAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgSVhHQl9DVFJMMV9QQ0lYSE1fTUFTSyAweDAwQzAwMDAwCisjZGVmaW5lIElYR0JfQ1RSTDFfUENJWEhNXzFfMiAgMHgwMDAwMDAwMAorI2RlZmluZSBJWEdCX0NUUkwxX1BDSVhITV81XzggIDB4MDA0MDAwMDAKKyNkZWZpbmUgSVhHQl9DVFJMMV9QQ0lYSE1fM180ICAweDAwODAwMDAwCisjZGVmaW5lIElYR0JfQ1RSTDFfUENJWEhNXzdfOCAgMHgwMEMwMDAwMAorCisvKiBTVEFUVVMgQml0IE1hc2tzICovCisjZGVmaW5lIElYR0JfU1RBVFVTX0xVICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBJWEdCX1NUQVRVU19BSVAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgSVhHQl9TVEFUVVNfVFhPRkYgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIElYR0JfU1RBVFVTX1hBVUlNRSAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBJWEdCX1NUQVRVU19SRVMgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgSVhHQl9TVEFUVVNfUklTICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIElYR0JfU1RBVFVTX1JJRSAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBJWEdCX1NUQVRVU19STEYgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgSVhHQl9TVEFUVVNfUlJGICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIElYR0JfU1RBVFVTX1BDSV9TUEQgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBJWEdCX1NUQVRVU19CVVM2NCAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgSVhHQl9TVEFUVVNfUENJWF9NT0RFICAgICAweDAwMDAyMDAwCisjZGVmaW5lIElYR0JfU1RBVFVTX1BDSVhfU1BEX01BU0sgMHgwMDAwQzAwMAorI2RlZmluZSBJWEdCX1NUQVRVU19QQ0lYX1NQRF82NiAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSVhHQl9TVEFUVVNfUENJWF9TUERfMTAwICAweDAwMDA0MDAwCisjZGVmaW5lIElYR0JfU1RBVFVTX1BDSVhfU1BEXzEzMyAgMHgwMDAwODAwMAorI2RlZmluZSBJWEdCX1NUQVRVU19SRVZfSURfTUFTSyAgIDB4MDAwRjAwMDAKKyNkZWZpbmUgSVhHQl9TVEFUVVNfUkVWX0lEX1NISUZUICAxNgorCisvKiBFRUNEIEJpdCBNYXNrcyAqLworI2RlZmluZSBJWEdCX0VFQ0RfU0sgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBJWEdCX0VFQ0RfQ1MgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBJWEdCX0VFQ0RfREkgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBJWEdCX0VFQ0RfRE8gICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBJWEdCX0VFQ0RfRldFX01BU0sgMHgwMDAwMDAzMAorI2RlZmluZSBJWEdCX0VFQ0RfRldFX0RJUyAgMHgwMDAwMDAxMAorI2RlZmluZSBJWEdCX0VFQ0RfRldFX0VOICAgMHgwMDAwMDAyMAorCisvKiBNRlMgKi8KKyNkZWZpbmUgSVhHQl9NRlNfU0hJRlQgMTYKKworLyogSW50ZXJydXB0IFJlZ2lzdGVyIEJpdCBNYXNrcyAodXNlZCBmb3IgSUNSLCBJQ1MsIElNUywgYW5kIElNQykgKi8KKyNkZWZpbmUgSVhHQl9JTlRfVFhEVyAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBJWEdCX0lOVF9UWFFFICAgICAweDAwMDAwMDAyCisjZGVmaW5lIElYR0JfSU5UX0xTQyAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgSVhHQl9JTlRfUlhTRVEgICAgMHgwMDAwMDAwOAorI2RlZmluZSBJWEdCX0lOVF9SWERNVDAgICAweDAwMDAwMDEwCisjZGVmaW5lIElYR0JfSU5UX1JYTyAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgSVhHQl9JTlRfUlhUMCAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBJWEdCX0lOVF9BVVRPU0NBTiAweDAwMDAwMjAwCisjZGVmaW5lIElYR0JfSU5UX0dQSTAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgSVhHQl9JTlRfR1BJMSAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBJWEdCX0lOVF9HUEkyICAgICAweDAwMDAyMDAwCisjZGVmaW5lIElYR0JfSU5UX0dQSTMgICAgIDB4MDAwMDQwMDAKKworLyogUkNUTCBCaXQgTWFza3MgKi8KKyNkZWZpbmUgSVhHQl9SQ1RMX1JYRU4gICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSVhHQl9SQ1RMX1NCUCAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgSVhHQl9SQ1RMX1VQRSAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSVhHQl9SQ1RMX01QRSAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSVhHQl9SQ1RMX1JETVRTX01BU0sgIDB4MDAwMDAzMDAKKyNkZWZpbmUgSVhHQl9SQ1RMX1JETVRTXzFfMiAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSVhHQl9SQ1RMX1JETVRTXzFfNCAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgSVhHQl9SQ1RMX1JETVRTXzFfOCAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgSVhHQl9SQ1RMX01PX01BU0sgICAgIDB4MDAwMDMwMDAKKyNkZWZpbmUgSVhHQl9SQ1RMX01PXzQ3XzM2ICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSVhHQl9SQ1RMX01PXzQ2XzM1ICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgSVhHQl9SQ1RMX01PXzQ1XzM0ICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgSVhHQl9SQ1RMX01PXzQzXzMyICAgIDB4MDAwMDMwMDAKKyNkZWZpbmUgSVhHQl9SQ1RMX01PX1NISUZUICAgIDEyCisjZGVmaW5lIElYR0JfUkNUTF9CQU0gICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIElYR0JfUkNUTF9CU0laRV9NQVNLICAweDAwMDMwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9CU0laRV8yMDQ4ICAweDAwMDAwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9CU0laRV80MDk2ICAweDAwMDEwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9CU0laRV84MTkyICAweDAwMDIwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9CU0laRV8xNjM4NCAweDAwMDMwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9WRkUgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9DRklFTiAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9DRkkgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9SUERBX01BU0sgICAweDAwNjAwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9SUERBX01DX01BQyAweDAwMDAwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9NQ19PTkxZICAgICAweDAwNDAwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9DRkYgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIElYR0JfUkNUTF9TRUNSQyAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIElYR0JfUkRUX0ZQREIgICAgICAgICAweDgwMDAwMDAwCisKKyNkZWZpbmUgSVhHQl9SQ1RMX0lETEVfUlhfVU5JVCAwCisKKy8qIEZDUlRMIEJpdCBNYXNrcyAqLworI2RlZmluZSBJWEdCX0ZDUlRMX1hPTkUgICAgICAgMHg4MDAwMDAwMAorCisvKiBSWERDVEwgQml0IE1hc2tzICovCisjZGVmaW5lIElYR0JfUlhEQ1RMX1BUSFJFU0hfTUFTSyAgMHgwMDAwMDFGRgorI2RlZmluZSBJWEdCX1JYRENUTF9QVEhSRVNIX1NISUZUIDAKKyNkZWZpbmUgSVhHQl9SWERDVExfSFRIUkVTSF9NQVNLICAweDAwMDNGRTAwCisjZGVmaW5lIElYR0JfUlhEQ1RMX0hUSFJFU0hfU0hJRlQgOQorI2RlZmluZSBJWEdCX1JYRENUTF9XVEhSRVNIX01BU0sgIDB4MDdGQzAwMDAKKyNkZWZpbmUgSVhHQl9SWERDVExfV1RIUkVTSF9TSElGVCAxOAorCisvKiBSQUlEQyBCaXQgTWFza3MgKi8KKyNkZWZpbmUgSVhHQl9SQUlEQ19ISUdIVEhSU19NQVNLIDB4MDAwMDAwM0YKKyNkZWZpbmUgSVhHQl9SQUlEQ19ERUxBWV9NQVNLICAgIDB4MDAwRkY4MDAKKyNkZWZpbmUgSVhHQl9SQUlEQ19ERUxBWV9TSElGVCAgIDExCisjZGVmaW5lIElYR0JfUkFJRENfUE9MTF9NQVNLICAgICAweDFGRjAwMDAwCisjZGVmaW5lIElYR0JfUkFJRENfUE9MTF9TSElGVCAgICAyMAorI2RlZmluZSBJWEdCX1JBSURDX1JYVF9HQVRFICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBJWEdCX1JBSURDX0VOICAgICAgICAgICAgMHg4MDAwMDAwMAorCisjZGVmaW5lIElYR0JfUkFJRENfUE9MTF8xMDAwX0lOVEVSUlVQVFNfUEVSX1NFQ09ORCAgICAgIDEyMjAKKyNkZWZpbmUgSVhHQl9SQUlEQ19QT0xMXzUwMDBfSU5URVJSVVBUU19QRVJfU0VDT05EICAgICAgMjQ0CisjZGVmaW5lIElYR0JfUkFJRENfUE9MTF8xMDAwMF9JTlRFUlJVUFRTX1BFUl9TRUNPTkQgICAgIDEyMgorI2RlZmluZSBJWEdCX1JBSURDX1BPTExfMjAwMDBfSU5URVJSVVBUU19QRVJfU0VDT05EICAgICA2MQorCisvKiBSWENTVU0gQml0IE1hc2tzICovCisjZGVmaW5lIElYR0JfUlhDU1VNX0lQT0ZMIDB4MDAwMDAxMDAKKyNkZWZpbmUgSVhHQl9SWENTVU1fVFVPRkwgMHgwMDAwMDIwMAorCisvKiBSQUggQml0IE1hc2tzICovCisjZGVmaW5lIElYR0JfUkFIX0FTRUxfTUFTSyAweDAwMDMwMDAwCisjZGVmaW5lIElYR0JfUkFIX0FTRUxfREVTVCAweDAwMDAwMDAwCisjZGVmaW5lIElYR0JfUkFIX0FTRUxfU1JDICAweDAwMDEwMDAwCisjZGVmaW5lIElYR0JfUkFIX0FWICAgICAgICAweDgwMDAwMDAwCisKKy8qIFRDVEwgQml0IE1hc2tzICovCisjZGVmaW5lIElYR0JfVENUTF9UQ0UgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSVhHQl9UQ1RMX1RYRU4gMHgwMDAwMDAwMgorI2RlZmluZSBJWEdCX1RDVExfVFBERSAweDAwMDAwMDA0CisKKyNkZWZpbmUgSVhHQl9UQ1RMX0lETEVfVFhfVU5JVCAgMAorCisvKiBUWERDVEwgQml0IE1hc2tzICovCisjZGVmaW5lIElYR0JfVFhEQ1RMX1BUSFJFU0hfTUFTSyAgMHgwMDAwMDA3RgorI2RlZmluZSBJWEdCX1RYRENUTF9IVEhSRVNIX01BU0sgIDB4MDAwMDdGMDAKKyNkZWZpbmUgSVhHQl9UWERDVExfSFRIUkVTSF9TSElGVCA4CisjZGVmaW5lIElYR0JfVFhEQ1RMX1dUSFJFU0hfTUFTSyAgMHgwMDdGMDAwMAorI2RlZmluZSBJWEdCX1RYRENUTF9XVEhSRVNIX1NISUZUIDE2CisKKy8qIFRTUE1UIEJpdCBNYXNrcyAqLworI2RlZmluZSBJWEdCX1RTUE1UX1RTTVRfTUFTSyAgIDB4MDAwMEZGRkYKKyNkZWZpbmUgSVhHQl9UU1BNVF9UU1BCUF9NQVNLICAweEZGRkYwMDAwCisjZGVmaW5lIElYR0JfVFNQTVRfVFNQQlBfU0hJRlQgMTYKKworLyogUEFQIEJpdCBNYXNrcyAqLworI2RlZmluZSBJWEdCX1BBUF9UWFBDX01BU0sgMHgwMDAwRkZGRgorI2RlZmluZSBJWEdCX1BBUF9UWFBWX01BU0sgMHgwMDBGMDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWXzEwRyAgMHgwMDAwMDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWXzFHICAgMHgwMDAxMDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWXzJHICAgMHgwMDAyMDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWXzNHICAgMHgwMDAzMDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWXzRHICAgMHgwMDA0MDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWXzVHICAgMHgwMDA1MDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWXzZHICAgMHgwMDA2MDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWXzdHICAgMHgwMDA3MDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWXzhHICAgMHgwMDA4MDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWXzlHICAgMHgwMDA5MDAwMAorI2RlZmluZSBJWEdCX1BBUF9UWFBWX1dBTiAgMHgwMDBGMDAwMAorCisvKiBQQ1NDMSBCaXQgTWFza3MgKi8KKyNkZWZpbmUgSVhHQl9QQ1NDMV9MT09QQkFDSyAweDAwMDA0MDAwCisKKy8qIFBDU0MyIEJpdCBNYXNrcyAqLworI2RlZmluZSBJWEdCX1BDU0MyX1BDU19UWVBFX01BU0sgIDB4MDAwMDAwMDMKKyNkZWZpbmUgSVhHQl9QQ1NDMl9QQ1NfVFlQRV8xMEdCWCAweDAwMDAwMDAxCisKKy8qIFBDU1MxIEJpdCBNYXNrcyAqLworI2RlZmluZSBJWEdCX1BDU1MxX0xPQ0FMX0ZBVUxUICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgSVhHQl9QQ1NTMV9SWF9MSU5LX1NUQVRVUyAweDAwMDAwMDA0CisKKy8qIFBDU1MyIEJpdCBNYXNrcyAqLworI2RlZmluZSBJWEdCX1BDU1MyX0RFVl9QUkVTX01BU0sgMHgwMDAwQzAwMAorI2RlZmluZSBJWEdCX1BDU1MyX0RFVl9QUkVTICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBJWEdCX1BDU1MyX1RYX0xGICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBJWEdCX1BDU1MyX1JYX0xGICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBJWEdCX1BDU1MyXzEwR0JXICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBJWEdCX1BDU1MyXzEwR0JYICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBJWEdCX1BDU1MyXzEwR0JSICAgICAgICAgMHgwMDAwMDAwMQorCisvKiBYUENTUyBCaXQgTWFza3MgKi8KKyNkZWZpbmUgSVhHQl9YUENTU19BTElHTl9TVEFUVVMgMHgwMDAwMTAwMAorI2RlZmluZSBJWEdCX1hQQ1NTX1BBVFRFUk5fVEVTVCAweDAwMDAwODAwCisjZGVmaW5lIElYR0JfWFBDU1NfTEFORV8zX1NZTkMgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSVhHQl9YUENTU19MQU5FXzJfU1lOQyAgMHgwMDAwMDAwNAorI2RlZmluZSBJWEdCX1hQQ1NTX0xBTkVfMV9TWU5DICAweDAwMDAwMDAyCisjZGVmaW5lIElYR0JfWFBDU1NfTEFORV8wX1NZTkMgIDB4MDAwMDAwMDEKKworLyogWFBDU1RDIEJpdCBNYXNrcyAqLworI2RlZmluZSBJWEdCX1hQQ1NUQ19CRVJUX1RSSUcgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBJWEdCX1hQQ1NUQ19CRVJUX1NTVCAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBJWEdCX1hQQ1NUQ19CRVJUX1BTWl9NQVNLICAgMHgwMDBDMDAwMAorI2RlZmluZSBJWEdCX1hQQ1NUQ19CRVJUX1BTWl9TSElGVCAgMTcKKyNkZWZpbmUgSVhHQl9YUENTVENfQkVSVF9QU1pfSU5GICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgSVhHQl9YUENTVENfQkVSVF9QU1pfNjggICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSVhHQl9YUENTVENfQkVSVF9QU1pfMTAyOCAgIDB4MDAwMDAwMDAKKworLyogTVNDQSBiaXQgTWFza3MgKi8KKy8qIE5ldyBQcm90b2NvbCBBZGRyZXNzICovCisjZGVmaW5lIElYR0JfTVNDQV9OUF9BRERSX01BU0sgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIElYR0JfTVNDQV9OUF9BRERSX1NISUZUICAgICAwCisvKiBFaXRoZXIgRGV2aWNlIFR5cGUgb3IgUmVnaXN0ZXIgQWRkcmVzcyxkZXBlbmRpbmcgb24gU1RfQ09ERSAqLworI2RlZmluZSBJWEdCX01TQ0FfREVWX1RZUEVfTUFTSyAgICAgMHgwMDFGMDAwMAorI2RlZmluZSBJWEdCX01TQ0FfREVWX1RZUEVfU0hJRlQgICAgMTYKKyNkZWZpbmUgSVhHQl9NU0NBX1BIWV9BRERSX01BU0sgICAgIDB4MDNFMDAwMDAKKyNkZWZpbmUgSVhHQl9NU0NBX1BIWV9BRERSX1NISUZUICAgIDIxCisjZGVmaW5lIElYR0JfTVNDQV9PUF9DT0RFX01BU0sgICAgICAweDBDMDAwMDAwCisvKiBPUF9DT0RFID09IDAwLCBBZGRyZXNzIGN5Y2xlLCBOZXcgUHJvdG9jb2wgICAgICAgICAgICovCisvKiBPUF9DT0RFID09IDAxLCBXcml0ZSBvcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPUF9DT0RFID09IDEwLCBSZWFkIG9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPUF9DT0RFID09IDExLCBSZWFkLCBhdXRvIGluY3JlbWVudCwgTmV3IFByb3RvY29sICAgICovCisjZGVmaW5lIElYR0JfTVNDQV9BRERSX0NZQ0xFICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIElYR0JfTVNDQV9XUklURSAgICAgICAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIElYR0JfTVNDQV9SRUFEICAgICAgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIElYR0JfTVNDQV9SRUFEX0FVVE9JTkMgICAgICAweDBDMDAwMDAwCisjZGVmaW5lIElYR0JfTVNDQV9PUF9DT0RFX1NISUZUICAgICAyNgorI2RlZmluZSBJWEdCX01TQ0FfU1RfQ09ERV9NQVNLICAgICAgMHgzMDAwMDAwMAorLyogU1RfQ09ERSA9PSAwMCwgTmV3IFByb3RvY29sICAqLworLyogU1RfQ09ERSA9PSAwMSwgT2xkIFByb3RvY29sICAqLworI2RlZmluZSBJWEdCX01TQ0FfTkVXX1BST1RPQ09MICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBJWEdCX01TQ0FfT0xEX1BST1RPQ09MICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBJWEdCX01TQ0FfU1RfQ09ERV9TSElGVCAgICAgMjgKKy8qIEluaXRpYXRlIGNvbW1hbmQsIHNlbGYtY2xlYXJpbmcgd2hlbiBjb21tYW5kIGNvbXBsZXRlcyAqLworI2RlZmluZSBJWEdCX01TQ0FfTURJX0NPTU1BTkQgICAgICAgMHg0MDAwMDAwMAorLypNREkgSW4gUHJvZ3Jlc3MgRW5hYmxlLiAqLworI2RlZmluZSBJWEdCX01TQ0FfTURJX0lOX1BST0dfRU4gICAgMHg4MDAwMDAwMAorCisvKiBNU1JXRCBiaXQgbWFza3MgKi8KKyNkZWZpbmUgSVhHQl9NU1JXRF9XUklURV9EQVRBX01BU0sgIDB4MDAwMEZGRkYKKyNkZWZpbmUgSVhHQl9NU1JXRF9XUklURV9EQVRBX1NISUZUIDAKKyNkZWZpbmUgSVhHQl9NU1JXRF9SRUFEX0RBVEFfTUFTSyAgIDB4RkZGRjAwMDAKKyNkZWZpbmUgSVhHQl9NU1JXRF9SRUFEX0RBVEFfU0hJRlQgIDE2CisKKy8qIERlZmluaXRpb25zIGZvciB0aGUgb3B0aWNzIGRldmljZXMgb24gdGhlIE1ESU8gYnVzLiAqLworI2RlZmluZSBJWEdCX1BIWV9BRERSRVNTICAgICAgICAgICAgIDB4MAkvKiBTaW5nbGUgUEhZLCBtdWx0aXBsZSAiRGV2aWNlcyIgKi8KKworLyogU3RhbmRhcmQgZml2ZS1iaXQgRGV2aWNlIElEcy4gIFNlZSBJRUVFIDgwMi4zYWUsIGNsYXVzZSA0NSAqLworI2RlZmluZSBNRElPX1BNQV9QTURfRElEICAgICAgICAweDAxCisjZGVmaW5lIE1ESU9fV0lTX0RJRCAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTURJT19QQ1NfRElEICAgICAgICAgICAgMHgwMworI2RlZmluZSBNRElPX1hHWFNfRElEICAgICAgICAgICAweDA0CisKKy8qIFN0YW5kYXJkIFBNQS9QTUQgcmVnaXN0ZXJzIGFuZCBiaXQgZGVmaW5pdGlvbnMuICovCisvKiBOb3RlOiBUaGlzIGlzIGEgdmVyeSBsaW1pdGVkIHNldCBvZiBkZWZpbml0aW9ucywgICAgICAqLworLyogb25seSBpbXBsZW1lbnRlZCBmZWF0dXJlcyBhcmUgZGVmaW5lZC4gICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTURJT19QTUFfUE1EX0NSMSAgICAgICAgMHgwMDAwCisjZGVmaW5lIE1ESU9fUE1BX1BNRF9DUjFfUkVTRVQgIDB4ODAwMAorCisjZGVmaW5lIE1ESU9fUE1BX1BNRF9YUEFLX1ZFTkRPUl9OQU1FICAgICAgIDB4ODAzQQkvKiBYUEFLL1hFTlBBSyBkZXZpY2VzIG9ubHkgKi8KKworLyogVmVuZG9yLXNwZWNpZmljIE1ESU8gcmVnaXN0ZXJzICovCisjZGVmaW5lIEc2WFhYX1BNQV9QTURfVlMxICAgICAgICAgICAgICAgICAgIDB4QzAwMQkvKiBWZW5kb3Itc3BlY2lmaWMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRzZYWFhfWEdYU19YQVVJX1ZTMiAgICAgICAgICAgICAgICAgMHgxOAkvKiBWZW5kb3Itc3BlY2lmaWMgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBHNlhYWF9QTUFfUE1EX1ZTMV9QTExfUkVTRVQgICAgICAgICAweDgwCisjZGVmaW5lIEc2WFhYX1BNQV9QTURfVlMxX1JFTU9WRV9QTExfUkVTRVQgIDB4MDAKKyNkZWZpbmUgRzZYWFhfWEdYU19YQVVJX1ZTMl9JTlBVVF9NQVNLICAgICAgMHgwRgkvKiBYQVVJIGxhbmVzIHN5bmNocm9uaXplZCAqLworCisvKiBMYXlvdXQgb2YgYSBzaW5nbGUgcmVjZWl2ZSBkZXNjcmlwdG9yLiAgVGhlIGNvbnRyb2xsZXIgYXNzdW1lcyB0aGF0IHRoaXMKKyAqIHN0cnVjdHVyZSBpcyBwYWNrZWQgaW50byAxNiBieXRlcywgd2hpY2ggaXMgYSBzYWZlIGFzc3VtcHRpb24gd2l0aCBtb3N0CisgKiBjb21waWxlcnMuICBIb3dldmVyLCBzb21lIGNvbXBpbGVycyBtYXkgaW5zZXJ0IHBhZGRpbmcgYmV0d2VlbiB0aGUgZmllbGRzLAorICogaW4gd2hpY2ggY2FzZSB0aGUgc3RydWN0dXJlIG11c3QgYmUgcGFja2VkIGluIHNvbWUgY29tcGlsZXItc3BlY2lmaWMKKyAqIG1hbm5lci4gKi8KK3N0cnVjdCBpeGdiX3J4X2Rlc2MgeworCXVpbnQ2NF90IGJ1ZmZfYWRkcjsKKwl1aW50MTZfdCBsZW5ndGg7CisJdWludDE2X3QgcmVzZXJ2ZWQ7CisJdWludDhfdCBzdGF0dXM7CisJdWludDhfdCBlcnJvcnM7CisJdWludDE2X3Qgc3BlY2lhbDsKK307CisKKyNkZWZpbmUgSVhHQl9SWF9ERVNDX1NUQVRVU19ERCAgICAweDAxCisjZGVmaW5lIElYR0JfUlhfREVTQ19TVEFUVVNfRU9QICAgMHgwMgorI2RlZmluZSBJWEdCX1JYX0RFU0NfU1RBVFVTX0lYU00gIDB4MDQKKyNkZWZpbmUgSVhHQl9SWF9ERVNDX1NUQVRVU19WUCAgICAweDA4CisjZGVmaW5lIElYR0JfUlhfREVTQ19TVEFUVVNfVENQQ1MgMHgyMAorI2RlZmluZSBJWEdCX1JYX0RFU0NfU1RBVFVTX0lQQ1MgIDB4NDAKKyNkZWZpbmUgSVhHQl9SWF9ERVNDX1NUQVRVU19QSUYgICAweDgwCisKKyNkZWZpbmUgSVhHQl9SWF9ERVNDX0VSUk9SU19DRSAgIDB4MDEKKyNkZWZpbmUgSVhHQl9SWF9ERVNDX0VSUk9SU19TRSAgIDB4MDIKKyNkZWZpbmUgSVhHQl9SWF9ERVNDX0VSUk9SU19QICAgIDB4MDgKKyNkZWZpbmUgSVhHQl9SWF9ERVNDX0VSUk9SU19UQ1BFIDB4MjAKKyNkZWZpbmUgSVhHQl9SWF9ERVNDX0VSUk9SU19JUEUgIDB4NDAKKyNkZWZpbmUgSVhHQl9SWF9ERVNDX0VSUk9SU19SWEUgIDB4ODAKKworI2RlZmluZSBJWEdCX1JYX0RFU0NfU1BFQ0lBTF9WTEFOX01BU0sgIDB4MEZGRgkvKiBWTEFOIElEIGlzIGluIGxvd2VyIDEyIGJpdHMgKi8KKyNkZWZpbmUgSVhHQl9SWF9ERVNDX1NQRUNJQUxfUFJJX01BU0sgICAweEUwMDAJLyogUHJpb3JpdHkgaXMgaW4gdXBwZXIgMyBiaXRzICovCisjZGVmaW5lIElYR0JfUlhfREVTQ19TUEVDSUFMX1BSSV9TSElGVCAgMHgwMDBECS8qIFByaW9yaXR5IGlzIGluIHVwcGVyIDMgb2YgMTYgKi8KKworLyogTGF5b3V0IG9mIGEgc2luZ2xlIHRyYW5zbWl0IGRlc2NyaXB0b3IuICBUaGUgY29udHJvbGxlciBhc3N1bWVzIHRoYXQgdGhpcworICogc3RydWN0dXJlIGlzIHBhY2tlZCBpbnRvIDE2IGJ5dGVzLCB3aGljaCBpcyBhIHNhZmUgYXNzdW1wdGlvbiB3aXRoIG1vc3QKKyAqIGNvbXBpbGVycy4gIEhvd2V2ZXIsIHNvbWUgY29tcGlsZXJzIG1heSBpbnNlcnQgcGFkZGluZyBiZXR3ZWVuIHRoZSBmaWVsZHMsCisgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJ1Y3R1cmUgbXVzdCBiZSBwYWNrZWQgaW4gc29tZSBjb21waWxlci1zcGVjaWZpYworICogbWFubmVyLiAqLworc3RydWN0IGl4Z2JfdHhfZGVzYyB7CisJdWludDY0X3QgYnVmZl9hZGRyOworCXVpbnQzMl90IGNtZF90eXBlX2xlbjsKKwl1aW50OF90IHN0YXR1czsKKwl1aW50OF90IHBvcHRzOworCXVpbnQxNl90IHZsYW47Cit9OworCisjZGVmaW5lIElYR0JfVFhfREVTQ19MRU5HVEhfTUFTSyAgICAweDAwMEZGRkZGCisjZGVmaW5lIElYR0JfVFhfREVTQ19UWVBFX01BU0sgICAgICAweDAwRjAwMDAwCisjZGVmaW5lIElYR0JfVFhfREVTQ19UWVBFX1NISUZUICAgICAyMAorI2RlZmluZSBJWEdCX1RYX0RFU0NfQ01EX01BU0sgICAgICAgMHhGRjAwMDAwMAorI2RlZmluZSBJWEdCX1RYX0RFU0NfQ01EX1NISUZUICAgICAgMjQKKyNkZWZpbmUgSVhHQl9UWF9ERVNDX0NNRF9FT1AgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgSVhHQl9UWF9ERVNDX0NNRF9UU0UgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgSVhHQl9UWF9ERVNDX0NNRF9SUyAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgSVhHQl9UWF9ERVNDX0NNRF9WTEUgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgSVhHQl9UWF9ERVNDX0NNRF9JREUgICAgICAgIDB4ODAwMDAwMDAKKworI2RlZmluZSBJWEdCX1RYX0RFU0NfVFlQRSAgICAgICAgICAgMHgwMDEwMDAwMAorCisjZGVmaW5lIElYR0JfVFhfREVTQ19TVEFUVVNfREQgIDB4MDEKKworI2RlZmluZSBJWEdCX1RYX0RFU0NfUE9QVFNfSVhTTSAweDAxCisjZGVmaW5lIElYR0JfVFhfREVTQ19QT1BUU19UWFNNIDB4MDIKKyNkZWZpbmUgSVhHQl9UWF9ERVNDX1NQRUNJQUxfUFJJX1NISUZUICBJWEdCX1JYX0RFU0NfU1BFQ0lBTF9QUklfU0hJRlQJLyogUHJpb3JpdHkgaXMgaW4gdXBwZXIgMyBvZiAxNiAqLworCitzdHJ1Y3QgaXhnYl9jb250ZXh0X2Rlc2MgeworCXVpbnQ4X3QgaXBjc3M7CisJdWludDhfdCBpcGNzbzsKKwl1aW50MTZfdCBpcGNzZTsKKwl1aW50OF90IHR1Y3NzOworCXVpbnQ4X3QgdHVjc287CisJdWludDE2X3QgdHVjc2U7CisJdWludDMyX3QgY21kX3R5cGVfbGVuOworCXVpbnQ4X3Qgc3RhdHVzOworCXVpbnQ4X3QgaGRyX2xlbjsKKwl1aW50MTZfdCBtc3M7Cit9OworCisjZGVmaW5lIElYR0JfQ09OVEVYVF9ERVNDX0NNRF9UQ1AgMHgwMTAwMDAwMAorI2RlZmluZSBJWEdCX0NPTlRFWFRfREVTQ19DTURfSVAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgSVhHQl9DT05URVhUX0RFU0NfQ01EX1RTRSAweDA0MDAwMDAwCisjZGVmaW5lIElYR0JfQ09OVEVYVF9ERVNDX0NNRF9SUyAgMHgwODAwMDAwMAorI2RlZmluZSBJWEdCX0NPTlRFWFRfREVTQ19DTURfSURFIDB4ODAwMDAwMDAKKworI2RlZmluZSBJWEdCX0NPTlRFWFRfREVTQ19UWVBFIDB4MDAwMDAwMDAKKworI2RlZmluZSBJWEdCX0NPTlRFWFRfREVTQ19TVEFUVVNfREQgMHgwMQorCisvKiBGaWx0ZXJzICovCisjZGVmaW5lIElYR0JfTUNfVEJMX1NJWkUgICAgICAgICAgMTI4CS8qIE11bHRpY2FzdCBGaWx0ZXIgVGFibGUgKDQwOTYgYml0cykgKi8KKyNkZWZpbmUgSVhHQl9WTEFOX0ZJTFRFUl9UQkxfU0laRSAxMjgJLyogVkxBTiBGaWx0ZXIgVGFibGUgKDQwOTYgYml0cykgKi8KKyNkZWZpbmUgSVhHQl9SQVJfRU5UUklFUwkJICAzCS8qIE51bWJlciBvZiBlbnRyaWVzIGluIFJ4IEFkZHJlc3MgYXJyYXkgKi8KKworI2RlZmluZSBJWEdCX01FTU9SWV9SRUdJU1RFUl9CQVNFX0FERFJFU1MgICAwCisjZGVmaW5lIEVORVRfSEVBREVSX1NJWkUJCQkxNAorI2RlZmluZSBFTkVUX0ZDU19MRU5HVEgJCQkgNAorI2RlZmluZSBJWEdCX01BWF9OVU1fTVVMVElDQVNUX0FERFJFU1NFUwkxMjgKKyNkZWZpbmUgSVhHQl9NSU5fRU5FVF9GUkFNRV9TSVpFX1dJVEhPVVRfRkNTCTYwCisjZGVmaW5lIElYR0JfTUFYX0VORVRfRlJBTUVfU0laRV9XSVRIT1VUX0ZDUwkxNTE0CisjZGVmaW5lIElYR0JfTUFYX0pVTUJPX0ZSQU1FX1NJWkUJCTB4M0YwMAorCisvKiBQaHkgQWRkcmVzc2VzICovCisjZGVmaW5lIElYR0JfT1BUSUNBTF9QSFlfQUREUiAweDAJLyogT3B0aWNhbCBNb2R1bGUgcGh5IGFkZHJlc3MgKi8KKyNkZWZpbmUgSVhHQl9YQVVJSV9QSFlfQUREUiAgIDB4MQkvKiBYYXVpaSB0cmFuc2NlaXZlciBwaHkgYWRkcmVzcyAqLworI2RlZmluZSBJWEdCX0RJQUdfUEhZX0FERFIgICAgMHgxRgkvKiBEaWFnbm9zdGljIERldmljZSBwaHkgYWRkcmVzcyAqLworCisvKiBUaGlzIHN0cnVjdHVyZSB0YWtlcyBhIDY0ayBmbGFzaCBhbmQgbWFwcyBpdCBmb3IgaWRlbnRpZmljYXRpb24gY29tbWFuZHMgKi8KK3N0cnVjdCBpeGdiX2ZsYXNoX2J1ZmZlciB7CisJdWludDhfdCBtYW51ZmFjdHVyZXJfaWQ7CisJdWludDhfdCBkZXZpY2VfaWQ7CisJdWludDhfdCBmaWxsZXIxWzB4MkFBOF07CisJdWludDhfdCBjbWQyOworCXVpbnQ4X3QgZmlsbGVyMlsweDJBQUFdOworCXVpbnQ4X3QgY21kMTsKKwl1aW50OF90IGZpbGxlcjNbMHhBQUFBXTsKK307CisKKy8qCisgKiBUaGlzIGlzIGEgbGl0dGxlLWVuZGlhbiBzcGVjaWZpYyBjaGVjay4KKyAqLworI2RlZmluZSBJU19NVUxUSUNBU1QoQWRkcmVzcykgXAorICAgIChib29sZWFuX3QpKCgodWludDhfdCAqKShBZGRyZXNzKSlbMF0gJiAoKHVpbnQ4X3QpMHgwMSkpCisKKy8qCisgKiBDaGVjayB3aGV0aGVyIGFuIGFkZHJlc3MgaXMgYnJvYWRjYXN0LgorICovCisjZGVmaW5lIElTX0JST0FEQ0FTVChBZGRyZXNzKSAgICAgICAgICAgICAgIFwKKyAgICAoKCgodWludDhfdCAqKShBZGRyZXNzKSlbMF0gPT0gKCh1aW50OF90KTB4ZmYpKSAmJiAoKCh1aW50OF90ICopKEFkZHJlc3MpKVsxXSA9PSAoKHVpbnQ4X3QpMHhmZikpKQorCisvKiBGbG93IGNvbnRyb2wgcGFyYW1ldGVycyAqLworc3RydWN0IGl4Z2JfZmMgeworCXVpbnQzMl90IGhpZ2hfd2F0ZXI7CS8qIEZsb3cgQ29udHJvbCBIaWdoLXdhdGVyICAgICAgICAgICovCisJdWludDMyX3QgbG93X3dhdGVyOwkvKiBGbG93IENvbnRyb2wgTG93LXdhdGVyICAgICAgICAgICAqLworCXVpbnQxNl90IHBhdXNlX3RpbWU7CS8qIEZsb3cgQ29udHJvbCBQYXVzZSB0aW1lciAgICAgICAgICovCisJYm9vbGVhbl90IHNlbmRfeG9uOwkvKiBGbG93IGNvbnRyb2wgc2VuZCBYT04gICAgICAgICAgICAqLworCWl4Z2JfZmNfdHlwZSB0eXBlOwkvKiBUeXBlIG9mIGZsb3cgY29udHJvbCAgICAgICAgICAgICAqLworfTsKKworLyogVGhlIGhpc3RvcmljYWwgZGVmYXVsdHMgZm9yIHRoZSBmbG93IGNvbnRyb2wgdmFsdWVzIGFyZSBnaXZlbiBiZWxvdy4gKi8KKyNkZWZpbmUgRkNfREVGQVVMVF9ISV9USFJFU0ggICAgICAgICgweDgwMDApCS8qIDMyS0IgKi8KKyNkZWZpbmUgRkNfREVGQVVMVF9MT19USFJFU0ggICAgICAgICgweDQwMDApCS8qIDE2S0IgKi8KKyNkZWZpbmUgRkNfREVGQVVMVF9UWF9USU1FUiAgICAgICAgICgweDEwMCkJLyogfjEzMCB1cyAqLworCisvKiBQaHkgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgSVhHQl9NQVhfUEhZX1JFR19BRERSRVNTICAgIDB4RkZGRgorI2RlZmluZSBJWEdCX01BWF9QSFlfQUREUkVTUyAgICAgICAgMzEKKyNkZWZpbmUgSVhHQl9NQVhfUEhZX0RFVl9UWVBFICAgICAgIDMxCisKKy8qIEJ1cyBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgaXhnYl9idXMgeworCWl4Z2JfYnVzX3NwZWVkIHNwZWVkOworCWl4Z2JfYnVzX3dpZHRoIHdpZHRoOworCWl4Z2JfYnVzX3R5cGUgdHlwZTsKK307CisKK3N0cnVjdCBpeGdiX2h3IHsKKwl1aW50OF90IF9faW9tZW0gKmh3X2FkZHI7LyogQmFzZSBBZGRyZXNzIG9mIHRoZSBoYXJkd2FyZSAgICAgKi8KKwl2b2lkICpiYWNrOwkJLyogUG9pbnRlciB0byBPUy1kZXBlbmRlbnQgc3RydWN0ICAgKi8KKwlzdHJ1Y3QgaXhnYl9mYyBmYzsJLyogRmxvdyBjb250cm9sIHBhcmFtZXRlcnMgICAgICAgICAgKi8KKwlzdHJ1Y3QgaXhnYl9idXMgYnVzOwkvKiBCdXMgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAqLworCXVpbnQzMl90IHBoeV9pZDsJLyogUGh5IElkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgKi8KKwl1aW50MzJfdCBwaHlfYWRkcjsJLyogWEdNSUkgYWRkcmVzcyBvZiBQaHkgICAgICAgICAgICAgKi8KKwlpeGdiX21hY190eXBlIG1hY190eXBlOwkvKiBJZGVudGlmaWVyIGZvciBNQUMgY29udHJvbGxlciAgICAqLworCWl4Z2JfcGh5X3R5cGUgcGh5X3R5cGU7CS8qIFRyYW5zY2VpdmVyL3BoeSBpZGVudGlmaWVyICAgICAgICovCisJdWludDMyX3QgbWF4X2ZyYW1lX3NpemU7CS8qIE1heGltdW0gZnJhbWUgc2l6ZSBzdXBwb3J0ZWQgICAgICovCisJdWludDMyX3QgbWNfZmlsdGVyX3R5cGU7CS8qIE11bHRpY2FzdCBmaWx0ZXIgaGFzaCB0eXBlICAgICAgICovCisJdWludDMyX3QgbnVtX21jX2FkZHJzOwkvKiBOdW1iZXIgb2YgY3VycmVudCBNdWx0aWNhc3QgYWRkcnMgKi8KKwl1aW50OF90IGN1cnJfbWFjX2FkZHJbSVhHQl9FVEhfTEVOR1RIX09GX0FERFJFU1NdOwkvKiBJbmRpdmlkdWFsIGFkZHJlc3MgY3VycmVudGx5IHByb2dyYW1tZWQgaW4gTUFDICovCisJdWludDMyX3QgbnVtX3R4X2Rlc2M7CS8qIE51bWJlciBvZiBUcmFuc21pdCBkZXNjcmlwdG9ycyAgICovCisJdWludDMyX3QgbnVtX3J4X2Rlc2M7CS8qIE51bWJlciBvZiBSZWNlaXZlIGRlc2NyaXB0b3JzICAgICovCisJdWludDMyX3QgcnhfYnVmZmVyX3NpemU7CS8qIFNpemUgb2YgUmVjZWl2ZSBidWZmZXIgICAgICAgICAgICovCisJYm9vbGVhbl90IGxpbmtfdXA7CS8qIFRSVUUgaWYgbGluayBpcyB2YWxpZCAgICAgICAgICAgICovCisJYm9vbGVhbl90IGFkYXB0ZXJfc3RvcHBlZDsJLyogU3RhdGUgb2YgYWRhcHRlciAgICAgICAgICAgICAgICAgKi8KKwl1aW50MTZfdCBkZXZpY2VfaWQ7CS8qIGRldmljZSBpZCBmcm9tIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlICovCisJdWludDE2X3QgdmVuZG9yX2lkOwkvKiB2ZW5kb3IgaWQgZnJvbSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSAqLworCXVpbnQ4X3QgcmV2aXNpb25faWQ7CS8qIHJldmlzaW9uIGlkIGZyb20gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgKi8KKwl1aW50MTZfdCBzdWJzeXN0ZW1fdmVuZG9yX2lkOwkvKiBzdWJzeXN0ZW0gdmVuZG9yIGlkIGZyb20gUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgKi8KKwl1aW50MTZfdCBzdWJzeXN0ZW1faWQ7CS8qIHN1YnN5c3RlbSBpZCBmcm9tIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlICovCisJdWludDMyX3QgYmFyMDsJCS8qIEJhc2UgQWRkcmVzcyByZWdpc3RlcnMgICAgICAgICAgICovCisJdWludDMyX3QgYmFyMTsKKwl1aW50MzJfdCBiYXIyOworCXVpbnQzMl90IGJhcjM7CisJdWludDE2X3QgcGNpX2NtZF93b3JkOwkvKiBQQ0kgY29tbWFuZCByZWdpc3RlciBpZCBmcm9tIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlICovCisJdWludDE2X3QgZWVwcm9tW0lYR0JfRUVQUk9NX1NJWkVdOwkvKiBFRVBST00gY29udGVudHMgcmVhZCBhdCBpbml0IHRpbWUgICovCisJdW5zaWduZWQgbG9uZyBpb19iYXNlOwkvKiBPdXIgSS9PIG1hcHBlZCBsb2NhdGlvbiAqLworCXVpbnQzMl90IGxhc3RMRkM7CisJdWludDMyX3QgbGFzdFJGQzsKK307CisKKy8qIFN0YXRpc3RpY3MgcmVwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlICovCitzdHJ1Y3QgaXhnYl9od19zdGF0cyB7CisJdWludDY0X3QgdHBybDsKKwl1aW50NjRfdCB0cHJoOworCXVpbnQ2NF90IGdwcmNsOworCXVpbnQ2NF90IGdwcmNoOworCXVpbnQ2NF90IGJwcmNsOworCXVpbnQ2NF90IGJwcmNoOworCXVpbnQ2NF90IG1wcmNsOworCXVpbnQ2NF90IG1wcmNoOworCXVpbnQ2NF90IHVwcmNsOworCXVpbnQ2NF90IHVwcmNoOworCXVpbnQ2NF90IHZwcmNsOworCXVpbnQ2NF90IHZwcmNoOworCXVpbnQ2NF90IGpwcmNsOworCXVpbnQ2NF90IGpwcmNoOworCXVpbnQ2NF90IGdvcmNsOworCXVpbnQ2NF90IGdvcmNoOworCXVpbnQ2NF90IHRvcmw7CisJdWludDY0X3QgdG9yaDsKKwl1aW50NjRfdCBybmJjOworCXVpbnQ2NF90IHJ1YzsKKwl1aW50NjRfdCByb2M7CisJdWludDY0X3QgcmxlYzsKKwl1aW50NjRfdCBjcmNlcnJzOworCXVpbnQ2NF90IGljYmM7CisJdWludDY0X3QgZWNiYzsKKwl1aW50NjRfdCBtcGM7CisJdWludDY0X3QgdHB0bDsKKwl1aW50NjRfdCB0cHRoOworCXVpbnQ2NF90IGdwdGNsOworCXVpbnQ2NF90IGdwdGNoOworCXVpbnQ2NF90IGJwdGNsOworCXVpbnQ2NF90IGJwdGNoOworCXVpbnQ2NF90IG1wdGNsOworCXVpbnQ2NF90IG1wdGNoOworCXVpbnQ2NF90IHVwdGNsOworCXVpbnQ2NF90IHVwdGNoOworCXVpbnQ2NF90IHZwdGNsOworCXVpbnQ2NF90IHZwdGNoOworCXVpbnQ2NF90IGpwdGNsOworCXVpbnQ2NF90IGpwdGNoOworCXVpbnQ2NF90IGdvdGNsOworCXVpbnQ2NF90IGdvdGNoOworCXVpbnQ2NF90IHRvdGw7CisJdWludDY0X3QgdG90aDsKKwl1aW50NjRfdCBkYzsKKwl1aW50NjRfdCBwbHQ2NGM7CisJdWludDY0X3QgdHNjdGM7CisJdWludDY0X3QgdHNjdGZjOworCXVpbnQ2NF90IGliaWM7CisJdWludDY0X3QgcmZjOworCXVpbnQ2NF90IGxmYzsKKwl1aW50NjRfdCBwZnJjOworCXVpbnQ2NF90IHBmdGM7CisJdWludDY0X3QgbWNmcmM7CisJdWludDY0X3QgbWNmdGM7CisJdWludDY0X3QgeG9ucnhjOworCXVpbnQ2NF90IHhvbnR4YzsKKwl1aW50NjRfdCB4b2ZmcnhjOworCXVpbnQ2NF90IHhvZmZ0eGM7CisJdWludDY0X3QgcmpjOworfTsKKworLyogRnVuY3Rpb24gUHJvdG90eXBlcyAqLworZXh0ZXJuIGJvb2xlYW5fdCBpeGdiX2FkYXB0ZXJfc3RvcChzdHJ1Y3QgaXhnYl9odyAqaHcpOworZXh0ZXJuIGJvb2xlYW5fdCBpeGdiX2luaXRfaHcoc3RydWN0IGl4Z2JfaHcgKmh3KTsKK2V4dGVybiBib29sZWFuX3QgaXhnYl9hZGFwdGVyX3N0YXJ0KHN0cnVjdCBpeGdiX2h3ICpodyk7CitleHRlcm4gdm9pZCBpeGdiX2luaXRfcnhfYWRkcnMoc3RydWN0IGl4Z2JfaHcgKmh3KTsKK2V4dGVybiB2b2lkIGl4Z2JfY2hlY2tfZm9yX2xpbmsoc3RydWN0IGl4Z2JfaHcgKmh3KTsKK2V4dGVybiBib29sZWFuX3QgaXhnYl9jaGVja19mb3JfYmFkX2xpbmsoc3RydWN0IGl4Z2JfaHcgKmh3KTsKK2V4dGVybiBib29sZWFuX3QgaXhnYl9zZXR1cF9mYyhzdHJ1Y3QgaXhnYl9odyAqaHcpOworZXh0ZXJuIHZvaWQgaXhnYl9jbGVhcl9od19jbnRycyhzdHJ1Y3QgaXhnYl9odyAqaHcpOworZXh0ZXJuIGJvb2xlYW5fdCBtYWNfYWRkcl92YWxpZCh1aW50OF90ICptYWNfYWRkcik7CisKK2V4dGVybiB1aW50MTZfdCBpeGdiX3JlYWRfcGh5X3JlZyhzdHJ1Y3QgaXhnYl9odyAqaHcsCisJCQkJdWludDMyX3QgcmVnX2FkZHIsCisJCQkJdWludDMyX3QgcGh5X2FkZHIsCisJCQkJdWludDMyX3QgZGV2aWNlX3R5cGUpOworCitleHRlcm4gdm9pZCBpeGdiX3dyaXRlX3BoeV9yZWcoc3RydWN0IGl4Z2JfaHcgKmh3LAorCQkJCXVpbnQzMl90IHJlZ19hZGRyLAorCQkJCXVpbnQzMl90IHBoeV9hZGRyLAorCQkJCXVpbnQzMl90IGRldmljZV90eXBlLAorCQkJCXVpbnQxNl90IGRhdGEpOworCitleHRlcm4gdm9pZCBpeGdiX3Jhcl9zZXQoc3RydWN0IGl4Z2JfaHcgKmh3LAorCQkJCXVpbnQ4X3QgKmFkZHIsCisJCQkJdWludDMyX3QgaW5kZXgpOworCisKKy8qIEZpbHRlcnMgKG11bHRpY2FzdCwgdmxhbiwgcmVjZWl2ZSkgKi8KK2V4dGVybiB2b2lkIGl4Z2JfbWNfYWRkcl9saXN0X3VwZGF0ZShzdHJ1Y3QgaXhnYl9odyAqaHcsCisJCQkJICAgdWludDhfdCAqbWNfYWRkcl9saXN0LAorCQkJCSAgIHVpbnQzMl90IG1jX2FkZHJfY291bnQsCisJCQkJICAgdWludDMyX3QgcGFkKTsKKworLyogVmZ0YSBmdW5jdGlvbnMgKi8KK2V4dGVybiB2b2lkIGl4Z2Jfd3JpdGVfdmZ0YShzdHJ1Y3QgaXhnYl9odyAqaHcsCisJCQkJIHVpbnQzMl90IG9mZnNldCwKKwkJCQkgdWludDMyX3QgdmFsdWUpOworCitleHRlcm4gdm9pZCBpeGdiX2NsZWFyX3ZmdGEoc3RydWN0IGl4Z2JfaHcgKmh3KTsKKworLyogQWNjZXNzIGZ1bmN0aW9ucyB0byBlZXByb20gZGF0YSAqLwordm9pZCBpeGdiX2dldF9lZV9tYWNfYWRkcihzdHJ1Y3QgaXhnYl9odyAqaHcsIHVpbnQ4X3QgKm1hY19hZGRyKTsKK3VpbnQxNl90IGl4Z2JfZ2V0X2VlX2NvbXBhdGliaWxpdHkoc3RydWN0IGl4Z2JfaHcgKmh3KTsKK3VpbnQzMl90IGl4Z2JfZ2V0X2VlX3BiYV9udW1iZXIoc3RydWN0IGl4Z2JfaHcgKmh3KTsKK3VpbnQxNl90IGl4Z2JfZ2V0X2VlX2luaXRfY3RybF9yZWdfMShzdHJ1Y3QgaXhnYl9odyAqaHcpOwordWludDE2X3QgaXhnYl9nZXRfZWVfaW5pdF9jdHJsX3JlZ18yKHN0cnVjdCBpeGdiX2h3ICpodyk7Cit1aW50MTZfdCBpeGdiX2dldF9lZV9zdWJzeXN0ZW1faWQoc3RydWN0IGl4Z2JfaHcgKmh3KTsKK3VpbnQxNl90IGl4Z2JfZ2V0X2VlX3N1YnZlbmRvcl9pZChzdHJ1Y3QgaXhnYl9odyAqaHcpOwordWludDE2X3QgaXhnYl9nZXRfZWVfZGV2aWNlX2lkKHN0cnVjdCBpeGdiX2h3ICpodyk7Cit1aW50MTZfdCBpeGdiX2dldF9lZV92ZW5kb3JfaWQoc3RydWN0IGl4Z2JfaHcgKmh3KTsKK3VpbnQxNl90IGl4Z2JfZ2V0X2VlX3N3ZHBpbnNfcmVnKHN0cnVjdCBpeGdiX2h3ICpodyk7Cit1aW50OF90IGl4Z2JfZ2V0X2VlX2QzX3Bvd2VyKHN0cnVjdCBpeGdiX2h3ICpodyk7Cit1aW50OF90IGl4Z2JfZ2V0X2VlX2QwX3Bvd2VyKHN0cnVjdCBpeGdiX2h3ICpodyk7Citib29sZWFuX3QgaXhnYl9nZXRfZWVwcm9tX2RhdGEoc3RydWN0IGl4Z2JfaHcgKmh3KTsKK3VpbnQxNl90IGl4Z2JfZ2V0X2VlcHJvbV93b3JkKHN0cnVjdCBpeGdiX2h3ICpodywgdWludDE2X3QgaW5kZXgpOworCisvKiBFdmVyeXRoaW5nIGVsc2UgKi8KK3ZvaWQgaXhnYl9sZWRfb24oc3RydWN0IGl4Z2JfaHcgKmh3KTsKK3ZvaWQgaXhnYl9sZWRfb2ZmKHN0cnVjdCBpeGdiX2h3ICpodyk7Cit2b2lkIGl4Z2Jfd3JpdGVfcGNpX2NmZyhzdHJ1Y3QgaXhnYl9odyAqaHcsCisJCQkgdWludDMyX3QgcmVnLAorCQkJIHVpbnQxNl90ICogdmFsdWUpOworCisKKyNlbmRpZiAvKiBfSVhHQl9IV19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYi9peGdiX2lkcy5oIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX2lkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZTIwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2JfaWRzLmgKQEAgLTAsMCArMSw0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAKKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDA1IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgCisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIAorICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAorICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCAKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIAorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIAorICBtb3JlIGRldGFpbHMuCisgIAorICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSAKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgIAorICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAgCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIExpbnV4IE5JQ1MgPGxpbnV4Lm5pY3NAaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0lYR0JfSURTX0hfCisjZGVmaW5lIF9JWEdCX0lEU19IXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogVGhlIERldmljZSBhbmQgVmVuZG9yIElEcyBmb3IgMTAgR2lnYWJpdCBNQUNzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElOVEVMX1ZFTkRPUl9JRCAgICAgICAgICAgICAweDgwODYKKyNkZWZpbmUgSU5URUxfU1VCVkVORE9SX0lEICAgICAgICAgIDB4ODA4NgorCisKKyNkZWZpbmUgSVhHQl9ERVZJQ0VfSURfODI1OTdFWCAgICAgIDB4MTA0OCAgIAorI2RlZmluZSBJWEdCX0RFVklDRV9JRF84MjU5N0VYX1NSICAgMHgxQTQ4ICAgCisjZGVmaW5lIElYR0JfREVWSUNFX0lEXzgyNTk3RVhfTFIgICAweDFCNDgKKyNkZWZpbmUgSVhHQl9TVUJERVZJQ0VfSURfQTExRiAgICAgIDB4QTExRiAgIAorI2RlZmluZSBJWEdCX1NVQkRFVklDRV9JRF9BMDFGICAgICAgMHhBMDFGICAgCisKKyNlbmRpZiAvKiAjaWZuZGVmIF9JWEdCX0lEU19IXyAqLworCisvKiBFbmQgb2YgRmlsZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYi9peGdiX21haW4uYyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QyNjYyMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9tYWluLmMKQEAgLTAsMCArMSwyMTY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIAorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIAorICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCAKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgCisgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgCisgIGFueSBsYXRlciB2ZXJzaW9uLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgCisgIG1vcmUgZGV0YWlscy4KKyAgCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IAorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAgCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICAKKyAgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAgTGludXggTklDUyA8bGludXgubmljc0BpbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIml4Z2IuaCIKKworLyogQ2hhbmdlIExvZworICogMS4wLjg4IDAxLzA1LzA1CisgKiAtIGluY2x1ZGUgZml4IHRvIHRoZSBjb25kaXRpb24gdGhhdCBkZXRlcm1pbmVzIHdoZW4gdG8gcXVpdCBOQVBJIC0gUm9iZXJ0IE9sc3NvbgorICogLSB1c2UgbmV0aWZfcG9sbF97ZGlzYWJsZS9lbmFibGV9IHRvIHN5bmNocm9uaXplIGJldHdlZW4gTkFQSSBhbmQgaS9mIHVwL2Rvd24KKyAqIDEuMC44NCAxMC8yNi8wNAorICogLSByZXNldCBidWZmZXJfaW5mby0+ZG1hIGluIFR4IHJlc291cmNlIGNsZWFudXAgbG9naWMKKyAqIDEuMC44MyAxMC8xMi8wNAorICogLSBzcGFyc2UgY2xlYW51cCAtIHNoZW1taW5nZXJAb3NkbC5vcmcKKyAqIC0gZml4IHR4IHJlc291cmNlIGNsZWFudXAgbG9naWMKKyAqLworCitjaGFyIGl4Z2JfZHJpdmVyX25hbWVbXSA9ICJpeGdiIjsKK2NoYXIgaXhnYl9kcml2ZXJfc3RyaW5nW10gPSAiSW50ZWwoUikgUFJPLzEwR2JFIE5ldHdvcmsgRHJpdmVyIjsKKworI2lmbmRlZiBDT05GSUdfSVhHQl9OQVBJCisjZGVmaW5lIERSSVZFUk5BUEkKKyNlbHNlCisjZGVmaW5lIERSSVZFUk5BUEkgIi1OQVBJIgorI2VuZGlmCitjaGFyIGl4Z2JfZHJpdmVyX3ZlcnNpb25bXSA9ICIxLjAuOTAtazIiRFJJVkVSTkFQSTsKK2NoYXIgaXhnYl9jb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4iOworCisvKiBpeGdiX3BjaV90YmwgLSBQQ0kgRGV2aWNlIElEIFRhYmxlCisgKgorICogV2lsZGNhcmQgZW50cmllcyAoUENJX0FOWV9JRCkgc2hvdWxkIGNvbWUgbGFzdAorICogTGFzdCBlbnRyeSBtdXN0IGJlIGFsbCAwcworICoKKyAqIHsgVmVuZG9yIElELCBEZXZpY2UgSUQsIFN1YlZlbmRvciBJRCwgU3ViRGV2aWNlIElELAorICogICBDbGFzcywgQ2xhc3MgTWFzaywgcHJpdmF0ZSBkYXRhIChub3QgdXNlZCkgfQorICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaXhnYl9wY2lfdGJsW10gPSB7CisJe0lOVEVMX1ZFTkRPUl9JRCwgSVhHQl9ERVZJQ0VfSURfODI1OTdFWCwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe0lOVEVMX1ZFTkRPUl9JRCwgSVhHQl9ERVZJQ0VfSURfODI1OTdFWF9TUiwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJe0lOVEVMX1ZFTkRPUl9JRCwgSVhHQl9ERVZJQ0VfSURfODI1OTdFWF9MUiwgIAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKworCS8qIHJlcXVpcmVkIGxhc3QgZW50cnkgKi8KKwl7MCx9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaXhnYl9wY2lfdGJsKTsKKworLyogTG9jYWwgRnVuY3Rpb24gUHJvdG90eXBlcyAqLworCitpbnQgaXhnYl91cChzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgaXhnYl9kb3duKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIsIGJvb2xlYW5fdCBraWxsX3dhdGNoZG9nKTsKK3ZvaWQgaXhnYl9yZXNldChzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKK2ludCBpeGdiX3NldHVwX3R4X3Jlc291cmNlcyhzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKK2ludCBpeGdiX3NldHVwX3J4X3Jlc291cmNlcyhzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgaXhnYl9mcmVlX3R4X3Jlc291cmNlcyhzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgaXhnYl9mcmVlX3J4X3Jlc291cmNlcyhzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgaXhnYl91cGRhdGVfc3RhdHMoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcik7CisKK3N0YXRpYyBpbnQgaXhnYl9pbml0X21vZHVsZSh2b2lkKTsKK3N0YXRpYyB2b2lkIGl4Z2JfZXhpdF9tb2R1bGUodm9pZCk7CitzdGF0aWMgaW50IGl4Z2JfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOworc3RhdGljIHZvaWQgX19kZXZleGl0IGl4Z2JfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKK3N0YXRpYyBpbnQgaXhnYl9zd19pbml0KHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCBpeGdiX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgaW50IGl4Z2JfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgdm9pZCBpeGdiX2NvbmZpZ3VyZV90eChzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyB2b2lkIGl4Z2JfY29uZmlndXJlX3J4KHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgaXhnYl9zZXR1cF9yY3RsKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgaXhnYl9jbGVhbl90eF9yaW5nKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgaXhnYl9jbGVhbl9yeF9yaW5nKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIHZvaWQgaXhnYl9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgdm9pZCBpeGdiX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgaW50IGl4Z2JfeG1pdF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXhnYl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgaW50IGl4Z2JfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgbmV3X210dSk7CitzdGF0aWMgaW50IGl4Z2Jfc2V0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpwKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBpeGdiX2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGJvb2xlYW5fdCBpeGdiX2NsZWFuX3R4X2lycShzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKKyNpZmRlZiBDT05GSUdfSVhHQl9OQVBJCitzdGF0aWMgaW50IGl4Z2JfY2xlYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50ICpidWRnZXQpOworc3RhdGljIGJvb2xlYW5fdCBpeGdiX2NsZWFuX3J4X2lycShzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgIGludCAqd29ya19kb25lLCBpbnQgd29ya190b19kbyk7CisjZWxzZQorc3RhdGljIGJvb2xlYW5fdCBpeGdiX2NsZWFuX3J4X2lycShzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgaXhnYl9hbGxvY19yeF9idWZmZXJzKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBpeGdiX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKK3N0YXRpYyB2b2lkIGl4Z2JfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGl4Z2JfdHhfdGltZW91dF90YXNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaXhnYl92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJICBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKTsKK3N0YXRpYyB2b2lkIGl4Z2Jfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQxNl90IHZpZCk7CitzdGF0aWMgdm9pZCBpeGdiX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDE2X3QgdmlkKTsKK3N0YXRpYyB2b2lkIGl4Z2JfcmVzdG9yZV92bGFuKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpOworCitzdGF0aWMgaW50IGl4Z2Jfbm90aWZ5X3JlYm9vdChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyBldmVudCwKKwkJCSAgICAgIHZvaWQgKnB0cik7CitzdGF0aWMgaW50IGl4Z2Jfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdWludDMyX3Qgc3RhdGUpOworCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKy8qIGZvciBuZXRkdW1wIC8gbmV0IGNvbnNvbGUgKi8KK3N0YXRpYyB2b2lkIGl4Z2JfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorCitzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaXhnYl9ub3RpZmllcl9yZWJvb3QgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBpeGdiX25vdGlmeV9yZWJvb3QsCisJLm5leHQgPSBOVUxMLAorCS5wcmlvcml0eSA9IDAKK307CisKKy8qIEV4cG9ydGVkIGZyb20gb3RoZXIgbW9kdWxlcyAqLworCitleHRlcm4gdm9pZCBpeGdiX2NoZWNrX29wdGlvbnMoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpeGdiX2RyaXZlciA9IHsKKwkubmFtZSA9IGl4Z2JfZHJpdmVyX25hbWUsCisJLmlkX3RhYmxlID0gaXhnYl9wY2lfdGJsLAorCS5wcm9iZSA9IGl4Z2JfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGl4Z2JfcmVtb3ZlKSwKKwkvKiBQb3dlciBNYW5hZ21lbnQgSG9va3MgKi8KKwkuc3VzcGVuZCA9IE5VTEwsCisJLnJlc3VtZSA9IE5VTEwKK307CisKK01PRFVMRV9BVVRIT1IoIkludGVsIENvcnBvcmF0aW9uLCA8bGludXgubmljc0BpbnRlbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsKFIpIFBSTy8xMEdiRSBOZXR3b3JrIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBzb21lIGRlZmluZXMgZm9yIGNvbnRyb2xsaW5nIGRlc2NyaXB0b3IgZmV0Y2hlcyBpbiBoL3cgKi8KKyNkZWZpbmUgUlhEQ1RMX1BUSFJFU0hfREVGQVVMVCAxMjgJLyogY2hpcCBjb25zaWRlcnMgcHJlZmVjaCBiZWxvdyB0aGlzICovCisjZGVmaW5lIFJYRENUTF9IVEhSRVNIX0RFRkFVTFQgMTYJLyogY2hpcCB3aWxsIG9ubHkgcHJlZmV0Y2ggaWYgdGFpbCBpcyAKKwkJCQkJICAgcHVzaGVkIHRoaXMgbWFueSBkZXNjcmlwdG9ycyBmcm9tIGhlYWQgKi8KKyNkZWZpbmUgUlhEQ1RMX1dUSFJFU0hfREVGQVVMVCAxNgkvKiBjaGlwIHdyaXRlcyBiYWNrIGF0IHRoaXMgbWFueSBvciBSWFQwICovCisKKy8qKgorICogaXhnYl9pbml0X21vZHVsZSAtIERyaXZlciBSZWdpc3RyYXRpb24gUm91dGluZQorICoKKyAqIGl4Z2JfaW5pdF9tb2R1bGUgaXMgdGhlIGZpcnN0IHJvdXRpbmUgY2FsbGVkIHdoZW4gdGhlIGRyaXZlciBpcworICogbG9hZGVkLiBBbGwgaXQgZG9lcyBpcyByZWdpc3RlciB3aXRoIHRoZSBQQ0kgc3Vic3lzdGVtLgorICoqLworCitzdGF0aWMgaW50IF9faW5pdAoraXhnYl9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXQ7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgLSB2ZXJzaW9uICVzXG4iLAorCSAgICAgICBpeGdiX2RyaXZlcl9zdHJpbmcsIGl4Z2JfZHJpdmVyX3ZlcnNpb24pOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIGl4Z2JfY29weXJpZ2h0KTsKKworCXJldCA9IHBjaV9tb2R1bGVfaW5pdCgmaXhnYl9kcml2ZXIpOworCWlmKHJldCA+PSAwKSB7CisJCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmaXhnYl9ub3RpZmllcl9yZWJvb3QpOworCX0KKwlyZXR1cm4gcmV0OworfQorCittb2R1bGVfaW5pdChpeGdiX2luaXRfbW9kdWxlKTsKKworLyoqCisgKiBpeGdiX2V4aXRfbW9kdWxlIC0gRHJpdmVyIEV4aXQgQ2xlYW51cCBSb3V0aW5lCisgKgorICogaXhnYl9leGl0X21vZHVsZSBpcyBjYWxsZWQganVzdCBiZWZvcmUgdGhlIGRyaXZlciBpcyByZW1vdmVkCisgKiBmcm9tIG1lbW9yeS4KKyAqKi8KKworc3RhdGljIHZvaWQgX19leGl0CitpeGdiX2V4aXRfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJml4Z2Jfbm90aWZpZXJfcmVib290KTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJml4Z2JfZHJpdmVyKTsKK30KKworbW9kdWxlX2V4aXQoaXhnYl9leGl0X21vZHVsZSk7CisKKy8qKgorICogaXhnYl9pcnFfZGlzYWJsZSAtIE1hc2sgb2ZmIGludGVycnVwdCBnZW5lcmF0aW9uIG9uIHRoZSBOSUMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoqLworCitzdGF0aWMgaW5saW5lIHZvaWQKK2l4Z2JfaXJxX2Rpc2FibGUoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlhdG9taWNfaW5jKCZhZGFwdGVyLT5pcnFfc2VtKTsKKwlJWEdCX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElNQywgfjApOworCUlYR0JfV1JJVEVfRkxVU0goJmFkYXB0ZXItPmh3KTsKKwlzeW5jaHJvbml6ZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxKTsKK30KKworLyoqCisgKiBpeGdiX2lycV9lbmFibGUgLSBFbmFibGUgZGVmYXVsdCBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBzZXR0aW5ncworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraXhnYl9pcnFfZW5hYmxlKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYoYXRvbWljX2RlY19hbmRfdGVzdCgmYWRhcHRlci0+aXJxX3NlbSkpIHsKKwkJSVhHQl9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJTVMsCisJCQkgICBJWEdCX0lOVF9SWFQwIHwgSVhHQl9JTlRfUlhETVQwIHwgSVhHQl9JTlRfVFhEVyB8CisJCQkgICBJWEdCX0lOVF9SWE8gfCBJWEdCX0lOVF9MU0MpOworCQlJWEdCX1dSSVRFX0ZMVVNIKCZhZGFwdGVyLT5odyk7CisJfQorfQorCitpbnQKK2l4Z2JfdXAoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCWludCBlcnI7CisJaW50IG1heF9mcmFtZSA9IG5ldGRldi0+bXR1ICsgRU5FVF9IRUFERVJfU0laRSArIEVORVRfRkNTX0xFTkdUSDsKKwlzdHJ1Y3QgaXhnYl9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisKKwkvKiBoYXJkd2FyZSBoYXMgYmVlbiByZXNldCwgd2UgbmVlZCB0byByZWxvYWQgc29tZSB0aGluZ3MgKi8KKworCWl4Z2Jfc2V0X211bHRpKG5ldGRldik7CisKKwlpeGdiX3Jlc3RvcmVfdmxhbihhZGFwdGVyKTsKKworCWl4Z2JfY29uZmlndXJlX3R4KGFkYXB0ZXIpOworCWl4Z2Jfc2V0dXBfcmN0bChhZGFwdGVyKTsKKwlpeGdiX2NvbmZpZ3VyZV9yeChhZGFwdGVyKTsKKwlpeGdiX2FsbG9jX3J4X2J1ZmZlcnMoYWRhcHRlcik7CisKKyNpZmRlZiBDT05GSUdfUENJX01TSQorCXsKKwlib29sZWFuX3QgcGNpeCA9IChJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1RBVFVTKSAmIAorCQkJCQkJICBJWEdCX1NUQVRVU19QQ0lYX01PREUpID8gVFJVRSA6IEZBTFNFOworCWFkYXB0ZXItPmhhdmVfbXNpID0gVFJVRTsKKworCWlmICghcGNpeCkKKwkgICBhZGFwdGVyLT5oYXZlX21zaSA9IEZBTFNFOworCWVsc2UgaWYoKGVyciA9IHBjaV9lbmFibGVfbXNpKGFkYXB0ZXItPnBkZXYpKSkgeworCQlwcmludGsgKEtFUk5fRVJSCisJCSAiVW5hYmxlIHRvIGFsbG9jYXRlIE1TSSBpbnRlcnJ1cHQgRXJyb3I6ICVkXG4iLCBlcnIpOworCQlhZGFwdGVyLT5oYXZlX21zaSA9IEZBTFNFOworCQkvKiBwcm9jZWVkIHRvIHRyeSB0byByZXF1ZXN0IHJlZ3VsYXIgaW50ZXJydXB0ICovCisJfQorCX0KKworI2VuZGlmCisJaWYoKGVyciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSwgJml4Z2JfaW50ciwKKwkJCQkgIFNBX1NISVJRIHwgU0FfU0FNUExFX1JBTkRPTSwKKwkJCQkgIG5ldGRldi0+bmFtZSwgbmV0ZGV2KSkpCisJCXJldHVybiBlcnI7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgYW5kIGdldCB0aGUgaGFyZHdhcmUgaW50byBhIGtub3duIHN0YXRlICovCisJSVhHQl9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJTUMsIDB4ZmZmZmZmZmYpOworCisJaWYoKGh3LT5tYXhfZnJhbWVfc2l6ZSAhPSBtYXhfZnJhbWUpIHx8CisJCShody0+bWF4X2ZyYW1lX3NpemUgIT0KKwkJKElYR0JfUkVBRF9SRUcoaHcsIE1GUykgPj4gSVhHQl9NRlNfU0hJRlQpKSkgeworCisJCWh3LT5tYXhfZnJhbWVfc2l6ZSA9IG1heF9mcmFtZTsKKworCQlJWEdCX1dSSVRFX1JFRyhodywgTUZTLCBody0+bWF4X2ZyYW1lX3NpemUgPDwgSVhHQl9NRlNfU0hJRlQpOworCisJCWlmKGh3LT5tYXhfZnJhbWVfc2l6ZSA+CisJCSAgIElYR0JfTUFYX0VORVRfRlJBTUVfU0laRV9XSVRIT1VUX0ZDUyArIEVORVRfRkNTX0xFTkdUSCkgeworCQkJdWludDMyX3QgY3RybDAgPSBJWEdCX1JFQURfUkVHKGh3LCBDVFJMMCk7CisKKwkJCWlmKCEoY3RybDAgJiBJWEdCX0NUUkwwX0pGRSkpIHsKKwkJCQljdHJsMCB8PSBJWEdCX0NUUkwwX0pGRTsKKwkJCQlJWEdCX1dSSVRFX1JFRyhodywgQ1RSTDAsIGN0cmwwKTsKKwkJCX0KKwkJfQorCX0KKworCW1vZF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIsIGppZmZpZXMpOworCWl4Z2JfaXJxX2VuYWJsZShhZGFwdGVyKTsKKworI2lmZGVmIENPTkZJR19JWEdCX05BUEkKKwluZXRpZl9wb2xsX2VuYWJsZShuZXRkZXYpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2l4Z2JfZG93bihzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyLCBib29sZWFuX3Qga2lsbF93YXRjaGRvZykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCisJaXhnYl9pcnFfZGlzYWJsZShhZGFwdGVyKTsKKwlmcmVlX2lycShhZGFwdGVyLT5wZGV2LT5pcnEsIG5ldGRldik7CisjaWZkZWYgQ09ORklHX1BDSV9NU0kKKwlpZihhZGFwdGVyLT5oYXZlX21zaSA9PSBUUlVFKQorCQlwY2lfZGlzYWJsZV9tc2koYWRhcHRlci0+cGRldik7CisKKyNlbmRpZgorCWlmKGtpbGxfd2F0Y2hkb2cpCisJCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lcik7CisjaWZkZWYgQ09ORklHX0lYR0JfTkFQSQorCW5ldGlmX3BvbGxfZGlzYWJsZShuZXRkZXYpOworI2VuZGlmCisJYWRhcHRlci0+bGlua19zcGVlZCA9IDA7CisJYWRhcHRlci0+bGlua19kdXBsZXggPSAwOworCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCisJaXhnYl9yZXNldChhZGFwdGVyKTsKKwlpeGdiX2NsZWFuX3R4X3JpbmcoYWRhcHRlcik7CisJaXhnYl9jbGVhbl9yeF9yaW5nKGFkYXB0ZXIpOworfQorCit2b2lkCitpeGdiX3Jlc2V0KHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisKKwlpeGdiX2FkYXB0ZXJfc3RvcCgmYWRhcHRlci0+aHcpOworCWlmKCFpeGdiX2luaXRfaHcoJmFkYXB0ZXItPmh3KSkKKwkJSVhHQl9EQkcoIml4Z2JfaW5pdF9odyBmYWlsZWQuXG4iKTsKK30KKworLyoqCisgKiBpeGdiX3Byb2JlIC0gRGV2aWNlIEluaXRpYWxpemF0aW9uIFJvdXRpbmUKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIGluZm9ybWF0aW9uIHN0cnVjdAorICogQGVudDogZW50cnkgaW4gaXhnYl9wY2lfdGJsCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqCisgKiBpeGdiX3Byb2JlIGluaXRpYWxpemVzIGFuIGFkYXB0ZXIgaWRlbnRpZmllZCBieSBhIHBjaV9kZXYgc3RydWN0dXJlLgorICogVGhlIE9TIGluaXRpYWxpemF0aW9uLCBjb25maWd1cmluZyBvZiB0aGUgYWRhcHRlciBwcml2YXRlIHN0cnVjdHVyZSwKKyAqIGFuZCBhIGhhcmR3YXJlIHJlc2V0IG9jY3VyLgorICoqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdAoraXhnYl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyOworCXN0YXRpYyBpbnQgY2FyZHNfZm91bmQgPSAwOworCXVuc2lnbmVkIGxvbmcgbW1pb19zdGFydDsKKwlpbnQgbW1pb19sZW47CisJaW50IHBjaV91c2luZ19kYWM7CisJaW50IGk7CisJaW50IGVycjsKKworCWlmKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkpCisJCXJldHVybiBlcnI7CisKKwlpZighKGVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spKSkgeworCQlwY2lfdXNpbmdfZGFjID0gMTsKKwl9IGVsc2UgeworCQlpZigoZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykpKSB7CisJCQlJWEdCX0VSUigiTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uLCBhYm9ydGluZ1xuIik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCXBjaV91c2luZ19kYWMgPSAwOworCX0KKworCWlmKChlcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIGl4Z2JfZHJpdmVyX25hbWUpKSkKKwkJcmV0dXJuIGVycjsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBpeGdiX2FkYXB0ZXIpKTsKKwlpZighbmV0ZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2FsbG9jX2V0aGVyZGV2OworCX0KKworCVNFVF9NT0RVTEVfT1dORVIobmV0ZGV2KTsKKwlTRVRfTkVUREVWX0RFVihuZXRkZXYsICZwZGV2LT5kZXYpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIG5ldGRldik7CisJYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlhZGFwdGVyLT5uZXRkZXYgPSBuZXRkZXY7CisJYWRhcHRlci0+cGRldiA9IHBkZXY7CisJYWRhcHRlci0+aHcuYmFjayA9IGFkYXB0ZXI7CisKKwltbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIEJBUl8wKTsKKwltbWlvX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgQkFSXzApOworCisJYWRhcHRlci0+aHcuaHdfYWRkciA9IGlvcmVtYXAobW1pb19zdGFydCwgbW1pb19sZW4pOworCWlmKCFhZGFwdGVyLT5ody5od19hZGRyKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX2lvcmVtYXA7CisJfQorCisJZm9yKGkgPSBCQVJfMTsgaSA8PSBCQVJfNTsgaSsrKSB7CisJCWlmKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZihwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgaSkgJiBJT1JFU09VUkNFX0lPKSB7CisJCQlhZGFwdGVyLT5ody5pb19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGkpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwluZXRkZXYtPm9wZW4gPSAmaXhnYl9vcGVuOworCW5ldGRldi0+c3RvcCA9ICZpeGdiX2Nsb3NlOworCW5ldGRldi0+aGFyZF9zdGFydF94bWl0ID0gJml4Z2JfeG1pdF9mcmFtZTsKKwluZXRkZXYtPmdldF9zdGF0cyA9ICZpeGdiX2dldF9zdGF0czsKKwluZXRkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZpeGdiX3NldF9tdWx0aTsKKwluZXRkZXYtPnNldF9tYWNfYWRkcmVzcyA9ICZpeGdiX3NldF9tYWM7CisJbmV0ZGV2LT5jaGFuZ2VfbXR1ID0gJml4Z2JfY2hhbmdlX210dTsKKwlpeGdiX3NldF9ldGh0b29sX29wcyhuZXRkZXYpOworCW5ldGRldi0+dHhfdGltZW91dCA9ICZpeGdiX3R4X3RpbWVvdXQ7CisJbmV0ZGV2LT53YXRjaGRvZ190aW1lbyA9IEhaOworI2lmZGVmIENPTkZJR19JWEdCX05BUEkKKwluZXRkZXYtPnBvbGwgPSAmaXhnYl9jbGVhbjsKKwluZXRkZXYtPndlaWdodCA9IDY0OworI2VuZGlmCisJbmV0ZGV2LT52bGFuX3J4X3JlZ2lzdGVyID0gaXhnYl92bGFuX3J4X3JlZ2lzdGVyOworCW5ldGRldi0+dmxhbl9yeF9hZGRfdmlkID0gaXhnYl92bGFuX3J4X2FkZF92aWQ7CisJbmV0ZGV2LT52bGFuX3J4X2tpbGxfdmlkID0gaXhnYl92bGFuX3J4X2tpbGxfdmlkOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJbmV0ZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBpeGdiX25ldHBvbGw7CisjZW5kaWYKKworCW5ldGRldi0+bWVtX3N0YXJ0ID0gbW1pb19zdGFydDsKKwluZXRkZXYtPm1lbV9lbmQgPSBtbWlvX3N0YXJ0ICsgbW1pb19sZW47CisJbmV0ZGV2LT5iYXNlX2FkZHIgPSBhZGFwdGVyLT5ody5pb19iYXNlOworCisJYWRhcHRlci0+YmRfbnVtYmVyID0gY2FyZHNfZm91bmQ7CisJYWRhcHRlci0+bGlua19zcGVlZCA9IDA7CisJYWRhcHRlci0+bGlua19kdXBsZXggPSAwOworCisJLyogc2V0dXAgdGhlIHByaXZhdGUgc3RydWN0dXJlICovCisKKwlpZigoZXJyID0gaXhnYl9zd19pbml0KGFkYXB0ZXIpKSkKKwkJZ290byBlcnJfc3dfaW5pdDsKKworCW5ldGRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwKKwkJCSAgIE5FVElGX0ZfSFdfQ1NVTSB8CisJCQkgICBORVRJRl9GX0hXX1ZMQU5fVFggfAorCQkJICAgTkVUSUZfRl9IV19WTEFOX1JYIHwKKwkJCSAgIE5FVElGX0ZfSFdfVkxBTl9GSUxURVI7CisjaWZkZWYgTkVUSUZfRl9UU08KKwluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOworI2VuZGlmCisKKwlpZihwY2lfdXNpbmdfZGFjKQorCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKKworCS8qIG1ha2Ugc3VyZSB0aGUgRUVQUk9NIGlzIGdvb2QgKi8KKworCWlmKCFpeGdiX3ZhbGlkYXRlX2VlcHJvbV9jaGVja3N1bSgmYWRhcHRlci0+aHcpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVGhlIEVFUFJPTSBDaGVja3N1bSBJcyBOb3QgVmFsaWRcbiIpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9lZXByb207CisJfQorCisJaXhnYl9nZXRfZWVfbWFjX2FkZHIoJmFkYXB0ZXItPmh3LCBuZXRkZXYtPmRldl9hZGRyKTsKKworCWlmKCFpc192YWxpZF9ldGhlcl9hZGRyKG5ldGRldi0+ZGV2X2FkZHIpKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX2VlcHJvbTsKKwl9CisKKwlhZGFwdGVyLT5wYXJ0X251bSA9IGl4Z2JfZ2V0X2VlX3BiYV9udW1iZXIoJmFkYXB0ZXItPmh3KTsKKworCWluaXRfdGltZXIoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyKTsKKwlhZGFwdGVyLT53YXRjaGRvZ190aW1lci5mdW5jdGlvbiA9ICZpeGdiX3dhdGNoZG9nOworCWFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylhZGFwdGVyOworCisJSU5JVF9XT1JLKCZhZGFwdGVyLT50eF90aW1lb3V0X3Rhc2ssCisJCSAgKHZvaWQgKCopKHZvaWQgKikpaXhnYl90eF90aW1lb3V0X3Rhc2ssIG5ldGRldik7CisKKwlpZigoZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldikpKQorCQlnb3RvIGVycl9yZWdpc3RlcjsKKworCS8qIHdlJ3JlIGdvaW5nIHRvIHJlc2V0LCBzbyBhc3N1bWUgd2UgaGF2ZSBubyBsaW5rIGZvciBub3cgKi8KKworCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludGVsKFIpIFBSTy8xMEdiRSBOZXR3b3JrIENvbm5lY3Rpb25cbiIsCisJCSAgIG5ldGRldi0+bmFtZSk7CisJaXhnYl9jaGVja19vcHRpb25zKGFkYXB0ZXIpOworCS8qIHJlc2V0IHRoZSBoYXJkd2FyZSB3aXRoIHRoZSBuZXcgc2V0dGluZ3MgKi8KKworCWl4Z2JfcmVzZXQoYWRhcHRlcik7CisKKwljYXJkc19mb3VuZCsrOworCXJldHVybiAwOworCitlcnJfcmVnaXN0ZXI6CitlcnJfc3dfaW5pdDoKK2Vycl9lZXByb206CisJaW91bm1hcChhZGFwdGVyLT5ody5od19hZGRyKTsKK2Vycl9pb3JlbWFwOgorCWZyZWVfbmV0ZGV2KG5ldGRldik7CitlcnJfYWxsb2NfZXRoZXJkZXY6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGl4Z2JfcmVtb3ZlIC0gRGV2aWNlIFJlbW92YWwgUm91dGluZQorICogQHBkZXY6IFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gc3RydWN0CisgKgorICogaXhnYl9yZW1vdmUgaXMgY2FsbGVkIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtIHRvIGFsZXJ0IHRoZSBkcml2ZXIKKyAqIHRoYXQgaXQgc2hvdWxkIHJlbGVhc2UgYSBQQ0kgZGV2aWNlLiAgVGhlIGNvdWxkIGJlIGNhdXNlZCBieSBhCisgKiBIb3QtUGx1ZyBldmVudCwgb3IgYmVjYXVzZSB0aGUgZHJpdmVyIGlzIGdvaW5nIHRvIGJlIHJlbW92ZWQgZnJvbQorICogbWVtb3J5LgorICoqLworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQKK2l4Z2JfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisKKwlpb3VubWFwKGFkYXB0ZXItPmh3Lmh3X2FkZHIpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKKwlmcmVlX25ldGRldihuZXRkZXYpOworfQorCisvKioKKyAqIGl4Z2Jfc3dfaW5pdCAtIEluaXRpYWxpemUgZ2VuZXJhbCBzb2Z0d2FyZSBzdHJ1Y3R1cmVzIChzdHJ1Y3QgaXhnYl9hZGFwdGVyKQorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlIHRvIGluaXRpYWxpemUKKyAqCisgKiBpeGdiX3N3X2luaXQgaW5pdGlhbGl6ZXMgdGhlIEFkYXB0ZXIgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZS4KKyAqIEZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQgYmFzZWQgb24gUENJIGRldmljZSBpbmZvcm1hdGlvbiBhbmQKKyAqIE9TIG5ldHdvcmsgZGV2aWNlIHNldHRpbmdzIChNVFUgc2l6ZSkuCisgKiovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitpeGdiX3N3X2luaXQoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgaXhnYl9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisKKwkvKiBQQ0kgY29uZmlnIHNwYWNlIGluZm8gKi8KKworCWh3LT52ZW5kb3JfaWQgPSBwZGV2LT52ZW5kb3I7CisJaHctPmRldmljZV9pZCA9IHBkZXYtPmRldmljZTsKKwlody0+c3Vic3lzdGVtX3ZlbmRvcl9pZCA9IHBkZXYtPnN1YnN5c3RlbV92ZW5kb3I7CisJaHctPnN1YnN5c3RlbV9pZCA9IHBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisKKwlhZGFwdGVyLT5yeF9idWZmZXJfbGVuID0gSVhHQl9SWEJVRkZFUl8yMDQ4OworCisJaHctPm1heF9mcmFtZV9zaXplID0gbmV0ZGV2LT5tdHUgKyBFTkVUX0hFQURFUl9TSVpFICsgRU5FVF9GQ1NfTEVOR1RIOworCisJaWYoKGh3LT5kZXZpY2VfaWQgPT0gSVhHQl9ERVZJQ0VfSURfODI1OTdFWCkKKwkgICB8fChody0+ZGV2aWNlX2lkID09IElYR0JfREVWSUNFX0lEXzgyNTk3RVhfTFIpCisJICAgfHwoaHctPmRldmljZV9pZCA9PSBJWEdCX0RFVklDRV9JRF84MjU5N0VYX1NSKSkKKwkJCWh3LT5tYWNfdHlwZSA9IGl4Z2JfODI1OTc7CisJZWxzZSB7CisJCS8qIHNob3VsZCBuZXZlciBoYXZlIGxvYWRlZCBvbiB0aGlzIGRldmljZSAqLworCQlwcmludGsoS0VSTl9FUlIgIml4Z2I6IHVuc3VwcG9ydGVkIGRldmljZSBpZFxuIik7CisJfQorCisJLyogZW5hYmxlIGZsb3cgY29udHJvbCB0byBiZSBwcm9ncmFtbWVkICovCisJaHctPmZjLnNlbmRfeG9uID0gMTsKKworCWF0b21pY19zZXQoJmFkYXB0ZXItPmlycV9zZW0sIDEpOworCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT50eF9sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGl4Z2Jfb3BlbiAtIENhbGxlZCB3aGVuIGEgbmV0d29yayBpbnRlcmZhY2UgaXMgbWFkZSBhY3RpdmUKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZQorICoKKyAqIFRoZSBvcGVuIGVudHJ5IHBvaW50IGlzIGNhbGxlZCB3aGVuIGEgbmV0d29yayBpbnRlcmZhY2UgaXMgbWFkZQorICogYWN0aXZlIGJ5IHRoZSBzeXN0ZW0gKElGRl9VUCkuICBBdCB0aGlzIHBvaW50IGFsbCByZXNvdXJjZXMgbmVlZGVkCisgKiBmb3IgdHJhbnNtaXQgYW5kIHJlY2VpdmUgb3BlcmF0aW9ucyBhcmUgYWxsb2NhdGVkLCB0aGUgaW50ZXJydXB0CisgKiBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgT1MsIHRoZSB3YXRjaGRvZyB0aW1lciBpcyBzdGFydGVkLAorICogYW5kIHRoZSBzdGFjayBpcyBub3RpZmllZCB0aGF0IHRoZSBpbnRlcmZhY2UgaXMgcmVhZHkuCisgKiovCisKK3N0YXRpYyBpbnQKK2l4Z2Jfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJaW50IGVycjsKKworCS8qIGFsbG9jYXRlIHRyYW5zbWl0IGRlc2NyaXB0b3JzICovCisKKwlpZigoZXJyID0gaXhnYl9zZXR1cF90eF9yZXNvdXJjZXMoYWRhcHRlcikpKQorCQlnb3RvIGVycl9zZXR1cF90eDsKKworCS8qIGFsbG9jYXRlIHJlY2VpdmUgZGVzY3JpcHRvcnMgKi8KKworCWlmKChlcnIgPSBpeGdiX3NldHVwX3J4X3Jlc291cmNlcyhhZGFwdGVyKSkpCisJCWdvdG8gZXJyX3NldHVwX3J4OworCisJaWYoKGVyciA9IGl4Z2JfdXAoYWRhcHRlcikpKQorCQlnb3RvIGVycl91cDsKKworCXJldHVybiAwOworCitlcnJfdXA6CisJaXhnYl9mcmVlX3J4X3Jlc291cmNlcyhhZGFwdGVyKTsKK2Vycl9zZXR1cF9yeDoKKwlpeGdiX2ZyZWVfdHhfcmVzb3VyY2VzKGFkYXB0ZXIpOworZXJyX3NldHVwX3R4OgorCWl4Z2JfcmVzZXQoYWRhcHRlcik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGl4Z2JfY2xvc2UgLSBEaXNhYmxlcyBhIG5ldHdvcmsgaW50ZXJmYWNlCisgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogUmV0dXJucyAwLCB0aGlzIGlzIG5vdCBhbGxvd2VkIHRvIGZhaWwKKyAqCisgKiBUaGUgY2xvc2UgZW50cnkgcG9pbnQgaXMgY2FsbGVkIHdoZW4gYW4gaW50ZXJmYWNlIGlzIGRlLWFjdGl2YXRlZAorICogYnkgdGhlIE9TLiAgVGhlIGhhcmR3YXJlIGlzIHN0aWxsIHVuZGVyIHRoZSBkcml2ZXJzIGNvbnRyb2wsIGJ1dAorICogbmVlZHMgdG8gYmUgZGlzYWJsZWQuICBBIGdsb2JhbCBNQUMgcmVzZXQgaXMgaXNzdWVkIHRvIHN0b3AgdGhlCisgKiBoYXJkd2FyZSwgYW5kIGFsbCB0cmFuc21pdCBhbmQgcmVjZWl2ZSByZXNvdXJjZXMgYXJlIGZyZWVkLgorICoqLworCitzdGF0aWMgaW50CitpeGdiX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKworCWl4Z2JfZG93bihhZGFwdGVyLCBUUlVFKTsKKworCWl4Z2JfZnJlZV90eF9yZXNvdXJjZXMoYWRhcHRlcik7CisJaXhnYl9mcmVlX3J4X3Jlc291cmNlcyhhZGFwdGVyKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGl4Z2Jfc2V0dXBfdHhfcmVzb3VyY2VzIC0gYWxsb2NhdGUgVHggcmVzb3VyY2VzIChEZXNjcmlwdG9ycykKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqKi8KKworaW50CitpeGdiX3NldHVwX3R4X3Jlc291cmNlcyhzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBpeGdiX2Rlc2NfcmluZyAqdHhkciA9ICZhZGFwdGVyLT50eF9yaW5nOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKwlpbnQgc2l6ZTsKKworCXNpemUgPSBzaXplb2Yoc3RydWN0IGl4Z2JfYnVmZmVyKSAqIHR4ZHItPmNvdW50OworCXR4ZHItPmJ1ZmZlcl9pbmZvID0gdm1hbGxvYyhzaXplKTsKKwlpZighdHhkci0+YnVmZmVyX2luZm8pIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCh0eGRyLT5idWZmZXJfaW5mbywgMCwgc2l6ZSk7CisKKwkvKiByb3VuZCB1cCB0byBuZWFyZXN0IDRLICovCisKKwl0eGRyLT5zaXplID0gdHhkci0+Y291bnQgKiBzaXplb2Yoc3RydWN0IGl4Z2JfdHhfZGVzYyk7CisJSVhHQl9ST1VORFVQKHR4ZHItPnNpemUsIDQwOTYpOworCisJdHhkci0+ZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHR4ZHItPnNpemUsICZ0eGRyLT5kbWEpOworCWlmKCF0eGRyLT5kZXNjKSB7CisJCXZmcmVlKHR4ZHItPmJ1ZmZlcl9pbmZvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCh0eGRyLT5kZXNjLCAwLCB0eGRyLT5zaXplKTsKKworCXR4ZHItPm5leHRfdG9fdXNlID0gMDsKKwl0eGRyLT5uZXh0X3RvX2NsZWFuID0gMDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGl4Z2JfY29uZmlndXJlX3R4IC0gQ29uZmlndXJlIDgyNTk3IFRyYW5zbWl0IFVuaXQgYWZ0ZXIgUmVzZXQuCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBDb25maWd1cmUgdGhlIFR4IHVuaXQgb2YgdGhlIE1BQyBhZnRlciBhIHJlc2V0LgorICoqLworCitzdGF0aWMgdm9pZAoraXhnYl9jb25maWd1cmVfdHgoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1aW50NjRfdCB0ZGJhID0gYWRhcHRlci0+dHhfcmluZy5kbWE7CisJdWludDMyX3QgdGRsZW4gPSBhZGFwdGVyLT50eF9yaW5nLmNvdW50ICogc2l6ZW9mKHN0cnVjdCBpeGdiX3R4X2Rlc2MpOworCXVpbnQzMl90IHRjdGw7CisJc3RydWN0IGl4Z2JfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCisJLyogU2V0dXAgdGhlIEJhc2UgYW5kIExlbmd0aCBvZiB0aGUgVHggRGVzY3JpcHRvciBSaW5nIAorCSAqIHR4X3JpbmcuZG1hIGNhbiBiZSBlaXRoZXIgYSAzMiBvciA2NCBiaXQgdmFsdWUgCisJICovCisKKwlJWEdCX1dSSVRFX1JFRyhodywgVERCQUwsICh0ZGJhICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKSk7CisJSVhHQl9XUklURV9SRUcoaHcsIFREQkFILCAodGRiYSA+PiAzMikpOworCisJSVhHQl9XUklURV9SRUcoaHcsIFRETEVOLCB0ZGxlbik7CisKKwkvKiBTZXR1cCB0aGUgSFcgVHggSGVhZCBhbmQgVGFpbCBkZXNjcmlwdG9yIHBvaW50ZXJzICovCisKKwlJWEdCX1dSSVRFX1JFRyhodywgVERILCAwKTsKKwlJWEdCX1dSSVRFX1JFRyhodywgVERULCAwKTsKKworCS8qIGRvbid0IHNldCB1cCB0eGRjdGwsIGl0IGluZHVjZXMgcGVyZm9ybWFuY2UgcHJvYmxlbXMgaWYgY29uZmlndXJlZAorCSAqIGluY29ycmVjdGx5ICovCisJLyogU2V0IHRoZSBUeCBJbnRlcnJ1cHQgRGVsYXkgcmVnaXN0ZXIgKi8KKworCUlYR0JfV1JJVEVfUkVHKGh3LCBUSURWLCBhZGFwdGVyLT50eF9pbnRfZGVsYXkpOworCisJLyogUHJvZ3JhbSB0aGUgVHJhbnNtaXQgQ29udHJvbCBSZWdpc3RlciAqLworCisJdGN0bCA9IElYR0JfVENUTF9UQ0UgfCBJWEdCX1RDVExfVFhFTiB8IElYR0JfVENUTF9UUERFOworCUlYR0JfV1JJVEVfUkVHKGh3LCBUQ1RMLCB0Y3RsKTsKKworCS8qIFNldHVwIFRyYW5zbWl0IERlc2NyaXB0b3IgU2V0dGluZ3MgZm9yIHRoaXMgYWRhcHRlciAqLworCWFkYXB0ZXItPnR4X2NtZF90eXBlID0KKwkJSVhHQl9UWF9ERVNDX1RZUEUgCisJCXwgKGFkYXB0ZXItPnR4X2ludF9kZWxheV9lbmFibGUgPyBJWEdCX1RYX0RFU0NfQ01EX0lERSA6IDApOworfQorCisvKioKKyAqIGl4Z2Jfc2V0dXBfcnhfcmVzb3VyY2VzIC0gYWxsb2NhdGUgUnggcmVzb3VyY2VzIChEZXNjcmlwdG9ycykKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKiovCisKK2ludAoraXhnYl9zZXR1cF9yeF9yZXNvdXJjZXMoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgaXhnYl9kZXNjX3JpbmcgKnJ4ZHIgPSAmYWRhcHRlci0+cnhfcmluZzsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJaW50IHNpemU7CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBpeGdiX2J1ZmZlcikgKiByeGRyLT5jb3VudDsKKwlyeGRyLT5idWZmZXJfaW5mbyA9IHZtYWxsb2Moc2l6ZSk7CisJaWYoIXJ4ZHItPmJ1ZmZlcl9pbmZvKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQocnhkci0+YnVmZmVyX2luZm8sIDAsIHNpemUpOworCisJLyogUm91bmQgdXAgdG8gbmVhcmVzdCA0SyAqLworCisJcnhkci0+c2l6ZSA9IHJ4ZHItPmNvdW50ICogc2l6ZW9mKHN0cnVjdCBpeGdiX3J4X2Rlc2MpOworCUlYR0JfUk9VTkRVUChyeGRyLT5zaXplLCA0MDk2KTsKKworCXJ4ZHItPmRlc2MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCByeGRyLT5zaXplLCAmcnhkci0+ZG1hKTsKKworCWlmKCFyeGRyLT5kZXNjKSB7CisJCXZmcmVlKHJ4ZHItPmJ1ZmZlcl9pbmZvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChyeGRyLT5kZXNjLCAwLCByeGRyLT5zaXplKTsKKworCXJ4ZHItPm5leHRfdG9fY2xlYW4gPSAwOworCXJ4ZHItPm5leHRfdG9fdXNlID0gMDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGl4Z2Jfc2V0dXBfcmN0bCAtIGNvbmZpZ3VyZSB0aGUgcmVjZWl2ZSBjb250cm9sIHJlZ2lzdGVyCisgKiBAYWRhcHRlcjogQm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqKi8KKworc3RhdGljIHZvaWQKK2l4Z2Jfc2V0dXBfcmN0bChzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKQoreworCXVpbnQzMl90IHJjdGw7CisKKwlyY3RsID0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJDVEwpOworCisJcmN0bCAmPSB+KDMgPDwgSVhHQl9SQ1RMX01PX1NISUZUKTsKKworCXJjdGwgfD0KKwkJSVhHQl9SQ1RMX0JBTSB8IElYR0JfUkNUTF9SRE1UU18xXzIgfCAKKwkJSVhHQl9SQ1RMX1JYRU4gfCBJWEdCX1JDVExfQ0ZGIHwgCisJCShhZGFwdGVyLT5ody5tY19maWx0ZXJfdHlwZSA8PCBJWEdCX1JDVExfTU9fU0hJRlQpOworCisJcmN0bCB8PSBJWEdCX1JDVExfU0VDUkM7CisKKwlzd2l0Y2ggKGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4pIHsKKwljYXNlIElYR0JfUlhCVUZGRVJfMjA0ODoKKwlkZWZhdWx0OgorCQlyY3RsIHw9IElYR0JfUkNUTF9CU0laRV8yMDQ4OworCQlicmVhazsKKwljYXNlIElYR0JfUlhCVUZGRVJfNDA5NjoKKwkJcmN0bCB8PSBJWEdCX1JDVExfQlNJWkVfNDA5NjsKKwkJYnJlYWs7CisJY2FzZSBJWEdCX1JYQlVGRkVSXzgxOTI6CisJCXJjdGwgfD0gSVhHQl9SQ1RMX0JTSVpFXzgxOTI7CisJCWJyZWFrOworCWNhc2UgSVhHQl9SWEJVRkZFUl8xNjM4NDoKKwkJcmN0bCB8PSBJWEdCX1JDVExfQlNJWkVfMTYzODQ7CisJCWJyZWFrOworCX0KKworCUlYR0JfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgUkNUTCwgcmN0bCk7Cit9CisKKy8qKgorICogaXhnYl9jb25maWd1cmVfcnggLSBDb25maWd1cmUgODI1OTcgUmVjZWl2ZSBVbml0IGFmdGVyIFJlc2V0LgorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogQ29uZmlndXJlIHRoZSBSeCB1bml0IG9mIHRoZSBNQUMgYWZ0ZXIgYSByZXNldC4KKyAqKi8KKworc3RhdGljIHZvaWQKK2l4Z2JfY29uZmlndXJlX3J4KHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdWludDY0X3QgcmRiYSA9IGFkYXB0ZXItPnJ4X3JpbmcuZG1hOworCXVpbnQzMl90IHJkbGVuID0gYWRhcHRlci0+cnhfcmluZy5jb3VudCAqIHNpemVvZihzdHJ1Y3QgaXhnYl9yeF9kZXNjKTsKKwlzdHJ1Y3QgaXhnYl9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdWludDMyX3QgcmN0bDsKKwl1aW50MzJfdCByeGNzdW07CisJdWludDMyX3QgcnhkY3RsOworCisJLyogbWFrZSBzdXJlIHJlY2VpdmVzIGFyZSBkaXNhYmxlZCB3aGlsZSBzZXR0aW5nIHVwIHRoZSBkZXNjcmlwdG9ycyAqLworCisJcmN0bCA9IElYR0JfUkVBRF9SRUcoaHcsIFJDVEwpOworCUlYR0JfV1JJVEVfUkVHKGh3LCBSQ1RMLCByY3RsICYgfklYR0JfUkNUTF9SWEVOKTsKKworCS8qIHNldCB0aGUgUmVjZWl2ZSBEZWxheSBUaW1lciBSZWdpc3RlciAqLworCisJSVhHQl9XUklURV9SRUcoaHcsIFJEVFIsIGFkYXB0ZXItPnJ4X2ludF9kZWxheSk7CisKKwkvKiBTZXR1cCB0aGUgQmFzZSBhbmQgTGVuZ3RoIG9mIHRoZSBSeCBEZXNjcmlwdG9yIFJpbmcgKi8KKworCUlYR0JfV1JJVEVfUkVHKGh3LCBSREJBTCwgKHJkYmEgJiAweDAwMDAwMDAwZmZmZmZmZmZVTEwpKTsKKwlJWEdCX1dSSVRFX1JFRyhodywgUkRCQUgsIChyZGJhID4+IDMyKSk7CisKKwlJWEdCX1dSSVRFX1JFRyhodywgUkRMRU4sIHJkbGVuKTsKKworCS8qIFNldHVwIHRoZSBIVyBSeCBIZWFkIGFuZCBUYWlsIERlc2NyaXB0b3IgUG9pbnRlcnMgKi8KKwlJWEdCX1dSSVRFX1JFRyhodywgUkRILCAwKTsKKwlJWEdCX1dSSVRFX1JFRyhodywgUkRULCAwKTsKKworCS8qIHNldCB1cCBwcmUtZmV0Y2hpbmcgb2YgcmVjZWl2ZSBidWZmZXJzIHNvIHdlIGdldCBzb21lIGJlZm9yZSB3ZQorCSAqIHJ1biBvdXQgKGRlZmF1bHQgaGFyZHdhcmUgYmVoYXZpb3IgaXMgdG8gcnVuIG91dCBiZWZvcmUgZmV0Y2hpbmcKKwkgKiBtb3JlKS4gIFRoaXMgc2V0cyB1cCB0byBmZXRjaCBpZiBIVEhSRVNIIHJ4IGRlc2NyaXB0b3JzIGFyZSBhdmFpbAorCSAqIGFuZCB0aGUgZGVzY3JpcHRvcnMgaW4gaHcgY2FjaGUgYXJlIGJlbG93IFBUSFJFU0guICBUaGlzIGF2b2lkcworCSAqIHRoZSBoYXJkd2FyZSBiZWhhdmlvciBvZiBmZXRjaGluZyA8PTUxMiBkZXNjcmlwdG9ycyBpbiBhIHNpbmdsZQorCSAqIGJ1cnN0IHRoYXQgcHJlLWVtcHRzIGFsbCBvdGhlciBhY3Rpdml0eSwgdXN1YWxseSBjYXVzaW5nIGZpZm8KKwkgKiBvdmVyZmxvd3MuICovCisJLyogdXNlIFdUSFJFU0ggdG8gYnVyc3Qgd3JpdGUgMTYgZGVzY3JpcHRvcnMgb3IgYnVyc3Qgd2hlbiBSWFQwICovCisJcnhkY3RsID0gUlhEQ1RMX1dUSFJFU0hfREVGQVVMVCA8PCBJWEdCX1JYRENUTF9XVEhSRVNIX1NISUZUIHwKKwkgICAgICAgICBSWERDVExfSFRIUkVTSF9ERUZBVUxUIDw8IElYR0JfUlhEQ1RMX0hUSFJFU0hfU0hJRlQgfAorCSAgICAgICAgIFJYRENUTF9QVEhSRVNIX0RFRkFVTFQgPDwgSVhHQl9SWERDVExfUFRIUkVTSF9TSElGVDsKKwlJWEdCX1dSSVRFX1JFRyhodywgUlhEQ1RMLCByeGRjdGwpOworCisJLyogRW5hYmxlIFJlY2VpdmUgQ2hlY2tzdW0gT2ZmbG9hZCBmb3IgVENQIGFuZCBVRFAgKi8KKwlpZihhZGFwdGVyLT5yeF9jc3VtID09IFRSVUUpIHsKKwkJcnhjc3VtID0gSVhHQl9SRUFEX1JFRyhodywgUlhDU1VNKTsKKwkJcnhjc3VtIHw9IElYR0JfUlhDU1VNX1RVT0ZMOworCQlJWEdCX1dSSVRFX1JFRyhodywgUlhDU1VNLCByeGNzdW0pOworCX0KKworCS8qIEVuYWJsZSBSZWNlaXZlcyAqLworCisJSVhHQl9XUklURV9SRUcoaHcsIFJDVEwsIHJjdGwpOworfQorCisvKioKKyAqIGl4Z2JfZnJlZV90eF9yZXNvdXJjZXMgLSBGcmVlIFR4IFJlc291cmNlcworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogRnJlZSBhbGwgdHJhbnNtaXQgc29mdHdhcmUgcmVzb3VyY2VzCisgKiovCisKK3ZvaWQKK2l4Z2JfZnJlZV90eF9yZXNvdXJjZXMoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisKKwlpeGdiX2NsZWFuX3R4X3JpbmcoYWRhcHRlcik7CisKKwl2ZnJlZShhZGFwdGVyLT50eF9yaW5nLmJ1ZmZlcl9pbmZvKTsKKwlhZGFwdGVyLT50eF9yaW5nLmJ1ZmZlcl9pbmZvID0gTlVMTDsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgYWRhcHRlci0+dHhfcmluZy5zaXplLAorCQkJICAgIGFkYXB0ZXItPnR4X3JpbmcuZGVzYywgYWRhcHRlci0+dHhfcmluZy5kbWEpOworCisJYWRhcHRlci0+dHhfcmluZy5kZXNjID0gTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpeGdiX3VubWFwX2FuZF9mcmVlX3R4X3Jlc291cmNlKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCXN0cnVjdCBpeGdiX2J1ZmZlciAqYnVmZmVyX2luZm8pCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCWlmKGJ1ZmZlcl9pbmZvLT5kbWEpIHsKKwkJcGNpX3VubWFwX3BhZ2UocGRldiwKKwkJCSAgIGJ1ZmZlcl9pbmZvLT5kbWEsCisJCQkgICBidWZmZXJfaW5mby0+bGVuZ3RoLAorCQkJICAgUENJX0RNQV9UT0RFVklDRSk7CisJCWJ1ZmZlcl9pbmZvLT5kbWEgPSAwOworCX0KKwlpZihidWZmZXJfaW5mby0+c2tiKSB7CisJCWRldl9rZnJlZV9za2JfYW55KGJ1ZmZlcl9pbmZvLT5za2IpOworCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKKwl9Cit9CisKKy8qKgorICogaXhnYl9jbGVhbl90eF9yaW5nIC0gRnJlZSBUeCBCdWZmZXJzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqKi8KKworc3RhdGljIHZvaWQKK2l4Z2JfY2xlYW5fdHhfcmluZyhzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBpeGdiX2Rlc2NfcmluZyAqdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nOworCXN0cnVjdCBpeGdiX2J1ZmZlciAqYnVmZmVyX2luZm87CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGludCBpOworCisJLyogRnJlZSBhbGwgdGhlIFR4IHJpbmcgc2tfYnVmZnMgKi8KKworCWZvcihpID0gMDsgaSA8IHR4X3JpbmctPmNvdW50OyBpKyspIHsKKwkJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+YnVmZmVyX2luZm9baV07CisJCWl4Z2JfdW5tYXBfYW5kX2ZyZWVfdHhfcmVzb3VyY2UoYWRhcHRlciwgYnVmZmVyX2luZm8pOworCX0KKworCXNpemUgPSBzaXplb2Yoc3RydWN0IGl4Z2JfYnVmZmVyKSAqIHR4X3JpbmctPmNvdW50OworCW1lbXNldCh0eF9yaW5nLT5idWZmZXJfaW5mbywgMCwgc2l6ZSk7CisKKwkvKiBaZXJvIG91dCB0aGUgZGVzY3JpcHRvciByaW5nICovCisKKwltZW1zZXQodHhfcmluZy0+ZGVzYywgMCwgdHhfcmluZy0+c2l6ZSk7CisKKwl0eF9yaW5nLT5uZXh0X3RvX3VzZSA9IDA7CisJdHhfcmluZy0+bmV4dF90b19jbGVhbiA9IDA7CisKKwlJWEdCX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFRESCwgMCk7CisJSVhHQl9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBURFQsIDApOworfQorCisvKioKKyAqIGl4Z2JfZnJlZV9yeF9yZXNvdXJjZXMgLSBGcmVlIFJ4IFJlc291cmNlcworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogRnJlZSBhbGwgcmVjZWl2ZSBzb2Z0d2FyZSByZXNvdXJjZXMKKyAqKi8KKwordm9pZAoraXhnYl9mcmVlX3J4X3Jlc291cmNlcyhzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBpeGdiX2Rlc2NfcmluZyAqcnhfcmluZyA9ICZhZGFwdGVyLT5yeF9yaW5nOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKworCWl4Z2JfY2xlYW5fcnhfcmluZyhhZGFwdGVyKTsKKworCXZmcmVlKHJ4X3JpbmctPmJ1ZmZlcl9pbmZvKTsKKwlyeF9yaW5nLT5idWZmZXJfaW5mbyA9IE5VTEw7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHJ4X3JpbmctPnNpemUsIHJ4X3JpbmctPmRlc2MsIHJ4X3JpbmctPmRtYSk7CisKKwlyeF9yaW5nLT5kZXNjID0gTlVMTDsKK30KKworLyoqCisgKiBpeGdiX2NsZWFuX3J4X3JpbmcgLSBGcmVlIFJ4IEJ1ZmZlcnMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoqLworCitzdGF0aWMgdm9pZAoraXhnYl9jbGVhbl9yeF9yaW5nKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGl4Z2JfZGVzY19yaW5nICpyeF9yaW5nID0gJmFkYXB0ZXItPnJ4X3Jpbmc7CisJc3RydWN0IGl4Z2JfYnVmZmVyICpidWZmZXJfaW5mbzsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGludCBpOworCisJLyogRnJlZSBhbGwgdGhlIFJ4IHJpbmcgc2tfYnVmZnMgKi8KKworCWZvcihpID0gMDsgaSA8IHJ4X3JpbmctPmNvdW50OyBpKyspIHsKKwkJYnVmZmVyX2luZm8gPSAmcnhfcmluZy0+YnVmZmVyX2luZm9baV07CisJCWlmKGJ1ZmZlcl9pbmZvLT5za2IpIHsKKworCQkJcGNpX3VubWFwX3NpbmdsZShwZGV2LAorCQkJCQkgYnVmZmVyX2luZm8tPmRtYSwKKwkJCQkJIGJ1ZmZlcl9pbmZvLT5sZW5ndGgsCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQlkZXZfa2ZyZWVfc2tiKGJ1ZmZlcl9pbmZvLT5za2IpOworCisJCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKKwkJfQorCX0KKworCXNpemUgPSBzaXplb2Yoc3RydWN0IGl4Z2JfYnVmZmVyKSAqIHJ4X3JpbmctPmNvdW50OworCW1lbXNldChyeF9yaW5nLT5idWZmZXJfaW5mbywgMCwgc2l6ZSk7CisKKwkvKiBaZXJvIG91dCB0aGUgZGVzY3JpcHRvciByaW5nICovCisKKwltZW1zZXQocnhfcmluZy0+ZGVzYywgMCwgcnhfcmluZy0+c2l6ZSk7CisKKwlyeF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gMDsKKwlyeF9yaW5nLT5uZXh0X3RvX3VzZSA9IDA7CisKKwlJWEdCX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJESCwgMCk7CisJSVhHQl9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSRFQsIDApOworfQorCisvKioKKyAqIGl4Z2Jfc2V0X21hYyAtIENoYW5nZSB0aGUgRXRoZXJuZXQgQWRkcmVzcyBvZiB0aGUgTklDCisgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcDogcG9pbnRlciB0byBhbiBhZGRyZXNzIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKiovCisKK3N0YXRpYyBpbnQKK2l4Z2Jfc2V0X21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpwKQoreworCXN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKKworCWlmKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKQorCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisKKwltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgbmV0ZGV2LT5hZGRyX2xlbik7CisKKwlpeGdiX3Jhcl9zZXQoJmFkYXB0ZXItPmh3LCBhZGRyLT5zYV9kYXRhLCAwKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGl4Z2Jfc2V0X211bHRpIC0gTXVsdGljYXN0IGFuZCBQcm9taXNjdW91cyBtb2RlIHNldAorICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFRoZSBzZXRfbXVsdGkgZW50cnkgcG9pbnQgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBtdWx0aWNhc3QgYWRkcmVzcworICogbGlzdCBvciB0aGUgbmV0d29yayBpbnRlcmZhY2UgZmxhZ3MgYXJlIHVwZGF0ZWQuICBUaGlzIHJvdXRpbmUgaXMKKyAqIHJlc3BvbnNpYmxlIGZvciBjb25maWd1cmluZyB0aGUgaGFyZHdhcmUgZm9yIHByb3BlciBtdWx0aWNhc3QsCisgKiBwcm9taXNjdW91cyBtb2RlLCBhbmQgYWxsLW11bHRpIGJlaGF2aW9yLgorICoqLworCitzdGF0aWMgdm9pZAoraXhnYl9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBpeGdiX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jX3B0cjsKKwl1aW50MzJfdCByY3RsOworCWludCBpOworCisJLyogQ2hlY2sgZm9yIFByb21pc2N1b3VzIGFuZCBBbGwgTXVsdGljYXN0IG1vZGVzICovCisKKwlyY3RsID0gSVhHQl9SRUFEX1JFRyhodywgUkNUTCk7CisKKwlpZihuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJcmN0bCB8PSAoSVhHQl9SQ1RMX1VQRSB8IElYR0JfUkNUTF9NUEUpOworCX0gZWxzZSBpZihuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCXJjdGwgfD0gSVhHQl9SQ1RMX01QRTsKKwkJcmN0bCAmPSB+SVhHQl9SQ1RMX1VQRTsKKwl9IGVsc2UgeworCQlyY3RsICY9IH4oSVhHQl9SQ1RMX1VQRSB8IElYR0JfUkNUTF9NUEUpOworCX0KKworCWlmKG5ldGRldi0+bWNfY291bnQgPiBJWEdCX01BWF9OVU1fTVVMVElDQVNUX0FERFJFU1NFUykgeworCQlyY3RsIHw9IElYR0JfUkNUTF9NUEU7CisJCUlYR0JfV1JJVEVfUkVHKGh3LCBSQ1RMLCByY3RsKTsKKwl9IGVsc2UgeworCQl1aW50OF90IG10YVtuZXRkZXYtPm1jX2NvdW50ICogSVhHQl9FVEhfTEVOR1RIX09GX0FERFJFU1NdOworCisJCUlYR0JfV1JJVEVfUkVHKGh3LCBSQ1RMLCByY3RsKTsKKworCQlmb3IoaSA9IDAsIG1jX3B0ciA9IG5ldGRldi0+bWNfbGlzdDsgbWNfcHRyOworCQkJaSsrLCBtY19wdHIgPSBtY19wdHItPm5leHQpCisJCQltZW1jcHkoJm10YVtpICogSVhHQl9FVEhfTEVOR1RIX09GX0FERFJFU1NdLAorCQkJCSAgIG1jX3B0ci0+ZG1pX2FkZHIsIElYR0JfRVRIX0xFTkdUSF9PRl9BRERSRVNTKTsKKworCQlpeGdiX21jX2FkZHJfbGlzdF91cGRhdGUoaHcsIG10YSwgbmV0ZGV2LT5tY19jb3VudCwgMCk7CisJfQorfQorCisvKioKKyAqIGl4Z2Jfd2F0Y2hkb2cgLSBUaW1lciBDYWxsLWJhY2sKKyAqIEBkYXRhOiBwb2ludGVyIHRvIG5ldGRldiBjYXN0IGludG8gYW4gdW5zaWduZWQgbG9uZworICoqLworCitzdGF0aWMgdm9pZAoraXhnYl93YXRjaGRvZyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgaXhnYl9hZGFwdGVyICopZGF0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXN0cnVjdCBpeGdiX2Rlc2NfcmluZyAqdHhkciA9ICZhZGFwdGVyLT50eF9yaW5nOworCisJaXhnYl9jaGVja19mb3JfbGluaygmYWRhcHRlci0+aHcpOworCisJaWYgKGl4Z2JfY2hlY2tfZm9yX2JhZF9saW5rKCZhZGFwdGVyLT5odykpIHsKKwkJLyogZm9yY2UgdGhlIHJlc2V0IHBhdGggKi8KKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCX0KKworCWlmKGFkYXB0ZXItPmh3LmxpbmtfdXApIHsKKwkJaWYoIW5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiaXhnYjogJXMgTklDIExpbmsgaXMgVXAgJWQgTWJwcyAlc1xuIiwKKwkJCQkgICBuZXRkZXYtPm5hbWUsIDEwMDAwLCAiRnVsbCBEdXBsZXgiKTsKKwkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSAxMDAwMDsKKwkJCWFkYXB0ZXItPmxpbmtfZHVwbGV4ID0gRlVMTF9EVVBMRVg7CisJCQluZXRpZl9jYXJyaWVyX29uKG5ldGRldik7CisJCQluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7CisJCX0KKwl9IGVsc2UgeworCQlpZihuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKKwkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSAwOworCQkJYWRhcHRlci0+bGlua19kdXBsZXggPSAwOworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSAgICJpeGdiOiAlcyBOSUMgTGluayBpcyBEb3duXG4iLAorCQkJCSAgIG5ldGRldi0+bmFtZSk7CisJCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCisJCX0KKwl9CisKKwlpeGdiX3VwZGF0ZV9zdGF0cyhhZGFwdGVyKTsKKworCWlmKCFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKKwkJaWYoSVhHQl9ERVNDX1VOVVNFRCh0eGRyKSArIDEgPCB0eGRyLT5jb3VudCkgeworCQkJLyogV2UndmUgbG9zdCBsaW5rLCBzbyB0aGUgY29udHJvbGxlciBzdG9wcyBETUEsCisJCQkgKiBidXQgd2UndmUgZ290IHF1ZXVlZCBUeCB3b3JrIHRoYXQncyBuZXZlciBnb2luZworCQkJICogdG8gZ2V0IGRvbmUsIHNvIHJlc2V0IGNvbnRyb2xsZXIgdG8gZmx1c2ggVHguCisJCQkgKiAoRG8gdGhlIHJlc2V0IG91dHNpZGUgb2YgaW50ZXJydXB0IGNvbnRleHQpLiAqLworCQkJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+dHhfdGltZW91dF90YXNrKTsKKwkJfQorCX0KKworCS8qIEZvcmNlIGRldGVjdGlvbiBvZiBodW5nIGNvbnRyb2xsZXIgZXZlcnkgd2F0Y2hkb2cgcGVyaW9kICovCisJYWRhcHRlci0+ZGV0ZWN0X3R4X2h1bmcgPSBUUlVFOworCisJLyogZ2VuZXJhdGUgYW4gaW50ZXJydXB0IHRvIGZvcmNlIGNsZWFuIHVwIG9mIGFueSBzdHJhZ2dsZXJzICovCisJSVhHQl9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJQ1MsIElYR0JfSU5UX1RYRFcpOworCisJLyogUmVzZXQgdGhlIHRpbWVyICovCisJbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgamlmZmllcyArIDIgKiBIWik7Cit9CisKKyNkZWZpbmUgSVhHQl9UWF9GTEFHU19DU1VNCQkweDAwMDAwMDAxCisjZGVmaW5lIElYR0JfVFhfRkxBR1NfVkxBTgkJMHgwMDAwMDAwMgorI2RlZmluZSBJWEdCX1RYX0ZMQUdTX1RTTwkJMHgwMDAwMDAwNAorCitzdGF0aWMgaW5saW5lIGludAoraXhnYl90c28oc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyNpZmRlZiBORVRJRl9GX1RTTworCXN0cnVjdCBpeGdiX2NvbnRleHRfZGVzYyAqY29udGV4dF9kZXNjOworCXVuc2lnbmVkIGludCBpOworCXVpbnQ4X3QgaXBjc3MsIGlwY3NvLCB0dWNzcywgdHVjc28sIGhkcl9sZW47CisJdWludDE2X3QgaXBjc2UsIHR1Y3NlLCBtc3M7CisJaW50IGVycjsKKworCWlmKGxpa2VseShza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplKSkgeworCQlpZiAoc2tiX2hlYWRlcl9jbG9uZWQoc2tiKSkgeworCQkJZXJyID0gcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJaGRyX2xlbiA9ICgoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSkgKyAoc2tiLT5oLnRoLT5kb2ZmIDw8IDIpKTsKKwkJbXNzID0gc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZTsKKwkJc2tiLT5uaC5pcGgtPnRvdF9sZW4gPSAwOworCQlza2ItPm5oLmlwaC0+Y2hlY2sgPSAwOworCQlza2ItPmgudGgtPmNoZWNrID0gfmNzdW1fdGNwdWRwX21hZ2ljKHNrYi0+bmguaXBoLT5zYWRkciwKKwkJCQkJCSAgICAgIHNrYi0+bmguaXBoLT5kYWRkciwKKwkJCQkJCSAgICAgIDAsIElQUFJPVE9fVENQLCAwKTsKKwkJaXBjc3MgPSBza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YTsKKwkJaXBjc28gPSAodm9pZCAqKSYoc2tiLT5uaC5pcGgtPmNoZWNrKSAtICh2b2lkICopc2tiLT5kYXRhOworCQlpcGNzZSA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGEgLSAxOworCQl0dWNzcyA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGE7CisJCXR1Y3NvID0gKHZvaWQgKikmKHNrYi0+aC50aC0+Y2hlY2spIC0gKHZvaWQgKilza2ItPmRhdGE7CisJCXR1Y3NlID0gMDsKKworCQlpID0gYWRhcHRlci0+dHhfcmluZy5uZXh0X3RvX3VzZTsKKwkJY29udGV4dF9kZXNjID0gSVhHQl9DT05URVhUX0RFU0MoYWRhcHRlci0+dHhfcmluZywgaSk7CisKKwkJY29udGV4dF9kZXNjLT5pcGNzcyA9IGlwY3NzOworCQljb250ZXh0X2Rlc2MtPmlwY3NvID0gaXBjc287CisJCWNvbnRleHRfZGVzYy0+aXBjc2UgPSBjcHVfdG9fbGUxNihpcGNzZSk7CisJCWNvbnRleHRfZGVzYy0+dHVjc3MgPSB0dWNzczsKKwkJY29udGV4dF9kZXNjLT50dWNzbyA9IHR1Y3NvOworCQljb250ZXh0X2Rlc2MtPnR1Y3NlID0gY3B1X3RvX2xlMTYodHVjc2UpOworCQljb250ZXh0X2Rlc2MtPm1zcyA9IGNwdV90b19sZTE2KG1zcyk7CisJCWNvbnRleHRfZGVzYy0+aGRyX2xlbiA9IGhkcl9sZW47CisJCWNvbnRleHRfZGVzYy0+c3RhdHVzID0gMDsKKwkJY29udGV4dF9kZXNjLT5jbWRfdHlwZV9sZW4gPSBjcHVfdG9fbGUzMigKKwkJCQkJCSAgSVhHQl9DT05URVhUX0RFU0NfVFlQRSAKKwkJCQkJCXwgSVhHQl9DT05URVhUX0RFU0NfQ01EX1RTRQorCQkJCQkJfCBJWEdCX0NPTlRFWFRfREVTQ19DTURfSVAKKwkJCQkJCXwgSVhHQl9DT05URVhUX0RFU0NfQ01EX1RDUAorCQkJCQkJfCBJWEdCX0NPTlRFWFRfREVTQ19DTURfUlMKKwkJCQkJCXwgSVhHQl9DT05URVhUX0RFU0NfQ01EX0lERQorCQkJCQkJfCAoc2tiLT5sZW4gLSAoaGRyX2xlbikpKTsKKworCQlpZigrK2kgPT0gYWRhcHRlci0+dHhfcmluZy5jb3VudCkgaSA9IDA7CisJCWFkYXB0ZXItPnR4X3JpbmcubmV4dF90b191c2UgPSBpOworCisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbGVhbl90CitpeGdiX3R4X2NzdW0oc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXhnYl9jb250ZXh0X2Rlc2MgKmNvbnRleHRfZGVzYzsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1aW50OF90IGNzcywgY3NvOworCisJaWYobGlrZWx5KHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSkgeworCQljc3MgPSBza2ItPmgucmF3IC0gc2tiLT5kYXRhOworCQljc28gPSAoc2tiLT5oLnJhdyArIHNrYi0+Y3N1bSkgLSBza2ItPmRhdGE7CisKKwkJaSA9IGFkYXB0ZXItPnR4X3JpbmcubmV4dF90b191c2U7CisJCWNvbnRleHRfZGVzYyA9IElYR0JfQ09OVEVYVF9ERVNDKGFkYXB0ZXItPnR4X3JpbmcsIGkpOworCisJCWNvbnRleHRfZGVzYy0+dHVjc3MgPSBjc3M7CisJCWNvbnRleHRfZGVzYy0+dHVjc28gPSBjc287CisJCWNvbnRleHRfZGVzYy0+dHVjc2UgPSAwOworCQkvKiB6ZXJvIG91dCBhbnkgcHJldmlvdXNseSBleGlzdGluZyBkYXRhIGluIG9uZSBpbnN0cnVjdGlvbiAqLworCQkqKHVpbnQzMl90ICopJihjb250ZXh0X2Rlc2MtPmlwY3NzKSA9IDA7CisJCWNvbnRleHRfZGVzYy0+c3RhdHVzID0gMDsKKwkJY29udGV4dF9kZXNjLT5oZHJfbGVuID0gMDsKKwkJY29udGV4dF9kZXNjLT5tc3MgPSAwOworCQljb250ZXh0X2Rlc2MtPmNtZF90eXBlX2xlbiA9CisJCQljcHVfdG9fbGUzMihJWEdCX0NPTlRFWFRfREVTQ19UWVBFCisJCQkJCXwgSVhHQl9UWF9ERVNDX0NNRF9SUyAKKwkJCQkJfCBJWEdCX1RYX0RFU0NfQ01EX0lERSk7CisKKwkJaWYoKytpID09IGFkYXB0ZXItPnR4X3JpbmcuY291bnQpIGkgPSAwOworCQlhZGFwdGVyLT50eF9yaW5nLm5leHRfdG9fdXNlID0gaTsKKworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKKyNkZWZpbmUgSVhHQl9NQVhfVFhEX1BXUgkxNAorI2RlZmluZSBJWEdCX01BWF9EQVRBX1BFUl9UWEQJKDE8PElYR0JfTUFYX1RYRF9QV1IpCisKK3N0YXRpYyBpbmxpbmUgaW50CitpeGdiX3R4X21hcChzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSAgICB1bnNpZ25lZCBpbnQgZmlyc3QpCit7CisJc3RydWN0IGl4Z2JfZGVzY19yaW5nICp0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3Jpbmc7CisJc3RydWN0IGl4Z2JfYnVmZmVyICpidWZmZXJfaW5mbzsKKwlpbnQgbGVuID0gc2tiLT5sZW47CisJdW5zaWduZWQgaW50IG9mZnNldCA9IDAsIHNpemUsIGNvdW50ID0gMCwgaTsKKworCXVuc2lnbmVkIGludCBucl9mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJdW5zaWduZWQgaW50IGY7CisJbGVuIC09IHNrYi0+ZGF0YV9sZW47CisKKwlpID0gdHhfcmluZy0+bmV4dF90b191c2U7CisKKwl3aGlsZShsZW4pIHsKKwkJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+YnVmZmVyX2luZm9baV07CisJCXNpemUgPSBtaW4obGVuLCBJWEdCX01BWF9KVU1CT19GUkFNRV9TSVpFKTsKKwkJYnVmZmVyX2luZm8tPmxlbmd0aCA9IHNpemU7CisJCWJ1ZmZlcl9pbmZvLT5kbWEgPQorCQkJcGNpX21hcF9zaW5nbGUoYWRhcHRlci0+cGRldiwKKwkJCQlza2ItPmRhdGEgKyBvZmZzZXQsCisJCQkJc2l6ZSwKKwkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJYnVmZmVyX2luZm8tPnRpbWVfc3RhbXAgPSBqaWZmaWVzOworCisJCWxlbiAtPSBzaXplOworCQlvZmZzZXQgKz0gc2l6ZTsKKwkJY291bnQrKzsKKwkJaWYoKytpID09IHR4X3JpbmctPmNvdW50KSBpID0gMDsKKwl9CisKKwlmb3IoZiA9IDA7IGYgPCBucl9mcmFnczsgZisrKSB7CisJCXN0cnVjdCBza2JfZnJhZ19zdHJ1Y3QgKmZyYWc7CisKKwkJZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ZdOworCQlsZW4gPSBmcmFnLT5zaXplOworCQlvZmZzZXQgPSAwOworCisJCXdoaWxlKGxlbikgeworCQkJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+YnVmZmVyX2luZm9baV07CisJCQlzaXplID0gbWluKGxlbiwgSVhHQl9NQVhfSlVNQk9fRlJBTUVfU0laRSk7CisJCQlidWZmZXJfaW5mby0+bGVuZ3RoID0gc2l6ZTsKKwkJCWJ1ZmZlcl9pbmZvLT5kbWEgPQorCQkJCXBjaV9tYXBfcGFnZShhZGFwdGVyLT5wZGV2LAorCQkJCQlmcmFnLT5wYWdlLAorCQkJCQlmcmFnLT5wYWdlX29mZnNldCArIG9mZnNldCwKKwkJCQkJc2l6ZSwKKwkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCQlidWZmZXJfaW5mby0+dGltZV9zdGFtcCA9IGppZmZpZXM7CisKKwkJCWxlbiAtPSBzaXplOworCQkJb2Zmc2V0ICs9IHNpemU7CisJCQljb3VudCsrOworCQkJaWYoKytpID09IHR4X3JpbmctPmNvdW50KSBpID0gMDsKKwkJfQorCX0KKwlpID0gKGkgPT0gMCkgPyB0eF9yaW5nLT5jb3VudCAtIDEgOiBpIC0gMTsKKwl0eF9yaW5nLT5idWZmZXJfaW5mb1tpXS5za2IgPSBza2I7CisJdHhfcmluZy0+YnVmZmVyX2luZm9bZmlyc3RdLm5leHRfdG9fd2F0Y2ggPSBpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2l4Z2JfdHhfcXVldWUoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciwgaW50IGNvdW50LCBpbnQgdmxhbl9pZCxpbnQgdHhfZmxhZ3MpCit7CisJc3RydWN0IGl4Z2JfZGVzY19yaW5nICp0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3Jpbmc7CisJc3RydWN0IGl4Z2JfdHhfZGVzYyAqdHhfZGVzYyA9IE5VTEw7CisJc3RydWN0IGl4Z2JfYnVmZmVyICpidWZmZXJfaW5mbzsKKwl1aW50MzJfdCBjbWRfdHlwZV9sZW4gPSBhZGFwdGVyLT50eF9jbWRfdHlwZTsKKwl1aW50OF90IHN0YXR1cyA9IDA7CisJdWludDhfdCBwb3B0cyA9IDA7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZih0eF9mbGFncyAmIElYR0JfVFhfRkxBR1NfVFNPKSB7CisJCWNtZF90eXBlX2xlbiB8PSBJWEdCX1RYX0RFU0NfQ01EX1RTRTsKKwkJcG9wdHMgfD0gKElYR0JfVFhfREVTQ19QT1BUU19JWFNNIHwgSVhHQl9UWF9ERVNDX1BPUFRTX1RYU00pOworCX0KKworCWlmKHR4X2ZsYWdzICYgSVhHQl9UWF9GTEFHU19DU1VNKQorCQlwb3B0cyB8PSBJWEdCX1RYX0RFU0NfUE9QVFNfVFhTTTsKKworCWlmKHR4X2ZsYWdzICYgSVhHQl9UWF9GTEFHU19WTEFOKSB7CisJCWNtZF90eXBlX2xlbiB8PSBJWEdCX1RYX0RFU0NfQ01EX1ZMRTsKKwl9CisKKwlpID0gdHhfcmluZy0+bmV4dF90b191c2U7CisKKwl3aGlsZShjb3VudC0tKSB7CisJCWJ1ZmZlcl9pbmZvID0gJnR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOworCQl0eF9kZXNjID0gSVhHQl9UWF9ERVNDKCp0eF9yaW5nLCBpKTsKKwkJdHhfZGVzYy0+YnVmZl9hZGRyID0gY3B1X3RvX2xlNjQoYnVmZmVyX2luZm8tPmRtYSk7CisJCXR4X2Rlc2MtPmNtZF90eXBlX2xlbiA9CisJCQljcHVfdG9fbGUzMihjbWRfdHlwZV9sZW4gfCBidWZmZXJfaW5mby0+bGVuZ3RoKTsKKwkJdHhfZGVzYy0+c3RhdHVzID0gc3RhdHVzOworCQl0eF9kZXNjLT5wb3B0cyA9IHBvcHRzOworCQl0eF9kZXNjLT52bGFuID0gY3B1X3RvX2xlMTYodmxhbl9pZCk7CisKKwkJaWYoKytpID09IHR4X3JpbmctPmNvdW50KSBpID0gMDsKKwl9CisKKwl0eF9kZXNjLT5jbWRfdHlwZV9sZW4gfD0gY3B1X3RvX2xlMzIoSVhHQl9UWF9ERVNDX0NNRF9FT1AgCisJCQkJfCBJWEdCX1RYX0RFU0NfQ01EX1JTICk7CisKKwkvKiBGb3JjZSBtZW1vcnkgd3JpdGVzIHRvIGNvbXBsZXRlIGJlZm9yZSBsZXR0aW5nIGgvdworCSAqIGtub3cgdGhlcmUgYXJlIG5ldyBkZXNjcmlwdG9ycyB0byBmZXRjaC4gIChPbmx5CisJICogYXBwbGljYWJsZSBmb3Igd2Vhay1vcmRlcmVkIG1lbW9yeSBtb2RlbCBhcmNocywKKwkgKiBzdWNoIGFzIElBLTY0KS4gKi8KKwl3bWIoKTsKKworCXR4X3JpbmctPm5leHRfdG9fdXNlID0gaTsKKwlJWEdCX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFREVCwgaSk7Cit9CisKKy8qIFR4IERlc2NyaXB0b3JzIG5lZWRlZCwgd29yc3QgY2FzZSAqLworI2RlZmluZSBUWERfVVNFX0NPVU5UKFMpICgoKFMpID4+IElYR0JfTUFYX1RYRF9QV1IpICsgXAorCQkJICgoKFMpICYgKElYR0JfTUFYX0RBVEFfUEVSX1RYRCAtIDEpKSA/IDEgOiAwKSkKKyNkZWZpbmUgREVTQ19ORUVERUQgVFhEX1VTRV9DT1VOVChJWEdCX01BWF9EQVRBX1BFUl9UWEQpICsgXAorCU1BWF9TS0JfRlJBR1MgKiBUWERfVVNFX0NPVU5UKFBBR0VfU0laRSkgKyAxCisKK3N0YXRpYyBpbnQKK2l4Z2JfeG1pdF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJdW5zaWduZWQgaW50IGZpcnN0OworCXVuc2lnbmVkIGludCB0eF9mbGFncyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdmxhbl9pZCA9IDA7CisJaW50IHRzbzsKKworCWlmKHNrYi0+bGVuIDw9IDApIHsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPnR4X2xvY2ssIGZsYWdzKTsKKwlpZih1bmxpa2VseShJWEdCX0RFU0NfVU5VU0VEKCZhZGFwdGVyLT50eF9yaW5nKSA8IERFU0NfTkVFREVEKSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnR4X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnR4X2xvY2ssIGZsYWdzKTsKKworCWlmKGFkYXB0ZXItPnZsZ3JwICYmIHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgeworCQl0eF9mbGFncyB8PSBJWEdCX1RYX0ZMQUdTX1ZMQU47CisJCXZsYW5faWQgPSB2bGFuX3R4X3RhZ19nZXQoc2tiKTsKKwl9CisKKwlmaXJzdCA9IGFkYXB0ZXItPnR4X3JpbmcubmV4dF90b191c2U7CisJCisJdHNvID0gaXhnYl90c28oYWRhcHRlciwgc2tiKTsKKwlpZiAodHNvIDwgMCkgeworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlyZXR1cm4gTkVUREVWX1RYX09LOworCX0KKworCWlmICh0c28pCisJCXR4X2ZsYWdzIHw9IElYR0JfVFhfRkxBR1NfVFNPOworCWVsc2UgaWYoaXhnYl90eF9jc3VtKGFkYXB0ZXIsIHNrYikpCisJCXR4X2ZsYWdzIHw9IElYR0JfVFhfRkxBR1NfQ1NVTTsKKworCWl4Z2JfdHhfcXVldWUoYWRhcHRlciwgaXhnYl90eF9tYXAoYWRhcHRlciwgc2tiLCBmaXJzdCksIHZsYW5faWQsCisJCQl0eF9mbGFncyk7CisKKwluZXRkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGl4Z2JfdHhfdGltZW91dCAtIFJlc3BvbmQgdG8gYSBUeCBIYW5nCisgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiovCisKK3N0YXRpYyB2b2lkCitpeGdiX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCisJLyogRG8gdGhlIHJlc2V0IG91dHNpZGUgb2YgaW50ZXJydXB0IGNvbnRleHQgKi8KKwlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT50eF90aW1lb3V0X3Rhc2spOworfQorCitzdGF0aWMgdm9pZAoraXhnYl90eF90aW1lb3V0X3Rhc2soc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCisJaXhnYl9kb3duKGFkYXB0ZXIsIFRSVUUpOworCWl4Z2JfdXAoYWRhcHRlcik7Cit9CisKKy8qKgorICogaXhnYl9nZXRfc3RhdHMgLSBHZXQgU3lzdGVtIE5ldHdvcmsgU3RhdGlzdGljcworICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBzdGF0aXN0aWNzIHN0cnVjdHVyZS4KKyAqIFRoZSBzdGF0aXN0aWNzIGFyZSBhY3R1YWxseSB1cGRhdGVkIGZyb20gdGhlIHRpbWVyIGNhbGxiYWNrLgorICoqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgoraXhnYl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCisJcmV0dXJuICZhZGFwdGVyLT5uZXRfc3RhdHM7Cit9CisKKy8qKgorICogaXhnYl9jaGFuZ2VfbXR1IC0gQ2hhbmdlIHRoZSBNYXhpbXVtIFRyYW5zZmVyIFVuaXQKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBuZXdfbXR1OiBuZXcgdmFsdWUgZm9yIG1heGltdW0gZnJhbWUgc2l6ZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKiovCisKK3N0YXRpYyBpbnQKK2l4Z2JfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgbmV3X210dSkKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCWludCBtYXhfZnJhbWUgPSBuZXdfbXR1ICsgRU5FVF9IRUFERVJfU0laRSArIEVORVRfRkNTX0xFTkdUSDsKKwlpbnQgb2xkX21heF9mcmFtZSA9IG5ldGRldi0+bXR1ICsgRU5FVF9IRUFERVJfU0laRSArIEVORVRfRkNTX0xFTkdUSDsKKworCisJaWYoKG1heF9mcmFtZSA8IElYR0JfTUlOX0VORVRfRlJBTUVfU0laRV9XSVRIT1VUX0ZDUyArIEVORVRfRkNTX0xFTkdUSCkKKwkgICB8fCAobWF4X2ZyYW1lID4gSVhHQl9NQVhfSlVNQk9fRlJBTUVfU0laRSArIEVORVRfRkNTX0xFTkdUSCkpIHsKKwkJSVhHQl9FUlIoIkludmFsaWQgTVRVIHNldHRpbmdcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZigobWF4X2ZyYW1lIDw9IElYR0JfTUFYX0VORVRfRlJBTUVfU0laRV9XSVRIT1VUX0ZDUyArIEVORVRfRkNTX0xFTkdUSCkKKwkgICB8fCAobWF4X2ZyYW1lIDw9IElYR0JfUlhCVUZGRVJfMjA0OCkpIHsKKwkJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA9IElYR0JfUlhCVUZGRVJfMjA0ODsKKworCX0gZWxzZSBpZihtYXhfZnJhbWUgPD0gSVhHQl9SWEJVRkZFUl80MDk2KSB7CisJCWFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gPSBJWEdCX1JYQlVGRkVSXzQwOTY7CisKKwl9IGVsc2UgaWYobWF4X2ZyYW1lIDw9IElYR0JfUlhCVUZGRVJfODE5MikgeworCQlhZGFwdGVyLT5yeF9idWZmZXJfbGVuID0gSVhHQl9SWEJVRkZFUl84MTkyOworCisJfSBlbHNlIHsKKwkJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA9IElYR0JfUlhCVUZGRVJfMTYzODQ7CisJfQorCisJbmV0ZGV2LT5tdHUgPSBuZXdfbXR1OworCisJaWYob2xkX21heF9mcmFtZSAhPSBtYXhfZnJhbWUgJiYgbmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisKKwkJaXhnYl9kb3duKGFkYXB0ZXIsIFRSVUUpOworCQlpeGdiX3VwKGFkYXB0ZXIpOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGl4Z2JfdXBkYXRlX3N0YXRzIC0gVXBkYXRlIHRoZSBib2FyZCBzdGF0aXN0aWNzIGNvdW50ZXJzLgorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiovCisKK3ZvaWQKK2l4Z2JfdXBkYXRlX3N0YXRzKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJYWRhcHRlci0+c3RhdHMudHBybCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVFBSTCk7CisJYWRhcHRlci0+c3RhdHMudHByaCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVFBSSCk7CisJYWRhcHRlci0+c3RhdHMuZ3ByY2wgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEdQUkNMKTsKKwlhZGFwdGVyLT5zdGF0cy5ncHJjaCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgR1BSQ0gpOworCWFkYXB0ZXItPnN0YXRzLmJwcmNsICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBCUFJDTCk7CisJYWRhcHRlci0+c3RhdHMuYnByY2ggKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEJQUkNIKTsKKwlhZGFwdGVyLT5zdGF0cy5tcHJjbCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgTVBSQ0wpOworCWFkYXB0ZXItPnN0YXRzLm1wcmNoICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBNUFJDSCk7CisJYWRhcHRlci0+c3RhdHMudXByY2wgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFVQUkNMKTsKKwlhZGFwdGVyLT5zdGF0cy51cHJjaCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVVBSQ0gpOworCWFkYXB0ZXItPnN0YXRzLnZwcmNsICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBWUFJDTCk7CisJYWRhcHRlci0+c3RhdHMudnByY2ggKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFZQUkNIKTsKKwlhZGFwdGVyLT5zdGF0cy5qcHJjbCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgSlBSQ0wpOworCWFkYXB0ZXItPnN0YXRzLmpwcmNoICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBKUFJDSCk7CisJYWRhcHRlci0+c3RhdHMuZ29yY2wgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEdPUkNMKTsKKwlhZGFwdGVyLT5zdGF0cy5nb3JjaCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgR09SQ0gpOworCWFkYXB0ZXItPnN0YXRzLnRvcmwgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFRPUkwpOworCWFkYXB0ZXItPnN0YXRzLnRvcmggKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFRPUkgpOworCWFkYXB0ZXItPnN0YXRzLnJuYmMgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJOQkMpOworCWFkYXB0ZXItPnN0YXRzLnJ1YyArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUlVDKTsKKwlhZGFwdGVyLT5zdGF0cy5yb2MgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJPQyk7CisJYWRhcHRlci0+c3RhdHMucmxlYyArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkxFQyk7CisJYWRhcHRlci0+c3RhdHMuY3JjZXJycyArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgQ1JDRVJSUyk7CisJYWRhcHRlci0+c3RhdHMuaWNiYyArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgSUNCQyk7CisJYWRhcHRlci0+c3RhdHMuZWNiYyArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgRUNCQyk7CisJYWRhcHRlci0+c3RhdHMubXBjICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBNUEMpOworCWFkYXB0ZXItPnN0YXRzLnRwdGwgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFRQVEwpOworCWFkYXB0ZXItPnN0YXRzLnRwdGggKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFRQVEgpOworCWFkYXB0ZXItPnN0YXRzLmdwdGNsICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBHUFRDTCk7CisJYWRhcHRlci0+c3RhdHMuZ3B0Y2ggKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEdQVENIKTsKKwlhZGFwdGVyLT5zdGF0cy5icHRjbCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgQlBUQ0wpOworCWFkYXB0ZXItPnN0YXRzLmJwdGNoICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBCUFRDSCk7CisJYWRhcHRlci0+c3RhdHMubXB0Y2wgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIE1QVENMKTsKKwlhZGFwdGVyLT5zdGF0cy5tcHRjaCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgTVBUQ0gpOworCWFkYXB0ZXItPnN0YXRzLnVwdGNsICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBVUFRDTCk7CisJYWRhcHRlci0+c3RhdHMudXB0Y2ggKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFVQVENIKTsKKwlhZGFwdGVyLT5zdGF0cy52cHRjbCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVlBUQ0wpOworCWFkYXB0ZXItPnN0YXRzLnZwdGNoICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBWUFRDSCk7CisJYWRhcHRlci0+c3RhdHMuanB0Y2wgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEpQVENMKTsKKwlhZGFwdGVyLT5zdGF0cy5qcHRjaCArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgSlBUQ0gpOworCWFkYXB0ZXItPnN0YXRzLmdvdGNsICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBHT1RDTCk7CisJYWRhcHRlci0+c3RhdHMuZ290Y2ggKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIEdPVENIKTsKKwlhZGFwdGVyLT5zdGF0cy50b3RsICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBUT1RMKTsKKwlhZGFwdGVyLT5zdGF0cy50b3RoICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBUT1RIKTsKKwlhZGFwdGVyLT5zdGF0cy5kYyArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgREMpOworCWFkYXB0ZXItPnN0YXRzLnBsdDY0YyArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUExUNjRDKTsKKwlhZGFwdGVyLT5zdGF0cy50c2N0YyArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVFNDVEMpOworCWFkYXB0ZXItPnN0YXRzLnRzY3RmYyArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgVFNDVEZDKTsKKwlhZGFwdGVyLT5zdGF0cy5pYmljICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBJQklDKTsKKwlhZGFwdGVyLT5zdGF0cy5yZmMgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFJGQyk7CisJYWRhcHRlci0+c3RhdHMubGZjICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBMRkMpOworCWFkYXB0ZXItPnN0YXRzLnBmcmMgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFBGUkMpOworCWFkYXB0ZXItPnN0YXRzLnBmdGMgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFBGVEMpOworCWFkYXB0ZXItPnN0YXRzLm1jZnJjICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBNQ0ZSQyk7CisJYWRhcHRlci0+c3RhdHMubWNmdGMgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIE1DRlRDKTsKKwlhZGFwdGVyLT5zdGF0cy54b25yeGMgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFhPTlJYQyk7CisJYWRhcHRlci0+c3RhdHMueG9udHhjICs9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBYT05UWEMpOworCWFkYXB0ZXItPnN0YXRzLnhvZmZyeGMgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFhPRkZSWEMpOworCWFkYXB0ZXItPnN0YXRzLnhvZmZ0eGMgKz0gSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFhPRkZUWEMpOworCWFkYXB0ZXItPnN0YXRzLnJqYyArPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkpDKTsKKworCS8qIEZpbGwgb3V0IHRoZSBPUyBzdGF0aXN0aWNzIHN0cnVjdHVyZSAqLworCisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X3BhY2tldHMgPSBhZGFwdGVyLT5zdGF0cy5ncHJjbDsKKwlhZGFwdGVyLT5uZXRfc3RhdHMudHhfcGFja2V0cyA9IGFkYXB0ZXItPnN0YXRzLmdwdGNsOworCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9ieXRlcyA9IGFkYXB0ZXItPnN0YXRzLmdvcmNsOworCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9ieXRlcyA9IGFkYXB0ZXItPnN0YXRzLmdvdGNsOworCWFkYXB0ZXItPm5ldF9zdGF0cy5tdWx0aWNhc3QgPSBhZGFwdGVyLT5zdGF0cy5tcHJjbDsKKwlhZGFwdGVyLT5uZXRfc3RhdHMuY29sbGlzaW9ucyA9IDA7CisKKwkvKiBpZ25vcmUgUkxFQyBhcyBpdCByZXBvcnRzIGVycm9ycyBmb3IgcGFkZGVkICg8NjRieXRlcykgZnJhbWVzCisJICogd2l0aCBhIGxlbmd0aCBpbiB0aGUgdHlwZS9sZW4gZmllbGQgKi8KKwlhZGFwdGVyLT5uZXRfc3RhdHMucnhfZXJyb3JzID0KKwkgICAgLyogYWRhcHRlci0+c3RhdHMucm5iYyArICovIGFkYXB0ZXItPnN0YXRzLmNyY2VycnMgKworCSAgICBhZGFwdGVyLT5zdGF0cy5ydWMgKworCSAgICBhZGFwdGVyLT5zdGF0cy5yb2MgLyorIGFkYXB0ZXItPnN0YXRzLnJsZWMgKi8gICsKKwkgICAgYWRhcHRlci0+c3RhdHMuaWNiYyArCisJICAgIGFkYXB0ZXItPnN0YXRzLmVjYmMgKyBhZGFwdGVyLT5zdGF0cy5tcGM7CisKKwlhZGFwdGVyLT5uZXRfc3RhdHMucnhfZHJvcHBlZCA9IGFkYXB0ZXItPnN0YXRzLm1wYzsKKworCS8qIHNlZSBhYm92ZQorCSAqIGFkYXB0ZXItPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gYWRhcHRlci0+c3RhdHMucmxlYzsKKwkgKi8KKworCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzID0gYWRhcHRlci0+c3RhdHMuY3JjZXJyczsKKwlhZGFwdGVyLT5uZXRfc3RhdHMucnhfZmlmb19lcnJvcnMgPSBhZGFwdGVyLT5zdGF0cy5tcGM7CisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSBhZGFwdGVyLT5zdGF0cy5tcGM7CisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X292ZXJfZXJyb3JzID0gYWRhcHRlci0+c3RhdHMubXBjOworCisJYWRhcHRlci0+bmV0X3N0YXRzLnR4X2Vycm9ycyA9IDA7CisJYWRhcHRlci0+bmV0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IDA7CisJYWRhcHRlci0+bmV0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzID0gMDsKKwlhZGFwdGVyLT5uZXRfc3RhdHMudHhfY2Fycmllcl9lcnJvcnMgPSAwOworCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9maWZvX2Vycm9ycyA9IDA7CisJYWRhcHRlci0+bmV0X3N0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMgPSAwOworCWFkYXB0ZXItPm5ldF9zdGF0cy50eF93aW5kb3dfZXJyb3JzID0gMDsKK30KKworI2RlZmluZSBJWEdCX01BWF9JTlRSIDEwCisvKioKKyAqIGl4Z2JfaW50ciAtIEludGVycnVwdCBIYW5kbGVyCisgKiBAaXJxOiBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAZGF0YTogcG9pbnRlciB0byBhIG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBwdF9yZWdzOiBDUFUgcmVnaXN0ZXJzIHN0cnVjdHVyZQorICoqLworCitzdGF0aWMgaXJxcmV0dXJuX3QKK2l4Z2JfaW50cihpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBpeGdiX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1aW50MzJfdCBpY3IgPSBJWEdCX1JFQURfUkVHKGh3LCBJQ1IpOworI2lmbmRlZiBDT05GSUdfSVhHQl9OQVBJCisJdW5zaWduZWQgaW50IGk7CisjZW5kaWYKKworCWlmKHVubGlrZWx5KCFpY3IpKQorCQlyZXR1cm4gSVJRX05PTkU7ICAvKiBOb3Qgb3VyIGludGVycnVwdCAqLworCisJaWYodW5saWtlbHkoaWNyICYgKElYR0JfSU5UX1JYU0VRIHwgSVhHQl9JTlRfTFNDKSkpIHsKKwkJbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgamlmZmllcyk7CisJfQorCisjaWZkZWYgQ09ORklHX0lYR0JfTkFQSQorCWlmKG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAobmV0ZGV2KSkgeworCisJCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgcmVnaXN0ZXIgZm9yIHBvbGwuIFRoZSBmbHVzaCAKKwkJICBvZiB0aGUgcG9zdGVkIHdyaXRlIGlzIGludGVudGlvbmFsbHkgbGVmdCBvdXQuCisJCSovCisKKwkJYXRvbWljX2luYygmYWRhcHRlci0+aXJxX3NlbSk7CisJCUlYR0JfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSU1DLCB+MCk7CisJCV9fbmV0aWZfcnhfc2NoZWR1bGUobmV0ZGV2KTsKKwl9CisjZWxzZQorCS8qIHllcywgdGhhdCBpcyBhY3R1YWxseSBhICYgYW5kIGl0IGlzIG1lYW50IHRvIG1ha2Ugc3VyZSB0aGF0CisJICogZXZlcnkgcGFzcyB0aHJvdWdoIHRoaXMgZm9yIGxvb3AgY2hlY2tzIGJvdGggcmVjZWl2ZSBhbmQKKwkgKiB0cmFuc21pdCBxdWV1ZXMgZm9yIGNvbXBsZXRlZCBkZXNjcmlwdG9ycywgaW50ZW5kZWQgdG8KKwkgKiBhdm9pZCBzdGFydmF0aW9uIGlzc3VlcyBhbmQgYXNzaXN0IHR4L3J4IGZhaXJuZXNzLiAqLworCWZvcihpID0gMDsgaSA8IElYR0JfTUFYX0lOVFI7IGkrKykKKwkJaWYoIWl4Z2JfY2xlYW5fcnhfaXJxKGFkYXB0ZXIpICYKKwkJICAgIWl4Z2JfY2xlYW5fdHhfaXJxKGFkYXB0ZXIpKQorCQkJYnJlYWs7CisjZW5kaWYgCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisjaWZkZWYgQ09ORklHX0lYR0JfTkFQSQorLyoqCisgKiBpeGdiX2NsZWFuIC0gTkFQSSBSeCBwb2xsaW5nIGNhbGxiYWNrCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqKi8KKworc3RhdGljIGludAoraXhnYl9jbGVhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgKmJ1ZGdldCkKK3sKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCWludCB3b3JrX3RvX2RvID0gbWluKCpidWRnZXQsIG5ldGRldi0+cXVvdGEpOworCWludCB0eF9jbGVhbmVkOworCWludCB3b3JrX2RvbmUgPSAwOworCisJdHhfY2xlYW5lZCA9IGl4Z2JfY2xlYW5fdHhfaXJxKGFkYXB0ZXIpOworCWl4Z2JfY2xlYW5fcnhfaXJxKGFkYXB0ZXIsICZ3b3JrX2RvbmUsIHdvcmtfdG9fZG8pOworCisJKmJ1ZGdldCAtPSB3b3JrX2RvbmU7CisJbmV0ZGV2LT5xdW90YSAtPSB3b3JrX2RvbmU7CisKKwkvKiBpZiBubyBUeCBhbmQgbm90IGVub3VnaCBSeCB3b3JrIGRvbmUsIGV4aXQgdGhlIHBvbGxpbmcgbW9kZSAqLworCWlmKCghdHhfY2xlYW5lZCAmJiAod29ya19kb25lID09IDApKSB8fCAhbmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCW5ldGlmX3J4X2NvbXBsZXRlKG5ldGRldik7CisJCWl4Z2JfaXJxX2VuYWJsZShhZGFwdGVyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworLyoqCisgKiBpeGdiX2NsZWFuX3R4X2lycSAtIFJlY2xhaW0gcmVzb3VyY2VzIGFmdGVyIHRyYW5zbWl0IGNvbXBsZXRlcworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiovCisKK3N0YXRpYyBib29sZWFuX3QKK2l4Z2JfY2xlYW5fdHhfaXJxKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGl4Z2JfZGVzY19yaW5nICp0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3Jpbmc7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlzdHJ1Y3QgaXhnYl90eF9kZXNjICp0eF9kZXNjLCAqZW9wX2Rlc2M7CisJc3RydWN0IGl4Z2JfYnVmZmVyICpidWZmZXJfaW5mbzsKKwl1bnNpZ25lZCBpbnQgaSwgZW9wOworCWJvb2xlYW5fdCBjbGVhbmVkID0gRkFMU0U7CisKKwlpID0gdHhfcmluZy0+bmV4dF90b19jbGVhbjsKKwllb3AgPSB0eF9yaW5nLT5idWZmZXJfaW5mb1tpXS5uZXh0X3RvX3dhdGNoOworCWVvcF9kZXNjID0gSVhHQl9UWF9ERVNDKCp0eF9yaW5nLCBlb3ApOworCisJd2hpbGUoZW9wX2Rlc2MtPnN0YXR1cyAmIElYR0JfVFhfREVTQ19TVEFUVVNfREQpIHsKKworCQlmb3IoY2xlYW5lZCA9IEZBTFNFOyAhY2xlYW5lZDsgKSB7CisJCQl0eF9kZXNjID0gSVhHQl9UWF9ERVNDKCp0eF9yaW5nLCBpKTsKKwkJCWJ1ZmZlcl9pbmZvID0gJnR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOworCisJCQlpZiAodHhfZGVzYy0+cG9wdHMKKwkJCSAgICAmIChJWEdCX1RYX0RFU0NfUE9QVFNfVFhTTSB8CisJCQkgICAgICAgSVhHQl9UWF9ERVNDX1BPUFRTX0lYU00pKQorCQkJCWFkYXB0ZXItPmh3X2NzdW1fdHhfZ29vZCsrOworCisJCQlpeGdiX3VubWFwX2FuZF9mcmVlX3R4X3Jlc291cmNlKGFkYXB0ZXIsIGJ1ZmZlcl9pbmZvKTsKKworCQkJKih1aW50MzJfdCAqKSYodHhfZGVzYy0+c3RhdHVzKSA9IDA7CisKKwkJCWNsZWFuZWQgPSAoaSA9PSBlb3ApOworCQkJaWYoKytpID09IHR4X3JpbmctPmNvdW50KSBpID0gMDsKKwkJfQorCisJCWVvcCA9IHR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldLm5leHRfdG9fd2F0Y2g7CisJCWVvcF9kZXNjID0gSVhHQl9UWF9ERVNDKCp0eF9yaW5nLCBlb3ApOworCX0KKworCXR4X3JpbmctPm5leHRfdG9fY2xlYW4gPSBpOworCisJc3Bpbl9sb2NrKCZhZGFwdGVyLT50eF9sb2NrKTsKKwlpZihjbGVhbmVkICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KSAmJiBuZXRpZl9jYXJyaWVyX29rKG5ldGRldikgJiYKKwkgICAoSVhHQl9ERVNDX1VOVVNFRCh0eF9yaW5nKSA+IElYR0JfVFhfUVVFVUVfV0FLRSkpIHsKKworCQluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7CisJfQorCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT50eF9sb2NrKTsKKworCWlmKGFkYXB0ZXItPmRldGVjdF90eF9odW5nKSB7CisJCS8qIGRldGVjdCBhIHRyYW5zbWl0IGhhbmcgaW4gaGFyZHdhcmUsIHRoaXMgc2VyaWFsaXplcyB0aGUKKwkJICogY2hlY2sgd2l0aCB0aGUgY2xlYXJpbmcgb2YgdGltZV9zdGFtcCBhbmQgbW92ZW1lbnQgb2YgaSAqLworCQlhZGFwdGVyLT5kZXRlY3RfdHhfaHVuZyA9IEZBTFNFOworCQlpZih0eF9yaW5nLT5idWZmZXJfaW5mb1tpXS5kbWEgJiYKKwkJICAgdGltZV9hZnRlcihqaWZmaWVzLCB0eF9yaW5nLT5idWZmZXJfaW5mb1tpXS50aW1lX3N0YW1wICsgSFopCisJCSAgICYmICEoSVhHQl9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNUQVRVUykgJgorCQkJSVhHQl9TVEFUVVNfVFhPRkYpKQorCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCX0KKworCXJldHVybiBjbGVhbmVkOworfQorCisvKioKKyAqIGl4Z2JfcnhfY2hlY2tzdW0gLSBSZWNlaXZlIENoZWNrc3VtIE9mZmxvYWQgZm9yIDgyNTk3LgorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiBAcnhfZGVzYzogcmVjZWl2ZSBkZXNjcmlwdG9yCisgKiBAc2tfYnVmZjogc29ja2V0IGJ1ZmZlciB3aXRoIHJlY2VpdmVkIGRhdGEKKyAqKi8KKworc3RhdGljIGlubGluZSB2b2lkCitpeGdiX3J4X2NoZWNrc3VtKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCSBzdHJ1Y3QgaXhnYl9yeF9kZXNjICpyeF9kZXNjLAorCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKiBJZ25vcmUgQ2hlY2tzdW0gYml0IGlzIHNldCBPUgorCSAqIFRDUCBDaGVja3N1bSBoYXMgbm90IGJlZW4gY2FsY3VsYXRlZAorCSAqLworCWlmKChyeF9kZXNjLT5zdGF0dXMgJiBJWEdCX1JYX0RFU0NfU1RBVFVTX0lYU00pIHx8CisJICAgKCEocnhfZGVzYy0+c3RhdHVzICYgSVhHQl9SWF9ERVNDX1NUQVRVU19UQ1BDUykpKSB7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJcmV0dXJuOworCX0KKworCS8qIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGUgaGFyZHdhcmUgZGlkIHRoZSBUQ1AgY2hlY2tzdW0gKi8KKwkvKiBub3cgbG9vayBhdCB0aGUgVENQIGNoZWNrc3VtIGVycm9yIGJpdCAqLworCWlmKHJ4X2Rlc2MtPmVycm9ycyAmIElYR0JfUlhfREVTQ19FUlJPUlNfVENQRSkgeworCQkvKiBsZXQgdGhlIHN0YWNrIHZlcmlmeSBjaGVja3N1bSBlcnJvcnMgKi8KKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQlhZGFwdGVyLT5od19jc3VtX3J4X2Vycm9yKys7CisJfSBlbHNlIHsKKwkJLyogVENQIGNoZWNrc3VtIGlzIGdvb2QgKi8KKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJYWRhcHRlci0+aHdfY3N1bV9yeF9nb29kKys7CisJfQorfQorCisvKioKKyAqIGl4Z2JfY2xlYW5fcnhfaXJxIC0gU2VuZCByZWNlaXZlZCBkYXRhIHVwIHRoZSBuZXR3b3JrIHN0YWNrLAorICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiovCisKK3N0YXRpYyBib29sZWFuX3QKKyNpZmRlZiBDT05GSUdfSVhHQl9OQVBJCitpeGdiX2NsZWFuX3J4X2lycShzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyLCBpbnQgKndvcmtfZG9uZSwgaW50IHdvcmtfdG9fZG8pCisjZWxzZQoraXhnYl9jbGVhbl9yeF9pcnEoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcikKKyNlbmRpZgoreworCXN0cnVjdCBpeGdiX2Rlc2NfcmluZyAqcnhfcmluZyA9ICZhZGFwdGVyLT5yeF9yaW5nOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCXN0cnVjdCBpeGdiX3J4X2Rlc2MgKnJ4X2Rlc2MsICpuZXh0X3J4ZDsKKwlzdHJ1Y3QgaXhnYl9idWZmZXIgKmJ1ZmZlcl9pbmZvLCAqbmV4dF9idWZmZXIsICpuZXh0Ml9idWZmZXI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm5leHRfc2tiOworCXVpbnQzMl90IGxlbmd0aDsKKwl1bnNpZ25lZCBpbnQgaSwgajsKKwlib29sZWFuX3QgY2xlYW5lZCA9IEZBTFNFOworCisJaSA9IHJ4X3JpbmctPm5leHRfdG9fY2xlYW47CisJcnhfZGVzYyA9IElYR0JfUlhfREVTQygqcnhfcmluZywgaSk7CisJYnVmZmVyX2luZm8gPSAmcnhfcmluZy0+YnVmZmVyX2luZm9baV07CisKKwl3aGlsZShyeF9kZXNjLT5zdGF0dXMgJiBJWEdCX1JYX0RFU0NfU1RBVFVTX0REKSB7CisKKyNpZmRlZiBDT05GSUdfSVhHQl9OQVBJCisJCWlmKCp3b3JrX2RvbmUgPj0gd29ya190b19kbykKKwkJCWJyZWFrOworCisJCSgqd29ya19kb25lKSsrOworI2VuZGlmCisJCXNrYiA9IGJ1ZmZlcl9pbmZvLT5za2I7CisJCXByZWZldGNoKHNrYi0+ZGF0YSk7CisKKwkJaWYoKytpID09IHJ4X3JpbmctPmNvdW50KSBpID0gMDsKKwkJbmV4dF9yeGQgPSBJWEdCX1JYX0RFU0MoKnJ4X3JpbmcsIGkpOworCQlwcmVmZXRjaChuZXh0X3J4ZCk7CisKKwkJaWYoKGogPSBpICsgMSkgPT0gcnhfcmluZy0+Y291bnQpIGogPSAwOworCQluZXh0Ml9idWZmZXIgPSAmcnhfcmluZy0+YnVmZmVyX2luZm9bal07CisJCXByZWZldGNoKG5leHQyX2J1ZmZlcik7CisKKwkJbmV4dF9idWZmZXIgPSAmcnhfcmluZy0+YnVmZmVyX2luZm9baV07CisJCW5leHRfc2tiID0gbmV4dF9idWZmZXItPnNrYjsKKwkJcHJlZmV0Y2gobmV4dF9za2IpOworCisKKwkJY2xlYW5lZCA9IFRSVUU7CisKKwkJcGNpX3VubWFwX3NpbmdsZShwZGV2LAorCQkJCSBidWZmZXJfaW5mby0+ZG1hLAorCQkJCSBidWZmZXJfaW5mby0+bGVuZ3RoLAorCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCWxlbmd0aCA9IGxlMTZfdG9fY3B1KHJ4X2Rlc2MtPmxlbmd0aCk7CisKKwkJaWYodW5saWtlbHkoIShyeF9kZXNjLT5zdGF0dXMgJiBJWEdCX1JYX0RFU0NfU1RBVFVTX0VPUCkpKSB7CisKKwkJCS8qIEFsbCByZWNlaXZlcyBtdXN0IGZpdCBpbnRvIGEgc2luZ2xlIGJ1ZmZlciAqLworCisJCQlJWEdCX0RCRygiUmVjZWl2ZSBwYWNrZXQgY29uc3VtZWQgbXVsdGlwbGUgYnVmZmVycyAiCisJCQkJCSAibGVuZ3RoPCV4PlxuIiwgbGVuZ3RoKTsKKworCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCXJ4X2Rlc2MtPnN0YXR1cyA9IDA7CisJCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKKworCQkJcnhfZGVzYyA9IG5leHRfcnhkOworCQkJYnVmZmVyX2luZm8gPSBuZXh0X2J1ZmZlcjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHVubGlrZWx5KHJ4X2Rlc2MtPmVycm9ycworCQkJICAgICAmIChJWEdCX1JYX0RFU0NfRVJST1JTX0NFIHwgSVhHQl9SWF9ERVNDX0VSUk9SU19TRQorCQkJCXwgSVhHQl9SWF9ERVNDX0VSUk9SU19QIHwKKwkJCQlJWEdCX1JYX0RFU0NfRVJST1JTX1JYRSkpKSB7CisKKwkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQlyeF9kZXNjLT5zdGF0dXMgPSAwOworCQkJYnVmZmVyX2luZm8tPnNrYiA9IE5VTEw7CisKKwkJCXJ4X2Rlc2MgPSBuZXh0X3J4ZDsKKwkJCWJ1ZmZlcl9pbmZvID0gbmV4dF9idWZmZXI7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEdvb2QgUmVjZWl2ZSAqLworCQlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKKworCQkvKiBSZWNlaXZlIENoZWNrc3VtIE9mZmxvYWQgKi8KKwkJaXhnYl9yeF9jaGVja3N1bShhZGFwdGVyLCByeF9kZXNjLCBza2IpOworCisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5ldGRldik7CisjaWZkZWYgQ09ORklHX0lYR0JfTkFQSQorCQlpZihhZGFwdGVyLT52bGdycCAmJiAocnhfZGVzYy0+c3RhdHVzICYgSVhHQl9SWF9ERVNDX1NUQVRVU19WUCkpIHsKKwkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIGFkYXB0ZXItPnZsZ3JwLAorCQkJCWxlMTZfdG9fY3B1KHJ4X2Rlc2MtPnNwZWNpYWwpICYKKwkJCQkJSVhHQl9SWF9ERVNDX1NQRUNJQUxfVkxBTl9NQVNLKTsKKwkJfSBlbHNlIHsKKwkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisJCX0KKyNlbHNlIC8qIENPTkZJR19JWEdCX05BUEkgKi8KKwkJaWYoYWRhcHRlci0+dmxncnAgJiYgKHJ4X2Rlc2MtPnN0YXR1cyAmIElYR0JfUlhfREVTQ19TVEFUVVNfVlApKSB7CisJCQl2bGFuX2h3YWNjZWxfcngoc2tiLCBhZGFwdGVyLT52bGdycCwKKwkJCQlsZTE2X3RvX2NwdShyeF9kZXNjLT5zcGVjaWFsKSAmCisJCQkJCUlYR0JfUlhfREVTQ19TUEVDSUFMX1ZMQU5fTUFTSyk7CisJCX0gZWxzZSB7CisJCQluZXRpZl9yeChza2IpOworCQl9CisjZW5kaWYgLyogQ09ORklHX0lYR0JfTkFQSSAqLworCQluZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCisJCXJ4X2Rlc2MtPnN0YXR1cyA9IDA7CisJCWJ1ZmZlcl9pbmZvLT5za2IgPSBOVUxMOworCisJCXJ4X2Rlc2MgPSBuZXh0X3J4ZDsKKwkJYnVmZmVyX2luZm8gPSBuZXh0X2J1ZmZlcjsKKwl9CisKKwlyeF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gaTsKKworCWl4Z2JfYWxsb2NfcnhfYnVmZmVycyhhZGFwdGVyKTsKKworCXJldHVybiBjbGVhbmVkOworfQorCisvKioKKyAqIGl4Z2JfYWxsb2NfcnhfYnVmZmVycyAtIFJlcGxhY2UgdXNlZCByZWNlaXZlIGJ1ZmZlcnMKKyAqIEBhZGFwdGVyOiBhZGRyZXNzIG9mIGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiovCisKK3N0YXRpYyB2b2lkCitpeGdiX2FsbG9jX3J4X2J1ZmZlcnMoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgaXhnYl9kZXNjX3JpbmcgKnJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKwlzdHJ1Y3QgaXhnYl9yeF9kZXNjICpyeF9kZXNjOworCXN0cnVjdCBpeGdiX2J1ZmZlciAqYnVmZmVyX2luZm87CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgbnVtX2dyb3VwX3RhaWxfd3JpdGVzOworCWxvbmcgY2xlYW5jb3VudDsKKworCWkgPSByeF9yaW5nLT5uZXh0X3RvX3VzZTsKKwlidWZmZXJfaW5mbyA9ICZyeF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKwljbGVhbmNvdW50ID0gSVhHQl9ERVNDX1VOVVNFRChyeF9yaW5nKTsKKworCW51bV9ncm91cF90YWlsX3dyaXRlcyA9IElYR0JfUlhfQlVGRkVSX1dSSVRFOworCisJLyogbGVhdmUgb25lIGRlc2NyaXB0b3IgdW51c2VkICovCisJd2hpbGUoLS1jbGVhbmNvdW50ID4gMCkgeworCQlyeF9kZXNjID0gSVhHQl9SWF9ERVNDKCpyeF9yaW5nLCBpKTsKKworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gKyBORVRfSVBfQUxJR04pOworCisJCWlmKHVubGlrZWx5KCFza2IpKSB7CisJCQkvKiBCZXR0ZXIgbHVjayBuZXh0IHJvdW5kICovCisJCQlicmVhazsKKwkJfQorCisJCS8qIE1ha2UgYnVmZmVyIGFsaWdubWVudCAyIGJleW9uZCBhIDE2IGJ5dGUgYm91bmRhcnkKKwkJICogdGhpcyB3aWxsIHJlc3VsdCBpbiBhIDE2IGJ5dGUgYWxpZ25lZCBJUCBoZWFkZXIgYWZ0ZXIKKwkJICogdGhlIDE0IGJ5dGUgTUFDIGhlYWRlciBpcyByZW1vdmVkCisJCSAqLworCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CisKKwkJc2tiLT5kZXYgPSBuZXRkZXY7CisKKwkJYnVmZmVyX2luZm8tPnNrYiA9IHNrYjsKKwkJYnVmZmVyX2luZm8tPmxlbmd0aCA9IGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW47CisJCWJ1ZmZlcl9pbmZvLT5kbWEgPQorCQkJcGNpX21hcF9zaW5nbGUocGRldiwKKwkJCQkgICBza2ItPmRhdGEsCisJCQkJICAgYWRhcHRlci0+cnhfYnVmZmVyX2xlbiwKKwkJCQkgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCXJ4X2Rlc2MtPmJ1ZmZfYWRkciA9IGNwdV90b19sZTY0KGJ1ZmZlcl9pbmZvLT5kbWEpOworCisJCWlmKChpICYgfihudW1fZ3JvdXBfdGFpbF93cml0ZXMtIDEpKSA9PSBpKSB7CisJCQkvKiBGb3JjZSBtZW1vcnkgd3JpdGVzIHRvIGNvbXBsZXRlIGJlZm9yZSBsZXR0aW5nIGgvdworCQkJICoga25vdyB0aGVyZSBhcmUgbmV3IGRlc2NyaXB0b3JzIHRvIGZldGNoLiAgKE9ubHkKKwkJCSAqIGFwcGxpY2FibGUgZm9yIHdlYWstb3JkZXJlZCBtZW1vcnkgbW9kZWwgYXJjaHMsCisJCQkgKiBzdWNoIGFzIElBLTY0KS4gKi8KKwkJCXdtYigpOworCisJCQlJWEdCX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJEVCwgaSk7CisJCX0KKworCQlpZigrK2kgPT0gcnhfcmluZy0+Y291bnQpIGkgPSAwOworCQlidWZmZXJfaW5mbyA9ICZyeF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKKwl9CisKKwlyeF9yaW5nLT5uZXh0X3RvX3VzZSA9IGk7Cit9CisKKy8qKgorICogaXhnYl92bGFuX3J4X3JlZ2lzdGVyIC0gZW5hYmxlcyBvciBkaXNhYmxlcyB2bGFuIHRhZ2dpbmcvc3RyaXBwaW5nLgorICogCisgKiBAcGFyYW0gbmV0ZGV2IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBncnAgaW5kaWNhdGVzIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRhZ2dpbmcvc3RyaXBwaW5nCisgKiovCitzdGF0aWMgdm9pZAoraXhnYl92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwl1aW50MzJfdCBjdHJsLCByY3RsOworCisJaXhnYl9pcnFfZGlzYWJsZShhZGFwdGVyKTsKKwlhZGFwdGVyLT52bGdycCA9IGdycDsKKworCWlmKGdycCkgeworCQkvKiBlbmFibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCisJCWN0cmwgPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgQ1RSTDApOworCQljdHJsIHw9IElYR0JfQ1RSTDBfVk1FOworCQlJWEdCX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIENUUkwwLCBjdHJsKTsKKworCQkvKiBlbmFibGUgVkxBTiByZWNlaXZlIGZpbHRlcmluZyAqLworCisJCXJjdGwgPSBJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUkNUTCk7CisJCXJjdGwgfD0gSVhHQl9SQ1RMX1ZGRTsKKwkJcmN0bCAmPSB+SVhHQl9SQ1RMX0NGSUVOOworCQlJWEdCX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFJDVEwsIHJjdGwpOworCX0gZWxzZSB7CisJCS8qIGRpc2FibGUgVkxBTiB0YWcgaW5zZXJ0L3N0cmlwICovCisKKwkJY3RybCA9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMMCk7CisJCWN0cmwgJj0gfklYR0JfQ1RSTDBfVk1FOworCQlJWEdCX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIENUUkwwLCBjdHJsKTsKKworCQkvKiBkaXNhYmxlIFZMQU4gZmlsdGVyaW5nICovCisKKwkJcmN0bCA9IElYR0JfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMKTsKKwkJcmN0bCAmPSB+SVhHQl9SQ1RMX1ZGRTsKKwkJSVhHQl9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSQ1RMLCByY3RsKTsKKwl9CisKKwlpeGdiX2lycV9lbmFibGUoYWRhcHRlcik7Cit9CisKK3N0YXRpYyB2b2lkCitpeGdiX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MTZfdCB2aWQpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwl1aW50MzJfdCB2ZnRhLCBpbmRleDsKKworCS8qIGFkZCBWSUQgdG8gZmlsdGVyIHRhYmxlICovCisKKwlpbmRleCA9ICh2aWQgPj4gNSkgJiAweDdGOworCXZmdGEgPSBJWEdCX1JFQURfUkVHX0FSUkFZKCZhZGFwdGVyLT5odywgVkZUQSwgaW5kZXgpOworCXZmdGEgfD0gKDEgPDwgKHZpZCAmIDB4MUYpKTsKKwlpeGdiX3dyaXRlX3ZmdGEoJmFkYXB0ZXItPmh3LCBpbmRleCwgdmZ0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitpeGdiX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDE2X3QgdmlkKQoreworCXN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJdWludDMyX3QgdmZ0YSwgaW5kZXg7CisKKwlpeGdiX2lycV9kaXNhYmxlKGFkYXB0ZXIpOworCisJaWYoYWRhcHRlci0+dmxncnApCisJCWFkYXB0ZXItPnZsZ3JwLT52bGFuX2RldmljZXNbdmlkXSA9IE5VTEw7CisKKwlpeGdiX2lycV9lbmFibGUoYWRhcHRlcik7CisKKwkvKiByZW1vdmUgVklEIGZyb20gZmlsdGVyIHRhYmxlKi8KKworCWluZGV4ID0gKHZpZCA+PiA1KSAmIDB4N0Y7CisJdmZ0YSA9IElYR0JfUkVBRF9SRUdfQVJSQVkoJmFkYXB0ZXItPmh3LCBWRlRBLCBpbmRleCk7CisJdmZ0YSAmPSB+KDEgPDwgKHZpZCAmIDB4MUYpKTsKKwlpeGdiX3dyaXRlX3ZmdGEoJmFkYXB0ZXItPmh3LCBpbmRleCwgdmZ0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitpeGdiX3Jlc3RvcmVfdmxhbihzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyKQoreworCWl4Z2Jfdmxhbl9yeF9yZWdpc3RlcihhZGFwdGVyLT5uZXRkZXYsIGFkYXB0ZXItPnZsZ3JwKTsKKworCWlmKGFkYXB0ZXItPnZsZ3JwKSB7CisJCXVpbnQxNl90IHZpZDsKKwkJZm9yKHZpZCA9IDA7IHZpZCA8IFZMQU5fR1JPVVBfQVJSQVlfTEVOOyB2aWQrKykgeworCQkJaWYoIWFkYXB0ZXItPnZsZ3JwLT52bGFuX2RldmljZXNbdmlkXSkKKwkJCQljb250aW51ZTsKKwkJCWl4Z2Jfdmxhbl9yeF9hZGRfdmlkKGFkYXB0ZXItPm5ldGRldiwgdmlkKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBpeGdiX25vdGlmeV9yZWJvb3QgLSBoYW5kbGVzIE9TIG5vdGlmaWNhdGlvbiBvZiByZWJvb3QgZXZlbnQuCisgKiBAcGFyYW0gbmIgbm90aWZpZXIgYmxvY2ssIHVudXNlZAorICogQHBhcmFtIGV2ZW50IEV2ZW50IGJlaW5nIHBhc3NlZCB0byBkcml2ZXIgdG8gYWN0IHVwb24KKyAqIEBwYXJhbSBwIEEgcG9pbnRlciB0byBvdXIgbmV0IGRldmljZQorICoqLworc3RhdGljIGludAoraXhnYl9ub3RpZnlfcmVib290KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnApCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCisJc3dpdGNoKGV2ZW50KSB7CisJY2FzZSBTWVNfRE9XTjoKKwljYXNlIFNZU19IQUxUOgorCWNhc2UgU1lTX1BPV0VSX09GRjoKKwkJd2hpbGUgKChwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBkZXYpKSkgeworCQkJaWYgKHBjaV9kZXZfZHJpdmVyKHBkZXYpID09ICZpeGdiX2RyaXZlcikKKwkJCQlpeGdiX3N1c3BlbmQocGRldiwgMyk7CisJCX0KKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCisvKioKKyAqIGl4Z2Jfc3VzcGVuZCAtIGRyaXZlciBzdXNwZW5kIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIG5vdGlmeS4KKyAqIEBwYXJhbSBwZGV2IHBjaSBkcml2ZXIgc3RydWN0dXJlIHVzZWQgZm9yIHBhc3NpbmcgdG8KKyAqIEBwYXJhbSBzdGF0ZSBwb3dlciBzdGF0ZSB0byBlbnRlciAKKyAqKi8KK3N0YXRpYyBpbnQKK2l4Z2Jfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdWludDMyX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCisJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOworCisJaWYobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQlpeGdiX2Rvd24oYWRhcHRlciwgVFJVRSk7CisKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKworCXN0YXRlID0gKHN0YXRlID4gMCkgPyAzIDogMDsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHN0YXRlKTsKKwltc2VjX2RlbGF5KDIwMCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisvKgorICogUG9sbGluZyAnaW50ZXJydXB0JyAtIHVzZWQgYnkgdGhpbmdzIGxpa2UgbmV0Y29uc29sZSB0byBzZW5kIHNrYnMKKyAqIHdpdGhvdXQgaGF2aW5nIHRvIHJlLWVuYWJsZSBpbnRlcnJ1cHRzLiBJdCdzIG5vdCBjYWxsZWQgd2hpbGUKKyAqIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBpcyBleGVjdXRpbmcuCisgKi8KKworc3RhdGljIHZvaWQgaXhnYl9uZXRwb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKwlkaXNhYmxlX2lycShhZGFwdGVyLT5wZGV2LT5pcnEpOworCWl4Z2JfaW50cihhZGFwdGVyLT5wZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJZW5hYmxlX2lycShhZGFwdGVyLT5wZGV2LT5pcnEpOworfQorI2VuZGlmCisKKy8qIGl4Z2JfbWFpbi5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiL2l4Z2Jfb3NkZXAuaCBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9vc2RlcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYmE5MjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2Jfb3NkZXAuaApAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIAorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIAorICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCAKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgCisgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgCisgIGFueSBsYXRlciB2ZXJzaW9uLgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgCisgIG1vcmUgZGV0YWlscy4KKyAgCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IAorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAgCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICAKKyAgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAgTGludXggTklDUyA8bGludXgubmljc0BpbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZ2x1ZSBmb3IgdGhlIE9TIGluZGVwZW5kZW50IHBhcnQgb2YgaXhnYgorICogaW5jbHVkZXMgcmVnaXN0ZXIgYWNjZXNzIG1hY3JvcworICovCisKKyNpZm5kZWYgX0lYR0JfT1NERVBfSF8KKyNkZWZpbmUgX0lYR0JfT1NERVBfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaWZuZGVmIG1zZWNfZGVsYXkKKyNkZWZpbmUgbXNlY19kZWxheSh4KQlkbyB7IGlmKGluX2ludGVycnVwdCgpKSB7IFwKKwkJCQkvKiBEb24ndCBtZGVsYXkgaW4gaW50ZXJydXB0IGNvbnRleHQhICovIFwKKwkgICAgICAgICAgICAgICAgCUJVRygpOyBcCisJCQl9IGVsc2UgeyBcCisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOyBcCisJCQkJc2NoZWR1bGVfdGltZW91dCgoeCAqIEhaKS8xMDAwICsgMik7IFwKKwkJCX0gfSB3aGlsZSgwKQorI2VuZGlmCisKKyNkZWZpbmUgUENJX0NPTU1BTkRfUkVHSVNURVIgICBQQ0lfQ09NTUFORAorI2RlZmluZSBDTURfTUVNX1dSVF9JTlZBTElEQVRFIFBDSV9DT01NQU5EX0lOVkFMSURBVEUKKwordHlwZWRlZiBlbnVtIHsKKyN1bmRlZiBGQUxTRQorCUZBTFNFID0gMCwKKyN1bmRlZiBUUlVFCisJVFJVRSA9IDEKK30gYm9vbGVhbl90OworCisjdW5kZWYgQVNTRVJUCisjZGVmaW5lIEFTU0VSVCh4KQlpZighKHgpKSBCVUcoKQorI2RlZmluZSBNU0dPVVQoUywgQSwgQikJcHJpbnRrKEtFUk5fREVCVUcgUyAiXG4iLCBBLCBCKQorCisjaWZkZWYgREJHCisjZGVmaW5lIERFQlVHT1VUKFMpCQlwcmludGsoS0VSTl9ERUJVRyBTICJcbiIpCisjZGVmaW5lIERFQlVHT1VUMShTLCBBLi4uKQlwcmludGsoS0VSTl9ERUJVRyBTICJcbiIsIEEpCisjZWxzZQorI2RlZmluZSBERUJVR09VVChTKQorI2RlZmluZSBERUJVR09VVDEoUywgQS4uLikKKyNlbmRpZgorCisjZGVmaW5lIERFQlVHRlVOQyhGKSBERUJVR09VVChGKQorI2RlZmluZSBERUJVR09VVDIgREVCVUdPVVQxCisjZGVmaW5lIERFQlVHT1VUMyBERUJVR09VVDIKKyNkZWZpbmUgREVCVUdPVVQ3IERFQlVHT1VUMworCisjZGVmaW5lIElYR0JfV1JJVEVfUkVHKGEsIHJlZywgdmFsdWUpICggXAorCXdyaXRlbCgodmFsdWUpLCAoKGEpLT5od19hZGRyICsgSVhHQl8jI3JlZykpKQorCisjZGVmaW5lIElYR0JfUkVBRF9SRUcoYSwgcmVnKSAoIFwKKwlyZWFkbCgoYSktPmh3X2FkZHIgKyBJWEdCXyMjcmVnKSkKKworI2RlZmluZSBJWEdCX1dSSVRFX1JFR19BUlJBWShhLCByZWcsIG9mZnNldCwgdmFsdWUpICggXAorCXdyaXRlbCgodmFsdWUpLCAoKGEpLT5od19hZGRyICsgSVhHQl8jI3JlZyArICgob2Zmc2V0KSA8PCAyKSkpKQorCisjZGVmaW5lIElYR0JfUkVBRF9SRUdfQVJSQVkoYSwgcmVnLCBvZmZzZXQpICggXAorCXJlYWRsKChhKS0+aHdfYWRkciArIElYR0JfIyNyZWcgKyAoKG9mZnNldCkgPDwgMikpKQorCisjZGVmaW5lIElYR0JfV1JJVEVfRkxVU0goYSkgSVhHQl9SRUFEX1JFRyhhLCBTVEFUVVMpCisKKyNkZWZpbmUgSVhHQl9NRU1DUFkgbWVtY3B5CisKKyNlbmRpZiAvKiBfSVhHQl9PU0RFUF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYi9peGdiX3BhcmFtLmMgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2JfcGFyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTgzZGZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX3BhcmFtLmMKQEAgLTAsMCArMSw0NzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IAorICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSAKKyAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSAKKyAgYW55IGxhdGVyIHZlcnNpb24uCisgIAorICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciAKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciAKKyAgbW9yZSBkZXRhaWxzLgorICAKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgCisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICAKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgIAorICBDb250YWN0IEluZm9ybWF0aW9uOgorICBMaW51eCBOSUNTIDxsaW51eC5uaWNzQGludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiaXhnYi5oIgorCisvKiBUaGlzIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgY2hhbmdlZCB0byBhZGp1c3QgdGhlCisgKiBtYXhpbXVtIG51bWJlciBvZiBwb3J0cyB0aGF0IHRoZSBkcml2ZXIgY2FuIG1hbmFnZS4KKyAqLworCisjZGVmaW5lIElYR0JfTUFYX05JQyA4CisKKyNkZWZpbmUgT1BUSU9OX1VOU0VUCS0xCisjZGVmaW5lIE9QVElPTl9ESVNBQkxFRCAwCisjZGVmaW5lIE9QVElPTl9FTkFCTEVEICAxCisKKy8qIEFsbCBwYXJhbWV0ZXJzIGFyZSB0cmVhdGVkIHRoZSBzYW1lLCBhcyBhbiBpbnRlZ2VyIGFycmF5IG9mIHZhbHVlcy4KKyAqIFRoaXMgbWFjcm8ganVzdCByZWR1Y2VzIHRoZSBuZWVkIHRvIHJlcGVhdCB0aGUgc2FtZSBkZWNsYXJhdGlvbiBjb2RlCisgKiBvdmVyIGFuZCBvdmVyIChwbHVzIHRoaXMgaGVscHMgdG8gYXZvaWQgdHlwbyBidWdzKS4KKyAqLworCisjZGVmaW5lIElYR0JfUEFSQU1fSU5JVCB7IFswIC4uLiBJWEdCX01BWF9OSUNdID0gT1BUSU9OX1VOU0VUIH0KKyNkZWZpbmUgSVhHQl9QQVJBTShYLCBkZXNjKSBcCisJc3RhdGljIGludCBfX2RldmluaXRkYXRhIFhbSVhHQl9NQVhfTklDKzFdID0gSVhHQl9QQVJBTV9JTklUOyBcCisJc3RhdGljIGludCBudW1fIyNYID0gMDsgXAorCW1vZHVsZV9wYXJhbV9hcnJheV9uYW1lZChYLCBYLCBpbnQsICZudW1fIyNYLCAwKTsgXAorCU1PRFVMRV9QQVJNX0RFU0MoWCwgZGVzYyk7CisKKy8qIFRyYW5zbWl0IERlc2NyaXB0b3IgQ291bnQKKyAqCisgKiBWYWxpZCBSYW5nZTogNjQtNDA5NgorICoKKyAqIERlZmF1bHQgVmFsdWU6IDI1NgorICovCisKK0lYR0JfUEFSQU0oVHhEZXNjcmlwdG9ycywgIk51bWJlciBvZiB0cmFuc21pdCBkZXNjcmlwdG9ycyIpOworCisvKiBSZWNlaXZlIERlc2NyaXB0b3IgQ291bnQKKyAqCisgKiBWYWxpZCBSYW5nZTogNjQtNDA5NgorICoKKyAqIERlZmF1bHQgVmFsdWU6IDEwMjQKKyAqLworCitJWEdCX1BBUkFNKFJ4RGVzY3JpcHRvcnMsICJOdW1iZXIgb2YgcmVjZWl2ZSBkZXNjcmlwdG9ycyIpOworCisvKiBVc2VyIFNwZWNpZmllZCBGbG93IENvbnRyb2wgT3ZlcnJpZGUKKyAqCisgKiBWYWxpZCBSYW5nZTogMC0zCisgKiAgLSAwIC0gTm8gRmxvdyBDb250cm9sCisgKiAgLSAxIC0gUnggb25seSwgcmVzcG9uZCB0byBQQVVTRSBmcmFtZXMgYnV0IGRvIG5vdCBnZW5lcmF0ZSB0aGVtCisgKiAgLSAyIC0gVHggb25seSwgZ2VuZXJhdGUgUEFVU0UgZnJhbWVzIGJ1dCBpZ25vcmUgdGhlbSBvbiByZWNlaXZlCisgKiAgLSAzIC0gRnVsbCBGbG93IENvbnRyb2wgU3VwcG9ydAorICoKKyAqIERlZmF1bHQgVmFsdWU6IFJlYWQgZmxvdyBjb250cm9sIHNldHRpbmdzIGZyb20gdGhlIEVFUFJPTQorICovCisKK0lYR0JfUEFSQU0oRmxvd0NvbnRyb2wsICJGbG93IENvbnRyb2wgc2V0dGluZyIpOworCisvKiBYc3VtUlggLSBSZWNlaXZlIENoZWNrc3VtIE9mZmxvYWQgRW5hYmxlL0Rpc2FibGUKKyAqCisgKiBWYWxpZCBSYW5nZTogMCwgMQorICogIC0gMCAtIGRpc2FibGVzIGFsbCBjaGVja3N1bSBvZmZsb2FkCisgKiAgLSAxIC0gZW5hYmxlcyByZWNlaXZlIElQL1RDUC9VRFAgY2hlY2tzdW0gb2ZmbG9hZAorICogICAgICAgIG9uIDgyNTk3IGJhc2VkIE5JQ3MKKyAqCisgKiBEZWZhdWx0IFZhbHVlOiAxCisgKi8KKworSVhHQl9QQVJBTShYc3VtUlgsICJEaXNhYmxlIG9yIGVuYWJsZSBSZWNlaXZlIENoZWNrc3VtIG9mZmxvYWQiKTsKKworLyogVHJhbnNtaXQgSW50ZXJydXB0IERlbGF5IGluIHVuaXRzIG9mIDAuODE5MiBtaWNyb3NlY29uZHMKKyAqCisgKiBWYWxpZCBSYW5nZTogMC02NTUzNQorICoKKyAqIERlZmF1bHQgVmFsdWU6IDMyCisgKi8KKworSVhHQl9QQVJBTShUeEludERlbGF5LCAiVHJhbnNtaXQgSW50ZXJydXB0IERlbGF5Iik7CisKKy8qIFJlY2VpdmUgSW50ZXJydXB0IERlbGF5IGluIHVuaXRzIG9mIDAuODE5MiBtaWNyb3NlY29uZHMKKyAqCisgKiBWYWxpZCBSYW5nZTogMC02NTUzNQorICoKKyAqIERlZmF1bHQgVmFsdWU6IDcyCisgKi8KKworSVhHQl9QQVJBTShSeEludERlbGF5LCAiUmVjZWl2ZSBJbnRlcnJ1cHQgRGVsYXkiKTsKKworLyogUmVjZWl2ZSBGbG93IGNvbnRyb2wgaGlnaCB0aHJlc2hvbGQgKHdoZW4gd2Ugc2VuZCBhIHBhdXNlIGZyYW1lKQorICogKEZDUlRIKQorICoKKyAqIFZhbGlkIFJhbmdlOiAxLDUzNiAtIDI2MiwxMzYgKDB4NjAwIC0gMHgzRkZGOCwgOCBieXRlIGdyYW51bGFyaXR5KQorICoKKyAqIERlZmF1bHQgVmFsdWU6IDE5Niw2MDggKDB4MzAwMDApCisgKi8KKworSVhHQl9QQVJBTShSeEZDSGlnaFRocmVzaCwgIlJlY2VpdmUgRmxvdyBDb250cm9sIEhpZ2ggVGhyZXNob2xkIik7CisKKy8qIFJlY2VpdmUgRmxvdyBjb250cm9sIGxvdyB0aHJlc2hvbGQgKHdoZW4gd2Ugc2VuZCBhIHJlc3VtZSBmcmFtZSkKKyAqIChGQ1JUTCkKKyAqCisgKiBWYWxpZCBSYW5nZTogNjQgLSAyNjIsMTM2ICgweDQwIC0gMHgzRkZGOCwgOCBieXRlIGdyYW51bGFyaXR5KQorICogICAgICAgICAgICAgIG11c3QgYmUgbGVzcyB0aGFuIGhpZ2ggdGhyZXNob2xkIGJ5IGF0IGxlYXN0IDggYnl0ZXMKKyAqCisgKiBEZWZhdWx0IFZhbHVlOiAgMTYzLDg0MCAoMHgyODAwMCkKKyAqLworCitJWEdCX1BBUkFNKFJ4RkNMb3dUaHJlc2gsICJSZWNlaXZlIEZsb3cgQ29udHJvbCBMb3cgVGhyZXNob2xkIik7CisKKy8qIEZsb3cgY29udHJvbCByZXF1ZXN0IHRpbWVvdXQgKGhvdyBsb25nIHRvIHBhdXNlIHRoZSBsaW5rIHBhcnRuZXIncyB0eCkKKyAqIChQQVAgMTU6MCkKKyAqCisgKiBWYWxpZCBSYW5nZTogMSAtIDY1NTM1IAorICoKKyAqIERlZmF1bHQgVmFsdWU6ICAyNTYgKDB4MTAwKQorICovCisKK0lYR0JfUEFSQU0oRkNSZXFUaW1lb3V0LCAiRmxvdyBDb250cm9sIFJlcXVlc3QgVGltZW91dCIpOworCisvKiBJbnRlcnJ1cHQgRGVsYXkgRW5hYmxlCisgKgorICogVmFsaWQgUmFuZ2U6IDAsIDEKKyAqCisgKiAgLSAwIC0gZGlzYWJsZXMgdHJhbnNtaXQgaW50ZXJydXB0IGRlbGF5CisgKiAgLSAxIC0gZW5hYmxlcyB0cmFuc21taXQgaW50ZXJydXB0IGRlbGF5CisgKgorICogRGVmYXVsdCBWYWx1ZTogMQorICovCisKK0lYR0JfUEFSQU0oSW50RGVsYXlFbmFibGUsICJUcmFuc21pdCBJbnRlcnJ1cHQgRGVsYXkgRW5hYmxlIik7CisKKworI2RlZmluZSBERUZBVUxUX1RJRFYJICAgCQkgICAgIDMyCisjZGVmaW5lIE1BWF9USURWCQkJIDB4RkZGRgorI2RlZmluZSBNSU5fVElEVgkJCSAgICAgIDAKKworI2RlZmluZSBERUZBVUxUX1JEVFIJCSAgIAkgICAgIDcyCisjZGVmaW5lIE1BWF9SRFRSCQkJIDB4RkZGRgorI2RlZmluZSBNSU5fUkRUUgkJCSAgICAgIDAKKworI2RlZmluZSBYU1VNUlhfREVGQVVMVAkJIE9QVElPTl9FTkFCTEVECisKKyNkZWZpbmUgRkxPV19DT05UUk9MX0ZVTEwJICAgaXhnYl9mY19mdWxsCisjZGVmaW5lIEZMT1dfQ09OVFJPTF9ERUZBVUxUICBGTE9XX0NPTlRST0xfRlVMTAorI2RlZmluZSBERUZBVUxUX0ZDUlRMCSAgCQkweDI4MDAwCisjZGVmaW5lIERFRkFVTFRfRkNSVEgJCQkweDMwMDAwCisjZGVmaW5lIE1JTl9GQ1JUTAkJCSAgICAgIDAKKyNkZWZpbmUgTUFYX0ZDUlRMCQkJMHgzRkZFOAorI2RlZmluZSBNSU5fRkNSVEgJCQkgICAgICA4CisjZGVmaW5lIE1BWF9GQ1JUSAkJCTB4M0ZGRjAKKworI2RlZmluZSBERUZBVUxUX0ZDUEFVU0UJCSAgCTB4MTAwCS8qIHRoaXMgbWF5IGJlIHRvbyBsb25nICovCisjZGVmaW5lIE1JTl9GQ1BBVVNFCQkJICAgICAgMQorI2RlZmluZSBNQVhfRkNQQVVTRQkJCSAweGZmZmYKKworc3RydWN0IGl4Z2Jfb3B0aW9uIHsKKwllbnVtIHsgZW5hYmxlX29wdGlvbiwgcmFuZ2Vfb3B0aW9uLCBsaXN0X29wdGlvbiB9IHR5cGU7CisJY2hhciAqbmFtZTsKKwljaGFyICplcnI7CisJaW50IGRlZjsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CS8qIHJhbmdlX29wdGlvbiBpbmZvICovCisJCQlpbnQgbWluOworCQkJaW50IG1heDsKKwkJfSByOworCQlzdHJ1Y3QgewkvKiBsaXN0X29wdGlvbiBpbmZvICovCisJCQlpbnQgbnI7CisJCQlzdHJ1Y3QgaXhnYl9vcHRfbGlzdCB7CisJCQkJaW50IGk7CisJCQkJY2hhciAqc3RyOworCQkJfSAqcDsKKwkJfSBsOworCX0gYXJnOworfTsKKworc3RhdGljIGludCBfX2RldmluaXQKK2l4Z2JfdmFsaWRhdGVfb3B0aW9uKGludCAqdmFsdWUsIHN0cnVjdCBpeGdiX29wdGlvbiAqb3B0KQoreworCWlmKCp2YWx1ZSA9PSBPUFRJT05fVU5TRVQpIHsKKwkJKnZhbHVlID0gb3B0LT5kZWY7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAob3B0LT50eXBlKSB7CisJY2FzZSBlbmFibGVfb3B0aW9uOgorCQlzd2l0Y2ggKCp2YWx1ZSkgeworCQljYXNlIE9QVElPTl9FTkFCTEVEOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgRW5hYmxlZFxuIiwgb3B0LT5uYW1lKTsKKwkJCXJldHVybiAwOworCQljYXNlIE9QVElPTl9ESVNBQkxFRDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzIERpc2FibGVkXG4iLCBvcHQtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSByYW5nZV9vcHRpb246CisJCWlmKCp2YWx1ZSA+PSBvcHQtPmFyZy5yLm1pbiAmJiAqdmFsdWUgPD0gb3B0LT5hcmcuci5tYXgpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzIHNldCB0byAlaVxuIiwgb3B0LT5uYW1lLCAqdmFsdWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBsaXN0X29wdGlvbjogeworCQlpbnQgaTsKKwkJc3RydWN0IGl4Z2Jfb3B0X2xpc3QgKmVudDsKKworCQlmb3IoaSA9IDA7IGkgPCBvcHQtPmFyZy5sLm5yOyBpKyspIHsKKwkJCWVudCA9ICZvcHQtPmFyZy5sLnBbaV07CisJCQlpZigqdmFsdWUgPT0gZW50LT5pKSB7CisJCQkJaWYoZW50LT5zdHJbMF0gIT0gJ1wwJykKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIGVudC0+c3RyKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiSW52YWxpZCAlcyBzcGVjaWZpZWQgKCVpKSAlc1xuIiwKKwkJICAgb3B0LT5uYW1lLCAqdmFsdWUsIG9wdC0+ZXJyKTsKKwkqdmFsdWUgPSBvcHQtPmRlZjsKKwlyZXR1cm4gLTE7Cit9CisKKyNkZWZpbmUgTElTVF9MRU4obCkgKHNpemVvZihsKSAvIHNpemVvZihsWzBdKSkKKworLyoqCisgKiBpeGdiX2NoZWNrX29wdGlvbnMgLSBSYW5nZSBDaGVja2luZyBmb3IgQ29tbWFuZCBMaW5lIFBhcmFtZXRlcnMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgcm91dGluZSBjaGVja3MgYWxsIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGZvciB2YWxpZCB1c2VyCisgKiBpbnB1dC4gIElmIGFuIGludmFsaWQgdmFsdWUgaXMgZ2l2ZW4sIG9yIGlmIG5vIHVzZXIgc3BlY2lmaWVkCisgKiB2YWx1ZSBleGlzdHMsIGEgZGVmYXVsdCB2YWx1ZSBpcyB1c2VkLiAgVGhlIGZpbmFsIHZhbHVlIGlzIHN0b3JlZAorICogaW4gYSB2YXJpYWJsZSBpbiB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUuCisgKiovCisKK3ZvaWQgX19kZXZpbml0CitpeGdiX2NoZWNrX29wdGlvbnMoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgYmQgPSBhZGFwdGVyLT5iZF9udW1iZXI7CisJaWYoYmQgPj0gSVhHQl9NQVhfTklDKSB7CisJCXByaW50ayhLRVJOX05PVElDRQorCQkJICAgIldhcm5pbmc6IG5vIGNvbmZpZ3VyYXRpb24gZm9yIGJvYXJkICMlaVxuIiwgYmQpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgIlVzaW5nIGRlZmF1bHRzIGZvciBhbGwgdmFsdWVzXG4iKTsKKwl9CisKKwl7IC8qIFRyYW5zbWl0IERlc2NyaXB0b3IgQ291bnQgKi8KKwkJc3RydWN0IGl4Z2Jfb3B0aW9uIG9wdCA9IHsKKwkJCS50eXBlID0gcmFuZ2Vfb3B0aW9uLAorCQkJLm5hbWUgPSAiVHJhbnNtaXQgRGVzY3JpcHRvcnMiLAorCQkJLmVyciAgPSAidXNpbmcgZGVmYXVsdCBvZiAiIF9fTU9EVUxFX1NUUklORyhERUZBVUxUX1RYRCksCisJCQkuZGVmICA9IERFRkFVTFRfVFhELAorCQkJLmFyZyAgPSB7IC5yID0geyAubWluID0gTUlOX1RYRCwKKwkJCQkJIC5tYXggPSBNQVhfVFhEfX0KKwkJfTsKKwkJc3RydWN0IGl4Z2JfZGVzY19yaW5nICp0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3Jpbmc7CisKKwkJaWYobnVtX1R4RGVzY3JpcHRvcnMgPiBiZCkgeworCQkJdHhfcmluZy0+Y291bnQgPSBUeERlc2NyaXB0b3JzW2JkXTsKKwkJCWl4Z2JfdmFsaWRhdGVfb3B0aW9uKCZ0eF9yaW5nLT5jb3VudCwgJm9wdCk7CisJCX0gZWxzZSB7CisJCQl0eF9yaW5nLT5jb3VudCA9IG9wdC5kZWY7CisJCX0KKwkJSVhHQl9ST1VORFVQKHR4X3JpbmctPmNvdW50LCBJWEdCX1JFUV9UWF9ERVNDUklQVE9SX01VTFRJUExFKTsKKwl9CisJeyAvKiBSZWNlaXZlIERlc2NyaXB0b3IgQ291bnQgKi8KKwkJc3RydWN0IGl4Z2Jfb3B0aW9uIG9wdCA9IHsKKwkJCS50eXBlID0gcmFuZ2Vfb3B0aW9uLAorCQkJLm5hbWUgPSAiUmVjZWl2ZSBEZXNjcmlwdG9ycyIsCisJCQkuZXJyICA9ICJ1c2luZyBkZWZhdWx0IG9mICIgX19NT0RVTEVfU1RSSU5HKERFRkFVTFRfUlhEKSwKKwkJCS5kZWYgID0gREVGQVVMVF9SWEQsCisJCQkuYXJnICA9IHsgLnIgPSB7IC5taW4gPSBNSU5fUlhELAorCQkJCQkgLm1heCA9IE1BWF9SWER9fQorCQl9OworCQlzdHJ1Y3QgaXhnYl9kZXNjX3JpbmcgKnJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZzsKKworCQlpZihudW1fUnhEZXNjcmlwdG9ycyA+IGJkKSB7CisJCQlyeF9yaW5nLT5jb3VudCA9IFJ4RGVzY3JpcHRvcnNbYmRdOworCQkJaXhnYl92YWxpZGF0ZV9vcHRpb24oJnJ4X3JpbmctPmNvdW50LCAmb3B0KTsKKwkJfSBlbHNlIHsKKwkJCXJ4X3JpbmctPmNvdW50ID0gb3B0LmRlZjsKKwkJfQorCQlJWEdCX1JPVU5EVVAocnhfcmluZy0+Y291bnQsIElYR0JfUkVRX1JYX0RFU0NSSVBUT1JfTVVMVElQTEUpOworCX0KKwl7IC8qIFJlY2VpdmUgQ2hlY2tzdW0gT2ZmbG9hZCBFbmFibGUgKi8KKwkJc3RydWN0IGl4Z2Jfb3B0aW9uIG9wdCA9IHsKKwkJCS50eXBlID0gZW5hYmxlX29wdGlvbiwKKwkJCS5uYW1lID0gIlJlY2VpdmUgQ2hlY2tzdW0gT2ZmbG9hZCIsCisJCQkuZXJyICA9ICJkZWZhdWx0aW5nIHRvIEVuYWJsZWQiLAorCQkJLmRlZiAgPSBPUFRJT05fRU5BQkxFRAorCQl9OworCisJCWlmKG51bV9Yc3VtUlggPiBiZCkgeworCQkJaW50IHJ4X2NzdW0gPSBYc3VtUlhbYmRdOworCQkJaXhnYl92YWxpZGF0ZV9vcHRpb24oJnJ4X2NzdW0sICZvcHQpOworCQkJYWRhcHRlci0+cnhfY3N1bSA9IHJ4X2NzdW07CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5yeF9jc3VtID0gb3B0LmRlZjsKKwkJfQorCX0KKwl7IC8qIEZsb3cgQ29udHJvbCAqLworCisJCXN0cnVjdCBpeGdiX29wdF9saXN0IGZjX2xpc3RbXSA9CisJCQl7eyBpeGdiX2ZjX25vbmUsCSJGbG93IENvbnRyb2wgRGlzYWJsZWQiIH0sCisJCQkgeyBpeGdiX2ZjX3J4X3BhdXNlLCJGbG93IENvbnRyb2wgUmVjZWl2ZSBPbmx5IiB9LAorCQkJIHsgaXhnYl9mY190eF9wYXVzZSwiRmxvdyBDb250cm9sIFRyYW5zbWl0IE9ubHkiIH0sCisJCQkgeyBpeGdiX2ZjX2Z1bGwsCSJGbG93IENvbnRyb2wgRW5hYmxlZCIgfSwKKwkJCSB7IGl4Z2JfZmNfZGVmYXVsdCwgIkZsb3cgQ29udHJvbCBIYXJkd2FyZSBEZWZhdWx0IiB9fTsKKworCQlzdHJ1Y3QgaXhnYl9vcHRpb24gb3B0ID0geworCQkJLnR5cGUgPSBsaXN0X29wdGlvbiwKKwkJCS5uYW1lID0gIkZsb3cgQ29udHJvbCIsCisJCQkuZXJyICA9ICJyZWFkaW5nIGRlZmF1bHQgc2V0dGluZ3MgZnJvbSBFRVBST00iLAorCQkJLmRlZiAgPSBpeGdiX2ZjX2Z1bGwsCisJCQkuYXJnICA9IHsgLmwgPSB7IC5uciA9IExJU1RfTEVOKGZjX2xpc3QpLAorCQkJCQkgLnAgPSBmY19saXN0IH19CisJCX07CisKKwkJaWYobnVtX0Zsb3dDb250cm9sID4gYmQpIHsKKwkJCWludCBmYyA9IEZsb3dDb250cm9sW2JkXTsKKwkJCWl4Z2JfdmFsaWRhdGVfb3B0aW9uKCZmYywgJm9wdCk7CisJCQlhZGFwdGVyLT5ody5mYy50eXBlID0gZmM7CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5ody5mYy50eXBlID0gb3B0LmRlZjsKKwkJfQorCX0KKwl7IC8qIFJlY2VpdmUgRmxvdyBDb250cm9sIEhpZ2ggVGhyZXNob2xkICovCisJCXN0cnVjdCBpeGdiX29wdGlvbiBvcHQgPSB7CisJCQkudHlwZSA9IHJhbmdlX29wdGlvbiwKKwkJCS5uYW1lID0gIlJ4IEZsb3cgQ29udHJvbCBIaWdoIFRocmVzaG9sZCIsCisJCQkuZXJyICA9ICJ1c2luZyBkZWZhdWx0IG9mICIgX19NT0RVTEVfU1RSSU5HKERFRkFVTFRfRkNSVEgpLAorCQkJLmRlZiAgPSBERUZBVUxUX0ZDUlRILAorCQkJLmFyZyAgPSB7IC5yID0geyAubWluID0gTUlOX0ZDUlRILAorCQkJCQkgLm1heCA9IE1BWF9GQ1JUSH19CisJCX07CisKKwkJaWYobnVtX1J4RkNIaWdoVGhyZXNoID4gYmQpIHsKKwkJCWFkYXB0ZXItPmh3LmZjLmhpZ2hfd2F0ZXIgPSBSeEZDSGlnaFRocmVzaFtiZF07CisJCQlpeGdiX3ZhbGlkYXRlX29wdGlvbigmYWRhcHRlci0+aHcuZmMuaGlnaF93YXRlciwgJm9wdCk7CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5ody5mYy5oaWdoX3dhdGVyID0gb3B0LmRlZjsKKwkJfQorCQlpZighKGFkYXB0ZXItPmh3LmZjLnR5cGUgJiBpeGdiX2ZjX3J4X3BhdXNlKSApCisJCQlwcmludGsgKEtFUk5fSU5GTyAKKwkJCQkiSWdub3JpbmcgUnhGQ0hpZ2hUaHJlc2ggd2hlbiBubyBSeEZDXG4iKTsKKwl9CisJeyAvKiBSZWNlaXZlIEZsb3cgQ29udHJvbCBMb3cgVGhyZXNob2xkICovCisJCXN0cnVjdCBpeGdiX29wdGlvbiBvcHQgPSB7CisJCQkudHlwZSA9IHJhbmdlX29wdGlvbiwKKwkJCS5uYW1lID0gIlJ4IEZsb3cgQ29udHJvbCBMb3cgVGhyZXNob2xkIiwKKwkJCS5lcnIgID0gInVzaW5nIGRlZmF1bHQgb2YgIiBfX01PRFVMRV9TVFJJTkcoREVGQVVMVF9GQ1JUTCksCisJCQkuZGVmICA9IERFRkFVTFRfRkNSVEwsCisJCQkuYXJnICA9IHsgLnIgPSB7IC5taW4gPSBNSU5fRkNSVEwsCisJCQkJCSAubWF4ID0gTUFYX0ZDUlRMfX0KKwkJfTsKKworCQlpZihudW1fUnhGQ0xvd1RocmVzaCA+IGJkKSB7CisJCQlhZGFwdGVyLT5ody5mYy5sb3dfd2F0ZXIgPSBSeEZDTG93VGhyZXNoW2JkXTsKKwkJCWl4Z2JfdmFsaWRhdGVfb3B0aW9uKCZhZGFwdGVyLT5ody5mYy5sb3dfd2F0ZXIsICZvcHQpOworCQl9IGVsc2UgeworCQkJYWRhcHRlci0+aHcuZmMubG93X3dhdGVyID0gb3B0LmRlZjsKKwkJfQorCQlpZighKGFkYXB0ZXItPmh3LmZjLnR5cGUgJiBpeGdiX2ZjX3J4X3BhdXNlKSApCisJCQlwcmludGsgKEtFUk5fSU5GTyAKKwkJCQkiSWdub3JpbmcgUnhGQ0xvd1RocmVzaCB3aGVuIG5vIFJ4RkNcbiIpOworCX0KKwl7IC8qIEZsb3cgQ29udHJvbCBQYXVzZSBUaW1lIFJlcXVlc3QqLworCQlzdHJ1Y3QgaXhnYl9vcHRpb24gb3B0ID0geworCQkJLnR5cGUgPSByYW5nZV9vcHRpb24sCisJCQkubmFtZSA9ICJGbG93IENvbnRyb2wgUGF1c2UgVGltZSBSZXF1ZXN0IiwKKwkJCS5lcnIgID0gInVzaW5nIGRlZmF1bHQgb2YgIl9fTU9EVUxFX1NUUklORyhERUZBVUxUX0ZDUEFVU0UpLAorCQkJLmRlZiAgPSBERUZBVUxUX0ZDUEFVU0UsCisJCQkuYXJnID0geyAuciA9IHsgLm1pbiA9IE1JTl9GQ1BBVVNFLAorCQkJCQkubWF4ID0gTUFYX0ZDUEFVU0V9fQorCQl9OworCisJCWlmKG51bV9GQ1JlcVRpbWVvdXQgPiBiZCkgeworCQkJaW50IHBhdXNlX3RpbWUgPSBGQ1JlcVRpbWVvdXRbYmRdOworCQkJaXhnYl92YWxpZGF0ZV9vcHRpb24oJnBhdXNlX3RpbWUsICZvcHQpOworCQkJYWRhcHRlci0+aHcuZmMucGF1c2VfdGltZSA9IHBhdXNlX3RpbWU7CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyLT5ody5mYy5wYXVzZV90aW1lID0gb3B0LmRlZjsKKwkJfQorCQlpZighKGFkYXB0ZXItPmh3LmZjLnR5cGUgJiBpeGdiX2ZjX3J4X3BhdXNlKSApCisJCQlwcmludGsgKEtFUk5fSU5GTyAKKwkJCQkiSWdub3JpbmcgRkNSZXFUaW1lb3V0IHdoZW4gbm8gUnhGQ1xuIik7CisJfQorCS8qIGhpZ2ggbG93IGFuZCBzcGFjaW5nIGNoZWNrIGZvciByeCBmbG93IGNvbnRyb2wgdGhyZXNob2xkcyAqLworCWlmIChhZGFwdGVyLT5ody5mYy50eXBlICYgaXhnYl9mY19yeF9wYXVzZSkgeworCQkvKiBoaWdoIG11c3QgYmUgZ3JlYXRlciB0aGFuIGxvdyAqLworCQlpZiAoYWRhcHRlci0+aHcuZmMuaGlnaF93YXRlciA8IChhZGFwdGVyLT5ody5mYy5sb3dfd2F0ZXIgKyA4KSkgeworCQkJLyogc2V0IGRlZmF1bHRzICovCisJCQlwcmludGsgKEtFUk5fSU5GTyAKKwkJCQkiUnhGQ0hpZ2hUaHJlc2ggbXVzdCBiZSA+PSAoUnhGQ0xvd1RocmVzaCArIDgpLCAiCisJCQkJIlVzaW5nIERlZmF1bHRzXG4iKTsKKwkJCWFkYXB0ZXItPmh3LmZjLmhpZ2hfd2F0ZXIgPSBERUZBVUxUX0ZDUlRIOworCQkJYWRhcHRlci0+aHcuZmMubG93X3dhdGVyICA9IERFRkFVTFRfRkNSVEw7CisJCX0KKwl9CisJeyAvKiBSZWNlaXZlIEludGVycnVwdCBEZWxheSAqLworCQlzdHJ1Y3QgaXhnYl9vcHRpb24gb3B0ID0geworCQkJLnR5cGUgPSByYW5nZV9vcHRpb24sCisJCQkubmFtZSA9ICJSZWNlaXZlIEludGVycnVwdCBEZWxheSIsCisJCQkuZXJyICA9ICJ1c2luZyBkZWZhdWx0IG9mICIgX19NT0RVTEVfU1RSSU5HKERFRkFVTFRfUkRUUiksCisJCQkuZGVmICA9IERFRkFVTFRfUkRUUiwKKwkJCS5hcmcgID0geyAuciA9IHsgLm1pbiA9IE1JTl9SRFRSLAorCQkJCQkgLm1heCA9IE1BWF9SRFRSfX0KKwkJfTsKKworCQlpZihudW1fUnhJbnREZWxheSA+IGJkKSB7CisJCQlhZGFwdGVyLT5yeF9pbnRfZGVsYXkgPSBSeEludERlbGF5W2JkXTsKKwkJCWl4Z2JfdmFsaWRhdGVfb3B0aW9uKCZhZGFwdGVyLT5yeF9pbnRfZGVsYXksICZvcHQpOworCQl9IGVsc2UgeworCQkJYWRhcHRlci0+cnhfaW50X2RlbGF5ID0gb3B0LmRlZjsKKwkJfQorCX0KKwl7IC8qIFRyYW5zbWl0IEludGVycnVwdCBEZWxheSAqLworCQlzdHJ1Y3QgaXhnYl9vcHRpb24gb3B0ID0geworCQkJLnR5cGUgPSByYW5nZV9vcHRpb24sCisJCQkubmFtZSA9ICJUcmFuc21pdCBJbnRlcnJ1cHQgRGVsYXkiLAorCQkJLmVyciAgPSAidXNpbmcgZGVmYXVsdCBvZiAiIF9fTU9EVUxFX1NUUklORyhERUZBVUxUX1RJRFYpLAorCQkJLmRlZiAgPSBERUZBVUxUX1RJRFYsCisJCQkuYXJnICA9IHsgLnIgPSB7IC5taW4gPSBNSU5fVElEViwKKwkJCQkJIC5tYXggPSBNQVhfVElEVn19CisJCX07CisKKwkJaWYobnVtX1R4SW50RGVsYXkgPiBiZCkgeworCQkJYWRhcHRlci0+dHhfaW50X2RlbGF5ID0gVHhJbnREZWxheVtiZF07CisJCQlpeGdiX3ZhbGlkYXRlX29wdGlvbigmYWRhcHRlci0+dHhfaW50X2RlbGF5LCAmb3B0KTsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXItPnR4X2ludF9kZWxheSA9IG9wdC5kZWY7CisJCX0KKwl9CisKKwl7IC8qIFRyYW5zbWl0IEludGVycnVwdCBEZWxheSBFbmFibGUgKi8KKwkJc3RydWN0IGl4Z2Jfb3B0aW9uIG9wdCA9IHsKKwkJCS50eXBlID0gZW5hYmxlX29wdGlvbiwKKwkJCS5uYW1lID0gIlR4IEludGVycnVwdCBEZWxheSBFbmFibGUiLAorCQkJLmVyciAgPSAiZGVmYXVsdGluZyB0byBFbmFibGVkIiwKKwkJCS5kZWYgID0gT1BUSU9OX0VOQUJMRUQKKwkJfTsKKworCQlpZihudW1fSW50RGVsYXlFbmFibGUgPiBiZCkgeworCQkJaW50IGlkZSA9IEludERlbGF5RW5hYmxlW2JkXTsKKwkJCWl4Z2JfdmFsaWRhdGVfb3B0aW9uKCZpZGUsICZvcHQpOworCQkJYWRhcHRlci0+dHhfaW50X2RlbGF5X2VuYWJsZSA9IGlkZTsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXItPnR4X2ludF9kZWxheV9lbmFibGUgPSBvcHQuZGVmOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvamF6enNvbmljLmMgYi9kcml2ZXJzL25ldC9qYXp6c29uaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmVjNjEzZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2phenpzb25pYy5jCkBAIC0wLDAgKzEsMzgxIEBACisvKgorICogc29uaWMuYworICoKKyAqIChDKSAxOTk2LDE5OTggYnkgVGhvbWFzIEJvZ2VuZG9lcmZlciAodHNib2dlbmRAYWxwaGEuZnJhbmtlbi5kZSkKKyAqIAorICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gd29yayBmcm9tIEFuZHJlYXMgQnVzc2UsIGJ1dCBtb3N0IG9mCisgKiB0aGUgY29kZSBpcyByZXdyaXR0ZW4uCisgKiAKKyAqIChDKSAxOTk1IGJ5IEFuZHJlYXMgQnVzc2UgKGFuZHlAd2FsZG9yZi1nbWJoLmRlKQorICoKKyAqIEEgZHJpdmVyIGZvciB0aGUgb25ib2FyZCBTb25pYyBldGhlcm5ldCBjb250cm9sbGVyIG9uIE1pcHMgSmF6egorICogc3lzdGVtcyAoQWNlciBQaWNhLTYxLCBNaXBzIE1hZ251bSA0MDAwLCBPbGl2ZXR0aSBNNzAwIGFuZAorICogcGVyaGFwcyBvdGhlcnMsIHRvbykKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vamF6ei5oPgorI2luY2x1ZGUgPGFzbS9qYXp6ZG1hLmg+CisKK3N0YXRpYyBjaGFyIGphenpfc29uaWNfc3RyaW5nW10gPSAiamF6enNvbmljIjsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpqYXp6X3NvbmljX2RldmljZTsKKworI2RlZmluZSBTT05JQ19NRU1fU0laRQkweDEwMAorCisjZGVmaW5lIFNSRUdTX1BBRChuKSAgICB1MTYgbjsKKworI2luY2x1ZGUgInNvbmljLmgiCisKKy8qCisgKiBNYWNyb3MgdG8gYWNjZXNzIFNPTklDIHJlZ2lzdGVycworICovCisjZGVmaW5lIFNPTklDX1JFQUQocmVnKSAoKigodm9sYXRpbGUgdW5zaWduZWQgaW50ICopYmFzZV9hZGRyK3JlZykpCisKKyNkZWZpbmUgU09OSUNfV1JJVEUocmVnLHZhbCkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCSooKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKWJhc2VfYWRkcisocmVnKSkgPSAodmFsKTsJCVwKK30gd2hpbGUgKDApCisKKworLyogdXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgPjIgZm9yIGRlYnVnICovCisjaWZkZWYgU09OSUNfREVCVUcKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc29uaWNfZGVidWcgPSBTT05JQ19ERUJVRzsKKyNlbHNlIAorc3RhdGljIHVuc2lnbmVkIGludCBzb25pY19kZWJ1ZyA9IDE7CisjZW5kaWYKKworLyoKKyAqIEJhc2UgYWRkcmVzcyBhbmQgaW50ZXJydXB0IG9mIHRoZSBTT05JQyBjb250cm9sbGVyIG9uIEpBWlogYm9hcmRzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBwb3J0OworCXVuc2lnbmVkIGludCBpcnE7Cit9IHNvbmljX3BvcnRsaXN0W10gPSB7IHtKQVpaX0VUSEVSTkVUX0JBU0UsIEpBWlpfRVRIRVJORVRfSVJRfSwgezAsIDB9fTsKKworLyoKKyAqIFdlIGNhbm5vdCB1c2Ugc3RhdGlvbiAoZXRoZXJuZXQpIGFkZHJlc3MgcHJlZml4ZXMgdG8gZGV0ZWN0IHRoZQorICogc29uaWMgY29udHJvbGxlciBzaW5jZSB0aGVzZSBhcmUgYm9hcmQgbWFudWZhY3R1cmVyIGRlcGVuZGVkLgorICogU28gd2UgY2hlY2sgZm9yIGtub3duIFNpbGljb24gUmV2aXNpb24gSURzIGluc3RlYWQuIAorICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQga25vd25fcmV2aXNpb25zW10gPQoreworCTB4MDQsCQkJLyogTWlwcyBNYWdudW0gNDAwMCAqLworCTB4ZmZmZgkJCS8qIGVuZCBvZiBsaXN0ICovCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzb25pY19wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBiYXNlX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlycSkKK3sKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCXVuc2lnbmVkIGludCBzaWxpY29uX3JldmlzaW9uOworCXVuc2lnbmVkIGludCB2YWw7CisJc3RydWN0IHNvbmljX2xvY2FsICpscDsKKwlpbnQgZXJyID0gLUVOT0RFVjsKKwlpbnQgaTsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGJhc2VfYWRkciwgU09OSUNfTUVNX1NJWkUsIGphenpfc29uaWNfc3RyaW5nKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwkvKgorCSAqIGdldCB0aGUgU2lsaWNvbiBSZXZpc2lvbiBJRC4gSWYgdGhpcyBpcyBvbmUgb2YgdGhlIGtub3duCisJICogb25lIGFzc3VtZSB0aGF0IHdlIGZvdW5kIGEgU09OSUMgZXRoZXJuZXQgY29udHJvbGxlciBhdAorCSAqIHRoZSBleHBlY3RlZCBsb2NhdGlvbi4KKwkgKi8KKwlzaWxpY29uX3JldmlzaW9uID0gU09OSUNfUkVBRChTT05JQ19TUik7CisJaWYgKHNvbmljX2RlYnVnID4gMSkKKwkJcHJpbnRrKCJTT05JQyBTaWxpY29uIFJldmlzaW9uID0gMHglMDR4XG4iLHNpbGljb25fcmV2aXNpb24pOworCisJaSA9IDA7CisJd2hpbGUgKGtub3duX3JldmlzaW9uc1tpXSAhPSAweGZmZmYKKwkgICAgICAgJiYga25vd25fcmV2aXNpb25zW2ldICE9IHNpbGljb25fcmV2aXNpb24pCisJCWkrKzsKKworCWlmIChrbm93bl9yZXZpc2lvbnNbaV0gPT0gMHhmZmZmKSB7CisJCXByaW50aygiU09OSUMgZXRoZXJuZXQgY29udHJvbGxlciBub3QgZm91bmQgKDB4JTR4KVxuIiwKKwkJICAgICAgIHNpbGljb25fcmV2aXNpb24pOworCQlnb3RvIG91dDsKKwl9CisgICAgCisJaWYgKHNvbmljX2RlYnVnICAmJiAgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKHZlcnNpb24pOworCisJcHJpbnRrKCIlczogU29uaWMgZXRoZXJuZXQgZm91bmQgYXQgMHglMDhseCwgIiwgZGV2LT5uYW1lLCBiYXNlX2FkZHIpOworCisJLyogRmlsbCBpbiB0aGUgJ2RldicgZmllbGRzLiAqLworCWRldi0+YmFzZV9hZGRyID0gYmFzZV9hZGRyOworCWRldi0+aXJxID0gaXJxOworCisJLyoKKwkgKiBQdXQgdGhlIHNvbmljIGludG8gc29mdHdhcmUgcmVzZXQsIHRoZW4KKwkgKiByZXRyaWV2ZSBhbmQgcHJpbnQgdGhlIGV0aGVybmV0IGFkZHJlc3MuCisJICovCisJU09OSUNfV1JJVEUoU09OSUNfQ01ELFNPTklDX0NSX1JTVCk7CisJU09OSUNfV1JJVEUoU09OSUNfQ0VQLDApOworCWZvciAoaT0wOyBpPDM7IGkrKykgeworCQl2YWwgPSBTT05JQ19SRUFEKFNPTklDX0NBUDAtaSk7CisJCWRldi0+ZGV2X2FkZHJbaSoyXSA9IHZhbDsKKwkJZGV2LT5kZXZfYWRkcltpKjIrMV0gPSB2YWwgPj4gODsKKwl9CisKKwlwcmludGsoIkhXIEFkZHJlc3MgIik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlwcmludGsoIiUyLjJ4IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJCWlmIChpPDUpCisJCQlwcmludGsoIjoiKTsKKwl9CisKKwlwcmludGsoIiBJUlEgJWRcbiIsIGlycSk7CisKKwllcnIgPSAtRU5PTUVNOworICAgIAorCS8qIEluaXRpYWxpemUgdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJaWYgKGRldi0+cHJpdiA9PSBOVUxMKSB7CisJCS8qCisJCSAqIHRoZSBtZW1vcnkgYmUgbG9jYXRlZCBpbiB0aGUgc2FtZSA2NGtiIHNlZ21lbnQKKwkJICovCisJCWxwID0gTlVMTDsKKwkJaSA9IDA7CisJCWRvIHsKKwkJCWxwID0ga21hbGxvYyhzaXplb2YoKmxwKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoKHVuc2lnbmVkIGxvbmcpIGxwID4+IDE2CisJCQkgICAgIT0gKCh1bnNpZ25lZCBsb25nKWxwICsgc2l6ZW9mKCpscCkgKSA+PiAxNikgeworCQkJCS8qIEZJWE1FLCBmcmVlIHRoZSBtZW1vcnkgbGF0ZXIgKi8KKwkJCQlrZnJlZShscCk7CisJCQkJbHAgPSBOVUxMOworCQkJfQorCQl9IHdoaWxlIChscCA9PSBOVUxMICYmIGkrKyA8IDIwKTsKKworCQlpZiAobHAgPT0gTlVMTCkgeworCQkJcHJpbnRrKCIlczogY291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBkZXNjcmlwdG9yc1xuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJZ290byBvdXQ7CisJCX0KKworCQltZW1zZXQobHAsIDAsIHNpemVvZihzdHJ1Y3Qgc29uaWNfbG9jYWwpKTsKKworCQkvKiBnZXQgdGhlIHZpcnR1YWwgZG1hIGFkZHJlc3MgKi8KKwkJbHAtPmNkYV9sYWRkciA9IHZkbWFfYWxsb2MoQ1BIWVNBRERSKGxwKSxzaXplb2YoKmxwKSk7CisJCWlmIChscC0+Y2RhX2xhZGRyID09IH4wVUwpIHsKKwkJCXByaW50aygiJXM6IGNvdWxkbid0IGdldCBETUEgcGFnZSBlbnRyeSBmb3IgIgorCQkJICAgICAgICJkZXNjcmlwdG9yc1xuIiwgZGV2LT5uYW1lKTsKKwkJCWdvdG8gb3V0MTsKKwkJfQorCisJCWxwLT50ZGFfbGFkZHIgPSBscC0+Y2RhX2xhZGRyICsgc2l6ZW9mIChscC0+Y2RhKTsKKwkJbHAtPnJyYV9sYWRkciA9IGxwLT50ZGFfbGFkZHIgKyBzaXplb2YgKGxwLT50ZGEpOworCQlscC0+cmRhX2xhZGRyID0gbHAtPnJyYV9sYWRkciArIHNpemVvZiAobHAtPnJyYSk7CisJCisJCS8qIGFsbG9jYXRlIHJlY2VpdmUgYnVmZmVyIGFyZWEgKi8KKwkJLyogRklYTUUsIG1heWJlIHdlIHNob3VsZCB1c2Ugc2ticyAqLworCQlscC0+cmJhID0ga21hbGxvYyhTT05JQ19OVU1fUlJTICogU09OSUNfUkJTSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFscC0+cmJhKSB7CisJCQlwcmludGsoIiVzOiBjb3VsZG4ndCBhbGxvY2F0ZSByZWNlaXZlIGJ1ZmZlcnNcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWdvdG8gb3V0MjsKKwkJfQorCisJCS8qIGdldCB2aXJ0dWFsIGRtYSBhZGRyZXNzICovCisJCWxwLT5yYmFfbGFkZHIgPSB2ZG1hX2FsbG9jKENQSFlTQUREUihscC0+cmJhKSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUNfTlVNX1JSUyAqIFNPTklDX1JCU0laRSk7CisJCWlmIChscC0+cmJhX2xhZGRyID09IH4wVUwpIHsKKwkJCXByaW50aygiJXM6IGNvdWxkbid0IGdldCBETUEgcGFnZSBlbnRyeSBmb3IgcmVjZWl2ZSAiCisJCQkgICAgICAgImJ1ZmZlcnNcbiIsZGV2LT5uYW1lKTsKKwkJCWdvdG8gb3V0MzsKKwkJfQorCisJCS8qIG5vdyBjb252ZXJ0IHBvaW50ZXIgdG8gS1NFRzEgcG9pbnRlciAqLworCQlscC0+cmJhID0gKGNoYXIgKilLU0VHMUFERFIobHAtPnJiYSk7CisJCWZsdXNoX2NhY2hlX2FsbCgpOworCQlkZXYtPnByaXYgPSAoc3RydWN0IHNvbmljX2xvY2FsICopS1NFRzFBRERSKGxwKTsKKwl9CisKKwlscCA9IChzdHJ1Y3Qgc29uaWNfbG9jYWwgKilkZXYtPnByaXY7CisJZGV2LT5vcGVuID0gc29uaWNfb3BlbjsKKwlkZXYtPnN0b3AgPSBzb25pY19jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHNvbmljX3NlbmRfcGFja2V0OworCWRldi0+Z2V0X3N0YXRzCT0gc29uaWNfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNvbmljX211bHRpY2FzdF9saXN0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCisJLyoKKwkgKiBjbGVhciB0YWxseSBjb3VudGVyCisJICovCisJU09OSUNfV1JJVEUoU09OSUNfQ1JDVCwweGZmZmYpOworCVNPTklDX1dSSVRFKFNPTklDX0ZBRVQsMHhmZmZmKTsKKwlTT05JQ19XUklURShTT05JQ19NUFQsMHhmZmZmKTsKKworCXJldHVybiAwOworb3V0MzoKKwlrZnJlZShscC0+cmJhKTsKK291dDI6CisJdmRtYV9mcmVlKGxwLT5jZGFfbGFkZHIpOworb3V0MToKKwlrZnJlZShscCk7CitvdXQ6CisJcmVsZWFzZV9yZWdpb24oYmFzZV9hZGRyLCBTT05JQ19NRU1fU0laRSk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFByb2JlIGZvciBhIFNPTklDIGV0aGVybmV0IGNvbnRyb2xsZXIgb24gYSBNaXBzIEphenogYm9hcmQuCisgKiBBY3R1YWxseSBwcm9iaW5nIGlzIHN1cGVyZmx1b3VzIGJ1dCB3ZSdyZSBwYXJhbm9pZC4KKyAqLworc3RhdGljIGludCBfX2luaXQgamF6el9zb25pY19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc29uaWNfbG9jYWwgKmxwOworCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyOworCWludCBlcnIgPSAwOworCWludCBpOworCisJLyoKKwkgKiBEb24ndCBwcm9iZSBpZiB3ZSdyZSBub3QgcnVubmluZyBvbiBhIEphenogYm9hcmQuCisJICovCisJaWYgKG1pcHNfbWFjaGdyb3VwICE9IE1BQ0hfR1JPVVBfSkFaWikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldigwKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCWJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKGJhc2VfYWRkciA+PSBLU0VHMCkJeyAvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCWVyciA9IHNvbmljX3Byb2JlMShkZXYsIGJhc2VfYWRkciwgZGV2LT5pcnEpOworCX0gZWxzZSBpZiAoYmFzZV9hZGRyICE9IDApIHsgLyogRG9uJ3QgcHJvYmUgYXQgYWxsLiAqLworCQllcnIgPSAtRU5YSU87CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgc29uaWNfcG9ydGxpc3RbaV0ucG9ydDsgaSsrKSB7CisJCQlpbnQgaW8gPSBzb25pY19wb3J0bGlzdFtpXS5wb3J0OworCQkJaWYgKHNvbmljX3Byb2JlMShkZXYsIGlvLCBzb25pY19wb3J0bGlzdFtpXS5pcnEpID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFzb25pY19wb3J0bGlzdFtpXS5wb3J0KQorCQkJZXJyID0gLUVOT0RFVjsKKwl9CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCisJcmV0dXJuIDA7CisKK291dDE6CisJbHAgPSBkZXYtPnByaXY7CisJdmRtYV9mcmVlKGxwLT5yYmFfbGFkZHIpOworCWtmcmVlKGxwLT5yYmEpOworCXZkbWFfZnJlZShscC0+Y2RhX2xhZGRyKTsKKwlrZnJlZShscCk7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFNPTklDX01FTV9TSVpFKTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqICAgICAgU09OSUMgdXNlcyBhIG5vcm1hbCBJUlEKKyAqLworI2RlZmluZSBzb25pY19yZXF1ZXN0X2lycSAgICAgICByZXF1ZXN0X2lycQorI2RlZmluZSBzb25pY19mcmVlX2lycSAgICAgICAgICBmcmVlX2lycQorCisjZGVmaW5lIHNvbmljX2NoaXB0b21lbSh4KSAgICAgIEtTRUcxQUREUih2ZG1hX2xvZzJwaHlzKHgpKQorCisjaW5jbHVkZSAic29uaWMuYyIKKworc3RhdGljIGludCBfX2RldmV4aXQgamF6el9zb25pY19kZXZpY2VfcmVtb3ZlIChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldmljZS0+ZHJpdmVyX2RhdGE7CisKKwl1bnJlZ2lzdGVyX25ldGRldiAoZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbiAoZGV2LT5iYXNlX2FkZHIsIFNPTklDX01FTV9TSVpFKTsKKwlmcmVlX25ldGRldiAoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgamF6el9zb25pY19kcml2ZXIgPSB7CisJLm5hbWUJPSBqYXp6X3NvbmljX3N0cmluZywKKwkuYnVzCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZQk9IGphenpfc29uaWNfcHJvYmUsCisJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKGphenpfc29uaWNfZGV2aWNlX3JlbW92ZSksCit9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3N0YXRpYyB2b2lkIGphenpfc29uaWNfcGxhdGZvcm1fcmVsZWFzZSAoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsZGV2OworCisJLyogZnJlZSBkZXZpY2UgKi8KKwlwbGRldiA9IHRvX3BsYXRmb3JtX2RldmljZSAoZGV2aWNlKTsKKwlrZnJlZSAocGxkZXYpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBqYXp6X3NvbmljX2luaXRfbW9kdWxlKHZvaWQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxkZXY7CisKKwlpZiAoZHJpdmVyX3JlZ2lzdGVyKCZqYXp6X3NvbmljX2RyaXZlcikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJEcml2ZXIgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWphenpfc29uaWNfZGV2aWNlID0gTlVMTDsKKworCWlmICghKHBsZGV2ID0ga21hbGxvYyAoc2l6ZW9mICgqcGxkZXYpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZ290byBvdXRfdW5yZWdpc3RlcjsKKwl9CisKKwltZW1zZXQocGxkZXYsIDAsIHNpemVvZiAoKnBsZGV2KSk7CisJcGxkZXYtPm5hbWUJCT0gamF6el9zb25pY19zdHJpbmc7CisJcGxkZXYtPmlkCQk9IDA7CisJcGxkZXYtPmRldi5yZWxlYXNlCT0gamF6el9zb25pY19wbGF0Zm9ybV9yZWxlYXNlOworCWphenpfc29uaWNfZGV2aWNlCT0gcGxkZXY7CisKKwlpZiAocGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyIChwbGRldikpIHsKKwkJa2ZyZWUocGxkZXYpOworCQlqYXp6X3NvbmljX2RldmljZSA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7CisKK291dF91bnJlZ2lzdGVyOgorCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBsZGV2KTsKKworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgamF6el9zb25pY19jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZqYXp6X3NvbmljX2RyaXZlcik7CisKKwlpZiAoamF6el9zb25pY19kZXZpY2UpIHsKKwkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoamF6el9zb25pY19kZXZpY2UpOworCQlqYXp6X3NvbmljX2RldmljZSA9IE5VTEw7CisJfQorfQorCittb2R1bGVfaW5pdChqYXp6X3NvbmljX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGphenpfc29uaWNfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbGFuY2UuYyBiL2RyaXZlcnMvbmV0L2xhbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVjNTU3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2xhbmNlLmMKQEAgLTAsMCArMSwxMzA4IEBACisvKiBsYW5jZS5jOiBBbiBBTUQgTEFOQ0UvUENuZXQgZXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4gKi8KKy8qCisJV3JpdHRlbi9jb3B5cmlnaHQgMTk5My0xOTk4IGJ5IERvbmFsZCBCZWNrZXIuCisKKwlDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisJRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCVRoaXMgZHJpdmVyIGlzIGZvciB0aGUgQWxsaWVkIFRlbGVzaXMgQVQxNTAwIGFuZCBIUCBKMjQwNUEsIGFuZCBzaG91bGQgd29yaworCXdpdGggbW9zdCBvdGhlciBMQU5DRS1iYXNlZCBidXMtbWFzdGVyIChORTIxMDAvTkUyNTAwKSBldGhlcmNhcmRzLgorCisJVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisJQW5kcmV5IFYuIFNhdm9jaGtpbjoKKwktIGFsaWdubWVudCBwcm9ibGVtIHdpdGggMS4zLioga2VybmVsIGFuZCBzb21lIG1pbm9yIGNoYW5nZXMuCisJVGhvbWFzIEJvZ2VuZG9lcmZlciAodHNib2dlbmRAYmlnYnVnLmZyYW5rZW4uZGUpOgorCS0gYWRkZWQgc3VwcG9ydCBmb3IgTGludXgvQWxwaGEsIGJ1dCByZW1vdmVkIG1vc3Qgb2YgaXQsIGJlY2F1c2UKKyAgICAgICAgaXQgd29ya2VkIG9ubHkgZm9yIHRoZSBQQ0kgY2hpcC4gCisgICAgICAtIGFkZGVkIGhvb2sgZm9yIHRoZSAzMmJpdCBsYW5jZSBkcml2ZXIKKyAgICAgIC0gYWRkZWQgUENuZXRQQ0kgSUkgKDc5Qzk3MEEpIHRvIGNoaXAgdGFibGUKKwlQYXVsIEdvcnRtYWtlciAoZ3BnMTA5QHJzcGh5MS5hbnUuZWR1LmF1KToKKwktIGhvcGVmdWxseSBmaXggYWJvdmUgc28gTGludXgvQWxwaGEgY2FuIHVzZSBJU0EgY2FyZHMgdG9vLgorICAgIDgvMjAvOTYgRml4ZWQgNzk5MCBhdXRvSVJRIGZhaWx1cmUgYW5kIHJldmVyc2VkIHVubmVlZGVkIGFsaWdubWVudCAtZGpiCisgICAgdjEuMTIgMTAvMjcvOTcgTW9kdWxlIHN1cHBvcnQgLWRqYgorICAgIHYxLjE0ICAyLzMvOTggTW9kdWxlIHN1cHBvcnQgbW9kaWZpZWQsIG1hZGUgUENJIHN1cHBvcnQgb3B0aW9uYWwgLWRqYgorICAgIHYxLjE1IDUvMjcvOTkgRml4ZWQgYnVnIGluIHRoZSBjbGVhbnVwX21vZHVsZSgpLiBkZXYtPnByaXYgd2FzIGZyZWVkCisgICAgICAgICAgICAgICAgICBiZWZvcmUgdW5yZWdpc3Rlcl9uZXRkZXYoKSB3aGljaCBjYXVzZWQgTlVMTCBwb2ludGVyCisgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgbGF0ZXIgaW4gdGhlIGNoYWluIChpbiBydG5ldGxpbmtfZmlsbF9pZmluZm8oKSkKKyAgICAgICAgICAgICAgICAgIC0tIE1pa2EgS3VvcHBhbGEgPG1pa3VAaWtpLmZpPgorICAgIAorICAgIEZvcndhcmQgcG9ydGVkIHYxLjE0IHRvIDIuMS4xMjksIG1lcmdlZCB0aGUgUENJIGFuZCBtaXNjIGNoYW5nZXMgZnJvbQorICAgIHRoZSAyLjEgdmVyc2lvbiBvZiB0aGUgb2xkIGRyaXZlciAtIEFsYW4gQ294CisKKyAgICBHZXQgcmlkIG9mIGNoZWNrX3JlZ2lvbiwgY2hlY2sga21hbGxvYyByZXR1cm4gaW4gbGFuY2VfcHJvYmUxCisgICAgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+IC0gMTEvMDEvMjAwMQorCisJUmV3b3JrZWQgZGV0ZWN0aW9uLCBhZGRlZCBzdXBwb3J0IGZvciBSYWNhbCBJbnRlckxhbiBFdGhlckJsYXN0ZXIgY2FyZHMKKwlWZXNzZWxpbiBLb3N0YWRpbm92IDx2ZXNvayBhdCB5YWhvbyBkb3QgY29tID4gLSAyMi80LzIwMDQKKyovCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9ICJsYW5jZS5jOnYxLjE1YWMgMTk5OS8xMS8xMyBkcGxhdHRAM2RvLmNvbSwgYmVja2VyQGNlc2Rpcy5nc2ZjLm5hc2EuZ292XG4iOworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworc3RhdGljIHVuc2lnbmVkIGludCBsYW5jZV9wb3J0bGlzdFtdIF9faW5pdGRhdGEgPSB7IDB4MzAwLCAweDMyMCwgMHgzNDAsIDB4MzYwLCAwfTsKK3N0YXRpYyBpbnQgbGFuY2VfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIsIGludCBpcnEsIGludCBvcHRpb25zKTsKK3N0YXRpYyBpbnQgX19pbml0IGRvX2xhbmNlX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisKK3N0YXRpYyBzdHJ1Y3QgY2FyZCB7CisJY2hhciBpZF9vZmZzZXQxNDsKKwljaGFyIGlkX29mZnNldDE1OworfSBjYXJkc1tdID0geworCXsJLy8ibm9ybWFsIgorCQkuaWRfb2Zmc2V0MTQgPSAweDU3LAorCQkuaWRfb2Zmc2V0MTUgPSAweDU3LAorCX0sCisJewkvL05JNjUxMEVCCisJCS5pZF9vZmZzZXQxNCA9IDB4NTIsCisJCS5pZF9vZmZzZXQxNSA9IDB4NDQsCisJfSwKKwl7CS8vUmFjYWwgSW50ZXJMYW4gRXRoZXJCbGFzdGVyCisJCS5pZF9vZmZzZXQxNCA9IDB4NTIsCisJCS5pZF9vZmZzZXQxNSA9IDB4NDksCisJfSwKK307CisjZGVmaW5lIE5VTV9DQVJEUyAzCisKKyNpZmRlZiBMQU5DRV9ERUJVRworc3RhdGljIGludCBsYW5jZV9kZWJ1ZyA9IExBTkNFX0RFQlVHOworI2Vsc2UKK3N0YXRpYyBpbnQgbGFuY2VfZGVidWcgPSAxOworI2VuZGlmCisKKy8qCisJCQkJVGhlb3J5IG9mIE9wZXJhdGlvbgorCitJLiBCb2FyZCBDb21wYXRpYmlsaXR5CisKK1RoaXMgZGV2aWNlIGRyaXZlciBpcyBkZXNpZ25lZCBmb3IgdGhlIEFNRCA3OUM5NjAsIHRoZSAiUENuZXQtSVNBCitzaW5nbGUtY2hpcCBldGhlcm5ldCBjb250cm9sbGVyIGZvciBJU0EiLiAgVGhpcyBjaGlwIGlzIHVzZWQgaW4gYSB3aWRlCit2YXJpZXR5IG9mIGJvYXJkcyBmcm9tIHZlbmRvcnMgc3VjaCBhcyBBbGxpZWQgVGVsZXNpcywgSFAsIEtpbmdzdG9uLAorYW5kIEJvY2EuICBUaGlzIGRyaXZlciBpcyBhbHNvIGludGVuZGVkIHRvIHdvcmsgd2l0aCBvbGRlciBBTUQgNzk5MAorZGVzaWducywgc3VjaCBhcyB0aGUgTkUxNTAwIGFuZCBORTIxMDAsIGFuZCBuZXdlciA3OUM5NjEuICBGb3IgY29udmVuaWVuY2UsCitJIHVzZSB0aGUgbmFtZSBMQU5DRSB0byByZWZlciB0byBhbGwgb2YgdGhlIEFNRCBjaGlwcywgZXZlbiB0aG91Z2ggaXQgcHJvcGVybHkKK3JlZmVycyBvbmx5IHRvIHRoZSBvcmlnaW5hbCA3OTkwLgorCitJSS4gQm9hcmQtc3BlY2lmaWMgc2V0dGluZ3MKKworVGhlIGRyaXZlciBpcyBkZXNpZ25lZCB0byB3b3JrIHRoZSBib2FyZHMgdGhhdCB1c2UgdGhlIGZhc3RlcgorYnVzLW1hc3RlciBtb2RlLCByYXRoZXIgdGhhbiBpbiBzaGFyZWQgbWVtb3J5IG1vZGUuCSAoT25seSBvbGRlciBkZXNpZ25zCitoYXZlIG9uLWJvYXJkIGJ1ZmZlciBtZW1vcnkgbmVlZGVkIHRvIHN1cHBvcnQgdGhlIHNsb3dlciBzaGFyZWQgbWVtb3J5IG1vZGUuKQorCitNb3N0IElTQSBib2FyZHMgaGF2ZSBqdW1wZXJlZCBzZXR0aW5ncyBmb3IgdGhlIEkvTyBiYXNlLCBJUlEgbGluZSwgYW5kIERNQQorY2hhbm5lbC4gIFRoaXMgZHJpdmVyIHByb2JlcyB0aGUgbGlrZWx5IGJhc2UgYWRkcmVzc2VzOgorezB4MzAwLCAweDMyMCwgMHgzNDAsIDB4MzYwfS4KK0FmdGVyIHRoZSBib2FyZCBpcyBmb3VuZCBpdCBnZW5lcmF0ZXMgYSBETUEtdGltZW91dCBpbnRlcnJ1cHQgYW5kIHVzZXMKK2F1dG9JUlEgdG8gZmluZCB0aGUgSVJRIGxpbmUuICBUaGUgRE1BIGNoYW5uZWwgY2FuIGJlIHNldCB3aXRoIHRoZSBsb3cgYml0cworb2YgdGhlIG90aGVyd2lzZS11bnVzZWQgZGV2LT5tZW1fc3RhcnQgdmFsdWUgKGFrYSBQQVJBTTEpLiAgSWYgdW5zZXQgaXQgaXMKK3Byb2JlZCBmb3IgYnkgZW5hYmxpbmcgZWFjaCBmcmVlIERNQSBjaGFubmVsIGluIHR1cm4gYW5kIGNoZWNraW5nIGlmCitpbml0aWFsaXphdGlvbiBzdWNjZWVkcy4KKworVGhlIEhQLUoyNDA1QSBib2FyZCBpcyBhbiBleGNlcHRpb246IHdpdGggdGhpcyBib2FyZCBpdCBpcyBlYXN5IHRvIHJlYWQgdGhlCitFRVBST00tc2V0IHZhbHVlcyBmb3IgdGhlIGJhc2UsIElSUSwgYW5kIERNQS4gIChPZiBjb3Vyc2UgeW91IG11c3QgYWxyZWFkeQorX2tub3dfIHRoZSBiYXNlIGFkZHJlc3MgLS0gdGhhdCBmaWVsZCBpcyBmb3Igd3JpdGluZyB0aGUgRUVQUk9NLikKKworSUlJLiBEcml2ZXIgb3BlcmF0aW9uCisKK0lJSWEuIFJpbmcgYnVmZmVycworVGhlIExBTkNFIHVzZXMgcmluZyBidWZmZXJzIG9mIFR4IGFuZCBSeCBkZXNjcmlwdG9ycy4gIEVhY2ggZW50cnkgZGVzY3JpYmVzCit0aGUgYmFzZSBhbmQgbGVuZ3RoIG9mIHRoZSBkYXRhIGJ1ZmZlciwgYWxvbmcgd2l0aCBzdGF0dXMgYml0cy4JIFRoZSBsZW5ndGgKK29mIHRoZXNlIGJ1ZmZlcnMgaXMgc2V0IGJ5IExBTkNFX0xPR197UlgsVFh9X0JVRkZFUlMsIHdoaWNoIGlzIGxvZ18yKCkgb2YKK3RoZSBidWZmZXIgbGVuZ3RoIChyYXRoZXIgdGhhbiBiZWluZyBkaXJlY3RseSB0aGUgYnVmZmVyIGxlbmd0aCkgZm9yCitpbXBsZW1lbnRhdGlvbiBlYXNlLiAgVGhlIGN1cnJlbnQgdmFsdWVzIGFyZSAyIChUeCkgYW5kIDQgKFJ4KSwgd2hpY2ggbGVhZHMgdG8KK3Jpbmcgc2l6ZXMgb2YgNCAoVHgpIGFuZCAxNiAoUngpLiAgSW5jcmVhc2luZyB0aGUgbnVtYmVyIG9mIHJpbmcgZW50cmllcworbmVlZGxlc3NseSB1c2VzIGV4dHJhIHNwYWNlIGFuZCByZWR1Y2VzIHRoZSBjaGFuY2UgdGhhdCBhbiB1cHBlciBsYXllciB3aWxsCitiZSBhYmxlIHRvIHJlb3JkZXIgcXVldWVkIFR4IHBhY2tldHMgYmFzZWQgb24gcHJpb3JpdHkuCSBEZWNyZWFzaW5nIHRoZSBudW1iZXIKK29mIGVudHJpZXMgbWFrZXMgaXQgbW9yZSBkaWZmaWN1bHQgdG8gYWNoaWV2ZSBiYWNrLXRvLWJhY2sgcGFja2V0IHRyYW5zbWlzc2lvbgorYW5kIGluY3JlYXNlcyB0aGUgY2hhbmNlIHRoYXQgUnggcmluZyB3aWxsIG92ZXJmbG93LiAgKENvbnNpZGVyIHRoZSB3b3JzdCBjYXNlCitvZiByZWNlaXZpbmcgYmFjay10by1iYWNrIG1pbmltdW0tc2l6ZWQgcGFja2V0cy4pCisKK1RoZSBMQU5DRSBoYXMgdGhlIGNhcGFiaWxpdHkgdG8gImNoYWluIiBib3RoIFJ4IGFuZCBUeCBidWZmZXJzLCBidXQgdGhpcyBkcml2ZXIKK3N0YXRpY2FsbHkgYWxsb2NhdGVzIGZ1bGwtc2l6ZWQgKHNsaWdodGx5IG92ZXJzaXplZCAtLSBQS1RfQlVGX1NaKSBidWZmZXJzIHRvCithdm9pZCB0aGUgYWRtaW5pc3RyYXRpdmUgb3ZlcmhlYWQuIEZvciB0aGUgUnggc2lkZSB0aGlzIGF2b2lkcyBkeW5hbWljYWxseQorYWxsb2NhdGluZyBmdWxsLXNpemVkIGJ1ZmZlcnMgImp1c3QgaW4gY2FzZSIsIGF0IHRoZSBleHBlbnNlIG9mIGEKK21lbW9yeS10by1tZW1vcnkgZGF0YSBjb3B5IGZvciBlYWNoIHBhY2tldCByZWNlaXZlZC4gIEZvciBtb3N0IHN5c3RlbXMgdGhpcworaXMgYSBnb29kIHRyYWRlb2ZmOiB0aGUgUnggYnVmZmVyIHdpbGwgYWx3YXlzIGJlIGluIGxvdyBtZW1vcnksIHRoZSBjb3B5CitpcyBpbmV4cGVuc2l2ZSwgYW5kIGl0IHByaW1lcyB0aGUgY2FjaGUgZm9yIGxhdGVyIHBhY2tldCBwcm9jZXNzaW5nLiAgRm9yIFR4Cit0aGUgYnVmZmVycyBhcmUgb25seSB1c2VkIHdoZW4gbmVlZGVkIGFzIGxvdy1tZW1vcnkgYm91bmNlIGJ1ZmZlcnMuCisKK0lJSUIuIDE2TSBtZW1vcnkgbGltaXRhdGlvbnMuCitGb3IgdGhlIElTQSBidXMgbWFzdGVyIG1vZGUgYWxsIHN0cnVjdHVyZXMgdXNlZCBkaXJlY3RseSBieSB0aGUgTEFOQ0UsCit0aGUgaW5pdGlhbGl6YXRpb24gYmxvY2ssIFJ4IGFuZCBUeCByaW5ncywgYW5kIGRhdGEgYnVmZmVycywgbXVzdCBiZQorYWNjZXNzaWJsZSBmcm9tIHRoZSBJU0EgYnVzLCBpLmUuIGluIHRoZSBsb3dlciAxNk0gb2YgcmVhbCBtZW1vcnkuCitUaGlzIGlzIGEgcHJvYmxlbSBmb3IgY3VycmVudCBMaW51eCBrZXJuZWxzIG9uID4xNk0gbWFjaGluZXMuIFRoZSBuZXR3b3JrCitkZXZpY2VzIGFyZSBpbml0aWFsaXplZCBhZnRlciBtZW1vcnkgaW5pdGlhbGl6YXRpb24sIGFuZCB0aGUga2VybmVsIGRvbGVzIG91dAorbWVtb3J5IGZyb20gdGhlIHRvcCBvZiBtZW1vcnkgZG93bndhcmQuCSBUaGUgY3VycmVudCBzb2x1dGlvbiBpcyB0byBoYXZlIGEKK3NwZWNpYWwgbmV0d29yayBpbml0aWFsaXphdGlvbiByb3V0aW5lIHRoYXQncyBjYWxsZWQgYmVmb3JlIG1lbW9yeQoraW5pdGlhbGl6YXRpb247IHRoaXMgd2lsbCBldmVudHVhbGx5IGJlIGdlbmVyYWxpemVkIGZvciBhbGwgbmV0d29yayBkZXZpY2VzLgorQXMgbWVudGlvbmVkIGJlZm9yZSwgbG93LW1lbW9yeSAiYm91bmNlLWJ1ZmZlcnMiIGFyZSB1c2VkIHdoZW4gbmVlZGVkLgorCitJSUlDLiBTeW5jaHJvbml6YXRpb24KK1RoZSBkcml2ZXIgcnVucyBhcyB0d28gaW5kZXBlbmRlbnQsIHNpbmdsZS10aHJlYWRlZCBmbG93cyBvZiBjb250cm9sLiAgT25lCitpcyB0aGUgc2VuZC1wYWNrZXQgcm91dGluZSwgd2hpY2ggZW5mb3JjZXMgc2luZ2xlLXRocmVhZGVkIHVzZSBieSB0aGUKK2Rldi0+dGJ1c3kgZmxhZy4gIFRoZSBvdGhlciB0aHJlYWQgaXMgdGhlIGludGVycnVwdCBoYW5kbGVyLCB3aGljaCBpcyBzaW5nbGUKK3RocmVhZGVkIGJ5IHRoZSBoYXJkd2FyZSBhbmQgb3RoZXIgc29mdHdhcmUuCisKK1RoZSBzZW5kIHBhY2tldCB0aHJlYWQgaGFzIHBhcnRpYWwgY29udHJvbCBvdmVyIHRoZSBUeCByaW5nIGFuZCAnZGV2LT50YnVzeScKK2ZsYWcuICBJdCBzZXRzIHRoZSB0YnVzeSBmbGFnIHdoZW5ldmVyIGl0J3MgcXVldWluZyBhIFR4IHBhY2tldC4gSWYgdGhlIG5leHQKK3F1ZXVlIHNsb3QgaXMgZW1wdHksIGl0IGNsZWFycyB0aGUgdGJ1c3kgZmxhZyB3aGVuIGZpbmlzaGVkIG90aGVyd2lzZSBpdCBzZXRzCit0aGUgJ2xwLT50eF9mdWxsJyBmbGFnLgorCitUaGUgaW50ZXJydXB0IGhhbmRsZXIgaGFzIGV4Y2x1c2l2ZSBjb250cm9sIG92ZXIgdGhlIFJ4IHJpbmcgYW5kIHJlY29yZHMgc3RhdHMKK2Zyb20gdGhlIFR4IHJpbmcuIChUaGUgVHgtZG9uZSBpbnRlcnJ1cHQgY2FuJ3QgYmUgc2VsZWN0aXZlbHkgdHVybmVkIG9mZiwgc28KK3dlIGNhbid0IGF2b2lkIHRoZSBpbnRlcnJ1cHQgb3ZlcmhlYWQgYnkgaGF2aW5nIHRoZSBUeCByb3V0aW5lIHJlYXAgdGhlIFR4CitzdGF0cy4pCSBBZnRlciByZWFwaW5nIHRoZSBzdGF0cywgaXQgbWFya3MgdGhlIHF1ZXVlIGVudHJ5IGFzIGVtcHR5IGJ5IHNldHRpbmcKK3RoZSAnYmFzZScgdG8gemVyby4gSWZmIHRoZSAnbHAtPnR4X2Z1bGwnIGZsYWcgaXMgc2V0LCBpdCBjbGVhcnMgYm90aCB0aGUKK3R4X2Z1bGwgYW5kIHRidXN5IGZsYWdzLgorCisqLworCisvKiBTZXQgdGhlIG51bWJlciBvZiBUeCBhbmQgUnggYnVmZmVycywgdXNpbmcgTG9nXzIoIyBidWZmZXJzKS4KKyAgIFJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZXMgYXJlIDE2IFR4IGJ1ZmZlcnMsIGFuZCAxNiBSeCBidWZmZXJzLgorICAgVGhhdCB0cmFuc2xhdGVzIHRvIDQgYW5kIDQgKDE2ID09IDJeXjQpLgorICAgVGhpcyBpcyBhIGNvbXBpbGUtdGltZSBvcHRpb24gZm9yIGVmZmljaWVuY3kuCisgICAqLworI2lmbmRlZiBMQU5DRV9MT0dfVFhfQlVGRkVSUworI2RlZmluZSBMQU5DRV9MT0dfVFhfQlVGRkVSUyA0CisjZGVmaW5lIExBTkNFX0xPR19SWF9CVUZGRVJTIDQKKyNlbmRpZgorCisjZGVmaW5lIFRYX1JJTkdfU0laRQkJCSgxIDw8IChMQU5DRV9MT0dfVFhfQlVGRkVSUykpCisjZGVmaW5lIFRYX1JJTkdfTU9EX01BU0sJCShUWF9SSU5HX1NJWkUgLSAxKQorI2RlZmluZSBUWF9SSU5HX0xFTl9CSVRTCQkoKExBTkNFX0xPR19UWF9CVUZGRVJTKSA8PCAyOSkKKworI2RlZmluZSBSWF9SSU5HX1NJWkUJCQkoMSA8PCAoTEFOQ0VfTE9HX1JYX0JVRkZFUlMpKQorI2RlZmluZSBSWF9SSU5HX01PRF9NQVNLCQkoUlhfUklOR19TSVpFIC0gMSkKKyNkZWZpbmUgUlhfUklOR19MRU5fQklUUwkJKChMQU5DRV9MT0dfUlhfQlVGRkVSUykgPDwgMjkpCisKKyNkZWZpbmUgUEtUX0JVRl9TWgkJMTU0NAorCisvKiBPZmZzZXRzIGZyb20gYmFzZSBJL08gYWRkcmVzcy4gKi8KKyNkZWZpbmUgTEFOQ0VfREFUQSAweDEwCisjZGVmaW5lIExBTkNFX0FERFIgMHgxMgorI2RlZmluZSBMQU5DRV9SRVNFVCAweDE0CisjZGVmaW5lIExBTkNFX0JVU19JRiAweDE2CisjZGVmaW5lIExBTkNFX1RPVEFMX1NJWkUgMHgxOAorCisjZGVmaW5lIFRYX1RJTUVPVVQJMjAKKworLyogVGhlIExBTkNFIFJ4IGFuZCBUeCByaW5nIGRlc2NyaXB0b3JzLiAqLworc3RydWN0IGxhbmNlX3J4X2hlYWQgeworCXMzMiBiYXNlOworCXMxNiBidWZfbGVuZ3RoOwkJCS8qIFRoaXMgbGVuZ3RoIGlzIDJzIGNvbXBsZW1lbnQgKG5lZ2F0aXZlKSEgKi8KKwlzMTYgbXNnX2xlbmd0aDsJCQkvKiBUaGlzIGxlbmd0aCBpcyAibm9ybWFsIi4gKi8KK307CisKK3N0cnVjdCBsYW5jZV90eF9oZWFkIHsKKwlzMzIgYmFzZTsKKwlzMTYgbGVuZ3RoOwkJCQkvKiBMZW5ndGggaXMgMnMgY29tcGxlbWVudCAobmVnYXRpdmUpISAqLworCXMxNiBtaXNjOworfTsKKworLyogVGhlIExBTkNFIGluaXRpYWxpemF0aW9uIGJsb2NrLCBkZXNjcmliZWQgaW4gZGF0YWJvb2suICovCitzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayB7CisJdTE2IG1vZGU7CQkvKiBQcmUtc2V0IG1vZGUgKHJlZy4gMTUpICovCisJdTggIHBoeXNfYWRkcls2XTsgLyogUGh5c2ljYWwgZXRoZXJuZXQgYWRkcmVzcyAqLworCXUzMiBmaWx0ZXJbMl07CQkJLyogTXVsdGljYXN0IGZpbHRlciAodW51c2VkKS4gKi8KKwkvKiBSZWNlaXZlIGFuZCB0cmFuc21pdCByaW5nIGJhc2UsIGFsb25nIHdpdGggZXh0cmEgYml0cy4gKi8KKwl1MzIgIHJ4X3Jpbmc7CQkJLyogVHggYW5kIFJ4IHJpbmcgYmFzZSBwb2ludGVycyAqLworCXUzMiAgdHhfcmluZzsKK307CisKK3N0cnVjdCBsYW5jZV9wcml2YXRlIHsKKwkvKiBUaGUgVHggYW5kIFJ4IHJpbmcgZW50cmllcyBtdXN0IGJlIGFsaWduZWQgb24gOC1ieXRlIGJvdW5kYXJpZXMuICovCisJc3RydWN0IGxhbmNlX3J4X2hlYWQgcnhfcmluZ1tSWF9SSU5HX1NJWkVdOworCXN0cnVjdCBsYW5jZV90eF9oZWFkIHR4X3JpbmdbVFhfUklOR19TSVpFXTsKKwlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jawlpbml0X2Jsb2NrOworCWNvbnN0IGNoYXIgKm5hbWU7CisJLyogVGhlIHNhdmVkIGFkZHJlc3Mgb2YgYSBzZW50LWluLXBsYWNlIHBhY2tldC9idWZmZXIsIGZvciBza2ZyZWUoKS4gKi8KKwlzdHJ1Y3Qgc2tfYnVmZiogdHhfc2tidWZmW1RYX1JJTkdfU0laRV07CisJLyogVGhlIGFkZHJlc3NlcyBvZiByZWNlaXZlLWluLXBsYWNlIHNrYnVmZnMuICovCisJc3RydWN0IHNrX2J1ZmYqIHJ4X3NrYnVmZltSWF9SSU5HX1NJWkVdOworCXVuc2lnbmVkIGxvbmcgcnhfYnVmZnM7CQkvKiBBZGRyZXNzIG9mIFJ4IGFuZCBUeCBidWZmZXJzLiAqLworCS8qIFR4IGxvdy1tZW1vcnkgImJvdW5jZSBidWZmZXIiIGFkZHJlc3MuICovCisJY2hhciAoKnR4X2JvdW5jZV9idWZmcylbUEtUX0JVRl9TWl07CisJaW50IGN1cl9yeCwgY3VyX3R4OwkJCS8qIFRoZSBuZXh0IGZyZWUgcmluZyBlbnRyeSAqLworCWludCBkaXJ0eV9yeCwgZGlydHlfdHg7CQkvKiBUaGUgcmluZyBlbnRyaWVzIHRvIGJlIGZyZWUoKWVkLiAqLworCWludCBkbWE7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJdW5zaWduZWQgY2hhciBjaGlwX3ZlcnNpb247CS8qIFNlZSBsYW5jZV9jaGlwX3R5cGUuICovCisJc3BpbmxvY2tfdCBkZXZsb2NrOworfTsKKworI2RlZmluZSBMQU5DRV9NVVNUX1BBRCAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIExBTkNFX0VOQUJMRV9BVVRPU0VMRUNUIDB4MDAwMDAwMDIKKyNkZWZpbmUgTEFOQ0VfTVVTVF9SRUlOSVRfUklORyAgMHgwMDAwMDAwNAorI2RlZmluZSBMQU5DRV9NVVNUX1VOUkVTRVQgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIExBTkNFX0hBU19NSVNTRURfRlJBTUUgIDB4MDAwMDAwMTAKKworLyogQSBtYXBwaW5nIGZyb20gdGhlIGNoaXAgSUQgbnVtYmVyIHRvIHRoZSBwYXJ0IG51bWJlciBhbmQgZmVhdHVyZXMuCisgICBUaGVzZSBhcmUgZnJvbSB0aGUgZGF0YXNoZWV0cyAtLSBpbiByZWFsIGxpZmUgdGhlICc5NzAgdmVyc2lvbgorICAgcmVwb3J0ZWRseSBoYXMgdGhlIHNhbWUgSUQgYXMgdGhlICc5NjUuICovCitzdGF0aWMgc3RydWN0IGxhbmNlX2NoaXBfdHlwZSB7CisJaW50IGlkX251bWJlcjsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBmbGFnczsKK30gY2hpcF90YWJsZVtdID0geworCXsweDAwMDAsICJMQU5DRSA3OTkwIiwJCQkJLyogQW5jaWVudCBsYW5jZSBjaGlwLiAgKi8KKwkJTEFOQ0VfTVVTVF9QQUQgKyBMQU5DRV9NVVNUX1VOUkVTRVR9LAorCXsweDAwMDMsICJQQ25ldC9JU0EgNzlDOTYwIiwJCS8qIDc5Qzk2MCBQQ25ldC9JU0EuICAqLworCQlMQU5DRV9FTkFCTEVfQVVUT1NFTEVDVCArIExBTkNFX01VU1RfUkVJTklUX1JJTkcgKworCQkJTEFOQ0VfSEFTX01JU1NFRF9GUkFNRX0sCisJezB4MjI2MCwgIlBDbmV0L0lTQSsgNzlDOTYxIiwJCS8qIDc5Qzk2MSBQQ25ldC9JU0ErLCBQbHVnLW4tUGxheS4gICovCisJCUxBTkNFX0VOQUJMRV9BVVRPU0VMRUNUICsgTEFOQ0VfTVVTVF9SRUlOSVRfUklORyArCisJCQlMQU5DRV9IQVNfTUlTU0VEX0ZSQU1FfSwKKwl7MHgyNDIwLCAiUENuZXQvUENJIDc5Qzk3MCIsCQkvKiA3OUM5NzAgb3IgNzlDOTc0IFBDbmV0LVNDU0ksIFBDSS4gKi8KKwkJTEFOQ0VfRU5BQkxFX0FVVE9TRUxFQ1QgKyBMQU5DRV9NVVNUX1JFSU5JVF9SSU5HICsKKwkJCUxBTkNFX0hBU19NSVNTRURfRlJBTUV9LAorCS8qIEJ1ZzogdGhlIFBDbmV0L1BDSSBhY3R1YWxseSB1c2VzIHRoZSBQQ25ldC9WTEIgSUQgbnVtYmVyLCBzbyBqdXN0IGNhbGwKKwkJaXQgdGhlIFBDbmV0MzIuICovCisJezB4MjQzMCwgIlBDbmV0MzIiLAkJCQkJLyogNzlDOTY1IFBDbmV0IGZvciBWTCBidXMuICovCisJCUxBTkNFX0VOQUJMRV9BVVRPU0VMRUNUICsgTEFOQ0VfTVVTVF9SRUlOSVRfUklORyArCisJCQlMQU5DRV9IQVNfTUlTU0VEX0ZSQU1FfSwKKyAgICAgICAgezB4MjYyMSwgIlBDbmV0L1BDSS1JSSA3OUM5NzBBIiwgICAgICAgIC8qIDc5Qzk3MEEgUENJbmV0UENJIElJLiAqLworICAgICAgICAgICAgICAgIExBTkNFX0VOQUJMRV9BVVRPU0VMRUNUICsgTEFOQ0VfTVVTVF9SRUlOSVRfUklORyArCisgICAgICAgICAgICAgICAgICAgICAgICBMQU5DRV9IQVNfTUlTU0VEX0ZSQU1FfSwKKwl7MHgwLCAJICJQQ25ldCAodW5rbm93bikiLAorCQlMQU5DRV9FTkFCTEVfQVVUT1NFTEVDVCArIExBTkNFX01VU1RfUkVJTklUX1JJTkcgKworCQkJTEFOQ0VfSEFTX01JU1NFRF9GUkFNRX0sCit9OworCitlbnVtIHtPTERfTEFOQ0UgPSAwLCBQQ05FVF9JU0E9MSwgUENORVRfSVNBUD0yLCBQQ05FVF9QQ0k9MywgUENORVRfVkxCPTQsIFBDTkVUX1BDSV9JST01LCBMQU5DRV9VTktOT1dOPTZ9OworCisKKy8qIE5vbi16ZXJvIGlmIGxhbmNlX3Byb2JlMSgpIG5lZWRzIHRvIGFsbG9jYXRlIGxvdy1tZW1vcnkgYm91bmNlIGJ1ZmZlcnMuCisgICBBc3N1bWUgeWVzIHVudGlsIHdlIGtub3cgdGhlIG1lbW9yeSBzaXplLiAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgbGFuY2VfbmVlZF9pc2FfYm91bmNlX2J1ZmZlcnMgPSAxOworCitzdGF0aWMgaW50IGxhbmNlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBsYW5jZV9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1vZGUpOworc3RhdGljIGludCBsYW5jZV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBsYW5jZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBsYW5jZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IGxhbmNlX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpsYW5jZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBsYW5jZV90eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworDAorCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJaWYgKGRldi0+ZG1hICE9IDQpCisJCWZyZWVfZG1hKGRldi0+ZG1hKTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTEFOQ0VfVE9UQUxfU0laRSk7CisJa2ZyZWUobHAtPnR4X2JvdW5jZV9idWZmcyk7CisJa2ZyZWUoKHZvaWQqKWxwLT5yeF9idWZmcyk7CisJa2ZyZWUobHApOworfQorCisjaWZkZWYgTU9EVUxFCisjZGVmaW5lIE1BWF9DQVJEUwkJOAkvKiBNYXggbnVtYmVyIG9mIGludGVyZmFjZXMgKGNhcmRzKSBwZXIgbW9kdWxlICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X2xhbmNlW01BWF9DQVJEU107CitzdGF0aWMgaW50IGlvW01BWF9DQVJEU107CitzdGF0aWMgaW50IGRtYVtNQVhfQ0FSRFNdOworc3RhdGljIGludCBpcnFbTUFYX0NBUkRTXTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGRtYSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0obGFuY2VfZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiTEFOQ0UvUENuZXQgSS9PIGJhc2UgYWRkcmVzcyhlcykscmVxdWlyZWQiKTsKK01PRFVMRV9QQVJNX0RFU0MoZG1hLCAiTEFOQ0UvUENuZXQgSVNBIERNQSBjaGFubmVsIChpZ25vcmVkIGZvciBzb21lIGRldmljZXMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIkxBTkNFL1BDbmV0IElSUSBudW1iZXIgKGlnbm9yZWQgZm9yIHNvbWUgZGV2aWNlcykiKTsKK01PRFVMRV9QQVJNX0RFU0MobGFuY2VfZGVidWcsICJMQU5DRS9QQ25ldCBkZWJ1ZyBsZXZlbCAoMC03KSIpOworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCB0aGlzX2RldiwgZm91bmQgPSAwOworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCWlmIChpb1t0aGlzX2Rldl0gPT0gMCkgIHsKKwkJCWlmICh0aGlzX2RldiAhPSAwKSAvKiBvbmx5IGNvbXBsYWluIG9uY2UgKi8KKwkJCQlicmVhazsKKwkJCXByaW50ayhLRVJOX05PVElDRSAibGFuY2UuYzogTW9kdWxlIGF1dG9wcm9iaW5nIG5vdCBhbGxvd2VkLiBBcHBlbmQgXCJpbz0weE5OTlwiIHZhbHVlKHMpLlxuIik7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisJCWRldiA9IGFsbG9jX2V0aGVyZGV2KDApOworCQlpZiAoIWRldikKKwkJCWJyZWFrOworCQlkZXYtPmlycSA9IGlycVt0aGlzX2Rldl07CisJCWRldi0+YmFzZV9hZGRyID0gaW9bdGhpc19kZXZdOworCQlkZXYtPmRtYSA9IGRtYVt0aGlzX2Rldl07CisJCWlmIChkb19sYW5jZV9wcm9iZShkZXYpID09IDApIHsKKwkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7CisJCQkJZGV2X2xhbmNlW2ZvdW5kKytdID0gZGV2OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJY2xlYW51cF9jYXJkKGRldik7CisJCX0KKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJYnJlYWs7CisJfQorCWlmIChmb3VuZCAhPSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVOWElPOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IHRoaXNfZGV2OworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfbGFuY2VbdGhpc19kZXZdOworCQlpZiAoZGV2KSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwkKKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJfQorCX0KK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCisvKiBTdGFydGluZyBpbiB2Mi4xLiosIHRoZSBMQU5DRS9QQ25ldCBwcm9iZSBpcyBub3cgc2ltaWxhciB0byB0aGUgb3RoZXIKKyAgIGJvYXJkIHByb2JlcyBub3cgdGhhdCBrbWFsbG9jKCkgY2FuIGFsbG9jYXRlIElTQSBETUEtYWJsZSByZWdpb25zLgorICAgVGhpcyBhbHNvIGFsbG93cyB0aGUgTEFOQ0UgZHJpdmVyIHRvIGJlIHVzZWQgYXMgYSBtb2R1bGUuCisgICAqLworc3RhdGljIGludCBfX2luaXQgZG9fbGFuY2VfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgKnBvcnQsIHJlc3VsdDsKKworCWlmIChoaWdoX21lbW9yeSA8PSBwaHlzX3RvX3ZpcnQoMTYqMTAyNCoxMDI0KSkKKwkJbGFuY2VfbmVlZF9pc2FfYm91bmNlX2J1ZmZlcnMgPSAwOworCisJZm9yIChwb3J0ID0gbGFuY2VfcG9ydGxpc3Q7ICpwb3J0OyBwb3J0KyspIHsKKwkJaW50IGlvYWRkciA9ICpwb3J0OworCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSByZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIExBTkNFX1RPVEFMX1NJWkUsCisJCQkJCQkJImxhbmNlLXByb2JlIik7CisKKwkJaWYgKHIpIHsKKwkJCS8qIERldGVjdCB0aGUgY2FyZCB3aXRoIG1pbmltYWwgSS9PIHJlYWRzICovCisJCQljaGFyIG9mZnNldDE0ID0gaW5iKGlvYWRkciArIDE0KTsKKwkJCWludCBjYXJkOworCQkJZm9yIChjYXJkID0gMDsgY2FyZCA8IE5VTV9DQVJEUzsgKytjYXJkKQorCQkJCWlmIChjYXJkc1tjYXJkXS5pZF9vZmZzZXQxNCA9PSBvZmZzZXQxNCkKKwkJCQkJYnJlYWs7CisJCQlpZiAoY2FyZCA8IE5VTV9DQVJEUykgey8qeWVzLCB0aGUgZmlyc3QgYnl0ZSBtYXRjaGVzKi8KKwkJCQljaGFyIG9mZnNldDE1ID0gaW5iKGlvYWRkciArIDE1KTsKKwkJCQlmb3IgKGNhcmQgPSAwOyBjYXJkIDwgTlVNX0NBUkRTOyArK2NhcmQpCisJCQkJCWlmICgoY2FyZHNbY2FyZF0uaWRfb2Zmc2V0MTQgPT0gb2Zmc2V0MTQpICYmCisJCQkJCQkoY2FyZHNbY2FyZF0uaWRfb2Zmc2V0MTUgPT0gb2Zmc2V0MTUpKQorCQkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoY2FyZCA8IE5VTV9DQVJEUykgeyAvKlNpZ25hdHVyZSBPSyovCisJCQkJcmVzdWx0ID0gbGFuY2VfcHJvYmUxKGRldiwgaW9hZGRyLCAwLCAwKTsKKwkJCQlpZiAoIXJlc3VsdCkgeworCQkJCQlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJCQkJCWludCB2ZXIgPSBscC0+Y2hpcF92ZXJzaW9uOworCisJCQkJCXItPm5hbWUgPSBjaGlwX3RhYmxlW3Zlcl0ubmFtZTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQkJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBMQU5DRV9UT1RBTF9TSVpFKTsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworI2lmbmRlZiBNT0RVTEUKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IGxhbmNlX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19ldGhlcmRldigwKTsKKwlpbnQgZXJyOworCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisKKwllcnIgPSBkb19sYW5jZV9wcm9iZShkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlyZXR1cm4gZGV2Oworb3V0MToKKwljbGVhbnVwX2NhcmQoZGV2KTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgbGFuY2VfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIsIGludCBpcnEsIGludCBvcHRpb25zKQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscDsKKwlsb25nIGRtYV9jaGFubmVsczsJCQkvKiBNYXJrIHNwdXJpb3VzbHktYnVzeSBETUEgY2hhbm5lbHMgKi8KKwlpbnQgaSwgcmVzZXRfdmFsLCBsYW5jZV92ZXJzaW9uOworCWNvbnN0IGNoYXIgKmNoaXBuYW1lOworCS8qIEZsYWdzIGZvciBzcGVjaWZpYyBjaGlwcyBvciBib2FyZHMuICovCisJdW5zaWduZWQgY2hhciBocEoyNDA1QSA9IDA7CQkvKiBIUCBJU0EgYWRhcHRvciAqLworCWludCBocF9idWlsdGluID0gMDsJCQkvKiBIUCBvbi1ib2FyZCBldGhlcm5ldC4gKi8KKwlzdGF0aWMgaW50IGRpZF92ZXJzaW9uOwkJCS8qIEFscmVhZHkgcHJpbnRlZCB2ZXJzaW9uIGluZm8uICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyID0gLUVOT01FTTsKKworCS8qIEZpcnN0IHdlIGxvb2sgZm9yIHNwZWNpYWwgY2FzZXMuCisJICAgQ2hlY2sgZm9yIEhQJ3Mgb24tYm9hcmQgZXRoZXJuZXQgYnkgbG9va2luZyBmb3IgJ0hQJyBpbiB0aGUgQklPUy4KKwkgICBUaGVyZSBhcmUgdHdvIEhQIHZlcnNpb25zLCBjaGVjayB0aGUgQklPUyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gcG9ydC4KKwkgICBUaGlzIG1ldGhvZCBwcm92aWRlZCBieSBMLiBKdWxsaWFyZCwgTGF1cmVudF9KdWxsaWFyZEBncmVub2JsZS5ocC5jb20uCisJICAgKi8KKwlpZiAoaXNhX3JlYWR3KDB4MDAwZjAxMDIpID09IDB4NTA0OCkgIHsKKwkJc3RhdGljIGNvbnN0IHNob3J0IGlvYWRkcl90YWJsZVtdID0geyAweDMwMCwgMHgzMjAsIDB4MzQwLCAweDM2MH07CisJCWludCBocF9wb3J0ID0gKGlzYV9yZWFkbCgweDAwMGYwMGYxKSAmIDEpICA/IDB4NDk5IDogMHg5OTsKKwkJLyogV2UgY2FuIGhhdmUgYm9hcmRzIG90aGVyIHRoYW4gdGhlIGJ1aWx0LWluISAgVmVyaWZ5IHRoaXMgaXMgb24tYm9hcmQuICovCisJCWlmICgoaW5iKGhwX3BvcnQpICYgMHhjMCkgPT0gMHg4MAorCQkJJiYgaW9hZGRyX3RhYmxlW2luYihocF9wb3J0KSAmIDNdID09IGlvYWRkcikKKwkJCWhwX2J1aWx0aW4gPSBocF9wb3J0OworCX0KKwkvKiBXZSBhbHNvIHJlY29nbml6ZSB0aGUgSFAgVmVjdHJhIG9uLWJvYXJkIGhlcmUsIGJ1dCBjaGVjayBiZWxvdy4gKi8KKwlocEoyNDA1QSA9IChpbmIoaW9hZGRyKSA9PSAweDA4ICYmIGluYihpb2FkZHIrMSkgPT0gMHgwMAorCQkJCSYmIGluYihpb2FkZHIrMikgPT0gMHgwOSk7CisKKwkvKiBSZXNldCB0aGUgTEFOQ0UuCSAqLworCXJlc2V0X3ZhbCA9IGludyhpb2FkZHIrTEFOQ0VfUkVTRVQpOyAvKiBSZXNldCB0aGUgTEFOQ0UgKi8KKworCS8qIFRoZSBVbi1SZXNldCBuZWVkZWQgaXMgb25seSBuZWVkZWQgZm9yIHRoZSByZWFsIE5FMjEwMCwgYW5kIHdpbGwKKwkgICBjb25mdXNlIHRoZSBIUCBib2FyZC4gKi8KKwlpZiAoIWhwSjI0MDVBKQorCQlvdXR3KHJlc2V0X3ZhbCwgaW9hZGRyK0xBTkNFX1JFU0VUKTsKKworCW91dHcoMHgwMDAwLCBpb2FkZHIrTEFOQ0VfQUREUik7IC8qIFN3aXRjaCB0byB3aW5kb3cgMCAqLworCWlmIChpbncoaW9hZGRyK0xBTkNFX0RBVEEpICE9IDB4MDAwNCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBHZXQgdGhlIHZlcnNpb24gb2YgdGhlIGNoaXAuICovCisJb3V0dyg4OCwgaW9hZGRyK0xBTkNFX0FERFIpOworCWlmIChpbncoaW9hZGRyK0xBTkNFX0FERFIpICE9IDg4KSB7CisJCWxhbmNlX3ZlcnNpb24gPSAwOworCX0gZWxzZSB7CQkJLyogR29vZCwgaXQncyBhIG5ld2VyIGNoaXAuICovCisJCWludCBjaGlwX3ZlcnNpb24gPSBpbncoaW9hZGRyK0xBTkNFX0RBVEEpOworCQlvdXR3KDg5LCBpb2FkZHIrTEFOQ0VfQUREUik7CisJCWNoaXBfdmVyc2lvbiB8PSBpbncoaW9hZGRyK0xBTkNFX0RBVEEpIDw8IDE2OworCQlpZiAobGFuY2VfZGVidWcgPiAyKQorCQkJcHJpbnRrKCIgIExBTkNFIGNoaXAgdmVyc2lvbiBpcyAlI3guXG4iLCBjaGlwX3ZlcnNpb24pOworCQlpZiAoKGNoaXBfdmVyc2lvbiAmIDB4ZmZmKSAhPSAweDAwMykKKwkJCXJldHVybiAtRU5PREVWOworCQljaGlwX3ZlcnNpb24gPSAoY2hpcF92ZXJzaW9uID4+IDEyKSAmIDB4ZmZmZjsKKwkJZm9yIChsYW5jZV92ZXJzaW9uID0gMTsgY2hpcF90YWJsZVtsYW5jZV92ZXJzaW9uXS5pZF9udW1iZXI7IGxhbmNlX3ZlcnNpb24rKykgeworCQkJaWYgKGNoaXBfdGFibGVbbGFuY2VfdmVyc2lvbl0uaWRfbnVtYmVyID09IGNoaXBfdmVyc2lvbikKKwkJCQlicmVhazsKKwkJfQorCX0KKworCS8qIFdlIGNhbid0IGFsbG9jYXRlIGRldi0+cHJpdiBmcm9tIGFsbG9jX2V0aGVyZGV2KCkgYmVjYXVzZSBpdCBtdXN0CisJICAgYSBJU0EgRE1BLWFibGUgcmVnaW9uLiAqLworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwljaGlwbmFtZSA9IGNoaXBfdGFibGVbbGFuY2VfdmVyc2lvbl0ubmFtZTsKKwlwcmludGsoIiVzOiAlcyBhdCAlIzN4LCIsIGRldi0+bmFtZSwgY2hpcG5hbWUsIGlvYWRkcik7CisKKwkvKiBUaGVyZSBpcyBhIDE2IGJ5dGUgc3RhdGlvbiBhZGRyZXNzIFBST00gYXQgdGhlIGJhc2UgYWRkcmVzcy4KKwkgICBUaGUgZmlyc3Qgc2l4IGJ5dGVzIGFyZSB0aGUgc3RhdGlvbiBhZGRyZXNzLiAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiICUyLjJ4IiwgZGV2LT5kZXZfYWRkcltpXSA9IGluYihpb2FkZHIgKyBpKSk7CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwkvKiBNYWtlIGNlcnRhaW4gdGhlIGRhdGEgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBMQU5DRSBhcmUgYWxpZ25lZCBhbmQgRE1BYmxlLiAqLworCQkKKwlscCA9IGttYWxsb2Moc2l6ZW9mKCpscCksIEdGUF9ETUEgfCBHRlBfS0VSTkVMKTsKKwlpZihscD09TlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGxhbmNlX2RlYnVnID4gNikgcHJpbnRrKCIgKCMweCUwNWx4KSIsICh1bnNpZ25lZCBsb25nKWxwKTsKKwltZW1zZXQobHAsIDAsIHNpemVvZigqbHApKTsKKwlkZXYtPnByaXYgPSBscDsKKwlscC0+bmFtZSA9IGNoaXBuYW1lOworCWxwLT5yeF9idWZmcyA9ICh1bnNpZ25lZCBsb25nKWttYWxsb2MoUEtUX0JVRl9TWipSWF9SSU5HX1NJWkUsCisJCQkJCQkgIEdGUF9ETUEgfCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxwLT5yeF9idWZmcykKKwkJZ290byBvdXRfbHA7CisJaWYgKGxhbmNlX25lZWRfaXNhX2JvdW5jZV9idWZmZXJzKSB7CisJCWxwLT50eF9ib3VuY2VfYnVmZnMgPSBrbWFsbG9jKFBLVF9CVUZfU1oqVFhfUklOR19TSVpFLAorCQkJCQkJICBHRlBfRE1BIHwgR0ZQX0tFUk5FTCk7CisJCWlmICghbHAtPnR4X2JvdW5jZV9idWZmcykKKwkJCWdvdG8gb3V0X3J4OworCX0gZWxzZQorCQlscC0+dHhfYm91bmNlX2J1ZmZzID0gTlVMTDsKKworCWxwLT5jaGlwX3ZlcnNpb24gPSBsYW5jZV92ZXJzaW9uOworCXNwaW5fbG9ja19pbml0KCZscC0+ZGV2bG9jayk7CisKKwlscC0+aW5pdF9ibG9jay5tb2RlID0gMHgwMDAzOwkJLyogRGlzYWJsZSBSeCBhbmQgVHguICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJbHAtPmluaXRfYmxvY2sucGh5c19hZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKwlscC0+aW5pdF9ibG9jay5maWx0ZXJbMF0gPSAweDAwMDAwMDAwOworCWxwLT5pbml0X2Jsb2NrLmZpbHRlclsxXSA9IDB4MDAwMDAwMDA7CisJbHAtPmluaXRfYmxvY2sucnhfcmluZyA9ICgodTMyKWlzYV92aXJ0X3RvX2J1cyhscC0+cnhfcmluZykgJiAweGZmZmZmZikgfCBSWF9SSU5HX0xFTl9CSVRTOworCWxwLT5pbml0X2Jsb2NrLnR4X3JpbmcgPSAoKHUzMilpc2FfdmlydF90b19idXMobHAtPnR4X3JpbmcpICYgMHhmZmZmZmYpIHwgVFhfUklOR19MRU5fQklUUzsKKworCW91dHcoMHgwMDAxLCBpb2FkZHIrTEFOQ0VfQUREUik7CisJaW53KGlvYWRkcitMQU5DRV9BRERSKTsKKwlvdXR3KChzaG9ydCkgKHUzMikgaXNhX3ZpcnRfdG9fYnVzKCZscC0+aW5pdF9ibG9jayksIGlvYWRkcitMQU5DRV9EQVRBKTsKKwlvdXR3KDB4MDAwMiwgaW9hZGRyK0xBTkNFX0FERFIpOworCWludyhpb2FkZHIrTEFOQ0VfQUREUik7CisJb3V0dygoKHUzMilpc2FfdmlydF90b19idXMoJmxwLT5pbml0X2Jsb2NrKSkgPj4gMTYsIGlvYWRkcitMQU5DRV9EQVRBKTsKKwlvdXR3KDB4MDAwMCwgaW9hZGRyK0xBTkNFX0FERFIpOworCWludyhpb2FkZHIrTEFOQ0VfQUREUik7CisKKwlpZiAoaXJxKSB7CQkJCQkvKiBTZXQgaWZmIFBDSSBjYXJkLiAqLworCQlkZXYtPmRtYSA9IDQ7CQkJLyogTmF0aXZlIGJ1cy1tYXN0ZXIsIG5vIERNQSBjaGFubmVsIG5lZWRlZC4gKi8KKwkJZGV2LT5pcnEgPSBpcnE7CisJfSBlbHNlIGlmIChocF9idWlsdGluKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyIGRtYV90YmxbNF0gPSB7MywgNSwgNiwgMH07CisJCXN0YXRpYyBjb25zdCBjaGFyIGlycV90YmxbNF0gPSB7MywgNCwgNSwgOX07CisJCXVuc2lnbmVkIGNoYXIgcG9ydF92YWwgPSBpbmIoaHBfYnVpbHRpbik7CisJCWRldi0+ZG1hID0gZG1hX3RibFsocG9ydF92YWwgPj4gNCkgJiAzXTsKKwkJZGV2LT5pcnEgPSBpcnFfdGJsWyhwb3J0X3ZhbCA+PiAyKSAmIDNdOworCQlwcmludGsoIiBIUCBWZWN0cmEgSVJRICVkIERNQSAlZC5cbiIsIGRldi0+aXJxLCBkZXYtPmRtYSk7CisJfSBlbHNlIGlmIChocEoyNDA1QSkgeworCQlzdGF0aWMgY29uc3QgY2hhciBkbWFfdGJsWzRdID0gezMsIDUsIDYsIDd9OworCQlzdGF0aWMgY29uc3QgY2hhciBpcnFfdGJsWzhdID0gezMsIDQsIDUsIDksIDEwLCAxMSwgMTIsIDE1fTsKKwkJc2hvcnQgcmVzZXRfdmFsID0gaW53KGlvYWRkcitMQU5DRV9SRVNFVCk7CisJCWRldi0+ZG1hID0gZG1hX3RibFsocmVzZXRfdmFsID4+IDIpICYgM107CisJCWRldi0+aXJxID0gaXJxX3RibFsocmVzZXRfdmFsID4+IDQpICYgN107CisJCXByaW50aygiIEhQIEoyNDA1QSBJUlEgJWQgRE1BICVkLlxuIiwgZGV2LT5pcnEsIGRldi0+ZG1hKTsKKwl9IGVsc2UgaWYgKGxhbmNlX3ZlcnNpb24gPT0gUENORVRfSVNBUCkgewkJLyogVGhlIHBsdWctbi1wbGF5IHZlcnNpb24uICovCisJCXNob3J0IGJ1c19pbmZvOworCQlvdXR3KDgsIGlvYWRkcitMQU5DRV9BRERSKTsKKwkJYnVzX2luZm8gPSBpbncoaW9hZGRyK0xBTkNFX0JVU19JRik7CisJCWRldi0+ZG1hID0gYnVzX2luZm8gJiAweDA3OworCQlkZXYtPmlycSA9IChidXNfaW5mbyA+PiA0KSAmIDB4MEY7CisJfSBlbHNlIHsKKwkJLyogVGhlIERNQSBjaGFubmVsIG1heSBiZSBwYXNzZWQgaW4gUEFSQU0xLiAqLworCQlpZiAoZGV2LT5tZW1fc3RhcnQgJiAweDA3KQorCQkJZGV2LT5kbWEgPSBkZXYtPm1lbV9zdGFydCAmIDB4MDc7CisJfQorCisJaWYgKGRldi0+ZG1hID09IDApIHsKKwkJLyogUmVhZCB0aGUgRE1BIGNoYW5uZWwgc3RhdHVzIHJlZ2lzdGVyLCBzbyB0aGF0IHdlIGNhbiBhdm9pZAorCQkgICBzdHVjayBETUEgY2hhbm5lbHMgaW4gdGhlIERNQSBkZXRlY3Rpb24gYmVsb3cuICovCisJCWRtYV9jaGFubmVscyA9ICgoaW5iKERNQTFfU1RBVF9SRUcpID4+IDQpICYgMHgwZikgfAorCQkJKGluYihETUEyX1NUQVRfUkVHKSAmIDB4ZjApOworCX0KKwllcnIgPSAtRU5PREVWOworCWlmIChkZXYtPmlycSA+PSAyKQorCQlwcmludGsoIiBhc3NpZ25lZCBJUlEgJWQiLCBkZXYtPmlycSk7CisJZWxzZSBpZiAobGFuY2VfdmVyc2lvbiAhPSAwKSAgewkvKiA3OTkwIGJvYXJkcyBuZWVkIERNQSBkZXRlY3Rpb24gZmlyc3QuICovCisJCXVuc2lnbmVkIGxvbmcgaXJxX21hc2s7CisKKwkJLyogVG8gYXV0by1JUlEgd2UgZW5hYmxlIHRoZSBpbml0aWFsaXphdGlvbi1kb25lIGFuZCBETUEgZXJyb3IKKwkJICAgaW50ZXJydXB0cy4gRm9yIElTQSBib2FyZHMgd2UgZ2V0IGEgRE1BIGVycm9yLCBidXQgVkxCIGFuZCBQQ0kKKwkJICAgYm9hcmRzIHdpbGwgd29yay4gKi8KKwkJaXJxX21hc2sgPSBwcm9iZV9pcnFfb24oKTsKKworCQkvKiBUcmlnZ2VyIGFuIGluaXRpYWxpemF0aW9uIGp1c3QgZm9yIHRoZSBpbnRlcnJ1cHQuICovCisJCW91dHcoMHgwMDQxLCBpb2FkZHIrTEFOQ0VfREFUQSk7CisKKwkJbWRlbGF5KDIwKTsKKwkJZGV2LT5pcnEgPSBwcm9iZV9pcnFfb2ZmKGlycV9tYXNrKTsKKwkJaWYgKGRldi0+aXJxKQorCQkJcHJpbnRrKCIsIHByb2JlZCBJUlEgJWQiLCBkZXYtPmlycSk7CisJCWVsc2UgeworCQkJcHJpbnRrKCIsIGZhaWxlZCB0byBkZXRlY3QgSVJRIGxpbmUuXG4iKTsKKwkJCWdvdG8gb3V0X3R4OworCQl9CisKKwkJLyogQ2hlY2sgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBkb25lIGJpdCwgMHgwMTAwLCB3aGljaCBtZWFucworCQkgICB0aGF0IHdlIGRvbid0IG5lZWQgYSBETUEgY2hhbm5lbC4gKi8KKwkJaWYgKGludyhpb2FkZHIrTEFOQ0VfREFUQSkgJiAweDAxMDApCisJCQlkZXYtPmRtYSA9IDQ7CisJfQorCisJaWYgKGRldi0+ZG1hID09IDQpIHsKKwkJcHJpbnRrKCIsIG5vIERNQSBuZWVkZWQuXG4iKTsKKwl9IGVsc2UgaWYgKGRldi0+ZG1hKSB7CisJCWlmIChyZXF1ZXN0X2RtYShkZXYtPmRtYSwgY2hpcG5hbWUpKSB7CisJCQlwcmludGsoIkRNQSAlZCBhbGxvY2F0aW9uIGZhaWxlZC5cbiIsIGRldi0+ZG1hKTsKKwkJCWdvdG8gb3V0X3R4OworCQl9IGVsc2UKKwkJCXByaW50aygiLCBhc3NpZ25lZCBETUEgJWQuXG4iLCBkZXYtPmRtYSk7CisJfSBlbHNlIHsJCQkvKiBPSywgd2UgaGF2ZSB0byBhdXRvLURNQS4gKi8KKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJc3RhdGljIGNvbnN0IGNoYXIgZG1hc1tdID0geyA1LCA2LCA3LCAzIH07CisJCQlpbnQgZG1hID0gZG1hc1tpXTsKKwkJCWludCBib2d1c2NudDsKKworCQkJLyogRG9uJ3QgZW5hYmxlIGEgcGVybWFuZW50bHkgYnVzeSBETUEgY2hhbm5lbCwgb3IgdGhlIG1hY2hpbmUKKwkJCSAgIHdpbGwgaGFuZy4gKi8KKwkJCWlmICh0ZXN0X2JpdChkbWEsICZkbWFfY2hhbm5lbHMpKQorCQkJCWNvbnRpbnVlOworCQkJb3V0dygweDdmMDQsIGlvYWRkcitMQU5DRV9EQVRBKTsgLyogQ2xlYXIgdGhlIG1lbW9yeSBlcnJvciBiaXRzLiAqLworCQkJaWYgKHJlcXVlc3RfZG1hKGRtYSwgY2hpcG5hbWUpKQorCQkJCWNvbnRpbnVlOworCQkJCQorCQkJZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwkJCXNldF9kbWFfbW9kZShkbWEsIERNQV9NT0RFX0NBU0NBREUpOworCQkJZW5hYmxlX2RtYShkbWEpOworCQkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisKKwkJCS8qIFRyaWdnZXIgYW4gaW5pdGlhbGl6YXRpb24uICovCisJCQlvdXR3KDB4MDAwMSwgaW9hZGRyK0xBTkNFX0RBVEEpOworCQkJZm9yIChib2d1c2NudCA9IDEwMDsgYm9ndXNjbnQgPiAwOyAtLWJvZ3VzY250KQorCQkJCWlmIChpbncoaW9hZGRyK0xBTkNFX0RBVEEpICYgMHgwOTAwKQorCQkJCQlicmVhazsKKwkJCWlmIChpbncoaW9hZGRyK0xBTkNFX0RBVEEpICYgMHgwMTAwKSB7CisJCQkJZGV2LT5kbWEgPSBkbWE7CisJCQkJcHJpbnRrKCIsIERNQSAlZC5cbiIsIGRldi0+ZG1hKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwkJCQlkaXNhYmxlX2RtYShkbWEpOworCQkJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCQkJCWZyZWVfZG1hKGRtYSk7CisJCQl9CisJCX0KKwkJaWYgKGkgPT0gNCkgewkJCS8qIEZhaWx1cmU6IGJhaWwuICovCisJCQlwcmludGsoIkRNQSBkZXRlY3Rpb24gZmFpbGVkLlxuIik7CisJCQlnb3RvIG91dF90eDsKKwkJfQorCX0KKworCWlmIChsYW5jZV92ZXJzaW9uID09IDAgJiYgZGV2LT5pcnEgPT0gMCkgeworCQkvKiBXZSBtYXkgYXV0by1JUlEgbm93IHRoYXQgd2UgaGF2ZSBhIERNQSBjaGFubmVsLiAqLworCQkvKiBUcmlnZ2VyIGFuIGluaXRpYWxpemF0aW9uIGp1c3QgZm9yIHRoZSBpbnRlcnJ1cHQuICovCisJCXVuc2lnbmVkIGxvbmcgaXJxX21hc2s7CisKKwkJaXJxX21hc2sgPSBwcm9iZV9pcnFfb24oKTsKKwkJb3V0dygweDAwNDEsIGlvYWRkcitMQU5DRV9EQVRBKTsKKworCQltZGVsYXkoNDApOworCQlkZXYtPmlycSA9IHByb2JlX2lycV9vZmYoaXJxX21hc2spOworCQlpZiAoZGV2LT5pcnEgPT0gMCkgeworCQkJcHJpbnRrKCIgIEZhaWxlZCB0byBkZXRlY3QgdGhlIDc5OTAgSVJRIGxpbmUuXG4iKTsKKwkJCWdvdG8gb3V0X2RtYTsKKwkJfQorCQlwcmludGsoIiAgQXV0by1JUlEgZGV0ZWN0ZWQgSVJRJWQuXG4iLCBkZXYtPmlycSk7CisJfQorCisJaWYgKGNoaXBfdGFibGVbbHAtPmNoaXBfdmVyc2lvbl0uZmxhZ3MgJiBMQU5DRV9FTkFCTEVfQVVUT1NFTEVDVCkgeworCQkvKiBUdXJuIG9uIGF1dG8tc2VsZWN0IG9mIG1lZGlhICgxMGJhc2VUIG9yIEJOQykgc28gdGhhdCB0aGUgdXNlcgorCQkgICBjYW4gd2F0Y2ggdGhlIExFRHMgZXZlbiBpZiB0aGUgYm9hcmQgaXNuJ3Qgb3BlbmVkLiAqLworCQlvdXR3KDB4MDAwMiwgaW9hZGRyK0xBTkNFX0FERFIpOworCQkvKiBEb24ndCB0b3VjaCAxMGJhc2UyIHBvd2VyIGJpdC4gKi8KKwkJb3V0dyhpbncoaW9hZGRyK0xBTkNFX0JVU19JRikgfCAweDAwMDIsIGlvYWRkcitMQU5DRV9CVVNfSUYpOworCX0KKworCWlmIChsYW5jZV9kZWJ1ZyA+IDAgICYmICBkaWRfdmVyc2lvbisrID09IDApCisJCXByaW50ayh2ZXJzaW9uKTsKKworCS8qIFRoZSBMQU5DRS1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9IGxhbmNlX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBsYW5jZV9zdGFydF94bWl0OworCWRldi0+c3RvcCA9IGxhbmNlX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gbGFuY2VfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+dHhfdGltZW91dCA9IGxhbmNlX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisKKwlyZXR1cm4gMDsKK291dF9kbWE6CisJaWYgKGRldi0+ZG1hICE9IDQpCisJCWZyZWVfZG1hKGRldi0+ZG1hKTsKK291dF90eDoKKwlrZnJlZShscC0+dHhfYm91bmNlX2J1ZmZzKTsKK291dF9yeDoKKwlrZnJlZSgodm9pZCopbHAtPnJ4X2J1ZmZzKTsKK291dF9scDoKKwlrZnJlZShscCk7CisJcmV0dXJuIGVycjsKK30KKworDAorc3RhdGljIGludAorbGFuY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGk7CisKKwlpZiAoZGV2LT5pcnEgPT0gMCB8fAorCQlyZXF1ZXN0X2lycShkZXYtPmlycSwgJmxhbmNlX2ludGVycnVwdCwgMCwgbHAtPm5hbWUsIGRldikpIHsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJLyogV2UgdXNlZCB0byBhbGxvY2F0ZSBETUEgaGVyZSwgYnV0IHRoYXQgd2FzIHNpbGx5LgorCSAgIERNQSBsaW5lcyBjYW4ndCBiZSBzaGFyZWQhICBXZSBub3cgcGVybWFuZW50bHkgYWxsb2NhdGUgdGhlbS4gKi8KKworCS8qIFJlc2V0IHRoZSBMQU5DRSAqLworCWludyhpb2FkZHIrTEFOQ0VfUkVTRVQpOworCisJLyogVGhlIERNQSBjb250cm9sbGVyIGlzIHVzZWQgYXMgYSBuby1vcGVyYXRpb24gc2xhdmUsICJjYXNjYWRlIG1vZGUiLiAqLworCWlmIChkZXYtPmRtYSAhPSA0KSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwkJZW5hYmxlX2RtYShkZXYtPmRtYSk7CisJCXNldF9kbWFfbW9kZShkZXYtPmRtYSwgRE1BX01PREVfQ0FTQ0FERSk7CisJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCX0KKworCS8qIFVuLVJlc2V0IHRoZSBMQU5DRSwgbmVlZGVkIG9ubHkgZm9yIHRoZSBORTIxMDAuICovCisJaWYgKGNoaXBfdGFibGVbbHAtPmNoaXBfdmVyc2lvbl0uZmxhZ3MgJiBMQU5DRV9NVVNUX1VOUkVTRVQpCisJCW91dHcoMCwgaW9hZGRyK0xBTkNFX1JFU0VUKTsKKworCWlmIChjaGlwX3RhYmxlW2xwLT5jaGlwX3ZlcnNpb25dLmZsYWdzICYgTEFOQ0VfRU5BQkxFX0FVVE9TRUxFQ1QpIHsKKwkJLyogVGhpcyBpcyA3OUM5NjAtc3BlY2lmaWM6IFR1cm4gb24gYXV0by1zZWxlY3Qgb2YgbWVkaWEgKEFVSSwgQk5DKS4gKi8KKwkJb3V0dygweDAwMDIsIGlvYWRkcitMQU5DRV9BRERSKTsKKwkJLyogT25seSB0b3VjaCBhdXRvc2VsZWN0IGJpdC4gKi8KKwkJb3V0dyhpbncoaW9hZGRyK0xBTkNFX0JVU19JRikgfCAweDAwMDIsIGlvYWRkcitMQU5DRV9CVVNfSUYpOworIAl9CisKKwlpZiAobGFuY2VfZGVidWcgPiAxKQorCQlwcmludGsoIiVzOiBsYW5jZV9vcGVuKCkgaXJxICVkIGRtYSAlZCB0eC9yeCByaW5ncyAlI3gvJSN4IGluaXQgJSN4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgZGV2LT5pcnEsIGRldi0+ZG1hLAorCQkgICAgICAgICAgICh1MzIpIGlzYV92aXJ0X3RvX2J1cyhscC0+dHhfcmluZyksCisJCSAgICAgICAgICAgKHUzMikgaXNhX3ZpcnRfdG9fYnVzKGxwLT5yeF9yaW5nKSwKKwkJCSAgICh1MzIpIGlzYV92aXJ0X3RvX2J1cygmbHAtPmluaXRfYmxvY2spKTsKKworCWxhbmNlX2luaXRfcmluZyhkZXYsIEdGUF9LRVJORUwpOworCS8qIFJlLWluaXRpYWxpemUgdGhlIExBTkNFLCBhbmQgc3RhcnQgaXQgd2hlbiBkb25lLiAqLworCW91dHcoMHgwMDAxLCBpb2FkZHIrTEFOQ0VfQUREUik7CisJb3V0dygoc2hvcnQpICh1MzIpIGlzYV92aXJ0X3RvX2J1cygmbHAtPmluaXRfYmxvY2spLCBpb2FkZHIrTEFOQ0VfREFUQSk7CisJb3V0dygweDAwMDIsIGlvYWRkcitMQU5DRV9BRERSKTsKKwlvdXR3KCgodTMyKWlzYV92aXJ0X3RvX2J1cygmbHAtPmluaXRfYmxvY2spKSA+PiAxNiwgaW9hZGRyK0xBTkNFX0RBVEEpOworCisJb3V0dygweDAwMDQsIGlvYWRkcitMQU5DRV9BRERSKTsKKwlvdXR3KDB4MDkxNSwgaW9hZGRyK0xBTkNFX0RBVEEpOworCisJb3V0dygweDAwMDAsIGlvYWRkcitMQU5DRV9BRERSKTsKKwlvdXR3KDB4MDAwMSwgaW9hZGRyK0xBTkNFX0RBVEEpOworCisJbmV0aWZfc3RhcnRfcXVldWUgKGRldik7CisKKwlpID0gMDsKKwl3aGlsZSAoaSsrIDwgMTAwKQorCQlpZiAoaW53KGlvYWRkcitMQU5DRV9EQVRBKSAmIDB4MDEwMCkKKwkJCWJyZWFrOworCS8qIAorCSAqIFdlIHVzZWQgdG8gY2xlYXIgdGhlIEluaXREb25lIGJpdCwgMHgwMTAwLCBoZXJlIGJ1dCBNYXJrIFN0b2NrdG9uCisJICogcmVwb3J0cyB0aGF0IGRvaW5nIHNvIHRyaWdnZXJzIGEgYnVnIGluIHRoZSAnOTc0LgorCSAqLworIAlvdXR3KDB4MDA0MiwgaW9hZGRyK0xBTkNFX0RBVEEpOworCisJaWYgKGxhbmNlX2RlYnVnID4gMikKKwkJcHJpbnRrKCIlczogTEFOQ0Ugb3BlbiBhZnRlciAlZCB0aWNrcywgaW5pdCBibG9jayAlI3ggY3NyMCAlNC40eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGksICh1MzIpIGlzYV92aXJ0X3RvX2J1cygmbHAtPmluaXRfYmxvY2spLCBpbncoaW9hZGRyK0xBTkNFX0RBVEEpKTsKKworCXJldHVybiAwOwkJCQkJLyogQWx3YXlzIHN1Y2NlZWQgKi8KK30KKworLyogVGhlIExBTkNFIGhhcyBiZWVuIGhhbHRlZCBmb3Igb25lIHJlYXNvbiBvciBhbm90aGVyIChidXNtYXN0ZXIgbWVtb3J5CisgICBhcmJpdHJhdGlvbiBlcnJvciwgVHggRklGTyB1bmRlcmZsb3csIGRyaXZlciBzdG9wcGVkIGl0IHRvIHJlY29uZmlndXJlLAorICAgZXRjLikuICBNb2Rlcm4gTEFOQ0UgdmFyaWFudHMgYWx3YXlzIHJlbG9hZCB0aGVpciByaW5nLWJ1ZmZlcgorICAgY29uZmlndXJhdGlvbiB3aGVuIHJlc3RhcnRlZCwgc28gd2UgbXVzdCByZWluaXRpYWxpemUgb3VyIHJpbmcKKyAgIGNvbnRleHQgYmVmb3JlIHJlc3RhcnRpbmcuICBBcyBwYXJ0IG9mIHRoaXMgcmVpbml0aWFsaXphdGlvbiwKKyAgIGZpbmQgYWxsIHBhY2tldHMgc3RpbGwgb24gdGhlIFR4IHJpbmcgYW5kIHByZXRlbmQgdGhhdCB0aGV5IGhhZCBiZWVuCisgICBzZW50IChpbiBlZmZlY3QsIGRyb3AgdGhlIHBhY2tldHMgb24gdGhlIGZsb29yKSAtIHRoZSBoaWdoZXItbGV2ZWwKKyAgIHByb3RvY29scyB3aWxsIHRpbWUgb3V0IGFuZCByZXRyYW5zbWl0LiAgSXQnZCBiZSBiZXR0ZXIgdG8gc2h1ZmZsZQorICAgdGhlc2Ugc2ticyB0byBhIHRlbXAgbGlzdCBhbmQgdGhlbiBhY3R1YWxseSByZS1UeCB0aGVtIGFmdGVyCisgICByZXN0YXJ0aW5nIHRoZSBjaGlwLCBidXQgSSdtIHRvbyBsYXp5IHRvIGRvIHNvIHJpZ2h0IG5vdy4gIGRwbGF0dEAzZG8uY29tCisqLworCitzdGF0aWMgdm9pZCAKK2xhbmNlX3B1cmdlX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJaW50IGk7CisKKwkvKiBGcmVlIGFsbCB0aGUgc2tidWZmcyBpbiB0aGUgUnggYW5kIFR4IHF1ZXVlcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGxwLT5yeF9za2J1ZmZbaV07CisJCWxwLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCQlscC0+cnhfcmluZ1tpXS5iYXNlID0gMDsJCS8qIE5vdCBvd25lZCBieSBMQU5DRSBjaGlwLiAqLworCQlpZiAoc2tiKQorCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCWlmIChscC0+dHhfc2tidWZmW2ldKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShscC0+dHhfc2tidWZmW2ldKTsKKwkJCWxwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQl9CisJfQorfQorCisKKy8qIEluaXRpYWxpemUgdGhlIExBTkNFIFJ4IGFuZCBUeCByaW5ncy4gKi8KK3N0YXRpYyB2b2lkCitsYW5jZV9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGdmcCkKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJaW50IGk7CisKKwlscC0+Y3VyX3J4ID0gbHAtPmN1cl90eCA9IDA7CisJbHAtPmRpcnR5X3J4ID0gbHAtPmRpcnR5X3R4ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQl2b2lkICpyeF9idWZmOworCisJCXNrYiA9IGFsbG9jX3NrYihQS1RfQlVGX1NaLCBHRlBfRE1BIHwgZ2ZwKTsKKwkJbHAtPnJ4X3NrYnVmZltpXSA9IHNrYjsKKwkJaWYgKHNrYikgeworCQkJc2tiLT5kZXYgPSBkZXY7CisJCQlyeF9idWZmID0gc2tiLT50YWlsOworCQl9IGVsc2UKKwkJCXJ4X2J1ZmYgPSBrbWFsbG9jKFBLVF9CVUZfU1osIEdGUF9ETUEgfCBnZnApOworCQlpZiAocnhfYnVmZiA9PSBOVUxMKQorCQkJbHAtPnJ4X3JpbmdbaV0uYmFzZSA9IDA7CisJCWVsc2UKKwkJCWxwLT5yeF9yaW5nW2ldLmJhc2UgPSAodTMyKWlzYV92aXJ0X3RvX2J1cyhyeF9idWZmKSB8IDB4ODAwMDAwMDA7CisJCWxwLT5yeF9yaW5nW2ldLmJ1Zl9sZW5ndGggPSAtUEtUX0JVRl9TWjsKKwl9CisJLyogVGhlIFR4IGJ1ZmZlciBhZGRyZXNzIGlzIGZpbGxlZCBpbiBhcyBuZWVkZWQsIGJ1dCB3ZSBkbyBuZWVkIHRvIGNsZWFyCisJICAgdGhlIHVwcGVyIG93bmVyc2hpcCBiaXQuICovCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCWxwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQlscC0+dHhfcmluZ1tpXS5iYXNlID0gMDsKKwl9CisKKwlscC0+aW5pdF9ibG9jay5tb2RlID0gMHgwMDAwOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWxwLT5pbml0X2Jsb2NrLnBoeXNfYWRkcltpXSA9IGRldi0+ZGV2X2FkZHJbaV07CisJbHAtPmluaXRfYmxvY2suZmlsdGVyWzBdID0gMHgwMDAwMDAwMDsKKwlscC0+aW5pdF9ibG9jay5maWx0ZXJbMV0gPSAweDAwMDAwMDAwOworCWxwLT5pbml0X2Jsb2NrLnJ4X3JpbmcgPSAoKHUzMilpc2FfdmlydF90b19idXMobHAtPnJ4X3JpbmcpICYgMHhmZmZmZmYpIHwgUlhfUklOR19MRU5fQklUUzsKKwlscC0+aW5pdF9ibG9jay50eF9yaW5nID0gKCh1MzIpaXNhX3ZpcnRfdG9fYnVzKGxwLT50eF9yaW5nKSAmIDB4ZmZmZmZmKSB8IFRYX1JJTkdfTEVOX0JJVFM7Cit9CisKK3N0YXRpYyB2b2lkCitsYW5jZV9yZXN0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjc3IwX2JpdHMsIGludCBtdXN0X3JlaW5pdCkKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisKKwlpZiAobXVzdF9yZWluaXQgfHwKKwkJKGNoaXBfdGFibGVbbHAtPmNoaXBfdmVyc2lvbl0uZmxhZ3MgJiBMQU5DRV9NVVNUX1JFSU5JVF9SSU5HKSkgeworCQlsYW5jZV9wdXJnZV9yaW5nKGRldik7CisJCWxhbmNlX2luaXRfcmluZyhkZXYsIEdGUF9BVE9NSUMpOworCX0KKwlvdXR3KDB4MDAwMCwgICAgZGV2LT5iYXNlX2FkZHIgKyBMQU5DRV9BRERSKTsKKwlvdXR3KGNzcjBfYml0cywgZGV2LT5iYXNlX2FkZHIgKyBMQU5DRV9EQVRBKTsKK30KKworCitzdGF0aWMgdm9pZCBsYW5jZV90eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJb3V0dyAoMCwgaW9hZGRyICsgTEFOQ0VfQUREUik7CisJcHJpbnRrICgiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICU0LjR4LCByZXNldHRpbmcuXG4iLAorCQlkZXYtPm5hbWUsIGludyAoaW9hZGRyICsgTEFOQ0VfREFUQSkpOworCW91dHcgKDB4MDAwNCwgaW9hZGRyICsgTEFOQ0VfREFUQSk7CisJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJaWYgKGxhbmNlX2RlYnVnID4gMykgeworCQlpbnQgaTsKKwkJcHJpbnRrICgiIFJpbmcgZGF0YSBkdW1wOiBkaXJ0eV90eCAlZCBjdXJfdHggJWQlcyBjdXJfcnggJWQuIiwKKwkJICBscC0+ZGlydHlfdHgsIGxwLT5jdXJfdHgsIG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSA/ICIgKGZ1bGwpIiA6ICIiLAorCQkJbHAtPmN1cl9yeCk7CisJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykKKwkJCXByaW50ayAoIiVzICUwOHggJTA0eCAlMDR4IiwgaSAmIDB4MyA/ICIiIDogIlxuICIsCisJCQkgbHAtPnJ4X3JpbmdbaV0uYmFzZSwgLWxwLT5yeF9yaW5nW2ldLmJ1Zl9sZW5ndGgsCisJCQkJbHAtPnJ4X3JpbmdbaV0ubXNnX2xlbmd0aCk7CisJCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykKKwkJCXByaW50ayAoIiVzICUwOHggJTA0eCAlMDR4IiwgaSAmIDB4MyA/ICIiIDogIlxuICIsCisJCQkgICAgIGxwLT50eF9yaW5nW2ldLmJhc2UsIC1scC0+dHhfcmluZ1tpXS5sZW5ndGgsCisJCQkJbHAtPnR4X3JpbmdbaV0ubWlzYyk7CisJCXByaW50ayAoIlxuIik7CisJfQorI2VuZGlmCisJbGFuY2VfcmVzdGFydCAoZGV2LCAweDAwNDMsIDEpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKK30KKworCitzdGF0aWMgaW50IGxhbmNlX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBlbnRyeTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5kZXZsb2NrLCBmbGFncyk7CisKKwlpZiAobGFuY2VfZGVidWcgPiAzKSB7CisJCW91dHcoMHgwMDAwLCBpb2FkZHIrTEFOQ0VfQUREUik7CisJCXByaW50aygiJXM6IGxhbmNlX3N0YXJ0X3htaXQoKSBjYWxsZWQsIGNzcjAgJTQuNHguXG4iLCBkZXYtPm5hbWUsCisJCQkgICBpbncoaW9hZGRyK0xBTkNFX0RBVEEpKTsKKwkJb3V0dygweDAwMDAsIGlvYWRkcitMQU5DRV9EQVRBKTsKKwl9CisKKwkvKiBGaWxsIGluIGEgVHggcmluZyBlbnRyeSAqLworCisJLyogTWFzayB0byByaW5nIGJ1ZmZlciBib3VuZGFyeS4gKi8KKwllbnRyeSA9IGxwLT5jdXJfdHggJiBUWF9SSU5HX01PRF9NQVNLOworCisJLyogQ2F1dGlvbjogdGhlIHdyaXRlIG9yZGVyIGlzIGltcG9ydGFudCBoZXJlLCBzZXQgdGhlIGJhc2UgYWRkcmVzcworCSAgIHdpdGggdGhlICJvd25lcnNoaXAiIGJpdHMgbGFzdC4gKi8KKworCS8qIFRoZSBvbGQgTEFOQ0UgY2hpcHMgZG9lc24ndCBhdXRvbWF0aWNhbGx5IHBhZCBidWZmZXJzIHRvIG1pbi4gc2l6ZS4gKi8KKwlpZiAoY2hpcF90YWJsZVtscC0+Y2hpcF92ZXJzaW9uXS5mbGFncyAmIExBTkNFX01VU1RfUEFEKSB7CisJCWlmIChza2ItPmxlbiA8IEVUSF9aTEVOKSB7CisJCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJZ290byBvdXQ7CisJCQlscC0+dHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0gLUVUSF9aTEVOOworCQl9CisJCWVsc2UgCisJCQlscC0+dHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0gLXNrYi0+bGVuOworCX0gZWxzZQorCQlscC0+dHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0gLXNrYi0+bGVuOworCisJbHAtPnR4X3JpbmdbZW50cnldLm1pc2MgPSAweDAwMDA7CisKKwlscC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwkvKiBJZiBhbnkgcGFydCBvZiB0aGlzIGJ1ZmZlciBpcyA+MTZNIHdlIG11c3QgY29weSBpdCB0byBhIGxvdy1tZW1vcnkKKwkgICBidWZmZXIuICovCisJaWYgKCh1MzIpaXNhX3ZpcnRfdG9fYnVzKHNrYi0+ZGF0YSkgKyBza2ItPmxlbiA+IDB4MDEwMDAwMDApIHsKKwkJaWYgKGxhbmNlX2RlYnVnID4gNSkKKwkJCXByaW50aygiJXM6IGJvdW5jaW5nIGEgaGlnaC1tZW1vcnkgcGFja2V0ICglI3gpLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsICh1MzIpaXNhX3ZpcnRfdG9fYnVzKHNrYi0+ZGF0YSkpOworCQltZW1jcHkoJmxwLT50eF9ib3VuY2VfYnVmZnNbZW50cnldLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJbHAtPnR4X3JpbmdbZW50cnldLmJhc2UgPQorCQkJKCh1MzIpaXNhX3ZpcnRfdG9fYnVzKChscC0+dHhfYm91bmNlX2J1ZmZzICsgZW50cnkpKSAmIDB4ZmZmZmZmKSB8IDB4ODMwMDAwMDA7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9IGVsc2UgeworCQlscC0+dHhfc2tidWZmW2VudHJ5XSA9IHNrYjsKKwkJbHAtPnR4X3JpbmdbZW50cnldLmJhc2UgPSAoKHUzMilpc2FfdmlydF90b19idXMoc2tiLT5kYXRhKSAmIDB4ZmZmZmZmKSB8IDB4ODMwMDAwMDA7CisJfQorCWxwLT5jdXJfdHgrKzsKKworCS8qIFRyaWdnZXIgYW4gaW1tZWRpYXRlIHNlbmQgcG9sbC4gKi8KKwlvdXR3KDB4MDAwMCwgaW9hZGRyK0xBTkNFX0FERFIpOworCW91dHcoMHgwMDQ4LCBpb2FkZHIrTEFOQ0VfREFUQSk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCWlmICgobHAtPmN1cl90eCAtIGxwLT5kaXJ0eV90eCkgPj0gVFhfUklOR19TSVpFKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+ZGV2bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKiBUaGUgTEFOQ0UgaW50ZXJydXB0IGhhbmRsZXIuICovCitzdGF0aWMgaXJxcmV0dXJuX3QKK2xhbmNlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscDsKKwlpbnQgY3NyMCwgaW9hZGRyLCBib2d1c2NudD0xMDsKKwlpbnQgbXVzdF9yZXN0YXJ0OworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayAoImxhbmNlX2ludGVycnVwdCgpOiBpcnEgJWQgZm9yIHVua25vd24gZGV2aWNlLlxuIiwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWxwID0gZGV2LT5wcml2OworCQorCXNwaW5fbG9jayAoJmxwLT5kZXZsb2NrKTsKKworCW91dHcoMHgwMCwgZGV2LT5iYXNlX2FkZHIgKyBMQU5DRV9BRERSKTsKKwl3aGlsZSAoKGNzcjAgPSBpbncoZGV2LT5iYXNlX2FkZHIgKyBMQU5DRV9EQVRBKSkgJiAweDg2MDAKKwkJICAgJiYgLS1ib2d1c2NudCA+PSAwKSB7CisJCS8qIEFja25vd2xlZGdlIGFsbCBvZiB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc291cmNlcyBBU0FQLiAqLworCQlvdXR3KGNzcjAgJiB+MHgwMDRmLCBkZXYtPmJhc2VfYWRkciArIExBTkNFX0RBVEEpOworCisJCW11c3RfcmVzdGFydCA9IDA7CisKKwkJaWYgKGxhbmNlX2RlYnVnID4gNSkKKwkJCXByaW50aygiJXM6IGludGVycnVwdCAgY3NyMD0lIzIuMnggbmV3IGNzcj0lIzIuMnguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgY3NyMCwgaW53KGRldi0+YmFzZV9hZGRyICsgTEFOQ0VfREFUQSkpOworCisJCWlmIChjc3IwICYgMHgwNDAwKQkJCS8qIFJ4IGludGVycnVwdCAqLworCQkJbGFuY2VfcngoZGV2KTsKKworCQlpZiAoY3NyMCAmIDB4MDIwMCkgewkJLyogVHgtZG9uZSBpbnRlcnJ1cHQgKi8KKwkJCWludCBkaXJ0eV90eCA9IGxwLT5kaXJ0eV90eDsKKworCQkJd2hpbGUgKGRpcnR5X3R4IDwgbHAtPmN1cl90eCkgeworCQkJCWludCBlbnRyeSA9IGRpcnR5X3R4ICYgVFhfUklOR19NT0RfTUFTSzsKKwkJCQlpbnQgc3RhdHVzID0gbHAtPnR4X3JpbmdbZW50cnldLmJhc2U7CisJCQkKKwkJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQkJYnJlYWs7CQkJLyogSXQgc3RpbGwgaGFzbid0IGJlZW4gVHhlZCAqLworCisJCQkJbHAtPnR4X3JpbmdbZW50cnldLmJhc2UgPSAwOworCisJCQkJaWYgKHN0YXR1cyAmIDB4NDAwMDAwMDApIHsKKwkJCQkJLyogVGhlcmUgd2FzIGFuIG1ham9yIGVycm9yLCBsb2cgaXQuICovCisJCQkJCWludCBlcnJfc3RhdHVzID0gbHAtPnR4X3JpbmdbZW50cnldLm1pc2M7CisJCQkJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQkJaWYgKGVycl9zdGF0dXMgJiAweDA0MDApIGxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJCQlpZiAoZXJyX3N0YXR1cyAmIDB4MDgwMCkgbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJCWlmIChlcnJfc3RhdHVzICYgMHgxMDAwKSBscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQkJCQlpZiAoZXJyX3N0YXR1cyAmIDB4NDAwMCkgeworCQkJCQkJLyogQWNrayEgIE9uIEZJRk8gZXJyb3JzIHRoZSBUeCB1bml0IGlzIHR1cm5lZCBvZmYhICovCisJCQkJCQlscC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQkJCS8qIFJlbW92ZSB0aGlzIHZlcmJvc2l0eSBsYXRlciEgKi8KKwkJCQkJCXByaW50aygiJXM6IFR4IEZJRk8gZXJyb3IhIFN0YXR1cyAlNC40eC5cbiIsCisJCQkJCQkJICAgZGV2LT5uYW1lLCBjc3IwKTsKKwkJCQkJCS8qIFJlc3RhcnQgdGhlIGNoaXAuICovCisJCQkJCQltdXN0X3Jlc3RhcnQgPSAxOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHN0YXR1cyAmIDB4MTgwMDAwMDApCisJCQkJCQlscC0+c3RhdHMuY29sbGlzaW9ucysrOworCQkJCQlscC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJCX0KKworCQkJCS8qIFdlIG11c3QgZnJlZSB0aGUgb3JpZ2luYWwgc2tiIGlmIGl0J3Mgbm90IGEgZGF0YS1vbmx5IGNvcHkKKwkJCQkgICBpbiB0aGUgYm91bmNlIGJ1ZmZlci4gKi8KKwkJCQlpZiAobHAtPnR4X3NrYnVmZltlbnRyeV0pIHsKKwkJCQkJZGV2X2tmcmVlX3NrYl9pcnEobHAtPnR4X3NrYnVmZltlbnRyeV0pOworCQkJCQlscC0+dHhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCQkJfQorCQkJCWRpcnR5X3R4Kys7CisJCQl9CisKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQkJaWYgKGxwLT5jdXJfdHggLSBkaXJ0eV90eCA+PSBUWF9SSU5HX1NJWkUpIHsKKwkJCQlwcmludGsoIm91dC1vZi1zeW5jIGRpcnR5IHBvaW50ZXIsICVkIHZzLiAlZCwgZnVsbD0lcy5cbiIsCisJCQkJCSAgIGRpcnR5X3R4LCBscC0+Y3VyX3R4LAorCQkJCQkgICBuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgPyAieWVzIiA6ICJubyIpOworCQkJCWRpcnR5X3R4ICs9IFRYX1JJTkdfU0laRTsKKwkJCX0KKyNlbmRpZgorCisJCQkvKiBpZiB0aGUgcmluZyBpcyBubyBsb25nZXIgZnVsbCwgYWNjZXB0IG1vcmUgcGFja2V0cyAqLworCQkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJgorCQkJICAgIGRpcnR5X3R4ID4gbHAtPmN1cl90eCAtIFRYX1JJTkdfU0laRSArIDIpCisJCQkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKworCQkJbHAtPmRpcnR5X3R4ID0gZGlydHlfdHg7CisJCX0KKworCQkvKiBMb2cgbWlzYyBlcnJvcnMuICovCisJCWlmIChjc3IwICYgMHg0MDAwKSBscC0+c3RhdHMudHhfZXJyb3JzKys7IC8qIFR4IGJhYmJsZS4gKi8KKwkJaWYgKGNzcjAgJiAweDEwMDApIGxwLT5zdGF0cy5yeF9lcnJvcnMrKzsgLyogTWlzc2VkIGEgUnggZnJhbWUuICovCisJCWlmIChjc3IwICYgMHgwODAwKSB7CisJCQlwcmludGsoIiVzOiBCdXMgbWFzdGVyIGFyYml0cmF0aW9uIGZhaWx1cmUsIHN0YXR1cyAlNC40eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBjc3IwKTsKKwkJCS8qIFJlc3RhcnQgdGhlIGNoaXAuICovCisJCQltdXN0X3Jlc3RhcnQgPSAxOworCQl9CisKKwkJaWYgKG11c3RfcmVzdGFydCkgeworCQkJLyogc3RvcCB0aGUgY2hpcCB0byBjbGVhciB0aGUgZXJyb3IgY29uZGl0aW9uLCB0aGVuIHJlc3RhcnQgKi8KKwkJCW91dHcoMHgwMDAwLCBkZXYtPmJhc2VfYWRkciArIExBTkNFX0FERFIpOworCQkJb3V0dygweDAwMDQsIGRldi0+YmFzZV9hZGRyICsgTEFOQ0VfREFUQSk7CisJCQlsYW5jZV9yZXN0YXJ0KGRldiwgMHgwMDAyLCAwKTsKKwkJfQorCX0KKworCS8qIENsZWFyIGFueSBvdGhlciBpbnRlcnJ1cHQsIGFuZCBzZXQgaW50ZXJydXB0IGVuYWJsZS4gKi8KKwlvdXR3KDB4MDAwMCwgZGV2LT5iYXNlX2FkZHIgKyBMQU5DRV9BRERSKTsKKwlvdXR3KDB4Nzk0MCwgZGV2LT5iYXNlX2FkZHIgKyBMQU5DRV9EQVRBKTsKKworCWlmIChsYW5jZV9kZWJ1ZyA+IDQpCisJCXByaW50aygiJXM6IGV4aXRpbmcgaW50ZXJydXB0LCBjc3IlZD0lIzQuNHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpbncoaW9hZGRyICsgTEFOQ0VfQUREUiksCisJCQkgICBpbncoZGV2LT5iYXNlX2FkZHIgKyBMQU5DRV9EQVRBKSk7CisKKwlzcGluX3VubG9jayAoJmxwLT5kZXZsb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQKK2xhbmNlX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCWludCBlbnRyeSA9IGxwLT5jdXJfcnggJiBSWF9SSU5HX01PRF9NQVNLOworCWludCBpOworCQkKKwkvKiBJZiB3ZSBvd24gdGhlIG5leHQgZW50cnksIGl0J3MgYSBuZXcgcGFja2V0LiBTZW5kIGl0IHVwLiAqLworCXdoaWxlIChscC0+cnhfcmluZ1tlbnRyeV0uYmFzZSA+PSAwKSB7CisJCWludCBzdGF0dXMgPSBscC0+cnhfcmluZ1tlbnRyeV0uYmFzZSA+PiAyNDsKKworCQlpZiAoc3RhdHVzICE9IDB4MDMpIHsJCQkvKiBUaGVyZSB3YXMgYW4gZXJyb3IuICovCisJCQkvKiBUaGVyZSBpcyBhIHRyaWNreSBlcnJvciBub3RlZCBieSBKb2huIE11cnBoeSwKKwkJCSAgIDxtdXJmQHBlcmZ0ZWNoLmNvbT4gdG8gUnVzcyBOZWxzb246IEV2ZW4gd2l0aCBmdWxsLXNpemVkCisJCQkgICBidWZmZXJzIGl0J3MgcG9zc2libGUgZm9yIGEgamFiYmVyIHBhY2tldCB0byB1c2UgdHdvCisJCQkgICBidWZmZXJzLCB3aXRoIG9ubHkgdGhlIGxhc3QgY29ycmVjdGx5IG5vdGluZyB0aGUgZXJyb3IuICovCisJCQlpZiAoc3RhdHVzICYgMHgwMSkJLyogT25seSBjb3VudCBhIGdlbmVyYWwgZXJyb3IgYXQgdGhlICovCisJCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOyAvKiBlbmQgb2YgYSBwYWNrZXQuKi8KKwkJCWlmIChzdGF0dXMgJiAweDIwKSBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgMHgxMCkgbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgMHgwOCkgbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiAweDA0KSBscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCWxwLT5yeF9yaW5nW2VudHJ5XS5iYXNlICY9IDB4MDNmZmZmZmY7CisJCX0KKwkJZWxzZSAKKwkJeworCQkJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIsIGNvbXBhdGlibGUgd2l0aCBuZXQzLiAqLworCQkJc2hvcnQgcGt0X2xlbiA9IChscC0+cnhfcmluZ1tlbnRyeV0ubXNnX2xlbmd0aCAmIDB4ZmZmKS00OworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCQorCQkJaWYocGt0X2xlbjw2MCkKKwkJCXsKKwkJCQlwcmludGsoIiVzOiBSdW50IHBhY2tldCFcbiIsZGV2LT5uYW1lKTsKKwkJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKzIpOworCQkJCWlmIChza2IgPT0gTlVMTCkgCisJCQkJeworCQkJCQlwcmludGsoIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZGVmZXJyaW5nIHBhY2tldC5cbiIsIGRldi0+bmFtZSk7CisJCQkJCWZvciAoaT0wOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCisJCQkJCQlpZiAobHAtPnJ4X3JpbmdbKGVudHJ5K2kpICYgUlhfUklOR19NT0RfTUFTS10uYmFzZSA8IDApCisJCQkJCQkJYnJlYWs7CisKKwkJCQkJaWYgKGkgPiBSWF9SSU5HX1NJWkUgLTIpIAorCQkJCQl7CisJCQkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCQkJbHAtPnJ4X3JpbmdbZW50cnldLmJhc2UgfD0gMHg4MDAwMDAwMDsKKwkJCQkJCWxwLT5jdXJfcngrKzsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLDIpOwkvKiAxNiBieXRlIGFsaWduICovCisJCQkJc2tiX3B1dChza2IscGt0X2xlbik7CS8qIE1ha2Ugcm9vbSAqLworCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLAorCQkJCQkodW5zaWduZWQgY2hhciAqKWlzYV9idXNfdG9fdmlydCgobHAtPnJ4X3JpbmdbZW50cnldLmJhc2UgJiAweDAwZmZmZmZmKSksCisJCQkJCXBrdF9sZW4sMCk7CisJCQkJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJCQluZXRpZl9yeChza2IpOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlscC0+c3RhdHMucnhfYnl0ZXMrPXBrdF9sZW47CisJCQl9CisJCX0KKwkJLyogVGhlIGRvY3Mgc2F5IHRoYXQgdGhlIGJ1ZmZlciBsZW5ndGggaXNuJ3QgdG91Y2hlZCwgYnV0IEFuZHJldyBCb3lkCisJCSAgIG9mIFFOWCByZXBvcnRzIHRoYXQgc29tZSByZXZzIG9mIHRoZSA3OUM5NjUgY2xlYXIgaXQuICovCisJCWxwLT5yeF9yaW5nW2VudHJ5XS5idWZfbGVuZ3RoID0gLVBLVF9CVUZfU1o7CisJCWxwLT5yeF9yaW5nW2VudHJ5XS5iYXNlIHw9IDB4ODAwMDAwMDA7CisJCWVudHJ5ID0gKCsrbHAtPmN1cl9yeCkgJiBSWF9SSU5HX01PRF9NQVNLOworCX0KKworCS8qIFdlIHNob3VsZCBjaGVjayB0aGF0IGF0IGxlYXN0IHR3byByaW5nIGVudHJpZXMgYXJlIGZyZWUuCSBJZiBub3QsCisJICAgd2Ugc2hvdWxkIGZyZWUgb25lIGFuZCBtYXJrIHN0YXRzLT5yeF9kcm9wcGVkKysuICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbGFuY2VfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworCWlmIChjaGlwX3RhYmxlW2xwLT5jaGlwX3ZlcnNpb25dLmZsYWdzICYgTEFOQ0VfSEFTX01JU1NFRF9GUkFNRSkgeworCQlvdXR3KDExMiwgaW9hZGRyK0xBTkNFX0FERFIpOworCQlscC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IGludyhpb2FkZHIrTEFOQ0VfREFUQSk7CisJfQorCW91dHcoMCwgaW9hZGRyK0xBTkNFX0FERFIpOworCisJaWYgKGxhbmNlX2RlYnVnID4gMSkKKwkJcHJpbnRrKCIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQsIHN0YXR1cyB3YXMgJTIuMnguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpbncoaW9hZGRyK0xBTkNFX0RBVEEpKTsKKworCS8qIFdlIHN0b3AgdGhlIExBTkNFIGhlcmUgLS0gaXQgb2NjYXNpb25hbGx5IHBvbGxzCisJICAgbWVtb3J5IGlmIHdlIGRvbid0LiAqLworCW91dHcoMHgwMDA0LCBpb2FkZHIrTEFOQ0VfREFUQSk7CisKKwlpZiAoZGV2LT5kbWEgIT0gNCkKKwl7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwkJZGlzYWJsZV9kbWEoZGV2LT5kbWEpOworCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwl9CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlsYW5jZV9wdXJnZV9yaW5nKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpsYW5jZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisKKwlpZiAoY2hpcF90YWJsZVtscC0+Y2hpcF92ZXJzaW9uXS5mbGFncyAmIExBTkNFX0hBU19NSVNTRURfRlJBTUUpIHsKKwkJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJCXNob3J0IHNhdmVkX2FkZHI7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5kZXZsb2NrLCBmbGFncyk7CisJCXNhdmVkX2FkZHIgPSBpbncoaW9hZGRyK0xBTkNFX0FERFIpOworCQlvdXR3KDExMiwgaW9hZGRyK0xBTkNFX0FERFIpOworCQlscC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IGludyhpb2FkZHIrTEFOQ0VfREFUQSk7CisJCW91dHcoc2F2ZWRfYWRkciwgaW9hZGRyK0xBTkNFX0FERFIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+ZGV2bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiAmbHAtPnN0YXRzOworfQorCisvKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAqLworCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW91dHcoMCwgaW9hZGRyK0xBTkNFX0FERFIpOworCW91dHcoMHgwMDA0LCBpb2FkZHIrTEFOQ0VfREFUQSk7IC8qIFRlbXBvcmFyaWx5IHN0b3AgdGhlIGxhbmNlLgkgKi8KKworCWlmIChkZXYtPmZsYWdzJklGRl9QUk9NSVNDKSB7CisJCS8qIExvZyBhbnkgbmV0IHRhcHMuICovCisJCXByaW50aygiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CisJCW91dHcoMTUsIGlvYWRkcitMQU5DRV9BRERSKTsKKwkJb3V0dygweDgwMDAsIGlvYWRkcitMQU5DRV9EQVRBKTsgLyogU2V0IHByb21pc2N1b3VzIG1vZGUgKi8KKwl9IGVsc2UgeworCQlzaG9ydCBtdWx0aWNhc3RfdGFibGVbNF07CisJCWludCBpOworCQlpbnQgbnVtX2FkZHJzPWRldi0+bWNfY291bnQ7CisJCWlmKGRldi0+ZmxhZ3MmSUZGX0FMTE1VTFRJKQorCQkJbnVtX2FkZHJzPTE7CisJCS8qIEZJWElUOiBXZSBkb24ndCB1c2UgdGhlIG11bHRpY2FzdCB0YWJsZSwgYnV0IHJlbHkgb24gdXBwZXItbGF5ZXIgZmlsdGVyaW5nLiAqLworCQltZW1zZXQobXVsdGljYXN0X3RhYmxlLCAobnVtX2FkZHJzID09IDApID8gMCA6IC0xLCBzaXplb2YobXVsdGljYXN0X3RhYmxlKSk7CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCW91dHcoOCArIGksIGlvYWRkcitMQU5DRV9BRERSKTsKKwkJCW91dHcobXVsdGljYXN0X3RhYmxlW2ldLCBpb2FkZHIrTEFOQ0VfREFUQSk7CisJCX0KKwkJb3V0dygxNSwgaW9hZGRyK0xBTkNFX0FERFIpOworCQlvdXR3KDB4MDAwMCwgaW9hZGRyK0xBTkNFX0RBVEEpOyAvKiBVbnNldCBwcm9taXNjdW91cyBtb2RlICovCisJfQorCisJbGFuY2VfcmVzdGFydChkZXYsIDB4MDE0MiwgMCk7IC8qICBSZXN1bWUgbm9ybWFsIG9wZXJhdGlvbiAqLworCit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xhc2lfODI1OTYuYyBiL2RyaXZlcnMvbmV0L2xhc2lfODI1OTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTI2M2ZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbGFzaV84MjU5Ni5jCkBAIC0wLDAgKzEsMTYwNyBAQAorLyogbGFzaV84MjU5Ni5jIC0tIGRyaXZlciBmb3IgdGhlIGludGVsIDgyNTk2IGV0aGVybmV0IGNvbnRyb2xsZXIsIGFzCisgICBtdW5nZWQgaW50byBIUFBBIGJveGVuIC4KKworICAgVGhpcyBkcml2ZXIgaXMgYmFzZWQgdXBvbiA4MjU5Ni5jLCBvcmlnaW5hbCBjcmVkaXRzIGFyZSBiZWxvdy4uLgorICAgYnV0IHRoZXJlIHdlcmUgdG9vIG1hbnkgaG9vcHMgd2hpY2ggSFAgd2FudHMganVtcGVkIHRocm91Z2ggdG8KKyAgIGtlZXAgdGhpcyBjb2RlIGluIHRoZXJlIGluIGEgc2FuZSBtYW5uZXIuCisKKyAgIDMgcHJpbWFyeSBzb3VyY2VzIG9mIHRoZSBtZXNzIC0tIAorICAgMSkgaHBwYSBuZWVkcyAqbG90cyogb2YgY2FjaGVsaW5lIGZsdXNoaW5nIHRvIGtlZXAgdGhpcyBraW5kIG9mCisgICBNTUlPIHJ1bm5pbmcuCisKKyAgIDIpIFRoZSA4MjU5NiBuZWVkcyB0byBzZWUgYWxsIG9mIGl0cyBwb2ludGVycyBhcyB0aGVpciBwaHlzaWNhbAorICAgYWRkcmVzcy4gIFRodXMgdmlydF90b19idXMvYnVzX3RvX3ZpcnQgYXJlICpldmVyeXdoZXJlKi4KKworICAgMykgVGhlIGltcGxlbWVudGF0aW9uIEhQIGlzIHVzaW5nIHNlZW1zIHRvIGJlIHNpZ25pZmljYW50bHkgcGlja2llciAKKyAgIGFib3V0IHdoZW4gYW5kIGhvdyB0aGUgY29tbWFuZCBhbmQgUlggdW5pdHMgYXJlIHN0YXJ0ZWQuICBzb21lCisgICBjb21tYW5kIG9yZGVyaW5nIHdhcyBjaGFuZ2VkLgorCisgICBFeGFtaW5hdGlvbiBvZiB0aGUgbWFjaCBkcml2ZXIgbGVhZHMgb25lIHRvIGJlbGlldmUgdGhhdCB0aGVyZQorICAgbWlnaHQgYmUgYSBzYW5lciB3YXkgdG8gcHVsbCB0aGlzIG9mZi4uLiAgYW55b25lIHdobyBmZWVscyBsaWtlIGEKKyAgIGZ1bGwgcmV3cml0ZSBjYW4gYmUgbXkgZ3Vlc3QuCisKKyAgIFNwbGl0IDAyLzEzLzIwMDAgU2FtIENyZWFzZXkgKHNhbW15QG9oLnZlcmlvLmNvbSkKKyAgIAorICAgMDIvMDEvMjAwMCAgSW5pdGlhbCBtb2RpZmljYXRpb25zIGZvciBwYXJpc2MgYnkgSGVsZ2UgRGVsbGVyIChkZWxsZXJAZ214LmRlKQorICAgMDMvMDIvMjAwMCAgY2hhbmdlcyBmb3IgYmV0dGVyL2NvcnJlY3QoPykgY2FjaGUtZmx1c2hpbmcgKGRlbGxlcikKKyovCisKKy8qIDgyNTk2LmM6IEEgZ2VuZXJpYyA4MjU5NiBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4LiAqLworLyoKKyAgIEJhc2VkIG9uIEFwcmljb3QuYworICAgV3JpdHRlbiAxOTk0IGJ5IE1hcmsgRXZhbnMuCisgICBUaGlzIGRyaXZlciBpcyBmb3IgdGhlIEFwcmljb3QgODI1OTYgYnVzLW1hc3RlciBpbnRlcmZhY2UKKworICAgTW9kdWxhcmlzZWQgMTIvOTQgTWFyayBFdmFucworCisKKyAgIE1vZGlmaWVkIHRvIHN1cHBvcnQgdGhlIDgyNTk2IGV0aGVybmV0IGNoaXBzIG9uIDY4MHgwIFZNRSBib2FyZHMuCisgICBieSBSaWNoYXJkIEhpcnN0IDxyaWNoYXJkQHNsZWVwaWUuZGVtb24uY28udWs+CisgICBSZW5hbWVkIHRvIGJlIDgyNTk2LmMKKworICAgOTgwODI1OiAgQ2hhbmdlZCB0byByZWNlaXZlIGRpcmVjdGx5IGluIHRvIHNrX2J1ZmZzIHdoaWNoIGFyZQorICAgYWxsb2NhdGVkIGF0IG9wZW4oKSB0aW1lLiAgRWxpbWluYXRlcyBjb3B5IG9uIGluY29taW5nIGZyYW1lcworICAgKHNtYWxsIG9uZXMgYXJlIHN0aWxsIGNvcGllZCkuICBTaGFyZWQgZGF0YSBub3cgaGVsZCBpbiBhCisgICBub24tY2FjaGVkIHBhZ2UsIHNvIHdlIGNhbiBydW4gb24gNjgwNjAgaW4gY29weWJhY2sgbW9kZS4KKworICAgVEJEOgorICAgKiBsb29rIGF0IGRlZmVycmluZyByeCBmcmFtZXMgcmF0aGVyIHRoYW4gZGlzY2FyZGluZyAoYXMgcGVyIHR1bGlwKQorICAgKiBoYW5kbGUgdHggcmluZyBmdWxsIGFzIHBlciB0dWxpcAorICAgKiBwZXJmb3JtYWNlIHRlc3QgdG8gdHVuZSByeF9jb3B5YnJlYWsKKworICAgTW9zdCBvZiBteSBtb2RpZmljYXRpb25zIHJlbGF0ZSB0byB0aGUgYnJhaW5kZWFkIGJpZy1lbmRpYW4KKyAgIGltcGxlbWVudGF0aW9uIGJ5IEludGVsLiAgV2hlbiB0aGUgaTU5NiBpcyBvcGVyYXRpbmcgaW4KKyAgICdiaWctZW5kaWFuJyBtb2RlLCBpdCB0aGlua3MgYSAzMiBiaXQgdmFsdWUgb2YgMHgxMjM0NTY3OAorICAgc2hvdWxkIGJlIHN0b3JlZCBhcyAweDU2NzgxMjM0LiAgVGhpcyBpcyBhIHJlYWwgcGFpbiwgd2hlbgorICAgeW91IGhhdmUgbGlua2VkIGxpc3RzIHdoaWNoIGFyZSBzaGFyZWQgYnkgdGhlIDY4MHgwIGFuZCB0aGUKKyAgIGk1OTYuCisKKyAgIERyaXZlciBza2VsZXRvbgorICAgV3JpdHRlbiAxOTkzIGJ5IERvbmFsZCBCZWNrZXIuCisgICBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlIERpcmVjdG9yLAorICAgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LiBUaGlzIHNvZnR3YXJlIG1heSBvbmx5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkCisgICBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBtb2RpZmllZCBieSBTUkMsCisgICBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworICAgVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKyAgIFNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbiwgNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAsIEFubmFwb2xpcyBNRCAyMTQwMworCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9wZGMuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vcGFyaXNjLWRldmljZS5oPgorCisjZGVmaW5lIExBU0lfODI1OTZfRFJJVkVSX1ZFUlNJT04gIkxBU0kgODI1OTYgZHJpdmVyIC0gUmV2aXNpb246IDEuMzAiCisKKy8qIERFQlVHIGZsYWdzCisgKi8KKworI2RlZmluZSBERUJfSU5JVAkweDAwMDEKKyNkZWZpbmUgREVCX1BST0JFCTB4MDAwMgorI2RlZmluZSBERUJfU0VSSU9VUwkweDAwMDQKKyNkZWZpbmUgREVCX0VSUk9SUwkweDAwMDgKKyNkZWZpbmUgREVCX01VTFRJCTB4MDAxMAorI2RlZmluZSBERUJfVERSCQkweDAwMjAKKyNkZWZpbmUgREVCX09QRU4JMHgwMDQwCisjZGVmaW5lIERFQl9SRVNFVAkweDAwODAKKyNkZWZpbmUgREVCX0FERENNRAkweDAxMDAKKyNkZWZpbmUgREVCX1NUQVRVUwkweDAyMDAKKyNkZWZpbmUgREVCX1NUQVJUVFgJMHgwNDAwCisjZGVmaW5lIERFQl9SWEFERFIJMHgwODAwCisjZGVmaW5lIERFQl9UWEFERFIJMHgxMDAwCisjZGVmaW5lIERFQl9SWEZSQU1FCTB4MjAwMAorI2RlZmluZSBERUJfSU5UUwkweDQwMDAKKyNkZWZpbmUgREVCX1NUUlVDVAkweDgwMDAKKyNkZWZpbmUgREVCX0FOWQkJMHhmZmZmCisKKworI2RlZmluZSBERUIoeCx5KQlpZiAoaTU5Nl9kZWJ1ZyAmICh4KSkgeyB5OyB9CisKKworI2RlZmluZSAgQ0hFQ0tfV0JBQ0soYWRkcixsZW4pIFwKKwlkbyB7IGRtYV9jYWNoZV9zeW5jKCh2b2lkICopYWRkciwgbGVuLCBETUFfVE9fREVWSUNFKTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSAgQ0hFQ0tfSU5WKGFkZHIsbGVuKSBcCisJZG8geyBkbWFfY2FjaGVfc3luYygodm9pZCAqKWFkZHIsIGxlbiwgRE1BX0ZST01fREVWSUNFKTsgfSB3aGlsZSgwKQorCisjZGVmaW5lICBDSEVDS19XQkFDS19JTlYoYWRkcixsZW4pIFwKKwlkbyB7IGRtYV9jYWNoZV9zeW5jKCh2b2lkICopYWRkciwgbGVuLCBETUFfQklESVJFQ1RJT05BTCk7IH0gd2hpbGUgKDApCisKKworI2RlZmluZSBQQV9JODI1OTZfUkVTRVQJCTAJLyogT2Zmc2V0cyByZWxhdGl2ZSB0byBMQVNJLUxBTi1BZGRyLiovCisjZGVmaW5lIFBBX0NQVV9QT1JUX0xfQUNDRVNTCTQKKyNkZWZpbmUgUEFfQ0hBTk5FTF9BVFRFTlRJT04JOAorCisKKy8qCisgKiBEZWZpbmUgdmFyaW91cyBtYWNyb3MgZm9yIENoYW5uZWwgQXR0ZW50aW9uLCB3b3JkIHN3YXBwaW5nIGV0Yy4sIGRlcGVuZGVudAorICogb24gYXJjaGl0ZWN0dXJlLiAgTVZNRSBhbmQgQlZNRSBhcmUgNjgweDAgYmFzZWQsIG90aGVyd2lzZSBpdCBpcyBJbnRlbC4KKyAqLworCisjaWZkZWYgX19CSUdfRU5ESUFOCisjZGVmaW5lIFdTV0FQcmZkKHgpICAoKCh1MzIpKHgpPDwxNikgfCAoKCgodTMyKSh4KSkpPj4xNikpCisjZGVmaW5lIFdTV0FQcmJkKHgpICAoKCh1MzIpKHgpPDwxNikgfCAoKCgodTMyKSh4KSkpPj4xNikpCisjZGVmaW5lIFdTV0FQaXNjcCh4KSAoKCh1MzIpKHgpPDwxNikgfCAoKCgodTMyKSh4KSkpPj4xNikpCisjZGVmaW5lIFdTV0FQc2NiKHgpICAoKCh1MzIpKHgpPDwxNikgfCAoKCgodTMyKSh4KSkpPj4xNikpCisjZGVmaW5lIFdTV0FQY21kKHgpICAoKCh1MzIpKHgpPDwxNikgfCAoKCgodTMyKSh4KSkpPj4xNikpCisjZGVmaW5lIFdTV0FQdGJkKHgpICAoKCh1MzIpKHgpPDwxNikgfCAoKCgodTMyKSh4KSkpPj4xNikpCisjZGVmaW5lIFdTV0FQY2hhcih4KSAoKCh1MzIpKHgpPDwxNikgfCAoKCgodTMyKSh4KSkpPj4xNikpCisjZGVmaW5lIElTQ1BfQlVTWQkweDAwMDEwMDAwCisjZGVmaW5lIE1BQ0hfSVNfQVBSSUNPVAkwCisjZWxzZQorI2RlZmluZSBXU1dBUHJmZCh4KSAgICAgKChzdHJ1Y3QgaTU5Nl9yZmQgKikoeCkpCisjZGVmaW5lIFdTV0FQcmJkKHgpICAgICAoKHN0cnVjdCBpNTk2X3JiZCAqKSh4KSkKKyNkZWZpbmUgV1NXQVBpc2NwKHgpICAgICgoc3RydWN0IGk1OTZfaXNjcCAqKSh4KSkKKyNkZWZpbmUgV1NXQVBzY2IoeCkgICAgICgoc3RydWN0IGk1OTZfc2NiICopKHgpKQorI2RlZmluZSBXU1dBUGNtZCh4KSAgICAgKChzdHJ1Y3QgaTU5Nl9jbWQgKikoeCkpCisjZGVmaW5lIFdTV0FQdGJkKHgpICAgICAoKHN0cnVjdCBpNTk2X3RiZCAqKSh4KSkKKyNkZWZpbmUgV1NXQVBjaGFyKHgpICAgICgoY2hhciAqKSh4KSkKKyNkZWZpbmUgSVNDUF9CVVNZCTB4MDAwMQorI2RlZmluZSBNQUNIX0lTX0FQUklDT1QJMQorI2VuZGlmCisKKy8qCisgKiBUaGUgTVBVX1BPUlQgY29tbWFuZCBhbGxvd3MgZGlyZWN0IGFjY2VzcyB0byB0aGUgODI1OTYuIFdpdGggUE9SVCBhY2Nlc3MKKyAqIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGF2YWlsYWJsZSAocDUtMTgpLiBUaGUgMzItYml0IHBvcnQgY29tbWFuZAorICogbXVzdCBiZSB3b3JkLXN3YXBwZWQgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudCB3b3JkIHdyaXR0ZW4gZmlyc3QuCisgKiBUaGlzIG9ubHkgYXBwbGllcyB0byBWTUUgYm9hcmRzLgorICovCisjZGVmaW5lIFBPUlRfUkVTRVQJCTB4MDAJLyogcmVzZXQgODI1OTYgKi8KKyNkZWZpbmUgUE9SVF9TRUxGVEVTVAkJMHgwMQkvKiBzZWxmdGVzdCAqLworI2RlZmluZSBQT1JUX0FMVFNDUAkJMHgwMgkvKiBhbHRlcm5hdGUgU0NCIGFkZHJlc3MgKi8KKyNkZWZpbmUgUE9SVF9BTFREVU1QCQkweDAzCS8qIEFsdGVybmF0ZSBEVU1QIGFkZHJlc3MgKi8KKworc3RhdGljIGludCBpNTk2X2RlYnVnID0gKERFQl9TRVJJT1VTfERFQl9QUk9CRSk7ICAKKworTU9EVUxFX0FVVEhPUigiUmljaGFyZCBIaXJzdCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpODI1OTYgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfUEFSTShpNTk2X2RlYnVnLCAiaSIpOworTU9EVUxFX1BBUk1fREVTQyhpNTk2X2RlYnVnLCAibGFzaV84MjU5NiBkZWJ1ZyBtYXNrIik7CisKKy8qIENvcHkgZnJhbWVzIHNob3J0ZXIgdGhhbiByeF9jb3B5YnJlYWssIG90aGVyd2lzZSBwYXNzIG9uIHVwIGluCisgKiBhIGZ1bGwgc2l6ZWQgc2tfYnVmZi4gIFZhbHVlIG9mIDEwMCBzdG9sZW4gZnJvbSB0dWxpcC5jICghYWxwaGEpLgorICovCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhayA9IDEwMDsKKworI2RlZmluZSBNQVhfRFJJVkVSUwk0CS8qIG1heCBjb3VudCBvZiBkcml2ZXJzICovCisKKyNkZWZpbmUgUEtUX0JVRl9TWgkxNTM2CisjZGVmaW5lIE1BWF9NQ19DTlQJNjQKKworI2RlZmluZSBJNTk2X05VTEwgKCh1MzIpMHhmZmZmZmZmZikKKworI2RlZmluZSBDTURfRU9MCQkweDgwMDAJLyogVGhlIGxhc3QgY29tbWFuZCBvZiB0aGUgbGlzdCwgc3RvcC4gKi8KKyNkZWZpbmUgQ01EX1NVU1AJMHg0MDAwCS8qIFN1c3BlbmQgYWZ0ZXIgZG9pbmcgY21kLiAqLworI2RlZmluZSBDTURfSU5UUgkweDIwMDAJLyogSW50ZXJydXB0IGFmdGVyIGRvaW5nIGNtZC4gKi8KKworI2RlZmluZSBDTURfRkxFWAkweDAwMDgJLyogRW5hYmxlIGZsZXhpYmxlIG1lbW9yeSBtb2RlbCAqLworCitlbnVtIGNvbW1hbmRzIHsKKwlDbWROT3AgPSAwLCBDbWRTQVNldHVwID0gMSwgQ21kQ29uZmlndXJlID0gMiwgQ21kTXVsdGljYXN0TGlzdCA9IDMsCisJQ21kVHggPSA0LCBDbWRURFIgPSA1LCBDbWREdW1wID0gNiwgQ21kRGlhZ25vc2UgPSA3Cit9OworCisjZGVmaW5lIFNUQVRfQwkJMHg4MDAwCS8qIFNldCB0byAwIGFmdGVyIGV4ZWN1dGlvbiAqLworI2RlZmluZSBTVEFUX0IJCTB4NDAwMAkvKiBDb21tYW5kIGJlaW5nIGV4ZWN1dGVkICovCisjZGVmaW5lIFNUQVRfT0sJCTB4MjAwMAkvKiBDb21tYW5kIGV4ZWN1dGVkIG9rICovCisjZGVmaW5lIFNUQVRfQQkJMHgxMDAwCS8qIENvbW1hbmQgYWJvcnRlZCAqLworCisjZGVmaW5lCSBDVUNfU1RBUlQJMHgwMTAwCisjZGVmaW5lCSBDVUNfUkVTVU1FCTB4MDIwMAorI2RlZmluZQkgQ1VDX1NVU1BFTkQgICAgMHgwMzAwCisjZGVmaW5lCSBDVUNfQUJPUlQJMHgwNDAwCisjZGVmaW5lCSBSWF9TVEFSVAkweDAwMTAKKyNkZWZpbmUJIFJYX1JFU1VNRQkweDAwMjAKKyNkZWZpbmUJIFJYX1NVU1BFTkQJMHgwMDMwCisjZGVmaW5lCSBSWF9BQk9SVAkweDAwNDAKKworI2RlZmluZSBUWF9USU1FT1VUCTUKKworI2RlZmluZSBPUFRfU1dBUF9QT1JUCTB4MDAwMQkvKiBOZWVkIHRvIHdvcmRzd3Agb24gdGhlIE1QVSBwb3J0ICovCisKKworc3RydWN0IGk1OTZfcmVnIHsKKwl1bnNpZ25lZCBzaG9ydCBwb3J0aGk7CisJdW5zaWduZWQgc2hvcnQgcG9ydGxvOworCXUzMiAgICAgICAgICAgIGNhOworfTsKKworI2RlZmluZSBFT0YJCTB4ODAwMAorI2RlZmluZSBTSVpFX01BU0sJMHgzZmZmCisKK3N0cnVjdCBpNTk2X3RiZCB7CisJdW5zaWduZWQgc2hvcnQgc2l6ZTsKKwl1bnNpZ25lZCBzaG9ydCBwYWQ7CisJZG1hX2FkZHJfdCAgICAgbmV4dDsKKwlkbWFfYWRkcl90ICAgICBkYXRhOworCXUzMiBjYWNoZV9wYWRbNV07CQkvKiBUb3RhbCAzMiBieXRlcy4uLiAqLworfTsKKworLyogVGhlIGNvbW1hbmQgc3RydWN0dXJlIGhhcyB0d28gJ25leHQnIHBvaW50ZXJzOyB2X25leHQgaXMgdGhlIGFkZHJlc3Mgb2YKKyAqIHRoZSBuZXh0IGNvbW1hbmQgYXMgc2VlbiBieSB0aGUgQ1BVLCBiX25leHQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIG5leHQKKyAqIGNvbW1hbmQgYXMgc2VlbiBieSB0aGUgODI1OTYuICBUaGUgYl9uZXh0IHBvaW50ZXIsIGFzIHVzZWQgYnkgdGhlIDgyNTk2CisgKiBhbHdheXMgcmVmZXJlbmNlcyB0aGUgc3RhdHVzIGZpZWxkIG9mIHRoZSBuZXh0IGNvbW1hbmQsIHJhdGhlciB0aGFuIHRoZQorICogdl9uZXh0IGZpZWxkLCBiZWNhdXNlIHRoZSA4MjU5NiBpcyB1bmF3YXJlIG9mIHZfbmV4dC4gIEl0IG1heSBzZWVtIG1vcmUKKyAqIGxvZ2ljYWwgdG8gcHV0IHZfbmV4dCBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUsIGJ1dCB3ZSBjYW5ub3QgZG8gdGhhdAorICogYmVjYXVzZSB0aGUgODI1OTYgZXhwZWN0cyBvdGhlciBmaWVsZHMgdG8gYmUgdGhlcmUsIGRlcGVuZGluZyBvbiBjb21tYW5kCisgKiB0eXBlLgorICovCisKK3N0cnVjdCBpNTk2X2NtZCB7CisJc3RydWN0IGk1OTZfY21kICp2X25leHQ7CS8qIEFkZHJlc3MgZnJvbSBDUFVzIHZpZXdwb2ludCAqLworCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKKwl1bnNpZ25lZCBzaG9ydCBjb21tYW5kOworCWRtYV9hZGRyX3QgICAgIGJfbmV4dDsJLyogQWRkcmVzcyBmcm9tIGk1OTYgdmlld3BvaW50ICovCit9OworCitzdHJ1Y3QgdHhfY21kIHsKKwlzdHJ1Y3QgaTU5Nl9jbWQgY21kOworCWRtYV9hZGRyX3QgICAgIHRiZDsKKwl1bnNpZ25lZCBzaG9ydCBzaXplOworCXVuc2lnbmVkIHNob3J0IHBhZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwkJLyogU28gd2UgY2FuIGZyZWUgaXQgYWZ0ZXIgdHggKi8KKwlkbWFfYWRkcl90IGRtYV9hZGRyOworI2lmZGVmIF9fTFA2NF9fCisJdTMyIGNhY2hlX3BhZFs2XTsJCS8qIFRvdGFsIDY0IGJ5dGVzLi4uICovCisjZWxzZSAgICAKKwl1MzIgY2FjaGVfcGFkWzFdOwkJLyogVG90YWwgMzIgYnl0ZXMuLi4gKi8KKyNlbmRpZiAgICAKK307CisKK3N0cnVjdCB0ZHJfY21kIHsKKwlzdHJ1Y3QgaTU5Nl9jbWQgY21kOworCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKKwl1bnNpZ25lZCBzaG9ydCBwYWQ7Cit9OworCitzdHJ1Y3QgbWNfY21kIHsKKwlzdHJ1Y3QgaTU5Nl9jbWQgY21kOworCXNob3J0IG1jX2NudDsKKwljaGFyIG1jX2FkZHJzW01BWF9NQ19DTlQqNl07Cit9OworCitzdHJ1Y3Qgc2FfY21kIHsKKwlzdHJ1Y3QgaTU5Nl9jbWQgY21kOworCWNoYXIgZXRoX2FkZHJbOF07Cit9OworCitzdHJ1Y3QgY2ZfY21kIHsKKwlzdHJ1Y3QgaTU5Nl9jbWQgY21kOworCWNoYXIgaTU5Nl9jb25maWdbMTZdOworfTsKKworc3RydWN0IGk1OTZfcmZkIHsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0OworCXVuc2lnbmVkIHNob3J0IGNtZDsKKwlkbWFfYWRkcl90ICAgICBiX25leHQ7CS8qIEFkZHJlc3MgZnJvbSBpNTk2IHZpZXdwb2ludCAqLworCWRtYV9hZGRyX3QgICAgIHJiZDsKKwl1bnNpZ25lZCBzaG9ydCBjb3VudDsKKwl1bnNpZ25lZCBzaG9ydCBzaXplOworCXN0cnVjdCBpNTk2X3JmZCAqdl9uZXh0OwkvKiBBZGRyZXNzIGZyb20gQ1BVcyB2aWV3cG9pbnQgKi8KKwlzdHJ1Y3QgaTU5Nl9yZmQgKnZfcHJldjsKKyNpZm5kZWYgX19MUDY0X18gICAgCisJdTMyIGNhY2hlX3BhZFsyXTsJCS8qIFRvdGFsIDMyIGJ5dGVzLi4uICovCisjZW5kaWYgICAgCit9OworCitzdHJ1Y3QgaTU5Nl9yYmQgeworICAgIC8qIGhhcmR3YXJlIGRhdGEgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBjb3VudDsKKyAgICB1bnNpZ25lZCBzaG9ydCB6ZXJvMTsKKyAgICBkbWFfYWRkcl90ICAgICBiX25leHQ7CisgICAgZG1hX2FkZHJfdCAgICAgYl9kYXRhOwkJLyogQWRkcmVzcyBmcm9tIGk1OTYgdmlld3BvaW50ICovCisgICAgdW5zaWduZWQgc2hvcnQgc2l6ZTsKKyAgICB1bnNpZ25lZCBzaG9ydCB6ZXJvMjsKKyAgICAvKiBkcml2ZXIgZGF0YSAqLworICAgIHN0cnVjdCBza19idWZmICpza2I7CisgICAgc3RydWN0IGk1OTZfcmJkICp2X25leHQ7CisgICAgZG1hX2FkZHJfdCAgICAgYl9hZGRyOwkJLyogVGhpcyByYmQgYWRkciBmcm9tIGk1OTYgdmlldyAqLworICAgIHVuc2lnbmVkIGNoYXIgKnZfZGF0YTsJCS8qIEFkZHJlc3MgZnJvbSBDUFVzIHZpZXdwb2ludCAqLworCQkJCQkvKiBUb3RhbCAzMiBieXRlcy4uLiAqLworI2lmZGVmIF9fTFA2NF9fCisgICAgdTMyIGNhY2hlX3BhZFs0XTsKKyNlbmRpZiAgICAKK307CisKKy8qIFRoZXNlIHZhbHVlcyBhcyBjaG9zZW4gc28gc3RydWN0IGk1OTZfcHJpdmF0ZSBmaXRzIGluIG9uZSBwYWdlLi4uICovCisKKyNkZWZpbmUgVFhfUklOR19TSVpFIDMyCisjZGVmaW5lIFJYX1JJTkdfU0laRSAxNgorCitzdHJ1Y3QgaTU5Nl9zY2IgeworCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKKwl1bnNpZ25lZCBzaG9ydCBjb21tYW5kOworCWRtYV9hZGRyX3QgICAgY21kOworCWRtYV9hZGRyX3QgICAgcmZkOworCXUzMiAgICAgICAgICAgY3JjX2VycjsKKwl1MzIgICAgICAgICAgIGFsaWduX2VycjsKKwl1MzIgICAgICAgICAgIHJlc291cmNlX2VycjsKKwl1MzIgICAgICAgICAgIG92ZXJfZXJyOworCXUzMiAgICAgICAgICAgcmN2ZHRfZXJyOworCXUzMiAgICAgICAgICAgc2hvcnRfZXJyOworCXVuc2lnbmVkIHNob3J0IHRfb247CisJdW5zaWduZWQgc2hvcnQgdF9vZmY7Cit9OworCitzdHJ1Y3QgaTU5Nl9pc2NwIHsKKwl1MzIgICAgICAgICAgIHN0YXQ7CisJZG1hX2FkZHJfdCAgICBzY2I7Cit9OworCitzdHJ1Y3QgaTU5Nl9zY3AgeworCXUzMiAgICAgICAgICAgc3lzYnVzOworCXUzMiAgICAgICAgICAgIHBhZDsKKwlkbWFfYWRkcl90ICAgIGlzY3A7Cit9OworCitzdHJ1Y3QgaTU5Nl9wcml2YXRlIHsKKwl2b2xhdGlsZSBzdHJ1Y3QgaTU5Nl9zY3Agc2NwCQlfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOworCXZvbGF0aWxlIHN0cnVjdCBpNTk2X2lzY3AgaXNjcAkJX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKKwl2b2xhdGlsZSBzdHJ1Y3QgaTU5Nl9zY2Igc2NiCQlfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOworCXN0cnVjdCBzYV9jbWQgc2FfY21kCQkJX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKKwlzdHJ1Y3QgY2ZfY21kIGNmX2NtZAkJCV9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CisJc3RydWN0IHRkcl9jbWQgdGRyX2NtZAkJCV9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CisJc3RydWN0IG1jX2NtZCBtY19jbWQJCQlfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOworCXN0cnVjdCBpNTk2X3JmZCByZmRzW1JYX1JJTkdfU0laRV0JX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKKwlzdHJ1Y3QgaTU5Nl9yYmQgcmJkc1tSWF9SSU5HX1NJWkVdCV9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CisJc3RydWN0IHR4X2NtZCB0eF9jbWRzW1RYX1JJTkdfU0laRV0JX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKKwlzdHJ1Y3QgaTU5Nl90YmQgdGJkc1tUWF9SSU5HX1NJWkVdCV9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CisJdTMyICAgIHN0YXQ7CisJaW50IGxhc3RfcmVzdGFydDsKKwlzdHJ1Y3QgaTU5Nl9yZmQgKnJmZF9oZWFkOworCXN0cnVjdCBpNTk2X3JiZCAqcmJkX2hlYWQ7CisJc3RydWN0IGk1OTZfY21kICpjbWRfdGFpbDsKKwlzdHJ1Y3QgaTU5Nl9jbWQgKmNtZF9oZWFkOworCWludCBjbWRfYmFja2xvZzsKKwl1MzIgICAgbGFzdF9jbWQ7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJaW50IG5leHRfdHhfY21kOworCWludCBvcHRpb25zOworCXNwaW5sb2NrX3QgbG9jazsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCXN0cnVjdCBkZXZpY2UgKmRldjsKK307CisKK3N0YXRpYyBjaGFyIGluaXRfc2V0dXBbXSA9Cit7CisJMHg4RSwJCQkvKiBsZW5ndGgsIHByZWZldGNoIG9uICovCisJMHhDOCwJCQkvKiBmaWZvIHRvIDgsIG1vbml0b3Igb2ZmICovCisJMHg4MCwJCQkvKiBkb24ndCBzYXZlIGJhZCBmcmFtZXMgKi8KKwkweDJFLAkJCS8qIE5vIHNvdXJjZSBhZGRyZXNzIGluc2VydGlvbiwgOCBieXRlIHByZWFtYmxlICovCisJMHgwMCwJCQkvKiBwcmlvcml0eSBhbmQgYmFja29mZiBkZWZhdWx0cyAqLworCTB4NjAsCQkJLyogaW50ZXJmcmFtZSBzcGFjaW5nICovCisJMHgwMCwJCQkvKiBzbG90IHRpbWUgTFNCICovCisJMHhmMiwJCQkvKiBzbG90IHRpbWUgYW5kIHJldHJpZXMgKi8KKwkweDAwLAkJCS8qIHByb21pc2N1b3VzIG1vZGUgKi8KKwkweDAwLAkJCS8qIGNvbGxpc2lvbiBkZXRlY3QgKi8KKwkweDQwLAkJCS8qIG1pbmltdW0gZnJhbWUgbGVuZ3RoICovCisJMHhmZiwKKwkweDAwLAorCTB4N2YgLyogICptdWx0aSBJQSAqLyB9OworCitzdGF0aWMgaW50IGk1OTZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaTU5Nl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGk1OTZfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCBpNTk2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppNTk2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGk1OTZfYWRkX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaTU5Nl9jbWQgKmNtZCk7CitzdGF0aWMgdm9pZCBpNTk2X3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcHJpbnRfZXRoKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgY2hhciAqc3RyKTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGludCByeF9yaW5nX3NpemUgPSBSWF9SSU5HX1NJWkU7CitzdGF0aWMgaW50IHRpY2tzX2xpbWl0ID0gMTAwOworc3RhdGljIGludCBtYXhfY21kX2JhY2tsb2cgPSBUWF9SSU5HX1NJWkUtMTsKKworCitzdGF0aWMgaW5saW5lIHZvaWQgQ0Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlnc2Nfd3JpdGVsKDAsIGRldi0+YmFzZV9hZGRyICsgUEFfQ0hBTk5FTF9BVFRFTlRJT04pOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBNUFVfUE9SVChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYywgZG1hX2FkZHJfdCB4KQoreworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCisJdTMyIHYgPSAodTMyKSAoYykgfCAodTMyKSAoeCk7CisJdTE2IGEsIGI7CisKKwlpZiAobHAtPm9wdGlvbnMgJiBPUFRfU1dBUF9QT1JUKSB7CisJCWEgPSB2ID4+IDE2OworCQliID0gdiAmIDB4ZmZmZjsKKwl9IGVsc2UgeworCQlhID0gdiAmIDB4ZmZmZjsKKwkJYiA9IHYgPj4gMTY7CisJfQorCisJZ3NjX3dyaXRlbChhLCBkZXYtPmJhc2VfYWRkciArIFBBX0NQVV9QT1JUX0xfQUNDRVNTKTsKKwl1ZGVsYXkoMSk7CisJZ3NjX3dyaXRlbChiLCBkZXYtPmJhc2VfYWRkciArIFBBX0NQVV9QT1JUX0xfQUNDRVNTKTsKK30KKworCitzdGF0aWMgaW5saW5lIGludCB3YWl0X2lzdGF0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwLCBpbnQgZGVsY250LCBjaGFyICpzdHIpCit7CisJQ0hFQ0tfSU5WKCYobHAtPmlzY3ApLCBzaXplb2Yoc3RydWN0IGk1OTZfaXNjcCkpOworCXdoaWxlICgtLWRlbGNudCAmJiBscC0+aXNjcC5zdGF0KSB7CisJCXVkZWxheSgxMCk7CisJCUNIRUNLX0lOVigmKGxwLT5pc2NwKSwgc2l6ZW9mKHN0cnVjdCBpNTk2X2lzY3ApKTsKKwl9CisJaWYgKCFkZWxjbnQpIHsKKwkJcHJpbnRrKCIlczogJXMsIGlzY3Auc3RhdCAlMDR4LCBkaWRuJ3QgY2xlYXJcbiIsCisJCSAgICAgZGV2LT5uYW1lLCBzdHIsIGxwLT5pc2NwLnN0YXQpOworCQlyZXR1cm4gLTE7CisJfQorCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgd2FpdF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAsIGludCBkZWxjbnQsIGNoYXIgKnN0cikKK3sKKwlDSEVDS19JTlYoJihscC0+c2NiKSwgc2l6ZW9mKHN0cnVjdCBpNTk2X3NjYikpOworCXdoaWxlICgtLWRlbGNudCAmJiBscC0+c2NiLmNvbW1hbmQpIHsKKwkJdWRlbGF5KDEwKTsKKwkJQ0hFQ0tfSU5WKCYobHAtPnNjYiksIHNpemVvZihzdHJ1Y3QgaTU5Nl9zY2IpKTsKKwl9CisJaWYgKCFkZWxjbnQpIHsKKwkJcHJpbnRrKCIlczogJXMsIHN0YXR1cyAlNC40eCwgY21kICU0LjR4LlxuIiwKKwkJICAgICBkZXYtPm5hbWUsIHN0ciwgbHAtPnNjYi5zdGF0dXMsIGxwLT5zY2IuY29tbWFuZCk7CisJCXJldHVybiAtMTsKKwl9CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBpNTk2X2Rpc3BsYXlfZGF0YShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBpNTk2X2NtZCAqY21kOworCXN0cnVjdCBpNTk2X3JmZCAqcmZkOworCXN0cnVjdCBpNTk2X3JiZCAqcmJkOworCisJcHJpbnRrKCJscCBhbmQgc2NwIGF0ICVwLCAuc3lzYnVzID0gJTA4eCwgLmlzY3AgPSAlMDh4XG4iLAorCSAgICAgICAmbHAtPnNjcCwgbHAtPnNjcC5zeXNidXMsIGxwLT5zY3AuaXNjcCk7CisJcHJpbnRrKCJpc2NwIGF0ICVwLCBpc2NwLnN0YXQgPSAlMDh4LCAuc2NiID0gJTA4eFxuIiwKKwkgICAgICAgJmxwLT5pc2NwLCBscC0+aXNjcC5zdGF0LCBscC0+aXNjcC5zY2IpOworCXByaW50aygic2NiIGF0ICVwLCBzY2Iuc3RhdHVzID0gJTA0eCwgLmNvbW1hbmQgPSAlMDR4LCIKKwkJIiAuY21kID0gJTA4eCwgLnJmZCA9ICUwOHhcbiIsCisJICAgICAgICZscC0+c2NiLCBscC0+c2NiLnN0YXR1cywgbHAtPnNjYi5jb21tYW5kLAorCQlscC0+c2NiLmNtZCwgbHAtPnNjYi5yZmQpOworCXByaW50aygiICAgZXJyb3JzOiBjcmMgJXgsIGFsaWduICV4LCByZXNvdXJjZSAleCwiCisgICAgICAgICAgICAgICAiIG92ZXIgJXgsIHJjdmR0ICV4LCBzaG9ydCAleFxuIiwKKwkJbHAtPnNjYi5jcmNfZXJyLCBscC0+c2NiLmFsaWduX2VyciwgbHAtPnNjYi5yZXNvdXJjZV9lcnIsCisJCWxwLT5zY2Iub3Zlcl9lcnIsIGxwLT5zY2IucmN2ZHRfZXJyLCBscC0+c2NiLnNob3J0X2Vycik7CisJY21kID0gbHAtPmNtZF9oZWFkOworCXdoaWxlIChjbWQgIT0gTlVMTCkgeworCQlwcmludGsoImNtZCBhdCAlcCwgLnN0YXR1cyA9ICUwNHgsIC5jb21tYW5kID0gJTA0eCwgLmJfbmV4dCA9ICUwOHhcbiIsCisJCSAgY21kLCBjbWQtPnN0YXR1cywgY21kLT5jb21tYW5kLCBjbWQtPmJfbmV4dCk7CisJCWNtZCA9IGNtZC0+dl9uZXh0OworCX0KKwlyZmQgPSBscC0+cmZkX2hlYWQ7CisJcHJpbnRrKCJyZmRfaGVhZCA9ICVwXG4iLCByZmQpOworCWRvIHsKKwkJcHJpbnRrKCIgICAlcCAuc3RhdCAlMDR4LCAuY21kICUwNHgsIGJfbmV4dCAlMDh4LCByYmQgJTA4eCwiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGNvdW50ICUwNHhcbiIsCisJCQlyZmQsIHJmZC0+c3RhdCwgcmZkLT5jbWQsIHJmZC0+Yl9uZXh0LCByZmQtPnJiZCwKKwkJCXJmZC0+Y291bnQpOworCQlyZmQgPSByZmQtPnZfbmV4dDsKKwl9IHdoaWxlIChyZmQgIT0gbHAtPnJmZF9oZWFkKTsKKwlyYmQgPSBscC0+cmJkX2hlYWQ7CisJcHJpbnRrKCJyYmRfaGVhZCA9ICVwXG4iLCByYmQpOworCWRvIHsKKwkJcHJpbnRrKCIgICAlcCAuY291bnQgJTA0eCwgYl9uZXh0ICUwOHgsIGJfZGF0YSAlMDh4LCBzaXplICUwNHhcbiIsCisJCQlyYmQsIHJiZC0+Y291bnQsIHJiZC0+Yl9uZXh0LCByYmQtPmJfZGF0YSwgcmJkLT5zaXplKTsKKwkJcmJkID0gcmJkLT52X25leHQ7CisJfSB3aGlsZSAocmJkICE9IGxwLT5yYmRfaGVhZCk7CisJQ0hFQ0tfSU5WKGxwLCBzaXplb2Yoc3RydWN0IGk1OTZfcHJpdmF0ZSkpOworfQorCisKKyNpZiBkZWZpbmVkKEVOQUJMRV9NVk1FMTZ4X05FVCkgfHwgZGVmaW5lZChFTkFCTEVfQlZNRTYwMDBfTkVUKQorc3RhdGljIHZvaWQgaTU5Nl9lcnJvcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqcGNjMiA9ICh1bnNpZ25lZCBjaGFyICopIDB4ZmZmNDIwMDA7CisKKwlwY2MyWzB4MjhdID0gMTsKKwlwY2MyWzB4MmJdID0gMHgxZDsKKwlwcmludGsoIiVzOiBFcnJvciBpbnRlcnJ1cHRcbiIsIGRldi0+bmFtZSk7CisJaTU5Nl9kaXNwbGF5X2RhdGEoZGV2KTsKK30KKyNlbmRpZgorCisjZGVmaW5lIHZpcnRfdG9fZG1hKGxwLHYpICgobHApLT5kbWFfYWRkciArIChkbWFfYWRkcl90KSgodW5zaWduZWQgbG9uZykodiktKHVuc2lnbmVkIGxvbmcpKGxwKSkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X3J4X2J1ZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKwlzdHJ1Y3QgaTU5Nl9yZmQgKnJmZDsKKwlzdHJ1Y3QgaTU5Nl9yYmQgKnJiZDsKKworCS8qIEZpcnN0IGJ1aWxkIHRoZSBSZWNlaXZlIEJ1ZmZlciBEZXNjcmlwdG9yIExpc3QgKi8KKworCWZvciAoaSA9IDAsIHJiZCA9IGxwLT5yYmRzOyBpIDwgcnhfcmluZ19zaXplOyBpKyssIHJiZCsrKSB7CisJCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKFBLVF9CVUZfU1ogKyA0KTsKKworCQlpZiAoc2tiID09IE5VTEwpCisJCQlwYW5pYygiJXM6IGFsbG9jX3NrYigpIGZhaWxlZCIsIF9fRklMRV9fKTsKKwkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShscC0+ZGV2LCBza2ItPnRhaWwsUEtUX0JVRl9TWiwKKwkJCQkJICBETUFfRlJPTV9ERVZJQ0UpOworCQlza2ItPmRldiA9IGRldjsKKwkJcmJkLT52X25leHQgPSByYmQrMTsKKwkJcmJkLT5iX25leHQgPSBXU1dBUHJiZCh2aXJ0X3RvX2RtYShscCxyYmQrMSkpOworCQlyYmQtPmJfYWRkciA9IFdTV0FQcmJkKHZpcnRfdG9fZG1hKGxwLHJiZCkpOworCQlyYmQtPnNrYiA9IHNrYjsKKwkJcmJkLT52X2RhdGEgPSBza2ItPnRhaWw7CisJCXJiZC0+Yl9kYXRhID0gV1NXQVBjaGFyKGRtYV9hZGRyKTsKKwkJcmJkLT5zaXplID0gUEtUX0JVRl9TWjsKKwl9CisJbHAtPnJiZF9oZWFkID0gbHAtPnJiZHM7CisJcmJkID0gbHAtPnJiZHMgKyByeF9yaW5nX3NpemUgLSAxOworCXJiZC0+dl9uZXh0ID0gbHAtPnJiZHM7CisJcmJkLT5iX25leHQgPSBXU1dBUHJiZCh2aXJ0X3RvX2RtYShscCxscC0+cmJkcykpOworCisJLyogTm93IGJ1aWxkIHRoZSBSZWNlaXZlIEZyYW1lIERlc2NyaXB0b3IgTGlzdCAqLworCisJZm9yIChpID0gMCwgcmZkID0gbHAtPnJmZHM7IGkgPCByeF9yaW5nX3NpemU7IGkrKywgcmZkKyspIHsKKwkJcmZkLT5yYmQgPSBJNTk2X05VTEw7CisJCXJmZC0+dl9uZXh0ID0gcmZkKzE7CisJCXJmZC0+dl9wcmV2ID0gcmZkLTE7CisJCXJmZC0+Yl9uZXh0ID0gV1NXQVByZmQodmlydF90b19kbWEobHAscmZkKzEpKTsKKwkJcmZkLT5jbWQgPSBDTURfRkxFWDsKKwl9CisJbHAtPnJmZF9oZWFkID0gbHAtPnJmZHM7CisJbHAtPnNjYi5yZmQgPSBXU1dBUHJmZCh2aXJ0X3RvX2RtYShscCxscC0+cmZkcykpOworCXJmZCA9IGxwLT5yZmRzOworCXJmZC0+cmJkID0gV1NXQVByYmQodmlydF90b19kbWEobHAsbHAtPnJiZF9oZWFkKSk7CisJcmZkLT52X3ByZXYgPSBscC0+cmZkcyArIHJ4X3Jpbmdfc2l6ZSAtIDE7CisJcmZkID0gbHAtPnJmZHMgKyByeF9yaW5nX3NpemUgLSAxOworCXJmZC0+dl9uZXh0ID0gbHAtPnJmZHM7CisJcmZkLT5iX25leHQgPSBXU1dBUHJmZCh2aXJ0X3RvX2RtYShscCxscC0+cmZkcykpOworCXJmZC0+Y21kID0gQ01EX0VPTHxDTURfRkxFWDsKKworCUNIRUNLX1dCQUNLX0lOVihscCwgc2l6ZW9mKHN0cnVjdCBpNTk2X3ByaXZhdGUpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlbW92ZV9yeF9idWZzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IGk1OTZfcmJkICpyYmQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwLCByYmQgPSBscC0+cmJkczsgaSA8IHJ4X3Jpbmdfc2l6ZTsgaSsrLCByYmQrKykgeworCQlpZiAocmJkLT5za2IgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlkbWFfdW5tYXBfc2luZ2xlKGxwLT5kZXYsCisJCQkJIChkbWFfYWRkcl90KVdTV0FQY2hhcihyYmQtPmJfZGF0YSksIAorCQkJCSBQS1RfQlVGX1NaLCBETUFfRlJPTV9ERVZJQ0UpOworCQlkZXZfa2ZyZWVfc2tiKHJiZC0+c2tiKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgcmVidWlsZF9yeF9idWZzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJaW50IGk7CisKKwkvKiBFbnN1cmUgcnggZnJhbWUvYnVmZmVyIGRlc2NyaXB0b3JzIGFyZSB0aWR5ICovCisKKwlmb3IgKGkgPSAwOyBpIDwgcnhfcmluZ19zaXplOyBpKyspIHsKKwkJbHAtPnJmZHNbaV0ucmJkID0gSTU5Nl9OVUxMOworCQlscC0+cmZkc1tpXS5jbWQgPSBDTURfRkxFWDsKKwl9CisJbHAtPnJmZHNbcnhfcmluZ19zaXplLTFdLmNtZCA9IENNRF9FT0x8Q01EX0ZMRVg7CisJbHAtPnJmZF9oZWFkID0gbHAtPnJmZHM7CisJbHAtPnNjYi5yZmQgPSBXU1dBUHJmZCh2aXJ0X3RvX2RtYShscCxscC0+cmZkcykpOworCWxwLT5yYmRfaGVhZCA9IGxwLT5yYmRzOworCWxwLT5yZmRzWzBdLnJiZCA9IFdTV0FQcmJkKHZpcnRfdG9fZG1hKGxwLGxwLT5yYmRzKSk7CisKKwlDSEVDS19XQkFDS19JTlYobHAsIHNpemVvZihzdHJ1Y3QgaTU5Nl9wcml2YXRlKSk7Cit9CisKKworc3RhdGljIGludCBpbml0X2k1OTZfbWVtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsJLyogZGlzYWJsZSBJUlFzIGZyb20gTEFOICovCisJREVCKERFQl9JTklULAorCQlwcmludGsoIlJFU0VUIDgyNTk2IHBvcnQ6ICVwICh3aXRoIElSUSAlZCBkaXNhYmxlZClcbiIsCisJCSAgICAgICAodm9pZCopKGRldi0+YmFzZV9hZGRyICsgUEFfSTgyNTk2X1JFU0VUKSwKKwkJICAgICAgIGRldi0+aXJxKSk7CisJCisJZ3NjX3dyaXRlbCgwLCAodm9pZCopKGRldi0+YmFzZV9hZGRyICsgUEFfSTgyNTk2X1JFU0VUKSk7IC8qIEhhcmQgUmVzZXQgKi8KKwl1ZGVsYXkoMTAwKTsJCQkvKiBXYWl0IDEwMHVzIC0gc2VlbXMgdG8gaGVscCAqLworCisJLyogY2hhbmdlIHRoZSBzY3AgYWRkcmVzcyAqLworCisJbHAtPmxhc3RfY21kID0gamlmZmllczsKKworCisJbHAtPnNjcC5zeXNidXMgPSAweDAwMDAwMDZjOworCWxwLT5zY3AuaXNjcCA9IFdTV0FQaXNjcCh2aXJ0X3RvX2RtYShscCwmKGxwLT5pc2NwKSkpOworCWxwLT5pc2NwLnNjYiA9IFdTV0FQc2NiKHZpcnRfdG9fZG1hKGxwLCYobHAtPnNjYikpKTsKKwlscC0+aXNjcC5zdGF0ID0gSVNDUF9CVVNZOworCWxwLT5jbWRfYmFja2xvZyA9IDA7CisKKwlscC0+Y21kX2hlYWQgPSBOVUxMOworICAgICAgICBscC0+c2NiLmNtZCA9IEk1OTZfTlVMTDsKKworCURFQihERUJfSU5JVCwgcHJpbnRrKCIlczogc3RhcnRpbmcgaTgyNTk2LlxuIiwgZGV2LT5uYW1lKSk7CisKKwlDSEVDS19XQkFDSygmKGxwLT5zY3ApLCBzaXplb2Yoc3RydWN0IGk1OTZfc2NwKSk7CisJQ0hFQ0tfV0JBQ0soJihscC0+aXNjcCksIHNpemVvZihzdHJ1Y3QgaTU5Nl9pc2NwKSk7CisKKwlNUFVfUE9SVChkZXYsIFBPUlRfQUxUU0NQLCB2aXJ0X3RvX2RtYShscCwmbHAtPnNjcCkpOwkKKworCUNBKGRldik7CisKKwlpZiAod2FpdF9pc3RhdChkZXYsIGxwLCAxMDAwLCAiaW5pdGlhbGl6YXRpb24gdGltZWQgb3V0IikpCisJCWdvdG8gZmFpbGVkOworCURFQihERUJfSU5JVCwgcHJpbnRrKCIlczogaTgyNTk2IGluaXRpYWxpemF0aW9uIHN1Y2Nlc3NmdWxcbiIsIGRldi0+bmFtZSkpOworCisJLyogRW5zdXJlIHJ4IGZyYW1lL2J1ZmZlciBkZXNjcmlwdG9ycyBhcmUgdGlkeSAqLworCXJlYnVpbGRfcnhfYnVmcyhkZXYpOworCisJbHAtPnNjYi5jb21tYW5kID0gMDsKKwlDSEVDS19XQkFDSygmKGxwLT5zY2IpLCBzaXplb2Yoc3RydWN0IGk1OTZfc2NiKSk7CisKKwllbmFibGVfaXJxKGRldi0+aXJxKTsJLyogZW5hYmxlIElSUXMgZnJvbSBMQU4gKi8KKworCURFQihERUJfSU5JVCwgcHJpbnRrKCIlczogcXVldWluZyBDbWRDb25maWd1cmVcbiIsIGRldi0+bmFtZSkpOworCW1lbWNweShscC0+Y2ZfY21kLmk1OTZfY29uZmlnLCBpbml0X3NldHVwLCAxNCk7CisJbHAtPmNmX2NtZC5jbWQuY29tbWFuZCA9IENtZENvbmZpZ3VyZTsKKwlDSEVDS19XQkFDSygmKGxwLT5jZl9jbWQpLCBzaXplb2Yoc3RydWN0IGNmX2NtZCkpOworCWk1OTZfYWRkX2NtZChkZXYsICZscC0+Y2ZfY21kLmNtZCk7CisKKwlERUIoREVCX0lOSVQsIHByaW50aygiJXM6IHF1ZXVpbmcgQ21kU0FTZXR1cFxuIiwgZGV2LT5uYW1lKSk7CisJbWVtY3B5KGxwLT5zYV9jbWQuZXRoX2FkZHIsIGRldi0+ZGV2X2FkZHIsIDYpOworCWxwLT5zYV9jbWQuY21kLmNvbW1hbmQgPSBDbWRTQVNldHVwOworCUNIRUNLX1dCQUNLKCYobHAtPnNhX2NtZCksIHNpemVvZihzdHJ1Y3Qgc2FfY21kKSk7CisJaTU5Nl9hZGRfY21kKGRldiwgJmxwLT5zYV9jbWQuY21kKTsKKworCURFQihERUJfSU5JVCwgcHJpbnRrKCIlczogcXVldWluZyBDbWRURFJcbiIsIGRldi0+bmFtZSkpOworCWxwLT50ZHJfY21kLmNtZC5jb21tYW5kID0gQ21kVERSOworCUNIRUNLX1dCQUNLKCYobHAtPnRkcl9jbWQpLCBzaXplb2Yoc3RydWN0IHRkcl9jbWQpKTsKKwlpNTk2X2FkZF9jbWQoZGV2LCAmbHAtPnRkcl9jbWQuY21kKTsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmbHAtPmxvY2ssIGZsYWdzKTsKKworCWlmICh3YWl0X2NtZChkZXYsIGxwLCAxMDAwLCAidGltZWQgb3V0IHdhaXRpbmcgdG8gaXNzdWUgUlhfU1RBUlQiKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmbHAtPmxvY2ssIGZsYWdzKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCURFQihERUJfSU5JVCwgcHJpbnRrKCIlczogSXNzdWluZyBSWF9TVEFSVFxuIiwgZGV2LT5uYW1lKSk7CisJbHAtPnNjYi5jb21tYW5kID0gUlhfU1RBUlQ7CisJbHAtPnNjYi5yZmQgPSBXU1dBUHJmZCh2aXJ0X3RvX2RtYShscCxscC0+cmZkcykpOworCUNIRUNLX1dCQUNLKCYobHAtPnNjYiksIHNpemVvZihzdHJ1Y3QgaTU5Nl9zY2IpKTsKKworCUNBKGRldik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmbHAtPmxvY2ssIGZsYWdzKTsKKworCWlmICh3YWl0X2NtZChkZXYsIGxwLCAxMDAwLCAiUlhfU1RBUlQgbm90IHByb2Nlc3NlZCIpKQorCQlnb3RvIGZhaWxlZDsKKwlERUIoREVCX0lOSVQsIHByaW50aygiJXM6IFJlY2VpdmUgdW5pdCBzdGFydGVkIE9LXG4iLCBkZXYtPm5hbWUpKTsKKworCXJldHVybiAwOworCitmYWlsZWQ6CisJcHJpbnRrKCIlczogRmFpbGVkIHRvIGluaXRpYWxpc2UgODI1OTZcbiIsIGRldi0+bmFtZSk7CisJTVBVX1BPUlQoZGV2LCBQT1JUX1JFU0VULCAwKTsKKwlyZXR1cm4gLTE7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgaTU5Nl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCBpNTk2X3JmZCAqcmZkOworCXN0cnVjdCBpNTk2X3JiZCAqcmJkOworCWludCBmcmFtZXMgPSAwOworCisJREVCKERFQl9SWEZSQU1FLCBwcmludGsoImk1OTZfcngoKSwgcmZkX2hlYWQgJXAsIHJiZF9oZWFkICVwXG4iLAorCQkJbHAtPnJmZF9oZWFkLCBscC0+cmJkX2hlYWQpKTsKKworCisJcmZkID0gbHAtPnJmZF9oZWFkOwkJLyogUmVmIG5leHQgZnJhbWUgdG8gY2hlY2sgKi8KKworCUNIRUNLX0lOVihyZmQsIHNpemVvZihzdHJ1Y3QgaTU5Nl9yZmQpKTsKKwl3aGlsZSAoKHJmZC0+c3RhdCkgJiBTVEFUX0MpIHsJLyogTG9vcCB3aGlsZSBjb21wbGV0ZSBmcmFtZXMgKi8KKwkJaWYgKHJmZC0+cmJkID09IEk1OTZfTlVMTCkKKwkJCXJiZCA9IE5VTEw7CisJCWVsc2UgaWYgKHJmZC0+cmJkID09IGxwLT5yYmRfaGVhZC0+Yl9hZGRyKSB7CisJCQlyYmQgPSBscC0+cmJkX2hlYWQ7CisJCQlDSEVDS19JTlYocmJkLCBzaXplb2Yoc3RydWN0IGk1OTZfcmJkKSk7CisJCX0KKwkJZWxzZSB7CisJCQlwcmludGsoIiVzOiByYmQgY2hhaW4gYnJva2VuIVxuIiwgZGV2LT5uYW1lKTsKKwkJCS8qIFhYWCBOb3cgd2hhdD8gKi8KKwkJCXJiZCA9IE5VTEw7CisJCX0KKwkJREVCKERFQl9SWEZSQU1FLCBwcmludGsoIiAgcmZkICVwLCByZmQucmJkICUwOHgsIHJmZC5zdGF0ICUwNHhcbiIsCisJCQlyZmQsIHJmZC0+cmJkLCByZmQtPnN0YXQpKTsKKwkJCisJCWlmIChyYmQgIT0gTlVMTCAmJiAoKHJmZC0+c3RhdCkgJiBTVEFUX09LKSkgeworCQkJLyogYSBnb29kIGZyYW1lICovCisJCQlpbnQgcGt0X2xlbiA9IHJiZC0+Y291bnQgJiAweDNmZmY7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcmJkLT5za2I7CisJCQlpbnQgcnhfaW5fcGxhY2UgPSAwOworCisJCQlERUIoREVCX1JYQUREUixwcmludF9ldGgocmJkLT52X2RhdGEsICJyZWNlaXZlZCIpKTsKKwkJCWZyYW1lcysrOworCisJCQkvKiBDaGVjayBpZiB0aGUgcGFja2V0IGlzIGxvbmcgZW5vdWdoIHRvIGp1c3QgYWNjZXB0CisJCQkgKiB3aXRob3V0IGNvcHlpbmcgdG8gYSBwcm9wZXJseSBzaXplZCBza2J1ZmYuCisJCQkgKi8KKworCQkJaWYgKHBrdF9sZW4gPiByeF9jb3B5YnJlYWspIHsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiOworCQkJCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisKKwkJCQlkbWFfdW5tYXBfc2luZ2xlKGxwLT5kZXYsKGRtYV9hZGRyX3QpV1NXQVBjaGFyKHJiZC0+Yl9kYXRhKSwgUEtUX0JVRl9TWiwgRE1BX0ZST01fREVWSUNFKTsKKwkJCQkvKiBHZXQgZnJlc2ggc2tidWZmIHRvIHJlcGxhY2UgZmlsbGVkIG9uZS4gKi8KKwkJCQluZXdza2IgPSBkZXZfYWxsb2Nfc2tiKFBLVF9CVUZfU1ogKyA0KTsKKwkJCQlpZiAobmV3c2tiID09IE5VTEwpIHsKKwkJCQkJc2tiID0gTlVMTDsJLyogZHJvcCBwa3QgKi8KKwkJCQkJZ290byBtZW1vcnlfc3F1ZWV6ZTsKKwkJCQl9CisJCQkJc2tiX3Jlc2VydmUobmV3c2tiLCAyKTsKKworCQkJCS8qIFBhc3MgdXAgdGhlIHNrYiBhbHJlYWR5IG9uIHRoZSBSeCByaW5nLiAqLworCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKwkJCQlyeF9pbl9wbGFjZSA9IDE7CisJCQkJcmJkLT5za2IgPSBuZXdza2I7CisJCQkJbmV3c2tiLT5kZXYgPSBkZXY7CisJCQkJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShscC0+ZGV2LCBuZXdza2ItPnRhaWwsIFBLVF9CVUZfU1osIERNQV9GUk9NX0RFVklDRSk7CisJCQkJcmJkLT52X2RhdGEgPSBuZXdza2ItPnRhaWw7CisJCQkJcmJkLT5iX2RhdGEgPSBXU1dBUGNoYXIoZG1hX2FkZHIpOworCQkJCUNIRUNLX1dCQUNLX0lOVihyYmQsIHNpemVvZihzdHJ1Y3QgaTU5Nl9yYmQpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKTsKK21lbW9yeV9zcXVlZXplOgorCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJLyogWFhYIHR1bGlwLmMgY2FuIGRlZmVyIHBhY2tldHMgaGVyZSEhICovCisJCQkJcHJpbnRrKCIlczogaTU5Nl9yeCBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJfQorCQkJZWxzZSB7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJaWYgKCFyeF9pbl9wbGFjZSkgeworCQkJCQkvKiAxNiBieXRlIGFsaWduIHRoZSBkYXRhIGZpZWxkcyAqLworCQkJCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShscC0+ZGV2LCAoZG1hX2FkZHJfdClXU1dBUGNoYXIocmJkLT5iX2RhdGEpLCBQS1RfQlVGX1NaLCBETUFfRlJPTV9ERVZJQ0UpOworCQkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOworCQkJCQltZW1jcHkoc2tiX3B1dChza2IscGt0X2xlbiksIHJiZC0+dl9kYXRhLCBwa3RfbGVuKTsKKwkJCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UobHAtPmRldiwgKGRtYV9hZGRyX3QpV1NXQVBjaGFyKHJiZC0+Yl9kYXRhKSwgUEtUX0JVRl9TWiwgRE1BX0ZST01fREVWSUNFKTsKKwkJCQl9CisJCQkJc2tiLT5sZW4gPSBwa3RfbGVuOworCQkJCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJbHAtPnN0YXRzLnJ4X2J5dGVzKz1wa3RfbGVuOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJREVCKERFQl9FUlJPUlMsIHByaW50aygiJXM6IEVycm9yLCByZmQuc3RhdCA9IDB4JTA0eFxuIiwKKwkJCQkJZGV2LT5uYW1lLCByZmQtPnN0YXQpKTsKKwkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmICgocmZkLT5zdGF0KSAmIDB4MDAwMSkKKwkJCQlscC0+c3RhdHMuY29sbGlzaW9ucysrOworCQkJaWYgKChyZmQtPnN0YXQpICYgMHgwMDgwKQorCQkJCWxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpZiAoKHJmZC0+c3RhdCkgJiAweDAxMDApCisJCQkJbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAoKHJmZC0+c3RhdCkgJiAweDAyMDApCisJCQkJbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQlpZiAoKHJmZC0+c3RhdCkgJiAweDA0MDApCisJCQkJbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKChyZmQtPnN0YXQpICYgMHgwODAwKQorCQkJCWxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAoKHJmZC0+c3RhdCkgJiAweDEwMDApCisJCQkJbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJfQorCisJCS8qIENsZWFyIHRoZSBidWZmZXIgZGVzY3JpcHRvciBjb3VudCBhbmQgRU9GICsgRiBmbGFncyAqLworCisJCWlmIChyYmQgIT0gTlVMTCAmJiAocmJkLT5jb3VudCAmIDB4NDAwMCkpIHsKKwkJCXJiZC0+Y291bnQgPSAwOworCQkJbHAtPnJiZF9oZWFkID0gcmJkLT52X25leHQ7CisJCQlDSEVDS19XQkFDS19JTlYocmJkLCBzaXplb2Yoc3RydWN0IGk1OTZfcmJkKSk7CisJCX0KKworCQkvKiBUaWR5IHRoZSBmcmFtZSBkZXNjcmlwdG9yLCBtYXJraW5nIGl0IGFzIGVuZCBvZiBsaXN0ICovCisKKwkJcmZkLT5yYmQgPSBJNTk2X05VTEw7CisJCXJmZC0+c3RhdCA9IDA7CisJCXJmZC0+Y21kID0gQ01EX0VPTHxDTURfRkxFWDsKKwkJcmZkLT5jb3VudCA9IDA7CisKKwkJLyogUmVtb3ZlIGVuZC1vZi1saXN0IGZyb20gb2xkIGVuZCBkZXNjcmlwdG9yICovCisKKwkJcmZkLT52X3ByZXYtPmNtZCA9IENNRF9GTEVYOworCisJCS8qIFVwZGF0ZSByZWNvcmQgb2YgbmV4dCBmcmFtZSBkZXNjcmlwdG9yIHRvIHByb2Nlc3MgKi8KKworCQlscC0+c2NiLnJmZCA9IHJmZC0+Yl9uZXh0OworCQlscC0+cmZkX2hlYWQgPSByZmQtPnZfbmV4dDsKKwkJQ0hFQ0tfV0JBQ0tfSU5WKHJmZC0+dl9wcmV2LCBzaXplb2Yoc3RydWN0IGk1OTZfcmZkKSk7CisJCUNIRUNLX1dCQUNLX0lOVihyZmQsIHNpemVvZihzdHJ1Y3QgaTU5Nl9yZmQpKTsKKwkJcmZkID0gbHAtPnJmZF9oZWFkOworCQlDSEVDS19JTlYocmZkLCBzaXplb2Yoc3RydWN0IGk1OTZfcmZkKSk7CisJfQorCisJREVCKERFQl9SWEZSQU1FLCBwcmludGsoImZyYW1lcyAlZFxuIiwgZnJhbWVzKSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgaTU5Nl9jbGVhbnVwX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCkKK3sKKwlzdHJ1Y3QgaTU5Nl9jbWQgKnB0cjsKKworCXdoaWxlIChscC0+Y21kX2hlYWQgIT0gTlVMTCkgeworCQlwdHIgPSBscC0+Y21kX2hlYWQ7CisJCWxwLT5jbWRfaGVhZCA9IHB0ci0+dl9uZXh0OworCQlscC0+Y21kX2JhY2tsb2ctLTsKKworCQlzd2l0Y2ggKChwdHItPmNvbW1hbmQpICYgMHg3KSB7CisJCWNhc2UgQ21kVHg6CisJCQl7CisJCQkJc3RydWN0IHR4X2NtZCAqdHhfY21kID0gKHN0cnVjdCB0eF9jbWQgKikgcHRyOworCQkJCXN0cnVjdCBza19idWZmICpza2IgPSB0eF9jbWQtPnNrYjsKKwkJCQlkbWFfdW5tYXBfc2luZ2xlKGxwLT5kZXYsIHR4X2NtZC0+ZG1hX2FkZHIsIHNrYi0+bGVuLCBETUFfVE9fREVWSUNFKTsKKworCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCQkJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKworCQkJCXB0ci0+dl9uZXh0ID0gTlVMTDsKKwkJCQlwdHItPmJfbmV4dCA9IEk1OTZfTlVMTDsKKwkJCQl0eF9jbWQtPmNtZC5jb21tYW5kID0gMDsgIC8qIE1hcmsgYXMgZnJlZSAqLworCQkJCWJyZWFrOworCQkJfQorCQlkZWZhdWx0OgorCQkJcHRyLT52X25leHQgPSBOVUxMOworCQkJcHRyLT5iX25leHQgPSBJNTk2X05VTEw7CisJCX0KKwkJQ0hFQ0tfV0JBQ0tfSU5WKHB0ciwgc2l6ZW9mKHN0cnVjdCBpNTk2X2NtZCkpOworCX0KKworCXdhaXRfY21kKGRldiwgbHAsIDEwMCwgImk1OTZfY2xlYW51cF9jbWQgdGltZWQgb3V0Iik7CisJbHAtPnNjYi5jbWQgPSBJNTk2X05VTEw7CisJQ0hFQ0tfV0JBQ0soJihscC0+c2NiKSwgc2l6ZW9mKHN0cnVjdCBpNTk2X3NjYikpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpNTk2X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlERUIoREVCX1JFU0VULCBwcmludGsoImk1OTZfcmVzZXRcbiIpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXdhaXRfY21kKGRldiwgbHAsIDEwMCwgImk1OTZfcmVzZXQgdGltZWQgb3V0Iik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBGSVhNRTogdGhpcyBjb21tYW5kIG1pZ2h0IGNhdXNlIGFuIGxwbWMgKi8KKwlscC0+c2NiLmNvbW1hbmQgPSBDVUNfQUJPUlQgfCBSWF9BQk9SVDsKKwlDSEVDS19XQkFDSygmKGxwLT5zY2IpLCBzaXplb2Yoc3RydWN0IGk1OTZfc2NiKSk7CisJQ0EoZGV2KTsKKworCS8qIHdhaXQgZm9yIHNodXRkb3duICovCisJd2FpdF9jbWQoZGV2LCBscCwgMTAwMCwgImk1OTZfcmVzZXQgMiB0aW1lZCBvdXQiKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmbHAtPmxvY2ssIGZsYWdzKTsKKworCWk1OTZfY2xlYW51cF9jbWQoZGV2LGxwKTsKKwlpNTk2X3J4KGRldik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCWluaXRfaTU5Nl9tZW0oZGV2KTsKK30KKworCitzdGF0aWMgdm9pZCBpNTk2X2FkZF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGk1OTZfY21kICpjbWQpCit7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURFQihERUJfQUREQ01ELCBwcmludGsoImk1OTZfYWRkX2NtZCBjbWRfaGVhZCAlcFxuIiwgbHAtPmNtZF9oZWFkKSk7CisKKwljbWQtPnN0YXR1cyA9IDA7CisJY21kLT5jb21tYW5kIHw9IChDTURfRU9MIHwgQ01EX0lOVFIpOworCWNtZC0+dl9uZXh0ID0gTlVMTDsKKwljbWQtPmJfbmV4dCA9IEk1OTZfTlVMTDsKKwlDSEVDS19XQkFDSyhjbWQsIHNpemVvZihzdHJ1Y3QgaTU5Nl9jbWQpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmbHAtPmxvY2ssIGZsYWdzKTsKKworCWlmIChscC0+Y21kX2hlYWQgIT0gTlVMTCkgeworCQlscC0+Y21kX3RhaWwtPnZfbmV4dCA9IGNtZDsKKwkJbHAtPmNtZF90YWlsLT5iX25leHQgPSBXU1dBUGNtZCh2aXJ0X3RvX2RtYShscCwmY21kLT5zdGF0dXMpKTsKKwkJQ0hFQ0tfV0JBQ0sobHAtPmNtZF90YWlsLCBzaXplb2Yoc3RydWN0IGk1OTZfY21kKSk7CisJfSBlbHNlIHsKKwkJbHAtPmNtZF9oZWFkID0gY21kOworCQl3YWl0X2NtZChkZXYsIGxwLCAxMDAsICJpNTk2X2FkZF9jbWQgdGltZWQgb3V0Iik7CisJCWxwLT5zY2IuY21kID0gV1NXQVBjbWQodmlydF90b19kbWEobHAsJmNtZC0+c3RhdHVzKSk7CisJCWxwLT5zY2IuY29tbWFuZCA9IENVQ19TVEFSVDsKKwkJQ0hFQ0tfV0JBQ0soJihscC0+c2NiKSwgc2l6ZW9mKHN0cnVjdCBpNTk2X3NjYikpOworCQlDQShkZXYpOworCX0KKwlscC0+Y21kX3RhaWwgPSBjbWQ7CisJbHAtPmNtZF9iYWNrbG9nKys7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmbHAtPmxvY2ssIGZsYWdzKTsKKworCWlmIChscC0+Y21kX2JhY2tsb2cgPiBtYXhfY21kX2JhY2tsb2cpIHsKKwkJdW5zaWduZWQgbG9uZyB0aWNrc3NvZmFyID0gamlmZmllcyAtIGxwLT5sYXN0X2NtZDsKKworCQlpZiAodGlja3Nzb2ZhciA8IHRpY2tzX2xpbWl0KQorCQkJcmV0dXJuOworCisJCXByaW50aygiJXM6IGNvbW1hbmQgdW5pdCB0aW1lZCBvdXQsIHN0YXR1cyByZXNldHRpbmcuXG4iLCBkZXYtPm5hbWUpOworI2lmIDEKKwkJaTU5Nl9yZXNldChkZXYsIGxwKTsKKyNlbmRpZgorCX0KK30KKworI2lmIDAKKy8qIHRoaXMgZnVuY3Rpb24gbWFrZXMgYSBwZXJmZWN0bHkgYWRlcXVhdGUgcHJvYmUuLi4gIGJ1dCB3ZSBoYXZlIGEKKyAgIGRldmljZSBsaXN0ICovCitzdGF0aWMgaW50IGk1OTZfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCXZvbGF0aWxlIGludCAqdGludDsKKwl1MzIgZGF0YTsKKworCXRpbnQgPSAodm9sYXRpbGUgaW50ICopKCYobHAtPnNjcCkpOworCWRhdGEgPSB2aXJ0X3RvX2RtYShscCx0aW50KTsKKwkKKwl0aW50WzFdID0gLTE7CisJQ0hFQ0tfV0JBQ0sodGludCxQQUdFX1NJWkUpOworCisJTVBVX1BPUlQoZGV2LCAxLCBkYXRhKTsKKworCWZvcihkYXRhID0gMTAwMDAwMDsgZGF0YTsgZGF0YS0tKSB7CisJCUNIRUNLX0lOVih0aW50LFBBR0VfU0laRSk7CisJCWlmKHRpbnRbMV0gIT0gLTEpCisJCQlicmVhazsKKworCX0KKworCXByaW50aygiaTU5Nl90ZXN0IHJlc3VsdCAlZFxuIiwgdGludFsxXSk7CisKK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgaTU5Nl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJREVCKERFQl9PUEVOLCBwcmludGsoIiVzOiBpNTk2X29wZW4oKSBpcnEgJWQuXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKSk7CisKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICZpNTk2X2ludGVycnVwdCwgMCwgImk4MjU5NiIsIGRldikpIHsKKwkJcHJpbnRrKCIlczogSVJRICVkIG5vdCBmcmVlXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJZ290byBvdXQ7CisJfQorCisJaW5pdF9yeF9idWZzKGRldik7CisKKwlpZiAoaW5pdF9pNTk2X21lbShkZXYpKSB7CisJCXByaW50aygiJXM6IEZhaWxlZCB0byBpbml0IG1lbW9yeVxuIiwgZGV2LT5uYW1lKTsKKwkJZ290byBvdXRfcmVtb3ZlX3J4X2J1ZnM7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworCitvdXRfcmVtb3ZlX3J4X2J1ZnM6CisJcmVtb3ZlX3J4X2J1ZnMoZGV2KTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKK291dDoKKwlyZXR1cm4gLUVBR0FJTjsKK30KKworc3RhdGljIHZvaWQgaTU5Nl90eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCisJLyogVHJhbnNtaXR0ZXIgdGltZW91dCwgc2VyaW91cyBwcm9ibGVtcy4gKi8KKwlERUIoREVCX0VSUk9SUywgcHJpbnRrKCIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgcmVzZXR0aW5nLlxuIiwKKwkJCWRldi0+bmFtZSkpOworCisJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCisJLyogVHJ5IHRvIHJlc3RhcnQgdGhlIGFkYXB0b3IgKi8KKwlpZiAobHAtPmxhc3RfcmVzdGFydCA9PSBscC0+c3RhdHMudHhfcGFja2V0cykgeworCQlERUIoREVCX0VSUk9SUywgcHJpbnRrKCJSZXNldHRpbmcgYm9hcmQuXG4iKSk7CisJCS8qIFNodXRkb3duIGFuZCByZXN0YXJ0ICovCisJCWk1OTZfcmVzZXQgKGRldiwgbHApOworCX0gZWxzZSB7CisJCS8qIElzc3VlIGEgY2hhbm5lbCBhdHRlbnRpb24gc2lnbmFsICovCisJCURFQihERUJfRVJST1JTLCBwcmludGsoIktpY2tpbmcgYm9hcmQuXG4iKSk7CisJCWxwLT5zY2IuY29tbWFuZCA9IENVQ19TVEFSVCB8IFJYX1NUQVJUOworCQlDSEVDS19XQkFDS19JTlYoJihscC0+c2NiKSwgc2l6ZW9mKHN0cnVjdCBpNTk2X3NjYikpOworCQlDQSAoZGV2KTsKKwkJbHAtPmxhc3RfcmVzdGFydCA9IGxwLT5zdGF0cy50eF9wYWNrZXRzOworCX0KKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3dha2VfcXVldWUgKGRldik7Cit9CisKKworc3RhdGljIGludCBpNTk2X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgdHhfY21kICp0eF9jbWQ7CisJc3RydWN0IGk1OTZfdGJkICp0YmQ7CisJc2hvcnQgbGVuZ3RoID0gc2tiLT5sZW47CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlERUIoREVCX1NUQVJUVFgsIHByaW50aygiJXM6IGk1OTZfc3RhcnRfeG1pdCgleCwlcCkgY2FsbGVkXG4iLCBkZXYtPm5hbWUsCisJCQkJc2tiLT5sZW4sIHNrYi0+ZGF0YSkpOworCisJaWYgKGxlbmd0aCA8IEVUSF9aTEVOKSB7CisJCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCWxlbmd0aCA9IEVUSF9aTEVOOworCX0KKwkKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwl0eF9jbWQgPSBscC0+dHhfY21kcyArIGxwLT5uZXh0X3R4X2NtZDsKKwl0YmQgPSBscC0+dGJkcyArIGxwLT5uZXh0X3R4X2NtZDsKKworCWlmICh0eF9jbWQtPmNtZC5jb21tYW5kKSB7CisJCURFQihERUJfRVJST1JTLCBwcmludGsoIiVzOiB4bWl0IHJpbmcgZnVsbCwgZHJvcHBpbmcgcGFja2V0LlxuIiwKKwkJCQlkZXYtPm5hbWUpKTsKKwkJbHAtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfSBlbHNlIHsKKwkJaWYgKCsrbHAtPm5leHRfdHhfY21kID09IFRYX1JJTkdfU0laRSkKKwkJCWxwLT5uZXh0X3R4X2NtZCA9IDA7CisJCXR4X2NtZC0+dGJkID0gV1NXQVB0YmQodmlydF90b19kbWEobHAsdGJkKSk7CisJCXRiZC0+bmV4dCA9IEk1OTZfTlVMTDsKKworCQl0eF9jbWQtPmNtZC5jb21tYW5kID0gQ01EX0ZMRVggfCBDbWRUeDsKKwkJdHhfY21kLT5za2IgPSBza2I7CisKKwkJdHhfY21kLT5wYWQgPSAwOworCQl0eF9jbWQtPnNpemUgPSAwOworCQl0YmQtPnBhZCA9IDA7CisJCXRiZC0+c2l6ZSA9IEVPRiB8IGxlbmd0aDsKKworCQl0eF9jbWQtPmRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUobHAtPmRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwKKwkJCQlETUFfVE9fREVWSUNFKTsKKwkJdGJkLT5kYXRhID0gV1NXQVBjaGFyKHR4X2NtZC0+ZG1hX2FkZHIpOworCisJCURFQihERUJfVFhBRERSLHByaW50X2V0aChza2ItPmRhdGEsICJ0eC1xdWV1ZWQiKSk7CisJCUNIRUNLX1dCQUNLX0lOVih0eF9jbWQsIHNpemVvZihzdHJ1Y3QgdHhfY21kKSk7CisJCUNIRUNLX1dCQUNLX0lOVih0YmQsIHNpemVvZihzdHJ1Y3QgaTU5Nl90YmQpKTsKKwkJaTU5Nl9hZGRfY21kKGRldiwgJnR4X2NtZC0+Y21kKTsKKworCQlscC0+c3RhdHMudHhfcGFja2V0cysrOworCQlscC0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuZ3RoOworCX0KKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZXRoKHVuc2lnbmVkIGNoYXIgKmFkZCwgY2hhciAqc3RyKQoreworCWludCBpOworCisJcHJpbnRrKCJpNTk2IDB4JXAsICIsIGFkZCk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIgJTAyWCIsIGFkZFtpICsgNl0pOworCXByaW50aygiIC0tPiIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiICUwMlgiLCBhZGRbaV0pOworCXByaW50aygiICUwMlglMDJYLCAlc1xuIiwgYWRkWzEyXSwgYWRkWzEzXSwgc3RyKTsKK30KKworCisjZGVmaW5lIExBTl9QUk9NX0FERFIJMHhGMDgxMDAwMAorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpODI1OTZfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBkZXZpY2UgKmdlbl9kZXYpCit7CisJaW50IGk7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHA7CisJY2hhciBldGhfYWRkcls2XTsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCisJLyogVGhpcyBsb3QgaXMgZW5zdXJlIHRoaW5ncyBoYXZlIGJlZW4gY2FjaGUgbGluZSBhbGlnbmVkLiAqLworCWlmIChzaXplb2Yoc3RydWN0IGk1OTZfcmZkKSAhPSAzMikgeworCSAgICBwcmludGsoIjgyNTk2OiBzaXplb2Yoc3RydWN0IGk1OTZfcmZkKSA9ICVkXG4iLAorCQkJICAgIChpbnQpc2l6ZW9mKHN0cnVjdCBpNTk2X3JmZCkpOworCSAgICByZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKChzaXplb2Yoc3RydWN0IGk1OTZfcmJkKSAlIDMyKSAhPSAwKSB7CisJICAgIHByaW50aygiODI1OTY6IHNpemVvZihzdHJ1Y3QgaTU5Nl9yYmQpID0gJWRcbiIsCisJCQkgICAgKGludClzaXplb2Yoc3RydWN0IGk1OTZfcmJkKSk7CisJICAgIHJldHVybiAtRU5PREVWOworCX0KKwlpZiAoKHNpemVvZihzdHJ1Y3QgdHhfY21kKSAlIDMyKSAhPSAwKSB7CisJICAgIHByaW50aygiODI1OTY6IHNpemVvZihzdHJ1Y3QgdHhfY21kKSA9ICVkXG4iLAorCQkJICAgIChpbnQpc2l6ZW9mKHN0cnVjdCB0eF9jbWQpKTsKKwkgICAgcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChzaXplb2Yoc3RydWN0IGk1OTZfdGJkKSAhPSAzMikgeworCSAgICBwcmludGsoIjgyNTk2OiBzaXplb2Yoc3RydWN0IGk1OTZfdGJkKSA9ICVkXG4iLAorCQkJICAgIChpbnQpc2l6ZW9mKHN0cnVjdCBpNTk2X3RiZCkpOworCSAgICByZXR1cm4gLUVOT0RFVjsKKwl9CisjaWZuZGVmIF9fTFA2NF9fCisJaWYgKHNpemVvZihzdHJ1Y3QgaTU5Nl9wcml2YXRlKSA+IDQwOTYpIHsKKwkgICAgcHJpbnRrKCI4MjU5Njogc2l6ZW9mKHN0cnVjdCBpNTk2X3ByaXZhdGUpID0gJWRcbiIsCisJCQkgICAgKGludClzaXplb2Yoc3RydWN0IGk1OTZfcHJpdmF0ZSkpOworCSAgICByZXR1cm4gLUVOT0RFVjsKKwl9CisjZW5kaWYKKworCWlmICghZGV2LT5iYXNlX2FkZHIgfHwgIWRldi0+aXJxKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChwZGNfbGFuX3N0YXRpb25faWQoZXRoX2FkZHIsIGRldi0+YmFzZV9hZGRyKSkgeworCQlmb3IgKGk9MDsgaSA8IDY7IGkrKykgeworCQkJZXRoX2FkZHJbaV0gPSBnc2NfcmVhZGIoTEFOX1BST01fQUREUiArIGkpOworCQl9CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNQUMgb2YgSFA3MDAgTEFOIHJlYWQgZnJvbSBFRVBST01cbiIsIF9fRklMRV9fKTsKKwl9CisKKwlkZXYtPm1lbV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKSBkbWFfYWxsb2Nfbm9uY29oZXJlbnQoZ2VuX2RldiwgCisJCXNpemVvZihzdHJ1Y3QgaTU5Nl9wcml2YXRlKSwgJmRtYV9hZGRyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+bWVtX3N0YXJ0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkbid0IGdldCBzaGFyZWQgbWVtb3J5XG4iLCBfX0ZJTEVfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSBldGhfYWRkcltpXTsKKworCS8qIFRoZSA4MjU5Ni1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9IGk1OTZfb3BlbjsKKwlkZXYtPnN0b3AgPSBpNTk2X2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaTU5Nl9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gaTU5Nl9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT50eF90aW1lb3V0ID0gaTU5Nl90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCisJZGV2LT5wcml2ID0gKHZvaWQgKikoZGV2LT5tZW1fc3RhcnQpOworCisJbHAgPSBkZXYtPnByaXY7CisJbWVtc2V0KGxwLCAwLCBzaXplb2Yoc3RydWN0IGk1OTZfcHJpdmF0ZSkpOworCisJbHAtPnNjYi5jb21tYW5kID0gMDsKKwlscC0+c2NiLmNtZCA9IEk1OTZfTlVMTDsKKwlscC0+c2NiLnJmZCA9IEk1OTZfTlVMTDsKKwlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCWxwLT5kbWFfYWRkciA9IGRtYV9hZGRyOworCWxwLT5kZXYgPSBnZW5fZGV2OworCisJQ0hFQ0tfV0JBQ0tfSU5WKGRldi0+bWVtX3N0YXJ0LCBzaXplb2Yoc3RydWN0IGk1OTZfcHJpdmF0ZSkpOworCisJaSA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChpKSB7CisJCWxwID0gZGV2LT5wcml2OworCQlkbWFfZnJlZV9ub25jb2hlcmVudChscC0+ZGV2LCBzaXplb2Yoc3RydWN0IGk1OTZfcHJpdmF0ZSksIAorCQkJCSAgICAodm9pZCAqKWRldi0+bWVtX3N0YXJ0LCBscC0+ZG1hX2FkZHIpOworCQlyZXR1cm4gaTsKKwl9OworCisJREVCKERFQl9QUk9CRSwgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IDgyNTk2IGF0ICUjM2x4LCIsIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIpKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlERUIoREVCX1BST0JFLCBwcmludGsoIiAlMi4yWCIsIGRldi0+ZGV2X2FkZHJbaV0pKTsKKwlERUIoREVCX1BST0JFLCBwcmludGsoIiBJUlEgJWQuXG4iLCBkZXYtPmlycSkpOworCURFQihERUJfSU5JVCwgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxwIGF0IDB4JXAgKCVkIGJ5dGVzKSwgbHAtPnNjYiBhdCAweCVwXG4iLAorCQlkZXYtPm5hbWUsIGxwLCAoaW50KXNpemVvZihzdHJ1Y3QgaTU5Nl9wcml2YXRlKSwgJmxwLT5zY2IpKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpNTk2X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHA7CisJdW5zaWduZWQgc2hvcnQgc3RhdHVzLCBhY2tfY21kID0gMDsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsoIiVzOiBpcnEgJWQgZm9yIHVua25vd24gZGV2aWNlLlxuIiwgX19GVU5DVElPTl9fLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJbHAgPSBkZXYtPnByaXY7CisKKwlzcGluX2xvY2sgKCZscC0+bG9jayk7CisKKwl3YWl0X2NtZChkZXYsIGxwLCAxMDAsICJpNTk2IGludGVycnVwdCwgdGltZW91dCIpOworCXN0YXR1cyA9IGxwLT5zY2Iuc3RhdHVzOworCisJREVCKERFQl9JTlRTLCBwcmludGsoIiVzOiBpNTk2IGludGVycnVwdCwgSVJRICVkLCBzdGF0dXMgJTQuNHguXG4iLAorCQkJZGV2LT5uYW1lLCBpcnEsIHN0YXR1cykpOworCisJYWNrX2NtZCA9IHN0YXR1cyAmIDB4ZjAwMDsKKworCWlmICghYWNrX2NtZCkgeworCQlERUIoREVCX0VSUk9SUywgcHJpbnRrKCIlczogaW50ZXJydXB0IHdpdGggbm8gZXZlbnRzXG4iLCBkZXYtPm5hbWUpKTsKKwkJc3Bpbl91bmxvY2sgKCZscC0+bG9jayk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAoKHN0YXR1cyAmIDB4ODAwMCkgfHwgKHN0YXR1cyAmIDB4MjAwMCkpIHsKKwkJc3RydWN0IGk1OTZfY21kICpwdHI7CisKKwkJaWYgKChzdGF0dXMgJiAweDgwMDApKQorCQkJREVCKERFQl9JTlRTLCBwcmludGsoIiVzOiBpNTk2IGludGVycnVwdCBjb21wbGV0ZWQgY29tbWFuZC5cbiIsIGRldi0+bmFtZSkpOworCQlpZiAoKHN0YXR1cyAmIDB4MjAwMCkpCisJCQlERUIoREVCX0lOVFMsIHByaW50aygiJXM6IGk1OTYgaW50ZXJydXB0IGNvbW1hbmQgdW5pdCBpbmFjdGl2ZSAleC5cbiIsIGRldi0+bmFtZSwgc3RhdHVzICYgMHgwNzAwKSk7CisKKwkJd2hpbGUgKGxwLT5jbWRfaGVhZCAhPSBOVUxMKSB7CisJCQlDSEVDS19JTlYobHAtPmNtZF9oZWFkLCBzaXplb2Yoc3RydWN0IGk1OTZfY21kKSk7CisJCQlpZiAoIShscC0+Y21kX2hlYWQtPnN0YXR1cyAmIFNUQVRfQykpCisJCQkJYnJlYWs7CisKKwkJCXB0ciA9IGxwLT5jbWRfaGVhZDsKKworCQkJREVCKERFQl9TVEFUVVMsIHByaW50aygiY21kX2hlYWQtPnN0YXR1cyA9ICUwNHgsIC0+Y29tbWFuZCA9ICUwNHhcbiIsCisJCQkJICAgICAgIGxwLT5jbWRfaGVhZC0+c3RhdHVzLCBscC0+Y21kX2hlYWQtPmNvbW1hbmQpKTsKKwkJCWxwLT5jbWRfaGVhZCA9IHB0ci0+dl9uZXh0OworCQkJbHAtPmNtZF9iYWNrbG9nLS07CisKKwkJCXN3aXRjaCAoKHB0ci0+Y29tbWFuZCkgJiAweDcpIHsKKwkJCWNhc2UgQ21kVHg6CisJCQkgICAgeworCQkJCXN0cnVjdCB0eF9jbWQgKnR4X2NtZCA9IChzdHJ1Y3QgdHhfY21kICopIHB0cjsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHhfY21kLT5za2I7CisKKwkJCQlpZiAoKHB0ci0+c3RhdHVzKSAmIFNUQVRfT0spIHsKKwkJCQkJREVCKERFQl9UWEFERFIsIHByaW50X2V0aChza2ItPmRhdGEsICJ0eC1kb25lIikpOworCQkJCX0gZWxzZSB7CisJCQkJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQkJaWYgKChwdHItPnN0YXR1cykgJiAweDAwMjApCisJCQkJCQlscC0+c3RhdHMuY29sbGlzaW9ucysrOworCQkJCQlpZiAoISgocHRyLT5zdGF0dXMpICYgMHgwMDQwKSkKKwkJCQkJCWxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCQkJCWlmICgocHRyLT5zdGF0dXMpICYgMHgwNDAwKQorCQkJCQkJbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJCWlmICgocHRyLT5zdGF0dXMpICYgMHgwODAwKQorCQkJCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJCQkJaWYgKChwdHItPnN0YXR1cykgJiAweDEwMDApCisJCQkJCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQl9CisJCQkJZG1hX3VubWFwX3NpbmdsZShscC0+ZGV2LCB0eF9jbWQtPmRtYV9hZGRyLCBza2ItPmxlbiwgRE1BX1RPX0RFVklDRSk7CisJCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKworCQkJCXR4X2NtZC0+Y21kLmNvbW1hbmQgPSAwOyAvKiBNYXJrIGZyZWUgKi8KKwkJCQlicmVhazsKKwkJCSAgICB9CisJCQljYXNlIENtZFREUjoKKwkJCSAgICB7CisJCQkJdW5zaWduZWQgc2hvcnQgc3RhdHVzID0gKChzdHJ1Y3QgdGRyX2NtZCAqKXB0ciktPnN0YXR1czsKKworCQkJCWlmIChzdGF0dXMgJiAweDgwMDApIHsKKwkJCQkJREVCKERFQl9BTlksIHByaW50aygiJXM6IGxpbmsgb2suXG4iLCBkZXYtPm5hbWUpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoc3RhdHVzICYgMHg0MDAwKQorCQkJCQkJcHJpbnRrKCIlczogVHJhbnNjZWl2ZXIgcHJvYmxlbS5cbiIsIGRldi0+bmFtZSk7CisJCQkJCWlmIChzdGF0dXMgJiAweDIwMDApCisJCQkJCQlwcmludGsoIiVzOiBUZXJtaW5hdGlvbiBwcm9ibGVtLlxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJaWYgKHN0YXR1cyAmIDB4MTAwMCkKKwkJCQkJCXByaW50aygiJXM6IFNob3J0IGNpcmN1aXQuXG4iLCBkZXYtPm5hbWUpOworCisJCQkJCURFQihERUJfVERSLCBwcmludGsoIiVzOiBUaW1lICVkLlxuIiwgZGV2LT5uYW1lLCBzdGF0dXMgJiAweDA3ZmYpKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkgICAgfQorCQkJY2FzZSBDbWRDb25maWd1cmU6CisJCQkJLyogWmFwIGNvbW1hbmQgc28gc2V0X211bHRpY2FzdF9saXN0KCkga25vd3MgaXQgaXMgZnJlZSAqLworCQkJCXB0ci0+Y29tbWFuZCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwdHItPnZfbmV4dCA9IE5VTEw7CisJCSAgICAgICAgcHRyLT5iX25leHQgPSBJNTk2X05VTEw7CisJCQlDSEVDS19XQkFDSyhwdHIsIHNpemVvZihzdHJ1Y3QgaTU5Nl9jbWQpKTsKKwkJCWxwLT5sYXN0X2NtZCA9IGppZmZpZXM7CisJCX0KKworCQkvKiBUaGlzIG1lc3MgaXMgYXJyYW5naW5nIHRoYXQgb25seSB0aGUgbGFzdCBvZiBhbnkgb3V0c3RhbmRpbmcKKwkJICogY29tbWFuZHMgaGFzIHRoZSBpbnRlcnJ1cHQgYml0IHNldC4gIFNob3VsZCBwcm9iYWJseSByZWFsbHkKKwkJICogb25seSBhZGQgdG8gdGhlIGNtZCBxdWV1ZSB3aGVuIHRoZSBDVSBpcyBzdG9wcGVkLgorCQkgKi8KKwkJcHRyID0gbHAtPmNtZF9oZWFkOworCQl3aGlsZSAoKHB0ciAhPSBOVUxMKSAmJiAocHRyICE9IGxwLT5jbWRfdGFpbCkpIHsKKwkJCXN0cnVjdCBpNTk2X2NtZCAqcHJldiA9IHB0cjsKKworCQkJcHRyLT5jb21tYW5kICY9IDB4MWZmZjsKKwkJCXB0ciA9IHB0ci0+dl9uZXh0OworCQkJQ0hFQ0tfV0JBQ0tfSU5WKHByZXYsIHNpemVvZihzdHJ1Y3QgaTU5Nl9jbWQpKTsKKwkJfQorCisJCWlmICgobHAtPmNtZF9oZWFkICE9IE5VTEwpKQorCQkJYWNrX2NtZCB8PSBDVUNfU1RBUlQ7CisJCWxwLT5zY2IuY21kID0gV1NXQVBjbWQodmlydF90b19kbWEobHAsJmxwLT5jbWRfaGVhZC0+c3RhdHVzKSk7CisJCUNIRUNLX1dCQUNLX0lOVigmbHAtPnNjYiwgc2l6ZW9mKHN0cnVjdCBpNTk2X3NjYikpOworCX0KKwlpZiAoKHN0YXR1cyAmIDB4MTAwMCkgfHwgKHN0YXR1cyAmIDB4NDAwMCkpIHsKKwkJaWYgKChzdGF0dXMgJiAweDQwMDApKQorCQkJREVCKERFQl9JTlRTLCBwcmludGsoIiVzOiBpNTk2IGludGVycnVwdCByZWNlaXZlZCBhIGZyYW1lLlxuIiwgZGV2LT5uYW1lKSk7CisJCWk1OTZfcngoZGV2KTsKKwkJLyogT25seSBSWF9TVEFSVCBpZiBzdG9wcGVkIC0gUkdIIDA3LTA3LTk2ICovCisJCWlmIChzdGF0dXMgJiAweDEwMDApIHsKKwkJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJCQlERUIoREVCX0VSUk9SUywgcHJpbnRrKCIlczogaTU5NiBpbnRlcnJ1cHQgcmVjZWl2ZSB1bml0IGluYWN0aXZlLCBzdGF0dXMgMHgleFxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpKTsKKwkJCQlhY2tfY21kIHw9IFJYX1NUQVJUOworCQkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCQlyZWJ1aWxkX3J4X2J1ZnMoZGV2KTsKKwkJCX0KKwkJfQorCX0KKwl3YWl0X2NtZChkZXYsIGxwLCAxMDAsICJpNTk2IGludGVycnVwdCwgdGltZW91dCIpOworCWxwLT5zY2IuY29tbWFuZCA9IGFja19jbWQ7CisJQ0hFQ0tfV0JBQ0soJmxwLT5zY2IsIHNpemVvZihzdHJ1Y3QgaTU5Nl9zY2IpKTsKKworCS8qIERBTkdFUjogSSBzdXNwZWN0IHRoYXQgc29tZSBraW5kIG9mIGludGVycnVwdAorCSBhY2tub3dsZWRnZW1lbnQgYXNpZGUgZnJvbSBhY2tpbmcgdGhlIDgyNTk2IG1pZ2h0IGJlIG5lZWRlZCAKKwkgaGVyZS4uLiAgYnV0IGl0J3MgcnVubmluZyBhY2NlcHRhYmx5IHdpdGhvdXQgKi8KKworCUNBKGRldik7CisKKwl3YWl0X2NtZChkZXYsIGxwLCAxMDAsICJpNTk2IGludGVycnVwdCwgZXhpdCB0aW1lb3V0Iik7CisJREVCKERFQl9JTlRTLCBwcmludGsoIiVzOiBleGl0aW5nIGludGVycnVwdC5cbiIsIGRldi0+bmFtZSkpOworCisJc3Bpbl91bmxvY2sgKCZscC0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGk1OTZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJREVCKERFQl9JTklULCBwcmludGsoIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZCwgc3RhdHVzIHdhcyAlNC40eC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGxwLT5zY2Iuc3RhdHVzKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCXdhaXRfY21kKGRldiwgbHAsIDEwMCwgImNsb3NlMSB0aW1lZCBvdXQiKTsKKwlscC0+c2NiLmNvbW1hbmQgPSBDVUNfQUJPUlQgfCBSWF9BQk9SVDsKKwlDSEVDS19XQkFDSygmbHAtPnNjYiwgc2l6ZW9mKHN0cnVjdCBpNTk2X3NjYikpOworCisJQ0EoZGV2KTsKKworCXdhaXRfY21kKGRldiwgbHAsIDEwMCwgImNsb3NlMiB0aW1lZCBvdXQiKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCURFQihERUJfU1RSVUNULGk1OTZfZGlzcGxheV9kYXRhKGRldikpOworCWk1OTZfY2xlYW51cF9jbWQoZGV2LGxwKTsKKworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJlbW92ZV9yeF9idWZzKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKKyBpNTk2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qCisgKiAgICBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAqLworCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlpbnQgY29uZmlnID0gMCwgY250OworCisJREVCKERFQl9NVUxUSSwgcHJpbnRrKCIlczogc2V0IG11bHRpY2FzdCBsaXN0LCAlZCBlbnRyaWVzLCBwcm9taXNjICVzLCBhbGxtdWx0aSAlc1xuIiwKKwkJZGV2LT5uYW1lLCBkZXYtPm1jX2NvdW50LCBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MgPyAiT04iIDogIk9GRiIsCisJCWRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgPyAiT04iIDogIk9GRiIpKTsKKworCWlmICgoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSAmJiAhKGxwLT5jZl9jbWQuaTU5Nl9jb25maWdbOF0gJiAweDAxKSkgeworCQlscC0+Y2ZfY21kLmk1OTZfY29uZmlnWzhdIHw9IDB4MDE7CisJCWNvbmZpZyA9IDE7CisJfQorCWlmICghKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgJiYgKGxwLT5jZl9jbWQuaTU5Nl9jb25maWdbOF0gJiAweDAxKSkgeworCQlscC0+Y2ZfY21kLmk1OTZfY29uZmlnWzhdICY9IH4weDAxOworCQljb25maWcgPSAxOworCX0KKwlpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpICYmIChscC0+Y2ZfY21kLmk1OTZfY29uZmlnWzExXSAmIDB4MjApKSB7CisJCWxwLT5jZl9jbWQuaTU5Nl9jb25maWdbMTFdICY9IH4weDIwOworCQljb25maWcgPSAxOworCX0KKwlpZiAoIShkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSAmJiAhKGxwLT5jZl9jbWQuaTU5Nl9jb25maWdbMTFdICYgMHgyMCkpIHsKKwkJbHAtPmNmX2NtZC5pNTk2X2NvbmZpZ1sxMV0gfD0gMHgyMDsKKwkJY29uZmlnID0gMTsKKwl9CisJaWYgKGNvbmZpZykgeworCQlpZiAobHAtPmNmX2NtZC5jbWQuY29tbWFuZCkKKwkJCXByaW50aygiJXM6IGNvbmZpZyBjaGFuZ2UgcmVxdWVzdCBhbHJlYWR5IHF1ZXVlZFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQllbHNlIHsKKwkJCWxwLT5jZl9jbWQuY21kLmNvbW1hbmQgPSBDbWRDb25maWd1cmU7CisJCQlDSEVDS19XQkFDS19JTlYoJmxwLT5jZl9jbWQsIHNpemVvZihzdHJ1Y3QgY2ZfY21kKSk7CisJCQlpNTk2X2FkZF9jbWQoZGV2LCAmbHAtPmNmX2NtZC5jbWQpOworCQl9CisJfQorCisJY250ID0gZGV2LT5tY19jb3VudDsKKwlpZiAoY250ID4gTUFYX01DX0NOVCkKKwl7CisJCWNudCA9IE1BWF9NQ19DTlQ7CisJCXByaW50aygiJXM6IE9ubHkgJWQgbXVsdGljYXN0IGFkZHJlc3NlcyBzdXBwb3J0ZWQiLAorCQkJZGV2LT5uYW1lLCBjbnQpOworCX0KKwkKKwlpZiAoZGV2LT5tY19jb3VudCA+IDApIHsKKwkJc3RydWN0IGRldl9tY19saXN0ICpkbWk7CisJCXVuc2lnbmVkIGNoYXIgKmNwOworCQlzdHJ1Y3QgbWNfY21kICpjbWQ7CisKKwkJY21kID0gJmxwLT5tY19jbWQ7CisJCWNtZC0+Y21kLmNvbW1hbmQgPSBDbWRNdWx0aWNhc3RMaXN0OworCQljbWQtPm1jX2NudCA9IGRldi0+bWNfY291bnQgKiA2OworCQljcCA9IGNtZC0+bWNfYWRkcnM7CisJCWZvciAoZG1pID0gZGV2LT5tY19saXN0OyBjbnQgJiYgZG1pICE9IE5VTEw7IGRtaSA9IGRtaS0+bmV4dCwgY250LS0sIGNwICs9IDYpIHsKKwkJCW1lbWNweShjcCwgZG1pLT5kbWlfYWRkciwgNik7CisJCQlpZiAoaTU5Nl9kZWJ1ZyA+IDEpCisJCQkJREVCKERFQl9NVUxUSSwgcHJpbnRrKCIlczogQWRkaW5nIGFkZHJlc3MgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJCQlkZXYtPm5hbWUsIGNwWzBdLGNwWzFdLGNwWzJdLGNwWzNdLGNwWzRdLGNwWzVdKSk7CisJCX0KKwkJQ0hFQ0tfV0JBQ0tfSU5WKCZscC0+bWNfY21kLCBzaXplb2Yoc3RydWN0IG1jX2NtZCkpOworCQlpNTk2X2FkZF9jbWQoZGV2LCAmY21kLT5jbWQpOworCX0KK30KKworTU9EVUxFX1BBUk0oZGVidWcsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAibGFzaV84MjU5NiBkZWJ1ZyBtYXNrIik7CitzdGF0aWMgaW50IGRlYnVnID0gLTE7CisKK3N0YXRpYyBpbnQgbnVtX2RyaXZlcnM7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldnNbTUFYX0RSSVZFUlNdOworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorbGFuX2luaXRfY2hpcChzdHJ1Y3QgcGFyaXNjX2RldmljZSAqZGV2KQoreworCXN0cnVjdAluZXRfZGV2aWNlICpuZXRkZXZpY2U7CisJaW50CXJldHZhbDsKKworCWlmIChudW1fZHJpdmVycyA+PSBNQVhfRFJJVkVSUykgeworCQkvKiBtYXggY291bnQgb2YgcG9zc2libGUgaTgyNTk2IGRyaXZlcnMgcmVhY2hlZCAqLworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAobnVtX2RyaXZlcnMgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyBMQVNJXzgyNTk2X0RSSVZFUl9WRVJTSU9OICJcbiIpOworCQorCWlmICghZGV2LT5pcnEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSVJRIG5vdCBmb3VuZCBmb3IgaTgyNTk2IGF0IDB4JWx4XG4iLAorCQkJX19GSUxFX18sIGRldi0+aHBhKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgaTgyNTk2IGF0IDB4JWx4LCBJUlEgJWRcbiIsIGRldi0+aHBhLCBkZXYtPmlycSk7CisKKwluZXRkZXZpY2UgPSBhbGxvY19ldGhlcmRldigwKTsKKwlpZiAoIW5ldGRldmljZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwluZXRkZXZpY2UtPmJhc2VfYWRkciA9IGRldi0+aHBhOworCW5ldGRldmljZS0+aXJxID0gZGV2LT5pcnE7CisKKwlyZXR2YWwgPSBpODI1OTZfcHJvYmUobmV0ZGV2aWNlLCAmZGV2LT5kZXYpOworCWlmIChyZXR2YWwpIHsKKwkJZnJlZV9uZXRkZXYobmV0ZGV2aWNlKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGRldi0+aWQuc3ZlcnNpb24gPT0gMHg3MikgeworCQkoKHN0cnVjdCBpNTk2X3ByaXZhdGUgKiluZXRkZXZpY2UtPnByaXYpLT5vcHRpb25zID0gT1BUX1NXQVBfUE9SVDsKKwl9CisKKwluZXRkZXZzW251bV9kcml2ZXJzKytdID0gbmV0ZGV2aWNlOworCisJcmV0dXJuIHJldHZhbDsKK30KKworCitzdGF0aWMgc3RydWN0IHBhcmlzY19kZXZpY2VfaWQgbGFuX3RibFtdID0geworCXsgSFBIV19GSU8sIEhWRVJTSU9OX1JFVl9BTllfSUQsIEhWRVJTSU9OX0FOWV9JRCwgMHgwMDA4YSB9LAorCXsgSFBIV19GSU8sIEhWRVJTSU9OX1JFVl9BTllfSUQsIEhWRVJTSU9OX0FOWV9JRCwgMHgwMDA3MiB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwYXJpc2MsIGxhbl90YmwpOworCitzdGF0aWMgc3RydWN0IHBhcmlzY19kcml2ZXIgbGFuX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiQXByaWNvdCIsCisJLmlkX3RhYmxlCT0gbGFuX3RibCwKKwkucHJvYmUJCT0gbGFuX2luaXRfY2hpcCwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGxhc2lfODI1OTZfaW5pdCh2b2lkKQoreworCWlmIChkZWJ1ZyA+PSAwKQorCQlpNTk2X2RlYnVnID0gZGVidWc7CisJcmV0dXJuIHJlZ2lzdGVyX3BhcmlzY19kcml2ZXIoJmxhbl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChsYXNpXzgyNTk2X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbGFzaV84MjU5Nl9leGl0KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGk9MDsgaTxNQVhfRFJJVkVSUzsgaSsrKSB7CisJCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwOworCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2aWNlOworCQkKKwkJbmV0ZGV2aWNlID0gbmV0ZGV2c1tpXTsKKwkJaWYgKCFuZXRkZXZpY2UpIAorCQkJY29udGludWU7CisJCQorCQl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXZpY2UpOworCisJCWxwID0gbmV0ZGV2aWNlLT5wcml2OworCQlkbWFfZnJlZV9ub25jb2hlcmVudChscC0+ZGV2LCBzaXplb2Yoc3RydWN0IGk1OTZfcHJpdmF0ZSksIAorCQkJCSAgICAgICAodm9pZCAqKW5ldGRldmljZS0+bWVtX3N0YXJ0LCBscC0+ZG1hX2FkZHIpOworCQlmcmVlX25ldGRldihuZXRkZXZpY2UpOworCX0KKwludW1fZHJpdmVycyA9IDA7CisKKwl1bnJlZ2lzdGVyX3BhcmlzY19kcml2ZXIoJmxhbl9kcml2ZXIpOworfQorCittb2R1bGVfZXhpdChsYXNpXzgyNTk2X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbG5lMzkwLmMgYi9kcml2ZXJzL25ldC9sbmUzOTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzlhOTdjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbG5lMzkwLmMKQEAgLTAsMCArMSw0NTggQEAKKy8qCisJbG5lMzkwLmMKKworCUxpbnV4IGRyaXZlciBmb3IgTXlsZXggTE5FMzkwIEVJU0EgTmV0d29yayBBZGFwdGVyCisKKwlDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OCwgUGF1bCBHb3J0bWFrZXIuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCUluZm9ybWF0aW9uIGFuZCBDb2RlIFNvdXJjZXM6CisKKwkxKSBCYXNlZCB1cG9uIGZyYW1ld29yayBvZiBlczMyMTAgZHJpdmVyLgorCTIpIFRoZSBleGlzdGluZyBteXJpYWQgb2Ygb3RoZXIgTGludXggODM5MCBkcml2ZXJzIGJ5IERvbmFsZCBCZWNrZXIuCisJMykgUnVzcyBOZWxzb24ncyBhc20gcGFja2V0IGRyaXZlciBwcm92aWRlZCBhZGRpdGlvbmFsIGluZm8uCisJNCkgSW5mbyBmb3IgZ2V0dGluZyBJUlEgYW5kIHNoLW1lbSBnbGVhbmVkIGZyb20gdGhlIEVJU0EgY2ZnIGZpbGVzLgorCisJVGhlIExORTM5MCBpcyBhbiBFSVNBIHNoYXJlZCBtZW1vcnkgTlM4MzkwIGltcGxlbWVudGF0aW9uLiBOb3RlCisJdGhhdCBhbGwgbWVtb3J5IGNvcGllcyB0by9mcm9tIHRoZSBib2FyZCBtdXN0IGJlIDMyYml0IHRyYW5zZmVycy4KKwlUaGVyZSBhcmUgdHdvIHZlcnNpb25zIG9mIHRoZSBjYXJkOiB0aGUgbG5lMzkwYSBhbmQgdGhlIGxuZTM5MGIuCisJR29pbmcgYnkgdGhlIEVJU0EgY2ZnIGZpbGVzLCB0aGUgImEiIGhhcyBqdW1wZXJzIHRvIHNlbGVjdCBiZXR3ZWVuCisJQk5DL0FVSSwgYnV0IHRoZSAiYiIgYWxzbyBoYXMgUkotNDUgYW5kIHNlbGVjdGlvbiBpcyB2aWEgdGhlIFNDVS4KKwlUaGUgc2hhcmVkIG1lbW9yeSBhZGRyZXNzIHNlbGVjdGlvbiBpcyBhbHNvIHNsaWdodGx5IGRpZmZlcmVudC4KKwlOb3RlIHRoYXQgc2hhcmVkIG1lbW9yeSBhZGRyZXNzID4gMU1CIGFyZSBzdXBwb3J0ZWQgd2l0aCB0aGlzIGRyaXZlci4KKworCVlvdSBjYW4gdHJ5IDxodHRwOi8vd3d3Lm15bGV4LmNvbT4gaWYgeW91IHdhbnQgbW9yZSBpbmZvLCBhcyBJJ3ZlCisJbmV2ZXIgZXZlbiBzZWVuIG9uZSBvZiB0aGVzZSBjYXJkcy4gIDopCisKKwlBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4gLSAyMDAwLzA5LzAxCisJLSBnZXQgcmlkIG9mIGNoZWNrX3JlZ2lvbgorCS0gbm8gbmVlZCB0byBjaGVjayBpZiBkZXYgPT0gTlVMTCBpbiBsbmUzOTBfcHJvYmUxCisqLworCitzdGF0aWMgY29uc3QgY2hhciAqdmVyc2lvbiA9CisJImxuZTM5MC5jOiBEcml2ZXIgcmV2aXNpb24gdjAuOTkuMSwgMDEvMDkvMjAwMFxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vpc2EuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICI4MzkwLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgImxuZTM5MCIKKworc3RhdGljIGludCBsbmUzOTBfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpOworCitzdGF0aWMgaW50IGxuZTM5MF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBsbmUzOTBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyB2b2lkIGxuZTM5MF9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZCBsbmUzOTBfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsIGludCByaW5nX3BhZ2UpOworc3RhdGljIHZvaWQgbG5lMzkwX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIGxuZTM5MF9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGNvbnN0IGludCBzdGFydF9wYWdlKTsKKworI2RlZmluZSBMTkUzOTBfU1RBUlRfUEcJCTB4MDAgICAgLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIJKi8KKyNkZWZpbmUgTE5FMzkwX1NUT1BfUEcJCTB4ODAgICAgLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcJKi8KKworI2RlZmluZSBMTkUzOTBfSURfUE9SVAkJMHhjODAJLyogU2FtZSBmb3IgYWxsIEVJU0EgY2FyZHMgCSovCisjZGVmaW5lIExORTM5MF9JT19FWFRFTlQJMHgyMAorI2RlZmluZSBMTkUzOTBfU0FfUFJPTQkJMHgxNgkvKiBTdGFydCBvZiBlJ25ldCBhZGRyLgkJKi8KKyNkZWZpbmUgTE5FMzkwX1JFU0VUX1BPUlQJMHhjODQJLyogRnJvbSB0aGUgcGt0IGRyaXZlciBzb3VyY2UJKi8KKyNkZWZpbmUgTE5FMzkwX05JQ19PRkZTRVQJMHgwMAkvKiBIZWxsbywgdGhlIDgzOTAgaXMgKmhlcmUqCSovCisKKyNkZWZpbmUgTE5FMzkwX0FERFIwCQkweDAwCS8qIDMgYnl0ZSB2ZW5kb3IgcHJlZml4CQkqLworI2RlZmluZSBMTkUzOTBfQUREUjEJCTB4ODAKKyNkZWZpbmUgTE5FMzkwX0FERFIyCQkweGU1CisKKyNkZWZpbmUgTE5FMzkwX0lEMAkweDEwMDA5ODM1CS8qIDB4MzU5OCA9IDAxMTAxIDAxMTAwIDExMDAwID0gbWx4ICovCisjZGVmaW5lIExORTM5MF9JRDEJMHgxMTAwOTgzNQkvKiBhYm92ZSBpcyB0aGUgMzkwQSwgdGhpcyBpcyAzOTBCICAqLworCisjZGVmaW5lIExORTM5MF9DRkcxCQkweGM4NAkvKiBOQjogMHhjODQgaXMgYWxzbyAicmVzZXQiIHBvcnQuICovCisjZGVmaW5lIExORTM5MF9DRkcyCQkweGM5MAorCisvKgorICoJWW91IGNhbiBPUiBhbnkgb2YgdGhlIGZvbGxvd2luZyBiaXRzIHRvZ2V0aGVyIGFuZCBhc3NpZ24gaXQKKyAqCXRvIExORTM5MF9ERUJVRyB0byBnZXQgdmVyYm9zZSBkcml2ZXIgaW5mbyBkdXJpbmcgb3BlcmF0aW9uLgorICoJQ3VycmVudGx5IG9ubHkgdGhlIHByb2JlIG9uZSBpcyBpbXBsZW1lbnRlZC4KKyAqLworCisjZGVmaW5lIExORTM5MF9EX1BST0JFCTB4MDEKKyNkZWZpbmUgTE5FMzkwX0RfUlhfUEtUCTB4MDIKKyNkZWZpbmUgTE5FMzkwX0RfVFhfUEtUCTB4MDQKKyNkZWZpbmUgTE5FMzkwX0RfSVJRCTB4MDgKKworI2RlZmluZSBMTkUzOTBfREVCVUcJMAorCitzdGF0aWMgdW5zaWduZWQgY2hhciBpcnFfbWFwW10gX19pbml0ZGF0YSA9IHsxNSwgMTIsIDExLCAxMCwgOSwgNywgNSwgM307CitzdGF0aWMgdW5zaWduZWQgaW50IHNobWVtX21hcEFbXSBfX2luaXRkYXRhID0gezB4ZmYsIDB4ZmUsIDB4ZmQsIDB4ZmZmLCAweGZmZSwgMHhmZmMsIDB4MGQsIDB4MH07CitzdGF0aWMgdW5zaWduZWQgaW50IHNobWVtX21hcEJbXSBfX2luaXRkYXRhID0gezB4ZmYsIDB4ZmUsIDB4MGUsIDB4ZmZmLCAweGZmZSwgMHhmZmMsIDB4MGQsIDB4MH07CisKKy8qCisgKglQcm9iZSBmb3IgdGhlIGNhcmQuIFRoZSBiZXN0IHdheSBpcyB0byByZWFkIHRoZSBFSVNBIElEIGlmIGl0CisgKglpcyBrbm93bi4gVGhlbiB3ZSBjYW4gY2hlY2sgdGhlIHByZWZpeCBvZiB0aGUgc3RhdGlvbiBhZGRyZXNzCisgKglQUk9NIGZvciBhIG1hdGNoIGFnYWluc3QgdGhlIHZhbHVlIGFzc2lnbmVkIHRvIE15bGV4LgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGRvX2xuZTM5MF9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIHNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpcnEgPSBkZXYtPmlycTsKKwlpbnQgbWVtX3N0YXJ0ID0gZGV2LT5tZW1fc3RhcnQ7CisJaW50IHJldDsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWlmIChpb2FkZHIgPiAweDFmZikgewkJLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgTE5FMzkwX0lPX0VYVEVOVCwgRFJWX05BTUUpKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0ID0gbG5lMzkwX3Byb2JlMShkZXYsIGlvYWRkcik7CisJCWlmIChyZXQpCisJCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIExORTM5MF9JT19FWFRFTlQpOworCQlyZXR1cm4gcmV0OworCX0KKwllbHNlIGlmIChpb2FkZHIgPiAwKQkJLyogRG9uJ3QgcHJvYmUgYXQgYWxsLiAqLworCQlyZXR1cm4gLUVOWElPOworCisJaWYgKCFFSVNBX2J1cykgeworI2lmIExORTM5MF9ERUJVRyAmIExORTM5MF9EX1BST0JFCisJCXByaW50aygibG5lMzkwLWRlYnVnOiBOb3QgYW4gRUlTQSBidXMuIE5vdCBwcm9iaW5nIGhpZ2ggcG9ydHMuXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qIEVJU0Egc3BlYyBhbGxvd3MgZm9yIHVwIHRvIDE2IHNsb3RzLCBidXQgOCBpcyB0eXBpY2FsLiAqLworCWZvciAoaW9hZGRyID0gMHgxMDAwOyBpb2FkZHIgPCAweDkwMDA7IGlvYWRkciArPSAweDEwMDApIHsKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIExORTM5MF9JT19FWFRFTlQsIERSVl9OQU1FKSkKKwkJCWNvbnRpbnVlOworCQlpZiAobG5lMzkwX3Byb2JlMShkZXYsIGlvYWRkcikgPT0gMCkKKwkJCXJldHVybiAwOworCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIExORTM5MF9JT19FWFRFTlQpOworCQlkZXYtPmlycSA9IGlycTsKKwkJZGV2LT5tZW1fc3RhcnQgPSBtZW1fc3RhcnQ7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBMTkUzOTBfSU9fRVhURU5UKTsKKwlpb3VubWFwKGVpX3N0YXR1cy5tZW0pOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgbG5lMzkwX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKwlpbnQgZXJyOworCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisKKwllcnIgPSBkb19sbmUzOTBfcHJvYmUoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJY2xlYW51cF9jYXJkKGRldik7CitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGxuZTM5MF9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKwlpbnQgaSwgcmV2aXNpb24sIHJldDsKKwl1bnNpZ25lZCBsb25nIGVpc2FfaWQ7CisKKwlpZiAoaW5iX3AoaW9hZGRyICsgTE5FMzkwX0lEX1BPUlQpID09IDB4ZmYpIHJldHVybiAtRU5PREVWOworCisjaWYgTE5FMzkwX0RFQlVHICYgTE5FMzkwX0RfUFJPQkUKKwlwcmludGsoImxuZTM5MC1kZWJ1ZzogcHJvYmUgYXQgJSN4LCBJRCAlIzh4XG4iLCBpb2FkZHIsIGlubChpb2FkZHIgKyBMTkUzOTBfSURfUE9SVCkpOworCXByaW50aygibG5lMzkwLWRlYnVnOiBjb25maWcgcmVnczogJSN4ICUjeFxuIiwKKwkJaW5iKGlvYWRkciArIExORTM5MF9DRkcxKSwgaW5iKGlvYWRkciArIExORTM5MF9DRkcyKSk7CisjZW5kaWYKKworCisvKglDaGVjayB0aGUgRUlTQSBJRCBvZiB0aGUgY2FyZC4gKi8KKwllaXNhX2lkID0gaW5sKGlvYWRkciArIExORTM5MF9JRF9QT1JUKTsKKwlpZiAoKGVpc2FfaWQgIT0gTE5FMzkwX0lEMCkgJiYgKGVpc2FfaWQgIT0gTE5FMzkwX0lEMSkpIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV2aXNpb24gPSAoZWlzYV9pZCA+PiAyNCkgJiAweDAxOwkvKiAwID0gcmV2IEEsIDEgcmV2IEIgKi8KKwkKKyNpZiAwCisvKglDaGVjayB0aGUgTXlsZXggdmVuZG9yIElEIGFzIHdlbGwuIE5vdCByZWFsbHkgcmVxdWlyZWQuICovCisJaWYgKGluYihpb2FkZHIgKyBMTkUzOTBfU0FfUFJPTSArIDApICE9IExORTM5MF9BRERSMAorCQl8fCBpbmIoaW9hZGRyICsgTE5FMzkwX1NBX1BST00gKyAxKSAhPSBMTkUzOTBfQUREUjEKKwkJfHwgaW5iKGlvYWRkciArIExORTM5MF9TQV9QUk9NICsgMikgIT0gTE5FMzkwX0FERFIyICkgeworCQlwcmludGsoImxuZTM5MC5jOiBjYXJkIG5vdCBmb3VuZCIpOworCQlmb3IoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKQorCQkJcHJpbnRrKCIgJTAyeCIsIGluYihpb2FkZHIgKyBMTkUzOTBfU0FfUFJPTSArIGkpKTsKKwkJcHJpbnRrKCIgKGludmFsaWQgcHJlZml4KS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisjZW5kaWYKKworCXByaW50aygibG5lMzkwLmM6IExORTM5MCVYIGluIEVJU0Egc2xvdCAlZCwgYWRkcmVzcyIsIDB4YStyZXZpc2lvbiwgaW9hZGRyLzB4MTAwMCk7CisJZm9yKGkgPSAwOyBpIDwgRVRIRVJfQUREUl9MRU47IGkrKykKKwkJcHJpbnRrKCIgJTAyeCIsIChkZXYtPmRldl9hZGRyW2ldID0gaW5iKGlvYWRkciArIExORTM5MF9TQV9QUk9NICsgaSkpKTsKKwlwcmludGsoIi5cbmxuZTM5MC5jOiAiKTsKKworCS8qIFNuYXJmIHRoZSBpbnRlcnJ1cHQgbm93LiBDRkcgZmlsZSBoYXMgdGhlbSBhbGwgbGlzdGVkIGFzIGBlZGdlJyB3aXRoIHNoYXJlPU5PICovCisJaWYgKGRldi0+aXJxID09IDApIHsKKwkJdW5zaWduZWQgY2hhciBpcnFfcmVnID0gaW5iKGlvYWRkciArIExORTM5MF9DRkcyKSA+PiAzOworCQlkZXYtPmlycSA9IGlycV9tYXBbaXJxX3JlZyAmIDB4MDddOworCQlwcmludGsoInVzaW5nIik7CisJfSBlbHNlIHsKKwkJLyogVGhpcyBpcyB1c2VsZXNzIHVubGVzcyB3ZSByZXByb2dyYW0gdGhlIGNhcmQgaGVyZSB0b28gKi8KKwkJaWYgKGRldi0+aXJxID09IDIpIGRldi0+aXJxID0gOTsJLyogRG9oISAqLworCQlwcmludGsoImFzc2lnbmluZyIpOworCX0KKwlwcmludGsoIiBJUlEgJWQsIiwgZGV2LT5pcnEpOworCisJaWYgKChyZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgZWlfaW50ZXJydXB0LCAwLCBEUlZfTkFNRSwgZGV2KSkpIHsKKwkJcHJpbnRrICgiIHVuYWJsZSB0byBnZXQgSVJRICVkLlxuIiwgZGV2LT5pcnEpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChkZXYtPm1lbV9zdGFydCA9PSAwKSB7CisJCXVuc2lnbmVkIGNoYXIgbWVtX3JlZyA9IGluYihpb2FkZHIgKyBMTkUzOTBfQ0ZHMikgJiAweDA3OworCisJCWlmIChyZXZpc2lvbikJLyogTE5FMzkwQiAqLworCQkJZGV2LT5tZW1fc3RhcnQgPSBzaG1lbV9tYXBCW21lbV9yZWddICogMHgxMDAwMDsKKwkJZWxzZQkJLyogTE5FMzkwQSAqLworCQkJZGV2LT5tZW1fc3RhcnQgPSBzaG1lbV9tYXBBW21lbV9yZWddICogMHgxMDAwMDsKKwkJcHJpbnRrKCIgdXNpbmcgIik7CisJfSBlbHNlIHsKKwkJLyogU2hvdWxkIGNoZWNrIGZvciB2YWx1ZSBpbiBzaG1lbV9tYXAgYW5kIHJlcHJvZ3JhbSB0aGUgY2FyZCB0byB1c2UgaXQgKi8KKwkJZGV2LT5tZW1fc3RhcnQgJj0gMHhmZmYwMDAwOworCQlwcmludGsoIiBhc3NpZ25pbmcgIik7CisJfQorCisJcHJpbnRrKCIlZGtCIG1lbW9yeSBhdCBwaHlzaWNhbCBhZGRyZXNzICUjbHhcbiIsCisJCQlMTkUzOTBfU1RPUF9QRy80LCBkZXYtPm1lbV9zdGFydCk7CisKKwkvKgorCSAgIEJFV0FSRSEhIFNvbWUgZGFpbi1icmFtYWdlZCBFSVNBIFNDVXMgd2lsbCBhbGxvdyB5b3UgdG8gcHV0CisJICAgdGhlIGNhcmQgbWVtIHdpdGhpbiB0aGUgcmVnaW9uIGNvdmVyZWQgYnkgYG5vcm1hbCcgUkFNICAhISEKKworCSAgIGlvcmVtYXAoKSB3aWxsIGZhaWwgaW4gdGhhdCBjYXNlLgorCSovCisJZWlfc3RhdHVzLm1lbSA9IGlvcmVtYXAoZGV2LT5tZW1fc3RhcnQsIExORTM5MF9TVE9QX1BHKjB4MTAwKTsKKwlpZiAoIWVpX3N0YXR1cy5tZW0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsbmUzOTAuYzogVW5hYmxlIHRvIHJlbWFwIGNhcmQgbWVtb3J5IGFib3ZlIDFNQiAhIVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAibG5lMzkwLmM6IFRyeSB1c2luZyBFSVNBIFNDVSB0byBzZXQgbWVtb3J5IGJlbG93IDFNQi5cbiIpOworCQlwcmludGsoS0VSTl9FUlIgImxuZTM5MC5jOiBEcml2ZXIgTk9UIGluc3RhbGxlZC5cbiIpOworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIGNsZWFudXA7CisJfQorCXByaW50aygibG5lMzkwLmM6IHJlbWFwcGVkICVka0IgY2FyZCBtZW1vcnkgdG8gdmlydHVhbCBhZGRyZXNzICVwXG4iLAorCQkJTE5FMzkwX1NUT1BfUEcvNCwgZWlfc3RhdHVzLm1lbSk7CisKKwlkZXYtPm1lbV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKWVpX3N0YXR1cy5tZW07CisJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyAoTE5FMzkwX1NUT1BfUEcgLSBMTkUzOTBfU1RBUlRfUEcpKjI1NjsKKworCS8qIFRoZSA4MzkwIG9mZnNldCBpcyB6ZXJvIGZvciB0aGUgTE5FMzkwICovCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisKKwllaV9zdGF0dXMubmFtZSA9ICJMTkUzOTAiOworCWVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gTE5FMzkwX1NUQVJUX1BHOworCWVpX3N0YXR1cy5yeF9zdGFydF9wYWdlID0gTE5FMzkwX1NUQVJUX1BHICsgVFhfUEFHRVM7CisJZWlfc3RhdHVzLnN0b3BfcGFnZSA9IExORTM5MF9TVE9QX1BHOworCWVpX3N0YXR1cy53b3JkMTYgPSAxOworCisJaWYgKGVpX2RlYnVnID4gMCkKKwkJcHJpbnRrKHZlcnNpb24pOworCisJZWlfc3RhdHVzLnJlc2V0XzgzOTAgPSAmbG5lMzkwX3Jlc2V0XzgzOTA7CisJZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJmxuZTM5MF9ibG9ja19pbnB1dDsKKwllaV9zdGF0dXMuYmxvY2tfb3V0cHV0ID0gJmxuZTM5MF9ibG9ja19vdXRwdXQ7CisJZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZsbmUzOTBfZ2V0XzgzOTBfaGRyOworCisJZGV2LT5vcGVuID0gJmxuZTM5MF9vcGVuOworCWRldi0+c3RvcCA9ICZsbmUzOTBfY2xvc2U7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CisjZW5kaWYKKwlOUzgzOTBfaW5pdChkZXYsIDApOworCXJldHVybiAwOworY2xlYW51cDoKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICoJUmVzZXQgYXMgcGVyIHRoZSBwYWNrZXQgZHJpdmVyIG1ldGhvZC4gSnVkZ2luZyBieSB0aGUgRUlTQSBjZmcKKyAqCWZpbGUsIHRoaXMganVzdCB0b2dnbGVzIHRoZSAiQm9hcmQgRW5hYmxlIiBiaXRzIChiaXQgMiBhbmQgMCkuCisgKi8KKworc3RhdGljIHZvaWQgbG5lMzkwX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW91dGIoMHgwNCwgaW9hZGRyICsgTE5FMzkwX1JFU0VUX1BPUlQpOworCWlmIChlaV9kZWJ1ZyA+IDEpIHByaW50aygiJXM6IHJlc2V0dGluZyB0aGUgTE5FMzkwLi4uIiwgZGV2LT5uYW1lKTsKKworCW1kZWxheSgyKTsKKworCWVpX3N0YXR1cy50eGluZyA9IDA7CisJb3V0YigweDAxLCBpb2FkZHIgKyBMTkUzOTBfUkVTRVRfUE9SVCk7CisJaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCJyZXNldCBkb25lXG4iKTsKKworCXJldHVybjsKK30KKworLyoKKyAqCU5vdGU6IEluIHRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGlzIHRoZSBpbXBsaWNpdCBhc3N1bXB0aW9uCisgKgl0aGF0IHRoZSBhc3NvY2lhdGVkIG1lbWNweSB3aWxsIG9ubHkgdXNlICJyZXA7IG1vdnNsIiBhcyBsb25nIGFzCisgKgl3ZSBrZWVwIHRoZSBjb3VudHMgYXMgc29tZSBtdWx0aXBsZSBvZiBkb3VibGV3b3Jkcy4gVGhpcyBpcyBhCisgKglyZXF1aXJlbWVudCBvZiB0aGUgaGFyZHdhcmUsIGFuZCBhbHNvIHByZXZlbnRzIHVzIGZyb20gdXNpbmcKKyAqCWV0aF9pb19jb3B5X2FuZF9zdW0oKSBzaW5jZSB3ZSBjYW4ndCBndWFyYW50ZWUgaXQgd2lsbCBsaW1pdAorICoJaXRzZWxmIHRvIGRvdWJsZXdvcmQgYWNjZXNzLgorICovCisKKy8qCisgKglHcmFiIHRoZSA4MzkwIHNwZWNpZmljIGhlYWRlci4gU2ltaWxhciB0byB0aGUgYmxvY2tfaW5wdXQgcm91dGluZSwgYnV0CisgKgl3ZSBkb24ndCBuZWVkIHRvIGJlIGNvbmNlcm5lZCB3aXRoIHJpbmcgd3JhcCBhcyB0aGUgaGVhZGVyIHdpbGwgYmUgYXQKKyAqCXRoZSBzdGFydCBvZiBhIHBhZ2UsIHNvIHdlIG9wdGltaXplIGFjY29yZGluZ2x5LiAoQSBzaW5nbGUgZG91Ymxld29yZC4pCisgKi8KKworc3RhdGljIHZvaWQKK2xuZTM5MF9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSkKK3sKKwl2b2lkIF9faW9tZW0gKmhkcl9zdGFydCA9IGVpX3N0YXR1cy5tZW0gKyAoKHJpbmdfcGFnZSAtIExORTM5MF9TVEFSVF9QRyk8PDgpOworCW1lbWNweV9mcm9taW8oaGRyLCBoZHJfc3RhcnQsIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcikpOworCWhkci0+Y291bnQgPSAoaGRyLT5jb3VudCArIDMpICYgfjM7ICAgICAvKiBSb3VuZCB1cCBhbGxvY2F0aW9uLiAqLworfQorCisvKgkKKyAqCUJsb2NrIGlucHV0IGFuZCBvdXRwdXQgYXJlIGVhc3kgb24gc2hhcmVkIG1lbW9yeSBldGhlcmNhcmRzLCB0aGUgb25seQorICoJY29tcGxpY2F0aW9uIGlzIHdoZW4gdGhlIHJpbmcgYnVmZmVyIHdyYXBzLiBUaGUgY291bnQgd2lsbCBhbHJlYWR5CisgKgliZSByb3VuZGVkIHVwIHRvIGEgZG91Ymxld29yZCB2YWx1ZSB2aWEgbG5lMzkwX2dldF84MzkwX2hkcigpIGFib3ZlLgorICovCisKK3N0YXRpYyB2b2lkIGxuZTM5MF9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCQkgIGludCByaW5nX29mZnNldCkKK3sKKwl2b2lkIF9faW9tZW0gKnhmZXJfc3RhcnQgPSBlaV9zdGF0dXMubWVtICsgcmluZ19vZmZzZXQgLSAoTE5FMzkwX1NUQVJUX1BHPDw4KTsKKworCWlmIChyaW5nX29mZnNldCArIGNvdW50ID4gKExORTM5MF9TVE9QX1BHPDw4KSkgeworCQkvKiBQYWNrZXQgd3JhcHMgb3ZlciBlbmQgb2YgcmluZyBidWZmZXIuICovCisJCWludCBzZW1pX2NvdW50ID0gKExORTM5MF9TVE9QX1BHPDw4KSAtIHJpbmdfb2Zmc2V0OworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgeGZlcl9zdGFydCwgc2VtaV9jb3VudCk7CisJCWNvdW50IC09IHNlbWlfY291bnQ7CisJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhICsgc2VtaV9jb3VudCwKKwkJCWVpX3N0YXR1cy5tZW0gKyAoVFhfUEFHRVM8PDgpLCBjb3VudCk7CisJfSBlbHNlIHsKKwkJLyogUGFja2V0IGlzIGluIG9uZSBjaHVuay4gKi8KKwkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEsIHhmZXJfc3RhcnQsIGNvdW50KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxuZTM5MF9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHN0YXJ0X3BhZ2UpCit7CisJdm9pZCBfX2lvbWVtICpzaG1lbSA9IGVpX3N0YXR1cy5tZW0gKyAoKHN0YXJ0X3BhZ2UgLSBMTkUzOTBfU1RBUlRfUEcpPDw4KTsKKworCWNvdW50ID0gKGNvdW50ICsgMykgJiB+MzsgICAgIC8qIFJvdW5kIHVwIHRvIGRvdWJsZXdvcmQgKi8KKwltZW1jcHlfdG9pbyhzaG1lbSwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgbG5lMzkwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllaV9vcGVuKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbG5lMzkwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlpZiAoZWlfZGVidWcgPiAxKQorCQlwcmludGsoIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZC5cbiIsIGRldi0+bmFtZSk7CisKKwllaV9jbG9zZShkZXYpOworCXJldHVybiAwOworfQorCisjaWZkZWYgTU9EVUxFCisjZGVmaW5lIE1BWF9MTkVfQ0FSRFMJNAkvKiBNYXggbnVtYmVyIG9mIExORTM5MCBjYXJkcyBwZXIgbW9kdWxlICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9sbmVbTUFYX0xORV9DQVJEU107CitzdGF0aWMgaW50IGlvW01BWF9MTkVfQ0FSRFNdOworc3RhdGljIGludCBpcnFbTUFYX0xORV9DQVJEU107CitzdGF0aWMgaW50IG1lbVtNQVhfTE5FX0NBUkRTXTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShtZW0sIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiSS9PIGJhc2UgYWRkcmVzcyhlcykiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRIG51bWJlcihzKSIpOworTU9EVUxFX1BBUk1fREVTQyhtZW0sICJtZW1vcnkgYmFzZSBhZGRyZXNzKGVzKSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNeWxleCBMTkUzOTBBL0IgRUlTQSBFdGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgdGhpc19kZXYsIGZvdW5kID0gMDsKKworCWZvciAodGhpc19kZXYgPSAwOyB0aGlzX2RldiA8IE1BWF9MTkVfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJaWYgKGlvW3RoaXNfZGV2XSA9PSAwICYmIHRoaXNfZGV2ICE9IDApCisJCQlicmVhazsKKwkJZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisJCWRldi0+aXJxID0gaXJxW3RoaXNfZGV2XTsKKwkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07CisJCWRldi0+bWVtX3N0YXJ0ID0gbWVtW3RoaXNfZGV2XTsKKwkJaWYgKGRvX2xuZTM5MF9wcm9iZShkZXYpID09IDApIHsKKwkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7CisJCQkJZGV2X2xuZVtmb3VuZCsrXSA9IGRldjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQl9CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImxuZTM5MC5jOiBObyBMTkUzOTAgY2FyZCBmb3VuZCAoaS9vID0gMHgleCkuXG4iLCBpb1t0aGlzX2Rldl0pOworCQlicmVhazsKKwl9CisJaWYgKGZvdW5kKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVOWElPOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IHRoaXNfZGV2OworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX0xORV9DQVJEUzsgdGhpc19kZXYrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2xuZVt0aGlzX2Rldl07CisJCWlmIChkZXYpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogTU9EVUxFICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xvb3BiYWNrLmMgYi9kcml2ZXJzL25ldC9sb29wYmFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZmMzMTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9sb29wYmFjay5jCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCVBzZXVkby1kcml2ZXIgZm9yIHRoZSBsb29wYmFjayBpbnRlcmZhY2UuCisgKgorICogVmVyc2lvbjoJQCgjKWxvb3BiYWNrLmMJMS4wLjRiCTA4LzE2LzkzCisgKgorICogQXV0aG9yczoJUm9zcyBCaXJvLCA8YmlyN0BsZWxhbmQuU3RhbmZvcmQuRWR1PgorICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoJCURvbmFsZCBCZWNrZXIsIDxiZWNrZXJAc2N5bGQuY29tPgorICoKKyAqCQlBbGFuIENveAk6CUZpeGVkIG9kZG1lbnRzIGZvciBORVQzLjAxNAorICoJCUFsYW4gQ294CToJUmVqaWcgZm9yIE5FVDMuMDI5IHNuYXAgIzMKKyAqCQlBbGFuIENveAk6IAlGaXhlZCBORVQzLjAyOSBidWdzIGFuZCBzcGVkIHVwCisgKgkJTGFycnkgTWNWb3kJOglUaW55IHR3ZWFrIHRvIGRvdWJsZSBwZXJmb3JtYW5jZQorICoJCUFsYW4gQ294CToJQmFja2VkIG91dCBMTVYncyB0d2VhayAtIHRoZSBsaW51eCBtbQorICoJCQkJCWNhbid0IHRha2UgaXQuLi4KKyAqICAgICAgICAgICAgICBNaWNoYWVsIEdyaWZmaXRoOiAgICAgICBEb24ndCBib3RoZXIgY29tcHV0aW5nIHRoZSBjaGVja3N1bXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBwYWNrZXRzIHJlY2VpdmVkIG9uIHRoZSBsb29wYmFjaworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZS4KKyAqCQlBbGV4ZXkgS3V6bmV0c292OglQb3RlbnRpYWwgaGFuZyB1bmRlciBzb21lIGV4dHJlbWUKKyAqCQkJCQljYXNlcyByZW1vdmVkLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CS8qIEZvciB0aGUgc3RhdGlzdGljcyBzdHJ1Y3R1cmUuICovCisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CS8qIEZvciBBUlBIUkRfRVRIRVIgKi8KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMsIGxvb3BiYWNrX3N0YXRzKTsKKworI2RlZmluZSBMT09QQkFDS19PVkVSSEVBRCAoMTI4ICsgTUFYX0hFQURFUiArIDE2ICsgMTYpCisKKy8qIEtJU1M6IGp1c3QgYWxsb2NhdGUgc21hbGwgY2h1bmtzIGFuZCBjb3B5IGJpdHMuCisgKgorICogU28sIGluIGZhY3QsIHRoaXMgaXMgZG9jdW1lbnRhdGlvbiwgZXhwbGFpbmluZyB3aGF0IHdlIGV4cGVjdAorICogb2YgbGFyZ2VzZW5kaW5nIGRldmljZSBtb2R1bG8gVENQIGNoZWNrc3VtLCB3aGljaCBpcyBpZ25vcmVkIGZvciBsb29wYmFjay4KKyAqLworCitzdGF0aWMgdm9pZCBlbXVsYXRlX2xhcmdlX3NlbmRfb2ZmbG9hZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CisJc3RydWN0IHRjcGhkciAqdGggPSAoc3RydWN0IHRjcGhkciopKHNrYi0+bmgucmF3ICsgKGlwaC0+aWhsICogNCkpOworCXVuc2lnbmVkIGludCBkb2Zmc2V0ID0gKGlwaC0+aWhsICsgdGgtPmRvZmYpICogNDsKKwl1bnNpZ25lZCBpbnQgbXR1ID0gc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSArIGRvZmZzZXQ7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IDA7CisJdTMyIHNlcSA9IG50b2hsKHRoLT5zZXEpOworCXUxNiBpZCAgPSBudG9ocyhpcGgtPmlkKTsKKworCXdoaWxlIChvZmZzZXQgKyBkb2Zmc2V0IDwgc2tiLT5sZW4pIHsKKwkJdW5zaWduZWQgaW50IGZyYWdfc2l6ZSA9IG1pbihtdHUsIHNrYi0+bGVuIC0gb2Zmc2V0KSAtIGRvZmZzZXQ7CisJCXN0cnVjdCBza19idWZmICpuc2tiID0gYWxsb2Nfc2tiKG10dSArIDMyLCBHRlBfQVRPTUlDKTsKKworCQlpZiAoIW5za2IpCisJCQlicmVhazsKKwkJc2tiX3Jlc2VydmUobnNrYiwgMzIpOworCQluc2tiLT5tYWMucmF3ID0gbnNrYi0+ZGF0YSAtIDE0OworCQluc2tiLT5uaC5yYXcgPSBuc2tiLT5kYXRhOworCQlpcGggPSBuc2tiLT5uaC5pcGg7CisJCW1lbWNweShuc2tiLT5kYXRhLCBza2ItPm5oLnJhdywgZG9mZnNldCk7CisJCWlmIChza2JfY29weV9iaXRzKHNrYiwKKwkJCQkgIGRvZmZzZXQgKyBvZmZzZXQsCisJCQkJICBuc2tiLT5kYXRhICsgZG9mZnNldCwKKwkJCQkgIGZyYWdfc2l6ZSkpCisJCQlCVUcoKTsKKwkJc2tiX3B1dChuc2tiLCBkb2Zmc2V0ICsgZnJhZ19zaXplKTsKKwkJbnNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCW5za2ItPmRldiA9IHNrYi0+ZGV2OworCQluc2tiLT5wcmlvcml0eSA9IHNrYi0+cHJpb3JpdHk7CisJCW5za2ItPnByb3RvY29sID0gc2tiLT5wcm90b2NvbDsKKwkJbnNrYi0+ZHN0ID0gZHN0X2Nsb25lKHNrYi0+ZHN0KTsKKwkJbWVtY3B5KG5za2ItPmNiLCBza2ItPmNiLCBzaXplb2Yoc2tiLT5jYikpOworCQluc2tiLT5wa3RfdHlwZSA9IHNrYi0+cGt0X3R5cGU7CisKKwkJdGggPSAoc3RydWN0IHRjcGhkciopKG5za2ItPm5oLnJhdyArIGlwaC0+aWhsKjQpOworCQlpcGgtPnRvdF9sZW4gPSBodG9ucyhmcmFnX3NpemUgKyBkb2Zmc2V0KTsKKwkJaXBoLT5pZCA9IGh0b25zKGlkKTsKKwkJaXBoLT5jaGVjayA9IDA7CisJCWlwaC0+Y2hlY2sgPSBpcF9mYXN0X2NzdW0oKHVuc2lnbmVkIGNoYXIgKikgaXBoLCBpcGgtPmlobCk7CisJCXRoLT5zZXEgPSBodG9ubChzZXEpOworCQlpZiAob2Zmc2V0ICsgZG9mZnNldCArIGZyYWdfc2l6ZSA8IHNrYi0+bGVuKQorCQkJdGgtPmZpbiA9IHRoLT5wc2ggPSAwOworCQluZXRpZl9yeChuc2tiKTsKKwkJb2Zmc2V0ICs9IGZyYWdfc2l6ZTsKKwkJc2VxICs9IGZyYWdfc2l6ZTsKKwkJaWQrKzsKKwl9CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qCisgKiBUaGUgaGlnaGVyIGxldmVscyB0YWtlIGNhcmUgb2YgbWFraW5nIHRoaXMgbm9uLXJlZW50cmFudCAoaXQncworICogY2FsbGVkIHdpdGggYmgncyBkaXNhYmxlZCkuCisgKi8KK3N0YXRpYyBpbnQgbG9vcGJhY2tfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpsYl9zdGF0czsKKworCXNrYl9vcnBoYW4oc2tiKTsKKworCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJc2tiLT5kZXY9ZGV2OworI2lmbmRlZiBMT09QQkFDS19NVVNUX0NIRUNLU1VNCisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKyNlbmRpZgorCisJaWYgKHNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemUpIHsKKwkJQlVHX09OKHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfSVApKTsKKwkJQlVHX09OKHNrYi0+bmguaXBoLT5wcm90b2NvbCAhPSBJUFBST1RPX1RDUCk7CisKKwkJZW11bGF0ZV9sYXJnZV9zZW5kX29mZmxvYWQoc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworCWxiX3N0YXRzID0gJnBlcl9jcHUobG9vcGJhY2tfc3RhdHMsIGdldF9jcHUoKSk7CisJbGJfc3RhdHMtPnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCWxiX3N0YXRzLT50eF9ieXRlcyArPSBza2ItPmxlbjsKKwlsYl9zdGF0cy0+cnhfcGFja2V0cysrOworCWxiX3N0YXRzLT50eF9wYWNrZXRzKys7CisJcHV0X2NwdSgpOworCisJbmV0aWZfcngoc2tiKTsKKworCXJldHVybigwKTsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpnZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBkZXYtPnByaXY7CisJaW50IGk7CisKKwlpZiAoIXN0YXRzKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7CisKKwlmb3IgKGk9MDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbGJfc3RhdHM7CisKKwkJaWYgKCFjcHVfcG9zc2libGUoaSkpIAorCQkJY29udGludWU7CisJCWxiX3N0YXRzID0gJnBlcl9jcHUobG9vcGJhY2tfc3RhdHMsIGkpOworCQlzdGF0cy0+cnhfYnl0ZXMgICArPSBsYl9zdGF0cy0+cnhfYnl0ZXM7CisJCXN0YXRzLT50eF9ieXRlcyAgICs9IGxiX3N0YXRzLT50eF9ieXRlczsKKwkJc3RhdHMtPnJ4X3BhY2tldHMgKz0gbGJfc3RhdHMtPnJ4X3BhY2tldHM7CisJCXN0YXRzLT50eF9wYWNrZXRzICs9IGxiX3N0YXRzLT50eF9wYWNrZXRzOworCX0KKwkJCQkKKwlyZXR1cm4gc3RhdHM7Cit9CisKK3N0YXRpYyB1MzIgbG9vcGJhY2tfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBsb29wYmFja19ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2xpbmsJCT0gbG9vcGJhY2tfZ2V0X2xpbmssCisJLmdldF90c28JCT0gZXRodG9vbF9vcF9nZXRfdHNvLAorCS5zZXRfdHNvCQk9IGV0aHRvb2xfb3Bfc2V0X3RzbywKK307CisKK3N0cnVjdCBuZXRfZGV2aWNlIGxvb3BiYWNrX2RldiA9IHsKKwkubmFtZQkgCQk9ICJsbyIsCisJLm10dQkJCT0gKDE2ICogMTAyNCkgKyAyMCArIDIwICsgMTIsCisJLmhhcmRfc3RhcnRfeG1pdAk9IGxvb3BiYWNrX3htaXQsCisJLmhhcmRfaGVhZGVyCQk9IGV0aF9oZWFkZXIsCisJLmhhcmRfaGVhZGVyX2NhY2hlCT0gZXRoX2hlYWRlcl9jYWNoZSwKKwkuaGVhZGVyX2NhY2hlX3VwZGF0ZQk9IGV0aF9oZWFkZXJfY2FjaGVfdXBkYXRlLAorCS5oYXJkX2hlYWRlcl9sZW4JPSBFVEhfSExFTiwJLyogMTQJKi8KKwkuYWRkcl9sZW4JCT0gRVRIX0FMRU4sCS8qIDYJKi8KKwkudHhfcXVldWVfbGVuCQk9IDAsCisJLnR5cGUJCQk9IEFSUEhSRF9MT09QQkFDSywJLyogMHgwMDAxKi8KKwkucmVidWlsZF9oZWFkZXIJCT0gZXRoX3JlYnVpbGRfaGVhZGVyLAorCS5mbGFncwkJCT0gSUZGX0xPT1BCQUNLLAorCS5mZWF0dXJlcyAJCT0gTkVUSUZfRl9TR3xORVRJRl9GX0ZSQUdMSVNUCisJCQkJICB8TkVUSUZfRl9OT19DU1VNfE5FVElGX0ZfSElHSERNQQorCQkJCSAgfE5FVElGX0ZfTExUWCwKKwkuZXRodG9vbF9vcHMJCT0gJmxvb3BiYWNrX2V0aHRvb2xfb3BzLAorfTsKKworLyogU2V0dXAgYW5kIHJlZ2lzdGVyIHRoZSBvZiB0aGUgTE9PUEJBQ0sgZGV2aWNlLiAqLworaW50IF9faW5pdCBsb29wYmFja19pbml0KHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzOworCisJLyogQ2FuIHN1cnZpdmUgd2l0aG91dCBzdGF0aXN0aWNzICovCisJc3RhdHMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyksIEdGUF9LRVJORUwpOworCWlmIChzdGF0cykgeworCQltZW1zZXQoc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCQlsb29wYmFja19kZXYucHJpdiA9IHN0YXRzOworCQlsb29wYmFja19kZXYuZ2V0X3N0YXRzID0gJmdldF9zdGF0czsKKwl9CisJCisJcmV0dXJuIHJlZ2lzdGVyX25ldGRldigmbG9vcGJhY2tfZGV2KTsKK307CisKK0VYUE9SVF9TWU1CT0wobG9vcGJhY2tfZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xwNDg2ZS5jIGIvZHJpdmVycy9uZXQvbHA0ODZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzOWYwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2xwNDg2ZS5jCkBAIC0wLDAgKzEsMTM1MiBAQAorLyogSW50ZWwgUHJvZmVzc2lvbmFsIFdvcmtzdGF0aW9uL3BhbnRoZXIgZXRoZXJuZXQgZHJpdmVyICovCisvKiBscDQ4NmUuYzogQSBwYW50aGVyIDgyNTk2IGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguICovCisvKgorICAgIEhpc3RvcnkgYW5kIGNvcHlyaWdodHM6CisKKyAgICBEcml2ZXIgc2tlbGV0b24KKyAgICAgICAgV3JpdHRlbiAxOTkzIGJ5IERvbmFsZCBCZWNrZXIuCisgICAgICAgIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUgRGlyZWN0b3IsCisgICAgICAgIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4gIFRoaXMgc29mdHdhcmUgbWF5IG9ubHkgYmUgdXNlZCBhbmQKKwlkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorCWFzIG1vZGlmaWVkIGJ5IFNSQywgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKyAgICAgICAgVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisgICAgQXByaWNvdAorICAgICAgICBXcml0dGVuIDE5OTQgYnkgTWFyayBFdmFucy4KKyAgICAgICAgVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSBBcHJpY290IDgyNTk2IGJ1cy1tYXN0ZXIgaW50ZXJmYWNlCisKKyAgICAgICAgTW9kdWxhcmlzZWQgMTIvOTQgTWFyayBFdmFucworCisgICAgUHJvZmVzc2lvbmFsIFdvcmtzdGF0aW9uCisJRGVyaXZlZCBmcm9tIGFwcmljb3QuYyBieSBBcmQgdmFuIEJyZWVtZW4KKwk8YXJkQG11cnBoeS5ubD58PGFyZEBjc3RtZWwuaG9iYnkubmw+fDxhcmRAY3N0bWVsLm5sLmV1Lm9yZz4KKworCUNyZWRpdHM6CisJVGhhbmtzIHRvIE11cnBoeSBTb2Z0d2FyZSBCViBmb3IgbGV0dGluZyBtZSB3cml0ZSB0aGlzIGluIHRoZWlyIHRpbWUuCisJV2VsbCwgYWN0dWFsbHksIEkgZ2V0IHBheWVkIGRvaW5nIHRoaXMuLi4KKwkoQWxzbzogc2VlIGh0dHA6Ly93d3cubXVycGh5Lm5sIGZvciBtdXJwaHksIGFuZCBteSBob21lcGFnZSB+YXJkIGZvcgorCW1vcmUgaW5mb3JtYXRpb24gb24gdGhlIFByb2Zlc3Npb25hbCBXb3Jrc3RhdGlvbikKKworICAgIFByZXNlbnQgdmVyc2lvbgorCWFlYkBjd2kubmwKKyovCisvKgorICAgIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIG1vdGhlcmJvYXJkcyB0aGF0IEkga25vdyBvZiBpbiB0aGUKKyAgICBwcm9mZXNzaW9uYWwgd29ya3N0YXRpb24uIFRoZSBvbmx5IG9uZSB0aGF0IEkga25vdyBpcyB0aGUKKyAgICBpbnRlbCBwYW50aGVyIG1vdGhlcmJvYXJkLiAtLSBhcmQKKyovCisvKgorVGhlIHB3cyBpcyBlcXVpcHBlZCB3aXRoIGFuIGludGVsIDgyNTk2LiBUaGlzIGlzIGEgdmVyeSBpbnRlbGxpZ2VudCBjb250cm9sbGVyCit3aGljaCBydW5zIGl0cyBvd24gbWljcm8tY29kZS4gQ29tbXVuaWNhdGlvbiB3aXRoIHRoZSBob3N0cHJvY2Vzc29yIGlzIGRvbmUKK3Rocm91Z2ggbGlua2VkIGxpc3RzIG9mIGNvbW1hbmRzIGFuZCBidWZmZXJzIGluIHRoZSBob3N0cHJvY2Vzc29ycyBtZW1vcnkuCitBIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZSA4MjU5NiBpcyBhdmFpbGFibGUgZnJvbSBpbnRlbC4gU2VhcmNoIGZvcgorYSBmaWxlIGNhbGxlZCAiMjkwMjE4MDYucGRmIi4gSXQgaXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiB0aGUgY2hpcCBpdHNlbGYuCitUbyB1c2UgaXQgZm9yIHRoZSBwd3Mgc29tZSBhZGRpdGlvbnMgYXJlIG5lZWRlZCByZWdhcmRpbmcgZ2VuZXJhdGlvbiBvZgordGhlIFBPUlQgYW5kIENBIHNpZ25hbCwgYW5kIHRoZSBpbnRlcnJ1cHQgZ2x1ZSBuZWVkZWQgZm9yIGEgcGMuCitJL08gbWFwOgorUE9SVCAgU0laRSBBQ1RJT04gTUVBTklORworMHhDQjAgICAgMiBXUklURSAgTG93ZXIgMTYgYml0cyBmb3IgUE9SVCBjb21tYW5kCisweENCMiAgICAyIFdSSVRFICBVcHBlciAxNiBiaXRzIGZvciBQT1JUIGNvbW1hbmQsIGFuZCBpc3N1ZSBvZiBQT1JUIGNvbW1hbmQKKzB4Q0I0ICAgIDEgV1JJVEUgIEdlbmVyYXRpb24gb2YgQ0Egc2lnbmFsCisweENCOCAgICAxIFdSSVRFICBDbGVhciBpbnRlcnJ1cHQgZ2x1ZQorQWxsIG90aGVyIGNvbW11bmljYXRpb24gaXMgdGhyb3VnaCBtZW1vcnkhCisqLworCisjZGVmaW5lIFNMT1dfRE9XTl9JTyB1ZGVsYXkoNSkKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNkZWZpbmUgRFJWX05BTUUgImxwNDg2ZSIKKworLyogZGVidWcgcHJpbnQgZmxhZ3MgKi8KKyNkZWZpbmUgTE9HX1NSQ0RTVCAgICAweDgwMDAwMDAwCisjZGVmaW5lIExPR19TVEFUSU5UICAgMHg0MDAwMDAwMAorI2RlZmluZSBMT0dfU1RBUlRJTlQgIDB4MjAwMDAwMDAKKworI2RlZmluZSBpNTk2X2RlYnVnIGRlYnVnCisKK3N0YXRpYyBpbnQgaTU5Nl9kZWJ1ZyA9IDA7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWVkaWFuYW1lW10gPSB7CisJIjEwYmFzZVQiLCAiQVVJIiwKKwkiMTBiYXNlVC1GRCIsICJBVUktRkQiLAorfTsKKworI2RlZmluZSBMUDQ4NkVfVE9UQUxfU0laRSAxNgorCisjZGVmaW5lIEk1OTZfTlVMTCAoMHhmZmZmZmZmZikKKworI2RlZmluZSBDTURfRU9MCQkweDgwMDAJLyogVGhlIGxhc3QgY29tbWFuZCBvZiB0aGUgbGlzdCwgc3RvcC4gKi8KKyNkZWZpbmUgQ01EX1NVU1AJMHg0MDAwCS8qIFN1c3BlbmQgYWZ0ZXIgZG9pbmcgY21kLiAqLworI2RlZmluZSBDTURfSU5UUgkweDIwMDAJLyogSW50ZXJydXB0IGFmdGVyIGRvaW5nIGNtZC4gKi8KKworI2RlZmluZSBDTURfRkxFWAkweDAwMDgJLyogRW5hYmxlIGZsZXhpYmxlIG1lbW9yeSBtb2RlbCAqLworCitlbnVtIGNvbW1hbmRzIHsKKwlDbWROT1AgPSAwLAorCUNtZElBU2V0dXAgPSAxLAorCUNtZENvbmZpZ3VyZSA9IDIsCisJQ21kTXVsdGljYXN0TGlzdCA9IDMsCisJQ21kVHggPSA0LAorCUNtZFREUiA9IDUsCisJQ21kRHVtcCA9IDYsCisJQ21kRGlhZ25vc2UgPSA3Cit9OworCisjaWYgMAorc3RhdGljIGNvbnN0IGNoYXIgKkNVY21kbmFtZXNbOF0gPSB7ICJOT1AiLCAiSUFTZXR1cCIsICJDb25maWd1cmUiLCAiTXVsdGljYXN0TGlzdCIsCisJCQkJICAgICAiVHgiLCAiVERSIiwgIkR1bXAiLCAiRGlhZ25vc2UiIH07CisjZW5kaWYKKworLyogU3RhdHVzIHdvcmQgYml0cyAqLworI2RlZmluZQlTVEFUX0NYCQkweDgwMDAJLyogVGhlIENVIGZpbmlzaGVkIGV4ZWN1dGluZyBhIGNvbW1hbmQKKwkJCQkgICB3aXRoIHRoZSBJbnRlcnJ1cHQgYml0IHNldCAqLworI2RlZmluZQlTVEFUX0ZSCQkweDQwMDAJLyogVGhlIFJVIGZpbmlzaGVkIHJlY2VpdmluZyBhIGZyYW1lICovCisjZGVmaW5lCVNUQVRfQ05BCTB4MjAwMAkvKiBUaGUgQ1UgbGVmdCB0aGUgYWN0aXZlIHN0YXRlICovCisjZGVmaW5lCVNUQVRfUk5SCTB4MTAwMAkvKiBUaGUgUlUgbGVmdCB0aGUgYWN0aXZlIHN0YXRlICovCisjZGVmaW5lIFNUQVRfQUNLCShTVEFUX0NYIHwgU1RBVF9GUiB8IFNUQVRfQ05BIHwgU1RBVF9STlIpCisjZGVmaW5lCVNUQVRfQ1VTCTB4MDcwMAkvKiBTdGF0dXMgb2YgQ1U6IDA6IGlkbGUsIDE6IHN1c3BlbmRlZCwKKwkJCQkgICAyOiBhY3RpdmUsIDMtNzogdW51c2VkICovCisjZGVmaW5lIFNUQVRfUlVTCTB4MDBmMAkvKiBTdGF0dXMgb2YgUlU6IDA6IGlkbGUsIDE6IHN1c3BlbmRlZCwKKwkJCQkgICAyOiBubyByZXNvdXJjZXMsIDQ6IHJlYWR5LAorCQkJCSAgIDEwOiBubyByZXNvdXJjZXMgZHVlIHRvIG5vIG1vcmUgUkJEcywKKwkJCQkgICAxMjogbm8gbW9yZSBSQkRzLCBvdGhlcjogdW51c2VkICovCisjZGVmaW5lCVNUQVRfVAkJMHgwMDA4CS8qIEJ1cyB0aHJvdHRsZSB0aW1lcnMgbG9hZGVkICovCisjZGVmaW5lCVNUQVRfWkVSTwkweDA4MDcJLyogQWx3YXlzIHplcm8gKi8KKworI2lmIDAKK3N0YXRpYyBjaGFyICpDVXN0YXRlc1s4XSA9IHsKKwkiaWRsZSIsICJzdXNwZW5kZWQiLCAiYWN0aXZlIiwgMCwgMCwgMCwgMCwgMAorfTsKK3N0YXRpYyBjaGFyICpSVXN0YXRlc1sxNl0gPSB7CisJImlkbGUiLCAic3VzcGVuZGVkIiwgIm5vIHJlc291cmNlcyIsIDAsICJyZWFkeSIsIDAsIDAsIDAsCisJMCwgMCwgIm5vIFJCRHMiLCAwLCAib3V0IG9mIFJCRHMiLCAwLCAwLCAwCit9OworCitzdGF0aWMgdm9pZAoraTU5Nl9vdXRfc3RhdHVzKGludCBzdGF0dXMpIHsKKwlpbnQgYmFkID0gMDsKKwljaGFyICpzOworCisJcHJpbnRrKCJzdGF0dXMgJTQuNHg6Iiwgc3RhdHVzKTsKKwlpZiAoc3RhdHVzID09IDB4ZmZmZikKKwkJcHJpbnRrKCIgc3RyYW5nZS4uXG4iKTsKKwllbHNlIHsKKwkJaWYgKHN0YXR1cyAmIFNUQVRfQ1gpCisJCQlwcmludGsoIiAgQ1UgZG9uZSIpOworCQlpZiAoc3RhdHVzICYgU1RBVF9DTkEpCisJCQlwcmludGsoIiAgQ1Ugc3RvcHBlZCIpOworCQlpZiAoc3RhdHVzICYgU1RBVF9GUikKKwkJCXByaW50aygiICBnb3QgYSBmcmFtZSIpOworCQlpZiAoc3RhdHVzICYgU1RBVF9STlIpCisJCQlwcmludGsoIiAgUlUgc3RvcHBlZCIpOworCQlpZiAoc3RhdHVzICYgU1RBVF9UKQorCQkJcHJpbnRrKCIgIHRocm90dGxlZCIpOworCQlpZiAoc3RhdHVzICYgU1RBVF9aRVJPKQorCQkJYmFkID0gMTsKKwkJcyA9IENVc3RhdGVzWyhzdGF0dXMgJiBTVEFUX0NVUykgPj4gOF07CisJCWlmICghcykKKwkJCWJhZCA9IDE7CisJCWVsc2UKKwkJCXByaW50aygiICBDVSglcykiLCBzKTsKKwkJcyA9IFJVc3RhdGVzWyhzdGF0dXMgJiBTVEFUX1JVUykgPj4gNF07CisJCWlmICghcykKKwkJCWJhZCA9IDE7CisJCWVsc2UKKwkJCXByaW50aygiICBSVSglcykiLCBzKTsKKwkJaWYgKGJhZCkKKwkJCXByaW50aygiICBiYWQgc3RhdHVzIik7CisJCXByaW50aygiXG4iKTsKKwl9Cit9CisjZW5kaWYKKworLyogQ29tbWFuZCB3b3JkIGJpdHMgKi8KKyNkZWZpbmUgQUNLX0NYCQkweDgwMDAKKyNkZWZpbmUgQUNLX0ZSCQkweDQwMDAKKyNkZWZpbmUgQUNLX0NOQQkJMHgyMDAwCisjZGVmaW5lIEFDS19STlIJCTB4MTAwMAorCisjZGVmaW5lIENVQ19TVEFSVAkweDAxMDAKKyNkZWZpbmUgQ1VDX1JFU1VNRQkweDAyMDAKKyNkZWZpbmUgQ1VDX1NVU1BFTkQJMHgwMzAwCisjZGVmaW5lIENVQ19BQk9SVAkweDA0MDAKKworI2RlZmluZSBSWF9TVEFSVAkweDAwMTAKKyNkZWZpbmUgUlhfUkVTVU1FCTB4MDAyMAorI2RlZmluZSBSWF9TVVNQRU5ECTB4MDAzMAorI2RlZmluZSBSWF9BQk9SVAkweDAwNDAKKwordHlwZWRlZiB1MzIgcGh5c19hZGRyOworCitzdGF0aWMgaW5saW5lIHBoeXNfYWRkcgordmFfdG9fcGEodm9pZCAqeCkgeworCXJldHVybiB4ID8gdmlydF90b19idXMoeCkgOiBJNTk2X05VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitwYV90b192YShwaHlzX2FkZHIgeCkgeworCXJldHVybiAoeCA9PSBJNTk2X05VTEwpID8gTlVMTCA6IGJ1c190b192aXJ0KHgpOworfQorCisvKiBzdGF0dXMgYml0cyBmb3IgY21kICovCisjZGVmaW5lIENNRF9TVEFUX0MJMHg4MDAwCS8qIENVIGNvbW1hbmQgY29tcGxldGUgKi8KKyNkZWZpbmUgQ01EX1NUQVRfQgkweDQwMDAJLyogQ1UgY29tbWFuZCBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBDTURfU1RBVF9PSwkweDIwMDAJLyogQ1UgY29tbWFuZCBjb21wbGV0ZWQgd2l0aG91dCBlcnJvcnMgKi8KKyNkZWZpbmUgQ01EX1NUQVRfQQkweDEwMDAJLyogQ1UgY29tbWFuZCBhYm5vcm1hbGx5IHRlcm1pbmF0ZWQgKi8KKworc3RydWN0IGk1OTZfY21kIHsJCS8qIDggYnl0ZXMgKi8KKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgY29tbWFuZDsKKwlwaHlzX2FkZHIgcGFfbmV4dDsJLyogdmFfdG9fcGEoc3RydWN0IGk1OTZfY21kICpuZXh0KSAqLworfTsKKworI2RlZmluZSBFT0YJCTB4ODAwMAorI2RlZmluZSBTSVpFX01BU0sJMHgzZmZmCisKK3N0cnVjdCBpNTk2X3RiZCB7CisJdW5zaWduZWQgc2hvcnQgc2l6ZTsKKwl1bnNpZ25lZCBzaG9ydCBwYWQ7CisJcGh5c19hZGRyIHBhX25leHQ7CS8qIHZhX3RvX3BhKHN0cnVjdCBpNTk2X3RiZCAqbmV4dCkgKi8KKwlwaHlzX2FkZHIgcGFfZGF0YTsJLyogdmFfdG9fcGEoY2hhciAqZGF0YSkgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworfTsKKworc3RydWN0IHR4X2NtZCB7CisJc3RydWN0IGk1OTZfY21kIGNtZDsKKwlwaHlzX2FkZHIgcGFfdGJkOwkvKiB2YV90b19wYShzdHJ1Y3QgaTU5Nl90YmQgKnRiZCkgKi8KKwl1bnNpZ25lZCBzaG9ydCBzaXplOworCXVuc2lnbmVkIHNob3J0IHBhZDsKK307CisKKy8qIHN0YXR1cyBiaXRzIGZvciByZmQgKi8KKyNkZWZpbmUgUkZEX1NUQVRfQwkweDgwMDAJLyogRnJhbWUgcmVjZXB0aW9uIGNvbXBsZXRlICovCisjZGVmaW5lIFJGRF9TVEFUX0IJMHg0MDAwCS8qIEZyYW1lIHJlY2VwdGlvbiBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBSRkRfU1RBVF9PSwkweDIwMDAJLyogRnJhbWUgcmVjZWl2ZWQgd2l0aG91dCBlcnJvcnMgKi8KKyNkZWZpbmUgUkZEX1NUQVRVUwkweDFmZmYKKyNkZWZpbmUgUkZEX0xFTkdUSF9FUlIJMHgxMDAwCisjZGVmaW5lIFJGRF9DUkNfRVJSCTB4MDgwMAorI2RlZmluZSBSRkRfQUxJR05fRVJSCTB4MDQwMAorI2RlZmluZSBSRkRfTk9CVUZTX0VSUgkweDAyMDAKKyNkZWZpbmUgUkZEX0RNQV9FUlIJMHgwMTAwCS8qIERNQSBvdmVycnVuIGZhaWx1cmUgdG8gYWNxdWlyZSBzeXN0ZW0gYnVzICovCisjZGVmaW5lIFJGRF9TSE9SVF9GUkFNRV9FUlIJMHgwMDgwCisjZGVmaW5lIFJGRF9OT0VPUF9FUlIJMHgwMDQwCisjZGVmaW5lIFJGRF9UUlVOQ19FUlIJMHgwMDIwCisjZGVmaW5lIFJGRF9NVUxUSUNBU1QgIDB4MDAwMgkvKiAwOiBkZXN0aW5hdGlvbiBoYWQgb3VyIGFkZHJlc3MKKwkJCQkgICAxOiBkZXN0aW5hdGlvbiB3YXMgYnJvYWRjYXN0L211bHRpY2FzdCAqLworI2RlZmluZSBSRkRfQ09MTElTSU9OICAweDAwMDEKKworLyogcmVjZWl2ZSBmcmFtZSBkZXNjcmlwdG9yICovCitzdHJ1Y3QgaTU5Nl9yZmQgeworCXVuc2lnbmVkIHNob3J0IHN0YXQ7CisJdW5zaWduZWQgc2hvcnQgY21kOworCXBoeXNfYWRkciBwYV9uZXh0OwkvKiB2YV90b19wYShzdHJ1Y3QgaTU5Nl9yZmQgKm5leHQpICovCisJcGh5c19hZGRyIHBhX3JiZDsJLyogdmFfdG9fcGEoc3RydWN0IGk1OTZfcmJkICpyYmQpICovCisJdW5zaWduZWQgc2hvcnQgY291bnQ7CisJdW5zaWduZWQgc2hvcnQgc2l6ZTsKKwljaGFyIGRhdGFbMTUzMl07Cit9OworCisjZGVmaW5lIFJCRF9FTAkJMHg4MDAwCisjZGVmaW5lIFJCRF9QCQkweDQwMDAKKyNkZWZpbmUgUkJEX1NJWkVNQVNLCTB4M2ZmZgorI2RlZmluZSBSQkRfRU9GCQkweDgwMDAKKyNkZWZpbmUgUkJEX0YJCTB4NDAwMAorCisvKiByZWNlaXZlIGJ1ZmZlciBkZXNjcmlwdG9yICovCitzdHJ1Y3QgaTU5Nl9yYmQgeworCXVuc2lnbmVkIHNob3J0IHNpemU7CisJdW5zaWduZWQgc2hvcnQgcGFkOworCXBoeXNfYWRkciBwYV9uZXh0OwkvKiB2YV90b19wYShzdHJ1Y3QgaTU5Nl90YmQgKm5leHQpICovCisJcGh5c19hZGRyIHBhX2RhdGE7CS8qIHZhX3RvX3BhKGNoYXIgKmRhdGEpICovCisJcGh5c19hZGRyIHBhX3ByZXY7CS8qIHZhX3RvX3BhKHN0cnVjdCBpNTk2X3RiZCAqcHJldikgKi8KKwkKKwkvKiBEcml2ZXIgcHJpdmF0ZSBwYXJ0ICovCisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKK307CisKKyNkZWZpbmUgUlhfUklOR19TSVpFIDY0CisjZGVmaW5lIFJYX1NLQlNJWkUgKEVUSF9GUkFNRV9MRU4rMTApCisjZGVmaW5lIFJYX1JCRF9TSVpFIDMyCisKKy8qIFN5c3RlbSBDb250cm9sIEJsb2NrIC0gNDAgYnl0ZXMgKi8KK3N0cnVjdCBpNTk2X3NjYiB7CisJdTE2IHN0YXR1czsJCS8qIDAgKi8KKwl1MTYgY29tbWFuZDsJCS8qIDIgKi8KKwlwaHlzX2FkZHIgcGFfY21kOwkvKiA0IC0gdmFfdG9fcGEoc3RydWN0IGk1OTZfY21kICpjbWQpICovCisJcGh5c19hZGRyIHBhX3JmZDsJLyogOCAtIHZhX3RvX3BhKHN0cnVjdCBpNTk2X3JmZCAqcmZkKSAqLworCXUzMiBjcmNfZXJyOwkJLyogMTIgKi8KKwl1MzIgYWxpZ25fZXJyOwkJLyogMTYgKi8KKwl1MzIgcmVzb3VyY2VfZXJyOwkvKiAyMCAqLworCXUzMiBvdmVyX2VycjsJCS8qIDI0ICovCisJdTMyIHJjdmR0X2VycjsJCS8qIDI4ICovCisJdTMyIHNob3J0X2VycjsJCS8qIDMyICovCisJdTE2IHRfb247CQkvKiAzNiAqLworCXUxNiB0X29mZjsJCS8qIDM4ICovCit9OworCisvKiBJbnRlcm1lZGlhdGUgU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciAtIDggYnl0ZXMgKi8KK3N0cnVjdCBpNTk2X2lzY3AgeworCXUzMiBidXN5OwkJLyogMCAqLworCXBoeXNfYWRkciBwYV9zY2I7CS8qIDQgLSB2YV90b19wYShzdHJ1Y3QgaTU5Nl9zY2IgKnNjYikgKi8KK307CisKKy8qIFN5c3RlbSBDb25maWd1cmF0aW9uIFBvaW50ZXIgLSAxMiBieXRlcyAqLworc3RydWN0IGk1OTZfc2NwIHsKKwl1MzIgc3lzYnVzOwkJLyogMCAqLworCXUzMiBwYWQ7CQkvKiA0ICovCisJcGh5c19hZGRyIHBhX2lzY3A7CS8qIDggLSB2YV90b19wYShzdHJ1Y3QgaTU5Nl9pc2NwICppc2NwKSAqLworfTsKKworLyogU2VsZnRlc3QgYW5kIGR1bXAgcmVzdWx0cyAtIG5lZWRzIDE2LWJ5dGUgYWxpZ25tZW50ICovCisvKgorICogVGhlIHNpemUgb2YgdGhlIGR1bXAgYXJlYSBpcyAzMDQgYnl0ZXMuIFdoZW4gdGhlIGR1bXAgaXMgZXhlY3V0ZWQKKyAqIGJ5IHRoZSBQb3J0IGNvbW1hbmQgYW4gZXh0cmEgd29yZCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBkdW1wIGFyZWEuCisgKiBUaGUgZXh0cmEgd29yZCBpcyBhIGNvcHkgb2YgdGhlIER1bXAgc3RhdHVzIHdvcmQgKGNvbnRhaW5pbmcgdGhlCisgKiBDLCBCLCBPSyBiaXRzKS4gW0kgZmluZCAweGEwMDYsIHdpdGggYTAgZm9yIEMrT0sgYW5kIDYgZm9yIGR1bXBdCisgKi8KK3N0cnVjdCBpNTk2X2R1bXAgeworCXUxNiBkdW1wWzE1M107CQkvKiAoMzA0ID0gMTMwaCkgKyAyIGJ5dGVzICovCit9OworCitzdHJ1Y3QgaTU5Nl9wcml2YXRlIHsJCS8qIGFsaWduZWQgdG8gYSAxNi1ieXRlIGJvdW5kYXJ5ICovCisJc3RydWN0IGk1OTZfc2NwIHNjcDsJLyogMCAtIG5lZWRzIDE2LWJ5dGUgYWxpZ25tZW50ICovCisJc3RydWN0IGk1OTZfaXNjcCBpc2NwOwkvKiAxMiAqLworCXN0cnVjdCBpNTk2X3NjYiBzY2I7CS8qIDIwICovCisJdTMyIGR1bW15OwkJLyogNjAgKi8KKwlzdHJ1Y3QgaTU5Nl9kdW1wIGR1bXA7CS8qIDY0IC0gbmVlZHMgMTYtYnl0ZSBhbGlnbm1lbnQgKi8KKworCXN0cnVjdCBpNTk2X2NtZCBzZXRfYWRkOworCWNoYXIgZXRoX2FkZHJbOF07CS8qIGRpcmVjdGx5IGZvbGxvd3Mgc2V0X2FkZCAqLworCisJc3RydWN0IGk1OTZfY21kIHNldF9jb25mOworCWNoYXIgaTU5Nl9jb25maWdbMTZdOwkvKiBkaXJlY3RseSBmb2xsb3dzIHNldF9jb25mICovCisKKwlzdHJ1Y3QgaTU5Nl9jbWQgdGRyOworCXVuc2lnbmVkIGxvbmcgdGRyX3N0YXQ7CS8qIGRpcmVjdGx5IGZvbGxvd3MgdGRyICovCisKKwlpbnQgbGFzdF9yZXN0YXJ0OworCXN0cnVjdCBpNTk2X3JiZCAqcmJkX2xpc3Q7CisJc3RydWN0IGk1OTZfcmJkICpyYmRfdGFpbDsKKwlzdHJ1Y3QgaTU5Nl9yZmQgKnJ4X3RhaWw7CisJc3RydWN0IGk1OTZfY21kICpjbWRfdGFpbDsKKwlzdHJ1Y3QgaTU5Nl9jbWQgKmNtZF9oZWFkOworCWludCBjbWRfYmFja2xvZzsKKwl1bnNpZ25lZCBsb25nIGxhc3RfY21kOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXNwaW5sb2NrX3QgY21kX2xvY2s7Cit9OworCitzdGF0aWMgY2hhciBpbml0X3NldHVwWzE0XSA9IHsKKwkweDhFLAkvKiBsZW5ndGggMTQgYnl0ZXMsIHByZWZldGNoIG9uICovCisJMHhDOCwJLyogZGVmYXVsdDogZmlmbyB0byA4LCBtb25pdG9yIG9mZiAqLworCTB4NDAsCS8qIGRlZmF1bHQ6IGRvbid0IHNhdmUgYmFkIGZyYW1lcyAoYXByaWNvdC5jIGhhZCAweDgwKSAqLworCTB4MkUsCS8qIChkZWZhdWx0IGlzIDB4MjYpCisJCSAgIE5vIHNvdXJjZSBhZGRyZXNzIGluc2VydGlvbiwgOCBieXRlIHByZWFtYmxlICovCisJMHgwMCwJLyogZGVmYXVsdCBwcmlvcml0eSBhbmQgYmFja29mZiAqLworCTB4NjAsCS8qIGRlZmF1bHQgaW50ZXJmcmFtZSBzcGFjaW5nICovCisJMHgwMCwJLyogZGVmYXVsdCBzbG90IHRpbWUgTFNCICovCisJMHhmMiwJLyogZGVmYXVsdCBzbG90IHRpbWUgYW5kIG5yIG9mIHJldHJpZXMgKi8KKwkweDAwLAkvKiBkZWZhdWx0IHZhcmlvdXMgYml0cworCQkgICAoMDogcHJvbWlzY3VvdXMgbW9kZSwgMTogYnJvYWRjYXN0IGRpc2FibGUsCisJCSAgICAyOiBlbmNvZGluZyBtb2RlLCAzOiB0cmFuc21pdCBvbiBubyBDUlMsCisJCSAgICA0OiBubyBDUkMgaW5zZXJ0aW9uLCA1OiBDUkMgdHlwZSwKKwkJICAgIDY6IGJpdCBzdHVmZmluZywgNzogcGFkZGluZykgKi8KKwkweDAwLAkvKiBkZWZhdWx0IGNhcnJpZXIgc2Vuc2UgYW5kIGNvbGxpc2lvbiBkZXRlY3QgKi8KKwkweDQwLAkvKiBkZWZhdWx0IG1pbmltdW0gZnJhbWUgbGVuZ3RoICovCisJMHhmZiwJLyogKGRlZmF1bHQgaXMgMHhmZiwgYW5kIHRoYXQgaXMgd2hhdCBhcHJpY290LmMgaGFzOworCQkgICBlbHA0ODYuYyBoYXMgMHhmYjogRW5hYmxlIGNyYyBhcHBlbmQgaW4gbWVtb3J5LikgKi8KKwkweDAwLAkvKiBkZWZhdWx0OiBub3QgZnVsbCBkdXBsZXggKi8KKwkweDdmCS8qIChkZWZhdWx0IGlzIDB4M2YpIG11bHRpIElBICovCit9OworCitzdGF0aWMgaW50IGk1OTZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaTU5Nl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGk1OTZfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCBpNTk2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppNTk2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGk1OTZfYWRkX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaTU5Nl9jbWQgKmNtZCk7CitzdGF0aWMgdm9pZCBwcmludF9ldGgoY2hhciAqKTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGk1OTZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGludAoraTU5Nl90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKm1zZywgaW50IGN0KSB7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHA7CisJaW50IGJvZ3VzY250ID0gY3Q7CisKKwlscCA9IChzdHJ1Y3QgaTU5Nl9wcml2YXRlICopIGRldi0+cHJpdjsKKwl3aGlsZSAobHAtPnNjYi5jb21tYW5kKSB7CisJCWlmICgtLWJvZ3VzY250ID09IDApIHsKKwkJCXByaW50aygiJXM6ICVzIHRpbWVkIG91dCAtIHN0YXQgJTQuNHgsIGNtZCAlNC40eFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIG1zZywKKwkJCSAgICAgICBscC0+c2NiLnN0YXR1cywgbHAtPnNjYi5jb21tYW5kKTsKKwkJCXJldHVybiAxOworCQl9CisJCXVkZWxheSg1KTsKKwkJYmFycmllcigpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2luaXRfcnhfYnVmcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbnVtKSB7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHA7CisJc3RydWN0IGk1OTZfcmZkICpyZmQ7CisJaW50IGk7CisJLy8gc3RydWN0IGk1OTZfcmJkICpyYmQ7CisKKwlscCA9IChzdHJ1Y3QgaTU5Nl9wcml2YXRlICopIGRldi0+cHJpdjsKKwlscC0+c2NiLnBhX3JmZCA9IEk1OTZfTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlyZmQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTU5Nl9yZmQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHJmZCA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJcmZkLT5zdGF0ID0gMDsKKwkJcmZkLT5wYV9yYmQgPSBJNTk2X05VTEw7CisJCXJmZC0+Y291bnQgPSAwOworCQlyZmQtPnNpemUgPSAxNTMyOworCQlpZiAoaSA9PSAwKSB7CisJCQlyZmQtPmNtZCA9IENNRF9FT0w7CisJCQlscC0+cnhfdGFpbCA9IHJmZDsKKwkJfSBlbHNlIHsKKwkJCXJmZC0+Y21kID0gMDsKKwkJfQorCQlyZmQtPnBhX25leHQgPSBscC0+c2NiLnBhX3JmZDsKKwkJbHAtPnNjYi5wYV9yZmQgPSB2YV90b19wYShyZmQpOworCQlscC0+cnhfdGFpbC0+cGFfbmV4dCA9IGxwLT5zY2IucGFfcmZkOworCX0KKworI2lmIDAKKwlmb3IgKGkgPSAwOyBpPFJYX1JCRF9TSVpFOyBpKyspIHsKKwkJcmJkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGk1OTZfcmJkKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChyYmQpIHsKKwkJCXJiZC0+cGFkID0gMDsKKwkJCXJiZC0+Y291bnQgPSAwOworCQkJcmJkLT5za2IgPSBkZXZfYWxsb2Nfc2tiKFJYX1NLQl9TSVpFKTsKKwkJCWlmICghcmJkLT5za2IpIHsKKwkJCQlwcmludGsoImRldl9hbGxvY19za2IgZmFpbGVkIik7CisJCQl9CisJCQlyYmQtPm5leHQgPSByZmQtPnJiZDsKKwkJCWlmIChpKSB7CisJCQkJcmZkLT5yYmQtPnByZXYgPSByYmQ7CisJCQkJcmJkLT5zaXplID0gUlhfU0tCX1NJWkU7CisJCQl9IGVsc2UgeworCQkJCXJiZC0+c2l6ZSA9IChSWF9TS0JfU0laRSB8IFJCRF9FTCk7CisJCQkJbHAtPnJiZF90YWlsID0gcmJkOworCQkJfQorCisJCQlyZmQtPnJiZCA9IHJiZDsKKwkJfSBlbHNlIHsKKwkJCXByaW50aygiQ291bGQgbm90IGttYWxsb2MgcmJkXG4iKTsKKwkJfQorCX0KKwlscC0+cmJkX3RhaWwtPm5leHQgPSByZmQtPnJiZDsKKyNlbmRpZgorCXJldHVybiAoaSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcmVtb3ZlX3J4X2J1ZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwOworCXN0cnVjdCBpNTk2X3JmZCAqcmZkOworCisJbHAgPSAoc3RydWN0IGk1OTZfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJbHAtPnJ4X3RhaWwtPnBhX25leHQgPSBJNTk2X05VTEw7CisKKwlkbyB7CisJCXJmZCA9IHBhX3RvX3ZhKGxwLT5zY2IucGFfcmZkKTsKKwkJbHAtPnNjYi5wYV9yZmQgPSByZmQtPnBhX25leHQ7CisJCWtmcmVlKHJmZCk7CisJfSB3aGlsZSAocmZkICE9IGxwLT5yeF90YWlsKTsKKworCWxwLT5yeF90YWlsID0gTlVMTDsKKworI2lmIDAKKwlmb3IgKGxwLT5yYmRfbGlzdCkgeworCX0KKyNlbmRpZgorfQorCisjZGVmaW5lIFBPUlRfUkVTRVQgICAgICAgICAgICAgIDB4MDAgICAgLyogcmVzZXQgODI1OTYgKi8KKyNkZWZpbmUgUE9SVF9TRUxGVEVTVCAgICAgICAgICAgMHgwMSAgICAvKiBzZWxmdGVzdCAqLworI2RlZmluZSBQT1JUX0FMVFNDUCAgICAgICAgICAgICAweDAyICAgIC8qIGFsdGVybmF0ZSBTQ0IgYWRkcmVzcyAqLworI2RlZmluZSBQT1JUX0RVTVAgICAgICAgICAgICAgICAweDAzICAgIC8qIGR1bXAgKi8KKworI2RlZmluZSBJT0FERFIJMHhjYjAJCS8qIHJlYWwgY29uc3RhbnQgKi8KKyNkZWZpbmUgSVJRCTEwCQkvKiBkZWZhdWx0IElSUSAtIGNhbiBiZSBjaGFuZ2VkIGJ5IEVDVSAqLworCisvKiBUaGUgODI1OTYgcmVxdWlyZXMgdHdvIDE2LWJpdCB3cml0ZSBjeWNsZXMgZm9yIGEgcG9ydCBjb21tYW5kICovCitzdGF0aWMgaW5saW5lIHZvaWQKK1BPUlQocGh5c19hZGRyIGEsIHVuc2lnbmVkIGludCBjbWQpIHsKKwlpZiAoYSAmIDB4ZikKKwkJcHJpbnRrKCJscDQ4NmUuYzogUE9SVDogYWRkcmVzcyBub3QgYWxpZ25lZFxuIik7CisJb3V0dygoKGEgJiAweGZmZmYpIHwgY21kKSwgSU9BRERSKTsKKwlvdXR3KCgoYT4+MTYpICYgMHhmZmZmKSwgSU9BRERSKzIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK0NBKHZvaWQpIHsKKwlvdXRiKDAsIElPQUREUis0KTsKKwl1ZGVsYXkoOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorQ0xFQVJfSU5UKHZvaWQpIHsKKwlvdXRiKDAsIElPQUREUis4KTsKK30KKworI2RlZmluZSBTSVpFKHgpCShzaXplb2YoeCkvc2l6ZW9mKCh4KVswXSkpCisKKyNpZiAwCisvKiBzZWxmdGVzdCBvciBkdW1wICovCitzdGF0aWMgdm9pZAoraTU5Nl9wb3J0X2RvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwb3J0Y21kLCBjaGFyICpjbWRuYW1lKSB7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJdTE2ICpvdXRwOworCWludCBpLCBtOworCisJbWVtc2V0KCh2b2lkICopJihscC0+ZHVtcCksIDAsIHNpemVvZihzdHJ1Y3QgaTU5Nl9kdW1wKSk7CisJb3V0cCA9ICYobHAtPmR1bXAuZHVtcFswXSk7CisKKwlQT1JUKHZhX3RvX3BhKG91dHApLCBwb3J0Y21kKTsKKwltZGVsYXkoMzApOyAgICAgICAgICAgICAvKiByYW5kb20sIHVubW90aXZhdGVkICovCisKKwlwcmludGsoImxwNDg2ZSBpODI1OTYgJXMgcmVzdWx0OlxuIiwgY21kbmFtZSk7CisJZm9yIChtID0gU0laRShscC0+ZHVtcC5kdW1wKTsgbSAmJiBscC0+ZHVtcC5kdW1wW20tMV0gPT0gMDsgbS0tKQorCQk7CisJZm9yIChpID0gMDsgaSA8IG07IGkrKykgeworCQlwcmludGsoIiAlMDR4IiwgbHAtPmR1bXAuZHVtcFtpXSk7CisJCWlmIChpJTggPT0gNykKKwkJCXByaW50aygiXG4iKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK2k1OTZfc2NwX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlpbnQgYm9ndXNjbnQ7CisKKwkvKiBTZXR1cCBTQ1AsIElTQ1AsIFNDQiAqLworCS8qCisJICogc3lzYnVzIGJpdHM6CisJICogIG9ubHkgYSBzaW5nbGUgYnl0ZSBpcyBzaWduaWZpY2FudCAtIGhlcmUgMHg0NAorCSAqICAweDgwOiBiaWcgZW5kaWFuIG1vZGUgKGRldGFpbHMgZGVwZW5kIG9uIHN0ZXBwaW5nKQorCSAqICAweDQwOiAxCisJICogIDB4MjA6IGludGVycnVwdCBwaW4gaXMgYWN0aXZlIGxvdworCSAqICAweDEwOiBsb2NrIGZ1bmN0aW9uIGRpc2FibGVkCisJICogIDB4MDg6IGV4dGVybmFsIHRyaWdnZXJpbmcgb2YgYnVzIHRocm90dGxlIHRpbWVycworCSAqICAweDA2OiAwMDogODI1ODYgY29tcGF0IG1vZGUsIDAxOiBzZWdtZW50ZWQgbW9kZSwgMTA6IGxpbmVhciBtb2RlCisJICogIDB4MDE6IHVudXNlZAorCSAqLworCWxwLT5zY3Auc3lzYnVzID0gMHgwMDQ0MDAwMDsgCQkvKiBsaW5lYXIgbW9kZSAqLworCWxwLT5zY3AucGFkID0gMDsJCQkvKiBtdXN0IGJlIHplcm8gKi8KKwlscC0+c2NwLnBhX2lzY3AgPSB2YV90b19wYSgmKGxwLT5pc2NwKSk7CisKKwkvKgorCSAqIFRoZSBDUFUgc2V0cyB0aGUgSVNDUCB0byAxIGJlZm9yZSBpdCBnaXZlcyB0aGUgZmlyc3QgQ0EoKQorCSAqLworCWxwLT5pc2NwLmJ1c3kgPSAweDAwMDE7CisJbHAtPmlzY3AucGFfc2NiID0gdmFfdG9fcGEoJihscC0+c2NiKSk7CisKKwlscC0+c2NiLmNvbW1hbmQgPSAwOworCWxwLT5zY2Iuc3RhdHVzID0gMDsKKwlscC0+c2NiLnBhX2NtZCA9IEk1OTZfTlVMTDsKKwkvKiBscC0+c2NiLnBhX3JmZCBoYXMgYmVlbiBpbml0aWFsaXNlZCBhbHJlYWR5ICovCisKKwlscC0+bGFzdF9jbWQgPSBqaWZmaWVzOworCWxwLT5jbWRfYmFja2xvZyA9IDA7CisJbHAtPmNtZF9oZWFkID0gTlVMTDsKKworCS8qCisJICogUmVzZXQgdGhlIDgyNTk2LgorCSAqIFdlIG5lZWQgdG8gd2FpdCAxMCBzeXN0ZW1jbG9jayBjeWNsZXMsIGFuZAorCSAqIDUgc2VyaWFsIGNsb2NrIGN5Y2xlcy4KKwkgKi8KKwlQT1JUKDAsIFBPUlRfUkVTRVQpOwkvKiBhZGRyZXNzIHBhcnQgaWdub3JlZCAqLworCXVkZWxheSgxMDApOworCisJLyoKKwkgKiBCZWZvcmUgdGhlIENBIHNpZ25hbCBpcyBhc3NlcnRlZCwgdGhlIGRlZmF1bHQgU0NQIGFkZHJlc3MKKwkgKiAoMHgwMGZmZmZmNCkgY2FuIGJlIGNoYW5nZWQgdG8gYSAxNi1ieXRlIGFsaWduZWQgdmFsdWUKKwkgKi8KKwlQT1JUKHZhX3RvX3BhKCZscC0+c2NwKSwgUE9SVF9BTFRTQ1ApOwkvKiBjaGFuZ2UgdGhlIHNjcCBhZGRyZXNzICovCisKKwkvKgorCSAqIFRoZSBpbml0aWFsaXphdGlvbiBwcm9jZWR1cmUgYmVnaW5zIHdoZW4gYQorCSAqIENoYW5uZWwgQXR0ZW50aW9uIHNpZ25hbCBpcyBhc3NlcnRlZCBhZnRlciBhIHJlc2V0LgorCSAqLworCisJQ0EoKTsKKworCS8qCisJICogVGhlIElTQ1AgYnVzeSBpcyBjbGVhcmVkIGJ5IHRoZSA4MjU5NiBhZnRlciB0aGUgU0NCIGFkZHJlc3MgaXMgcmVhZC4KKwkgKi8KKwlib2d1c2NudCA9IDEwMDsKKwl3aGlsZSAobHAtPmlzY3AuYnVzeSkgeworCQlpZiAoLS1ib2d1c2NudCA9PSAwKSB7CisJCQkvKiBObyBpODI1OTYgcHJlc2VudD8gKi8KKwkJCXByaW50aygiJXM6IGk4MjU5NiBpbml0aWFsaXphdGlvbiB0aW1lZCBvdXRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXJldHVybiAxOworCQl9CisJCXVkZWxheSg1KTsKKwkJYmFycmllcigpOworCX0KKwkvKiBJIGZpbmQgaGVyZSBib2d1c2NudD09MTAwLCBzbyBubyBkZWxheSB3YXMgcmVxdWlyZWQuICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraW5pdF9pNTk2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscDsKKworCWlmIChpNTk2X3NjcF9zZXR1cChkZXYpKQorCQlyZXR1cm4gMTsKKworCWxwID0gKHN0cnVjdCBpNTk2X3ByaXZhdGUgKikgZGV2LT5wcml2OworCWxwLT5zY2IuY29tbWFuZCA9IDA7CisKKwltZW1jcHkgKCh2b2lkICopbHAtPmk1OTZfY29uZmlnLCBpbml0X3NldHVwLCAxNCk7CisJbHAtPnNldF9jb25mLmNvbW1hbmQgPSBDbWRDb25maWd1cmU7CisJaTU5Nl9hZGRfY21kKGRldiwgKHZvaWQgKikmbHAtPnNldF9jb25mKTsKKworCW1lbWNweSAoKHZvaWQgKilscC0+ZXRoX2FkZHIsIGRldi0+ZGV2X2FkZHIsIDYpOworCWxwLT5zZXRfYWRkLmNvbW1hbmQgPSBDbWRJQVNldHVwOworCWk1OTZfYWRkX2NtZChkZXYsIChzdHJ1Y3QgaTU5Nl9jbWQgKikmbHAtPnNldF9hZGQpOworCisJbHAtPnRkci5jb21tYW5kID0gQ21kVERSOworCWk1OTZfYWRkX2NtZChkZXYsIChzdHJ1Y3QgaTU5Nl9jbWQgKikmbHAtPnRkcik7CisKKwlpZiAobHAtPnNjYi5jb21tYW5kICYmIGk1OTZfdGltZW91dChkZXYsICJpODI1OTYgaW5pdCIsIDIwMCkpCisJCXJldHVybiAxOworCisJbHAtPnNjYi5jb21tYW5kID0gUlhfU1RBUlQ7CisJQ0EoKTsKKworCWJhcnJpZXIoKTsKKwkKKwlpZiAobHAtPnNjYi5jb21tYW5kICYmIGk1OTZfdGltZW91dChkZXYsICJSZWNlaXZlIFVuaXQgc3RhcnQiLCAxMDApKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKiBSZWNlaXZlIGEgc2luZ2xlIGZyYW1lICovCitzdGF0aWMgaW5saW5lIGludAoraTU5Nl9yeF9vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAsCisJICAgIHN0cnVjdCBpNTk2X3JmZCAqcmZkLCBpbnQgKmZyYW1lcykgeworCisJaWYgKHJmZC0+c3RhdCAmIFJGRF9TVEFUX09LKSB7CisJCS8qIGEgZ29vZCBmcmFtZSAqLworCQlpbnQgcGt0X2xlbiA9IChyZmQtPmNvdW50ICYgMHgzZmZmKTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbik7CisKKwkJKCpmcmFtZXMpKys7CisKKwkJaWYgKHJmZC0+Y21kICYgQ01EX0VPTCkKKwkJCXByaW50aygiUmVjZWl2ZWQgb24gRU9MXG4iKTsKKworCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCXByaW50ayAoIiVzOiBpNTk2X3J4IE1lbW9yeSBzcXVlZXplLCAiCisJCQkJImRyb3BwaW5nIHBhY2tldC5cbiIsIGRldi0+bmFtZSk7CisJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlza2ItPmRldiA9IGRldjsJCQorCQltZW1jcHkoc2tiX3B1dChza2IscGt0X2xlbiksIHJmZC0+ZGF0YSwgcGt0X2xlbik7CisKKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCQluZXRpZl9yeChza2IpOworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCX0gZWxzZSB7CisjaWYgMAorCQlwcmludGsoIkZyYW1lIHJlY2VwdGlvbiBlcnJvciBzdGF0dXMgJTA0eFxuIiwKKwkJICAgICAgIHJmZC0+c3RhdCk7CisjZW5kaWYKKwkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlpZiAocmZkLT5zdGF0ICYgUkZEX0NPTExJU0lPTikKKwkJCWxwLT5zdGF0cy5jb2xsaXNpb25zKys7CisJCWlmIChyZmQtPnN0YXQgJiBSRkRfU0hPUlRfRlJBTUVfRVJSKQorCQkJbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJaWYgKHJmZC0+c3RhdCAmIFJGRF9ETUFfRVJSKQorCQkJbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCWlmIChyZmQtPnN0YXQgJiBSRkRfTk9CVUZTX0VSUikKKwkJCWxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQlpZiAocmZkLT5zdGF0ICYgUkZEX0FMSUdOX0VSUikKKwkJCWxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJaWYgKHJmZC0+c3RhdCAmIFJGRF9DUkNfRVJSKQorCQkJbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJaWYgKHJmZC0+c3RhdCAmIFJGRF9MRU5HVEhfRVJSKQorCQkJbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwl9CisJcmZkLT5zdGF0ID0gcmZkLT5jb3VudCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2k1OTZfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gKHN0cnVjdCBpNTk2X3ByaXZhdGUgKikgZGV2LT5wcml2OworCXN0cnVjdCBpNTk2X3JmZCAqcmZkOworCWludCBmcmFtZXMgPSAwOworCisJd2hpbGUgKDEpIHsKKwkJcmZkID0gcGFfdG9fdmEobHAtPnNjYi5wYV9yZmQpOworCQlpZiAoIXJmZCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJpNTk2X3J4OiBOVUxMIHJmZD9cbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKyNpZiAxCisJCWlmIChyZmQtPnN0YXQgJiYgIShyZmQtPnN0YXQgJiAoUkZEX1NUQVRfQyB8IFJGRF9TVEFUX0IpKSkKKwkJCXByaW50aygiU0Y6JXAtJTA0eFxuIiwgcmZkLCByZmQtPnN0YXQpOworI2VuZGlmCisJCWlmICghKHJmZC0+c3RhdCAmIFJGRF9TVEFUX0MpKQorCQkJYnJlYWs7CQkvKiBuZXh0IG9uZSBub3QgcmVhZHkgKi8KKwkJaWYgKGk1OTZfcnhfb25lKGRldiwgbHAsIHJmZCwgJmZyYW1lcykpCisJCQlicmVhazsJCS8qIG91dCBvZiBtZW1vcnkgKi8KKwkJcmZkLT5jbWQgPSBDTURfRU9MOworCQlscC0+cnhfdGFpbC0+Y21kID0gMDsKKwkJbHAtPnJ4X3RhaWwgPSByZmQ7CisJCWxwLT5zY2IucGFfcmZkID0gcmZkLT5wYV9uZXh0OworCQliYXJyaWVyKCk7CisJfQorCisJcmV0dXJuIGZyYW1lczsKK30KKworc3RhdGljIHZvaWQKK2k1OTZfY2xlYW51cF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwOworCXN0cnVjdCBpNTk2X2NtZCAqY21kOworCisJbHAgPSAoc3RydWN0IGk1OTZfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJd2hpbGUgKGxwLT5jbWRfaGVhZCkgeworCQljbWQgPSAoc3RydWN0IGk1OTZfY21kICopbHAtPmNtZF9oZWFkOworCisJCWxwLT5jbWRfaGVhZCA9IHBhX3RvX3ZhKGxwLT5jbWRfaGVhZC0+cGFfbmV4dCk7CisJCWxwLT5jbWRfYmFja2xvZy0tOworCisJCXN3aXRjaCAoKGNtZC0+Y29tbWFuZCkgJiAweDcpIHsKKwkJCWNhc2UgQ21kVHg6IHsKKwkJCQlzdHJ1Y3QgdHhfY21kICp0eF9jbWQgPSAoc3RydWN0IHR4X2NtZCAqKSBjbWQ7CisJCQkJc3RydWN0IGk1OTZfdGJkICogdHhfY21kX3RiZDsKKwkJCQl0eF9jbWRfdGJkID0gcGFfdG9fdmEodHhfY21kLT5wYV90YmQpOworCisJCQkJZGV2X2tmcmVlX3NrYl9hbnkodHhfY21kX3RiZC0+c2tiKTsKKworCQkJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKworCQkJCWNtZC0+cGFfbmV4dCA9IEk1OTZfTlVMTDsKKwkJCQlrZnJlZSgodW5zaWduZWQgY2hhciAqKXR4X2NtZCk7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBDbWRNdWx0aWNhc3RMaXN0OiB7CisJCQkJLy8gdW5zaWduZWQgc2hvcnQgY291bnQgPSAqKCh1bnNpZ25lZCBzaG9ydCAqKSAocHRyICsgMSkpOworCisJCQkJY21kLT5wYV9uZXh0ID0gSTU5Nl9OVUxMOworCQkJCWtmcmVlKCh1bnNpZ25lZCBjaGFyICopY21kKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRlZmF1bHQ6IHsKKwkJCQljbWQtPnBhX25leHQgPSBJNTk2X05VTEw7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYmFycmllcigpOworCX0KKworCWlmIChscC0+c2NiLmNvbW1hbmQgJiYgaTU5Nl90aW1lb3V0KGRldiwgImk1OTZfY2xlYW51cF9jbWQiLCAxMDApKQorCQk7CisKKwlscC0+c2NiLnBhX2NtZCA9IHZhX3RvX3BhKGxwLT5jbWRfaGVhZCk7Cit9CisKK3N0YXRpYyB2b2lkIGk1OTZfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAsIGludCBpb2FkZHIpIHsKKworCWlmIChscC0+c2NiLmNvbW1hbmQgJiYgaTU5Nl90aW1lb3V0KGRldiwgImk1OTZfcmVzZXQiLCAxMDApKQorCQk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlscC0+c2NiLmNvbW1hbmQgPSBDVUNfQUJPUlQgfCBSWF9BQk9SVDsKKwlDQSgpOworCWJhcnJpZXIoKTsKKwkKKwkvKiB3YWl0IGZvciBzaHV0ZG93biAqLworCWlmIChscC0+c2NiLmNvbW1hbmQgJiYgaTU5Nl90aW1lb3V0KGRldiwgImk1OTZfcmVzZXQoMikiLCA0MDApKQorCQk7CisKKwlpNTk2X2NsZWFudXBfY21kKGRldik7CisJaTU5Nl9yeChkZXYpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkvKmRldl9rZnJlZV9za2Ioc2tiLCBGUkVFX1dSSVRFKTsqLworCWluaXRfaTU5NihkZXYpOworfQorCitzdGF0aWMgdm9pZCBpNTk2X2FkZF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGk1OTZfY21kICpjbWQpIHsKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWNtZC0+c3RhdHVzID0gMDsKKwljbWQtPmNvbW1hbmQgfD0gKENNRF9FT0wgfCBDTURfSU5UUik7CisJY21kLT5wYV9uZXh0ID0gSTU5Nl9OVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5jbWRfbG9jaywgZmxhZ3MpOworCQorCWlmIChscC0+Y21kX2hlYWQpIHsKKwkJbHAtPmNtZF90YWlsLT5wYV9uZXh0ID0gdmFfdG9fcGEoY21kKTsKKwl9IGVsc2UgeworCQlscC0+Y21kX2hlYWQgPSBjbWQ7CisJCWlmIChscC0+c2NiLmNvbW1hbmQgJiYgaTU5Nl90aW1lb3V0KGRldiwgImk1OTZfYWRkX2NtZCIsIDEwMCkpCisJCQk7CisJCWxwLT5zY2IucGFfY21kID0gdmFfdG9fcGEoY21kKTsKKwkJbHAtPnNjYi5jb21tYW5kID0gQ1VDX1NUQVJUOworCQlDQSgpOworCX0KKwlscC0+Y21kX3RhaWwgPSBjbWQ7CisJbHAtPmNtZF9iYWNrbG9nKys7CisKKwlscC0+Y21kX2hlYWQgPSBwYV90b192YShscC0+c2NiLnBhX2NtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmNtZF9sb2NrLCBmbGFncyk7CisKKwlpZiAobHAtPmNtZF9iYWNrbG9nID4gMTYpIHsKKwkJaW50IHRpY2tzc29mYXIgPSBqaWZmaWVzIC0gbHAtPmxhc3RfY21kOworCQlpZiAodGlja3Nzb2ZhciA8IEhaLzQpCisJCQlyZXR1cm47CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNvbW1hbmQgdW5pdCB0aW1lZCBvdXQsIHN0YXR1cyByZXNldHRpbmcuXG4iLCBkZXYtPm5hbWUpOworCQlpNTk2X3Jlc2V0KGRldiwgbHAsIGlvYWRkcik7CisJfQorfQorCitzdGF0aWMgaW50IGk1OTZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlpbnQgaTsKKworCWkgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJmk1OTZfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IElSUSAlZCBub3QgZnJlZVxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCXJldHVybiBpOworCX0KKworCWlmICgoaSA9IGluaXRfcnhfYnVmcyhkZXYsIFJYX1JJTkdfU0laRSkpIDwgUlhfUklOR19TSVpFKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvbmx5IGFibGUgdG8gYWxsb2NhdGUgJWQgcmVjZWl2ZSBidWZmZXJzXG4iLCBkZXYtPm5hbWUsIGkpOworCisJaWYgKGkgPCA0KSB7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlpbml0X2k1OTYoZGV2KTsKKwlyZXR1cm4gMDsJCQkvKiBBbHdheXMgc3VjY2VlZCAqLworfQorCitzdGF0aWMgaW50IGk1OTZfc3RhcnRfeG1pdCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCB0eF9jbWQgKnR4X2NtZDsKKwlzaG9ydCBsZW5ndGg7CisKKwlsZW5ndGggPSBza2ItPmxlbjsKKwkKKwlpZiAobGVuZ3RoIDwgRVRIX1pMRU4pIHsKKwkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJbGVuZ3RoID0gRVRIX1pMRU47CisJfQorCQorCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJdHhfY21kID0gKHN0cnVjdCB0eF9jbWQgKikga21hbGxvYyAoKHNpemVvZiAoc3RydWN0IHR4X2NtZCkgKyBzaXplb2YgKHN0cnVjdCBpNTk2X3RiZCkpLCBHRlBfQVRPTUlDKTsKKwlpZiAodHhfY21kID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGk1OTZfeG1pdCBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJbHAtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgaTU5Nl90YmQgKnR4X2NtZF90YmQ7CisJCXR4X2NtZF90YmQgPSAoc3RydWN0IGk1OTZfdGJkICopICh0eF9jbWQgKyAxKTsKKwkJdHhfY21kLT5wYV90YmQgPSB2YV90b19wYSAodHhfY21kX3RiZCk7CisJCXR4X2NtZF90YmQtPnBhX25leHQgPSBJNTk2X05VTEw7CisKKwkJdHhfY21kLT5jbWQuY29tbWFuZCA9IChDTURfRkxFWCB8IENtZFR4KTsKKworCQl0eF9jbWQtPnBhZCA9IDA7CisJCXR4X2NtZC0+c2l6ZSA9IDA7CisJCXR4X2NtZF90YmQtPnBhZCA9IDA7CisJCXR4X2NtZF90YmQtPnNpemUgPSAoRU9GIHwgbGVuZ3RoKTsKKworCQl0eF9jbWRfdGJkLT5wYV9kYXRhID0gdmFfdG9fcGEgKHNrYi0+ZGF0YSk7CisJCXR4X2NtZF90YmQtPnNrYiA9IHNrYjsKKworCQlpZiAoaTU5Nl9kZWJ1ZyAmIExPR19TUkNEU1QpCisJCQlwcmludF9ldGggKHNrYi0+ZGF0YSk7CisKKwkJaTU5Nl9hZGRfY21kIChkZXYsIChzdHJ1Y3QgaTU5Nl9jbWQgKikgdHhfY21kKTsKKworCQlscC0+c3RhdHMudHhfcGFja2V0cysrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoraTU5Nl90eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IGk1OTZfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJLyogVHJhbnNtaXR0ZXIgdGltZW91dCwgc2VyaW91cyBwcm9ibGVtcy4gKi8KKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgcmVzZXR0aW5nLlxuIiwgZGV2LT5uYW1lKTsKKwlscC0+c3RhdHMudHhfZXJyb3JzKys7CisKKwkvKiBUcnkgdG8gcmVzdGFydCB0aGUgYWRhcHRvciAqLworCWlmIChscC0+bGFzdF9yZXN0YXJ0ID09IGxwLT5zdGF0cy50eF9wYWNrZXRzKSB7CisJCXByaW50ayAoIlJlc2V0dGluZyBib2FyZC5cbiIpOworCisJCS8qIFNodXRkb3duIGFuZCByZXN0YXJ0ICovCisJCWk1OTZfcmVzZXQgKGRldiwgbHAsIGlvYWRkcik7CisJfSBlbHNlIHsKKwkJLyogSXNzdWUgYSBjaGFubmVsIGF0dGVudGlvbiBzaWduYWwgKi8KKwkJcHJpbnRrICgiS2lja2luZyBib2FyZC5cbiIpOworCQlscC0+c2NiLmNvbW1hbmQgPSAoQ1VDX1NUQVJUIHwgUlhfU1RBUlQpOworCQlDQSgpOworCQlscC0+bGFzdF9yZXN0YXJ0ID0gbHAtPnN0YXRzLnR4X3BhY2tldHM7CisJfQorCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZXRoKGNoYXIgKmFkZCkgCit7CisJaW50IGk7CisKKwlwcmludGsgKCJEZXN0ICAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiAlMi4yWCIsICh1bnNpZ25lZCBjaGFyKSBhZGRbaV0pOworCXByaW50ayAoIlxuIik7CisKKwlwcmludGsgKCJTb3VyY2UiKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiAlMi4yWCIsICh1bnNpZ25lZCBjaGFyKSBhZGRbaSs2XSk7CisJcHJpbnRrICgiXG4iKTsKKworCXByaW50ayAoInR5cGUgJTIuMlglMi4yWFxuIiwKKwkJKHVuc2lnbmVkIGNoYXIpIGFkZFsxMl0sICh1bnNpZ25lZCBjaGFyKSBhZGRbMTNdKTsKK30KKworc3RhdGljIGludCBfX2luaXQgbHA0ODZlX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscDsKKwl1bnNpZ25lZCBjaGFyIGV0aF9hZGRyWzZdID0geyAwLCAweGFhLCAwLCAwLCAwLCAwIH07CisJdW5zaWduZWQgY2hhciAqYmlvczsKKwlpbnQgaSwgajsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKwlzdGF0aWMgaW50IHByb2JlZDsKKworCWlmIChwcm9iZWQpCisJCXJldHVybiAtRU5PREVWOworCXByb2JlZCsrOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihJT0FERFIsIExQNDg2RV9UT1RBTF9TSVpFLCBEUlZfTkFNRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJscDQ4NmU6IElPIGFkZHJlc3MgMHgleCBpbiB1c2VcbiIsIElPQUREUik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJbHAgPSAoc3RydWN0IGk1OTZfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJc3Bpbl9sb2NrX2luaXQoJmxwLT5jbWRfbG9jayk7CisJCisJLyoKKwkgKiBEbyB3ZSByZWFsbHkgaGF2ZSB0aGlzIHRoaW5nPworCSAqLworCWlmIChpNTk2X3NjcF9zZXR1cChkZXYpKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9rZnJlZTsKKwl9CisKKwlkZXYtPmJhc2VfYWRkciA9IElPQUREUjsKKwlkZXYtPmlycSA9IElSUTsKKworCisJLyoKKwkgKiBIb3cgZG8gd2UgZmluZCB0aGUgZXRoZXJuZXQgYWRkcmVzcz8gSSBkb24ndCBrbm93LgorCSAqIE9uZSBwb3NzaWJpbGl0eSBpcyB0byBsb29rIGF0IHRoZSBFSVNBIGNvbmZpZ3VyYXRpb24gYXJlYQorCSAqIFsweGU4MDAwLTB4ZTlmZmZdLiBUaGlzIGNvbnRhaW5zIHRoZSBldGhlcm5ldCBhZGRyZXNzCisJICogYnV0IG5vdCBhdCBhIGZpeGVkIGFkZHJlc3MgLSB0aGluZ3MgZGVwZW5kIG9uIHNldHVwIG9wdGlvbnMuCisJICoKKwkgKiBJZiB3ZSBmaW5kIG5vIGFkZHJlc3MsIG9yIHRoZSB3cm9uZyBhZGRyZXNzLCB1c2UKKwkgKiAgIGlmY29uZmlnIGV0aDAgaHcgZXRoZXIgYTE6YTI6YTM6YTQ6YTU6YTYKKwkgKiB3aXRoIHRoZSB2YWx1ZSBmb3VuZCBpbiB0aGUgQklPUyBzZXR1cC4KKwkgKi8KKwliaW9zID0gYnVzX3RvX3ZpcnQoMHhlODAwMCk7CisJZm9yIChqID0gMDsgaiA8IDB4MjAwMDsgaisrKSB7CisJCWlmIChiaW9zW2pdID09IDAgJiYgYmlvc1tqKzFdID09IDB4YWEgJiYgYmlvc1tqKzJdID09IDApIHsKKwkJCXByaW50aygiJXM6IG1heWJlIGFkZHJlc3MgYXQgQklPUyAweCV4OiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCAweGU4MDAwK2opOworCQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQkJCWV0aF9hZGRyW2ldID0gYmlvc1tpK2pdOworCQkJCXByaW50aygiICUyLjJYIiwgZXRoX2FkZHJbaV0pOworCQkJfQorCQkJcHJpbnRrKCJcbiIpOworCQl9CisJfQorCisJcHJpbnRrKCIlczogbHA0ODZlIDgyNTk2IGF0ICUjM2x4LCBJUlEgJWQsIiwKKwkgICAgICAgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiICUyLjJYIiwgZGV2LT5kZXZfYWRkcltpXSA9IGV0aF9hZGRyW2ldKTsKKwlwcmludGsoIlxuIik7CisKKwkvKiBUaGUgTFA0ODZFLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5vcGVuID0gJmk1OTZfb3BlbjsKKwlkZXYtPnN0b3AgPSAmaTU5Nl9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZpNTk2X3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgPSAmaTU5Nl9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSA1KkhaOworCWRldi0+dHhfdGltZW91dCA9IGk1OTZfdHhfdGltZW91dDsKKworI2lmIDAKKwkvKiBzZWxmdGVzdCByZXBvcnRzIDB4MzIwOTI1YWUgLSBkb24ndCBrbm93IHdoYXQgdGhhdCBtZWFucyAqLworCWk1OTZfcG9ydF9kbyhkZXYsIFBPUlRfU0VMRlRFU1QsICJzZWxmdGVzdCIpOworCWk1OTZfcG9ydF9kbyhkZXYsIFBPUlRfRFVNUCwgImR1bXAiKTsKKyNlbmRpZgorCXJldHVybiAwOworCitlcnJfb3V0X2tmcmVlOgorCXJlbGVhc2VfcmVnaW9uKElPQUREUiwgTFA0ODZFX1RPVEFMX1NJWkUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraTU5Nl9oYW5kbGVfQ1VfY29tcGxldGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCwKKwkJCSAgdW5zaWduZWQgc2hvcnQgc3RhdHVzLAorCQkJICB1bnNpZ25lZCBzaG9ydCAqYWNrX2NtZHApIHsKKwlzdHJ1Y3QgaTU5Nl9jbWQgKmNtZDsKKwlpbnQgZnJhbWVzX291dCA9IDA7CisJaW50IGNvbW1hbmRzX2RvbmUgPSAwOworCWludCBjbWRfdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmNtZF9sb2NrLCBmbGFncyk7CisJY21kID0gbHAtPmNtZF9oZWFkOworCisJd2hpbGUgKGxwLT5jbWRfaGVhZCAmJiAobHAtPmNtZF9oZWFkLT5zdGF0dXMgJiBDTURfU1RBVF9DKSkgeworCQljbWQgPSBscC0+Y21kX2hlYWQ7CisKKwkJbHAtPmNtZF9oZWFkID0gcGFfdG9fdmEobHAtPmNtZF9oZWFkLT5wYV9uZXh0KTsKKwkJbHAtPmNtZF9iYWNrbG9nLS07CisKKwkJY29tbWFuZHNfZG9uZSsrOworCQljbWRfdmFsID0gY21kLT5jb21tYW5kICYgMHg3OworI2lmIDAKKwkJcHJpbnRrKCJmaW5pc2hlZCBDVSAlcyBjb21tYW5kICglZClcbiIsCisJCSAgICAgICBDVWNtZG5hbWVzW2NtZF92YWxdLCBjbWRfdmFsKTsKKyNlbmRpZgorCQlzd2l0Y2ggKGNtZF92YWwpIHsKKwkJY2FzZSBDbWRUeDoKKwkJeworCQkJc3RydWN0IHR4X2NtZCAqdHhfY21kOworCQkJc3RydWN0IGk1OTZfdGJkICp0eF9jbWRfdGJkOworCisJCQl0eF9jbWQgPSAoc3RydWN0IHR4X2NtZCAqKSBjbWQ7CisJCQl0eF9jbWRfdGJkID0gcGFfdG9fdmEodHhfY21kLT5wYV90YmQpOworCisJCQlmcmFtZXNfb3V0Kys7CisJCQlpZiAoY21kLT5zdGF0dXMgJiBDTURfU1RBVF9PSykgeworCQkJCWlmIChpNTk2X2RlYnVnKQorCQkJCQlwcmludF9ldGgocGFfdG9fdmEodHhfY21kX3RiZC0+cGFfZGF0YSkpOworCQkJfSBlbHNlIHsKKwkJCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJaWYgKGk1OTZfZGVidWcpCisJCQkJCXByaW50aygidHJhbnNtaXNzaW9uIGZhaWx1cmU6JTA0eFxuIiwKKwkJCQkJICAgICAgIGNtZC0+c3RhdHVzKTsKKwkJCQlpZiAoY21kLT5zdGF0dXMgJiAweDAwMjApCisJCQkJCWxwLT5zdGF0cy5jb2xsaXNpb25zKys7CisJCQkJaWYgKCEoY21kLT5zdGF0dXMgJiAweDAwNDApKQorCQkJCQlscC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycysrOworCQkJCWlmIChjbWQtPnN0YXR1cyAmIDB4MDQwMCkKKwkJCQkJbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJaWYgKGNtZC0+c3RhdHVzICYgMHgwODAwKQorCQkJCQlscC0+c3RhdHMuY29sbGlzaW9ucysrOworCQkJCWlmIChjbWQtPnN0YXR1cyAmIDB4MTAwMCkKKwkJCQkJbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQl9CisJCQlkZXZfa2ZyZWVfc2tiX2lycSh0eF9jbWRfdGJkLT5za2IpOworCisJCQljbWQtPnBhX25leHQgPSBJNTk2X05VTEw7CisJCQlrZnJlZSgodW5zaWduZWQgY2hhciAqKXR4X2NtZCk7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgQ21kTXVsdGljYXN0TGlzdDoKKwkJCWNtZC0+cGFfbmV4dCA9IEk1OTZfTlVMTDsKKwkJCWtmcmVlKCh1bnNpZ25lZCBjaGFyICopY21kKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ21kVERSOgorCQl7CisJCQl1bnNpZ25lZCBsb25nIHN0YXR1cyA9ICooKHVuc2lnbmVkIGxvbmcgKikgKGNtZCArIDEpKTsKKwkJCWlmIChzdGF0dXMgJiAweDgwMDApIHsKKwkJCQlpZiAoaTU5Nl9kZWJ1ZykKKwkJCQkJcHJpbnRrKCIlczogbGluayBvay5cbiIsIGRldi0+bmFtZSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChzdGF0dXMgJiAweDQwMDApCisJCQkJCXByaW50aygiJXM6IFRyYW5zY2VpdmVyIHByb2JsZW0uXG4iLAorCQkJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCQlpZiAoc3RhdHVzICYgMHgyMDAwKQorCQkJCQlwcmludGsoIiVzOiBUZXJtaW5hdGlvbiBwcm9ibGVtLlxuIiwKKwkJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJaWYgKHN0YXR1cyAmIDB4MTAwMCkKKwkJCQkJcHJpbnRrKCIlczogU2hvcnQgY2lyY3VpdC5cbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJCXByaW50aygiJXM6IFRpbWUgJWxkLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMgJiAweDA3ZmYpOworCQkJfQorCQl9CisJCWRlZmF1bHQ6CisJCQljbWQtPnBhX25leHQgPSBJNTk2X05VTEw7CisJCQlscC0+bGFzdF9jbWQgPSBqaWZmaWVzOworCQkJCisJCX0KKwkJYmFycmllcigpOworCX0KKworCWNtZCA9IGxwLT5jbWRfaGVhZDsKKwl3aGlsZSAoY21kICYmIChjbWQgIT0gbHAtPmNtZF90YWlsKSkgeworCQljbWQtPmNvbW1hbmQgJj0gMHgxZmZmOworCQljbWQgPSBwYV90b192YShjbWQtPnBhX25leHQpOworCQliYXJyaWVyKCk7CisJfQorCisJaWYgKGxwLT5jbWRfaGVhZCkKKwkJKmFja19jbWRwIHw9IENVQ19TVEFSVDsKKwlscC0+c2NiLnBhX2NtZCA9IHZhX3RvX3BhKGxwLT5jbWRfaGVhZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmNtZF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAoraTU5Nl9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscDsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0dXMsIGFja19jbWQgPSAwOworCWludCBmcmFtZXNfaW4gPSAwOworCisJbHAgPSAoc3RydWN0IGk1OTZfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisKKwkvKgorCSAqIFRoZSA4MjU5NiBleGFtaW5lcyB0aGUgY29tbWFuZCwgcGVyZm9ybXMgdGhlIHJlcXVpcmVkIGFjdGlvbiwKKwkgKiBhbmQgdGhlbiBjbGVhcnMgdGhlIFNDQiBjb21tYW5kIHdvcmQuCisJICovCisJaWYgKGxwLT5zY2IuY29tbWFuZCAmJiBpNTk2X3RpbWVvdXQoZGV2LCAiaW50ZXJydXB0IiwgNDApKQorCQk7CisKKwkvKgorCSAqIFRoZSBzdGF0dXMgd29yZCBpbmRpY2F0ZXMgdGhlIHN0YXR1cyBvZiB0aGUgODI1OTYuCisJICogSXQgaXMgbW9kaWZpZWQgb25seSBieSB0aGUgODI1OTYuCisJICoKKwkgKiBbU28sIHdlIG11c3Qgbm90IGNsZWFyIGl0LiBJIGZpbmQgb2Z0ZW4gc3RhdHVzIDB4ZmZmZiwKKwkgKiAgd2hpY2ggaXMgbm90IG9uZSBvZiB0aGUgdmFsdWVzIGFsbG93ZWQgYnkgdGhlIGRvY3MuXQorCSAqLworCXN0YXR1cyA9IGxwLT5zY2Iuc3RhdHVzOworI2lmIDAKKwlpZiAoaTU5Nl9kZWJ1ZykgeworCQlwcmludGsoIiVzOiBpNTk2IGludGVycnVwdCwgIiwgZGV2LT5uYW1lKTsKKwkJaTU5Nl9vdXRfc3RhdHVzKHN0YXR1cyk7CisJfQorI2VuZGlmCisJLyogSW1wb3NzaWJsZSwgYnV0IGl0IGhhcHBlbnMgLSBwZXJoYXBzIHdoZW4gd2UgZ2V0CisJICAgYSByZWNlaXZlIGludGVycnVwdCBidXQgc2NiLnBhX3JmZCBpcyBJNTk2X05VTEwuICovCisJaWYgKHN0YXR1cyA9PSAweGZmZmYpIHsKKwkJcHJpbnRrKCIlczogaTU5Nl9pbnRlcnJ1cHQ6IGdvdCBzdGF0dXMgMHhmZmZmXG4iLCBkZXYtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwlhY2tfY21kID0gKHN0YXR1cyAmIFNUQVRfQUNLKTsKKworCWlmIChzdGF0dXMgJiAoU1RBVF9DWCB8IFNUQVRfQ05BKSkKKwkJaTU5Nl9oYW5kbGVfQ1VfY29tcGxldGlvbihkZXYsIGxwLCBzdGF0dXMsICZhY2tfY21kKTsKKworCWlmIChzdGF0dXMgJiAoU1RBVF9GUiB8IFNUQVRfUk5SKSkgeworCQkvKiBSZXN0YXJ0IHRoZSByZWNlaXZlIHVuaXQgd2hlbiBpdCBnb3QgaW5hY3RpdmUgc29tZWhvdyAqLworCQlpZiAoKHN0YXR1cyAmIFNUQVRfUk5SKSAmJiBuZXRpZl9ydW5uaW5nKGRldikpCisJCQlhY2tfY21kIHw9IFJYX1NUQVJUOworCisJCWlmIChzdGF0dXMgJiBTVEFUX0ZSKSB7CisJCQlmcmFtZXNfaW4gPSBpNTk2X3J4KGRldik7CisJCQlpZiAoIWZyYW1lc19pbikKKwkJCQlwcmludGsoInJlY2VpdmUgZnJhbWUgcmVwb3J0ZWQsIGJ1dCBubyBmcmFtZXNcbiIpOworCQl9CisJfQorCisJLyogYWNrbm93bGVkZ2UgdGhlIGludGVycnVwdCAqLworCS8qCisJaWYgKChscC0+c2NiLnBhX2NtZCAhPSBJNTk2X05VTEwpICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJYWNrX2NtZCB8PSBDVUNfU1RBUlQ7CisJKi8KKworCWlmIChscC0+c2NiLmNvbW1hbmQgJiYgaTU5Nl90aW1lb3V0KGRldiwgImk1OTYgaW50ZXJydXB0IiwgMTAwKSkKKwkJOworCisJbHAtPnNjYi5jb21tYW5kID0gYWNrX2NtZDsKKworCUNMRUFSX0lOVCgpOworCUNBKCk7CisKKyBvdXQ6CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGk1OTZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKGk1OTZfZGVidWcpCisJCXByaW50aygiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLCBzdGF0dXMgd2FzICU0LjR4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbHAtPnNjYi5zdGF0dXMpOworCisJbHAtPnNjYi5jb21tYW5kID0gKENVQ19BQk9SVCB8IFJYX0FCT1JUKTsKKwlDQSgpOworCisJaTU5Nl9jbGVhbnVwX2NtZChkZXYpOworCisJaWYgKGxwLT5zY2IuY29tbWFuZCAmJiBpNTk2X3RpbWVvdXQoZGV2LCAiaTU5Nl9jbG9zZSIsIDIwMCkpCisJCTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJlbW92ZV9yeF9idWZzKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogaTU5Nl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBpNTk2X3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qCisqCVNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorKi8KKworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzdHJ1Y3QgaTU5Nl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgaTU5Nl9jbWQgKmNtZDsKKworCWlmIChpNTk2X2RlYnVnID4gMSkKKwkJcHJpbnRrICgiJXM6IHNldCBtdWx0aWNhc3QgbGlzdCAlZFxuIiwKKwkJCWRldi0+bmFtZSwgZGV2LT5tY19jb3VudCk7CisKKwlpZiAoZGV2LT5tY19jb3VudCA+IDApIHsKKwkJc3RydWN0IGRldl9tY19saXN0ICpkbWk7CisJCWNoYXIgKmNwOworCQljbWQgPSAoc3RydWN0IGk1OTZfY21kICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGk1OTZfY21kKSsyK2Rldi0+bWNfY291bnQqNiwgR0ZQX0FUT01JQyk7CisJCWlmIChjbWQgPT0gTlVMTCkgeworCQkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IHNldF9tdWx0aWNhc3QgTWVtb3J5IHNxdWVlemUuXG4iLCBkZXYtPm5hbWUpOworCQkJcmV0dXJuOworCQl9CisJCWNtZC0+Y29tbWFuZCA9IENtZE11bHRpY2FzdExpc3Q7CisJCSooKHVuc2lnbmVkIHNob3J0ICopIChjbWQgKyAxKSkgPSBkZXYtPm1jX2NvdW50ICogNjsKKwkJY3AgPSAoKGNoYXIgKikoY21kICsgMSkpKzI7CisJCWZvciAoZG1pID0gZGV2LT5tY19saXN0OyBkbWkgIT0gTlVMTDsgZG1pID0gZG1pLT5uZXh0KSB7CisJCQltZW1jcHkoY3AsIGRtaSw2KTsKKwkJCWNwICs9IDY7CisJCX0KKwkJaWYgKGk1OTZfZGVidWcgJiBMT0dfU1JDRFNUKQorCQkJcHJpbnRfZXRoICgoKGNoYXIgKikoY21kICsgMSkpICsgMik7CisJCWk1OTZfYWRkX2NtZChkZXYsIGNtZCk7CisJfSBlbHNlIHsKKwkJaWYgKGxwLT5zZXRfY29uZi5wYV9uZXh0ICE9IEk1OTZfTlVMTCkgeworCQkJcmV0dXJuOworCQl9CisJCWlmIChkZXYtPm1jX2NvdW50ID09IDAgJiYgIShkZXYtPmZsYWdzICYgKElGRl9QUk9NSVNDIHwgSUZGX0FMTE1VTFRJKSkpIHsKKwkJCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQorCQkJCWRldi0+ZmxhZ3MgfD0gSUZGX1BST01JU0M7CisJCQlscC0+aTU5Nl9jb25maWdbOF0gJj0gfjB4MDE7CisJCX0gZWxzZSB7CisJCQlscC0+aTU5Nl9jb25maWdbOF0gfD0gMHgwMTsKKwkJfQorCisJCWk1OTZfYWRkX2NtZChkZXYsIChzdHJ1Y3QgaTU5Nl9jbWQgKikgJmxwLT5zZXRfY29uZik7CisJfQorfQorCitNT0RVTEVfQVVUSE9SKCJBcmQgdmFuIEJyZWVtZW4gPGFyZEBjc3RtZWwubmwuZXUub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCBQYW50aGVyIG9uYm9hcmQgaTgyNTk2IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9scDQ4NmU7CitzdGF0aWMgaW50IGZ1bGxfZHVwbGV4Oworc3RhdGljIGludCBvcHRpb25zOworc3RhdGljIGludCBpbyA9IElPQUREUjsKK3N0YXRpYyBpbnQgaXJxID0gSVJROworCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7CisvL21vZHVsZV9wYXJhbShtYXhfaW50ZXJydXB0X3dvcmssIGludCwgMCk7CisvL21vZHVsZV9wYXJhbShyZXZlcnNlX3Byb2JlLCBpbnQsIDApOworLy9tb2R1bGVfcGFyYW0ocnhfY29weWJyZWFrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG9wdGlvbnMsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZnVsbF9kdXBsZXgsIGludCwgMCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGxwNDg2ZV9pbml0X21vZHVsZSh2b2lkKSB7CisJaW50IGVycjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBpNTk2X3ByaXZhdGUpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXYtPmlycSA9IGlycTsKKwlkZXYtPmJhc2VfYWRkciA9IGlvOworCWVyciA9IGxwNDg2ZV9wcm9iZShkZXYpOworCWlmIChlcnIpIHsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTFA0ODZFX1RPVEFMX1NJWkUpOworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gZXJyOworCX0KKwlkZXZfbHA0ODZlID0gZGV2OworCWZ1bGxfZHVwbGV4ID0gMDsKKwlvcHRpb25zID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGxwNDg2ZV9jbGVhbnVwX21vZHVsZSh2b2lkKSB7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2X2xwNDg2ZSk7CisJcmVsZWFzZV9yZWdpb24oZGV2X2xwNDg2ZS0+YmFzZV9hZGRyLCBMUDQ4NkVfVE9UQUxfU0laRSk7CisJZnJlZV9uZXRkZXYoZGV2X2xwNDg2ZSk7Cit9CisKK21vZHVsZV9pbml0KGxwNDg2ZV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChscDQ4NmVfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjODM5MC5jIGIvZHJpdmVycy9uZXQvbWFjODM5MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNTc2MTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9tYWM4MzkwLmMKQEAgLTAsMCArMSw3NTcgQEAKKy8qIG1hYzgzOTAuYzogTmV3IGRyaXZlciBmb3IgODM5MC1iYXNlZCBOdWJ1cyAob3IgTnVidXMtYWxpa2UpCisgICBFdGhlcm5ldCBjYXJkcyBvbiBMaW51eCAqLworLyogQmFzZWQgb24gdGhlIGZvcm1lciBkYXluYXBvcnQuYyBkcml2ZXIsIGJ5IEFsYW4gQ294LiAgU29tZSBjb2RlCisgICB0YWtlbiBmcm9tIG9yIGluc3BpcmVkIGJ5IHNrZWxldG9uLmMgYnkgRG9uYWxkIEJlY2tlciwgYWNlbmljLmMgYnkKKyAgIEplcyBTb3JlbnNlbiwgYW5kIG5lMmstcGNpLmMgYnkgRG9uYWxkIEJlY2tlciBhbmQgUGF1bCBHb3J0bWFrZXIuCisKKyAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKyAgIHRoZSBHTlUgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLiAgKi8KKworLyogMjAwMC0wMi0yODogc3VwcG9ydCBhZGRlZCBmb3IgRGF5bmEgYW5kIEtpbmV0aWNzIGNhcmRzIGJ5IAorICAgQS5HLmRlV2lqbkBwaHlzLnV1Lm5sICovCisvKiAyMDAwLTA0LTA0OiBzdXBwb3J0IGFkZGVkIGZvciBEYXluYTIgYnkgYmFydEBldHBtb2QucGh5cy50dWUubmwgKi8KKy8qIDIwMDEtMDQtMTg6IHN1cHBvcnQgZm9yIERheW5hUG9ydCBFL0xDLU0gYnkgcmF5a0BrbmlnaHRzbWFub3Iub3JnICovCisvKiAyMDAxLTA1LTE1OiBzdXBwb3J0IGZvciBDYWJsZXRyb24gcG9ydGVkIGZyb20gb2xkIGRheW5hcG9ydCBkcml2ZXIKKyAqIGFuZCBmaXhlZCBhY2Nlc3MgdG8gU29uaWMgU3lzIGNhcmQgd2hpY2ggbWFzcXVlcmFkZXMgYXMgYSBGYXJhbGxvbiAKKyAqIGJ5IHJheWtAa25pZ2h0c21hbm9yLm9yZyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9udWJ1cy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9od3Rlc3QuaD4KKyNpbmNsdWRlIDxhc20vbWFjaW50cy5oPgorCisjaW5jbHVkZSAiODM5MC5oIgorCisjZGVmaW5lIFdEX1NUQVJUX1BHCQkJMHgwMAkvKiBGaXJzdCBwYWdlIG9mIFRYIGJ1ZmZlciAqLworI2RlZmluZSBDQUJMRVRST05fUlhfU1RBUlRfUEcJCTB4MDAgICAgLyogRmlyc3QgcGFnZSBvZiBSWCBidWZmZXIgKi8KKyNkZWZpbmUgQ0FCTEVUUk9OX1JYX1NUT1BfUEcJCTB4MzAgICAgLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcgKi8KKyNkZWZpbmUgQ0FCTEVUUk9OX1RYX1NUQVJUX1BHCQlDQUJMRVRST05fUlhfU1RPUF9QRyAgLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKworLyogVW5mb3J0dW5hdGVseSBpdCBzZWVtcyB3ZSBoYXZlIHRvIGhhcmRjb2RlIHRoZXNlIGZvciB0aGUgbW9tZW50ICovCisvKiBTaG91bGRuJ3QgdGhlIGNhcmQga25vdyBhYm91dCB0aGlzPyBEb2VzIGFueW9uZSBrbm93IHdoZXJlIHRvIHJlYWQgaXQgb2ZmIHRoZSBjYXJkPyBEbyB3ZSB0cnVzdCB0aGUgZGF0YSBwcm92aWRlZCBieSB0aGUgY2FyZD8gKi8KKworI2RlZmluZSBEQVlOQV84MzkwX0JBU0UJCTB4ODAwMDAKKyNkZWZpbmUgREFZTkFfODM5MF9NRU0JCTB4MDAwMDAKKworI2RlZmluZSBLSU5FVElDU184MzkwX0JBU0UJMHg4MDAwMAorI2RlZmluZSBLSU5FVElDU184MzkwX01FTQkweDAwMDAwCisKKyNkZWZpbmUgQ0FCTEVUUk9OXzgzOTBfQkFTRQkweDkwMDAwCQorI2RlZmluZSBDQUJMRVRST05fODM5MF9NRU0JMHgwMDAwMAorCitlbnVtIG1hYzgzOTBfdHlwZSB7CisJTUFDODM5MF9OT05FID0gLTEsCisJTUFDODM5MF9BUFBMRSwKKwlNQUM4MzkwX0FTQU5URSwKKwlNQUM4MzkwX0ZBUkFMTE9OLCAgLyogQXBwbGUsIEFzYW50ZSwgYW5kIEZhcmFsbG9uIGFyZSBhbGwgY29tcGF0aWJsZSAqLworCU1BQzgzOTBfQ0FCTEVUUk9OLAorCU1BQzgzOTBfREFZTkEsCisJTUFDODM5MF9JTlRFUkxBTiwKKwlNQUM4MzkwX0tJTkVUSUNTLAorCU1BQzgzOTBfRk9DVVMsCisJTUFDODM5MF9TT05JQ1NZUywKKwlNQUM4MzkwX0RBWU5BMiwKKwlNQUM4MzkwX0RBWU5BMywKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY2FyZG5hbWVbXSA9IHsKKwkiYXBwbGUiLAorCSJhc2FudGUiLAorCSJmYXJhbGxvbiIsCisJImNhYmxldHJvbiIsCisJImRheW5hIiwKKwkiaW50ZXJsYW4iLAorCSJraW5ldGljcyIsCisJImZvY3VzIiwKKwkic29uaWMgc3lzdGVtcyIsCisJImRheW5hMiIsCisJImRheW5hX2xjIiwKK307CisKK3N0YXRpYyBpbnQgd29yZDE2W10gPSB7CisJMSwgLyogYXBwbGUgKi8KKwkxLCAvKiBhc2FudGUgKi8KKwkxLCAvKiBmYXJhbGxvbiAqLworCTEsIC8qIGNhYmxldHJvbiAqLworCTAsIC8qIGRheW5hICovCisJMSwgLyogaW50ZXJsYW4gKi8KKwkwLCAvKiBraW5ldGljcyAqLworCTEsIC8qIGZvY3VzICg/PykgKi8KKwkxLCAvKiBzb25pYyBzeXN0ZW1zICAqLworCTEsIC8qIGRheW5hMiAqLworCTEsIC8qIGRheW5hLWxjICovCit9OworCisvKiBvbiB3aGljaCBjYXJkcyBkbyB3ZSB1c2UgTnVCdXMgcmVzb3VyY2VzPyAqLworc3RhdGljIGludCB1c2VyZXNvdXJjZXNbXSA9IHsKKwkxLCAvKiBhcHBsZSAqLworCTEsIC8qIGFzYW50ZSAqLworCTEsIC8qIGZhcmFsbG9uICovCisJMCwgLyogY2FibGV0cm9uICovCisJMCwgLyogZGF5bmEgKi8KKwkwLCAvKiBpbnRlcmxhbiAqLworCTAsIC8qIGtpbmV0aWNzICovCisJMCwgLyogZm9jdXMgKD8/KSAqLworCTEsIC8qIHNvbmljIHN5c3RlbXMgKi8KKwkxLCAvKiBkYXluYTIgKi8KKwkxLCAvKiBkYXluYS1sYyAqLworfTsKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPQorCSJtYWM4MzkwLmM6IHYwLjQgMjAwMS0wNS0xNSBEYXZpZCBIdWdnaW5zLURhaW5lcyA8ZGhkQGRlYmlhbi5vcmc+IGFuZCBvdGhlcnNcbiI7CisJCQorZXh0ZXJuIGVudW0gbWFjODM5MF90eXBlIG1hYzgzOTBfaWRlbnQoc3RydWN0IG51YnVzX2RldiAqIGRldik7CitleHRlcm4gaW50IG1hYzgzOTBfbWVtc2l6ZSh1bnNpZ25lZCBsb25nIG1lbWJhc2UpOworZXh0ZXJuIGludCBtYWM4MzkwX21lbXRlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpOworc3RhdGljIGludCBtYWM4MzkwX2luaXRkZXYoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIHN0cnVjdCBudWJ1c19kZXYgKiBuZGV2LAorCQkJICAgZW51bSBtYWM4MzkwX3R5cGUgdHlwZSk7CisKK3N0YXRpYyBpbnQgbWFjODM5MF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KTsKK3N0YXRpYyBpbnQgbWFjODM5MF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldik7CitzdGF0aWMgdm9pZCBtYWM4MzkwX25vX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBTYW5lICgzMi1iaXQgY2h1bmsgbWVtb3J5IHJlYWQvd3JpdGUpIC0gQXBwbGUvQXNhbnRlL0ZhcmFsbG9uIGRvIHRoaXMqLworc3RhdGljIHZvaWQgc2FuZV9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsIGludCByaW5nX3BhZ2UpOworc3RhdGljIHZvaWQgc2FuZV9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgaW50IGNvdW50LAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqIHNrYiwgaW50IHJpbmdfb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIHNhbmVfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCBpbnQgY291bnQsCisJCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmLCBjb25zdCBpbnQgc3RhcnRfcGFnZSk7CisKKy8qIGRheW5hX21lbWNweSB0byBhbmQgZnJvbSBjYXJkICovCitzdGF0aWMgdm9pZCBkYXluYV9tZW1jcHlfZnJvbWNhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqdG8sCisJCQkJaW50IGZyb20sIGludCBjb3VudCk7CitzdGF0aWMgdm9pZCBkYXluYV9tZW1jcHlfdG9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB0bywKKwkJCSAgICAgIGNvbnN0IHZvaWQgKmZyb20sIGludCBjb3VudCk7CisKKy8qIERheW5hIC0gRGF5bmEvS2luZXRpY3MgdXNlIHRoaXMgKi8KK3N0YXRpYyB2b2lkIGRheW5hX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsIGludCByaW5nX3BhZ2UpOworc3RhdGljIHZvaWQgZGF5bmFfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIGRheW5hX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RhcnRfcGFnZSk7CisKKyNkZWZpbmUgbWVtY3B5X2Zyb21pbyhhLGIsYykJbWVtY3B5KChhKSwodm9pZCAqKShiKSwoYykpCisjZGVmaW5lIG1lbWNweV90b2lvKGEsYixjKQltZW1jcHkoKHZvaWQgKikoYSksKGIpLChjKSkKKworLyogU2xvdyBTYW5lICgxNi1iaXQgY2h1bmsgbWVtb3J5IHJlYWQvd3JpdGUpIENhYmxldHJvbiB1c2VzIHRoaXMgKi8KK3N0YXRpYyB2b2lkIHNsb3dfc2FuZV9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKTsKK3N0YXRpYyB2b2lkIHNsb3dfc2FuZV9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQgc2xvd19zYW5lX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RhcnRfcGFnZSk7CitzdGF0aWMgdm9pZCB3b3JkX21lbWNweV90b2NhcmQodm9pZCAqdHAsIGNvbnN0IHZvaWQgKmZwLCBpbnQgY291bnQpOworc3RhdGljIHZvaWQgd29yZF9tZW1jcHlfZnJvbWNhcmQodm9pZCAqdHAsIGNvbnN0IHZvaWQgKmZwLCBpbnQgY291bnQpOworCitlbnVtIG1hYzgzOTBfdHlwZSBfX2luaXQgbWFjODM5MF9pZGVudChzdHJ1Y3QgbnVidXNfZGV2ICogZGV2KQoreworCWlmIChkZXYtPmRyX3N3ID09IE5VQlVTX0RSU1dfQVNBTlRFKQorCQlyZXR1cm4gTUFDODM5MF9BU0FOVEU7CisJaWYgKGRldi0+ZHJfc3cgPT0gTlVCVVNfRFJTV19GQVJBTExPTikgCisJCXJldHVybiBNQUM4MzkwX0ZBUkFMTE9OOworCWlmIChkZXYtPmRyX3N3ID09IE5VQlVTX0RSU1dfS0lORVRJQ1MpCisJCXJldHVybiBNQUM4MzkwX0tJTkVUSUNTOworCWlmIChkZXYtPmRyX3N3ID09IE5VQlVTX0RSU1dfREFZTkEpCisJCXJldHVybiBNQUM4MzkwX0RBWU5BOworCWlmIChkZXYtPmRyX3N3ID09IE5VQlVTX0RSU1dfREFZTkEyKQorCQlyZXR1cm4gTUFDODM5MF9EQVlOQTI7CisJaWYgKGRldi0+ZHJfc3cgPT0gTlVCVVNfRFJTV19EQVlOQV9MQykKKwkJcmV0dXJuIE1BQzgzOTBfREFZTkEzOworCWlmIChkZXYtPmRyX2h3ID09IE5VQlVTX0RSSFdfQ0FCTEVUUk9OKQorCQlyZXR1cm4gTUFDODM5MF9DQUJMRVRST047CisJcmV0dXJuIE1BQzgzOTBfTk9ORTsKK30KKworaW50IF9faW5pdCBtYWM4MzkwX21lbXNpemUodW5zaWduZWQgbG9uZyBtZW1iYXNlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGksIGo7CisJCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCS8qIENoZWNrIHVwIHRvIDMySyBpbiA0SyBpbmNyZW1lbnRzICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqbSA9ICh1bnNpZ25lZCBzaG9ydCAqKSAobWVtYmFzZSArIChpICogMHgxMDAwKSk7CisKKwkJLyogVW53cml0ZWFibGUgLSB3ZSBoYXZlIGEgZnVsbHkgZGVjb2RlZCBjYXJkIGFuZCB0aGUKKwkJICAgUkFNIGVuZCBsb2NhdGVkICovCisJCWlmIChod3JlZ19wcmVzZW50KG0pID09IDApCisJCQlicmVhazsKKwkJCisJCS8qIHdyaXRlIGEgZGlzdGluY3RpdmUgYnl0ZSAqLworCQkqbSA9IDB4QTVBMCB8IGk7CisJCS8qIGNoZWNrIHRoYXQgd2UgcmVhZCBiYWNrIHdoYXQgd2Ugd3JvdGUgKi8KKwkJaWYgKCptICE9ICgweEE1QTAgfCBpKSkKKwkJCWJyZWFrOworCisJCS8qIGNoZWNrIGZvciBwYXJ0aWFsIGRlY29kZSBhbmQgd3JhcCAqLworCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisJCQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqcCA9ICh1bnNpZ25lZCBzaG9ydCAqKSAobWVtYmFzZSArIChqICogMHgxMDAwKSk7CisJCQlpZiAoKnAgIT0gKDB4QTVBMCB8IGopKQorCQkJCWJyZWFrOworIAkJfQorIAl9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCS8qIGluIGFueSBjYXNlLCB3ZSBzdG9wcGVkIG9uY2Ugd2UgdHJpZWQgb25lIGJsb2NrIHRvbyBtYW55LAorICAgICAgICAgICBvciBvbmNlIHdlIHJlYWNoZWQgMzJLICovCisgCXJldHVybiBpICogMHgxMDAwOworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBtYWM4MzkwX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKmk7CisJaW50IHZlcnNpb25fZGlzcCA9IDA7CisJc3RydWN0IG51YnVzX2RldiAqIG5kZXYgPSBOVUxMOworCWludCBlcnIgPSAtRU5PREVWOworCQorCXN0cnVjdCBudWJ1c19kaXIgZGlyOworCXN0cnVjdCBudWJ1c19kaXJlbnQgZW50OworCWludCBvZmZzZXQ7CisJc3RhdGljIHVuc2lnbmVkIGludCBzbG90czsKKworCWVudW0gbWFjODM5MF90eXBlIGNhcmR0eXBlOworCisJLyogcHJvYmFibHkgc2hvdWxkIGNoZWNrIGZvciBOdWJ1cyBpbnN0ZWFkICovCisKKwlpZiAoIU1BQ0hfSVNfTUFDKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCWRldiA9IGFsbG9jX2VpX25ldGRldigpOworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmICh1bml0ID49IDApCisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKworIAlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwl3aGlsZSAoKG5kZXYgPSBudWJ1c19maW5kX3R5cGUoTlVCVVNfQ0FUX05FVFdPUkssIE5VQlVTX1RZUEVfRVRIRVJORVQsIG5kZXYpKSkgeworCQkvKiBIYXZlIHdlIHNlZW4gaXQgYWxyZWFkeT8gKi8KKwkJaWYgKHNsb3RzICYgKDE8PG5kZXYtPmJvYXJkLT5zbG90KSkKKwkJCWNvbnRpbnVlOworCQlzbG90cyB8PSAxPDxuZGV2LT5ib2FyZC0+c2xvdDsKKworCQlpZiAoKGNhcmR0eXBlID0gbWFjODM5MF9pZGVudChuZGV2KSkgPT0gTUFDODM5MF9OT05FKQorCQkJY29udGludWU7CisKKwkJaWYgKHZlcnNpb25fZGlzcCA9PSAwKSB7CisJCQl2ZXJzaW9uX2Rpc3AgPSAxOworCQkJcHJpbnRrKHZlcnNpb24pOworCQl9CisKKwkJZGV2LT5pcnEgPSBTTE9UMklSUShuZGV2LT5ib2FyZC0+c2xvdCk7CisJCS8qIFRoaXMgaXMgZ2V0dGluZyB0byBiZSBhIGhhYml0ICovCisJCWRldi0+YmFzZV9hZGRyID0gbmRldi0+Ym9hcmQtPnNsb3RfYWRkciB8ICgobmRldi0+Ym9hcmQtPnNsb3QmMHhmKSA8PCAyMCk7CisKKwkJLyogR2V0IHNvbWUgTnVidXMgaW5mbyAtIHdlIHdpbGwgdHJ1c3QgdGhlIGNhcmQncyBpZGVhCisJCSAgIG9mIHdoZXJlIGl0cyBtZW1vcnkgYW5kIHJlZ2lzdGVycyBhcmUuICovCisKKwkJaWYgKG51YnVzX2dldF9mdW5jX2RpcihuZGV2LCAmZGlyKSA9PSAtMSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGdldCBOdWJ1cyBmdW5jdGlvbmFsIgorCQkJCQkiIGRpcmVjdG9yeSBmb3Igc2xvdCAlWCFcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBuZGV2LT5ib2FyZC0+c2xvdCk7CisJCQljb250aW51ZTsKKwkJfQorCQkKKwkJLyogR2V0IHRoZSBNQUMgYWRkcmVzcyAqLworCQlpZiAoKG51YnVzX2ZpbmRfcnNyYygmZGlyLCBOVUJVU19SRVNJRF9NQUNfQUREUkVTUywgJmVudCkpID09IC0xKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ291bGRuJ3QgZ2V0IE1BQyBhZGRyZXNzIVxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJbnVidXNfZ2V0X3JzcmNfbWVtKGRldi0+ZGV2X2FkZHIsICZlbnQsIDYpOworCQkJLyogU29tZSBTb25pYyBTeXMgY2FyZHMgbWFzcXVlcmFkZSBhcyBGYXJhbGxvbiAqLworCQkJaWYgKGNhcmR0eXBlID09IE1BQzgzOTBfRkFSQUxMT04gJiYgCisJCQkJCWRldi0+ZGV2X2FkZHJbMF0gPT0gMHgwICYmCisJCQkJCWRldi0+ZGV2X2FkZHJbMV0gPT0gMHg0MCAmJgorCQkJCQlkZXYtPmRldl9hZGRyWzJdID09IDB4MTApIHsKKwkJCQkvKiBUaGlzIGlzIHJlYWxseSBTb25pYyBTeXMgY2FyZCAqLworCQkJCWNhcmR0eXBlID0gTUFDODM5MF9TT05JQ1NZUzsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKHVzZXJlc291cmNlc1tjYXJkdHlwZV0gPT0gMSkgeworCQkJbnVidXNfcmV3aW5kZGlyKCZkaXIpOworCQkJaWYgKG51YnVzX2ZpbmRfcnNyYygmZGlyLCBOVUJVU19SRVNJRF9NSU5PUl9CQVNFT1MsICZlbnQpID09IC0xKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogTWVtb3J5IG9mZnNldCByZXNvdXJjZSIKKwkJCQkJCSIgZm9yIHNsb3QgJVggbm90IGZvdW5kIVxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBuZGV2LT5ib2FyZC0+c2xvdCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQludWJ1c19nZXRfcnNyY19tZW0oJm9mZnNldCwgJmVudCwgNCk7CisJCQlkZXYtPm1lbV9zdGFydCA9IGRldi0+YmFzZV9hZGRyICsgb2Zmc2V0OworCQkJLyogeWVzLCB0aGlzIGlzIGhvdyB0aGUgQXBwbGUgZHJpdmVyIGRvZXMgaXQgKi8KKwkJCWRldi0+YmFzZV9hZGRyID0gZGV2LT5tZW1fc3RhcnQgKyAweDEwMDAwOworCQkJbnVidXNfcmV3aW5kZGlyKCZkaXIpOworCQkJaWYgKG51YnVzX2ZpbmRfcnNyYygmZGlyLCBOVUJVU19SRVNJRF9NSU5PUl9MRU5HVEgsICZlbnQpID09IC0xKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1lbW9yeSBsZW5ndGggcmVzb3VyY2UiCisJCQkJCQkgIiBmb3Igc2xvdCAlWCBub3QgZm91bmQiCisJCQkJCQkgIiwgcHJvYmluZ1xuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBuZGV2LT5ib2FyZC0+c2xvdCk7CisJCQkJb2Zmc2V0ID0gbWFjODM5MF9tZW1zaXplKGRldi0+bWVtX3N0YXJ0KTsKKwkJCQl9IGVsc2UgeworCQkJCQludWJ1c19nZXRfcnNyY19tZW0oJm9mZnNldCwgJmVudCwgNCk7CisJCQkJfQorCQkJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyBvZmZzZXQ7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKGNhcmR0eXBlKSB7CisJCQkJY2FzZSBNQUM4MzkwX0tJTkVUSUNTOgorCQkJCWNhc2UgTUFDODM5MF9EQVlOQTogLyogaXQncyB0aGUgc2FtZSAqLworCQkJCQlkZXYtPmJhc2VfYWRkciA9IAorCQkJCQkJKGludCkobmRldi0+Ym9hcmQtPnNsb3RfYWRkciArCisJCQkJCQlEQVlOQV84MzkwX0JBU0UpOworCQkJCQlkZXYtPm1lbV9zdGFydCA9IAorCQkJCQkJKGludCkobmRldi0+Ym9hcmQtPnNsb3RfYWRkciArCisJCQkJCQlEQVlOQV84MzkwX01FTSk7CisJCQkJCWRldi0+bWVtX2VuZCA9CisJCQkJCQlkZXYtPm1lbV9zdGFydCArCisJCQkJCQltYWM4MzkwX21lbXNpemUoZGV2LT5tZW1fc3RhcnQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIE1BQzgzOTBfQ0FCTEVUUk9OOgorCQkJCQlkZXYtPmJhc2VfYWRkciA9CisJCQkJCQkoaW50KShuZGV2LT5ib2FyZC0+c2xvdF9hZGRyICsKKwkJCQkJCUNBQkxFVFJPTl84MzkwX0JBU0UpOworCQkJCQlkZXYtPm1lbV9zdGFydCA9CisJCQkJCQkoaW50KShuZGV2LT5ib2FyZC0+c2xvdF9hZGRyICsKKwkJCQkJCUNBQkxFVFJPTl84MzkwX01FTSk7CisJCQkJCS8qIFRoZSBiYXNlIGFkZHJlc3MgaXMgdW5yZWFkYWJsZSBpZiAweDAwCisJCQkJCSAqIGhhcyBiZWVuIHdyaXR0ZW4gdG8gdGhlIGNvbW1hbmQgcmVnaXN0ZXIKKwkJCQkJICogUmVzZXQgdGhlIGNoaXAgYnkgd3JpdGluZyBFODM5MF9OT0RNQSArCisJCQkJCSAqICAgRTgzOTBfUEFHRTAgKyBFODM5MF9TVE9QIGp1c3QgdG8gYmUKKwkJCQkJICogICBzdXJlCisJCQkJCSAqLworCQkJCQlpID0gKHZvaWQgKilkZXYtPmJhc2VfYWRkcjsKKwkJCQkJKmkgPSAweDIxOworCQkJCQlkZXYtPm1lbV9lbmQgPSAKKwkJCQkJCWRldi0+bWVtX3N0YXJ0ICsKKwkJCQkJCW1hYzgzOTBfbWVtc2l6ZShkZXYtPm1lbV9zdGFydCk7CisJCQkJCWJyZWFrOworCQkJCQkKKwkJCQlkZWZhdWx0OgorCQkJCQlwcmludGsoS0VSTl9FUlIgIkNhcmQgdHlwZSAlcyBpcyIKKwkJCQkJCQkiIHVuc3VwcG9ydGVkLCBzb3JyeVxuIiwKKwkJCQkJICAgICAgIGNhcmRuYW1lW2NhcmR0eXBlXSk7CisJCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJLyogRG8gdGhlIG5hc3R5IDgzOTAgc3R1ZmYgKi8KKwkJaWYgKCFtYWM4MzkwX2luaXRkZXYoZGV2LCBuZGV2LCBjYXJkdHlwZSkpCisJCQlicmVhazsKKwl9CisKKwlpZiAoIW5kZXYpCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCXJldHVybiBkZXY7CisKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKyNpZmRlZiBNT0RVTEUKK01PRFVMRV9BVVRIT1IoIkRhdmlkIEh1Z2dpbnMtRGFpbmVzIDxkaGRAZGViaWFuLm9yZz4gYW5kIG90aGVycyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNYWNpbnRvc2ggTlM4MzkwLWJhc2VkIE51YnVzIEV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBvdmVya2lsbCwgb2YgY291cnNlICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9tYWM4MzkwWzE1XTsKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBtYWM4MzkwX3Byb2JlKC0xKTsKKwkJaWYgKElTX0VSUihkZXYpKQorCQkJYnJlYWs7CisJCWRldl9tYWM4OTBbaV0gPSBkZXY7CisJfQorCWlmICghaSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIm1hYzgzOTAuYzogTm8gdXNlYWJsZSBjYXJkcyBmb3VuZCwgZHJpdmVyIE5PVCBpbnN0YWxsZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDE1OyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9tYWM4OTBbaV07CisJCWlmIChkZXYpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQlmcmVlX25ldGRldihkZXYpOworCQl9CisJfQorfQorCisjZW5kaWYgLyogTU9EVUxFICovCisKK3N0YXRpYyBpbnQgX19pbml0IG1hYzgzOTBfaW5pdGRldihzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgc3RydWN0IG51YnVzX2RldiAqIG5kZXYsCisJCQkgICAgZW51bSBtYWM4MzkwX3R5cGUgdHlwZSkKK3sKKwlzdGF0aWMgdTMyIGZ3cmQ0X29mZnNldHNbMTZdPXsKKwkJMCwgICAgICA0LCAgICAgIDgsICAgICAgMTIsCisJCTE2LCAgICAgMjAsICAgICAyNCwgICAgIDI4LAorCQkzMiwgICAgIDM2LCAgICAgNDAsICAgICA0NCwKKwkJNDgsICAgICA1MiwgICAgIDU2LCAgICAgNjAKKwl9OworCXN0YXRpYyB1MzIgYmFjazRfb2Zmc2V0c1sxNl09eworCQk2MCwgICAgIDU2LCAgICAgNTIsICAgICA0OCwKKwkJNDQsICAgICA0MCwgICAgIDM2LCAgICAgMzIsCisJCTI4LCAgICAgMjQsICAgICAyMCwgICAgIDE2LAorCQkxMiwgICAgIDgsICAgICAgNCwgICAgICAwCisJfTsKKwlzdGF0aWMgdTMyIGZ3cmQyX29mZnNldHNbMTZdPXsKKwkJMCwgICAgICAyLCAgICAgIDQsICAgICAgNiwKKwkJOCwgICAgIDEwLCAgICAgMTIsICAgICAxNCwKKwkJMTYsICAgIDE4LCAgICAgMjAsICAgICAyMiwKKwkJMjQsICAgIDI2LCAgICAgMjgsICAgICAzMAorCX07CisKKwlpbnQgYWNjZXNzX2JpdG1vZGU7CisJCisJLyogTm93IGZpbGwgaW4gb3VyIHN0dWZmICovCisJZGV2LT5vcGVuID0gJm1hYzgzOTBfb3BlbjsKKwlkZXYtPnN0b3AgPSAmbWFjODM5MF9jbG9zZTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKKyNlbmRpZgorCisJLyogR0FSLCBlaV9zdGF0dXMgaXMgYWN0dWFsbHkgYSBtYWNybyBldmVuIHRob3VnaCBpdCBsb29rcyBnbG9iYWwgKi8KKwllaV9zdGF0dXMubmFtZSA9IGNhcmRuYW1lW3R5cGVdOworCWVpX3N0YXR1cy53b3JkMTYgPSB3b3JkMTZbdHlwZV07CisKKwkvKiBDYWJsZXRyb24ncyBUWC9SWCBidWZmZXJzIGFyZSBiYWNrd2FyZHMgKi8KKwlpZiAodHlwZSA9PSBNQUM4MzkwX0NBQkxFVFJPTikgeworICAgICAgICAgICAgICAgZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBDQUJMRVRST05fVFhfU1RBUlRfUEc7CisgICAgICAgICAgICAgICBlaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IENBQkxFVFJPTl9SWF9TVEFSVF9QRzsKKyAgICAgICAgICAgICAgIGVpX3N0YXR1cy5zdG9wX3BhZ2UgPSBDQUJMRVRST05fUlhfU1RPUF9QRzsKKyAgICAgICAgICAgICAgIGVpX3N0YXR1cy5ybWVtX3N0YXJ0ID0gZGV2LT5tZW1fc3RhcnQ7CisgICAgICAgICAgICAgICBlaV9zdGF0dXMucm1lbV9lbmQgPSBkZXYtPm1lbV9zdGFydCArIENBQkxFVFJPTl9SWF9TVE9QX1BHKjI1NjsKKwl9IGVsc2UgeworICAgICAgICAgICAgICAgZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBXRF9TVEFSVF9QRzsKKyAgICAgICAgICAgICAgIGVpX3N0YXR1cy5yeF9zdGFydF9wYWdlID0gV0RfU1RBUlRfUEcgKyBUWF9QQUdFUzsKKyAgICAgICAgICAgICAgIGVpX3N0YXR1cy5zdG9wX3BhZ2UgPSAoZGV2LT5tZW1fZW5kIC0gZGV2LT5tZW1fc3RhcnQpLzI1NjsKKyAgICAgICAgICAgICAgIGVpX3N0YXR1cy5ybWVtX3N0YXJ0ID0gZGV2LT5tZW1fc3RhcnQgKyBUWF9QQUdFUyoyNTY7CisgICAgICAgICAgICAgICBlaV9zdGF0dXMucm1lbV9lbmQgPSBkZXYtPm1lbV9lbmQ7CisJfQorCQorCS8qIEZpbGwgaW4gbW9kZWwtc3BlY2lmaWMgaW5mb3JtYXRpb24gYW5kIGZ1bmN0aW9ucyAqLworCXN3aXRjaCh0eXBlKSB7CisJY2FzZSBNQUM4MzkwX1NPTklDU1lTOgorCQkvKiAxNiBiaXQgY2FyZCwgcmVnaXN0ZXIgbWFwIGlzIHJldmVyc2VkICovCisJCWVpX3N0YXR1cy5yZXNldF84MzkwID0gJm1hYzgzOTBfbm9fcmVzZXQ7CisJCWVpX3N0YXR1cy5ibG9ja19pbnB1dCA9ICZzbG93X3NhbmVfYmxvY2tfaW5wdXQ7CisJCWVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmc2xvd19zYW5lX2Jsb2NrX291dHB1dDsKKwkJZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZzbG93X3NhbmVfZ2V0XzgzOTBfaGRyOworCQllaV9zdGF0dXMucmVnX29mZnNldCA9IGJhY2s0X29mZnNldHM7CisJCWFjY2Vzc19iaXRtb2RlID0gMDsKKwkJYnJlYWs7CisJY2FzZSBNQUM4MzkwX0ZBUkFMTE9OOgorCWNhc2UgTUFDODM5MF9BUFBMRToKKwljYXNlIE1BQzgzOTBfQVNBTlRFOgorCWNhc2UgTUFDODM5MF9EQVlOQTI6CisJY2FzZSBNQUM4MzkwX0RBWU5BMzoKKwkJLyogMzIgYml0IGNhcmQsIHJlZ2lzdGVyIG1hcCBpcyByZXZlcnNlZCAqLworCQkvKiBzYW5lICovCisJCWVpX3N0YXR1cy5yZXNldF84MzkwID0gJm1hYzgzOTBfbm9fcmVzZXQ7CisJCWVpX3N0YXR1cy5ibG9ja19pbnB1dCA9ICZzYW5lX2Jsb2NrX2lucHV0OworCQllaV9zdGF0dXMuYmxvY2tfb3V0cHV0ID0gJnNhbmVfYmxvY2tfb3V0cHV0OworCQllaV9zdGF0dXMuZ2V0XzgzOTBfaGRyID0gJnNhbmVfZ2V0XzgzOTBfaGRyOworCQllaV9zdGF0dXMucmVnX29mZnNldCA9IGJhY2s0X29mZnNldHM7CisJCWFjY2Vzc19iaXRtb2RlID0gMTsKKwkJYnJlYWs7CisJY2FzZSBNQUM4MzkwX0NBQkxFVFJPTjoKKwkJLyogMTYgYml0IGNhcmQsIHJlZ2lzdGVyIG1hcCBpcyBzaG9ydCBmb3J3YXJkICovCisJCWVpX3N0YXR1cy5yZXNldF84MzkwID0gJm1hYzgzOTBfbm9fcmVzZXQ7CisJCWVpX3N0YXR1cy5ibG9ja19pbnB1dCA9ICZzbG93X3NhbmVfYmxvY2tfaW5wdXQ7CisJCWVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmc2xvd19zYW5lX2Jsb2NrX291dHB1dDsKKwkJZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZzbG93X3NhbmVfZ2V0XzgzOTBfaGRyOworCQllaV9zdGF0dXMucmVnX29mZnNldCA9IGZ3cmQyX29mZnNldHM7CisJCWFjY2Vzc19iaXRtb2RlID0gMDsKKwkJYnJlYWs7CisJY2FzZSBNQUM4MzkwX0RBWU5BOgorCWNhc2UgTUFDODM5MF9LSU5FVElDUzoKKwkJLyogMTYgYml0IG1lbW9yeSAqLworCQkvKiBkYXluYSBhbmQgc2ltaWxhciAqLworCQllaV9zdGF0dXMucmVzZXRfODM5MCA9ICZtYWM4MzkwX25vX3Jlc2V0OworCQllaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmZGF5bmFfYmxvY2tfaW5wdXQ7CisJCWVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmZGF5bmFfYmxvY2tfb3V0cHV0OworCQllaV9zdGF0dXMuZ2V0XzgzOTBfaGRyID0gJmRheW5hX2dldF84MzkwX2hkcjsKKwkJZWlfc3RhdHVzLnJlZ19vZmZzZXQgPSBmd3JkNF9vZmZzZXRzOworCQlhY2Nlc3NfYml0bW9kZSA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiQ2FyZCB0eXBlICVzIGlzIHVuc3VwcG9ydGVkLCBzb3JyeVxuIiwgY2FyZG5hbWVbdHlwZV0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJCQorCU5TODM5MF9pbml0KGRldiwgMCk7CisKKwkvKiBHb29kLCBkb25lLCBub3cgc3BpdCBvdXQgc29tZSBtZXNzYWdlcyAqLworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBpbiBzbG90ICVYICh0eXBlICVzKVxuIiwKKwkJICAgZGV2LT5uYW1lLCBuZGV2LT5ib2FyZC0+bmFtZSwgbmRldi0+Ym9hcmQtPnNsb3QsIGNhcmRuYW1lW3R5cGVdKTsKKwlwcmludGsoS0VSTl9JTkZPICJNQUMgIik7CisJeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQkJcHJpbnRrKCIlMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0pOworCQkJaWYgKGkgPCA1KQorCQkJCXByaW50aygiOiIpOworCQl9CisJfQorCXByaW50aygiIElSUSAlZCwgc2hhcmVkIG1lbW9yeSBhdCAlI2x4LSUjbHgsICAlZC1iaXQgYWNjZXNzLlxuIiwKKwkJICAgZGV2LT5pcnEsIGRldi0+bWVtX3N0YXJ0LCBkZXYtPm1lbV9lbmQtMSwgCisJCSAgIGFjY2Vzc19iaXRtb2RlPzMyOjE2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWM4MzkwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllaV9vcGVuKGRldik7CisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBlaV9pbnRlcnJ1cHQsIDAsICI4MzkwIEV0aGVybmV0IiwgZGV2KSkgeworCQlwcmludGsgKCIlczogdW5hYmxlIHRvIGdldCBJUlEgJWQuXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWM4MzkwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJZWlfY2xvc2UoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWFjODM5MF9ub19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWVpX3N0YXR1cy50eGluZyA9IDA7CisJaWYgKGVpX2RlYnVnID4gMSkKKwkJcHJpbnRrKCJyZXNldCBub3Qgc3VwcG9ydGVkXG4iKTsKKwlyZXR1cm47Cit9CisKKy8qIGRheW5hX21lbWNweV9mcm9taW8vZGF5bmFfbWVtY3B5X3RvaW8gKi8KKy8qIGRpcmVjdGx5IGZyb20gZGF5bmFwb3J0LmMgYnkgQWxhbiBDb3ggKi8KK3N0YXRpYyB2b2lkIGRheW5hX21lbWNweV9mcm9tY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICp0bywgaW50IGZyb20sIGludCBjb3VudCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqcHRyOworCXVuc2lnbmVkIHNob3J0ICp0YXJnZXQ9dG87CisJZnJvbTw8PTE7CS8qIHdvcmQsIHNraXAgb3ZlcmhlYWQgKi8KKwlwdHI9KHVuc2lnbmVkIHNob3J0ICopKGRldi0+bWVtX3N0YXJ0K2Zyb20pOworCS8qIExlYWRpbmcgYnl0ZT8gKi8KKwlpZiAoZnJvbSYyKSB7CisJCSooKGNoYXIgKil0YXJnZXQpKysgPSAqKCgoY2hhciAqKXB0cisrKS0xKTsKKwkJY291bnQtLTsKKwl9CisJd2hpbGUoY291bnQ+PTIpCisJeworCQkqdGFyZ2V0Kys9KnB0cisrOwkvKiBDb3B5IGFuZCAqLworCQlwdHIrKzsJCQkvKiBza2lwIGNydWZ0ICovCisJCWNvdW50LT0yOworCX0KKwkvKiBUcmFpbGluZyBieXRlPyAqLworCWlmKGNvdW50KQorCXsKKwkJLyogQmlnIGVuZGlhbiAqLworCQl1bnNpZ25lZCBzaG9ydCB2PSpwdHI7CisJCSooKGNoYXIgKil0YXJnZXQpPXY+Pjg7CisJfQorfQorCitzdGF0aWMgdm9pZCBkYXluYV9tZW1jcHlfdG9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB0bywgY29uc3Qgdm9pZCAqZnJvbSwgaW50IGNvdW50KQoreworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICpwdHI7CisJY29uc3QgdW5zaWduZWQgc2hvcnQgKnNyYz1mcm9tOworCXRvPDw9MTsJLyogd29yZCwgc2tpcCBvdmVyaGVhZCAqLworCXB0cj0odW5zaWduZWQgc2hvcnQgKikoZGV2LT5tZW1fc3RhcnQrdG8pOworCS8qIExlYWRpbmcgYnl0ZT8gKi8KKwlpZiAodG8mMikgeyAvKiBhdm9pZCBhIGJ5dGUgd3JpdGUgKHN0b21wcyBvbiBvdGhlciBkYXRhKSAqLworCQlwdHJbLTFdID0gKHB0clstMV0mMHhGRjAwKXwqKCh1bnNpZ25lZCBjaGFyICopc3JjKSsrOworCQlwdHIrKzsKKwkJY291bnQtLTsKKwl9CisJd2hpbGUoY291bnQ+PTIpCisJeworCQkqcHRyKys9KnNyYysrOwkJLyogQ29weSBhbmQgKi8KKwkJcHRyKys7CQkJLyogc2tpcCBjcnVmdCAqLworCQljb3VudC09MjsKKwl9CisJLyogVHJhaWxpbmcgYnl0ZT8gKi8KKwlpZihjb3VudCkKKwl7CisJCS8qIEJpZyBlbmRpYW4gKi8KKwkJdW5zaWduZWQgc2hvcnQgdj0qc3JjOworCQkvKiBjYXJkIGRvZXNuJ3QgbGlrZSBieXRlIHdyaXRlcyAqLworCQkqcHRyPSgqcHRyJjB4MDBGRil8KHYmMHhGRjAwKTsKKwl9Cit9CisKKy8qIHNhbmUgYmxvY2sgaW5wdXQvb3V0cHV0ICovCitzdGF0aWMgdm9pZCBzYW5lX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSkKK3sKKwl1bnNpZ25lZCBsb25nIGhkcl9zdGFydCA9IChyaW5nX3BhZ2UgLSBXRF9TVEFSVF9QRyk8PDg7CisJbWVtY3B5X2Zyb21pbygodm9pZCAqKWhkciwgKGNoYXIgKilkZXYtPm1lbV9zdGFydCArIGhkcl9zdGFydCwgNCk7CisJLyogRml4IGVuZGlhbm5lc3MgKi8KKwloZHItPmNvdW50ID0gc3dhYjE2KGhkci0+Y291bnQpOworfQorCitzdGF0aWMgdm9pZCBzYW5lX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KQoreworCXVuc2lnbmVkIGxvbmcgeGZlcl9iYXNlID0gcmluZ19vZmZzZXQgLSAoV0RfU1RBUlRfUEc8PDgpOworCXVuc2lnbmVkIGxvbmcgeGZlcl9zdGFydCA9IHhmZXJfYmFzZSArIGRldi0+bWVtX3N0YXJ0OworCisJaWYgKHhmZXJfc3RhcnQgKyBjb3VudCA+IGVpX3N0YXR1cy5ybWVtX2VuZCkgeworCQkvKiBXZSBtdXN0IHdyYXAgdGhlIGlucHV0IG1vdmUuICovCisJCWludCBzZW1pX2NvdW50ID0gZWlfc3RhdHVzLnJtZW1fZW5kIC0geGZlcl9zdGFydDsKKwkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEsIChjaGFyICopZGV2LT5tZW1fc3RhcnQgKyB4ZmVyX2Jhc2UsIHNlbWlfY291bnQpOworCQljb3VudCAtPSBzZW1pX2NvdW50OworCQltZW1jcHlfdG9pbyhza2ItPmRhdGEgKyBzZW1pX2NvdW50LCAoY2hhciAqKWVpX3N0YXR1cy5ybWVtX3N0YXJ0LCBjb3VudCk7CisJfSBlbHNlIHsKKwkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEsIChjaGFyICopZGV2LT5tZW1fc3RhcnQgKyB4ZmVyX2Jhc2UsIGNvdW50KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNhbmVfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHN0YXJ0X3BhZ2UpCit7CisJbG9uZyBzaG1lbSA9IChzdGFydF9wYWdlIC0gV0RfU1RBUlRfUEcpPDw4OworCQorCW1lbWNweV90b2lvKChjaGFyICopZGV2LT5tZW1fc3RhcnQgKyBzaG1lbSwgYnVmLCBjb3VudCk7Cit9CisKKy8qIGRheW5hIGJsb2NrIGlucHV0L291dHB1dCAqLworc3RhdGljIHZvaWQgZGF5bmFfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsIGludCByaW5nX3BhZ2UpCit7CisJdW5zaWduZWQgbG9uZyBoZHJfc3RhcnQgPSAocmluZ19wYWdlIC0gV0RfU1RBUlRfUEcpPDw4OworCisJZGF5bmFfbWVtY3B5X2Zyb21jYXJkKGRldiwgKHZvaWQgKiloZHIsIGhkcl9zdGFydCwgNCk7CisJLyogRml4IGVuZGlhbm5lc3MgKi8KKwloZHItPmNvdW50PShoZHItPmNvdW50JjB4RkYpPDw4fChoZHItPmNvdW50Pj44KTsKK30KKworc3RhdGljIHZvaWQgZGF5bmFfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpCit7CisJdW5zaWduZWQgbG9uZyB4ZmVyX2Jhc2UgPSByaW5nX29mZnNldCAtIChXRF9TVEFSVF9QRzw8OCk7CisJdW5zaWduZWQgbG9uZyB4ZmVyX3N0YXJ0ID0geGZlcl9iYXNlK2Rldi0+bWVtX3N0YXJ0OworCisJLyogTm90ZSB0aGUgb2Zmc2V0IG1hdGggaXMgZG9uZSBpbiBjYXJkIG1lbW9yeSBzcGFjZSB3aGljaCBpcyB3b3JkCisJICAgcGVyIGxvbmcgb250byBvdXIgc3BhY2UuICovCisKKwlpZiAoeGZlcl9zdGFydCArIGNvdW50ID4gZWlfc3RhdHVzLnJtZW1fZW5kKQorCXsKKwkJLyogV2UgbXVzdCB3cmFwIHRoZSBpbnB1dCBtb3ZlLiAqLworCQlpbnQgc2VtaV9jb3VudCA9IGVpX3N0YXR1cy5ybWVtX2VuZCAtIHhmZXJfc3RhcnQ7CisJCWRheW5hX21lbWNweV9mcm9tY2FyZChkZXYsIHNrYi0+ZGF0YSwgeGZlcl9iYXNlLCBzZW1pX2NvdW50KTsKKwkJY291bnQgLT0gc2VtaV9jb3VudDsKKwkJZGF5bmFfbWVtY3B5X2Zyb21jYXJkKGRldiwgc2tiLT5kYXRhICsgc2VtaV9jb3VudCwKKwkJCQkgICAgICBlaV9zdGF0dXMucm1lbV9zdGFydCAtIGRldi0+bWVtX3N0YXJ0LAorCQkJCSAgICAgIGNvdW50KTsKKwl9CisJZWxzZQorCXsKKwkJZGF5bmFfbWVtY3B5X2Zyb21jYXJkKGRldiwgc2tiLT5kYXRhLCB4ZmVyX2Jhc2UsIGNvdW50KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRheW5hX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCQlpbnQgc3RhcnRfcGFnZSkKK3sKKwlsb25nIHNobWVtID0gKHN0YXJ0X3BhZ2UgLSBXRF9TVEFSVF9QRyk8PDg7CisJCisJZGF5bmFfbWVtY3B5X3RvY2FyZChkZXYsIHNobWVtLCBidWYsIGNvdW50KTsKK30KKworLyogQ2FibGV0cm9uIGJsb2NrIEkvTyAqLworc3RhdGljIHZvaWQgc2xvd19zYW5lX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCAKKwlpbnQgcmluZ19wYWdlKQoreworCXVuc2lnbmVkIGxvbmcgaGRyX3N0YXJ0ID0gKHJpbmdfcGFnZSAtIFdEX1NUQVJUX1BHKTw8ODsKKwl3b3JkX21lbWNweV9mcm9tY2FyZCgodm9pZCAqKWhkciwgKGNoYXIgKilkZXYtPm1lbV9zdGFydCtoZHJfc3RhcnQsIDQpOworCS8qIFJlZ2lzdGVyIGVuZGlhbmlzbSAtIGZpeCBoZXJlIHJhdGhlciB0aGFuIDgzOTAuYyAqLworCWhkci0+Y291bnQgPSAoaGRyLT5jb3VudCYweEZGKTw8OHwoaGRyLT5jb3VudD4+OCk7Cit9CisKK3N0YXRpYyB2b2lkIHNsb3dfc2FuZV9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsCisJaW50IHJpbmdfb2Zmc2V0KQoreworCXVuc2lnbmVkIGxvbmcgeGZlcl9iYXNlID0gcmluZ19vZmZzZXQgLSAoV0RfU1RBUlRfUEc8PDgpOworCXVuc2lnbmVkIGxvbmcgeGZlcl9zdGFydCA9IHhmZXJfYmFzZStkZXYtPm1lbV9zdGFydDsKKworCWlmICh4ZmVyX3N0YXJ0ICsgY291bnQgPiBlaV9zdGF0dXMucm1lbV9lbmQpCisJeworCQkvKiBXZSBtdXN0IHdyYXAgdGhlIGlucHV0IG1vdmUuICovCisJCWludCBzZW1pX2NvdW50ID0gZWlfc3RhdHVzLnJtZW1fZW5kIC0geGZlcl9zdGFydDsKKwkJd29yZF9tZW1jcHlfZnJvbWNhcmQoc2tiLT5kYXRhLCAoY2hhciAqKWRldi0+bWVtX3N0YXJ0ICsKKwkJCXhmZXJfYmFzZSwgc2VtaV9jb3VudCk7CisJCWNvdW50IC09IHNlbWlfY291bnQ7CisJCXdvcmRfbWVtY3B5X2Zyb21jYXJkKHNrYi0+ZGF0YSArIHNlbWlfY291bnQsCisJCQkJICAgICAoY2hhciAqKWVpX3N0YXR1cy5ybWVtX3N0YXJ0LCBjb3VudCk7CisJfQorCWVsc2UKKwl7CisJCXdvcmRfbWVtY3B5X2Zyb21jYXJkKHNrYi0+ZGF0YSwgKGNoYXIgKilkZXYtPm1lbV9zdGFydCArCisJCQl4ZmVyX2Jhc2UsIGNvdW50KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNsb3dfc2FuZV9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJaW50IHN0YXJ0X3BhZ2UpCit7CisJbG9uZyBzaG1lbSA9IChzdGFydF9wYWdlIC0gV0RfU1RBUlRfUEcpPDw4OworCisJd29yZF9tZW1jcHlfdG9jYXJkKChjaGFyICopZGV2LT5tZW1fc3RhcnQgKyBzaG1lbSwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIHdvcmRfbWVtY3B5X3RvY2FyZCh2b2lkICp0cCwgY29uc3Qgdm9pZCAqZnAsIGludCBjb3VudCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqdG8gPSB0cDsKKwljb25zdCB1bnNpZ25lZCBzaG9ydCAqZnJvbSA9IGZwOworCisJY291bnQrKzsKKwljb3VudC89MjsKKworCXdoaWxlKGNvdW50LS0pCisJCSp0bysrPSpmcm9tKys7Cit9CisKK3N0YXRpYyB2b2lkIHdvcmRfbWVtY3B5X2Zyb21jYXJkKHZvaWQgKnRwLCBjb25zdCB2b2lkICpmcCwgaW50IGNvdW50KQoreworCXVuc2lnbmVkIHNob3J0ICp0byA9IHRwOworCWNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICpmcm9tID0gZnA7CisKKwljb3VudCsrOworCWNvdW50Lz0yOworCisJd2hpbGUoY291bnQtLSkKKwkJKnRvKys9KmZyb20rKzsKK30KKworCQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjODl4MC5jIGIvZHJpdmVycy9uZXQvbWFjODl4MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWIwZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9tYWM4OXgwLmMKQEAgLTAsMCArMSw2NjYgQEAKKy8qIG1hYzg5eDAuYzogQSBDcnlzdGFsIFNlbWljb25kdWN0b3IgQ1M4OVswMl0wIGRyaXZlciBmb3IgbGludXguICovCisvKgorCVdyaXR0ZW4gMTk5NiBieSBSdXNzZWxsIE5lbHNvbiwgd2l0aCByZWZlcmVuY2UgdG8gc2tlbGV0b24uYworCXdyaXR0ZW4gMTk5My0xOTk0IGJ5IERvbmFsZCBCZWNrZXIuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXQgbmVsc29uQGNyeW53ci5jb20sIENyeW53cgorCVNvZnR3YXJlLCAxMSBHcmFudCBTdC4sIFBvdHNkYW0sIE5ZIDEzNjc2CisKKyAgQ2hhbmdlbG9nOgorCisgIE1pa2UgQ3J1c2UgICAgICAgIDogbWNydXNlQGN0aS1sdGQuY29tCisgICAgICAgICAgICAgICAgICAgIDogQ2hhbmdlcyBmb3IgTGludXggMi4wIGNvbXBhdGliaWxpdHkuIAorICAgICAgICAgICAgICAgICAgICA6IEFkZGVkIGRldl9pZCBwYXJhbWV0ZXIgaW4gbmV0X2ludGVycnVwdCgpLAorICAgICAgICAgICAgICAgICAgICA6IHJlcXVlc3RfaXJxKCkgYW5kIGZyZWVfaXJxKCkuIEp1c3QgTlVMTCBmb3Igbm93LgorCisgIE1pa2UgQ3J1c2UgICAgICAgIDogQWRkZWQgTU9EX0lOQ19VU0VfQ09VTlQgYW5kIE1PRF9ERUNfVVNFX0NPVU5UIG1hY3JvcworICAgICAgICAgICAgICAgICAgICA6IGluIG5ldF9vcGVuKCkgYW5kIG5ldF9jbG9zZSgpIHNvIGtlcm5lbGQgd291bGQga25vdworICAgICAgICAgICAgICAgICAgICA6IHRoYXQgdGhlIG1vZHVsZSBpcyBpbiB1c2UgYW5kIHdvdWxkbid0IGVqZWN0IHRoZSAKKyAgICAgICAgICAgICAgICAgICAgOiBkcml2ZXIgcHJlbWF0dXJlbHkuCisKKyAgTWlrZSBDcnVzZSAgICAgICAgOiBSZXdyb3RlIGluaXRfbW9kdWxlKCkgYW5kIGNsZWFudXBfbW9kdWxlIHVzaW5nIDgzOTAuYworICAgICAgICAgICAgICAgICAgICA6IGFzIGFuIGV4YW1wbGUuIERpc2FibGVkIGF1dG9wcm9iaW5nIGluIGluaXRfbW9kdWxlKCksCisgICAgICAgICAgICAgICAgICAgIDogbm90IGEgZ29vZCB0aGluZyB0byBkbyB0byBvdGhlciBkZXZpY2VzIHdoaWxlIExpbnV4CisgICAgICAgICAgICAgICAgICAgIDogaXMgcnVubmluZyBmcm9tIGFsbCBhY2NvdW50cy4KKyAgICAgICAgICAgICAgICAgICAgCisgIEFsYW4gQ294ICAgICAgICAgIDogUmVtb3ZlZCAxLjIgc3VwcG9ydCwgYWRkZWQgMi4xIGV4dHJhIGNvdW50ZXJzLgorCisgIERhdmlkIEh1Z2dpbnMtRGFpbmVzIDxkaGRAZGViaWFuLm9yZz4KKyAgCisgIFNwbGl0IHRoaXMgb2ZmIGludG8gbWFjODl4MC5jLCBhbmQgZ3V0dGVkIGl0IG9mIGFsbCBwYXJ0cyB3aGljaCBhcmUKKyAgbm90IHJlbGV2YW50IHRvIHRoZSBleGlzdGluZyBDUzg5MDAgY2FyZHMgb24gdGhlIE1hY2ludG9zaAorICAoaS5lLiBiYXNpY2FsbHkgdGhlIERheW5hcG9ydCBDUyBhbmQgTEMgY2FyZHMpLiAgVG8gYmUgcHJlY2lzZToKKworICAgICogUmVtb3ZlZCBhbGwgdGhlIG1lZGlhLWRldGVjdGlvbiBzdHVmZiwgYmVjYXVzZSB0aGVzZSBjYXJkcyBhcmUKKyAgICBUUC1vbmx5LgorCisgICAgKiBMb2JvdG9taXplZCB0aGUgSVNBIGludGVycnVwdCBib2dvc2l0eSwgYmVjYXVzZSB0aGVzZSBjYXJkcyB1c2UKKyAgICBhIGhhcmR3aXJlZCBOdUJ1cyBpbnRlcnJ1cHQgYW5kIGEgbWFnaWMgSVNBSVJRIHZhbHVlIGluIHRoZSBjYXJkLgorCisgICAgKiBCYXNpY2FsbHkgZWxpbWluYXRlZCBldmVyeXRoaW5nIG5vdCByZWxldmFudCB0byBnZXR0aW5nIHRoZQorICAgIGNhcmRzIG1pbmltYWxseSBmdW5jdGlvbmluZyBvbiB0aGUgTWFjaW50b3NoLgorCisgIEkgbWlnaHQgYWRkIHRoYXQgdGhlc2UgY2FyZHMgYXJlIGJhZGx5IGRlc2lnbmVkIGV2ZW4gZnJvbSB0aGUgTWFjCisgIHN0YW5kcG9pbnQsIGluIHRoYXQgRGF5bmEsIGluIHRoZWlyIGluZmluaXRlIHdpc2RvbSwgdXNlZCBOdUJ1cyBzbG90CisgIEkvTyBzcGFjZSBhbmQgTnVCdXMgaW50ZXJydXB0cyBmb3IgdGhlc2UgY2FyZHMsIGJ1dCBuZWdsZWN0ZWQgdG8KKyAgcHJvdmlkZSBhbnl0aGluZyBldmVuIHJlbW90ZWx5IHJlc2VtYmxpbmcgYSBOdUJ1cyBST00uICBUaGVyZWZvcmUgd2UKKyAgaGF2ZSB0byBwcm9iZSBmb3IgdGhlbSBpbiBhIGJyYWluLWRhbWFnZWQgSVNBLWxpa2UgZmFzaGlvbi4KKworICBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4gLSAxMS8wMS8yMDAxCisgIGNoZWNrIGttYWxsb2MgYW5kIHJlbGVhc2UgdGhlIGFsbG9jYXRlZCBtZW1vcnkgb24gZmFpbHVyZSBpbgorICBtYWM4OXgwX3Byb2JlIGFuZCBpbiBpbml0X21vZHVsZQorICB1c2UgbG9jYWxfaXJxX3tzYXZlLHJlc3RvcmV9KGZsYWdzKSBpbiBuZXRfZ2V0X3N0YXQsIG5vdCBqdXN0CisgIGxvY2FsX2lycV97ZGlzLGVufWFibGUoKQorKi8KKworc3RhdGljIGNoYXIgKnZlcnNpb24gPQorImNzODl4MC5jOnYxLjAyIDExLzI2Lzk2IFJ1c3NlbGwgTmVsc29uIDxuZWxzb25AY3J5bndyLmNvbT5cbiI7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09IGNvbmZpZ3VyZSB0aGUgZHJpdmVyIGhlcmUgPT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogdXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgPjIgZm9yIGRlYnVnICovCisjaWZuZGVmIE5FVF9ERUJVRworI2RlZmluZSBORVRfREVCVUcgMAorI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09IGVuZCBvZiBjb25maWd1cmF0aW9uID09PT09PT09PT09PT09PT09PT09PT09ICovCisKKworLyogQWx3YXlzIGluY2x1ZGUgJ2NvbmZpZy5oJyBmaXJzdCBpbiBjYXNlIHRoZSB1c2VyIHdhbnRzIHRvIHR1cm4gb24KKyAgIG9yIG92ZXJyaWRlIHNvbWV0aGluZy4gKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2RlZmluZSBQUklOVEsoeCkgcHJpbnRrIHgKKworLyoKKyAgU291cmNlczoKKworCUNyeW53ciBwYWNrZXQgZHJpdmVyIGVwa3Rpc2EuCisKKwlDcnlzdGFsIFNlbWljb25kdWN0b3IgZGF0YSBzaGVldHMuCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbnVidXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9od3Rlc3QuaD4KKyNpbmNsdWRlIDxhc20vbWFjaW50cy5oPgorCisjaW5jbHVkZSAiY3M4OXgwLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmV0X2RlYnVnID0gTkVUX0RFQlVHOworCisvKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4gKi8KK3N0cnVjdCBuZXRfbG9jYWwgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCWludCBjaGlwX3R5cGU7CQkvKiBvbmUgb2Y6IENTODkwMCwgQ1M4OTIwLCBDUzg5MjBNICovCisJY2hhciBjaGlwX3JldmlzaW9uOwkvKiByZXZpc2lvbiBsZXR0ZXIgb2YgdGhlIGNoaXAgKCdBJy4uLikgKi8KKwlpbnQgc2VuZF9jbWQ7CQkvKiB0aGUgcHJvcGVyY29tbWFuZCB1c2VkIHRvIHNlbmQgYSBwYWNrZXQuICovCisJaW50IHJ4X21vZGU7CisJaW50IGN1cnJfcnhfY2ZnOworICAgICAgICBpbnQgc2VuZF91bmRlcnJ1bjsgICAgICAvKiBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IHVuZGVycnVucyBpbiBhIHJvdyB3ZSBnZXQgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworfTsKKworLyogSW5kZXggdG8gZnVuY3Rpb25zLCBhcyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLworCisjaWYgMAorZXh0ZXJuIHZvaWQgcmVzZXRfY2hpcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorc3RhdGljIGludCBuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJbmV0X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IG5ldF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBuZXRfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG5ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpOworCisKKy8qIEV4YW1wbGUgcm91dGluZXMgeW91IG11c3Qgd3JpdGUgOy0+LiAqLworI2RlZmluZSB0eF9kb25lKGRldikgMQorCisvKiBGb3IgcmVhZGluZy93cml0aW5nIHJlZ2lzdGVycyBJU0Etc3R5bGUgKi8KK3N0YXRpYyBpbmxpbmUgaW50CityZWFkcmVnX2lvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwb3J0bm8pCit7CisJbnVidXNfd3JpdGV3KHN3YWIxNihwb3J0bm8pLCBkZXYtPmJhc2VfYWRkciArIEFERF9QT1JUKTsKKwlyZXR1cm4gc3dhYjE2KG51YnVzX3JlYWR3KGRldi0+YmFzZV9hZGRyICsgREFUQV9QT1JUKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAord3JpdGVyZWdfaW8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBvcnRubywgaW50IHZhbHVlKQoreworCW51YnVzX3dyaXRldyhzd2FiMTYocG9ydG5vKSwgZGV2LT5iYXNlX2FkZHIgKyBBRERfUE9SVCk7CisJbnVidXNfd3JpdGV3KHN3YWIxNih2YWx1ZSksIGRldi0+YmFzZV9hZGRyICsgREFUQV9QT1JUKTsKK30KKworLyogVGhlc2UgYXJlIGZvciByZWFkaW5nL3dyaXRpbmcgcmVnaXN0ZXJzIGluIHNoYXJlZCBtZW1vcnkgKi8KK3N0YXRpYyBpbmxpbmUgaW50CityZWFkcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwb3J0bm8pCit7CisJcmV0dXJuIHN3YWIxNihudWJ1c19yZWFkdyhkZXYtPm1lbV9zdGFydCArIHBvcnRubykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3dyaXRlcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwb3J0bm8sIGludCB2YWx1ZSkKK3sKKwludWJ1c193cml0ZXcoc3dhYjE2KHZhbHVlKSwgZGV2LT5tZW1fc3RhcnQgKyBwb3J0bm8pOworfQorCisvKiBQcm9iZSBmb3IgdGhlIENTODkwMCBjYXJkIGluIHNsb3QgRS4gIFdlIHdvbid0IGJvdGhlciBsb29raW5nCisgICBhbnl3aGVyZSBlbHNlIHVudGlsIHdlIGhhdmUgYSByZWFsbHkgZ29vZCByZWFzb24gdG8gZG8gc28uICovCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBtYWM4OXgwX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RhdGljIGludCBvbmNlX2lzX2Vub3VnaDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscDsKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCWludCBpLCBzbG90OworCXVuc2lnbmVkIHJldl90eXBlID0gMDsKKwl1bnNpZ25lZCBsb25nIGlvYWRkcjsKKwl1bnNpZ25lZCBzaG9ydCBzaWc7CisJaW50IGVyciA9IC1FTk9ERVY7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWlmIChvbmNlX2lzX2Vub3VnaCkKKwkJZ290byBvdXQ7CisJb25jZV9pc19lbm91Z2ggPSAxOworCisJLyogV2UgbWlnaHQgaGF2ZSB0byBwYXJhbWV0ZXJpemUgdGhpcyBsYXRlciAqLworCXNsb3QgPSAweEU7CisJLyogR2V0IG91dCBub3cgaWYgdGhlcmUncyBhIHJlYWwgTnVCdXMgY2FyZCBpbiBzbG90IEUgKi8KKwlpZiAobnVidXNfZmluZF9zbG90KHNsb3QsIE5VTEwpICE9IE5VTEwpCisJCWdvdG8gb3V0OworCisJLyogVGhlIHBzZXVkby1JU0EgYml0cyBhbHdheXMgbGl2ZSBhdCBvZmZzZXQgMHgzMDAgKGdlZSwKKyAgICAgICAgICAgd29uZGVyIHdoeS4uLikgKi8KKwlpb2FkZHIgPSAodW5zaWduZWQgbG9uZykKKwkJbnVidXNfc2xvdF9hZGRyKHNsb3QpIHwgKCgoc2xvdCYweGYpIDw8IDIwKSArIERFRkFVTFRJT0JBU0UpOworCXsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJaW50IGNhcmRfcHJlc2VudDsKKwkJCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJY2FyZF9wcmVzZW50ID0gaHdyZWdfcHJlc2VudCgodm9pZCopIGlvYWRkcis0KQorCQkgICYmIGh3cmVnX3ByZXNlbnQoKHZvaWQqKSBpb2FkZHIgKyBEQVRBX1BPUlQpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkJaWYgKCFjYXJkX3ByZXNlbnQpCisJCQlnb3RvIG91dDsKKwl9CisKKwludWJ1c193cml0ZXcoMCwgaW9hZGRyICsgQUREX1BPUlQpOworCXNpZyA9IG51YnVzX3JlYWR3KGlvYWRkciArIERBVEFfUE9SVCk7CisJaWYgKHNpZyAhPSBzd2FiMTYoQ0hJUF9FSVNBX0lEX1NJRykpCisJCWdvdG8gb3V0OworCisJLyogSW5pdGlhbGl6ZSB0aGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUuICovCisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogRmlsbCBpbiB0aGUgJ2RldicgZmllbGRzLiAqLworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCWRldi0+bWVtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIAorCQludWJ1c19zbG90X2FkZHIoc2xvdCkgfCAoKChzbG90JjB4ZikgPDwgMjApICsgTU1JT0JBU0UpOworCWRldi0+bWVtX2VuZCA9IGRldi0+bWVtX3N0YXJ0ICsgMHgxMDAwOworCisJLyogVHVybiBvbiBzaGFyZWQgbWVtb3J5ICovCisJd3JpdGVyZWdfaW8oZGV2LCBQUF9CdXNDVEwsIE1FTU9SWV9PTik7CisKKwkvKiBnZXQgdGhlIGNoaXAgdHlwZSAqLworCXJldl90eXBlID0gcmVhZHJlZyhkZXYsIFBST0RVQ1RfSURfQUREKTsKKwlscC0+Y2hpcF90eXBlID0gcmV2X3R5cGUgJn4gUkVWSVNPTl9CSVRTOworCWxwLT5jaGlwX3JldmlzaW9uID0gKChyZXZfdHlwZSAmIFJFVklTT05fQklUUykgPj4gOCkgKyAnQSc7CisKKwkvKiBDaGVjayB0aGUgY2hpcCB0eXBlIGFuZCByZXZpc2lvbiBpbiBvcmRlciB0byBzZXQgdGhlIGNvcnJlY3Qgc2VuZCBjb21tYW5kCisJQ1M4OTIwIHJldmlzaW9uIEMgYW5kIENTODkwMCByZXZpc2lvbiBGIGNhbiB1c2UgdGhlIGZhc3RlciBzZW5kLiAqLworCWxwLT5zZW5kX2NtZCA9IFRYX0FGVEVSXzM4MTsKKwlpZiAobHAtPmNoaXBfdHlwZSA9PSBDUzg5MDAgJiYgbHAtPmNoaXBfcmV2aXNpb24gPj0gJ0YnKQorCQlscC0+c2VuZF9jbWQgPSBUWF9OT1c7CisJaWYgKGxwLT5jaGlwX3R5cGUgIT0gQ1M4OTAwICYmIGxwLT5jaGlwX3JldmlzaW9uID49ICdDJykKKwkJbHAtPnNlbmRfY21kID0gVFhfTk9XOworCisJaWYgKG5ldF9kZWJ1ZyAmJiB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsodmVyc2lvbik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogY3M4OSVjMCVzIHJldiAlYyBmb3VuZCBhdCAlIzhseCIsCisJICAgICAgIGRldi0+bmFtZSwKKwkgICAgICAgbHAtPmNoaXBfdHlwZT09Q1M4OTAwPycwJzonMicsCisJICAgICAgIGxwLT5jaGlwX3R5cGU9PUNTODkyME0/Ik0iOiIiLAorCSAgICAgICBscC0+Y2hpcF9yZXZpc2lvbiwKKwkgICAgICAgZGV2LT5iYXNlX2FkZHIpOworCisJLyogVHJ5IHRvIHJlYWQgdGhlIE1BQyBhZGRyZXNzICovCisJaWYgKChyZWFkcmVnKGRldiwgUFBfU2VsZlNUKSAmIChFRVBST01fUFJFU0VOVCB8IEVFUFJPTV9PSykpID09IDApIHsKKwkJcHJpbnRrKCJcbm1hYzg5eDA6IE5vIEVFUFJPTSwgZ2l2aW5nIHVwIG5vdy5cbiIpOworCQlnb3RvIG91dDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpICs9IDIpIHsKKwkJCS8qIEJpZy1lbmRpYW4gKHdoeT8/ISkgKi8KKwkJCXVuc2lnbmVkIHNob3J0IHMgPSByZWFkcmVnKGRldiwgUFBfSUEgKyBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+ZGV2X2FkZHJbaV0gPSBzID4+IDg7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmRldl9hZGRyW2krMV0gPSBzICYgMHhmZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworCWRldi0+aXJxID0gU0xPVDJJUlEoc2xvdCk7CisJcHJpbnRrKCIgSVJRICVkIEFERFIgIiwgZGV2LT5pcnEpOworCisJLyogcHJpbnQgdGhlIGV0aGVybmV0IGFkZHJlc3MuICovCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCisJCXByaW50aygiJTIuMnglcyIsIGRldi0+ZGV2X2FkZHJbaV0sCisJCSAgICAgICAoKGkgPCBFVEhfQUxFTi0xKSA/ICI6IiA6ICIiKSk7CisJcHJpbnRrKCJcbiIpOworCisJZGV2LT5vcGVuCQk9IG5ldF9vcGVuOworCWRldi0+c3RvcAkJPSBuZXRfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBuZXRfc2VuZF9wYWNrZXQ7CisJZGV2LT5nZXRfc3RhdHMJPSBuZXRfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9tdWx0aWNhc3RfbGlzdDsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9ICZzZXRfbWFjX2FkZHJlc3M7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIDA7CitvdXQxOgorCW51YnVzX3dyaXRldygwLCBkZXYtPmJhc2VfYWRkciArIEFERF9QT1JUKTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKyNpZiAwCisvKiBUaGlzIGlzIHVzZWZ1bCBmb3Igc29tZXRoaW5nLCBidXQgSSBkb24ndCBrbm93IHdoYXQgeWV0LiAqLwordm9pZCBfX2luaXQgcmVzZXRfY2hpcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXNldF9zdGFydF90aW1lOworCisJd3JpdGVyZWcoZGV2LCBQUF9TZWxmQ1RMLCByZWFkcmVnKGRldiwgUFBfU2VsZkNUTCkgfCBQT1dFUl9PTl9SRVNFVCk7CisKKwkvKiB3YWl0IDMwIG1zICovCisJbXNsZWVwX2ludGVycnVwdGlibGUoMzApOworCisJLyogV2FpdCB1bnRpbCB0aGUgY2hpcCBpcyByZXNldCAqLworCXJlc2V0X3N0YXJ0X3RpbWUgPSBqaWZmaWVzOworCXdoaWxlKCAocmVhZHJlZyhkZXYsIFBQX1NlbGZTVCkgJiBJTklUX0RPTkUpID09IDAgJiYgamlmZmllcyAtIHJlc2V0X3N0YXJ0X3RpbWUgPCAyKQorCQk7Cit9CisjZW5kaWYKKworLyogT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4gIFRoaXMgaXMgY2FsbGVkIChpbiB0aGUgY3VycmVudCBrZXJuZWwpCisgICBzb21ldGltZSBhZnRlciBib290aW5nIHdoZW4gdGhlICdpZmNvbmZpZycgcHJvZ3JhbSBpcyBydW4uCisKKyAgIFRoaXMgcm91dGluZSBzaG91bGQgc2V0IGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4KKyAgIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0CisgICB0aGVyZSBpcyBub24tcmVib290IHdheSB0byByZWNvdmVyIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgorICAgKi8KK3N0YXRpYyBpbnQKK25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJLyogRGlzYWJsZSB0aGUgaW50ZXJydXB0IGZvciBub3cgKi8KKwl3cml0ZXJlZyhkZXYsIFBQX0J1c0NUTCwgcmVhZHJlZyhkZXYsIFBQX0J1c0NUTCkgJiB+RU5BQkxFX0lSUSk7CisKKwkvKiBHcmFiIHRoZSBpbnRlcnJ1cHQgKi8KKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICZuZXRfaW50ZXJydXB0LCAwLCAiY3M4OXgwIiwgZGV2KSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwkvKiBTZXQgdXAgdGhlIElSUSAtIEFwcGFyZW50bHkgbWFnaWMgKi8KKwlpZiAobHAtPmNoaXBfdHlwZSA9PSBDUzg5MDApCisJCXdyaXRlcmVnKGRldiwgUFBfQ1M4OTAwX0lTQUlOVCwgMCk7CisJZWxzZQorCQl3cml0ZXJlZyhkZXYsIFBQX0NTODkyMF9JU0FJTlQsIDApOworCisJLyogc2V0IHRoZSBFdGhlcm5ldCBhZGRyZXNzICovCisJZm9yIChpPTA7IGkgPCBFVEhfQUxFTi8yOyBpKyspCisJCXdyaXRlcmVnKGRldiwgUFBfSUEraSoyLCBkZXYtPmRldl9hZGRyW2kqMl0gfCAoZGV2LT5kZXZfYWRkcltpKjIrMV0gPDwgOCkpOworCisJLyogVHVybiBvbiBib3RoIHJlY2VpdmUgYW5kIHRyYW5zbWl0IG9wZXJhdGlvbnMgKi8KKwl3cml0ZXJlZyhkZXYsIFBQX0xpbmVDVEwsIHJlYWRyZWcoZGV2LCBQUF9MaW5lQ1RMKSB8IFNFUklBTF9SWF9PTiB8IFNFUklBTF9UWF9PTik7CisKKwkvKiBSZWNlaXZlIG9ubHkgZXJyb3IgZnJlZSBwYWNrZXRzIGFkZHJlc3NlZCB0byB0aGlzIGNhcmQgKi8KKwlscC0+cnhfbW9kZSA9IDA7CisJd3JpdGVyZWcoZGV2LCBQUF9SeENUTCwgREVGX1JYX0FDQ0VQVCk7CisKKwlscC0+Y3Vycl9yeF9jZmcgPSBSWF9PS19FTkJMIHwgUlhfQ1JDX0VSUk9SX0VOQkw7CisKKwl3cml0ZXJlZyhkZXYsIFBQX1J4Q0ZHLCBscC0+Y3Vycl9yeF9jZmcpOworCisJd3JpdGVyZWcoZGV2LCBQUF9UeENGRywgVFhfTE9TVF9DUlNfRU5CTCB8IFRYX1NRRV9FUlJPUl9FTkJMIHwgVFhfT0tfRU5CTCB8CisJICAgICAgIFRYX0xBVEVfQ09MX0VOQkwgfCBUWF9KQlJfRU5CTCB8IFRYX0FOWV9DT0xfRU5CTCB8IFRYXzE2X0NPTF9FTkJMKTsKKworCXdyaXRlcmVnKGRldiwgUFBfQnVmQ0ZHLCBSRUFEWV9GT1JfVFhfRU5CTCB8IFJYX01JU1NfQ09VTlRfT1ZSRkxPV19FTkJMIHwKKwkJIFRYX0NPTF9DT1VOVF9PVlJGTE9XX0VOQkwgfCBUWF9VTkRFUlJVTl9FTkJMKTsKKworCS8qIG5vdyB0aGF0IHdlJ3ZlIGdvdCBvdXIgYWN0IHRvZ2V0aGVyLCBlbmFibGUgZXZlcnl0aGluZyAqLworCXdyaXRlcmVnKGRldiwgUFBfQnVzQ1RMLCByZWFkcmVnKGRldiwgUFBfQnVzQ1RMKSB8IEVOQUJMRV9JUlEpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25ldF9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmIChkZXYtPnRidXN5KSB7CisJCS8qIElmIHdlIGdldCBoZXJlLCBzb21lIGhpZ2hlciBsZXZlbCBoYXMgZGVjaWRlZCB3ZSBhcmUgYnJva2VuLgorCQkgICBUaGVyZSBzaG91bGQgcmVhbGx5IGJlIGEgImtpY2sgbWUiIGZ1bmN0aW9uIGNhbGwgaW5zdGVhZC4gKi8KKwkJaW50IHRpY2tzc29mYXIgPSBqaWZmaWVzIC0gZGV2LT50cmFuc19zdGFydDsKKwkJaWYgKHRpY2tzc29mYXIgPCA1KQorCQkJcmV0dXJuIDE7CisJCWlmIChuZXRfZGVidWcgPiAwKSBwcmludGsoIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsICVzP1xuIiwgZGV2LT5uYW1lLAorCQkJICAgdHhfZG9uZShkZXYpID8gIklSUSBjb25mbGljdCIgOiAibmV0d29yayBjYWJsZSBwcm9ibGVtIik7CisJCS8qIFRyeSB0byByZXN0YXJ0IHRoZSBhZGFwdG9yLiAqLworCQlkZXYtPnRidXN5PTA7CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCX0KKworCS8qIEJsb2NrIGEgdGltZXItYmFzZWQgdHJhbnNtaXQgZnJvbSBvdmVybGFwcGluZy4gIFRoaXMgY291bGQgYmV0dGVyIGJlCisJICAgZG9uZSB3aXRoIGF0b21pY19zd2FwKDEsIGRldi0+dGJ1c3kpLCBidXQgc2V0X2JpdCgpIHdvcmtzIGFzIHdlbGwuICovCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgKHZvaWQqKSZkZXYtPnRidXN5KSAhPSAwKQorCQlwcmludGsoIiVzOiBUcmFuc21pdHRlciBhY2Nlc3MgY29uZmxpY3QuXG4iLCBkZXYtPm5hbWUpOworCWVsc2UgeworCQlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJaWYgKG5ldF9kZWJ1ZyA+IDMpCisJCQlwcmludGsoIiVzOiBzZW50ICVkIGJ5dGUgcGFja2V0IG9mIHR5cGUgJXhcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBza2ItPmxlbiwKKwkJCSAgICAgICAoc2tiLT5kYXRhW0VUSF9BTEVOK0VUSF9BTEVOXSA8PCA4KQorCQkJICAgICAgIHwgc2tiLT5kYXRhW0VUSF9BTEVOK0VUSF9BTEVOKzFdKTsKKworCQkvKiBrZWVwIHRoZSB1cGxvYWQgZnJvbSBiZWluZyBpbnRlcnJ1cHRlZCwgc2luY2Ugd2UKKyAgICAgICAgICAgICAgICAgICBhc2sgdGhlIGNoaXAgdG8gc3RhcnQgdHJhbnNtaXR0aW5nIGJlZm9yZSB0aGUKKyAgICAgICAgICAgICAgICAgICB3aG9sZSBwYWNrZXQgaGFzIGJlZW4gY29tcGxldGVseSB1cGxvYWRlZC4gKi8KKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJCS8qIGluaXRpYXRlIGEgdHJhbnNtaXQgc2VxdWVuY2UgKi8KKwkJd3JpdGVyZWcoZGV2LCBQUF9UeENNRCwgbHAtPnNlbmRfY21kKTsKKwkJd3JpdGVyZWcoZGV2LCBQUF9UeExlbmd0aCwgc2tiLT5sZW4pOworCisJCS8qIFRlc3QgdG8gc2VlIGlmIHRoZSBjaGlwIGhhcyBhbGxvY2F0ZWQgbWVtb3J5IGZvciB0aGUgcGFja2V0ICovCisJCWlmICgocmVhZHJlZyhkZXYsIFBQX0J1c1NUKSAmIFJFQURZX0ZPUl9UWF9OT1cpID09IDApIHsKKwkJCS8qIEdhc3AhICBJdCBoYXNuJ3QuICBCdXQgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHNpbmNlCisJCQkgICB3ZSdyZSB3YWl0aW5nIGZvciBUeE9rLCBzbyByZXR1cm4gMSBhbmQgcmVxdWV1ZSB0aGlzIHBhY2tldC4gKi8KKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJLyogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBwYWNrZXQgKi8KKwkJbWVtY3B5X3RvaW8oZGV2LT5tZW1fc3RhcnQgKyBQUF9UeEZyYW1lLCBza2ItPmRhdGEsIHNrYi0+bGVuKzEpOworCisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJfQorCWRldl9rZnJlZV9za2IgKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKwwKKy8qIFRoZSB0eXBpY2FsIHdvcmtsb2FkIG9mIHRoZSBkcml2ZXI6CisgICBIYW5kbGUgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGludGVycnVwdHMuICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbmV0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBuZXRfbG9jYWwgKmxwOworCWludCBpb2FkZHIsIHN0YXR1czsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsgKCJuZXRfaW50ZXJydXB0KCk6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCWlmIChkZXYtPmludGVycnVwdCkKKwkJcHJpbnRrKCIlczogUmUtZW50ZXJpbmcgdGhlIGludGVycnVwdCBoYW5kbGVyLlxuIiwgZGV2LT5uYW1lKTsKKwlkZXYtPmludGVycnVwdCA9IDE7CisKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiB3ZSBNVVNUIHJlYWQgYWxsIHRoZSBldmVudHMgb3V0IG9mIHRoZSBJU1EsIG90aGVyd2lzZSB3ZSdsbCBuZXZlcgorICAgICAgICAgICBnZXQgaW50ZXJydXB0ZWQgYWdhaW4uICBBcyBhIGNvbnNlcXVlbmNlLCB3ZSBjYW4ndCBoYXZlIGFueSBsaW1pdAorICAgICAgICAgICBvbiB0aGUgbnVtYmVyIG9mIHRpbWVzIHdlIGxvb3AgaW4gdGhlIGludGVycnVwdCBoYW5kbGVyLiAgVGhlCisgICAgICAgICAgIGhhcmR3YXJlIGd1YXJhbnRlZXMgdGhhdCBldmVudHVhbGx5IHdlJ2xsIHJ1biBvdXQgb2YgZXZlbnRzLiAgT2YKKyAgICAgICAgICAgY291cnNlLCBpZiB5b3UncmUgb24gYSBzbG93IG1hY2hpbmUsIGFuZCBwYWNrZXRzIGFyZSBhcnJpdmluZworICAgICAgICAgICBmYXN0ZXIgdGhhbiB5b3UgY2FuIHJlYWQgdGhlbSBvZmYsIHlvdSdyZSBzY3Jld2VkLiAgSGFzdGEgbGEKKyAgICAgICAgICAgdmlzdGEsIGJhYnkhICAqLworCXdoaWxlICgoc3RhdHVzID0gc3dhYjE2KG51YnVzX3JlYWR3KGRldi0+YmFzZV9hZGRyICsgSVNRX1BPUlQpKSkpIHsKKwkJaWYgKG5ldF9kZWJ1ZyA+IDQpcHJpbnRrKCIlczogZXZlbnQ9JTA0eFxuIiwgZGV2LT5uYW1lLCBzdGF0dXMpOworCQlzd2l0Y2goc3RhdHVzICYgSVNRX0VWRU5UX01BU0spIHsKKwkJY2FzZSBJU1FfUkVDRUlWRVJfRVZFTlQ6CisJCQkvKiBHb3QgYSBwYWNrZXQocykuICovCisJCQluZXRfcngoZGV2KTsKKwkJCWJyZWFrOworCQljYXNlIElTUV9UUkFOU01JVFRFUl9FVkVOVDoKKwkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlkZXYtPnRidXN5ID0gMDsKKwkJCW1hcmtfYmgoTkVUX0JIKTsJLyogSW5mb3JtIHVwcGVyIGxheWVycy4gKi8KKwkJCWlmICgoc3RhdHVzICYgVFhfT0spID09IDApIGxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBUWF9MT1NUX0NSUykgbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgVFhfU1FFX0VSUk9SKSBscC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIFRYX0xBVEVfQ09MKSBscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIFRYXzE2X0NPTCkgbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQlicmVhazsKKwkJY2FzZSBJU1FfQlVGRkVSX0VWRU5UOgorCQkJaWYgKHN0YXR1cyAmIFJFQURZX0ZPUl9UWCkgeworCQkJCS8qIHdlIHRyaWVkIHRvIHRyYW5zbWl0IGEgcGFja2V0IGVhcmxpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBpbmV4cGxpY2FibHkgcmFuIG91dCBvZiBidWZmZXJzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGF0IHNob3VsZG4ndCBoYXBwZW4gc2luY2Ugd2Ugb25seSBldmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQgb25lIHBhY2tldC4gIFNocnVnLiAgRG8gdGhlIHJpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nIGFueXdheS4gKi8KKwkJCQlkZXYtPnRidXN5ID0gMDsKKwkJCQltYXJrX2JoKE5FVF9CSCk7CS8qIEluZm9ybSB1cHBlciBsYXllcnMuICovCisJCQl9CisJCQlpZiAoc3RhdHVzICYgVFhfVU5ERVJSVU4pIHsKKwkJCQlpZiAobmV0X2RlYnVnID4gMCkgcHJpbnRrKCIlczogdHJhbnNtaXQgdW5kZXJydW5cbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zZW5kX3VuZGVycnVuKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChscC0+c2VuZF91bmRlcnJ1biA9PSAzKSBscC0+c2VuZF9jbWQgPSBUWF9BRlRFUl8zODE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxwLT5zZW5kX3VuZGVycnVuID09IDYpIGxwLT5zZW5kX2NtZCA9IFRYX0FGVEVSX0FMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCWJyZWFrOworCQljYXNlIElTUV9SWF9NSVNTX0VWRU5UOgorCQkJbHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gKHN0YXR1cyA+PjYpOworCQkJYnJlYWs7CisJCWNhc2UgSVNRX1RYX0NPTF9FVkVOVDoKKwkJCWxwLT5zdGF0cy5jb2xsaXNpb25zICs9IChzdGF0dXMgPj42KTsKKwkJCWJyZWFrOworCQl9CisJfQorCWRldi0+aW50ZXJydXB0ID0gMDsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIFdlIGhhdmUgYSBnb29kIHBhY2tldChzKSwgZ2V0IGl0L3RoZW0gb3V0IG9mIHRoZSBidWZmZXJzLiAqLworc3RhdGljIHZvaWQKK25ldF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBzdGF0dXMsIGxlbmd0aDsKKworCXN0YXR1cyA9IHJlYWRyZWcoZGV2LCBQUF9SeFN0YXR1cyk7CisJaWYgKChzdGF0dXMgJiBSWF9PSykgPT0gMCkgeworCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBSWF9SVU5UKSBscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgUlhfRVhUUkFfREFUQSkgbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIFJYX0NSQ19FUlJPUikgaWYgKCEoc3RhdHVzICYgKFJYX0VYVFJBX0RBVEF8UlhfUlVOVCkpKQorCQkJLyogcGVyIHN0ciAxNzIgKi8KKwkJCWxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBSWF9EUklCQkxFKSBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCXJldHVybjsKKwl9CisKKwlsZW5ndGggPSByZWFkcmVnKGRldiwgUFBfUnhMZW5ndGgpOworCS8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLiAqLworCXNrYiA9IGFsbG9jX3NrYihsZW5ndGgsIEdGUF9BVE9NSUMpOworCWlmIChza2IgPT0gTlVMTCkgeworCQlwcmludGsoIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKwlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKKwlza2ItPmRldiA9IGRldjsKKworCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhLCBkZXYtPm1lbV9zdGFydCArIFBQX1J4RnJhbWUsIGxlbmd0aCk7CisKKwlpZiAobmV0X2RlYnVnID4gMylwcmludGsoIiVzOiByZWNlaXZlZCAlZCBieXRlIHBhY2tldCBvZiB0eXBlICV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2tiLT5kYXRhW0VUSF9BTEVOK0VUSF9BTEVOXSA8PCA4KQorCQkJCSB8IHNrYi0+ZGF0YVtFVEhfQUxFTitFVEhfQUxFTisxXSk7CisKKyAgICAgICAgc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwluZXRpZl9yeChza2IpOworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlscC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuZ3RoOworfQorCisvKiBUaGUgaW52ZXJzZSByb3V0aW5lIHRvIG5ldF9vcGVuKCkuICovCitzdGF0aWMgaW50CituZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCXdyaXRlcmVnKGRldiwgUFBfUnhDRkcsIDApOworCXdyaXRlcmVnKGRldiwgUFBfVHhDRkcsIDApOworCXdyaXRlcmVnKGRldiwgUFBfQnVmQ0ZHLCAwKTsKKwl3cml0ZXJlZyhkZXYsIFBQX0J1c0NUTCwgMCk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCS8qIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyBoZXJlLiAqLworCisJcmV0dXJuIDA7CisKK30KKworLyogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCVRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IKKyAgIGNsb3NlZC4gKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCituZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJLyogVXBkYXRlIHRoZSBzdGF0aXN0aWNzIGZyb20gdGhlIGRldmljZSByZWdpc3RlcnMuICovCisJbHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gKHJlYWRyZWcoZGV2LCBQUF9SeE1pc3MpID4+IDYpOworCWxwLT5zdGF0cy5jb2xsaXNpb25zICs9IChyZWFkcmVnKGRldiwgUFBfVHhDb2wpID4+IDYpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiAmbHAtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZihkZXYtPmZsYWdzJklGRl9QUk9NSVNDKQorCXsKKwkJbHAtPnJ4X21vZGUgPSBSWF9BTExfQUNDRVBUOworCX0KKwllbHNlIGlmKChkZXYtPmZsYWdzJklGRl9BTExNVUxUSSl8fGRldi0+bWNfbGlzdCkKKwl7CisJCS8qIFRoZSBtdWx0aWNhc3QtYWNjZXB0IGxpc3QgaXMgaW5pdGlhbGl6ZWQgdG8gYWNjZXB0LWFsbCwgYW5kIHdlCisJCSAgIHJlbHkgb24gaGlnaGVyLWxldmVsIGZpbHRlcmluZyBmb3Igbm93LiAqLworCQlscC0+cnhfbW9kZSA9IFJYX01VTFRDQVNUX0FDQ0VQVDsKKwl9IAorCWVsc2UKKwkJbHAtPnJ4X21vZGUgPSAwOworCisJd3JpdGVyZWcoZGV2LCBQUF9SeENUTCwgREVGX1JYX0FDQ0VQVCB8IGxwLT5yeF9tb2RlKTsKKworCS8qIGluIHByb21pc2N1b3VzIG1vZGUsIHdlIGFjY2VwdCBlcnJvcmVkIHBhY2tldHMsIHNvIHdlIGhhdmUgdG8gZW5hYmxlIGludGVycnVwdHMgb24gdGhlbSBhbHNvICovCisJd3JpdGVyZWcoZGV2LCBQUF9SeENGRywgbHAtPmN1cnJfcnhfY2ZnIHwKKwkgICAgIChscC0+cnhfbW9kZSA9PSBSWF9BTExfQUNDRVBUPyAoUlhfQ1JDX0VSUk9SX0VOQkx8UlhfUlVOVF9FTkJMfFJYX0VYVFJBX0RBVEFfRU5CTCkgOiAwKSk7Cit9CisKKworc3RhdGljIGludCBzZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKK3sKKwlpbnQgaTsKKwlpZiAoZGV2LT5zdGFydCkKKwkJcmV0dXJuIC1FQlVTWTsKKwlwcmludGsoIiVzOiBTZXR0aW5nIE1BQyBhZGRyZXNzIHRvICIsIGRldi0+bmFtZSk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIgJTIuMngiLCBkZXYtPmRldl9hZGRyW2ldID0gKCh1bnNpZ25lZCBjaGFyICopYWRkcilbaV0pOworCXByaW50aygiLlxuIik7CisJLyogc2V0IHRoZSBFdGhlcm5ldCBhZGRyZXNzICovCisJZm9yIChpPTA7IGkgPCBFVEhfQUxFTi8yOyBpKyspCisJCXdyaXRlcmVnKGRldiwgUFBfSUEraSoyLCBkZXYtPmRldl9hZGRyW2kqMl0gfCAoZGV2LT5kZXZfYWRkcltpKjIrMV0gPDwgOCkpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBNT0RVTEUKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfY3M4OXgwOworc3RhdGljIGludCBkZWJ1ZzsKKworTU9EVUxFX1BBUk0oZGVidWcsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiQ1M4OVswMl0wIGRlYnVnIGxldmVsICgwLTUpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK2ludAoraW5pdF9tb2R1bGUodm9pZCkKK3sKKwluZXRfZGVidWcgPSBkZWJ1ZzsKKyAgICAgICAgZGV2X2NzODl4MCA9IG1hYzg5eDBfcHJvYmUoLTEpOworCWlmIChJU19FUlIoZGV2X2NzODl4MCkpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJtYWM4OXgwLmM6IE5vIGNhcmQgZm91bmRcbiIpOworCQlyZXR1cm4gUFRSX0VSUihkZXZfY3M4OXgwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2X2NzODl4MCk7CisJbnVidXNfd3JpdGV3KDAsIGRldl9jczg5eDAtPmJhc2VfYWRkciArIEFERF9QT1JUKTsKKwlmcmVlX25ldGRldihkZXZfY3M4OXgwKTsKK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOiAibTY4ay1saW51eC1nY2MgLURfX0tFUk5FTF9fIC1JLi4vLi4vaW5jbHVkZSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciAtcGlwZSAtZm5vLXN0cmVuZ3RoLXJlZHVjZSAtZmZpeGVkLWEyIC1ETU9EVUxFIC1ETU9EVkVSU0lPTlMgLWluY2x1ZGUgLi4vLi4vaW5jbHVkZS9saW51eC9tb2R2ZXJzaW9ucy5oICAgLWMgLW8gbWFjODl4MC5vIG1hYzg5eDAuYyIKKyAqICB2ZXJzaW9uLWNvbnRyb2w6IHQKKyAqICBrZXB0LW5ldy12ZXJzaW9uczogNQorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWNlLmMgYi9kcml2ZXJzL25ldC9tYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkMmQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L21hY2UuYwpAQCAtMCwwICsxLDEwNTMgQEAKKy8qCisgKiBOZXR3b3JrIGRldmljZSBkcml2ZXIgZm9yIHRoZSBNQUNFIGV0aGVybmV0IGNvbnRyb2xsZXIgb24KKyAqIEFwcGxlIFBvd2VybWFjcy4gIEFzc3VtZXMgaXQncyB1bmRlciBhIERCRE1BIGNvbnRyb2xsZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL2RiZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaW8uaD4KKworI2luY2x1ZGUgIm1hY2UuaCIKKworc3RhdGljIGludCBwb3J0X2FhdWkgPSAtMTsKKworI2RlZmluZSBOX1JYX1JJTkcJOAorI2RlZmluZSBOX1RYX1JJTkcJNgorI2RlZmluZSBNQVhfVFhfQUNUSVZFCTEKKyNkZWZpbmUgTkNNRFNfVFgJMQkvKiBkbWEgY29tbWFuZHMgcGVyIGVsZW1lbnQgaW4gdHggcmluZyAqLworI2RlZmluZSBSWF9CVUZMRU4JKEVUSF9GUkFNRV9MRU4gKyA4KQorI2RlZmluZSBUWF9USU1FT1VUCUhaCS8qIDEgc2Vjb25kICovCisKKy8qIENoaXAgcmV2IG5lZWRzIHdvcmthcm91bmQgb24gSFcgJiBtdWx0aWNhc3QgYWRkciBjaGFuZ2UgKi8KKyNkZWZpbmUgQlJPS0VOX0FERFJDSEdfUkVWCTB4MDk0MQorCisvKiBCaXRzIGluIHRyYW5zbWl0IERNQSBzdGF0dXMgKi8KKyNkZWZpbmUgVFhfRE1BX0VSUgkweDgwCisKK3N0cnVjdCBtYWNlX2RhdGEgeworICAgIHZvbGF0aWxlIHN0cnVjdCBtYWNlIF9faW9tZW0gKm1hY2U7CisgICAgdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqdHhfZG1hOworICAgIGludCB0eF9kbWFfaW50cjsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpyeF9kbWE7CisgICAgaW50IHJ4X2RtYV9pbnRyOworICAgIHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKnR4X2NtZHM7CS8qIHhtaXQgZG1hIGNvbW1hbmQgbGlzdCAqLworICAgIHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKnJ4X2NtZHM7CS8qIHJlY3YgZG1hIGNvbW1hbmQgbGlzdCAqLworICAgIHN0cnVjdCBza19idWZmICpyeF9idWZzW05fUlhfUklOR107CisgICAgaW50IHJ4X2ZpbGw7CisgICAgaW50IHJ4X2VtcHR5OworICAgIHN0cnVjdCBza19idWZmICp0eF9idWZzW05fVFhfUklOR107CisgICAgaW50IHR4X2ZpbGw7CisgICAgaW50IHR4X2VtcHR5OworICAgIHVuc2lnbmVkIGNoYXIgbWFjY2M7CisgICAgdW5zaWduZWQgY2hhciB0eF9mdWxsdXA7CisgICAgdW5zaWduZWQgY2hhciB0eF9hY3RpdmU7CisgICAgdW5zaWduZWQgY2hhciB0eF9iYWRfcnVudDsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKyAgICBzdHJ1Y3QgdGltZXJfbGlzdCB0eF90aW1lb3V0OworICAgIGludCB0aW1lb3V0X2FjdGl2ZTsKKyAgICBpbnQgcG9ydF9hYXVpOworICAgIGludCBjaGlwaWQ7CisgICAgc3RydWN0IG1hY2lvX2RldiAqbWRldjsKKyAgICBzcGlubG9ja190IGxvY2s7Cit9OworCisvKgorICogTnVtYmVyIG9mIGJ5dGVzIG9mIHByaXZhdGUgZGF0YSBwZXIgTUFDRTogYWxsb3cgZW5vdWdoIGZvcgorICogdGhlIHJ4IGFuZCB0eCBkbWEgY29tbWFuZHMgcGx1cyBhIGJyYW5jaCBkbWEgY29tbWFuZCBlYWNoLAorICogYW5kIGFub3RoZXIgMTYgYnl0ZXMgdG8gYWxsb3cgdXMgdG8gYWxpZ24gdGhlIGRtYSBjb21tYW5kCisgKiBidWZmZXJzIG9uIGEgMTYgYnl0ZSBib3VuZGFyeS4KKyAqLworI2RlZmluZSBQUklWX0JZVEVTCShzaXplb2Yoc3RydWN0IG1hY2VfZGF0YSkgXAorCSsgKE5fUlhfUklORyArIE5DTURTX1RYICogTl9UWF9SSU5HICsgMykgKiBzaXplb2Yoc3RydWN0IGRiZG1hX2NtZCkpCisKK3N0YXRpYyBpbnQgYml0cmV2KGludCk7CitzdGF0aWMgaW50IG1hY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbWFjZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbWFjZV94bWl0X3N0YXJ0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICptYWNlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbWFjZV9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbWFjZV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbWFjZV9zZXRfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBtYWNlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBtYWNlX3R4ZG1hX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaXJxcmV0dXJuX3QgbWFjZV9yeGRtYV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgbWFjZV9zZXRfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG1hY2VfdHhfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIGlubGluZSB2b2lkIGRiZG1hX3Jlc2V0KHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKmRtYSk7CitzdGF0aWMgaW5saW5lIHZvaWQgbWFjZV9jbGVhbl9yaW5ncyhzdHJ1Y3QgbWFjZV9kYXRhICptcCk7CitzdGF0aWMgdm9pZCBfX21hY2Vfc2V0X2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcik7CisKKy8qCisgKiBJZiB3ZSBjYW4ndCBnZXQgYSBza2J1ZmYgd2hlbiB3ZSBuZWVkIGl0LCB3ZSB1c2UgdGhpcyBhcmVhIGZvciBETUEuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpkdW1teV9idWY7CisKKy8qIEJpdC1yZXZlcnNlIG9uZSBieXRlIG9mIGFuIGV0aGVybmV0IGhhcmR3YXJlIGFkZHJlc3MuICovCitzdGF0aWMgaW5saW5lIGludAorYml0cmV2KGludCBiKQoreworICAgIGludCBkID0gMCwgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2ksIGIgPj49IDEpCisJZCA9IChkIDw8IDEpIHwgKGIgJiAxKTsKKyAgICByZXR1cm4gZDsKK30KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtYWNlX3Byb2JlKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2gpCit7CisJc3RydWN0IGRldmljZV9ub2RlICptYWNlID0gbWFjaW9fZ2V0X29mX25vZGUobWRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbWFjZV9kYXRhICptcDsKKwl1bnNpZ25lZCBjaGFyICphZGRyOworCWludCBqLCByZXYsIHJjID0gLUVCVVNZOworCisJaWYgKG1hY2lvX3Jlc291cmNlX2NvdW50KG1kZXYpICE9IDMgfHwgbWFjaW9faXJxX2NvdW50KG1kZXYpICE9IDMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjYW4ndCB1c2UgTUFDRSAlczogbmVlZCAzIGFkZHJzIGFuZCAzIGlycXNcbiIsCisJCSAgICAgICBtYWNlLT5mdWxsX25hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlhZGRyID0gZ2V0X3Byb3BlcnR5KG1hY2UsICJtYWMtYWRkcmVzcyIsIE5VTEwpOworCWlmIChhZGRyID09IE5VTEwpIHsKKwkJYWRkciA9IGdldF9wcm9wZXJ0eShtYWNlLCAibG9jYWwtbWFjLWFkZHJlc3MiLCBOVUxMKTsKKwkJaWYgKGFkZHIgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBnZXQgbWFjLWFkZHJlc3MgZm9yIE1BQ0UgJXNcbiIsCisJCQkgICAgICAgbWFjZS0+ZnVsbF9uYW1lKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJLyoKKwkgKiBsYXp5IGFsbG9jYXRlIHRoZSBkcml2ZXItd2lkZSBkdW1teSBidWZmZXIuIChOb3RlIHRoYXQgd2UKKwkgKiBuZXZlciBoYXZlIG1vcmUgdGhhbiBvbmUgTUFDRSBpbiB0aGUgc3lzdGVtIGFueXdheSkKKwkgKi8KKwlpZiAoZHVtbXlfYnVmID09IE5VTEwpIHsKKwkJZHVtbXlfYnVmID0ga21hbGxvYyhSWF9CVUZMRU4rMiwgR0ZQX0tFUk5FTCk7CisJCWlmIChkdW1teV9idWYgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJNQUNFOiBjb3VsZG4ndCBhbGxvY2F0ZSBkdW1teSBidWZmZXJcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwlpZiAobWFjaW9fcmVxdWVzdF9yZXNvdXJjZXMobWRldiwgIm1hY2UiKSkgeworCQlwcmludGsoS0VSTl9FUlIgIk1BQ0U6IGNhbid0IHJlcXVlc3QgSU8gcmVzb3VyY2VzICFcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KFBSSVZfQllURVMpOworCWlmICghZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAiTUFDRTogY2FuJ3QgYWxsb2NhdGUgZXRoZXJuZXQgZGV2aWNlICFcbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3JlbGVhc2U7CisJfQorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZtZGV2LT5vZmRldi5kZXYpOworCisJbXAgPSBkZXYtPnByaXY7CisJbXAtPm1kZXYgPSBtZGV2OworCW1hY2lvX3NldF9kcnZkYXRhKG1kZXYsIGRldik7CisKKwlkZXYtPmJhc2VfYWRkciA9IG1hY2lvX3Jlc291cmNlX3N0YXJ0KG1kZXYsIDApOworCW1wLT5tYWNlID0gaW9yZW1hcChkZXYtPmJhc2VfYWRkciwgMHgxMDAwKTsKKwlpZiAobXAtPm1hY2UgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIk1BQ0U6IGNhbid0IG1hcCBJTyByZXNvdXJjZXMgIVxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisJZGV2LT5pcnEgPSBtYWNpb19pcnEobWRldiwgMCk7CisKKwlyZXYgPSBhZGRyWzBdID09IDAgJiYgYWRkclsxXSA9PSAweEEwOworCWZvciAoaiA9IDA7IGogPCA2OyArK2opIHsKKwkJZGV2LT5kZXZfYWRkcltqXSA9IHJldj8gYml0cmV2KGFkZHJbal0pOiBhZGRyW2pdOworCX0KKwltcC0+Y2hpcGlkID0gKGluXzgoJm1wLT5tYWNlLT5jaGlwaWRfaGkpIDw8IDgpIHwKKwkJCWluXzgoJm1wLT5tYWNlLT5jaGlwaWRfbG8pOworCQkKKworCW1wID0gKHN0cnVjdCBtYWNlX2RhdGEgKikgZGV2LT5wcml2OworCW1wLT5tYWNjYyA9IEVOWE1UIHwgRU5SQ1Y7CisKKwltcC0+dHhfZG1hID0gaW9yZW1hcChtYWNpb19yZXNvdXJjZV9zdGFydChtZGV2LCAxKSwgMHgxMDAwKTsKKwlpZiAobXAtPnR4X2RtYSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTUFDRTogY2FuJ3QgbWFwIFRYIERNQSByZXNvdXJjZXMgIVxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfdW5tYXBfaW87CisJfQorCW1wLT50eF9kbWFfaW50ciA9IG1hY2lvX2lycShtZGV2LCAxKTsKKworCW1wLT5yeF9kbWEgPSBpb3JlbWFwKG1hY2lvX3Jlc291cmNlX3N0YXJ0KG1kZXYsIDIpLCAweDEwMDApOworCWlmIChtcC0+cnhfZG1hID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNQUNFOiBjYW4ndCBtYXAgUlggRE1BIHJlc291cmNlcyAhXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl91bm1hcF90eF9kbWE7CisJfQorCW1wLT5yeF9kbWFfaW50ciA9IG1hY2lvX2lycShtZGV2LCAyKTsKKworCW1wLT50eF9jbWRzID0gKHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKikgREJETUFfQUxJR04obXAgKyAxKTsKKwltcC0+cnhfY21kcyA9IG1wLT50eF9jbWRzICsgTkNNRFNfVFggKiBOX1RYX1JJTkcgKyAxOworCisJbWVtc2V0KCZtcC0+c3RhdHMsIDAsIHNpemVvZihtcC0+c3RhdHMpKTsKKwltZW1zZXQoKGNoYXIgKikgbXAtPnR4X2NtZHMsIDAsCisJICAgICAgIChOQ01EU19UWCpOX1RYX1JJTkcgKyBOX1JYX1JJTkcgKyAyKSAqIHNpemVvZihzdHJ1Y3QgZGJkbWFfY21kKSk7CisJaW5pdF90aW1lcigmbXAtPnR4X3RpbWVvdXQpOworCXNwaW5fbG9ja19pbml0KCZtcC0+bG9jayk7CisJbXAtPnRpbWVvdXRfYWN0aXZlID0gMDsKKworCWlmIChwb3J0X2FhdWkgPj0gMCkKKwkJbXAtPnBvcnRfYWF1aSA9IHBvcnRfYWF1aTsKKwllbHNlIHsKKwkJLyogQXBwbGUgTmV0d29yayBTZXJ2ZXIgdXNlcyB0aGUgQUFVSSBwb3J0ICovCisJCWlmIChtYWNoaW5lX2lzX2NvbXBhdGlibGUoIkFBUEwsU2hpbmVyRVNCIikpCisJCQltcC0+cG9ydF9hYXVpID0gMTsKKwkJZWxzZSB7CisjaWZkZWYgQ09ORklHX01BQ0VfQUFVSV9QT1JUCisJCQltcC0+cG9ydF9hYXVpID0gMTsKKyNlbHNlCisJCQltcC0+cG9ydF9hYXVpID0gMDsKKyNlbmRpZgkJCQorCQl9CisJfQorCisJZGV2LT5vcGVuID0gbWFjZV9vcGVuOworCWRldi0+c3RvcCA9IG1hY2VfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBtYWNlX3htaXRfc3RhcnQ7CisJZGV2LT5nZXRfc3RhdHMgPSBtYWNlX3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gbWFjZV9zZXRfbXVsdGljYXN0OworCWRldi0+c2V0X21hY19hZGRyZXNzID0gbWFjZV9zZXRfYWRkcmVzczsKKworCS8qCisJICogTW9zdCBvZiB3aGF0IGlzIGJlbG93IGNvdWxkIGJlIG1vdmVkIHRvIG1hY2Vfb3BlbigpCisJICovCisJbWFjZV9yZXNldChkZXYpOworCisJcmMgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgbWFjZV9pbnRlcnJ1cHQsIDAsICJNQUNFIiwgZGV2KTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNQUNFOiBjYW4ndCBnZXQgaXJxICVkXG4iLCBkZXYtPmlycSk7CisJCWdvdG8gZXJyX3VubWFwX3J4X2RtYTsKKwl9CisJcmMgPSByZXF1ZXN0X2lycShtcC0+dHhfZG1hX2ludHIsIG1hY2VfdHhkbWFfaW50ciwgMCwgIk1BQ0UtdHhkbWEiLCBkZXYpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIk1BQ0U6IGNhbid0IGdldCBpcnEgJWRcbiIsIG1hY2UtPmludHJzWzFdLmxpbmUpOworCQlnb3RvIGVycl9mcmVlX2lycTsKKwl9CisJcmMgPSByZXF1ZXN0X2lycShtcC0+cnhfZG1hX2ludHIsIG1hY2VfcnhkbWFfaW50ciwgMCwgIk1BQ0UtcnhkbWEiLCBkZXYpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIk1BQ0U6IGNhbid0IGdldCBpcnEgJWRcbiIsIG1hY2UtPmludHJzWzJdLmxpbmUpOworCQlnb3RvIGVycl9mcmVlX3R4X2lycTsKKwl9CisKKwlyYyA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIk1BQ0U6IENhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCBhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9mcmVlX3J4X2lycTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogTUFDRSBhdCIsIGRldi0+bmFtZSk7CisJZm9yIChqID0gMDsgaiA8IDY7ICsraikgeworCQlwcmludGsoIiVjJS4yeCIsIChqPyAnOic6ICcgJyksIGRldi0+ZGV2X2FkZHJbal0pOworCX0KKwlwcmludGsoIiwgY2hpcCByZXZpc2lvbiAlZC4lZFxuIiwgbXAtPmNoaXBpZCA+PiA4LCBtcC0+Y2hpcGlkICYgMHhmZik7CisKKwlyZXR1cm4gMDsKKyAKKyBlcnJfZnJlZV9yeF9pcnE6CisJZnJlZV9pcnEobWFjaW9faXJxKG1kZXYsIDIpLCBkZXYpOworIGVycl9mcmVlX3R4X2lycToKKwlmcmVlX2lycShtYWNpb19pcnEobWRldiwgMSksIGRldik7CisgZXJyX2ZyZWVfaXJxOgorCWZyZWVfaXJxKG1hY2lvX2lycShtZGV2LCAwKSwgZGV2KTsKKyBlcnJfdW5tYXBfcnhfZG1hOgorCWlvdW5tYXAobXAtPnJ4X2RtYSk7CisgZXJyX3VubWFwX3R4X2RtYToKKwlpb3VubWFwKG1wLT50eF9kbWEpOworIGVycl91bm1hcF9pbzoKKwlpb3VubWFwKG1wLT5tYWNlKTsKKyBlcnJfZnJlZToKKwlmcmVlX25ldGRldihkZXYpOworIGVycl9yZWxlYXNlOgorCW1hY2lvX3JlbGVhc2VfcmVzb3VyY2VzKG1kZXYpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBtYWNlX3JlbW92ZShzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBtYWNpb19nZXRfZHJ2ZGF0YShtZGV2KTsKKwlzdHJ1Y3QgbWFjZV9kYXRhICptcDsKKworCUJVR19PTihkZXYgPT0gTlVMTCk7CisKKwltYWNpb19zZXRfZHJ2ZGF0YShtZGV2LCBOVUxMKTsKKworCW1wID0gZGV2LT5wcml2OworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCWZyZWVfaXJxKG1wLT50eF9kbWFfaW50ciwgZGV2KTsKKwlmcmVlX2lycShtcC0+cnhfZG1hX2ludHIsIGRldik7CisKKwlpb3VubWFwKG1wLT5yeF9kbWEpOworCWlvdW5tYXAobXAtPnR4X2RtYSk7CisJaW91bm1hcChtcC0+bWFjZSk7CisKKwlmcmVlX25ldGRldihkZXYpOworCisJbWFjaW9fcmVsZWFzZV9yZXNvdXJjZXMobWRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGJkbWFfcmVzZXQodm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqZG1hKQoreworICAgIGludCBpOworCisgICAgb3V0X2xlMzIoJmRtYS0+Y29udHJvbCwgKFdBS0V8RkxVU0h8UEFVU0V8UlVOKSA8PCAxNik7CisKKyAgICAvKgorICAgICAqIFllcyB0aGlzIGxvb2tzIHBlY3VsaWFyLCBidXQgYXBwYXJlbnRseSBpdCBuZWVkcyB0byBiZSB0aGlzCisgICAgICogd2F5IG9uIHNvbWUgbWFjaGluZXMuCisgICAgICovCisgICAgZm9yIChpID0gMjAwOyBpID4gMDsgLS1pKQorCWlmIChsZF9sZTMyKCZkbWEtPmNvbnRyb2wpICYgUlVOKQorCSAgICB1ZGVsYXkoMSk7Cit9CisKK3N0YXRpYyB2b2lkIG1hY2VfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgbWFjZV9kYXRhICptcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgbWFjZSBfX2lvbWVtICptYiA9IG1wLT5tYWNlOworICAgIGludCBpOworCisgICAgLyogc29mdC1yZXNldCB0aGUgY2hpcCAqLworICAgIGkgPSAyMDA7CisgICAgd2hpbGUgKC0taSkgeworCW91dF84KCZtYi0+Yml1Y2MsIFNXUlNUKTsKKwlpZiAoaW5fOCgmbWItPmJpdWNjKSAmIFNXUlNUKSB7CisJICAgIHVkZWxheSgxMCk7CisJICAgIGNvbnRpbnVlOworCX0KKwlicmVhazsKKyAgICB9CisgICAgaWYgKCFpKSB7CisJcHJpbnRrKEtFUk5fRVJSICJtYWNlOiBjYW5ub3QgcmVzZXQgY2hpcCFcbiIpOworCXJldHVybjsKKyAgICB9CisKKyAgICBvdXRfOCgmbWItPmltciwgMHhmZik7CS8qIGRpc2FibGUgYWxsIGludHJzIGZvciBub3cgKi8KKyAgICBpID0gaW5fOCgmbWItPmlyKTsKKyAgICBvdXRfOCgmbWItPm1hY2NjLCAwKTsJLyogdHVybiBvZmYgdHgsIHJ4ICovCisKKyAgICBvdXRfOCgmbWItPmJpdWNjLCBYTVRTUF82NCk7CisgICAgb3V0XzgoJm1iLT51dHIsIFJUUkQpOworICAgIG91dF84KCZtYi0+Zmlmb2NjLCBSQ1ZGV18zMiB8IFhNVEZXXzE2IHwgWE1URldVIHwgUkNWRldVIHwgWE1UQlJTVCk7CisgICAgb3V0XzgoJm1iLT54bXRmYywgQVVUT19QQURfWE1JVCk7IC8qIGF1dG8tcGFkIHNob3J0IGZyYW1lcyAqLworICAgIG91dF84KCZtYi0+cmN2ZmMsIDApOworCisgICAgLyogbG9hZCB1cCB0aGUgaGFyZHdhcmUgYWRkcmVzcyAqLworICAgIF9fbWFjZV9zZXRfYWRkcmVzcyhkZXYsIGRldi0+ZGV2X2FkZHIpOworCisgICAgLyogY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgKi8KKyAgICBpZiAobXAtPmNoaXBpZCA9PSBCUk9LRU5fQUREUkNIR19SRVYpCisJb3V0XzgoJm1iLT5pYWMsIExPR0FERFIpOworICAgIGVsc2UgeworCW91dF84KCZtYi0+aWFjLCBBRERSQ0hHIHwgTE9HQUREUik7CisJd2hpbGUgKChpbl84KCZtYi0+aWFjKSAmIEFERFJDSEcpICE9IDApCisJCTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkKKwlvdXRfOCgmbWItPmxhZHJmLCAwKTsKKworICAgIC8qIGRvbmUgY2hhbmdpbmcgYWRkcmVzcyAqLworICAgIGlmIChtcC0+Y2hpcGlkICE9IEJST0tFTl9BRERSQ0hHX1JFVikKKwlvdXRfOCgmbWItPmlhYywgMCk7CisKKyAgICBpZiAobXAtPnBvcnRfYWF1aSkKKyAgICAJb3V0XzgoJm1iLT5wbHNjYywgUE9SVFNFTF9BVUkgKyBFTlBMU0lPKTsKKyAgICBlbHNlCisgICAgCW91dF84KCZtYi0+cGxzY2MsIFBPUlRTRUxfR1BTSSArIEVOUExTSU8pOworfQorCitzdGF0aWMgdm9pZCBfX21hY2Vfc2V0X2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKK3sKKyAgICBzdHJ1Y3QgbWFjZV9kYXRhICptcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgbWFjZSBfX2lvbWVtICptYiA9IG1wLT5tYWNlOworICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBhZGRyOworICAgIGludCBpOworCisgICAgLyogbG9hZCB1cCB0aGUgaGFyZHdhcmUgYWRkcmVzcyAqLworICAgIGlmIChtcC0+Y2hpcGlkID09IEJST0tFTl9BRERSQ0hHX1JFVikKKyAgICAJb3V0XzgoJm1iLT5pYWMsIFBIWUFERFIpOworICAgIGVsc2UgeworICAgIAlvdXRfOCgmbWItPmlhYywgQUREUkNIRyB8IFBIWUFERFIpOworCXdoaWxlICgoaW5fOCgmbWItPmlhYykgJiBBRERSQ0hHKSAhPSAwKQorCSAgICA7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCA2OyArK2kpCisJb3V0XzgoJm1iLT5wYWRyLCBkZXYtPmRldl9hZGRyW2ldID0gcFtpXSk7CisgICAgaWYgKG1wLT5jaGlwaWQgIT0gQlJPS0VOX0FERFJDSEdfUkVWKQorICAgICAgICBvdXRfOCgmbWItPmlhYywgMCk7Cit9CisKK3N0YXRpYyBpbnQgbWFjZV9zZXRfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworICAgIHN0cnVjdCBtYWNlX2RhdGEgKm1wID0gKHN0cnVjdCBtYWNlX2RhdGEgKikgZGV2LT5wcml2OworICAgIHZvbGF0aWxlIHN0cnVjdCBtYWNlIF9faW9tZW0gKm1iID0gbXAtPm1hY2U7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtcC0+bG9jaywgZmxhZ3MpOworCisgICAgX19tYWNlX3NldF9hZGRyZXNzKGRldiwgYWRkcik7CisKKyAgICAvKiBub3RlOiBzZXR0aW5nIEFERFJDSEcgY2xlYXJzIEVOUkNWICovCisgICAgb3V0XzgoJm1iLT5tYWNjYywgbXAtPm1hY2NjKTsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5sb2NrLCBmbGFncyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYWNlX2NsZWFuX3JpbmdzKHN0cnVjdCBtYWNlX2RhdGEgKm1wKQoreworICAgIGludCBpOworCisgICAgLyogZnJlZSBzb21lIHNrYidzICovCisgICAgZm9yIChpID0gMDsgaSA8IE5fUlhfUklORzsgKytpKSB7CisJaWYgKG1wLT5yeF9idWZzW2ldICE9IDApIHsKKwkgICAgZGV2X2tmcmVlX3NrYihtcC0+cnhfYnVmc1tpXSk7CisJICAgIG1wLT5yeF9idWZzW2ldID0gTlVMTDsKKwl9CisgICAgfQorICAgIGZvciAoaSA9IG1wLT50eF9lbXB0eTsgaSAhPSBtcC0+dHhfZmlsbDsgKSB7CisJZGV2X2tmcmVlX3NrYihtcC0+dHhfYnVmc1tpXSk7CisJaWYgKCsraSA+PSBOX1RYX1JJTkcpCisJICAgIGkgPSAwOworICAgIH0KK30KKworc3RhdGljIGludCBtYWNlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgbWFjZV9kYXRhICptcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgbWFjZSBfX2lvbWVtICptYiA9IG1wLT5tYWNlOworICAgIHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKnJkID0gbXAtPnJ4X2RtYTsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICp0ZCA9IG1wLT50eF9kbWE7CisgICAgdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqY3A7CisgICAgaW50IGk7CisgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKyAgICB1bnNpZ25lZCBjaGFyICpkYXRhOworCisgICAgLyogcmVzZXQgdGhlIGNoaXAgKi8KKyAgICBtYWNlX3Jlc2V0KGRldik7CisKKyAgICAvKiBpbml0aWFsaXplIGxpc3Qgb2Ygc2tfYnVmZnMgZm9yIHJlY2VpdmluZyBhbmQgc2V0IHVwIHJlY3YgZG1hICovCisgICAgbWFjZV9jbGVhbl9yaW5ncyhtcCk7CisgICAgbWVtc2V0KChjaGFyICopbXAtPnJ4X2NtZHMsIDAsIE5fUlhfUklORyAqIHNpemVvZihzdHJ1Y3QgZGJkbWFfY21kKSk7CisgICAgY3AgPSBtcC0+cnhfY21kczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTl9SWF9SSU5HIC0gMTsgKytpKSB7CisJc2tiID0gZGV2X2FsbG9jX3NrYihSWF9CVUZMRU4gKyAyKTsKKwlpZiAoc2tiID09IDApIHsKKwkgICAgZGF0YSA9IGR1bW15X2J1ZjsKKwl9IGVsc2UgeworCSAgICBza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBzbyBJUCBoZWFkZXIgbGFuZHMgb24gNC1ieXRlIGJkcnkgKi8KKwkgICAgZGF0YSA9IHNrYi0+ZGF0YTsKKwl9CisJbXAtPnJ4X2J1ZnNbaV0gPSBza2I7CisJc3RfbGUxNigmY3AtPnJlcV9jb3VudCwgUlhfQlVGTEVOKTsKKwlzdF9sZTE2KCZjcC0+Y29tbWFuZCwgSU5QVVRfTEFTVCArIElOVFJfQUxXQVlTKTsKKwlzdF9sZTMyKCZjcC0+cGh5X2FkZHIsIHZpcnRfdG9fYnVzKGRhdGEpKTsKKwljcC0+eGZlcl9zdGF0dXMgPSAwOworCSsrY3A7CisgICAgfQorICAgIG1wLT5yeF9idWZzW2ldID0gTlVMTDsKKyAgICBzdF9sZTE2KCZjcC0+Y29tbWFuZCwgREJETUFfU1RPUCk7CisgICAgbXAtPnJ4X2ZpbGwgPSBpOworICAgIG1wLT5yeF9lbXB0eSA9IDA7CisKKyAgICAvKiBQdXQgYSBicmFuY2ggYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZWNlaXZlIGNvbW1hbmQgbGlzdCAqLworICAgICsrY3A7CisgICAgc3RfbGUxNigmY3AtPmNvbW1hbmQsIERCRE1BX05PUCArIEJSX0FMV0FZUyk7CisgICAgc3RfbGUzMigmY3AtPmNtZF9kZXAsIHZpcnRfdG9fYnVzKG1wLT5yeF9jbWRzKSk7CisKKyAgICAvKiBzdGFydCByeCBkbWEgKi8KKyAgICBvdXRfbGUzMigmcmQtPmNvbnRyb2wsIChSVU58UEFVU0V8RkxVU0h8V0FLRSkgPDwgMTYpOyAvKiBjbGVhciBydW4gYml0ICovCisgICAgb3V0X2xlMzIoJnJkLT5jbWRwdHIsIHZpcnRfdG9fYnVzKG1wLT5yeF9jbWRzKSk7CisgICAgb3V0X2xlMzIoJnJkLT5jb250cm9sLCAoUlVOIDw8IDE2KSB8IFJVTik7CisKKyAgICAvKiBwdXQgYSBicmFuY2ggYXQgdGhlIGVuZCBvZiB0aGUgdHggY29tbWFuZCBsaXN0ICovCisgICAgY3AgPSBtcC0+dHhfY21kcyArIE5DTURTX1RYICogTl9UWF9SSU5HOworICAgIHN0X2xlMTYoJmNwLT5jb21tYW5kLCBEQkRNQV9OT1AgKyBCUl9BTFdBWVMpOworICAgIHN0X2xlMzIoJmNwLT5jbWRfZGVwLCB2aXJ0X3RvX2J1cyhtcC0+dHhfY21kcykpOworCisgICAgLyogcmVzZXQgdHggZG1hICovCisgICAgb3V0X2xlMzIoJnRkLT5jb250cm9sLCAoUlVOfFBBVVNFfEZMVVNIfFdBS0UpIDw8IDE2KTsKKyAgICBvdXRfbGUzMigmdGQtPmNtZHB0ciwgdmlydF90b19idXMobXAtPnR4X2NtZHMpKTsKKyAgICBtcC0+dHhfZmlsbCA9IDA7CisgICAgbXAtPnR4X2VtcHR5ID0gMDsKKyAgICBtcC0+dHhfZnVsbHVwID0gMDsKKyAgICBtcC0+dHhfYWN0aXZlID0gMDsKKyAgICBtcC0+dHhfYmFkX3J1bnQgPSAwOworCisgICAgLyogdHVybiBpdCBvbiEgKi8KKyAgICBvdXRfOCgmbWItPm1hY2NjLCBtcC0+bWFjY2MpOworICAgIC8qIGVuYWJsZSBhbGwgaW50ZXJydXB0cyBleGNlcHQgcmVjZWl2ZSBpbnRlcnJ1cHRzICovCisgICAgb3V0XzgoJm1iLT5pbXIsIFJDVklOVCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWNlX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IG1hY2VfZGF0YSAqbXAgPSAoc3RydWN0IG1hY2VfZGF0YSAqKSBkZXYtPnByaXY7CisgICAgdm9sYXRpbGUgc3RydWN0IG1hY2UgX19pb21lbSAqbWIgPSBtcC0+bWFjZTsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpyZCA9IG1wLT5yeF9kbWE7CisgICAgdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqdGQgPSBtcC0+dHhfZG1hOworCisgICAgLyogZGlzYWJsZSByeCBhbmQgdHggKi8KKyAgICBvdXRfOCgmbWItPm1hY2NjLCAwKTsKKyAgICBvdXRfOCgmbWItPmltciwgMHhmZik7CQkvKiBkaXNhYmxlIGFsbCBpbnRycyAqLworCisgICAgLyogZGlzYWJsZSByeCBhbmQgdHggZG1hICovCisgICAgc3RfbGUzMigmcmQtPmNvbnRyb2wsIChSVU58UEFVU0V8RkxVU0h8V0FLRSkgPDwgMTYpOyAvKiBjbGVhciBydW4gYml0ICovCisgICAgc3RfbGUzMigmdGQtPmNvbnRyb2wsIChSVU58UEFVU0V8RkxVU0h8V0FLRSkgPDwgMTYpOyAvKiBjbGVhciBydW4gYml0ICovCisKKyAgICBtYWNlX2NsZWFuX3JpbmdzKG1wKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWFjZV9zZXRfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBtYWNlX2RhdGEgKm1wID0gKHN0cnVjdCBtYWNlX2RhdGEgKikgZGV2LT5wcml2OworCisgICAgaWYgKG1wLT50aW1lb3V0X2FjdGl2ZSkKKwlkZWxfdGltZXIoJm1wLT50eF90aW1lb3V0KTsKKyAgICBtcC0+dHhfdGltZW91dC5leHBpcmVzID0gamlmZmllcyArIFRYX1RJTUVPVVQ7CisgICAgbXAtPnR4X3RpbWVvdXQuZnVuY3Rpb24gPSBtYWNlX3R4X3RpbWVvdXQ7CisgICAgbXAtPnR4X3RpbWVvdXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisgICAgYWRkX3RpbWVyKCZtcC0+dHhfdGltZW91dCk7CisgICAgbXAtPnRpbWVvdXRfYWN0aXZlID0gMTsKK30KKworc3RhdGljIGludCBtYWNlX3htaXRfc3RhcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgbWFjZV9kYXRhICptcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICp0ZCA9IG1wLT50eF9kbWE7CisgICAgdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqY3AsICpucDsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGludCBmaWxsLCBuZXh0LCBsZW47CisKKyAgICAvKiBzZWUgaWYgdGhlcmUncyBhIGZyZWUgc2xvdCBpbiB0aGUgdHggcmluZyAqLworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtcC0+bG9jaywgZmxhZ3MpOworICAgIGZpbGwgPSBtcC0+dHhfZmlsbDsKKyAgICBuZXh0ID0gZmlsbCArIDE7CisgICAgaWYgKG5leHQgPj0gTl9UWF9SSU5HKQorCW5leHQgPSAwOworICAgIGlmIChuZXh0ID09IG1wLT50eF9lbXB0eSkgeworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwltcC0+dHhfZnVsbHVwID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcC0+bG9jaywgZmxhZ3MpOworCXJldHVybiAxOwkJLyogY2FuJ3QgdGFrZSBpdCBhdCB0aGUgbW9tZW50ICovCisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5sb2NrLCBmbGFncyk7CisKKyAgICAvKiBwYXJ0aWFsbHkgZmlsbCBpbiB0aGUgZG1hIGNvbW1hbmQgYmxvY2sgKi8KKyAgICBsZW4gPSBza2ItPmxlbjsKKyAgICBpZiAobGVuID4gRVRIX0ZSQU1FX0xFTikgeworCXByaW50ayhLRVJOX0RFQlVHICJtYWNlOiB4bWl0IGZyYW1lIHRvbyBsb25nICglZClcbiIsIGxlbik7CisJbGVuID0gRVRIX0ZSQU1FX0xFTjsKKyAgICB9CisgICAgbXAtPnR4X2J1ZnNbZmlsbF0gPSBza2I7CisgICAgY3AgPSBtcC0+dHhfY21kcyArIE5DTURTX1RYICogZmlsbDsKKyAgICBzdF9sZTE2KCZjcC0+cmVxX2NvdW50LCBsZW4pOworICAgIHN0X2xlMzIoJmNwLT5waHlfYWRkciwgdmlydF90b19idXMoc2tiLT5kYXRhKSk7CisKKyAgICBucCA9IG1wLT50eF9jbWRzICsgTkNNRFNfVFggKiBuZXh0OworICAgIG91dF9sZTE2KCZucC0+Y29tbWFuZCwgREJETUFfU1RPUCk7CisKKyAgICAvKiBwb2tlIHRoZSB0eCBkbWEgY2hhbm5lbCAqLworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtcC0+bG9jaywgZmxhZ3MpOworICAgIG1wLT50eF9maWxsID0gbmV4dDsKKyAgICBpZiAoIW1wLT50eF9iYWRfcnVudCAmJiBtcC0+dHhfYWN0aXZlIDwgTUFYX1RYX0FDVElWRSkgeworCW91dF9sZTE2KCZjcC0+eGZlcl9zdGF0dXMsIDApOworCW91dF9sZTE2KCZjcC0+Y29tbWFuZCwgT1VUUFVUX0xBU1QpOworCW91dF9sZTMyKCZ0ZC0+Y29udHJvbCwgKChSVU58V0FLRSkgPDwgMTYpICsgKFJVTnxXQUtFKSk7CisJKyttcC0+dHhfYWN0aXZlOworCW1hY2Vfc2V0X3RpbWVvdXQoZGV2KTsKKyAgICB9CisgICAgaWYgKCsrbmV4dCA+PSBOX1RYX1JJTkcpCisJbmV4dCA9IDA7CisgICAgaWYgKG5leHQgPT0gbXAtPnR4X2VtcHR5KQorCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcC0+bG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbWFjZV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBtYWNlX2RhdGEgKnAgPSAoc3RydWN0IG1hY2VfZGF0YSAqKSBkZXYtPnByaXY7CisKKyAgICByZXR1cm4gJnAtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCBtYWNlX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgbWFjZV9kYXRhICptcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgbWFjZSBfX2lvbWVtICptYiA9IG1wLT5tYWNlOworICAgIGludCBpLCBqOworICAgIHUzMiBjcmM7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtcC0+bG9jaywgZmxhZ3MpOworICAgIG1wLT5tYWNjYyAmPSB+UFJPTTsKKyAgICBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJbXAtPm1hY2NjIHw9IFBST007CisgICAgfSBlbHNlIHsKKwl1bnNpZ25lZCBjaGFyIG11bHRpY2FzdF9maWx0ZXJbOF07CisJc3RydWN0IGRldl9tY19saXN0ICpkbWkgPSBkZXYtPm1jX2xpc3Q7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCSAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQltdWx0aWNhc3RfZmlsdGVyW2ldID0gMHhmZjsKKwl9IGVsc2UgeworCSAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQltdWx0aWNhc3RfZmlsdGVyW2ldID0gMDsKKwkgICAgZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKykgeworCSAgICAgICAgY3JjID0gZXRoZXJfY3JjX2xlKDYsIGRtaS0+ZG1pX2FkZHIpOworCQlqID0gY3JjID4+IDI2OwkvKiBiaXQgbnVtYmVyIGluIG11bHRpY2FzdF9maWx0ZXIgKi8KKwkJbXVsdGljYXN0X2ZpbHRlcltqID4+IDNdIHw9IDEgPDwgKGogJiA3KTsKKwkJZG1pID0gZG1pLT5uZXh0OworCSAgICB9CisJfQorI2lmIDAKKwlwcmludGsoIk11bHRpY2FzdCBmaWx0ZXIgOiIpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJICAgIHByaW50aygiJTAyeCAiLCBtdWx0aWNhc3RfZmlsdGVyW2ldKTsKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKworCWlmIChtcC0+Y2hpcGlkID09IEJST0tFTl9BRERSQ0hHX1JFVikKKwkgICAgb3V0XzgoJm1iLT5pYWMsIExPR0FERFIpOworCWVsc2UgeworCSAgICBvdXRfOCgmbWItPmlhYywgQUREUkNIRyB8IExPR0FERFIpOworCSAgICB3aGlsZSAoKGluXzgoJm1iLT5pYWMpICYgQUREUkNIRykgIT0gMCkKKwkJOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgODsgKytpKQorCSAgICBvdXRfOCgmbWItPmxhZHJmLCBtdWx0aWNhc3RfZmlsdGVyW2ldKTsKKwlpZiAobXAtPmNoaXBpZCAhPSBCUk9LRU5fQUREUkNIR19SRVYpCisJICAgIG91dF84KCZtYi0+aWFjLCAwKTsKKyAgICB9CisgICAgLyogcmVzZXQgbWFjY2MgKi8KKyAgICBvdXRfOCgmbWItPm1hY2NjLCBtcC0+bWFjY2MpOworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG1hY2VfaGFuZGxlX21pc2NfaW50cnMoc3RydWN0IG1hY2VfZGF0YSAqbXAsIGludCBpbnRyKQoreworICAgIHZvbGF0aWxlIHN0cnVjdCBtYWNlIF9faW9tZW0gKm1iID0gbXAtPm1hY2U7CisgICAgc3RhdGljIGludCBtYWNlX2JhYmJsZXMsIG1hY2VfamFiYmVyczsKKworICAgIGlmIChpbnRyICYgTVBDTykKKwltcC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSAyNTY7CisgICAgbXAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gaW5fOCgmbWItPm1wYyk7ICAgLyogcmVhZGluZyBjbGVhcnMgaXQgKi8KKyAgICBpZiAoaW50ciAmIFJOVFBDTykKKwltcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyArPSAyNTY7CisgICAgbXAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgKz0gaW5fOCgmbWItPnJudHBjKTsgLyogcmVhZGluZyBjbGVhcnMgaXQgKi8KKyAgICBpZiAoaW50ciAmIENFUlIpCisJKyttcC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9yczsKKyAgICBpZiAoaW50ciAmIEJBQkJMRSkKKwlpZiAobWFjZV9iYWJibGVzKysgPCA0KQorCSAgICBwcmludGsoS0VSTl9ERUJVRyAibWFjZTogYmFiYmxpbmcgdHJhbnNtaXR0ZXJcbiIpOworICAgIGlmIChpbnRyICYgSkFCQkVSKQorCWlmIChtYWNlX2phYmJlcnMrKyA8IDQpCisJICAgIHByaW50ayhLRVJOX0RFQlVHICJtYWNlOiBqYWJiZXJpbmcgdHJhbnNjZWl2ZXJcbiIpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbWFjZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKyAgICBzdHJ1Y3QgbWFjZV9kYXRhICptcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgbWFjZSBfX2lvbWVtICptYiA9IG1wLT5tYWNlOworICAgIHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKnRkID0gbXAtPnR4X2RtYTsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICpjcDsKKyAgICBpbnQgaW50ciwgZnMsIGksIHN0YXQsIHg7CisgICAgaW50IHhjb3VudCwgZHN0YXQ7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAvKiBzdGF0aWMgaW50IG1hY2VfbGFzdF9mcywgbWFjZV9sYXN0X3hjb3VudDsgKi8KKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtcC0+bG9jaywgZmxhZ3MpOworICAgIGludHIgPSBpbl84KCZtYi0+aXIpOwkJLyogcmVhZCBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KKyAgICBpbl84KCZtYi0+eG10cmMpOwkJCS8qIGdldCByZXRyaWVzICovCisgICAgbWFjZV9oYW5kbGVfbWlzY19pbnRycyhtcCwgaW50cik7CisKKyAgICBpID0gbXAtPnR4X2VtcHR5OworICAgIHdoaWxlIChpbl84KCZtYi0+cHIpICYgWE1UU1YpIHsKKwlkZWxfdGltZXIoJm1wLT50eF90aW1lb3V0KTsKKwltcC0+dGltZW91dF9hY3RpdmUgPSAwOworCS8qCisJICogQ2xlYXIgYW55IGludGVycnVwdCBpbmRpY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0YXR1cworCSAqIHdvcmQuICBUaGlzIGFwcGVhcnMgdG8gdW5sYXRjaCBhbnkgZXJyb3IgaW5kaWNhdGlvbiBmcm9tCisJICogdGhlIERNQSBjb250cm9sbGVyLgorCSAqLworCWludHIgPSBpbl84KCZtYi0+aXIpOworCWlmIChpbnRyICE9IDApCisJICAgIG1hY2VfaGFuZGxlX21pc2NfaW50cnMobXAsIGludHIpOworCWlmIChtcC0+dHhfYmFkX3J1bnQpIHsKKwkgICAgZnMgPSBpbl84KCZtYi0+eG10ZnMpOworCSAgICBtcC0+dHhfYmFkX3J1bnQgPSAwOworCSAgICBvdXRfOCgmbWItPnhtdGZjLCBBVVRPX1BBRF9YTUlUKTsKKwkgICAgY29udGludWU7CisJfQorCWRzdGF0ID0gbGRfbGUzMigmdGQtPnN0YXR1cyk7CisJLyogc3RvcCBETUEgY29udHJvbGxlciAqLworCW91dF9sZTMyKCZ0ZC0+Y29udHJvbCwgUlVOIDw8IDE2KTsKKwkvKgorCSAqIHhjb3VudCBpcyB0aGUgbnVtYmVyIG9mIGNvbXBsZXRlIGZyYW1lcyB3aGljaCBoYXZlIGJlZW4KKwkgKiB3cml0dGVuIHRvIHRoZSBmaWZvIGJ1dCBmb3Igd2hpY2ggc3RhdHVzIGhhcyBub3QgYmVlbiByZWFkLgorCSAqLworCXhjb3VudCA9IChpbl84KCZtYi0+Zmlmb2ZjKSA+PiBYTVRGQ19TSCkgJiBYTVRGQ19NQVNLOworCWlmICh4Y291bnQgPT0gMCB8fCAoZHN0YXQgJiBERUFEKSkgeworCSAgICAvKgorCSAgICAgKiBJZiBhIHBhY2tldCB3YXMgYWJvcnRlZCBiZWZvcmUgdGhlIERNQSBjb250cm9sbGVyIGhhcworCSAgICAgKiBmaW5pc2hlZCB0cmFuc2ZlcnJpbmcgaXQsIGl0IHNlZW1zIHRoYXQgdGhlcmUgYXJlIDIgYnl0ZXMKKwkgICAgICogd2hpY2ggYXJlIHN0dWNrIGluIHNvbWUgYnVmZmVyIHNvbWV3aGVyZS4gIFRoZXNlIHdpbGwgZ2V0CisJICAgICAqIHRyYW5zbWl0dGVkIGFzIHNvb24gYXMgd2UgcmVhZCB0aGUgZnJhbWUgc3RhdHVzICh3aGljaAorCSAgICAgKiByZWVuYWJsZXMgdGhlIHRyYW5zbWl0IGRhdGEgdHJhbnNmZXIgcmVxdWVzdCkuICBUdXJuaW5nCisJICAgICAqIG9mZiB0aGUgRE1BIGNvbnRyb2xsZXIgYW5kL29yIHJlc2V0dGluZyB0aGUgTUFDRSBkb2Vzbid0CisJICAgICAqIGhlbHAuICBTbyB3ZSBkaXNhYmxlIGF1dG8tcGFkZGluZyBhbmQgRkNTIHRyYW5zbWlzc2lvbgorCSAgICAgKiBzbyB0aGUgdHdvIGJ5dGVzIHdpbGwgb25seSBiZSBhIHJ1bnQgcGFja2V0IHdoaWNoIHNob3VsZAorCSAgICAgKiBiZSBpZ25vcmVkIGJ5IG90aGVyIHN0YXRpb25zLgorCSAgICAgKi8KKwkgICAgb3V0XzgoJm1iLT54bXRmYywgRFhNVEZDUyk7CisJfQorCWZzID0gaW5fOCgmbWItPnhtdGZzKTsKKwlpZiAoKGZzICYgWE1UU1YpID09IDApIHsKKwkgICAgcHJpbnRrKEtFUk5fRVJSICJtYWNlOiB4bXRmcyBub3QgdmFsaWQhIChmcz0leCB4Yz0lZCBkcz0leClcbiIsCisJCSAgIGZzLCB4Y291bnQsIGRzdGF0KTsKKwkgICAgbWFjZV9yZXNldChkZXYpOworCQkvKgorCQkgKiBYWFggbWFjZSBsaWtlcyB0byBoYW5nIHRoZSBtYWNoaW5lIGFmdGVyIGEgeG10ZnMgZXJyb3IuCisJCSAqIFRoaXMgaXMgaGFyZCB0byByZXByb2R1Y2UsIHJlc2V0aW5nICptYXkqIGhlbHAKKwkJICovCisJfQorCWNwID0gbXAtPnR4X2NtZHMgKyBOQ01EU19UWCAqIGk7CisJc3RhdCA9IGxkX2xlMTYoJmNwLT54ZmVyX3N0YXR1cyk7CisJaWYgKChmcyAmIChVRkxPfExDT0x8TENBUnxSVFJZKSkgfHwgKGRzdGF0ICYgREVBRCkgfHwgeGNvdW50ID09IDApIHsKKwkgICAgLyoKKwkgICAgICogQ2hlY2sgd2hldGhlciB0aGVyZSB3ZXJlIGluIGZhY3QgMiBieXRlcyB3cml0dGVuIHRvCisJICAgICAqIHRoZSB0cmFuc21pdCBGSUZPLgorCSAgICAgKi8KKwkgICAgdWRlbGF5KDEpOworCSAgICB4ID0gKGluXzgoJm1iLT5maWZvZmMpID4+IFhNVEZDX1NIKSAmIFhNVEZDX01BU0s7CisJICAgIGlmICh4ICE9IDApIHsKKwkJLyogdGhlcmUgd2VyZSB0d28gYnl0ZXMgd2l0aCBhbiBlbmQtb2YtcGFja2V0IGluZGljYXRpb24gKi8KKwkJbXAtPnR4X2JhZF9ydW50ID0gMTsKKwkJbWFjZV9zZXRfdGltZW91dChkZXYpOworCSAgICB9IGVsc2UgeworCQkvKgorCQkgKiBFaXRoZXIgdGhlcmUgd2VyZW4ndCB0aGUgdHdvIGJ5dGVzIGJ1ZmZlcmVkIHVwLCBvciB0aGV5CisJCSAqIGRpZG4ndCBoYXZlIGFuIGVuZC1vZi1wYWNrZXQgaW5kaWNhdGlvbi4KKwkJICogV2UgZmx1c2ggdGhlIHRyYW5zbWl0IEZJRk8ganVzdCBpbiBjYXNlIChieSBzZXR0aW5nIHRoZQorCQkgKiBYTVRGV1UgYml0IHdpdGggdGhlIHRyYW5zbWl0dGVyIGRpc2FibGVkKS4KKwkJICovCisJCW91dF84KCZtYi0+bWFjY2MsIGluXzgoJm1iLT5tYWNjYykgJiB+RU5YTVQpOworCQlvdXRfOCgmbWItPmZpZm9jYywgaW5fOCgmbWItPmZpZm9jYykgfCBYTVRGV1UpOworCQl1ZGVsYXkoMSk7CisJCW91dF84KCZtYi0+bWFjY2MsIGluXzgoJm1iLT5tYWNjYykgfCBFTlhNVCk7CisJCW91dF84KCZtYi0+eG10ZmMsIEFVVE9fUEFEX1hNSVQpOworCSAgICB9CisJfQorCS8qIGRtYSBzaG91bGQgaGF2ZSBmaW5pc2hlZCAqLworCWlmIChpID09IG1wLT50eF9maWxsKSB7CisJICAgIHByaW50ayhLRVJOX0RFQlVHICJtYWNlOiB0eCByaW5nIHJhbiBvdXQ/IChmcz0leCB4Yz0lZCBkcz0leClcbiIsCisJCSAgIGZzLCB4Y291bnQsIGRzdGF0KTsKKwkgICAgY29udGludWU7CisJfQorCS8qIFVwZGF0ZSBzdGF0cyAqLworCWlmIChmcyAmIChVRkxPfExDT0x8TENBUnxSVFJZKSkgeworCSAgICArK21wLT5zdGF0cy50eF9lcnJvcnM7CisJICAgIGlmIChmcyAmIExDQVIpCisJCSsrbXAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzOworCSAgICBpZiAoZnMgJiAoVUZMT3xMQ09MfFJUUlkpKQorCQkrK21wLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9yczsKKwl9IGVsc2UgeworCSAgICBtcC0+c3RhdHMudHhfYnl0ZXMgKz0gbXAtPnR4X2J1ZnNbaV0tPmxlbjsKKwkgICAgKyttcC0+c3RhdHMudHhfcGFja2V0czsKKwl9CisJZGV2X2tmcmVlX3NrYl9pcnEobXAtPnR4X2J1ZnNbaV0pOworCS0tbXAtPnR4X2FjdGl2ZTsKKwlpZiAoKytpID49IE5fVFhfUklORykKKwkgICAgaSA9IDA7CisjaWYgMAorCW1hY2VfbGFzdF9mcyA9IGZzOworCW1hY2VfbGFzdF94Y291bnQgPSB4Y291bnQ7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAoaSAhPSBtcC0+dHhfZW1wdHkpIHsKKwltcC0+dHhfZnVsbHVwID0gMDsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisgICAgfQorICAgIG1wLT50eF9lbXB0eSA9IGk7CisgICAgaSArPSBtcC0+dHhfYWN0aXZlOworICAgIGlmIChpID49IE5fVFhfUklORykKKwlpIC09IE5fVFhfUklORzsKKyAgICBpZiAoIW1wLT50eF9iYWRfcnVudCAmJiBpICE9IG1wLT50eF9maWxsICYmIG1wLT50eF9hY3RpdmUgPCBNQVhfVFhfQUNUSVZFKSB7CisJZG8geworCSAgICAvKiBzZXQgdXAgdGhlIG5leHQgb25lICovCisJICAgIGNwID0gbXAtPnR4X2NtZHMgKyBOQ01EU19UWCAqIGk7CisJICAgIG91dF9sZTE2KCZjcC0+eGZlcl9zdGF0dXMsIDApOworCSAgICBvdXRfbGUxNigmY3AtPmNvbW1hbmQsIE9VVFBVVF9MQVNUKTsKKwkgICAgKyttcC0+dHhfYWN0aXZlOworCSAgICBpZiAoKytpID49IE5fVFhfUklORykKKwkJaSA9IDA7CisJfSB3aGlsZSAoaSAhPSBtcC0+dHhfZmlsbCAmJiBtcC0+dHhfYWN0aXZlIDwgTUFYX1RYX0FDVElWRSk7CisJb3V0X2xlMzIoJnRkLT5jb250cm9sLCAoKFJVTnxXQUtFKSA8PCAxNikgKyAoUlVOfFdBS0UpKTsKKwltYWNlX3NldF90aW1lb3V0KGRldik7CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5sb2NrLCBmbGFncyk7CisgICAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBtYWNlX3R4X3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKKyAgICBzdHJ1Y3QgbWFjZV9kYXRhICptcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgbWFjZSBfX2lvbWVtICptYiA9IG1wLT5tYWNlOworICAgIHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKnRkID0gbXAtPnR4X2RtYTsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpyZCA9IG1wLT5yeF9kbWE7CisgICAgdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqY3A7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBpbnQgaTsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtcC0+bG9jaywgZmxhZ3MpOworICAgIG1wLT50aW1lb3V0X2FjdGl2ZSA9IDA7CisgICAgaWYgKG1wLT50eF9hY3RpdmUgPT0gMCAmJiAhbXAtPnR4X2JhZF9ydW50KQorCWdvdG8gb3V0OworCisgICAgLyogdXBkYXRlIHZhcmlvdXMgY291bnRlcnMgKi8KKyAgICBtYWNlX2hhbmRsZV9taXNjX2ludHJzKG1wLCBpbl84KCZtYi0+aXIpKTsKKworICAgIGNwID0gbXAtPnR4X2NtZHMgKyBOQ01EU19UWCAqIG1wLT50eF9lbXB0eTsKKworICAgIC8qIHR1cm4gb2ZmIGJvdGggdHggYW5kIHJ4IGFuZCByZXNldCB0aGUgY2hpcCAqLworICAgIG91dF84KCZtYi0+bWFjY2MsIDApOworICAgIHByaW50ayhLRVJOX0VSUiAibWFjZTogdHJhbnNtaXQgdGltZW91dCAtIHJlc2V0dGluZ1xuIik7CisgICAgZGJkbWFfcmVzZXQodGQpOworICAgIG1hY2VfcmVzZXQoZGV2KTsKKworICAgIC8qIHJlc3RhcnQgcnggZG1hICovCisgICAgY3AgPSBidXNfdG9fdmlydChsZF9sZTMyKCZyZC0+Y21kcHRyKSk7CisgICAgZGJkbWFfcmVzZXQocmQpOworICAgIG91dF9sZTE2KCZjcC0+eGZlcl9zdGF0dXMsIDApOworICAgIG91dF9sZTMyKCZyZC0+Y21kcHRyLCB2aXJ0X3RvX2J1cyhjcCkpOworICAgIG91dF9sZTMyKCZyZC0+Y29udHJvbCwgKFJVTiA8PCAxNikgfCBSVU4pOworCisgICAgLyogZml4IHVwIHRoZSB0cmFuc21pdCBzaWRlICovCisgICAgaSA9IG1wLT50eF9lbXB0eTsKKyAgICBtcC0+dHhfYWN0aXZlID0gMDsKKyAgICArK21wLT5zdGF0cy50eF9lcnJvcnM7CisgICAgaWYgKG1wLT50eF9iYWRfcnVudCkgeworCW1wLT50eF9iYWRfcnVudCA9IDA7CisgICAgfSBlbHNlIGlmIChpICE9IG1wLT50eF9maWxsKSB7CisJZGV2X2tmcmVlX3NrYihtcC0+dHhfYnVmc1tpXSk7CisJaWYgKCsraSA+PSBOX1RYX1JJTkcpCisJICAgIGkgPSAwOworCW1wLT50eF9lbXB0eSA9IGk7CisgICAgfQorICAgIG1wLT50eF9mdWxsdXAgPSAwOworICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKKyAgICBpZiAoaSAhPSBtcC0+dHhfZmlsbCkgeworCWNwID0gbXAtPnR4X2NtZHMgKyBOQ01EU19UWCAqIGk7CisJb3V0X2xlMTYoJmNwLT54ZmVyX3N0YXR1cywgMCk7CisJb3V0X2xlMTYoJmNwLT5jb21tYW5kLCBPVVRQVVRfTEFTVCk7CisJb3V0X2xlMzIoJnRkLT5jbWRwdHIsIHZpcnRfdG9fYnVzKGNwKSk7CisJb3V0X2xlMzIoJnRkLT5jb250cm9sLCAoUlVOIDw8IDE2KSB8IFJVTik7CisJKyttcC0+dHhfYWN0aXZlOworCW1hY2Vfc2V0X3RpbWVvdXQoZGV2KTsKKyAgICB9CisKKyAgICAvKiB0dXJuIGl0IGJhY2sgb24gKi8KKyAgICBvdXRfOCgmbWItPmltciwgUkNWSU5UKTsKKyAgICBvdXRfOCgmbWItPm1hY2NjLCBtcC0+bWFjY2MpOworCitvdXQ6CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlycXJldHVybl90IG1hY2VfdHhkbWFfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IG1hY2VfcnhkbWFfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworICAgIHN0cnVjdCBtYWNlX2RhdGEgKm1wID0gKHN0cnVjdCBtYWNlX2RhdGEgKikgZGV2LT5wcml2OworICAgIHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKnJkID0gbXAtPnJ4X2RtYTsKKyAgICB2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICpjcCwgKm5wOworICAgIGludCBpLCBuYiwgc3RhdCwgbmV4dDsKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworICAgIHVuc2lnbmVkIGZyYW1lX3N0YXR1czsKKyAgICBzdGF0aWMgaW50IG1hY2VfbG9zdF9zdGF0dXM7CisgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1wLT5sb2NrLCBmbGFncyk7CisgICAgZm9yIChpID0gbXAtPnJ4X2VtcHR5OyBpICE9IG1wLT5yeF9maWxsOyApIHsKKwljcCA9IG1wLT5yeF9jbWRzICsgaTsKKwlzdGF0ID0gbGRfbGUxNigmY3AtPnhmZXJfc3RhdHVzKTsKKwlpZiAoKHN0YXQgJiBBQ1RJVkUpID09IDApIHsKKwkgICAgbmV4dCA9IGkgKyAxOworCSAgICBpZiAobmV4dCA+PSBOX1JYX1JJTkcpCisJCW5leHQgPSAwOworCSAgICBucCA9IG1wLT5yeF9jbWRzICsgbmV4dDsKKwkgICAgaWYgKG5leHQgIT0gbXAtPnJ4X2ZpbGwKKwkJJiYgKGxkX2xlMTYoJm5wLT54ZmVyX3N0YXR1cykgJiBBQ1RJVkUpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIm1hY2U6IGxvc3QgYSBzdGF0dXMgd29yZFxuIik7CisJCSsrbWFjZV9sb3N0X3N0YXR1czsKKwkgICAgfSBlbHNlCisJCWJyZWFrOworCX0KKwluYiA9IGxkX2xlMTYoJmNwLT5yZXFfY291bnQpIC0gbGRfbGUxNigmY3AtPnJlc19jb3VudCk7CisJb3V0X2xlMTYoJmNwLT5jb21tYW5kLCBEQkRNQV9TVE9QKTsKKwkvKiBnb3QgYSBwYWNrZXQsIGhhdmUgYSBsb29rIGF0IGl0ICovCisJc2tiID0gbXAtPnJ4X2J1ZnNbaV07CisJaWYgKHNrYiA9PSAwKSB7CisJICAgICsrbXAtPnN0YXRzLnJ4X2Ryb3BwZWQ7CisJfSBlbHNlIGlmIChuYiA+IDgpIHsKKwkgICAgZGF0YSA9IHNrYi0+ZGF0YTsKKwkgICAgZnJhbWVfc3RhdHVzID0gKGRhdGFbbmItM10gPDwgOCkgKyBkYXRhW25iLTRdOworCSAgICBpZiAoZnJhbWVfc3RhdHVzICYgKFJTX09GTE98UlNfQ0xTTnxSU19GUkFNRVJSfFJTX0ZDU0VSUikpIHsKKwkJKyttcC0+c3RhdHMucnhfZXJyb3JzOworCQlpZiAoZnJhbWVfc3RhdHVzICYgUlNfT0ZMTykKKwkJICAgICsrbXAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzOworCQlpZiAoZnJhbWVfc3RhdHVzICYgUlNfRlJBTUVSUikKKwkJICAgICsrbXAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9yczsKKwkJaWYgKGZyYW1lX3N0YXR1cyAmIFJTX0ZDU0VSUikKKwkJICAgICsrbXAtPnN0YXRzLnJ4X2NyY19lcnJvcnM7CisJICAgIH0gZWxzZSB7CisJCS8qIE1hY2UgZmVhdHVyZSBBVVRPX1NUUklQX1JDViBpcyBvbiBieSBkZWZhdWx0LCBkcm9wcGluZyB0aGUKKwkJICogRkNTIG9uIGZyYW1lcyB3aXRoIDgwMi4zIGhlYWRlcnMuIFRoaXMgbWVhbnMgdGhhdCBFdGhlcm5ldAorCQkgKiBmcmFtZXMgaGF2ZSA4IGV4dHJhIG9jdGV0cyBhdCB0aGUgZW5kLCB3aGlsZSA4MDIuMyBmcmFtZXMKKwkJICogaGF2ZSBvbmx5IDQuIFdlIG5lZWQgdG8gY29ycmVjdGx5IGFjY291bnQgZm9yIHRoaXMuICovCisJCWlmICgqKHVuc2lnbmVkIHNob3J0ICopKGRhdGErMTIpIDwgMTUzNikgLyogODAyLjMgaGVhZGVyICovCisJCSAgICBuYiAtPSA0OworCQllbHNlCS8qIEV0aGVybmV0IGhlYWRlcjsgbWFjZSBpbmNsdWRlcyBGQ1MgKi8KKwkJICAgIG5iIC09IDg7CisJCXNrYl9wdXQoc2tiLCBuYik7CisJCXNrYi0+ZGV2ID0gZGV2OworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQltcC0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCW5ldGlmX3J4KHNrYik7CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCW1wLT5yeF9idWZzW2ldID0gTlVMTDsKKwkJKyttcC0+c3RhdHMucnhfcGFja2V0czsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgICsrbXAtPnN0YXRzLnJ4X2Vycm9yczsKKwkgICAgKyttcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKKwl9CisKKwkvKiBhZHZhbmNlIHRvIG5leHQgKi8KKwlpZiAoKytpID49IE5fUlhfUklORykKKwkgICAgaSA9IDA7CisgICAgfQorICAgIG1wLT5yeF9lbXB0eSA9IGk7CisKKyAgICBpID0gbXAtPnJ4X2ZpbGw7CisgICAgZm9yICg7OykgeworCW5leHQgPSBpICsgMTsKKwlpZiAobmV4dCA+PSBOX1JYX1JJTkcpCisJICAgIG5leHQgPSAwOworCWlmIChuZXh0ID09IG1wLT5yeF9lbXB0eSkKKwkgICAgYnJlYWs7CisJY3AgPSBtcC0+cnhfY21kcyArIGk7CisJc2tiID0gbXAtPnJ4X2J1ZnNbaV07CisJaWYgKHNrYiA9PSAwKSB7CisJICAgIHNrYiA9IGRldl9hbGxvY19za2IoUlhfQlVGTEVOICsgMik7CisJICAgIGlmIChza2IgIT0gMCkgeworCQlza2JfcmVzZXJ2ZShza2IsIDIpOworCQltcC0+cnhfYnVmc1tpXSA9IHNrYjsKKwkgICAgfQorCX0KKwlzdF9sZTE2KCZjcC0+cmVxX2NvdW50LCBSWF9CVUZMRU4pOworCWRhdGEgPSBza2I/IHNrYi0+ZGF0YTogZHVtbXlfYnVmOworCXN0X2xlMzIoJmNwLT5waHlfYWRkciwgdmlydF90b19idXMoZGF0YSkpOworCW91dF9sZTE2KCZjcC0+eGZlcl9zdGF0dXMsIDApOworCW91dF9sZTE2KCZjcC0+Y29tbWFuZCwgSU5QVVRfTEFTVCArIElOVFJfQUxXQVlTKTsKKyNpZiAwCisJaWYgKChsZF9sZTMyKCZyZC0+c3RhdHVzKSAmIEFDVElWRSkgIT0gMCkgeworCSAgICBvdXRfbGUzMigmcmQtPmNvbnRyb2wsIChQQVVTRSA8PCAxNikgfCBQQVVTRSk7CisJICAgIHdoaWxlICgoaW5fbGUzMigmcmQtPnN0YXR1cykgJiBBQ1RJVkUpICE9IDApCisJCTsKKwl9CisjZW5kaWYKKwlpID0gbmV4dDsKKyAgICB9CisgICAgaWYgKGkgIT0gbXAtPnJ4X2ZpbGwpIHsKKwlvdXRfbGUzMigmcmQtPmNvbnRyb2wsICgoUlVOfFdBS0UpIDw8IDE2KSB8IChSVU58V0FLRSkpOworCW1wLT5yeF9maWxsID0gaTsKKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPmxvY2ssIGZsYWdzKTsKKyAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfbWF0Y2ggbWFjZV9tYXRjaFtdID0gCit7CisJeworCS5uYW1lIAkJPSAibWFjZSIsCisJLnR5cGUJCT0gT0ZfQU5ZX01BVENILAorCS5jb21wYXRpYmxlCT0gT0ZfQU5ZX01BVENICisJfSwKKwl7fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWFjaW9fZHJpdmVyIG1hY2VfZHJpdmVyID0gCit7CisJLm5hbWUgCQk9ICJtYWNlIiwKKwkubWF0Y2hfdGFibGUJPSBtYWNlX21hdGNoLAorCS5wcm9iZQkJPSBtYWNlX3Byb2JlLAorCS5yZW1vdmUJCT0gbWFjZV9yZW1vdmUsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IG1hY2VfaW5pdCh2b2lkKQoreworCXJldHVybiBtYWNpb19yZWdpc3Rlcl9kcml2ZXIoJm1hY2VfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1hY2VfY2xlYW51cCh2b2lkKQoreworCW1hY2lvX3VucmVnaXN0ZXJfZHJpdmVyKCZtYWNlX2RyaXZlcik7CisKKwlpZiAoZHVtbXlfYnVmKSB7CisJCWtmcmVlKGR1bW15X2J1Zik7CisJCWR1bW15X2J1ZiA9IE5VTEw7CisJfQorfQorCitNT0RVTEVfQVVUSE9SKCJQYXVsIE1hY2tlcnJhcyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQb3dlck1hYyBNQUNFIGRyaXZlci4iKTsKK01PRFVMRV9QQVJNKHBvcnRfYWF1aSwgImkiKTsKK01PRFVMRV9QQVJNX0RFU0MocG9ydF9hYXVpLCAiTUFDRSB1c2VzIEFBVUkgcG9ydCAoMC0xKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChtYWNlX2luaXQpOworbW9kdWxlX2V4aXQobWFjZV9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hY2UuaCBiL2RyaXZlcnMvbmV0L21hY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGI3ZWMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbWFjZS5oCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogbWFjZS5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSByZWdpc3RlcnMgaW4gdGhlIEFtNzlDOTQwIE1BQ0UKKyAqIChNZWRpdW0gQWNjZXNzIENvbnRyb2wgZm9yIEV0aGVybmV0KSBjb250cm9sbGVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBQYXVsIE1hY2tlcnJhcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNkZWZpbmUgUkVHKHgpCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgeDsgY2hhciB4ICMjIF9wYWRbMTVdCisKK3N0cnVjdCBtYWNlIHsKKwlSRUcocmN2Zmlmbyk7CQkvKiByZWNlaXZlIEZJRk8gKi8KKwlSRUcoeG10Zmlmbyk7CQkvKiB0cmFuc21pdCBGSUZPICovCisJUkVHKHhtdGZjKTsJCS8qIHRyYW5zbWl0IGZyYW1lIGNvbnRyb2wgKi8KKwlSRUcoeG10ZnMpOwkJLyogdHJhbnNtaXQgZnJhbWUgc3RhdHVzICovCisJUkVHKHhtdHJjKTsJCS8qIHRyYW5zbWl0IHJldHJ5IGNvdW50ICovCisJUkVHKHJjdmZjKTsJCS8qIHJlY2VpdmUgZnJhbWUgY29udHJvbCAqLworCVJFRyhyY3Zmcyk7CQkvKiByZWNlaXZlIGZyYW1lIHN0YXR1cyAoNCBieXRlcykgKi8KKwlSRUcoZmlmb2ZjKTsJCS8qIEZJRk8gZnJhbWUgY291bnQgKi8KKwlSRUcoaXIpOwkJLyogaW50ZXJydXB0IHJlZ2lzdGVyICovCisJUkVHKGltcik7CQkvKiBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworCVJFRyhwcik7CQkvKiBwb2xsIHJlZ2lzdGVyICovCisJUkVHKGJpdWNjKTsJCS8qIGJ1cyBpbnRlcmZhY2UgdW5pdCBjb25maWcgY29udHJvbCAqLworCVJFRyhmaWZvY2MpOwkJLyogRklGTyBjb25maWd1cmF0aW9uIGNvbnRyb2wgKi8KKwlSRUcobWFjY2MpOwkJLyogbWVkaXVtIGFjY2VzcyBjb250cm9sIGNvbmZpZyBjb250cm9sICovCisJUkVHKHBsc2NjKTsJCS8qIHBoeXMgbGF5ZXIgc2lnbmFsbGluZyBjb25maWcgY29udHJvbCAqLworCVJFRyhwaHljYyk7CQkvKiBwaHlzaWNhbCBjb25maWd1cmF0aW9uIGNvbnRyb2wgKi8KKwlSRUcoY2hpcGlkX2xvKTsJCS8qIGNoaXAgSUQsIGxzYiAqLworCVJFRyhjaGlwaWRfaGkpOwkJLyogY2hpcCBJRCwgbXNiICovCisJUkVHKGlhYyk7CQkvKiBpbnRlcm5hbCBhZGRyZXNzIGNvbmZpZyAqLworCVJFRyhyZWcxOSk7CisJUkVHKGxhZHJmKTsJCS8qIGxvZ2ljYWwgYWRkcmVzcyBmaWx0ZXIgKDggYnl0ZXMpICovCisJUkVHKHBhZHIpOwkJLyogcGh5c2ljYWwgYWRkcmVzcyAoNiBieXRlcykgKi8KKwlSRUcocmVnMjIpOworCVJFRyhyZWcyMyk7CisJUkVHKG1wYyk7CQkvKiBtaXNzZWQgcGFja2V0IGNvdW50IChjbGVhcnMgd2hlbiByZWFkKSAqLworCVJFRyhyZWcyNSk7CisJUkVHKHJudHBjKTsJCS8qIHJ1bnQgcGFja2V0IGNvdW50IChjbGVhcnMgd2hlbiByZWFkKSAqLworCVJFRyhyY3ZjYyk7CQkvKiByZWN2IGNvbGxpc2lvbiBjb3VudCAoY2xlYXJzIHdoZW4gcmVhZCkgKi8KKwlSRUcocmVnMjgpOworCVJFRyh1dHIpOwkJLyogdXNlciB0ZXN0IHJlZyAqLworCVJFRyhyZWczMCk7CisJUkVHKHJlZzMxKTsKK307CisKKy8qIEJpdHMgaW4gWE1URkMgKi8KKyNkZWZpbmUgRFJUUlkJCTB4ODAJLyogZG9uJ3QgcmV0cnkgdHJhbnNtaXNzaW9uIGFmdGVyIGNvbGxpc2lvbiAqLworI2RlZmluZSBEWE1URkNTCQkweDA4CS8qIGRvbid0IGFwcGVuZCBGQ1MgdG8gdHJhbnNtaXR0ZWQgZnJhbWUgKi8KKyNkZWZpbmUgQVVUT19QQURfWE1JVAkweDAxCS8qIGF1dG8tcGFkIHNob3J0IHBhY2tldHMgb24gdHJhbnNtaXNzaW9uICovCisKKy8qIEJpdHMgaW4gWE1URlM6IG9ubHkgdmFsaWQgd2hlbiBYTVRTViBpcyBzZXQgaW4gUFIgYW5kIFhNVEZTICovCisjZGVmaW5lIFhNVFNWCQkweDgwCS8qIHRyYW5zbWl0IHN0YXR1cyAoaS5lLiBYTVRGUykgdmFsaWQgKi8KKyNkZWZpbmUgVUZMTwkJMHg0MAkvKiB1bmRlcmZsb3cgLSB4bWl0IGZpZm8gcmFuIGRyeSAqLworI2RlZmluZSBMQ09MCQkweDIwCS8qIGxhdGUgY29sbGlzaW9uICh0cmFuc21pc3Npb24gYWJvcnRlZCkgKi8KKyNkZWZpbmUgTU9SRQkJMHgxMAkvKiAyIG9yIG1vcmUgcmV0cmllcyBuZWVkZWQgdG8geG1pdCBmcmFtZSAqLworI2RlZmluZSBPTkUJCTB4MDgJLyogMSByZXRyeSBuZWVkZWQgdG8geG1pdCBmcmFtZSAqLworI2RlZmluZSBERUZFUgkJMHgwNAkvKiBNQUNFIGhhZCB0byBkZWZlciB4bWlzc2lvbiAoZW5ldCBidXN5KSAqLworI2RlZmluZSBMQ0FSCQkweDAyCS8qIGxvc3Mgb2YgY2FycmllciAodHJhbnNtaXNzaW9uIGFib3J0ZWQpICovCisjZGVmaW5lIFJUUlkJCTB4MDEJLyogdG9vIG1hbnkgcmV0cmllcyAodHJhbnNtaXNzaW9uIGFib3J0ZWQpICovCisKKy8qIEJpdHMgaW4gWE1UUkM6IG9ubHkgdmFsaWQgd2hlbiBYTVRTViBpcyBzZXQgaW4gUFIgKGFuZCBYTVRGUykgKi8KKyNkZWZpbmUgRVhERUYJCTB4ODAJLyogaGFkIHRvIGRlZmVyIGZvciBleGNlc3NpdmUgdGltZSAqLworI2RlZmluZSBSRVRSWV9NQVNLCTB4MGYJLyogbnVtYmVyIG9mIHJldHJpZXMgKDAgLSAxNSkgKi8KKworLyogQml0cyBpbiBSQ1ZGQyAqLworI2RlZmluZSBMTFJDVgkJMHgwOAkvKiBsb3cgbGF0ZW5jeSByZWNlaXZlOiBlYXJseSBETUEgcmVxdWVzdCAqLworI2RlZmluZSBNX1JCQVIJCTB4MDQJLyogc2V0cyBmdW5jdGlvbiBvZiBFQU0vUiBwaW4gKi8KKyNkZWZpbmUgQVVUT19TVFJJUF9SQ1YJMHgwMQkvKiBhdXRvLXN0cmlwIHNob3J0IExMQyBmcmFtZXMgb24gcmVjdiAqLworCisvKgorICogQml0cyBpbiBSQ1ZGUy4gIEFmdGVyIGEgZnJhbWUgaXMgcmVjZWl2ZWQsIGZvdXIgYnl0ZXMgb2Ygc3RhdHVzCisgKiBhcmUgYXV0b21hdGljYWxseSByZWFkIGZyb20gdGhpcyByZWdpc3RlciBhbmQgYXBwZW5kZWQgdG8gdGhlIGZyYW1lCisgKiBkYXRhIGluIG1lbW9yeS4gIFRoZXNlIGFyZToKKyAqIEJ5dGUgMCBhbmQgMTogbWVzc2FnZSBieXRlIGNvdW50IGFuZCBmcmFtZSBzdGF0dXMKKyAqIEJ5dGUgMjogcnVudCBwYWNrZXQgY291bnQKKyAqIEJ5dGUgMzogcmVjZWl2ZSBjb2xsaXNpb24gY291bnQKKyAqLworI2RlZmluZSBSU19PRkxPCQkweDgwMDAJLyogcmVjZWl2ZSBGSUZPIG92ZXJmbG93ZWQgKi8KKyNkZWZpbmUgUlNfQ0xTTgkJMHg0MDAwCS8qIHJlY2VpdmVkIGZyYW1lIHN1ZmZlcmVkIChsYXRlKSBjb2xsaXNpb24gKi8KKyNkZWZpbmUgUlNfRlJBTUVSUgkweDIwMDAJLyogZnJhbWluZyBlcnJvciBmbGFnICovCisjZGVmaW5lIFJTX0ZDU0VSUgkweDEwMDAJLyogZnJhbWUgaGFkIEZDUyBlcnJvciAqLworI2RlZmluZSBSU19DT1VOVAkweDBmZmYJLyogbWFzayBmb3IgYnl0ZSBjb3VudCBmaWVsZCAqLworCisvKiBCaXRzIChmaWVsZHMpIGluIEZJRk9GQyAqLworI2RlZmluZSBSQ1ZGQ19TSAk0CS8qIHJlY2VpdmUgZnJhbWUgY291bnQgaW4gRklGTyAqLworI2RlZmluZSBSQ1ZGQ19NQVNLCTB4MGYKKyNkZWZpbmUgWE1URkNfU0gJMAkvKiB0cmFuc21pdCBmcmFtZSBjb3VudCBpbiBGSUZPICovCisjZGVmaW5lIFhNVEZDX01BU0sJMHgwZgorCisvKgorICogQml0cyBpbiBJUiBhbmQgSU1SLiAgVGhlIElSIGNsZWFycyBpdHNlbGYgd2hlbiByZWFkLgorICogU2V0dGluZyBhIGJpdCBpbiB0aGUgSU1SIHdpbGwgZGlzYWJsZSB0aGUgY29ycmVzcG9uZGluZyBpbnRlcnJ1cHQuCisgKi8KKyNkZWZpbmUgSkFCQkVSCQkweDgwCS8qIGphYmJlciBlcnJvciAtIDEwYmFzZVQgeG1pc3Npb24gdG9vIGxvbmcgKi8KKyNkZWZpbmUgQkFCQkxFCQkweDQwCS8qIGJhYmJsZSAtIHhtaXR0ZXIgeG1pdHRpbmcgZm9yIHRvbyBsb25nICovCisjZGVmaW5lIENFUlIJCTB4MjAJLyogY29sbGlzaW9uIGVyciAtIG5vIFNRRSB0ZXN0IChoZWFydGJlYXQpICovCisjZGVmaW5lIFJDVkNDTwkJMHgxMAkvKiBSQ1ZDQyBvdmVyZmxvdyAqLworI2RlZmluZSBSTlRQQ08JCTB4MDgJLyogUk5UUEMgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgTVBDTwkJMHgwNAkvKiBNUEMgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgUkNWSU5UCQkweDAyCS8qIHJlY2VpdmUgaW50ZXJydXB0ICovCisjZGVmaW5lIFhNVElOVAkJMHgwMQkvKiB0cmFuc21pdHRlciBpbnRlcnJ1cHQgKi8KKworLyogQml0cyBpbiBQUiAqLworI2RlZmluZSBYTVRTVgkJMHg4MAkvKiBYTVRGUyB2YWxpZCAoc2FtZSBhcyBpbiBYTVRGUykgKi8KKyNkZWZpbmUgVERUUkVRCQkweDQwCS8qIHNldCB3aGVuIHhtaXQgZmlmbyBpcyByZXF1ZXN0aW5nIGRhdGEgKi8KKyNkZWZpbmUgUkRUUkVRCQkweDIwCS8qIHNldCB3aGVuIHJlY3YgZmlmbyByZXF1ZXN0cyBkYXRhIHhmZXIgKi8KKworLyogQml0cyBpbiBCSVVDQyAqLworI2RlZmluZSBCU1dQCQkweDQwCS8qIGJ5dGUgc3dhcCwgaS5lLiBiaWctZW5kaWFuIGJ1cyAqLworI2RlZmluZSBYTVRTUF80CQkweDAwCS8qIHN0YXJ0IHhtaXR0aW5nIHdoZW4gNCBieXRlcyBpbiBGSUZPICovCisjZGVmaW5lIFhNVFNQXzE2CTB4MTAJLyogc3RhcnQgeG1pdHRpbmcgd2hlbiAxNiBieXRlcyBpbiBGSUZPICovCisjZGVmaW5lIFhNVFNQXzY0CTB4MjAJLyogc3RhcnQgeG1pdHRpbmcgd2hlbiA2NCBieXRlcyBpbiBGSUZPICovCisjZGVmaW5lIFhNVFNQXzExMgkweDMwCS8qIHN0YXJ0IHhtaXR0aW5nIHdoZW4gMTEyIGJ5dGVzIGluIEZJRk8gKi8KKyNkZWZpbmUgU1dSU1QJCTB4MDEJLyogc29mdHdhcmUgcmVzZXQgKi8KKworLyogQml0cyBpbiBGSUZPQ0MgKi8KKyNkZWZpbmUgWE1URldfOAkJMHgwMAkvKiB4bWl0IGZpZm8gd2F0ZXJtYXJrID0gOCB3b3JkcyBmcmVlICovCisjZGVmaW5lIFhNVEZXXzE2CTB4NDAJLyogIDE2IHdvcmRzIGZyZWUgKi8KKyNkZWZpbmUgWE1URldfMzIJMHg4MAkvKiAgMzIgd29yZHMgZnJlZSAqLworI2RlZmluZSBSQ1ZGV18xNgkweDAwCS8qIHJlY3YgZmlmbyB3YXRlcm1hcmsgPSAxNiBieXRlcyBhdmFpbCAqLworI2RlZmluZSBSQ1ZGV18zMgkweDEwCS8qICAzMiBieXRlcyBhdmFpbCAqLworI2RlZmluZSBSQ1ZGV182NAkweDIwCS8qICA2NCBieXRlcyBhdmFpbCAqLworI2RlZmluZSBYTVRGV1UJCTB4MDgJLyogeG1pdCBmaWZvIHdhdGVybWFyayB1cGRhdGUgZW5hYmxlICovCisjZGVmaW5lIFJDVkZXVQkJMHgwNAkvKiByZWN2IGZpZm8gd2F0ZXJtYXJrIHVwZGF0ZSBlbmFibGUgKi8KKyNkZWZpbmUgWE1UQlJTVAkJMHgwMgkvKiBlbmFibGUgdHJhbnNtaXQgYnVyc3QgbW9kZSAqLworI2RlZmluZSBSQ1ZCUlNUCQkweDAxCS8qIGVuYWJsZSByZWNlaXZlIGJ1cnN0IG1vZGUgKi8KKworLyogQml0cyBpbiBNQUNDQyAqLworI2RlZmluZSBQUk9NCQkweDgwCS8qIHByb21pc2N1b3VzIG1vZGUgKi8KKyNkZWZpbmUgRFhNVDJQRAkJMHg0MAkvKiBkaXNhYmxlIHhtaXQgdHdvLXBhcnQgZGVmZXJyYWwgYWxnb3JpdGhtICovCisjZGVmaW5lIEVNQkEJCTB4MjAJLyogZW5hYmxlIG1vZGlmaWVkIGJhY2tvZmYgYWxnb3JpdGhtICovCisjZGVmaW5lIERSQ1ZQQQkJMHgwOAkvKiBkaXNhYmxlIHJlY2VpdmluZyBwaHlzaWNhbCBhZGRyZXNzICovCisjZGVmaW5lIERSQ1ZCQwkJMHgwNAkvKiBkaXNhYmxlIHJlY2VpdmluZyBicm9hZGNhc3RzICovCisjZGVmaW5lIEVOWE1UCQkweDAyCS8qIGVuYWJsZSB0cmFuc21pdHRlciAqLworI2RlZmluZSBFTlJDVgkJMHgwMQkvKiBlbmFibGUgcmVjZWl2ZXIgKi8KKworLyogQml0cyBpbiBQTFNDQyAqLworI2RlZmluZSBYTVRTRUwJCTB4MDgJLyogc2VsZWN0IERPKy9ETy0gc3RhdGUgd2hlbiBpZGxlICovCisjZGVmaW5lIFBPUlRTRUxfQVVJCTB4MDAJLyogc2VsZWN0IEFVSSBwb3J0ICovCisjZGVmaW5lIFBPUlRTRUxfMTBUCTB4MDIJLyogc2VsZWN0IDEwQmFzZS1UIHBvcnQgKi8KKyNkZWZpbmUgUE9SVFNFTF9EQUkJMHgwNAkvKiBzZWxlY3QgREFJIHBvcnQgKi8KKyNkZWZpbmUgUE9SVFNFTF9HUFNJCTB4MDYJLyogc2VsZWN0IEdQU0kgcG9ydCAqLworI2RlZmluZSBFTlBMU0lPCQkweDAxCS8qIGVuYWJsZSBvcHRpb25hbCBQTFMgSS9PIHBpbnMgKi8KKworLyogQml0cyBpbiBQSFlDQyAqLworI2RlZmluZSBMTktGTAkJMHg4MAkvKiByZXBvcnRzIDEwQmFzZS1UIGxpbmsgZmFpbHVyZSAqLworI2RlZmluZSBETE5LVFNUCQkweDQwCS8qIGRpc2FibGUgMTBCYXNlLVQgbGluayB0ZXN0ICovCisjZGVmaW5lIFJFVlBPTAkJMHgyMAkvKiAxMEJhc2UtVCByZWNlaXZlciBwb2xhcml0eSByZXZlcnNlZCAqLworI2RlZmluZSBEQVBDCQkweDEwCS8qIGRpc2FibGUgYXV0byByZWNlaXZlciBwb2xhcml0eSBjb3JyZWN0aW9uICovCisjZGVmaW5lIExSVAkJMHgwOAkvKiBsb3cgcmVjZWl2ZSB0aHJlc2hvbGQgZm9yIGxvbmcgbGlua3MgKi8KKyNkZWZpbmUgQVNFTAkJMHgwNAkvKiBhdXRvLXNlbGVjdCBBVUkgb3IgMTBCYXNlLVQgcG9ydCAqLworI2RlZmluZSBSV0FLRQkJMHgwMgkvKiByZW1vdGUgd2FrZSBmdW5jdGlvbiAqLworI2RlZmluZSBBV0FLRQkJMHgwMQkvKiBhdXRvIHdha2UgZnVuY3Rpb24gKi8KKworLyogQml0cyBpbiBJQUMgKi8KKyNkZWZpbmUgQUREUkNIRwkJMHg4MAkvKiByZXF1ZXN0IGFkZHJlc3MgY2hhbmdlICovCisjZGVmaW5lIFBIWUFERFIJCTB4MDQJLyogYWNjZXNzIHBoeXNpY2FsIGFkZHJlc3MgKi8KKyNkZWZpbmUgTE9HQUREUgkJMHgwMgkvKiBhY2Nlc3MgbXVsdGljYXN0IGZpbHRlciAqLworCisvKiBCaXRzIGluIFVUUiAqLworI2RlZmluZSBSVFJFCQkweDgwCS8qIHJlc2VydmVkIHRlc3QgcmVnaXN0ZXIgZW5hYmxlLiBET04nVCBTRVQuICovCisjZGVmaW5lIFJUUkQJCTB4NDAJLyogcmVzZXJ2ZWQgdGVzdCByZWdpc3RlciBkaXNhYmxlLiAgU3RpY2t5ICovCisjZGVmaW5lIFJQQUMJCTB4MjAJLyogYWNjZXB0IHJ1bnQgcGFja2V0cyAqLworI2RlZmluZSBGQ09MTAkJMHgxMAkvKiBmb3JjZSBjb2xsaXNpb24gKi8KKyNkZWZpbmUgUkNWRkNTRQkJMHgwOAkvKiByZWNlaXZlIEZDUyBlbmFibGUgKi8KKyNkZWZpbmUgTE9PUF9OT05FCTB4MDAJLyogbm8gbG9vcGJhY2sgKi8KKyNkZWZpbmUgTE9PUF9FWFQJMHgwMgkvKiBleHRlcm5hbCBsb29wYmFjayAqLworI2RlZmluZSBMT09QX0lOVAkweDA0CS8qIGludGVybmFsIGxvb3BiYWNrLCBleGNsdWRlcyBNRU5ERUMgKi8KKyNkZWZpbmUgTE9PUF9NRU5ERUMJMHgwNgkvKiBpbnRlcm5hbCBsb29wYmFjaywgaW5jbHVkZXMgTUVOREVDICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWNtYWNlLmMgYi9kcml2ZXJzL25ldC9tYWNtYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlhNmZjMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L21hY21hY2UuYwpAQCAtMCwwICsxLDcxMCBAQAorLyoKKyAqCURyaXZlciBmb3IgdGhlIE1hY2ludG9zaCA2OEsgb25ib2FyZCBNQUNFIGNvbnRyb2xsZXIgd2l0aCBQU0MKKyAqCWRyaXZlbiBETUEuIFRoZSBNQUNFIGRyaXZlciBjb2RlIGlzIGRlcml2ZWQgZnJvbSBtYWNlLmMuIFRoZQorICoJTWFjNjhrIHRoZW9yeSBvZiBvcGVyYXRpb24gaXMgY291cnRlc3kgb2YgdGhlIE1hY0JTRCB3aXphcmRzLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzLgorICoJQ29weXJpZ2h0IChDKSAxOTk4IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKgorICoJTW9kaWZpZWQgaGVhdmlseSBieSBKb3NodWEgTS4gVGhvbXBzb24gYmFzZWQgb24gRGF2ZSBIdWFuZydzIE5ldEJTRCBkcml2ZXIKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaW50b3NoLmg+CisjaW5jbHVkZSA8YXNtL21hY2ludHMuaD4KKyNpbmNsdWRlIDxhc20vbWFjX3BzYy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSAibWFjZS5oIgorCisjZGVmaW5lIE5fVFhfUklORwkxCisjZGVmaW5lIE5fUlhfUklORwk4CisjZGVmaW5lIE5fUlhfUEFHRVMJKChOX1JYX1JJTkcgKiAweDA4MDAgKyBQQUdFX1NJWkUgLSAxKSAvIFBBR0VfU0laRSkKKyNkZWZpbmUgVFhfVElNRU9VVAlIWgorCisvKiBCaXRzIGluIHRyYW5zbWl0IERNQSBzdGF0dXMgKi8KKyNkZWZpbmUgVFhfRE1BX0VSUgkweDgwCisKKy8qIFRoZSBNQUNFIGlzIHNpbXBseSB3aXJlZCBkb3duIG9uIGEgTWFjNjhLIGJveCAqLworCisjZGVmaW5lIE1BQ0VfQkFTRQkodm9pZCAqKSgweDUwRjFDMDAwKQorI2RlZmluZSBNQUNFX1BST00JKHZvaWQgKikoMHg1MEYwODAwMSkKKworc3RydWN0IG1hY2VfZGF0YSB7CisJdm9sYXRpbGUgc3RydWN0IG1hY2UgKm1hY2U7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqdHhfcmluZzsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICp0eF9yaW5nX3BoeXM7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqcnhfcmluZzsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpyeF9yaW5nX3BoeXM7CisJaW50IGRtYV9pbnRyOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCWludCByeF9zbG90LCByeF90YWlsOworCWludCB0eF9zbG90LCB0eF9zbG90aSwgdHhfY291bnQ7Cit9OworCitzdHJ1Y3QgbWFjZV9mcmFtZSB7CisJdTE2CWxlbjsKKwl1MTYJc3RhdHVzOworCXUxNglybnRwYzsKKwl1MTYJcmN2Y2M7CisJdTMyCXBhZDE7CisJdTMyCXBhZDI7CisJdTgJZGF0YVsxXTsJCisJLyogQW5kIGZyYW1lIGNvbnRpbnVlcy4uICovCit9OworCisjZGVmaW5lIFBSSVZfQllURVMJc2l6ZW9mKHN0cnVjdCBtYWNlX2RhdGEpCisKK2V4dGVybiB2b2lkIHBzY19kZWJ1Z19kdW1wKHZvaWQpOworCitzdGF0aWMgaW50IG1hY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbWFjZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbWFjZV94bWl0X3N0YXJ0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICptYWNlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbWFjZV9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBtYWNlX3NldF9hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpOworc3RhdGljIGlycXJldHVybl90IG1hY2VfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGlycXJldHVybl90IG1hY2VfZG1hX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBtYWNlX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIEJpdC1yZXZlcnNlIG9uZSBieXRlIG9mIGFuIGV0aGVybmV0IGhhcmR3YXJlIGFkZHJlc3MuICovCisKK3N0YXRpYyBpbnQgYml0cmV2KGludCBiKQoreworCWludCBkID0gMCwgaTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyArK2ksIGIgPj49IDEpIHsKKwkJZCA9IChkIDw8IDEpIHwgKGIgJiAxKTsKKwl9CisKKwlyZXR1cm4gZDsKK30KKworLyoKKyAqIExvYWQgYSByZWNlaXZlIERNQSBjaGFubmVsIHdpdGggYSBiYXNlIGFkZHJlc3MgYW5kIHJpbmcgbGVuZ3RoCisgKi8KKworc3RhdGljIHZvaWQgbWFjZV9sb2FkX3J4ZG1hX2Jhc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNldCkKK3sKKwlzdHJ1Y3QgbWFjZV9kYXRhICptcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsKKworCXBzY193cml0ZV93b3JkKFBTQ19FTkVUUkRfQ01EICsgc2V0LCAweDAxMDApOworCXBzY193cml0ZV9sb25nKFBTQ19FTkVUUkRfQUREUiArIHNldCwgKHUzMikgbXAtPnJ4X3JpbmdfcGh5cyk7CisJcHNjX3dyaXRlX2xvbmcoUFNDX0VORVRSRF9MRU4gKyBzZXQsIE5fUlhfUklORyk7CisJcHNjX3dyaXRlX3dvcmQoUFNDX0VORVRSRF9DTUQgKyBzZXQsIDB4OTgwMCk7CisJbXAtPnJ4X3RhaWwgPSAwOworfQorCisvKgorICogUmVzZXQgdGhlIHJlY2VpdmUgRE1BIHN1YnN5c3RlbQorICovCisKK3N0YXRpYyB2b2lkIG1hY2VfcnhkbWFfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWFjZV9kYXRhICptcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsKKwl2b2xhdGlsZSBzdHJ1Y3QgbWFjZSAqbWFjZSA9IG1wLT5tYWNlOworCXU4IG1hY2NjID0gbWFjZS0+bWFjY2M7CisJCisJbWFjZS0+bWFjY2MgPSBtYWNjYyAmIH5FTlJDVjsKKwkKKwlwc2Nfd3JpdGVfd29yZChQU0NfRU5FVFJEX0NUTCwgMHg4ODAwKTsKKwltYWNlX2xvYWRfcnhkbWFfYmFzZShkZXYsIDB4MDApOworCXBzY193cml0ZV93b3JkKFBTQ19FTkVUUkRfQ1RMLCAweDA0MDApOworCQorCXBzY193cml0ZV93b3JkKFBTQ19FTkVUUkRfQ1RMLCAweDg4MDApOworCW1hY2VfbG9hZF9yeGRtYV9iYXNlKGRldiwgMHgxMCk7CisJcHNjX3dyaXRlX3dvcmQoUFNDX0VORVRSRF9DVEwsIDB4MDQwMCk7CisJCisJbWFjZS0+bWFjY2MgPSBtYWNjYzsKKwltcC0+cnhfc2xvdCA9IDA7CisKKwlwc2Nfd3JpdGVfd29yZChQU0NfRU5FVFJEX0NNRCArIFBTQ19TRVQwLCAweDk4MDApOworCXBzY193cml0ZV93b3JkKFBTQ19FTkVUUkRfQ01EICsgUFNDX1NFVDEsIDB4OTgwMCk7Cit9CisKKy8qCisgKiBSZXNldCB0aGUgdHJhbnNtaXQgRE1BIHN1YnN5c3RlbQorICovCisgCitzdGF0aWMgdm9pZCBtYWNlX3R4ZG1hX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1hY2VfZGF0YSAqbXAgPSAoc3RydWN0IG1hY2VfZGF0YSAqKSBkZXYtPnByaXY7CisJdm9sYXRpbGUgc3RydWN0IG1hY2UgKm1hY2UgPSBtcC0+bWFjZTsKKwl1OCBtYWNjYzsKKworCXBzY193cml0ZV93b3JkKFBTQ19FTkVUV1JfQ1RMLCAweDg4MDApOworCisJbWFjY2MgPSBtYWNlLT5tYWNjYzsKKwltYWNlLT5tYWNjYyA9IG1hY2NjICYgfkVOWE1UOworCisJbXAtPnR4X3Nsb3QgPSBtcC0+dHhfc2xvdGkgPSAwOworCW1wLT50eF9jb3VudCA9IE5fVFhfUklORzsKKworCXBzY193cml0ZV93b3JkKFBTQ19FTkVUV1JfQ1RMLCAweDA0MDApOworCW1hY2UtPm1hY2NjID0gbWFjY2M7Cit9CisKKy8qCisgKiBEaXNhYmxlIERNQQorICovCisgCitzdGF0aWMgdm9pZCBtYWNlX2RtYV9vZmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwc2Nfd3JpdGVfd29yZChQU0NfRU5FVFJEX0NUTCwgMHg4ODAwKTsKKwlwc2Nfd3JpdGVfd29yZChQU0NfRU5FVFJEX0NUTCwgMHgxMDAwKTsKKwlwc2Nfd3JpdGVfd29yZChQU0NfRU5FVFJEX0NNRCArIFBTQ19TRVQwLCAweDExMDApOworCXBzY193cml0ZV93b3JkKFBTQ19FTkVUUkRfQ01EICsgUFNDX1NFVDEsIDB4MTEwMCk7CisKKwlwc2Nfd3JpdGVfd29yZChQU0NfRU5FVFdSX0NUTCwgMHg4ODAwKTsKKwlwc2Nfd3JpdGVfd29yZChQU0NfRU5FVFdSX0NUTCwgMHgxMDAwKTsKKwlwc2Nfd3JpdGVfd29yZChQU0NfRU5FVFdSX0NNRCArIFBTQ19TRVQwLCAweDExMDApOworCXBzY193cml0ZV93b3JkKFBTQ19FTkVUV1JfQ01EICsgUFNDX1NFVDEsIDB4MTEwMCk7Cit9CisKKy8qCisgKiBOb3QgcmVhbGx5IG11Y2ggb2YgYSBwcm9iZS4gVGhlIGhhcmR3YXJlIHRhYmxlIHRlbGxzIHVzIGlmIHRoaXMKKyAqIG1vZGVsIG9mIE1hY2ludHJhc2ggaGFzIGEgTUFDRSAoQVYgbWFjaW50b3NoZXMpCisgKi8KKyAKK3N0cnVjdCBuZXRfZGV2aWNlICptYWNlX3Byb2JlKGludCB1bml0KQoreworCWludCBqOworCXN0cnVjdCBtYWNlX2RhdGEgKm1wOworCXVuc2lnbmVkIGNoYXIgKmFkZHI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBjaGFyIGNoZWNrc3VtID0gMDsKKwlzdGF0aWMgaW50IGZvdW5kID0gMDsKKwlpbnQgZXJyOworCQorCWlmIChmb3VuZCB8fCBtYWNpbnRvc2hfY29uZmlnLT5ldGhlcl90eXBlICE9IE1BQ19FVEhFUl9NQUNFKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCWZvdW5kID0gMTsJLyogcHJldmVudCAnZmluZGluZycgb25lIG9uIGV2ZXJ5IGRldmljZSBwcm9iZSAqLworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoUFJJVl9CWVRFUyk7CisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWYgKHVuaXQgPj0gMCkKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCisJbXAgPSAoc3RydWN0IG1hY2VfZGF0YSAqKSBkZXYtPnByaXY7CisJZGV2LT5iYXNlX2FkZHIgPSAodTMyKU1BQ0VfQkFTRTsKKwltcC0+bWFjZSA9ICh2b2xhdGlsZSBzdHJ1Y3QgbWFjZSAqKSBNQUNFX0JBU0U7CisJCisJZGV2LT5pcnEgPSBJUlFfTUFDX01BQ0U7CisJbXAtPmRtYV9pbnRyID0gSVJRX01BQ19NQUNFX0RNQTsKKworCS8qCisJICogVGhlIFBST00gY29udGFpbnMgOCBieXRlcyB3aGljaCB0b3RhbCAweEZGIHdoZW4gWE9SJ2QKKwkgKiB0b2dldGhlci4gRHVlIHRvIHRoZSB1c3VhbCBwZWN1bGlhciBhcHBsZSBicmFpbiBkYW1hZ2UKKwkgKiB0aGUgYnl0ZXMgYXJlIHNwYWNlZCBvdXQgaW4gYSBzdHJhbmdlIGJvdW5kYXJ5IGFuZCB0aGUKKwkgKiBiaXRzIGFyZSByZXZlcnNlZC4KKwkgKi8KKworCWFkZHIgPSAodm9pZCAqKU1BQ0VfUFJPTTsKKwkJIAorCWZvciAoaiA9IDA7IGogPCA2OyArK2opIHsKKwkJdTggdj1iaXRyZXYoYWRkcltqPDw0XSk7CisJCWNoZWNrc3VtIF49IHY7CisJCWRldi0+ZGV2X2FkZHJbal0gPSB2OworCX0KKwlmb3IgKDsgaiA8IDg7ICsraikgeworCQljaGVja3N1bSBePSBiaXRyZXYoYWRkcltqPDw0XSk7CisJfQorCQorCWlmIChjaGVja3N1bSAhPSAweEZGKSB7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCX0KKworCW1lbXNldCgmbXAtPnN0YXRzLCAwLCBzaXplb2YobXAtPnN0YXRzKSk7CisKKwlkZXYtPm9wZW4JCT0gbWFjZV9vcGVuOworCWRldi0+c3RvcAkJPSBtYWNlX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gbWFjZV94bWl0X3N0YXJ0OworCWRldi0+dHhfdGltZW91dAkJPSBtYWNlX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwk9IFRYX1RJTUVPVVQ7CisJZGV2LT5nZXRfc3RhdHMJCT0gbWFjZV9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdAk9IG1hY2Vfc2V0X211bHRpY2FzdDsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcwk9IG1hY2Vfc2V0X2FkZHJlc3M7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogNjhLIE1BQ0UsIGhhcmR3YXJlIGFkZHJlc3MgJS4yWCIsIGRldi0+bmFtZSwgZGV2LT5kZXZfYWRkclswXSk7CisJZm9yIChqID0gMSA7IGogPCA2IDsgaisrKSBwcmludGsoIjolLjJYIiwgZGV2LT5kZXZfYWRkcltqXSk7CisJcHJpbnRrKCJcbiIpOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKCFlcnIpCisJCXJldHVybiBkZXY7CisKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qCisgKiBMb2FkIHRoZSBhZGRyZXNzIG9uIGEgbWFjZSBjb250cm9sbGVyLgorICovCisKK3N0YXRpYyBpbnQgbWFjZV9zZXRfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCXVuc2lnbmVkIGNoYXIgKnAgPSBhZGRyOworCXN0cnVjdCBtYWNlX2RhdGEgKm1wID0gKHN0cnVjdCBtYWNlX2RhdGEgKikgZGV2LT5wcml2OworCXZvbGF0aWxlIHN0cnVjdCBtYWNlICptYiA9IG1wLT5tYWNlOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggbWFjY2M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwltYWNjYyA9IG1iLT5tYWNjYzsKKworCS8qIGxvYWQgdXAgdGhlIGhhcmR3YXJlIGFkZHJlc3MgKi8KKwltYi0+aWFjID0gQUREUkNIRyB8IFBIWUFERFI7CisJd2hpbGUgKChtYi0+aWFjICYgQUREUkNIRykgIT0gMCk7CisJCisJZm9yIChpID0gMDsgaSA8IDY7ICsraSkgeworCQltYi0+cGFkciA9IGRldi0+ZGV2X2FkZHJbaV0gPSBwW2ldOworCX0KKworCW1iLT5tYWNjYyA9IG1hY2NjOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKgorICogT3BlbiB0aGUgTWFjaW50b3NoIE1BQ0UuIE1vc3Qgb2YgdGhpcyBpcyBwbGF5aW5nIHdpdGggdGhlIERNQQorICogZW5naW5lLiBUaGUgZXRoZXJuZXQgY2hpcCBpcyBxdWl0ZSBmcmllbmRseS4KKyAqLworIAorc3RhdGljIGludCBtYWNlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWFjZV9kYXRhICptcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsKKwl2b2xhdGlsZSBzdHJ1Y3QgbWFjZSAqbWIgPSBtcC0+bWFjZTsKKyNpZiAwCisJaW50IGk7CisKKwlpID0gMjAwOworCXdoaWxlICgtLWkpIHsKKwkJbWItPmJpdWNjID0gU1dSU1Q7CisJCWlmIChtYi0+Yml1Y2MgJiBTV1JTVCkgeworCQkJdWRlbGF5KDEwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJyZWFrOworCX0KKwlpZiAoIWkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogc29mdHdhcmUgcmVzZXQgZmFpbGVkISFcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKyNlbmRpZgorCisJbWItPmJpdWNjID0gWE1UU1BfNjQ7CisJbWItPmZpZm9jYyA9IFhNVEZXXzE2IHwgUkNWRldfNjQgfCBYTVRGV1UgfCBSQ1ZGV1UgfCBYTVRCUlNUIHwgUkNWQlJTVDsKKwltYi0+eG10ZmMgPSBBVVRPX1BBRF9YTUlUOworCW1iLT5wbHNjYyA9IFBPUlRTRUxfQVVJOworCS8qIG1iLT51dHIgPSBSVFJEOyAqLworCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBtYWNlX2ludGVycnVwdCwgMCwgZGV2LT5uYW1lLCBkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IGdldCBpcnEgJWRcbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJaWYgKHJlcXVlc3RfaXJxKG1wLT5kbWFfaW50ciwgbWFjZV9kbWFfaW50ciwgMCwgZGV2LT5uYW1lLCBkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IGdldCBpcnEgJWRcbiIsIGRldi0+bmFtZSwgbXAtPmRtYV9pbnRyKTsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCS8qIEFsbG9jYXRlIHRoZSBETUEgcmluZyBidWZmZXJzICovCisKKwltcC0+cnhfcmluZyA9ICh2b2lkICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCB8IEdGUF9ETUEsIE5fUlhfUEFHRVMpOworCW1wLT50eF9yaW5nID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMIHwgR0ZQX0RNQSwgMCk7CisJCisJaWYgKG1wLT50eF9yaW5nPT1OVUxMIHx8IG1wLT5yeF9yaW5nPT1OVUxMKSB7CisJCWlmIChtcC0+cnhfcmluZykgZnJlZV9wYWdlcygodTMyKSBtcC0+cnhfcmluZywgTl9SWF9QQUdFUyk7CisJCWlmIChtcC0+dHhfcmluZykgZnJlZV9wYWdlcygodTMyKSBtcC0+dHhfcmluZywgMCk7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlmcmVlX2lycShtcC0+ZG1hX2ludHIsIGRldik7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBETUEgYnVmZmVyc1xuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbXAtPnJ4X3JpbmdfcGh5cyA9ICh1bnNpZ25lZCBjaGFyICopIHZpcnRfdG9fYnVzKCh2b2lkICopbXAtPnJ4X3JpbmcpOworCW1wLT50eF9yaW5nX3BoeXMgPSAodW5zaWduZWQgY2hhciAqKSB2aXJ0X3RvX2J1cygodm9pZCAqKW1wLT50eF9yaW5nKTsKKworCS8qIFdlIHdhbnQgdGhlIFJ4IGJ1ZmZlciB0byBiZSB1bmNhY2hlZCBhbmQgdGhlIFR4IGJ1ZmZlciB0byBiZSB3cml0ZXRocm91Z2ggKi8KKworCWtlcm5lbF9zZXRfY2FjaGVtb2RlKCh2b2lkICopbXAtPnJ4X3JpbmcsIE5fUlhfUEFHRVMgKiBQQUdFX1NJWkUsIElPTUFQX05PQ0FDSEVfTk9OU0VSKTsJCisJa2VybmVsX3NldF9jYWNoZW1vZGUoKHZvaWQgKiltcC0+dHhfcmluZywgUEFHRV9TSVpFLCBJT01BUF9XUklURVRIUk9VR0gpOworCisJbWFjZV9kbWFfb2ZmKGRldik7CisKKwkvKiBOb3Qgc3VyZSB3aGF0IHRoZXNlIGRvICovCisKKwlwc2Nfd3JpdGVfd29yZChQU0NfRU5FVFdSX0NUTCwgMHg5MDAwKTsKKwlwc2Nfd3JpdGVfd29yZChQU0NfRU5FVFJEX0NUTCwgMHg5MDAwKTsKKwlwc2Nfd3JpdGVfd29yZChQU0NfRU5FVFdSX0NUTCwgMHgwNDAwKTsKKwlwc2Nfd3JpdGVfd29yZChQU0NfRU5FVFJEX0NUTCwgMHgwNDAwKTsKKworI2lmIDAKKwkvKiBsb2FkIHVwIHRoZSBoYXJkd2FyZSBhZGRyZXNzICovCisJCisJbWItPmlhYyA9IEFERFJDSEcgfCBQSFlBRERSOworCQorCXdoaWxlICgobWItPmlhYyAmIEFERFJDSEcpICE9IDApOworCQorCWZvciAoaSA9IDA7IGkgPCA2OyArK2kpCisJCW1iLT5wYWRyID0gZGV2LT5kZXZfYWRkcltpXTsKKworCS8qIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyICovCisJbWItPmlhYyA9IEFERFJDSEcgfCBMT0dBRERSOworCisJd2hpbGUgKChtYi0+aWFjICYgQUREUkNIRykgIT0gMCk7CisJCisJZm9yIChpID0gMDsgaSA8IDg7ICsraSkKKwkJbWItPmxhZHJmID0gMDsKKworCW1iLT5wbHNjYyA9IFBPUlRTRUxfR1BTSSArIEVOUExTSU87CisKKwltYi0+bWFjY2MgPSBFTlhNVCB8IEVOUkNWOworCW1iLT5pbXIgPSBSQ1ZJTlQ7CisjZW5kaWYKKworCW1hY2VfcnhkbWFfcmVzZXQoZGV2KTsKKwltYWNlX3R4ZG1hX3Jlc2V0KGRldik7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTaHV0IGRvd24gdGhlIG1hY2UgYW5kIGl0cyBpbnRlcnJ1cHQgY2hhbm5lbAorICovCisgCitzdGF0aWMgaW50IG1hY2VfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWFjZV9kYXRhICptcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsKKwl2b2xhdGlsZSBzdHJ1Y3QgbWFjZSAqbWIgPSBtcC0+bWFjZTsKKworCW1iLT5tYWNjYyA9IDA7CQkvKiBkaXNhYmxlIHJ4IGFuZCB0eAkgKi8KKwltYi0+aW1yID0gMHhGRjsJCS8qIGRpc2FibGUgYWxsIGlycXMJICovCisJbWFjZV9kbWFfb2ZmKGRldik7CS8qIGRpc2FibGUgcnggYW5kIHR4IGRtYSAqLworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJZnJlZV9pcnEoSVJRX01BQ19NQUNFX0RNQSwgZGV2KTsKKworCWZyZWVfcGFnZXMoKHUzMikgbXAtPnJ4X3JpbmcsIE5fUlhfUEFHRVMpOworCWZyZWVfcGFnZXMoKHUzMikgbXAtPnR4X3JpbmcsIDApOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUcmFuc21pdCBhIGZyYW1lCisgKi8KKyAKK3N0YXRpYyBpbnQgbWFjZV94bWl0X3N0YXJ0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1hY2VfZGF0YSAqbXAgPSAoc3RydWN0IG1hY2VfZGF0YSAqKSBkZXYtPnByaXY7CisKKwkvKiBTdG9wIHRoZSBxdWV1ZSBpZiB0aGUgYnVmZmVyIGlzIGZ1bGwgKi8KKworCWlmICghbXAtPnR4X2NvdW50KSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJcmV0dXJuIDE7CisJfQorCW1wLT50eF9jb3VudC0tOworCQorCW1wLT5zdGF0cy50eF9wYWNrZXRzKys7CisJbXAtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCisJLyogV2UgbmVlZCB0byBjb3B5IGludG8gb3VyIHhtaXQgYnVmZmVyIHRvIHRha2UgY2FyZSBvZiBhbGlnbm1lbnQgYW5kIGNhY2hpbmcgaXNzdWVzICovCisKKwltZW1jcHkoKHZvaWQgKikgbXAtPnR4X3JpbmcsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCisJLyogbG9hZCB0aGUgVHggRE1BIGFuZCBmaXJlIGl0IG9mZiAqLworCisJcHNjX3dyaXRlX2xvbmcoUFNDX0VORVRXUl9BRERSICsgbXAtPnR4X3Nsb3QsICh1MzIpICBtcC0+dHhfcmluZ19waHlzKTsKKwlwc2Nfd3JpdGVfbG9uZyhQU0NfRU5FVFdSX0xFTiArIG1wLT50eF9zbG90LCBza2ItPmxlbik7CisJcHNjX3dyaXRlX3dvcmQoUFNDX0VORVRXUl9DTUQgKyBtcC0+dHhfc2xvdCwgMHg5ODAwKTsKKworCW1wLT50eF9zbG90IF49IDB4MTA7CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICptYWNlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1hY2VfZGF0YSAqcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsKKwlyZXR1cm4gJnAtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCBtYWNlX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWFjZV9kYXRhICptcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsKKwl2b2xhdGlsZSBzdHJ1Y3QgbWFjZSAqbWIgPSBtcC0+bWFjZTsKKwlpbnQgaSwgajsKKwl1MzIgY3JjOworCXU4IG1hY2NjOworCisJbWFjY2MgPSBtYi0+bWFjY2M7CisJbWItPm1hY2NjICY9IH5QUk9NOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQltYi0+bWFjY2MgfD0gUFJPTTsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBjaGFyIG11bHRpY2FzdF9maWx0ZXJbOF07CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pID0gZGV2LT5tY19saXN0OworCisJCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQkJbXVsdGljYXN0X2ZpbHRlcltpXSA9IDB4RkY7CisJCQl9CisJCX0gZWxzZSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQkJCW11bHRpY2FzdF9maWx0ZXJbaV0gPSAwOworCQkJZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKykgeworCQkJCWNyYyA9IGV0aGVyX2NyY19sZSg2LCBkbWktPmRtaV9hZGRyKTsKKwkJCQlqID0gY3JjID4+IDI2OwkvKiBiaXQgbnVtYmVyIGluIG11bHRpY2FzdF9maWx0ZXIgKi8KKwkJCQltdWx0aWNhc3RfZmlsdGVyW2ogPj4gM10gfD0gMSA8PCAoaiAmIDcpOworCQkJCWRtaSA9IGRtaS0+bmV4dDsKKwkJCX0KKwkJfQorCisJCW1iLT5pYWMgPSBBRERSQ0hHIHwgTE9HQUREUjsKKwkJd2hpbGUgKG1iLT5pYWMgJiBBRERSQ0hHKTsKKwkJCisJCWZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKwkJCW1iLT5sYWRyZiA9IG11bHRpY2FzdF9maWx0ZXJbaV07CisJCX0KKwl9CisKKwltYi0+bWFjY2MgPSBtYWNjYzsKK30KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgaW50ZXJydXB0cyBhcmUgaGFuZGxlZCBoZXJlLiBXZSBtYXkgZW5kIHVwIAorICogaGF2aW5nIHRvIGJhc2ggdGhlIGNoaXAgb24gdGhlIGhlYWQgZm9yIGJhZCBlcnJvcnMKKyAqLworIAorc3RhdGljIHZvaWQgbWFjZV9oYW5kbGVfbWlzY19pbnRycyhzdHJ1Y3QgbWFjZV9kYXRhICptcCwgaW50IGludHIpCit7CisJdm9sYXRpbGUgc3RydWN0IG1hY2UgKm1iID0gbXAtPm1hY2U7CisJc3RhdGljIGludCBtYWNlX2JhYmJsZXMsIG1hY2VfamFiYmVyczsKKworCWlmIChpbnRyICYgTVBDTykgeworCQltcC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSAyNTY7CisJfQorCW1wLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IG1iLT5tcGM7CS8qIHJlYWRpbmcgY2xlYXJzIGl0ICovCisKKwlpZiAoaW50ciAmIFJOVFBDTykgeworCQltcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyArPSAyNTY7CisJfQorCW1wLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzICs9IG1iLT5ybnRwYzsJLyogcmVhZGluZyBjbGVhcnMgaXQgKi8KKworCWlmIChpbnRyICYgQ0VSUikgeworCQkrK21wLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzOworCX0KKwlpZiAoaW50ciAmIEJBQkJMRSkgeworCQlpZiAobWFjZV9iYWJibGVzKysgPCA0KSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAibWFjZTogYmFiYmxpbmcgdHJhbnNtaXR0ZXJcbiIpOworCQl9CisJfQorCWlmIChpbnRyICYgSkFCQkVSKSB7CisJCWlmIChtYWNlX2phYmJlcnMrKyA8IDQpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJtYWNlOiBqYWJiZXJpbmcgdHJhbnNjZWl2ZXJcbiIpOworCQl9CisJfQorfQorCisvKgorICoJQSB0cmFuc21pdCBlcnJvciBoYXMgb2NjdXJyZWQuIChXZSBraWNrIHRoZSB0cmFuc21pdCBzaWRlIGZyb20KKyAqCXRoZSBETUEgY29tcGxldGlvbikKKyAqLworIAorc3RhdGljIHZvaWQgbWFjZV94bWl0X2Vycm9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1hY2VfZGF0YSAqbXAgPSAoc3RydWN0IG1hY2VfZGF0YSAqKSBkZXYtPnByaXY7CisJdm9sYXRpbGUgc3RydWN0IG1hY2UgKm1iID0gbXAtPm1hY2U7CisJdTggeG10ZnMsIHhtdHJjOworCQorCXhtdGZzID0gbWItPnhtdGZzOworCXhtdHJjID0gbWItPnhtdHJjOworCQorCWlmICh4bXRmcyAmIFhNVFNWKSB7CisJCWlmICh4bXRmcyAmIFVGTE8pIHsKKwkJCXByaW50aygiJXM6IERNQSB1bmRlcnJ1bi5cbiIsIGRldi0+bmFtZSk7CisJCQltcC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQltcC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCW1hY2VfdHhkbWFfcmVzZXQoZGV2KTsKKwkJfQorCQlpZiAoeG10ZnMgJiBSVFJZKSB7CisJCQltcC0+c3RhdHMuY29sbGlzaW9ucysrOworCQl9CisJfQkJCQorfQorCisvKgorICoJQSByZWNlaXZlIGludGVycnVwdCBvY2N1cnJlZC4KKyAqLworIAorc3RhdGljIHZvaWQgbWFjZV9yZWN2X2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworLyoJc3RydWN0IG1hY2VfZGF0YSAqbXAgPSAoc3RydWN0IG1hY2VfZGF0YSAqKSBkZXYtPnByaXY7ICovCisvLwl2b2xhdGlsZSBzdHJ1Y3QgbWFjZSAqbWIgPSBtcC0+bWFjZTsKK30KKworLyoKKyAqIFByb2Nlc3MgdGhlIGNoaXAgaW50ZXJydXB0CisgKi8KKyAKK3N0YXRpYyBpcnFyZXR1cm5fdCBtYWNlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCXN0cnVjdCBtYWNlX2RhdGEgKm1wID0gKHN0cnVjdCBtYWNlX2RhdGEgKikgZGV2LT5wcml2OworCXZvbGF0aWxlIHN0cnVjdCBtYWNlICptYiA9IG1wLT5tYWNlOworCXU4IGlyOworCQorCWlyID0gbWItPmlyOworCW1hY2VfaGFuZGxlX21pc2NfaW50cnMobXAsIGlyKTsKKwkKKwlpZiAoaXIgJiBYTVRJTlQpIHsKKwkJbWFjZV94bWl0X2Vycm9yKGRldik7CisJfQorCWlmIChpciAmIFJDVklOVCkgeworCQltYWNlX3JlY3ZfaW50ZXJydXB0KGRldik7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgbWFjZV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisvKglzdHJ1Y3QgbWFjZV9kYXRhICptcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsgKi8KKy8vCXZvbGF0aWxlIHN0cnVjdCBtYWNlICptYiA9IG1wLT5tYWNlOworfQorCisvKgorICogSGFuZGxlIGEgbmV3bHkgYXJyaXZlZCBmcmFtZQorICovCisgCitzdGF0aWMgdm9pZCBtYWNlX2RtYV9yeF9mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbWFjZV9mcmFtZSAqbWYpCit7CisJc3RydWN0IG1hY2VfZGF0YSAqbXAgPSAoc3RydWN0IG1hY2VfZGF0YSAqKSBkZXYtPnByaXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlmIChtZi0+c3RhdHVzICYgUlNfT0ZMTykgeworCQlwcmludGsoIiVzOiBmaWZvIG92ZXJmbG93LlxuIiwgZGV2LT5uYW1lKTsKKwkJbXAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQltcC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwl9CisJaWYgKG1mLT5zdGF0dXMmKFJTX0NMU058UlNfRlJBTUVSUnxSU19GQ1NFUlIpKQorCQltcC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQorCWlmIChtZi0+c3RhdHVzJlJTX0NMU04pIHsKKwkJbXAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwl9CisJaWYgKG1mLT5zdGF0dXMmUlNfRlJBTUVSUikgeworCQltcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJfQorCWlmIChtZi0+c3RhdHVzJlJTX0ZDU0VSUikgeworCQltcC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCX0KKwkJCisJc2tiID0gZGV2X2FsbG9jX3NrYihtZi0+bGVuKzIpOworCWlmICghc2tiKSB7CisJCW1wLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXJldHVybjsKKwl9CisJc2tiX3Jlc2VydmUoc2tiLDIpOworCW1lbWNweShza2JfcHV0KHNrYiwgbWYtPmxlbiksIG1mLT5kYXRhLCBtZi0+bGVuKTsKKwkKKwlza2ItPmRldiA9IGRldjsKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCW5ldGlmX3J4KHNrYik7CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwltcC0+c3RhdHMucnhfcGFja2V0cysrOworCW1wLT5zdGF0cy5yeF9ieXRlcyArPSBtZi0+bGVuOworfQorCisvKgorICogVGhlIFBTQyBoYXMgcGFzc2VkIHVzIGEgRE1BIGludGVycnVwdCBldmVudC4KKyAqLworIAorc3RhdGljIGlycXJldHVybl90IG1hY2VfZG1hX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgbWFjZV9kYXRhICptcCA9IChzdHJ1Y3QgbWFjZV9kYXRhICopIGRldi0+cHJpdjsKKwlpbnQgbGVmdCwgaGVhZDsKKwl1MTYgc3RhdHVzOworCXUzMiBiYWthOworCisJLyogTm90IHN1cmUgd2hhdCB0aGlzIGRvZXMgKi8KKworCXdoaWxlICgoYmFrYSA9IHBzY19yZWFkX2xvbmcoUFNDX01ZU1RFUlkpKSAhPSBwc2NfcmVhZF9sb25nKFBTQ19NWVNURVJZKSk7CisJaWYgKCEoYmFrYSAmIDB4NjAwMDAwMDApKSByZXR1cm4gSVJRX05PTkU7CisKKwkvKgorCSAqIFByb2Nlc3MgdGhlIHJlYWQgcXVldWUKKwkgKi8KKwkJIAorCXN0YXR1cyA9IHBzY19yZWFkX3dvcmQoUFNDX0VORVRSRF9DVEwpOworCQkKKwlpZiAoc3RhdHVzICYgMHgyMDAwKSB7CisJCW1hY2VfcnhkbWFfcmVzZXQoZGV2KTsKKwl9IGVsc2UgaWYgKHN0YXR1cyAmIDB4MDEwMCkgeworCQlwc2Nfd3JpdGVfd29yZChQU0NfRU5FVFJEX0NNRCArIG1wLT5yeF9zbG90LCAweDExMDApOworCisJCWxlZnQgPSBwc2NfcmVhZF9sb25nKFBTQ19FTkVUUkRfTEVOICsgbXAtPnJ4X3Nsb3QpOworCQloZWFkID0gTl9SWF9SSU5HIC0gbGVmdDsKKworCQkvKiBMb29wIHRocm91Z2ggdGhlIHJpbmcgYnVmZmVyIGFuZCBwcm9jZXNzIG5ldyBwYWNrYWdlcyAqLworCisJCXdoaWxlIChtcC0+cnhfdGFpbCA8IGhlYWQpIHsKKwkJCW1hY2VfZG1hX3J4X2ZyYW1lKGRldiwgKHN0cnVjdCBtYWNlX2ZyYW1lICopIChtcC0+cnhfcmluZyArIChtcC0+cnhfdGFpbCAqIDB4MDgwMCkpKTsKKwkJCW1wLT5yeF90YWlsKys7CisJCX0KKwkJCQorCQkvKiBJZiB3ZSdyZSBvdXQgb2YgYnVmZmVycyBpbiB0aGlzIHJpbmcgdGhlbiBzd2l0Y2ggdG8gKi8KKwkJLyogdGhlIG90aGVyIHNldCwgb3RoZXJ3aXNlIGp1c3QgcmVhY3RpdmF0ZSB0aGlzIG9uZS4gICovCisKKwkJaWYgKCFsZWZ0KSB7CisJCQltYWNlX2xvYWRfcnhkbWFfYmFzZShkZXYsIG1wLT5yeF9zbG90KTsKKwkJCW1wLT5yeF9zbG90IF49IDB4MTA7CisJCX0gZWxzZSB7CisJCQlwc2Nfd3JpdGVfd29yZChQU0NfRU5FVFJEX0NNRCArIG1wLT5yeF9zbG90LCAweDk4MDApOworCQl9CisJfQorCQkKKwkvKgorCSAqIFByb2Nlc3MgdGhlIHdyaXRlIHF1ZXVlCisJICovCisKKwlzdGF0dXMgPSBwc2NfcmVhZF93b3JkKFBTQ19FTkVUV1JfQ1RMKTsKKworCWlmIChzdGF0dXMgJiAweDIwMDApIHsKKwkJbWFjZV90eGRtYV9yZXNldChkZXYpOworCX0gZWxzZSBpZiAoc3RhdHVzICYgMHgwMTAwKSB7CisJCXBzY193cml0ZV93b3JkKFBTQ19FTkVUV1JfQ01EICsgbXAtPnR4X3Nsb3RpLCAweDAxMDApOworCQltcC0+dHhfc2xvdGkgXj0gMHgxMDsKKwkJbXAtPnR4X2NvdW50Kys7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWNzb25pYy5jIGIvZHJpdmVycy9uZXQvbWFjc29uaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTI4YzY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbWFjc29uaWMuYwpAQCAtMCwwICsxLDY1NyBAQAorLyoKKyAqIG1hY3NvbmljLmMKKyAqCisgKiAoQykgMTk5OCBBbGFuIENveAorICoKKyAqIERlYnVnZ2luZyBBbmRyZWFzIEVobGlhciwgTWljaGFlbCBTY2htaXR6CisgKgorICogQmFzZWQgb24gY29kZQorICogKEMpIDE5OTYgYnkgVGhvbWFzIEJvZ2VuZG9lcmZlciAodHNib2dlbmRAYmlnYnVnLmZyYW5rZW4uZGUpCisgKiAKKyAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHdvcmsgZnJvbSBBbmRyZWFzIEJ1c3NlLCBidXQgbW9zdCBvZgorICogdGhlIGNvZGUgaXMgcmV3cml0dGVuLgorICogCisgKiAoQykgMTk5NSBieSBBbmRyZWFzIEJ1c3NlIChhbmR5QHdhbGRvcmYtZ21iaC5kZSkKKyAqCisgKiBBIGRyaXZlciBmb3IgdGhlIE1hYyBvbmJvYXJkIFNvbmljIGV0aGVybmV0IGNoaXAuCisgKgorICogOTgvMTIvMjEgTVNjaDoganVkZ2VkIGZyb20gdGVzdHMgb24gUTgwMCwgaXQncyBiYXNpY2FsbHkgd29ya2luZywgCisgKgkJICBidXQgZWF0aW5nIHVwIGJvdGggcmVjZWl2ZSBhbmQgdHJhbnNtaXQgcmVzb3VyY2VzCisgKgkJICBhbmQgZHVwbGljYXRpbmcgcGFja2V0cy4gTmVlZHMgbW9yZSB0ZXN0aW5nLgorICoKKyAqIDk5LzAxLzAzIE1TY2g6IHVwZ3JhZGVkIHRvIHZlcnNpb24gMC45MiBvZiB0aGUgY29yZSBkcml2ZXIsIGZpeGVkLgorICogCisgKiAwMC8xMC8zMSBzYW1teUBvaC52ZXJpby5jb206IFVwZGF0ZWQgZHJpdmVyIGZvciAyLjQga2VybmVscywgZml4ZWQgcHJvYmxlbXMKKyAqICAgICAgICAgIG9uIGNlbnRyaXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L251YnVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2h3dGVzdC5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaW50b3NoLmg+CisjaW5jbHVkZSA8YXNtL21hY2ludHMuaD4KKyNpbmNsdWRlIDxhc20vbWFjX3ZpYS5oPgorCisjZGVmaW5lIFNSRUdTX1BBRChuKSAgICB1MTYgbjsKKworI2luY2x1ZGUgInNvbmljLmgiCisKKyNkZWZpbmUgU09OSUNfUkVBRChyZWcpIFwKKwludWJ1c19yZWFkbChiYXNlX2FkZHIrKHJlZykpCisjZGVmaW5lIFNPTklDX1dSSVRFKHJlZyx2YWwpIFwKKwludWJ1c193cml0ZWwoKHZhbCksIGJhc2VfYWRkcisocmVnKSkKKyNkZWZpbmUgc29uaWNfcmVhZChkZXYsIHJlZykgXAorCW51YnVzX3JlYWRsKChkZXYpLT5iYXNlX2FkZHIrKHJlZykpCisjZGVmaW5lIHNvbmljX3dyaXRlKGRldiwgcmVnLCB2YWwpIFwKKwludWJ1c193cml0ZWwoKHZhbCksIChkZXYpLT5iYXNlX2FkZHIrKHJlZykpCisKKworc3RhdGljIGludCBzb25pY19kZWJ1ZzsKK3N0YXRpYyBpbnQgc29uaWNfdmVyc2lvbl9wcmludGVkOworCitzdGF0aWMgaW50IHJlZ19vZmZzZXQ7CisKK2V4dGVybiBpbnQgbWFjX29uYm9hcmRfc29uaWNfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitleHRlcm4gaW50IG1hY19udWJ1c19zb25pY19wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKKworLyogRm9yIG9uYm9hcmQgU09OSUMgKi8KKyNkZWZpbmUgT05CT0FSRF9TT05JQ19SRUdJU1RFUlMJMHg1MEYwQTAwMAorI2RlZmluZSBPTkJPQVJEX1NPTklDX1BST01fQkFTRQkweDUwZjA4MDAwCisKK2VudW0gbWFjc29uaWNfdHlwZSB7CisJTUFDU09OSUNfRFVPRE9DSywKKwlNQUNTT05JQ19BUFBMRSwKKwlNQUNTT05JQ19BUFBMRTE2LAorCU1BQ1NPTklDX0RBWU5BLAorCU1BQ1NPTklDX0RBWU5BTElOSworfTsKKworLyogRm9yIHRoZSBidWlsdC1pbiBTT05JQyBpbiB0aGUgRHVvIERvY2sgKi8KKyNkZWZpbmUgRFVPRE9DS19TT05JQ19SRUdJU1RFUlMgMHhlMTAwMDAKKyNkZWZpbmUgRFVPRE9DS19TT05JQ19QUk9NX0JBU0UgMHhlMTIwMDAKKworLyogRm9yIEFwcGxlLXN0eWxlIE51QnVzIFNPTklDICovCisjZGVmaW5lIEFQUExFX1NPTklDX1JFR0lTVEVSUwkwCisjZGVmaW5lIEFQUExFX1NPTklDX1BST01fQkFTRQkweDQwMDAwCisKKy8qIERheW5hbGluayBMQyBTT05JQyAqLworI2RlZmluZSBEQVlOQUxJTktfUFJPTV9CQVNFIDB4NDAwMDAwCisKKy8qIEZvciBEYXluYS1zdHlsZSBOdUJ1cyBTT05JQyAoaGF2ZW4ndCBzZWVuIG9uZSB5ZXQpICovCisjZGVmaW5lIERBWU5BX1NPTklDX1JFR0lTVEVSUyAgIDB4MTgwMDAwCisvKiBUaGlzIGlzIHdoYXQgT3BlbkJTRCBzYXlzLiAgSG93ZXZlciwgdGhpcyBpcyBkZWZpbml0ZWx5IGluIE51QnVzCisgICBST00gc3BhY2Ugc28gd2Ugc2hvdWxkIGJlIGFibGUgdG8gZ2V0IGl0IGJ5IHdhbGtpbmcgdGhlIE51QnVzCisgICByZXNvdXJjZSBkaXJlY3RvcmllcyAqLworI2RlZmluZSBEQVlOQV9TT05JQ19NQUNfQUREUgkweGZmZTAwNAorCisjZGVmaW5lIFNPTklDX1JFQURfUFJPTShhZGRyKSBudWJ1c19yZWFkYihwcm9tX2FkZHIrYWRkcikKKworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgbWFjc29uaWNfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2V0aGVyZGV2KDApOworCWludCBlcnI7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAodW5pdCA+PSAwKQorCQlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisKKyAJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJLyogVGhpcyB3aWxsIGNhdGNoIGZhdGFsIHN0dWZmIGxpa2UgLUVOT01FTSBhcyB3ZWxsIGFzIHN1Y2Nlc3MgKi8KKwllcnIgPSBtYWNfb25ib2FyZF9zb25pY19wcm9iZShkZXYpOworCWlmIChlcnIgPT0gMCkKKwkJZ290byBmb3VuZDsKKwlpZiAoZXJyICE9IC1FTk9ERVYpCisJCWdvdG8gb3V0OworCWVyciA9IG1hY19udWJ1c19zb25pY19wcm9iZShkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworZm91bmQ6CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCWtmcmVlKGRldi0+cHJpdik7CitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCisvKgorICogRm9yIHJldmVyc2luZyB0aGUgUFJPTSBhZGRyZXNzCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbmliYmxldGFiW10gPSB7MCwgOCwgNCwgMTIsIDIsIDEwLCA2LCAxNCwKKwkJCQkgICAgMSwgOSwgNSwgMTMsIDMsIDExLCA3LCAxNX07CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiaXRfcmV2ZXJzZV9hZGRyKHVuc2lnbmVkIGNoYXIgYWRkcls2XSkKK3sKKwlpbnQgaTsKKworCWZvcihpID0gMDsgaSA8IDY7IGkrKykKKwkJYWRkcltpXSA9ICgobmliYmxldGFiW2FkZHJbaV0gJiAweGZdIDw8IDQpIHwgCisJCQkgICBuaWJibGV0YWJbKGFkZHJbaV0gPj4gNCkgJjB4Zl0pOworfQorCitpbnQgX19pbml0IG1hY3NvbmljX2luaXQoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlzdHJ1Y3Qgc29uaWNfbG9jYWwqIGxwID0gTlVMTDsKKwlpbnQgaTsKKworCS8qIEFsbG9jYXRlIHRoZSBlbnRpcmUgY2h1bmsgb2YgbWVtb3J5IGZvciB0aGUgZGVzY3JpcHRvcnMuCisgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIGNhbm5vdCBjcm9zcyBhIDY0SyBib3VuZGFyeS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIGRlc2NfYmFzZSwgZGVzY190b3A7CisJCWlmKChscCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb25pY19sb2NhbCksIEdGUF9LRVJORUwgfCBHRlBfRE1BKSkgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGRuJ3QgYWxsb2NhdGUgZGVzY3JpcHRvciBidWZmZXJzXG4iLCBkZXYtPm5hbWUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlkZXNjX2Jhc2UgPSAodW5zaWduZWQgbG9uZykgbHA7CisJCWRlc2NfdG9wID0gZGVzY19iYXNlICsgc2l6ZW9mKHN0cnVjdCBzb25pY19sb2NhbCk7CisJCWlmICgoZGVzY190b3AgJiAweGZmZmYpID49IChkZXNjX2Jhc2UgJiAweGZmZmYpKQorCQkJYnJlYWs7CisJCS8qIEhtbS4gdHJ5IGFnYWluIChGSVhNRTogZG9lcyB0aGlzIGFjdHVhbGx5IHdvcms/KSAqLworCQlrZnJlZShscCk7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6IGRpZG4ndCBnZXQgY29udGluZ3VvdXMgY2h1bmsgWyUwOGx4IC0gJTA4bHhdLCB0cnlpbmcgYWdhaW5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGRlc2NfYmFzZSwgZGVzY190b3ApOworCX0KKworCWlmIChscCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyaWVkIDIwIHRpbWVzIHRvIGFsbG9jYXRlIGRlc2NyaXB0b3IgYnVmZmVycywgZ2l2aW5nIHVwLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0JCSAgICAgICAKKworCWRldi0+cHJpdiA9IGxwOworCisjaWYgMAorCS8qIHRoaXMgY29kZSBpcyBvbmx5IGhlcmUgYXMgYSBjdXJpb3VzaXR5Li4uICAgbWFpbmx5LCB3aGVyZSB0aGUgCisJICAgZnVjayBkaWQgU09OSUNfQlVTX1NDQUxFIGNvbWUgZnJvbSwgYW5kIHdoYXQgd2FzIGl0IHN1cHBvc2VkCisJICAgdG8gZG8/ICB0aGUgbm9ybWFsIGFsbG9jYXRpb24gd29ya3MgZ3JlYXQgZm9yIDMyIGJpdCBzdHVmZnMuLiAgKi8KKworCS8qIE5vdyBzZXQgdXAgdGhlIHBvaW50ZXJzIHRvIHBvaW50IHRvIHRoZSBhcHByb3ByaWF0ZSBwbGFjZXMgKi8KKwlscC0+Y2RhID0gbHAtPnNvbmljX2Rlc2M7CisJbHAtPnRkYSA9IGxwLT5jZGEgKyAoU0laRU9GX1NPTklDX0NEQSAqIFNPTklDX0JVU19TQ0FMRShscC0+ZG1hX2JpdG1vZGUpKTsKKwlscC0+cmRhID0gbHAtPnRkYSArIChTSVpFT0ZfU09OSUNfVEQgKiBTT05JQ19OVU1fVERTCisJCQkgICAgICogU09OSUNfQlVTX1NDQUxFKGxwLT5kbWFfYml0bW9kZSkpOworCWxwLT5ycmEgPSBscC0+cmRhICsgKFNJWkVPRl9TT05JQ19SRCAqIFNPTklDX05VTV9SRFMKKwkJCSAgICAgKiBTT05JQ19CVVNfU0NBTEUobHAtPmRtYV9iaXRtb2RlKSk7CisKKyNlbmRpZgorCQorCW1lbXNldChscCwgMCwgc2l6ZW9mKHN0cnVjdCBzb25pY19sb2NhbCkpOworCisJbHAtPmNkYV9sYWRkciA9ICh1bnNpZ25lZCBpbnQpJihscC0+Y2RhKTsKKwlscC0+dGRhX2xhZGRyID0gKHVuc2lnbmVkIGludClscC0+dGRhOworCWxwLT5ycmFfbGFkZHIgPSAodW5zaWduZWQgaW50KWxwLT5ycmE7CisJbHAtPnJkYV9sYWRkciA9ICh1bnNpZ25lZCBpbnQpbHAtPnJkYTsKKworCS8qIEZJWE1FLCBtYXliZSB3ZSBzaG91bGQgdXNlIHNrYnMgKi8KKwlpZiAoKGxwLT5yYmEgPSAoY2hhciAqKQorCSAgICAga21hbGxvYyhTT05JQ19OVU1fUlJTICogU09OSUNfUkJTSVpFLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSkpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGRuJ3QgYWxsb2NhdGUgcmVjZWl2ZSBidWZmZXJzXG4iLCBkZXYtPm5hbWUpOworCQlkZXYtPnByaXYgPSBOVUxMOworCQlrZnJlZShscCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWxwLT5yYmFfbGFkZHIgPSAodW5zaWduZWQgaW50KWxwLT5yYmE7CisKKwl7CisJCWludCBycywgZHM7CisKKwkJLyogYWxtb3N0IGFsd2F5cyAxMio0MDk2LCBidXQgbGV0J3Mgbm90IHRha2UgY2hhbmNlcyAqLworCQlycyA9ICgoU09OSUNfTlVNX1JSUyAqIFNPTklDX1JCU0laRSArIDQwOTUpIC8gNDA5NikgKiA0MDk2OworCQkvKiBhbG1vc3QgYWx3YXlzIHVuZGVyIGEgcGFnZSwgYnV0IGxldCdzIG5vdCB0YWtlIGNoYW5jZXMgKi8KKwkJZHMgPSAoKHNpemVvZihzdHJ1Y3Qgc29uaWNfbG9jYWwpICsgNDA5NSkgLyA0MDk2KSAqIDQwOTY7CisJCWtlcm5lbF9zZXRfY2FjaGVtb2RlKGxwLT5yYmEsIHJzLCBJT01BUF9OT0NBQ0hFX1NFUik7CisJCWtlcm5lbF9zZXRfY2FjaGVtb2RlKGxwLCBkcywgSU9NQVBfTk9DQUNIRV9TRVIpOworCX0KKwkKKyNpZiAwCisJZmx1c2hfY2FjaGVfYWxsKCk7CisjZW5kaWYKKworCWRldi0+b3BlbiA9IHNvbmljX29wZW47CisJZGV2LT5zdG9wID0gc29uaWNfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBzb25pY19zZW5kX3BhY2tldDsKKwlkZXYtPmdldF9zdGF0cyA9IHNvbmljX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzb25pY19tdWx0aWNhc3RfbGlzdDsKKworCS8qCisJICogY2xlYXIgdGFsbHkgY291bnRlcgorCSAqLworCXNvbmljX3dyaXRlKGRldiwgU09OSUNfQ1JDVCwgMHhmZmZmKTsKKwlzb25pY193cml0ZShkZXYsIFNPTklDX0ZBRVQsIDB4ZmZmZik7CisJc29uaWNfd3JpdGUoZGV2LCBTT05JQ19NUFQsIDB4ZmZmZik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9faW5pdCBtYWNfb25ib2FyZF9zb25pY19ldGhlcm5ldF9hZGRyKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJY29uc3QgaW50IHByb21fYWRkciA9IE9OQk9BUkRfU09OSUNfUFJPTV9CQVNFOworCWludCBpOworCisJLyogT24gTnVCdXMgYm9hcmRzIHdlIGNhbiBzb21ldGltZXMgbG9vayBpbiB0aGUgUk9NIHJlc291cmNlcy4KKwkgICBObyBzdWNoIGx1Y2sgZm9yIGNvbW0tc2xvdC9vbmJvYXJkLiAqLworCWZvcihpID0gMDsgaSA8IDY7IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IFNPTklDX1JFQURfUFJPTShpKTsKKworCS8qIE1vc3Qgb2YgdGhlIHRpbWUsIHRoZSBhZGRyZXNzIGlzIGJpdC1yZXZlcnNlZC4gIFRoZSBOZXRCU0QKKwkgICBzb3VyY2UgaGFzIGEgcmF0aGVyIGxvbmcgYW5kIGRldGFpbGVkIGhpc3RvcmljYWwgYWNjb3VudCBvZgorCSAgIHdoeSB0aGlzIGlzIHNvLiAqLworCWlmIChtZW1jbXAoZGV2LT5kZXZfYWRkciwgIlx4MDhceDAwXHgwNyIsIDMpICYmCisJICAgIG1lbWNtcChkZXYtPmRldl9hZGRyLCAiXHgwMFx4QTBceDQwIiwgMykgJiYKKwkgICAgbWVtY21wKGRldi0+ZGV2X2FkZHIsICJceDAwXHgwNVx4MDIiLCAzKSkKKwkJYml0X3JldmVyc2VfYWRkcihkZXYtPmRldl9hZGRyKTsKKwllbHNlCisJCXJldHVybiAwOworCisJLyogSWYgd2Ugc3RpbGwgaGF2ZSB3aGF0IHNlZW1zIHRvIGJlIGEgYm9ndXMgYWRkcmVzcywgd2UnbGwKKyAgICAgICAgICAgbG9vayBpbiB0aGUgQ0FNLiAgVGhlIHRvcCBlbnRyeSBzaG91bGQgYmUgb3Vycy4gKi8KKwkvKiBEYW5nZXIhIFRoaXMgb25seSB3b3JrcyBpZiBNYWNPUyBoYXMgYWxyZWFkeSBpbml0aWFsaXplZAorICAgICAgICAgICB0aGUgY2FyZC4uLiAqLworCWlmIChtZW1jbXAoZGV2LT5kZXZfYWRkciwgIlx4MDhceDAwXHgwNyIsIDMpICYmCisJICAgIG1lbWNtcChkZXYtPmRldl9hZGRyLCAiXHgwMFx4QTBceDQwIiwgMykgJiYKKwkgICAgbWVtY21wKGRldi0+ZGV2X2FkZHIsICJceDAwXHgwNVx4MDIiLCAzKSkKKwl7CisJCXVuc2lnbmVkIHNob3J0IHZhbDsKKworCQlwcmludGsoS0VSTl9JTkZPICJtYWNzb25pYzogUFJPTSBzZWVtcyB0byBiZSB3cm9uZywgdHJ5aW5nIENBTSBlbnRyeSAxNVxuIik7CisJCQorCQlzb25pY193cml0ZShkZXYsIFNPTklDX0NNRCwgU09OSUNfQ1JfUlNUKTsKKwkJc29uaWNfd3JpdGUoZGV2LCBTT05JQ19DRVAsIDE1KTsKKworCQl2YWwgPSBzb25pY19yZWFkKGRldiwgU09OSUNfQ0FQMik7CisJCWRldi0+ZGV2X2FkZHJbNV0gPSB2YWwgPj4gODsKKwkJZGV2LT5kZXZfYWRkcls0XSA9IHZhbCAmIDB4ZmY7CisJCXZhbCA9IHNvbmljX3JlYWQoZGV2LCBTT05JQ19DQVAxKTsKKwkJZGV2LT5kZXZfYWRkclszXSA9IHZhbCA+PiA4OworCQlkZXYtPmRldl9hZGRyWzJdID0gdmFsICYgMHhmZjsKKwkJdmFsID0gc29uaWNfcmVhZChkZXYsIFNPTklDX0NBUDApOworCQlkZXYtPmRldl9hZGRyWzFdID0gdmFsID4+IDg7CisJCWRldi0+ZGV2X2FkZHJbMF0gPSB2YWwgJiAweGZmOworCQkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSFcgQWRkcmVzcyBmcm9tIENBTSAxNTogIik7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJCXByaW50aygiJTIuMngiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwkJCWlmIChpIDwgNSkKKwkJCQlwcmludGsoIjoiKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisJfSBlbHNlIHJldHVybiAwOworCisJaWYgKG1lbWNtcChkZXYtPmRldl9hZGRyLCAiXHgwOFx4MDBceDA3IiwgMykgJiYKKwkgICAgbWVtY21wKGRldi0+ZGV2X2FkZHIsICJceDAwXHhBMFx4NDAiLCAzKSAmJgorCSAgICBtZW1jbXAoZGV2LT5kZXZfYWRkciwgIlx4MDBceDA1XHgwMiIsIDMpKQorCXsKKwkJLyoKKwkJICogU3RpbGwgbm9uc2Vuc2UgLi4uIG1lc3NlZCB1cCBzb21lcGxhY2UhCisJCSAqLworCQlwcmludGsoS0VSTl9FUlIgIm1hY3NvbmljOiBFUlJPUiAoSU5WQUxJRCBNQUMpXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfSBlbHNlIHJldHVybiAwOworfQorCitpbnQgX19pbml0IG1hY19vbmJvYXJkX3NvbmljX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJLyogQndhaGFoYWhhICovCisJc3RhdGljIGludCBvbmNlX2lzX21vcmVfdGhhbl9lbm91Z2g7CisJaW50IGk7CisJaW50IGRtYV9iaXRtb2RlOworCQorCWlmIChvbmNlX2lzX21vcmVfdGhhbl9lbm91Z2gpCisJCXJldHVybiAtRU5PREVWOworCW9uY2VfaXNfbW9yZV90aGFuX2Vub3VnaCA9IDE7CisKKwlpZiAoIU1BQ0hfSVNfTUFDKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByaW50ayhLRVJOX0lORk8gIkNoZWNraW5nIGZvciBpbnRlcm5hbCBNYWNpbnRvc2ggZXRoZXJuZXQgKFNPTklDKS4uICIpOworCisJaWYgKG1hY2ludG9zaF9jb25maWctPmV0aGVyX3R5cGUgIT0gTUFDX0VUSEVSX1NPTklDKQorCXsKKwkJcHJpbnRrKCJub25lLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEJvZ3VzIHByb2JpbmcsIG9uIHRoZSBtb2RlbHMgd2hpY2ggbWF5IG9yIG1heSBub3QgaGF2ZQorCSAgIEV0aGVybmV0IChCVFcsIHRoZSBFdGhlcm5ldCAqaXMqIGFsd2F5cyBhdCB0aGUgc2FtZQorCSAgIGFkZHJlc3MsIGFuZCBub3RoaW5nIGVsc2UgbGl2ZXMgdGhlcmUsIGF0IGxlYXN0IGlmIEFwcGxlJ3MKKwkgICBkb2N1bWVudGF0aW9uIGlzIHRvIGJlIGJlbGlldmVkKSAqLworCWlmIChtYWNpbnRvc2hfY29uZmlnLT5pZGVudCA9PSBNQUNfTU9ERUxfUTYzMCB8fAorCSAgICBtYWNpbnRvc2hfY29uZmlnLT5pZGVudCA9PSBNQUNfTU9ERUxfUDU4OCB8fAorCSAgICBtYWNpbnRvc2hfY29uZmlnLT5pZGVudCA9PSBNQUNfTU9ERUxfQzYxMCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlpbnQgY2FyZF9wcmVzZW50OworCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJY2FyZF9wcmVzZW50ID0gaHdyZWdfcHJlc2VudCgodm9pZCopT05CT0FSRF9TT05JQ19SRUdJU1RFUlMpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkJaWYgKCFjYXJkX3ByZXNlbnQpIHsKKwkJCXByaW50aygibm9uZS5cbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlwcmludGsoInllc1xuIik7CQorCisJLyogRGFuZ2VyISAgTXkgYXJtcyBhcmUgZmxhaWxpbmcgd2lsZGx5ISAgWW91ICptdXN0KiBzZXQgdGhpcworICAgICAgICAgICBiZWZvcmUgdXNpbmcgc29uaWNfcmVhZCgpICovCisKKwlkZXYtPmJhc2VfYWRkciA9IE9OQk9BUkRfU09OSUNfUkVHSVNURVJTOworCWlmICh2aWFfYWx0X21hcHBpbmcpCisJCWRldi0+aXJxID0gSVJRX0FVVE9fMzsKKwllbHNlCisJCWRldi0+aXJxID0gSVJRX05VQlVTXzk7CisKKwlpZiAoIXNvbmljX3ZlcnNpb25fcHJpbnRlZCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworCQlzb25pY192ZXJzaW9uX3ByaW50ZWQgPSAxOworCX0KKwlwcmludGsoS0VSTl9JTkZPICIlczogb25ib2FyZCAvIGNvbW0tc2xvdCBTT05JQyBhdCAweCUwOGx4XG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyKTsKKworCS8qIE5vdyBkbyBhIHNvbmcgYW5kIGRhbmNlIHJvdXRpbmUgaW4gYW4gYXR0ZW1wdCB0byBkZXRlcm1pbmUKKyAgICAgICAgICAgdGhlIGJ1cyB3aWR0aCAqLworCisJLyogVGhlIFBvd2VyQm9vaydzIFNPTklDIGlzIDE2IGJpdCBhbHdheXMuICovCisJaWYgKG1hY2ludG9zaF9jb25maWctPmlkZW50ID09IE1BQ19NT0RFTF9QQjUyMCkgeworCQlyZWdfb2Zmc2V0ID0gMDsKKwkJZG1hX2JpdG1vZGUgPSAwOworCX0gZWxzZSBpZiAobWFjaW50b3NoX2NvbmZpZy0+aWRlbnQgPT0gTUFDX01PREVMX0M2MTApIHsKKwkJcmVnX29mZnNldCA9IDA7CisJCWRtYV9iaXRtb2RlID0gMTsKKwl9IGVsc2UgeworCQkvKiBTb21lIG9mIHRoZSBjb21tLXNsb3QgY2FyZHMgYXJlIDE2IGJpdC4gIEJ1dCBzb21lCisgICAgICAgICAgICAgICAgICAgb2YgdGhlbSBhcmUgbm90LiAgVGhlIDMyLWJpdCBjYXJkcyB1c2Ugb2Zmc2V0IDIgYW5kCisgICAgICAgICAgICAgICAgICAgcGFkIHdpdGggemVyb2VzIG9yIHNvbWV0aW1lcyBvbmVzIChJIHRoaW5rLi4uKQorICAgICAgICAgICAgICAgICAgIFRoZXJlZm9yZSwgaWYgd2UgdHJ5IG9mZnNldCAwIGFuZCBnZXQgYSBzaWxpY29uCisgICAgICAgICAgICAgICAgICAgcmV2aXNpb24gb2YgMCwgd2UgYXNzdW1lIDE2IGJpdC4gKi8KKwkJaW50IHNyOworCisJCS8qIFRlY2huaWNhbGx5IHRoaXMgaXMgbm90IG5lY2Vzc2FyeSBzaW5jZSB3ZSB6ZXJvZWQKKyAgICAgICAgICAgICAgICAgICBpdCBhYm92ZSAqLworCQlyZWdfb2Zmc2V0ID0gMDsKKwkJZG1hX2JpdG1vZGUgPSAwOworCQlzciA9IHNvbmljX3JlYWQoZGV2LCBTT05JQ19TUik7CisJCWlmIChzciA9PSAwIHx8IHNyID09IDB4ZmZmZikgeworCQkJcmVnX29mZnNldCA9IDI7CisJCQkvKiA4MzkzMiBpcyAweDAwMDQsIDgzOTM0IGlzIDB4MDEwMCBvciAweDAxMDEgKi8KKwkJCXNyID0gc29uaWNfcmVhZChkZXYsIFNPTklDX1NSKTsKKwkJCWRtYV9iaXRtb2RlID0gMTsKKwkJCQorCQl9CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlczogcmV2aXNpb24gMHglMDR4LCB1c2luZyAlZCBiaXQgRE1BIGFuZCByZWdpc3RlciBvZmZzZXQgJWRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHNyLCBkbWFfYml0bW9kZT8zMjoxNiwgcmVnX29mZnNldCk7CisJfQorCQorCisJLyogdGhpcyBjYXJyaWVzIG15IHNpbmNlcmUgYXBvbG9naWVzIC0tIGJ5IHRoZSB0aW1lIEkgZ290IHRvIHVwZGF0aW5nCisJICAgdGhlIGRyaXZlciwgc3VwcG9ydCBmb3IgInJlZ19vZmZzZXRzIiBhcHBlYXJlcyBub3doZXJlIGluIHRoZSBzb25pYworCSAgIGNvZGUsIGdvaW5nIGJhY2sgZm9yIG92ZXIgYSB5ZWFyLiAgRm9ydHVuYXRlbHksIG15IE1hYyBkb2VzJ3Qgc2VlbQorCSAgIHRvIHVzZSB3aGF0ZXZlciB0aGlzIHdhcy4KKworCSAgIElmIHlvdSBrbm93IGhvdyB0aGlzIGlzIHN1cHBvc2VkIHRvIGJlIGltcGxlbWVudGVkLCBlaXRoZXIgZml4IGl0LAorCSAgIG9yIGNvbnRhY3QgbWUgKHNhbW15QG9oLnZlcmlvLmNvbSkgdG8gZXhwbGFpbiB3aGF0IGl0IGlzLiAtLVNhbSAqLworCSAgIAorCWlmKHJlZ19vZmZzZXQpIHsKKwkJcHJpbnRrKCIlczogcmVnaXN0ZXIgb2Zmc2V0IHVuc3VwcG9ydGVkLiAgcGxlYXNlIGZpeCB0aGlzIGlmIHlvdSBrbm93IHdoYXQgaXQgaXMuXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJCisJLyogU29mdHdhcmUgcmVzZXQsIHRoZW4gaW5pdGlhbGl6ZSBjb250cm9sIHJlZ2lzdGVycy4gKi8KKwlzb25pY193cml0ZShkZXYsIFNPTklDX0NNRCwgU09OSUNfQ1JfUlNUKTsKKwlzb25pY193cml0ZShkZXYsIFNPTklDX0RDUiwgU09OSUNfRENSX0JNUyB8CisJCSAgICBTT05JQ19EQ1JfUkZUMSB8IFNPTklDX0RDUl9URlQwIHwgU09OSUNfRENSX0VYQlVTIHwKKwkJICAgIChkbWFfYml0bW9kZSA/IFNPTklDX0RDUl9EVyA6IDApKTsKKworCS8qIFRoaXMgKm11c3QqIGJlIHdyaXR0ZW4gYmFjayB0byBpbiBvcmRlciB0byByZXN0b3JlIHRoZQorICAgICAgICAgICBleHRlbmRlZCBwcm9ncmFtbWFibGUgb3V0cHV0IGJpdHMgKi8KKwlzb25pY193cml0ZShkZXYsIFNPTklDX0RDUjIsIDApOworCisJLyogQ2xlYXIgKmFuZCogZGlzYWJsZSBpbnRlcnJ1cHRzIHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUgKi8KKwlzb25pY193cml0ZShkZXYsIFNPTklDX0lTUiwweDdmZmYpOworCXNvbmljX3dyaXRlKGRldiwgU09OSUNfSU1SLDApOworCisJLyogTm93IGxvb2sgZm9yIHRoZSBNQUMgYWRkcmVzcy4gKi8KKwlpZiAobWFjX29uYm9hcmRfc29uaWNfZXRoZXJuZXRfYWRkcihkZXYpICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJcHJpbnRrKEtFUk5fSU5GTyAiTUFDICIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJcHJpbnRrKCIlMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0pOworCQlpZiAoaSA8IDUpCisJCQlwcmludGsoIjoiKTsKKwl9CisKKwlwcmludGsoIiBJUlEgJWRcbiIsIGRldi0+aXJxKTsKKworCS8qIFNoYXJlZCBpbml0IGNvZGUgKi8KKwlyZXR1cm4gbWFjc29uaWNfaW5pdChkZXYpOworfQorCitpbnQgX19pbml0IG1hY19udWJ1c19zb25pY19ldGhlcm5ldF9hZGRyKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCQkJCSB1bnNpZ25lZCBsb25nIHByb21fYWRkciwKKwkJCQkJIGludCBpZCkKK3sKKwlpbnQgaTsKKwlmb3IoaSA9IDA7IGkgPCA2OyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSBTT05JQ19SRUFEX1BST00oaSk7CisJLyogRm9yIG5vdyB3ZSBhcmUgZ29pbmcgdG8gYXNzdW1lIHRoYXQgdGhleSdyZSBhbGwgYml0LXJldmVyc2VkICovCisJYml0X3JldmVyc2VfYWRkcihkZXYtPmRldl9hZGRyKTsKKworCXJldHVybiAwOworfQorCitpbnQgX19pbml0IG1hY3NvbmljX2lkZW50KHN0cnVjdCBudWJ1c19kZXYqIG5kZXYpCit7CisJaWYgKG5kZXYtPmRyX2h3ID09IE5VQlVTX0RSSFdfQVNBTlRFX0xDICYmIAorCSAgICBuZGV2LT5kcl9zdyA9PSBOVUJVU19EUlNXX1NPTklDX0xDKQorCQlyZXR1cm4gTUFDU09OSUNfREFZTkFMSU5LOworCWlmIChuZGV2LT5kcl9odyA9PSBOVUJVU19EUkhXX1NPTklDICYmCisJICAgIG5kZXYtPmRyX3N3ID09IE5VQlVTX0RSU1dfQVBQTEUpIHsKKwkJLyogVGhlcmUgaGFzIHRvIGJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzLi4uICovCisJCWlmIChzdHJzdHIobmRldi0+Ym9hcmQtPm5hbWUsICJEdW9Eb2NrIikpCisJCQlyZXR1cm4gTUFDU09OSUNfRFVPRE9DSzsKKwkJZWxzZQorCQkJcmV0dXJuIE1BQ1NPTklDX0FQUExFOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK2ludCBfX2luaXQgbWFjX251YnVzX3NvbmljX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJc3RhdGljIGludCBzbG90czsKKwlzdHJ1Y3QgbnVidXNfZGV2KiBuZGV2ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGJhc2VfYWRkciwgcHJvbV9hZGRyOworCXUxNiBzb25pY19kY3I7CisJaW50IGlkOworCWludCBpOworCWludCBkbWFfYml0bW9kZTsKKworCS8qIEZpbmQgdGhlIGZpcnN0IFNPTklDIHRoYXQgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQgYWxyZWFkeSAqLworCXdoaWxlICgobmRldiA9IG51YnVzX2ZpbmRfdHlwZShOVUJVU19DQVRfTkVUV09SSywKKwkJCQkgICAgICAgTlVCVVNfVFlQRV9FVEhFUk5FVCwgbmRldikpICE9IE5VTEwpCisJeworCQkvKiBIYXZlIHdlIHNlZW4gaXQgYWxyZWFkeT8gKi8KKwkJaWYgKHNsb3RzICYgKDE8PG5kZXYtPmJvYXJkLT5zbG90KSkKKwkJCWNvbnRpbnVlOworCQlzbG90cyB8PSAxPDxuZGV2LT5ib2FyZC0+c2xvdDsKKworCQkvKiBJcyBpdCBvbmUgb2Ygb3Vycz8gKi8KKwkJaWYgKChpZCA9IG1hY3NvbmljX2lkZW50KG5kZXYpKSAhPSAtMSkKKwkJCWJyZWFrOworCX0KKworCWlmIChuZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJc3dpdGNoIChpZCkgeworCWNhc2UgTUFDU09OSUNfRFVPRE9DSzoKKwkJYmFzZV9hZGRyID0gbmRldi0+Ym9hcmQtPnNsb3RfYWRkciArIERVT0RPQ0tfU09OSUNfUkVHSVNURVJTOworCQlwcm9tX2FkZHIgPSBuZGV2LT5ib2FyZC0+c2xvdF9hZGRyICsgRFVPRE9DS19TT05JQ19QUk9NX0JBU0U7CisJCXNvbmljX2RjciA9IFNPTklDX0RDUl9FWEJVUyB8IFNPTklDX0RDUl9SRlQwIHwgU09OSUNfRENSX1JGVDEKKwkJCXwgU09OSUNfRENSX1RGVDA7CisJCXJlZ19vZmZzZXQgPSAyOworCQlkbWFfYml0bW9kZSA9IDE7CisJCWJyZWFrOworCWNhc2UgTUFDU09OSUNfQVBQTEU6CisJCWJhc2VfYWRkciA9IG5kZXYtPmJvYXJkLT5zbG90X2FkZHIgKyBBUFBMRV9TT05JQ19SRUdJU1RFUlM7CisJCXByb21fYWRkciA9IG5kZXYtPmJvYXJkLT5zbG90X2FkZHIgKyBBUFBMRV9TT05JQ19QUk9NX0JBU0U7CisJCXNvbmljX2RjciA9IFNPTklDX0RDUl9CTVMgfCBTT05JQ19EQ1JfUkZUMSB8IFNPTklDX0RDUl9URlQwOworCQlyZWdfb2Zmc2V0ID0gMDsKKwkJZG1hX2JpdG1vZGUgPSAxOworCQlicmVhazsKKwljYXNlIE1BQ1NPTklDX0FQUExFMTY6CisJCWJhc2VfYWRkciA9IG5kZXYtPmJvYXJkLT5zbG90X2FkZHIgKyBBUFBMRV9TT05JQ19SRUdJU1RFUlM7CisJCXByb21fYWRkciA9IG5kZXYtPmJvYXJkLT5zbG90X2FkZHIgKyBBUFBMRV9TT05JQ19QUk9NX0JBU0U7CisJCXNvbmljX2RjciA9IFNPTklDX0RDUl9FWEJVUworIAkJCXwgU09OSUNfRENSX1JGVDEgfCBTT05JQ19EQ1JfVEZUMAorCQkJfCBTT05JQ19EQ1JfUE8xIHwgU09OSUNfRENSX0JNUzsgCisJCXJlZ19vZmZzZXQgPSAwOworCQlkbWFfYml0bW9kZSA9IDA7CisJCWJyZWFrOworCWNhc2UgTUFDU09OSUNfREFZTkFMSU5LOgorCQliYXNlX2FkZHIgPSBuZGV2LT5ib2FyZC0+c2xvdF9hZGRyICsgQVBQTEVfU09OSUNfUkVHSVNURVJTOworCQlwcm9tX2FkZHIgPSBuZGV2LT5ib2FyZC0+c2xvdF9hZGRyICsgREFZTkFMSU5LX1BST01fQkFTRTsKKwkJc29uaWNfZGNyID0gU09OSUNfRENSX1JGVDEgfCBTT05JQ19EQ1JfVEZUMAorCQkJfCBTT05JQ19EQ1JfUE8xIHwgU09OSUNfRENSX0JNUzsgCisJCXJlZ19vZmZzZXQgPSAwOworCQlkbWFfYml0bW9kZSA9IDA7CisJCWJyZWFrOworCWNhc2UgTUFDU09OSUNfREFZTkE6CisJCWJhc2VfYWRkciA9IG5kZXYtPmJvYXJkLT5zbG90X2FkZHIgKyBEQVlOQV9TT05JQ19SRUdJU1RFUlM7CisJCXByb21fYWRkciA9IG5kZXYtPmJvYXJkLT5zbG90X2FkZHIgKyBEQVlOQV9TT05JQ19NQUNfQUREUjsKKwkJc29uaWNfZGNyID0gU09OSUNfRENSX0JNUworCQkJfCBTT05JQ19EQ1JfUkZUMSB8IFNPTklDX0RDUl9URlQwIHwgU09OSUNfRENSX1BPMTsKKwkJcmVnX29mZnNldCA9IDA7CisJCWRtYV9iaXRtb2RlID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJtYWNzb25pYzogV1RGLCBpZCBpcyAlZFxuIiwgaWQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBEYW5nZXIhICBNeSBhcm1zIGFyZSBmbGFpbGluZyB3aWxkbHkhICBZb3UgKm11c3QqIHNldCB0aGlzCisgICAgICAgICAgIGJlZm9yZSB1c2luZyBzb25pY19yZWFkKCkgKi8KKwlkZXYtPmJhc2VfYWRkciA9IGJhc2VfYWRkcjsKKwlkZXYtPmlycSA9IFNMT1QySVJRKG5kZXYtPmJvYXJkLT5zbG90KTsKKworCWlmICghc29uaWNfdmVyc2lvbl9wcmludGVkKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisJCXNvbmljX3ZlcnNpb25fcHJpbnRlZCA9IDE7CisJfQorCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBpbiBzbG90ICVYXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIG5kZXYtPmJvYXJkLT5uYW1lLCBuZGV2LT5ib2FyZC0+c2xvdCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJldmlzaW9uIDB4JTA0eCwgdXNpbmcgJWQgYml0IERNQSBhbmQgcmVnaXN0ZXIgb2Zmc2V0ICVkXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHNvbmljX3JlYWQoZGV2LCBTT05JQ19TUiksIGRtYV9iaXRtb2RlPzMyOjE2LCByZWdfb2Zmc2V0KTsKKworCWlmKHJlZ19vZmZzZXQpIHsKKwkJcHJpbnRrKCIlczogcmVnaXN0ZXIgb2Zmc2V0IHVuc3VwcG9ydGVkLiAgcGxlYXNlIGZpeCB0aGlzIGlmIHlvdSBrbm93IHdoYXQgaXQgaXMuXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBTb2Z0d2FyZSByZXNldCwgdGhlbiBpbml0aWFsaXplIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworCXNvbmljX3dyaXRlKGRldiwgU09OSUNfQ01ELCBTT05JQ19DUl9SU1QpOworCXNvbmljX3dyaXRlKGRldiwgU09OSUNfRENSLCBzb25pY19kY3IKKwkJICAgIHwgKGRtYV9iaXRtb2RlID8gU09OSUNfRENSX0RXIDogMCkpOworCisJLyogQ2xlYXIgKmFuZCogZGlzYWJsZSBpbnRlcnJ1cHRzIHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUgKi8KKwlzb25pY193cml0ZShkZXYsIFNPTklDX0lTUiwweDdmZmYpOworCXNvbmljX3dyaXRlKGRldiwgU09OSUNfSU1SLDApOworCisJLyogTm93IGxvb2sgZm9yIHRoZSBNQUMgYWRkcmVzcy4gKi8KKwlpZiAobWFjX251YnVzX3NvbmljX2V0aGVybmV0X2FkZHIoZGV2LCBwcm9tX2FkZHIsIGlkKSAhPSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByaW50ayhLRVJOX0lORk8gIk1BQyAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCXByaW50aygiJTIuMngiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwkJaWYgKGkgPCA1KQorCQkJcHJpbnRrKCI6Iik7CisJfQorCXByaW50aygiIElSUSAlZFxuIiwgZGV2LT5pcnEpOworCisJLyogU2hhcmVkIGluaXQgY29kZSAqLworCXJldHVybiBtYWNzb25pY19pbml0KGRldik7Cit9CisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X21hY3NvbmljOworCitNT0RVTEVfUEFSTShzb25pY19kZWJ1ZywgImkiKTsKK01PRFVMRV9QQVJNX0RFU0Moc29uaWNfZGVidWcsICJtYWNzb25pYyBkZWJ1ZyBsZXZlbCAoMS00KSIpOworCitpbnQKK2luaXRfbW9kdWxlKHZvaWQpCit7CisgICAgICAgIGRldl9tYWNzb25pYyA9IG1hY3NvbmljX3Byb2JlKC0xKTsKKwlpZiAoSVNfRVJSKGRldl9tYWNzb25pYykpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJtYWNzb25pYy5jOiBObyBjYXJkIGZvdW5kXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZGV2X21hY3NvbmljKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2X21hY3NvbmljKTsKKwlrZnJlZShkZXZfbWFjc29uaWMtPnByaXYpOworCWZyZWVfbmV0ZGV2KGRldl9tYWNzb25pYyk7Cit9CisjZW5kaWYgLyogTU9EVUxFICovCisKKworI2RlZmluZSB2ZG1hX2FsbG9jKGZvbywgYmFyKSAoKHUzMilmb28pCisjZGVmaW5lIHZkbWFfZnJlZShiYXopCisjZGVmaW5lIHNvbmljX2NoaXB0b21lbShiYXQpIChiYXQpCisjZGVmaW5lIFBIWVNBRERSKHF1dXgpIChxdXV4KQorI2RlZmluZSBDUEhZU0FERFIocXV1eCkgKHF1dXgpCisKKyNkZWZpbmUgc29uaWNfcmVxdWVzdF9pcnEgICAgICAgcmVxdWVzdF9pcnEKKyNkZWZpbmUgc29uaWNfZnJlZV9pcnEgICAgICAgICAgZnJlZV9pcnEKKworI2luY2x1ZGUgInNvbmljLmMiCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOiAibTY4ay1saW51eC1nY2MgLURfX0tFUk5FTF9fIC1JLi4vLi4vaW5jbHVkZSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciAtcGlwZSAtZm5vLXN0cmVuZ3RoLXJlZHVjZSAtZmZpeGVkLWEyIC1ETU9EVUxFIC1ETU9EVkVSU0lPTlMgLWluY2x1ZGUgLi4vLi4vaW5jbHVkZS9saW51eC9tb2R2ZXJzaW9ucy5oICAgLWMgLW8gbWFjc29uaWMubyBtYWNzb25pYy5jIgorICogIHZlcnNpb24tY29udHJvbDogdAorICogIGtlcHQtbmV3LXZlcnNpb25zOiA1CisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqCisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21ldGguYyBiL2RyaXZlcnMvbmV0L21ldGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjM2NTVmNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L21ldGguYwpAQCAtMCwwICsxLDg0MyBAQAorLyoKKyAqIG1ldGguYyAtLSBPMiBCdWlsdGluIDEwLzEwMCBFdGhlcm5ldCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBJbHlhIFZvbHluZXRzCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+IC8qIHByaW50aygpICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4gIC8qIGVycm9yIGNvZGVzICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4gIC8qIHNpemVfdCAqLworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPiAvKiBtYXJrX2JoICovCisKKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPiAvKiBzdHJ1Y3QgZGV2aWNlLCBldCBhbCAqLworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPiAgIC8qIHN0cnVjdCBkZXZpY2UsIGFuZCBvdGhlciBoZWFkZXJzICovCisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4gLyogZXRoX3R5cGVfdHJhbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9pcC5oPiAgICAgICAgICAvKiBzdHJ1Y3QgaXBoZHIgKi8KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4gICAgICAgICAvKiBzdHJ1Y3QgdGNwaGRyICovCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+ICAgICAgICAgLyogTUlJIGRlZmluaXRpb25zICovCisKKyNpbmNsdWRlIDxhc20vaXAzMi9tYWNlLmg+CisjaW5jbHVkZSA8YXNtL2lwMzIvaXAzMl9pbnRzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSAibWV0aC5oIgorCisjaWZuZGVmIE1GRV9ERUJVRworI2RlZmluZSBNRkVfREVCVUcgMAorI2VuZGlmCisKKyNpZiBNRkVfREVCVUc+PTEKKyNkZWZpbmUgRFBSSU5USyhzdHIsYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgIm1ldGg6ICVzOiAiIHN0ciwgX19GVU5DVElPTl9fICwgIyMgYXJncykKKyNkZWZpbmUgTUZFX1JYX0RFQlVHIDIKKyNlbHNlCisjZGVmaW5lIERQUklOVEsoc3RyLGFyZ3MuLi4pCisjZGVmaW5lIE1GRV9SWF9ERUJVRyAwCisjZW5kaWYKKworCitzdGF0aWMgY29uc3QgY2hhciAqbWV0aF9zdHI9IlNHSSBPMiBGYXN0IEV0aGVybmV0IjsKK01PRFVMRV9BVVRIT1IoIklseWEgVm9seW5ldHMgPGlseWFAdGhlSWx5YS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNHSSBPMiBCdWlsdGluIEZhc3QgRXRoZXJuZXQgZHJpdmVyIik7CisKKyNkZWZpbmUgSEFWRV9UWF9USU1FT1VUCisvKiBUaGUgbWF4aW11bSB0aW1lIHdhaXRlZCAoaW4gamlmZmllcykgYmVmb3JlIGFzc3VtaW5nIGEgVHggZmFpbGVkLiAoNDAwbXMpICovCisjZGVmaW5lIFRYX1RJTUVPVVQgKDQwMCpIWi8xMDAwKQorCisjaWZkZWYgSEFWRV9UWF9USU1FT1VUCitzdGF0aWMgaW50IHRpbWVvdXQgPSBUWF9USU1FT1VUOworTU9EVUxFX1BBUk0odGltZW91dCwgImkiKTsKKyNlbmRpZgorCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgcHJpdmF0ZSB0byBlYWNoIGRldmljZS4gSXQgaXMgdXNlZCB0byBwYXNzCisgKiBwYWNrZXRzIGluIGFuZCBvdXQsIHNvIHRoZXJlIGlzIHBsYWNlIGZvciBhIHBhY2tldAorICovCitzdHJ1Y3QgbWV0aF9wcml2YXRlIHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwkvKiBpbi1tZW1vcnkgY29weSBvZiBNQUMgQ29udHJvbCByZWdpc3RlciAqLworCXVuc2lnbmVkIGxvbmcgbWFjX2N0cmw7CisJLyogaW4tbWVtb3J5IGNvcHkgb2YgRE1BIENvbnRyb2wgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBsb25nIGRtYV9jdHJsOworCS8qIGFkZHJlc3Mgb2YgUEhZLCB1c2VkIGJ5IG1kaW9fKiBmdW5jdGlvbnMsIGluaXRpYWxpemVkIGluIG1kaW9fcHJvYmUgKi8KKwl1bnNpZ25lZCBsb25nIHBoeV9hZGRyOworCXR4X3BhY2tldCAqdHhfcmluZzsKKwlkbWFfYWRkcl90IHR4X3JpbmdfZG1hOworCXN0cnVjdCBza19idWZmICp0eF9za2JzW1RYX1JJTkdfRU5UUklFU107CisJZG1hX2FkZHJfdCB0eF9za2JfZG1hc1tUWF9SSU5HX0VOVFJJRVNdOworCXVuc2lnbmVkIGxvbmcgdHhfcmVhZCwgdHhfd3JpdGUsIHR4X2NvdW50OworCisJcnhfcGFja2V0ICpyeF9yaW5nW1JYX1JJTkdfRU5UUklFU107CisJZG1hX2FkZHJfdCByeF9yaW5nX2RtYXNbUlhfUklOR19FTlRSSUVTXTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tic1tSWF9SSU5HX0VOVFJJRVNdOworCXVuc2lnbmVkIGxvbmcgcnhfd3JpdGU7CisKKwlzcGlubG9ja190IG1ldGhfbG9jazsKK307CisKK3N0YXRpYyB2b2lkIG1ldGhfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBtZXRoX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpwcmVncyk7CisgICAgICAgIAorLyogZ2xvYmFsLCBpbml0aWFsaXplZCBpbiBpcDMyLXNldHVwLmMgKi8KK2NoYXIgbzJtZXRoX2VhZGRyWzhdPXswLDAsMCwwLDAsMCwwLDB9OworCitzdGF0aWMgaW5saW5lIHZvaWQgbG9hZF9lYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCURQUklOVEsoIkxvYWRpbmcgTUFDIEFkZHJlc3M6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkoaW50KW8ybWV0aF9lYWRkclswXSYweEZGLChpbnQpbzJtZXRoX2VhZGRyWzFdJjB4RkYsKGludClvMm1ldGhfZWFkZHJbMl0mMHhGRiwKKwkJKGludClvMm1ldGhfZWFkZHJbM10mMHhGRiwoaW50KW8ybWV0aF9lYWRkcls0XSYweEZGLChpbnQpbzJtZXRoX2VhZGRyWzVdJjB4RkYpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSBvMm1ldGhfZWFkZHJbaV07CisJbWFjZS0+ZXRoLm1hY19hZGRyID0gKCoodW5zaWduZWQgbG9uZyopbzJtZXRoX2VhZGRyKSA+PiAxNjsKK30KKworLyoKKyAqIFdhaXRzIGZvciBCVVNZIHN0YXR1cyBvZiBtZGlvIGJ1cyB0byBjbGVhcgorICovCisjZGVmaW5lIFdBSVRfRk9SX1BIWShfX19ydmFsKQkJCQkJXAorCXdoaWxlICgoX19fcnZhbCA9IG1hY2UtPmV0aC5waHlfZGF0YSkgJiBNRElPX0JVU1kpIHsJXAorCQl1ZGVsYXkoMjUpOwkJCQkJXAorCX0KKy8qcmVhZCBwaHkgcmVnaXN0ZXIsIHJldHVybiB2YWx1ZSByZWFkICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtZGlvX3JlYWQoc3RydWN0IG1ldGhfcHJpdmF0ZSAqcHJpdiwgdW5zaWduZWQgbG9uZyBwaHlyZWcpCit7CisJdW5zaWduZWQgbG9uZyBydmFsOworCVdBSVRfRk9SX1BIWShydmFsKTsKKwltYWNlLT5ldGgucGh5X3JlZ3MgPSAocHJpdi0+cGh5X2FkZHIgPDwgNSkgfCAocGh5cmVnICYgMHgxZik7CisJdWRlbGF5KDI1KTsKKwltYWNlLT5ldGgucGh5X3RyYW5zX2dvID0gMTsKKwl1ZGVsYXkoMjUpOworCVdBSVRfRk9SX1BIWShydmFsKTsKKwlyZXR1cm4gcnZhbCAmIE1ESU9fREFUQV9NQVNLOworfQorCitzdGF0aWMgaW50IG1kaW9fcHJvYmUoc3RydWN0IG1ldGhfcHJpdmF0ZSAqcHJpdikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHAyLCBwMzsKKwkvKiBjaGVjayBpZiBwaHkgaXMgZGV0ZWN0ZWQgYWxyZWFkeSAqLworCWlmKHByaXYtPnBoeV9hZGRyPj0wJiZwcml2LT5waHlfYWRkcjwzMikKKwkJcmV0dXJuIDA7CisJc3Bpbl9sb2NrKCZwcml2LT5tZXRoX2xvY2spOworCWZvciAoaT0wO2k8MzI7KytpKXsKKwkJcHJpdi0+cGh5X2FkZHI9aTsKKwkJcDI9bWRpb19yZWFkKHByaXYsMik7CisJCXAzPW1kaW9fcmVhZChwcml2LDMpOworI2lmIE1GRV9ERUJVRz49MgorCQlzd2l0Y2ggKChwMjw8MTIpfChwMz4+NCkpeworCQljYXNlIFBIWV9RUzY2MTJYOgorCQkJRFBSSU5USygiUEhZIGlzIFFTNjYxMlhcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgUEhZX0lDUzE4ODk6CisJCQlEUFJJTlRLKCJQSFkgaXMgSUNTMTg4OVxuIik7CisJCQlicmVhazsKKwkJY2FzZSBQSFlfSUNTMTg5MDoKKwkJCURQUklOVEsoIlBIWSBpcyBJQ1MxODkwXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFBIWV9EUDgzODQwOgorCQkJRFBSSU5USygiUEhZIGlzIERQODM4NDBcbiIpOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCQlpZihwMiE9MHhmZmZmJiZwMiE9MHgwMDAwKXsKKwkJCURQUklOVEsoIlBIWSBjb2RlOiAleFxuIiwocDI8PDEyKXwocDM+PjQpKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZwcml2LT5tZXRoX2xvY2spOworCWlmKHByaXYtPnBoeV9hZGRyPDMyKSB7CisJCXJldHVybiAwOworCX0KKwlEUFJJTlRLKCJPb3BzaWUhIFBIWSBpcyBub3Qga25vd24hXG4iKTsKKwlwcml2LT5waHlfYWRkcj0tMTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgbWV0aF9jaGVja19saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1ldGhfcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgbWV0aF9wcml2YXRlICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIG1paV9hZHZlcnRpc2luZyA9IG1kaW9fcmVhZChwcml2LCA0KTsKKwl1bnNpZ25lZCBsb25nIG1paV9wYXJ0bmVyID0gbWRpb19yZWFkKHByaXYsIDUpOworCXVuc2lnbmVkIGxvbmcgbmVnb3RpYXRlZCA9IG1paV9hZHZlcnRpc2luZyAmIG1paV9wYXJ0bmVyOworCXVuc2lnbmVkIGxvbmcgZHVwbGV4LCBzcGVlZDsKKworCWlmIChtaWlfcGFydG5lciA9PSAweGZmZmYpCisJCXJldHVybjsKKworCXNwZWVkID0gKG5lZ290aWF0ZWQgJiAweDAzODApID8gTUVUSF8xMDBNQklUIDogMDsKKwlkdXBsZXggPSAoKG5lZ290aWF0ZWQgJiAweDAxMDApIHx8IChuZWdvdGlhdGVkICYgMHgwMUMwKSA9PSAweDAwNDApID8KKwkJIE1FVEhfUEhZX0ZEWCA6IDA7CisKKwlpZiAoKHByaXYtPm1hY19jdHJsICYgTUVUSF9QSFlfRkRYKSBeIGR1cGxleCkgeworCQlEUFJJTlRLKCJTZXR0aW5nICVzLWR1cGxleFxuIiwgZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiKTsKKwkJaWYgKGR1cGxleCkKKwkJCXByaXYtPm1hY19jdHJsIHw9IE1FVEhfUEhZX0ZEWDsKKwkJZWxzZQorCQkJcHJpdi0+bWFjX2N0cmwgJj0gfk1FVEhfUEhZX0ZEWDsKKwkJbWFjZS0+ZXRoLm1hY19jdHJsID0gcHJpdi0+bWFjX2N0cmw7CisJfQorCisJaWYgKChwcml2LT5tYWNfY3RybCAmIE1FVEhfMTAwTUJJVCkgXiBzcGVlZCkgeworCQlEUFJJTlRLKCJTZXR0aW5nICVkTWJzIG1vZGVcbiIsIHNwZWVkID8gMTAwIDogMTApOworCQlpZiAoZHVwbGV4KQorCQkJcHJpdi0+bWFjX2N0cmwgfD0gTUVUSF8xMDBNQklUOworCQllbHNlCisJCQlwcml2LT5tYWNfY3RybCAmPSB+TUVUSF8xMDBNQklUOworCQltYWNlLT5ldGgubWFjX2N0cmwgPSBwcml2LT5tYWNfY3RybDsKKwl9Cit9CisKKworc3RhdGljIGludCBtZXRoX2luaXRfdHhfcmluZyhzdHJ1Y3QgbWV0aF9wcml2YXRlICpwcml2KQoreworCS8qIEluaXQgVFggcmluZyAqLworCXByaXYtPnR4X3JpbmcgPSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgVFhfUklOR19CVUZGRVJfU0laRSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcml2LT50eF9yaW5nX2RtYSwgR0ZQX0FUT01JQyk7CisJaWYgKCFwcml2LT50eF9yaW5nKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQocHJpdi0+dHhfcmluZywgMCwgVFhfUklOR19CVUZGRVJfU0laRSk7CisJcHJpdi0+dHhfY291bnQgPSBwcml2LT50eF9yZWFkID0gcHJpdi0+dHhfd3JpdGUgPSAwOworCW1hY2UtPmV0aC50eF9yaW5nX2Jhc2UgPSBwcml2LT50eF9yaW5nX2RtYTsKKwkvKiBOb3cgaW5pdCBza2Igc2F2ZSBhcmVhICovCisJbWVtc2V0KHByaXYtPnR4X3NrYnMsIDAsIHNpemVvZihwcml2LT50eF9za2JzKSk7CisJbWVtc2V0KHByaXYtPnR4X3NrYl9kbWFzLCAwLCBzaXplb2YocHJpdi0+dHhfc2tiX2RtYXMpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZXRoX2luaXRfcnhfcmluZyhzdHJ1Y3QgbWV0aF9wcml2YXRlICpwcml2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfRU5UUklFUzsgaSsrKSB7CisJCXByaXYtPnJ4X3NrYnNbaV0gPSBhbGxvY19za2IoTUVUSF9SWF9CVUZGX1NJWkUsIDApOworCQkvKiA4Ynl0ZSBzdGF0dXMgdmVjdG9yICsgM3F1YWQgcGFkZGluZyArIDJieXRlIHBhZGRpbmcsCisJCSAqIHRvIHB1dCBkYXRhIG9uIDY0Yml0IGFsaWduZWQgYm91bmRhcnkgKi8KKwkJc2tiX3Jlc2VydmUocHJpdi0+cnhfc2tic1tpXSxNRVRIX1JYX0hFQUQpOworCQlwcml2LT5yeF9yaW5nW2ldPShyeF9wYWNrZXQqKShwcml2LT5yeF9za2JzW2ldLT5oZWFkKTsKKwkJLyogSSdsbCBuZWVkIHRvIHJlLXN5bmMgaXQgYWZ0ZXIgZWFjaCBSWCAqLworCQlwcml2LT5yeF9yaW5nX2RtYXNbaV0gPSAKKwkJCWRtYV9tYXBfc2luZ2xlKE5VTEwsIHByaXYtPnJ4X3JpbmdbaV0sCisJCQkJICAgICAgIE1FVEhfUlhfQlVGRl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCQltYWNlLT5ldGgucnhfZmlmbyA9IHByaXYtPnJ4X3JpbmdfZG1hc1tpXTsKKwl9CisgICAgICAgIHByaXYtPnJ4X3dyaXRlID0gMDsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyB2b2lkIG1ldGhfZnJlZV90eF9yaW5nKHN0cnVjdCBtZXRoX3ByaXZhdGUgKnByaXYpCit7CisJaW50IGk7CisKKwkvKiBSZW1vdmUgYW55IHBlbmRpbmcgc2tiICovCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfRU5UUklFUzsgaSsrKSB7CisJCWlmIChwcml2LT50eF9za2JzW2ldKQorCQkJZGV2X2tmcmVlX3NrYihwcml2LT50eF9za2JzW2ldKTsKKwkJcHJpdi0+dHhfc2tic1tpXSA9IE5VTEw7CisJfQorCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIFRYX1JJTkdfQlVGRkVSX1NJWkUsIHByaXYtPnR4X3JpbmcsCisJICAgICAgICAgICAgICAgICAgcHJpdi0+dHhfcmluZ19kbWEpOworfQorCisvKiBQcmVzdW1lcyBSWCBETUEgZW5naW5lIGlzIHN0b3BwZWQsIGFuZCBSWCBmaWZvIHJpbmcgaXMgcmVzZXQgKi8KK3N0YXRpYyB2b2lkIG1ldGhfZnJlZV9yeF9yaW5nKHN0cnVjdCBtZXRoX3ByaXZhdGUgKnByaXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19FTlRSSUVTOyBpKyspIHsKKwkJZG1hX3VubWFwX3NpbmdsZShOVUxMLCBwcml2LT5yeF9yaW5nX2RtYXNbaV0sCisJCQkJIE1FVEhfUlhfQlVGRl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCQlwcml2LT5yeF9yaW5nW2ldID0gMDsKKwkJcHJpdi0+cnhfcmluZ19kbWFzW2ldID0gMDsKKwkJa2ZyZWVfc2tiKHByaXYtPnJ4X3NrYnNbaV0pOworCX0KK30KKworaW50IG1ldGhfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWV0aF9wcml2YXRlICpwcml2ID0gKHN0cnVjdCBtZXRoX3ByaXZhdGUgKikgZGV2LT5wcml2OworCisJLyogUmVzZXQgY2FyZCAqLworCW1hY2UtPmV0aC5tYWNfY3RybCA9IFNHSV9NQUNfUkVTRVQ7CisJdWRlbGF5KDEpOworCW1hY2UtPmV0aC5tYWNfY3RybCA9IDA7CisJdWRlbGF5KDI1KTsKKworCS8qIExvYWQgZXRoZXJuZXQgYWRkcmVzcyAqLworCWxvYWRfZWFkZHIoZGV2KTsKKwkvKiBTaG91bGQgbG9hZCBzb21lICJlcnJhdGEiLCBidXQgbGF0ZXIgKi8KKwkKKwkvKiBDaGVjayBmb3IgZGV2aWNlICovCisJaWYgKG1kaW9fcHJvYmUocHJpdikgPCAwKSB7CisJCURQUklOVEsoIlVuYWJsZSB0byBmaW5kIFBIWVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEluaXRpYWwgbW9kZTogMTAgfCBIYWxmLWR1cGxleCB8IEFjY2VwdCBub3JtYWwgcGFja2V0cyAqLworCXByaXYtPm1hY19jdHJsID0gTUVUSF9BQ0NFUFRfTUNBU1QgfCBNRVRIX0RFRkFVTFRfSVBHOworCWlmIChkZXYtPmZsYWdzIHwgSUZGX1BST01JU0MpCisJCXByaXYtPm1hY19jdHJsIHw9IE1FVEhfUFJPTUlTQzsKKwltYWNlLT5ldGgubWFjX2N0cmwgPSBwcml2LT5tYWNfY3RybDsKKworCS8qIEF1dG9uZWdvdGlhdGUgc3BlZWQgYW5kIGR1cGxleCBtb2RlICovCisJbWV0aF9jaGVja19saW5rKGRldik7CisKKwkvKiBOb3cgc2V0IGRtYSBjb250cm9sLCBidXQgZG9uJ3QgZW5hYmxlIERNQSwgeWV0ICovCisJcHJpdi0+ZG1hX2N0cmwgPSAoNCA8PCBNRVRIX1JYX09GRlNFVF9TSElGVCkgfAorCQkJIChSWF9SSU5HX0VOVFJJRVMgPDwgTUVUSF9SWF9ERVBUSF9TSElGVCk7CisJbWFjZS0+ZXRoLmRtYV9jdHJsID0gcHJpdi0+ZG1hX2N0cmw7CisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT1FbmQgSGVscGVyIFJvdXRpbmVzPT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIE9wZW4gYW5kIGNsb3NlCisgKi8KK3N0YXRpYyBpbnQgbWV0aF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1ldGhfcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKKwlpbnQgcmV0OworCisJcHJpdi0+cGh5X2FkZHIgPSAtMTsgICAgLyogTm8gUEhZIGlzIGtub3duIHlldC4uLiAqLworCisJLyogSW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUgKi8KKwlyZXQgPSBtZXRoX3Jlc2V0KGRldik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBBbGxvY2F0ZSB0aGUgcmluZyBidWZmZXJzICovCisJcmV0ID0gbWV0aF9pbml0X3R4X3JpbmcocHJpdik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0ID0gbWV0aF9pbml0X3J4X3JpbmcocHJpdik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0X2ZyZWVfdHhfcmluZzsKKworCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBtZXRoX2ludGVycnVwdCwgMCwgbWV0aF9zdHIsIGRldik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBnZXQgaXJxICVkXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJZ290byBvdXRfZnJlZV9yeF9yaW5nOworCX0KKworCS8qIFN0YXJ0IERNQSAqLworCXByaXYtPmRtYV9jdHJsIHw9IE1FVEhfRE1BX1RYX0VOIHwgLypNRVRIX0RNQV9UWF9JTlRfRU4gfCovCisJCQkgIE1FVEhfRE1BX1JYX0VOIHwgTUVUSF9ETUFfUlhfSU5UX0VOOworCW1hY2UtPmV0aC5kbWFfY3RybCA9IHByaXYtPmRtYV9jdHJsOworCisJRFBSSU5USygiQWJvdXQgdG8gc3RhcnQgcXVldWVcbiIpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVfcnhfcmluZzoKKwltZXRoX2ZyZWVfcnhfcmluZyhwcml2KTsKK291dF9mcmVlX3R4X3Jpbmc6CisJbWV0aF9mcmVlX3R4X3JpbmcocHJpdik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1ldGhfcmVsZWFzZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZXRoX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisKKwlEUFJJTlRLKCJTdG9wcGluZyBxdWV1ZVxuIik7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOyAvKiBjYW4ndCB0cmFuc21pdCBhbnkgbW9yZSAqLworCS8qIHNodXQgZG93biBETUEgKi8KKwlwcml2LT5kbWFfY3RybCAmPSB+KE1FVEhfRE1BX1RYX0VOIHwgTUVUSF9ETUFfVFhfSU5UX0VOIHwKKwkJCSAgICBNRVRIX0RNQV9SWF9FTiB8IE1FVEhfRE1BX1JYX0lOVF9FTik7CisJbWFjZS0+ZXRoLmRtYV9jdHJsID0gcHJpdi0+ZG1hX2N0cmw7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJbWV0aF9mcmVlX3R4X3JpbmcocHJpdik7CisJbWV0aF9mcmVlX3J4X3JpbmcocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlY2VpdmUgYSBwYWNrZXQ6IHJldHJpZXZlLCBlbmNhcHN1bGF0ZSBhbmQgcGFzcyBvdmVyIHRvIHVwcGVyIGxldmVscworICovCitzdGF0aWMgdm9pZCBtZXRoX3J4KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHVuc2lnbmVkIGxvbmcgaW50X3N0YXR1cykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCXN0cnVjdCBtZXRoX3ByaXZhdGUgKnByaXYgPSAoc3RydWN0IG1ldGhfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmaWZvX3JwdHIgPSAoaW50X3N0YXR1cyAmIE1FVEhfSU5UX1JYX1JQVFJfTUFTSykgPj4gODsKKworCXNwaW5fbG9jaygmcHJpdi0+bWV0aF9sb2NrKTsKKwlwcml2LT5kbWFfY3RybCAmPSB+TUVUSF9ETUFfUlhfSU5UX0VOOworCW1hY2UtPmV0aC5kbWFfY3RybCA9IHByaXYtPmRtYV9jdHJsOworCXNwaW5fdW5sb2NrKCZwcml2LT5tZXRoX2xvY2spOworCisJaWYgKGludF9zdGF0dXMgJiBNRVRIX0lOVF9SWF9VTkRFUkZMT1cpIHsKKwkJZmlmb19ycHRyID0gKGZpZm9fcnB0ciAtIDEpICYgMHgwZjsKKwl9CisJd2hpbGUgKHByaXYtPnJ4X3dyaXRlICE9IGZpZm9fcnB0cikgeworCQlkbWFfdW5tYXBfc2luZ2xlKE5VTEwsIHByaXYtPnJ4X3JpbmdfZG1hc1twcml2LT5yeF93cml0ZV0sCisJCQkJIE1FVEhfUlhfQlVGRl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCQlzdGF0dXMgPSBwcml2LT5yeF9yaW5nW3ByaXYtPnJ4X3dyaXRlXS0+c3RhdHVzLnJhdzsKKyNpZiBNRkVfREVCVUcKKwkJaWYgKCEoc3RhdHVzICYgTUVUSF9SWF9TVF9WQUxJRCkpIHsKKwkJCURQUklOVEsoIk5vdCByZWNlaXZlZD8gc3RhdHVzPSUwMTZseFxuIixzdGF0dXMpOworCQl9CisjZW5kaWYKKwkJaWYgKCghKHN0YXR1cyAmIE1FVEhfUlhfU1RBVFVTX0VSUk9SUykpICYmIChzdGF0dXMgJiBNRVRIX1JYX1NUX1ZBTElEKSkgeworCQkJaW50IGxlbiA9IChzdGF0dXMgJiAweGZmZmYpIC0gNDsgLyogb21pdCBDUkMgKi8KKwkJCS8qIGxlbmd0aCBzYW5pdHkgY2hlY2sgKi8KKwkJCWlmIChsZW4gPCA2MCB8fCBsZW4gPiAxNTE4KSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBib2d1cyBwYWNrZXQgc2l6ZTogJWxkLCBzdGF0dXM9JSMybHguXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIHByaXYtPnJ4X3dyaXRlLAorCQkJCSAgICAgICBwcml2LT5yeF9yaW5nW3ByaXYtPnJ4X3dyaXRlXS0+c3RhdHVzLnJhdyk7CisJCQkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJcHJpdi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCXNrYiA9IHByaXYtPnJ4X3NrYnNbcHJpdi0+cnhfd3JpdGVdOworCQkJfSBlbHNlIHsKKwkJCQlza2IgPSBhbGxvY19za2IoTUVUSF9SWF9CVUZGX1NJWkUsIEdGUF9BVE9NSUMgfCBHRlBfRE1BKTsKKwkJCQlpZiAoIXNrYikgeworCQkJCQkvKiBPdWNoISBObyBtZW1vcnkhIERyb3AgcGFja2V0IG9uIHRoZSBmbG9vciAqLworCQkJCQlEUFJJTlRLKCJObyBtZW06IGRyb3BwaW5nIHBhY2tldFxuIik7CisJCQkJCXByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQkJc2tiID0gcHJpdi0+cnhfc2tic1twcml2LT5yeF93cml0ZV07CisJCQkJfSBlbHNlIHsKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYl9jID0gcHJpdi0+cnhfc2tic1twcml2LT5yeF93cml0ZV07CisJCQkJCS8qIDhieXRlIHN0YXR1cyB2ZWN0b3IgKyAzcXVhZCBwYWRkaW5nICsgMmJ5dGUgcGFkZGluZywKKwkJCQkJICogdG8gcHV0IGRhdGEgb24gNjRiaXQgYWxpZ25lZCBib3VuZGFyeSAqLworCQkJCQlza2JfcmVzZXJ2ZShza2IsIE1FVEhfUlhfSEVBRCk7CisJCQkJCS8qIFdyaXRlIG1ldGFkYXRhLCBhbmQgdGhlbiBwYXNzIHRvIHRoZSByZWNlaXZlIGxldmVsICovCisJCQkJCXNrYl9wdXQoc2tiX2MsIGxlbik7CisJCQkJCXByaXYtPnJ4X3NrYnNbcHJpdi0+cnhfd3JpdGVdID0gc2tiOworCQkJCQlza2JfYy0+ZGV2ID0gZGV2OworCQkJCQlza2JfYy0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2JfYywgZGV2KTsKKwkJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQkJcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCQlwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJCQkJCW5ldGlmX3J4KHNrYl9jKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCXNrYj1wcml2LT5yeF9za2JzW3ByaXYtPnJ4X3dyaXRlXTsKKyNpZiBNRkVfREVCVUc+MAorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWV0aDogUlggZXJyb3I6IHN0YXR1cz0weCUwMTZseFxuIixzdGF0dXMpOworCQkJaWYoc3RhdHVzJk1FVEhfUlhfU1RfUkNWX0NPREVfVklPTEFUSU9OKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJlY2VpdmUgQ29kZSBWaW9sYXRpb25cbiIpOworCQkJaWYoc3RhdHVzJk1FVEhfUlhfU1RfQ1JDX0VSUikKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDUkMgZXJyb3JcbiIpOworCQkJaWYoc3RhdHVzJk1FVEhfUlhfU1RfSU5WX1BSRUFNQkxFX0NUWCkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJJbnZhbGlkIFByZWFtYmxlIENvbnRleHRcbiIpOworCQkJaWYoc3RhdHVzJk1FVEhfUlhfU1RfTE9OR19FVlRfU0VFTikKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJMb25nIEV2ZW50IFNlZW4uLi5cbiIpOworCQkJaWYoc3RhdHVzJk1FVEhfUlhfU1RfQkFEX1BBQ0tFVCkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJCYWQgUGFja2V0XG4iKTsKKwkJCWlmKHN0YXR1cyZNRVRIX1JYX1NUX0NBUlJJRVJfRVZUX1NFRU4pCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FycmllciBFdmVudCBTZWVuXG4iKTsKKyNlbmRpZgorCQl9CisJCXByaXYtPnJ4X3JpbmdbcHJpdi0+cnhfd3JpdGVdID0gKHJ4X3BhY2tldCopc2tiLT5oZWFkOworCQlwcml2LT5yeF9yaW5nW3ByaXYtPnJ4X3dyaXRlXS0+c3RhdHVzLnJhdyA9IDA7CisJCXByaXYtPnJ4X3JpbmdfZG1hc1twcml2LT5yeF93cml0ZV0gPSAKKwkJCWRtYV9tYXBfc2luZ2xlKE5VTEwsIHByaXYtPnJ4X3JpbmdbcHJpdi0+cnhfd3JpdGVdLAorCQkJCSAgICAgICBNRVRIX1JYX0JVRkZfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJbWFjZS0+ZXRoLnJ4X2ZpZm8gPSBwcml2LT5yeF9yaW5nX2RtYXNbcHJpdi0+cnhfd3JpdGVdOworCQlBRFZBTkNFX1JYX1BUUihwcml2LT5yeF93cml0ZSk7CisJfQorCXNwaW5fbG9jaygmcHJpdi0+bWV0aF9sb2NrKTsKKwkvKiBJbiBjYXNlIHRoZXJlIHdhcyB1bmRlcmZsb3csIGFuZCBSeCBETUEgd2FzIGRpc2FibGVkICovCisJcHJpdi0+ZG1hX2N0cmwgfD0gTUVUSF9ETUFfUlhfSU5UX0VOIHwgTUVUSF9ETUFfUlhfRU47CisJbWFjZS0+ZXRoLmRtYV9jdHJsID0gcHJpdi0+ZG1hX2N0cmw7CisJbWFjZS0+ZXRoLmludF9zdGF0ID0gTUVUSF9JTlRfUlhfVEhSRVNIT0xEOworCXNwaW5fdW5sb2NrKCZwcml2LT5tZXRoX2xvY2spOworfQorCitzdGF0aWMgaW50IG1ldGhfdHhfZnVsbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZXRoX3ByaXZhdGUgKnByaXYgPSAoc3RydWN0IG1ldGhfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisKKwlyZXR1cm4gKHByaXYtPnR4X2NvdW50ID49IFRYX1JJTkdfRU5UUklFUyAtIDEpOworfQorCitzdGF0aWMgdm9pZCBtZXRoX3R4X2NsZWFudXAoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdW5zaWduZWQgbG9uZyBpbnRfc3RhdHVzKQoreworCXN0cnVjdCBtZXRoX3ByaXZhdGUgKnByaXYgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBsb25nIHJwdHIgPSAoaW50X3N0YXR1cyZUWF9JTkZPX1JQVFIpID4+IDE2OworCisJc3Bpbl9sb2NrKCZwcml2LT5tZXRoX2xvY2spOworCisJLyogU3RvcCBETUEgbm90aWZpY2F0aW9uICovCisJcHJpdi0+ZG1hX2N0cmwgJj0gfihNRVRIX0RNQV9UWF9JTlRfRU4pOworCW1hY2UtPmV0aC5kbWFfY3RybCA9IHByaXYtPmRtYV9jdHJsOworCisJd2hpbGUgKHByaXYtPnR4X3JlYWQgIT0gcnB0cikgeworCQlza2IgPSBwcml2LT50eF9za2JzW3ByaXYtPnR4X3JlYWRdOworCQlzdGF0dXMgPSBwcml2LT50eF9yaW5nW3ByaXYtPnR4X3JlYWRdLmhlYWRlci5yYXc7CisjaWYgTUZFX0RFQlVHPj0xCisJCWlmIChwcml2LT50eF9yZWFkID09IHByaXYtPnR4X3dyaXRlKQorCQkJRFBSSU5USygiQXVjaGkhIHR4X3JlYWQ9JWQsdHhfd3JpdGU9JWQscnB0cj0lZD9cbiIsIHByaXYtPnR4X3JlYWQsIHByaXYtPnR4X3dyaXRlLHJwdHIpOworI2VuZGlmCisJCWlmIChzdGF0dXMgJiBNRVRIX1RYX1NUX0RPTkUpIHsKKwkJCWlmIChzdGF0dXMgJiBNRVRIX1RYX1NUX1NVQ0NFU1MpeworCQkJCXByaXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCQlwcml2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCX0gZWxzZSB7CisJCQkJcHJpdi0+c3RhdHMudHhfZXJyb3JzKys7CisjaWYgTUZFX0RFQlVHPj0xCisJCQkJRFBSSU5USygiVFggZXJyb3I6IHN0YXR1cz0lMDE2bHggPCIsc3RhdHVzKTsKKwkJCQlpZihzdGF0dXMgJiBNRVRIX1RYX1NUX1NVQ0NFU1MpCisJCQkJCXByaW50aygiIFNVQ0NFU1MiKTsKKwkJCQlpZihzdGF0dXMgJiBNRVRIX1RYX1NUX1RPT0xPTkcpCisJCQkJCXByaW50aygiIFRPT0xPTkciKTsKKwkJCQlpZihzdGF0dXMgJiBNRVRIX1RYX1NUX1VOREVSUlVOKQorCQkJCQlwcmludGsoIiBVTkRFUlJVTiIpOworCQkJCWlmKHN0YXR1cyAmIE1FVEhfVFhfU1RfRVhDQ09MTCkKKwkJCQkJcHJpbnRrKCIgRVhDQ09MTCIpOworCQkJCWlmKHN0YXR1cyAmIE1FVEhfVFhfU1RfREVGRVIpCisJCQkJCXByaW50aygiIERFRkVSIik7CisJCQkJaWYoc3RhdHVzICYgTUVUSF9UWF9TVF9MQVRFQ09MTCkKKwkJCQkJcHJpbnRrKCIgTEFURUNPTEwiKTsKKwkJCQlwcmludGsoIiA+XG4iKTsKKyNlbmRpZgorCQkJfQorCQl9IGVsc2UgeworCQkJRFBSSU5USygiUlBUUiBwb2ludHMgdXMgaGVyZSwgYnV0IHBhY2tldCBub3QgZG9uZT9cbiIpOworCQkJYnJlYWs7CisJCX0KKwkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJcHJpdi0+dHhfc2tic1twcml2LT50eF9yZWFkXSA9IE5VTEw7CisJCXByaXYtPnR4X3JpbmdbcHJpdi0+dHhfcmVhZF0uaGVhZGVyLnJhdyA9IDA7CisJCXByaXYtPnR4X3JlYWQgPSAocHJpdi0+dHhfcmVhZCsxKSYoVFhfUklOR19FTlRSSUVTLTEpOworCQlwcml2LT50eF9jb3VudC0tOworCX0KKworCS8qIHdha2UgdXAgcXVldWUgaWYgaXQgd2FzIHN0b3BwZWQgKi8KKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmICFtZXRoX3R4X2Z1bGwoZGV2KSkgeworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCisJbWFjZS0+ZXRoLmludF9zdGF0ID0gTUVUSF9JTlRfVFhfRU1QVFkgfCBNRVRIX0lOVF9UWF9QS1Q7CisJc3Bpbl91bmxvY2soJnByaXYtPm1ldGhfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIG1ldGhfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdW5zaWduZWQgc3RhdHVzKQoreworCXN0cnVjdCBtZXRoX3ByaXZhdGUgKnByaXYgPSAoc3RydWN0IG1ldGhfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJtZXRoOiBlcnJvciBzdGF0dXM6IDB4JTA4eFxuIixzdGF0dXMpOworCS8qIGNoZWNrIGZvciBlcnJvcnMgdG9vLi4uICovCisJaWYgKHN0YXR1cyAmIChNRVRIX0lOVF9UWF9MSU5LX0ZBSUwpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJtZXRoOiBsaW5rIGZhaWx1cmVcbiIpOworCS8qIFNob3VsZCBJIGRvIGZ1bGwgcmVzZXQgaW4gdGhpcyBjYXNlPyAqLworCWlmIChzdGF0dXMgJiAoTUVUSF9JTlRfTUVNX0VSUk9SKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWV0aDogbWVtb3J5IGVycm9yXG4iKTsKKwlpZiAoc3RhdHVzICYgKE1FVEhfSU5UX1RYX0FCT1JUKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWV0aDogYWJvcnRlZFxuIik7CisJaWYgKHN0YXR1cyAmIChNRVRIX0lOVF9SWF9PVkVSRkxPVykpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1ldGg6IFJ4IG92ZXJmbG93XG4iKTsKKwlpZiAoc3RhdHVzICYgKE1FVEhfSU5UX1JYX1VOREVSRkxPVykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWV0aDogUnggdW5kZXJmbG93XG4iKTsKKwkJc3Bpbl9sb2NrKCZwcml2LT5tZXRoX2xvY2spOworCQltYWNlLT5ldGguaW50X3N0YXQgPSBNRVRIX0lOVF9SWF9VTkRFUkZMT1c7CisJCS8qIG1vcmUgdW5kZXJmbG93IGludGVycnVwdHMgd2lsbCBiZSBkZWxpdmVyZWQsIAorCQkgKiBlZmZlY3RpdmVseSB0aHJvd2luZyB1cyBpbnRvIGFuIGluZmluaXRlIGxvb3AuCisJCSAqICBUaHVzIEkgc3RvcCBwcm9jZXNzaW5nIFJ4IGluIHRoaXMgY2FzZS4gKi8KKwkJcHJpdi0+ZG1hX2N0cmwgJj0gfk1FVEhfRE1BX1JYX0VOOworCQltYWNlLT5ldGguZG1hX2N0cmwgPSBwcml2LT5kbWFfY3RybDsKKwkJRFBSSU5USygiRGlzYWJsZWQgbWV0aCBSeCBETUEgdGVtcG9yYXJpbHlcbiIpOworCQlzcGluX3VubG9jaygmcHJpdi0+bWV0aF9sb2NrKTsKKwl9CisJbWFjZS0+ZXRoLmludF9zdGF0ID0gTUVUSF9JTlRfRVJST1I7Cit9CisKKy8qCisgKiBUaGUgdHlwaWNhbCBpbnRlcnJ1cHQgZW50cnkgcG9pbnQKKyAqLworc3RhdGljIGlycXJldHVybl90IG1ldGhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnByZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisJc3RydWN0IG1ldGhfcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgbWV0aF9wcml2YXRlICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIHN0YXR1czsKKworCXN0YXR1cyA9IG1hY2UtPmV0aC5pbnRfc3RhdDsKKwl3aGlsZSAoc3RhdHVzICYgMHhmZikgeworCQkvKiBGaXJzdCBoYW5kbGUgZXJyb3JzIC0gaWYgd2UgZ2V0IFJ4IHVuZGVyZmxvdywKKwkJICogUnggRE1BIHdpbGwgYmUgZGlzYWJsZWQsIGFuZCBSeCBoYW5kbGVyIHdpbGwgcmVlbmFibGUKKwkJICogaXQuIEkgZG9uJ3QgdGhpbmsgaXQncyBwb3NzaWJsZSB0byBnZXQgUnggdW5kZXJmbG93LAorCQkgKiB3aXRob3V0IGdldHRpbmcgUnggaW50ZXJydXB0ICovCisJCWlmIChzdGF0dXMgJiBNRVRIX0lOVF9FUlJPUikgeworCQkJbWV0aF9lcnJvcihkZXYsIHN0YXR1cyk7CisJCX0KKwkJaWYgKHN0YXR1cyAmIChNRVRIX0lOVF9UWF9FTVBUWSB8IE1FVEhfSU5UX1RYX1BLVCkpIHsKKwkJCS8qIGEgdHJhbnNtaXNzaW9uIGlzIG92ZXI6IGZyZWUgdGhlIHNrYiAqLworCQkJbWV0aF90eF9jbGVhbnVwKGRldiwgc3RhdHVzKTsKKwkJfQorCQlpZiAoc3RhdHVzICYgTUVUSF9JTlRfUlhfVEhSRVNIT0xEKSB7CisJCQlpZiAoIShwcml2LT5kbWFfY3RybCAmIE1FVEhfRE1BX1JYX0lOVF9FTikpCisJCQkJYnJlYWs7CisJCQkvKiBzZW5kIGl0IHRvIG1ldGhfcnggZm9yIGhhbmRsaW5nICovCisJCQltZXRoX3J4KGRldiwgc3RhdHVzKTsKKwkJfQorCQlzdGF0dXMgPSBtYWNlLT5ldGguaW50X3N0YXQ7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogVHJhbnNtaXRzIHBhY2tldHMgdGhhdCBmaXQgaW50byBUWCBkZXNjcmlwdG9yIChhcmUgPD0xMjBCKQorICovCitzdGF0aWMgdm9pZCBtZXRoX3R4X3Nob3J0X3ByZXBhcmUoc3RydWN0IG1ldGhfcHJpdmF0ZSAqcHJpdiwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdHhfcGFja2V0ICpkZXNjID0gJnByaXYtPnR4X3JpbmdbcHJpdi0+dHhfd3JpdGVdOworCWludCBsZW4gPSAoc2tiLT5sZW4gPCBFVEhfWkxFTikgPyBFVEhfWkxFTiA6IHNrYi0+bGVuOworCisJZGVzYy0+aGVhZGVyLnJhdyA9IE1FVEhfVFhfQ01EX0lOVF9FTiB8IChsZW4tMSkgfCAoKDEyOC1sZW4pIDw8IDE2KTsKKwkvKiBtYXliZSBJIHNob3VsZCBzZXQgd2hvbGUgdGhpbmcgdG8gMCBmaXJzdC4uLiAqLworCW1lbWNweShkZXNjLT5kYXRhLmR0ICsgKDEyMCAtIGxlbiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCWlmIChza2ItPmxlbiA8IGxlbikKKwkJbWVtc2V0KGRlc2MtPmRhdGEuZHQgKyAxMjAgLSBsZW4gKyBza2ItPmxlbiwgMCwgbGVuLXNrYi0+bGVuKTsKK30KKyNkZWZpbmUgVFhfQ0FUQlVGMSBCSVQoMjUpCitzdGF0aWMgdm9pZCBtZXRoX3R4XzFwYWdlX3ByZXBhcmUoc3RydWN0IG1ldGhfcHJpdmF0ZSAqcHJpdiwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdHhfcGFja2V0ICpkZXNjID0gJnByaXYtPnR4X3JpbmdbcHJpdi0+dHhfd3JpdGVdOworCXZvaWQgKmJ1ZmZlcl9kYXRhID0gKHZvaWQgKikoKCh1bnNpZ25lZCBsb25nKXNrYi0+ZGF0YSArIDcpICYgfjcpOworCWludCB1bmFsaWduZWRfbGVuID0gKGludCkoKHVuc2lnbmVkIGxvbmcpYnVmZmVyX2RhdGEgLSAodW5zaWduZWQgbG9uZylza2ItPmRhdGEpOworCWludCBidWZmZXJfbGVuID0gc2tiLT5sZW4gLSB1bmFsaWduZWRfbGVuOworCWRtYV9hZGRyX3QgY2F0YnVmOworCisJZGVzYy0+aGVhZGVyLnJhdyA9IE1FVEhfVFhfQ01EX0lOVF9FTiB8IFRYX0NBVEJVRjEgfCAoc2tiLT5sZW4gLSAxKTsKKworCS8qIHVuYWxpZ25lZCBwYXJ0ICovCisJaWYgKHVuYWxpZ25lZF9sZW4pIHsKKwkJbWVtY3B5KGRlc2MtPmRhdGEuZHQgKyAoMTIwIC0gdW5hbGlnbmVkX2xlbiksCisJCSAgICAgICBza2ItPmRhdGEsIHVuYWxpZ25lZF9sZW4pOworCQlkZXNjLT5oZWFkZXIucmF3IHw9ICgxMjggLSB1bmFsaWduZWRfbGVuKSA8PCAxNjsKKwl9CisKKwkvKiBmaXJzdCBwYWdlICovCisJY2F0YnVmID0gZG1hX21hcF9zaW5nbGUoTlVMTCwgYnVmZmVyX2RhdGEsIGJ1ZmZlcl9sZW4sCisJCQkJRE1BX1RPX0RFVklDRSk7CisJZGVzYy0+ZGF0YS5jYXRfYnVmWzBdLmZvcm0uc3RhcnRfYWRkciA9IGNhdGJ1ZiA+PiAzOworCWRlc2MtPmRhdGEuY2F0X2J1ZlswXS5mb3JtLmxlbiA9IGJ1ZmZlcl9sZW4gLSAxOworfQorI2RlZmluZSBUWF9DQVRCVUYyIEJJVCgyNikKK3N0YXRpYyB2b2lkIG1ldGhfdHhfMnBhZ2VfcHJlcGFyZShzdHJ1Y3QgbWV0aF9wcml2YXRlICpwcml2LAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl0eF9wYWNrZXQgKmRlc2MgPSAmcHJpdi0+dHhfcmluZ1twcml2LT50eF93cml0ZV07CisJdm9pZCAqYnVmZmVyMV9kYXRhID0gKHZvaWQgKikoKCh1bnNpZ25lZCBsb25nKXNrYi0+ZGF0YSArIDcpICYgfjcpOworCXZvaWQgKmJ1ZmZlcjJfZGF0YSA9ICh2b2lkICopUEFHRV9BTElHTigodW5zaWduZWQgbG9uZylza2ItPmRhdGEpOworCWludCB1bmFsaWduZWRfbGVuID0gKGludCkoKHVuc2lnbmVkIGxvbmcpYnVmZmVyMV9kYXRhIC0gKHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhKTsKKwlpbnQgYnVmZmVyMV9sZW4gPSAoaW50KSgodW5zaWduZWQgbG9uZylidWZmZXIyX2RhdGEgLSAodW5zaWduZWQgbG9uZylidWZmZXIxX2RhdGEpOworCWludCBidWZmZXIyX2xlbiA9IHNrYi0+bGVuIC0gYnVmZmVyMV9sZW4gLSB1bmFsaWduZWRfbGVuOworCWRtYV9hZGRyX3QgY2F0YnVmMSwgY2F0YnVmMjsKKworCWRlc2MtPmhlYWRlci5yYXcgPSBNRVRIX1RYX0NNRF9JTlRfRU4gfCBUWF9DQVRCVUYxIHwgVFhfQ0FUQlVGMnwgKHNrYi0+bGVuIC0gMSk7CisJLyogdW5hbGlnbmVkIHBhcnQgKi8KKwlpZiAodW5hbGlnbmVkX2xlbil7CisJCW1lbWNweShkZXNjLT5kYXRhLmR0ICsgKDEyMCAtIHVuYWxpZ25lZF9sZW4pLAorCQkgICAgICAgc2tiLT5kYXRhLCB1bmFsaWduZWRfbGVuKTsKKwkJZGVzYy0+aGVhZGVyLnJhdyB8PSAoMTI4IC0gdW5hbGlnbmVkX2xlbikgPDwgMTY7CisJfQorCisJLyogZmlyc3QgcGFnZSAqLworCWNhdGJ1ZjEgPSBkbWFfbWFwX3NpbmdsZShOVUxMLCBidWZmZXIxX2RhdGEsIGJ1ZmZlcjFfbGVuLAorCQkJCSBETUFfVE9fREVWSUNFKTsKKwlkZXNjLT5kYXRhLmNhdF9idWZbMF0uZm9ybS5zdGFydF9hZGRyID0gY2F0YnVmMSA+PiAzOworCWRlc2MtPmRhdGEuY2F0X2J1ZlswXS5mb3JtLmxlbiA9IGJ1ZmZlcjFfbGVuIC0gMTsKKwkvKiBzZWNvbmQgcGFnZSAqLworCWNhdGJ1ZjIgPSBkbWFfbWFwX3NpbmdsZShOVUxMLCBidWZmZXIyX2RhdGEsIGJ1ZmZlcjJfbGVuLAorCQkJCSBETUFfVE9fREVWSUNFKTsKKwlkZXNjLT5kYXRhLmNhdF9idWZbMV0uZm9ybS5zdGFydF9hZGRyID0gY2F0YnVmMiA+PiAzOworCWRlc2MtPmRhdGEuY2F0X2J1ZlsxXS5mb3JtLmxlbiA9IGJ1ZmZlcjJfbGVuIC0gMTsKK30KKworc3RhdGljIHZvaWQgbWV0aF9hZGRfdG9fdHhfcmluZyhzdHJ1Y3QgbWV0aF9wcml2YXRlICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qIFJlbWVtYmVyIHRoZSBza2IsIHNvIHdlIGNhbiBmcmVlIGl0IGF0IGludGVycnVwdCB0aW1lICovCisJcHJpdi0+dHhfc2tic1twcml2LT50eF93cml0ZV0gPSBza2I7CisJaWYgKHNrYi0+bGVuIDw9IDEyMCkgeworCQkvKiBXaG9sZSBwYWNrZXQgZml0cyBpbnRvIGRlc2NyaXB0b3IgKi8KKwkJbWV0aF90eF9zaG9ydF9wcmVwYXJlKHByaXYsIHNrYik7CisJfSBlbHNlIGlmIChQQUdFX0FMSUdOKCh1bnNpZ25lZCBsb25nKXNrYi0+ZGF0YSkgIT0KKwkJICAgUEFHRV9BTElHTigodW5zaWduZWQgbG9uZylza2ItPmRhdGEgKyBza2ItPmxlbiAtIDEpKSB7CisJCS8qIFBhY2tldCBjcm9zc2VzIHBhZ2UgYm91bmRhcnkgKi8KKwkJbWV0aF90eF8ycGFnZV9wcmVwYXJlKHByaXYsIHNrYik7CisJfSBlbHNlIHsKKwkJLyogUGFja2V0IGlzIGluIG9uZSBwYWdlICovCisJCW1ldGhfdHhfMXBhZ2VfcHJlcGFyZShwcml2LCBza2IpOworCX0KKwlwcml2LT50eF93cml0ZSA9IChwcml2LT50eF93cml0ZSArIDEpICYgKFRYX1JJTkdfRU5UUklFUyAtIDEpOworCW1hY2UtPmV0aC50eF9pbmZvID0gcHJpdi0+dHhfd3JpdGU7CisJcHJpdi0+dHhfY291bnQrKzsKK30KKworLyoKKyAqIFRyYW5zbWl0IGEgcGFja2V0IChjYWxsZWQgYnkgdGhlIGtlcm5lbCkKKyAqLworc3RhdGljIGludCBtZXRoX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1ldGhfcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgbWV0aF9wcml2YXRlICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPm1ldGhfbG9jaywgZmxhZ3MpOworCS8qIFN0b3AgRE1BIG5vdGlmaWNhdGlvbiAqLworCXByaXYtPmRtYV9jdHJsICY9IH4oTUVUSF9ETUFfVFhfSU5UX0VOKTsKKwltYWNlLT5ldGguZG1hX2N0cmwgPSBwcml2LT5kbWFfY3RybDsKKworCW1ldGhfYWRkX3RvX3R4X3JpbmcocHJpdiwgc2tiKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsgLyogc2F2ZSB0aGUgdGltZXN0YW1wICovCisKKwkvKiBJZiBUWCByaW5nIGlzIGZ1bGwsIHRlbGwgdGhlIHVwcGVyIGxheWVyIHRvIHN0b3Agc2VuZGluZyBwYWNrZXRzICovCisJaWYgKG1ldGhfdHhfZnVsbChkZXYpKSB7CisJICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiVFggZnVsbDogc3RvcHBpbmdcbiIpOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJfQorCisJLyogUmVzdGFydCBETUEgbm90aWZpY2F0aW9uICovCisJcHJpdi0+ZG1hX2N0cmwgfD0gTUVUSF9ETUFfVFhfSU5UX0VOOworCW1hY2UtPmV0aC5kbWFfY3RybCA9IHByaXYtPmRtYV9jdHJsOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bWV0aF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlYWwgd2l0aCBhIHRyYW5zbWl0IHRpbWVvdXQuCisgKi8KK3N0YXRpYyB2b2lkIG1ldGhfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtZXRoX3ByaXZhdGUgKnByaXYgPSAoc3RydWN0IG1ldGhfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXRcbiIsIGRldi0+bmFtZSk7CisKKwkvKiBQcm90ZWN0IGFnYWluc3QgY29uY3VycmVudCByeCBpbnRlcnJ1cHRzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPm1ldGhfbG9jayxmbGFncyk7CisKKwkvKiBUcnkgdG8gcmVzZXQgdGhlIGludGVyZmFjZS4gKi8KKwltZXRoX3Jlc2V0KGRldik7CisKKwlwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKKworCS8qIENsZWFyIGFsbCByaW5ncyAqLworCW1ldGhfZnJlZV90eF9yaW5nKHByaXYpOworCW1ldGhfZnJlZV9yeF9yaW5nKHByaXYpOworCW1ldGhfaW5pdF90eF9yaW5nKHByaXYpOworCW1ldGhfaW5pdF9yeF9yaW5nKHByaXYpOworCisJLyogUmVzdGFydCBkbWEgKi8KKwlwcml2LT5kbWFfY3RybCB8PSBNRVRIX0RNQV9UWF9FTiB8IE1FVEhfRE1BX1JYX0VOIHwgTUVUSF9ETUFfUlhfSU5UX0VOOworCW1hY2UtPmV0aC5kbWFfY3RybCA9IHByaXYtPmRtYV9jdHJsOworCisJLyogRW5hYmxlIGludGVycnVwdCAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPm1ldGhfbG9jaywgZmxhZ3MpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJcmV0dXJuOworfQorCisvKgorICogSW9jdGwgY29tbWFuZHMgCisgKi8KK3N0YXRpYyBpbnQgbWV0aF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCS8qIFhYWCBOb3QgeWV0IGltcGxlbWVudGVkICovCisJc3dpdGNoKGNtZCkgeyAKKwljYXNlIFNJT0NHTUlJUEhZOgorCWNhc2UgU0lPQ0dNSUlSRUc6CisJY2FzZSBTSU9DU01JSVJFRzoKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCisvKgorICogUmV0dXJuIHN0YXRpc3RpY3MgdG8gdGhlIGNhbGxlcgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm1ldGhfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWV0aF9wcml2YXRlICpwcml2ID0gKHN0cnVjdCBtZXRoX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXJldHVybiAmcHJpdi0+c3RhdHM7Cit9CisKKy8qCisgKiBUaGUgaW5pdCBmdW5jdGlvbi4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICptZXRoX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBtZXRoX3ByaXZhdGUgKnByaXY7CisJaW50IHJldDsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbWV0aF9wcml2YXRlKSk7CisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZGV2LT5vcGVuICAgICAgICAgICAgPSBtZXRoX29wZW47CisJZGV2LT5zdG9wICAgICAgICAgICAgPSBtZXRoX3JlbGVhc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBtZXRoX3R4OworCWRldi0+ZG9faW9jdGwgICAgICAgID0gbWV0aF9pb2N0bDsKKwlkZXYtPmdldF9zdGF0cyAgICAgICA9IG1ldGhfc3RhdHM7CisjaWZkZWYgSEFWRV9UWF9USU1FT1VUCisJZGV2LT50eF90aW1lb3V0ICAgICAgPSBtZXRoX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyAgPSB0aW1lb3V0OworI2VuZGlmCisJZGV2LT5pcnEJICAgICA9IE1BQ0VfRVRIRVJORVRfSVJROworCWRldi0+YmFzZV9hZGRyCSAgICAgPSAodW5zaWduZWQgbG9uZykmbWFjZS0+ZXRoOworCisJcHJpdiA9IChzdHJ1Y3QgbWV0aF9wcml2YXRlICopIGRldi0+cHJpdjsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bWV0aF9sb2NrKTsKKworCXJldCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXQpIHsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogU0dJIE1BQ0UgRXRoZXJuZXQgcmV2LiAlZFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCAodW5zaWduZWQgaW50KShtYWNlLT5ldGgubWFjX2N0cmwgPj4gMjkpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICptZXRoX2RldjsKKworc3RhdGljIGludCBfX2luaXQgbWV0aF9pbml0X21vZHVsZSh2b2lkKQoreworCW1ldGhfZGV2ID0gbWV0aF9pbml0KCk7CisJaWYgKElTX0VSUihtZXRoX2RldikpCisJCXJldHVybiBQVFJfRVJSKG1ldGhfZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1ldGhfZXhpdF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihtZXRoX2Rldik7CisJZnJlZV9uZXRkZXYobWV0aF9kZXYpOworfQorCittb2R1bGVfaW5pdChtZXRoX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KG1ldGhfZXhpdF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWV0aC5oIGIvZHJpdmVycy9uZXQvbWV0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0OTYwZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9tZXRoLmgKQEAgLTAsMCArMSwyNDYgQEAKKworLyoKKyAqIHNudWxsLmggLS0gZGVmaW5pdGlvbnMgZm9yIHRoZSBuZXR3b3JrIG1vZHVsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBBbGVzc2FuZHJvIFJ1YmluaSBhbmQgSm9uYXRoYW4gQ29yYmV0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTydSZWlsbHkgJiBBc3NvY2lhdGVzCisgKgorICogVGhlIHNvdXJjZSBjb2RlIGluIHRoaXMgZmlsZSBjYW4gYmUgZnJlZWx5IHVzZWQsIGFkYXB0ZWQsCisgKiBhbmQgcmVkaXN0cmlidXRlZCBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0sIHNvIGxvbmcgYXMgYW4KKyAqIGFja25vd2xlZGdtZW50IGFwcGVhcnMgaW4gZGVyaXZlZCBzb3VyY2UgZmlsZXMuICBUaGUgY2l0YXRpb24KKyAqIHNob3VsZCBsaXN0IHRoYXQgdGhlIGNvZGUgY29tZXMgZnJvbSB0aGUgYm9vayAiTGludXggRGV2aWNlCisgKiBEcml2ZXJzIiBieSBBbGVzc2FuZHJvIFJ1YmluaSBhbmQgSm9uYXRoYW4gQ29yYmV0LCBwdWJsaXNoZWQKKyAqIGJ5IE8nUmVpbGx5ICYgQXNzb2NpYXRlcy4gICBObyB3YXJyYW50eSBpcyBhdHRhY2hlZDsKKyAqIHdlIGNhbm5vdCB0YWtlIHJlc3BvbnNpYmlsaXR5IGZvciBlcnJvcnMgb3IgZml0bmVzcyBmb3IgdXNlLgorICovCisKKy8qIHZlcnNpb24gZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiBjb25maW5lZCB0byBhIHNlcGFyYXRlIGZpbGUgKi8KKworLyogVHVuYWJsZSBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFRYX1JJTkdfRU5UUklFUyA2NAkvKiA2NC01MTI/Ki8KKworI2RlZmluZSBSWF9SSU5HX0VOVFJJRVMgMTYgLyogRG8gbm90IGNoYW5nZSAqLworLyogSW50ZXJuYWwgY29uc3RhbnRzICovCisjZGVmaW5lIFRYX1JJTkdfQlVGRkVSX1NJWkUJKFRYX1JJTkdfRU5UUklFUypzaXplb2YodHhfcGFja2V0KSkKKyNkZWZpbmUgUlhfQlVGRkVSX1NJWkUgMTU0NiAvKiBldGhlbmV0IHBhY2tldCBzaXplICovCisjZGVmaW5lIE1FVEhfUlhfQlVGRl9TSVpFIDQwOTYKKyNkZWZpbmUgTUVUSF9SWF9IRUFEIDM0IC8qIHN0YXR1cyArIDMgcXVhZCBnYXJiYWdlLWZpbGwgKyAyIGJ5dGUgemVyby1wYWQgKi8KKyNkZWZpbmUgUlhfQlVGRkVSX09GRlNFVCAoc2l6ZW9mKHJ4X3N0YXR1c192ZWN0b3IpKzIpIC8qIHN0YXVzIHZlY3RvciArIDIgYnl0ZXMgb2YgcGFkZGluZyAqLworI2RlZmluZSBSWF9CVUNLRVRfU0laRSAyNTYKKworI3VuZGVmIEJJVAorI2RlZmluZSBCSVQoeCkJKDFVTCA8PCAoeCkpCisKKy8qIEZvciBtb3JlIGRldGFpbGVkIGV4cGxhbmF0aW9ucyBvZiB3aGF0IGVhY2ggZmllbGQgbWVuYXMsCisgICBzZWUgTmljaydzIGdyZWF0IGNvbW1lbnRzIHRvICNkZWZpbmVzIGJlbG93IChvciBkb2NzLCBpZgorICAgeW91IGFyZSBsdWNreSBlbm91Z2ggdG9nZXQgaG9sZCBvZiB0aGVtIDopKi8KKworLyogdHggc3RhdHVzIHZlY3RvciBpcyB3cml0dGVuIG92ZXIgdHggY29tbWFuZCBoZWFkZXIgdXBvbgorICAgZG1hIGNvbXBsZXRpb24uICovCisKK3R5cGVkZWYgc3RydWN0IHR4X3N0YXR1c192ZWN0b3IgeworCXU2NAkJc2VudDoxOyAvKiBhbHdheXMgc2V0IHRvIDEuLi4qLworCXU2NAkJcGFkMDozNDsvKiBhbHdheXMgc2V0IHRvIDAgKi8KKwl1NjQJCWZsYWdzOjk7CQkJLypJJ20gdG9vIGxhenkgdG8gc3BlY2lmeSBlYWNoIG9uZSBzZXBhcmF0ZWx5IGF0IHRoZSBtb21lbnQqLworCXU2NAkJY29sX3JldHJ5X2NudDo0OwkvKmNvbGxpc2lvbiByZXRyeSBjb3VudCovCisJdTY0CQlsZW46MTY7CQkJCS8qVHJhbnNtaXQgbGVuZ3RoIGluIGJ5dGVzKi8KK30gdHhfc3RhdHVzX3ZlY3RvcjsKKworLyoKKyAqIEVhY2ggcGFja2V0IGlzIDEyOCBieXRlcyBsb25nLgorICogSXQgY29uc2lzdHMgb2YgaGVhZGVyLCAwLTMgY29uY2F0aW5hdGlvbgorICogYnVmZmVyIHBvaW50ZXJzIGFuZCB1cCB0byAxMjAgZGF0YSBieXRlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgdHhfcGFja2V0X2hkciB7CisJdTY0CQlwYWQxOjM2OyAvKnNob3VsZCBiZSBmaWxsZWQgd2l0aCAwICovCisJdTY0CQljYXRfcHRyM192YWxpZDoxLAkvKkNvbmNhdGluYXRpb24gcG9pbnRlciB2YWxpZCBmbGFncyovCisJCQljYXRfcHRyMl92YWxpZDoxLAorCQkJY2F0X3B0cjFfdmFsaWQ6MTsKKwl1NjQJCXR4X2ludF9mbGFnOjE7CQkvKkdlbmVyYXRlIFRYIGludHJydXB0IHdoZW4gcGFja2V0IGhhcyBiZWVuIHNlbnQqLworCXU2NAkJdGVybV9kbWFfZmxhZzoxOwkvKlRlcm1pbmF0ZSB0cmFuc21pdCBETUEgb24gdHJhbnNtaXQgYWJvcnQgY29uZGl0aW9ucyovCisJdTY0CQlkYXRhX29mZnNldDo3OwkJLypTdGFydGluZyBieXRlIG9mZnNldCBpbiByaW5nIGRhdGEgYmxvY2sqLworCXU2NAkJZGF0YV9sZW46MTY7CQkvKkxlbmd0aCBvZiB2YWxpZCBkYXRhIGluIGJ5dGVzLTEqLworfSB0eF9wYWNrZXRfaGRyOwordHlwZWRlZiB1bmlvbiB0eF9jYXRfcHRyIHsKKwlzdHJ1Y3QgeworCQl1NjQJCXBhZDI6MTY7IC8qIHNob3VsZCBiZSAwICovCisJCXU2NAkJbGVuOjE2OwkJCQkvKmxlbmd0aCBvZiBidWZmZXIgZGF0YSAtIDEqLworCQl1NjQJCXN0YXJ0X2FkZHI6Mjk7CQkvKlBoeXNpY2FsIHN0YXJ0aW5nIGFkZHJlc3MqLworCQl1NjQJCXBhZDE6MzsgLyogc2hvdWxkIGJlIHplcm8gKi8KKwl9IGZvcm07CisJdTY0IHJhdzsKK30gdHhfY2F0X3B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgdHhfcGFja2V0IHsKKwl1bmlvbiB7CisJCXR4X3BhY2tldF9oZHIgaGVhZGVyOworCQl0eF9zdGF0dXNfdmVjdG9yIHJlczsKKwkJdTY0IHJhdzsKKwl9aGVhZGVyOworCXVuaW9uIHsKKwkJdHhfY2F0X3B0ciBjYXRfYnVmWzNdOworCQljaGFyIGR0WzEyMF07CisJfSBkYXRhOworfSB0eF9wYWNrZXQ7CisKK3R5cGVkZWYgdW5pb24gcnhfc3RhdHVzX3ZlY3RvciB7CisJdm9sYXRpbGUgc3RydWN0IHsKKwkJdTY0CQlwYWQxOjE7LypmaWxsIGl0IHdpdGggb25lcyovCisJCXU2NAkJcGFkMjoxNTsvKmZpbGwgd2l0aCAwKi8KKwkJdTY0CQlpcF9jaGtfc3VtOjE2OworCQl1NjQJCXNlcV9udW06NTsKKwkJdTY0CQltYWNfYWRkcl9tYXRjaDoxOworCQl1NjQJCW1jYXN0X2FkZHJfbWF0Y2g6MTsKKwkJdTY0CQljYXJyaWVyX2V2ZW50X3NlZW46MTsKKwkJdTY0CQliYWRfcGFja2V0OjE7CisJCXU2NAkJbG9uZ19ldmVudF9zZWVuOjE7CisJCXU2NAkJaW52YWxpZF9wcmVhbWJsZToxOworCQl1NjQJCWJyb2FkY2FzdDoxOworCQl1NjQJCW11bHRpY2FzdDoxOworCQl1NjQJCWNyY19lcnJvcjoxOworCQl1NjQJCWh1aDoxOy8qPz8/Ki8KKwkJdTY0CQlyeF9jb2RlX3Zpb2xhdGlvbjoxOworCQl1NjQJCXJ4X2xlbjoxNjsKKwl9IHBhcnNlZDsKKwl2b2xhdGlsZSB1NjQgcmF3OworfSByeF9zdGF0dXNfdmVjdG9yOworCit0eXBlZGVmIHN0cnVjdCByeF9wYWNrZXQgeworCXJ4X3N0YXR1c192ZWN0b3Igc3RhdHVzOworICAgICAgICB1NjQgcGFkWzNdOyAvKiBGb3Igd2hhdGV2ZXIgcmVhc29uLCB0aGVyZSBuZWVkcyB0byBiZSA0IGRvdWJsZS13b3JkIG9mZnNldCAqLworICAgICAgICB1MTYgcGFkMjsKKwljaGFyIGJ1ZltNRVRIX1JYX0JVRkZfU0laRS1zaXplb2Yocnhfc3RhdHVzX3ZlY3RvciktMypzaXplb2YodTY0KS1zaXplb2YodTE2KV07LyogZGF0YSAqLworfSByeF9wYWNrZXQ7CisKKyNkZWZpbmUgVFhfSU5GT19SUFRSICAgIDB4MDBGRjAwMDAKKyNkZWZpbmUgVFhfSU5GT19XUFRSICAgIDB4MDAwMDAwRkYKKworCS8qIEJpdHMgaW4gTUVUSF9NQUMgKi8KKworI2RlZmluZSBTR0lfTUFDX1JFU0VUCQlCSVQoMCkJLyogMDogTUFDMTEwIGFjdGl2ZSBpbiBydW4gbW9kZSwgMTogR2xvYmFsIHJlc2V0IHNpZ25hbCB0byBNQUMxMTAgY29yZSBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgTUVUSF9QSFlfRkRYCQlCSVQoMSkgLyogMDogRGlzYWJsZSBmdWxsIGR1cGxleCwgMTogRW5hYmxlIGZ1bGwgZHVwbGV4ICovCisjZGVmaW5lIE1FVEhfUEhZX0xPT1AJQklUKDIpIC8qIDA6IE5vcm1hbCBvcGVyYXRpb24sIGZvbGxvd3MgMTAvMTAwbWJpdCBhbmQgTTEwVC9NSUkgc2VsZWN0LCAxOiBsb29wcyBpbnRlcm5hbCBNSUkgYnVzICovCisJCQkJICAgICAgIC8qICAgIHNlbGVjdHMgaWdub3JlZCAqLworI2RlZmluZSBNRVRIXzEwME1CSVQJCUJJVCgzKSAvKiAwOiAxMG1lZyBtb2RlLCAxOiAxMDBtZWcgbW9kZSAqLworI2RlZmluZSBNRVRIX1BIWV9NSUkJCUJJVCg0KSAvKiAwOiBNSUkgc2VsZWN0ZWQsIDE6IFNJQSBzZWxlY3RlZCAqLworCQkJCSAgICAgICAvKiAgIE5vdGU6IHdoZW4gbG9vcGJhY2sgaXMgc2V0IHRoaXMgYml0IGJlY29tZXMgY29sbGlzaW9uIGNvbnRyb2wuICBTZXR0aW5nIHRoaXMgYml0IHdpbGwgKi8KKwkJCQkgICAgICAgLyogICAgICAgICBjYXVzZSBhIGNvbGxpc2lvbiB0byBiZSByZXBvcnRlZC4gKi8KKworCQkJCSAgICAgICAvKiBCaXRzIDUgYW5kIDYgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB0aGUgRGVzdGluYXRpb24gYWRkcmVzcyBmaWx0ZXIgbW9kZSAqLworI2RlZmluZSBNRVRIX0FDQ0VQVF9NWSAwCQkJLyogMDA6IEFjY2VwdCBQSFkgYWRkcmVzcyBvbmx5ICovCisjZGVmaW5lIE1FVEhfQUNDRVBUX01DQVNUIDB4MjAJLyogMDE6IEFjY2VwdCBwaHlzaWNhbCwgYnJvYWRjYXN0LCBhbmQgbXVsdGljYXN0IGZpbHRlciBtYXRjaGVzIG9ubHkgKi8KKyNkZWZpbmUgTUVUSF9BQ0NFUFRfQU1DQVNUIDB4NDAJLyogMTA6IEFjY2VwdCBwaHlzaWNhbCwgYnJvYWRjYXN0LCBhbmQgYWxsIG11bHRpY2FzdCBwYWNrZXRzICovCisjZGVmaW5lIE1FVEhfUFJPTUlTQyAweDYwCQkvKiAxMTogUHJvbWlzY2lvdXMgbW9kZSAqLworCisjZGVmaW5lIE1FVEhfUEhZX0xJTktfRkFJTAlCSVQoNykgLyogMDogTGluayBmYWlsdXJlIGRldGVjdGlvbiBkaXNhYmxlZCwgMTogSGFyZHdhcmUgc2NhbnMgZm9yIGxpbmsgZmFpbHVyZSBpbiBQSFkgKi8KKworI2RlZmluZSBNRVRIX01BQ19JUEcJMHgxZmZmZjAwCisKKyNkZWZpbmUgTUVUSF9ERUZBVUxUX0lQRyAoKDE3PDwxNSkgfCAoMTE8PDIyKSB8ICgyMTw8OCkpCisJCQkJCQkvKiAweDE3MmU1YzAwICovIC8qIDIzLCAyMywgMjMgKi8gLyoweDU0QTk1MDAgKi8vKjIxLDIxLDIxKi8KKwkJCQkgICAgICAgLyogQml0cyA4IHRocm91Z2ggMTQgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIEludGVyLVBhY2tldCBHYXAgYmV0d2VlbiAiQmFjayB0byBCYWNrIiBwYWNrZXRzICovCisJCQkJICAgICAgIC8qIFRoZSBnYXAgZGVwZW5kcyBvbiB0aGUgY2xvY2sgc3BlZWQgb2YgdGhlIGxpbmssIDgwbnMgcGVyIGluY3JlbWVudCBmb3IgMTAwYmFzZVQsIDgwMG5zICAqLworCQkJCSAgICAgICAvKiBwZXIgaW5jcmVtZW50IGZvciAxMEJhc2VUICovCisKKwkJCQkgICAgICAgLyogQml0cyAxNSB0aHJvdWdoIDIxIGFyZSB1c2VkIHRvIGRldGVybWluZSBJUEdSMSAqLworCisJCQkJICAgICAgIC8qIEJpdHMgMjIgdGhyb3VnaCAyOCBhcmUgdXNlZCB0byBkZXRlcm1pbmUgSVBHUjIgKi8KKworI2RlZmluZSBNRVRIX1JFVl9TSElGVCAyOSAgICAgICAvKiBCaXRzIDI5IHRocm91Z2ggMzEgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSByZXZpc2lvbiAqLworCQkJCSAgICAgICAvKiAwMDA6IEluaXRhbCByZXZpc2lvbiAqLworCQkJCSAgICAgICAvKiAwMDE6IEZpcnN0IHJldmlzaW9uLCBJbXByb3ZlZCBUWCBjb25jYXRlbmF0aW9uICovCisKKworLyogRE1BIGNvbnRyb2wgYml0cyAqLworI2RlZmluZSBNRVRIX1JYX09GRlNFVF9TSElGVCAxMiAvKiBCaXRzIDEyOjE0IG9mIERNQSBjb250cm9sIHJlZ2lzdGVyIGluZGljYXRlIHN0YXJ0aW5nIG9mZnNldCBvZiBwYWNrZXQgZGF0YSBmb3IgUlggb3BlcmF0aW9uICovCisjZGVmaW5lIE1FVEhfUlhfREVQVEhfU0hJRlQgNCAvKiBCaXRzIDg6NCBkZWZpbmUgUlggZmlmbyBkZXB0aCAtLSB3aGVuICMgb2YgUlggZmlmbyBlbnRyaWVzICE9IGRlcHRoLCBpbnRlcnJ1cHQgaXMgZ2VuZXJ0ZWQgKi8KKworI2RlZmluZSBNRVRIX0RNQV9UWF9FTiBCSVQoMSkgLyogZW5hYmxlIFRYIERNQSAqLworI2RlZmluZSBNRVRIX0RNQV9UWF9JTlRfRU4gQklUKDApIC8qIGVuYWJsZSBUWCBCdWZmZXIgRW1wdHkgaW50ZXJydXB0ICovCisjZGVmaW5lIE1FVEhfRE1BX1JYX0VOIEJJVCgxNSkgLyogRW5hYmxlIFJYICovCisjZGVmaW5lIE1FVEhfRE1BX1JYX0lOVF9FTiBCSVQoOSkgLyogRW5hYmxlIGludGVycnVwdCBvbiBSWCBwYWNrZXQgKi8KKworLyogUlggRklGTyBNQ0wgSW5mbyBiaXRzICovCisjZGVmaW5lIE1FVEhfUlhfRklGT19XUFRSKHgpICAgKCgoeCk+PjE2KSYweGYpCisjZGVmaW5lIE1FVEhfUlhfRklGT19SUFRSKHgpICAgKCgoeCk+PjgpJjB4ZikKKyNkZWZpbmUgTUVUSF9SWF9GSUZPX0RFUFRIKHgpICAoKHgpJjB4MWYpCisKKy8qIFJYIHN0YXR1cyBiaXRzICovCisKKyNkZWZpbmUgTUVUSF9SWF9TVF9WQUxJRCBCSVQoNjMpCisjZGVmaW5lIE1FVEhfUlhfU1RfUkNWX0NPREVfVklPTEFUSU9OIEJJVCgxNikKKyNkZWZpbmUgTUVUSF9SWF9TVF9EUkJMX05CTCBCSVQoMTcpCisjZGVmaW5lIE1FVEhfUlhfU1RfQ1JDX0VSUiBCSVQoMTgpCisjZGVmaW5lIE1FVEhfUlhfU1RfTUNBU1RfUEtUIEJJVCgxOSkKKyNkZWZpbmUgTUVUSF9SWF9TVF9CQ0FTVF9QS1QgQklUKDIwKQorI2RlZmluZSBNRVRIX1JYX1NUX0lOVl9QUkVBTUJMRV9DVFggQklUKDIxKQorI2RlZmluZSBNRVRIX1JYX1NUX0xPTkdfRVZUX1NFRU4gQklUKDIyKQorI2RlZmluZSBNRVRIX1JYX1NUX0JBRF9QQUNLRVQgQklUKDIzKQorI2RlZmluZSBNRVRIX1JYX1NUX0NBUlJJRVJfRVZUX1NFRU4gQklUKDI0KQorI2RlZmluZSBNRVRIX1JYX1NUX01DQVNUX0ZJTFRFUl9NQVRDSCBCSVQoMjUpCisjZGVmaW5lIE1FVEhfUlhfU1RfUEhZU19BRERSX01BVENIIEJJVCgyNikKKworI2RlZmluZSBNRVRIX1JYX1NUQVRVU19FUlJPUlMgXAorCSggXAorCU1FVEhfUlhfU1RfUkNWX0NPREVfVklPTEFUSU9OfCBcCisJTUVUSF9SWF9TVF9DUkNfRVJSfCBcCisJTUVUSF9SWF9TVF9JTlZfUFJFQU1CTEVfQ1RYfCBcCisJTUVUSF9SWF9TVF9MT05HX0VWVF9TRUVOfCBcCisJTUVUSF9SWF9TVF9CQURfUEFDS0VUfCBcCisJTUVUSF9SWF9TVF9DQVJSSUVSX0VWVF9TRUVOIFwKKwkpCisJLyogQml0cyBpbiBNRVRIX0lOVCAqLworCS8qIFdyaXRlIF8xXyB0byBjb3JyZXNwb25kaW5nIGJpdCB0byBjbGVhciAqLworI2RlZmluZSBNRVRIX0lOVF9UWF9FTVBUWQlCSVQoMCkJLyogMDogTm8gaW50ZXJydXB0IHBlbmRpbmcsIDE6IFRoZSBUWCByaW5nIGJ1ZmZlciBpcyBlbXB0eSAqLworI2RlZmluZSBNRVRIX0lOVF9UWF9QS1QJCUJJVCgxKQkvKiAwOiBObyBpbnRlcnJ1cHQgcGVuZGluZyAqLworCQkJCQkgICAgICAJLyogMTogQSBUWCBtZXNzYWdlIGhhZCB0aGUgSU5UIHJlcXVlc3QgYml0IHNldCwgdGhlIHBhY2tldCBoYXMgYmVlbiBzZW50LiAqLworI2RlZmluZSBNRVRIX0lOVF9UWF9MSU5LX0ZBSUwJQklUKDIpCS8qIDA6IE5vIGludGVycnVwdCBwZW5kaW5nLCAxOiBQSFkgaGFzIHJlcG9ydGVkIGEgbGluayBmYWlsdXJlICovCisjZGVmaW5lIE1FVEhfSU5UX01FTV9FUlJPUglCSVQoMykJLyogMDogTm8gaW50ZXJydXB0IHBlbmRpbmcgKi8KKwkJCQkJCS8qIDE6IEEgbWVtb3J5IGVycm9yIG9jY3VycmVkIGR1cnJpbmcgRE1BLCBETUEgc3RvcHBlZCwgRmF0YWwgKi8KKyNkZWZpbmUgTUVUSF9JTlRfVFhfQUJPUlQJCUJJVCg0KQkvKiAwOiBObyBpbnRlcnJ1cHQgcGVuZGluZywgMTogVGhlIFRYIGFib3J0ZWQgb3BlcmF0aW9uLCBETUEgc3RvcHBlZCwgRkFUQUwgKi8KKyNkZWZpbmUgTUVUSF9JTlRfUlhfVEhSRVNIT0xECUJJVCg1KQkvKiAwOiBObyBpbnRlcnJ1cHQgcGVuZGluZywgMTogU2VsZWN0ZWQgcmVjZWl2ZSB0aHJlc2hvbGQgY29uZGl0aW9uIFZhbGlkICovCisjZGVmaW5lIE1FVEhfSU5UX1JYX1VOREVSRkxPVwlCSVQoNikJLyogMDogTm8gaW50ZXJydXB0IHBlbmRpbmcsIDE6IEZJRk8gd2FzIGVtcHR5LCBwYWNrZXQgY291bGQgbm90IGJlIHF1ZXVlZCAqLworI2RlZmluZSBNRVRIX0lOVF9SWF9PVkVSRkxPVwkJQklUKDcpCS8qIDA6IE5vIGludGVycnVwdCBwZW5kaW5nLCAxOiBETUEgRklGTyBPdmVyZmxvdywgRE1BIHN0b3BwZWQsIEZBVEFMICovCisKKy8qI2RlZmluZSBNRVRIX0lOVF9SWF9SUFRSX01BU0sgMHgwMDAxRjAwKi8JCS8qIEJpdHMgOCB0aHJvdWdoIDEyIGFsaWFzIG9mIFJYIHJlYWQtcG9pbnRlciAqLworI2RlZmluZSBNRVRIX0lOVF9SWF9SUFRSX01BU0sgMHgwMDAwRjAwCQkvKiBCaXRzIDggdGhyb3VnaCAxMSBhbGlhcyBvZiBSWCByZWFkLXBvaW50ZXIgLSBzbywgaXMgUnggRklGTyAxNiBvciAzMiBlbnRyeT8qLworCisJCQkJCQkvKiBCaXRzIDEzIHRocm91Z2ggMTUgYXJlIGFsd2F5cyAwLiAqLworCisjZGVmaW5lIE1FVEhfSU5UX1RYX1JQVFJfTUFTSwkweDFGRjAwMDAgICAgICAgIC8qIEJpdHMgMTYgdGhyb3VnaCAyNCBhbGlhcyBvZiBUWCByZWFkLXBvaW50ZXIgKi8KKworI2RlZmluZSBNRVRIX0lOVF9SWF9TRVFfTUFTSwkweDJFMDAwMDAwCS8qIEJpdHMgMjUgdGhyb3VnaCAyOSBhcmUgdGhlIHN0YXJ0aW5nIHNlcSBudW1iZXIgZm9yIHRoZSBtZXNzYWdlIGF0IHRoZSAqLworCisJCQkJCQkvKiB0b3Agb2YgdGhlIHF1ZXVlICovCisKKyNkZWZpbmUgTUVUSF9JTlRfRVJST1IJKE1FVEhfSU5UX1RYX0xJTktfRkFJTHwgXAorCQkJTUVUSF9JTlRfTUVNX0VSUk9SfCBcCisJCQlNRVRIX0lOVF9UWF9BQk9SVHwgXAorCQkJTUVUSF9JTlRfUlhfT1ZFUkZMT1d8IFwKKwkJCU1FVEhfSU5UX1JYX1VOREVSRkxPVykKKworI2RlZmluZSBNRVRIX0lOVF9NQ0FTVF9IQVNICQlCSVQoMzApIC8qIElmIFJYIERNQSBpcyBlbmFibGVkIHRoZSBoYXNoIHNlbGVjdCBsb2dpYyBvdXRwdXQgaXMgbGF0Y2hlZCBoZXJlICovCisKKy8qIFRYIHN0YXR1cyBiaXRzICovCisjZGVmaW5lIE1FVEhfVFhfU1RfRE9ORSAgICAgIEJJVCg2MykgLyogVFggY29tcGxldGUgKi8KKyNkZWZpbmUgTUVUSF9UWF9TVF9TVUNDRVNTICAgQklUKDIzKSAvKiBQYWNrZXQgd2FzIHRyYW5zbWl0dGVkIHN1Y2Nlc3NmdWxseSAqLworI2RlZmluZSBNRVRIX1RYX1NUX1RPT0xPTkcgICBCSVQoMjQpIC8qIFRYIGFib3J0IGR1ZSB0byBleGNlc3NpdmUgbGVuZ3RoICovCisjZGVmaW5lIE1FVEhfVFhfU1RfVU5ERVJSVU4gIEJJVCgyNSkgLyogVFggYWJvcnQgZHVlIHRvIHVuZGVycnVuICg/KSAqLworI2RlZmluZSBNRVRIX1RYX1NUX0VYQ0NPTEwgICBCSVQoMjYpIC8qIFRYIGFib3J0IGR1ZSB0byBleGNlc3MgY29sbGlzaW9ucyAqLworI2RlZmluZSBNRVRIX1RYX1NUX0RFRkVSICAgICBCSVQoMjcpIC8qIFRYIGFib3J0IGR1ZSB0byBleGNlc3MgZGVmZXJhbHMgKi8KKyNkZWZpbmUgTUVUSF9UWF9TVF9MQVRFQ09MTCAgQklUKDI4KSAvKiBUWCBhYm9ydCBkdWUgdG8gbGF0ZSBjb2xsaXNpb24gKi8KKworCisvKiBUeCBjb21tYW5kIGhlYWRlciBiaXRzICovCisjZGVmaW5lIE1FVEhfVFhfQ01EX0lOVF9FTiBCSVQoMjQpIC8qIEdlbmVyYXRlIFRYIGludGVycnVwdCB3aGVuIHBhY2tldCBpcyBzZW50ICovCisKKy8qIFBoeSBNRElPIGludGVyZmFjZSBidXN5IGZsYWcgKi8KKyNkZWZpbmUgTURJT19CVVNZICAgIEJJVCgxNikKKyNkZWZpbmUgTURJT19EQVRBX01BU0sgMHhGRkZGCisvKiBQSFkgZGVmaW5lcyAqLworI2RlZmluZSBQSFlfUVM2NjEyWCAgICAweDAxODE0NDEgICAgLyogUXVhbGl0eSBUWCAqLworI2RlZmluZSBQSFlfSUNTMTg4OSAgICAweDAwMTVGNDEgICAgLyogSUNTIEZYICovCisjZGVmaW5lIFBIWV9JQ1MxODkwICAgIDB4MDAxNUY0MiAgICAvKiBJQ1MgVFggKi8KKyNkZWZpbmUgUEhZX0RQODM4NDAgICAgMHgyMDAwNUMwICAgIC8qIE5hdGlvbmFsIFRYICovCisKKyNkZWZpbmUgQURWQU5DRV9SWF9QVFIoeCkgIHg9KHgrMSkmKFJYX1JJTkdfRU5UUklFUy0xKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWlpLmMgYi9kcml2ZXJzL25ldC9taWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzNjYjNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbWlpLmMKQEAgLTAsMCArMSwzOTggQEAKKy8qCisKKwltaWkuYzogTUlJIGludGVyZmFjZSBsaWJyYXJ5CisKKwlNYWludGFpbmVkIGJ5IEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKwlDb3B5cmlnaHQgMjAwMSwyMDAyIEplZmYgR2FyemlrCisKKwlWYXJpb3VzIGNvZGUgY2FtZSBmcm9tIG15c29uODAzLmMgYW5kIG90aGVyIGZpbGVzIGJ5CisJRG9uYWxkIEJlY2tlci4gIENvcHlyaWdodDoKKworCQlXcml0dGVuIDE5OTgtMjAwMiBieSBEb25hbGQgQmVja2VyLgorCisJCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZworCQl0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLAorCQlpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4gIERyaXZlcnMgYmFzZWQgb24KKwkJb3IgZGVyaXZlZCBmcm9tIHRoaXMgY29kZSBmYWxsIHVuZGVyIHRoZSBHUEwgYW5kIG11c3QKKwkJcmV0YWluIHRoZSBhdXRob3JzaGlwLCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlLgorCQlUaGlzIGZpbGUgaXMgbm90IGEgY29tcGxldGUgcHJvZ3JhbSBhbmQgbWF5IG9ubHkgYmUKKwkJdXNlZCB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nIHN5c3RlbSBpcyBsaWNlbnNlZAorCQl1bmRlciB0aGUgR1BMLgorCisJCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisJCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCQk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCQlBbm5hcG9saXMgTUQgMjE0MDMKKworCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKworaW50IG1paV9ldGh0b29sX2dzZXQoc3RydWN0IG1paV9pZl9pbmZvICptaWksIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbWlpLT5kZXY7CisJdTMyIGFkdmVydCwgYm1jciwgbHBhLCBuZWdvOworCXUzMiBhZHZlcnQyID0gMCwgYm1jcjIgPSAwLCBscGEyID0gMDsKKworCWVjbWQtPnN1cHBvcnRlZCA9CisJICAgIChTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CisJICAgICBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKKwkgICAgIFNVUFBPUlRFRF9BdXRvbmVnIHwgU1VQUE9SVEVEX1RQIHwgU1VQUE9SVEVEX01JSSk7CisJaWYgKG1paS0+c3VwcG9ydHNfZ21paSkKKwkJZWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZiB8CisJCQlTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGw7CisKKwkvKiBvbmx5IHN1cHBvcnRzIHR3aXN0ZWQtcGFpciAqLworCWVjbWQtPnBvcnQgPSBQT1JUX01JSTsKKworCS8qIG9ubHkgc3VwcG9ydHMgaW50ZXJuYWwgdHJhbnNjZWl2ZXIgKi8KKwllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisKKwkvKiB0aGlzIGlzbid0IGZ1bGx5IHN1cHBvcnRlZCBhdCBoaWdoZXIgbGF5ZXJzICovCisJZWNtZC0+cGh5X2FkZHJlc3MgPSBtaWktPnBoeV9pZDsKKworCWVjbWQtPmFkdmVydGlzaW5nID0gQURWRVJUSVNFRF9UUCB8IEFEVkVSVElTRURfTUlJOworCWFkdmVydCA9IG1paS0+bWRpb19yZWFkKGRldiwgbWlpLT5waHlfaWQsIE1JSV9BRFZFUlRJU0UpOworCWlmIChtaWktPnN1cHBvcnRzX2dtaWkpCisJCWFkdmVydDIgPSBtaWktPm1kaW9fcmVhZChkZXYsIG1paS0+cGh5X2lkLCBNSUlfQ1RSTDEwMDApOworCisJaWYgKGFkdmVydCAmIEFEVkVSVElTRV8xMEhBTEYpCisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmOworCWlmIChhZHZlcnQgJiBBRFZFUlRJU0VfMTBGVUxMKQorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbDsKKwlpZiAoYWR2ZXJ0ICYgQURWRVJUSVNFXzEwMEhBTEYpCisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZjsKKwlpZiAoYWR2ZXJ0ICYgQURWRVJUSVNFXzEwMEZVTEwpCisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbDsKKwlpZiAoYWR2ZXJ0MiAmIEFEVkVSVElTRV8xMDAwSEFMRikKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZjsKKwlpZiAoYWR2ZXJ0MiAmIEFEVkVSVElTRV8xMDAwRlVMTCkKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbDsKKworCWJtY3IgPSBtaWktPm1kaW9fcmVhZChkZXYsIG1paS0+cGh5X2lkLCBNSUlfQk1DUik7CisJbHBhID0gbWlpLT5tZGlvX3JlYWQoZGV2LCBtaWktPnBoeV9pZCwgTUlJX0xQQSk7CisJaWYgKG1paS0+c3VwcG9ydHNfZ21paSkgeworCQlibWNyMiA9IG1paS0+bWRpb19yZWFkKGRldiwgbWlpLT5waHlfaWQsIE1JSV9DVFJMMTAwMCk7CisJCWxwYTIgPSBtaWktPm1kaW9fcmVhZChkZXYsIG1paS0+cGh5X2lkLCBNSUlfU1RBVDEwMDApOworCX0KKwlpZiAoYm1jciAmIEJNQ1JfQU5FTkFCTEUpIHsKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9BdXRvbmVnOworCQllY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJCQorCQluZWdvID0gbWlpX253YXlfcmVzdWx0KGFkdmVydCAmIGxwYSk7CisJCWlmICgoYm1jcjIgJiAoQURWRVJUSVNFXzEwMDBIQUxGIHwgQURWRVJUSVNFXzEwMDBGVUxMKSkgJiAKKwkJICAgIChscGEyID4+IDIpKQorCQkJZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDAwOworCQllbHNlIGlmIChuZWdvID09IExQQV8xMDBGVUxMIHx8IG5lZ28gPT0gTFBBXzEwMEhBTEYpCisJCQllY21kLT5zcGVlZCA9IFNQRUVEXzEwMDsKKwkJZWxzZQorCQkJZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDsKKwkJaWYgKChscGEyICYgTFBBXzEwMDBGVUxMKSB8fCBuZWdvID09IExQQV8xMDBGVUxMIHx8CisJCSAgICBuZWdvID09IExQQV8xMEZVTEwpIHsKKwkJCWVjbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQkJbWlpLT5mdWxsX2R1cGxleCA9IDE7CisJCX0gZWxzZSB7CisJCQllY21kLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwkJCW1paS0+ZnVsbF9kdXBsZXggPSAwOworCQl9CisJfSBlbHNlIHsKKwkJZWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKworCQllY21kLT5zcGVlZCA9ICgoYm1jciAmIEJNQ1JfU1BFRUQxMDAwICYmIAorCQkJCShibWNyICYgQk1DUl9TUEVFRDEwMCkgPT0gMCkgPyBTUEVFRF8xMDAwIDoKKwkJCSAgICAgICAoYm1jciAmIEJNQ1JfU1BFRUQxMDApID8gU1BFRURfMTAwIDogU1BFRURfMTApOworCQllY21kLT5kdXBsZXggPSAoYm1jciAmIEJNQ1JfRlVMTERQTFgpID8gRFVQTEVYX0ZVTEwgOiBEVVBMRVhfSEFMRjsKKwl9CisKKwkvKiBpZ25vcmUgbWF4dHhwa3QsIG1heHJ4cGt0IGZvciBub3cgKi8KKworCXJldHVybiAwOworfQorCitpbnQgbWlpX2V0aHRvb2xfc3NldChzdHJ1Y3QgbWlpX2lmX2luZm8gKm1paSwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBtaWktPmRldjsKKworCWlmIChlY21kLT5zcGVlZCAhPSBTUEVFRF8xMCAmJiAKKwkgICAgZWNtZC0+c3BlZWQgIT0gU1BFRURfMTAwICYmIAorCSAgICBlY21kLT5zcGVlZCAhPSBTUEVFRF8xMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZWNtZC0+ZHVwbGV4ICE9IERVUExFWF9IQUxGICYmIGVjbWQtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGVjbWQtPnBvcnQgIT0gUE9SVF9NSUkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlY21kLT50cmFuc2NlaXZlciAhPSBYQ1ZSX0lOVEVSTkFMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZWNtZC0+cGh5X2FkZHJlc3MgIT0gbWlpLT5waHlfaWQpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlY21kLT5hdXRvbmVnICE9IEFVVE9ORUdfRElTQUJMRSAmJiBlY21kLT5hdXRvbmVnICE9IEFVVE9ORUdfRU5BQkxFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoKGVjbWQtPnNwZWVkID09IFNQRUVEXzEwMDApICYmICghbWlpLT5zdXBwb3J0c19nbWlpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJCQkJICAKKwkvKiBpZ25vcmUgc3VwcG9ydGVkLCBtYXh0eHBrdCwgbWF4cnhwa3QgKi8KKwkKKwlpZiAoZWNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQl1MzIgYm1jciwgYWR2ZXJ0LCB0bXA7CisJCXUzMiBhZHZlcnQyID0gMCwgdG1wMiA9IDA7CisKKwkJaWYgKChlY21kLT5hZHZlcnRpc2luZyAmIChBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8CisJCQkJCSAgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfAorCQkJCQkgIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8CisJCQkJCSAgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsIHwKKwkJCQkJICBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwKKwkJCQkJICBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKSkgPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qIGFkdmVydGlzZSBvbmx5IHdoYXQgaGFzIGJlZW4gcmVxdWVzdGVkICovCisJCWFkdmVydCA9IG1paS0+bWRpb19yZWFkKGRldiwgbWlpLT5waHlfaWQsIE1JSV9BRFZFUlRJU0UpOworCQl0bXAgPSBhZHZlcnQgJiB+KEFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfMTAwQkFTRTQpOworCQlpZiAobWlpLT5zdXBwb3J0c19nbWlpKSB7CisJCQlhZHZlcnQyID0gbWlpLT5tZGlvX3JlYWQoZGV2LCBtaWktPnBoeV9pZCwgTUlJX0NUUkwxMDAwKTsKKwkJCXRtcDIgPSBhZHZlcnQyICYgfihBRFZFUlRJU0VfMTAwMEhBTEYgfCBBRFZFUlRJU0VfMTAwMEZVTEwpOworCQl9CisJCWlmIChlY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmKQorCQkJdG1wIHw9IEFEVkVSVElTRV8xMEhBTEY7CisJCWlmIChlY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsKQorCQkJdG1wIHw9IEFEVkVSVElTRV8xMEZVTEw7CisJCWlmIChlY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZikKKwkJCXRtcCB8PSBBRFZFUlRJU0VfMTAwSEFMRjsKKwkJaWYgKGVjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsKQorCQkJdG1wIHw9IEFEVkVSVElTRV8xMDBGVUxMOworCQlpZiAobWlpLT5zdXBwb3J0c19nbWlpKSB7CisJCQlpZiAoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmKQorCQkJCXRtcDIgfD0gQURWRVJUSVNFXzEwMDBIQUxGOworCQkJaWYgKGVjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkKKwkJCQl0bXAyIHw9IEFEVkVSVElTRV8xMDAwRlVMTDsKKwkJfQorCQlpZiAoYWR2ZXJ0ICE9IHRtcCkgeworCQkJbWlpLT5tZGlvX3dyaXRlKGRldiwgbWlpLT5waHlfaWQsIE1JSV9BRFZFUlRJU0UsIHRtcCk7CisJCQltaWktPmFkdmVydGlzaW5nID0gdG1wOworCQl9CisJCWlmICgobWlpLT5zdXBwb3J0c19nbWlpKSAmJiAoYWR2ZXJ0MiAhPSB0bXAyKSkKKwkJCW1paS0+bWRpb193cml0ZShkZXYsIG1paS0+cGh5X2lkLCBNSUlfQ1RSTDEwMDAsIHRtcDIpOworCQkKKwkJLyogdHVybiBvbiBhdXRvbmVnb3RpYXRpb24sIGFuZCBmb3JjZSBhIHJlbmVnb3RpYXRlICovCisJCWJtY3IgPSBtaWktPm1kaW9fcmVhZChkZXYsIG1paS0+cGh5X2lkLCBNSUlfQk1DUik7CisJCWJtY3IgfD0gKEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVCk7CisJCW1paS0+bWRpb193cml0ZShkZXYsIG1paS0+cGh5X2lkLCBNSUlfQk1DUiwgYm1jcik7CisKKwkJbWlpLT5mb3JjZV9tZWRpYSA9IDA7CisJfSBlbHNlIHsKKwkJdTMyIGJtY3IsIHRtcDsKKworCQkvKiB0dXJuIG9mZiBhdXRvIG5lZ290aWF0aW9uLCBzZXQgc3BlZWQgYW5kIGR1cGxleGl0eSAqLworCQlibWNyID0gbWlpLT5tZGlvX3JlYWQoZGV2LCBtaWktPnBoeV9pZCwgTUlJX0JNQ1IpOworCQl0bXAgPSBibWNyICYgfihCTUNSX0FORU5BQkxFIHwgQk1DUl9TUEVFRDEwMCB8IAorCQkJICAgICAgIEJNQ1JfU1BFRUQxMDAwIHwgQk1DUl9GVUxMRFBMWCk7CisJCWlmIChlY21kLT5zcGVlZCA9PSBTUEVFRF8xMDAwKQorCQkJdG1wIHw9IEJNQ1JfU1BFRUQxMDAwOworCQllbHNlIGlmIChlY21kLT5zcGVlZCA9PSBTUEVFRF8xMDApCisJCQl0bXAgfD0gQk1DUl9TUEVFRDEwMDsKKwkJaWYgKGVjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkgeworCQkJdG1wIHw9IEJNQ1JfRlVMTERQTFg7CisJCQltaWktPmZ1bGxfZHVwbGV4ID0gMTsKKwkJfSBlbHNlCisJCQltaWktPmZ1bGxfZHVwbGV4ID0gMDsKKwkJaWYgKGJtY3IgIT0gdG1wKQorCQkJbWlpLT5tZGlvX3dyaXRlKGRldiwgbWlpLT5waHlfaWQsIE1JSV9CTUNSLCB0bXApOworCisJCW1paS0+Zm9yY2VfbWVkaWEgPSAxOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IG1paV9saW5rX29rIChzdHJ1Y3QgbWlpX2lmX2luZm8gKm1paSkKK3sKKwkvKiBmaXJzdCwgYSBkdW1teSByZWFkLCBuZWVkZWQgdG8gbGF0Y2ggc29tZSBNSUkgcGh5cyAqLworCW1paS0+bWRpb19yZWFkKG1paS0+ZGV2LCBtaWktPnBoeV9pZCwgTUlJX0JNU1IpOworCWlmIChtaWktPm1kaW9fcmVhZChtaWktPmRldiwgbWlpLT5waHlfaWQsIE1JSV9CTVNSKSAmIEJNU1JfTFNUQVRVUykKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBtaWlfbndheV9yZXN0YXJ0IChzdHJ1Y3QgbWlpX2lmX2luZm8gKm1paSkKK3sKKwlpbnQgYm1jcjsKKwlpbnQgciA9IC1FSU5WQUw7CisKKwkvKiBpZiBhdXRvbmVnIGlzIG9mZiwgaXQncyBhbiBlcnJvciAqLworCWJtY3IgPSBtaWktPm1kaW9fcmVhZChtaWktPmRldiwgbWlpLT5waHlfaWQsIE1JSV9CTUNSKTsKKworCWlmIChibWNyICYgQk1DUl9BTkVOQUJMRSkgeworCQlibWNyIHw9IEJNQ1JfQU5SRVNUQVJUOworCQltaWktPm1kaW9fd3JpdGUobWlpLT5kZXYsIG1paS0+cGh5X2lkLCBNSUlfQk1DUiwgYm1jcik7CisJCXIgPSAwOworCX0KKworCXJldHVybiByOworfQorCit2b2lkIG1paV9jaGVja19saW5rIChzdHJ1Y3QgbWlpX2lmX2luZm8gKm1paSkKK3sKKwlpbnQgY3VyX2xpbmsgPSBtaWlfbGlua19vayhtaWkpOworCWludCBwcmV2X2xpbmsgPSBuZXRpZl9jYXJyaWVyX29rKG1paS0+ZGV2KTsKKworCWlmIChjdXJfbGluayAmJiAhcHJldl9saW5rKQorCQluZXRpZl9jYXJyaWVyX29uKG1paS0+ZGV2KTsKKwllbHNlIGlmIChwcmV2X2xpbmsgJiYgIWN1cl9saW5rKQorCQluZXRpZl9jYXJyaWVyX29mZihtaWktPmRldik7Cit9CisKK3Vuc2lnbmVkIGludCBtaWlfY2hlY2tfbWVkaWEgKHN0cnVjdCBtaWlfaWZfaW5mbyAqbWlpLAorCQkJICAgICAgdW5zaWduZWQgaW50IG9rX3RvX3ByaW50LAorCQkJICAgICAgdW5zaWduZWQgaW50IGluaXRfbWVkaWEpCit7CisJdW5zaWduZWQgaW50IG9sZF9jYXJyaWVyLCBuZXdfY2FycmllcjsKKwlpbnQgYWR2ZXJ0aXNlLCBscGEsIG1lZGlhLCBkdXBsZXg7CisJaW50IGxwYTIgPSAwOworCisJLyogaWYgZm9yY2VkIG1lZGlhLCBnbyBubyBmdXJ0aGVyICovCisJaWYgKG1paS0+Zm9yY2VfbWVkaWEpCisJCXJldHVybiAwOyAvKiBkdXBsZXggZGlkIG5vdCBjaGFuZ2UgKi8KKworCS8qIGNoZWNrIGN1cnJlbnQgYW5kIG9sZCBsaW5rIHN0YXR1cyAqLworCW9sZF9jYXJyaWVyID0gbmV0aWZfY2Fycmllcl9vayhtaWktPmRldikgPyAxIDogMDsKKwluZXdfY2FycmllciA9ICh1bnNpZ25lZCBpbnQpIG1paV9saW5rX29rKG1paSk7CisKKwkvKiBpZiBjYXJyaWVyIHN0YXRlIGRpZCBub3QgY2hhbmdlLCB0aGlzIGlzIGEgImJvdW5jZSIsCisJICoganVzdCBleGl0IGFzIGV2ZXJ5dGhpbmcgaXMgYWxyZWFkeSBzZXQgY29ycmVjdGx5CisJICovCisJaWYgKCghaW5pdF9tZWRpYSkgJiYgKG9sZF9jYXJyaWVyID09IG5ld19jYXJyaWVyKSkKKwkJcmV0dXJuIDA7IC8qIGR1cGxleCBkaWQgbm90IGNoYW5nZSAqLworCisJLyogbm8gY2Fycmllciwgbm90aGluZyBtdWNoIHRvIGRvICovCisJaWYgKCFuZXdfY2FycmllcikgeworCQluZXRpZl9jYXJyaWVyX29mZihtaWktPmRldik7CisJCWlmIChva190b19wcmludCkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIGRvd25cbiIsIG1paS0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDA7IC8qIGR1cGxleCBkaWQgbm90IGNoYW5nZSAqLworCX0KKworCS8qCisJICogd2UgaGF2ZSBjYXJyaWVyLCBzZWUgd2hvJ3Mgb24gdGhlIG90aGVyIGVuZAorCSAqLworCW5ldGlmX2NhcnJpZXJfb24obWlpLT5kZXYpOworCisJLyogZ2V0IE1JSSBhZHZlcnRpc2UgYW5kIExQQSB2YWx1ZXMgKi8KKwlpZiAoKCFpbml0X21lZGlhKSAmJiAobWlpLT5hZHZlcnRpc2luZykpCisJCWFkdmVydGlzZSA9IG1paS0+YWR2ZXJ0aXNpbmc7CisJZWxzZSB7CisJCWFkdmVydGlzZSA9IG1paS0+bWRpb19yZWFkKG1paS0+ZGV2LCBtaWktPnBoeV9pZCwgTUlJX0FEVkVSVElTRSk7CisJCW1paS0+YWR2ZXJ0aXNpbmcgPSBhZHZlcnRpc2U7CisJfQorCWxwYSA9IG1paS0+bWRpb19yZWFkKG1paS0+ZGV2LCBtaWktPnBoeV9pZCwgTUlJX0xQQSk7CisJaWYgKG1paS0+c3VwcG9ydHNfZ21paSkKKwkJbHBhMiA9IG1paS0+bWRpb19yZWFkKG1paS0+ZGV2LCBtaWktPnBoeV9pZCwgTUlJX1NUQVQxMDAwKTsKKworCS8qIGZpZ3VyZSBvdXQgbWVkaWEgYW5kIGR1cGxleCBmcm9tIGFkdmVydGlzZSBhbmQgTFBBIHZhbHVlcyAqLworCW1lZGlhID0gbWlpX253YXlfcmVzdWx0KGxwYSAmIGFkdmVydGlzZSk7CisJZHVwbGV4ID0gKG1lZGlhICYgQURWRVJUSVNFX0ZVTEwpID8gMSA6IDA7CisJaWYgKGxwYTIgJiBMUEFfMTAwMEZVTEwpCisJCWR1cGxleCA9IDE7CisKKwlpZiAob2tfdG9fcHJpbnQpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIHVwLCAlc01icHMsICVzLWR1cGxleCwgbHBhIDB4JTA0WFxuIiwKKwkJICAgICAgIG1paS0+ZGV2LT5uYW1lLAorCQkgICAgICAgbHBhMiAmIChMUEFfMTAwMEZVTEwgfCBMUEFfMTAwMEhBTEYpID8gIjEwMDAiIDoKKwkJICAgICAgIG1lZGlhICYgKEFEVkVSVElTRV8xMDBGVUxMIHwgQURWRVJUSVNFXzEwMEhBTEYpID8gIjEwMCIgOiAiMTAiLAorCQkgICAgICAgZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiLAorCQkgICAgICAgbHBhKTsKKworCWlmICgoaW5pdF9tZWRpYSkgfHwgKG1paS0+ZnVsbF9kdXBsZXggIT0gZHVwbGV4KSkgeworCQltaWktPmZ1bGxfZHVwbGV4ID0gZHVwbGV4OworCQlyZXR1cm4gMTsgLyogZHVwbGV4IGNoYW5nZWQgKi8KKwl9CisKKwlyZXR1cm4gMDsgLyogZHVwbGV4IGRpZCBub3QgY2hhbmdlICovCit9CisKK2ludCBnZW5lcmljX21paV9pb2N0bChzdHJ1Y3QgbWlpX2lmX2luZm8gKm1paV9pZiwKKwkJICAgICAgc3RydWN0IG1paV9pb2N0bF9kYXRhICptaWlfZGF0YSwgaW50IGNtZCwKKwkJICAgICAgdW5zaWduZWQgaW50ICpkdXBsZXhfY2hnX291dCkKK3sKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGludCBkdXBsZXhfY2hhbmdlZCA9IDA7CisKKwlpZiAoZHVwbGV4X2NoZ19vdXQpCisJCSpkdXBsZXhfY2hnX291dCA9IDA7CisKKwltaWlfZGF0YS0+cGh5X2lkICY9IG1paV9pZi0+cGh5X2lkX21hc2s7CisJbWlpX2RhdGEtPnJlZ19udW0gJj0gbWlpX2lmLT5yZWdfbnVtX21hc2s7CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBTSU9DR01JSVBIWToKKwkJbWlpX2RhdGEtPnBoeV9pZCA9IG1paV9pZi0+cGh5X2lkOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCWNhc2UgU0lPQ0dNSUlSRUc6CisJCW1paV9kYXRhLT52YWxfb3V0ID0KKwkJCW1paV9pZi0+bWRpb19yZWFkKG1paV9pZi0+ZGV2LCBtaWlfZGF0YS0+cGh5X2lkLAorCQkJCQkgIG1paV9kYXRhLT5yZWdfbnVtKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTTUlJUkVHOiB7CisJCXUxNiB2YWwgPSBtaWlfZGF0YS0+dmFsX2luOworCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKG1paV9kYXRhLT5waHlfaWQgPT0gbWlpX2lmLT5waHlfaWQpIHsKKwkJCXN3aXRjaChtaWlfZGF0YS0+cmVnX251bSkgeworCQkJY2FzZSBNSUlfQk1DUjogeworCQkJCXVuc2lnbmVkIGludCBuZXdfZHVwbGV4ID0gMDsKKwkJCQlpZiAodmFsICYgKEJNQ1JfUkVTRVR8Qk1DUl9BTkVOQUJMRSkpCisJCQkJCW1paV9pZi0+Zm9yY2VfbWVkaWEgPSAwOworCQkJCWVsc2UKKwkJCQkJbWlpX2lmLT5mb3JjZV9tZWRpYSA9IDE7CisJCQkJaWYgKG1paV9pZi0+Zm9yY2VfbWVkaWEgJiYKKwkJCQkgICAgKHZhbCAmIEJNQ1JfRlVMTERQTFgpKQorCQkJCQluZXdfZHVwbGV4ID0gMTsKKwkJCQlpZiAobWlpX2lmLT5mdWxsX2R1cGxleCAhPSBuZXdfZHVwbGV4KSB7CisJCQkJCWR1cGxleF9jaGFuZ2VkID0gMTsKKwkJCQkJbWlpX2lmLT5mdWxsX2R1cGxleCA9IG5ld19kdXBsZXg7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBNSUlfQURWRVJUSVNFOgorCQkJCW1paV9pZi0+YWR2ZXJ0aXNpbmcgPSB2YWw7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCS8qIGRvIG5vdGhpbmcgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCW1paV9pZi0+bWRpb193cml0ZShtaWlfaWYtPmRldiwgbWlpX2RhdGEtPnBoeV9pZCwKKwkJCQkgICBtaWlfZGF0YS0+cmVnX251bSwgdmFsKTsKKwkJYnJlYWs7CisJfQorCisJZGVmYXVsdDoKKwkJcmMgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisJfQorCisJaWYgKChyYyA9PSAwKSAmJiAoZHVwbGV4X2NoZ19vdXQpICYmIChkdXBsZXhfY2hhbmdlZCkpCisJCSpkdXBsZXhfY2hnX291dCA9IDE7CisKKwlyZXR1cm4gcmM7Cit9CisKK01PRFVMRV9BVVRIT1IgKCJKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJNSUkgaGFyZHdhcmUgc3VwcG9ydCBsaWJyYXJ5Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0VYUE9SVF9TWU1CT0wobWlpX2xpbmtfb2spOworRVhQT1JUX1NZTUJPTChtaWlfbndheV9yZXN0YXJ0KTsKK0VYUE9SVF9TWU1CT0wobWlpX2V0aHRvb2xfZ3NldCk7CitFWFBPUlRfU1lNQk9MKG1paV9ldGh0b29sX3NzZXQpOworRVhQT1JUX1NZTUJPTChtaWlfY2hlY2tfbGluayk7CitFWFBPUlRfU1lNQk9MKG1paV9jaGVja19tZWRpYSk7CitFWFBPUlRfU1lNQk9MKGdlbmVyaWNfbWlpX2lvY3RsKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbXY2NDN4eF9ldGguYyBiL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkZTIxMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmMKQEAgLTAsMCArMSwzMDMzIEBACisvKgorICogZHJpdmVycy9uZXQvbXY2NDN4eF9ldGguYyAtIERyaXZlciBmb3IgTVY2NDNYWCBldGhlcm5ldCBwb3J0cworICogQ29weXJpZ2h0IChDKSAyMDAyIE1hdHRoZXcgRGhhcm0gPG1kaGFybUBtb21lbmNvLmNvbT4KKyAqCisgKiBCYXNlZCBvbiB0aGUgNjQzNjAgZHJpdmVyIGZyb206CisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgcmFiZWVoQGdhbGlsZW8uY28uaWwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUE1DLVNpZXJyYSwgSW5jLiwKKyAqCXdyaXR0ZW4gYnkgTWFuaXNoIExhY2h3YW5pIChsYWNod2FuaUBwbWMtc2llcnJhLmNvbSkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgUmFsZiBCYWVjaGxlIDxyYWxmQGxpbnV4LW1pcHMub3JnPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCQkJICAgRGFsZSBGYXJuc3dvcnRoIDxkYWxlQGZhcm5zd29ydGgub3JnPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBTdGV2ZW4gSi4gSGlsbCA8c2poaWxsMUByb2Nrd2VsbGNvbGxpbnMuY29tPgorICoJCQkJICAgICA8c2poaWxsQHJlYWxpdHlkaWx1dGVkLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vZGVsYXkuaD4KKyNpbmNsdWRlICJtdjY0M3h4X2V0aC5oIgorCisvKgorICogVGhlIGZpcnN0IHBhcnQgaXMgdGhlIGhpZ2ggbGV2ZWwgZHJpdmVyIG9mIHRoZSBnaWdFIGV0aGVybmV0IHBvcnRzLgorICovCisKKy8qIENvbnN0YW50cyAqLworI2RlZmluZSBWTEFOX0hMRU4JCTQKKyNkZWZpbmUgRkNTX0xFTgkJCTQKKyNkZWZpbmUgV1JBUAkJCU5FVF9JUF9BTElHTiArIEVUSF9ITEVOICsgVkxBTl9ITEVOICsgRkNTX0xFTgorI2RlZmluZSBSWF9TS0JfU0laRQkJKChkZXYtPm10dSArIFdSQVAgKyA3KSAmIH4weDcpCisKKyNkZWZpbmUgSU5UX0NBVVNFX1VOTUFTS19BTEwJCTB4MDAwN2ZmZmYKKyNkZWZpbmUgSU5UX0NBVVNFX1VOTUFTS19BTExfRVhUCTB4MDAxMWZmZmYKKyNpZmRlZiBNVjY0M1hYX1JYX1FVRVVFX0ZJTExfT05fVEFTSworI2RlZmluZSBJTlRfQ0FVU0VfTUFTS19BTEwJCTB4MDAwMDAwMDAKKyNkZWZpbmUgSU5UX0NBVVNFX0NIRUNLX0JJVFMJCUlOVF9DQVVTRV9VTk1BU0tfQUxMCisjZGVmaW5lIElOVF9DQVVTRV9DSEVDS19CSVRTX0VYVAlJTlRfQ0FVU0VfVU5NQVNLX0FMTF9FWFQKKyNlbmRpZgorCisjaWZkZWYgTVY2NDNYWF9DSEVDS1NVTV9PRkZMT0FEX1RYCisjZGVmaW5lIE1BWF9ERVNDU19QRVJfU0tCCShNQVhfU0tCX0ZSQUdTICsgMSkKKyNlbHNlCisjZGVmaW5lIE1BWF9ERVNDU19QRVJfU0tCCTEKKyNlbmRpZgorCisjZGVmaW5lIFBIWV9XQUlUX0lURVJBVElPTlMJMTAwMAkvKiAxMDAwIGl0ZXJhdGlvbnMgKiAxMHVTID0gMTBtUyBtYXggKi8KKyNkZWZpbmUgUEhZX1dBSVRfTUlDUk9fU0VDT05EUwkxMAorCisvKiBTdGF0aWMgZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCitzdGF0aWMgaW50IGV0aF9wb3J0X2xpbmtfaXNfdXAodW5zaWduZWQgaW50IGV0aF9wb3J0X251bSk7CitzdGF0aWMgdm9pZCBldGhfcG9ydF91Y19hZGRyX2dldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkJdW5zaWduZWQgY2hhciAqTWFjQWRkcik7CitzdGF0aWMgaW50IG12NjQzeHhfZXRoX3JlYWxfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgbXY2NDN4eF9ldGhfcmVhbF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCBtdjY0M3h4X2V0aF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICosIGludCk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm12NjQzeHhfZXRoX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyB2b2lkIGV0aF9wb3J0X2luaXRfbWFjX3RhYmxlcyh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtKTsKKyNpZmRlZiBNVjY0M1hYX05BUEkKK3N0YXRpYyBpbnQgbXY2NDN4eF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KTsKKyNlbmRpZgorc3RhdGljIHZvaWQgZXRoZXJuZXRfcGh5X3NldCh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtLCBpbnQgcGh5X2FkZHIpOworc3RhdGljIGludCBldGhlcm5ldF9waHlfZGV0ZWN0KHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0pOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBtdjY0M3h4X2V0aHRvb2xfb3BzOworCitzdGF0aWMgY2hhciBtdjY0M3h4X2RyaXZlcl9uYW1lW10gPSAibXY2NDN4eF9ldGgiOworc3RhdGljIGNoYXIgbXY2NDN4eF9kcml2ZXJfdmVyc2lvbltdID0gIjEuMCI7CisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm12NjQzeHhfZXRoX3NoYXJlZF9iYXNlOworCisvKiB1c2VkIHRvIHByb3RlY3QgTVY2NDNYWF9FVEhfU01JX1JFRywgd2hpY2ggaXMgc2hhcmVkIGFjcm9zcyBwb3J0cyAqLworc3RhdGljIHNwaW5sb2NrX3QgbXY2NDN4eF9ldGhfcGh5X2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CisKK3N0YXRpYyBpbmxpbmUgdTMyIG12X3JlYWQoaW50IG9mZnNldCkKK3sKKwl2b2lkICpfX2lvbWVtIHJlZ19iYXNlOworCisJcmVnX2Jhc2UgPSBtdjY0M3h4X2V0aF9zaGFyZWRfYmFzZSAtIE1WNjQzWFhfRVRIX1NIQVJFRF9SRUdTOworCisJcmV0dXJuIHJlYWRsKHJlZ19iYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG12X3dyaXRlKGludCBvZmZzZXQsIHUzMiBkYXRhKQoreworCXZvaWQgKiBfX2lvbWVtIHJlZ19iYXNlOworCisJcmVnX2Jhc2UgPSBtdjY0M3h4X2V0aF9zaGFyZWRfYmFzZSAtIE1WNjQzWFhfRVRIX1NIQVJFRF9SRUdTOworCXdyaXRlbChkYXRhLCByZWdfYmFzZSArIG9mZnNldCk7Cit9CisKKy8qCisgKiBDaGFuZ2VzIE1UVSAobWF4aW11bSB0cmFuc2ZlciB1bml0KSBvZiB0aGUgZ2lnYWJpdCBldGhlbnJldCBwb3J0CisgKgorICogSW5wdXQgOglwb2ludGVyIHRvIGV0aGVybmV0IGludGVyZmFjZSBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUKKyAqCQluZXcgbXR1IHNpemUKKyAqIE91dHB1dCA6CTAgdXBvbiBzdWNjZXNzLCAtRUlOVkFMIHVwb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IG12NjQzeHhfZXRoX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXAtPmxvY2ssIGZsYWdzKTsKKworCWlmICgobmV3X210dSA+IDk1MDApIHx8IChuZXdfbXR1IDwgNjQpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldi0+bXR1ID0gbmV3X210dTsKKwkvKgorCSAqIFN0b3AgdGhlbiByZS1vcGVuIHRoZSBpbnRlcmZhY2UuIFRoaXMgd2lsbCBhbGxvY2F0ZSBSWCBza2IncyB3aXRoCisJICogdGhlIG5ldyBNVFUuCisJICogVGhlcmUgaXMgYSBwb3NzaWJsZSBkYW5nZXIgdGhhdCB0aGUgb3BlbiB3aWxsIG5vdCBzdWNjZXNzZWQsIGR1ZQorCSAqIHRvIG1lbW9yeSBpcyBmdWxsLCB3aGljaCBtaWdodCBmYWlsIHRoZSBvcGVuIGZ1bmN0aW9uLgorCSAqLworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJaWYgKG12NjQzeHhfZXRoX3JlYWxfc3RvcChkZXYpKQorCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJIiVzOiBGYXRhbCBlcnJvciBvbiBzdG9wcGluZyBkZXZpY2VcbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJaWYgKG12NjQzeHhfZXRoX3JlYWxfb3BlbihkZXYpKQorCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJIiVzOiBGYXRhbCBlcnJvciBvbiBvcGVuaW5nIGRldmljZVxuIiwKKwkJCQlkZXYtPm5hbWUpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBtdjY0M3h4X2V0aF9yeF90YXNrCisgKgorICogRmlsbHMgLyByZWZpbGxzIFJYIHF1ZXVlIG9uIGEgY2VydGFpbiBnaWdhYml0IGV0aGVybmV0IHBvcnQKKyAqCisgKiBJbnB1dCA6CXBvaW50ZXIgdG8gZXRoZXJuZXQgaW50ZXJmYWNlIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICogT3V0cHV0IDoJTi9BCisgKi8KK3N0YXRpYyB2b2lkIG12NjQzeHhfZXRoX3J4X3Rhc2sodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBrdF9pbmZvIHBrdF9pbmZvOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmbXAtPnJ4X3Rhc2tfYnVzeSkpCisJCXBhbmljKCIlczogRXJyb3IgaW4gdGVzdF9zZXRfYml0IC8gY2xlYXJfYml0IiwgZGV2LT5uYW1lKTsKKworCXdoaWxlIChtcC0+cnhfcmluZ19za2JzIDwgKG1wLT5yeF9yaW5nX3NpemUgLSA1KSkgeworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKFJYX1NLQl9TSVpFKTsKKwkJaWYgKCFza2IpCisJCQlicmVhazsKKwkJbXAtPnJ4X3Jpbmdfc2ticysrOworCQlwa3RfaW5mby5jbWRfc3RzID0gRVRIX1JYX0VOQUJMRV9JTlRFUlJVUFQ7CisJCXBrdF9pbmZvLmJ5dGVfY250ID0gUlhfU0tCX1NJWkU7CisJCXBrdF9pbmZvLmJ1Zl9wdHIgPSBkbWFfbWFwX3NpbmdsZShOVUxMLCBza2ItPmRhdGEsIFJYX1NLQl9TSVpFLAorCQkJCQkJCURNQV9GUk9NX0RFVklDRSk7CisJCXBrdF9pbmZvLnJldHVybl9pbmZvID0gc2tiOworCQlpZiAoZXRoX3J4X3JldHVybl9idWZmKG1wLCAmcGt0X2luZm8pICE9IEVUSF9PSykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJIiVzOiBFcnJvciBhbGxvY2F0aW5nIFJYIFJpbmdcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCQlza2JfcmVzZXJ2ZShza2IsIDIpOworCX0KKwljbGVhcl9iaXQoMCwgJm1wLT5yeF90YXNrX2J1c3kpOworCS8qCisJICogSWYgUlggcmluZyBpcyBlbXB0eSBvZiBTS0IsIHNldCBhIHRpbWVyIHRvIHRyeSBhbGxvY2F0aW5nCisJICogYWdhaW4gaW4gYSBsYXRlciB0aW1lIC4KKwkgKi8KKwlpZiAoKG1wLT5yeF9yaW5nX3NrYnMgPT0gMCkgJiYgKG1wLT5yeF90aW1lcl9mbGFnID09IDApKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSeCByaW5nIGlzIGVtcHR5XG4iLCBkZXYtPm5hbWUpOworCQkvKiBBZnRlciAxMDBtU2VjICovCisJCW1wLT50aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaIC8gMTApOworCQlhZGRfdGltZXIoJm1wLT50aW1lb3V0KTsKKwkJbXAtPnJ4X3RpbWVyX2ZsYWcgPSAxOworCX0KKyNpZmRlZiBNVjY0M1hYX1JYX1FVRVVFX0ZJTExfT05fVEFTSworCWVsc2UgeworCQkvKiBSZXR1cm4gaW50ZXJydXB0cyAqLworCQltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfTUFTS19SRUcobXAtPnBvcnRfbnVtKSwKKwkJCQkJCQlJTlRfQ0FVU0VfVU5NQVNLX0FMTCk7CisJfQorI2VuZGlmCit9CisKKy8qCisgKiBtdjY0M3h4X2V0aF9yeF90YXNrX3RpbWVyX3dyYXBwZXIKKyAqCisgKiBUaW1lciByb3V0aW5lIHRvIHdha2UgdXAgUlggcXVldWUgZmlsbGluZyB0YXNrLiBUaGlzIGZ1bmN0aW9uIGlzCisgKiB1c2VkIG9ubHkgaW4gY2FzZSB0aGUgUlggcXVldWUgaXMgZW1wdHksIGFuZCBhbGwgYWxsb2Nfc2tiIGhhcworICogZmFpbGVkIChkdWUgdG8gb3V0IG9mIG1lbW9yeSBldmVudCkuCisgKgorICogSW5wdXQgOglwb2ludGVyIHRvIGV0aGVybmV0IGludGVyZmFjZSBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUKKyAqIE91dHB1dCA6CU4vQQorICovCitzdGF0aWMgdm9pZCBtdjY0M3h4X2V0aF9yeF90YXNrX3RpbWVyX3dyYXBwZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW1wLT5yeF90aW1lcl9mbGFnID0gMDsKKwltdjY0M3h4X2V0aF9yeF90YXNrKCh2b2lkICopZGF0YSk7Cit9CisKKy8qCisgKiBtdjY0M3h4X2V0aF91cGRhdGVfbWFjX2FkZHJlc3MKKyAqCisgKiBVcGRhdGUgdGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBwb3J0IGluIHRoZSBhZGRyZXNzIHRhYmxlCisgKgorICogSW5wdXQgOglwb2ludGVyIHRvIGV0aGVybmV0IGludGVyZmFjZSBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUKKyAqIE91dHB1dCA6CU4vQQorICovCitzdGF0aWMgdm9pZCBtdjY0M3h4X2V0aF91cGRhdGVfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IHBvcnRfbnVtID0gbXAtPnBvcnRfbnVtOworCisJZXRoX3BvcnRfaW5pdF9tYWNfdGFibGVzKHBvcnRfbnVtKTsKKwltZW1jcHkobXAtPnBvcnRfbWFjX2FkZHIsIGRldi0+ZGV2X2FkZHIsIDYpOworCWV0aF9wb3J0X3VjX2FkZHJfc2V0KHBvcnRfbnVtLCBtcC0+cG9ydF9tYWNfYWRkcik7Cit9CisKKy8qCisgKiBtdjY0M3h4X2V0aF9zZXRfcnhfbW9kZQorICoKKyAqIENoYW5nZSBmcm9tIHByb21pc2N1b3MgdG8gcmVndWxhciByeCBtb2RlCisgKgorICogSW5wdXQgOglwb2ludGVyIHRvIGV0aGVybmV0IGludGVyZmFjZSBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUKKyAqIE91dHB1dCA6CU4vQQorICovCitzdGF0aWMgdm9pZCBtdjY0M3h4X2V0aF9zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgY29uZmlnX3JlZzsKKworCWNvbmZpZ19yZWcgPSBldGhlcm5ldF9nZXRfY29uZmlnX3JlZyhtcC0+cG9ydF9udW0pOworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCWNvbmZpZ19yZWcgfD0gKHUzMikgTVY2NDNYWF9FVEhfVU5JQ0FTVF9QUk9NSVNDVU9VU19NT0RFOworCWVsc2UKKwkJY29uZmlnX3JlZyAmPSB+KHUzMikgTVY2NDNYWF9FVEhfVU5JQ0FTVF9QUk9NSVNDVU9VU19NT0RFOworCWV0aGVybmV0X3NldF9jb25maWdfcmVnKG1wLT5wb3J0X251bSwgY29uZmlnX3JlZyk7Cit9CisKKy8qCisgKiBtdjY0M3h4X2V0aF9zZXRfbWFjX2FkZHJlc3MKKyAqCisgKiBDaGFuZ2UgdGhlIGludGVyZmFjZSdzIG1hYyBhZGRyZXNzLgorICogTm8gc3BlY2lhbCBoYXJkd2FyZSB0aGluZyBzaG91bGQgYmUgZG9uZSBiZWNhdXNlIGludGVyZmFjZSBpcyBhbHdheXMKKyAqIHB1dCBpbiBwcm9taXNjdW91cyBtb2RlLgorICoKKyAqIElucHV0IDoJcG9pbnRlciB0byBldGhlcm5ldCBpbnRlcmZhY2UgbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlIGFuZAorICoJCWEgcG9pbnRlciB0byB0aGUgZGVzaWduYXRlZCBlbnRyeSB0byBiZSBhZGRlZCB0byB0aGUgY2FjaGUuCisgKiBPdXRwdXQgOgl6ZXJvIHVwb24gc3VjY2VzcywgbmVnYXRpdmUgdXBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgbXY2NDN4eF9ldGhfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkvKiArMiBpcyBmb3IgdGhlIG9mZnNldCBvZiB0aGUgSFcgYWRkciB0eXBlICovCisJCWRldi0+ZGV2X2FkZHJbaV0gPSAoKHVuc2lnbmVkIGNoYXIgKilhZGRyKVtpICsgMl07CisJbXY2NDN4eF9ldGhfdXBkYXRlX21hY19hZGRyZXNzKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBtdjY0M3h4X2V0aF90eF90aW1lb3V0CisgKgorICogQ2FsbGVkIHVwb24gYSB0aW1lb3V0IG9uIHRyYW5zbWl0dGluZyBhIHBhY2tldAorICoKKyAqIElucHV0IDoJcG9pbnRlciB0byBldGhlcm5ldCBpbnRlcmZhY2UgbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlLgorICogT3V0cHV0IDoJTi9BCisgKi8KK3N0YXRpYyB2b2lkIG12NjQzeHhfZXRoX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogVFggdGltZW91dCAgIiwgZGV2LT5uYW1lKTsKKworCS8qIERvIHRoZSByZXNldCBvdXRzaWRlIG9mIGludGVycnVwdCBjb250ZXh0ICovCisJc2NoZWR1bGVfd29yaygmbXAtPnR4X3RpbWVvdXRfdGFzayk7Cit9CisKKy8qCisgKiBtdjY0M3h4X2V0aF90eF90aW1lb3V0X3Rhc2sKKyAqCisgKiBBY3R1YWwgcm91dGluZSB0byByZXNldCB0aGUgYWRhcHRlciB3aGVuIGEgdGltZW91dCBvbiBUeCBoYXMgb2NjdXJyZWQKKyAqLworc3RhdGljIHZvaWQgbXY2NDN4eF9ldGhfdHhfdGltZW91dF90YXNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCWV0aF9wb3J0X3Jlc2V0KG1wLT5wb3J0X251bSk7CisJZXRoX3BvcnRfc3RhcnQobXApOworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKK30KKworLyoKKyAqIG12NjQzeHhfZXRoX2ZyZWVfdHhfcXVldWUKKyAqCisgKiBJbnB1dCA6CWRldiAtIGEgcG9pbnRlciB0byB0aGUgcmVxdWlyZWQgaW50ZXJmYWNlCisgKgorICogT3V0cHV0IDoJMCBpZiB3YXMgYWJsZSB0byByZWxlYXNlIHNrYiAsIG5vbnplcm8gb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgbXY2NDN4eF9ldGhfZnJlZV90eF9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQl1bnNpZ25lZCBpbnQgZXRoX2ludF9jYXVzZV9leHQpCit7CisJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZtcC0+c3RhdHM7CisJc3RydWN0IHBrdF9pbmZvIHBrdF9pbmZvOworCWludCByZWxlYXNlZCA9IDE7CisKKwlpZiAoIShldGhfaW50X2NhdXNlX2V4dCAmIChCSVQwIHwgQklUOCkpKQorCQlyZXR1cm4gcmVsZWFzZWQ7CisKKwlzcGluX2xvY2soJm1wLT5sb2NrKTsKKworCS8qIENoZWNrIG9ubHkgcXVldWUgMCAqLworCXdoaWxlIChldGhfdHhfcmV0dXJuX2Rlc2MobXAsICZwa3RfaW5mbykgPT0gRVRIX09LKSB7CisJCWlmIChwa3RfaW5mby5jbWRfc3RzICYgQklUMCkgeworCQkJcHJpbnRrKCIlczogRXJyb3IgaW4gVFhcbiIsIGRldi0+bmFtZSk7CisJCQlzdGF0cy0+dHhfZXJyb3JzKys7CisJCX0KKworCQkvKgorCQkgKiBJZiByZXR1cm5faW5mbyBpcyBkaWZmZXJlbnQgdGhhbiAwLCByZWxlYXNlIHRoZSBza2IuCisJCSAqIFRoZSBjYXNlIHdoZXJlIHJldHVybl9pbmZvIGlzIG5vdCAwIGlzIG9ubHkgaW4gY2FzZQorCQkgKiB3aGVuIHRyYW5zbWl0dGVkIGEgc2NhdHRlci9nYXRoZXIgcGFja2V0LCB3aGVyZSBvbmx5CisJCSAqIGxhc3Qgc2tiIHJlbGVhc2VzIHRoZSB3aG9sZSBjaGFpbi4KKwkJICovCisJCWlmIChwa3RfaW5mby5yZXR1cm5faW5mbykgeworCQkJaWYgKHNrYl9zaGluZm8ocGt0X2luZm8ucmV0dXJuX2luZm8pLT5ucl9mcmFncykKKwkJCQlkbWFfdW5tYXBfcGFnZShOVUxMLCBwa3RfaW5mby5idWZfcHRyLAorCQkJCQkJcGt0X2luZm8uYnl0ZV9jbnQsCisJCQkJCQlETUFfVE9fREVWSUNFKTsKKwkJCWVsc2UKKwkJCQlkbWFfdW5tYXBfc2luZ2xlKE5VTEwsIHBrdF9pbmZvLmJ1Zl9wdHIsCisJCQkJCQlwa3RfaW5mby5ieXRlX2NudCwKKwkJCQkJCURNQV9UT19ERVZJQ0UpOworCisJCQlkZXZfa2ZyZWVfc2tiX2lycShwa3RfaW5mby5yZXR1cm5faW5mbyk7CisJCQlyZWxlYXNlZCA9IDA7CisKKwkJCS8qCisJCQkgKiBEZWNyZW1lbnQgdGhlIG51bWJlciBvZiBvdXRzdGFuZGluZyBza2JzIGNvdW50ZXIgb24KKwkJCSAqIHRoZSBUWCBxdWV1ZS4KKwkJCSAqLworCQkJaWYgKG1wLT50eF9yaW5nX3NrYnMgPT0gMCkKKwkJCQlwYW5pYygiRVJST1IgLSBUWCBvdXRzdGFuZGluZyBTS0JzIgorCQkJCQkJIiBjb3VudGVyIGlzIGNvcnJ1cHRlZCIpOworCQkJbXAtPnR4X3Jpbmdfc2ticy0tOworCQl9IGVsc2UKKwkJCWRtYV91bm1hcF9wYWdlKE5VTEwsIHBrdF9pbmZvLmJ1Zl9wdHIsCisJCQkJCXBrdF9pbmZvLmJ5dGVfY250LCBETUFfVE9fREVWSUNFKTsKKwl9CisKKwlzcGluX3VubG9jaygmbXAtPmxvY2spOworCisJcmV0dXJuIHJlbGVhc2VkOworfQorCisvKgorICogbXY2NDN4eF9ldGhfcmVjZWl2ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZm9yd2FyZCBwYWNrZXRzIHRoYXQgYXJlIHJlY2VpdmVkIGZyb20gdGhlIHBvcnQncworICogcXVldWVzIHRvd2FyZCBrZXJuZWwgY29yZSBvciBGYXN0Um91dGUgdGhlbSB0byBhbm90aGVyIGludGVyZmFjZS4KKyAqCisgKiBJbnB1dCA6CWRldiAtIGEgcG9pbnRlciB0byB0aGUgcmVxdWlyZWQgaW50ZXJmYWNlCisgKgkJbWF4IC0gbWF4aW11bSBudW1iZXIgdG8gcmVjZWl2ZSAoMCBtZWFucyB1bmxpbXRlZCkKKyAqCisgKiBPdXRwdXQgOgludW1iZXIgb2Ygc2VydmVkIHBhY2tldHMKKyAqLworI2lmZGVmIE1WNjQzWFhfTkFQSQorc3RhdGljIGludCBtdjY0M3h4X2V0aF9yZWNlaXZlX3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBidWRnZXQpCisjZWxzZQorc3RhdGljIGludCBtdjY0M3h4X2V0aF9yZWNlaXZlX3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCisjZW5kaWYKK3sKKwlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJm1wLT5zdGF0czsKKwl1bnNpZ25lZCBpbnQgcmVjZWl2ZWRfcGFja2V0cyA9IDA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgcGt0X2luZm8gcGt0X2luZm87CisKKyNpZmRlZiBNVjY0M1hYX05BUEkKKwl3aGlsZSAoZXRoX3BvcnRfcmVjZWl2ZShtcCwgJnBrdF9pbmZvKSA9PSBFVEhfT0sgJiYgYnVkZ2V0ID4gMCkgeworI2Vsc2UKKwl3aGlsZSAoZXRoX3BvcnRfcmVjZWl2ZShtcCwgJnBrdF9pbmZvKSA9PSBFVEhfT0spIHsKKyNlbmRpZgorCQltcC0+cnhfcmluZ19za2JzLS07CisJCXJlY2VpdmVkX3BhY2tldHMrKzsKKyNpZmRlZiBNVjY0M1hYX05BUEkKKwkJYnVkZ2V0LS07CisjZW5kaWYKKwkJLyogVXBkYXRlIHN0YXRpc3RpY3MuIE5vdGUgYnl0ZSBjb3VudCBpbmNsdWRlcyA0IGJ5dGUgQ1JDIGNvdW50ICovCisJCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJCXN0YXRzLT5yeF9ieXRlcyArPSBwa3RfaW5mby5ieXRlX2NudDsKKwkJc2tiID0gcGt0X2luZm8ucmV0dXJuX2luZm87CisJCS8qCisJCSAqIEluIGNhc2UgcmVjZWl2ZWQgYSBwYWNrZXQgd2l0aG91dCBmaXJzdCAvIGxhc3QgYml0cyBvbiBPUgorCQkgKiB0aGUgZXJyb3Igc3VtbWFyeSBiaXQgaXMgb24sIHRoZSBwYWNrZXRzIG5lZWRzIHRvIGJlIGRyb3BlZWQuCisJCSAqLworCQlpZiAoKChwa3RfaW5mby5jbWRfc3RzCisJCQkJJiAoRVRIX1JYX0ZJUlNUX0RFU0MgfCBFVEhfUlhfTEFTVF9ERVNDKSkgIT0KKwkJCQkJKEVUSF9SWF9GSVJTVF9ERVNDIHwgRVRIX1JYX0xBU1RfREVTQykpCisJCQkJfHwgKHBrdF9pbmZvLmNtZF9zdHMgJiBFVEhfRVJST1JfU1VNTUFSWSkpIHsKKwkJCXN0YXRzLT5yeF9kcm9wcGVkKys7CisJCQlpZiAoKHBrdF9pbmZvLmNtZF9zdHMgJiAoRVRIX1JYX0ZJUlNUX0RFU0MgfAorCQkJCQkJCUVUSF9SWF9MQVNUX0RFU0MpKSAhPQorCQkJCShFVEhfUlhfRklSU1RfREVTQyB8IEVUSF9SWF9MQVNUX0RFU0MpKSB7CisJCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCQkiJXM6IFJlY2VpdmVkIHBhY2tldCBzcHJlYWQgIgorCQkJCQkJIm9uIG11bHRpcGxlIGRlc2NyaXB0b3JzXG4iLAorCQkJCQkJZGV2LT5uYW1lKTsKKwkJCX0KKwkJCWlmIChwa3RfaW5mby5jbWRfc3RzICYgRVRIX0VSUk9SX1NVTU1BUlkpCisJCQkJc3RhdHMtPnJ4X2Vycm9ycysrOworCisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFRoZSAtNCBpcyBmb3IgdGhlIENSQyBpbiB0aGUgdHJhaWxlciBvZiB0aGUKKwkJCSAqIHJlY2VpdmVkIHBhY2tldAorCQkJICovCisJCQlza2JfcHV0KHNrYiwgcGt0X2luZm8uYnl0ZV9jbnQgLSA0KTsKKwkJCXNrYi0+ZGV2ID0gZGV2OworCisJCQlpZiAocGt0X2luZm8uY21kX3N0cyAmIEVUSF9MQVlFUl80X0NIRUNLU1VNX09LKSB7CisJCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJCQlza2ItPmNzdW0gPSBodG9ucygKKwkJCQkJKHBrdF9pbmZvLmNtZF9zdHMgJiAweDAwMDdmZmY4KSA+PiAzKTsKKwkJCX0KKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisjaWZkZWYgTVY2NDNYWF9OQVBJCisJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworI2Vsc2UKKwkJCW5ldGlmX3J4KHNrYik7CisjZW5kaWYKKwkJfQorCX0KKworCXJldHVybiByZWNlaXZlZF9wYWNrZXRzOworfQorCisvKgorICogbXY2NDN4eF9ldGhfaW50X2hhbmRsZXIKKyAqCisgKiBNYWluIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgZ2lnYml0IGV0aGVybmV0IHBvcnRzCisgKgorICogSW5wdXQgOglpcnEJLSBpcnEgbnVtYmVyIChub3QgdXNlZCkKKyAqCQlkZXZfaWQJLSBhIHBvaW50ZXIgdG8gdGhlIHJlcXVpcmVkIGludGVyZmFjZSdzIGRhdGEgc3RydWN0dXJlCisgKgkJcmVncwktIG5vdCB1c2VkCisgKiBPdXRwdXQgOglOL0EKKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgbXY2NDN4eF9ldGhfaW50X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBldGhfaW50X2NhdXNlLCBldGhfaW50X2NhdXNlX2V4dCA9IDA7CisJdW5zaWduZWQgaW50IHBvcnRfbnVtID0gbXAtPnBvcnRfbnVtOworCisJLyogUmVhZCBpbnRlcnJ1cHQgY2F1c2UgcmVnaXN0ZXJzICovCisJZXRoX2ludF9jYXVzZSA9IG12X3JlYWQoTVY2NDNYWF9FVEhfSU5URVJSVVBUX0NBVVNFX1JFRyhwb3J0X251bSkpICYKKwkJCQkJCUlOVF9DQVVTRV9VTk1BU0tfQUxMOworCisJaWYgKGV0aF9pbnRfY2F1c2UgJiBCSVQxKQorCQlldGhfaW50X2NhdXNlX2V4dCA9IG12X3JlYWQoCisJCQlNVjY0M1hYX0VUSF9JTlRFUlJVUFRfQ0FVU0VfRVhURU5EX1JFRyhwb3J0X251bSkpICYKKwkJCQkJCUlOVF9DQVVTRV9VTk1BU0tfQUxMX0VYVDsKKworI2lmZGVmIE1WNjQzWFhfTkFQSQorCWlmICghKGV0aF9pbnRfY2F1c2UgJiAweDAwMDdmZmZkKSkgeworCQkvKiBEb250IGFjayB0aGUgUnggaW50ZXJydXB0ICovCisjZW5kaWYKKwkJLyoKKwkJICogQ2xlYXIgc3BlY2lmaWMgZXRoZXJuZXQgcG9ydCBpbnRyZXJydXB0IHJlZ2lzdGVycyBieQorCQkgKiBhY2tub3dsZWRpbmcgcmVsZXZhbnQgYml0cy4KKwkJICovCisJCW12X3dyaXRlKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9DQVVTRV9SRUcocG9ydF9udW0pLAorCQkJCQkJCX5ldGhfaW50X2NhdXNlKTsKKwkJaWYgKGV0aF9pbnRfY2F1c2VfZXh0ICE9IDB4MCkKKwkJCW12X3dyaXRlKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9DQVVTRV9FWFRFTkRfUkVHCisJCQkJCShwb3J0X251bSksIH5ldGhfaW50X2NhdXNlX2V4dCk7CisKKwkJLyogVURQIGNoYW5nZSA6IFdlIG1heSBuZWVkIHRoaXMgKi8KKwkJaWYgKChldGhfaW50X2NhdXNlX2V4dCAmIDB4MDAwMGZmZmYpICYmCisJCSAgICAobXY2NDN4eF9ldGhfZnJlZV90eF9xdWV1ZShkZXYsIGV0aF9pbnRfY2F1c2VfZXh0KSA9PSAwKSAmJgorCQkgICAgKG1wLT50eF9yaW5nX3NpemUgPiBtcC0+dHhfcmluZ19za2JzICsgTUFYX0RFU0NTX1BFUl9TS0IpKQorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworI2lmZGVmIE1WNjQzWFhfTkFQSQorCX0gZWxzZSB7CisJCWlmIChuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKGRldikpIHsKKwkJCS8qIE1hc2sgYWxsIHRoZSBpbnRlcnJ1cHRzICovCisJCQltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfTUFTS19SRUcocG9ydF9udW0pLCAwKTsKKwkJCW12X3dyaXRlKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9FWFRFTkRfTUFTS19SRUcKKwkJCQkJCQkJKHBvcnRfbnVtKSwgMCk7CisJCQlfX25ldGlmX3J4X3NjaGVkdWxlKGRldik7CisJCX0KKyNlbHNlCisJCWlmIChldGhfaW50X2NhdXNlICYgKEJJVDIgfCBCSVQxMSkpCisJCQltdjY0M3h4X2V0aF9yZWNlaXZlX3F1ZXVlKGRldiwgMCk7CisKKwkJLyoKKwkJICogQWZ0ZXIgZm9yd2FyZGVkIHJlY2VpdmVkIHBhY2tldHMgdG8gdXBwZXIgbGF5ZXIsIGFkZCBhIHRhc2sKKwkJICogaW4gYW4gaW50ZXJydXB0cyBlbmFibGVkIGNvbnRleHQgdGhhdCByZWZpbGxzIHRoZSBSWCByaW5nCisJCSAqIHdpdGggc2tiJ3MuCisJCSAqLworI2lmZGVmIE1WNjQzWFhfUlhfUVVFVUVfRklMTF9PTl9UQVNLCisJCS8qIFVubWFzayBhbGwgaW50ZXJydXB0cyBvbiBldGhlcm5ldCBwb3J0ICovCisJCW12X3dyaXRlKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9NQVNLX1JFRyhwb3J0X251bSksCisJCQkJCQkJSU5UX0NBVVNFX01BU0tfQUxMKTsKKwkJcXVldWVfdGFzaygmbXAtPnJ4X3Rhc2ssICZ0cV9pbW1lZGlhdGUpOworCQltYXJrX2JoKElNTUVESUFURV9CSCk7CisjZWxzZQorCQltcC0+cnhfdGFzay5mdW5jKGRldik7CisjZW5kaWYKKyNlbmRpZgorCX0KKwkvKiBQSFkgc3RhdHVzIGNoYW5nZWQgKi8KKwlpZiAoZXRoX2ludF9jYXVzZV9leHQgJiAoQklUMTYgfCBCSVQyMCkpIHsKKwkJaWYgKGV0aF9wb3J0X2xpbmtfaXNfdXAocG9ydF9udW0pKSB7CisJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQkvKiBTdGFydCBUWCBxdWV1ZSAqLworCQkJbXZfd3JpdGUoTVY2NDNYWF9FVEhfVFJBTlNNSVRfUVVFVUVfQ09NTUFORF9SRUcKKwkJCQkJCQkJKHBvcnRfbnVtKSwgMSk7CisJCX0gZWxzZSB7CisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQl9CisJfQorCisJLyoKKwkgKiBJZiBubyByZWFsIGludGVycnVwdCBvY2N1cmVkLCBleGl0LgorCSAqIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHVzaW5nIGdpZ0UgaW50ZXJydXB0IGNvYWxlc2NpbmcgbWVjaGFuaXNtLgorCSAqLworCWlmICgoZXRoX2ludF9jYXVzZSA9PSAweDApICYmIChldGhfaW50X2NhdXNlX2V4dCA9PSAweDApKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKyNpZmRlZiBNVjY0M1hYX0NPQUwKKworLyoKKyAqIGV0aF9wb3J0X3NldF9yeF9jb2FsIC0gU2V0cyBjb2FsZXNjaW5nIGludGVycnVwdCBtZWNoYW5pc20gb24gUlggcGF0aAorICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyByb3V0aW5lIHNldHMgdGhlIFJYIGNvYWxlc2NpbmcgaW50ZXJydXB0IG1lY2hhbmlzbSBwYXJhbWV0ZXIuCisgKglUaGlzIHBhcmFtZXRlciBpcyBhIHRpbWVvdXQgY291bnRlciwgdGhhdCBjb3VudHMgaW4gNjQgdF9jbGsKKyAqCWNodW5rcyA7IHRoYXQgd2hlbiB0aW1lb3V0IGV2ZW50IG9jY3VycyBhIG1hc2thYmxlIGludGVycnVwdAorICoJb2NjdXJzLgorICoJVGhlIHBhcmFtZXRlciBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZSB0Q2xrIG9mIHRoZSBNVi02NDN4eCBjaGlwCisgKgksIGFuZCB0aGUgcmVxdWlyZWQgZGVsYXkgb2YgdGhlIGludGVycnVwdCBpbiB1c2VjLgorICoKKyAqIElOUFVUOgorICoJdW5zaWduZWQgaW50IGV0aF9wb3J0X251bQlFdGhlcm5ldCBwb3J0IG51bWJlcgorICoJdW5zaWduZWQgaW50IHRfY2xrCQl0X2NsayBvZiB0aGUgTVYtNjQzeHggY2hpcCBpbiBIWiB1bml0cworICoJdW5zaWduZWQgaW50IGRlbGF5CQlEZWxheSBpbiB1c2VjCisgKgorICogT1VUUFVUOgorICoJSW50ZXJydXB0IGNvYWxlc2NpbmcgbWVjaGFuaXNtIHZhbHVlIGlzIHNldCBpbiBNVi02NDN4eCBjaGlwLgorICoKKyAqIFJFVFVSTjoKKyAqCVRoZSBpbnRlcnJ1cHQgY29hbGVzY2luZyB2YWx1ZSBzZXQgaW4gdGhlIGdpZ0UgcG9ydC4KKyAqCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXRoX3BvcnRfc2V0X3J4X2NvYWwodW5zaWduZWQgaW50IGV0aF9wb3J0X251bSwKKwkJCQkJdW5zaWduZWQgaW50IHRfY2xrLCB1bnNpZ25lZCBpbnQgZGVsYXkpCit7CisJdW5zaWduZWQgaW50IGNvYWwgPSAoKHRfY2xrIC8gMTAwMDAwMCkgKiBkZWxheSkgLyA2NDsKKworCS8qIFNldCBSWCBDb2FsZXNjaW5nIG1lY2hhbmlzbSAqLworCW12X3dyaXRlKE1WNjQzWFhfRVRIX1NETUFfQ09ORklHX1JFRyhldGhfcG9ydF9udW0pLAorCQkoKGNvYWwgJiAweDNmZmYpIDw8IDgpIHwKKwkJKG12X3JlYWQoTVY2NDNYWF9FVEhfU0RNQV9DT05GSUdfUkVHKGV0aF9wb3J0X251bSkpCisJCQkmIDB4ZmZjMDAwZmYpKTsKKworCXJldHVybiBjb2FsOworfQorI2VuZGlmCisKKy8qCisgKiBldGhfcG9ydF9zZXRfdHhfY29hbCAtIFNldHMgY29hbGVzY2luZyBpbnRlcnJ1cHQgbWVjaGFuaXNtIG9uIFRYIHBhdGgKKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgcm91dGluZSBzZXRzIHRoZSBUWCBjb2FsZXNjaW5nIGludGVycnVwdCBtZWNoYW5pc20gcGFyYW1ldGVyLgorICoJVGhpcyBwYXJhbWV0ZXIgaXMgYSB0aW1lb3V0IGNvdW50ZXIsIHRoYXQgY291bnRzIGluIDY0IHRfY2xrCisgKgljaHVua3MgOyB0aGF0IHdoZW4gdGltZW91dCBldmVudCBvY2N1cnMgYSBtYXNrYWJsZSBpbnRlcnJ1cHQKKyAqCW9jY3Vycy4KKyAqCVRoZSBwYXJhbWV0ZXIgaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgdF9jTEsgZnJlcXVlbmN5IG9mIHRoZQorICoJTVYtNjQzeHggY2hpcCBhbmQgdGhlIHJlcXVpcmVkIGRlbGF5IGluIHRoZSBpbnRlcnJ1cHQgaW4gdVNlYworICoKKyAqIElOUFVUOgorICoJdW5zaWduZWQgaW50IGV0aF9wb3J0X251bQlFdGhlcm5ldCBwb3J0IG51bWJlcgorICoJdW5zaWduZWQgaW50IHRfY2xrCQl0X2NsayBvZiB0aGUgTVYtNjQzeHggY2hpcCBpbiBIWiB1bml0cworICoJdW5zaWduZWQgaW50IGRlbGF5CQlEZWxheSBpbiB1U2Vjb25kcworICoKKyAqIE9VVFBVVDoKKyAqCUludGVycnVwdCBjb2FsZXNjaW5nIG1lY2hhbmlzbSB2YWx1ZSBpcyBzZXQgaW4gTVYtNjQzeHggY2hpcC4KKyAqCisgKiBSRVRVUk46CisgKglUaGUgaW50ZXJydXB0IGNvYWxlc2NpbmcgdmFsdWUgc2V0IGluIHRoZSBnaWdFIHBvcnQuCisgKgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGV0aF9wb3J0X3NldF90eF9jb2FsKHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0sCisJCQkJCXVuc2lnbmVkIGludCB0X2NsaywgdW5zaWduZWQgaW50IGRlbGF5KQoreworCXVuc2lnbmVkIGludCBjb2FsOworCWNvYWwgPSAoKHRfY2xrIC8gMTAwMDAwMCkgKiBkZWxheSkgLyA2NDsKKwkvKiBTZXQgVFggQ29hbGVzY2luZyBtZWNoYW5pc20gKi8KKwltdl93cml0ZShNVjY0M1hYX0VUSF9UWF9GSUZPX1VSR0VOVF9USFJFU0hPTERfUkVHKGV0aF9wb3J0X251bSksCisJCQkJCQkJCWNvYWwgPDwgNCk7CisJcmV0dXJuIGNvYWw7Cit9CisKKy8qCisgKiBtdjY0M3h4X2V0aF9vcGVuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBvcGVubmluZyB0aGUgbmV0d29yayBkZXZpY2UuIFRoZSBmdW5jdGlvbgorICogc2hvdWxkIGluaXRpYWxpemUgYWxsIHRoZSBoYXJkd2FyZSwgaW5pdGlhbGl6ZSBjeWNsaWMgUngvVHgKKyAqIGRlc2NyaXB0b3JzIGNoYWluIGFuZCBidWZmZXJzIGFuZCBhbGxvY2F0ZSBhbiBJUlEgdG8gdGhlIG5ldHdvcmsKKyAqIGRldmljZS4KKyAqCisgKiBJbnB1dCA6CWEgcG9pbnRlciB0byB0aGUgbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogT3V0cHV0IDoJemVybyBvZiBzdWNjZXNzICwgbm9uemVybyBpZiBmYWlscy4KKyAqLworCitzdGF0aWMgaW50IG12NjQzeHhfZXRoX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IHBvcnRfbnVtID0gbXAtPnBvcnRfbnVtOworCWludCBlcnI7CisKKwlzcGluX2xvY2tfaXJxKCZtcC0+bG9jayk7CisKKwllcnIgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgbXY2NDN4eF9ldGhfaW50X2hhbmRsZXIsCisJCQlTQV9JTlRFUlJVUFQgfCBTQV9TQU1QTEVfUkFORE9NLCBkZXYtPm5hbWUsIGRldik7CisKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2FuIG5vdCBhc3NpZ24gSVJRIG51bWJlciB0byBNVjY0M1hYX2V0aCVkXG4iLAorCQkJCQkJCQlwb3J0X251bSk7CisJCWVyciA9IC1FQUdBSU47CisJCWdvdG8gb3V0OworCX0KKworCWlmIChtdjY0M3h4X2V0aF9yZWFsX29wZW4oZGV2KSkgeworCQlwcmludGsoIiVzOiBFcnJvciBvcGVuaW5nIGludGVyZmFjZVxuIiwgZGV2LT5uYW1lKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCXNwaW5fdW5sb2NrX2lycSgmbXAtPmxvY2spOworCisJcmV0dXJuIDA7CisKK291dF9mcmVlOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxKCZtcC0+bG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogZXRoZXJfaW5pdF9yeF9kZXNjX3JpbmcgLSBDdXJ2ZSBhIFJ4IGNoYWluIGRlc2MgbGlzdCBhbmQgYnVmZmVyIGluIG1lbW9yeS4KKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgYSBSeCBjaGFpbmVkIGxpc3Qgb2YgZGVzY3JpcHRvcnMgYW5kIHBhY2tldAorICoJYnVmZmVycyBpbiBhIGZvcm0gb2YgYSByaW5nLiBUaGUgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBwb3J0CisgKglpbml0aWFsaXphdGlvbiByb3V0aW5lIGFuZCBiZWZvcmUgcG9ydCBzdGFydCByb3V0aW5lLgorICoJVGhlIEV0aGVybmV0IFNETUEgZW5naW5lIHVzZXMgQ1BVIGJ1cyBhZGRyZXNzZXMgdG8gYWNjZXNzIHRoZSB2YXJpb3VzCisgKglkZXZpY2VzIGluIHRoZSBzeXN0ZW0gKGkuZS4gRFJBTSkuIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgZXRoZXJuZXQKKyAqCXN0cnVjdCAndmlydHVhbCB0byBwaHlzaWNhbCcgcm91dGluZSAoc2V0IGJ5IHRoZSB1c2VyKSB0byBzZXQgdGhlIHJpbmcKKyAqCXdpdGggcGh5c2ljYWwgYWRkcmVzc2VzLgorICoKKyAqIElOUFVUOgorICoJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAJRXRoZXJuZXQgUG9ydCBDb250cm9sIHNydHVjdC4KKyAqCisgKiBPVVRQVVQ6CisgKglUaGUgcm91dGluZSB1cGRhdGVzIHRoZSBFdGhlcm5ldCBwb3J0IGNvbnRyb2wgc3RydWN0IHdpdGggaW5mb3JtYXRpb24KKyAqCXJlZ2FyZGluZyB0aGUgUnggZGVzY3JpcHRvcnMgYW5kIGJ1ZmZlcnMuCisgKgorICogUkVUVVJOOgorICoJTm9uZS4KKyAqLworc3RhdGljIHZvaWQgZXRoZXJfaW5pdF9yeF9kZXNjX3Jpbmcoc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXApCit7CisJdm9sYXRpbGUgc3RydWN0IGV0aF9yeF9kZXNjICpwX3J4X2Rlc2M7CisJaW50IHJ4X2Rlc2NfbnVtID0gbXAtPnJ4X3Jpbmdfc2l6ZTsKKwlpbnQgaTsKKworCS8qIGluaXRpYWxpemUgdGhlIG5leHRfZGVzY19wdHIgbGlua3MgaW4gdGhlIFJ4IGRlc2NyaXB0b3JzIHJpbmcgKi8KKwlwX3J4X2Rlc2MgPSAoc3RydWN0IGV0aF9yeF9kZXNjICopbXAtPnBfcnhfZGVzY19hcmVhOworCWZvciAoaSA9IDA7IGkgPCByeF9kZXNjX251bTsgaSsrKSB7CisJCXBfcnhfZGVzY1tpXS5uZXh0X2Rlc2NfcHRyID0gbXAtPnJ4X2Rlc2NfZG1hICsKKwkJCSgoaSArIDEpICUgcnhfZGVzY19udW0pICogc2l6ZW9mKHN0cnVjdCBldGhfcnhfZGVzYyk7CisJfQorCisJLyogU2F2ZSBSeCBkZXNjIHBvaW50ZXIgdG8gZHJpdmVyIHN0cnVjdC4gKi8KKwltcC0+cnhfY3Vycl9kZXNjX3EgPSAwOworCW1wLT5yeF91c2VkX2Rlc2NfcSA9IDA7CisKKwltcC0+cnhfZGVzY19hcmVhX3NpemUgPSByeF9kZXNjX251bSAqIHNpemVvZihzdHJ1Y3QgZXRoX3J4X2Rlc2MpOworCisJLyogQWRkIHRoZSBxdWV1ZSB0byB0aGUgbGlzdCBvZiBSWCBxdWV1ZXMgb2YgdGhpcyBwb3J0ICovCisJbXAtPnBvcnRfcnhfcXVldWVfY29tbWFuZCB8PSAxOworfQorCisvKgorICogZXRoZXJfaW5pdF90eF9kZXNjX3JpbmcgLSBDdXJ2ZSBhIFR4IGNoYWluIGRlc2MgbGlzdCBhbmQgYnVmZmVyIGluIG1lbW9yeS4KKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgYSBUeCBjaGFpbmVkIGxpc3Qgb2YgZGVzY3JpcHRvcnMgYW5kIHBhY2tldAorICoJYnVmZmVycyBpbiBhIGZvcm0gb2YgYSByaW5nLiBUaGUgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBwb3J0CisgKglpbml0aWFsaXphdGlvbiByb3V0aW5lIGFuZCBiZWZvcmUgcG9ydCBzdGFydCByb3V0aW5lLgorICoJVGhlIEV0aGVybmV0IFNETUEgZW5naW5lIHVzZXMgQ1BVIGJ1cyBhZGRyZXNzZXMgdG8gYWNjZXNzIHRoZSB2YXJpb3VzCisgKglkZXZpY2VzIGluIHRoZSBzeXN0ZW0gKGkuZS4gRFJBTSkuIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgZXRoZXJuZXQKKyAqCXN0cnVjdCAndmlydHVhbCB0byBwaHlzaWNhbCcgcm91dGluZSAoc2V0IGJ5IHRoZSB1c2VyKSB0byBzZXQgdGhlIHJpbmcKKyAqCXdpdGggcGh5c2ljYWwgYWRkcmVzc2VzLgorICoKKyAqIElOUFVUOgorICoJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAJRXRoZXJuZXQgUG9ydCBDb250cm9sIHNydHVjdC4KKyAqCisgKiBPVVRQVVQ6CisgKglUaGUgcm91dGluZSB1cGRhdGVzIHRoZSBFdGhlcm5ldCBwb3J0IGNvbnRyb2wgc3RydWN0IHdpdGggaW5mb3JtYXRpb24KKyAqCXJlZ2FyZGluZyB0aGUgVHggZGVzY3JpcHRvcnMgYW5kIGJ1ZmZlcnMuCisgKgorICogUkVUVVJOOgorICoJTm9uZS4KKyAqLworc3RhdGljIHZvaWQgZXRoZXJfaW5pdF90eF9kZXNjX3Jpbmcoc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXApCit7CisJaW50IHR4X2Rlc2NfbnVtID0gbXAtPnR4X3Jpbmdfc2l6ZTsKKwlzdHJ1Y3QgZXRoX3R4X2Rlc2MgKnBfdHhfZGVzYzsKKwlpbnQgaTsKKworCS8qIEluaXRpYWxpemUgdGhlIG5leHRfZGVzY19wdHIgbGlua3MgaW4gdGhlIFR4IGRlc2NyaXB0b3JzIHJpbmcgKi8KKwlwX3R4X2Rlc2MgPSAoc3RydWN0IGV0aF90eF9kZXNjICopbXAtPnBfdHhfZGVzY19hcmVhOworCWZvciAoaSA9IDA7IGkgPCB0eF9kZXNjX251bTsgaSsrKSB7CisJCXBfdHhfZGVzY1tpXS5uZXh0X2Rlc2NfcHRyID0gbXAtPnR4X2Rlc2NfZG1hICsKKwkJCSgoaSArIDEpICUgdHhfZGVzY19udW0pICogc2l6ZW9mKHN0cnVjdCBldGhfdHhfZGVzYyk7CisJfQorCisJbXAtPnR4X2N1cnJfZGVzY19xID0gMDsKKwltcC0+dHhfdXNlZF9kZXNjX3EgPSAwOworI2lmZGVmIE1WNjQzWFhfQ0hFQ0tTVU1fT0ZGTE9BRF9UWAorCW1wLT50eF9maXJzdF9kZXNjX3EgPSAwOworI2VuZGlmCisKKwltcC0+dHhfZGVzY19hcmVhX3NpemUgPSB0eF9kZXNjX251bSAqIHNpemVvZihzdHJ1Y3QgZXRoX3R4X2Rlc2MpOworCisJLyogQWRkIHRoZSBxdWV1ZSB0byB0aGUgbGlzdCBvZiBUeCBxdWV1ZXMgb2YgdGhpcyBwb3J0ICovCisJbXAtPnBvcnRfdHhfcXVldWVfY29tbWFuZCB8PSAxOworfQorCisvKiBIZWxwZXIgZnVuY3Rpb24gZm9yIG12NjQzeHhfZXRoX29wZW4gKi8KK3N0YXRpYyBpbnQgbXY2NDN4eF9ldGhfcmVhbF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBwb3J0X251bSA9IG1wLT5wb3J0X251bTsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCS8qIFN0b3AgUlggUXVldWVzICovCisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfUkVDRUlWRV9RVUVVRV9DT01NQU5EX1JFRyhwb3J0X251bSksIDB4MDAwMGZmMDApOworCisJLyogQ2xlYXIgdGhlIGV0aGVybmV0IHBvcnQgaW50ZXJydXB0cyAqLworCW12X3dyaXRlKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9DQVVTRV9SRUcocG9ydF9udW0pLCAwKTsKKwltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfQ0FVU0VfRVhURU5EX1JFRyhwb3J0X251bSksIDApOworCisJLyogVW5tYXNrIFJYIGJ1ZmZlciBhbmQgVFggZW5kIGludGVycnVwdCAqLworCW12X3dyaXRlKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9NQVNLX1JFRyhwb3J0X251bSksCisJCQkJCQlJTlRfQ0FVU0VfVU5NQVNLX0FMTCk7CisKKwkvKiBVbm1hc2sgcGh5IGFuZCBsaW5rIHN0YXR1cyBjaGFuZ2VzIGludGVycnVwdHMgKi8KKwltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfRVhURU5EX01BU0tfUkVHKHBvcnRfbnVtKSwKKwkJCQkJCUlOVF9DQVVTRV9VTk1BU0tfQUxMX0VYVCk7CisKKwkvKiBTZXQgdGhlIE1BQyBBZGRyZXNzICovCisJbWVtY3B5KG1wLT5wb3J0X21hY19hZGRyLCBkZXYtPmRldl9hZGRyLCA2KTsKKworCWV0aF9wb3J0X2luaXQobXApOworCisJSU5JVF9XT1JLKCZtcC0+cnhfdGFzaywgKHZvaWQgKCopKHZvaWQgKikpbXY2NDN4eF9ldGhfcnhfdGFzaywgZGV2KTsKKworCW1lbXNldCgmbXAtPnRpbWVvdXQsIDAsIHNpemVvZihzdHJ1Y3QgdGltZXJfbGlzdCkpOworCW1wLT50aW1lb3V0LmZ1bmN0aW9uID0gbXY2NDN4eF9ldGhfcnhfdGFza190aW1lcl93cmFwcGVyOworCW1wLT50aW1lb3V0LmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisKKwltcC0+cnhfdGFza19idXN5ID0gMDsKKwltcC0+cnhfdGltZXJfZmxhZyA9IDA7CisKKwkvKiBBbGxvY2F0ZSBSWCBhbmQgVFggc2tiIHJpbmdzICovCisJbXAtPnJ4X3NrYiA9IGttYWxsb2Moc2l6ZW9mKCptcC0+cnhfc2tiKSAqIG1wLT5yeF9yaW5nX3NpemUsCisJCQkJCQkJCUdGUF9LRVJORUwpOworCWlmICghbXAtPnJ4X3NrYikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3QgYWxsb2NhdGUgUnggc2tiIHJpbmdcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltcC0+dHhfc2tiID0ga21hbGxvYyhzaXplb2YoKm1wLT50eF9za2IpICogbXAtPnR4X3Jpbmdfc2l6ZSwKKwkJCQkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFtcC0+dHhfc2tiKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCBhbGxvY2F0ZSBUeCBza2IgcmluZ1xuIiwgZGV2LT5uYW1lKTsKKwkJa2ZyZWUobXAtPnJ4X3NrYik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIEFsbG9jYXRlIFRYIHJpbmcgKi8KKwltcC0+dHhfcmluZ19za2JzID0gMDsKKwlzaXplID0gbXAtPnR4X3Jpbmdfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgZXRoX3R4X2Rlc2MpOworCW1wLT50eF9kZXNjX2FyZWFfc2l6ZSA9IHNpemU7CisKKwlpZiAobXAtPnR4X3NyYW1fc2l6ZSkgeworCQltcC0+cF90eF9kZXNjX2FyZWEgPSBpb3JlbWFwKG1wLT50eF9zcmFtX2FkZHIsCisJCQkJCQkJbXAtPnR4X3NyYW1fc2l6ZSk7CisJCW1wLT50eF9kZXNjX2RtYSA9IG1wLT50eF9zcmFtX2FkZHI7CisJfSBlbHNlCisJCW1wLT5wX3R4X2Rlc2NfYXJlYSA9IGRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBzaXplLAorCQkJCQkJCSZtcC0+dHhfZGVzY19kbWEsCisJCQkJCQkJR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1wLT5wX3R4X2Rlc2NfYXJlYSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3QgYWxsb2NhdGUgVHggUmluZyAoc2l6ZSAlZCBieXRlcylcbiIsCisJCQkJCQkJZGV2LT5uYW1lLCBzaXplKTsKKwkJa2ZyZWUobXAtPnJ4X3NrYik7CisJCWtmcmVlKG1wLT50eF9za2IpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJQlVHX09OKCh1MzIpIG1wLT5wX3R4X2Rlc2NfYXJlYSAmIDB4Zik7CS8qIGNoZWNrIDE2LWJ5dGUgYWxpZ25tZW50ICovCisJbWVtc2V0KCh2b2lkICopbXAtPnBfdHhfZGVzY19hcmVhLCAwLCBtcC0+dHhfZGVzY19hcmVhX3NpemUpOworCisJZXRoZXJfaW5pdF90eF9kZXNjX3JpbmcobXApOworCisJLyogQWxsb2NhdGUgUlggcmluZyAqLworCW1wLT5yeF9yaW5nX3NrYnMgPSAwOworCXNpemUgPSBtcC0+cnhfcmluZ19zaXplICogc2l6ZW9mKHN0cnVjdCBldGhfcnhfZGVzYyk7CisJbXAtPnJ4X2Rlc2NfYXJlYV9zaXplID0gc2l6ZTsKKworCWlmIChtcC0+cnhfc3JhbV9zaXplKSB7CisJCW1wLT5wX3J4X2Rlc2NfYXJlYSA9IGlvcmVtYXAobXAtPnJ4X3NyYW1fYWRkciwKKwkJCQkJCQltcC0+cnhfc3JhbV9zaXplKTsKKwkJbXAtPnJ4X2Rlc2NfZG1hID0gbXAtPnJ4X3NyYW1fYWRkcjsKKwl9IGVsc2UKKwkJbXAtPnBfcnhfZGVzY19hcmVhID0gZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsIHNpemUsCisJCQkJCQkJJm1wLT5yeF9kZXNjX2RtYSwKKwkJCQkJCQlHRlBfS0VSTkVMKTsKKworCWlmICghbXAtPnBfcnhfZGVzY19hcmVhKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCBhbGxvY2F0ZSBSeCByaW5nIChzaXplICVkIGJ5dGVzKVxuIiwKKwkJCQkJCQlkZXYtPm5hbWUsIHNpemUpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGcmVlaW5nIHByZXZpb3VzbHkgYWxsb2NhdGVkIFRYIHF1ZXVlcy4uLiIsCisJCQkJCQkJZGV2LT5uYW1lKTsKKwkJaWYgKG1wLT5yeF9zcmFtX3NpemUpCisJCQlpb3VubWFwKG1wLT5wX3J4X2Rlc2NfYXJlYSk7CisJCWVsc2UKKwkJCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIG1wLT50eF9kZXNjX2FyZWFfc2l6ZSwKKwkJCQkJbXAtPnBfdHhfZGVzY19hcmVhLCBtcC0+dHhfZGVzY19kbWEpOworCQlrZnJlZShtcC0+cnhfc2tiKTsKKwkJa2ZyZWUobXAtPnR4X3NrYik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoKHZvaWQgKiltcC0+cF9yeF9kZXNjX2FyZWEsIDAsIHNpemUpOworCisJZXRoZXJfaW5pdF9yeF9kZXNjX3JpbmcobXApOworCisJbXY2NDN4eF9ldGhfcnhfdGFzayhkZXYpOwkvKiBGaWxsIFJYIHJpbmcgd2l0aCBza2IncyAqLworCisJZXRoX3BvcnRfc3RhcnQobXApOworCisJLyogSW50ZXJydXB0IENvYWxlc2NpbmcgKi8KKworI2lmZGVmIE1WNjQzWFhfQ09BTAorCW1wLT5yeF9pbnRfY29hbCA9CisJCWV0aF9wb3J0X3NldF9yeF9jb2FsKHBvcnRfbnVtLCAxMzMwMDAwMDAsIE1WNjQzWFhfUlhfQ09BTCk7CisjZW5kaWYKKworCW1wLT50eF9pbnRfY29hbCA9CisJCWV0aF9wb3J0X3NldF90eF9jb2FsKHBvcnRfbnVtLCAxMzMwMDAwMDAsIE1WNjQzWFhfVFhfQ09BTCk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG12NjQzeHhfZXRoX2ZyZWVfdHhfcmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IHBvcnRfbnVtID0gbXAtPnBvcnRfbnVtOworCXVuc2lnbmVkIGludCBjdXJyOworCisJLyogU3RvcCBUeCBRdWV1ZXMgKi8KKwltdl93cml0ZShNVjY0M1hYX0VUSF9UUkFOU01JVF9RVUVVRV9DT01NQU5EX1JFRyhwb3J0X251bSksIDB4MDAwMGZmMDApOworCisJLyogRnJlZSBvdXRzdGFuZGluZyBza2IncyBvbiBUWCByaW5ncyAqLworCWZvciAoY3VyciA9IDA7IG1wLT50eF9yaW5nX3NrYnMgJiYgY3VyciA8IG1wLT50eF9yaW5nX3NpemU7IGN1cnIrKykgeworCQlpZiAobXAtPnR4X3NrYltjdXJyXSkgeworCQkJZGV2X2tmcmVlX3NrYihtcC0+dHhfc2tiW2N1cnJdKTsKKwkJCW1wLT50eF9yaW5nX3NrYnMtLTsKKwkJfQorCX0KKwlpZiAobXAtPnR4X3Jpbmdfc2ticykKKwkJcHJpbnRrKCIlczogRXJyb3Igb24gVHggZGVzY3JpcHRvciBmcmVlIC0gY291bGQgbm90IGZyZWUgJWQiCisJCQkJIiBkZXNjcmlwdG9yc1xuIiwgZGV2LT5uYW1lLCBtcC0+dHhfcmluZ19za2JzKTsKKworCS8qIEZyZWUgVFggcmluZyAqLworCWlmIChtcC0+dHhfc3JhbV9zaXplKQorCQlpb3VubWFwKG1wLT5wX3R4X2Rlc2NfYXJlYSk7CisJZWxzZQorCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBtcC0+dHhfZGVzY19hcmVhX3NpemUsCisJCQkJbXAtPnBfdHhfZGVzY19hcmVhLCBtcC0+dHhfZGVzY19kbWEpOworfQorCitzdGF0aWMgdm9pZCBtdjY0M3h4X2V0aF9mcmVlX3J4X3JpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBwb3J0X251bSA9IG1wLT5wb3J0X251bTsKKwlpbnQgY3VycjsKKworCS8qIFN0b3AgUlggUXVldWVzICovCisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfUkVDRUlWRV9RVUVVRV9DT01NQU5EX1JFRyhwb3J0X251bSksIDB4MDAwMGZmMDApOworCisJLyogRnJlZSBwcmVhbGxvY2F0ZWQgc2tiJ3Mgb24gUlggcmluZ3MgKi8KKwlmb3IgKGN1cnIgPSAwOyBtcC0+cnhfcmluZ19za2JzICYmIGN1cnIgPCBtcC0+cnhfcmluZ19zaXplOyBjdXJyKyspIHsKKwkJaWYgKG1wLT5yeF9za2JbY3Vycl0pIHsKKwkJCWRldl9rZnJlZV9za2IobXAtPnJ4X3NrYltjdXJyXSk7CisJCQltcC0+cnhfcmluZ19za2JzLS07CisJCX0KKwl9CisKKwlpZiAobXAtPnJ4X3Jpbmdfc2ticykKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiJXM6IEVycm9yIGluIGZyZWVpbmcgUnggUmluZy4gJWQgc2tiJ3Mgc3RpbGwiCisJCQkiIHN0dWNrIGluIFJYIFJpbmcgLSBpZ25vcmluZyB0aGVtXG4iLCBkZXYtPm5hbWUsCisJCQltcC0+cnhfcmluZ19za2JzKTsKKwkvKiBGcmVlIFJYIHJpbmcgKi8KKwlpZiAobXAtPnJ4X3NyYW1fc2l6ZSkKKwkJaW91bm1hcChtcC0+cF9yeF9kZXNjX2FyZWEpOworCWVsc2UKKwkJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgbXAtPnJ4X2Rlc2NfYXJlYV9zaXplLAorCQkJCW1wLT5wX3J4X2Rlc2NfYXJlYSwgbXAtPnJ4X2Rlc2NfZG1hKTsKK30KKworLyoKKyAqIG12NjQzeHhfZXRoX3N0b3AKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBjbG9zaW5nIHRoZSBuZXR3b3JrIGRldmljZS4KKyAqIEl0IHVwZGF0ZXMgdGhlIGhhcmR3YXJlLAorICogcmVsZWFzZSBhbGwgbWVtb3J5IHRoYXQgaG9sZHMgYnVmZmVycyBhbmQgZGVzY3JpcHRvcnMgYW5kIHJlbGVhc2UgdGhlIElSUS4KKyAqIElucHV0IDoJYSBwb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBPdXRwdXQgOgl6ZXJvIGlmIHN1Y2Nlc3MgLCBub256ZXJvIGlmIGZhaWxzCisgKi8KKworLyogSGVscGVyIGZ1bmN0aW9uIGZvciBtdjY0M3h4X2V0aF9zdG9wICovCisKK3N0YXRpYyBpbnQgbXY2NDN4eF9ldGhfcmVhbF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBwb3J0X251bSA9IG1wLT5wb3J0X251bTsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJbXY2NDN4eF9ldGhfZnJlZV90eF9yaW5ncyhkZXYpOworCW12NjQzeHhfZXRoX2ZyZWVfcnhfcmluZ3MoZGV2KTsKKworCWV0aF9wb3J0X3Jlc2V0KG1wLT5wb3J0X251bSk7CisKKwkvKiBEaXNhYmxlIGV0aGVybmV0IHBvcnQgaW50ZXJydXB0cyAqLworCW12X3dyaXRlKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9DQVVTRV9SRUcocG9ydF9udW0pLCAwKTsKKwltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfQ0FVU0VfRVhURU5EX1JFRyhwb3J0X251bSksIDApOworCisJLyogTWFzayBSWCBidWZmZXIgYW5kIFRYIGVuZCBpbnRlcnJ1cHQgKi8KKwltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfTUFTS19SRUcocG9ydF9udW0pLCAwKTsKKworCS8qIE1hc2sgcGh5IGFuZCBsaW5rIHN0YXR1cyBjaGFuZ2VzIGludGVycnVwdHMgKi8KKwltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfRVhURU5EX01BU0tfUkVHKHBvcnRfbnVtKSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdjY0M3h4X2V0aF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2lycSgmbXAtPmxvY2spOworCisJbXY2NDN4eF9ldGhfcmVhbF9zdG9wKGRldik7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlzcGluX3VubG9ja19pcnEoJm1wLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgTVY2NDNYWF9OQVBJCitzdGF0aWMgdm9pZCBtdjY0M3h4X3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwa3RfaW5mbyBwa3RfaW5mbzsKKworCXdoaWxlIChldGhfdHhfcmV0dXJuX2Rlc2MobXAsICZwa3RfaW5mbykgPT0gRVRIX09LKSB7CisJCWlmIChwa3RfaW5mby5yZXR1cm5faW5mbykgeworCQkJaWYgKHNrYl9zaGluZm8ocGt0X2luZm8ucmV0dXJuX2luZm8pLT5ucl9mcmFncykKKwkJCQlkbWFfdW5tYXBfcGFnZShOVUxMLCBwa3RfaW5mby5idWZfcHRyLAorCQkJCQkJcGt0X2luZm8uYnl0ZV9jbnQsCisJCQkJCQlETUFfVE9fREVWSUNFKTsKKwkJCWVsc2UKKwkJCQlkbWFfdW5tYXBfc2luZ2xlKE5VTEwsIHBrdF9pbmZvLmJ1Zl9wdHIsCisJCQkJCQlwa3RfaW5mby5ieXRlX2NudCwKKwkJCQkJCURNQV9UT19ERVZJQ0UpOworCisJCQlkZXZfa2ZyZWVfc2tiX2lycShwa3RfaW5mby5yZXR1cm5faW5mbyk7CisKKwkJCWlmIChtcC0+dHhfcmluZ19za2JzKQorCQkJCW1wLT50eF9yaW5nX3NrYnMtLTsKKwkJfSBlbHNlCisJCQlkbWFfdW5tYXBfcGFnZShOVUxMLCBwa3RfaW5mby5idWZfcHRyLAorCQkJCQlwa3RfaW5mby5ieXRlX2NudCwgRE1BX1RPX0RFVklDRSk7CisJfQorCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJgorCQkJbXAtPnR4X3Jpbmdfc2l6ZSA+IG1wLT50eF9yaW5nX3NrYnMgKyBNQVhfREVTQ1NfUEVSX1NLQikKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisvKgorICogbXY2NDN4eF9wb2xsCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIGNhc2Ugb2YgTkFQSQorICovCitzdGF0aWMgaW50IG12NjQzeHhfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCkKK3sKKwlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGRvbmUgPSAxLCBvcmlnX2J1ZGdldCwgd29ya19kb25lOworCXVuc2lnbmVkIGludCBwb3J0X251bSA9IG1wLT5wb3J0X251bTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgTVY2NDNYWF9UWF9GQVNUX1JFRklMTAorCWlmICgrK21wLT50eF9jbGVhbl90aHJlc2hvbGQgPiA1KSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZtcC0+bG9jaywgZmxhZ3MpOworCQltdjY0M3h4X3R4KGRldik7CisJCW1wLT50eF9jbGVhbl90aHJlc2hvbGQgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcC0+bG9jaywgZmxhZ3MpOworCX0KKyNlbmRpZgorCisJaWYgKChtdl9yZWFkKE1WNjQzWFhfRVRIX1JYX0NVUlJFTlRfUVVFVUVfREVTQ19QVFJfMChwb3J0X251bSkpKQorCQkJCQkJIT0gKHUzMikgbXAtPnJ4X3VzZWRfZGVzY19xKSB7CisJCW9yaWdfYnVkZ2V0ID0gKmJ1ZGdldDsKKwkJaWYgKG9yaWdfYnVkZ2V0ID4gZGV2LT5xdW90YSkKKwkJCW9yaWdfYnVkZ2V0ID0gZGV2LT5xdW90YTsKKwkJd29ya19kb25lID0gbXY2NDN4eF9ldGhfcmVjZWl2ZV9xdWV1ZShkZXYsIG9yaWdfYnVkZ2V0KTsKKwkJbXAtPnJ4X3Rhc2suZnVuYyhkZXYpOworCQkqYnVkZ2V0IC09IHdvcmtfZG9uZTsKKwkJZGV2LT5xdW90YSAtPSB3b3JrX2RvbmU7CisJCWlmICh3b3JrX2RvbmUgPj0gb3JpZ19idWRnZXQpCisJCQlkb25lID0gMDsKKwl9CisKKwlpZiAoZG9uZSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXAtPmxvY2ssIGZsYWdzKTsKKwkJX19uZXRpZl9yeF9jb21wbGV0ZShkZXYpOworCQltdl93cml0ZShNVjY0M1hYX0VUSF9JTlRFUlJVUFRfQ0FVU0VfUkVHKHBvcnRfbnVtKSwgMCk7CisJCW12X3dyaXRlKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9DQVVTRV9FWFRFTkRfUkVHKHBvcnRfbnVtKSwgMCk7CisJCW12X3dyaXRlKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9NQVNLX1JFRyhwb3J0X251bSksCisJCQkJCQlJTlRfQ0FVU0VfVU5NQVNLX0FMTCk7CisJCW12X3dyaXRlKE1WNjQzWFhfRVRIX0lOVEVSUlVQVF9FWFRFTkRfTUFTS19SRUcocG9ydF9udW0pLAorCQkJCQkJSU5UX0NBVVNFX1VOTUFTS19BTExfRVhUKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gZG9uZSA/IDAgOiAxOworfQorI2VuZGlmCisKKy8qCisgKiBtdjY0M3h4X2V0aF9zdGFydF94bWl0CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBxdWV1ZXMgYSBwYWNrZXQgaW4gdGhlIFR4IGRlc2NyaXB0b3IgZm9yCisgKiByZXF1aXJlZCBwb3J0LgorICoKKyAqIElucHV0IDoJc2tiIC0gYSBwb2ludGVyIHRvIHNvY2tldCBidWZmZXIKKyAqCQlkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIHJlcXVpcmVkIHBvcnQKKyAqCisgKiBPdXRwdXQgOgl6ZXJvIHVwb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IG12NjQzeHhfZXRoX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJm1wLT5zdGF0czsKKwlFVEhfRlVOQ19SRVRfU1RBVFVTIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBwa3RfaW5mbyBwa3RfaW5mbzsKKworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiJXM6IFRyaWVkIHNlbmRpbmcgcGFja2V0IHdoZW4gaW50ZXJmYWNlIGlzIHN0b3BwZWRcbiIsCisJCQlkZXYtPm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBUaGlzIGlzIGEgaGFyZCBlcnJvciwgbG9nIGl0LiAqLworCWlmICgobXAtPnR4X3Jpbmdfc2l6ZSAtIG1wLT50eF9yaW5nX3NrYnMpIDw9CisJCQkJCShza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMSkpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlwcmludGsoS0VSTl9FUlIKKwkJCSIlczogQnVnIGluIG12NjQzeHhfZXRoIC0gVHJ5aW5nIHRvIHRyYW5zbWl0IHdoZW4iCisJCQkiIHF1ZXVlIGZ1bGwgIVxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogUGFyYW5vaWQgY2hlY2sgLSB0aGlzIHNob3VsZG4ndCBoYXBwZW4gKi8KKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJc3RhdHMtPnR4X2Ryb3BwZWQrKzsKKwkJcHJpbnRrKEtFUk5fRVJSICJtdjY0MzIwX2V0aCBwYXJhbm9pZCBjaGVjayBmYWlsZWRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXAtPmxvY2ssIGZsYWdzKTsKKworCS8qIFVwZGF0ZSBwYWNrZXQgaW5mbyBkYXRhIHN0cnVjdHVyZSAtLSBETUEgb3duZWQsIGZpcnN0IGxhc3QgKi8KKyNpZmRlZiBNVjY0M1hYX0NIRUNLU1VNX09GRkxPQURfVFgKKwlpZiAoIXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MpIHsKK2xpbmVhcjoKKwkJaWYgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX0hXKSB7CisJCQlwa3RfaW5mby5jbWRfc3RzID0gRVRIX1RYX0VOQUJMRV9JTlRFUlJVUFQgfAorCQkJCQlFVEhfVFhfRklSU1RfREVTQyB8IEVUSF9UWF9MQVNUX0RFU0M7CisJCQlwa3RfaW5mby5sNGlfY2hrID0gMDsKKwkJfSBlbHNlIHsKKwkJCXUzMiBpcGhlYWRlciA9IHNrYi0+bmguaXBoLT5paGwgPDwgMTE7CisKKwkJCXBrdF9pbmZvLmNtZF9zdHMgPSBFVEhfVFhfRU5BQkxFX0lOVEVSUlVQVCB8CisJCQkJCUVUSF9UWF9GSVJTVF9ERVNDIHwgRVRIX1RYX0xBU1RfREVTQyB8CisJCQkJCUVUSF9HRU5fVENQX1VEUF9DSEVDS1NVTSB8CisJCQkJCUVUSF9HRU5fSVBfVl80X0NIRUNLU1VNIHwgaXBoZWFkZXI7CisJCQkvKiBDUFUgYWxyZWFkeSBjYWxjdWxhdGVkIHBzZXVkbyBoZWFkZXIgY2hlY2tzdW0uICovCisJCQlpZiAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVURQKSB7CisJCQkJcGt0X2luZm8uY21kX3N0cyB8PSBFVEhfVURQX0ZSQU1FOworCQkJCXBrdF9pbmZvLmw0aV9jaGsgPSBza2ItPmgudWgtPmNoZWNrOworCQkJfSBlbHNlIGlmIChza2ItPm5oLmlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApCisJCQkJcGt0X2luZm8ubDRpX2NoayA9IHNrYi0+aC50aC0+Y2hlY2s7CisJCQllbHNlIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJIiVzOiBjaGtzdW0gcHJvdG8gIT0gVENQIG9yIFVEUFxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcC0+bG9jaywgZmxhZ3MpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJCXBrdF9pbmZvLmJ5dGVfY250ID0gc2tiLT5sZW47CisJCXBrdF9pbmZvLmJ1Zl9wdHIgPSBkbWFfbWFwX3NpbmdsZShOVUxMLCBza2ItPmRhdGEsIHNrYi0+bGVuLAorCQkJCQkJCURNQV9UT19ERVZJQ0UpOworCQlwa3RfaW5mby5yZXR1cm5faW5mbyA9IHNrYjsKKwkJbXAtPnR4X3Jpbmdfc2ticysrOworCQlzdGF0dXMgPSBldGhfcG9ydF9zZW5kKG1wLCAmcGt0X2luZm8pOworCQlpZiAoKHN0YXR1cyA9PSBFVEhfRVJST1IpIHx8IChzdGF0dXMgPT0gRVRIX1FVRVVFX0ZVTEwpKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3Igb24gdHJhbnNtaXR0aW5nIHBhY2tldFxuIiwKKwkJCQkJCQkJZGV2LT5uYW1lKTsKKwkJc3RhdHMtPnR4X2J5dGVzICs9IHBrdF9pbmZvLmJ5dGVfY250OworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGludCBmcmFnOworCQl1MzIgaXBoZWFkZXI7CisKKwkJLyogU2luY2UgaGFyZHdhcmUgY2FuJ3QgaGFuZGxlIHVuYWxpZ25lZCBmcmFnbWVudHMgc21hbGxlcgorCQkgKiB0aGFuIDkgYnl0ZXMsIGlmIHdlIGZpbmQgYW55LCB3ZSBsaW5lYXJpemUgdGhlIHNrYgorCQkgKiBhbmQgc3RhcnQgYWdhaW4uICBXaGVuIEkndmUgc2VlbiBpdCwgaXQncyBhbHdheXMgYmVlbgorCQkgKiB0aGUgZmlyc3QgZnJhZyAocHJvYmFibHkgbmVhciB0aGUgZW5kIG9mIHRoZSBwYWdlKSwKKwkJICogYnV0IHdlIGNoZWNrIGFsbCBmcmFncyB0byBiZSBzYWZlLgorCQkgKi8KKwkJZm9yIChmcmFnID0gMDsgZnJhZyA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGZyYWcrKykgeworCQkJc2tiX2ZyYWdfdCAqZnJhZ3A7CisKKwkJCWZyYWdwID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbZnJhZ107CisJCQlpZiAoZnJhZ3AtPnNpemUgPD0gOCAmJiBmcmFncC0+cGFnZV9vZmZzZXQgJiAweDcpIHsKKwkJCQlza2JfbGluZWFyaXplKHNrYiwgR0ZQX0FUT01JQyk7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB1bmFsaWduZWQgdGlueSBmcmFnbWVudCIKKwkJCQkJCSIlZCBvZiAlZCwgZml4ZWRcbiIsCisJCQkJCQlkZXYtPm5hbWUsIGZyYWcsCisJCQkJCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKTsKKwkJCQlnb3RvIGxpbmVhcjsKKwkJCX0KKwkJfQorCisJCS8qIGZpcnN0IGZyYWcgd2hpY2ggaXMgc2tiIGhlYWRlciAqLworCQlwa3RfaW5mby5ieXRlX2NudCA9IHNrYl9oZWFkbGVuKHNrYik7CisJCXBrdF9pbmZvLmJ1Zl9wdHIgPSBkbWFfbWFwX3NpbmdsZShOVUxMLCBza2ItPmRhdGEsCisJCQkJCQkJc2tiX2hlYWRsZW4oc2tiKSwKKwkJCQkJCQlETUFfVE9fREVWSUNFKTsKKwkJcGt0X2luZm8ubDRpX2NoayA9IDA7CisJCXBrdF9pbmZvLnJldHVybl9pbmZvID0gMDsKKwkJcGt0X2luZm8uY21kX3N0cyA9IEVUSF9UWF9GSVJTVF9ERVNDOworCisJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQkJaXBoZWFkZXIgPSBza2ItPm5oLmlwaC0+aWhsIDw8IDExOworCQkJcGt0X2luZm8uY21kX3N0cyB8PSBFVEhfR0VOX1RDUF9VRFBfQ0hFQ0tTVU0gfAorCQkJCQlFVEhfR0VOX0lQX1ZfNF9DSEVDS1NVTSB8IGlwaGVhZGVyOworCQkJLyogQ1BVIGFscmVhZHkgY2FsY3VsYXRlZCBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtLiAqLworCQkJaWYgKHNrYi0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgeworCQkJCXBrdF9pbmZvLmNtZF9zdHMgfD0gRVRIX1VEUF9GUkFNRTsKKwkJCQlwa3RfaW5mby5sNGlfY2hrID0gc2tiLT5oLnVoLT5jaGVjazsKKwkJCX0gZWxzZSBpZiAoc2tiLT5uaC5pcGgtPnByb3RvY29sID09IElQUFJPVE9fVENQKQorCQkJCXBrdF9pbmZvLmw0aV9jaGsgPSBza2ItPmgudGgtPmNoZWNrOworCQkJZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSIlczogY2hrc3VtIHByb3RvICE9IFRDUCBvciBVRFBcbiIsCisJCQkJCWRldi0+bmFtZSk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXAtPmxvY2ssIGZsYWdzKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCisJCXN0YXR1cyA9IGV0aF9wb3J0X3NlbmQobXAsICZwa3RfaW5mbyk7CisJCWlmIChzdGF0dXMgIT0gRVRIX09LKSB7CisJCQlpZiAoKHN0YXR1cyA9PSBFVEhfRVJST1IpKQorCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkiJXM6IEVycm9yIG9uIHRyYW5zbWl0dGluZyBwYWNrZXRcbiIsCisJCQkJCWRldi0+bmFtZSk7CisJCQlpZiAoc3RhdHVzID09IEVUSF9RVUVVRV9GVUxMKQorCQkJCXByaW50aygiRXJyb3Igb24gUXVldWUgRnVsbCBcbiIpOworCQkJaWYgKHN0YXR1cyA9PSBFVEhfUVVFVUVfTEFTVF9SRVNPVVJDRSkKKwkJCQlwcmludGsoIlR4IHJlc291cmNlIGVycm9yIFxuIik7CisJCX0KKwkJc3RhdHMtPnR4X2J5dGVzICs9IHBrdF9pbmZvLmJ5dGVfY250OworCisJCS8qIENoZWNrIGZvciB0aGUgcmVtYWluaW5nIGZyYWdzICovCisJCWZvciAoZnJhZyA9IDA7IGZyYWcgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBmcmFnKyspIHsKKwkJCXNrYl9mcmFnX3QgKnRoaXNfZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ZyYWddOworCQkJcGt0X2luZm8ubDRpX2NoayA9IDB4MDAwMDsKKwkJCXBrdF9pbmZvLmNtZF9zdHMgPSAweDAwMDAwMDAwOworCisJCQkvKiBMYXN0IEZyYWcgZW5hYmxlcyBpbnRlcnJ1cHQgYW5kIGZyZWVzIHRoZSBza2IgKi8KKwkJCWlmIChmcmFnID09IChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzIC0gMSkpIHsKKwkJCQlwa3RfaW5mby5jbWRfc3RzIHw9IEVUSF9UWF9FTkFCTEVfSU5URVJSVVBUIHwKKwkJCQkJCQlFVEhfVFhfTEFTVF9ERVNDOworCQkJCXBrdF9pbmZvLnJldHVybl9pbmZvID0gc2tiOworCQkJCW1wLT50eF9yaW5nX3NrYnMrKzsKKwkJCX0gZWxzZSB7CisJCQkJcGt0X2luZm8ucmV0dXJuX2luZm8gPSAwOworCQkJfQorCQkJcGt0X2luZm8ubDRpX2NoayA9IDA7CisJCQlwa3RfaW5mby5ieXRlX2NudCA9IHRoaXNfZnJhZy0+c2l6ZTsKKworCQkJcGt0X2luZm8uYnVmX3B0ciA9IGRtYV9tYXBfcGFnZShOVUxMLCB0aGlzX2ZyYWctPnBhZ2UsCisJCQkJCQkJdGhpc19mcmFnLT5wYWdlX29mZnNldCwKKwkJCQkJCQl0aGlzX2ZyYWctPnNpemUsCisJCQkJCQkJRE1BX1RPX0RFVklDRSk7CisKKwkJCXN0YXR1cyA9IGV0aF9wb3J0X3NlbmQobXAsICZwa3RfaW5mbyk7CisKKwkJCWlmIChzdGF0dXMgIT0gRVRIX09LKSB7CisJCQkJaWYgKChzdGF0dXMgPT0gRVRIX0VSUk9SKSkKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3Igb24gIgorCQkJCQkJCSJ0cmFuc21pdHRpbmcgcGFja2V0XG4iLAorCQkJCQkJCWRldi0+bmFtZSk7CisKKwkJCQlpZiAoc3RhdHVzID09IEVUSF9RVUVVRV9MQVNUX1JFU09VUkNFKQorCQkJCQlwcmludGsoIlR4IHJlc291cmNlIGVycm9yIFxuIik7CisKKwkJCQlpZiAoc3RhdHVzID09IEVUSF9RVUVVRV9GVUxMKQorCQkJCQlwcmludGsoIlF1ZXVlIGlzIGZ1bGwgXG4iKTsKKwkJCX0KKwkJCXN0YXRzLT50eF9ieXRlcyArPSBwa3RfaW5mby5ieXRlX2NudDsKKwkJfQorCX0KKyNlbHNlCisJcGt0X2luZm8uY21kX3N0cyA9IEVUSF9UWF9FTkFCTEVfSU5URVJSVVBUIHwgRVRIX1RYX0ZJUlNUX0RFU0MgfAorCQkJCQkJCUVUSF9UWF9MQVNUX0RFU0M7CisJcGt0X2luZm8ubDRpX2NoayA9IDA7CisJcGt0X2luZm8uYnl0ZV9jbnQgPSBza2ItPmxlbjsKKwlwa3RfaW5mby5idWZfcHRyID0gZG1hX21hcF9zaW5nbGUoTlVMTCwgc2tiLT5kYXRhLCBza2ItPmxlbiwKKwkJCQkJCQkJRE1BX1RPX0RFVklDRSk7CisJcGt0X2luZm8ucmV0dXJuX2luZm8gPSBza2I7CisJbXAtPnR4X3Jpbmdfc2ticysrOworCXN0YXR1cyA9IGV0aF9wb3J0X3NlbmQobXAsICZwa3RfaW5mbyk7CisJaWYgKChzdGF0dXMgPT0gRVRIX0VSUk9SKSB8fCAoc3RhdHVzID09IEVUSF9RVUVVRV9GVUxMKSkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3Igb24gdHJhbnNtaXR0aW5nIHBhY2tldFxuIiwKKwkJCQkJCQkJZGV2LT5uYW1lKTsKKwlzdGF0cy0+dHhfYnl0ZXMgKz0gcGt0X2luZm8uYnl0ZV9jbnQ7CisjZW5kaWYKKworCS8qIENoZWNrIGlmIFRYIHF1ZXVlIGNhbiBoYW5kbGUgYW5vdGhlciBza2IuIElmIG5vdCwgdGhlbgorCSAqIHNpZ25hbCBoaWdoZXIgbGF5ZXJzIHRvIHN0b3AgcmVxdWVzdGluZyBUWAorCSAqLworCWlmIChtcC0+dHhfcmluZ19zaXplIDw9IChtcC0+dHhfcmluZ19za2JzICsgTUFYX0RFU0NTX1BFUl9TS0IpKQorCQkvKgorCQkgKiBTdG9wIGdldHRpbmcgc2tiJ3MgZnJvbSB1cHBlciBsYXllcnMuCisJCSAqIEdldHRpbmcgc2tiJ3MgZnJvbSB1cHBlciBsYXllcnMgd2lsbCBiZSBlbmFibGVkIGFnYWluIGFmdGVyCisJCSAqIHBhY2tldHMgYXJlIHJlbGVhc2VkLgorCQkgKi8KKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogVXBkYXRlIHN0YXRpc3RpY3MgYW5kIHN0YXJ0IG9mIHRyYW5zbWl0dGlvbiB0aW1lICovCisJc3RhdHMtPnR4X3BhY2tldHMrKzsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsJCS8qIHN1Y2Nlc3MgKi8KK30KKworLyoKKyAqIG12NjQzeHhfZXRoX2dldF9zdGF0cworICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBpbnRlcmZhY2Ugc3RhdGlzdGljcy4KKyAqCisgKiBJbnB1dCA6CWRldiAtIGEgcG9pbnRlciB0byB0aGUgcmVxdWlyZWQgaW50ZXJmYWNlCisgKgorICogT3V0cHV0IDoJYSBwb2ludGVyIHRvIHRoZSBpbnRlcmZhY2UncyBzdGF0aXN0aWNzCisgKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICptdjY0M3h4X2V0aF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gJm1wLT5zdGF0czsKK30KKworLyovCisgKiBtdjY0M3h4X2V0aF9wcm9iZQorICoKKyAqIEZpcnN0IGZ1bmN0aW9uIGNhbGxlZCBhZnRlciByZWdpc3RlcmluZyB0aGUgbmV0d29yayBkZXZpY2UuCisgKiBJdCdzIHB1cnBvc2UgaXMgdG8gaW5pdGlhbGl6ZSB0aGUgZGV2aWNlIGFzIGFuIGV0aGVybmV0IGRldmljZSwKKyAqIGZpbGwgdGhlIGV0aGVybmV0IGRldmljZSBzdHJ1Y3R1cmUgd2l0aCBwb2ludGVycyAqIHRvIGZ1bmN0aW9ucywKKyAqIGFuZCBzZXQgdGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBpbnRlcmZhY2UKKyAqCisgKiBJbnB1dCA6CXN0cnVjdCBkZXZpY2UgKgorICogT3V0cHV0IDoJLUVOT01FTSBpZiBmYWlsZWQgLCAwIGlmIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludCBtdjY0M3h4X2V0aF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGRldik7CisJc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgKnBkOworCWludCBwb3J0X251bSA9IHBkZXYtPmlkOworCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdTggKnA7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGVycjsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlKSk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2X3NldF9kcnZkYXRhKGRkZXYsIGRldik7CisKKwltcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOworCUJVR19PTighcmVzKTsKKwlkZXYtPmlycSA9IHJlcy0+c3RhcnQ7CisKKwltcC0+cG9ydF9udW0gPSBwb3J0X251bTsKKworCWRldi0+b3BlbiA9IG12NjQzeHhfZXRoX29wZW47CisJZGV2LT5zdG9wID0gbXY2NDN4eF9ldGhfc3RvcDsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IG12NjQzeHhfZXRoX3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgPSBtdjY0M3h4X2V0aF9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBtdjY0M3h4X2V0aF9zZXRfbWFjX2FkZHJlc3M7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBtdjY0M3h4X2V0aF9zZXRfcnhfbW9kZTsKKworCS8qIE5vIG5lZWQgdG8gVHggVGltZW91dCAqLworCWRldi0+dHhfdGltZW91dCA9IG12NjQzeHhfZXRoX3R4X3RpbWVvdXQ7CisjaWZkZWYgTVY2NDNYWF9OQVBJCisJZGV2LT5wb2xsID0gbXY2NDN4eF9wb2xsOworCWRldi0+d2VpZ2h0ID0gNjQ7CisjZW5kaWYKKworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSAyICogSFo7CisJZGV2LT50eF9xdWV1ZV9sZW4gPSBtcC0+dHhfcmluZ19zaXplOworCWRldi0+YmFzZV9hZGRyID0gMDsKKwlkZXYtPmNoYW5nZV9tdHUgPSBtdjY0M3h4X2V0aF9jaGFuZ2VfbXR1OworCVNFVF9FVEhUT09MX09QUyhkZXYsICZtdjY0M3h4X2V0aHRvb2xfb3BzKTsKKworI2lmZGVmIE1WNjQzWFhfQ0hFQ0tTVU1fT0ZGTE9BRF9UWAorI2lmZGVmIE1BWF9TS0JfRlJBR1MKKwkvKgorCSAqIFplcm8gY29weSBjYW4gb25seSB3b3JrIGlmIHdlIHVzZSBEaXNjb3ZlcnkgSUkgbWVtb3J5LiBFbHNlLCB3ZSB3aWxsCisJICogaGF2ZSB0byBtYXAgdGhlIGJ1ZmZlcnMgdG8gSVNBIG1lbW9yeSB3aGljaCBpcyBvbmx5IDE2IE1CCisJICovCisJZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX0hXX0NTVU07CisjZW5kaWYKKyNlbmRpZgorCisJLyogQ29uZmlndXJlIHRoZSB0aW1lb3V0IHRhc2sgKi8KKwlJTklUX1dPUksoJm1wLT50eF90aW1lb3V0X3Rhc2ssCisJCQkodm9pZCAoKikodm9pZCAqKSltdjY0M3h4X2V0aF90eF90aW1lb3V0X3Rhc2ssIGRldik7CisKKwlzcGluX2xvY2tfaW5pdCgmbXAtPmxvY2spOworCisJLyogc2V0IGRlZmF1bHQgY29uZmlnIHZhbHVlcyAqLworCWV0aF9wb3J0X3VjX2FkZHJfZ2V0KGRldiwgZGV2LT5kZXZfYWRkcik7CisJbXAtPnBvcnRfY29uZmlnID0gTVY2NDNYWF9FVEhfUE9SVF9DT05GSUdfREVGQVVMVF9WQUxVRTsKKwltcC0+cG9ydF9jb25maWdfZXh0ZW5kID0gTVY2NDNYWF9FVEhfUE9SVF9DT05GSUdfRVhURU5EX0RFRkFVTFRfVkFMVUU7CisJbXAtPnBvcnRfc2RtYV9jb25maWcgPSBNVjY0M1hYX0VUSF9QT1JUX1NETUFfQ09ORklHX0RFRkFVTFRfVkFMVUU7CisJbXAtPnBvcnRfc2VyaWFsX2NvbnRyb2wgPSBNVjY0M1hYX0VUSF9QT1JUX1NFUklBTF9DT05UUk9MX0RFRkFVTFRfVkFMVUU7CisJbXAtPnJ4X3Jpbmdfc2l6ZSA9IE1WNjQzWFhfRVRIX1BPUlRfREVGQVVMVF9SRUNFSVZFX1FVRVVFX1NJWkU7CisJbXAtPnR4X3Jpbmdfc2l6ZSA9IE1WNjQzWFhfRVRIX1BPUlRfREVGQVVMVF9UUkFOU01JVF9RVUVVRV9TSVpFOworCisJcGQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAocGQpIHsKKwkJaWYgKHBkLT5tYWNfYWRkciAhPSBOVUxMKQorCQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHBkLT5tYWNfYWRkciwgNik7CisKKwkJaWYgKHBkLT5waHlfYWRkciB8fCBwZC0+Zm9yY2VfcGh5X2FkZHIpCisJCQlldGhlcm5ldF9waHlfc2V0KHBvcnRfbnVtLCBwZC0+cGh5X2FkZHIpOworCisJCWlmIChwZC0+cG9ydF9jb25maWcgfHwgcGQtPmZvcmNlX3BvcnRfY29uZmlnKQorCQkJbXAtPnBvcnRfY29uZmlnID0gcGQtPnBvcnRfY29uZmlnOworCisJCWlmIChwZC0+cG9ydF9jb25maWdfZXh0ZW5kIHx8IHBkLT5mb3JjZV9wb3J0X2NvbmZpZ19leHRlbmQpCisJCQltcC0+cG9ydF9jb25maWdfZXh0ZW5kID0gcGQtPnBvcnRfY29uZmlnX2V4dGVuZDsKKworCQlpZiAocGQtPnBvcnRfc2RtYV9jb25maWcgfHwgcGQtPmZvcmNlX3BvcnRfc2RtYV9jb25maWcpCisJCQltcC0+cG9ydF9zZG1hX2NvbmZpZyA9IHBkLT5wb3J0X3NkbWFfY29uZmlnOworCisJCWlmIChwZC0+cG9ydF9zZXJpYWxfY29udHJvbCB8fCBwZC0+Zm9yY2VfcG9ydF9zZXJpYWxfY29udHJvbCkKKwkJCW1wLT5wb3J0X3NlcmlhbF9jb250cm9sID0gcGQtPnBvcnRfc2VyaWFsX2NvbnRyb2w7CisKKwkJaWYgKHBkLT5yeF9xdWV1ZV9zaXplKQorCQkJbXAtPnJ4X3Jpbmdfc2l6ZSA9IHBkLT5yeF9xdWV1ZV9zaXplOworCisJCWlmIChwZC0+dHhfcXVldWVfc2l6ZSkKKwkJCW1wLT50eF9yaW5nX3NpemUgPSBwZC0+dHhfcXVldWVfc2l6ZTsKKworCQlpZiAocGQtPnR4X3NyYW1fc2l6ZSkgeworCQkJbXAtPnR4X3NyYW1fc2l6ZSA9IHBkLT50eF9zcmFtX3NpemU7CisJCQltcC0+dHhfc3JhbV9hZGRyID0gcGQtPnR4X3NyYW1fYWRkcjsKKwkJfQorCisJCWlmIChwZC0+cnhfc3JhbV9zaXplKSB7CisJCQltcC0+cnhfc3JhbV9zaXplID0gcGQtPnJ4X3NyYW1fc2l6ZTsKKwkJCW1wLT5yeF9zcmFtX2FkZHIgPSBwZC0+cnhfc3JhbV9hZGRyOworCQl9CisJfQorCisJZXJyID0gZXRoZXJuZXRfcGh5X2RldGVjdChwb3J0X251bSk7CisJaWYgKGVycikgeworCQlwcl9kZWJ1ZygiTVY2NDN4eCBldGhlcm5ldCBwb3J0ICVkOiAiCisJCQkJCSJObyBQSFkgZGV0ZWN0ZWQgYXQgYWRkciAlZFxuIiwKKwkJCQkJcG9ydF9udW0sIGV0aGVybmV0X3BoeV9nZXQocG9ydF9udW0pKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXAgPSBkZXYtPmRldl9hZGRyOworCXByaW50ayhLRVJOX05PVElDRQorCQkiJXM6IHBvcnQgJWQgd2l0aCBNQUMgYWRkcmVzcyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJZGV2LT5uYW1lLCBwb3J0X251bSwgcFswXSwgcFsxXSwgcFsyXSwgcFszXSwgcFs0XSwgcFs1XSk7CisKKwlpZiAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfU0cpCisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFNjYXR0ZXIgR2F0aGVyIEVuYWJsZWRcbiIsIGRldi0+bmFtZSk7CisKKwlpZiAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSVBfQ1NVTSkKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogVFggVENQL0lQIENoZWNrc3VtbWluZyBTdXBwb3J0ZWRcbiIsCisJCQkJCQkJCWRldi0+bmFtZSk7CisKKyNpZmRlZiBNVjY0M1hYX0NIRUNLU1VNX09GRkxPQURfVFgKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBSWCBUQ1AvVURQIENoZWNrc3VtIE9mZmxvYWQgT04gXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKyNpZmRlZiBNVjY0M1hYX0NPQUwKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBUWCBhbmQgUlggSW50ZXJydXB0IENvYWxlc2NpbmcgT04gXG4iLAorCQkJCQkJCQlkZXYtPm5hbWUpOworI2VuZGlmCisKKyNpZmRlZiBNVjY0M1hYX05BUEkKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBSWCBOQVBJIEVuYWJsZWQgXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKKworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG12NjQzeHhfZXRoX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGRldik7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwlmcmVlX25ldGRldihkZXYpOworCWRldl9zZXRfZHJ2ZGF0YShkZGV2LCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdjY0M3h4X2V0aF9zaGFyZWRfcHJvYmUoc3RydWN0IGRldmljZSAqZGRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRkZXYpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJcHJpbnRrKEtFUk5fTk9USUNFICJNVi02NDN4eCAxMC8xMDAvMTAwMCBFdGhlcm5ldCBEcml2ZXJcbiIpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAocmVzID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJbXY2NDN4eF9ldGhfc2hhcmVkX2Jhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsCisJCQkJCQlNVjY0M1hYX0VUSF9TSEFSRURfUkVHU19TSVpFKTsKKwlpZiAobXY2NDN4eF9ldGhfc2hhcmVkX2Jhc2UgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IG12NjQzeHhfZXRoX3NoYXJlZF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGRldikKK3sKKwlpb3VubWFwKG12NjQzeHhfZXRoX3NoYXJlZF9iYXNlKTsKKwltdjY0M3h4X2V0aF9zaGFyZWRfYmFzZSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIG12NjQzeHhfZXRoX2RyaXZlciA9IHsKKwkubmFtZSA9IE1WNjQzWFhfRVRIX05BTUUsCisJLmJ1cyA9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUgPSBtdjY0M3h4X2V0aF9wcm9iZSwKKwkucmVtb3ZlID0gbXY2NDN4eF9ldGhfcmVtb3ZlLAorfTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIG12NjQzeHhfZXRoX3NoYXJlZF9kcml2ZXIgPSB7CisJLm5hbWUgPSBNVjY0M1hYX0VUSF9TSEFSRURfTkFNRSwKKwkuYnVzID0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZSA9IG12NjQzeHhfZXRoX3NoYXJlZF9wcm9iZSwKKwkucmVtb3ZlID0gbXY2NDN4eF9ldGhfc2hhcmVkX3JlbW92ZSwKK307CisKKy8qCisgKiBtdjY0M3h4X2luaXRfbW9kdWxlCisgKgorICogUmVnaXN0ZXJzIHRoZSBuZXR3b3JrIGRyaXZlcnMgaW50byB0aGUgTGludXgga2VybmVsCisgKgorICogSW5wdXQgOglOL0EKKyAqCisgKiBPdXRwdXQgOglOL0EKKyAqLworc3RhdGljIGludCBfX2luaXQgbXY2NDN4eF9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByYzsKKworCXJjID0gZHJpdmVyX3JlZ2lzdGVyKCZtdjY0M3h4X2V0aF9zaGFyZWRfZHJpdmVyKTsKKwlpZiAoIXJjKSB7CisJCXJjID0gZHJpdmVyX3JlZ2lzdGVyKCZtdjY0M3h4X2V0aF9kcml2ZXIpOworCQlpZiAocmMpCisJCQlkcml2ZXJfdW5yZWdpc3RlcigmbXY2NDN4eF9ldGhfc2hhcmVkX2RyaXZlcik7CisJfQorCXJldHVybiByYzsKK30KKworLyoKKyAqIG12NjQzeHhfY2xlYW51cF9tb2R1bGUKKyAqCisgKiBSZWdpc3RlcnMgdGhlIG5ldHdvcmsgZHJpdmVycyBpbnRvIHRoZSBMaW51eCBrZXJuZWwKKyAqCisgKiBJbnB1dCA6CU4vQQorICoKKyAqIE91dHB1dCA6CU4vQQorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgbXY2NDN4eF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZtdjY0M3h4X2V0aF9kcml2ZXIpOworCWRyaXZlcl91bnJlZ2lzdGVyKCZtdjY0M3h4X2V0aF9zaGFyZWRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobXY2NDN4eF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChtdjY0M3h4X2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigJIlJhYmVlaCBLaG91cnksIEFzc2FmIEhvZmZtYW4sIE1hdHRoZXcgRGhhcm0sIE1hbmlzaCBMYWNod2FuaSIKKwkJIiBhbmQgRGFsZSBGYXJuc3dvcnRoIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkV0aGVybmV0IGRyaXZlciBmb3IgTWFydmVsbCBNVjY0M1hYIik7CisKKy8qCisgKiBUaGUgc2Vjb25kIHBhcnQgaXMgdGhlIGxvdyBsZXZlbCBkcml2ZXIgb2YgdGhlIGdpZ0UgZXRoZXJuZXQgcG9ydHMuCisgKi8KKworLyoKKyAqIE1hcnZlbGwncyBHaWdhYml0IEV0aGVybmV0IGNvbnRyb2xsZXIgbG93IGxldmVsIGRyaXZlcgorICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyBmaWxlIGludHJvZHVjZSBsb3cgbGV2ZWwgQVBJIHRvIE1hcnZlbGwncyBHaWdhYml0IEV0aGVybmV0CisgKgkJY29udHJvbGxlci4gVGhpcyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgZHJpdmVyIEFQSSBjb250cm9scworICoJCTEpIE9wZXJhdGlvbnMgKGkuZS4gcG9ydCBpbml0LCBzdGFydCwgcmVzZXQgZXRjJykuCisgKgkJMikgRGF0YSBmbG93IChpLmUuIHBvcnQgc2VuZCwgcmVjZWl2ZSBldGMnKS4KKyAqCQlFYWNoIEdpZ2FiaXQgRXRoZXJuZXQgcG9ydCBpcyBjb250cm9sbGVkIHZpYQorICoJCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUuCisgKgkJVGhpcyBzdHJ1Y3QgaW5jbHVkZXMgdXNlciBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFzIHdlbGwgYXMKKyAqCQlkcml2ZXIgaW50ZXJuYWwgZGF0YSBuZWVkZWQgZm9yIGl0cyBvcGVyYXRpb25zLgorICoKKyAqCQlTdXBwb3J0ZWQgRmVhdHVyZXM6CisgKgkJLSBUaGlzIGxvdyBsZXZlbCBkcml2ZXIgaXMgT1MgaW5kZXBlbmRlbnQuIEFsbG9jYXRpbmcgbWVtb3J5IGZvcgorICoJCSAgdGhlIGRlc2NyaXB0b3IgcmluZ3MgYW5kIGJ1ZmZlcnMgYXJlIG5vdCB3aXRoaW4gdGhlIHNjb3BlIG9mCisgKgkJICB0aGlzIGRyaXZlci4KKyAqCQktIFRoZSB1c2VyIGlzIGZyZWUgZnJvbSBSeC9UeCBxdWV1ZSBtYW5hZ2luZy4KKyAqCQktIFRoaXMgbG93IGxldmVsIGRyaXZlciBpbnRyb2R1Y2UgZnVuY3Rpb25hbGl0eSBBUEkgdGhhdCBlbmFibGUKKyAqCQkgIHRoZSB0byBvcGVyYXRlIE1hcnZlbGwncyBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgaW4gYQorICoJCSAgY29udmVuaWVudCB3YXkuCisgKgkJLSBTaW1wbGUgR2lnYWJpdCBFdGhlcm5ldCBwb3J0IG9wZXJhdGlvbiBBUEkuCisgKgkJLSBTaW1wbGUgR2lnYWJpdCBFdGhlcm5ldCBwb3J0IGRhdGEgZmxvdyBBUEkuCisgKgkJLSBEYXRhIGZsb3cgYW5kIG9wZXJhdGlvbiBBUEkgc3VwcG9ydCBwZXIgcXVldWUgZnVuY3Rpb25hbGl0eS4KKyAqCQktIFN1cHBvcnQgY2FjaGVkIGRlc2NyaXB0b3JzIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuCisgKgkJLSBFbmFibGUgYWNjZXNzIHRvIGFsbCBmb3VyIERSQU0gYmFua3MgYW5kIGludGVybmFsIFNSQU0gbWVtb3J5CisgKgkJICBzcGFjZXMuCisgKgkJLSBQSFkgYWNjZXNzIGFuZCBjb250cm9sIEFQSS4KKyAqCQktIFBvcnQgY29udHJvbCByZWdpc3RlciBjb25maWd1cmF0aW9uIEFQSS4KKyAqCQktIEZ1bGwgY29udHJvbCBvdmVyIFVuaWNhc3QgYW5kIE11bHRpY2FzdCBNQUMgY29uZmlndXJhdGlvbnMuCisgKgorICoJCU9wZXJhdGlvbiBmbG93OgorICoKKyAqCQlJbml0aWFsaXphdGlvbiBwaGFzZQorICoJCVRoaXMgcGhhc2UgY29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSB0aGUKKyAqCQltdjY0M3h4X3ByaXZhdGUgc3RydWN0LgorICoJCVVzZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHBvcnQgY29uZmlndXJhdGlvbiBoYXMgdG8gYmUgc2V0CisgKgkJcHJpb3IgdG8gY2FsbGluZyB0aGUgcG9ydCBpbml0aWFsaXphdGlvbiByb3V0aW5lLgorICoKKyAqCQlJbiB0aGlzIHBoYXNlIGFueSBwb3J0IFR4L1J4IGFjdGl2aXR5IGlzIGhhbHRlZCwgTUlCIGNvdW50ZXJzCisgKgkJYXJlIGNsZWFyZWQsIFBIWSBhZGRyZXNzIGlzIHNldCBhY2NvcmRpbmcgdG8gdXNlciBwYXJhbWV0ZXIgYW5kCisgKgkJYWNjZXNzIHRvIERSQU0gYW5kIGludGVybmFsIFNSQU0gbWVtb3J5IHNwYWNlcy4KKyAqCisgKgkJRHJpdmVyIHJpbmcgaW5pdGlhbGl6YXRpb24KKyAqCQlBbGxvY2F0aW5nIG1lbW9yeSBmb3IgdGhlIGRlc2NyaXB0b3IgcmluZ3MgYW5kIGJ1ZmZlcnMgaXMgbm90CisgKgkJd2l0aGluIHRoZSBzY29wZSBvZiB0aGlzIGRyaXZlci4gVGh1cywgdGhlIHVzZXIgaXMgcmVxdWlyZWQgdG8KKyAqCQlhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBkZXNjcmlwdG9ycyByaW5nIGFuZCBidWZmZXJzLiBUaG9zZQorICoJCW1lbW9yeSBwYXJhbWV0ZXJzIGFyZSB1c2VkIGJ5IHRoZSBSeCBhbmQgVHggcmluZyBpbml0aWFsaXphdGlvbgorICoJCXJvdXRpbmVzIGluIG9yZGVyIHRvIGN1cnZlIHRoZSBkZXNjcmlwdG9yIGxpbmtlZCBsaXN0IGluIGEgZm9ybQorICoJCW9mIGEgcmluZy4KKyAqCQlOb3RlOiBQYXkgc3BlY2lhbCBhdHRlbnRpb24gdG8gYWxpZ25tZW50IGlzc3VlcyB3aGVuIHVzaW5nCisgKgkJY2FjaGVkIGRlc2NyaXB0b3JzL2J1ZmZlcnMuIEluIHRoaXMgcGhhc2UgdGhlIGRyaXZlciBzdG9yZQorICoJCWluZm9ybWF0aW9uIGluIHRoZSBtdjY0M3h4X3ByaXZhdGUgc3RydWN0IHJlZ2FyZGluZyBlYWNoIHF1ZXVlCisgKgkJcmluZy4KKyAqCisgKgkJRHJpdmVyIHN0YXJ0CisgKgkJVGhpcyBwaGFzZSBwcmVwYXJlcyB0aGUgRXRoZXJuZXQgcG9ydCBmb3IgUnggYW5kIFR4IGFjdGl2aXR5LgorICoJCUl0IHVzZXMgdGhlIGluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgbXY2NDN4eF9wcml2YXRlIHN0cnVjdCB0bworICoJCWluaXRpYWxpemUgdGhlIHZhcmlvdXMgcG9ydCByZWdpc3RlcnMuCisgKgorICoJCURhdGEgZmxvdzoKKyAqCQlBbGwgcGFja2V0IHJlZmVyZW5jZXMgdG8vZnJvbSB0aGUgZHJpdmVyIGFyZSBkb25lIHVzaW5nCisgKgkJc3RydWN0IHBrdF9pbmZvLgorICoJCVRoaXMgc3RydWN0IGlzIGEgdW5pZmllZCBzdHJ1Y3QgdXNlZCB3aXRoIFJ4IGFuZCBUeCBvcGVyYXRpb25zLgorICoJCVRoaXMgd2F5IHRoZSB1c2VyIGlzIG5vdCByZXF1aXJlZCB0byBiZSBmYW1pbGlhciB3aXRoIG5laXRoZXIKKyAqCQlUeCBub3IgUnggZGVzY3JpcHRvcnMgc3RydWN0dXJlcy4KKyAqCQlUaGUgZHJpdmVyJ3MgZGVzY3JpcHRvcnMgcmluZ3MgYXJlIG1hbmFnZW1lbnQgYnkgaW5kZXhlcy4KKyAqCQlUaG9zZSBpbmRleGVzIGNvbnRyb2xzIHRoZSByaW5nIHJlc291cmNlcyBhbmQgdXNlZCB0byBpbmRpY2F0ZQorICoJCWEgU1cgcmVzb3VyY2UgZXJyb3I6CisgKgkJJ2N1cnJlbnQnCisgKgkJVGhpcyBpbmRleCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYXZhaWxhYmxlIHJlc291cmNlIGZvciB1c2UuIEZvcgorICoJCWV4YW1wbGUgaW4gUnggcHJvY2VzcyB0aGlzIGluZGV4IHdpbGwgcG9pbnQgdG8gdGhlIGRlc2NyaXB0b3IKKyAqCQl0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSB1c2VyIHVwb24gY2FsbGluZyB0aGUgcmVjZWl2ZQorICoJCXJvdXRpbmUuICBJbiBUeCBwcm9jZXNzLCB0aGlzIGluZGV4IHdpbGwgcG9pbnQgdG8gdGhlIGRlc2NyaXB0b3IKKyAqCQl0aGF0IHdpbGwgYmUgYXNzaWduZWQgd2l0aCB0aGUgdXNlciBwYWNrZXQgaW5mbyBhbmQgdHJhbnNtaXR0ZWQuCisgKgkJJ3VzZWQnCisgKgkJVGhpcyBpbmRleCBwb2ludHMgdG8gdGhlIGRlc2NyaXB0b3IgdGhhdCBuZWVkIHRvIHJlc3RvcmUgaXRzCisgKgkJcmVzb3VyY2VzLiBGb3IgZXhhbXBsZSBpbiBSeCBwcm9jZXNzLCB1c2luZyB0aGUgUnggYnVmZmVyIHJldHVybgorICoJCUFQSSB3aWxsIGF0dGFjaCB0aGUgYnVmZmVyIHJldHVybmVkIGluIHBhY2tldCBpbmZvIHRvIHRoZQorICoJCWRlc2NyaXB0b3IgcG9pbnRlZCBieSAndXNlZCcuIEluIFR4IHByb2Nlc3MsIHVzaW5nIHRoZSBUeAorICoJCWRlc2NyaXB0b3IgcmV0dXJuIHdpbGwgbWVyZWx5IHJldHVybiB0aGUgdXNlciBwYWNrZXQgaW5mbyB3aXRoCisgKgkJdGhlIGNvbW1hbmQgc3RhdHVzIG9mIHRoZSB0cmFuc21pdHRlZCBidWZmZXIgcG9pbnRlZCBieSB0aGUKKyAqCQkndXNlZCcgaW5kZXguIE5ldmVydGhlbGVzcywgaXQgaXMgZXNzZW50aWFsIHRvIHVzZSB0aGlzIHJvdXRpbmUKKyAqCQl0byB1cGRhdGUgdGhlICd1c2VkJyBpbmRleC4KKyAqCQknZmlyc3QnCisgKgkJVGhpcyBpbmRleCBzdXBwb3J0cyBUeCBTY2F0dGVyLUdhdGhlci4gSXQgcG9pbnRzIHRvIHRoZSBmaXJzdAorICoJCWRlc2NyaXB0b3Igb2YgYSBwYWNrZXQgYXNzZW1ibGVkIG9mIG11bHRpcGxlIGJ1ZmZlcnMuIEZvcgorICoJCWV4YW1wbGUgd2hlbiBpbiBtaWRkbGUgb2YgU3VjaCBwYWNrZXQgd2UgaGF2ZSBhIFR4IHJlc291cmNlCisgKgkJZXJyb3IgdGhlICdjdXJyJyBpbmRleCBnZXQgdGhlIHZhbHVlIG9mICdmaXJzdCcgdG8gaW5kaWNhdGUKKyAqCQl0aGF0IHRoZSByaW5nIHJldHVybmVkIHRvIGl0cyBzdGF0ZSBiZWZvcmUgdHJ5aW5nIHRvIHRyYW5zbWl0CisgKgkJdGhpcyBwYWNrZXQuCisgKgorICoJCVJlY2VpdmUgb3BlcmF0aW9uOgorICoJCVRoZSBldGhfcG9ydF9yZWNlaXZlIEFQSSBzZXQgdGhlIHBhY2tldCBpbmZvcm1hdGlvbiBzdHJ1Y3QsCisgKgkJcGFzc2VkIGJ5IHRoZSBjYWxsZXIsIHdpdGggcmVjZWl2ZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUKKyAqCQknY3VycmVudCcgU0RNQSBkZXNjcmlwdG9yLgorICoJCUl0IGlzIHRoZSB1c2VyIHJlc3BvbnNpYmlsaXR5IHRvIHJldHVybiB0aGlzIHJlc291cmNlIGJhY2sKKyAqCQl0byB0aGUgUnggZGVzY3JpcHRvciByaW5nIHRvIGVuYWJsZSB0aGUgcmV1c2Ugb2YgdGhpcyBzb3VyY2UuCisgKgkJUmV0dXJuIFJ4IHJlc291cmNlIGlzIGRvbmUgdXNpbmcgdGhlIGV0aF9yeF9yZXR1cm5fYnVmZiBBUEkuCisgKgorICoJCVRyYW5zbWl0IG9wZXJhdGlvbjoKKyAqCQlUaGUgZXRoX3BvcnRfc2VuZCBBUEkgc3VwcG9ydHMgU2NhdHRlci1HYXRoZXIgd2hpY2ggZW5hYmxlcyB0bworICoJCXNlbmQgYSBwYWNrZXQgc3Bhbm5lZCBvdmVyIG11bHRpcGxlIGJ1ZmZlcnMuIFRoaXMgbWVhbnMgdGhhdAorICoJCWZvciBlYWNoIHBhY2tldCBpbmZvIHN0cnVjdHVyZSBnaXZlbiBieSB0aGUgdXNlciBhbmQgcHV0IGludG8KKyAqCQl0aGUgVHggZGVzY3JpcHRvcnMgcmluZywgd2lsbCBiZSB0cmFuc21pdHRlZCBvbmx5IGlmIHRoZSAnTEFTVCcKKyAqCQliaXQgd2lsbCBiZSBzZXQgaW4gdGhlIHBhY2tldCBpbmZvIGNvbW1hbmQgc3RhdHVzIGZpZWxkLiBUaGlzCisgKgkJQVBJIGFsc28gY29uc2lkZXIgcmVzdHJpY3Rpb24gcmVnYXJkaW5nIGJ1ZmZlciBhbGlnbm1lbnRzIGFuZAorICoJCXNpemVzLgorICoJCVRoZSB1c2VyIG11c3QgcmV0dXJuIGEgVHggcmVzb3VyY2UgYWZ0ZXIgZW5zdXJpbmcgdGhlIGJ1ZmZlcgorICoJCWhhcyBiZWVuIHRyYW5zbWl0dGVkIHRvIGVuYWJsZSB0aGUgVHggcmluZyBpbmRleGVzIHRvIHVwZGF0ZS4KKyAqCisgKgkJQk9BUkQgTEFZT1VUCisgKgkJVGhpcyBkZXZpY2UgaXMgb24tYm9hcmQuICBObyBqdW1wZXIgZGlhZ3JhbSBpcyBuZWNlc3NhcnkuCisgKgorICoJCUVYVEVSTkFMIElOVEVSRkFDRQorICoKKyAqCVByaW9yIHRvIGNhbGxpbmcgdGhlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZXRoX3BvcnRfaW5pdCgpIHRoZSB1c2VyCisgKgltdXN0IHNldCB0aGUgZm9sbG93aW5nIGZpZWxkcyB1bmRlciBtdjY0M3h4X3ByaXZhdGUgc3RydWN0OgorICoJcG9ydF9udW0JCVVzZXIgRXRoZXJuZXQgcG9ydCBudW1iZXIuCisgKglwb3J0X21hY19hZGRyWzZdCVVzZXIgZGVmaW5lZCBwb3J0IE1BQyBhZGRyZXNzLgorICoJcG9ydF9jb25maWcJCVVzZXIgcG9ydCBjb25maWd1cmF0aW9uIHZhbHVlLgorICoJcG9ydF9jb25maWdfZXh0ZW5kCVVzZXIgcG9ydCBjb25maWcgZXh0ZW5kIHZhbHVlLgorICoJcG9ydF9zZG1hX2NvbmZpZwlVc2VyIHBvcnQgU0RNQSBjb25maWcgdmFsdWUuCisgKglwb3J0X3NlcmlhbF9jb250cm9sCVVzZXIgcG9ydCBzZXJpYWwgY29udHJvbCB2YWx1ZS4KKyAqCisgKgkJVGhpcyBkcml2ZXIgZGF0YSBmbG93IGlzIGRvbmUgdXNpbmcgdGhlIHN0cnVjdCBwa3RfaW5mbyB3aGljaAorICoJCWlzIGEgdW5pZmllZCBzdHJ1Y3QgZm9yIFJ4IGFuZCBUeCBvcGVyYXRpb25zOgorICoKKyAqCQlieXRlX2NudAlUeC9SeCBkZXNjcmlwdG9yIGJ1ZmZlciBieXRlIGNvdW50LgorICoJCWw0aV9jaGsJCUNQVSBwcm92aWRlZCBUQ1AgQ2hlY2tzdW0uIEZvciBUeCBvcGVyYXRpb24KKyAqCQkJCW9ubHkuCisgKgkJY21kX3N0cwkJVHgvUnggZGVzY3JpcHRvciBjb21tYW5kIHN0YXR1cy4KKyAqCQlidWZfcHRyCQlUeC9SeCBkZXNjcmlwdG9yIGJ1ZmZlciBwb2ludGVyLgorICoJCXJldHVybl9pbmZvCVR4L1J4IHVzZXIgcmVzb3VyY2UgcmV0dXJuIGluZm9ybWF0aW9uLgorICovCisKKy8qIGRlZmluZXMgKi8KKy8qIFNETUEgY29tbWFuZCBtYWNyb3MgKi8KKyNkZWZpbmUgRVRIX0VOQUJMRV9UWF9RVUVVRShldGhfcG9ydCkgXAorCW12X3dyaXRlKE1WNjQzWFhfRVRIX1RSQU5TTUlUX1FVRVVFX0NPTU1BTkRfUkVHKGV0aF9wb3J0KSwgMSkKKworLyogbG9jYWxzICovCisKKy8qIFBIWSByb3V0aW5lcyAqLworc3RhdGljIGludCBldGhlcm5ldF9waHlfZ2V0KHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0pOworc3RhdGljIHZvaWQgZXRoZXJuZXRfcGh5X3NldCh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtLCBpbnQgcGh5X2FkZHIpOworCisvKiBFdGhlcm5ldCBQb3J0IHJvdXRpbmVzICovCitzdGF0aWMgaW50IGV0aF9wb3J0X3VjX2FkZHIodW5zaWduZWQgaW50IGV0aF9wb3J0X251bSwgdW5zaWduZWQgY2hhciB1Y19uaWJibGUsCisJCQkJCQkJCWludCBvcHRpb24pOworCisvKgorICogZXRoX3BvcnRfaW5pdCAtIEluaXRpYWxpemUgdGhlIEV0aGVybmV0IHBvcnQgZHJpdmVyCisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIHRoZSBldGhlcm5ldCBwb3J0IHRvIHN0YXJ0IGl0cyBhY3Rpdml0eToKKyAqCTEpIENvbXBsZXRlcyB0aGUgZXRoZXJuZXQgcG9ydCBkcml2ZXIgc3RydWN0IGluaXRpYWxpemF0aW9uIHRvd2FyZCBwb3J0CisgKgkJc3RhcnQgcm91dGluZS4KKyAqCTIpIFJlc2V0cyB0aGUgZGV2aWNlIHRvIGEgcXVpZXNjZW50IHN0YXRlIGluIGNhc2Ugb2Ygd2FybSByZWJvb3QuCisgKgkzKSBFbmFibGUgU0RNQSBhY2Nlc3MgdG8gYWxsIGZvdXIgRFJBTSBiYW5rcyBhcyB3ZWxsIGFzIGludGVybmFsIFNSQU0uCisgKgk0KSBDbGVhbiBNQUMgdGFibGVzLiBUaGUgcmVzZXQgc3RhdHVzIG9mIHRob3NlIHRhYmxlcyBpcyB1bmtub3duLgorICoJNSkgU2V0IFBIWSBhZGRyZXNzLgorICoJTm90ZTogQ2FsbCB0aGlzIHJvdXRpbmUgcHJpb3IgdG8gZXRoX3BvcnRfc3RhcnQgcm91dGluZSBhbmQgYWZ0ZXIKKyAqCXNldHRpbmcgdXNlciB2YWx1ZXMgaW4gdGhlIHVzZXIgZmllbGRzIG9mIEV0aGVybmV0IHBvcnQgY29udHJvbAorICoJc3RydWN0LgorICoKKyAqIElOUFVUOgorICoJc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAJRXRoZXJuZXQgcG9ydCBjb250cm9sIHN0cnVjdAorICoKKyAqIE9VVFBVVDoKKyAqCVNlZSBkZXNjcmlwdGlvbi4KKyAqCisgKiBSRVRVUk46CisgKglOb25lLgorICovCitzdGF0aWMgdm9pZCBldGhfcG9ydF9pbml0KHN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wKQoreworCW1wLT5wb3J0X3J4X3F1ZXVlX2NvbW1hbmQgPSAwOworCW1wLT5wb3J0X3R4X3F1ZXVlX2NvbW1hbmQgPSAwOworCisJbXAtPnJ4X3Jlc291cmNlX2VyciA9IDA7CisJbXAtPnR4X3Jlc291cmNlX2VyciA9IDA7CisKKwlldGhfcG9ydF9yZXNldChtcC0+cG9ydF9udW0pOworCisJZXRoX3BvcnRfaW5pdF9tYWNfdGFibGVzKG1wLT5wb3J0X251bSk7CisKKwlldGhlcm5ldF9waHlfcmVzZXQobXAtPnBvcnRfbnVtKTsKK30KKworLyoKKyAqIGV0aF9wb3J0X3N0YXJ0IC0gU3RhcnQgdGhlIEV0aGVybmV0IHBvcnQgYWN0aXZpdHkuCisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIHJvdXRpbmUgcHJlcGFyZXMgdGhlIEV0aGVybmV0IHBvcnQgZm9yIFJ4IGFuZCBUeCBhY3Rpdml0eToKKyAqCSAxLiBJbml0aWFsaXplIFR4IGFuZCBSeCBDdXJyZW50IERlc2NyaXB0b3IgUG9pbnRlciBmb3IgZWFjaCBxdWV1ZSB0aGF0CisgKgkgICAgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYSBkZXNjcmlwdG9yJ3MgcmluZyAodXNpbmcKKyAqCSAgICBldGhlcl9pbml0X3R4X2Rlc2NfcmluZyBmb3IgVHggYW5kIGV0aGVyX2luaXRfcnhfZGVzY19yaW5nIGZvciBSeCkKKyAqCSAyLiBJbml0aWFsaXplIGFuZCBlbmFibGUgdGhlIEV0aGVybmV0IGNvbmZpZ3VyYXRpb24gcG9ydCBieSB3cml0aW5nIHRvCisgKgkgICAgdGhlIHBvcnQncyBjb25maWd1cmF0aW9uIGFuZCBjb21tYW5kIHJlZ2lzdGVycy4KKyAqCSAzLiBJbml0aWFsaXplIGFuZCBlbmFibGUgdGhlIFNETUEgYnkgd3JpdGluZyB0byB0aGUgU0RNQSdzCisgKgkgICAgY29uZmlndXJhdGlvbiBhbmQgY29tbWFuZCByZWdpc3RlcnMuICBBZnRlciBjb21wbGV0aW5nIHRoZXNlIHN0ZXBzLAorICoJICAgIHRoZSBldGhlcm5ldCBwb3J0IFNETUEgY2FuIHN0YXJ0cyB0byBwZXJmb3JtIFJ4IGFuZCBUeCBhY3Rpdml0aWVzLgorICoKKyAqCU5vdGU6IEVhY2ggUnggYW5kIFR4IHF1ZXVlIGRlc2NyaXB0b3IncyBsaXN0IG11c3QgYmUgaW5pdGlhbGl6ZWQgcHJpb3IKKyAqCXRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAodXNlIGV0aGVyX2luaXRfdHhfZGVzY19yaW5nIGZvciBUeCBxdWV1ZXMKKyAqCWFuZCBldGhlcl9pbml0X3J4X2Rlc2NfcmluZyBmb3IgUnggcXVldWVzKS4KKyAqCisgKiBJTlBVVDoKKyAqCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wCUV0aGVybmV0IHBvcnQgY29udHJvbCBzdHJ1Y3QKKyAqCisgKiBPVVRQVVQ6CisgKglFdGhlcm5ldCBwb3J0IGlzIHJlYWR5IHRvIHJlY2VpdmUgYW5kIHRyYW5zbWl0LgorICoKKyAqIFJFVFVSTjoKKyAqCU5vbmUuCisgKi8KK3N0YXRpYyB2b2lkIGV0aF9wb3J0X3N0YXJ0KHN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wKQoreworCXVuc2lnbmVkIGludCBwb3J0X251bSA9IG1wLT5wb3J0X251bTsKKwlpbnQgdHhfY3Vycl9kZXNjLCByeF9jdXJyX2Rlc2M7CisKKwkvKiBBc3NpZ25tZW50IG9mIFR4IENUUlAgb2YgZ2l2ZW4gcXVldWUgKi8KKwl0eF9jdXJyX2Rlc2MgPSBtcC0+dHhfY3Vycl9kZXNjX3E7CisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfVFhfQ1VSUkVOVF9RVUVVRV9ERVNDX1BUUl8wKHBvcnRfbnVtKSwKKwkJKHUzMikoKHN0cnVjdCBldGhfdHhfZGVzYyAqKW1wLT50eF9kZXNjX2RtYSArIHR4X2N1cnJfZGVzYykpOworCisJLyogQXNzaWdubWVudCBvZiBSeCBDUkRQIG9mIGdpdmVuIHF1ZXVlICovCisJcnhfY3Vycl9kZXNjID0gbXAtPnJ4X2N1cnJfZGVzY19xOworCW12X3dyaXRlKE1WNjQzWFhfRVRIX1JYX0NVUlJFTlRfUVVFVUVfREVTQ19QVFJfMChwb3J0X251bSksCisJCSh1MzIpKChzdHJ1Y3QgZXRoX3J4X2Rlc2MgKiltcC0+cnhfZGVzY19kbWEgKyByeF9jdXJyX2Rlc2MpKTsKKworCS8qIEFkZCB0aGUgYXNzaWduZWQgRXRoZXJuZXQgYWRkcmVzcyB0byB0aGUgcG9ydCdzIGFkZHJlc3MgdGFibGUgKi8KKwlldGhfcG9ydF91Y19hZGRyX3NldChwb3J0X251bSwgbXAtPnBvcnRfbWFjX2FkZHIpOworCisJLyogQXNzaWduIHBvcnQgY29uZmlndXJhdGlvbiBhbmQgY29tbWFuZC4gKi8KKwltdl93cml0ZShNVjY0M1hYX0VUSF9QT1JUX0NPTkZJR19SRUcocG9ydF9udW0pLCBtcC0+cG9ydF9jb25maWcpOworCisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfUE9SVF9DT05GSUdfRVhURU5EX1JFRyhwb3J0X251bSksCisJCQkJCQltcC0+cG9ydF9jb25maWdfZXh0ZW5kKTsKKworCisJLyogSW5jcmVhc2UgdGhlIFJ4IHNpZGUgYnVmZmVyIHNpemUgaWYgc3VwcG9ydGluZyBHaWdFICovCisJaWYgKG1wLT5wb3J0X3NlcmlhbF9jb250cm9sICYgTVY2NDNYWF9FVEhfU0VUX0dNSUlfU1BFRURfVE9fMTAwMCkKKwkJbXZfd3JpdGUoTVY2NDNYWF9FVEhfUE9SVF9TRVJJQUxfQ09OVFJPTF9SRUcocG9ydF9udW0pLAorCQkJKG1wLT5wb3J0X3NlcmlhbF9jb250cm9sICYgMHhmZmYxZmZmZikgfCAoMHg1IDw8IDE3KSk7CisJZWxzZQorCQltdl93cml0ZShNVjY0M1hYX0VUSF9QT1JUX1NFUklBTF9DT05UUk9MX1JFRyhwb3J0X251bSksCisJCQkJCQltcC0+cG9ydF9zZXJpYWxfY29udHJvbCk7CisKKwltdl93cml0ZShNVjY0M1hYX0VUSF9QT1JUX1NFUklBTF9DT05UUk9MX1JFRyhwb3J0X251bSksCisJCW12X3JlYWQoTVY2NDNYWF9FVEhfUE9SVF9TRVJJQUxfQ09OVFJPTF9SRUcocG9ydF9udW0pKSB8CisJCQkJCQlNVjY0M1hYX0VUSF9TRVJJQUxfUE9SVF9FTkFCTEUpOworCisJLyogQXNzaWduIHBvcnQgU0RNQSBjb25maWd1cmF0aW9uICovCisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfU0RNQV9DT05GSUdfUkVHKHBvcnRfbnVtKSwKKwkJCQkJCQltcC0+cG9ydF9zZG1hX2NvbmZpZyk7CisKKwkvKiBFbmFibGUgcG9ydCBSeC4gKi8KKwltdl93cml0ZShNVjY0M1hYX0VUSF9SRUNFSVZFX1FVRVVFX0NPTU1BTkRfUkVHKHBvcnRfbnVtKSwKKwkJCQkJCW1wLT5wb3J0X3J4X3F1ZXVlX2NvbW1hbmQpOworfQorCisvKgorICogZXRoX3BvcnRfdWNfYWRkcl9zZXQgLSBUaGlzIGZ1bmN0aW9uIFNldCB0aGUgcG9ydCBVbmljYXN0IGFkZHJlc3MuCisgKgorICogREVTQ1JJUFRJT046CisgKgkJVGhpcyBmdW5jdGlvbiBTZXQgdGhlIHBvcnQgRXRoZXJuZXQgTUFDIGFkZHJlc3MuCisgKgorICogSU5QVVQ6CisgKgl1bnNpZ25lZCBpbnQJZXRoX3BvcnRfbnVtCVBvcnQgbnVtYmVyLgorICoJY2hhciAqCQlwX2FkZHIJCUFkZHJlc3MgdG8gYmUgc2V0CisgKgorICogT1VUUFVUOgorICoJU2V0IE1BQyBhZGRyZXNzIGxvdyBhbmQgaGlnaCByZWdpc3RlcnMuIGFsc28gY2FsbHMgZXRoX3BvcnRfdWNfYWRkcigpCisgKglUbyBzZXQgdGhlIHVuaWNhc3QgdGFibGUgd2l0aCB0aGUgcHJvcGVyIGluZm9ybWF0aW9uLgorICoKKyAqIFJFVFVSTjoKKyAqCU4vQS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGV0aF9wb3J0X3VjX2FkZHJfc2V0KHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0sCisJCQkJCQkJdW5zaWduZWQgY2hhciAqcF9hZGRyKQoreworCXVuc2lnbmVkIGludCBtYWNfaDsKKwl1bnNpZ25lZCBpbnQgbWFjX2w7CisKKwltYWNfbCA9IChwX2FkZHJbNF0gPDwgOCkgfCAocF9hZGRyWzVdKTsKKwltYWNfaCA9IChwX2FkZHJbMF0gPDwgMjQpIHwgKHBfYWRkclsxXSA8PCAxNikgfCAocF9hZGRyWzJdIDw8IDgpIHwKKwkJCQkJCQkocF9hZGRyWzNdIDw8IDApOworCisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfTUFDX0FERFJfTE9XKGV0aF9wb3J0X251bSksIG1hY19sKTsKKwltdl93cml0ZShNVjY0M1hYX0VUSF9NQUNfQUREUl9ISUdIKGV0aF9wb3J0X251bSksIG1hY19oKTsKKworCS8qIEFjY2VwdCBmcmFtZXMgb2YgdGhpcyBhZGRyZXNzICovCisJZXRoX3BvcnRfdWNfYWRkcihldGhfcG9ydF9udW0sIHBfYWRkcls1XSwgQUNDRVBUX01BQ19BRERSKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIGV0aF9wb3J0X3VjX2FkZHJfZ2V0IC0gVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHBvcnQgVW5pY2FzdCBhZGRyZXNzCisgKiAoTUFDIGFkZHJlc3MpIGZyb20gdGhlIGV0aGVybmV0IGh3IHJlZ2lzdGVycy4KKyAqCisgKiBERVNDUklQVElPTjoKKyAqCQlUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyB0aGUgcG9ydCBFdGhlcm5ldCBNQUMgYWRkcmVzcy4KKyAqCisgKiBJTlBVVDoKKyAqCXVuc2lnbmVkIGludAlldGhfcG9ydF9udW0JUG9ydCBudW1iZXIuCisgKgljaGFyCQkqTWFjQWRkcglwb2ludGVyIHdoZXJlIHRoZSBNQUMgYWRkcmVzcyBpcyBzdG9yZWQKKyAqCisgKiBPVVRQVVQ6CisgKglDb3B5IHRoZSBNQUMgYWRkcmVzcyB0byB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSBNYWNBZGRyCisgKgorICogUkVUVVJOOgorICoJTi9BLgorICoKKyAqLworc3RhdGljIHZvaWQgZXRoX3BvcnRfdWNfYWRkcl9nZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciAqcF9hZGRyKQoreworCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgbWFjX2g7CisJdW5zaWduZWQgaW50IG1hY19sOworCisJbWFjX2ggPSBtdl9yZWFkKE1WNjQzWFhfRVRIX01BQ19BRERSX0hJR0gobXAtPnBvcnRfbnVtKSk7CisJbWFjX2wgPSBtdl9yZWFkKE1WNjQzWFhfRVRIX01BQ19BRERSX0xPVyhtcC0+cG9ydF9udW0pKTsKKworCXBfYWRkclswXSA9IChtYWNfaCA+PiAyNCkgJiAweGZmOworCXBfYWRkclsxXSA9IChtYWNfaCA+PiAxNikgJiAweGZmOworCXBfYWRkclsyXSA9IChtYWNfaCA+PiA4KSAmIDB4ZmY7CisJcF9hZGRyWzNdID0gbWFjX2ggJiAweGZmOworCXBfYWRkcls0XSA9IChtYWNfbCA+PiA4KSAmIDB4ZmY7CisJcF9hZGRyWzVdID0gbWFjX2wgJiAweGZmOworfQorCisvKgorICogZXRoX3BvcnRfdWNfYWRkciAtIFRoaXMgZnVuY3Rpb24gU2V0IHRoZSBwb3J0IHVuaWNhc3QgYWRkcmVzcyB0YWJsZQorICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyBmdW5jdGlvbiBsb2NhdGVzIHRoZSBwcm9wZXIgZW50cnkgaW4gdGhlIFVuaWNhc3QgdGFibGUgZm9yIHRoZQorICoJc3BlY2lmaWVkIE1BQyBuaWJibGUgYW5kIHNldHMgaXRzIHByb3BlcnRpZXMgYWNjb3JkaW5nIHRvIGZ1bmN0aW9uCisgKglwYXJhbWV0ZXJzLgorICoKKyAqIElOUFVUOgorICoJdW5zaWduZWQgaW50CWV0aF9wb3J0X251bQlQb3J0IG51bWJlci4KKyAqCXVuc2lnbmVkIGNoYXIJdWNfbmliYmxlCVVuaWNhc3QgTUFDIEFkZHJlc3MgbGFzdCBuaWJibGUuCisgKglpbnQgCQlvcHRpb24JCTAgPSBBZGQsIDEgPSByZW1vdmUgYWRkcmVzcy4KKyAqCisgKiBPVVRQVVQ6CisgKglUaGlzIGZ1bmN0aW9uIGFkZC9yZW1vdmVzIE1BQyBhZGRyZXNzZXMgZnJvbSB0aGUgcG9ydCB1bmljYXN0IGFkZHJlc3MKKyAqCXRhYmxlLgorICoKKyAqIFJFVFVSTjoKKyAqCXRydWUgaXMgb3V0cHV0IHN1Y2NlZWRlZC4KKyAqCWZhbHNlIGlmIG9wdGlvbiBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KKyAqCisgKi8KK3N0YXRpYyBpbnQgZXRoX3BvcnRfdWNfYWRkcih1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtLCB1bnNpZ25lZCBjaGFyIHVjX25pYmJsZSwKKwkJCQkJCQkJaW50IG9wdGlvbikKK3sKKwl1bnNpZ25lZCBpbnQgdW5pY2FzdF9yZWc7CisJdW5zaWduZWQgaW50IHRibF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHJlZ19vZmZzZXQ7CisKKwkvKiBMb2NhdGUgdGhlIFVuaWNhc3QgdGFibGUgZW50cnkgKi8KKwl1Y19uaWJibGUgPSAoMHhmICYgdWNfbmliYmxlKTsKKwl0Ymxfb2Zmc2V0ID0gKHVjX25pYmJsZSAvIDQpICogNDsJLyogUmVnaXN0ZXIgb2Zmc2V0IGZyb20gdW5pY2FzdCB0YWJsZSBiYXNlICovCisJcmVnX29mZnNldCA9IHVjX25pYmJsZSAlIDQ7CS8qIEVudHJ5IG9mZnNldCB3aXRoaW4gdGhlIGFib3ZlIHJlZ2lzdGVyICovCisKKwlzd2l0Y2ggKG9wdGlvbikgeworCWNhc2UgUkVKRUNUX01BQ19BRERSOgorCQkvKiBDbGVhciBhY2NlcHRzIGZyYW1lIGJpdCBhdCBnaXZlbiB1bmljYXN0IERBIHRhYmxlIGVudHJ5ICovCisJCXVuaWNhc3RfcmVnID0gbXZfcmVhZCgoTVY2NDNYWF9FVEhfREFfRklMVEVSX1VOSUNBU1RfVEFCTEVfQkFTRQorCQkJCQkJKGV0aF9wb3J0X251bSkgKyB0Ymxfb2Zmc2V0KSk7CisKKwkJdW5pY2FzdF9yZWcgJj0gKDB4MEUgPDwgKDggKiByZWdfb2Zmc2V0KSk7CisKKwkJbXZfd3JpdGUoKE1WNjQzWFhfRVRIX0RBX0ZJTFRFUl9VTklDQVNUX1RBQkxFX0JBU0UKKwkJCQkoZXRoX3BvcnRfbnVtKSArIHRibF9vZmZzZXQpLCB1bmljYXN0X3JlZyk7CisJCWJyZWFrOworCisJY2FzZSBBQ0NFUFRfTUFDX0FERFI6CisJCS8qIFNldCBhY2NlcHRzIGZyYW1lIGJpdCBhdCB1bmljYXN0IERBIGZpbHRlciB0YWJsZSBlbnRyeSAqLworCQl1bmljYXN0X3JlZyA9CisJCQltdl9yZWFkKChNVjY0M1hYX0VUSF9EQV9GSUxURVJfVU5JQ0FTVF9UQUJMRV9CQVNFCisJCQkJCQkoZXRoX3BvcnRfbnVtKSArIHRibF9vZmZzZXQpKTsKKworCQl1bmljYXN0X3JlZyB8PSAoMHgwMSA8PCAoOCAqIHJlZ19vZmZzZXQpKTsKKworCQltdl93cml0ZSgoTVY2NDNYWF9FVEhfREFfRklMVEVSX1VOSUNBU1RfVEFCTEVfQkFTRQorCQkJCShldGhfcG9ydF9udW0pICsgdGJsX29mZnNldCksIHVuaWNhc3RfcmVnKTsKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogZXRoX3BvcnRfaW5pdF9tYWNfdGFibGVzIC0gQ2xlYXIgYWxsIGVudHJhbmNlIGluIHRoZSBVQywgU01DIGFuZCBPTUMgdGFibGVzCisgKgorICogREVTQ1JJUFRJT046CisgKglHbyB0aHJvdWdoIGFsbCB0aGUgREEgZmlsdGVyIHRhYmxlcyAoVW5pY2FzdCwgU3BlY2lhbCBNdWx0aWNhc3QgJgorICoJT3RoZXIgTXVsdGljYXN0KSBhbmQgc2V0IGVhY2ggZW50cnkgdG8gMC4KKyAqCisgKiBJTlBVVDoKKyAqCXVuc2lnbmVkIGludAlldGhfcG9ydF9udW0JRXRoZXJuZXQgUG9ydCBudW1iZXIuCisgKgorICogT1VUUFVUOgorICoJTXVsdGljYXN0IGFuZCBVbmljYXN0IHBhY2tldHMgYXJlIHJlamVjdGVkLgorICoKKyAqIFJFVFVSTjoKKyAqCU5vbmUuCisgKi8KK3N0YXRpYyB2b2lkIGV0aF9wb3J0X2luaXRfbWFjX3RhYmxlcyh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtKQoreworCWludCB0YWJsZV9pbmRleDsKKworCS8qIENsZWFyIERBIGZpbHRlciB1bmljYXN0IHRhYmxlIChFeF9kRlVUKSAqLworCWZvciAodGFibGVfaW5kZXggPSAwOyB0YWJsZV9pbmRleCA8PSAweEM7IHRhYmxlX2luZGV4ICs9IDQpCisJCW12X3dyaXRlKChNVjY0M1hYX0VUSF9EQV9GSUxURVJfVU5JQ0FTVF9UQUJMRV9CQVNFCisJCQkJCShldGhfcG9ydF9udW0pICsgdGFibGVfaW5kZXgpLCAwKTsKKworCWZvciAodGFibGVfaW5kZXggPSAwOyB0YWJsZV9pbmRleCA8PSAweEZDOyB0YWJsZV9pbmRleCArPSA0KSB7CisJCS8qIENsZWFyIERBIGZpbHRlciBzcGVjaWFsIG11bHRpY2FzdCB0YWJsZSAoRXhfZEZTTVQpICovCisJCW12X3dyaXRlKChNVjY0M1hYX0VUSF9EQV9GSUxURVJfU1BFQ0lBTF9NVUxUSUNBU1RfVEFCTEVfQkFTRQorCQkJCQkoZXRoX3BvcnRfbnVtKSArIHRhYmxlX2luZGV4KSwgMCk7CisJCS8qIENsZWFyIERBIGZpbHRlciBvdGhlciBtdWx0aWNhc3QgdGFibGUgKEV4X2RGT01UKSAqLworCQltdl93cml0ZSgoTVY2NDNYWF9FVEhfREFfRklMVEVSX09USEVSX01VTFRJQ0FTVF9UQUJMRV9CQVNFCisJCQkJCShldGhfcG9ydF9udW0pICsgdGFibGVfaW5kZXgpLCAwKTsKKwl9Cit9CisKKy8qCisgKiBldGhfY2xlYXJfbWliX2NvdW50ZXJzIC0gQ2xlYXIgYWxsIE1JQiBjb3VudGVycworICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyBmdW5jdGlvbiBjbGVhcnMgYWxsIE1JQiBjb3VudGVycyBvZiBhIHNwZWNpZmljIGV0aGVybmV0IHBvcnQuCisgKglBIHJlYWQgZnJvbSB0aGUgTUlCIGNvdW50ZXIgd2lsbCByZXNldCB0aGUgY291bnRlci4KKyAqCisgKiBJTlBVVDoKKyAqCXVuc2lnbmVkIGludAlldGhfcG9ydF9udW0JRXRoZXJuZXQgUG9ydCBudW1iZXIuCisgKgorICogT1VUUFVUOgorICoJQWZ0ZXIgcmVhZGluZyBhbGwgTUlCIGNvdW50ZXJzLCB0aGUgY291bnRlcnMgcmVzZXRzLgorICoKKyAqIFJFVFVSTjoKKyAqCU1JQiBjb3VudGVyIHZhbHVlLgorICoKKyAqLworc3RhdGljIHZvaWQgZXRoX2NsZWFyX21pYl9jb3VudGVycyh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtKQoreworCWludCBpOworCisJLyogUGVyZm9ybSBkdW1teSByZWFkcyBmcm9tIE1JQiBjb3VudGVycyAqLworCWZvciAoaSA9IEVUSF9NSUJfR09PRF9PQ1RFVFNfUkVDRUlWRURfTE9XOyBpIDwgRVRIX01JQl9MQVRFX0NPTExJU0lPTjsKKwkJCQkJCQkJCWkgKz0gNCkKKwkJbXZfcmVhZChNVjY0M1hYX0VUSF9NSUJfQ09VTlRFUlNfQkFTRShldGhfcG9ydF9udW0pICsgaSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHJlYWRfbWliKHN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wLCBpbnQgb2Zmc2V0KQoreworCXJldHVybiBtdl9yZWFkKE1WNjQzWFhfRVRIX01JQl9DT1VOVEVSU19CQVNFKG1wLT5wb3J0X251bSkgKyBvZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBldGhfdXBkYXRlX21pYl9jb3VudGVycyhzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCkKK3sKKwlzdHJ1Y3QgbXY2NDN4eF9taWJfY291bnRlcnMgKnAgPSAmbXAtPm1pYl9jb3VudGVyczsKKwlpbnQgb2Zmc2V0OworCisJcC0+Z29vZF9vY3RldHNfcmVjZWl2ZWQgKz0KKwkJcmVhZF9taWIobXAsIEVUSF9NSUJfR09PRF9PQ1RFVFNfUkVDRUlWRURfTE9XKTsKKwlwLT5nb29kX29jdGV0c19yZWNlaXZlZCArPQorCQkodTY0KXJlYWRfbWliKG1wLCBFVEhfTUlCX0dPT0RfT0NURVRTX1JFQ0VJVkVEX0hJR0gpIDw8IDMyOworCisJZm9yIChvZmZzZXQgPSBFVEhfTUlCX0JBRF9PQ1RFVFNfUkVDRUlWRUQ7CisJCQlvZmZzZXQgPD0gRVRIX01JQl9GUkFNRVNfMTAyNF9UT19NQVhfT0NURVRTOworCQkJb2Zmc2V0ICs9IDQpCisJCSoodTMyICopKChjaGFyICopcCArIG9mZnNldCkgPSByZWFkX21pYihtcCwgb2Zmc2V0KTsKKworCXAtPmdvb2Rfb2N0ZXRzX3NlbnQgKz0gcmVhZF9taWIobXAsIEVUSF9NSUJfR09PRF9PQ1RFVFNfU0VOVF9MT1cpOworCXAtPmdvb2Rfb2N0ZXRzX3NlbnQgKz0KKwkJKHU2NClyZWFkX21pYihtcCwgRVRIX01JQl9HT09EX09DVEVUU19TRU5UX0hJR0gpIDw8IDMyOworCisJZm9yIChvZmZzZXQgPSBFVEhfTUlCX0dPT0RfRlJBTUVTX1NFTlQ7CisJCQlvZmZzZXQgPD0gRVRIX01JQl9MQVRFX0NPTExJU0lPTjsKKwkJCW9mZnNldCArPSA0KQorCQkqKHUzMiAqKSgoY2hhciAqKXAgKyBvZmZzZXQpID0gcmVhZF9taWIobXAsIG9mZnNldCk7Cit9CisKKy8qCisgKiBldGhlcm5ldF9waHlfZGV0ZWN0IC0gRGV0ZWN0IHdoZXRoZXIgYSBwaHkgaXMgcHJlc2VudAorICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyBmdW5jdGlvbiB0ZXN0cyB3aGV0aGVyIHRoZXJlIGlzIGEgUEhZIHByZXNlbnQgb24KKyAqCXRoZSBzcGVjaWZpZWQgcG9ydC4KKyAqCisgKiBJTlBVVDoKKyAqCXVuc2lnbmVkIGludAlldGhfcG9ydF9udW0JRXRoZXJuZXQgUG9ydCBudW1iZXIuCisgKgorICogT1VUUFVUOgorICoJTm9uZQorICoKKyAqIFJFVFVSTjoKKyAqCTAgb24gc3VjY2VzcworICoJLUVOT0RFViBvbiBmYWlsdXJlCisgKgorICovCitzdGF0aWMgaW50IGV0aGVybmV0X3BoeV9kZXRlY3QodW5zaWduZWQgaW50IHBvcnRfbnVtKQoreworCXVuc2lnbmVkIGludCBwaHlfcmVnX2RhdGEwOworCWludCBhdXRvX25lZzsKKworCWV0aF9wb3J0X3JlYWRfc21pX3JlZyhwb3J0X251bSwgMCwgJnBoeV9yZWdfZGF0YTApOworCWF1dG9fbmVnID0gcGh5X3JlZ19kYXRhMCAmIDB4MTAwMDsKKwlwaHlfcmVnX2RhdGEwIF49IDB4MTAwMDsJLyogaW52ZXJ0IGF1dG9fbmVnICovCisJZXRoX3BvcnRfd3JpdGVfc21pX3JlZyhwb3J0X251bSwgMCwgcGh5X3JlZ19kYXRhMCk7CisKKwlldGhfcG9ydF9yZWFkX3NtaV9yZWcocG9ydF9udW0sIDAsICZwaHlfcmVnX2RhdGEwKTsKKwlpZiAoKHBoeV9yZWdfZGF0YTAgJiAweDEwMDApID09IGF1dG9fbmVnKQorCQlyZXR1cm4gLUVOT0RFVjsJCQkJLyogY2hhbmdlIGRpZG4ndCB0YWtlICovCisKKwlwaHlfcmVnX2RhdGEwIF49IDB4MTAwMDsKKwlldGhfcG9ydF93cml0ZV9zbWlfcmVnKHBvcnRfbnVtLCAwLCBwaHlfcmVnX2RhdGEwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGV0aGVybmV0X3BoeV9nZXQgLSBHZXQgdGhlIGV0aGVybmV0IHBvcnQgUEhZIGFkZHJlc3MuCisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgZ2l2ZW4gZXRoZXJuZXQgcG9ydCBQSFkgYWRkcmVzcy4KKyAqCisgKiBJTlBVVDoKKyAqCXVuc2lnbmVkIGludAlldGhfcG9ydF9udW0JRXRoZXJuZXQgUG9ydCBudW1iZXIuCisgKgorICogT1VUUFVUOgorICoJTm9uZS4KKyAqCisgKiBSRVRVUk46CisgKglQSFkgYWRkcmVzcy4KKyAqCisgKi8KK3N0YXRpYyBpbnQgZXRoZXJuZXRfcGh5X2dldCh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtKQoreworCXVuc2lnbmVkIGludCByZWdfZGF0YTsKKworCXJlZ19kYXRhID0gbXZfcmVhZChNVjY0M1hYX0VUSF9QSFlfQUREUl9SRUcpOworCisJcmV0dXJuICgocmVnX2RhdGEgPj4gKDUgKiBldGhfcG9ydF9udW0pKSAmIDB4MWYpOworfQorCisvKgorICogZXRoZXJuZXRfcGh5X3NldCAtIFNldCB0aGUgZXRoZXJuZXQgcG9ydCBQSFkgYWRkcmVzcy4KKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgcm91dGluZSBzZXRzIHRoZSBnaXZlbiBldGhlcm5ldCBwb3J0IFBIWSBhZGRyZXNzLgorICoKKyAqIElOUFVUOgorICoJdW5zaWduZWQgaW50CWV0aF9wb3J0X251bQlFdGhlcm5ldCBQb3J0IG51bWJlci4KKyAqCWludAkJcGh5X2FkZHIJUEhZIGFkZHJlc3MuCisgKgorICogT1VUUFVUOgorICoJTm9uZS4KKyAqCisgKiBSRVRVUk46CisgKglOb25lLgorICoKKyAqLworc3RhdGljIHZvaWQgZXRoZXJuZXRfcGh5X3NldCh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtLCBpbnQgcGh5X2FkZHIpCit7CisJdTMyIHJlZ19kYXRhOworCWludCBhZGRyX3NoaWZ0ID0gNSAqIGV0aF9wb3J0X251bTsKKworCXJlZ19kYXRhID0gbXZfcmVhZChNVjY0M1hYX0VUSF9QSFlfQUREUl9SRUcpOworCXJlZ19kYXRhICY9IH4oMHgxZiA8PCBhZGRyX3NoaWZ0KTsKKwlyZWdfZGF0YSB8PSAocGh5X2FkZHIgJiAweDFmKSA8PCBhZGRyX3NoaWZ0OworCW12X3dyaXRlKE1WNjQzWFhfRVRIX1BIWV9BRERSX1JFRywgcmVnX2RhdGEpOworfQorCisvKgorICogZXRoZXJuZXRfcGh5X3Jlc2V0IC0gUmVzZXQgRXRoZXJuZXQgcG9ydCBQSFkuCisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIHJvdXRpbmUgdXRpbGl6ZXMgdGhlIFNNSSBpbnRlcmZhY2UgdG8gcmVzZXQgdGhlIGV0aGVybmV0IHBvcnQgUEhZLgorICoKKyAqIElOUFVUOgorICoJdW5zaWduZWQgaW50CWV0aF9wb3J0X251bQlFdGhlcm5ldCBQb3J0IG51bWJlci4KKyAqCisgKiBPVVRQVVQ6CisgKglUaGUgUEhZIGlzIHJlc2V0LgorICoKKyAqIFJFVFVSTjoKKyAqCU5vbmUuCisgKgorICovCitzdGF0aWMgdm9pZCBldGhlcm5ldF9waHlfcmVzZXQodW5zaWduZWQgaW50IGV0aF9wb3J0X251bSkKK3sKKwl1bnNpZ25lZCBpbnQgcGh5X3JlZ19kYXRhOworCisJLyogUmVzZXQgdGhlIFBIWSAqLworCWV0aF9wb3J0X3JlYWRfc21pX3JlZyhldGhfcG9ydF9udW0sIDAsICZwaHlfcmVnX2RhdGEpOworCXBoeV9yZWdfZGF0YSB8PSAweDgwMDA7CS8qIFNldCBiaXQgMTUgdG8gcmVzZXQgdGhlIFBIWSAqLworCWV0aF9wb3J0X3dyaXRlX3NtaV9yZWcoZXRoX3BvcnRfbnVtLCAwLCBwaHlfcmVnX2RhdGEpOworfQorCisvKgorICogZXRoX3BvcnRfcmVzZXQgLSBSZXNldCBFdGhlcm5ldCBwb3J0CisgKgorICogREVTQ1JJUFRJT046CisgKiAJVGhpcyByb3V0aW5lIHJlc2V0cyB0aGUgY2hpcCBieSBhYm9ydGluZyBhbnkgU0RNQSBlbmdpbmUgYWN0aXZpdHkgYW5kCisgKgljbGVhcmluZyB0aGUgTUlCIGNvdW50ZXJzLiBUaGUgUmVjZWl2ZXIgYW5kIHRoZSBUcmFuc21pdCB1bml0IGFyZSBpbgorICoJaWRsZSBzdGF0ZSBhZnRlciB0aGlzIGNvbW1hbmQgaXMgcGVyZm9ybWVkIGFuZCB0aGUgcG9ydCBpcyBkaXNhYmxlZC4KKyAqCisgKiBJTlBVVDoKKyAqCXVuc2lnbmVkIGludAlldGhfcG9ydF9udW0JRXRoZXJuZXQgUG9ydCBudW1iZXIuCisgKgorICogT1VUUFVUOgorICoJQ2hhbm5lbCBhY3Rpdml0eSBpcyBoYWx0ZWQuCisgKgorICogUkVUVVJOOgorICoJTm9uZS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGV0aF9wb3J0X3Jlc2V0KHVuc2lnbmVkIGludCBwb3J0X251bSkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnX2RhdGE7CisKKwkvKiBTdG9wIFR4IHBvcnQgYWN0aXZpdHkuIENoZWNrIHBvcnQgVHggYWN0aXZpdHkuICovCisJcmVnX2RhdGEgPSBtdl9yZWFkKE1WNjQzWFhfRVRIX1RSQU5TTUlUX1FVRVVFX0NPTU1BTkRfUkVHKHBvcnRfbnVtKSk7CisKKwlpZiAocmVnX2RhdGEgJiAweEZGKSB7CisJCS8qIElzc3VlIHN0b3AgY29tbWFuZCBmb3IgYWN0aXZlIGNoYW5uZWxzIG9ubHkgKi8KKwkJbXZfd3JpdGUoTVY2NDNYWF9FVEhfVFJBTlNNSVRfUVVFVUVfQ09NTUFORF9SRUcocG9ydF9udW0pLAorCQkJCQkJCShyZWdfZGF0YSA8PCA4KSk7CisKKwkJLyogV2FpdCBmb3IgYWxsIFR4IGFjdGl2aXR5IHRvIHRlcm1pbmF0ZS4gKi8KKwkJLyogQ2hlY2sgcG9ydCBjYXVzZSByZWdpc3RlciB0aGF0IGFsbCBUeCBxdWV1ZXMgYXJlIHN0b3BwZWQgKi8KKwkJd2hpbGUgKG12X3JlYWQoTVY2NDNYWF9FVEhfVFJBTlNNSVRfUVVFVUVfQ09NTUFORF9SRUcocG9ydF9udW0pKQorCQkJCQkJCQkJJiAweEZGKQorCQkJdWRlbGF5KDEwKTsKKwl9CisKKwkvKiBTdG9wIFJ4IHBvcnQgYWN0aXZpdHkuIENoZWNrIHBvcnQgUnggYWN0aXZpdHkuICovCisJcmVnX2RhdGEgPSBtdl9yZWFkKE1WNjQzWFhfRVRIX1JFQ0VJVkVfUVVFVUVfQ09NTUFORF9SRUcocG9ydF9udW0pKTsKKworCWlmIChyZWdfZGF0YSAmIDB4RkYpIHsKKwkJLyogSXNzdWUgc3RvcCBjb21tYW5kIGZvciBhY3RpdmUgY2hhbm5lbHMgb25seSAqLworCQltdl93cml0ZShNVjY0M1hYX0VUSF9SRUNFSVZFX1FVRVVFX0NPTU1BTkRfUkVHKHBvcnRfbnVtKSwKKwkJCQkJCQkocmVnX2RhdGEgPDwgOCkpOworCisJCS8qIFdhaXQgZm9yIGFsbCBSeCBhY3Rpdml0eSB0byB0ZXJtaW5hdGUuICovCisJCS8qIENoZWNrIHBvcnQgY2F1c2UgcmVnaXN0ZXIgdGhhdCBhbGwgUnggcXVldWVzIGFyZSBzdG9wcGVkICovCisJCXdoaWxlIChtdl9yZWFkKE1WNjQzWFhfRVRIX1JFQ0VJVkVfUVVFVUVfQ09NTUFORF9SRUcocG9ydF9udW0pKQorCQkJCQkJCQkJJiAweEZGKQorCQkJdWRlbGF5KDEwKTsKKwl9CisKKwkvKiBDbGVhciBhbGwgTUlCIGNvdW50ZXJzICovCisJZXRoX2NsZWFyX21pYl9jb3VudGVycyhwb3J0X251bSk7CisKKwkvKiBSZXNldCB0aGUgRW5hYmxlIGJpdCBpbiB0aGUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworCXJlZ19kYXRhID0gbXZfcmVhZChNVjY0M1hYX0VUSF9QT1JUX1NFUklBTF9DT05UUk9MX1JFRyhwb3J0X251bSkpOworCXJlZ19kYXRhICY9IH5NVjY0M1hYX0VUSF9TRVJJQUxfUE9SVF9FTkFCTEU7CisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfUE9SVF9TRVJJQUxfQ09OVFJPTF9SRUcocG9ydF9udW0pLCByZWdfZGF0YSk7Cit9CisKKy8qCisgKiBldGhlcm5ldF9zZXRfY29uZmlnX3JlZyAtIFNldCBzcGVjaWZpZWQgYml0cyBpbiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLgorICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyBmdW5jdGlvbiBzZXRzIHNwZWNpZmllZCBiaXRzIGluIHRoZSBnaXZlbiBldGhlcm5ldAorICoJY29uZmlndXJhdGlvbiByZWdpc3Rlci4KKyAqCisgKiBJTlBVVDoKKyAqCXVuc2lnbmVkIGludAlldGhfcG9ydF9udW0JRXRoZXJuZXQgUG9ydCBudW1iZXIuCisgKgl1bnNpZ25lZCBpbnQJdmFsdWUJCTMyIGJpdCB2YWx1ZS4KKyAqCisgKiBPVVRQVVQ6CisgKglUaGUgc2V0IGJpdHMgaW4gdGhlIHZhbHVlIHBhcmFtZXRlciBhcmUgc2V0IGluIHRoZSBjb25maWd1cmF0aW9uCisgKglyZWdpc3Rlci4KKyAqCisgKiBSRVRVUk46CisgKglOb25lLgorICoKKyAqLworc3RhdGljIHZvaWQgZXRoZXJuZXRfc2V0X2NvbmZpZ19yZWcodW5zaWduZWQgaW50IGV0aF9wb3J0X251bSwKKwkJCQkJCQl1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgaW50IGV0aF9jb25maWdfcmVnOworCisJZXRoX2NvbmZpZ19yZWcgPSBtdl9yZWFkKE1WNjQzWFhfRVRIX1BPUlRfQ09ORklHX1JFRyhldGhfcG9ydF9udW0pKTsKKwlldGhfY29uZmlnX3JlZyB8PSB2YWx1ZTsKKwltdl93cml0ZShNVjY0M1hYX0VUSF9QT1JUX0NPTkZJR19SRUcoZXRoX3BvcnRfbnVtKSwgZXRoX2NvbmZpZ19yZWcpOworfQorCitzdGF0aWMgaW50IGV0aF9wb3J0X2F1dG9uZWdfc3VwcG9ydGVkKHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0pCit7CisJdW5zaWduZWQgaW50IHBoeV9yZWdfZGF0YTA7CisKKwlldGhfcG9ydF9yZWFkX3NtaV9yZWcoZXRoX3BvcnRfbnVtLCAwLCAmcGh5X3JlZ19kYXRhMCk7CisKKwlyZXR1cm4gcGh5X3JlZ19kYXRhMCAmIDB4MTAwMDsKK30KKworc3RhdGljIGludCBldGhfcG9ydF9saW5rX2lzX3VwKHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0pCit7CisJdW5zaWduZWQgaW50IHBoeV9yZWdfZGF0YTE7CisKKwlldGhfcG9ydF9yZWFkX3NtaV9yZWcoZXRoX3BvcnRfbnVtLCAxLCAmcGh5X3JlZ19kYXRhMSk7CisKKwlpZiAoZXRoX3BvcnRfYXV0b25lZ19zdXBwb3J0ZWQoZXRoX3BvcnRfbnVtKSkgeworCQlpZiAocGh5X3JlZ19kYXRhMSAmIDB4MjApCS8qIGF1dG8tbmVnIGNvbXBsZXRlICovCisJCQlyZXR1cm4gMTsKKwl9IGVsc2UgaWYgKHBoeV9yZWdfZGF0YTEgJiAweDQpCQkvKiBsaW5rIHVwICovCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBldGhlcm5ldF9nZXRfY29uZmlnX3JlZyAtIEdldCB0aGUgcG9ydCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCisgKgorICogREVTQ1JJUFRJT046CisgKglUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgdmFsdWUgb2YgdGhlIGdpdmVuCisgKglldGhlcm5ldCBwb3J0LgorICoKKyAqIElOUFVUOgorICoJdW5zaWduZWQgaW50CWV0aF9wb3J0X251bQlFdGhlcm5ldCBQb3J0IG51bWJlci4KKyAqCisgKiBPVVRQVVQ6CisgKglOb25lLgorICoKKyAqIFJFVFVSTjoKKyAqCVBvcnQgY29uZmlndXJhdGlvbiByZWdpc3RlciB2YWx1ZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBldGhlcm5ldF9nZXRfY29uZmlnX3JlZyh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtKQoreworCXVuc2lnbmVkIGludCBldGhfY29uZmlnX3JlZzsKKworCWV0aF9jb25maWdfcmVnID0gbXZfcmVhZChNVjY0M1hYX0VUSF9QT1JUX0NPTkZJR19FWFRFTkRfUkVHCisJCQkJCQkJCShldGhfcG9ydF9udW0pKTsKKwlyZXR1cm4gZXRoX2NvbmZpZ19yZWc7Cit9CisKKy8qCisgKiBldGhfcG9ydF9yZWFkX3NtaV9yZWcgLSBSZWFkIFBIWSByZWdpc3RlcnMKKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgcm91dGluZSB1dGlsaXplIHRoZSBTTUkgaW50ZXJmYWNlIHRvIGludGVyYWN0IHdpdGggdGhlIFBIWSBpbgorICoJb3JkZXIgdG8gcGVyZm9ybSBQSFkgcmVnaXN0ZXIgcmVhZC4KKyAqCisgKiBJTlBVVDoKKyAqCXVuc2lnbmVkIGludAlwb3J0X251bQlFdGhlcm5ldCBQb3J0IG51bWJlci4KKyAqCXVuc2lnbmVkIGludAlwaHlfcmVnCQlQSFkgcmVnaXN0ZXIgYWRkcmVzcyBvZmZzZXQuCisgKgl1bnNpZ25lZCBpbnQJKnZhbHVlCQlSZWdpc3RlciB2YWx1ZSBidWZmZXIuCisgKgorICogT1VUUFVUOgorICoJV3JpdGUgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWVkIFBIWSByZWdpc3RlciBpbnRvIGdpdmVuIGJ1ZmZlci4KKyAqCisgKiBSRVRVUk46CisgKglmYWxzZSBpZiB0aGUgUEhZIGlzIGJ1c3kgb3IgcmVhZCBkYXRhIGlzIG5vdCBpbiB2YWxpZCBzdGF0ZS4KKyAqCXRydWUgb3RoZXJ3aXNlLgorICoKKyAqLworc3RhdGljIHZvaWQgZXRoX3BvcnRfcmVhZF9zbWlfcmVnKHVuc2lnbmVkIGludCBwb3J0X251bSwKKwkJCQl1bnNpZ25lZCBpbnQgcGh5X3JlZywgdW5zaWduZWQgaW50ICp2YWx1ZSkKK3sKKwlpbnQgcGh5X2FkZHIgPSBldGhlcm5ldF9waHlfZ2V0KHBvcnRfbnVtKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJLyogdGhlIFNNSSByZWdpc3RlciBpcyBhIHNoYXJlZCByZXNvdXJjZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZtdjY0M3h4X2V0aF9waHlfbG9jaywgZmxhZ3MpOworCisJLyogd2FpdCBmb3IgdGhlIFNNSSByZWdpc3RlciB0byBiZWNvbWUgYXZhaWxhYmxlICovCisJZm9yIChpID0gMDsgbXZfcmVhZChNVjY0M1hYX0VUSF9TTUlfUkVHKSAmIEVUSF9TTUlfQlVTWTsgaSsrKSB7CisJCWlmIChpID09IFBIWV9XQUlUX0lURVJBVElPTlMpIHsKKwkJCXByaW50aygibXY2NDN4eCBQSFkgYnVzeSB0aW1lb3V0LCBwb3J0ICVkXG4iLCBwb3J0X251bSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQl1ZGVsYXkoUEhZX1dBSVRfTUlDUk9fU0VDT05EUyk7CisJfQorCisJbXZfd3JpdGUoTVY2NDNYWF9FVEhfU01JX1JFRywKKwkJKHBoeV9hZGRyIDw8IDE2KSB8IChwaHlfcmVnIDw8IDIxKSB8IEVUSF9TTUlfT1BDT0RFX1JFQUQpOworCisJLyogbm93IHdhaXQgZm9yIHRoZSBkYXRhIHRvIGJlIHZhbGlkICovCisJZm9yIChpID0gMDsgIShtdl9yZWFkKE1WNjQzWFhfRVRIX1NNSV9SRUcpICYgRVRIX1NNSV9SRUFEX1ZBTElEKTsgaSsrKSB7CisJCWlmIChpID09IFBIWV9XQUlUX0lURVJBVElPTlMpIHsKKwkJCXByaW50aygibXY2NDN4eCBQSFkgcmVhZCB0aW1lb3V0LCBwb3J0ICVkXG4iLCBwb3J0X251bSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQl1ZGVsYXkoUEhZX1dBSVRfTUlDUk9fU0VDT05EUyk7CisJfQorCisJKnZhbHVlID0gbXZfcmVhZChNVjY0M1hYX0VUSF9TTUlfUkVHKSAmIDB4ZmZmZjsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdjY0M3h4X2V0aF9waHlfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogZXRoX3BvcnRfd3JpdGVfc21pX3JlZyAtIFdyaXRlIHRvIFBIWSByZWdpc3RlcnMKKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgcm91dGluZSB1dGlsaXplIHRoZSBTTUkgaW50ZXJmYWNlIHRvIGludGVyYWN0IHdpdGggdGhlIFBIWSBpbgorICoJb3JkZXIgdG8gcGVyZm9ybSB3cml0ZXMgdG8gUEhZIHJlZ2lzdGVycy4KKyAqCisgKiBJTlBVVDoKKyAqCXVuc2lnbmVkIGludAlldGhfcG9ydF9udW0JRXRoZXJuZXQgUG9ydCBudW1iZXIuCisgKgl1bnNpZ25lZCBpbnQJcGh5X3JlZwkJUEhZIHJlZ2lzdGVyIGFkZHJlc3Mgb2Zmc2V0LgorICoJdW5zaWduZWQgaW50CXZhbHVlCQlSZWdpc3RlciB2YWx1ZS4KKyAqCisgKiBPVVRQVVQ6CisgKglXcml0ZSB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBQSFkgcmVnaXN0ZXIuCisgKgorICogUkVUVVJOOgorICoJZmFsc2UgaWYgdGhlIFBIWSBpcyBidXN5LgorICoJdHJ1ZSBvdGhlcndpc2UuCisgKgorICovCitzdGF0aWMgdm9pZCBldGhfcG9ydF93cml0ZV9zbWlfcmVnKHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0sCisJCQkJICAgdW5zaWduZWQgaW50IHBoeV9yZWcsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlpbnQgcGh5X2FkZHI7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXBoeV9hZGRyID0gZXRoZXJuZXRfcGh5X2dldChldGhfcG9ydF9udW0pOworCisJLyogdGhlIFNNSSByZWdpc3RlciBpcyBhIHNoYXJlZCByZXNvdXJjZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZtdjY0M3h4X2V0aF9waHlfbG9jaywgZmxhZ3MpOworCisJLyogd2FpdCBmb3IgdGhlIFNNSSByZWdpc3RlciB0byBiZWNvbWUgYXZhaWxhYmxlICovCisJZm9yIChpID0gMDsgbXZfcmVhZChNVjY0M1hYX0VUSF9TTUlfUkVHKSAmIEVUSF9TTUlfQlVTWTsgaSsrKSB7CisJCWlmIChpID09IFBIWV9XQUlUX0lURVJBVElPTlMpIHsKKwkJCXByaW50aygibXY2NDN4eCBQSFkgYnVzeSB0aW1lb3V0LCBwb3J0ICVkXG4iLAorCQkJCQkJCQlldGhfcG9ydF9udW0pOworCQkJZ290byBvdXQ7CisJCX0KKwkJdWRlbGF5KFBIWV9XQUlUX01JQ1JPX1NFQ09ORFMpOworCX0KKworCW12X3dyaXRlKE1WNjQzWFhfRVRIX1NNSV9SRUcsIChwaHlfYWRkciA8PCAxNikgfCAocGh5X3JlZyA8PCAyMSkgfAorCQkJCUVUSF9TTUlfT1BDT0RFX1dSSVRFIHwgKHZhbHVlICYgMHhmZmZmKSk7CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXY2NDN4eF9ldGhfcGh5X2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIGV0aF9wb3J0X3NlbmQgLSBTZW5kIGFuIEV0aGVybmV0IHBhY2tldAorICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyByb3V0aW5lIHNlbmQgYSBnaXZlbiBwYWNrZXQgZGVzY3JpYmVkIGJ5IHBfcGt0aW5mbyBwYXJhbWV0ZXIuIEl0CisgKglzdXBwb3J0cyB0cmFuc21pdHRpbmcgb2YgYSBwYWNrZXQgc3BhbmVkIG92ZXIgbXVsdGlwbGUgYnVmZmVycy4gVGhlCisgKglyb3V0aW5lIHVwZGF0ZXMgJ2N1cnInIGFuZCAnZmlyc3QnIGluZGV4ZXMgYWNjb3JkaW5nIHRvIHRoZSBwYWNrZXQKKyAqCXNlZ21lbnQgcGFzc2VkIHRvIHRoZSByb3V0aW5lLiBJbiBjYXNlIHRoZSBwYWNrZXQgc2VnbWVudCBpcyBmaXJzdCwKKyAqCXRoZSAnZmlyc3QnIGluZGV4IGlzIHVwZGF0ZS4gSW4gYW55IGNhc2UsIHRoZSAnY3VycicgaW5kZXggaXMgdXBkYXRlZC4KKyAqCUlmIHRoZSByb3V0aW5lIGdldCBpbnRvIFR4IHJlc291cmNlIGVycm9yIGl0IGFzc2lnbnMgJ2N1cnInIGluZGV4IGFzCisgKgknZmlyc3QnLiBUaGlzIHdheSB0aGUgZnVuY3Rpb24gY2FuIGFib3J0IFR4IHByb2Nlc3Mgb2YgbXVsdGlwbGUKKyAqCWRlc2NyaXB0b3JzIHBlciBwYWNrZXQuCisgKgorICogSU5QVVQ6CisgKglzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlCSptcAkJRXRoZXJuZXQgUG9ydCBDb250cm9sIHNydHVjdC4KKyAqCXN0cnVjdCBwa3RfaW5mbwkJKnBfcGt0X2luZm8JVXNlciBwYWNrZXQgYnVmZmVyLgorICoKKyAqIE9VVFBVVDoKKyAqCVR4IHJpbmcgJ2N1cnInIGFuZCAnZmlyc3QnIGluZGV4ZXMgYXJlIHVwZGF0ZWQuCisgKgorICogUkVUVVJOOgorICoJRVRIX1FVRVVFX0ZVTEwgaW4gY2FzZSBvZiBUeCByZXNvdXJjZSBlcnJvci4KKyAqCUVUSF9FUlJPUiBpbiBjYXNlIHRoZSByb3V0aW5lIGNhbiBub3QgYWNjZXNzIFR4IGRlc2MgcmluZy4KKyAqCUVUSF9RVUVVRV9MQVNUX1JFU09VUkNFIGlmIHRoZSByb3V0aW5lIHVzZXMgdGhlIGxhc3QgVHggcmVzb3VyY2UuCisgKglFVEhfT0sgb3RoZXJ3aXNlLgorICoKKyAqLworI2lmZGVmIE1WNjQzWFhfQ0hFQ0tTVU1fT0ZGTE9BRF9UWAorLyoKKyAqIE1vZGlmaWVkIHRvIGluY2x1ZGUgdGhlIGZpcnN0IGRlc2NyaXB0b3IgcG9pbnRlciBpbiBjYXNlIG9mIFNHCisgKi8KK3N0YXRpYyBFVEhfRlVOQ19SRVRfU1RBVFVTIGV0aF9wb3J0X3NlbmQoc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAsCisJCQkJCSBzdHJ1Y3QgcGt0X2luZm8gKnBfcGt0X2luZm8pCit7CisJaW50IHR4X2Rlc2NfY3VyciwgdHhfZGVzY191c2VkLCB0eF9maXJzdF9kZXNjLCB0eF9uZXh0X2Rlc2M7CisJc3RydWN0IGV0aF90eF9kZXNjICpjdXJyZW50X2Rlc2NyaXB0b3I7CisJc3RydWN0IGV0aF90eF9kZXNjICpmaXJzdF9kZXNjcmlwdG9yOworCXUzMiBjb21tYW5kOworCisJLyogRG8gbm90IHByb2Nlc3MgVHggcmluZyBpbiBjYXNlIG9mIFR4IHJpbmcgcmVzb3VyY2UgZXJyb3IgKi8KKwlpZiAobXAtPnR4X3Jlc291cmNlX2VycikKKwkJcmV0dXJuIEVUSF9RVUVVRV9GVUxMOworCisJLyoKKwkgKiBUaGUgaGFyZHdhcmUgcmVxdWlyZXMgdGhhdCBlYWNoIGJ1ZmZlciB0aGF0IGlzIDw9IDggYnl0ZXMKKwkgKiBpbiBsZW5ndGggbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDggYnl0ZSBib3VuZGFyeS4KKwkgKi8KKwlpZiAocF9wa3RfaW5mby0+Ynl0ZV9jbnQgPD0gOCAmJiBwX3BrdF9pbmZvLT5idWZfcHRyICYgMHg3KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJIm12NjQzeHhfZXRoIHBvcnQgJWQ6IHBhY2tldCBzaXplIDw9IDggcHJvYmxlbVxuIiwKKwkJCW1wLT5wb3J0X251bSk7CisJCXJldHVybiBFVEhfRVJST1I7CisJfQorCisJLyogR2V0IHRoZSBUeCBEZXNjIHJpbmcgaW5kZXhlcyAqLworCXR4X2Rlc2NfY3VyciA9IG1wLT50eF9jdXJyX2Rlc2NfcTsKKwl0eF9kZXNjX3VzZWQgPSBtcC0+dHhfdXNlZF9kZXNjX3E7CisKKwljdXJyZW50X2Rlc2NyaXB0b3IgPSAmbXAtPnBfdHhfZGVzY19hcmVhW3R4X2Rlc2NfY3Vycl07CisKKwl0eF9uZXh0X2Rlc2MgPSAodHhfZGVzY19jdXJyICsgMSkgJSBtcC0+dHhfcmluZ19zaXplOworCisJY3VycmVudF9kZXNjcmlwdG9yLT5idWZfcHRyID0gcF9wa3RfaW5mby0+YnVmX3B0cjsKKwljdXJyZW50X2Rlc2NyaXB0b3ItPmJ5dGVfY250ID0gcF9wa3RfaW5mby0+Ynl0ZV9jbnQ7CisJY3VycmVudF9kZXNjcmlwdG9yLT5sNGlfY2hrID0gcF9wa3RfaW5mby0+bDRpX2NoazsKKwltcC0+dHhfc2tiW3R4X2Rlc2NfY3Vycl0gPSBwX3BrdF9pbmZvLT5yZXR1cm5faW5mbzsKKworCWNvbW1hbmQgPSBwX3BrdF9pbmZvLT5jbWRfc3RzIHwgRVRIX1pFUk9fUEFERElORyB8IEVUSF9HRU5fQ1JDIHwKKwkJCQkJCQlFVEhfQlVGRkVSX09XTkVEX0JZX0RNQTsKKwlpZiAoY29tbWFuZCAmIEVUSF9UWF9GSVJTVF9ERVNDKSB7CisJCXR4X2ZpcnN0X2Rlc2MgPSB0eF9kZXNjX2N1cnI7CisJCW1wLT50eF9maXJzdF9kZXNjX3EgPSB0eF9maXJzdF9kZXNjOworCQlmaXJzdF9kZXNjcmlwdG9yID0gY3VycmVudF9kZXNjcmlwdG9yOworCQltcC0+dHhfZmlyc3RfY29tbWFuZCA9IGNvbW1hbmQ7CisJfSBlbHNlIHsKKwkJdHhfZmlyc3RfZGVzYyA9IG1wLT50eF9maXJzdF9kZXNjX3E7CisJCWZpcnN0X2Rlc2NyaXB0b3IgPSAmbXAtPnBfdHhfZGVzY19hcmVhW3R4X2ZpcnN0X2Rlc2NdOworCQlCVUdfT04oZmlyc3RfZGVzY3JpcHRvciA9PSBOVUxMKTsKKwkJY3VycmVudF9kZXNjcmlwdG9yLT5jbWRfc3RzID0gY29tbWFuZDsKKwl9CisKKwlpZiAoY29tbWFuZCAmIEVUSF9UWF9MQVNUX0RFU0MpIHsKKwkJd21iKCk7CisJCWZpcnN0X2Rlc2NyaXB0b3ItPmNtZF9zdHMgPSBtcC0+dHhfZmlyc3RfY29tbWFuZDsKKworCQl3bWIoKTsKKwkJRVRIX0VOQUJMRV9UWF9RVUVVRShtcC0+cG9ydF9udW0pOworCisJCS8qCisJCSAqIEZpbmlzaCBUeCBwYWNrZXQuIFVwZGF0ZSBmaXJzdCBkZXNjIGluIGNhc2Ugb2YgVHggcmVzb3VyY2UKKwkJICogZXJyb3IgKi8KKwkJdHhfZmlyc3RfZGVzYyA9IHR4X25leHRfZGVzYzsKKwkJbXAtPnR4X2ZpcnN0X2Rlc2NfcSA9IHR4X2ZpcnN0X2Rlc2M7CisJfQorCisJLyogQ2hlY2sgZm9yIHJpbmcgaW5kZXggb3ZlcmxhcCBpbiB0aGUgVHggZGVzYyByaW5nICovCisJaWYgKHR4X25leHRfZGVzYyA9PSB0eF9kZXNjX3VzZWQpIHsKKwkJbXAtPnR4X3Jlc291cmNlX2VyciA9IDE7CisJCW1wLT50eF9jdXJyX2Rlc2NfcSA9IHR4X2ZpcnN0X2Rlc2M7CisKKwkJcmV0dXJuIEVUSF9RVUVVRV9MQVNUX1JFU09VUkNFOworCX0KKworCW1wLT50eF9jdXJyX2Rlc2NfcSA9IHR4X25leHRfZGVzYzsKKworCXJldHVybiBFVEhfT0s7Cit9CisjZWxzZQorc3RhdGljIEVUSF9GVU5DX1JFVF9TVEFUVVMgZXRoX3BvcnRfc2VuZChzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCwKKwkJCQkJIHN0cnVjdCBwa3RfaW5mbyAqcF9wa3RfaW5mbykKK3sKKwlpbnQgdHhfZGVzY19jdXJyOworCWludCB0eF9kZXNjX3VzZWQ7CisJc3RydWN0IGV0aF90eF9kZXNjICpjdXJyZW50X2Rlc2NyaXB0b3I7CisJdW5zaWduZWQgaW50IGNvbW1hbmRfc3RhdHVzOworCisJLyogRG8gbm90IHByb2Nlc3MgVHggcmluZyBpbiBjYXNlIG9mIFR4IHJpbmcgcmVzb3VyY2UgZXJyb3IgKi8KKwlpZiAobXAtPnR4X3Jlc291cmNlX2VycikKKwkJcmV0dXJuIEVUSF9RVUVVRV9GVUxMOworCisJLyogR2V0IHRoZSBUeCBEZXNjIHJpbmcgaW5kZXhlcyAqLworCXR4X2Rlc2NfY3VyciA9IG1wLT50eF9jdXJyX2Rlc2NfcTsKKwl0eF9kZXNjX3VzZWQgPSBtcC0+dHhfdXNlZF9kZXNjX3E7CisJY3VycmVudF9kZXNjcmlwdG9yID0gJm1wLT5wX3R4X2Rlc2NfYXJlYVt0eF9kZXNjX2N1cnJdOworCisJY29tbWFuZF9zdGF0dXMgPSBwX3BrdF9pbmZvLT5jbWRfc3RzIHwgRVRIX1pFUk9fUEFERElORyB8IEVUSF9HRU5fQ1JDOworCWN1cnJlbnRfZGVzY3JpcHRvci0+YnVmX3B0ciA9IHBfcGt0X2luZm8tPmJ1Zl9wdHI7CisJY3VycmVudF9kZXNjcmlwdG9yLT5ieXRlX2NudCA9IHBfcGt0X2luZm8tPmJ5dGVfY250OworCW1wLT50eF9za2JbdHhfZGVzY19jdXJyXSA9IHBfcGt0X2luZm8tPnJldHVybl9pbmZvOworCisJLyogU2V0IGxhc3QgZGVzYyB3aXRoIERNQSBvd25lcnNoaXAgYW5kIGludGVycnVwdCBlbmFibGUuICovCisJd21iKCk7CisJY3VycmVudF9kZXNjcmlwdG9yLT5jbWRfc3RzID0gY29tbWFuZF9zdGF0dXMgfAorCQkJRVRIX0JVRkZFUl9PV05FRF9CWV9ETUEgfCBFVEhfVFhfRU5BQkxFX0lOVEVSUlVQVDsKKworCXdtYigpOworCUVUSF9FTkFCTEVfVFhfUVVFVUUobXAtPnBvcnRfbnVtKTsKKworCS8qIEZpbmlzaCBUeCBwYWNrZXQuIFVwZGF0ZSBmaXJzdCBkZXNjIGluIGNhc2Ugb2YgVHggcmVzb3VyY2UgZXJyb3IgKi8KKwl0eF9kZXNjX2N1cnIgPSAodHhfZGVzY19jdXJyICsgMSkgJSBtcC0+dHhfcmluZ19zaXplOworCisJLyogVXBkYXRlIHRoZSBjdXJyZW50IGRlc2NyaXB0b3IgKi8KKwltcC0+dHhfY3Vycl9kZXNjX3EgPSB0eF9kZXNjX2N1cnI7CisKKwkvKiBDaGVjayBmb3IgcmluZyBpbmRleCBvdmVybGFwIGluIHRoZSBUeCBkZXNjIHJpbmcgKi8KKwlpZiAodHhfZGVzY19jdXJyID09IHR4X2Rlc2NfdXNlZCkgeworCQltcC0+dHhfcmVzb3VyY2VfZXJyID0gMTsKKwkJcmV0dXJuIEVUSF9RVUVVRV9MQVNUX1JFU09VUkNFOworCX0KKworCXJldHVybiBFVEhfT0s7Cit9CisjZW5kaWYKKworLyoKKyAqIGV0aF90eF9yZXR1cm5fZGVzYyAtIEZyZWUgYWxsIHVzZWQgVHggZGVzY3JpcHRvcnMKKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgcm91dGluZSByZXR1cm5zIHRoZSB0cmFuc21pdHRlZCBwYWNrZXQgaW5mb3JtYXRpb24gdG8gdGhlIGNhbGxlci4KKyAqCUl0IHVzZXMgdGhlICdmaXJzdCcgaW5kZXggdG8gc3VwcG9ydCBUeCBkZXNjIHJldHVybiBpbiBjYXNlIGEgdHJhbnNtaXQKKyAqCW9mIGEgcGFja2V0IHNwYW5uZWQgb3ZlciBtdWx0aXBsZSBidWZmZXIgc3RpbGwgaW4gcHJvY2Vzcy4KKyAqCUluIGNhc2UgdGhlIFR4IHF1ZXVlIHdhcyBpbiAicmVzb3VyY2UgZXJyb3IiIGNvbmRpdGlvbiwgd2hlcmUgdGhlcmUgYXJlCisgKglubyBhdmFpbGFibGUgVHggcmVzb3VyY2VzLCB0aGUgZnVuY3Rpb24gcmVzZXRzIHRoZSByZXNvdXJjZSBlcnJvciBmbGFnLgorICoKKyAqIElOUFVUOgorICoJc3RydWN0IG12NjQzeHhfcHJpdmF0ZQkqbXAJCUV0aGVybmV0IFBvcnQgQ29udHJvbCBzcnR1Y3QuCisgKglzdHJ1Y3QgcGt0X2luZm8JCSpwX3BrdF9pbmZvCVVzZXIgcGFja2V0IGJ1ZmZlci4KKyAqCisgKiBPVVRQVVQ6CisgKglUeCByaW5nICdmaXJzdCcgYW5kICd1c2VkJyBpbmRleGVzIGFyZSB1cGRhdGVkLgorICoKKyAqIFJFVFVSTjoKKyAqCUVUSF9FUlJPUiBpbiBjYXNlIHRoZSByb3V0aW5lIGNhbiBub3QgYWNjZXNzIFR4IGRlc2MgcmluZy4KKyAqCUVUSF9SRVRSWSBpbiBjYXNlIHRoZXJlIGlzIHRyYW5zbWlzc2lvbiBpbiBwcm9jZXNzLgorICoJRVRIX0VORF9PRl9KT0IgaWYgdGhlIHJvdXRpbmUgaGFzIG5vdGhpbmcgdG8gcmVsZWFzZS4KKyAqCUVUSF9PSyBvdGhlcndpc2UuCisgKgorICovCitzdGF0aWMgRVRIX0ZVTkNfUkVUX1NUQVRVUyBldGhfdHhfcmV0dXJuX2Rlc2Moc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAsCisJCQkJCQlzdHJ1Y3QgcGt0X2luZm8gKnBfcGt0X2luZm8pCit7CisJaW50IHR4X2Rlc2NfdXNlZDsKKyNpZmRlZiBNVjY0M1hYX0NIRUNLU1VNX09GRkxPQURfVFgKKwlpbnQgdHhfYnVzeV9kZXNjID0gbXAtPnR4X2ZpcnN0X2Rlc2NfcTsKKyNlbHNlCisJaW50IHR4X2J1c3lfZGVzYyA9IG1wLT50eF9jdXJyX2Rlc2NfcTsKKyNlbmRpZgorCXN0cnVjdCBldGhfdHhfZGVzYyAqcF90eF9kZXNjX3VzZWQ7CisJdW5zaWduZWQgaW50IGNvbW1hbmRfc3RhdHVzOworCisJLyogR2V0IHRoZSBUeCBEZXNjIHJpbmcgaW5kZXhlcyAqLworCXR4X2Rlc2NfdXNlZCA9IG1wLT50eF91c2VkX2Rlc2NfcTsKKworCXBfdHhfZGVzY191c2VkID0gJm1wLT5wX3R4X2Rlc2NfYXJlYVt0eF9kZXNjX3VzZWRdOworCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKHBfdHhfZGVzY191c2VkID09IE5VTEwpCisJCXJldHVybiBFVEhfRVJST1I7CisKKwkvKiBTdG9wIHJlbGVhc2UuIEFib3V0IHRvIG92ZXJsYXAgdGhlIGN1cnJlbnQgYXZhaWxhYmxlIFR4IGRlc2NyaXB0b3IgKi8KKwlpZiAodHhfZGVzY191c2VkID09IHR4X2J1c3lfZGVzYyAmJiAhbXAtPnR4X3Jlc291cmNlX2VycikKKwkJcmV0dXJuIEVUSF9FTkRfT0ZfSk9COworCisJY29tbWFuZF9zdGF0dXMgPSBwX3R4X2Rlc2NfdXNlZC0+Y21kX3N0czsKKworCS8qIFN0aWxsIHRyYW5zbWl0dGluZy4uLiAqLworCWlmIChjb21tYW5kX3N0YXR1cyAmIChFVEhfQlVGRkVSX09XTkVEX0JZX0RNQSkpCisJCXJldHVybiBFVEhfUkVUUlk7CisKKwkvKiBQYXNzIHRoZSBwYWNrZXQgaW5mb3JtYXRpb24gdG8gdGhlIGNhbGxlciAqLworCXBfcGt0X2luZm8tPmNtZF9zdHMgPSBjb21tYW5kX3N0YXR1czsKKwlwX3BrdF9pbmZvLT5yZXR1cm5faW5mbyA9IG1wLT50eF9za2JbdHhfZGVzY191c2VkXTsKKwltcC0+dHhfc2tiW3R4X2Rlc2NfdXNlZF0gPSBOVUxMOworCisJLyogVXBkYXRlIHRoZSBuZXh0IGRlc2NyaXB0b3IgdG8gcmVsZWFzZS4gKi8KKwltcC0+dHhfdXNlZF9kZXNjX3EgPSAodHhfZGVzY191c2VkICsgMSkgJSBtcC0+dHhfcmluZ19zaXplOworCisJLyogQW55IFR4IHJldHVybiBjYW5jZWxzIHRoZSBUeCByZXNvdXJjZSBlcnJvciBzdGF0dXMgKi8KKwltcC0+dHhfcmVzb3VyY2VfZXJyID0gMDsKKworCXJldHVybiBFVEhfT0s7Cit9CisKKy8qCisgKiBldGhfcG9ydF9yZWNlaXZlIC0gR2V0IHJlY2VpdmVkIGluZm9ybWF0aW9uIGZyb20gUnggcmluZy4KKyAqCisgKiBERVNDUklQVElPTjoKKyAqIAlUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgcmVjZWl2ZWQgZGF0YSB0byB0aGUgY2FsbGVyLiBUaGVyZSBpcyBubworICoJZGF0YSBjb3B5aW5nIGR1cmluZyByb3V0aW5lIG9wZXJhdGlvbi4gQWxsIGluZm9ybWF0aW9uIGlzIHJldHVybmVkCisgKgl1c2luZyBwb2ludGVyIHRvIHBhY2tldCBpbmZvcm1hdGlvbiBzdHJ1Y3QgcGFzc2VkIGZyb20gdGhlIGNhbGxlci4KKyAqCUlmIHRoZSByb3V0aW5lIGV4aGF1c3RzIFJ4IHJpbmcgcmVzb3VyY2VzIHRoZW4gdGhlIHJlc291cmNlIGVycm9yIGZsYWcKKyAqCWlzIHNldC4KKyAqCisgKiBJTlBVVDoKKyAqCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUJKm1wCQlFdGhlcm5ldCBQb3J0IENvbnRyb2wgc3J0dWN0LgorICoJc3RydWN0IHBrdF9pbmZvCQkqcF9wa3RfaW5mbwlVc2VyIHBhY2tldCBidWZmZXIuCisgKgorICogT1VUUFVUOgorICoJUnggcmluZyBjdXJyZW50IGFuZCB1c2VkIGluZGV4ZXMgYXJlIHVwZGF0ZWQuCisgKgorICogUkVUVVJOOgorICoJRVRIX0VSUk9SIGluIGNhc2UgdGhlIHJvdXRpbmUgY2FuIG5vdCBhY2Nlc3MgUnggZGVzYyByaW5nLgorICoJRVRIX1FVRVVFX0ZVTEwgaWYgUnggcmluZyByZXNvdXJjZXMgYXJlIGV4aGF1c3RlZC4KKyAqCUVUSF9FTkRfT0ZfSk9CIGlmIHRoZXJlIGlzIG5vIHJlY2VpdmVkIGRhdGEuCisgKglFVEhfT0sgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgRVRIX0ZVTkNfUkVUX1NUQVRVUyBldGhfcG9ydF9yZWNlaXZlKHN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wLAorCQkJCQkJc3RydWN0IHBrdF9pbmZvICpwX3BrdF9pbmZvKQoreworCWludCByeF9uZXh0X2N1cnJfZGVzYywgcnhfY3Vycl9kZXNjLCByeF91c2VkX2Rlc2M7CisJdm9sYXRpbGUgc3RydWN0IGV0aF9yeF9kZXNjICpwX3J4X2Rlc2M7CisJdW5zaWduZWQgaW50IGNvbW1hbmRfc3RhdHVzOworCisJLyogRG8gbm90IHByb2Nlc3MgUnggcmluZyBpbiBjYXNlIG9mIFJ4IHJpbmcgcmVzb3VyY2UgZXJyb3IgKi8KKwlpZiAobXAtPnJ4X3Jlc291cmNlX2VycikKKwkJcmV0dXJuIEVUSF9RVUVVRV9GVUxMOworCisJLyogR2V0IHRoZSBSeCBEZXNjIHJpbmcgJ2N1cnIgYW5kICd1c2VkJyBpbmRleGVzICovCisJcnhfY3Vycl9kZXNjID0gbXAtPnJ4X2N1cnJfZGVzY19xOworCXJ4X3VzZWRfZGVzYyA9IG1wLT5yeF91c2VkX2Rlc2NfcTsKKworCXBfcnhfZGVzYyA9ICZtcC0+cF9yeF9kZXNjX2FyZWFbcnhfY3Vycl9kZXNjXTsKKworCS8qIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgdXNlZCB0byBzYXZlIHJlYWRpbmdzIGZyb20gbWVtb3J5ICovCisJY29tbWFuZF9zdGF0dXMgPSBwX3J4X2Rlc2MtPmNtZF9zdHM7CisJcm1iKCk7CisKKwkvKiBOb3RoaW5nIHRvIHJlY2VpdmUuLi4gKi8KKwlpZiAoY29tbWFuZF9zdGF0dXMgJiAoRVRIX0JVRkZFUl9PV05FRF9CWV9ETUEpKQorCQlyZXR1cm4gRVRIX0VORF9PRl9KT0I7CisKKwlwX3BrdF9pbmZvLT5ieXRlX2NudCA9IChwX3J4X2Rlc2MtPmJ5dGVfY250KSAtIFJYX0JVRl9PRkZTRVQ7CisJcF9wa3RfaW5mby0+Y21kX3N0cyA9IGNvbW1hbmRfc3RhdHVzOworCXBfcGt0X2luZm8tPmJ1Zl9wdHIgPSAocF9yeF9kZXNjLT5idWZfcHRyKSArIFJYX0JVRl9PRkZTRVQ7CisJcF9wa3RfaW5mby0+cmV0dXJuX2luZm8gPSBtcC0+cnhfc2tiW3J4X2N1cnJfZGVzY107CisJcF9wa3RfaW5mby0+bDRpX2NoayA9IHBfcnhfZGVzYy0+YnVmX3NpemU7CisKKwkvKiBDbGVhbiB0aGUgcmV0dXJuIGluZm8gZmllbGQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcGFja2V0IGhhcyBiZWVuICovCisJLyogbW92ZWQgdG8gdGhlIHVwcGVyIGxheWVycwkJCQkJICAgICovCisJbXAtPnJ4X3NrYltyeF9jdXJyX2Rlc2NdID0gTlVMTDsKKworCS8qIFVwZGF0ZSBjdXJyZW50IGluZGV4IGluIGRhdGEgc3RydWN0dXJlICovCisJcnhfbmV4dF9jdXJyX2Rlc2MgPSAocnhfY3Vycl9kZXNjICsgMSkgJSBtcC0+cnhfcmluZ19zaXplOworCW1wLT5yeF9jdXJyX2Rlc2NfcSA9IHJ4X25leHRfY3Vycl9kZXNjOworCisJLyogUnggZGVzY3JpcHRvcnMgZXhoYXVzdGVkLiBTZXQgdGhlIFJ4IHJpbmcgcmVzb3VyY2UgZXJyb3IgZmxhZyAqLworCWlmIChyeF9uZXh0X2N1cnJfZGVzYyA9PSByeF91c2VkX2Rlc2MpCisJCW1wLT5yeF9yZXNvdXJjZV9lcnIgPSAxOworCisJcmV0dXJuIEVUSF9PSzsKK30KKworLyoKKyAqIGV0aF9yeF9yZXR1cm5fYnVmZiAtIFJldHVybnMgYSBSeCBidWZmZXIgYmFjayB0byB0aGUgUnggcmluZy4KKyAqCisgKiBERVNDUklQVElPTjoKKyAqCVRoaXMgcm91dGluZSByZXR1cm5zIGEgUnggYnVmZmVyIGJhY2sgdG8gdGhlIFJ4IHJpbmcuIEl0IHJldHJpZXZlcyB0aGUKKyAqCW5leHQgJ3VzZWQnIGRlc2NyaXB0b3IgYW5kIGF0dGFjaGVkIHRoZSByZXR1cm5lZCBidWZmZXIgdG8gaXQuCisgKglJbiBjYXNlIHRoZSBSeCByaW5nIHdhcyBpbiAicmVzb3VyY2UgZXJyb3IiIGNvbmRpdGlvbiwgd2hlcmUgdGhlcmUgYXJlCisgKglubyBhdmFpbGFibGUgUnggcmVzb3VyY2VzLCB0aGUgZnVuY3Rpb24gcmVzZXRzIHRoZSByZXNvdXJjZSBlcnJvciBmbGFnLgorICoKKyAqIElOUFVUOgorICoJc3RydWN0IG12NjQzeHhfcHJpdmF0ZQkqbXAJCUV0aGVybmV0IFBvcnQgQ29udHJvbCBzcnR1Y3QuCisgKglzdHJ1Y3QgcGt0X2luZm8JCSpwX3BrdF9pbmZvCUluZm9ybWF0aW9uIG9uIHJldHVybmVkIGJ1ZmZlci4KKyAqCisgKiBPVVRQVVQ6CisgKglOZXcgYXZhaWxhYmxlIFJ4IHJlc291cmNlIGluIFJ4IGRlc2NyaXB0b3IgcmluZy4KKyAqCisgKiBSRVRVUk46CisgKglFVEhfRVJST1IgaW4gY2FzZSB0aGUgcm91dGluZSBjYW4gbm90IGFjY2VzcyBSeCBkZXNjIHJpbmcuCisgKglFVEhfT0sgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgRVRIX0ZVTkNfUkVUX1NUQVRVUyBldGhfcnhfcmV0dXJuX2J1ZmYoc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAsCisJCQkJCQlzdHJ1Y3QgcGt0X2luZm8gKnBfcGt0X2luZm8pCit7CisJaW50IHVzZWRfcnhfZGVzYzsJLyogV2hlcmUgdG8gcmV0dXJuIFJ4IHJlc291cmNlICovCisJdm9sYXRpbGUgc3RydWN0IGV0aF9yeF9kZXNjICpwX3VzZWRfcnhfZGVzYzsKKworCS8qIEdldCAndXNlZCcgUnggZGVzY3JpcHRvciAqLworCXVzZWRfcnhfZGVzYyA9IG1wLT5yeF91c2VkX2Rlc2NfcTsKKwlwX3VzZWRfcnhfZGVzYyA9ICZtcC0+cF9yeF9kZXNjX2FyZWFbdXNlZF9yeF9kZXNjXTsKKworCXBfdXNlZF9yeF9kZXNjLT5idWZfcHRyID0gcF9wa3RfaW5mby0+YnVmX3B0cjsKKwlwX3VzZWRfcnhfZGVzYy0+YnVmX3NpemUgPSBwX3BrdF9pbmZvLT5ieXRlX2NudDsKKwltcC0+cnhfc2tiW3VzZWRfcnhfZGVzY10gPSBwX3BrdF9pbmZvLT5yZXR1cm5faW5mbzsKKworCS8qIEZsdXNoIHRoZSB3cml0ZSBwaXBlICovCisKKwkvKiBSZXR1cm4gdGhlIGRlc2NyaXB0b3IgdG8gRE1BIG93bmVyc2hpcCAqLworCXdtYigpOworCXBfdXNlZF9yeF9kZXNjLT5jbWRfc3RzID0KKwkJCUVUSF9CVUZGRVJfT1dORURfQllfRE1BIHwgRVRIX1JYX0VOQUJMRV9JTlRFUlJVUFQ7CisJd21iKCk7CisKKwkvKiBNb3ZlIHRoZSB1c2VkIGRlc2NyaXB0b3IgcG9pbnRlciB0byB0aGUgbmV4dCBkZXNjcmlwdG9yICovCisJbXAtPnJ4X3VzZWRfZGVzY19xID0gKHVzZWRfcnhfZGVzYyArIDEpICUgbXAtPnJ4X3Jpbmdfc2l6ZTsKKworCS8qIEFueSBSeCByZXR1cm4gY2FuY2VscyB0aGUgUnggcmVzb3VyY2UgZXJyb3Igc3RhdHVzICovCisJbXAtPnJ4X3Jlc291cmNlX2VyciA9IDA7CisKKwlyZXR1cm4gRVRIX09LOworfQorCisvKioqKioqKioqKioqKiBCZWdpbiBldGh0b29sIHN1cHBvcnQgKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IG12NjQzeHhfc3RhdHMgeworCWNoYXIgc3RhdF9zdHJpbmdbRVRIX0dTVFJJTkdfTEVOXTsKKwlpbnQgc2l6ZW9mX3N0YXQ7CisJaW50IHN0YXRfb2Zmc2V0OworfTsKKworI2RlZmluZSBNVjY0M1hYX1NUQVQobSkgc2l6ZW9mKCgoc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqKTApLT5tKSwgXAorCQkgICAgICBvZmZzZXRvZihzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlLCBtKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG12NjQzeHhfc3RhdHMgbXY2NDN4eF9nc3RyaW5nc19zdGF0c1tdID0geworCXsgInJ4X3BhY2tldHMiLCBNVjY0M1hYX1NUQVQoc3RhdHMucnhfcGFja2V0cykgfSwKKwl7ICJ0eF9wYWNrZXRzIiwgTVY2NDNYWF9TVEFUKHN0YXRzLnR4X3BhY2tldHMpIH0sCisJeyAicnhfYnl0ZXMiLCBNVjY0M1hYX1NUQVQoc3RhdHMucnhfYnl0ZXMpIH0sCisJeyAidHhfYnl0ZXMiLCBNVjY0M1hYX1NUQVQoc3RhdHMudHhfYnl0ZXMpIH0sCisJeyAicnhfZXJyb3JzIiwgTVY2NDNYWF9TVEFUKHN0YXRzLnJ4X2Vycm9ycykgfSwKKwl7ICJ0eF9lcnJvcnMiLCBNVjY0M1hYX1NUQVQoc3RhdHMudHhfZXJyb3JzKSB9LAorCXsgInJ4X2Ryb3BwZWQiLCBNVjY0M1hYX1NUQVQoc3RhdHMucnhfZHJvcHBlZCkgfSwKKwl7ICJ0eF9kcm9wcGVkIiwgTVY2NDNYWF9TVEFUKHN0YXRzLnR4X2Ryb3BwZWQpIH0sCisJeyAiZ29vZF9vY3RldHNfcmVjZWl2ZWQiLCBNVjY0M1hYX1NUQVQobWliX2NvdW50ZXJzLmdvb2Rfb2N0ZXRzX3JlY2VpdmVkKSB9LAorCXsgImJhZF9vY3RldHNfcmVjZWl2ZWQiLCBNVjY0M1hYX1NUQVQobWliX2NvdW50ZXJzLmJhZF9vY3RldHNfcmVjZWl2ZWQpIH0sCisJeyAiaW50ZXJuYWxfbWFjX3RyYW5zbWl0X2VyciIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMuaW50ZXJuYWxfbWFjX3RyYW5zbWl0X2VycikgfSwKKwl7ICJnb29kX2ZyYW1lc19yZWNlaXZlZCIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMuZ29vZF9mcmFtZXNfcmVjZWl2ZWQpIH0sCisJeyAiYmFkX2ZyYW1lc19yZWNlaXZlZCIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMuYmFkX2ZyYW1lc19yZWNlaXZlZCkgfSwKKwl7ICJicm9hZGNhc3RfZnJhbWVzX3JlY2VpdmVkIiwgTVY2NDNYWF9TVEFUKG1pYl9jb3VudGVycy5icm9hZGNhc3RfZnJhbWVzX3JlY2VpdmVkKSB9LAorCXsgIm11bHRpY2FzdF9mcmFtZXNfcmVjZWl2ZWQiLCBNVjY0M1hYX1NUQVQobWliX2NvdW50ZXJzLm11bHRpY2FzdF9mcmFtZXNfcmVjZWl2ZWQpIH0sCisJeyAiZnJhbWVzXzY0X29jdGV0cyIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMuZnJhbWVzXzY0X29jdGV0cykgfSwKKwl7ICJmcmFtZXNfNjVfdG9fMTI3X29jdGV0cyIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMuZnJhbWVzXzY1X3RvXzEyN19vY3RldHMpIH0sCisJeyAiZnJhbWVzXzEyOF90b18yNTVfb2N0ZXRzIiwgTVY2NDNYWF9TVEFUKG1pYl9jb3VudGVycy5mcmFtZXNfMTI4X3RvXzI1NV9vY3RldHMpIH0sCisJeyAiZnJhbWVzXzI1Nl90b181MTFfb2N0ZXRzIiwgTVY2NDNYWF9TVEFUKG1pYl9jb3VudGVycy5mcmFtZXNfMjU2X3RvXzUxMV9vY3RldHMpIH0sCisJeyAiZnJhbWVzXzUxMl90b18xMDIzX29jdGV0cyIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMuZnJhbWVzXzUxMl90b18xMDIzX29jdGV0cykgfSwKKwl7ICJmcmFtZXNfMTAyNF90b19tYXhfb2N0ZXRzIiwgTVY2NDNYWF9TVEFUKG1pYl9jb3VudGVycy5mcmFtZXNfMTAyNF90b19tYXhfb2N0ZXRzKSB9LAorCXsgImdvb2Rfb2N0ZXRzX3NlbnQiLCBNVjY0M1hYX1NUQVQobWliX2NvdW50ZXJzLmdvb2Rfb2N0ZXRzX3NlbnQpIH0sCisJeyAiZ29vZF9mcmFtZXNfc2VudCIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMuZ29vZF9mcmFtZXNfc2VudCkgfSwKKwl7ICJleGNlc3NpdmVfY29sbGlzaW9uIiwgTVY2NDNYWF9TVEFUKG1pYl9jb3VudGVycy5leGNlc3NpdmVfY29sbGlzaW9uKSB9LAorCXsgIm11bHRpY2FzdF9mcmFtZXNfc2VudCIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMubXVsdGljYXN0X2ZyYW1lc19zZW50KSB9LAorCXsgImJyb2FkY2FzdF9mcmFtZXNfc2VudCIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMuYnJvYWRjYXN0X2ZyYW1lc19zZW50KSB9LAorCXsgInVucmVjX21hY19jb250cm9sX3JlY2VpdmVkIiwgTVY2NDNYWF9TVEFUKG1pYl9jb3VudGVycy51bnJlY19tYWNfY29udHJvbF9yZWNlaXZlZCkgfSwKKwl7ICJmY19zZW50IiwgTVY2NDNYWF9TVEFUKG1pYl9jb3VudGVycy5mY19zZW50KSB9LAorCXsgImdvb2RfZmNfcmVjZWl2ZWQiLCBNVjY0M1hYX1NUQVQobWliX2NvdW50ZXJzLmdvb2RfZmNfcmVjZWl2ZWQpIH0sCisJeyAiYmFkX2ZjX3JlY2VpdmVkIiwgTVY2NDNYWF9TVEFUKG1pYl9jb3VudGVycy5iYWRfZmNfcmVjZWl2ZWQpIH0sCisJeyAidW5kZXJzaXplX3JlY2VpdmVkIiwgTVY2NDNYWF9TVEFUKG1pYl9jb3VudGVycy51bmRlcnNpemVfcmVjZWl2ZWQpIH0sCisJeyAiZnJhZ21lbnRzX3JlY2VpdmVkIiwgTVY2NDNYWF9TVEFUKG1pYl9jb3VudGVycy5mcmFnbWVudHNfcmVjZWl2ZWQpIH0sCisJeyAib3ZlcnNpemVfcmVjZWl2ZWQiLCBNVjY0M1hYX1NUQVQobWliX2NvdW50ZXJzLm92ZXJzaXplX3JlY2VpdmVkKSB9LAorCXsgImphYmJlcl9yZWNlaXZlZCIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMuamFiYmVyX3JlY2VpdmVkKSB9LAorCXsgIm1hY19yZWNlaXZlX2Vycm9yIiwgTVY2NDNYWF9TVEFUKG1pYl9jb3VudGVycy5tYWNfcmVjZWl2ZV9lcnJvcikgfSwKKwl7ICJiYWRfY3JjX2V2ZW50IiwgTVY2NDNYWF9TVEFUKG1pYl9jb3VudGVycy5iYWRfY3JjX2V2ZW50KSB9LAorCXsgImNvbGxpc2lvbiIsIE1WNjQzWFhfU1RBVChtaWJfY291bnRlcnMuY29sbGlzaW9uKSB9LAorCXsgImxhdGVfY29sbGlzaW9uIiwgTVY2NDNYWF9TVEFUKG1pYl9jb3VudGVycy5sYXRlX2NvbGxpc2lvbikgfSwKK307CisKKyNkZWZpbmUgTVY2NDNYWF9TVEFUU19MRU4JXAorCXNpemVvZihtdjY0M3h4X2dzdHJpbmdzX3N0YXRzKSAvIHNpemVvZihzdHJ1Y3QgbXY2NDN4eF9zdGF0cykKKworc3RhdGljIGludAorbXY2NDN4eF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wID0gbmV0ZGV2LT5wcml2OworCWludCBwb3J0X251bSA9IG1wLT5wb3J0X251bTsKKwlpbnQgYXV0b25lZyA9IGV0aF9wb3J0X2F1dG9uZWdfc3VwcG9ydGVkKHBvcnRfbnVtKTsKKwlpbnQgbW9kZV8xMF9iaXQ7CisJaW50IGF1dG9fZHVwbGV4OworCWludCBoYWxmX2R1cGxleCA9IDA7CisJaW50IGZ1bGxfZHVwbGV4ID0gMDsKKwlpbnQgYXV0b19zcGVlZDsKKwlpbnQgc3BlZWRfMTAgPSAwOworCWludCBzcGVlZF8xMDAgPSAwOworCWludCBzcGVlZF8xMDAwID0gMDsKKworCXUzMiBwY3MgPSBtdl9yZWFkKE1WNjQzWFhfRVRIX1BPUlRfU0VSSUFMX0NPTlRST0xfUkVHKHBvcnRfbnVtKSk7CisJdTMyIHBzciA9IG12X3JlYWQoTVY2NDNYWF9FVEhfUE9SVF9TVEFUVVNfUkVHKHBvcnRfbnVtKSk7CisKKwltb2RlXzEwX2JpdCA9IHBzciAmIE1WNjQzWFhfRVRIX1BPUlRfU1RBVFVTX01PREVfMTBfQklUOworCisJaWYgKG1vZGVfMTBfYml0KSB7CisJCWVjbWQtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF8xMGJhc2VUX0hhbGY7CisJfSBlbHNlIHsKKwkJZWNtZC0+c3VwcG9ydGVkID0gKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYJCXwKKwkJCQkgICBTVVBQT1JURURfMTBiYXNlVF9GdWxsCQl8CisJCQkJICAgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYJCXwKKwkJCQkgICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbAkJfAorCQkJCSAgIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbAkJfAorCQkJCSAgIChhdXRvbmVnID8gU1VQUE9SVEVEX0F1dG9uZWcgOiAwKQl8CisJCQkJICAgU1VQUE9SVEVEX1RQKTsKKworCQlhdXRvX2R1cGxleCA9ICEocGNzICYgTVY2NDNYWF9FVEhfRElTQUJMRV9BVVRPX05FR19GT1JfRFVQTFgpOworCQlhdXRvX3NwZWVkID0gIShwY3MgJiBNVjY0M1hYX0VUSF9ESVNBQkxFX0FVVE9fTkVHX1NQRUVEX0dNSUkpOworCisJCWVjbWQtPmFkdmVydGlzaW5nID0gQURWRVJUSVNFRF9UUDsKKworCQlpZiAoYXV0b25lZykgeworCQkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9BdXRvbmVnOworCisJCQlpZiAoYXV0b19kdXBsZXgpIHsKKwkJCQloYWxmX2R1cGxleCA9IDE7CisJCQkJZnVsbF9kdXBsZXggPSAxOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocGNzICYgTVY2NDNYWF9FVEhfU0VUX0ZVTExfRFVQTEVYX01PREUpCisJCQkJCWZ1bGxfZHVwbGV4ID0gMTsKKwkJCQllbHNlCisJCQkJCWhhbGZfZHVwbGV4ID0gMTsKKwkJCX0KKworCQkJaWYgKGF1dG9fc3BlZWQpIHsKKwkJCQlzcGVlZF8xMCA9IDE7CisJCQkJc3BlZWRfMTAwID0gMTsKKwkJCQlzcGVlZF8xMDAwID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHBjcyAmIE1WNjQzWFhfRVRIX1NFVF9HTUlJX1NQRUVEX1RPXzEwMDApCisJCQkJCXNwZWVkXzEwMDAgPSAxOworCQkJCWVsc2UgaWYgKHBjcyAmIE1WNjQzWFhfRVRIX1NFVF9NSUlfU1BFRURfVE9fMTAwKQorCQkJCQlzcGVlZF8xMDAgPSAxOworCQkJCWVsc2UKKwkJCQkJc3BlZWRfMTAgPSAxOworCQkJfQorCisJCQlpZiAoc3BlZWRfMTAgJiBoYWxmX2R1cGxleCkKKwkJCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZjsKKwkJCWlmIChzcGVlZF8xMCAmIGZ1bGxfZHVwbGV4KQorCQkJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsOworCQkJaWYgKHNwZWVkXzEwMCAmIGhhbGZfZHVwbGV4KQorCQkJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZjsKKwkJCWlmIChzcGVlZF8xMDAgJiBmdWxsX2R1cGxleCkKKwkJCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGw7CisJCQlpZiAoc3BlZWRfMTAwMCkKKwkJCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsOworCQl9CisJfQorCisJZWNtZC0+cG9ydCA9IFBPUlRfVFA7CisJZWNtZC0+cGh5X2FkZHJlc3MgPSBldGhlcm5ldF9waHlfZ2V0KHBvcnRfbnVtKTsKKworCWVjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9FWFRFUk5BTDsKKworCWlmIChuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKKwkJaWYgKG1vZGVfMTBfYml0KQorCQkJZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDsKKwkJZWxzZSB7CisJCQlpZiAocHNyICYgTVY2NDNYWF9FVEhfUE9SVF9TVEFUVVNfR01JSV8xMDAwKQorCQkJCWVjbWQtPnNwZWVkID0gU1BFRURfMTAwMDsKKwkJCWVsc2UgaWYgKHBzciAmIE1WNjQzWFhfRVRIX1BPUlRfU1RBVFVTX01JSV8xMDApCisJCQkJZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDA7CisJCQllbHNlCisJCQkJZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDsKKwkJfQorCisJCWlmIChwc3IgJiBNVjY0M1hYX0VUSF9QT1JUX1NUQVRVU19GVUxMX0RVUExFWCkKKwkJCWVjbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQllbHNlCisJCQllY21kLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwl9IGVsc2UgeworCQllY21kLT5zcGVlZCA9IC0xOworCQllY21kLT5kdXBsZXggPSAtMTsKKwl9CisKKwllY21kLT5hdXRvbmVnID0gYXV0b25lZyA/IEFVVE9ORUdfRU5BQkxFIDogQVVUT05FR19ESVNBQkxFOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbXY2NDN4eF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICpkcnZpbmZvKQoreworCXN0cm5jcHkoZHJ2aW5mby0+ZHJpdmVyLCAgbXY2NDN4eF9kcml2ZXJfbmFtZSwgMzIpOworCXN0cm5jcHkoZHJ2aW5mby0+dmVyc2lvbiwgbXY2NDN4eF9kcml2ZXJfdmVyc2lvbiwgMzIpOworCXN0cm5jcHkoZHJ2aW5mby0+ZndfdmVyc2lvbiwgIk4vQSIsIDMyKTsKKwlzdHJuY3B5KGRydmluZm8tPmJ1c19pbmZvLCAibXY2NDN4eCIsIDMyKTsKKwlkcnZpbmZvLT5uX3N0YXRzID0gTVY2NDNYWF9TVEFUU19MRU47Cit9CisKK3N0YXRpYyBpbnQgCittdjY0M3h4X2dldF9zdGF0c19jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXJldHVybiBNVjY0M1hYX1NUQVRTX0xFTjsKK30KKworc3RhdGljIHZvaWQgCittdjY0M3h4X2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIAorCQlzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHVpbnQ2NF90ICpkYXRhKQoreworCXN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wID0gbmV0ZGV2LT5wcml2OworCWludCBpOworCisJZXRoX3VwZGF0ZV9taWJfY291bnRlcnMobXApOworCisJZm9yKGkgPSAwOyBpIDwgTVY2NDNYWF9TVEFUU19MRU47IGkrKykgeworCQljaGFyICpwID0gKGNoYXIgKiltcCttdjY0M3h4X2dzdHJpbmdzX3N0YXRzW2ldLnN0YXRfb2Zmc2V0OwkKKwkJZGF0YVtpXSA9IChtdjY0M3h4X2dzdHJpbmdzX3N0YXRzW2ldLnNpemVvZl9zdGF0ID09IAorCQkJc2l6ZW9mKHVpbnQ2NF90KSkgPyAqKHVpbnQ2NF90ICopcCA6ICoodWludDMyX3QgKilwOworCX0KK30KKworc3RhdGljIHZvaWQgCittdjY0M3h4X2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQzMl90IHN0cmluZ3NldCwgdWludDhfdCAqZGF0YSkKK3sKKwlpbnQgaTsKKworCXN3aXRjaChzdHJpbmdzZXQpIHsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJZm9yIChpPTA7IGkgPCBNVjY0M1hYX1NUQVRTX0xFTjsgaSsrKSB7CisJCQltZW1jcHkoZGF0YSArIGkgKiBFVEhfR1NUUklOR19MRU4sIAorCQkJbXY2NDN4eF9nc3RyaW5nc19zdGF0c1tpXS5zdGF0X3N0cmluZywKKwkJCUVUSF9HU1RSSU5HX0xFTik7CisJCX0KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG12NjQzeHhfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncyAgICAgICAgICAgPSBtdjY0M3h4X2dldF9zZXR0aW5ncywKKwkuZ2V0X2RydmluZm8gICAgICAgICAgICA9IG12NjQzeHhfZ2V0X2RydmluZm8sCisJLmdldF9saW5rICAgICAgICAgICAgICAgPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfc2cJCQk9IGV0aHRvb2xfb3BfZ2V0X3NnLAorCS5zZXRfc2cJCQk9IGV0aHRvb2xfb3Bfc2V0X3NnLAorCS5nZXRfc3RyaW5ncyAgICAgICAgICAgID0gbXY2NDN4eF9nZXRfc3RyaW5ncywKKwkuZ2V0X3N0YXRzX2NvdW50ICAgICAgICA9IG12NjQzeHhfZ2V0X3N0YXRzX2NvdW50LAorCS5nZXRfZXRodG9vbF9zdGF0cyAgICAgID0gbXY2NDN4eF9nZXRfZXRodG9vbF9zdGF0cywKK307CisKKy8qKioqKioqKioqKioqIEVuZCBldGh0b29sIHN1cHBvcnQgKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L212NjQzeHhfZXRoLmggYi9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YzRmOGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9tdjY0M3h4X2V0aC5oCkBAIC0wLDAgKzEsNDM4IEBACisjaWZuZGVmIF9fTVY2NDNYWF9FVEhfSF9fCisjZGVmaW5lIF9fTVY2NDNYWF9FVEhfSF9fCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgPGxpbnV4L212NjQzeHguaD4KKworI2RlZmluZQlCSVQwCTB4MDAwMDAwMDEKKyNkZWZpbmUJQklUMQkweDAwMDAwMDAyCisjZGVmaW5lCUJJVDIJMHgwMDAwMDAwNAorI2RlZmluZQlCSVQzCTB4MDAwMDAwMDgKKyNkZWZpbmUJQklUNAkweDAwMDAwMDEwCisjZGVmaW5lCUJJVDUJMHgwMDAwMDAyMAorI2RlZmluZQlCSVQ2CTB4MDAwMDAwNDAKKyNkZWZpbmUJQklUNwkweDAwMDAwMDgwCisjZGVmaW5lCUJJVDgJMHgwMDAwMDEwMAorI2RlZmluZQlCSVQ5CTB4MDAwMDAyMDAKKyNkZWZpbmUJQklUMTAJMHgwMDAwMDQwMAorI2RlZmluZQlCSVQxMQkweDAwMDAwODAwCisjZGVmaW5lCUJJVDEyCTB4MDAwMDEwMDAKKyNkZWZpbmUJQklUMTMJMHgwMDAwMjAwMAorI2RlZmluZQlCSVQxNAkweDAwMDA0MDAwCisjZGVmaW5lCUJJVDE1CTB4MDAwMDgwMDAKKyNkZWZpbmUJQklUMTYJMHgwMDAxMDAwMAorI2RlZmluZQlCSVQxNwkweDAwMDIwMDAwCisjZGVmaW5lCUJJVDE4CTB4MDAwNDAwMDAKKyNkZWZpbmUJQklUMTkJMHgwMDA4MDAwMAorI2RlZmluZQlCSVQyMAkweDAwMTAwMDAwCisjZGVmaW5lCUJJVDIxCTB4MDAyMDAwMDAKKyNkZWZpbmUJQklUMjIJMHgwMDQwMDAwMAorI2RlZmluZQlCSVQyMwkweDAwODAwMDAwCisjZGVmaW5lCUJJVDI0CTB4MDEwMDAwMDAKKyNkZWZpbmUJQklUMjUJMHgwMjAwMDAwMAorI2RlZmluZQlCSVQyNgkweDA0MDAwMDAwCisjZGVmaW5lCUJJVDI3CTB4MDgwMDAwMDAKKyNkZWZpbmUJQklUMjgJMHgxMDAwMDAwMAorI2RlZmluZQlCSVQyOQkweDIwMDAwMDAwCisjZGVmaW5lCUJJVDMwCTB4NDAwMDAwMDAKKyNkZWZpbmUJQklUMzEJMHg4MDAwMDAwMAorCisvKgorICogIFRoZSBmaXJzdCBwYXJ0IGlzIHRoZSBoaWdoIGxldmVsIGRyaXZlciBvZiB0aGUgZ2lnRSBldGhlcm5ldCBwb3J0cy4KKyAqLworCisvKiBDaGVja3N1bSBvZmZsb2FkIGZvciBUeCB3b3JrcyBmb3IgbW9zdCBwYWNrZXRzLCBidXQKKyAqIGZhaWxzIGlmIHByZXZpb3VzIHBhY2tldCBzZW50IGRpZCBub3QgdXNlIGh3IGNzdW0KKyAqLworI3VuZGVmCU1WNjQzWFhfQ0hFQ0tTVU1fT0ZGTE9BRF9UWAorI2RlZmluZQlNVjY0M1hYX05BUEkKKyNkZWZpbmUJTVY2NDNYWF9UWF9GQVNUX1JFRklMTAorI3VuZGVmCU1WNjQzWFhfUlhfUVVFVUVfRklMTF9PTl9UQVNLCS8qIERvZXMgbm90IHdvcmssIHlldCAqLworI3VuZGVmCU1WNjQzWFhfQ09BTAorCisvKgorICogTnVtYmVyIG9mIFJYIC8gVFggZGVzY3JpcHRvcnMgb24gUlggLyBUWCByaW5ncy4KKyAqIE5vdGUgdGhhdCBhbGxvY2F0aW5nIFJYIGRlc2NyaXB0b3JzIGlzIGRvbmUgYnkgYWxsb2NhdGluZyB0aGUgUlgKKyAqIHJpbmcgQU5EIGEgcHJlYWxsb2NhdGVkIFJYIGJ1ZmZlcnMgKHNrYidzKSBmb3IgZWFjaCBkZXNjcmlwdG9yLgorICogVGhlIFRYIGRlc2NyaXB0b3JzIG9ubHkgYWxsb2NhdGVzIHRoZSBUWCBkZXNjcmlwdG9ycyByaW5nLAorICogd2l0aCBubyBwcmUgYWxsb2NhdGVkIFRYIGJ1ZmZlcnMgKHNrYidzIGFyZSBhbGxvY2F0ZWQgYnkgaGlnaGVyIGxheWVycy4KKyAqLworCisvKiBEZWZhdWx0IFRYIHJpbmcgc2l6ZSBpcyAxMDAwIGRlc2NyaXB0b3JzICovCisjZGVmaW5lIE1WNjQzWFhfREVGQVVMVF9UWF9RVUVVRV9TSVpFIDEwMDAKKworLyogRGVmYXVsdCBSWCByaW5nIHNpemUgaXMgNDAwIGRlc2NyaXB0b3JzICovCisjZGVmaW5lIE1WNjQzWFhfREVGQVVMVF9SWF9RVUVVRV9TSVpFIDQwMAorCisjZGVmaW5lIE1WNjQzWFhfVFhfQ09BTCAxMDAKKyNpZmRlZiBNVjY0M1hYX0NPQUwKKyNkZWZpbmUgTVY2NDNYWF9SWF9DT0FMIDEwMAorI2VuZGlmCisKKy8qCisgKiBUaGUgc2Vjb25kIHBhcnQgaXMgdGhlIGxvdyBsZXZlbCBkcml2ZXIgb2YgdGhlIGdpZ0UgZXRoZXJuZXQgcG9ydHMuCisgKi8KKworLyoKKyAqIEhlYWRlciBGaWxlIGZvciA6IE1WLTY0M3h4IG5ldHdvcmsgaW50ZXJmYWNlIGhlYWRlcgorICoKKyAqIERFU0NSSVBUSU9OOgorICoJVGhpcyBoZWFkZXIgZmlsZSBjb250YWlucyBtYWNyb3MgdHlwZWRlZnMgYW5kIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGZvcgorICoJdGhlIE1hcnZlbGwgR2lnIEJpdCBFdGhlcm5ldCBDb250cm9sbGVyLgorICoKKyAqIERFUEVOREVOQ0lFUzoKKyAqCU5vbmUuCisgKgorICovCisKKy8qIE1BQyBhY2NlcGV0L3JlamVjdCBtYWNyb3MgKi8KKyNkZWZpbmUgQUNDRVBUX01BQ19BRERSCQkJCTAKKyNkZWZpbmUgUkVKRUNUX01BQ19BRERSCQkJCTEKKworLyogQnVmZmVyIG9mZnNldCBmcm9tIGJ1ZmZlciBwb2ludGVyICovCisjZGVmaW5lIFJYX0JVRl9PRkZTRVQJCQkJMHgyCisKKy8qIEdpZ2FiaXQgRXRoZXJuZXQgVW5pdCBHbG9iYWwgUmVnaXN0ZXJzICovCisKKy8qIE1JQiBDb3VudGVycyByZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBFVEhfTUlCX0dPT0RfT0NURVRTX1JFQ0VJVkVEX0xPVwkweDAKKyNkZWZpbmUgRVRIX01JQl9HT09EX09DVEVUU19SRUNFSVZFRF9ISUdICTB4NAorI2RlZmluZSBFVEhfTUlCX0JBRF9PQ1RFVFNfUkVDRUlWRUQJCTB4OAorI2RlZmluZSBFVEhfTUlCX0lOVEVSTkFMX01BQ19UUkFOU01JVF9FUlIJMHhjCisjZGVmaW5lIEVUSF9NSUJfR09PRF9GUkFNRVNfUkVDRUlWRUQJCTB4MTAKKyNkZWZpbmUgRVRIX01JQl9CQURfRlJBTUVTX1JFQ0VJVkVECQkweDE0CisjZGVmaW5lIEVUSF9NSUJfQlJPQURDQVNUX0ZSQU1FU19SRUNFSVZFRAkweDE4CisjZGVmaW5lIEVUSF9NSUJfTVVMVElDQVNUX0ZSQU1FU19SRUNFSVZFRAkweDFjCisjZGVmaW5lIEVUSF9NSUJfRlJBTUVTXzY0X09DVEVUUwkJMHgyMAorI2RlZmluZSBFVEhfTUlCX0ZSQU1FU182NV9UT18xMjdfT0NURVRTCQkweDI0CisjZGVmaW5lIEVUSF9NSUJfRlJBTUVTXzEyOF9UT18yNTVfT0NURVRTCTB4MjgKKyNkZWZpbmUgRVRIX01JQl9GUkFNRVNfMjU2X1RPXzUxMV9PQ1RFVFMJMHgyYworI2RlZmluZSBFVEhfTUlCX0ZSQU1FU181MTJfVE9fMTAyM19PQ1RFVFMJMHgzMAorI2RlZmluZSBFVEhfTUlCX0ZSQU1FU18xMDI0X1RPX01BWF9PQ1RFVFMJMHgzNAorI2RlZmluZSBFVEhfTUlCX0dPT0RfT0NURVRTX1NFTlRfTE9XCQkweDM4CisjZGVmaW5lIEVUSF9NSUJfR09PRF9PQ1RFVFNfU0VOVF9ISUdICQkweDNjCisjZGVmaW5lIEVUSF9NSUJfR09PRF9GUkFNRVNfU0VOVAkJMHg0MAorI2RlZmluZSBFVEhfTUlCX0VYQ0VTU0lWRV9DT0xMSVNJT04JCTB4NDQKKyNkZWZpbmUgRVRIX01JQl9NVUxUSUNBU1RfRlJBTUVTX1NFTlQJCTB4NDgKKyNkZWZpbmUgRVRIX01JQl9CUk9BRENBU1RfRlJBTUVTX1NFTlQJCTB4NGMKKyNkZWZpbmUgRVRIX01JQl9VTlJFQ19NQUNfQ09OVFJPTF9SRUNFSVZFRAkweDUwCisjZGVmaW5lIEVUSF9NSUJfRkNfU0VOVAkJCQkweDU0CisjZGVmaW5lIEVUSF9NSUJfR09PRF9GQ19SRUNFSVZFRAkJMHg1OAorI2RlZmluZSBFVEhfTUlCX0JBRF9GQ19SRUNFSVZFRAkJCTB4NWMKKyNkZWZpbmUgRVRIX01JQl9VTkRFUlNJWkVfUkVDRUlWRUQJCTB4NjAKKyNkZWZpbmUgRVRIX01JQl9GUkFHTUVOVFNfUkVDRUlWRUQJCTB4NjQKKyNkZWZpbmUgRVRIX01JQl9PVkVSU0laRV9SRUNFSVZFRAkJMHg2OAorI2RlZmluZSBFVEhfTUlCX0pBQkJFUl9SRUNFSVZFRAkJCTB4NmMKKyNkZWZpbmUgRVRIX01JQl9NQUNfUkVDRUlWRV9FUlJPUgkJMHg3MAorI2RlZmluZSBFVEhfTUlCX0JBRF9DUkNfRVZFTlQJCQkweDc0CisjZGVmaW5lIEVUSF9NSUJfQ09MTElTSU9OCQkJMHg3OAorI2RlZmluZSBFVEhfTUlCX0xBVEVfQ09MTElTSU9OCQkJMHg3YworCisvKiBQb3J0IHNlcmlhbCBzdGF0dXMgcmVnIChQU1IpICovCisjZGVmaW5lIEVUSF9JTlRFUkZBQ0VfR01JSV9NSUkJCQkwCisjZGVmaW5lIEVUSF9JTlRFUkZBQ0VfUENNCQkJQklUMAorI2RlZmluZSBFVEhfTElOS19JU19ET1dOCQkJMAorI2RlZmluZSBFVEhfTElOS19JU19VUAkJCQlCSVQxCisjZGVmaW5lIEVUSF9QT1JUX0FUX0hBTEZfRFVQTEVYCQkJMAorI2RlZmluZSBFVEhfUE9SVF9BVF9GVUxMX0RVUExFWAkJCUJJVDIKKyNkZWZpbmUgRVRIX1JYX0ZMT1dfQ1RSTF9ESVNBQkxFRAkJMAorI2RlZmluZSBFVEhfUlhfRkxPV19DVFJMX0VOQkFMRUQJCUJJVDMKKyNkZWZpbmUgRVRIX0dNSUlfU1BFRURfMTAwXzEwCQkJMAorI2RlZmluZSBFVEhfR01JSV9TUEVFRF8xMDAwCQkJQklUNAorI2RlZmluZSBFVEhfTUlJX1NQRUVEXzEwCQkJMAorI2RlZmluZSBFVEhfTUlJX1NQRUVEXzEwMAkJCUJJVDUKKyNkZWZpbmUgRVRIX05PX1RYCQkJCTAKKyNkZWZpbmUgRVRIX1RYX0lOX1BST0dSRVNTCQkJQklUNworI2RlZmluZSBFVEhfQllQQVNTX05PX0FDVElWRQkJCTAKKyNkZWZpbmUgRVRIX0JZUEFTU19BQ1RJVkUJCQlCSVQ4CisjZGVmaW5lIEVUSF9QT1JUX05PVF9BVF9QQVJUSVRJT05fU1RBVEUJCTAKKyNkZWZpbmUgRVRIX1BPUlRfQVRfUEFSVElUSU9OX1NUQVRFCQlCSVQ5CisjZGVmaW5lIEVUSF9QT1JUX1RYX0ZJRk9fTk9UX0VNUFRZCQkwCisjZGVmaW5lIEVUSF9QT1JUX1RYX0ZJRk9fRU1QVFkJCQlCSVQxMAorCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX0JQRFVfUVVFVUVfMwkJKEJJVDIzIHwgQklUMjIpCisjZGVmaW5lIEVUSF9ERUZBVUxUX1JYX0JQRFVfUVVFVUVfNAkJQklUMjQKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfQlBEVV9RVUVVRV81CQkoQklUMjQgfCBCSVQyMikKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfQlBEVV9RVUVVRV82CQkoQklUMjQgfCBCSVQyMykKKyNkZWZpbmUgRVRIX0RFRkFVTFRfUlhfQlBEVV9RVUVVRV83CQkoQklUMjQgfCBCSVQyMyB8IEJJVDIyKQorCisvKiBTTUkgcmVnICovCisjZGVmaW5lIEVUSF9TTUlfQlVTWQkJQklUMjgJLyogMCAtIFdyaXRlLCAxIC0gUmVhZAkJKi8KKyNkZWZpbmUgRVRIX1NNSV9SRUFEX1ZBTElECUJJVDI3CS8qIDAgLSBXcml0ZSwgMSAtIFJlYWQJCSovCisjZGVmaW5lIEVUSF9TTUlfT1BDT0RFX1dSSVRFCTAJLyogQ29tcGxldGlvbiBvZiBSZWFkIG9wZXJhdGlvbiAqLworI2RlZmluZSBFVEhfU01JX09QQ09ERV9SRUFEIAlCSVQyNgkvKiBPcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MJKi8KKworLyogU0RNQSBjb21tYW5kIHN0YXR1cyBmaWVsZHMgbWFjcm9zICovCisKKy8qIFR4ICYgUnggZGVzY3JpcHRvcnMgc3RhdHVzICovCisjZGVmaW5lIEVUSF9FUlJPUl9TVU1NQVJZCQkJKEJJVDApCisKKy8qIFR4ICYgUnggZGVzY3JpcHRvcnMgY29tbWFuZCAqLworI2RlZmluZSBFVEhfQlVGRkVSX09XTkVEX0JZX0RNQQkJCShCSVQzMSkKKworLyogVHggZGVzY3JpcHRvcnMgc3RhdHVzICovCisjZGVmaW5lIEVUSF9MQ19FUlJPUgkJCQkoMCAgICApCisjZGVmaW5lIEVUSF9VUl9FUlJPUgkJCQkoQklUMSApCisjZGVmaW5lIEVUSF9STF9FUlJPUgkJCQkoQklUMiApCisjZGVmaW5lIEVUSF9MTENfU05BUF9GT1JNQVQJCQkoQklUOSApCisKKy8qIFJ4IGRlc2NyaXB0b3JzIHN0YXR1cyAqLworI2RlZmluZSBFVEhfQ1JDX0VSUk9SCQkJCSgwICAgICkKKyNkZWZpbmUgRVRIX09WRVJSVU5fRVJST1IJCQkoQklUMSApCisjZGVmaW5lIEVUSF9NQVhfRlJBTUVfTEVOR1RIX0VSUk9SCQkoQklUMiApCisjZGVmaW5lIEVUSF9SRVNPVVJDRV9FUlJPUgkJCSgoQklUMiB8IEJJVDEpKQorI2RlZmluZSBFVEhfVkxBTl9UQUdHRUQJCQkJKEJJVDE5KQorI2RlZmluZSBFVEhfQlBEVV9GUkFNRQkJCQkoQklUMjApCisjZGVmaW5lIEVUSF9UQ1BfRlJBTUVfT1ZFUl9JUF9WXzQJCSgwICAgICkKKyNkZWZpbmUgRVRIX1VEUF9GUkFNRV9PVkVSX0lQX1ZfNAkJKEJJVDIxKQorI2RlZmluZSBFVEhfT1RIRVJfRlJBTUVfVFlQRQkJCShCSVQyMikKKyNkZWZpbmUgRVRIX0xBWUVSXzJfSVNfRVRIX1ZfMgkJCShCSVQyMykKKyNkZWZpbmUgRVRIX0ZSQU1FX1RZUEVfSVBfVl80CQkJKEJJVDI0KQorI2RlZmluZSBFVEhfRlJBTUVfSEVBREVSX09LCQkJKEJJVDI1KQorI2RlZmluZSBFVEhfUlhfTEFTVF9ERVNDCQkJKEJJVDI2KQorI2RlZmluZSBFVEhfUlhfRklSU1RfREVTQwkJCShCSVQyNykKKyNkZWZpbmUgRVRIX1VOS05PV05fREVTVElOQVRJT05fQUREUgkJKEJJVDI4KQorI2RlZmluZSBFVEhfUlhfRU5BQkxFX0lOVEVSUlVQVAkJCShCSVQyOSkKKyNkZWZpbmUgRVRIX0xBWUVSXzRfQ0hFQ0tTVU1fT0sJCQkoQklUMzApCisKKy8qIFJ4IGRlc2NyaXB0b3JzIGJ5dGUgY291bnQgKi8KKyNkZWZpbmUgRVRIX0ZSQU1FX0ZSQUdNRU5URUQJCQkoQklUMikKKworLyogVHggZGVzY3JpcHRvcnMgY29tbWFuZCAqLworI2RlZmluZSBFVEhfTEFZRVJfNF9DSEVDS1NVTV9GSVJTVF9ERVNDCQkoQklUMTApCisjZGVmaW5lIEVUSF9GUkFNRV9TRVRfVE9fVkxBTgkJCShCSVQxNSkKKyNkZWZpbmUgRVRIX1RDUF9GUkFNRQkJCQkoMCAgICApCisjZGVmaW5lIEVUSF9VRFBfRlJBTUUJCQkJKEJJVDE2KQorI2RlZmluZSBFVEhfR0VOX1RDUF9VRFBfQ0hFQ0tTVU0JCShCSVQxNykKKyNkZWZpbmUgRVRIX0dFTl9JUF9WXzRfQ0hFQ0tTVU0JCQkoQklUMTgpCisjZGVmaW5lIEVUSF9aRVJPX1BBRERJTkcJCQkoQklUMTkpCisjZGVmaW5lIEVUSF9UWF9MQVNUX0RFU0MJCQkoQklUMjApCisjZGVmaW5lIEVUSF9UWF9GSVJTVF9ERVNDCQkJKEJJVDIxKQorI2RlZmluZSBFVEhfR0VOX0NSQwkJCQkoQklUMjIpCisjZGVmaW5lIEVUSF9UWF9FTkFCTEVfSU5URVJSVVBUCQkJKEJJVDIzKQorI2RlZmluZSBFVEhfQVVUT19NT0RFCQkJCShCSVQzMCkKKworLyogdHlwZWRlZnMgKi8KKwordHlwZWRlZiBlbnVtIF9ldGhfZnVuY19yZXRfc3RhdHVzIHsKKwlFVEhfT0ssCQkJLyogUmV0dXJuZWQgYXMgZXhwZWN0ZWQuCQkqLworCUVUSF9FUlJPUiwJCS8qIEZ1bmRhbWVudGFsIGVycm9yLgkJCSovCisJRVRIX1JFVFJZLAkJLyogQ291bGQgbm90IHByb2Nlc3MgcmVxdWVzdC4gVHJ5IGxhdGVyLiovCisJRVRIX0VORF9PRl9KT0IsCQkvKiBSaW5nIGhhcyBub3RoaW5nIHRvIHByb2Nlc3MuCQkqLworCUVUSF9RVUVVRV9GVUxMLAkJLyogUmluZyByZXNvdXJjZSBlcnJvci4JCQkqLworCUVUSF9RVUVVRV9MQVNUX1JFU09VUkNFCS8qIFJpbmcgcmVzb3VyY2VzIGFib3V0IHRvIGV4aGF1c3QuCSovCit9IEVUSF9GVU5DX1JFVF9TVEFUVVM7CisKK3R5cGVkZWYgZW51bSBfZXRoX3RhcmdldCB7CisJRVRIX1RBUkdFVF9EUkFNLAorCUVUSF9UQVJHRVRfREVWSUNFLAorCUVUSF9UQVJHRVRfQ0JTLAorCUVUSF9UQVJHRVRfUENJMCwKKwlFVEhfVEFSR0VUX1BDSTEKK30gRVRIX1RBUkdFVDsKKworLyogVGhlc2UgYXJlIGZvciBiaWctZW5kaWFuIG1hY2hpbmVzLiAgTGl0dGxlIGVuZGlhbiBuZWVkcyBkaWZmZXJlbnQKKyAqIGRlZmluaXRpb25zLgorICovCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCitzdHJ1Y3QgZXRoX3J4X2Rlc2MgeworCXUxNiBieXRlX2NudDsJCS8qIERlc2NyaXB0b3IgYnVmZmVyIGJ5dGUgY291bnQJCSovCisJdTE2IGJ1Zl9zaXplOwkJLyogQnVmZmVyIHNpemUJCQkJKi8KKwl1MzIgY21kX3N0czsJCS8qIERlc2NyaXB0b3IgY29tbWFuZCBzdGF0dXMJCSovCisJdTMyIG5leHRfZGVzY19wdHI7CS8qIE5leHQgZGVzY3JpcHRvciBwb2ludGVyCQkqLworCXUzMiBidWZfcHRyOwkJLyogRGVzY3JpcHRvciBidWZmZXIgcG9pbnRlcgkJKi8KK307CisKK3N0cnVjdCBldGhfdHhfZGVzYyB7CisJdTE2IGJ5dGVfY250OwkJLyogYnVmZmVyIGJ5dGUgY291bnQJCQkqLworCXUxNiBsNGlfY2hrOwkJLyogQ1BVIHByb3ZpZGVkIFRDUCBjaGVja3N1bQkJKi8KKwl1MzIgY21kX3N0czsJCS8qIENvbW1hbmQvc3RhdHVzIGZpZWxkCQkJKi8KKwl1MzIgbmV4dF9kZXNjX3B0cjsJLyogUG9pbnRlciB0byBuZXh0IGRlc2NyaXB0b3IJCSovCisJdTMyIGJ1Zl9wdHI7CQkvKiBwb2ludGVyIHRvIGJ1ZmZlciBmb3IgdGhpcyBkZXNjcmlwdG9yKi8KK307CisKKyNlbGlmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorc3RydWN0IGV0aF9yeF9kZXNjIHsKKwl1MzIgY21kX3N0czsJCS8qIERlc2NyaXB0b3IgY29tbWFuZCBzdGF0dXMJCSovCisJdTE2IGJ1Zl9zaXplOwkJLyogQnVmZmVyIHNpemUJCQkJKi8KKwl1MTYgYnl0ZV9jbnQ7CQkvKiBEZXNjcmlwdG9yIGJ1ZmZlciBieXRlIGNvdW50CQkqLworCXUzMiBidWZfcHRyOwkJLyogRGVzY3JpcHRvciBidWZmZXIgcG9pbnRlcgkJKi8KKwl1MzIgbmV4dF9kZXNjX3B0cjsJLyogTmV4dCBkZXNjcmlwdG9yIHBvaW50ZXIJCSovCit9OworCitzdHJ1Y3QgZXRoX3R4X2Rlc2MgeworCXUzMiBjbWRfc3RzOwkJLyogQ29tbWFuZC9zdGF0dXMgZmllbGQJCQkqLworCXUxNiBsNGlfY2hrOwkJLyogQ1BVIHByb3ZpZGVkIFRDUCBjaGVja3N1bQkJKi8KKwl1MTYgYnl0ZV9jbnQ7CQkvKiBidWZmZXIgYnl0ZSBjb3VudAkJCSovCisJdTMyIGJ1Zl9wdHI7CQkvKiBwb2ludGVyIHRvIGJ1ZmZlciBmb3IgdGhpcyBkZXNjcmlwdG9yKi8KKwl1MzIgbmV4dF9kZXNjX3B0cjsJLyogUG9pbnRlciB0byBuZXh0IGRlc2NyaXB0b3IJCSovCit9OworI2Vsc2UKKyNlcnJvciBPbmUgb2YgX19CSUdfRU5ESUFOIG9yIF9fTElUVExFX0VORElBTiBtdXN0IGJlIGRlZmluZWQKKyNlbmRpZgorCisvKiBVbmlmaWVkIHN0cnVjdCBmb3IgUnggYW5kIFR4IG9wZXJhdGlvbnMuIFRoZSB1c2VyIGlzIG5vdCByZXF1aXJlZCB0bwkqLworLyogYmUgZmFtaWxpZXIgd2l0aCBuZWl0aGVyIFR4IG5vciBSeCBkZXNjcmlwdG9ycy4JCQkqLworc3RydWN0IHBrdF9pbmZvIHsKKwl1bnNpZ25lZCBzaG9ydCBieXRlX2NudDsJLyogRGVzY3JpcHRvciBidWZmZXIgYnl0ZSBjb3VudAkqLworCXVuc2lnbmVkIHNob3J0IGw0aV9jaGs7CQkvKiBUeCBDUFUgcHJvdmlkZWQgVENQIENoZWNrc3VtCSovCisJdW5zaWduZWQgaW50IGNtZF9zdHM7CQkvKiBEZXNjcmlwdG9yIGNvbW1hbmQgc3RhdHVzCSovCisJZG1hX2FkZHJfdCBidWZfcHRyOwkJLyogRGVzY3JpcHRvciBidWZmZXIgcG9pbnRlcgkqLworCXN0cnVjdCBza19idWZmICpyZXR1cm5faW5mbzsJLyogVXNlciByZXNvdXJjZSByZXR1cm4gaW5mb3JtYXRpb24gKi8KK307CisKKy8qIEV0aGVybmV0IHBvcnQgc3BlY2lmaWMgaW5mb21hdGlvbiAqLworCitzdHJ1Y3QgbXY2NDN4eF9taWJfY291bnRlcnMgeworCXU2NCBnb29kX29jdGV0c19yZWNlaXZlZDsKKwl1MzIgYmFkX29jdGV0c19yZWNlaXZlZDsKKwl1MzIgaW50ZXJuYWxfbWFjX3RyYW5zbWl0X2VycjsKKwl1MzIgZ29vZF9mcmFtZXNfcmVjZWl2ZWQ7CisJdTMyIGJhZF9mcmFtZXNfcmVjZWl2ZWQ7CisJdTMyIGJyb2FkY2FzdF9mcmFtZXNfcmVjZWl2ZWQ7CisJdTMyIG11bHRpY2FzdF9mcmFtZXNfcmVjZWl2ZWQ7CisJdTMyIGZyYW1lc182NF9vY3RldHM7CisJdTMyIGZyYW1lc182NV90b18xMjdfb2N0ZXRzOworCXUzMiBmcmFtZXNfMTI4X3RvXzI1NV9vY3RldHM7CisJdTMyIGZyYW1lc18yNTZfdG9fNTExX29jdGV0czsKKwl1MzIgZnJhbWVzXzUxMl90b18xMDIzX29jdGV0czsKKwl1MzIgZnJhbWVzXzEwMjRfdG9fbWF4X29jdGV0czsKKwl1NjQgZ29vZF9vY3RldHNfc2VudDsKKwl1MzIgZ29vZF9mcmFtZXNfc2VudDsKKwl1MzIgZXhjZXNzaXZlX2NvbGxpc2lvbjsKKwl1MzIgbXVsdGljYXN0X2ZyYW1lc19zZW50OworCXUzMiBicm9hZGNhc3RfZnJhbWVzX3NlbnQ7CisJdTMyIHVucmVjX21hY19jb250cm9sX3JlY2VpdmVkOworCXUzMiBmY19zZW50OworCXUzMiBnb29kX2ZjX3JlY2VpdmVkOworCXUzMiBiYWRfZmNfcmVjZWl2ZWQ7CisJdTMyIHVuZGVyc2l6ZV9yZWNlaXZlZDsKKwl1MzIgZnJhZ21lbnRzX3JlY2VpdmVkOworCXUzMiBvdmVyc2l6ZV9yZWNlaXZlZDsKKwl1MzIgamFiYmVyX3JlY2VpdmVkOworCXUzMiBtYWNfcmVjZWl2ZV9lcnJvcjsKKwl1MzIgYmFkX2NyY19ldmVudDsKKwl1MzIgY29sbGlzaW9uOworCXUzMiBsYXRlX2NvbGxpc2lvbjsKK307CisKK3N0cnVjdCBtdjY0M3h4X3ByaXZhdGUgeworCWludCBwb3J0X251bTsJCQkvKiBVc2VyIEV0aGVybmV0IHBvcnQgbnVtYmVyCSovCisJdTggcG9ydF9tYWNfYWRkcls2XTsJCS8qIFVzZXIgZGVmaW5lZCBwb3J0IE1BQyBhZGRyZXNzLiovCisJdTMyIHBvcnRfY29uZmlnOwkJLyogVXNlciBwb3J0IGNvbmZpZ3VyYXRpb24gdmFsdWUqLworCXUzMiBwb3J0X2NvbmZpZ19leHRlbmQ7CQkvKiBVc2VyIHBvcnQgY29uZmlnIGV4dGVuZCB2YWx1ZSovCisJdTMyIHBvcnRfc2RtYV9jb25maWc7CQkvKiBVc2VyIHBvcnQgU0RNQSBjb25maWcgdmFsdWUJKi8KKwl1MzIgcG9ydF9zZXJpYWxfY29udHJvbDsJLyogVXNlciBwb3J0IHNlcmlhbCBjb250cm9sIHZhbHVlICovCisJdTMyIHBvcnRfdHhfcXVldWVfY29tbWFuZDsJLyogUG9ydCBhY3RpdmUgVHggcXVldWVzIHN1bW1hcnkqLworCXUzMiBwb3J0X3J4X3F1ZXVlX2NvbW1hbmQ7CS8qIFBvcnQgYWN0aXZlIFJ4IHF1ZXVlcyBzdW1tYXJ5Ki8KKworCXUzMiByeF9zcmFtX2FkZHI7CQkvKiBCYXNlIGFkZHJlc3Mgb2Ygcnggc3JhbSBhcmVhICovCisJdTMyIHJ4X3NyYW1fc2l6ZTsJCS8qIFNpemUgb2Ygcnggc3JhbSBhcmVhCQkqLworCXUzMiB0eF9zcmFtX2FkZHI7CQkvKiBCYXNlIGFkZHJlc3Mgb2YgdHggc3JhbSBhcmVhICovCisJdTMyIHR4X3NyYW1fc2l6ZTsJCS8qIFNpemUgb2YgdHggc3JhbSBhcmVhCQkqLworCisJaW50IHJ4X3Jlc291cmNlX2VycjsJCS8qIFJ4IHJpbmcgcmVzb3VyY2UgZXJyb3IgZmxhZyAqLworCWludCB0eF9yZXNvdXJjZV9lcnI7CQkvKiBUeCByaW5nIHJlc291cmNlIGVycm9yIGZsYWcgKi8KKworCS8qIFR4L1J4IHJpbmdzIG1hbmFnbWVudCBpbmRleGVzIGZpZWxkcy4gRm9yIGRyaXZlciB1c2UgKi8KKworCS8qIE5leHQgYXZhaWxhYmxlIGFuZCBmaXJzdCByZXR1cm5pbmcgUnggcmVzb3VyY2UgKi8KKwlpbnQgcnhfY3Vycl9kZXNjX3EsIHJ4X3VzZWRfZGVzY19xOworCisJLyogTmV4dCBhdmFpbGFibGUgYW5kIGZpcnN0IHJldHVybmluZyBUeCByZXNvdXJjZSAqLworCWludCB0eF9jdXJyX2Rlc2NfcSwgdHhfdXNlZF9kZXNjX3E7CisjaWZkZWYgTVY2NDNYWF9DSEVDS1NVTV9PRkZMT0FEX1RYCisJaW50IHR4X2ZpcnN0X2Rlc2NfcTsKKwl1MzIgdHhfZmlyc3RfY29tbWFuZDsKKyNlbmRpZgorCisjaWZkZWYgTVY2NDNYWF9UWF9GQVNUX1JFRklMTAorCXUzMiB0eF9jbGVhbl90aHJlc2hvbGQ7CisjZW5kaWYKKworCXN0cnVjdCBldGhfcnhfZGVzYyAqcF9yeF9kZXNjX2FyZWE7CisJZG1hX2FkZHJfdCByeF9kZXNjX2RtYTsKKwl1bnNpZ25lZCBpbnQgcnhfZGVzY19hcmVhX3NpemU7CisJc3RydWN0IHNrX2J1ZmYgKipyeF9za2I7CisKKwlzdHJ1Y3QgZXRoX3R4X2Rlc2MgKnBfdHhfZGVzY19hcmVhOworCWRtYV9hZGRyX3QgdHhfZGVzY19kbWE7CisJdW5zaWduZWQgaW50IHR4X2Rlc2NfYXJlYV9zaXplOworCXN0cnVjdCBza19idWZmICoqdHhfc2tiOworCisJc3RydWN0IHdvcmtfc3RydWN0IHR4X3RpbWVvdXRfdGFzazsKKworCS8qCisJICogRm9ybWVyIHN0cnVjdCBtdjY0M3h4X2V0aF9wcml2IG1lbWJlcnMgc3RhcnQgaGVyZQorCSAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBtdjY0M3h4X21pYl9jb3VudGVycyBtaWJfY291bnRlcnM7CisJc3BpbmxvY2tfdCBsb2NrOworCS8qIFNpemUgb2YgVHggUmluZyBwZXIgcXVldWUgKi8KKwl1bnNpZ25lZCBpbnQgdHhfcmluZ19zaXplOworCS8qIEFtbW9udCBvZiBTS0JzIG91dHN0YW5kaW5nIG9uIFR4IHF1ZXVlICovCisJdW5zaWduZWQgaW50IHR4X3Jpbmdfc2ticzsKKwkvKiBTaXplIG9mIFJ4IFJpbmcgcGVyIHF1ZXVlICovCisJdW5zaWduZWQgaW50IHJ4X3Jpbmdfc2l6ZTsKKwkvKiBBbW1vdW50IG9mIFNLQnMgYWxsb2NhdGVkIHRvIFJ4IFJpbmcgcGVyIHF1ZXVlICovCisJdW5zaWduZWQgaW50IHJ4X3Jpbmdfc2ticzsKKworCS8qCisJICogcnhfdGFzayB1c2VkIHRvIGZpbGwgUlggcmluZyBvdXQgb2YgYm90dG9tIGhhbGYgY29udGV4dAorCSAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCByeF90YXNrOworCisJLyoKKwkgKiBVc2VkIGluIGNhc2UgUlggUmluZyBpcyBlbXB0eSwgd2hpY2ggY2FuIGJlIGNhdXNlZCB3aGVuCisJICogc3lzdGVtIGRvZXMgbm90IGhhdmUgcmVzb3VyY2VzIChza2IncykKKwkgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lb3V0OworCWxvbmcgcnhfdGFza19idXN5IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKFNNUF9DQUNIRV9CWVRFUykpKTsKKwl1bnNpZ25lZCByeF90aW1lcl9mbGFnOworCisJdTMyIHJ4X2ludF9jb2FsOworCXUzMiB0eF9pbnRfY29hbDsKK307CisKKy8qIGV0aGVybmV0LmggQVBJIGxpc3QgKi8KKworLyogUG9ydCBvcGVyYXRpb24gY29udHJvbCByb3V0aW5lcyAqLworc3RhdGljIHZvaWQgZXRoX3BvcnRfaW5pdChzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCk7CitzdGF0aWMgdm9pZCBldGhfcG9ydF9yZXNldCh1bnNpZ25lZCBpbnQgZXRoX3BvcnRfbnVtKTsKK3N0YXRpYyB2b2lkIGV0aF9wb3J0X3N0YXJ0KHN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wKTsKKworc3RhdGljIHZvaWQgZXRoZXJuZXRfc2V0X2NvbmZpZ19yZWcodW5zaWduZWQgaW50IGV0aF9wb3J0X251bSwKKwkJCQkgICAgdW5zaWduZWQgaW50IHZhbHVlKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXRoZXJuZXRfZ2V0X2NvbmZpZ19yZWcodW5zaWduZWQgaW50IGV0aF9wb3J0X251bSk7CisKKy8qIFBvcnQgTUFDIGFkZHJlc3Mgcm91dGluZXMgKi8KK3N0YXRpYyB2b2lkIGV0aF9wb3J0X3VjX2FkZHJfc2V0KHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0sCisJCQkJIHVuc2lnbmVkIGNoYXIgKnBfYWRkcik7CisKKy8qIFBIWSBhbmQgTUlCIHJvdXRpbmVzICovCitzdGF0aWMgdm9pZCBldGhlcm5ldF9waHlfcmVzZXQodW5zaWduZWQgaW50IGV0aF9wb3J0X251bSk7CisKK3N0YXRpYyB2b2lkIGV0aF9wb3J0X3dyaXRlX3NtaV9yZWcodW5zaWduZWQgaW50IGV0aF9wb3J0X251bSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgcGh5X3JlZywgdW5zaWduZWQgaW50IHZhbHVlKTsKKworc3RhdGljIHZvaWQgZXRoX3BvcnRfcmVhZF9zbWlfcmVnKHVuc2lnbmVkIGludCBldGhfcG9ydF9udW0sCisJCQkJICB1bnNpZ25lZCBpbnQgcGh5X3JlZywgdW5zaWduZWQgaW50ICp2YWx1ZSk7CisKK3N0YXRpYyB2b2lkIGV0aF9jbGVhcl9taWJfY291bnRlcnModW5zaWduZWQgaW50IGV0aF9wb3J0X251bSk7CisKKy8qIFBvcnQgZGF0YSBmbG93IGNvbnRyb2wgcm91dGluZXMgKi8KK3N0YXRpYyBFVEhfRlVOQ19SRVRfU1RBVFVTIGV0aF9wb3J0X3NlbmQoc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAsCisJCQkJCSBzdHJ1Y3QgcGt0X2luZm8gKnBfcGt0X2luZm8pOworc3RhdGljIEVUSF9GVU5DX1JFVF9TVEFUVVMgZXRoX3R4X3JldHVybl9kZXNjKHN0cnVjdCBtdjY0M3h4X3ByaXZhdGUgKm1wLAorCQkJCQkgICAgICBzdHJ1Y3QgcGt0X2luZm8gKnBfcGt0X2luZm8pOworc3RhdGljIEVUSF9GVU5DX1JFVF9TVEFUVVMgZXRoX3BvcnRfcmVjZWl2ZShzdHJ1Y3QgbXY2NDN4eF9wcml2YXRlICptcCwKKwkJCQkJICAgIHN0cnVjdCBwa3RfaW5mbyAqcF9wa3RfaW5mbyk7CitzdGF0aWMgRVRIX0ZVTkNfUkVUX1NUQVRVUyBldGhfcnhfcmV0dXJuX2J1ZmYoc3RydWN0IG12NjQzeHhfcHJpdmF0ZSAqbXAsCisJCQkJCSAgICAgIHN0cnVjdCBwa3RfaW5mbyAqcF9wa3RfaW5mbyk7CisKKyNlbmRpZgkJCQkvKiBfX01WNjQzWFhfRVRIX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbXZtZTE0Ny5jIGIvZHJpdmVycy9uZXQvbXZtZTE0Ny5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YTgyZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9tdm1lMTQ3LmMKQEAgLTAsMCArMSwyMDMgQEAKKy8qIG12bWUxNDcuYyAgOiB0aGUgIExpbnV4L212bWUxNDcvbGFuY2UgZXRoZXJuZXQgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAwNS8xOTk4IFBldGVyIE1heWRlbGwgPHBtYXlkZWxsQGNoaWFyay5ncmVlbmVuZC5vcmcudWs+CisgKiBCYXNlZCBvbiB0aGUgU3VuIExhbmNlIGRyaXZlciBhbmQgdGhlIE5ldEJTRCBIUCBMYW5jZSBkcml2ZXIKKyAqIFVzZXMgdGhlIGdlbmVyaWMgNzk5MC5jIExBTkNFIGNvZGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisvKiBVc2VkIGZvciB0aGUgdGVtcG9yYWwgaW5ldCBlbnRyaWVzIGFuZCByb3V0aW5nICovCisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL212bWUxNDdody5oPgorCisvKiBXZSBoYXZlIDE2ODM0IGJ5dGVzIG9mIFJBTSBmb3IgdGhlIGluaXQgYmxvY2sgYW5kIGJ1ZmZlcnMuIFRoaXMgcGxhY2VzCisgKiBhbiB1cHBlciBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgd2UgY2FuIHVzZS4gTmV0QlNEIHVzZXMgOCBSeAorICogYnVmZmVycyBhbmQgMiBUeCBidWZmZXJzLgorICovCisjZGVmaW5lIExBTkNFX0xPR19UWF9CVUZGRVJTIDEKKyNkZWZpbmUgTEFOQ0VfTE9HX1JYX0JVRkZFUlMgMworCisjaW5jbHVkZSAiNzk5MC5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBnZW5lcmljIExBTkNFIGNvZGUgKi8KKworLyogT3VyIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBtMTQ3bGFuY2VfcHJpdmF0ZSB7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgbGFuY2U7CisJdW5zaWduZWQgbG9uZyByYW07Cit9OworCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzLi4uIFRoaXMgaXMgZWFzeSBiZWNhdXNlIGFsbCB0aGUgZ3JvdCBpcyBpbiB0aGUKKyAqIGdlbmVyaWMgTEFOQ0Ugc3VwcG9ydC4gQWxsIHdlIGhhdmUgdG8gc3VwcG9ydCBpcyBwcm9iaW5nIGZvciBib2FyZHMsCisgKiBwbHVzIGJvYXJkLXNwZWNpZmljIGluaXQsIG9wZW4gYW5kIGNsb3NlIGFjdGlvbnMuCisgKiBPaCwgYW5kIHdlIG5lZWQgdG8gdGVsbCB0aGUgZ2VuZXJpYyBjb2RlIGhvdyB0byByZWFkIGFuZCB3cml0ZSBMQU5DRSByZWdpc3RlcnMuLi4KKyAqLworc3RhdGljIGludCBtMTQ3bGFuY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbTE0N2xhbmNlX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbTE0N2xhbmNlX3dyaXRlcmFwKHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCwgdW5zaWduZWQgc2hvcnQgdmFsdWUpOworc3RhdGljIHZvaWQgbTE0N2xhbmNlX3dyaXRlcmRwKHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCwgdW5zaWduZWQgc2hvcnQgdmFsdWUpOworc3RhdGljIHVuc2lnbmVkIHNob3J0IG0xNDdsYW5jZV9yZWFkcmRwKHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCk7CisKK3R5cGVkZWYgdm9pZCAoKndyaXRlcmFwX3QpKHZvaWQgKiwgdW5zaWduZWQgc2hvcnQpOwordHlwZWRlZiB2b2lkICgqd3JpdGVyZHBfdCkodm9pZCAqLCB1bnNpZ25lZCBzaG9ydCk7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICgqcmVhZHJkcF90KSh2b2lkICopOworCisvKiBJbml0aWFsaXNlIHRoZSBvbmUgYW5kIG9ubHkgb24tYm9hcmQgNzk5MCAqLworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgbXZtZTE0N2xhbmNlX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RhdGljIGludCBjYWxsZWQ7CisJc3RhdGljIGNvbnN0IGNoYXIgbmFtZVtdID0gIk1WTUUxNDcgTEFOQ0UiOworCXN0cnVjdCBtMTQ3bGFuY2VfcHJpdmF0ZSAqbHA7CisJdV9sb25nICphZGRyOworCXVfbG9uZyBhZGRyZXNzOworCWludCBlcnI7CisKKwlpZiAoIU1BQ0hfSVNfTVZNRTE0NyB8fCBjYWxsZWQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCWNhbGxlZCsrOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBtMTQ3bGFuY2VfcHJpdmF0ZSkpOworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmICh1bml0ID49IDApCisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCS8qIEZpbGwgdGhlIGRldiBmaWVsZHMgKi8KKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKU1WTUUxNDdfTEFOQ0VfQkFTRTsKKwlkZXYtPm9wZW4gPSAmbTE0N2xhbmNlX29wZW47CisJZGV2LT5zdG9wID0gJm0xNDdsYW5jZV9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZsYW5jZV9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gJmxhbmNlX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZsYW5jZV9zZXRfbXVsdGljYXN0OworCWRldi0+dHhfdGltZW91dCA9ICZsYW5jZV90eF90aW1lb3V0OworCWRldi0+ZG1hID0gMDsKKworCWFkZHI9KHVfbG9uZyAqKUVUSEVSTkVUX0FERFJFU1M7CisJYWRkcmVzcyA9ICphZGRyOworCWRldi0+ZGV2X2FkZHJbMF09MHgwODsKKwlkZXYtPmRldl9hZGRyWzFdPTB4MDA7CisJZGV2LT5kZXZfYWRkclsyXT0weDNlOworCWFkZHJlc3M9YWRkcmVzcz4+ODsKKwlkZXYtPmRldl9hZGRyWzVdPWFkZHJlc3MmMHhmZjsKKwlhZGRyZXNzPWFkZHJlc3M+Pjg7CisJZGV2LT5kZXZfYWRkcls0XT1hZGRyZXNzJjB4ZmY7CisJYWRkcmVzcz1hZGRyZXNzPj44OworCWRldi0+ZGV2X2FkZHJbM109YWRkcmVzcyYweGZmOworCisJcHJpbnRrKCIlczogTVZNRTE0NyBhdCAweCUwOGx4LCBpcnEgJWQsIEhhcmR3YXJlIEFkZHJlc3MgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCWRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsIE1WTUUxNDdfTEFOQ0VfSVJRLAorCQlkZXYtPmRldl9hZGRyWzBdLAorCQlkZXYtPmRldl9hZGRyWzFdLCBkZXYtPmRldl9hZGRyWzJdLAorCQlkZXYtPmRldl9hZGRyWzNdLCBkZXYtPmRldl9hZGRyWzRdLAorCQlkZXYtPmRldl9hZGRyWzVdKTsKKworCWxwID0gKHN0cnVjdCBtMTQ3bGFuY2VfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwlscC0+cmFtID0gX19nZXRfZG1hX3BhZ2VzKEdGUF9BVE9NSUMsIDMpOwkvKiAxNksgKi8KKwlpZiAoIWxwLT5yYW0pCisJeworCQlwcmludGsoIiVzOiBObyBtZW1vcnkgZm9yIExBTkNFIGJ1ZmZlcnNcbiIsIGRldi0+bmFtZSk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCWxwLT5sYW5jZS5uYW1lID0gKGNoYXIqKW5hbWU7ICAgICAgICAgICAgICAgICAgIC8qIGRpc2NhcmRzIGNvbnN0LCBzaHV0IHVwIGdjYyAqLworCWxwLT5sYW5jZS5iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJbHAtPmxhbmNlLmluaXRfYmxvY2sgPSAoc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKikobHAtPnJhbSk7IC8qIENQVSBhZGRyICovCisJbHAtPmxhbmNlLmxhbmNlX2luaXRfYmxvY2sgPSAoc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKikobHAtPnJhbSk7ICAgICAgICAgICAgICAgICAvKiBMQU5DRSBhZGRyIG9mIHNhbWUgUkFNICovCisJbHAtPmxhbmNlLmJ1c21hc3Rlcl9yZWd2YWwgPSBMRV9DM19CU1dQOyAgICAgICAgLyogd2UncmUgYmlnZW5kaWFuICovCisJbHAtPmxhbmNlLmlycSA9IE1WTUUxNDdfTEFOQ0VfSVJROworCWxwLT5sYW5jZS53cml0ZXJhcCA9ICh3cml0ZXJhcF90KW0xNDdsYW5jZV93cml0ZXJhcDsKKwlscC0+bGFuY2Uud3JpdGVyZHAgPSAod3JpdGVyZHBfdCltMTQ3bGFuY2Vfd3JpdGVyZHA7CisJbHAtPmxhbmNlLnJlYWRyZHAgPSAocmVhZHJkcF90KW0xNDdsYW5jZV9yZWFkcmRwOworCWxwLT5sYW5jZS5sYW5jZV9sb2dfcnhfYnVmcyA9IExBTkNFX0xPR19SWF9CVUZGRVJTOworCWxwLT5sYW5jZS5sYW5jZV9sb2dfdHhfYnVmcyA9IExBTkNFX0xPR19UWF9CVUZGRVJTOworCWxwLT5sYW5jZS5yeF9yaW5nX21vZF9tYXNrID0gUlhfUklOR19NT0RfTUFTSzsKKwlscC0+bGFuY2UudHhfcmluZ19tb2RfbWFzayA9IFRYX1JJTkdfTU9EX01BU0s7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCWZyZWVfcGFnZXMobHAtPnJhbSwgMyk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCisJcmV0dXJuIGRldjsKK30KKworc3RhdGljIHZvaWQgbTE0N2xhbmNlX3dyaXRlcmFwKHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCwgdW5zaWduZWQgc2hvcnQgdmFsdWUpCit7CisJb3V0X2JlMTYobHAtPmJhc2UgKyBMQU5DRV9SQVAsIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgbTE0N2xhbmNlX3dyaXRlcmRwKHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCwgdW5zaWduZWQgc2hvcnQgdmFsdWUpCit7CisJb3V0X2JlMTYobHAtPmJhc2UgKyBMQU5DRV9SRFAsIHZhbHVlKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IG0xNDdsYW5jZV9yZWFkcmRwKHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCkKK3sKKwlyZXR1cm4gaW5fYmUxNihscC0+YmFzZSArIExBTkNFX1JEUCk7Cit9CisKK3N0YXRpYyBpbnQgbTE0N2xhbmNlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gbGFuY2Vfb3BlbihkZXYpOyAgICAgICAgICAgICAgICAgLyogY2FsbCBnZW5lcmljIGxhbmNlIG9wZW4gY29kZSAqLworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisJLyogZW5hYmxlIGludGVycnVwdHMgYXQgYm9hcmQgbGV2ZWwuICovCisJbTE0N19wY2MtPmxhbl9jbnRybD0wOyAgICAgICAvKiBjbGVhciB0aGUgaW50ZXJydXB0cyAoaWYgYW55KSAqLworCW0xNDdfcGNjLT5sYW5fY250cmw9MHgwOCB8IDB4MDQ7ICAgICAvKiBFbmFibGUgaXJxIDQgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG0xNDdsYW5jZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIGRpc2FibGUgaW50ZXJydXB0cyBhdCBib2FyZGxldmVsICovCisJbTE0N19wY2MtPmxhbl9jbnRybD0weDA7IC8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCWxhbmNlX2Nsb3NlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBNT0RVTEUKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfbXZtZTE0N19sYW5jZTsKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWRldl9tdm1lMTQ3X2xhbmNlID0gbXZtZTE0N2xhbmNlX3Byb2JlKC0xKTsKKwlpZiAoSVNfRVJSKGRldl9tdm1lMTQ3X2xhbmNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGV2X212bWUxNDdfbGFuY2UpOworCXJldHVybiAwOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJc3RydWN0IG0xNDdsYW5jZV9wcml2YXRlICpscCA9IGRldl9tdm1lMTQ3X2xhbmNlLT5wcml2OworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldl9tdm1lMTQ3X2xhbmNlKTsKKwlmcmVlX3BhZ2VzKGxwLT5yYW0sIDMpOworCWZyZWVfbmV0ZGV2KGRldl9tdm1lMTQ3X2xhbmNlKTsKK30KKworI2VuZGlmIC8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbXlyaV9jb2RlLmggYi9kcml2ZXJzL25ldC9teXJpX2NvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTFlYmE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbXlyaV9jb2RlLmgKQEAgLTAsMCArMSw2Mjg3IEBACisvKiBUaGlzIGlzIHRoZSBNeXJpbmV0IE1DUCBjb2RlIGZvciBMQU5haTQueCAqLyAKKy8qIEdlbmVyYXRlZCBieSAgY2F0ICRNWVJJX0hPTUUvbGliL2xhbmFpL21jcDQuZGF0ID4gbXlyaV9jb2RlNC5oICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGFuYWk0X2NvZGVfb2ZmID0gMHgwMDAwOyAvKiBoYWxmLXdvcmQgb2Zmc2V0ICovIAorc3RhdGljIHVuc2lnbmVkIGNoYXIgbGFuYWk0X2NvZGVbNzYyNTZdIF9faW5pdGRhdGEgPSB7CisweEYyLDB4MEUsIAorMHhGRSwweDAwLCAweEMyLDB4OTAsIDB4MDAsMHgwMCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgwMSwweDRDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEUwLDB4MDAsIDB4MDAsMHgxNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNywweDA2LCAweDJBLDB4NkMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHgyQywweDEwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDQ4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDIsIDB4MDUsMHgzQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwMiwgMHgwMCwweDAzLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MjksMHhFMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDJCLDB4ODQsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHgyQywweDFDLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDQ4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDIsIDB4MEEsMHhCQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwMiwgMHgwMCwweDAyLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MkEsMHhGOCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweEY3LDB4MDQsIDB4NEEsMHg5QywgMHg4NSwweDE2LCAweDAwLDB4MDAsIDB4MjAsMHgzQSwgMHgwMCwweDAxLCAweEVFLDB4MDAsIAorMHgwMSwweDAxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDc1LDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MDEsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3NSwweEYwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDAxLDB4MkQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHgyRCwweDM4LCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIAorMHgwMCwweDAyLCAweEY0LDB4ODIsIDB4MDAsMHgxMiwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHgwMSwweEUwLCAweEI0LDB4QkEsIAorMHg2OCwweDAyLCAweEUwLDB4MDAsIDB4MDEsMHhFMCwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjcsMHgwNCwgMHgzQiwweDY0LCAweEY1LDB4ODQsIAorMHg0RiwweDU0LCAweEY3LDB4MDUsIDB4N0EsMHgxMCwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgwMSwweDk5LCAweDk3LDB4MkEsIAorMHgwMCwweDIwLCAweDk1LDB4QUEsIDB4MDAsMHgxQywgMHhGNiwweDA2LCAweDRBLDB4OTgsIDB4MjYsMHhBQywgMHgwMCwweDAxLCAweDc3LDB4MzUsIAorMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4MDcsMHgzOCwgMHgwMCwweDBDLCAweEE0LDB4QkEsIAorMHg2MCwweDAyLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NCwweEFBLCAweDAwLDB4MTAsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweDg3LDB4M0EsIAorMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NywweDJBLCAweDAwLDB4MTQsIDB4RjcsMHgwNCwgMHg0QSwweDlDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDI3LDB4MzgsIDB4MDAsMHgwMSwgMHhDMCwweDJFLCAweDcyLDB4MDAsIDB4RDcsMHgwMCwgMHgwQSwweDAxLCAweEUwLDB4MDAsIAorMHgwMSwweEQwLCAweEY3LDB4MDUsIDB4N0EsMHgxOCwgMHg5NSwweEFBLCAweDAwLDB4MUMsIDB4RjYsMHgwNiwgMHg0QSwweDk4LCAweDA2LDB4QUMsIAorMHgwMCwweDAxLCAweDc3LDB4MzUsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweDA3LDB4MzgsIAorMHgwMCwweDBDLCAweEE0LDB4QkEsIDB4NjAsMHgwMiwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTQsMHhBQSwgMHgwMCwweDEwLCAweEM3LDB4MzgsIAorMHg2MCwweDAwLCAweDg3LDB4M0EsIDB4MDAsMHgwNCwgMHhGMCwweDA1LCAweDdBLDB4MTgsIDB4OTcsMHgyQSwgMHgwMCwweDE0LCAweEY1LDB4MDUsIAorMHg3OSwweEQ4LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDAxLDB4RjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDQsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDM4LCAweEY3LDB4MDQsIAorMHg3QSwweDEwLCAweEY2LDB4ODQsIDB4M0IsMHg2NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweDQ3LDB4MEMsIAorMHgwMCwweDAxLCAweEQ3LDB4MDAsIDB4MEEsMHg3MCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgwMiwweDRDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzUsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgwMiwweDRDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDc1LDB4RjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MDIsMHg4NSwgMHhGNCwweDgyLCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEYzLDB4MDIsIAorMHgwMCwweDEyLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDAyLDB4NzQsIDB4QjMsMHgzQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIAorMHgyRCwweDM4LCAweEYzLDB4MDYsIDB4MkEsMHg2QywgMHhGMywweDA1LCAweDJDLDB4MTAsIDB4RTAsMHgwMCwgMHgwNSwweDI4LCAweEYwLDB4MDUsIAorMHg3QSwweDE4LCAweEYzLDB4ODQsIDB4NzksMHhEOCwgMHhGNiwweDg0LCAweDRBLDB4QTAsIDB4MjMsMHgxNCwgMHgwMCwweDIwLCAweDkzLDB4MTYsIAorMHhGRiwweEM0LCAweDg0LDB4MUUsIDB4MDAsMHgxMCwgMHg5NiwweDk2LCAweEZGLDB4RDQsIDB4RjcsMHgwNCwgMHg0QSwweDlDLCAweDk0LDB4MTYsIAorMHhGRiwweEUwLCAweDg1LDB4MUUsIDB4MDAsMHgxNCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RUMsMHgwMCwgMHgwMywweDZDLCAweDk1LDB4MTYsIAorMHhGRiwweEU0LCAweDc3LDB4MzUsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEYzLDB4MDYsIAorMHg0QSwweDk4LCAweEM2LDB4QjgsIDB4MzAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MEMsIDB4QzUsMHg4NCwgMHgwMCwweDAwLCAweDg3LDB4MzYsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDQyLDB4MDAsIDB4RTYsMHgwMCwgMHgwMiwweEZDLCAweEM2LDB4MjQsIAorMHgwMCwweDAwLCAweDg3LDB4MzYsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg1MiwweDAwLCAweEU2LDB4MDAsIAorMHgwMywweDAwLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgwMywweDBELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNSwweDgyLCAweDAwLDB4MDAsIDB4ODYsMHgzNiwgMHgwMCwweDAwLCAweDg3LDB4MTYsIAorMHhGRiwweEUwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDMyLCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHgwMywweDQ4LCAweEY1LDB4MDIsIAorMHgwMCwweDAwLCAweEMwLDB4MzIsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDAzLDB4NTAsIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweDg2LDB4QjYsIAorMHgwMCwweDA0LCAweDg3LDB4MTYsIDB4RkYsMHhFNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEUyLDB4MDAsIAorMHgwMywweDUxLCAweDIwLDB4MkEsIDB4MDAsMHgwMCwgMHhGNSwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgwMywweDYxLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhGNSwweDgyLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgwMywweDcwLCAweDIwLDB4MjYsIDB4MDAsMHgwMCwgMHhGNCwweDgyLCAweDAwLDB4MDEsIDB4MjAsMHgyNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgwMywweEE1LCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHg4NywweDE2LCAweEZGLDB4RDQsIDB4RjMsMHgwNiwgMHg0QSwweDk4LCAweDc2LDB4QjksIAorMHgwMCwweDAxLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHg3NiwweEI1LCAweDAwLDB4MDIsIDB4QzYsMHhCNCwgMHgzMCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDE0LCAweDg2LDB4QjYsIDB4MDAsMHgwMCwgMHg5NywweDE2LCAweEZGLDB4RDgsIDB4RTAsMHgwMCwgMHgwNCwweDE4LCAweDk2LDB4OTYsIAorMHhGRiwweERDLCAweDI3LDB4MTQsIDB4MDAsMHgyQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4ODMsMHgxNiwgMHhGRiwweEM0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHhGMywweDA2LCAweDRBLDB4OTgsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDkzLDB4OTYsIAorMHhGRiwweENDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDI1LDB4NjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDgzLDB4OTYsIAorMHhGRiwweENDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDA0LDB4MTUsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4MTYsIAorMHhGRiwweEQ0LCAweEYzLDB4MDYsIDB4NEEsMHg5OCwgMHg3NiwweEI5LCAweDAwLDB4MDEsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweDc2LDB4QjUsIAorMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4MzAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MTQsIDB4ODYsMHhCNiwgMHgwMCwweDAwLCAweDk3LDB4MTYsIAorMHhGRiwweEQ4LCAweDk2LDB4OTYsIDB4RkYsMHhEQywgMHhGNywweDA1LCAweDRBLDB4QTAsIDB4RTAsMHgwMCwgMHgwNCwweDFDLCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgwNCwweDJDLCAweEY0LDB4ODIsIAorMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4MDQsMHg4NCwgMHhGNCwweDgyLCAweDAwLDB4MDAsIDB4ODYsMHg5NiwgMHhGRiwweEQ4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDc3LDB4MzUsIDB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEY2LDB4ODYsIAorMHg0MiwweEM4LCAweEE2LDB4M0EsIDB4NjgsMHgwMiwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4NzUsMHgzOSwgMHgwMCwweDFFLCAweDc1LDB4MjgsIAorMHhGRiwweEU1LCAweDA1LDB4QjgsIDB4MDAsMHgwMiwgMHg4NiwweEFFLCAweDAwLDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDA0LCAweDk3LDB4MTYsIAorMHhGRiwweEVDLCAweEM2LDB4MzAsIDB4NTcsMHhDMCwgMHg3NiwweDMwLCAweEZGLDB4RjAsIDB4OTYsMHgxNiwgMHhGRiwweEY0LCAweDc1LDB4QUQsIAorMHgwMCwweDFFLCAweDc1LDB4QUMsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDVGLDB4QzAsIDB4NzYsMHhCNCwgMHhGRiwweEYwLCAweDk2LDB4OTYsIAorMHhGRiwweEYwLCAweDIwLDB4MjYsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDA1LDB4MjUsIDB4RjMsMHgwNiwgMHgyOSwweEUwLCAweDg2LDB4OTYsIAorMHhGRiwweEYwLCAweEY1LDB4ODIsIDB4MDAsMHgwMCwgMHhDNywweDM0LCAweDY4LDB4MDAsIDB4QzQsMHg5QywgMHg3MiwweDAwLCAweEMwLDB4MkUsIAorMHg2QSwweDAwLCAweEVDLDB4MDAsIDB4MDQsMHhGMCwgMHhDNSwweDI0LCAweDAwLDB4MDAsIDB4QzYsMHgyQywgMHgwMCwweDAwLCAweDg3LDB4MTYsIAorMHhGRiwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhBNiwweEIyLCAweDcwLDB4MDIsIDB4MDUsMHhBQywgMHgwMCwweDAxLCAweEM3LDB4MzAsIAorMHg3MCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjQsIAorMHhGRiwweEYwLCAweEY2LDB4QUIsIDB4MjgsMHgwMCwgMHgwNSwweDI4LCAweDAwLDB4MDIsIDB4ODcsMHgxNiwgMHhGRiwweEYwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MkUsIDB4NzIsMHgwMCwgMHhFQywweDAwLCAweDA0LDB4QjEsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweEYzLDB4MDIsIAorMHgwMCwweDAzLCAweEYzLDB4MDUsIDB4NzYsMHhGNCwgMHg4NywweDE2LCAweEZGLDB4RjAsIDB4ODYsMHg5RSwgMHgwMCwweDA0LCAweEM3LDB4MzgsIAorMHg3MCwweDAwLCAweEM3LDB4MzgsIDB4NDgsMHgwMCwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4ODcsMHgxNiwgMHhGRiwweEY0LCAweDA2LDB4QjQsIAorMHgwMCwweDIwLCAweDk3LDB4MDIsIDB4RkYsMHg2QywgMHg5NCwweDgyLCAweEZGLDB4NTAsIDB4OTYsMHg4MiwgMHhGRiwweDU4LCAweEYzLDB4MDYsIAorMHgyOSwweEUwLCAweEYzLDB4MDUsIDB4MkMsMHgxMCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweEY3LDB4MDQsIDB4N0EsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgwNSwweENELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDdBLDB4MTAsIDB4RjYsMHg4NCwgMHgzQiwweDY0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NkEsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgwNSwweENELCAweEY1LDB4ODYsIDB4NEEsMHg5OCwgMHhGNiwweDA0LCAweDc5LDB4RDgsIDB4RjYsMHg4NCwgMHg0RiwweDU0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDk2LDB4QjIsIDB4MDAsMHgxQywgMHgwNiwweEI0LCAweDAwLDB4MDEsIDB4NzcsMHgzNSwgMHgwMCwweDAxLCAweEM3LDB4MzgsIAorMHg2OCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHgwNywweDM4LCAweDAwLDB4MEMsIDB4QTUsMHgzQSwgMHg1OCwweDAyLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDk1LDB4MzIsIDB4MDAsMHgxMCwgMHhDNywweDM4LCAweDU4LDB4MDAsIDB4ODcsMHgzQSwgMHgwMCwweDA0LCAweEYwLDB4MDUsIAorMHg3QSwweDE4LCAweDk3LDB4MzIsIDB4MDAsMHgxNCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgwMSwweEY0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEUwLDB4MDAsIDB4MDUsMHhGQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEY1LDB4MDIsIAorMHgwMCwweDEyLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDA1LDB4RjQsIDB4QjUsMHgzQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIAorMHgyRCwweDM4LCAweEY1LDB4MDYsIDB4MkEsMHg2QywgMHhGNSwweDA1LCAweDJDLDB4MTAsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHg4NSwweDk2LCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHg3NSwweEVDLCAweDg1LDB4MkUsIAorMHgwMCwweDIwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDA2LDB4Q0MsIDB4RjUsMHgwNSwgMHg3QSwweDA4LCAweEY3LDB4MDQsIAorMHg3NSwweEYwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgwNiwweENDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4N0EsMHgwOCwgMHhGNiwweDg0LCAweDNCLDB4NjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIAorMHg2QSwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHhENywweDAwLCAweDBBLDB4NzAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgwNiwweENDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDJFLCAweDAwLDB4MUMsIDB4RjYsMHg4NCwgMHg0RiwweDU0LCAweEY3LDB4MDUsIAorMHg3QSwweDAwLCAweEM3LDB4MzQsIDB4NzIsMHgwMCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RUUsMHgwMCwgMHgwNiwweDhELCAweEY1LDB4MDIsIAorMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4MDYsMHg5MCwgMHhGNSwweDA1LCAweDc5LDB4RjgsIDB4RjAsMHg4NSwgMHg3OSwweEY4LCAweEY2LDB4ODQsIAorMHg3QSwweDAwLCAweEM3LDB4MzgsIDB4NzAsMHgwMCwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4RjcsMHgwNCwgMHg3OSwweEY4LCAweEY2LDB4ODUsIAorMHg3OSwweEU4LCAweEM3LDB4MzgsIDB4NzAsMHgwMCwgMHhDNiwweDM0LCAweDcwLDB4MDAsIDB4RjcsMHgwNCwgMHg0QSwweDlDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFQywweDAwLCAweDA2LDB4Q0MsIDB4RjYsMHgwNSwgMHg3OSwweEYwLCAweDIwLDB4MzYsIAorMHgwMCwweDAwLCAweEVDLDB4MDAsIDB4MDYsMHhGOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEY1LDB4MDIsIAorMHgwMCwweDEzLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDA3LDB4MzgsIDB4QjUsMHgzQSwgMHg2OCwweDAyLCAweEUwLDB4MDAsIAorMHgwNywweDM4LCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNywweDA0LCAweDRBLDB4OUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzIsIAorMHg3MiwweDAwLCAweEVFLDB4MDAsIDB4MDcsMHgxOSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg0QSwweDlDLCAweEUwLDB4MDAsIAorMHgwNywweDI4LCAweEY3LDB4MDUsIDB4NzksMHhGMCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RUMsMHgwMCwgMHgwNywweDI4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEYwLDB4ODUsIDB4NzksMHhGMCwgMHhGNSwweDg1LCAweDc5LDB4RTAsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgwNywweDRDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDA0LCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHgzOCwgMHhGNywweDA0LCAweDc1LDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MDcsMHhBNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3NSwweEYwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDA3LDB4QTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHg3QSwweDA4LCAweEY2LDB4ODQsIDB4M0IsMHg2NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweDQ3LDB4MEMsIAorMHgwMCwweDAxLCAweEQ3LDB4MDAsIDB4MEEsMHg3MCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgwNywweEQ1LCAweEY0LDB4MDIsIAorMHgwMCwweDAwLCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGMywweDAyLCAweDAwLDB4MTMsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIAorMHgwNywweENDLCAweEIzLDB4M0EsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RTAsMHgwMCwgMHgwQSwweEE0LCAweEYzLDB4MDYsIAorMHgyQiwweDg0LCAweEY2LDB4ODQsIDB4NzksMHhFOCwgMHhGNiwweDA2LCAweDRBLDB4OTgsIDB4NzcsMHgzNSwgMHgwMCwweDAxLCAweEM3LDB4MzgsIAorMHg2OCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGNiwweDg0LCAweDc5LDB4RTAsIDB4MDcsMHgzOCwgMHgwMCwweDBDLCAweEEzLDB4M0EsIAorMHg2MCwweDAyLCAweEMzLDB4QjQsIDB4MDAsMHgwMCwgMHg5MywweDM2LCAweDAwLDB4MTAsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweDg3LDB4M0EsIAorMHgwMCwweDA0LCAweDIzLDB4MTQsIDB4MDAsMHgyMCwgMHg5MywweDE2LCAweEZGLDB4QzQsIDB4OTcsMHgzNiwgMHgwMCwweDE0LCAweDg0LDB4OUUsIAorMHgwMCwweDEwLCAweEY2LDB4ODQsIDB4NEEsMHhBMCwgMHg5NCwweDk2LCAweEZGLDB4RTAsIDB4OTYsMHg5NiwgMHhGRiwweEQ0LCAweDg1LDB4MUUsIAorMHgwMCwweDE0LCAweEY3LDB4MDQsIDB4NEEsMHg5QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEVDLDB4MDAsIAorMHgwOCwweEVDLCAweDk1LDB4MTYsIDB4RkYsMHhFNCwgMHg3NywweDM1LCAweDAwLDB4MDEsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDc3LDB4MzksIAorMHgwMCwweDAyLCAweEM2LDB4QjgsIDB4NjAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MEMsIDB4QzUsMHg4NCwgMHgwMCwweDAwLCAweDg3LDB4MzYsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDRBLDB4MDAsIDB4RTYsMHgwMCwgMHgwOCwweDdDLCAweEM2LDB4MjAsIAorMHgwMCwweDAwLCAweDg3LDB4MzYsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg1MiwweDAwLCAweEU2LDB4MDAsIAorMHgwOCwweDgwLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgwOCwweDhELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNSwweDgyLCAweDAwLDB4MDAsIDB4ODYsMHgzNiwgMHgwMCwweDAwLCAweDg3LDB4MTYsIAorMHhGRiwweEUwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDMyLCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHgwOCwweEM4LCAweEY1LDB4MDIsIAorMHgwMCwweDAwLCAweEMwLDB4MzIsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDA4LDB4RDAsIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweDg2LDB4QjYsIAorMHgwMCwweDA0LCAweDg3LDB4MTYsIDB4RkYsMHhFNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEUyLDB4MDAsIAorMHgwOCwweEQxLCAweDIwLDB4MkEsIDB4MDAsMHgwMCwgMHhGNSwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgwOCwweEUxLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhGNSwweDgyLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgwOCwweEYwLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhGNCwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgwOSwweDI1LCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHg4NywweDE2LCAweEZGLDB4RDQsIDB4RjMsMHgwNiwgMHg0QSwweDk4LCAweDc2LDB4QjksIAorMHgwMCwweDAxLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHg3NiwweEI1LCAweDAwLDB4MDIsIDB4QzYsMHhCNCwgMHgzMCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDE0LCAweDg2LDB4QjYsIDB4MDAsMHgwMCwgMHg5NywweDE2LCAweEZGLDB4RDgsIDB4RTAsMHgwMCwgMHgwOSwweDk4LCAweDk2LDB4OTYsIAorMHhGRiwweERDLCAweDI3LDB4MTQsIDB4MDAsMHgyQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4ODMsMHgxNiwgMHhGRiwweEM0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHhGMywweDA2LCAweDRBLDB4OTgsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDkzLDB4OTYsIAorMHhGRiwweENDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDI1LDB4NjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDgzLDB4OTYsIAorMHhGRiwweENDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDA5LDB4OTUsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4MTYsIAorMHhGRiwweEQ0LCAweEYzLDB4MDYsIDB4NEEsMHg5OCwgMHg3NiwweEI5LCAweDAwLDB4MDEsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweDc2LDB4QjUsIAorMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4MzAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MTQsIDB4ODYsMHhCNiwgMHgwMCwweDAwLCAweDk3LDB4MTYsIAorMHhGRiwweEQ4LCAweDk2LDB4OTYsIDB4RkYsMHhEQywgMHhGNywweDA1LCAweDRBLDB4QTAsIDB4RTAsMHgwMCwgMHgwOSwweDlDLCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgwOSwweEFDLCAweEY0LDB4ODIsIAorMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4MEEsMHgwNCwgMHhGNCwweDgyLCAweDAwLDB4MDAsIDB4ODYsMHg5NiwgMHhGRiwweEQ4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDc3LDB4MzUsIDB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEY2LDB4ODYsIAorMHg0MiwweEM4LCAweEE2LDB4M0EsIDB4NjgsMHgwMiwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4NzUsMHgzOSwgMHgwMCwweDFFLCAweDc1LDB4MjgsIAorMHhGRiwweEU1LCAweDA1LDB4QjgsIDB4MDAsMHgwMiwgMHg4NiwweEFFLCAweDAwLDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDA0LCAweDk3LDB4MTYsIAorMHhGRiwweEVDLCAweEM2LDB4MzAsIDB4NTcsMHhDMCwgMHg3NiwweDMwLCAweEZGLDB4RjAsIDB4OTYsMHgxNiwgMHhGRiwweEY0LCAweDc1LDB4QUQsIAorMHgwMCwweDFFLCAweDc1LDB4QUMsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDVGLDB4QzAsIDB4NzYsMHhCNCwgMHhGRiwweEYwLCAweDk2LDB4OTYsIAorMHhGRiwweEYwLCAweDIwLDB4MjYsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDBBLDB4QTUsIDB4RjMsMHgwNiwgMHgyQSwweEY4LCAweDg2LDB4OTYsIAorMHhGRiwweEYwLCAweEY1LDB4ODIsIDB4MDAsMHgwMCwgMHhDNywweDM0LCAweDY4LDB4MDAsIDB4QzQsMHg5QywgMHg3MiwweDAwLCAweEMwLDB4MkUsIAorMHg2QSwweDAwLCAweEVDLDB4MDAsIDB4MEEsMHg3MCwgMHhDNSwweDI0LCAweDAwLDB4MDAsIDB4QzYsMHgyQywgMHgwMCwweDAwLCAweDg3LDB4MTYsIAorMHhGRiwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhBNiwweEIyLCAweDcwLDB4MDIsIDB4MDUsMHhBQywgMHgwMCwweDAxLCAweEM3LDB4MzAsIAorMHg3MCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjQsIAorMHhGRiwweEYwLCAweEY2LDB4QUIsIDB4MjgsMHgwMCwgMHgwNSwweDI4LCAweDAwLDB4MDIsIDB4ODcsMHgxNiwgMHhGRiwweEYwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MkUsIDB4NzIsMHgwMCwgMHhFQywweDAwLCAweDBBLDB4MzEsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweEYzLDB4MDIsIAorMHgwMCwweDAyLCAweEYzLDB4MDUsIDB4NzYsMHhGNCwgMHg4NywweDE2LCAweEZGLDB4RjAsIDB4ODYsMHg5RSwgMHgwMCwweDA0LCAweEM3LDB4MzgsIAorMHg3MCwweDAwLCAweEM3LDB4MzgsIDB4NDgsMHgwMCwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4ODcsMHgxNiwgMHhGRiwweEY0LCAweDA2LDB4QjQsIAorMHgwMCwweDIwLCAweDk3LDB4MDIsIDB4RkYsMHg2QywgMHg5NCwweDgyLCAweEZGLDB4NTAsIDB4OTYsMHg4MiwgMHhGRiwweDU4LCAweEYzLDB4MDYsIAorMHgyQSwweEY4LCAweEYzLDB4MDUsIDB4MkMsMHgxQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweEY2LDB4ODQsIDB4NzksMHhFOCwgMHhGNywweDA0LCAweDc5LDB4RjgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM2LDB4QjQsIAorMHg3MCwweDAwLCAweEY3LDB4MDQsIDB4N0EsMHgyMCwgMHhGNiwweDg1LCAweDc5LDB4RTgsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIAorMHg3QSwweDIwLCAweEY3LDB4MDQsIDB4NzksMHhGMCwgMHhGNiwweDA0LCAweDdBLDB4MjAsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHgwQiwweDJDLCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjUsMHg4MiwgMHgwMCwweDEzLCAweDIwLDB4MzIsIAorMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4MEIsMHgyMCwgMHhCNSwweEJBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY1LDB4ODYsIAorMHgyQiwweDg0LCAweEUwLDB4MDAsIDB4MEIsMHgzOCwgMHhGNSwweDg1LCAweDJDLDB4MUMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgwNywweDRDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweEY3LDB4MDYsIDB4MkMsMHgxMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgyOSwweEUwLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE0LDB4RjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHgyQywweDEwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDJBLDB4NkMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgyQywweDFDLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MkEsMHhGOCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNCwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDJDLDB4MUMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHgyQiwweDg0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNCwweEY0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweEYwLDB4MDUsIAorMHgyRCwweDM4LCAweEYwLDB4MDUsIDB4MkQsMHgzQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHgxOCwgMHhGRiwweDg1LCAweDJFLDB4REMsIDB4RjcsMHgwNiwgMHgwQywweDNFLCAweEM3LDB4N0MsIAorMHg3NCwweDAwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDE0LDB4MjksIDB4OTcsMHgxNiwgMHhGRiwweEY0LCAweDQ3LDB4MzgsIAorMHhGRiwweEZCLCAweEY2LDB4ODQsIDB4NkYsMHg1MCwgMHhDRiwweEI4LCAweDAwLDB4MDAsIDB4ODMsMHg5NiwgMHhGRiwweEY0LCAweEY3LDB4MDIsIAorMHgwMCwweDNGLCAweEMzLDB4OUMsIDB4NkQsMHg4MCwgMHhDNywweDFDLCAweDc0LDB4MDAsIDB4MjAsMHgzQSwgMHgwMCwweDNGLCAweEUyLDB4MDAsIAorMHgxMiwweDYwLCAweDkzLDB4OTYsIDB4RkYsMHhGNCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjYsMHg4MiwgMHgwQywweDVDLCAweEE2LDB4QjYsIAorMHg3MCwweDAyLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMSwweDM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgxMiwweDYwLCAweDAwLDB4MDAsIAorMHgxMiwweDYwLCAweDAwLDB4MDAsIDB4MEQsMHg2OCwgMHgwMCwweDAwLCAweDBELDB4NjgsIDB4MDAsMHgwMCwgMHgwRCwweDVDLCAweDAwLDB4MDAsIAorMHgwRCwweDVDLCAweDAwLDB4MDAsIDB4MEQsMHg2OCwgMHgwMCwweDAwLCAweDBELDB4NjgsIDB4MDAsMHgwMCwgMHgxMiwweDUwLCAweDAwLDB4MDAsIAorMHgxMiwweDUwLCAweDAwLDB4MDAsIDB4MTIsMHgzQywgMHgwMCwweDAwLCAweDEyLDB4M0MsIDB4MDAsMHgwMCwgMHgwRCwweEUwLCAweDAwLDB4MDAsIAorMHgwRCwweEUwLCAweDAwLDB4MDAsIDB4MTIsMHgzQywgMHgwMCwweDAwLCAweDEyLDB4M0MsIDB4MDAsMHgwMCwgMHgwRCwweEU4LCAweDAwLDB4MDAsIAorMHgwRCwweEY0LCAweDAwLDB4MDAsIDB4MEUsMHgwMCwgMHgwMCwweDAwLCAweDBFLDB4MjAsIDB4MDAsMHgwMCwgMHgwRSwweDQwLCAweDAwLDB4MDAsIAorMHgwRSwweDYwLCAweDAwLDB4MDAsIDB4MEUsMHg4MCwgMHgwMCwweDAwLCAweDBFLDB4QTAsIDB4MDAsMHgwMCwgMHgwRSwweEMwLCAweDAwLDB4MDAsIAorMHgwRSwweEM4LCAweDAwLDB4MDAsIDB4MEUsMHhEMCwgMHgwMCwweDAwLCAweDEyLDB4MjgsIDB4MDAsMHgwMCwgMHgwRSwweEQ4LCAweDAwLDB4MDAsIAorMHgwRSwweEY0LCAweDAwLDB4MDAsIDB4MEYsMHgxMCwgMHgwMCwweDAwLCAweDEyLDB4MjgsIDB4MDAsMHgwMCwgMHgwRiwweDE4LCAweDAwLDB4MDAsIAorMHgwRiwweDE4LCAweDAwLDB4MDAsIDB4MEYsMHgyNCwgMHgwMCwweDAwLCAweDBGLDB4MjQsIDB4MDAsMHgwMCwgMHgwRiwweDQ0LCAweDAwLDB4MDAsIAorMHgwRiwweDQ0LCAweDAwLDB4MDAsIDB4MEYsMHg2NCwgMHgwMCwweDAwLCAweDBGLDB4NjQsIDB4MDAsMHgwMCwgMHgwRiwweDg0LCAweDAwLDB4MDAsIAorMHgwRiwweDg0LCAweDAwLDB4MDAsIDB4MEYsMHg4QywgMHgwMCwweDAwLCAweDBGLDB4OEMsIDB4MDAsMHgwMCwgMHgwRiwweDk0LCAweDAwLDB4MDAsIAorMHgwRiwweDk0LCAweDAwLDB4MDAsIDB4MEYsMHhCMCwgMHgwMCwweDAwLCAweDBGLDB4QjAsIDB4MDAsMHgwMCwgMHgwRiwweEI4LCAweDAwLDB4MDAsIAorMHgwRiwweEQ4LCAweDAwLDB4MDAsIDB4MEYsMHhGOCwgMHgwMCwweDAwLCAweDEwLDB4MkMsIDB4MDAsMHgwMCwgMHgxMCwweDYwLCAweDAwLDB4MDAsIAorMHgxMCwweDk0LCAweDAwLDB4MDAsIDB4MTAsMHhDOCwgMHgwMCwweDAwLCAweDEwLDB4RkMsIDB4MDAsMHgwMCwgMHgxMSwweDMwLCAweDAwLDB4MDAsIAorMHgxMSwweDRDLCAweDAwLDB4MDAsIDB4MTEsMHg2OCwgMHgwMCwweDAwLCAweDEyLDB4MTQsIDB4MDAsMHgwMCwgMHgxMSwweDg0LCAweDAwLDB4MDAsIAorMHgxMSwweEI0LCAweDAwLDB4MDAsIDB4MTEsMHhFNCwgMHgwMCwweDAwLCAweDEyLDB4MTQsIDB4RjMsMHg4MiwgMHgwMCwweDA2LCAweEUwLDB4MDAsIAorMHgxMiwweDU0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGNiwweDAyLCAweDAwLDB4MDUsIDB4MjAsMHgzMiwgMHgwMCwweDE0LCAweEU2LDB4MDAsIAorMHgwRCwweEI1LCAweDI3LDB4MDAsIDB4MDAsMHgxMCwgMHgyMCwweDNBLCAweDAwLDB4MDEsIDB4RTIsMHgwMCwgMHgwRCwweEI1LCAweEY3LDB4MDYsIAorMHgyRCwweENDLCAweEY2LDB4ODQsIDB4MkUsMHhDQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzUsMHhCNSwgMHgwMCwweDAyLCAweEI2LDB4MkUsIAorMHg3MCwweDAyLCAweDA2LDB4QjQsIDB4MDAsMHgwMSwgMHhGNiwweDg1LCAweDJFLDB4Q0MsIDB4ODYsMHgwMiwgMHhGRiwweDM0LCAweEY3LDB4MDYsIAorMHgyRSwweDRDLCAweDIwLDB4MzYsIDB4MDAsMHgxRiwgMHhFMiwweDAwLCAweDBELDB4QjUsIDB4QjYsMHgyRSwgMHg3MCwweDAyLCAweEYwLDB4MDUsIAorMHgyRSwweENDLCAweEY3LDB4MDQsIDB4MkQsMHg1OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzQSwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4M0EsIDB4MDAsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEMxLDB4MzgsIAorMHgwMCwweDAwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhFMCwweDAwLCAweDEyLDB4NjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEUwLDB4MDAsIAorMHgxMiwweDQwLCAweEYzLDB4ODIsIDB4MDAsMHgwNiwgMHhGMywweDgyLCAweDAwLDB4MEIsIDB4RTAsMHgwMCwgMHgxMiwweDU0LCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgwNywgMHhFMCwweDAwLCAweDEyLDB4NTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIAorMHgwMCwweDBCLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDg0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgwNSwgMHhFMCwweDAwLCAweDEyLDB4NTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIAorMHgwMCwweDA3LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDg0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgwNSwgMHhFMCwweDAwLCAweDEyLDB4NTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIAorMHgwMCwweDBCLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDg0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgwNiwgMHhFMCwweDAwLCAweDEyLDB4NTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIAorMHgwMCwweDA3LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDg0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgwNiwgMHhFMCwweDAwLCAweDEyLDB4NTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIAorMHgwMCwweDBCLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDg0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgwNSwgMHhFMCwweDAwLCAweDEyLDB4NTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIAorMHgwMCwweDA3LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDg0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgwNSwgMHhFMCwweDAwLCAweDEyLDB4NTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweEUwLDB4MDAsIAorMHgxMiwweDQwLCAweEYzLDB4ODIsIDB4MDAsMHgwQiwgMHhFMCwweDAwLCAweDEyLDB4NDAsIDB4RjMsMHg4MiwgMHgwMCwweDA3LCAweEUwLDB4MDAsIAorMHgxMiwweDJDLCAweEYzLDB4ODIsIDB4MDAsMHgwQiwgMHhGMywweDgyLCAweDAwLDB4MEIsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMCwgMHgxMiwweDQwLCAweEYzLDB4ODIsIAorMHgwMCwweDA2LCAweEYzLDB4ODIsIDB4MDAsMHgwNywgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNSwweDg0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhFMCwweDAwLCAweDEyLDB4NDAsIDB4RjMsMHg4MiwgMHgwMCwweDA2LCAweEUwLDB4MDAsIAorMHgxMiwweDJDLCAweEYzLDB4ODIsIDB4MDAsMHgwQiwgMHhGMywweDgyLCAweDAwLDB4MTQsIDB4RTAsMHgwMCwgMHgxMiwweDU0LCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgxNCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNSwweDg0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MDUsIDB4RTAsMHgwMCwgMHgxMiwweDU0LCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgxNCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNSwweDg0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MDYsIDB4RTAsMHgwMCwgMHgxMiwweDU0LCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgxNCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNSwweDg0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MDUsIDB4RTAsMHgwMCwgMHgxMiwweDU0LCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweEUwLDB4MDAsIDB4MTIsMHg0MCwgMHhGMywweDgyLCAweDAwLDB4MTQsIDB4RTAsMHgwMCwgMHgxMiwweDJDLCAweEYzLDB4ODIsIAorMHgwMCwweDE0LCAweEYzLDB4ODIsIDB4MDAsMHgxNCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNSwweDg0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhFMCwweDAwLCAweDEyLDB4NDAsIDB4RjMsMHg4MiwgMHgwMCwweDA2LCAweEUwLDB4MDAsIAorMHgxMiwweDJDLCAweEYzLDB4ODIsIDB4MDAsMHgxNCwgMHhGMywweDgyLCAweDAwLDB4MTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweDBCLCAweEUwLDB4MDAsIAorMHgxMiwweDU0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweDA3LCAweEUwLDB4MDAsIAorMHgxMiwweDU0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweDBCLCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE1LDB4ODQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIAorMHgwMCwweDA1LCAweEUwLDB4MDAsIDB4MTIsMHg1NCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweDE0LCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE1LDB4ODQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIAorMHgwMCwweDA3LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDg0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgwNSwgMHhFMCwweDAwLCAweDEyLDB4NTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIAorMHgwMCwweDE0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDg0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgwQiwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNSwweDg0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MDYsIDB4RTAsMHgwMCwgMHgxMiwweDU0LCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgxNCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNSwweDg0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MDcsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweDA2LCAweEUwLDB4MDAsIAorMHgxMiwweDU0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweDBCLCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE1LDB4ODQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIAorMHgwMCwweDA1LCAweEUwLDB4MDAsIDB4MTIsMHg1NCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweDE0LCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE1LDB4ODQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIAorMHgwMCwweDA3LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDg0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgwNSwgMHhFMCwweDAwLCAweDEyLDB4NTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIAorMHgwMCwweDE0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDg0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEUwLDB4MDAsIDB4MTIsMHg0MCwgMHhGMywweDgyLCAweDAwLDB4MEIsIDB4RjMsMHg4MiwgMHgwMCwweDE0LCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE1LDB4ODQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEUwLDB4MDAsIAorMHgxMiwweDQwLCAweEYzLDB4ODIsIDB4MDAsMHgwNywgMHhGMywweDgyLCAweDAwLDB4MTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMCwgMHgxMiwweDJDLCAweEYzLDB4ODIsIAorMHgwMCwweDBCLCAweEYzLDB4ODIsIDB4MDAsMHgxNCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNSwweDg0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MEIsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMCwgMHgxMiwweDQwLCAweEYzLDB4ODIsIAorMHgwMCwweDA2LCAweEYzLDB4ODIsIDB4MDAsMHgxNCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNSwweDg0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MDcsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMCwgMHgxMiwweDQwLCAweEYzLDB4ODIsIAorMHgwMCwweDA2LCAweEYzLDB4ODIsIDB4MDAsMHgxNCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNSwweDg0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhFMCwweDAwLCAweDEyLDB4MkMsIDB4RjMsMHg4MiwgMHgwMCwweDBCLCAweEY3LDB4MDQsIAorMHgzNSwweDI4LCAweEY2LDB4ODIsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxMywweENDLCAweEY3LDB4MDUsIAorMHgzNSwweDQ0LCAweEYzLDB4ODIsIDB4MDAsMHgxNCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNSwweDg0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MDcsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg4NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweDA1LCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE1LDB4ODQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDkwLDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE1LDB4ODQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDgzLDB4OTYsIAorMHhGRiwweEY0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweDlDLCAweDAwLDB4MTQsIDB4NzAsMHgzRSwgMHhGRiwweEUxLCAweEU2LDB4MDAsIAorMHgxMiwweDlELCAweEY3LDB4MDYsIDB4MDQsMHgwMCwgMHhGNywweDA0LCAweDZGLDB4NUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NkYsMHg1QywgMHhGNywweDA0LCAweDZGLDB4NUMsIDB4RTAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDgzLDB4OTYsIDB4RkYsMHhGNCwgMHhGNywweDA2LCAweDA0LDB4MDAsIDB4QzAsMHgxRSwgMHg3NCwweDAwLCAweEU2LDB4MDAsIAorMHgxNCwweDI5LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDJFLDB4RDAsIDB4RjYsMHg4NCwgMHgzNSwweDI0LCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDE0LDB4MDUsIDB4RjcsMHgwNSwgMHgyRSwweEQwLCAweEY3LDB4MDQsIAorMHhFMCwweDE0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgxNCwweDA1LCAweEY2LDB4ODIsIAorMHgwMCwweDAwLCAweEY2LDB4ODUsIDB4RTAsMHgxNCwgMHhGNywweDA0LCAweDJFLDB4RDgsIDB4QzUsMHgzNCwgMHgwMCwweDAwLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4MkUsMHhEOCwgMHgyMCwweDJBLCAweDAwLDB4MDIsIDB4RUUsMHgwMCwgMHgxMywweENDLCAweEY2LDB4ODIsIAorMHgwMCwweDAwLCAweEY2LDB4ODQsIDB4MzUsMHgyOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMiwgMHhFNiwweDAwLCAweDEzLDB4QTAsIDB4MDUsMHhCNCwgMHgwMCwweDA4LCAweDk1LDB4OTMsIAorMHhGRiwweEZDLCAweDk1LDB4MTYsIDB4RkYsMHhFOCwgMHg5NSwweDk2LCAweEZGLDB4RTQsIDB4OTYsMHg5NiwgMHhGRiwweEUwLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHg2NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODUsMHgxNiwgMHhGRiwweEU4LCAweDg1LDB4OTYsIAorMHhGRiwweEU0LCAweDg2LDB4OTYsIDB4RkYsMHhFMCwgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgxMywweDkwLCAweEY3LDB4MDIsIAorMHgwMCwweDAwLCAweDg2LDB4MzYsIDB4MDAsMHgwQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDBGLCAweEUyLDB4MDAsIAorMHgxMywweDc1LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4MTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweDk3LDB4MzYsIDB4MDAsMHgxNCwgMHg4NywweDM2LCAweDAwLDB4MTQsIDB4RTAsMHgwMCwgMHgxMywweDkwLCAweEY3LDB4MDIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDYwLDB4MDAsIDB4NzcsMHgzNSwgMHgwMCwweDA1LCAweEM3LDB4MzgsIAorMHg2QSwweDAwLCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MTAsIDB4QzcsMHgyQywgMHg3MCwweDAwLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MTIsMHgwMCwgMHhGNywweDA1LCAweDM1LDB4MkMsIDB4RjYsMHg4NCwgMHgzNSwweDI4LCAweEY3LDB4MDQsIAorMHg2RiwweDRDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHgxMywweEMwLCAweDA3LDB4MzQsIAorMHgxNCwweDk0LCAweEYzLDB4ODQsIDB4NkYsMHg0NCwgMHhFMCwweDAwLCAweDEzLDB4QzQsIDB4RjMsMHg4NSwgMHgzNSwweDI4LCAweEY3LDB4MDUsIAorMHgzNSwweDI4LCAweEUwLDB4MDAsIDB4MTIsMHhFOCwgMHgwNSwweDI4LCAweDAwLDB4MDEsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgxNCwweDI5LCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4RjAsMHgwNSwgMHgzNSwweDI0LCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjMsMHg4MiwgMHgwMCwweDBELCAweDIwLDB4MzIsIAorMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4MTQsMHgyOCwgMHhCMywweEJBLCAweDY4LDB4MDIsIDB4RTAsMHgwMCwgMHgxNCwweDI4LCAweEYwLDB4MDUsIAorMHgyRCwweDM4LCAweEY3LDB4MDQsIDB4RTAsMHgxMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgxNCwweDI5LCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHhGNywweDA1LCAweEUwLDB4MTAsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIAorMHgwMiwweDk4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNCwweDg0LCAweDJELDB4MzgsIDB4RjcsMHgwNCwgMHgyRCwweDNDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NEEsMHgwMCwgMHhFNiwweDAwLCAweDBDLDB4MDksIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweDc3LDB4MzksIAorMHgwMCwweDAyLCAweEE1LDB4M0EsIDB4NjgsMHgwMiwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgyQSwgMHgwMCwweDE0LCAweEU2LDB4MDAsIAorMHgxNCwweDkxLCAweDI3LDB4MjgsIDB4MDAsMHgxNSwgMHgyMCwweDNBLCAweDAwLDB4MDEsIDB4RTIsMHgwMCwgMHgxNCwweDkxLCAweEY3LDB4MDYsIAorMHgyRCwweENDLCAweEY2LDB4ODQsIDB4MkUsMHhDQywgMHg4NiwweDAyLCAweEZGLDB4MzQsIDB4NzUsMHhCNSwgMHgwMCwweDAyLCAweEI1LDB4MkUsIAorMHg3MCwweDAyLCAweDA2LDB4QjQsIDB4MDAsMHgwMSwgMHhGNiwweDg1LCAweDJFLDB4Q0MsIDB4RjcsMHgwNiwgMHgyRSwweDRDLCAweDIwLDB4MzYsIAorMHgwMCwweDFGLCAweEUyLDB4MDAsIDB4MTQsMHg5MSwgMHhCNiwweDJFLCAweDcwLDB4MDIsIDB4RjAsMHgwNSwgMHgyRSwweENDLCAweEY3LDB4MDYsIAorMHgyRCwweDQ0LCAweDc2LDB4QTksIDB4MDAsMHgwMiwgMHhBNywweDM2LCAweDcwLDB4MDIsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4M0EsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4ODcsMHgzNiwgMHgwMCwweDA0LCAweDk0LDB4OTYsIAorMHhGRiwweEVDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhDMSwweDM4LCAweDAwLDB4MDAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDQsIAorMHgyRCwweDNDLCAweDg0LDB4OTYsIDB4RkYsMHhFQywgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIAorMHgxNCwweDJDLCAweEY3LDB4MDUsIDB4MkQsMHgzQywgMHhFMCwweDAwLCAweDE0LDB4MkMsIDB4RjAsMHgwNSwgMHgyRCwweDNDLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4ODQsMHgxNiwgMHgwMCwweDAwLCAweEY3LDB4MDIsIAorMHgwMCwweDAwLCAweDg1LDB4OTYsIDB4MDAsMHgwNCwgMHgyMCwweDNBLCAweDAwLDB4MjEsIDB4RUUsMHgwMCwgMHgxNSwweDM0LCAweDk1LDB4QTIsIAorMHgwMCwweDAwLCAweEY2LDB4MDYsIDB4MjMsMHgzOCwgMHgwNywweDIwLCAweDAwLDB4ODQsIDB4QzYsMHhBMCwgMHgwMCwweDAwLCAweDk2LDB4M0EsIAorMHgwMCwweDA0LCAweDI3LDB4MzgsIDB4MDAsMHgwNCwgMHhDMCwweDNBLCAweDZBLDB4MDAsIDB4RUMsMHgwMCwgMHgxNSwweDIwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDA4LCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDg2LDB4OTYsIAorMHgwMCwweDAwLCAweDg3LDB4MTYsIDB4MDAsMHgwNCwgMHhGNiwweDA0LCAweDJELDB4NDAsIDB4OTcsMHgzNiwgMHgwMCwweDAwLCAweDk3LDB4MzYsIAorMHgwMCwweDA0LCAweDA3LDB4MzAsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAweDJELDB4NDAsIDB4OTYsMHgzNiwgMHgwMCwweDA4LCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDgsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4ODUsMHgxNiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4MkEsIDB4MDAsMHgxNCwgMHhFNiwweDAwLCAweDE1LDB4RDksIDB4MjcsMHgyOCwgMHgwMCwweDE1LCAweDIwLDB4M0EsIAorMHgwMCwweDAxLCAweEUyLDB4MDAsIDB4MTUsMHhEOSwgMHhGNywweDA2LCAweDJELDB4Q0MsIDB4RjYsMHg4NCwgMHgyRSwweENDLCAweDg2LDB4MDIsIAorMHhGRiwweDM0LCAweDc1LDB4QjUsIDB4MDAsMHgwMiwgMHhCNSwweDJFLCAweDcwLDB4MDIsIDB4MDYsMHhCNCwgMHgwMCwweDAxLCAweEY2LDB4ODUsIAorMHgyRSwweENDLCAweEY3LDB4MDYsIDB4MkUsMHg0QywgMHgyMCwweDM2LCAweDAwLDB4MUYsIDB4RTIsMHgwMCwgMHgxNSwweEQ5LCAweEI2LDB4MkUsIAorMHg3MCwweDAyLCAweEYwLDB4MDUsIDB4MkUsMHhDQywgMHhGNiwweDg2LCAweDJELDB4NDQsIDB4NzcsMHgyOSwgMHgwMCwweDAyLCAweEE2LDB4QkEsIAorMHg2OCwweDAyLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NiwweEI2LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MzgsIAorMHg2OCwweDAwLCAweDg3LDB4M0EsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEMxLDB4MzgsIAorMHgwMCwweDAwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDA0LCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDg3LDB4MTYsIDB4MDAsMHgwMCwgMHg4NiwweDk2LCAweDAwLDB4MDQsIDB4RjYsMHgwNiwgMHgyRCwweDQ0LCAweDc2LDB4QjUsIAorMHgwMCwweDAyLCAweDg1LDB4QkEsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QjUsMHhCNiwgMHg2MCwweDAyLCAweEM2LDB4QjQsIAorMHg3MCwweDAwLCAweDg1LDB4OTYsIDB4MDAsMHgwOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHhCNiwgMHgwMCwweDA0LCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MEMsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4ODYsMHgxNiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MzIsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDBGLCAweDg2LDB4QjIsIAorMHgwMCwweDAwLCAweEM1LDB4MzgsIDB4MDAsMHgwMCwgMHhFRSwweDAwLCAweDE2LDB4QjQsIDB4QzUsMHhCNCwgMHgwMCwweDAwLCAweDIwLDB4MzYsIAorMHgwMCwweDBGLCAweEVFLDB4MDAsIDB4MTYsMHhCNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEVDLDB4MDAsIAorMHgxNiwweEI1LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RUMsMHgwMCwgMHgxNiwweEQwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MzIsIDB4MDAsMHgwQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MzIsIAorMHgwMCwweDBDLCAweDg3LDB4MzIsIDB4MDAsMHgwQywgMHhFMCwweDAwLCAweDE2LDB4RDgsIDB4RjQsMHgwMiwgMHgwMCwweDAwLCAweEMwLDB4MkEsIAorMHg1QSwweDAwLCAweDQ0LDB4MEMsIDB4MDAsMHgwMSwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDA0LCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNywweDA2LCAweDJFLDB4RTAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHgzMiwweEQ0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDQ4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDIsIDB4MTgsMHgyQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHg4MiwgMHgwMCwweDA5LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MkUsMHhFMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDAyLCAweDM0LDB4NTgsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDIsIAorMHgwMCwweDBDLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDJGLDB4NkMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwMiwgMHgzRiwweDk0LCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4ODIsIDB4MDAsMHgwQiwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgyRiwweEY4LCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDIsIAorMHgzQiwweDg0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MEIsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHgzMiwweDI4LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDIsIDB4MjYsMHhFNCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwMiwgMHgwMCwweDEzLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MzAsMHg4NCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDAyLCAweDI2LDB4QTAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDIsIAorMHgwMCwweDExLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDMxLDB4MTAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwMiwgMHgxOCwweDJDLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4ODIsIDB4MDAsMHgwOSwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgzMSwweDlDLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEYwLDB4MDUsIAorMHg3QSwweDc4LCAweEYwLDB4MDUsIDB4MzIsMHhFOCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHg1MCwgMHhGNywweDA0LCAweDcxLDB4QzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MTgsMHg1NSwgMHhGNiwweDg2LCAweDcxLDB4QzQsIDB4RTAsMHgwMCwgMHgxOCwweDZDLCAweEY2LDB4MDIsIAorMHgwMCwweDAwLCAweEY3LDB4MDQsIDB4NzEsMHhENCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEM3LDB4MzgsIAorMHg2OCwweDAwLCAweDg2LDB4M0EsIDB4MDAsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgzMiwweEM0LCAweDg2LDB4QjIsIAorMHgwMCwweDA4LCAweDA3LDB4MDEsIDB4ODAsMHgwMCwgMHhDNSwweEI0LCAweDc0LDB4MDAsIDB4RjUsMHg4NSwgMHgzMiwweEQwLCAweDg3LDB4MzIsIAorMHgwMCwweDE4LCAweEY2LDB4ODYsIDB4NkYsMHg0NCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4QTcsMHgzQSwgMHg2OCwweDAyLCAweDIwLDB4MkUsIAorMHgwMCwweDAwLCAweEY3LDB4MDUsIDB4MzIsMHhDMCwgMHgwNywweDM4LCAweDA5LDB4RDgsIDB4ODYsMHhCMiwgMHgwMCwweDA0LCAweEY3LDB4MDUsIAorMHgzMiwweENDLCAweEU2LDB4MDAsIDB4MTksMHg0MSwgMHhGNiwweDg1LCAweDMyLDB4QzgsIDB4RjcsMHgwNCwgMHg3MSwweDk4LCAweEY2LDB4ODQsIAorMHg3QSwweDc4LCAweDI3LDB4MzgsIDB4MDAsMHgwMSwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgxOSwweDEwLCAweEY3LDB4MDUsIAorMHg3MSwweDk4LCAweEY3LDB4MDQsIDB4NzYsMHhGQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgxOCwweEU4LCAweEYzLDB4MDIsIDB4MDAsMHgxMSwgMHhGMywweDA2LCAweDMyLDB4RDQsIDB4RjMsMHgwNSwgMHg3NiwweEZDLCAweEUwLDB4MDAsIAorMHgxOCwweEY4LCAweEY3LDB4MDIsIDB4MDAsMHgwMSwgMHhGMywweDA1LCAweDc2LDB4RjgsIDB4RjMsMHgwNiwgMHgzMiwweEQ0LCAweEYzLDB4MDUsIAorMHg3NywweDAwLCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgxOSwweDE0LCAweEYzLDB4MDIsIAorMHgwMCwweDAxLCAweEYzLDB4MDYsIDB4MzEsMHgxMCwgMHhFMCwweDAwLCAweDI2LDB4OEMsIDB4RjMsMHgwNSwgMHgzMiwweEQ0LCAweEYzLDB4MDIsIAorMHgwMCwweDAxLCAweEYzLDB4MDUsIDB4N0EsMHg3OCwgMHhGMywweDA2LCAweDMwLDB4ODQsIDB4RjMsMHgwNSwgMHgzMiwweEQ0LCAweEYzLDB4MDQsIAorMHgzMiwweEM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgwNiwweDEwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhFMCwweDAwLCAweDI2LDB4OEMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEYzLDB4MDIsIAorMHgwMCwweDAwLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDFDLDB4QjksIDB4OTMsMHgxNiwgMHhGRiwweEU0LCAweDg3LDB4MzIsIAorMHgwMCwweDA4LCAweDg2LDB4OTYsIDB4RkYsMHhFNCwgMHhDMywweDA0LCAweDAwLDB4MDAsIDB4QzAsMHgzQSwgMHgzMiwweDAwLCAweEU2LDB4MDAsIAorMHgxOSwweDg0LCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHg4NywweDMyLCAweDAwLDB4MEMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIAorMHgzMiwweDAwLCAweEU2LDB4MDAsIDB4MTksMHg4NCwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RjYsMHg4MiwgMHgwMCwweDAxLCAweDIwLDB4MzYsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MUMsMHhCOCwgMHhGMywweDAyLCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHgzMiwweEMwLCAweDkzLDB4MTYsIAorMHhGRiwweEFDLCAweEY1LDB4ODQsIDB4MzIsMHhDNCwgMHg4NiwweDNBLCAweDE0LDB4MjgsIDB4MDMsMHhCOCwgMHgxNCwweDIwLCAweDA0LDB4MkMsIAorMHgwMCwweDA4LCAweDg2LDB4QkEsIDB4MTQsMHgyNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzMiwgMHg2QSwweDAwLCAweEVDLDB4MDAsIAorMHgxQSwweDcwLCAweDk2LDB4MTYsIDB4RkYsMHhFQywgMHg3NywweDMxLCAweDAwLDB4MDEsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweDc3LDB4MzksIAorMHgwMCwweDAyLCAweEM2LDB4MzgsIDB4MzgsMHgwMCwgMHgwNiwweDMwLCAweDAwLDB4MEMsIDB4ODYsMHhCMiwgMHgwMCwweDAwLCAweDg3LDB4MkUsIAorMHgwMCwweDA4LCAweDg1LDB4MTYsIDB4RkYsMHhBQywgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHgxQSwweDAwLCAweEM0LDB4ODQsIAorMHgwMCwweDAwLCAweDg2LDB4QjIsIDB4MDAsMHgwNCwgMHg4NywweDJFLCAweDAwLDB4MEMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4MUEsMHgwNCwgMHgyMCwweDJBLCAweDAwLDB4MDAsIDB4RjUsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MkEsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MUEsMHgxMSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjQsMHg4MiwgMHgwMCwweDAwLCAweDg2LDB4QjIsIAorMHgwMCwweDAwLCAweDg3LDB4MjIsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEUyLDB4MDAsIAorMHgxQSwweDRDLCAweEY1LDB4ODIsIDB4MDAsMHgwMCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHgxQSwweDU0LCAweDIwLDB4MkUsIAorMHgwMCwweDAwLCAweDg2LDB4QjIsIDB4MDAsMHgwNCwgMHg4NywweDIyLCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEUyLDB4MDAsIDB4MUEsMHg1NSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RjUsMHg4MiwgMHgwMCwweDAxLCAweDIwLDB4MkUsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MUEsMHg2NSwgMHgyMCwweDI2LCAweDAwLDB4MDAsIDB4RjQsMHg4MiwgMHgwMCwweDAxLCAweDIwLDB4MjYsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MUEsMHg3MCwgMHhGMywweDAyLCAweDAwLDB4MDEsIDB4OTMsMHgxNiwgMHhGRiwweEFDLCAweDgzLDB4MTYsIAorMHhGRiwweEFDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDFBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgxQSwweEIxLCAweEY2LDB4MDIsIAorMHgwMCwweDAxLCAweDg3LDB4MTYsIDB4RkYsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzYsMHhCOSwgMHgwMCwweDAxLCAweEM2LDB4QjQsIAorMHg3MCwweDAwLCAweDc2LDB4QjUsIDB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDM4LDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDE0LCAweDg2LDB4QjYsIAorMHgwMCwweDAwLCAweDk3LDB4MTYsIDB4RkYsMHhGMCwgMHhFMCwweDAwLCAweDFCLDB4MTgsIDB4OTYsMHg5NiwgMHhGRiwweEY0LCAweDI3LDB4MTQsIAorMHgwMCwweDE0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg5NCwweDEzLCAweEZGLDB4RkMsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDkzLDB4OTYsIAorMHhGRiwweEJDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDI1LDB4NjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDgzLDB4OTYsIAorMHhGRiwweEJDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDFCLDB4MTUsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4MTYsIAorMHhGRiwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NiwweEI5LCAweDAwLDB4MDEsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweDc2LDB4QjUsIAorMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4MzgsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MTQsIDB4ODYsMHhCNiwgMHgwMCwweDAwLCAweDk3LDB4MTYsIAorMHhGRiwweEYwLCAweDk2LDB4OTYsIDB4RkYsMHhGNCwgMHg5NywweDFFLCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxQiwweDFDLCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgxQywweEI4LCAweEYzLDB4MDIsIAorMHgwMCwweDAwLCAweEY2LDB4MDQsIDB4MzIsMHhDMCwgMHg5MywweDE2LCAweEZGLDB4QUMsIDB4ODYsMHhCMiwgMHgxNCwweDI4LCAweDAzLDB4QjAsIAorMHgxNCwweDIwLCAweDA0LDB4MzAsIDB4MTQsMHg4QywgMHg4NywweDMyLCAweDE0LDB4MjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEVDLDB4MDAsIDB4MUMsMHgwNCwgMHg5NiwweDk2LCAweEZGLDB4RUMsIDB4NzcsMHgzNSwgMHgwMCwweDAxLCAweEM3LDB4MzgsIAorMHg2OCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhDNSwweEI4LCAweDM4LDB4MDAsIDB4MDUsMHhBQywgMHgwMCwweDBDLCAweDg2LDB4QUUsIAorMHgwMCwweDAwLCAweDg3LDB4MzIsIDB4MTQsMHg4QywgMHg4NSwweDE2LCAweEZGLDB4QUMsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHgxQiwweDk0LCAweEM0LDB4ODQsIDB4MDAsMHgwMCwgMHg4NiwweEFFLCAweDAwLDB4MDQsIDB4ODcsMHgzMiwgMHgxNCwweDkwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDFCLDB4OTgsIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweEY1LDB4MDIsIAorMHgwMCwweDAxLCAweDIwLDB4MkEsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDFCLDB4QTUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY0LDB4ODIsIAorMHgwMCwweDAwLCAweDg2LDB4QUUsIDB4MDAsMHgwMCwgMHg4NywweDIyLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEUyLDB4MDAsIDB4MUIsMHhFMCwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHgxQiwweEU4LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHg4NiwweEFFLCAweDAwLDB4MDQsIDB4ODcsMHgyMiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAwLCAweDFCLDB4RTksIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEY2LDB4MDIsIAorMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDFCLDB4RjksIDB4MjAsMHgyNiwgMHgwMCwweDAwLCAweEY0LDB4ODIsIAorMHgwMCwweDAxLCAweDIwLDB4MjYsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDFDLDB4MDQsIDB4RjMsMHgwMiwgMHgwMCwweDAxLCAweDkzLDB4MTYsIAorMHhGRiwweEFDLCAweDgzLDB4MTYsIDB4RkYsMHhBQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgxQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgxQywweDQ1LCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHg4NywweDE2LCAweEZGLDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc2LDB4QjksIAorMHgwMCwweDAxLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHg3NiwweEI1LCAweDAwLDB4MDIsIDB4QzYsMHhCNCwgMHgzOCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDE0LCAweDg2LDB4QjYsIDB4MDAsMHgwMCwgMHg5NywweDE2LCAweEZGLDB4RjAsIDB4RTAsMHgwMCwgMHgxQywweEFDLCAweDk2LDB4OTYsIAorMHhGRiwweEY0LCAweDI3LDB4MTQsIDB4MDAsMHgxNCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4OTQsMHgxMywgMHhGRiwweEZDLCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweDkzLDB4OTYsIDB4RkYsMHhCQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyNSwweDY4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDgzLDB4OTYsIDB4RkYsMHhCQywgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgxQywweEE5LCAweEY2LDB4MDIsIAorMHgwMCwweDAxLCAweDg3LDB4MTYsIDB4RkYsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzYsMHhCOSwgMHgwMCwweDAxLCAweEM2LDB4QjQsIAorMHg3MCwweDAwLCAweDc2LDB4QjUsIDB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDM4LDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDE0LCAweDg2LDB4QjYsIAorMHgwMCwweDAwLCAweDk3LDB4MTYsIDB4RkYsMHhGMCwgMHg5NiwweDk2LCAweEZGLDB4RjQsIDB4OTcsMHgxRSwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxQywweEIwLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgxRSwweDE1LCAweEYzLDB4MDIsIDB4MDAsMHgwMSwgMHhGNiwweDg0LCAweDMyLDB4QzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg1LDB4QjYsIAorMHgwRSwweEY0LCAweDg2LDB4MzYsIDB4MEUsMHhGOCwgMHgyMCwweDJFLCAweDAwLDB4MTAsIDB4RTIsMHgwMCwgMHgxQywweERDLCAweDIwLDB4MzIsIAorMHgwMCwweDEwLCAweEUyLDB4MDAsIDB4MUMsMHhGOSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgwRiwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAweDBGLDB4MDAsIDB4ODcsMHgzNiwgMHgwRiwweDAwLCAweEUwLDB4MDAsIAorMHgxRCwweDI0LCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHgwNywweDMwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg1QSwweDAwLCAweEU2LDB4MDAsIAorMHgxRCwweDFELCAweEY2LDB4ODIsIDB4MDAsMHgwMCwgMHgyMCwweDMyLCAweDAwLDB4MTAsIDB4RTYsMHgwMCwgMHgxRCwweDIwLCAweDIwLDB4MkUsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MUQsMHgyNCwgMHhDNywweDM0LCAweDAwLDB4MDAsIDB4RjYsMHg4MiwgMHgwMCwweDAxLCAweEM3LDB4MzQsIAorMHgwMCwweDAwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDFFLDB4MTQsIDB4RjMsMHgwMiwgMHgwMCwweDAxLCAweEYzLDB4MDQsIAorMHgzMiwweENDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDE2LCAweEZGLDB4REMsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NDMsMHg2OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgxRCwweEZDLCAweEYzLDB4MDIsIDB4MDAsMHgwMCwgMHg4MywweDE2LCAweEZGLDB4REMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg2LDB4MUEsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MTAsIDB4RTIsMHgwMCwgMHgxRCwweDkxLCAweDc2LDB4QjEsIAorMHgwMCwweDAyLCAweDg3LDB4MUEsIDB4MDAsMHgwQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MUEsIAorMHgwMCwweDBDLCAweDg3LDB4MUEsIDB4MDAsMHgwQywgMHhFMCwweDAwLCAweDFELDB4RkMsIDB4RjMsMHgwMiwgMHgwMCwweDAwLCAweEYzLDB4MDIsIAorMHgwMCwweDRDLCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHhDNiwweEI0LCAweDYwLDB4MDAsIDB4NzcsMHgzNSwgMHgwMCwweDA0LCAweEM3LDB4MzgsIAorMHg2QSwweDAwLCAweDgzLDB4MTYsIDB4RkYsMHhEQywgMHhDNywweDM4LCAweDYwLDB4MDAsIDB4QzcsMHgzOCwgMHgzMCwweDAwLCAweDA3LDB4MzgsIAorMHgwMCwweDEwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGMywweDA2LCAweDdBLDB4MjgsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDk2LDB4MTYsIAorMHhGRiwweEI0LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDI2LDB4RjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg2LDB4MTYsIAorMHhGRiwweEI0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNiwweDMwLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDExLCAweEU2LDB4MDAsIAorMHgxRCwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4ODMsMHgxNiwgMHhGRiwweERDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDk2LDB4MUEsIDB4MDAsMHgwMCwgMHhGMywweDAyLCAweDAwLDB4MDEsIDB4OTMsMHgxNiwgMHhGRiwweEQ0LCAweDgzLDB4MTYsIAorMHhGRiwweEQ0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDFBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgxRSwweDE4LCAweEYzLDB4MDIsIAorMHgwMCwweDAxLCAweDkzLDB4MTYsIDB4RkYsMHhFNCwgMHg4MywweDE2LCAweEZGLDB4RTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MUEsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MUYsMHgzNSwgMHhGNiwweDgyLCAweDBDLDB4QUIsIDB4RjcsMHgwNCwgMHgzMiwweEI0LCAweDgzLDB4MTYsIAorMHhGRiwweEQ0LCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAweDMyLDB4QjQsIDB4RjcsMHgwNCwgMHgzMiwweEI0LCAweDIwLDB4MUEsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MUUsMHg3MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHgzMiwweEMwLCAweEYzLDB4MDYsIAorMHhFMCwweDMwLCAweEMwLDB4M0EsIDB4MzIsMHgwMCwgMHhFNiwweDAwLCAweDFFLDB4NzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHgzMiwweEU4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHgzMiwweEU4LCAweEY3LDB4MDQsIAorMHg3MSwweEM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgxRSwweEFELCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGMywweDAyLCAweDAwLDB4MEEsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIAorMHgxRSwweEFDLCAweEIzLDB4M0EsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjcsMHgwNCwgMHg3MSwweEQ0LCAweEY2LDB4ODQsIAorMHg3MSwweENDLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDZBLDB4MDAsIDB4RTYsMHgwMCwgMHgxRSwweEM4LCAweEY3LDB4MDUsIAorMHg3MSwweEQ0LCAweEYwLDB4MDUsIDB4NzEsMHhENCwgMHhGNiwweDg0LCAweDcxLDB4RDQsIDB4RjcsMHgwNCwgMHg3MSwweEQwLCAweEYwLDB4MDUsIAorMHg3MSwweEM0LCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4RjYsMHg4NCwgMHgzMiwweEQwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDI1LDB4RDksIDB4RjcsMHgwNSwgMHg3MSwweEM4LCAweEY3LDB4MDQsIAorMHg3MSwweDk4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyNSwweDc5LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzUsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgyNSwweDc4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDc1LDB4RjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MjUsMHg3OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RTAsMHgwMCwgMHgyNSwweERDLCAweEYzLDB4MDYsIAorMHgzMSwweDlDLCAweEYwLDB4MDUsIDB4MzIsMHhFOCwgMHhGNywweDA0LCAweDMyLDB4QzAsIDB4RjYsMHgwNCwgMHg2RiwweDU0LCAweDk2LDB4QkEsIAorMHgwMCwweDA0LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDFGLDB4NjAsIDB4RjMsMHgwMiwgMHgwMCwweDBDLCAweEYzLDB4MDIsIAorMHgwMCwweDAxLCAweEYzLDB4MDUsIDB4NkYsMHg1NCwgMHhFMCwweDAwLCAweDFGLDB4NjgsIDB4RjcsMHgwMiwgMHgwMCwweDAxLCAweEYzLDB4MDUsIAorMHg2RiwweDU4LCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgxRiwweDdDLCAweEYzLDB4MDYsIAorMHgyRiwweDZDLCAweEUwLDB4MDAsIDB4MjYsMHg4QywgMHhGMywweDA1LCAweDMyLDB4RDQsIDB4RjUsMHg4NCwgMHg3QSwweDcwLCAweDI0LDB4OTQsIAorMHgwMCwweDEwLCAweDIwLDB4MkUsIDB4MDAsMHgwMSwgMHhFNiwweDAwLCAweDIyLDB4ODQsIDB4RjUsMHg4NSwgMHg3QSwweEEwLCAweEY3LDB4MDIsIAorMHgwMCwweDAxLCAweEY2LDB4MDQsIDB4MzIsMHhDOCwgMHhGNywweDA1LCAweDdBLDB4NzAsIDB4RjcsMHgwNCwgMHgzMiwweEM0LCAweEY2LDB4ODQsIAorMHgzMiwweEMwLCAweEY2LDB4MDUsIDB4N0EsMHgyQywgMHg5MCwweDAyLCAweEZGLDB4ODAsIDB4OTAsMHgwMiwgMHhGRiwweDM4LCAweEY1LDB4ODQsIAorMHg3QSwweDI4LCAweDA3LDB4MzgsIDB4MDAsMHgyNCwgMHg5NSwweDgyLCAweEZGLDB4M0MsIDB4OTcsMHgwMiwgMHhGRiwweDQwLCAweDk2LDB4MDIsIAorMHhGRiwweDQ0LCAweDg3LDB4MzYsIDB4MTQsMHgxMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweDk3LDB4MzYsIAorMHgxNCwweDEwLCAweDg3LDB4MzYsIDB4MTQsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MzYsIAorMHgxNCwweDE4LCAweDg3LDB4MzYsIDB4MTQsMHgxOCwgMHhGMCwweDA1LCAweDZGLDB4NTAsIDB4RjcsMHgwNCwgMHgzMiwweEI4LCAweDk1LDB4OTYsIAorMHhGRiwweEVDLCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHhGNywweDA1LCAweDMyLDB4QjgsIDB4RjcsMHgwNCwgMHgzMiwweEJDLCAweEYzLDB4MDYsIAorMHgyRiwweEY4LCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAweDMyLDB4QkMsIDB4RjcsMHgwNCwgMHgzMiwweEJDLCAweEYzLDB4MDUsIAorMHgzMiwweEQ0LCAweEY3LDB4MDYsIDB4MEMsMHgzRSwgMHhDMCwweDdFLCAweDc0LDB4MDAsIDB4RTYsMHgwMCwgMHgyMCwweDM0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4N0UsIDB4NzQsMHgwMCwgMHhFNiwweDAwLCAweDIwLDB4MjUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDYsIAorMHgwQywweDNFLCAweEM3LDB4N0MsIDB4NzQsMHgwMCwgMHgyMCwweDNBLCAweDAwLDB4MTAsIDB4RTYsMHgwMCwgMHgyNiwweDhDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4MzIsMHhFNCwgMHhGRiwweDgyLCAweDAwLDB4MTAsIDB4RjUsMHg4NCwgMHg2RiwweDU4LCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgyMSwgMHhFMiwweDAwLCAweDIwLDB4OTAsIDB4RjcsMHgwNSwgMHgzMiwweEU0LCAweEY3LDB4MDQsIAorMHgyRCwweDM4LCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIAorMHgwMCwweDAyLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDIwLDB4ODQsIDB4QjUsMHhCQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIAorMHgyRCwweDM4LCAweEYzLDB4MDIsIDB4MDAsMHgyMiwgMHhFMCwweDAwLCAweDIwLDB4OTQsIDB4RjMsMHgwNSwgMHg2RiwweDU4LCAweEYwLDB4MDUsIAorMHg2RiwweDU0LCAweEY1LDB4ODQsIDB4MzIsMHhDMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTAsMHgyRSwgMHgwMCwweDA0LCAweDg3LDB4MkUsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDIsIDB4RTYsMHgwMCwgMHgyMSwweEMwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MDIsIDB4RkYsMHgzOCwgMHgwMywweDJDLCAweDBFLDB4RjQsIDB4OTMsMHgxNiwgMHhGRiwweENDLCAweEY3LDB4MDUsIAorMHg3QSwweDY4LCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHg5NSwweDk2LCAweEZGLDB4QjgsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHg0MywweEEwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NSwweDk2LCAweEZGLDB4QjgsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgyMSwweDdDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NiwweDJFLCAweDBFLDB4RjgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MzIsIAorMHgwMCwweDEwLCAweEUyLDB4MDAsIDB4MjEsMHgxOSwgMHhGMywweDAyLCAweDAwLDB4NEMsIDB4ODcsMHgyRSwgMHgwRiwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDJFLCAweDBGLDB4MDAsIDB4ODcsMHgyRSwgMHgwRiwweDAwLCAweEUwLDB4MDAsIAorMHgyMSwweDdDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4RjMsMHgwNiwgMHg3QSwweDI4LCAweDkzLDB4MTMsIAorMHhGRiwweEZDLCAweDc2LDB4QjEsIDB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDYwLDB4MDAsIDB4NzcsMHgzNSwgMHgwMCwweDA0LCAweEM3LDB4MzgsIAorMHg2QSwweDAwLCAweDgzLDB4MTYsIDB4RkYsMHhDQywgMHhDNywweDM4LCAweDYwLDB4MDAsIDB4QzcsMHgzOCwgMHgzMCwweDAwLCAweDA3LDB4MzgsIAorMHgwMCwweDEwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg5NSwweDk2LCAweEZGLDB4QjgsIDB4OTYsMHgxNiwgMHhGRiwweEI0LCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjYsMHhGOCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODYsMHgxNiwgMHhGRiwweEI0LCAweDg1LDB4OTYsIAorMHhGRiwweEI4LCAweDA2LDB4MzAsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MTEsIDB4RTYsMHgwMCwgMHgyMSwweDc4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHg5NiwweDJFLCAweDBFLDB4RjgsIDB4RjcsMHgwNCwgMHgzMiwweEMwLCAweEYzLDB4MDYsIAorMHhFMCwweDMwLCAweEMwLDB4M0EsIDB4MzIsMHgwMCwgMHhFNiwweDAwLCAweDIxLDB4QzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHhFMCwweDE4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweEI4LCAweDAwLDB4MUUsIDB4NzAsMHgzRSwgMHhGRiwweEUxLCAweEU2LDB4MDAsIAorMHgyMSwweEMxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwRiwweDgxLCAweDQwLDB4MDAsIDB4RjcsMHgwNCwgMHg3OSwweEM4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAweDc5LDB4QzgsIDB4RjcsMHgwNCwgMHg3OSwweEM4LCAweEY3LDB4MDQsIAorMHg3MSwweEM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyMSwweEZELCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGMywweDAyLCAweDAwLDB4MEEsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIAorMHgyMSwweEZDLCAweEIzLDB4M0EsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjcsMHgwNCwgMHg3MSwweEQ0LCAweEY2LDB4ODQsIAorMHg3MSwweENDLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDZBLDB4MDAsIDB4RTYsMHgwMCwgMHgyMiwweDE4LCAweEY3LDB4MDUsIAorMHg3MSwweEQ0LCAweEYwLDB4MDUsIDB4NzEsMHhENCwgMHhGNiwweDg0LCAweDcxLDB4RDQsIDB4RjcsMHgwNCwgMHg3MSwweEQwLCAweEYwLDB4MDUsIAorMHg3MSwweEM0LCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4RjYsMHg4NCwgMHgzMiwweEQwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDI1LDB4RDksIDB4RjcsMHgwNSwgMHg3MSwweEM4LCAweEY3LDB4MDQsIAorMHg3MSwweDk4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyNSwweDc5LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzUsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgyNSwweDc4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDc1LDB4RjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MjUsMHg3OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RTAsMHgwMCwgMHgyNSwweERDLCAweEYzLDB4MDYsIAorMHgzMSwweDlDLCAweEYwLDB4MDUsIDB4N0EsMHg4OCwgMHg5MCwweDAyLCAweEZGLDB4MzgsIDB4RjAsMHgwNSwgMHg2RiwweDUwLCAweDkwLDB4MDIsIAorMHhGRiwweDgwLCAweEY3LDB4MDQsIDB4MzIsMHhDNCwgMHhGMywweDA2LCAweDMyLDB4MjgsIDB4RjMsMHgwNSwgMHgzMiwweEQ0LCAweEY2LDB4MDQsIAorMHgzMiwweEM4LCAweEY2LDB4ODQsIDB4N0EsMHgyQywgMHhGNSwweDAyLCAweDAwLDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDI0LCAweEY3LDB4MDUsIAorMHg3QSwweDk4LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDIyLDB4RDUsIDB4RjYsMHgwNSwgMHg3QSwweDkwLCAweEMwLDB4MkEsIAorMHg1QSwweDAwLCAweEU2LDB4MDAsIDB4MjYsMHgyMCwgMHhDMCwweDMyLCAweDZBLDB4MDAsIDB4RUUsMHgwMCwgMHgyNiwweDIxLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY2LDB4ODQsIDB4MzIsMHhDMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgxNCwweDEwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHg5NywweDM2LCAweDE0LDB4MTAsIDB4ODcsMHgzNiwgMHgxNCwweDE4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAweDE0LDB4MTgsIDB4ODcsMHgzNiwgMHgxNCwweDE4LCAweEY3LDB4MDQsIAorMHgzMiwweEI4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAweDYwLDB4MDAsIDB4RjcsMHgwNSwgMHgzMiwweEI4LCAweEY3LDB4MDQsIAorMHgzMiwweEJDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHgzMiwweEJDLCAweEY3LDB4MDQsIAorMHgzMiwweEJDLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDIzLDB4NDUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHgzMiwweEUwLCAweEY1LDB4MDUsIDB4N0EsMHg3MCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RTAsMHgwMCwgMHgyMywweDQ4LCAweEY3LDB4MDUsIAorMHgzMiwweEUwLCAweEY1LDB4MDUsIDB4N0EsMHg3MCwgMHhGNSwweDg0LCAweDZGLDB4NTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MkUsIAorMHgwMCwweDIxLCAweEUyLDB4MDAsIDB4MjMsMHg4QywgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweDIwLDB4MzIsIAorMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4MjMsMHg4MCwgMHhCNSwweEJBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEYzLDB4MDIsIAorMHgwMCwweDIyLCAweEUwLDB4MDAsIDB4MjMsMHg5MCwgMHhGMywweDA1LCAweDZGLDB4NTgsIDB4RjAsMHgwNSwgMHg2RiwweDU0LCAweEY1LDB4ODQsIAorMHgzMiwweEMwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MCwweDJFLCAweDAwLDB4MDQsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMiwgMHhFNiwweDAwLCAweDI0LDB4QkMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MDIsIAorMHhGRiwweDM4LCAweDAzLDB4MkMsIDB4MEUsMHhGNCwgMHg5MywweDE2LCAweEZGLDB4QzQsIDB4RjcsMHgwNSwgMHg3QSwweDY4LCAweDkzLDB4MTMsIAorMHhGRiwweEZDLCAweDk1LDB4OTYsIDB4RkYsMHhCOCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHg0MywweEEwLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDg1LDB4OTYsIDB4RkYsMHhCOCwgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyNCwweDc4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg2LDB4MkUsIDB4MEUsMHhGOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDEwLCAweEUyLDB4MDAsIAorMHgyNCwweDE1LCAweEYzLDB4MDIsIDB4MDAsMHg0QywgMHg4NywweDJFLCAweDBGLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweDk3LDB4MkUsIDB4MEYsMHgwMCwgMHg4NywweDJFLCAweDBGLDB4MDAsIDB4RTAsMHgwMCwgMHgyNCwweDc4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHhGMywweDA2LCAweDdBLDB4MjgsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDc2LDB4QjEsIAorMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4NjAsMHgwMCwgMHg3NywweDM1LCAweDAwLDB4MDQsIDB4QzcsMHgzOCwgMHg2QSwweDAwLCAweDgzLDB4MTYsIAorMHhGRiwweEM0LCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHhDNywweDM4LCAweDMwLDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDEwLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDk1LDB4OTYsIDB4RkYsMHhCOCwgMHg5NiwweDE2LCAweEZGLDB4QjQsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIAorMHgyNiwweEY4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NiwweDE2LCAweEZGLDB4QjQsIDB4ODUsMHg5NiwgMHhGRiwweEI4LCAweDA2LDB4MzAsIAorMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgxMSwgMHhFNiwweDAwLCAweDI0LDB4NzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY2LDB4MDIsIAorMHgwMCwweDAwLCAweDk2LDB4MkUsIDB4MEUsMHhGOCwgMHhGNywweDA0LCAweDMyLDB4QzAsIDB4RjMsMHgwNiwgMHhFMCwweDMwLCAweEMwLDB4M0EsIAorMHgzMiwweDAwLCAweEU2LDB4MDAsIDB4MjQsMHhCQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHhFMCwweDE4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDc3LDB4QjgsIDB4MDAsMHgxRSwgMHg3MCwweDNFLCAweEZGLDB4RTEsIDB4RTYsMHgwMCwgMHgyNCwweEJELCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDBGLDB4ODEsIDB4NDAsMHgwMCwgMHhGNywweDA0LCAweDc5LDB4QzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NzksMHhDOCwgMHhGNywweDA0LCAweDc5LDB4QzgsIDB4RjcsMHgwNCwgMHg3MSwweEM0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDI0LDB4RjksIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweEY3LDB4MDQsIAorMHgyRCwweDM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIAorMHgwMCwweDAyLCAweEYzLDB4MDIsIDB4MDAsMHgwQSwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHgyNCwweEY4LCAweEIzLDB4M0EsIAorMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNywweDA0LCAweDcxLDB4RDQsIDB4RjYsMHg4NCwgMHg3MSwweENDLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NkEsMHgwMCwgMHhFNiwweDAwLCAweDI1LDB4MTQsIDB4RjcsMHgwNSwgMHg3MSwweEQ0LCAweEYwLDB4MDUsIAorMHg3MSwweEQ0LCAweEY2LDB4ODQsIDB4NzEsMHhENCwgMHhGNywweDA0LCAweDcxLDB4RDAsIDB4RjAsMHgwNSwgMHg3MSwweEM0LCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHhGNiwweDg0LCAweDMyLDB4RDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MzYsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MjUsMHhEOSwgMHhGNywweDA1LCAweDcxLDB4QzgsIDB4RjcsMHgwNCwgMHg3MSwweDk4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDI1LDB4NzksIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHg3NSwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyNSwweDc4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzUsMHhGMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgyNSwweEQxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNSwweDg0LCAweDc2LDB4RjgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MkUsIAorMHgwMCwweDIxLCAweEUyLDB4MDAsIDB4MjUsMHhDNCwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweDIwLDB4MzIsIAorMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4MjUsMHhCMCwgMHhCNSwweEJBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEYzLDB4MDIsIAorMHgwMCwweDIyLCAweEYzLDB4MDUsIDB4NzYsMHhGOCwgMHhGMywweDA0LCAweDc3LDB4MDAsIDB4RTAsMHgwMCwgMHgyNSwweEM4LCAweEYzLDB4MDUsIAorMHg3NiwweEZDLCAweEYwLDB4MDUsIDB4NzYsMHhGQywgMHhFMCwweDAwLCAweDI1LDB4RDgsIDB4RjAsMHgwNSwgMHg3QSwweDc4LCAweEUwLDB4MDAsIAorMHgyNSwweERDLCAweEYzLDB4MDYsIDB4MzEsMHg5QywgMHhGMywweDA2LCAweDJFLDB4RTAsIDB4RjMsMHgwNSwgMHgzMiwweEQ0LCAweEY3LDB4MDQsIAorMHg3MSwweEM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyNiwweDhDLCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGMywweDAyLCAweDAwLDB4MDksIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIAorMHgyNiwweDhDLCAweEIzLDB4M0EsIDB4NjgsMHgwMiwgMHhFMCwweDAwLCAweDI2LDB4OEMsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY3LDB4MDQsIAorMHg3QSwweDkwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDZBLDB4MDAsIDB4RUUsMHgwMCwgMHgyNiwweDQxLCAweEM1LDB4QjQsIAorMHgwMCwweDAwLCAweEM3LDB4MzgsIDB4NUEsMHgwMCwgMHhFMCwweDAwLCAweDI2LDB4NDgsIDB4RjcsMHgwNSwgMHg3QSwweDkwLCAweEM1LDB4QjgsIAorMHgwMCwweDAwLCAweEYwLDB4MDUsIDB4N0EsMHg5MCwgMHhGNiwweDg0LCAweDdBLDB4ODgsIDB4RjcsMHgwNiwgMHg3QSwweDI4LCAweDc2LDB4MzUsIAorMHgwMCwweDAzLCAweEE3LDB4MzIsIDB4NzAsMHgwMiwgMHgwNiwweEI0LCAweDAwLDB4MDEsIDB4OTcsMHgxNiwgMHhGRiwweEVDLCAweDg0LDB4QTYsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4N0EsMHgyQywgMHhGMywweDA0LCAweDdBLDB4OTgsIDB4OTQsMHg4MiwgMHhGRiwweDNDLCAweDkzLDB4MDIsIAorMHhGRiwweDQwLCAweDk1LDB4ODIsIDB4RkYsMHg0NCwgMHhCNSwweEIyLCAweDcwLDB4MDIsIDB4RjcsMHgwNCwgMHg3QSwweDk4LCAweEY2LDB4ODUsIAorMHg3QSwweDg4LCAweEM3LDB4MzgsIDB4NTgsMHgwMCwgMHhGNywweDA1LCAweDdBLDB4OTgsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNywweDAyLCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg3QSwweDc4LCAweEY3LDB4MDYsIAorMHgzMCwweDg0LCAweEY3LDB4MDUsIDB4MzIsMHhENCwgMHhGNywweDA0LCAweDMyLDB4QzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDA2LDB4MTAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDUwLCAweEY3LDB4MDQsIAorMHgzMiwweEQwLCAweEYzLDB4MDIsIDB4MDAsMHgwMCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyQSwweDcxLCAweDkzLDB4MTYsIAorMHhGRiwweEU0LCAweEY2LDB4ODQsIDB4MzIsMHhDNCwgMHg4NiwweDE2LCAweEZGLDB4RTQsIDB4ODcsMHgzNiwgMHgwMCwweDA4LCAweEMzLDB4MDQsIAorMHgwMCwweDAwLCAweEMwLDB4M0EsIDB4MzIsMHgwMCwgMHhFNiwweDAwLCAweDI3LDB4M0MsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweDg3LDB4MzYsIAorMHgwMCwweDBDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDMyLDB4MDAsIDB4RTYsMHgwMCwgMHgyNywweDNDLCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyQSwweDcwLCAweEYzLDB4MDIsIAorMHgwMCwweDAwLCAweEY3LDB4MDQsIDB4MzIsMHhDMCwgMHg5MywweDE2LCAweEZGLDB4QUMsIDB4RjUsMHg4NCwgMHgzMiwweEM0LCAweDg2LDB4M0EsIAorMHgxNCwweDI4LCAweDAzLDB4QjgsIDB4MTQsMHgyMCwgMHgwNCwweDJDLCAweDAwLDB4MDgsIDB4ODYsMHhCQSwgMHgxNCwweDI0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzIsIDB4NkEsMHgwMCwgMHhFQywweDAwLCAweDI4LDB4MjgsIDB4OTYsMHgxNiwgMHhGRiwweEVDLCAweDc3LDB4MzEsIAorMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4QzYsMHgzOCwgMHgzOCwweDAwLCAweDA2LDB4MzAsIAorMHgwMCwweDBDLCAweDg2LDB4QjIsIDB4MDAsMHgwMCwgMHg4NywweDJFLCAweDAwLDB4MDgsIDB4ODUsMHgxNiwgMHhGRiwweEFDLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4MjcsMHhCOCwgMHhDNCwweDg0LCAweDAwLDB4MDAsIDB4ODYsMHhCMiwgMHgwMCwweDA0LCAweDg3LDB4MkUsIAorMHgwMCwweDBDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHgyNywweEJDLCAweDIwLDB4MkEsIAorMHgwMCwweDAwLCAweEY1LDB4MDIsIDB4MDAsMHgwMSwgMHgyMCwweDJBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyNywweEM5LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY0LDB4ODIsIDB4MDAsMHgwMCwgMHg4NiwweEIyLCAweDAwLDB4MDAsIDB4ODcsMHgyMiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAwLCAweDI4LDB4MDQsIDB4RjUsMHg4MiwgMHgwMCwweDAwLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4MjgsMHgwQywgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4ODYsMHhCMiwgMHgwMCwweDA0LCAweDg3LDB4MjIsIAorMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHgyOCwweDBELCAweDIwLDB4MkUsIAorMHgwMCwweDAwLCAweEY1LDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyOCwweDFELCAweDIwLDB4MjYsIAorMHgwMCwweDAwLCAweEY0LDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDI2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyOCwweDI4LCAweEYzLDB4MDIsIAorMHgwMCwweDAxLCAweDkzLDB4MTYsIDB4RkYsMHhBQywgMHg4MywweDE2LCAweEZGLDB4QUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MUEsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MjgsMHg2OSwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4ODcsMHgxNiwgMHhGRiwweEVDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDc2LDB4QjksIDB4MDAsMHgwMSwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4NzYsMHhCNSwgMHgwMCwweDAyLCAweEM2LDB4QjQsIAorMHgzOCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgxNCwgMHg4NiwweEI2LCAweDAwLDB4MDAsIDB4OTcsMHgxNiwgMHhGRiwweEYwLCAweEUwLDB4MDAsIAorMHgyOCwweEQwLCAweDk2LDB4OTYsIDB4RkYsMHhGNCwgMHgyNywweDE0LCAweDAwLDB4MTQsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDk0LDB4MTMsIAorMHhGRiwweEZDLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHg5MywweDk2LCAweEZGLDB4QkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIAorMHgyNSwweDY4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4MywweDk2LCAweEZGLDB4QkMsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgyOCwweENELCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHg4NywweDE2LCAweEZGLDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc2LDB4QjksIAorMHgwMCwweDAxLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHg3NiwweEI1LCAweDAwLDB4MDIsIDB4QzYsMHhCNCwgMHgzOCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDE0LCAweDg2LDB4QjYsIDB4MDAsMHgwMCwgMHg5NywweDE2LCAweEZGLDB4RjAsIDB4OTYsMHg5NiwgMHhGRiwweEY0LCAweDk3LDB4MUUsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MjgsMHhENCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MkEsMHg3MCwgMHhGMywweDAyLCAweDAwLDB4MDAsIDB4RjYsMHgwNCwgMHgzMiwweEMwLCAweDkzLDB4MTYsIAorMHhGRiwweEFDLCAweDg2LDB4QjIsIDB4MTQsMHgyOCwgMHgwMywweEIwLCAweDE0LDB4MjAsIDB4MDQsMHgzMCwgMHgxNCwweDhDLCAweDg3LDB4MzIsIAorMHgxNCwweDI0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RUMsMHgwMCwgMHgyOSwweEJDLCAweDk2LDB4OTYsIAorMHhGRiwweEVDLCAweDc3LDB4MzUsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEM1LDB4QjgsIAorMHgzOCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgwQywgMHg4NiwweEFFLCAweDAwLDB4MDAsIDB4ODcsMHgzMiwgMHgxNCwweDhDLCAweDg1LDB4MTYsIAorMHhGRiwweEFDLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDI5LDB4NEMsIDB4QzQsMHg4NCwgMHgwMCwweDAwLCAweDg2LDB4QUUsIAorMHgwMCwweDA0LCAweDg3LDB4MzIsIDB4MTQsMHg5MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHgyOSwweDUwLCAweDIwLDB4MkEsIDB4MDAsMHgwMCwgMHhGNSwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgyOSwweDVELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNCwweDgyLCAweDAwLDB4MDAsIDB4ODYsMHhBRSwgMHgwMCwweDAwLCAweDg3LDB4MjIsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHgyOSwweDk4LCAweEY2LDB4MDIsIAorMHgwMCwweDAwLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDI5LDB4QTAsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweDg2LDB4QUUsIAorMHgwMCwweDA0LCAweDg3LDB4MjIsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEUyLDB4MDAsIAorMHgyOSwweEExLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgyOSwweEIxLCAweDIwLDB4MjYsIDB4MDAsMHgwMCwgMHhGNCwweDgyLCAweDAwLDB4MDEsIDB4MjAsMHgyNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgyOSwweEJDLCAweEYzLDB4MDIsIDB4MDAsMHgwMSwgMHg5MywweDE2LCAweEZGLDB4QUMsIDB4ODMsMHgxNiwgMHhGRiwweEFDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4MUEsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDI5LDB4RkQsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4MTYsIAorMHhGRiwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NiwweEI5LCAweDAwLDB4MDEsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweDc2LDB4QjUsIAorMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4MzgsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MTQsIDB4ODYsMHhCNiwgMHgwMCwweDAwLCAweDk3LDB4MTYsIAorMHhGRiwweEYwLCAweEUwLDB4MDAsIDB4MkEsMHg2NCwgMHg5NiwweDk2LCAweEZGLDB4RjQsIDB4MjcsMHgxNCwgMHgwMCwweDE0LCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDk0LDB4MTMsIDB4RkYsMHhGQywgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4OTMsMHg5NiwgMHhGRiwweEJDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjUsMHg2OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODMsMHg5NiwgMHhGRiwweEJDLCAweDIwLDB4MjIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MkEsMHg2MSwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4ODcsMHgxNiwgMHhGRiwweEVDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDc2LDB4QjksIDB4MDAsMHgwMSwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4NzYsMHhCNSwgMHgwMCwweDAyLCAweEM2LDB4QjQsIAorMHgzOCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgxNCwgMHg4NiwweEI2LCAweDAwLDB4MDAsIDB4OTcsMHgxNiwgMHhGRiwweEYwLCAweDk2LDB4OTYsIAorMHhGRiwweEY0LCAweDk3LDB4MUUsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDJBLDB4NjgsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEY2LDB4MDIsIAorMHgwMCwweDAwLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDJCLDB4Q0QsIDB4RjMsMHgwMiwgMHgwMCwweDAxLCAweEY2LDB4ODQsIAorMHgzMiwweEMwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NSwweEI2LCAweDBFLDB4RjQsIDB4ODYsMHgzNiwgMHgwRSwweEY4LCAweDIwLDB4MkUsIAorMHgwMCwweDEwLCAweEUyLDB4MDAsIDB4MkEsMHg5NCwgMHgyMCwweDMyLCAweDAwLDB4MTAsIDB4RTIsMHgwMCwgMHgyQSwweEIxLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MEYsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MzYsIAorMHgwRiwweDAwLCAweDg3LDB4MzYsIDB4MEYsMHgwMCwgMHhFMCwweDAwLCAweDJBLDB4REMsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweDA3LDB4MzAsIAorMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NUEsMHgwMCwgMHhFNiwweDAwLCAweDJBLDB4RDUsIDB4RjYsMHg4MiwgMHgwMCwweDAwLCAweDIwLDB4MzIsIAorMHgwMCwweDEwLCAweEU2LDB4MDAsIDB4MkEsMHhEOCwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyQSwweERDLCAweEM3LDB4MzQsIAorMHgwMCwweDAwLCAweEY2LDB4ODIsIDB4MDAsMHgwMSwgMHhDNywweDM0LCAweDAwLDB4MDAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgyQiwweENDLCAweEYzLDB4MDIsIDB4MDAsMHgwMSwgMHhGMywweDA0LCAweDMyLDB4Q0MsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4MTYsIAorMHhGRiwweERDLCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHg0MywweDY4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDJCLDB4QjQsIDB4RjMsMHgwMiwgMHgwMCwweDAwLCAweDgzLDB4MTYsIAorMHhGRiwweERDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NiwweDFBLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MzIsIAorMHgwMCwweDEwLCAweEUyLDB4MDAsIDB4MkIsMHg0OSwgMHg3NiwweEIxLCAweDAwLDB4MDIsIDB4ODcsMHgxQSwgMHgwMCwweDBDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDFBLCAweDAwLDB4MEMsIDB4ODcsMHgxQSwgMHgwMCwweDBDLCAweEUwLDB4MDAsIAorMHgyQiwweEI0LCAweEYzLDB4MDIsIDB4MDAsMHgwMCwgMHhGMywweDAyLCAweDAwLDB4NEMsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweEM2LDB4QjQsIAorMHg2MCwweDAwLCAweDc3LDB4MzUsIDB4MDAsMHgwNCwgMHhDNywweDM4LCAweDZBLDB4MDAsIDB4ODMsMHgxNiwgMHhGRiwweERDLCAweEM3LDB4MzgsIAorMHg2MCwweDAwLCAweEM3LDB4MzgsIDB4MzAsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MTAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEYzLDB4MDYsIAorMHg3QSwweDI4LCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHg5NiwweDE2LCAweEZGLDB4QjQsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIAorMHgyNiwweEY4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NiwweDE2LCAweEZGLDB4QjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzAsIAorMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgxMSwgMHhFNiwweDAwLCAweDJCLDB4QTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY2LDB4MDIsIAorMHgwMCwweDAwLCAweDgzLDB4MTYsIDB4RkYsMHhEQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTYsMHgxQSwgMHgwMCwweDAwLCAweEYzLDB4MDIsIAorMHgwMCwweDAxLCAweDkzLDB4MTYsIDB4RkYsMHhENCwgMHg4MywweDE2LCAweEZGLDB4RDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MUEsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MkIsMHhEMCwgMHhGMywweDAyLCAweDAwLDB4MDEsIDB4OTMsMHgxNiwgMHhGRiwweEU0LCAweDgzLDB4MTYsIAorMHhGRiwweEU0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDFBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyQywweEVELCAweEY2LDB4ODIsIAorMHgwQywweEFCLCAweEY3LDB4MDQsIDB4MzIsMHhCNCwgMHg4MywweDE2LCAweEZGLDB4RDQsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIAorMHgzMiwweEI0LCAweEY3LDB4MDQsIDB4MzIsMHhCNCwgMHgyMCwweDFBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgyQywweDI4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4MzIsMHhDMCwgMHhGMywweDA2LCAweEUwLDB4MzAsIDB4QzAsMHgzQSwgMHgzMiwweDAwLCAweEU2LDB4MDAsIAorMHgyQywweDI4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDMyLDB4RTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4MzIsMHhFOCwgMHhGNywweDA0LCAweDcxLDB4QzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MkMsMHg2NSwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEYzLDB4MDIsIAorMHgwMCwweDBBLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDJDLDB4NjQsIDB4QjMsMHgzQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIAorMHgyRCwweDM4LCAweEY3LDB4MDQsIDB4NzEsMHhENCwgMHhGNiwweDg0LCAweDcxLDB4Q0MsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIAorMHg2QSwweDAwLCAweEU2LDB4MDAsIDB4MkMsMHg4MCwgMHhGNywweDA1LCAweDcxLDB4RDQsIDB4RjAsMHgwNSwgMHg3MSwweEQ0LCAweEY2LDB4ODQsIAorMHg3MSwweEQ0LCAweEY3LDB4MDQsIDB4NzEsMHhEMCwgMHhGMCwweDA1LCAweDcxLDB4QzQsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweDQ3LDB4MEMsIAorMHgwMCwweDAxLCAweEY2LDB4ODQsIDB4MzIsMHhEMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgzMywweDkxLCAweEY3LDB4MDUsIDB4NzEsMHhDOCwgMHhGNywweDA0LCAweDcxLDB4OTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MzMsMHgzMSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3NSwweEVDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDMzLDB4MzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHg3NSwweEYwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgzMywweDMwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4MzMsMHg5NCwgMHhGMywweDA2LCAweDMxLDB4OUMsIDB4RjAsMHgwNSwgMHgzMiwweEU4LCAweEY3LDB4MDQsIAorMHgzMiwweEMwLCAweEY2LDB4MDQsIDB4NkYsMHg1NCwgMHg5NiwweEJBLCAweDAwLDB4MDQsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgyRCwweDE4LCAweEYzLDB4MDIsIDB4MDAsMHgwQywgMHhGMywweDAyLCAweDAwLDB4MDEsIDB4RjMsMHgwNSwgMHg2RiwweDU0LCAweEUwLDB4MDAsIAorMHgyRCwweDIwLCAweEY3LDB4MDIsIDB4MDAsMHgwMSwgMHhGMywweDA1LCAweDZGLDB4NTgsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MkQsMHgzNCwgMHhGMywweDA2LCAweDJGLDB4NkMsIDB4RTAsMHgwMCwgMHgzNCwweDQ0LCAweEYzLDB4MDUsIAorMHgzMiwweEQ0LCAweEY1LDB4ODQsIDB4N0EsMHg3MCwgMHgyNCwweDk0LCAweDAwLDB4MTAsIDB4MjAsMHgyRSwgMHgwMCwweDAxLCAweEU2LDB4MDAsIAorMHgzMCwweDNDLCAweEY1LDB4ODUsIDB4N0EsMHhBMCwgMHhGNywweDAyLCAweDAwLDB4MDEsIDB4RjYsMHgwNCwgMHgzMiwweEM4LCAweEY3LDB4MDUsIAorMHg3QSwweDcwLCAweEY3LDB4MDQsIDB4MzIsMHhDNCwgMHhGNiwweDg0LCAweDMyLDB4QzAsIDB4RjYsMHgwNSwgMHg3QSwweDJDLCAweDkwLDB4MDIsIAorMHhGRiwweDgwLCAweDkwLDB4MDIsIDB4RkYsMHgzOCwgMHhGNSwweDg0LCAweDdBLDB4MjgsIDB4MDcsMHgzOCwgMHgwMCwweDI0LCAweDk1LDB4ODIsIAorMHhGRiwweDNDLCAweDk3LDB4MDIsIDB4RkYsMHg0MCwgMHg5NiwweDAyLCAweEZGLDB4NDQsIDB4ODcsMHgzNiwgMHgxNCwweDEwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHg5NywweDM2LCAweDE0LDB4MTAsIDB4ODcsMHgzNiwgMHgxNCwweDE4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAweDE0LDB4MTgsIDB4ODcsMHgzNiwgMHgxNCwweDE4LCAweEYwLDB4MDUsIAorMHg2RiwweDUwLCAweEY3LDB4MDQsIDB4MzIsMHhCOCwgMHg5NSwweDk2LCAweEZGLDB4RUMsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweEY3LDB4MDUsIAorMHgzMiwweEI4LCAweEY3LDB4MDQsIDB4MzIsMHhCQywgMHhGMywweDA2LCAweDJGLDB4RjgsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIAorMHgzMiwweEJDLCAweEY3LDB4MDQsIDB4MzIsMHhCQywgMHhGMywweDA1LCAweDMyLDB4RDQsIDB4RjcsMHgwNiwgMHgwQywweDNFLCAweEMwLDB4N0UsIAorMHg3NCwweDAwLCAweEU2LDB4MDAsIDB4MkQsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHg3RSwgMHg3NCwweDAwLCAweEU2LDB4MDAsIAorMHgyRCwweERELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA2LCAweDBDLDB4M0UsIDB4QzcsMHg3QywgMHg3NCwweDAwLCAweDIwLDB4M0EsIAorMHgwMCwweDEwLCAweEU2LDB4MDAsIDB4MzQsMHg0NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHgzMiwweEU0LCAweEZGLDB4ODIsIAorMHgwMCwweDEwLCAweEY1LDB4ODQsIDB4NkYsMHg1OCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDIxLCAweEUyLDB4MDAsIAorMHgyRSwweDQ4LCAweEY3LDB4MDUsIDB4MzIsMHhFNCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIAorMHgyRSwweDNDLCAweEI1LDB4QkEsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjMsMHgwMiwgMHgwMCwweDIyLCAweEUwLDB4MDAsIAorMHgyRSwweDRDLCAweEYzLDB4MDUsIDB4NkYsMHg1OCwgMHhGMCwweDA1LCAweDZGLDB4NTQsIDB4RjUsMHg4NCwgMHgzMiwweEMwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkwLDB4MkUsIDB4MDAsMHgwNCwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAyLCAweEU2LDB4MDAsIDB4MkYsMHg3OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgwMiwgMHhGRiwweDM4LCAweDAzLDB4MkMsIAorMHgwRSwweEY0LCAweDkzLDB4MTYsIDB4RkYsMHhDQywgMHhGNywweDA1LCAweDdBLDB4NjgsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDk1LDB4OTYsIAorMHhGRiwweEI4LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDQzLDB4QTAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg1LDB4OTYsIAorMHhGRiwweEI4LCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDJGLDB4MzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg2LDB4MkUsIAorMHgwRSwweEY4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MTAsIDB4RTIsMHgwMCwgMHgyRSwweEQxLCAweEYzLDB4MDIsIAorMHgwMCwweDRDLCAweDg3LDB4MkUsIDB4MEYsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MkUsIAorMHgwRiwweDAwLCAweDg3LDB4MkUsIDB4MEYsMHgwMCwgMHhFMCwweDAwLCAweDJGLDB4MzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4MTMsIAorMHhGRiwweEZDLCAweEYzLDB4MDYsIDB4N0EsMHgyOCwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4NzYsMHhCMSwgMHgwMCwweDAyLCAweEM2LDB4QjQsIAorMHg2MCwweDAwLCAweDc3LDB4MzUsIDB4MDAsMHgwNCwgMHhDNywweDM4LCAweDZBLDB4MDAsIDB4ODMsMHgxNiwgMHhGRiwweENDLCAweEM3LDB4MzgsIAorMHg2MCwweDAwLCAweEM3LDB4MzgsIDB4MzAsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MTAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDk1LDB4OTYsIAorMHhGRiwweEI4LCAweDk2LDB4MTYsIDB4RkYsMHhCNCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyNiwweEY4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDg2LDB4MTYsIDB4RkYsMHhCNCwgMHg4NSwweDk2LCAweEZGLDB4QjgsIDB4MDYsMHgzMCwgMHgwMCwweDAxLCAweDIwLDB4MzIsIAorMHgwMCwweDExLCAweEU2LDB4MDAsIDB4MkYsMHgzMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweDk2LDB4MkUsIAorMHgwRSwweEY4LCAweEY3LDB4MDQsIDB4MzIsMHhDMCwgMHhGMywweDA2LCAweEUwLDB4MzAsIDB4QzAsMHgzQSwgMHgzMiwweDAwLCAweEU2LDB4MDAsIAorMHgyRiwweDc4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweEUwLDB4MTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc3LDB4QjgsIAorMHgwMCwweDFFLCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHhFNiwweDAwLCAweDJGLDB4NzksIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDBGLDB4ODEsIAorMHg0MCwweDAwLCAweEY3LDB4MDQsIDB4NzksMHhDOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIAorMHg3OSwweEM4LCAweEY3LDB4MDQsIDB4NzksMHhDOCwgMHhGNywweDA0LCAweDcxLDB4QzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MkYsMHhCNSwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEYzLDB4MDIsIAorMHgwMCwweDBBLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDJGLDB4QjQsIDB4QjMsMHgzQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIAorMHgyRCwweDM4LCAweEY3LDB4MDQsIDB4NzEsMHhENCwgMHhGNiwweDg0LCAweDcxLDB4Q0MsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIAorMHg2QSwweDAwLCAweEU2LDB4MDAsIDB4MkYsMHhEMCwgMHhGNywweDA1LCAweDcxLDB4RDQsIDB4RjAsMHgwNSwgMHg3MSwweEQ0LCAweEY2LDB4ODQsIAorMHg3MSwweEQ0LCAweEY3LDB4MDQsIDB4NzEsMHhEMCwgMHhGMCwweDA1LCAweDcxLDB4QzQsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweDQ3LDB4MEMsIAorMHgwMCwweDAxLCAweEY2LDB4ODQsIDB4MzIsMHhEMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgzMywweDkxLCAweEY3LDB4MDUsIDB4NzEsMHhDOCwgMHhGNywweDA0LCAweDcxLDB4OTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MzMsMHgzMSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3NSwweEVDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDMzLDB4MzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHg3NSwweEYwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgzMywweDMwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4MzMsMHg5NCwgMHhGMywweDA2LCAweDMxLDB4OUMsIDB4RjAsMHgwNSwgMHg3QSwweDg4LCAweDkwLDB4MDIsIAorMHhGRiwweDM4LCAweEYwLDB4MDUsIDB4NkYsMHg1MCwgMHg5MCwweDAyLCAweEZGLDB4ODAsIDB4RjcsMHgwNCwgMHgzMiwweEM0LCAweEYzLDB4MDYsIAorMHgzMiwweDI4LCAweEYzLDB4MDUsIDB4MzIsMHhENCwgMHhGNiwweDA0LCAweDMyLDB4QzgsIDB4RjYsMHg4NCwgMHg3QSwweDJDLCAweEY1LDB4MDIsIAorMHgwMCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgyNCwgMHhGNywweDA1LCAweDdBLDB4OTgsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgzMCwweDhELCAweEY2LDB4MDUsIDB4N0EsMHg5MCwgMHhDMCwweDJBLCAweDVBLDB4MDAsIDB4RTYsMHgwMCwgMHgzMywweEQ4LCAweEMwLDB4MzIsIAorMHg2QSwweDAwLCAweEVFLDB4MDAsIDB4MzMsMHhEOSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjYsMHg4NCwgMHgzMiwweEMwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MTQsMHgxMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweDk3LDB4MzYsIAorMHgxNCwweDEwLCAweDg3LDB4MzYsIDB4MTQsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MzYsIAorMHgxNCwweDE4LCAweDg3LDB4MzYsIDB4MTQsMHgxOCwgMHhGNywweDA0LCAweDMyLDB4QjgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MzgsIAorMHg2MCwweDAwLCAweEY3LDB4MDUsIDB4MzIsMHhCOCwgMHhGNywweDA0LCAweDMyLDB4QkMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4MzIsMHhCQywgMHhGNywweDA0LCAweDMyLDB4QkMsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgzMCwweEZELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDMyLDB4RTAsIDB4RjUsMHgwNSwgMHg3QSwweDcwLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4MzEsMHgwMCwgMHhGNywweDA1LCAweDMyLDB4RTAsIDB4RjUsMHgwNSwgMHg3QSwweDcwLCAweEY1LDB4ODQsIAorMHg2RiwweDU4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MjEsIDB4RTIsMHgwMCwgMHgzMSwweDQ0LCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHgzMSwweDM4LCAweEI1LDB4QkEsIAorMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGMywweDAyLCAweDAwLDB4MjIsIDB4RTAsMHgwMCwgMHgzMSwweDQ4LCAweEYzLDB4MDUsIAorMHg2RiwweDU4LCAweEYwLDB4MDUsIDB4NkYsMHg1NCwgMHhGNSwweDg0LCAweDMyLDB4QzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkwLDB4MkUsIAorMHgwMCwweDA0LCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAyLCAweEU2LDB4MDAsIAorMHgzMiwweDc0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDAyLCAweEZGLDB4MzgsIDB4MDMsMHgyQywgMHgwRSwweEY0LCAweDkzLDB4MTYsIAorMHhGRiwweEM0LCAweEY3LDB4MDUsIDB4N0EsMHg2OCwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4OTUsMHg5NiwgMHhGRiwweEI4LCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NDMsMHhBMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODUsMHg5NiwgMHhGRiwweEI4LCAweDIwLDB4MjIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MzIsMHgzMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHgyRSwgMHgwRSwweEY4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgxMCwgMHhFMiwweDAwLCAweDMxLDB4Q0QsIDB4RjMsMHgwMiwgMHgwMCwweDRDLCAweDg3LDB4MkUsIAorMHgwRiwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgyRSwgMHgwRiwweDAwLCAweDg3LDB4MkUsIAorMHgwRiwweDAwLCAweEUwLDB4MDAsIDB4MzIsMHgzMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweEYzLDB4MDYsIAorMHg3QSwweDI4LCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHg3NiwweEIxLCAweDAwLDB4MDIsIDB4QzYsMHhCNCwgMHg2MCwweDAwLCAweDc3LDB4MzUsIAorMHgwMCwweDA0LCAweEM3LDB4MzgsIDB4NkEsMHgwMCwgMHg4MywweDE2LCAweEZGLDB4QzQsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweEM3LDB4MzgsIAorMHgzMCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgxMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4OTUsMHg5NiwgMHhGRiwweEI4LCAweDk2LDB4MTYsIAorMHhGRiwweEI0LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDI2LDB4RjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg2LDB4MTYsIAorMHhGRiwweEI0LCAweDg1LDB4OTYsIDB4RkYsMHhCOCwgMHgwNiwweDMwLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDExLCAweEU2LDB4MDAsIAorMHgzMiwweDJDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4OTYsMHgyRSwgMHgwRSwweEY4LCAweEY3LDB4MDQsIAorMHgzMiwweEMwLCAweEYzLDB4MDYsIDB4RTAsMHgzMCwgMHhDMCwweDNBLCAweDMyLDB4MDAsIDB4RTYsMHgwMCwgMHgzMiwweDc0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4RTAsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHhCOCwgMHgwMCwweDFFLCAweDcwLDB4M0UsIAorMHhGRiwweEUxLCAweEU2LDB4MDAsIDB4MzIsMHg3NSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MEYsMHg4MSwgMHg0MCwweDAwLCAweEY3LDB4MDQsIAorMHg3OSwweEM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg3OSwweEM4LCAweEY3LDB4MDQsIAorMHg3OSwweEM4LCAweEY3LDB4MDQsIDB4NzEsMHhDNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgzMiwweEIxLCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjMsMHgwMiwgMHgwMCwweDBBLCAweDIwLDB4MzIsIAorMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4MzIsMHhCMCwgMHhCMywweDNBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY3LDB4MDQsIAorMHg3MSwweEQ0LCAweEY2LDB4ODQsIDB4NzEsMHhDQywgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweEU2LDB4MDAsIAorMHgzMiwweENDLCAweEY3LDB4MDUsIDB4NzEsMHhENCwgMHhGMCwweDA1LCAweDcxLDB4RDQsIDB4RjYsMHg4NCwgMHg3MSwweEQ0LCAweEY3LDB4MDQsIAorMHg3MSwweEQwLCAweEYwLDB4MDUsIDB4NzEsMHhDNCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweEY2LDB4ODQsIAorMHgzMiwweEQwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgzMywweDkxLCAweEY3LDB4MDUsIAorMHg3MSwweEM4LCAweEY3LDB4MDQsIDB4NzEsMHg5OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgzMywweDMxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDc1LDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MzMsMHgzMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3NSwweEYwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDMzLDB4ODksIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY1LDB4ODQsIAorMHg3NiwweEY4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MjEsIDB4RTIsMHgwMCwgMHgzMywweDdDLCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHgzMywweDY4LCAweEI1LDB4QkEsIAorMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGMywweDAyLCAweDAwLDB4MjIsIDB4RjMsMHgwNSwgMHg3NiwweEY4LCAweEYzLDB4MDQsIAorMHg3NywweDAwLCAweEUwLDB4MDAsIDB4MzMsMHg4MCwgMHhGMywweDA1LCAweDc2LDB4RkMsIDB4RjAsMHgwNSwgMHg3NiwweEZDLCAweEUwLDB4MDAsIAorMHgzMywweDkwLCAweEYwLDB4MDUsIDB4N0EsMHg3OCwgMHhFMCwweDAwLCAweDMzLDB4OTQsIDB4RjMsMHgwNiwgMHgzMSwweDlDLCAweEYzLDB4MDYsIAorMHgyRSwweEUwLCAweEYzLDB4MDUsIDB4MzIsMHhENCwgMHhGNywweDA0LCAweDcxLDB4QzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MzQsMHg0NCwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEYzLDB4MDIsIAorMHgwMCwweDA5LCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDM0LDB4NDQsIDB4QjMsMHgzQSwgMHg2OCwweDAyLCAweEUwLDB4MDAsIAorMHgzNCwweDQ0LCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNywweDA0LCAweDdBLDB4OTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIAorMHg2QSwweDAwLCAweEVFLDB4MDAsIDB4MzMsMHhGOSwgMHhDNSwweEI0LCAweDAwLDB4MDAsIDB4QzcsMHgzOCwgMHg1QSwweDAwLCAweEUwLDB4MDAsIAorMHgzNCwweDAwLCAweEY3LDB4MDUsIDB4N0EsMHg5MCwgMHhDNSwweEI4LCAweDAwLDB4MDAsIDB4RjAsMHgwNSwgMHg3QSwweDkwLCAweEY2LDB4ODQsIAorMHg3QSwweDg4LCAweEY3LDB4MDYsIDB4N0EsMHgyOCwgMHg3NiwweDM1LCAweDAwLDB4MDMsIDB4QTcsMHgzMiwgMHg3MCwweDAyLCAweDA2LDB4QjQsIAorMHgwMCwweDAxLCAweDk3LDB4MTYsIDB4RkYsMHhFQywgMHg4NCwweEE2LCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHg3QSwweDJDLCAweEYzLDB4MDQsIAorMHg3QSwweDk4LCAweDk0LDB4ODIsIDB4RkYsMHgzQywgMHg5MywweDAyLCAweEZGLDB4NDAsIDB4OTUsMHg4MiwgMHhGRiwweDQ0LCAweEI1LDB4QjIsIAorMHg3MCwweDAyLCAweEY3LDB4MDQsIDB4N0EsMHg5OCwgMHhGNiwweDg1LCAweDdBLDB4ODgsIDB4QzcsMHgzOCwgMHg1OCwweDAwLCAweEY3LDB4MDUsIAorMHg3QSwweDk4LCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIAorMHgwMCwweDIwLCAweEY1LDB4ODQsIDB4N0EsMHg3MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDAxLCAweEU2LDB4MDAsIAorMHgzNywweDZDLCAweEY1LDB4ODUsIDB4N0EsMHhBMCwgMHhGNywweDAyLCAweDAwLDB4MDEsIDB4RjYsMHgwNCwgMHgzMiwweEM4LCAweEY3LDB4MDUsIAorMHg3QSwweDcwLCAweEY3LDB4MDQsIDB4MzIsMHhDNCwgMHhGNiwweDg0LCAweDMyLDB4QzAsIDB4RjYsMHgwNSwgMHg3QSwweDJDLCAweDkwLDB4MDIsIAorMHhGRiwweDgwLCAweDkwLDB4MDIsIDB4RkYsMHgzOCwgMHhGNSwweDg0LCAweDdBLDB4MjgsIDB4MDcsMHgzOCwgMHgwMCwweDI0LCAweDk1LDB4ODIsIAorMHhGRiwweDNDLCAweDk3LDB4MDIsIDB4RkYsMHg0MCwgMHg5NiwweDAyLCAweEZGLDB4NDQsIDB4ODcsMHgzNiwgMHgxNCwweDEwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHg5NywweDM2LCAweDE0LDB4MTAsIDB4ODcsMHgzNiwgMHgxNCwweDE4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAweDE0LDB4MTgsIDB4ODcsMHgzNiwgMHgxNCwweDE4LCAweEYwLDB4MDUsIAorMHg2RiwweDUwLCAweEY3LDB4MDQsIDB4MzIsMHhCOCwgMHg5NSwweDk2LCAweEZGLDB4RjQsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweEY3LDB4MDUsIAorMHgzMiwweEI4LCAweEY3LDB4MDQsIDB4MzIsMHhCQywgMHhGNCwweDg2LCAweDJGLDB4RjgsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIAorMHgzMiwweEJDLCAweEY3LDB4MDQsIDB4MzIsMHhCQywgMHhGNCwweDg1LCAweDMyLDB4RDQsIDB4RjcsMHgwNiwgMHgwQywweDNFLCAweEMwLDB4N0UsIAorMHg3NCwweDAwLCAweEU2LDB4MDAsIDB4MzUsMHgxQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHg3RSwgMHg3NCwweDAwLCAweEU2LDB4MDAsIAorMHgzNSwweDBELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA2LCAweDBDLDB4M0UsIDB4QzcsMHg3QywgMHg3NCwweDAwLCAweDIwLDB4M0EsIAorMHgwMCwweDEwLCAweEU2LDB4MDAsIDB4M0IsMHg3MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHgzMiwweEU0LCAweEZGLDB4ODIsIAorMHgwMCwweDEwLCAweEY1LDB4ODQsIDB4NkYsMHg1OCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDIxLCAweEUyLDB4MDAsIAorMHgzNSwweDc4LCAweEY3LDB4MDUsIDB4MzIsMHhFNCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIAorMHgzNSwweDZDLCAweEI1LDB4QkEsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjQsMHg4MiwgMHgwMCwweDIyLCAweEUwLDB4MDAsIAorMHgzNSwweDdDLCAweEY0LDB4ODUsIDB4NkYsMHg1OCwgMHhGMCwweDA1LCAweDZGLDB4NTQsIDB4RjUsMHg4NCwgMHgzMiwweEMwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkwLDB4MkUsIDB4MDAsMHgwNCwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAyLCAweEU2LDB4MDAsIDB4MzYsMHhBOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgwMiwgMHhGRiwweDM4LCAweDA0LDB4QUMsIAorMHgwRSwweEY0LCAweDk0LDB4OTYsIDB4RkYsMHhFQywgMHhGNywweDA1LCAweDdBLDB4NjgsIDB4OTQsMHg5MywgMHhGRiwweEZDLCAweDk1LDB4OTYsIAorMHhGRiwweERDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDQzLDB4QTAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg1LDB4OTYsIAorMHhGRiwweERDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDM2LDB4NjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg2LDB4MkUsIAorMHgwRSwweEY4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MTAsIDB4RTIsMHgwMCwgMHgzNiwweDAxLCAweEY0LDB4ODIsIAorMHgwMCwweDRDLCAweDg3LDB4MkUsIDB4MEYsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MkUsIAorMHgwRiwweDAwLCAweDg3LDB4MkUsIDB4MEYsMHgwMCwgMHhFMCwweDAwLCAweDM2LDB4NjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk0LDB4OTMsIAorMHhGRiwweEZDLCAweEY0LDB4ODYsIDB4N0EsMHgyOCwgMHg5NCwweDkzLCAweEZGLDB4RkMsIDB4NzYsMHhCMSwgMHgwMCwweDAyLCAweEM2LDB4QjQsIAorMHg2MCwweDAwLCAweDc3LDB4MzUsIDB4MDAsMHgwNCwgMHhDNywweDM4LCAweDZBLDB4MDAsIDB4ODQsMHg5NiwgMHhGRiwweEVDLCAweEM3LDB4MzgsIAorMHg2MCwweDAwLCAweEM3LDB4MzgsIDB4NDgsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MTAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDk1LDB4OTYsIAorMHhGRiwweERDLCAweDk2LDB4MTYsIDB4RkYsMHhEOCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyNiwweEY4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDg2LDB4MTYsIDB4RkYsMHhEOCwgMHg4NSwweDk2LCAweEZGLDB4REMsIDB4MDYsMHgzMCwgMHgwMCwweDAxLCAweDIwLDB4MzIsIAorMHgwMCwweDExLCAweEU2LDB4MDAsIDB4MzYsMHg2MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweDk2LDB4MkUsIAorMHgwRSwweEY4LCAweEY3LDB4MDQsIDB4MzIsMHhDMCwgMHhGNCwweDg2LCAweEUwLDB4MzAsIDB4QzAsMHgzQSwgMHg0QSwweDAwLCAweEU2LDB4MDAsIAorMHgzNiwweEE4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweEUwLDB4MTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc3LDB4QjgsIAorMHgwMCwweDFFLCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHhFNiwweDAwLCAweDM2LDB4QTksIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDBGLDB4ODEsIAorMHg0MCwweDAwLCAweEY3LDB4MDQsIDB4NzksMHhDOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIAorMHg3OSwweEM4LCAweEY3LDB4MDQsIDB4NzksMHhDOCwgMHhGNywweDA0LCAweDcxLDB4QzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MzYsMHhFNSwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEY0LDB4ODIsIAorMHgwMCwweDBBLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDM2LDB4RTQsIDB4QjQsMHhCQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIAorMHgyRCwweDM4LCAweEY3LDB4MDQsIDB4NzEsMHhENCwgMHhGNiwweDg0LCAweDcxLDB4Q0MsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIAorMHg2QSwweDAwLCAweEU2LDB4MDAsIDB4MzcsMHgwMCwgMHhGNywweDA1LCAweDcxLDB4RDQsIDB4RjAsMHgwNSwgMHg3MSwweEQ0LCAweEY2LDB4ODQsIAorMHg3MSwweEQ0LCAweEY3LDB4MDQsIDB4NzEsMHhEMCwgMHhGMCwweDA1LCAweDcxLDB4QzQsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweDQ3LDB4MEMsIAorMHgwMCwweDAxLCAweEY2LDB4ODQsIDB4MzIsMHhEMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgzQSwweEMxLCAweEY3LDB4MDUsIDB4NzEsMHhDOCwgMHhGNywweDA0LCAweDcxLDB4OTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4M0EsMHg2MSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3NSwweEVDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDNBLDB4NjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHg3NSwweEYwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgzQSwweDYwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4M0EsMHhDNCwgMHhGNCwweDg2LCAweDMxLDB4OUMsIDB4RjAsMHgwNSwgMHg3QSwweDg4LCAweDkwLDB4MDIsIAorMHhGRiwweDM4LCAweEYwLDB4MDUsIDB4NkYsMHg1MCwgMHg5MCwweDAyLCAweEZGLDB4ODAsIDB4RjcsMHgwNCwgMHgzMiwweEM0LCAweEY0LDB4ODYsIAorMHgzMiwweDI4LCAweEY0LDB4ODUsIDB4MzIsMHhENCwgMHhGNiwweDA0LCAweDMyLDB4QzgsIDB4RjYsMHg4NCwgMHg3QSwweDJDLCAweEY1LDB4MDIsIAorMHgwMCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgyNCwgMHhGNywweDA1LCAweDdBLDB4OTgsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgzNywweEJELCAweEY2LDB4MDUsIDB4N0EsMHg5MCwgMHhDMCwweDJBLCAweDVBLDB4MDAsIDB4RTYsMHgwMCwgMHgzQiwweDA4LCAweEMwLDB4MzIsIAorMHg2QSwweDAwLCAweEVFLDB4MDAsIDB4M0IsMHgwOSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjYsMHg4NCwgMHgzMiwweEMwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MTQsMHgxMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweDk3LDB4MzYsIAorMHgxNCwweDEwLCAweDg3LDB4MzYsIDB4MTQsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MzYsIAorMHgxNCwweDE4LCAweDg3LDB4MzYsIDB4MTQsMHgxOCwgMHhGNywweDA0LCAweDMyLDB4QjgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MzgsIAorMHg2MCwweDAwLCAweEY3LDB4MDUsIDB4MzIsMHhCOCwgMHhGNywweDA0LCAweDMyLDB4QkMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4MzIsMHhCQywgMHhGNywweDA0LCAweDMyLDB4QkMsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgzOCwweDJELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDMyLDB4RTAsIDB4RjUsMHgwNSwgMHg3QSwweDcwLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4MzgsMHgzMCwgMHhGNywweDA1LCAweDMyLDB4RTAsIDB4RjUsMHgwNSwgMHg3QSwweDcwLCAweEY1LDB4ODQsIAorMHg2RiwweDU4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MjEsIDB4RTIsMHgwMCwgMHgzOCwweDc0LCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHgzOCwweDY4LCAweEI1LDB4QkEsIAorMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNCwweDgyLCAweDAwLDB4MjIsIDB4RTAsMHgwMCwgMHgzOCwweDc4LCAweEY0LDB4ODUsIAorMHg2RiwweDU4LCAweEYwLDB4MDUsIDB4NkYsMHg1NCwgMHhGNSwweDg0LCAweDMyLDB4QzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkwLDB4MkUsIAorMHgwMCwweDA0LCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAyLCAweEU2LDB4MDAsIAorMHgzOSwweEE0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDAyLCAweEZGLDB4MzgsIDB4MDQsMHhBQywgMHgwRSwweEY0LCAweDk0LDB4OTYsIAorMHhGRiwweEU0LCAweEY3LDB4MDUsIDB4N0EsMHg2OCwgMHg5NCwweDkzLCAweEZGLDB4RkMsIDB4OTUsMHg5NiwgMHhGRiwweERDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NDMsMHhBMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODUsMHg5NiwgMHhGRiwweERDLCAweDIwLDB4MjIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4MzksMHg2MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHgyRSwgMHgwRSwweEY4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgxMCwgMHhFMiwweDAwLCAweDM4LDB4RkQsIDB4RjQsMHg4MiwgMHgwMCwweDRDLCAweDg3LDB4MkUsIAorMHgwRiwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgyRSwgMHgwRiwweDAwLCAweDg3LDB4MkUsIAorMHgwRiwweDAwLCAweEUwLDB4MDAsIDB4MzksMHg2MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTQsMHg5MywgMHhGRiwweEZDLCAweEY0LDB4ODYsIAorMHg3QSwweDI4LCAweDk0LDB4OTMsIDB4RkYsMHhGQywgMHg3NiwweEIxLCAweDAwLDB4MDIsIDB4QzYsMHhCNCwgMHg2MCwweDAwLCAweDc3LDB4MzUsIAorMHgwMCwweDA0LCAweEM3LDB4MzgsIDB4NkEsMHgwMCwgMHg4NCwweDk2LCAweEZGLDB4RTQsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweEM3LDB4MzgsIAorMHg0OCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgxMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4OTUsMHg5NiwgMHhGRiwweERDLCAweDk2LDB4MTYsIAorMHhGRiwweEQ4LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDI2LDB4RjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg2LDB4MTYsIAorMHhGRiwweEQ4LCAweDg1LDB4OTYsIDB4RkYsMHhEQywgMHgwNiwweDMwLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDExLCAweEU2LDB4MDAsIAorMHgzOSwweDVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4OTYsMHgyRSwgMHgwRSwweEY4LCAweEY3LDB4MDQsIAorMHgzMiwweEMwLCAweEY0LDB4ODYsIDB4RTAsMHgzMCwgMHhDMCwweDNBLCAweDRBLDB4MDAsIDB4RTYsMHgwMCwgMHgzOSwweEE0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4RTAsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHhCOCwgMHgwMCwweDFFLCAweDcwLDB4M0UsIAorMHhGRiwweEUxLCAweEU2LDB4MDAsIDB4MzksMHhBNSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MEYsMHg4MSwgMHg0MCwweDAwLCAweEY3LDB4MDQsIAorMHg3OSwweEM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg3OSwweEM4LCAweEY3LDB4MDQsIAorMHg3OSwweEM4LCAweEY3LDB4MDQsIDB4NzEsMHhDNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgzOSwweEUxLCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjQsMHg4MiwgMHgwMCwweDBBLCAweDIwLDB4MzIsIAorMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4MzksMHhFMCwgMHhCNCwweEJBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY3LDB4MDQsIAorMHg3MSwweEQ0LCAweEY2LDB4ODQsIDB4NzEsMHhDQywgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweEU2LDB4MDAsIAorMHgzOSwweEZDLCAweEY3LDB4MDUsIDB4NzEsMHhENCwgMHhGMCwweDA1LCAweDcxLDB4RDQsIDB4RjYsMHg4NCwgMHg3MSwweEQ0LCAweEY3LDB4MDQsIAorMHg3MSwweEQwLCAweEYwLDB4MDUsIDB4NzEsMHhDNCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweEY2LDB4ODQsIAorMHgzMiwweEQwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgzQSwweEMxLCAweEY3LDB4MDUsIAorMHg3MSwweEM4LCAweEY3LDB4MDQsIDB4NzEsMHg5OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgzQSwweDYxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDc1LDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4M0EsMHg2MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3NSwweEYwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDNBLDB4QjksIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY1LDB4ODQsIAorMHg3NiwweEY4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MjEsIDB4RTIsMHgwMCwgMHgzQSwweEFDLCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHgzQSwweDk4LCAweEI1LDB4QkEsIAorMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNCwweDgyLCAweDAwLDB4MjIsIDB4RjQsMHg4NSwgMHg3NiwweEY4LCAweEY0LDB4ODQsIAorMHg3NywweDAwLCAweEUwLDB4MDAsIDB4M0EsMHhCMCwgMHhGNCwweDg1LCAweDc2LDB4RkMsIDB4RjAsMHgwNSwgMHg3NiwweEZDLCAweEUwLDB4MDAsIAorMHgzQSwweEMwLCAweEYwLDB4MDUsIDB4N0EsMHg3OCwgMHhFMCwweDAwLCAweDNBLDB4QzQsIDB4RjQsMHg4NiwgMHgzMSwweDlDLCAweEY0LDB4ODYsIAorMHgyRSwweEUwLCAweEY0LDB4ODUsIDB4MzIsMHhENCwgMHhGNywweDA0LCAweDcxLDB4QzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4M0IsMHg3MCwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEY0LDB4ODIsIAorMHgwMCwweDA5LCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDNCLDB4NzAsIDB4QjQsMHhCQSwgMHg2OCwweDAyLCAweEUwLDB4MDAsIAorMHgzQiwweDcwLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNywweDA0LCAweDdBLDB4OTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIAorMHg2QSwweDAwLCAweEVFLDB4MDAsIDB4M0IsMHgyOSwgMHhDNSwweEI0LCAweDAwLDB4MDAsIDB4QzcsMHgzOCwgMHg1QSwweDAwLCAweEUwLDB4MDAsIAorMHgzQiwweDMwLCAweEY3LDB4MDUsIDB4N0EsMHg5MCwgMHhDNSwweEI4LCAweDAwLDB4MDAsIDB4RjAsMHgwNSwgMHg3QSwweDkwLCAweEY3LDB4MDQsIAorMHg3QSwweDg4LCAweEY2LDB4ODYsIDB4N0EsMHgyOCwgMHg3NiwweDM5LCAweDAwLDB4MDMsIDB4QTYsMHhCMiwgMHg2OCwweDAyLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4N0EsMHg4OCwgMHhGNywweDA0LCAweDdBLDB4OTgsIDB4OTYsMHg5NiwgMHhGRiwweEY0LCAweDk2LDB4ODIsIAorMHhGRiwweDNDLCAweEY0LDB4ODQsIDB4N0EsMHg5OCwgMHhGNiwweDg2LCAweDdBLDB4MkMsIDB4QzcsMHgzOCwgMHg1OCwweDAwLCAweDk0LDB4ODIsIAorMHhGRiwweDQwLCAweDk1LDB4ODIsIDB4RkYsMHg0NCwgMHhCNSwweEIyLCAweDY4LDB4MDIsIDB4RjcsMHgwNSwgMHg3QSwweDk4LCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDE4LCAweEY1LDB4MDQsIAorMHg3QSwweDg4LCAweEY3LDB4MDYsIDB4N0EsMHgyQywgMHhGNSwweDg0LCAweDdBLDB4OTAsIDB4NzYsMHhBOSwgMHgwMCwweDAzLCAweEE2LDB4QjYsIAorMHg3MCwweDAyLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDNCLDB4Q0QsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHg3QSwweEEwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDJBLCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHgzRiwweDE4LCAweEMwLDB4MkUsIAorMHg2QSwweDAwLCAweEVFLDB4MDAsIDB4M0YsMHgxOSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjYsMHg4NCwgMHgzMiwweEMwLCAweEY2LDB4MDQsIAorMHgzMiwweEM4LCAweDg3LDB4MzYsIDB4MTQsMHgxMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweDk3LDB4MzYsIAorMHgxNCwweDEwLCAweDg3LDB4MzYsIDB4MTQsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MzYsIAorMHgxNCwweDE4LCAweDg3LDB4MzYsIDB4MTQsMHgxOCwgMHhGNywweDA0LCAweDMyLDB4QjgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MzgsIAorMHg2MCwweDAwLCAweEY3LDB4MDUsIDB4MzIsMHhCOCwgMHhGNywweDA0LCAweDMyLDB4QkMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4MzIsMHhCQywgMHhGNywweDA0LCAweDMyLDB4QkMsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgzQywweDNELCAweEY2LDB4ODIsIDB4MDAsMHgwMCwgMHhGNywweDA0LCAweDMyLDB4RTAsIDB4RjYsMHg4NSwgMHg3QSwweDcwLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4M0MsMHg0MCwgMHhGNywweDA1LCAweDMyLDB4RTAsIDB4RjUsMHgwNSwgMHg3QSwweDcwLCAweEY1LDB4ODQsIAorMHg2RiwweDU4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MjEsIDB4RTIsMHgwMCwgMHgzQywweDg0LCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHgzQywweDc4LCAweEI1LDB4QkEsIAorMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNCwweDgyLCAweDAwLDB4MjIsIDB4RTAsMHgwMCwgMHgzQywweDg4LCAweEY0LDB4ODUsIAorMHg2RiwweDU4LCAweEYwLDB4MDUsIDB4NkYsMHg1NCwgMHhGNSwweDg0LCAweDMyLDB4QzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkwLDB4MkUsIAorMHgwMCwweDA0LCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAyLCAweEU2LDB4MDAsIAorMHgzRCwweEI0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDAyLCAweEZGLDB4MzgsIDB4MDQsMHhBQywgMHgwRSwweEY0LCAweDk0LDB4OTYsIAorMHhGRiwweEVDLCAweEY3LDB4MDUsIDB4N0EsMHg2OCwgMHg5NCwweDkzLCAweEZGLDB4RkMsIDB4OTUsMHg5NiwgMHhGRiwweEU0LCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NDMsMHhBMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODUsMHg5NiwgMHhGRiwweEU0LCAweDIwLDB4MjIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4M0QsMHg3MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHgyRSwgMHgwRSwweEY4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgxMCwgMHhFMiwweDAwLCAweDNELDB4MEQsIDB4RjQsMHg4MiwgMHgwMCwweDRDLCAweDg3LDB4MkUsIAorMHgwRiwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgyRSwgMHgwRiwweDAwLCAweDg3LDB4MkUsIAorMHgwRiwweDAwLCAweEUwLDB4MDAsIDB4M0QsMHg3MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTQsMHg5MywgMHhGRiwweEZDLCAweEY0LDB4ODYsIAorMHg3QSwweDI4LCAweDk0LDB4OTMsIDB4RkYsMHhGQywgMHg3NiwweEIxLCAweDAwLDB4MDIsIDB4QzYsMHhCNCwgMHg2MCwweDAwLCAweDc3LDB4MzUsIAorMHgwMCwweDA0LCAweEM3LDB4MzgsIDB4NkEsMHgwMCwgMHg4NCwweDk2LCAweEZGLDB4RUMsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweEM3LDB4MzgsIAorMHg0OCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgxMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4OTUsMHg5NiwgMHhGRiwweEU0LCAweDk2LDB4MTYsIAorMHhGRiwweEUwLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDI2LDB4RjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg2LDB4MTYsIAorMHhGRiwweEUwLCAweDg1LDB4OTYsIDB4RkYsMHhFNCwgMHgwNiwweDMwLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDExLCAweEU2LDB4MDAsIAorMHgzRCwweDZDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4OTYsMHgyRSwgMHgwRSwweEY4LCAweEY3LDB4MDQsIAorMHgzMiwweEMwLCAweEY0LDB4ODYsIDB4RTAsMHgzMCwgMHhDMCwweDNBLCAweDRBLDB4MDAsIDB4RTYsMHgwMCwgMHgzRCwweEI0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4RTAsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHhCOCwgMHgwMCwweDFFLCAweDcwLDB4M0UsIAorMHhGRiwweEUxLCAweEU2LDB4MDAsIDB4M0QsMHhCNSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MEYsMHg4MSwgMHg0MCwweDAwLCAweEY3LDB4MDQsIAorMHg3OSwweEM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg3OSwweEM4LCAweEY3LDB4MDQsIAorMHg3OSwweEM4LCAweEY3LDB4MDQsIDB4NzEsMHhDNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgzRCwweEYxLCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjQsMHg4MiwgMHgwMCwweDBBLCAweDIwLDB4MzIsIAorMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4M0QsMHhGMCwgMHhCNCwweEJBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY3LDB4MDQsIAorMHg3MSwweEQ0LCAweEY2LDB4ODQsIDB4NzEsMHhDQywgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweEU2LDB4MDAsIAorMHgzRSwweDBDLCAweEY3LDB4MDUsIDB4NzEsMHhENCwgMHhGMCwweDA1LCAweDcxLDB4RDQsIDB4RjYsMHg4NCwgMHg3MSwweEQ0LCAweEY3LDB4MDQsIAorMHg3MSwweEQwLCAweEYwLDB4MDUsIDB4NzEsMHhDNCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweEY2LDB4ODQsIAorMHgzMiwweEQwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHgzRSwweEQxLCAweEY3LDB4MDUsIAorMHg3MSwweEM4LCAweEY3LDB4MDQsIDB4NzEsMHg5OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHgzRSwweDcxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDc1LDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4M0UsMHg3MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3NSwweEYwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDNFLDB4QzksIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY1LDB4ODQsIAorMHg3NiwweEY4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MjEsIDB4RTIsMHgwMCwgMHgzRSwweEJDLCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHgzRSwweEE4LCAweEI1LDB4QkEsIAorMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNCwweDgyLCAweDAwLDB4MjIsIDB4RjQsMHg4NSwgMHg3NiwweEY4LCAweEY0LDB4ODQsIAorMHg3NywweDAwLCAweEUwLDB4MDAsIDB4M0UsMHhDMCwgMHhGNCwweDg1LCAweDc2LDB4RkMsIDB4RjAsMHgwNSwgMHg3NiwweEZDLCAweEUwLDB4MDAsIAorMHgzRSwweEQwLCAweEYwLDB4MDUsIDB4N0EsMHg3OCwgMHhFMCwweDAwLCAweDNFLDB4RDQsIDB4RjQsMHg4NiwgMHgzMSwweDlDLCAweEY0LDB4ODYsIAorMHgyRSwweEUwLCAweEY0LDB4ODUsIDB4MzIsMHhENCwgMHhGNywweDA0LCAweDcxLDB4QzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4M0YsMHg4MCwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEY0LDB4ODIsIAorMHgwMCwweDA5LCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDNGLDB4ODAsIDB4QjQsMHhCQSwgMHg2OCwweDAyLCAweEUwLDB4MDAsIAorMHgzRiwweDgwLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNywweDA0LCAweDdBLDB4OTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIAorMHg2QSwweDAwLCAweEVFLDB4MDAsIDB4M0YsMHgzOSwgMHhDNSwweEI0LCAweDAwLDB4MDAsIDB4QzcsMHgzOCwgMHg1QSwweDAwLCAweEUwLDB4MDAsIAorMHgzRiwweDQwLCAweEY3LDB4MDUsIDB4N0EsMHg5MCwgMHhDNSwweEI4LCAweDAwLDB4MDAsIDB4RjAsMHgwNSwgMHg3QSwweDkwLCAweEY3LDB4MDQsIAorMHg3QSwweDg4LCAweEY2LDB4ODYsIDB4N0EsMHgyOCwgMHg3NiwweDM5LCAweDAwLDB4MDMsIDB4QTYsMHhCMiwgMHg2OCwweDAyLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4N0EsMHg4OCwgMHhGNywweDA0LCAweDdBLDB4OTgsIDB4OTYsMHg5NiwgMHhGRiwweEY0LCAweDk2LDB4ODIsIAorMHhGRiwweDNDLCAweEY0LDB4ODQsIDB4N0EsMHg5OCwgMHhGNiwweDg2LCAweDdBLDB4MkMsIDB4QzcsMHgzOCwgMHg1OCwweDAwLCAweDk0LDB4ODIsIAorMHhGRiwweDQwLCAweDk1LDB4ODIsIDB4RkYsMHg0NCwgMHhCNSwweEIyLCAweDY4LDB4MDIsIDB4RjcsMHgwNSwgMHg3QSwweDk4LCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDEwLCAweEY1LDB4ODQsIAorMHg2RiwweDU4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MjEsIDB4RTIsMHgwMCwgMHgzRiwweEU0LCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHgzRiwweEQ4LCAweEI1LDB4QkEsIAorMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNSwweDAyLCAweDAwLDB4MjIsIDB4RTAsMHgwMCwgMHgzRiwweEU4LCAweEY1LDB4MDUsIAorMHg2RiwweDU4LCAweEYwLDB4MDUsIDB4NkYsMHg1NCwgMHhGNSwweDg0LCAweDMyLDB4QzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkwLDB4MkUsIAorMHgwMCwweDA0LCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAyLCAweEU2LDB4MDAsIAorMHg0MSwweDE0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDAyLCAweEZGLDB4MzgsIDB4MDUsMHgyQywgMHgwRSwweEY0LCAweDk1LDB4MTYsIAorMHhGRiwweEY0LCAweEY3LDB4MDUsIDB4N0EsMHg2OCwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4OTUsMHg5NiwgMHhGRiwweEVDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NDMsMHhBMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODUsMHg5NiwgMHhGRiwweEVDLCAweDIwLDB4MjIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NDAsMHhEMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHgyRSwgMHgwRSwweEY4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgxMCwgMHhFMiwweDAwLCAweDQwLDB4NkQsIDB4RjUsMHgwMiwgMHgwMCwweDRDLCAweDg3LDB4MkUsIAorMHgwRiwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgyRSwgMHgwRiwweDAwLCAweDg3LDB4MkUsIAorMHgwRiwweDAwLCAweEUwLDB4MDAsIDB4NDAsMHhEMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweEY1LDB4MDYsIAorMHg3QSwweDI4LCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHg3NiwweEIxLCAweDAwLDB4MDIsIDB4QzYsMHhCNCwgMHg2MCwweDAwLCAweDc3LDB4MzUsIAorMHgwMCwweDA0LCAweEM3LDB4MzgsIDB4NkEsMHgwMCwgMHg4NSwweDE2LCAweEZGLDB4RjQsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweEM3LDB4MzgsIAorMHg1MCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgxMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4OTUsMHg5NiwgMHhGRiwweEVDLCAweDk2LDB4MTYsIAorMHhGRiwweEU4LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDI2LDB4RjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg2LDB4MTYsIAorMHhGRiwweEU4LCAweDg1LDB4OTYsIDB4RkYsMHhFQywgMHgwNiwweDMwLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDExLCAweEU2LDB4MDAsIAorMHg0MCwweENDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4OTYsMHgyRSwgMHgwRSwweEY4LCAweEY3LDB4MDQsIAorMHgzMiwweEMwLCAweEY1LDB4MDYsIDB4RTAsMHgzMCwgMHhDMCwweDNBLCAweDUyLDB4MDAsIDB4RTYsMHgwMCwgMHg0MSwweDE0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4RTAsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHhCOCwgMHgwMCwweDFFLCAweDcwLDB4M0UsIAorMHhGRiwweEUxLCAweEU2LDB4MDAsIDB4NDEsMHgxNSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MEYsMHg4MSwgMHg0MCwweDAwLCAweEY3LDB4MDQsIAorMHg3OSwweEM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg3OSwweEM4LCAweEY3LDB4MDQsIAorMHg3OSwweEM4LCAweEY3LDB4MDQsIDB4NzEsMHhDNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg0MSwweDUxLCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjUsMHgwMiwgMHgwMCwweDBBLCAweDIwLDB4MzIsIAorMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4NDEsMHg1MCwgMHhCNSwweDNBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY3LDB4MDQsIAorMHg3MSwweEQ0LCAweEY2LDB4ODQsIDB4NzEsMHhDQywgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweEU2LDB4MDAsIAorMHg0MSwweDZDLCAweEY3LDB4MDUsIDB4NzEsMHhENCwgMHhGMCwweDA1LCAweDcxLDB4RDQsIDB4RjYsMHg4NCwgMHg3MSwweEQ0LCAweEY3LDB4MDQsIAorMHg3MSwweEQwLCAweEYwLDB4MDUsIDB4NzEsMHhDNCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweEY2LDB4ODQsIAorMHgzMiwweEQwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg0MiwweDMxLCAweEY3LDB4MDUsIAorMHg3MSwweEM4LCAweEY3LDB4MDQsIDB4NzEsMHg5OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg0MSwweEQxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDc1LDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NDEsMHhEMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3NSwweEYwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDQyLDB4MjksIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY1LDB4ODQsIAorMHg3NiwweEY4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MjEsIDB4RTIsMHgwMCwgMHg0MiwweDFDLCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHg0MiwweDA4LCAweEI1LDB4QkEsIAorMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNSwweDAyLCAweDAwLDB4MjIsIDB4RjUsMHgwNSwgMHg3NiwweEY4LCAweEY1LDB4MDQsIAorMHg3NywweDAwLCAweEUwLDB4MDAsIDB4NDIsMHgyMCwgMHhGNSwweDA1LCAweDc2LDB4RkMsIDB4RjAsMHgwNSwgMHg3NiwweEZDLCAweEUwLDB4MDAsIAorMHg0MiwweDMwLCAweEYwLDB4MDUsIDB4N0EsMHg3OCwgMHhFMCwweDAwLCAweDQyLDB4MzQsIDB4RjUsMHgwNiwgMHgzMSwweDlDLCAweEY1LDB4MDYsIAorMHgyRSwweEUwLCAweEY1LDB4MDUsIDB4MzIsMHhENCwgMHhGNywweDA0LCAweDcxLDB4QzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NDIsMHg3NCwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEY1LDB4MDIsIAorMHgwMCwweDA5LCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDQyLDB4NzQsIDB4QjUsMHgzQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIAorMHgyRCwweDM4LCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweEY3LDB4MDYsIAorMHgzMiwweEQ0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDJFLDB4RTAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgzMiwweEQ0LCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MkYsMHg2QywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNCwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDMyLDB4RDQsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHgyRiwweEY4LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNCwweEY0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MzIsMHhENCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgzMCwweDg0LCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE0LDB4RjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHgzMiwweEQ0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDMxLDB4MTAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgzMiwweEQ0LCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MzEsMHg5QywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNCwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDMyLDB4RDQsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHgzMiwweDI4LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNCwweEY0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDg3LDB4MTYsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NiwweEJBLCAweDAwLDB4MDAsIDB4ODcsMHgzQSwgMHgwMCwweDA0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHg0NCwweDBDLCAweDAwLDB4MDEsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwNCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHg4NSwweDk2LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg2LDB4MkUsIAorMHgwMCwweDAwLCAweDg2LDB4QUUsIDB4MDAsMHgwNCwgMHgyMCwweDMyLCAweDAwLDB4MTAsIDB4RTIsMHgwMCwgMHg0MywweEQwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4MzYsIDB4MDAsMHgxMCwgMHhFMiwweDAwLCAweDQzLDB4RUQsIDB4MDcsMHgzNCwgMHgwMCwweDAxLCAweDg3LDB4MkUsIAorMHgwMCwweDBDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgyRSwgMHgwMCwweDBDLCAweDg3LDB4MkUsIAorMHgwMCwweDBDLCAweEUwLDB4MDAsIDB4NDQsMHgxNCwgMHhGNCwweDAyLCAweDAwLDB4MDAsIDB4QzAsMHgzQSwgMHg2MiwweDAwLCAweEU2LDB4MDAsIAorMHg0NCwweDExLCAweEY0LDB4MDIsIDB4MDAsMHgwMCwgMHgyMCwweDM2LCAweDAwLDB4MTAsIDB4RTYsMHgwMCwgMHg0NCwweDE0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDQ0LDB4MTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY0LDB4MDIsIAorMHgwMCwweDAxLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDA0LCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweEY3LDB4MDIsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4MzUsMHgyNCwgMHhGNywweDA0LCAweDZGLDB4NDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIAorMHgzNSwweDI4LCAweEY3LDB4MDYsIDB4MzIsMHhGNCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgzNSwweDMwLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE1LDB4NDgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDIsIAorMHg0NSwweDA0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDAyLCAweDAwLDB4MEQsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHgzMiwweEY0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDIsIDB4NEEsMHgwNCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwMiwgMHgwMCwweDBGLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MzMsMHg4MCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDAyLCAweDRFLDB4RUMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDIsIAorMHgwMCwweDA4LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDM0LDB4MEMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwMiwgMHg1NywweDY0LCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDIsIDB4MDAsMHgwNywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgzNCwweDk4LCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDE0LCAweEY3LDB4MDQsIAorMHg3NSwweEY4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg0NSwweDJELCAweEY2LDB4ODYsIAorMHg3NSwweEY4LCAweEUwLDB4MDAsIDB4NDUsMHg0NCwgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHg3NiwweDA0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4ODcsMHgzQSwgMHgwMCwweDE4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDQ1LDB4NUMsIDB4RjcsMHgwNSwgMHgzNSwweDQ4LCAweEY0LDB4ODYsIAorMHgzMywweDgwLCAweEUwLDB4MDAsIDB4NDksMHhGMCwgMHhGNCwweDg1LCAweDM1LDB4MzAsIDB4RjcsMHgwNCwgMHg2RiwweDU0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDQ1LDB4ODAsIDB4RjQsMHg4MiwgMHgwMCwweDA4LCAweEY0LDB4ODIsIAorMHgwMCwweDAxLCAweEY0LDB4ODUsIDB4NkYsMHg1NCwgMHhFMCwweDAwLCAweDQ1LDB4ODgsIDB4RjcsMHgwMiwgMHgwMCwweDAxLCAweEY0LDB4ODUsIAorMHg2RiwweDU4LCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg0NSwweEEwLCAweEY0LDB4ODIsIAorMHgwMCwweDA0LCAweEY0LDB4ODYsIDB4MzQsMHgwQywgMHhFMCwweDAwLCAweDQ5LDB4RjAsIDB4RjQsMHg4NSwgMHgzNSwweDMwLCAweEY2LDB4ODQsIAorMHgzNSwweDQ4LCAweEY2LDB4MDQsIDB4MzUsMHgyQywgMHhGNCwweEI3LCAweDI4LDB4MDAsIDB4MDcsMHgzNCwgMHgwMCwweDAyLCAweEY0LDB4ODIsIAorMHgwMCwweDAxLCAweEY0LDB4QkIsIDB4MjgsMHgwMCwgMHg4NywweDMyLCAweDAwLDB4OEMsIDB4RjQsMHg4MiwgMHgwMCwweDAxLCAweDk3LDB4MzYsIAorMHgwMCwweDE4LCAweDg3LDB4MzIsIDB4MDAsMHg5MCwgMHhGNCwweDg1LCAweDZGLDB4NTAsIDB4OTcsMHgzNiwgMHgwMCwweDA0LCAweDg0LDB4QjIsIAorMHgwMCwweDg0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NCwweEI2LCAweDAwLDB4MTAsIDB4ODQsMHhCMiwgMHgwMCwweDg4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDk0LDB4QjYsIDB4MDAsMHgxNCwgMHg4NCwweEI2LCAweDAwLDB4MTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk0LDB4QjYsIAorMHgwMCwweDA4LCAweDg0LDB4QjYsIDB4MDAsMHgxNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTQsMHhCNiwgMHgwMCwweDBDLCAweDg0LDB4QjIsIAorMHgwMCwweDk4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNCwweDg1LCAweDM1LDB4NTQsIDB4RjQsMHg4MiwgMHgwMCwweDAxLCAweDk0LDB4ODIsIAorMHhGRiwweDgwLCAweEY1LDB4MDQsIDB4MzUsMHg1NCwgMHhGNCwweDg2LCAweDM0LDB4OTgsIDB4RjQsMHg4NSwgMHgzNSwweDMwLCAweDk1LDB4MDIsIAorMHhGRiwweDM4LCAweDg1LDB4QjIsIDB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MjQsIDB4OTUsMHg4MiwgMHhGRiwweDNDLCAweDk2LDB4ODIsIAorMHhGRiwweDQwLCAweDg3LDB4MzIsIDB4MDAsMHgwNCwgMHhGNiwweDg1LCAweDM1LDB4NTAsIDB4OTcsMHgwMiwgMHhGRiwweDQ0LCAweDg2LDB4QjIsIAorMHgwMCwweDA0LCAweEYwLDB4MDUsIDB4MzUsMHg0QywgMHhGNywweDA0LCAweDM1LDB4NDAsIDB4OTUsMHgxNiwgMHhGRiwweEY0LCAweDk1LDB4OTYsIAorMHhGRiwweEY0LCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHhGNywweDA1LCAweDM1LDB4NDAsIDB4RjUsMHg4NCwgMHgzNSwweDI4LCAweDg2LDB4QjIsIAorMHgwMCwweDA0LCAweDg3LDB4MkUsIDB4MTQsMHgxNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDk3LDB4MkUsIAorMHgxNCwweDE0LCAweDg3LDB4MzIsIDB4MDAsMHg4MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAxLCAweEVFLDB4MDAsIAorMHg0OSwweEYwLCAweEY3LDB4MDYsIDB4MEMsMHgzRSwgMHhDMCwweDdFLCAweDc0LDB4MDAsIDB4RTYsMHgwMCwgMHg0NiwweEE0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4N0UsIDB4NzQsMHgwMCwgMHhFNiwweDAwLCAweDQ2LDB4OTUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDYsIAorMHgwQywweDNFLCAweEM3LDB4N0MsIDB4NzQsMHgwMCwgMHgyMCwweDNBLCAweDAwLDB4MTAsIDB4RTYsMHgwMCwgMHg0OSwweEYwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEZGLDB4ODIsIDB4MDAsMHgxMCwgMHg4NiwweDgyLCAweEZGLDB4MzgsIDB4RjcsMHgwNCwgMHgzNSwweDU4LCAweEY1LDB4ODQsIAorMHg2RiwweDU4LCAweEY2LDB4ODUsIDB4MzUsMHg1NCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDIxLCAweEUyLDB4MDAsIAorMHg0NywweDA4LCAweEY3LDB4MDUsIDB4MzUsMHg1OCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIAorMHg0NiwweEZDLCAweEI1LDB4QkEsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjQsMHg4MiwgMHgwMCwweDIyLCAweEUwLDB4MDAsIAorMHg0NywweDBDLCAweEY0LDB4ODUsIDB4NkYsMHg1OCwgMHhGMCwweDA1LCAweDZGLDB4NTQsIDB4RjYsMHg4NCwgMHgzNSwweDJDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MDAsMHg5NCwgMHhDNCwweDg0LCAweDAwLDB4MDAsIDB4QzAsMHgzQSwgMHg0QSwweDAwLCAweEU2LDB4MDAsIAorMHg0NywweDcxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NiwweDM2LCAweDAwLDB4OTQsIDB4RjYsMHg4NCwgMHgzNSwweDU0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDc2LDB4QjQsIDB4RkYsMHhGMCwgMHhGNywweDA0LCAweDM1LDB4NTQsIDB4OTYsMHg5NiwgMHhGRiwweEY0LCAweDQ3LDB4MzksIAorMHgwMCwweDAwLCAweDk3LDB4MTYsIDB4RkYsMHhGMCwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4RjcsMHgwNCwgMHgzNSwweDQ4LCAweDc3LDB4QjQsIAorMHgwMCwweDBGLCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHgwNywweDM4LCAweDAwLDB4MjQsIDB4RTYsMHgwMCwgMHg0NywweDY5LCAweEM2LDB4MzgsIAorMHg2MCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMSwgMHhDNywweDA0LCAweDZFLDB4MDAsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweEY2LDB4ODQsIAorMHgzNSwweDQ0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDBGLCAweEUyLDB4MDAsIDB4NDcsMHhCRCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgwMCwweDBDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAweDAwLDB4MEMsIDB4ODcsMHgzNiwgMHgwMCwweDBDLCAweEUwLDB4MDAsIAorMHg0NywweEQwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDM1LDB4MjgsIDB4RjYsMHg4MiwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NDksMHg2OCwgMHhGNywweDA1LCAweDM1LDB4NDQsIDB4MjAsMHgzQSwgMHgwMCwweDEwLCAweEU2LDB4MDAsIAorMHg0NywweENDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4OTcsMHgzNiwgMHgwMCwweDA0LCAweEY3LDB4MDQsIAorMHgzNSwweDNDLCAweEY2LDB4ODQsIDB4MzUsMHgyOCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHgzNSwweDNDLCAweEY3LDB4MDQsIAorMHgzNSwweDNDLCAweDg3LDB4MzYsIDB4MTQsMHgxQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MzYsIAorMHgxNCwweDFDLCAweEY3LDB4MDQsIDB4NzYsMHgwNCwgMHg4NiwweEI2LCAweDE0LDB4MUMsIDB4RjYsMHgwNCwgMHg3NSwweEZDLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4ODQsIDB4NzYsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweEU2LDB4MDAsIAorMHg0OCwweDFDLCAweEY3LDB4MDUsIDB4NzYsMHgwNCwgMHhGMCwweDA1LCAweDc2LDB4MDQsIDB4RjYsMHg4NCwgMHg3NiwweDA0LCAweEY3LDB4MDQsIAorMHg3NiwweDA4LCAweEYwLDB4MDUsIDB4NzUsMHhGQywgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NDgsMHg4MSwgMHhGNywweDA1LCAweDc1LDB4RjgsIDB4RjcsMHgwNCwgMHg3NiwweDQ4LCAweEY0LDB4ODYsIAorMHg3MiwweDE4LCAweEMwLDB4M0EsIDB4NEEsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg0OCwweDgxLCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjQsMHg4MiwgMHgwMCwweDBFLCAweDIwLDB4MzIsIAorMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4NDgsMHg4MCwgMHhCNCwweEJBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY1LDB4MDIsIAorMHgwMCwweDAwLCAweDIwLDB4MkEsIDB4MDAsMHgwMiwgMHhFRSwweDAwLCAweDQ5LDB4NjgsIDB4RjYsMHg4MiwgMHgwMCwweDAwLCAweEY2LDB4ODQsIAorMHgzNSwweDI4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAyLCAweEU2LDB4MDAsIDB4NDksMHgzQywgMHgwNSwweEI0LCAweDAwLDB4MDgsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDk1LDB4MTYsIAorMHhGRiwweEVDLCAweDk1LDB4OTYsIDB4RkYsMHhFOCwgMHg5NiwweDk2LCAweEZGLDB4RTQsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHg1RSwweERDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NSwweDE2LCAweEZGLDB4RUMsIDB4ODUsMHg5NiwgMHhGRiwweEU4LCAweDg2LDB4OTYsIAorMHhGRiwweEU0LCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDQ5LDB4MkMsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweDg2LDB4MzYsIAorMHgwMCwweDBDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MEYsIDB4RTIsMHgwMCwgMHg0OSwweDExLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MDAsMHgxNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MzYsIAorMHgwMCwweDE0LCAweDg3LDB4MzYsIDB4MDAsMHgxNCwgMHhFMCwweDAwLCAweDQ5LDB4MkMsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4NjAsMHgwMCwgMHg3NywweDM1LCAweDAwLDB4MDUsIDB4QzcsMHgzOCwgMHg2QSwweDAwLCAweEM3LDB4MzgsIAorMHg2MCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgxMCwgMHhDNywweDJDLCAweDcwLDB4MDAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg0NywweEE4LCAweEY3LDB4MDUsIDB4MzUsMHgyQywgMHhGNiwweDg0LCAweDM1LDB4MjgsIDB4RjcsMHgwNCwgMHg2RiwweDRDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDQ5LDB4NUMsIDB4MDcsMHgzNCwgMHgxNCwweDk0LCAweEY0LDB4ODQsIAorMHg2RiwweDQ0LCAweEUwLDB4MDAsIDB4NDksMHg2MCwgMHhGNCwweDg1LCAweDM1LDB4MjgsIDB4RjcsMHgwNSwgMHgzNSwweDI4LCAweEUwLDB4MDAsIAorMHg0OCwweDg0LCAweDA1LDB4MjgsIDB4MDAsMHgwMSwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg0OSwweEExLCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGNCwweDgyLCAweDAwLDB4MEQsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIAorMHg0OSwweEE4LCAweEI0LDB4QkEsIDB4NjgsMHgwMiwgMHhFMCwweDAwLCAweDQ5LDB4QTgsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY0LDB4ODIsIAorMHgwMCwweDAxLCAweEY0LDB4ODUsIDB4MzUsMHgyNCwgMHhGNiwweDg0LCAweDM1LDB4MjgsIDB4RjcsMHgwNCwgMHg2RiwweDQ0LCAweEY0LDB4ODYsIAorMHgzMiwweEY0LCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDQ5LDB4RjAsIDB4RjQsMHg4NSwgMHgzNSwweDMwLCAweEY3LDB4MDQsIAorMHhFMCwweDE4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweEI4LCAweDAwLDB4MUYsIDB4NzAsMHgzRSwgMHhGRiwweEUxLCAweEU2LDB4MDAsIAorMHg0OSwweEYxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwRiwweDgxLCAweDQwLDB4MDAsIDB4RjcsMHgwNCwgMHg3OSwweEM4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAweDc5LDB4QzgsIDB4RjcsMHgwNCwgMHg3OSwweEM4LCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDE0LCAweEY3LDB4MDQsIAorMHg3NSwweEY4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg0QSwweDJELCAweEY2LDB4ODYsIAorMHg3NSwweEY4LCAweEUwLDB4MDAsIDB4NEEsMHg0MCwgMHhGNiwweDgyLCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHg3NiwweDA0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4ODYsMHhCQSwgMHgwMCwweDE4LCAweEY3LDB4MDQsIAorMHg2RiwweDU0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg0QSwweDY0LCAweEY2LDB4ODUsIAorMHgzNSwweDQ4LCAweEY0LDB4ODIsIDB4MDAsMHgwMSwgMHhGNCwweDg1LCAweDZGLDB4NTQsIDB4RTAsMHgwMCwgMHg0QSwweDcwLCAweEY3LDB4MDIsIAorMHgwMCwweDAxLCAweEY0LDB4ODIsIDB4MDAsMHgwOCwgMHhGNCwweDg1LCAweDZGLDB4NTgsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NEEsMHg4OCwgMHhGNCwweDgyLCAweDAwLDB4MDQsIDB4RjQsMHg4NiwgMHgzNCwweDBDLCAweEUwLDB4MDAsIAorMHg0RSwweEQ4LCAweEY0LDB4ODUsIDB4MzUsMHgzMCwgMHhGNiwweDg0LCAweDM1LDB4NDgsIDB4RjYsMHgwNCwgMHgzNSwweDJDLCAweEY0LDB4QjcsIAorMHgyOCwweDAwLCAweDA3LDB4MzQsIDB4MDAsMHgwMiwgMHhGNCwweDgyLCAweDAwLDB4MDEsIDB4RjQsMHhCQiwgMHgyOCwweDAwLCAweDg3LDB4MzIsIAorMHgwMCwweDhDLCAweEY0LDB4ODIsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAweDAwLDB4MTgsIDB4ODcsMHgzMiwgMHgwMCwweDkwLCAweEY0LDB4ODUsIAorMHg2RiwweDUwLCAweDk3LDB4MzYsIDB4MDAsMHgwNCwgMHg4NCwweEIyLCAweDAwLDB4ODQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk0LDB4QjYsIAorMHgwMCwweDEwLCAweDg0LDB4QjIsIDB4MDAsMHg4OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTQsMHhCNiwgMHgwMCwweDE0LCAweDg0LDB4QjYsIAorMHgwMCwweDEwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NCwweEI2LCAweDAwLDB4MDgsIDB4ODQsMHhCNiwgMHgwMCwweDE0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDk0LDB4QjYsIDB4MDAsMHgwQywgMHg4NCwweEIyLCAweDAwLDB4OTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY0LDB4ODUsIAorMHgzNSwweDU0LCAweEY0LDB4ODIsIDB4MDAsMHgwMSwgMHg5NCwweDgyLCAweEZGLDB4ODAsIDB4RjUsMHgwNCwgMHgzNSwweDU0LCAweEY0LDB4ODYsIAorMHgzNCwweDk4LCAweEY0LDB4ODUsIDB4MzUsMHgzMCwgMHg5NSwweDAyLCAweEZGLDB4MzgsIDB4ODUsMHhCMiwgMHgwMCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDI0LCAweDk1LDB4ODIsIDB4RkYsMHgzQywgMHg5NiwweDgyLCAweEZGLDB4NDAsIDB4ODcsMHgzMiwgMHgwMCwweDA0LCAweEY2LDB4ODUsIAorMHgzNSwweDUwLCAweDk3LDB4MDIsIDB4RkYsMHg0NCwgMHg4NiwweEIyLCAweDAwLDB4MDQsIDB4RjAsMHgwNSwgMHgzNSwweDRDLCAweEY3LDB4MDQsIAorMHgzNSwweDQwLCAweDk1LDB4MTYsIDB4RkYsMHhGNCwgMHg5NSwweDk2LCAweEZGLDB4RjQsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweEY3LDB4MDUsIAorMHgzNSwweDQwLCAweEY1LDB4ODQsIDB4MzUsMHgyOCwgMHg4NiwweEIyLCAweDAwLDB4MDQsIDB4ODcsMHgyRSwgMHgxNCwweDE0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHg5NywweDJFLCAweDE0LDB4MTQsIDB4ODcsMHgzMiwgMHgwMCwweDgwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMSwgMHhFRSwweDAwLCAweDRFLDB4RDgsIDB4RjcsMHgwNiwgMHgwQywweDNFLCAweEMwLDB4N0UsIAorMHg3NCwweDAwLCAweEU2LDB4MDAsIDB4NEIsMHg4QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHg3RSwgMHg3NCwweDAwLCAweEU2LDB4MDAsIAorMHg0QiwweDdELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA2LCAweDBDLDB4M0UsIDB4QzcsMHg3QywgMHg3NCwweDAwLCAweDIwLDB4M0EsIAorMHgwMCwweDEwLCAweEU2LDB4MDAsIDB4NEUsMHhEOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RkYsMHg4MiwgMHgwMCwweDEwLCAweDg2LDB4ODIsIAorMHhGRiwweDM4LCAweEY3LDB4MDQsIDB4MzUsMHg1OCwgMHhGNSwweDg0LCAweDZGLDB4NTgsIDB4RjYsMHg4NSwgMHgzNSwweDU0LCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgyMSwgMHhFMiwweDAwLCAweDRCLDB4RjAsIDB4RjcsMHgwNSwgMHgzNSwweDU4LCAweEY3LDB4MDQsIAorMHgyRCwweDM4LCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIAorMHgwMCwweDAyLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDRCLDB4RTQsIDB4QjUsMHhCQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIAorMHgyRCwweDM4LCAweEY0LDB4ODIsIDB4MDAsMHgyMiwgMHhFMCwweDAwLCAweDRCLDB4RjQsIDB4RjQsMHg4NSwgMHg2RiwweDU4LCAweEYwLDB4MDUsIAorMHg2RiwweDU0LCAweEY2LDB4ODQsIDB4MzUsMHgyQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgwMCwweDk0LCAweEM0LDB4ODQsIAorMHgwMCwweDAwLCAweEMwLDB4M0EsIDB4NEEsMHgwMCwgMHhFNiwweDAwLCAweDRDLDB4NTksIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg2LDB4MzYsIAorMHgwMCwweDk0LCAweEY2LDB4ODQsIDB4MzUsMHg1NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzYsMHhCNCwgMHhGRiwweEYwLCAweEY3LDB4MDQsIAorMHgzNSwweDU0LCAweDk2LDB4OTYsIDB4RkYsMHhGNCwgMHg0NywweDM5LCAweDAwLDB4MDAsIDB4OTcsMHgxNiwgMHhGRiwweEYwLCAweEM2LDB4QjQsIAorMHg3MCwweDAwLCAweEY3LDB4MDQsIDB4MzUsMHg0OCwgMHg3NywweEI0LCAweDAwLDB4MEYsIDB4NzAsMHgzRSwgMHhGRiwweEUxLCAweDA3LDB4MzgsIAorMHgwMCwweDI0LCAweEU2LDB4MDAsIDB4NEMsMHg1MSwgMHhDNiwweDM4LCAweDYwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAxLCAweEM3LDB4MDQsIAorMHg2RSwweDAwLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHhGNiwweDg0LCAweDM1LDB4NDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MzYsIAorMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MEYsIDB4RTIsMHgwMCwgMHg0QywweEE1LCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MDAsMHgwQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MzYsIAorMHgwMCwweDBDLCAweDg3LDB4MzYsIDB4MDAsMHgwQywgMHhFMCwweDAwLCAweDRDLDB4QjgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHgzNSwweDI4LCAweEY2LDB4ODIsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHg0RSwweDUwLCAweEY3LDB4MDUsIAorMHgzNSwweDQ0LCAweDIwLDB4M0EsIDB4MDAsMHgxMCwgMHhFNiwweDAwLCAweDRDLDB4QjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDIsIAorMHgwMCwweDAwLCAweDk3LDB4MzYsIDB4MDAsMHgwNCwgMHhGNywweDA0LCAweDM1LDB4M0MsIDB4RjYsMHg4NCwgMHgzNSwweDI4LCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4MzUsMHgzQywgMHhGNywweDA0LCAweDM1LDB4M0MsIDB4ODcsMHgzNiwgMHgxNCwweDFDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAweDE0LDB4MUMsIDB4RjcsMHgwNCwgMHg3NiwweDA0LCAweDg2LDB4QjYsIAorMHgxNCwweDFDLCAweEY2LDB4MDQsIDB4NzUsMHhGQywgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjYsMHg4NCwgMHg3NiwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NkEsMHgwMCwgMHhFNiwweDAwLCAweDRELDB4MDQsIDB4RjcsMHgwNSwgMHg3NiwweDA0LCAweEYwLDB4MDUsIAorMHg3NiwweDA0LCAweEY2LDB4ODQsIDB4NzYsMHgwNCwgMHhGNywweDA0LCAweDc2LDB4MDgsIDB4RjAsMHgwNSwgMHg3NSwweEZDLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg0RCwweDY5LCAweEY3LDB4MDUsIAorMHg3NSwweEY4LCAweEY3LDB4MDQsIDB4NzYsMHg0OCwgMHhGNCwweDg2LCAweDcyLDB4MTgsIDB4QzAsMHgzQSwgMHg0QSwweDAwLCAweDQ3LDB4MEMsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDRELDB4NjksIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweEY3LDB4MDQsIAorMHgyRCwweDM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIAorMHgwMCwweDAyLCAweEY0LDB4ODIsIDB4MDAsMHgwRSwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHg0RCwweDY4LCAweEI0LDB4QkEsIAorMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNSwweDAyLCAweDAwLDB4MDAsIDB4MjAsMHgyQSwgMHgwMCwweDAyLCAweEVFLDB4MDAsIAorMHg0RSwweDUwLCAweEY2LDB4ODIsIDB4MDAsMHgwMCwgMHhGNiwweDg0LCAweDM1LDB4MjgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MzYsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDIsIDB4RTYsMHgwMCwgMHg0RSwweDI0LCAweDA1LDB4QjQsIAorMHgwMCwweDA4LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHg5NSwweDE2LCAweEZGLDB4RUMsIDB4OTUsMHg5NiwgMHhGRiwweEU4LCAweDk2LDB4OTYsIAorMHhGRiwweEU0LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDVFLDB4REMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg1LDB4MTYsIAorMHhGRiwweEVDLCAweDg1LDB4OTYsIDB4RkYsMHhFOCwgMHg4NiwweDk2LCAweEZGLDB4RTQsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg0RSwweDE0LCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHg4NiwweDM2LCAweDAwLDB4MEMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MzIsIAorMHgwMCwweDBGLCAweEUyLDB4MDAsIDB4NEQsMHhGOSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgwMCwweDE0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAweDAwLDB4MTQsIDB4ODcsMHgzNiwgMHgwMCwweDE0LCAweEUwLDB4MDAsIAorMHg0RSwweDE0LCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MDIsIDB4QzYsMHhCNCwgMHg2MCwweDAwLCAweDc3LDB4MzUsIAorMHgwMCwweDA1LCAweEM3LDB4MzgsIDB4NkEsMHgwMCwgMHhDNywweDM4LCAweDYwLDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDEwLCAweEM3LDB4MkMsIAorMHg3MCwweDAwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDRDLDB4OTAsIDB4RjcsMHgwNSwgMHgzNSwweDJDLCAweEY2LDB4ODQsIAorMHgzNSwweDI4LCAweEY3LDB4MDQsIDB4NkYsMHg0QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHg0RSwweDQ0LCAweDA3LDB4MzQsIDB4MTQsMHg5NCwgMHhGNCwweDg0LCAweDZGLDB4NDQsIDB4RTAsMHgwMCwgMHg0RSwweDQ4LCAweEY0LDB4ODUsIAorMHgzNSwweDI4LCAweEY3LDB4MDUsIDB4MzUsMHgyOCwgMHhFMCwweDAwLCAweDRELDB4NkMsIDB4MDUsMHgyOCwgMHgwMCwweDAxLCAweDIwLDB4MzYsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NEUsMHg4OSwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEY0LDB4ODIsIAorMHgwMCwweDBELCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDRFLDB4OTAsIDB4QjQsMHhCQSwgMHg2OCwweDAyLCAweEUwLDB4MDAsIAorMHg0RSwweDkwLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNCwweDgyLCAweDAwLDB4MDEsIDB4RjQsMHg4NSwgMHgzNSwweDI0LCAweEY2LDB4ODQsIAorMHgzNSwweDI4LCAweEY3LDB4MDQsIDB4NkYsMHg0NCwgMHhGNCwweDg2LCAweDMyLDB4RjQsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHg0RSwweEQ4LCAweEY0LDB4ODUsIDB4MzUsMHgzMCwgMHhGNywweDA0LCAweEUwLDB4MTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc3LDB4QjgsIAorMHgwMCwweDFGLCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHhFNiwweDAwLCAweDRFLDB4RDksIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDBGLDB4ODEsIAorMHg0MCwweDAwLCAweEY3LDB4MDQsIDB4NzksMHhDOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIAorMHg3OSwweEM4LCAweEY3LDB4MDQsIDB4NzksMHhDOCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHgxNCwgMHhGNiwweDg0LCAweDM1LDB4NDgsIDB4RjYsMHgwNCwgMHgzNSwweDJDLCAweEY0LDB4ODIsIAorMHgwMCwweDA0LCAweEY0LDB4QjcsIDB4MjgsMHgwMCwgMHgwNywweDM0LCAweDAwLDB4MDIsIDB4RjQsMHg4MiwgMHgwMCwweDAxLCAweEY0LDB4QkIsIAorMHgyOCwweDAwLCAweDg3LDB4MzIsIDB4MDAsMHg4QywgMHhGNCwweDgyLCAweDAwLDB4MDEsIDB4OTcsMHgzNiwgMHgwMCwweDE4LCAweDg3LDB4MzIsIAorMHgwMCwweDkwLCAweEY0LDB4ODUsIDB4NkYsMHg1MCwgMHg5NywweDM2LCAweDAwLDB4MDQsIDB4ODQsMHhCMiwgMHgwMCwweDg0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDk0LDB4QjYsIDB4MDAsMHgxMCwgMHg4NCwweEIyLCAweDAwLDB4ODgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk0LDB4QjYsIAorMHgwMCwweDE0LCAweDg0LDB4QjYsIDB4MDAsMHgxMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTQsMHhCNiwgMHgwMCwweDA4LCAweDg0LDB4QjYsIAorMHgwMCwweDE0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NCwweEI2LCAweDAwLDB4MEMsIDB4ODQsMHhCMiwgMHgwMCwweDk4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY0LDB4ODUsIDB4MzUsMHg1NCwgMHhGNCwweDgyLCAweDAwLDB4MDEsIDB4OTQsMHg4MiwgMHhGRiwweDgwLCAweEY1LDB4MDQsIAorMHgzNSwweDU0LCAweEY0LDB4ODYsIDB4MzQsMHg5OCwgMHhGNCwweDg1LCAweDM1LDB4MzAsIDB4OTUsMHgwMiwgMHhGRiwweDM4LCAweDg1LDB4QjIsIAorMHgwMCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgyNCwgMHg5NSwweDgyLCAweEZGLDB4M0MsIDB4OTYsMHg4MiwgMHhGRiwweDQwLCAweDg3LDB4MzIsIAorMHgwMCwweDA0LCAweEY2LDB4ODUsIDB4MzUsMHg1MCwgMHg5NywweDAyLCAweEZGLDB4NDQsIDB4ODYsMHhCMiwgMHgwMCwweDA0LCAweEYwLDB4MDUsIAorMHgzNSwweDRDLCAweEY3LDB4MDQsIDB4MzUsMHg0MCwgMHg5NSwweDE2LCAweEZGLDB4RjQsIDB4OTUsMHg5NiwgMHhGRiwweEY0LCAweEM3LDB4MzgsIAorMHg2OCwweDAwLCAweEY3LDB4MDUsIDB4MzUsMHg0MCwgMHhGNSwweDg0LCAweDM1LDB4MjgsIDB4ODYsMHhCMiwgMHgwMCwweDA0LCAweDg3LDB4MkUsIAorMHgxNCwweDE0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4OTcsMHgyRSwgMHgxNCwweDE0LCAweDg3LDB4MzIsIAorMHgwMCwweDgwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDEsIDB4RUUsMHgwMCwgMHg1MywweDRDLCAweEY3LDB4MDYsIAorMHgwQywweDNFLCAweEMwLDB4N0UsIDB4NzQsMHgwMCwgMHhFNiwweDAwLCAweDUwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4N0UsIAorMHg3NCwweDAwLCAweEU2LDB4MDAsIDB4NEYsMHhGMSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNiwgMHgwQywweDNFLCAweEM3LDB4N0MsIAorMHg3NCwweDAwLCAweDIwLDB4M0EsIDB4MDAsMHgxMCwgMHhFNiwweDAwLCAweDUzLDB4NEMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEZGLDB4ODIsIAorMHgwMCwweDEwLCAweDg2LDB4ODIsIDB4RkYsMHgzOCwgMHhGNywweDA0LCAweDM1LDB4NTgsIDB4RjUsMHg4NCwgMHg2RiwweDU4LCAweEY2LDB4ODUsIAorMHgzNSwweDU0LCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MjEsIDB4RTIsMHgwMCwgMHg1MCwweDY0LCAweEY3LDB4MDUsIAorMHgzNSwweDU4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHg1MCwweDU4LCAweEI1LDB4QkEsIAorMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNCwweDgyLCAweDAwLDB4MjIsIDB4RTAsMHgwMCwgMHg1MCwweDY4LCAweEY0LDB4ODUsIAorMHg2RiwweDU4LCAweEYwLDB4MDUsIDB4NkYsMHg1NCwgMHhGNiwweDg0LCAweDM1LDB4MkMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MzYsIAorMHgwMCwweDk0LCAweEM0LDB4ODQsIDB4MDAsMHgwMCwgMHhDMCwweDNBLCAweDRBLDB4MDAsIDB4RTYsMHgwMCwgMHg1MCwweENELCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg2LDB4MzYsIDB4MDAsMHg5NCwgMHhGNiwweDg0LCAweDM1LDB4NTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc2LDB4QjQsIAorMHhGRiwweEYwLCAweEY3LDB4MDQsIDB4MzUsMHg1NCwgMHg5NiwweDk2LCAweEZGLDB4RjQsIDB4NDcsMHgzOSwgMHgwMCwweDAwLCAweDk3LDB4MTYsIAorMHhGRiwweEYwLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHhGNywweDA0LCAweDM1LDB4NDgsIDB4NzcsMHhCNCwgMHgwMCwweDBGLCAweDcwLDB4M0UsIAorMHhGRiwweEUxLCAweDA3LDB4MzgsIDB4MDAsMHgyNCwgMHhFNiwweDAwLCAweDUwLDB4QzUsIDB4QzYsMHgzOCwgMHg2MCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDAxLCAweEM3LDB4MDQsIDB4NkUsMHgwMCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4RjYsMHg4NCwgMHgzNSwweDQ0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDBGLCAweEUyLDB4MDAsIAorMHg1MSwweDE5LCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4MEMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweDk3LDB4MzYsIDB4MDAsMHgwQywgMHg4NywweDM2LCAweDAwLDB4MEMsIDB4RTAsMHgwMCwgMHg1MSwweDJDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4MzUsMHgyOCwgMHhGNiwweDgyLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHg1MiwweEM0LCAweEY3LDB4MDUsIDB4MzUsMHg0NCwgMHgyMCwweDNBLCAweDAwLDB4MTAsIDB4RTYsMHgwMCwgMHg1MSwweDI4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHg5NywweDM2LCAweDAwLDB4MDQsIDB4RjcsMHgwNCwgMHgzNSwweDNDLCAweEY2LDB4ODQsIAorMHgzNSwweDI4LCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAweDM1LDB4M0MsIDB4RjcsMHgwNCwgMHgzNSwweDNDLCAweDg3LDB4MzYsIAorMHgxNCwweDFDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgzNiwgMHgxNCwweDFDLCAweEY3LDB4MDQsIAorMHg3NiwweDA0LCAweDg2LDB4QjYsIDB4MTQsMHgxQywgMHhGNiwweDA0LCAweDc1LDB4RkMsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4ODQsIAorMHg3NiwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDZBLDB4MDAsIDB4RTYsMHgwMCwgMHg1MSwweDc4LCAweEY3LDB4MDUsIAorMHg3NiwweDA0LCAweEYwLDB4MDUsIDB4NzYsMHgwNCwgMHhGNiwweDg0LCAweDc2LDB4MDQsIDB4RjcsMHgwNCwgMHg3NiwweDA4LCAweEYwLDB4MDUsIAorMHg3NSwweEZDLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg1MSwweERELCAweEY3LDB4MDUsIDB4NzUsMHhGOCwgMHhGNywweDA0LCAweDc2LDB4NDgsIDB4RjQsMHg4NiwgMHg3MiwweDE4LCAweEMwLDB4M0EsIAorMHg0QSwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg1MSwweERELCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGNCwweDgyLCAweDAwLDB4MEUsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIAorMHg1MSwweERDLCAweEI0LDB4QkEsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjUsMHgwMiwgMHgwMCwweDAwLCAweDIwLDB4MkEsIAorMHgwMCwweDAyLCAweEVFLDB4MDAsIDB4NTIsMHhDNCwgMHhGNiwweDgyLCAweDAwLDB4MDAsIDB4RjYsMHg4NCwgMHgzNSwweDI4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAyLCAweEU2LDB4MDAsIAorMHg1MiwweDk4LCAweDA1LDB4QjQsIDB4MDAsMHgwOCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4OTUsMHgxNiwgMHhGRiwweEVDLCAweDk1LDB4OTYsIAorMHhGRiwweEU4LCAweDk2LDB4OTYsIDB4RkYsMHhFNCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHg1RSwweERDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDg1LDB4MTYsIDB4RkYsMHhFQywgMHg4NSwweDk2LCAweEZGLDB4RTgsIDB4ODYsMHg5NiwgMHhGRiwweEU0LCAweDIwLDB4MjIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NTIsMHg4OCwgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4ODYsMHgzNiwgMHgwMCwweDBDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwRiwgMHhFMiwweDAwLCAweDUyLDB4NkQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MzYsIAorMHgwMCwweDE0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgzNiwgMHgwMCwweDE0LCAweDg3LDB4MzYsIAorMHgwMCwweDE0LCAweEUwLDB4MDAsIDB4NTIsMHg4OCwgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDAyLCAweEM2LDB4QjQsIAorMHg2MCwweDAwLCAweDc3LDB4MzUsIDB4MDAsMHgwNSwgMHhDNywweDM4LCAweDZBLDB4MDAsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweDA3LDB4MzgsIAorMHgwMCwweDEwLCAweEM3LDB4MkMsIDB4NzAsMHgwMCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg1MSwweDA0LCAweEY3LDB4MDUsIAorMHgzNSwweDJDLCAweEY2LDB4ODQsIDB4MzUsMHgyOCwgMHhGNywweDA0LCAweDZGLDB4NEMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4NTIsMHhCOCwgMHgwNywweDM0LCAweDE0LDB4OTQsIDB4RjQsMHg4NCwgMHg2RiwweDQ0LCAweEUwLDB4MDAsIAorMHg1MiwweEJDLCAweEY0LDB4ODUsIDB4MzUsMHgyOCwgMHhGNywweDA1LCAweDM1LDB4MjgsIDB4RTAsMHgwMCwgMHg1MSwweEUwLCAweDA1LDB4MjgsIAorMHgwMCwweDAxLCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDUyLDB4RkQsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweEY3LDB4MDQsIAorMHgyRCwweDM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIAorMHgwMCwweDAyLCAweEY0LDB4ODIsIDB4MDAsMHgwRCwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHg1MywweDA0LCAweEI0LDB4QkEsIAorMHg2OCwweDAyLCAweEUwLDB4MDAsIDB4NTMsMHgwNCwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjQsMHg4MiwgMHgwMCwweDAxLCAweEY0LDB4ODUsIAorMHgzNSwweDI0LCAweEY2LDB4ODQsIDB4MzUsMHgyOCwgMHhGNywweDA0LCAweDZGLDB4NDQsIDB4RjQsMHg4NiwgMHgzMiwweEY0LCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4NTMsMHg0QywgMHhGNCwweDg1LCAweDM1LDB4MzAsIDB4RjcsMHgwNCwgMHhFMCwweDE4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDc3LDB4QjgsIDB4MDAsMHgxRiwgMHg3MCwweDNFLCAweEZGLDB4RTEsIDB4RTYsMHgwMCwgMHg1MywweDRELCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDBGLDB4ODEsIDB4NDAsMHgwMCwgMHhGNywweDA0LCAweDc5LDB4QzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NzksMHhDOCwgMHhGNywweDA0LCAweDc5LDB4QzgsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4MTQsIDB4RjQsMHg4NCwgMHgzNSwweDU0LCAweEY2LDB4ODQsIAorMHgzNSwweDRDLCAweEY1LDB4ODQsIDB4MzUsMHgyQywgMHg5NCwweDgyLCAweEZGLDB4MzgsIDB4NzYsMHhCNSwgMHgwMCwweDAzLCAweEE1LDB4MkUsIAorMHg2OCwweDAyLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDAyLCAweEZGLDB4M0MsIDB4RjMsMHg4NCwgMHgzNSwweDUwLCAweEM2LDB4QUMsIAorMHg2OCwweDAwLCAweDkzLDB4ODIsIDB4RkYsMHg0MCwgMHg4NywweDM2LCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk3LDB4MDIsIAorMHhGRiwweDQ0LCAweDg2LDB4MzYsIDB4MDAsMHgwNCwgMHhGNywweDA0LCAweDM1LDB4NDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MzgsIAorMHg2MCwweDAwLCAweEY3LDB4MDUsIDB4MzUsMHg0MCwgMHhGNiwweDA0LCAweDM1LDB4MjgsIDB4ODYsMHhCNiwgMHgwMCwweDA0LCAweDg3LDB4MzIsIAorMHgxNCwweDE0LCAweDk0LDB4OTYsIDB4RkYsMHhGNCwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4OTcsMHgzMiwgMHgxNCwweDE0LCAweDg3LDB4MkUsIAorMHgwMCwweDgwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDEsIDB4RUUsMHgwMCwgMHg1NywweDUwLCAweDk1LDB4MTYsIAorMHhGRiwweEY0LCAweEY3LDB4MDYsIDB4MEMsMHgzRSwgMHhDMCwweDdFLCAweDc0LDB4MDAsIDB4RTYsMHgwMCwgMHg1NCwweDA0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4N0UsIDB4NzQsMHgwMCwgMHhFNiwweDAwLCAweDUzLDB4RjUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDYsIAorMHgwQywweDNFLCAweEM3LDB4N0MsIDB4NzQsMHgwMCwgMHgyMCwweDNBLCAweDAwLDB4MTAsIDB4RTYsMHgwMCwgMHg1NywweDUwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEZGLDB4ODIsIDB4MDAsMHgxMCwgMHg4NiwweDgyLCAweEZGLDB4MzgsIDB4RjcsMHgwNCwgMHgzNSwweDU4LCAweEY1LDB4ODQsIAorMHg2RiwweDU4LCAweEY2LDB4ODUsIDB4MzUsMHg1NCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDIxLCAweEUyLDB4MDAsIAorMHg1NCwweDY4LCAweEY3LDB4MDUsIDB4MzUsMHg1OCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIAorMHg1NCwweDVDLCAweEI1LDB4QkEsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjMsMHg4MiwgMHgwMCwweDIyLCAweEUwLDB4MDAsIAorMHg1NCwweDZDLCAweEYzLDB4ODUsIDB4NkYsMHg1OCwgMHhGMCwweDA1LCAweDZGLDB4NTQsIDB4RjYsMHg4NCwgMHgzNSwweDJDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MDAsMHg5NCwgMHhDMywweDg0LCAweDAwLDB4MDAsIDB4QzAsMHgzQSwgMHgzQSwweDAwLCAweEU2LDB4MDAsIAorMHg1NCwweEQxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NiwweDM2LCAweDAwLDB4OTQsIDB4RjYsMHg4NCwgMHgzNSwweDU0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDc2LDB4QjQsIDB4RkYsMHhGMCwgMHhGNywweDA0LCAweDM1LDB4NTQsIDB4OTYsMHg5NiwgMHhGRiwweEY0LCAweDQ3LDB4MzksIAorMHgwMCwweDAwLCAweDk3LDB4MTYsIDB4RkYsMHhGMCwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4RjcsMHgwNCwgMHgzNSwweDQ4LCAweDc3LDB4QjQsIAorMHgwMCwweDBGLCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHgwNywweDM4LCAweDAwLDB4MjQsIDB4RTYsMHgwMCwgMHg1NCwweEM5LCAweEM2LDB4MzgsIAorMHg2MCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMSwgMHhDNywweDA0LCAweDZFLDB4MDAsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweEY2LDB4ODQsIAorMHgzNSwweDQ0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDBGLCAweEUyLDB4MDAsIDB4NTUsMHgxRCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgwMCwweDBDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAweDAwLDB4MEMsIDB4ODcsMHgzNiwgMHgwMCwweDBDLCAweEUwLDB4MDAsIAorMHg1NSwweDMwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDM1LDB4MjgsIDB4RjYsMHg4MiwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NTYsMHhDOCwgMHhGNywweDA1LCAweDM1LDB4NDQsIDB4MjAsMHgzQSwgMHgwMCwweDEwLCAweEU2LDB4MDAsIAorMHg1NSwweDJDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4OTcsMHgzNiwgMHgwMCwweDA0LCAweEY3LDB4MDQsIAorMHgzNSwweDNDLCAweEY2LDB4ODQsIDB4MzUsMHgyOCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHgzNSwweDNDLCAweEY3LDB4MDQsIAorMHgzNSwweDNDLCAweDg3LDB4MzYsIDB4MTQsMHgxQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MzYsIAorMHgxNCwweDFDLCAweEY3LDB4MDQsIDB4NzYsMHgwNCwgMHg4NiwweEI2LCAweDE0LDB4MUMsIDB4RjYsMHgwNCwgMHg3NSwweEZDLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4ODQsIDB4NzYsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweEU2LDB4MDAsIAorMHg1NSwweDdDLCAweEY3LDB4MDUsIDB4NzYsMHgwNCwgMHhGMCwweDA1LCAweDc2LDB4MDQsIDB4RjYsMHg4NCwgMHg3NiwweDA0LCAweEY3LDB4MDQsIAorMHg3NiwweDA4LCAweEYwLDB4MDUsIDB4NzUsMHhGQywgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NTUsMHhFMSwgMHhGNywweDA1LCAweDc1LDB4RjgsIDB4RjcsMHgwNCwgMHg3NiwweDQ4LCAweEYzLDB4ODYsIAorMHg3MiwweDE4LCAweEMwLDB4M0EsIDB4M0EsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg1NSwweEUxLCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjMsMHg4MiwgMHgwMCwweDBFLCAweDIwLDB4MzIsIAorMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4NTUsMHhFMCwgMHhCMywweEJBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY1LDB4MDIsIAorMHgwMCwweDAwLCAweDIwLDB4MkEsIDB4MDAsMHgwMiwgMHhFRSwweDAwLCAweDU2LDB4QzgsIDB4RjYsMHg4MiwgMHgwMCwweDAwLCAweEY2LDB4ODQsIAorMHgzNSwweDI4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAyLCAweEU2LDB4MDAsIDB4NTYsMHg5QywgMHgwNSwweEI0LCAweDAwLDB4MDgsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDk1LDB4MTYsIAorMHhGRiwweEVDLCAweDk1LDB4OTYsIDB4RkYsMHhFOCwgMHg5NiwweDk2LCAweEZGLDB4RTQsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHg1RSwweERDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NSwweDE2LCAweEZGLDB4RUMsIDB4ODUsMHg5NiwgMHhGRiwweEU4LCAweDg2LDB4OTYsIAorMHhGRiwweEU0LCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDU2LDB4OEMsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweDg2LDB4MzYsIAorMHgwMCwweDBDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MEYsIDB4RTIsMHgwMCwgMHg1NiwweDcxLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MDAsMHgxNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MzYsIAorMHgwMCwweDE0LCAweDg3LDB4MzYsIDB4MDAsMHgxNCwgMHhFMCwweDAwLCAweDU2LDB4OEMsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4NjAsMHgwMCwgMHg3NywweDM1LCAweDAwLDB4MDUsIDB4QzcsMHgzOCwgMHg2QSwweDAwLCAweEM3LDB4MzgsIAorMHg2MCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgxMCwgMHhDNywweDJDLCAweDcwLDB4MDAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg1NSwweDA4LCAweEY3LDB4MDUsIDB4MzUsMHgyQywgMHhGNiwweDg0LCAweDM1LDB4MjgsIDB4RjcsMHgwNCwgMHg2RiwweDRDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDU2LDB4QkMsIDB4MDcsMHgzNCwgMHgxNCwweDk0LCAweEYzLDB4ODQsIAorMHg2RiwweDQ0LCAweEUwLDB4MDAsIDB4NTYsMHhDMCwgMHhGMywweDg1LCAweDM1LDB4MjgsIDB4RjcsMHgwNSwgMHgzNSwweDI4LCAweEUwLDB4MDAsIAorMHg1NSwweEU0LCAweDA1LDB4MjgsIDB4MDAsMHgwMSwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg1NywweDAxLCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGMywweDgyLCAweDAwLDB4MEQsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIAorMHg1NywweDA4LCAweEIzLDB4QkEsIDB4NjgsMHgwMiwgMHhFMCwweDAwLCAweDU3LDB4MDgsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEYzLDB4ODIsIAorMHgwMCwweDAxLCAweEYzLDB4ODUsIDB4MzUsMHgyNCwgMHhGNiwweDg0LCAweDM1LDB4MjgsIDB4RjcsMHgwNCwgMHg2RiwweDQ0LCAweEYzLDB4ODYsIAorMHgzMiwweEY0LCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDU3LDB4NTAsIDB4RjMsMHg4NSwgMHgzNSwweDMwLCAweEY3LDB4MDQsIAorMHhFMCwweDE4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweEI4LCAweDAwLDB4MUYsIDB4NzAsMHgzRSwgMHhGRiwweEUxLCAweEU2LDB4MDAsIAorMHg1NywweDUxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwRiwweDgxLCAweDQwLDB4MDAsIDB4RjcsMHgwNCwgMHg3OSwweEM4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAweDc5LDB4QzgsIDB4RjcsMHgwNCwgMHg3OSwweEM4LCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDE0LCAweDg3LDB4MDIsIAorMHhGRiwweDM4LCAweEYzLDB4ODQsIDB4MzUsMHgyQywgMHhGNywweDA1LCAweDM1LDB4NTQsIDB4ODcsMHgxRSwgMHgwMCwweDgwLCAweEY1LDB4MDQsIAorMHgzNSwweDRDLCAweDI3LDB4MzgsIDB4MDAsMHgwMSwgMHhDMCwweDJBLCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHg1QSwweDRDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY1LDB4ODQsIDB4NkYsMHg1OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDIxLCAweEUyLDB4MDAsIAorMHg1NywweEQ4LCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIAorMHg1NywweENDLCAweEI1LDB4QkEsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjMsMHgwMiwgMHgwMCwweDIyLCAweEUwLDB4MDAsIAorMHg1NywweERDLCAweEYzLDB4MDUsIDB4NkYsMHg1OCwgMHhGMCwweDA1LCAweDZGLDB4NTQsIDB4RjYsMHg4NCwgMHgzNSwweDJDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MDAsMHg5NCwgMHhDMywweDA0LCAweDAwLDB4MDAsIDB4QzAsMHgzQSwgMHgzMiwweDAwLCAweEU2LDB4MDAsIAorMHg1OCwweDQxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NiwweDM2LCAweDAwLDB4OTQsIDB4RjYsMHg4NCwgMHgzNSwweDU0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDc2LDB4QjQsIDB4RkYsMHhGMCwgMHhGNywweDA0LCAweDM1LDB4NTQsIDB4OTYsMHg5NiwgMHhGRiwweEY0LCAweDQ3LDB4MzksIAorMHgwMCwweDAwLCAweDk3LDB4MTYsIDB4RkYsMHhGMCwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4RjcsMHgwNCwgMHgzNSwweDQ4LCAweDc3LDB4QjQsIAorMHgwMCwweDBGLCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHgwNywweDM4LCAweDAwLDB4MjQsIDB4RTYsMHgwMCwgMHg1OCwweDM5LCAweEM2LDB4MzgsIAorMHg2MCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMSwgMHhDNywweDA0LCAweDZFLDB4MDAsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweEY2LDB4ODQsIAorMHgzNSwweDQ0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDBGLCAweEUyLDB4MDAsIDB4NTgsMHg4RCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgwMCwweDBDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAweDAwLDB4MEMsIDB4ODcsMHgzNiwgMHgwMCwweDBDLCAweEUwLDB4MDAsIAorMHg1OCwweEEwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDM1LDB4MjgsIDB4RjYsMHg4MiwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NUEsMHgzOCwgMHhGNywweDA1LCAweDM1LDB4NDQsIDB4MjAsMHgzQSwgMHgwMCwweDEwLCAweEU2LDB4MDAsIAorMHg1OCwweDlDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4OTcsMHgzNiwgMHgwMCwweDA0LCAweEY3LDB4MDQsIAorMHgzNSwweDNDLCAweEY2LDB4ODQsIDB4MzUsMHgyOCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHgzNSwweDNDLCAweEY3LDB4MDQsIAorMHgzNSwweDNDLCAweDg3LDB4MzYsIDB4MTQsMHgxQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MzYsIAorMHgxNCwweDFDLCAweEY3LDB4MDQsIDB4NzYsMHgwNCwgMHg4NiwweEI2LCAweDE0LDB4MUMsIDB4RjYsMHgwNCwgMHg3NSwweEZDLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4ODQsIDB4NzYsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweEU2LDB4MDAsIAorMHg1OCwweEVDLCAweEY3LDB4MDUsIDB4NzYsMHgwNCwgMHhGMCwweDA1LCAweDc2LDB4MDQsIDB4RjYsMHg4NCwgMHg3NiwweDA0LCAweEY3LDB4MDQsIAorMHg3NiwweDA4LCAweEYwLDB4MDUsIDB4NzUsMHhGQywgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NTksMHg1MSwgMHhGNywweDA1LCAweDc1LDB4RjgsIDB4RjcsMHgwNCwgMHg3NiwweDQ4LCAweEYzLDB4MDYsIAorMHg3MiwweDE4LCAweEMwLDB4M0EsIDB4MzIsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg1OSwweDUxLCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjMsMHgwMiwgMHgwMCwweDBFLCAweDIwLDB4MzIsIAorMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4NTksMHg1MCwgMHhCMywweDNBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY1LDB4MDIsIAorMHgwMCwweDAwLCAweDIwLDB4MkEsIDB4MDAsMHgwMiwgMHhFRSwweDAwLCAweDVBLDB4MzgsIDB4RjYsMHg4MiwgMHgwMCwweDAwLCAweEY2LDB4ODQsIAorMHgzNSwweDI4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAyLCAweEU2LDB4MDAsIDB4NUEsMHgwQywgMHgwNSwweEI0LCAweDAwLDB4MDgsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDk1LDB4MTYsIAorMHhGRiwweEVDLCAweDk1LDB4OTYsIDB4RkYsMHhFOCwgMHg5NiwweDk2LCAweEZGLDB4RTQsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHg1RSwweERDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NSwweDE2LCAweEZGLDB4RUMsIDB4ODUsMHg5NiwgMHhGRiwweEU4LCAweDg2LDB4OTYsIAorMHhGRiwweEU0LCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDU5LDB4RkMsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweDg2LDB4MzYsIAorMHgwMCwweDBDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MEYsIDB4RTIsMHgwMCwgMHg1OSwweEUxLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MDAsMHgxNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MzYsIAorMHgwMCwweDE0LCAweDg3LDB4MzYsIDB4MDAsMHgxNCwgMHhFMCwweDAwLCAweDU5LDB4RkMsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4NjAsMHgwMCwgMHg3NywweDM1LCAweDAwLDB4MDUsIDB4QzcsMHgzOCwgMHg2QSwweDAwLCAweEM3LDB4MzgsIAorMHg2MCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgxMCwgMHhDNywweDJDLCAweDcwLDB4MDAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg1OCwweDc4LCAweEY3LDB4MDUsIDB4MzUsMHgyQywgMHhGNiwweDg0LCAweDM1LDB4MjgsIDB4RjcsMHgwNCwgMHg2RiwweDRDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDVBLDB4MkMsIDB4MDcsMHgzNCwgMHgxNCwweDk0LCAweEYzLDB4MDQsIAorMHg2RiwweDQ0LCAweEUwLDB4MDAsIDB4NUEsMHgzMCwgMHhGMywweDA1LCAweDM1LDB4MjgsIDB4RjcsMHgwNSwgMHgzNSwweDI4LCAweEUwLDB4MDAsIAorMHg1OSwweDU0LCAweDA1LDB4MjgsIDB4MDAsMHgwMSwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg1RCwweEM0LCAweEYzLDB4MDIsIAorMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4NUQsMHhGMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHgyOSwgMHgwMCwweDAzLCAweEM3LDB4MUMsIAorMHg3MCwweDAwLCAweDg3LDB4M0EsIDB4MDAsMHgwNCwgMHgwNSwweDI4LCAweDAwLDB4MDEsIDB4NzYsMHhBOSwgMHgwMCwweDAzLCAweEY0LDB4ODQsIAorMHgzNSwweDU0LCAweEY2LDB4MDQsIDB4MzUsMHg1MCwgMHg5NCwweDgyLCAweEZGLDB4MzgsIDB4QTQsMHgxRSwgMHg2OCwweDAyLCAweEM2LDB4MzAsIAorMHg3MCwweDAwLCAweDk0LDB4MDIsIDB4RkYsMHgzQywgMHg5NiwweDAyLCAweEZGLDB4NDAsIDB4QzYsMHg5QywgMHg2OCwweDAwLCAweDg3LDB4MzYsIAorMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NywweDAyLCAweEZGLDB4NDQsIDB4ODUsMHhCNiwgMHgwMCwweDA0LCAweEY3LDB4MDQsIAorMHgzNSwweDQwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAweDU4LDB4MDAsIDB4RjcsMHgwNSwgMHgzNSwweDQwLCAweDg1LDB4QjYsIAorMHgwMCwweDA0LCAweEY1LDB4MDUsIDB4MzUsMHg0QywgMHhGNiwweDg0LCAweDM1LDB4MjgsIDB4RjYsMHgwNSwgMHgzNSwweDUwLCAweDg3LDB4MzYsIAorMHgxNCwweDE0LCAweDk0LDB4OTYsIDB4RkYsMHhGNCwgMHhDNywweDM4LCAweDU4LDB4MDAsIDB4OTcsMHgzNiwgMHgxNCwweDE0LCAweDg3LDB4MUUsIAorMHgwMCwweDgwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDEsIDB4RUUsMHgwMCwgMHg1RSwweDNDLCAweDk0LDB4MTYsIAorMHhGRiwweEY0LCAweEY3LDB4MDYsIDB4MEMsMHgzRSwgMHhDMCwweDdFLCAweDc0LDB4MDAsIDB4RTYsMHgwMCwgMHg1QSwweEY0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4N0UsIDB4NzQsMHgwMCwgMHhFNiwweDAwLCAweDVBLDB4RTUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDYsIAorMHgwQywweDNFLCAweEM3LDB4N0MsIDB4NzQsMHgwMCwgMHgyMCwweDNBLCAweDAwLDB4MTAsIDB4RTYsMHgwMCwgMHg1RSwweDNDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEZGLDB4ODIsIDB4MDAsMHgxMCwgMHg4NiwweDgyLCAweEZGLDB4MzgsIDB4RjcsMHgwNCwgMHgzNSwweDU4LCAweEY1LDB4ODQsIAorMHg2RiwweDU4LCAweEY2LDB4ODUsIDB4MzUsMHg1NCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDIxLCAweEUyLDB4MDAsIAorMHg1QiwweDU4LCAweEY3LDB4MDUsIDB4MzUsMHg1OCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIAorMHg1QiwweDRDLCAweEI1LDB4QkEsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjMsMHgwMiwgMHgwMCwweDIyLCAweEUwLDB4MDAsIAorMHg1QiwweDVDLCAweEYzLDB4MDUsIDB4NkYsMHg1OCwgMHhGMCwweDA1LCAweDZGLDB4NTQsIDB4RjYsMHg4NCwgMHgzNSwweDJDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MDAsMHg5NCwgMHhDMywweDA0LCAweDAwLDB4MDAsIDB4QzAsMHgzQSwgMHgzMiwweDAwLCAweEU2LDB4MDAsIAorMHg1QiwweEMxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NiwweDM2LCAweDAwLDB4OTQsIDB4RjYsMHg4NCwgMHgzNSwweDU0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDc2LDB4QjQsIDB4RkYsMHhGMCwgMHhGNywweDA0LCAweDM1LDB4NTQsIDB4OTYsMHg5NiwgMHhGRiwweEY0LCAweDQ3LDB4MzksIAorMHgwMCwweDAwLCAweDk3LDB4MTYsIDB4RkYsMHhGMCwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4RjcsMHgwNCwgMHgzNSwweDQ4LCAweDc3LDB4QjQsIAorMHgwMCwweDBGLCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHgwNywweDM4LCAweDAwLDB4MjQsIDB4RTYsMHgwMCwgMHg1QiwweEI5LCAweEM2LDB4MzgsIAorMHg2MCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMSwgMHhDNywweDA0LCAweDZFLDB4MDAsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweEY2LDB4ODQsIAorMHgzNSwweDQ0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDBGLCAweEUyLDB4MDAsIDB4NUMsMHgwRCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgwMCwweDBDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDM2LCAweDAwLDB4MEMsIDB4ODcsMHgzNiwgMHgwMCwweDBDLCAweEUwLDB4MDAsIAorMHg1QywweDIwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDM1LDB4MjgsIDB4RjYsMHg4MiwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NUQsMHhCOCwgMHhGNywweDA1LCAweDM1LDB4NDQsIDB4MjAsMHgzQSwgMHgwMCwweDEwLCAweEU2LDB4MDAsIAorMHg1QywweDFDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4OTcsMHgzNiwgMHgwMCwweDA0LCAweEY3LDB4MDQsIAorMHgzNSwweDNDLCAweEY2LDB4ODQsIDB4MzUsMHgyOCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHgzNSwweDNDLCAweEY3LDB4MDQsIAorMHgzNSwweDNDLCAweDg3LDB4MzYsIDB4MTQsMHgxQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MzYsIAorMHgxNCwweDFDLCAweEY3LDB4MDQsIDB4NzYsMHgwNCwgMHg4NiwweEI2LCAweDE0LDB4MUMsIDB4RjYsMHgwNCwgMHg3NSwweEZDLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4ODQsIDB4NzYsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweEU2LDB4MDAsIAorMHg1QywweDZDLCAweEY3LDB4MDUsIDB4NzYsMHgwNCwgMHhGMCwweDA1LCAweDc2LDB4MDQsIDB4RjYsMHg4NCwgMHg3NiwweDA0LCAweEY3LDB4MDQsIAorMHg3NiwweDA4LCAweEYwLDB4MDUsIDB4NzUsMHhGQywgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NUMsMHhEMSwgMHhGNywweDA1LCAweDc1LDB4RjgsIDB4RjcsMHgwNCwgMHg3NiwweDQ4LCAweEYzLDB4MDYsIAorMHg3MiwweDE4LCAweEMwLDB4M0EsIDB4MzIsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg1QywweEQxLCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjMsMHgwMiwgMHgwMCwweDBFLCAweDIwLDB4MzIsIAorMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4NUMsMHhEMCwgMHhCMywweDNBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY1LDB4MDIsIAorMHgwMCwweDAwLCAweDIwLDB4MkEsIDB4MDAsMHgwMiwgMHhFRSwweDAwLCAweDVELDB4QjgsIDB4RjYsMHg4MiwgMHgwMCwweDAwLCAweEY2LDB4ODQsIAorMHgzNSwweDI4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAyLCAweEU2LDB4MDAsIDB4NUQsMHg4QywgMHgwNSwweEI0LCAweDAwLDB4MDgsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDk1LDB4MTYsIAorMHhGRiwweEVDLCAweDk1LDB4OTYsIDB4RkYsMHhFOCwgMHg5NiwweDk2LCAweEZGLDB4RTQsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHg1RSwweERDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NSwweDE2LCAweEZGLDB4RUMsIDB4ODUsMHg5NiwgMHhGRiwweEU4LCAweDg2LDB4OTYsIAorMHhGRiwweEU0LCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDVELDB4N0MsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweDg2LDB4MzYsIAorMHgwMCwweDBDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MEYsIDB4RTIsMHgwMCwgMHg1RCwweDYxLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MDAsMHgxNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MzYsIAorMHgwMCwweDE0LCAweDg3LDB4MzYsIDB4MDAsMHgxNCwgMHhFMCwweDAwLCAweDVELDB4N0MsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4NjAsMHgwMCwgMHg3NywweDM1LCAweDAwLDB4MDUsIDB4QzcsMHgzOCwgMHg2QSwweDAwLCAweEM3LDB4MzgsIAorMHg2MCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgxMCwgMHhDNywweDJDLCAweDcwLDB4MDAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg1QiwweEY4LCAweEY3LDB4MDUsIDB4MzUsMHgyQywgMHhGNiwweDg0LCAweDM1LDB4MjgsIDB4RjcsMHgwNCwgMHg2RiwweDRDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDVELDB4QUMsIDB4MDcsMHgzNCwgMHgxNCwweDk0LCAweEYzLDB4MDQsIAorMHg2RiwweDQ0LCAweEUwLDB4MDAsIDB4NUQsMHhCMCwgMHhGMywweDA1LCAweDM1LDB4MjgsIDB4RjcsMHgwNSwgMHgzNSwweDI4LCAweEUwLDB4MDAsIAorMHg1QywweEQ0LCAweDA1LDB4MjgsIDB4MDAsMHgwMSwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg1RCwweEYxLCAweEYzLDB4MDIsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGMywweDAyLCAweDAwLDB4MEQsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIAorMHg1RCwweEY0LCAweEIzLDB4M0EsIDB4NjgsMHgwMiwgMHhFMCwweDAwLCAweDVELDB4RjQsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEYzLDB4MDUsIAorMHgzNSwweDI0LCAweEY2LDB4ODQsIDB4MzUsMHgyOCwgMHhGNywweDA0LCAweDZGLDB4NDQsIDB4RjMsMHgwNiwgMHgzMiwweEY0LCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4NUUsMHgzQywgMHhGMywweDA1LCAweDM1LDB4MzAsIDB4RjcsMHgwNCwgMHhFMCwweDE4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDc3LDB4QjgsIDB4MDAsMHgxRiwgMHg3MCwweDNFLCAweEZGLDB4RTEsIDB4RTYsMHgwMCwgMHg1RSwweDNELCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDBGLDB4ODEsIDB4NDAsMHgwMCwgMHhGNywweDA0LCAweDc5LDB4QzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NzksMHhDOCwgMHhGNywweDA0LCAweDc5LDB4QzgsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNywweDA2LCAweDM1LDB4MzAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHgzMiwweEY0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNCwweEY0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MzUsMHgzMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgzMywweDgwLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE0LDB4RjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHgzNSwweDMwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDM0LDB4MEMsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgzNSwweDMwLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MzQsMHg5OCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNCwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDg2LDB4MTYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzMiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwRiwgMHg4NiwweEIyLCAweDAwLDB4MDAsIDB4QzUsMHgzOCwgMHgwMCwweDAwLCAweEVFLDB4MDAsIAorMHg1RiwweDJDLCAweEM1LDB4QjQsIDB4MDAsMHgwMCwgMHgyMCwweDM2LCAweDAwLDB4MEYsIDB4RUUsMHgwMCwgMHg1RiwweDJDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFQywweDAwLCAweDVGLDB4MkQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MzYsIAorMHgwMCwweDAwLCAweEVDLDB4MDAsIDB4NUYsMHg0OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzMiwgMHgwMCwweDBDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHg5NywweDMyLCAweDAwLDB4MEMsIDB4ODcsMHgzMiwgMHgwMCwweDBDLCAweEUwLDB4MDAsIAorMHg1RiwweDUwLCAweEY0LDB4MDIsIDB4MDAsMHgwMCwgMHhDMCwweDJBLCAweDVBLDB4MDAsIDB4NDQsMHgwQywgMHgwMCwweDAxLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDQsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweEY2LDB4ODYsIAorMHgzNSwweDYwLCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHhGNiwweDg2LCAweDQyLDB4MzAsIDB4OTYsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg0OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjYsMHg4MiwgMHg2NiwweEY4LCAweDk2LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4ODIsIDB4MDAsMHgxNywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjYsMHg4NiwgMHgzNSwweDYwLCAweDk2LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY2LDB4ODIsIAorMHg2OSwweDgwLCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MTgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY2LDB4ODYsIAorMHgzNSwweDYwLCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY2LDB4ODIsIDB4NkIsMHg1MCwgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4RjcsMHg4MiwgMHgwMCwweDE2LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY2LDB4ODYsIDB4MzUsMHg2MCwgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNiwweDgyLCAweDYxLDB4NzgsIDB4OTYsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4ODIsIAorMHgwMCwweDFGLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNiwweDg2LCAweDM1LDB4NjAsIDB4OTYsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjYsMHg4MiwgMHg2MiwweDdDLCAweDk2LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4ODIsIDB4MDAsMHgyMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjYsMHg4NiwgMHgzNSwweDYwLCAweDk2LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY2LDB4ODIsIAorMHg2NiwweEY4LCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MTcsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY2LDB4ODYsIAorMHgzNSwweEVDLCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY2LDB4ODIsIDB4NjksMHg4MCwgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4RjcsMHg4MiwgMHgwMCwweDE4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY2LDB4ODYsIDB4MzUsMHhFQywgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNiwweDgyLCAweDZCLDB4NTAsIDB4OTYsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4ODIsIAorMHgwMCwweDE2LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNiwweDg2LCAweDM1LDB4RUMsIDB4OTYsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjYsMHg4MiwgMHg2MSwweDc4LCAweDk2LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4ODIsIDB4MDAsMHgxRiwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjYsMHg4NiwgMHgzNSwweEVDLCAweDk2LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY2LDB4ODIsIAorMHg2MiwweDdDLCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MjAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY2LDB4ODYsIAorMHgzNSwweEVDLCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDQsIDB4RTAsMHgyOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg2MSwweDE1LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweEUwLDB4MjgsIDB4RTAsMHgwMCwgMHg2MSwweDE4LCAweDc3LDB4MzksIAorMHgwMCwweDAyLCAweEY3LDB4MDIsIDB4MDAsMHhGMCwgMHhGNywweDA1LCAweDQyLDB4MjgsIDB4RjcsMHgwNiwgMHg0MCwweDhBLCAweEYwLDB4M0IsIAorMHgyOCwweDAwLCAweEY3LDB4MDYsIDB4NDAsMHg4QywgMHhGMCwweDNCLCAweDI4LDB4MDAsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweEY3LDB4MDUsIAorMHg3QSwweEMwLCAweEY3LDB4MDUsIDB4N0EsMHhCOCwgMHhGNywweDA1LCAweDdBLDB4QjAsIDB4RjcsMHgwNSwgMHg3QSwweEM4LCAweEY2LDB4ODIsIAorMHhDMywweDUwLCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHhGNiwweDgyLCAweDAwLDB4MTYsIDB4OTYsMHg5MywgMHhGRiwweEZDLCAweEY2LDB4ODYsIAorMHg0MiwweDMwLCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgxRSwweEMwLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweEY2LDB4MDQsIAorMHg2RiwweDM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg2MSwweEVELCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweDIwLDB4M0EsIDB4MDAsMHgwNywgMHhFNiwweDAwLCAweDYxLDB4RUMsIDB4MDYsMHhCMCwgMHgwMCwweDAyLCAweDg3LDB4MzYsIAorMHgwMCwweDAwLCAweDc2LDB4QjUsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweDIwLDB4M0EsIDB4MDAsMHgwMSwgMHhFNiwweDAwLCAweDYxLDB4RUMsIDB4RjUsMHgwNiwgMHgzNSwweEVDLCAweEY3LDB4MDQsIAorMHg0MiwweDMwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDUyLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NjIsMHgxMSwgMHhGNSwweDgyLCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHg0MiwweEEwLCAweEY2LDB4MDYsIAorMHg0MiwweEEyLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhFMCwweDAwLCAweDYyLDB4NjgsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweDg3LDB4MzIsIAorMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAweEUwLDB4MDAsIDB4ODYsMHhCMiwgMHgwMCwweDA4LCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NjIsMHgzQywgMHhGNiwweDg1LCAweEUwLDB4MDQsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg2MiwweDQwLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhGNSwweDgyLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg2MiwweDY1LCAweEY2LDB4MDYsIDB4NDIsMHhBMiwgMHhGNywweDA0LCAweDQyLDB4QTAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MzMsIAorMHgyOCwweDAwLCAweEYwLDB4MDUsIDB4NDIsMHgyOCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweEY3LDB4MDQsIDB4NDIsMHgzQywgMHhGNiwweDg0LCAweDZGLDB4MzQsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDIwLDB4MzYsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NjIsMHhCMSwgMHhGNywweDA1LCAweDQyLDB4M0MsIDB4ODcsMHgzNiwgMHgwMCwweDAwLCAweEY1LDB4OUUsIAorMHgwMCwweDAyLCAweEMwLDB4M0EsIDB4NUEsMHgwMCwgMHhFNiwweDAwLCAweDYyLDB4QkQsIDB4RjUsMHg4NiwgMHgzNSwweEVDLCAweEY3LDB4MDQsIAorMHg0MiwweEEwLCAweEUwLDB4MDAsIDB4NjIsMHhEQywgMHhGNiwweDA2LCAweDQyLDB4QTIsIDB4RjcsMHgwNCwgMHg0MiwweDMwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NUEsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg2MiwweEY5LCAweEY2LDB4MDYsIDB4NDIsMHhBNCwgMHhGNywweDA0LCAweDQyLDB4QTQsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEUwLDB4MDAsIAorMHg2MywweDBDLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHg2MywweDIwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGMCwweDA1LCAweDQyLDB4MjgsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4MjAsIDB4ODMsMHgxNiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MUEsIDB4MDAsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg2MywweDZDLCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHg4MywweDlBLCAweDAwLDB4MUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEYzLDB4ODUsIAorMHg3QSwweEMwLCAweDg0LDB4OUEsIDB4MDAsMHgxNCwgMHhGNywweDA1LCAweDdBLDB4QzgsIDB4RjQsMHg4NSwgMHg3QSwweEIwLCAweEY3LDB4MDUsIAorMHg3QSwweEI4LCAweDgzLDB4MTYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHg5QSwgMHgwMCwweDE0LCAweEY3LDB4MDQsIAorMHg3QSwweEIwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHg2MywweEQwLCAweEY2LDB4MDIsIAorMHgwMCwweDAwLCAweDg2LDB4OUEsIDB4MDAsMHgxQywgMHhGNywweDA0LCAweDdBLDB4QzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4NjMsMHhEMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHg5QSwgMHgwMCwweDE4LCAweEY3LDB4MDQsIAorMHg3QSwweEI4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHg2MywweEQwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg2LDB4OUEsIDB4MDAsMHgyMCwgMHhGNywweDA0LCAweDdBLDB4QzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MzgsIAorMHg2OCwweDAwLCAweDIwLDB4M0EsIDB4MDAsMHg2NCwgMHhFRSwweDAwLCAweDYzLDB4RDksIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEY2LDB4MDIsIAorMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDY0LDB4NTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDgzLDB4OTYsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDFFLCAweDAwLDB4MTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NjQsMHgzQywgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4RjcsMHgwNSwgMHg0MCwweDgwLCAweEY3LDB4MDUsIAorMHg0MCwweDg0LCAweEY2LDB4ODQsIDB4NkUsMHg1MCwgMHhGNCwweDgyLCAweEZGLDB4RkYsIDB4ODMsMHgxRSwgMHgwMCwweDBDLCAweEY0LDB4ODUsIAorMHg0RiwweDU0LCAweDkzLDB4MzYsIDB4MDAsMHgxMCwgMHg4MywweDlFLCAweDAwLDB4MTAsIDB4ODQsMHg5NiwgMHgwMCwweDAwLCAweDkzLDB4QjYsIAorMHgwMCwweDE0LCAweDg0LDB4QTYsIDB4MDAsMHgwOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTQsMHhCNiwgMHgxRCwweERDLCAweEY2LDB4ODIsIAorMHgwMCwweDY0LCAweEY2LDB4ODUsIDB4NEEsMHg5OCwgMHhGNywweDA1LCAweDRBLDB4OUMsIDB4ODMsMHgxNiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MUEsIDB4MDAsMHgyMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEVFLDB4MDAsIAorMHg2NCwweDdDLCAweEYzLDB4ODIsIDB4MDAsMHgwMCwgMHhGNywweDA0LCAweDQyLDB4QTQsIDB4RjYsMHgwNiwgMHg0MiwweEE2LCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4NjYsMHhFNCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4OTMsMHg5NiwgMHhGRiwweEY0LCAweDg0LDB4MTYsIAorMHgwMCwweDAwLCAweEY0LDB4ODYsIDB4NDIsMHhDOCwgMHg5NCwweDk2LCAweEZGLDB4RUMsIDB4RjMsMHgwMiwgMHgwMCwweDBDLCAweDkzLDB4MTYsIAorMHhGRiwweEU0LCAweDgzLDB4OTYsIDB4MDAsMHgwMCwgMHg4NCwweDk2LCAweEZGLDB4RjQsIDB4ODcsMHgxRSwgMHgwMCwweDIwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MjYsIDB4NzIsMHgwMCwgMHhFQywweDAwLCAweDY2LDB4NDgsIDB4RjMsMHg4NiwgMHg0QSwweDk4LCAweDg0LDB4QTIsIAorMHgwMCwweDI0LCAweDgzLDB4MTYsIDB4RkYsMHhFNCwgMHhDNSwweDA0LCAweDAwLDB4MDAsIDB4QjQsMHg5QSwgMHgzOCwweDAyLCAweEM3LDB4MTgsIAorMHgzOCwweDAwLCAweDgzLDB4MjIsIDB4MDAsMHgyOCwgMHg4MywweDk2LCAweEZGLDB4RjQsIDB4ODQsMHg5NiwgMHhGRiwweEU0LCAweDkzLDB4M0EsIAorMHgwMCwweDA0LCAweDkzLDB4QkEsIDB4MDAsMHgwOCwgMHhGNiwweDA0LCAweEUwLDB4MDAsIDB4RjMsMHgwNiwgMHg0QSwweDk4LCAweEE2LDB4QTYsIAorMHgzMCwweDAyLCAweEY1LDB4ODIsIDB4MDAsMHgwMCwgMHhDMCwweDMyLCAweDZBLDB4MDAsIDB4RTYsMHgwMCwgMHg2NSwweDEwLCAweEM2LDB4MzgsIAorMHgwMCwweDAwLCAweEY2LDB4ODQsIDB4RTAsMHgwNCwgMHg4NywweDMyLCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4NjUsMHgxNCwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RjUsMHg4MiwgMHgwMCwweDAxLCAweDIwLDB4MkUsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NjUsMHgyMSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjUsMHgwMiwgMHgwMCwweDAwLCAweEY2LDB4ODQsIAorMHhFMCwweDAwLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEUyLDB4MDAsIAorMHg2NSwweDVDLCAweEY1LDB4ODIsIDB4MDAsMHgwMCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHg2NSwweDY0LCAweDIwLDB4MkUsIAorMHgwMCwweDAwLCAweEY2LDB4ODQsIDB4RTAsMHgwNCwgMHg4NywweDMyLCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEUyLDB4MDAsIDB4NjUsMHg2NSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RjUsMHg4MiwgMHgwMCwweDAxLCAweDIwLDB4MkUsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NjUsMHg3NSwgMHgyMCwweDJBLCAweDAwLDB4MDAsIDB4RjUsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MkEsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NjUsMHg4OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODMsMHg5NiwgMHhGRiwweEY0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEYzLDB4ODUsIDB4NEYsMHg1NCwgMHg4NywweDIyLCAweDAwLDB4MkMsIDB4NzYsMHhBMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweDA1LDB4QTAsIDB4MDAsMHgyRSwgMHg3NiwweDJELCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEY0LDB4ODIsIAorMHgwMCwweDAwLCAweDk0LDB4OTYsIDB4RkYsMHhEQywgMHg4MywweDE2LCAweEZGLDB4RUMsIDB4MjAsMHgyNiwgMHgwMCwweDA3LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFCLCAweDI4LDB4MDAsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDA2LDB4OTgsIAorMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RTIsMHgwMCwgMHg2NiwweDFDLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDg1LDB4MTYsIDB4RkYsMHhFQywgMHg4NSwweDk2LCAweEZGLDB4REMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MkMsIAorMHg0MCwweDAwLCAweDg2LDB4QkEsIDB4MDAsMHgzMCwgMHgwNiwweDI4LCAweDAwLDB4MDQsIDB4MDUsMHgyOCwgMHgwMCwweDAyLCAweDA1LDB4QUMsIAorMHgwMCwweDAyLCAweDgzLDB4OTYsIDB4RkYsMHhEQywgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweDAzLDB4OUMsIAorMHgwMCwweDAxLCAweDkzLDB4OTYsIDB4RkYsMHhEQywgMHgyMCwweDFFLCAweDAwLDB4MDcsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjQsIAorMHhGRiwweEYwLCAweEUyLDB4MDAsIDB4NjUsMHhFMSwgMHhGNiwweEIzLCAweDI4LDB4MDAsIDB4MDQsMHgyMCwgMHgwMCwweDFDLCAweDg0LDB4OTYsIAorMHhGRiwweEVDLCAweDgzLDB4MTYsIDB4RkYsMHhFNCwgMHg4MywweDk2LCAweEZGLDB4RjQsIDB4MDQsMHhBNCwgMHgwMCwweDE0LCAweDk0LDB4OTYsIAorMHhGRiwweEVDLCAweDAzLDB4MTgsIDB4MDAsMHgwQywgMHg5MywweDE2LCAweEZGLDB4RTQsIDB4MDMsMHg5QywgMHgwMCwweDAxLCAweEUwLDB4MDAsIAorMHg2NCwweDk0LCAweDkzLDB4OTYsIDB4RkYsMHhGNCwgMHg4NCwweDk2LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MjYsIAorMHgwMCwweDIwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAweDRBLDB4OUMsIDB4ODUsMHhBNiwgMHgwMCwweDIwLCAweEY3LDB4MDQsIAorMHg3QSwweEI4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg3QSwweEI4LCAweEY3LDB4MDQsIAorMHg3QSwweEI4LCAweEY2LDB4ODQsIDB4N0EsMHhDOCwgMHg4NiwweDI2LCAweDAwLDB4MTgsIDB4QzYsMHhCNCwgMHg1OCwweDAwLCAweDg3LDB4MjYsIAorMHgwMCwweDFDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyNywweDM4LCAweDAwLDB4MDEsIDB4QzAsMHgzMiwgMHg3MiwweDAwLCAweDQ3LDB4MEMsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDY2LDB4RTUsIDB4RjYsMHg4NSwgMHg3QSwweEM4LCAweDgzLDB4MjYsIAorMHgwMCwweDA4LCAweEY3LDB4MDQsIDB4NkUsMHg1MCwgMHhGMywweDA1LCAweDNCLDB4NjQsIDB4ODMsMHhBNiwgMHgwMCwweDA4LCAweEY2LDB4ODIsIAorMHgwMCwweDAwLCAweDkzLDB4QkEsIDB4MUQsMHhEQywgMHg4NCwweEE2LCAweDAwLDB4MEMsIDB4ODMsMHgxNiwgMHgwMCwweDAwLCAweDk0LDB4QkEsIAorMHgwMCwweDEwLCAweDgzLDB4MUEsIDB4MDAsMHgxMCwgMHhGNiwweDg1LCAweDdBLDB4QzgsIDB4OTMsMHgzQSwgMHgwMCwweDE0LCAweEY3LDB4MDIsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NDAsMHg4NCwgMHhGNiwweDg1LCAweDdBLDB4QzAsIDB4RjYsMHg4NSwgMHg3QSwweEI4LCAweEY2LDB4ODUsIAorMHg3QSwweEIwLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDA0LCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIAorMHgwMCwweDA4LCAweEYzLDB4ODQsIDB4NkYsMHgzNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgxRSwgMHgwMCwweDE4LCAweEY2LDB4ODQsIAorMHhFMCwweDFDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RUMsMHgwMCwgMHg2NywweDI5LCAweEY3LDB4MDIsIAorMHgwMCwweDAxLCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg2NywweEU4LCAweEY1LDB4ODIsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4RTAsMHgxQywgMHg4NiwweDlFLCAweDAwLDB4MTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIAorMHg2QSwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg2NywweEU5LCAweEM1LDB4ODQsIAorMHgwMCwweDAwLCAweDg2LDB4OUUsIDB4MDAsMHgxMCwgMHhGNywweDA0LCAweEUwLDB4MDAsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4NjcsMHg4OCwgMHgwNSwweDFDLCAweDAwLDB4MTAsIDB4ODYsMHg5RSwgMHgwMCwweDE0LCAweEY3LDB4MDQsIAorMHhFMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHg2NywweDhDLCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg2NywweDk5LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY1LDB4ODIsIDB4MDAsMHgwMCwgMHg4NiwweEFBLCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHhFMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAwLCAweDY3LDB4RDQsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4NjcsMHhEQywgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4ODYsMHhBQSwgMHgwMCwweDA0LCAweEY3LDB4MDQsIAorMHhFMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHg2NywweERELCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg2NywweEVELCAweDIwLDB4MkUsIAorMHgwMCwweDAwLCAweEY1LDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg2OCwweDEwLCAweEY2LDB4MDYsIAorMHg0MiwweDlDLCAweEY3LDB4MDQsIDB4NDIsMHg5QywgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweEY3LDB4MDQsIAorMHg3NSwweEY0LCAweDc1LDB4QUMsIDB4RkYsMHhFMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg2OCwweDQ1LCAweDk1LDB4OTYsIAorMHhGRiwweEY0LCAweEY3LDB4MDQsIDB4NDIsMHg5OCwgMHhGNiwweDA2LCAweDQyLDB4OTgsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MzMsIAorMHgyOCwweDAwLCAweDg3LDB4MUUsIDB4MDAsMHgyMCwgMHgwNCwweDFDLCAweDAwLDB4MjAsIDB4NzYsMHhBMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MjAsMHgzQSwgMHgwMCwweDA4LCAweEVFLDB4MDAsIAorMHg2OCwweEM0LCAweEYzLDB4MDYsIDB4MTUsMHg1NCwgMHhGNSwweDAyLCAweDAwLDB4MDAsIDB4MDUsMHg5QywgMHgwMCwweDIyLCAweEM0LDB4QUMsIAorMHgwMCwweDAwLCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHg4NywweDIyLCAweDAwLDB4MDAsIDB4NzYsMHhBMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4QzAsMHgyQSwgMHg3MiwweDAwLCAweEVDLDB4MDAsIAorMHg2OCwweEMwLCAweEM2LDB4QTQsIDB4NjAsMHgwMCwgMHhBNywweDI2LCAweDYwLDB4MDIsIDB4NzYsMHhCNSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweDA1LDB4MjgsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEU4LCAweEY3LDB4MkYsIAorMHg2OCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgwMSwgMHhFMCwweDAwLCAweDY4LDB4NzgsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweEYzLDB4MDYsIAorMHgxNSwweDU0LCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA0LCAweEUwLDB4MjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDQsIDB4RTAsMHgxQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEYzLDB4MDYsIAorMHhFMCwweDAwLCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHgwMiwgMHgwMCwweDAxLCAweDkzLDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEVFLDB4NjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDIwLDB4MjIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NjksMHgyOCwgMHhGNiwweDA2LCAweDQyLDB4OUUsIDB4RjcsMHgwNCwgMHg0MiwweDlDLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHg4MywweDE2LCAweEZGLDB4RjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MUEsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NjksMHg2QywgMHhGMywweDA2LCAweDM1LDB4RUMsIDB4RjcsMHgwNCwgMHg0MiwweDMwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4MzIsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg2OSwweDZELCAweEYwLDB4MDUsIDB4NDIsMHgyOCwgMHhGMywweDA2LCAweDM1LDB4NjAsIDB4RjMsMHgwNSwgMHg0MiwweDMwLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NzgsMHg5QywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4MDQsIDB4RjUsMHgwNCwgMHg2RiwweDM0LCAweEY3LDB4MDQsIAorMHg0MiwweDQwLCAweDg2LDB4MkEsIDB4MDAsMHgxOCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjYsMHg4NCwgMHhFMCwweDFDLCAweEY3LDB4MDUsIAorMHg0MiwweDQwLCAweEMwLDB4MzYsIDB4NjIsMHgwMCwgMHhFQywweDAwLCAweDY5LDB4QjUsIDB4RjcsMHgwMiwgMHgwMCwweDAxLCAweEY3LDB4MDIsIAorMHgwMCwweDAwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDZBLDB4ODAsIDB4RjcsMHgwMiwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHhFMCwweDFDLCAweDg2LDB4QUEsIDB4MDAsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweDQ3LDB4MEMsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDZBLDB4N0QsIDB4QzUsMHg4NCwgMHgwMCwweDAwLCAweDg2LDB4QUEsIAorMHgwMCwweDEwLCAweEY3LDB4MDQsIDB4RTAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHg2QSwweDE0LCAweDA0LDB4QTgsIDB4MDAsMHgxMCwgMHg4NiwweEFBLCAweDAwLDB4MTQsIDB4RjcsMHgwNCwgMHhFMCwweDA0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDZBLDB4MTgsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEY2LDB4MDIsIAorMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDZBLDB4MjUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY1LDB4ODIsIAorMHgwMCwweDAwLCAweDg2LDB4QTYsIDB4MDAsMHgwMCwgMHhGNywweDA0LCAweEUwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEUyLDB4MDAsIDB4NkEsMHg2MCwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHg2QSwweDY4LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHg4NiwweEE2LCAweDAwLDB4MDQsIDB4RjcsMHgwNCwgMHhFMCwweDA0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAwLCAweDZBLDB4NjksIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEY2LDB4MDIsIAorMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDZBLDB4ODEsIDB4QzcsMHgyQywgMHgwMCwweDAwLCAweEY1LDB4ODIsIAorMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4NkEsMHg4MCwgMHhDNywweDJDLCAweDAwLDB4MDAsIDB4QzcsMHgwNCwgMHgwMCwweDAwLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEVFLDB4MDAsIDB4NkIsMHgzRCwgMHhGNiwweDg2LCAweDQwLDB4OEEsIDB4RjcsMHgwNCwgMHg0MCwweDg4LCAweDc2LDB4QjUsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NkIsMHgzQywgMHhGNiwweDgyLCAweDAwLDB4MDAsIDB4RjYsMHg4NSwgMHg0MCwweDgwLCAweEY2LDB4ODUsIAorMHg0MCwweDg0LCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNCwgMHhFMCwweDFDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGMywweDg2LCAweEUwLDB4MDAsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDk1LDB4MTMsIAorMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MDAsMHgwMiwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4OTYsMHg5NiwgMHhGRiwweEY0LCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4RUUsMHg2NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjQsMHgwNSwgMHg0MCwweDg0LCAweDg2LDB4OTYsIAorMHhGRiwweEY0LCAweEY3LDB4MDQsIDB4NkUsMHg1MCwgMHhGMywweDg2LCAweDM1LDB4RUMsIDB4RjYsMHg4NSwgMHg0MCwweDkwLCAweEY2LDB4ODUsIAorMHg0MCwweDk0LCAweDg3LDB4M0EsIDB4MUQsMHhEQywgMHhGNiwweDg1LCAweDQyLDB4MjgsIDB4RjcsMHgwNSwgMHgzQiwweDY0LCAweEY3LDB4MDQsIAorMHg0MiwweDMwLCAweEY0LDB4MDUsIDB4NDAsMHg4MCwgMHhDMCwweDNBLCAweDNBLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NkIsMHgzRCwgMHhGMywweDg2LCAweDM1LDB4NjAsIDB4RjMsMHg4NSwgMHg0MiwweDMwLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NzgsMHg5QywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNCwweDg2LCAweDQyLDB4MzAsIDB4OTQsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjAsMHhFNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg2RCwweEQ5LCAweEY1LDB4ODIsIDB4MDAsMHgwMCwgMHhGNywweDA0LCAweDQwLDB4OEMsIDB4RjYsMHgwNiwgMHg0MCwweDhDLCAweDc2LDB4MzEsIAorMHgwMCwweDFFLCAweEY2LDB4ODQsIDB4NDIsMHgyOCwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4MDYsMHhCNCwgMHgwMCwweDAxLCAweEM3LDB4MzgsIAorMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg2QiwweEM4LCAweEY2LDB4ODUsIAorMHg0MiwweDI4LCAweEY3LDB4MDQsIDB4NDAsMHg4OCwgMHhGNiwweDg2LCAweDQwLDB4OEEsIDB4NzYsMHhCNSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg2RCwweDBELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDQwLDB4OEMsIDB4RjYsMHg4NiwgMHg0MCwweDhDLCAweDc2LDB4QjUsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NkMsMHgzNSwgMHhGNiwweDA2LCAweDQwLDB4OEEsIDB4RjcsMHgwNCwgMHg0MCwweDg4LCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NkMsMHgzNCwgMHhGNCwweDg2LCAweDM2LDB4NzgsIDB4RjcsMHgwNCwgMHg0MiwweDQ0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NEEsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg2QywweDM1LCAweEY0LDB4ODIsIDB4MDAsMHgwMSwgMHhGNCwweEIzLCAweDI4LDB4MDAsIDB4RTAsMHgwMCwgMHg2RCwweDEwLCAweEYwLDB4MDUsIAorMHg0MiwweDJDLCAweEY3LDB4MDQsIDB4NDAsMHg4QywgMHhGNSwweDA2LCAweDQwLDB4OEMsIDB4NzYsMHhBOSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg2QywweEMxLCAweEY2LDB4MDYsIDB4NDAsMHg4QSwgMHhGNywweDA0LCAweDQwLDB4ODgsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg2QywweEMxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDQyLDB4MkMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwOSwgMHhFRSwweDAwLCAweDZELDB4MTEsIDB4RjcsMHgwNSwgMHg0MiwweDJDLCAweEYwLDB4MkIsIAorMHgyOCwweDAwLCAweEYwLDB4MzMsIDB4MjgsMHgwMCwgMHhGNSwweDgyLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg0MiwweDk0LCAweEY2LDB4MDYsIAorMHg0MiwweDk0LCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhFMCwweDAwLCAweDZELDB4MTAsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweEY3LDB4MDQsIAorMHg0MCwweDhDLCAweEY2LDB4ODYsIDB4NDAsMHg4QywgMHg3NiwweEI1LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg2RCwweDE0LCAweDIwLDB4MkUsIAorMHgwMCwweDAwLCAweEY3LDB4MDQsIDB4NDAsMHg4OCwgMHhGNiwweDA2LCAweDQwLDB4OEEsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg2RCwweDE1LCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhGMCwweDMzLCAweDI4LDB4MDAsIDB4RjUsMHg4MiwgMHgwMCwweDAxLCAweDIwLDB4MkUsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NkQsMHhCNSwgMHhGNCwweDg2LCAweDM1LDB4RUMsIDB4RjcsMHgwNCwgMHg0MiwweDMwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NEEsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg2RCwweDU5LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweEUwLDB4MjgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NkQsMHg3OSwgMHhGNiwweDgyLCAweDAwLDB4M0MsIDB4RjYsMHg4NCwgMHhFMCwweDI4LCAweEUwLDB4MDAsIAorMHg2RCwweDc4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweEUwLDB4MjgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NkQsMHg3OSwgMHhGNiwweDgyLCAweDAwLDB4RjAsIDB4RjcsMHgwNCwgMHhFMCwweDI4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDc2LDB4QjksIDB4MDAsMHgwMiwgMHhGNywweDA0LCAweDQyLDB4MjgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIAorMHg2QSwweDAwLCAweEVDLDB4MDAsIDB4NkQsMHhCNSwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweEYwLDB4MDUsIAorMHg0MiwweDI4LCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEY0LDB4ODIsIAorMHgwMCwweDE5LCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAweDZELDB4QjQsIDB4QjQsMHhCQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIAorMHgyRCwweDM4LCAweEY0LDB4ODIsIDB4QzMsMHg1MCwgMHg5NCwweDkzLCAweEZGLDB4RkMsIDB4RjQsMHg4MiwgMHgwMCwweDE2LCAweDk0LDB4OTMsIAorMHhGRiwweEZDLCAweEY0LDB4ODYsIDB4NDIsMHgzMCwgMHg5NCwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIAorMHgxRSwweEMwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHgwNCwgMHhGNSwweDg2LCAweDM2LDB4NzgsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4ODYsIAorMHg0MiwweDQ0LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDQ4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY1LDB4ODIsIDB4NzQsMHgxOCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4MiwgMHgwMCwweDE5LCAweDk1LDB4OTMsIAorMHhGRiwweEZDLCAweEY1LDB4ODYsIDB4MzYsMHg3OCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDgyLCAweDc0LDB4QUMsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4ODIsIAorMHgwMCwweDFELCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDg2LCAweDM3LDB4MDQsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4MiwgMHg3OCwweDAwLCAweDk1LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4ODIsIDB4MDAsMHgxQiwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4NiwgMHgzNywweDA0LCAweDk1LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4ODIsIAorMHg3OCwweEZDLCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MUEsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4ODYsIAorMHgzNywweDkwLCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY1LDB4ODIsIDB4ODAsMHhEOCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4RjcsMHg4MiwgMHgwMCwweDFCLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY1LDB4ODYsIDB4MzcsMHg5MCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDgyLCAweDgxLDB4NzQsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4ODIsIAorMHgwMCwweDFELCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDg2LCAweDM4LDB4MUMsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4MiwgMHg4NywweDc0LCAweDk1LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4ODIsIDB4MDAsMHgxQiwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4NiwgMHgzOCwweDFDLCAweDk1LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4ODIsIAorMHg5NCwweEY4LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MUIsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4ODYsIAorMHgzOSwweDM0LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY1LDB4ODIsIDB4OEEsMHgwMCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4RjcsMHg4MiwgMHgwMCwweDFDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY1LDB4ODYsIDB4MzksMHgzNCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDgyLCAweDhFLDB4MDgsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4ODIsIAorMHgwMCwweDFBLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDg2LCAweDM5LDB4MzQsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4MiwgMHg5NiwweDlDLCAweDk1LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4ODIsIDB4MDAsMHgxRSwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4NiwgMHgzOCwweEE4LCAweDk1LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4ODIsIAorMHg5QiwweDJDLCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MUIsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4ODYsIAorMHgzOCwweEE4LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY1LDB4ODIsIDB4QTIsMHhEQywgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4RjcsMHg4MiwgMHgwMCwweDFFLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY1LDB4ODYsIDB4M0EsMHhEOCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDgyLCAweDlFLDB4NTQsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4ODIsIAorMHgwMCwweDFCLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDg2LCAweDNBLDB4RDgsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4MiwgMHhBMywweEMwLCAweDk1LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4ODIsIDB4MDAsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4NiwgMHgzOSwweEMwLCAweDk1LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4ODIsIAorMHhBNywweDY0LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MUUsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4ODYsIAorMHgzOSwweEMwLCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY1LDB4ODIsIDB4QUEsMHgwNCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4RjcsMHg4MiwgMHgwMCwweDFCLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY1LDB4ODYsIDB4MzksMHhDMCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDgyLCAweEFFLDB4RjgsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4ODIsIAorMHgwMCwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDg2LCAweDNBLDB4NEMsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHg0MiwweDUwLCAweEYwLDB4M0IsIAorMHgyOCwweDAwLCAweEY3LDB4MDYsIDB4NDAsMHg4OCwgMHhGMCwweDNCLCAweDI4LDB4MDAsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweEY2LDB4MDUsIAorMHg0MCwweDgwLCAweEY2LDB4MDUsIDB4NDAsMHg4NCwgMHhGNywweDA2LCAweDNCLDB4NzAsIDB4RjYsMHgzQiwgMHgyOCwweDAwLCAweEY3LDB4MDYsIAorMHgzQiwweDcyLCAweEYwLDB4QkIsIDB4MjgsMHgwMCwgMHhGNSwweDgyLCAweENBLDB4MjAsIDB4RjUsMHg4NSwgMHgzQiwweDc0LCAweEY3LDB4MDYsIAorMHgzQiwweDc4LCAweEYwLDB4M0IsIDB4MjgsMHgwMCwgMHhGNywweDA2LCAweDNCLDB4N0EsIDB4RjAsMHhCQiwgMHgyOCwweDAwLCAweEY1LDB4ODIsIAorMHhCMSwweDk0LCAweEY1LDB4ODUsIDB4M0IsMHg3QywgMHhGNywweDA2LCAweDNCLDB4ODAsIDB4RjAsMHgzQiwgMHgyOCwweDAwLCAweEY3LDB4MDYsIAorMHgzQiwweDgyLCAweEYwLDB4QkIsIDB4MjgsMHgwMCwgMHhGNSwweDgyLCAweEM3LDB4NTQsIDB4RjUsMHg4NSwgMHgzQiwweDg0LCAweEY3LDB4MDYsIAorMHgzQiwweDg4LCAweEYwLDB4M0IsIDB4MjgsMHgwMCwgMHhGNywweDA2LCAweDNCLDB4OEEsIDB4RjAsMHhCQiwgMHgyOCwweDAwLCAweEY1LDB4ODIsIAorMHhCRSwweEY4LCAweEY1LDB4ODUsIDB4M0IsMHg4QywgMHhGNywweDA2LCAweDNCLDB4OTAsIDB4RjAsMHgzQiwgMHgyOCwweDAwLCAweEY3LDB4MDYsIAorMHgzQiwweDkyLCAweEYwLDB4QkIsIDB4MjgsMHgwMCwgMHhGNSwweDgyLCAweEM4LDB4RjgsIDB4RjUsMHg4NSwgMHgzQiwweDk0LCAweEY3LDB4MDYsIAorMHgzQiwweDk4LCAweEYwLDB4M0IsIDB4MjgsMHgwMCwgMHhGNywweDA2LCAweDNCLDB4OUEsIDB4RjAsMHhCQiwgMHgyOCwweDAwLCAweEY1LDB4ODIsIAorMHhDNSwweEQ4LCAweEY1LDB4ODUsIDB4M0IsMHg5QywgMHhGNywweDA2LCAweDNCLDB4QTAsIDB4RjAsMHgzQiwgMHgyOCwweDAwLCAweEY3LDB4MDYsIAorMHgzQiwweEEyLCAweEYwLDB4QkIsIDB4MjgsMHgwMCwgMHhGNSwweDgyLCAweEM3LDB4NzAsIDB4RjUsMHg4NSwgMHgzQiwweEE0LCAweEY3LDB4MDYsIAorMHgzQiwweEE4LCAweEYwLDB4M0IsIDB4MjgsMHgwMCwgMHhGNywweDA2LCAweDNCLDB4QUEsIDB4RjAsMHhCQiwgMHgyOCwweDAwLCAweEY1LDB4ODIsIAorMHhDMSwweEI0LCAweEY1LDB4ODUsIDB4M0IsMHhBQywgMHg5NiwweDE2LCAweEZGLDB4RjQsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhENSwweDQwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNiwweDg0LCAweDZFLDB4NTAsIDB4ODYsMHgxNiwgMHhGRiwweEY0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDk2LDB4MzYsIDB4MUQsMHhEQywgMHhGNiwweDA1LCAweDNCLDB4NjQsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4MzAsIDB4MjUsMHg5NCwgMHgwMCwweDIwLCAweEYwLDB4MkYsIAorMHgyOCwweDAwLCAweDI2LDB4MTQsIDB4MDAsMHgzOCwgMHhGMCwweDMzLCAweDI4LDB4MDAsIDB4OTAsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDQsIAorMHg0MiwweDUwLCAweEY2LDB4ODYsIDB4NDIsMHg1MCwgMHg3NiwweEI1LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4OTYsMHgxMywgMHhGRiwweEZDLCAweDk1LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEY1LDB4RjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDIwLDB4MjIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4NzIsMHgxRCwgMHhGNSwweDAyLCAweDE3LDB4NzAsIDB4RjcsMHgwNCwgMHg0MiwweDU0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDI3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAweDQyLDB4NTQsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweEY1LDB4MDIsIAorMHgwMCwweDFCLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHhGNSwweDA2LCAweDQyLDB4NDQsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MUUsMHhDMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNywweDA0LCAweEUwLDB4MDQsIDB4ODYsMHgxNiwgMHgwMCwweDAwLCAweEY2LDB4ODIsIAorMHgwMCwweEZGLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHhDNywweDM4LCAweDZDLDB4MDAsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweEY3LDB4MDYsIAorMHhFMCwweDA2LCAweDg3LDB4M0EsIDB4MDAsMHgwMCwgMHgwNiwweEIwLCAweDAwLDB4MDIsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweEY2LDB4ODQsIAorMHgzQiwweDY0LCAweDA3LDB4MzAsIDB4MDAsMHgwNCwgMHhGNiwweEJCLCAweDI4LDB4MDAsIDB4ODcsMHgwMiwgMHhGRiwweDM0LCAweDA2LDB4MzAsIAorMHgwMCwweDA2LCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDA0LCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHgzMCwgMHgyNiwweDE0LCAweDAwLDB4MjAsIDB4RjAsMHgzMywgMHgyOCwweDAwLCAweDI3LDB4MTQsIAorMHgwMCwweDM4LCAweEYwLDB4M0IsIDB4MjgsMHgwMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4OTAsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDQsIAorMHg0MiwweDUwLCAweEY2LDB4ODYsIDB4NDIsMHg1MCwgMHg3NiwweEI1LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4OTYsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4RjMsMHgzOCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg3MywweDE5LCAweEY1LDB4ODIsIDB4MTcsMHg3MCwgMHhGNywweDA0LCAweDQyLDB4NTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDI3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NDIsMHg1NCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4MiwgMHgwMCwweDFCLCAweDk1LDB4OTMsIAorMHhGRiwweEZDLCAweEY1LDB4ODYsIDB4NDIsMHg0NCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIAorMHgxRSwweEMwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHg0MCwgMHgyNiwweDE0LCAweDAwLDB4MjAsIDB4OTYsMHgxNiwgMHhGRiwweEM0LCAweEYwLDB4MzMsIAorMHgyOCwweDAwLCAweDkwLDB4MTMsIDB4RkYsMHhGQywgMHg5NiwweDEzLCAweEZGLDB4RkMsIDB4MjYsMHgxNCwgMHgwMCwweDM4LCAweDk2LDB4MTYsIAorMHhGRiwweEJDLCAweDk2LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhEMCwweERDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDkwLDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA0LCAweDQyLDB4NTAsIDB4RjYsMHg4NiwgMHg0MiwweDUwLCAweDc2LDB4QjUsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDg2LDB4MTYsIDB4RkYsMHhCQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTYsMHgxMywgMHhGRiwweEZDLCAweDg2LDB4MTYsIAorMHhGRiwweEM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NiwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhGNSwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg3MywweEU1LCAweEY2LDB4MDIsIAorMHgxNywweDcwLCAweEY3LDB4MDQsIDB4NDIsMHg1NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIAorMHg0MiwweDU0LCAweDk2LDB4MTMsIDB4RkYsMHhGQywgMHhGNiwweDAyLCAweDAwLDB4MUIsIDB4OTYsMHgxMywgMHhGRiwweEZDLCAweEY2LDB4MDYsIAorMHg0MiwweDQ0LCAweDk2LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgxRSwweEMwLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIAorMHgwMCwweDA0LCAweEY1LDB4ODIsIDB4MDAsMHgwMCwgMHhGNSwweDg1LCAweDQwLDB4ODAsIDB4OTUsMHg5NiwgMHhGRiwweEY0LCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4Q0IsMHg1MCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODUsMHg5NiwgMHhGRiwweEY0LCAweEY1LDB4MDIsIAorMHgwMCwweDY0LCAweEY1LDB4MDUsIDB4M0IsMHhCNCwgMHhGNywweDA0LCAweDQyLDB4NTAsIDB4RjQsMHg4NiwgMHg0MiwweDUwLCAweDc2LDB4QTUsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhGNiwweDA0LCAweDRGLDB4NUMsIDB4RjQsMHgwMiwgMHgwMCwweDA2LCAweEY0LDB4MDUsIAorMHg0MiwweDU0LCAweEY1LDB4ODUsIDB4M0IsMHg2QywgMHhGNSwweDg1LCAweDNCLDB4QjgsIDB4OTUsMHgzMiwgMHgwMCwweDAwLCAweDk1LDB4QjIsIAorMHgwMCwweDA0LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDcxLDB4QjAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY0LDB4MDYsIAorMHgzNywweDA0LCAweEY0LDB4MDUsIDB4NDIsMHg0NCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHg1MCwgMHhGNywweDA0LCAweDQyLDB4NTAsIDB4RjYsMHg4NiwgMHg0MiwweDUwLCAweDc2LDB4QjUsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhGNiwweDA0LCAweDZGLDB4MzQsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDg2LDB4QjIsIAorMHgwMCwweDBDLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHg3NywweEVDLCAweEM1LDB4MDQsIAorMHgwMCwweDAwLCAweDg2LDB4QjIsIDB4MDAsMHgxMCwgMHhGNywweDA0LCAweEUwLDB4MDAsIDB4RjMsMHgwMiwgMHgwMCwweDAwLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4NzUsMHgxOCwgMHgwNCwweEIwLCAweDAwLDB4MTAsIDB4ODYsMHhCMiwgMHgwMCwweDE0LCAweEY3LDB4MDQsIAorMHhFMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHg3NSwweDFDLCAweDIwLDB4MUEsIAorMHgwMCwweDAwLCAweEYzLDB4MDIsIDB4MDAsMHgwMSwgMHgyMCwweDFBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg3NSwweDI5LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY1LDB4MDIsIDB4MDAsMHgwMCwgMHg4NiwweEE2LCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHhFMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAwLCAweDc1LDB4NjQsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4NzUsMHg2QywgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4ODYsMHhBNiwgMHgwMCwweDA0LCAweEY3LDB4MDQsIAorMHhFMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHg3NSwweDZELCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg3NSwweDdELCAweDIwLDB4MkEsIAorMHgwMCwweDAwLCAweEY1LDB4MDIsIDB4MDAsMHgwMSwgMHgyMCwweDJBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg3NywweEVDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENCLDB4Q0MsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDI2LDB4MTQsIAorMHgwMCwweDIwLCAweEYwLDB4MzMsIDB4MjgsMHgwMCwgMHgwNCwweEEwLCAweDAwLDB4MDIsIDB4RjAsMHgyNywgMHgyOCwweDAwLCAweEY1LDB4ODIsIAorMHgwMCwweDAwLCAweDIzLDB4OTQsIDB4MDAsMHgyMiwgMHhGNSwweDlGLCAweDI4LDB4MDAsIDB4MDMsMHhBMCwgMHgwMCwweDFBLCAweDkzLDB4OTYsIAorMHhGRiwweEQ0LCAweDI1LDB4OTQsIDB4MDAsMHgyMiwgMHg4NSwweEFFLCAweDAwLDB4MDAsIDB4NzcsMHhBRCwgMHgwMCwweDFFLCAweDc3LDB4QkMsIAorMHhGRiwweEU1LCAweEM1LDB4QUMsIDB4N0YsMHhDMCwgMHg3NSwweEFELCAweEZGLDB4RjAsIDB4NzYsMHgzMSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweDA2LDB4QTQsIDB4MDAsMHgwMiwgMHgyMywweDE0LCAweDAwLDB4MUUsIDB4NzUsMHgxNSwgMHgwMCwweDFFLCAweEY1LDB4OUYsIAorMHgyOCwweDAwLCAweEYzLDB4ODQsIDB4RTAsMHgwMCwgMHg3NSwweDI4LCAweEZGLDB4RTUsIDB4OTMsMHhBMiwgMHgwMCwweDFDLCAweEY1LDB4ODQsIAorMHhFMCwweDA0LCAweDczLDB4OTksIDB4MDAsMHgxRSwgMHg3MywweDlDLCAweEZGLDB4RTUsIDB4OTMsMHg5NiwgMHhGRiwweEFDLCAweDczLDB4OTUsIAorMHgwMCwweDFFLCAweDczLDB4OUMsIDB4RkYsMHhFNSwgMHg5MywweDk2LCAweEZGLDB4Q0MsIDB4MjMsMHg5NCwgMHgwMCwweDQyLCAweDk1LDB4QTIsIAorMHgwMCwweDIwLCAweDg3LDB4MTYsIDB4RkYsMHhFMCwgMHg3NSwweDk1LCAweDAwLDB4MUUsIDB4NzUsMHhBQywgMHhGRiwweEU1LCAweDk1LDB4OTYsIAorMHhGRiwweEI0LCAweDc1LDB4OTUsIDB4MDAsMHgxRSwgMHg3NSwweEFDLCAweEZGLDB4RTUsIDB4OTUsMHg5NiwgMHhGRiwweEM0LCAweEM3LDB4MzgsIAorMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4RjQsMHg4NCwgMHg0RiwweDU4LCAweDg3LDB4MUEsIAorMHgwMCwweDAwLCAweEM0LDB4QTAsIDB4NEEsMHgwMCwgMHg3NCwweEE0LCAweEZGLDB4RkEsIDB4QzUsMHhBNCwgMHgwMCwweDAwLCAweEY1LDB4OUYsIAorMHgyOCwweDAwLCAweDgzLDB4OTYsIDB4RkYsMHhBQywgMHgyMywweDE0LCAweDAwLDB4MUEsIDB4NzYsMHgxOSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweDg1LDB4OTYsIDB4RkYsMHhCNCwgMHhDNywweDM4LCAweDNGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4RTQsIDB4ODMsMHg5NiwgMHhGRiwweENDLCAweEM3LDB4MzgsIAorMHg1NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODcsMHgxQSwgMHgwMCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhFOCwgMHgyMywweDE0LCAweDAwLDB4MTYsIDB4NzYsMHgxOSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NUYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MUEsIAorMHgwMCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4RUMsIDB4MjMsMHgxNCwgMHgwMCwweDEyLCAweDc2LDB4MTksIAorMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDNGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDg3LDB4MUEsIDB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4ODUsMHg5NiwgMHhGRiwweEM0LCAweEM3LDB4MzgsIAorMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODcsMHgxNiwgMHhGRiwweEYwLCAweDA2LDB4QjQsIAorMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NUYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweEYzLDB4ODIsIAorMHgwMCwweDAyLCAweEYzLDB4QTMsIDB4MjgsMHgwMCwgMHgwNCwweDIwLCAweDAwLDB4MTgsIDB4MjUsMHg5NCwgMHgwMCwweDIyLCAweDg1LDB4QUUsIAorMHgwMCwweDAwLCAweDc3LDB4QUQsIDB4MDAsMHgxRSwgMHg3NywweEJDLCAweEZGLDB4RTUsIDB4QzUsMHhBQywgMHg3RiwweEMwLCAweDc1LDB4QUQsIAorMHhGRiwweEYwLCAweDgzLDB4OTYsIDB4RkYsMHhENCwgMHhGNSwweEEzLCAweDI4LDB4MDAsIDB4RjQsMHg5RiwgMHgyOCwweDAwLCAweDI1LDB4OTQsIAorMHgwMCwweDQyLCAweDg1LDB4QUUsIDB4MDAsMHgwMCwgMHg3NywweEFELCAweDAwLDB4MUUsIDB4NzcsMHhCQywgMHhGRiwweEU1LCAweEM1LDB4QUMsIAorMHg3RiwweEMwLCAweDc1LDB4QUQsIDB4RkYsMHhGMCwgMHg0NCwweEFELCAweDAwLDB4MDAsIDB4OTQsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4ODYsIAorMHhFMCwweDAwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDg0LCAweDRGLDB4NUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDIzLDB4NDAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NzgsMHhEOCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjAsMHgwNSwgMHg0MCwweDg0LCAweEY3LDB4ODYsIAorMHhFMCwweDAwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhENSwweEEwLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDQsIDB4NkUsMHg1MCwgMHhGNCwweDA1LCAweDQwLDB4ODQsIDB4ODcsMHgzQSwgMHgxRCwweERDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4M0IsMHg2NCwgMHhGNSwweDg2LCAweDM2LDB4NzgsIDB4RjUsMHg4NSwgMHg0MiwweDQ0LCAweEYzLDB4ODYsIAorMHgzNSwweDYwLCAweEYzLDB4ODUsIDB4NDIsMHgzMCwgMHhGNSwweDg2LCAweDQyLDB4NDQsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MUYsMHg0OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNSwweDg2LCAweDQyLDB4NDQsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjAsMHhFNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg3OCwweDg5LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDQyLDB4NTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEVFLDB4MDAsIDB4NzgsMHg1MSwgMHhGNiwweDA2LCAweDQyLDB4NTAsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHg3MSwweEIwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhFMCwweDAwLCAweDc4LDB4ODgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHg0MiwweDUwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4RjUsMHg4MiwgMHgwMCwweDA2LCAweEY1LDB4ODUsIAorMHg0MiwweDU0LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MzMsIAorMHgyOCwweDAwLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDcyLDB4QUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4ODYsIAorMHgzNywweDkwLCAweEY1LDB4ODUsIDB4NDIsMHg0NCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweEY2LDB4MDYsIDB4MzYsMHg3OCwgMHhGNiwweDA1LCAweDQyLDB4NDQsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweEY3LDB4MDUsIAorMHg0MCwweDgwLCAweEY3LDB4MDUsIDB4NDAsMHg5NCwgMHhGNiwweDg0LCAweDZFLDB4NTAsIDB4RjcsMHgwNSwgMHg0MCwweDkwLCAweDk3LDB4MzYsIAorMHgxRCwweERDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweEY3LDB4MDIsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NDAsMHg4MCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHhBOCwgMHhGNywweDA0LCAweDQyLDB4NTAsIDB4RjUsMHg4NiwgMHg0MiwweDUwLCAweDc2LDB4QUQsIAorMHgwMCwweDFFLCAweEY0LDB4ODQsIDB4NkYsMHgzNCwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4OTQsMHg5NiwgMHhGRiwweEM0LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDg2LDB4QTYsIDB4MDAsMHgwQywgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHg3OSwweDU1LCAweEY2LDB4MDYsIDB4NDIsMHg5QSwgMHhGNywweDA0LCAweDQyLDB4OTgsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MzMsIAorMHgyOCwweDAwLCAweEY3LDB4MDQsIDB4NDIsMHg1MCwgMHg3NiwweEFELCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweDg1LDB4MTYsIAorMHhGRiwweEM0LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg4NiwweEFBLCAweDAwLDB4MEMsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4ODAsMHhBOCwgMHhGNiwweDA2LCAweDQyLDB4OUEsIDB4ODcsMHgyQSwgMHgwMCwweDEwLCAweDg2LDB4MkEsIAorMHgwMCwweDFDLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDc5LDB4QTgsIDB4RjYsMHg4MiwgMHgwMCwweDAwLCAweDg3LDB4MkEsIAorMHgwMCwweDE0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg3OSwweEFDLCAweDIwLDB4MzYsIAorMHgwMCwweDAwLCAweEY2LDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg3QSwweDA1LCAweDI0LDB4OTQsIAorMHgwMCwweDIwLCAweDk0LDB4OTYsIDB4RkYsMHhCQywgMHg4NSwweDE2LCAweEZGLDB4QzQsIDB4RjAsMHgyNywgMHgyOCwweDAwLCAweDA1LDB4MjgsIAorMHgwMCwweDEwLCAweDk1LDB4MTYsIDB4RkYsMHhCNCwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHg3MiwweDUwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NCwweDk2LCAweEZGLDB4QjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk0LDB4OTMsIAorMHhGRiwweEZDLCAweDg1LDB4MTYsIDB4RkYsMHhCQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4RjksMHgzNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMCwgMHg4MCwweEM0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDgwLDB4NkMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4Q0IsMHhDQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MjUsMHg5NCwgMHgwMCwweDIwLCAweEYwLDB4MkYsIAorMHgyOCwweDAwLCAweDA0LDB4QTAsIDB4MDAsMHgwMiwgMHg5NCwweDk2LCAweEZGLDB4NUMsIDB4RjAsMHgyNywgMHgyOCwweDAwLCAweEY0LDB4ODIsIAorMHgwMCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHg1QSwgMHhGNCwweEFCLCAweDI4LDB4MDAsIDB4MDcsMHgyMCwgMHgwMCwweDFBLCAweDI1LDB4MTQsIAorMHgwMCwweDVBLCAweDg1LDB4MkEsIDB4MDAsMHgwMCwgMHg3NywweEE5LCAweDAwLDB4MUUsIDB4NzcsMHhCQywgMHhGRiwweEU1LCAweEM1LDB4MjgsIAorMHg3RiwweEMwLCAweDc1LDB4MjksIDB4RkYsMHhGMCwgMHg3NSwweEFELCAweDAwLDB4MUUsIDB4NzUsMHhBQywgMHhGRiwweEU1LCAweDIzLDB4MTQsIAorMHgwMCwweDFFLCAweDc2LDB4MTksIDB4MDAsMHgxRSwgMHhGNSwweDNCLCAweDI4LDB4MDAsIDB4RjQsMHg4NCwgMHhFMCwweDAwLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweDk0LDB4QTIsIDB4MDAsMHgxQywgMHhGNSwweDA0LCAweEUwLDB4MDQsIDB4ODQsMHg5NiwgMHhGRiwweDVDLCAweDk1LDB4MjIsIAorMHgwMCwweDIwLCAweDg3LDB4MTYsIDB4RkYsMHhFMCwgMHgwNiwweEE0LCAweDAwLDB4MDIsIDB4NzUsMHgxNSwgMHgwMCwweDFFLCAweDc1LDB4MjgsIAorMHhGRiwweEU1LCAweDk1LDB4MTYsIDB4RkYsMHg1NCwgMHg3NCwweDk1LCAweDAwLDB4MUUsIDB4NzQsMHhBNCwgMHhGRiwweEU1LCAweDk0LDB4OTYsIAorMHhGRiwweDlDLCAweDc1LDB4MTUsIDB4MDAsMHgxRSwgMHg3NSwweDI4LCAweEZGLDB4RTUsIDB4OTUsMHgxNiwgMHhGRiwweDk0LCAweDc0LDB4OTUsIAorMHgwMCwweDFFLCAweDg1LDB4MTYsIDB4RkYsMHg1QywgMHg3NCwweEE0LCAweEZGLDB4RTUsIDB4OTQsMHg5NiwgMHhGRiwweDhDLCAweDg0LDB4OTYsIAorMHhGRiwweDU0LCAweEM3LDB4MzgsIDB4NUYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDg3LDB4MUEsIAorMHgwMCwweDAwLCAweDg1LDB4MTYsIDB4RkYsMHg5QywgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4RTQsIDB4MjMsMHgxNCwgMHgwMCwweDFBLCAweDc2LDB4MTksIAorMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDRGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDg3LDB4MUEsIDB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4ODQsMHg5NiwgMHhGRiwweDk0LCAweEM3LDB4MzgsIAorMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweDg3LDB4MTYsIAorMHhGRiwweEU4LCAweDIzLDB4MTQsIDB4MDAsMHgxNiwgMHg3NiwweDE5LCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg1NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODcsMHgxQSwgMHgwMCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhFQywgMHgyMywweDE0LCAweDAwLDB4MTIsIDB4NzYsMHgxOSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NEYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MUEsIAorMHgwMCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHg4NSwweDE2LCAweEZGLDB4OEMsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDE2LCAweEZGLDB4RjAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweEM3LDB4MzgsIAorMHg1NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4RjQsMHg4MiwgMHgwMCwweDAyLCAweEY0LDB4QTMsIAorMHgyOCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHg1QSwgMHg4NSwweDJBLCAweDAwLDB4MDAsIDB4NzcsMHhBOSwgMHgwMCwweDFFLCAweDc3LDB4QkMsIAorMHhGRiwweEU1LCAweEM1LDB4MjgsIDB4N0YsMHhDMCwgMHg3NSwweDI5LCAweEZGLDB4RjAsIDB4MDcsMHgyMCwgMHgwMCwweDE4LCAweEY1LDB4M0IsIAorMHgyOCwweDAwLCAweDk0LDB4MTYsIDB4RkYsMHhBQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhDQiwweENDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDI2LDB4MTQsIDB4MDAsMHgzOCwgMHgyNCwweDk0LCAweDAwLDB4NUEsIDB4ODQsMHhBNiwgMHgwMCwweDAwLCAweDc3LDB4QTUsIAorMHgwMCwweDFFLCAweDc3LDB4QkMsIDB4RkYsMHhFNSwgMHhDNCwweEE0LCAweDdGLDB4QzAsIDB4NzQsMHhBNSwgMHhGRiwweEYwLCAweDA1LDB4QTAsIAorMHgwMCwweDAyLCAweDA2LDB4QUMsIDB4MDAsMHgwMiwgMHgyMywweDk0LCAweDAwLDB4MzYsIDB4NzUsMHgxRCwgMHgwMCwweDFFLCAweDc1LDB4MjgsIAorMHhGRiwweEU1LCAweDA3LDB4MjAsIDB4MDAsMHgxQSwgMHhGNCwweEIzLCAweDI4LDB4MDAsIDB4NzYsMHgzMSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweDk1LDB4MTYsIDB4RkYsMHg1NCwgMHg3NCwweDk1LCAweDAwLDB4MUUsIDB4NzQsMHhBNCwgMHhGRiwweEU1LCAweDk0LDB4OTYsIAorMHhGRiwweDVDLCAweDc1LDB4MTUsIDB4MDAsMHgxRSwgMHg3NSwweDI4LCAweEZGLDB4RTUsIDB4OTUsMHgxNiwgMHhGRiwweDdDLCAweDc0LDB4OTUsIAorMHgwMCwweDFFLCAweDg1LDB4MTYsIDB4RkYsMHhDNCwgMHg3NCwweEE0LCAweEZGLDB4RTUsIDB4OTQsMHg5NiwgMHhGRiwweDc0LCAweDg1LDB4MkEsIAorMHgwMCwweDM0LCAweDI0LDB4OTQsIDB4MDAsMHg1QSwgMHg5NSwweDE2LCAweEZGLDB4ODQsIDB4ODQsMHhBNiwgMHgwMCwweDAwLCAweDc3LDB4QTUsIAorMHgwMCwweDFFLCAweDc3LDB4QkMsIDB4RkYsMHhFNSwgMHhDNCwweEE0LCAweDdGLDB4QzAsIDB4NzQsMHhBNSwgMHhGRiwweEYwLCAweDI1LDB4MTQsIAorMHgwMCwweDVBLCAweEY0LDB4QUYsIDB4MjgsMHgwMCwgMHg4NSwweDJBLCAweDAwLDB4MDAsIDB4NzcsMHhBOSwgMHgwMCwweDFFLCAweDc3LDB4QkMsIAorMHhGRiwweEU1LCAweEM1LDB4MjgsIDB4N0YsMHhDMCwgMHg3NSwweDI5LCAweEZGLDB4RjAsIDB4ODQsMHg5NiwgMHhGRiwweEM0LCAweEY1LDB4M0IsIAorMHgyOCwweDAwLCAweDg0LDB4QTYsIDB4MDAsMHgxMCwgMHg4NSwweDE2LCAweEZGLDB4QzQsIDB4OTQsMHhBMiwgMHgwMCwweDFDLCAweDg1LDB4MkEsIAorMHgwMCwweDE0LCAweDc0LDB4OTUsIDB4MDAsMHgxRSwgMHg3NCwweEE0LCAweEZGLDB4RTUsIDB4OTQsMHg5NiwgMHhGRiwweDZDLCAweDk1LDB4MjIsIAorMHgwMCwweDIwLCAweDg3LDB4MTYsIDB4RkYsMHhDOCwgMHg4NSwweDE2LCAweEZGLDB4NTQsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MkYsIDB4MjgsMHgwMCwgMHg4NywweDFFLCAweDAwLDB4MDAsIDB4ODQsMHg5NiwgMHhGRiwweDVDLCAweEM3LDB4MzgsIAorMHg1NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweDg3LDB4MTYsIAorMHhGRiwweENDLCAweDIzLDB4OTQsIDB4MDAsMHgzMiwgMHg3NiwweDFELCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweDg1LDB4MTYsIAorMHhGRiwweDdDLCAweEM3LDB4MzgsIDB4NEYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MUUsIAorMHgwMCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4RDAsIDB4MjMsMHg5NCwgMHgwMCwweDJFLCAweDc2LDB4MUQsIAorMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDU3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDg3LDB4MUUsIDB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4ODQsMHg5NiwgMHhGRiwweDc0LCAweDg1LDB4MTYsIAorMHhGRiwweDZDLCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhENCwgMHgyMywweDk0LCAweDAwLDB4MkEsIDB4NzYsMHgxRCwgMHgwMCwweDFFLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NEYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MUUsIAorMHgwMCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDg3LDB4MTYsIDB4RkYsMHhEOCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg1NywweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHhGNCwweDgyLCAweDAwLDB4MDIsIDB4RjQsMHhBMywgMHgyOCwweDAwLCAweDA3LDB4MjAsIAorMHgwMCwweDE4LCAweDI1LDB4MTQsIDB4MDAsMHg3QSwgMHg4NSwweDJBLCAweDAwLDB4MDAsIDB4NzcsMHhBOSwgMHgwMCwweDFFLCAweDc3LDB4QkMsIAorMHhGRiwweEU1LCAweEM1LDB4MjgsIDB4N0YsMHhDMCwgMHg3NSwweDI5LCAweEZGLDB4RjAsIDB4ODQsMHg5NiwgMHhGRiwweEM0LCAweEY1LDB4M0IsIAorMHgyOCwweDAwLCAweDg3LDB4MjYsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDI0LCAweEY3LDB4MDQsIAorMHg0RiwweDU4LCAweEU2LDB4MDAsIDB4N0UsMHhGOSwgMHg5NCwweDE2LCAweEZGLDB4NTQsIDB4QzcsMHgyMCwgMHg3MiwweDAwLCAweEY2LDB4ODQsIAorMHg2RSwweDUwLCAweDg2LDB4MjYsIDB4MDAsMHgyQywgMHg3NywweDM4LCAweEZGLDB4RkEsIDB4MjUsMHgxNCwgMHgwMCwweDVBLCAweDg0LDB4MkEsIAorMHgwMCwweDAwLCAweDc3LDB4QTksIDB4MDAsMHgxRSwgMHg3NywweEJDLCAweEZGLDB4RTUsIDB4QzQsMHgyMCwgMHg3RiwweEMwLCAweDc0LDB4MjEsIAorMHhGRiwweEYwLCAweDQ3LDB4MzksIDB4MDAsMHgwMCwgMHg4NiwweEI2LCAweDFELDB4REMsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEMwLDB4MzIsIAorMHg2QSwweDAwLCAweDQ2LDB4OEMsIDB4MDAsMHgwMSwgMHhENiwweDgwLCAweDBBLDB4NjgsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEY2LDB4ODYsIAorMHg0MCwweDk4LCAweEU2LDB4MDAsIDB4N0UsMHhDMCwgMHhDMywweEI4LCAweDY4LDB4MDAsIDB4QzUsMHg4NCwgMHgwMCwweDAwLCAweDg2LDB4QTYsIAorMHgwMCwweDI0LCAweEY3LDB4MDQsIDB4RTAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHg3RSwweDU0LCAweDAzLDB4MjQsIDB4MDAsMHgyNCwgMHg4NiwweEE2LCAweDAwLDB4MjgsIDB4RjcsMHgwNCwgMHhFMCwweDA0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDdFLDB4NTgsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEY2LDB4MDIsIAorMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDdFLDB4NjUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY1LDB4ODIsIAorMHgwMCwweDAwLCAweDg2LDB4OUEsIDB4MDAsMHgwMCwgMHhGNywweDA0LCAweEUwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEUyLDB4MDAsIDB4N0UsMHhBMCwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHg3RSwweEE4LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHg4NiwweDlBLCAweDAwLDB4MDQsIDB4RjcsMHgwNCwgMHhFMCwweDA0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAwLCAweDdFLDB4QTksIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEY2LDB4MDIsIAorMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDdFLDB4QjksIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEY1LDB4ODIsIAorMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDdFLDB4QzUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY0LDB4MDIsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NEYsMHg1OCwgMHhGNCwweDFGLCAweDI4LDB4MDAsIDB4ODQsMHg5NiwgMHhGRiwweDU0LCAweDg1LDB4MTYsIAorMHhGRiwweEM0LCAweEY2LDB4ODYsIDB4NDAsMHg5QSwgMHhDNywweDI0LCAweDcyLDB4MDAsIDB4NzcsMHgzOCwgMHhGRiwweEZBLCAweDg2LDB4MkEsIAorMHgwMCwweDMwLCAweDQ3LDB4MzksIDB4MDAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweEUwLDB4MDAsIAorMHg3RiwweDRDLCAweEY2LDB4M0IsIDB4MjgsMHgwMCwgMHg4NCwweDk2LCAweEZGLDB4NTQsIDB4RjYsMHgwNiwgMHg0MCwweDk4LCAweEM3LDB4MjQsIAorMHg3MiwweDAwLCAweDc3LDB4MzgsIDB4RkYsMHhGQSwgMHhDNiwweEI4LCAweDAwLDB4MDAsIDB4NDYsMHhCNSwgMHgwMCwweDAwLCAweDc2LDB4QjUsIAorMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4NjAsMHgwMCwgMHhGNSwweDAyLCAweDAwLDB4MDEsIDB4RjUsMHgzNywgMHgyOCwweDAwLCAweDQ3LDB4MzksIAorMHgwMCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhDNywweDM4LCAweDYwLDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDVBLCAweDg0LDB4QTYsIAorMHgwMCwweDAwLCAweDc3LDB4QTUsIDB4MDAsMHgxRSwgMHg3NywweEJDLCAweEZGLDB4RTUsIDB4QzQsMHhBNCwgMHg3RiwweEMwLCAweDc0LDB4QTUsIAorMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMiwgMHhGNCwweEJCLCAweDI4LDB4MDAsIDB4RjcsMHgwNCwgMHg0RiwweDU4LCAweDg1LDB4MTYsIAorMHhGRiwweDU0LCAweDg0LDB4OTYsIDB4RkYsMHhBQywgMHhDNiwweEE4LCAweDcyLDB4MDAsIDB4NzYsMHhCNCwgMHhGRiwweEZBLCAweDA2LDB4MjQsIAorMHgwMCwweDFBLCAweEY2LDB4QjMsIDB4MjgsMHgwMCwgMHhDNywweDI0LCAweDcyLDB4MDAsIDB4NzcsMHgzOCwgMHhGRiwweEZBLCAweDA2LDB4QTgsIAorMHgwMCwweDFBLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg0NywweDM5LCAweDAwLDB4MDAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4MjQsIAorMHgwMCwweDFDLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNSwweDA0LCAweDRGLDB4NUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDIzLDB4NDAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDQsIAorMHg0RiwweDU4LCAweDg0LDB4OTYsIDB4RkYsMHg1NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzcsMHgyNCwgMHg3MiwweDAwLCAweDc3LDB4MzgsIAorMHhGRiwweEZBLCAweDQ3LDB4MzksIDB4MDAsMHgwMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHgyNCwgMHgwMCwweDFDLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY1LDB4MDQsIDB4NEYsMHg1QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjMsMHg0MCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHg3OCwweEQ4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNiwweDg0LCAweDZFLDB4NTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MzYsIAorMHgxRCwweERDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgzNiwgMHgxRCwweERDLCAweDg3LDB4MzYsIAorMHgxRCwweERDLCAweEYwLDB4MDUsIDB4NDAsMHg4NCwgMHhGNCwweDg2LCAweEUwLDB4MDAsIDB4OTQsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4RDUsMHhBMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjQsMHgwNSwgMHg0MCwweDg0LCAweEY3LDB4MDQsIAorMHg2RSwweDUwLCAweEYwLDB4MDUsIDB4NDIsMHg1QywgMHg4NywweDNBLCAweDFELDB4REMsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweEY3LDB4MDUsIAorMHgzQiwweDY0LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHhGNSwweDA2LCAweDNBLDB4NEMsIDB4RjUsMHgwNSwgMHg0MiwweDQ0LCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjQsMHg4MiwgMHgwMCwweDFDLCAweDIwLDB4MzIsIAorMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4ODAsMHg2MCwgMHhCNCwweEJBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY1LDB4MDYsIAorMHgzNSwweEVDLCAweEUwLDB4MDAsIDB4ODAsMHg4QywgMHhGNSwweDA1LCAweDQyLDB4MzAsIDB4MjAsMHgzMiwgMHgwMCwweDAxLCAweEU2LDB4MDAsIAorMHg4MCwweEM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHg3OCwweDlDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY0LDB4ODYsIDB4MzUsMHg2MCwgMHhGNCwweDg1LCAweDQyLDB4MzAsIDB4RjUsMHgwNiwgMHg0MiwweDQ0LCAweDk1LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDFGLDB4NDgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEUwLDB4MDAsIAorMHg4MCwweEM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDQyLDB4OTgsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MzMsIAorMHgyOCwweDAwLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweEY1LDB4ODYsIAorMHg0MiwweDQ0LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyMCwweEU0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDgxLDB4NjEsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHg0MiwweDU0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RUUsMHgwMCwgMHg4MSwweDI5LCAweEY2LDB4MDYsIAorMHg0MiwweDUwLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDcyLDB4QUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEUwLDB4MDAsIAorMHg4MSwweDYwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDQyLDB4NTAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEY1LDB4ODIsIDB4MDAsMHgwNiwgMHhGNSwweDg1LCAweDQyLDB4NTQsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHg3MywweDRDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDg2LCAweDM4LDB4MUMsIDB4RjUsMHg4NSwgMHg0MiwweDQ0LCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDU4LCAweEY3LDB4MDQsIAorMHg0MiwweDUwLCAweEY2LDB4ODYsIDB4NDIsMHg1MCwgMHg3NiwweEI1LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEY2LDB4MDQsIAorMHg2RiwweDM0LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg4NiwweEIyLCAweDAwLDB4MEMsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4ODIsMHg1MCwgMHhGNCwweDgyLCAweDAwLDB4MDAsIDB4QzUsMHgwNCwgMHgwMCwweDAwLCAweDg2LDB4QjIsIAorMHgwMCwweDEwLCAweEY3LDB4MDQsIDB4RTAsMHgwMCwgMHhDNSwweEE0LCAweDAwLDB4MDAsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHg4MSwweEU0LCAweDA0LDB4MzAsIDB4MDAsMHgxMCwgMHg4NiwweEIyLCAweDAwLDB4MTQsIDB4RjcsMHgwNCwgMHhFMCwweDA0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDgxLDB4RTgsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEY1LDB4ODIsIAorMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDgxLDB4RjUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY1LDB4MDIsIAorMHgwMCwweDAwLCAweDg2LDB4QTIsIDB4MDAsMHgwMCwgMHhGNywweDA0LCAweEUwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEUyLDB4MDAsIDB4ODIsMHgzMCwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHg4MiwweDM4LCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHg4NiwweEEyLCAweDAwLDB4MDQsIDB4RjcsMHgwNCwgMHhFMCwweDA0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAwLCAweDgyLDB4MzksIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEY2LDB4MDIsIAorMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDgyLDB4NDksIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweEY1LDB4MDIsIAorMHgwMCwweDAxLCAweDIwLDB4MkEsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDgyLDB4NTksIDB4MjAsMHgyNiwgMHgwMCwweDAwLCAweEY0LDB4ODIsIAorMHgwMCwweDAxLCAweDIwLDB4MjYsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDg3LDB4NjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4Q0IsMHhDQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHgyMCwgMHgwMCwweDAyLCAweEYwLDB4M0IsIAorMHgyOCwweDAwLCAweEY3LDB4MDQsIDB4NEYsMHg1OCwgMHhGNCwweDA1LCAweDNCLDB4QjAsIDB4MDYsMHhBMCwgMHgwMCwweDE0LCAweEM3LDB4MjAsIAorMHg3MiwweDAwLCAweDc3LDB4MzgsIDB4RkYsMHhGQSwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4MDYsMHhBMCwgMHgwMCwweDE2LCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweEYzLDB4MDIsIDB4MDAsMHgwMSwgMHhGMywweDIzLCAweDI4LDB4MDAsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhDQiwweENDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgyNiwweDE0LCAweDAwLDB4MjAsIDB4RjAsMHgzMywgMHgyOCwweDAwLCAweDA0LDB4QTAsIAorMHgwMCwweDAyLCAweEYwLDB4MjcsIDB4MjgsMHgwMCwgMHhGMywweDAyLCAweDAwLDB4MDAsIDB4MjMsMHg5NCwgMHgwMCwweDJBLCAweEYzLDB4MUYsIAorMHgyOCwweDAwLCAweDA3LDB4MjAsIDB4MDAsMHgxQSwgMHgyMywweDk0LCAweDAwLDB4MkEsIDB4ODMsMHg5RSwgMHgwMCwweDAwLCAweDc3LDB4OUQsIAorMHgwMCwweDFFLCAweDc3LDB4QkMsIDB4RkYsMHhFNSwgMHhDMywweDlDLCAweDdGLDB4QzAsIDB4NzMsMHg5RCwgMHhGRiwweEYwLCAweDc2LDB4MzEsIAorMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHgwNiwweEE0LCAweDAwLDB4MDIsIDB4NzUsMHgxNSwgMHgwMCwweDFFLCAweEYzLDB4QkIsIAorMHgyOCwweDAwLCAweEYzLDB4MDQsIDB4RTAsMHgwMCwgMHg3NSwweDI4LCAweEZGLDB4RTUsIDB4OTMsMHgyMiwgMHgwMCwweDFDLCAweEYzLDB4ODQsIAorMHhFMCwweDA0LCAweDIzLDB4MTQsIDB4MDAsMHgxRSwgMHg5MywweDE2LCAweEZGLDB4QTQsIDB4NzUsMHg5OSwgMHgwMCwweDFFLCAweDc1LDB4QUMsIAorMHhGRiwweEU1LCAweDczLDB4MTUsIDB4MDAsMHgxRSwgMHg3MywweDE4LCAweEZGLDB4RTUsIDB4OTMsMHgxNiwgMHhGRiwweENDLCAweDgzLDB4MTYsIAorMHhGRiwweEE0LCAweDkzLDB4QTIsIDB4MDAsMHgyMCwgMHg4NywweDE2LCAweEZGLDB4RTAsIDB4NzMsMHg5NSwgMHgwMCwweDFFLCAweDczLDB4OUMsIAorMHhGRiwweEU1LCAweDkzLDB4OTYsIDB4RkYsMHhBQywgMHg3MywweDk1LCAweDAwLDB4MUUsIDB4NzMsMHg5QywgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4ODcsMHgxQSwgMHgwMCwweDAwLCAweDkzLDB4OTYsIAorMHhGRiwweEM0LCAweEM3LDB4MzgsIDB4NUYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhFNCwgMHgyMywweDk0LCAweDAwLDB4MUEsIDB4OTMsMHg5NiwgMHhGRiwweEE0LCAweDc2LDB4MUQsIAorMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDU3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDg3LDB4MUUsIDB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4ODcsMHgxNiwgMHhGRiwweEU4LCAweDIzLDB4MTQsIAorMHgwMCwweDE2LCAweDkzLDB4MTYsIDB4RkYsMHhBNCwgMHg3NiwweDE5LCAweDAwLDB4MUUsIDB4ODMsMHg5NiwgMHhGRiwweEFDLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4M0YsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MUEsIAorMHgwMCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4RUMsIDB4MjMsMHgxNCwgMHgwMCwweDEyLCAweDkzLDB4MTYsIAorMHhGRiwweEE0LCAweDc2LDB4MTksIDB4MDAsMHgxRSwgMHg4MywweDk2LCAweEZGLDB4Q0MsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHgzRiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODcsMHgxQSwgMHgwMCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MTYsIAorMHhGRiwweEYwLCAweDgzLDB4MTYsIDB4RkYsMHhDNCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHgzNywweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHhGMywweDgyLCAweDAwLDB4MDIsIDB4RjMsMHhBMywgMHgyOCwweDAwLCAweDIzLDB4MTQsIAorMHgwMCwweDJBLCAweDgzLDB4MUEsIDB4MDAsMHgwMCwgMHg3NywweDk5LCAweDAwLDB4MUUsIDB4NzcsMHhCQywgMHhGRiwweEU1LCAweEMzLDB4MTgsIAorMHg3RiwweEMwLCAweDczLDB4MTksIDB4RkYsMHhGMCwgMHgwNywweDIwLCAweDAwLDB4MTgsIDB4RjMsMHgzQiwgMHgyOCwweDAwLCAweDk0LDB4MTYsIAorMHhGRiwweERDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENCLDB4Q0MsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4MjAsIAorMHgwMCwweDAyLCAweDIzLDB4OTQsIDB4MDAsMHgyQSwgMHg4MywweDlFLCAweDAwLDB4MDAsIDB4NzcsMHg5RCwgMHgwMCwweDFFLCAweDc3LDB4QkMsIAorMHhGRiwweEU1LCAweEMzLDB4OUMsIDB4N0YsMHhDMCwgMHg3MywweDlELCAweEZGLDB4RjAsIDB4MjQsMHg4MCwgMHgwMCwweDA3LCAweDA1LDB4MjAsIAorMHgwMCwweDBBLCAweEYzLDB4QkIsIDB4MjgsMHgwMCwgMHgyMCwweDI2LCAweDAwLDB4MDcsIDB4RUUsMHgwMCwgMHg4NCwweEUwLCAweDA2LDB4MjgsIAorMHgwMCwweDBFLCAweDg2LDB4QjIsIDB4MDAsMHgwMCwgMHg3NywweDMxLCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweDc1LDB4QjEsIAorMHgwMCwweDFFLCAweDc1LDB4QUMsIDB4RkYsMHhFNSwgMHgwNSwweDI4LCAweDAwLDB4MDIsIDB4MDQsMHhBNCwgMHgwMCwweDAxLCAweEM2LDB4QjQsIAorMHg3NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHhGNywweDAyLCAweEZGLDB4MDAsIDB4QzYsMHhCNCwgMHg3NCwweDAwLCAweEY2LDB4QjMsIAorMHgyOCwweDAwLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHhGMywweDAyLCAweDAwLDB4RkYsIDB4QzcsMHgzOCwgMHg1RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweEM3LDB4MzgsIDB4MzQsMHgwMCwgMHhFMCwweDAwLCAweDg0LDB4ODgsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweDA1LDB4MjAsIAorMHgwMCwweDI2LCAweDg2LDB4MkEsIDB4MDAsMHgwMCwgMHg3NiwweEE5LCAweDAwLDB4MUUsIDB4RjUsMHg4NCwgMHg0RiwweDU4LCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweDgzLDB4OTYsIDB4RkYsMHhEQywgMHhGMywweDAyLCAweDAwLDB4RkYsIDB4OTQsMHgxNiwgMHhGRiwweEJDLCAweEM3LDB4MUMsIAorMHg1QSwweDAwLCAweDc3LDB4MzgsIDB4RkYsMHhGQSwgMHhDNiwweDMwLCAweDZGLDB4QzAsIDB4NzYsMHgzMSwgMHhGRiwweEYwLCAweDQ3LDB4MzksIAorMHgwMCwweDAwLCAweEM3LDB4MzgsIDB4MzQsMHgwMCwgMHhGNiwweDgyLCAweEZGLDB4MDAsIDB4QzYsMHgzMCwgMHg2QywweDAwLCAweEM3LDB4MzgsIAorMHg2MCwweDAwLCAweEY2LDB4ODQsIDB4M0IsMHg2QywgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4QzUsMHhBMCwgMHg1QSwweDAwLCAweDc1LDB4QUMsIAorMHhGRiwweEZBLCAweDgzLDB4MTYsIDB4RkYsMHhEQywgMHgwNywweDM0LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHgzQiwweDZDLCAweDA3LDB4MjAsIAorMHgwMCwweDNBLCAweEY2LDB4QkIsIDB4MjgsMHgwMCwgMHgwNywweDIwLCAweDAwLDB4MzYsIDB4RjAsMHgzQiwgMHgyOCwweDAwLCAweEYzLDB4ODIsIAorMHgwMCwweDAzLCAweEYzLDB4QTMsIDB4MjgsMHgwMCwgMHgwNywweDE4LCAweDAwLDB4MUEsIDB4RjUsMHhCQiwgMHgyOCwweDAwLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4Q0IsMHhDQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHgyMCwgMHgwMCwweDAyLCAweEYwLDB4M0IsIAorMHgyOCwweDAwLCAweDI0LDB4ODAsIDB4MDAsMHgwNywgMHgwNSwweDIwLCAweDAwLDB4MEEsIDB4MjAsMHgyNiwgMHgwMCwweDA3LCAweEVFLDB4MDAsIAorMHg4NSwweEQ0LCAweDA2LDB4MjgsIDB4MDAsMHgwRSwgMHg4NiwweEIyLCAweDAwLDB4MDAsIDB4NzcsMHgzMSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIAorMHhGRiwweEU1LCAweDc1LDB4QjEsIDB4MDAsMHgxRSwgMHg3NSwweEFDLCAweEZGLDB4RTUsIDB4MDUsMHgyOCwgMHgwMCwweDAyLCAweDA0LDB4QTQsIAorMHgwMCwweDAxLCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4RjcsMHgwMiwgMHhGRiwweDAwLCAweEM2LDB4QjQsIAorMHg3NCwweDAwLCAweEY2LDB4QjMsIDB4MjgsMHgwMCwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4RjMsMHg4MiwgMHgwMCwweEZGLCAweEM3LDB4MzgsIAorMHg1RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHhDNywweDM4LCAweDNDLDB4MDAsIDB4RTAsMHgwMCwgMHg4NSwweDdDLCAweEY3LDB4MzMsIAorMHgyOCwweDAwLCAweDA1LDB4QTAsIDB4MDAsMHgyNiwgMHg4NiwweDJFLCAweDAwLDB4MDAsIDB4NzYsMHhBRCwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM1LDB4MjAsIDB4MDAsMHgwMCwgMHgyNCwweDAwLCAweDAwLDB4MDcsIDB4RjMsMHgwMiwgMHgwMCwweDAxLCAweDkzLDB4MTYsIAorMHhGRiwweEE0LCAweEY3LDB4MDQsIDB4NEYsMHg1OCwgMHg4MywweDk2LCAweEZGLDB4QkMsIDB4MjQsMHg4MCwgMHgwMCwweDBFLCAweEM3LDB4MUMsIAorMHg3MiwweDAwLCAweDc3LDB4MzgsIDB4RkYsMHhGQSwgMHhDNiwweDMwLCAweDZGLDB4QzAsIDB4NzYsMHgzMSwgMHhGRiwweEYwLCAweDQ3LDB4MzksIAorMHgwMCwweDAwLCAweEY2LDB4ODIsIDB4MDAsMHhGRiwgMHhDNywweDM4LCAweDZDLDB4MDAsIDB4RjYsMHg4MiwgMHhGRiwweDAwLCAweEM2LDB4MzAsIAorMHg2QywweDAwLCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHhGNiwweDg0LCAweDNCLDB4NkMsIDB4RjcsMHgyRiwgMHgyOCwweDAwLCAweDA3LDB4MzQsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4M0IsMHg2QywgMHgwNywweDI4LCAweDAwLDB4M0EsIDB4RjYsMHhCQiwgMHgyOCwweDAwLCAweDA3LDB4MjgsIAorMHgwMCwweDM2LCAweEYwLDB4M0IsIDB4MjgsMHgwMCwgMHhGMywweDAyLCAweDAwLDB4MDMsIDB4RjMsMHgyQiwgMHgyOCwweDAwLCAweDIwLDB4MjIsIAorMHgwMCwweDA3LCAweEVFLDB4MDAsIDB4ODYsMHg5NCwgMHhDNiwweDI4LCAweDQ4LDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDI2LCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4MDQsMHhBNCwgMHgwMCwweDAyLCAweDA0LDB4MjAsIAorMHgwMCwweDAxLCAweDgzLDB4OTYsIDB4RkYsMHhBNCwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweEY2LDB4ODIsIAorMHhGRiwweDAwLCAweEM3LDB4MzgsIDB4NkMsMHgwMCwgMHhDNywweDFDLCAweDcwLDB4MDAsIDB4RTAsMHgwMCwgMHg4NiwweDUwLCAweEY3LDB4MzMsIAorMHgyOCwweDAwLCAweDA2LDB4MjgsIDB4MDAsMHgyNiwgMHg4NiwweEIyLCAweDAwLDB4MDAsIDB4NzcsMHgzMSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIAorMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4RjcsMHgwMiwgMHhGRiwweDAwLCAweEM2LDB4QjQsIAorMHg3NCwweDAwLCAweEY2LDB4QjMsIDB4MjgsMHgwMCwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4RjMsMHgwNCwgMHgzQiwweEIwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHg5NSwweDE2LCAweEZGLDB4QjQsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhENCwweDJDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NSwweDE2LCAweEZGLDB4QjQsIDB4RjAsMHgwNSwgMHg0MCwweDdDLCAweDgzLDB4OTYsIAorMHhGRiwweEJDLCAweDIzLDB4MDAsIDB4MDAsMHgwNywgMHhGMywweDA1LCAweDQyLDB4NTgsIDB4RjcsMHgwNCwgMHg0MiwweDUwLCAweEY2LDB4MDYsIAorMHg0MiwweDUwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4RjMsMHgwNiwgMHgzOSwweDM0LCAweEYzLDB4MDUsIAorMHg0MiwweDQ0LCAweEY1LDB4MDUsIDB4NDAsMHg3NCwgMHhGMywweDg1LCAweDQyLDB4NjAsIDB4RjMsMHg4MiwgMHgwMCwweDA2LCAweEYzLDB4ODUsIAorMHg0MiwweDU0LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4RjYsMHg4NCwgMHgyRCwweDM4LCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHgwNiwweDM0LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweEY3LDB4MDYsIAorMHgyQywweDI4LCAweDc2LDB4QjUsIDB4MDAsMHgwMiwgMHhGMywweDgyLCAweDAwLDB4MUMsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIAorMHg4NywweDRDLCAweEIzLDB4QjYsIDB4NzAsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjMsMHgwNiwgMHg0MiwweDQ0LCAweDkzLDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDFGLDB4NDgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDQ4LCAweEYzLDB4ODYsIAorMHg0MiwweDQ0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyMCwweEU0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDg5LDB4RUQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHg0MiwweDU0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RUUsMHgwMCwgMHg4NywweEM5LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDczLDB4NEMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEUwLDB4MDAsIAorMHg4OSwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhDQiwweENDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDI2LDB4MTQsIDB4MDAsMHgyMCwgMHhGMCwweDMzLCAweDI4LDB4MDAsIDB4MDUsMHhBMCwgMHgwMCwweDAyLCAweEYwLDB4MkYsIAorMHgyOCwweDAwLCAweEYzLDB4ODIsIDB4MDAsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MjIsIDB4RjMsMHhBNywgMHgyOCwweDAwLCAweDA0LDB4QTAsIAorMHgwMCwweDFBLCAweDk0LDB4OTYsIDB4RkYsMHhENCwgMHgyMywweDk0LCAweDAwLDB4MjIsIDB4ODMsMHg5RSwgMHgwMCwweDAwLCAweDc3LDB4OUQsIAorMHgwMCwweDFFLCAweDc3LDB4QkMsIDB4RkYsMHhFNSwgMHhDMywweDlDLCAweDdGLDB4QzAsIDB4NzMsMHg5RCwgMHhGRiwweEYwLCAweDc2LDB4MzEsIAorMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHgwNiwweEFDLCAweDAwLDB4MDIsIDB4MjMsMHgxNCwgMHgwMCwweDFFLCAweDc1LDB4MTksIAorMHgwMCwweDFFLCAweEYzLDB4QTcsIDB4MjgsMHgwMCwgMHhGNCwweDg0LCAweEUwLDB4MDAsIDB4NzUsMHgyOCwgMHhGRiwweEU1LCAweDk0LDB4QTIsIAorMHgwMCwweDFDLCAweEYzLDB4ODQsIDB4RTAsMHgwNCwgMHg3NCwweDk1LCAweDAwLDB4MUUsIDB4NzQsMHhBNCwgMHhGRiwweEU1LCAweDk0LDB4OTYsIAorMHhGRiwweEI0LCAweDc0LDB4OTUsIDB4MDAsMHgxRSwgMHg3NCwweEE0LCAweEZGLDB4RTUsIDB4OTQsMHg5NiwgMHhGRiwweENDLCAweDg0LDB4OTYsIAorMHhGRiwweEI0LCAweDkzLDB4QTIsIDB4MDAsMHgyMCwgMHg4NywweDE2LCAweEZGLDB4RTAsIDB4NzMsMHg5NSwgMHgwMCwweDFFLCAweDczLDB4OUMsIAorMHhGRiwweEU1LCAweDkzLDB4OTYsIDB4RkYsMHhCQywgMHg3MywweDk1LCAweDAwLDB4MUUsIDB4NzMsMHg5QywgMHhGRiwweEU1LCAweDkzLDB4OTYsIAorMHhGRiwweEM0LCAweDgzLDB4OTYsIDB4RkYsMHhCQywgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MkYsIAorMHgyOCwweDAwLCAweEY1LDB4ODQsIDB4NEYsMHg1OCwgMHg4NywweDFBLCAweDAwLDB4MDAsIDB4QzUsMHhBMCwgMHg1QSwweDAwLCAweDc1LDB4QUMsIAorMHhGRiwweEZBLCAweEM3LDB4MzgsIDB4NTcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhFNCwgMHgyMywweDE0LCAweDAwLDB4MUEsIDB4NzYsMHgxOSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweDQ1LDB4QUQsIDB4MDAsMHgwMCwgMHhDNywweDM4LCAweDRGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDg3LDB4MUEsIDB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4ODQsMHg5NiwgMHhGRiwweENDLCAweEM3LDB4MzgsIAorMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweDg3LDB4MTYsIAorMHhGRiwweEU4LCAweDIzLDB4MTQsIDB4MDAsMHgxNiwgMHg3NiwweDE5LCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHgzRiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODcsMHgxQSwgMHgwMCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhFQywgMHgyMywweDE0LCAweDAwLDB4MTIsIDB4NzYsMHgxOSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NEYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MUEsIAorMHgwMCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHg4MywweDk2LCAweEZGLDB4QzQsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDE2LCAweEZGLDB4RjAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweEM3LDB4MzgsIAorMHgzRiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4RjQsMHg4MiwgMHgwMCwweDAyLCAweEY0LDB4QTMsIAorMHgyOCwweDAwLCAweDA0LDB4MjAsIDB4MDAsMHgxOCwgMHgyMywweDk0LCAweDAwLDB4MjIsIDB4ODMsMHg5RSwgMHgwMCwweDAwLCAweDc3LDB4OUQsIAorMHgwMCwweDFFLCAweDc3LDB4QkMsIDB4RkYsMHhFNSwgMHhDMywweDlDLCAweDdGLDB4QzAsIDB4NzMsMHg5RCwgMHhGRiwweEYwLCAweDg0LDB4OTYsIAorMHhGRiwweEQ0LCAweEYzLDB4QTMsIDB4MjgsMHgwMCwgMHhGMywweDgyLCAweDAwLDB4MDEsIDB4RjMsMHhBNywgMHgyOCwweDAwLCAweDk1LDB4OTMsIAorMHhGRiwweEZDLCAweEY0LDB4ODYsIDB4RTAsMHgwMCwgMHg5NCwweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4NCwgMHg0RiwweDVDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyMywweDQwLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDc4LDB4RDgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY0LDB4ODYsIAorMHgzNiwweDc4LCAweEY0LDB4ODUsIDB4NDIsMHg0NCwgMHhGMCwweDA1LCAweDQwLDB4ODQsIDB4RjYsMHg4NCwgMHg0RiwweDVDLCAweEY3LDB4MDIsIAorMHgwMCwweDY0LCAweDk3LDB4MzYsIDB4MDAsMHgwMCwgMHg5MCwweDM2LCAweDAwLDB4MDQsIDB4RjcsMHgwMiwgMHgwMCwweDAxLCAweEY3LDB4MDUsIAorMHg0MCwweDg0LCAweEYzLDB4ODYsIDB4MzUsMHhFQywgMHhGMywweDg1LCAweDQyLDB4MzAsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4OTAsIDB4RjcsMHgwNCwgMHg0MiwweDYwLCAweEY1LDB4MDIsIAorMHgwMCwweDAwLCAweDA1LDB4QjgsIDB4MDAsMHgxOCwgMHhGNiwweDA0LCAweDQyLDB4NTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MzIsIAorMHgwMCwweDA3LCAweEVFLDB4MDAsIDB4OEEsMHg3MCwgMHhDNywweDMwLCAweDYwLDB4MDAsIDB4QzcsMHgzOCwgMHg1OCwweDAwLCAweDA3LDB4MzgsIAorMHgwMCwweDBFLCAweDg2LDB4QkEsIDB4MDAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIAorMHg3NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHhGNywweDAyLCAweDAwLDB4RkYsIDB4QzYsMHhCNCwgMHg3NCwweDAwLCAweEMwLDB4MzYsIAorMHg1MiwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHhENywweDAwLCAweDBBLDB4NzAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg4QSwweDcxLCAweDA3LDB4MzAsIDB4MDAsMHgwMSwgMHhFMCwweDAwLCAweDhBLDB4MTgsIDB4RjcsMHgwNSwgMHg0MiwweDU4LCAweEY0LDB4MDQsIAorMHg0MiwweDU4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDIyLCAweDAwLDB4MDcsIDB4RUUsMHgwMCwgMHg4RCwweDk0LCAweDI0LDB4OTQsIAorMHgwMCwweDM2LCAweEY2LDB4MDQsIDB4NDIsMHg2MCwgMHgyNSwweDE0LCAweDAwLDB4MzgsIDB4MjMsMHg5NCwgMHgwMCwweDIwLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDc1LDB4QjEsIDB4MDAsMHgxRSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MkIsIAorMHgyOCwweDAwLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NSwweEFDLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg1RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MzQsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MzIsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MzAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MkUsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MkMsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MkEsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDI0LDB4OTQsIAorMHgwMCwweDI4LCAweDc2LDB4MzEsIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHg5NCwweDEzLCAweEZGLDB4RkMsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDkzLDB4OTYsIAorMHhGRiwweDdDLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhEMCwweERDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY2LDB4MDQsIDB4NDIsMHg2MCwgMHgyNCwweDk0LCAweDAwLDB4N0UsIDB4MjUsMHgxNCwgMHgwMCwweDgwLCAweDIzLDB4OTQsIAorMHgwMCwweDY4LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg3NSwweEIxLCAweDAwLDB4MUUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MkIsIDB4MjgsMHgwMCwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzUsMHhBQywgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg1RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDdDLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDdBLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDc4LCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDc2LCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDc0LCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDcyLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHg3MCwgMHg3NiwweDMxLCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDkzLDB4OTYsIAorMHhGRiwweDc0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhEMiwweDU4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDgzLDB4OTYsIDB4RkYsMHg3NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDQsIAorMHg0MiwweDU4LCAweDIzLDB4OTQsIDB4MDAsMHg1MCwgMHhDNywweDAwLCAweDcyLDB4MDAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDkzLDB4OTYsIAorMHhGRiwweDZDLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhDRiwweDI0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDgzLDB4OTYsIDB4RkYsMHg2QywgMHhGNiwweDg2LCAweDQyLDB4NTAsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODQsIAorMHg0MiwweDU4LCAweDc2LDB4QjUsIDB4MDAsMHgxRSwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNCwgMHg0MiwweDUwLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDgzLDB4OTYsIAorMHhGRiwweDdDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhGMywweDM4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg4RCwweDk1LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NDIsMHg1OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIAorMHg0MiwweDU4LCAweEY3LDB4MDQsIDB4NDIsMHg1OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDA3LCAweEVFLDB4MDAsIAorMHg4RCwweEQ0LCAweEYzLDB4ODIsIDB4MTcsMHg3MCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjMsMHg4MiwgMHgwMCwweDFDLCAweDIwLDB4MzIsIAorMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4OEQsMHhGNCwgMHhCMywweEJBLCAweDY4LDB4MDIsIDB4RTAsMHgwMCwgMHg4RCwweEY0LCAweEYwLDB4MDUsIAorMHgyRCwweDM4LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4MUIsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODYsIAorMHg0MiwweDQ0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgxRSwweEMwLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIAorMHgwMCwweDg4LCAweEY3LDB4MDQsIDB4NDIsMHg1MCwgMHhGNiwweDg2LCAweDQyLDB4NTAsIDB4NzYsMHhCNSwgMHgwMCwweDFFLCAweEYzLDB4ODQsIAorMHg2RiwweDM0LCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHg5MywweDk2LCAweEZGLDB4QzQsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDg2LDB4OUUsIAorMHgwMCwweDBDLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHg4RSwweDY1LCAweEY2LDB4MDYsIAorMHg0MiwweEEwLCAweEY3LDB4MDQsIDB4NDIsMHhBMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RTAsMHgwMCwgMHg5NCwweEU0LCAweEY3LDB4MzMsIAorMHgyOCwweDAwLCAweEY2LDB4MDQsIDB4NDIsMHg2MCwgMHgyNCwweDk0LCAweDAwLDB4MzYsIDB4ODUsMHgxNiwgMHhGRiwweEM0LCAweDIzLDB4OTQsIAorMHgwMCwweDM4LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweDg1LDB4MkEsIDB4MDAsMHgxQywgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4NzUsMHhCMSwgMHgwMCwweDFFLCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHg5NSwweDE2LCAweEZGLDB4QkMsIDB4RjcsMHgxRiwgMHgyOCwweDAwLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc1LDB4QUMsIDB4RkYsMHhFNSwgMHg4NSwweDE2LCAweEZGLDB4QzQsIDB4QzcsMHgzOCwgMHg1RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MzQsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MzIsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MzAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MkUsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MkMsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MkEsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDI0LDB4OTQsIAorMHgwMCwweDI4LCAweDc2LDB4MzEsIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHg4NywweDJBLCAweDAwLDB4MjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgyNywweDE0LCAweDAwLDB4MjAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4RDAsMHhEQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODMsMHg5NiwgMHhGRiwweEM0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MUUsIDB4MDAsMHgxMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg4RiwweEYwLCAweEY2LDB4ODIsIDB4MDAsMHgwMCwgMHg4NywweDFFLCAweDAwLDB4MTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4OEYsMHhGNCwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RjYsMHg4MiwgMHgwMCwweDAxLCAweDIwLDB4MzYsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4OTAsMHg0MSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODUsMHgxNiwgMHhGRiwweEM0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA1LDB4MjgsIDB4MDAsMHgxMCwgMHg5NSwweDE2LCAweEZGLDB4QjQsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NzIsMHg1MCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODMsMHg5NiwgMHhGRiwweEI0LCAweDI3LDB4MTQsIAorMHgwMCwweDIwLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhGOSwweDM0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhFMCwweDAwLCAweDk0LDB4RTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg1LDB4MTYsIAorMHhGRiwweEJDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDJBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg5NCwweEJDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENCLDB4Q0MsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4MDIsIAorMHgwMCwweDAwLCAweDIzLDB4OTQsIDB4MDAsMHg2MiwgMHhGNSwweDFGLCAweDI4LDB4MDAsIDB4NzUsMHg5NSwgMHgwMCwweDFFLCAweDc1LDB4QUMsIAorMHhGRiwweEU1LCAweDA2LDB4MjAsIDB4MDAsMHgwMiwgMHgwNiwweEIwLCAweDAwLDB4MDIsIDB4MjMsMHgxNCwgMHgwMCwweDFFLCAweDczLDB4OTksIAorMHgwMCwweDFFLCAweDczLDB4OUMsIDB4RkYsMHhFNSwgMHg5MywweDk2LCAweEZGLDB4NzQsIDB4NzUsMHgxNSwgMHgwMCwweDFFLCAweDc1LDB4MjgsIAorMHhGRiwweEU1LCAweDk1LDB4MTYsIDB4RkYsMHg3QywgMHg3MywweDk1LCAweDAwLDB4MUUsIDB4NzMsMHg5QywgMHhGRiwweEU1LCAweDkzLDB4OTYsIAorMHhGRiwweDhDLCAweDg1LDB4MTYsIDB4RkYsMHhDNCwgMHg3MywweDk1LCAweDAwLDB4MUUsIDB4OTMsMHg5NiwgMHhGRiwweDg0LCAweDg1LDB4MkEsIAorMHgwMCwweDM0LCAweDIzLDB4OTQsIDB4MDAsMHg2MiwgMHg5NSwweDE2LCAweEZGLDB4QUMsIDB4RjAsMHgzMywgMHgyOCwweDAwLCAweDA1LDB4MjAsIAorMHgwMCwweDFBLCAweDk1LDB4MTYsIDB4RkYsMHg5NCwgMHg4MywweDlFLCAweDAwLDB4MDAsIDB4NzcsMHg5RCwgMHgwMCwweDFFLCAweDc3LDB4QkMsIAorMHhGRiwweEU1LCAweEMzLDB4OUMsIDB4N0YsMHhDMCwgMHg3MywweDlELCAweEZGLDB4RjAsIDB4NzQsMHg5NSwgMHgwMCwweDFFLCAweEYzLDB4QUIsIAorMHgyOCwweDAwLCAweDg1LDB4MTYsIDB4RkYsMHhDNCwgMHg3NCwweEE0LCAweEZGLDB4RTUsIDB4ODUsMHgyQSwgMHgwMCwweDEwLCAweDgzLDB4OTYsIAorMHhGRiwweEM0LCAweDk1LDB4MjIsIDB4MDAsMHgxQywgMHg4MywweDlFLCAweDAwLDB4MTQsIDB4ODUsMHgxNiwgMHhGRiwweDg0LCAweDkzLDB4QTIsIAorMHgwMCwweDIwLCAweDg3LDB4MTYsIDB4RkYsMHhFMCwgMHg3NSwweDI4LCAweEZGLDB4RTUsIDB4OTUsMHgxNiwgMHhGRiwweDg0LCAweEYzLDB4ODQsIAorMHg0RiwweDU4LCAweDg1LDB4MTYsIDB4RkYsMHg3NCwgMHhDNywweDM4LCAweDVGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzMsIAorMHgyOCwweDAwLCAweDg3LDB4MUEsIDB4MDAsMHgwMCwgMHg5MywweDk2LCAweEZGLDB4QTQsIDB4QzAsMHgyMiwgMHgzQSwweDAwLCAweDgzLDB4OTYsIAorMHhGRiwweDdDLCAweEM3LDB4MzgsIDB4NTcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhFNCwgMHgyMywweDE0LCAweDAwLDB4MUEsIDB4NzYsMHgxOSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NEYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MUEsIAorMHgwMCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4RTgsIDB4MjMsMHgxNCwgMHgwMCwweDE2LCAweDc2LDB4MTksIAorMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDNGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDg3LDB4MUEsIDB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4ODUsMHgxNiwgMHhGRiwweDhDLCAweDgzLDB4OTYsIAorMHhGRiwweDg0LCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhFQywgMHgyMywweDE0LCAweDAwLDB4MTIsIDB4NzYsMHgxOSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NTcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MUEsIAorMHgwMCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDg3LDB4MTYsIDB4RkYsMHhGMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHgzRiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHhGNSwweDAyLCAweDAwLDB4MDIsIDB4RjUsMHgyMywgMHgyOCwweDAwLCAweDIzLDB4OTQsIAorMHgwMCwweDUyLCAweDgzLDB4OUUsIDB4MDAsMHgwMCwgMHg3NywweDlELCAweDAwLDB4MUUsIDB4NzcsMHhCQywgMHhGRiwweEU1LCAweEMzLDB4OUMsIAorMHg3RiwweEMwLCAweDczLDB4OUQsIDB4RkYsMHhGMCwgMHgwMywweDIwLCAweDAwLDB4MTgsIDB4RTYsMHgwMCwgMHg5MiwweDMwLCAweEYzLDB4OUIsIAorMHgyOCwweDAwLCAweEY3LDB4MDQsIDB4NDIsMHg3MCwgMHhFMCwweDAwLCAweDkyLDB4OUMsIDB4RjYsMHgwNiwgMHg0MiwweDcyLCAweDg1LDB4MTYsIAorMHhGRiwweEM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NiwweEFBLCAweDAwLDB4MjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzQsIAorMHgwMCwweDA3LCAweDIwLDB4M0EsIDB4MDAsMHgwRSwgMHhFMiwweDAwLCAweDkyLDB4OTQsIDB4QzcsMHgzNCwgMHg2OCwweDAwLCAweEY1LDB4ODQsIAorMHg0MiwweDYwLCAweEYzLDB4ODIsIDB4MDAsMHhGRiwgMHhDNywweDJDLCAweDcwLDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDI2LCAweDg2LDB4QkEsIAorMHgwMCwweDAwLCAweDk3LDB4MTYsIDB4RkYsMHg3NCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIAorMHg3NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHhDNiwweEI0LCAweDNDLDB4MDAsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweDQ3LDB4MEMsIAorMHgwMCwweDAxLCAweEQ3LDB4MDAsIDB4MEEsMHg3MCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg5MiwweEM5LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NDIsMHg3NCwgMHhGNiwweDA2LCAweDQyLDB4NzQsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MzMsIAorMHgyOCwweDAwLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDc4LDB4OUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEUwLDB4MDAsIAorMHg5NCwweEU0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NSwweDE2LCAweEZGLDB4QTQsIDB4ODMsMHg5NiwgMHhGRiwweDc0LCAweEM3LDB4MjAsIAorMHg1MiwweDAwLCAweDc0LDB4QjgsIDB4RkYsMHhGQSwgMHhDNiwweDI0LCAweDAwLDB4MDAsIDB4ODcsMHgxRSwgMHgwMCwweDAwLCAweDc2LDB4OUQsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNSwweEFDLCAweDUyLDB4MDAsIDB4NzUsMHhBQywgMHhGRiwweEZBLCAweDQ2LDB4MzEsIAorMHgwMCwweDAwLCAweEY1LDB4MDIsIDB4MDAsMHhGRiwgMHhDNiwweDMwLCAweDU0LDB4MDAsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweEY2LDB4ODIsIDB4RkYsMHgwMCwgMHhDNywweDM4LCAweDZDLDB4MDAsIDB4QzYsMHgzMCwgMHg3MCwweDAwLCAweEY2LDB4MUYsIAorMHgyOCwweDAwLCAweDgzLDB4OTYsIDB4RkYsMHg5NCwgMHg4NSwweDE2LCAweEZGLDB4QzQsIDB4RjUsMHg5RiwgMHgyOCwweDAwLCAweDg3LDB4MkEsIAorMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MjQsIDB4RTYsMHgwMCwgMHg5NCwweDY5LCAweEY2LDB4ODYsIAorMHg0MCwweDk4LCAweEY3LDB4MDQsIDB4NkUsMHg1MCwgMHg4NiwweDJBLCAweDAwLDB4MkMsIDB4QzYsMHhBNCwgMHgwMCwweDAwLCAweDIzLDB4OTQsIAorMHgwMCwweDYyLCAweDg0LDB4OUUsIDB4MDAsMHgwMCwgMHg3NywweDlELCAweDAwLDB4MUUsIDB4NzcsMHhCQywgMHhGRiwweEU1LCAweEM0LDB4QTQsIAorMHg3RiwweEMwLCAweDc0LDB4QTUsIDB4RkYsMHhGMCwgMHg0NiwweEI1LCAweDAwLDB4MDAsIDB4ODcsMHgzQSwgMHgxRCwweERDLCAweDc2LDB4QjUsIAorMHgwMCwweDAyLCAweEMwLDB4MzIsIDB4NzIsMHgwMCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4RDcsMHgwMCwgMHgwQSwweDcwLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEY3LDB4MDYsIDB4NDAsMHg5OCwgMHhFNiwweDAwLCAweDk0LDB4MzQsIDB4QzMsMHgzNCwgMHg3MCwweDAwLCAweEM1LDB4ODQsIAorMHgwMCwweDAwLCAweDg2LDB4QUEsIDB4MDAsMHgyNCwgMHhGNywweDA0LCAweEUwLDB4MDAsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweDA1LDB4MjgsIDB4MDAsMHgyNCwgMHhFNiwweDAwLCAweDkzLDB4QzQsIDB4OTUsMHgxNiwgMHhGRiwweDc0LCAweDgzLDB4OTYsIAorMHhGRiwweEM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NiwweDlFLCAweDAwLDB4MjgsIDB4RjcsMHgwNCwgMHhFMCwweDA0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDkzLDB4QzgsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEY2LDB4MDIsIAorMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDkzLDB4RDUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY1LDB4ODIsIAorMHgwMCwweDAwLCAweDg1LDB4MTYsIDB4RkYsMHg3NCwgMHhGNywweDA0LCAweEUwLDB4MDAsIDB4ODYsMHhBQSwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAwLCAweDk0LDB4MTQsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4OTQsMHgxQywgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4ODYsMHhBQSwgMHgwMCwweDA0LCAweEY3LDB4MDQsIAorMHhFMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHg5NCwweDFELCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg5NCwweDJELCAweDIwLDB4MkUsIAorMHgwMCwweDAwLCAweEY1LDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHg5NCwweDM5LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY0LDB4ODIsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDRGLDB4NTgsIDB4RjQsMHg5QiwgMHgyOCwweDAwLCAweDgzLDB4OTYsIAorMHhGRiwweEM0LCAweEY2LDB4ODYsIDB4NDAsMHg5QSwgMHhDNywweDIwLCAweDcyLDB4MDAsIDB4NzcsMHgzOCwgMHhGRiwweEZBLCAweDg2LDB4MUUsIAorMHgwMCwweDMwLCAweDQ3LDB4MzksIDB4MDAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweEUwLDB4MDAsIAorMHg5NCwweEU0LCAweEY2LDB4M0IsIDB4MjgsMHgwMCwgMHg0NywweDI1LCAweDAwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEM3LDB4MzgsIAorMHg2OCwweDAwLCAweEY1LDB4MDIsIDB4MDAsMHgwMSwgMHhGNSwweDNCLCAweDI4LDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDAyLCAweDIzLDB4OTQsIAorMHgwMCwweDYyLCAweDgzLDB4OUUsIDB4MDAsMHgwMCwgMHg3NywweDlELCAweDAwLDB4MUUsIDB4NzcsMHhCQywgMHhGRiwweEU1LCAweEMzLDB4OUMsIAorMHg3RiwweEMwLCAweDczLDB4OUQsIDB4RkYsMHhGMCwgMHgyNSwweDE0LCAweDAwLDB4NjIsIDB4RjMsMHhCQiwgMHgyOCwweDAwLCAweDg1LDB4MkEsIAorMHgwMCwweDAwLCAweDc3LDB4QTksIDB4MDAsMHgxRSwgMHg3NywweEJDLCAweEZGLDB4RTUsIDB4QzUsMHgyOCwgMHg3RiwweEMwLCAweDc1LDB4MjksIAorMHhGRiwweEYwLCAweEUwLDB4MDAsIDB4OTQsMHhFNCwgMHhGNSwweDFCLCAweDI4LDB4MDAsIDB4ODMsMHg5NiwgMHhGRiwweEJDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4MUUsIDB4MDAsMHgwMSwgMHhFNiwweDAwLCAweDk0LDB4RTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NzgsMHg5QywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHgwNiwgMHgzNSwweDYwLCAweEY1LDB4MDUsIAorMHg0MiwweDMwLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweEY1LDB4MDYsIAorMHg0MiwweDQ0LCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyMCwweEU0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweDk2LDB4ODksIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY2LDB4ODQsIAorMHg0MiwweDU0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDM2LCAweDAwLDB4MDAsIDB4RUUsMHgwMCwgMHg5NSwweDhELCAweEY1LDB4ODYsIAorMHg0MiwweDUwLCAweEY3LDB4MDQsIDB4NDIsMHg1MCwgMHg3NiwweDJELCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweDI2LDB4QjQsIAorMHgwMCwweDAxLCAweEY2LDB4ODUsIDB4NDIsMHg1NCwgMHgyNSwweDAwLCAweDAwLDB4MDcsIDB4RjUsMHgwNSwgMHg0MiwweDU4LCAweEY2LDB4ODQsIAorMHgyRCwweDM4LCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MkYsIAorMHgyOCwweDAwLCAweDA2LDB4MzQsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4RjcsMHgwNiwgMHgyQywweDI4LCAweDc2LDB4QjUsIAorMHgwMCwweDAyLCAweEY1LDB4MDIsIDB4MDAsMHgxQywgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHg5NiwweDg4LCAweEI1LDB4MzYsIAorMHg3MCwweDAyLCAweEUwLDB4MDAsIDB4OTYsMHg4OCwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjUsMHgwNCwgMHg0MiwweDYwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhCMiwweDg0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY2LDB4ODQsIDB4NEYsMHg1OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzNCwgMHgwMCwweDQwLCAweEMwLDB4MjIsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4OTUsMHhFQywgMHhGNiwweDA2LCAweDQyLDB4NzYsIDB4RjcsMHgwNCwgMHg0MiwweDc0LCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHg3OCwweDlDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEUwLDB4MDAsIDB4OTYsMHg4OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg0MiwweDYwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MjIsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweDk2LDB4MjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY1LDB4MDQsIDB4M0IsMHhCMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4RDQsMHgyQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMCwgMHg5NiwweDQwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MjIsIDB4NkEsMHgwMCwgMHhFNiwweDAwLCAweDk2LDB4NzEsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENDLDB4NjAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDQsIAorMHg0MCwweDdDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY1LDB4MDQsIAorMHg0MCwweDc0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhCRSwweEY4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhFMCwweDAwLCAweDk2LDB4ODgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY1LDB4MDQsIAorMHg0MCwweDc0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhDMSwweEI0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHg3MCwgMHhGNiwweDA0LCAweDZGLDB4MzQsIDB4RjcsMHgwNCwgMHg0MiwweDY0LCAweDg2LDB4QjIsIAorMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHg5QiwweDE4LCAweDA2LDB4QjAsIAorMHgwMCwweDAyLCAweDg3LDB4MzYsIDB4MDAsMHgwMCwgMHhGNCwweDA0LCAweDQwLDB4N0MsIDB4NzYsMHhCNSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4QzAsMHgzQSwgMHg0MiwweDAwLCAweEU2LDB4MDAsIAorMHg5QiwweDE4LCAweDI0LDB4OTQsIDB4MDAsMHgzNiwgMHhGNiwweDA0LCAweDQwLDB4NzQsIDB4MjMsMHg5NCwgMHgwMCwweDM4LCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDc1LDB4QjEsIDB4MDAsMHgxRSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUYsIAorMHgyOCwweDAwLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NSwweEFDLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg1RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MzQsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MzIsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MzAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MkUsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MkMsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4MkEsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDI0LDB4OTQsIAorMHgwMCwweDI4LCAweDc2LDB4MzEsIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHg5NCwweDEzLCAweEZGLDB4RkMsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDI3LDB4MTQsIAorMHgwMCwweDIwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhEMCwweERDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENCLDB4Q0MsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4MDQsIAorMHg0MCwweDc0LCAweDk0LDB4MTYsIDB4RkYsMHhDNCwgMHgwNywweDIwLCAweDAwLDB4MDIsIDB4RjAsMHgzQiwgMHgyOCwweDAwLCAweDI0LDB4ODAsIAorMHgwMCwweDA3LCAweEY0LDB4MDIsIDB4MDAsMHhGRiwgMHg4MywweDk2LCAweEZGLDB4QzQsIDB4OTUsMHgxNiwgMHhGRiwweEJDLCAweDAzLDB4MUMsIAorMHgwMCwweDBBLCAweDIwLDB4MjYsIDB4MDAsMHgwNywgMHhFRSwweDAwLCAweDk4LDB4QTgsIDB4MDYsMHgxOCwgMHgwMCwweDBFLCAweDg2LDB4QjIsIAorMHgwMCwweDAwLCAweDc3LDB4MzEsIDB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4NzUsMHhCMSwgMHgwMCwweDFFLCAweDc1LDB4QUMsIAorMHhGRiwweEU1LCAweDAzLDB4MTgsIDB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNSwgMHhGRiwweEYwLCAweEY3LDB4MDIsIAorMHhGRiwweDAwLCAweEM2LDB4QjQsIDB4NzQsMHgwMCwgMHhGNiwweEIzLCAweDI4LDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDA0LDB4QTQsIAorMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NUYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4QzcsMHgzOCwgMHg0NCwweDAwLCAweEUwLDB4MDAsIAorMHg5OCwweDU0LCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHg4NSwweDE2LCAweEZGLDB4QzQsIDB4NzQsMHg5NSwgMHgwMCwweDFFLCAweDc0LDB4QTQsIAorMHhGRiwweEU1LCAweDgzLDB4OTYsIDB4RkYsMHhDNCwgMHgyMywweDE0LCAweDAwLDB4MUUsIDB4NzQsMHgxOSwgMHgwMCwweDFFLCAweDc0LDB4MjAsIAorMHhGRiwweEU1LCAweDA1LDB4MjgsIDB4MDAsMHgyNiwgMHg5NSwweDE2LCAweEZGLDB4OEMsIDB4ODUsMHhBQSwgMHgwMCwweDAwLCAweDc2LDB4QTksIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHgwMywweDlDLCAweDAwLDB4MDIsIDB4OTMsMHg5NiwgMHhGRiwweEI0LCAweDA2LDB4MUMsIAorMHgwMCwweDAyLCAweDczLDB4OTUsIDB4MDAsMHgxRSwgMHg3MywweDlDLCAweEZGLDB4RTUsIDB4OTMsMHg5NiwgMHhGRiwweEFDLCAweDczLDB4OTUsIAorMHgwMCwweDFFLCAweDczLDB4OUMsIDB4RkYsMHhFNSwgMHg5MywweDk2LCAweEZGLDB4OUMsIDB4ODMsMHg5NiwgMHhGRiwweEJDLCAweDc1LDB4MTUsIAorMHgwMCwweDFFLCAweDc1LDB4MjgsIDB4RkYsMHhFNSwgMHg5NSwweDE2LCAweEZGLDB4OTQsIDB4NzUsMHgxNSwgMHgwMCwweDFFLCAweDc1LDB4MjgsIAorMHhGRiwweEU1LCAweDk1LDB4MTYsIDB4RkYsMHhBNCwgMHg4NSwweDE2LCAweEZGLDB4QzQsIDB4QzUsMHhBQywgMHg2RiwweEMwLCAweDc1LDB4QUQsIAorMHhGRiwweEYwLCAweEY1LDB4MDUsIDB4NDIsMHg2MCwgMHhGNSwweDA0LCAweDRGLDB4NTgsIDB4RjYsMHg4MiwgMHgwMCwweEZGLCAweEM3LDB4MUMsIAorMHg1MiwweDAwLCAweDc3LDB4MzgsIDB4RkYsMHhGQSwgMHg0NywweDM5LCAweDAwLDB4MDAsIDB4QzcsMHgzOCwgMHg2QywweDAwLCAweEY2LDB4ODIsIAorMHhGRiwweDAwLCAweEM1LDB4QUMsIDB4NkMsMHgwMCwgMHhDNywweDM4LCAweDU4LDB4MDAsIDB4ODMsMHg5NiwgMHhGRiwweDhDLCAweEY1LDB4ODQsIAorMHgzQiwweDZDLCAweDg1LDB4MTYsIDB4RkYsMHhCNCwgMHhGNywweDFGLCAweDI4LDB4MDAsIDB4ODcsMHgxNiwgMHhGRiwweEUwLCAweDA2LDB4QUMsIAorMHgwMCwweDAxLCAweEY2LDB4ODUsIDB4M0IsMHg2QywgMHg4MywweDk2LCAweEZGLDB4QzQsIDB4QzcsMHgzOCwgMHg0RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MkIsIDB4MjgsMHgwMCwgMHhGNSwweDA0LCAweDRGLDB4NTgsIDB4ODcsMHgxQSwgMHgwMCwweDAwLCAweEMwLDB4MUUsIAorMHg1MiwweDAwLCAweEM3LDB4MzgsIDB4NDcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhFNCwgMHgyMywweDE0LCAweDAwLDB4MUEsIDB4NzYsMHg5OSwgMHgwMCwweDFFLCAweDgzLDB4OTYsIAorMHhGRiwweDk0LCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDNGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzMsIAorMHgyOCwweDAwLCAweDg3LDB4MUEsIDB4MDAsMHgwMCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgxNiwgMHhGRiwweEU4LCAweDIzLDB4MTQsIAorMHgwMCwweDE2LCAweDc2LDB4OTksIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4ODUsMHgxNiwgMHhGRiwweEFDLCAweDgzLDB4OTYsIAorMHhGRiwweEE0LCAweEM3LDB4MzgsIDB4NTcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweDg3LDB4MUEsIAorMHgwMCwweDAwLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NSwweDE2LCAweEZGLDB4OUMsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgxNiwgMHhGRiwweEVDLCAweDIzLDB4MTQsIAorMHgwMCwweDEyLCAweDc2LDB4OTksIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHgzRiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHg4NywweDFBLCAweDAwLDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDgzLDB4OTYsIAorMHhGRiwweEM0LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweDg3LDB4MTYsIAorMHhGRiwweEYwLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHhDNywweDM4LCAweDU3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzMsIAorMHgyOCwweDAwLCAweDA3LDB4MUMsIDB4MDAsMHgzQSwgMHhGNSwweEJCLCAweDI4LDB4MDAsIDB4MDcsMHgxQywgMHgwMCwweDM2LCAweEYwLDB4M0IsIAorMHgyOCwweDAwLCAweEY1LDB4MDIsIDB4MDAsMHgwMywgMHhFNiwweDAwLCAweDlBLDB4QTQsIDB4RjUsMHgxRiwgMHgyOCwweDAwLCAweEY3LDB4MDQsIAorMHg0MiwweDc4LCAweEY2LDB4MDYsIDB4NDIsMHg3OCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NzgsMHg5QywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMCwgMHg5QiwweDE4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEYzLDB4ODYsIDB4NDIsMHg0NCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIAorMHgxRiwweDQ4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgyNSwweDAwLCAweDAwLDB4MDcsIDB4RjUsMHgwNSwgMHg0MiwweDU4LCAweEY3LDB4MDQsIAorMHg0MiwweDUwLCAweEY2LDB4MDYsIDB4NDIsMHg1MCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEYzLDB4ODIsIAorMHgwMCwweDA2LCAweEYzLDB4ODUsIDB4NDIsMHg1NCwgMHhGNSwweDA2LCAweDM5LDB4MzQsIDB4RjUsMHgwNSwgMHg0MiwweDQ0LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHhGNiwweDg0LCAweDJELDB4MzgsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MzMsIAorMHgyOCwweDAwLCAweDA2LDB4MzQsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4RjcsMHgwNiwgMHgyQywweDI4LCAweDc2LDB4QjUsIAorMHgwMCwweDAyLCAweEYzLDB4ODIsIDB4MDAsMHgxQywgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHg5QiwweDE4LCAweEIzLDB4QjYsIAorMHg3MCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHg3OCwgMHhGMywweDg2LCAweDQyLDB4NDQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjAsMHhFNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHg5RSwweDQxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDQyLDB4NTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEVFLDB4MDAsIDB4OUQsMHg4NSwgMHgyNCwweDk0LCAweDAwLDB4MzYsIDB4RjYsMHgwNCwgMHg0MCwweDc0LCAweDI1LDB4MTQsIAorMHgwMCwweDM4LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg3NSwweEIxLCAweDAwLDB4MUUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MkIsIDB4MjgsMHgwMCwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzUsMHhBQywgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg1RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDM0LCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDMyLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDMwLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDJFLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDJDLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDJBLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHgyOCwgMHg3NiwweDMxLCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4RjMsMHg4NCwgMHg0MCwweDdDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4MjMsMHg5NCwgMHgwMCwweDIwLCAweDkzLDB4OTYsIAorMHhGRiwweDk0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhEMCwweERDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDgzLDB4OTYsIDB4RkYsMHg5NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDIzLDB4OTQsIAorMHgwMCwweDY4LCAweDkzLDB4OTYsIDB4RkYsMHg4QywgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhEMiwweDU4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4MywweDk2LCAweEZGLDB4OEMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweDkwLDB4MTMsIDB4RkYsMHhGQywgMHgyMywweDk0LCAweDAwLDB4NTAsIDB4OTMsMHg5NiwgMHhGRiwweDg0LCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENGLDB4MjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4MDIsIAorMHhGRiwweDM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAweDQyLDB4NjQsIDB4RjMsMHg4NCwgMHg0MCwweDdDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4ODMsMHg5NiwgMHhGRiwweDg0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHg4MywweDk2LCAweEZGLDB4OTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEY3LDB4QzgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDIwLDB4MjIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4OUQsMHg1RCwgMHhGMywweDgyLCAweDE3LDB4NzAsIDB4RjcsMHgwNCwgMHg0MiwweDU0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDI3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAweDQyLDB4NTQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIAorMHgwMCwweDFCLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDg2LCAweDQyLDB4NDQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MUUsMHhDMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMCwgMHg5RSwweDQwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY1LDB4MDQsIDB4NDAsMHg3QywgMHhGNCwweDg0LCAweDQwLDB4NzQsIDB4QzcsMHgyOCwgMHg1MCwweDAwLCAweEM3LDB4MjQsIAorMHg3MCwweDAwLCAweDA1LDB4QjgsIDB4MDAsMHgyNiwgMHg4NiwweEFFLCAweDAwLDB4MDAsIDB4NzcsMHgyRCwgMHgwMCwweDFFLCAweDc3LDB4MzgsIAorMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NywweEI0LCAweDAwLDB4MDgsIDB4NzAsMHgzRSwgMHhGRiwweEU4LCAweDQ3LDB4MEMsIAorMHgwMCwweDAxLCAweEQ3LDB4MDAsIDB4MEEsMHg3MCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHg0RiwweDU4LCAweEU2LDB4MDAsIAorMHg5RCwweEZELCAweEY2LDB4MDIsIDB4MDAsMHhGRiwgMHhGNywweDA0LCAweDQyLDB4NzgsIDB4RjYsMHgwNiwgMHg0MiwweDdBLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHg3OCwweDlDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEUwLDB4MDAsIDB4OUUsMHg0MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHhBRSwgMHgwMCwweDAwLCAweDc3LDB4MkQsIAorMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNSwgMHhGRiwweEYwLCAweEY3LDB4MDIsIAorMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NjQsMHgwMCwgMHhGNiwweDAyLCAweEZGLDB4MDAsIDB4QzYsMHhCNCwgMHg2NCwweDAwLCAweEM3LDB4MzgsIAorMHg2OCwweDAwLCAweEY3LDB4MkYsIDB4MjgsMHgwMCwgMHgwNywweDI4LCAweDAwLDB4MDEsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDk0LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEJFLDB4RjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweEQ4LCAweEYzLDB4ODYsIAorMHg0MiwweDQ0LCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyMCwweEU0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEEyLDB4QzksIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHg0MiwweDU0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RUUsMHgwMCwgMHhBMCwweDM1LCAweDI0LDB4OTQsIAorMHgwMCwweDM2LCAweEY2LDB4MDQsIDB4NDAsMHg3NCwgMHgyNSwweDE0LCAweDAwLDB4MzgsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDc1LDB4QjEsIAorMHgwMCwweDFFLCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc1LDB4QUMsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDVGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHgzNCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHgzMiwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHgzMCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHgyRSwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHgyQywgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHgyQSwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDI4LCAweDc2LDB4MzEsIAorMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweEYzLDB4ODQsIDB4NDAsMHg3QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDk1LDB4MTMsIAorMHhGRiwweEZDLCAweDIzLDB4OTQsIDB4MDAsMHgyMCwgMHg5MywweDk2LCAweEZGLDB4NEMsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4RDAsMHhEQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODMsMHg5NiwgMHhGRiwweDRDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgyMywweDk0LCAweDAwLDB4NTAsIDB4OTMsMHg5NiwgMHhGRiwweDQ0LCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEQyLDB4NTgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4MDIsIAorMHhGRiwweDM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAweDQyLDB4NjQsIDB4RjMsMHg4NCwgMHg0MCwweDdDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4ODMsMHg5NiwgMHhGRiwweDQ0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHg4MywweDk2LCAweEZGLDB4NEMsIDB4RTAsMHgwMCwgMHhBMiwweDgwLCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweEY0LDB4MDQsIDB4NDAsMHg3QywgMHhGNiwweDA0LCAweDQwLDB4NzQsIDB4RjMsMHg4MiwgMHgwMCwweDAwLCAweEM3LDB4MjAsIAorMHg0MCwweDAwLCAweEM3LDB4MzAsIDB4NzAsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MjYsIDB4ODYsMHhCQSwgMHgwMCwweDAwLCAweDc3LDB4MzksIAorMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzcsMHhCNCwgMHgwMCwweDA4LCAweDcwLDB4M0UsIAorMHhGRiwweEU4LCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHhENywweDAwLCAweDBBLDB4NzAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhBMCwweEFELCAweDkzLDB4OTYsIDB4RkYsMHgzQywgMHhGNywweDA0LCAweDQyLDB4QTAsIDB4RjYsMHgwNiwgMHg0MiwweEEwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHg3OCwweDlDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEUwLDB4MDAsIDB4QTIsMHhDOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4MjQsMHg5NCwgMHgwMCwweDdFLCAweDI1LDB4MTQsIAorMHgwMCwweDgwLCAweDIzLDB4OTQsIDB4MDAsMHg2OCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4NzUsMHhCMSwgMHgwMCwweDFFLCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc1LDB4QUMsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NUYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDI0LDB4OTQsIAorMHgwMCwweDdDLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDI0LDB4OTQsIAorMHgwMCwweDdBLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDI0LDB4OTQsIAorMHgwMCwweDc4LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDI0LDB4OTQsIAorMHgwMCwweDc2LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDI0LDB4OTQsIAorMHgwMCwweDc0LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDI0LDB4OTQsIAorMHgwMCwweDcyLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHgyNCwweDk0LCAweDAwLDB4NzAsIDB4NzYsMHgzMSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDk0LDB4MTMsIAorMHhGRiwweEZDLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHg5MywweDk2LCAweEZGLDB4MzQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4RDAsMHhEQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODMsMHg5NiwgMHhGRiwweDM0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgyMywweDk0LCAweDAwLDB4QjAsIDB4OTMsMHg5NiwgMHhGRiwweDJDLCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEQyLDB4NTgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDgzLDB4OTYsIAorMHhGRiwweDJDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4ODMsMHg5NiwgMHhGRiwweDNDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHgyMywweDk0LCAweDAwLDB4OTgsIDB4OTMsMHg5NiwgMHhGRiwweDI0LCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENGLDB4MjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODIsIAorMHgwMCwweDA2LCAweEYzLDB4ODUsIDB4NDIsMHg1NCwgMHg4NywweDAyLCAweEZGLDB4MzQsIDB4RjMsMHg4NiwgMHgzOCwweEE4LCAweEYzLDB4ODUsIAorMHg0MiwweDQ0LCAweEY3LDB4MDUsIDB4NDIsMHg2NCwgMHhGMywweDg0LCAweDQwLDB4N0MsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg4MywweDk2LCAweEZGLDB4MjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweDgzLDB4OTYsIDB4RkYsMHgzNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4RjcsMHhDOCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhBMiwweEE5LCAweEYzLDB4ODIsIDB4MTcsMHg3MCwgMHhGNywweDA0LCAweDQyLDB4NTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDI3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NDIsMHg1NCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4RjMsMHg4MiwgMHgwMCwweDFCLCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweEYzLDB4ODYsIDB4NDIsMHg0NCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIAorMHgxRSwweEMwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweEY2LDB4MDQsIDB4NkYsMHgzNCwgMHhGNywweDA0LCAweDQyLDB4NjQsIDB4ODYsMHhCMiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweEEzLDB4QUMsIDB4MDYsMHhCMCwgMHgwMCwweDAyLCAweDg3LDB4MzYsIAorMHgwMCwweDAwLCAweDc2LDB4QjUsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweEY2LDB4ODQsIAorMHg0MCwweDdDLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHhDMCwweDNBLCAweDZBLDB4MDAsIDB4RTYsMHgwMCwgMHhBMywweEFDLCAweEM3LDB4MzQsIAorMHg2OCwweDAwLCAweEY1LDB4ODQsIDB4NDAsMHg3NCwgMHhGNiwweDA0LCAweDRGLDB4NTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM2LDB4MkMsIAorMHg2MiwweDAwLCAweDc2LDB4MzAsIDB4RkYsMHhGQSwgMHhDNSwweEFDLCAweDcwLDB4MDAsIDB4MDUsMHhBQywgMHgwMCwweDI2LCAweDg2LDB4QUUsIAorMHgwMCwweDAwLCAweDc3LDB4MkQsIDB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4NDYsMHgzMSwgMHgwMCwweDAwLCAweEM2LDB4QjQsIAorMHg3NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHhGNywweDAyLCAweDAwLDB4RkYsIDB4QzYsMHgzMCwgMHg3NCwweDAwLCAweEY3LDB4MDIsIAorMHhGRiwweDAwLCAweEM2LDB4QjQsIDB4NzQsMHgwMCwgMHhDNiwweDMwLCAweDY4LDB4MDAsIDB4RjYsMHgyRiwgMHgyOCwweDAwLCAweEY1LDB4MDYsIAorMHg0MiwweDQ0LCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgxRiwweDQ4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDQsIDB4NDAsMHg3QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY1LDB4MDQsIDB4NDAsMHg3NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4QkUsMHhGOCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4ODAsIDB4RjcsMHgwNCwgMHg0MiwweDU4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEEzLDB4RjQsIDB4MjAsMHgzQSwgMHgwMCwweDA3LCAweEY1LDB4MDIsIAorMHgwMCwweDAxLCAweEY1LDB4MDUsIDB4NDIsMHg1OCwgMHhGNywweDA0LCAweDQyLDB4NTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDA3LCAweEVFLDB4MDAsIDB4QTYsMHhGMCwgMHgyMywweDk0LCAweDAwLDB4MUUsIDB4RjYsMHgwNCwgMHg0MiwweDYwLCAweDIzLDB4MTQsIAorMHgwMCwweDY2LCAweEY0LDB4ODQsIDB4NDAsMHg3OCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHgwNCwweEE0LCAweDAwLDB4MDIsIDB4NzQsMHgyNSwgMHgwMCwweDFFLCAweDc0LDB4MjAsIAorMHhGRiwweEU1LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg3NSwweDMxLCAweDAwLDB4MUUsIDB4NzUsMHgyOCwgMHhGRiwweEU1LCAweDk1LDB4MTYsIAorMHhGRiwweDdDLCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4MjUsMHgxNCwgMHgwMCwweDIwLCAweDk1LDB4MTYsIAorMHhGRiwweDk0LCAweEY3LDB4MkIsIDB4MjgsMHgwMCwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4ODUsMHgxNiwgMHhGRiwweDdDLCAweDA1LDB4QTQsIAorMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NTcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgxRiwgMHgyOCwweDAwLCAweDIzLDB4OTQsIAorMHgwMCwweDFDLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweDI1LDB4MTQsIDB4MDAsMHg1MCwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUYsIAorMHgyOCwweDAwLCAweDIzLDB4OTQsIDB4MDAsMHgxQSwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUYsIAorMHgyOCwweDAwLCAweDIzLDB4OTQsIDB4MDAsMHgxOCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUYsIAorMHgyOCwweDAwLCAweDIzLDB4OTQsIDB4MDAsMHgxNiwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUYsIAorMHgyOCwweDAwLCAweDIzLDB4OTQsIDB4MDAsMHgxNCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUYsIAorMHgyOCwweDAwLCAweDIzLDB4OTQsIDB4MDAsMHgxMiwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUYsIAorMHgyOCwweDAwLCAweDIzLDB4OTQsIDB4MDAsMHgxMCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QUQsIAorMHgwMCwweDFFLCAweDc2LDB4MzEsIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MUYsIDB4MjgsMHgwMCwgMHg4NywweDI2LCAweDAwLDB4MDAsIDB4MjYsMHgxNCwgMHgwMCwweDY4LCAweEM3LDB4MzgsIAorMHg0NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgxQiwgMHgyOCwweDAwLCAweDIzLDB4MTQsIAorMHgwMCwweDY0LCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4NzYsMHhBRCwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgxQiwgMHgyOCwweDAwLCAweDIzLDB4MTQsIAorMHgwMCwweDYyLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4NzYsMHhBRCwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgxQiwgMHgyOCwweDAwLCAweDIzLDB4MTQsIAorMHgwMCwweDYwLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4NzYsMHhBRCwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgxQiwgMHgyOCwweDAwLCAweDIzLDB4MTQsIAorMHgwMCwweDVFLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4NzYsMHhBRCwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgxQiwgMHgyOCwweDAwLCAweDIzLDB4MTQsIAorMHgwMCwweDVDLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4NzYsMHhBRCwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgxQiwgMHgyOCwweDAwLCAweDIzLDB4MTQsIAorMHgwMCwweDVBLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4NzYsMHhBRCwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgxQiwgMHgyOCwweDAwLCAweDA1LDB4QUMsIAorMHgwMCwweDAyLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHgyMywweDE0LCAweDAwLDB4NTgsIDB4NzUsMHhBRCwgMHgwMCwweDFFLCAweDc1LDB4QUMsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NUYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgxQiwgMHgyOCwweDAwLCAweDk2LDB4MTMsIAorMHhGRiwweEZDLCAweDk1LDB4MTYsIDB4RkYsMHg4QywgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhEMiwweDU4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NSwweDE2LCAweEZGLDB4OEMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4MTMsIAorMHhGRiwweEZDLCAweEY1LDB4MDQsIDB4NDIsMHg1OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDI1LDB4MTQsIAorMHgwMCwweDM4LCAweDk1LDB4MTYsIDB4RkYsMHg4NCwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhDRiwweDI0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDA0LCAweDQyLDB4NTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4MTMsIAorMHhGRiwweEZDLCAweEY1LDB4MDQsIDB4NDIsMHg2NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDg1LDB4MTYsIAorMHhGRiwweDg0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4ODUsMHgxNiwgMHhGRiwweDk0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhGNywweEM4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEE2LDB4RjEsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHg0MiwweDU4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg0MiwweDU4LCAweEY3LDB4MDQsIAorMHg0MiwweDU4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDcsIDB4RUUsMHgwMCwgMHhBNywweDMwLCAweEY1LDB4MDIsIAorMHgxNywweDcwLCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGNSwweDAyLCAweDAwLDB4MUMsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDAsIAorMHhBNywweDUwLCAweEI1LDB4M0EsIDB4NjgsMHgwMiwgMHhFMCwweDAwLCAweEE3LDB4NTAsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweDk1LDB4MTMsIAorMHhGRiwweEZDLCAweEY1LDB4MDIsIDB4MDAsMHgxQiwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4RjUsMHgwNiwgMHg0MiwweDQ0LCAweDk1LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDFFLDB4QzAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDMwLCAweEY2LDB4MDQsIAorMHg2RiwweDM0LCAweEY3LDB4MDQsIDB4NDIsMHg2NCwgMHg4NiwweEIyLCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4QTksMHhGMCwgMHgwNywweDMwLCAweDAwLDB4MDIsIDB4ODYsMHgzQSwgMHgwMCwweDAwLCAweEY1LDB4ODIsIAorMHgwMCwweDAwLCAweEY2LDB4ODQsIDB4NDAsMHg3QywgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4MzAsIAorMHg3NywweEMwLCAweEY3LDB4MDQsIDB4NDAsMHg3NCwgMHhDNiwweEI0LCAweDY4LDB4MDAsIDB4NzYsMHgzMSwgMHhGRiwweEYwLCAweEM2LDB4MDAsIAorMHg2MiwweDAwLCAweDk2LDB4MTYsIDB4RkYsMHhGNCwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDI2LCAweDg2LDB4QkEsIAorMHgwMCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc3LDB4QjQsIAorMHgwMCwweDA4LCAweDcwLDB4M0UsIDB4RkYsMHhFOCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4RDcsMHgwMCwgMHgwQSwweDcwLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QTgsMHgzNCwgMHhGNiwweDAyLCAweDAwLDB4RkYsIDB4ODMsMHgxNiwgMHhGRiwweEY0LCAweDgzLDB4OTYsIAorMHhGRiwweEY0LCAweEY3LDB4MDQsIDB4NDAsMHg3OCwgMHhDNiwweDk4LCAweDM4LDB4MDAsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDA3LDB4MzgsIAorMHgwMCwweDI2LCAweDg2LDB4QkEsIDB4MDAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIAorMHg3NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHhDNiwweEI0LCAweDY0LDB4MDAsIDB4QzAsMHgzNiwgMHg1QSwweDAwLCAweDQ3LDB4MEMsIAorMHgwMCwweDAxLCAweEQ3LDB4MDAsIDB4MEEsMHg3MCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhBOCwweDNELCAweDIwLDB4MkUsIAorMHgwMCwweDAwLCAweEY1LDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhBOCwweDc1LCAweEY2LDB4MDYsIAorMHg0MiwweDdDLCAweEY3LDB4MDQsIDB4NDIsMHg3QywgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NzgsMHg5QywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMCwgMHhBOSwweEYwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEYzLDB4MDQsIDB4NDIsMHg2MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4Q0MsMHg2MCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjQsMHgwNCwgMHg0MCwweDc4LCAweEY3LDB4MDQsIAorMHg0RiwweDU4LCAweEY1LDB4MDQsIDB4NDAsMHg3NCwgMHhGMywweDg0LCAweDQwLDB4N0MsIDB4RjMsMHgwNCwgMHg0MCwweDdDLCAweEM2LDB4MjAsIAorMHg3MiwweDAwLCAweDc2LDB4MzAsIDB4RkYsMHhGQSwgMHhDNSwweDlDLCAweDMwLDB4MDAsIDB4QzUsMHhBOCwgMHg1OCwweDAwLCAweDA1LDB4QUMsIAorMHgwMCwweDI2LCAweDg2LDB4QUUsIDB4MDAsMHgwMCwgMHg3NCwweEFELCAweDAwLDB4MUUsIDB4NzQsMHhBNCwgMHhGRiwweEU1LCAweDczLDB4QUQsIAorMHgwMCwweDFFLCAweDczLDB4OUMsIDB4RkYsMHhFNSwgMHg5MywweDk2LCAweEZGLDB4RDQsIDB4QzUsMHgyOCwgMHg3MiwweDAwLCAweDc1LDB4MjgsIAorMHhGRiwweEZBLCAweDgzLDB4MTYsIDB4RkYsMHhGNCwgMHg4MywweDk2LCAweEZGLDB4RjQsIDB4NDYsMHgzMSwgMHgwMCwweDAwLCAweDQ1LDB4MjksIAorMHgwMCwweDAwLCAweEM3LDB4MTgsIDB4MzgsMHgwMCwgMHhDNCwweDIwLCAweDcwLDB4MDAsIDB4MDQsMHgyMCwgMHgwMCwweDI2LCAweDczLDB4MjEsIAorMHgwMCwweDFFLCAweEM2LDB4QjQsIDB4NEYsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4RjQsMHg4MiwgMHgwMCwweEZGLCAweEM2LDB4MzAsIAorMHg0QywweDAwLCAweEYzLDB4ODIsIDB4RkYsMHgwMCwgMHhDNiwweEI0LCAweDNDLDB4MDAsIDB4QzYsMHgzMCwgMHg2OCwweDAwLCAweEY2LDB4MkYsIAorMHgyOCwweDAwLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3MywweDE4LCAweEZGLDB4RTUsIDB4OTMsMHgxNiwgMHhGRiwweENDLCAweDgzLDB4MTYsIAorMHhGRiwweEQ0LCAweDgzLDB4OTYsIDB4RkYsMHhGNCwgMHhDNSwweDI4LCAweDRDLDB4MDAsIDB4QzcsMHgzOCwgMHgzNywweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweDc2LDB4OUQsIDB4MDAsMHgxMCwgMHg3NiwweEI1LCAweEZGLDB4RjgsIDB4QzcsMHgzOCwgMHg0QywweDAwLCAweEM2LDB4QjQsIAorMHg3MCwweDAwLCAweEY2LDB4QUYsIDB4MjgsMHgwMCwgMHg4NywweDIyLCAweDAwLDB4MDAsIDB4NzYsMHhBMSwgMHgwMCwweDFFLCAweDgzLDB4MTYsIAorMHhGRiwweENDLCAweEYzLDB4ODIsIDB4RkYsMHgwMCwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHgzNywweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweEM3LDB4MzgsIDB4M0MsMHgwMCwgMHhDNSwweDI4LCAweDcwLDB4MDAsIDB4RjUsMHgyMywgMHgyOCwweDAwLCAweDg3LDB4MjIsIAorMHgwMCwweDAwLCAweEYzLDB4MDQsIDB4NDAsMHg3QywgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDczLDB4MTksIAorMHgwMCwweDEwLCAweDkzLDB4MTYsIDB4RkYsMHhFQywgMHg3MywweDk5LCAweEZGLDB4RjgsIDB4QzcsMHgzOCwgMHg0QywweDAwLCAweEM3LDB4MUMsIAorMHg3MCwweDAwLCAweDk3LDB4MTYsIDB4RkYsMHhEQywgMHgyMywweDE0LCAweDAwLDB4MjIsIDB4ODMsMHgxQSwgMHgwMCwweDAwLCAweDc3LDB4OTksIAorMHgwMCwweDFFLCAweDc3LDB4QkMsIDB4RkYsMHhFNSwgMHhDMywweDE4LCAweDdGLDB4QzAsIDB4NzMsMHgxOSwgMHhGRiwweEYwLCAweEYzLDB4MjMsIAorMHgyOCwweDAwLCAweEYzLDB4ODYsIDB4NDIsMHg0NCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIAorMHgxRiwweDQ4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA0LCAweDQwLDB4N0MsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGMywweDA0LCAweDQwLDB4NzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEJFLDB4RjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDk4LCAweEYzLDB4MDYsIAorMHg0MiwweDQ0LCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyMCwweEU0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEFFLDB4RTUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHg0MiwweDU0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RUUsMHgwMCwgMHhBRCwweDg5LCAweDI3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NDIsMHg1NCwgMHgyMywweDk0LCAweDAwLDB4MUUsIDB4RjYsMHgwNCwgMHg0MiwweDYwLCAweDI0LDB4OTQsIAorMHgwMCwweDY2LCAweDk0LDB4OTYsIDB4RkYsMHg2NCwgMHhGMywweDA0LCAweDQwLDB4NzgsIDB4MjQsMHg5NCwgMHgwMCwweDIwLCAweDk0LDB4OTYsIAorMHhGRiwweDk0LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweDAzLDB4MTgsIDB4MDAsMHgwMiwgMHg5MywweDE2LCAweEZGLDB4NzQsIDB4NzQsMHgxOSwgMHgwMCwweDFFLCAweDc0LDB4MjAsIAorMHhGRiwweEU1LCAweDA1LDB4OTgsIDB4MDAsMHgwMiwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4NzUsMHgzMSwgMHgwMCwweDFFLCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc1LDB4MjgsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NTcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgxRiwgMHgyOCwweDAwLCAweDIzLDB4OTQsIAorMHgwMCwweDFDLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweDg1LDB4MTYsIDB4RkYsMHg2NCwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUYsIAorMHgyOCwweDAwLCAweDIzLDB4OTQsIDB4MDAsMHgxQSwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUYsIAorMHgyOCwweDAwLCAweDIzLDB4OTQsIDB4MDAsMHgxOCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUYsIAorMHgyOCwweDAwLCAweDIzLDB4OTQsIDB4MDAsMHgxNiwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUYsIAorMHgyOCwweDAwLCAweDIzLDB4OTQsIDB4MDAsMHgxNCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUYsIAorMHgyOCwweDAwLCAweDIzLDB4OTQsIDB4MDAsMHgxMiwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUYsIAorMHgyOCwweDAwLCAweDIzLDB4OTQsIDB4MDAsMHgxMCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QUQsIAorMHgwMCwweDFFLCAweDc2LDB4MzEsIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MUYsIDB4MjgsMHgwMCwgMHg4NywweDFBLCAweDAwLDB4MDAsIDB4MjYsMHgxNCwgMHgwMCwweDY4LCAweEM3LDB4MzgsIAorMHg0NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDIzLDB4MTQsIAorMHgwMCwweDY0LCAweDkzLDB4MTYsIDB4RkYsMHg2NCwgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QUQsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUIsIAorMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHg2MiwgMHg5NCwweDk2LCAweEZGLDB4NjQsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDg3LDB4MkUsIAorMHgwMCwweDAwLCAweDc2LDB4QUQsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHgyNSwweDE0LCAweDAwLDB4NjAsIDB4OTUsMHgxNiwgMHhGRiwweDY0LCAweDA1LDB4QUMsIAorMHgwMCwweDAyLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3NiwweEFELCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MjMsMHgxNCwgMHgwMCwweDVFLCAweDkzLDB4MTYsIAorMHhGRiwweDY0LCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4NzYsMHhBRCwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgxQiwgMHgyOCwweDAwLCAweDI0LDB4OTQsIAorMHgwMCwweDVDLCAweDk0LDB4OTYsIDB4RkYsMHg2NCwgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QUQsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHg1QSwgMHg5NSwweDE2LCAweEZGLDB4NjQsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDg3LDB4MkUsIAorMHgwMCwweDAwLCAweDc2LDB4QUQsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4MjQsMHg5NCwgMHgwMCwweDUwLCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MjMsMHgxNCwgMHgwMCwweDU4LCAweDA1LDB4QUMsIAorMHgwMCwweDAyLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg5MywweDE2LCAweEZGLDB4NjQsIDB4NzUsMHhBRCwgMHgwMCwweDFFLCAweDc1LDB4QUMsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NUYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgxQiwgMHgyOCwweDAwLCAweDk2LDB4MTMsIAorMHhGRiwweEZDLCAweDk0LDB4OTYsIDB4RkYsMHg4QywgMHg5NCwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhEMiwweDU4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NSwweDE2LCAweEZGLDB4OEMsIDB4MjMsMHgxNCwgMHgwMCwweDM4LCAweDk1LDB4MTMsIAorMHhGRiwweEZDLCAweDI3LDB4ODAsIDB4MDAsMHgwNywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4OTMsMHgxNiwgMHhGRiwweDg0LCAweDkzLDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENGLDB4MjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDI3LDB4ODAsIAorMHgwMCwweDA3LCAweEY3LDB4ODUsIDB4NDIsMHg1OCwgMHgyNywweDgwLCAweDAwLDB4MDcsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY0LDB4ODQsIAorMHg0MiwweDY0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NCwweDkzLCAweEZGLDB4RkMsIDB4ODUsMHgxNiwgMHhGRiwweDg0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHg4MywweDE2LCAweEZGLDB4OTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEY3LDB4QzgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDIwLDB4MjIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QUQsMHg1RCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg0MiwweDU4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAweDQyLDB4NTgsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEY0LDB4ODIsIAorMHgwMCwweDFDLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAweEFFLDB4RTQsIDB4QjQsMHhCQSwgMHg2OCwweDAyLCAweEUwLDB4MDAsIAorMHhBRSwweEU0LCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNywweDA0LCAweDQwLDB4NzgsIDB4RjUsMHg4NCwgMHg0RiwweDU4LCAweDA3LDB4MzgsIAorMHgwMCwweDE2LCAweDg2LDB4QkEsIDB4MDAsMHgwMCwgMHhGNCwweDA2LCAweDNCLDB4OTAsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIAorMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI0LCAweEZGLDB4RjAsIDB4NzYsMHgzNSwgMHgwMCwweDA2LCAweEE3LDB4MkUsIAorMHg2MCwweDAyLCAweEM1LDB4MkMsIDB4NjAsMHgwMCwgMHg3NiwweEE5LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHg3NywweDM5LCAweDAwLDB4MDMsIDB4QzcsMHgzOCwgMHg0MCwweDAwLCAweDA3LDB4MzgsIAorMHgwMCwweDAyLCAweDg2LDB4QkEsIDB4MDAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIAorMHg3NywweEMwLCAweDczLDB4QjcsIDB4RkYsMHhGMCwgMHhFRSwweDAwLCAweEFFLDB4NTUsIDB4OTUsMHgxNiwgMHhGRiwweDY0LCAweEE3LDB4MkUsIAorMHg2MCwweDAyLCAweDc2LDB4QTksIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweDc3LDB4MzksIDB4MDAsMHgwMywgMHhDNywweDM4LCAweDQwLDB4MDAsIDB4ODYsMHhCQSwgMHgwMCwweDA0LCAweDIzLDB4MTQsIAorMHgwMCwweDg4LCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjUsIAorMHhGRiwweEYwLCAweEE2LDB4QUEsIDB4NjgsMHgwMiwgMHg3NywweDFELCAweDAwLDB4MDMsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDI3LDB4MzgsIAorMHgwMCwweDA4LCAweDg1LDB4M0EsIDB4MDAsMHgwNCwgMHg4NCwweEJBLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4MUEsIAorMHgwMCwweDA0LCAweDk0LDB4OUEsIDB4MDAsMHgwMCwgMHg4NSwweDk2LCAweEZGLDB4N0MsIDB4RTAsMHgwMCwgMHhBRSwweDc4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg0LDB4OTYsIDB4RkYsMHg2NCwgMHhBNywweDJFLCAweDYwLDB4MDIsIDB4NzYsMHhBNSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4NzcsMHgzOSwgMHgwMCwweDAzLCAweEM3LDB4MzgsIAorMHg0MCwweDAwLCAweDg1LDB4QkEsIDB4MDAsMHgwNCwgMHg4NSwweDE2LCAweEZGLDB4NjQsIDB4RjYsMHgwNiwgMHgzQiwweDkwLCAweDg3LDB4MkEsIAorMHgwMCwweDAwLCAweDc2LDB4QTksIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweDc3LDB4MzksIDB4MDAsMHgwMywgMHhBNiwweEJBLCAweDYwLDB4MDIsIDB4MjAsMHgxRSwgMHgwMCwweDAwLCAweEM3LDB4MzgsIAorMHg2MCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweEVFLDB4MDAsIAorMHhBRSwweEM5LCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHg4MywweDE2LCAweEZGLDB4NzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc3LDB4MTksIAorMHhGRiwweEYwLCAweEM2LDB4QjgsIDB4NjgsMHgwMCwgMHg4NCwweDk2LCAweEZGLDB4NjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MjQsIAorMHg2OCwweDAwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4QzEsMHgyQywgMHgwMCwweDAwLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIAorMHgwMCwweDEwLCAweEY3LDB4MDQsIDB4NDAsMHg4NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhBRiwweDNDLCAweEY2LDB4MDYsIDB4NDIsMHhCOCwgMHhGNywweDA0LCAweDQyLDB4QjgsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEYzLDB4MDYsIDB4MzYsMHg3OCwgMHhGMywweDA1LCAweDQyLDB4NDQsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4RjcsMHgwNCwgMHg0RiwweDVDLCAweEYzLDB4ODQsIAorMHg0MiwweDVDLCAweDgzLDB4M0EsIDB4MDAsMHgwNCwgMHhDNCwweDM4LCAweDAwLDB4MDAsIDB4OTMsMHgxNiwgMHhGRiwweEVDLCAweDc3LDB4MUQsIAorMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4MzgsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4MDQsMHhCOCwgMHgwMCwweDBDLCAweDgzLDB4MTYsIAorMHhGRiwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDFFLCAweDMyLDB4MDAsIDB4RUMsMHgwMCwgMHhCMCwweDcwLCAweEM1LDB4MDQsIAorMHgwMCwweDAwLCAweEE2LDB4QTIsIDB4NDgsMHgwMiwgMHhGNywweDA0LCAweEUwLDB4MDAsIDB4RjUsMHg4MiwgMHgwMCwweDAwLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4QUYsMHhBOCwgMHhDNiwweDIwLCAweDQ4LDB4MDAsIDB4ODYsMHhCMiwgMHgwMCwweDA0LCAweEY3LDB4MDQsIAorMHhFMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHhBRiwweEFDLCAweDIwLDB4MkUsIAorMHgwMCwweDAwLCAweEY1LDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhBRiwweEI5LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY1LDB4MDIsIDB4MDAsMHgwMCwgMHg4NiwweEIyLCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHhFMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAwLCAweEFGLDB4RjQsIDB4RjUsMHg4MiwgMHgwMCwweDAwLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4QUYsMHhGQywgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4ODYsMHhCMiwgMHgwMCwweDA0LCAweEY3LDB4MDQsIAorMHhFMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHhBRiwweEZELCAweDIwLDB4MkUsIAorMHgwMCwweDAwLCAweEY1LDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhCMCwweDBELCAweDIwLDB4MkEsIAorMHgwMCwweDAwLCAweEY1LDB4MDIsIDB4MDAsMHgwMSwgMHgyMCwweDJBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhCMCwweDU5LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4N0EsMHhEMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhCMCwweDY0LCAweEM3LDB4MjAsIDB4NDgsMHgwMCwgMHg4NywweDNBLCAweDAwLDB4MDgsIDB4RjYsMHgwNiwgMHg0MCwweDk4LCAweDc3LDB4MzksIAorMHgwMCwweDAyLCAweEE2LDB4QkEsIDB4NjAsMHgwMiwgMHhDNywweDM4LCAweDYwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIAorMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhCMCwweDY0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNCwweEE0LCAweDAwLDB4MEMsIDB4RTAsMHgwMCwgMHhBRiwweDYwLCAweDAzLDB4OUMsIAorMHgwMCwweDAxLCAweDgzLDB4MTYsIDB4RkYsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgxRSwgMHgzMiwweDAwLCAweEVDLDB4MDAsIAorMHhCMSwweDA0LCAweEYzLDB4MDYsIDB4MzYsMHg3OCwgMHhGNiwweDg0LCAweDRGLDB4NUMsIDB4NzcsMHgxRCwgMHgwMCwweDAxLCAweEM3LDB4MzgsIAorMHgzOCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHgwNywweDM4LCAweDAwLDB4MEMsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweDg3LDB4MzYsIAorMHgwMCwweDA4LCAweEY2LDB4ODQsIDB4NEYsMHg1OCwgMHg3NywweDM5LCAweDAwLDB4MDYsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweDk2LDB4OTMsIAorMHhGRiwweEZDLCAweDkzLDB4OTYsIDB4RkYsMHhGNCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhGQSwweDk4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhGNiwweDg0LCAweDQyLDB4NkMsIDB4ODMsMHg5NiwgMHhGRiwweEY0LCAweDQ3LDB4MEMsIAorMHgwMCwweDAxLCAweEQ3LDB4MDAsIDB4MEEsMHg3MCwgMHhDNywweDFDLCAweDcwLDB4MDAsIDB4RjcsMHgwNSwgMHg0MiwweDVDLCAweDA2LDB4QjQsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHhGNiwweDg1LCAweDQyLDB4NkMsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjMsMHgwMiwgMHgwMCwweDFDLCAweDIwLDB4MzIsIAorMHgwMCwweDQ0LCAweEU2LDB4MDAsIDB4QjEsMHgwOCwgMHhCMywweDNBLCAweDY4LDB4MDIsIDB4RTAsMHgwMCwgMHhCMSwweDA4LCAweEYwLDB4MDUsIAorMHgyRCwweDM4LCAweEYzLDB4MDUsIDB4NDIsMHg0NCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweEY0LDB4MDIsIDB4MDAsMHgwMCwgMHhDNSwweEEwLCAweDAwLDB4MDAsIDB4RjYsMHg4MiwgMHgwNywweDcwLCAweEY3LDB4MDQsIAorMHg2RSwweDUwLCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEIxLDB4NkQsIDB4MDYsMHgzOCwgMHgwMCwweDFDLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNCwweDIwLCAweDcwLDB4MDAsIDB4QzAsMHgyMiwgMHg3MiwweDAwLCAweEU0LDB4MDAsIAorMHhCMSwweDVELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNSwweEFDLCAweDAwLDB4MDEsIDB4MjYsMHhCNCwgMHgwMCwweDAxLCAweDIwLDB4MzYsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QjEsMHg0MCwgMHgwNiwweDMwLCAweDAwLDB4MDQsIDB4QzQsMHgyMCwgMHg1OCwweDAwLCAweEMwLDB4MjIsIAorMHg1QSwweDAwLCAweEU0LDB4MDAsIDB4QjEsMHg4MSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDQsMHgyMCwgMHgwMCwweDAxLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHg3OCwweEQ4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhCMSwweDFDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDQsIDB4NDAsMHg5NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgyMiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHhCMSwweEVELCAweEY0LDB4MDUsIDB4NDAsMHg5MCwgMHhGNywweDA0LCAweDZFLDB4NTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg2LDB4QkEsIAorMHgxRCwweERDLCAweEY1LDB4ODIsIDB4MDAsMHgwMSwgMHgwNiwweEI0LCAweDAwLDB4MDEsIDB4OTYsMHhCQSwgMHgxRCwweERDLCAweDg3LDB4M0EsIAorMHgxRCwweERDLCAweEUwLDB4MDAsIDB4QjEsMHhGMCwgMHhGNSwweDg1LCAweDdBLDB4RDAsIDB4RjAsMHgwNSwgMHg3QSwweEQwLCAweEY1LDB4ODQsIAorMHg0MCwweDkwLCAweEYwLDB4MDUsIDB4NDAsMHg4NCwgMHhGNSwweDg1LCAweDQwLDB4OTQsIDB4RjUsMHg4NiwgMHhFMCwweDAwLCAweDk1LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEQ1LDB4QTAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDQsIAorMHg2RSwweDUwLCAweEY0LDB4MDUsIDB4NDAsMHg4NCwgMHg4NSwweEJBLCAweDFELDB4REMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY1LDB4ODUsIAorMHgzQiwweDY0LCAweEY1LDB4ODQsIDB4RTAsMHgwMCwgMHhGMCwweDA1LCAweDQyLDB4NUMsIDB4OTUsMHhCQSwgMHgwMCwweDEwLCAweEY1LDB4ODQsIAorMHhFMCwweDA0LCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHg5NSwweEJBLCAweDAwLDB4MTQsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweEY1LDB4ODYsIAorMHgzQSwweDRDLCAweEY1LDB4ODUsIDB4NDIsMHg0NCwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIAorMHgwMCwweDAyLCAweEY1LDB4ODIsIDB4MDAsMHgxQywgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMCwgMHhCMiwweDY4LCAweEI1LDB4QkEsIAorMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGNSwweDg2LCAweDM1LDB4RUMsIDB4RjUsMHg4NSwgMHg0MiwweDMwLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDgsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweEM4LCAweEYzLDB4MDIsIAorMHgwMCwweDAwLCAweDkzLDB4MTYsIDB4RkYsMHg5NCwgMHgyNCwweDgwLCAweDAwLDB4MDgsIDB4OTQsMHg5NiwgMHhGRiwweDg0LCAweDIzLDB4ODAsIAorMHgwMCwweDA3LCAweDgzLDB4MTYsIDB4RkYsMHg5NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHgxNiwgMHhGRiwweDU0LCAweDIwLDB4MUUsIAorMHgwMCwweDA3LCAweEVFLDB4MDAsIDB4QjUsMHg2NCwgMHhDNywweDFDLCAweDM4LDB4MDAsIDB4ODQsMHg5NiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEM3LDB4MjQsIDB4NzAsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MjYsIDB4ODYsMHhCQSwgMHgwMCwweDAwLCAweEY1LDB4ODQsIAorMHg0RiwweDU4LCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjUsIAorMHhGRiwweEYwLCAweEY3LDB4MDIsIDB4MDAsMHhGRiwgMHhDNiwweEI2LCAweDc0LDB4MDAsIDB4RTYsMHgwMCwgMHhCMywweDJELCAweDIwLDB4MzYsIAorMHgwMCwweDAxLCAweEU2LDB4MDAsIDB4QjMsMHgyRCwgMHg3NywweDM1LCAweDAwLDB4MDYsIDB4QTYsMHhCQSwgMHg1OCwweDAyLCAweEM3LDB4MzgsIAorMHg1OCwweDAwLCAweDc2LDB4MzksIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg2NywweEMwLCAweDc2LDB4QjUsIAorMHhGRiwweEYwLCAweDIwLDB4MzYsIDB4MDAsMHgwMiwgMHhFNiwweDAwLCAweEIzLDB4MzEsIDB4QzYsMHhCOCwgMHgwMCwweDAwLCAweEM3LDB4MkMsIAorMHgwMCwweDAwLCAweEUwLDB4MDAsIDB4QjMsMHgzMCwgMHhDNiwweEI4LCAweDAwLDB4MDAsIDB4RjYsMHg4NCwgMHg0RiwweDU4LCAweEY3LDB4MDQsIAorMHg0RiwweDU4LCAweEM1LDB4MzQsIDB4MDAsMHgwMCwgMHhDMCwweDJBLCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHhCNSwweDVELCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY2LDB4ODQsIDB4M0IsMHhCQywgMHhGMywweDAyLCAweDAwLDB4MDAsIDB4OTMsMHgxNiwgMHhGRiwweDNDLCAweDA0LDB4MjgsIAorMHgwMCwweDFDLCAweEY3LDB4MDQsIDB4M0IsMHhCOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEVDLDB4MDAsIAorMHhCNCwweDQwLCAweDk2LDB4OTYsIDB4RkYsMHhBQywgMHg3NywweDM1LCAweDAwLDB4MDEsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDc3LDB4MzksIAorMHgwMCwweDAyLCAweEY0LDB4ODYsIDB4M0IsMHhCNCwgMHhDNiwweDM4LCAweDQ4LDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDBDLCAweEMzLDB4MDQsIAorMHgwMCwweDAwLCAweDkzLDB4MTYsIDB4RkYsMHgzNCwgMHg4NiwweEIyLCAweDAwLDB4MDAsIDB4ODcsMHgyQSwgMHgwMCwweDFDLCAweDg1LDB4OTYsIAorMHhGRiwweDNDLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweEIzLDB4QzAsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweDg2LDB4QjIsIAorMHgwMCwweDA0LCAweDg3LDB4MkEsIDB4MDAsMHgyMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHhCMywweEMwLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhGNSwweDgyLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhCMywweEQxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNCwweDgyLCAweDAwLDB4MDAsIDB4OTQsMHg5NiwgMHhGRiwweDM0LCAweDg2LDB4QjIsIAorMHgwMCwweDAwLCAweDg3LDB4MjIsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEUyLDB4MDAsIAorMHhCNCwweDBDLCAweEY1LDB4ODIsIDB4MDAsMHgwMCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHhCNCwweDE0LCAweDIwLDB4MkUsIAorMHgwMCwweDAwLCAweDg2LDB4QjIsIDB4MDAsMHgwNCwgMHg4NywweDIyLCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEUyLDB4MDAsIDB4QjQsMHgxNSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RjUsMHg4MiwgMHgwMCwweDAxLCAweDIwLDB4MkUsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QjQsMHgyNSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjMsMHgwMiwgMHgwMCwweDAxLCAweDkzLDB4MTYsIAorMHhGRiwweDM0LCAweDg0LDB4OTYsIDB4RkYsMHgzNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgyNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhCNCwweDQwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGMywweDAyLCAweDAwLDB4MDEsIDB4OTMsMHgxNiwgMHhGRiwweDNDLCAweDg0LDB4OTYsIAorMHhGRiwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDI2LCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhCNCwweDgxLCAweEY2LDB4MDIsIAorMHgwMCwweDAxLCAweDg3LDB4MTYsIDB4RkYsMHhBQywgMHhGMywweDA2LCAweDNCLDB4QjQsIDB4NzYsMHhCOSwgMHgwMCwweDAxLCAweEM2LDB4QjQsIAorMHg3MCwweDAwLCAweDc2LDB4QjUsIDB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDMwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDE0LCAweDg2LDB4QjYsIAorMHgwMCwweDAwLCAweDk3LDB4MTYsIDB4RkYsMHhCMCwgMHhFMCwweDAwLCAweEI0LDB4RjQsIDB4OTYsMHg5NiwgMHhGRiwweEI0LCAweDI3LDB4MTQsIAorMHgwMCwweDU0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg5NCwweDEzLCAweEZGLDB4RkMsIDB4RjQsMHg4NiwgMHgzQiwweEI0LCAweDk0LDB4OTMsIAorMHhGRiwweEZDLCAweDkzLDB4OTYsIDB4RkYsMHg0QywgMHg5NSwweDE2LCAweEZGLDB4NDQsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIAorMHgyNSwweDY4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4MywweDk2LCAweEZGLDB4NEMsIDB4ODUsMHgxNiwgMHhGRiwweDQ0LCAweDIwLDB4MjIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QjQsMHhGMSwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4ODcsMHgxNiwgMHhGRiwweEFDLCAweEYzLDB4MDYsIAorMHgzQiwweEI0LCAweDc2LDB4QjksIDB4MDAsMHgwMSwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4NzYsMHhCNSwgMHgwMCwweDAyLCAweEM2LDB4QjQsIAorMHgzMCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgxNCwgMHg4NiwweEI2LCAweDAwLDB4MDAsIDB4OTcsMHgxNiwgMHhGRiwweEIwLCAweDk2LDB4OTYsIAorMHhGRiwweEI0LCAweEY3LDB4MDUsIDB4M0IsMHhCQywgMHhFMCwweDAwLCAweEI0LDB4RjgsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEY2LDB4MDIsIAorMHgwMCwweDAwLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEI1LDB4MkQsIDB4MjcsMHgxNCwgMHgwMCwweDA4LCAweDg0LDB4OTYsIAorMHhGRiwweDU0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDI0LCAweDcwLDB4MDAsIDB4ODMsMHgxNiwgMHhGRiwweEI0LCAweDA0LDB4QTQsIAorMHgwMCwweDA0LCAweDk0LDB4OTYsIDB4RkYsMHg1NCwgMHg4NCwweDk2LCAweEZGLDB4OTQsIDB4OTMsMHgzQSwgMHhGRiwweEMwLCAweDA0LDB4QTQsIAorMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4QjUsMHg1NCwgMHg5NCwweDk2LCAweEZGLDB4OTQsIDB4ODMsMHgxNiwgMHhGRiwweDU0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEM3LDB4MTgsIDB4NzAsMHgwMCwgMHhGNCwweDg0LCAweDRGLDB4NTgsIDB4MDMsMHgxOCwgMHgwMCwweDA0LCAweDkzLDB4MTYsIAorMHhGRiwweDU0LCAweDgzLDB4MTYsIDB4RkYsMHg5NCwgMHg5NCwweEJBLCAweEZGLDB4QzAsIDB4MDMsMHgxOCwgMHgwMCwweDAxLCAweDkzLDB4MTYsIAorMHhGRiwweDk0LCAweDk1LDB4MTYsIDB4RkYsMHgzQywgMHg5MywweDk2LCAweEZGLDB4OEMsIDB4RTAsMHgwMCwgMHhCMiwweEIwLCAweDAzLDB4OUMsIAorMHgwMCwweDAxLCAweDg0LDB4OTYsIDB4RkYsMHg5NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgyNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhCNSwweDg0LCAweEYzLDB4ODIsIDB4MDAsMHgwMSwgMHhGNCwweDA0LCAweDRGLDB4NTgsIDB4RTAsMHgwMCwgMHhCRSwweEU0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDgzLDB4MTYsIDB4RkYsMHhCOCwgMHg4NCwweDk2LCAweEZGLDB4OTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MUUsIAorMHg0QSwweDAwLCAweEVDLDB4MDAsIDB4QjUsMHhDQywgMHg5MywweDE2LCAweEZGLDB4N0MsIDB4MjYsMHg5NCwgMHgwMCwweDA0LCAweDg3LDB4MzYsIAorMHhGRiwweEMwLCAweDgzLDB4MTYsIDB4RkYsMHg3QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHgzMiwweDAwLCAweEU2LDB4MDAsIAorMHhCQiwweDk4LCAweDAzLDB4OUMsIDB4MDAsMHgwMSwgMHg4NCwweDk2LCAweEZGLDB4OTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MUUsIAorMHg0QSwweDAwLCAweEVDLDB4MDAsIDB4QjUsMHhBMSwgMHgwNiwweEI0LCAweDAwLDB4MDQsIDB4RjQsMHgwNCwgMHg0RiwweDU4LCAweDgzLDB4MTYsIAorMHhGRiwweDdDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDFBLCAweDQyLDB4MDAsIDB4RTYsMHgwMCwgMHhCQSwweDJELCAweEY0LDB4ODIsIAorMHgwMCwweDAwLCAweDk0LDB4OTYsIDB4RkYsMHg3NCwgMHgyMywweDgwLCAweDAwLDB4MDcsIDB4MjAsMHgxRSwgMHgwMCwweDA3LCAweEVFLDB4MDAsIAorMHhCNywweDQ4LCAweEM3LDB4MUMsIDB4MzgsMHgwMCwgMHg4MywweDE2LCAweEZGLDB4N0MsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MTgsIAorMHg3MCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgyNiwgMHg4NiwweEJBLCAweDAwLDB4MDAsIDB4RjUsMHg4NCwgMHg0RiwweDU4LCAweDc3LDB4MzksIAorMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNSwgMHhGRiwweEYwLCAweEY3LDB4MDIsIAorMHgwMCwweEZGLCAweEM2LDB4QjYsIDB4NzQsMHgwMCwgMHhFNiwweDAwLCAweEI2LDB4NjksIDB4MjAsMHgzNiwgMHgwMCwweDAxLCAweEU2LDB4MDAsIAorMHhCNiwweDY5LCAweDc3LDB4MzUsIDB4MDAsMHgwNiwgMHhBNiwweEJBLCAweDU4LDB4MDIsIDB4QzcsMHgzOCwgMHg1OCwweDAwLCAweDc2LDB4MzksIAorMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDY3LDB4QzAsIDB4NzYsMHhCNSwgMHhGRiwweEYwLCAweDIwLDB4MzYsIAorMHgwMCwweDAyLCAweEU2LDB4MDAsIDB4QjYsMHg2RCwgMHhDNiwweEI4LCAweDAwLDB4MDAsIDB4QzcsMHgyQywgMHgwMCwweDAwLCAweEUwLDB4MDAsIAorMHhCNiwweDZDLCAweEM2LDB4QjgsIDB4MDAsMHgwMCwgMHhGNiwweDg0LCAweDRGLDB4NTgsIDB4RjcsMHgwNCwgMHg0RiwweDU4LCAweEM1LDB4MzQsIAorMHgwMCwweDAwLCAweEMwLDB4MkEsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweEI3LDB4NDEsIDB4QzUsMHg4NCwgMHgwMCwweDAwLCAweDg0LDB4OTYsIAorMHhGRiwweDc0LCAweDg2LDB4QUEsIDB4MDAsMHgxQywgMHg4MywweDE2LCAweEZGLDB4M0MsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweDA0LDB4QTQsIAorMHgwMCwweDAxLCAweDk0LDB4OTYsIDB4RkYsMHg3NCwgMHg4NywweDFBLCAweDAwLDB4MUMsIDB4MDQsMHhBOCwgMHgwMCwweDFDLCAweDk0LDB4OTYsIAorMHhGRiwweDM0LCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweEI2LDB4Q0MsIDB4MDQsMHgxOCwgMHgwMCwweDFDLCAweDg2LDB4QUEsIAorMHgwMCwweDIwLCAweDg3LDB4MUEsIDB4MDAsMHgyMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHhCNiwweEQwLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhCNiwweERELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNSwweDgyLCAweDAwLDB4MDAsIDB4ODMsMHgxNiwgMHhGRiwweDM0LCAweDg3LDB4MjIsIAorMHgwMCwweDAwLCAweDg2LDB4OUEsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEUyLDB4MDAsIAorMHhCNywweDFDLCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHhCNywweDI0LCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweDg2LDB4OUEsIDB4MDAsMHgwNCwgMHg4NywweDIyLCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEUyLDB4MDAsIDB4QjcsMHgyNSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QjcsMHgzNSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RjUsMHg4MiwgMHgwMCwweDAxLCAweDIwLDB4MkUsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QjcsMHg0MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHg5NiwgMHhGRiwweDg0LCAweEUwLDB4MDAsIAorMHhCNSwweEVDLCAweDAzLDB4OUMsIDB4MDAsMHgwMSwgMHg4NCwweDk2LCAweEZGLDB4NzQsIDB4ODMsMHgxNiwgMHhGRiwweDk0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MjYsIDB4MzIsMHgwMCwgMHhFNiwweDAwLCAweEJCLDB4OTgsIDB4MjMsMHgwMCwgMHgwMCwweDA4LCAweDg0LDB4OTYsIAorMHhGRiwweDg0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDI2LCAweDMyLDB4MDAsIDB4RTYsMHgwMCwgMHhCQiwweDk5LCAweEY2LDB4MDIsIAorMHgwMCwweDAwLCAweEY2LDB4ODQsIDB4NDAsMHg3QywgMHhGNywweDA0LCAweDQwLDB4NzQsIDB4QzYsMHhCNCwgMHg2OCwweDAwLCAweEM3LDB4MzgsIAorMHg2OCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgyNiwgMHg4NiwweEJBLCAweDAwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIAorMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NywweEI0LCAweDAwLDB4MDgsIDB4NzAsMHgzRSwgMHhGRiwweEU4LCAweDQ3LDB4MEMsIAorMHgwMCwweDAxLCAweEQ3LDB4MDAsIDB4MEEsMHg3MCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhCOCwweDA0LCAweEY1LDB4ODIsIAorMHgwMCwweEZGLCAweDg0LDB4OTYsIDB4RkYsMHg4NCwgMHg4MywweDE2LCAweEZGLDB4OEMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MjQsIAorMHgzMiwweDAwLCAweDg0LDB4OTYsIDB4RkYsMHg3QywgMHhDNywweDM4LCAweDcwLDB4MDAsIDB4QzcsMHgyNCwgMHg3MCwweDAwLCAweDA3LDB4MzgsIAorMHgwMCwweDI2LCAweDg2LDB4QkEsIDB4MDAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIAorMHg3NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHhDNiwweEI0LCAweDVDLDB4MDAsIDB4QzAsMHgzNiwgMHg2MiwweDAwLCAweDQ3LDB4MEMsIAorMHgwMCwweDAxLCAweEQ3LDB4MDAsIDB4MEEsMHg3MCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhCOCwweDBELCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhCQiwweDk4LCAweDIzLDB4ODAsIAorMHgwMCwweDA3LCAweDIwLDB4MUUsIDB4MDAsMHgwNywgMHhFRSwweDAwLCAweEI4LDB4QzgsIDB4QzcsMHgxQywgMHgzOCwweDAwLCAweDgzLDB4MTYsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDE4LCAweDcwLDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDI2LCAweDg2LDB4QkEsIAorMHgwMCwweDAwLCAweEY1LDB4ODQsIDB4NEYsMHg1OCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIAorMHg3NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHhGNywweDAyLCAweDAwLDB4RkYsIDB4QzYsMHhCNiwgMHg3NCwweDAwLCAweEU2LDB4MDAsIAorMHhCOCwweDkxLCAweDIwLDB4MzYsIDB4MDAsMHgwMSwgMHhFNiwweDAwLCAweEI4LDB4OTEsIDB4NzcsMHgzNSwgMHgwMCwweDA2LCAweEE2LDB4QkEsIAorMHg1OCwweDAyLCAweEM3LDB4MzgsIDB4NTgsMHgwMCwgMHg3NiwweDM5LCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIAorMHg2NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHgyMCwweDM2LCAweDAwLDB4MDIsIDB4RTYsMHgwMCwgMHhCOCwweDk1LCAweEM2LDB4QjgsIAorMHgwMCwweDAwLCAweEM3LDB4MkMsIDB4MDAsMHgwMCwgMHhFMCwweDAwLCAweEI4LDB4OTQsIDB4QzYsMHhCOCwgMHgwMCwweDAwLCAweEY2LDB4ODQsIAorMHg0RiwweDU4LCAweEY3LDB4MDQsIDB4NEYsMHg1OCwgMHhDNSwweDM0LCAweDAwLDB4MDAsIDB4QzAsMHgyQSwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHhCOCwweEMxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4OTMsMHg5NiwgMHhGRiwweDRDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4Q0MsMHg2MCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODMsMHg5NiwgMHhGRiwweDRDLCAweEUwLDB4MDAsIAorMHhCOCwweDE0LCAweDAzLDB4OUMsIDB4MDAsMHgwMSwgMHg4NCwweDk2LCAweEZGLDB4ODQsIDB4ODMsMHgxNiwgMHhGRiwweDhDLCAweEYzLDB4ODQsIAorMHg0MCwweDdDLCAweEY1LDB4MDQsIDB4NDAsMHg3NCwgMHhDNCwweEE0LCAweDMyLDB4MDAsIDB4OTQsMHg5NiwgMHhGRiwweDM0LCAweDgzLDB4MTYsIAorMHhGRiwweDM0LCAweEM1LDB4OUMsIDB4MzgsMHgwMCwgMHhDNSwweEE4LCAweDU4LDB4MDAsIDB4MDUsMHhBQywgMHgwMCwweDI2LCAweDg2LDB4QUUsIAorMHgwMCwweDAwLCAweDc3LDB4MkQsIDB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4NzQsMHgyRCwgMHgwMCwweDFFLCAweDc0LDB4MjAsIAorMHhGRiwweEU1LCAweDczLDB4OUQsIDB4MDAsMHgxMCwgMHg3MywweDlELCAweEZGLDB4RjgsIDB4QzQsMHhBNCwgMHgzMCwweDAwLCAweDk0LDB4OTYsIAorMHhGRiwweDNDLCAweDgzLDB4MTYsIDB4RkYsMHg3QywgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4QzQsMHg5OCwgMHg0OCwweDAwLCAweDk0LDB4OTYsIAorMHhGRiwweDNDLCAweDA0LDB4QTQsIDB4MDAsMHgyNiwgMHg5NCwweDk2LCAweEZGLDB4M0MsIDB4NzMsMHgyNSwgMHgwMCwweDFFLCAweDczLDB4MTgsIAorMHhGRiwweEU1LCAweDkzLDB4MTYsIDB4RkYsMHg2QywgMHg3NCwweEE1LCAweDAwLDB4MUUsIDB4OTQsMHg5NiwgMHhGRiwweDY0LCAweDc0LDB4QTQsIAorMHhGRiwweEU1LCAweDk0LDB4OTYsIDB4RkYsMHg2NCwgMHg4MywweDE2LCAweEZGLDB4N0MsIDB4RjQsMHg4NCwgMHg0RiwweDU4LCAweDc2LDB4QjUsIAorMHhGRiwweEYwLCAweEM2LDB4MTgsIDB4NEEsMHgwMCwgMHg3NiwweDMwLCAweEZGLDB4RkEsIDB4NDYsMHgzMSwgMHgwMCwweDAwLCAweEYzLDB4MDIsIAorMHgwMCwweEZGLCAweEM2LDB4MzAsIDB4MzQsMHgwMCwgMHhGNCwweDgyLCAweEZGLDB4MDAsIDB4QzYsMHhCNCwgMHg0QywweDAwLCAweEM2LDB4MzAsIAorMHg2OCwweDAwLCAweEY2LDB4MkYsIDB4MjgsMHgwMCwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4ODMsMHgxNiwgMHhGRiwweDM0LCAweEM3LDB4MzgsIAorMHg0NywweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHg3MywweDE5LCAweDAwLDB4MTAsIDB4OTMsMHgxNiwgMHhGRiwweDM0LCAweDc0LDB4OTksIAorMHhGRiwweEY4LCAweEYzLDB4MDIsIDB4MDAsMHhGRiwgMHhDNywweDM4LCAweDM0LDB4MDAsIDB4QzcsMHgyNCwgMHg3MCwweDAwLCAweDk3LDB4MTYsIAorMHhGRiwweDM0LCAweDI0LDB4OTQsIDB4MDAsMHhDQSwgMHg4NCwweEE2LCAweDAwLDB4MDAsIDB4NzcsMHhBNSwgMHgwMCwweDFFLCAweDc3LDB4QkMsIAorMHhGRiwweEU1LCAweEM0LDB4QTQsIDB4N0YsMHhDMCwgMHg3NCwweEE1LCAweEZGLDB4RjAsIDB4ODMsMHgxNiwgMHhGRiwweDNDLCAweEY0LDB4QUYsIAorMHgyOCwweDAwLCAweEY0LDB4ODQsIDB4NEYsMHg1OCwgMHg4NywweDFBLCAweDAwLDB4MDAsIDB4QzUsMHgyOCwgMHg0QSwweDAwLCAweDc1LDB4MjgsIAorMHhGRiwweEZBLCAweDgzLDB4MTYsIDB4RkYsMHg2QywgMHg0NSwweDI5LCAweDAwLDB4MDAsIDB4RjQsMHg4MiwgMHgwMCwweEZGLCAweEM1LDB4MjgsIAorMHg0QywweDAwLCAweDg0LDB4OTYsIDB4RkYsMHgzQywgMHhDNywweDM4LCAweDM3LDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweEYzLDB4MDIsIAorMHhGRiwweDAwLCAweEM3LDB4MzgsIDB4MzQsMHgwMCwgMHhDNSwweDI4LCAweDcwLDB4MDAsIDB4RjUsMHgyNywgMHgyOCwweDAwLCAweDg3LDB4MjYsIAorMHgwMCwweDAwLCAweDgzLDB4MTYsIDB4RkYsMHg2NCwgMHg4NCwweDE2LCAweEZGLDB4N0MsIDB4QzcsMHgzOCwgMHgzNywweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweEY0LDB4ODIsIDB4MDAsMHhGRiwgMHhDNywweDM4LCAweDRDLDB4MDAsIDB4ODMsMHgxNiwgMHhGRiwweDNDLCAweEMzLDB4OUMsIAorMHg3MCwweDAwLCAweEUwLDB4MDAsIDB4QkUsMHhFNCwgMHhGMywweDlCLCAweDI4LDB4MDAsIDB4RjcsMHgwNCwgMHg0MCwweDdDLCAweEY2LDB4MDQsIAorMHg0MCwweDc0LCAweEM3LDB4MzgsIDB4NzAsMHgwMCwgMHhDNywweDMwLCAweDcwLDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDI2LCAweDg2LDB4QkEsIAorMHgwMCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc3LDB4QjQsIAorMHgwMCwweDA4LCAweDcwLDB4M0UsIDB4RkYsMHhFOCwgMHg0NywweDBDLCAweDAwLDB4MDEsIDB4RDcsMHgwMCwgMHgwQSwweDcwLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QkEsMHg3RCwgMHgyNSwweDgwLCAweDAwLDB4MDcsIDB4RTAsMHgwMCwgMHhCRSwweEU0LCAweDA0LDB4MjAsIAorMHgwMCwweDQwLCAweEUwLDB4MDAsIDB4QkEsMHhEOCwgMHhDNCwweDJDLCAweDAwLDB4MDAsIDB4QzcsMHgzMCwgMHg0MiwweDAwLCAweDg0LDB4OTYsIAorMHgwMCwweDAwLCAweDc1LDB4MzgsIDB4RkYsMHhGQSwgMHgwNiwweDI0LCAweDAwLDB4MEEsIDB4MjAsMHgyRSwgMHgwMCwweDA3LCAweEVFLDB4MDAsIAorMHhCQSwweEQ0LCAweDA3LDB4MzAsIDB4MDAsMHgwRSwgMHg4NiwweEJBLCAweDAwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIAorMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4RjcsMHgwMiwgMHgwMCwweEZGLCAweEM2LDB4QjQsIAorMHg3NCwweDAwLCAweDQ3LDB4MjksIDB4MDAsMHgwMCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QkEsMHg3NCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4RTAsMHgwMCwgMHhCQSwweDhDLCAweDA1LDB4QUMsIAorMHgwMCwweDAxLCAweEY0LDB4MDIsIDB4MDAsMHgwOCwgMHgwNywweDIwLCAweDAwLDB4MDcsIDB4MjAsMHgzQSwgMHgwMCwweDBFLCAweEUyLDB4MDAsIAorMHhCQiwweEE0LCAweEM1LDB4QTAsIDB4NDAsMHgwMCwgMHg4MywweDE2LCAweDAwLDB4MDAsIDB4RjUsMHgwNCwgMHg0MCwweDdDLCAweEY0LDB4ODIsIAorMHgwMCwweEZGLCAweEY2LDB4MDQsIDB4NEYsMHg1OCwgMHhDNSwweDk4LCAweDU4LDB4MDAsIDB4MDUsMHhBQywgMHgwMCwweDI2LCAweDg2LDB4QUUsIAorMHgwMCwweDAwLCAweDc3LDB4MkQsIDB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHgxOCwgMHg2MiwweDAwLCAweDc2LDB4MzAsIAorMHhGRiwweEZBLCAweDQ2LDB4MzEsIDB4MDAsMHgwMCwgMHhDNiwweDMwLCAweDRDLDB4MDAsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjUsIAorMHhGRiwweEYwLCAweDc3LDB4MjksIDB4MDAsMHgxMCwgMHg3NywweDM5LCAweEZGLDB4RjgsIDB4QzYsMHhCNCwgMHg0QywweDAwLCAweEM3LDB4MzgsIAorMHg2OCwweDAwLCAweEY3LDB4MkYsIDB4MjgsMHgwMCwgMHhGNSwweDg0LCAweDQwLDB4NzQsIDB4QzUsMHgyOCwgMHg1MCwweDAwLCAweEM1LDB4QUMsIAorMHg1MCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgyNiwgMHg4NiwweEFFLCAweDAwLDB4MDAsIDB4NzcsMHgyRCwgMHgwMCwweDFFLCAweDc3LDB4MzgsIAorMHhGRiwweEU1LCAweDc1LDB4MkQsIDB4MDAsMHgxRSwgMHg3NSwweDI4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjUsIAorMHhGRiwweEYwLCAweEY3LDB4MDIsIDB4RkYsMHgwMCwgMHhDNiwweEI0LCAweDc0LDB4MDAsIDB4QzYsMHgzMCwgMHg2OCwweDAwLCAweEY2LDB4MkYsIAorMHgyOCwweDAwLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3NiwweEExLCAweDAwLDB4MTAsIDB4NzYsMHhCNSwgMHhGRiwweEY4LCAweEM3LDB4MzgsIAorMHg1NywweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHhDNywweDM4LCAweDRDLDB4MDAsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweEUwLDB4MDAsIAorMHhCQiwweEY4LCAweEY2LDB4QUYsIDB4MjgsMHgwMCwgMHhGNCwweDA0LCAweDRGLDB4NTgsIDB4RTAsMHgwMCwgMHhCRSwweEU0LCAweDA0LDB4MjAsIAorMHgwMCwweDQwLCAweEY2LDB4MDQsIDB4NEYsMHg1OCwgMHg4MywweDE2LCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHg0MCwweDdDLCAweEY1LDB4ODQsIAorMHg0MCwweDc0LCAweEM2LDB4MTgsIDB4NjIsMHgwMCwgMHg3NiwweDMwLCAweEZGLDB4RkEsIDB4QzcsMHgzOCwgMHg3MCwweDAwLCAweEM1LDB4QUMsIAorMHg3MCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgyNiwgMHg4NiwweEFFLCAweDAwLDB4MDAsIDB4NzcsMHgyRCwgMHgwMCwweDFFLCAweDc3LDB4MzgsIAorMHhGRiwweEU1LCAweDQ2LDB4MzEsIDB4MDAsMHgwMCwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNSwgMHhGRiwweEYwLCAweEY3LDB4MDIsIAorMHgwMCwweEZGLCAweEM2LDB4MzAsIDB4NzQsMHgwMCwgMHhGNywweDAyLCAweEZGLDB4MDAsIDB4QzYsMHhCNCwgMHg3NCwweDAwLCAweEM2LDB4MzAsIAorMHg2OCwweDAwLCAweEY2LDB4MkYsIDB4MjgsMHgwMCwgMHgyMywweDgwLCAweDAwLDB4MDcsIDB4MjAsMHgxRSwgMHgwMCwweDA3LCAweEVFLDB4MDAsIAorMHhCRSwweEUwLCAweEM3LDB4MUMsIDB4MzgsMHgwMCwgMHg4NCwweDk2LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MjQsIAorMHg3MCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgyNiwgMHg4NiwweEJBLCAweDAwLDB4MDAsIDB4RjUsMHg4NCwgMHg0RiwweDU4LCAweDc3LDB4MzksIAorMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNSwgMHhGRiwweEYwLCAweEY3LDB4MDIsIAorMHgwMCwweEZGLCAweEM2LDB4QjYsIDB4NzQsMHgwMCwgMHhFNiwweDAwLCAweEJDLDB4NzksIDB4MjAsMHgzNiwgMHgwMCwweDAxLCAweEU2LDB4MDAsIAorMHhCQywweDc5LCAweDc3LDB4MzUsIDB4MDAsMHgwNiwgMHhBNiwweEJBLCAweDU4LDB4MDIsIDB4QzcsMHgzOCwgMHg1OCwweDAwLCAweDc2LDB4MzksIAorMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDY3LDB4QzAsIDB4NzYsMHhCNSwgMHhGRiwweEYwLCAweDIwLDB4MzYsIAorMHgwMCwweDAyLCAweEU2LDB4MDAsIDB4QkMsMHg3RCwgMHhDNiwweEI4LCAweDAwLDB4MDAsIDB4QzcsMHgyQywgMHgwMCwweDAwLCAweEUwLDB4MDAsIAorMHhCQywweDdDLCAweEM2LDB4QjgsIDB4MDAsMHgwMCwgMHhGNiwweDg0LCAweDRGLDB4NTgsIDB4RjcsMHgwNCwgMHg0RiwweDU4LCAweEM1LDB4MzQsIAorMHgwMCwweDAwLCAweEMwLDB4MkEsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweEJFLDB4RDksIDB4MDYsMHhBOCwgMHgwMCwweDFDLCAweDgzLDB4MTYsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4OTYsMHg5MywgMHhGRiwweEZDLCAweEY0LDB4ODYsIAorMHgzQiwweEI0LCAweDk0LDB4OTMsIDB4RkYsMHhGQywgMHg5MywweDk2LCAweEZGLDB4NEMsIDB4OTUsMHgxNiwgMHhGRiwweDQ0LCAweDk2LDB4OTYsIAorMHhGRiwweDQwLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDIzLDB4NDAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4MDQsIAorMHg0RiwweDVDLCAweEY0LDB4ODIsIDB4MDAsMHgwMCwgMHg5NCwweDk2LCAweEZGLDB4NUMsIDB4ODYsMHg5NiwgMHhGRiwweDQwLCAweDgzLDB4OTYsIAorMHhGRiwweDRDLCAweDg1LDB4MTYsIDB4RkYsMHg0NCwgMHg5MywweDE2LCAweEZGLDB4MzQsIDB4ODYsMHgxQSwgMHgwMCwweDA4LCAweDk2LDB4OTYsIAorMHhGRiwweDNDLCAweDg3LDB4MUEsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzMiwgMHg3MiwweDAwLCAweEVDLDB4MDAsIAorMHhCRCwweEI4LCAweDk2LDB4MTYsIDB4RkYsMHg5QywgMHg3NywweDMxLCAweDAwLDB4MDEsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweDc3LDB4MzksIAorMHgwMCwweDAyLCAweEM2LDB4MzgsIDB4MzAsMHgwMCwgMHgwNiwweDMwLCAweDAwLDB4MEMsIDB4ODYsMHhCMiwgMHgwMCwweDAwLCAweDg3LDB4MkEsIAorMHgwMCwweDFDLCAweDg1LDB4OTYsIDB4RkYsMHg1QywgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHhCRCwweDQwLCAweEM0LDB4MDQsIAorMHgwMCwweDAwLCAweDg2LDB4QjIsIDB4MDAsMHgwNCwgMHg4NywweDJBLCAweDAwLDB4MjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4QkQsMHg0NCwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RjUsMHg4MiwgMHgwMCwweDAxLCAweDIwLDB4MkUsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QkQsMHg1MSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjQsMHgwMiwgMHgwMCwweDAwLCAweDgzLDB4MTYsIAorMHhGRiwweDNDLCAweDg2LDB4QjIsIDB4MDAsMHgwMCwgMHg4NywweDFBLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEUyLDB4MDAsIDB4QkQsMHg5MCwgMHhGNSwweDgyLCAweDAwLDB4MDAsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHhCRCwweDk4LCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHg4NiwweEIyLCAweDAwLDB4MDQsIDB4ODcsMHgxQSwgMHgwMCwweDA0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAwLCAweEJELDB4OTksIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEY1LDB4ODIsIAorMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEJELDB4QTksIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEY0LDB4MDIsIAorMHgwMCwweDAxLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEJELDB4QjgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY0LDB4ODIsIAorMHgwMCwweDAxLCAweDk0LDB4OTYsIDB4RkYsMHg1QywgMHg4MywweDE2LCAweEZGLDB4NUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MUEsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QkQsMHhGOSwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4ODcsMHgxNiwgMHhGRiwweDlDLCAweDg0LDB4OTYsIAorMHhGRiwweDM0LCAweDc2LDB4QjksIDB4MDAsMHgwMSwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4NzYsMHhCNSwgMHgwMCwweDAyLCAweEM2LDB4QjQsIAorMHg0OCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgxNCwgMHg4NiwweEI2LCAweDAwLDB4MDAsIDB4OTcsMHgxNiwgMHhGRiwweEEwLCAweEUwLDB4MDAsIAorMHhCRSwweDcwLCAweDk2LDB4OTYsIDB4RkYsMHhBNCwgMHgyNywweDE0LCAweDAwLDB4NjQsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDgzLDB4MTYsIAorMHhGRiwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4ODQsMHg5NiwgMHhGRiwweDM0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDk0LDB4OTMsIDB4RkYsMHhGQywgMHg5MywweDk2LCAweEZGLDB4NEMsIDB4OTUsMHgxNiwgMHhGRiwweDQ0LCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjUsMHg2OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODMsMHg5NiwgMHhGRiwweDRDLCAweDg1LDB4MTYsIAorMHhGRiwweDQ0LCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEJFLDB4NzEsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweDg3LDB4MTYsIAorMHhGRiwweDlDLCAweDgzLDB4MTYsIDB4RkYsMHgzNCwgMHg3NiwweEI5LCAweDAwLDB4MDEsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweDc2LDB4QjUsIAorMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4MzAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MTQsIDB4ODYsMHhCNiwgMHgwMCwweDAwLCAweDk3LDB4MTYsIAorMHhGRiwweEEwLCAweDk2LDB4OTYsIDB4RkYsMHhBNCwgMHg5NywweDFBLCAweDAwLDB4MDgsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QkUsMHg5OSwgMHhGNiwweDA2LCAweDQyLDB4OUMsIDB4RjcsMHgwNCwgMHg0MiwweDlDLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHhGNywweDA0LCAweDRGLDB4NTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MjgsIAorMHg3MiwweDAwLCAweDc3LDB4MzgsIDB4RkYsMHhGQSwgMHg0NywweDM5LCAweDAwLDB4MDAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4MjgsIAorMHgwMCwweDFDLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNCwweDg0LCAweDRGLDB4NUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk0LDB4OTMsIAorMHhGRiwweEZDLCAweDkzLDB4OTYsIDB4RkYsMHg0QywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyMywweDQwLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDgzLDB4OTYsIDB4RkYsMHg0QywgMHhFMCwweDAwLCAweEJCLDB4RkMsIDB4MDMsMHg5QywgMHgwMCwweDAxLCAweDg0LDB4MTYsIAorMHgwMCwweDAwLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDA0LCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIAorMHgwMCwweDYwLCAweDg1LDB4MTYsIDB4MDAsMHgwMCwgMHg4NiwweDE2LCAweDAwLDB4MDQsIDB4MDYsMHhBOCwgMHgwMCwweDE4LCAweEM3LDB4MzAsIAorMHg2MCwweDAwLCAweEM1LDB4QjgsIDB4NjgsMHgwMCwgMHgyMCwweDMyLCAweDAwLDB4MDcsIDB4RUUsMHgwMCwgMHhCRiwweDY0LCAweDA3LDB4MkMsIAorMHgwMCwweDBFLCAweDg2LDB4QkEsIDB4MDAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIAorMHg3NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHhGNywweDAyLCAweDAwLDB4RkYsIDB4QzYsMHhCNCwgMHg3NCwweDAwLCAweDIwLDB4MzYsIAorMHgwMCwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHhENywweDAwLCAweDBBLDB4NzAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhCRiwweDYxLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHhFMCwweDAwLCAweEJGLDB4MTgsIDB4MDYsMHgzMCwgMHgwMCwweDAxLCAweDIwLDB4MzIsIAorMHgwMCwweDA3LCAweEVFLDB4MDAsIDB4QzAsMHg0QywgMHgwNiwweEE4LCAweDAwLDB4MTYsIDB4RjUsMHgwNSwgMHg0MCwweDc0LCAweEY2LDB4MDUsIAorMHg0MCwweDdDLCAweEYzLDB4MDIsIDB4MDAsMHgwNiwgMHhGMywweDA1LCAweDQyLDB4NTQsIDB4OTYsMHgxMywgMHhGRiwweEZDLCAweDA1LDB4MjgsIAorMHgwMCwweDAyLCAweDk1LDB4MTYsIDB4RkYsMHhDNCwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4MjMsMHg5NCwgMHgwMCwweDIwLCAweDkzLDB4OTYsIAorMHhGRiwweEJDLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHg5NiwweDE2LCAweEZGLDB4QUMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhEMCwweERDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NCwweDk2LCAweEZGLDB4QzQsIDB4MjMsMHgxNCwgMHgwMCwweDM4LCAweDk0LDB4OTMsIAorMHhGRiwweEZDLCAweDkzLDB4MTYsIDB4RkYsMHhCNCwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhEMiwweDU4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDAyLCAweEZGLDB4MzQsIDB4ODYsMHgxNiwgMHhGRiwweEFDLCAweEY3LDB4MDUsIAorMHg0MiwweDY0LCAweDk2LDB4MTMsIDB4RkYsMHhGQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4ODMsMHg5NiwgMHhGRiwweEI0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHg4NCwweDk2LCAweEZGLDB4QkMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk0LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEY3LDB4QzgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDIwLDB4MjIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QzAsMHgxRCwgMHhGMywweDA2LCAweDNBLDB4RDgsIDB4RjcsMHgwNCwgMHg0MiwweDU0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDI3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAweDQyLDB4NTQsIDB4RjMsMHgwNSwgMHg0MiwweDQ0LCAweEYzLDB4ODIsIAorMHgxNywweDcwLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGNCwweDgyLCAweDAwLDB4MUIsIDB4OTQsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4MDYsIAorMHg0MiwweDQ0LCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgxRSwweEMwLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEUwLDB4MDAsIDB4QzEsMHhBMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgwMCwweDAwLCAweEY1LDB4ODQsIAorMHg0RiwweDU4LCAweEY0LDB4MDYsIDB4M0IsMHg3MCwgMHg3NiwweEI1LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHg3NiwweDM5LCAweDAwLDB4MDYsIDB4QTcsMHgyRSwgMHg2MCwweDAyLCAweEM1LDB4MkMsIAorMHg2MCwweDAwLCAweDc2LDB4QTksIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweDc3LDB4MzksIDB4MDAsMHgwMywgMHhDNywweDM4LCAweDQwLDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDAyLCAweDg2LDB4QkEsIAorMHgwMCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjcsIAorMHhGRiwweEYwLCAweEVFLDB4MDAsIDB4QzEsMHgxNSwgMHg5NiwweDk2LCAweEZGLDB4OUMsIDB4QTcsMHgyRSwgMHg2MCwweDAyLCAweDc2LDB4QTksIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHg4MywweDk2LCAweEZGLDB4OUMsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweDc3LDB4MzksIDB4MDAsMHgwMywgMHhDNywweDM4LCAweDQwLDB4MDAsIDB4ODYsMHhCQSwgMHgwMCwweDA0LCAweDI0LDB4OTQsIAorMHgwMCwweDYwLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjUsIAorMHhGRiwweEYwLCAweEE2LDB4QUEsIDB4NjgsMHgwMiwgMHg3NywweDFELCAweDAwLDB4MDMsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDI3LDB4MzgsIAorMHgwMCwweDA4LCAweDgzLDB4QkEsIDB4MDAsMHgwNCwgMHg4MywweDNBLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4QTYsIAorMHgwMCwweDA0LCAweDkzLDB4MjYsIDB4MDAsMHgwMCwgMHg4NSwweDk2LCAweEZGLDB4QTQsIDB4RTAsMHgwMCwgMHhDMSwweDM4LCAweDIzLDB4MDAsIAorMHgwMCwweDA3LCAweEE3LDB4MkUsIDB4NjAsMHgwMiwgMHg3NiwweEE5LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHg3NywweDM5LCAweDAwLDB4MDMsIDB4QzcsMHgzOCwgMHg0MCwweDAwLCAweDg1LDB4QkEsIAorMHgwMCwweDA0LCAweDIzLDB4MDAsIDB4MDAsMHgwNywgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4ODcsMHgyQSwgMHgwMCwweDAwLCAweDc2LDB4QTksIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHg4MywweDk2LCAweEZGLDB4OUMsIDB4RjYsMHgwNiwgMHgzQiwweDcwLCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHg3NywweDM5LCAweDAwLDB4MDMsIDB4QTYsMHhCQSwgMHg2MCwweDAyLCAweDIwLDB4MUUsIAorMHgwMCwweDAwLCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIAorMHg3NywweEMwLCAweEVFLDB4MDAsIDB4QzEsMHg4RCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4ODQsMHg5NiwgMHhGRiwweEEwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDc3LDB4MjUsIDB4RkYsMHhGMCwgMHhDNiwweEI4LCAweDY4LDB4MDAsIDB4QzcsMHgyOCwgMHg2OCwweDAwLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhDMSwweDJDLCAweDAwLDB4MDAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDgsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDcwLCAweDI1LDB4MDAsIAorMHgwMCwweDA3LCAweDIwLDB4MkEsIDB4MDAsMHgwNywgMHhFRSwweDAwLCAweEMzLDB4QjgsIDB4QzcsMHgyOCwgMHg1MCwweDAwLCAweDgzLDB4MTYsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDE4LCAweDcwLDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDI2LCAweDg2LDB4QkEsIAorMHgwMCwweDAwLCAweEY1LDB4ODQsIDB4NEYsMHg1OCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIAorMHg3NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHhGNywweDAyLCAweDAwLDB4RkYsIDB4QzYsMHhCNiwgMHg3NCwweDAwLCAweEU2LDB4MDAsIAorMHhDMiwweDNELCAweDIwLDB4MzYsIDB4MDAsMHgwMSwgMHhFNiwweDAwLCAweEMyLDB4M0QsIDB4NzcsMHgzNSwgMHgwMCwweDA2LCAweEE2LDB4QkEsIAorMHg1OCwweDAyLCAweEM3LDB4MzgsIDB4NTgsMHgwMCwgMHg3NiwweDM5LCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIAorMHg2NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHgyMCwweDM2LCAweDAwLDB4MDIsIDB4RTYsMHgwMCwgMHhDMiwweDRELCAweEMwLDB4M0EsIAorMHg1QSwweDAwLCAweEUwLDB4MDAsIDB4QzIsMHg0OCwgMHhDNywweDJDLCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHg0RiwweDU4LCAweEY1LDB4ODQsIAorMHg0RiwweDU4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDVBLDB4MDAsIDB4RTYsMHgwMCwgMHhDMywweEIxLCAweEY0LDB4ODYsIAorMHgzQiwweDkwLCAweDgzLDB4OTYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHg5QywgMHgwMCwweDE2LCAweDg3LDB4MzYsIAorMHgwMCwweDAwLCAweDc2LDB4QjUsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweDc2LDB4MzksIDB4MDAsMHgwNiwgMHhBNywweDJFLCAweDYwLDB4MDIsIDB4QzUsMHgyQywgMHg2MCwweDAwLCAweDc2LDB4QTksIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDc3LDB4MzksIAorMHgwMCwweDAzLCAweEM3LDB4MzgsIDB4NDgsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MDIsIDB4ODYsMHhCQSwgMHgwMCwweDAwLCAweDc3LDB4MzksIAorMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNywgMHhGRiwweEYwLCAweEVFLDB4MDAsIAorMHhDMywweDIxLCAweDk2LDB4OTYsIDB4RkYsMHg4QywgMHhBNywweDJFLCAweDYwLDB4MDIsIDB4NzYsMHhBOSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweDgzLDB4MTYsIDB4RkYsMHg4QywgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDc3LDB4MzksIAorMHgwMCwweDAzLCAweEM3LDB4MzgsIDB4NDgsMHgwMCwgMHg4NiwweEJBLCAweDAwLDB4MDQsIDB4MjQsMHg5NCwgMHgwMCwweDcwLCAweDc3LDB4MzksIAorMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNSwgMHhGRiwweEYwLCAweEE2LDB4QUEsIAorMHg2OCwweDAyLCAweDc3LDB4MTksIDB4MDAsMHgwMywgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4MjcsMHgzOCwgMHgwMCwweDA4LCAweDgzLDB4QkEsIAorMHgwMCwweDA0LCAweDgzLDB4M0EsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHhBNiwgMHgwMCwweDA0LCAweDkzLDB4MjYsIAorMHgwMCwweDAwLCAweDg2LDB4MTYsIDB4RkYsMHg5NCwgMHhFMCwweDAwLCAweEMzLDB4NDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEE3LDB4MkUsIAorMHg2MCwweDAyLCAweDc2LDB4QTksIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4RjMsMHgwNiwgMHgzQiwweDkwLCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHg3NywweDM5LCAweDAwLDB4MDMsIDB4QzcsMHgzOCwgMHgzMCwweDAwLCAweDg2LDB4M0EsIAorMHgwMCwweDA0LCAweDg3LDB4MkEsIDB4MDAsMHgwMCwgMHg3NiwweEE5LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweDgzLDB4OTYsIAorMHhGRiwweDhDLCAweEY0LDB4ODYsIDB4M0IsMHg5MCwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDc3LDB4MzksIAorMHgwMCwweDAzLCAweEE2LDB4QkEsIDB4NDgsMHgwMiwgMHgyMCwweDFFLCAweDAwLDB4MDAsIDB4QzcsMHgzOCwgMHg0OCwweDAwLCAweDc3LDB4MzksIAorMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4RUUsMHgwMCwgMHhDMywweDk1LCAweDc2LDB4QjUsIAorMHhGRiwweEYwLCAweDgzLDB4MTYsIDB4RkYsMHg5MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHgxOSwgMHhGRiwweEYwLCAweEM2LDB4QjgsIAorMHg2OCwweDAwLCAweEM3LDB4MjgsIDB4NjgsMHgwMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEMxLDB4MzAsIAorMHgwMCwweDAwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhFMCwweDAwLCAweEM1LDB4QzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEUwLDB4MDAsIAorMHhDMSwweEM0LCAweDA1LDB4MjgsIDB4MDAsMHgwMSwgMHg4MywweDk2LCAweDAwLDB4MDAsIDB4RjQsMHg4MiwgMHgwMCwweDA2LCAweEY0LDB4ODUsIAorMHg0MiwweDU0LCAweEY2LDB4MDQsIDB4NDIsMHg2MCwgMHgyNSwweDE0LCAweDAwLDB4MUUsIDB4MjMsMHgxNCwgMHgwMCwweDIwLCAweDkzLDB4MTYsIAorMHhGRiwweEFDLCAweEYzLDB4ODUsIDB4NDAsMHg3OCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4NzUsMHhCMSwgMHgwMCwweDFFLCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFCLCAweDI4LDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc1LDB4QUMsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NUYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIAorMHgwMCwweDFDLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIAorMHgwMCwweDFBLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIAorMHgwMCwweDE4LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIAorMHgwMCwweDE2LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIAorMHgwMCwweDE0LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDI1LDB4MTQsIAorMHgwMCwweDEyLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHgyNSwweDE0LCAweDAwLDB4MTAsIDB4NzYsMHgzMSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDA3LDB4MUMsIAorMHgwMCwweDAyLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgyMywweDk0LCAweDAwLDB4NTAsIDB4OTMsMHg5NiwgMHhGRiwweEE0LCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEQyLDB4NTgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg0LDB4OTYsIAorMHhGRiwweEE0LCAweDIzLDB4MTQsIDB4MDAsMHgzOCwgMHg5NCwweDkzLCAweEZGLDB4RkMsIDB4MjcsMHg4MCwgMHgwMCwweDA3LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDkzLDB4MTYsIDB4RkYsMHg5QywgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhDRiwweDI0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDAyLCAweEZGLDB4MzQsIDB4MjcsMHg4MCwgMHgwMCwweDA3LCAweEY3LDB4ODUsIAorMHg0MiwweDU4LCAweEY3LDB4MDUsIDB4NDIsMHg2NCwgMHgyNywweDgwLCAweDAwLDB4MDcsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDgzLDB4OTYsIDB4RkYsMHg5QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDg0LDB4OTYsIAorMHhGRiwweEFDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NCwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhGNSwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhDNSwweDk1LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NDIsMHg1OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIAorMHg0MiwweDU4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHhGMywweDA2LCAweDM5LDB4QzAsIDB4RjMsMHgwNSwgMHg0MiwweDQ0LCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEYzLDB4ODIsIAorMHgwMCwweDFDLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAwLCAweEM1LDB4QzQsIDB4QjMsMHhCQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIAorMHgyRCwweDM4LCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDA0LCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDI1LDB4MDAsIAorMHgwMCwweDA3LCAweEY3LDB4MDQsIDB4NDAsMHg3NCwgMHhGNiwweDg0LCAweDRGLDB4NTgsIDB4RjYsMHgwNCwgMHg0MiwweDYwLCAweEM3LDB4MzgsIAorMHg2QSwweDAwLCAweDc1LDB4QjgsIDB4RkYsMHhGQSwgMHgwNiwweDMwLCAweDAwLDB4MEEsIDB4MjAsMHgyQSwgMHgwMCwweDA3LCAweEVFLDB4MDAsIAorMHhDNiwweDQ4LCAweDA3LDB4MzAsIDB4MDAsMHgwRSwgMHg4NiwweEJBLCAweDAwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIAorMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4RjcsMHgwMiwgMHgwMCwweEZGLCAweEM2LDB4QjQsIAorMHg3NCwweDAwLCAweDQ3LDB4MkQsIDB4MDAsMHgwMCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4QzYsMHg0QywgMHhDMywweDI4LCAweDAwLDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweEUwLDB4MDAsIAorMHhDNSwweEZDLCAweDA1LDB4MjgsIDB4MDAsMHgwMSwgMHhGMywweDAyLCAweDAwLDB4MDgsIDB4QzUsMHgxOCwgMHgzMCwweDAwLCAweEYzLDB4ODQsIAorMHg0MiwweDYwLCAweEY2LDB4MDQsIDB4NEYsMHg1OCwgMHhGNywweDA0LCAweDQwLDB4N0MsIDB4RjQsMHg4NCwgMHg0MCwweDc0LCAweEM1LDB4MUMsIAorMHg1MCwweDAwLCAweDA1LDB4MjgsIDB4MDAsMHgyNiwgMHg4NSwweEFBLCAweDAwLDB4MDAsIDB4NzQsMHgyOSwgMHgwMCwweDFFLCAweDc0LDB4MjAsIAorMHhGRiwweEU1LCAweEM2LDB4MUMsIDB4NjIsMHgwMCwgMHg3NiwweDMwLCAweEZGLDB4RkEsIDB4QzYsMHhCOCwgMHg3MCwweDAwLCAweEM0LDB4QTQsIAorMHg2OCwweDAwLCAweDA0LDB4QTQsIDB4MDAsMHgyNiwgMHg3NiwweEE1LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweDc3LDB4MzksIAorMHgwMCwweDEwLCAweDc3LDB4MzksIDB4RkYsMHhGOCwgMHg0NiwweDMxLCAweDAwLDB4MDAsIDB4QzUsMHhBQywgMHg0NywweEMwLCAweDc1LDB4QUQsIAorMHhGRiwweEYwLCAweEY0LDB4MDIsIDB4MDAsMHhGRiwgMHhDNSwweEFDLCAweDQ0LDB4MDAsIDB4QzcsMHgzOCwgMHg1OCwweDAwLCAweEY3LDB4MkIsIAorMHgyOCwweDAwLCAweDg3LDB4MjYsIDB4MDAsMHgwMCwgMHg3NSwweEE1LCAweDAwLDB4MUUsIDB4QzYsMHgzMCwgMHg0NCwweDAwLCAweDc1LDB4QUMsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4RjYsMHg4MiwgMHhGRiwweDAwLCAweEM3LDB4MzgsIAorMHg2QywweDAwLCAweEM2LDB4MzAsIDB4NzAsMHgwMCwgMHhGNiwweDI3LCAweDI4LDB4MDAsIDB4ODcsMHgyNiwgMHgwMCwweDAwLCAweDc2LDB4OTksIAorMHgwMCwweDEwLCAweDc2LDB4QjUsIDB4RkYsMHhGOCwgMHhDNywweDM4LCAweDVGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweEM3LDB4MzgsIAorMHg0NCwweDAwLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHhGNiwweEE3LCAweDI4LDB4MDAsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweEYzLDB4ODQsIAorMHgzQiwweEIwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhENCwweDJDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA0LCAweDQwLDB4N0MsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGMywweDg0LCAweDQwLDB4NzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEJFLDB4RjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDQsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwOCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDA0LCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweEY3LDB4MDYsIAorMHg0MiwweDMwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDM1LDB4NjAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHg0MiwweDMwLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MzUsMHhFQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNCwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDQyLDB4NDQsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHgzNiwweDc4LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNCwweEY0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4NDIsMHg0NCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgzNywweDA0LCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE0LDB4RjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHg0MiwweDQ0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDM3LDB4OTAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHg0MiwweDQ0LCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MzgsMHgxQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNCwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDQyLDB4NDQsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHgzOCwweEE4LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNCwweEY0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4NDIsMHg0NCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHgzOSwweDM0LCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE0LDB4RjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHg0MiwweDQ0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDM5LDB4QzAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHg0MiwweDQ0LCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4M0EsMHg0QywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNCwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDQyLDB4NDQsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHgzQSwweEQ4LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNCwweEY0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDg1LDB4OTYsIAorMHgwMCwweDAwLCAweEY1LDB4MDYsIDB4M0IsMHg5MCwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4NzYsMHhBRCwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4NzcsMHgzOSwgMHgwMCwweDAzLCAweEM3LDB4MzgsIAorMHg1MCwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgwMiwgMHg4NiwweEJBLCAweDAwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIAorMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweDM3LCAweEZGLDB4RjAsIDB4RUUsMHgwMCwgMHhDOSwweDk1LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3NiwweEFELCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHg3NywweDM5LCAweDAwLDB4MDMsIDB4QzcsMHgzOCwgMHg1MCwweDAwLCAweDg2LDB4QkEsIAorMHgwMCwweDA0LCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjUsIAorMHhGRiwweEYwLCAweEE2LDB4QUUsIDB4NjgsMHgwMiwgMHg3NywweDMxLCAweDAwLDB4MDMsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDI3LDB4MzgsIAorMHgwMCwweDA4LCAweDg0LDB4QkEsIDB4MDAsMHgwNCwgMHg4NCwweDNBLCAweDAwLDB4MDAsIDB4RTAsMHgwMCwgMHhDOSwweEI0LCAweEM1LDB4MjQsIAorMHgwMCwweDAwLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3NiwweEFELCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHg3NywweDM5LCAweDAwLDB4MDMsIDB4QzcsMHgzOCwgMHg1MCwweDAwLCAweDg1LDB4M0EsIAorMHgwMCwweDA0LCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3NiwweEFELCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEY2LDB4MDYsIDB4M0IsMHg5MCwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDc3LDB4MzksIAorMHgwMCwweDAzLCAweEE2LDB4QkEsIDB4NjAsMHgwMiwgMHhDNywweDM4LCAweDYwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIAorMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHhFRSwweDAwLCAweEM5LDB4RjksIDB4NzYsMHhCNSwgMHhGRiwweEYwLCAweDc3LDB4MjEsIAorMHhGRiwweEYwLCAweEM2LDB4QjgsIDB4NjgsMHgwMCwgMHhDNywweDJDLCAweDY4LDB4MDAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEMxLDB4MjgsIDB4MDAsMHgwMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwNCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHg4NSwweDk2LCAweDAwLDB4MDAsIDB4RjUsMHgwNiwgMHgzQiwweDcwLCAweDg3LDB4MkUsIAorMHgwMCwweDAwLCAweDc2LDB4QUQsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweDc3LDB4MzksIDB4MDAsMHgwMywgMHhDNywweDM4LCAweDUwLDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDAyLCAweDg2LDB4QkEsIAorMHgwMCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4MzcsIAorMHhGRiwweEYwLCAweEVFLDB4MDAsIDB4Q0EsMHhCRCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QUQsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDc3LDB4MzksIAorMHgwMCwweDAzLCAweEM3LDB4MzgsIDB4NTAsMHgwMCwgMHg4NiwweEJBLCAweDAwLDB4MDQsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIAorMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4QTYsMHhBRSwgMHg2OCwweDAyLCAweDc3LDB4MzEsIAorMHgwMCwweDAzLCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHgyNywweDM4LCAweDAwLDB4MDgsIDB4ODQsMHhCQSwgMHgwMCwweDA0LCAweDg0LDB4M0EsIAorMHgwMCwweDAwLCAweEUwLDB4MDAsIDB4Q0EsMHhEQywgMHhDNSwweDI0LCAweDAwLDB4MDAsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QUQsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDc3LDB4MzksIAorMHgwMCwweDAzLCAweEM3LDB4MzgsIDB4NTAsMHgwMCwgMHg4NSwweDNBLCAweDAwLDB4MDQsIDB4ODMsMHg5NiwgMHgwMCwweDA0LCAweDc2LDB4QUQsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4MkUsIAorMHgwMCwweDAwLCAweEY2LDB4MDYsIDB4M0IsMHg3MCwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDc3LDB4MzksIAorMHgwMCwweDAzLCAweEE2LDB4QkEsIDB4NjAsMHgwMiwgMHhDNywweDM4LCAweDYwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIAorMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHhFRSwweDAwLCAweENCLDB4MjksIDB4NzYsMHhCNSwgMHhGRiwweEYwLCAweDc3LDB4MjEsIAorMHhGRiwweEYwLCAweEM2LDB4QjgsIDB4NjgsMHgwMCwgMHhDNywweDJDLCAweDY4LDB4MDAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEMxLDB4MjgsIDB4MDAsMHgwMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwOCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNSwweDA0LCAweDRGLDB4NTgsIDB4RjUsMHg4MiwgMHgwMCwweDAyLCAweDA2LDB4MjgsIAorMHgwMCwweDgwLCAweDIwLDB4MkUsIDB4MDAsMHg2MiwgMHhFRSwweDAwLCAweENCLDB4OTAsIDB4MDcsMHgzMCwgMHgwMCwweDQwLCAweEYwLDB4MzMsIAorMHgyOCwweDAwLCAweEM2LDB4QjgsIDB4NTIsMHgwMCwgMHg3NiwweEI0LCAweEZGLDB4RkEsIDB4MDYsMHgzMCwgMHgwMCwweDE0LCAweEY2LDB4QjMsIAorMHgyOCwweDAwLCAweEM2LDB4MzgsIDB4MDAsMHgwMCwgMHhFMCwweDAwLCAweENCLDB4NjQsIDB4MDUsMHhBQywgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHg0RiwweDU4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNiwweEI4LCAweDE4LDB4RDQsIDB4RjQsMHg4MiwgMHgwMCwweDAxLCAweEY0LDB4QjcsIAorMHgyOCwweDAwLCAweDA3LDB4MzgsIDB4MTgsMHhDMCwgMHhGMCwweDNCLCAweDI4LDB4MDAsIDB4RjcsMHgwNiwgMHg0MiwweEMwLCAweEY0LDB4ODIsIAorMHgwMCwweDAyLCAweEY0LDB4QkIsIDB4MjgsMHgwMCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweEY2LDB4ODQsIDB4NDIsMHhDMCwgMHhGNiwweDA2LCAweDQyLDB4QzAsIDB4NzcsMHgzMSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIAorMHhGRiwweEU1LCAweDc1LDB4QjEsIDB4MDAsMHgxRSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNCwgMHhGRiwweEYwLCAweEY3LDB4MDQsIAorMHg0RiwweDU4LCAweDc2LDB4QjUsIDB4MDAsMHgwNiwgMHhDNCwweDM4LCAweDY4LDB4MDAsIDB4ODcsMHgyMiwgMHgwMCwweDE0LCAweDc2LDB4QTEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzMsIAorMHgyOCwweDAwLCAweEY3LDB4MDQsIDB4NDIsMHhDMCwgMHg3NSwweEFDLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg1RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweDIwLDB4M0EsIDB4MDAsMHgwMSwgMHhFNiwweDAwLCAweENDLDB4NEMsIDB4RjYsMHgwNiwgMHg0MiwweDkwLCAweEY3LDB4MDQsIAorMHg0MiwweDkwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4MDQsIDB4ODUsMHgxNiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHg5NSwweDE2LCAweEZGLDB4RjQsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhDRCwweDAwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NSwweDE2LCAweEZGLDB4RjQsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhDQywweEJDLCAweEY1LDB4ODYsIDB4NDIsMHhDMCwgMHhGNywweDA0LCAweDQyLDB4OTAsIDB4RjYsMHgwNiwgMHg0MiwweDkyLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4Q0MsMHhFQywgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4RjAsMHgyQiwgMHgyOCwweDAwLCAweEY2LDB4ODQsIAorMHg0MiwweEMwLCAweDc3LDB4MkQsIDB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4MDYsMHgyOCwgMHgwMCwweDE0LCAweEM2LDB4QjQsIAorMHg3NywweEMwLCAweDc2LDB4QjQsIDB4RkYsMHhGMCwgMHhGNywweDA0LCAweDRGLDB4NTgsIDB4RjYsMHhCMywgMHgyOCwweDAwLCAweEM3LDB4MjgsIAorMHg3MiwweDAwLCAweDc3LDB4MzgsIDB4RkYsMHhGQSwgMHhGNywweDJGLCAweDI4LDB4MDAsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwNCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHg4NiwweDk2LCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHg0RiwweDU4LCAweEY0LDB4MDIsIAorMHgwMCwweDAwLCAweEM2LDB4QjQsIDB4NzIsMHgwMCwgMHg3NywweDM0LCAweEZGLDB4RkEsIDB4MjcsMHgzOCwgMHgwMCwweDAyLCAweDIwLDB4M0EsIAorMHgwMCwweDYxLCAweEY3LDB4MDIsIDB4MDAsMHgzRiwgMHhFMiwweDAwLCAweENELDB4NDAsIDB4QzYsMHhCNCwgMHg3NCwweDAwLCAweDIwLDB4MzYsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4Q0QsMHg0MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjQsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDQsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4ODYsMHgxNiwgMHgwMCwweDAwLCAweDg3LDB4MTYsIAorMHgwMCwweDA4LCAweDg1LDB4OTYsIDB4MDAsMHgwNCwgMHhDNSwweDMwLCAweDcwLDB4MDAsIDB4QzAsMHgzMiwgMHg1MiwweDAwLCAweEU2LDB4MDAsIAorMHhDRCwweEExLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NiwweEIyLCAweDAwLDB4MDAsIDB4NzcsMHgzMSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIAorMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RTgsIDB4RjYsMHhBRiwgMHg2OCwweDAwLCAweDA2LDB4MzAsIAorMHgwMCwweDAxLCAweEMwLDB4MzIsIDB4NTIsMHgwMCwgMHhFNiwweDAwLCAweENELDB4NzgsIDB4MDUsMHhBQywgMHgwMCwweDAxLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MEMsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDg0LDB4OTYsIAorMHgwMCwweDAwLCAweDg0LDB4MTYsIDB4MDAsMHgwNCwgMHg4NSwweDk2LCAweDAwLDB4MDgsIDB4ODYsMHhBNiwgMHgwMCwweDAwLCAweDc3LDB4MjUsIAorMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzUsMHgzNSwgMHhGRiwweEYwLCAweDIwLDB4MkEsIAorMHgwMCwweDEwLCAweEUyLDB4MDAsIDB4Q0UsMHgwRCwgMHhGNiwweDA2LCAweDQyLDB4OEUsIDB4RjUsMHgwMiwgMHgwMCwweDEwLCAweEY3LDB4MDQsIAorMHg0MiwweDhDLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4MjAsMHgyRSwgMHgwMCwweDAxLCAweEU2LDB4MDAsIAorMHhDRSwweDcwLCAweDIwLDB4MkEsIDB4MDAsMHgwMCwgMHhFRSwweDAwLCAweENFLDB4NzEsIDB4MDcsMHgyNCwgMHgwMCwweDAyLCAweDI1LDB4MjgsIAorMHgwMCwweDAxLCAweEE1LDB4QkEsIDB4NTAsMHgwMiwgMHg4NiwweDIyLCAweDAwLDB4MDAsIDB4NzYsMHhBMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NTAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM1LDB4QUMsIAorMHg3NywweEMwLCAweEM2LDB4MzAsIDB4NkYsMHhDMCwgMHg3NiwweDMxLCAweEZGLDB4RjAsIDB4NzUsMHhBRCwgMHhGRiwweEU4LCAweEY2LDB4ODIsIAorMHgwMCwweEZGLCAweEY3LDB4MDIsIDB4RjEsMHg1NCwgMHg3NSwweEFELCAweDAwLDB4MDIsIDB4QTcsMHgyRSwgMHg3MCwweDAyLCAweEM2LDB4MzAsIAorMHg2QywweDAwLCAweEM2LDB4MzAsIDB4NzUsMHg4MCwgMHhGNiwweDIzLCAweDI4LDB4MDAsIDB4MjQsMHgyMCwgMHgwMCwweDAyLCAweDI1LDB4QTgsIAorMHgwMCwweDAxLCAweEYzLDB4MDIsIDB4RjIsMHg0NiwgMHgwMywweEE0LCAweDAwLDB4MDIsIDB4QzQsMHhBQywgMHgzOCwweDAwLCAweDI1LDB4MkMsIAorMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhFQywweDAwLCAweENGLDB4MTEsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEU2LDB4MDAsIAorMHhDRSwweEEwLCAweEM3LDB4MUMsIDB4NTAsMHgwMCwgMHhFMCwweDAwLCAweENFLDB4QjQsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweEE2LDB4OUUsIAorMHg1MCwweDAyLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4MzUsIAorMHhGRiwweEU4LCAweDg2LDB4QTYsIDB4MDAsMHgwMCwgMHg3NywweDI1LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweDI1LDB4MjgsIAorMHgwMCwweDAyLCAweDI1LDB4QUMsIDB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNSwgMHhGRiwweEU4LCAweDc3LDB4MzEsIAorMHgwMCwweDA0LCAweEM3LDB4MzgsIDB4NjIsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MDEsIDB4QzcsMHgzOCwgMHgzMCwweDAwLCAweEM2LDB4QjQsIAorMHg2OCwweDAwLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MEUsIDB4ODcsMHgzNiwgMHgwMCwweDAwLCAweDI0LDB4QTQsIAorMHgwMCwweDAyLCAweDc2LDB4QjUsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjMsIDB4MjgsMHgwMCwgMHhFMCwweDAwLCAweENFLDB4ODQsIDB4MjQsMHgyMCwgMHgwMCwweDAyLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MEMsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4ODYsMHgxNiwgMHgwMCwweDA4LCAweDgzLDB4MTYsIAorMHgwMCwweDA0LCAweDgzLDB4OTYsIDB4MDAsMHgwMCwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweDA1LDB4OUMsIDB4MDAsMHgwMiwgMHg3NCwweDlELCAweDAwLDB4MUUsIDB4NzQsMHhBNCwgMHhGRiwweEU1LCAweDc0LDB4MUQsIAorMHgwMCwweDFFLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg3NSwweDMxLCAweDAwLDB4MUUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MUYsIDB4MjgsMHgwMCwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzUsMHgyOCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg1NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJGLCAweDI4LDB4MDAsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJGLCAweDI4LDB4MDAsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJGLCAweDI4LDB4MDAsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJGLCAweDI4LDB4MDAsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJGLCAweDI4LDB4MDAsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJGLCAweDI4LDB4MDAsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJGLCAweDI4LDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHg3NiwweDMxLCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJGLCAweDI4LDB4MDAsIDB4ODcsMHgxRSwgMHgwMCwweDAwLCAweDc0LDB4MjAsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NEYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MUYsIAorMHgyOCwweDAwLCAweDg3LDB4MUUsIDB4MDAsMHgwMCwgMHgwNCwweDlDLCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg0NywweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweDI1LDB4MzgsIDB4MDAsMHgwMSwgMHgyMCwweDJBLCAweDAwLDB4MDAsIDB4RUUsMHgwMCwgMHhEMCwweEJELCAweDI2LDB4MjgsIAorMHgwMCwweDAxLCAweEE3LDB4MjYsIDB4NjAsMHgwMiwgMHhDNiwweEE0LCAweDYwLDB4MDAsIDB4NzYsMHhCNSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM1LDB4QTQsIDB4NTAsMHgwMCwgMHhDNSwweDMwLCAweDAwLDB4MDAsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEU4LCAweEUwLDB4MDAsIDB4RDAsMHg4OCwgMHhGNywweDJGLCAweDY4LDB4MDAsIDB4MDcsMHgxQywgMHgwMCwweDAyLCAweEYzLDB4M0IsIAorMHg2OCwweDAwLCAweEM0LDB4MUMsIDB4MDAsMHgwMCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDBDLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDg2LDB4MTYsIDB4MDAsMHgwNCwgMHg4NCwweDE2LCAweDAwLDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHgwNSwweEEwLCAweDAwLDB4MDIsIDB4NzQsMHhBMSwgMHgwMCwweDFFLCAweDc0LDB4QTQsIAorMHhGRiwweEU1LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg3NSwweDMxLCAweDAwLDB4MUUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjMsIDB4MjgsMHgwMCwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzUsMHgyOCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg1NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJGLCAweDI4LDB4MDAsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJGLCAweDI4LDB4MDAsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJGLCAweDI4LDB4MDAsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJGLCAweDI4LDB4MDAsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJGLCAweDI4LDB4MDAsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJGLCAweDI4LDB4MDAsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJGLCAweDI4LDB4MDAsIDB4MDUsMHhBQywgMHgwMCwweDAyLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHgwNiwweEEwLCAweDAwLDB4MDIsIDB4NzYsMHgzMSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyRiwgMHgyOCwweDAwLCAweDg3LDB4MjIsIAorMHgwMCwweDAwLCAweDc2LDB4MjEsIDB4MDAsMHgxRSwgMHg4NSwweDk2LCAweDAwLDB4MDgsIDB4QzcsMHgzOCwgMHg0RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHhGNSwweEI3LCAweDY4LDB4MDAsIDB4ODcsMHgyMiwgMHgwMCwweDAwLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MjMsIAorMHgyOCwweDAwLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDBDLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIAorMHgwMCwweDIwLCAweDI3LDB4MTQsIDB4MDAsMHgyMCwgMHhGMCwweDNCLCAweDI4LDB4MDAsIDB4ODQsMHg5NiwgMHgwMCwweDA0LCAweEY1LDB4MDIsIAorMHgwMCwweDAwLCAweDg2LDB4QTYsIDB4MDAsMHgwMCwgMHg3NiwweDI1LCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweDA0LDB4MjQsIAorMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4NjcsMHhDMCwgMHg3NiwweEI0LCAweEZGLDB4RjAsIDB4RjYsMHhCQiwgMHgyOCwweDAwLCAweDg3LDB4MjYsIAorMHgwMCwweDAwLCAweDc2LDB4QTUsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweEMwLDB4MkEsIDB4NzIsMHgwMCwgMHhFQywweDAwLCAweEQyLDB4RjgsIDB4NzYsMHhBNSwgMHgwMCwweDFFLCAweDg3LDB4MjYsIAorMHgwMCwweDAwLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHgwNiwweDI4LCAweDAwLDB4MDEsIDB4MjUsMHg5NCwgMHgwMCwweDFFLCAweEM1LDB4QUMsIAorMHg1MCwweDAwLCAweEM1LDB4MzAsIDB4MDAsMHgwMCwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweEM3LDB4MzgsIAorMHg1MiwweDAwLCAweEE2LDB4QTIsIDB4NzAsMHgwMiwgMHhDNywweDIwLCAweDcwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIAorMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RTgsIDB4QzYsMHg4MCwgMHg2QSwweDAwLCAweEUwLDB4MDAsIAorMHhEMiwweDkwLCAweEY2LDB4QUYsIDB4NjgsMHgwMCwgMHg4NywweDE2LCAweEZGLDB4RTAsIDB4NzYsMHgxNSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweDgzLDB4OTYsIDB4MDAsMHgwMCwgMHgyMywweDE0LCAweDAwLDB4MUUsIDB4NzUsMHg5OSwgMHgwMCwweDFFLCAweDc1LDB4QUMsIAorMHhGRiwweEU1LCAweDc1LDB4MTUsIDB4MDAsMHgxRSwgMHg3NSwweDI4LCAweEZGLDB4RTUsIDB4NzQsMHg5NSwgMHgwMCwweDFFLCAweDc0LDB4QTQsIAorMHhGRiwweEU1LCAweDc0LDB4MTUsIDB4MDAsMHgxRSwgMHg3NCwweDIwLCAweEZGLDB4RTUsIDB4MDYsMHg5QywgMHgwMCwweDAyLCAweDczLDB4OTUsIAorMHgwMCwweDFFLCAweDkzLDB4OTYsIDB4RkYsMHhEQywgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4ODMsMHg5NiwgMHgwMCwweDAwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MUYsIDB4MjgsMHgwMCwgMHg4MywweDk2LCAweEZGLDB4REMsIDB4ODcsMHgxQSwgMHgwMCwweDAwLCAweDczLDB4OUMsIAorMHhGRiwweEU1LCAweDkzLDB4OTYsIDB4RkYsMHhEQywgMHhDNywweDM4LCAweDVGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4RTQsIDB4MjMsMHgxNCwgMHgwMCwweDFBLCAweDc2LDB4MTksIAorMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDU3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDg3LDB4MUEsIDB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4ODcsMHgxNiwgMHhGRiwweEU4LCAweDIzLDB4MTQsIAorMHgwMCwweDE2LCAweDc2LDB4MTksIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg0RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDFBLCAweDAwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweEM3LDB4MzgsIAorMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweDg3LDB4MTYsIAorMHhGRiwweEVDLCAweDIzLDB4MTQsIDB4MDAsMHgxMiwgMHg3NiwweDE5LCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg0NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODcsMHgxQSwgMHgwMCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDAyLCAweDg0LDB4MTYsIDB4MDAsMHgwMCwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDg3LDB4MTYsIDB4RkYsMHhGMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHgzRiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDA4LCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDg2LDB4MTYsIDB4MDAsMHgwMCwgMHg4NCwweDE2LCAweDAwLDB4MDQsIDB4RjYsMHg4NCwgMHg0RiwweDU4LCAweDg3LDB4MzIsIAorMHgwMCwweDE0LCAweDAzLDB4MzAsIDB4MDAsMHgxNCwgMHg3NSwweDE5LCAweDAwLDB4MUUsIDB4NzUsMHgyOCwgMHhGRiwweEU1LCAweEMzLDB4QTAsIAorMHg2QSwweDAwLCAweDczLDB4OUMsIDB4RkYsMHhGQSwgMHgwNCwweEEwLCAweDAwLDB4MTQsIDB4NzUsMHhBNSwgMHgwMCwweDFFLCAweEM2LDB4MzAsIAorMHg2QSwweDAwLCAweDc2LDB4MzAsIDB4RkYsMHhGQSwgMHhDNywweDM4LCAweDU3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweEYzLDB4OUIsIDB4MjgsMHgwMCwgMHgwNywweDIwLCAweDAwLDB4MTYsIDB4RjYsMHgzQiwgMHgyOCwweDAwLCAweDg3LDB4MjIsIAorMHgwMCwweDE0LCAweDc1LDB4QUMsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDVGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweDc3LDB4MzksIAorMHgwMCwweDA2LCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MTYsIDB4RjMsMHhCNywgMHgyOCwweDAwLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDgsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4ODYsMHgxNiwgMHgwMCwweDAwLCAweEY1LDB4ODQsIAorMHg0RiwweDU4LCAweDA1LDB4MzAsIDB4MDAsMHgxNiwgMHg4NywweDJBLCAweDAwLDB4MDAsIDB4NzYsMHhBOSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4NzcsMHgzOSwgMHgwMCwweDA2LCAweEM0LDB4MkMsIAorMHg3MCwweDAwLCAweEMwLDB4MjIsIDB4NjIsMHgwMCwgMHhFNiwweDAwLCAweEQ1LDB4MjksIDB4MDYsMHhBMCwgMHgwMCwweDE2LCAweDg3LDB4MzYsIAorMHgwMCwweDAwLCAweEM2LDB4MzAsIDB4NUEsMHgwMCwgMHg3NiwweDMwLCAweEZGLDB4RkEsIDB4NzYsMHhCNSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4NzcsMHgzOSwgMHgwMCwweDA2LCAweDc2LDB4QjgsIAorMHhGRiwweEZBLCAweEY2LDB4QUIsIDB4MjgsMHgwMCwgMHhDNywweDJDLCAweDcwLDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDE0LCAweEUwLDB4MDAsIAorMHhENSwweDJDLCAweEY2LDB4M0IsIDB4MjgsMHgwMCwgMHhDNCwweDJDLCAweDAwLDB4MDAsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwNCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNywweDA2LCAweDRGLDB4ODQsIDB4NDcsMHgzOCwgMHhGRiwweEZDLCAweEY3LDB4MDUsIAorMHg2RiwweDMwLCAweEY2LDB4ODYsIDB4NTAsMHg1QywgMHg0NiwweEI0LCAweEZGLDB4RkMsIDB4RjYsMHg4NSwgMHg2RSwweDUwLCAweEY3LDB4MDYsIAorMHg2RSwweDdDLCAweDQ3LDB4MzgsIDB4RkYsMHhGQywgMHhGNywweDA1LCAweDZFLDB4NTQsIDB4MDcsMHgzNCwgMHgxOSwweDFDLCAweEY3LDB4MDUsIAorMHg0RiwweDVDLCAweEY3LDB4MDIsIDB4MDAsMHg2NCwgMHg5NywweDM2LCAweDE5LDB4MUMsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweDk3LDB4MzYsIAorMHgxOSwweDIwLCAweDA2LDB4QjQsIDB4MDAsMHgxQywgMHhGNiwweDg1LCAweDRGLDB4NTgsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4OTAsIDB4RjMsMHgwMiwgMHhGRiwweEZGLCAweEYzLDB4MDUsIAorMHg0RiwweDU0LCAweEYzLDB4ODIsIDB4MDAsMHgwMCwgMHg5MywweDk2LCAweEZGLDB4QUMsIDB4MjMsMHgxNCwgMHgwMCwweDIwLCAweDkzLDB4MTYsIAorMHhGRiwweDlDLCAweDIzLDB4OTQsIDB4MDAsMHgzOCwgMHg5MywweDk2LCAweEZGLDB4OTQsIDB4ODMsMHgxNiwgMHhGRiwweEFDLCAweEY3LDB4MDQsIAorMHg0RiwweDVDLCAweEYzLDB4ODIsIDB4MDAsMHgwQywgMHg5MywweDk2LCAweEZGLDB4NzQsIDB4OTMsMHgxNiwgMHhGRiwweDhDLCAweDg3LDB4M0EsIAorMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NywweDE2LCAweEZGLDB4QTQsIDB4ODMsMHgxNiwgMHhGRiwweEFDLCAweDgzLDB4OTYsIAorMHhGRiwweEE0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDFBLCAweDNBLDB4MDAsIDB4RUMsMHgwMCwgMHhEQiwweDc4LCAweEYzLDB4MDIsIAorMHgwNCwweEJDLCAweEY3LDB4MDQsIDB4NEYsMHg1QywgMHg4MywweDE2LCAweEZGLDB4NzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MzgsIAorMHgzMCwweDAwLCAweDg3LDB4M0EsIDB4MDAsMHgwOCwgMHhGNiwweDg0LCAweDRGLDB4NTgsIDB4NzcsMHgzOSwgMHgwMCwweDA2LCAweEM0LDB4QjQsIAorMHg3MCwweDAwLCAweDk0LDB4OTMsIDB4RkYsMHhGQywgMHg5NCwweDk2LCAweEZGLDB4N0MsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhDRCwweDAwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NCwweDk2LCAweEZGLDB4N0MsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhENiwweDU0LCAweEM1LDB4MDQsIDB4MDAsMHgwMCwgMHhGNywweDA0LCAweDQyLDB4ODgsIDB4RTAsMHgwMCwgMHhEOCwweDdDLCAweEY2LDB4MDYsIAorMHg0MiwweDg4LCAweEY2LDB4MDQsIDB4NEYsMHg1QywgMHg4MywweDk2LCAweDAwLDB4MDAsIDB4ODMsMHgxNiwgMHhGRiwweDc0LCAweDg2LDB4OUUsIAorMHgwMCwweDAwLCAweEE3LDB4MzIsIDB4MzAsMHgwMiwgMHhGNSwweDgyLCAweDAwLDB4MDAsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHhENiwweDk0LCAweEM2LDB4MzAsIDB4MzAsMHgwMCwgMHg4NiwweDlFLCAweDAwLDB4MDQsIDB4ODcsMHgzMiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweEQ2LDB4OTgsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEY1LDB4ODIsIAorMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEQ2LDB4QTUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY1LDB4MDIsIAorMHgwMCwweDAwLCAweDgzLDB4OTYsIDB4MDAsMHgwMCwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4ODYsMHg5RSwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAwLCAweEQ2LDB4RTQsIDB4RjUsMHg4MiwgMHgwMCwweDAwLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4RDYsMHhFQywgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4ODYsMHg5RSwgMHgwMCwweDA0LCAweDg3LDB4MzIsIAorMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHhENiwweEVELCAweDIwLDB4MkUsIAorMHgwMCwweDAwLCAweEY1LDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhENiwweEZELCAweDIwLDB4MkEsIAorMHgwMCwweDAwLCAweEY1LDB4MDIsIDB4MDAsMHgwMSwgMHgyMCwweDJBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhENywweDI4LCAweDA0LDB4QTQsIAorMHgwMCwweDAyLCAweDgzLDB4MTYsIDB4RkYsMHhBQywgMHhGNywweDA2LCAweDQyLDB4QzgsIDB4ODMsMHg5NiwgMHhGRiwweDhDLCAweEYzLDB4MDUsIAorMHg0RiwweDU0LCAweEM3LDB4MUMsIDB4NzAsMHgwMCwgMHhGMCwweDNCLCAweDI4LDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDAyLCAweEUwLDB4MDAsIAorMHhEQiwweDUwLCAweEYwLDB4M0IsIDB4MjgsMHgwMCwgMHg5NCwweDk2LCAweEZGLDB4NkMsIDB4ODcsMHgyNiwgMHgwMCwweDAwLCAweDc2LDB4QTUsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHg4MywweDE2LCAweEZGLDB4NkMsIDB4ODMsMHg5NiwgMHhGRiwweDlDLCAweDI0LDB4OTQsIAorMHgwMCwweDFFLCAweDA2LDB4MTgsIDB4MDAsMHgwMiwgMHg3NSwweEIxLCAweDAwLDB4MUUsIDB4NzUsMHhBQywgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDFGLCAweDI4LDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc1LDB4MUQsIAorMHgwMCwweDFFLCAweDc1LDB4MjgsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDVGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHgxQywgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHgxQSwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHgxOCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHgxNiwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHgxNCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDI0LDB4OTQsIDB4MDAsMHgxMiwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4MjQsMHg5NCwgMHgwMCwweDEwLCAweDc2LDB4MzEsIAorMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDg3LDB4MTYsIDB4RkYsMHhFMCwgMHhGNiwweDgyLCAweEZGLDB4RkMsIDB4QzcsMHgzOCwgMHg1NywweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMywgMHhDNCwweEI4LCAweDZDLDB4MDAsIDB4MjAsMHgyNiwgMHgwMCwweDEwLCAweEUyLDB4MDAsIAorMHhEOCwweDlELCAweEY2LDB4MDYsIDB4NDIsMHg4QSwgMHhGNywweDA0LCAweDQyLDB4ODgsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEY0LDB4MDIsIDB4MDAsMHgwMCwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4REIsMHhBMCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4ODMsMHgxNiwgMHhGRiwweDZDLCAweDI1LDB4MTQsIAorMHgwMCwweDM2LCAweDgzLDB4OTYsIDB4RkYsMHg5NCwgMHg4NywweDFBLCAweDAwLDB4MDAsIDB4NzYsMHg5OSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweDA2LDB4MTgsIDB4MDAsMHgwMiwgMHg3NSwweEIxLCAweDAwLDB4MUUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MUYsIDB4MjgsMHgwMCwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzUsMHhBQywgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg1RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MjUsMHgxNCwgMHgwMCwweDM0LCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MjUsMHgxNCwgMHgwMCwweDMyLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MjUsMHgxNCwgMHgwMCwweDMwLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MjUsMHgxNCwgMHgwMCwweDJFLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MjUsMHgxNCwgMHgwMCwweDJDLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MjUsMHgxNCwgMHgwMCwweDJBLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MjUsMHgxNCwgMHgwMCwweDI4LCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHgyNiwweEE0LCAweDAwLDB4MDIsIDB4NzQsMHhBNCwgMHhGRiwweEZGLCAweDc2LDB4MzEsIAorMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MkIsIAorMHgyOCwweDAwLCAweDkwLDB4MTMsIDB4RkYsMHhGQywgMHg4MywweDE2LCAweEZGLDB4OEMsIDB4RjcsMHgwNiwgMHg0MiwweENDLCAweEM3LDB4MTgsIAorMHg3MCwweDAwLCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDk0LDB4OTYsIAorMHhGRiwweDdDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENELDB4QjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDgzLDB4OTYsIAorMHhGRiwweDZDLCAweDI0LDB4MTQsIDB4MDAsMHg0RSwgMHgyNSwweDE0LCAweDAwLDB4NTAsIDB4ODMsMHgxNiwgMHhGRiwweDhDLCAweDg0LDB4OTYsIAorMHhGRiwweDdDLCAweDg3LDB4MUUsIDB4MDAsMHgwMCwgMHg3NiwweDlELCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweDA2LDB4MUMsIAorMHgwMCwweDAyLCAweDc1LDB4QjEsIDB4MDAsMHgxRSwgMHg3NSwweEFDLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MkIsIDB4MjgsMHgwMCwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzUsMHgyOSwgMHgwMCwweDFFLCAweDc1LDB4MjgsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NUYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyMywgMHgyOCwweDAwLCAweDI0LDB4MTQsIAorMHgwMCwweDRDLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyMywgMHgyOCwweDAwLCAweDI0LDB4MTQsIAorMHgwMCwweDRBLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyMywgMHgyOCwweDAwLCAweDI0LDB4MTQsIAorMHgwMCwweDQ4LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyMywgMHgyOCwweDAwLCAweDI0LDB4MTQsIAorMHgwMCwweDQ2LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyMywgMHgyOCwweDAwLCAweDI0LDB4MTQsIAorMHgwMCwweDQ0LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyMywgMHgyOCwweDAwLCAweDI0LDB4MTQsIAorMHgwMCwweDQyLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyMywgMHgyOCwweDAwLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHgyNCwweDE0LCAweDAwLDB4NDAsIDB4NzYsMHgzMSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyMywgMHgyOCwweDAwLCAweDg2LDB4OTYsIAorMHhGRiwweEIwLCAweEY2LDB4MDYsIDB4NDIsMHhDOCwgMHhDNiwweDE4LCAweDYwLDB4MDAsIDB4RjcsMHgwMiwgMHgwMCwweDAzLCAweEM2LDB4QjQsIAorMHg1NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHhDNiwweEI0LCAweDc0LDB4MDAsIDB4RjcsMHgwMiwgMHgwMCwweDA0LCAweEM3LDB4MzgsIAorMHg2QSwweDAwLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4RjQsMHhCMywgMHgyOCwweDAwLCAweDgzLDB4OTYsIAorMHhGRiwweDhDLCAweDgzLDB4MTYsIDB4RkYsMHg3NCwgMHgwMywweDlDLCAweDAwLDB4MTQsIDB4OTMsMHg5NiwgMHhGRiwweDhDLCAweDAzLDB4MTgsIAorMHgwMCwweDBDLCAweDgzLDB4OTYsIDB4RkYsMHhBQywgMHg5MywweDE2LCAweEZGLDB4NzQsIDB4MDMsMHg5QywgMHgwMCwweDAxLCAweEUwLDB4MDAsIAorMHhENSwweEVDLCAweDkzLDB4OTYsIDB4RkYsMHhBQywgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4RjMsMHg4NCwgMHg0RiwweDVDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDA2LCAweDRBLDB4OTgsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjYsMHhGOCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjQsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDQsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMSwweEEwLCAweEY1LDB4MDIsIAorMHgwMCwweDAwLCAweEYzLDB4ODQsIDB4NkUsMHg1MCwgMHhGNiwweDAyLCAweDAwLDB4MUMsIDB4MjAsMHgyQSwgMHgwMCwweDYzLCAweEVFLDB4MDAsIAorMHhEQywweDA4LCAweEM1LDB4OUMsIDB4NjAsMHgwMCwgMHhBNiwweDlFLCAweDYwLDB4MDIsIDB4NzcsMHgyRCwgMHgwMCwweDFFLCAweDc3LDB4MzgsIAorMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4MjAsMHgzNiwgMHgwMCwweDAzLCAweEU2LDB4MDAsIAorMHhEQiwweEZDLCAweDA3LDB4MkMsIDB4MDAsMHgzNiwgMHhGMCwweDNCLCAweDI4LDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDQwLCAweEUwLDB4MDAsIAorMHhEQiwweENDLCAweDA1LDB4MjgsIDB4MDAsMHgwMSwgMHhGNSwweDg0LCAweDRGLDB4NUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg2LDB4QUUsIAorMHgwMCwweDA4LCAweEY0LDB4MDIsIDB4MDAsMHgwMCwgMHg4NywweDJFLCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEVDLDB4MDAsIDB4REMsMHhGMCwgMHg5NiwweDk2LCAweEZGLDB4RUMsIDB4NzcsMHgzNSwgMHgwMCwweDAxLCAweEM3LDB4MzgsIAorMHg2OCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhDNiwweDM4LCAweDU4LDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDBDLCAweEMzLDB4ODQsIAorMHgwMCwweDAwLCAweDgzLDB4MTYsIDB4MDAsMHgwMCwgMHg4NiwweEIyLCAweDAwLDB4MDAsIDB4ODcsMHgxQSwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweERDLDB4N0MsIDB4QzUsMHgyMCwgMHgwMCwweDAwLCAweDg2LDB4QjIsIAorMHgwMCwweDA0LCAweDg3LDB4MUEsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHhEQywweDgwLCAweDIwLDB4MkEsIDB4MDAsMHgwMCwgMHhGNSwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhEQywweDhELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGMywweDgyLCAweDAwLDB4MDAsIDB4ODQsMHg5NiwgMHgwMCwweDAwLCAweDg2LDB4QjIsIAorMHgwMCwweDAwLCAweDg3LDB4MjYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEUyLDB4MDAsIAorMHhEQywweENDLCAweEY1LDB4MDIsIDB4MDAsMHgwMCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHhEQywweEQ0LCAweDIwLDB4MkEsIAorMHgwMCwweDAwLCAweDg2LDB4QjIsIDB4MDAsMHgwNCwgMHg4NywweDI2LCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEUyLDB4MDAsIDB4REMsMHhENSwgMHgyMCwweDJBLCAweDAwLDB4MDAsIDB4RjUsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MkEsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4REMsMHhFNSwgMHgyMCwweDFFLCAweDAwLDB4MDAsIDB4RjMsMHg4MiwgMHgwMCwweDAxLCAweDIwLDB4MUUsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4REMsMHhGNCwgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RjQsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MjIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4REQsMHgyOSwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4ODcsMHgxNiwgMHhGRiwweEVDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDc2LDB4QjksIDB4MDAsMHgwMSwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4NzYsMHhCNSwgMHgwMCwweDAyLCAweEM2LDB4QjQsIAorMHg1OCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgxNCwgMHg4NiwweEI2LCAweDAwLDB4MDAsIDB4OTcsMHgxNiwgMHhGRiwweEYwLCAweEUwLDB4MDAsIAorMHhERCwweDk4LCAweDk2LDB4OTYsIDB4RkYsMHhGNCwgMHgyNywweDE0LCAweDAwLDB4MTQsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDgzLDB4MTYsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDk1LDB4OTYsIAorMHhGRSwweDcwLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDI1LDB4NjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg1LDB4OTYsIAorMHhGRSwweDcwLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweERELDB4OTUsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4MTYsIAorMHhGRiwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NiwweEI5LCAweDAwLDB4MDEsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweDc2LDB4QjUsIAorMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4NTgsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MTQsIDB4ODYsMHhCNiwgMHgwMCwweDAwLCAweDk3LDB4MTYsIAorMHhGRiwweEYwLCAweDk2LDB4OTYsIDB4RkYsMHhGNCwgMHg5NywweDJFLCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhERCwweDlDLCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhERCwweEIwLCAweEY0LDB4ODIsIAorMHgwMCwweDAwLCAweEY3LDB4MDQsIDB4NDIsMHg3QywgMHhFMCwweDAwLCAweEUwLDB4OUMsIDB4RjYsMHgwNiwgMHg0MiwweDdFLCAweDk0LDB4OTYsIAorMHhGRiwweDQ0LCAweDg3LDB4MTYsIDB4RkYsMHhGNCwgMHhGNiwweDA0LCAweDRGLDB4NTgsIDB4NzcsMHgzOSwgMHgwMCwweDA2LCAweEM3LDB4MzAsIAorMHg3MCwweDAwLCAweDk3LDB4MTYsIDB4RkYsMHg1NCwgMHgwNiwweEI4LCAweDAwLDB4MUEsIDB4ODcsMHgzNiwgMHgwMCwweDAwLCAweDgzLDB4MTYsIAorMHhGRiwweDU0LCAweDc2LDB4QjUsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDkzLDB4MTMsIAorMHhGRiwweEZDLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHg3NywweDM5LCAweDAwLDB4MDYsIDB4QzYsMHgzMCwgMHg3MCwweDAwLCAweDk2LDB4MTYsIAorMHhGRiwweDRDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENELDB4MDAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDIwLDB4MjIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4REUsMHgzNSwgMHhGMywweDAyLCAweDAwLDB4MDEsIDB4ODQsMHg5NiwgMHhGRiwweDRDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDk0LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhDRCwweDAwLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweERFLDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEYzLDB4MDIsIAorMHgwMCwweDAxLCAweDkzLDB4MTYsIDB4RkYsMHg0NCwgMHg4NCwweDk2LCAweEZGLDB4NDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MjYsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4REUsMHg1OSwgMHhGNiwweDA2LCAweDQyLDB4QTQsIDB4RjcsMHgwNCwgMHg0MiwweEE0LCAweEUwLDB4MDAsIAorMHhFMCwweEEwLCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg4MywweDE2LCAweEZGLDB4NEMsIDB4ODYsMHgxNiwgMHhGRiwweDRDLCAweDg3LDB4MUEsIAorMHgwMCwweDAwLCAweDc2LDB4OTksIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweDIwLDB4M0EsIDB4MDAsMHgwMiwgMHhFNiwweDAwLCAweERFLDB4ODUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY2LDB4MDQsIAorMHg0RiwweDU4LCAweEY1LDB4ODQsIDB4NEYsMHg1OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzMiwgMHg1QSwweDAwLCAweEU2LDB4MDAsIAorMHhFMCwweDI1LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NCwweDk2LCAweEZGLDB4NEMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4QTQsIAorMHgwMCwweDFBLCAweDg3LDB4MzYsIDB4MDAsMHgwMCwgMHg4MywweDE2LCAweEZGLDB4NTQsIDB4NzYsMHhCNSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4NzcsMHgzOSwgMHgwMCwweDA2LCAweEM3LDB4MkMsIAorMHg3MCwweDAwLCAweEMwLDB4M0EsIDB4MzIsMHgwMCwgMHhFNiwweDAwLCAweERFLDB4REQsIDB4RjYsMHgwNiwgMHg0MiwweDgwLCAweEY3LDB4MDQsIAorMHg0MiwweDgwLCAweEUwLDB4MDAsIDB4RTAsMHhBMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4MjYsMHgxNCwgMHgwMCwweDMwLCAweEYwLDB4MzMsIAorMHgyOCwweDAwLCAweDg3LDB4MTYsIDB4RkYsMHhEMCwgMHg3NiwweDMxLCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweDg0LDB4OTYsIAorMHhGRiwweDRDLCAweDIzLDB4MTQsIDB4MDAsMHgyRSwgMHg5MywweDE2LCAweEZFLDB4NjQsIDB4NzUsMHg5OSwgMHgwMCwweDFFLCAweDc1LDB4QUMsIAorMHhGRiwweEU1LCAweDc1LDB4MTUsIDB4MDAsMHgxRSwgMHg3NSwweDI4LCAweEZGLDB4RTUsIDB4NzMsMHgxNSwgMHgwMCwweDFFLCAweDczLDB4MTgsIAorMHhGRiwweEU1LCAweDkzLDB4MTYsIDB4RkYsMHgzNCwgMHg4MywweDE2LCAweEZFLDB4NjQsIDB4MDQsMHgyNCwgMHgwMCwweDAyLCAweDA2LDB4QTAsIAorMHgwMCwweDAyLCAweDc0LDB4OTUsIDB4MDAsMHgxRSwgMHg3NCwweEE0LCAweEZGLDB4RTUsIDB4OTQsMHg5NiwgMHhGRiwweDNDLCAweDc0LDB4OTUsIAorMHgwMCwweDFFLCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyMywgMHgyOCwweDAwLCAweDg3LDB4MUEsIAorMHgwMCwweDAwLCAweDc0LDB4QTQsIDB4RkYsMHhFNSwgMHg5NCwweDk2LCAweEZGLDB4MkMsIDB4QzcsMHgzOCwgMHg1RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4ODcsMHgxNiwgMHhGRiwweEQ0LCAweDI0LDB4OTQsIAorMHgwMCwweDJBLCAweDk0LDB4OTYsIDB4RkUsMHg2NCwgMHg3NiwweDI1LCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg1NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODcsMHgyNiwgMHgwMCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhEOCwgMHgyMywweDE0LCAweDAwLDB4MjYsIDB4OTMsMHgxNiwgMHhGRSwweDY0LCAweDc2LDB4MTksIAorMHgwMCwweDFFLCAweDg0LDB4OTYsIDB4RkYsMHgzQywgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg0RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDFBLCAweDAwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweDg0LDB4OTYsIAorMHhGRiwweDM0LCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhEQywgMHgyMywweDE0LCAweDAwLDB4MjIsIDB4OTMsMHgxNiwgMHhGRSwweDY0LCAweDc2LDB4MTksIAorMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDRGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDg3LDB4MUEsIDB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDE2LCAweEZGLDB4RTAsIDB4ODMsMHgxNiwgMHhGRiwweDJDLCAweDA2LDB4QjQsIAorMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4MzcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RTAsMHgwMCwgMHhFQSwweEEwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENCLDB4Q0MsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDA2LDB4QTAsIAorMHgwMCwweDAyLCAweEY3LDB4MDQsIDB4NEYsMHg1OCwgMHhGMCwweDM3LCAweDI4LDB4MDAsIDB4MDYsMHhBMCwgMHgwMCwweDE0LCAweDk0LDB4MTYsIAorMHhGRiwweDI0LCAweEM3LDB4MjAsIDB4NzIsMHgwMCwgMHg3NywweDM4LCAweEZGLDB4RkEsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDA2LDB4QTAsIAorMHgwMCwweDE2LCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHhGNCwweDgyLCAweDAwLDB4MDEsIDB4RjQsMHhBMywgMHgyOCwweDAwLCAweDk0LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENELDB4MDAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDIwLDB4MjIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4RTAsMHhCQywgMHgyNiwweDk0LCAweDAwLDB4NDgsIDB4RjcsMHgwNCwgMHg0MiwweDgwLCAweEUwLDB4MDAsIAorMHhFMCwweDlDLCAweEY2LDB4MDYsIDB4NDIsMHg4MiwgMHg4NiwweDk2LCAweEZFLDB4RjQsIDB4RTAsMHgwMCwgMHhFMiwweDk0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NDIsMHg4NCwgMHhGNiwweDA2LCAweDQyLDB4ODQsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEY0LDB4MDIsIDB4MDAsMHgwMCwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4RUEsMHhBNCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4ODMsMHgxNiwgMHhGRiwweDRDLCAweDc1LDB4MTUsIAorMHgwMCwweDFFLCAweDc1LDB4MjgsIDB4RkYsMHhFNSwgMHg5MywweDE2LCAweEZGLDB4MUMsIDB4MDcsMHgxOCwgMHgwMCwweDM2LCAweEY0LDB4ODIsIAorMHgwMCwweDAxLCAweEY0LDB4QkIsIDB4MjgsMHgwMCwgMHhGMCwweDM3LCAweDI4LDB4MDAsIDB4ODcsMHgxNiwgMHhGRiwweEI4LCAweDc2LDB4QjUsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHgwNCwweDE4LCAweDAwLDB4MDIsIDB4MDYsMHgyMCwgMHgwMCwweDAyLCAweDIzLDB4MTQsIAorMHgwMCwweDQ2LCAweDkzLDB4MTYsIDB4RkYsMHgxNCwgMHg3NSwweDk5LCAweDAwLDB4MUUsIDB4NzUsMHhBQywgMHhGRiwweEU1LCAweDc0LDB4OTUsIAorMHgwMCwweDFFLCAweDc0LDB4QTQsIDB4RkYsMHhFNSwgMHg5NCwweDk2LCAweEZGLDB4MEMsIDB4NzMsMHgxNSwgMHgwMCwweDFFLCAweDczLDB4MTgsIAorMHhGRiwweEU1LCAweDkzLDB4MTYsIDB4RkYsMHgwNCwgMHg3NCwweDk1LCAweDAwLDB4MUUsIDB4NzQsMHhBNCwgMHhGRiwweEU1LCAweDk0LDB4OTYsIAorMHhGRSwweEZDLCAweDIzLDB4MDAsIDB4MDAsMHgwNywgMHg5MywweDE2LCAweEZFLDB4RjQsIDB4ODQsMHg5NiwgMHhGRiwweDFDLCAweDgzLDB4MTYsIAorMHhGRiwweDE0LCAweDA0LDB4QTQsIDB4MDAsMHgwQSwgMHg5NCwweDk2LCAweEZFLDB4N0MsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjMsIDB4MjgsMHgwMCwgMHhGNiwweDg0LCAweDRGLDB4NTgsIDB4ODQsMHg5NiwgMHhGRiwweDU0LCAweDg3LDB4MUEsIAorMHgwMCwweDAwLCAweEM2LDB4QTQsIDB4NkEsMHgwMCwgMHg3NCwweDM0LCAweEZGLDB4RkEsIDB4QzcsMHgzOCwgMHg1RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgxNiwgMHhGRiwweEJDLCAweDIzLDB4MTQsIAorMHgwMCwweDQyLCAweDkzLDB4MTYsIDB4RkYsMHgxNCwgMHg3NiwweDk5LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg1NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4ODcsMHgxQSwgMHgwMCwweDAwLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhDMCwgMHgyNCwweDk0LCAweDAwLDB4M0UsIDB4OTQsMHg5NiwgMHhGRiwweDE0LCAweDc2LDB4QTUsIAorMHgwMCwweDFFLCAweDgzLDB4MTYsIDB4RkYsMHgwQywgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHgzNywweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHg4NywweDI2LCAweDAwLDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MTYsIAorMHhGRiwweEM0LCAweDI0LDB4OTQsIDB4MDAsMHgzQSwgMHg5NCwweDk2LCAweEZGLDB4MTQsIDB4NzYsMHhBNSwgMHgwMCwweDFFLCAweDgzLDB4MTYsIAorMHhGRiwweDA0LCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDM3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzMsIAorMHgyOCwweDAwLCAweDg3LDB4MjYsIDB4MDAsMHgwMCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHg4NywweDE2LCAweEZGLDB4QzgsIDB4ODQsMHg5NiwgMHhGRSwweEZDLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NEYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweDgzLDB4MTYsIAorMHhGRSwweEY0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDFBLCAweDAwLDB4MDcsIDB4RUUsMHgwMCwgMHhFMiwweDk0LCAweEY2LDB4ODIsIAorMHgwMCwweDA4LCAweDg0LDB4OTYsIDB4RkUsMHg3QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgyNCwgMHgwMCwweDBFLCAweDg2LDB4QkEsIAorMHgwMCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjUsIAorMHhGRiwweEYwLCAweEY3LDB4MDIsIDB4MDAsMHhGRiwgMHhDNiwweEI0LCAweDc0LDB4MDAsIDB4NDcsMHgyMSwgMHgwMCwweDAwLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhFMCwweDg4LCAweDA0LDB4QTQsIAorMHgwMCwweDAyLCAweDk0LDB4OTYsIDB4RkUsMHg3QywgMHgwMywweDE4LCAweDAwLDB4MDEsIDB4RTAsMHgwMCwgMHhFMiwweDMwLCAweDkzLDB4MTYsIAorMHhGRSwweEY0LCAweDgzLDB4MTYsIDB4RkYsMHgxQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgxOCwgMHgwMCwweDM4LCAweEY2LDB4QkIsIAorMHgyOCwweDAwLCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHg4NCwweDk2LCAweEZGLDB4MjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk0LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEQ0LDB4MkMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDIzLDB4MTQsIAorMHgwMCwweDc4LCAweDkzLDB4MTYsIDB4RkUsMHhCQywgMHg4NCwweDk2LCAweDAwLDB4MDAsIDB4MjMsMHgxNCwgMHgwMCwweEE4LCAweDg2LDB4QTYsIAorMHgwMCwweDA0LCAweDg3LDB4MjYsIDB4MDAsMHgwMCwgMHg5MywweDE2LCAweEZFLDB4OUMsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweDk2LDB4OTYsIAorMHhGRSwweEVDLCAweEY3LDB4MDIsIDB4MDAsMHgwMSwgMHhDNywweDM0LCAweDc0LDB4MDAsIDB4OTcsMHgxNiwgMHhGRSwweEU0LCAweDg0LDB4OTYsIAorMHhGRiwweDI0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NCwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhENCwweEI0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA0LCAweDRGLDB4NTgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MjIsIAorMHg3MiwweDAwLCAweEU2LDB4MDAsIDB4RUEsMHhBMSwgMHg5NCwweDE2LCAweEZGLDB4MUMsIDB4ODYsMHhBMiwgMHgwMCwweDM4LCAweDc3LDB4MjEsIAorMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhGMywweDAyLCAweDAwLDB4MDAsIDB4OTMsMHgxNiwgMHhGRSwweEQ0LCAweEM2LDB4QjQsIAorMHg3NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHg5NiwweDk2LCAweEZFLDB4REMsIDB4ODQsMHg5NiwgMHhGRSwweEQ0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4MjYsIDB4MDAsMHgwRSwgMHhFRSwweDAwLCAweEUyLDB4RjAsIDB4RjMsMHgwMiwgMHgwMCwweDBGLCAweDkzLDB4MTMsIAorMHhGRiwweEZDLCAweDgzLDB4MTYsIDB4RkUsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzcsMHgxOCwgMHg0OCwweDAwLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDI3LDB4RTgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEMzLDB4QTAsIAorMHgwMCwweDAwLCAweDg0LDB4OTYsIDB4RkUsMHhFNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgyNiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhFMywweDhELCAweDIzLDB4OUMsIDB4MDAsMHgwNywgMHhDMywweDgwLCAweDNBLDB4MDAsIDB4QzcsMHgxQywgMHgzOCwweDAwLCAweDgzLDB4MTYsIAorMHhGRiwweDFDLCAweEY0LDB4ODIsIDB4MDAsMHhGRiwgMHhGNiwweDA0LCAweDRGLDB4NTgsIDB4QzcsMHgxOCwgMHg3MCwweDAwLCAweDA3LDB4MzgsIAorMHgwMCwweDI2LCAweDg2LDB4QkEsIDB4MDAsMHgwMCwgMHg5NywweDE2LCAweEZFLDB4QzQsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIAorMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI1LCAweEZGLDB4RjAsIDB4QzYsMHhCNCwgMHg0QywweDAwLCAweDc2LDB4QjUsIAorMHgwMCwweDA2LCAweEMzLDB4MzAsIDB4NjgsMHgwMCwgMHgwNywweDMwLCAweDAwLDB4NDAsIDB4QzAsMHgxQSwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHhFNCwweDBELCAweDkzLDB4MTYsIDB4RkUsMHhDQywgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4OTMsMHg5NiwgMHhGRSwweDc0LCAweDk2LDB4MTYsIAorMHhGRSwweDZDLCAweDk2LDB4OTYsIDB4RkUsMHg2OCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhDRCwweDAwLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDgzLDB4OTYsIDB4RkUsMHg3NCwgMHg4NiwweDE2LCAweEZFLDB4NkMsIDB4ODYsMHg5NiwgMHhGRSwweDY4LCAweDIwLDB4MjIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4RTAsMHg5NSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjUsMHg4NCwgMHg0RiwweDU4LCAweDg0LDB4OTYsIAorMHhGRSwweENDLCAweDA3LDB4MkMsIDB4MDAsMHg0MCwgMHhDMCwweDI2LCAweDcyLDB4MDAsIDB4RTYsMHgwMCwgMHhFQSwweDhELCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEE3LDB4MzIsIDB4NjgsMHgwMiwgMHg3NiwweEE1LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweDg2LDB4MTYsIAorMHhGRSwweENDLCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MjAsMHgzQSwgMHgwMCwweDAyLCAweEU2LDB4MDAsIAorMHhFNCwweDUxLCAweEMwLDB4MzIsIDB4NUEsMHgwMCwgMHhDNiwweDJDLCAweDAwLDB4MDAsIDB4QzAsMHgzMiwgMHg1QSwweDAwLCAweEU2LDB4MDAsIAorMHhFNiwweEU1LCAweDI1LDB4MTQsIDB4MDAsMHg3NiwgMHg4MywweDE2LCAweEZGLDB4MUMsIDB4ODQsMHg5NiwgMHhGRSwweEJDLCAweDA2LDB4MTgsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweDgzLDB4MTYsIAorMHhGRSwweERDLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg3NSwweEIxLCAweDAwLDB4MUUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzUsMHhBQywgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg1RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MjUsMHgxNCwgMHgwMCwweDc0LCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MjUsMHgxNCwgMHgwMCwweDcyLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MjUsMHgxNCwgMHgwMCwweDcwLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MjUsMHgxNCwgMHgwMCwweDZFLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MjUsMHgxNCwgMHgwMCwweDZDLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MjUsMHgxNCwgMHgwMCwweDZBLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHg2OCwgMHg3NiwweDMxLCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4QzcsMHgxQywgMHgzMiwweDAwLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDk0LDB4OTMsIDB4RkYsMHhGQywgMHgyNiwweDE0LCAweDAwLDB4NjAsIDB4OTYsMHgxMywgMHhGRiwweEZDLCAweDk2LDB4MTYsIAorMHhGRSwweDZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEQwLDB4REMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4MTYsIAorMHhGRiwweEEwLCAweDg2LDB4MTYsIDB4RkUsMHg2QywgMHg4NCwweDk2LCAweEZFLDB4Q0MsIDB4MjMsMHgxNCwgMHgwMCwweDVFLCAweDkzLDB4MTYsIAorMHhGRSwweDVDLCAweDc1LDB4OTksIDB4MDAsMHgxRSwgMHg3NSwweEFDLCAweEZGLDB4RTUsIDB4NzQsMHgxNSwgMHgwMCwweDFFLCAweDc0LDB4MjAsIAorMHhGRiwweEU1LCAweDczLDB4MTUsIDB4MDAsMHgxRSwgMHg3MywweDE4LCAweEZGLDB4RTUsIDB4OTMsMHgxNiwgMHhGRSwweEFDLCAweDgzLDB4MTYsIAorMHhGRSwweDVDLCAweDc2LDB4MzEsIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4MDUsMHgyNCwgMHgwMCwweDAyLCAweDA2LDB4QTgsIAorMHgwMCwweDAyLCAweDc0LDB4OTUsIDB4MDAsMHgxRSwgMHg3NCwweEE0LCAweEZGLDB4RTUsIDB4OTQsMHg5NiwgMHhGRSwweEI0LCAweDc0LDB4OTUsIAorMHgwMCwweDFFLCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyQiwgMHgyOCwweDAwLCAweDg3LDB4MUEsIAorMHgwMCwweDAwLCAweDc0LDB4QTQsIDB4RkYsMHhFNSwgMHg5NCwweDk2LCAweEZFLDB4QTQsIDB4QzcsMHgzOCwgMHg1RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4ODcsMHgxNiwgMHhGRiwweEE0LCAweDI0LDB4OTQsIAorMHgwMCwweDVBLCAweDk0LDB4OTYsIDB4RkUsMHg1QywgMHg3NiwweDI1LCAweDAwLDB4MUUsIDB4ODMsMHgxNiwgMHhGRSwweEI0LCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4MzcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MjYsIAorMHgwMCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHg4NywweDE2LCAweEZGLDB4QTgsIDB4MjQsMHg5NCwgMHgwMCwweDU2LCAweDk0LDB4OTYsIAorMHhGRSwweDVDLCAweDc2LDB4MjUsIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg0NywweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDI2LCAweDAwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweEM3LDB4MzgsIAorMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweDg3LDB4MTYsIAorMHhGRiwweEFDLCAweDIzLDB4MTQsIDB4MDAsMHg1MiwgMHg5MywweDE2LCAweEZFLDB4NUMsIDB4NzYsMHgxOSwgMHgwMCwweDFFLCAweDg0LDB4OTYsIAorMHhGRSwweEFDLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDRGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDg3LDB4MUEsIDB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDE2LCAweEZGLDB4QjAsIDB4ODMsMHgxNiwgMHhGRSwweEE0LCAweDA2LDB4QjQsIAorMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4MzcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RTAsMHgwMCwgMHhFQSwweDhDLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDg0LDB4OTYsIDB4RkUsMHhDQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDQsMHhBNCwgMHgwMCwweDM2LCAweDk0LDB4OTYsIAorMHhGRSwweDVDLCAweDg3LDB4MjYsIDB4MDAsMHgwMCwgMHg3NiwweEE1LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4RUEsMHg4RCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODMsMHgxNiwgMHhGRSwweENDLCAweDg0LDB4OTYsIAorMHhGRiwweDFDLCAweDA2LDB4MTgsIDB4MDAsMHgzQSwgMHg4NSwweEIyLCAweDAwLDB4MDAsIDB4MDcsMHgyNCwgMHgwMCwweDNBLCAweDg2LDB4QkEsIAorMHgwMCwweDAwLCAweDc2LDB4MzEsIDB4MDAsMHgxRSwgMHg3NiwweDMwLCAweEZGLDB4RTUsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIAorMHhGRiwweEU1LCAweEM1LDB4QUMsIDB4NjcsMHhDMCwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzUsMHhBRCwgMHhGRiwweEYwLCAweDc2LDB4QjUsIAorMHhGRiwweEYwLCAweEMwLDB4MkUsIDB4NkEsMHgwMCwgMHhFQywweDAwLCAweEU3LDB4NjQsIDB4RjUsMHgwMiwgMHgwMCwweDAyLCAweEY1LDB4MDIsIAorMHgwMCwweDAxLCAweDgzLDB4MTYsIDB4RkYsMHgxQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgxOCwgMHgwMCwweDM2LCAweDg2LDB4QkEsIAorMHgwMCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjUsIAorMHhGRiwweEYwLCAweDIwLDB4MzYsIDB4MDAsMHgwMiwgMHhFNiwweDAwLCAweEU3LDB4OUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MkEsIAorMHgwMCwweDAxLCAweEU2LDB4MDAsIDB4RUEsMHg4RCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODQsMHg5NiwgMHhGRSwweDVDLCAweDgzLDB4MTYsIAorMHhGRiwweDFDLCAweEY1LDB4MjcsIDB4MjgsMHgwMCwgMHgwNiwweDE4LCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHgyNSwweDE0LCAweDAwLDB4QTYsIDB4ODQsMHg5NiwgMHhGRSwweDlDLCAweDgzLDB4MTYsIAorMHhGRSwweERDLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg3NSwweEIxLCAweDAwLDB4MUUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MjcsIDB4MjgsMHgwMCwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzUsMHhBQywgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg1RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MjUsMHgxNCwgMHgwMCwweEE0LCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MjUsMHgxNCwgMHgwMCwweEEyLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MjUsMHgxNCwgMHgwMCwweEEwLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MjUsMHgxNCwgMHgwMCwweDlFLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MjUsMHgxNCwgMHgwMCwweDlDLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MjUsMHgxNCwgMHgwMCwweDlBLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4MDYsMHgzMCwgMHgwMCwweDAyLCAweDg3LDB4MzIsIAorMHgwMCwweDAwLCAweDI1LDB4MTQsIDB4MDAsMHg5OCwgMHg3NiwweDMxLCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDJCLCAweDI4LDB4MDAsIDB4QzcsMHgxQywgMHgzMiwweDAwLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDk0LDB4OTMsIDB4RkYsMHhGQywgMHgyNiwweDE0LCAweDAwLDB4OTAsIDB4OTYsMHgxMywgMHhGRiwweEZDLCAweDk2LDB4MTYsIAorMHhGRSwweDZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEQwLDB4REMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4MTYsIAorMHhGRiwweDcwLCAweDg2LDB4MTYsIDB4RkUsMHg2QywgMHg4NCwweDk2LCAweEZFLDB4Q0MsIDB4MjMsMHg5NCwgMHgwMCwweDhFLCAweDc1LDB4OUQsIAorMHgwMCwweDFFLCAweDc1LDB4QUMsIDB4RkYsMHhFNSwgMHg3MywweDE1LCAweDAwLDB4MUUsIDB4NzMsMHgxOCwgMHhGRiwweEU1LCAweDkzLDB4MTYsIAorMHhGRSwweDk0LCAweDc0LDB4MTUsIDB4MDAsMHgxRSwgMHg3NCwweDIwLCAweEZGLDB4RTUsIDB4NzMsMHgxNSwgMHgwMCwweDFFLCAweDczLDB4MTgsIAorMHhGRiwweEU1LCAweDkzLDB4MTYsIDB4RkUsMHg4NCwgMHg4MywweDE2LCAweEZFLDB4OTQsIDB4NzYsMHgzMSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweDA1LDB4MjQsIDB4MDAsMHgwMiwgMHgwNiwweEE4LCAweDAwLDB4MDIsIDB4NzQsMHg5NSwgMHgwMCwweDFFLCAweDc0LDB4QTQsIAorMHhGRiwweEU1LCAweDk0LDB4OTYsIDB4RkUsMHg4QywgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MkIsIAorMHgyOCwweDAwLCAweDg0LDB4OTYsIDB4RkUsMHhDNCwgMHg4NywweDFFLCAweDAwLDB4MDAsIDB4NzUsMHgyNSwgMHgwMCwweDFFLCAweEM3LDB4MzgsIAorMHg1RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweDg3LDB4MTYsIAorMHhGRiwweDc0LCAweDIzLDB4OTQsIDB4MDAsMHg4QSwgMHg3NiwweDFELCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweDg0LDB4OTYsIAorMHhGRSwweDhDLCAweDc1LDB4MjgsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDM3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MzcsIAorMHgyOCwweDAwLCAweDg3LDB4MUUsIDB4MDAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MDIsIDB4ODMsMHgxNiwgMHhGRSwweDg0LCAweEM3LDB4MzgsIAorMHg2NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweDg3LDB4MTYsIAorMHhGRiwweDc4LCAweDIzLDB4OTQsIDB4MDAsMHg4NiwgMHg3NiwweDFELCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg0NywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODcsMHgxRSwgMHgwMCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHg3QywgMHgyMywweDk0LCAweDAwLDB4ODIsIDB4NzYsMHgxRCwgMHgwMCwweDFFLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NEYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MUUsIAorMHgwMCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwMiwgMHg4NCwweDk2LCAweEZFLDB4QzQsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDE2LCAweEZGLDB4ODAsIDB4MDYsMHhCNCwgMHgwMCwweDAyLCAweEM3LDB4MzgsIAorMHgzNywweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODcsMHgyNiwgMHgwMCwweDAwLCAweEYzLDB4MDIsIAorMHgwMCwweEZGLCAweEM3LDB4MzgsIDB4NTcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RTgsIDB4QzYsMHhCOCwgMHgzNCwweDAwLCAweEY3LDB4MDIsIAorMHgwMCwweDgwLCAweEM3LDB4MzQsIDB4NzQsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MTAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4RUEsMHg2MSwgMHgyNywweDAwLCAweDAxLDB4MDAsIDB4QzYsMHhCNCwgMHg3NSwweDgwLCAweDg0LDB4OTYsIAorMHhGRSwweENDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDI0LCAweDAwLDB4MzgsIDB4RjYsMHhCQiwgMHgyOCwweDAwLCAweDk0LDB4OTMsIAorMHhGRiwweEZDLCAweDgzLDB4MTYsIDB4RkYsMHgyNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4RDQsMHgyQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODQsMHg5NiwgMHhGRSwweEQ0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA0LDB4QTQsIDB4MDAsMHgwMSwgMHhFMCwweDAwLCAweEUzLDB4M0MsIDB4OTQsMHg5NiwgMHhGRSwweEQ0LCAweEY0LDB4MDIsIAorMHgwMCwweDAxLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDA0LCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDg2LDB4MTYsIAorMHgwMCwweDA4LCAweDg2LDB4OTYsIDB4MDAsMHgwQywgMHhGNSwweDAyLCAweEZGLDB4RkMsIDB4ODUsMHg5NiwgMHgwMCwweDA0LCAweDg0LDB4MTYsIAorMHgwMCwweDEwLCAweEY0LDB4ODQsIDB4RTAsMHgwMCwgMHgwNywweDMwLCAweDAwLDB4MDIsIDB4OTQsMHhCMiwgMHgwMCwweDEwLCAweEY0LDB4ODQsIAorMHhFMCwweDA0LCAweDA2LDB4QjQsIDB4MDAsMHgwMywgMHg5NCwweEIyLCAweDAwLDB4MTQsIDB4RjQsMHg4NCwgMHhFMCwweDFDLCAweEM2LDB4QjQsIAorMHg1NCwweDAwLCAweDk0LDB4QjIsIDB4MDAsMHgxOCwgMHhGNCwweDgyLCAweDAwLDB4MDUsIDB4RjQsMHhCMywgMHgyOCwweDAwLCAweEY0LDB4ODIsIAorMHgwMCwweDAxLCAweEY0LDB4QkIsIDB4MjgsMHgwMCwgMHgyNywweDM0LCAweDAwLDB4MDgsIDB4OTcsMHgzMiwgMHgwMCwweDA0LCAweDg2LDB4MTYsIAorMHgwMCwweDAwLCAweDA3LDB4MkMsIDB4MDAsMHgwMywgMHhDNywweDM4LCAweDU0LDB4MDAsIDB4QzYsMHhCOCwgMHg2OCwweDAwLCAweDk2LDB4OTMsIAorMHhGRiwweEZDLCAweEM2LDB4MzAsIDB4NzIsMHgwMCwgMHg5NiwweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwMiwgMHgwMCwweDAzLCAweEM1LDB4QUMsIAorMHg3NCwweDAwLCAweEY3LDB4MDIsIDB4MDAsMHgwNCwgMHhDNywweDM4LCAweDVBLDB4MDAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEMxLDB4MjAsIDB4MDAsMHgwMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgxNCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4MTgsIDB4ODcsMHgxNiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDgzLDB4QkEsIDB4MDAsMHgwMCwgMHg4NCwweDk2LCAweDAwLDB4MDAsIDB4OTMsMHg5NiwgMHhGRiwweEYwLCAweEYzLDB4ODQsIAorMHg2RSwweDU0LCAweDg3LDB4M0EsIDB4MDAsMHgwNCwgMHg5MywweDk2LCAweEZGLDB4RUMsIDB4OTcsMHgxNiwgMHhGRiwweEY0LCAweDkwLDB4MTMsIAorMHhGRiwweEZDLCAweDI3LDB4MUMsIDB4MDAsMHgwMiwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHgyNCwgMHgwMCwweDIwLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDk0LDB4OTYsIDB4RkYsMHhFNCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhDRCwweEI4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDg0LDB4OTYsIDB4RkYsMHhFNCwgMHg4MywweDk2LCAweDAwLDB4MDgsIDB4ODcsMHgyNiwgMHgwMCwweDE4LCAweDg1LDB4MTYsIAorMHhGRiwweEVDLCAweEMwLDB4M0EsIDB4M0EsMHgwMCwgMHhFRSwweDAwLCAweEVDLDB4N0MsIDB4RjUsMHg4MiwgMHgwMCwweDAxLCAweDg3LDB4MjYsIAorMHgwMCwweDE4LCAweDgzLDB4OTYsIDB4MDAsMHgwOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgxRSwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHhFQywweDdDLCAweEM1LDB4ODQsIDB4MDAsMHgwMCwgMHg4NiwweEE2LCAweDAwLDB4MTAsIDB4ODcsMHgxNiwgMHhGRiwweEYwLCAweEY2LDB4MDIsIAorMHgwMCwweDAwLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweEVDLDB4MUMsIDB4MDQsMHgyNCwgMHgwMCwweDEwLCAweDg2LDB4QTYsIAorMHgwMCwweDE0LCAweDg3LDB4MTYsIDB4RkYsMHhGNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHhFQywweDIwLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhFQywweDJELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNSwweDgyLCAweDAwLDB4MDAsIDB4ODYsMHhBMiwgMHgwMCwweDAwLCAweDg3LDB4MTYsIAorMHhGRiwweEYwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTIsMHgwMCwgMHhFQywweDY4LCAweEY2LDB4MDIsIAorMHgwMCwweDAwLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAwLCAweEVDLDB4NzAsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweDg2LDB4QTIsIAorMHgwMCwweDA0LCAweDg3LDB4MTYsIDB4RkYsMHhGNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEUyLDB4MDAsIAorMHhFQywweDcxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhFQywweDgxLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhGNSwweDgyLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhFQywweEFDLCAweEY3LDB4MDIsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDQyLDB4OUMsIDB4RjYsMHgwNiwgMHg0MiwweDlDLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHhGNywweDAyLCAweDAwLDB4MDEsIDB4OTcsMHgyQSwgMHgwMCwweDA4LCAweDgzLDB4QTYsIAorMHgwMCwweDBDLCAweDc3LDB4MkMsIDB4RkYsMHhFMSwgMHg5MywweEFBLCAweDAwLDB4MEMsIDB4OTcsMHgyQSwgMHgwMCwweDFDLCAweDgzLDB4QTYsIAorMHgwMCwweDFDLCAweEY3LDB4MDQsIDB4NkUsMHg1MCwgMHg5MywweEFBLCAweDAwLDB4MjAsIDB4ODMsMHhCQSwgMHgxRCwweERDLCAweEY2LDB4ODIsIAorMHgwMCwweDAwLCAweDkzLDB4QUEsIDB4MDAsMHgyQywgMHg4MywweDk2LCAweDAwLDB4MEMsIDB4QzUsMHhCNCwgMHgwMCwweDAwLCAweDkzLDB4QUEsIAorMHgwMCwweDMwLCAweDgzLDB4QkEsIDB4MDAsMHgxMCwgMHhDNiwweDM0LCAweDAwLDB4MDAsIDB4OTMsMHhBQSwgMHgwMCwweDI0LCAweDg3LDB4M0EsIAorMHgwMCwweDE0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NywweDJBLCAweDAwLDB4MjgsIDB4MjAsMHgzNiwgMHgwMCwweDFGLCAweEVFLDB4MDAsIAorMHhFRCwweDFDLCAweEM3LDB4MzAsIDB4NTAsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MzQsIDB4OTUsMHhCQSwgMHgwMCwweDAwLCAweDA2LDB4MzAsIAorMHgwMCwweDA0LCAweEUwLDB4MDAsIDB4RUMsMHhGQywgMHgwNiwweEI0LCAweDAwLDB4MDEsIDB4ODMsMHg5NiwgMHgwMCwweDEwLCAweDc2LDB4QTUsIAorMHgwMCwweDFFLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDgyLCAweDAwLDB4QjQsIDB4OTMsMHg5MywgMHhGRiwweEZDLCAweDk1LDB4MTMsIAorMHhGRiwweEZDLCAweDg3LDB4MjYsIDB4MDAsMHgyMCwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg4MywweDk2LCAweEZGLDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEVBLDB4QjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MTQsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDE4LCAweDg3LDB4MTYsIAorMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NiwweDNBLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk2LDB4MTYsIAorMHhGRiwweEYwLCAweDg3LDB4M0EsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTcsMHgxNiwgMHhGRiwweEY0LCAweEY2LDB4MDIsIAorMHgxRCwweEUwLCAweDk2LDB4MTMsIDB4RkYsMHhGQywgMHg4NiwweDE2LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk2LDB4MTMsIAorMHhGRiwweEZDLCAweEY2LDB4MDQsIDB4NkUsMHg1MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTYsMHgxMywgMHhGRiwweEZDLCAweDI2LDB4MTQsIAorMHgwMCwweDEwLCAweDk2LDB4MTYsIDB4RkYsMHhFQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyNiwweEY4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY2LDB4ODQsIDB4NkUsMHg1MCwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4ODcsMHgzNiwgMHgxRCwweEQ4LCAweDk2LDB4MTYsIAorMHhGRiwweEU0LCAweDc2LDB4QjUsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY2LDB4ODYsIDB4NDIsMHhDMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODYsMHgxNiwgMHhGRiwweEVDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDk2LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhEQiwweEI0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEVFLDB4NEQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg2LDB4MTYsIAorMHhGRiwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NiwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhENSwweEEwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgyMCwweDIyLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhFRSwweDRELCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHg5NiwweDE2LCAweEZGLDB4RTQsIDB4ODQsMHgxNiwgMHhGRiwweEU0LCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDgsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4ODYsMHg5NiwgMHgwMCwweDA0LCAweDg2LDB4MTYsIAorMHgwMCwweDAwLCAweDg3LDB4MzYsIDB4MDAsMHgwOCwgMHg4NSwweDk2LCAweDAwLDB4MDgsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhFRSwweDk5LCAweDIwLDB4M0EsIDB4MDAsMHgwMywgMHhFNiwweDAwLCAweEVFLDB4RTksIDB4RjQsMHgwMiwgMHgwMCwweDAwLCAweEUwLDB4MDAsIAorMHhFRiwweDBDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweEIwLCAweDAwLDB4MUYsIDB4NzAsMHgzRSwgMHhGRiwweEUxLCAweEU2LDB4MDAsIAorMHhFRiwweDBELCAweEY0LDB4MDIsIDB4MDAsMHgwMCwgMHg4NSwweDE2LCAweDAwLDB4MTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4MTMsIAorMHhGRiwweEZDLCAweDg1LDB4MTYsIDB4MDAsMHgxMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDg1LDB4MTYsIAorMHgwMCwweDBDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDk2LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEVCLDB4NjAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEUwLDB4MDAsIAorMHhFRiwweDBDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweEIwLCAweDAwLDB4MUUsIDB4NzAsMHgzRSwgMHhGRiwweEUxLCAweEU2LDB4MDAsIAorMHhFRiwweDBELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4OTYsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4RUQsMHg3NCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgxOCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4MTgsIDB4RjQsMHg4MiwgMHgwMCwweDAwLCAweDg2LDB4OTYsIAorMHgwMCwweDAwLCAweEY2LDB4MDQsIDB4NEEsMHhBMCwgMHgyMywweDk0LCAweDAwLDB4MTAsIDB4ODQsMHgzNiwgMHgwMCwweDAwLCAweDk2LDB4MTYsIAorMHhGRiwweEU0LCAweEY3LDB4MDQsIDB4NEEsMHg5QywgMHg5NCwweDE2LCAweEZGLDB4RjAsIDB4ODUsMHgzNiwgMHgwMCwweDA0LCAweEMwLDB4MzIsIAorMHg3MiwweDAwLCAweEVDLDB4MDAsIDB4RjAsMHgxNCwgMHg5NSwweDE2LCAweEZGLDB4RjQsIDB4NzcsMHgzMSwgMHgwMCwweDAxLCAweEM3LDB4MzgsIAorMHg2MCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGMywweDA2LCAweDRBLDB4OTgsIDB4QzYsMHhCOCwgMHgzMCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDBDLCAweEM1LDB4ODQsIDB4MDAsMHgwMCwgMHg4NywweDM2LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIAorMHg0MiwweDAwLCAweEU2LDB4MDAsIDB4RUYsMHhBNCwgMHhDNiwweDI0LCAweDAwLDB4MDAsIDB4ODcsMHgzNiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NTIsMHgwMCwgMHhFNiwweDAwLCAweEVGLDB4QTgsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEY2LDB4MDIsIAorMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEVGLDB4QjUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY1LDB4ODIsIAorMHgwMCwweDAwLCAweDg2LDB4MzYsIDB4MDAsMHgwMCwgMHg4NywweDE2LCAweEZGLDB4RjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzIsIAorMHg3MiwweDAwLCAweEUyLDB4MDAsIDB4RUYsMHhGMCwgMHhGNSwweDAyLCAweDAwLDB4MDAsIDB4QzAsMHgzMiwgMHg3MiwweDAwLCAweEU2LDB4MDAsIAorMHhFRiwweEY4LCAweDIwLDB4MkEsIDB4MDAsMHgwMCwgMHg4NiwweEI2LCAweDAwLDB4MDQsIDB4ODcsMHgxNiwgMHhGRiwweEY0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFMiwweDAwLCAweEVGLDB4RjksIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweEY1LDB4MDIsIAorMHgwMCwweDAxLCAweDIwLDB4MkEsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEYwLDB4MDksIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEY1LDB4ODIsIAorMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEYwLDB4MTgsIDB4MjAsMHgyNiwgMHgwMCwweDAwLCAweEY0LDB4ODIsIAorMHgwMCwweDAxLCAweDIwLDB4MjYsIDB4MDAsMHgwMCwgMHhFNiwweDAwLCAweEYwLDB4NEQsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4MTYsIAorMHhGRiwweEU0LCAweEYzLDB4MDYsIDB4NEEsMHg5OCwgMHg3NiwweEI5LCAweDAwLDB4MDEsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweDc2LDB4QjUsIAorMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4MzAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MTQsIDB4ODYsMHhCNiwgMHgwMCwweDAwLCAweDk3LDB4MTYsIAorMHhGRiwweEU4LCAweEUwLDB4MDAsIDB4RjAsMHhCMCwgMHg5NiwweDk2LCAweEZGLDB4RUMsIDB4MjcsMHgxNCwgMHgwMCwweDFDLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDkzLDB4OTMsIDB4RkYsMHhGQywgMHhGMywweDA2LCAweDRBLDB4OTgsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjUsMHg2OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhGMCwweEFELCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHg4NywweDE2LCAweEZGLDB4RTQsIDB4RjMsMHgwNiwgMHg0QSwweDk4LCAweDc2LDB4QjksIAorMHgwMCwweDAxLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHg3NiwweEI1LCAweDAwLDB4MDIsIDB4QzYsMHhCNCwgMHgzMCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDE0LCAweDg2LDB4QjYsIDB4MDAsMHgwMCwgMHg5NywweDE2LCAweEZGLDB4RTgsIDB4OTYsMHg5NiwgMHhGRiwweEVDLCAweEY3LDB4MDUsIAorMHg0QSwweEEwLCAweEUwLDB4MDAsIDB4RjAsMHhCNCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEU2LDB4MDAsIDB4RjEsMHgyMSwgMHhGNCwweDAyLCAweDAwLDB4MDEsIDB4ODcsMHgxNiwgMHhGRiwweEU4LCAweEY2LDB4MDYsIAorMHg0MiwweEM4LCAweDc2LDB4QjksIDB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4NzYsMHhCNSwgMHgwMCwweDAyLCAweEE3LDB4MzYsIAorMHg2MCwweDAyLCAweDgzLDB4MTYsIDB4MDAsMHgwNCwgMHhDNiwweEI0LCAweDYwLDB4MDAsIDB4NzYsMHgzNSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweDA1LDB4MzQsIDB4MDAsMHgwMiwgMHg3NSwweEE5LCAweDAwLDB4MUUsIDB4QzcsMHgzOCwgMHg2NywweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweDk3LDB4MUEsIDB4MDAsMHgwMCwgMHg4NywweDJBLCAweDAwLDB4MDAsIDB4NzUsMHhBQywgMHhGRiwweEU1LCAweDgzLDB4MTYsIAorMHgwMCwweDA4LCAweEM3LDB4MzgsIDB4NUYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4OTcsMHgxQSwgMHgwMCwweDAwLCAweDgzLDB4MTYsIAorMHgwMCwweDBDLCAweDA2LDB4QjQsIDB4MDAsMHgwNCwgMHhFMCwweDAwLCAweEYxLDB4MjQsIDB4OTYsMHg5QSwgMHgwMCwweDAwLCAweEY0LDB4MDIsIAorMHgwMCwweDAwLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDEwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwMCwweDAwLCAweEI5LDB4MDAsIDB4MDAsMHgwMCwgMHhCQSwweDAwLCAweDAwLDB4MDAsIAorMHhCQiwweDAwLCAweDAwLDB4MDAsIDB4QkMsMHgwMCwgMHgwMCwweDAwLCAweEJELDB4MDAsIDB4MDAsMHgwMCwgMHhCRSwweDAwLCAweDAwLDB4MDAsIAorMHhCRiwweDAwLCAweDAwLDB4MDAsIDB4ODAsMHgwMCwgMHgwMCwweDAwLCAweDgxLDB4MDAsIDB4MDAsMHgwMCwgMHg4MiwweDAwLCAweDAwLDB4MDAsIAorMHg4MywweDAwLCAweDAwLDB4MDAsIDB4ODQsMHgwMCwgMHgwMCwweDAwLCAweDg1LDB4MDAsIDB4MDAsMHgwMCwgMHg4NiwweDAwLCAweDAwLDB4MDAsIAorMHg4NywweDAwLCAweEI5LDB4QjksIDB4QjksMHhCQSwgMHhCOSwweEJCLCAweEI5LDB4QkMsIDB4QjksMHhCRCwgMHhCOSwweEJFLCAweEI5LDB4QkYsIAorMHhCOSwweDgwLCAweEI5LDB4ODEsIDB4QjksMHg4MiwgMHhCOSwweDgzLCAweEI5LDB4ODQsIDB4QjksMHg4NSwgMHhCOSwweDg2LCAweEI5LDB4ODcsIAorMHhCQSwweEI5LCAweEJBLDB4QkEsIDB4QkEsMHhCQiwgMHhCQSwweEJDLCAweEJBLDB4QkQsIDB4QkEsMHhCRSwgMHhCQSwweEJGLCAweEJBLDB4ODAsIAorMHhCQSwweDgxLCAweEJBLDB4ODIsIDB4QkEsMHg4MywgMHhCQSwweDg0LCAweEJBLDB4ODUsIDB4QkEsMHg4NiwgMHhCQSwweDg3LCAweEJCLDB4QjksIAorMHhCQiwweEJBLCAweEJCLDB4QkIsIDB4QkIsMHhCQywgMHhCQiwweEJELCAweEJCLDB4QkUsIDB4QkIsMHhCRiwgMHhCQiwweDgwLCAweEJCLDB4ODEsIAorMHhCQiwweDgyLCAweEJCLDB4ODMsIDB4QkIsMHg4NCwgMHhCQiwweDg1LCAweEJCLDB4ODYsIDB4QkIsMHg4NywgMHhCQywweEI5LCAweEJDLDB4QkEsIAorMHhCQywweEJCLCAweEJDLDB4QkMsIDB4QkMsMHhCRCwgMHhCQywweEJFLCAweEJDLDB4QkYsIDB4QkMsMHg4MCwgMHhCQywweDgxLCAweEJDLDB4ODIsIAorMHhCQywweDgzLCAweEJDLDB4ODQsIDB4QkMsMHg4NSwgMHhCQywweDg2LCAweEJDLDB4ODcsIDB4QkQsMHhCOSwgMHhCRCwweEJBLCAweEJELDB4QkIsIAorMHhCRCwweEJDLCAweEJELDB4QkQsIDB4QkQsMHhCRSwgMHhCRCwweEJGLCAweEJELDB4ODAsIDB4QkQsMHg4MSwgMHhCRCwweDgyLCAweEJELDB4ODMsIAorMHhCRCwweDg0LCAweEJELDB4ODUsIDB4QkQsMHg4NiwgMHhCRCwweDg3LCAweEJFLDB4QjksIDB4QkUsMHhCQSwgMHhCRSwweEJCLCAweEJFLDB4QkMsIAorMHhCRSwweEJELCAweEJFLDB4QkUsIDB4QkUsMHhCRiwgMHhCRSwweDgwLCAweEJFLDB4ODEsIDB4QkUsMHg4MiwgMHhCRSwweDgzLCAweEJFLDB4ODQsIAorMHhCRSwweDg1LCAweEJFLDB4ODYsIDB4QkUsMHg4NywgMHhCRiwweEI5LCAweEJGLDB4QkEsIDB4QkYsMHhCQiwgMHhCRiwweEJDLCAweEJGLDB4QkQsIAorMHhCRiwweEJFLCAweEJGLDB4QkYsIDB4QkYsMHg4MCwgMHhCRiwweDgxLCAweEJGLDB4ODIsIDB4QkYsMHg4MywgMHhCRiwweDg0LCAweEJGLDB4ODUsIAorMHhCRiwweDg2LCAweEJGLDB4ODcsIDB4ODAsMHhCOSwgMHg4MCwweEJBLCAweDgwLDB4QkIsIDB4ODAsMHhCQywgMHg4MCwweEJELCAweDgwLDB4QkUsIAorMHg4MCwweEJGLCAweDgwLDB4ODAsIDB4ODAsMHg4MSwgMHg4MCwweDgyLCAweDgwLDB4ODMsIDB4ODAsMHg4NCwgMHg4MCwweDg1LCAweDgwLDB4ODYsIAorMHg4MCwweDg3LCAweDgxLDB4QjksIDB4ODEsMHhCQSwgMHg4MSwweEJCLCAweDgxLDB4QkMsIDB4ODEsMHhCRCwgMHg4MSwweEJFLCAweDgxLDB4QkYsIAorMHg4MSwweDgwLCAweDgxLDB4ODEsIDB4ODEsMHg4MiwgMHg4MSwweDgzLCAweDgxLDB4ODQsIDB4ODEsMHg4NSwgMHg4MSwweDg2LCAweDgxLDB4ODcsIAorMHg4MiwweEI5LCAweDgyLDB4QkEsIDB4ODIsMHhCQiwgMHg4MiwweEJDLCAweDgyLDB4QkQsIDB4ODIsMHhCRSwgMHg4MiwweEJGLCAweDgyLDB4ODAsIAorMHg4MiwweDgxLCAweDgyLDB4ODIsIDB4ODIsMHg4MywgMHg4MiwweDg0LCAweDgyLDB4ODUsIDB4ODIsMHg4NiwgMHg4MiwweDg3LCAweDgzLDB4QjksIAorMHg4MywweEJBLCAweDgzLDB4QkIsIDB4ODMsMHhCQywgMHg4MywweEJELCAweDgzLDB4QkUsIDB4ODMsMHhCRiwgMHg4MywweDgwLCAweDgzLDB4ODEsIAorMHg4MywweDgyLCAweDgzLDB4ODMsIDB4ODMsMHg4NCwgMHg4MywweDg1LCAweDgzLDB4ODYsIDB4ODMsMHg4NywgMHg4NCwweEI5LCAweDg0LDB4QkEsIAorMHg4NCwweEJCLCAweDg0LDB4QkMsIDB4ODQsMHhCRCwgMHg4NCwweEJFLCAweDg0LDB4QkYsIDB4ODQsMHg4MCwgMHg4NCwweDgxLCAweDg0LDB4ODIsIAorMHg4NCwweDgzLCAweDg0LDB4ODQsIDB4ODQsMHg4NSwgMHg4NCwweDg2LCAweDg0LDB4ODcsIDB4ODUsMHhCOSwgMHg4NSwweEJBLCAweDg1LDB4QkIsIAorMHg4NSwweEJDLCAweDg1LDB4QkQsIDB4ODUsMHhCRSwgMHg4NSwweEJGLCAweDg1LDB4ODAsIDB4ODUsMHg4MSwgMHg4NSwweDgyLCAweDg1LDB4ODMsIAorMHg4NSwweDg0LCAweDg1LDB4ODUsIDB4ODUsMHg4NiwgMHg4NSwweDg3LCAweDg2LDB4QjksIDB4ODYsMHhCQSwgMHg4NiwweEJCLCAweDg2LDB4QkMsIAorMHg4NiwweEJELCAweDg2LDB4QkUsIDB4ODYsMHhCRiwgMHg4NiwweDgwLCAweDg2LDB4ODEsIDB4ODYsMHg4MiwgMHg4NiwweDgzLCAweDg2LDB4ODQsIAorMHg4NiwweDg1LCAweDg2LDB4ODYsIDB4ODYsMHg4NywgMHg4NywweEI5LCAweDg3LDB4QkEsIDB4ODcsMHhCQiwgMHg4NywweEJDLCAweDg3LDB4QkQsIAorMHg4NywweEJFLCAweDg3LDB4QkYsIDB4ODcsMHg4MCwgMHg4NywweDgxLCAweDg3LDB4ODIsIDB4ODcsMHg4MywgMHg4NywweDg0LCAweDg3LDB4ODUsIAorMHg4NywweDg2LCAweDg3LDB4ODcsIDB4MDAsMHgwMCwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIAorMHgwMCwweDE4LCAweEY3LDB4MDQsIDB4NzUsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhGMywweDdELCAweEY2LDB4MDYsIDB4NDIsMHg5NiwgMHhGNywweDA0LCAweDQyLDB4OTQsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEY0LDB4MDIsIDB4MDAsMHgwMCwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4RjUsMHhFMCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4RjMsMHg4NCwgMHg2RiwweDMwLCAweDkwLDB4MTMsIAorMHhGRiwweEZDLCAweDI3LDB4MUMsIDB4MDAsMHgwMiwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4ODMsMHgxNiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHg5MywweDk2LCAweEZGLDB4RUMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhDRCwweEI4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4MywweDk2LCAweEZGLDB4RUMsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweDk3LDB4MUUsIAorMHgwMCwweDA4LCAweDgzLDB4MTYsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHgxRSwgMHgwMCwweDBDLCAweDgzLDB4MTYsIAorMHgwMCwweDA4LCAweDA0LDB4OUMsIDB4MDAsMHgyMiwgMHg5MywweDFFLCAweDAwLDB4MUMsIDB4ODMsMHgxNiwgMHgwMCwweDBDLCAweDkzLDB4OTYsIAorMHhGRiwweEY0LCAweDg3LDB4MUEsIDB4MDAsMHgwMCwgMHg3NiwweDk5LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweDA2LDB4MTgsIAorMHgwMCwweDAyLCAweDc1LDB4QjEsIDB4MDAsMHgxRSwgMHg3NSwweEFDLCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweDA2LDB4OUMsIDB4MDAsMHgyMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDk2LDB4OTYsIAorMHhGRiwweEU0LCAweDc1LDB4MzUsIDB4MDAsMHgxRSwgMHhDNywweDM4LCAweDVGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDA0LDB4OUMsIDB4MDAsMHgyNCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDA0LDB4OUMsIDB4MDAsMHgyNiwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDA0LDB4OUMsIDB4MDAsMHgyOCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDA0LDB4OUMsIDB4MDAsMHgyQSwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDA0LDB4OUMsIDB4MDAsMHgyQywgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDA0LDB4OUMsIDB4MDAsMHgyRSwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4MDQsMHg5QywgMHgwMCwweDMwLCAweDc2LDB4MzEsIAorMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDY3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MjcsIAorMHgyOCwweDAwLCAweDg3LDB4MUUsIDB4MDAsMHgyMCwgMHg3NSwweDI4LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg1NywweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweDIwLDB4M0EsIDB4MDAsMHgwOCwgMHhFRSwweDAwLCAweEY1LDB4OTgsIDB4RjMsMHgwNiwgMHgxNCwweEQ4LCAweDgzLDB4MTYsIAorMHhGRiwweEU0LCAweDg3LDB4MUUsIDB4MDAsMHgyMCwgMHg3NiwweDk5LCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHgyNSwweEI4LCAweDAwLDB4MDEsIDB4QzQsMHhBQywgMHg1OCwweDAwLCAweDA0LDB4MjQsIAorMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhFQywweDAwLCAweEY1LDB4OTUsIDB4RjUsMHgwMiwgMHgwMCwweDAwLCAweDgzLDB4MTYsIAorMHhGRiwweEU0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNiwweDE4LCAweDAwLDB4MDIsIDB4QTcsMHgzMiwgMHg1OCwweDAyLCAweEM2LDB4QjAsIAorMHg1OCwweDAwLCAweDc2LDB4QjUsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEU4LCAweEM2LDB4QjAsIDB4NDAsMHgwMCwgMHg3NywweEI4LCAweDAwLDB4MTgsIDB4NzAsMHgzRSwgMHhGRiwweEUxLCAweEU2LDB4MDAsIAorMHhGNSwweDdELCAweEY3LDB4MzcsIDB4NjgsMHgwMCwgMHhGNSwweDAyLCAweEZGLDB4RkYsIDB4QzcsMHgzMCwgMHg0OCwweDAwLCAweEY1LDB4M0IsIAorMHg2OCwweDAwLCAweDI0LDB4QTQsIDB4MDAsMHgwMiwgMHgyNCwweDIwLCAweDAwLDB4MDIsIDB4RTAsMHgwMCwgMHhGNSwweDM0LCAweDI1LDB4QUMsIAorMHgwMCwweDAxLCAweEYzLDB4MDYsIDB4MTQsMHhEOCwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4RjMsMHgwMiwgMHgwMCwweDM0LCAweDkzLDB4MTMsIAorMHhGRiwweEZDLCAweDgzLDB4MTYsIDB4RkYsMHhGNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDgzLDB4MTYsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDFBLCAweDAwLDB4MDAsIDB4NzYsMHg5OSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEVBLDB4QjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MTAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDEwLCAweEY3LDB4MDQsIAorMHg3NSwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhGNiwweDM5LCAweEY2LDB4MDYsIAorMHg0MiwweDk2LCAweEY3LDB4MDQsIDB4NDIsMHg5NCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEY0LDB4MDIsIAorMHgwMCwweDAwLCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEUwLDB4MDAsIAorMHhGNywweDQ4LCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHhGNSwweDA0LCAweDZGLDB4MzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4MTYsIAorMHhGRiwweEY0LCAweDkwLDB4MTMsIDB4RkYsMHhGQywgMHgyNywweDI4LCAweDAwLDB4MDIsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDg1LDB4OTYsIAorMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhDRCwweEI4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NSwweDE2LCAweDAwLDB4MDQsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweDg2LDB4QUEsIAorMHgwMCwweDAwLCAweDc3LDB4MjksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjUsIAorMHhGRiwweEYwLCAweEY3LDB4MDIsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDc0LDB4MDAsIDB4RTYsMHgwMCwgMHhGNiwweDk5LCAweDk2LDB4OTYsIAorMHhGRiwweEVDLCAweEM2LDB4MzgsIDB4MDAsMHgwMCwgMHg5NiwweDEzLCAweEZGLDB4RkMsIDB4ODUsMHg5NiwgMHhGRiwweEVDLCAweDg1LDB4MTYsIAorMHhGRiwweEY0LCAweDQ3LDB4MkMsIDB4RkYsMHhGRSwgMHgwNywweDM4LCAweDAwLDB4MDIsIDB4QzcsMHgyOCwgMHg3MiwweDAwLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDg1LDB4OTYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4Q0QsMHhCOCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODUsMHgxNiwgMHhGRiwweEY0LCAweEY3LDB4MDIsIAorMHgwMCwweDAyLCAweDk3LDB4MkEsIDB4MDAsMHgwOCwgMHg4NSwweDk2LCAweDAwLDB4MDgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4QUEsIAorMHgwMCwweDBDLCAweDg1LDB4OTYsIDB4MDAsMHgwQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHhBQSwgMHgwMCwweDFDLCAweEY1LDB4MDYsIAorMHgxNCwweEQ4LCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHhGNSwweDgyLCAweDAwLDB4MjAsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDg1LDB4MTYsIAorMHhGRiwweEY0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4ODUsMHg5NiwgMHgwMCwweDAwLCAweDg1LDB4MTYsIAorMHhGRiwweEVDLCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3NiwweEFELCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHhDNywweDM4LCAweDUwLDB4MDAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDg1LDB4OTYsIAorMHhGRiwweEY0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhFQSwweEI4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDEwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDg1LDB4OTYsIDB4MDAsMHgwMCwgMHg4NSwweDE2LCAweDAwLDB4MDQsIDB4ODcsMHgxNiwgMHgwMCwweDA4LCAweEY2LDB4MDIsIAorMHhGRiwweEZDLCAweDA2LDB4QTgsIDB4MDAsMHgwMywgMHhDNiwweEI0LCAweDY0LDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDAzLCAweEM3LDB4MzgsIAorMHg2NCwweDAwLCAweEM3LDB4MzQsIDB4NzAsMHgwMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4QzUsMHhBQywgMHg2QSwweDAwLCAweDk1LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDIsIDB4MDAsMHgwMywgMHhDNSwweDI4LCAweDc0LDB4MDAsIDB4RjcsMHgwMiwgMHgwMCwweDA0LCAweEM3LDB4MzgsIAorMHg1MiwweDAwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgxNCwweEQ4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDEwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIAorMHgwMCwweDEwLCAweEY3LDB4MDQsIDB4NzUsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhGOCwweDBELCAweEY2LDB4MDYsIDB4NDIsMHg5NiwgMHhGNywweDA0LCAweDQyLDB4OTQsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEY0LDB4MDIsIDB4MDAsMHgwMCwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4RjksMHgyMCwgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4RjUsMHgwNCwgMHg2RiwweDMwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDk1LDB4MTYsIDB4RkYsMHhGNCwgMHg5MCwweDEzLCAweEZGLDB4RkMsIDB4MjcsMHgyOCwgMHgwMCwweDAyLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDg1LDB4OTYsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4Q0QsMHhCOCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODUsMHgxNiwgMHgwMCwweDA0LCAweEY2LDB4MDIsIAorMHgwMCwweDAwLCAweDg2LDB4QUEsIDB4MDAsMHgwMCwgMHg3NywweDI5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIAorMHg3NywweEMwLCAweDc2LDB4QjUsIDB4RkYsMHhGMCwgMHhGNywweDAyLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3NCwweDAwLCAweEU2LDB4MDAsIAorMHhGOCwweDZELCAweDk2LDB4OTYsIDB4RkYsMHhFQywgMHhDNiwweDM4LCAweDAwLDB4MDAsIDB4OTYsMHgxMywgMHhGRiwweEZDLCAweDg1LDB4OTYsIAorMHhGRiwweEVDLCAweDg1LDB4MTYsIDB4RkYsMHhGNCwgMHg0NywweDJDLCAweEZGLDB4RkUsIDB4MDcsMHgzOCwgMHgwMCwweDAyLCAweEM3LDB4MjgsIAorMHg3MiwweDAwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg4NSwweDk2LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENELDB4QjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg1LDB4MTYsIAorMHhGRiwweEY0LCAweEY1LDB4ODIsIDB4MDAsMHgwNiwgMHhGNSwweEFCLCAweDI4LDB4MDAsIDB4ODUsMHg5NiwgMHgwMCwweDA4LCAweDA3LDB4MjgsIAorMHgwMCwweDAyLCAweDk1LDB4QUEsIDB4MDAsMHgwNCwgMHgwNSwweDE0LCAweDAwLDB4MEUsIDB4ODUsMHgyQSwgMHgwMCwweDAwLCAweDc3LDB4QTksIAorMHgwMCwweDFFLCAweDc3LDB4QkMsIDB4RkYsMHhFNSwgMHhDNSwweDI4LCAweDdGLDB4QzAsIDB4NzUsMHgyOSwgMHhGRiwweEYwLCAweEY1LDB4M0IsIAorMHgyOCwweDAwLCAweEY1LDB4ODYsIDB4MTQsMHhEOCwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4RjUsMHgwMiwgMHgwMCwweDA4LCAweDk1LDB4MTMsIAorMHhGRiwweEZDLCAweDg1LDB4OTYsIDB4MDAsMHgwMCwgMHg4NSwweDE2LCAweEZGLDB4RUMsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QUQsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweEM3LDB4MzgsIAorMHg1MCwweDAwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg4NSwweDk2LCAweEZGLDB4RjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEY3LDB4NUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MTAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDA4LCAweEY3LDB4MDQsIAorMHg3NSwweEVDLCAweDgzLDB4OTYsIDB4MDAsMHgwNCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMCwgMHhGQSwweDY0LCAweEY2LDB4MDYsIAorMHg0MiwweDk2LCAweEY1LDB4MDQsIDB4NkYsMHgzMCwgMHg5MCwweDEzLCAweEZGLDB4RkMsIDB4MjcsMHgyOCwgMHgwMCwweDAyLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDgzLDB4MTYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDkzLDB4OTYsIAorMHhGRiwweEY0LCAweDk1LDB4MTYsIDB4RkYsMHhGMCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHhDRCwweEI4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDg1LDB4MTYsIDB4RkYsMHhGMCwgMHhGMywweDAyLCAweDAwLDB4MDcsIDB4ODMsMHg5NiwgMHhGRiwweEY0LCAweEYzLDB4MkIsIAorMHgyOCwweDAwLCAweDA3LDB4MjgsIDB4MDAsMHgwMiwgMHhGMywweDAyLCAweDAwLDB4MDEsIDB4RjMsMHgzQiwgMHgyOCwweDAwLCAweDg3LDB4MUUsIAorMHgwMCwweDAwLCAweDc2LDB4OUQsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4MDUsMHg5QywgMHgwMCwweDAyLCAweDc2LDB4MkQsIAorMHgwMCwweDFFLCAweDc2LDB4MzAsIDB4RkYsMHhFNSwgMHg3NCwweDlELCAweDAwLDB4MUUsIDB4NzQsMHhBNCwgMHhGRiwweEU1LCAweDA0LDB4MUMsIAorMHgwMCwweDA2LCAweDgzLDB4MTYsIDB4MDAsMHgwMCwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweDA2LDB4QTgsIAorMHgwMCwweDA0LCAweEY3LDB4MzcsIDB4MjgsMHgwMCwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4MDYsMHhBOCwgMHgwMCwweDA2LCAweDc1LDB4QTEsIAorMHgwMCwweDFFLCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweDg3LDB4MUUsIAorMHgwMCwweDA0LCAweDc1LDB4QUMsIDB4RkYsMHhFNSwgMHgwNiwweEE4LCAweDAwLDB4MDgsIDB4NzYsMHgxOSwgMHgwMCwweDFFLCAweEM3LDB4MzgsIAorMHg0RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDM3LCAweDI4LDB4MDAsIDB4ODcsMHgyMiwgMHgwMCwweDAwLCAweDA2LDB4QTgsIAorMHgwMCwweDBBLCAweEM3LDB4MzgsIDB4NUYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgzNywgMHgyOCwweDAwLCAweEYzLDB4MDYsIAorMHgxNCwweEQ4LCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHhGMywweDAyLCAweDAwLDB4MEMsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDgzLDB4MTYsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDFBLCAweDAwLDB4MDAsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM3LDB4MzgsIAorMHg2NywweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4RjcsMHg1QywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMCwgMHhGQSwweDg0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NDIsMHg5NCwgMHg3NiwweEIxLCAweDAwLDB4MUUsIDB4NzYsMHhCNCwgMHhGRiwweEU1LCAweEY0LDB4MDIsIAorMHgwMCwweDAwLCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MzMsIAorMHgyOCwweDAwLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDA4LCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIAorMHgwMCwweDQ4LCAweEY3LDB4MDQsIDB4NzUsMHhFQywgMHg4NSwweDk2LCAweDAwLDB4MDAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhGRCwweDk4LCAweEY2LDB4MDYsIDB4NDIsMHg5NiwgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QUQsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHgyNCwweDE0LCAweDAwLDB4MUUsIDB4MDYsMHgyQywgMHgwMCwweDAyLCAweDc1LDB4MzEsIAorMHgwMCwweDFFLCAweDI0LDB4OTQsIDB4MDAsMHgyMCwgMHg3NSwweDI4LCAweEZGLDB4RTUsIDB4RjMsMHg4NCwgMHg2RSwweDUwLCAweEM3LDB4MzgsIAorMHg2RiwweEMwLCAweDc3LDB4MzgsIDB4RkYsMHhGMCwgMHhGNywweDI3LCAweDI4LDB4MDAsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDkzLDB4OTYsIAorMHhGRiwweEM0LCAweEM3LDB4MzgsIDB4NTcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyMywgMHgyOCwweDAwLCAweDI0LDB4MTQsIAorMHgwMCwweDFDLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyMywgMHgyOCwweDAwLCAweDI0LDB4MTQsIAorMHgwMCwweDFBLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyMywgMHgyOCwweDAwLCAweDI0LDB4MTQsIAorMHgwMCwweDE4LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyMywgMHgyOCwweDAwLCAweDI0LDB4MTQsIAorMHgwMCwweDE2LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyMywgMHgyOCwweDAwLCAweDI0LDB4MTQsIAorMHgwMCwweDE0LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyMywgMHgyOCwweDAwLCAweDI0LDB4MTQsIAorMHgwMCwweDEyLCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyMywgMHgyOCwweDAwLCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweDg3LDB4MzIsIDB4MDAsMHgwMCwgMHgyNCwweDE0LCAweDAwLDB4MTAsIDB4NzYsMHgzMSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyMywgMHgyOCwweDAwLCAweDkwLDB4MTMsIAorMHhGRiwweEZDLCAweDI3LDB4MUMsIDB4MDAsMHgwMiwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4OTQsMHg5MywgMHhGRiwweEZDLCAweDk1LDB4OTYsIAorMHhGRiwweEJDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweENELDB4QjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg1LDB4OTYsIAorMHhGRiwweEJDLCAweDIzLDB4MTQsIDB4MDAsMHgzNiwgMHgyNCwweDk0LCAweDAwLDB4MzgsIDB4NzMsMHhBNSwgMHgwMCwweDFFLCAweDczLDB4OUMsIAorMHhGRiwweEU1LCAweEY0LDB4MDQsIDB4NDIsMHhDMCwgMHhGNiwweDg2LCAweDQyLDB4QzAsIDB4NzYsMHhCNSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweDg3LDB4MkUsIDB4MDAsMHgwMCwgMHg3NiwweDJELCAweDAwLDB4MUUsIDB4NzYsMHgzMCwgMHhGRiwweEU1LCAweEM0LDB4MjAsIAorMHg2RiwweEMwLCAweDc0LDB4MjAsIDB4RkYsMHhGMCwgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4NzUsMHgyRCwgMHgwMCwweDFFLCAweDc1LDB4MjgsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NjcsMHhDMCwgMHg3NywweDM4LCAweEZGLDB4RjAsIDB4RjcsMHgyNywgMHgyOCwweDAwLCAweDg3LDB4MkUsIAorMHgwMCwweDAwLCAweEY2LDB4MDQsIDB4NkUsMHg1MCwgMHhDNywweDM4LCAweDU3LDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUIsIAorMHgyOCwweDAwLCAweDIzLDB4MTQsIDB4MDAsMHgzNCwgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QUQsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUIsIAorMHgyOCwweDAwLCAweDIzLDB4MTQsIDB4MDAsMHgzMiwgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QUQsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUIsIAorMHgyOCwweDAwLCAweDIzLDB4MTQsIDB4MDAsMHgzMCwgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QUQsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUIsIAorMHgyOCwweDAwLCAweDIzLDB4MTQsIDB4MDAsMHgyRSwgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QUQsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUIsIAorMHgyOCwweDAwLCAweDIzLDB4MTQsIDB4MDAsMHgyQywgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QUQsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUIsIAorMHgyOCwweDAwLCAweDIzLDB4MTQsIDB4MDAsMHgyQSwgMHgwNSwweEFDLCAweDAwLDB4MDIsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweDc2LDB4QUQsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUIsIAorMHgyOCwweDAwLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4MjMsMHgxNCwgMHgwMCwweDI4LCAweDc1LDB4QUQsIAorMHgwMCwweDFFLCAweDc1LDB4QUMsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDVGLDB4QzAsIDB4NzcsMHgzOCwgMHhGRiwweEYwLCAweEY3LDB4MUIsIAorMHgyOCwweDAwLCAweDg3LDB4MTYsIDB4RkYsMHhDOCwgMHhGNiwweDgyLCAweDAwLDB4MDMsIDB4QzcsMHgzOCwgMHgzRiwweEMwLCAweDk2LDB4QjIsIAorMHgwMCwweDA4LCAweDA2LDB4QjAsIDB4MUQsMHhEOCwgMHhGNCwweDM3LCAweDI4LDB4MDAsIDB4RjMsMHg4NiwgMHgxNCwweEQ4LCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweEYzLDB4ODIsIDB4MUQsMHhFMCwgMHg5MywweDkzLCAweEZGLDB4RkMsIDB4OTYsMHgxMywgMHhGRiwweEZDLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg4MywweDk2LCAweEZGLDB4QzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEVBLDB4QjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEUwLDB4MDAsIAorMHhGRCwweEI4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDQyLDB4OTQsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEY0LDB4MDIsIDB4MDAsMHgwMCwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDA0LCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDg2LDB4MTYsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzMiwgMHgwMCwweDAwLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDIwLDB4M0EsIAorMHgwMCwweDA2LCAweEU2LDB4MDAsIDB4RkUsMHgyMSwgMHhGNSwweDgyLCAweDAwLDB4MUUsIDB4RjcsMHgwNCwgMHg0MiwweEE4LCAweEY2LDB4MDYsIAorMHg0MiwweEE4LCAweDc2LDB4QjEsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzksIAorMHhGRiwweEYwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhFMCwweDAwLCAweEZFLDB4MzQsIDB4RjcsMHgzMywgMHgyOCwweDAwLCAweEY2LDB4MDUsIAorMHg2RiwweDM0LCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDg0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDA0LCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDg2LDB4MTYsIAorMHgwMCwweDAwLCAweDg1LDB4OTYsIDB4MDAsMHgwNCwgMHg4NywweDMyLCAweDAwLDB4MDAsIDB4NzYsMHhCMSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MjAsMHgzQSwgMHgwMCwweDA3LCAweEU2LDB4MDAsIAorMHhGRSwweDlELCAweEY0LDB4MDIsIDB4MDAsMHgwMCwgMHhGNywweDA0LCAweDQyLDB4QTgsIDB4RjYsMHgwNiwgMHg0MiwweEFBLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEUwLDB4MDAsIDB4RkYsMHgxQywgMHhGNywweDMzLCAweDI4LDB4MDAsIDB4MDcsMHgzMCwgMHgwMCwweDAyLCAweDg2LDB4QkEsIAorMHgwMCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgxRSwgMHg3NywweDM4LCAweEZGLDB4RTUsIDB4QzYsMHhCNCwgMHg3NywweEMwLCAweDc2LDB4QjUsIAorMHhGRiwweEYwLCAweDIwLDB4MzYsIDB4MDAsMHgwMSwgMHhFNiwweDAwLCAweEZFLDB4RDUsIDB4RjYsMHgwNSwgMHg2RiwweDM0LCAweDIwLDB4MzYsIAorMHgwMCwweDAyLCAweEU2LDB4MDAsIDB4RkUsMHhFNSwgMHhGNSwweDAyLCAweDAwLDB4MjAsIDB4RTAsMHgwMCwgMHhGRSwweEZDLCAweEY2LDB4MDYsIAorMHg0MiwweEFDLCAweDIwLDB4MkUsIDB4MDAsMHgwQywgMHhFNiwweDAwLCAweEZGLDB4MUMsIDB4RjQsMHgwMiwgMHgwMCwweDAwLCAweEY1LDB4MDIsIAorMHgwMCwweDFGLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDg0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEUwLDB4MDAsIDB4RkYsMHgxQywgMHhGNCwweDAyLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg0MiwweEFDLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHhGNCwweDAyLCAweDAwLDB4MDEsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwOCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHg4NiwweDk2LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MzYsIAorMHgwMCwweDA0LCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MDgsIDB4OTcsMHgzNiwgMHgwMCwweDA0LCAweDg3LDB4MzYsIAorMHgwMCwweDA4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RUMsMHgwMCwgMHhGRiwweDdELCAweEY2LDB4ODUsIAorMHg2RiwweDM0LCAweDg3LDB4MzYsIDB4MDAsMHgwOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAzLCAweEVFLDB4MDAsIAorMHhGRiwweDgwLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDAsIAorMHhGRiwweEJELCAweEY2LDB4MDYsIDB4NDIsMHhBRSwgMHhGNywweDA0LCAweDZGLDB4MzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4M0EsIAorMHgwMCwweDA4LCAweEY2LDB4ODIsIDB4RkYsMHhFQywgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4QTcsMHgzQSwgMHg2OCwweDAyLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDg0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEUwLDB4MDAsIDB4RkYsMHhEOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg0MiwweEFDLCAweDc2LDB4QjEsIAorMHgwMCwweDFFLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDA0LCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDAsMHgwMCwgMHgwMCwweDE3LCAweDAwLDB4MDAsIAorMHgwMCwweDFBLCAweDAwLDB4MDAsIDB4MDAsMHgxRCwgMHgwMCwweDAwLCAweDAwLDB4MTgsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDU2LDB4NjUsIAorMHg3MiwweDczLCAweDY5LDB4NkYsIDB4NkUsMHg1MywgMHg3NCwweDcyLCAweDY5LDB4NkUsIDB4NjcsMHgzQSwgMHgyMCwweDZELCAweDYzLDB4NzAsIAorMHgyRCwweDZDLCAweDM0LDB4NzYsIDB4MzMsMHgyMCwgMHgzMywweDJFLCAweDMwLDB4MzgsIDB4NjMsMHgyMCwgMHg0NCwweDY1LCAweDYzLDB4MjAsIAorMHgzMSwweDMxLCAweDIwLDB4MzEsIDB4MzksMHgzOSwgMHgzNiwweDIwLCAweDMxLDB4MzMsIDB4M0EsMHgzMCwgMHgzNiwweDNBLCAweDMxLDB4MzYsIAorMHgwMCwweDAwLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjcsMHgwNCwgMHhFMCwweDBDLCAweEZGLDB4MDIsIAorMHgwMCwweDAwLCAweDk3LDB4MDIsIDB4RkYsMHg4NCwgMHhGNywweDA2LCAweDBDLDB4M0UsIDB4Q0YsMHhGQywgMHg3NSwweDgwLCAweEY2LDB4MDIsIAorMHgwMCwweDAyLCAweDk2LDB4MDIsIDB4RkYsMHg4QywgMHg5MCwweDAyLCAweEZGLDB4ODgsIDB4RjcsMHgwNCwgMHhFMCwweDIwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDAwLDB4NzQsIDB4RjYsMHg4MiwgMHgwMCwweDAwLCAweEY2LDB4ODIsIAorMHgwMCwweDAzLCAweDk2LDB4ODIsIDB4RkYsMHg5OCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHgwQywgMHhGNSwweDAyLCAweDE0LDB4OTQsIDB4RjUsMHgwNSwgMHg3QiwweDAwLCAweEY1LDB4MEUsIAorMHhGMCwweDE0LCAweEY1LDB4MDUsIDB4N0IsMHgwOCwgMHhGNywweDA2LCAweEUwLDB4MDAsIDB4RjYsMHg4NiwgMHg3QiwweDY4LCAweEM3LDB4MzgsIAorMHg2QSwweDAwLCAweEY3LDB4MDUsIDB4N0EsMHhGMCwgMHhGNSwweDAyLCAweDAwLDB4NEMsIDB4RjYsMHg4MiwgMHgwMCwweDAwLCAweDIwLDB4MzYsIAorMHgwMCwweDAyLCAweEVFLDB4MDEsIDB4MDEsMHgyNCwgMHhGNSwweDA1LCAweDdBLDB4RjgsIDB4QzUsMHhCNCwgMHgwMCwweDAwLCAweEM2LDB4MzQsIAorMHgwMCwweDAwLCAweEY3LDB4MDYsIDB4RTAsMHgzMCwgMHhDNywweDJDLCAweDcwLDB4MDAsIDB4RjUsMHgwNiwgMHg2RiwweDQ0LCAweEI3LDB4MzIsIAorMHg1MCwweDAyLCAweDkwLDB4MTMsIDB4RkYsMHhGQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4OTUsMHg5NiwgMHhGRiwweEY0LCAweDk2LDB4MTYsIAorMHhGRiwweEYwLCAweDk2LDB4OTYsIDB4RkYsMHhFQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgwMywweDFDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDg1LDB4OTYsIDB4RkYsMHhGNCwgMHg4NiwweDE2LCAweEZGLDB4RjAsIDB4ODYsMHg5NiwgMHhGRiwweEVDLCAweDA1LDB4QUMsIAorMHgxNCwweDk0LCAweDA2LDB4QjQsIDB4MDAsMHgwMSwgMHgyMCwweDM2LCAweDAwLDB4MDIsIDB4RUUsMHgwMSwgMHgwMCwweEQ1LCAweDA2LDB4MzAsIAorMHgwMCwweDA0LCAweEY1LDB4MDIsIDB4MDAsMHgyMiwgMHhGNSwweDA1LCAweDZGLDB4NTgsIDB4RjAsMHgwNSwgMHg2RiwweDU0LCAweEYwLDB4MDUsIAorMHg2RiwweDUwLCAweEYwLDB4MDUsIDB4MkQsMHg0MCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDI5LDB4NTgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDIsIAorMHgwMCwweDAzLCAweEY3LDB4MDUsIDB4RTAsMHgwOCwgMHhGNywweDA0LCAweDdBLDB4RDgsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDk2LDB4MDIsIAorMHhGRiwweDk0LCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDAxLDB4OTEsIDB4RjcsMHgwNiwgMHg3QSwweEU4LCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MDMsMHhEQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHg3QSwweEU4LCAweEY2LDB4MDIsIAorMHgwMCwweDA1LCAweEY2LDB4M0IsIDB4MjgsMHgwMCwgMHhGNywweDA2LCAweDdBLDB4RTAsIDB4ODYsMHg4MiwgMHhGRiwweDQ0LCAweEY2LDB4MDIsIAorMHgwMCwweDAzLCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDAxLDB4QzksIDB4RjYsMHgzQiwgMHgyOCwweDAwLCAweEY3LDB4MDQsIAorMHg2RiwweDY0LCAweDg2LDB4ODIsIDB4RkYsMHg0NCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEU2LDB4MDEsIAorMHgwMSwweEIwLCAweEY3LDB4MDUsIDB4NkYsMHg2NCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgwMCwweDM0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDAwLDB4OEMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NDQsMHgyOCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNiwweEYwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgwQywweDYwLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDA0LDB4MDgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MDAsMHgyMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgwQiwweEQ4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgxRCwweDY4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDFFLDB4NTAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4NUYsMHg2OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHg2RCwweEVDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyMSwweEQwLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDIyLDB4MkMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDkwLDB4MDIsIAorMHhGRiwweDk0LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDBCLDB4RkMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY0LDB4MDIsIAorMHgwMCwweDAwLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIAorMHgwMCwweDA4LCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHhDNSwweEIwLCAweDAwLDB4MDAsIDB4MjAsMHgzMiwgMHgwMCwweDAyLCAweEVFLDB4MDEsIAorMHgwMywweDA4LCAweEY1LDB4MDYsIDB4NkYsMHg0NCwgMHhBNiwweEFFLCAweDUwLDB4MDIsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MzYsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDEsIDB4RTYsMHgwMSwgMHgwMiwweEZDLCAweEY1LDB4MDIsIAorMHgwMCwweDAyLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4OTUsMHg5NiwgMHhGRiwweEY0LCAweDk2LDB4MTYsIAorMHhGRiwweEYwLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDAzLDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg2LDB4MTYsIAorMHhGRiwweEYwLCAweDg1LDB4OTYsIDB4RkYsMHhGNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDUsMHhBQywgMHgwMCwweDA0LCAweEUwLDB4MDEsIAorMHgwMiwweEFDLCAweDA2LDB4MzAsIDB4MDAsMHgwMSwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDg3LDB4MTYsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4RjYsMHg4MiwgMHgwMCwweDA4LCAweDk2LDB4M0EsIAorMHgwMCwweDA4LCAweDk2LDB4M0EsIDB4MDAsMHgwQywgMHg5NiwweDNBLCAweDA5LDB4RDgsIDB4OTYsMHgzQSwgMHgwOSwweERDLCAweDk2LDB4M0EsIAorMHgwRSwweEY0LCAweDk2LDB4M0EsIDB4MEUsMHhGOCwgMHg5NiwweEJBLCAweDE0LDB4MjAsIDB4OTYsMHgzQSwgMHgxNCwweDI0LCAweDkwLDB4QkEsIAorMHgxNCwweDhDLCAweDg2LDB4OTYsIDB4MDAsMHgwNCwgMHg5MCwweEJBLCAweDE0LDB4OTAsIDB4OTYsMHhCQSwgMHgwMCwweDAwLCAweDk2LDB4M0EsIAorMHgwMCwweDA0LCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDA4LCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDg1LDB4OTYsIAorMHgwMCwweDAwLCAweDg3LDB4MTYsIDB4MDAsMHgwOCwgMHg4NiwweDE2LCAweDAwLDB4MDQsIDB4NzcsMHgzOCwgMHhGRiwweEZGLCAweEM1LDB4MzAsIAorMHg3MCwweDAwLCAweEMwLDB4MzIsIDB4NTIsMHgwMCwgMHhFNCwweDAxLCAweDAzLDB4QzksIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MkUsIAorMHgwMCwweDAwLCAweDc2LDB4QUQsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4QzAsMHgzMiwgMHg1MiwweDAwLCAweEU0LDB4MDEsIAorMHgwMywweEEwLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDBDLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweEY3LDB4MDIsIDB4MDAsMHgwMSwgMHhFMCwweDAxLCAweDAzLDB4RTgsIDB4RjcsMHgwNSwgMHg3QSwweEQ4LCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweEY1LDB4MDIsIAorMHgwMCwweDBBLCAweEY1LDB4MDUsIDB4NzEsMHhDQywgMHhGMCwweDA1LCAweDcxLDB4RDQsIDB4RjAsMHgwNSwgMHg3MSwweEQwLCAweEYwLDB4MDUsIAorMHg3MSwweEM0LCAweEY1LDB4MDIsIDB4MDAsMHgwMSwgMHhGNiwweDgyLCAweDAwLDB4MDAsIDB4MjAsMHgzNiwgMHgwMCwweDBBLCAweEVDLDB4MDEsIAorMHgwNCwweDY0LCAweEY1LDB4MDUsIDB4NzEsMHhDOCwgMHhGNSwweDhBLCAweDFFLDB4MDAsIDB4RjYsMHgwNiwgMHg3MSwweEM0LCAweDQ3LDB4MkMsIAorMHhGRiwweEZDLCAweDk3LDB4MzIsIDB4MDAsMHgxOCwgMHgwNiwweDMwLCAweDAwLDB4MDQsIDB4MDYsMHhCNCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHg3MSwweENDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RUMsMHgwMSwgMHgwNCwweDQxLCAweDA1LDB4QUMsIAorMHgyMSwweDRDLCAweEYwLDB4MDUsIDB4NzEsMHg5OCwgMHhGNSwweDA2LCAweDZGLDB4NjgsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweEY1LDB4MDYsIAorMHg3QiwweDE4LCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDQ4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY1LDB4MDYsIDB4MDUsMHhENCwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4RjcsMHg4MiwgMHgwMCwweDA1LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY1LDB4MDYsIDB4NkYsMHg2OCwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDA2LCAweDBCLDB4NzAsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4ODIsIAorMHgwMCwweDA2LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDA2LCAweDZGLDB4NjgsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHgwNiwgMHgwQiwweEEwLCAweDk1LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4ODIsIDB4MDAsMHgwNSwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHgwNiwgMHg3MCwweDgwLCAweDk1LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4MDYsIAorMHgwQiwweDcwLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MDYsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4MDYsIAorMHg3MCwweDgwLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY1LDB4MDYsIDB4MDUsMHg1OCwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4RjUsMHgwMiwgMHgwMCwweDBBLCAweDk1LDB4MTMsIAorMHhGRiwweEZDLCAweEY1LDB4MDYsIDB4NzEsMHgwQywgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgwNSwweDU4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweEY3LDB4MDQsIAorMHg3MSwweEM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgwNSwweDdELCAweEY2LDB4ODYsIAorMHg3MSwweEM0LCAweEUwLDB4MDEsIDB4MDUsMHg5NCwgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHg3MSwweEQwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4ODcsMHgzQSwgMHgwMCwweDE4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDA1LDB4QUMsIDB4RjcsMHgwNSwgMHg3QiwweDEwLCAweEY2LDB4MDYsIAorMHg3MSwweDBDLCAweEUwLDB4MDEsIDB4MDUsMHhDMCwgMHhGNiwweDA1LCAweDdCLDB4MTgsIDB4RjYsMHgwNiwgMHg2RiwweDY4LCAweEY2LDB4MDUsIAorMHg3QiwweDE4LCAweDk3LDB4MDIsIDB4RkYsMHg0OCwgMHgwNywweDM4LCAweDIxLDB4MjgsIDB4OTcsMHgwMiwgMHhGRiwweDRDLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDEwLCAweDg2LDB4ODIsIAorMHhGRiwweDQ4LCAweEY0LDB4ODYsIDB4NkYsMHg2OCwgMHhGNCwweDg1LCAweDdCLDB4MTgsIDB4RjUsMHgwNCwgMHg3QiwweDEwLCAweDI2LDB4QjQsIAorMHgwMCwweDAyLCAweDg1LDB4QjYsIDB4MDAsMHgwMCwgMHg4NywweDJBLCAweDAwLDB4MDAsIDB4NzYsMHgyOSwgMHgwMCwweDFFLCAweDc2LDB4MzAsIAorMHhGRiwweEU1LCAweDc2LDB4QjUsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzUsMHhBQywgMHg2RiwweEMwLCAweEM3LDB4MzgsIAorMHg2NywweEMwLCAweDc3LDB4MzksIDB4RkYsMHhGMCwgMHg3NywweEI4LCAweDAwLDB4MTAsIDB4NzAsMHgzRSwgMHhGRiwweEUxLCAweEU2LDB4MDEsIAorMHgwNiwweDQ1LCAweDc1LDB4QUMsIDB4RkYsMHhGMCwgMHhGNywweDA0LCAweDcxLDB4QUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NzEsMHhBQywgMHhGNywweDA0LCAweDcxLDB4QUMsIDB4RTAsMHgwMSwgMHgwOCwweEM0LCAweEY3LDB4MDIsIAorMHgwMCwweDAxLCAweDc3LDB4MkMsIDB4RkYsMHhGOCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgwNiwweDcxLCAweDc2LDB4QTksIAorMHgwMCwweDFFLCAweEY3LDB4MDQsIDB4NzEsMHhBOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIAorMHg3MSwweEE4LCAweEY3LDB4MDQsIDB4NzEsMHhBOCwgMHhFMCwweDAxLCAweDA4LDB4QzQsIDB4RjcsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4MkEsIAorMHgwMCwweDAwLCAweDc2LDB4QjQsIDB4RkYsMHhFNSwgMHhDNywweDM4LCAweDZGLDB4QzAsIDB4NzcsMHgzOSwgMHhGRiwweEYwLCAweDI3LDB4MzgsIAorMHgwMCwweDA0LCAweDIwLDB4M0EsIDB4MDAsMHgwMywgMHhFMiwweDAxLCAweDA4LDB4QTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc3LDB4MzksIAorMHgwMCwweDAyLCAweEY2LDB4ODYsIDB4MDYsMHhBNCwgMHhBNiwweEI2LCAweDcwLDB4MDIsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMxLDB4MzQsIAorMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHhCNCwgMHgwMCwweDAxLCAweDA3LDB4N0MsIDB4MDAsMHgwMSwgMHgwNywweEVDLCAweDAwLDB4MDEsIAorMHgwOCwweDQ0LCAweDg3LDB4MkEsIDB4MDAsMHgwNCwgMHhDNCwweDg0LCAweDAwLDB4MDAsIDB4QzAsMHgzQSwgMHg0QSwweDAwLCAweEU2LDB4MDEsIAorMHgwNiwweEQ4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDAyLCAweEZGLDB4NDgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MzgsIAorMHg1MiwweDAwLCAweDk3LDB4MkEsIDB4MDAsMHgwNCwgMHg4NywweDJBLCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgyMSwweDAwLCAweEVFLDB4MDEsIDB4MDcsMHgzQywgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4ODYsMHhBQSwgMHgwMCwweDA0LCAweDg3LDB4MDIsIAorMHhGRiwweDQ4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAweDUyLDB4MDAsIDB4MjcsMHgzOCwgMHgwMCwweDI4LCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEU2LDB4MDEsIDB4MDcsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHhGQywgMHgwMCwweDFELCAweDcwLDB4M0UsIAorMHhGRiwweEUxLCAweEU2LDB4MDEsIDB4MDcsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHhGQywgMHgwMCwweDE3LCAweDcwLDB4M0UsIAorMHhGRiwweEUxLCAweEU2LDB4MDEsIDB4MDcsMHgzRCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzcsMHhGQywgMHgwMCwweDE2LCAweDcwLDB4M0UsIAorMHhGRiwweEUxLCAweEU2LDB4MDEsIDB4MDcsMHg0NCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MDgsMHg4OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgyQSwgMHgwMCwweDE4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMiwgMHhFRSwweDAxLCAweDA4LDB4QzEsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHg3MSwweEE0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg3MSwweEE0LCAweEY3LDB4MDQsIAorMHg3MSwweEE0LCAweEUwLDB4MDEsIDB4MDgsMHhDNCwgMHhGNywweDAyLCAweDAwLDB4MDEsIDB4ODcsMHgyQSwgMHgwMCwweDA0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MjEsMHgwMCwgMHhFRSwweDAxLCAweDA3LDB4RTAsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweDg2LDB4QUEsIAorMHgwMCwweDA0LCAweDg3LDB4MDIsIDB4RkYsMHg0OCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzcsMHgzOCwgMHg1MiwweDAwLCAweDI3LDB4MzgsIAorMHgwMCwweDBDLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAxLCAweDA3LDB4RTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc3LDB4RkMsIAorMHgwMCwweDFELCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHhFNiwweDAxLCAweDA3LDB4RTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc3LDB4RkMsIAorMHgwMCwweDE3LCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHhFNiwweDAxLCAweDA3LDB4RTEsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc3LDB4RkMsIAorMHgwMCwweDE2LCAweDcwLDB4M0UsIDB4RkYsMHhFMSwgMHhFNiwweDAxLCAweDA4LDB4ODAsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEY2LDB4MDIsIAorMHgwMCwweDAxLCAweEUwLDB4MDEsIDB4MDgsMHg4MCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4ODcsMHgwMiwgMHhGRiwweDQ4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NTIsMHgwMCwgMHgyNywweDM4LCAweDAwLDB4MDQsIDB4MjAsMHgzQSwgMHgwMCwweDA4LCAweEU2LDB4MDEsIAorMHgwOCwweDM4LCAweEY2LDB4ODIsIDB4MDAsMHgwMCwgMHg3NywweEZDLCAweDAwLDB4MUQsIDB4NzAsMHgzRSwgMHhGRiwweEUxLCAweEU2LDB4MDEsIAorMHgwOCwweDM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweEZDLCAweDAwLDB4MTcsIDB4NzAsMHgzRSwgMHhGRiwweEUxLCAweEU2LDB4MDEsIAorMHgwOCwweDM5LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweEZDLCAweDAwLDB4MTYsIDB4NzAsMHgzRSwgMHhGRiwweEUxLCAweEU2LDB4MDEsIAorMHgwOCwweDgwLCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHhGNiwweDgyLCAweDAwLDB4MDEsIDB4RTAsMHgwMSwgMHgwOCwweDgwLCAweDIwLDB4MzYsIAorMHgwMCwweDAwLCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHg3NywweEZDLCAweDAwLDB4MUQsIDB4NzAsMHgzRSwgMHhGRiwweEUxLCAweEU2LDB4MDEsIAorMHgwOCwweDc4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweEZDLCAweDAwLDB4MTcsIDB4NzAsMHgzRSwgMHhGRiwweEUxLCAweEU2LDB4MDEsIAorMHgwOCwweDc5LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweEZDLCAweDAwLDB4MTYsIDB4NzAsMHgzRSwgMHhGRiwweEUxLCAweEU2LDB4MDEsIAorMHgwOCwweDgwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhGNywweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIAorMHgwOCwweEMxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDcxLDB4QTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NzEsMHhBMCwgMHhGNywweDA0LCAweDcxLDB4QTAsIDB4RTAsMHgwMSwgMHgwOCwweEM0LCAweEY3LDB4MDIsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzEsMHg5QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIAorMHg3MSwweDlDLCAweEY3LDB4MDQsIDB4NzEsMHg5QywgMHhFMCwweDAxLCAweDA4LDB4QzQsIDB4RjcsMHgwMiwgMHgwMCwweDAxLCAweEY3LDB4MDIsIAorMHgwMCwweDAwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDA5LDB4NjgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY2LDB4ODQsIAorMHg3QiwweDEwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDM2LCAweDAwLDB4MDAsIDB4NzYsMHhCNSwgMHgwMCwweDFFLCAweDc2LDB4QjQsIAorMHhGRiwweEU1LCAweEM3LDB4MzgsIDB4NkYsMHhDMCwgMHg3NywweDM5LCAweEZGLDB4RjAsIDB4MjcsMHgzOCwgMHgwMCwweDA0LCAweDIwLDB4M0EsIAorMHgwMCwweDAzLCAweEUyLDB4MDEsIDB4MEIsMHg1MCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjYsMHg4NiwgMHgwOSwweDBDLCAweEE2LDB4QjYsIAorMHg3MCwweDAyLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMSwweDM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwOSwweDFDLCAweDAwLDB4MDEsIAorMHgwQSwweEUwLCAweDAwLDB4MDEsIDB4MEEsMHhBQywgMHgwMCwweDAxLCAweDBCLDB4MTQsIDB4RjcsMHgwNCwgMHg3MSwweEQwLCAweEY2LDB4MDQsIAorMHg3MSwweENDLCAweDA2LDB4QjgsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDYyLDB4MDAsIDB4RTYsMHgwMSwgMHgwOSwweDM4LCAweEM3LDB4MzQsIAorMHgwMCwweDAwLCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHhGNSwweDg0LCAweDcxLDB4RDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIAorMHg1QSwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgwOSwweDg1LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzEsMHhCMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIAorMHg3MSwweEIwLCAweEY3LDB4MDQsIDB4NzEsMHhCMCwgMHhGNywweDA0LCAweDcxLDB4QjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NzEsMHhCNCwgMHhGNywweDA0LCAweDcxLDB4QjQsIDB4RTAsMHgwMSwgMHgwQiwweDUwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY0LDB4ODQsIDB4NzEsMHhDOCwgMHhGNiwweDg1LCAweDcxLDB4RDAsIDB4OTQsMHg5NiwgMHhGRiwweEY0LCAweEY0LDB4ODQsIAorMHg3QiwweDEwLCAweEMwLDB4MzYsIDB4NjIsMHgwMCwgMHhFNiwweDAxLCAweDA5LDB4QTQsIDB4OTQsMHg5NiwgMHhGRiwweEVDLCAweEYwLDB4MDUsIAorMHg3MSwweEQwLCAweEY3LDB4MDQsIDB4NzEsMHhEMCwgMHhGMCwweDA1LCAweDcxLDB4QzgsIDB4ODQsMHg5NiwgMHhGRiwweEVDLCAweEMwLDB4M0EsIAorMHg1QSwweDAwLCAweDQ3LDB4MEMsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAweDcxLDB4QzQsIDB4ODcsMHgyNiwgMHgwMCwweDA4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDcwLDB4M0EsIDB4RkYsMHhFMSwgMHhFNiwweDAxLCAweDA5LDB4RTEsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHg3MSwweDk4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg3MSwweDk4LCAweDg0LDB4OTYsIAorMHhGRiwweEY0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDI2LCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgwQSwweDcxLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDA1LDB4NTgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY2LDB4MDIsIAorMHgwMCwweDA5LCAweDIwLDB4MzIsIDB4MDAsMHgxNCwgMHhFNiwweDAxLCAweDBBLDB4NEQsIDB4MjcsMHgwMCwgMHgwMCwweDBDLCAweDIwLDB4M0EsIAorMHgwMCwweDAxLCAweEUyLDB4MDEsIDB4MEEsMHg0RCwgMHhGNywweDA2LCAweDJELDB4Q0MsIDB4RjYsMHg4NCwgMHgyRSwweENDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDc1LDB4QjUsIDB4MDAsMHgwMiwgMHhCNiwweDJFLCAweDcwLDB4MDIsIDB4MDYsMHhCNCwgMHgwMCwweDAxLCAweEY2LDB4ODUsIAorMHgyRSwweENDLCAweDg2LDB4MDIsIDB4RkYsMHgzNCwgMHhGNywweDA2LCAweDJFLDB4NEMsIDB4MjAsMHgzNiwgMHgwMCwweDFGLCAweEUyLDB4MDEsIAorMHgwQSwweDRELCAweEI2LDB4MkUsIDB4NzAsMHgwMiwgMHhGMCwweDA1LCAweDJFLDB4Q0MsIDB4RjcsMHgwNCwgMHgyRCwweDY4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4M0EsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzQSwgMHgwMCwweDI4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhDMSwweDM4LCAweDAwLDB4MDAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDQsIAorMHg3MSwweEJDLCAweDg0LDB4OTYsIDB4RkYsMHhFQywgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg3MSwweEJDLCAweEY3LDB4MDQsIAorMHg3MSwweEJDLCAweDg2LDB4QTYsIDB4MDAsMHgwNCwgMHg4NCwweDk2LCAweEZGLDB4RjQsIDB4RjcsMHgwNCwgMHg3MSwweEI4LCAweDIwLDB4MjYsIAorMHgwMCwweDAwLCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHhGNywweDA1LCAweDcxLDB4QjgsIDB4RTYsMHgwMSwgMHgwQiwweDUxLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEUwLDB4MDEsIDB4MEIsMHg1QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3MSwweEMwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhGNywweDA1LCAweDcxLDB4QzAsIDB4RjcsMHgwNCwgMHg3MSwweEMwLCAweEY0LDB4ODQsIAorMHg3QiwweDEwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NCwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHhGRCwweENDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhFMCwweDAxLCAweDBCLDB4NTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHg3MSwweEMwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg3MSwweEMwLCAweEY3LDB4MDQsIAorMHg3MSwweEMwLCAweEY0LDB4ODQsIDB4N0IsMHgxMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTQsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4RkYsMHgzMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMSwgMHgwQiwweDUwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzEsMHhDMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIAorMHg3MSwweEMwLCAweEY3LDB4MDQsIDB4NzEsMHhDMCwgMHhGNiwweDg0LCAweDdCLDB4MTAsIDB4ODcsMHgwMiwgMHhGRiwweDQ4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NkEsMHgwMCwgMHgyNywweDM4LCAweDAwLDB4MDQsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDk2LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweEZFLDB4NDgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MDUsMHg1OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNywweDA2LCAweDcwLDB4ODAsIDB4RjcsMHgwNSwgMHg3QiwweDE4LCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MDUsMHg1OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNywweDA2LCAweDZGLDB4NjgsIDB4RjcsMHgwNSwgMHg3QiwweDE4LCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MDUsMHg1OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNywweDA2LCAweDdCLDB4MTgsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHg2RiwweDY4LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNCwweEY0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4N0IsMHgxOCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHg2RiwweEY0LCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE0LDB4RjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHg3QiwweDE4LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDcwLDB4ODAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHg3QiwweDE4LCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4NzEsMHgwQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNCwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNSwweDAyLCAweDAwLDB4MDQsIDB4RjUsMHgwNSwgMHg3NiwweDAwLCAweEYwLDB4MDUsIAorMHg3NiwweDA4LCAweEYwLDB4MDUsIDB4NzYsMHgwNCwgMHhGMCwweDA1LCAweDc1LDB4RjgsIDB4RjUsMHgwMiwgMHgwMCwweDAxLCAweEY2LDB4ODIsIAorMHgwMCwweDAwLCAweDIwLDB4MzYsIDB4MDAsMHgwNCwgMHhFQywweDAxLCAweDBDLDB4QkMsIDB4RjUsMHgwNSwgMHg3NSwweEZDLCAweEY1LDB4OEUsIAorMHg2QSwweEY4LCAweEY2LDB4MDYsIDB4NzUsMHhGOCwgMHg0NywweDJDLCAweEZGLDB4RkMsIDB4OTcsMHgzMiwgMHgwMCwweDE4LCAweDA2LDB4MzAsIAorMHgwMCwweDA0LCAweDA2LDB4QjQsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDc2LDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEVDLDB4MDEsIDB4MEMsMHg5OSwgMHgwNSwweEFDLCAweDIxLDB4NEMsIDB4RjUsMHgwNiwgMHg3MiwweDE4LCAweDk1LDB4MTMsIAorMHhGRiwweEZDLCAweEY1LDB4MDYsIDB4NzYsMHg0OCwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNSwweDQ4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDA2LCAweDBELDB4RjQsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4ODIsIAorMHgwMCwweDBFLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDA2LCAweDcyLDB4MTgsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHgwNiwgMHgwRCwweEY0LCAweDk1LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4ODIsIDB4MDAsMHgwRSwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHgwNiwgMHg3MiwweEE0LCAweDk1LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4MDYsIAorMHgxMywweDJDLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDgyLCAweDAwLDB4MDEsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4MDYsIAorMHg3MywweDMwLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY1LDB4MDYsIDB4MTYsMHhDOCwgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4RjcsMHg4MiwgMHgwMCwweDAxLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY1LDB4MDYsIDB4NzMsMHhCQywgMHg5NSwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDA2LCAweDE4LDB4MDAsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4ODIsIAorMHgwMCwweDEwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNSwweDA2LCAweDc0LDB4NDgsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHgwNiwgMHgxNiwweDQwLCAweDk1LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4ODIsIDB4MDAsMHgxMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjUsMHgwNiwgMHg3NCwweEQ0LCAweDk1LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE2LDB4MUMsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY1LDB4MDYsIAorMHgxMywweDJDLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHhGNSwweDAyLCAweDAwLDB4MTIsIDB4OTUsMHgxMywgMHhGRiwweEZDLCAweEY1LDB4MDYsIAorMHg3NSwweDYwLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNiwweDFDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEYwLDB4MDUsIDB4NzUsMHhGMCwgMHhGMCwweDA1LCAweDc1LDB4RUMsIDB4RjAsMHgwNSwgMHg3NSwweEY0LCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4MjIsMHgxMCwgMHgwMCwweDM4LCAweEY3LDB4MDQsIAorMHg3NSwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgwRSwweDI4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzUsMHhGMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIAorMHgwRSwweDNELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgxNSwweEQwLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEUwLDB4MDEsIDB4MTMsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjcsMHgwNCwgMHg3NSwweEZDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDBFLDB4NTksIDB4RjYsMHg4NiwgMHg3NSwweEY4LCAweEUwLDB4MDEsIAorMHgwRSwweDZDLCAweEY2LDB4ODIsIDB4MDAsMHgwMCwgMHhGNywweDA0LCAweDc2LDB4MDgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc3LDB4MzksIAorMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHg4NiwweEJBLCAweDAwLDB4MTgsIDB4RjcsMHgwNCwgMHg3NiwweEZDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDBFLDB4OTAsIDB4RjYsMHg4NSwgMHg3NiwweDYwLCAweEYzLDB4MDYsIAorMHg3NiwweDQ4LCAweEYzLDB4MDUsIDB4NzYsMHhGQywgMHhFMCwweDAxLCAweDBFLDB4QTQsIDB4RjcsMHgwMiwgMHgwMCwweDAxLCAweEYzLDB4MDIsIAorMHgwMCwweDEwLCAweEYzLDB4MDUsIDB4NzYsMHhGOCwgMHhGMywweDA2LCAweDc2LDB4NDgsIDB4RjMsMHgwNSwgMHg3NywweDAwLCAweEY3LDB4MDIsIAorMHgwMCwweDAwLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDEzLDB4MTUsIDB4RjMsMHgwNiwgMHg3NCwweDQ4LCAweEY3LDB4MDQsIAorMHg3NSwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgwRSwweEQ4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzUsMHhGMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIAorMHgwRSwweEVELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgxNiwweDQwLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEUwLDB4MDEsIDB4MTMsMHgxOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjYsMHg4NCwgMHg3NiwweDYwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MzYsIDB4MDAsMHgwOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4NzAsMHgzQSwgMHhGRiwweEUxLCAweEU2LDB4MDEsIAorMHgwRiwweDIxLCAweEY0LDB4ODIsIDB4MDAsMHgwMCwgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgwMCwweEJDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhFMCwweDAxLCAweDEzLDB4MTQsIDB4RjMsMHgwNiwgMHg3NSwweDYwLCAweEMzLDB4QjQsIAorMHgwMCwweDAwLCAweDg0LDB4MUUsIDB4MDAsMHgxMCwgMHhGNiwweDg0LCAweDRBLDB4QTAsIDB4MjMsMHgxNCwgMHgwMCwweDIwLCAweDkzLDB4MTYsIAorMHhGRiwweEM0LCAweDk0LDB4MTYsIDB4RkYsMHhFMCwgMHg5NiwweDk2LCAweEZGLDB4RDQsIDB4ODUsMHgxRSwgMHgwMCwweDE0LCAweEY3LDB4MDQsIAorMHg0QSwweDlDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RUMsMHgwMSwgMHgxMCwweDBDLCAweDk1LDB4MTYsIAorMHhGRiwweEU0LCAweDc3LDB4MzUsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEYzLDB4MDYsIAorMHg0QSwweDk4LCAweEM2LDB4QjgsIDB4MzAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MEMsIDB4QzUsMHg4NCwgMHgwMCwweDAwLCAweDg3LDB4MzYsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDQyLDB4MDAsIDB4RTYsMHgwMSwgMHgwRiwweDlDLCAweEM2LDB4MjQsIAorMHgwMCwweDAwLCAweDg3LDB4MzYsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg1MiwweDAwLCAweEU2LDB4MDEsIAorMHgwRiwweEEwLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDEsIAorMHgwRiwweEFELCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNSwweDgyLCAweDAwLDB4MDAsIDB4ODYsMHgzNiwgMHgwMCwweDAwLCAweDg3LDB4MTYsIAorMHhGRiwweEUwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDMyLCAweDcyLDB4MDAsIDB4RTIsMHgwMSwgMHgwRiwweEU4LCAweEY1LDB4MDIsIAorMHgwMCwweDAwLCAweEMwLDB4MzIsIDB4NzIsMHgwMCwgMHhFNiwweDAxLCAweDBGLDB4RjAsIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweDg2LDB4QjYsIAorMHgwMCwweDA0LCAweDg3LDB4MTYsIDB4RkYsMHhFNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEUyLDB4MDEsIAorMHgwRiwweEYxLCAweDIwLDB4MkEsIDB4MDAsMHgwMCwgMHhGNSwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgyQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIAorMHgxMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgwMCwgMHhGNSwweDgyLCAweDAwLDB4MDEsIDB4MjAsMHgyRSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIAorMHgxMCwweDEwLCAweDIwLDB4MjYsIDB4MDAsMHgwMCwgMHhGNCwweDgyLCAweDAwLDB4MDEsIDB4MjAsMHgyNiwgMHgwMCwweDAwLCAweEU2LDB4MDEsIAorMHgxMCwweDQ1LCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHg4NywweDE2LCAweEZGLDB4RDQsIDB4RjMsMHgwNiwgMHg0QSwweDk4LCAweDc2LDB4QjksIAorMHgwMCwweDAxLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHg3NiwweEI1LCAweDAwLDB4MDIsIDB4QzYsMHhCNCwgMHgzMCwweDAwLCAweDA2LDB4QjQsIAorMHgwMCwweDE0LCAweDg2LDB4QjYsIDB4MDAsMHgwMCwgMHg5NywweDE2LCAweEZGLDB4RDgsIDB4RTAsMHgwMSwgMHgxMCwweEI4LCAweDk2LDB4OTYsIAorMHhGRiwweERDLCAweDI3LDB4MTQsIDB4MDAsMHgyQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4ODMsMHgxNiwgMHhGRiwweEM0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkzLDB4MTMsIDB4RkYsMHhGQywgMHhGMywweDA2LCAweDRBLDB4OTgsIDB4OTMsMHgxMywgMHhGRiwweEZDLCAweDkzLDB4OTYsIAorMHhGRiwweENDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDI1LDB4NjgsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDgzLDB4OTYsIAorMHhGRiwweENDLCAweDIwLDB4MjIsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDEwLDB4QjUsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4MTYsIAorMHhGRiwweEQ0LCAweEYzLDB4MDYsIDB4NEEsMHg5OCwgMHg3NiwweEI5LCAweDAwLDB4MDEsIDB4QzYsMHhCNCwgMHg3MCwweDAwLCAweDc2LDB4QjUsIAorMHgwMCwweDAyLCAweEM2LDB4QjQsIDB4MzAsMHgwMCwgMHgwNiwweEI0LCAweDAwLDB4MTQsIDB4ODYsMHhCNiwgMHgwMCwweDAwLCAweDk3LDB4MTYsIAorMHhGRiwweEQ4LCAweDk2LDB4OTYsIDB4RkYsMHhEQywgMHhGNywweDA1LCAweDRBLDB4QTAsIDB4RTAsMHgwMSwgMHgxMCwweEJDLCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxMCwweENDLCAweEY0LDB4ODIsIAorMHgwMCwweDAxLCAweEUwLDB4MDEsIDB4MTEsMHgyNCwgMHhGNCwweDgyLCAweDAwLDB4MDAsIDB4ODYsMHg5NiwgMHhGRiwweEQ4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDc3LDB4MzUsIDB4MDAsMHgwMiwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEY2LDB4ODYsIAorMHg0MiwweEM4LCAweEE2LDB4M0EsIDB4NjgsMHgwMiwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4NzUsMHgzOSwgMHgwMCwweDFFLCAweDc1LDB4MjgsIAorMHhGRiwweEU1LCAweDA1LDB4QjgsIDB4MDAsMHgwMiwgMHg4NiwweEFFLCAweDAwLDB4MDAsIDB4MDcsMHgzOCwgMHgwMCwweDA0LCAweDk3LDB4MTYsIAorMHhGRiwweEVDLCAweEM2LDB4MzAsIDB4NTcsMHhDMCwgMHg3NiwweDMwLCAweEZGLDB4RjAsIDB4OTYsMHgxNiwgMHhGRiwweEY0LCAweDc1LDB4QUQsIAorMHgwMCwweDFFLCAweDc1LDB4QUMsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDVGLDB4QzAsIDB4NzYsMHhCNCwgMHhGRiwweEYwLCAweDk2LDB4OTYsIAorMHhGRiwweEYwLCAweDIwLDB4MjYsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDExLDB4MzgsIDB4RjUsMHg4MiwgMHgwMCwweDAwLCAweEUwLDB4MDEsIAorMHgxMSwweENDLCAweEY2LDB4MDIsIDB4MDAsMHgwMCwgMHg4NiwweDk2LCAweEZGLDB4RjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM3LDB4MzQsIAorMHg2OCwweDAwLCAweEM0LDB4OUMsIDB4NzIsMHgwMCwgMHhDMCwweDJFLCAweDZBLDB4MDAsIDB4RUMsMHgwMSwgMHgxMSwweDk4LCAweEM1LDB4MjQsIAorMHgwMCwweDAwLCAweEM2LDB4MkMsIDB4MDAsMHgwMCwgMHg4NywweDE2LCAweEZGLDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEE2LDB4QjIsIAorMHg3MCwweDAyLCAweDA1LDB4QUMsIDB4MDAsMHgwMSwgMHhDNywweDMwLCAweDcwLDB4MDAsIDB4NzcsMHgzOSwgMHgwMCwweDFFLCAweDc3LDB4MzgsIAorMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NzcsMHhDMCwgMHg3NiwweEI0LCAweEZGLDB4RjAsIDB4RjYsMHhBQiwgMHgyOCwweDAwLCAweDA1LDB4MjgsIAorMHgwMCwweDAyLCAweDg3LDB4MTYsIDB4RkYsMHhGMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgyRSwgMHg3MiwweDAwLCAweEVDLDB4MDEsIAorMHgxMSwweDU5LCAweDA2LDB4MzAsIDB4MDAsMHgwMiwgMHhGMywweDAyLCAweDAwLDB4MDEsIDB4RjMsMHgwNSwgMHg3NiwweEY0LCAweEY2LDB4MDIsIAorMHgwMCwweDAxLCAweDg3LDB4MTYsIDB4RkYsMHhGMCwgMHg4NiwweDlFLCAweDAwLDB4MDQsIDB4QzcsMHgzOCwgMHg3MCwweDAwLCAweEM3LDB4MzgsIAorMHg0OCwweDAwLCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHg4NywweDE2LCAweEZGLDB4RjQsIDB4MDYsMHhCNCwgMHgwMCwweDIwLCAweDk3LDB4MDIsIAorMHhGRiwweDZDLCAweDk0LDB4ODIsIDB4RkYsMHg1MCwgMHg5NiwweDgyLCAweEZGLDB4NTgsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDEsIAorMHgxMywweDEwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNywweDA0LCAweDc2LDB4NUMsIDB4RjUsMHg4NCwgMHg3NiwweEY4LCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NzYsMHg1QywgMHhGNywweDA0LCAweDc2LDB4NUMsIDB4MjAsMHgyRSwgMHgwMCwweDIxLCAweEUyLDB4MDEsIAorMHgxMiwweDMwLCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDEsIAorMHgxMiwweDFDLCAweEI1LDB4QkEsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjMsMHgwMiwgMHgwMCwweDIyLCAweEYzLDB4MDUsIAorMHg3NiwweEY4LCAweEYzLDB4MDQsIDB4NzcsMHgwMCwgMHhFMCwweDAxLCAweDEyLDB4MzQsIDB4RjMsMHgwNSwgMHg3NiwweEZDLCAweEYwLDB4MDUsIAorMHg3NiwweEZDLCAweEY3LDB4MDQsIDB4NzUsMHhGOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIAorMHgxMiwweDcxLCAweEY2LDB4ODYsIDB4MkMsMHgyOCwgMHhGNywweDA0LCAweDJELDB4MzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjMsMHgwMiwgMHgwMCwweDBGLCAweDIwLDB4MzIsIAorMHgwMCwweDQ0LCAweEU2LDB4MDEsIDB4MTIsMHg3MCwgMHhCMywweDNBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY3LDB4MDQsIAorMHg3NiwweDA4LCAweEY2LDB4ODQsIDB4NzYsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweEU2LDB4MDEsIAorMHgxMiwweDhDLCAweEY3LDB4MDUsIDB4NzYsMHgwOCwgMHhGMCwweDA1LCAweDc2LDB4MDgsIDB4RjYsMHg4NCwgMHg3NiwweDA4LCAweEY3LDB4MDQsIAorMHg3NiwweDA0LCAweEYwLDB4MDUsIDB4NzUsMHhGOCwgMHhGNiwweDA2LCAweDc1LDB4RjgsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweDQ3LDB4MEMsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDEyLDB4QjksIDB4RjcsMHgwNSwgMHg3NSwweEZDLCAweEUwLDB4MDEsIAorMHgxMiwweEM4LCAweEY3LDB4MDIsIDB4MDAsMHgwMCwgMHg3NywweDM1LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2MCwweDAwLCAweDg3LDB4M0EsIAorMHgwMCwweDE4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxMywweDA5LCAweEY3LDB4MDUsIAorMHg3NiwweDYwLCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHhGMywweDA2LCAweDcyLDB4QTQsIDB4RjMsMHgwNSwgMHg3NiwweDQ4LCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweEYzLDB4MDIsIAorMHgwMCwweDBFLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAxLCAweDEzLDB4MTgsIDB4QjMsMHgzQSwgMHg2OCwweDAyLCAweEUwLDB4MDEsIAorMHgxMywweDE4LCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhFMCwweDAxLCAweDEzLDB4MTQsIDB4RjMsMHgwNiwgMHg3MiwweDE4LCAweEYzLDB4MDYsIAorMHg3MywweDMwLCAweEYzLDB4MDUsIDB4NzYsMHg0OCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweEY3LDB4MDQsIDB4NzYsMHg2MCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHhCQSwgMHgwMCwweDA0LCAweEY3LDB4MDQsIAorMHg3NiwweDU0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDM4LCAweDY4LDB4MDAsIDB4RjcsMHgwNSwgMHg3NiwweDU0LCAweEY3LDB4MDQsIAorMHg3NiwweDU4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg3NiwweDU4LCAweEY3LDB4MDQsIAorMHg3NSwweEY4LCAweEY2LDB4ODQsIDB4NzYsMHg1OCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxMywweDlELCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGNSwweDAyLCAweDAwLDB4MEYsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDEsIAorMHgxMywweDlDLCAweEI1LDB4M0EsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjcsMHgwNCwgMHg3NiwweDA4LCAweEY2LDB4ODQsIAorMHg3NiwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDZBLDB4MDAsIDB4RTYsMHgwMSwgMHgxMywweEI4LCAweEY3LDB4MDUsIAorMHg3NiwweDA4LCAweEYwLDB4MDUsIDB4NzYsMHgwOCwgMHhGNywweDA0LCAweDc2LDB4MDgsIDB4RjYsMHg4NCwgMHg3NiwweDA0LCAweEYwLDB4MDUsIAorMHg3NSwweEY4LCAweEY1LDB4ODQsIDB4NzYsMHhGOCwgMHhDMCwweDNBLCAweDZBLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4MkUsIAorMHgwMCwweDIxLCAweEUyLDB4MDEsIDB4MTQsMHgxNCwgMHhGNywweDA1LCAweDc1LDB4RkMsIDB4RjcsMHgwNCwgMHgyRCwweDM4LCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweDA2LDB4MzgsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweDIwLDB4MzIsIAorMHgwMCwweDQ0LCAweEU2LDB4MDEsIDB4MTQsMHgwMCwgMHhCNSwweEJBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweEY1LDB4MDIsIAorMHgwMCwweDIyLCAweEY1LDB4MDUsIDB4NzYsMHhGOCwgMHhGNSwweDA0LCAweDc3LDB4MDAsIDB4RTAsMHgwMSwgMHgxNCwweDE4LCAweEY1LDB4MDUsIAorMHg3NiwweEZDLCAweEYwLDB4MDUsIDB4NzYsMHhGQywgMHhGNywweDA0LCAweDc1LDB4RUMsIDB4RjUsMHgwNiwgMHg3MiwweDE4LCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MTQsMHg0MCwgMHhGNSwweDA1LCAweDc2LDB4NDgsIDB4RjcsMHgwNCwgMHg3NSwweEYwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDE0LDB4NTUsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MTUsMHhEMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RTAsMHgwMSwgMHgxNCwweEM0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzUsMHhGQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIAorMHgxNCwweDcxLCAweEY2LDB4ODYsIDB4NzUsMHhGOCwgMHhFMCwweDAxLCAweDE0LDB4ODgsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweEY3LDB4MDQsIAorMHg3NiwweDA4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDg3LDB4M0EsIAorMHgwMCwweDE4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxNCwweEM1LCAweEY3LDB4MDUsIAorMHg3NiwweDYwLCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGNSwweDAyLCAweDAwLDB4MEUsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDEsIAorMHgxNCwweEJDLCAweEI1LDB4M0EsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjUsMHgwNiwgMHg3MiwweEE0LCAweEY1LDB4MDUsIAorMHg3NiwweDQ4LCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweEY3LDB4MDQsIAorMHg3NSwweEVDLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxNSwweDQwLCAweEY0LDB4MDIsIAorMHgwMCwweDAwLCAweDg2LDB4OTYsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjYsMHg4NSwgMHg3NSwweEVDLCAweDg2LDB4OTYsIAorMHgwMCwweDA4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNiwweDg1LCAweDdCLDB4MzgsIDB4ODYsMHg5NiwgMHgwMCwweDAwLCAweEY3LDB4MDQsIAorMHg3NiwweDQ4LCAweEY2LDB4ODUsIDB4N0IsMHgzMCwgMHhGNiwweDg2LCAweDcyLDB4MTgsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweDQ3LDB4MEMsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDE1LDB4NDEsIDB4RjQsMHgwMiwgMHgwMCwweDAxLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MTUsMHhEMCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjQsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MEMsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjcsMHgwNCwgMHg3NSwweEY0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDE1LDB4QkMsIDB4RjQsMHgwMiwgMHgwMCwweDAwLCAweDg2LDB4OTYsIAorMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNiwweDg1LCAweDc1LDB4RjAsIDB4ODYsMHg5NiwgMHgwMCwweDA4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY2LDB4ODUsIDB4N0IsMHg0OCwgMHg4NiwweDk2LCAweDAwLDB4MDAsIDB4RjcsMHgwNCwgMHg3NiwweDQ4LCAweEY2LDB4ODUsIAorMHg3QiwweDQwLCAweEY2LDB4ODYsIDB4NzIsMHgxOCwgMHhDMCwweDNBLCAweDZBLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MTUsMHhCRCwgMHhGNCwweDAyLCAweDAwLDB4MDEsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIAorMHgxNSwweEQwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNCwweDAyLCAweDAwLDB4MDEsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwQywgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNywweDA0LCAweDc2LDB4RkMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MTUsMHhGQywgMHhGNiwweDgyLCAweDAwLDB4MTAsIDB4RjYsMHg4NiwgMHg3NiwweDQ4LCAweEY2LDB4ODUsIAorMHg3NiwweEZDLCAweEUwLDB4MDEsIDB4MTYsMHgwQywgMHhGNywweDAyLCAweDAwLDB4MDEsIDB4RjYsMHg4NSwgMHg3NiwweEY4LCAweEY2LDB4ODYsIAorMHg3NiwweDQ4LCAweEY2LDB4ODUsIDB4NzcsMHgwMCwgMHhGNywweDAyLCAweDAwLDB4MDAsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIAorMHgxNiwweDIwLCAweEY2LDB4ODYsIDB4NzQsMHhENCwgMHhFMCwweDAxLCAweDE2LDB4MkMsIDB4RjYsMHg4NSwgMHg3NiwweDQ4LCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MTYsMHg0MCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNiwweDA0LCAweDc1LDB4RjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MTYsMHg4NSwgMHhGNywweDAyLCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg3NSwweEY0LCAweEY2LDB4ODQsIAorMHg3QiwweDQ4LCAweEY3LDB4MDUsIDB4NzYsMHhGNCwgMHhGNywweDA0LCAweDdCLDB4NDAsIDB4QzYsMHhCMCwgMHg2OCwweDAwLCAweDI2LDB4QjQsIAorMHgwMCwweDA0LCAweDk3LDB4MDIsIDB4RkYsMHg2QywgMHg5NiwweDAyLCAweEZGLDB4NTAsIDB4RTAsMHgwMSwgMHgxNiwweEE4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzUsMHhFQywgMHhGNiwweDg0LCAweDdCLDB4MzgsIDB4RjUsMHg4MiwgMHgwMCwweDAxLCAweEY1LDB4ODUsIAorMHg3NiwweEY0LCAweEY2LDB4MDQsIDB4N0IsMHgzMCwgMHhDNiwweEI4LCAweDY4LDB4MDAsIDB4MjYsMHhCNCwgMHgwMCwweDA0LCAweDk2LDB4MDIsIAorMHhGRiwweDZDLCAweDk3LDB4MDIsIDB4RkYsMHg1MCwgMHg5NiwweDgyLCAweEZGLDB4NTgsIDB4RjUsMHg4NiwgMHg3MywweEJDLCAweEY1LDB4ODUsIAorMHg3NiwweDQ4LCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweEY3LDB4MDQsIAorMHg3QiwweDI4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4RjcsMHgwNSwgMHg3QiwweDI4LCAweEY3LDB4MDQsIAorMHg3NSwweEY0LCAweEY2LDB4ODQsIDB4N0IsMHgyOCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxNywweDIxLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEYwLDB4MDUsIDB4NzUsMHhGNCwgMHhGNywweDA0LCAweDc1LDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MTcsMHgyNSwgMHhGMCwweDA1LCAweDc1LDB4RjAsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIAorMHgxNiwweDQwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhFMCwweDAxLCAweDE3LDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEYwLDB4MDUsIAorMHg3NSwweEVDLCAweEY3LDB4MDQsIDB4NzUsMHhGQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEU2LDB4MDEsIAorMHgxNywweDQxLCAweEY2LDB4ODYsIDB4NzUsMHhGOCwgMHhFMCwweDAxLCAweDE3LDB4NTgsIDB4RjcsMHgwMiwgMHgwMCwweDAwLCAweEY3LDB4MDQsIAorMHg3NiwweDA4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg2OCwweDAwLCAweDg3LDB4M0EsIAorMHgwMCwweDE4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxNywweDk1LCAweEY3LDB4MDUsIAorMHg3NiwweDYwLCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHhGNiwweDg2LCAweDJDLDB4MjgsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGNSwweDAyLCAweDAwLDB4MEUsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDEsIAorMHgxNywweDhDLCAweEI1LDB4M0EsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RTAsMHgwMSwgMHgxNywweDk4LCAweEY1LDB4MDYsIAorMHg3MiwweEE0LCAweEY1LDB4MDYsIDB4NzIsMHgxOCwgMHhGNSwweDA1LCAweDc2LDB4NDgsIDB4RjUsMHg4NCwgMHg3NiwweEY4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4MkUsIDB4MDAsMHgyMSwgMHhFMiwweDAxLCAweDE3LDB4RTgsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweEY3LDB4MDQsIAorMHgyRCwweDM4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNiwweDM4LCAweDAwLDB4MDEsIDB4RjYsMHgwNSwgMHgyRCwweDM4LCAweDc3LDB4MzksIAorMHgwMCwweDAyLCAweDIwLDB4MzIsIDB4MDAsMHg0NCwgMHhFNiwweDAxLCAweDE3LDB4RDQsIDB4QjUsMHhCQSwgMHg2OCwweDAyLCAweEYwLDB4MDUsIAorMHgyRCwweDM4LCAweEY1LDB4MDIsIDB4MDAsMHgyMiwgMHhGNSwweDA1LCAweDc2LDB4RjgsIDB4RjUsMHgwNCwgMHg3NywweDAwLCAweEUwLDB4MDEsIAorMHgxNywweEVDLCAweEY1LDB4MDUsIDB4NzYsMHhGQywgMHhGMCwweDA1LCAweDc2LDB4RkMsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4MzgsIDB4RjcsMHgwNCwgMHg3NSwweEVDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDE4LDB4MzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHg3NSwweEYwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxOCwweDQ5LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDE2LDB4NDAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEUwLDB4MDEsIAorMHgxQywweDc0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNiwweDg0LCAweDc2LDB4NjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MzYsIAorMHgwMCwweDA4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg3MCwweDNBLCAweEZGLDB4RTEsIDB4RTYsMHgwMSwgMHgxOCwweDdELCAweEY0LDB4ODIsIAorMHgwMCwweDAwLCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgwMCwweEJDLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEUwLDB4MDEsIDB4MUMsMHg3MCwgMHhGMywweDA2LCAweDc1LDB4NjAsIDB4QzMsMHhCNCwgMHgwMCwweDAwLCAweDg0LDB4MUUsIAorMHgwMCwweDEwLCAweEY2LDB4ODQsIDB4NEEsMHhBMCwgMHgyMywweDE0LCAweDAwLDB4MjAsIDB4OTMsMHgxNiwgMHhGRiwweEM0LCAweDk0LDB4MTYsIAorMHhGRiwweEUwLCAweDk2LDB4OTYsIDB4RkYsMHhENCwgMHg4NSwweDFFLCAweDAwLDB4MTQsIDB4RjcsMHgwNCwgMHg0QSwweDlDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFQywweDAxLCAweDE5LDB4NjgsIDB4OTUsMHgxNiwgMHhGRiwweEU0LCAweDc3LDB4MzUsIAorMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjMsMHgwNiwgMHg0QSwweDk4LCAweEM2LDB4QjgsIAorMHgzMCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgwQywgMHhDNSwweDg0LCAweDAwLDB4MDAsIDB4ODcsMHgzNiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4M0EsIDB4NDIsMHgwMCwgMHhFNiwweDAxLCAweDE4LDB4RjgsIDB4QzYsMHgyNCwgMHgwMCwweDAwLCAweDg3LDB4MzYsIAorMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDUyLDB4MDAsIDB4RTYsMHgwMSwgMHgxOCwweEZDLCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweEY2LDB4MDIsIDB4MDAsMHgwMSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxOSwweDA5LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY1LDB4ODIsIDB4MDAsMHgwMCwgMHg4NiwweDM2LCAweDAwLDB4MDAsIDB4ODcsMHgxNiwgMHhGRiwweEUwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzIsIDB4NzIsMHgwMCwgMHhFMiwweDAxLCAweDE5LDB4NDQsIDB4RjUsMHgwMiwgMHgwMCwweDAwLCAweEMwLDB4MzIsIAorMHg3MiwweDAwLCAweEU2LDB4MDEsIDB4MTksMHg0QywgMHgyMCwweDJBLCAweDAwLDB4MDAsIDB4ODYsMHhCNiwgMHgwMCwweDA0LCAweDg3LDB4MTYsIAorMHhGRiwweEU0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RTIsMHgwMSwgMHgxOSwweDRELCAweDIwLDB4MkEsIAorMHgwMCwweDAwLCAweEY1LDB4MDIsIDB4MDAsMHgwMSwgMHgyMCwweDJBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxOSwweDVELCAweDIwLDB4MkUsIAorMHgwMCwweDAwLCAweEY1LDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDJFLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxOSwweDZDLCAweDIwLDB4MjYsIAorMHgwMCwweDAwLCAweEY0LDB4ODIsIDB4MDAsMHgwMSwgMHgyMCwweDI2LCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxOSwweEExLCAweEY2LDB4MDIsIAorMHgwMCwweDAxLCAweDg3LDB4MTYsIDB4RkYsMHhENCwgMHhGMywweDA2LCAweDRBLDB4OTgsIDB4NzYsMHhCOSwgMHgwMCwweDAxLCAweEM2LDB4QjQsIAorMHg3MCwweDAwLCAweDc2LDB4QjUsIDB4MDAsMHgwMiwgMHhDNiwweEI0LCAweDMwLDB4MDAsIDB4MDYsMHhCNCwgMHgwMCwweDE0LCAweDg2LDB4QjYsIAorMHgwMCwweDAwLCAweDk3LDB4MTYsIDB4RkYsMHhEOCwgMHhFMCwweDAxLCAweDFBLDB4MTQsIDB4OTYsMHg5NiwgMHhGRiwweERDLCAweDI3LDB4MTQsIAorMHgwMCwweDJDLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg4MywweDE2LCAweEZGLDB4QzQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkzLDB4MTMsIAorMHhGRiwweEZDLCAweEYzLDB4MDYsIDB4NEEsMHg5OCwgMHg5MywweDEzLCAweEZGLDB4RkMsIDB4OTMsMHg5NiwgMHhGRiwweENDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjUsMHg2OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODMsMHg5NiwgMHhGRiwweENDLCAweDIwLDB4MjIsIAorMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MUEsMHgxMSwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4ODcsMHgxNiwgMHhGRiwweEQ0LCAweEYzLDB4MDYsIAorMHg0QSwweDk4LCAweDc2LDB4QjksIDB4MDAsMHgwMSwgMHhDNiwweEI0LCAweDcwLDB4MDAsIDB4NzYsMHhCNSwgMHgwMCwweDAyLCAweEM2LDB4QjQsIAorMHgzMCwweDAwLCAweDA2LDB4QjQsIDB4MDAsMHgxNCwgMHg4NiwweEI2LCAweDAwLDB4MDAsIDB4OTcsMHgxNiwgMHhGRiwweEQ4LCAweDk2LDB4OTYsIAorMHhGRiwweERDLCAweEY3LDB4MDUsIDB4NEEsMHhBMCwgMHhFMCwweDAxLCAweDFBLDB4MTgsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEY2LDB4MDIsIAorMHgwMCwweDAwLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDFBLDB4MjgsIDB4RjQsMHg4MiwgMHgwMCwweDAxLCAweEUwLDB4MDEsIAorMHgxQSwweDgwLCAweEY0LDB4ODIsIDB4MDAsMHgwMCwgMHg4NiwweDk2LCAweEZGLDB4RDgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDc3LDB4MzUsIAorMHgwMCwweDAyLCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjYsMHg4NiwgMHg0MiwweEM4LCAweEE2LDB4M0EsIAorMHg2OCwweDAyLCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHg3NSwweDM5LCAweDAwLDB4MUUsIDB4NzUsMHgyOCwgMHhGRiwweEU1LCAweDA1LDB4QjgsIAorMHgwMCwweDAyLCAweDg2LDB4QUUsIDB4MDAsMHgwMCwgMHgwNywweDM4LCAweDAwLDB4MDQsIDB4OTcsMHgxNiwgMHhGRiwweEVDLCAweEM2LDB4MzAsIAorMHg1NywweEMwLCAweDc2LDB4MzAsIDB4RkYsMHhGMCwgMHg5NiwweDE2LCAweEZGLDB4RjQsIDB4NzUsMHhBRCwgMHgwMCwweDFFLCAweDc1LDB4QUMsIAorMHhGRiwweEU1LCAweEM2LDB4QjQsIDB4NUYsMHhDMCwgMHg3NiwweEI0LCAweEZGLDB4RjAsIDB4OTYsMHg5NiwgMHhGRiwweEYwLCAweDIwLDB4MjYsIAorMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MUEsMHg5NCwgMHhGNSwweDgyLCAweDAwLDB4MDAsIDB4RTAsMHgwMSwgMHgxQiwweDI4LCAweEY2LDB4MDIsIAorMHgwMCwweDAwLCAweDg2LDB4OTYsIDB4RkYsMHhGMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzcsMHgzNCwgMHg2OCwweDAwLCAweEM0LDB4OUMsIAorMHg3MiwweDAwLCAweEMwLDB4MkUsIDB4NkEsMHgwMCwgMHhFQywweDAxLCAweDFBLDB4RjQsIDB4QzUsMHgyNCwgMHgwMCwweDAwLCAweEM2LDB4MkMsIAorMHgwMCwweDAwLCAweDg3LDB4MTYsIDB4RkYsMHhFQywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QTYsMHhCMiwgMHg3MCwweDAyLCAweDA1LDB4QUMsIAorMHgwMCwweDAxLCAweEM3LDB4MzAsIDB4NzAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MUUsIDB4NzcsMHgzOCwgMHhGRiwweEU1LCAweEM2LDB4QjQsIAorMHg3NywweEMwLCAweDc2LDB4QjQsIDB4RkYsMHhGMCwgMHhGNiwweEFCLCAweDI4LDB4MDAsIDB4MDUsMHgyOCwgMHgwMCwweDAyLCAweDg3LDB4MTYsIAorMHhGRiwweEYwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDJFLCAweDcyLDB4MDAsIDB4RUMsMHgwMSwgMHgxQSwweEI1LCAweDA2LDB4MzAsIAorMHgwMCwweDAyLCAweEYzLDB4MDIsIDB4MDAsMHgwMSwgMHhGMywweDA1LCAweDc2LDB4RjQsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDg3LDB4MTYsIAorMHhGRiwweEYwLCAweDg2LDB4OUUsIDB4MDAsMHgwNCwgMHhDNywweDM4LCAweDcwLDB4MDAsIDB4QzcsMHgzOCwgMHg0OCwweDAwLCAweEM2LDB4QjQsIAorMHg3MCwweDAwLCAweDg3LDB4MTYsIDB4RkYsMHhGNCwgMHgwNiwweEI0LCAweDAwLDB4MjAsIDB4OTcsMHgwMiwgMHhGRiwweDZDLCAweDk0LDB4ODIsIAorMHhGRiwweDUwLCAweDk2LDB4ODIsIDB4RkYsMHg1OCwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxQywweDZDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEY3LDB4MDQsIDB4NzYsMHg1QywgMHhGNSwweDg0LCAweDc2LDB4RjgsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEY3LDB4MDUsIAorMHg3NiwweDVDLCAweEY3LDB4MDQsIDB4NzYsMHg1QywgMHgyMCwweDJFLCAweDAwLDB4MjEsIDB4RTIsMHgwMSwgMHgxQiwweDhDLCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHgyMCwweDMyLCAweDAwLDB4NDQsIDB4RTYsMHgwMSwgMHgxQiwweDc4LCAweEI1LDB4QkEsIAorMHg2OCwweDAyLCAweEYwLDB4MDUsIDB4MkQsMHgzOCwgMHhGMywweDAyLCAweDAwLDB4MjIsIDB4RjMsMHgwNSwgMHg3NiwweEY4LCAweEYzLDB4MDQsIAorMHg3NywweDAwLCAweEUwLDB4MDEsIDB4MUIsMHg5MCwgMHhGMywweDA1LCAweDc2LDB4RkMsIDB4RjAsMHgwNSwgMHg3NiwweEZDLCAweEY3LDB4MDQsIAorMHg3NSwweEY4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgxQiwweENELCAweEY2LDB4ODYsIAorMHgyQywweDI4LCAweEY3LDB4MDQsIDB4MkQsMHgzOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDYsMHgzOCwgMHgwMCwweDAxLCAweEY2LDB4MDUsIAorMHgyRCwweDM4LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhGMywweDAyLCAweDAwLDB4MEYsIDB4MjAsMHgzMiwgMHgwMCwweDQ0LCAweEU2LDB4MDEsIAorMHgxQiwweENDLCAweEIzLDB4M0EsIDB4NjgsMHgwMiwgMHhGMCwweDA1LCAweDJELDB4MzgsIDB4RjcsMHgwNCwgMHg3NiwweDA4LCAweEY2LDB4ODQsIAorMHg3NiwweDAwLCAweDA3LDB4MzgsIDB4MDAsMHgwMSwgMHhDMCwweDNBLCAweDZBLDB4MDAsIDB4RTYsMHgwMSwgMHgxQiwweEU4LCAweEY3LDB4MDUsIAorMHg3NiwweDA4LCAweEYwLDB4MDUsIDB4NzYsMHgwOCwgMHhGNiwweDg0LCAweDc2LDB4MDgsIDB4RjcsMHgwNCwgMHg3NiwweDA0LCAweEYwLDB4MDUsIAorMHg3NSwweEY4LCAweEY2LDB4MDYsIDB4NzUsMHhGOCwgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4NDcsMHgwQywgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MUMsMHgxNSwgMHhGNywweDA1LCAweDc1LDB4RkMsIDB4RTAsMHgwMSwgMHgxQywweDI0LCAweEY3LDB4MDIsIAorMHgwMCwweDAwLCAweDc3LDB4MzUsIDB4MDAsMHgwMiwgMHhDNywweDM4LCAweDYwLDB4MDAsIDB4ODcsMHgzQSwgMHgwMCwweDE4LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDFDLDB4NjUsIDB4RjcsMHgwNSwgMHg3NiwweDYwLCAweEY3LDB4MDQsIAorMHgyRCwweDM4LCAweEYzLDB4MDYsIDB4NzIsMHhBNCwgMHhGMywweDA1LCAweDc2LDB4NDgsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweDA2LDB4MzgsIAorMHgwMCwweDAxLCAweEY2LDB4MDUsIDB4MkQsMHgzOCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4RjMsMHgwMiwgMHgwMCwweDBFLCAweDIwLDB4MzIsIAorMHgwMCwweDQ0LCAweEU2LDB4MDEsIDB4MUMsMHg3NCwgMHhCMywweDNBLCAweDY4LDB4MDIsIDB4RTAsMHgwMSwgMHgxQywweDc0LCAweEYwLDB4MDUsIAorMHgyRCwweDM4LCAweEUwLDB4MDEsIDB4MUMsMHg3MCwgMHhGMywweDA2LCAweDcyLDB4MTgsIDB4RjMsMHgwNiwgMHg3MywweDMwLCAweEYzLDB4MDUsIAorMHg3NiwweDQ4LCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweEY3LDB4MDYsIAorMHg3NiwweDQ4LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDcyLDB4MTgsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHg3NiwweDQ4LCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4NzIsMHhBNCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNCwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDc2LDB4NDgsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHg3MywweDMwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNCwweEY0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4NzYsMHg0OCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHg3MywweEJDLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE0LDB4RjQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHg3NiwweDQ4LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDc0LDB4NDgsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTQsMHhGNCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwNiwgMHg3NiwweDQ4LCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4NzQsMHhENCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNCwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDc2LDB4NDgsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHg3NSwweDYwLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNCwweEY0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweEY2LDB4ODYsIAorMHg3NiwweDY4LCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHhGNiwweDg2LCAweDc3LDB4MDQsIDB4OTYsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTUsMHg0OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjYsMHg4NiwgMHgxRCwweEQ0LCAweDk2LDB4OTMsIAorMHhGRiwweEZDLCAweDkwLDB4MTMsIDB4RkYsMHhGQywgMHhGNiwweDg2LCAweDc2LDB4NjgsIDB4OTYsMHg5MywgMHhGRiwweEZDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDAsIDB4MTYsMHgxQywgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4RjcsMHgwMiwgMHgwMCwweDIyLCAweEY3LDB4MDUsIAorMHg3NiwweEY0LCAweEY3LDB4MDUsIDB4NzYsMHhGOCwgMHhGMCwweDA1LCAweDc2LDB4RkMsIDB4RjAsMHgwNSwgMHg3NywweDAwLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjcsMHgwNCwgMHg3NiwweEY0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgyMiwgMHhFNiwweDAxLCAweDFFLDB4MDEsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAwLCAweDE1LDB4ODQsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjcsMHgwNiwgMHg3NywweDA0LCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4NzYsMHg2OCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNCwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNiwweDg2LCAweDc4LDB4MTAsIDB4OTYsMHg5MywgMHhGRiwweEZDLCAweEY2LDB4ODYsIAorMHg3OCwweEE0LCAweDk2LDB4OTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDQ4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY2LDB4ODYsIDB4MUYsMHhCQywgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4RjYsMHg4MiwgMHgwMCwweDE0LCAweDk2LDB4OTMsIAorMHhGRiwweEZDLCAweEY2LDB4ODYsIDB4NzgsMHgxMCwgMHg5NiwweDkzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGMCwweDA1LCAweDc4LDB4OUMsIDB4OTAsMHgwMiwgMHhGRiwweDM0LCAweEY3LDB4MDIsIAorMHg3RiwweEZGLCAweEY3LDB4MDUsIDB4NzgsMHhBMCwgMHg5NywweDAyLCAweEZGLDB4MzAsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNiwweDA0LCAweDc4LDB4OUMsIDB4ODcsMHgxNiwgMHgwMCwweDAwLCAweDg0LDB4OTYsIAorMHgwMCwweDA4LCAweEY1LDB4ODYsIDB4NzcsMHgxMCwgMHg4NywweDNBLCAweDAwLDB4MDgsIDB4RjYsMHg4NiwgMHgyMSwweDhDLCAweDc1LDB4MzksIAorMHgwMCwweDA0LCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhBNywweDNBLCAweDY4LDB4MDIsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEM2LDB4QTgsIAorMHg1OCwweDAwLCAweDg0LDB4MTYsIDB4MDAsMHgwNCwgMHhDNiwweDMwLCAweDc1LDB4ODAsIDB4OTQsMHgzNiwgMHgwMCwweDA0LCAweEI0LDB4QUEsIAorMHg1OCwweDAyLCAweDg3LDB4MzYsIDB4MDAsMHgwOCwgMHhGNiwweDA1LCAweDc4LDB4OUMsIDB4MDcsMHgzOCwgMHgwMCwweDAxLCAweEU2LDB4MDEsIAorMHgxRiwweDJELCAweDk3LDB4MzYsIDB4MDAsMHgwOCwgMHg4NywweDAyLCAweEZGLDB4MzAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4M0EsIAorMHg0QSwweDAwLCAweEVFLDB4MDEsIDB4MUYsMHgzNSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RjQsMHg4NSwgMHg3OCwweEEwLCAweDk0LDB4ODIsIAorMHhGRiwweDMwLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDBDLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDg1LDB4OTYsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NywweDJFLCAweDAwLDB4MDgsIDB4RjYsMHg4NiwgMHgyMSwweDhDLCAweDc3LDB4MzksIAorMHgwMCwweDAyLCAweEE3LDB4M0EsIDB4NjgsMHgwMiwgMHhGNiwweDA0LCAweDc4LDB4OUMsIDB4QzcsMHgwNCwgMHg3NiwweDAwLCAweDg2LDB4QUUsIAorMHgwMCwweDA4LCAweEM2LDB4MzAsIDB4NzQsMHgwMCwgMHhGNywweDA2LCAweDc3LDB4MTAsIDB4RjYsMHgwNSwgMHg3OCwweDlDLCAweDc2LDB4QjUsIAorMHgwMCwweDA0LCAweEM2LDB4QjQsIDB4NzAsMHgwMCwgMHg4NywweDM2LCAweDAwLDB4MDgsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEU2LDB4MDEsIDB4MUYsMHhBOCwgMHg5NywweDM2LCAweDAwLDB4MDgsIDB4RjcsMHgwMiwgMHg3RiwweEZGLCAweEY3LDB4MDUsIAorMHg3OCwweEEwLCAweDk3LDB4MDIsIDB4RkYsMHgzMCwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDA0LCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweDIyLDB4MTAsIDB4MDAsMHgwOCwgMHhGNywweDA0LCAweDc4LDB4OUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MjAsMHhEMSwgMHhGNiwweDAyLCAweDdGLDB4RkYsIDB4OTYsMHgxNiwgMHhGRiwweEY0LCAweEY2LDB4ODQsIAorMHgyRCwweDQwLCAweEY2LDB4MDYsIDB4NzcsMHgxMCwgMHgyNiwweEI0LCAweDAwLDB4MDEsIDB4NzcsMHgzNSwgMHgwMCwweDA0LCAweEM0LDB4QjgsIAorMHg2MCwweDAwLCAweEMzLDB4MzgsIDB4MDAsMHgwMCwgMHg3NCwweDM1LCAweDAwLDB4MDIsIDB4RjYsMHgwNiwgMHg3NywweDEwLCAweEMwLDB4MjYsIAorMHg2MiwweDAwLCAweEVDLDB4MDEsIDB4MjAsMHhDMSwgMHhGNiwweDA2LCAweDIxLDB4OEMsIDB4RjMsMHg4NCwgMHg3OCwweDlDLCAweEE3LDB4MjIsIAorMHg2MCwweDAyLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMCwweDFFLCAweDc0LDB4MDAsIDB4RTYsMHgwMSwgMHgyMCwweEIxLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg2LDB4QTYsIDB4MDAsMHgwMCwgMHhGNywweDA0LCAweDc4LDB4QTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM2LDB4QjQsIAorMHg3MiwweDAwLCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHhFRSwweDAxLCAweDIwLDB4OTgsIDB4OTYsMHhBNiwgMHgwMCwweDAwLCAweEY3LDB4MDQsIAorMHgyRCwweDM4LCAweEY2LDB4MDYsIDB4NzcsMHgxMCwgMHhDNSwweDE4LCAweDYwLDB4MDAsIDB4RjYsMHg4NiwgMHgyQywweDI4LCAweDg2LDB4MkEsIAorMHgwMCwweDA0LCAweDA1LDB4QjgsIDB4MDAsMHgwMSwgMHhGNSwweDg1LCAweDJELDB4MzgsIDB4NzcsMHgzOSwgMHgwMCwweDAyLCAweDIwLDB4MkUsIAorMHgwMCwweDQ0LCAweEU2LDB4MDEsIDB4MjAsMHg3MCwgMHhCNiwweDNBLCAweDY4LDB4MDIsIDB4RjAsMHgwNSwgMHgyRCwweDM4LCAweDg2LDB4MkEsIAorMHgwMCwweDA4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NiwweDJBLCAweDAwLDB4MEMsIDB4RjYsMHgwNiwgMHgyMSwweDhDLCAweEE3LDB4MjIsIAorMHg2MCwweDAyLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDA0LCAweDc2LDB4MDAsIDB4QzcsMHgxQywgMHg3NCwweDAwLCAweEUwLDB4MDEsIAorMHgyMCwweEIwLCAweEY3LDB4MDUsIDB4NzgsMHg5QywgMHg4NiwweDE2LCAweEZGLDB4RjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg2MiwweDAwLCAweEVDLDB4MDEsIDB4MjAsMHhCMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTYsMHg5NiwgMHhGRiwweEY0LCAweDI0LDB4QTQsIAorMHgwMCwweDEwLCAweDIzLDB4MTgsIDB4MDAsMHgxMCwgMHhFMCwweDAxLCAweDFGLDB4RkMsIDB4MjQsMHgyMCwgMHgwMCwweDA0LCAweDg2LDB4MTYsIAorMHhGRiwweEY0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhGNiwweDA1LCAweDc4LDB4QTAsIDB4OTYsMHgwMiwgMHhGRiwweDMwLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4ODcsMHgxNiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4M0EsIDB4MDAsMHgwOCwgMHhGNiwweDg2LCAweDc3LDB4MTAsIDB4NzcsMHgzOSwgMHgwMCwweDA0LCAweEM3LDB4MzgsIAorMHg2OCwweDAwLCAweDg2LDB4QkEsIDB4MDAsMHgwQywgMHg4NywweDNBLCAweDAwLDB4MDgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweDQ0LDB4MEMsIDB4MDAsMHgwMSwgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDA0LCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweEY3LDB4MDIsIDB4MDAsMHgwRiwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RUMsMHgwMSwgMHgyMSwweDVELCAweEY2LDB4ODYsIAorMHg3NywweDE4LCAweDkwLDB4MzYsIDB4MDAsMHgwMCwgMHgyNywweDM4LCAweDAwLDB4MDEsIDB4QzYsMHgwNCwgMHgwMCwweDAwLCAweEMwLDB4M0EsIAorMHg2MiwweDAwLCAweEU2LDB4MDEsIDB4MjEsMHg0NCwgMHgwNiwweEI0LCAweDAwLDB4MTAsIDB4RjYsMHgwNiwgMHg3OCwweEE0LCAweDk2LDB4MTMsIAorMHhGRiwweEZDLCAweEY2LDB4MDYsIDB4NzgsMHgxMCwgMHg5NiwweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNCwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDAwLDB4MDAsIAorMHgwMCwweDAyLCAweDAwLDB4MDAsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDgsIDB4MDAsMHgwMCwgMHgwMCwweDEwLCAweDAwLDB4MDAsIAorMHgwMCwweDIwLCAweDAwLDB4MDAsIDB4MDAsMHg0MCwgMHgwMCwweDAwLCAweDAwLDB4ODAsIDB4MDAsMHgwMCwgMHgwMSwweDAwLCAweDAwLDB4MDAsIAorMHgwMiwweDAwLCAweDAwLDB4MDAsIDB4MDQsMHgwMCwgMHgwMCwweDAwLCAweDA4LDB4MDAsIDB4MDAsMHgwMCwgMHgxMCwweDAwLCAweDAwLDB4MDAsIAorMHgyMCwweDAwLCAweDAwLDB4MDAsIDB4NDAsMHgwMCwgMHgwMCwweDAwLCAweDgwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHhGNywweDA2LCAweDc4LDB4QjAsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHg3OSwweENDLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNSwweDQ4LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4MjIsMHgyQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4RjcsMHgwMiwgMHgwMCwweDE1LCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4NzgsMHhCMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNiwweDFDLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDk2LCAweEZGLDB4RkMsIDB4ODIsMHg5NiwgMHhGRiwweEY4LCAweDAyLDB4MTQsIAorMHgwMCwweDAwLCAweDAxLDB4M0MsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTIsMHg5MywgMHhGRiwweEZDLCAweDAyLDB4OTAsIAorMHgwMCwweDA4LCAweEY2LDB4ODQsIDB4NkYsMHg0NCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHgzNiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMiwgMHhFNiwweDAxLCAweDIyLDB4NzAsIDB4RjYsMHgwMiwgMHgwMCwweDAwLCAweDg3LDB4MzYsIAorMHgwRSwweEY0LCAweDg2LDB4QjYsIDB4MEUsMHhGOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzQSwgMHg2QSwweDAwLCAweDQ3LDB4MEMsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDIyLDB4NzgsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEY2LDB4MDIsIAorMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDIyLDB4OTQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEY3LDB4MDQsIAorMHgzMiwweEU4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgyMiwweEIxLCAweEY1LDB4ODIsIAorMHgwMywweEU4LCAweDBGLDB4ODEsIDB4NDAsMHgwMCwgMHhGNywweDA0LCAweDc5LDB4QzgsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweEY3LDB4MDUsIDB4NzksMHhDOCwgMHhGNywweDA0LCAweDc5LDB4QzgsIDB4RjUsMHg4MiwgMHgwMywweEU4LCAweDk1LDB4OTMsIAorMHhGRiwweEZDLCAweEY1LDB4ODIsIDB4MDAsMHgxNSwgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4RjUsMHg4NiwgMHg3OSwweENDLCAweDk1LDB4OTMsIAorMHhGRiwweEZDLCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhFMCwweDAxLCAweDFFLDB4QzAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MDAsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDkyLDB4OTMsIDB4RkYsMHhGQywgMHgwMiwweDkwLCAweDAwLDB4MDgsIDB4RjcsMHgwNiwgMHg3OSwweENDLCAweDk3LDB4MTMsIAorMHhGRiwweEZDLCAweEY3LDB4MDYsIDB4NzgsMHhCMCwgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDAsIAorMHgxNCwweEY0LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHhGNywweDA2LCAweDc5LDB4Q0MsIDB4OTcsMHgxMywgMHhGRiwweEZDLCAweEY3LDB4MDYsIAorMHg3OSwweDNDLCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMCwgMHgxNCwweEY0LCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDMSwweDNDLCAweDAwLDB4MDAsIDB4MDIsMHgxMCwgMHgwMCwweDA0LCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4MEMsIDB4ODUsMHg5NiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg2LDB4QUUsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEU2LDB4MDEsIAorMHgyMywweDg0LCAweDI3LDB4MTQsIDB4MDAsMHgwQywgMHg4NywweDJFLCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDAxLCAweDk3LDB4MkUsIDB4MDAsMHgwNCwgMHg4NywweDJFLCAweDAwLDB4MDQsIDB4RTAsMHgwMSwgMHgyNCwweDM0LCAweDk2LDB4OTYsIAorMHhGRiwweEY0LCAweDk3LDB4MTMsIDB4RkYsMHhGQywgMHg4NSwweDE2LCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4MTMsIAorMHhGRiwweEZDLCAweDk1LDB4OTMsIDB4RkYsMHhGQywgMHg5NSwweDk2LCAweEZGLDB4RUMsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEUwLDB4MDEsIAorMHgyNSwweDY4LCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NSwweDk2LCAweEZGLDB4RUMsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDEsIAorMHgyNCwweDM0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4NiwweEFFLCAweDAwLDB4MDQsIDB4ODYsMHgxNiwgMHhGRiwweEY0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MzYsIDB4NjIsMHgwMCwgMHhFRSwweDAxLCAweDI0LDB4MjEsIDB4NzcsMHgzNSwgMHgwMCwweDAxLCAweEM3LDB4MzgsIAorMHg2OCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhDNiwweEI4LCAweDU4LDB4MDAsIDB4NzcsMHgzMSwgMHgwMCwweDAxLCAweEM3LDB4MzgsIAorMHg2MCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhDNywweDM4LCAweDU4LDB4MDAsIDB4ODUsMHgzNiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDk1LDB4MzYsIDB4MDAsMHgwQywgMHg4NSwweDM2LCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4MzYsIAorMHgwMCwweDEwLCAweDg1LDB4MzYsIDB4MDAsMHgwOCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTUsMHgzNiwgMHgwMCwweDE0LCAweDI2LDB4QjQsIAorMHgwMCwweDBDLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFRSwweDAxLCAweDIzLDB4RUMsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg3LDB4MkUsIAorMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwNywweDM4LCAweDAwLDB4MDEsIDB4OTcsMHgyRSwgMHgwMCwweDA0LCAweDg3LDB4MkUsIAorMHgwMCwweDA0LCAweDg2LDB4OTYsIDB4RkYsMHhGNCwgMHg4NSwweDE2LCAweDAwLDB4MDQsIDB4NzcsMHgzNSwgMHgwMCwweDAxLCAweEM3LDB4MzgsIAorMHg2OCwweDAwLCAweDc3LDB4MzksIDB4MDAsMHgwMiwgMHhDNywweDJDLCAweDcwLDB4MDAsIDB4ODUsMHgyQSwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDk1LDB4M0EsIDB4MDAsMHgwQywgMHg4NSwweDE2LCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDg1LDB4MkEsIAorMHgwMCwweDA0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDNBLCAweDAwLDB4MTAsIDB4ODUsMHgxNiwgMHgwMCwweDA4LCAweEY0LDB4MDIsIAorMHgwMCwweDAxLCAweDk1LDB4M0EsIDB4MDAsMHgxNCwgMHg5NiwweEFFLCAweDAwLDB4MDgsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwQywgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4MEMsIDB4ODUsMHg5NiwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg0LDB4MkUsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgyMiwgMHgwMCwweDAwLCAweEU2LDB4MDEsIAorMHgyNSwweDU1LCAweDI3LDB4MTQsIDB4MDAsMHgwQywgMHg5NywweDEzLCAweEZGLDB4RkMsIDB4ODUsMHgxNiwgMHgwMCwweDA0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDk1LDB4MTMsIDB4RkYsMHhGQywgMHg5NSwweDkzLCAweEZGLDB4RkMsIDB4OTUsMHg5NiwgMHhGRiwweEVDLCAweDA3LDB4ODgsIAorMHgwMCwweDA4LCAweEUwLDB4MDEsIDB4MjUsMHg2OCwgMHg5NywweDkzLCAweEZGLDB4RkMsIDB4ODUsMHg5NiwgMHhGRiwweEVDLCAweDIwLDB4MjIsIAorMHgwMCwweDAwLCAweEU2LDB4MDEsIDB4MjUsMHg1NSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHgxNiwgMHhGRiwweEY0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhFRSwweDAxLCAweDI1LDB4NDUsIDB4NzcsMHgzMSwgMHgwMCwweDAxLCAweEM2LDB4QUMsIAorMHgwMCwweDAwLCAweEM3LDB4MzgsIDB4NjAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4QzcsMHgzOCwgMHg1OCwweDAwLCAweDg1LDB4MzYsIAorMHgwMCwweDE4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NSwweDM2LCAweDAwLDB4MEMsIDB4ODUsMHgzNiwgMHgwMCwweDFDLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDk1LDB4MzYsIDB4MDAsMHgxMCwgMHg4NSwweDM2LCAweDAwLDB4MjAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk1LDB4MzYsIAorMHgwMCwweDE0LCAweDA2LDB4QjQsIDB4MDAsMHgwQywgMHhDMCwweDM2LCAweDcyLDB4MDAsIDB4RUMsMHgwMSwgMHgyNSwweDExLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4MkUsIDB4MDAsMHgwNCwgMHhGNCwweDAyLCAweDAwLDB4MDEsIDB4MjcsMHgzOCwgMHgwMCwweDAxLCAweDk3LDB4MkUsIAorMHgwMCwweDA0LCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDA4LCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIAorMHgwMCwweDA4LCAweDgzLDB4OTYsIDB4MDAsMHgwNCwgMHg4MywweDE2LCAweDAwLDB4MDAsIDB4QzUsMHgwMCwgMHgwMCwweDAwLCAweDg0LDB4MUEsIAorMHgwMCwweDA0LCAweEM0LDB4QTgsIDB4MDAsMHgwMCwgMHg5NCwweDE2LCAweEZGLDB4RjQsIDB4QzAsMHgyNiwgMHg0MiwweDAwLCAweEU2LDB4MDEsIAorMHgyNiwweEQxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg4MywweDE2LCAweEZGLDB4RjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MkEsIAorMHgzMiwweDAwLCAweEU2LDB4MDEsIDB4MjYsMHhEMSwgMHhDNywweDIwLCAweDRBLDB4MDAsIDB4OTUsMHgxNiwgMHhGRiwweEY0LCAweDc2LDB4QjgsIAorMHhGRiwweEUxLCAweEM3LDB4MzgsIDB4NjgsMHgwMCwgMHg3NywweDM5LCAweEZGLDB4RkYsIDB4QzUsMHgyNCwgMHg3MCwweDAwLCAweDc3LDB4MjksIAorMHgwMCwweDAxLCAweEM3LDB4MzgsIDB4NTAsMHgwMCwgMHg3NywweDM5LCAweDAwLDB4MDIsIDB4ODMsMHgxNiwgMHgwMCwweDAwLCAweDg2LDB4OUUsIAorMHgwMCwweDAwLCAweEM1LDB4QjgsIDB4MzAsMHgwMCwgMHgwNSwweEFDLCAweDAwLDB4MEMsIDB4ODcsMHgyRSwgMHgwMCwweDAwLCAweEM2LDB4MDAsIAorMHgwMCwweDAwLCAweEMwLDB4MzYsIDB4NzIsMHgwMCwgMHhFNiwweDAxLCAweDI2LDB4MTAsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweDg2LDB4OUUsIAorMHgwMCwweDA0LCAweDg3LDB4MkUsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzAsMHgzNiwgMHg3MiwweDAwLCAweEU2LDB4MDEsIAorMHgyNiwweDEwLCAweDIwLDB4MzIsIDB4MDAsMHgwMCwgMHhGNiwweDAyLCAweDAwLDB4MDEsIDB4MjAsMHgzMiwgMHgwMCwweDAwLCAweEU2LDB4MDEsIAorMHgyNiwweDI1LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHhDNywweDAwLCAweDAwLDB4MDAsIDB4RTAsMHgwMSwgMHgyNiwweDc4LCAweDIwLDB4M0EsIAorMHgwMCwweDAwLCAweDg2LDB4OUUsIDB4MDAsMHgwMCwgMHg4NywweDJFLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEUyLDB4MDEsIDB4MjYsMHg1QywgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4RTYsMHgwMSwgMHgyNiwweDY0LCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweDg2LDB4OUUsIDB4MDAsMHgwNCwgMHg4NywweDJFLCAweDAwLDB4MDQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEMwLDB4MzYsIAorMHg3MiwweDAwLCAweEUyLDB4MDEsIDB4MjYsMHg2NSwgMHgyMCwweDMyLCAweDAwLDB4MDAsIDB4RjYsMHgwMiwgMHgwMCwweDAxLCAweDIwLDB4MzIsIAorMHgwMCwweDAwLCAweDQ3LDB4MDQsIDB4RkYsMHhGRiwgMHhFNiwweDAxLCAweDI2LDB4NzksIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEY3LDB4MDIsIAorMHgwMCwweDAxLCAweDIwLDB4M0EsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDI2LDB4QjEsIDB4MjAsMHgzQSwgMHgwMCwweDAwLCAweEVFLDB4MDEsIAorMHgyNiwweEEwLCAweDIwLDB4M0EsIDB4MDAsMHgwMSwgMHg0MywweDA0LCAweEZGLDB4RkYsIDB4QzAsMHgzQSwgMHgzMiwweDAwLCAweEU2LDB4MDEsIAorMHgyNiwweEM5LCAweEMwLDB4MjYsIDB4NDIsMHgwMCwgMHhFMCwweDAxLCAweDI1LDB4OTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEU2LDB4MDEsIAorMHgyNiwweEMxLCAweEMwLDB4MjYsIDB4NDIsMHgwMCwgMHhFMCwweDAxLCAweDI1LDB4OTAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDgzLDB4MTYsIAorMHgwMCwweDA4LCAweEY0LDB4MDIsIDB4MDAsMHgwMSwgMHhFMCwweDAxLCAweDI2LDB4RTAsIDB4OTUsMHgxQSwgMHgwMCwweDAwLCAweEUwLDB4MDEsIAorMHgyNSwweDhDLCAweEM0LDB4QTgsIDB4MDAsMHgwMCwgMHhFMCwweDAxLCAweDI1LDB4OEMsIDB4QzQsMHgyOCwgMHgwMCwweDAwLCAweDgzLDB4MTYsIAorMHgwMCwweDA4LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NCwweDFBLCAweDAwLDB4MDAsIDB4QzQsMHgwMCwgMHgwMCwweDAwLCAweDg3LDB4OTYsIAorMHhGRiwweEZDLCAweDgyLDB4OTYsIDB4RkYsMHhGOCwgMHgwMiwweDE0LCAweDAwLDB4MEMsIDB4MDEsMHgzQywgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDg1LDB4OTYsIAorMHgwMCwweDA0LCAweDg0LDB4MTYsIDB4MDAsMHgwMCwgMHg4NCwweDk2LCAweDAwLDB4MDgsIDB4RjcsMHgwMiwgMHgwMCwweDAzLCAweEM2LDB4QTAsIAorMHg0RCwweDgwLCAweEM2LDB4QjYsIDB4NzQsMHgwMCwgMHhFNiwweDAxLCAweDI3LDB4NzEsIDB4QzYsMHgyMCwgMHgwMCwweDAwLCAweDIwLDB4MzYsIAorMHgwMCwweDAyLCAweEU2LDB4MDEsIDB4MjcsMHhBMCwgMHhDNSwweDIwLCAweDQ4LDB4MDAsIDB4QzcsMHgyMCwgMHg0OCwweDAwLCAweDI3LDB4MzgsIAorMHgwMCwweDAyLCAweEMwLDB4MjIsIDB4NzIsMHgwMCwgMHhFMiwweDAxLCAweDI3LDB4OUMsIDB4QzUsMHgzOCwgMHgwMCwweDAwLCAweDg3LDB4MkUsIAorMHgwMCwweDAwLCAweDc2LDB4QUQsIDB4MDAsMHgxRSwgMHg3NiwweEI0LCAweEZGLDB4RTUsIDB4QzcsMHgzOCwgMHg2RiwweEMwLCAweDc3LDB4MzgsIAorMHhGRiwweEYwLCAweEY3LDB4MzMsIDB4MjgsMHgwMCwgMHgwNiwweDMwLCAweDAwLDB4MDIsIDB4QzAsMHgzMiwgMHg1MiwweDAwLCAweEUyLDB4MDEsIAorMHgyNywweDQxLCAweDA1LDB4QUMsIDB4MDAsMHgwMiwgMHhFMCwweDAxLCAweDI3LDB4QTAsIDB4QzUsMHgyMCwgMHg0OCwweDAwLCAweEM3LDB4MjAsIAorMHg0OCwweDAwLCAweDI3LDB4MzgsIDB4MDAsMHgwNCwgMHhDMCwweDIyLCAweDcyLDB4MDAsIDB4RTIsMHgwMSwgMHgyNywweEEwLCAweEM1LDB4MjAsIAorMHg0OCwweDAwLCAweDgzLDB4QUQsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4OTMsMHhCMSwgMHgwMCwweDA0LCAweEMwLDB4MzIsIAorMHg3MiwweDAwLCAweEUyLDB4MDEsIDB4MjcsMHg4NSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzUsMHgyMCwgMHg0OCwweDAwLCAweEMwLDB4MzIsIAorMHg1MiwweDAwLCAweEU0LDB4MDEsIDB4MjcsMHhENSwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODYsMHhBRSwgMHgwMCwweDAwLCAweDc3LDB4MkQsIAorMHgwMCwweDFFLCAweDc3LDB4MzgsIDB4RkYsMHhFNSwgMHhDNiwweEI0LCAweDc3LDB4QzAsIDB4NzYsMHhCNSwgMHhGRiwweEU4LCAweEY2LDB4QjMsIAorMHg2OCwweDAwLCAweDA2LDB4MzAsIDB4MDAsMHgwMSwgMHhDMCwweDMyLCAweDUyLDB4MDAsIDB4RTQsMHgwMSwgMHgyNywweEFDLCAweDA1LDB4QUMsIAorMHgwMCwweDAxLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDBDLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDg0LDB4MTYsIAorMHgwMCwweDAwLCAweDg2LDB4OTYsIDB4MDAsMHgwNCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4QzcsMHgyMiwgMHg2RCwweDgwLCAweEU2LDB4MDEsIAorMHgyOCwweDEwLCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHhFMCwweDAxLCAweDI4LDB4NzQsIDB4QzQsMHgzOCwgMHgwMCwweDAwLCAweEY3LDB4MDIsIAorMHgwMCwweDAxLCAweEVFLDB4MDEsIDB4MjgsMHg0MSwgMHhGNiwweDAyLCAweDAwLDB4MDAsIDB4NzYsMHhCNSwgMHgwMCwweDAxLCAweDIwLDB4MzYsIAorMHgwMCwweDAwLCAweEVFLDB4MDEsIDB4MjgsMHgxQywgMHg3NywweDM5LCAweDAwLDB4MDEsIDB4RTAsMHgwMSwgMHgyOCwweDQ0LCAweDIwLDB4MjIsIAorMHgwMCwweDAwLCAweDc0LDB4MjEsIDB4MDAsMHgwMSwgMHg3NywweDM4LCAweEZGLDB4RkYsIDB4MDYsMHgzMCwgMHgwMCwweDAxLCAweDIwLDB4MjIsIAorMHgwMCwweDAwLCAweEVFLDB4MDEsIDB4MjgsMHgzNCwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgyOCwweDcxLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweEMwLDB4MjIsIDB4NkEsMHgwMCwgMHhFNCwweDAxLCAweDI4LDB4NjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweEM0LDB4MjAsIAorMHg2QSwweDAwLCAweDc3LDB4M0EsIDB4RkYsMHhGRiwgMHhFNiwweDAxLCAweDI4LDB4NTQsIDB4NzYsMHhCNCwgMHhGRiwweEZGLCAweEQ0LDB4MjAsIAorMHgwNywweDYyLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDA4LCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweDIyLDB4MTAsIAorMHgwMCwweDA0LCAweEUwLDB4MDEsIDB4MjgsMHhDQywgMHhGNywweDA2LCAweDI5LDB4REMsIDB4ODYsMHhCQSwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDIwLDB4MzYsIDB4MDAsMHgwMCwgMHhFNiwweDAxLCAweDI4LDB4QzksIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDk3LDB4MTYsIAorMHhGRiwweEY0LCAweDA3LDB4ODgsIDB4MDAsMHgwOCwgMHhDMSwweDM0LCAweDAwLDB4MDAsIDB4OTcsMHg5MywgMHhGRiwweEZDLCAweDg3LDB4MTYsIAorMHhGRiwweEY0LCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyNywweDM4LCAweDAwLDB4MDQsIDB4RjYsMHgwNiwgMHgyOSwweEUwLCAweEMwLDB4M0EsIAorMHg2MiwweDAwLCAweEU0LDB4MDEsIDB4MjgsMHg5RCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4ODcsMHg5NiwgMHhGRiwweEZDLCAweDgyLDB4OTYsIAorMHhGRiwweEY4LCAweDAyLDB4MTQsIDB4MDAsMHgwMCwgMHgwMSwweDNDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDkyLDB4OTMsIAorMHhGRiwweEZDLCAweDAyLDB4OTAsIDB4MDAsMHgwOCwgMHgyMiwweDEwLCAweDAwLDB4MDQsIDB4RTAsMHgwMSwgMHgyOSwweDM0LCAweEY3LDB4MDYsIAorMHgyOSwweDk4LCAweDg2LDB4QkEsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIDB4MjAsMHgzNiwgMHgwMCwweDAwLCAweEU2LDB4MDEsIAorMHgyOSwweDMxLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5NywweDE2LCAweEZGLDB4RjQsIDB4MDcsMHg4OCwgMHgwMCwweDA4LCAweEMxLDB4MzQsIAorMHgwMCwweDAwLCAweDk3LDB4OTMsIDB4RkYsMHhGQywgMHg4NywweDE2LCAweEZGLDB4RjQsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDA3LDB4MzgsIAorMHgwMCwweDA0LCAweEY2LDB4MDYsIDB4MjksMHhFMCwgMHhDMCwweDNBLCAweDYyLDB4MDAsIDB4RTQsMHgwMSwgMHgyOSwweDA0LCAweDAwLDB4MDAsIAorMHgwMCwweDAxLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHg5MiwweDkzLCAweEZGLDB4RkMsIDB4MDIsMHg5MCwgMHgwMCwweDA4LCAweEY3LDB4MDQsIAorMHg3QiwweDUwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgyMCwweDNBLCAweDAwLDB4MDAsIDB4RTYsMHgwMSwgMHgyOSwweDg0LCAweEY2LDB4ODIsIAorMHgwMCwweDAxLCAweEY2LDB4ODUsIDB4N0IsMHg1MCwgMHgwNywweDg4LCAweDAwLDB4MDgsIDB4RTAsMHgwMSwgMHgyOCwweEYwLCAweDk3LDB4OTMsIAorMHhGRiwweEZDLCAweDg3LDB4OTYsIDB4RkYsMHhGQywgMHg4MiwweDk2LCAweEZGLDB4RjgsIDB4MDIsMHgxNCwgMHgwMCwweDAwLCAweDAxLDB4M0MsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMSwgMHgwMCwweDAwLCAweDBCLDB4NEMsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHg0MiwweDg4LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDVFLDB4NTAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHhDNywweEE4LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDBCLDB4RDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIAorMHgxQywweDg4LCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDFFLDB4MTQsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIAorMHgyMSwweDJDLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAxLCAweDIyLDB4RTQsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCB9IDsKKworCisvKiBUaGlzIGlzIHRoZSBMQU5haSBkYXRhICovIAorCitzdGF0aWMgdW5zaWduZWQgaW50IGxhbmFpNF9kYXRhX29mZiA9IDB4OTRGMDsgLyogaGFsZi13b3JkIG9mZnNldCAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgbGFuYWk0X2RhdGFbMjA0NzJdIF9faW5pdGRhdGEgPSB7CisweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAorMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgfSA7CisKKworI2lmZGVmIFNZTUJPTF9ERUZJTkVTX0NPTVBJTEVECisvKiBUaGVzZSBhcmUgaGFsZi13b3JkIGFkZHJlc3NlcyAtIE5PVCBieXRlIG9mZnNldHMgKi8KKyNkZWZpbmUgTVlSSV9HZW5lcmF0ZU1hcFZlcnNpb24gICAgICAweEJEMDgKKyNkZWZpbmUgTVlSSV9Nb3JlVG9HZW5lcmF0ZSAgICAgICAgICAweEJEMEMKKyNkZWZpbmUgTVlSSV9HZW5lcmF0ZU1lc3NhZ2UgICAgICAgICAweEJDRUMKKyNkZWZpbmUgTVlSSV9SZWxheU1hcFZlcnNpb24gICAgICAgICAweEJEMDQKKyNkZWZpbmUgTVlSSV9SZWxheVN0YXJ0ICAgICAgICAgICAgICAweEJEMDAKKyNkZWZpbmUgTVlSSV9SZWxheURpcmVjdGlvbiAgICAgICAgICAweEJDRkMKKyNkZWZpbmUgTVlSSV9SZWxheUluZGV4ICAgICAgICAgICAgICAweEJDRjQKKyNkZWZpbmUgTVlSSV9SZWxheVN0b3AgICAgICAgICAgICAgICAweEJDRjgKKyNkZWZpbmUgTVlSSV9SZWxheU1lc3NhZ2UgICAgICAgICAgICAweEJDRjAKKyNkZWZpbmUgTVlSSV9Ccm9hZGNhc3RSZWxheU1lc3NhZ2VzU2VudCAweEJEMTAKKyNkZWZpbmUgTVlSSV9TZW5kTXVsdGlwbGV4R3JhYmJlZCAgICAweEJEM0MKKyNkZWZpbmUgTVlSSV9Ib3N0UmVjZWl2ZUl0ZW0gICAgICAgICAweEJEMTQKKyNkZWZpbmUgTVlSSV9Ib3N0UmVjZWl2ZU51bVNjYXR0ZXJzICAweEJENTAKKyNkZWZpbmUgTVlSSV9Ib3N0UmVjZWl2ZVNjYXR0ZXJJbmRleCAweEJENDQKKyNkZWZpbmUgTVlSSV9Ib3N0UmVjZWl2ZVNjYXR0ZXJQb2ludGVyIDB4QkQ0QworI2RlZmluZSBNWVJJX0hvc3RSZWNlaXZlU2NhdHRlckxlbmd0aCAweEJENDgKKyNkZWZpbmUgTVlSSV9Ib3N0UmVjZWl2ZUNoZWNrc3VtICAgICAweEJENDAKKyNkZWZpbmUgTVlSSV9Sb3V0ZU51bUZyYWdtZW50cyAgICAgICAweEJENjAKKyNkZWZpbmUgTVlSSV9Sb3V0ZUZyYWdtZW50ICAgICAgICAgICAweEJENUMKKyNkZWZpbmUgTVlSSV9Sb3V0ZVN0YW1wICAgICAgICAgICAgICAweEJENTgKKyNkZWZpbmUgTVlSSV9Sb3V0ZXNTb0ZhciAgICAgICAgICAgICAweEJENjQKKyNkZWZpbmUgTVlSSV9NYXBWZXJzaW9uQ2hhbmdlZCAgICAgICAweEJENjgKKyNkZWZpbmUgTVlSSV9tYXBfYyAgICAgICAgICAgICAgICAgICAweEJENTQKKyNkZWZpbmUgTVlSSV9wYWNrX2xpc3QgICAgICAgICAgICAgICAweDc4OUMKKyNkZWZpbmUgTVlSSV9wYWNrX3RhYmxlICAgICAgICAgICAgICAweDc4QkEKKyNkZWZpbmUgTVlSSV9tc2cyZXZlbnQgICAgICAgICAgICAgICAweDdGRjYKKyNkZWZpbmUgTVlSSV9WZXJzaW9uU3RyaW5nICAgICAgICAgICAweEI3QTAKKyNkZWZpbmUgTVlSSV9TaXplb2ZDaGFubmVsICAgICAgICAgICAweEJEODAKKyNkZWZpbmUgTVlSSV9FbmRPZlF1ZXVlU3BhY2UgICAgICAgICAweEJEODQKKyNkZWZpbmUgTVlSSV9GcmVlQ29kZSAgICAgICAgICAgICAgICAweEJENzgKKyNkZWZpbmUgTVlSSV9GcmVlRGF0YSAgICAgICAgICAgICAgICAweEJEN0MKKyNkZWZpbmUgTVlSSV9Bc3NlcnRpbmcgICAgICAgICAgICAgICAweEJENkMKKyNkZWZpbmUgTVlSSV9WZXJzaW9uICAgICAgICAgICAgICAgICAweEJENzQKKyNkZWZpbmUgTVlSSV9Qcm9jZXNzb3IgICAgICAgICAgICAgICAweEJENzAKKyNkZWZpbmUgTVlSSV9OZXRSZWNlaXZlICAgICAgICAgICAgICAweEJEOEMKKyNkZWZpbmUgTVlSSV9OZXRSZWNlaXZlQnVmZmVyICAgICAgICAweEJEODgKKyNkZWZpbmUgTVlSSV9NYXBMZW5ndGggICAgICAgICAgICAgICAweEJEOUMKKyNkZWZpbmUgTVlSSV9NYXBTZW5kQWxpZ25tZW50ICAgICAgICAweEJEOTgKKyNkZWZpbmUgTVlSSV9Ib3N0UmVwbHlMZW5ndGggICAgICAgICAweEJEQTQKKyNkZWZpbmUgTVlSSV9Ib3N0UmVwbHlTZW5kQWxpZ25tZW50ICAweEJEQTAKKyNkZWZpbmUgTVlSSV9NYXBTZW5kTWVzc2FnZXMgICAgICAgICAweEJEOTQKKyNkZWZpbmUgTVlSSV9iaXRtYXNrICAgICAgICAgICAgICAgICAweDkwQzYKKyNkZWZpbmUgTVlSSV9Ib3N0U2VuZEZ1bGwgICAgICAgICAgICAweDk5QzAKKyNkZWZpbmUgTVlSSV9Ib3N0UmVwbGllcyAgICAgICAgICAgICAweEEwNEMKKyNkZWZpbmUgTVlSSV9JbnRlcnJ1cHRzICAgICAgICAgICAgICAweEJDRTQKKyNkZWZpbmUgTVlSSV9OZXRSZWNlaXZlRHJvcHMgICAgICAgICAweEI4REEKKyNkZWZpbmUgTVlSSV9TZW5kTXVsdGlwbGV4RG9uZUV2ZW50ICAweEJCN0EKKyNkZWZpbmUgTVlSSV9iRXZlbnRzICAgICAgICAgICAgICAgICAweDk2RTYKKyNkZWZpbmUgTVlSSV9iSG9zdFJlY2VpdmVTaG9ydGN1dHMgICAweDk5NzIKKyNkZWZpbmUgTVlSSV90aGVfbWFwICAgICAgICAgICAgICAgICAweEI3MjgKKyNkZWZpbmUgTVlSSV9DaGFubmVscyAgICAgICAgICAgICAgICAweEI3QTIKKyNkZWZpbmUgTVlSSV9iRXZlbnRJbmRleCAgICAgICAgICAgICAweDk3NjYKKyNkZWZpbmUgTVlSSV9Ob0J1ZmZlcnNDaGFubmVsMCAgICAgICAweDk5NzQKKyNkZWZpbmUgTVlSSV9iU2hha2VzICAgICAgICAgICAgICAgICAweDk3NkEKKyNkZWZpbmUgTVlSSV9NQVBQRVIgICAgICAgICAgICAgICAgICAweEExMjIKKyNkZWZpbmUgTVlSSV9DT1JFX3RpbWVvdXRfY291bnRlciAgICAweEExMTQKKyNkZWZpbmUgTVlSSV90aGVfbWFwX2lzX3ZhbGlkICAgICAgICAweEEwNDAKKyNkZWZpbmUgTVlSSV9iQmFkU2NhdHRlcnMgICAgICAgICAgICAweDk5NzAKKyNkZWZpbmUgTVlSSV9Ib3N0UmVjZWl2ZUNoYW5uZWwgICAgICAweDk5NjAKKyNkZWZpbmUgTVlSSV9zZW5kX3NwYWNlICAgICAgICAgICAgICAweEE3QjAKKyNkZWZpbmUgTVlSSV9NYXBSZWNlaXZlTWVzc2FnZXMgICAgICAweEI4RTAKKyNkZWZpbmUgTVlSSV93YWtldXBfbWFzayAgICAgICAgICAgICAweEJDNEUKKyNkZWZpbmUgTVlSSV9OZXRTZW5kQnVmZmVyICAgICAgICAgICAweEJCMzAKKyNkZWZpbmUgTVlSSV9Ib3N0UmVjZWl2ZU11bHRpY2FzdCAgICAweDk5NjgKKyNkZWZpbmUgTVlSSV9Ib3N0U2VuZENoYW5uZWwgICAgICAgICAweDlBOTQKKyNkZWZpbmUgTVlSSV9OZXRSZWNlaXZlRG1hRG9uZSAgICAgICAweEI3RkEKKyNkZWZpbmUgTVlSSV9Ib3N0U2VuZENoZWNrc3VtICAgICAgICAweDlBQUEKKyNkZWZpbmUgTVlSSV9Ib3N0UmVjZWl2ZVNjYXR0ZXIgICAgICAweDk5MTQKKyNkZWZpbmUgTVlSSV9jb21wYXJlcyAgICAgICAgICAgICAgICAweDlEQzgKKyNkZWZpbmUgTVlSSV9OZXRTZW5kUXVldWUgICAgICAgICAgICAweEJBRkMKKyNkZWZpbmUgTVlSSV9Ib3N0VGFibGUgICAgICAgICAgICAgICAweEE1NEMKKyNkZWZpbmUgTVlSSV9tYXBfaCAgICAgICAgICAgICAgICAgICAweDlEQjQKKyNkZWZpbmUgTVlSSV9Ib3N0U2VuZEJ5dGVzICAgICAgICAgICAweDlBQTAKKyNkZWZpbmUgTVlSSV9MM19lbmRfbG9hZGVkX21lbW9yeSAgICAweEJEQjQKKyNkZWZpbmUgTVlSSV9OZXRTZW5kQnl0ZXMgICAgICAgICAgICAweEJCMkEKKyNkZWZpbmUgTVlSSV9tYXBfc3BhY2UgICAgICAgICAgICAgICAweEE4MUMKKyNkZWZpbmUgTVlSSV9NQVBfQUNLICAgICAgICAgICAgICAgICAweEEwNDUKKyNkZWZpbmUgTVlSSV9OZXRSZWNlaXZlTWlzcm91dGVzICAgICAweEI4RDYKKyNkZWZpbmUgTVlSSV9Ib3N0UmVjZWl2ZUJ5dGVzICAgICAgICAweDk5NUMKKyNkZWZpbmUgTVlSSV9Ccm9hZGNhc3RSZWxheUlkbGUgICAgICAweDk1QzIKKyNkZWZpbmUgTVlSSV9Ib3N0UmVjZWl2ZUlkbGUgICAgICAgICAweDk3NzAKKyNkZWZpbmUgTVlSSV90aW1pbmcgICAgICAgICAgICAgICAgICAweEJDMDgKKyNkZWZpbmUgTVlSSV9Ib3N0UmVjZWl2ZSAgICAgICAgICAgICAweDk5NkEKKyNkZWZpbmUgTVlSSV9yb3V0ZUhhbmRsZU1lc3NhZ2UgICAgICAweDc3MzIKKyNkZWZpbmUgTVlSSV9GcmVzZXMgICAgICAgICAgICAgICAgICAweEI3QUUKKyNkZWZpbmUgTVlSSV9OZXh0VG9QdXQgICAgICAgICAgICAgICAweDk2OUMKKyNkZWZpbmUgTVlSSV9Ib3N0U2VuZElkbGUgICAgICAgICAgICAweDk5N0EKKyNkZWZpbmUgTVlSSWVkYXRhICAgICAgICAgICAgICAgICAgICAweEJDRUMKKyNkZWZpbmUgTVlSSV9TZW5kaW5nSG9zdFJlcGx5ICAgICAgICAweEJBRkEKKyNkZWZpbmUgTVlSSV90aW1pbmdfcGVyaW9kICAgICAgICAgICAweEJDNTAKKyNkZWZpbmUgTVlSSV9kZWJ1ZyAgICAgICAgICAgICAgICAgICAweEExMzgKKyNkZWZpbmUgTVlSSV9OZXRTZW5kQnVzeSAgICAgICAgICAgICAweEI5OTgKKyNkZWZpbmUgTVlSSV9yb3V0ZUluaXRpYWxpemUgICAgICAgICAweDZBQTAKKyNkZWZpbmUgTVlSSV9Ib3N0UmVjZWl2ZVF1ZXVlICAgICAgICAweDk5NjYKKyNkZWZpbmUgTVlSSV9iV2FrZXMgICAgICAgICAgICAgICAgICAweDk3NjgKKyNkZWZpbmUgTVlSSV9OZXRSZWNlaXZlQmFkTGVuZ3RocyAgICAweEI4RDAKKyNkZWZpbmUgTVlSSV9OZXRSZWNlaXZlUXVldWUgICAgICAgICAweEI4RTIKKyNkZWZpbmUgTVlSSV9NYXBCdWZmZXIgICAgICAgICAgICAgICAweEJBRjYKKyNkZWZpbmUgTVlSSV9NYXBDaGVja3N1bSAgICAgICAgICAgICAweEEwNDgKKyNkZWZpbmUgTVlSSV90aGVfcm91dGVzX2FyZV92YWxpZCAgICAweEEwNDIKKyNkZWZpbmUgTVlSSV9NQVBQRVJfcHJvYmVfc3RhbXAgICAgICAweEExMzIKKyNkZWZpbmUgTVlSSV9tZW1vcnkgICAgICAgICAgICAgICAgICAweEE3QUMKKyNkZWZpbmUgTVlSSV9FdmVudHMgICAgICAgICAgICAgICAgICAweDk2MTQKKyNkZWZpbmUgTVlSSV9zd2l0Y2hlcyAgICAgICAgICAgICAgICAweDlEQjYKKyNkZWZpbmUgTVlSSV9Ib3N0cyAgICAgICAgICAgICAgICAgICAweEE3QUUKKyNkZWZpbmUgTVlSSV9Ib3N0UmVjZWl2ZUdvaW5nVG9Ccm9hZGNhc3QgMHg5OENFCisjZGVmaW5lIE1ZUklfTmV0U2VuZElkbGUgICAgICAgICAgICAgMHhCOTBDCisjZGVmaW5lIE1ZUklfaG9zdF9yZXBseV9zcGFjZSAgICAgICAgMHhCNzJDCisjZGVmaW5lIE1ZUklfSG9zdFJlY2VpdmVXYWl0aW5nVG9Ccm9hZGNhc3QgMHg5ODg4CisjZGVmaW5lIE1ZUklfYlNldFJvdXRlcyAgICAgICAgICAgICAgMHhBMTFFCisjZGVmaW5lIE1ZUklfYlNlbmRzICAgICAgICAgICAgICAgICAgMHg5NzZDCisjZGVmaW5lIE1ZUklfQnJvYWRjYXN0R2VuZXJhdGVJZGxlICAgMHg5NTM2CisjZGVmaW5lIE1ZUklfV2F0Y2hkb2dPZmYgICAgICAgICAgICAgMHhCQzlFCisjZGVmaW5lIE1ZUklfVElNRVIgICAgICAgICAgICAgICAgICAgMHhCQzUyCisjZGVmaW5lIE1ZUklfU2VuZE11bHRpcGxleCAgICAgICAgICAgMHhCQjgyCisjZGVmaW5lIE1ZUklfSG9zdFJlcGx5QnVmZmVyICAgICAgICAgMHhCQUY4CisjZGVmaW5lIE1ZUklfdGhlX25ld19zd2l0Y2ggICAgICAgICAgMHhBMTMwCisjZGVmaW5lIE1ZUklfY3VycmVudF9zd2l0Y2ggICAgICAgICAgMHhBMDNBCisjZGVmaW5lIE1ZUklfbWVtY3B5ICAgICAgICAgICAgICAgICAgMHg5MzdDCisjZGVmaW5lIE1ZUklfc2VydmVyICAgICAgICAgICAgICAgICAgMHg5QUY2CisjZGVmaW5lIE1ZUklfV2F0Y2hkb2dPbiAgICAgICAgICAgICAgMHhCQzU4CisjZGVmaW5lIE1ZUklfTmV0U2VuZENvbnRpbnVpbmcgICAgICAgMHhCOTUyCisjZGVmaW5lIE1ZUklfTmV0UmVjZWl2ZUJhZENoYW5uZWxzICAgMHhCOEQyCisjZGVmaW5lIE1ZUklfU2VuZE11bHRpcGxleEZyZWVNYWNoaW5lIDB4QkI4MAorI2RlZmluZSBNWVJJX05ldFJlY2VpdmVGbHVzaCAgICAgICAgIDB4Qjg0MAorI2RlZmluZSBNWVJJX05ldFNlbmRCcm9hZGNhc3RpbmcgICAgIDB4QkFCMAorI2RlZmluZSBNWVJJX2xvb2tpbmdfZm9yX2FfbG9vcGJhY2sgIDB4OUQ2QworI2RlZmluZSBNWVJJX0hvc3RTZW5kR2F0aGVyUG9pbnRlciAgIDB4OUFBOAorI2RlZmluZSBNWVJJX0hvc3RTZW5kSXRlbSAgICAgICAgICAgIDB4OUE5NgorI2RlZmluZSBNWVJJX01BUF9SRVEgICAgICAgICAgICAgICAgIDB4QTA0NgorI2RlZmluZSBNWVJJX21lbW9yeV9mcmVlX2xpc3QgICAgICAgIDB4QTE2MAorI2RlZmluZSBNWVJJZW5kICAgICAgICAgICAgICAgICAgICAgIDB4QkRCNAorI2RlZmluZSBNWVJJX01hcFZlcnNpb24gICAgICAgICAgICAgIDB4OURCMgorI2RlZmluZSBNWVJJX2NsaWVudCAgICAgICAgICAgICAgICAgIDB4OUFCMAorI2RlZmluZSBNWVJJX0hvc3RSZWNlaXZlQnJvYWRjYXN0aW5nIDB4OTg0MgorI2RlZmluZSBNWVJJZXRleHQgICAgICAgICAgICAgICAgICAgIDB4OTRGMAorI2RlZmluZSBNWVJJX05ldFNlbmRNYXBCdXN5ICAgICAgICAgIDB4QjlERQorI2RlZmluZSBNWVJJX2JSb3V0ZU1lc3NhZ2VzICAgICAgICAgIDB4QTEzNAorI2RlZmluZSBNWVJJX0RtYURpcmVjdGlvbiAgICAgICAgICAgIDB4QjdBOAorI2RlZmluZSBNWVJJX1NlbmRNdWx0aXBsZXhGcmVlRXZlbnQgIDB4QkI3QworI2RlZmluZSBNWVJJX2lkbGVfbWFwcGVyICAgICAgICAgICAgIDB4OUIzQworI2RlZmluZSBNWVJJX05ldFNlbmQgICAgICAgICAgICAgICAgIDB4QkIyNAorI2RlZmluZSBNWVJJX2N1cnJlbnRfcG9ydCAgICAgICAgICAgIDB4QTAzRQorI2RlZmluZSBNWVJJX0hvc3RDb25uZWN0ZWRTd2l0Y2hlcyAgIDB4OUREQQorI2RlZmluZSBNWVJJX3RyeV9sb29wYmFjayAgICAgICAgICAgIDB4OUI4MgorI2RlZmluZSBNWVJJX3RoZV9ob3N0X3JlcGx5X21lc3NhZ2UgIDB4QjcyQQorI2RlZmluZSBNWVJJX01BUFBFUl9xdWV1ZSAgICAgICAgICAgIDB4OUREOAorI2RlZmluZSBNWVJJX2JIb3N0U2VuZFNob3J0Y3V0cyAgICAgIDB4OUFBQworI2RlZmluZSBNWVJJX0Jyb2FkY2FzdEdlbmVyYXRlICAgICAgIDB4OTYwOAorI2RlZmluZSBNWVJJX0RtYUZyZWVFdmVudCAgICAgICAgICAgIDB4QjdBQworI2RlZmluZSBNWVJJX2hvc3RfdGltZW91dF9jb3VudGVyICAgIDB4QTExNgorI2RlZmluZSBNWVJJX05ldFJlY2VpdmVEbWEgICAgICAgICAgIDB4QjdCNAorI2RlZmluZSBNWVJJX01BUFBFUl90cnlfcG9ydCAgICAgICAgIDB4QTEyQworI2RlZmluZSBNWVJJX2Jjb3B5ICAgICAgICAgICAgICAgICAgIDB4NjZBQQorI2RlZmluZSBNWVJJX3F1ZXVlX2ggICAgICAgICAgICAgICAgIDB4QkIzMgorI2RlZmluZSBNWVJJX2JVcGRhdGVzICAgICAgICAgICAgICAgIDB4QTEyMAorI2RlZmluZSBNWVJJX1NlbmRNdWx0aXBsZXhNYWNoaW5lICAgIDB4QkI3RQorI2RlZmluZSBNWVJJX01BUFBFUl9yZXBlYXQgICAgICAgICAgIDB4QTEyQQorI2RlZmluZSBNWVJJX3RoZV9yZXR1cm5fcG9ydCAgICAgICAgIDB4QTAzOAorI2RlZmluZSBNWVJJX05ldFJlY2VpdmVGdWxsICAgICAgICAgIDB4Qjg4NgorI2RlZmluZSBNWVJJX015SG9zdFRhYmxlSW5kZXggICAgICAgIDB4QTdBQQorI2RlZmluZSBNWVJJX0NPUkUgICAgICAgICAgICAgICAgICAgIDB4QTExOAorI2RlZmluZSBNWVJJX0lfaGF2ZV9hX21hcCAgICAgICAgICAgIDB4QTA0NAorI2RlZmluZSBNWVJJX2JXYWl0aW5nICAgICAgICAgICAgICAgIDB4QjdCMAorI2RlZmluZSBNWVJJX05ldFJlY2VpdmVPdmVyZmxvd3MgICAgIDB4QjhEOAorI2RlZmluZSBNWVJJX051bU1hY2hpbmVzICAgICAgICAgICAgIDB4OTZBMAorI2RlZmluZSBNWVJJX01hcE1lc3NhZ2VzU2VudENvdW50ZXIgIDB4Qjc5QworI2RlZmluZSBNWVJJX0hvc3RSZWNlaXZlQnVmZmVyICAgICAgIDB4OTk2MgorI2RlZmluZSBNWVJJX0hvc3RTZW5kRG1hICAgICAgICAgICAgIDB4OUE0QworI2RlZmluZSBNWVJJX05leHRUb0dldCAgICAgICAgICAgICAgIDB4OTY5RQorI2RlZmluZSBNWVJJX0hvc3RSZWNlaXZlRG1hQnVzeSAgICAgIDB4OTdCNgorI2RlZmluZSBNWVJJX2JVcGRhdGVNZXNzYWdlcyAgICAgICAgIDB4QTEzNgorI2RlZmluZSBNWVJJX3RyeV90aGVfc3dpdGNoICAgICAgICAgIDB4OUMwRQorI2RlZmluZSBNWVJJX0Jyb2FkY2FzdFJlbGF5ICAgICAgICAgIDB4OTYwRQorI2RlZmluZSBNWVJJX3RoZV9tc2cgICAgICAgICAgICAgICAgIDB4Qjc5OAorI2RlZmluZSBNWVJJX2JFdmVudHNSVEMgICAgICAgICAgICAgIDB4OTcyNgorI2RlZmluZSBNWVJJX0hvc3RSZWNlaXZlTWVzc2FnZXMgICAgIDB4OTk1RQorI2RlZmluZSBNWVJJX0NVUlJFTlRfTVNHICAgICAgICAgICAgIDB4Qjc5QQorI2RlZmluZSBNWVJJX01BUFBFUl9waGFzZSAgICAgICAgICAgIDB4QTEyOAorI2RlZmluZSBNWVJJX0hvc3RSZWNlaXZlRG1hICAgICAgICAgIDB4OTdGQworI2RlZmluZSBNWVJJX1dhdGNoZG9nICAgICAgICAgICAgICAgIDB4QkNFNgorI2RlZmluZSBNWVJJX0hvc3RTZW5kRW1wdHkgICAgICAgICAgIDB4OUE5MgorI2RlZmluZSBNWVJJX2Fib3J0ICAgICAgICAgICAgICAgICAgIDB4NjNDNgorI2RlZmluZSBNWVJJX1NlbmRNdWx0aXBsZXhJZGxlICAgICAgIDB4QkIzNAorI2RlZmluZSBNWVJJX2xvb2tpbmdfZm9yX2Ffc3dpdGNoICAgIDB4OUM1NAorI2RlZmluZSBNWVJJX05ldFNlbmRNZXNzYWdlcyAgICAgICAgIDB4QkIyQworI2RlZmluZSBNWVJJX3VwZGF0aW5nICAgICAgICAgICAgICAgIDB4OUQyNgorI2RlZmluZSBNWVJJX0Jyb2FkY2FzdEdlbmVyYXRlU2VuZGluZyAweDk0RjAKKyNkZWZpbmUgTVlSSV9Ib3N0U2VuZEJ1ZmZlciAgICAgICAgICAweDlBQTQKKyNkZWZpbmUgTVlSSV9Ib3N0U2VuZE1lc3NhZ2VzICAgICAgICAweDlBOUUKKyNkZWZpbmUgTVlSSV9Ccm9hZGNhc3RSZWxheVNlbmRpbmcgICAweDk1N0MKKyNkZWZpbmUgTVlSSV9Ib3N0U2VuZERtYUJ1c3kgICAgICAgICAweDlBMDYKKyNkZWZpbmUgTVlSSV9Ccm9hZGNhc3RzUGVuZGluZyAgICAgICAweEI4Q0MKKyNkZWZpbmUgTVlSSV9OZXRTZW5kTWFwV2FpdGluZyAgICAgICAweEJBNkEKKyNkZWZpbmUgTVlSSV9OZXRSZWNlaXZlQmFkVHlwZXMgICAgICAweEI4Q0UKKyNkZWZpbmUgTVlSSV9sb29raW5nX2Zvcl9ob3N0cyAgICAgICAweDlDOUEKKyNkZWZpbmUgTVlSSV9iQmFkSGVhZGVyICAgICAgICAgICAgICAweDk5NzgKKyNkZWZpbmUgTVlSSV9Ib3N0U2VuZEdhdGhlckluZGV4ICAgICAweDlBQTYKKyNkZWZpbmUgTVlSSV9yb3V0ZUxvb2t1cCAgICAgICAgICAgICAweDc3OTAKKyNkZWZpbmUgTVlSSV9OZXRSZWNlaXZlTWVzc2FnZXMgICAgICAweEI4REUKKyNkZWZpbmUgTVlSSV9EbWFJblVzZSAgICAgICAgICAgICAgICAweEI3QUEKKyNkZWZpbmUgTVlSSV9leHBsb3JlcyAgICAgICAgICAgICAgICAweDlEQjgKKyNkZWZpbmUgTVlSSV9Ib3N0U2VuZCAgICAgICAgICAgICAgICAweDlBOTgKKyNkZWZpbmUgTVlSSV9EbWFSZXNldFNwaW4gICAgICAgICAgICAweEI3QjIKKyNkZWZpbmUgTVlSSXN0YXJ0ICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgTVlSSV9Sb3V0ZVRhYmxlICAgICAgICAgICAgICAweEExNjQKKyNkZWZpbmUgTVlSSV9NYWNoaW5lcyAgICAgICAgICAgICAgICAweDk2QTIKKyNkZWZpbmUgTVlSSV90cnlfdGhlX2hvc3QgICAgICAgICAgICAweDlCQzgKKyNkZWZpbmUgTVlSSV9pc3JfcmVjb3JkICAgICAgICAgICAgICAweDk3NkUKKyNkZWZpbmUgTVlSSV9Ib3N0UmVjZWl2ZURyb3BzICAgICAgICAweDk5NUEKKyNkZWZpbmUgTVlSSV9Ib3N0UmVjZWl2ZUxlbmd0aCAgICAgICAweDk5NjQKKyNkZWZpbmUgTVlSSV90aW1lcnMgICAgICAgICAgICAgICAgICAweEJCODgKKyNkZWZpbmUgTVlSSV9OZXRTZW5kV2FpdGluZyAgICAgICAgICAweEJBMjQKKyNkZWZpbmUgTVlSSV9OZXRTZW5kRHJvcHMgICAgICAgICAgICAweEJCMkUKKyNkZWZpbmUgTVlSSV9jb21wYXJpbmdfYV9zd2l0Y2ggICAgICAweDlDRTAKKyNkZWZpbmUgTVlSSV9PbGRNYXBDaGVja3N1bSAgICAgICAgICAweEEwNEEKKyNkZWZpbmUgTVlSSV9Ib3N0U2VuZFF1ZXVlICAgICAgICAgICAweDlBQTIKKyNkZWZpbmUgTVlSSV9NQVBQRVJfaG9zdCAgICAgICAgICAgICAweEExMkUKKyNkZWZpbmUgTVlSSV9jb21wYXJlX3N3aXRjaCAgICAgICAgICAweEEwM0MKKyNkZWZpbmUgTVlSSV9tYWluICAgICAgICAgICAgICAgICAgICAweDgwQTYKKyNkZWZpbmUgTVlSSV9OZXRSZWNlaXZlQmFkQ3JjcyAgICAgICAweEI4RDQKKyNkZWZpbmUgTVlSSV9OZXRSZWNlaXZlQnl0ZXMgICAgICAgICAweEI4REMKKworI2VuZGlmIC8qIFNZTUJPTF9ERUZJTkVTX0NPTVBJTEVEICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9teXJpX3NidXMuYyBiL2RyaXZlcnMvbmV0L215cmlfc2J1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZDU0OTRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmMKQEAgLTAsMCArMSwxMTc0IEBACisvKiBteXJpX3NidXMuaDogTXlyaUNPTSBNeXJpTkVUIFNCVVMgY2FyZCBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqLworCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gPQorICAgICAgICAibXlyaV9zYnVzLmM6djEuOSAxMi9TZXAvOTkgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxuZXQvZHN0Lmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9pZHByb20uaD4KKyNpbmNsdWRlIDxhc20vc2J1cy5oPgorI2luY2x1ZGUgPGFzbS9vcGVucHJvbS5oPgorI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS9hdXhpby5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9jaGVja3N1bS5oPgorCisjaW5jbHVkZSAibXlyaV9zYnVzLmgiCisjaW5jbHVkZSAibXlyaV9jb2RlLmgiCisKKy8qICNkZWZpbmUgREVCVUdfREVURUNUICovCisvKiAjZGVmaW5lIERFQlVHX0lSUSAqLworLyogI2RlZmluZSBERUJVR19UUkFOU01JVCAqLworLyogI2RlZmluZSBERUJVR19SRUNFSVZFICovCisvKiAjZGVmaW5lIERFQlVHX0hFQURFUiAqLworCisjaWZkZWYgREVCVUdfREVURUNUCisjZGVmaW5lIERFVCh4KSAgIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBERVQoeCkKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfSVJRCisjZGVmaW5lIERJUlEoeCkgIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBESVJRKHgpCisjZW5kaWYKKworI2lmZGVmIERFQlVHX1RSQU5TTUlUCisjZGVmaW5lIERUWCh4KSAgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIERUWCh4KQorI2VuZGlmCisKKyNpZmRlZiBERUJVR19SRUNFSVZFCisjZGVmaW5lIERSWCh4KSAgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIERSWCh4KQorI2VuZGlmCisKKyNpZmRlZiBERUJVR19IRUFERVIKKyNkZWZpbmUgREhEUih4KSBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgREhEUih4KQorI2VuZGlmCisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBzdHJ1Y3QgbXlyaV9ldGggKnJvb3RfbXlyaV9kZXY7CisjZW5kaWYKKworc3RhdGljIHZvaWQgbXlyaV9yZXNldF9vZmYodm9pZCBfX2lvbWVtICpscCwgdm9pZCBfX2lvbWVtICpjcmVncykKK3sKKwkvKiBDbGVhciBJUlEgbWFzay4gKi8KKwlzYnVzX3dyaXRlbCgwLCBscCArIExBTkFJX0VJTUFTSyk7CisKKwkvKiBUdXJuIFJFU0VUIGZ1bmN0aW9uIG9mZi4gKi8KKwlzYnVzX3dyaXRlbChDT05UUk9MX1JPRkYsIGNyZWdzICsgTVlSSUNUUkxfQ1RSTCk7Cit9CisKK3N0YXRpYyB2b2lkIG15cmlfcmVzZXRfb24odm9pZCBfX2lvbWVtICpjcmVncykKK3sKKwkvKiBFbmFibGUgUkVTRVQgZnVuY3Rpb24uICovCisJc2J1c193cml0ZWwoQ09OVFJPTF9ST04sIGNyZWdzICsgTVlSSUNUUkxfQ1RSTCk7CisKKwkvKiBEaXNhYmxlIElSUSdzLiAqLworCXNidXNfd3JpdGVsKENPTlRST0xfRElSUSwgY3JlZ3MgKyBNWVJJQ1RSTF9DVFJMKTsKK30KKworc3RhdGljIHZvaWQgbXlyaV9kaXNhYmxlX2lycSh2b2lkIF9faW9tZW0gKmxwLCB2b2lkIF9faW9tZW0gKmNyZWdzKQoreworCXNidXNfd3JpdGVsKENPTlRST0xfRElSUSwgY3JlZ3MgKyBNWVJJQ1RSTF9DVFJMKTsKKwlzYnVzX3dyaXRlbCgwLCBscCArIExBTkFJX0VJTUFTSyk7CisJc2J1c193cml0ZWwoSVNUQVRfSE9TVCwgbHAgKyBMQU5BSV9JU1RBVCk7Cit9CisKK3N0YXRpYyB2b2lkIG15cmlfZW5hYmxlX2lycSh2b2lkIF9faW9tZW0gKmxwLCB2b2lkIF9faW9tZW0gKmNyZWdzKQoreworCXNidXNfd3JpdGVsKENPTlRST0xfRUlSUSwgY3JlZ3MgKyBNWVJJQ1RSTF9DVFJMKTsKKwlzYnVzX3dyaXRlbChJU1RBVF9IT1NULCBscCArIExBTkFJX0VJTUFTSyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiYW5nX3RoZV9jaGlwKHN0cnVjdCBteXJpX2V0aCAqbXApCit7CisJc3RydWN0IG15cmlfc2htZW0gX19pb21lbSAqc2htZW0gPSBtcC0+c2htZW07CisJdm9pZCBfX2lvbWVtICpjcmVncwkJPSBtcC0+Y3JlZ3M7CisKKwlzYnVzX3dyaXRlbCgxLCAmc2htZW0tPnNlbmQpOworCXNidXNfd3JpdGVsKENPTlRST0xfV09OLCBjcmVncyArIE1ZUklDVFJMX0NUUkwpOworfQorCitzdGF0aWMgaW50IG15cmlfZG9faGFuZHNoYWtlKHN0cnVjdCBteXJpX2V0aCAqbXApCit7CisJc3RydWN0IG15cmlfc2htZW0gX19pb21lbSAqc2htZW0gPSBtcC0+c2htZW07CisJdm9pZCBfX2lvbWVtICpjcmVncyA9IG1wLT5jcmVnczsKKwlzdHJ1Y3QgbXlyaV9jaGFubmVsIF9faW9tZW0gKmNoYW4gPSAmc2htZW0tPmNoYW5uZWw7CisJaW50IHRpY2sgCQkJPSAwOworCisJREVUKCgibXlyaV9kb19oYW5kc2hha2U6ICIpKTsKKwlpZiAoc2J1c19yZWFkbCgmY2hhbi0+c3RhdGUpID09IFNUQVRFX1JFQURZKSB7CisJCURFVCgoIkFscmVhZHkgU1RBVEVfUkVBRFksIGZhaWxlZC5cbiIpKTsKKwkJcmV0dXJuIC0xOwkvKiBXZSdyZSBob3NlZC4uLiAqLworCX0KKworCW15cmlfZGlzYWJsZV9pcnEobXAtPmxyZWdzLCBjcmVncyk7CisKKwl3aGlsZSAodGljaysrIDw9IDI1KSB7CisJCXUzMiBzb2Z0c3RhdGU7CisKKwkJLyogV2FrZSBpdCB1cC4gKi8KKwkJREVUKCgic2hha2Vkb3duLCBDT05UUk9MX1dPTiwgIikpOworCQlzYnVzX3dyaXRlbCgxLCAmc2htZW0tPnNoYWtlZG93bik7CisJCXNidXNfd3JpdGVsKENPTlRST0xfV09OLCBjcmVncyArIE1ZUklDVFJMX0NUUkwpOworCisJCXNvZnRzdGF0ZSA9IHNidXNfcmVhZGwoJmNoYW4tPnN0YXRlKTsKKwkJREVUKCgiY2hhbnN0YXRlWyUwOHhdICIsIHNvZnRzdGF0ZSkpOworCQlpZiAoc29mdHN0YXRlID09IFNUQVRFX1JFQURZKSB7CisJCQlERVQoKCJ3YWtldXAgc3VjY2Vzc2Z1bCwgIikpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc29mdHN0YXRlICE9IFNUQVRFX1dGTikgeworCQkJREVUKCgibm90IFdGTiBzZXR0aW5nIHRoYXQsICIpKTsKKwkJCXNidXNfd3JpdGVsKFNUQVRFX1dGTiwgJmNoYW4tPnN0YXRlKTsKKwkJfQorCisJCXVkZWxheSgyMCk7CisJfQorCisJbXlyaV9lbmFibGVfaXJxKG1wLT5scmVncywgY3JlZ3MpOworCisJaWYgKHRpY2sgPiAyNSkgeworCQlERVQoKCIyNSB0aWNrcyB3ZSBsb3NlLCBmYWlsdXJlLlxuIikpOworCQlyZXR1cm4gLTE7CisJfQorCURFVCgoInN1Y2Nlc3NcbiIpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteXJpX2xvYWRfbGFuYWkoc3RydWN0IG15cmlfZXRoICptcCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2ID0gbXAtPmRldjsKKwlzdHJ1Y3QgbXlyaV9zaG1lbSBfX2lvbWVtICpzaG1lbSA9IG1wLT5zaG1lbTsKKwl2b2lkIF9faW9tZW0JCSpycHRyOworCWludCAJCQlpOworCisJbXlyaV9kaXNhYmxlX2lycShtcC0+bHJlZ3MsIG1wLT5jcmVncyk7CisJbXlyaV9yZXNldF9vbihtcC0+Y3JlZ3MpOworCisJcnB0ciA9IG1wLT5sYW5haTsKKwlmb3IgKGkgPSAwOyBpIDwgbXAtPmVlcHJvbS5yYW1zejsgaSsrKQorCQlzYnVzX3dyaXRlYigwLCBycHRyICsgaSk7CisKKwlpZiAobXAtPmVlcHJvbS5jcHV2ZXJzID49IENQVVZFUlNfM18wKQorCQlzYnVzX3dyaXRlbChtcC0+ZWVwcm9tLmN2YWwsIG1wLT5scmVncyArIExBTkFJX0NWQUwpOworCisJLyogTG9hZCBleGVjdXRhYmxlIGNvZGUuICovCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihsYW5haTRfY29kZSk7IGkrKykKKwkJc2J1c193cml0ZWIobGFuYWk0X2NvZGVbaV0sIHJwdHIgKyAobGFuYWk0X2NvZGVfb2ZmICogMikgKyBpKTsKKworCS8qIExvYWQgZGF0YSBzZWdtZW50LiAqLworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YobGFuYWk0X2RhdGEpOyBpKyspCisJCXNidXNfd3JpdGViKGxhbmFpNF9kYXRhW2ldLCBycHRyICsgKGxhbmFpNF9kYXRhX29mZiAqIDIpICsgaSk7CisKKwkvKiBTZXQgZGV2aWNlIGFkZHJlc3MuICovCisJc2J1c193cml0ZWIoMCwgJnNobWVtLT5hZGRyWzBdKTsKKwlzYnVzX3dyaXRlYigwLCAmc2htZW0tPmFkZHJbMV0pOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXNidXNfd3JpdGViKGRldi0+ZGV2X2FkZHJbaV0sCisJCQkgICAgJnNobWVtLT5hZGRyW2kgKyAyXSk7CisKKwkvKiBTZXQgU0JVUyBidXJzdHMgYW5kIGludGVycnVwdCBtYXNrLiAqLworCXNidXNfd3JpdGVsKCgobXAtPm15cmlfYnVyc3RzICYgMHhmOCkgPj4gMyksICZzaG1lbS0+YnVyc3QpOworCXNidXNfd3JpdGVsKFNITUVNX0lNQVNLX1JYLCAmc2htZW0tPmltYXNrKTsKKworCS8qIFJlbGVhc2UgdGhlIExBTkFJLiAqLworCW15cmlfZGlzYWJsZV9pcnEobXAtPmxyZWdzLCBtcC0+Y3JlZ3MpOworCW15cmlfcmVzZXRfb2ZmKG1wLT5scmVncywgbXAtPmNyZWdzKTsKKwlteXJpX2Rpc2FibGVfaXJxKG1wLT5scmVncywgbXAtPmNyZWdzKTsKKworCS8qIFdhaXQgZm9yIHRoZSByZXNldCB0byBjb21wbGV0ZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgNTAwMDsgaSsrKSB7CisJCWlmIChzYnVzX3JlYWRsKCZzaG1lbS0+Y2hhbm5lbC5zdGF0ZSkgIT0gU1RBVEVfUkVBRFkpCisJCQlicmVhazsKKwkJZWxzZQorCQkJdWRlbGF5KDEwKTsKKwl9CisKKwlpZiAoaSA9PSA1MDAwKQorCQlwcmludGsoS0VSTl9FUlIgIm15cmljb206IENoaXAgd291bGQgbm90IHJlc2V0IGFmdGVyIGZpcm13YXJlIGxvYWQuXG4iKTsKKworCWkgPSBteXJpX2RvX2hhbmRzaGFrZShtcCk7CisJaWYgKGkpCisJCXByaW50ayhLRVJOX0VSUiAibXlyaWNvbTogSGFuZHNoYWtlIHdpdGggTEFOQUkgZmFpbGVkLlxuIik7CisKKwlpZiAobXAtPmVlcHJvbS5jcHV2ZXJzID09IENQVVZFUlNfNF8wKQorCQlzYnVzX3dyaXRlbCgwLCBtcC0+bHJlZ3MgKyBMQU5BSV9WRVJTKTsKKworCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBteXJpX2NsZWFuX3JpbmdzKHN0cnVjdCBteXJpX2V0aCAqbXApCit7CisJc3RydWN0IHNlbmRxIF9faW9tZW0gKnNxID0gbXAtPnNxOworCXN0cnVjdCByZWN2cSBfX2lvbWVtICpycSA9IG1wLT5ycTsKKwlpbnQgaTsKKworCXNidXNfd3JpdGVsKDAsICZycS0+dGFpbCk7CisJc2J1c193cml0ZWwoMCwgJnJxLT5oZWFkKTsKKwlmb3IgKGkgPSAwOyBpIDwgKFJYX1JJTkdfU0laRSsxKTsgaSsrKSB7CisJCWlmIChtcC0+cnhfc2tic1tpXSAhPSBOVUxMKSB7CisJCQlzdHJ1Y3QgbXlyaV9yeGQgX19pb21lbSAqcnhkID0gJnJxLT5teXJpX3J4ZFtpXTsKKwkJCXUzMiBkbWFfYWRkcjsKKworCQkJZG1hX2FkZHIgPSBzYnVzX3JlYWRsKCZyeGQtPm15cmlfc2NhdHRlcnNbMF0uYWRkcik7CisJCQlzYnVzX3VubWFwX3NpbmdsZShtcC0+bXlyaV9zZGV2LCBkbWFfYWRkciwgUlhfQUxMT0NfU0laRSwgU0JVU19ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKG1wLT5yeF9za2JzW2ldKTsKKwkJCW1wLT5yeF9za2JzW2ldID0gTlVMTDsKKwkJfQorCX0KKworCW1wLT50eF9vbGQgPSAwOworCXNidXNfd3JpdGVsKDAsICZzcS0+dGFpbCk7CisJc2J1c193cml0ZWwoMCwgJnNxLT5oZWFkKTsKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJaWYgKG1wLT50eF9za2JzW2ldICE9IE5VTEwpIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSBtcC0+dHhfc2tic1tpXTsKKwkJCXN0cnVjdCBteXJpX3R4ZCBfX2lvbWVtICp0eGQgPSAmc3EtPm15cmlfdHhkW2ldOworCQkJdTMyIGRtYV9hZGRyOworCisJCQlkbWFfYWRkciA9IHNidXNfcmVhZGwoJnR4ZC0+bXlyaV9nYXRoZXJzWzBdLmFkZHIpOworCQkJc2J1c191bm1hcF9zaW5nbGUobXAtPm15cmlfc2RldiwgZG1hX2FkZHIsIChza2ItPmxlbiArIDMpICYgfjMsIFNCVVNfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IobXAtPnR4X3NrYnNbaV0pOworCQkJbXAtPnR4X3NrYnNbaV0gPSBOVUxMOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBteXJpX2luaXRfcmluZ3Moc3RydWN0IG15cmlfZXRoICptcCwgaW50IGZyb21faXJxKQoreworCXN0cnVjdCByZWN2cSBfX2lvbWVtICpycSA9IG1wLT5ycTsKKwlzdHJ1Y3QgbXlyaV9yeGQgX19pb21lbSAqcnhkID0gJnJxLT5teXJpX3J4ZFswXTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbXAtPmRldjsKKwlpbnQgZ2ZwX2ZsYWdzID0gR0ZQX0tFUk5FTDsKKwlpbnQgaTsKKworCWlmIChmcm9tX2lycSB8fCBpbl9pbnRlcnJ1cHQoKSkKKwkJZ2ZwX2ZsYWdzID0gR0ZQX0FUT01JQzsKKworCW15cmlfY2xlYW5fcmluZ3MobXApOworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbXlyaV9hbGxvY19za2IoUlhfQUxMT0NfU0laRSwgZ2ZwX2ZsYWdzKTsKKwkJdTMyIGRtYV9hZGRyOworCisJCWlmICghc2tiKQorCQkJY29udGludWU7CisJCW1wLT5yeF9za2JzW2ldID0gc2tiOworCQlza2ItPmRldiA9IGRldjsKKwkJc2tiX3B1dChza2IsIFJYX0FMTE9DX1NJWkUpOworCisJCWRtYV9hZGRyID0gc2J1c19tYXBfc2luZ2xlKG1wLT5teXJpX3NkZXYsIHNrYi0+ZGF0YSwgUlhfQUxMT0NfU0laRSwgU0JVU19ETUFfRlJPTURFVklDRSk7CisJCXNidXNfd3JpdGVsKGRtYV9hZGRyLCAmcnhkW2ldLm15cmlfc2NhdHRlcnNbMF0uYWRkcik7CisJCXNidXNfd3JpdGVsKFJYX0FMTE9DX1NJWkUsICZyeGRbaV0ubXlyaV9zY2F0dGVyc1swXS5sZW4pOworCQlzYnVzX3dyaXRlbChpLCAmcnhkW2ldLmN0eCk7CisJCXNidXNfd3JpdGVsKDEsICZyeGRbaV0ubnVtX3NnKTsKKwl9CisJc2J1c193cml0ZWwoMCwgJnJxLT5oZWFkKTsKKwlzYnVzX3dyaXRlbChSWF9SSU5HX1NJWkUsICZycS0+dGFpbCk7Cit9CisKK3N0YXRpYyBpbnQgbXlyaV9pbml0KHN0cnVjdCBteXJpX2V0aCAqbXAsIGludCBmcm9tX2lycSkKK3sKKwlteXJpX2luaXRfcmluZ3MobXAsIGZyb21faXJxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXlyaV9pc19ub3Rfc29faGFwcHkoc3RydWN0IG15cmlfZXRoICptcCkKK3sKK30KKworI2lmZGVmIERFQlVHX0hFQURFUgorc3RhdGljIHZvaWQgZHVtcF9laGRyKHN0cnVjdCBldGhoZHIgKmVoZHIpCit7CisJcHJpbnRrKCJlaGRyW2hfZHN0KCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4KSIKKwkgICAgICAgImhfc291cmNlKCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4KWhfcHJvdG8oJTA0eCldXG4iLAorCSAgICAgICBlaGRyLT5oX2Rlc3RbMF0sIGVoZHItPmhfZGVzdFsxXSwgZWhkci0+aF9kZXN0WzJdLAorCSAgICAgICBlaGRyLT5oX2Rlc3RbM10sIGVoZHItPmhfZGVzdFs0XSwgZWhkci0+aF9kZXN0WzRdLAorCSAgICAgICBlaGRyLT5oX3NvdXJjZVswXSwgZWhkci0+aF9zb3VyY2VbMV0sIGVoZHItPmhfc291cmNlWzJdLAorCSAgICAgICBlaGRyLT5oX3NvdXJjZVszXSwgZWhkci0+aF9zb3VyY2VbNF0sIGVoZHItPmhfc291cmNlWzRdLAorCSAgICAgICBlaGRyLT5oX3Byb3RvKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9laGRyX2FuZF9teXJpcGFkKHVuc2lnbmVkIGNoYXIgKnN0dWZmKQoreworCXN0cnVjdCBldGhoZHIgKmVoZHIgPSAoc3RydWN0IGV0aGhkciAqKSAoc3R1ZmYgKyAyKTsKKworCXByaW50aygicGFkWyUwMng6JTAyeF0iLCBzdHVmZlswXSwgc3R1ZmZbMV0pOworCXByaW50aygiZWhkcltoX2RzdCglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCkiCisJICAgICAgICJoX3NvdXJjZSglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCloX3Byb3RvKCUwNHgpXVxuIiwKKwkgICAgICAgZWhkci0+aF9kZXN0WzBdLCBlaGRyLT5oX2Rlc3RbMV0sIGVoZHItPmhfZGVzdFsyXSwKKwkgICAgICAgZWhkci0+aF9kZXN0WzNdLCBlaGRyLT5oX2Rlc3RbNF0sIGVoZHItPmhfZGVzdFs0XSwKKwkgICAgICAgZWhkci0+aF9zb3VyY2VbMF0sIGVoZHItPmhfc291cmNlWzFdLCBlaGRyLT5oX3NvdXJjZVsyXSwKKwkgICAgICAgZWhkci0+aF9zb3VyY2VbM10sIGVoZHItPmhfc291cmNlWzRdLCBlaGRyLT5oX3NvdXJjZVs0XSwKKwkgICAgICAgZWhkci0+aF9wcm90byk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgbXlyaV90eChzdHJ1Y3QgbXlyaV9ldGggKm1wLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzZW5kcSBfX2lvbWVtICpzcT0gbXAtPnNxOworCWludCBlbnRyeQkJPSBtcC0+dHhfb2xkOworCWludCBsaW1pdAkJPSBzYnVzX3JlYWRsKCZzcS0+aGVhZCk7CisKKwlEVFgoKCJlbnRyeVslZF0gbGltaXRbJWRdICIsIGVudHJ5LCBsaW1pdCkpOworCWlmIChlbnRyeSA9PSBsaW1pdCkKKwkJcmV0dXJuOworCXdoaWxlIChlbnRyeSAhPSBsaW1pdCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbXAtPnR4X3NrYnNbZW50cnldOworCQl1MzIgZG1hX2FkZHI7CisKKwkJRFRYKCgiU0tCWyVkXSAiLCBlbnRyeSkpOworCQlkbWFfYWRkciA9IHNidXNfcmVhZGwoJnNxLT5teXJpX3R4ZFtlbnRyeV0ubXlyaV9nYXRoZXJzWzBdLmFkZHIpOworCQlzYnVzX3VubWFwX3NpbmdsZShtcC0+bXlyaV9zZGV2LCBkbWFfYWRkciwgc2tiLT5sZW4sIFNCVVNfRE1BX1RPREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQltcC0+dHhfc2tic1tlbnRyeV0gPSBOVUxMOworCQltcC0+ZW5ldF9zdGF0cy50eF9wYWNrZXRzKys7CisJCWVudHJ5ID0gTkVYVF9UWChlbnRyeSk7CisJfQorCW1wLT50eF9vbGQgPSBlbnRyeTsKK30KKworLyogRGV0ZXJtaW5lIHRoZSBwYWNrZXQncyBwcm90b2NvbCBJRC4gVGhlIHJ1bGUgaGVyZSBpcyB0aGF0IHdlIAorICogYXNzdW1lIDgwMi4zIGlmIHRoZSB0eXBlIGZpZWxkIGlzIHNob3J0IGVub3VnaCB0byBiZSBhIGxlbmd0aC4KKyAqIFRoaXMgaXMgbm9ybWFsIHByYWN0aWNlIGFuZCB3b3JrcyBmb3IgYW55ICdub3cgaW4gdXNlJyBwcm90b2NvbC4KKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG15cmlfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBldGhoZHIgKmV0aDsKKwl1bnNpZ25lZCBjaGFyICpyYXdwOworCQorCXNrYi0+bWFjLnJhdyA9ICgoKHVuc2lnbmVkIGNoYXIgKilza2ItPmRhdGEpICsgTVlSSV9QQURfTEVOKTsKKwlza2JfcHVsbChza2IsIGRldi0+aGFyZF9oZWFkZXJfbGVuKTsKKwlldGggPSBldGhfaGRyKHNrYik7CisJCisjaWZkZWYgREVCVUdfSEVBREVSCisJREhEUigoIm15cmlfdHlwZV90cmFuczogIikpOworCWR1bXBfZWhkcihldGgpOworI2VuZGlmCisJaWYgKCpldGgtPmhfZGVzdCAmIDEpIHsKKwkJaWYgKG1lbWNtcChldGgtPmhfZGVzdCwgZGV2LT5icm9hZGNhc3QsIEVUSF9BTEVOKT09MCkKKwkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfQlJPQURDQVNUOworCQllbHNlCisJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX01VTFRJQ0FTVDsKKwl9IGVsc2UgaWYgKGRldi0+ZmxhZ3MgJiAoSUZGX1BST01JU0N8SUZGX0FMTE1VTFRJKSkgeworCQlpZiAobWVtY21wKGV0aC0+aF9kZXN0LCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikpCisJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKKwl9CisJCisJaWYgKG50b2hzKGV0aC0+aF9wcm90bykgPj0gMTUzNikKKwkJcmV0dXJuIGV0aC0+aF9wcm90bzsKKwkJCisJcmF3cCA9IHNrYi0+ZGF0YTsKKwkKKwkvKiBUaGlzIGlzIGEgbWFnaWMgaGFjayB0byBzcG90IElQWCBwYWNrZXRzLiBPbGRlciBOb3ZlbGwgYnJlYWtzCisJICogdGhlIHByb3RvY29sIGRlc2lnbiBhbmQgcnVucyBJUFggb3ZlciA4MDIuMyB3aXRob3V0IGFuIDgwMi4yIExMQworCSAqIGxheWVyLiBXZSBsb29rIGZvciBGRkZGIHdoaWNoIGlzbid0IGEgdXNlZCA4MDIuMiBTU0FQL0RTQVAuIFRoaXMKKwkgKiB3b24ndCB3b3JrIGZvciBmYXVsdCB0b2xlcmFudCBuZXR3YXJlIGJ1dCBkb2VzIGZvciB0aGUgcmVzdC4KKwkgKi8KKwlpZiAoKih1bnNpZ25lZCBzaG9ydCAqKXJhd3AgPT0gMHhGRkZGKQorCQlyZXR1cm4gaHRvbnMoRVRIX1BfODAyXzMpOworCQkKKwkvKiBSZWFsIDgwMi4yIExMQyAqLworCXJldHVybiBodG9ucyhFVEhfUF84MDJfMik7Cit9CisKK3N0YXRpYyB2b2lkIG15cmlfcngoc3RydWN0IG15cmlfZXRoICptcCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmVjdnEgX19pb21lbSAqcnEgPSBtcC0+cnE7CisJc3RydWN0IHJlY3ZxIF9faW9tZW0gKnJxYSA9IG1wLT5ycWFjazsKKwlpbnQgZW50cnkJCT0gc2J1c19yZWFkbCgmcnFhLT5oZWFkKTsKKwlpbnQgbGltaXQJCT0gc2J1c19yZWFkbCgmcnFhLT50YWlsKTsKKwlpbnQgZHJvcHM7CisKKwlEUlgoKCJlbnRyeVslZF0gbGltaXRbJWRdICIsIGVudHJ5LCBsaW1pdCkpOworCWlmIChlbnRyeSA9PSBsaW1pdCkKKwkJcmV0dXJuOworCWRyb3BzID0gMDsKKwlEUlgoKCJcbiIpKTsKKwl3aGlsZSAoZW50cnkgIT0gbGltaXQpIHsKKwkJc3RydWN0IG15cmlfcnhkIF9faW9tZW0gKnJ4ZGFjayA9ICZycWEtPm15cmlfcnhkW2VudHJ5XTsKKwkJdTMyIGNzdW0JCT0gc2J1c19yZWFkbCgmcnhkYWNrLT5jc3VtKTsKKwkJaW50IGxlbgkJCT0gc2J1c19yZWFkbCgmcnhkYWNrLT5teXJpX3NjYXR0ZXJzWzBdLmxlbik7CisJCWludCBpbmRleAkJPSBzYnVzX3JlYWRsKCZyeGRhY2stPmN0eCk7CisJCXN0cnVjdCBteXJpX3J4ZCBfX2lvbWVtICpyeGQgPSAmcnEtPm15cmlfcnhkW3NidXNfcmVhZGwoJnJxLT50YWlsKV07CisJCXN0cnVjdCBza19idWZmICpza2IJPSBtcC0+cnhfc2tic1tpbmRleF07CisKKwkJLyogQWNrIGl0LiAqLworCQlzYnVzX3dyaXRlbChORVhUX1JYKGVudHJ5KSwgJnJxYS0+aGVhZCk7CisKKwkJLyogQ2hlY2sgZm9yIGVycm9ycy4gKi8KKwkJRFJYKCgicnhkWyVkXTogJXAgbGVuWyVkXSBjc3VtWyUwOHhdICIsIGVudHJ5LCByeGQsIGxlbiwgY3N1bSkpOworCQlzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KG1wLT5teXJpX3NkZXYsCisJCQkJCSAgICAgc2J1c19yZWFkbCgmcnhkLT5teXJpX3NjYXR0ZXJzWzBdLmFkZHIpLAorCQkJCQkgICAgIFJYX0FMTE9DX1NJWkUsIFNCVVNfRE1BX0ZST01ERVZJQ0UpOworCQlpZiAobGVuIDwgKEVUSF9ITEVOICsgTVlSSV9QQURfTEVOKSB8fCAoc2tiLT5kYXRhWzBdICE9IE1ZUklfUEFEX0xFTikpIHsKKwkJCURSWCgoIkVSUk9SWyIpKTsKKwkJCW1wLT5lbmV0X3N0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKGxlbiA8IChFVEhfSExFTiArIE1ZUklfUEFEX0xFTikpIHsKKwkJCQlEUlgoKCJCQURfTEVOR1RIXSAiKSk7CisJCQkJbXAtPmVuZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJfSBlbHNlIHsKKwkJCQlEUlgoKCJOT19QQURESU5HXSAiKSk7CisJCQkJbXAtPmVuZXRfc3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQl9CisKKwkJCS8qIFJldHVybiBpdCB0byB0aGUgTEFOQUkuICovCisJZHJvcF9pdDoKKwkJCWRyb3BzKys7CisJCQlEUlgoKCJEUk9QICIpKTsKKwkJCW1wLT5lbmV0X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCXNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UobXAtPm15cmlfc2RldiwKKwkJCQkJCQlzYnVzX3JlYWRsKCZyeGQtPm15cmlfc2NhdHRlcnNbMF0uYWRkciksCisJCQkJCQkJUlhfQUxMT0NfU0laRSwKKwkJCQkJCQlTQlVTX0RNQV9GUk9NREVWSUNFKTsKKwkJCXNidXNfd3JpdGVsKFJYX0FMTE9DX1NJWkUsICZyeGQtPm15cmlfc2NhdHRlcnNbMF0ubGVuKTsKKwkJCXNidXNfd3JpdGVsKGluZGV4LCAmcnhkLT5jdHgpOworCQkJc2J1c193cml0ZWwoMSwgJnJ4ZC0+bnVtX3NnKTsKKwkJCXNidXNfd3JpdGVsKE5FWFRfUlgoc2J1c19yZWFkbCgmcnEtPnRhaWwpKSwgJnJxLT50YWlsKTsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCisJCURSWCgoImxlblslZF0gIiwgbGVuKSk7CisJCWlmIChsZW4gPiBSWF9DT1BZX1RIUkVTSE9MRCkgeworCQkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisJCQl1MzIgZG1hX2FkZHI7CisKKwkJCURSWCgoIkJJR0JVRkYgIikpOworCQkJbmV3X3NrYiA9IG15cmlfYWxsb2Nfc2tiKFJYX0FMTE9DX1NJWkUsIEdGUF9BVE9NSUMpOworCQkJaWYgKG5ld19za2IgPT0gTlVMTCkgeworCQkJCURSWCgoInNrYl9hbGxvYyhGQUlMRUQpICIpKTsKKwkJCQlnb3RvIGRyb3BfaXQ7CisJCQl9CisJCQlzYnVzX3VubWFwX3NpbmdsZShtcC0+bXlyaV9zZGV2LAorCQkJCQkgIHNidXNfcmVhZGwoJnJ4ZC0+bXlyaV9zY2F0dGVyc1swXS5hZGRyKSwKKwkJCQkJICBSWF9BTExPQ19TSVpFLAorCQkJCQkgIFNCVVNfRE1BX0ZST01ERVZJQ0UpOworCQkJbXAtPnJ4X3NrYnNbaW5kZXhdID0gbmV3X3NrYjsKKwkJCW5ld19za2ItPmRldiA9IGRldjsKKwkJCXNrYl9wdXQobmV3X3NrYiwgUlhfQUxMT0NfU0laRSk7CisJCQlkbWFfYWRkciA9IHNidXNfbWFwX3NpbmdsZShtcC0+bXlyaV9zZGV2LAorCQkJCQkJICAgbmV3X3NrYi0+ZGF0YSwKKwkJCQkJCSAgIFJYX0FMTE9DX1NJWkUsCisJCQkJCQkgICBTQlVTX0RNQV9GUk9NREVWSUNFKTsKKwkJCXNidXNfd3JpdGVsKGRtYV9hZGRyLCAmcnhkLT5teXJpX3NjYXR0ZXJzWzBdLmFkZHIpOworCQkJc2J1c193cml0ZWwoUlhfQUxMT0NfU0laRSwgJnJ4ZC0+bXlyaV9zY2F0dGVyc1swXS5sZW4pOworCQkJc2J1c193cml0ZWwoaW5kZXgsICZyeGQtPmN0eCk7CisJCQlzYnVzX3dyaXRlbCgxLCAmcnhkLT5udW1fc2cpOworCQkJc2J1c193cml0ZWwoTkVYVF9SWChzYnVzX3JlYWRsKCZycS0+dGFpbCkpLCAmcnEtPnRhaWwpOworCisJCQkvKiBUcmltIHRoZSBvcmlnaW5hbCBza2IgZm9yIHRoZSBuZXRpZi4gKi8KKwkJCURSWCgoInRyaW0oJWQpICIsIGxlbikpOworCQkJc2tiX3RyaW0oc2tiLCBsZW4pOworCQl9IGVsc2UgeworCQkJc3RydWN0IHNrX2J1ZmYgKmNvcHlfc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOworCisJCQlEUlgoKCJTTUFMTEJVRkYgIikpOworCQkJaWYgKGNvcHlfc2tiID09IE5VTEwpIHsKKwkJCQlEUlgoKCJkZXZfYWxsb2Nfc2tiKEZBSUxFRCkgIikpOworCQkJCWdvdG8gZHJvcF9pdDsKKwkJCX0KKwkJCS8qIERNQSBzeW5jIGFscmVhZHkgZG9uZSBhYm92ZS4gKi8KKwkJCWNvcHlfc2tiLT5kZXYgPSBkZXY7CisJCQlEUlgoKCJyZXN2X2FuZF9wdXQgIikpOworCQkJc2tiX3B1dChjb3B5X3NrYiwgbGVuKTsKKwkJCW1lbWNweShjb3B5X3NrYi0+ZGF0YSwgc2tiLT5kYXRhLCBsZW4pOworCisJCQkvKiBSZXVzZSBvcmlnaW5hbCByaW5nIGJ1ZmZlci4gKi8KKwkJCURSWCgoInJldXNlICIpKTsKKwkJCXNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UobXAtPm15cmlfc2RldiwKKwkJCQkJCQlzYnVzX3JlYWRsKCZyeGQtPm15cmlfc2NhdHRlcnNbMF0uYWRkciksCisJCQkJCQkJUlhfQUxMT0NfU0laRSwKKwkJCQkJCQlTQlVTX0RNQV9GUk9NREVWSUNFKTsKKwkJCXNidXNfd3JpdGVsKFJYX0FMTE9DX1NJWkUsICZyeGQtPm15cmlfc2NhdHRlcnNbMF0ubGVuKTsKKwkJCXNidXNfd3JpdGVsKGluZGV4LCAmcnhkLT5jdHgpOworCQkJc2J1c193cml0ZWwoMSwgJnJ4ZC0+bnVtX3NnKTsKKwkJCXNidXNfd3JpdGVsKE5FWFRfUlgoc2J1c19yZWFkbCgmcnEtPnRhaWwpKSwgJnJxLT50YWlsKTsKKworCQkJc2tiID0gY29weV9za2I7CisJCX0KKworCQkvKiBKdXN0IGxpa2UgdGhlIGhhcHB5IG1lYWwgd2UgZ2V0IGNoZWNrc3VtcyBmcm9tIHRoaXMgY2FyZC4gKi8KKwkJc2tiLT5jc3VtID0gY3N1bTsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsgLyogWFhYICovCisKKwkJc2tiLT5wcm90b2NvbCA9IG15cmlfdHlwZV90cmFucyhza2IsIGRldik7CisJCURSWCgoInByb3RbJTA0eF0gbmV0aWZfcnggIiwgc2tiLT5wcm90b2NvbCkpOworCQluZXRpZl9yeChza2IpOworCisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCW1wLT5lbmV0X3N0YXRzLnJ4X3BhY2tldHMrKzsKKwkJbXAtPmVuZXRfc3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCW5leHQ6CisJCURSWCgoIk5FWFRcbiIpKTsKKwkJZW50cnkgPSBORVhUX1JYKGVudHJ5KTsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBteXJpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYJCT0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgbXlyaV9ldGggKm1wCQk9IChzdHJ1Y3QgbXlyaV9ldGggKikgZGV2LT5wcml2OworCXZvaWQgX19pb21lbSAqbHJlZ3MJCT0gbXAtPmxyZWdzOworCXN0cnVjdCBteXJpX2NoYW5uZWwgX19pb21lbSAqY2hhbiA9ICZtcC0+c2htZW0tPmNoYW5uZWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgc3RhdHVzOworCWludCBoYW5kbGVkID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtcC0+aXJxX2xvY2ssIGZsYWdzKTsKKworCXN0YXR1cyA9IHNidXNfcmVhZGwobHJlZ3MgKyBMQU5BSV9JU1RBVCk7CisJRElSUSgoIm15cmlfaW50ZXJydXB0OiBzdGF0dXNbJTA4eF0gIiwgc3RhdHVzKSk7CisJaWYgKHN0YXR1cyAmIElTVEFUX0hPU1QpIHsKKwkJdTMyIHNvZnRzdGF0ZTsKKworCQloYW5kbGVkID0gMTsKKwkJRElSUSgoIklSUV9ESVNBQiAiKSk7CisJCW15cmlfZGlzYWJsZV9pcnEobHJlZ3MsIG1wLT5jcmVncyk7CisJCXNvZnRzdGF0ZSA9IHNidXNfcmVhZGwoJmNoYW4tPnN0YXRlKTsKKwkJRElSUSgoInN0YXRlWyUwOHhdICIsIHNvZnRzdGF0ZSkpOworCQlpZiAoc29mdHN0YXRlICE9IFNUQVRFX1JFQURZKSB7CisJCQlESVJRKCgibXlyaV9ub3Rfc29faGFwcHkgIikpOworCQkJbXlyaV9pc19ub3Rfc29faGFwcHkobXApOworCQl9CisJCURJUlEoKCJcbm15cmlfcng6ICIpKTsKKwkJbXlyaV9yeChtcCwgZGV2KTsKKwkJRElSUSgoIlxuaXN0YXQ9SVNUQVRfSE9TVCAiKSk7CisJCXNidXNfd3JpdGVsKElTVEFUX0hPU1QsIGxyZWdzICsgTEFOQUlfSVNUQVQpOworCQlESVJRKCgiSVJRX0VOQUIgIikpOworCQlteXJpX2VuYWJsZV9pcnEobHJlZ3MsIG1wLT5jcmVncyk7CisJfQorCURJUlEoKCJcbiIpKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5pcnFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKK3N0YXRpYyBpbnQgbXlyaV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG15cmlfZXRoICptcCA9IChzdHJ1Y3QgbXlyaV9ldGggKikgZGV2LT5wcml2OworCisJcmV0dXJuIG15cmlfaW5pdChtcCwgaW5faW50ZXJydXB0KCkpOworfQorCitzdGF0aWMgaW50IG15cmlfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXlyaV9ldGggKm1wID0gKHN0cnVjdCBteXJpX2V0aCAqKSBkZXYtPnByaXY7CisKKwlteXJpX2NsZWFuX3JpbmdzKG1wKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXlyaV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG15cmlfZXRoICptcCA9IChzdHJ1Y3QgbXlyaV9ldGggKikgZGV2LT5wcml2OworCisJcHJpbnRrKEtFUk5fRVJSICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCByZXNldHRpbmdcbiIsIGRldi0+bmFtZSk7CisKKwltcC0+ZW5ldF9zdGF0cy50eF9lcnJvcnMrKzsKKwlteXJpX2luaXQobXAsIDApOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBteXJpX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXlyaV9ldGggKm1wID0gKHN0cnVjdCBteXJpX2V0aCAqKSBkZXYtPnByaXY7CisJc3RydWN0IHNlbmRxIF9faW9tZW0gKnNxID0gbXAtPnNxOworCXN0cnVjdCBteXJpX3R4ZCBfX2lvbWVtICp0eGQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaGVhZCwgdGFpbDsKKwlpbnQgbGVuLCBlbnRyeTsKKwl1MzIgZG1hX2FkZHI7CisKKwlEVFgoKCJteXJpX3N0YXJ0X3htaXQ6ICIpKTsKKworCW15cmlfdHgobXAsIGRldik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBUaGlzIGlzIGp1c3QgdG8gcHJldmVudCBtdWx0aXBsZSBQSU8gcmVhZHMgZm9yIFRYX0JVRkZTX0FWQUlMLiAqLworCWhlYWQgPSBzYnVzX3JlYWRsKCZzcS0+aGVhZCk7CisJdGFpbCA9IHNidXNfcmVhZGwoJnNxLT50YWlsKTsKKworCWlmICghVFhfQlVGRlNfQVZBSUwoaGVhZCwgdGFpbCkpIHsKKwkJRFRYKCgibm8gYnVmZnMgYXZhaWxhYmxlLCByZXR1cm5pbmcgMVxuIikpOworCQlyZXR1cm4gMTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXAtPmlycV9sb2NrLCBmbGFncyk7CisKKwlESERSKCgieG1pdFtza2JkYXRhKCVwKV1cbiIsIHNrYi0+ZGF0YSkpOworI2lmZGVmIERFQlVHX0hFQURFUgorCWR1bXBfZWhkcl9hbmRfbXlyaXBhZCgoKHVuc2lnbmVkIGNoYXIgKikgc2tiLT5kYXRhKSk7CisjZW5kaWYKKworCS8qIFhYWCBNYXliZSB0aGlzIGNhbiBnbyBhcyB3ZWxsLiAqLworCWxlbiA9IHNrYi0+bGVuOworCWlmIChsZW4gJiAzKSB7CisJCURUWCgoImxlbiYzICIpKTsKKwkJbGVuID0gKGxlbiArIDQpICYgKH4zKTsKKwl9CisKKwllbnRyeSA9IHNidXNfcmVhZGwoJnNxLT50YWlsKTsKKworCXR4ZCA9ICZzcS0+bXlyaV90eGRbZW50cnldOworCW1wLT50eF9za2JzW2VudHJ5XSA9IHNrYjsKKworCS8qIE11c3QgZG8gdGhpcyBiZWZvcmUgd2Ugc2J1cyBtYXAgaXQuICovCisJaWYgKHNrYi0+ZGF0YVtNWVJJX1BBRF9MRU5dICYgMHgxKSB7CisJCXNidXNfd3JpdGV3KDB4ZmZmZiwgJnR4ZC0+YWRkclswXSk7CisJCXNidXNfd3JpdGV3KDB4ZmZmZiwgJnR4ZC0+YWRkclsxXSk7CisJCXNidXNfd3JpdGV3KDB4ZmZmZiwgJnR4ZC0+YWRkclsyXSk7CisJCXNidXNfd3JpdGV3KDB4ZmZmZiwgJnR4ZC0+YWRkclszXSk7CisJfSBlbHNlIHsKKwkJc2J1c193cml0ZXcoMHhmZmZmLCAmdHhkLT5hZGRyWzBdKTsKKwkJc2J1c193cml0ZXcoKHNrYi0+ZGF0YVswXSA8PCA4KSB8IHNrYi0+ZGF0YVsxXSwgJnR4ZC0+YWRkclsxXSk7CisJCXNidXNfd3JpdGV3KChza2ItPmRhdGFbMl0gPDwgOCkgfCBza2ItPmRhdGFbM10sICZ0eGQtPmFkZHJbMl0pOworCQlzYnVzX3dyaXRldygoc2tiLT5kYXRhWzRdIDw8IDgpIHwgc2tiLT5kYXRhWzVdLCAmdHhkLT5hZGRyWzNdKTsKKwl9CisKKwlkbWFfYWRkciA9IHNidXNfbWFwX3NpbmdsZShtcC0+bXlyaV9zZGV2LCBza2ItPmRhdGEsIGxlbiwgU0JVU19ETUFfVE9ERVZJQ0UpOworCXNidXNfd3JpdGVsKGRtYV9hZGRyLCAmdHhkLT5teXJpX2dhdGhlcnNbMF0uYWRkcik7CisJc2J1c193cml0ZWwobGVuLCAmdHhkLT5teXJpX2dhdGhlcnNbMF0ubGVuKTsKKwlzYnVzX3dyaXRlbCgxLCAmdHhkLT5udW1fc2cpOworCXNidXNfd3JpdGVsKEtFUk5FTF9DSEFOTkVMLCAmdHhkLT5jaGFuKTsKKwlzYnVzX3dyaXRlbChsZW4sICZ0eGQtPmxlbik7CisJc2J1c193cml0ZWwoKHUzMiktMSwgJnR4ZC0+Y3N1bV9vZmYpOworCXNidXNfd3JpdGVsKDAsICZ0eGQtPmNzdW1fZmllbGQpOworCisJc2J1c193cml0ZWwoTkVYVF9UWChlbnRyeSksICZzcS0+dGFpbCk7CisJRFRYKCgiQmFuZ1RoZUNoaXAgIikpOworCWJhbmdfdGhlX2NoaXAobXApOworCisJRFRYKCgidGJ1c3k9MCwgcmV0dXJuaW5nIDBcbiIpKTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1wLT5pcnFfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKiBDcmVhdGUgdGhlIE15cmlOZXQgTUFDIGhlYWRlciBmb3IgYW4gYXJiaXRyYXJ5IHByb3RvY29sIGxheWVyIAorICoKKyAqIHNhZGRyPU5VTEwJbWVhbnMgdXNlIGRldmljZSBzb3VyY2UgYWRkcmVzcworICogZGFkZHI9TlVMTAltZWFucyBsZWF2ZSBkZXN0aW5hdGlvbiBhZGRyZXNzIChlZyB1bnJlc29sdmVkIGFycCkKKyAqLworc3RhdGljIGludCBteXJpX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB0eXBlLAorCQkgICAgICAgdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pCit7CisJc3RydWN0IGV0aGhkciAqZXRoID0gKHN0cnVjdCBldGhoZHIgKikgc2tiX3B1c2goc2tiLCBFVEhfSExFTik7CisJdW5zaWduZWQgY2hhciAqcGFkID0gKHVuc2lnbmVkIGNoYXIgKikgc2tiX3B1c2goc2tiLCBNWVJJX1BBRF9MRU4pOworCisjaWZkZWYgREVCVUdfSEVBREVSCisJREhEUigoIm15cmlfaGVhZGVyOiBwYWRbJTAyeCwlMDJ4XSAiLCBwYWRbMF0sIHBhZFsxXSkpOworCWR1bXBfZWhkcihldGgpOworI2VuZGlmCisKKwkvKiBTZXQgdGhlIE15cmlORVQgcGFkZGluZyBpZGVudGlmaWVyLiAqLworCXBhZFswXSA9IE1ZUklfUEFEX0xFTjsKKwlwYWRbMV0gPSAweGFiOworCisJLyogU2V0IHRoZSBwcm90b2NvbCB0eXBlLiBGb3IgYSBwYWNrZXQgb2YgdHlwZSBFVEhfUF84MDJfMyB3ZSBwdXQgdGhlIGxlbmd0aAorCSAqIGluIGhlcmUgaW5zdGVhZC4gSXQgaXMgdXAgdG8gdGhlIDgwMi4yIGxheWVyIHRvIGNhcnJ5IHByb3RvY29sIGluZm9ybWF0aW9uLgorCSAqLworCWlmICh0eXBlICE9IEVUSF9QXzgwMl8zKSAKKwkJZXRoLT5oX3Byb3RvID0gaHRvbnModHlwZSk7CisJZWxzZQorCQlldGgtPmhfcHJvdG8gPSBodG9ucyhsZW4pOworCisJLyogU2V0IHRoZSBzb3VyY2UgaGFyZHdhcmUgYWRkcmVzcy4gKi8KKwlpZiAoc2FkZHIpCisJCW1lbWNweShldGgtPmhfc291cmNlLCBzYWRkciwgZGV2LT5hZGRyX2xlbik7CisJZWxzZQorCQltZW1jcHkoZXRoLT5oX3NvdXJjZSwgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7CisKKwkvKiBBbnl3YXksIHRoZSBsb29wYmFjay1kZXZpY2Ugc2hvdWxkIG5ldmVyIHVzZSB0aGlzIGZ1bmN0aW9uLi4uICovCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPmFkZHJfbGVuOyBpKyspCisJCQlldGgtPmhfZGVzdFtpXSA9IDA7CisJCXJldHVybihkZXYtPmhhcmRfaGVhZGVyX2xlbik7CisJfQorCQorCWlmIChkYWRkcikgeworCQltZW1jcHkoZXRoLT5oX2Rlc3QsIGRhZGRyLCBkZXYtPmFkZHJfbGVuKTsKKwkJcmV0dXJuIGRldi0+aGFyZF9oZWFkZXJfbGVuOworCX0KKwlyZXR1cm4gLWRldi0+aGFyZF9oZWFkZXJfbGVuOworfQorCisvKiBSZWJ1aWxkIHRoZSBNeXJpTmV0IE1BQyBoZWFkZXIuIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGFuIEFSUAorICogKG9yIGluIGZ1dHVyZSBvdGhlciBhZGRyZXNzIHJlc29sdXRpb24pIGhhcyBjb21wbGV0ZWQgb24gdGhpcworICogc2tfYnVmZi4gV2Ugbm93IGxldCBBUlAgZmlsbCBpbiB0aGUgb3RoZXIgZmllbGRzLgorICovCitzdGF0aWMgaW50IG15cmlfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1bnNpZ25lZCBjaGFyICpwYWQgPSAodW5zaWduZWQgY2hhciAqKSBza2ItPmRhdGE7CisJc3RydWN0IGV0aGhkciAqZXRoID0gKHN0cnVjdCBldGhoZHIgKikgKHBhZCArIE1ZUklfUEFEX0xFTik7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCisjaWZkZWYgREVCVUdfSEVBREVSCisJREhEUigoIm15cmlfcmVidWlsZF9oZWFkZXI6IHBhZFslMDJ4LCUwMnhdICIsIHBhZFswXSwgcGFkWzFdKSk7CisJZHVtcF9laGRyKGV0aCk7CisjZW5kaWYKKworCS8qIFJlZmlsbCBNeXJpTmV0IHBhZGRpbmcgaWRlbnRpZmllcnMsIHRoaXMgaXMganVzdCBiZWluZyBhbmFsLiAqLworCXBhZFswXSA9IE1ZUklfUEFEX0xFTjsKKwlwYWRbMV0gPSAweGFiOworCisJc3dpdGNoIChldGgtPmhfcHJvdG8pCisJeworI2lmZGVmIENPTkZJR19JTkVUCisJY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKToKKyAJCXJldHVybiBhcnBfZmluZChldGgtPmhfZGVzdCwgc2tiKTsKKyNlbmRpZgorCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgCisJCSAgICAgICAiJXM6IHVuYWJsZSB0byByZXNvbHZlIHR5cGUgJVggYWRkcmVzc2VzLlxuIiwgCisJCSAgICAgICBkZXYtPm5hbWUsIChpbnQpZXRoLT5oX3Byb3RvKTsKKwkJCisJCW1lbWNweShldGgtPmhfc291cmNlLCBkZXYtPmRldl9hZGRyLCBkZXYtPmFkZHJfbGVuKTsKKwkJcmV0dXJuIDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOwkKK30KKworaW50IG15cmlfaGVhZGVyX2NhY2hlKHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3QgaGhfY2FjaGUgKmhoKQoreworCXVuc2lnbmVkIHNob3J0IHR5cGUgPSBoaC0+aGhfdHlwZTsKKwl1bnNpZ25lZCBjaGFyICpwYWQ7CisJc3RydWN0IGV0aGhkciAqZXRoOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZWlnaC0+ZGV2OworCisJcGFkID0gKCh1bnNpZ25lZCBjaGFyICopIGhoLT5oaF9kYXRhKSArCisJCUhIX0RBVEFfT0ZGKHNpemVvZigqZXRoKSArIE1ZUklfUEFEX0xFTik7CisJZXRoID0gKHN0cnVjdCBldGhoZHIgKikgKHBhZCArIE1ZUklfUEFEX0xFTik7CisKKwlpZiAodHlwZSA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMl8zKSkKKwkJcmV0dXJuIC0xOworCisJLyogUmVmaWxsIE15cmlOZXQgcGFkZGluZyBpZGVudGlmaWVycywgdGhpcyBpcyBqdXN0IGJlaW5nIGFuYWwuICovCisJcGFkWzBdID0gTVlSSV9QQURfTEVOOworCXBhZFsxXSA9IDB4YWI7CisKKwlldGgtPmhfcHJvdG8gPSB0eXBlOworCW1lbWNweShldGgtPmhfc291cmNlLCBkZXYtPmRldl9hZGRyLCBkZXYtPmFkZHJfbGVuKTsKKwltZW1jcHkoZXRoLT5oX2Rlc3QsIG5laWdoLT5oYSwgZGV2LT5hZGRyX2xlbik7CisJaGgtPmhoX2xlbiA9IDE2OworCXJldHVybiAwOworfQorCisKKy8qIENhbGxlZCBieSBBZGRyZXNzIFJlc29sdXRpb24gbW9kdWxlIHRvIG5vdGlmeSBjaGFuZ2VzIGluIGFkZHJlc3MuICovCit2b2lkIG15cmlfaGVhZGVyX2NhY2hlX3VwZGF0ZShzdHJ1Y3QgaGhfY2FjaGUgKmhoLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICogaGFkZHIpCit7CisJbWVtY3B5KCgodTgqKWhoLT5oaF9kYXRhKSArIEhIX0RBVEFfT0ZGKHNpemVvZihzdHJ1Y3QgZXRoaGRyKSksCisJICAgICAgIGhhZGRyLCBkZXYtPmFkZHJfbGVuKTsKK30KKworc3RhdGljIGludCBteXJpX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaWYgKChuZXdfbXR1IDwgKEVUSF9ITEVOICsgTVlSSV9QQURfTEVOKSkgfHwgKG5ld19tdHUgPiBNWVJJTkVUX01UVSkpCisJCXJldHVybiAtRUlOVkFMOworCWRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpteXJpX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreyByZXR1cm4gJigoKHN0cnVjdCBteXJpX2V0aCAqKWRldi0+cHJpdiktPmVuZXRfc3RhdHMpOyB9CisKK3N0YXRpYyB2b2lkIG15cmlfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIERvIG5vdGhpbmcsIGFsbCBNeXJpQ09NIG5vZGVzIHRyYW5zbWl0IG11bHRpY2FzdCBmcmFtZXMKKwkgKiBhcyBicm9hZGNhc3QgcGFja2V0cy4uLgorCSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2JvYXJkaWRfZnJvbV9pZHByb20oc3RydWN0IG15cmlfZXRoICptcCwgaW50IG51bSkKK3sKKwltcC0+ZWVwcm9tLmlkWzBdID0gMDsKKwltcC0+ZWVwcm9tLmlkWzFdID0gaWRwcm9tLT5pZF9tYWNodHlwZTsKKwltcC0+ZWVwcm9tLmlkWzJdID0gKGlkcHJvbS0+aWRfc2VybnVtID4+IDE2KSAmIDB4ZmY7CisJbXAtPmVlcHJvbS5pZFszXSA9IChpZHByb20tPmlkX3Nlcm51bSA+PiA4KSAmIDB4ZmY7CisJbXAtPmVlcHJvbS5pZFs0XSA9IChpZHByb20tPmlkX3Nlcm51bSA+PiAwKSAmIDB4ZmY7CisJbXAtPmVlcHJvbS5pZFs1XSA9IG51bTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRldGVybWluZV9yZWdfc3BhY2Vfc2l6ZShzdHJ1Y3QgbXlyaV9ldGggKm1wKQoreworCXN3aXRjaChtcC0+ZWVwcm9tLmNwdXZlcnMpIHsKKwljYXNlIENQVVZFUlNfMl8zOgorCWNhc2UgQ1BVVkVSU18zXzA6CisJY2FzZSBDUFVWRVJTXzNfMToKKwljYXNlIENQVVZFUlNfM18yOgorCQltcC0+cmVnX3NpemUgPSAoMyAqIDEyOCAqIDEwMjQpICsgNDA5NjsKKwkJYnJlYWs7CisKKwljYXNlIENQVVZFUlNfNF8wOgorCWNhc2UgQ1BVVkVSU180XzE6CisJCW1wLT5yZWdfc2l6ZSA9ICgoNDA5Njw8MSkgKyBtcC0+ZWVwcm9tLnJhbXN6KTsKKwkJYnJlYWs7CisKKwljYXNlIENQVVZFUlNfNF8yOgorCWNhc2UgQ1BVVkVSU181XzA6CisJZGVmYXVsdDoKKwkJcHJpbnRrKCJteXJpY29tOiBBSUVFRSB3ZWlyZCBjcHUgdmVyc2lvbiAlMDR4IGFzc3VtaW5nIHByZTQuMFxuIiwKKwkJICAgICAgIG1wLT5lZXByb20uY3B1dmVycyk7CisJCW1wLT5yZWdfc2l6ZSA9ICgzICogMTI4ICogMTAyNCkgKyA0MDk2OworCX07Cit9CisKKyNpZmRlZiBERUJVR19ERVRFQ1QKK3N0YXRpYyB2b2lkIGR1bXBfZWVwcm9tKHN0cnVjdCBteXJpX2V0aCAqbXApCit7CisJcHJpbnRrKCJFRVBST006IGNsb2NrdmFsWyUwOHhdIGNwdXZlcnNbJTA0eF0gIgorCSAgICAgICAiaWRbJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMnhdXG4iLAorCSAgICAgICBtcC0+ZWVwcm9tLmN2YWwsIG1wLT5lZXByb20uY3B1dmVycywKKwkgICAgICAgbXAtPmVlcHJvbS5pZFswXSwgbXAtPmVlcHJvbS5pZFsxXSwgbXAtPmVlcHJvbS5pZFsyXSwKKwkgICAgICAgbXAtPmVlcHJvbS5pZFszXSwgbXAtPmVlcHJvbS5pZFs0XSwgbXAtPmVlcHJvbS5pZFs1XSk7CisJcHJpbnRrKCJFRVBST006IHJhbXN6WyUwOHhdXG4iLCBtcC0+ZWVwcm9tLnJhbXN6KTsKKwlwcmludGsoIkVFUFJPTTogZnZlcnNbJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4XG4iLAorCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzBdLCBtcC0+ZWVwcm9tLmZ2ZXJzWzFdLCBtcC0+ZWVwcm9tLmZ2ZXJzWzJdLAorCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzNdLCBtcC0+ZWVwcm9tLmZ2ZXJzWzRdLCBtcC0+ZWVwcm9tLmZ2ZXJzWzVdLAorCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzZdLCBtcC0+ZWVwcm9tLmZ2ZXJzWzddKTsKKwlwcmludGsoIkVFUFJPTTogICAgICAgJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4XG4iLAorCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzhdLCBtcC0+ZWVwcm9tLmZ2ZXJzWzldLCBtcC0+ZWVwcm9tLmZ2ZXJzWzEwXSwKKwkgICAgICAgbXAtPmVlcHJvbS5mdmVyc1sxMV0sIG1wLT5lZXByb20uZnZlcnNbMTJdLCBtcC0+ZWVwcm9tLmZ2ZXJzWzEzXSwKKwkgICAgICAgbXAtPmVlcHJvbS5mdmVyc1sxNF0sIG1wLT5lZXByb20uZnZlcnNbMTVdKTsKKwlwcmludGsoIkVFUFJPTTogICAgICAgJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4XG4iLAorCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzE2XSwgbXAtPmVlcHJvbS5mdmVyc1sxN10sIG1wLT5lZXByb20uZnZlcnNbMThdLAorCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzE5XSwgbXAtPmVlcHJvbS5mdmVyc1syMF0sIG1wLT5lZXByb20uZnZlcnNbMjFdLAorCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzIyXSwgbXAtPmVlcHJvbS5mdmVyc1syM10pOworCXByaW50aygiRUVQUk9NOiAgICAgICAlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMnhdXG4iLAorCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzI0XSwgbXAtPmVlcHJvbS5mdmVyc1syNV0sIG1wLT5lZXByb20uZnZlcnNbMjZdLAorCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzI3XSwgbXAtPmVlcHJvbS5mdmVyc1syOF0sIG1wLT5lZXByb20uZnZlcnNbMjldLAorCSAgICAgICBtcC0+ZWVwcm9tLmZ2ZXJzWzMwXSwgbXAtPmVlcHJvbS5mdmVyc1szMV0pOworCXByaW50aygiRUVQUk9NOiBtdmVyc1slMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMnhcbiIsCisJICAgICAgIG1wLT5lZXByb20ubXZlcnNbMF0sIG1wLT5lZXByb20ubXZlcnNbMV0sIG1wLT5lZXByb20ubXZlcnNbMl0sCisJICAgICAgIG1wLT5lZXByb20ubXZlcnNbM10sIG1wLT5lZXByb20ubXZlcnNbNF0sIG1wLT5lZXByb20ubXZlcnNbNV0sCisJICAgICAgIG1wLT5lZXByb20ubXZlcnNbNl0sIG1wLT5lZXByb20ubXZlcnNbN10pOworCXByaW50aygiRUVQUk9NOiAgICAgICAlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMngsJTAyeCwlMDJ4LCUwMnhdXG4iLAorCSAgICAgICBtcC0+ZWVwcm9tLm12ZXJzWzhdLCBtcC0+ZWVwcm9tLm12ZXJzWzldLCBtcC0+ZWVwcm9tLm12ZXJzWzEwXSwKKwkgICAgICAgbXAtPmVlcHJvbS5tdmVyc1sxMV0sIG1wLT5lZXByb20ubXZlcnNbMTJdLCBtcC0+ZWVwcm9tLm12ZXJzWzEzXSwKKwkgICAgICAgbXAtPmVlcHJvbS5tdmVyc1sxNF0sIG1wLT5lZXByb20ubXZlcnNbMTVdKTsKKwlwcmludGsoIkVFUFJPTTogZGx2YWxbJTA0eF0gYnJkX3R5cGVbJTA0eF0gYnVzX3R5cGVbJTA0eF0gcHJvZF9jb2RlWyUwNHhdXG4iLAorCSAgICAgICBtcC0+ZWVwcm9tLmRsdmFsLCBtcC0+ZWVwcm9tLmJyZF90eXBlLCBtcC0+ZWVwcm9tLmJ1c190eXBlLAorCSAgICAgICBtcC0+ZWVwcm9tLnByb2RfY29kZSk7CisJcHJpbnRrKCJFRVBST006IHNlcmlhbF9udW1bJTA4eF1cbiIsIG1wLT5lZXByb20uc2VyaWFsX251bSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgbXlyaV9ldGhlcl9pbml0KHN0cnVjdCBzYnVzX2RldiAqc2RldiwgaW50IG51bSkKK3sKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG15cmlfZXRoICptcDsKKwl1bnNpZ25lZCBjaGFyIHByb3BfYnVmWzMyXTsKKwlpbnQgaTsKKworCURFVCgoIm15cmlfZXRoZXJfaW5pdCglcCwlZCk6XG4iLCBzZGV2LCBudW0pKTsKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IG15cmlfZXRoKSk7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAodmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKHZlcnNpb24pOworCisJbXAgPSAoc3RydWN0IG15cmlfZXRoICopIGRldi0+cHJpdjsKKwlzcGluX2xvY2tfaW5pdCgmbXAtPmlycV9sb2NrKTsKKwltcC0+bXlyaV9zZGV2ID0gc2RldjsKKworCS8qIENsZWFuIG91dCBza2IgYXJyYXlzLiAqLworCWZvciAoaSA9IDA7IGkgPCAoUlhfUklOR19TSVpFICsgMSk7IGkrKykKKwkJbXAtPnJ4X3NrYnNbaV0gPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCQltcC0+dHhfc2tic1tpXSA9IE5VTEw7CisKKwkvKiBGaXJzdCBjaGVjayBmb3IgRUVQUk9NIGluZm9ybWF0aW9uLiAqLworCWkgPSBwcm9tX2dldHByb3BlcnR5KHNkZXYtPnByb21fbm9kZSwgIm15cmluZXQtZWVwcm9tLWluZm8iLAorCQkJICAgICAoY2hhciAqKSZtcC0+ZWVwcm9tLCBzaXplb2Yoc3RydWN0IG15cmlfZWVwcm9tKSk7CisJREVUKCgicHJvbV9nZXRwcm9wKG15cmluZXQtZWVwcm9tLWluZm8pIHJldHVybnMgJWRcbiIsIGkpKTsKKwlpZiAoaSA9PSAwIHx8IGkgPT0gLTEpIHsKKwkJLyogTm8gZWVwcm9tIHByb3BlcnR5LCBtdXN0IGNvb2sgdXAgdGhlIHZhbHVlcyBvdXJzZWx2ZXMuICovCisJCURFVCgoIk5vIEVFUFJPTTogIikpOworCQltcC0+ZWVwcm9tLmJ1c190eXBlID0gQlVTX1RZUEVfU0JVUzsKKwkJbXAtPmVlcHJvbS5jcHV2ZXJzID0gcHJvbV9nZXRpbnRkZWZhdWx0KHNkZXYtPnByb21fbm9kZSwiY3B1X3ZlcnNpb24iLDApOworCQltcC0+ZWVwcm9tLmN2YWwgPSBwcm9tX2dldGludGRlZmF1bHQoc2Rldi0+cHJvbV9ub2RlLCJjbG9ja192YWx1ZSIsMCk7CisJCW1wLT5lZXByb20ucmFtc3ogPSBwcm9tX2dldGludGRlZmF1bHQoc2Rldi0+cHJvbV9ub2RlLCJzcmFtX3NpemUiLDApOworCQlERVQoKCJjcHV2ZXJzWyVkXSBjdmFsWyVkXSByYW1zelslZF1cbiIsIG1wLT5lZXByb20uY3B1dmVycywKKwkJICAgICBtcC0+ZWVwcm9tLmN2YWwsIG1wLT5lZXByb20ucmFtc3opKTsKKwkJaWYgKG1wLT5lZXByb20uY3B1dmVycyA9PSAwKSB7CisJCQlERVQoKCJFRVBST006IGNwdXZlcnMgd2FzIHplcm8sIHNldHRpbmcgdG8gJTA0eFxuIixDUFVWRVJTXzJfMykpOworCQkJbXAtPmVlcHJvbS5jcHV2ZXJzID0gQ1BVVkVSU18yXzM7CisJCX0KKwkJaWYgKG1wLT5lZXByb20uY3B1dmVycyA8IENQVVZFUlNfM18wKSB7CisJCQlERVQoKCJFRVBST006IGNwdXZlcnMgPCBDUFVWRVJTXzNfMCwgY2xvY2t2YWwgc2V0IHRvIHplcm8uXG4iKSk7CisJCQltcC0+ZWVwcm9tLmN2YWwgPSAwOworCQl9CisJCWlmIChtcC0+ZWVwcm9tLnJhbXN6ID09IDApIHsKKwkJCURFVCgoIkVFUFJPTTogcmFtc3ogPT0gMCwgc2V0dGluZyB0byAxMjhrXG4iKSk7CisJCQltcC0+ZWVwcm9tLnJhbXN6ID0gKDEyOCAqIDEwMjQpOworCQl9CisJCWkgPSBwcm9tX2dldHByb3BlcnR5KHNkZXYtPnByb21fbm9kZSwgIm15cmluZXQtYm9hcmQtaWQiLAorCQkJCSAgICAgJnByb3BfYnVmWzBdLCAxMCk7CisJCURFVCgoIkVFUFJPTTogcHJvbV9nZXRwcm9wKG15cmluZXQtYm9hcmQtaWQpIHJldHVybnMgJWRcbiIsIGkpKTsKKwkJaWYgKChpICE9IDApICYmIChpICE9IC0xKSkKKwkJCW1lbWNweSgmbXAtPmVlcHJvbS5pZFswXSwgJnByb3BfYnVmWzBdLCA2KTsKKwkJZWxzZQorCQkJc2V0X2JvYXJkaWRfZnJvbV9pZHByb20obXAsIG51bSk7CisJCWkgPSBwcm9tX2dldHByb3BlcnR5KHNkZXYtPnByb21fbm9kZSwgImZwZ2FfdmVyc2lvbiIsCisJCQkJICAgICAmbXAtPmVlcHJvbS5mdmVyc1swXSwgMzIpOworCQlERVQoKCJFRVBST006IHByb21fZ2V0cHJvcChmcGdhX3ZlcnNpb24pIHJldHVybnMgJWRcbiIsIGkpKTsKKwkJaWYgKGkgPT0gMCB8fCBpID09IC0xKQorCQkJbWVtc2V0KCZtcC0+ZWVwcm9tLmZ2ZXJzWzBdLCAwLCAzMik7CisKKwkJaWYgKG1wLT5lZXByb20uY3B1dmVycyA9PSBDUFVWRVJTXzRfMSkgeworCQkJREVUKCgiRUVQUk9NOiBjcHV2ZXJzIENQVVZFUlNfNF8xLCAiKSk7CisJCQlpZiAobXAtPmVlcHJvbS5yYW1zeiA9PSAoMTI4ICogMTAyNCkpIHsKKwkJCQlERVQoKCJyYW1zaXplIDEyOGssIHNldHRpbmcgdG8gMjU2aywgIikpOworCQkJCW1wLT5lZXByb20ucmFtc3ogPSAoMjU2ICogMTAyNCk7CisJCQl9CisJCQlpZiAoKG1wLT5lZXByb20uY3ZhbD09MHg0MDQxNDA0MSl8fChtcC0+ZWVwcm9tLmN2YWw9PTB4OTA0NDkwNDQpKXsKKwkJCQlERVQoKCJjaGFuZ2luZyBjdmFsIGZyb20gJTA4eCB0byAlMDh4ICIsCisJCQkJICAgICBtcC0+ZWVwcm9tLmN2YWwsIDB4NTBlNDUwZTQpKTsKKwkJCQltcC0+ZWVwcm9tLmN2YWwgPSAweDUwZTQ1MGU0OworCQkJfQorCQkJREVUKCgiXG4iKSk7CisJCX0KKwl9CisjaWZkZWYgREVCVUdfREVURUNUCisJZHVtcF9lZXByb20obXApOworI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gbXAtPmVlcHJvbS5pZFtpXTsKKworCWRldGVybWluZV9yZWdfc3BhY2Vfc2l6ZShtcCk7CisKKwkvKiBNYXAgaW4gdGhlIE15cmlDT00gcmVnaXN0ZXIvbG9jYWxyYW0gc2V0LiAqLworCWlmIChtcC0+ZWVwcm9tLmNwdXZlcnMgPCBDUFVWRVJTXzRfMCkgeworCQkvKiBYWFggTWFrZXMgbm8gc2Vuc2UsIGlmIGNvbnRyb2wgcmVnIGlzIG5vbi1leGlzdGFudCB0aGlzCisJCSAqIFhYWCBkcml2ZXIgY2Fubm90IGZ1bmN0aW9uIGF0IGFsbC4uLiBtYXliZSBwcmUtNC4wIGlzCisJCSAqIFhYWCBvbmx5IGEgdmFsaWQgdmVyc2lvbiBmb3IgUENJIGNhcmRzPyAgQXNrIGZlbGR5Li4uCisJCSAqLworCQlERVQoKCJNYXBwaW5nIHJlZ3MgZm9yIGNwdXZlcnMgPCBDUFVWRVJTXzRfMFxuIikpOworCQltcC0+cmVncyA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbMF0sIDAsCisJCQkJCW1wLT5yZWdfc2l6ZSwgIk15cmlDT00gUmVncyIpOworCQlpZiAoIW1wLT5yZWdzKSB7CisJCQlwcmludGsoIk15cmlDT006IENhbm5vdCBtYXAgTXlyaUNPTSByZWdpc3RlcnMuXG4iKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCW1wLT5sYW5haSA9IG1wLT5yZWdzICsgKDI1NiAqIDEwMjQpOworCQltcC0+bHJlZ3MgPSBtcC0+bGFuYWkgKyAoMHgxMDAwMCAqIDIpOworCX0gZWxzZSB7CisJCURFVCgoIk1hcHBpbmcgcmVncyBmb3IgY3B1dmVycyA+PSBDUFVWRVJTXzRfMFxuIikpOworCQltcC0+Y3JlZ3MgPSBzYnVzX2lvcmVtYXAoJnNkZXYtPnJlc291cmNlWzBdLCAwLAorCQkJCQkgUEFHRV9TSVpFLCAiTXlyaUNPTSBDb250cm9sIFJlZ3MiKTsKKwkJbXAtPmxyZWdzID0gc2J1c19pb3JlbWFwKCZzZGV2LT5yZXNvdXJjZVswXSwgKDI1NiAqIDEwMjQpLAorCQkJCQkgUEFHRV9TSVpFLCAiTXlyaUNPTSBMQU5BSSBSZWdzIik7CisJCW1wLT5sYW5haSA9CisJCQlzYnVzX2lvcmVtYXAoJnNkZXYtPnJlc291cmNlWzBdLCAoNTEyICogMTAyNCksCisJCQkJICAgICBtcC0+ZWVwcm9tLnJhbXN6LCAiTXlyaUNPTSBTUkFNIik7CisJfQorCURFVCgoIlJlZ2lzdGVycyBtYXBwZWQ6IGNyZWdzWyVwXSBscmVnc1slcF0gbGFuYWlbJXBdXG4iLAorCSAgICAgbXAtPmNyZWdzLCBtcC0+bHJlZ3MsIG1wLT5sYW5haSkpOworCisJaWYgKG1wLT5lZXByb20uY3B1dmVycyA+PSBDUFVWRVJTXzRfMCkKKwkJbXAtPnNobWVtX2Jhc2UgPSAweGYwMDA7CisJZWxzZQorCQltcC0+c2htZW1fYmFzZSA9IDB4ODAwMDsKKworCURFVCgoIlNoYXJlZCBtZW1vcnkgYmFzZSBpcyAlMDR4LCAiLCBtcC0+c2htZW1fYmFzZSkpOworCisJbXAtPnNobWVtID0gKHN0cnVjdCBteXJpX3NobWVtIF9faW9tZW0gKikKKwkJKG1wLT5sYW5haSArIChtcC0+c2htZW1fYmFzZSAqIDIpKTsKKwlERVQoKCJzaG1lbSBtYXBwZWQgYXQgJXBcbiIsIG1wLT5zaG1lbSkpOworCisJbXAtPnJxYWNrCT0gJm1wLT5zaG1lbS0+Y2hhbm5lbC5yZWN2cWE7CisJbXAtPnJxCQk9ICZtcC0+c2htZW0tPmNoYW5uZWwucmVjdnE7CisJbXAtPnNxCQk9ICZtcC0+c2htZW0tPmNoYW5uZWwuc2VuZHE7CisKKwkvKiBSZXNldCB0aGUgYm9hcmQuICovCisJREVUKCgiUmVzZXR0aW5nIExBTkFJXG4iKSk7CisJbXlyaV9yZXNldF9vZmYobXAtPmxyZWdzLCBtcC0+Y3JlZ3MpOworCW15cmlfcmVzZXRfb24obXAtPmNyZWdzKTsKKworCS8qIFR1cm4gSVJRJ3Mgb2ZmLiAqLworCW15cmlfZGlzYWJsZV9pcnEobXAtPmxyZWdzLCBtcC0+Y3JlZ3MpOworCisJLyogUmVzZXQgb25jZSBtb3JlLiAqLworCW15cmlfcmVzZXRfb24obXAtPmNyZWdzKTsKKworCS8qIEdldCB0aGUgc3VwcG9ydGVkIERWTUEgYnVyc3Qgc2l6ZXMgZnJvbSBvdXIgU0JVUy4gKi8KKwltcC0+bXlyaV9idXJzdHMgPSBwcm9tX2dldGludGRlZmF1bHQobXAtPm15cmlfc2Rldi0+YnVzLT5wcm9tX25vZGUsCisJCQkJCSAgICAgImJ1cnN0LXNpemVzIiwgMHgwMCk7CisKKwlpZiAoIXNidXNfY2FuX2J1cnN0NjQoc2RldikpCisJCW1wLT5teXJpX2J1cnN0cyAmPSB+KERNQV9CVVJTVDY0KTsKKworCURFVCgoIk1ZUkkgYnVyc3RzICUwMnhcbiIsIG1wLT5teXJpX2J1cnN0cykpOworCisJLyogRW5jb2RlIFNCVVMgaW50ZXJydXB0IGxldmVsIGluIHNlY29uZCBjb250cm9sIHJlZ2lzdGVyLiAqLworCWkgPSBwcm9tX2dldGludChzZGV2LT5wcm9tX25vZGUsICJpbnRlcnJ1cHRzIik7CisJaWYgKGkgPT0gMCkKKwkJaSA9IDQ7CisJREVUKCgicHJvbV9nZXRpbnQoaW50ZXJydXB0cyk9PSVkLCBpcnFsdmwgc2V0IHRvICUwNHhcbiIsCisJICAgICBpLCAoMSA8PCBpKSkpOworCisJc2J1c193cml0ZWwoKDEgPDwgaSksIG1wLT5jcmVncyArIE1ZUklDVFJMX0lSUUxWTCk7CisKKwltcC0+ZGV2ID0gZGV2OworCWRldi0+b3BlbiA9ICZteXJpX29wZW47CisJZGV2LT5zdG9wID0gJm15cmlfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmbXlyaV9zdGFydF94bWl0OworCWRldi0+dHhfdGltZW91dCA9ICZteXJpX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IDUqSFo7CisJZGV2LT5nZXRfc3RhdHMgPSAmbXlyaV9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmbXlyaV9zZXRfbXVsdGljYXN0OworCWRldi0+aXJxID0gc2Rldi0+aXJxc1swXTsKKworCS8qIFJlZ2lzdGVyIGludGVycnVwdCBoYW5kbGVyIG5vdy4gKi8KKwlERVQoKCJSZXF1ZXN0aW5nIE1ZUkljb20gSVJRIGxpbmUuXG4iKSk7CisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmbXlyaV9pbnRlcnJ1cHQsCisJCQlTQV9TSElSUSwgIk15cmlDT00gRXRoZXJuZXQiLCAodm9pZCAqKSBkZXYpKSB7CisJCXByaW50aygiTXlyaUNPTTogQ2Fubm90IHJlZ2lzdGVyIGludGVycnVwdCBoYW5kbGVyLlxuIik7CisJCWdvdG8gZXJyOworCX0KKworCWRldi0+bXR1CQk9IE1ZUklORVRfTVRVOworCWRldi0+Y2hhbmdlX210dQkJPSBteXJpX2NoYW5nZV9tdHU7CisJZGV2LT5oYXJkX2hlYWRlcgk9IG15cmlfaGVhZGVyOworCWRldi0+cmVidWlsZF9oZWFkZXIJPSBteXJpX3JlYnVpbGRfaGVhZGVyOworCWRldi0+aGFyZF9oZWFkZXJfbGVuCT0gKEVUSF9ITEVOICsgTVlSSV9QQURfTEVOKTsKKwlkZXYtPmhhcmRfaGVhZGVyX2NhY2hlIAk9IG15cmlfaGVhZGVyX2NhY2hlOworCWRldi0+aGVhZGVyX2NhY2hlX3VwZGF0ZT0gbXlyaV9oZWFkZXJfY2FjaGVfdXBkYXRlOworCisJLyogTG9hZCBjb2RlIG9udG8gdGhlIExBTmFpLiAqLworCURFVCgoIkxvYWRpbmcgTEFOQUkgZmlybXdhcmVcbiIpKTsKKwlteXJpX2xvYWRfbGFuYWkobXApOworCisJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CisJCXByaW50aygiTXlyaUNPTTogQ2Fubm90IHJlZ2lzdGVyIGRldmljZS5cbiIpOworCQlnb3RvIGVycl9mcmVlX2lycTsKKwl9CisKKyNpZmRlZiBNT0RVTEUKKwltcC0+bmV4dF9tb2R1bGUgPSByb290X215cmlfZGV2OworCXJvb3RfbXlyaV9kZXYgPSBtcDsKKyNlbmRpZgorCisJcHJpbnRrKCIlczogTXlyaUNPTSBNeXJpTkVUIEV0aGVybmV0ICIsIGRldi0+bmFtZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiUyLjJ4JWMiLCBkZXYtPmRldl9hZGRyW2ldLAorCQkgICAgICAgaSA9PSA1ID8gJyAnIDogJzonKTsKKwlwcmludGsoIlxuIik7CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfaXJxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworZXJyOgorCS8qIFRoaXMgd2lsbCBhbHNvIGZyZWUgdGhlIGNvLWFsbG9jYXRlZCAnZGV2LT5wcml2JyAqLworCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG15cmlfc2J1c19tYXRjaChzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYpCit7CisJY2hhciAqbmFtZSA9IHNkZXYtPnByb21fbmFtZTsKKworCWlmICghc3RyY21wKG5hbWUsICJNWVJJQ09NLG1sYW5haSIpIHx8CisJICAgICFzdHJjbXAobmFtZSwgIm15cmkiKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbXlyaV9zYnVzX3Byb2JlKHZvaWQpCit7CisJc3RydWN0IHNidXNfYnVzICpidXM7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gTlVMTDsKKwlzdGF0aWMgaW50IGNhbGxlZDsKKwlpbnQgY2FyZHMgPSAwLCB2OworCisjaWZkZWYgTU9EVUxFCisJcm9vdF9teXJpX2RldiA9IE5VTEw7CisjZW5kaWYKKworCWlmIChjYWxsZWQpCisJCXJldHVybiAtRU5PREVWOworCWNhbGxlZCsrOworCisJZm9yX2VhY2hfc2J1cyhidXMpIHsKKwkJZm9yX2VhY2hfc2J1c2RldihzZGV2LCBidXMpIHsKKwkJCWlmIChteXJpX3NidXNfbWF0Y2goc2RldikpIHsKKwkJCQljYXJkcysrOworCQkJCURFVCgoIkZvdW5kIG15cmljb20gbXlyaW5ldCBhcyAlc1xuIiwgc2Rldi0+cHJvbV9uYW1lKSk7CisJCQkJaWYgKCh2ID0gbXlyaV9ldGhlcl9pbml0KHNkZXYsIChjYXJkcyAtIDEpKSkpCisJCQkJCXJldHVybiB2OworCQkJfQorCQl9CisJfQorCWlmICghY2FyZHMpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbXlyaV9zYnVzX2NsZWFudXAodm9pZCkKK3sKKyNpZmRlZiBNT0RVTEUKKwl3aGlsZSAocm9vdF9teXJpX2RldikgeworCQlzdHJ1Y3QgbXlyaV9ldGggKm5leHQgPSByb290X215cmlfZGV2LT5uZXh0X21vZHVsZTsKKworCQl1bnJlZ2lzdGVyX25ldGRldihyb290X215cmlfZGV2LT5kZXYpOworCQkvKiB0aGlzIHdpbGwgYWxzbyBmcmVlIHRoZSBjby1hbGxvY2F0ZWQgJ3Jvb3RfbXlyaV9kZXYnICovCisJCWZyZWVfbmV0ZGV2KHJvb3RfbXlyaV9kZXYtPmRldik7CisJCXJvb3RfbXlyaV9kZXYgPSBuZXh0OworCX0KKyNlbmRpZiAvKiBNT0RVTEUgKi8KK30KKworbW9kdWxlX2luaXQobXlyaV9zYnVzX3Byb2JlKTsKK21vZHVsZV9leGl0KG15cmlfc2J1c19jbGVhbnVwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L215cmlfc2J1cy5oIGIvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5MWU1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L215cmlfc2J1cy5oCkBAIC0wLDAgKzEsMzEzIEBACisvKiBteXJpX3NidXMuaDogRGVmaW5lcyBmb3IgTXlyaUNPTSBNeXJpTkVUIFNCVVMgY2FyZCBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKKyAqLworCisjaWZuZGVmIF9NWVJJX1NCVVNfSAorI2RlZmluZSBfTVlSSV9TQlVTX0gKKworLyogTEFOQUkgUmVnaXN0ZXJzICovCisjZGVmaW5lIExBTkFJX0lQRjAJMHgwMFVMCQkvKiBDb250ZXh0IHplcm8gc3RhdGUgcmVnaXN0ZXJzLiovCisjZGVmaW5lIExBTkFJX0NVUjAJMHgwNFVMCisjZGVmaW5lIExBTkFJX1BSRVYwCTB4MDhVTAorI2RlZmluZSBMQU5BSV9EQVRBMAkweDBjVUwKKyNkZWZpbmUgTEFOQUlfRFBGMAkweDEwVUwKKyNkZWZpbmUgTEFOQUlfSVBGMQkweDE0VUwJCS8qIENvbnRleHQgb25lIHN0YXRlIHJlZ2lzdGVycy4JKi8KKyNkZWZpbmUgTEFOQUlfQ1VSMQkweDE4VUwKKyNkZWZpbmUgTEFOQUlfUFJFVjEJMHgxY1VMCisjZGVmaW5lIExBTkFJX0RBVEExCTB4MjBVTAorI2RlZmluZSBMQU5BSV9EUEYxCTB4MjRVTAorI2RlZmluZSBMQU5BSV9JU1RBVAkweDI4VUwJCS8qIEludGVycnVwdCBzdGF0dXMuCQkqLworI2RlZmluZSBMQU5BSV9FSU1BU0sJMHgyY1VMCQkvKiBFeHRlcm5hbCBJUlEgbWFzay4JCSovCisjZGVmaW5lIExBTkFJX0lUSU1FUgkweDMwVUwJCS8qIElSUSB0aW1lci4JCQkqLworI2RlZmluZSBMQU5BSV9SVEMJMHgzNFVMCQkvKiBSZWFsIFRpbWUgQ2xvY2sJCSovCisjZGVmaW5lIExBTkFJX0NTVU0JMHgzOFVMCQkvKiBDaGVja3N1bS4JCQkqLworI2RlZmluZSBMQU5BSV9ETUFYQUREUgkweDNjVUwJCS8qIFNCVVMgRE1BIGV4dGVybmFsIGFkZHJlc3MuCSovCisjZGVmaW5lIExBTkFJX0RNQUxBRERSCTB4NDBVTAkJLyogU0JVUyBETUEgbG9jYWwgYWRkcmVzcy4JKi8KKyNkZWZpbmUgTEFOQUlfRE1BQ1RSCTB4NDRVTAkJLyogU0JVUyBETUEgY291bnRlci4JCSovCisjZGVmaW5lIExBTkFJX1JYRE1BUFRSCTB4NDhVTAkJLyogUmVjZWl2ZSBETUEgcG9pbnRlci4JCSovCisjZGVmaW5lIExBTkFJX1JYRE1BTElNCTB4NGNVTAkJLyogUmVjZWl2ZSBETUEgbGltaXQuCQkqLworI2RlZmluZSBMQU5BSV9UWERNQVBUUgkweDUwVUwJCS8qIFRyYW5zbWl0IERNQSBwb2ludGVyLgkqLworI2RlZmluZSBMQU5BSV9UWERNQUxJTQkweDU0VUwJCS8qIFRyYW5zbWl0IERNQSBsaW1pdC4JCSovCisjZGVmaW5lIExBTkFJX1RYRE1BTElNVAkweDU4VUwJCS8qIFRyYW5zbWl0IERNQSBsaW1pdCB3L3RhaWwuCSovCisJLyogMHg1Y1VMLCByZXNlcnZlZCAqLworI2RlZmluZSBMQU5BSV9SQllURQkweDYwVUwJCS8qIFJlY2VpdmUgYnl0ZS4JCSovCisJLyogMHg2NC0tPjB4NmMsIHJlc2VydmVkICovCisjZGVmaW5lIExBTkFJX1JIQUxGCTB4NzBVTAkJLyogUmVjZWl2ZSBoYWxmLXdvcmQuCQkqLworCS8qIDB4NzJVTCwgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTEFOQUlfUldPUkQJMHg3NFVMCQkvKiBSZWNlaXZlIHdvcmQuCQkqLworI2RlZmluZSBMQU5BSV9TQUxJR04JMHg3OFVMCQkvKiBTZW5kIGFsaWduLgkJCSovCisjZGVmaW5lIExBTkFJX1NCWVRFCTB4N2NVTAkJLyogU2luZ2xlU2VuZCBzZW5kLWJ5dGUuCSovCisjZGVmaW5lIExBTkFJX1NIQUxGCTB4ODBVTAkJLyogU2luZ2xlU2VuZCBzZW5kLWhhbGZ3b3JkLgkqLworI2RlZmluZSBMQU5BSV9TV09SRAkweDg0VUwJCS8qIFNpbmdsZVNlbmQgc2VuZC13b3JkLgkqLworI2RlZmluZSBMQU5BSV9TU0VORFQJMHg4OFVMCQkvKiBTaW5nbGVTZW5kIHNwZWNpYWwuCQkqLworI2RlZmluZSBMQU5BSV9ETUFESVIJMHg4Y1VMCQkvKiBETUEgZGlyZWN0aW9uLgkJKi8KKyNkZWZpbmUgTEFOQUlfRE1BU1RBVAkweDkwVUwJCS8qIERNQSBzdGF0dXMuCQkJKi8KKyNkZWZpbmUgTEFOQUlfVElNRU8JMHg5NFVMCQkvKiBUaW1lb3V0IHJlZ2lzdGVyLgkJKi8KKyNkZWZpbmUgTEFOQUlfTVlSSU5FVAkweDk4VUwJCS8qIFhYWCBNQUdJQyBteXJpY29tIHRoaW5nCSovCisjZGVmaW5lIExBTkFJX0hXREVCVUcJMHg5Y1VMCQkvKiBIYXJkd2FyZSBkZWJ1Z2dpbmcgcmVnLgkqLworI2RlZmluZSBMQU5BSV9MRURTCTB4YTBVTAkJLyogTEVEIGNvbnRyb2wuCQkJKi8KKyNkZWZpbmUgTEFOQUlfVkVSUwkweGE0VUwJCS8qIFZlcnNpb24gcmVnaXN0ZXIuCQkqLworI2RlZmluZSBMQU5BSV9MSU5LT04JMHhhOFVMCQkvKiBMaW5rIGFjdGl2YXRpb24gcmVnLgkJKi8KKwkvKiAweGFjLS0+MHgxMDQsIHJlc2VydmVkICovCisjZGVmaW5lIExBTkFJX0NWQUwJMHgxMDhVTAkJLyogQ2xvY2sgdmFsdWUgcmVnaXN0ZXIuCSovCisjZGVmaW5lIExBTkFJX1JFR19TSVpFCTB4MTBjVUwKKworLyogSW50ZXJydXB0IHN0YXR1cyBiaXRzLiAqLworI2RlZmluZSBJU1RBVF9ERUJVRwkweDgwMDAwMDAwCisjZGVmaW5lIElTVEFUX0hPU1QJMHg0MDAwMDAwMAorI2RlZmluZSBJU1RBVF9MQU43CTB4MDA4MDAwMDAKKyNkZWZpbmUgSVNUQVRfTEFONgkweDAwNDAwMDAwCisjZGVmaW5lIElTVEFUX0xBTjUJMHgwMDIwMDAwMAorI2RlZmluZSBJU1RBVF9MQU40CTB4MDAxMDAwMDAKKyNkZWZpbmUgSVNUQVRfTEFOMwkweDAwMDgwMDAwCisjZGVmaW5lIElTVEFUX0xBTjIJMHgwMDA0MDAwMAorI2RlZmluZSBJU1RBVF9MQU4xCTB4MDAwMjAwMDAKKyNkZWZpbmUgSVNUQVRfTEFOMAkweDAwMDEwMDAwCisjZGVmaW5lIElTVEFUX1dSRFkJMHgwMDAwODAwMAorI2RlZmluZSBJU1RBVF9IUkRZCTB4MDAwMDQwMDAKKyNkZWZpbmUgSVNUQVRfU1JEWQkweDAwMDAyMDAwCisjZGVmaW5lIElTVEFUX0xJTksJMHgwMDAwMTAwMAorI2RlZmluZSBJU1RBVF9GUkVTCTB4MDAwMDA4MDAKKyNkZWZpbmUgSVNUQVRfTlJFUwkweDAwMDAwODAwCisjZGVmaW5lIElTVEFUX1dBS0UJMHgwMDAwMDQwMAorI2RlZmluZSBJU1RBVF9PQjIJMHgwMDAwMDIwMAorI2RlZmluZSBJU1RBVF9PQjEJMHgwMDAwMDEwMAorI2RlZmluZSBJU1RBVF9UQUlMCTB4MDAwMDAwODAKKyNkZWZpbmUgSVNUQVRfV0RPRwkweDAwMDAwMDQwCisjZGVmaW5lIElTVEFUX1RJTUUJMHgwMDAwMDAyMAorI2RlZmluZSBJU1RBVF9ETUEJMHgwMDAwMDAxMAorI2RlZmluZSBJU1RBVF9TRU5ECTB4MDAwMDAwMDgKKyNkZWZpbmUgSVNUQVRfQlVGCTB4MDAwMDAwMDQKKyNkZWZpbmUgSVNUQVRfUkVDVgkweDAwMDAwMDAyCisjZGVmaW5lIElTVEFUX0JSRFkJMHgwMDAwMDAwMQorCisvKiBNWVJJIFJlZ2lzdGVycyAqLworI2RlZmluZSBNWVJJX1JFU0VUT0ZGCTB4MDBVTAorI2RlZmluZSBNWVJJX1JFU0VUT04JMHgwNFVMCisjZGVmaW5lIE1ZUklfSVJRT0ZGCTB4MDhVTAorI2RlZmluZSBNWVJJX0lSUU9OCTB4MGNVTAorI2RlZmluZSBNWVJJX1dBS0VVUE9GRgkweDEwVUwKKyNkZWZpbmUgTVlSSV9XQUtFVVBPTgkweDE0VUwKKyNkZWZpbmUgTVlSSV9JUlFSRUFECTB4MThVTAorCS8qIDB4MWMtLT4weDNmZmMsIHJlc2VydmVkICovCisjZGVmaW5lIE1ZUklfTE9DQUxNRU0JMHg0MDAwVUwKKyNkZWZpbmUgTVlSSV9SRUdfU0laRQkweDI1MDAwVUwKKworLyogU2hhcmVkIG1lbW9yeSBpbnRlcnJ1cHQgbWFzay4gKi8KKyNkZWZpbmUgU0hNRU1fSU1BU0tfUlgJCTB4MDAwMDAwMDIKKyNkZWZpbmUgU0hNRU1fSU1BU0tfVFgJCTB4MDAwMDAwMDEKKworLyogSnVzdCB0byBtYWtlIHRoaW5ncyByZWFkYWJsZS4gKi8KKyNkZWZpbmUgS0VSTkVMX0NIQU5ORUwJCTAKKworLyogVGhlIHNpemUgb2YgdGhpcyBtdXN0IGJlID49IDEyOSBieXRlcy4gKi8KK3N0cnVjdCBteXJpX2VlcHJvbSB7CisJdW5zaWduZWQgaW50CQljdmFsOworCXVuc2lnbmVkIHNob3J0CQljcHV2ZXJzOworCXVuc2lnbmVkIGNoYXIJCWlkWzZdOworCXVuc2lnbmVkIGludAkJcmFtc3o7CisJdW5zaWduZWQgY2hhcgkJZnZlcnNbMzJdOworCXVuc2lnbmVkIGNoYXIJCW12ZXJzWzE2XTsKKwl1bnNpZ25lZCBzaG9ydAkJZGx2YWw7CisJdW5zaWduZWQgc2hvcnQJCWJyZF90eXBlOworCXVuc2lnbmVkIHNob3J0CQlidXNfdHlwZTsKKwl1bnNpZ25lZCBzaG9ydAkJcHJvZF9jb2RlOworCXVuc2lnbmVkIGludAkJc2VyaWFsX251bTsKKwl1bnNpZ25lZCBzaG9ydAkJX3Jlc2VydmVkWzI0XTsKKwl1bnNpZ25lZCBpbnQJCV91bnVzZWRbMl07Cit9OworCisvKiBFRVBST00gYnVzIHR5cGVzLCBvbmx5IFNCVVMgaXMgdmFsaWQgaW4gdGhpcyBkcml2ZXIuICovCisjZGVmaW5lIEJVU19UWVBFX1NCVVMJCTEKKworLyogRUVQUk9NIENQVSByZXZpc2lvbnMuICovCisjZGVmaW5lIENQVVZFUlNfMl8zCQkweDAyMDMKKyNkZWZpbmUgQ1BVVkVSU18zXzAJCTB4MDMwMAorI2RlZmluZSBDUFVWRVJTXzNfMQkJMHgwMzAxCisjZGVmaW5lIENQVVZFUlNfM18yCQkweDAzMDIKKyNkZWZpbmUgQ1BVVkVSU180XzAJCTB4MDQwMAorI2RlZmluZSBDUFVWRVJTXzRfMQkJMHgwNDAxCisjZGVmaW5lIENQVVZFUlNfNF8yCQkweDA0MDIKKyNkZWZpbmUgQ1BVVkVSU181XzAJCTB4MDUwMAorCisvKiBNWVJJIENvbnRyb2wgUmVnaXN0ZXJzICovCisjZGVmaW5lIE1ZUklDVFJMX0NUUkwJCTB4MDBVTAorI2RlZmluZSBNWVJJQ1RSTF9JUlFMVkwJCTB4MDJVTAorI2RlZmluZSBNWVJJQ1RSTF9SRUdfU0laRQkweDA0VUwKKworLyogR2xvYmFsIGNvbnRyb2wgcmVnaXN0ZXIgZGVmaW5lcy4gKi8KKyNkZWZpbmUgQ09OVFJPTF9ST0ZGCQkweDgwMDAJLyogUmVzZXQgT0ZGLgkJKi8KKyNkZWZpbmUgQ09OVFJPTF9ST04JCTB4NDAwMAkvKiBSZXNldCBPTi4JCSovCisjZGVmaW5lIENPTlRST0xfRUlSUQkJMHgyMDAwCS8qIEVuYWJsZSBJUlEncy4JKi8KKyNkZWZpbmUgQ09OVFJPTF9ESVJRCQkweDEwMDAJLyogRGlzYWJsZSBJUlEncy4JKi8KKyNkZWZpbmUgQ09OVFJPTF9XT04JCTB4MDgwMAkvKiBXYWtlLXVwIE9OLgkJKi8KKworI2RlZmluZSBNWVJJX1NDQVRURVJfRU5UUklFUwk4CisjZGVmaW5lIE1ZUklfR0FUSEVSX0VOVFJJRVMJMTYKKworc3RydWN0IG15cmlfc2dsaXN0IHsKKwl1MzIgYWRkcjsKKwl1MzIgbGVuOworfTsKKworc3RydWN0IG15cmlfcnhkIHsKKwlzdHJ1Y3QgbXlyaV9zZ2xpc3QgbXlyaV9zY2F0dGVyc1tNWVJJX1NDQVRURVJfRU5UUklFU107CS8qIERNQSBzY2F0dGVyIGxpc3QuKi8KKwl1MzIgY3N1bTsJLyogSFcgY29tcHV0ZWQgY2hlY2tzdW0uICAgICovCisJdTMyIGN0eDsKKwl1MzIgbnVtX3NnOwkvKiBUb3RhbCBzY2F0dGVyIGVudHJpZXMuICAgKi8KK307CisKK3N0cnVjdCBteXJpX3R4ZCB7CisJc3RydWN0IG15cmlfc2dsaXN0IG15cmlfZ2F0aGVyc1tNWVJJX0dBVEhFUl9FTlRSSUVTXTsgLyogRE1BIHNjYXR0ZXIgbGlzdC4gICovCisJdTMyIG51bV9zZzsJLyogVG90YWwgc2NhdHRlciBlbnRyaWVzLiAgICovCisJdTE2IGFkZHJbNF07CS8qIFhYWCBhZGRyZXNzICAgICAgICAgICAgICAqLworCXUzMiBjaGFuOworCXUzMiBsZW47CS8qIFRvdGFsIGxlbmd0aCBvZiBwYWNrZXQuICAqLworCXUzMiBjc3VtX29mZjsJLyogV2hlcmUgZGF0YSB0byBjc3VtIGlzLiAgICovCisJdTMyIGNzdW1fZmllbGQ7CS8qIFdoZXJlIGNzdW0gZ29lcyBpbiBwa3QuICAqLworfTsKKworI2RlZmluZSBNWVJJTkVUX01UVSAgICAgICAgODQzMgorI2RlZmluZSBSWF9BTExPQ19TSVpFICAgICAgODQ0OAorI2RlZmluZSBNWVJJX1BBRF9MRU4gICAgICAgMgorI2RlZmluZSBSWF9DT1BZX1RIUkVTSE9MRCAgMjU2CisKKy8qIFRoZXNlIG51bWJlcnMgYXJlIGNhc3QgaW4gc3RvbmUsIG5ldyBmaXJtd2FyZSBpcyBuZWVkZWQgaWYKKyAqIHlvdSB3YW50IHRvIGNoYW5nZSB0aGVtLgorICovCisjZGVmaW5lIFRYX1JJTkdfTUFYU0laRSAgICAxNgorI2RlZmluZSBSWF9SSU5HX01BWFNJWkUgICAgMTYKKworI2RlZmluZSBUWF9SSU5HX1NJWkUgICAgICAgMTYKKyNkZWZpbmUgUlhfUklOR19TSVpFICAgICAgIDE2CisKKy8qIEdSUlIuLi4gKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCBORVhUX1JYKGludCBudW0pCit7CisJLyogWFhYID49Pz8/ICovCisJaWYoKytudW0gPiBSWF9SSU5HX1NJWkUpCisJCW51bSA9IDA7CisJcmV0dXJuIG51bTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IFBSRVZfUlgoaW50IG51bSkKK3sKKwlpZigtLW51bSA8IDApCisJCW51bSA9IFJYX1JJTkdfU0laRTsKKwlyZXR1cm4gbnVtOworfQorCisjZGVmaW5lIE5FWFRfVFgobnVtKQkoKChudW0pICsgMSkgJiAoVFhfUklOR19TSVpFIC0gMSkpCisjZGVmaW5lIFBSRVZfVFgobnVtKQkoKChudW0pIC0gMSkgJiAoVFhfUklOR19TSVpFIC0gMSkpCisKKyNkZWZpbmUgVFhfQlVGRlNfQVZBSUwoaGVhZCwgdGFpbCkJCVwKKwkoKGhlYWQpIDw9ICh0YWlsKSA/CQkJXAorCSAoaGVhZCkgKyAoVFhfUklOR19TSVpFIC0gMSkgLSAodGFpbCkgOglcCisJIChoZWFkKSAtICh0YWlsKSAtIDEpCisKK3N0cnVjdCBzZW5kcSB7CisJdTMyCXRhaWw7CisJdTMyCWhlYWQ7CisJdTMyCWhkZWJ1ZzsKKwl1MzIJbWRlYnVnOworCXN0cnVjdCBteXJpX3R4ZAlteXJpX3R4ZFtUWF9SSU5HX01BWFNJWkVdOworfTsKKworc3RydWN0IHJlY3ZxIHsKKwl1MzIJaGVhZDsKKwl1MzIJdGFpbDsKKwl1MzIJaGRlYnVnOworCXUzMgltZGVidWc7CisJc3RydWN0IG15cmlfcnhkCW15cmlfcnhkW1JYX1JJTkdfTUFYU0laRSArIDFdOworfTsKKworI2RlZmluZSBNWVJJX01MSVNUX1NJWkUgOAorCitzdHJ1Y3QgbWNsaXN0IHsKKwl1MzIgbWF4bGVuOworCXUzMiBsZW47CisJdTMyIGNhY2hlOworCXN0cnVjdCBwYWlyIHsKKwkJdTggYWRkcls4XTsKKwkJdTMyIHZhbDsKKwl9IG1jX3BhaXJzW01ZUklfTUxJU1RfU0laRV07CisJdTggYmNhc3RfYWRkcls4XTsKK307CisKK3N0cnVjdCBteXJpX2NoYW5uZWwgeworCXUzMgkJc3RhdGU7CQkvKiBTdGF0ZSBvZiB0aGUgY2hhbm5lbC4JKi8KKwl1MzIJCWJ1c3k7CQkvKiBDaGFubmVsIGlzIGJ1c3kuCQkqLworCXN0cnVjdCBzZW5kcQlzZW5kcTsJCS8qIERldmljZSB0eCBxdWV1ZS4JCSovCisJc3RydWN0IHJlY3ZxCXJlY3ZxOwkJLyogRGV2aWNlIHJ4IHF1ZXVlLgkJKi8KKwlzdHJ1Y3QgcmVjdnEJcmVjdnFhOwkJLyogRGV2aWNlIHJ4IHF1ZXVlIGFja2VkLgkqLworCXUzMgkJcmJ5dGVzOwkJLyogUmVjZWl2ZSBieXRlcy4JCSovCisJdTMyCQlzYnl0ZXM7CQkvKiBTZW5kIGJ5dGVzLgkJCSovCisJdTMyCQlybXNnczsJCS8qIFJlY2VpdmUgbWVzc2FnZXMuCQkqLworCXUzMgkJc21zZ3M7CQkvKiBTZW5kIG1lc3NhZ2VzLgkJKi8KKwlzdHJ1Y3QgbWNsaXN0CW1jbGlzdDsJCS8qIERldmljZSBtdWx0aWNhc3QgbGlzdC4JKi8KK307CisKKy8qIFZhbHVlcyBmb3IgcGVyLWNoYW5uZWwgc3RhdGUuICovCisjZGVmaW5lIFNUQVRFX1dGSAkwCQkvKiBXYWl0aW5nIGZvciBIT1NULgkJKi8KKyNkZWZpbmUgU1RBVEVfV0ZOCTEJCS8qIFdhaXRpbmcgZm9yIE5FVC4JCSovCisjZGVmaW5lIFNUQVRFX1JFQURZCTIJCS8qIFJlYWR5LgkJCSovCisKK3N0cnVjdCBteXJpX3NobWVtIHsKKwl1OAlhZGRyWzhdOwkJLyogQm9hcmQncyBhZGRyZXNzLgkJKi8KKwl1MzIJbmNoYW47CQkJLyogTnVtYmVyIG9mIGNoYW5uZWxzLgkJKi8KKwl1MzIJYnVyc3Q7CQkJLyogU0JVUyBkbWEgYnVyc3QgZW5hYmxlLgkqLworCXUzMglzaGFrZWRvd247CQkvKiBEYXJra2trU3RhcnJyIENyYXNoZXNzcy4uLgkqLworCXUzMglzZW5kOwkJCS8qIFNlbmQgd2FudGVkLgkJCSovCisJdTMyCWltYXNrOwkJCS8qIEludGVycnVwdCBlbmFibGUgbWFzay4JKi8KKwl1MzIJbWxldmVsOwkJCS8qIE1hcCBsZXZlbC4JCQkqLworCXUzMglkZWJ1Z1s0XTsJCS8qIE1pc2MuIGRlYnVnIGFyZWFzLgkJKi8KKwlzdHJ1Y3QgbXlyaV9jaGFubmVsIGNoYW5uZWw7CS8qIE9ubHkgb25lIGNoYW5uZWwgb24gYSBob3N0LgkqLworfTsKKworc3RydWN0IG15cmlfZXRoIHsKKwkvKiBUaGVzZSBhcmUgZnJlcXVlbnRseSBhY2Nlc3NlZCwga2VlcCB0b2dldGhlcgorCSAqIHRvIG9idGFpbiBnb29kIGNhY2hlIGhpdCByYXRlcy4KKwkgKi8KKwlzcGlubG9ja190CQkJaXJxX2xvY2s7CisJc3RydWN0IG15cmlfc2htZW0gX19pb21lbQkqc2htZW07CQkvKiBTaGFyZWQgZGF0YSBzdHJ1Y3R1cmVzLiAgICAqLworCXZvaWQgX19pb21lbQkJCSpjcmVnczsJCS8qIENvbnRyb2wgcmVnaXN0ZXIgc3BhY2UuICAgICovCisJc3RydWN0IHJlY3ZxIF9faW9tZW0JCSpycWFjazsJCS8qIFdoZXJlIHdlIGFjayByeCdzLiAgICAgICAgICovCisJc3RydWN0IHJlY3ZxIF9faW9tZW0JCSpycTsJCS8qIFdoZXJlIHdlIHB1dCBidWZmZXJzLiAgICAgICovCisJc3RydWN0IHNlbmRxIF9faW9tZW0JCSpzcTsJCS8qIFdoZXJlIHdlIHN0dWZmIHR4J3MuICAgICAgICovCisJc3RydWN0IG5ldF9kZXZpY2UJCSpkZXY7CQkvKiBMaW51eC9ORVQgZGV2IHN0cnVjdC4gICAgICAqLworCWludAkJCQl0eF9vbGQ7CQkvKiBUbyBzcGVlZCB1cCB0eCBjbGVhbmluZy4gICAqLworCXZvaWQgX19pb21lbQkJCSpscmVnczsJCS8qIFF1aWNrIHB0ciB0byBMQU5BSSByZWdzLiAgICovCisJc3RydWN0IHNrX2J1ZmYJICAgICAgICpyeF9za2JzW1JYX1JJTkdfU0laRSsxXTsvKiBSWCBza2IncyAgICAgICAgICAgICAgICAgICAqLworCXN0cnVjdCBza19idWZmCSAgICAgICAqdHhfc2tic1tUWF9SSU5HX1NJWkVdOyAgLyogVFggc2tiJ3MgICAgICAgICAgICAgICAgICAgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwkJZW5ldF9zdGF0czsJLyogSW50ZXJmYWNlIHN0YXRzLiAgICAgICAgICAgKi8KKworCS8qIFRoZXNlIGFyZSBsZXNzIGZyZXF1ZW50bHkgYWNjZXNzZWQuICovCisJdm9pZCBfX2lvbWVtCQkJKnJlZ3M7ICAgICAgICAgIC8qIE15cmlDT00gcmVnaXN0ZXIgc3BhY2UuICAgICovCisJdm9pZCBfX2lvbWVtCQkJKmxhbmFpOwkJLyogVmlldyAyIG9mIHJlZ2lzdGVyIHNwYWNlLiAgKi8KKwl1bnNpZ25lZCBpbnQJCQlteXJpX2J1cnN0czsJLyogU0JVUyBidXJzdHMuICAgICAgICAgICAgICAgKi8KKwlzdHJ1Y3QgbXlyaV9lZXByb20JCWVlcHJvbTsJCS8qIExvY2FsIGNvcHkgb2YgRUVQUk9NLiAgICAgICovCisJdW5zaWduZWQgaW50CQkJcmVnX3NpemU7CS8qIFNpemUgb2YgcmVnaXN0ZXIgc3BhY2UuICAgICovCisJdW5zaWduZWQgaW50CQkJc2htZW1fYmFzZTsJLyogT2Zmc2V0IHRvIHNoYXJlZCByYW0uICAgICAgKi8KKwlzdHJ1Y3Qgc2J1c19kZXYJCQkqbXlyaV9zZGV2OwkvKiBPdXIgU0JVUyBkZXZpY2Ugc3RydWN0LiAgICAqLworCXN0cnVjdCBteXJpX2V0aAkJCSpuZXh0X21vZHVsZTsJLyogTmV4dCBpbiBhZGFwdGVyIGNoYWluLiAgICAgKi8KK307CisKKy8qIFdlIHVzZSB0aGlzIHRvIGFjcXVpcmUgcmVjZWl2ZSBza2IncyB0aGF0IHdlIGNhbiBETUEgZGlyZWN0bHkgaW50by4gKi8KKyNkZWZpbmUgQUxJR05FRF9SWF9TS0JfQUREUihhZGRyKSBcCisgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShhZGRyKSArICg2NCAtIDEpKSAmIH4oNjQgLSAxKSkgLSAodW5zaWduZWQgbG9uZykoYWRkcikpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpteXJpX2FsbG9jX3NrYih1bnNpZ25lZCBpbnQgbGVuZ3RoLCBpbnQgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBhbGxvY19za2IobGVuZ3RoICsgNjQsIGdmcF9mbGFncyk7CisJaWYoc2tiKSB7CisJCWludCBvZmZzZXQgPSBBTElHTkVEX1JYX1NLQl9BRERSKHNrYi0+ZGF0YSk7CisKKwkJaWYob2Zmc2V0KQorCQkJc2tiX3Jlc2VydmUoc2tiLCBvZmZzZXQpOworCX0KKwlyZXR1cm4gc2tiOworfQorCisjZW5kaWYgLyogIShfTVlSSV9TQlVTX0gpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uYXRzZW1pLmMgYi9kcml2ZXJzL25ldC9uYXRzZW1pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIzYmRhZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L25hdHNlbWkuYwpAQCAtMCwwICsxLDMyNzMgQEAKKy8qIG5hdHNlbWkuYzogQSBMaW51eCBQQ0kgRXRoZXJuZXQgZHJpdmVyIGZvciB0aGUgTmF0U2VtaSBEUDgzODF4IHNlcmllcy4gKi8KKy8qCisJV3JpdHRlbi9jb3B5cmlnaHQgMTk5OS0yMDAxIGJ5IERvbmFsZCBCZWNrZXIuCisJUG9ydGlvbnMgY29weXJpZ2h0IChjKSAyMDAxLDIwMDIgU3VuIE1pY3Jvc3lzdGVtcyAodGhvY2tpbkBzdW4uY29tKQorCVBvcnRpb25zIGNvcHlyaWdodCAyMDAxLDIwMDIgTWFuZnJlZCBTcHJhdWwgKG1hbmZyZWRAY29sb3JmdWxsaWZlLmNvbSkKKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKwl0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCURyaXZlcnMgYmFzZWQgb24gb3IgZGVyaXZlZCBmcm9tIHRoaXMgY29kZSBmYWxsIHVuZGVyIHRoZSBHUEwgYW5kIG11c3QKKwlyZXRhaW4gdGhlIGF1dGhvcnNoaXAsIGNvcHlyaWdodCBhbmQgbGljZW5zZSBub3RpY2UuICBUaGlzIGZpbGUgaXMgbm90CisJYSBjb21wbGV0ZSBwcm9ncmFtIGFuZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdGhlIGVudGlyZSBvcGVyYXRpbmcKKwlzeXN0ZW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4gIExpY2Vuc2UgZm9yIHVuZGVyIG90aGVyIHRlcm1zIG1heSBiZQorCWF2YWlsYWJsZS4gIENvbnRhY3QgdGhlIG9yaWdpbmFsIGF1dGhvciBmb3IgZGV0YWlscy4KKworCVRoZSBvcmlnaW5hbCBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgYXQKKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisJU3VwcG9ydCBpbmZvcm1hdGlvbiBhbmQgdXBkYXRlcyBhdmFpbGFibGUgYXQKKwlodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL25ldHNlbWkuaHRtbAorCisKKwlMaW51eCBrZXJuZWwgbW9kaWZpY2F0aW9uczoKKworCVZlcnNpb24gMS4wLjE6CisJCS0gU3BpbmxvY2sgZml4ZXMKKwkJLSBCdWcgZml4ZXMgYW5kIGJldHRlciBpbnRyIHBlcmZvcm1hbmNlIChUamVlcmQpCisJVmVyc2lvbiAxLjAuMjoKKwkJLSBOb3cgcmVhZHMgY29ycmVjdCBNQUMgYWRkcmVzcyBmcm9tIGVlcHJvbQorCVZlcnNpb24gMS4wLjM6CisJCS0gRWxpbWluYXRlIHJlZHVuZGFudCBwcml2LT50eF9mdWxsIGZsYWcKKwkJLSBDYWxsIG5ldGlmX3N0YXJ0X3F1ZXVlIGZyb20gZGV2LT50eF90aW1lb3V0CisJCS0gd21iKCkgaW4gc3RhcnRfdHgoKSB0byBmbHVzaCBkYXRhCisJCS0gVXBkYXRlIFR4IGxvY2tpbmcKKwkJLSBDbGVhbiB1cCBQQ0kgZW5hYmxlIChkYXZlaikKKwlWZXJzaW9uIDEuMC40OgorCQktIE1lcmdlIERvbmFsZCBCZWNrZXIncyBuYXRzZW1pLmMgdmVyc2lvbiAxLjA3CisJVmVyc2lvbiAxLjAuNToKKwkJLSB7IGZpbGwgbWUgaW4gfQorCVZlcnNpb24gMS4wLjY6CisJCSogZXRodG9vbCBzdXBwb3J0IChqZ2FyemlrKQorCQkqIFByb3BlciBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2FyZCAod2hpY2ggc29tZXRpbWVzCisJCWZhaWxzIHRvIG9jY3VyIGFuZCBsZWF2ZXMgdGhlIGNhcmQgaW4gYSBub24tZnVuY3Rpb25hbAorCQlzdGF0ZSkuICh1emkpCisKKwkJKiBTb21lIGRvY3VtZW50ZWQgcmVnaXN0ZXIgc2V0dGluZ3MgdG8gb3B0aW1pemUgc29tZQorCQlvZiB0aGUgMTAwTWJpdCBhdXRvZGV0ZWN0aW9uIGNpcmN1aXRyeSBpbiByZXYgQyBjYXJkcy4gKHV6aSkKKworCQkqIFBvbGxpbmcgb2YgdGhlIFBIWSBpbnRyIGZvciBzdHVmZiBsaWtlIGxpbmsgc3RhdGUKKwkJY2hhbmdlIGFuZCBhdXRvLSBuZWdvdGlhdGlvbiB0byBmaW5hbGx5IHdvcmsgcHJvcGVybHkuICh1emkpCisKKwkJKiBPbmUtbGluZXIgcmVtb3ZhbCBvZiBhIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbiBvZgorCQluZXRkZXZfZXJyb3IoKS4gKHV6aSkKKworCVZlcnNpb24gMS4wLjc6IChNYW5mcmVkIFNwcmF1bCkKKwkJKiBwY2kgZG1hCisJCSogU01QIGxvY2tpbmcgdXBkYXRlCisJCSogZnVsbCByZXNldCBhZGRlZCBpbnRvIHR4X3RpbWVvdXQKKwkJKiBjb3JyZWN0IG11bHRpY2FzdCBoYXNoIGdlbmVyYXRpb24gKGJvdGggYmlnIGFuZCBsaXR0bGUgZW5kaWFuKQorCQkJW2NvcGllZCBmcm9tIGEgbmF0c2VtaSBkcml2ZXIgdmVyc2lvbgorCQkJIGZyb20gTXlyaW8gQ29ycG9yYXRpb24sIEdyZWcgU21pdGhdCisJCSogc3VzcGVuZC9yZXN1bWUKKworCXZlcnNpb24gMS4wLjggKFRpbSBIb2NraW4gPHRob2NraW5Ac3VuLmNvbT4pCisJCSogRVRIVE9PTF8qIHN1cHBvcnQKKwkJKiBXYWtlIG9uIGxhbiBzdXBwb3J0IChFcmlrIEdpbGxpbmcpCisJCSogTVhETUEgZml4ZXMgZm9yIHNlcnZlcndvcmtzCisJCSogRUVQUk9NIHJlbG9hZAorCisJdmVyc2lvbiAxLjAuOSAoTWFuZnJlZCBTcHJhdWwpCisJCSogTWFpbiBjaGFuZ2U6IGZpeCBsYWNrIG9mIHN5bmNocm9uaXplCisJCW5ldGlmX2Nsb3NlL25ldGlmX3N1c3BlbmQgYWdhaW5zdCBhIGxhc3QgaW50ZXJydXB0CisJCW9yIHBhY2tldC4KKwkJKiBkbyBub3QgZW5hYmxlIHN1cGVyZmxvdXMgaW50ZXJydXB0cyAoZS5nLiB0aGUKKwkJZHJpdmVycyByZWxpZXMgb24gVHhEb25lIC0gVHhJbnRyIG5vdCBuZWVkZWQpCisJCSogd2FpdCB0aGF0IHRoZSBoYXJkd2FyZSBoYXMgcmVhbGx5IHN0b3BwZWQgaW4gY2xvc2UKKwkJYW5kIHN1c3BlbmQuCisJCSogd29ya2Fyb3VuZCBmb3IgdGhlIChhdCBsZWFzdCkgZ2NjLTIuOTUuMSBjb21waWxlcgorCQlwcm9ibGVtLiBBbHNvIHNpbXBsaWZpZXMgdGhlIGNvZGUgYSBiaXQuCisJCSogZGlzYWJsZV9pcnEoKSBpbiB0eF90aW1lb3V0IC0gbmVlZGVkIHRvIHByb3RlY3QKKwkJYWdhaW5zdCByeCBpbnRlcnJ1cHRzLgorCQkqIHN0b3AgdGhlIG5pYyBiZWZvcmUgc3dpdGNoaW5nIGludG8gc2lsZW50IHJ4IG1vZGUKKwkJZm9yIHdvbCAocmVxdWlyZWQgYWNjb3JkaW5nIHRvIGRvY3UpLgorCisJdmVyc2lvbiAxLjAuMTA6CisJCSogdXNlIGxvbmcgZm9yIGVlX2FkZHIgKHZhcmlvdXMpCisJCSogcHJpbnQgcG9pbnRlcnMgcHJvcGVybHkgKERhdmVNKQorCQkqIGluY2x1ZGUgYXNtL2lycS5oICg/KQorCisJdmVyc2lvbiAxLjAuMTE6CisJCSogY2hlY2sgYW5kIHJlc2V0IGlmIFBIWSBlcnJvcnMgYXBwZWFyIChBZHJpYW4gU3VuKQorCQkqIFdvTCBjbGVhbnVwIChUaW0gSG9ja2luKQorCQkqIE1hZ2ljIG51bWJlciBjbGVhbnVwIChUaW0gSG9ja2luKQorCQkqIERvbid0IHJlbG9hZCBFRVBST00gb24gZXZlcnkgcmVzZXQgKFRpbSBIb2NraW4pCisJCSogU2F2ZSBhbmQgcmVzdG9yZSBFRVBST00gc3RhdGUgYWNyb3NzIHJlc2V0IChUaW0gSG9ja2luKQorCQkqIE1ESU8gQ2xlYW51cCAoVGltIEhvY2tpbikKKwkJKiBSZWZvcm1hdCByZWdpc3RlciBvZmZzZXRzL2JpdHMgKGpnYXJ6aWspCisKKwl2ZXJzaW9uIDEuMC4xMjoKKwkJKiBFVEhUT09MXyogZnVydGhlciBzdXBwb3J0IChUaW0gSG9ja2luKQorCisJdmVyc2lvbiAxLjAuMTM6CisJCSogRVRIVE9PTF9bR11FRVBST00gc3VwcG9ydCAoVGltIEhvY2tpbikKKworCXZlcnNpb24gMS4wLjEzOgorCQkqIGNyYyBjbGVhbnVwIChNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+KQorCisJdmVyc2lvbiAxLjAuMTQ6CisJCSogQ2xlYW51cCBzb21lIG1lc3NhZ2VzIGFuZCBhdXRvbmVnIGluIGV0aHRvb2wgKFRpbSBIb2NraW4pCisKKwl2ZXJzaW9uIDEuMC4xNToKKwkJKiBHZXQgcmlkIG9mIGNhYmxlX21hZ2ljIGZsYWcKKwkJKiB1c2UgbmV3IChOYXRpb25hbCBwcm92aWRlZCkgc29sdXRpb24gZm9yIGNhYmxlIG1hZ2ljIGlzc3VlCisKKwl2ZXJzaW9uIDEuMC4xNjoKKwkJKiBjYWxsIG5ldGRldl9yeCgpIGZvciBSeEVycm9ycyAoTWFuZnJlZCBTcHJhdWwpCisJCSogZm9ybWF0dGluZyBhbmQgY2xlYW51cHMKKwkJKiBjaGFuZ2Ugb3B0aW9ucyBhbmQgZnVsbF9kdXBsZXggYXJyYXlzIHRvIGJlIHplcm8KKwkJICBpbml0aWFsaXplZAorCQkqIGVuYWJsZSBvbmx5IHRoZSBXb0wgYW5kIFBIWSBpbnRlcnJ1cHRzIGluIHdvbCBtb2RlCisKKwl2ZXJzaW9uIDEuMC4xNzoKKwkJKiBvbmx5IGRvIGNhYmxlX21hZ2ljIG9uIDgzODE1IGFuZCBlYXJseSA4MzgxNiAoVGltIEhvY2tpbikKKwkJKiBjcmVhdGUgYSBmdW5jdGlvbiBmb3IgcnggcmVmaWxsIChNYW5mcmVkIFNwcmF1bCkKKwkJKiBjb21iaW5lIGRyYWluX3JpbmcgYW5kIGluaXRfcmluZyAoTWFuZnJlZCBTcHJhdWwpCisJCSogb29tIGhhbmRsaW5nIChNYW5mcmVkIFNwcmF1bCkKKwkJKiBoYW5kc19vZmYgaW5zdGVhZCBvZiBwbGF5aW5nIHdpdGggbmV0aWZfZGV2aWNlX3tkZSxhfXR0YWNoCisJCSAgKE1hbmZyZWQgU3ByYXVsKQorCQkqIGJlIHN1cmUgdG8gd3JpdGUgdGhlIE1BQyBiYWNrIHRvIHRoZSBjaGlwIChNYW5mcmVkIFNwcmF1bCkKKwkJKiBsZW5ndGhlbiBFRVBST00gdGltZW91dCwgYW5kIGFsd2F5cyB3YXJuIGFib3V0IHRpbWVvdXRzCisJCSAgKE1hbmZyZWQgU3ByYXVsKQorCQkqIGNvbW1lbnRzIHVwZGF0ZSAoTWFuZnJlZCkKKwkJKiBkbyB0aGUgcmlnaHQgdGhpbmcgb24gYSBwaHktcmVzZXQgKE1hbmZyZWQgYW5kIFRpbSkKKworCVRPRE86CisJKiBiaWcgZW5kaWFuIHN1cHBvcnQgd2l0aCBDRkc6QkVNIGluc3RlYWQgb2YgY3B1X3RvX2xlMzIKKwkqIHN1cHBvcnQgZm9yIGFuIGV4dGVybmFsIFBIWQorCSogTkFQSQorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4JLyogUHJvY2Vzc29yIHR5cGUgZm9yIGNhY2hlIGFsaWdubWVudC4gKi8KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBEUlZfTkFNRQkibmF0c2VtaSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMDcrTEsxLjAuMTciCisjZGVmaW5lIERSVl9SRUxEQVRFCSJTZXAgMjcsIDIwMDIiCisKKyNkZWZpbmUgUlhfT0ZGU0VUCTIKKworLyogVXBkYXRlZCB0byByZWNvbW1lbmRhdGlvbnMgaW4gcGNpLXNrZWxldG9uIHYyLjAzLiAqLworCisvKiBUaGUgdXNlci1jb25maWd1cmFibGUgdmFsdWVzLgorICAgVGhlc2UgbWF5IGJlIG1vZGlmaWVkIHdoZW4gYSBkcml2ZXIgbW9kdWxlIGlzIGxvYWRlZC4qLworCisjZGVmaW5lIE5BVFNFTUlfREVGX01TRwkJKE5FVElGX01TR19EUlYJCXwgXAorCQkJCSBORVRJRl9NU0dfTElOSwkJfCBcCisJCQkJIE5FVElGX01TR19XT0wJCXwgXAorCQkJCSBORVRJRl9NU0dfUlhfRVJSCXwgXAorCQkJCSBORVRJRl9NU0dfVFhfRVJSKQorc3RhdGljIGludCBkZWJ1ZyA9IC0xOworCisvKiBNYXhpbXVtIGV2ZW50cyAoUnggcGFja2V0cywgZXRjLikgdG8gaGFuZGxlIGF0IGVhY2ggaW50ZXJydXB0LiAqLworc3RhdGljIGludCBtYXhfaW50ZXJydXB0X3dvcmsgPSAyMDsKK3N0YXRpYyBpbnQgbXR1OworCisvKiBNYXhpbXVtIG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIGZpbHRlciAodnMuIHJ4LWFsbC1tdWx0aWNhc3QpLgorICAgVGhpcyBjaGlwIHVzZXMgYSA1MTIgZWxlbWVudCBoYXNoIHRhYmxlIGJhc2VkIG9uIHRoZSBFdGhlcm5ldCBDUkMuICAqLworc3RhdGljIGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gMTAwOworCisvKiBTZXQgdGhlIGNvcHkgYnJlYWtwb2ludCBmb3IgdGhlIGNvcHktb25seS10aW55LWZyYW1lcyBzY2hlbWUuCisgICBTZXR0aW5nIHRvID4gMTUxOCBlZmZlY3RpdmVseSBkaXNhYmxlcyB0aGlzIGZlYXR1cmUuICovCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhazsKKworLyogVXNlZCB0byBwYXNzIHRoZSBtZWRpYSB0eXBlLCBldGMuCisgICBCb3RoICdvcHRpb25zW10nIGFuZCAnZnVsbF9kdXBsZXhbXScgc2hvdWxkIGV4aXN0IGZvciBkcml2ZXIKKyAgIGludGVyb3BlcmFiaWxpdHkuCisgICBUaGUgbWVkaWEgdHlwZSBpcyB1c3VhbGx5IHBhc3NlZCBpbiAnb3B0aW9uc1tdJy4KKyovCisjZGVmaW5lIE1BWF9VTklUUyA4CQkvKiBNb3JlIGFyZSBzdXBwb3J0ZWQsIGxpbWl0IG9ubHkgb24gb3B0aW9ucyAqLworc3RhdGljIGludCBvcHRpb25zW01BWF9VTklUU107CitzdGF0aWMgaW50IGZ1bGxfZHVwbGV4W01BWF9VTklUU107CisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCBhcmUgc2V0IGF0IGNvbXBpbGUgdGltZS4gKi8KKworLyogS2VlcCB0aGUgcmluZyBzaXplcyBhIHBvd2VyIG9mIHR3byBmb3IgY29tcGlsZSBlZmZpY2llbmN5LgorICAgVGhlIGNvbXBpbGVyIHdpbGwgY29udmVydCA8dW5zaWduZWQ+JyUnPDJeTj4gaW50byBhIGJpdCBtYXNrLgorICAgTWFraW5nIHRoZSBUeCByaW5nIHRvbyBsYXJnZSBkZWNyZWFzZXMgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgY2hhbm5lbAorICAgYm9uZGluZyBhbmQgcGFja2V0IHByaW9yaXR5LgorICAgVGhlcmUgYXJlIG5vIGlsbCBlZmZlY3RzIGZyb20gdG9vLWxhcmdlIHJlY2VpdmUgcmluZ3MuICovCisjZGVmaW5lIFRYX1JJTkdfU0laRQkxNgorI2RlZmluZSBUWF9RVUVVRV9MRU4JMTAgLyogTGltaXQgcmluZyBlbnRyaWVzIGFjdHVhbGx5IHVzZWQsIG1pbiA0LiAqLworI2RlZmluZSBSWF9SSU5HX1NJWkUJMzIKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAoMipIWikKKworI2RlZmluZSBOQVRTRU1JX0hXX1RJTUVPVVQJNDAwCisjZGVmaW5lIE5BVFNFTUlfVElNRVJfRlJFUQkzKkhaCisjZGVmaW5lIE5BVFNFTUlfUEcwX05SRUdTCTY0CisjZGVmaW5lIE5BVFNFTUlfUkZEUl9OUkVHUwk4CisjZGVmaW5lIE5BVFNFTUlfUEcxX05SRUdTCTQKKyNkZWZpbmUgTkFUU0VNSV9OUkVHUwkJKE5BVFNFTUlfUEcwX05SRUdTICsgTkFUU0VNSV9SRkRSX05SRUdTICsgXAorCQkJCSBOQVRTRU1JX1BHMV9OUkVHUykKKyNkZWZpbmUgTkFUU0VNSV9SRUdTX1ZFUgkxIC8qIHYxIGFkZGVkIFJGRFIgcmVnaXN0ZXJzICovCisjZGVmaW5lIE5BVFNFTUlfUkVHU19TSVpFCShOQVRTRU1JX05SRUdTICogc2l6ZW9mKHUzMikpCisjZGVmaW5lIE5BVFNFTUlfRUVQUk9NX1NJWkUJMjQgLyogMTIgMTYtYml0IHZhbHVlcyAqLworCisvKiBCdWZmZXIgc2l6ZXM6CisgKiBUaGUgbmljIHdyaXRlcyAzMi1iaXQgdmFsdWVzLCBldmVuIGlmIHRoZSB1cHBlciBieXRlcyBvZgorICogYSAzMi1iaXQgdmFsdWUgYXJlIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisgKi8KKyNkZWZpbmUgTkFUU0VNSV9IRUFERVJTCQkyMgkvKiAyKm1hYyx0eXBlLHZsYW4sY3JjICovCisjZGVmaW5lIE5BVFNFTUlfUEFERElORwkJMTYJLyogMiBieXRlcyBzaG91bGQgYmUgc3VmZmljaWVudCAqLworI2RlZmluZSBOQVRTRU1JX0xPTkdQS1QJCTE1MTgJLyogbGltaXQgZm9yIG5vcm1hbCBwYWNrZXRzICovCisjZGVmaW5lIE5BVFNFTUlfUlhfTElNSVQJMjA0NgkvKiBtYXhpbXVtIHN1cHBvcnRlZCBieSBoYXJkd2FyZSAqLworCisvKiBUaGVzZSBpZGVudGlmeSB0aGUgZHJpdmVyIGJhc2UgdmVyc2lvbiBhbmQgbWF5IG5vdCBiZSByZW1vdmVkLiAqLworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorICBLRVJOX0lORk8gRFJWX05BTUUgIiBkcDgzODF4IGRyaXZlciwgdmVyc2lvbiAiCisgICAgICBEUlZfVkVSU0lPTiAiLCAiIERSVl9SRUxEQVRFICJcbiIKKyAgS0VSTl9JTkZPICIgIG9yaWdpbmFsbHkgYnkgRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT5cbiIKKyAgS0VSTl9JTkZPICIgIGh0dHA6Ly93d3cuc2N5bGQuY29tL25ldHdvcmsvbmF0c2VtaS5odG1sXG4iCisgIEtFUk5fSU5GTyAiICAyLjQueCBrZXJuZWwgcG9ydCBieSBKZWZmIEdhcnppaywgVGplZXJkIE11bGRlclxuIjsKKworTU9EVUxFX0FVVEhPUigiRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBEUDgzODF4IHNlcmllcyBQQ0kgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShtYXhfaW50ZXJydXB0X3dvcmssIGludCwgMCk7Cittb2R1bGVfcGFyYW0obXR1LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJ4X2NvcHlicmVhaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShvcHRpb25zLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGZ1bGxfZHVwbGV4LCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfaW50ZXJydXB0X3dvcmssIAorCSJEUDgzODF4IG1heGltdW0gZXZlbnRzIGhhbmRsZWQgcGVyIGludGVycnVwdCIpOworTU9EVUxFX1BBUk1fREVTQyhtdHUsICJEUDgzODF4IE1UVSAoYWxsIGJvYXJkcykiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEUDgzODF4IGRlZmF1bHQgZGVidWcgbGV2ZWwiKTsKK01PRFVMRV9QQVJNX0RFU0MocnhfY29weWJyZWFrLCAKKwkiRFA4MzgxeCBjb3B5IGJyZWFrcG9pbnQgZm9yIGNvcHktb25seS10aW55LWZyYW1lcyIpOworTU9EVUxFX1BBUk1fREVTQyhvcHRpb25zLCAKKwkiRFA4MzgxeDogQml0cyAwLTM6IG1lZGlhIHR5cGUsIGJpdCAxNzogZnVsbCBkdXBsZXgiKTsKK01PRFVMRV9QQVJNX0RFU0MoZnVsbF9kdXBsZXgsICJEUDgzODF4IGZ1bGwgZHVwbGV4IHNldHRpbmcocykgKDEpIik7CisKKy8qCisJCQkJVGhlb3J5IG9mIE9wZXJhdGlvbgorCitJLiBCb2FyZCBDb21wYXRpYmlsaXR5CisKK1RoaXMgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIERQODM4MTUgUENJIEV0aGVybmV0IE5JQy4KK0l0IGFsc28gd29ya3Mgd2l0aCBvdGhlciBjaGlwcyBpbiBpbiB0aGUgRFA4MzgxMCBzZXJpZXMuCisKK0lJLiBCb2FyZC1zcGVjaWZpYyBzZXR0aW5ncworCitUaGlzIGRyaXZlciByZXF1aXJlcyB0aGUgUENJIGludGVycnVwdCBsaW5lIHRvIGJlIHZhbGlkLgorSXQgaG9ub3JzIHRoZSBFRVBST00tc2V0IHZhbHVlcy4KKworSUlJLiBEcml2ZXIgb3BlcmF0aW9uCisKK0lJSWEuIFJpbmcgYnVmZmVycworCitUaGlzIGRyaXZlciB1c2VzIHR3byBzdGF0aWNhbGx5IGFsbG9jYXRlZCBmaXhlZC1zaXplIGRlc2NyaXB0b3IgbGlzdHMKK2Zvcm1lZCBpbnRvIHJpbmdzIGJ5IGEgYnJhbmNoIGZyb20gdGhlIGZpbmFsIGRlc2NyaXB0b3IgdG8gdGhlIGJlZ2lubmluZyBvZgordGhlIGxpc3QuICBUaGUgcmluZyBzaXplcyBhcmUgc2V0IGF0IGNvbXBpbGUgdGltZSBieSBSWC9UWF9SSU5HX1NJWkUuCitUaGUgTmF0U2VtaSBkZXNpZ24gdXNlcyBhICduZXh0IGRlc2NyaXB0b3InIHBvaW50ZXIgdGhhdCB0aGUgZHJpdmVyIGZvcm1zCitpbnRvIGEgbGlzdC4KKworSUlJYi9jLiBUcmFuc21pdC9SZWNlaXZlIFN0cnVjdHVyZQorCitUaGlzIGRyaXZlciB1c2VzIGEgemVyby1jb3B5IHJlY2VpdmUgYW5kIHRyYW5zbWl0IHNjaGVtZS4KK1RoZSBkcml2ZXIgYWxsb2NhdGVzIGZ1bGwgZnJhbWUgc2l6ZSBza2J1ZmZzIGZvciB0aGUgUnggcmluZyBidWZmZXJzIGF0CitvcGVuKCkgdGltZSBhbmQgcGFzc2VzIHRoZSBza2ItPmRhdGEgZmllbGQgdG8gdGhlIGNoaXAgYXMgcmVjZWl2ZSBkYXRhCitidWZmZXJzLiAgV2hlbiBhbiBpbmNvbWluZyBmcmFtZSBpcyBsZXNzIHRoYW4gUlhfQ09QWUJSRUFLIGJ5dGVzIGxvbmcsCithIGZyZXNoIHNrYnVmZiBpcyBhbGxvY2F0ZWQgYW5kIHRoZSBmcmFtZSBpcyBjb3BpZWQgdG8gdGhlIG5ldyBza2J1ZmYuCitXaGVuIHRoZSBpbmNvbWluZyBmcmFtZSBpcyBsYXJnZXIsIHRoZSBza2J1ZmYgaXMgcGFzc2VkIGRpcmVjdGx5IHVwIHRoZQorcHJvdG9jb2wgc3RhY2suICBCdWZmZXJzIGNvbnN1bWVkIHRoaXMgd2F5IGFyZSByZXBsYWNlZCBieSBuZXdseSBhbGxvY2F0ZWQKK3NrYnVmZnMgaW4gYSBsYXRlciBwaGFzZSBvZiByZWNlaXZlcy4KKworVGhlIFJYX0NPUFlCUkVBSyB2YWx1ZSBpcyBjaG9zZW4gdG8gdHJhZGUtb2ZmIHRoZSBtZW1vcnkgd2FzdGVkIGJ5Cit1c2luZyBhIGZ1bGwtc2l6ZWQgc2tidWZmIGZvciBzbWFsbCBmcmFtZXMgdnMuIHRoZSBjb3B5aW5nIGNvc3RzIG9mIGxhcmdlcgorZnJhbWVzLiAgTmV3IGJvYXJkcyBhcmUgdHlwaWNhbGx5IHVzZWQgaW4gZ2VuZXJvdXNseSBjb25maWd1cmVkIG1hY2hpbmVzCithbmQgdGhlIHVuZGVyZmlsbGVkIGJ1ZmZlcnMgaGF2ZSBuZWdsaWdpYmxlIGltcGFjdCBjb21wYXJlZCB0byB0aGUgYmVuZWZpdCBvZgorYSBzaW5nbGUgYWxsb2NhdGlvbiBzaXplLCBzbyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB6ZXJvIHJlc3VsdHMgaW4gbmV2ZXIKK2NvcHlpbmcgcGFja2V0cy4gIFdoZW4gY29weWluZyBpcyBkb25lLCB0aGUgY29zdCBpcyB1c3VhbGx5IG1pdGlnYXRlZCBieSB1c2luZworYSBjb21iaW5lZCBjb3B5L2NoZWNrc3VtIHJvdXRpbmUuICBDb3B5aW5nIGFsc28gcHJlbG9hZHMgdGhlIGNhY2hlLCB3aGljaCBpcworbW9zdCB1c2VmdWwgd2l0aCBzbWFsbCBmcmFtZXMuCisKK0Egc3VidGxlIGFzcGVjdCBvZiB0aGUgb3BlcmF0aW9uIGlzIHRoYXQgdW5hbGlnbmVkIGJ1ZmZlcnMgYXJlIG5vdCBwZXJtaXR0ZWQKK2J5IHRoZSBoYXJkd2FyZS4gIFRodXMgdGhlIElQIGhlYWRlciBhdCBvZmZzZXQgMTQgaW4gYW4gZXRoZXJuZXQgZnJhbWUgaXNuJ3QKK2xvbmd3b3JkIGFsaWduZWQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gIE9uIGNvcGllcyBmcmFtZXMgYXJlIHB1dCBpbnRvIHRoZQorc2tidWZmIGF0IGFuIG9mZnNldCBvZiAiKzIiLCAxNi1ieXRlIGFsaWduaW5nIHRoZSBJUCBoZWFkZXIuCisKK0lJSWQuIFN5bmNocm9uaXphdGlvbgorCitNb3N0IG9wZXJhdGlvbnMgYXJlIHN5bmNocm9uaXplZCBvbiB0aGUgbnAtPmxvY2sgaXJxIHNwaW5sb2NrLCBleGNlcHQgdGhlCitwZXJmb3JtYW5jZSBjcml0aWNhbCBjb2RlcGF0aHM6CisKK1RoZSByeCBwcm9jZXNzIG9ubHkgcnVucyBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIuIEFjY2VzcyBmcm9tIG91dHNpZGUKK3RoZSBpbnRlcnJ1cHQgaGFuZGxlciBpcyBvbmx5IHBlcm1pdHRlZCBhZnRlciBkaXNhYmxlX2lycSgpLgorCitUaGUgcnggcHJvY2VzcyB1c3VhbGx5IHJ1bnMgdW5kZXIgdGhlIGRldi0+eG1pdF9sb2NrLiBJZiBucC0+aW50cl90eF9yZWFwCitpcyBzZXQsIHRoZW4gYWNjZXNzIGlzIHBlcm1pdHRlZCB1bmRlciBzcGluX2xvY2tfaXJxKCZucC0+bG9jaykuCisKK1RodXMgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgdGhhdCB3YW50IHRvIGFjY2VzcyBldmVyeXRoaW5nIG11c3QgY2FsbAorCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlzcGluX2xvY2tfYmgoZGV2LT54bWl0X2xvY2spOworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKworSVYuIE5vdGVzCisKK05hdFNlbWkgUENJIG5ldHdvcmsgY29udHJvbGxlcnMgYXJlIHZlcnkgdW5jb21tb24uCisKK0lWYi4gUmVmZXJlbmNlcworCitodHRwOi8vd3d3LnNjeWxkLmNvbS9leHBlcnQvMTAwbWJwcy5odG1sCitodHRwOi8vd3d3LnNjeWxkLmNvbS9leHBlcnQvTldheS5odG1sCitEYXRhc2hlZXQgaXMgYXZhaWxhYmxlIGZyb206CitodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9wZi9EUC9EUDgzODE1Lmh0bWwKKworSVZjLiBFcnJhdGEKKworTm9uZSBjaGFyYWN0ZXJpc2VkLgorKi8KKworCisKK2VudW0gcGNpc3R1ZmYgeworCVBDSV9VU0VTX0lPID0gMHgwMSwKKwlQQ0lfVVNFU19NRU0gPSAweDAyLAorCVBDSV9VU0VTX01BU1RFUiA9IDB4MDQsCisJUENJX0FERFIwID0gMHgwOCwKKwlQQ0lfQUREUjEgPSAweDEwLAorfTsKKworLyogTU1JTyBvcGVyYXRpb25zIHJlcXVpcmVkICovCisjZGVmaW5lIFBDSV9JT1RZUEUgKFBDSV9VU0VTX01BU1RFUiB8IFBDSV9VU0VTX01FTSB8IFBDSV9BRERSMSkKKworCisvKgorICogU3VwcG9ydCBmb3IgZmlicmUgY29ubmVjdGlvbnMgb24gQW03OUM4NzQ6CisgKiBUaGlzIHBoeSBuZWVkcyBhIHNwZWNpYWwgc2V0dXAgd2hlbiBjb25uZWN0ZWQgdG8gYSBmaWJyZSBjYWJsZS4KKyAqIGh0dHA6Ly93d3cuYW1kLmNvbS9maWxlcy9jb25uZWN0aXZpdHlzb2x1dGlvbnMvbmV0d29ya2luZy9hcmNoaXZlZG5ldHdvcmtpbmcvMjIyMzUucGRmCisgKi8KKyNkZWZpbmUgUEhZSURfQU03OUM4NzQJMHgwMDIyNTYxYgorCisjZGVmaW5lIE1JSV9NQ1RSTAkweDE1CS8qIG1vZGUgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBNSUlfRlhfU0VMCTB4MDAwMQkvKiAxMDBCQVNFLUZYIChmaWJlcikgKi8KKyNkZWZpbmUgTUlJX0VOX1NDUk0JMHgwMDA0CS8qIGVuYWJsZSBzY3JhbWJsZXIgKHRwKSAqLworCisgCisvKiBhcnJheSBvZiBib2FyZCBkYXRhIGRpcmVjdGx5IGluZGV4ZWQgYnkgcGNpX3RibFt4XS5kcml2ZXJfZGF0YSAqLworc3RhdGljIHN0cnVjdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworfSBuYXRzZW1pX3BjaV9pbmZvW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7ICJOYXRTZW1pIERQODM4MVs1Nl0iLCBQQ0lfSU9UWVBFIH0sCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgbmF0c2VtaV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX05TLCBQQ0lfREVWSUNFX0lEX05TXzgzODE1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgMCwgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbmF0c2VtaV9wY2lfdGJsKTsKKworLyogT2Zmc2V0cyB0byB0aGUgZGV2aWNlIHJlZ2lzdGVycy4KKyAgIFVubGlrZSBzb2Z0d2FyZS1vbmx5IHN5c3RlbXMsIGRldmljZSBkcml2ZXJzIGludGVyYWN0IHdpdGggY29tcGxleCBoYXJkd2FyZS4KKyAgIEl0J3Mgbm90IHVzZWZ1bCB0byBkZWZpbmUgc3ltYm9saWMgbmFtZXMgZm9yIGV2ZXJ5IHJlZ2lzdGVyIGJpdCBpbiB0aGUKKyAgIGRldmljZS4KKyovCitlbnVtIHJlZ2lzdGVyX29mZnNldHMgeworCUNoaXBDbWQJCQk9IDB4MDAsCisJQ2hpcENvbmZpZwkJPSAweDA0LAorCUVFQ3RybAkJCT0gMHgwOCwKKwlQQ0lCdXNDZmcJCT0gMHgwQywKKwlJbnRyU3RhdHVzCQk9IDB4MTAsCisJSW50ck1hc2sJCT0gMHgxNCwKKwlJbnRyRW5hYmxlCQk9IDB4MTgsCisJSW50ckhvbGRvZmYJCT0gMHgxQywgLyogRFA4MzgxNiBvbmx5ICovCisJVHhSaW5nUHRyCQk9IDB4MjAsCisJVHhDb25maWcJCT0gMHgyNCwKKwlSeFJpbmdQdHIJCT0gMHgzMCwKKwlSeENvbmZpZwkJPSAweDM0LAorCUNsa1J1bgkJCT0gMHgzQywKKwlXT0xDbWQJCQk9IDB4NDAsCisJUGF1c2VDbWQJCT0gMHg0NCwKKwlSeEZpbHRlckFkZHIJCT0gMHg0OCwKKwlSeEZpbHRlckRhdGEJCT0gMHg0QywKKwlCb290Um9tQWRkcgkJPSAweDUwLAorCUJvb3RSb21EYXRhCQk9IDB4NTQsCisJU2lsaWNvblJldgkJPSAweDU4LAorCVN0YXRzQ3RybAkJPSAweDVDLAorCVN0YXRzRGF0YQkJPSAweDYwLAorCVJ4UGt0RXJycwkJPSAweDYwLAorCVJ4TWlzc2VkCQk9IDB4NjgsCisJUnhDUkNFcnJzCQk9IDB4NjQsCisJQmFzaWNDb250cm9sCQk9IDB4ODAsCisJQmFzaWNTdGF0dXMJCT0gMHg4NCwKKwlBbmVnQWR2CQkJPSAweDkwLAorCUFuZWdQZWVyCQk9IDB4OTQsCisJUGh5U3RhdHVzCQk9IDB4QzAsCisJTUludHJDdHJsCQk9IDB4QzQsCisJTUludHJTdGF0dXMJCT0gMHhDOCwKKwlQaHlDdHJsCQkJPSAweEU0LAorCisJLyogVGhlc2UgYXJlIGZyb20gdGhlIHNwZWMsIGFyb3VuZCBwYWdlIDc4Li4uIG9uIGEgc2VwYXJhdGUgdGFibGUuCisJICogVGhlIG1lYW5pbmcgb2YgdGhlc2UgcmVnaXN0ZXJzIGRlcGVuZCBvbiB0aGUgdmFsdWUgb2YgUEdTRUwuICovCisJUEdTRUwJCQk9IDB4Q0MsCisJUE1EQ1NSCQkJPSAweEU0LAorCVRTVERBVAkJCT0gMHhGQywKKwlEU1BDRkcJCQk9IDB4RjQsCisJU0RDRkcJCQk9IDB4RjgKK307CisvKiB0aGUgdmFsdWVzIGZvciB0aGUgJ21hZ2ljJyByZWdpc3RlcnMgYWJvdmUgKFBHU0VMPTEpICovCisjZGVmaW5lIFBNRENTUl9WQUwJMHgxODljCS8qIGVuYWJsZSBwcmVmZXJyZWQgYWRhcHRhdGlvbiBjaXJjdWl0cnkgKi8KKyNkZWZpbmUgVFNUREFUX1ZBTAkweDAKKyNkZWZpbmUgRFNQQ0ZHX1ZBTAkweDUwNDAKKyNkZWZpbmUgU0RDRkdfVkFMCTB4MDA4YwkvKiBzZXQgdm9sdGFnZSB0aHJlc2hvbGRzIGZvciBTaWduYWwgRGV0ZWN0ICovCisjZGVmaW5lIERTUENGR19MT0NLCTB4MjAJLyogY29lZmZpY2llbnQgbG9jayBiaXQgaW4gRFNQQ0ZHICovCisjZGVmaW5lIERTUENGR19DT0VGCTB4MTAwMAkvKiBzZWUgY29lZmZpY2llbnQgKGluIFRTVERBVCkgYml0IGluIERTUENGRyAqLworI2RlZmluZSBUU1REQVRfRklYRUQJMHhlOAkvKiBtYWdpYyBudW1iZXIgZm9yIGJhZCBjb2VmZmljaWVudHMgKi8KKworLyogbWlzYyBQQ0kgc3BhY2UgcmVnaXN0ZXJzICovCitlbnVtIHBjaV9yZWdpc3Rlcl9vZmZzZXRzIHsKKwlQQ0lQTQkJCT0gMHg0NCwKK307CisKK2VudW0gQ2hpcENtZF9iaXRzIHsKKwlDaGlwUmVzZXQJCT0gMHgxMDAsCisJUnhSZXNldAkJCT0gMHgyMCwKKwlUeFJlc2V0CQkJPSAweDEwLAorCVJ4T2ZmCQkJPSAweDA4LAorCVJ4T24JCQk9IDB4MDQsCisJVHhPZmYJCQk9IDB4MDIsCisJVHhPbgkJCT0gMHgwMSwKK307CisKK2VudW0gQ2hpcENvbmZpZ19iaXRzIHsKKwlDZmdQaHlEaXMJCT0gMHgyMDAsCisJQ2ZnUGh5UnN0CQk9IDB4NDAwLAorCUNmZ0V4dFBoeQkJPSAweDEwMDAsCisJQ2ZnQW5lZ0VuYWJsZQkJPSAweDIwMDAsCisJQ2ZnQW5lZzEwMAkJPSAweDQwMDAsCisJQ2ZnQW5lZ0Z1bGwJCT0gMHg4MDAwLAorCUNmZ0FuZWdEb25lCQk9IDB4ODAwMDAwMCwKKwlDZmdGdWxsRHVwbGV4CQk9IDB4MjAwMDAwMDAsCisJQ2ZnU3BlZWQxMDAJCT0gMHg0MDAwMDAwMCwKKwlDZmdMaW5rCQkJPSAweDgwMDAwMDAwLAorfTsKKworZW51bSBFRUN0cmxfYml0cyB7CisJRUVfU2hpZnRDbGsJCT0gMHgwNCwKKwlFRV9EYXRhSW4JCT0gMHgwMSwKKwlFRV9DaGlwU2VsZWN0CQk9IDB4MDgsCisJRUVfRGF0YU91dAkJPSAweDAyLAorCU1JSV9EYXRhIAkJPSAweDEwLAorCU1JSV9Xcml0ZQkJPSAweDIwLAorCU1JSV9TaGlmdENsawkJPSAweDQwLAorfTsKKworZW51bSBQQ0lCdXNDZmdfYml0cyB7CisJRWVwcm9tUmVsb2FkCQk9IDB4NCwKK307CisKKy8qIEJpdHMgaW4gdGhlIGludGVycnVwdCBzdGF0dXMvbWFzayByZWdpc3RlcnMuICovCitlbnVtIEludHJTdGF0dXNfYml0cyB7CisJSW50clJ4RG9uZQkJPSAweDAwMDEsCisJSW50clJ4SW50cgkJPSAweDAwMDIsCisJSW50clJ4RXJyCQk9IDB4MDAwNCwKKwlJbnRyUnhFYXJseQkJPSAweDAwMDgsCisJSW50clJ4SWRsZQkJPSAweDAwMTAsCisJSW50clJ4T3ZlcnJ1bgkJPSAweDAwMjAsCisJSW50clR4RG9uZQkJPSAweDAwNDAsCisJSW50clR4SW50cgkJPSAweDAwODAsCisJSW50clR4RXJyCQk9IDB4MDEwMCwKKwlJbnRyVHhJZGxlCQk9IDB4MDIwMCwKKwlJbnRyVHhVbmRlcnJ1bgkJPSAweDA0MDAsCisJU3RhdHNNYXgJCT0gMHgwODAwLAorCVNXSW50CQkJPSAweDEwMDAsCisJV09MUGt0CQkJPSAweDIwMDAsCisJTGlua0NoYW5nZQkJPSAweDQwMDAsCisJSW50ckhpZ2hCaXRzCQk9IDB4ODAwMCwKKwlSeFN0YXR1c0ZJRk9PdmVyCT0gMHgxMDAwMCwKKwlJbnRyUENJRXJyCQk9IDB4ZjAwMDAwLAorCVJ4UmVzZXREb25lCQk9IDB4MTAwMDAwMCwKKwlUeFJlc2V0RG9uZQkJPSAweDIwMDAwMDAsCisJSW50ckFibm9ybWFsU3VtbWFyeQk9IDB4Q0QyMCwKK307CisKKy8qCisgKiBEZWZhdWx0IEludGVycnVwdHM6CisgKiBSeCBPSywgUnggUGFja2V0IEVycm9yLCBSeCBPdmVycnVuLAorICogVHggT0ssIFR4IFBhY2tldCBFcnJvciwgVHggVW5kZXJydW4sCisgKiBNSUIgU2VydmljZSwgUGh5IEludGVycnVwdCwgSGlnaCBCaXRzLAorICogUnggU3RhdHVzIEZJRk8gb3ZlcnJ1biwKKyAqIFJlY2VpdmVkIFRhcmdldCBBYm9ydCwgUmVjZWl2ZWQgTWFzdGVyIEFib3J0LAorICogU2lnbmFsbGVkIFN5c3RlbSBFcnJvciwgUmVjZWl2ZWQgUGFyaXR5IEVycm9yCisgKi8KKyNkZWZpbmUgREVGQVVMVF9JTlRSIDB4MDBmMWNkNjUKKworZW51bSBUeENvbmZpZ19iaXRzIHsKKwlUeERydGhNYXNrCQk9IDB4M2YsCisJVHhGbHRoTWFzawkJPSAweDNmMDAsCisJVHhNeGRtYU1hc2sJCT0gMHg3MDAwMDAsCisJVHhNeGRtYV81MTIJCT0gMHgwLAorCVR4TXhkbWFfNAkJPSAweDEwMDAwMCwKKwlUeE14ZG1hXzgJCT0gMHgyMDAwMDAsCisJVHhNeGRtYV8xNgkJPSAweDMwMDAwMCwKKwlUeE14ZG1hXzMyCQk9IDB4NDAwMDAwLAorCVR4TXhkbWFfNjQJCT0gMHg1MDAwMDAsCisJVHhNeGRtYV8xMjgJCT0gMHg2MDAwMDAsCisJVHhNeGRtYV8yNTYJCT0gMHg3MDAwMDAsCisJVHhDb2xsUmV0cnkJCT0gMHg4MDAwMDAsCisJVHhBdXRvUGFkCQk9IDB4MTAwMDAwMDAsCisJVHhNYWNMb29wCQk9IDB4MjAwMDAwMDAsCisJVHhIZWFydElnbgkJPSAweDQwMDAwMDAwLAorCVR4Q2FycmllcklnbgkJPSAweDgwMDAwMDAwCit9OworCisvKiAKKyAqIFR4IENvbmZpZ3VyYXRpb246CisgKiAtIDI1NiBieXRlIERNQSBidXJzdCBsZW5ndGgKKyAqIC0gZmlsbCB0aHJlc2hvbGQgNTEyIGJ5dGVzIChpLmUuIHJlc3RhcnQgRE1BIHdoZW4gNTEyIGJ5dGVzIGFyZSBmcmVlKQorICogLSA2NCBieXRlcyBpbml0aWFsIGRyYWluIHRocmVzaG9sZCAoaS5lLiBiZWdpbiBhY3R1YWwgdHJhbnNtaXNzaW9uCisgKiAgIHdoZW4gNjQgYnl0ZSBhcmUgaW4gdGhlIGZpZm8pCisgKiAtIG9uIHR4IHVuZGVycnVucywgaW5jcmVhc2UgZHJhaW4gdGhyZXNob2xkIGJ5IDY0LgorICogLSBhdCBtb3N0IHVzZSBhIGRyYWluIHRocmVzaG9sZCBvZiAxNDcyIGJ5dGVzOiBUaGUgc3VtIG9mIHRoZSBmaWxsCisgKiAgIHRocmVzaG9sZCBhbmQgdGhlIGRyYWluIHRocmVzaG9sZCBtdXN0IGJlIGxlc3MgdGhhbiAyMDE2IGJ5dGVzLgorICoKKyAqLworI2RlZmluZSBUWF9GTFRIX1ZBTAkJKCg1MTIvMzIpIDw8IDgpCisjZGVmaW5lIFRYX0RSVEhfVkFMX1NUQVJUCSg2NC8zMikKKyNkZWZpbmUgVFhfRFJUSF9WQUxfSU5DCQkyCisjZGVmaW5lIFRYX0RSVEhfVkFMX0xJTUlUCSgxNDcyLzMyKQorCitlbnVtIFJ4Q29uZmlnX2JpdHMgeworCVJ4RHJ0aE1hc2sJCT0gMHgzZSwKKwlSeE14ZG1hTWFzawkJPSAweDcwMDAwMCwKKwlSeE14ZG1hXzUxMgkJPSAweDAsCisJUnhNeGRtYV80CQk9IDB4MTAwMDAwLAorCVJ4TXhkbWFfOAkJPSAweDIwMDAwMCwKKwlSeE14ZG1hXzE2CQk9IDB4MzAwMDAwLAorCVJ4TXhkbWFfMzIJCT0gMHg0MDAwMDAsCisJUnhNeGRtYV82NAkJPSAweDUwMDAwMCwKKwlSeE14ZG1hXzEyOAkJPSAweDYwMDAwMCwKKwlSeE14ZG1hXzI1NgkJPSAweDcwMDAwMCwKKwlSeEFjY2VwdExvbmcJCT0gMHg4MDAwMDAwLAorCVJ4QWNjZXB0VHgJCT0gMHgxMDAwMDAwMCwKKwlSeEFjY2VwdFJ1bnQJCT0gMHg0MDAwMDAwMCwKKwlSeEFjY2VwdEVycgkJPSAweDgwMDAwMDAwCit9OworI2RlZmluZSBSWF9EUlRIX1ZBTAkJKDEyOC84KQorCitlbnVtIENsa1J1bl9iaXRzIHsKKwlQTUVFbmFibGUJCT0gMHgxMDAsCisJUE1FU3RhdHVzCQk9IDB4ODAwMCwKK307CisKK2VudW0gV29sQ21kX2JpdHMgeworCVdha2VQaHkJCQk9IDB4MSwKKwlXYWtlVW5pY2FzdAkJPSAweDIsCisJV2FrZU11bHRpY2FzdAkJPSAweDQsCisJV2FrZUJyb2FkY2FzdAkJPSAweDgsCisJV2FrZUFycAkJCT0gMHgxMCwKKwlXYWtlUE1hdGNoMAkJPSAweDIwLAorCVdha2VQTWF0Y2gxCQk9IDB4NDAsCisJV2FrZVBNYXRjaDIJCT0gMHg4MCwKKwlXYWtlUE1hdGNoMwkJPSAweDEwMCwKKwlXYWtlTWFnaWMJCT0gMHgyMDAsCisJV2FrZU1hZ2ljU2VjdXJlCQk9IDB4NDAwLAorCVNlY3VyZUhhY2sJCT0gMHgxMDAwMDAsCisJV29rZVBoeQkJCT0gMHg0MDAwMDAsCisJV29rZVVuaWNhc3QJCT0gMHg4MDAwMDAsCisJV29rZU11bHRpY2FzdAkJPSAweDEwMDAwMDAsCisJV29rZUJyb2FkY2FzdAkJPSAweDIwMDAwMDAsCisJV29rZUFycAkJCT0gMHg0MDAwMDAwLAorCVdva2VQTWF0Y2gwCQk9IDB4ODAwMDAwMCwKKwlXb2tlUE1hdGNoMQkJPSAweDEwMDAwMDAwLAorCVdva2VQTWF0Y2gyCQk9IDB4MjAwMDAwMDAsCisJV29rZVBNYXRjaDMJCT0gMHg0MDAwMDAwMCwKKwlXb2tlTWFnaWMJCT0gMHg4MDAwMDAwMCwKKwlXYWtlT3B0c1N1bW1hcnkJCT0gMHg3ZmYKK307CisKK2VudW0gUnhGaWx0ZXJBZGRyX2JpdHMgeworCVJGQ1JBZGRyZXNzTWFzawkJPSAweDNmZiwKKwlBY2NlcHRNdWx0aWNhc3QJCT0gMHgwMDIwMDAwMCwKKwlBY2NlcHRNeVBoeXMJCT0gMHgwODAwMDAwMCwKKwlBY2NlcHRBbGxQaHlzCQk9IDB4MTAwMDAwMDAsCisJQWNjZXB0QWxsTXVsdGljYXN0CT0gMHgyMDAwMDAwMCwKKwlBY2NlcHRCcm9hZGNhc3QJCT0gMHg0MDAwMDAwMCwKKwlSeEZpbHRlckVuYWJsZQkJPSAweDgwMDAwMDAwCit9OworCitlbnVtIFN0YXRzQ3RybF9iaXRzIHsKKwlTdGF0c1dhcm4JCT0gMHgxLAorCVN0YXRzRnJlZXplCQk9IDB4MiwKKwlTdGF0c0NsZWFyCQk9IDB4NCwKKwlTdGF0c1N0cm9iZQkJPSAweDgsCit9OworCitlbnVtIE1JbnRyQ3RybF9iaXRzIHsKKwlNSUNSSW50RW4JCT0gMHgyLAorfTsKKworZW51bSBQaHlDdHJsX2JpdHMgeworCVBoeUFkZHJNYXNrCQk9IDB4MWYsCit9OworCisjZGVmaW5lIFBIWV9BRERSX05PTkUJCTMyCisjZGVmaW5lIFBIWV9BRERSX0lOVEVSTkFMCTEKKworLyogdmFsdWVzIHdlIG1pZ2h0IGZpbmQgaW4gdGhlIHNpbGljb24gcmV2aXNpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU1JSX0RQODM4MTVfQwkweDAzMDIKKyNkZWZpbmUgU1JSX0RQODM4MTVfRAkweDA0MDMKKyNkZWZpbmUgU1JSX0RQODM4MTZfQTQJMHgwNTA0CisjZGVmaW5lIFNSUl9EUDgzODE2X0E1CTB4MDUwNQorCisvKiBUaGUgUnggYW5kIFR4IGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KKy8qIE5vdGUgdGhhdCB1c2luZyBvbmx5IDMyIGJpdCBmaWVsZHMgc2ltcGxpZmllcyBjb252ZXJzaW9uIHRvIGJpZy1lbmRpYW4KKyAgIGFyY2hpdGVjdHVyZXMuICovCitzdHJ1Y3QgbmV0ZGV2X2Rlc2MgeworCXUzMiBuZXh0X2Rlc2M7CisJczMyIGNtZF9zdGF0dXM7CisJdTMyIGFkZHI7CisJdTMyIHNvZnR3YXJlX3VzZTsKK307CisKKy8qIEJpdHMgaW4gbmV0d29ya19kZXNjLnN0YXR1cyAqLworZW51bSBkZXNjX3N0YXR1c19iaXRzIHsKKwlEZXNjT3duPTB4ODAwMDAwMDAsIERlc2NNb3JlPTB4NDAwMDAwMDAsIERlc2NJbnRyPTB4MjAwMDAwMDAsCisJRGVzY05vQ1JDPTB4MTAwMDAwMDAsIERlc2NQa3RPSz0weDA4MDAwMDAwLAorCURlc2NTaXplTWFzaz0weGZmZiwKKworCURlc2NUeEFib3J0PTB4MDQwMDAwMDAsIERlc2NUeEZJRk89MHgwMjAwMDAwMCwKKwlEZXNjVHhDYXJyaWVyPTB4MDEwMDAwMDAsIERlc2NUeERlZmVyPTB4MDA4MDAwMDAsCisJRGVzY1R4RXhjRGVmZXI9MHgwMDQwMDAwMCwgRGVzY1R4T09XQ29sPTB4MDAyMDAwMDAsCisJRGVzY1R4RXhjQ29sbD0weDAwMTAwMDAwLCBEZXNjVHhDb2xsQ291bnQ9MHgwMDBmMDAwMCwKKworCURlc2NSeEFib3J0PTB4MDQwMDAwMDAsIERlc2NSeE92ZXI9MHgwMjAwMDAwMCwKKwlEZXNjUnhEZXN0PTB4MDE4MDAwMDAsIERlc2NSeExvbmc9MHgwMDQwMDAwMCwKKwlEZXNjUnhSdW50PTB4MDAyMDAwMDAsIERlc2NSeEludmFsaWQ9MHgwMDEwMDAwMCwKKwlEZXNjUnhDUkM9MHgwMDA4MDAwMCwgRGVzY1J4QWxpZ249MHgwMDA0MDAwMCwKKwlEZXNjUnhMb29wPTB4MDAwMjAwMDAsIERlc1J4Q29sbD0weDAwMDEwMDAwLAorfTsKKworc3RydWN0IG5ldGRldl9wcml2YXRlIHsKKwkvKiBEZXNjcmlwdG9yIHJpbmdzIGZpcnN0IGZvciBhbGlnbm1lbnQgKi8KKwlkbWFfYWRkcl90IHJpbmdfZG1hOworCXN0cnVjdCBuZXRkZXZfZGVzYyAqcnhfcmluZzsKKwlzdHJ1Y3QgbmV0ZGV2X2Rlc2MgKnR4X3Jpbmc7CisJLyogVGhlIGFkZHJlc3NlcyBvZiByZWNlaXZlLWluLXBsYWNlIHNrYnVmZnMgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tidWZmW1JYX1JJTkdfU0laRV07CisJZG1hX2FkZHJfdCByeF9kbWFbUlhfUklOR19TSVpFXTsKKwkvKiBhZGRyZXNzIG9mIGEgc2VudC1pbi1wbGFjZSBwYWNrZXQvYnVmZmVyLCBmb3IgbGF0ZXIgZnJlZSgpICovCisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYnVmZltUWF9SSU5HX1NJWkVdOworCWRtYV9hZGRyX3QgdHhfZG1hW1RYX1JJTkdfU0laRV07CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJLyogTWVkaWEgbW9uaXRvcmluZyB0aW1lciAqLworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCS8qIEZyZXF1ZW50bHkgdXNlZCB2YWx1ZXM6IGtlZXAgc29tZSBhZGphY2VudCBmb3IgY2FjaGUgZWZmZWN0ICovCisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisJc3RydWN0IG5ldGRldl9kZXNjICpyeF9oZWFkX2Rlc2M7CisJLyogUHJvZHVjZXIvY29uc3VtZXIgcmluZyBpbmRpY2VzICovCisJdW5zaWduZWQgaW50IGN1cl9yeCwgZGlydHlfcng7CisJdW5zaWduZWQgaW50IGN1cl90eCwgZGlydHlfdHg7CisJLyogQmFzZWQgb24gTVRVK3NsYWNrLiAqLworCXVuc2lnbmVkIGludCByeF9idWZfc3o7CisJaW50IG9vbTsKKwkvKiBEbyBub3QgdG91Y2ggdGhlIG5pYyByZWdpc3RlcnMgKi8KKwlpbnQgaGFuZHNfb2ZmOworCS8qIGV4dGVybmFsIHBoeSB0aGF0IGlzIHVzZWQ6IG9ubHkgdmFsaWQgaWYgZGV2LT5pZl9wb3J0ICE9IFBPUlRfVFAgKi8KKwlpbnQgbWlpOworCWludCBwaHlfYWRkcl9leHRlcm5hbDsKKwl1bnNpZ25lZCBpbnQgZnVsbF9kdXBsZXg7CisJLyogUnggZmlsdGVyICovCisJdTMyIGN1cl9yeF9tb2RlOworCXUzMiByeF9maWx0ZXJbMTZdOworCS8qIEZJRk8gYW5kIFBDSSBidXJzdCB0aHJlc2hvbGRzICovCisJdTMyIHR4X2NvbmZpZywgcnhfY29uZmlnOworCS8qIG9yaWdpbmFsIGNvbnRlbnRzIG9mIENsa1J1biByZWdpc3RlciAqLworCXUzMiBTYXZlZENsa1J1bjsKKwkvKiBzaWxpY29uIHJldmlzaW9uICovCisJdTMyIHNycjsKKwkvKiBleHBlY3RlZCBEU1BDRkcgdmFsdWUgKi8KKwl1MTYgZHNwY2ZnOworCS8qIHBhcm1zIHNhdmVkIGluIGV0aHRvb2wgZm9ybWF0ICovCisJdTE2CXNwZWVkOwkJLyogVGhlIGZvcmNlZCBzcGVlZCwgMTBNYiwgMTAwTWIsIGdpZ2FiaXQgKi8KKwl1OAlkdXBsZXg7CQkvKiBEdXBsZXgsIGhhbGYgb3IgZnVsbCAqLworCXU4CWF1dG9uZWc7CS8qIEF1dG9uZWdvdGlhdGlvbiBlbmFibGVkICovCisJLyogTUlJIHRyYW5zY2VpdmVyIHNlY3Rpb24gKi8KKwl1MTYgYWR2ZXJ0aXNpbmc7CisJdW5zaWduZWQgaW50IGlvc2l6ZTsKKwlzcGlubG9ja190IGxvY2s7CisJdTMyIG1zZ19lbmFibGU7Cit9OworCitzdGF0aWMgdm9pZCBtb3ZlX2ludF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFkZHIpOworc3RhdGljIGludCBlZXByb21fcmVhZCh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWcpOworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVnLCB1MTYgZGF0YSk7CitzdGF0aWMgdm9pZCBpbml0X3BoeV9maXh1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbWlpcG9ydF9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCByZWcpOworc3RhdGljIHZvaWQgbWlpcG9ydF93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnLCB1MTYgZGF0YSk7CitzdGF0aWMgaW50IGZpbmRfbWlpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbmF0c2VtaV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG5hdHNlbWlfcmVsb2FkX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG5hdHNlbWlfc3RvcF9yeHR4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBuZXRkZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGRvX2NhYmxlX21hZ2ljKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgdW5kb19jYWJsZV9tYWdpYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGNoZWNrX2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBuZXRkZXZfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGR1bXBfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHR4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGFsbG9jX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCByZWZpbGxfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBpbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBkcmFpbl90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGRyYWluX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBmcmVlX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCByZWluaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGluaXRfcmVnaXN0ZXJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzdGFydF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBpbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBuZXRkZXZfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGludHJfc3RhdHVzKTsKK3N0YXRpYyB2b2lkIG5ldGRldl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG5ldGRldl90eF9kb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBuYXRzZW1pX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBuYXRzZW1pX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorc3RhdGljIHZvaWQgX19zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgX19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbmV0ZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIGludCBuZXRkZXZfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgbmV3dmFsKTsKK3N0YXRpYyBpbnQgbmV0ZGV2X2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyICpzdXBwb3J0ZWQsIHUzMiAqY3VyKTsKK3N0YXRpYyBpbnQgbmV0ZGV2X3NldF9zb3Bhc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKm5ld3ZhbCk7CitzdGF0aWMgaW50IG5ldGRldl9nZXRfc29wYXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpkYXRhKTsKK3N0YXRpYyBpbnQgbmV0ZGV2X2dldF9lY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCk7CitzdGF0aWMgaW50IG5ldGRldl9zZXRfZWNtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpOworc3RhdGljIHZvaWQgZW5hYmxlX3dvbF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBlbmFibGVfaW50cik7CitzdGF0aWMgaW50IG5ldGRldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbmV0ZGV2X2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpidWYpOworc3RhdGljIGludCBuZXRkZXZfZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqYnVmKTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHM7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpuc19pb2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKHZvaWQgX19pb21lbSAqKSBkZXYtPmJhc2VfYWRkcjsKK30KKworc3RhdGljIHZvaWQgbW92ZV9pbnRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBhZGRyKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisJaW50IHRhcmdldCA9IDMxOworCisJLyogCisJICogVGhlIGludGVybmFsIHBoeSBpcyB2aXNpYmxlIG9uIHRoZSBleHRlcm5hbCBtaWkgYnVzLiBUaGVyZWZvcmUgd2UgbXVzdAorCSAqIG1vdmUgaXQgYXdheSBiZWZvcmUgd2UgY2FuIHNlbmQgY29tbWFuZHMgdG8gYW4gZXh0ZXJuYWwgcGh5LgorCSAqIFRoZXJlIGFyZSB0d28gYWRkcmVzc2VzIHdlIG11c3QgYXZvaWQ6CisJICogLSB0aGUgYWRkcmVzcyBvbiB0aGUgZXh0ZXJuYWwgcGh5IHRoYXQgaXMgdXNlZCBmb3IgdHJhbnNtaXNzaW9uLgorCSAqIC0gdGhlIGFkZHJlc3MgdGhhdCB3ZSB3YW50IHRvIGFjY2Vzcy4gVXNlciBzcGFjZSBjYW4gYWNjZXNzIHBoeXMKKwkgKiAgIG9uIHRoZSBtaWkgYnVzIHdpdGggU0lPQ0dNSUlSRUcvU0lPQ1NNSUlSRUcsIGluZGVwZW5kYW50IGZyb20gdGhlCisJICogICBwaHkgdGhhdCBpcyB1c2VkIGZvciB0cmFuc21pc3Npb24uCisJICovCisKKwlpZiAodGFyZ2V0ID09IGFkZHIpCisJCXRhcmdldC0tOworCWlmICh0YXJnZXQgPT0gbnAtPnBoeV9hZGRyX2V4dGVybmFsKQorCQl0YXJnZXQtLTsKKwl3cml0ZXcodGFyZ2V0LCBpb2FkZHIgKyBQaHlDdHJsKTsKKwlyZWFkdyhpb2FkZHIgKyBQaHlDdHJsKTsKKwl1ZGVsYXkoMSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG5hdHNlbWlfcHJvYmUxIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucDsKKwlpbnQgaSwgb3B0aW9uLCBpcnEsIGNoaXBfaWR4ID0gZW50LT5kcml2ZXJfZGF0YTsKKwlzdGF0aWMgaW50IGZpbmRfY250ID0gLTE7CisJdW5zaWduZWQgbG9uZyBpb3N0YXJ0LCBpb3NpemU7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJY29uc3QgaW50IHBjaWJhciA9IDE7IC8qIFBDSSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKwlpbnQgcHJldl9lZWRhdGE7CisJdTMyIHRtcDsKKworLyogd2hlbiBidWlsdCBpbnRvIHRoZSBrZXJuZWwsIHdlIG9ubHkgcHJpbnQgdmVyc2lvbiBpZiBkZXZpY2UgaXMgZm91bmQgKi8KKyNpZm5kZWYgTU9EVUxFCisJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CisJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKKwkJcHJpbnRrKHZlcnNpb24pOworI2VuZGlmCisKKwlpID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGkpIHJldHVybiBpOworCisJLyogbmF0c2VtaSBoYXMgYSBub24tc3RhbmRhcmQgUE0gY29udHJvbCByZWdpc3RlcgorCSAqIGluIFBDSSBjb25maWcgc3BhY2UuICBTb21lIGJvYXJkcyBhcHBhcmVudGx5IG5lZWQKKwkgKiB0byBiZSBicm91Z2h0IHRvIEQwIGluIHRoaXMgbWFubmVyLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lQTSwgJnRtcCk7CisJaWYgKHRtcCAmIFBDSV9QTV9DVFJMX1NUQVRFX01BU0spIHsKKwkJLyogRDAgc3RhdGUsIGRpc2FibGUgUE1FIGFzc2VydGlvbiAqLworCQl1MzIgbmV3dG1wID0gdG1wICYgflBDSV9QTV9DVFJMX1NUQVRFX01BU0s7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgUENJUE0sIG5ld3RtcCk7CisJfQorCisJZmluZF9jbnQrKzsKKwlpb3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIHBjaWJhcik7CisJaW9zaXplID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCBwY2liYXIpOworCWlycSA9IHBkZXYtPmlycTsKKworCWlmIChuYXRzZW1pX3BjaV9pbmZvW2NoaXBfaWR4XS5mbGFncyAmIFBDSV9VU0VTX01BU1RFUikKKwkJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YgKHN0cnVjdCBuZXRkZXZfcHJpdmF0ZSkpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWkgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAoaSkKKwkJZ290byBlcnJfcGNpX3JlcXVlc3RfcmVnaW9uczsKKworCWlvYWRkciA9IGlvcmVtYXAoaW9zdGFydCwgaW9zaXplKTsKKwlpZiAoIWlvYWRkcikgeworCQlpID0gLUVOT01FTTsKKwkJZ290byBlcnJfaW9yZW1hcDsKKwl9CisKKwkvKiBXb3JrIGFyb3VuZCB0aGUgZHJvcHBlZCBzZXJpYWwgYml0LiAqLworCXByZXZfZWVkYXRhID0gZWVwcm9tX3JlYWQoaW9hZGRyLCA2KTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWludCBlZWRhdGEgPSBlZXByb21fcmVhZChpb2FkZHIsIGkgKyA3KTsKKwkJZGV2LT5kZXZfYWRkcltpKjJdID0gKGVlZGF0YSA8PCAxKSArIChwcmV2X2VlZGF0YSA+PiAxNSk7CisJCWRldi0+ZGV2X2FkZHJbaSoyKzFdID0gZWVkYXRhID4+IDc7CisJCXByZXZfZWVkYXRhID0gZWVkYXRhOworCX0KKworCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcgX19mb3JjZSkgaW9hZGRyOworCWRldi0+aXJxID0gaXJxOworCisJbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJbnAtPnBjaV9kZXYgPSBwZGV2OworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCW5wLT5pb3NpemUgPSBpb3NpemU7CisJc3Bpbl9sb2NrX2luaXQoJm5wLT5sb2NrKTsKKwlucC0+bXNnX2VuYWJsZSA9IChkZWJ1ZyA+PSAwKSA/ICgxPDxkZWJ1ZyktMSA6IE5BVFNFTUlfREVGX01TRzsKKwlucC0+aGFuZHNfb2ZmID0gMDsKKworCS8qIEluaXRpYWwgcG9ydDoKKwkgKiAtIElmIHRoZSBuaWMgd2FzIGNvbmZpZ3VyZWQgdG8gdXNlIGFuIGV4dGVybmFsIHBoeSBhbmQgaWYgZmluZF9taWkKKwkgKiAgIGZpbmRzIGEgcGh5OiB1c2UgZXh0ZXJuYWwgcG9ydCwgZmlyc3QgcGh5IHRoYXQgcmVwbGllcy4KKwkgKiAtIE90aGVyd2lzZTogaW50ZXJuYWwgcG9ydC4KKwkgKiBOb3RlIHRoYXQgdGhlIHBoeSBhZGRyZXNzIGZvciB0aGUgaW50ZXJuYWwgcGh5IGRvZXNuJ3QgbWF0dGVyOgorCSAqIFRoZSBhZGRyZXNzIHdvdWxkIGJlIHVzZWQgdG8gYWNjZXNzIGEgcGh5IG92ZXIgdGhlIG1paSBidXMsIGJ1dAorCSAqIHRoZSBpbnRlcm5hbCBwaHkgaXMgYWNjZXNzZWQgdGhyb3VnaCBtYXBwZWQgcmVnaXN0ZXJzLgorCSAqLworCWlmIChyZWFkbChpb2FkZHIgKyBDaGlwQ29uZmlnKSAmIENmZ0V4dFBoeSkKKwkJZGV2LT5pZl9wb3J0ID0gUE9SVF9NSUk7CisJZWxzZQorCQlkZXYtPmlmX3BvcnQgPSBQT1JUX1RQOworCS8qIFJlc2V0IHRoZSBjaGlwIHRvIGVyYXNlIHByZXZpb3VzIG1pc2NvbmZpZ3VyYXRpb24uICovCisJbmF0c2VtaV9yZWxvYWRfZWVwcm9tKGRldik7CisJbmF0c2VtaV9yZXNldChkZXYpOworCisJaWYgKGRldi0+aWZfcG9ydCAhPSBQT1JUX1RQKSB7CisJCW5wLT5waHlfYWRkcl9leHRlcm5hbCA9IGZpbmRfbWlpKGRldik7CisJCWlmIChucC0+cGh5X2FkZHJfZXh0ZXJuYWwgPT0gUEhZX0FERFJfTk9ORSkgeworCQkJZGV2LT5pZl9wb3J0ID0gUE9SVF9UUDsKKwkJCW5wLT5waHlfYWRkcl9leHRlcm5hbCA9IFBIWV9BRERSX0lOVEVSTkFMOworCQl9CisJfSBlbHNlIHsKKwkJbnAtPnBoeV9hZGRyX2V4dGVybmFsID0gUEhZX0FERFJfSU5URVJOQUw7CisJfQorCisJb3B0aW9uID0gZmluZF9jbnQgPCBNQVhfVU5JVFMgPyBvcHRpb25zW2ZpbmRfY250XSA6IDA7CisJaWYgKGRldi0+bWVtX3N0YXJ0KQorCQlvcHRpb24gPSBkZXYtPm1lbV9zdGFydDsKKworCS8qIFRoZSBsb3dlciBmb3VyIGJpdHMgYXJlIHRoZSBtZWRpYSB0eXBlLiAqLworCWlmIChvcHRpb24pIHsKKwkJaWYgKG9wdGlvbiAmIDB4MjAwKQorCQkJbnAtPmZ1bGxfZHVwbGV4ID0gMTsKKwkJaWYgKG9wdGlvbiAmIDE1KQorCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSJuYXRzZW1pICVzOiBpZ25vcmluZyB1c2VyIHN1cHBsaWVkIG1lZGlhIHR5cGUgJWQiLAorCQkJCXBjaV9uYW1lKG5wLT5wY2lfZGV2KSwgb3B0aW9uICYgMTUpOworCX0KKwlpZiAoZmluZF9jbnQgPCBNQVhfVU5JVFMgICYmICBmdWxsX2R1cGxleFtmaW5kX2NudF0pCisJCW5wLT5mdWxsX2R1cGxleCA9IDE7CisKKwkvKiBUaGUgY2hpcC1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9ICZuZXRkZXZfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZzdGFydF90eDsKKwlkZXYtPnN0b3AgPSAmbmV0ZGV2X2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gJmdldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZTsKKwlkZXYtPmNoYW5nZV9tdHUgPSAmbmF0c2VtaV9jaGFuZ2VfbXR1OworCWRldi0+ZG9faW9jdGwgPSAmbmV0ZGV2X2lvY3RsOworCWRldi0+dHhfdGltZW91dCA9ICZ0eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSAmbmF0c2VtaV9wb2xsX2NvbnRyb2xsZXI7CisjZW5kaWYKKwlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmZXRodG9vbF9vcHMpOworCisJaWYgKG10dSkKKwkJZGV2LT5tdHUgPSBtdHU7CisKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJLyogZ2V0IHRoZSBpbml0aWFsIHNldHRpbmdzIGZyb20gaGFyZHdhcmUgKi8KKwl0bXAgICAgICAgICAgICA9IG1kaW9fcmVhZChkZXYsIE1JSV9CTUNSKTsKKwlucC0+c3BlZWQgICAgICA9ICh0bXAgJiBCTUNSX1NQRUVEMTAwKT8gU1BFRURfMTAwICAgICA6IFNQRUVEXzEwOworCW5wLT5kdXBsZXggICAgID0gKHRtcCAmIEJNQ1JfRlVMTERQTFgpPyBEVVBMRVhfRlVMTCAgIDogRFVQTEVYX0hBTEY7CisJbnAtPmF1dG9uZWcgICAgPSAodG1wICYgQk1DUl9BTkVOQUJMRSk/IEFVVE9ORUdfRU5BQkxFOiBBVVRPTkVHX0RJU0FCTEU7CisJbnAtPmFkdmVydGlzaW5nPSBtZGlvX3JlYWQoZGV2LCBNSUlfQURWRVJUSVNFKTsKKworCWlmICgobnAtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFX0FMTCkgIT0gQURWRVJUSVNFX0FMTAorCSAmJiBuZXRpZl9tc2dfcHJvYmUobnApKSB7CisJCXByaW50ayhLRVJOX0lORk8gIm5hdHNlbWkgJXM6IFRyYW5zY2VpdmVyIGRlZmF1bHQgYXV0b25lZ290aWF0aW9uICVzICIKKwkJCSIxMCVzICVzIGR1cGxleC5cbiIsCisJCQlwY2lfbmFtZShucC0+cGNpX2RldiksCisJCQkobWRpb19yZWFkKGRldiwgTUlJX0JNQ1IpICYgQk1DUl9BTkVOQUJMRSk/CisJCQkgICJlbmFibGVkLCBhZHZlcnRpc2UiIDogImRpc2FibGVkLCBmb3JjZSIsCisJCQkobnAtPmFkdmVydGlzaW5nICYKKwkJCSAgKEFEVkVSVElTRV8xMDBGVUxMfEFEVkVSVElTRV8xMDBIQUxGKSk/CisJCQkgICAgIjAiIDogIiIsCisJCQkobnAtPmFkdmVydGlzaW5nICYKKwkJCSAgKEFEVkVSVElTRV8xMDBGVUxMfEFEVkVSVElTRV8xMEZVTEwpKT8KKwkJCSAgICAiZnVsbCIgOiAiaGFsZiIpOworCX0KKwlpZiAobmV0aWZfbXNnX3Byb2JlKG5wKSkKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIm5hdHNlbWkgJXM6IFRyYW5zY2VpdmVyIHN0YXR1cyAlIzA0eCBhZHZlcnRpc2luZyAlIzA0eC5cbiIsCisJCQlwY2lfbmFtZShucC0+cGNpX2RldiksIG1kaW9fcmVhZChkZXYsIE1JSV9CTVNSKSwKKwkJCW5wLT5hZHZlcnRpc2luZyk7CisKKwkvKiBzYXZlIHRoZSBzaWxpY29uIHJldmlzaW9uIGZvciBsYXRlciBxdWVyeWluZyAqLworCW5wLT5zcnIgPSByZWFkbChpb2FkZHIgKyBTaWxpY29uUmV2KTsKKwlpZiAobmV0aWZfbXNnX2h3KG5wKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAibmF0c2VtaSAlczogc2lsaWNvbiByZXZpc2lvbiAlIzA0eC5cbiIsCisJCQkJcGNpX25hbWUobnAtPnBjaV9kZXYpLCBucC0+c3JyKTsKKworCWkgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoaSkKKwkJZ290byBlcnJfcmVnaXN0ZXJfbmV0ZGV2OworCisJaWYgKG5ldGlmX21zZ19kcnYobnApKSB7CisJCXByaW50ayhLRVJOX0lORk8gIm5hdHNlbWkgJXM6ICVzIGF0ICUjMDhseCAoJXMpLCAiLAorCQkJZGV2LT5uYW1lLCBuYXRzZW1pX3BjaV9pbmZvW2NoaXBfaWR4XS5uYW1lLCBpb3N0YXJ0LAorCQkJcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwkJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOLTE7IGkrKykKKwkJCQlwcmludGsoIiUwMng6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJCXByaW50aygiJTAyeCwgSVJRICVkIiwgZGV2LT5kZXZfYWRkcltpXSwgaXJxKTsKKwkJaWYgKGRldi0+aWZfcG9ydCA9PSBQT1JUX1RQKQorCQkJcHJpbnRrKCIsIHBvcnQgVFAuXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKCIsIHBvcnQgTUlJLCBwaHkgYWQgJWQuXG4iLCBucC0+cGh5X2FkZHJfZXh0ZXJuYWwpOworCX0KKwlyZXR1cm4gMDsKKworIGVycl9yZWdpc3Rlcl9uZXRkZXY6CisJaW91bm1hcChpb2FkZHIpOworCisgZXJyX2lvcmVtYXA6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKyBlcnJfcGNpX3JlcXVlc3RfcmVnaW9uczoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBpOworfQorCisKKy8qIFJlYWQgdGhlIEVFUFJPTSBhbmQgTUlJIE1hbmFnZW1lbnQgRGF0YSBJL08gKE1ESU8pIGludGVyZmFjZXMuCisgICBUaGUgRUVQUk9NIGNvZGUgaXMgZm9yIHRoZSBjb21tb24gOTNjMDYvNDYgRUVQUk9NcyB3aXRoIDYgYml0IGFkZHJlc3Nlcy4gKi8KKworLyogRGVsYXkgYmV0d2VlbiBFRVBST00gY2xvY2sgdHJhbnNpdGlvbnMuCisgICBObyBleHRyYSBkZWxheSBpcyBuZWVkZWQgd2l0aCAzM01oeiBQQ0ksIGJ1dCBmdXR1cmUgNjZNaHogYWNjZXNzIG1heSBuZWVkCisgICBhIGRlbGF5LiAgTm90ZSB0aGF0IHByZS0yLjAuMzQga2VybmVscyBoYWQgYSBjYWNoZS1hbGlnbm1lbnQgYnVnIHRoYXQKKyAgIG1hZGUgdWRlbGF5KCkgdW5yZWxpYWJsZS4KKyAgIFRoZSBvbGQgbWV0aG9kIG9mIHVzaW5nIGFuIElTQSBhY2Nlc3MgYXMgYSBkZWxheSwgX19TTE9XX0RPV05fSU9fXywgaXMKKyAgIGRlcHJpY2F0ZWQuCisqLworI2RlZmluZSBlZXByb21fZGVsYXkoZWVfYWRkcikJcmVhZGwoZWVfYWRkcikKKworI2RlZmluZSBFRV9Xcml0ZTAgKEVFX0NoaXBTZWxlY3QpCisjZGVmaW5lIEVFX1dyaXRlMSAoRUVfQ2hpcFNlbGVjdCB8IEVFX0RhdGFJbikKKworLyogVGhlIEVFUFJPTSBjb21tYW5kcyBpbmNsdWRlIHRoZSBhbHdheS1zZXQgbGVhZGluZyBiaXQuICovCitlbnVtIEVFUFJPTV9DbWRzIHsKKwlFRV9Xcml0ZUNtZD0oNSA8PCA2KSwgRUVfUmVhZENtZD0oNiA8PCA2KSwgRUVfRXJhc2VDbWQ9KDcgPDwgNiksCit9OworCitzdGF0aWMgaW50IGVlcHJvbV9yZWFkKHZvaWQgX19pb21lbSAqYWRkciwgaW50IGxvY2F0aW9uKQoreworCWludCBpOworCWludCByZXR2YWwgPSAwOworCXZvaWQgX19pb21lbSAqZWVfYWRkciA9IGFkZHIgKyBFRUN0cmw7CisJaW50IHJlYWRfY21kID0gbG9jYXRpb24gfCBFRV9SZWFkQ21kOworCisJd3JpdGVsKEVFX1dyaXRlMCwgZWVfYWRkcik7CisKKwkvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDEwOyBpID49IDA7IGktLSkgeworCQlzaG9ydCBkYXRhdmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gRUVfV3JpdGUxIDogRUVfV3JpdGUwOworCQl3cml0ZWwoZGF0YXZhbCwgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheShlZV9hZGRyKTsKKwkJd3JpdGVsKGRhdGF2YWwgfCBFRV9TaGlmdENsaywgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheShlZV9hZGRyKTsKKwl9CisJd3JpdGVsKEVFX0NoaXBTZWxlY3QsIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheShlZV9hZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCXdyaXRlbChFRV9DaGlwU2VsZWN0IHwgRUVfU2hpZnRDbGssIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkoZWVfYWRkcik7CisJCXJldHZhbCB8PSAocmVhZGwoZWVfYWRkcikgJiBFRV9EYXRhT3V0KSA/IDEgPDwgaSA6IDA7CisJCXdyaXRlbChFRV9DaGlwU2VsZWN0LCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KGVlX2FkZHIpOworCX0KKworCS8qIFRlcm1pbmF0ZSB0aGUgRUVQUk9NIGFjY2Vzcy4gKi8KKwl3cml0ZWwoRUVfV3JpdGUwLCBlZV9hZGRyKTsKKwl3cml0ZWwoMCwgZWVfYWRkcik7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogTUlJIHRyYW5zY2VpdmVyIGNvbnRyb2wgc2VjdGlvbi4KKyAqIFRoZSA4MzgxNSBzZXJpZXMgaGFzIGFuIGludGVybmFsIHRyYW5zY2VpdmVyLCBhbmQgd2UgcHJlc2VudCB0aGUKKyAqIGludGVybmFsIG1hbmFnZW1lbnQgcmVnaXN0ZXJzIGFzIGlmIHRoZXkgd2VyZSBNSUkgY29ubmVjdGVkLgorICogRXh0ZXJuYWwgUGh5IHJlZ2lzdGVycyBhcmUgcmVmZXJlbmNlZCB0aHJvdWdoIHRoZSBNSUkgaW50ZXJmYWNlLgorICovCisKKy8qIGNsb2NrIHRyYW5zaXRpb25zID49IDIwbnMgKDI1TUh6KQorICogT25lIHJlYWRsIHNob3VsZCBiZSBnb29kIHRvIFBDSSBAIDEwME1IegorICovCisjZGVmaW5lIG1paV9kZWxheShpb2FkZHIpICByZWFkbChpb2FkZHIgKyBFRUN0cmwpCisKK3N0YXRpYyBpbnQgbWlpX2dldGJpdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgZGF0YTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5zX2lvYWRkcihkZXYpOworCisJd3JpdGVsKE1JSV9TaGlmdENsaywgaW9hZGRyICsgRUVDdHJsKTsKKwlkYXRhID0gcmVhZGwoaW9hZGRyICsgRUVDdHJsKTsKKwl3cml0ZWwoMCwgaW9hZGRyICsgRUVDdHJsKTsKKwltaWlfZGVsYXkoaW9hZGRyKTsKKwlyZXR1cm4gKGRhdGEgJiBNSUlfRGF0YSk/IDEgOiAwOworfQorCitzdGF0aWMgdm9pZCBtaWlfc2VuZF9iaXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSwgaW50IGxlbikKK3sKKwl1MzIgaTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5zX2lvYWRkcihkZXYpOworCisJZm9yIChpID0gKDEgPDwgKGxlbi0xKSk7IGk7IGkgPj49IDEpCisJeworCQl1MzIgbWRpb192YWwgPSBNSUlfV3JpdGUgfCAoKGRhdGEgJiBpKT8gTUlJX0RhdGEgOiAwKTsKKwkJd3JpdGVsKG1kaW9fdmFsLCBpb2FkZHIgKyBFRUN0cmwpOworCQltaWlfZGVsYXkoaW9hZGRyKTsKKwkJd3JpdGVsKG1kaW9fdmFsIHwgTUlJX1NoaWZ0Q2xrLCBpb2FkZHIgKyBFRUN0cmwpOworCQltaWlfZGVsYXkoaW9hZGRyKTsKKwl9CisJd3JpdGVsKDAsIGlvYWRkciArIEVFQ3RybCk7CisJbWlpX2RlbGF5KGlvYWRkcik7Cit9CisKK3N0YXRpYyBpbnQgbWlpcG9ydF9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCByZWcpCit7CisJdTMyIGNtZDsKKwlpbnQgaTsKKwl1MzIgcmV0dmFsID0gMDsKKworCS8qIEVuc3VyZSBzeW5jICovCisJbWlpX3NlbmRfYml0cyAoZGV2LCAweGZmZmZmZmZmLCAzMik7CisJLyogU1QoMiksIE9QKDIpLCBBRERSKDUpLCBSRUcjKDUpLCBUQSgyKSwgRGF0YSgxNikgdG90YWwgMzIgYml0cyAqLworCS8qIFNULE9QID0gMDExMCdiIGZvciByZWFkIG9wZXJhdGlvbiAqLworCWNtZCA9ICgweDA2IDw8IDEwKSB8IChwaHlfaWQgPDwgNSkgfCByZWc7CisJbWlpX3NlbmRfYml0cyAoZGV2LCBjbWQsIDE0KTsKKwkvKiBUdXJuYXJvdW5kICovCisJaWYgKG1paV9nZXRiaXQgKGRldikpCisJCXJldHVybiAwOworCS8qIFJlYWQgZGF0YSAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCXJldHZhbCA8PD0gMTsKKwkJcmV0dmFsIHw9IG1paV9nZXRiaXQgKGRldik7CisJfQorCS8qIEVuZCBjeWNsZSAqLworCW1paV9nZXRiaXQgKGRldik7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgbWlpcG9ydF93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnLCB1MTYgZGF0YSkKK3sKKwl1MzIgY21kOworCisJLyogRW5zdXJlIHN5bmMgKi8KKwltaWlfc2VuZF9iaXRzIChkZXYsIDB4ZmZmZmZmZmYsIDMyKTsKKwkvKiBTVCgyKSwgT1AoMiksIEFERFIoNSksIFJFRyMoNSksIFRBKDIpLCBEYXRhKDE2KSB0b3RhbCAzMiBiaXRzICovCisJLyogU1QsT1AsQUFBQUEsUlJSUlIsVEEgPSAwMTAxeHh4eHh4eHh4eDEwJ2IgPSAweDUwMDIgZm9yIHdyaXRlICovCisJY21kID0gKDB4NTAwMiA8PCAxNikgfCAocGh5X2lkIDw8IDIzKSB8IChyZWcgPDwgMTgpIHwgZGF0YTsKKwltaWlfc2VuZF9iaXRzIChkZXYsIGNtZCwgMzIpOworCS8qIEVuZCBjeWNsZSAqLworCW1paV9nZXRiaXQgKGRldik7Cit9CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWcpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKworCS8qIFRoZSA4MzgxNSBzZXJpZXMgaGFzIHR3byBwb3J0czoKKwkgKiAtIGFuIGludGVybmFsIHRyYW5zY2VpdmVyCisJICogLSBhbiBleHRlcm5hbCBtaWkgYnVzCisJICovCisJaWYgKGRldi0+aWZfcG9ydCA9PSBQT1JUX1RQKQorCQlyZXR1cm4gcmVhZHcoaW9hZGRyK0Jhc2ljQ29udHJvbCsocmVnPDwyKSk7CisJZWxzZQorCQlyZXR1cm4gbWlpcG9ydF9yZWFkKGRldiwgbnAtPnBoeV9hZGRyX2V4dGVybmFsLCByZWcpOworfQorCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWcsIHUxNiBkYXRhKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisKKwkvKiBUaGUgODM4MTUgc2VyaWVzIGhhcyBhbiBpbnRlcm5hbCB0cmFuc2NlaXZlcjsgaGFuZGxlIHNlcGFyYXRlbHkgKi8KKwlpZiAoZGV2LT5pZl9wb3J0ID09IFBPUlRfVFApCisJCXdyaXRldyhkYXRhLCBpb2FkZHIrQmFzaWNDb250cm9sKyhyZWc8PDIpKTsKKwllbHNlCisJCW1paXBvcnRfd3JpdGUoZGV2LCBucC0+cGh5X2FkZHJfZXh0ZXJuYWwsIHJlZywgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcGh5X2ZpeHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKwlpbnQgaTsKKwl1MzIgY2ZnOworCXUxNiB0bXA7CisKKwkvKiByZXN0b3JlIHN0dWZmIGxvc3Qgd2hlbiBwb3dlciB3YXMgb3V0ICovCisJdG1wID0gbWRpb19yZWFkKGRldiwgTUlJX0JNQ1IpOworCWlmIChucC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQkvKiByZW5lZ290aWF0ZSBpZiBzb21ldGhpbmcgY2hhbmdlZCAqLworCQlpZiAoKHRtcCAmIEJNQ1JfQU5FTkFCTEUpID09IDAKKwkJIHx8IG5wLT5hZHZlcnRpc2luZyAhPSBtZGlvX3JlYWQoZGV2LCBNSUlfQURWRVJUSVNFKSkKKwkJeworCQkJLyogdHVybiBvbiBhdXRvbmVnb3RpYXRpb24gYW5kIGZvcmNlIG5lZ290aWF0aW9uICovCisJCQl0bXAgfD0gKEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVCk7CisJCQltZGlvX3dyaXRlKGRldiwgTUlJX0FEVkVSVElTRSwgbnAtPmFkdmVydGlzaW5nKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHR1cm4gb2ZmIGF1dG8gbmVnb3RpYXRpb24sIHNldCBzcGVlZCBhbmQgZHVwbGV4aXR5ICovCisJCXRtcCAmPSB+KEJNQ1JfQU5FTkFCTEUgfCBCTUNSX1NQRUVEMTAwIHwgQk1DUl9GVUxMRFBMWCk7CisJCWlmIChucC0+c3BlZWQgPT0gU1BFRURfMTAwKQorCQkJdG1wIHw9IEJNQ1JfU1BFRUQxMDA7CisJCWlmIChucC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJdG1wIHw9IEJNQ1JfRlVMTERQTFg7CisJCS8qIAorCQkgKiBOb3RlOiB0aGVyZSBpcyBubyBnb29kIHdheSB0byBpbmZvcm0gdGhlIGxpbmsgcGFydG5lcgorCQkgKiB0aGF0IG91ciBjYXBhYmlsaXRpZXMgY2hhbmdlZC4gVGhlIHVzZXIgaGFzIHRvIHVucGx1ZworCQkgKiBhbmQgcmVwbHVnIHRoZSBuZXR3b3JrIGNhYmxlIGFmdGVyIHNvbWUgY2hhbmdlcywgZS5nLgorCQkgKiBhZnRlciBzd2l0Y2hpbmcgZnJvbSAxMEhELCBhdXRvbmVnIG9mZiB0byAxMDAgSEQsCisJCSAqIGF1dG9uZWcgb2ZmLgorCQkgKi8KKwl9CisJbWRpb193cml0ZShkZXYsIE1JSV9CTUNSLCB0bXApOworCXJlYWRsKGlvYWRkciArIENoaXBDb25maWcpOworCXVkZWxheSgxKTsKKworCS8qIGZpbmQgb3V0IHdoYXQgcGh5IHRoaXMgaXMgKi8KKwlucC0+bWlpID0gKG1kaW9fcmVhZChkZXYsIE1JSV9QSFlTSUQxKSA8PCAxNikKKwkJCQkrIG1kaW9fcmVhZChkZXYsIE1JSV9QSFlTSUQyKTsKKworCS8qIGhhbmRsZSBleHRlcm5hbCBwaHlzIGhlcmUgKi8KKwlzd2l0Y2ggKG5wLT5taWkpIHsKKwljYXNlIFBIWUlEX0FNNzlDODc0OgorCQkvKiBwaHkgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmb3IgZmlicmUvdHAgb3BlcmF0aW9uICovCisJCXRtcCA9IG1kaW9fcmVhZChkZXYsIE1JSV9NQ1RSTCk7CisJCXRtcCAmPSB+KE1JSV9GWF9TRUwgfCBNSUlfRU5fU0NSTSk7CisJCWlmIChkZXYtPmlmX3BvcnQgPT0gUE9SVF9GSUJSRSkKKwkJCXRtcCB8PSBNSUlfRlhfU0VMOworCQllbHNlCisJCQl0bXAgfD0gTUlJX0VOX1NDUk07CisJCW1kaW9fd3JpdGUoZGV2LCBNSUlfTUNUUkwsIHRtcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwljZmcgPSByZWFkbChpb2FkZHIgKyBDaGlwQ29uZmlnKTsKKwlpZiAoY2ZnICYgQ2ZnRXh0UGh5KQorCQlyZXR1cm47CisKKwkvKiBPbiBwYWdlIDc4IG9mIHRoZSBzcGVjLCB0aGV5IHJlY29tbWVuZCBzb21lIHNldHRpbmdzIGZvciAib3B0aW11bQorCSAgIHBlcmZvcm1hbmNlIiB0byBiZSBkb25lIGluIHNlcXVlbmNlLiAgVGhlc2Ugc2V0dGluZ3Mgb3B0aW1pemUgc29tZQorCSAgIG9mIHRoZSAxMDBNYml0IGF1dG9kZXRlY3Rpb24gY2lyY3VpdHJ5LiAgVGhleSBzYXkgd2Ugb25seSB3YW50IHRvCisJICAgZG8gdGhpcyBmb3IgcmV2IEMgb2YgdGhlIGNoaXAsIGJ1dCBlbmdpbmVlcnMgYXQgTlNDIChCcmFkbGV5CisJICAgS2VubmVkeSkgcmVjb21tZW5kcyBhbHdheXMgc2V0dGluZyB0aGVtLiAgSWYgeW91IGRvbid0LCB5b3UgZ2V0CisJICAgZXJyb3JzIG9uIHNvbWUgYXV0b25lZ290aWF0aW9ucyB0aGF0IG1ha2UgdGhlIGRldmljZSB1bnVzYWJsZS4KKworCSAgIEl0IHNlZW1zIHRoYXQgdGhlIERTUCBuZWVkcyBhIGZldyB1c2VjIHRvIHJlaW5pdGlhbGl6ZSBhZnRlcgorCSAgIHRoZSBzdGFydCBvZiB0aGUgcGh5LiBKdXN0IHJldHJ5IHdyaXRpbmcgdGhlc2UgdmFsdWVzIHVudGlsIHRoZXkKKwkgICBzdGljay4KKwkqLworCWZvciAoaT0wO2k8TkFUU0VNSV9IV19USU1FT1VUO2krKykgeworCisJCWludCBkc3BjZmc7CisJCXdyaXRldygxLCBpb2FkZHIgKyBQR1NFTCk7CisJCXdyaXRldyhQTURDU1JfVkFMLCBpb2FkZHIgKyBQTURDU1IpOworCQl3cml0ZXcoVFNUREFUX1ZBTCwgaW9hZGRyICsgVFNUREFUKTsKKwkJbnAtPmRzcGNmZyA9IChucC0+c3JyIDw9IFNSUl9EUDgzODE1X0MpPworCQkJRFNQQ0ZHX1ZBTCA6IChEU1BDRkdfQ09FRiB8IHJlYWR3KGlvYWRkciArIERTUENGRykpOworCQl3cml0ZXcobnAtPmRzcGNmZywgaW9hZGRyICsgRFNQQ0ZHKTsKKwkJd3JpdGV3KFNEQ0ZHX1ZBTCwgaW9hZGRyICsgU0RDRkcpOworCQl3cml0ZXcoMCwgaW9hZGRyICsgUEdTRUwpOworCQlyZWFkbChpb2FkZHIgKyBDaGlwQ29uZmlnKTsKKwkJdWRlbGF5KDEwKTsKKworCQl3cml0ZXcoMSwgaW9hZGRyICsgUEdTRUwpOworCQlkc3BjZmcgPSByZWFkdyhpb2FkZHIgKyBEU1BDRkcpOworCQl3cml0ZXcoMCwgaW9hZGRyICsgUEdTRUwpOworCQlpZiAobnAtPmRzcGNmZyA9PSBkc3BjZmcpCisJCQlicmVhazsKKwl9CisKKwlpZiAobmV0aWZfbXNnX2xpbmsobnApKSB7CisJCWlmIChpPT1OQVRTRU1JX0hXX1RJTUVPVVQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IERTUENGRyBtaXNtYXRjaCBhZnRlciByZXRyeWluZyBmb3IgJWQgdXNlYy5cbiIsCisJCQkJZGV2LT5uYW1lLCBpKjEwKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IERTUENGRyBhY2NlcHRlZCBhZnRlciAlZCB1c2VjLlxuIiwKKwkJCQlkZXYtPm5hbWUsIGkqMTApOworCQl9CisJfQorCS8qCisJICogRW5hYmxlIFBIWSBTcGVjaWZpYyBldmVudCBiYXNlZCBpbnRlcnJ1cHRzLiAgTGluayBzdGF0ZSBjaGFuZ2UKKwkgKiBhbmQgQXV0by1OZWdvdGlhdGlvbiBDb21wbGV0aW9uIGFyZSBhbW9uZyB0aGUgYWZmZWN0ZWQuCisJICogUmVhZCB0aGUgaW50ciBzdGF0dXMgdG8gY2xlYXIgaXQgKG5lZWRlZCBmb3Igd2FrZSBldmVudHMpLgorCSAqLworCXJlYWR3KGlvYWRkciArIE1JbnRyU3RhdHVzKTsKKwl3cml0ZXcoTUlDUkludEVuLCBpb2FkZHIgKyBNSW50ckN0cmwpOworfQorCitzdGF0aWMgaW50IHN3aXRjaF9wb3J0X2V4dGVybmFsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKwl1MzIgY2ZnOworCisJY2ZnID0gcmVhZGwoaW9hZGRyICsgQ2hpcENvbmZpZyk7CisJaWYgKGNmZyAmIENmZ0V4dFBoeSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobmV0aWZfbXNnX2xpbmsobnApKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBzd2l0Y2hpbmcgdG8gZXh0ZXJuYWwgdHJhbnNjZWl2ZXIuXG4iLAorCQkJCWRldi0+bmFtZSk7CisJfQorCisJLyogMSkgc3dpdGNoIGJhY2sgdG8gZXh0ZXJuYWwgcGh5ICovCisJd3JpdGVsKGNmZyB8IChDZmdFeHRQaHkgfCBDZmdQaHlEaXMpLCBpb2FkZHIgKyBDaGlwQ29uZmlnKTsKKwlyZWFkbChpb2FkZHIgKyBDaGlwQ29uZmlnKTsKKwl1ZGVsYXkoMSk7CisKKwkvKiAyKSByZXNldCB0aGUgZXh0ZXJuYWwgcGh5OiAqLworCS8qIHJlc2V0dGluZyB0aGUgZXh0ZXJuYWwgUEhZIGhhcyBiZWVuIGtub3duIHRvIGNhdXNlIGEgaHViIHN1cHBseWluZworCSAqIHBvd2VyIG92ZXIgRXRoZXJuZXQgdG8ga2lsbCB0aGUgcG93ZXIuICBXZSBkb24ndCB3YW50IHRvIGtpbGwKKwkgKiBwb3dlciB0byB0aGlzIGNvbXB1dGVyLCBzbyB3ZSBhdm9pZCByZXNldHRpbmcgdGhlIHBoeS4KKwkgKi8KKworCS8qIDMpIHJlaW5pdCB0aGUgcGh5IGZpeHVwLCBpdCBnb3QgbG9zdCBkdXJpbmcgcG93ZXIgZG93bi4gKi8KKwltb3ZlX2ludF9waHkoZGV2LCBucC0+cGh5X2FkZHJfZXh0ZXJuYWwpOworCWluaXRfcGh5X2ZpeHVwKGRldik7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzd2l0Y2hfcG9ydF9pbnRlcm5hbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisJaW50IGk7CisJdTMyIGNmZzsKKwl1MTYgYm1jcjsKKworCWNmZyA9IHJlYWRsKGlvYWRkciArIENoaXBDb25maWcpOworCWlmICghKGNmZyAmQ2ZnRXh0UGh5KSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobmV0aWZfbXNnX2xpbmsobnApKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBzd2l0Y2hpbmcgdG8gaW50ZXJuYWwgdHJhbnNjZWl2ZXIuXG4iLAorCQkJCWRldi0+bmFtZSk7CisJfQorCS8qIDEpIHN3aXRjaCBiYWNrIHRvIGludGVybmFsIHBoeTogKi8KKwljZmcgPSBjZmcgJiB+KENmZ0V4dFBoeSB8IENmZ1BoeURpcyk7CisJd3JpdGVsKGNmZywgaW9hZGRyICsgQ2hpcENvbmZpZyk7CisJcmVhZGwoaW9hZGRyICsgQ2hpcENvbmZpZyk7CisJdWRlbGF5KDEpOworCQorCS8qIDIpIHJlc2V0IHRoZSBpbnRlcm5hbCBwaHk6ICovCisJYm1jciA9IHJlYWR3KGlvYWRkcitCYXNpY0NvbnRyb2wrKE1JSV9CTUNSPDwyKSk7CisJd3JpdGVsKGJtY3IgfCBCTUNSX1JFU0VULCBpb2FkZHIrQmFzaWNDb250cm9sKyhNSUlfQk1DUjw8MikpOworCXJlYWRsKGlvYWRkciArIENoaXBDb25maWcpOworCXVkZWxheSgxMCk7CisJZm9yIChpPTA7aTxOQVRTRU1JX0hXX1RJTUVPVVQ7aSsrKSB7CisJCWJtY3IgPSByZWFkdyhpb2FkZHIrQmFzaWNDb250cm9sKyhNSUlfQk1DUjw8MikpOworCQlpZiAoIShibWNyICYgQk1DUl9SRVNFVCkpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisJaWYgKGk9PU5BVFNFTUlfSFdfVElNRU9VVCAmJiBuZXRpZl9tc2dfbGluayhucCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIiVzOiBwaHkgcmVzZXQgZGlkIG5vdCBjb21wbGV0ZSBpbiAlZCB1c2VjLlxuIiwKKwkJCWRldi0+bmFtZSwgaSoxMCk7CisJfQorCS8qIDMpIHJlaW5pdCB0aGUgcGh5IGZpeHVwLCBpdCBnb3QgbG9zdCBkdXJpbmcgcG93ZXIgZG93bi4gKi8KKwlpbml0X3BoeV9maXh1cChkZXYpOworCisJcmV0dXJuIDE7Cit9CisKKy8qIFNjYW4gZm9yIGEgUEhZIG9uIHRoZSBleHRlcm5hbCBtaWkgYnVzLgorICogVGhlcmUgYXJlIHR3byB0cmlja3kgcG9pbnRzOgorICogLSBEbyBub3Qgc2NhbiB3aGlsZSB0aGUgaW50ZXJuYWwgcGh5IGlzIGVuYWJsZWQuIFRoZSBpbnRlcm5hbCBwaHkgd2lsbAorICogICBjcmFzaDogZS5nLiByZWFkcyBmcm9tIHRoZSBEU1BDRkcgcmVnaXN0ZXIgd2lsbCByZXR1cm4gb2RkIHZhbHVlcyBhbmQKKyAqICAgdGhlIG5hc3R5IHJhbmRvbSBwaHkgcmVzZXQgY29kZSB3aWxsIHJlc2V0IHRoZSBuaWMgZXZlcnkgZmV3IHNlY29uZHMuCisgKiAtIFRoZSBpbnRlcm5hbCBwaHkgbXVzdCBiZSBtb3ZlZCBhcm91bmQsIGFuIGV4dGVybmFsIHBoeSBjb3VsZAorICogICBoYXZlIHRoZSBzYW1lIGFkZHJlc3MgYXMgdGhlIGludGVybmFsIHBoeS4KKyAqLworc3RhdGljIGludCBmaW5kX21paShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCB0bXA7CisJaW50IGk7CisJaW50IGRpZF9zd2l0Y2g7CisKKwkvKiBTd2l0Y2ggdG8gZXh0ZXJuYWwgcGh5ICovCisJZGlkX3N3aXRjaCA9IHN3aXRjaF9wb3J0X2V4dGVybmFsKGRldik7CisJCQorCS8qIFNjYW4gdGhlIHBvc3NpYmxlIHBoeSBhZGRyZXNzZXM6CisJICoKKwkgKiBQSFkgYWRkcmVzcyAwIG1lYW5zIHRoYXQgdGhlIHBoeSBpcyBpbiBpc29sYXRlIG1vZGUuIE5vdCB5ZXQKKwkgKiBzdXBwb3J0ZWQgZHVlIHRvIGxhY2sgb2YgdGVzdCBoYXJkd2FyZS4gVXNlciBzcGFjZSBzaG91bGQKKwkgKiBoYW5kbGUgaXQgdGhyb3VnaCBldGh0b29sLgorCSAqLworCWZvciAoaSA9IDE7IGkgPD0gMzE7IGkrKykgeworCQltb3ZlX2ludF9waHkoZGV2LCBpKTsKKwkJdG1wID0gbWlpcG9ydF9yZWFkKGRldiwgaSwgTUlJX0JNU1IpOworCQlpZiAodG1wICE9IDB4ZmZmZiAmJiB0bXAgIT0gMHgwMDAwKSB7CisJCQkvKiBmb3VuZCBzb21ldGhpbmchICovCisJCQlucC0+bWlpID0gKG1kaW9fcmVhZChkZXYsIE1JSV9QSFlTSUQxKSA8PCAxNikKKwkJCQkJKyBtZGlvX3JlYWQoZGV2LCBNSUlfUEhZU0lEMik7CisJIAkJaWYgKG5ldGlmX21zZ19wcm9iZShucCkpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJuYXRzZW1pICVzOiBmb3VuZCBleHRlcm5hbCBwaHkgJTA4eCBhdCBhZGRyZXNzICVkLlxuIiwKKwkJCQkJCXBjaV9uYW1lKG5wLT5wY2lfZGV2KSwgbnAtPm1paSwgaSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKwkvKiBBbmQgc3dpdGNoIGJhY2sgdG8gaW50ZXJuYWwgcGh5OiAqLworCWlmIChkaWRfc3dpdGNoKQorCQlzd2l0Y2hfcG9ydF9pbnRlcm5hbChkZXYpOworCXJldHVybiBpOworfQorCisvKiBDRkcgYml0cyBbMTM6MTZdIFsxODoyM10gKi8KKyNkZWZpbmUgQ0ZHX1JFU0VUX1NBVkUgMHhmZGUwMDAKKy8qIFdDU1IgYml0cyBbMDo0XSBbOToxMF0gKi8KKyNkZWZpbmUgV0NTUl9SRVNFVF9TQVZFIDB4NjFmCisvKiBSRkNSIGJpdHMgWzIwXSBbMjJdIFsyNzozMV0gKi8KKyNkZWZpbmUgUkZDUl9SRVNFVF9TQVZFIDB4Zjg1MDAwMDA7CisKK3N0YXRpYyB2b2lkIG5hdHNlbWlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwl1MzIgY2ZnOworCXUzMiB3Y3NyOworCXUzMiByZmNyOworCXUxNiBwbWF0Y2hbM107CisJdTE2IHNvcGFzc1szXTsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5zX2lvYWRkcihkZXYpOworCisJLyoKKwkgKiBSZXNldHRpbmcgdGhlIGNoaXAgY2F1c2VzIHNvbWUgcmVnaXN0ZXJzIHRvIGJlIGxvc3QuCisJICogTmF0c2VtaSBzdWdnZXN0cyBOT1QgcmVsb2FkaW5nIHRoZSBFRVBST00gd2hpbGUgbGl2ZSwgc28gaW5zdGVhZAorCSAqIHdlIHNhdmUgdGhlIHN0YXRlIHRoYXQgd291bGQgaGF2ZSBiZWVuIGxvYWRlZCBmcm9tIEVFUFJPTQorCSAqIG9uIGEgbm9ybWFsIHBvd2VyLXVwIChzZWUgdGhlIHNwZWMgRUVQUk9NIG1hcCkuICBUaGlzIGFzc3VtZXMKKwkgKiB3aG9ldmVyIGNhbGxzIHRoaXMgd2lsbCBmb2xsb3cgdXAgd2l0aCBpbml0X3JlZ2lzdGVycygpIGV2ZW50dWFsbHkuCisJICovCisKKwkvKiBDRkcgKi8KKwljZmcgPSByZWFkbChpb2FkZHIgKyBDaGlwQ29uZmlnKSAmIENGR19SRVNFVF9TQVZFOworCS8qIFdDU1IgKi8KKwl3Y3NyID0gcmVhZGwoaW9hZGRyICsgV09MQ21kKSAmIFdDU1JfUkVTRVRfU0FWRTsKKwkvKiBSRkNSICovCisJcmZjciA9IHJlYWRsKGlvYWRkciArIFJ4RmlsdGVyQWRkcikgJiBSRkNSX1JFU0VUX1NBVkU7CisJLyogUE1BVENIICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQl3cml0ZWwoaSoyLCBpb2FkZHIgKyBSeEZpbHRlckFkZHIpOworCQlwbWF0Y2hbaV0gPSByZWFkdyhpb2FkZHIgKyBSeEZpbHRlckRhdGEpOworCX0KKwkvKiBTT1BBUyAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJd3JpdGVsKDB4YSsoaSoyKSwgaW9hZGRyICsgUnhGaWx0ZXJBZGRyKTsKKwkJc29wYXNzW2ldID0gcmVhZHcoaW9hZGRyICsgUnhGaWx0ZXJEYXRhKTsKKwl9CisKKwkvKiBub3cgd2hhY2sgdGhlIGNoaXAgKi8KKwl3cml0ZWwoQ2hpcFJlc2V0LCBpb2FkZHIgKyBDaGlwQ21kKTsKKwlmb3IgKGk9MDtpPE5BVFNFTUlfSFdfVElNRU9VVDtpKyspIHsKKwkJaWYgKCEocmVhZGwoaW9hZGRyICsgQ2hpcENtZCkgJiBDaGlwUmVzZXQpKQorCQkJYnJlYWs7CisJCXVkZWxheSg1KTsKKwl9CisJaWYgKGk9PU5BVFNFTUlfSFdfVElNRU9VVCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcmVzZXQgZGlkIG5vdCBjb21wbGV0ZSBpbiAlZCB1c2VjLlxuIiwKKwkJCWRldi0+bmFtZSwgaSo1KTsKKwl9IGVsc2UgaWYgKG5ldGlmX21zZ19odyhucCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZXNldCBjb21wbGV0ZWQgaW4gJWQgdXNlYy5cbiIsCisJCQlkZXYtPm5hbWUsIGkqNSk7CisJfQorCisJLyogcmVzdG9yZSBDRkcgKi8KKwljZmcgfD0gcmVhZGwoaW9hZGRyICsgQ2hpcENvbmZpZykgJiB+Q0ZHX1JFU0VUX1NBVkU7CisJLyogdHVybiBvbiBleHRlcm5hbCBwaHkgaWYgaXQgd2FzIHNlbGVjdGVkICovCisJaWYgKGRldi0+aWZfcG9ydCA9PSBQT1JUX1RQKQorCQljZmcgJj0gfihDZmdFeHRQaHkgfCBDZmdQaHlEaXMpOworCWVsc2UKKwkJY2ZnIHw9IChDZmdFeHRQaHkgfCBDZmdQaHlEaXMpOworCXdyaXRlbChjZmcsIGlvYWRkciArIENoaXBDb25maWcpOworCS8qIHJlc3RvcmUgV0NTUiAqLworCXdjc3IgfD0gcmVhZGwoaW9hZGRyICsgV09MQ21kKSAmIH5XQ1NSX1JFU0VUX1NBVkU7CisJd3JpdGVsKHdjc3IsIGlvYWRkciArIFdPTENtZCk7CisJLyogcmVhZCBSRkNSICovCisJcmZjciB8PSByZWFkbChpb2FkZHIgKyBSeEZpbHRlckFkZHIpICYgflJGQ1JfUkVTRVRfU0FWRTsKKwkvKiByZXN0b3JlIFBNQVRDSCAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJd3JpdGVsKGkqMiwgaW9hZGRyICsgUnhGaWx0ZXJBZGRyKTsKKwkJd3JpdGV3KHBtYXRjaFtpXSwgaW9hZGRyICsgUnhGaWx0ZXJEYXRhKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQl3cml0ZWwoMHhhKyhpKjIpLCBpb2FkZHIgKyBSeEZpbHRlckFkZHIpOworCQl3cml0ZXcoc29wYXNzW2ldLCBpb2FkZHIgKyBSeEZpbHRlckRhdGEpOworCX0KKwkvKiByZXN0b3JlIFJGQ1IgKi8KKwl3cml0ZWwocmZjciwgaW9hZGRyICsgUnhGaWx0ZXJBZGRyKTsKK30KKworc3RhdGljIHZvaWQgbmF0c2VtaV9yZWxvYWRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKwlpbnQgaTsKKworCXdyaXRlbChFZXByb21SZWxvYWQsIGlvYWRkciArIFBDSUJ1c0NmZyk7CisJZm9yIChpPTA7aTxOQVRTRU1JX0hXX1RJTUVPVVQ7aSsrKSB7CisJCXVkZWxheSg1MCk7CisJCWlmICghKHJlYWRsKGlvYWRkciArIFBDSUJ1c0NmZykgJiBFZXByb21SZWxvYWQpKQorCQkJYnJlYWs7CisJfQorCWlmIChpPT1OQVRTRU1JX0hXX1RJTUVPVVQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibmF0c2VtaSAlczogRUVQUk9NIGRpZCBub3QgcmVsb2FkIGluICVkIHVzZWMuXG4iLAorCQkJcGNpX25hbWUobnAtPnBjaV9kZXYpLCBpKjUwKTsKKwl9IGVsc2UgaWYgKG5ldGlmX21zZ19odyhucCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIm5hdHNlbWkgJXM6IEVFUFJPTSByZWxvYWRlZCBpbiAlZCB1c2VjLlxuIiwKKwkJCXBjaV9uYW1lKG5wLT5wY2lfZGV2KSwgaSo1MCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBuYXRzZW1pX3N0b3Bfcnh0eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXZvaWQgX19pb21lbSAqIGlvYWRkciA9IG5zX2lvYWRkcihkZXYpOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJd3JpdGVsKFJ4T2ZmIHwgVHhPZmYsIGlvYWRkciArIENoaXBDbWQpOworCWZvcihpPTA7aTwgTkFUU0VNSV9IV19USU1FT1VUO2krKykgeworCQlpZiAoKHJlYWRsKGlvYWRkciArIENoaXBDbWQpICYgKFR4T258UnhPbikpID09IDApCisJCQlicmVhazsKKwkJdWRlbGF5KDUpOworCX0KKwlpZiAoaT09TkFUU0VNSV9IV19USU1FT1VUKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUeC9SeCBwcm9jZXNzIGRpZCBub3Qgc3RvcCBpbiAlZCB1c2VjLlxuIiwKKwkJCWRldi0+bmFtZSwgaSo1KTsKKwl9IGVsc2UgaWYgKG5ldGlmX21zZ19odyhucCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUeC9SeCBwcm9jZXNzIHN0b3BwZWQgaW4gJWQgdXNlYy5cbiIsCisJCQlkZXYtPm5hbWUsIGkqNSk7CisJfQorfQorCitzdGF0aWMgaW50IG5ldGRldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICogaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisJaW50IGk7CisKKwkvKiBSZXNldCB0aGUgY2hpcCwganVzdCBpbiBjYXNlLiAqLworCW5hdHNlbWlfcmVzZXQoZGV2KTsKKworCWkgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJmludHJfaGFuZGxlciwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAoaSkgcmV0dXJuIGk7CisKKwlpZiAobmV0aWZfbXNnX2lmdXAobnApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG5ldGRldl9vcGVuKCkgaXJxICVkLlxuIiwKKwkJCWRldi0+bmFtZSwgZGV2LT5pcnEpOworCWkgPSBhbGxvY19yaW5nKGRldik7CisJaWYgKGkgPCAwKSB7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlyZXR1cm4gaTsKKwl9CisJaW5pdF9yaW5nKGRldik7CisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCWluaXRfcmVnaXN0ZXJzKGRldik7CisJLyogbm93IHNldCB0aGUgTUFDIGFkZHJlc3MgYWNjb3JkaW5nIHRvIGRldi0+ZGV2X2FkZHIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXUxNiBtYWMgPSAoZGV2LT5kZXZfYWRkclsyKmkrMV08PDgpICsgZGV2LT5kZXZfYWRkclsyKmldOworCisJCXdyaXRlbChpKjIsIGlvYWRkciArIFJ4RmlsdGVyQWRkcik7CisJCXdyaXRldyhtYWMsIGlvYWRkciArIFJ4RmlsdGVyRGF0YSk7CisJfQorCXdyaXRlbChucC0+Y3VyX3J4X21vZGUsIGlvYWRkciArIFJ4RmlsdGVyQWRkcik7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJaWYgKG5ldGlmX21zZ19pZnVwKG5wKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBEb25lIG5ldGRldl9vcGVuKCksIHN0YXR1czogJSMwOHguXG4iLAorCQkJZGV2LT5uYW1lLCAoaW50KXJlYWRsKGlvYWRkciArIENoaXBDbWQpKTsKKworCS8qIFNldCB0aGUgdGltZXIgdG8gY2hlY2sgZm9yIGxpbmsgYmVhdC4gKi8KKwlpbml0X3RpbWVyKCZucC0+dGltZXIpOworCW5wLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIE5BVFNFTUlfVElNRVJfRlJFUTsKKwlucC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlucC0+dGltZXIuZnVuY3Rpb24gPSAmbmV0ZGV2X3RpbWVyOyAvKiB0aW1lciBoYW5kbGVyICovCisJYWRkX3RpbWVyKCZucC0+dGltZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2NhYmxlX21hZ2ljKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKworCWlmIChkZXYtPmlmX3BvcnQgIT0gUE9SVF9UUCkKKwkJcmV0dXJuOworCisJaWYgKG5wLT5zcnIgPj0gU1JSX0RQODM4MTZfQTUpCisJCXJldHVybjsKKworCS8qCisJICogMTAwIE1CaXQgbGlua3Mgd2l0aCBzaG9ydCBjYWJsZXMgY2FuIHRyaXAgYW4gaXNzdWUgd2l0aCB0aGUgY2hpcC4KKwkgKiBUaGUgcHJvYmxlbSBtYW5pZmVzdHMgYXMgbG90cyBvZiBDUkMgZXJyb3JzIGFuZC9vciBmbGlja2VyaW5nCisJICogYWN0aXZpdHkgTEVEIHdoaWxlIGlkbGUuICBUaGlzIHByb2Nlc3MgaXMgYmFzZWQgb24gaW5zdHJ1Y3Rpb25zCisJICogZnJvbSBlbmdpbmVlcnMgYXQgTmF0aW9uYWwuCisJICovCisJaWYgKHJlYWRsKGlvYWRkciArIENoaXBDb25maWcpICYgQ2ZnU3BlZWQxMDApIHsKKwkJdTE2IGRhdGE7CisKKwkJd3JpdGV3KDEsIGlvYWRkciArIFBHU0VMKTsKKwkJLyoKKwkJICogY29lZmZpY2llbnQgdmlzaWJpbGl0eSBzaG91bGQgYWxyZWFkeSBiZSBlbmFibGVkIHZpYQorCQkgKiBEU1BDRkcgfCAweDEwMDAKKwkJICovCisJCWRhdGEgPSByZWFkdyhpb2FkZHIgKyBUU1REQVQpICYgMHhmZjsKKwkJLyoKKwkJICogdGhlIHZhbHVlIG11c3QgYmUgbmVnYXRpdmUsIGFuZCB3aXRoaW4gY2VydGFpbiB2YWx1ZXMKKwkJICogKHRoZXNlIHZhbHVlcyBhbGwgY29tZSBmcm9tIE5hdGlvbmFsKQorCQkgKi8KKwkJaWYgKCEoZGF0YSAmIDB4ODApIHx8ICgoZGF0YSA+PSAweGQ4KSAmJiAoZGF0YSA8PSAweGZmKSkpIHsKKwkJCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJCQkvKiB0aGUgYnVnIGhhcyBiZWVuIHRyaWdnZXJlZCAtIGZpeCB0aGUgY29lZmZpY2llbnQgKi8KKwkJCXdyaXRldyhUU1REQVRfRklYRUQsIGlvYWRkciArIFRTVERBVCk7CisJCQkvKiBsb2NrIHRoZSB2YWx1ZSAqLworCQkJZGF0YSA9IHJlYWR3KGlvYWRkciArIERTUENGRyk7CisJCQlucC0+ZHNwY2ZnID0gZGF0YSB8IERTUENGR19MT0NLOworCQkJd3JpdGV3KG5wLT5kc3BjZmcsIGlvYWRkciArIERTUENGRyk7CisJCX0KKwkJd3JpdGV3KDAsIGlvYWRkciArIFBHU0VMKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVuZG9fY2FibGVfbWFnaWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1MTYgZGF0YTsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKiBpb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKworCWlmIChkZXYtPmlmX3BvcnQgIT0gUE9SVF9UUCkKKwkJcmV0dXJuOworCisJaWYgKG5wLT5zcnIgPj0gU1JSX0RQODM4MTZfQTUpCisJCXJldHVybjsKKworCXdyaXRldygxLCBpb2FkZHIgKyBQR1NFTCk7CisJLyogbWFrZSBzdXJlIHRoZSBsb2NrIGJpdCBpcyBjbGVhciAqLworCWRhdGEgPSByZWFkdyhpb2FkZHIgKyBEU1BDRkcpOworCW5wLT5kc3BjZmcgPSBkYXRhICYgfkRTUENGR19MT0NLOworCXdyaXRldyhucC0+ZHNwY2ZnLCBpb2FkZHIgKyBEU1BDRkcpOworCXdyaXRldygwLCBpb2FkZHIgKyBQR1NFTCk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKiBpb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKwlpbnQgZHVwbGV4OworCXUxNiBibXNyOworICAgICAgIAorCS8qIFRoZSBsaW5rIHN0YXR1cyBmaWVsZCBpcyBsYXRjaGVkOiBpdCByZW1haW5zIGxvdyBhZnRlciBhIHRlbXBvcmFyeQorCSAqIGxpbmsgZmFpbHVyZSB1bnRpbCBpdCdzIHJlYWQuIFdlIG5lZWQgdGhlIGN1cnJlbnQgbGluayBzdGF0dXMsCisJICogdGh1cyByZWFkIHR3aWNlLgorCSAqLworCW1kaW9fcmVhZChkZXYsIE1JSV9CTVNSKTsKKwlibXNyID0gbWRpb19yZWFkKGRldiwgTUlJX0JNU1IpOworCisJaWYgKCEoYm1zciAmIEJNU1JfTFNUQVRVUykpIHsKKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQkJaWYgKG5ldGlmX21zZ19saW5rKG5wKSkKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBsaW5rIGRvd24uXG4iLAorCQkJCQlkZXYtPm5hbWUpOworCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJCXVuZG9fY2FibGVfbWFnaWMoZGV2KTsKKwkJfQorCQlyZXR1cm47CisJfQorCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJCWlmIChuZXRpZl9tc2dfbGluayhucCkpCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBsaW5rIHVwLlxuIiwgZGV2LT5uYW1lKTsKKwkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQlkb19jYWJsZV9tYWdpYyhkZXYpOworCX0KKworCWR1cGxleCA9IG5wLT5mdWxsX2R1cGxleDsKKwlpZiAoIWR1cGxleCkgeworCQlpZiAoYm1zciAmIEJNU1JfQU5FR0NPTVBMRVRFKSB7CisJCQlpbnQgdG1wID0gbWlpX253YXlfcmVzdWx0KAorCQkJCW5wLT5hZHZlcnRpc2luZyAmIG1kaW9fcmVhZChkZXYsIE1JSV9MUEEpKTsKKwkJCWlmICh0bXAgPT0gTFBBXzEwMEZVTEwgfHwgdG1wID09IExQQV8xMEZVTEwpCisJCQkJZHVwbGV4ID0gMTsKKwkJfSBlbHNlIGlmIChtZGlvX3JlYWQoZGV2LCBNSUlfQk1DUikgJiBCTUNSX0ZVTExEUExYKQorCQkJZHVwbGV4ID0gMTsKKwl9CisKKwkvKiBpZiBkdXBsZXggaXMgc2V0IHRoZW4gYml0IDI4IG11c3QgYmUgc2V0LCB0b28gKi8KKwlpZiAoZHVwbGV4IF4gISEobnAtPnJ4X2NvbmZpZyAmIFJ4QWNjZXB0VHgpKSB7CisJCWlmIChuZXRpZl9tc2dfbGluayhucCkpCisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJIiVzOiBTZXR0aW5nICVzLWR1cGxleCBiYXNlZCBvbiBuZWdvdGlhdGVkICIKKwkJCQkibGluayBjYXBhYmlsaXR5LlxuIiwgZGV2LT5uYW1lLAorCQkJCWR1cGxleCA/ICJmdWxsIiA6ICJoYWxmIik7CisJCWlmIChkdXBsZXgpIHsKKwkJCW5wLT5yeF9jb25maWcgfD0gUnhBY2NlcHRUeDsKKwkJCW5wLT50eF9jb25maWcgfD0gVHhDYXJyaWVySWduIHwgVHhIZWFydElnbjsKKwkJfSBlbHNlIHsKKwkJCW5wLT5yeF9jb25maWcgJj0gflJ4QWNjZXB0VHg7CisJCQlucC0+dHhfY29uZmlnICY9IH4oVHhDYXJyaWVySWduIHwgVHhIZWFydElnbik7CisJCX0KKwkJd3JpdGVsKG5wLT50eF9jb25maWcsIGlvYWRkciArIFR4Q29uZmlnKTsKKwkJd3JpdGVsKG5wLT5yeF9jb25maWcsIGlvYWRkciArIFJ4Q29uZmlnKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcmVnaXN0ZXJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICogaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisKKwlpbml0X3BoeV9maXh1cChkZXYpOworCisJLyogY2xlYXIgYW55IGludGVycnVwdHMgdGhhdCBhcmUgcGVuZGluZywgc3VjaCBhcyB3YWtlIGV2ZW50cyAqLworCXJlYWRsKGlvYWRkciArIEludHJTdGF0dXMpOworCisJd3JpdGVsKG5wLT5yaW5nX2RtYSwgaW9hZGRyICsgUnhSaW5nUHRyKTsKKwl3cml0ZWwobnAtPnJpbmdfZG1hICsgUlhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCBuZXRkZXZfZGVzYyksCisJCWlvYWRkciArIFR4UmluZ1B0cik7CisKKwkvKiBJbml0aWFsaXplIG90aGVyIHJlZ2lzdGVycy4KKwkgKiBDb25maWd1cmUgdGhlIFBDSSBidXMgYnVyc3RzIGFuZCBGSUZPIHRocmVzaG9sZHMuCisJICogQ29uZmlndXJlIGZvciBzdGFuZGFyZCwgaW4tc3BlYyBFdGhlcm5ldC4KKwkgKiBTdGFydCB3aXRoIGhhbGYtZHVwbGV4LiBjaGVja19saW5rIHdpbGwgdXBkYXRlCisJICogdG8gdGhlIGNvcnJlY3Qgc2V0dGluZ3MuCisJICovCisKKwkvKiBEUlRIOiAyOiBzdGFydCB0eCBpZiA2NCBieXRlcyBhcmUgaW4gdGhlIGZpZm8KKwkgKiBGTFRIOiAweDEwOiByZWZpbGwgd2l0aCBuZXh0IHBhY2tldCBpZiA1MTIgYnl0ZXMgYXJlIGZyZWUKKwkgKiBNWERNQTogMDogdXAgdG8gMjU2IGJ5dGUgYnVyc3RzLgorCSAqIAlNWERNQSBtdXN0IGJlIDw9IEZMVEgKKwkgKiBFQ1JFVFJZPTEKKwkgKiBBVFA9MQorCSAqLworCW5wLT50eF9jb25maWcgPSBUeEF1dG9QYWQgfCBUeENvbGxSZXRyeSB8IFR4TXhkbWFfMjU2IHwKKwkJCQlUWF9GTFRIX1ZBTCB8IFRYX0RSVEhfVkFMX1NUQVJUOworCXdyaXRlbChucC0+dHhfY29uZmlnLCBpb2FkZHIgKyBUeENvbmZpZyk7CisKKwkvKiBEUlRIIDB4MTA6IHN0YXJ0IGNvcHlpbmcgdG8gbWVtb3J5IGlmIDEyOCBieXRlcyBhcmUgaW4gdGhlIGZpZm8KKwkgKiBNWERNQSAwOiB1cCB0byAyNTYgYnl0ZSBidXJzdHMKKwkgKi8KKwlucC0+cnhfY29uZmlnID0gUnhNeGRtYV8yNTYgfCBSWF9EUlRIX1ZBTDsKKwkvKiBpZiByZWNlaXZlIHJpbmcgbm93IGhhcyBiaWdnZXIgYnVmZmVycyB0aGFuIG5vcm1hbCwgZW5hYmxlIGp1bWJvICovCisJaWYgKG5wLT5yeF9idWZfc3ogPiBOQVRTRU1JX0xPTkdQS1QpCisJCW5wLT5yeF9jb25maWcgfD0gUnhBY2NlcHRMb25nOworCisJd3JpdGVsKG5wLT5yeF9jb25maWcsIGlvYWRkciArIFJ4Q29uZmlnKTsKKworCS8qIERpc2FibGUgUE1FOgorCSAqIFRoZSBQTUUgYml0IGlzIGluaXRpYWxpemVkIGZyb20gdGhlIEVFUFJPTSBjb250ZW50cy4KKwkgKiBQQ0kgY2FyZHMgcHJvYmFibHkgaGF2ZSBQTUUgZGlzYWJsZWQsIGJ1dCBtb3RoZXJib2FyZAorCSAqIGltcGxlbWVudGF0aW9ucyBtYXkgaGF2ZSBQTUUgc2V0IHRvIGVuYWJsZSBXYWtlT25MYW4uCisJICogV2l0aCBQTUUgc2V0IHRoZSBjaGlwIHdpbGwgc2NhbiBpbmNvbWluZyBwYWNrZXRzIGJ1dAorCSAqIG5vdGhpbmcgd2lsbCBiZSB3cml0dGVuIHRvIG1lbW9yeS4gKi8KKwlucC0+U2F2ZWRDbGtSdW4gPSByZWFkbChpb2FkZHIgKyBDbGtSdW4pOworCXdyaXRlbChucC0+U2F2ZWRDbGtSdW4gJiB+UE1FRW5hYmxlLCBpb2FkZHIgKyBDbGtSdW4pOworCWlmIChucC0+U2F2ZWRDbGtSdW4gJiBQTUVTdGF0dXMgJiYgbmV0aWZfbXNnX3dvbChucCkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogV2FrZS11cCBldmVudCAlIzA4eFxuIiwKKwkJCWRldi0+bmFtZSwgcmVhZGwoaW9hZGRyICsgV09MQ21kKSk7CisJfQorCisJY2hlY2tfbGluayhkZXYpOworCV9fc2V0X3J4X21vZGUoZGV2KTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCXdyaXRlbChERUZBVUxUX0lOVFIsIGlvYWRkciArIEludHJNYXNrKTsKKwl3cml0ZWwoMSwgaW9hZGRyICsgSW50ckVuYWJsZSk7CisKKwl3cml0ZWwoUnhPbiB8IFR4T24sIGlvYWRkciArIENoaXBDbWQpOworCXdyaXRlbChTdGF0c0NsZWFyLCBpb2FkZHIgKyBTdGF0c0N0cmwpOyAvKiBDbGVhciBTdGF0cyAqLworfQorCisvKgorICogbmV0ZGV2X3RpbWVyOgorICogUHVycG9zZToKKyAqIDEpIGNoZWNrIGZvciBsaW5rIGNoYW5nZXMuIFVzdWFsbHkgdGhleSBhcmUgaGFuZGxlZCBieSB0aGUgTUlJIGludGVycnVwdAorICogICAgYnV0IGl0IGRvZXNuJ3QgaHVydCB0byBjaGVjayB0d2ljZS4KKyAqIDIpIGNoZWNrIGZvciBzdWRkZW4gZGVhdGggb2YgdGhlIE5JQzoKKyAqICAgIEl0IHNlZW1zIHRoYXQgYSByZWZlcmVuY2Ugc2V0IGZvciB0aGlzIGNoaXAgd2VudCBvdXQgd2l0aCBpbmNvcnJlY3QgaW5mbywKKyAqICAgIGFuZCB0aGVyZSBleGlzdCBib2FyZHMgdGhhdCBhcmVuJ3QgcXVpdGUgcmlnaHQuICBBbiB1bmV4cGVjdGVkIHZvbHRhZ2UKKyAqICAgIGRyb3AgY2FuIGNhdXNlIHRoZSBQSFkgdG8gZ2V0IGl0c2VsZiBpbiBhIHdlaXJkIHN0YXRlIChiYXNpY2FsbHkgcmVzZXQpLgorICogICAgTk9URTogdGhpcyBvbmx5IHNlZW1zIHRvIGFmZmVjdCByZXZDIGNoaXBzLgorICogMykgY2hlY2sgb2YgZGVhdGggb2YgdGhlIFJYIHBhdGggZHVlIHRvIE9PTQorICovCitzdGF0aWMgdm9pZCBuZXRkZXZfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqIGlvYWRkciA9IG5zX2lvYWRkcihkZXYpOworCWludCBuZXh0X3RpY2sgPSA1KkhaOworCisJaWYgKG5ldGlmX21zZ190aW1lcihucCkpIHsKKwkJLyogRE8gTk9UIHJlYWQgdGhlIEludHJTdGF0dXMgcmVnaXN0ZXIsCisJCSAqIGEgcmVhZCBjbGVhcnMgYW55IHBlbmRpbmcgaW50ZXJydXB0cy4KKwkJICovCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogTWVkaWEgc2VsZWN0aW9uIHRpbWVyIHRpY2suXG4iLAorCQkJZGV2LT5uYW1lKTsKKwl9CisKKwlpZiAoZGV2LT5pZl9wb3J0ID09IFBPUlRfVFApIHsKKwkJdTE2IGRzcGNmZzsKKworCQlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJCS8qIGNoZWNrIGZvciBhIG5hc3R5IHJhbmRvbSBwaHktcmVzZXQgLSB1c2UgZHNwY2ZnIGFzIGEgZmxhZyAqLworCQl3cml0ZXcoMSwgaW9hZGRyK1BHU0VMKTsKKwkJZHNwY2ZnID0gcmVhZHcoaW9hZGRyK0RTUENGRyk7CisJCXdyaXRldygwLCBpb2FkZHIrUEdTRUwpOworCQlpZiAoZHNwY2ZnICE9IG5wLT5kc3BjZmcpIHsKKwkJCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJCQkJaWYgKG5ldGlmX21zZ19odyhucCkpCisJCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHBvc3NpYmxlIHBoeSByZXNldDogIgorCQkJCQkJInJlLWluaXRpYWxpemluZ1xuIiwgZGV2LT5uYW1lKTsKKwkJCQlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJCQkJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCQkJCW5hdHNlbWlfc3RvcF9yeHR4KGRldik7CisJCQkJZHVtcF9yaW5nKGRldik7CisJCQkJcmVpbml0X3JpbmcoZGV2KTsKKwkJCQlpbml0X3JlZ2lzdGVycyhkZXYpOworCQkJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCQkJCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBodXJyeSBiYWNrICovCisJCQkJbmV4dF90aWNrID0gSFo7CisJCQkJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBpbml0X3JlZ2lzdGVycygpIGNhbGxzIGNoZWNrX2xpbmsoKSBmb3IgdGhlIGFib3ZlIGNhc2UgKi8KKwkJCWNoZWNrX2xpbmsoZGV2KTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCQl9CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCQljaGVja19saW5rKGRldik7CisJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCX0KKwlpZiAobnAtPm9vbSkgeworCQlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJCW5wLT5vb20gPSAwOworCQlyZWZpbGxfcngoZGV2KTsKKwkJZW5hYmxlX2lycShkZXYtPmlycSk7CisJCWlmICghbnAtPm9vbSkgeworCQkJd3JpdGVsKFJ4T24sIGlvYWRkciArIENoaXBDbWQpOworCQl9IGVsc2UgeworCQkJbmV4dF90aWNrID0gMTsKKwkJfQorCX0KKwltb2RfdGltZXIoJm5wLT50aW1lciwgamlmZmllcyArIG5leHRfdGljayk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKG5ldGlmX21zZ19wa3RkYXRhKG5wKSkgeworCQlpbnQgaTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgVHggcmluZyBhdCAlcDpcbiIsIG5wLT50eF9yaW5nKTsKKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiICMlZCBkZXNjLiAlIzA4eCAlIzA4eCAlIzA4eC5cbiIsCisJCQkJaSwgbnAtPnR4X3JpbmdbaV0ubmV4dF9kZXNjLAorCQkJCW5wLT50eF9yaW5nW2ldLmNtZF9zdGF0dXMsCisJCQkJbnAtPnR4X3JpbmdbaV0uYWRkcik7CisJCX0KKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgUnggcmluZyAlcDpcbiIsIG5wLT5yeF9yaW5nKTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiICMlZCBkZXNjLiAlIzA4eCAlIzA4eCAlIzA4eC5cbiIsCisJCQkJaSwgbnAtPnJ4X3JpbmdbaV0ubmV4dF9kZXNjLAorCQkJCW5wLT5yeF9yaW5nW2ldLmNtZF9zdGF0dXMsCisJCQkJbnAtPnJ4X3JpbmdbaV0uYWRkcik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHR4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKiBpb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJaWYgKCFucC0+aGFuZHNfb2ZmKSB7CisJCWlmIChuZXRpZl9tc2dfdHhfZXJyKG5wKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkiJXM6IFRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICUjMDh4LCIKKwkJCQkiIHJlc2V0dGluZy4uLlxuIiwKKwkJCQlkZXYtPm5hbWUsIHJlYWRsKGlvYWRkciArIEludHJTdGF0dXMpKTsKKwkJZHVtcF9yaW5nKGRldik7CisKKwkJbmF0c2VtaV9yZXNldChkZXYpOworCQlyZWluaXRfcmluZyhkZXYpOworCQlpbml0X3JlZ2lzdGVycyhkZXYpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSIlczogdHhfdGltZW91dCB3aGlsZSBpbiBoYW5kc19vZmYgc3RhdGU/XG4iLAorCQkJZGV2LT5uYW1lKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlucC0+c3RhdHMudHhfZXJyb3JzKys7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IGFsbG9jX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlucC0+cnhfcmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KG5wLT5wY2lfZGV2LAorCQlzaXplb2Yoc3RydWN0IG5ldGRldl9kZXNjKSAqIChSWF9SSU5HX1NJWkUrVFhfUklOR19TSVpFKSwKKwkJJm5wLT5yaW5nX2RtYSk7CisJaWYgKCFucC0+cnhfcmluZykKKwkJcmV0dXJuIC1FTk9NRU07CisJbnAtPnR4X3JpbmcgPSAmbnAtPnJ4X3JpbmdbUlhfUklOR19TSVpFXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmVmaWxsX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBSZWZpbGwgdGhlIFJ4IHJpbmcgYnVmZmVycy4gKi8KKwlmb3IgKDsgbnAtPmN1cl9yeCAtIG5wLT5kaXJ0eV9yeCA+IDA7IG5wLT5kaXJ0eV9yeCsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWludCBlbnRyeSA9IG5wLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRTsKKwkJaWYgKG5wLT5yeF9za2J1ZmZbZW50cnldID09IE5VTEwpIHsKKwkJCXVuc2lnbmVkIGludCBidWZsZW4gPSBucC0+cnhfYnVmX3N6K05BVFNFTUlfUEFERElORzsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IoYnVmbGVuKTsKKwkJCW5wLT5yeF9za2J1ZmZbZW50cnldID0gc2tiOworCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJCWJyZWFrOyAvKiBCZXR0ZXIgbHVjayBuZXh0IHJvdW5kLiAqLworCQkJc2tiLT5kZXYgPSBkZXY7IC8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKwkJCW5wLT5yeF9kbWFbZW50cnldID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsCisJCQkJc2tiLT50YWlsLCBidWZsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlucC0+cnhfcmluZ1tlbnRyeV0uYWRkciA9IGNwdV90b19sZTMyKG5wLT5yeF9kbWFbZW50cnldKTsKKwkJfQorCQlucC0+cnhfcmluZ1tlbnRyeV0uY21kX3N0YXR1cyA9IGNwdV90b19sZTMyKG5wLT5yeF9idWZfc3opOworCX0KKwlpZiAobnAtPmN1cl9yeCAtIG5wLT5kaXJ0eV9yeCA9PSBSWF9SSU5HX1NJWkUpIHsKKwkJaWYgKG5ldGlmX21zZ19yeF9lcnIobnApKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGdvaW5nIE9PTS5cbiIsIGRldi0+bmFtZSk7CisJCW5wLT5vb20gPSAxOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0X2J1ZnNpemUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpZiAoZGV2LT5tdHUgPD0gRVRIX0RBVEFfTEVOKQorCQlucC0+cnhfYnVmX3N6ID0gRVRIX0RBVEFfTEVOICsgTkFUU0VNSV9IRUFERVJTOworCWVsc2UKKwkJbnAtPnJ4X2J1Zl9zeiA9IGRldi0+bXR1ICsgTkFUU0VNSV9IRUFERVJTOworfQorCisvKiBJbml0aWFsaXplIHRoZSBSeCBhbmQgVHggcmluZ3MsIGFsb25nIHdpdGggdmFyaW91cyAnZGV2JyBiaXRzLiAqLworc3RhdGljIHZvaWQgaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwkvKiAxKSBUWCByaW5nICovCisJbnAtPmRpcnR5X3R4ID0gbnAtPmN1cl90eCA9IDA7CisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCW5wLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQlucC0+dHhfcmluZ1tpXS5uZXh0X2Rlc2MgPSBjcHVfdG9fbGUzMihucC0+cmluZ19kbWEKKwkJCStzaXplb2Yoc3RydWN0IG5ldGRldl9kZXNjKQorCQkJKigoaSsxKSVUWF9SSU5HX1NJWkUrUlhfUklOR19TSVpFKSk7CisJCW5wLT50eF9yaW5nW2ldLmNtZF9zdGF0dXMgPSAwOworCX0KKworCS8qIDIpIFJYIHJpbmcgKi8KKwlucC0+ZGlydHlfcnggPSAwOworCW5wLT5jdXJfcnggPSBSWF9SSU5HX1NJWkU7CisJbnAtPm9vbSA9IDA7CisJc2V0X2J1ZnNpemUoZGV2KTsKKworCW5wLT5yeF9oZWFkX2Rlc2MgPSAmbnAtPnJ4X3JpbmdbMF07CisKKwkvKiBQbGVhc2UgYmUgY2FyZWZ1bGwgYmVmb3JlIGNoYW5naW5nIHRoaXMgbG9vcCAtIGF0IGxlYXN0IGdjYy0yLjk1LjEKKwkgKiBtaXNjb21waWxlcyBpdCBvdGhlcndpc2UuCisJICovCisJLyogSW5pdGlhbGl6ZSBhbGwgUnggZGVzY3JpcHRvcnMuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCW5wLT5yeF9yaW5nW2ldLm5leHRfZGVzYyA9IGNwdV90b19sZTMyKG5wLT5yaW5nX2RtYQorCQkJCStzaXplb2Yoc3RydWN0IG5ldGRldl9kZXNjKQorCQkJCSooKGkrMSklUlhfUklOR19TSVpFKSk7CisJCW5wLT5yeF9yaW5nW2ldLmNtZF9zdGF0dXMgPSBjcHVfdG9fbGUzMihEZXNjT3duKTsKKwkJbnAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJfQorCXJlZmlsbF9yeChkZXYpOworCWR1bXBfcmluZyhkZXYpOworfQorCitzdGF0aWMgdm9pZCBkcmFpbl90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCWlmIChucC0+dHhfc2tidWZmW2ldKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LAorCQkJCW5wLT50eF9kbWFbaV0sIG5wLT50eF9za2J1ZmZbaV0tPmxlbiwKKwkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IobnAtPnR4X3NrYnVmZltpXSk7CisJCQlucC0+c3RhdHMudHhfZHJvcHBlZCsrOworCQl9CisJCW5wLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgZHJhaW5fcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgYnVmbGVuID0gbnAtPnJ4X2J1Zl9zejsKKwlpbnQgaTsKKworCS8qIEZyZWUgYWxsIHRoZSBza2J1ZmZzIGluIHRoZSBSeCBxdWV1ZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJbnAtPnJ4X3JpbmdbaV0uY21kX3N0YXR1cyA9IDA7CisJCW5wLT5yeF9yaW5nW2ldLmFkZHIgPSAweEJBREYwMEQwOyAvKiBBbiBpbnZhbGlkIGFkZHJlc3MuICovCisJCWlmIChucC0+cnhfc2tidWZmW2ldKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LAorCQkJCW5wLT5yeF9kbWFbaV0sIGJ1ZmxlbiwKKwkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihucC0+cnhfc2tidWZmW2ldKTsKKwkJfQorCQlucC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRyYWluX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkcmFpbl9yeChkZXYpOworCWRyYWluX3R4KGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQobnAtPnBjaV9kZXYsCisJCXNpemVvZihzdHJ1Y3QgbmV0ZGV2X2Rlc2MpICogKFJYX1JJTkdfU0laRStUWF9SSU5HX1NJWkUpLAorCQlucC0+cnhfcmluZywgbnAtPnJpbmdfZG1hKTsKK30KKworc3RhdGljIHZvaWQgcmVpbml0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwkvKiBSWCBSaW5nICovCisJbnAtPmRpcnR5X3J4ID0gMDsKKwlucC0+Y3VyX3J4ID0gUlhfUklOR19TSVpFOworCW5wLT5yeF9oZWFkX2Rlc2MgPSAmbnAtPnJ4X3JpbmdbMF07CisJLyogSW5pdGlhbGl6ZSBhbGwgUnggZGVzY3JpcHRvcnMuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQorCQlucC0+cnhfcmluZ1tpXS5jbWRfc3RhdHVzID0gY3B1X3RvX2xlMzIoRGVzY093bik7CisKKwlyZWZpbGxfcngoZGV2KTsKK30KKworc3RhdGljIHZvaWQgcmVpbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCS8qIGRyYWluIFRYIHJpbmcgKi8KKwlkcmFpbl90eChkZXYpOworCW5wLT5kaXJ0eV90eCA9IG5wLT5jdXJfdHggPSAwOworCWZvciAoaT0wO2k8VFhfUklOR19TSVpFO2krKykKKwkJbnAtPnR4X3JpbmdbaV0uY21kX3N0YXR1cyA9IDA7CisKKwlyZWluaXRfcngoZGV2KTsKK30KKworc3RhdGljIGludCBzdGFydF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqIGlvYWRkciA9IG5zX2lvYWRkcihkZXYpOworCXVuc2lnbmVkIGVudHJ5OworCisJLyogTm90ZTogT3JkZXJpbmcgaXMgaW1wb3J0YW50IGhlcmUsIHNldCB0aGUgZmllbGQgd2l0aCB0aGUKKwkgICAib3duZXJzaGlwIiBiaXQgbGFzdCwgYW5kIG9ubHkgdGhlbiBpbmNyZW1lbnQgY3VyX3R4LiAqLworCisJLyogQ2FsY3VsYXRlIHRoZSBuZXh0IFR4IGRlc2NyaXB0b3IgZW50cnkuICovCisJZW50cnkgPSBucC0+Y3VyX3R4ICUgVFhfUklOR19TSVpFOworCisJbnAtPnR4X3NrYnVmZltlbnRyeV0gPSBza2I7CisJbnAtPnR4X2RtYVtlbnRyeV0gPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2RldiwKKwkJCQlza2ItPmRhdGEsc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJbnAtPnR4X3JpbmdbZW50cnldLmFkZHIgPSBjcHVfdG9fbGUzMihucC0+dHhfZG1hW2VudHJ5XSk7CisKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisKKwlpZiAoIW5wLT5oYW5kc19vZmYpIHsKKwkJbnAtPnR4X3JpbmdbZW50cnldLmNtZF9zdGF0dXMgPSBjcHVfdG9fbGUzMihEZXNjT3duIHwgc2tiLT5sZW4pOworCQkvKiBTdHJvbmdBUk06IEV4cGxpY2l0bHkgY2FjaGUgZmx1c2ggbnAtPnR4X3JpbmcgYW5kCisJCSAqIHNrYi0+ZGF0YSxza2ItPmxlbi4gKi8KKwkJd21iKCk7CisJCW5wLT5jdXJfdHgrKzsKKwkJaWYgKG5wLT5jdXJfdHggLSBucC0+ZGlydHlfdHggPj0gVFhfUVVFVUVfTEVOIC0gMSkgeworCQkJbmV0ZGV2X3R4X2RvbmUoZGV2KTsKKwkJCWlmIChucC0+Y3VyX3R4IC0gbnAtPmRpcnR5X3R4ID49IFRYX1FVRVVFX0xFTiAtIDEpCisJCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQl9CisJCS8qIFdha2UgdGhlIHBvdGVudGlhbGx5LWlkbGUgdHJhbnNtaXQgY2hhbm5lbC4gKi8KKwkJd3JpdGVsKFR4T24sIGlvYWRkciArIENoaXBDbWQpOworCX0gZWxzZSB7CisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCW5wLT5zdGF0cy50eF9kcm9wcGVkKys7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlpZiAobmV0aWZfbXNnX3R4X3F1ZXVlZChucCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdCBmcmFtZSAjJWQgcXVldWVkIGluIHNsb3QgJWQuXG4iLAorCQkJZGV2LT5uYW1lLCBucC0+Y3VyX3R4LCBlbnRyeSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfdHhfZG9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZm9yICg7IG5wLT5jdXJfdHggLSBucC0+ZGlydHlfdHggPiAwOyBucC0+ZGlydHlfdHgrKykgeworCQlpbnQgZW50cnkgPSBucC0+ZGlydHlfdHggJSBUWF9SSU5HX1NJWkU7CisJCWlmIChucC0+dHhfcmluZ1tlbnRyeV0uY21kX3N0YXR1cyAmIGNwdV90b19sZTMyKERlc2NPd24pKQorCQkJYnJlYWs7CisJCWlmIChuZXRpZl9tc2dfdHhfZG9uZShucCkpCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSIlczogdHggZnJhbWUgIyVkIGZpbmlzaGVkLCBzdGF0dXMgJSMwOHguXG4iLAorCQkJCQlkZXYtPm5hbWUsIG5wLT5kaXJ0eV90eCwKKwkJCQkJbGUzMl90b19jcHUobnAtPnR4X3JpbmdbZW50cnldLmNtZF9zdGF0dXMpKTsKKwkJaWYgKG5wLT50eF9yaW5nW2VudHJ5XS5jbWRfc3RhdHVzICYgY3B1X3RvX2xlMzIoRGVzY1BrdE9LKSkgeworCQkJbnAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCW5wLT5zdGF0cy50eF9ieXRlcyArPSBucC0+dHhfc2tidWZmW2VudHJ5XS0+bGVuOworCQl9IGVsc2UgeyAvKiBWYXJpb3VzIFR4IGVycm9ycyAqLworCQkJaW50IHR4X3N0YXR1cyA9CisJCQkJbGUzMl90b19jcHUobnAtPnR4X3JpbmdbZW50cnldLmNtZF9zdGF0dXMpOworCQkJaWYgKHR4X3N0YXR1cyAmIChEZXNjVHhBYm9ydHxEZXNjVHhFeGNDb2xsKSkKKwkJCQlucC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWlmICh0eF9zdGF0dXMgJiBEZXNjVHhGSUZPKQorCQkJCW5wLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJaWYgKHR4X3N0YXR1cyAmIERlc2NUeENhcnJpZXIpCisJCQkJbnAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQlpZiAodHhfc3RhdHVzICYgRGVzY1R4T09XQ29sKQorCQkJCW5wLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCQlucC0+c3RhdHMudHhfZXJyb3JzKys7CisJCX0KKwkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldixucC0+dHhfZG1hW2VudHJ5XSwKKwkJCQkJbnAtPnR4X3NrYnVmZltlbnRyeV0tPmxlbiwKKwkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCS8qIEZyZWUgdGhlIG9yaWdpbmFsIHNrYi4gKi8KKwkJZGV2X2tmcmVlX3NrYl9pcnEobnAtPnR4X3NrYnVmZltlbnRyeV0pOworCQlucC0+dHhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJfQorCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikKKwkJJiYgbnAtPmN1cl90eCAtIG5wLT5kaXJ0eV90eCA8IFRYX1FVRVVFX0xFTiAtIDQpIHsKKwkJLyogVGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwsIHdha2UgcXVldWUuICovCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9Cit9CisKKy8qIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBkb2VzIGFsbCBvZiB0aGUgUnggdGhyZWFkIHdvcmsgYW5kIGNsZWFucyB1cAorICAgYWZ0ZXIgdGhlIFR4IHRocmVhZC4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBpbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICogaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisJaW50IGJvZ3VzY250ID0gbWF4X2ludGVycnVwdF93b3JrOworCXVuc2lnbmVkIGludCBoYW5kbGVkID0gMDsKKworCWlmIChucC0+aGFuZHNfb2ZmKQorCQlyZXR1cm4gSVJRX05PTkU7CisJZG8geworCQkvKiBSZWFkaW5nIGF1dG9tYXRpY2FsbHkgYWNrbm93bGVkZ2VzIGFsbCBpbnQgc291cmNlcy4gKi8KKwkJdTMyIGludHJfc3RhdHVzID0gcmVhZGwoaW9hZGRyICsgSW50clN0YXR1cyk7CisKKwkJaWYgKG5ldGlmX21zZ19pbnRyKG5wKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJIiVzOiBJbnRlcnJ1cHQsIHN0YXR1cyAlIzA4eCwgbWFzayAlIzA4eC5cbiIsCisJCQkJZGV2LT5uYW1lLCBpbnRyX3N0YXR1cywKKwkJCQlyZWFkbChpb2FkZHIgKyBJbnRyTWFzaykpOworCisJCWlmIChpbnRyX3N0YXR1cyA9PSAwKQorCQkJYnJlYWs7CisJCWhhbmRsZWQgPSAxOworCisJCWlmIChpbnRyX3N0YXR1cyAmCisJCSAgIChJbnRyUnhEb25lIHwgSW50clJ4SW50ciB8IFJ4U3RhdHVzRklGT092ZXIgfAorCQkgICAgSW50clJ4RXJyIHwgSW50clJ4T3ZlcnJ1bikpIHsKKwkJCW5ldGRldl9yeChkZXYpOworCQl9CisKKwkJaWYgKGludHJfc3RhdHVzICYKKwkJICAgKEludHJUeERvbmUgfCBJbnRyVHhJbnRyIHwgSW50clR4SWRsZSB8IEludHJUeEVycikpIHsKKwkJCXNwaW5fbG9jaygmbnAtPmxvY2spOworCQkJbmV0ZGV2X3R4X2RvbmUoZGV2KTsKKwkJCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7CisJCX0KKworCQkvKiBBYm5vcm1hbCBlcnJvciBzdW1tYXJ5L3VuY29tbW9uIGV2ZW50cyBoYW5kbGVycy4gKi8KKwkJaWYgKGludHJfc3RhdHVzICYgSW50ckFibm9ybWFsU3VtbWFyeSkKKwkJCW5ldGRldl9lcnJvcihkZXYsIGludHJfc3RhdHVzKTsKKworCQlpZiAoLS1ib2d1c2NudCA8IDApIHsKKwkJCWlmIChuZXRpZl9tc2dfaW50cihucCkpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkiJXM6IFRvbyBtdWNoIHdvcmsgYXQgaW50ZXJydXB0LCAiCisJCQkJCSJzdGF0dXM9JSMwOHguXG4iLAorCQkJCQlkZXYtPm5hbWUsIGludHJfc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwlpZiAobmV0aWZfbXNnX2ludHIobnApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4aXRpbmcgaW50ZXJydXB0LlxuIiwgZGV2LT5uYW1lKTsKKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKiBUaGlzIHJvdXRpbmUgaXMgbG9naWNhbGx5IHBhcnQgb2YgdGhlIGludGVycnVwdCBoYW5kbGVyLCBidXQgc2VwYXJhdGVkCisgICBmb3IgY2xhcml0eSBhbmQgYmV0dGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24uICovCitzdGF0aWMgdm9pZCBuZXRkZXZfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZW50cnkgPSBucC0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOworCWludCBib2d1c2NudCA9IG5wLT5kaXJ0eV9yeCArIFJYX1JJTkdfU0laRSAtIG5wLT5jdXJfcng7CisJczMyIGRlc2Nfc3RhdHVzID0gbGUzMl90b19jcHUobnAtPnJ4X2hlYWRfZGVzYy0+Y21kX3N0YXR1cyk7CisJdW5zaWduZWQgaW50IGJ1ZmxlbiA9IG5wLT5yeF9idWZfc3o7CisJdm9pZCBfX2lvbWVtICogaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisKKwkvKiBJZiB0aGUgZHJpdmVyIG93bnMgdGhlIG5leHQgZW50cnkgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCisJd2hpbGUgKGRlc2Nfc3RhdHVzIDwgMCkgeyAvKiBlLmcuICYgRGVzY093biAqLworCQlpbnQgcGt0X2xlbjsKKwkJaWYgKG5ldGlmX21zZ19yeF9zdGF0dXMobnApKQorCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkiICBuZXRkZXZfcngoKSBlbnRyeSAlZCBzdGF0dXMgd2FzICUjMDh4LlxuIiwKKwkJCQllbnRyeSwgZGVzY19zdGF0dXMpOworCQlpZiAoLS1ib2d1c2NudCA8IDApCisJCQlicmVhazsKKwkJcGt0X2xlbiA9IChkZXNjX3N0YXR1cyAmIERlc2NTaXplTWFzaykgLSA0OworCQlpZiAoKGRlc2Nfc3RhdHVzJihEZXNjTW9yZXxEZXNjUGt0T0t8RGVzY1J4TG9uZykpICE9IERlc2NQa3RPSyl7CisJCQlpZiAoZGVzY19zdGF0dXMgJiBEZXNjTW9yZSkgeworCQkJCWlmIChuZXRpZl9tc2dfcnhfZXJyKG5wKSkKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkJIiVzOiBPdmVyc2l6ZWQoPykgRXRoZXJuZXQgIgorCQkJCQkJImZyYW1lIHNwYW5uZWQgbXVsdGlwbGUgIgorCQkJCQkJImJ1ZmZlcnMsIGVudHJ5ICUjMDh4ICIKKwkJCQkJCSJzdGF0dXMgJSMwOHguXG4iLCBkZXYtPm5hbWUsCisJCQkJCQlucC0+Y3VyX3J4LCBkZXNjX3N0YXR1cyk7CisJCQkJbnAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCX0gZWxzZSB7CisJCQkJLyogVGhlcmUgd2FzIGFuIGVycm9yLiAqLworCQkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlpZiAoZGVzY19zdGF0dXMgJiAoRGVzY1J4QWJvcnR8RGVzY1J4T3ZlcikpCisJCQkJCW5wLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJCWlmIChkZXNjX3N0YXR1cyAmIChEZXNjUnhMb25nfERlc2NSeFJ1bnQpKQorCQkJCQlucC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCWlmIChkZXNjX3N0YXR1cyAmIChEZXNjUnhJbnZhbGlkfERlc2NSeEFsaWduKSkKKwkJCQkJbnAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCWlmIChkZXNjX3N0YXR1cyAmIERlc2NSeENSQykKKwkJCQkJbnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCX0KKwkJfSBlbHNlIGlmIChwa3RfbGVuID4gbnAtPnJ4X2J1Zl9zeikgeworCQkJLyogaWYgdGhpcyBpcyB0aGUgdGFpbCBvZiBhIGRvdWJsZSBidWZmZXIKKwkJCSAqIHBhY2tldCwgd2UndmUgYWxyZWFkeSBjb3VudGVkIHRoZSBlcnJvcgorCQkJICogb24gdGhlIGZpcnN0IHBhcnQuICBJZ25vcmUgdGhlIHNlY29uZCBoYWxmLgorCQkJICovCisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJLyogT21pdCBDUkMgc2l6ZS4gKi8KKwkJCS8qIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgbG9uZyBlbm91Z2ggdG8gYWNjZXB0CisJCQkgKiB3aXRob3V0IGNvcHlpbmcgdG8gYSBtaW5pbWFsbHktc2l6ZWQgc2tidWZmLiAqLworCQkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsKKwkJCSAgICAmJiAoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgUlhfT0ZGU0VUKSkgIT0gTlVMTCkgeworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLworCQkJCXNrYl9yZXNlcnZlKHNrYiwgUlhfT0ZGU0VUKTsKKwkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobnAtPnBjaV9kZXYsCisJCQkJCW5wLT5yeF9kbWFbZW50cnldLAorCQkJCQlidWZsZW4sCisJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsCisJCQkJCW5wLT5yeF9za2J1ZmZbZW50cnldLT50YWlsLCBwa3RfbGVuLCAwKTsKKwkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG5wLT5wY2lfZGV2LAorCQkJCQlucC0+cnhfZG1hW2VudHJ5XSwKKwkJCQkJYnVmbGVuLAorCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJfSBlbHNlIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBucC0+cnhfZG1hW2VudHJ5XSwKKwkJCQkJYnVmbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCXNrYl9wdXQoc2tiID0gbnAtPnJ4X3NrYnVmZltlbnRyeV0sIHBrdF9sZW4pOworCQkJCW5wLT5yeF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJCX0KKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCW5wLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlucC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJfQorCQllbnRyeSA9ICgrK25wLT5jdXJfcngpICUgUlhfUklOR19TSVpFOworCQlucC0+cnhfaGVhZF9kZXNjID0gJm5wLT5yeF9yaW5nW2VudHJ5XTsKKwkJZGVzY19zdGF0dXMgPSBsZTMyX3RvX2NwdShucC0+cnhfaGVhZF9kZXNjLT5jbWRfc3RhdHVzKTsKKwl9CisJcmVmaWxsX3J4KGRldik7CisKKwkvKiBSZXN0YXJ0IFJ4IGVuZ2luZSBpZiBzdG9wcGVkLiAqLworCWlmIChucC0+b29tKQorCQltb2RfdGltZXIoJm5wLT50aW1lciwgamlmZmllcyArIDEpOworCWVsc2UKKwkJd3JpdGVsKFJ4T24sIGlvYWRkciArIENoaXBDbWQpOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGludHJfc3RhdHVzKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqIGlvYWRkciA9IG5zX2lvYWRkcihkZXYpOworCisJc3Bpbl9sb2NrKCZucC0+bG9jayk7CisJaWYgKGludHJfc3RhdHVzICYgTGlua0NoYW5nZSkgeworCQl1MTYgbHBhID0gbWRpb19yZWFkKGRldiwgTUlJX0xQQSk7CisJCWlmIChtZGlvX3JlYWQoZGV2LCBNSUlfQk1DUikgJiBCTUNSX0FORU5BQkxFCisJCSAmJiBuZXRpZl9tc2dfbGluayhucCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IEF1dG9uZWdvdGlhdGlvbiBhZHZlcnRpc2luZyIKKwkJCQkiICUjMDR4ICBwYXJ0bmVyICUjMDR4LlxuIiwgZGV2LT5uYW1lLAorCQkJCW5wLT5hZHZlcnRpc2luZywgbHBhKTsKKwkJfQorCisJCS8qIHJlYWQgTUlJIGludCBzdGF0dXMgdG8gY2xlYXIgdGhlIGZsYWcgKi8KKwkJcmVhZHcoaW9hZGRyICsgTUludHJTdGF0dXMpOworCQljaGVja19saW5rKGRldik7CisJfQorCWlmIChpbnRyX3N0YXR1cyAmIFN0YXRzTWF4KSB7CisJCV9fZ2V0X3N0YXRzKGRldik7CisJfQorCWlmIChpbnRyX3N0YXR1cyAmIEludHJUeFVuZGVycnVuKSB7CisJCWlmICgobnAtPnR4X2NvbmZpZyAmIFR4RHJ0aE1hc2spIDwgVFhfRFJUSF9WQUxfTElNSVQpIHsKKwkJCW5wLT50eF9jb25maWcgKz0gVFhfRFJUSF9WQUxfSU5DOworCQkJaWYgKG5ldGlmX21zZ190eF9lcnIobnApKQorCQkJCXByaW50ayhLRVJOX05PVElDRQorCQkJCQkiJXM6IGluY3JlYXNlZCB0eCB0aHJlc2hvbGQsIHR4Y2ZnICUjMDh4LlxuIiwKKwkJCQkJZGV2LT5uYW1lLCBucC0+dHhfY29uZmlnKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChuZXRpZl9tc2dfdHhfZXJyKG5wKSkKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJCQkJIiVzOiB0eCB1bmRlcnJ1biB3aXRoIG1heGltdW0gdHggdGhyZXNob2xkLCB0eGNmZyAlIzA4eC5cbiIsCisJCQkJCWRldi0+bmFtZSwgbnAtPnR4X2NvbmZpZyk7CisJCX0KKwkJd3JpdGVsKG5wLT50eF9jb25maWcsIGlvYWRkciArIFR4Q29uZmlnKTsKKwl9CisJaWYgKGludHJfc3RhdHVzICYgV09MUGt0ICYmIG5ldGlmX21zZ193b2wobnApKSB7CisJCWludCB3b2xfc3RhdHVzID0gcmVhZGwoaW9hZGRyICsgV09MQ21kKTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogTGluayB3YWtlLXVwIGV2ZW50ICUjMDh4XG4iLAorCQkJZGV2LT5uYW1lLCB3b2xfc3RhdHVzKTsKKwl9CisJaWYgKGludHJfc3RhdHVzICYgUnhTdGF0dXNGSUZPT3ZlcikgeworCQlpZiAobmV0aWZfbXNnX3J4X2VycihucCkgJiYgbmV0aWZfbXNnX2ludHIobnApKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBSeCBzdGF0dXMgRklGTyBvdmVycnVuXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCX0KKwkJbnAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJfQorCS8qIEhtbW1tbSwgaXQncyBub3QgY2xlYXIgaG93IHRvIHJlY292ZXIgZnJvbSBQQ0kgZmF1bHRzLiAqLworCWlmIChpbnRyX3N0YXR1cyAmIEludHJQQ0lFcnIpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogUENJIGVycm9yICUjMDh4XG4iLCBkZXYtPm5hbWUsCisJCQlpbnRyX3N0YXR1cyAmIEludHJQQ0lFcnIpOworCQlucC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJbnAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJfQorCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdm9pZCBfX2lvbWVtICogaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBUaGUgY2hpcCBvbmx5IG5lZWQgcmVwb3J0IGZyYW1lIHNpbGVudGx5IGRyb3BwZWQuICovCisJbnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMJKz0gcmVhZGwoaW9hZGRyICsgUnhDUkNFcnJzKTsKKwlucC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSByZWFkbChpb2FkZHIgKyBSeE1pc3NlZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBUaGUgY2hpcCBvbmx5IG5lZWQgcmVwb3J0IGZyYW1lIHNpbGVudGx5IGRyb3BwZWQuICovCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCWlmIChuZXRpZl9ydW5uaW5nKGRldikgJiYgIW5wLT5oYW5kc19vZmYpCisJCV9fZ2V0X3N0YXRzKGRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwlyZXR1cm4gJm5wLT5zdGF0czsKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBuYXRzZW1pX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlpbnRyX2hhbmRsZXIoZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7Cit9CisjZW5kaWYKKworI2RlZmluZSBIQVNIX1RBQkxFCTB4MjAwCitzdGF0aWMgdm9pZCBfX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdm9pZCBfX2lvbWVtICogaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdTggbWNfZmlsdGVyWzY0XTsgLyogTXVsdGljYXN0IGhhc2ggZmlsdGVyICovCisJdTMyIHJ4X21vZGU7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7IC8qIFNldCBwcm9taXNjdW91cy4gKi8KKwkJLyogVW5jb25kaXRpb25hbGx5IGxvZyBuZXQgdGFwcy4gKi8KKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwKKwkJCWRldi0+bmFtZSk7CisJCXJ4X21vZGUgPSBSeEZpbHRlckVuYWJsZSB8IEFjY2VwdEJyb2FkY2FzdAorCQkJfCBBY2NlcHRBbGxNdWx0aWNhc3QgfCBBY2NlcHRBbGxQaHlzIHwgQWNjZXB0TXlQaHlzOworCX0gZWxzZSBpZiAoKGRldi0+bWNfY291bnQgPiBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0KQorCSAgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCXJ4X21vZGUgPSBSeEZpbHRlckVuYWJsZSB8IEFjY2VwdEJyb2FkY2FzdAorCQkJfCBBY2NlcHRBbGxNdWx0aWNhc3QgfCBBY2NlcHRNeVBoeXM7CisJfSBlbHNlIHsKKwkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJCWludCBpOworCQltZW1zZXQobWNfZmlsdGVyLCAwLCBzaXplb2YobWNfZmlsdGVyKSk7CisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCQkJIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQlpbnQgaSA9IChldGhlcl9jcmMoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpID4+IDIzKSAmIDB4MWZmOworCQkJbWNfZmlsdGVyW2kvOF0gfD0gKDEgPDwgKGkgJiAweDA3KSk7CisJCX0KKwkJcnhfbW9kZSA9IFJ4RmlsdGVyRW5hYmxlIHwgQWNjZXB0QnJvYWRjYXN0CisJCQl8IEFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdE15UGh5czsKKwkJZm9yIChpID0gMDsgaSA8IDY0OyBpICs9IDIpIHsKKwkJCXdyaXRldyhIQVNIX1RBQkxFICsgaSwgaW9hZGRyICsgUnhGaWx0ZXJBZGRyKTsKKwkJCXdyaXRldygobWNfZmlsdGVyW2krMV08PDgpICsgbWNfZmlsdGVyW2ldLAorCQkJCWlvYWRkciArIFJ4RmlsdGVyRGF0YSk7CisJCX0KKwl9CisJd3JpdGVsKHJ4X21vZGUsIGlvYWRkciArIFJ4RmlsdGVyQWRkcik7CisJbnAtPmN1cl9yeF9tb2RlID0gcnhfbW9kZTsKK30KKworc3RhdGljIGludCBuYXRzZW1pX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaWYgKG5ld19tdHUgPCA2NCB8fCBuZXdfbXR1ID4gTkFUU0VNSV9SWF9MSU1JVC1OQVRTRU1JX0hFQURFUlMpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2LT5tdHUgPSBuZXdfbXR1OworCisJLyogc3luY2hyb25pemVkIGFnYWluc3Qgb3BlbiA6IHJ0bmxfbG9jaygpIGhlbGQgYnkgY2FsbGVyICovCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJdm9pZCBfX2lvbWVtICogaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisKKwkJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwkJLyogc3RvcCBlbmdpbmVzICovCisJCW5hdHNlbWlfc3RvcF9yeHR4KGRldik7CisJCS8qIGRyYWluIHJ4IHF1ZXVlICovCisJCWRyYWluX3J4KGRldik7CisJCS8qIGNoYW5nZSBidWZmZXJzICovCisJCXNldF9idWZzaXplKGRldik7CisJCXJlaW5pdF9yeChkZXYpOworCQl3cml0ZWwobnAtPnJpbmdfZG1hLCBpb2FkZHIgKyBSeFJpbmdQdHIpOworCQkvKiByZXN0YXJ0IGVuZ2luZXMgKi8KKwkJd3JpdGVsKFJ4T24gfCBUeE9uLCBpb2FkZHIgKyBDaGlwQ21kKTsKKwkJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKKwkJZW5hYmxlX2lycShkZXYtPmlycSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwlpZiAoIW5wLT5oYW5kc19vZmYpCisJCV9fc2V0X3J4X21vZGUoZGV2KTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJuY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUsIEVUSFRPT0xfQlVTSU5GT19MRU4pOworCXN0cm5jcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04sIEVUSFRPT0xfQlVTSU5GT19MRU4pOworCXN0cm5jcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSwgRVRIVE9PTF9CVVNJTkZPX0xFTik7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIE5BVFNFTUlfUkVHU19TSVpFOworfQorCitzdGF0aWMgaW50IGdldF9lZXByb21fbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIE5BVFNFTUlfRUVQUk9NX1NJWkU7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJbmV0ZGV2X2dldF9lY21kKGRldiwgZWNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmVzOworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyZXMgPSBuZXRkZXZfc2V0X2VjbWQoZGV2LCBlY21kKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBnZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJbmV0ZGV2X2dldF93b2woZGV2LCAmd29sLT5zdXBwb3J0ZWQsICZ3b2wtPndvbG9wdHMpOworCW5ldGRldl9nZXRfc29wYXNzKGRldiwgd29sLT5zb3Bhc3MpOworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworfQorCitzdGF0aWMgaW50IHNldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXM7CisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCW5ldGRldl9zZXRfd29sKGRldiwgd29sLT53b2xvcHRzKTsKKwlyZXMgPSBuZXRkZXZfc2V0X3NvcGFzcyhkZXYsIHdvbC0+c29wYXNzKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBnZXRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLCB2b2lkICpidWYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJcmVncy0+dmVyc2lvbiA9IE5BVFNFTUlfUkVHU19WRVI7CisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCW5ldGRldl9nZXRfcmVncyhkZXYsIGJ1Zik7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7Cit9CisKK3N0YXRpYyB1MzIgZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIG5wLT5tc2dfZW5hYmxlOworfQorCitzdGF0aWMgdm9pZCBzZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlucC0+bXNnX2VuYWJsZSA9IHZhbDsKK30KKworc3RhdGljIGludCBud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHRtcDsKKwlpbnQgciA9IC1FSU5WQUw7CisJLyogaWYgYXV0b25lZyBpcyBvZmYsIGl0J3MgYW4gZXJyb3IgKi8KKwl0bXAgPSBtZGlvX3JlYWQoZGV2LCBNSUlfQk1DUik7CisJaWYgKHRtcCAmIEJNQ1JfQU5FTkFCTEUpIHsKKwkJdG1wIHw9IChCTUNSX0FOUkVTVEFSVCk7CisJCW1kaW9fd3JpdGUoZGV2LCBNSUlfQk1DUiwgdG1wKTsKKwkJciA9IDA7CisJfQorCXJldHVybiByOworfQorCitzdGF0aWMgdTMyIGdldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogTFNUQVRVUyBpcyBsYXRjaGVkIGxvdyB1bnRpbCBhIHJlYWQgLSBzbyByZWFkIHR3aWNlICovCisJbWRpb19yZWFkKGRldiwgTUlJX0JNU1IpOworCXJldHVybiAobWRpb19yZWFkKGRldiwgTUlJX0JNU1IpJkJNU1JfTFNUQVRVUykgPyAxOjA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmRhdGEpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdTggZWVidWZbTkFUU0VNSV9FRVBST01fU0laRV07CisJaW50IHJlczsKKworCWVlcHJvbS0+bWFnaWMgPSBQQ0lfVkVORE9SX0lEX05TIHwgKFBDSV9ERVZJQ0VfSURfTlNfODM4MTU8PDE2KTsKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJcmVzID0gbmV0ZGV2X2dldF9lZXByb20oZGV2LCBlZWJ1Zik7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJaWYgKCFyZXMpCisJCW1lbWNweShkYXRhLCBlZWJ1ZitlZXByb20tPm9mZnNldCwgZWVwcm9tLT5sZW4pOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvID0gZ2V0X2RydmluZm8sCisJLmdldF9yZWdzX2xlbiA9IGdldF9yZWdzX2xlbiwKKwkuZ2V0X2VlcHJvbV9sZW4gPSBnZXRfZWVwcm9tX2xlbiwKKwkuZ2V0X3NldHRpbmdzID0gZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgPSBzZXRfc2V0dGluZ3MsCisJLmdldF93b2wgPSBnZXRfd29sLAorCS5zZXRfd29sID0gc2V0X3dvbCwKKwkuZ2V0X3JlZ3MgPSBnZXRfcmVncywKKwkuZ2V0X21zZ2xldmVsID0gZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwgPSBzZXRfbXNnbGV2ZWwsCisJLm53YXlfcmVzZXQgPSBud2F5X3Jlc2V0LAorCS5nZXRfbGluayA9IGdldF9saW5rLAorCS5nZXRfZWVwcm9tID0gZ2V0X2VlcHJvbSwKK307CisKK3N0YXRpYyBpbnQgbmV0ZGV2X3NldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIG5ld3ZhbCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKiBpb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKwl1MzIgZGF0YSA9IHJlYWRsKGlvYWRkciArIFdPTENtZCkgJiB+V2FrZU9wdHNTdW1tYXJ5OworCisJLyogdHJhbnNsYXRlIHRvIGJpdG1hc2tzIHRoaXMgY2hpcCB1bmRlcnN0YW5kcyAqLworCWlmIChuZXd2YWwgJiBXQUtFX1BIWSkKKwkJZGF0YSB8PSBXYWtlUGh5OworCWlmIChuZXd2YWwgJiBXQUtFX1VDQVNUKQorCQlkYXRhIHw9IFdha2VVbmljYXN0OworCWlmIChuZXd2YWwgJiBXQUtFX01DQVNUKQorCQlkYXRhIHw9IFdha2VNdWx0aWNhc3Q7CisJaWYgKG5ld3ZhbCAmIFdBS0VfQkNBU1QpCisJCWRhdGEgfD0gV2FrZUJyb2FkY2FzdDsKKwlpZiAobmV3dmFsICYgV0FLRV9BUlApCisJCWRhdGEgfD0gV2FrZUFycDsKKwlpZiAobmV3dmFsICYgV0FLRV9NQUdJQykKKwkJZGF0YSB8PSBXYWtlTWFnaWM7CisJaWYgKG5wLT5zcnIgPj0gU1JSX0RQODM4MTVfRCkgeworCQlpZiAobmV3dmFsICYgV0FLRV9NQUdJQ1NFQ1VSRSkgeworCQkJZGF0YSB8PSBXYWtlTWFnaWNTZWN1cmU7CisJCX0KKwl9CisKKwl3cml0ZWwoZGF0YSwgaW9hZGRyICsgV09MQ21kKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5ldGRldl9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiAqc3VwcG9ydGVkLCB1MzIgKmN1cikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKiBpb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKwl1MzIgcmVndmFsID0gcmVhZGwoaW9hZGRyICsgV09MQ21kKTsKKworCSpzdXBwb3J0ZWQgPSAoV0FLRV9QSFkgfCBXQUtFX1VDQVNUIHwgV0FLRV9NQ0FTVCB8IFdBS0VfQkNBU1QKKwkJCXwgV0FLRV9BUlAgfCBXQUtFX01BR0lDKTsKKworCWlmIChucC0+c3JyID49IFNSUl9EUDgzODE1X0QpIHsKKwkJLyogU09QQVNTIHdvcmtzIG9uIHJldkQgYW5kIGhpZ2hlciAqLworCQkqc3VwcG9ydGVkIHw9IFdBS0VfTUFHSUNTRUNVUkU7CisJfQorCSpjdXIgPSAwOworCisJLyogdHJhbnNsYXRlIGZyb20gY2hpcCBiaXRtYXNrcyAqLworCWlmIChyZWd2YWwgJiBXYWtlUGh5KQorCQkqY3VyIHw9IFdBS0VfUEhZOworCWlmIChyZWd2YWwgJiBXYWtlVW5pY2FzdCkKKwkJKmN1ciB8PSBXQUtFX1VDQVNUOworCWlmIChyZWd2YWwgJiBXYWtlTXVsdGljYXN0KQorCQkqY3VyIHw9IFdBS0VfTUNBU1Q7CisJaWYgKHJlZ3ZhbCAmIFdha2VCcm9hZGNhc3QpCisJCSpjdXIgfD0gV0FLRV9CQ0FTVDsKKwlpZiAocmVndmFsICYgV2FrZUFycCkKKwkJKmN1ciB8PSBXQUtFX0FSUDsKKwlpZiAocmVndmFsICYgV2FrZU1hZ2ljKQorCQkqY3VyIHw9IFdBS0VfTUFHSUM7CisJaWYgKHJlZ3ZhbCAmIFdha2VNYWdpY1NlY3VyZSkgeworCQkvKiB0aGlzIGNhbiBiZSBvbiBpbiByZXZDLCBidXQgaXQncyBicm9rZW4gKi8KKwkJKmN1ciB8PSBXQUtFX01BR0lDU0VDVVJFOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5ldGRldl9zZXRfc29wYXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpuZXd2YWwpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICogaW9hZGRyID0gbnNfaW9hZGRyKGRldik7CisJdTE2ICpzdmFsID0gKHUxNiAqKW5ld3ZhbDsKKwl1MzIgYWRkcjsKKworCWlmIChucC0+c3JyIDwgU1JSX0RQODM4MTVfRCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBlbmFibGUgd3JpdGluZyB0byB0aGVzZSByZWdpc3RlcnMgYnkgZGlzYWJsaW5nIHRoZSBSWCBmaWx0ZXIgKi8KKwlhZGRyID0gcmVhZGwoaW9hZGRyICsgUnhGaWx0ZXJBZGRyKSAmIH5SRkNSQWRkcmVzc01hc2s7CisJYWRkciAmPSB+UnhGaWx0ZXJFbmFibGU7CisJd3JpdGVsKGFkZHIsIGlvYWRkciArIFJ4RmlsdGVyQWRkcik7CisKKwkvKiB3cml0ZSB0aGUgdGhyZWUgd29yZHMgdG8gKHVuZG9jdW1lbnRlZCkgUkZDUiB2YWxzIDB4YSwgMHhjLCAweGUgKi8KKwl3cml0ZWwoYWRkciB8IDB4YSwgaW9hZGRyICsgUnhGaWx0ZXJBZGRyKTsKKwl3cml0ZXcoc3ZhbFswXSwgaW9hZGRyICsgUnhGaWx0ZXJEYXRhKTsKKworCXdyaXRlbChhZGRyIHwgMHhjLCBpb2FkZHIgKyBSeEZpbHRlckFkZHIpOworCXdyaXRldyhzdmFsWzFdLCBpb2FkZHIgKyBSeEZpbHRlckRhdGEpOworCisJd3JpdGVsKGFkZHIgfCAweGUsIGlvYWRkciArIFJ4RmlsdGVyQWRkcik7CisJd3JpdGV3KHN2YWxbMl0sIGlvYWRkciArIFJ4RmlsdGVyRGF0YSk7CisKKwkvKiByZS1lbmFibGUgdGhlIFJYIGZpbHRlciAqLworCXdyaXRlbChhZGRyIHwgUnhGaWx0ZXJFbmFibGUsIGlvYWRkciArIFJ4RmlsdGVyQWRkcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXRkZXZfZ2V0X3NvcGFzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKiBpb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKwl1MTYgKnN2YWwgPSAodTE2ICopZGF0YTsKKwl1MzIgYWRkcjsKKworCWlmIChucC0+c3JyIDwgU1JSX0RQODM4MTVfRCkgeworCQlzdmFsWzBdID0gc3ZhbFsxXSA9IHN2YWxbMl0gPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiByZWFkIHRoZSB0aHJlZSB3b3JkcyBmcm9tICh1bmRvY3VtZW50ZWQpIFJGQ1IgdmFscyAweGEsIDB4YywgMHhlICovCisJYWRkciA9IHJlYWRsKGlvYWRkciArIFJ4RmlsdGVyQWRkcikgJiB+UkZDUkFkZHJlc3NNYXNrOworCisJd3JpdGVsKGFkZHIgfCAweGEsIGlvYWRkciArIFJ4RmlsdGVyQWRkcik7CisJc3ZhbFswXSA9IHJlYWR3KGlvYWRkciArIFJ4RmlsdGVyRGF0YSk7CisKKwl3cml0ZWwoYWRkciB8IDB4YywgaW9hZGRyICsgUnhGaWx0ZXJBZGRyKTsKKwlzdmFsWzFdID0gcmVhZHcoaW9hZGRyICsgUnhGaWx0ZXJEYXRhKTsKKworCXdyaXRlbChhZGRyIHwgMHhlLCBpb2FkZHIgKyBSeEZpbHRlckFkZHIpOworCXN2YWxbMl0gPSByZWFkdyhpb2FkZHIgKyBSeEZpbHRlckRhdGEpOworCisJd3JpdGVsKGFkZHIsIGlvYWRkciArIFJ4RmlsdGVyQWRkcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXRkZXZfZ2V0X2VjbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiB0bXA7CisKKwllY21kLT5wb3J0ICAgICAgICA9IGRldi0+aWZfcG9ydDsKKwllY21kLT5zcGVlZCAgICAgICA9IG5wLT5zcGVlZDsKKwllY21kLT5kdXBsZXggICAgICA9IG5wLT5kdXBsZXg7CisJZWNtZC0+YXV0b25lZyAgICAgPSBucC0+YXV0b25lZzsKKwllY21kLT5hZHZlcnRpc2luZyA9IDA7CisJaWYgKG5wLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRV8xMEhBTEYpCisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmOworCWlmIChucC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VfMTBGVUxMKQorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbDsKKwlpZiAobnAtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFXzEwMEhBTEYpCisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZjsKKwlpZiAobnAtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFXzEwMEZVTEwpCisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbDsKKwllY21kLT5zdXBwb3J0ZWQgICA9IChTVVBQT1JURURfQXV0b25lZyB8CisJCVNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCAgfAorCQlTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKKwkJU1VQUE9SVEVEX1RQIHwgU1VQUE9SVEVEX01JSSB8IFNVUFBPUlRFRF9GSUJSRSk7CisJZWNtZC0+cGh5X2FkZHJlc3MgPSBucC0+cGh5X2FkZHJfZXh0ZXJuYWw7CisJLyoKKwkgKiBXZSBpbnRlbnRpb25hbGx5IHJlcG9ydCB0aGUgcGh5IGFkZHJlc3Mgb2YgdGhlIGV4dGVybmFsCisJICogcGh5LCBldmVuIGlmIHRoZSBpbnRlcm5hbCBwaHkgaXMgdXNlZC4gVGhpcyBpcyBuZWNlc3NhcnkKKwkgKiB0byB3b3JrIGFyb3VuZCBhIGRlZmljaWVuY3kgb2YgdGhlIGV0aHRvb2wgaW50ZXJmYWNlOgorCSAqIEl0J3Mgb25seSBwb3NzaWJsZSB0byBxdWVyeSB0aGUgc2V0dGluZ3Mgb2YgdGhlIGFjdGl2ZQorCSAqIHBvcnQuIFRoZXJlZm9yZSAKKwkgKiAjIGV0aHRvb2wgLXMgZXRoWCBwb3J0IG1paQorCSAqIGFjdHVhbGx5IHNlbmRzIGFuIGlvY3RsIHRvIHN3aXRjaCB0byBwb3J0IG1paSB3aXRoIHRoZQorCSAqIHNldHRpbmdzIHRoYXQgYXJlIHVzZWQgZm9yIHRoZSBjdXJyZW50IGFjdGl2ZSBwb3J0LgorCSAqIElmIHdlIHdvdWxkIHJlcG9ydCBhIGRpZmZlcmVudCBwaHkgYWRkcmVzcyBpbiB0aGlzCisJICogY29tbWFuZCwgdGhlbgorCSAqICMgZXRodG9vbCAtcyBldGhYIHBvcnQgdHA7ZXRodG9vbCAtcyBldGhYIHBvcnQgbWlpCisJICogd291bGQgdW5pbnRlbnRpb25hbGx5IGNoYW5nZSB0aGUgcGh5IGFkZHJlc3MuCisJICoKKwkgKiBGb3J0dW5hdGVseSB0aGUgcGh5IGFkZHJlc3MgZG9lc24ndCBtYXR0ZXIgd2l0aCB0aGUKKwkgKiBpbnRlcm5hbCBwaHkuLi4KKwkgKi8KKworCS8qIHNldCBpbmZvcm1hdGlvbiBiYXNlZCBvbiBhY3RpdmUgcG9ydCB0eXBlICovCisJc3dpdGNoIChlY21kLT5wb3J0KSB7CisJZGVmYXVsdDoKKwljYXNlIFBPUlRfVFA6CisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfVFA7CisJCWVjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsKKwkJYnJlYWs7CisJY2FzZSBQT1JUX01JSToKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9NSUk7CisJCWVjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9FWFRFUk5BTDsKKwkJYnJlYWs7CisJY2FzZSBQT1JUX0ZJQlJFOgorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0ZJQlJFOworCQllY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CisJCWJyZWFrOworCX0KKworCS8qIGlmIGF1dG9uZWdvdGlhdGlvbiBpcyBvbiwgdHJ5IHRvIHJldHVybiB0aGUgYWN0aXZlIHNwZWVkL2R1cGxleCAqLworCWlmIChlY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXV0b25lZzsKKwkJdG1wID0gbWlpX253YXlfcmVzdWx0KAorCQkJbnAtPmFkdmVydGlzaW5nICYgbWRpb19yZWFkKGRldiwgTUlJX0xQQSkpOworCQlpZiAodG1wID09IExQQV8xMDBGVUxMIHx8IHRtcCA9PSBMUEFfMTAwSEFMRikKKwkJCWVjbWQtPnNwZWVkICA9IFNQRUVEXzEwMDsKKwkJZWxzZQorCQkJZWNtZC0+c3BlZWQgID0gU1BFRURfMTA7CisJCWlmICh0bXAgPT0gTFBBXzEwMEZVTEwgfHwgdG1wID09IExQQV8xMEZVTEwpCisJCQllY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJZWxzZQorCQkJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJfQorCisJLyogaWdub3JlIG1heHR4cGt0LCBtYXhyeHBrdCBmb3Igbm93ICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXRkZXZfc2V0X2VjbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKGVjbWQtPnBvcnQgIT0gUE9SVF9UUCAmJiBlY21kLT5wb3J0ICE9IFBPUlRfTUlJICYmIGVjbWQtPnBvcnQgIT0gUE9SVF9GSUJSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGVjbWQtPnRyYW5zY2VpdmVyICE9IFhDVlJfSU5URVJOQUwgJiYgZWNtZC0+dHJhbnNjZWl2ZXIgIT0gWENWUl9FWFRFUk5BTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGVjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJaWYgKChlY21kLT5hZHZlcnRpc2luZyAmIChBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8CisJCQkJCSAgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfAorCQkJCQkgIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8CisJCQkJCSAgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsKSkgPT0gMCkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgaWYgKGVjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFKSB7CisJCWlmIChlY21kLT5zcGVlZCAhPSBTUEVFRF8xMCAmJiBlY21kLT5zcGVlZCAhPSBTUEVFRF8xMDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGVjbWQtPmR1cGxleCAhPSBEVVBMRVhfSEFMRiAmJiBlY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIG1heHR4cGt0LCBtYXhyeHBrdDogaWdub3JlZCBmb3Igbm93LgorCSAqCisJICogdHJhbnNjZWl2ZXI6CisJICogUE9SVF9UUCBpcyBhbHdheXMgWENWUl9JTlRFUk5BTCwgUE9SVF9NSUkgYW5kIFBPUlRfRklCUkUgYXJlIGFsd2F5cworCSAqIFhDVlJfRVhURVJOQUwuIFRoZSBpbXBsZW1lbnRhdGlvbiB0aHVzIGlnbm9yZXMgZWNtZC0+dHJhbnNjZWl2ZXIgYW5kCisJICogc2VsZWN0cyBiYXNlZCBvbiBlY21kLT5wb3J0LgorCSAqCisJICogQWN0dWFsbHkgUE9SVF9GSUJSRSBpcyBuZWFybHkgaWRlbnRpY2FsIHRvIFBPUlRfTUlJOiBpdCdzIGZvciBmaWJyZQorCSAqIHBoeXMgdGhhdCBhcmUgY29ubmVjdGVkIHRvIHRoZSBtaWkgYnVzLiBJdCdzIHVzZWQgdG8gYXBwbHkgZmlicmUKKwkgKiBzcGVjaWZpYyB1cGRhdGVzLgorCSAqLworCisJLyogV0hFVyEgbm93IGxldHMgYmFuZyBzb21lIGJpdHMgKi8KKworCS8qIHNhdmUgdGhlIHBhcm1zICovCisJZGV2LT5pZl9wb3J0ICAgICAgICAgID0gZWNtZC0+cG9ydDsKKwlucC0+YXV0b25lZyAgICAgICAgICAgPSBlY21kLT5hdXRvbmVnOworCW5wLT5waHlfYWRkcl9leHRlcm5hbCA9IGVjbWQtPnBoeV9hZGRyZXNzICYgUGh5QWRkck1hc2s7CisJaWYgKG5wLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCS8qIGFkdmVydGlzZSBvbmx5IHdoYXQgaGFzIGJlZW4gcmVxdWVzdGVkICovCisJCW5wLT5hZHZlcnRpc2luZyAmPSB+KEFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfMTAwQkFTRTQpOworCQlpZiAoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikKKwkJCW5wLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VfMTBIQUxGOworCQlpZiAoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkKKwkJCW5wLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VfMTBGVUxMOworCQlpZiAoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYpCisJCQlucC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFXzEwMEhBTEY7CisJCWlmIChlY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCkKKwkJCW5wLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwl9IGVsc2UgeworCQlucC0+c3BlZWQgID0gZWNtZC0+c3BlZWQ7CisJCW5wLT5kdXBsZXggPSBlY21kLT5kdXBsZXg7CisJCS8qIHVzZXIgb3ZlcnJpZGluZyB0aGUgaW5pdGlhbCBmdWxsIGR1cGxleCBwYXJtPyAqLworCQlpZiAobnAtPmR1cGxleCA9PSBEVVBMRVhfSEFMRikKKwkJCW5wLT5mdWxsX2R1cGxleCA9IDA7CisJfQorCisJLyogZ2V0IHRoZSByaWdodCBwaHkgZW5hYmxlZCAqLworCWlmIChlY21kLT5wb3J0ID09IFBPUlRfVFApCisJCXN3aXRjaF9wb3J0X2ludGVybmFsKGRldik7CisJZWxzZQorCQlzd2l0Y2hfcG9ydF9leHRlcm5hbChkZXYpOworCisJLyogc2V0IHBhcm1zIGFuZCBzZWUgaG93IHRoaXMgYWZmZWN0ZWQgb3VyIGxpbmsgc3RhdHVzICovCisJaW5pdF9waHlfZml4dXAoZGV2KTsKKwljaGVja19saW5rKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmV0ZGV2X2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpidWYpCit7CisJaW50IGk7CisJaW50IGo7CisJdTMyIHJmY3I7CisJdTMyICpyYnVmID0gKHUzMiAqKWJ1ZjsKKwl2b2lkIF9faW9tZW0gKiBpb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKworCS8qIHJlYWQgbm9uLW1paSBwYWdlIDAgb2YgcmVnaXN0ZXJzICovCisJZm9yIChpID0gMDsgaSA8IE5BVFNFTUlfUEcwX05SRUdTLzI7IGkrKykgeworCQlyYnVmW2ldID0gcmVhZGwoaW9hZGRyICsgaSo0KTsKKwl9CisKKwkvKiByZWFkIGN1cnJlbnQgbWlpIHJlZ2lzdGVycyAqLworCWZvciAoaSA9IE5BVFNFTUlfUEcwX05SRUdTLzI7IGkgPCBOQVRTRU1JX1BHMF9OUkVHUzsgaSsrKQorCQlyYnVmW2ldID0gbWRpb19yZWFkKGRldiwgaSAmIDB4MWYpOworCisJLyogcmVhZCBvbmx5IHRoZSAnbWFnaWMnIHJlZ2lzdGVycyBmcm9tIHBhZ2UgMSAqLworCXdyaXRldygxLCBpb2FkZHIgKyBQR1NFTCk7CisJcmJ1ZltpKytdID0gcmVhZHcoaW9hZGRyICsgUE1EQ1NSKTsKKwlyYnVmW2krK10gPSByZWFkdyhpb2FkZHIgKyBUU1REQVQpOworCXJidWZbaSsrXSA9IHJlYWR3KGlvYWRkciArIERTUENGRyk7CisJcmJ1ZltpKytdID0gcmVhZHcoaW9hZGRyICsgU0RDRkcpOworCXdyaXRldygwLCBpb2FkZHIgKyBQR1NFTCk7CisKKwkvKiByZWFkIFJGQ1IgaW5kZXhlZCByZWdpc3RlcnMgKi8KKwlyZmNyID0gcmVhZGwoaW9hZGRyICsgUnhGaWx0ZXJBZGRyKTsKKwlmb3IgKGogPSAwOyBqIDwgTkFUU0VNSV9SRkRSX05SRUdTOyBqKyspIHsKKwkJd3JpdGVsKGoqMiwgaW9hZGRyICsgUnhGaWx0ZXJBZGRyKTsKKwkJcmJ1ZltpKytdID0gcmVhZHcoaW9hZGRyICsgUnhGaWx0ZXJEYXRhKTsKKwl9CisJd3JpdGVsKHJmY3IsIGlvYWRkciArIFJ4RmlsdGVyQWRkcik7CisKKwkvKiB0aGUgaW50ZXJydXB0IHN0YXR1cyBpcyBjbGVhci1vbi1yZWFkIC0gc2VlIGlmIHdlIG1pc3NlZCBhbnkgKi8KKwlpZiAocmJ1Zls0XSAmIHJidWZbNV0pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIiVzOiBzaG9vdCwgd2UgZHJvcHBlZCBhbiBpbnRlcnJ1cHQgKCUjMDh4KVxuIiwKKwkJCWRldi0+bmFtZSwgcmJ1Zls0XSAmIHJidWZbNV0pOworCX0KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIFNXQVBfQklUUyh4KQkoICgoKHgpICYgMHgwMDAxKSA8PCAxNSkgfCAoKCh4KSAmIDB4MDAwMikgPDwgMTMpIFwKKwkJCXwgKCgoeCkgJiAweDAwMDQpIDw8IDExKSB8ICgoKHgpICYgMHgwMDA4KSA8PCA5KSAgXAorCQkJfCAoKCh4KSAmIDB4MDAxMCkgPDwgNykgIHwgKCgoeCkgJiAweDAwMjApIDw8IDUpICBcCisJCQl8ICgoKHgpICYgMHgwMDQwKSA8PCAzKSAgfCAoKCh4KSAmIDB4MDA4MCkgPDwgMSkgIFwKKwkJCXwgKCgoeCkgJiAweDAxMDApID4+IDEpICB8ICgoKHgpICYgMHgwMjAwKSA+PiAzKSAgXAorCQkJfCAoKCh4KSAmIDB4MDQwMCkgPj4gNSkgIHwgKCgoeCkgJiAweDA4MDApID4+IDcpICBcCisJCQl8ICgoKHgpICYgMHgxMDAwKSA+PiA5KSAgfCAoKCh4KSAmIDB4MjAwMCkgPj4gMTEpIFwKKwkJCXwgKCgoeCkgJiAweDQwMDApID4+IDEzKSB8ICgoKHgpICYgMHg4MDAwKSA+PiAxNSkgKQorCitzdGF0aWMgaW50IG5ldGRldl9nZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpidWYpCit7CisJaW50IGk7CisJdTE2ICplYnVmID0gKHUxNiAqKWJ1ZjsKKwl2b2lkIF9faW9tZW0gKiBpb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKworCS8qIGVlcHJvbV9yZWFkIHJlYWRzIDE2IGJpdHMsIGFuZCBpbmRleGVzIGJ5IDE2IGJpdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTkFUU0VNSV9FRVBST01fU0laRS8yOyBpKyspIHsKKwkJZWJ1ZltpXSA9IGVlcHJvbV9yZWFkKGlvYWRkciwgaSk7CisJCS8qIFRoZSBFRVBST00gaXRzZWxmIHN0b3JlcyBkYXRhIGJpdC1zd2FwcGVkLCBidXQgZWVwcm9tX3JlYWQKKwkJICogcmVhZHMgaXQgYmFjayAic2FuZWx5Ii4gU28gd2Ugc3dhcCBpdCBiYWNrIGhlcmUgaW4gb3JkZXIgdG8KKwkJICogcHJlc2VudCBpdCB0byB1c2VybGFuZCBhcyBpdCBpcyBzdG9yZWQuICovCisJCWVidWZbaV0gPSBTV0FQX0JJVFMoZWJ1ZltpXSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5ldGRldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShycSk7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBTSU9DR01JSVBIWToJCS8qIEdldCBhZGRyZXNzIG9mIE1JSSBQSFkgaW4gdXNlLiAqLworCWNhc2UgU0lPQ0RFVlBSSVZBVEU6CQkvKiBmb3IgYmluYXJ5IGNvbXBhdCwgcmVtb3ZlIGluIDIuNSAqLworCQlkYXRhLT5waHlfaWQgPSBucC0+cGh5X2FkZHJfZXh0ZXJuYWw7CisJCS8qIEZhbGwgVGhyb3VnaCAqLworCisJY2FzZSBTSU9DR01JSVJFRzoJCS8qIFJlYWQgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwljYXNlIFNJT0NERVZQUklWQVRFKzE6CQkvKiBmb3IgYmluYXJ5IGNvbXBhdCwgcmVtb3ZlIGluIDIuNSAqLworCQkvKiBUaGUgcGh5X2lkIGlzIG5vdCBlbm91Z2ggdG8gdW5pcXVlbHkgaWRlbnRpZnkKKwkJICogdGhlIGludGVuZGVkIHRhcmdldC4gVGhlcmVmb3JlIHRoZSBjb21tYW5kIGlzIHNlbnQgdG8KKwkJICogdGhlIGdpdmVuIG1paSBvbiB0aGUgY3VycmVudCBwb3J0LgorCQkgKi8KKwkJaWYgKGRldi0+aWZfcG9ydCA9PSBQT1JUX1RQKSB7CisJCQlpZiAoKGRhdGEtPnBoeV9pZCAmIDB4MWYpID09IG5wLT5waHlfYWRkcl9leHRlcm5hbCkKKwkJCQlkYXRhLT52YWxfb3V0ID0gbWRpb19yZWFkKGRldiwKKwkJCQkJCQlkYXRhLT5yZWdfbnVtICYgMHgxZik7CisJCQllbHNlCisJCQkJZGF0YS0+dmFsX291dCA9IDA7CisJCX0gZWxzZSB7CisJCQltb3ZlX2ludF9waHkoZGV2LCBkYXRhLT5waHlfaWQgJiAweDFmKTsKKwkJCWRhdGEtPnZhbF9vdXQgPSBtaWlwb3J0X3JlYWQoZGV2LCBkYXRhLT5waHlfaWQgJiAweDFmLAorCQkJCQkJCWRhdGEtPnJlZ19udW0gJiAweDFmKTsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU0lPQ1NNSUlSRUc6CQkvKiBXcml0ZSBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCWNhc2UgU0lPQ0RFVlBSSVZBVEUrMjoJCS8qIGZvciBiaW5hcnkgY29tcGF0LCByZW1vdmUgaW4gMi41ICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChkZXYtPmlmX3BvcnQgPT0gUE9SVF9UUCkgeworCQkJaWYgKChkYXRhLT5waHlfaWQgJiAweDFmKSA9PSBucC0+cGh5X2FkZHJfZXh0ZXJuYWwpIHsKKyAJCQkJaWYgKChkYXRhLT5yZWdfbnVtICYgMHgxZikgPT0gTUlJX0FEVkVSVElTRSkKKwkJCQkJbnAtPmFkdmVydGlzaW5nID0gZGF0YS0+dmFsX2luOworCQkJCW1kaW9fd3JpdGUoZGV2LCBkYXRhLT5yZWdfbnVtICYgMHgxZiwKKwkJCQkJCQlkYXRhLT52YWxfaW4pOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKChkYXRhLT5waHlfaWQgJiAweDFmKSA9PSBucC0+cGh5X2FkZHJfZXh0ZXJuYWwpIHsKKyAJCQkJaWYgKChkYXRhLT5yZWdfbnVtICYgMHgxZikgPT0gTUlJX0FEVkVSVElTRSkKKwkJCQkJbnAtPmFkdmVydGlzaW5nID0gZGF0YS0+dmFsX2luOworCQkJfQorCQkJbW92ZV9pbnRfcGh5KGRldiwgZGF0YS0+cGh5X2lkICYgMHgxZik7CisJCQltaWlwb3J0X3dyaXRlKGRldiwgZGF0YS0+cGh5X2lkICYgMHgxZiwKKwkJCQkJCWRhdGEtPnJlZ19udW0gJiAweDFmLAorCQkJCQkJZGF0YS0+dmFsX2luKTsKKwkJfQorCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmFibGVfd29sX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGVuYWJsZV9pbnRyKQoreworCXZvaWQgX19pb21lbSAqIGlvYWRkciA9IG5zX2lvYWRkcihkZXYpOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKG5ldGlmX21zZ193b2wobnApKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVtYWluaW5nIGFjdGl2ZSBmb3Igd2FrZS1vbi1sYW5cbiIsCisJCQlkZXYtPm5hbWUpOworCisJLyogRm9yIFdPTCB3ZSBtdXN0IHJlc3RhcnQgdGhlIHJ4IHByb2Nlc3MgaW4gc2lsZW50IG1vZGUuCisJICogV3JpdGUgTlVMTCB0byB0aGUgUnhSaW5nUHRyLiBPbmx5IHBvc3NpYmxlIGlmCisJICogcnggcHJvY2VzcyBpcyBzdG9wcGVkCisJICovCisJd3JpdGVsKDAsIGlvYWRkciArIFJ4UmluZ1B0cik7CisKKwkvKiByZWFkIFdvTCBzdGF0dXMgdG8gY2xlYXIgKi8KKwlyZWFkbChpb2FkZHIgKyBXT0xDbWQpOworCisJLyogUE1FIG9uLCBjbGVhciBzdGF0dXMgKi8KKwl3cml0ZWwobnAtPlNhdmVkQ2xrUnVuIHwgUE1FRW5hYmxlIHwgUE1FU3RhdHVzLCBpb2FkZHIgKyBDbGtSdW4pOworCisJLyogYW5kIHJlc3RhcnQgdGhlIHJ4IHByb2Nlc3MgKi8KKwl3cml0ZWwoUnhPbiwgaW9hZGRyICsgQ2hpcENtZCk7CisKKwlpZiAoZW5hYmxlX2ludHIpIHsKKwkJLyogZW5hYmxlIHRoZSBXT0wgaW50ZXJydXB0LgorCQkgKiBDb3VsZCBiZSB1c2VkIHRvIHNlbmQgYSBuZXRsaW5rIG1lc3NhZ2UuCisJCSAqLworCQl3cml0ZWwoV09MUGt0IHwgTGlua0NoYW5nZSwgaW9hZGRyICsgSW50ck1hc2spOworCQl3cml0ZWwoMSwgaW9hZGRyICsgSW50ckVuYWJsZSk7CisJfQorfQorCitzdGF0aWMgaW50IG5ldGRldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXZvaWQgX19pb21lbSAqIGlvYWRkciA9IG5zX2lvYWRkcihkZXYpOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKG5ldGlmX21zZ19pZmRvd24obnApKQorCQlwcmludGsoS0VSTl9ERUJVRworCQkJIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZCwgc3RhdHVzIHdhcyAlIzA0eC5cbiIsCisJCQlkZXYtPm5hbWUsIChpbnQpcmVhZGwoaW9hZGRyICsgQ2hpcENtZCkpOworCWlmIChuZXRpZl9tc2dfcGt0ZGF0YShucCkpCisJCXByaW50ayhLRVJOX0RFQlVHCisJCQkiJXM6IFF1ZXVlIHBvaW50ZXJzIHdlcmUgVHggJWQgLyAlZCwgIFJ4ICVkIC8gJWQuXG4iLAorCQkJZGV2LT5uYW1lLCBucC0+Y3VyX3R4LCBucC0+ZGlydHlfdHgsCisJCQlucC0+Y3VyX3J4LCBucC0+ZGlydHlfcngpOworCisJLyoKKwkgKiBGSVhNRTogd2hhdCBpZiBzb21lb25lIHRyaWVzIHRvIGNsb3NlIGEgZGV2aWNlCisJICogdGhhdCBpcyBzdXNwZW5kZWQ/CisJICogU2hvdWxkIHdlIHJlZW5hYmxlIHRoZSBuaWMgdG8gc3dpdGNoIHRvCisJICogdGhlIGZpbmFsIFdPTCBzZXR0aW5ncz8KKwkgKi8KKworCWRlbF90aW1lcl9zeW5jKCZucC0+dGltZXIpOworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzLCBhbmQgZmx1c2ggcG9zdGVkIHdyaXRlcyAqLworCXdyaXRlbCgwLCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKwlyZWFkbChpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKwlucC0+aGFuZHNfb2ZmID0gMTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJLyogSW50ZXJydXB0IGRpc2FibGVkLCBpbnRlcnJ1cHQgaGFuZGxlciByZWxlYXNlZCwKKwkgKiBxdWV1ZSBzdG9wcGVkLCB0aW1lciBkZWxldGVkLCBydG5sX2xvY2sgaGVsZAorCSAqIEFsbCBhc3luYyBjb2RlcGF0aHMgdGhhdCBhY2Nlc3MgdGhlIGRyaXZlciBhcmUgZGlzYWJsZWQuCisJICovCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCW5wLT5oYW5kc19vZmYgPSAwOworCXJlYWRsKGlvYWRkciArIEludHJNYXNrKTsKKwlyZWFkdyhpb2FkZHIgKyBNSW50clN0YXR1cyk7CisKKwkvKiBGcmVlemUgU3RhdHMgKi8KKwl3cml0ZWwoU3RhdHNGcmVlemUsIGlvYWRkciArIFN0YXRzQ3RybCk7CisKKwkvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KKwluYXRzZW1pX3N0b3Bfcnh0eChkZXYpOworCisJX19nZXRfc3RhdHMoZGV2KTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKworCS8qIGNsZWFyIHRoZSBjYXJyaWVyIGxhc3QgLSBhbiBpbnRlcnJ1cHQgY291bGQgcmVlbmFibGUgaXQgb3RoZXJ3aXNlICovCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlkdW1wX3JpbmcoZGV2KTsKKwlkcmFpbl9yaW5nKGRldik7CisJZnJlZV9yaW5nKGRldik7CisKKwl7CisJCXUzMiB3b2wgPSByZWFkbChpb2FkZHIgKyBXT0xDbWQpICYgV2FrZU9wdHNTdW1tYXJ5OworCQlpZiAod29sKSB7CisJCQkvKiByZXN0YXJ0IHRoZSBOSUMgaW4gV09MIG1vZGUuCisJCQkgKiBUaGUgbmljIG11c3QgYmUgc3RvcHBlZCBmb3IgdGhpcy4KKwkJCSAqLworCQkJZW5hYmxlX3dvbF9tb2RlKGRldiwgMCk7CisJCX0gZWxzZSB7CisJCQkvKiBSZXN0b3JlIFBNRSBlbmFibGUgYml0IHVubW9sZXN0ZWQgKi8KKwkJCXdyaXRlbChucC0+U2F2ZWRDbGtSdW4sIGlvYWRkciArIENsa1J1bik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IG5hdHNlbWlfcmVtb3ZlMSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2b2lkIF9faW9tZW0gKiBpb2FkZHIgPSBuc19pb2FkZHIoZGV2KTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2IChkZXYpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMgKHBkZXYpOworCWlvdW5tYXAoaW9hZGRyKTsKKwlmcmVlX25ldGRldiAoZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKworLyoKKyAqIFRoZSBuczgzODE1IGNoaXAgZG9lc24ndCBoYXZlIGV4cGxpY2l0IFJ4U3RvcCBiaXRzLgorICogS2lja2luZyB0aGUgUnggb3IgVHggcHJvY2VzcyBmb3IgYSBuZXcgcGFja2V0IHJlZW5hYmxlcyB0aGUgUnggcHJvY2VzcworICogb2YgdGhlIG5pYywgdGh1cyB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgdmVyeSBjYXJlZnVsOgorICoKKyAqIHN1c3BlbmQvcmVzdW1lIHN5bmNocm9uaXphdGlvbjoKKyAqIGVudHJ5IHBvaW50czoKKyAqICAgbmV0ZGV2X29wZW4sIG5ldGRldl9jbG9zZSwgbmV0ZGV2X2lvY3RsLCBzZXRfcnhfbW9kZSwgaW50cl9oYW5kbGVyLAorICogICBzdGFydF90eCwgdHhfdGltZW91dAorICoKKyAqIE5vIGZ1bmN0aW9uIGFjY2Vzc2VzIHRoZSBoYXJkd2FyZSB3aXRob3V0IGNoZWNraW5nIG5wLT5oYW5kc19vZmYuCisgKgl0aGUgY2hlY2sgb2NjdXJzIHVuZGVyIHNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKyAqIGV4Y2VwdGlvbnM6CisgKgkqIG5ldGRldl9pb2N0bDogbm9uY3JpdGljYWwgYWNjZXNzLgorICoJKiBuZXRkZXZfb3BlbjogY2Fubm90IGhhcHBlbiBkdWUgdG8gdGhlIGRldmljZV9kZXRhY2gKKyAqCSogbmV0ZGV2X2Nsb3NlOiBkb2Vzbid0IGh1cnQuCisgKgkqIG5ldGRldl90aW1lcjogdGltZXIgc3RvcHBlZCBieSBuYXRzZW1pX3N1c3BlbmQuCisgKgkqIGludHJfaGFuZGxlcjogZG9lc24ndCBhY3F1aXJlIHRoZSBzcGlubG9jay4gc3VzcGVuZCBjYWxscworICoJCWRpc2FibGVfaXJxKCkgdG8gZW5mb3JjZSBzeW5jaHJvbml6YXRpb24uCisgKgorICogSW50ZXJydXB0cyBtdXN0IGJlIGRpc2FibGVkLCBvdGhlcndpc2UgaGFuZHNfb2ZmIGNhbiBjYXVzZSBpcnEgc3Rvcm1zLgorICovCisKK3N0YXRpYyBpbnQgbmF0c2VtaV9zdXNwZW5kIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqIGlvYWRkciA9IG5zX2lvYWRkcihkZXYpOworCisJcnRubF9sb2NrKCk7CisJaWYgKG5ldGlmX3J1bm5pbmcgKGRldikpIHsKKwkJZGVsX3RpbWVyX3N5bmMoJm5wLT50aW1lcik7CisKKwkJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCQlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisKKwkJd3JpdGVsKDAsIGlvYWRkciArIEludHJFbmFibGUpOworCQlucC0+aGFuZHNfb2ZmID0gMTsKKwkJbmF0c2VtaV9zdG9wX3J4dHgoZGV2KTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCQllbmFibGVfaXJxKGRldi0+aXJxKTsKKworCQkvKiBVcGRhdGUgdGhlIGVycm9yIGNvdW50cy4gKi8KKwkJX19nZXRfc3RhdHMoZGV2KTsKKworCQkvKiBwY2lfcG93ZXJfb2ZmKHBkZXYsIC0xKTsgKi8KKwkJZHJhaW5fcmluZyhkZXYpOworCQl7CisJCQl1MzIgd29sID0gcmVhZGwoaW9hZGRyICsgV09MQ21kKSAmIFdha2VPcHRzU3VtbWFyeTsKKwkJCS8qIFJlc3RvcmUgUE1FIGVuYWJsZSBiaXQgKi8KKwkJCWlmICh3b2wpIHsKKwkJCQkvKiByZXN0YXJ0IHRoZSBOSUMgaW4gV09MIG1vZGUuCisJCQkJICogVGhlIG5pYyBtdXN0IGJlIHN0b3BwZWQgZm9yIHRoaXMuCisJCQkJICogRklYTUU6IHVzZSB0aGUgV09MIGludGVycnVwdAorCQkJCSAqLworCQkJCWVuYWJsZV93b2xfbW9kZShkZXYsIDApOworCQkJfSBlbHNlIHsKKwkJCQkvKiBSZXN0b3JlIFBNRSBlbmFibGUgYml0IHVubW9sZXN0ZWQgKi8KKwkJCQl3cml0ZWwobnAtPlNhdmVkQ2xrUnVuLCBpb2FkZHIgKyBDbGtSdW4pOworCQkJfQorCQl9CisJfQorCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwlydG5sX3VubG9jaygpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgbmF0c2VtaV9yZXN1bWUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcnRubF9sb2NrKCk7CisJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCWdvdG8gb3V0OworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJQlVHX09OKCFucC0+aGFuZHNfb2ZmKTsKKwkJcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJLyoJcGNpX3Bvd2VyX29uKHBkZXYpOyAqLworCisJCW5hdHNlbWlfcmVzZXQoZGV2KTsKKwkJaW5pdF9yaW5nKGRldik7CisJCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwkJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCQlucC0+aGFuZHNfb2ZmID0gMDsKKwkJaW5pdF9yZWdpc3RlcnMoZGV2KTsKKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCQlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwkJZW5hYmxlX2lycShkZXYtPmlycSk7CisKKwkJbW9kX3RpbWVyKCZucC0+dGltZXIsIGppZmZpZXMgKyAxKkhaKTsKKwl9CisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworb3V0OgorCXJ0bmxfdW5sb2NrKCk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIG5hdHNlbWlfZHJpdmVyID0geworCS5uYW1lCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQk9IG5hdHNlbWlfcGNpX3RibCwKKwkucHJvYmUJCT0gbmF0c2VtaV9wcm9iZTEsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChuYXRzZW1pX3JlbW92ZTEpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gbmF0c2VtaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gbmF0c2VtaV9yZXN1bWUsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG5hdHNlbWlfaW5pdF9tb2QgKHZvaWQpCit7CisvKiB3aGVuIGEgbW9kdWxlLCB0aGlzIGlzIHByaW50ZWQgd2hldGhlciBvciBub3QgZGV2aWNlcyBhcmUgZm91bmQgaW4gcHJvYmUgKi8KKyNpZmRlZiBNT0RVTEUKKwlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKworCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZuYXRzZW1pX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuYXRzZW1pX2V4aXRfbW9kICh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJm5hdHNlbWlfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobmF0c2VtaV9pbml0X21vZCk7Cittb2R1bGVfZXhpdChuYXRzZW1pX2V4aXRfbW9kKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmUtaDgzMDAuYyBiL2RyaXZlcnMvbmV0L25lLWg4MzAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRlMjkxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L25lLWg4MzAwLmMKQEAgLTAsMCArMSw2NzAgQEAKKy8qIG5lLWg4MzAwLmM6IEEgTkUyMDAwIGNsb25lIG9uIEg4LzMwMCBkcml2ZXIgZm9yIGxpbnV4LiAqLworLyoKKyAgICBvcmlnaW5hbCBuZS5jCisgICAgV3JpdHRlbiAxOTkyLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisKKyAgICBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgICAgRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKworICAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAgICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisgICAgVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKyAgICBTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24sIDQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwLCBBbm5hcG9saXMgTUQgMjE0MDMKKworICAgIEg4LzMwMCBtb2RpZmllZAorICAgIFlvc2hpbm9yaSBTYXRvIDx5c2F0b0B1c2Vycy5zb3VyY2Vmb3JnZS5qcD4KKyovCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb24xW10gPQorIm5lLWg4MzAwLmM6djEuMDAgMjAwNC8wNC8xMSB5c2F0b1xuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlICI4MzkwLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgIm5lLWg4MzAwIgorCisvKiBTb21lIGRlZmluZXMgdGhhdCBwZW9wbGUgY2FuIHBsYXkgd2l0aCBpZiBzbyBpbmNsaW5lZC4gKi8KKworLyogRG8gd2UgcGVyZm9ybSBleHRyYSBzYW5pdHkgY2hlY2tzIG9uIHN0dWZmID8gKi8KKy8qICNkZWZpbmUgTkVfU0FOSVRZX0NIRUNLICovCisKKy8qIERvIHdlIGltcGxlbWVudCB0aGUgcmVhZCBiZWZvcmUgd3JpdGUgYnVnZml4ID8gKi8KKy8qICNkZWZpbmUgTkVfUldfQlVHRklYICovCisKKy8qIERvIHdlIGhhdmUgYSBub24gc3RkLiBhbW91bnQgb2YgbWVtb3J5PyAoaW4gdW5pdHMgb2YgMjU2IGJ5dGUgcGFnZXMpICovCisvKiAjZGVmaW5lIFBBQ0tFVEJVRl9NRU1TSVpFCTB4NDAgKi8KKworLyogQSB6ZXJvLXRlcm1pbmF0ZWQgbGlzdCBvZiBJL08gYWRkcmVzc2VzIHRvIGJlIHByb2JlZCBhdCBib290LiAqLworCisvKiAtLS0tIE5vIHVzZXItc2VydmljZWFibGUgcGFydHMgYmVsb3cgLS0tLSAqLworCisjZGVmaW5lIE5FX0JBU0UJIChkZXYtPmJhc2VfYWRkcikKKyNkZWZpbmUgTkVfQ01ECSAJMHgwMAorI2RlZmluZSBORV9EQVRBUE9SVAkoZWlfc3RhdHVzLndvcmQxNj8weDIwOjB4MTApCS8qIE5hdFNlbWktZGVmaW5lZCBwb3J0IHdpbmRvdyBvZmZzZXQuICovCisjZGVmaW5lIE5FX1JFU0VUCShlaV9zdGF0dXMud29yZDE2PzB4M2Y6MHgxZikJLyogSXNzdWUgYSByZWFkIHRvIHJlc2V0LCBhIHdyaXRlIHRvIGNsZWFyLiAqLworI2RlZmluZSBORV9JT19FWFRFTlQJKGVpX3N0YXR1cy53b3JkMTY/MHg0MDoweDIwKQorCisjZGVmaW5lIE5FU01fU1RBUlRfUEcJMHg0MAkvKiBGaXJzdCBwYWdlIG9mIFRYIGJ1ZmZlciAqLworI2RlZmluZSBORVNNX1NUT1BfUEcJMHg4MAkvKiBMYXN0IHBhZ2UgKzEgb2YgUlggcmluZyAqLworCitzdGF0aWMgaW50IG5lX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKTsKKworc3RhdGljIGludCBuZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBuZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHZvaWQgbmVfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG5lX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLAorCQkJICBpbnQgcmluZ19wYWdlKTsKK3N0YXRpYyB2b2lkIG5lX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIG5lX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBpbnQgY291bnQsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgY29uc3QgaW50IHN0YXJ0X3BhZ2UpOworCisKK3N0YXRpYyB1MzIgcmVnX29mZnNldFsxNl07CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcmVnX29mZnNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyKQoreworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIGJ1c193aWR0aDsKKworCWJ1c193aWR0aCA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKUFCV0NSOworCWJ1c193aWR0aCAmPSAxIDw8ICgoYmFzZV9hZGRyID4+IDIxKSAmIDcpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihyZWdfb2Zmc2V0KSAvIHNpemVvZih1MzIpOyBpKyspCisJCWlmIChidXNfd2lkdGggPT0gMCkKKwkJCXJlZ19vZmZzZXRbaV0gPSBpICogMiArIDE7CisJCWVsc2UKKwkJCXJlZ19vZmZzZXRbaV0gPSBpOworCisJZWlfbG9jYWwtPnJlZ19vZmZzZXQgPSByZWdfb2Zmc2V0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaDgzMDBfbmVfY291bnQgPSAwOworI2lmZGVmIENPTkZJR19IODMwMEhfSDhNQVgKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgaDgzMDBfbmVfYmFzZVtdID0geyAweDgwMDYwMCB9Oworc3RhdGljIGludCBoODMwMF9uZV9pcnFbXSA9IHtFWFRfSVJRNH07CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSDgzMDBIX0FLSTMwNjhORVQKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgaDgzMDBfbmVfYmFzZVtdID0geyAweDIwMDAwMCB9Oworc3RhdGljIGludCBoODMwMF9uZV9pcnFbXSA9IHtFWFRfSVJRNX07CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgaW5pdF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoaDgzMDBfbmVfY291bnQgPCAoc2l6ZW9mKGg4MzAwX25lX2Jhc2UpIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkgeworCQlkZXYtPmJhc2VfYWRkciA9IGg4MzAwX25lX2Jhc2VbaDgzMDBfbmVfY291bnRdOworCQlkZXYtPmlycSAgICAgICA9IGg4MzAwX25lX2lycVtoODMwMF9uZV9jb3VudF07CisJCWg4MzAwX25lX2NvdW50Kys7CisJCXJldHVybiAwOworCX0gZWxzZQorCQlyZXR1cm4gLUVOT0RFVjsKK30KKworLyogIFByb2JlIGZvciB2YXJpb3VzIG5vbi1zaGFyZWQtbWVtb3J5IGV0aGVyY2FyZHMuCisKKyAgIE5FeDAwMC1jbG9uZSBib2FyZHMgaGF2ZSBhIFN0YXRpb24gQWRkcmVzcyBQUk9NIChTQVBST00pIGluIHRoZSBwYWNrZXQKKyAgIGJ1ZmZlciBtZW1vcnkgc3BhY2UuICBORTIwMDAgY2xvbmVzIGhhdmUgMHg1NywweDU3IGluIGJ5dGVzIDB4MGUsMHgwZiBvZgorICAgdGhlIFNBUFJPTSwgd2hpbGUgb3RoZXIgc3VwcG9zZWQgTkUyMDAwIGNsb25lcyBtdXN0IGJlIGRldGVjdGVkIGJ5IHRoZWlyCisgICBTQSBwcmVmaXguCisKKyAgIFJlYWRpbmcgdGhlIFNBUFJPTSBmcm9tIGEgd29yZC13aWRlIGNhcmQgd2l0aCB0aGUgODM5MCBzZXQgaW4gYnl0ZS13aWRlCisgICBtb2RlIHJlc3VsdHMgaW4gZG91YmxlZCB2YWx1ZXMsIHdoaWNoIGNhbiBiZSBkZXRlY3RlZCBhbmQgY29tcGVuc2F0ZWQgZm9yLgorCisgICBUaGUgcHJvYmUgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGl6aW5nIHRoZSBjYXJkIGFuZCBmaWxsaW5nCisgICBpbiB0aGUgJ2RldicgYW5kICdlaV9zdGF0dXMnIHN0cnVjdHVyZXMuCisKKyAgIFdlIHVzZSB0aGUgbWluaW11bSBtZW1vcnkgc2l6ZSBmb3Igc29tZSBldGhlcmNhcmQgcHJvZHVjdCBsaW5lcywgaWZmIHdlIGNhbid0CisgICBkaXN0aW5ndWlzaCBtb2RlbHMuICBZb3UgY2FuIGluY3JlYXNlIHRoZSBwYWNrZXQgYnVmZmVyIHNpemUgYnkgc2V0dGluZworICAgUEFDS0VUQlVGX01FTVNJWkUuICBSZXBvcnRlZCBDYWJsZXRyb24gcGFja2V0IGJ1ZmZlciBsb2NhdGlvbnMgYXJlOgorCUUxMDEwICAgc3RhcnRzIGF0IDB4MTAwIGFuZCBlbmRzIGF0IDB4MjAwMC4KKwlFMTAxMC14IHN0YXJ0cyBhdCAweDEwMCBhbmQgZW5kcyBhdCAweDgwMDAuICgiLXgiIG1lYW5zICJtb3JlIG1lbW9yeSIpCisJRTIwMTAJIHN0YXJ0cyBhdCAweDEwMCBhbmQgZW5kcyBhdCAweDQwMDAuCisJRTIwMTAteCBzdGFydHMgYXQgMHgxMDAgYW5kIGVuZHMgYXQgMHhmZmZmLiAgKi8KKworc3RhdGljIGludCBfX2luaXQgZG9fbmVfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBpbnQgYmFzZV9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwkvKiBGaXJzdCBjaGVjayBhbnkgc3VwcGxpZWQgaS9vIGxvY2F0aW9ucy4gVXNlciBrbm93cyBiZXN0LiA8Y291Z2g+ICovCisJaWYgKGJhc2VfYWRkciA+IDB4MWZmKQkvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCXJldHVybiBuZV9wcm9iZTEoZGV2LCBiYXNlX2FkZHIpOworCWVsc2UgaWYgKGJhc2VfYWRkciAhPSAwKQkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCXJldHVybiAtRU5YSU87CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIE5FX0lPX0VYVEVOVCk7Cit9CisKKyNpZm5kZWYgTU9EVUxFCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBuZV9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmIChpbml0X2RldihkZXYpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCisJZXJyID0gaW5pdF9yZWdfb2Zmc2V0KGRldiwgZGV2LT5iYXNlX2FkZHIpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gZG9fbmVfcHJvYmUoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJY2xlYW51cF9jYXJkKGRldik7CitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IG5lX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgU0FfcHJvbVsxNl07CisJaW50IHdvcmRsZW5ndGggPSAyOworCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworCWludCBzdGFydF9wYWdlLCBzdG9wX3BhZ2U7CisJaW50IHJlZzAsIHJldDsKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBjaGFyIGJ1c193aWR0aDsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBORV9JT19FWFRFTlQsIERSVl9OQU1FKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJlZzAgPSBpbmJfcChpb2FkZHIpOworCWlmIChyZWcwID09IDB4RkYpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qIERvIGEgcHJlbGltaW5hcnkgdmVyaWZpY2F0aW9uIHRoYXQgd2UgaGF2ZSBhIDgzOTAuICovCisJeworCQlpbnQgcmVnZDsKKwkJb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UxK0U4MzkwX1NUT1AsIGlvYWRkciArIEU4MzkwX0NNRCk7CisJCXJlZ2QgPSBpbmJfcChpb2FkZHIgKyBFSV9TSElGVCgweDBkKSk7CisJCW91dGJfcCgweGZmLCBpb2FkZHIgKyBFSV9TSElGVCgweDBkKSk7CisJCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCwgaW9hZGRyICsgRTgzOTBfQ01EKTsKKwkJaW5iX3AoaW9hZGRyICsgRU4wX0NPVU5URVIwKTsgLyogQ2xlYXIgdGhlIGNvdW50ZXIgYnkgcmVhZGluZy4gKi8KKwkJaWYgKGluYl9wKGlvYWRkciArIEVOMF9DT1VOVEVSMCkgIT0gMCkgeworCQkJb3V0Yl9wKHJlZzAsIGlvYWRkciArIEVJX1NISUZUKDApKTsKKwkJCW91dGJfcChyZWdkLCBpb2FkZHIgKyBFSV9TSElGVCgweDBkKSk7CS8qIFJlc3RvcmUgdGhlIG9sZCB2YWx1ZXMuICovCisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byBlcnJfb3V0OworCQl9CisJfQorCisJaWYgKGVpX2RlYnVnICAmJiAgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uMSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJORSowMDAgZXRoZXJjYXJkIHByb2JlIGF0ICUwOHg6IiwgaW9hZGRyKTsKKworCS8qIFJlYWQgdGhlIDE2IGJ5dGVzIG9mIHN0YXRpb24gYWRkcmVzcyBQUk9NLgorCSAgIFdlIG11c3QgZmlyc3QgaW5pdGlhbGl6ZSByZWdpc3RlcnMsIHNpbWlsYXIgdG8gTlM4MzkwX2luaXQoZWlmZGV2LCAwKS4KKwkgICBXZSBjYW4ndCByZWxpYWJseSByZWFkIHRoZSBTQVBST00gYWRkcmVzcyB3aXRob3V0IHRoaXMuCisJICAgKEkgbGVhcm5lZCB0aGUgaGFyZCB3YXkhKS4gKi8KKwl7CisJCXN0cnVjdCB7dW5zaWduZWQgY2hhciB2YWx1ZSwgb2Zmc2V0OyB9IHByb2dyYW1fc2VxW10gPQorCQl7CisJCQl7RTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgRTgzOTBfQ01EfSwgLyogU2VsZWN0IHBhZ2UgMCovCisJCQl7MHg0OCwJRU4wX0RDRkd9LAkvKiBTZXQgYnl0ZS13aWRlICgweDQ4KSBhY2Nlc3MuICovCisJCQl7MHgwMCwJRU4wX1JDTlRMT30sCS8qIENsZWFyIHRoZSBjb3VudCByZWdzLiAqLworCQkJezB4MDAsCUVOMF9SQ05USEl9LAorCQkJezB4MDAsCUVOMF9JTVJ9LAkvKiBNYXNrIGNvbXBsZXRpb24gaXJxLiAqLworCQkJezB4RkYsCUVOMF9JU1J9LAorCQkJe0U4MzkwX1JYT0ZGLCBFTjBfUlhDUn0sCS8qIDB4MjAgIFNldCB0byBtb25pdG9yICovCisJCQl7RTgzOTBfVFhPRkYsIEVOMF9UWENSfSwJLyogMHgwMiAgYW5kIGxvb3BiYWNrIG1vZGUuICovCisJCQl7MzIsCUVOMF9SQ05UTE99LAorCQkJezB4MDAsCUVOMF9SQ05USEl9LAorCQkJezB4MDAsCUVOMF9SU0FSTE99LAkvKiBETUEgc3RhcnRpbmcgYXQgMHgwMDAwLiAqLworCQkJezB4MDAsCUVOMF9SU0FSSEl9LAorCQkJe0U4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBFODM5MF9DTUR9LAorCQl9OworCisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocHJvZ3JhbV9zZXEpL3NpemVvZihwcm9ncmFtX3NlcVswXSk7IGkrKykKKwkJCW91dGJfcChwcm9ncmFtX3NlcVtpXS52YWx1ZSwgaW9hZGRyICsgcHJvZ3JhbV9zZXFbaV0ub2Zmc2V0KTsKKworCX0KKwlidXNfd2lkdGggPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilBQldDUjsKKwlidXNfd2lkdGggJj0gMSA8PCAoKGlvYWRkciA+PiAyMSkgJiA3KTsKKwllaV9zdGF0dXMud29yZDE2ID0gKGJ1c193aWR0aCA9PSAwKTsgLyogdGVtcG9yYXJ5IHNldHRpbmcgKi8KKwlmb3IoaSA9IDA7IGkgPCAxNiAvKnNpemVvZihTQV9wcm9tKSovOyBpKyspIHsKKwkJU0FfcHJvbVtpXSA9IGluYl9wKGlvYWRkciArIE5FX0RBVEFQT1JUKTsKKwkJaW5iX3AoaW9hZGRyICsgTkVfREFUQVBPUlQpOyAvKiBkdW1teSByZWFkICovCisJfQorCisJc3RhcnRfcGFnZSA9IE5FU01fU1RBUlRfUEc7CisJc3RvcF9wYWdlID0gTkVTTV9TVE9QX1BHOworCisJaWYgKGJ1c193aWR0aCkKKwkJd29yZGxlbmd0aCA9IDE7CisJZWxzZQorCQlvdXRiX3AoMHg0OSwgaW9hZGRyICsgRU4wX0RDRkcpOworCisJLyogU2V0IHVwIHRoZSByZXN0IG9mIHRoZSBwYXJhbWV0ZXJzLiAqLworCW5hbWUgPSAod29yZGxlbmd0aCA9PSAyKSA/ICJORTIwMDAiIDogIk5FMTAwMCI7CisKKwlpZiAoISBkZXYtPmlycSkgeworCQlwcmludGsoIiBmYWlsZWQgdG8gZGV0ZWN0IElSUSBsaW5lLlxuIik7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKiBTbmFyZiB0aGUgaW50ZXJydXB0IG5vdy4gIFRoZXJlJ3Mgbm8gcG9pbnQgaW4gd2FpdGluZyBzaW5jZSB3ZSBjYW5ub3QKKwkgICBzaGFyZSBhbmQgdGhlIGJvYXJkIHdpbGwgdXN1YWxseSBiZSBlbmFibGVkLiAqLworCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBlaV9pbnRlcnJ1cHQsIDAsIG5hbWUsIGRldik7CisJaWYgKHJldCkgeworCQlwcmludGsgKCIgdW5hYmxlIHRvIGdldCBJUlEgJWQgKGVycm5vPSVkKS5cbiIsIGRldi0+aXJxLCByZXQpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisKKwlmb3IoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKSB7CisJCXByaW50aygiICUyLjJ4IiwgU0FfcHJvbVtpXSk7CisJCWRldi0+ZGV2X2FkZHJbaV0gPSBTQV9wcm9tW2ldOworCX0KKworCXByaW50aygiXG4lczogJXMgZm91bmQgYXQgJSN4LCB1c2luZyBJUlEgJWQuXG4iLAorCQlkZXYtPm5hbWUsIG5hbWUsIGlvYWRkciwgZGV2LT5pcnEpOworCisJZWlfc3RhdHVzLm5hbWUgPSBuYW1lOworCWVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gc3RhcnRfcGFnZTsKKwllaV9zdGF0dXMuc3RvcF9wYWdlID0gc3RvcF9wYWdlOworCWVpX3N0YXR1cy53b3JkMTYgPSAod29yZGxlbmd0aCA9PSAyKTsKKworCWVpX3N0YXR1cy5yeF9zdGFydF9wYWdlID0gc3RhcnRfcGFnZSArIFRYX1BBR0VTOworI2lmZGVmIFBBQ0tFVEJVRl9NRU1TSVpFCisJIC8qIEFsbG93IHRoZSBwYWNrZXQgYnVmZmVyIHNpemUgdG8gYmUgb3ZlcnJpZGRlbiBieSBrbm93LWl0LWFsbHMuICovCisJZWlfc3RhdHVzLnN0b3BfcGFnZSA9IGVpX3N0YXR1cy50eF9zdGFydF9wYWdlICsgUEFDS0VUQlVGX01FTVNJWkU7CisjZW5kaWYKKworCWVpX3N0YXR1cy5yZXNldF84MzkwID0gJm5lX3Jlc2V0XzgzOTA7CisJZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJm5lX2Jsb2NrX2lucHV0OworCWVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmbmVfYmxvY2tfb3V0cHV0OworCWVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmbmVfZ2V0XzgzOTBfaGRyOworCWVpX3N0YXR1cy5wcml2ID0gMDsKKwlkZXYtPm9wZW4gPSAmbmVfb3BlbjsKKwlkZXYtPnN0b3AgPSAmbmVfY2xvc2U7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CisjZW5kaWYKKwlOUzgzOTBfaW5pdChkZXYsIDApOworCXJldHVybiAwOworCitlcnJfb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgTkVfSU9fRVhURU5UKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG5lX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllaV9vcGVuKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoZWlfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKKwllaV9jbG9zZShkZXYpOworCXJldHVybiAwOworfQorCisvKiBIYXJkIHJlc2V0IHRoZSBjYXJkLiAgVGhpcyB1c2VkIHRvIHBhdXNlIGZvciB0aGUgc2FtZSBwZXJpb2QgdGhhdCBhCisgICA4MzkwIHJlc2V0IGNvbW1hbmQgcmVxdWlyZWQsIGJ1dCB0aGF0IHNob3VsZG4ndCBiZSBuZWNlc3NhcnkuICovCisKK3N0YXRpYyB2b2lkIG5lX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIHJlc2V0X3N0YXJ0X3RpbWUgPSBqaWZmaWVzOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChlaV9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICJyZXNldHRpbmcgdGhlIDgzOTAgdD0lbGQuLi4iLCBqaWZmaWVzKTsKKworCS8qIERPTidUIGNoYW5nZSB0aGVzZSB0byBpbmJfcC9vdXRiX3Agb3IgcmVzZXQgd2lsbCBmYWlsIG9uIGNsb25lcy4gKi8KKwlvdXRiKGluYihORV9CQVNFICsgTkVfUkVTRVQpLCBORV9CQVNFICsgTkVfUkVTRVQpOworCisJZWlfc3RhdHVzLnR4aW5nID0gMDsKKwllaV9zdGF0dXMuZG1haW5nID0gMDsKKworCS8qIFRoaXMgY2hlY2sgX3Nob3VsZF9ub3RfIGJlIG5lY2Vzc2FyeSwgb21pdCBldmVudHVhbGx5LiAqLworCXdoaWxlICgoaW5iX3AoTkVfQkFTRStFTjBfSVNSKSAmIEVOSVNSX1JFU0VUKSA9PSAwKQorCQlpZiAoamlmZmllcyAtIHJlc2V0X3N0YXJ0X3RpbWUgPiAyKkhaLzEwMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG5lX3Jlc2V0XzgzOTAoKSBkaWQgbm90IGNvbXBsZXRlLlxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQl9CisJb3V0Yl9wKEVOSVNSX1JFU0VULCBORV9CQVNFICsgRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworfQorCisvKiBHcmFiIHRoZSA4MzkwIHNwZWNpZmljIGhlYWRlci4gU2ltaWxhciB0byB0aGUgYmxvY2tfaW5wdXQgcm91dGluZSwgYnV0CisgICB3ZSBkb24ndCBuZWVkIHRvIGJlIGNvbmNlcm5lZCB3aXRoIHJpbmcgd3JhcCBhcyB0aGUgaGVhZGVyIHdpbGwgYmUgYXQKKyAgIHRoZSBzdGFydCBvZiBhIHBhZ2UsIHNvIHdlIG9wdGltaXplIGFjY29yZGluZ2x5LiAqLworCitzdGF0aWMgdm9pZCBuZV9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSkKK3sKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworCisJaWYgKGVpX3N0YXR1cy5kbWFpbmcpCisJeworCQlwcmludGsoS0VSTl9FTUVSRyAiJXM6IERNQWluZyBjb25mbGljdCBpbiBuZV9nZXRfODM5MF9oZHIgIgorCQkJIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXS5cbiIsCisJCQlkZXYtPm5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKwlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQsIE5FX0JBU0UgKyBORV9DTUQpOworCW91dGJfcChzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpLCBORV9CQVNFICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKDAsIE5FX0JBU0UgKyBFTjBfUkNOVEhJKTsKKwlvdXRiX3AoMCwgTkVfQkFTRSArIEVOMF9SU0FSTE8pOwkJLyogT24gcGFnZSBib3VuZGFyeSAqLworCW91dGJfcChyaW5nX3BhZ2UsIE5FX0JBU0UgKyBFTjBfUlNBUkhJKTsKKwlvdXRiX3AoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIE5FX0JBU0UgKyBORV9DTUQpOworCisJaWYgKGVpX3N0YXR1cy53b3JkMTYpIHsKKwkJaW50IGxlbjsKKwkJdW5zaWduZWQgc2hvcnQgKnAgPSAodW5zaWduZWQgc2hvcnQgKiloZHI7CisJCWZvciAobGVuID0gc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKT4+MTsgbGVuID4gMDsgbGVuLS0pCisJCQkqcCsrID0gaW53KE5FX0JBU0UgKyBORV9EQVRBUE9SVCk7CisJfSBlbHNlCisJCWluc2IoTkVfQkFTRSArIE5FX0RBVEFQT1JULCBoZHIsIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcikpOworCisJb3V0Yl9wKEVOSVNSX1JEQywgTkVfQkFTRSArIEVOMF9JU1IpOwkvKiBBY2sgaW50ci4gKi8KKwllaV9zdGF0dXMuZG1haW5nICY9IH4weDAxOworCisJbGUxNl90b19jcHVzKCZoZHItPmNvdW50KTsKK30KKworLyogQmxvY2sgaW5wdXQgYW5kIG91dHB1dCwgc2ltaWxhciB0byB0aGUgQ3J5bndyIHBhY2tldCBkcml2ZXIuICBJZiB5b3UKKyAgIGFyZSBwb3J0aW5nIHRvIGEgbmV3IGV0aGVyY2FyZCwgbG9vayBhdCB0aGUgcGFja2V0IGRyaXZlciBzb3VyY2UgZm9yIGhpbnRzLgorICAgVGhlIE5FeDAwMCBkb2Vzbid0IHNoYXJlIHRoZSBvbi1ib2FyZCBwYWNrZXQgbWVtb3J5IC0tIHlvdSBoYXZlIHRvIHB1dAorICAgdGhlIHBhY2tldCBvdXQgdGhyb3VnaCB0aGUgInJlbW90ZSBETUEiIGRhdGFwb3J0IHVzaW5nIG91dGIuICovCisKK3N0YXRpYyB2b2lkIG5lX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KQoreworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKyNpZmRlZiBORV9TQU5JVFlfQ0hFQ0sKKwlpbnQgeGZlcl9jb3VudCA9IGNvdW50OworI2VuZGlmCisJY2hhciAqYnVmID0gc2tiLT5kYXRhOworCisJLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworCWlmIChlaV9zdGF0dXMuZG1haW5nKQorCXsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIiVzOiBETUFpbmcgY29uZmxpY3QgaW4gbmVfYmxvY2tfaW5wdXQgIgorCQkJIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXS5cbiIsCisJCQlkZXYtPm5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrKTsKKwkJcmV0dXJuOworCX0KKwllaV9zdGF0dXMuZG1haW5nIHw9IDB4MDE7CisJb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUQVJULCBORV9CQVNFICsgTkVfQ01EKTsKKwlvdXRiX3AoY291bnQgJiAweGZmLCBORV9CQVNFICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKGNvdW50ID4+IDgsIE5FX0JBU0UgKyBFTjBfUkNOVEhJKTsKKwlvdXRiX3AocmluZ19vZmZzZXQgJiAweGZmLCBORV9CQVNFICsgRU4wX1JTQVJMTyk7CisJb3V0Yl9wKHJpbmdfb2Zmc2V0ID4+IDgsIE5FX0JBU0UgKyBFTjBfUlNBUkhJKTsKKwlvdXRiX3AoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIE5FX0JBU0UgKyBORV9DTUQpOworCWlmIChlaV9zdGF0dXMud29yZDE2KQorCXsKKwkJaW50IGxlbjsKKwkJdW5zaWduZWQgc2hvcnQgKnAgPSAodW5zaWduZWQgc2hvcnQgKilidWY7CisJCWZvciAobGVuID0gY291bnQ+PjE7IGxlbiA+IDA7IGxlbi0tKQorCQkJKnArKyA9IGludyhORV9CQVNFICsgTkVfREFUQVBPUlQpOworCQlpZiAoY291bnQgJiAweDAxKQorCQl7CisJCQlidWZbY291bnQtMV0gPSBpbmIoTkVfQkFTRSArIE5FX0RBVEFQT1JUKTsKKyNpZmRlZiBORV9TQU5JVFlfQ0hFQ0sKKwkJCXhmZXJfY291bnQrKzsKKyNlbmRpZgorCQl9CisJfSBlbHNlIHsKKwkJaW5zYihORV9CQVNFICsgTkVfREFUQVBPUlQsIGJ1ZiwgY291bnQpOworCX0KKworI2lmZGVmIE5FX1NBTklUWV9DSEVDSworCS8qIFRoaXMgd2FzIGZvciB0aGUgQUxQSEEgdmVyc2lvbiBvbmx5LCBidXQgZW5vdWdoIHBlb3BsZSBoYXZlCisJICAgYmVlbiBlbmNvdW50ZXJpbmcgcHJvYmxlbXMgc28gaXQgaXMgc3RpbGwgaGVyZS4gIElmIHlvdSBzZWUKKwkgICB0aGlzIG1lc3NhZ2UgeW91IGVpdGhlciAxKSBoYXZlIGEgc2xpZ2h0bHkgaW5jb21wYXRpYmxlIGNsb25lCisJICAgb3IgMikgaGF2ZSBub2lzZS9zcGVlZCBwcm9ibGVtcyB3aXRoIHlvdXIgYnVzLiAqLworCisJaWYgKGVpX2RlYnVnID4gMSkKKwl7CisJCS8qIERNQSB0ZXJtaW5hdGlvbiBhZGRyZXNzIGNoZWNrLi4uICovCisJCWludCBhZGRyLCB0cmllcyA9IDIwOworCQlkbyB7CisJCQkvKiBET04nVCBjaGVjayBmb3IgJ2luYl9wKEVOMF9JU1IpICYgRU5JU1JfUkRDJyBoZXJlCisJCQkgICAtLSBpdCdzIGJyb2tlbiBmb3IgUnggb24gc29tZSBjYXJkcyEgKi8KKwkJCWludCBoaWdoID0gaW5iX3AoTkVfQkFTRSArIEVOMF9SU0FSSEkpOworCQkJaW50IGxvdyA9IGluYl9wKE5FX0JBU0UgKyBFTjBfUlNBUkxPKTsKKwkJCWFkZHIgPSAoaGlnaCA8PCA4KSArIGxvdzsKKwkJCWlmICgoKHJpbmdfb2Zmc2V0ICsgeGZlcl9jb3VudCkgJiAweGZmKSA9PSBsb3cpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKC0tdHJpZXMgPiAwKTsKKwkgCWlmICh0cmllcyA8PSAwKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJYIHRyYW5zZmVyIGFkZHJlc3MgbWlzbWF0Y2gsIgorCQkJCSIlIzQuNHggKGV4cGVjdGVkKSB2cy4gJSM0LjR4IChhY3R1YWwpLlxuIiwKKwkJCQlkZXYtPm5hbWUsIHJpbmdfb2Zmc2V0ICsgeGZlcl9jb3VudCwgYWRkcik7CisJfQorI2VuZGlmCisJb3V0Yl9wKEVOSVNSX1JEQywgTkVfQkFTRSArIEVOMF9JU1IpOwkvKiBBY2sgaW50ci4gKi8KKwllaV9zdGF0dXMuZG1haW5nICY9IH4weDAxOworfQorCitzdGF0aWMgdm9pZCBuZV9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGNvbnN0IGludCBzdGFydF9wYWdlKQoreworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGRtYV9zdGFydDsKKyNpZmRlZiBORV9TQU5JVFlfQ0hFQ0sKKwlpbnQgcmV0cmllcyA9IDA7CisjZW5kaWYKKworCS8qIFJvdW5kIHRoZSBjb3VudCB1cCBmb3Igd29yZCB3cml0ZXMuICBEbyB3ZSBuZWVkIHRvIGRvIHRoaXM/CisJICAgV2hhdCBlZmZlY3Qgd2lsbCBhbiBvZGQgYnl0ZSBjb3VudCBoYXZlIG9uIHRoZSA4MzkwPworCSAgIEkgc2hvdWxkIGNoZWNrIHNvbWVkYXkuICovCisKKwlpZiAoZWlfc3RhdHVzLndvcmQxNiAmJiAoY291bnQgJiAweDAxKSkKKwkJY291bnQrKzsKKworCS8qIFRoaXMgKnNob3VsZG4ndCogaGFwcGVuLiBJZiBpdCBkb2VzLCBpdCdzIHRoZSBsYXN0IHRoaW5nIHlvdSdsbCBzZWUgKi8KKwlpZiAoZWlfc3RhdHVzLmRtYWluZykKKwl7CisJCXByaW50ayhLRVJOX0VNRVJHICIlczogRE1BaW5nIGNvbmZsaWN0IGluIG5lX2Jsb2NrX291dHB1dC4iCisJCQkiW0RNQXN0YXQ6JWRdW2lycWxvY2s6JWRdXG4iLAorCQkJZGV2LT5uYW1lLCBlaV9zdGF0dXMuZG1haW5nLCBlaV9zdGF0dXMuaXJxbG9jayk7CisJCXJldHVybjsKKwl9CisJZWlfc3RhdHVzLmRtYWluZyB8PSAweDAxOworCS8qIFdlIHNob3VsZCBhbHJlYWR5IGJlIGluIHBhZ2UgMCwgYnV0IHRvIGJlIHNhZmUuLi4gKi8KKwlvdXRiX3AoRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQrRTgzOTBfTk9ETUEsIE5FX0JBU0UgKyBORV9DTUQpOworCisjaWZkZWYgTkVfU0FOSVRZX0NIRUNLCityZXRyeToKKyNlbmRpZgorCisjaWZkZWYgTkU4MzkwX1JXX0JVR0ZJWAorCS8qIEhhbmRsZSB0aGUgcmVhZC1iZWZvcmUtd3JpdGUgYnVnIHRoZSBzYW1lIHdheSBhcyB0aGUKKwkgICBDcnlud3IgcGFja2V0IGRyaXZlciAtLSB0aGUgTmF0U2VtaSBtZXRob2QgZG9lc24ndCB3b3JrLgorCSAgIEFjdHVhbGx5IHRoaXMgZG9lc24ndCBhbHdheXMgd29yayBlaXRoZXIsIGJ1dCBpZiB5b3UgaGF2ZQorCSAgIHByb2JsZW1zIHdpdGggeW91ciBORXgwMDAgdGhpcyBpcyBiZXR0ZXIgdGhhbiBub3RoaW5nISAqLworCisJb3V0Yl9wKDB4NDIsIE5FX0JBU0UgKyBFTjBfUkNOVExPKTsKKwlvdXRiX3AoMHgwMCwgTkVfQkFTRSArIEVOMF9SQ05USEkpOworCW91dGJfcCgweDQyLCBORV9CQVNFICsgRU4wX1JTQVJMTyk7CisJb3V0Yl9wKDB4MDAsIE5FX0JBU0UgKyBFTjBfUlNBUkhJKTsKKwlvdXRiX3AoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIE5FX0JBU0UgKyBORV9DTUQpOworCS8qIE1ha2UgY2VydGFpbiB0aGF0IHRoZSBkdW1teSByZWFkIGhhcyBvY2N1cnJlZC4gKi8KKwl1ZGVsYXkoNik7CisjZW5kaWYKKworCW91dGJfcChFTklTUl9SREMsIE5FX0JBU0UgKyBFTjBfSVNSKTsKKworCS8qIE5vdyB0aGUgbm9ybWFsIG91dHB1dC4gKi8KKwlvdXRiX3AoY291bnQgJiAweGZmLCBORV9CQVNFICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKGNvdW50ID4+IDgsICAgTkVfQkFTRSArIEVOMF9SQ05USEkpOworCW91dGJfcCgweDAwLCBORV9CQVNFICsgRU4wX1JTQVJMTyk7CisJb3V0Yl9wKHN0YXJ0X3BhZ2UsIE5FX0JBU0UgKyBFTjBfUlNBUkhJKTsKKworCW91dGJfcChFODM5MF9SV1JJVEUrRTgzOTBfU1RBUlQsIE5FX0JBU0UgKyBORV9DTUQpOworCWlmIChlaV9zdGF0dXMud29yZDE2KSB7CisJCWludCBsZW47CisJCXVuc2lnbmVkIHNob3J0ICpwID0gKHVuc2lnbmVkIHNob3J0ICopYnVmOworCQlmb3IgKGxlbiA9IGNvdW50Pj4xOyBsZW4gPiAwOyBsZW4tLSkKKwkJCW91dHcoKnArKywgTkVfQkFTRSArIE5FX0RBVEFQT1JUKTsKKwl9IGVsc2UgeworCQlvdXRzYihORV9CQVNFICsgTkVfREFUQVBPUlQsIGJ1ZiwgY291bnQpOworCX0KKworCWRtYV9zdGFydCA9IGppZmZpZXM7CisKKyNpZmRlZiBORV9TQU5JVFlfQ0hFQ0sKKwkvKiBUaGlzIHdhcyBmb3IgdGhlIEFMUEhBIHZlcnNpb24gb25seSwgYnV0IGVub3VnaCBwZW9wbGUgaGF2ZQorCSAgIGJlZW4gZW5jb3VudGVyaW5nIHByb2JsZW1zIHNvIGl0IGlzIHN0aWxsIGhlcmUuICovCisKKwlpZiAoZWlfZGVidWcgPiAxKQorCXsKKwkJLyogRE1BIHRlcm1pbmF0aW9uIGFkZHJlc3MgY2hlY2suLi4gKi8KKwkJaW50IGFkZHIsIHRyaWVzID0gMjA7CisJCWRvIHsKKwkJCWludCBoaWdoID0gaW5iX3AoTkVfQkFTRSArIEVOMF9SU0FSSEkpOworCQkJaW50IGxvdyA9IGluYl9wKE5FX0JBU0UgKyBFTjBfUlNBUkxPKTsKKwkJCWFkZHIgPSAoaGlnaCA8PCA4KSArIGxvdzsKKwkJCWlmICgoc3RhcnRfcGFnZSA8PCA4KSArIGNvdW50ID09IGFkZHIpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKC0tdHJpZXMgPiAwKTsKKworCQlpZiAodHJpZXMgPD0gMCkKKwkJeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFR4IHBhY2tldCB0cmFuc2ZlciBhZGRyZXNzIG1pc21hdGNoLCIKKwkJCQkiJSM0LjR4IChleHBlY3RlZCkgdnMuICUjNC40eCAoYWN0dWFsKS5cbiIsCisJCQkJZGV2LT5uYW1lLCAoc3RhcnRfcGFnZSA8PCA4KSArIGNvdW50LCBhZGRyKTsKKwkJCWlmIChyZXRyaWVzKysgPT0gMCkKKwkJCQlnb3RvIHJldHJ5OworCQl9CisJfQorI2VuZGlmCisKKwl3aGlsZSAoKGluYl9wKE5FX0JBU0UgKyBFTjBfSVNSKSAmIEVOSVNSX1JEQykgPT0gMCkKKwkJaWYgKGppZmZpZXMgLSBkbWFfc3RhcnQgPiAyKkhaLzEwMCkgewkJLyogMjBtcyAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IgVHggUkRDLlxuIiwgZGV2LT5uYW1lKTsKKwkJCW5lX3Jlc2V0XzgzOTAoZGV2KTsKKwkJCU5TODM5MF9pbml0KGRldiwxKTsKKwkJCWJyZWFrOworCQl9CisKKwlvdXRiX3AoRU5JU1JfUkRDLCBORV9CQVNFICsgRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworCWVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7CisJcmV0dXJuOworfQorCisMCisjaWZkZWYgTU9EVUxFCisjZGVmaW5lIE1BWF9ORV9DQVJEUwkxCS8qIE1heCBudW1iZXIgb2YgTkUgY2FyZHMgcGVyIG1vZHVsZSAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfbmVbTUFYX05FX0NBUkRTXTsKK3N0YXRpYyBpbnQgaW9bTUFYX05FX0NBUkRTXTsKK3N0YXRpYyBpbnQgaXJxW01BWF9ORV9DQVJEU107CitzdGF0aWMgaW50IGJhZFtNQVhfTkVfQ0FSRFNdOwkvKiAweGJhZCA9IGJhZCBzaWcgb3Igbm8gcmVzZXQgYWNrICovCisKK01PRFVMRV9QQVJNKGlvLCAiMS0iIF9fTU9EVUxFX1NUUklORyhNQVhfTkVfQ0FSRFMpICJpIik7CitNT0RVTEVfUEFSTShpcnEsICIxLSIgX19NT0RVTEVfU1RSSU5HKE1BWF9ORV9DQVJEUykgImkiKTsKK01PRFVMRV9QQVJNKGJhZCwgIjEtIiBfX01PRFVMRV9TVFJJTkcoTUFYX05FX0NBUkRTKSAiaSIpOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBiYXNlIGFkZHJlc3MoZXMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSBudW1iZXIocykiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSDgvMzAwIE5FMjAwMCBFdGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogVGhpcyBpcyBzZXQgdXAgc28gdGhhdCBubyBJU0EgYXV0b3Byb2JlIHRha2VzIHBsYWNlLiBXZSBjYW4ndCBndWFyYW50ZWUKK3RoYXQgdGhlIG5lMmsgcHJvYmUgaXMgdGhlIGxhc3QgODM5MCBiYXNlZCBwcm9iZSB0byB0YWtlIHBsYWNlIChhcyBpdAoraXMgYXQgYm9vdCkgYW5kIHNvIHRoZSBwcm9iZSB3aWxsIGdldCBjb25mdXNlZCBieSBhbnkgb3RoZXIgODM5MCBjYXJkcy4KK0lTQSBkZXZpY2UgYXV0b3Byb2JlcyBvbiBhIHJ1bm5pbmcgbWFjaGluZSBhcmUgbm90IHJlY29tbWVuZGVkIGFueXdheS4gKi8KKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHRoaXNfZGV2LCBmb3VuZCA9IDA7CisJaW50IGVycjsKKworCWZvciAodGhpc19kZXYgPSAwOyB0aGlzX2RldiA8IE1BWF9ORV9DQVJEUzsgdGhpc19kZXYrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisJCWlmIChpb1t0aGlzX2Rldl0pIHsKKwkJCWRldi0+aXJxID0gaXJxW3RoaXNfZGV2XTsKKwkJCWRldi0+bWVtX2VuZCA9IGJhZFt0aGlzX2Rldl07CisJCQlkZXYtPmJhc2VfYWRkciA9IGlvW3RoaXNfZGV2XTsKKwkJfSBlbHNlIHsKKwkJCWRldi0+YmFzZV9hZGRyID0gaDgzMDBfbmVfYmFzZVt0aGlzX2Rldl07CisJCQlkZXYtPmlycSA9IGg4MzAwX25lX2lycVt0aGlzX2Rldl07CisJCX0KKwkJZXJyID0gaW5pdF9yZWdfb2Zmc2V0KGRldiwgZGV2LT5iYXNlX2FkZHIpOworCQlpZiAoIWVycikgeworCQkJaWYgKGRvX25lX3Byb2JlKGRldikgPT0gMCkgeworCQkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7CisJCQkJCWRldl9uZVtmb3VuZCsrXSA9IGRldjsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJfQorCQl9CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCWlmIChmb3VuZCkKKwkJCWJyZWFrOworCQlpZiAoaW9bdGhpc19kZXZdICE9IDApCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJuZS5jOiBObyBORSowMDAgY2FyZCBmb3VuZCBhdCBpL28gPSAlI3hcbiIsIGRldi0+YmFzZV9hZGRyKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fTk9USUNFICJuZS5jOiBZb3UgbXVzdCBzdXBwbHkgXCJpbz0weE5OTlwiIHZhbHVlKHMpIGZvciBJU0EgY2FyZHMuXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJaWYgKGZvdW5kKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWludCB0aGlzX2RldjsKKworCWZvciAodGhpc19kZXYgPSAwOyB0aGlzX2RldiA8IE1BWF9ORV9DQVJEUzsgdGhpc19kZXYrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X25lW3RoaXNfZGV2XTsKKwkJaWYgKGRldikgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJfQorCX0KK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25lLmMgYi9kcml2ZXJzL25ldC9uZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NjQzMzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9uZS5jCkBAIC0wLDAgKzEsODYyIEBACisvKiBuZS5jOiBBIGdlbmVyYWwgbm9uLXNoYXJlZC1tZW1vcnkgTlM4MzkwIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguICovCisvKgorICAgIFdyaXR0ZW4gMTk5Mi05NCBieSBEb25hbGQgQmVja2VyLgorCisgICAgQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICAgIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCisKKyAgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgICAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworICAgIFRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisgICAgU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uLCA0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMCwgQW5uYXBvbGlzIE1EIDIxNDAzCisKKyAgICBUaGlzIGRyaXZlciBzaG91bGQgd29yayB3aXRoIG1hbnkgcHJvZ3JhbW1lZC1JL08gODM5MC1iYXNlZCBldGhlcm5ldAorICAgIGJvYXJkcy4gIEN1cnJlbnRseSBpdCBzdXBwb3J0cyB0aGUgTkUxMDAwLCBORTIwMDAsIG1hbnkgY2xvbmVzLAorICAgIGFuZCBzb21lIENhYmxldHJvbiBwcm9kdWN0cy4KKworICAgIENoYW5nZWxvZzoKKworICAgIFBhdWwgR29ydG1ha2VyCTogdXNlIEVOSVNSX1JEQyB0byBtb25pdG9yIFR4IFBJTyB1cGxvYWRzLCBtYWRlCisJCQkgIHNhbml0eSBjaGVja3MgYW5kIGJhZCBjbG9uZSBzdXBwb3J0IG9wdGlvbmFsLgorICAgIFBhdWwgR29ydG1ha2VyCTogbmV3IHJlc2V0IGNvZGUsIHJlc2V0IGNhcmQgYWZ0ZXIgcHJvYmUgYXQgYm9vdC4KKyAgICBQYXVsIEdvcnRtYWtlcgk6IG11bHRpcGxlIGNhcmQgc3VwcG9ydCBmb3IgbW9kdWxlIHVzZXJzLgorICAgIFBhdWwgR29ydG1ha2VyCTogU3VwcG9ydCBmb3IgUENJIG5lMmsgY2xvbmVzLCBzaW1pbGFyIHRvIGxhbmNlLmMKKyAgICBQYXVsIEdvcnRtYWtlcgk6IEFsbG93IHVzZXJzIHdpdGggYmFkIGNhcmRzIHRvIGF2b2lkIGZ1bGwgcHJvYmUuCisgICAgUGF1bCBHb3J0bWFrZXIJOiBQQ0kgcHJvYmUgY2hhbmdlcywgbW9yZSBQQ0kgY2FyZHMgc3VwcG9ydGVkLgorICAgIHJqb2huc29uQGFuYWxvZ2ljLmNvbSA6IENoYW5nZWQgaW5pdCBvcmRlciBzbyBhbiBpbnRlcnJ1cHQgd2lsbCBvbmx5CisgICAgb2NjdXIgYWZ0ZXIgbWVtb3J5IGlzIGFsbG9jYXRlZCBmb3IgZGV2LT5wcml2LiBEZWFsbG9jYXRlZCBtZW1vcnkKKyAgICBsYXN0IGluIGNsZWFudXBfbW9kdWUoKQorICAgIFJpY2hhcmQgR3VlbnRoZXIgICAgOiBBZGRlZCBzdXBwb3J0IGZvciBJU0FQblAgY2FyZHMKKyAgICBQYXVsIEdvcnRtYWtlcgk6IERpc2NvbnRpbnVlZCBQQ0kgc3VwcG9ydCAtIHVzZSBuZTJrLXBjaS5jIGluc3RlYWQuCisgICAgSGF5YXRvIEZ1aml3YXJhCTogQWRkIG0zMnIgc3VwcG9ydC4KKworKi8KKworLyogUm91dGluZXMgZm9yIHRoZSBOYXRTZW1pLWJhc2VkIGRlc2lnbnMgKE5FWzEyXTAwMCkuICovCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb24xW10gPQorIm5lLmM6djEuMTAgOS8yMy85NCBEb25hbGQgQmVja2VyIChiZWNrZXJAc2N5bGQuY29tKVxuIjsKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb24yW10gPQorIkxhc3QgbW9kaWZpZWQgTm92IDEsIDIwMDAgYnkgUGF1bCBHb3J0bWFrZXJcbiI7CisKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaXNhcG5wLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgIjgzOTAuaCIKKworI2RlZmluZSBEUlZfTkFNRSAibmUiCisKKy8qIFNvbWUgZGVmaW5lcyB0aGF0IHBlb3BsZSBjYW4gcGxheSB3aXRoIGlmIHNvIGluY2xpbmVkLiAqLworCisvKiBEbyB3ZSBzdXBwb3J0IGNsb25lcyB0aGF0IGRvbid0IGFkaGVyZSB0byAxNCwxNSBvZiB0aGUgU0Fwcm9tID8gKi8KKyNkZWZpbmUgU1VQUE9SVF9ORV9CQURfQ0xPTkVTCisKKy8qIERvIHdlIHBlcmZvcm0gZXh0cmEgc2FuaXR5IGNoZWNrcyBvbiBzdHVmZiA/ICovCisvKiAjZGVmaW5lIE5FX1NBTklUWV9DSEVDSyAqLworCisvKiBEbyB3ZSBpbXBsZW1lbnQgdGhlIHJlYWQgYmVmb3JlIHdyaXRlIGJ1Z2ZpeCA/ICovCisvKiAjZGVmaW5lIE5FX1JXX0JVR0ZJWCAqLworCisvKiBEbyB3ZSBoYXZlIGEgbm9uIHN0ZC4gYW1vdW50IG9mIG1lbW9yeT8gKGluIHVuaXRzIG9mIDI1NiBieXRlIHBhZ2VzKSAqLworLyogI2RlZmluZSBQQUNLRVRCVUZfTUVNU0laRQkweDQwICovCisKKy8qIEEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgSS9PIGFkZHJlc3NlcyB0byBiZSBwcm9iZWQgYXQgYm9vdC4gKi8KKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgdW5zaWduZWQgaW50IG5ldGNhcmRfcG9ydGxpc3RbXSBfX2luaXRkYXRhID0geworCTB4MzAwLCAweDI4MCwgMHgzMjAsIDB4MzQwLCAweDM2MCwgMHgzODAsIDAKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBpc2FwbnBfZGV2aWNlX2lkIGlzYXBucF9jbG9uZV9saXN0W10gX19pbml0ZGF0YSA9IHsKKwl7CUlTQVBOUF9DQVJEX0lEKCdBJywnWCcsJ0UnLDB4MjAxMSksCisJCUlTQVBOUF9WRU5ET1IoJ0EnLCdYJywnRScpLCBJU0FQTlBfRlVOQ1RJT04oMHgyMDExKSwKKwkJKGxvbmcpICJOZXRHZWFyIEVBMjAxIiB9LAorCXsJSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkJSVNBUE5QX1ZFTkRPUignRScsJ0QnLCdJJyksIElTQVBOUF9GVU5DVElPTigweDAyMTYpLAorCQkobG9uZykgIk5OIE5FMjAwMCIgfSwKKwl7CUlTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCisJCUlTQVBOUF9WRU5ET1IoJ1AnLCdOJywnUCcpLCBJU0FQTlBfRlVOQ1RJT04oMHg4MGQ2KSwKKwkJKGxvbmcpICJHZW5lcmljIFBOUCIgfSwKKwl7IH0JLyogdGVybWluYXRlIGxpc3QgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaXNhcG5wLCBpc2FwbnBfY2xvbmVfbGlzdCk7CisKKyNpZmRlZiBTVVBQT1JUX05FX0JBRF9DTE9ORVMKKy8qIEEgbGlzdCBvZiBiYWQgY2xvbmVzIHRoYXQgd2Ugbm9uZS10aGUtbGVzcyByZWNvZ25pemUuICovCitzdGF0aWMgc3RydWN0IHsgY29uc3QgY2hhciAqbmFtZTgsICpuYW1lMTY7IHVuc2lnbmVkIGNoYXIgU0FwcmVmaXhbNF07fQorYmFkX2Nsb25lX2xpc3RbXSBfX2luaXRkYXRhID0geworICAgIHsiREUxMDAiLCAiREUyMDAiLCB7MHgwMCwgMHhERSwgMHgwMSx9fSwKKyAgICB7IkRFMTIwIiwgIkRFMjIwIiwgezB4MDAsIDB4ODAsIDB4YzgsfX0sCisgICAgeyJERkkxMDAwIiwgIkRGSTIwMDAiLCB7J0QnLCAnRicsICdJJyx9fSwgLyogT3JpZ2luYWwsIGVoPyAgKi8KKyAgICB7IkV0aGVyTmV4dCBVVFA4IiwgIkV0aGVyTmV4dCBVVFAxNiIsIHsweDAwLCAweDAwLCAweDc5fX0sCisgICAgeyJORTEwMDAiLCJORTIwMDAtaW52YWxpZCIsIHsweDAwLCAweDAwLCAweGQ4fX0sIC8qIEFuY2llbnQgcmVhbCBORTEwMDAuICovCisgICAgeyJOTjEwMDAiLCAiTk4yMDAwIiwgIHsweDA4LCAweDAzLCAweDA4fX0sIC8qIE91dGxhdyBuby1uYW1lIGNsb25lLiAqLworICAgIHsiNC1ESU04IiwiNC1ESU0xNiIsIHsweDAwLDB4MDAsMHg0ZCx9fSwgIC8qIE91dGxhdyA0LURpbWVuc2lvbiBjYXJkcy4gKi8KKyAgICB7IkNvbi1JbnRsXzgiLCAiQ29uLUludGxfMTYiLCB7MHgwMCwgMHgwMCwgMHgyNH19LCAvKiBDb25uZWN0IEludCdubCAqLworICAgIHsiRVQtMTAwIiwiRVQtMjAwIiwgezB4MDAsIDB4NDUsIDB4NTR9fSwgLyogWUFORyBhbmQgWUEgY2xvbmUgKi8KKyAgICB7IkNPTVBFWCIsIkNPTVBFWDE2Iix7MHgwMCwweDgwLDB4NDh9fSwgLyogQnJva2VuIElTQSBDb21wZXggY2FyZHMgKi8KKyAgICB7IkUtTEFOMTAwIiwgIkUtTEFOMjAwIiwgezB4MDAsIDB4MDAsIDB4NWR9fSwgLyogQnJva2VuIG5lMTAwMCBjbG9uZXMgKi8KKyAgICB7IlBDTS00ODIzIiwgIlBDTS00ODIzIiwgezB4MDAsIDB4YzAsIDB4NmN9fSwgLyogQnJva2VuIEFkdmFudGVjaCBNb0JvICovCisgICAgeyJSRUFMVEVLIiwgIlJUTDgwMTkiLCB7MHgwMCwgMHgwMCwgMHhlOH19LCAvKiBuby1uYW1lIHdpdGggUmVhbHRlayBjaGlwICovCisgICAgeyJMQ1MtODgzNCIsICJMQ1MtODgzNiIsIHsweDA0LCAweDA0LCAweDM3fX0sIC8qIFNoaW55TmV0IChTRVQpICovCisgICAge05VTEwsfQorfTsKKyNlbmRpZgorCisvKiAtLS0tIE5vIHVzZXItc2VydmljZWFibGUgcGFydHMgYmVsb3cgLS0tLSAqLworCisjZGVmaW5lIE5FX0JBU0UJIChkZXYtPmJhc2VfYWRkcikKKyNkZWZpbmUgTkVfQ01ECSAJMHgwMAorI2RlZmluZSBORV9EQVRBUE9SVAkweDEwCS8qIE5hdFNlbWktZGVmaW5lZCBwb3J0IHdpbmRvdyBvZmZzZXQuICovCisjZGVmaW5lIE5FX1JFU0VUCTB4MWYJLyogSXNzdWUgYSByZWFkIHRvIHJlc2V0LCBhIHdyaXRlIHRvIGNsZWFyLiAqLworI2RlZmluZSBORV9JT19FWFRFTlQJMHgyMAorCisjZGVmaW5lIE5FMVNNX1NUQVJUX1BHCTB4MjAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKyNkZWZpbmUgTkUxU01fU1RPUF9QRyAJMHg0MAkvKiBMYXN0IHBhZ2UgKzEgb2YgUlggcmluZyAqLworI2RlZmluZSBORVNNX1NUQVJUX1BHCTB4NDAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKyNkZWZpbmUgTkVTTV9TVE9QX1BHCTB4ODAJLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcgKi8KKworI2lmZGVmIENPTkZJR19QTEFUX01BUFBJCisjICBkZWZpbmUgRENSX1ZBTCAweDRiCisjZWxpZiBDT05GSUdfUExBVF9PQUtTMzJSCisjICBkZWZpbmUgRENSX1ZBTCAweDQ4CisjZWxzZQorIyAgZGVmaW5lIERDUl9WQUwgMHg0OQorI2VuZGlmCisKK3N0YXRpYyBpbnQgbmVfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpOworc3RhdGljIGludCBuZV9wcm9iZV9pc2FwbnAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBpbnQgbmVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyB2b2lkIG5lX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBuZV9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwKKwkJCSAgaW50IHJpbmdfcGFnZSk7CitzdGF0aWMgdm9pZCBuZV9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkgIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCk7CitzdGF0aWMgdm9pZCBuZV9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgaW50IGNvdW50LAorCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGNvbnN0IGludCBzdGFydF9wYWdlKTsKKworDAorLyogIFByb2JlIGZvciB2YXJpb3VzIG5vbi1zaGFyZWQtbWVtb3J5IGV0aGVyY2FyZHMuCisKKyAgIE5FeDAwMC1jbG9uZSBib2FyZHMgaGF2ZSBhIFN0YXRpb24gQWRkcmVzcyBQUk9NIChTQVBST00pIGluIHRoZSBwYWNrZXQKKyAgIGJ1ZmZlciBtZW1vcnkgc3BhY2UuICBORTIwMDAgY2xvbmVzIGhhdmUgMHg1NywweDU3IGluIGJ5dGVzIDB4MGUsMHgwZiBvZgorICAgdGhlIFNBUFJPTSwgd2hpbGUgb3RoZXIgc3VwcG9zZWQgTkUyMDAwIGNsb25lcyBtdXN0IGJlIGRldGVjdGVkIGJ5IHRoZWlyCisgICBTQSBwcmVmaXguCisKKyAgIFJlYWRpbmcgdGhlIFNBUFJPTSBmcm9tIGEgd29yZC13aWRlIGNhcmQgd2l0aCB0aGUgODM5MCBzZXQgaW4gYnl0ZS13aWRlCisgICBtb2RlIHJlc3VsdHMgaW4gZG91YmxlZCB2YWx1ZXMsIHdoaWNoIGNhbiBiZSBkZXRlY3RlZCBhbmQgY29tcGVuc2F0ZWQgZm9yLgorCisgICBUaGUgcHJvYmUgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGl6aW5nIHRoZSBjYXJkIGFuZCBmaWxsaW5nCisgICBpbiB0aGUgJ2RldicgYW5kICdlaV9zdGF0dXMnIHN0cnVjdHVyZXMuCisKKyAgIFdlIHVzZSB0aGUgbWluaW11bSBtZW1vcnkgc2l6ZSBmb3Igc29tZSBldGhlcmNhcmQgcHJvZHVjdCBsaW5lcywgaWZmIHdlIGNhbid0CisgICBkaXN0aW5ndWlzaCBtb2RlbHMuICBZb3UgY2FuIGluY3JlYXNlIHRoZSBwYWNrZXQgYnVmZmVyIHNpemUgYnkgc2V0dGluZworICAgUEFDS0VUQlVGX01FTVNJWkUuICBSZXBvcnRlZCBDYWJsZXRyb24gcGFja2V0IGJ1ZmZlciBsb2NhdGlvbnMgYXJlOgorCUUxMDEwICAgc3RhcnRzIGF0IDB4MTAwIGFuZCBlbmRzIGF0IDB4MjAwMC4KKwlFMTAxMC14IHN0YXJ0cyBhdCAweDEwMCBhbmQgZW5kcyBhdCAweDgwMDAuICgiLXgiIG1lYW5zICJtb3JlIG1lbW9yeSIpCisJRTIwMTAJIHN0YXJ0cyBhdCAweDEwMCBhbmQgZW5kcyBhdCAweDQwMDAuCisJRTIwMTAteCBzdGFydHMgYXQgMHgxMDAgYW5kIGVuZHMgYXQgMHhmZmZmLiAgKi8KKworc3RhdGljIGludCBfX2luaXQgZG9fbmVfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBpbnQgYmFzZV9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisjaWZuZGVmIE1PRFVMRQorCWludCBvcmlnX2lycSA9IGRldi0+aXJxOworI2VuZGlmCisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwkvKiBGaXJzdCBjaGVjayBhbnkgc3VwcGxpZWQgaS9vIGxvY2F0aW9ucy4gVXNlciBrbm93cyBiZXN0LiA8Y291Z2g+ICovCisJaWYgKGJhc2VfYWRkciA+IDB4MWZmKQkvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCXJldHVybiBuZV9wcm9iZTEoZGV2LCBiYXNlX2FkZHIpOworCWVsc2UgaWYgKGJhc2VfYWRkciAhPSAwKQkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCXJldHVybiAtRU5YSU87CisKKwkvKiBUaGVuIGxvb2sgZm9yIGFueSBpbnN0YWxsZWQgSVNBUG5QIGNsb25lcyAqLworCWlmIChpc2FwbnBfcHJlc2VudCgpICYmIChuZV9wcm9iZV9pc2FwbnAoZGV2KSA9PSAwKSkKKwkJcmV0dXJuIDA7CisKKyNpZm5kZWYgTU9EVUxFCisJLyogTGFzdCByZXNvcnQuIFRoZSBzZW1pLXJpc2t5IElTQSBhdXRvLXByb2JlLiAqLworCWZvciAoYmFzZV9hZGRyID0gMDsgbmV0Y2FyZF9wb3J0bGlzdFtiYXNlX2FkZHJdICE9IDA7IGJhc2VfYWRkcisrKSB7CisJCWludCBpb2FkZHIgPSBuZXRjYXJkX3BvcnRsaXN0W2Jhc2VfYWRkcl07CisJCWRldi0+aXJxID0gb3JpZ19pcnE7CisJCWlmIChuZV9wcm9iZTEoZGV2LCBpb2FkZHIpID09IDApCisJCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcG5wX2RldiAqaWRldiA9IChzdHJ1Y3QgcG5wX2RldiAqKWVpX3N0YXR1cy5wcml2OworCWlmIChpZGV2KQorCQlwbnBfZGV2aWNlX2RldGFjaChpZGV2KTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTkVfSU9fRVhURU5UKTsKK30KKworI2lmbmRlZiBNT0RVTEUKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IG5lX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKwlpbnQgZXJyOworCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisKKwllcnIgPSBkb19uZV9wcm9iZShkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlyZXR1cm4gZGV2Oworb3V0MToKKwljbGVhbnVwX2NhcmQoZGV2KTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgbmVfcHJvYmVfaXNhcG5wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpc2FwbnBfY2xvbmVfbGlzdFtpXS52ZW5kb3IgIT0gMDsgaSsrKSB7CisJCXN0cnVjdCBwbnBfZGV2ICppZGV2ID0gTlVMTDsKKworCQl3aGlsZSAoKGlkZXYgPSBwbnBfZmluZF9kZXYoTlVMTCwKKwkJCQkJICAgIGlzYXBucF9jbG9uZV9saXN0W2ldLnZlbmRvciwKKwkJCQkJICAgIGlzYXBucF9jbG9uZV9saXN0W2ldLmZ1bmN0aW9uLAorCQkJCQkgICAgaWRldikpKSB7CisJCQkvKiBBdm9pZCBhbHJlYWR5IGZvdW5kIGNhcmRzIGZyb20gcHJldmlvdXMgY2FsbHMgKi8KKwkJCWlmIChwbnBfZGV2aWNlX2F0dGFjaChpZGV2KSA8IDApCisJCQkJY29udGludWU7CisJCQlpZiAocG5wX2FjdGl2YXRlX2RldihpZGV2KSA8IDApIHsKKwkJCSAgICAgIAlwbnBfZGV2aWNlX2RldGFjaChpZGV2KTsKKwkJCSAgICAgIAljb250aW51ZTsKKwkJCX0KKwkJCS8qIGlmIG5vIGlvIGFuZCBpcnEsIHNlYXJjaCBmb3IgbmV4dCAqLworCQkJaWYgKCFwbnBfcG9ydF92YWxpZChpZGV2LCAwKSB8fCAhcG5wX2lycV92YWxpZChpZGV2LCAwKSkgeworCQkJCXBucF9kZXZpY2VfZGV0YWNoKGlkZXYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogZm91bmQgaXQgKi8KKwkJCWRldi0+YmFzZV9hZGRyID0gcG5wX3BvcnRfc3RhcnQoaWRldiwgMCk7CisJCQlkZXYtPmlycSA9IHBucF9pcnEoaWRldiwgMCk7CisJCQlwcmludGsoS0VSTl9JTkZPICJuZS5jOiBJU0FQblAgcmVwb3J0cyAlcyBhdCBpL28gJSNseCwgaXJxICVkLlxuIiwKKwkJCQkoY2hhciAqKSBpc2FwbnBfY2xvbmVfbGlzdFtpXS5kcml2ZXJfZGF0YSwKKwkJCQlkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworCQkJaWYgKG5lX3Byb2JlMShkZXYsIGRldi0+YmFzZV9hZGRyKSAhPSAwKSB7CS8qIFNob3VsZG4ndCBoYXBwZW4uICovCisJCQkJcHJpbnRrKEtFUk5fRVJSICJuZS5jOiBQcm9iZSBvZiBJU0FQblAgY2FyZCBhdCAlI2x4IGZhaWxlZC5cbiIsIGRldi0+YmFzZV9hZGRyKTsKKwkJCQlwbnBfZGV2aWNlX2RldGFjaChpZGV2KTsKKwkJCQlyZXR1cm4gLUVOWElPOworCQkJfQorCQkJZWlfc3RhdHVzLnByaXYgPSAodW5zaWduZWQgbG9uZylpZGV2OworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFpZGV2KQorCQkJY29udGludWU7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IF9faW5pdCBuZV9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIFNBX3Byb21bMzJdOworCWludCB3b3JkbGVuZ3RoID0gMjsKKwljb25zdCBjaGFyICpuYW1lID0gTlVMTDsKKwlpbnQgc3RhcnRfcGFnZSwgc3RvcF9wYWdlOworCWludCBuZVgwMDAsIGN0cm9uLCBjb3BhbSwgYmFkX2NhcmQ7CisJaW50IHJlZzAsIHJldDsKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIE5FX0lPX0VYVEVOVCwgRFJWX05BTUUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmVnMCA9IGluYl9wKGlvYWRkcik7CisJaWYgKHJlZzAgPT0gMHhGRikgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogRG8gYSBwcmVsaW1pbmFyeSB2ZXJpZmljYXRpb24gdGhhdCB3ZSBoYXZlIGEgODM5MC4gKi8KKwl7CisJCWludCByZWdkOworCQlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTErRTgzOTBfU1RPUCwgaW9hZGRyICsgRTgzOTBfQ01EKTsKKwkJcmVnZCA9IGluYl9wKGlvYWRkciArIDB4MGQpOworCQlvdXRiX3AoMHhmZiwgaW9hZGRyICsgMHgwZCk7CisJCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCwgaW9hZGRyICsgRTgzOTBfQ01EKTsKKwkJaW5iX3AoaW9hZGRyICsgRU4wX0NPVU5URVIwKTsgLyogQ2xlYXIgdGhlIGNvdW50ZXIgYnkgcmVhZGluZy4gKi8KKwkJaWYgKGluYl9wKGlvYWRkciArIEVOMF9DT1VOVEVSMCkgIT0gMCkgeworCQkJb3V0Yl9wKHJlZzAsIGlvYWRkcik7CisJCQlvdXRiX3AocmVnZCwgaW9hZGRyICsgMHgwZCk7CS8qIFJlc3RvcmUgdGhlIG9sZCB2YWx1ZXMuICovCisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byBlcnJfb3V0OworCQl9CisJfQorCisJaWYgKGVpX2RlYnVnICAmJiAgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiIEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uMSwgdmVyc2lvbjIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiTkUqMDAwIGV0aGVyY2FyZCBwcm9iZSBhdCAlIzN4OiIsIGlvYWRkcik7CisKKwkvKiBBIHVzZXIgd2l0aCBhIHBvb3IgY2FyZCB0aGF0IGZhaWxzIHRvIGFjayB0aGUgcmVzZXQsIG9yIHRoYXQKKwkgICBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgMHg1NywweDU3IHNpZ25hdHVyZSBjYW4gc3RpbGwgdXNlIHRoaXMKKwkgICB3aXRob3V0IGhhdmluZyB0byByZWNvbXBpbGUuIFNwZWNpZnlpbmcgYW4gaS9vIGFkZHJlc3MgYWxvbmcKKwkgICB3aXRoIGFuIG90aGVyd2lzZSB1bnVzZWQgZGV2LT5tZW1fZW5kIHZhbHVlIG9mICIweEJBRCIgd2lsbAorCSAgIGNhdXNlIHRoZSBkcml2ZXIgdG8gc2tpcCB0aGVzZSBwYXJ0cyBvZiB0aGUgcHJvYmUuICovCisKKwliYWRfY2FyZCA9ICgoZGV2LT5iYXNlX2FkZHIgIT0gMCkgJiYgKGRldi0+bWVtX2VuZCA9PSAweGJhZCkpOworCisJLyogUmVzZXQgY2FyZC4gV2hvIGtub3dzIHdoYXQgZGFpbi1icmFtYWdlZCBzdGF0ZSBpdCB3YXMgbGVmdCBpbi4gKi8KKworCXsKKwkJdW5zaWduZWQgbG9uZyByZXNldF9zdGFydF90aW1lID0gamlmZmllczsKKworCQkvKiBET04nVCBjaGFuZ2UgdGhlc2UgdG8gaW5iX3Avb3V0Yl9wIG9yIHJlc2V0IHdpbGwgZmFpbCBvbiBjbG9uZXMuICovCisJCW91dGIoaW5iKGlvYWRkciArIE5FX1JFU0VUKSwgaW9hZGRyICsgTkVfUkVTRVQpOworCisJCXdoaWxlICgoaW5iX3AoaW9hZGRyICsgRU4wX0lTUikgJiBFTklTUl9SRVNFVCkgPT0gMCkKKwkJaWYgKGppZmZpZXMgLSByZXNldF9zdGFydF90aW1lID4gMipIWi8xMDApIHsKKwkJCWlmIChiYWRfY2FyZCkgeworCQkJCXByaW50aygiICh3YXJuaW5nOiBubyByZXNldCBhY2spIik7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXByaW50aygiIG5vdCBmb3VuZCAobm8gcmVzZXQgYWNrKS5cbiIpOworCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJZ290byBlcnJfb3V0OworCQkJfQorCQl9CisKKwkJb3V0Yl9wKDB4ZmYsIGlvYWRkciArIEVOMF9JU1IpOwkJLyogQWNrIGFsbCBpbnRyLiAqLworCX0KKworCS8qIFJlYWQgdGhlIDE2IGJ5dGVzIG9mIHN0YXRpb24gYWRkcmVzcyBQUk9NLgorCSAgIFdlIG11c3QgZmlyc3QgaW5pdGlhbGl6ZSByZWdpc3RlcnMsIHNpbWlsYXIgdG8gTlM4MzkwX2luaXQoZWlmZGV2LCAwKS4KKwkgICBXZSBjYW4ndCByZWxpYWJseSByZWFkIHRoZSBTQVBST00gYWRkcmVzcyB3aXRob3V0IHRoaXMuCisJICAgKEkgbGVhcm5lZCB0aGUgaGFyZCB3YXkhKS4gKi8KKwl7CisJCXN0cnVjdCB7dW5zaWduZWQgY2hhciB2YWx1ZSwgb2Zmc2V0OyB9IHByb2dyYW1fc2VxW10gPQorCQl7CisJCQl7RTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgRTgzOTBfQ01EfSwgLyogU2VsZWN0IHBhZ2UgMCovCisJCQl7MHg0OCwJRU4wX0RDRkd9LAkvKiBTZXQgYnl0ZS13aWRlICgweDQ4KSBhY2Nlc3MuICovCisJCQl7MHgwMCwJRU4wX1JDTlRMT30sCS8qIENsZWFyIHRoZSBjb3VudCByZWdzLiAqLworCQkJezB4MDAsCUVOMF9SQ05USEl9LAorCQkJezB4MDAsCUVOMF9JTVJ9LAkvKiBNYXNrIGNvbXBsZXRpb24gaXJxLiAqLworCQkJezB4RkYsCUVOMF9JU1J9LAorCQkJe0U4MzkwX1JYT0ZGLCBFTjBfUlhDUn0sCS8qIDB4MjAgIFNldCB0byBtb25pdG9yICovCisJCQl7RTgzOTBfVFhPRkYsIEVOMF9UWENSfSwJLyogMHgwMiAgYW5kIGxvb3BiYWNrIG1vZGUuICovCisJCQl7MzIsCUVOMF9SQ05UTE99LAorCQkJezB4MDAsCUVOMF9SQ05USEl9LAorCQkJezB4MDAsCUVOMF9SU0FSTE99LAkvKiBETUEgc3RhcnRpbmcgYXQgMHgwMDAwLiAqLworCQkJezB4MDAsCUVOMF9SU0FSSEl9LAorCQkJe0U4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBFODM5MF9DTUR9LAorCQl9OworCisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocHJvZ3JhbV9zZXEpL3NpemVvZihwcm9ncmFtX3NlcVswXSk7IGkrKykKKwkJCW91dGJfcChwcm9ncmFtX3NlcVtpXS52YWx1ZSwgaW9hZGRyICsgcHJvZ3JhbV9zZXFbaV0ub2Zmc2V0KTsKKworCX0KKwlmb3IoaSA9IDA7IGkgPCAzMiAvKnNpemVvZihTQV9wcm9tKSovOyBpKz0yKSB7CisJCVNBX3Byb21baV0gPSBpbmIoaW9hZGRyICsgTkVfREFUQVBPUlQpOworCQlTQV9wcm9tW2krMV0gPSBpbmIoaW9hZGRyICsgTkVfREFUQVBPUlQpOworCQlpZiAoU0FfcHJvbVtpXSAhPSBTQV9wcm9tW2krMV0pCisJCQl3b3JkbGVuZ3RoID0gMTsKKwl9CisKKwlpZiAod29yZGxlbmd0aCA9PSAyKQorCXsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQlTQV9wcm9tW2ldID0gU0FfcHJvbVtpK2ldOworCQkvKiBXZSBtdXN0IHNldCB0aGUgODM5MCBmb3Igd29yZCBtb2RlLiAqLworCQlvdXRiX3AoRENSX1ZBTCwgaW9hZGRyICsgRU4wX0RDRkcpOworCQlzdGFydF9wYWdlID0gTkVTTV9TVEFSVF9QRzsKKwkJc3RvcF9wYWdlID0gTkVTTV9TVE9QX1BHOworCX0gZWxzZSB7CisJCXN0YXJ0X3BhZ2UgPSBORTFTTV9TVEFSVF9QRzsKKwkJc3RvcF9wYWdlID0gTkUxU01fU1RPUF9QRzsKKwl9CisKKyNpZiAgZGVmaW5lZChDT05GSUdfUExBVF9NQVBQSSkgfHwgZGVmaW5lZChDT05GSUdfUExBVF9PQUtTMzJSKQorCW5lWDAwMCA9ICgoU0FfcHJvbVsxNF0gPT0gMHg1NyAgJiYgIFNBX3Byb21bMTVdID09IDB4NTcpCisJCXx8IChTQV9wcm9tWzE0XSA9PSAweDQyICYmIFNBX3Byb21bMTVdID09IDB4NDIpKTsKKyNlbHNlCisJbmVYMDAwID0gKFNBX3Byb21bMTRdID09IDB4NTcgICYmICBTQV9wcm9tWzE1XSA9PSAweDU3KTsKKyNlbmRpZgorCWN0cm9uID0gIChTQV9wcm9tWzBdID09IDB4MDAgJiYgU0FfcHJvbVsxXSA9PSAweDAwICYmIFNBX3Byb21bMl0gPT0gMHgxZCk7CisJY29wYW0gPSAgKFNBX3Byb21bMTRdID09IDB4NDkgJiYgU0FfcHJvbVsxNV0gPT0gMHgwMCk7CisKKwkvKiBTZXQgdXAgdGhlIHJlc3Qgb2YgdGhlIHBhcmFtZXRlcnMuICovCisJaWYgKG5lWDAwMCB8fCBiYWRfY2FyZCB8fCBjb3BhbSkgeworCQluYW1lID0gKHdvcmRsZW5ndGggPT0gMikgPyAiTkUyMDAwIiA6ICJORTEwMDAiOworCX0KKwllbHNlIGlmIChjdHJvbikKKwl7CisJCW5hbWUgPSAod29yZGxlbmd0aCA9PSAyKSA/ICJDdHJvbi04IiA6ICJDdHJvbi0xNiI7CisJCXN0YXJ0X3BhZ2UgPSAweDAxOworCQlzdG9wX3BhZ2UgPSAod29yZGxlbmd0aCA9PSAyKSA/IDB4NDAgOiAweDIwOworCX0KKwllbHNlCisJeworI2lmZGVmIFNVUFBPUlRfTkVfQkFEX0NMT05FUworCQkvKiBBY2shICBXZWxsLCB0aGVyZSBtaWdodCBiZSBhICpiYWQqIE5FKjAwMCBjbG9uZSB0aGVyZS4KKwkJICAgQ2hlY2sgZm9yIHRvdGFsIGJvZ3VzIGFkZHJlc3Nlcy4gKi8KKwkJZm9yIChpID0gMDsgYmFkX2Nsb25lX2xpc3RbaV0ubmFtZTg7IGkrKykKKwkJeworCQkJaWYgKFNBX3Byb21bMF0gPT0gYmFkX2Nsb25lX2xpc3RbaV0uU0FwcmVmaXhbMF0gJiYKKwkJCQlTQV9wcm9tWzFdID09IGJhZF9jbG9uZV9saXN0W2ldLlNBcHJlZml4WzFdICYmCisJCQkJU0FfcHJvbVsyXSA9PSBiYWRfY2xvbmVfbGlzdFtpXS5TQXByZWZpeFsyXSkKKwkJCXsKKwkJCQlpZiAod29yZGxlbmd0aCA9PSAyKQorCQkJCXsKKwkJCQkJbmFtZSA9IGJhZF9jbG9uZV9saXN0W2ldLm5hbWUxNjsKKwkJCQl9IGVsc2UgeworCQkJCQluYW1lID0gYmFkX2Nsb25lX2xpc3RbaV0ubmFtZTg7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChiYWRfY2xvbmVfbGlzdFtpXS5uYW1lOCA9PSBOVUxMKQorCQl7CisJCQlwcmludGsoIiBub3QgZm91bmQgKGludmFsaWQgc2lnbmF0dXJlICUyLjJ4ICUyLjJ4KS5cbiIsCisJCQkJU0FfcHJvbVsxNF0sIFNBX3Byb21bMTVdKTsKKwkJCXJldCA9IC1FTlhJTzsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorI2Vsc2UKKwkJcHJpbnRrKCIgbm90IGZvdW5kLlxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBlcnJfb3V0OworI2VuZGlmCisJfQorCisJaWYgKGRldi0+aXJxIDwgMikKKwl7CisJCXVuc2lnbmVkIGxvbmcgY29va2llID0gcHJvYmVfaXJxX29uKCk7CisJCW91dGJfcCgweDUwLCBpb2FkZHIgKyBFTjBfSU1SKTsJLyogRW5hYmxlIG9uZSBpbnRlcnJ1cHQuICovCisJCW91dGJfcCgweDAwLCBpb2FkZHIgKyBFTjBfUkNOVExPKTsKKwkJb3V0Yl9wKDB4MDAsIGlvYWRkciArIEVOMF9SQ05USEkpOworCQlvdXRiX3AoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIGlvYWRkcik7IC8qIFRyaWdnZXIgaXQuLi4gKi8KKwkJbWRlbGF5KDEwKTsJCS8qIHdhaXQgMTBtcyBmb3IgaW50ZXJydXB0IHRvIHByb3BhZ2F0ZSAqLworCQlvdXRiX3AoMHgwMCwgaW9hZGRyICsgRU4wX0lNUik7IAkJLyogTWFzayBpdCBhZ2Fpbi4gKi8KKwkJZGV2LT5pcnEgPSBwcm9iZV9pcnFfb2ZmKGNvb2tpZSk7CisJCWlmIChlaV9kZWJ1ZyA+IDIpCisJCQlwcmludGsoIiBhdXRvaXJxIGlzICVkXG4iLCBkZXYtPmlycSk7CisJfSBlbHNlIGlmIChkZXYtPmlycSA9PSAyKQorCQkvKiBGaXh1cCBmb3IgdXNlcnMgdGhhdCBkb24ndCBrbm93IHRoYXQgSVJRIDIgaXMgcmVhbGx5IElSUSA5LAorCQkgICBvciBkb24ndCBrbm93IHdoaWNoIG9uZSB0byBzZXQuICovCisJCWRldi0+aXJxID0gOTsKKworCWlmICghIGRldi0+aXJxKSB7CisJCXByaW50aygiIGZhaWxlZCB0byBkZXRlY3QgSVJRIGxpbmUuXG4iKTsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qIFNuYXJmIHRoZSBpbnRlcnJ1cHQgbm93LiAgVGhlcmUncyBubyBwb2ludCBpbiB3YWl0aW5nIHNpbmNlIHdlIGNhbm5vdAorCSAgIHNoYXJlIGFuZCB0aGUgYm9hcmQgd2lsbCB1c3VhbGx5IGJlIGVuYWJsZWQuICovCisJcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGVpX2ludGVycnVwdCwgMCwgbmFtZSwgZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayAoIiB1bmFibGUgdG8gZ2V0IElSUSAlZCAoZXJybm89JWQpLlxuIiwgZGV2LT5pcnEsIHJldCk7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKworI2lmZGVmIENPTkZJR19QTEFUX01BUFBJCisJb3V0Yl9wKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTEgKyBFODM5MF9TVE9QLAorCQlpb2FkZHIgKyBFODM5MF9DTUQpOyAvKiAweDYxICovCisJZm9yIChpID0gMCA7IGkgPCBFVEhFUl9BRERSX0xFTiA7IGkrKykgeworCQlkZXYtPmRldl9hZGRyW2ldID0gU0FfcHJvbVtpXQorCQkJPSBpbmJfcChpb2FkZHIgKyBFTjFfUEhZU19TSElGVChpKSk7CisJCXByaW50aygiICUyLjJ4IiwgU0FfcHJvbVtpXSk7CisJfQorI2Vsc2UKKwlmb3IoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKSB7CisJCXByaW50aygiICUyLjJ4IiwgU0FfcHJvbVtpXSk7CisJCWRldi0+ZGV2X2FkZHJbaV0gPSBTQV9wcm9tW2ldOworCX0KKyNlbmRpZgorCisJcHJpbnRrKCJcbiVzOiAlcyBmb3VuZCBhdCAlI3gsIHVzaW5nIElSUSAlZC5cbiIsCisJCWRldi0+bmFtZSwgbmFtZSwgaW9hZGRyLCBkZXYtPmlycSk7CisKKwllaV9zdGF0dXMubmFtZSA9IG5hbWU7CisJZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBzdGFydF9wYWdlOworCWVpX3N0YXR1cy5zdG9wX3BhZ2UgPSBzdG9wX3BhZ2U7CisjaWZkZWYgQ09ORklHX1BMQVRfT0FLUzMyUgorCWVpX3N0YXR1cy53b3JkMTYgPSAwOworI2Vsc2UKKwllaV9zdGF0dXMud29yZDE2ID0gKHdvcmRsZW5ndGggPT0gMik7CisjZW5kaWYKKworCWVpX3N0YXR1cy5yeF9zdGFydF9wYWdlID0gc3RhcnRfcGFnZSArIFRYX1BBR0VTOworI2lmZGVmIFBBQ0tFVEJVRl9NRU1TSVpFCisJIC8qIEFsbG93IHRoZSBwYWNrZXQgYnVmZmVyIHNpemUgdG8gYmUgb3ZlcnJpZGRlbiBieSBrbm93LWl0LWFsbHMuICovCisJZWlfc3RhdHVzLnN0b3BfcGFnZSA9IGVpX3N0YXR1cy50eF9zdGFydF9wYWdlICsgUEFDS0VUQlVGX01FTVNJWkU7CisjZW5kaWYKKworCWVpX3N0YXR1cy5yZXNldF84MzkwID0gJm5lX3Jlc2V0XzgzOTA7CisJZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJm5lX2Jsb2NrX2lucHV0OworCWVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmbmVfYmxvY2tfb3V0cHV0OworCWVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmbmVfZ2V0XzgzOTBfaGRyOworCWVpX3N0YXR1cy5wcml2ID0gMDsKKwlkZXYtPm9wZW4gPSAmbmVfb3BlbjsKKwlkZXYtPnN0b3AgPSAmbmVfY2xvc2U7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CisjZW5kaWYKKwlOUzgzOTBfaW5pdChkZXYsIDApOworCXJldHVybiAwOworCitlcnJfb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgTkVfSU9fRVhURU5UKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG5lX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllaV9vcGVuKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoZWlfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKKwllaV9jbG9zZShkZXYpOworCXJldHVybiAwOworfQorCisvKiBIYXJkIHJlc2V0IHRoZSBjYXJkLiAgVGhpcyB1c2VkIHRvIHBhdXNlIGZvciB0aGUgc2FtZSBwZXJpb2QgdGhhdCBhCisgICA4MzkwIHJlc2V0IGNvbW1hbmQgcmVxdWlyZWQsIGJ1dCB0aGF0IHNob3VsZG4ndCBiZSBuZWNlc3NhcnkuICovCisKK3N0YXRpYyB2b2lkIG5lX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIHJlc2V0X3N0YXJ0X3RpbWUgPSBqaWZmaWVzOworCisJaWYgKGVpX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgInJlc2V0dGluZyB0aGUgODM5MCB0PSVsZC4uLiIsIGppZmZpZXMpOworCisJLyogRE9OJ1QgY2hhbmdlIHRoZXNlIHRvIGluYl9wL291dGJfcCBvciByZXNldCB3aWxsIGZhaWwgb24gY2xvbmVzLiAqLworCW91dGIoaW5iKE5FX0JBU0UgKyBORV9SRVNFVCksIE5FX0JBU0UgKyBORV9SRVNFVCk7CisKKwllaV9zdGF0dXMudHhpbmcgPSAwOworCWVpX3N0YXR1cy5kbWFpbmcgPSAwOworCisJLyogVGhpcyBjaGVjayBfc2hvdWxkX25vdF8gYmUgbmVjZXNzYXJ5LCBvbWl0IGV2ZW50dWFsbHkuICovCisJd2hpbGUgKChpbmJfcChORV9CQVNFK0VOMF9JU1IpICYgRU5JU1JfUkVTRVQpID09IDApCisJCWlmIChqaWZmaWVzIC0gcmVzZXRfc3RhcnRfdGltZSA+IDIqSFovMTAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbmVfcmVzZXRfODM5MCgpIGRpZCBub3QgY29tcGxldGUuXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKwlvdXRiX3AoRU5JU1JfUkVTRVQsIE5FX0JBU0UgKyBFTjBfSVNSKTsJLyogQWNrIGludHIuICovCit9CisKKy8qIEdyYWIgdGhlIDgzOTAgc3BlY2lmaWMgaGVhZGVyLiBTaW1pbGFyIHRvIHRoZSBibG9ja19pbnB1dCByb3V0aW5lLCBidXQKKyAgIHdlIGRvbid0IG5lZWQgdG8gYmUgY29uY2VybmVkIHdpdGggcmluZyB3cmFwIGFzIHRoZSBoZWFkZXIgd2lsbCBiZSBhdAorICAgdGhlIHN0YXJ0IG9mIGEgcGFnZSwgc28gd2Ugb3B0aW1pemUgYWNjb3JkaW5nbHkuICovCisKK3N0YXRpYyB2b2lkIG5lX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQoreworCWludCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCisJLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworCisJaWYgKGVpX3N0YXR1cy5kbWFpbmcpCisJeworCQlwcmludGsoS0VSTl9FTUVSRyAiJXM6IERNQWluZyBjb25mbGljdCBpbiBuZV9nZXRfODM5MF9oZHIgIgorCQkJIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXS5cbiIsCisJCQlkZXYtPm5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKwlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQsIG5pY19iYXNlKyBORV9DTUQpOworCW91dGJfcChzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpLCBuaWNfYmFzZSArIEVOMF9SQ05UTE8pOworCW91dGJfcCgwLCBuaWNfYmFzZSArIEVOMF9SQ05USEkpOworCW91dGJfcCgwLCBuaWNfYmFzZSArIEVOMF9SU0FSTE8pOwkJLyogT24gcGFnZSBib3VuZGFyeSAqLworCW91dGJfcChyaW5nX3BhZ2UsIG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisJb3V0Yl9wKEU4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIE5FX0NNRCk7CisKKwlpZiAoZWlfc3RhdHVzLndvcmQxNikKKwkJaW5zdyhORV9CQVNFICsgTkVfREFUQVBPUlQsIGhkciwgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKT4+MSk7CisJZWxzZQorCQlpbnNiKE5FX0JBU0UgKyBORV9EQVRBUE9SVCwgaGRyLCBzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpKTsKKworCW91dGJfcChFTklTUl9SREMsIG5pY19iYXNlICsgRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworCWVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7CisKKwlsZTE2X3RvX2NwdXMoJmhkci0+Y291bnQpOworfQorCisvKiBCbG9jayBpbnB1dCBhbmQgb3V0cHV0LCBzaW1pbGFyIHRvIHRoZSBDcnlud3IgcGFja2V0IGRyaXZlci4gIElmIHlvdQorICAgYXJlIHBvcnRpbmcgdG8gYSBuZXcgZXRoZXJjYXJkLCBsb29rIGF0IHRoZSBwYWNrZXQgZHJpdmVyIHNvdXJjZSBmb3IgaGludHMuCisgICBUaGUgTkV4MDAwIGRvZXNuJ3Qgc2hhcmUgdGhlIG9uLWJvYXJkIHBhY2tldCBtZW1vcnkgLS0geW91IGhhdmUgdG8gcHV0CisgICB0aGUgcGFja2V0IG91dCB0aHJvdWdoIHRoZSAicmVtb3RlIERNQSIgZGF0YXBvcnQgdXNpbmcgb3V0Yi4gKi8KKworc3RhdGljIHZvaWQgbmVfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpCit7CisjaWZkZWYgTkVfU0FOSVRZX0NIRUNLCisJaW50IHhmZXJfY291bnQgPSBjb3VudDsKKyNlbmRpZgorCWludCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCWNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKKworCS8qIFRoaXMgKnNob3VsZG4ndCogaGFwcGVuLiBJZiBpdCBkb2VzLCBpdCdzIHRoZSBsYXN0IHRoaW5nIHlvdSdsbCBzZWUgKi8KKwlpZiAoZWlfc3RhdHVzLmRtYWluZykKKwl7CisJCXByaW50ayhLRVJOX0VNRVJHICIlczogRE1BaW5nIGNvbmZsaWN0IGluIG5lX2Jsb2NrX2lucHV0ICIKKwkJCSJbRE1Bc3RhdDolZF1baXJxbG9jazolZF0uXG4iLAorCQkJZGV2LT5uYW1lLCBlaV9zdGF0dXMuZG1haW5nLCBlaV9zdGF0dXMuaXJxbG9jayk7CisJCXJldHVybjsKKwl9CisJZWlfc3RhdHVzLmRtYWluZyB8PSAweDAxOworCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgbmljX2Jhc2UrIE5FX0NNRCk7CisJb3V0Yl9wKGNvdW50ICYgMHhmZiwgbmljX2Jhc2UgKyBFTjBfUkNOVExPKTsKKwlvdXRiX3AoY291bnQgPj4gOCwgbmljX2Jhc2UgKyBFTjBfUkNOVEhJKTsKKwlvdXRiX3AocmluZ19vZmZzZXQgJiAweGZmLCBuaWNfYmFzZSArIEVOMF9SU0FSTE8pOworCW91dGJfcChyaW5nX29mZnNldCA+PiA4LCBuaWNfYmFzZSArIEVOMF9SU0FSSEkpOworCW91dGJfcChFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBORV9DTUQpOworCWlmIChlaV9zdGF0dXMud29yZDE2KQorCXsKKwkJaW5zdyhORV9CQVNFICsgTkVfREFUQVBPUlQsYnVmLGNvdW50Pj4xKTsKKwkJaWYgKGNvdW50ICYgMHgwMSkKKwkJeworCQkJYnVmW2NvdW50LTFdID0gaW5iKE5FX0JBU0UgKyBORV9EQVRBUE9SVCk7CisjaWZkZWYgTkVfU0FOSVRZX0NIRUNLCisJCQl4ZmVyX2NvdW50Kys7CisjZW5kaWYKKwkJfQorCX0gZWxzZSB7CisJCWluc2IoTkVfQkFTRSArIE5FX0RBVEFQT1JULCBidWYsIGNvdW50KTsKKwl9CisKKyNpZmRlZiBORV9TQU5JVFlfQ0hFQ0sKKwkvKiBUaGlzIHdhcyBmb3IgdGhlIEFMUEhBIHZlcnNpb24gb25seSwgYnV0IGVub3VnaCBwZW9wbGUgaGF2ZQorCSAgIGJlZW4gZW5jb3VudGVyaW5nIHByb2JsZW1zIHNvIGl0IGlzIHN0aWxsIGhlcmUuICBJZiB5b3Ugc2VlCisJICAgdGhpcyBtZXNzYWdlIHlvdSBlaXRoZXIgMSkgaGF2ZSBhIHNsaWdodGx5IGluY29tcGF0aWJsZSBjbG9uZQorCSAgIG9yIDIpIGhhdmUgbm9pc2Uvc3BlZWQgcHJvYmxlbXMgd2l0aCB5b3VyIGJ1cy4gKi8KKworCWlmIChlaV9kZWJ1ZyA+IDEpCisJeworCQkvKiBETUEgdGVybWluYXRpb24gYWRkcmVzcyBjaGVjay4uLiAqLworCQlpbnQgYWRkciwgdHJpZXMgPSAyMDsKKwkJZG8geworCQkJLyogRE9OJ1QgY2hlY2sgZm9yICdpbmJfcChFTjBfSVNSKSAmIEVOSVNSX1JEQycgaGVyZQorCQkJICAgLS0gaXQncyBicm9rZW4gZm9yIFJ4IG9uIHNvbWUgY2FyZHMhICovCisJCQlpbnQgaGlnaCA9IGluYl9wKG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisJCQlpbnQgbG93ID0gaW5iX3AobmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKwkJCWFkZHIgPSAoaGlnaCA8PCA4KSArIGxvdzsKKwkJCWlmICgoKHJpbmdfb2Zmc2V0ICsgeGZlcl9jb3VudCkgJiAweGZmKSA9PSBsb3cpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKC0tdHJpZXMgPiAwKTsKKwkgCWlmICh0cmllcyA8PSAwKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJYIHRyYW5zZmVyIGFkZHJlc3MgbWlzbWF0Y2gsIgorCQkJCSIlIzQuNHggKGV4cGVjdGVkKSB2cy4gJSM0LjR4IChhY3R1YWwpLlxuIiwKKwkJCQlkZXYtPm5hbWUsIHJpbmdfb2Zmc2V0ICsgeGZlcl9jb3VudCwgYWRkcik7CisJfQorI2VuZGlmCisJb3V0Yl9wKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBFTjBfSVNSKTsJLyogQWNrIGludHIuICovCisJZWlfc3RhdHVzLmRtYWluZyAmPSB+MHgwMTsKK30KKworc3RhdGljIHZvaWQgbmVfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBjb25zdCBpbnQgc3RhcnRfcGFnZSkKK3sKKwlpbnQgbmljX2Jhc2UgPSBORV9CQVNFOworCXVuc2lnbmVkIGxvbmcgZG1hX3N0YXJ0OworI2lmZGVmIE5FX1NBTklUWV9DSEVDSworCWludCByZXRyaWVzID0gMDsKKyNlbmRpZgorCisJLyogUm91bmQgdGhlIGNvdW50IHVwIGZvciB3b3JkIHdyaXRlcy4gIERvIHdlIG5lZWQgdG8gZG8gdGhpcz8KKwkgICBXaGF0IGVmZmVjdCB3aWxsIGFuIG9kZCBieXRlIGNvdW50IGhhdmUgb24gdGhlIDgzOTA/CisJICAgSSBzaG91bGQgY2hlY2sgc29tZWRheS4gKi8KKworCWlmIChlaV9zdGF0dXMud29yZDE2ICYmIChjb3VudCAmIDB4MDEpKQorCQljb3VudCsrOworCisJLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworCWlmIChlaV9zdGF0dXMuZG1haW5nKQorCXsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIiVzOiBETUFpbmcgY29uZmxpY3QgaW4gbmVfYmxvY2tfb3V0cHV0LiIKKwkJCSJbRE1Bc3RhdDolZF1baXJxbG9jazolZF1cbiIsCisJCQlkZXYtPm5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrKTsKKwkJcmV0dXJuOworCX0KKwllaV9zdGF0dXMuZG1haW5nIHw9IDB4MDE7CisJLyogV2Ugc2hvdWxkIGFscmVhZHkgYmUgaW4gcGFnZSAwLCBidXQgdG8gYmUgc2FmZS4uLiAqLworCW91dGJfcChFODM5MF9QQUdFMCtFODM5MF9TVEFSVCtFODM5MF9OT0RNQSwgbmljX2Jhc2UgKyBORV9DTUQpOworCisjaWZkZWYgTkVfU0FOSVRZX0NIRUNLCityZXRyeToKKyNlbmRpZgorCisjaWZkZWYgTkU4MzkwX1JXX0JVR0ZJWAorCS8qIEhhbmRsZSB0aGUgcmVhZC1iZWZvcmUtd3JpdGUgYnVnIHRoZSBzYW1lIHdheSBhcyB0aGUKKwkgICBDcnlud3IgcGFja2V0IGRyaXZlciAtLSB0aGUgTmF0U2VtaSBtZXRob2QgZG9lc24ndCB3b3JrLgorCSAgIEFjdHVhbGx5IHRoaXMgZG9lc24ndCBhbHdheXMgd29yayBlaXRoZXIsIGJ1dCBpZiB5b3UgaGF2ZQorCSAgIHByb2JsZW1zIHdpdGggeW91ciBORXgwMDAgdGhpcyBpcyBiZXR0ZXIgdGhhbiBub3RoaW5nISAqLworCisJb3V0Yl9wKDB4NDIsIG5pY19iYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKDB4MDAsICAgbmljX2Jhc2UgKyBFTjBfUkNOVEhJKTsKKwlvdXRiX3AoMHg0MiwgbmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKwlvdXRiX3AoMHgwMCwgbmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKwlvdXRiX3AoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIG5pY19iYXNlICsgTkVfQ01EKTsKKwkvKiBNYWtlIGNlcnRhaW4gdGhhdCB0aGUgZHVtbXkgcmVhZCBoYXMgb2NjdXJyZWQuICovCisJdWRlbGF5KDYpOworI2VuZGlmCisKKwlvdXRiX3AoRU5JU1JfUkRDLCBuaWNfYmFzZSArIEVOMF9JU1IpOworCisJLyogTm93IHRoZSBub3JtYWwgb3V0cHV0LiAqLworCW91dGJfcChjb3VudCAmIDB4ZmYsIG5pY19iYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKGNvdW50ID4+IDgsICAgbmljX2Jhc2UgKyBFTjBfUkNOVEhJKTsKKwlvdXRiX3AoMHgwMCwgbmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKwlvdXRiX3Aoc3RhcnRfcGFnZSwgbmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKworCW91dGJfcChFODM5MF9SV1JJVEUrRTgzOTBfU1RBUlQsIG5pY19iYXNlICsgTkVfQ01EKTsKKwlpZiAoZWlfc3RhdHVzLndvcmQxNikgeworCQlvdXRzdyhORV9CQVNFICsgTkVfREFUQVBPUlQsIGJ1ZiwgY291bnQ+PjEpOworCX0gZWxzZSB7CisJCW91dHNiKE5FX0JBU0UgKyBORV9EQVRBUE9SVCwgYnVmLCBjb3VudCk7CisJfQorCisJZG1hX3N0YXJ0ID0gamlmZmllczsKKworI2lmZGVmIE5FX1NBTklUWV9DSEVDSworCS8qIFRoaXMgd2FzIGZvciB0aGUgQUxQSEEgdmVyc2lvbiBvbmx5LCBidXQgZW5vdWdoIHBlb3BsZSBoYXZlCisJICAgYmVlbiBlbmNvdW50ZXJpbmcgcHJvYmxlbXMgc28gaXQgaXMgc3RpbGwgaGVyZS4gKi8KKworCWlmIChlaV9kZWJ1ZyA+IDEpCisJeworCQkvKiBETUEgdGVybWluYXRpb24gYWRkcmVzcyBjaGVjay4uLiAqLworCQlpbnQgYWRkciwgdHJpZXMgPSAyMDsKKwkJZG8geworCQkJaW50IGhpZ2ggPSBpbmJfcChuaWNfYmFzZSArIEVOMF9SU0FSSEkpOworCQkJaW50IGxvdyA9IGluYl9wKG5pY19iYXNlICsgRU4wX1JTQVJMTyk7CisJCQlhZGRyID0gKGhpZ2ggPDwgOCkgKyBsb3c7CisJCQlpZiAoKHN0YXJ0X3BhZ2UgPDwgOCkgKyBjb3VudCA9PSBhZGRyKQorCQkJCWJyZWFrOworCQl9IHdoaWxlICgtLXRyaWVzID4gMCk7CisKKwkJaWYgKHRyaWVzIDw9IDApCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUeCBwYWNrZXQgdHJhbnNmZXIgYWRkcmVzcyBtaXNtYXRjaCwiCisJCQkJIiUjNC40eCAoZXhwZWN0ZWQpIHZzLiAlIzQuNHggKGFjdHVhbCkuXG4iLAorCQkJCWRldi0+bmFtZSwgKHN0YXJ0X3BhZ2UgPDwgOCkgKyBjb3VudCwgYWRkcik7CisJCQlpZiAocmV0cmllcysrID09IDApCisJCQkJZ290byByZXRyeTsKKwkJfQorCX0KKyNlbmRpZgorCisJd2hpbGUgKChpbmJfcChuaWNfYmFzZSArIEVOMF9JU1IpICYgRU5JU1JfUkRDKSA9PSAwKQorCQlpZiAoamlmZmllcyAtIGRtYV9zdGFydCA+IDIqSFovMTAwKSB7CQkvKiAyMG1zICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdGltZW91dCB3YWl0aW5nIGZvciBUeCBSREMuXG4iLCBkZXYtPm5hbWUpOworCQkJbmVfcmVzZXRfODM5MChkZXYpOworCQkJTlM4MzkwX2luaXQoZGV2LDEpOworCQkJYnJlYWs7CisJCX0KKworCW91dGJfcChFTklTUl9SREMsIG5pY19iYXNlICsgRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworCWVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7CisJcmV0dXJuOworfQorCisMCisjaWZkZWYgTU9EVUxFCisjZGVmaW5lIE1BWF9ORV9DQVJEUwk0CS8qIE1heCBudW1iZXIgb2YgTkUgY2FyZHMgcGVyIG1vZHVsZSAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfbmVbTUFYX05FX0NBUkRTXTsKK3N0YXRpYyBpbnQgaW9bTUFYX05FX0NBUkRTXTsKK3N0YXRpYyBpbnQgaXJxW01BWF9ORV9DQVJEU107CitzdGF0aWMgaW50IGJhZFtNQVhfTkVfQ0FSRFNdOwkvKiAweGJhZCA9IGJhZCBzaWcgb3Igbm8gcmVzZXQgYWNrICovCisKK21vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoYmFkLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBiYXNlIGFkZHJlc3MoZXMpLHJlcXVpcmVkIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSBudW1iZXIocykiKTsKK01PRFVMRV9QQVJNX0RFU0MoYmFkLCAiQWNjZXB0IGNhcmQocykgd2l0aCBiYWQgc2lnbmF0dXJlcyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJORTEwMDAvTkUyMDAwIElTQS9QblAgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIFRoaXMgaXMgc2V0IHVwIHNvIHRoYXQgbm8gSVNBIGF1dG9wcm9iZSB0YWtlcyBwbGFjZS4gV2UgY2FuJ3QgZ3VhcmFudGVlCit0aGF0IHRoZSBuZTJrIHByb2JlIGlzIHRoZSBsYXN0IDgzOTAgYmFzZWQgcHJvYmUgdG8gdGFrZSBwbGFjZSAoYXMgaXQKK2lzIGF0IGJvb3QpIGFuZCBzbyB0aGUgcHJvYmUgd2lsbCBnZXQgY29uZnVzZWQgYnkgYW55IG90aGVyIDgzOTAgY2FyZHMuCitJU0EgZGV2aWNlIGF1dG9wcm9iZXMgb24gYSBydW5uaW5nIG1hY2hpbmUgYXJlIG5vdCByZWNvbW1lbmRlZCBhbnl3YXkuICovCisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWludCB0aGlzX2RldiwgZm91bmQgPSAwOworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX05FX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKwkJaWYgKCFkZXYpCisJCQlicmVhazsKKwkJZGV2LT5pcnEgPSBpcnFbdGhpc19kZXZdOworCQlkZXYtPm1lbV9lbmQgPSBiYWRbdGhpc19kZXZdOworCQlkZXYtPmJhc2VfYWRkciA9IGlvW3RoaXNfZGV2XTsKKwkJaWYgKGRvX25lX3Byb2JlKGRldikgPT0gMCkgeworCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKKwkJCQlkZXZfbmVbZm91bmQrK10gPSBkZXY7CisJCQkJY29udGludWU7CisJCQl9CisJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJfQorCQlmcmVlX25ldGRldihkZXYpOworCQlpZiAoZm91bmQpCisJCQlicmVhazsKKwkJaWYgKGlvW3RoaXNfZGV2XSAhPSAwKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibmUuYzogTm8gTkUqMDAwIGNhcmQgZm91bmQgYXQgaS9vID0gJSN4XG4iLCBpb1t0aGlzX2Rldl0pOworCQllbHNlCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIm5lLmM6IFlvdSBtdXN0IHN1cHBseSBcImlvPTB4Tk5OXCIgdmFsdWUocykgZm9yIElTQSBjYXJkcy5cbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlpZiAoZm91bmQpCisJCXJldHVybiAwOworCXJldHVybiAtRU5PREVWOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IHRoaXNfZGV2OworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX05FX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfbmVbdGhpc19kZXZdOworCQlpZiAoZGV2KSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQkJY2xlYW51cF9jYXJkKGRldik7CisJCQlmcmVlX25ldGRldihkZXYpOworCQl9CisJfQorfQorI2VuZGlmIC8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmUyLmMgYi9kcml2ZXJzL25ldC9uZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWJlZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbmUyLmMKQEAgLTAsMCArMSw4MjkgQEAKKy8qIG5lMi5jOiBBIE5FLzIgRXRoZXJuZXQgRHJpdmVyIGZvciBMaW51eC4gKi8KKy8qCisgICBCYXNlZCBvbiB0aGUgTkUyMDAwIGRyaXZlciB3cml0dGVuIGJ5IERvbmFsZCBCZWNrZXIgKDE5OTItOTQpLgorICAgbW9kaWZpZWQgYnkgV2ltIER1bW9uIChBcHIgMTk5NikKKworICAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworICAgVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyB3aW1waWVAbGludXguY2Mua3VsZXV2ZW4uYWMuYmUKKworICAgQ3VycmVudGx5IHN1cHBvcnRlZDogTkUvMgorICAgVGhpcyBwYXRjaCB3YXMgbmV2ZXIgdGVzdGVkIG9uIG90aGVyIE1DQS1ldGhlcm5ldCBhZGFwdGVycywgYnV0IGl0CisgICBtaWdodCB3b3JrLiBKdXN0IGdpdmUgaXQgYSB0cnkgYW5kIGxldCBtZSBrbm93IGlmIHlvdSBoYXZlIHByb2JsZW1zLgorICAgQWxzbyBtYWlsIG1lIGlmIGl0IHJlYWxseSB3b3JrcywgcGxlYXNlIQorCisgICBDaGFuZ2Vsb2c6CisgICBNb24gRmViICAzIDE2OjI2OjAyIE1FVCAxOTk3CisgICAtIGFkYXB0ZWQgdGhlIGRyaXZlciB0byB3b3JrIHdpdGggdGhlIDIuMS4yNSBrZXJuZWwKKyAgIC0gbXVsdGlwbGUgbmUyIHN1cHBvcnQgKHVudGVzdGVkKQorICAgLSBtb2R1bGUgc3VwcG9ydCAodW50ZXN0ZWQpCisKKyAgIEZyaSBBdWcgMjggMDA6MTg6MzYgQ0VUIDE5OTggKERhdmlkIFdlaW5laGFsbCkKKyAgIC0gZml4ZWQgYSBmZXcgbWlub3IgdHlwb3MKKyAgIC0gbWFkZSB0aGUgTU9EVUxFX1BBUk0gY29uZGl0aW9uYWwgKGl0IG9ubHkgd29ya3Mgd2l0aCB0aGUgdjIuMS54IGtlcm5lbHMpCisgICAtIGZpeGVkIHRoZSBtb2R1bGUgc3VwcG9ydCAoTm93IGl0J3Mgd29ya2luZy4uLikKKworICAgTW9uIFNlcCAgNyAxOTowMTo0NCBDRVQgMTk5OCAoRGF2aWQgV2VpbmVoYWxsKQorICAgLSBhZGRlZCBzdXBwb3J0IGZvciBBcmNvIEVsZWN0cm9uaWNzIEFFLzItY2FyZCAoZXhwZXJpbWVudGFsKQorCisgICBNb24gU2VwIDE0IDA5OjUzOjQyIENFVCAxOTk4IChEYXZpZCBXZWluZWhhbGwpCisgICAtIGFkZGVkIHN1cHBvcnQgZm9yIENvbXBleCBFTkVULTE2TUMvUCAoZXhwZXJpbWVudGFsKSAKKworICAgVHVlIFNlcCAxNSAxNjoyMToxMiBDRVQgMTk5OCAoRGF2aWQgV2VpbmVoYWxsLCBNYWdudXMgSm9uc3NvbiwgVG9tYXMgT2dyZW4pCisgICAtIE1pc2NlbGxhbmVvdXMgYnVnZml4ZXMKKworICAgVHVlIFNlcCAxOSAxNjoyMToxMiBDRVQgMTk5OCAoTWFnbnVzIEpvbnNzb24pCisgICAtIENsZWFudXAKKworICAgV2VkIFNlcCAyMyAxNDozMzozNCBDRVQgMTk5OCAoRGF2aWQgV2VpbmVoYWxsKQorICAgLSBSZXN0cnVjdHVyaW5nIGFuZCByZXdyaXRpbmcgZm9yIHYyLjEueCBjb21wbGlhbmNlCisKKyAgIFdlZCBPY3QgMTQgMTc6MTk6MjEgQ0VUIDE5OTggKERhdmlkIFdlaW5laGFsbCkKKyAgIC0gQWRkZWQgY29kZSB0aGF0IHVucmVnaXN0ZXJzIGlycSBhbmQgcHJvYy1pbmZvCisgICAtIFZlcnNpb24jIGJ1bXAKKworICAgTW9uIE5vdiAxNiAxNToyODoyMyBDRVQgMTk5OCAoV2ltIER1bW9uKQorICAgLSBwYXNzICdkZXYnIGFzIGxhc3QgcGFyYW1ldGVyIG9mIHJlcXVlc3RfaXJxIGluIHN0ZWFkIG9mICdOVUxMJyAgIAorCisgICBXZWQgRmViICA3IDIxOjI0OjAwIENFVCAyMDAxIChBbGZyZWQgQXJub2xkKQorICAgLSBhZGRlZCBzdXBwb3J0IGZvciB0aGUgRC1MaW5rIERFLTMyMENUCisgICAKKyAgICogICAgV0FSTklORworCS0tLS0tLS0KKwlUaGlzIGlzIGFscGhhLXRlc3Qgc29mdHdhcmUuICBJdCBpcyBub3QgZ3VhcmFudGVlZCB0byB3b3JrLiBBcyBhCisJbWF0dGVyIG9mIGZhY3QsIEknbSBxdWl0ZSBzdXJlIHRoZXJlIGFyZSAqTE9UUyogb2YgYnVncyBpbiBoZXJlLiBJCisJd291bGQgbGlrZSB0byBoZWFyIGZyb20geW91IGlmIHlvdSB1c2UgdGhpcyBkcml2ZXIsIGV2ZW4gaWYgaXQgd29ya3MuCisJSWYgaXQgZG9lc24ndCB3b3JrLCBiZSBzdXJlIHRvIHNlbmQgbWUgYSBtYWlsIHdpdGggdGhlIHByb2JsZW1zICEKKyovCisKK3N0YXRpYyBjb25zdCBjaGFyICp2ZXJzaW9uID0gIm5lMi5jOnYwLjkxIE5vdiAxNiAxOTk4IFdpbSBEdW1vbiA8d2ltcGllQGtvdG5ldC5vcmc+XG4iOworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS1sZWdhY3kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2luY2x1ZGUgIjgzOTAuaCIKKworI2RlZmluZSBEUlZfTkFNRSAibmUyIgorCisvKiBTb21lIGRlZmluZXMgdGhhdCBwZW9wbGUgY2FuIHBsYXkgd2l0aCBpZiBzbyBpbmNsaW5lZC4gKi8KKworLyogRG8gd2UgcGVyZm9ybSBleHRyYSBzYW5pdHkgY2hlY2tzIG9uIHN0dWZmID8gKi8KKy8qICNkZWZpbmUgTkVfU0FOSVRZX0NIRUNLICovCisKKy8qIERvIHdlIGltcGxlbWVudCB0aGUgcmVhZCBiZWZvcmUgd3JpdGUgYnVnZml4ID8gKi8KKy8qICNkZWZpbmUgTkVfUldfQlVHRklYICovCisKKy8qIERvIHdlIGhhdmUgYSBub24gc3RkLiBhbW91bnQgb2YgbWVtb3J5PyAoaW4gdW5pdHMgb2YgMjU2IGJ5dGUgcGFnZXMpICovCisvKiAjZGVmaW5lIFBBQ0tFVEJVRl9NRU1TSVpFCTB4NDAgKi8KKworCisvKiAtLS0tIE5vIHVzZXItc2VydmljZWFibGUgcGFydHMgYmVsb3cgLS0tLSAqLworCisjZGVmaW5lIE5FX0JBU0UJIChkZXYtPmJhc2VfYWRkcikKKyNkZWZpbmUgTkVfQ01ECSAJMHgwMAorI2RlZmluZSBORV9EQVRBUE9SVAkweDEwCS8qIE5hdFNlbWktZGVmaW5lZCBwb3J0IHdpbmRvdyBvZmZzZXQuICovCisjZGVmaW5lIE5FX1JFU0VUCTB4MjAJLyogSXNzdWUgYSByZWFkIHRvIHJlc2V0LCBhIHdyaXRlIHRvIGNsZWFyLiAqLworI2RlZmluZSBORV9JT19FWFRFTlQJMHgzMAorCisjZGVmaW5lIE5FMVNNX1NUQVJUX1BHCTB4MjAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKyNkZWZpbmUgTkUxU01fU1RPUF9QRyAJMHg0MAkvKiBMYXN0IHBhZ2UgKzEgb2YgUlggcmluZyAqLworI2RlZmluZSBORVNNX1NUQVJUX1BHCTB4NDAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKyNkZWZpbmUgTkVTTV9TVE9QX1BHCTB4ODAJLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcgKi8KKworLyogRnJvbSB0aGUgLkFERiBmaWxlOiAqLworc3RhdGljIHVuc2lnbmVkIGludCBhZGRyZXNzZXNbN10gX19pbml0ZGF0YSA9CisJCXsweDEwMDAsIDB4MjAyMCwgMHg4MDIwLCAweGEwYTAsIDB4YjBiMCwgMHhjMGMwLCAweGMzZDB9Oworc3RhdGljIGludCBpcnFzWzRdIF9faW5pdGRhdGEgPSB7MywgNCwgNSwgOX07CisKKy8qIEZyb20gdGhlIEQtTGluayBBREYgZmlsZTogKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGxpbmtfYWRkcmVzc2VzWzRdIF9faW5pdGRhdGEgPQorICAgICAgICAgICAgICAgIHsweDMwMCwgMHgzMjAsIDB4MzQwLCAweDM2MH07CitzdGF0aWMgaW50IGRsaW5rX2lycXNbOF0gX19pbml0ZGF0YSA9IHszLCA0LCA1LCA5LCAxMCwgMTEsIDE0LCAxNX07CisKK3N0cnVjdCBuZTJfYWRhcHRlcnNfdCB7CisJdW5zaWduZWQgaW50CWlkOworCWNoYXIJCSpuYW1lOworfTsKKworc3RhdGljIHN0cnVjdCBuZTJfYWRhcHRlcnNfdCBuZTJfYWRhcHRlcnNbXSBfX2luaXRkYXRhID0geworCXsgMHg2MzU0LCAiQXJjbyBFdGhlcm5ldCBBZGFwdGVyIEFFLzIiIH0sCisJeyAweDcwREUsICJDb21wZXggRU5FVC0xNiBNQy9QIiB9LAorCXsgMHg3MTU0LCAiTm92ZWxsIEV0aGVybmV0IEFkYXB0ZXIgTkUvMiIgfSwKKyAgICAgICAgeyAweDU2ZWEsICJELUxpbmsgREUtMzIwQ1QiIH0sCisJeyAweDAwMDAsIE5VTEwgfQorfTsKKworZXh0ZXJuIGludCBuZXRjYXJkX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgaW50IG5lMl9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNsb3QpOworCitzdGF0aWMgaW50IG5lX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG5lX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZCBuZV9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbmVfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsCisJCWludCByaW5nX3BhZ2UpOworc3RhdGljIHZvaWQgbmVfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQgbmVfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IGludCBjb3VudCwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBjb25zdCBpbnQgc3RhcnRfcGFnZSk7CisKKworLyoKKyAqIHNwZWNpYWwgY29kZSB0byByZWFkIHRoZSBERS0zMjAncyBNQUMgYWRkcmVzcyBFRVBST00uICBJbiBjb250cmFzdCB0byBhIAorICogc3RhbmRhcmQgTkUgZGVzaWduLCB0aGlzIGlzIGEgc2VyaWFsIEVFUFJPTSAoOTNDNDYpIHRoYXQgaGFzIHRvIGJlIHJlYWQKKyAqIGJpdCBieSBiaXQuICBUaGUgRUVQUk9NIGNvdHJvbCBwb3J0IGF0IGJhc2UgKyAweDFlIGhhcyB0aGUgZm9sbG93aW5nIAorICogbGF5b3V0OgorICoKKyAqIEJpdCAwID0gRGF0YSBvdXQgKHJlYWQgZnJvbSBFRVBST00pCisgKiBCaXQgMSA9IERhdGEgaW4gICh3cml0ZSB0byBFRVBST00pCisgKiBCaXQgMiA9IENsb2NrCisgKiBCaXQgMyA9IENoaXAgU2VsZWN0CisgKiBCaXQgNyA9IH41MCBrSHogY2xvY2sgZm9yIGRlZmluZWQgZGVsYXlzCisgKgorICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBkbGlua19wdXRfZWVwcm9tKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHVuc2lnbmVkIGludCBhZGRyKQoreworCWludCB6OworCXVuc2lnbmVkIGNoYXIgdjEsIHYyOworCisJLyogd3JpdGUgdGhlIHZhbHVlIHRvIHRoZSBOSUMgRUVQUk9NIHJlZ2lzdGVyICovCisKKwlvdXRiKHZhbHVlLCBhZGRyICsgMHgxZSk7CisKKwkvKiBub3cgd2FpdCB0aGUgY2xvY2sgbGluZSB0byB0b2dnbGUgdHdpY2UuICBFZmZlY3RpdmVseSwgd2UgYXJlCisJICAgd2FpdGluZyAoYXQgbGVhc3QpIGZvciBvbmUgY2xvY2sgY3ljbGUgKi8KKworCWZvciAoeiA9IDA7IHogPCAyOyB6KyspIHsKKwkJZG8geworCQkJdjEgPSBpbmIoYWRkciArIDB4MWUpOworCQkJdjIgPSBpbmIoYWRkciArIDB4MWUpOworCQl9CisJCXdoaWxlICghKCh2MSBeIHYyKSAmIDB4ODApKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBkbGlua19zZW5kX2VlcHJvbV9iaXQodW5zaWduZWQgaW50IGJpdCwgdW5zaWduZWQgaW50IGFkZHIpCit7CisJLyogc2hpZnQgZGF0YSBiaXQgaW50byBjb3JyZWN0IHBvc2l0aW9uICovCisKKwliaXQgPSBiaXQgPDwgMTsKKworCS8qIHdyaXRlIHZhbHVlLCBrZWVwIGNsb2NrIGxpbmUgaGlnaCBmb3IgdHdvIGN5Y2xlcyAqLworCisJZGxpbmtfcHV0X2VlcHJvbSgweDA5IHwgYml0LCBhZGRyKTsKKwlkbGlua19wdXRfZWVwcm9tKDB4MGQgfCBiaXQsIGFkZHIpOworCWRsaW5rX3B1dF9lZXByb20oMHgwZCB8IGJpdCwgYWRkcik7CisJZGxpbmtfcHV0X2VlcHJvbSgweDA5IHwgYml0LCBhZGRyKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGRsaW5rX3NlbmRfZWVwcm9tX3dvcmQodW5zaWduZWQgaW50IHZhbHVlLCB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgYWRkcikKK3sKKwlpbnQgejsKKworCS8qIGFkanVzdCBiaXRzIHNvIHRoYXQgdGhleSBhcmUgbGVmdC1hbGlnbmVkIGluIGEgMTYtYml0LXdvcmQgKi8KKworCXZhbHVlID0gdmFsdWUgPDwgKDE2IC0gbGVuKTsKKworCS8qIHNoaWZ0IGJpdHMgb3V0IHRvIHRoZSBFRVBST00gKi8KKworCWZvciAoeiA9IDA7IHogPCBsZW47IHorKykgeworCQlkbGlua19zZW5kX2VlcHJvbV9iaXQoKHZhbHVlICYgMHg4MDAwKSA+PiAxNSwgYWRkcik7CisJCXZhbHVlID0gdmFsdWUgPDwgMTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGRsaW5rX2dldF9lZXByb20odW5zaWduZWQgaW50IGVlYWRkciwgdW5zaWduZWQgaW50IGFkZHIpCit7CisJaW50IHo7CisJdW5zaWduZWQgaW50IHZhbHVlID0gMDsKKyAKKwkvKiBwdWxsIHRoZSBDUyBsaW5lIGxvdyBmb3IgYSBtb21lbnQuICBUaGlzIHJlc2V0cyB0aGUgRUVQUk9NLQorCSAgIGludGVybmFsIGxvZ2ljLCBhbmQgbWFrZXMgaXQgcmVhZHkgZm9yIGEgbmV3IGNvbW1hbmQuICovCisKKwlkbGlua19wdXRfZWVwcm9tKDB4MDEsIGFkZHIpOworCWRsaW5rX3B1dF9lZXByb20oMHgwOSwgYWRkcik7CisKKwkvKiBzZW5kIG9uZSBzdGFydCBiaXQsIHJlYWQgY29tbWFuZCAoMSAtIDApLCBwbHVzIHRoZSBhZGRyZXNzIHRvCisgICAgICAgICAgIHRoZSBFRVBST00gKi8KKworCWRsaW5rX3NlbmRfZWVwcm9tX3dvcmQoMHgwMTgwIHwgKGVlYWRkciAmIDB4M2YpLCA5LCBhZGRyKTsKKworCS8qIGdldCB0aGUgZGF0YSB3b3JkLiAgV2UgY2xvY2sgYnkgc2VuZGluZyAwcyB0byB0aGUgRUVQUk9NLCB3aGljaAorCSAgIGdldCBpZ25vcmVkIGR1cmluZyB0aGUgcmVhZCBwcm9jZXNzICovCisKKwlmb3IgKHogPSAwOyB6IDwgMTY7IHorKykgeworCQlkbGlua19zZW5kX2VlcHJvbV9iaXQoMCwgYWRkcik7CisJCXZhbHVlID0gKHZhbHVlIDw8IDEpIHwgKGluYihhZGRyICsgMHgxZSkgJiAweDAxKTsKKwl9CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qCisgKiBOb3RlIHRoYXQgYXQgYm9vdCwgdGhpcyBwcm9iZSBvbmx5IHBpY2tzIHVwIG9uZSBjYXJkIGF0IGEgdGltZS4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBkb19uZTJfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdGF0aWMgaW50IGN1cnJlbnRfbWNhX3Nsb3QgPSAtMTsKKwlpbnQgaTsKKwlpbnQgYWRhcHRlcl9mb3VuZCA9IDA7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwkvKiBEbyBub3QgY2hlY2sgYW55IHN1cHBsaWVkIGkvbyBsb2NhdGlvbnMuIAorCSAgIFBPUyByZWdpc3RlcnMgdXN1YWxseSBkb24ndCBmYWlsIDopICovCisKKwkvKiBNQ0EgY2FyZHMgaGF2ZSBQT1MgcmVnaXN0ZXJzLiAgCisJICAgQXV0b2RldGVjdGluZyBNQ0EgY2FyZHMgaXMgZXh0cmVtZWx5IHNpbXBsZS4gCisJICAgSnVzdCBzZWFyY2ggZm9yIHRoZSBjYXJkLiAqLworCisJZm9yKGkgPSAwOyAobmUyX2FkYXB0ZXJzW2ldLm5hbWUgIT0gTlVMTCkgJiYgIWFkYXB0ZXJfZm91bmQ7IGkrKykgeworCQljdXJyZW50X21jYV9zbG90ID0gCisJCQltY2FfZmluZF91bnVzZWRfYWRhcHRlcihuZTJfYWRhcHRlcnNbaV0uaWQsIDApOworCisJCWlmKChjdXJyZW50X21jYV9zbG90ICE9IE1DQV9OT1RGT1VORCkgJiYgIWFkYXB0ZXJfZm91bmQpIHsKKwkJCWludCByZXM7CisJCQltY2Ffc2V0X2FkYXB0ZXJfbmFtZShjdXJyZW50X21jYV9zbG90LCAKKwkJCQkJbmUyX2FkYXB0ZXJzW2ldLm5hbWUpOworCQkJbWNhX21hcmtfYXNfdXNlZChjdXJyZW50X21jYV9zbG90KTsKKwkJCQorCQkJcmVzID0gbmUyX3Byb2JlMShkZXYsIGN1cnJlbnRfbWNhX3Nsb3QpOworCQkJaWYgKHJlcykKKwkJCQltY2FfbWFya19hc191bnVzZWQoY3VycmVudF9tY2Ffc2xvdCk7CisJCQlyZXR1cm4gcmVzOworCQl9CisJfQorCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwltY2FfbWFya19hc191bnVzZWQoZWlfc3RhdHVzLnByaXYpOworCW1jYV9zZXRfYWRhcHRlcl9wcm9jZm4oIGVpX3N0YXR1cy5wcml2LCBOVUxMLCBOVUxMKTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTkVfSU9fRVhURU5UKTsKK30KKworI2lmbmRlZiBNT0RVTEUKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IG5lMl9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJaW50IGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCisJZXJyID0gZG9fbmUyX3Byb2JlKGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCWNsZWFudXBfY2FyZChkZXYpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IG5lMl9wcm9jaW5mbyhjaGFyICpidWYsIGludCBzbG90LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBsZW49MDsKKworCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJUaGUgTkUvMiBFdGhlcm5ldCBBZGFwdGVyXG4iICk7CisJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIkRyaXZlciB3cml0dGVuIGJ5IFdpbSBEdW1vbiAiKTsKKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiPHdpbXBpZUBrb3RuZXQub3JnPlxuIik7IAorCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJNb2RpZmllZCBieSAiKTsKKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiRGF2aWQgV2VpbmVoYWxsIDx0YW9AYWNjLnVtdS5zZT5cbiIpOworCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJhbmQgYnkgTWFnbnVzIEpvbnNzb24gPGJpZ2Zvb3RAYWNjLnVtdS5zZT5cbiIpOworCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJCYXNlZCBvbiB0aGUgb3JpZ2luYWwgTkUyMDAwIGRyaXZlcnNcbiIgKTsKKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiQmFzZSBJTzogJSN4XG4iLCAodW5zaWduZWQgaW50KWRldi0+YmFzZV9hZGRyKTsKKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiSVJRICAgIDogJWRcbiIsIGRldi0+aXJxKTsKKworI2RlZmluZSBIV19BRERSKGkpIGRldi0+ZGV2X2FkZHJbaV0KKwlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiSFcgYWRkciA6ICV4OiV4OiV4OiV4OiV4OiV4XG4iLCAKKwkJCUhXX0FERFIoMCksIEhXX0FERFIoMSksIEhXX0FERFIoMiksIAorCQkJSFdfQUREUigzKSwgSFdfQUREUig0KSwgSFdfQUREUig1KSApOworI3VuZGVmIEhXX0FERFIKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG5lMl9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNsb3QpCit7CisJaW50IGksIGJhc2VfYWRkciwgaXJxLCByZXR2YWw7CisJdW5zaWduZWQgY2hhciBQT1M7CisJdW5zaWduZWQgY2hhciBTQV9wcm9tWzMyXTsKKwljb25zdCBjaGFyICpuYW1lID0gIk5FLzIiOworCWludCBzdGFydF9wYWdlLCBzdG9wX3BhZ2U7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKworCWlmIChlaV9kZWJ1ZyAmJiB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsodmVyc2lvbik7CisKKwlwcmludGsoIk5FLzIgZXRoZXJjYXJkIGZvdW5kIGluIHNsb3QgJWQ6Iiwgc2xvdCk7CisKKwkvKiBSZWFkIGJhc2UgSU8gYW5kIElSUSBmcm9tIHRoZSBQT1MtcmVnaXN0ZXJzICovCisJUE9TID0gbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCAyKTsKKwlpZighKFBPUyAlIDIpKSB7CisJCXByaW50aygiIGRpc2FibGVkLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIGhhbmRsZSBkaWZmZXJlbnQgUE9TIHJlZ2lzdGVyIHN0cnVjdHVyZSBmb3IgRC1MaW5rIGNhcmQgKi8KKworCWlmIChtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDApID09IDB4ZWEpIHsKKwkJYmFzZV9hZGRyID0gZGxpbmtfYWRkcmVzc2VzWyhQT1MgPj4gNSkgJiAweDAzXTsKKwkJaXJxID0gZGxpbmtfaXJxc1soUE9TID4+IDIpICYgMHgwN107CisJfQorICAgICAgICBlbHNlIHsKKwkJaSA9IChQT1MgJiAweEUpPj4xOworCQkvKiBwcmludGsoIkhhbGxlbHVqYSBzZG9nLCBhbHMgZXIgbmEgZGUgcGlqbCBlZW4gMSBzdGFhdCBpcyAxIC0gMSA9PSAwIgorCSAgIAkiIGVuIHpvdSBoZXQgbW9ldGVuIHdlcmtlbiAtPiAlZFxuIiwgaSk7CisJICAgCVRoZSBhYm92ZSBsaW5lIHdhcyBmb3IgcmVtb3RlIHRlc3RpbmcsIHRoYW54IHRvIHNkb2cgLi4uICovCisJCWJhc2VfYWRkciA9IGFkZHJlc3Nlc1tpIC0gMV07CisJCWlycSA9IGlycXNbKFBPUyAmIDB4NjApPj41XTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGJhc2VfYWRkciwgTkVfSU9fRVhURU5ULCBEUlZfTkFNRSkpCisJCXJldHVybiAtRUJVU1k7CisKKyNpZmRlZiBERUJVRworCXByaW50aygiUE9TIGluZm8gOiBwb3MgMiA9ICUjeCA7IGJhc2UgPSAlI3ggOyBpcnEgPSAlbGRcbiIsIFBPUywKKwkJCWJhc2VfYWRkciwgaXJxKTsKKyNlbmRpZgorCisjaWZuZGVmIENSWU5XUl9XQVkKKwkvKiBSZXNldCB0aGUgY2FyZCB0aGUgd2F5IHRoZXkgZG8gaXQgaW4gdGhlIENyeW53ciBwYWNrZXQgZHJpdmVyICovCisJZm9yIChpPTA7IGk8ODsgaSsrKSAKKwkJb3V0YigweDAsIGJhc2VfYWRkciArIE5FX1JFU0VUKTsKKwlpbmIoYmFzZV9hZGRyICsgTkVfUkVTRVQpOworCW91dGIoMHgyMSwgYmFzZV9hZGRyICsgTkVfQ01EKTsKKwlpZiAoaW5iKGJhc2VfYWRkciArIE5FX0NNRCkgIT0gMHgyMSkgeworCQlwcmludGsoIk5FLzIgYWRhcHRlciBub3QgcmVzcG9uZGluZ1xuIik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEluIHRoZSBjcnlud3Igc291cmNlcyB0aGV5IGRvIGEgUkFNLXRlc3QgaGVyZS4gSSBza2lwIGl0LiBJIHN1cHBvc2UKKwkgICBteSBSQU0gaXMgb2theS4gIFN1cHBvc2UgeW91ciBtZW1vcnkgaXMgYnJva2VuLiAgVGhlbiB0aGlzIHRlc3QKKwkgICBzaG91bGQgZmFpbCBhbmQgeW91IHdvbid0IGJlIGFibGUgdG8gdXNlIHlvdXIgY2FyZC4gIEJ1dCBpZiBJIGRvIG5vdAorCSAgIHRlc3QsIHlvdSB3b24ndCBiZSBhYmxlIHRvIHVzZSB5b3VyIGNhcmQsIG5laXRoZXIuICBTbyB0aGlzIHRlc3QKKwkgICB3b24ndCBoZWxwIHlvdS4gKi8KKworI2Vsc2UgIC8qIF9JXyBuZXZlciB0ZXN0ZWQgaXQgdGhpcyB3YXkgLi4gR28gYWhlYWQgYW5kIHRyeSAuLi4qLworCS8qIFJlc2V0IGNhcmQuIFdobyBrbm93cyB3aGF0IGRhaW4tYnJhbWFnZWQgc3RhdGUgaXQgd2FzIGxlZnQgaW4uICovCisJeyAKKwkJdW5zaWduZWQgbG9uZyByZXNldF9zdGFydF90aW1lID0gamlmZmllczsKKworCQkvKiBET04nVCBjaGFuZ2UgdGhlc2UgdG8gaW5iX3Avb3V0Yl9wIG9yIHJlc2V0IHdpbGwgZmFpbCBvbiAKKwkJICAgY2xvbmVzLi4gKi8KKwkJb3V0YihpbmIoYmFzZV9hZGRyICsgTkVfUkVTRVQpLCBiYXNlX2FkZHIgKyBORV9SRVNFVCk7CisKKwkJd2hpbGUgKChpbmJfcChiYXNlX2FkZHIgKyBFTjBfSVNSKSAmIEVOSVNSX1JFU0VUKSA9PSAwKQorCQkJaWYgKGppZmZpZXMgLSByZXNldF9zdGFydF90aW1lID4gMipIWi8xMDApIHsKKwkJCQlwcmludGsoIiBub3QgZm91bmQgKG5vIHJlc2V0IGFjaykuXG4iKTsKKwkJCQlyZXR2YWwgPSAtRU5PREVWOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCW91dGJfcCgweGZmLCBiYXNlX2FkZHIgKyBFTjBfSVNSKTsgICAgICAgICAvKiBBY2sgYWxsIGludHIuICovCisJfQorI2VuZGlmCisKKworCS8qIFJlYWQgdGhlIDE2IGJ5dGVzIG9mIHN0YXRpb24gYWRkcmVzcyBQUk9NLgorCSAgIFdlIG11c3QgZmlyc3QgaW5pdGlhbGl6ZSByZWdpc3RlcnMsIHNpbWlsYXIgdG8gCisJICAgTlM4MzkwX2luaXQoZWlmZGV2LCAwKS4KKwkgICBXZSBjYW4ndCByZWxpYWJseSByZWFkIHRoZSBTQVBST00gYWRkcmVzcyB3aXRob3V0IHRoaXMuCisJICAgKEkgbGVhcm5lZCB0aGUgaGFyZCB3YXkhKS4gKi8KKwl7CisJCXN0cnVjdCB7IAorCQkJdW5zaWduZWQgY2hhciB2YWx1ZSwgb2Zmc2V0OyAKKwkJfSBwcm9ncmFtX3NlcVtdID0geworCQkJCQkJLyogU2VsZWN0IHBhZ2UgMCAqLworCQkJe0U4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIEU4MzkwX0NNRH0sIAorCQkJezB4NDksCUVOMF9EQ0ZHfSwgIC8qIFNldCBXT1JELXdpZGUgKDB4NDkpIGFjY2Vzcy4gKi8KKwkJCXsweDAwLAlFTjBfUkNOVExPfSwgIC8qIENsZWFyIHRoZSBjb3VudCByZWdzLiAqLworCQkJezB4MDAsCUVOMF9SQ05USEl9LAorCQkJezB4MDAsCUVOMF9JTVJ9LCAgLyogTWFzayBjb21wbGV0aW9uIGlycS4gKi8KKwkJCXsweEZGLAlFTjBfSVNSfSwKKwkJCXtFODM5MF9SWE9GRiwgRU4wX1JYQ1J9LCAgLyogMHgyMCAgU2V0IHRvIG1vbml0b3IgKi8KKwkJCXtFODM5MF9UWE9GRiwgRU4wX1RYQ1J9LCAgLyogMHgwMiAgYW5kIGxvb3BiYWNrIG1vZGUuICovCisJCQl7MzIsCUVOMF9SQ05UTE99LAorCQkJezB4MDAsCUVOMF9SQ05USEl9LAorCQkJezB4MDAsCUVOMF9SU0FSTE99LCAgLyogRE1BIHN0YXJ0aW5nIGF0IDB4MDAwMC4gKi8KKwkJCXsweDAwLAlFTjBfUlNBUkhJfSwKKwkJCXtFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgRTgzOTBfQ01EfSwKKwkJfTsKKworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHByb2dyYW1fc2VxKS9zaXplb2YocHJvZ3JhbV9zZXFbMF0pOyBpKyspCisJCQlvdXRiX3AocHJvZ3JhbV9zZXFbaV0udmFsdWUsIGJhc2VfYWRkciArIAorCQkJCXByb2dyYW1fc2VxW2ldLm9mZnNldCk7CisKKwl9CisJZm9yKGkgPSAwOyBpIDwgNiAvKnNpemVvZihTQV9wcm9tKSovOyBpKz0xKSB7CisJCVNBX3Byb21baV0gPSBpbmIoYmFzZV9hZGRyICsgTkVfREFUQVBPUlQpOworCX0KKworCS8qIEkgZG9uJ3Qga25vdyB3aGV0aGVyIHRoZSBwcmV2aW91cyBzZXF1ZW5jZSBpbmNsdWRlcyB0aGUgZ2VuZXJhbAorICAgICAgICAgICBib2FyZCByZXNldCBwcm9jZWR1cmUsIHNvIGJldHRlciBkb24ndCBvbWl0IGl0IGFuZCBqdXN0IG92ZXJ3cml0ZQorICAgICAgICAgICB0aGUgZ2FyYmFnZSByZWFkIGZyb20gYSBERS0zMjAgd2l0aCBjb3JyZWN0IHN0dWZmLiAqLworCisJaWYgKG1jYV9yZWFkX3N0b3JlZF9wb3Moc2xvdCwgMCkgPT0gMHhlYSkgeworCQl1bnNpZ25lZCBpbnQgdjsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgCQkJdiA9IGRsaW5rX2dldF9lZXByb20oaSwgYmFzZV9hZGRyKTsKKwkJCVNBX3Byb21bKGkgPDwgMSkgICAgXSA9IHYgJiAweGZmOworCQkJU0FfcHJvbVsoaSA8PCAxKSArIDFdID0gKHYgPj4gOCkgJiAweGZmOworCQl9CisJfQorCisJc3RhcnRfcGFnZSA9IE5FU01fU1RBUlRfUEc7CisJc3RvcF9wYWdlID0gTkVTTV9TVE9QX1BHOworCisJZGV2LT5pcnE9aXJxOworCisJLyogU25hcmYgdGhlIGludGVycnVwdCBub3cuICBUaGVyZSdzIG5vIHBvaW50IGluIHdhaXRpbmcgc2luY2Ugd2UgY2Fubm90CisJICAgc2hhcmUgYW5kIHRoZSBib2FyZCB3aWxsIHVzdWFsbHkgYmUgZW5hYmxlZC4gKi8KKwlyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgZWlfaW50ZXJydXB0LCAwLCBEUlZfTkFNRSwgZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayAoIiB1bmFibGUgdG8gZ2V0IElSUSAlZCAoaXJxdmFsPSVkKS5cbiIsIAorCQkJCWRldi0+aXJxLCByZXR2YWwpOworCQlnb3RvIG91dDsKKwl9CisKKwlkZXYtPmJhc2VfYWRkciA9IGJhc2VfYWRkcjsKKworCWZvcihpID0gMDsgaSA8IEVUSEVSX0FERFJfTEVOOyBpKyspIHsKKwkJcHJpbnRrKCIgJTIuMngiLCBTQV9wcm9tW2ldKTsKKwkJZGV2LT5kZXZfYWRkcltpXSA9IFNBX3Byb21baV07CisJfQorCisJcHJpbnRrKCJcbiVzOiAlcyBmb3VuZCBhdCAlI3gsIHVzaW5nIElSUSAlZC5cbiIsCisJCQlkZXYtPm5hbWUsIG5hbWUsIGJhc2VfYWRkciwgZGV2LT5pcnEpOworCisJbWNhX3NldF9hZGFwdGVyX3Byb2NmbihzbG90LCAoTUNBX1Byb2NGbikgbmUyX3Byb2NpbmZvLCBkZXYpOworCisJZWlfc3RhdHVzLm5hbWUgPSBuYW1lOworCWVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gc3RhcnRfcGFnZTsKKwllaV9zdGF0dXMuc3RvcF9wYWdlID0gc3RvcF9wYWdlOworCWVpX3N0YXR1cy53b3JkMTYgPSAoMiA9PSAyKTsKKworCWVpX3N0YXR1cy5yeF9zdGFydF9wYWdlID0gc3RhcnRfcGFnZSArIFRYX1BBR0VTOworI2lmZGVmIFBBQ0tFVEJVRl9NRU1TSVpFCisJLyogQWxsb3cgdGhlIHBhY2tldCBidWZmZXIgc2l6ZSB0byBiZSBvdmVycmlkZGVuIGJ5IGtub3ctaXQtYWxscy4gKi8KKwllaV9zdGF0dXMuc3RvcF9wYWdlID0gZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgKyBQQUNLRVRCVUZfTUVNU0laRTsKKyNlbmRpZgorCisJZWlfc3RhdHVzLnJlc2V0XzgzOTAgPSAmbmVfcmVzZXRfODM5MDsKKwllaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmbmVfYmxvY2tfaW5wdXQ7CisJZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZuZV9ibG9ja19vdXRwdXQ7CisJZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZuZV9nZXRfODM5MF9oZHI7CisJCisJZWlfc3RhdHVzLnByaXYgPSBzbG90OworCQorCWRldi0+b3BlbiA9ICZuZV9vcGVuOworCWRldi0+c3RvcCA9ICZuZV9jbG9zZTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKKyNlbmRpZgorCU5TODM5MF9pbml0KGRldiwgMCk7CisJcmV0dXJuIDA7CitvdXQ6CisJcmVsZWFzZV9yZWdpb24oYmFzZV9hZGRyLCBORV9JT19FWFRFTlQpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgbmVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWVpX29wZW4oZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmIChlaV9kZWJ1ZyA+IDEpCisJCXByaW50aygiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKKwllaV9jbG9zZShkZXYpOworCXJldHVybiAwOworfQorCisvKiBIYXJkIHJlc2V0IHRoZSBjYXJkLiAgVGhpcyB1c2VkIHRvIHBhdXNlIGZvciB0aGUgc2FtZSBwZXJpb2QgdGhhdCBhCisgICA4MzkwIHJlc2V0IGNvbW1hbmQgcmVxdWlyZWQsIGJ1dCB0aGF0IHNob3VsZG4ndCBiZSBuZWNlc3NhcnkuICovCitzdGF0aWMgdm9pZCBuZV9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyByZXNldF9zdGFydF90aW1lID0gamlmZmllczsKKworCWlmIChlaV9kZWJ1ZyA+IDEpIAorCQlwcmludGsoInJlc2V0dGluZyB0aGUgODM5MCB0PSVsZC4uLiIsIGppZmZpZXMpOworCisJLyogRE9OJ1QgY2hhbmdlIHRoZXNlIHRvIGluYl9wL291dGJfcCBvciByZXNldCB3aWxsIGZhaWwgb24gY2xvbmVzLiAqLworCW91dGIoaW5iKE5FX0JBU0UgKyBORV9SRVNFVCksIE5FX0JBU0UgKyBORV9SRVNFVCk7CisKKwllaV9zdGF0dXMudHhpbmcgPSAwOworCWVpX3N0YXR1cy5kbWFpbmcgPSAwOworCisJLyogVGhpcyBjaGVjayBfc2hvdWxkX25vdF8gYmUgbmVjZXNzYXJ5LCBvbWl0IGV2ZW50dWFsbHkuICovCisJd2hpbGUgKChpbmJfcChORV9CQVNFK0VOMF9JU1IpICYgRU5JU1JfUkVTRVQpID09IDApCisJCWlmIChqaWZmaWVzIC0gcmVzZXRfc3RhcnRfdGltZSA+IDIqSFovMTAwKSB7CisJCQlwcmludGsoIiVzOiBuZV9yZXNldF84MzkwKCkgZGlkIG5vdCBjb21wbGV0ZS5cbiIsIAorCQkJCQlkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKwlvdXRiX3AoRU5JU1JfUkVTRVQsIE5FX0JBU0UgKyBFTjBfSVNSKTsJLyogQWNrIGludHIuICovCit9CisKKy8qIEdyYWIgdGhlIDgzOTAgc3BlY2lmaWMgaGVhZGVyLiBTaW1pbGFyIHRvIHRoZSBibG9ja19pbnB1dCByb3V0aW5lLCBidXQKKyAgIHdlIGRvbid0IG5lZWQgdG8gYmUgY29uY2VybmVkIHdpdGggcmluZyB3cmFwIGFzIHRoZSBoZWFkZXIgd2lsbCBiZSBhdAorICAgdGhlIHN0YXJ0IG9mIGEgcGFnZSwgc28gd2Ugb3B0aW1pemUgYWNjb3JkaW5nbHkuICovCisKK3N0YXRpYyB2b2lkIG5lX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCAKKwkJaW50IHJpbmdfcGFnZSkKK3sKKworCWludCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCisJLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIAorCSAgIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworCWlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJCXByaW50aygiJXM6IERNQWluZyBjb25mbGljdCBpbiBuZV9nZXRfODM5MF9oZHIgIgorCQkJCSJbRE1Bc3RhdDolZF1baXJxbG9jazolZF0uXG4iLAorCQkJCWRldi0+bmFtZSwgZWlfc3RhdHVzLmRtYWluZywgZWlfc3RhdHVzLmlycWxvY2spOworCQlyZXR1cm47CisJfQorCisJZWlfc3RhdHVzLmRtYWluZyB8PSAweDAxOworCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgbmljX2Jhc2UrIE5FX0NNRCk7CisJb3V0Yl9wKHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkciksIG5pY19iYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKDAsIG5pY19iYXNlICsgRU4wX1JDTlRISSk7CisJb3V0Yl9wKDAsIG5pY19iYXNlICsgRU4wX1JTQVJMTyk7CQkvKiBPbiBwYWdlIGJvdW5kYXJ5ICovCisJb3V0Yl9wKHJpbmdfcGFnZSwgbmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKwlvdXRiX3AoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIG5pY19iYXNlICsgTkVfQ01EKTsKKworCWlmIChlaV9zdGF0dXMud29yZDE2KQorCQlpbnN3KE5FX0JBU0UgKyBORV9EQVRBUE9SVCwgaGRyLCAKKwkJCQlzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpPj4xKTsKKwllbHNlCisJCWluc2IoTkVfQkFTRSArIE5FX0RBVEFQT1JULCBoZHIsIAorCQkJCXNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcikpOworCisJb3V0Yl9wKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBFTjBfSVNSKTsJLyogQWNrIGludHIuICovCisJZWlfc3RhdHVzLmRtYWluZyAmPSB+MHgwMTsKK30KKworLyogQmxvY2sgaW5wdXQgYW5kIG91dHB1dCwgc2ltaWxhciB0byB0aGUgQ3J5bndyIHBhY2tldCBkcml2ZXIuICBJZiB5b3UKKyAgIGFyZSBwb3J0aW5nIHRvIGEgbmV3IGV0aGVyY2FyZCwgbG9vayBhdCB0aGUgcGFja2V0IGRyaXZlciBzb3VyY2UgZm9yCisgICBoaW50cy4gVGhlIE5FeDAwMCBkb2Vzbid0IHNoYXJlIHRoZSBvbi1ib2FyZCBwYWNrZXQgbWVtb3J5IC0tIHlvdSBoYXZlCisgICB0byBwdXQgdGhlIHBhY2tldCBvdXQgdGhyb3VnaCB0aGUgInJlbW90ZSBETUEiIGRhdGFwb3J0IHVzaW5nIG91dGIuICovCisKK3N0YXRpYyB2b2lkIG5lX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgCisJCWludCByaW5nX29mZnNldCkKK3sKKyNpZmRlZiBORV9TQU5JVFlfQ0hFQ0sKKwlpbnQgeGZlcl9jb3VudCA9IGNvdW50OworI2VuZGlmCisJaW50IG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJY2hhciAqYnVmID0gc2tiLT5kYXRhOworCisJLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIAorCSAgIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworCWlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJCXByaW50aygiJXM6IERNQWluZyBjb25mbGljdCBpbiBuZV9ibG9ja19pbnB1dCAiCisJCQkJIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXS5cbiIsCisJCQkJZGV2LT5uYW1lLCBlaV9zdGF0dXMuZG1haW5nLCBlaV9zdGF0dXMuaXJxbG9jayk7CisJCXJldHVybjsKKwl9CisJZWlfc3RhdHVzLmRtYWluZyB8PSAweDAxOworCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgbmljX2Jhc2UrIE5FX0NNRCk7CisJb3V0Yl9wKGNvdW50ICYgMHhmZiwgbmljX2Jhc2UgKyBFTjBfUkNOVExPKTsKKwlvdXRiX3AoY291bnQgPj4gOCwgbmljX2Jhc2UgKyBFTjBfUkNOVEhJKTsKKwlvdXRiX3AocmluZ19vZmZzZXQgJiAweGZmLCBuaWNfYmFzZSArIEVOMF9SU0FSTE8pOworCW91dGJfcChyaW5nX29mZnNldCA+PiA4LCBuaWNfYmFzZSArIEVOMF9SU0FSSEkpOworCW91dGJfcChFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBORV9DTUQpOworCWlmIChlaV9zdGF0dXMud29yZDE2KSB7CisJCWluc3coTkVfQkFTRSArIE5FX0RBVEFQT1JULGJ1Zixjb3VudD4+MSk7CisJCWlmIChjb3VudCAmIDB4MDEpIHsKKwkJCWJ1Zltjb3VudC0xXSA9IGluYihORV9CQVNFICsgTkVfREFUQVBPUlQpOworI2lmZGVmIE5FX1NBTklUWV9DSEVDSworCQkJeGZlcl9jb3VudCsrOworI2VuZGlmCisJCX0KKwl9IGVsc2UgeworCQlpbnNiKE5FX0JBU0UgKyBORV9EQVRBUE9SVCwgYnVmLCBjb3VudCk7CisJfQorCisjaWZkZWYgTkVfU0FOSVRZX0NIRUNLCisJLyogVGhpcyB3YXMgZm9yIHRoZSBBTFBIQSB2ZXJzaW9uIG9ubHksIGJ1dCBlbm91Z2ggcGVvcGxlIGhhdmUKKwkgICBiZWVuIGVuY291bnRlcmluZyBwcm9ibGVtcyBzbyBpdCBpcyBzdGlsbCBoZXJlLiAgSWYgeW91IHNlZQorCSAgIHRoaXMgbWVzc2FnZSB5b3UgZWl0aGVyIDEpIGhhdmUgYSBzbGlnaHRseSBpbmNvbXBhdGlibGUgY2xvbmUKKwkgICBvciAyKSBoYXZlIG5vaXNlL3NwZWVkIHByb2JsZW1zIHdpdGggeW91ciBidXMuICovCisJaWYgKGVpX2RlYnVnID4gMSkgewkvKiBETUEgdGVybWluYXRpb24gYWRkcmVzcyBjaGVjay4uLiAqLworCQlpbnQgYWRkciwgdHJpZXMgPSAyMDsKKwkJZG8geworCQkJLyogRE9OJ1QgY2hlY2sgZm9yICdpbmJfcChFTjBfSVNSKSAmIEVOSVNSX1JEQycgaGVyZQorCQkJICAgLS0gaXQncyBicm9rZW4gZm9yIFJ4IG9uIHNvbWUgY2FyZHMhICovCisJCQlpbnQgaGlnaCA9IGluYl9wKG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisJCQlpbnQgbG93ID0gaW5iX3AobmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKwkJCWFkZHIgPSAoaGlnaCA8PCA4KSArIGxvdzsKKwkJCWlmICgoKHJpbmdfb2Zmc2V0ICsgeGZlcl9jb3VudCkgJiAweGZmKSA9PSBsb3cpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKC0tdHJpZXMgPiAwKTsKKwkJaWYgKHRyaWVzIDw9IDApCisJCQlwcmludGsoIiVzOiBSWCB0cmFuc2ZlciBhZGRyZXNzIG1pc21hdGNoLCIKKwkJCQkiJSM0LjR4IChleHBlY3RlZCkgdnMuICUjNC40eCAoYWN0dWFsKS5cbiIsCisJCQkJZGV2LT5uYW1lLCByaW5nX29mZnNldCArIHhmZXJfY291bnQsIGFkZHIpOworCX0KKyNlbmRpZgorCW91dGJfcChFTklTUl9SREMsIG5pY19iYXNlICsgRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworCWVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7Cit9CisKK3N0YXRpYyB2b2lkIG5lX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgY29uc3QgaW50IHN0YXJ0X3BhZ2UpCit7CisJaW50IG5pY19iYXNlID0gTkVfQkFTRTsKKwl1bnNpZ25lZCBsb25nIGRtYV9zdGFydDsKKyNpZmRlZiBORV9TQU5JVFlfQ0hFQ0sKKwlpbnQgcmV0cmllcyA9IDA7CisjZW5kaWYKKworCS8qIFJvdW5kIHRoZSBjb3VudCB1cCBmb3Igd29yZCB3cml0ZXMuIERvIHdlIG5lZWQgdG8gZG8gdGhpcz8KKwkgICBXaGF0IGVmZmVjdCB3aWxsIGFuIG9kZCBieXRlIGNvdW50IGhhdmUgb24gdGhlIDgzOTA/CisJICAgSSBzaG91bGQgY2hlY2sgc29tZWRheS4gKi8KKwlpZiAoZWlfc3RhdHVzLndvcmQxNiAmJiAoY291bnQgJiAweDAxKSkKKwkJY291bnQrKzsKKworCS8qIFRoaXMgKnNob3VsZG4ndCogaGFwcGVuLiAKKwkgICBJZiBpdCBkb2VzLCBpdCdzIHRoZSBsYXN0IHRoaW5nIHlvdSdsbCBzZWUgKi8KKwlpZiAoZWlfc3RhdHVzLmRtYWluZykgeworCQlwcmludGsoIiVzOiBETUFpbmcgY29uZmxpY3QgaW4gbmVfYmxvY2tfb3V0cHV0LiIKKwkJCQkiW0RNQXN0YXQ6JWRdW2lycWxvY2s6JWRdXG4iLAorCQkJCWRldi0+bmFtZSwgZWlfc3RhdHVzLmRtYWluZywgZWlfc3RhdHVzLmlycWxvY2spOworCQlyZXR1cm47CisJfQorCWVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKwkvKiBXZSBzaG91bGQgYWxyZWFkeSBiZSBpbiBwYWdlIDAsIGJ1dCB0byBiZSBzYWZlLi4uICovCisJb3V0Yl9wKEU4MzkwX1BBR0UwK0U4MzkwX1NUQVJUK0U4MzkwX05PRE1BLCBuaWNfYmFzZSArIE5FX0NNRCk7CisKKyNpZmRlZiBORV9TQU5JVFlfQ0hFQ0sKK3JldHJ5OgorI2VuZGlmCisKKyNpZmRlZiBORTgzOTBfUldfQlVHRklYCisJLyogSGFuZGxlIHRoZSByZWFkLWJlZm9yZS13cml0ZSBidWcgdGhlIHNhbWUgd2F5IGFzIHRoZQorCSAgIENyeW53ciBwYWNrZXQgZHJpdmVyIC0tIHRoZSBOYXRTZW1pIG1ldGhvZCBkb2Vzbid0IHdvcmsuCisJICAgQWN0dWFsbHkgdGhpcyBkb2Vzbid0IGFsd2F5cyB3b3JrIGVpdGhlciwgYnV0IGlmIHlvdSBoYXZlCisJICAgcHJvYmxlbXMgd2l0aCB5b3VyIE5FeDAwMCB0aGlzIGlzIGJldHRlciB0aGFuIG5vdGhpbmchICovCisJb3V0Yl9wKDB4NDIsIG5pY19iYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKDB4MDAsIG5pY19iYXNlICsgRU4wX1JDTlRISSk7CisJb3V0Yl9wKDB4NDIsIG5pY19iYXNlICsgRU4wX1JTQVJMTyk7CisJb3V0Yl9wKDB4MDAsIG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisJb3V0Yl9wKEU4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIE5FX0NNRCk7CisJLyogTWFrZSBjZXJ0YWluIHRoYXQgdGhlIGR1bW15IHJlYWQgaGFzIG9jY3VycmVkLiAqLworCVNMT1dfRE9XTl9JTzsKKwlTTE9XX0RPV05fSU87CisJU0xPV19ET1dOX0lPOworI2VuZGlmCisKKwlvdXRiX3AoRU5JU1JfUkRDLCBuaWNfYmFzZSArIEVOMF9JU1IpOworCisJLyogTm93IHRoZSBub3JtYWwgb3V0cHV0LiAqLworCW91dGJfcChjb3VudCAmIDB4ZmYsIG5pY19iYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKGNvdW50ID4+IDgsICAgbmljX2Jhc2UgKyBFTjBfUkNOVEhJKTsKKwlvdXRiX3AoMHgwMCwgbmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKwlvdXRiX3Aoc3RhcnRfcGFnZSwgbmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKworCW91dGJfcChFODM5MF9SV1JJVEUrRTgzOTBfU1RBUlQsIG5pY19iYXNlICsgTkVfQ01EKTsKKwlpZiAoZWlfc3RhdHVzLndvcmQxNikgeworCQlvdXRzdyhORV9CQVNFICsgTkVfREFUQVBPUlQsIGJ1ZiwgY291bnQ+PjEpOworCX0gZWxzZSB7CisJCW91dHNiKE5FX0JBU0UgKyBORV9EQVRBUE9SVCwgYnVmLCBjb3VudCk7CisJfQorCisJZG1hX3N0YXJ0ID0gamlmZmllczsKKworI2lmZGVmIE5FX1NBTklUWV9DSEVDSworCS8qIFRoaXMgd2FzIGZvciB0aGUgQUxQSEEgdmVyc2lvbiBvbmx5LCBidXQgZW5vdWdoIHBlb3BsZSBoYXZlCisJICAgYmVlbiBlbmNvdW50ZXJpbmcgcHJvYmxlbXMgc28gaXQgaXMgc3RpbGwgaGVyZS4gKi8KKworCWlmIChlaV9kZWJ1ZyA+IDEpIHsJCS8qIERNQSB0ZXJtaW5hdGlvbiBhZGRyZXNzIGNoZWNrLi4uICovCisJCWludCBhZGRyLCB0cmllcyA9IDIwOworCQlkbyB7CisJCQlpbnQgaGlnaCA9IGluYl9wKG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisJCQlpbnQgbG93ID0gaW5iX3AobmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKwkJCWFkZHIgPSAoaGlnaCA8PCA4KSArIGxvdzsKKwkJCWlmICgoc3RhcnRfcGFnZSA8PCA4KSArIGNvdW50ID09IGFkZHIpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKC0tdHJpZXMgPiAwKTsKKwkJaWYgKHRyaWVzIDw9IDApIHsKKwkJCXByaW50aygiJXM6IFR4IHBhY2tldCB0cmFuc2ZlciBhZGRyZXNzIG1pc21hdGNoLCIKKwkJCQkJIiUjNC40eCAoZXhwZWN0ZWQpIHZzLiAlIzQuNHggKGFjdHVhbCkuXG4iLAorCQkJCQlkZXYtPm5hbWUsIChzdGFydF9wYWdlIDw8IDgpICsgY291bnQsIGFkZHIpOworCQkJaWYgKHJldHJpZXMrKyA9PSAwKQorCQkJCWdvdG8gcmV0cnk7CisJCX0KKwl9CisjZW5kaWYKKworCXdoaWxlICgoaW5iX3AobmljX2Jhc2UgKyBFTjBfSVNSKSAmIEVOSVNSX1JEQykgPT0gMCkKKwkJaWYgKGppZmZpZXMgLSBkbWFfc3RhcnQgPiAyKkhaLzEwMCkgewkJLyogMjBtcyAqLworCQkJcHJpbnRrKCIlczogdGltZW91dCB3YWl0aW5nIGZvciBUeCBSREMuXG4iLCBkZXYtPm5hbWUpOworCQkJbmVfcmVzZXRfODM5MChkZXYpOworCQkJTlM4MzkwX2luaXQoZGV2LDEpOworCQkJYnJlYWs7CisJCX0KKworCW91dGJfcChFTklTUl9SREMsIG5pY19iYXNlICsgRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworCWVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7CisJcmV0dXJuOworfQorCisKKyNpZmRlZiBNT0RVTEUKKyNkZWZpbmUgTUFYX05FX0NBUkRTCTQJLyogTWF4IG51bWJlciBvZiBORSBjYXJkcyBwZXIgbW9kdWxlICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9uZVtNQVhfTkVfQ0FSRFNdOworc3RhdGljIGludCBpb1tNQVhfTkVfQ0FSRFNdOworc3RhdGljIGludCBpcnFbTUFYX05FX0NBUkRTXTsKK3N0YXRpYyBpbnQgYmFkW01BWF9ORV9DQVJEU107CS8qIDB4YmFkID0gYmFkIHNpZyBvciBubyByZXNldCBhY2sgKi8KK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShiYWQsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiKGlnbm9yZWQpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIihpZ25vcmVkKSIpOworTU9EVUxFX1BBUk1fREVTQyhiYWQsICIoaWdub3JlZCkiKTsKKworLyogTW9kdWxlIGNvZGUgZml4ZWQgYnkgRGF2aWQgV2VpbmVoYWxsICovCisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IHRoaXNfZGV2LCBmb3VuZCA9IDA7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfTkVfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CisJCWRldi0+aXJxID0gaXJxW3RoaXNfZGV2XTsKKwkJZGV2LT5tZW1fZW5kID0gYmFkW3RoaXNfZGV2XTsKKwkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07CisJCWlmIChkb19uZTJfcHJvYmUoZGV2KSA9PSAwKSB7CisJCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgeworCQkJCWRldl9uZVtmb3VuZCsrXSA9IGRldjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQl9CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCWJyZWFrOworCX0KKwlpZiAoZm91bmQpCisJCXJldHVybiAwOworCXByaW50ayhLRVJOX1dBUk5JTkcgIm5lMi5jOiBObyBORS8yIGNhcmQgZm91bmRcbiIpOworCXJldHVybiAtRU5YSU87Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgdGhpc19kZXY7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfTkVfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9uZVt0aGlzX2Rldl07CisJCWlmIChkZXYpIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZTJrLXBjaS5jIGIvZHJpdmVycy9uZXQvbmUyay1wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWE2YzA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbmUyay1wY2kuYwpAQCAtMCwwICsxLDcxMiBAQAorLyogbmUyay1wY2kuYzogQSBORTIwMDAgY2xvbmUgb24gUENJIGJ1cyBkcml2ZXIgZm9yIExpbnV4LiAqLworLyoKKwlBIExpbnV4IGRldmljZSBkcml2ZXIgZm9yIFBDSSBORTIwMDAgY2xvbmVzLgorCisJQXV0aG9ycyBhbmQgb3RoZXIgY29weXJpZ2h0IGhvbGRlcnM6CisJMTk5Mi0yMDAwIGJ5IERvbmFsZCBCZWNrZXIsIE5FMjAwMCBjb3JlIGFuZCB2YXJpb3VzIG1vZGlmaWNhdGlvbnMuCisJMTk5NS0xOTk4IGJ5IFBhdWwgR29ydG1ha2VyLCBjb3JlIG1vZGlmaWNhdGlvbnMgYW5kIFBDSSBzdXBwb3J0LgorCUNvcHlyaWdodCAxOTkzIGFzc2lnbmVkIHRvIHRoZSBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQKKwlieSB0aGUgRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKwl0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCURyaXZlcnMgYmFzZWQgb24gb3IgZGVyaXZlZCBmcm9tIHRoaXMgY29kZSBmYWxsIHVuZGVyIHRoZSBHUEwgYW5kIG11c3QKKwlyZXRhaW4gdGhlIGF1dGhvcnNoaXAsIGNvcHlyaWdodCBhbmQgbGljZW5zZSBub3RpY2UuICBUaGlzIGZpbGUgaXMgbm90CisJYSBjb21wbGV0ZSBwcm9ncmFtIGFuZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdGhlIGVudGlyZSBvcGVyYXRpbmcKKwlzeXN0ZW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4KKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisJNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKwlBbm5hcG9saXMgTUQgMjE0MDMKKworCUlzc3VlcyByZW1haW5pbmc6CisJUGVvcGxlIGFyZSBtYWtpbmcgUENJIG5lMjAwMCBjbG9uZXMhIE9oIHRoZSBob3Jyb3IsIHRoZSBob3Jyb3IuLi4KKwlMaW1pdGVkIGZ1bGwtZHVwbGV4IHN1cHBvcnQuCisqLworCisjZGVmaW5lIERSVl9OQU1FCSJuZTJrLXBjaSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMDMiCisjZGVmaW5lIERSVl9SRUxEQVRFCSI5LzIyLzIwMDMiCisKKworLyogVGhlIHVzZXItY29uZmlndXJhYmxlIHZhbHVlcy4KKyAgIFRoZXNlIG1heSBiZSBtb2RpZmllZCB3aGVuIGEgZHJpdmVyIG1vZHVsZSBpcyBsb2FkZWQuKi8KKworc3RhdGljIGludCBkZWJ1ZyA9IDE7CQkJLyogMSBub3JtYWwgbWVzc2FnZXMsIDAgcXVpZXQgLi4gNyB2ZXJib3NlLiAqLworCisjZGVmaW5lIE1BWF9VTklUUyA4CQkJCS8qIE1vcmUgYXJlIHN1cHBvcnRlZCwgbGltaXQgb25seSBvbiBvcHRpb25zICovCisvKiBVc2VkIHRvIHBhc3MgdGhlIGZ1bGwtZHVwbGV4IGZsYWcsIGV0Yy4gKi8KK3N0YXRpYyBpbnQgZnVsbF9kdXBsZXhbTUFYX1VOSVRTXTsKK3N0YXRpYyBpbnQgb3B0aW9uc1tNQVhfVU5JVFNdOworCisvKiBGb3JjZSBhIG5vbiBzdGQuIGFtb3VudCBvZiBtZW1vcnkuICBVbml0cyBhcmUgMjU2IGJ5dGUgcGFnZXMuICovCisvKiAjZGVmaW5lIFBBQ0tFVEJVRl9NRU1TSVpFCTB4NDAgKi8KKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICI4MzkwLmgiCisKKy8qIFRoZXNlIGlkZW50aWZ5IHRoZSBkcml2ZXIgYmFzZSB2ZXJzaW9uIGFuZCBtYXkgbm90IGJlIHJlbW92ZWQuICovCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CitLRVJOX0lORk8gRFJWX05BTUUgIi5jOnYiIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURSAiIEQuIEJlY2tlci9QLiBHb3J0bWFrZXJcbiIKK0tFUk5fSU5GTyAiICBodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL25lMmstcGNpLmh0bWxcbiI7CisKKyNpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQorI2RlZmluZSBpbmxfbGUoYWRkcikgIGxlMzJfdG9fY3B1KGlubChhZGRyKSkKKyNkZWZpbmUgaW53X2xlKGFkZHIpICBsZTE2X3RvX2NwdShpbncoYWRkcikpCisjZW5kaWYKKworI2RlZmluZSBQRlggRFJWX05BTUUgIjogIgorCitNT0RVTEVfQVVUSE9SKCJEb25hbGQgQmVja2VyIC8gUGF1bCBHb3J0bWFrZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENJIE5FMjAwMCBjbG9uZSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG9wdGlvbnMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZnVsbF9kdXBsZXgsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZGVidWcgbGV2ZWwgKDEtMikiKTsKK01PRFVMRV9QQVJNX0RFU0Mob3B0aW9ucywgIkJpdCA1OiBmdWxsIGR1cGxleCIpOworTU9EVUxFX1BBUk1fREVTQyhmdWxsX2R1cGxleCwgImZ1bGwgZHVwbGV4IHNldHRpbmcocykgKDEpIik7CisKKy8qIFNvbWUgZGVmaW5lcyB0aGF0IHBlb3BsZSBjYW4gcGxheSB3aXRoIGlmIHNvIGluY2xpbmVkLiAqLworCisvKiBVc2UgMzIgYml0IGRhdGEtbW92ZW1lbnQgb3BlcmF0aW9ucyBpbnN0ZWFkIG9mIDE2IGJpdC4gKi8KKyNkZWZpbmUgVVNFX0xPTkdJTworCisvKiBEbyB3ZSBpbXBsZW1lbnQgdGhlIHJlYWQgYmVmb3JlIHdyaXRlIGJ1Z2ZpeCA/ICovCisvKiAjZGVmaW5lIE5FX1JXX0JVR0ZJWCAqLworCisvKiBGbGFncy4gIFdlIHJlbmFtZSBhbiBleGlzdGluZyBlaV9zdGF0dXMgZmllbGQgdG8gc3RvcmUgZmxhZ3MhICovCisvKiBUaHVzIG9ubHkgdGhlIGxvdyA4IGJpdHMgYXJlIHVzYWJsZSBmb3Igbm9uLWluaXQtdGltZSBmbGFncy4gKi8KKyNkZWZpbmUgbmUya19mbGFncyByZWcwCitlbnVtIHsKKwlPTkxZXzE2QklUX0lPPTgsIE9OTFlfMzJCSVRfSU89NCwJLyogQ2hpcCBjYW4gZG8gb25seSAxNi8zMi1iaXQgeGZlcnMuICovCisJRk9SQ0VfRkRYPTB4MjAsCQkJCQkJLyogVXNlciBvdmVycmlkZS4gKi8KKwlSRUFMVEVLX0ZEWD0weDQwLCBIT0xURUtfRkRYPTB4ODAsCisJU1RPUF9QR18weDYwPTB4MTAwLAorfTsKKworZW51bSBuZTJrX3BjaV9jaGlwc2V0cyB7CisJQ0hfUmVhbFRla19SVExfODAyOSA9IDAsCisJQ0hfV2luYm9uZF84OUM5NDAsCisJQ0hfQ29tcGV4X1JMMjAwMCwKKwlDSF9LVElfRVQzMlAyLAorCUNIX05ldFZpbl9OVjUwMDBTQywKKwlDSF9WaWFfODZDOTI2LAorCUNIX1N1cmVDb21fTkUzNCwKKwlDSF9XaW5ib25kX1c4OUM5NDBGLAorCUNIX0hvbHRla19IVDgwMjMyLAorCUNIX0hvbHRla19IVDgwMjI5LAorCUNIX1dpbmJvbmRfODlDOTQwXzhjNGEsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgeworCWNoYXIgKm5hbWU7CisJaW50IGZsYWdzOworfSBwY2lfY2xvbmVfbGlzdFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyJSZWFsVGVrIFJUTC04MDI5IiwgUkVBTFRFS19GRFh9LAorCXsiV2luYm9uZCA4OUM5NDAiLCAwfSwKKwl7IkNvbXBleCBSTDIwMDAiLCAwfSwKKwl7IktUSSBFVDMyUDIiLCAwfSwKKwl7Ik5ldFZpbiBOVjUwMDBTQyIsIDB9LAorCXsiVmlhIDg2QzkyNiIsIE9OTFlfMTZCSVRfSU99LAorCXsiU3VyZUNvbSBORTM0IiwgMH0sCisJeyJXaW5ib25kIFc4OUM5NDBGIiwgMH0sCisJeyJIb2x0ZWsgSFQ4MDIzMiIsIE9OTFlfMTZCSVRfSU8gfCBIT0xURUtfRkRYfSwKKwl7IkhvbHRlayBIVDgwMjI5IiwgT05MWV8zMkJJVF9JTyB8IEhPTFRFS19GRFggfCBTVE9QX1BHXzB4NjAgfSwKKwl7IldpbmJvbmQgVzg5Qzk0MChtaXNwcm9ncmFtbWVkKSIsIDB9LAorCXtOVUxMLH0KK307CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG5lMmtfcGNpX3RibFtdID0geworCXsgMHgxMGVjLCAweDgwMjksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIX1JlYWxUZWtfUlRMXzgwMjkgfSwKKwl7IDB4MTA1MCwgMHgwOTQwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF9XaW5ib25kXzg5Qzk0MCB9LAorCXsgMHgxMWY2LCAweDE0MDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIX0NvbXBleF9STDIwMDAgfSwKKwl7IDB4OGUyZSwgMHgzMDAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF9LVElfRVQzMlAyIH0sCisJeyAweDRhMTQsIDB4NTAwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfTmV0VmluX05WNTAwMFNDIH0sCisJeyAweDExMDYsIDB4MDkyNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfVmlhXzg2QzkyNiB9LAorCXsgMHgxMGJkLCAweDBlMzQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIX1N1cmVDb21fTkUzNCB9LAorCXsgMHgxMDUwLCAweDVhNWEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIX1dpbmJvbmRfVzg5Qzk0MEYgfSwKKwl7IDB4MTJjMywgMHgwMDU4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSF9Ib2x0ZWtfSFQ4MDIzMiB9LAorCXsgMHgxMmMzLCAweDU1OTgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIX0hvbHRla19IVDgwMjI5IH0sCisJeyAweDhjNGEsIDB4MTk4MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfV2luYm9uZF84OUM5NDBfOGM0YSB9LAorCXsgMCwgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBuZTJrX3BjaV90YmwpOworCisKKy8qIC0tLS0gTm8gdXNlci1zZXJ2aWNlYWJsZSBwYXJ0cyBiZWxvdyAtLS0tICovCisKKyNkZWZpbmUgTkVfQkFTRQkgKGRldi0+YmFzZV9hZGRyKQorI2RlZmluZSBORV9DTUQJIAkweDAwCisjZGVmaW5lIE5FX0RBVEFQT1JUCTB4MTAJLyogTmF0U2VtaS1kZWZpbmVkIHBvcnQgd2luZG93IG9mZnNldC4gKi8KKyNkZWZpbmUgTkVfUkVTRVQJMHgxZgkvKiBJc3N1ZSBhIHJlYWQgdG8gcmVzZXQsIGEgd3JpdGUgdG8gY2xlYXIuICovCisjZGVmaW5lIE5FX0lPX0VYVEVOVAkweDIwCisKKyNkZWZpbmUgTkVTTV9TVEFSVF9QRwkweDQwCS8qIEZpcnN0IHBhZ2Ugb2YgVFggYnVmZmVyICovCisjZGVmaW5lIE5FU01fU1RPUF9QRwkweDgwCS8qIExhc3QgcGFnZSArMSBvZiBSWCByaW5nICovCisKKworc3RhdGljIGludCBuZTJrX3BjaV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBuZTJrX3BjaV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHZvaWQgbmUya19wY2lfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG5lMmtfcGNpX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLAorCQkJICBpbnQgcmluZ19wYWdlKTsKK3N0YXRpYyB2b2lkIG5lMmtfcGNpX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIG5lMmtfcGNpX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBpbnQgY291bnQsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgY29uc3QgaW50IHN0YXJ0X3BhZ2UpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZTJrX3BjaV9ldGh0b29sX29wczsKKworDAorCisvKiBUaGVyZSBpcyBubyByb29tIGluIHRoZSBzdGFuZGFyZCA4MzkwIHN0cnVjdHVyZSBmb3IgZXh0cmEgaW5mbyB3ZSBuZWVkLAorICAgc28gd2UgYnVpbGQgYSBtZXRhL291dGVyLXdyYXBwZXIgc3RydWN0dXJlLi4gKi8KK3N0cnVjdCBuZTJrX3BjaV9jYXJkIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworfTsKKworCisKKy8qCisgIE5FeDAwMC1jbG9uZSBib2FyZHMgaGF2ZSBhIFN0YXRpb24gQWRkcmVzcyAoU0EpIFBST00gKFNBUFJPTSkgaW4gdGhlIHBhY2tldAorICBidWZmZXIgbWVtb3J5IHNwYWNlLiAgQnktdGhlLXNwZWMgTkUyMDAwIGNsb25lcyBoYXZlIDB4NTcsMHg1NyBpbiBieXRlcworICAweDBlLDB4MGYgb2YgdGhlIFNBUFJPTSwgd2hpbGUgb3RoZXIgc3VwcG9zZWQgTkUyMDAwIGNsb25lcyBtdXN0IGJlCisgIGRldGVjdGVkIGJ5IHRoZWlyIFNBIHByZWZpeC4KKworICBSZWFkaW5nIHRoZSBTQVBST00gZnJvbSBhIHdvcmQtd2lkZSBjYXJkIHdpdGggdGhlIDgzOTAgc2V0IGluIGJ5dGUtd2lkZQorICBtb2RlIHJlc3VsdHMgaW4gZG91YmxlZCB2YWx1ZXMsIHdoaWNoIGNhbiBiZSBkZXRlY3RlZCBhbmQgY29tcGVuc2F0ZWQgZm9yLgorCisgIFRoZSBwcm9iZSBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBpbml0aWFsaXppbmcgdGhlIGNhcmQgYW5kIGZpbGxpbmcKKyAgaW4gdGhlICdkZXYnIGFuZCAnZWlfc3RhdHVzJyBzdHJ1Y3R1cmVzLgorKi8KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBuZTJrX3BjaV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciBTQV9wcm9tWzMyXTsKKwlpbnQgc3RhcnRfcGFnZSwgc3RvcF9wYWdlOworCWludCBpcnEsIHJlZzAsIGNoaXBfaWR4ID0gZW50LT5kcml2ZXJfZGF0YTsKKwlzdGF0aWMgdW5zaWduZWQgaW50IGZuZF9jbnQ7CisJbG9uZyBpb2FkZHI7CisJaW50IGZsYWdzID0gcGNpX2Nsb25lX2xpc3RbY2hpcF9pZHhdLmZsYWdzOworCisvKiB3aGVuIGJ1aWx0IGludG8gdGhlIGtlcm5lbCwgd2Ugb25seSBwcmludCB2ZXJzaW9uIGlmIGRldmljZSBpcyBmb3VuZCAqLworI2lmbmRlZiBNT0RVTEUKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKworCWZuZF9jbnQrKzsKKworCWkgPSBwY2lfZW5hYmxlX2RldmljZSAocGRldik7CisJaWYgKGkpCisJCXJldHVybiBpOworCisJaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAwKTsKKwlpcnEgPSBwZGV2LT5pcnE7CisKKwlpZiAoIWlvYWRkciB8fCAoKHBjaV9yZXNvdXJjZV9mbGFncyAocGRldiwgMCkgJiBJT1JFU09VUkNFX0lPKSA9PSAwKSkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAibm8gSS9PIHJlc291cmNlIGF0IFBDSSBCQVIgIzBcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAocmVxdWVzdF9yZWdpb24gKGlvYWRkciwgTkVfSU9fRVhURU5ULCBEUlZfTkFNRSkgPT0gTlVMTCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiSS9PIHJlc291cmNlIDB4JXggQCAweCVseCBidXN5XG4iLAorCQkJTkVfSU9fRVhURU5ULCBpb2FkZHIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJlZzAgPSBpbmIoaW9hZGRyKTsKKwlpZiAocmVnMCA9PSAweEZGKQorCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisKKwkvKiBEbyBhIHByZWxpbWluYXJ5IHZlcmlmaWNhdGlvbiB0aGF0IHdlIGhhdmUgYSA4MzkwLiAqLworCXsKKwkJaW50IHJlZ2Q7CisJCW91dGIoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTErRTgzOTBfU1RPUCwgaW9hZGRyICsgRTgzOTBfQ01EKTsKKwkJcmVnZCA9IGluYihpb2FkZHIgKyAweDBkKTsKKwkJb3V0YigweGZmLCBpb2FkZHIgKyAweDBkKTsKKwkJb3V0YihFODM5MF9OT0RNQStFODM5MF9QQUdFMCwgaW9hZGRyICsgRTgzOTBfQ01EKTsKKwkJaW5iKGlvYWRkciArIEVOMF9DT1VOVEVSMCk7IC8qIENsZWFyIHRoZSBjb3VudGVyIGJ5IHJlYWRpbmcuICovCisJCWlmIChpbmIoaW9hZGRyICsgRU4wX0NPVU5URVIwKSAhPSAwKSB7CisJCQlvdXRiKHJlZzAsIGlvYWRkcik7CisJCQlvdXRiKHJlZ2QsIGlvYWRkciArIDB4MGQpOwkvKiBSZXN0b3JlIHRoZSBvbGQgdmFsdWVzLiAqLworCQkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCQl9CisJfQorCisJLyogQWxsb2NhdGUgbmV0X2RldmljZSwgZGV2LT5wcml2OyBmaWxsIGluIDgzOTAgc3BlY2lmaWMgZGV2IGZpZWxkcy4gKi8KKwlkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKwlpZiAoIWRldikgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY2Fubm90IGFsbG9jYXRlIGV0aGVybmV0IGRldmljZVxuIik7CisJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKKwl9CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwkvKiBSZXNldCBjYXJkLiBXaG8ga25vd3Mgd2hhdCBkYWluLWJyYW1hZ2VkIHN0YXRlIGl0IHdhcyBsZWZ0IGluLiAqLworCXsKKwkJdW5zaWduZWQgbG9uZyByZXNldF9zdGFydF90aW1lID0gamlmZmllczsKKworCQlvdXRiKGluYihpb2FkZHIgKyBORV9SRVNFVCksIGlvYWRkciArIE5FX1JFU0VUKTsKKworCQkvKiBUaGlzIGxvb2tzIGxpa2UgYSBob3JyaWJsZSB0aW1pbmcgbG9vcCwgYnV0IGl0IHNob3VsZCBuZXZlciB0YWtlCisJCSAgIG1vcmUgdGhhbiBhIGZldyBjeWNsZXMuCisJCSovCisJCXdoaWxlICgoaW5iKGlvYWRkciArIEVOMF9JU1IpICYgRU5JU1JfUkVTRVQpID09IDApCisJCQkvKiBMaW1pdCB3YWl0OiAnMicgYXZvaWRzIGppZmZ5IHJvbGwtb3Zlci4gKi8KKwkJCWlmIChqaWZmaWVzIC0gcmVzZXRfc3RhcnRfdGltZSA+IDIpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYXJkIGZhaWx1cmUgKG5vIHJlc2V0IGFjaykuXG4iKTsKKwkJCQlnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7CisJCQl9CisKKwkJb3V0YigweGZmLCBpb2FkZHIgKyBFTjBfSVNSKTsJCS8qIEFjayBhbGwgaW50ci4gKi8KKwl9CisKKwkvKiBSZWFkIHRoZSAxNiBieXRlcyBvZiBzdGF0aW9uIGFkZHJlc3MgUFJPTS4KKwkgICBXZSBtdXN0IGZpcnN0IGluaXRpYWxpemUgcmVnaXN0ZXJzLCBzaW1pbGFyIHRvIE5TODM5MF9pbml0KGVpZmRldiwgMCkuCisJICAgV2UgY2FuJ3QgcmVsaWFibHkgcmVhZCB0aGUgU0FQUk9NIGFkZHJlc3Mgd2l0aG91dCB0aGlzLgorCSAgIChJIGxlYXJuZWQgdGhlIGhhcmQgd2F5ISkuICovCisJeworCQlzdHJ1Y3Qge3Vuc2lnbmVkIGNoYXIgdmFsdWUsIG9mZnNldDsgfSBwcm9ncmFtX3NlcVtdID0geworCQkJe0U4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIEU4MzkwX0NNRH0sIC8qIFNlbGVjdCBwYWdlIDAqLworCQkJezB4NDksCUVOMF9EQ0ZHfSwJLyogU2V0IHdvcmQtd2lkZSBhY2Nlc3MuICovCisJCQl7MHgwMCwJRU4wX1JDTlRMT30sCS8qIENsZWFyIHRoZSBjb3VudCByZWdzLiAqLworCQkJezB4MDAsCUVOMF9SQ05USEl9LAorCQkJezB4MDAsCUVOMF9JTVJ9LAkvKiBNYXNrIGNvbXBsZXRpb24gaXJxLiAqLworCQkJezB4RkYsCUVOMF9JU1J9LAorCQkJe0U4MzkwX1JYT0ZGLCBFTjBfUlhDUn0sCS8qIDB4MjAgIFNldCB0byBtb25pdG9yICovCisJCQl7RTgzOTBfVFhPRkYsIEVOMF9UWENSfSwJLyogMHgwMiAgYW5kIGxvb3BiYWNrIG1vZGUuICovCisJCQl7MzIsCUVOMF9SQ05UTE99LAorCQkJezB4MDAsCUVOMF9SQ05USEl9LAorCQkJezB4MDAsCUVOMF9SU0FSTE99LAkvKiBETUEgc3RhcnRpbmcgYXQgMHgwMDAwLiAqLworCQkJezB4MDAsCUVOMF9SU0FSSEl9LAorCQkJe0U4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBFODM5MF9DTUR9LAorCQl9OworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHByb2dyYW1fc2VxKS9zaXplb2YocHJvZ3JhbV9zZXFbMF0pOyBpKyspCisJCQlvdXRiKHByb2dyYW1fc2VxW2ldLnZhbHVlLCBpb2FkZHIgKyBwcm9ncmFtX3NlcVtpXS5vZmZzZXQpOworCisJfQorCisJLyogTm90ZTogYWxsIFBDSSBjYXJkcyBoYXZlIGF0IGxlYXN0IDE2IGJpdCBhY2Nlc3MsIHNvIHdlIGRvbid0IGhhdmUKKwkgICB0byBjaGVjayBmb3IgOCBiaXQgY2FyZHMuICBNb3N0IGNhcmRzIHBlcm1pdCAzMiBiaXQgYWNjZXNzLiAqLworCWlmIChmbGFncyAmIE9OTFlfMzJCSVRfSU8pIHsKKwkJZm9yIChpID0gMDsgaSA8IDQgOyBpKyspCisJCQkoKHUzMiAqKVNBX3Byb20pW2ldID0gbGUzMl90b19jcHUoaW5sKGlvYWRkciArIE5FX0RBVEFQT1JUKSk7CisJfSBlbHNlCisJCWZvcihpID0gMDsgaSA8IDMyIC8qc2l6ZW9mKFNBX3Byb20pKi87IGkrKykKKwkJCVNBX3Byb21baV0gPSBpbmIoaW9hZGRyICsgTkVfREFUQVBPUlQpOworCisJLyogV2UgYWx3YXlzIHNldCB0aGUgODM5MCByZWdpc3RlcnMgZm9yIHdvcmQgbW9kZS4gKi8KKwlvdXRiKDB4NDksIGlvYWRkciArIEVOMF9EQ0ZHKTsKKwlzdGFydF9wYWdlID0gTkVTTV9TVEFSVF9QRzsKKworCXN0b3BfcGFnZSA9IGZsYWdzICYgU1RPUF9QR18weDYwID8gMHg2MCA6IE5FU01fU1RPUF9QRzsKKworCS8qIFNldCB1cCB0aGUgcmVzdCBvZiB0aGUgcGFyYW1ldGVycy4gKi8KKwlkZXYtPmlycSA9IGlycTsKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCWVpX3N0YXR1cy5uYW1lID0gcGNpX2Nsb25lX2xpc3RbY2hpcF9pZHhdLm5hbWU7CisJZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBzdGFydF9wYWdlOworCWVpX3N0YXR1cy5zdG9wX3BhZ2UgPSBzdG9wX3BhZ2U7CisJZWlfc3RhdHVzLndvcmQxNiA9IDE7CisJZWlfc3RhdHVzLm5lMmtfZmxhZ3MgPSBmbGFnczsKKwlpZiAoZm5kX2NudCA8IE1BWF9VTklUUykgeworCQlpZiAoZnVsbF9kdXBsZXhbZm5kX2NudF0gPiAwICB8fCAgKG9wdGlvbnNbZm5kX2NudF0gJiBGT1JDRV9GRFgpKQorCQkJZWlfc3RhdHVzLm5lMmtfZmxhZ3MgfD0gRk9SQ0VfRkRYOworCX0KKworCWVpX3N0YXR1cy5yeF9zdGFydF9wYWdlID0gc3RhcnRfcGFnZSArIFRYX1BBR0VTOworI2lmZGVmIFBBQ0tFVEJVRl9NRU1TSVpFCisJLyogQWxsb3cgdGhlIHBhY2tldCBidWZmZXIgc2l6ZSB0byBiZSBvdmVycmlkZGVuIGJ5IGtub3ctaXQtYWxscy4gKi8KKwllaV9zdGF0dXMuc3RvcF9wYWdlID0gZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgKyBQQUNLRVRCVUZfTUVNU0laRTsKKyNlbmRpZgorCisJZWlfc3RhdHVzLnJlc2V0XzgzOTAgPSAmbmUya19wY2lfcmVzZXRfODM5MDsKKwllaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmbmUya19wY2lfYmxvY2tfaW5wdXQ7CisJZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZuZTJrX3BjaV9ibG9ja19vdXRwdXQ7CisJZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZuZTJrX3BjaV9nZXRfODM5MF9oZHI7CisJZWlfc3RhdHVzLnByaXYgPSAodW5zaWduZWQgbG9uZykgcGRldjsKKwlkZXYtPm9wZW4gPSAmbmUya19wY2lfb3BlbjsKKwlkZXYtPnN0b3AgPSAmbmUya19wY2lfY2xvc2U7CisJZGV2LT5ldGh0b29sX29wcyA9ICZuZTJrX3BjaV9ldGh0b29sX29wczsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKKyNlbmRpZgorCU5TODM5MF9pbml0KGRldiwgMCk7CisKKwlpID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGkpCisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKworCXByaW50aygiJXM6ICVzIGZvdW5kIGF0ICUjbHgsIElSUSAlZCwgIiwKKwkJICAgZGV2LT5uYW1lLCBwY2lfY2xvbmVfbGlzdFtjaGlwX2lkeF0ubmFtZSwgaW9hZGRyLCBkZXYtPmlycSk7CisJZm9yKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCXByaW50aygiJTIuMlglcyIsIFNBX3Byb21baV0sIGkgPT0gNSA/ICIuXG4iOiAiOiIpOworCQlkZXYtPmRldl9hZGRyW2ldID0gU0FfcHJvbVtpXTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9mcmVlX25ldGRldjoKKwlmcmVlX25ldGRldiAoZGV2KTsKK2Vycl9vdXRfZnJlZV9yZXM6CisJcmVsZWFzZV9yZWdpb24gKGlvYWRkciwgTkVfSU9fRVhURU5UKTsKKwlwY2lfc2V0X2RydmRhdGEgKHBkZXYsIE5VTEwpOworCXJldHVybiAtRU5PREVWOworCit9CisKKy8qIAorICogTWFnaWMgaW5jYW50YXRpb24gc2VxdWVuY2UgZm9yIGZ1bGwgZHVwbGV4IG9uIHRoZSBzdXBwb3J0ZWQgY2FyZHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNldF9yZWFsdGVrX2ZkeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlvdXRiKDB4QzAgKyBFODM5MF9OT0RNQSwgaW9hZGRyICsgTkVfQ01EKTsgLyogUGFnZSAzICovCisJb3V0YigweEMwLCBpb2FkZHIgKyAweDAxKTsgLyogRW5hYmxlIHdyaXRlcyB0byBDT05GSUczICovCisJb3V0YigweDQwLCBpb2FkZHIgKyAweDA2KTsgLyogRW5hYmxlIGZ1bGwgZHVwbGV4ICovCisJb3V0YigweDAwLCBpb2FkZHIgKyAweDAxKTsgLyogRGlzYWJsZSB3cml0ZXMgdG8gQ09ORklHMyAqLworCW91dGIoRTgzOTBfUEFHRTAgKyBFODM5MF9OT0RNQSwgaW9hZGRyICsgTkVfQ01EKTsgLyogUGFnZSAwICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNldF9ob2x0ZWtfZmR4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW91dGIoaW5iKGlvYWRkciArIDB4MjApIHwgMHg4MCwgaW9hZGRyICsgMHgyMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmUya19wY2lfc2V0X2ZkeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmIChlaV9zdGF0dXMubmUya19mbGFncyAmIFJFQUxURUtfRkRYKSAKKwkJcmV0dXJuIHNldF9yZWFsdGVrX2ZkeChkZXYpOworCWVsc2UgaWYgKGVpX3N0YXR1cy5uZTJrX2ZsYWdzICYgSE9MVEVLX0ZEWCkKKwkJcmV0dXJuIHNldF9ob2x0ZWtfZmR4KGRldik7CisKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbnQgbmUya19wY2lfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgZWlfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoZWlfc3RhdHVzLm5lMmtfZmxhZ3MgJiBGT1JDRV9GRFgpCisJCW5lMmtfcGNpX3NldF9mZHgoZGV2KTsKKworCWVpX29wZW4oZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZTJrX3BjaV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWVpX2Nsb3NlKGRldik7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qIEhhcmQgcmVzZXQgdGhlIGNhcmQuICBUaGlzIHVzZWQgdG8gcGF1c2UgZm9yIHRoZSBzYW1lIHBlcmlvZCB0aGF0IGEKKyAgIDgzOTAgcmVzZXQgY29tbWFuZCByZXF1aXJlZCwgYnV0IHRoYXQgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeS4gKi8KK3N0YXRpYyB2b2lkIG5lMmtfcGNpX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIHJlc2V0X3N0YXJ0X3RpbWUgPSBqaWZmaWVzOworCisJaWYgKGRlYnVnID4gMSkgcHJpbnRrKCIlczogUmVzZXR0aW5nIHRoZSA4MzkwIHQ9JWxkLi4uIiwKKwkJCQkJCSAgZGV2LT5uYW1lLCBqaWZmaWVzKTsKKworCW91dGIoaW5iKE5FX0JBU0UgKyBORV9SRVNFVCksIE5FX0JBU0UgKyBORV9SRVNFVCk7CisKKwllaV9zdGF0dXMudHhpbmcgPSAwOworCWVpX3N0YXR1cy5kbWFpbmcgPSAwOworCisJLyogVGhpcyBjaGVjayBfc2hvdWxkX25vdF8gYmUgbmVjZXNzYXJ5LCBvbWl0IGV2ZW50dWFsbHkuICovCisJd2hpbGUgKChpbmIoTkVfQkFTRStFTjBfSVNSKSAmIEVOSVNSX1JFU0VUKSA9PSAwKQorCQlpZiAoamlmZmllcyAtIHJlc2V0X3N0YXJ0X3RpbWUgPiAyKSB7CisJCQlwcmludGsoIiVzOiBuZTJrX3BjaV9yZXNldF84MzkwKCkgZGlkIG5vdCBjb21wbGV0ZS5cbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCW91dGIoRU5JU1JfUkVTRVQsIE5FX0JBU0UgKyBFTjBfSVNSKTsJLyogQWNrIGludHIuICovCit9CisKKy8qIEdyYWIgdGhlIDgzOTAgc3BlY2lmaWMgaGVhZGVyLiBTaW1pbGFyIHRvIHRoZSBibG9ja19pbnB1dCByb3V0aW5lLCBidXQKKyAgIHdlIGRvbid0IG5lZWQgdG8gYmUgY29uY2VybmVkIHdpdGggcmluZyB3cmFwIGFzIHRoZSBoZWFkZXIgd2lsbCBiZSBhdAorICAgdGhlIHN0YXJ0IG9mIGEgcGFnZSwgc28gd2Ugb3B0aW1pemUgYWNjb3JkaW5nbHkuICovCisKK3N0YXRpYyB2b2lkIG5lMmtfcGNpX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQoreworCisJbG9uZyBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCisJLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworCWlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJCXByaW50aygiJXM6IERNQWluZyBjb25mbGljdCBpbiBuZTJrX3BjaV9nZXRfODM5MF9oZHIgIgorCQkJICAgIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXS5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKwlvdXRiKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUQVJULCBuaWNfYmFzZSsgTkVfQ01EKTsKKwlvdXRiKHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkciksIG5pY19iYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0YigwLCBuaWNfYmFzZSArIEVOMF9SQ05USEkpOworCW91dGIoMCwgbmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsJCS8qIE9uIHBhZ2UgYm91bmRhcnkgKi8KKwlvdXRiKHJpbmdfcGFnZSwgbmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKwlvdXRiKEU4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIE5FX0NNRCk7CisKKwlpZiAoZWlfc3RhdHVzLm5lMmtfZmxhZ3MgJiBPTkxZXzE2QklUX0lPKSB7CisJCWluc3coTkVfQkFTRSArIE5FX0RBVEFQT1JULCBoZHIsIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcik+PjEpOworCX0gZWxzZSB7CisJCSoodTMyKiloZHIgPSBsZTMyX3RvX2NwdShpbmwoTkVfQkFTRSArIE5FX0RBVEFQT1JUKSk7CisJCWxlMTZfdG9fY3B1cygmaGRyLT5jb3VudCk7CisJfQorCisJb3V0YihFTklTUl9SREMsIG5pY19iYXNlICsgRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworCWVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7Cit9CisKKy8qIEJsb2NrIGlucHV0IGFuZCBvdXRwdXQsIHNpbWlsYXIgdG8gdGhlIENyeW53ciBwYWNrZXQgZHJpdmVyLiAgSWYgeW91CisgICBhcmUgcG9ydGluZyB0byBhIG5ldyBldGhlcmNhcmQsIGxvb2sgYXQgdGhlIHBhY2tldCBkcml2ZXIgc291cmNlIGZvciBoaW50cy4KKyAgIFRoZSBORXgwMDAgZG9lc24ndCBzaGFyZSB0aGUgb24tYm9hcmQgcGFja2V0IG1lbW9yeSAtLSB5b3UgaGF2ZSB0byBwdXQKKyAgIHRoZSBwYWNrZXQgb3V0IHRocm91Z2ggdGhlICJyZW1vdGUgRE1BIiBkYXRhcG9ydCB1c2luZyBvdXRiLiAqLworCitzdGF0aWMgdm9pZCBuZTJrX3BjaV9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCkKK3sKKwlsb25nIG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJY2hhciAqYnVmID0gc2tiLT5kYXRhOworCisJLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworCWlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJCXByaW50aygiJXM6IERNQWluZyBjb25mbGljdCBpbiBuZTJrX3BjaV9ibG9ja19pbnB1dCAiCisJCQkgICAiW0RNQXN0YXQ6JWRdW2lycWxvY2s6JWRdLlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgZWlfc3RhdHVzLmRtYWluZywgZWlfc3RhdHVzLmlycWxvY2spOworCQlyZXR1cm47CisJfQorCWVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKwlpZiAoZWlfc3RhdHVzLm5lMmtfZmxhZ3MgJiBPTkxZXzMyQklUX0lPKQorCQljb3VudCA9IChjb3VudCArIDMpICYgMHhGRkZDOworCW91dGIoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQsIG5pY19iYXNlKyBORV9DTUQpOworCW91dGIoY291bnQgJiAweGZmLCBuaWNfYmFzZSArIEVOMF9SQ05UTE8pOworCW91dGIoY291bnQgPj4gOCwgbmljX2Jhc2UgKyBFTjBfUkNOVEhJKTsKKwlvdXRiKHJpbmdfb2Zmc2V0ICYgMHhmZiwgbmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKwlvdXRiKHJpbmdfb2Zmc2V0ID4+IDgsIG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisJb3V0YihFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBORV9DTUQpOworCisJaWYgKGVpX3N0YXR1cy5uZTJrX2ZsYWdzICYgT05MWV8xNkJJVF9JTykgeworCQlpbnN3KE5FX0JBU0UgKyBORV9EQVRBUE9SVCxidWYsY291bnQ+PjEpOworCQlpZiAoY291bnQgJiAweDAxKSB7CisJCQlidWZbY291bnQtMV0gPSBpbmIoTkVfQkFTRSArIE5FX0RBVEFQT1JUKTsKKwkJfQorCX0gZWxzZSB7CisJCWluc2woTkVfQkFTRSArIE5FX0RBVEFQT1JULCBidWYsIGNvdW50Pj4yKTsKKwkJaWYgKGNvdW50ICYgMykgeworCQkJYnVmICs9IGNvdW50ICYgfjM7CisJCQlpZiAoY291bnQgJiAyKSB7CisJCQkJdTE2ICpiID0gKHUxNiAqKWJ1ZjsKKworCQkJCSpiKysgPSBsZTE2X3RvX2NwdShpbncoTkVfQkFTRSArIE5FX0RBVEFQT1JUKSk7CisJCQkJYnVmID0gKGNoYXIgKiliOworCQkJfQorCQkJaWYgKGNvdW50ICYgMSkKKwkJCQkqYnVmID0gaW5iKE5FX0JBU0UgKyBORV9EQVRBUE9SVCk7CisJCX0KKwl9CisKKwlvdXRiKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBFTjBfSVNSKTsJLyogQWNrIGludHIuICovCisJZWlfc3RhdHVzLmRtYWluZyAmPSB+MHgwMTsKK30KKworc3RhdGljIHZvaWQgbmUya19wY2lfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgY29uc3QgaW50IHN0YXJ0X3BhZ2UpCit7CisJbG9uZyBuaWNfYmFzZSA9IE5FX0JBU0U7CisJdW5zaWduZWQgbG9uZyBkbWFfc3RhcnQ7CisKKwkvKiBPbiBsaXR0bGUtZW5kaWFuIGl0J3MgYWx3YXlzIHNhZmUgdG8gcm91bmQgdGhlIGNvdW50IHVwIGZvcgorCSAgIHdvcmQgd3JpdGVzLiAqLworCWlmIChlaV9zdGF0dXMubmUya19mbGFncyAmIE9OTFlfMzJCSVRfSU8pCisJCWNvdW50ID0gKGNvdW50ICsgMykgJiAweEZGRkM7CisJZWxzZQorCQlpZiAoY291bnQgJiAweDAxKQorCQkJY291bnQrKzsKKworCS8qIFRoaXMgKnNob3VsZG4ndCogaGFwcGVuLiBJZiBpdCBkb2VzLCBpdCdzIHRoZSBsYXN0IHRoaW5nIHlvdSdsbCBzZWUgKi8KKwlpZiAoZWlfc3RhdHVzLmRtYWluZykgeworCQlwcmludGsoIiVzOiBETUFpbmcgY29uZmxpY3QgaW4gbmUya19wY2lfYmxvY2tfb3V0cHV0LiIKKwkJCSAgICJbRE1Bc3RhdDolZF1baXJxbG9jazolZF1cbiIsCisJCQkgICBkZXYtPm5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrKTsKKwkJcmV0dXJuOworCX0KKwllaV9zdGF0dXMuZG1haW5nIHw9IDB4MDE7CisJLyogV2Ugc2hvdWxkIGFscmVhZHkgYmUgaW4gcGFnZSAwLCBidXQgdG8gYmUgc2FmZS4uLiAqLworCW91dGIoRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQrRTgzOTBfTk9ETUEsIG5pY19iYXNlICsgTkVfQ01EKTsKKworI2lmZGVmIE5FODM5MF9SV19CVUdGSVgKKwkvKiBIYW5kbGUgdGhlIHJlYWQtYmVmb3JlLXdyaXRlIGJ1ZyB0aGUgc2FtZSB3YXkgYXMgdGhlCisJICAgQ3J5bndyIHBhY2tldCBkcml2ZXIgLS0gdGhlIE5hdFNlbWkgbWV0aG9kIGRvZXNuJ3Qgd29yay4KKwkgICBBY3R1YWxseSB0aGlzIGRvZXNuJ3QgYWx3YXlzIHdvcmsgZWl0aGVyLCBidXQgaWYgeW91IGhhdmUKKwkgICBwcm9ibGVtcyB3aXRoIHlvdXIgTkV4MDAwIHRoaXMgaXMgYmV0dGVyIHRoYW4gbm90aGluZyEgKi8KKwlvdXRiKDB4NDIsIG5pY19iYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0YigweDAwLCBuaWNfYmFzZSArIEVOMF9SQ05USEkpOworCW91dGIoMHg0MiwgbmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKwlvdXRiKDB4MDAsIG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisJb3V0YihFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBORV9DTUQpOworI2VuZGlmCisJb3V0YihFTklTUl9SREMsIG5pY19iYXNlICsgRU4wX0lTUik7CisKKyAgIC8qIE5vdyB0aGUgbm9ybWFsIG91dHB1dC4gKi8KKwlvdXRiKGNvdW50ICYgMHhmZiwgbmljX2Jhc2UgKyBFTjBfUkNOVExPKTsKKwlvdXRiKGNvdW50ID4+IDgsICAgbmljX2Jhc2UgKyBFTjBfUkNOVEhJKTsKKwlvdXRiKDB4MDAsIG5pY19iYXNlICsgRU4wX1JTQVJMTyk7CisJb3V0YihzdGFydF9wYWdlLCBuaWNfYmFzZSArIEVOMF9SU0FSSEkpOworCW91dGIoRTgzOTBfUldSSVRFK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIE5FX0NNRCk7CisJaWYgKGVpX3N0YXR1cy5uZTJrX2ZsYWdzICYgT05MWV8xNkJJVF9JTykgeworCQlvdXRzdyhORV9CQVNFICsgTkVfREFUQVBPUlQsIGJ1ZiwgY291bnQ+PjEpOworCX0gZWxzZSB7CisJCW91dHNsKE5FX0JBU0UgKyBORV9EQVRBUE9SVCwgYnVmLCBjb3VudD4+Mik7CisJCWlmIChjb3VudCAmIDMpIHsKKwkJCWJ1ZiArPSBjb3VudCAmIH4zOworCQkJaWYgKGNvdW50ICYgMikgeworCQkJCXUxNiAqYiA9ICh1MTYgKilidWY7CisKKwkJCQlvdXR3KGNwdV90b19sZTE2KCpiKyspLCBORV9CQVNFICsgTkVfREFUQVBPUlQpOworCQkJCWJ1ZiA9IChjaGFyICopYjsKKwkJCX0KKwkJfQorCX0KKworCWRtYV9zdGFydCA9IGppZmZpZXM7CisKKwl3aGlsZSAoKGluYihuaWNfYmFzZSArIEVOMF9JU1IpICYgRU5JU1JfUkRDKSA9PSAwKQorCQlpZiAoamlmZmllcyAtIGRtYV9zdGFydCA+IDIpIHsJCQkvKiBBdm9pZCBjbG9jayByb2xsLW92ZXIuICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdGltZW91dCB3YWl0aW5nIGZvciBUeCBSREMuXG4iLCBkZXYtPm5hbWUpOworCQkJbmUya19wY2lfcmVzZXRfODM5MChkZXYpOworCQkJTlM4MzkwX2luaXQoZGV2LDEpOworCQkJYnJlYWs7CisJCX0KKworCW91dGIoRU5JU1JfUkRDLCBuaWNfYmFzZSArIEVOMF9JU1IpOwkvKiBBY2sgaW50ci4gKi8KKwllaV9zdGF0dXMuZG1haW5nICY9IH4weDAxOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgbmUya19wY2lfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaSA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IChzdHJ1Y3QgcGNpX2RldiAqKSBlaS0+cHJpdjsKKworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocGNpX2RldikpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5lMmtfcGNpX2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBuZTJrX3BjaV9nZXRfZHJ2aW5mbywKKwkuZ2V0X3R4X2NzdW0JCT0gZXRodG9vbF9vcF9nZXRfdHhfY3N1bSwKKwkuZ2V0X3NnCQkJPSBldGh0b29sX29wX2dldF9zZywKK307CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBuZTJrX3BjaV9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKCFkZXYpCisJCUJVRygpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTkVfSU9fRVhURU5UKTsKKwlmcmVlX25ldGRldihkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgbmUya19wY2lfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKworCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5lMmtfcGNpX3Jlc3VtZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YSAocGRldik7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCU5TODM5MF9pbml0KGRldiwgMSk7CisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbmUya19kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJWX05BTUUsCisJLnByb2JlCQk9IG5lMmtfcGNpX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobmUya19wY2lfcmVtb3ZlX29uZSksCisJLmlkX3RhYmxlCT0gbmUya19wY2lfdGJsLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gbmUya19wY2lfc3VzcGVuZCwKKwkucmVzdW1lCQk9IG5lMmtfcGNpX3Jlc3VtZSwKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBuZTJrX3BjaV9pbml0KHZvaWQpCit7CisvKiB3aGVuIGEgbW9kdWxlLCB0aGlzIGlzIHByaW50ZWQgd2hldGhlciBvciBub3QgZGV2aWNlcyBhcmUgZm91bmQgaW4gcHJvYmUgKi8KKyNpZmRlZiBNT0RVTEUKKwlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0ICgmbmUya19kcml2ZXIpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuZTJrX3BjaV9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmbmUya19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChuZTJrX3BjaV9pbml0KTsKK21vZHVsZV9leGl0KG5lMmtfcGNpX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmUzMjEwLmMgYi9kcml2ZXJzL25ldC9uZTMyMTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzkyZjA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbmUzMjEwLmMKQEAgLTAsMCArMSwzNzQgQEAKKy8qCisJbmUzMjEwLmMKKworCUxpbnV4IGRyaXZlciBmb3IgTm92ZWxsIE5FMzIxMCBFSVNBIE5ldHdvcmsgQWRhcHRlcgorCisJQ29weXJpZ2h0IChDKSAxOTk4LCBQYXVsIEdvcnRtYWtlci4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJSW5mb3JtYXRpb24gYW5kIENvZGUgU291cmNlczoKKworCTEpIEJhc2VkIHVwb24gbXkgb3RoZXIgRUlTQSA4MzkwIGRyaXZlcnMgKGxuZTM5MCwgZXMzMjEwLCBzbWMtdWx0cmEzMikKKwkyKSBUaGUgZXhpc3RpbmcgbXlyaWFkIG9mIG90aGVyIExpbnV4IDgzOTAgZHJpdmVycyBieSBEb25hbGQgQmVja2VyLgorCTMpIEluZm8gZm9yIGdldHRpbmcgSVJRIGFuZCBzaC1tZW0gZ2xlYW5lZCBmcm9tIHRoZSBFSVNBIGNmZyBmaWxlCisKKwlUaGUgTkUzMjEwIGlzIGFuIEVJU0Egc2hhcmVkIG1lbW9yeSBOUzgzOTAgaW1wbGVtZW50YXRpb24uICBTaGFyZWQgCisJbWVtb3J5IGFkZHJlc3MgPiAxTUIgc2hvdWxkIHdvcmsgd2l0aCB0aGlzIGRyaXZlci4KKworCU5vdGUgdGhhdCB0aGUgLmNmZyBmaWxlICgzLzExLzkzLCB2MS4wKSBoYXMgQVVJIGFuZCBCTkMgc3dpdGNoZWQgCisJYXJvdW5kIChvciBwZXJoYXBzIHRoZXJlIGFyZSBzb21lIGRlZmVjdGl2ZS9iYWNrd2FyZHMgY2FyZHMgPz8/KQorCisJVGhpcyBkcml2ZXIgV0lMTCBOT1QgV09SSyBGT1IgVEhFIE5FMzIwMCAtIGl0IGlzIGNvbXBsZXRlbHkgZGlmZmVyZW50CisJYW5kIGRvZXMgbm90IHVzZSBhbiA4MzkwIGF0IGFsbC4KKworCVVwZGF0ZWQgdG8gRUlTQSBwcm9iaW5nIEFQSSA1LzIwMDMgYnkgTWFyYyBaeW5naWVyLgorKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb24gPQorCSJuZTMyMTAuYzogRHJpdmVyIHJldmlzaW9uIHYwLjAzLCAzMC8wOS85OFxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vpc2EuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICI4MzkwLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgIm5lMzIxMCIKKworc3RhdGljIGludCBuZTMyMTBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbmUzMjEwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZCBuZTMyMTBfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHZvaWQgbmUzMjEwX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKTsKK3N0YXRpYyB2b2lkIG5lMzIxMF9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCk7CitzdGF0aWMgdm9pZCBuZTMyMTBfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBjb25zdCBpbnQgc3RhcnRfcGFnZSk7CisKKyNkZWZpbmUgTkUzMjEwX1NUQVJUX1BHCQkweDAwICAgIC8qIEZpcnN0IHBhZ2Ugb2YgVFggYnVmZmVyCSovCisjZGVmaW5lIE5FMzIxMF9TVE9QX1BHCQkweDgwICAgIC8qIExhc3QgcGFnZSArMSBvZiBSWCByaW5nCSovCisKKyNkZWZpbmUgTkUzMjEwX0lPX0VYVEVOVAkweDIwCisjZGVmaW5lIE5FMzIxMF9TQV9QUk9NCQkweDE2CS8qIFN0YXJ0IG9mIGUnbmV0IGFkZHIuCQkqLworI2RlZmluZSBORTMyMTBfUkVTRVRfUE9SVAkweGM4NAorI2RlZmluZSBORTMyMTBfTklDX09GRlNFVAkweDAwCS8qIEhlbGxvLCB0aGUgODM5MCBpcyAqaGVyZSoJKi8KKworI2RlZmluZSBORTMyMTBfQUREUjAJCTB4MDAJLyogMyBieXRlIHZlbmRvciBwcmVmaXgJCSovCisjZGVmaW5lIE5FMzIxMF9BRERSMQkJMHgwMAorI2RlZmluZSBORTMyMTBfQUREUjIJCTB4MWIKKworI2RlZmluZSBORTMyMTBfQ0ZHMQkJMHhjODQJLyogTkI6IDB4Yzg0IGlzIGFsc28gInJlc2V0IiBwb3J0LiAqLworI2RlZmluZSBORTMyMTBfQ0ZHMgkJMHhjOTAKKyNkZWZpbmUgTkUzMjEwX0NGR19FWFRFTlQgICAgICAgKE5FMzIxMF9DRkcyIC0gTkUzMjEwX0NGRzEgKyAxKQorCisvKgorICoJWW91IGNhbiBPUiBhbnkgb2YgdGhlIGZvbGxvd2luZyBiaXRzIHRvZ2V0aGVyIGFuZCBhc3NpZ24gaXQKKyAqCXRvIE5FMzIxMF9ERUJVRyB0byBnZXQgdmVyYm9zZSBkcml2ZXIgaW5mbyBkdXJpbmcgb3BlcmF0aW9uLgorICoJQ3VycmVudGx5IG9ubHkgdGhlIHByb2JlIG9uZSBpcyBpbXBsZW1lbnRlZC4KKyAqLworCisjZGVmaW5lIE5FMzIxMF9EX1BST0JFCTB4MDEKKyNkZWZpbmUgTkUzMjEwX0RfUlhfUEtUCTB4MDIKKyNkZWZpbmUgTkUzMjEwX0RfVFhfUEtUCTB4MDQKKyNkZWZpbmUgTkUzMjEwX0RfSVJRCTB4MDgKKworI2RlZmluZSBORTMyMTBfREVCVUcJMHgwCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGlycV9tYXBbXSBfX2luaXRkYXRhID0gezE1LCAxMiwgMTEsIDEwLCA5LCA3LCA1LCAzfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2htZW1fbWFwW10gX19pbml0ZGF0YSA9IHsweGZmMCwgMHhmZTAsIDB4ZmZmMCwgMHhkOCwgMHhmZmUwLCAweGZmYzAsIDB4ZDAsIDB4MH07CitzdGF0aWMgY29uc3QgY2hhciAqaWZtYXBbXSBfX2luaXRkYXRhID0geyJVVFAiLCAiPyIsICJCTkMiLCAiQVVJIn07CitzdGF0aWMgaW50IGlmbWFwX3ZhbFtdIF9faW5pdGRhdGEgPSB7CisJCUlGX1BPUlRfMTBCQVNFVCwKKwkJSUZfUE9SVF9VTktOT1dOLAorCQlJRl9QT1JUXzEwQkFTRTIsCisJCUlGX1BPUlRfQVVJLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbmUzMjEwX2Vpc2FfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciwgcGh5c19tZW07CisJaW50IGksIHJldHZhbCwgcG9ydF9pbmRleDsKKwlzdHJ1Y3QgZWlzYV9kZXZpY2UgKmVkZXYgPSB0b19laXNhX2RldmljZSAoZGV2aWNlKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJLyogQWxsb2NhdGUgZGV2LT5wcml2IGFuZCBmaWxsIGluIDgzOTAgc3BlY2lmaWMgZGV2IGZpZWxkcy4gKi8KKwlpZiAoIShkZXYgPSBhbGxvY19laV9uZXRkZXYgKCkpKSB7CisJCXByaW50ayAoIm5lMzIxMC5jOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkZXYhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgZGV2aWNlKTsKKwlkZXZpY2UtPmRyaXZlcl9kYXRhID0gZGV2OworCWlvYWRkciA9IGVkZXYtPmJhc2VfYWRkcjsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBORTMyMTBfSU9fRVhURU5ULCBEUlZfTkFNRSkpIHsKKwkJcmV0dmFsID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciArIE5FMzIxMF9DRkcxLAorCQkJICAgIE5FMzIxMF9DRkdfRVhURU5ULCBEUlZfTkFNRSkpIHsKKwkJcmV0dmFsID0gLUVCVVNZOworCQlnb3RvIG91dDE7CisJfQorCisjaWYgTkUzMjEwX0RFQlVHICYgTkUzMjEwX0RfUFJPQkUKKwlwcmludGsoIm5lMzIxMC1kZWJ1ZzogcHJvYmUgYXQgJSN4LCBJRCAlc1xuIiwgaW9hZGRyLCBlZGV2LT5pZC5zaWcpOworCXByaW50aygibmUzMjEwLWRlYnVnOiBjb25maWcgcmVnczogJSN4ICUjeFxuIiwKKwkJaW5iKGlvYWRkciArIE5FMzIxMF9DRkcxKSwgaW5iKGlvYWRkciArIE5FMzIxMF9DRkcyKSk7CisjZW5kaWYKKworCisJcG9ydF9pbmRleCA9IGluYihpb2FkZHIgKyBORTMyMTBfQ0ZHMikgPj4gNjsKKwlwcmludGsoIm5lMzIxMC5jOiBORTMyMTAgaW4gRUlTQSBzbG90ICVkLCBtZWRpYTogJXMsIGFkZHI6IiwKKwkJZWRldi0+c2xvdCwgaWZtYXBbcG9ydF9pbmRleF0pOworCWZvcihpID0gMDsgaSA8IEVUSEVSX0FERFJfTEVOOyBpKyspCisJCXByaW50aygiICUwMngiLCAoZGV2LT5kZXZfYWRkcltpXSA9IGluYihpb2FkZHIgKyBORTMyMTBfU0FfUFJPTSArIGkpKSk7CisJCisKKwkvKiBTbmFyZiB0aGUgaW50ZXJydXB0IG5vdy4gQ0ZHIGZpbGUgaGFzIHRoZW0gYWxsIGxpc3RlZCBhcyBgZWRnZScgd2l0aCBzaGFyZT1OTyAqLworCWRldi0+aXJxID0gaXJxX21hcFsoaW5iKGlvYWRkciArIE5FMzIxMF9DRkcyKSA+PiAzKSAmIDB4MDddOworCXByaW50aygiLlxubmUzMjEwLmM6IHVzaW5nIElSUSAlZCwgIiwgZGV2LT5pcnEpOworCisJcmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGVpX2ludGVycnVwdCwgMCwgRFJWX05BTUUsIGRldik7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsgKCIgdW5hYmxlIHRvIGdldCBJUlEgJWQuXG4iLCBkZXYtPmlycSk7CisJCWdvdG8gb3V0MjsKKwl9CisKKwlwaHlzX21lbSA9IHNobWVtX21hcFtpbmIoaW9hZGRyICsgTkUzMjEwX0NGRzIpICYgMHgwN10gKiAweDEwMDA7CisKKwkvKgorCSAgIEJFV0FSRSEhIFNvbWUgZGFpbi1icmFtYWdlZCBFSVNBIFNDVXMgd2lsbCBhbGxvdyB5b3UgdG8gcHV0CisJICAgdGhlIGNhcmQgbWVtIHdpdGhpbiB0aGUgcmVnaW9uIGNvdmVyZWQgYnkgYG5vcm1hbCcgUkFNICAhISEKKwkqLworCWlmIChwaHlzX21lbSA+IDEwMjQqMTAyNCkgewkvKiBwaHlzIGFkZHIgPiAxTUIgKi8KKwkJaWYgKHBoeXNfbWVtIDwgdmlydF90b19waHlzKGhpZ2hfbWVtb3J5KSkgeworCQkJcHJpbnRrKEtFUk5fQ1JJVCAibmUzMjEwLmM6IENhcmQgUkFNIG92ZXJsYXBzIHdpdGggbm9ybWFsIG1lbW9yeSEhIVxuIik7CisJCQlwcmludGsoS0VSTl9DUklUICJuZTMyMTAuYzogVXNlIEVJU0EgU0NVIHRvIHNldCBjYXJkIG1lbW9yeSBiZWxvdyAxTUIsXG4iKTsKKwkJCXByaW50ayhLRVJOX0NSSVQgIm5lMzIxMC5jOiBvciB0byBhbiBhZGRyZXNzIGFib3ZlIDB4JWx4LlxuIiwgdmlydF90b19waHlzKGhpZ2hfbWVtb3J5KSk7CisJCQlwcmludGsoS0VSTl9DUklUICJuZTMyMTAuYzogRHJpdmVyIE5PVCBpbnN0YWxsZWQuXG4iKTsKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDM7CisJCX0KKwl9CisJCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24gKHBoeXNfbWVtLCBORTMyMTBfU1RPUF9QRyoweDEwMCwgRFJWX05BTUUpKSB7CisJCXByaW50ayAoIm5lMzIxMC5jOiBVbmFibGUgdG8gcmVxdWVzdCBzaGFyZWQgbWVtb3J5IGF0IHBoeXNpY2FsIGFkZHJlc3MgJSNseFxuIiwKKwkJCXBoeXNfbWVtKTsKKwkJZ290byBvdXQzOworCX0KKwkKKwlwcmludGsoIiVka0IgbWVtb3J5IGF0IHBoeXNpY2FsIGFkZHJlc3MgJSNseFxuIiwKKwkgICAgICAgTkUzMjEwX1NUT1BfUEcvNCwgcGh5c19tZW0pOworCisJZWlfc3RhdHVzLm1lbSA9IGlvcmVtYXAocGh5c19tZW0sIE5FMzIxMF9TVE9QX1BHKjB4MTAwKTsKKwlpZiAoIWVpX3N0YXR1cy5tZW0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJuZTMyMTAuYzogVW5hYmxlIHRvIHJlbWFwIGNhcmQgbWVtb3J5ICEhXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJuZTMyMTAuYzogRHJpdmVyIE5PVCBpbnN0YWxsZWQuXG4iKTsKKwkJcmV0dmFsID0gLUVBR0FJTjsKKwkJZ290byBvdXQ0OworCX0KKwlwcmludGsoIm5lMzIxMC5jOiByZW1hcHBlZCAlZGtCIGNhcmQgbWVtb3J5IHRvIHZpcnR1YWwgYWRkcmVzcyAlcFxuIiwKKwkgICAgICAgTkUzMjEwX1NUT1BfUEcvNCwgZWlfc3RhdHVzLm1lbSk7CisJZGV2LT5tZW1fc3RhcnQgPSAodW5zaWduZWQgbG9uZyllaV9zdGF0dXMubWVtOworCWRldi0+bWVtX2VuZCA9IGRldi0+bWVtX3N0YXJ0ICsgKE5FMzIxMF9TVE9QX1BHIC0gTkUzMjEwX1NUQVJUX1BHKSoyNTY7CisKKwkvKiBUaGUgODM5MCBvZmZzZXQgaXMgemVybyBmb3IgdGhlIE5FMzIxMCAqLworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCisJZWlfc3RhdHVzLm5hbWUgPSAiTkUzMjEwIjsKKwllaV9zdGF0dXMudHhfc3RhcnRfcGFnZSA9IE5FMzIxMF9TVEFSVF9QRzsKKwllaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IE5FMzIxMF9TVEFSVF9QRyArIFRYX1BBR0VTOworCWVpX3N0YXR1cy5zdG9wX3BhZ2UgPSBORTMyMTBfU1RPUF9QRzsKKwllaV9zdGF0dXMud29yZDE2ID0gMTsKKwllaV9zdGF0dXMucHJpdiA9IHBoeXNfbWVtOworCisJaWYgKGVpX2RlYnVnID4gMCkKKwkJcHJpbnRrKHZlcnNpb24pOworCisJZWlfc3RhdHVzLnJlc2V0XzgzOTAgPSAmbmUzMjEwX3Jlc2V0XzgzOTA7CisJZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJm5lMzIxMF9ibG9ja19pbnB1dDsKKwllaV9zdGF0dXMuYmxvY2tfb3V0cHV0ID0gJm5lMzIxMF9ibG9ja19vdXRwdXQ7CisJZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZuZTMyMTBfZ2V0XzgzOTBfaGRyOworCisJZGV2LT5vcGVuID0gJm5lMzIxMF9vcGVuOworCWRldi0+c3RvcCA9ICZuZTMyMTBfY2xvc2U7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CisjZW5kaWYKKwlkZXYtPmlmX3BvcnQgPSBpZm1hcF92YWxbcG9ydF9pbmRleF07CisKKwlpZiAoKHJldHZhbCA9IHJlZ2lzdGVyX25ldGRldiAoZGV2KSkpCisJCWdvdG8gb3V0NTsKKwkJCisJTlM4MzkwX2luaXQoZGV2LCAwKTsKKwlyZXR1cm4gMDsKKworIG91dDU6CisJaW91bm1hcChlaV9zdGF0dXMubWVtKTsKKyBvdXQ0OgorCXJlbGVhc2VfbWVtX3JlZ2lvbiAocGh5c19tZW0sIE5FMzIxMF9TVE9QX1BHKjB4MTAwKTsKKyBvdXQzOgorCWZyZWVfaXJxIChkZXYtPmlycSwgZGV2KTsKKyBvdXQyOgorCXJlbGVhc2VfcmVnaW9uIChpb2FkZHIgKyBORTMyMTBfQ0ZHMSwgTkUzMjEwX0NGR19FWFRFTlQpOworIG91dDE6CisJcmVsZWFzZV9yZWdpb24gKGlvYWRkciwgTkUzMjEwX0lPX0VYVEVOVCk7Cisgb3V0OgorCWZyZWVfbmV0ZGV2IChkZXYpOworCQorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG5lMzIxMF9laXNhX3JlbW92ZSAoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ICAgID0gZGV2aWNlLT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nICAgICAgIGlvYWRkciA9IHRvX2Vpc2FfZGV2aWNlIChkZXZpY2UpLT5iYXNlX2FkZHI7CisKKwl1bnJlZ2lzdGVyX25ldGRldiAoZGV2KTsKKwlpb3VubWFwKGVpX3N0YXR1cy5tZW0pOworCXJlbGVhc2VfbWVtX3JlZ2lvbiAoZWlfc3RhdHVzLnByaXYsIE5FMzIxMF9TVE9QX1BHKjB4MTAwKTsKKwlmcmVlX2lycSAoZGV2LT5pcnEsIGRldik7CisJcmVsZWFzZV9yZWdpb24gKGlvYWRkciArIE5FMzIxMF9DRkcxLCBORTMyMTBfQ0ZHX0VYVEVOVCk7CisJcmVsZWFzZV9yZWdpb24gKGlvYWRkciwgTkUzMjEwX0lPX0VYVEVOVCk7CisJZnJlZV9uZXRkZXYgKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVJlc2V0IGJ5IHRvZ2dsaW5nIHRoZSAiQm9hcmQgRW5hYmxlIiBiaXRzIChiaXQgMiBhbmQgMCkuCisgKi8KKworc3RhdGljIHZvaWQgbmUzMjEwX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW91dGIoMHgwNCwgaW9hZGRyICsgTkUzMjEwX1JFU0VUX1BPUlQpOworCWlmIChlaV9kZWJ1ZyA+IDEpIHByaW50aygiJXM6IHJlc2V0dGluZyB0aGUgTkUzMjEwLi4uIiwgZGV2LT5uYW1lKTsKKworCW1kZWxheSgyKTsKKworCWVpX3N0YXR1cy50eGluZyA9IDA7CisJb3V0YigweDAxLCBpb2FkZHIgKyBORTMyMTBfUkVTRVRfUE9SVCk7CisJaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCJyZXNldCBkb25lXG4iKTsKKworCXJldHVybjsKK30KKworLyoKKyAqCU5vdGU6IEluIHRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGlzIHRoZSBpbXBsaWNpdCBhc3N1bXB0aW9uCisgKgl0aGF0IHRoZSBhc3NvY2lhdGVkIG1lbWNweSB3aWxsIG9ubHkgdXNlICJyZXA7IG1vdnNsIiBhcyBsb25nIGFzCisgKgl3ZSBrZWVwIHRoZSBjb3VudHMgYXMgc29tZSBtdWx0aXBsZSBvZiBkb3VibGV3b3Jkcy4gVGhpcyBpcyBhCisgKglyZXF1aXJlbWVudCBvZiB0aGUgaGFyZHdhcmUsIGFuZCBhbHNvIHByZXZlbnRzIHVzIGZyb20gdXNpbmcKKyAqCWV0aF9pb19jb3B5X2FuZF9zdW0oKSBzaW5jZSB3ZSBjYW4ndCBndWFyYW50ZWUgaXQgd2lsbCBsaW1pdAorICoJaXRzZWxmIHRvIGRvdWJsZXdvcmQgYWNjZXNzLgorICovCisKKy8qCisgKglHcmFiIHRoZSA4MzkwIHNwZWNpZmljIGhlYWRlci4gU2ltaWxhciB0byB0aGUgYmxvY2tfaW5wdXQgcm91dGluZSwgYnV0CisgKgl3ZSBkb24ndCBuZWVkIHRvIGJlIGNvbmNlcm5lZCB3aXRoIHJpbmcgd3JhcCBhcyB0aGUgaGVhZGVyIHdpbGwgYmUgYXQKKyAqCXRoZSBzdGFydCBvZiBhIHBhZ2UsIHNvIHdlIG9wdGltaXplIGFjY29yZGluZ2x5LiAoQSBzaW5nbGUgZG91Ymxld29yZC4pCisgKi8KKworc3RhdGljIHZvaWQKK25lMzIxMF9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSkKK3sKKwl2b2lkIF9faW9tZW0gKmhkcl9zdGFydCA9IGVpX3N0YXR1cy5tZW0gKyAoKHJpbmdfcGFnZSAtIE5FMzIxMF9TVEFSVF9QRyk8PDgpOworCW1lbWNweV9mcm9taW8oaGRyLCBoZHJfc3RhcnQsIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcikpOworCWhkci0+Y291bnQgPSAoaGRyLT5jb3VudCArIDMpICYgfjM7ICAgICAvKiBSb3VuZCB1cCBhbGxvY2F0aW9uLiAqLworfQorCisvKgkKKyAqCUJsb2NrIGlucHV0IGFuZCBvdXRwdXQgYXJlIGVhc3kgb24gc2hhcmVkIG1lbW9yeSBldGhlcmNhcmRzLCB0aGUgb25seQorICoJY29tcGxpY2F0aW9uIGlzIHdoZW4gdGhlIHJpbmcgYnVmZmVyIHdyYXBzLiBUaGUgY291bnQgd2lsbCBhbHJlYWR5CisgKgliZSByb3VuZGVkIHVwIHRvIGEgZG91Ymxld29yZCB2YWx1ZSB2aWEgbmUzMjEwX2dldF84MzkwX2hkcigpIGFib3ZlLgorICovCisKK3N0YXRpYyB2b2lkIG5lMzIxMF9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCQkgIGludCByaW5nX29mZnNldCkKK3sKKwl2b2lkIF9faW9tZW0gKnN0YXJ0ID0gZWlfc3RhdHVzLm1lbSArIHJpbmdfb2Zmc2V0IC0gTkUzMjEwX1NUQVJUX1BHKjI1NjsKKworCWlmIChyaW5nX29mZnNldCArIGNvdW50ID4gTkUzMjEwX1NUT1BfUEcqMjU2KSB7CisJCS8qIFBhY2tldCB3cmFwcyBvdmVyIGVuZCBvZiByaW5nIGJ1ZmZlci4gKi8KKwkJaW50IHNlbWlfY291bnQgPSBORTMyMTBfU1RPUF9QRyoyNTYgLSByaW5nX29mZnNldDsKKwkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEsIHN0YXJ0LCBzZW1pX2NvdW50KTsKKwkJY291bnQgLT0gc2VtaV9jb3VudDsKKwkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEgKyBzZW1pX2NvdW50LAorCQkJCWVpX3N0YXR1cy5tZW0gKyBUWF9QQUdFUyoyNTYsIGNvdW50KTsKKwl9IGVsc2UgeworCQkvKiBQYWNrZXQgaXMgaW4gb25lIGNodW5rLiAqLworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgc3RhcnQsIGNvdW50KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5lMzIxMF9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHN0YXJ0X3BhZ2UpCit7CisJdm9pZCBfX2lvbWVtICpzaG1lbSA9IGVpX3N0YXR1cy5tZW0gKyAoKHN0YXJ0X3BhZ2UgLSBORTMyMTBfU1RBUlRfUEcpPDw4KTsKKworCWNvdW50ID0gKGNvdW50ICsgMykgJiB+MzsgICAgIC8qIFJvdW5kIHVwIHRvIGRvdWJsZXdvcmQgKi8KKwltZW1jcHlfdG9pbyhzaG1lbSwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgbmUzMjEwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwllaV9vcGVuKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmUzMjEwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlpZiAoZWlfZGVidWcgPiAxKQorCQlwcmludGsoIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZC5cbiIsIGRldi0+bmFtZSk7CisKKwllaV9jbG9zZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGVpc2FfZGV2aWNlX2lkIG5lMzIxMF9pZHNbXSA9IHsKKwl7ICJFR0wwMTAxIiB9LAorCXsgIk5WTDE4MDEiIH0sCisJeyAiIiB9LAorfTsKKworc3RhdGljIHN0cnVjdCBlaXNhX2RyaXZlciBuZTMyMTBfZWlzYV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gbmUzMjEwX2lkcywKKwkuZHJpdmVyICAgPSB7CisJCS5uYW1lICAgPSAibmUzMjEwIiwKKwkJLnByb2JlICA9IG5lMzIxMF9laXNhX3Byb2JlLAorCQkucmVtb3ZlID0gX19kZXZleGl0X3AgKG5lMzIxMF9laXNhX3JlbW92ZSksCisJfSwKK307CisKK01PRFVMRV9ERVNDUklQVElPTigiTkUzMjEwIEVJU0EgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKGVpc2EsIG5lMzIxMF9pZHMpOworCitpbnQgbmUzMjEwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZWlzYV9kcml2ZXJfcmVnaXN0ZXIgKCZuZTMyMTBfZWlzYV9kcml2ZXIpOworfQorCit2b2lkIG5lMzIxMF9jbGVhbnVwKHZvaWQpCit7CisJZWlzYV9kcml2ZXJfdW5yZWdpc3RlciAoJm5lMzIxMF9laXNhX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0IChuZTMyMTBfaW5pdCk7Cittb2R1bGVfZXhpdCAobmUzMjEwX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0Y29uc29sZS5jIGIvZHJpdmVycy9uZXQvbmV0Y29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZDFiNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9uZXRjb25zb2xlLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9uZXQvbmV0Y29uc29sZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMSAgSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+CisgKgorICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYW4gSVJRLXNhZmUsIGNyYXNoLXNhZmUKKyAqICBrZXJuZWwgY29uc29sZSBpbXBsZW1lbnRhdGlvbiB0aGF0IG91dHB1dHMga2VybmVsIG1lc3NhZ2VzIHRvIHRoZQorICogIG5ldHdvcmsuCisgKgorICogTW9kaWZpY2F0aW9uIGhpc3Rvcnk6CisgKgorICogMjAwMS0wOS0xNyAgICBzdGFydGVkIGJ5IEluZ28gTW9sbmFyLgorICogMjAwMy0wOC0xMSAgICAyLjYgcG9ydCBieSBNYXR0IE1hY2thbGwKKyAqICAgICAgICAgICAgICAgc2ltcGxpZmllZCBvcHRpb25zCisgKiAgICAgICAgICAgICAgIGdlbmVyaWMgY2FyZCBob29rcworICogICAgICAgICAgICAgICB3b3JrcyBub24tbW9kdWxhcgorICogMjAwMy0wOS0wNyAgICByZXdyaXR0ZW4gd2l0aCBuZXRwb2xsIGFwaQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqICAgICAgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRwb2xsLmg+CisKK01PRFVMRV9BVVRIT1IoIk1haW50YWluZXI6IE1hdHQgTWFja2FsbCA8bXBtQHNlbGVuaWMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb25zb2xlIGRyaXZlciBmb3IgbmV0d29yayBpbnRlcmZhY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBjaGFyIGNvbmZpZ1syNTZdOworbW9kdWxlX3BhcmFtX3N0cmluZyhuZXRjb25zb2xlLCBjb25maWcsIDI1NiwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5ldGNvbnNvbGUsICIgbmV0Y29uc29sZT1bc3JjLXBvcnRdQFtzcmMtaXBdL1tkZXZdLFt0Z3QtcG9ydF1APHRndC1pcD4vW3RndC1tYWNhZGRyXVxuIik7CisKK3N0YXRpYyBzdHJ1Y3QgbmV0cG9sbCBucCA9IHsKKwkubmFtZSA9ICJuZXRjb25zb2xlIiwKKwkuZGV2X25hbWUgPSAiZXRoMCIsCisJLmxvY2FsX3BvcnQgPSA2NjY1LAorCS5yZW1vdGVfcG9ydCA9IDY2NjYsCisJLnJlbW90ZV9tYWMgPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn0sCisJLmRyb3AgPSBuZXRwb2xsX3F1ZXVlLAorfTsKK3N0YXRpYyBpbnQgY29uZmlndXJlZCA9IDA7CisKKyNkZWZpbmUgTUFYX1BSSU5UX0NIVU5LIDEwMDAKKworc3RhdGljIHZvaWQgd3JpdGVfbXNnKHN0cnVjdCBjb25zb2xlICpjb24sIGNvbnN0IGNoYXIgKm1zZywgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQgZnJhZywgbGVmdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFucC5kZXYpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWZvcihsZWZ0ID0gbGVuOyBsZWZ0OyApIHsKKwkJZnJhZyA9IG1pbihsZWZ0LCBNQVhfUFJJTlRfQ0hVTkspOworCQluZXRwb2xsX3NlbmRfdWRwKCZucCwgbXNnLCBmcmFnKTsKKwkJbXNnICs9IGZyYWc7CisJCWxlZnQgLT0gZnJhZzsKKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29uc29sZSBuZXRjb25zb2xlID0geworCS5mbGFncyA9IENPTl9FTkFCTEVEIHwgQ09OX1BSSU5UQlVGRkVSLAorCS53cml0ZSA9IHdyaXRlX21zZworfTsKKworc3RhdGljIGludCBvcHRpb25fc2V0dXAoY2hhciAqb3B0KQoreworCWNvbmZpZ3VyZWQgPSAhbmV0cG9sbF9wYXJzZV9vcHRpb25zKCZucCwgb3B0KTsKKwlyZXR1cm4gMDsKK30KKworX19zZXR1cCgibmV0Y29uc29sZT0iLCBvcHRpb25fc2V0dXApOworCitzdGF0aWMgaW50IGluaXRfbmV0Y29uc29sZSh2b2lkKQoreworCWlmKHN0cmxlbihjb25maWcpKQorCQlvcHRpb25fc2V0dXAoY29uZmlnKTsKKworCWlmKCFjb25maWd1cmVkKSB7CisJCXByaW50aygibmV0Y29uc29sZTogbm90IGNvbmZpZ3VyZWQsIGFib3J0aW5nXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYobmV0cG9sbF9zZXR1cCgmbnApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlZ2lzdGVyX2NvbnNvbGUoJm5ldGNvbnNvbGUpOworCXByaW50ayhLRVJOX0lORk8gIm5ldGNvbnNvbGU6IG5ldHdvcmsgbG9nZ2luZyBzdGFydGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cF9uZXRjb25zb2xlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9jb25zb2xlKCZuZXRjb25zb2xlKTsKKwluZXRwb2xsX2NsZWFudXAoJm5wKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9uZXRjb25zb2xlKTsKK21vZHVsZV9leGl0KGNsZWFudXBfbmV0Y29uc29sZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uaTUwMTAuYyBiL2RyaXZlcnMvbmV0L25pNTAxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYjAxYTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9uaTUwMTAuYwpAQCAtMCwwICsxLDgxMiBAQAorLyoJbmk1MDEwLmM6IEEgbmV0d29yayBkcml2ZXIgZm9yIHRoZSBNaUNvbS1JbnRlcmxhbiBOSTUwMTAgZXRoZXJjYXJkLgorICoKKyAqCUNvcHlyaWdodCAxOTk2LDE5OTcgSmFuLVBhc2NhbCB2YW4gQmVzdCBhbmQgQW5kcmVhcyBNb2hyLgorICoKKyAqCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogCVRoZSBhdXRob3JzIG1heSBiZSByZWFjaGVkIGFzOgorICoJCWp2YmVzdEB3aS5sZWlkZW51bml2Lm5sCQlhLm1vaHJAbWFpbHRvLmRlCisgKiAJb3IgYnkgc25haWwgbWFpbCBhcworICogCQlKYW4tUGFzY2FsIHZhbiBCZXN0CQlBbmRyZWFzIE1vaHIKKyAqCQlLbGlrc3BhYW53ZWcgNTgtNAkJU3RhdWZlcnN0ci4gNgorICoJCTIzMjQgTFogIExlaWRlbgkJCUQtNzEyNzIgUmVubmluZ2VuCisgKgkJVGhlIE5ldGhlcmxhbmRzCQkJR2VybWFueQorICoKKyAqCVNvdXJjZXM6CisgKiAJIAlEb25hbGQgQmVja2VyJ3MgInNrZWxldG9uLmMiCisgKiAgCQlDcnlud3Igbmk1MDEwIHBhY2tldCBkcml2ZXIKKyAqCisgKglDaGFuZ2VzOgorICoJCXYwLjA6IEZpcnN0IHRlc3QgdmVyc2lvbgorICoJCXYwLjE6IEZpcnN0IHdvcmtpbmcgdmVyc2lvbgorICoJCXYwLjI6CisgKgkJdjAuMy0+djAuOTA6IE5vdyBkZW1hbmQgc2V0dGluZyBpbyBhbmQgaXJxIHdoZW4gbG9hZGluZyBhcyBtb2R1bGUKKyAqCTk3MDQzMAl2MC45MTogbW9kaWZpZWQgZm9yIExpbnV4IDIuMS4xNAorICoJCXYwLjkyOiBJbXBsZW1lbnRlZCBBbmRyZWFzJyAoYmV0dGVyKSBOSTUwMTAgcHJvYmUKKyAqCTk3MDUwMwl2MC45MzogRml4ZWQgYXV0by1pcnEgZmFpbHVyZSBvbiB3YXJtIHJlYm9vdCAoSkIpCisgKgk5NzA2MjMJdjEuMDA6IEZpcnN0IGtlcm5lbCB2ZXJzaW9uIChBTSkKKyAqCTk3MDgxNAl2MS4wMTogQWRkZWQgZGV0ZWN0aW9uIG9mIG9uYm9hcmQgcmVjZWl2ZSBidWZmZXIgc2l6ZSAoQU0pCisgKglCdWdzOgorICoJCS0gTm9uZSBrbm93bi4uLgorICoJCS0gTm90ZSB0aGF0IHlvdSBoYXZlIHRvIHBhdGNoIGlmY29uZmlnIGZvciB0aGUgbmV3IC9wcm9jL25ldC9kZXYKKyAqCQlmb3JtYXQuIEl0IGdpdmVzIGluY29ycmVjdCBzdGF0cyBvdGhlcndpc2UuCisgKgorICoJVG8gZG86CisgKgkJRml4IGFsbCBidWdzIDotKQorICoJCU1vdmUgc29tZSBzdHVmZiB0byBjaGlwc2V0X2luaXQoKQorICoJCUhhbmRsZSB4bXQgZXJyb3JzIG90aGVyIHRoYW4gY29sbGlzaW9ucworICoJCUNvbXBsZXRlIG1lcmdlIHdpdGggQW5kcmVhcycgZHJpdmVyCisgKgkJSW1wbGVtZW50IHJpbmcgYnVmZmVycyAoSXMgdGhpcyB1c2VmdWw/IFlvdSBjYW4ndCBzcXVlZXplCisgKgkJCXRvbyBtYW55IHBhY2tldCBpbiBhIDJrIGJ1ZmZlciEpCisgKgkJSW1wbGVtZW50IERNQSAoQWdhaW4sIGlzIHRoaXMgdXNlZnVsPyBTb21lIGRvY3Mgc2F5cyBETUEgaXMKKyAqCQkJc2xvd2VyIHRoYW4gcHJvZ3JhbW1lZCBJL08pCisgKgorICoJQ29tcGlsZSB3aXRoOgorICoJCWdjYyAtTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLW00ODYgLURfX0tFUk5FTF9fIFwKKyAqCQkJLURNT0RVTEUgLWMgbmk1MDEwLmMgCisgKgorICoJSW5zZXJ0IHdpdGggZS5nLjoKKyAqCQlpbnNtb2Qgbmk1MDEwLm8gaW89MHgzMDAgaXJxPTUgCQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSAibmk1MDEwLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpib2FyZG5hbWUgPSAiTkk1MDEwIjsKK3N0YXRpYyBjaGFyICp2ZXJzaW9uID0KKwkibmk1MDEwLmM6IHYxLjAwIDA2LzIzLzk3IEphbi1QYXNjYWwgdmFuIEJlc3QgYW5kIEFuZHJlYXMgTW9oclxuIjsKKwkKKy8qIGJ1ZnNpemVfcmN2ID09IDAgbWVhbnMgYXV0b3Byb2JpbmcgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYnVmc2l6ZV9yY3Y7CisKKyNkZWZpbmUganVtcGVyZWRfaW50ZXJydXB0cwkvKiBJUlEgbGluZSBqdW1wZXJlZCBvbiBib2FyZCAqLworI3VuZGVmIGp1bXBlcmVkX2RtYQkJLyogTm8gRE1BIHVzZWQgKi8KKyN1bmRlZiBGVUxMX0lPREVURUNUCQkvKiBPbmx5IGRldGVjdCBpbiBwb3J0bGlzdCAqLworCisjaWZuZGVmIEZVTExfSU9ERVRFQ1QKKy8qIEEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgSS9PIGFkZHJlc3NlcyB0byBiZSBwcm9iZWQuICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBvcnRzW10gX19pbml0ZGF0YSA9CisJeyAweDMwMCwgMHgzMjAsIDB4MzQwLCAweDM2MCwgMHgzODAsIDB4M2EwLCAwIH07CisjZW5kaWYKKworLyogVXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgPjIgZm9yIGRlYnVnICovCisjaWZuZGVmIE5JNTAxMF9ERUJVRworI2RlZmluZSBOSTUwMTBfREVCVUcgMAorI2VuZGlmCisKKy8qIEluZm9ybWF0aW9uIHRoYXQgbmVlZHMgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4gKi8KK3N0cnVjdCBuaTUwMTBfbG9jYWwgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCWludCBvX3BrdF9zaXplOworCXNwaW5sb2NrX3QgbG9jazsKK307CisKKy8qIEluZGV4IHRvIGZ1bmN0aW9ucywgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4gKi8KKworc3RhdGljIGludAluaTUwMTBfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpOworc3RhdGljIGludAluaTUwMTBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJbmk1MDEwX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IG5pNTAxMF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZAluaTUwMTBfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAluaTUwMTBfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJbmk1MDEwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuaTUwMTBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgCW5pNTAxMF9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAlyZXNldF9yZWNlaXZlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGludAlwcm9jZXNzX3htdF9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZGVmaW5lIHR4X2RvbmUoZGV2KSAxCitzdGF0aWMgdm9pZAloYXJkd2FyZV9zZW5kX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBsZW5ndGgsIGludCBwYWQpOworc3RhdGljIHZvaWQgCWNoaXBzZXRfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhcnRwKTsKK3N0YXRpYyB2b2lkCWR1bXBfcGFja2V0KHZvaWQgKmJ1ZiwgaW50IGxlbik7CitzdGF0aWMgdm9pZCAJbmk1MDEwX3Nob3dfcmVnaXN0ZXJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgaW50IGlvOworc3RhdGljIGludCBpcnE7CisKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IG5pNTAxMF9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuaTUwMTBfbG9jYWwpKTsKKwlpbnQgKnBvcnQ7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwkJaW8gPSBkZXYtPmJhc2VfYWRkcjsKKwkJaXJxID0gZGV2LT5pcnE7CisJfQorCisJUFJJTlRLMigoS0VSTl9ERUJVRyAiJXM6IEVudGVyaW5nIG5pNTAxMF9wcm9iZVxuIiwgZGV2LT5uYW1lKSk7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZiAoaW8gPiAweDFmZikJewkvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCWVyciA9IG5pNTAxMF9wcm9iZTEoZGV2LCBpbyk7CisJfSBlbHNlIGlmIChpbyAhPSAwKSB7CS8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKwkJZXJyID0gLUVOWElPOworCX0gZWxzZSB7CisjaWZkZWYgRlVMTF9JT0RFVEVDVAorCQlmb3IgKGlvPTB4MjAwOyBpbzwweDQwMCAmJiBuaTUwMTBfcHJvYmUxKGRldiwgaW8pIDsgaW8rPTB4MjApCisJCQk7CisJCWlmIChpbyA9PSAweDQwMCkKKwkJCWVyciA9IC1FTk9ERVY7CisKKyNlbHNlCisJCWZvciAocG9ydCA9IHBvcnRzOyAqcG9ydCAmJiBuaTUwMTBfcHJvYmUxKGRldiwgKnBvcnQpOyBwb3J0KyspCisJCQk7CisJCWlmICghKnBvcnQpCisJCQllcnIgPSAtRU5PREVWOworI2VuZGlmCS8qIEZVTExfSU9ERVRFQ1QgKi8KKwl9CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBOSTUwMTBfSU9fRVhURU5UKTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJkX3BvcnQoaW50IGlvYWRkcikKK3sKKwlpbmIoSUVfUkJVRik7CisJcmV0dXJuIGluYihJRV9TQVBST00pOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgdHJpZ2dlcl9pcnEoaW50IGlvYWRkcikKK3sKKwkJb3V0YigweDAwLCBFRExDX1JFU0VUKTsJLyogQ2xlYXIgRURMQyBob2xkIFJFU0VUIHN0YXRlICovCisJCW91dGIoMHgwMCwgSUVfUkVTRVQpOwkvKiBCb2FyZCByZXNldCAqLworCQlvdXRiKDB4MDAsIEVETENfWE1BU0spOwkvKiBEaXNhYmxlIGFsbCBYbXQgaW50ZXJydXB0cyAqLworCQlvdXRiKDB4MDAsIEVETENfUk1BU0spOyAvKiBEaXNhYmxlIGFsbCBSY3YgaW50ZXJydXB0ICovCisJCW91dGIoMHhmZiwgRURMQ19YQ0xSKTsJLyogQ2xlYXIgYWxsIHBlbmRpbmcgWG10IGludGVycnVwdHMgKi8KKwkJb3V0YigweGZmLCBFRExDX1JDTFIpOwkvKiBDbGVhciBhbGwgcGVuZGluZyBSY3YgaW50ZXJydXB0cyAqLworCQkvKgorCQkgKiBUcmFuc21pdCBwYWNrZXQgbW9kZTogSWdub3JlIHBhcml0eSwgUG93ZXIgeGN2ciwKKwkJICogCUVuYWJsZSBsb29wYmFjaworCQkgKi8KKwkJb3V0YihYTURfSUdfUEFSIHwgWE1EX1RfTU9ERSB8IFhNRF9MQkMsIEVETENfWE1PREUpOworCQlvdXRiKFJNRF9CUk9BRENBU1QsIEVETENfUk1PREUpOyAvKiBSZWNlaXZlIG5vcm1hbCZicm9hZGNhc3QgKi8KKwkJb3V0YihYTV9BTEwsIEVETENfWE1BU0spOwkvKiBFbmFibGUgYWxsIFhtdCBpbnRlcnJ1cHRzICovCisJCXVkZWxheSg1MCk7CQkJLyogRklYTUU6IE5lY2Vzc2FyeT8gKi8KKwkJb3V0YihNTV9FTl9YTVR8TU1fTVVYLCBJRV9NTU9ERSk7IC8qIFN0YXJ0IHRyYW5zbWlzc2lvbiAqLworfQorCisvKgorICogICAgICBUaGlzIGlzIHRoZSByZWFsIHByb2JlIHJvdXRpbmUuICBMaW51eCBoYXMgYSBoaXN0b3J5IG9mIGZyaWVuZGx5IGRldmljZQorICogICAgICBwcm9iZXMgb24gdGhlIElTQSBidXMuICBBIGdvb2QgZGV2aWNlIHByb2JlcyBhdm9pZHMgZG9pbmcgd3JpdGVzLCBhbmQKKyAqICAgICAgdmVyaWZpZXMgdGhhdCB0aGUgY29ycmVjdCBkZXZpY2UgZXhpc3RzIGFuZCBmdW5jdGlvbnMuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgbmk1MDEwX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKQoreworCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7CisJc3RydWN0IG5pNTAxMF9sb2NhbCAqbHA7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGRhdGEgPSAwOworCWludCBib2d1c2NvdW50ID0gNDA7CisJaW50IGVyciA9IC1FTk9ERVY7CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwlkZXYtPmlycSA9IGlycTsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBOSTUwMTBfSU9fRVhURU5ULCBib2FyZG5hbWUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyoKKwkgKiBUaGlzIGlzIG5vICJvZmZpY2lhbCIgcHJvYmUgbWV0aG9kLCBJJ3ZlIHJhdGhlciB0ZXN0ZWQgd2hpY2gKKwkgKiBwcm9iZSB3b3JrcyBiZXN0IHdpdGggbXkgc2V2ZW4gTkk1MDEwIGNhcmRzCisJICogKHRoZXkgaGF2ZSB2ZXJ5IGRpZmZlcmVudCBzZXJpYWwgbnVtYmVycykKKwkgKiBTdWdnZXN0aW9ucyBvciBmYWlsdXJlIHJlcG9ydHMgYXJlIHZlcnksIHZlcnkgd2VsY29tZSAhCisJICogQnV0IEkgdGhpbmsgaXQgaXMgYSByZWxhdGl2ZWx5IGdvb2QgcHJvYmUgbWV0aG9kCisJICogc2luY2UgaXQgZG9lc24ndCB1c2UgYW55ICJvdXRiIgorCSAqIEl0IHNob3VsZCBiZSBuZWFybHkgMTAwJSByZWxpYWJsZSAhCisJICogd2VsbC1rbm93biBXQVJOSU5HOiB0aGlzIHByb2JlIG1ldGhvZCAobGlrZSBtYW55IG90aGVycykKKwkgKiB3aWxsIGhhbmcgdGhlIHN5c3RlbSBpZiBhIE5FMjAwMCBjYXJkIHJlZ2lvbiBpcyBwcm9iZWQgIQorCSAqCisJICogICAtIEFuZHJlYXMKKwkgKi8KKworIAlQUklOVEsyKChLRVJOX0RFQlVHICIlczogZW50ZXJpbmcgbmk1MDEwX3Byb2JlMSglIzN4KVxuIiwgCisgCQlkZXYtPm5hbWUsIGlvYWRkcikpOworCisJaWYgKGluYihpb2FkZHIrMCkgPT0gMHhmZikKKwkJZ290byBvdXQ7CisKKwl3aGlsZSAoIChyZF9wb3J0KGlvYWRkcikgJiByZF9wb3J0KGlvYWRkcikgJiByZF9wb3J0KGlvYWRkcikgJgorCQkgcmRfcG9ydChpb2FkZHIpICYgcmRfcG9ydChpb2FkZHIpICYgcmRfcG9ydChpb2FkZHIpKSAhPSAweGZmKQorCXsKKwkJaWYgKGJvZ3VzY291bnQtLSA9PSAwKQorCQkJZ290byBvdXQ7CisJfQorCisJUFJJTlRLMigoS0VSTl9ERUJVRyAiJXM6IEkvTyAjMSBwYXNzZWQhXG4iLCBkZXYtPm5hbWUpKTsKKworCWZvciAoaT0wOyBpPDMyOyBpKyspCisJCWlmICggKGRhdGEgPSByZF9wb3J0KGlvYWRkcikpICE9IDB4ZmYpIGJyZWFrOworCWlmIChkYXRhPT0weGZmKQorCQlnb3RvIG91dDsKKworCVBSSU5USzIoKEtFUk5fREVCVUcgIiVzOiBJL08gIzIgcGFzc2VkIVxuIiwgZGV2LT5uYW1lKSk7CisKKwlpZiAoKGRhdGEgIT0gU0FfQUREUjApIHx8IChyZF9wb3J0KGlvYWRkcikgIT0gU0FfQUREUjEpIHx8CisJICAgIChyZF9wb3J0KGlvYWRkcikgIT0gU0FfQUREUjIpKQorCQlnb3RvIG91dDsKKworCWZvciAoaT0wOyBpPDQ7IGkrKykKKwkJcmRfcG9ydChpb2FkZHIpOworCisJaWYgKCAocmRfcG9ydChpb2FkZHIpICE9IE5JNTAxMF9NQUdJQ1ZBTDEpIHx8CisJICAgICAocmRfcG9ydChpb2FkZHIpICE9IE5JNTAxMF9NQUdJQ1ZBTDIpICkKKwkJZ290byBvdXQ7CisKKwlQUklOVEsyKChLRVJOX0RFQlVHICIlczogSS9PICMzIHBhc3NlZCFcbiIsIGRldi0+bmFtZSkpOworCisJaWYgKE5JNTAxMF9ERUJVRyAmJiB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworCisJcHJpbnRrKCJOSTUwMTAgZXRoZXJjYXJkIHByb2JlIGF0IDB4JXg6ICIsIGlvYWRkcik7CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKworCWZvciAoaT0wOyBpPDY7IGkrKykgeworCQlvdXR3KGksIElFX0dQKTsKKwkJcHJpbnRrKCIlMi4yeCAiLCBkZXYtPmRldl9hZGRyW2ldID0gaW5iKElFX1NBUFJPTSkpOworCX0KKworCVBSSU5USzIoKEtFUk5fREVCVUcgIiVzOiBJL08gIzQgcGFzc2VkIVxuIiwgZGV2LT5uYW1lKSk7CisKKyNpZmRlZiBqdW1wZXJlZF9pbnRlcnJ1cHRzCisJaWYgKGRldi0+aXJxID09IDB4ZmYpCisJCTsKKwllbHNlIGlmIChkZXYtPmlycSA8IDIpIHsKKwkJdW5zaWduZWQgbG9uZyBpcnFfbWFzazsKKworCQlQUklOVEsyKChLRVJOX0RFQlVHICIlczogSS9PICM1IHBhc3NlZCFcbiIsIGRldi0+bmFtZSkpOworCisJCWlycV9tYXNrID0gcHJvYmVfaXJxX29uKCk7CisJCXRyaWdnZXJfaXJxKGlvYWRkcik7CisJCW1kZWxheSgyMCk7CisJCWRldi0+aXJxID0gcHJvYmVfaXJxX29mZihpcnFfbWFzayk7CisKKwkJUFJJTlRLMigoS0VSTl9ERUJVRyAiJXM6IEkvTyAjNiBwYXNzZWQhXG4iLCBkZXYtPm5hbWUpKTsKKworCQlpZiAoZGV2LT5pcnEgPT0gMCkgeworCQkJZXJyID0gLUVBR0FJTjsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBubyBJUlEgZm91bmQhXG4iLCBkZXYtPm5hbWUpOworCQkJZ290byBvdXQ7CisJCX0KKwkJUFJJTlRLMigoS0VSTl9ERUJVRyAiJXM6IEkvTyAjNyBwYXNzZWQhXG4iLCBkZXYtPm5hbWUpKTsKKwl9IGVsc2UgaWYgKGRldi0+aXJxID09IDIpIHsKKwkJZGV2LT5pcnEgPSA5OworCX0KKyNlbmRpZgkvKiBqdW1wZXJlZF9pcnEgKi8KKwlQUklOVEsyKChLRVJOX0RFQlVHICIlczogSS9PICM5IHBhc3NlZCFcbiIsIGRldi0+bmFtZSkpOworCisJLyogRE1BIGlzIG5vdCBzdXBwb3J0ZWQgKHlldD8pLCBzbyBubyB1c2UgZGV0ZWN0aW5nIGl0ICovCisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKworCVBSSU5USzIoKEtFUk5fREVCVUcgIiVzOiBJL08gIzEwIHBhc3NlZCFcbiIsIGRldi0+bmFtZSkpOworCisvKiBnZXQgdGhlIHNpemUgb2YgdGhlIG9uYm9hcmQgcmVjZWl2ZSBidWZmZXIKKyAqIGhpZ2hlciBhZGRyZXNzZXMgdGhhbiBidWZzaXplIGFyZSB3cmFwcGVkIGludG8gcmVhbCBidWZmZXIKKyAqIGkuZS4gZGF0YSBmb3Igb2Zmcy4gMHg4MDEgaXMgd3JpdHRlbiB0byAweDEgd2l0aCBhIDJLIG9uYm9hcmQgYnVmZmVyCisgKi8KKwlpZiAoIWJ1ZnNpemVfcmN2KSB7CisgICAgICAgIAlvdXRiKDEsIElFX01NT0RFKTsgICAgICAvKiBQdXQgUmN2IGJ1ZmZlciBvbiBzeXN0ZW0gYnVzICovCisgICAgICAgIAlvdXR3KDAsIElFX0dQKTsJCS8qIFBvaW50IEdQIGF0IHN0YXJ0IG9mIHBhY2tldCAqLworICAgICAgICAJb3V0YigwLCBJRV9SQlVGKTsJLyogc2V0IGJ1ZmZlciBieXRlIDAgdG8gMCAqLworICAgICAgICAJZm9yIChpID0gMTsgaSA8IDB4ZmY7IGkrKykgeworICAgICAgICAgICAgICAgIAlvdXR3KGkgPDwgOCwgSUVfR1ApOyAvKiBQb2ludCBHUCBhdCBwYWNrZXQgc2l6ZSB0byBiZSB0ZXN0ZWQgKi8KKyAgICAgICAgICAgICAgICAJb3V0YihpLCBJRV9SQlVGKTsKKyAgICAgICAgICAgICAgICAJb3V0dygweDAsIElFX0dQKTsgLyogUG9pbnQgR1AgYXQgc3RhcnQgb2YgcGFja2V0ICovCisgICAgICAgICAgICAgICAgCWRhdGEgPSBpbmIoSUVfUkJVRik7CisgICAgICAgICAgICAgICAgCWlmIChkYXRhID09IGkpIGJyZWFrOworICAgICAgICAJfQorCQlidWZzaXplX3JjdiA9IGkgPDwgODsKKyAgICAgICAgCW91dHcoMCwgSUVfR1ApOwkJLyogUG9pbnQgR1AgYXQgc3RhcnQgb2YgcGFja2V0ICovCisgICAgICAgIAlvdXRiKDAsIElFX1JCVUYpOwkvKiBzZXQgYnVmZmVyIGJ5dGUgMCB0byAwIGFnYWluICovCisJfQorICAgICAgICBwcmludGsoIi8vIGJ1ZnNpemUgcmN2L3htdD0lZC8lZFxuIiwgYnVmc2l6ZV9yY3YsIE5JNTAxMF9CVUZTSVpFKTsKKwltZW1zZXQoZGV2LT5wcml2LCAwLCBzaXplb2Yoc3RydWN0IG5pNTAxMF9sb2NhbCkpOworCQorCWRldi0+b3BlbgkJPSBuaTUwMTBfb3BlbjsKKwlkZXYtPnN0b3AJCT0gbmk1MDEwX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gbmk1MDEwX3NlbmRfcGFja2V0OworCWRldi0+Z2V0X3N0YXRzCQk9IG5pNTAxMF9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBuaTUwMTBfc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+dHhfdGltZW91dAkJPSBuaTUwMTBfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gSFovMjA7CisKKwlkZXYtPmZsYWdzICY9IH5JRkZfTVVMVElDQVNUOwkvKiBNdWx0aWNhc3QgZG9lc24ndCB3b3JrICovCisKKwkvKiBTaHV0IHVwIHRoZSBuaTUwMTAgKi8KKwlvdXRiKDAsIEVETENfUk1BU0spOwkvKiBNYXNrIGFsbCByZWNlaXZlIGludGVycnVwdHMgKi8KKwlvdXRiKDAsIEVETENfWE1BU0spOwkvKiBNYXNrIGFsbCB4bWl0IGludGVycnVwdHMgKi8KKwlvdXRiKDB4ZmYsIEVETENfUkNMUik7CS8qIEtpbGwgYWxsIHBlbmRpbmcgcmN2IGludGVycnVwdHMgKi8KKwlvdXRiKDB4ZmYsIEVETENfWENMUik7IAkvKiBLaWxsIGFsbCBwZW5kaW5nIHhtdCBpbnRlcnJ1cHRzICovCisKKwlwcmludGsoS0VSTl9JTkZPICIlczogTkk1MDEwIGZvdW5kIGF0IDB4JXgsIHVzaW5nIElSUSAlZCIsIGRldi0+bmFtZSwgaW9hZGRyLCBkZXYtPmlycSk7CisJaWYgKGRldi0+ZG1hKSBwcmludGsoIiAmIERNQSAlZCIsIGRldi0+ZG1hKTsKKwlwcmludGsoIi5cbiIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSm9pbiB0aGUgTkk1MDEwIGRyaXZlciBkZXZlbG9wbWVudCB0ZWFtIVxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiTWFpbCB0byBhLm1vaHJAbWFpbHRvLmRlIG9yIGp2YmVzdEB3aS5sZWlkZW51bml2Lm5sXG4iKTsKKwlyZXR1cm4gMDsKK291dDoKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTkk1MDEwX0lPX0VYVEVOVCk7CisJcmV0dXJuIGVycjsKK30KKworLyogCisgKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiAgVGhpcyBpcyBjYWxsZWQgKGluIHRoZSBjdXJyZW50IGtlcm5lbCkKKyAqIHNvbWV0aW1lIGFmdGVyIGJvb3Rpbmcgd2hlbiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KKyAqCisgKiBUaGlzIHJvdXRpbmUgc2hvdWxkIHNldCBldmVyeXRoaW5nIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuCisgKiByZWdpc3RlcnMgdGhhdCAic2hvdWxkIiBvbmx5IG5lZWQgdG8gYmUgc2V0IG9uY2UgYXQgYm9vdCwgc28gdGhhdAorICogdGhlcmUgaXMgbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAqLworICAgCitzdGF0aWMgaW50IG5pNTAxMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpOworCisJUFJJTlRLMigoS0VSTl9ERUJVRyAiJXM6IGVudGVyaW5nIG5pNTAxMF9vcGVuKClcbiIsIGRldi0+bmFtZSkpOyAKKwkKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICZuaTUwMTBfaW50ZXJydXB0LCAwLCBib2FyZG5hbWUsIGRldikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENhbm5vdCBnZXQgaXJxICUjMnhcbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJUFJJTlRLMygoS0VSTl9ERUJVRyAiJXM6IHBhc3NlZCBvcGVuKCkgIzFcbiIsIGRldi0+bmFtZSkpOworICAgICAgICAvKgorICAgICAgICAgKiBBbHdheXMgYWxsb2NhdGUgdGhlIERNQSBjaGFubmVsIGFmdGVyIHRoZSBJUlEsCisgICAgICAgICAqIGFuZCBjbGVhbiB1cCBvbiBmYWlsdXJlLgorICAgICAgICAgKi8KKyNpZmRlZiBqdW1wZXJlZF9kbWEKKyAgICAgICAgaWYgKHJlcXVlc3RfZG1hKGRldi0+ZG1hLCBjYXJkbmFtZSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENhbm5vdCBnZXQgZG1hICUjMnhcbiIsIGRldi0+bmFtZSwgZGV2LT5kbWEpOworICAgICAgICAgICAgICAgIGZyZWVfaXJxKGRldi0+aXJxLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICAgICAgfQorI2VuZGlmCS8qIGp1bXBlcmVkX2RtYSAqLworCisJUFJJTlRLMygoS0VSTl9ERUJVRyAiJXM6IHBhc3NlZCBvcGVuKCkgIzJcbiIsIGRldi0+bmFtZSkpOworCS8qIFJlc2V0IHRoZSBoYXJkd2FyZSBoZXJlLiAgRG9uJ3QgZm9yZ2V0IHRvIHNldCB0aGUgc3RhdGlvbiBhZGRyZXNzLiAqLworCisJb3V0YihSU19SRVNFVCwgRURMQ19SRVNFVCk7CS8qIEhvbGQgdXAgRURMQ19SRVNFVCB3aGlsZSBjb25maWdpbmcgYm9hcmQgKi8KKwlvdXRiKDAsIElFX1JFU0VUKTsJCS8qIEhhcmR3YXJlIHJlc2V0IG9mIG5pNTAxMCBib2FyZCAqLworCW91dGIoWE1EX0xCQywgRURMQ19YTU9ERSk7CS8qIE9ubHkgbG9vcGJhY2sgeG1pdHMgKi8KKworCVBSSU5USzMoKEtFUk5fREVCVUcgIiVzOiBwYXNzZWQgb3BlbigpICMzXG4iLCBkZXYtPm5hbWUpKTsKKwkvKiBTZXQgdGhlIHN0YXRpb24gYWRkcmVzcyAqLworCWZvcihpID0gMDtpIDwgNjsgaSsrKSB7CisJCW91dGIoZGV2LT5kZXZfYWRkcltpXSwgRURMQ19BRERSICsgaSk7CisJfQorCQorCVBSSU5USzMoKEtFUk5fREVCVUcgIiVzOiBJbml0aWFsaXNpbmcgbmk1MDEwXG4iLCBkZXYtPm5hbWUpKTsgCisJb3V0YigwLCBFRExDX1hNQVNLKTsJLyogTm8geG1pdCBpbnRlcnJ1cHRzIGZvciBub3cgKi8KKwlvdXRiKFhNRF9JR19QQVIgfCBYTURfVF9NT0RFIHwgWE1EX0xCQywgRURMQ19YTU9ERSk7IAorCQkJCS8qIE5vcm1hbCBwYWNrZXQgeG1pdCBtb2RlICovCisJb3V0YigweGZmLCBFRExDX1hDTFIpOwkvKiBDbGVhciBhbGwgcGVuZGluZyB4bWl0IGludGVycnVwdHMgKi8KKwlvdXRiKFJNRF9CUk9BRENBU1QsIEVETENfUk1PREUpOworCQkJCS8qIFJlY2VpdmUgYnJvYWRjYXN0IGFuZCBub3JtYWwgcGFja2V0cyAqLworCXJlc2V0X3JlY2VpdmVyKGRldik7CS8qIFJlYWR5IG5pNTAxMCBmb3IgcmVjZWl2aW5nIHBhY2tldHMgKi8KKwkKKwlvdXRiKDAsIEVETENfUkVTRVQpOwkvKiBVbi1yZXNldCB0aGUgbmk1MDEwICovCisJCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJCisJaWYgKE5JNTAxMF9ERUJVRykgbmk1MDEwX3Nob3dfcmVnaXN0ZXJzKGRldik7IAorCisJUFJJTlRLKChLRVJOX0RFQlVHICIlczogb3BlbiBzdWNjZXNzZnVsXG4iLCBkZXYtPm5hbWUpKTsKKyAgICAgCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZXNldF9yZWNlaXZlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwkKKwlQUklOVEszKChLRVJOX0RFQlVHICIlczogcmVzZXR0aW5nIHJlY2VpdmVyXG4iLCBkZXYtPm5hbWUpKTsKKwlvdXR3KDAsIElFX0dQKTsJCS8qIFJlY2VpdmUgcGFja2V0IGF0IHN0YXJ0IG9mIGJ1ZmZlciAqLworCW91dGIoMHhmZiwgRURMQ19SQ0xSKTsJLyogQ2xlYXIgYWxsIHBlbmRpbmcgcmN2IGludGVycnVwdHMgKi8KKwlvdXRiKDAsIElFX01NT0RFKTsJLyogUHV0IEVETEMgdG8gcmN2IGJ1ZmZlciAqLworCW91dGIoTU1fRU5fUkNWLCBJRV9NTU9ERSk7IC8qIEVuYWJsZSByY3YgKi8KKwlvdXRiKDB4ZmYsIEVETENfUk1BU0spOwkvKiBFbmFibGUgYWxsIHJjdiBpbnRlcnJ1cHRzICovCit9CisKK3N0YXRpYyB2b2lkIG5pNTAxMF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgJXM/XG4iLCBkZXYtPm5hbWUsCisJCSAgIHR4X2RvbmUoZGV2KSA/ICJJUlEgY29uZmxpY3QiIDogIm5ldHdvcmsgY2FibGUgcHJvYmxlbSIpOworCS8qIFRyeSB0byByZXN0YXJ0IHRoZSBhZGFwdG9yLiAqLworCS8qIEZJWE1FOiBHaXZlIGl0IGEgcmVhbCBraWNrIGhlcmUgKi8KKwljaGlwc2V0X2luaXQoZGV2LCAxKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyBpbnQgbmk1MDEwX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGxlbmd0aCA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOworCisJUFJJTlRLMigoS0VSTl9ERUJVRyAiJXM6IGVudGVyaW5nIG5pNTAxMF9zZW5kX3BhY2tldFxuIiwgZGV2LT5uYW1lKSk7CisKKwkvKiAKKyAgICAgICAgICogQmxvY2sgc2VuZGluZworCSAqLworCQorCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwloYXJkd2FyZV9zZW5kX3BhY2tldChkZXYsICh1bnNpZ25lZCBjaGFyICopc2tiLT5kYXRhLCBza2ItPmxlbiwgbGVuZ3RoLXNrYi0+bGVuKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlkZXZfa2ZyZWVfc2tiIChza2IpOworCXJldHVybiAwOworfQorCisvKiAKKyAqIFRoZSB0eXBpY2FsIHdvcmtsb2FkIG9mIHRoZSBkcml2ZXI6CisgKiBIYW5kbGUgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGludGVycnVwdHMuIAorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgbmk1MDEwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IG5pNTAxMF9sb2NhbCAqbHA7CisJaW50IGlvYWRkciwgc3RhdHVzOworCWludCB4bWl0X3dhc19lcnJvciA9IDA7CisKKwlQUklOVEsyKChLRVJOX0RFQlVHICIlczogZW50ZXJpbmcgbmk1MDEwX2ludGVycnVwdFxuIiwgZGV2LT5uYW1lKSk7CisKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisJCisJc3Bpbl9sb2NrKCZscC0+bG9jayk7CisJc3RhdHVzID0gaW5iKElFX0lTVEFUKTsgCisJUFJJTlRLMygoS0VSTl9ERUJVRyAiJXM6IElFX0lTVEFUID0gJSMwMnhcbiIsIGRldi0+bmFtZSwgc3RhdHVzKSk7CisJCQorICAgICAgICBpZiAoKHN0YXR1cyAmIElTX1JfSU5UKSA9PSAwKSBuaTUwMTBfcngoZGV2KTsKKworICAgICAgICBpZiAoKHN0YXR1cyAmIElTX1hfSU5UKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgeG1pdF93YXNfZXJyb3IgPSBwcm9jZXNzX3htdF9pbnRlcnJ1cHQoZGV2KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoc3RhdHVzICYgSVNfRE1BX0lOVCkgPT0gMCkgeworICAgICAgICAgICAgICAgIFBSSU5USygoS0VSTl9ERUJVRyAiJXM6IERNQSBjb21wbGV0ZSAoPylcbiIsIGRldi0+bmFtZSkpOworICAgICAgICAgICAgICAgIG91dGIoMCwgSUVfRE1BX1JTVCk7IC8qIFJlc2V0IERNQSBpbnQgKi8KKyAgICAgICAgfQorCisJaWYgKCF4bWl0X3dhc19lcnJvcikgCisJCXJlc2V0X3JlY2VpdmVyKGRldik7IAorCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKK3N0YXRpYyB2b2lkIGR1bXBfcGFja2V0KHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgaTsKKwkKKwlwcmludGsoS0VSTl9ERUJVRyAiUGFja2V0IGxlbmd0aCA9ICUjNHhcbiIsIGxlbik7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKXsKKwkJaWYgKGkgJSAxNiA9PSAwKSBwcmludGsoS0VSTl9ERUJVRyAiJSM0LjR4IiwgaSk7CisJCWlmIChpICUgMiA9PSAwKSBwcmludGsoIiAiKTsKKwkJcHJpbnRrKCIlMi4yeCIsICgodW5zaWduZWQgY2hhciAqKWJ1ZilbaV0pOworCQlpZiAoaSAlIDE2ID09IDE1KSBwcmludGsoIlxuIik7CisJfQorCXByaW50aygiXG4iKTsKKwkKKwlyZXR1cm47Cit9CisKKy8qIFdlIGhhdmUgYSBnb29kIHBhY2tldCwgZ2V0IGl0IG91dCBvZiB0aGUgYnVmZmVyLiAqLworc3RhdGljIHZvaWQgbmk1MDEwX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5pNTAxMF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBjaGFyIHJjdl9zdGF0OworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGlfcGt0X3NpemU7CisJCisJUFJJTlRLMigoS0VSTl9ERUJVRyAiJXM6IGVudGVyaW5nIG5pNTAxMF9yeCgpXG4iLCBkZXYtPm5hbWUpKTsgCisJCisJcmN2X3N0YXQgPSBpbmIoRURMQ19SU1RBVCk7CisJUFJJTlRLMygoS0VSTl9ERUJVRyAiJXM6IEVETENfUlNUQVQgPSAlIzJ4XG4iLCBkZXYtPm5hbWUsIHJjdl9zdGF0KSk7IAorCQorCWlmICggKHJjdl9zdGF0ICYgUlNfVkFMSURfQklUUykgIT0gUlNfUEtUX09LKSB7CisJCVBSSU5USygoS0VSTl9JTkZPICIlczogcmVjZWl2ZSBlcnJvci5cbiIsIGRldi0+bmFtZSkpOworCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCWlmIChyY3Zfc3RhdCAmIFJTX1JVTlQpIGxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCWlmIChyY3Zfc3RhdCAmIFJTX0FMSUdOKSBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCWlmIChyY3Zfc3RhdCAmIFJTX0NSQ19FUlIpIGxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCWlmIChyY3Zfc3RhdCAmIFJTX09GTFcpIGxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworICAgICAgICAJb3V0YigweGZmLCBFRExDX1JDTFIpOyAvKiBDbGVhciB0aGUgaW50ZXJydXB0ICovCisJCXJldHVybjsKKwl9CisJCisgICAgICAgIG91dGIoMHhmZiwgRURMQ19SQ0xSKTsgIC8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KKworCWlfcGt0X3NpemUgPSBpbncoSUVfUkNOVCk7CisJaWYgKGlfcGt0X3NpemUgPiBFVEhfRlJBTUVfTEVOIHx8IGlfcGt0X3NpemUgPCAxMCApIHsKKwkJUFJJTlRLKChLRVJOX0RFQlVHICIlczogUGFja2V0IHNpemUgZXJyb3IsIHBhY2tldCBzaXplID0gJSM0LjR4XG4iLCAKKwkJCWRldi0+bmFtZSwgaV9wa3Rfc2l6ZSkpOworCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCWxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCXJldHVybjsKKwl9CisKKwkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlci4gKi8KKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGlfcGt0X3NpemUgKyAzKTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCQorCXNrYi0+ZGV2ID0gZGV2OworCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJCisJLyogUmVhZCBwYWNrZXQgaW50byBidWZmZXIgKi8KKyAgICAgICAgb3V0YihNTV9NVVgsIElFX01NT0RFKTsgLyogUmN2IGJ1ZmZlciB0byBzeXN0ZW0gYnVzICovCisJb3V0dygwLCBJRV9HUCk7CS8qIFNlZWsgdG8gYmVnaW5uaW5nIG9mIHBhY2tldCAqLworCWluc2IoSUVfUkJVRiwgc2tiX3B1dChza2IsIGlfcGt0X3NpemUpLCBpX3BrdF9zaXplKTsgCisJCisJaWYgKE5JNTAxMF9ERUJVRyA+PSA0KSAKKwkJZHVtcF9wYWNrZXQoc2tiLT5kYXRhLCBza2ItPmxlbik7IAorCQkKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJbmV0aWZfcngoc2tiKTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IGlfcGt0X3NpemU7CisKKwlQUklOVEsyKChLRVJOX0RFQlVHICIlczogUmVjZWl2ZWQgcGFja2V0LCBzaXplPSUjNC40eFxuIiwgCisJCWRldi0+bmFtZSwgaV9wa3Rfc2l6ZSkpOworCQorfQorCitzdGF0aWMgaW50IHByb2Nlc3NfeG10X2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuaTUwMTBfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IHhtaXRfc3RhdDsKKworCVBSSU5USzIoKEtFUk5fREVCVUcgIiVzOiBlbnRlcmluZyBwcm9jZXNzX3htdF9pbnRlcnJ1cHRcbiIsIGRldi0+bmFtZSkpOworCisJeG1pdF9zdGF0ID0gaW5iKEVETENfWFNUQVQpOworCVBSSU5USzMoKEtFUk5fREVCVUcgIiVzOiBFRExDX1hTVEFUID0gJTIuMnhcbiIsIGRldi0+bmFtZSwgeG1pdF9zdGF0KSk7CisJCisJb3V0YigwLCBFRExDX1hNQVNLKTsJLyogRGlzYWJsZSB4bWl0IElSUSdzICovCisJb3V0YigweGZmLCBFRExDX1hDTFIpOwkvKiBDbGVhciBhbGwgcGVuZGluZyB4bWl0IElSUSdzICovCisJCisJaWYgKHhtaXRfc3RhdCAmIFhTX0NPTEwpeworCQlQUklOVEsoKEtFUk5fREVCVUcgIiVzOiBjb2xsaXNpb24gZGV0ZWN0ZWQsIHJldHJhbnNtaXR0aW5nXG4iLCAKKwkJCWRldi0+bmFtZSkpOworCQlvdXR3KE5JNTAxMF9CVUZTSVpFIC0gbHAtPm9fcGt0X3NpemUsIElFX0dQKTsKKwkJLyogb3V0YigwLCBJRV9NTU9ERSk7ICovIC8qIHhtdCBidWYgb24gc3lzYnVzIEZJWE1FOiBuZWVkZWQgPyAqLworCQlvdXRiKE1NX0VOX1hNVCB8IE1NX01VWCwgSUVfTU1PREUpOworCQlvdXRiKFhNX0FMTCwgRURMQ19YTUFTSyk7IC8qIEVuYWJsZSB4bXQgSVJRJ3MgKi8KKwkJbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogRklYTUU6IGhhbmRsZSBvdGhlciB4bXQgZXJyb3IgY29uZGl0aW9ucyAqLworCisJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlscC0+c3RhdHMudHhfYnl0ZXMgKz0gbHAtPm9fcGt0X3NpemU7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJCisJUFJJTlRLMigoS0VSTl9ERUJVRyAiJXM6IHNlbnQgcGFja2V0LCBzaXplPSUjNC40eFxuIiwgCisJCWRldi0+bmFtZSwgbHAtPm9fcGt0X3NpemUpKTsKKworCXJldHVybiAwOworfQorCisvKiBUaGUgaW52ZXJzZSByb3V0aW5lIHRvIG5pNTAxMF9vcGVuKCkuICovCitzdGF0aWMgaW50IG5pNTAxMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCVBSSU5USzIoKEtFUk5fREVCVUcgIiVzOiBlbnRlcmluZyBuaTUwMTBfY2xvc2VcbiIsIGRldi0+bmFtZSkpOworI2lmZGVmIGp1bXBlcmVkX2ludGVycnVwdHMJCisJZnJlZV9pcnEoZGV2LT5pcnEsIE5VTEwpOworI2VuZGlmCisJLyogUHV0IGNhcmQgaW4gaGVsZC1SRVNFVCBzdGF0ZSAqLworCW91dGIoMCwgSUVfTU1PREUpOworCW91dGIoUlNfUkVTRVQsIEVETENfUkVTRVQpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCVBSSU5USygoS0VSTl9ERUJVRyAiJXM6ICVzIGNsb3NlZCBkb3duXG4iLCBkZXYtPm5hbWUsIGJvYXJkbmFtZSkpOworCXJldHVybiAwOworCit9CisKKy8qIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLglUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY2FyZCBvcGVuIG9yCisgICBjbG9zZWQuICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5pNTAxMF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgbmk1MDEwX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlQUklOVEsyKChLRVJOX0RFQlVHICIlczogZW50ZXJpbmcgbmk1MDEwX2dldF9zdGF0c1xuIiwgZGV2LT5uYW1lKSk7CisJCisJaWYgKE5JNTAxMF9ERUJVRykgbmk1MDEwX3Nob3dfcmVnaXN0ZXJzKGRldik7CisJCisJLyogY2xpKCk7ICovCisJLyogVXBkYXRlIHRoZSBzdGF0aXN0aWNzIGZyb20gdGhlIGRldmljZSByZWdpc3RlcnMuICovCisJLyogV2UgZG8gdGhpcyBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwkvKiBzdGkoKTsgKi8KKworCXJldHVybiAmbHAtPnN0YXRzOworfQorCisvKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAgIG51bV9hZGRycyA9PSAtMSAgICAgIFByb21pc2N1b3VzIG1vZGUsIHJlY2VpdmUgYWxsIHBhY2tldHMKKyAgIG51bV9hZGRycyA9PSAwICAgICAgIE5vcm1hbCBtb2RlLCBjbGVhciBtdWx0aWNhc3QgbGlzdAorICAgbnVtX2FkZHJzID4gMCAgICAgICAgTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLCBhbmQgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QtZWZmb3J0IGZpbHRlcmluZy4KKyovCitzdGF0aWMgdm9pZCBuaTUwMTBfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7ICAKKworCVBSSU5USzIoKEtFUk5fREVCVUcgIiVzOiBlbnRlcmluZyBzZXRfbXVsdGljYXN0X2xpc3RcbiIsIGRldi0+bmFtZSkpOworCisJaWYgKGRldi0+ZmxhZ3MmSUZGX1BST01JU0MgfHwgZGV2LT5mbGFncyZJRkZfQUxMTVVMVEkpIHsKKwkJZGV2LT5mbGFncyB8PSBJRkZfUFJPTUlTQzsKKwkJb3V0YihSTURfUFJPTUlTQywgRURMQ19STU9ERSk7IC8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCisJCVBSSU5USygoS0VSTl9ERUJVRyAiJXM6IEVudGVyaW5nIHByb21pc2N1b3VzIG1vZGVcbiIsIGRldi0+bmFtZSkpOworCX0gZWxzZSBpZiAoZGV2LT5tY19saXN0KSB7CisJCS8qIFNvcnJ5LCBtdWx0aWNhc3Qgbm90IHN1cHBvcnRlZCAqLworCQlQUklOVEsoKEtFUk5fREVCVUcgIiVzOiBObyBtdWx0aWNhc3QsIGVudGVyaW5nIGJyb2FkY2FzdCBtb2RlXG4iLCBkZXYtPm5hbWUpKTsKKwkJb3V0YihSTURfQlJPQURDQVNULCBFRExDX1JNT0RFKTsKKwl9IGVsc2UgeworCQlQUklOVEsoKEtFUk5fREVCVUcgIiVzOiBFbnRlcmluZyBicm9hZGNhc3QgbW9kZVxuIiwgZGV2LT5uYW1lKSk7CisJCW91dGIoUk1EX0JST0FEQ0FTVCwgRURMQ19STU9ERSk7ICAvKiBEaXNhYmxlIHByb21pc2N1b3VzIG1vZGUsIHVzZSBub3JtYWwgbW9kZSAqLworCX0KK30KKworc3RhdGljIHZvaWQgaGFyZHdhcmVfc2VuZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbGVuZ3RoLCBpbnQgcGFkKQoreworCXN0cnVjdCBuaTUwMTBfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgYnVmX29mZnM7CisKKwlQUklOVEsyKChLRVJOX0RFQlVHICIlczogZW50ZXJpbmcgaGFyZHdhcmVfc2VuZF9wYWNrZXRcbiIsIGRldi0+bmFtZSkpOworCQorICAgICAgICBpZiAobGVuZ3RoID4gRVRIX0ZSQU1FX0xFTikgeworICAgICAgICAgICAgICAgIFBSSU5USygoS0VSTl9XQVJOSU5HICIlczogcGFja2V0IHRvbyBsYXJnZSwgbm90IHBvc3NpYmxlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKwlpZiAoTkk1MDEwX0RFQlVHKSBuaTUwMTBfc2hvd19yZWdpc3RlcnMoZGV2KTsKKworCWlmIChpbmIoSUVfSVNUQVQpICYgSVNfRU5fWE1UKSB7CisJCVBSSU5USygoS0VSTl9XQVJOSU5HICIlczogc2VuZGluZyBwYWNrZXQgd2hpbGUgYWxyZWFkeSB0cmFuc21pdHRpbmcsIG5vdCBwb3NzaWJsZVxuIiwgCisJCQlkZXYtPm5hbWUpKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoTkk1MDEwX0RFQlVHID4gMykgZHVtcF9wYWNrZXQoYnVmLCBsZW5ndGgpOworCisJYnVmX29mZnMgPSBOSTUwMTBfQlVGU0laRSAtIGxlbmd0aCAtIHBhZDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCWxwLT5vX3BrdF9zaXplID0gbGVuZ3RoICsgcGFkOworCisJb3V0YigwLCBFRExDX1JNQVNLKTsJLyogTWFzayBhbGwgcmVjZWl2ZSBpbnRlcnJ1cHRzICovCisJb3V0YigwLCBJRV9NTU9ERSk7CS8qIFB1dCBYbWl0IGJ1ZmZlciBvbiBzeXN0ZW0gYnVzICovCisJb3V0YigweGZmLCBFRExDX1JDTFIpOwkvKiBDbGVhciBvdXQgcGVuZGluZyByY3YgaW50ZXJydXB0cyAqLworCisJb3V0dyhidWZfb2ZmcywgSUVfR1ApOyAvKiBQb2ludCBHUCBhdCBzdGFydCBvZiBwYWNrZXQgKi8KKwlvdXRzYihJRV9YQlVGLCBidWYsIGxlbmd0aCk7IC8qIFB1dCBkYXRhIGluIGJ1ZmZlciAqLworCXdoaWxlKHBhZC0tKQorCQlvdXRiKDAsIElFX1hCVUYpOworCQkKKwlvdXR3KGJ1Zl9vZmZzLCBJRV9HUCk7IC8qIFJld3JpdGUgd2hlcmUgcGFja2V0IHN0YXJ0cyAqLworCisJLyogc2hvdWxkIHdvcmsgd2l0aG91dCB0aGF0IG91dGIoKSAoQ3J5bndyIHVzZWQgaXQpICovCisJLypvdXRiKE1NX01VWCwgSUVfTU1PREUpOyovIC8qIFhtdCBidWZmZXIgdG8gRURMQyBidXMgKi8KKwlvdXRiKE1NX0VOX1hNVCB8IE1NX01VWCwgSUVfTU1PREUpOyAvKiBCZWdpbiB0cmFuc21pc3Npb24gKi8KKwlvdXRiKFhNX0FMTCwgRURMQ19YTUFTSyk7IC8qIENhdXNlIGludGVycnVwdCBhZnRlciBjb21wbGV0aW9uIG9yIGZhaWwgKi8KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCisJaWYgKE5JNTAxMF9ERUJVRykgbmk1MDEwX3Nob3dfcmVnaXN0ZXJzKGRldik7CQorfQorCitzdGF0aWMgdm9pZCBjaGlwc2V0X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXJ0cCkKK3sKKwkvKiBGSVhNRTogTW92ZSBzb21lIHN0dWZmIGhlcmUgKi8KKwlQUklOVEszKChLRVJOX0RFQlVHICIlczogZG9pbmcgTk9USElORyBpbiBjaGlwc2V0X2luaXRcbiIsIGRldi0+bmFtZSkpOworfQorCitzdGF0aWMgdm9pZCBuaTUwMTBfc2hvd19yZWdpc3RlcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJCisJUFJJTlRLMygoS0VSTl9ERUJVRyAiJXM6IFhTVEFUICUjMi4yeFxuIiwgZGV2LT5uYW1lLCBpbmIoRURMQ19YU1RBVCkpKTsKKwlQUklOVEszKChLRVJOX0RFQlVHICIlczogWE1BU0sgJSMyLjJ4XG4iLCBkZXYtPm5hbWUsIGluYihFRExDX1hNQVNLKSkpOworCVBSSU5USzMoKEtFUk5fREVCVUcgIiVzOiBSU1RBVCAlIzIuMnhcbiIsIGRldi0+bmFtZSwgaW5iKEVETENfUlNUQVQpKSk7CisJUFJJTlRLMygoS0VSTl9ERUJVRyAiJXM6IFJNQVNLICUjMi4yeFxuIiwgZGV2LT5uYW1lLCBpbmIoRURMQ19STUFTSykpKTsKKwlQUklOVEszKChLRVJOX0RFQlVHICIlczogUk1PREUgJSMyLjJ4XG4iLCBkZXYtPm5hbWUsIGluYihFRExDX1JNT0RFKSkpOworCVBSSU5USzMoKEtFUk5fREVCVUcgIiVzOiBYTU9ERSAlIzIuMnhcbiIsIGRldi0+bmFtZSwgaW5iKEVETENfWE1PREUpKSk7CisJUFJJTlRLMygoS0VSTl9ERUJVRyAiJXM6IElTVEFUICUjMi4yeFxuIiwgZGV2LT5uYW1lLCBpbmIoSUVfSVNUQVQpKSk7Cit9CisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X25pNTAxMDsKKworTU9EVUxFX1BBUk0oaW8sICJpIik7CitNT0RVTEVfUEFSTShpcnEsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAibmk1MDEwIEkvTyBiYXNlIGFkZHJlc3MiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAibmk1MDEwIElSUSBudW1iZXIiKTsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJUFJJTlRLMigoS0VSTl9ERUJVRyAiJXM6IGVudGVyaW5nIGluaXRfbW9kdWxlXG4iLCBib2FyZG5hbWUpKTsKKwkvKgorCWlmKGlvIDw9IDAgfHwgaXJxID09IDApeworCSAgIAlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQXV0b3Byb2Jpbmcgbm90IGFsbG93ZWQgZm9yIG1vZHVsZXMuXG4iLCBib2FyZG5hbWUpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogU2V0IHN5bWJvbHMgJ2lvJyBhbmQgJ2lycSdcbiIsIGJvYXJkbmFtZSk7CisJICAgCXJldHVybiAtRUlOVkFMOworCX0KKwkqLworCWlmIChpbyA8PSAwKXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEF1dG9wcm9iaW5nIGZvciBtb2R1bGVzIGlzIGhhemFyZG91cywgdHJ5aW5nIGFueXdheS4uXG4iLCBib2FyZG5hbWUpOworCX0KKworCVBSSU5USzIoKEtFUk5fREVCVUcgIiVzOiBpbml0X21vZHVsZSBpcnE9JSMyeCwgaW89JSMzeFxuIiwgYm9hcmRuYW1lLCBpcnEsIGlvKSk7CisJZGV2X25pNTAxMCA9IG5pNTAxMF9wcm9iZSgtMSk7CisJaWYgKElTX0VSUihkZXZfbmk1MDEwKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGV2X25pNTAxMCk7CisgICAgICAgIHJldHVybiAwOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJUFJJTlRLMigoS0VSTl9ERUJVRyAiJXM6IGVudGVyaW5nIGNsZWFudXBfbW9kdWxlXG4iLCBib2FyZG5hbWUpKTsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXZfbmk1MDEwKTsKKwlyZWxlYXNlX3JlZ2lvbihkZXZfbmk1MDEwLT5iYXNlX2FkZHIsIE5JNTAxMF9JT19FWFRFTlQpOworCWZyZWVfbmV0ZGV2KGRldl9uaTUwMTApOworfQorI2VuZGlmIC8qIE1PRFVMRSAqLworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRF9fS0VSTkVMX18gLUkvdXNyL3NyYy9saW51eC9uZXQvaW5ldCAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtbTQ4NiAtYyBuaTUwMTAuYyIKKyAqICB2ZXJzaW9uLWNvbnRyb2w6IHQKKyAqICBrZXB0LW5ldy12ZXJzaW9uczogNQorICogIHRhYi13aWR0aDogNAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uaTUwMTAuaCBiL2RyaXZlcnMvbmV0L25pNTAxMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMGU3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9uaTUwMTAuaApAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIFJhY2FsLUludGVybGFuIG5pNTAxMCBFdGhlcm5ldCBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBMaW51eCBvcGVyYXRpbmcgc3lzdGVtLCBhbmQgaXMgY292ZXJlZCBieSB0aGUKKyAqIHNhbWUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdGhhdCBjb3ZlcnMgdGhhdCB3b3JrLgorICoKKyAqIGNvcHlyaWdodHMgKGMpIDE5OTYgYnkgSmFuLVBhc2NhbCB2YW4gQmVzdCAoanZiZXN0QHdpLmxlaWRlbnVuaXYubmwpCisgKgorICogSSBoYXZlIGRvbmUgYSBsb29rIGluIHRoZSBmb2xsb3dpbmcgc291cmNlczoKKyAqICAgY3J5bndyLXBhY2tldC1kcml2ZXIgYnkgUnVzcyBOZWxzb24KKyAqLworCisjZGVmaW5lIE5JNTAxMF9CVUZTSVpFCTIwNDgJLyogbnVtYmVyIG9mIGJ5dGVzIGluIGEgYnVmZmVyICovCisKKyNkZWZpbmUgTkk1MDEwX01BR0lDVkFMMCAweDAwICAvKiBtYWdpYy12YWx1ZXMgZm9yIG5pNTAxMCBjYXJkICovCisjZGVmaW5lIE5JNTAxMF9NQUdJQ1ZBTDEgMHg1NQorI2RlZmluZSBOSTUwMTBfTUFHSUNWQUwyIDB4QUEKKworI2RlZmluZSBTQV9BRERSMCAweDAyCisjZGVmaW5lIFNBX0FERFIxIDB4MDcKKyNkZWZpbmUgU0FfQUREUjIgMHgwMQorCisvKiBUaGUgbnVtYmVyIG9mIGxvdyBJL08gcG9ydHMgdXNlZCBieSB0aGUgbmk1MDEwIGV0aGVyY2FyZC4gKi8KKyNkZWZpbmUgTkk1MDEwX0lPX0VYVEVOVCAgICAgICAzMgorCisjZGVmaW5lIFBSSU5USyh4KSBpZiAoTkk1MDEwX0RFQlVHKSBwcmludGsgeAorI2RlZmluZSBQUklOVEsyKHgpIGlmIChOSTUwMTBfREVCVUc+PTIpIHByaW50ayB4CisjZGVmaW5lIFBSSU5USzMoeCkgaWYgKE5JNTAxMF9ERUJVRz49MykgcHJpbnRrIHgKKworLyogVGhlIHZhcmlvdXMgSUUgY29tbWFuZCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRURMQ19YU1RBVAkoaW9hZGRyICsgMHgwMCkJLyogRURMQyB0cmFuc21pdCBjc3IgKi8KKyNkZWZpbmUgRURMQ19YQ0xSCShpb2FkZHIgKyAweDAwKQkvKiBFRExDIHRyYW5zbWl0ICJDbGVhciBJUlEiICovCisjZGVmaW5lIEVETENfWE1BU0sJKGlvYWRkciArIDB4MDEpCS8qIEVETEMgdHJhbnNtaXQgIklSUSBNYXNrcyIgKi8KKyNkZWZpbmUgRURMQ19SU1RBVAkoaW9hZGRyICsgMHgwMikJLyogRURMQyByZWNlaXZlIGNzciAqLworI2RlZmluZSBFRExDX1JDTFIJKGlvYWRkciArIDB4MDIpCS8qIEVETEMgcmVjZWl2ZSAiQ2xlYXIgSVJRIiAqLworI2RlZmluZSBFRExDX1JNQVNLCShpb2FkZHIgKyAweDAzKQkvKiBFRExDIHJlY2VpdmUgIklSUSBNYXNrcyIgKi8KKyNkZWZpbmUgRURMQ19YTU9ERQkoaW9hZGRyICsgMHgwNCkJLyogRURMQyB0cmFuc21pdCBNb2RlICovCisjZGVmaW5lIEVETENfUk1PREUJKGlvYWRkciArIDB4MDUpCS8qIEVETEMgcmVjZWl2ZSBNb2RlICovCisjZGVmaW5lIEVETENfUkVTRVQJKGlvYWRkciArIDB4MDYpCS8qIEVETEMgUkVTRVQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRURMQ19URFIxCShpb2FkZHIgKyAweDA3KQkvKiAiVGltZSBEb21haW4gUmVmbGVjdG9tZXRyeSIgcmVnMSAqLworI2RlZmluZSBFRExDX0FERFIJKGlvYWRkciArIDB4MDgpCS8qIEVETEMgc3RhdGlvbiBhZGRyZXNzLCA2IGJ5dGVzICovCisJIAkJCS8qIDB4MEUgZG9lc24ndCBleGlzdCBmb3Igci93ICovCisjZGVmaW5lIEVETENfVERSMgkoaW9hZGRyICsgMHgwZikJLyogIlRpbWUgRG9tYWluIFJlZmxlY3RvbWV0cnkiIHJlZzIgKi8KKyNkZWZpbmUgSUVfR1AJCShpb2FkZHIgKyAweDEwKQkvKiBHUCBwb2ludGVyICh3b3JkIHJlZ2lzdGVyKSAqLworCQkJCS8qIDB4MTEgaXMgMm5kIGJ5dGUgb2YgR1AgUG9pbnRlciAqLworI2RlZmluZSBJRV9SQ05UCQkoaW9hZGRyICsgMHgxMCkJLyogQ291bnQgb2YgYnl0ZXMgaW4gcmN2J2QgcGFja2V0ICovCisgCQkJCS8qIDB4MTEgaXMgMm5kIGJ5dGUgb2YgIkJ5dGUgQ291bnQiICovCisjZGVmaW5lIElFX01NT0RFCShpb2FkZHIgKyAweDEyKQkvKiBNZW1vcnkgTW9kZSByZWdpc3RlciAqLworI2RlZmluZSBJRV9ETUFfUlNUCShpb2FkZHIgKyAweDEzKQkvKiBJRSBETUEgUmVzZXQuICB3cml0ZSBvbmx5ICovCisjZGVmaW5lIElFX0lTVEFUCShpb2FkZHIgKyAweDEzKQkvKiBJRSBJbnRlcnJ1cHQgU3RhdHVzLiAgcmVhZCBvbmx5ICovCisjZGVmaW5lIElFX1JCVUYJCShpb2FkZHIgKyAweDE0KQkvKiBJRSBSZWNlaXZlIEJ1ZmZlciBwb3J0ICovCisjZGVmaW5lIElFX1hCVUYJCShpb2FkZHIgKyAweDE1KQkvKiBJRSBUcmFuc21pdCBCdWZmZXIgcG9ydCAqLworI2RlZmluZSBJRV9TQVBST00JKGlvYWRkciArIDB4MTYpCS8qIHdpbmRvdyBvbiBzdGF0aW9uIGFkZHIgcHJvbSAqLworI2RlZmluZSBJRV9SRVNFVAkoaW9hZGRyICsgMHgxNykJLyogYW55IHdyaXRlIGNhdXNlcyBCb2FyZCBSZXNldCAqLworCisvKiBiaXRzIGluIEVETENfWFNUQVQsIGludGVycnVwdCBjbGVhciBvbiB3cml0ZSwgc3RhdHVzIHdoZW4gcmVhZCAqLworI2RlZmluZSBYU19UUE9LCQkweDgwCS8qIHRyYW5zbWl0IHBhY2tldCBzdWNjZXNzZnVsICovCisjZGVmaW5lIFhTX0NTCQkweDQwCS8qIGNhcnJpZXIgc2Vuc2UgKi8KKyNkZWZpbmUgWFNfUkNWRAkJMHgyMAkvKiB0cmFuc21pdHRlZCBwYWNrZXQgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgWFNfU0hPUlQJMHgxMAkvKiB0cmFuc21pc3Npb24gbWVkaWEgaXMgc2hvcnRlZCAqLworI2RlZmluZSBYU19VRkxXCQkweDA4CS8qIHVuZGVyZmxvdy4gIGlmZiBmYWlsZWQgYm9hcmQgKi8KKyNkZWZpbmUgWFNfQ09MTAkJMHgwNAkvKiBjb2xsaXNpb24gb2NjdXJyZWQgKi8KKyNkZWZpbmUgWFNfMTZDT0xMCTB4MDIJLyogMTZ0aCBjb2xsaXNpb24gb2NjdXJyZWQgKi8KKyNkZWZpbmUgWFNfUEVSUgkJMHgwMQkvKiBwYXJpdHkgZXJyb3IgKi8KKworI2RlZmluZSBYU19DTFJfVUZMVwkweDA4CS8qIGNsZWFyIHVuZGVyZmxvdyAqLworI2RlZmluZSBYU19DTFJfQ09MTAkweDA0CS8qIGNsZWFyIGNvbGxpc2lvbiAqLworI2RlZmluZSBYU19DTFJfMTZDT0xMCTB4MDIJLyogY2xlYXIgMTZ0aCBjb2xsaXNpb24gKi8KKyNkZWZpbmUgWFNfQ0xSX1BFUlIJMHgwMQkvKiBjbGVhciBwYXJpdHkgZXJyb3IgKi8KKworLyogYml0cyBpbiBFRExDX1hNQVNLLCBtYXNrL2VuYWJsZSB0cmFuc21pdCBpbnRlcnJ1cHRzLiAgcmVnaXN0ZXIgaXMgci93ICovCisjZGVmaW5lIFhNX1RQT0sJCTB4ODAJLyogPTEgdG8gZW5hYmxlIFhtdCBQa3QgT0sgaW50ZXJydXB0cyAqLworI2RlZmluZSBYTV9SQ1ZECQkweDIwCS8qID0xIHRvIGVuYWJsZSBYbXQgUGt0IFJjdmQgaW50cyAqLworI2RlZmluZSBYTV9VRkxXCQkweDA4CS8qID0xIHRvIGVuYWJsZSBYbXQgVW5kZXJmbG93IGludHMgKi8KKyNkZWZpbmUgWE1fQ09MTAkJMHgwNAkvKiA9MSB0byBlbmFibGUgWG10IENvbGxpc2lvbiBpbnRzICovCisjZGVmaW5lIFhNX0NPTEwxNgkweDAyCS8qID0xIHRvIGVuYWJsZSBYbXQgMTZ0aCBDb2xsIGludHMgKi8KKyNkZWZpbmUgWE1fUEVSUgkJMHgwMQkvKiA9MSB0byBlbmFibGUgWG10IFBhcml0eSBFcnJvciBpbnRzICovCisgCQkJCS8qIG5vdGU6IGFsd2F5cyBjbGVhciB0aGlzIGJpdCAqLworI2RlZmluZSBYTV9BTEwJCShYTV9UUE9LIHwgWE1fUkNWRCB8IFhNX1VGTFcgfCBYTV9DT0xMIHwgWE1fQ09MTDE2KQorCisvKiBiaXRzIGluIEVETENfUlNUQVQsIGludGVycnVwdCBjbGVhciBvbiB3cml0ZSwgc3RhdHVzIHdoZW4gcmVhZCAqLworI2RlZmluZSBSU19QS1RfT0sJMHg4MAkvKiByZWNlaXZlZCBnb29kIHBhY2tldCAqLworI2RlZmluZSBSU19SU1RfUEtUCTB4MTAJLyogUkVTRVQgcGFja2V0IHJlY2VpdmVkICovCisjZGVmaW5lIFJTX1JVTlQJCTB4MDgJLyogUnVudCBQa3QgcmN2ZC4gIExlbiA8IDY0IEJ5dGVzICovCisjZGVmaW5lIFJTX0FMSUdOCTB4MDQJLyogQWxpZ25tZW50IGVycm9yLiBub3QgOCBiaXQgYWxpZ25lZCAqLworI2RlZmluZSBSU19DUkNfRVJSCTB4MDIJLyogQmFkIENSQyBvbiByY3ZkIHBrdCAqLworI2RlZmluZSBSU19PRkxXCQkweDAxCS8qIG92ZXJmbG93IGZvciByY3YgRklGTyAqLworI2RlZmluZSBSU19WQUxJRF9CSVRTCSggUlNfUEtUX09LIHwgUlNfUlNUX1BLVCB8IFJTX1JVTlQgfCBSU19BTElHTiB8IFJTX0NSQ19FUlIgfCBSU19PRkxXICkKKyAJCQkJLyogYWxsIHZhbGlkIFJTVEFUIGJpdHMgKi8KKworI2RlZmluZSBSU19DTFJfUEtUX09LCTB4ODAJLyogY2xlYXIgcmN2ZCBwYWNrZXQgaW50ZXJydXB0ICovCisjZGVmaW5lIFJTX0NMUl9SU1RfUEtUCTB4MTAJLyogY2xlYXIgUkVTRVQgcGFja2V0IHJlY2VpdmVkICovCisjZGVmaW5lIFJTX0NMUl9SVU5UCTB4MDgJLyogY2xlYXIgUnVudCBQY2t0IHJlY2VpdmVkICovCisjZGVmaW5lIFJTX0NMUl9BTElHTgkweDA0CS8qIGNsZWFyIEFsaWdubWVudCBlcnJvciAqLworI2RlZmluZSBSU19DTFJfQ1JDX0VSUgkweDAyCS8qIGNsZWFyIENSQyBlcnJvciAqLworI2RlZmluZSBSU19DTFJfT0ZMVwkweDAxCS8qIGNsZWFyIHJjdiBGSUZPIE92ZXJmbG93ICovCisKKy8qIGJpdHMgaW4gRURMQ19STUFTSywgbWFzay9lbmFibGUgcmVjZWl2ZSBpbnRlcnJ1cHRzLiAgcmVnaXN0ZXIgaXMgci93ICovCisjZGVmaW5lIFJNX1BLVF9PSwkweDgwCS8qID0xIHRvIGVuYWJsZSByY3ZkIGdvb2QgcGFja2V0IGludHMgKi8KKyNkZWZpbmUgUk1fUlNUX1BLVAkweDEwCS8qID0xIHRvIGVuYWJsZSBSRVNFVCBwYWNrZXQgaW50cyAqLworI2RlZmluZSBSTV9SVU5UCQkweDA4CS8qID0xIHRvIGVuYWJsZSBSdW50IFBrdCByY3ZkIGludHMgKi8KKyNkZWZpbmUgUk1fQUxJR04JMHgwNAkvKiA9MSB0byBlbmFibGUgQWxpZ25tZW50IGVycm9yIGludHMgKi8KKyNkZWZpbmUgUk1fQ1JDX0VSUgkweDAyCS8qID0xIHRvIGVuYWJsZSBCYWQgQ1JDIGVycm9yIGludHMgKi8KKyNkZWZpbmUgUk1fT0ZMVwkJMHgwMQkvKiA9MSB0byBlbmFibGUgb3ZlcmZsb3cgZXJyb3IgaW50cyAqLworCisvKiBiaXRzIGluIEVETENfUk1PREUsIHNldCBSZWNlaXZlIFBhY2tldCBtb2RlLiAgcmVnaXN0ZXIgaXMgci93ICovCisjZGVmaW5lIFJNRF9URVNUCTB4ODAJLyogPTEgZm9yIENoaXAgdGVzdGluZy4gIG5vcm1hbGx5IDAgKi8KKyNkZWZpbmUgUk1EX0FERF9TSVoJMHgxMAkvKiA9MSA1LWJ5dGUgYWRkciBtYXRjaC4gIG5vcm1hbGx5IDAgKi8KKyNkZWZpbmUgUk1EX0VOX1JVTlQJMHgwOAkvKiA9MSBlbmFibGUgcnVudCByY3YuICBub3JtYWxseSAwICovCisjZGVmaW5lIFJNRF9FTl9SU1QJMHgwNAkvKiA9MSB0byByY3YgUkVTRVQgcGt0LiAgbm9ybWFsbHkgMCAqLworCisjZGVmaW5lIFJNRF9QUk9NSVNDCTB4MDMJLyogcmVjZWl2ZSAqYWxsKiBwYWNrZXRzLiAgdW51c3VhbCAqLworI2RlZmluZSBSTURfTVVMVElDQVNUCTB4MDIJLyogcmVjZWl2ZSBtdWx0aWNhc3RzIHRvby4gIHVudXN1YWwgKi8KKyNkZWZpbmUgUk1EX0JST0FEQ0FTVAkweDAxCS8qIHJlY2VpdmUgYnJvYWRjYXN0cyAmIG5vcm1hbC4gdXN1YWwgKi8KKyNkZWZpbmUgUk1EX05PX1BBQ0tFVFMJMHgwMAkvKiBkb24ndCByZWNlaXZlIGFueSBwYWNrZXRzLiB1bnVzdWFsICovCisKKy8qIGJpdHMgaW4gRURMQ19YTU9ERSwgc2V0IFRyYW5zbWl0IFBhY2tldCBtb2RlLiAgcmVnaXN0ZXIgaXMgci93ICovCisjZGVmaW5lIFhNRF9DT0xMX0NOVAkweGYwCS8qIGNvbGwncyBzaW5jZSBzdWNjZXNzLiAgcmVhZC1vbmx5ICovCisjZGVmaW5lIFhNRF9JR19QQVIJMHgwOAkvKiA9MSB0byBpZ25vcmUgcGFyaXR5LiAgQUxXQVlTIHNldCAqLworI2RlZmluZSBYTURfVF9NT0RFCTB4MDQJLyogPTEgdG8gcG93ZXIgeGN2ci4gQUxXQVlTIHNldCB0aGlzICovCisjZGVmaW5lIFhNRF9MQkMJCTB4MDIJLyogPTEgZm9yIGxvb3BiYWtjLiAgbm9ybWFsbHkgc2V0ICovCisjZGVmaW5lIFhNRF9ESVNfQwkweDAxCS8qID0xIGRpc2FibGVzIGNvbnRlbnRpb24uIG5vcm1hbGx5IDAgKi8KKworLyogYml0cyBpbiBFRExDX1JFU0VULCB3cml0ZSBvbmx5ICovCisjZGVmaW5lIFJTX1JFU0VUCTB4ODAJLyogPTEgdG8gaG9sZCBFRExDIGluIHJlc2V0IHN0YXRlICovCisKKy8qIGJpdHMgaW4gSUVfTU1PREUsIHdyaXRlIG9ubHkgKi8KKyNkZWZpbmUgTU1fRU5fRE1BCTB4ODAJLyogPTEgYmVnaW4gRE1BIHhmZXIsIENwbHQgY2xycyBpdCAqLworI2RlZmluZSBNTV9FTl9SQ1YJMHg0MAkvKiA9MSBhbGxvd3MgUGt0IHJjdi4gIGNscidkIGJ5IHJjdiAqLworI2RlZmluZSBNTV9FTl9YTVQJMHgyMAkvKiA9MSBiZWdpbiBYbXQgcGt0LiAgQ3BsdCBjbHJzIGl0ICovCisjZGVmaW5lIE1NX0JVU19QQUdFCTB4MTgJLyogPTAwIEFMV0FZUy4gIFVzZWQgd2hlbiBNVVg9MSAqLworI2RlZmluZSBNTV9ORVRfUEFHRQkweDA2CS8qID0wMCBBTFdBWVMuICBVc2VkIHdoZW4gTVVYPTAgKi8KKyNkZWZpbmUgTU1fTVVYCQkweDAxCS8qID0xIG1lYW5zIFJjdiBCdWZmIG9uIHN5c3RlbSBidXMgKi8KKwkJCQkvKiA9MCBtZWFucyBYbXQgQnVmZiBvbiBzeXN0ZW0gYnVzICovCisKKy8qIGJpdHMgaW4gSUVfSVNUQVQsIHJlYWQgb25seSAqLworI2RlZmluZSBJU19URElBRwkweDgwCS8qID0xIGlmIERpYWdub3N0aWMgcHJvYmxlbSAqLworI2RlZmluZSBJU19FTl9SQ1YJMHgyMAkvKiA9MSB1bnRpbCBmcmFtZSBpcyByY3YnZCBjcGx0ICovCisjZGVmaW5lIElTX0VOX1hNVAkweDEwCS8qID0xIHVudGlsIGZyYW1lIGlzIHhtdCdkIGNwbHQgKi8KKyNkZWZpbmUgSVNfRU5fRE1BCTB4MDgJLyogPTEgdW50aWwgRE1BIGlzIGNwbHQgb3IgYWJvcnRlZCAqLworI2RlZmluZSBJU19ETUFfSU5UCTB4MDQJLyogPTAgaWZmIERNQSBkb25lIGludGVycnVwdC4gKi8KKyNkZWZpbmUgSVNfUl9JTlQJMHgwMgkvKiA9MCBpZmYgdW5tYXNrZWQgUmN2IGludGVycnVwdCAqLworI2RlZmluZSBJU19YX0lOVAkweDAxCS8qID0wIGlmZiB1bm1hc2tlZCBYbXQgaW50ZXJydXB0ICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25pNTIuYyBiL2RyaXZlcnMvbmV0L25pNTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTg1NGM4ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L25pNTIuYwpAQCAtMCwwICsxLDEzODYgQEAKKy8qCisgKiBuZXQtMy1kcml2ZXIgZm9yIHRoZSBOSTUyMTAgY2FyZCAoaTgyNTg2IEV0aGVybmV0IGNoaXApCisgKgorICogVGhpcyBpcyBhbiBleHRlbnNpb24gdG8gdGhlIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0sIGFuZCBpcyBjb3ZlcmVkIGJ5IHRoZQorICogc2FtZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0aGF0IGNvdmVycyB0aGF0IHdvcmsuCisgKgorICogQWxwaGFjb2RlIDAuODIgKDk2LzA5LzI5KSBmb3IgTGludXggMi4wLjAgKG9yIGxhdGVyKQorICogQ29weXJpZ2h0cyAoYykgMTk5NCwxOTk1LDE5OTYgYnkgTS5IaXBwIChoaXBwbUBpbmZvcm1hdGlrLnVuaS10dWViaW5nZW4uZGUpCisgKiAgICBbZmVlbCBmcmVlIHRvIG1haWwgLi4uLl0KKyAqCisgKiB3aGVuIHVzaW5nIGFzIG1vZHVsZTogKG5vIGF1dG9wcm9iaW5nISkKKyAqICAgY29tcGlsZSB3aXRoOgorICogICAgICAgZ2NjIC1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciAtbTQ4NiAtRF9fS0VSTkVMX18gLURNT0RVTEUgLWMgbmk1Mi5jCisgKiAgIHJ1biB3aXRoIGUuZzoKKyAqICAgICAgIGluc21vZCBuaTUyLm8gaW89MHgzNjAgaXJxPTkgbWVtc3RhcnQ9MHhkMDAwMCBtZW1lbmQ9MHhkNDAwMAorICoKKyAqIENBTiBZT1UgUExFQVNFIFJFUE9SVCBNRSBZT1VSIFBFUkZPUk1BTkNFIEVYUEVSSUVOQ0VTICEhLgorICoKKyAqIElmIHlvdSBmaW5kIGEgYnVnLCBwbGVhc2UgcmVwb3J0IG1lOgorICogICBUaGUga2VybmVsIHBhbmljIG91dHB1dCBhbmQgYW55IGttc2cgZnJvbSB0aGUgbmk1MiBkcml2ZXIKKyAqICAgdGhlIG5pNTIxMC1kcml2ZXItdmVyc2lvbiBhbmQgdGhlIGxpbnV4LWtlcm5lbCB2ZXJzaW9uCisgKiAgIGhvdyBtYW55IHNoYXJlZCBtZW1vcnkgKG1lbXNpemUpIG9uIHRoZSBuZXRjYXJkLAorICogICBib290cHJvbTogeWVzL25vLCBiYXNlX2FkZHIsIG1lbV9zdGFydAorICogICBtYXliZSB0aGUgbmk1MjEwLWNhcmQgcmV2aXNpb24gYW5kIHRoZSBpODI1ODYgdmVyc2lvbgorICoKKyAqIGF1dG9wcm9iZSBmb3I6IGJhc2VfYWRkcjogMHgzMDAsMHgyODAsMHgzNjAsMHgzMjAsMHgzNDAKKyAqICAgICAgICAgICAgICAgIG1lbV9zdGFydDogMHhkMDAwMCwweGQyMDAwLDB4YzgwMDAsMHhjYTAwMCwweGQ0MDAwLDB4ZDYwMDAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZDgwMDAsMHhjYzAwMCwweGNlMDAwLDB4ZGEwMDAsMHhkYzAwMAorICoKKyAqIHNvdXJjZXM6CisgKiAgIHNrZWxldG9uLmMgZnJvbSBEb25hbGQgQmVja2VyCisgKgorICogSSBoYXZlIGFsc28gZG9uZSBhIGxvb2sgaW4gdGhlIGZvbGxvd2luZyBzb3VyY2VzOiAobWFpbCBtZSBpZiB5b3UgbmVlZCB0aGVtKQorICogICBjcnlud3ItcGFja2V0LWRyaXZlciBieSBSdXNzIE5lbHNvbgorICogICBHYXJyZXQgQS4gV29sbG1hbidzIChmb3VydGgpIGk4MjU4Ni1kcml2ZXIgZm9yIEJTRAorICogICAoYmVmb3JlIGdldHRpbmcgYW4gaTgyNTk2ICh5ZXMgNTk2IG5vdCA1ODYpIG1hbnVhbCwgdGhlIGV4aXN0aW5nIGRyaXZlcnMgaGVscGVkCisgKiAgICBtZSBhIGxvdCB0byB1bmRlcnN0YW5kIHRoaXMgdHJpY2t5IGNoaXAuKQorICoKKyAqIEtub3duIFByb2JsZW1zOgorICogICBUaGUgaW50ZXJuYWwgc3lzYnVzIHNlZW1zIHRvIGJlIHNsb3cuIFNvIHdlIG9mdGVuIGxvc2UgcGFja2V0cyBiZWNhdXNlIG9mCisgKiAgIG92ZXJydW5zIHdoaWxlIHJlY2VpdmluZyBmcm9tIGEgZmFzdCByZW1vdGUgaG9zdC4KKyAqICAgVGhpcyBjYW4gc2xvdyBkb3duIFRDUCBjb25uZWN0aW9ucy4gTWF5YmUgdGhlIG5ld2VyIG5pNTIxMCBjYXJkcyBhcmUgYmV0dGVyLgorICogICBteSBleHBlcmllbmNlIGlzLCB0aGF0IGlmIGEgbWFjaGluZSBzZW5kcyB3aXRoIG1vcmUgdGhhbiBhYm91dCA1MDAtNjAwSy9zCisgKiAgIHRoZSBmaWZvL3N5c2J1cyBvdmVyZmxvd3MuCisgKgorICogSU1QT1JUQU5UIE5PVEU6CisgKiAgIE9uIGZhc3QgbmV0d29ya3MsIGl0J3MgYSAodmVyeSkgZ29vZCBpZGVhIHRvIGhhdmUgMTZLIHNoYXJlZCBtZW1vcnkuIFdpdGgKKyAqICAgOEssIHdlIGNhbiBzdG9yZSBvbmx5IDQgcmVjZWl2ZSBmcmFtZXMsIHNvIGl0IGNhbiAoZWFzaWx5KSBoYXBwZW4gdGhhdCBhIHJlbW90ZQorICogICBtYWNoaW5lICdvdmVycnVucycgb3VyIHN5c3RlbS4KKyAqCisgKiBLbm93biBpODI1ODYvY2FyZCBwcm9ibGVtcyAoSSdtIHN1cmUsIHRoZXJlIGFyZSBtYW55IG1vcmUhKToKKyAqICAgUnVubmluZyB0aGUgTk9QLW1vZGUsIHRoZSBpODI1ODYgc29tZXRpbWVzIHNlZW1zIHRvIGZvcmdldCB0byByZXBvcnQKKyAqICAgZXZlcnkgeG1pdC1pbnRlcnJ1cHQgdW50aWwgd2UgcmVzdGFydCB0aGUgQ1UuCisgKiAgIEFub3RoZXIgTUFKT1IgYnVnIGlzLCB0aGF0IHRoZSBSVSBzb21ldGltZXMgc2VlbXMgdG8gaWdub3JlIHRoZSBFTC1CaXQKKyAqICAgaW4gdGhlIFJCRC1TdHJ1Y3Qgd2hpY2ggaW5kaWNhdGVzIGFuIGVuZCBvZiB0aGUgUkJEIHF1ZXVlLgorICogICBJbnN0ZWFkLCB0aGUgUlUgZmV0Y2hlcyBhbm90aGVyIChyYW5kb21seSBzZWxlY3RlZCBhbmQKKyAqICAgdXN1YWxseSB1c2VkKSBSQkQgYW5kIGJlZ2lucyB0byBmaWxsIGl0LiAoTWF5YmUsIHRoaXMgaGFwcGVucyBvbmx5IGlmCisgKiAgIHRoZSBsYXN0IGJ1ZmZlciBmcm9tIHRoZSBwcmV2aW91cyBSRkQgZml0cyBleGFjdCBpbnRvIHRoZSBxdWV1ZSBhbmQKKyAqICAgdGhlIG5leHQgUkZEIGNhbid0IGZldGNoIGFuIGluaXRpYWwgUkJELiBBbnlvbmUga25vd3MgbW9yZT8gKQorICoKKyAqIHJlc3VsdHMgZnJvbSBmdHAgcGVyZm9ybWFuY2UgdGVzdHMgd2l0aCBMaW51eCAxLjIuNQorICogICBzZW5kIGFuZCByZWNlaXZlIGFib3V0IDM1MC00MDAgS0J5dGUvcyAocGVhayB1cCB0byA0NjAga2J5dGVzL3MpCisgKiAgIHNlbmRpbmcgaW4gTk9QLW1vZGU6IHBlYWsgcGVyZm9ybWFuY2UgdXAgdG8gNTMwSy9zIChidXQgYmV0dGVyIGRvbid0IHJ1biB0aGlzIG1vZGUpCisgKi8KKworLyoKKyAqIDI5LlNlcHQuOTY6IHZpcnRfdG9fYnVzIGNoYW5nZXMgZm9yIG5ldyBtZW1vcnkgc2NoZW1lCisgKiAxOS5GZWIuOTY6IG1vcmUgTWNhc3QgY2hhbmdlcywgbW9kdWxlIHN1cHBvcnQgKE1IKQorICoKKyAqIDE4Lk5vdi45NTogTWNhc3QgY2hhbmdlcyAoQUMpLgorICoKKyAqIDIzLkFwcmlsLjk1OiBmaXhlZCg/KSByZWNlaXZpbmcgcHJvYmxlbXMgYnkgY29uZmlndXJpbmcgYSBSRkQgbW9yZQorICogICAgICAgICAgICAgIHRoYW4gdGhlIG51bWJlciBvZiBSQkQncy4gQ2FuIG1heWJlIGNhdXNlIG90aGVyIHByb2JsZW1zLgorICogMTguQXByaWwuOTU6IEFkZGVkIE1PRFVMRSBzdXBwb3J0IChNSCkKKyAqIDE3LkFwcmlsLjk1OiBNQyByZWxhdGVkIGNoYW5nZXMgaW4gaW5pdDU4NigpIGFuZCBzZXRfbXVsdGljYXN0X2xpc3QoKS4KKyAqICAgICAgICAgICAgICByZW1vdmVkIHVzZSBvZiAnamlmZmllcycgaW4gaW5pdDU4NigpIChNSCkKKyAqCisgKiAxOS5TZXAuOTQ6IEFkZGVkIE11bHRpY2FzdCBzdXBwb3J0IChub3QgdGVzdGVkIHlldCkgKE1IKQorICoKKyAqIDE4LlNlcC45NDogV29ya2Fyb3VuZCBmb3IgJ0VMLUJ1ZycuIFJlbW92ZWQgZmxleGlibGUgUkJELWhhbmRsaW5nLgorICogICAgICAgICAgICBOb3csIGV2ZXJ5IFJGRCBoYXMgZXhhY3Qgb25lIFJCRC4gKE1IKQorICoKKyAqIDE0LlNlcC45NDogYWRkZWQgcHJvbWlzY3VvdXMgbW9kZSwgYSBmZXcgY2xlYW51cHMgKE1IKQorICoKKyAqIDE5LkF1Zy45NDogY2hhbmdlZCByZXF1ZXN0X2lycSgpIHBhcmFtZXRlciAoTUgpCisgKgorICogMjAuSnVseS45NDogcmVtb3ZlZCBjbGVhbnVwIGJ1Z3MsIHJlbW92ZWQgYSAxNkstbWVtLXByb2JlLWJ1ZyAoTUgpCisgKgorICogMTkuSnVseS45NDogbG90c2EgY2xlYW51cHMgLi4gKE1IKQorICoKKyAqIDE3Lkp1bHkuOTQ6IHNvbWUgcGF0Y2hlcyAuLi4gdmVyaWZpZWQgdG8gcnVuIHdpdGggMS4xLjI5IChNSCkKKyAqCisgKiA0Lkp1bHkuOTQ6IHBhdGNoZXMgZm9yIExpbnV4IDEuMS4yNCAgKE1IKQorICoKKyAqIDI2Lk1hcmNoLjk0OiBwYXRjaGVzIGZvciBMaW51eCAxLjAgYW5kIGlvbWVtLWF1dG8tcHJvYmUgKE1IKQorICoKKyAqIDMwLlNlcC45MzogQWRkZWQgbm9wLWNoYWluIC4uIGRyaXZlciBub3cgcnVucyB3aXRoIG9ubHkgb25lIFhtaXQtQnVmZiwgdG9vIChNSCkKKyAqCisgKiA8IDMwLlNlcC45MzogZmlyc3QgdmVyc2lvbnMKKyAqLworCitzdGF0aWMgaW50IGRlYnVnbGV2ZWw7CS8qIGRlYnVnLXByaW50ayAwOiBvZmYgMTogYSBmZXcgMjogbW9yZSAqLworc3RhdGljIGludCBhdXRvbWF0aWNfcmVzdW1lOyAvKiBleHBlcmltZW50YWwgLi4gYmV0dGVyIHNob3VsZCBiZSB6ZXJvICovCitzdGF0aWMgaW50IHJmZGFkZDsJLyogcmZkYWRkPTEgbWF5IGJlIGJldHRlciBmb3IgOEsgTUVNIGNhcmRzICovCitzdGF0aWMgaW50IGZpZm89MHg4OwkvKiBkb24ndCBjaGFuZ2UgKi8KKworLyogI2RlZmluZSBSRUFMTFlfU0xPV19JTyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorCisjaW5jbHVkZSAibmk1Mi5oIgorCisjZGVmaW5lIERSVl9OQU1FICJuaTUyIgorCisjZGVmaW5lIERFQlVHICAgICAgIC8qIGRlYnVnIG9uICovCisjZGVmaW5lIFNZU0JVU1ZBTCAxIC8qIDggQml0ICovCisKKyNkZWZpbmUgbmlfYXR0bjU4NigpICB7b3V0YigwLGRldi0+YmFzZV9hZGRyK05JNTJfQVRURU5USU9OKTt9CisjZGVmaW5lIG5pX3Jlc2V0NTg2KCkge291dGIoMCxkZXYtPmJhc2VfYWRkcitOSTUyX1JFU0VUKTt9CisjZGVmaW5lIG5pX2Rpc2ludCgpICAge291dGIoMCxkZXYtPmJhc2VfYWRkcitOSTUyX0lOVERJUyk7fQorI2RlZmluZSBuaV9lbmFpbnQoKSAgIHtvdXRiKDAsZGV2LT5iYXNlX2FkZHIrTkk1Ml9JTlRFTkEpO30KKworI2RlZmluZSBtYWtlMzIocHRyMTYpIChwLT5tZW10b3AgKyAoc2hvcnQpIChwdHIxNikgKQorI2RlZmluZSBtYWtlMjQocHRyMzIpICggKChjaGFyICopIChwdHIzMikpIC0gcC0+YmFzZSkKKyNkZWZpbmUgbWFrZTE2KHB0cjMyKSAoKHVuc2lnbmVkIHNob3J0KSAoKHVuc2lnbmVkIGxvbmcpKHB0cjMyKSAtICh1bnNpZ25lZCBsb25nKSBwLT5tZW10b3AgKSkKKworLyoqKioqKioqKioqKioqKioqKiogaG93IHRvIGNhbGN1bGF0ZSB0aGUgYnVmZmVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICogSU1QT1JUQU5UIE5PVEU6IGlmIHlvdSBjb25maWd1cmUgb25seSBvbmUgTlVNX1hNSVRfQlVGRlMsIHRoZSBkcml2ZXIgd29ya3MKKyAgKiAtLS0tLS0tLS0tLS0tLS0gaW4gYSBkaWZmZXJlbnQgKG1vcmUgc3RhYmxlPykgbW9kZS4gT25seSBpbiB0aGlzIG1vZGUgaXQncworICAqICAgICAgICAgICAgICAgICBwb3NzaWJsZSB0byBjb25maWd1cmUgdGhlIGRyaXZlciB3aXRoICdOT19OT1BDT01NQU5EUycKKworc2l6ZW9mKHNjcCk9MTI7IHNpemVvZihzY2IpPTE2OyBzaXplb2YoaXNjcCk9ODsKK3NpemVvZihzY3ApK3NpemVvZihpc2NwKStzaXplb2Yoc2NiKSA9IDM2ID0gSU5JVAorc2l6ZW9mKHJmZCkgPSAyNDsgc2l6ZW9mKHJiZCkgPSAxMjsKK3NpemVvZih0YmQpID0gODsgc2l6ZW9mKHRyYW5zbWl0X2NtZCkgPSAxNjsKK3NpemVvZihub3BfY21kKSA9IDg7CisKKyAgKiBpZiB5b3UgZG9uJ3Qga25vdyB0aGUgZHJpdmVyLCBiZXR0ZXIgZG8gbm90IGNoYW5nZSB0aGVzZSB2YWx1ZXM6ICovCisKKyNkZWZpbmUgUkVDVl9CVUZGX1NJWkUgMTUyNCAvKiBzbGlnaHRseSBvdmVyc2l6ZWQgKi8KKyNkZWZpbmUgWE1JVF9CVUZGX1NJWkUgMTUyNCAvKiBzbGlnaHRseSBvdmVyc2l6ZWQgKi8KKyNkZWZpbmUgTlVNX1hNSVRfQlVGRlMgMSAgICAvKiBjb25maWcgZm9yIGJvdGgsIDhLIGFuZCAxNksgc2htZW0gKi8KKyNkZWZpbmUgTlVNX1JFQ1ZfQlVGRlNfOCAgNCAvKiBjb25maWcgZm9yIDhLIHNoYXJlZCBtZW0gKi8KKyNkZWZpbmUgTlVNX1JFQ1ZfQlVGRlNfMTYgOSAvKiBjb25maWcgZm9yIDE2SyBzaGFyZWQgbWVtICovCisjZGVmaW5lIE5PX05PUENPTU1BTkRTICAgICAgLyogb25seSBwb3NzaWJsZSB3aXRoIE5VTV9YTUlUX0JVRkZTPTEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkaWZmZXJlbnQgREVMQVlzICovCisjZGVmaW5lIERFTEFZKHgpIG1kZWxheSgzMiAqIHgpOworI2RlZmluZSBERUxBWV8xNigpOyB7IHVkZWxheSgxNik7IH0KKyNkZWZpbmUgREVMQVlfMTgoKTsgeyB1ZGVsYXkoNCk7IH0KKworLyogd2FpdCBmb3IgY29tbWFuZCB3aXRoIHRpbWVvdXQ6ICovCisjZGVmaW5lIFdBSVRfNF9TQ0JfQ01EKCkgXAoreyBpbnQgaTsgXAorICBmb3IoaT0wO2k8MTYzODQ7aSsrKSB7IFwKKyAgICBpZighcC0+c2NiLT5jbWRfY3VjKSBicmVhazsgXAorICAgIERFTEFZXzE4KCk7IFwKKyAgICBpZihpID09IDE2MzgzKSB7IFwKKyAgICAgIHByaW50aygiJXM6IHNjYl9jbWQgdGltZWQgb3V0OiAlMDR4LCUwNHggLi4gZGlzYWJsaW5nIGk4MjU4NiEhXG4iLGRldi0+bmFtZSxwLT5zY2ItPmNtZF9jdWMscC0+c2NiLT5jdXMpOyBcCisgICAgICAgaWYoIXAtPnJlc2V0ZWQpIHsgcC0+cmVzZXRlZCA9IDE7IG5pX3Jlc2V0NTg2KCk7IH0gfSB9IH0KKworI2RlZmluZSBXQUlUXzRfU0NCX0NNRF9SVUMoKSB7IGludCBpOyBcCisgIGZvcihpPTA7aTwxNjM4NDtpKyspIHsgXAorICAgIGlmKCFwLT5zY2ItPmNtZF9ydWMpIGJyZWFrOyBcCisgICAgREVMQVlfMTgoKTsgXAorICAgIGlmKGkgPT0gMTYzODMpIHsgXAorICAgICAgcHJpbnRrKCIlczogc2NiX2NtZCAocnVjKSB0aW1lZCBvdXQ6ICUwNHgsJTA0eCAuLiBkaXNhYmxpbmcgaTgyNTg2ISFcbiIsZGV2LT5uYW1lLHAtPnNjYi0+Y21kX3J1YyxwLT5zY2ItPnJ1cyk7IFwKKyAgICAgICBpZighcC0+cmVzZXRlZCkgeyBwLT5yZXNldGVkID0gMTsgbmlfcmVzZXQ1ODYoKTsgfSB9IH0gfQorCisjZGVmaW5lIFdBSVRfNF9TVEFUX0NPTVBMKGFkZHIpIHsgaW50IGk7IFwKKyAgIGZvcihpPTA7aTwzMjc2NztpKyspIHsgXAorICAgICBpZigoYWRkciktPmNtZF9zdGF0dXMgJiBTVEFUX0NPTVBMKSBicmVhazsgXAorICAgICBERUxBWV8xNigpOyBERUxBWV8xNigpOyB9IH0KKworI2RlZmluZSBOSTUyX1RPVEFMX1NJWkUgMTYKKyNkZWZpbmUgTkk1Ml9BRERSMCAweDAyCisjZGVmaW5lIE5JNTJfQUREUjEgMHgwNworI2RlZmluZSBOSTUyX0FERFIyIDB4MDEKKworc3RhdGljIGludCAgICAgbmk1Ml9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldixpbnQgaW9hZGRyKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBuaTUyX2ludGVycnVwdChpbnQgaXJxLHZvaWQgKmRldl9pZCxzdHJ1Y3QgcHRfcmVncyAqcmVnX3B0cik7CitzdGF0aWMgaW50ICAgICBuaTUyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBuaTUyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgbmk1Ml9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqLHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHN0cnVjdCAgbmV0X2RldmljZV9zdGF0cyAqbmk1Ml9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBuaTUyX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjaWYgMAorc3RhdGljIHZvaWQgICAgbmk1Ml9kdW1wKHN0cnVjdCBuZXRfZGV2aWNlICosdm9pZCAqKTsKKyNlbmRpZgorCisvKiBoZWxwZXItZnVuY3Rpb25zICovCitzdGF0aWMgaW50ICAgICBpbml0NTg2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgY2hlY2s1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldixjaGFyICp3aGVyZSx1bnNpZ25lZCBzaXplKTsKK3N0YXRpYyB2b2lkICAgIGFsbG9jNTg2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgc3RhcnRyZWN2NTg2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAqYWxsb2NfcmZhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdm9pZCAqcHRyKTsKK3N0YXRpYyB2b2lkICAgIG5pNTJfcmN2X2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIG5pNTJfeG10X2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIG5pNTJfcm5yX2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RydWN0IHByaXYKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisJY2hhciAqbWVtdG9wOworCWxvbmcgaW50IGxvY2s7CisJaW50IHJlc2V0ZWQ7CisJdm9sYXRpbGUgc3RydWN0IHJmZF9zdHJ1Y3QJKnJmZF9sYXN0LCpyZmRfdG9wLCpyZmRfZmlyc3Q7CisJdm9sYXRpbGUgc3RydWN0IHNjcF9zdHJ1Y3QJKnNjcDsJLyogdm9sYXRpbGUgaXMgaW1wb3J0YW50ICovCisJdm9sYXRpbGUgc3RydWN0IGlzY3Bfc3RydWN0CSppc2NwOwkvKiB2b2xhdGlsZSBpcyBpbXBvcnRhbnQgKi8KKwl2b2xhdGlsZSBzdHJ1Y3Qgc2NiX3N0cnVjdAkqc2NiOwkvKiB2b2xhdGlsZSBpcyBpbXBvcnRhbnQgKi8KKwl2b2xhdGlsZSBzdHJ1Y3QgdGJkX3N0cnVjdAkqeG1pdF9idWZmc1tOVU1fWE1JVF9CVUZGU107CisjaWYgKE5VTV9YTUlUX0JVRkZTID09IDEpCisJdm9sYXRpbGUgc3RydWN0IHRyYW5zbWl0X2NtZF9zdHJ1Y3QgKnhtaXRfY21kc1syXTsKKwl2b2xhdGlsZSBzdHJ1Y3Qgbm9wX2NtZF9zdHJ1Y3QgKm5vcF9jbWRzWzJdOworI2Vsc2UKKwl2b2xhdGlsZSBzdHJ1Y3QgdHJhbnNtaXRfY21kX3N0cnVjdCAqeG1pdF9jbWRzW05VTV9YTUlUX0JVRkZTXTsKKwl2b2xhdGlsZSBzdHJ1Y3Qgbm9wX2NtZF9zdHJ1Y3QgKm5vcF9jbWRzW05VTV9YTUlUX0JVRkZTXTsKKyNlbmRpZgorCXZvbGF0aWxlIGludAkJbm9wX3BvaW50LG51bV9yZWN2X2J1ZmZzOworCXZvbGF0aWxlIGNoYXIJCSp4bWl0X2NidWZmc1tOVU1fWE1JVF9CVUZGU107CisJdm9sYXRpbGUgaW50CQl4bWl0X2NvdW50LHhtaXRfbGFzdDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjbG9zZSBkZXZpY2UKKyAqLworc3RhdGljIGludCBuaTUyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwluaV9yZXNldDU4NigpOyAvKiB0aGUgaGFyZCB3YXkgdG8gc3RvcCB0aGUgcmVjZWl2ZXIgKi8KKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogb3BlbiBkZXZpY2UKKyAqLworc3RhdGljIGludCBuaTUyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCisJbmlfZGlzaW50KCk7CisJYWxsb2M1ODYoZGV2KTsKKwlpbml0NTg2KGRldik7CisJc3RhcnRyZWN2NTg2KGRldik7CisJbmlfZW5haW50KCk7CisKKwlyZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJm5pNTJfaW50ZXJydXB0LDAsZGV2LT5uYW1lLGRldik7CisJaWYgKHJldCkKKwl7CisJCW5pX3Jlc2V0NTg2KCk7CisJCXJldHVybiByZXQ7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOyAvKiBtb3N0IGRvbmUgYnkgaW5pdCAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlJ3MgYW4gODI1ODYgb3V0IHRoZXJlLgorICovCitzdGF0aWMgaW50IGNoZWNrNTg2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsY2hhciAqd2hlcmUsdW5zaWduZWQgc2l6ZSkKK3sKKwlzdHJ1Y3QgcHJpdiBwYjsKKwlzdHJ1Y3QgcHJpdiAqcCA9IC8qIChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXYqLyAmcGI7CisJY2hhciAqaXNjcF9hZGRyc1syXTsKKwlpbnQgaTsKKworCXAtPmJhc2UgPSAodW5zaWduZWQgbG9uZykgaXNhX2J1c190b192aXJ0KCh1bnNpZ25lZCBsb25nKXdoZXJlKSArIHNpemUgLSAweDAxMDAwMDAwOworCXAtPm1lbXRvcCA9IGlzYV9idXNfdG9fdmlydCgodW5zaWduZWQgbG9uZyl3aGVyZSkgKyBzaXplOworCXAtPnNjcCA9IChzdHJ1Y3Qgc2NwX3N0cnVjdCAqKShwLT5iYXNlICsgU0NQX0RFRkFVTFRfQUREUkVTUyk7CisJbWVtc2V0KChjaGFyICopcC0+c2NwLDAsIHNpemVvZihzdHJ1Y3Qgc2NwX3N0cnVjdCkpOworCWZvcihpPTA7aTxzaXplb2Yoc3RydWN0IHNjcF9zdHJ1Y3QpO2krKykgLyogbWVtb3J5IHdhcyB3cml0ZWFibGU/ICovCisJCWlmKCgoY2hhciAqKXAtPnNjcClbaV0pCisJCQlyZXR1cm4gMDsKKwlwLT5zY3AtPnN5c2J1cyA9IFNZU0JVU1ZBTDsJCQkJLyogMSA9IDhCaXQtQnVzLCAwID0gMTYgQml0ICovCisJaWYocC0+c2NwLT5zeXNidXMgIT0gU1lTQlVTVkFMKQorCQlyZXR1cm4gMDsKKworCWlzY3BfYWRkcnNbMF0gPSBpc2FfYnVzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpd2hlcmUpOworCWlzY3BfYWRkcnNbMV09IChjaGFyICopIHAtPnNjcCAtIHNpemVvZihzdHJ1Y3QgaXNjcF9zdHJ1Y3QpOworCisJZm9yKGk9MDtpPDI7aSsrKQorCXsKKwkJcC0+aXNjcCA9IChzdHJ1Y3QgaXNjcF9zdHJ1Y3QgKikgaXNjcF9hZGRyc1tpXTsKKwkJbWVtc2V0KChjaGFyICopcC0+aXNjcCwwLCBzaXplb2Yoc3RydWN0IGlzY3Bfc3RydWN0KSk7CisKKwkJcC0+c2NwLT5pc2NwID0gbWFrZTI0KHAtPmlzY3ApOworCQlwLT5pc2NwLT5idXN5ID0gMTsKKworCQluaV9yZXNldDU4NigpOworCQluaV9hdHRuNTg2KCk7CisJCURFTEFZKDEpOwkvKiB3YWl0IGEgd2hpbGUuLi4gKi8KKworCQlpZihwLT5pc2NwLT5idXN5KSAvKiBpODI1ODYgY2xlYXJzICdidXN5JyBhZnRlciBzdWNjZXNzZnVsIGluaXQgKi8KKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc2V0IGlzY3AgYXQgdGhlIHJpZ2h0IHBsYWNlLCBjYWxsZWQgYnkgbmk1Ml9wcm9iZTEgYW5kIG9wZW41ODYuCisgKi8KK3N0YXRpYyB2b2lkIGFsbG9jNTg2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHByaXYgKnAgPQkoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCisJbmlfcmVzZXQ1ODYoKTsKKwlERUxBWSgxKTsKKworCXAtPnNjcAk9IChzdHJ1Y3Qgc2NwX3N0cnVjdCAqKQkocC0+YmFzZSArIFNDUF9ERUZBVUxUX0FERFJFU1MpOworCXAtPnNjYgk9IChzdHJ1Y3Qgc2NiX3N0cnVjdCAqKQlpc2FfYnVzX3RvX3ZpcnQoZGV2LT5tZW1fc3RhcnQpOworCXAtPmlzY3AgPSAoc3RydWN0IGlzY3Bfc3RydWN0ICopICgoY2hhciAqKXAtPnNjcCAtIHNpemVvZihzdHJ1Y3QgaXNjcF9zdHJ1Y3QpKTsKKworCW1lbXNldCgoY2hhciAqKSBwLT5pc2NwLDAsc2l6ZW9mKHN0cnVjdCBpc2NwX3N0cnVjdCkpOworCW1lbXNldCgoY2hhciAqKSBwLT5zY3AgLDAsc2l6ZW9mKHN0cnVjdCBzY3Bfc3RydWN0KSk7CisKKwlwLT5zY3AtPmlzY3AgPSBtYWtlMjQocC0+aXNjcCk7CisJcC0+c2NwLT5zeXNidXMgPSBTWVNCVVNWQUw7CisJcC0+aXNjcC0+c2NiX29mZnNldCA9IG1ha2UxNihwLT5zY2IpOworCisJcC0+aXNjcC0+YnVzeSA9IDE7CisJbmlfcmVzZXQ1ODYoKTsKKwluaV9hdHRuNTg2KCk7CisKKwlERUxBWSgxKTsKKworCWlmKHAtPmlzY3AtPmJ1c3kpCisJCXByaW50aygiJXM6IEluaXQtUHJvYmxlbXMgKGFsbG9jKS5cbiIsZGV2LT5uYW1lKTsKKworCXAtPnJlc2V0ZWQgPSAwOworCisJbWVtc2V0KChjaGFyICopcC0+c2NiLDAsc2l6ZW9mKHN0cnVjdCBzY2Jfc3RydWN0KSk7Cit9CisKKy8qIHNldDogaW8saXJxLG1lbXN0YXJ0LG1lbWVuZCBvciBzZXQgaXQgd2hlbiBjYWxsaW5nIGluc21vZCAqLworc3RhdGljIGludCBpcnE9OTsKK3N0YXRpYyBpbnQgaW89MHgzMDA7CitzdGF0aWMgbG9uZyBtZW1zdGFydDsJLyogZS5nIDB4ZDAwMDAgKi8KK3N0YXRpYyBsb25nIG1lbWVuZDsJLyogZS5nIDB4ZDQwMDAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHByb2JlIHRoZSBuaTUyMTAtY2FyZAorICovCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBuaTUyX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHByaXYpKTsKKwlzdGF0aWMgaW50IHBvcnRzW10gPSB7MHgzMDAsIDB4MjgwLCAweDM2MCAsIDB4MzIwICwgMHgzNDAsIDB9OworCWludCAqcG9ydDsKKwlpbnQgZXJyID0gMDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCQlpbyA9IGRldi0+YmFzZV9hZGRyOworCQlpcnEgPSBkZXYtPmlycTsKKwkJbWVtc3RhcnQgPSBkZXYtPm1lbV9zdGFydDsKKwkJbWVtZW5kID0gZGV2LT5tZW1fZW5kOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWlmIChpbyA+IDB4MWZmKQl7CS8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KKwkJZXJyID0gbmk1Ml9wcm9iZTEoZGV2LCBpbyk7CisJfSBlbHNlIGlmIChpbyA+IDApIHsJCS8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKwkJZXJyID0gLUVOWElPOworCX0gZWxzZSB7CisJCWZvciAocG9ydCA9IHBvcnRzOyAqcG9ydCAmJiBuaTUyX3Byb2JlMShkZXYsICpwb3J0KSA7IHBvcnQrKykKKwkJCTsKKwkJaWYgKCpwb3J0KQorCQkJZ290byBnb3RfaXQ7CisjaWZkZWYgRlVMTF9JT19QUk9CRQorCQlmb3IgKGlvID0gMHgyMDA7IGlvIDwgMHg0MDAgJiYgbmk1Ml9wcm9iZTEoZGV2LCBpbyk7IGlvICs9IDgpCisJCQk7CisJCWlmIChpbyA8IDB4NDAwKQorCQkJZ290byBnb3RfaXQ7CisjZW5kaWYKKwkJZXJyID0gLUVOT0RFVjsKKwl9CisJaWYgKGVycikKKwkJZ290byBvdXQ7Citnb3RfaXQ6CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBOSTUyX1RPVEFMX1NJWkUpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIGludCBfX2luaXQgbmk1Ml9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldixpbnQgaW9hZGRyKQoreworCWludCBpLCBzaXplLCByZXR2YWw7CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwlkZXYtPmlycSA9IGlycTsKKwlkZXYtPm1lbV9zdGFydCA9IG1lbXN0YXJ0OworCWRldi0+bWVtX2VuZCA9IG1lbWVuZDsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBOSTUyX1RPVEFMX1NJWkUsIERSVl9OQU1FKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmKCAhKGluYihpb2FkZHIrTkk1Ml9NQUdJQzEpID09IE5JNTJfTUFHSUNWQUwxKSB8fAorCSAgICAhKGluYihpb2FkZHIrTkk1Ml9NQUdJQzIpID09IE5JNTJfTUFHSUNWQUwyKSkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IoaT0wO2k8RVRIX0FMRU47aSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gaW5iKGRldi0+YmFzZV9hZGRyK2kpOworCisJaWYoZGV2LT5kZXZfYWRkclswXSAhPSBOSTUyX0FERFIwIHx8IGRldi0+ZGV2X2FkZHJbMV0gIT0gTkk1Ml9BRERSMQorCQkgfHwgZGV2LT5kZXZfYWRkclsyXSAhPSBOSTUyX0FERFIyKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBOSTUyMTAgZm91bmQgYXQgJSMzbHgsICIsZGV2LT5uYW1lLGRldi0+YmFzZV9hZGRyKTsKKworCS8qCisJICogY2hlY2sgKG9yIHNlYXJjaCkgSU8tTWVtb3J5LCA4SyBhbmQgMTZLCisJICovCisjaWZkZWYgTU9EVUxFCisJc2l6ZSA9IGRldi0+bWVtX2VuZCAtIGRldi0+bWVtX3N0YXJ0OworCWlmKHNpemUgIT0gMHgyMDAwICYmIHNpemUgIT0gMHg0MDAwKSB7CisJCXByaW50aygiXG4lczogSWxsZWdhbCBtZW1vcnkgc2l6ZSAlZC4gQWxsb3dlZCBpcyAweDIwMDAgb3IgMHg0MDAwIGJ5dGVzLlxuIixkZXYtPm5hbWUsc2l6ZSk7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKwlpZighY2hlY2s1ODYoZGV2LChjaGFyICopIGRldi0+bWVtX3N0YXJ0LHNpemUpKSB7CisJCXByaW50aygiP21lbWNoZWNrLCBDYW4ndCBmaW5kIG1lbW9yeSBhdCAweCVseCB3aXRoIHNpemUgJWQhXG4iLGRldi0+bWVtX3N0YXJ0LHNpemUpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisjZWxzZQorCWlmKGRldi0+bWVtX3N0YXJ0ICE9IDApIC8qIG5vIGF1dG8tbWVtLXByb2JlICovCisJeworCQlzaXplID0gMHg0MDAwOyAvKiBjaGVjayBmb3IgMTZLIG1lbSAqLworCQlpZighY2hlY2s1ODYoZGV2LChjaGFyICopIGRldi0+bWVtX3N0YXJ0LHNpemUpKSB7CisJCQlzaXplID0gMHgyMDAwOyAvKiBjaGVjayBmb3IgOEsgbWVtICovCisJCQlpZighY2hlY2s1ODYoZGV2LChjaGFyICopIGRldi0+bWVtX3N0YXJ0LHNpemUpKSB7CisJCQkJcHJpbnRrKCI/bWVtcHJvYmUsIENhbid0IGZpbmQgbWVtb3J5IGF0IDB4JWx4IVxuIixkZXYtPm1lbV9zdGFydCk7CisJCQkJcmV0dmFsID0gLUVOT0RFVjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlzdGF0aWMgbG9uZyBtZW1hZGRyc1tdID0geyAweGM4MDAwLDB4Y2EwMDAsMHhjYzAwMCwweGNlMDAwLDB4ZDAwMDAsMHhkMjAwMCwKKwkJCQkJMHhkNDAwMCwweGQ2MDAwLDB4ZDgwMDAsMHhkYTAwMCwweGRjMDAwLCAwIH07CisJCWZvcihpPTA7O2krKykKKwkJeworCQkJaWYoIW1lbWFkZHJzW2ldKSB7CisJCQkJcHJpbnRrKCI/bWVtcHJvYmUsIENhbid0IGZpbmQgaW8tbWVtb3J5IVxuIik7CisJCQkJcmV0dmFsID0gLUVOT0RFVjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWRldi0+bWVtX3N0YXJ0ID0gbWVtYWRkcnNbaV07CisJCQlzaXplID0gMHgyMDAwOyAvKiBjaGVjayBmb3IgOEsgbWVtICovCisJCQlpZihjaGVjazU4NihkZXYsKGNoYXIgKilkZXYtPm1lbV9zdGFydCxzaXplKSkgLyogOEstY2hlY2sgKi8KKwkJCQlicmVhazsKKwkJCXNpemUgPSAweDQwMDA7IC8qIGNoZWNrIGZvciAxNksgbWVtICovCisJCQlpZihjaGVjazU4NihkZXYsKGNoYXIgKilkZXYtPm1lbV9zdGFydCxzaXplKSkgLyogMTZLLWNoZWNrICovCisJCQkJYnJlYWs7CisJCX0KKwl9CisJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyBzaXplOyAvKiBzZXQgbWVtX2VuZCBzaG93ZWQgYnkgJ2lmY29uZmlnJyAqLworI2VuZGlmCisKKwltZW1zZXQoKGNoYXIgKikgZGV2LT5wcml2LDAsc2l6ZW9mKHN0cnVjdCBwcml2KSk7CisKKwkoKHN0cnVjdCBwcml2ICopIChkZXYtPnByaXYpKS0+bWVtdG9wID0gaXNhX2J1c190b192aXJ0KGRldi0+bWVtX3N0YXJ0KSArIHNpemU7CisJKChzdHJ1Y3QgcHJpdiAqKSAoZGV2LT5wcml2KSktPmJhc2UgPQkodW5zaWduZWQgbG9uZykgaXNhX2J1c190b192aXJ0KGRldi0+bWVtX3N0YXJ0KSArIHNpemUgLSAweDAxMDAwMDAwOworCWFsbG9jNTg2KGRldik7CisKKwkvKiBzZXQgbnVtYmVyIG9mIHJlY2VpdmUtYnVmZnMgYWNjb3JkaW5nIHRvIG1lbXNpemUgKi8KKwlpZihzaXplID09IDB4MjAwMCkKKwkJKChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXYpLT5udW1fcmVjdl9idWZmcyA9IE5VTV9SRUNWX0JVRkZTXzg7CisJZWxzZQorCQkoKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdiktPm51bV9yZWN2X2J1ZmZzID0gTlVNX1JFQ1ZfQlVGRlNfMTY7CisKKwlwcmludGsoIk1lbWFkZHI6IDB4JWx4LCBNZW1zaXplOiAlZCwgIixkZXYtPm1lbV9zdGFydCxzaXplKTsKKworCWlmKGRldi0+aXJxIDwgMikKKwl7CisJCXVuc2lnbmVkIGxvbmcgaXJxX21hc2s7CisKKwkJaXJxX21hc2sgPSBwcm9iZV9pcnFfb24oKTsKKwkJbmlfcmVzZXQ1ODYoKTsKKwkJbmlfYXR0bjU4NigpOworCisJCW1kZWxheSgyMCk7CisJCWRldi0+aXJxID0gcHJvYmVfaXJxX29mZihpcnFfbWFzayk7CisJCWlmKCFkZXYtPmlycSkKKwkJeworCQkJcHJpbnRrKCI/YXV0b2lycSwgRmFpbGVkIHRvIGRldGVjdCBJUlEgbGluZSFcbiIpOworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWdvdG8gb3V0OworCQl9CisJCXByaW50aygiSVJRICVkIChhdXRvZGV0ZWN0ZWQpLlxuIixkZXYtPmlycSk7CisJfQorCWVsc2UJeworCQlpZihkZXYtPmlycSA9PSAyKQorCQkJZGV2LT5pcnEgPSA5OworCQlwcmludGsoIklSUSAlZCAoYXNzaWduZWQgYW5kIG5vdCBjaGVja2VkISkuXG4iLGRldi0+aXJxKTsKKwl9CisKKwlkZXYtPm9wZW4JCT0gbmk1Ml9vcGVuOworCWRldi0+c3RvcAkJPSBuaTUyX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzCQk9IG5pNTJfZ2V0X3N0YXRzOworCWRldi0+dHhfdGltZW91dCAJPSBuaTUyX3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwk9IEhaLzIwOworCWRldi0+aGFyZF9zdGFydF94bWl0IAk9IG5pNTJfc2VuZF9wYWNrZXQ7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfbXVsdGljYXN0X2xpc3Q7CisKKwlkZXYtPmlmX3BvcnQgCQk9IDA7CisKKwlyZXR1cm4gMDsKK291dDoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIE5JNTJfVE9UQUxfU0laRSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGluaXQgdGhlIGNoaXAgKG5pNTItaW50ZXJydXB0IHNob3VsZCBiZSBkaXNhYmxlZD8hKQorICogbmVlZHMgYSBjb3JyZWN0ICdhbGxvY2F0ZWQnIG1lbW9yeQorICovCisKK3N0YXRpYyBpbnQgaW5pdDU4NihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXZvaWQgKnB0cjsKKwlpbnQgaSxyZXN1bHQ9MDsKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisJdm9sYXRpbGUgc3RydWN0IGNvbmZpZ3VyZV9jbWRfc3RydWN0CSpjZmdfY21kOworCXZvbGF0aWxlIHN0cnVjdCBpYXNldHVwX2NtZF9zdHJ1Y3QgKmlhc19jbWQ7CisJdm9sYXRpbGUgc3RydWN0IHRkcl9jbWRfc3RydWN0ICp0ZHJfY21kOworCXZvbGF0aWxlIHN0cnVjdCBtY3NldHVwX2NtZF9zdHJ1Y3QgKm1jX2NtZDsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaT1kZXYtPm1jX2xpc3Q7CisJaW50IG51bV9hZGRycz1kZXYtPm1jX2NvdW50OworCisJcHRyID0gKHZvaWQgKikgKChjaGFyICopcC0+c2NiICsgc2l6ZW9mKHN0cnVjdCBzY2Jfc3RydWN0KSk7CisKKwljZmdfY21kID0gKHN0cnVjdCBjb25maWd1cmVfY21kX3N0cnVjdCAqKXB0cjsgLyogY29uZmlndXJlLWNvbW1hbmQgKi8KKwljZmdfY21kLT5jbWRfc3RhdHVzCT0gMDsKKwljZmdfY21kLT5jbWRfY21kCT0gQ01EX0NPTkZJR1VSRSB8IENNRF9MQVNUOworCWNmZ19jbWQtPmNtZF9saW5rCT0gMHhmZmZmOworCisJY2ZnX2NtZC0+Ynl0ZV9jbnQJPSAweDBhOyAvKiBudW1iZXIgb2YgY2ZnIGJ5dGVzICovCisJY2ZnX2NtZC0+ZmlmbwkJPSBmaWZvOyAvKiBmaWZvLWxpbWl0ICg4PXR4OjMyL3J4OjY0KSAqLworCWNmZ19jbWQtPnNhdl9iZgkJPSAweDQwOyAvKiBob2xkIG9yIGRpc2NhcmQgYmFkIHJlY3YgZnJhbWVzIChiaXQgNykgKi8KKwljZmdfY21kLT5hZHJfbGVuCT0gMHgyZTsgLyogYWRkcl9sZW4gfCFzcmNfaW5zZXJ0IHxwcmUtbGVuIHxsb29wYmFjayAqLworCWNmZ19jbWQtPnByaW9yaXR5CT0gMHgwMDsKKwljZmdfY21kLT5pZnMJCT0gMHg2MDsKKwljZmdfY21kLT50aW1lX2xvdwk9IDB4MDA7CisJY2ZnX2NtZC0+dGltZV9oaWdoCT0gMHhmMjsKKwljZmdfY21kLT5wcm9taXNjCT0gMDsKKwlpZihkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCWludCBsZW4gPSAoKGNoYXIgKikgcC0+aXNjcCAtIChjaGFyICopIHB0ciAtIDgpIC8gNjsKKwkJaWYobnVtX2FkZHJzID4gbGVuKQl7CisJCQlwcmludGsoIiVzOiBzd2l0Y2hpbmcgdG8gcHJvbWlzYy4gbW9kZVxuIixkZXYtPm5hbWUpOworCQkJZGV2LT5mbGFnc3w9SUZGX1BST01JU0M7CisJCX0KKwl9CisJaWYoZGV2LT5mbGFncyZJRkZfUFJPTUlTQykKKwl7CisJCQkgY2ZnX2NtZC0+cHJvbWlzYz0xOworCQkJIGRldi0+ZmxhZ3N8PUlGRl9QUk9NSVNDOworCX0KKwljZmdfY21kLT5jYXJyX2NvbGwJPSAweDAwOworCisJcC0+c2NiLT5jYmxfb2Zmc2V0CT0gbWFrZTE2KGNmZ19jbWQpOworCXAtPnNjYi0+Y21kX3J1YwkJPSAwOworCisJcC0+c2NiLT5jbWRfY3VjCQk9IENVQ19TVEFSVDsgLyogY21kLi11bml0IHN0YXJ0ICovCisJbmlfYXR0bjU4NigpOworCisJV0FJVF80X1NUQVRfQ09NUEwoY2ZnX2NtZCk7CisKKwlpZigoY2ZnX2NtZC0+Y21kX3N0YXR1cyAmIChTVEFUX09LfFNUQVRfQ09NUEwpKSAhPSAoU1RBVF9DT01QTHxTVEFUX09LKSkKKwl7CisJCXByaW50aygiJXM6IGNvbmZpZ3VyZSBjb21tYW5kIGZhaWxlZDogJXhcbiIsZGV2LT5uYW1lLGNmZ19jbWQtPmNtZF9zdGF0dXMpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIGluZGl2aWR1YWwgYWRkcmVzcyBzZXR1cAorCSAqLworCisJaWFzX2NtZCA9IChzdHJ1Y3QgaWFzZXR1cF9jbWRfc3RydWN0ICopcHRyOworCisJaWFzX2NtZC0+Y21kX3N0YXR1cwk9IDA7CisJaWFzX2NtZC0+Y21kX2NtZAk9IENNRF9JQVNFVFVQIHwgQ01EX0xBU1Q7CisJaWFzX2NtZC0+Y21kX2xpbmsJPSAweGZmZmY7CisKKwltZW1jcHkoKGNoYXIgKikmaWFzX2NtZC0+aWFkZHIsKGNoYXIgKikgZGV2LT5kZXZfYWRkcixFVEhfQUxFTik7CisKKwlwLT5zY2ItPmNibF9vZmZzZXQgPSBtYWtlMTYoaWFzX2NtZCk7CisKKwlwLT5zY2ItPmNtZF9jdWMgPSBDVUNfU1RBUlQ7IC8qIGNtZC4tdW5pdCBzdGFydCAqLworCW5pX2F0dG41ODYoKTsKKworCVdBSVRfNF9TVEFUX0NPTVBMKGlhc19jbWQpOworCisJaWYoKGlhc19jbWQtPmNtZF9zdGF0dXMgJiAoU1RBVF9PS3xTVEFUX0NPTVBMKSkgIT0gKFNUQVRfT0t8U1RBVF9DT01QTCkpIHsKKwkJcHJpbnRrKCIlcyAobmk1Mik6IGluZGl2aWR1YWwgYWRkcmVzcyBzZXR1cCBjb21tYW5kIGZhaWxlZDogJTA0eFxuIixkZXYtPm5hbWUsaWFzX2NtZC0+Y21kX3N0YXR1cyk7CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogVERSLCB3aXJlIGNoZWNrIC4uIGUuZy4gbm8gcmVzaXN0b3IgZS50LmMKKwkgKi8KKwkgCisJdGRyX2NtZCA9IChzdHJ1Y3QgdGRyX2NtZF9zdHJ1Y3QgKilwdHI7CisKKwl0ZHJfY21kLT5jbWRfc3RhdHVzCT0gMDsKKwl0ZHJfY21kLT5jbWRfY21kCT0gQ01EX1REUiB8IENNRF9MQVNUOworCXRkcl9jbWQtPmNtZF9saW5rCT0gMHhmZmZmOworCXRkcl9jbWQtPnN0YXR1cwkJPSAwOworCisJcC0+c2NiLT5jYmxfb2Zmc2V0ID0gbWFrZTE2KHRkcl9jbWQpOworCXAtPnNjYi0+Y21kX2N1YyA9IENVQ19TVEFSVDsgLyogY21kLi11bml0IHN0YXJ0ICovCisJbmlfYXR0bjU4NigpOworCisJV0FJVF80X1NUQVRfQ09NUEwodGRyX2NtZCk7CisKKwlpZighKHRkcl9jbWQtPmNtZF9zdGF0dXMgJiBTVEFUX0NPTVBMKSkKKwl7CisJCXByaW50aygiJXM6IFByb2JsZW1zIHdoaWxlIHJ1bm5pbmcgdGhlIFREUi5cbiIsZGV2LT5uYW1lKTsKKwl9CisJZWxzZQorCXsKKwkJREVMQVlfMTYoKTsgLyogd2FpdCBmb3IgcmVzdWx0ICovCisJCXJlc3VsdCA9IHRkcl9jbWQtPnN0YXR1czsKKworCQlwLT5zY2ItPmNtZF9jdWMgPSBwLT5zY2ItPmN1cyAmIFNUQVRfTUFTSzsKKwkJbmlfYXR0bjU4NigpOyAvKiBhY2sgdGhlIGludGVycnVwdHMgKi8KKworCQlpZihyZXN1bHQgJiBURFJfTE5LX09LKQorCQkJOworCQllbHNlIGlmKHJlc3VsdCAmIFREUl9YQ1ZSX1BSQikKKwkJCXByaW50aygiJXM6IFREUjogVHJhbnNjZWl2ZXIgcHJvYmxlbS4gQ2hlY2sgdGhlIGNhYmxlKHMpIVxuIixkZXYtPm5hbWUpOworCQllbHNlIGlmKHJlc3VsdCAmIFREUl9FVF9PUE4pCisJCQlwcmludGsoIiVzOiBURFI6IE5vIGNvcnJlY3QgdGVybWluYXRpb24gJWQgY2xvY2tzIGF3YXkuXG4iLGRldi0+bmFtZSxyZXN1bHQgJiBURFJfVElNRU1BU0spOworCQllbHNlIGlmKHJlc3VsdCAmIFREUl9FVF9TUlQpCisJCXsKKwkJCWlmIChyZXN1bHQgJiBURFJfVElNRU1BU0spIC8qIHRpbWUgPT0gMCAtPiBzdHJhbmdlIDotKSAqLworCQkJCXByaW50aygiJXM6IFREUjogRGV0ZWN0ZWQgYSBzaG9ydCBjaXJjdWl0ICVkIGNsb2NrcyBhd2F5LlxuIixkZXYtPm5hbWUscmVzdWx0ICYgVERSX1RJTUVNQVNLKTsKKwkJfQorCQllbHNlCisJCQlwcmludGsoIiVzOiBURFI6IFVua25vd24gc3RhdHVzICUwNHhcbiIsZGV2LT5uYW1lLHJlc3VsdCk7CisJfQorCisJLyoKKwkgKiBNdWx0aWNhc3Qgc2V0dXAKKwkgKi8KKwlpZihudW1fYWRkcnMgJiYgIShkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpICkKKwl7CisJCW1jX2NtZCA9IChzdHJ1Y3QgbWNzZXR1cF9jbWRfc3RydWN0ICopIHB0cjsKKwkJbWNfY21kLT5jbWRfc3RhdHVzID0gMDsKKwkJbWNfY21kLT5jbWRfY21kID0gQ01EX01DU0VUVVAgfCBDTURfTEFTVDsKKwkJbWNfY21kLT5jbWRfbGluayA9IDB4ZmZmZjsKKwkJbWNfY21kLT5tY19jbnQgPSBudW1fYWRkcnMgKiA2OworCisJCWZvcihpPTA7aTxudW1fYWRkcnM7aSsrLGRtaT1kbWktPm5leHQpCisJCQltZW1jcHkoKGNoYXIgKikgbWNfY21kLT5tY19saXN0W2ldLCBkbWktPmRtaV9hZGRyLDYpOworCisJCXAtPnNjYi0+Y2JsX29mZnNldCA9IG1ha2UxNihtY19jbWQpOworCQlwLT5zY2ItPmNtZF9jdWMgPSBDVUNfU1RBUlQ7CisJCW5pX2F0dG41ODYoKTsKKworCQlXQUlUXzRfU1RBVF9DT01QTChtY19jbWQpOworCisJCWlmKCAobWNfY21kLT5jbWRfc3RhdHVzICYgKFNUQVRfQ09NUEx8U1RBVF9PSykpICE9IChTVEFUX0NPTVBMfFNUQVRfT0spICkKKwkJCXByaW50aygiJXM6IENhbid0IGFwcGx5IG11bHRpY2FzdC1hZGRyZXNzLWxpc3QuXG4iLGRldi0+bmFtZSk7CisJfQorCisJLyoKKwkgKiBhbGxvYyBub3AveG1pdC1jbWRzCisJICovCisjaWYgKE5VTV9YTUlUX0JVRkZTID09IDEpCisJZm9yKGk9MDtpPDI7aSsrKQorCXsKKwkJcC0+bm9wX2NtZHNbaV0gCQkJPSAoc3RydWN0IG5vcF9jbWRfc3RydWN0ICopcHRyOworCQlwLT5ub3BfY21kc1tpXS0+Y21kX2NtZAkJPSBDTURfTk9QOworCQlwLT5ub3BfY21kc1tpXS0+Y21kX3N0YXR1cyAJPSAwOworCQlwLT5ub3BfY21kc1tpXS0+Y21kX2xpbmsJPSBtYWtlMTYoKHAtPm5vcF9jbWRzW2ldKSk7CisJCXB0ciA9IChjaGFyICopIHB0ciArIHNpemVvZihzdHJ1Y3Qgbm9wX2NtZF9zdHJ1Y3QpOworCX0KKyNlbHNlCisJZm9yKGk9MDtpPE5VTV9YTUlUX0JVRkZTO2krKykKKwl7CisJCXAtPm5vcF9jbWRzW2ldCQkJPSAoc3RydWN0IG5vcF9jbWRfc3RydWN0ICopcHRyOworCQlwLT5ub3BfY21kc1tpXS0+Y21kX2NtZAkJPSBDTURfTk9QOworCQlwLT5ub3BfY21kc1tpXS0+Y21kX3N0YXR1cwk9IDA7CisJCXAtPm5vcF9jbWRzW2ldLT5jbWRfbGluawk9IG1ha2UxNigocC0+bm9wX2NtZHNbaV0pKTsKKwkJcHRyID0gKGNoYXIgKikgcHRyICsgc2l6ZW9mKHN0cnVjdCBub3BfY21kX3N0cnVjdCk7CisJfQorI2VuZGlmCisKKwlwdHIgPSBhbGxvY19yZmEoZGV2LCh2b2lkICopcHRyKTsgLyogaW5pdCByZWNlaXZlLWZyYW1lLWFyZWEgKi8KKworCS8qCisJICogYWxsb2MgeG1pdC1idWZmcyAvIGluaXQgeG1pdF9jbWRzCisJICovCisJZm9yKGk9MDtpPE5VTV9YTUlUX0JVRkZTO2krKykKKwl7CisJCXAtPnhtaXRfY21kc1tpXSA9IChzdHJ1Y3QgdHJhbnNtaXRfY21kX3N0cnVjdCAqKXB0cjsgLyp0cmFuc21pdCBjbWQvYnVmZiAwKi8KKwkJcHRyID0gKGNoYXIgKikgcHRyICsgc2l6ZW9mKHN0cnVjdCB0cmFuc21pdF9jbWRfc3RydWN0KTsKKwkJcC0+eG1pdF9jYnVmZnNbaV0gPSAoY2hhciAqKXB0cjsgLyogY2hhci1idWZmcyAqLworCQlwdHIgPSAoY2hhciAqKSBwdHIgKyBYTUlUX0JVRkZfU0laRTsKKwkJcC0+eG1pdF9idWZmc1tpXSA9IChzdHJ1Y3QgdGJkX3N0cnVjdCAqKXB0cjsgLyogVEJEICovCisJCXB0ciA9IChjaGFyICopIHB0ciArIHNpemVvZihzdHJ1Y3QgdGJkX3N0cnVjdCk7CisJCWlmKCh2b2lkICopcHRyID4gKHZvaWQgKilwLT5pc2NwKQorCQl7CisJCQlwcmludGsoIiVzOiBub3QgZW5vdWdoIHNoYXJlZC1tZW0gZm9yIHlvdXIgY29uZmlndXJhdGlvbiFcbiIsZGV2LT5uYW1lKTsKKwkJCXJldHVybiAxOworCQl9CisJCW1lbXNldCgoY2hhciAqKShwLT54bWl0X2NtZHNbaV0pICwwLCBzaXplb2Yoc3RydWN0IHRyYW5zbWl0X2NtZF9zdHJ1Y3QpKTsKKwkJbWVtc2V0KChjaGFyICopKHAtPnhtaXRfYnVmZnNbaV0pLDAsIHNpemVvZihzdHJ1Y3QgdGJkX3N0cnVjdCkpOworCQlwLT54bWl0X2NtZHNbaV0tPmNtZF9saW5rID0gbWFrZTE2KHAtPm5vcF9jbWRzWyhpKzEpJU5VTV9YTUlUX0JVRkZTXSk7CisJCXAtPnhtaXRfY21kc1tpXS0+Y21kX3N0YXR1cyA9IFNUQVRfQ09NUEw7CisJCXAtPnhtaXRfY21kc1tpXS0+Y21kX2NtZCA9IENNRF9YTUlUIHwgQ01EX0lOVDsKKwkJcC0+eG1pdF9jbWRzW2ldLT50YmRfb2Zmc2V0ID0gbWFrZTE2KChwLT54bWl0X2J1ZmZzW2ldKSk7CisJCXAtPnhtaXRfYnVmZnNbaV0tPm5leHQgPSAweGZmZmY7CisJCXAtPnhtaXRfYnVmZnNbaV0tPmJ1ZmZlciA9IG1ha2UyNCgocC0+eG1pdF9jYnVmZnNbaV0pKTsKKwl9CisKKwlwLT54bWl0X2NvdW50ID0gMDsKKwlwLT54bWl0X2xhc3QJPSAwOworI2lmbmRlZiBOT19OT1BDT01NQU5EUworCXAtPm5vcF9wb2ludAk9IDA7CisjZW5kaWYKKworCSAvKgorCQkqICdzdGFydCB0cmFuc21pdHRlcicKKwkJKi8KKyNpZm5kZWYgTk9fTk9QQ09NTUFORFMKKwlwLT5zY2ItPmNibF9vZmZzZXQgPSBtYWtlMTYocC0+bm9wX2NtZHNbMF0pOworCXAtPnNjYi0+Y21kX2N1YyA9IENVQ19TVEFSVDsKKwluaV9hdHRuNTg2KCk7CisJV0FJVF80X1NDQl9DTUQoKTsKKyNlbHNlCisJcC0+eG1pdF9jbWRzWzBdLT5jbWRfbGluayA9IG1ha2UxNihwLT54bWl0X2NtZHNbMF0pOworCXAtPnhtaXRfY21kc1swXS0+Y21kX2NtZAk9IENNRF9YTUlUIHwgQ01EX1NVU1BFTkQgfCBDTURfSU5UOworI2VuZGlmCisKKwkvKgorCSAqIGFjay4gaW50ZXJydXB0cworCSAqLworCXAtPnNjYi0+Y21kX2N1YyA9IHAtPnNjYi0+Y3VzICYgU1RBVF9NQVNLOworCW5pX2F0dG41ODYoKTsKKwlERUxBWV8xNigpOworCisJbmlfZW5haW50KCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyBpcyBhIGhlbHBlciByb3V0aW5lIGZvciBuaTUyX3Jucl9pbnQoKSBhbmQgaW5pdDU4NigpLgorICogSXQgc2V0cyB1cCB0aGUgUmVjZWl2ZSBGcmFtZSBBcmVhIChSRkEpLgorICovCisKK3N0YXRpYyB2b2lkICphbGxvY19yZmEoc3RydWN0IG5ldF9kZXZpY2UgKmRldix2b2lkICpwdHIpCit7CisJdm9sYXRpbGUgc3RydWN0IHJmZF9zdHJ1Y3QgKnJmZCA9IChzdHJ1Y3QgcmZkX3N0cnVjdCAqKXB0cjsKKwl2b2xhdGlsZSBzdHJ1Y3QgcmJkX3N0cnVjdCAqcmJkOworCWludCBpOworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKworCW1lbXNldCgoY2hhciAqKSByZmQsMCxzaXplb2Yoc3RydWN0IHJmZF9zdHJ1Y3QpKihwLT5udW1fcmVjdl9idWZmcytyZmRhZGQpKTsKKwlwLT5yZmRfZmlyc3QgPSByZmQ7CisKKwlmb3IoaSA9IDA7IGkgPCAocC0+bnVtX3JlY3ZfYnVmZnMrcmZkYWRkKTsgaSsrKSB7CisJCXJmZFtpXS5uZXh0ID0gbWFrZTE2KHJmZCArIChpKzEpICUgKHAtPm51bV9yZWN2X2J1ZmZzK3JmZGFkZCkgKTsKKwkJcmZkW2ldLnJiZF9vZmZzZXQgPSAweGZmZmY7CisJfQorCXJmZFtwLT5udW1fcmVjdl9idWZmcy0xK3JmZGFkZF0ubGFzdCA9IFJGRF9TVVNQOwkgLyogUlUgc3VzcGVuZCAqLworCisJcHRyID0gKHZvaWQgKikgKHJmZCArIChwLT5udW1fcmVjdl9idWZmcyArIHJmZGFkZCkgKTsKKworCXJiZCA9IChzdHJ1Y3QgcmJkX3N0cnVjdCAqKSBwdHI7CisJcHRyID0gKHZvaWQgKikgKHJiZCArIHAtPm51bV9yZWN2X2J1ZmZzKTsKKworCSAvKiBjbHIgZGVzY3JpcHRvcnMgKi8KKwltZW1zZXQoKGNoYXIgKikgcmJkLDAsc2l6ZW9mKHN0cnVjdCByYmRfc3RydWN0KSoocC0+bnVtX3JlY3ZfYnVmZnMpKTsKKworCWZvcihpPTA7aTxwLT5udW1fcmVjdl9idWZmcztpKyspCisJeworCQlyYmRbaV0ubmV4dCA9IG1ha2UxNigocmJkICsgKGkrMSkgJSBwLT5udW1fcmVjdl9idWZmcykpOworCQlyYmRbaV0uc2l6ZSA9IFJFQ1ZfQlVGRl9TSVpFOworCQlyYmRbaV0uYnVmZmVyID0gbWFrZTI0KHB0cik7CisJCXB0ciA9IChjaGFyICopIHB0ciArIFJFQ1ZfQlVGRl9TSVpFOworCX0KKworCXAtPnJmZF90b3AJPSBwLT5yZmRfZmlyc3Q7CisJcC0+cmZkX2xhc3QgPSBwLT5yZmRfZmlyc3QgKyAocC0+bnVtX3JlY3ZfYnVmZnMgLSAxICsgcmZkYWRkKTsKKworCXAtPnNjYi0+cmZhX29mZnNldAkJPSBtYWtlMTYocC0+cmZkX2ZpcnN0KTsKKwlwLT5yZmRfZmlyc3QtPnJiZF9vZmZzZXQJPSBtYWtlMTYocmJkKTsKKworCXJldHVybiBwdHI7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbnRlcnJ1cHQgSGFuZGxlciAuLi4KKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3Qgbmk1Ml9pbnRlcnJ1cHQoaW50IGlycSx2b2lkICpkZXZfaWQsc3RydWN0IHB0X3JlZ3MgKnJlZ19wdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0OworCWludCBjbnQ9MDsKKwlzdHJ1Y3QgcHJpdiAqcDsKKworCWlmICghZGV2KSB7CisJCXByaW50ayAoIm5pNTIxMC1pbnRlcnJ1cHQ6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwlpZihkZWJ1Z2xldmVsID4gMSkKKwkJcHJpbnRrKCJJIik7CisKKwlXQUlUXzRfU0NCX0NNRCgpOyAvKiB3YWl0IGZvciBsYXN0IGNvbW1hbmQJKi8KKworCXdoaWxlKChzdGF0PXAtPnNjYi0+Y3VzICYgU1RBVF9NQVNLKSkKKwl7CisJCXAtPnNjYi0+Y21kX2N1YyA9IHN0YXQ7CisJCW5pX2F0dG41ODYoKTsKKworCQlpZihzdGF0ICYgU1RBVF9GUikJIC8qIHJlY2VpdmVkIGEgZnJhbWUgKi8KKwkJCW5pNTJfcmN2X2ludChkZXYpOworCisJCWlmKHN0YXQgJiBTVEFUX1JOUikgLyogUlUgd2VudCAnbm90IHJlYWR5JyAqLworCQl7CisJCQlwcmludGsoIihSKSIpOworCQkJaWYocC0+c2NiLT5ydXMgJiBSVV9TVVNQRU5EKSAvKiBzcGVjaWFsIGNhc2U6IFJVX1NVU1BFTkQgKi8KKwkJCXsKKwkJCQlXQUlUXzRfU0NCX0NNRCgpOworCQkJCXAtPnNjYi0+Y21kX3J1YyA9IFJVQ19SRVNVTUU7CisJCQkJbmlfYXR0bjU4NigpOworCQkJCVdBSVRfNF9TQ0JfQ01EX1JVQygpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXByaW50aygiJXM6IFJlY2VpdmVyLVVuaXQgd2VudCAnTk9UIFJFQURZJzogJTA0eC8lMDJ4LlxuIixkZXYtPm5hbWUsKGludCkgc3RhdCwoaW50KSBwLT5zY2ItPnJ1cyk7CisJCQkJbmk1Ml9ybnJfaW50KGRldik7CisJCQl9CisJCX0KKworCQlpZihzdGF0ICYgU1RBVF9DWCkJCS8qIGNvbW1hbmQgd2l0aCBJLWJpdCBzZXQgY29tcGxldGUgKi8KKwkJCSBuaTUyX3htdF9pbnQoZGV2KTsKKworI2lmbmRlZiBOT19OT1BDT01NQU5EUworCQlpZihzdGF0ICYgU1RBVF9DTkEpCS8qIENVIHdlbnQgJ25vdCByZWFkeScgKi8KKwkJeworCQkJaWYobmV0aWZfcnVubmluZyhkZXYpKQorCQkJCXByaW50aygiJXM6IG9vcHMhIENVIGhhcyBsZWZ0IGFjdGl2ZSBzdGF0ZS4gc3RhdDogJTA0eC8lMDJ4LlxuIixkZXYtPm5hbWUsKGludCkgc3RhdCwoaW50KSBwLT5zY2ItPmN1cyk7CisJCX0KKyNlbmRpZgorCisJCWlmKGRlYnVnbGV2ZWwgPiAxKQorCQkJcHJpbnRrKCIlZCIsY250KyspOworCisJCVdBSVRfNF9TQ0JfQ01EKCk7IC8qIHdhaXQgZm9yIGFjay4gKG5pNTJfeG10X2ludCBjYW4gYmUgZmFzdGVyIHRoYW4gYWNrISEpICovCisJCWlmKHAtPnNjYi0+Y21kX2N1YykJIC8qIHRpbWVkIG91dD8gKi8KKwkJeworCQkJcHJpbnRrKCIlczogQWNrbm93bGVkZ2UgdGltZWQgb3V0LlxuIixkZXYtPm5hbWUpOworCQkJbmlfZGlzaW50KCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmKGRlYnVnbGV2ZWwgPiAxKQorCQlwcmludGsoImkiKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiByZWNlaXZlLWludGVycnVwdAorICovCisKK3N0YXRpYyB2b2lkIG5pNTJfcmN2X2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBzdGF0dXMsY250PTA7CisJdW5zaWduZWQgc2hvcnQgdG90bGVuOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHJiZF9zdHJ1Y3QgKnJiZDsKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwlpZihkZWJ1Z2xldmVsID4gMCkKKwkJcHJpbnRrKCJSIik7CisKKwlmb3IoOyhzdGF0dXMgPSBwLT5yZmRfdG9wLT5zdGF0X2hpZ2gpICYgUkZEX0NPTVBMOykKKwl7CisJCQlyYmQgPSAoc3RydWN0IHJiZF9zdHJ1Y3QgKikgbWFrZTMyKHAtPnJmZF90b3AtPnJiZF9vZmZzZXQpOworCisJCQlpZihzdGF0dXMgJiBSRkRfT0spIC8qIGZyYW1lIHJlY2VpdmVkIHdpdGhvdXQgZXJyb3I/ICovCisJCQl7CisJCQkJaWYoICh0b3RsZW4gPSByYmQtPnN0YXR1cykgJiBSQkRfTEFTVCkgLyogdGhlIGZpcnN0IGFuZCB0aGUgbGFzdCBidWZmZXI/ICovCisJCQkJeworCQkJCQl0b3RsZW4gJj0gUkJEX01BU0s7IC8qIGxlbmd0aCBvZiB0aGlzIGZyYW1lICovCisJCQkJCXJiZC0+c3RhdHVzID0gMDsKKwkJCQkJc2tiID0gKHN0cnVjdCBza19idWZmICopIGRldl9hbGxvY19za2IodG90bGVuKzIpOworCQkJCQlpZihza2IgIT0gTlVMTCkKKwkJCQkJeworCQkJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJCQlza2JfcmVzZXJ2ZShza2IsMik7CisJCQkJCQlza2JfcHV0KHNrYix0b3RsZW4pOworCQkJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsKGNoYXIgKikgcC0+YmFzZSsodW5zaWduZWQgbG9uZykgcmJkLT5idWZmZXIsdG90bGVuLDApOworCQkJCQkJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCQkJcC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCQkJcC0+c3RhdHMucnhfYnl0ZXMgKz0gdG90bGVuOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCXAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaW50IHJzdGF0OworCQkJCQkJIC8qIGZyZWUgYWxsIFJCRCdzIHVudGlsIFJCRF9MQVNUIGlzIHNldCAqLworCQkJCQl0b3RsZW4gPSAwOworCQkJCQl3aGlsZSghKChyc3RhdD1yYmQtPnN0YXR1cykgJiBSQkRfTEFTVCkpCisJCQkJCXsKKwkJCQkJCXRvdGxlbiArPSByc3RhdCAmIFJCRF9NQVNLOworCQkJCQkJaWYoIXJzdGF0KQorCQkJCQkJeworCQkJCQkJCXByaW50aygiJXM6IFdob29wcyAuLiBubyBlbmQgbWFyayBpbiBSQkQgbGlzdFxuIixkZXYtPm5hbWUpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJcmJkLT5zdGF0dXMgPSAwOworCQkJCQkJcmJkID0gKHN0cnVjdCByYmRfc3RydWN0ICopIG1ha2UzMihyYmQtPm5leHQpOworCQkJCQl9CisJCQkJCXRvdGxlbiArPSByc3RhdCAmIFJCRF9NQVNLOworCQkJCQlyYmQtPnN0YXR1cyA9IDA7CisJCQkJCXByaW50aygiJXM6IHJlY2VpdmVkIG92ZXJzaXplZCBmcmFtZSEgbGVuZ3RoOiAlZFxuIixkZXYtPm5hbWUsdG90bGVuKTsKKwkJCQkJcC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJIH0KKwkJfQorCQllbHNlIC8qIGZyYW1lICEob2spLCBvbmx5IHdpdGggJ3NhdmUtYmFkLWZyYW1lcycgKi8KKwkJeworCQkJcHJpbnRrKCIlczogb29wcyEgcmZkLWVycm9yLXN0YXR1czogJTA0eFxuIixkZXYtPm5hbWUsc3RhdHVzKTsKKwkJCXAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQl9CisJCXAtPnJmZF90b3AtPnN0YXRfaGlnaCA9IDA7CisJCXAtPnJmZF90b3AtPmxhc3QgPSBSRkRfU1VTUDsgLyogbWF5YmUgZXhjaGFuZ2UgYnkgUkZEX0xBU1QgKi8KKwkJcC0+cmZkX3RvcC0+cmJkX29mZnNldCA9IDB4ZmZmZjsKKwkJcC0+cmZkX2xhc3QtPmxhc3QgPSAwOwkJCQkvKiBkZWxldGUgUkZEX1NVU1AJKi8KKwkJcC0+cmZkX2xhc3QgPSBwLT5yZmRfdG9wOworCQlwLT5yZmRfdG9wID0gKHN0cnVjdCByZmRfc3RydWN0ICopIG1ha2UzMihwLT5yZmRfdG9wLT5uZXh0KTsgLyogc3RlcCB0byBuZXh0IFJGRCAqLworCQlwLT5zY2ItPnJmYV9vZmZzZXQgPSBtYWtlMTYocC0+cmZkX3RvcCk7CisKKwkJaWYoZGVidWdsZXZlbCA+IDApCisJCQlwcmludGsoIiVkIixjbnQrKyk7CisJfQorCisJaWYoYXV0b21hdGljX3Jlc3VtZSkKKwl7CisJCVdBSVRfNF9TQ0JfQ01EKCk7CisJCXAtPnNjYi0+Y21kX3J1YyA9IFJVQ19SRVNVTUU7CisJCW5pX2F0dG41ODYoKTsKKwkJV0FJVF80X1NDQl9DTURfUlVDKCk7CisJfQorCisjaWZkZWYgV0FJVF80X0JVU1kKKwl7CisJCWludCBpOworCQlmb3IoaT0wO2k8MTAyNDtpKyspCisJCXsKKwkJCWlmKHAtPnJmZF90b3AtPnN0YXR1cykKKwkJCQlicmVhazsKKwkJCURFTEFZXzE2KCk7CisJCQlpZihpID09IDEwMjMpCisJCQkJcHJpbnRrKCIlczogUlUgaGFzbid0IGZldGNoZWQgbmV4dCBSRkQgKG5vdCBidXN5L2NvbXBsZXRlKVxuIixkZXYtPm5hbWUpOworCQl9CisJfQorI2VuZGlmCisKKyNpZiAwCisJaWYoIWF0X2xlYXN0X29uZSkKKwl7CisJCWludCBpOworCQl2b2xhdGlsZSBzdHJ1Y3QgcmZkX3N0cnVjdCAqcmZkcz1wLT5yZmRfdG9wOworCQl2b2xhdGlsZSBzdHJ1Y3QgcmJkX3N0cnVjdCAqcmJkczsKKwkJcHJpbnRrKCIlczogcmVjZWl2ZWQgYSBGQyBpbnRyLiB3aXRob3V0IGhhdmluZyBhIGZyYW1lOiAlMDR4ICVkXG4iLGRldi0+bmFtZSxzdGF0dXMsb2xkX2F0X2xlYXN0KTsKKwkJZm9yKGk9MDtpPCAocC0+bnVtX3JlY3ZfYnVmZnMrNCk7aSsrKQorCQl7CisJCQlyYmRzID0gKHN0cnVjdCByYmRfc3RydWN0ICopIG1ha2UzMihyZmRzLT5yYmRfb2Zmc2V0KTsKKwkJCXByaW50aygiJTA0eDolMDR4ICIscmZkcy0+c3RhdHVzLHJiZHMtPnN0YXR1cyk7CisJCQlyZmRzID0gKHN0cnVjdCByZmRfc3RydWN0ICopIG1ha2UzMihyZmRzLT5uZXh0KTsKKwkJfQorCQlwcmludGsoIlxuZXJyczogJTA0eCAlMDR4IHN0YXQ6ICUwNHhcbiIsKGludClwLT5zY2ItPnJzY19lcnJzLChpbnQpcC0+c2NiLT5vdnJuX2VycnMsKGludClwLT5zY2ItPnN0YXR1cyk7CisJCXByaW50aygiXG5lcnJzOiAlMDR4ICUwNHggcnVzOiAlMDJ4LCBjdXM6ICUwMnhcbiIsKGludClwLT5zY2ItPnJzY19lcnJzLChpbnQpcC0+c2NiLT5vdnJuX2VycnMsKGludClwLT5zY2ItPnJ1cywoaW50KXAtPnNjYi0+Y3VzKTsKKwl9CisJb2xkX2F0X2xlYXN0ID0gYXRfbGVhc3Rfb25lOworI2VuZGlmCisKKwlpZihkZWJ1Z2xldmVsID4gMCkKKwkJcHJpbnRrKCJyIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBoYW5kbGUgJ1JlY2VpdmVyIHdlbnQgbm90IHJlYWR5Jy4KKyAqLworCitzdGF0aWMgdm9pZCBuaTUyX3Jucl9pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwlwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKworCVdBSVRfNF9TQ0JfQ01EKCk7CQkvKiB3YWl0IGZvciB0aGUgbGFzdCBjbWQsIFdBSVRfNF9GVUxMU1RBVD8/ICovCisJcC0+c2NiLT5jbWRfcnVjID0gUlVDX0FCT1JUOyAvKiB1c3VhbGx5IHRoZSBSVSBpcyBpbiB0aGUgJ25vIHJlc291cmNlJy1zdGF0ZSAuLiBhYm9ydCBpdCBub3cuICovCisJbmlfYXR0bjU4NigpOworCVdBSVRfNF9TQ0JfQ01EX1JVQygpOwkJLyogd2FpdCBmb3IgYWNjZXB0IGNtZC4gKi8KKworCWFsbG9jX3JmYShkZXYsKGNoYXIgKilwLT5yZmRfZmlyc3QpOworLyogbWF5YmUgYWRkIGEgY2hlY2sgaGVyZSwgYmVmb3JlIHJlc3RhcnRpbmcgdGhlIFJVICovCisJc3RhcnRyZWN2NTg2KGRldik7IC8qIHJlc3RhcnQgUlUgKi8KKworCXByaW50aygiJXM6IFJlY2VpdmUtVW5pdCByZXN0YXJ0ZWQuIFN0YXR1czogJTA0eFxuIixkZXYtPm5hbWUscC0+c2NiLT5ydXMpOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBoYW5kbGUgeG1pdCAtIGludGVycnVwdAorICovCisKK3N0YXRpYyB2b2lkIG5pNTJfeG10X2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBzdGF0dXM7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCisJaWYoZGVidWdsZXZlbCA+IDApCisJCXByaW50aygiWCIpOworCisJc3RhdHVzID0gcC0+eG1pdF9jbWRzW3AtPnhtaXRfbGFzdF0tPmNtZF9zdGF0dXM7CisJaWYoIShzdGF0dXMgJiBTVEFUX0NPTVBMKSkKKwkJcHJpbnRrKCIlczogc3RyYW5nZSAuLiB4bWl0LWludCB3aXRob3V0IGEgJ0NPTVBMRVRFJ1xuIixkZXYtPm5hbWUpOworCisJaWYoc3RhdHVzICYgU1RBVF9PSykKKwl7CisJCXAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJcC0+c3RhdHMuY29sbGlzaW9ucyArPSAoc3RhdHVzICYgVENNRF9NQVhDT0xMTUFTSyk7CisJfQorCWVsc2UKKwl7CisJCXAtPnN0YXRzLnR4X2Vycm9ycysrOworCQlpZihzdGF0dXMgJiBUQ01EX0xBVEVDT0xMKSB7CisJCQlwcmludGsoIiVzOiBsYXRlIGNvbGxpc2lvbiBkZXRlY3RlZC5cbiIsZGV2LT5uYW1lKTsKKwkJCXAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJfQorCQllbHNlIGlmKHN0YXR1cyAmIFRDTURfTk9DQVJSSUVSKSB7CisJCQlwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJcHJpbnRrKCIlczogbm8gY2FycmllciBkZXRlY3RlZC5cbiIsZGV2LT5uYW1lKTsKKwkJfQorCQllbHNlIGlmKHN0YXR1cyAmIFRDTURfTE9TVENUUykKKwkJCXByaW50aygiJXM6IGxvc3Mgb2YgQ1RTIGRldGVjdGVkLlxuIixkZXYtPm5hbWUpOworCQllbHNlIGlmKHN0YXR1cyAmIFRDTURfVU5ERVJSVU4pIHsKKwkJCXAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQlwcmludGsoIiVzOiBETUEgdW5kZXJydW4gZGV0ZWN0ZWQuXG4iLGRldi0+bmFtZSk7CisJCX0KKwkJZWxzZSBpZihzdGF0dXMgJiBUQ01EX01BWENPTEwpIHsKKwkJCXByaW50aygiJXM6IE1heC4gY29sbGlzaW9ucyBleGNlZWRlZC5cbiIsZGV2LT5uYW1lKTsKKwkJCXAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gMTY7CisJCX0KKwl9CisKKyNpZiAoTlVNX1hNSVRfQlVGRlMgPiAxKQorCWlmKCAoKytwLT54bWl0X2xhc3QpID09IE5VTV9YTUlUX0JVRkZTKQorCQlwLT54bWl0X2xhc3QgPSAwOworI2VuZGlmCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIChyZSlzdGFydCB0aGUgcmVjZWl2ZXIKKyAqLworCitzdGF0aWMgdm9pZCBzdGFydHJlY3Y1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwlXQUlUXzRfU0NCX0NNRCgpOworCVdBSVRfNF9TQ0JfQ01EX1JVQygpOworCXAtPnNjYi0+cmZhX29mZnNldCA9IG1ha2UxNihwLT5yZmRfZmlyc3QpOworCXAtPnNjYi0+Y21kX3J1YyA9IFJVQ19TVEFSVDsKKwluaV9hdHRuNTg2KCk7CQkvKiBzdGFydCBjbWQuICovCisJV0FJVF80X1NDQl9DTURfUlVDKCk7CS8qIHdhaXQgZm9yIGFjY2VwdCBjbWQuIChubyB0aW1lb3V0ISEpICovCit9CisKK3N0YXRpYyB2b2lkIG5pNTJfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKyNpZm5kZWYgTk9fTk9QQ09NTUFORFMKKwlpZihwLT5zY2ItPmN1cyAmIENVX0FDVElWRSkgLyogQ09NTUFORC1VTklUIGFjdGl2ZT8gKi8KKwl7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKyNpZmRlZiBERUJVRworCQlwcmludGsoIiVzOiBzdHJhbmdlIC4uLiB0aW1lb3V0IHdpdGggQ1UgYWN0aXZlPyE/XG4iLGRldi0+bmFtZSk7CisJCXByaW50aygiJXM6IFgwOiAlMDR4IE4wOiAlMDR4IE4xOiAlMDR4ICVkXG4iLGRldi0+bmFtZSwoaW50KXAtPnhtaXRfY21kc1swXS0+Y21kX3N0YXR1cywoaW50KXAtPm5vcF9jbWRzWzBdLT5jbWRfc3RhdHVzLChpbnQpcC0+bm9wX2NtZHNbMV0tPmNtZF9zdGF0dXMsKGludClwLT5ub3BfcG9pbnQpOworI2VuZGlmCisJCXAtPnNjYi0+Y21kX2N1YyA9IENVQ19BQk9SVDsKKwkJbmlfYXR0bjU4NigpOworCQlXQUlUXzRfU0NCX0NNRCgpOworCQlwLT5zY2ItPmNibF9vZmZzZXQgPSBtYWtlMTYocC0+bm9wX2NtZHNbcC0+bm9wX3BvaW50XSk7CisJCXAtPnNjYi0+Y21kX2N1YyA9IENVQ19TVEFSVDsKKwkJbmlfYXR0bjU4NigpOworCQlXQUlUXzRfU0NCX0NNRCgpOworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisJeworI2lmZGVmIERFQlVHCisJCXByaW50aygiJXM6IHhtaXR0ZXIgdGltZWQgb3V0LCB0cnkgdG8gcmVzdGFydCEgc3RhdDogJTAyeFxuIixkZXYtPm5hbWUscC0+c2NiLT5jdXMpOworCQlwcmludGsoIiVzOiBjb21tYW5kLXN0YXRzOiAlMDR4ICUwNHhcbiIsZGV2LT5uYW1lLHAtPnhtaXRfY21kc1swXS0+Y21kX3N0YXR1cyxwLT54bWl0X2NtZHNbMV0tPmNtZF9zdGF0dXMpOworCQlwcmludGsoIiVzOiBjaGVjaywgd2hldGhlciB5b3Ugc2V0IHRoZSByaWdodCBpbnRlcnJ1cHQgbnVtYmVyIVxuIixkZXYtPm5hbWUpOworI2VuZGlmCisJCW5pNTJfY2xvc2UoZGV2KTsKKwkJbmk1Ml9vcGVuKGRldik7CisJfQorCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzZW5kIGZyYW1lCisgKi8KKworc3RhdGljIGludCBuaTUyX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGxlbixpOworI2lmbmRlZiBOT19OT1BDT01NQU5EUworCWludCBuZXh0X25vcDsKKyNlbmRpZgorCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKworCWlmKHNrYi0+bGVuID4gWE1JVF9CVUZGX1NJWkUpCisJeworCQlwcmludGsoIiVzOiBTb3JyeSwgbWF4LiBmcmFtZWxlbmd0aCBpcyAlZCBieXRlcy4gVGhlIGxlbmd0aCBvZiB5b3VyIGZyYW1lIGlzICVkIGJ5dGVzLlxuIixkZXYtPm5hbWUsWE1JVF9CVUZGX1NJWkUsc2tiLT5sZW4pOworCQlyZXR1cm4gMDsKKwl9CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyNpZihOVU1fWE1JVF9CVUZGUyA+IDEpCisJaWYodGVzdF9hbmRfc2V0X2JpdCgwLCh2b2lkICopICZwLT5sb2NrKSkgeworCQlwcmludGsoIiVzOiBRdWV1ZSB3YXMgbG9ja2VkXG4iLGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKwllbHNlCisjZW5kaWYKKwl7CisJCW1lbWNweSgoY2hhciAqKXAtPnhtaXRfY2J1ZmZzW3AtPnhtaXRfY291bnRdLChjaGFyICopKHNrYi0+ZGF0YSksc2tiLT5sZW4pOworCQlsZW4gPSBza2ItPmxlbjsKKwkJaWYgKGxlbiA8IEVUSF9aTEVOKSB7CisJCQlsZW4gPSBFVEhfWkxFTjsKKwkJCW1lbXNldCgoY2hhciAqKXAtPnhtaXRfY2J1ZmZzW3AtPnhtaXRfY291bnRdK3NrYi0+bGVuLCAwLCBsZW4gLSBza2ItPmxlbik7CisJCX0KKworI2lmIChOVU1fWE1JVF9CVUZGUyA9PSAxKQorIwlpZmRlZiBOT19OT1BDT01NQU5EUworCisjaWZkZWYgREVCVUcKKwkJaWYocC0+c2NiLT5jdXMgJiBDVV9BQ1RJVkUpCisJCXsKKwkJCXByaW50aygiJXM6IEhtbW0gLi4gQ1UgaXMgc3RpbGwgcnVubmluZyBhbmQgd2Ugd2FubmEgc2VuZCBhIG5ldyBwYWNrZXQuXG4iLGRldi0+bmFtZSk7CisJCQlwcmludGsoIiVzOiBzdGF0OiAlMDR4ICUwNHhcbiIsZGV2LT5uYW1lLHAtPnNjYi0+Y3VzLHAtPnhtaXRfY21kc1swXS0+Y21kX3N0YXR1cyk7CisJCX0KKyNlbmRpZgorCisJCXAtPnhtaXRfYnVmZnNbMF0tPnNpemUgPSBUQkRfTEFTVCB8IGxlbjsKKwkJZm9yKGk9MDtpPDE2O2krKykKKwkJeworCQkJcC0+eG1pdF9jbWRzWzBdLT5jbWRfc3RhdHVzID0gMDsKKwkJCVdBSVRfNF9TQ0JfQ01EKCk7CisJCQlpZiggKHAtPnNjYi0+Y3VzICYgQ1VfU1RBVFVTKSA9PSBDVV9TVVNQRU5EKQorCQkJCXAtPnNjYi0+Y21kX2N1YyA9IENVQ19SRVNVTUU7CisJCQllbHNlCisJCQl7CisJCQkJcC0+c2NiLT5jYmxfb2Zmc2V0ID0gbWFrZTE2KHAtPnhtaXRfY21kc1swXSk7CisJCQkJcC0+c2NiLT5jbWRfY3VjID0gQ1VDX1NUQVJUOworCQkJfQorCisJCQluaV9hdHRuNTg2KCk7CisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCWlmKCFpKQorCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCVdBSVRfNF9TQ0JfQ01EKCk7CisJCQlpZiggKHAtPnNjYi0+Y3VzICYgQ1VfQUNUSVZFKSkgLyogdGVzdCBpdCwgYmVjYXVzZSBDVSBzb21ldGltZXMgZG9lc24ndCBzdGFydCBpbW1lZGlhdGVseSAqLworCQkJCWJyZWFrOworCQkJaWYocC0+eG1pdF9jbWRzWzBdLT5jbWRfc3RhdHVzKQorCQkJCWJyZWFrOworCQkJaWYoaT09MTUpCisJCQkJcHJpbnRrKCIlczogQ2FuJ3Qgc3RhcnQgdHJhbnNtaXQtY29tbWFuZC5cbiIsZGV2LT5uYW1lKTsKKwkJfQorIwllbHNlCisJCW5leHRfbm9wID0gKHAtPm5vcF9wb2ludCArIDEpICYgMHgxOworCQlwLT54bWl0X2J1ZmZzWzBdLT5zaXplID0gVEJEX0xBU1QgfCBsZW47CisKKwkJcC0+eG1pdF9jbWRzWzBdLT5jbWRfbGluawkgPSBwLT5ub3BfY21kc1tuZXh0X25vcF0tPmNtZF9saW5rCisJCQkJCQkJCQkJCQkJCQkJPSBtYWtlMTYoKHAtPm5vcF9jbWRzW25leHRfbm9wXSkpOworCQlwLT54bWl0X2NtZHNbMF0tPmNtZF9zdGF0dXMgPSBwLT5ub3BfY21kc1tuZXh0X25vcF0tPmNtZF9zdGF0dXMgPSAwOworCisJCXAtPm5vcF9jbWRzW3AtPm5vcF9wb2ludF0tPmNtZF9saW5rID0gbWFrZTE2KChwLT54bWl0X2NtZHNbMF0pKTsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCXAtPm5vcF9wb2ludCA9IG5leHRfbm9wOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisjCWVuZGlmCisjZWxzZQorCQlwLT54bWl0X2J1ZmZzW3AtPnhtaXRfY291bnRdLT5zaXplID0gVEJEX0xBU1QgfCBsZW47CisJCWlmKCAobmV4dF9ub3AgPSBwLT54bWl0X2NvdW50ICsgMSkgPT0gTlVNX1hNSVRfQlVGRlMgKQorCQkJbmV4dF9ub3AgPSAwOworCisJCXAtPnhtaXRfY21kc1twLT54bWl0X2NvdW50XS0+Y21kX3N0YXR1cwk9IDA7CisJCS8qIGxpbmtwb2ludGVyIG9mIHhtaXQtY29tbWFuZCBhbHJlYWR5IHBvaW50cyB0byBuZXh0IG5vcCBjbWQgKi8KKwkJcC0+bm9wX2NtZHNbbmV4dF9ub3BdLT5jbWRfbGluayA9IG1ha2UxNigocC0+bm9wX2NtZHNbbmV4dF9ub3BdKSk7CisJCXAtPm5vcF9jbWRzW25leHRfbm9wXS0+Y21kX3N0YXR1cyA9IDA7CisKKwkJcC0+bm9wX2NtZHNbcC0+eG1pdF9jb3VudF0tPmNtZF9saW5rID0gbWFrZTE2KChwLT54bWl0X2NtZHNbcC0+eG1pdF9jb3VudF0pKTsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCXAtPnhtaXRfY291bnQgPSBuZXh0X25vcDsKKworCQl7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJc2F2ZV9mbGFncyhmbGFncyk7CisJCQljbGkoKTsKKwkJCWlmKHAtPnhtaXRfY291bnQgIT0gcC0+eG1pdF9sYXN0KQorCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCXAtPmxvY2sgPSAwOworCQkJcmVzdG9yZV9mbGFncyhmbGFncyk7CisJCX0KKwkJZGV2X2tmcmVlX3NrYihza2IpOworI2VuZGlmCisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU29tZW9uZSB3YW5uYSBoYXZlIHRoZSBzdGF0aXN0aWNzCisgKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuaTUyX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBzaG9ydCBjcmMsYWxuLHJzYyxvdnJuOworCisJY3JjID0gcC0+c2NiLT5jcmNfZXJyczsgLyogZ2V0IGVycm9yLXN0YXRpc3RpYyBmcm9tIHRoZSBuaTgyNTg2ICovCisJcC0+c2NiLT5jcmNfZXJycyA9IDA7CisJYWxuID0gcC0+c2NiLT5hbG5fZXJyczsKKwlwLT5zY2ItPmFsbl9lcnJzID0gMDsKKwlyc2MgPSBwLT5zY2ItPnJzY19lcnJzOworCXAtPnNjYi0+cnNjX2VycnMgPSAwOworCW92cm4gPSBwLT5zY2ItPm92cm5fZXJyczsKKwlwLT5zY2ItPm92cm5fZXJycyA9IDA7CisKKwlwLT5zdGF0cy5yeF9jcmNfZXJyb3JzICs9IGNyYzsKKwlwLT5zdGF0cy5yeF9maWZvX2Vycm9ycyArPSBvdnJuOworCXAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyArPSBhbG47CisJcC0+c3RhdHMucnhfZHJvcHBlZCArPSByc2M7CisKKwlyZXR1cm4gJnAtPnN0YXRzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNldCBNQyBsaXN0IC4uCisgKi8KKworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCW5pX2Rpc2ludCgpOworCWFsbG9jNTg2KGRldik7CisJaW5pdDU4NihkZXYpOworCXN0YXJ0cmVjdjU4NihkZXYpOworCW5pX2VuYWludCgpOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworI2lmZGVmIE1PRFVMRQorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfbmk1MjsKKworbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShtZW1zdGFydCwgbG9uZywgMCk7Cittb2R1bGVfcGFyYW0obWVtZW5kLCBsb25nLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJOSTUyMTAgSS9PIGJhc2UgYWRkcmVzcyxyZXF1aXJlZCIpOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJOSTUyMTAgSVJRIG51bWJlcixyZXF1aXJlZCIpOworTU9EVUxFX1BBUk1fREVTQyhtZW1zdGFydCwgIk5JNTIxMCBtZW1vcnkgYmFzZSBhZGRyZXNzLHJlcXVpcmVkIik7CitNT0RVTEVfUEFSTV9ERVNDKG1lbWVuZCwgIk5JNTIxMCBtZW1vcnkgZW5kIGFkZHJlc3MscmVxdWlyZWQiKTsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJaWYoaW8gPD0gMHgwIHx8ICFtZW1lbmQgfHwgIW1lbXN0YXJ0IHx8IGlycSA8IDIpIHsKKwkJcHJpbnRrKCJuaTUyOiBBdXRvcHJvYmluZyBub3QgYWxsb3dlZCBmb3IgbW9kdWxlcy5cbm5pNTI6IFNldCBzeW1ib2xzICdpbycgJ2lycScgJ21lbXN0YXJ0JyBhbmQgJ21lbWVuZCdcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZGV2X25pNTIgPSBuaTUyX3Byb2JlKC0xKTsKKwlpZiAoSVNfRVJSKGRldl9uaTUyKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGV2X25pNTIpOworCXJldHVybiAwOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2X25pNTIpOworCXJlbGVhc2VfcmVnaW9uKGRldl9uaTUyLT5iYXNlX2FkZHIsIE5JNTJfVE9UQUxfU0laRSk7CisJZnJlZV9uZXRkZXYoZGV2X25pNTIpOworfQorI2VuZGlmIC8qIE1PRFVMRSAqLworCisjaWYgMAorLyoKKyAqIERVTVAgLi4gd2UgZXhwZWN0IGEgbm90IHJ1bm5pbmcgQ01EIHVuaXQgYW5kIGVub3VnaCBzcGFjZQorICovCit2b2lkIG5pNTJfZHVtcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisJc3RydWN0IGR1bXBfY21kX3N0cnVjdCAqZHVtcF9jbWQgPSAoc3RydWN0IGR1bXBfY21kX3N0cnVjdCAqKSBwdHI7CisJaW50IGk7CisKKwlwLT5zY2ItPmNtZF9jdWMgPSBDVUNfQUJPUlQ7CisJbmlfYXR0bjU4NigpOworCVdBSVRfNF9TQ0JfQ01EKCk7CisJV0FJVF80X1NDQl9DTURfUlVDKCk7CisKKwlkdW1wX2NtZC0+Y21kX3N0YXR1cyA9IDA7CisJZHVtcF9jbWQtPmNtZF9jbWQgPSBDTURfRFVNUCB8IENNRF9MQVNUOworCWR1bXBfY21kLT5kdW1wX29mZnNldCA9IG1ha2UxNigoZHVtcF9jbWQgKyAxKSk7CisJZHVtcF9jbWQtPmNtZF9saW5rID0gMHhmZmZmOworCisJcC0+c2NiLT5jYmxfb2Zmc2V0ID0gbWFrZTE2KGR1bXBfY21kKTsKKwlwLT5zY2ItPmNtZF9jdWMgPSBDVUNfU1RBUlQ7CisJbmlfYXR0bjU4NigpOworCVdBSVRfNF9TVEFUX0NPTVBMKGR1bXBfY21kKTsKKworCWlmKCAoZHVtcF9jbWQtPmNtZF9zdGF0dXMgJiAoU1RBVF9DT01QTHxTVEFUX09LKSkgIT0gKFNUQVRfQ09NUEx8U1RBVF9PSykgKQorCQkJCXByaW50aygiJXM6IENhbid0IGdldCBkdW1wIGluZm9ybWF0aW9uLlxuIixkZXYtPm5hbWUpOworCisJZm9yKGk9MDtpPDE3MDtpKyspIHsKKwkJcHJpbnRrKCIlMDJ4ICIsKGludCkgKCh1bnNpZ25lZCBjaGFyICopIChkdW1wX2NtZCArIDEpKVtpXSk7CisJCWlmKGkgJSAyNCA9PSAyMykKKwkJCXByaW50aygiXG4iKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorI2VuZGlmCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qCisgKiBFTkQ6IGxpbnV4L2RyaXZlcnMvbmV0L25pNTIuYworICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uaTUyLmggYi9kcml2ZXJzL25ldC9uaTUyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhmMTkxNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L25pNTIuaApAQCAtMCwwICsxLDMxMCBAQAorLyoKKyAqIEludGVsIGk4MjU4NiBFdGhlcm5ldCBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBMaW51eCBvcGVyYXRpbmcgc3lzdGVtLCBhbmQgaXMgY292ZXJlZCBieSB0aGUKKyAqIHNhbWUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdGhhdCBjb3ZlcnMgdGhhdCB3b3JrLgorICoKKyAqIGNvcHlyaWdodHMgKGMpIDE5OTQgYnkgTWljaGFlbCBIaXBwIChoaXBwbUBpbmZvcm1hdGlrLnVuaS10dWViaW5nZW4uZGUpCisgKgorICogSSBoYXZlIGRvbmUgYSBsb29rIGluIHRoZSBmb2xsb3dpbmcgc291cmNlczoKKyAqICAgY3J5bndyLXBhY2tldC1kcml2ZXIgYnkgUnVzcyBOZWxzb24KKyAqICAgR2FycmV0IEEuIFdvbGxtYW4ncyBpODI1ODYtZHJpdmVyIGZvciBCU0QKKyAqLworCisgCisjZGVmaW5lIE5JNTJfUkVTRVQgICAgIDAgIC8qIHdyaXRpbmcgdG8gdGhpcyBhZGRyZXNzLCByZXNldHMgdGhlIGk4MjU4NiAqLworI2RlZmluZSBOSTUyX0FUVEVOVElPTiAxICAvKiBjaGFubmVsIGF0dGVudGlvbiwga2ljayB0aGUgNTg2ICovCisjZGVmaW5lIE5JNTJfVEVOQSAgICAgIDMgIC8qIDItNSBwb3NzaWJseSB3cm9uZywgWG1pdCBlbmFibGUgKi8KKyNkZWZpbmUgTkk1Ml9URElTICAgICAgMiAgLyogWG1pdCBkaXNhYmxlICovCisjZGVmaW5lIE5JNTJfSU5URU5BICAgIDUgIC8qIEludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTkk1Ml9JTlRESVMgICAgNCAgLyogSW50ZXJydXB0IGRpc2FibGUgKi8KKyNkZWZpbmUgTkk1Ml9NQUdJQzEgICAgNiAgLyogZHVubm8gZXhhY3QgZnVuY3Rpb24gKi8KKyNkZWZpbmUgTkk1Ml9NQUdJQzIgICAgNyAgLyogZHVubm8gZXhhY3QgZnVuY3Rpb24gKi8KKworI2RlZmluZSBOSTUyX01BR0lDVkFMMSAweDAwICAvKiBtYWdpYy12YWx1ZXMgZm9yIG5pNTIxMCBjYXJkICovCisjZGVmaW5lIE5JNTJfTUFHSUNWQUwyIDB4NTUKKworLyoKKyAqIHdoZXJlIHRvIGZpbmQgdGhlIFN5c3RlbSBDb25maWd1cmF0aW9uIFBvaW50ZXIgKFNDUCkKKyAqLworI2RlZmluZSBTQ1BfREVGQVVMVF9BRERSRVNTIDB4ZmZmZmY0CisKKworLyoKKyAqIFN5c3RlbSBDb25maWd1cmF0aW9uIFBvaW50ZXIgU3RydWN0CisgKi8KKworc3RydWN0IHNjcF9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgc2hvcnQgemVyb19kdW0wOwkvKiBoYXMgdG8gYmUgemVybyAqLworICB1bnNpZ25lZCBjaGFyICBzeXNidXM7CS8qIDA9MTZCaXQsMT04Qml0ICovCisgIHVuc2lnbmVkIGNoYXIgIHplcm9fZHVtMTsJLyogaGFzIHRvIGJlIHplcm8gZm9yIDU4NiAqLworICB1bnNpZ25lZCBzaG9ydCB6ZXJvX2R1bTI7CisgIHVuc2lnbmVkIHNob3J0IHplcm9fZHVtMzsKKyAgY2hhciAgICAgICAgICAqaXNjcDsJCS8qIHBvaW50ZXIgdG8gdGhlIGlzY3AtYmxvY2sgKi8KK307CisKKworLyoKKyAqIEludGVybWVkaWF0ZSBTeXN0ZW0gQ29uZmlndXJhdGlvbiBQb2ludGVyIChJU0NQKQorICovCitzdHJ1Y3QgaXNjcF9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhciAgYnVzeTsgICAgICAgICAgLyogNTg2IGNsZWFycyBhZnRlciBzdWNjZXNzZnVsIGluaXQgKi8KKyAgdW5zaWduZWQgY2hhciAgemVyb19kdW1teTsgICAgLyogaGFzIHRvIGJlIHplcm8gKi8KKyAgdW5zaWduZWQgc2hvcnQgc2NiX29mZnNldDsgICAgLyogcG9pbnRlcm9mZnNldCB0byB0aGUgc2NiX2Jhc2UgKi8KKyAgY2hhciAgICAgICAgICAqc2NiX2Jhc2U7ICAgICAgLyogYmFzZS1hZGRyZXNzIG9mIGFsbCAxNi1iaXQgb2Zmc2V0cyAqLworfTsKKworLyoKKyAqIFN5c3RlbSBDb250cm9sIEJsb2NrIChTQ0IpCisgKi8KK3N0cnVjdCBzY2Jfc3RydWN0Cit7CisgIHVuc2lnbmVkIGNoYXIgcnVzOworICB1bnNpZ25lZCBjaGFyIGN1czsKKyAgdW5zaWduZWQgY2hhciBjbWRfcnVjOyAgICAgICAgICAgLyogY29tbWFuZCB3b3JkOiBSVSBwYXJ0ICovCisgIHVuc2lnbmVkIGNoYXIgY21kX2N1YzsgICAgICAgICAgIC8qIGNvbW1hbmQgd29yZDogQ1UgcGFydCAmIEFDSyAqLworICB1bnNpZ25lZCBzaG9ydCBjYmxfb2Zmc2V0OyAgICAvKiBwb2ludGVyb2Zmc2V0LCBjb21tYW5kIGJsb2NrIGxpc3QgKi8KKyAgdW5zaWduZWQgc2hvcnQgcmZhX29mZnNldDsgICAgLyogcG9pbnRlcm9mZnNldCwgcmVjZWl2ZSBmcmFtZSBhcmVhICovCisgIHVuc2lnbmVkIHNob3J0IGNyY19lcnJzOyAgICAgIC8qIENSQy1FcnJvciBjb3VudGVyICovCisgIHVuc2lnbmVkIHNob3J0IGFsbl9lcnJzOyAgICAgIC8qIGFsaWdubWVudGVycm9yIGNvdW50ZXIgKi8KKyAgdW5zaWduZWQgc2hvcnQgcnNjX2VycnM7ICAgICAgLyogUmVzb3VyY2VlcnJvciBjb3VudGVyICovCisgIHVuc2lnbmVkIHNob3J0IG92cm5fZXJyczsgICAgIC8qIE9WZXJydW5lcnJvciBjb3VudGVyICovCit9OworCisvKgorICogcG9zc2libGUgY29tbWFuZCB2YWx1ZXMgZm9yIHRoZSBjb21tYW5kIHdvcmQKKyAqLworI2RlZmluZSBSVUNfTUFTSwkweDAwNzAJLyogbWFzayBmb3IgUlUgY29tbWFuZHMgKi8KKyNkZWZpbmUgUlVDX05PUAkJMHgwMDAwCS8qIE5PUC1jb21tYW5kICovCisjZGVmaW5lIFJVQ19TVEFSVAkweDAwMTAJLyogc3RhcnQgUlUgKi8KKyNkZWZpbmUgUlVDX1JFU1VNRQkweDAwMjAJLyogcmVzdW1lIFJVIGFmdGVyIHN1c3BlbmQgKi8KKyNkZWZpbmUgUlVDX1NVU1BFTkQJMHgwMDMwCS8qIHN1c3BlbmQgUlUgKi8KKyNkZWZpbmUgUlVDX0FCT1JUCTB4MDA0MAkvKiBhYm9ydCByZWNlaXZlciBvcGVyYXRpb24gaW1tZWRpYXRlbHkgKi8KKworI2RlZmluZSBDVUNfTUFTSyAgICAgICAgMHgwNyAgLyogbWFzayBmb3IgQ1UgY29tbWFuZCAqLworI2RlZmluZSBDVUNfTk9QICAgICAgICAgMHgwMCAgLyogTk9QLWNvbW1hbmQgKi8KKyNkZWZpbmUgQ1VDX1NUQVJUICAgICAgIDB4MDEgIC8qIHN0YXJ0IGV4ZWN1dGlvbiBvZiAxLiBjbWQgb24gdGhlIENCTCAqLworI2RlZmluZSBDVUNfUkVTVU1FICAgICAgMHgwMiAgLyogcmVzdW1lIGFmdGVyIHN1c3BlbmQgKi8KKyNkZWZpbmUgQ1VDX1NVU1BFTkQgICAgIDB4MDMgIC8qIFN1c3BlbmQgQ1UgKi8KKyNkZWZpbmUgQ1VDX0FCT1JUICAgICAgIDB4MDQgIC8qIGFib3J0IGNvbW1hbmQgb3BlcmF0aW9uIGltbWVkaWF0ZWx5ICovCisKKyNkZWZpbmUgQUNLX01BU0sgICAgICAgIDB4ZjAgIC8qIG1hc2sgZm9yIEFDSyBjb21tYW5kICovCisjZGVmaW5lIEFDS19DWCAgICAgICAgICAweDgwICAvKiBhY2tub3dsZWRnZXMgU1RBVF9DWCAqLworI2RlZmluZSBBQ0tfRlIgICAgICAgICAgMHg0MCAgLyogYWNrLiBTVEFUX0ZSICovCisjZGVmaW5lIEFDS19DTkEgICAgICAgICAweDIwICAvKiBhY2suIFNUQVRfQ05BICovCisjZGVmaW5lIEFDS19STlIgICAgICAgICAweDEwICAvKiBhY2suIFNUQVRfUk5SICovCisKKy8qCisgKiBwb3NzaWJsZSBzdGF0dXMgdmFsdWVzIGZvciB0aGUgc3RhdHVzIHdvcmQKKyAqLworI2RlZmluZSBTVEFUX01BU0sgICAgICAgMHhmMCAgLyogbWFzayBmb3IgY2F1c2Ugb2YgaW50ZXJydXB0ICovCisjZGVmaW5lIFNUQVRfQ1ggICAgICAgICAweDgwICAvKiBDVSBmaW5pc2hlZCBjbWQgd2l0aCBpdHMgSSBiaXQgc2V0ICovCisjZGVmaW5lIFNUQVRfRlIgICAgICAgICAweDQwICAvKiBSVSBmaW5pc2hlZCByZWNlaXZpbmcgYSBmcmFtZSAqLworI2RlZmluZSBTVEFUX0NOQSAgICAgICAgMHgyMCAgLyogQ1UgbGVmdCBhY3RpdmUgc3RhdGUgKi8KKyNkZWZpbmUgU1RBVF9STlIgICAgICAgIDB4MTAgIC8qIFJVIGxlZnQgcmVhZHkgc3RhdGUgKi8KKworI2RlZmluZSBDVV9TVEFUVVMgICAgICAgMHg3ICAgLyogQ1Ugc3RhdHVzLCAwPWlkbGUgKi8KKyNkZWZpbmUgQ1VfU1VTUEVORCAgICAgIDB4MSAgIC8qIENVIGlzIHN1c3BlbmRlZCAqLworI2RlZmluZSBDVV9BQ1RJVkUgICAgICAgMHgyICAgLyogQ1UgaXMgYWN0aXZlICovCisKKyNkZWZpbmUgUlVfU1RBVFVTCTB4NzAJLyogUlUgc3RhdHVzLCAwPWlkbGUgKi8KKyNkZWZpbmUgUlVfU1VTUEVORAkweDEwCS8qIFJVIHN1c3BlbmRlZCAqLworI2RlZmluZSBSVV9OT1NQQUNFCTB4MjAJLyogUlUgbm8gcmVzb3VyY2VzICovCisjZGVmaW5lIFJVX1JFQURZCTB4NDAJLyogUlUgaXMgcmVhZHkgKi8KKworLyoKKyAqIFJlY2VpdmUgRnJhbWUgRGVzY3JpcHRvciAoUkZEKQorICovCitzdHJ1Y3QgcmZkX3N0cnVjdAoreworICB1bnNpZ25lZCBjaGFyICBzdGF0X2xvdzsJLyogc3RhdHVzIHdvcmQgKi8KKyAgdW5zaWduZWQgY2hhciAgc3RhdF9oaWdoOwkvKiBzdGF0dXMgd29yZCAqLworICB1bnNpZ25lZCBjaGFyICByZmRfc2Y7CS8qIDgyNTk2IG1vZGUgb25seSAqLworICB1bnNpZ25lZCBjaGFyICBsYXN0OwkJLyogQml0MTUsTGFzdCBGcmFtZSBvbiBMaXN0IC8gQml0MTQsc3VzcGVuZCAqLworICB1bnNpZ25lZCBzaG9ydCBuZXh0OwkJLyogbGlua29mZnNldCB0byBuZXh0IFJGRCAqLworICB1bnNpZ25lZCBzaG9ydCByYmRfb2Zmc2V0OwkvKiBwb2ludGVyb2Zmc2V0IHRvIFJCRC1idWZmZXIgKi8KKyAgdW5zaWduZWQgY2hhciAgZGVzdFs2XTsJLyogZXRoZXJuZXQtYWRkcmVzcywgZGVzdGluYXRpb24gKi8KKyAgdW5zaWduZWQgY2hhciAgc291cmNlWzZdOwkvKiBldGhlcm5ldC1hZGRyZXNzLCBzb3VyY2UgKi8KKyAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOwkvKiA4MDIuMyBmcmFtZS1sZW5ndGggKi8KKyAgdW5zaWduZWQgc2hvcnQgemVyb19kdW1teTsJLyogZHVtbXkgKi8KK307CisKKyNkZWZpbmUgUkZEX0xBU1QgICAgIDB4ODAJLyogbGFzdDogbGFzdCByZmQgaW4gdGhlIGxpc3QgKi8KKyNkZWZpbmUgUkZEX1NVU1AgICAgIDB4NDAJLyogbGFzdDogc3VzcGVuZCBSVSBhZnRlciAgKi8KKyNkZWZpbmUgUkZEX0NPTVBMICAgIDB4ODAKKyNkZWZpbmUgUkZEX09LICAgICAgIDB4MjAKKyNkZWZpbmUgUkZEX0JVU1kgICAgIDB4NDAKKyNkZWZpbmUgUkZEX0VSUl9MRU4gIDB4MTAgICAgIC8qIExlbmd0aCBlcnJvciAoaWYgZW5hYmxlZCBsZW5ndGgtY2hlY2tpbmcgKi8KKyNkZWZpbmUgUkZEX0VSUl9DUkMgIDB4MDggICAgIC8qIENSQyBlcnJvciAqLworI2RlZmluZSBSRkRfRVJSX0FMR04gMHgwNCAgICAgLyogQWxpZ25tZW50IGVycm9yICovCisjZGVmaW5lIFJGRF9FUlJfUk5SICAweDAyICAgICAvKiBzdGF0dXM6IHJlY2VpdmVyIG91dCBvZiByZXNvdXJjZXMgKi8KKyNkZWZpbmUgUkZEX0VSUl9PVlIgIDB4MDEgICAgIC8qIERNQSBPdmVycnVuISAqLworCisjZGVmaW5lIFJGRF9FUlJfRlRTICAweDAwODAJLyogRnJhbWUgdG8gc2hvcnQgKi8KKyNkZWZpbmUgUkZEX0VSUl9ORU9QIDB4MDA0MAkvKiBObyBFT1AgZmxhZyAoZm9yIGJpdHN0dWZmaW5nIG9ubHkpICovCisjZGVmaW5lIFJGRF9FUlJfVFJVTiAweDAwMjAJLyogKDgyNTk2IG9ubHkvU0YgbW9kZSkgaW5kaWNhdGVzIHRydW5jYXRlZCBmcmFtZSAqLworI2RlZmluZSBSRkRfTUFUQ0hBREQgMHgwMDAyICAgICAvKiBzdGF0dXM6IERlc3RpbmF0aW9uYWRkcmVzcyAhbWF0Y2hlcyBJQSAob25seSA4MjU5NikgKi8KKyNkZWZpbmUgUkZEX0NPTExERVQgIDB4MDAwMQkvKiBEZXRlY3RlZCBjb2xsaXNpb24gZHVyaW5nIHJlY2VwdGlvbiAqLworCisvKgorICogUmVjZWl2ZSBCdWZmZXIgRGVzY3JpcHRvciAoUkJEKQorICovCitzdHJ1Y3QgcmJkX3N0cnVjdCAKK3sKKyAgdW5zaWduZWQgc2hvcnQgc3RhdHVzOwkvKiBzdGF0dXMgd29yZCxudW1iZXIgb2YgdXNlZCBieXRlcyBpbiBidWZmICovCisgIHVuc2lnbmVkIHNob3J0IG5leHQ7CQkvKiBwb2ludGVyb2Zmc2V0IHRvIG5leHQgUkJEICovCisgIGNoYXIgICAgICAgICAgKmJ1ZmZlcjsJLyogcmVjZWl2ZSBidWZmZXIgYWRkcmVzcyBwb2ludGVyICovCisgIHVuc2lnbmVkIHNob3J0IHNpemU7CQkvKiBzaXplIG9mIHRoaXMgYnVmZmVyICovCisgIHVuc2lnbmVkIHNob3J0IHplcm9fZHVtbXk7ICAgIC8qIGR1bW15ICovCit9OworCisjZGVmaW5lIFJCRF9MQVNUCTB4ODAwMAkvKiBsYXN0IGJ1ZmZlciAqLworI2RlZmluZSBSQkRfVVNFRAkweDQwMDAJLyogdGhpcyBidWZmZXIgaGFzIGRhdGEgKi8KKyNkZWZpbmUgUkJEX01BU0sJMHgzZmZmCS8qIHNpemUtbWFzayBmb3IgbGVuZ3RoICovCisKKy8qCisgKiBTdGF0dXN2YWx1ZXMgZm9yIENvbW1hbmRzL1JGRAorICovCisjZGVmaW5lIFNUQVRfQ09NUEwgICAweDgwMDAJLyogc3RhdHVzOiBmcmFtZS9jb21tYW5kIGlzIGNvbXBsZXRlICovCisjZGVmaW5lIFNUQVRfQlVTWSAgICAweDQwMDAJLyogc3RhdHVzOiBmcmFtZS9jb21tYW5kIGlzIGJ1c3kgKi8KKyNkZWZpbmUgU1RBVF9PSyAgICAgIDB4MjAwMAkvKiBzdGF0dXM6IGZyYW1lL2NvbW1hbmQgaXMgb2sgKi8KKworLyoKKyAqIEFjdGlvbi1Db21tYW5kcworICovCisjZGVmaW5lIENNRF9OT1AJCTB4MDAwMAkvKiBOT1AgKi8KKyNkZWZpbmUgQ01EX0lBU0VUVVAJMHgwMDAxCS8qIGluaXRpYWwgYWRkcmVzcyBzZXR1cCBjb21tYW5kICovCisjZGVmaW5lIENNRF9DT05GSUdVUkUJMHgwMDAyCS8qIGNvbmZpZ3VyZSBjb21tYW5kICovCisjZGVmaW5lIENNRF9NQ1NFVFVQCTB4MDAwMwkvKiBNQyBzZXR1cCBjb21tYW5kICovCisjZGVmaW5lIENNRF9YTUlUCTB4MDAwNAkvKiB0cmFuc21pdCBjb21tYW5kICovCisjZGVmaW5lIENNRF9URFIJCTB4MDAwNQkvKiB0aW1lIGRvbWFpbiByZWZsZWN0b21ldGVyIChURFIpIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ01EX0RVTVAJMHgwMDA2CS8qIGR1bXAgY29tbWFuZCAqLworI2RlZmluZSBDTURfRElBR05PU0UJMHgwMDA3CS8qIGRpYWdub3NlIGNvbW1hbmQgKi8KKworLyoKKyAqIEFjdGlvbiBjb21tYW5kIGJpdHMKKyAqLworI2RlZmluZSBDTURfTEFTVAkweDgwMDAJLyogaW5kaWNhdGVzIGxhc3QgY29tbWFuZCBpbiB0aGUgQ0JMICovCisjZGVmaW5lIENNRF9TVVNQRU5ECTB4NDAwMAkvKiBzdXNwZW5kIENVIGFmdGVyIHRoaXMgQ0IgKi8KKyNkZWZpbmUgQ01EX0lOVAkJMHgyMDAwCS8qIGdlbmVyYXRlIGludGVycnVwdCBhZnRlciBleGVjdXRpb24gKi8KKworLyoKKyAqIE5PUCAtIGNvbW1hbmQKKyAqLworc3RydWN0IG5vcF9jbWRfc3RydWN0Cit7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9zdGF0dXM7CS8qIHN0YXR1cyBvZiB0aGlzIGNvbW1hbmQgKi8KKyAgdW5zaWduZWQgc2hvcnQgY21kX2NtZDsgICAgICAgLyogdGhlIGNvbW1hbmQgaXRzZWxmICgrYml0cykgKi8KKyAgdW5zaWduZWQgc2hvcnQgY21kX2xpbms7ICAgICAgLyogb2Zmc2V0cG9pbnRlciB0byBuZXh0IGNvbW1hbmQgKi8KK307CisKKy8qCisgKiBJQSBTZXR1cCBjb21tYW5kCisgKi8KK3N0cnVjdCBpYXNldHVwX2NtZF9zdHJ1Y3QgCit7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9zdGF0dXM7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9jbWQ7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9saW5rOworICB1bnNpZ25lZCBjaGFyICBpYWRkcls2XTsKK307CisKKy8qCisgKiBDb25maWd1cmUgY29tbWFuZCAKKyAqLworc3RydWN0IGNvbmZpZ3VyZV9jbWRfc3RydWN0Cit7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9zdGF0dXM7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9jbWQ7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9saW5rOworICB1bnNpZ25lZCBjaGFyICBieXRlX2NudDsgICAvKiBzaXplIG9mIHRoZSBjb25maWctY21kICovCisgIHVuc2lnbmVkIGNoYXIgIGZpZm87ICAgICAgIC8qIGZpZm8vcmVjdiBtb25pdG9yICovCisgIHVuc2lnbmVkIGNoYXIgIHNhdl9iZjsgICAgIC8qIHNhdmUgYmFkIGZyYW1lcyAoYml0Nz0xKSovCisgIHVuc2lnbmVkIGNoYXIgIGFkcl9sZW47ICAgIC8qIGFkcl9sZW4oMC0yKSxhbF9sb2MoMykscHJlYW0oNC01KSxsb29wYmFrKDYtNykqLworICB1bnNpZ25lZCBjaGFyICBwcmlvcml0eTsgICAvKiBsaW5fcHJpbygwLTIpLGV4cF9wcmlvKDQtNiksYm9mX21ldGQoNykgKi8KKyAgdW5zaWduZWQgY2hhciAgaWZzOyAgICAgICAgLyogaW50ZXIgZnJhbWUgc3BhY2luZyAqLworICB1bnNpZ25lZCBjaGFyICB0aW1lX2xvdzsgICAvKiBzbG90IHRpbWUgbG93ICovCisgIHVuc2lnbmVkIGNoYXIgIHRpbWVfaGlnaDsgIC8qIHNsb3QgdGltZSBoaWdoKDAtMikgYW5kIG1heC4gcmV0cmllcyg0LTcpICovCisgIHVuc2lnbmVkIGNoYXIgIHByb21pc2M7ICAgIC8qIHByb21pc2MtbW9kZSgwKSAsIGV0IGFsICgxLTcpICovCisgIHVuc2lnbmVkIGNoYXIgIGNhcnJfY29sbDsgIC8qIGNhcnJpZXIoMC0zKS9jb2xsaXNpb24oNC03KSBzdHVmZiAqLworICB1bnNpZ25lZCBjaGFyICBmcmFtX2xlbjsgICAvKiBtaW5pbWFsIGZyYW1lIGxlbiAqLworICB1bnNpZ25lZCBjaGFyICBkdW1teTsJICAgICAvKiBkdW1teSAqLworfTsKKworLyoKKyAqIE11bHRpY2FzdCBTZXR1cCBjb21tYW5kIAorICovCitzdHJ1Y3QgbWNzZXR1cF9jbWRfc3RydWN0IAoreworICB1bnNpZ25lZCBzaG9ydCBjbWRfc3RhdHVzOworICB1bnNpZ25lZCBzaG9ydCBjbWRfY21kOworICB1bnNpZ25lZCBzaG9ydCBjbWRfbGluazsKKyAgdW5zaWduZWQgc2hvcnQgbWNfY250OwkJLyogbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBNQy1MaXN0ICovCisgIHVuc2lnbmVkIGNoYXIgIG1jX2xpc3RbMF1bNl07ICAJLyogcG9pbnRlciB0byA2IGJ5dGVzIGVudHJpZXMgKi8KK307CisKKy8qCisgKiBEVU1QIGNvbW1hbmQKKyAqLworc3RydWN0IGR1bXBfY21kX3N0cnVjdAoreworICB1bnNpZ25lZCBzaG9ydCBjbWRfc3RhdHVzOworICB1bnNpZ25lZCBzaG9ydCBjbWRfY21kOworICB1bnNpZ25lZCBzaG9ydCBjbWRfbGluazsKKyAgdW5zaWduZWQgc2hvcnQgZHVtcF9vZmZzZXQ7ICAgIC8qIHBvaW50ZXJvZmZzZXQgdG8gRFVNUCBzcGFjZSAqLworfTsKKworLyoKKyAqIHRyYW5zbWl0IGNvbW1hbmQgCisgKi8KK3N0cnVjdCB0cmFuc21pdF9jbWRfc3RydWN0IAoreworICB1bnNpZ25lZCBzaG9ydCBjbWRfc3RhdHVzOworICB1bnNpZ25lZCBzaG9ydCBjbWRfY21kOworICB1bnNpZ25lZCBzaG9ydCBjbWRfbGluazsKKyAgdW5zaWduZWQgc2hvcnQgdGJkX29mZnNldDsJLyogcG9pbnRlcm9mZnNldCB0byBUQkQgKi8KKyAgdW5zaWduZWQgY2hhciAgZGVzdFs2XTsgICAgICAgLyogZGVzdGluYXRpb24gYWRkcmVzcyBvZiB0aGUgZnJhbWUgKi8KKyAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOwkvKiB1c2VyIGRlZmluZWQ6IDgwMi4zIGxlbmd0aCAvIEV0aGVyIHR5cGUgKi8KK307CisKKyNkZWZpbmUgVENNRF9FUlJNQVNLICAgICAweDBmYTAKKyNkZWZpbmUgVENNRF9NQVhDT0xMTUFTSyAweDAwMGYKKyNkZWZpbmUgVENNRF9NQVhDT0xMICAgICAweDAwMjAKKyNkZWZpbmUgVENNRF9IRUFSVEJFQVQgICAweDAwNDAKKyNkZWZpbmUgVENNRF9ERUZFUlJFRCAgICAweDAwODAKKyNkZWZpbmUgVENNRF9VTkRFUlJVTiAgICAweDAxMDAKKyNkZWZpbmUgVENNRF9MT1NUQ1RTICAgICAweDAyMDAKKyNkZWZpbmUgVENNRF9OT0NBUlJJRVIgICAweDA0MDAKKyNkZWZpbmUgVENNRF9MQVRFQ09MTCAgICAweDA4MDAKKworc3RydWN0IHRkcl9jbWRfc3RydWN0Cit7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9zdGF0dXM7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9jbWQ7CisgIHVuc2lnbmVkIHNob3J0IGNtZF9saW5rOworICB1bnNpZ25lZCBzaG9ydCBzdGF0dXM7Cit9OworCisjZGVmaW5lIFREUl9MTktfT0sJMHg4MDAwCS8qIE5vIGxpbmsgcHJvYmxlbSBpZGVudGlmaWVkICovCisjZGVmaW5lIFREUl9YQ1ZSX1BSQgkweDQwMDAJLyogaW5kaWNhdGVzIGEgdHJhbnNjZWl2ZXIgcHJvYmxlbSAqLworI2RlZmluZSBURFJfRVRfT1BOCTB4MjAwMAkvKiBvcGVuLCBubyBjb3JyZWN0IHRlcm1pbmF0aW9uICovCisjZGVmaW5lIFREUl9FVF9TUlQJMHgxMDAwCS8qIFREUiBkZXRlY3RlZCBhIHNob3J0IGNpcmN1aXQgKi8KKyNkZWZpbmUgVERSX1RJTUVNQVNLCTB4MDdmZgkvKiBtYXNrIGZvciB0aGUgdGltZSBmaWVsZCAqLworCisvKgorICogVHJhbnNtaXQgQnVmZmVyIERlc2NyaXB0b3IgKFRCRCkKKyAqLworc3RydWN0IHRiZF9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgc2hvcnQgc2l6ZTsJCS8qIHNpemUgKyBFT0YtRmxhZygxNSkgKi8KKyAgdW5zaWduZWQgc2hvcnQgbmV4dDsgICAgICAgICAgLyogcG9pbnRlcm9mZnNldCB0byBuZXh0IFRCRCAqLworICBjaGFyICAgICAgICAgICpidWZmZXI7ICAgICAgICAvKiBwb2ludGVyIHRvIGJ1ZmZlciAqLworfTsKKworI2RlZmluZSBUQkRfTEFTVCAweDgwMDAgICAgICAgICAvKiBFT0YtRmxhZywgaW5kaWNhdGVzIGxhc3QgYnVmZmVyIGluIGxpc3QgKi8KKworCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmk2NS5jIGIvZHJpdmVycy9uZXQvbmk2NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNWQxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9uaTY1LmMKQEAgLTAsMCArMSwxMjc3IEBACisvKgorICogbmk2NTEwIChhbTc5OTAgJ2xhbmNlJyBjaGlwKSBkcml2ZXIgZm9yIExpbnV4LW5ldC0zCisgKiBCRVRBY29kZSB2MC43MSAoOTYvMDkvMjkpIGZvciAyLjAuMCAob3IgbGF0ZXIpCisgKiBjb3B5cmlnaHRzIChjKSAxOTk0LDE5OTUsMTk5NiBieSBNLkhpcHAKKyAqCisgKiBUaGlzIGRyaXZlciBjYW4gaGFuZGxlIHRoZSBvbGQgbmk2NTEwIGJvYXJkIGFuZCB0aGUgbmV3ZXIgbmk2NTEwCisgKiBFdGhlckJsYXN0ZXIuIChwcm9iYWJseSBpdCBhbHNvIHdvcmtzIHdpdGggZXZlcnkgZnVsbCBORTIxMDAKKyAqIGNvbXBhdGlibGUgY2FyZCkKKyAqCisgKiBUbyBjb21waWxlIGFzIG1vZHVsZSwgdHlwZToKKyAqICAgICBnY2MgLU8yIC1mb21pdC1mcmFtZS1wb2ludGVyIC1tNDg2IC1EX19LRVJORUxfXyAtRE1PRFVMRSAtYyBuaTY1LmMKKyAqIGRyaXZlciBwcm9iZXM6IGlvOiAweDM2MCwweDMwMCwweDMyMCwweDM0MCAvIGRtYTogMyw1LDYsNworICoKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBMaW51eCBvcGVyYXRpbmcgc3lzdGVtLCBhbmQgaXMgY292ZXJlZCBieSB0aGUKKyAqIHNhbWUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdGhhdCBjb3ZlcnMgdGhlIExpbnV4LWtlcm5lbC4KKyAqCisgKiBjb21tZW50cy9idWdzL3N1Z2dlc3Rpb25zIGNhbiBiZSBzZW50IHRvOgorICogICBNaWNoYWVsIEhpcHAKKyAqICAgZW1haWw6IGhpcHBtQGluZm9ybWF0aWsudW5pLXR1ZWJpbmdlbi5kZQorICoKKyAqIHNvdXJjZXM6CisgKiAgIHNvbWUgdGhpbmdzIGFyZSBmcm9tIHRoZSAnbmk2NTEwLXBhY2tldC1kcml2ZXIgZm9yIGRvcyBieSBSdXNzIE5lbHNvbicKKyAqICAgYW5kIGZyb20gdGhlIG9yaWdpbmFsIGRyaXZlcnMgYnkgRC5CZWNrZXIKKyAqCisgKiBrbm93biBwcm9ibGVtczoKKyAqICAgLSBvbiBzb21lIFBDSSBib2FyZHMgKGluY2x1ZGluZyBteSBvd24pIHRoZSBjYXJkL2JvYXJkL0lTQS1icmlkZ2UgaGFzCisgKiAgICAgcHJvYmxlbXMgd2l0aCBidXMgbWFzdGVyIERNQS4gVGhpcyByZXN1bHRzIGluIGxvdHNhIG92ZXJydW5zLgorICogICAgIEl0IG1heSBoZWxwIHRvICcjZGVmaW5lIFJDVl9QQVJBTk9JQV9DSEVDSycgb3IgdHJ5IHRvICN1bmRlZgorICogICAgIHRoZSBYTVQgYW5kIFJDVl9WSUFfU0tCIG9wdGlvbiAuLiB0aGlzIHJlZHVjZXMgZHJpdmVyIHBlcmZvcm1hbmNlLgorICogICAgIE9yIGp1c3QgcGxheSB3aXRoIHlvdXIgQklPUyBvcHRpb25zIHRvIG9wdGltaXplIElTQS1ETUEgYWNjZXNzLgorICogICAgIE1heWJlIHlvdSBhbHNvIHdhbm5hIHBsYXkgd2l0aCB0aGUgTE9XX1BFUkZPUkFNQ0UgYW5kIE1JRF9QRVJGT1JNQU5DRQorICogICAgIGRlZmluZXMgLT4gcGxlYXNlIHJlcG9ydCBtZSB5b3VyIGV4cGVyaWVuY2UgdGhlbgorICogICAtIEhhcmFsZCByZXBvcnRlZCBmb3IgQVNVUyBTUDNHIG1haW5ib2FyZHMsIHRoYXQgeW91IHNob3VsZCB1c2UKKyAqICAgICB0aGUgJ29wdGltYWwgc2V0dGluZ3MnIGZyb20gdGhlIHVzZXIncyBtYW51YWwgb24gcGFnZSAzLTEyIQorICoKKyAqIGNyZWRpdHM6CisgKiAgIHRoYW54IHRvIEphc29uIFN1bGxpdmFuIGZvciBzZW5kaW5nIG1lIGEgbmk2NTEwIGNhcmQhCisgKiAgIGxvdCBvZiBkZWJ1ZyBydW5zIHdpdGggQVNVUyBTUDNHIEJvYXJkcyAoSW50ZWwgU2F0dXJuKSBieSBIYXJhbGQgS29lbmlnCisgKgorICogc2ltcGxlIHBlcmZvcm1hbmNlIHRlc3Q6ICg0ODZEWC0zMy9OaTY1MTAtRUIgcmVjZWl2ZXMgZnJvbSA0ODZEWDQtMTAwL05pNjUxMC1FQikKKyAqICAgIGF2ZXJhZ2U6IEZUUCAtPiA4Mzg0NDIxIGJ5dGVzIHJlY2VpdmVkIGluIDguNSBzZWNvbmRzCisgKiAgICAgICAgICAgKG5vIFJDVl9WSUFfU0tCLG5vIFhNVF9WSUFfU0tCLFBBUkFOT0lBX0NIRUNLLDQgWE1JVCBCVUZTLCA4IFJDVl9CVUZGUykKKyAqICAgIHBlYWs6IEZUUCAtPiA4Mzg0NDIxIGJ5dGVzIHJlY2VpdmVkIGluIDcuNSBzZWNvbmRzCisgKiAgICAgICAgICAgKFJDVl9WSUFfU0tCLFhNVF9WSUFfU0tCLG5vIFBBUkFOT0lBX0NIRUNLLDEoISkgWE1JVCBCVUYsIDE2IFJDViBCVUZGUykKKyAqLworCisvKgorICogOTkuSnVuLjg6IGFkZGVkIHN1cHBvcnQgZm9yIC9wcm9jL25ldC9kZXYgYnl0ZSBjb3VudCBmb3IgeG9zdmlldyAoSEspCisgKiA5Ni5TZXB0LjI5OiB2aXJ0X3RvX2J1cyBzdHVmZiBhZGRlZCBmb3IgbmV3IG1lbW9yeSBtb2RlbGwKKyAqIDk2LkFwcmlsLjI5OiBBZGRlZCBIYXJhbGQgS29lbmlnJ3MgUGF0Y2hlcyAoTUgpCisgKiA5Ni5BcHJpbC4xMzogZW5oYW5jZWQgZXJyb3IgaGFuZGxpbmcgLi4gbW9yZSB0ZXN0cyAoTUgpCisgKiA5Ni5BcHJpbC41LzY6IGEgbG90IG9mIHBlcmZvcm1hbmNlIHRlc3RzLiBHb3QgaXQgc3RhYmxlIG5vdyAoaG9wZWZ1bGx5KSAoTUgpCisgKiA5Ni5BcHJpbC4xOiAobm8gam9rZSA7KSAuLiBhZGRlZCBFdGhlckJsYXN0ZXIgYW5kIE1vZHVsZSBzdXBwb3J0IChNSCkKKyAqIDk2LkZlYi4xOTogZml4ZWQgYSBmZXcgYnVncyAuLiBjbGVhbnVwcyAuLiB0ZXN0ZWQgZm9yIDEuMy42NiAoTUgpCisgKiAgICAgICAgICAgIGhvcGVmdWxseSBubyBtb3JlIDE2TUIgbGltaXQKKyAqCisgKiA5NS5Ob3YuMTg6IG11bHRpY2FzdCB0d2Vha2VkIChBQykuCisgKgorICogOTQuQXVnLjIyOiBjaGFuZ2VzIGluIHhtaXRfaW50ciAoYWNrIG1vcmUgdGhhbiBvbmUgeG1pdHRlZC1wYWNrZXQpLCBuaTY1X3NlbmRfcGFja2V0IChwLT5sb2NrKSAoTUgpCisgKgorICogOTQuSnVseS4xNjogZml4ZWQgYnVncyBpbiByZWN2X3NrYiBhbmQgc2tiLWFsbG9jIHN0dWZmICAoTUgpCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNpbmNsdWRlICJuaTY1LmgiCisKKy8qCisgKiB0aGUgY3VycmVudCBzZXR0aW5nIGFsbG93cyBhbiBhY2NlcHRhYmxlIHBlcmZvcm1hbmNlCisgKiBmb3IgJ1JDVl9QQVJBTk9JQV9DSEVDSycgcmVhZCB0aGUgJ2tub3duIHByb2JsZW1zJyBwYXJ0IGluCisgKiB0aGUgaGVhZGVyIG9mIHRoaXMgZmlsZQorICogJ2ludmVydCcgdGhlIGRlZmluZXMgZm9yIG1heC4gcGVyZm9ybWFuY2UuIFRoaXMgbWF5IGNhdXNlIERNQSBwcm9ibGVtcworICogb24gc29tZSBib2FyZHMgKGUuZyBvbiBteSBBU1VTIFNQM0cpCisgKi8KKyN1bmRlZiBYTVRfVklBX1NLQgorI3VuZGVmIFJDVl9WSUFfU0tCCisjZGVmaW5lIFJDVl9QQVJBTk9JQV9DSEVDSworCisjZGVmaW5lIE1JRF9QRVJGT1JNQU5DRQorCisjaWYgICBkZWZpbmVkKCBMT1dfUEVSRk9STUFOQ0UgKQorIHN0YXRpYyBpbnQgaXNhMD03LGlzYTE9Nyxjc3I4MD0weDBjMTA7CisjZWxpZiBkZWZpbmVkKCBNSURfUEVSRk9STUFOQ0UgKQorIHN0YXRpYyBpbnQgaXNhMD01LGlzYTE9NSxjc3I4MD0weDI4MTA7CisjZWxzZQkvKiBoaWdoIHBlcmZvcm1hbmNlICovCisgc3RhdGljIGludCBpc2EwPTQsaXNhMT00LGNzcjgwPTB4MDAxNzsKKyNlbmRpZgorCisvKgorICogYSBmZXcgY2FyZC92ZW5kb3Igc3BlY2lmaWMgZGVmaW5lcworICovCisjZGVmaW5lIE5JNjVfSUQwICAgIDB4MDAKKyNkZWZpbmUgTkk2NV9JRDEgICAgMHg1NQorI2RlZmluZSBOSTY1X0VCX0lEMCAweDUyCisjZGVmaW5lIE5JNjVfRUJfSUQxIDB4NDQKKyNkZWZpbmUgTkUyMTAwX0lEMCAgMHg1NworI2RlZmluZSBORTIxMDBfSUQxICAweDU3CisKKyNkZWZpbmUgUE9SVCBwLT5jbWRyX2FkZHIKKworLyoKKyAqIGJ1ZmZlciBjb25maWd1cmF0aW9uCisgKi8KKyNpZiAxCisjZGVmaW5lIFJNRE5VTSAxNgorI2RlZmluZSBSTUROVU1NQVNLIDB4ODAwMDAwMDAKKyNlbHNlCisjZGVmaW5lIFJNRE5VTSA4CisjZGVmaW5lIFJNRE5VTU1BU0sgMHg2MDAwMDAwMCAvKiBsb2cyKFJNRE5VTSk8PDI5ICovCisjZW5kaWYKKworI2lmIDAKKyNkZWZpbmUgVE1ETlVNIDEKKyNkZWZpbmUgVE1ETlVNTUFTSyAweDAwMDAwMDAwCisjZWxzZQorI2RlZmluZSBUTUROVU0gNAorI2RlZmluZSBUTUROVU1NQVNLIDB4NDAwMDAwMDAgLyogbG9nMihUTUROVU0pPDwyOSAqLworI2VuZGlmCisKKy8qIHNsaWdodGx5IG92ZXJzaXplZCAqLworI2RlZmluZSBSX0JVRl9TSVpFIDE1NDQKKyNkZWZpbmUgVF9CVUZfU0laRSAxNTQ0CisKKy8qCisgKiBsYW5jZSByZWdpc3RlciBkZWZpbmVzCisgKi8KKyNkZWZpbmUgTF9EQVRBUkVHIDB4MDAKKyNkZWZpbmUgTF9BRERSUkVHIDB4MDIKKyNkZWZpbmUgTF9SRVNFVCAgIDB4MDQKKyNkZWZpbmUgTF9DT05GSUcgIDB4MDUKKyNkZWZpbmUgTF9CVVNJRiAgIDB4MDYKKworLyoKKyAqIHRvIGFjY2VzcyB0aGUgbGFuY2UvYW03OTkwLXJlZ3MsIHlvdSBoYXZlIHRvIHdyaXRlCisgKiByZWctbnVtYmVyIGludG8gTF9BRERSUkVHLCB0aGVuIHlvdSBjYW4gYWNjZXNzIGl0IHVzaW5nIExfREFUQVJFRworICovCisjZGVmaW5lIENTUjAgIDB4MDAKKyNkZWZpbmUgQ1NSMSAgMHgwMQorI2RlZmluZSBDU1IyICAweDAyCisjZGVmaW5lIENTUjMgIDB4MDMKKworI2RlZmluZSBJTklUX1JJTkdfQkVGT1JFX1NUQVJUCTB4MQorI2RlZmluZSBGVUxMX1JFU0VUX09OX0VSUk9SCTB4MgorCisjaWYgMAorI2RlZmluZSB3cml0ZXJlZyh2YWwscmVnKSB7b3V0dyhyZWcsUE9SVCtMX0FERFJSRUcpO2ludyhQT1JUK0xfQUREUlJFRyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHcodmFsLFBPUlQrTF9EQVRBUkVHKTtpbncoUE9SVCtMX0RBVEFSRUcpO30KKyNkZWZpbmUgcmVhZHJlZyhyZWcpIChvdXR3KHJlZyxQT1JUK0xfQUREUlJFRyksaW53KFBPUlQrTF9BRERSUkVHKSxcCisgICAgICAgICAgICAgICAgICAgICAgIGludyhQT1JUK0xfREFUQVJFRykpCisjaWYgMAorI2RlZmluZSB3cml0ZWRhdGFyZWcodmFsKSB7b3V0dyh2YWwsUE9SVCtMX0RBVEFSRUcpO2ludyhQT1JUK0xfREFUQVJFRyk7fQorI2Vsc2UKKyNkZWZpbmUgd3JpdGVkYXRhcmVnKHZhbCkgeyAgd3JpdGVyZWcodmFsLENTUjApOyB9CisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIHdyaXRlcmVnKHZhbCxyZWcpIHtvdXR3KHJlZyxQT1JUK0xfQUREUlJFRyk7b3V0dyh2YWwsUE9SVCtMX0RBVEFSRUcpO30KKyNkZWZpbmUgcmVhZHJlZyhyZWcpIChvdXR3KHJlZyxQT1JUK0xfQUREUlJFRyksaW53KFBPUlQrTF9EQVRBUkVHKSkKKyNkZWZpbmUgd3JpdGVkYXRhcmVnKHZhbCkgeyB3cml0ZXJlZyh2YWwsQ1NSMCk7IH0KKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgY2hhciBuaV92ZW5kb3JbXSA9IHsgMHgwMiwweDA3LDB4MDEgfTsKKworc3RhdGljIHN0cnVjdCBjYXJkIHsKKwl1bnNpZ25lZCBjaGFyIGlkMCxpZDE7CisJc2hvcnQgaWRfb2Zmc2V0OworCXNob3J0IHRvdGFsX3NpemU7CisJc2hvcnQgY21kX29mZnNldDsKKwlzaG9ydCBhZGRyX29mZnNldDsKKwl1bnNpZ25lZCBjaGFyICp2ZW5kb3JfaWQ7CisJY2hhciAqY2FyZG5hbWU7CisJbG9uZyBjb25maWc7Cit9IGNhcmRzW10gPSB7CisJeworCQkuaWQwCSAgICAgPSBOSTY1X0lEMCwKKwkJLmlkMQkgICAgID0gTkk2NV9JRDEsCisJCS5pZF9vZmZzZXQgICA9IDB4MGUsCisJCS50b3RhbF9zaXplICA9IDB4MTAsCisJCS5jbWRfb2Zmc2V0ICA9IDB4MCwKKwkJLmFkZHJfb2Zmc2V0ID0gMHg4LAorCQkudmVuZG9yX2lkICAgPSBuaV92ZW5kb3IsCisJCS5jYXJkbmFtZSAgICA9ICJuaTY1MTAiLAorCQkuY29uZmlnCSAgICAgPSAweDEsCisgICAgICAgCX0sCisJeworCQkuaWQwCSAgICAgPSBOSTY1X0VCX0lEMCwKKwkJLmlkMQkgICAgID0gTkk2NV9FQl9JRDEsCisJCS5pZF9vZmZzZXQgICA9IDB4MGUsCisJCS50b3RhbF9zaXplICA9IDB4MTgsCisJCS5jbWRfb2Zmc2V0ICA9IDB4MTAsCisJCS5hZGRyX29mZnNldCA9IDB4MCwKKwkJLnZlbmRvcl9pZCAgID0gbmlfdmVuZG9yLAorCQkuY2FyZG5hbWUgICAgPSAibmk2NTEwIEV0aGVyQmxhc3RlciIsCisJCS5jb25maWcJICAgICA9IDB4MiwKKyAgICAgICAJfSwKKwl7CisJCS5pZDAJICAgICA9IE5FMjEwMF9JRDAsCisJCS5pZDEJICAgICA9IE5FMjEwMF9JRDEsCisJCS5pZF9vZmZzZXQgICA9IDB4MGUsCisJCS50b3RhbF9zaXplICA9IDB4MTgsCisJCS5jbWRfb2Zmc2V0ICA9IDB4MTAsCisJCS5hZGRyX29mZnNldCA9IDB4MCwKKwkJLnZlbmRvcl9pZCAgID0gTlVMTCwKKwkJLmNhcmRuYW1lICAgID0gImdlbmVyaWMgTkUyMTAwIiwKKwkJLmNvbmZpZwkgICAgID0gMHgwLAorCX0sCit9OworI2RlZmluZSBOVU1fQ0FSRFMgMworCitzdHJ1Y3QgcHJpdgoreworCXN0cnVjdCBybWQgcm1kaGVhZFtSTUROVU1dOworCXN0cnVjdCB0bWQgdG1kaGVhZFtUTUROVU1dOworCXN0cnVjdCBpbml0X2Jsb2NrIGliOworCWludCBybWRudW07CisJaW50IHRtZG51bSx0bWRsYXN0OworI2lmZGVmIFJDVl9WSUFfU0tCCisJc3RydWN0IHNrX2J1ZmYgKnJlY3Zfc2tiW1JNRE5VTV07CisjZWxzZQorCXZvaWQgKnJlY3Zib3VuY2VbUk1ETlVNXTsKKyNlbmRpZgorI2lmZGVmIFhNVF9WSUFfU0tCCisJc3RydWN0IHNrX2J1ZmYgKnRtZF9za2JbVE1ETlVNXTsKKyNlbmRpZgorCXZvaWQgKnRtZGJvdW5jZVtUTUROVU1dOworCWludCB0bWRib3VuY2VudW07CisJaW50IGxvY2sseG1pdF9xdWV1ZWQ7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJdm9pZCAqc2VsZjsKKwlpbnQgY21kcl9hZGRyOworCWludCBjYXJkbm87CisJaW50IGZlYXR1cmVzOworCXNwaW5sb2NrX3QgcmluZ19sb2NrOworfTsKKworc3RhdGljIGludCAgbmk2NV9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldixpbnQpOworc3RhdGljIGlycXJldHVybl90IG5pNjVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKiBkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIG5pNjVfcmVjdl9pbnRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsaW50KTsKK3N0YXRpYyB2b2lkIG5pNjVfeG1pdF9pbnRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsaW50KTsKK3N0YXRpYyBpbnQgIG5pNjVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgIG5pNjVfbGFuY2VfcmVpbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbmk2NV9pbml0X2xhbmNlKHN0cnVjdCBwcml2ICpwLHVuc2lnbmVkIGNoYXIqLGludCxpbnQpOworc3RhdGljIGludCAgbmk2NV9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICBuaTY1X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICBuaTY1X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgbmk2NV9hbGxvY19idWZmZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBuaTY1X2ZyZWVfYnVmZmVyKHN0cnVjdCBwcml2ICpwKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmk2NV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBpbnQgaXJxdGFiW10gX19pbml0ZGF0YSA9IHsgOSwxMiwxNSw1IH07IC8qIGlycSBjb25maWctdHJhbnNsYXRlICovCitzdGF0aWMgaW50IGRtYXRhYltdIF9faW5pdGRhdGEgPSB7IDAsMyw1LDYsNyB9OyAvKiBkbWEgY29uZmlnLXRyYW5zbGF0ZSBhbmQgYXV0b2RldGVjdCAqLworCitzdGF0aWMgaW50IGRlYnVnbGV2ZWwgPSAxOworCisvKgorICogc2V0ICdwZXJmb3JtYW5jZScgcmVnaXN0ZXJzIC4uIHdlIG11c3QgU1RPUCBsYW5jZSBmb3IgdGhhdAorICovCitzdGF0aWMgdm9pZCBuaTY1X3NldF9wZXJmb3JtYW5jZShzdHJ1Y3QgcHJpdiAqcCkKK3sKKwl3cml0ZXJlZyhDU1IwX1NUT1AgfCBDU1IwX0NMUkFMTCxDU1IwKTsgLyogU1RPUCAqLworCisJaWYoICEoY2FyZHNbcC0+Y2FyZG5vXS5jb25maWcgJiAweDAyKSApCisJCXJldHVybjsKKworCW91dHcoODAsUE9SVCtMX0FERFJSRUcpOworCWlmKGludyhQT1JUK0xfQUREUlJFRykgIT0gODApCisJCXJldHVybjsKKworCXdyaXRlcmVnKCAoY3NyODAgJiAweDNmZmYpICw4MCk7IC8qIEZJRk8gd2F0ZXJtYXJrcyAqLworCW91dHcoMCxQT1JUK0xfQUREUlJFRyk7CisJb3V0dygoc2hvcnQpaXNhMCxQT1JUK0xfQlVTSUYpOyAvKiB3cml0ZSBJU0EgMDogRE1BX1IgOiBpc2EwICogNTBucyAqLworCW91dHcoMSxQT1JUK0xfQUREUlJFRyk7CisJb3V0dygoc2hvcnQpaXNhMSxQT1JUK0xfQlVTSUYpOyAvKiB3cml0ZSBJU0EgMTogRE1BX1cgOiBpc2ExICogNTBucwkqLworCisJb3V0dyhDU1IwLFBPUlQrTF9BRERSUkVHKTsJLyogc3dpdGNoIGJhY2sgdG8gQ1NSMCAqLworfQorCisvKgorICogb3BlbiBpbnRlcmZhY2UgKHVwKQorICovCitzdGF0aWMgaW50IG5pNjVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKwlpbnQgaXJxdmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZuaTY1X2ludGVycnVwdCwwLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FyZHNbcC0+Y2FyZG5vXS5jYXJkbmFtZSxkZXYpOworCWlmIChpcnF2YWwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGdldCBJUlEgJWQgKGlycXZhbD0lZCkuXG4iLAorCQkgICAgICAgICAgZGV2LT5uYW1lLGRldi0+aXJxLCBpcnF2YWwpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlpZihuaTY1X2xhbmNlX3JlaW5pdChkZXYpKQorCXsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCWVsc2UKKwl7CisJCWZyZWVfaXJxKGRldi0+aXJxLGRldik7CisJCXJldHVybiAtRUFHQUlOOworCX0KK30KKworLyoKKyAqIGNsb3NlIGludGVyZmFjZSAoZG93bikKKyAqLworc3RhdGljIGludCBuaTY1X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCW91dHcoaW53KFBPUlQrTF9SRVNFVCksUE9SVCtMX1JFU0VUKTsgLyogdGhhdCdzIHRoZSBoYXJkIHdheSAqLworCisjaWZkZWYgWE1UX1ZJQV9TS0IKKwl7CisJCWludCBpOworCQlmb3IoaT0wO2k8VE1ETlVNO2krKykKKwkJeworCQkJaWYocC0+dG1kX3NrYltpXSkgeworCQkJCWRldl9rZnJlZV9za2IocC0+dG1kX3NrYltpXSk7CisJCQkJcC0+dG1kX3NrYltpXSA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKwlmcmVlX2lycShkZXYtPmlycSxkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisJZGlzYWJsZV9kbWEoZGV2LT5kbWEpOworCWZyZWVfZG1hKGRldi0+ZG1hKTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgY2FyZHNbcC0+Y2FyZG5vXS50b3RhbF9zaXplKTsKKwluaTY1X2ZyZWVfYnVmZmVyKHApOworfQorCisvKiBzZXQ6IGlvLGlycSxkbWEgb3Igc2V0IGl0IHdoZW4gY2FsbGluZyBpbnNtb2QgKi8KK3N0YXRpYyBpbnQgaXJxOworc3RhdGljIGludCBpbzsKK3N0YXRpYyBpbnQgZG1hOworCisvKgorICogUHJvYmUgVGhlIENhcmQgKG5vdCB0aGUgbGFuY2UtY2hpcCkKKyAqLworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgbmk2NV9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoMCk7CisJc3RhdGljIGludCBwb3J0c1tdID0gezB4MzYwLDB4MzAwLDB4MzIwLDB4MzQwLCAwfTsKKwlpbnQgKnBvcnQ7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwkJaXJxID0gZGV2LT5pcnE7CisJCWRtYSA9IGRldi0+ZG1hOworCX0gZWxzZSB7CisJCWRldi0+YmFzZV9hZGRyID0gaW87CisJfQorCisJaWYgKGRldi0+YmFzZV9hZGRyID4gMHgxZmYpIHsgLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLworCQllcnIgPSBuaTY1X3Byb2JlMShkZXYsIGRldi0+YmFzZV9hZGRyKTsKKwl9IGVsc2UgaWYgKGRldi0+YmFzZV9hZGRyID4gMCkgeyAvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCWVyciA9IC1FTlhJTzsKKwl9IGVsc2UgeworCQlmb3IgKHBvcnQgPSBwb3J0czsgKnBvcnQgJiYgbmk2NV9wcm9iZTEoZGV2LCAqcG9ydCk7IHBvcnQrKykKKwkJCTsKKwkJaWYgKCEqcG9ydCkKKwkJCWVyciA9IC1FTk9ERVY7CisJfQorCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCWNsZWFudXBfY2FyZChkZXYpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyoKKyAqIHRoaXMgaXMgdGhlIHJlYWwgY2FyZCBwcm9iZSAuLgorICovCitzdGF0aWMgaW50IF9faW5pdCBuaTY1X3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LGludCBpb2FkZHIpCit7CisJaW50IGksajsKKwlzdHJ1Y3QgcHJpdiAqcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2LT5pcnEgPSBpcnE7CisJZGV2LT5kbWEgPSBkbWE7CisKKwlmb3IoaT0wO2k8TlVNX0NBUkRTO2krKykgeworCQlpZighcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBjYXJkc1tpXS50b3RhbF9zaXplLCBjYXJkc1tpXS5jYXJkbmFtZSkpCisJCQljb250aW51ZTsKKwkJaWYoY2FyZHNbaV0uaWRfb2Zmc2V0ID49IDApIHsKKwkJCWlmKGluYihpb2FkZHIrY2FyZHNbaV0uaWRfb2Zmc2V0KzApICE9IGNhcmRzW2ldLmlkMCB8fAorCQkJCSBpbmIoaW9hZGRyK2NhcmRzW2ldLmlkX29mZnNldCsxKSAhPSBjYXJkc1tpXS5pZDEpIHsKKwkJCQkgcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBjYXJkc1tpXS50b3RhbF9zaXplKTsKKwkJCQkgY29udGludWU7CisJCQl9CisJCX0KKwkJaWYoY2FyZHNbaV0udmVuZG9yX2lkKSB7CisJCQlmb3Ioaj0wO2o8MztqKyspCisJCQkJaWYoaW5iKGlvYWRkcitjYXJkc1tpXS5hZGRyX29mZnNldCtqKSAhPSBjYXJkc1tpXS52ZW5kb3JfaWRbal0pIHsKKwkJCQkJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBjYXJkc1tpXS50b3RhbF9zaXplKTsKKwkJCQkJY29udGludWU7CisJCQkgIH0KKwkJfQorCQlicmVhazsKKwl9CisJaWYoaSA9PSBOVU1fQ0FSRFMpCisJCXJldHVybiAtRU5PREVWOworCisJZm9yKGo9MDtqPDY7aisrKQorCQlkZXYtPmRldl9hZGRyW2pdID0gaW5iKGlvYWRkcitjYXJkc1tpXS5hZGRyX29mZnNldCtqKTsKKworCWlmKCAoaj1uaTY1X2FsbG9jX2J1ZmZlcihkZXYpKSA8IDApIHsKKwkJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBjYXJkc1tpXS50b3RhbF9zaXplKTsKKwkJcmV0dXJuIGo7CisJfQorCXAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCXAtPmNtZHJfYWRkciA9IGlvYWRkciArIGNhcmRzW2ldLmNtZF9vZmZzZXQ7CisJcC0+Y2FyZG5vID0gaTsKKwlzcGluX2xvY2tfaW5pdCgmcC0+cmluZ19sb2NrKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBmb3VuZCBhdCAlIzN4LCAiLCBkZXYtPm5hbWUsIGNhcmRzW3AtPmNhcmRub10uY2FyZG5hbWUgLCBpb2FkZHIpOworCisJb3V0dyhpbncoUE9SVCtMX1JFU0VUKSxQT1JUK0xfUkVTRVQpOyAvKiBmaXJzdDogcmVzZXQgdGhlIGNhcmQgKi8KKwlpZiggKGo9cmVhZHJlZyhDU1IwKSkgIT0gMHg0KSB7CisJCSBwcmludGsoImZhaWxlZC5cbiIpOworCQkgcHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgUkVTRVQgY2FyZDogJTA0eFxuIiwgZGV2LT5uYW1lLCBqKTsKKwkJIG5pNjVfZnJlZV9idWZmZXIocCk7CisJCSByZWxlYXNlX3JlZ2lvbihpb2FkZHIsIGNhcmRzW3AtPmNhcmRub10udG90YWxfc2l6ZSk7CisJCSByZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlvdXR3KDg4LFBPUlQrTF9BRERSUkVHKTsKKwlpZihpbncoUE9SVCtMX0FERFJSRUcpID09IDg4KSB7CisJCXVuc2lnbmVkIGxvbmcgdjsKKwkJdiA9IGludyhQT1JUK0xfREFUQVJFRyk7CisJCXYgPDw9IDE2OworCQlvdXR3KDg5LFBPUlQrTF9BRERSUkVHKTsKKwkJdiB8PSBpbncoUE9SVCtMX0RBVEFSRUcpOworCQlwcmludGsoIlZlcnNpb24gJSMwOGx4LCAiLHYpOworCQlwLT5mZWF0dXJlcyA9IElOSVRfUklOR19CRUZPUkVfU1RBUlQ7CisJfQorCWVsc2UgeworCQlwcmludGsoImFuY2llbnQgTEFOQ0UsICIpOworCQlwLT5mZWF0dXJlcyA9IDB4MDsKKwl9CisKKwlpZih0ZXN0X2JpdCgwLCZjYXJkc1tpXS5jb25maWcpKSB7CisJCWRldi0+aXJxID0gaXJxdGFiWyhpbncoaW9hZGRyK0xfQ09ORklHKT4+MikmM107CisJCWRldi0+ZG1hID0gZG1hdGFiW2ludyhpb2FkZHIrTF9DT05GSUcpJjNdOworCQlwcmludGsoIklSUSAlZCAoZnJvbSBjYXJkKSwgRE1BICVkIChmcm9tIGNhcmQpLlxuIixkZXYtPmlycSxkZXYtPmRtYSk7CisJfQorCWVsc2UgeworCQlpZihkZXYtPmRtYSA9PSAwKSB7CisJCS8qICdzdHVjayB0ZXN0JyBmcm9tIGxhbmNlLmMgKi8KKwkJCWxvbmcgZG1hX2NoYW5uZWxzID0gKChpbmIoRE1BMV9TVEFUX1JFRykgPj4gNCkgJiAweDBmKSB8CisJCQkJCSAgICAoaW5iKERNQTJfU1RBVF9SRUcpICYgMHhmMCk7CisJCQlmb3IoaT0xO2k8NTtpKyspIHsKKwkJCQlpbnQgZG1hID0gZG1hdGFiW2ldOworCQkJCWlmKHRlc3RfYml0KGRtYSwmZG1hX2NoYW5uZWxzKSB8fCByZXF1ZXN0X2RtYShkbWEsIm5pNjUxMCIpKQorCQkJCQljb250aW51ZTsKKwkJCQkJCisJCQkJZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwkJCQlkaXNhYmxlX2RtYShkbWEpOworCQkJCXNldF9kbWFfbW9kZShkbWEsRE1BX01PREVfQ0FTQ0FERSk7CisJCQkJZW5hYmxlX2RtYShkbWEpOworCQkJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCQkJCQorCQkJCW5pNjVfaW5pdF9sYW5jZShwLGRldi0+ZGV2X2FkZHIsMCwwKTsgLyogdHJpZ2dlciBtZW1vcnkgYWNjZXNzICovCisJCQkJCisJCQkJZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwkJCQlkaXNhYmxlX2RtYShkbWEpOworCQkJCWZyZWVfZG1hKGRtYSk7CisJCQkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJCQkJCisJCQkJaWYocmVhZHJlZyhDU1IwKSAmIENTUjBfSURPTikKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZihpID09IDUpIHsKKwkJCQlwcmludGsoImZhaWxlZC5cbiIpOworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IGRldGVjdCBETUEgY2hhbm5lbCFcbiIsIGRldi0+bmFtZSk7CisJCQkJbmk2NV9mcmVlX2J1ZmZlcihwKTsKKwkJCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIGNhcmRzW3AtPmNhcmRub10udG90YWxfc2l6ZSk7CisJCQkJcmV0dXJuIC1FQUdBSU47CisJCQl9CisJCQlkZXYtPmRtYSA9IGRtYXRhYltpXTsKKwkJCXByaW50aygiRE1BICVkIChhdXRvZGV0ZWN0ZWQpLCAiLGRldi0+ZG1hKTsKKwkJfQorCQllbHNlCisJCQlwcmludGsoIkRNQSAlZCAoYXNzaWduZWQpLCAiLGRldi0+ZG1hKTsKKworCQlpZihkZXYtPmlycSA8IDIpCisJCXsKKwkJCXVuc2lnbmVkIGxvbmcgaXJxX21hc2s7CisKKwkJCW5pNjVfaW5pdF9sYW5jZShwLGRldi0+ZGV2X2FkZHIsMCwwKTsKKwkJCWlycV9tYXNrID0gcHJvYmVfaXJxX29uKCk7CisJCQl3cml0ZXJlZyhDU1IwX0lOSVR8Q1NSMF9JTkVBLENTUjApOyAvKiB0cmlnZ2VyIGludGVycnVwdCAqLworCQkJbXNsZWVwKDIwKTsKKwkJCWRldi0+aXJxID0gcHJvYmVfaXJxX29mZihpcnFfbWFzayk7CisJCQlpZighZGV2LT5pcnEpCisJCQl7CisJCQkJcHJpbnRrKCJGYWlsZWQgdG8gZGV0ZWN0IElSUSBsaW5lIVxuIik7CisJCQkJbmk2NV9mcmVlX2J1ZmZlcihwKTsKKwkJCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIGNhcmRzW3AtPmNhcmRub10udG90YWxfc2l6ZSk7CisJCQkJcmV0dXJuIC1FQUdBSU47CisJCQl9CisJCQlwcmludGsoIklSUSAlZCAoYXV0b2RldGVjdGVkKS5cbiIsZGV2LT5pcnEpOworCQl9CisJCWVsc2UKKwkJCXByaW50aygiSVJRICVkIChhc3NpZ25lZCkuXG4iLGRldi0+aXJxKTsKKwl9CisKKwlpZihyZXF1ZXN0X2RtYShkZXYtPmRtYSwgY2FyZHNbcC0+Y2FyZG5vXS5jYXJkbmFtZSApICE9IDApCisJeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCByZXF1ZXN0IGRtYS1jaGFubmVsICVkXG4iLGRldi0+bmFtZSwoaW50KSBkZXYtPmRtYSk7CisJCW5pNjVfZnJlZV9idWZmZXIocCk7CisJCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgY2FyZHNbcC0+Y2FyZG5vXS50b3RhbF9zaXplKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWRldi0+b3BlbgkJPSBuaTY1X29wZW47CisJZGV2LT5zdG9wCQk9IG5pNjVfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSBuaTY1X3NlbmRfcGFja2V0OworCWRldi0+dHhfdGltZW91dAkJPSBuaTY1X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwk9IEhaLzI7CisJZGV2LT5nZXRfc3RhdHMJCT0gbmk2NV9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfbXVsdGljYXN0X2xpc3Q7CisJcmV0dXJuIDA7IC8qIGV2ZXJ5dGhpbmcgaXMgT0sgKi8KK30KKworLyoKKyAqIHNldCBsYW5jZSByZWdpc3RlciBhbmQgdHJpZ2dlciBpbml0CisgKi8KK3N0YXRpYyB2b2lkIG5pNjVfaW5pdF9sYW5jZShzdHJ1Y3QgcHJpdiAqcCx1bnNpZ25lZCBjaGFyICpkYWRkcixpbnQgZmlsdGVyLGludCBtb2RlKQoreworCWludCBpOworCXUzMiBwaWI7CisKKwl3cml0ZXJlZyhDU1IwX0NMUkFMTHxDU1IwX1NUT1AsQ1NSMCk7CisKKwlmb3IoaT0wO2k8NjtpKyspCisJCXAtPmliLmVhZGRyW2ldID0gZGFkZHJbaV07CisKKwlmb3IoaT0wO2k8ODtpKyspCisJCXAtPmliLmZpbHRlcltpXSA9IGZpbHRlcjsKKwlwLT5pYi5tb2RlID0gbW9kZTsKKworCXAtPmliLnRycCA9ICh1MzIpIGlzYV92aXJ0X3RvX2J1cyhwLT50bWRoZWFkKSB8IFRNRE5VTU1BU0s7CisJcC0+aWIucnJwID0gKHUzMikgaXNhX3ZpcnRfdG9fYnVzKHAtPnJtZGhlYWQpIHwgUk1ETlVNTUFTSzsKKwl3cml0ZXJlZygwLENTUjMpOwkvKiBidXNtYXN0ZXIvbm8gd29yZC1zd2FwICovCisJcGliID0gKHUzMikgaXNhX3ZpcnRfdG9fYnVzKCZwLT5pYik7CisJd3JpdGVyZWcocGliICYgMHhmZmZmLENTUjEpOworCXdyaXRlcmVnKHBpYiA+PiAxNixDU1IyKTsKKworCXdyaXRlcmVnKENTUjBfSU5JVCxDU1IwKTsgLyogdGhpcyBjaGFuZ2VzIExfQUREUlJFRyB0byBDU1IwICovCisKKwlmb3IoaT0wO2k8MzI7aSsrKQorCXsKKwkJbWRlbGF5KDQpOworCQlpZihpbncoUE9SVCtMX0RBVEFSRUcpICYgKENTUjBfSURPTiB8IENTUjBfTUVSUikgKQorCQkJYnJlYWs7IC8qIGluaXQgb2sgPyAqLworCX0KK30KKworLyoKKyAqIGFsbG9jYXRlIG1lbW9yeSBhcmVhIGFuZCBjaGVjayB0aGUgMTZNQiBib3JkZXIKKyAqLworc3RhdGljIHZvaWQgKm5pNjVfYWxsb2NfbWVtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsY2hhciAqd2hhdCxpbnQgc2l6ZSxpbnQgdHlwZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiPU5VTEw7CisJdW5zaWduZWQgY2hhciAqcHRyOworCXZvaWQgKnJldDsKKworCWlmKHR5cGUpIHsKKwkJcmV0ID0gc2tiID0gYWxsb2Nfc2tiKDIrMTYrc2l6ZSxHRlBfS0VSTkVMfEdGUF9ETUEpOworCQlpZighc2tiKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5hYmxlIHRvIGFsbG9jYXRlICVzIG1lbW9yeS5cbiIsZGV2LT5uYW1lLHdoYXQpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYl9yZXNlcnZlKHNrYiwyKzE2KTsKKwkJc2tiX3B1dChza2IsUl9CVUZfU0laRSk7CSAvKiBncmFiIHRoZSB3aG9sZSBzcGFjZSAuLiAobm90IG5lY2Vzc2FyeSkgKi8KKwkJcHRyID0gc2tiLT5kYXRhOworCX0KKwllbHNlIHsKKwkJcmV0ID0gcHRyID0ga21hbGxvYyhUX0JVRl9TSVpFLEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwkJaWYoIXJldCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSAlcyBtZW1vcnkuXG4iLGRldi0+bmFtZSx3aGF0KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCWlmKCAodTMyKSB2aXJ0X3RvX3BoeXMocHRyK3NpemUpID4gMHgxMDAwMDAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgJXMgbWVtb3J5IGluIGxvd2VyIDE2TUIhXG4iLGRldi0+bmFtZSx3aGF0KTsKKwkJaWYodHlwZSkKKwkJCWtmcmVlX3NrYihza2IpOworCQllbHNlCisJCQlrZnJlZShwdHIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGFsbG9jYXRlIGFsbCBtZW1vcnkgc3RydWN0dXJlcyAuLiBzZW5kL3JlY3YgYnVmZmVycyBldGMgLi4uCisgKi8KK3N0YXRpYyBpbnQgbmk2NV9hbGxvY19idWZmZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisJc3RydWN0IHByaXYgKnA7CisJaW50IGk7CisKKwkvKgorCSAqIHdlIG5lZWQgOC1hbGlnbmVkIG1lbW9yeSAuLgorCSAqLworCXB0ciA9IG5pNjVfYWxsb2NfbWVtKGRldiwiQlVGRkVSIixzaXplb2Yoc3RydWN0IHByaXYpKzgsMCk7CisJaWYoIXB0cikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwID0gZGV2LT5wcml2ID0gKHN0cnVjdCBwcml2ICopICgoKHVuc2lnbmVkIGxvbmcpIHB0ciArIDcpICYgfjB4Nyk7CisJbWVtc2V0KChjaGFyICopIGRldi0+cHJpdiwwLHNpemVvZihzdHJ1Y3QgcHJpdikpOworCXAtPnNlbGYgPSBwdHI7CisKKwlmb3IoaT0wO2k8VE1ETlVNO2krKykKKwl7CisjaWZkZWYgWE1UX1ZJQV9TS0IKKwkJcC0+dG1kX3NrYltpXSA9IE5VTEw7CisjZW5kaWYKKwkJcC0+dG1kYm91bmNlW2ldID0gbmk2NV9hbGxvY19tZW0oZGV2LCJYTUlUIixUX0JVRl9TSVpFLDApOworCQlpZighcC0+dG1kYm91bmNlW2ldKSB7CisJCQluaTY1X2ZyZWVfYnVmZmVyKHApOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwlmb3IoaT0wO2k8Uk1ETlVNO2krKykKKwl7CisjaWZkZWYgUkNWX1ZJQV9TS0IKKwkJcC0+cmVjdl9za2JbaV0gPSBuaTY1X2FsbG9jX21lbShkZXYsIlJFQ1YiLFJfQlVGX1NJWkUsMSk7CisJCWlmKCFwLT5yZWN2X3NrYltpXSkgeworCQkJbmk2NV9mcmVlX2J1ZmZlcihwKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisjZWxzZQorCQlwLT5yZWN2Ym91bmNlW2ldID0gbmk2NV9hbGxvY19tZW0oZGV2LCJSRUNWIixSX0JVRl9TSVpFLDApOworCQlpZighcC0+cmVjdmJvdW5jZVtpXSkgeworCQkJbmk2NV9mcmVlX2J1ZmZlcihwKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gMDsgLyogZXZlcnl0aGluZyBpcyBPSyAqLworfQorCisvKgorICogZnJlZSBidWZmZXJzIGFuZCBwcml2YXRlIHN0cnVjdAorICovCitzdGF0aWMgdm9pZCBuaTY1X2ZyZWVfYnVmZmVyKHN0cnVjdCBwcml2ICpwKQoreworCWludCBpOworCisJaWYoIXApCisJCXJldHVybjsKKworCWZvcihpPTA7aTxUTUROVU07aSsrKSB7CisJCWlmKHAtPnRtZGJvdW5jZVtpXSkKKwkJCWtmcmVlKHAtPnRtZGJvdW5jZVtpXSk7CisjaWZkZWYgWE1UX1ZJQV9TS0IKKwkJaWYocC0+dG1kX3NrYltpXSkKKwkJCWRldl9rZnJlZV9za2IocC0+dG1kX3NrYltpXSk7CisjZW5kaWYKKwl9CisKKwlmb3IoaT0wO2k8Uk1ETlVNO2krKykKKwl7CisjaWZkZWYgUkNWX1ZJQV9TS0IKKwkJaWYocC0+cmVjdl9za2JbaV0pCisJCQlkZXZfa2ZyZWVfc2tiKHAtPnJlY3Zfc2tiW2ldKTsKKyNlbHNlCisJCWlmKHAtPnJlY3Zib3VuY2VbaV0pCisJCQlrZnJlZShwLT5yZWN2Ym91bmNlW2ldKTsKKyNlbmRpZgorCX0KKwlpZihwLT5zZWxmKQorCQlrZnJlZShwLT5zZWxmKTsKK30KKworCisvKgorICogc3RvcCBhbmQgKHJlKXN0YXJ0IGxhbmNlIC4uIGUuZyBhZnRlciBhbiBlcnJvcgorICovCitzdGF0aWMgdm9pZCBuaTY1X3N0b3Bfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzdHJ1Y3QgcHJpdiAqcCkKK3sKKwlpbnQgY3NyMCA9IENTUjBfSU5FQTsKKworCXdyaXRlZGF0YXJlZyhDU1IwX1NUT1ApOworCisJaWYoZGVidWdsZXZlbCA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICJuaTY1X3N0b3Bfc3RhcnRcbiIpOworCisJaWYocC0+ZmVhdHVyZXMgJiBJTklUX1JJTkdfQkVGT1JFX1NUQVJUKSB7CisJCWludCBpOworI2lmZGVmIFhNVF9WSUFfU0tCCisJCXN0cnVjdCBza19idWZmICpza2Jfc2F2ZVtUTUROVU1dOworI2VuZGlmCisJCXVuc2lnbmVkIGxvbmcgYnVmZmVyW1RNRE5VTV07CisJCXNob3J0IGJsZW5bVE1ETlVNXTsKKworCQlpZihwLT54bWl0X3F1ZXVlZCkgeworCQkJd2hpbGUoMSkgeworCQkJCWlmKChwLT50bWRoZWFkW3AtPnRtZGxhc3RdLnUucy5zdGF0dXMgJiBYTUlUX09XTikpCisJCQkJCWJyZWFrOworCQkJCXAtPnRtZGxhc3QgPSAocC0+dG1kbGFzdCArIDEpICYgKFRNRE5VTS0xKTsKKwkJCQlpZihwLT50bWRsYXN0ID09IHAtPnRtZG51bSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlmb3IoaT0wO2k8VE1ETlVNO2krKykgeworCQkJc3RydWN0IHRtZCAqdG1kcCA9IHAtPnRtZGhlYWQgKyBpOworI2lmZGVmIFhNVF9WSUFfU0tCCisJCQlza2Jfc2F2ZVtpXSA9IHAtPnRtZF9za2JbaV07CisjZW5kaWYKKwkJCWJ1ZmZlcltpXSA9ICh1MzIpIGlzYV9idXNfdG9fdmlydCh0bWRwLT51LmJ1ZmZlcik7CisJCQlibGVuW2ldID0gdG1kcC0+YmxlbjsKKwkJCXRtZHAtPnUucy5zdGF0dXMgPSAweDA7CisJCX0KKworCQlmb3IoaT0wO2k8Uk1ETlVNO2krKykgeworCQkJc3RydWN0IHJtZCAqcm1kcCA9IHAtPnJtZGhlYWQgKyBpOworCQkJcm1kcC0+dS5zLnN0YXR1cyA9IFJDVl9PV047CisJCX0KKwkJcC0+dG1kbnVtID0gcC0+eG1pdF9xdWV1ZWQgPSAwOworCQl3cml0ZWRhdGFyZWcoQ1NSMF9TVFJUIHwgY3NyMCk7CisKKwkJZm9yKGk9MDtpPFRNRE5VTTtpKyspIHsKKwkJCWludCBudW0gPSAoaSArIHAtPnRtZGxhc3QpICYgKFRNRE5VTS0xKTsKKwkJCXAtPnRtZGhlYWRbaV0udS5idWZmZXIgPSAodTMyKSBpc2FfdmlydF90b19idXMoKGNoYXIgKilidWZmZXJbbnVtXSk7IC8qIHN0YXR1cyBpcyBwYXJ0IG9mIGJ1ZmZlciBmaWVsZCAqLworCQkJcC0+dG1kaGVhZFtpXS5ibGVuID0gYmxlbltudW1dOworCQkJaWYocC0+dG1kaGVhZFtpXS51LnMuc3RhdHVzICYgWE1JVF9PV04pIHsKKwkJCQkgcC0+dG1kbnVtID0gKHAtPnRtZG51bSArIDEpICYgKFRNRE5VTS0xKTsKKwkJCQkgcC0+eG1pdF9xdWV1ZWQgPSAxOworCSB3cml0ZWRhdGFyZWcoQ1NSMF9URE1EIHwgQ1NSMF9JTkVBIHwgY3NyMCk7CisJCQl9CisjaWZkZWYgWE1UX1ZJQV9TS0IKKwkJCXAtPnRtZF9za2JbaV0gPSBza2Jfc2F2ZVtudW1dOworI2VuZGlmCisJCX0KKwkJcC0+cm1kbnVtID0gcC0+dG1kbGFzdCA9IDA7CisJCWlmKCFwLT5sb2NrKQorCQkJaWYgKHAtPnRtZG51bSB8fCAhcC0+eG1pdF9xdWV1ZWQpCisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwl9CisJZWxzZQorCQl3cml0ZWRhdGFyZWcoQ1NSMF9TVFJUIHwgY3NyMCk7Cit9CisKKy8qCisgKiBpbml0IGxhbmNlICh3cml0ZSBpbml0LXZhbHVlcyAuLiBpbml0LWJ1ZmZlcnMpIChvcGVuLWhlbHBlcikKKyAqLworc3RhdGljIGludCBuaTY1X2xhbmNlX3JlaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCSBpbnQgaTsKKwkgc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCSB1bnNpZ25lZCBsb25nIGZsYWdzOworCisJIHAtPmxvY2sgPSAwOworCSBwLT54bWl0X3F1ZXVlZCA9IDA7CisKKwkgZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwkgZGlzYWJsZV9kbWEoZGV2LT5kbWEpOyAvKiBJJ3ZlIG5ldmVyIHdvcmtlZCB3aXRoIGRtYSwgYnV0IHdlIGRvIGl0IGxpa2UgdGhlIHBhY2tldGRyaXZlciAqLworCSBzZXRfZG1hX21vZGUoZGV2LT5kbWEsRE1BX01PREVfQ0FTQ0FERSk7CisJIGVuYWJsZV9kbWEoZGV2LT5kbWEpOworCSByZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKworCSBvdXR3KGludyhQT1JUK0xfUkVTRVQpLFBPUlQrTF9SRVNFVCk7IC8qIGZpcnN0OiByZXNldCB0aGUgY2FyZCAqLworCSBpZiggKGk9cmVhZHJlZyhDU1IwKSApICE9IDB4NCkKKwkgeworCQkgcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgUkVTRVQgJXMgY2FyZDogJTA0eFxuIixkZXYtPm5hbWUsCisJCQkJCQkJY2FyZHNbcC0+Y2FyZG5vXS5jYXJkbmFtZSwoaW50KSBpKTsKKwkJIGZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJCSBkaXNhYmxlX2RtYShkZXYtPmRtYSk7CisJCSByZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwkJIHJldHVybiAwOworCSB9CisKKwkgcC0+cm1kbnVtID0gcC0+dG1kbnVtID0gcC0+dG1kbGFzdCA9IHAtPnRtZGJvdW5jZW51bSA9IDA7CisJIGZvcihpPTA7aTxUTUROVU07aSsrKQorCSB7CisJCSBzdHJ1Y3QgdG1kICp0bWRwID0gcC0+dG1kaGVhZCArIGk7CisjaWZkZWYgWE1UX1ZJQV9TS0IKKwkJIGlmKHAtPnRtZF9za2JbaV0pIHsKKwkJCSBkZXZfa2ZyZWVfc2tiKHAtPnRtZF9za2JbaV0pOworCQkJIHAtPnRtZF9za2JbaV0gPSBOVUxMOworCQkgfQorI2VuZGlmCisJCSB0bWRwLT51LmJ1ZmZlciA9IDB4MDsKKwkJIHRtZHAtPnUucy5zdGF0dXMgPSBYTUlUX1NUQVJUIHwgWE1JVF9FTkQ7CisJCSB0bWRwLT5ibGVuID0gdG1kcC0+c3RhdHVzMiA9IDA7CisJIH0KKworCSBmb3IoaT0wO2k8Uk1ETlVNO2krKykKKwkgeworCQkgc3RydWN0IHJtZCAqcm1kcCA9IHAtPnJtZGhlYWQgKyBpOworI2lmZGVmIFJDVl9WSUFfU0tCCisJCSBybWRwLT51LmJ1ZmZlciA9ICh1MzIpIGlzYV92aXJ0X3RvX2J1cyhwLT5yZWN2X3NrYltpXS0+ZGF0YSk7CisjZWxzZQorCQkgcm1kcC0+dS5idWZmZXIgPSAodTMyKSBpc2FfdmlydF90b19idXMocC0+cmVjdmJvdW5jZVtpXSk7CisjZW5kaWYKKwkJIHJtZHAtPmJsZW4gPSAtKFJfQlVGX1NJWkUtOCk7CisJCSBybWRwLT5tbGVuID0gMDsKKwkJIHJtZHAtPnUucy5zdGF0dXMgPSBSQ1ZfT1dOOworCSB9CisKKwkgaWYoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCQkgbmk2NV9pbml0X2xhbmNlKHAsZGV2LT5kZXZfYWRkciwweDAwLE1fUFJPTSk7CisJIGVsc2UgaWYoZGV2LT5tY19jb3VudCB8fCBkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQorCQkgbmk2NV9pbml0X2xhbmNlKHAsZGV2LT5kZXZfYWRkciwweGZmLDB4MCk7CisJIGVsc2UKKwkJIG5pNjVfaW5pdF9sYW5jZShwLGRldi0+ZGV2X2FkZHIsMHgwMCwweDAwKTsKKworCS8qCisJICogbmk2NV9zZXRfbGFuY2VfbWVtKCkgc2V0cyBMX0FERFJSRUcgdG8gQ1NSMAorCSAqIE5PVywgV0UgV0lMTCBORVZFUiBDSEFOR0UgVEhFIExfQUREUlJFRywgQ1NSMCBJUyBBTFdBWVMgU0VMRUNURUQKKwkgKi8KKworCSBpZihpbncoUE9SVCtMX0RBVEFSRUcpICYgQ1NSMF9JRE9OKQl7CisJCSBuaTY1X3NldF9wZXJmb3JtYW5jZShwKTsKKwkJCQkJIC8qIGluaXQgT0s6IHN0YXJ0IGxhbmNlICwgZW5hYmxlIGludGVycnVwdHMgKi8KKwkJIHdyaXRlZGF0YXJlZyhDU1IwX0NMUkFMTCB8IENTUjBfSU5FQSB8IENTUjBfU1RSVCk7CisJCSByZXR1cm4gMTsgLyogLT5PSyAqLworCSB9CisJIHByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IGluaXQgbGFuY2UsIHN0YXR1czogJTA0eFxuIixkZXYtPm5hbWUsKGludCkgaW53KFBPUlQrTF9EQVRBUkVHKSk7CisJIGZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJIGRpc2FibGVfZG1hKGRldi0+ZG1hKTsKKwkgcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJIHJldHVybiAwOyAvKiAtPkVycm9yICovCit9CisKKy8qCisgKiBpbnRlcnJ1cHQgaGFuZGxlcgorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgbmk2NV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCWludCBjc3IwID0gMDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBwcml2ICpwOworCWludCBiY250ID0gMzI7CisKKwlwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKworCXNwaW5fbG9jaygmcC0+cmluZ19sb2NrKTsKKwkKKwl3aGlsZSgtLWJjbnQpIHsKKwkJY3NyMCA9IGludyhQT1JUK0xfREFUQVJFRyk7CisKKyNpZiAwCisJCXdyaXRlZGF0YXJlZyggKGNzcjAgJiBDU1IwX0NMUkFMTCkgKTsgLyogYWNrIGludGVycnVwdHMsIGRpc2FibGUgaW50LiAqLworI2Vsc2UKKwkJd3JpdGVkYXRhcmVnKCAoY3NyMCAmIENTUjBfQ0xSQUxMKSB8IENTUjBfSU5FQSApOyAvKiBhY2sgaW50ZXJydXB0cywgaW50ZXJydXB0cyBlbmFibGVkICovCisjZW5kaWYKKworCQlpZighKGNzcjAgJiAoQ1NSMF9FUlIgfCBDU1IwX1JJTlQgfCBDU1IwX1RJTlQpKSkKKwkJCWJyZWFrOworCisJCWlmKGNzcjAgJiBDU1IwX1JJTlQpIC8qIFJFQ1YtaW50PyAqLworCQkJbmk2NV9yZWN2X2ludHIoZGV2LGNzcjApOworCQlpZihjc3IwICYgQ1NSMF9USU5UKSAvKiBYTUlULWludD8gKi8KKwkJCW5pNjVfeG1pdF9pbnRyKGRldixjc3IwKTsKKworCQlpZihjc3IwICYgQ1NSMF9FUlIpCisJCXsKKwkJCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKwkJCWlmKGRlYnVnbGV2ZWwgPiAxKQorCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGdlbmVyYWwgZXJyb3I6ICUwNHguXG4iLGRldi0+bmFtZSxjc3IwKTsKKwkJCWlmKGNzcjAgJiBDU1IwX0JBQkwpCisJCQkJcC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQlpZihjc3IwICYgQ1NSMF9NSVNTKSB7CisJCQkJaW50IGk7CisJCQkJZm9yKGk9MDtpPFJNRE5VTTtpKyspCisJCQkJCXByaW50aygiJTAyeCAiLHAtPnJtZGhlYWRbaV0udS5zLnN0YXR1cyk7CisJCQkJcHJpbnRrKCJcbiIpOworCQkJCXAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJfQorCQkJaWYoY3NyMCAmIENTUjBfTUVSUikgeworCQkJCWlmKGRlYnVnbGV2ZWwgPiAxKQorCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPb29wcyAuLiBtZW1vcnkgZXJyb3I6ICUwNHguXG4iLGRldi0+bmFtZSxjc3IwKTsKKwkJCQluaTY1X3N0b3Bfc3RhcnQoZGV2LHApOworCQkJfQorCQl9CisJfQorCisjaWZkZWYgUkNWX1BBUkFOT0lBX0NIRUNLCit7CisgaW50IGo7CisgZm9yKGo9MDtqPFJNRE5VTTtqKyspCisgeworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKwlpbnQgaSxrLG51bTEsbnVtMjsKKwlmb3IoaT1STUROVU0tMTtpPjA7aS0tKSB7CisJCSBudW0yID0gKHAtPnJtZG51bSArIGkpICYgKFJNRE5VTS0xKTsKKwkJIGlmKCEocC0+cm1kaGVhZFtudW0yXS51LnMuc3RhdHVzICYgUkNWX09XTikpCisJCQkJYnJlYWs7CisJfQorCisJaWYoaSkgeworCQlmb3Ioaz0wO2s8Uk1ETlVNO2srKykgeworCQkJbnVtMSA9IChwLT5ybWRudW0gKyBrKSAmIChSTUROVU0tMSk7CisJCQlpZighKHAtPnJtZGhlYWRbbnVtMV0udS5zLnN0YXR1cyAmIFJDVl9PV04pKQorCQkJCWJyZWFrOworCQl9CisJCWlmKCFrKQorCQkJYnJlYWs7CisKKwkJaWYoZGVidWdsZXZlbCA+IDApCisJCXsKKwkJCWNoYXIgYnVmWzI1Nl0sKmJ1ZjE7CisJCQlpbnQgazsKKwkJCWJ1ZjEgPSBidWY7CisJCQlmb3Ioaz0wO2s8Uk1ETlVNO2srKykgeworCQkJCXNwcmludGYoYnVmMSwiJTAyeCAiLChwLT5ybWRoZWFkW2tdLnUucy5zdGF0dXMpKTsgLyogJiBSQ1ZfT1dOKSApOyAqLworCQkJCWJ1ZjEgKz0gMzsKKwkJCX0KKwkJCSpidWYxID0gMDsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE9vb3BzLCByZWNlaXZlIHJpbmcgY29ycnVwdGVkICUyZCAlMmQgfCAlc1xuIixkZXYtPm5hbWUscC0+cm1kbnVtLGksYnVmKTsKKwkJfQorCisJCXAtPnJtZG51bSA9IG51bTE7CisJCW5pNjVfcmVjdl9pbnRyKGRldixjc3IwKTsKKwkJaWYoKHAtPnJtZGhlYWRbbnVtMl0udS5zLnN0YXR1cyAmIFJDVl9PV04pKQorCQkJYnJlYWs7CS8qIG9rLCB3ZSBhcmUgJ2luIHN5bmMnIGFnYWluICovCisJfQorCWVsc2UKKwkJYnJlYWs7CisgfQorfQorI2VuZGlmCisKKwlpZiggKGNzcjAgJiAoQ1NSMF9SWE9OIHwgQ1NSMF9UWE9OKSkgIT0gKENTUjBfUlhPTiB8IENTUjBfVFhPTikgKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUlggb3IgVFggd2FzIG9mZmxpbmUgLT4gcmVzdGFydFxuIixkZXYtPm5hbWUpOworCQluaTY1X3N0b3Bfc3RhcnQoZGV2LHApOworCX0KKwllbHNlCisJCXdyaXRlZGF0YXJlZyhDU1IwX0lORUEpOworCisJc3Bpbl91bmxvY2soJnAtPnJpbmdfbG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogV2UgaGF2ZSByZWNlaXZlZCBhbiBYbWl0LUludGVycnVwdCAuLgorICogc2VuZCBhIG5ldyBwYWNrZXQgaWYgbmVjZXNzYXJ5CisgKi8KK3N0YXRpYyB2b2lkIG5pNjVfeG1pdF9pbnRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsaW50IGNzcjApCit7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCisJd2hpbGUocC0+eG1pdF9xdWV1ZWQpCisJeworCQlzdHJ1Y3QgdG1kICp0bWRwID0gcC0+dG1kaGVhZCArIHAtPnRtZGxhc3Q7CisJCWludCB0bWRzdGF0ID0gdG1kcC0+dS5zLnN0YXR1czsKKworCQlpZih0bWRzdGF0ICYgWE1JVF9PV04pCisJCQlicmVhazsKKworCQlpZih0bWRzdGF0ICYgWE1JVF9FUlIpCisJCXsKKyNpZiAwCisJCQlpZih0bWRwLT5zdGF0dXMyICYgWE1JVF9URFJNQVNLICYmIGRlYnVnbGV2ZWwgPiAzKQorCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHRkci1wcm9ibGVtcyAoZS5nLiBubyByZXNpc3RvcilcbiIsZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkgLyogY2hlY2tpbmcgc29tZSBlcnJvcnMgKi8KKwkJCWlmKHRtZHAtPnN0YXR1czIgJiBYTUlUX1JUUlkpCisJCQkJcC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWlmKHRtZHAtPnN0YXR1czIgJiBYTUlUX0xDQVIpCisJCQkJcC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCWlmKHRtZHAtPnN0YXR1czIgJiAoWE1JVF9CVUZGIHwgWE1JVF9VRkxPICkpIHsKKwkJLyogdGhpcyBzdG9wcyB0aGUgeG1pdHRlciAqLworCQkJCXAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkJaWYoZGVidWdsZXZlbCA+IDApCisJCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFhtaXQgRklGTy9CVUZGIGVycm9yXG4iLGRldi0+bmFtZSk7CisJCQkJaWYocC0+ZmVhdHVyZXMgJiBJTklUX1JJTkdfQkVGT1JFX1NUQVJUKSB7CisJCQkJCXRtZHAtPnUucy5zdGF0dXMgPSBYTUlUX09XTiB8IFhNSVRfU1RBUlQgfCBYTUlUX0VORDsJLyogdGVzdDogcmVzZW5kIHRoaXMgZnJhbWUgKi8KKwkJCQkJbmk2NV9zdG9wX3N0YXJ0KGRldixwKTsKKwkJCQkJYnJlYWs7CS8qIG5vIG1vcmUgWG1pdCBwcm9jZXNzaW5nIC4uICovCisJCQkJfQorCQkJCWVsc2UKKwkJCQkgbmk2NV9zdG9wX3N0YXJ0KGRldixwKTsKKwkJCX0KKwkJCWlmKGRlYnVnbGV2ZWwgPiAyKQorCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHhtaXQtZXJyb3I6ICUwNHggJTAyeC0lMDR4XG4iLGRldi0+bmFtZSxjc3IwLChpbnQpIHRtZHN0YXQsKGludCkgdG1kcC0+c3RhdHVzMik7CisJCQlpZighKGNzcjAgJiBDU1IwX0JBQkwpKSAvKiBkb24ndCBjb3VudCBlcnJvcnMgdHdpY2UgKi8KKwkJCQlwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCXRtZHAtPnN0YXR1czIgPSAwOworCQl9CisJCWVsc2UgeworCQkJcC0+c3RhdHMudHhfYnl0ZXMgLT0gKHNob3J0KSh0bWRwLT5ibGVuKTsKKwkJCXAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJfQorCisjaWZkZWYgWE1UX1ZJQV9TS0IKKwkJaWYocC0+dG1kX3NrYltwLT50bWRsYXN0XSkgeworCQkJIGRldl9rZnJlZV9za2JfaXJxKHAtPnRtZF9za2JbcC0+dG1kbGFzdF0pOworCQkJIHAtPnRtZF9za2JbcC0+dG1kbGFzdF0gPSBOVUxMOworCQl9CisjZW5kaWYKKworCQlwLT50bWRsYXN0ID0gKHAtPnRtZGxhc3QgKyAxKSAmIChUTUROVU0tMSk7CisJCWlmKHAtPnRtZGxhc3QgPT0gcC0+dG1kbnVtKQorCQkJcC0+eG1pdF9xdWV1ZWQgPSAwOworCX0KKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qCisgKiBXZSBoYXZlIHJlY2VpdmVkIGEgcGFja2V0CisgKi8KK3N0YXRpYyB2b2lkIG5pNjVfcmVjdl9pbnRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsaW50IGNzcjApCit7CisJc3RydWN0IHJtZCAqcm1kcDsKKwlpbnQgcm1kc3RhdCxsZW47CisJaW50IGNudD0wOworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKworCXJtZHAgPSBwLT5ybWRoZWFkICsgcC0+cm1kbnVtOworCXdoaWxlKCEoIChybWRzdGF0ID0gcm1kcC0+dS5zLnN0YXR1cykgJiBSQ1ZfT1dOKSkKKwl7CisJCWNudCsrOworCQlpZiggKHJtZHN0YXQgJiAoUkNWX1NUQVJUIHwgUkNWX0VORCB8IFJDVl9FUlIpKSAhPSAoUkNWX1NUQVJUIHwgUkNWX0VORCkgKSAvKiBlcnJvciBvciBvdmVyc2l6ZWQ/ICovCisJCXsKKwkJCWlmKCEocm1kc3RhdCAmIFJDVl9FUlIpKSB7CisJCQkJaWYocm1kc3RhdCAmIFJDVl9TVEFSVCkKKwkJCQl7CisJCQkJCXAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVjdiwgcGFja2V0IHRvbyBsb25nOiAlZFxuIixkZXYtPm5hbWUscm1kcC0+bWxlbiAmIDB4MGZmZik7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJaWYoZGVidWdsZXZlbCA+IDIpCisJCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlY2VpdmUtZXJyb3I6ICUwNHgsIGxhbmNlLXN0YXR1czogJTA0eC8lMDR4XG4iLAorCQkJCQkJCQkJZGV2LT5uYW1lLChpbnQpIHJtZHN0YXQsY3NyMCwoaW50KSBpbncoUE9SVCtMX0RBVEFSRUcpICk7CisJCQkJaWYocm1kc3RhdCAmIFJDVl9GUkFNKQorCQkJCQlwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlpZihybWRzdGF0ICYgUkNWX09GTE8pCisJCQkJCXAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQkJaWYocm1kc3RhdCAmIFJDVl9DUkMpCisJCQkJCXAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQlpZihybWRzdGF0ICYgUkNWX0JVRl9FUlIpCisJCQkJCXAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQl9CisJCQlpZighKGNzcjAgJiBDU1IwX01JU1MpKSAvKiBkb24ndCBjb3VudCBlcnJvcnMgdHdpY2UgKi8KKwkJCQlwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJfQorCQllbHNlIGlmKCAobGVuID0gKHJtZHAtPm1sZW4gJiAweDBmZmYpIC0gNCkgPj0gNjApCisJCXsKKyNpZmRlZiBSQ1ZfVklBX1NLQgorCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFsbG9jX3NrYihSX0JVRl9TSVpFKzIrMTYsR0ZQX0FUT01JQyk7CisJCQlpZiAoc2tiKQorCQkJCXNrYl9yZXNlcnZlKHNrYiwxNik7CisjZWxzZQorCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IobGVuKzIpOworI2VuZGlmCisJCQlpZihza2IpCisJCQl7CisJCQkJc2tiX3Jlc2VydmUoc2tiLDIpOworCXNrYi0+ZGV2ID0gZGV2OworI2lmZGVmIFJDVl9WSUFfU0tCCisJCQkJaWYoICh1bnNpZ25lZCBsb25nKSAoc2tiLT5kYXRhICsgUl9CVUZfU0laRSkgPiAweDEwMDAwMDApIHsKKwkJCQkJc2tiX3B1dChza2IsbGVuKTsKKwkJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsICh1bnNpZ25lZCBjaGFyICopKHAtPnJlY3Zfc2tiW3AtPnJtZG51bV0tPmRhdGEpLGxlbiwwKTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXN0cnVjdCBza19idWZmICpza2IxID0gcC0+cmVjdl9za2JbcC0+cm1kbnVtXTsKKwkJCQkJc2tiX3B1dChza2IsUl9CVUZfU0laRSk7CisJCQkJCXAtPnJlY3Zfc2tiW3AtPnJtZG51bV0gPSBza2I7CisJCQkJCXJtZHAtPnUuYnVmZmVyID0gKHUzMikgaXNhX3ZpcnRfdG9fYnVzKHNrYi0+ZGF0YSk7CisJCQkJCXNrYiA9IHNrYjE7CisJCQkJCXNrYl90cmltKHNrYixsZW4pOworCQkJCX0KKyNlbHNlCisJCQkJc2tiX3B1dChza2IsbGVuKTsKKwkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgKHVuc2lnbmVkIGNoYXIgKikgcC0+cmVjdmJvdW5jZVtwLT5ybWRudW1dLGxlbiwwKTsKKyNlbmRpZgorCQkJCXAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlwLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJCQkJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJCQluZXRpZl9yeChza2IpOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgYWxsb2MgbmV3IHNrX2J1ZmZcbiIsZGV2LT5uYW1lKTsKKwkJCQlwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVjZWl2ZWQgcnVudCBwYWNrZXRcbiIsZGV2LT5uYW1lKTsKKwkJCXAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQl9CisJCXJtZHAtPmJsZW4gPSAtKFJfQlVGX1NJWkUtOCk7CisJCXJtZHAtPm1sZW4gPSAwOworCQlybWRwLT51LnMuc3RhdHVzID0gUkNWX09XTjsgLyogY2hhbmdlIG93bmVyICovCisJCXAtPnJtZG51bSA9IChwLT5ybWRudW0gKyAxKSAmIChSTUROVU0tMSk7CisJCXJtZHAgPSBwLT5ybWRoZWFkICsgcC0+cm1kbnVtOworCX0KK30KKworLyoKKyAqIGtpY2sgeG1pdHRlciAuLgorICovCisgCitzdGF0aWMgdm9pZCBuaTY1X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwlwcmludGsoS0VSTl9FUlIgIiVzOiB4bWl0dGVyIHRpbWVkIG91dCwgdHJ5IHRvIHJlc3RhcnQhXG4iLGRldi0+bmFtZSk7CisJZm9yKGk9MDtpPFRNRE5VTTtpKyspCisJCXByaW50aygiJTAyeCAiLHAtPnRtZGhlYWRbaV0udS5zLnN0YXR1cyk7CisJcHJpbnRrKCJcbiIpOworCW5pNjVfbGFuY2VfcmVpbml0KGRldik7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisvKgorICoJU2VuZCBhIHBhY2tldAorICovCisKK3N0YXRpYyBpbnQgbmk2NV9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAodm9pZCopJnAtPmxvY2spKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFF1ZXVlIHdhcyBsb2NrZWQuXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwl7CisJCXNob3J0IGxlbiA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOworCQlzdHJ1Y3QgdG1kICp0bWRwOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgWE1UX1ZJQV9TS0IKKwkJaWYoICh1bnNpZ25lZCBsb25nKSAoc2tiLT5kYXRhICsgc2tiLT5sZW4pID4gMHgxMDAwMDAwKSB7CisjZW5kaWYKKworCQkJbWVtY3B5KChjaGFyICopIHAtPnRtZGJvdW5jZVtwLT50bWRib3VuY2VudW1dICwoY2hhciAqKXNrYi0+ZGF0YSwKKwkJCQkJCQkgKHNrYi0+bGVuID4gVF9CVUZfU0laRSkgPyBUX0JVRl9TSVpFIDogc2tiLT5sZW4pOworCQkJaWYgKGxlbiA+IHNrYi0+bGVuKQorCQkJCW1lbXNldCgoY2hhciAqKXAtPnRtZGJvdW5jZVtwLT50bWRib3VuY2VudW1dK3NrYi0+bGVuLCAwLCBsZW4tc2tiLT5sZW4pOworCQkJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnAtPnJpbmdfbG9jaywgZmxhZ3MpOworCQkJdG1kcCA9IHAtPnRtZGhlYWQgKyBwLT50bWRudW07CisJCQl0bWRwLT51LmJ1ZmZlciA9ICh1MzIpIGlzYV92aXJ0X3RvX2J1cyhwLT50bWRib3VuY2VbcC0+dG1kYm91bmNlbnVtXSk7CisJCQlwLT50bWRib3VuY2VudW0gPSAocC0+dG1kYm91bmNlbnVtICsgMSkgJiAoVE1ETlVNIC0gMSk7CisKKyNpZmRlZiBYTVRfVklBX1NLQgorCQl9CisJCWVsc2UgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnAtPnJpbmdfbG9jaywgZmxhZ3MpOworCisJCQl0bWRwID0gcC0+dG1kaGVhZCArIHAtPnRtZG51bTsKKwkJCXRtZHAtPnUuYnVmZmVyID0gKHUzMikgaXNhX3ZpcnRfdG9fYnVzKHNrYi0+ZGF0YSk7CisJCQlwLT50bWRfc2tiW3AtPnRtZG51bV0gPSBza2I7CisJCX0KKyNlbmRpZgorCQl0bWRwLT5ibGVuID0gLWxlbjsKKworCQl0bWRwLT51LnMuc3RhdHVzID0gWE1JVF9PV04gfCBYTUlUX1NUQVJUIHwgWE1JVF9FTkQ7CisJCXdyaXRlZGF0YXJlZyhDU1IwX1RETUQgfCBDU1IwX0lORUEpOyAvKiBlbmFibGUgeG1pdCAmIGludGVycnVwdCAqLworCisJCXAtPnhtaXRfcXVldWVkID0gMTsKKwkJcC0+dG1kbnVtID0gKHAtPnRtZG51bSArIDEpICYgKFRNRE5VTS0xKTsKKworCQlpZihwLT50bWRudW0gIT0gcC0+dG1kbGFzdCkKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCQorCQlwLT5sb2NrID0gMDsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5yaW5nX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuaTY1X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisjaWYgMAorCWludCBpOworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKwlmb3IoaT0wO2k8Uk1ETlVNO2krKykKKwl7CisJCXN0cnVjdCBybWQgKnJtZHAgPSBwLT5ybWRoZWFkICsgKChwLT5ybWRudW0gKyBpKSAmIChSTUROVU0tMSkpOworCQlwcmludGsoIiUwMnggIixybWRwLT51LnMuc3RhdHVzKTsKKwl9CisJcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKwlyZXR1cm4gJigoc3RydWN0IHByaXYgKikgZGV2LT5wcml2KS0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmKCFuaTY1X2xhbmNlX3JlaW5pdChkZXYpKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBzd2l0Y2ggY2FyZCBpbnRvIE1DIG1vZGUhXG4iLGRldi0+bmFtZSk7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9uaTY1OworCittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRtYSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAibmk2NTEwIElSUSBudW1iZXIgKGlnbm9yZWQgZm9yIHNvbWUgY2FyZHMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAibmk2NTEwIEkvTyBiYXNlIGFkZHJlc3MiKTsKK01PRFVMRV9QQVJNX0RFU0MoZG1hLCAibmk2NTEwIElTQSBETUEgY2hhbm5lbCAoaWdub3JlZCBmb3Igc29tZSBjYXJkcykiKTsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisgCWRldl9uaTY1ID0gbmk2NV9wcm9iZSgtMSk7CisJcmV0dXJuIElTX0VSUihkZXZfbmk2NSkgPyBQVFJfRVJSKGRldl9uaTY1KSA6IDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKyAJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2X25pNjUpOworIAljbGVhbnVwX2NhcmQoZGV2X25pNjUpOworIAlmcmVlX25ldGRldihkZXZfbmk2NSk7Cit9CisjZW5kaWYgLyogTU9EVUxFICovCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIEVORCBvZiBuaTY1LmMKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmk2NS5oIGIvZHJpdmVycy9uZXQvbmk2NS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMWNlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9uaTY1LmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qIGFtNzk5MCAobGFuY2UpIGRlZmluaXRpb25zCisgKiAKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBMaW51eCBvcGVyYXRpbmcgc3lzdGVtLCBhbmQgaXMgY292ZXJlZCBieQorICogc2FtZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB0aGF0IGNvdmVycyB0aGF0IHdvcmsuCisgKiAKKyAqIE1pY2hhZWwgSGlwcAorICogZW1haWw6IG1oaXBwQHN0dWRlbnQudW5pLXR1ZWJpbmdlbi5kZQorICoKKyAqIHNvdXJjZXM6IChtYWlsIG1lIG9yIGFzayBhcmNoaWUgaWYgeW91IG5lZWQgdGhlbSkgCisgKiAgICBjcnlud3ItcGFja2V0LWRyaXZlcgorICovCisKKy8qCisgKiAJQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyIDAgKENTUjApIGJpdCBkZWZpbml0aW9ucworICogKFI9UmVhZGFibGUpIChXPVdyaXRlYWJsZSkgKFM9U2V0IG9uIHdyaXRlKSAoQy1DbGVhciBvbiB3cml0ZSkKKyAqCisgKi8KKworI2RlZmluZSBDU1IwX0VSUgkweDgwMDAJLyogRXJyb3Igc3VtbWFyeSAoUikgKi8KKyNkZWZpbmUgQ1NSMF9CQUJMCTB4NDAwMAkvKiBCYWJibGUgdHJhbnNtaXR0ZXIgdGltZW91dCBlcnJvciAoUkMpICovCisjZGVmaW5lIENTUjBfQ0VSUgkweDIwMDAJLyogQ29sbGlzaW9uIEVycm9yIChSQykgKi8KKyNkZWZpbmUgQ1NSMF9NSVNTCTB4MTAwMAkvKiBNaXNzZWQgcGFja2V0IChSQykgKi8KKyNkZWZpbmUgQ1NSMF9NRVJSCTB4MDgwMAkvKiBNZW1vcnkgRXJyb3IgKFJDKSAqLworI2RlZmluZSBDU1IwX1JJTlQJMHgwNDAwCS8qIFJlY2VpdmVyIEludGVycnVwdCAoUkMpICovCisjZGVmaW5lIENTUjBfVElOVCAgICAgICAweDAyMDAJLyogVHJhbnNtaXQgSW50ZXJydXB0IChSQykgKi8KKyNkZWZpbmUgQ1NSMF9JRE9OCTB4MDEwMAkvKiBJbml0aWFsaXphdGlvbiBEb25lIChSQykgKi8KKyNkZWZpbmUgQ1NSMF9JTlRSCTB4MDA4MAkvKiBJbnRlcnJ1cHQgRmxhZyAoUikgKi8KKyNkZWZpbmUgQ1NSMF9JTkVBCTB4MDA0MAkvKiBJbnRlcnJ1cHQgRW5hYmxlIChSVykgKi8KKyNkZWZpbmUgQ1NSMF9SWE9OCTB4MDAyMAkvKiBSZWNlaXZlciBvbiAoUikgKi8KKyNkZWZpbmUgQ1NSMF9UWE9OCTB4MDAxMAkvKiBUcmFuc21pdHRlciBvbiAoUikgKi8KKyNkZWZpbmUgQ1NSMF9URE1ECTB4MDAwOAkvKiBUcmFuc21pdCBEZW1hbmQgKFJTKSAqLworI2RlZmluZSBDU1IwX1NUT1AJMHgwMDA0CS8qIFN0b3AgKFJTKSAqLworI2RlZmluZSBDU1IwX1NUUlQJMHgwMDAyCS8qIFN0YXJ0IChSUykgKi8KKyNkZWZpbmUgQ1NSMF9JTklUCTB4MDAwMQkvKiBJbml0aWFsaXplIChSUykgKi8KKworI2RlZmluZSBDU1IwX0NMUkFMTCAgICAweDdmMDAJLyogbWFzayBmb3IgYWxsIGNsZWFyYWJsZSBiaXRzICovCisvKgorICoJSW5pdGlhbGl6YXRpb24gQmxvY2sgIE1vZGUgb3BlcmF0aW9uIEJpdCBEZWZpbml0aW9ucy4KKyAqLworCisjZGVmaW5lIE1fUFJPTQkJMHg4MDAwCS8qIFByb21pc2N1b3VzIE1vZGUgKi8KKyNkZWZpbmUgTV9JTlRMCQkweDAwNDAJLyogSW50ZXJuYWwgTG9vcGJhY2sgKi8KKyNkZWZpbmUgTV9EUlRZCQkweDAwMjAJLyogRGlzYWJsZSBSZXRyeSAqLworI2RlZmluZSBNX0NPTEwJCTB4MDAxMAkvKiBGb3JjZSBDb2xsaXNpb24gKi8KKyNkZWZpbmUgTV9EVENSCQkweDAwMDgJLyogRGlzYWJsZSBUcmFuc21pdCBDUkMpICovCisjZGVmaW5lIE1fTE9PUAkJMHgwMDA0CS8qIExvb3BiYWNrICovCisjZGVmaW5lIE1fRFRYCQkweDAwMDIJLyogRGlzYWJsZSB0aGUgVHJhbnNtaXR0ZXIgKi8KKyNkZWZpbmUgTV9EUlgJCTB4MDAwMQkvKiBEaXNhYmxlIHRoZSBSZWNlaXZlciAqLworCisKKy8qCisgKiAJUmVjZWl2ZSBtZXNzYWdlIGRlc2NyaXB0b3IgYml0IGRlZmluaXRpb25zLgorICovCisKKyNkZWZpbmUgUkNWX09XTgkJMHg4MAkvKiBvd25lciBiaXQgMCA9IGhvc3QsIDEgPSBsYW5jZSAqLworI2RlZmluZSBSQ1ZfRVJSCQkweDQwCS8qIEVycm9yIFN1bW1hcnkgKi8KKyNkZWZpbmUgUkNWX0ZSQU0JMHgyMAkvKiBGcmFtaW5nIEVycm9yICovCisjZGVmaW5lIFJDVl9PRkxPCTB4MTAJLyogT3ZlcmZsb3cgRXJyb3IgKi8KKyNkZWZpbmUgUkNWX0NSQwkJMHgwOAkvKiBDUkMgRXJyb3IgKi8KKyNkZWZpbmUgUkNWX0JVRl9FUlIJMHgwNAkvKiBCdWZmZXIgRXJyb3IgKi8KKyNkZWZpbmUgUkNWX1NUQVJUCTB4MDIJLyogU3RhcnQgb2YgUGFja2V0ICovCisjZGVmaW5lIFJDVl9FTkQJCTB4MDEJLyogRW5kIG9mIFBhY2tldCAqLworCisKKy8qCisgKglUcmFuc21pdCAgbWVzc2FnZSBkZXNjcmlwdG9yIGJpdCBkZWZpbml0aW9ucy4KKyAqLworCisjZGVmaW5lIFhNSVRfT1dOCTB4ODAJLyogb3duZXIgYml0IDAgPSBob3N0LCAxID0gbGFuY2UgKi8KKyNkZWZpbmUgWE1JVF9FUlIJMHg0MAkvKiBFcnJvciBTdW1tYXJ5ICovCisjZGVmaW5lIFhNSVRfUkVUUlkJMHgxMAkvKiBtb3JlIHRoZSAxIHJldHJ5IG5lZWRlZCB0byBYbWl0ICovCisjZGVmaW5lIFhNSVRfMV9SRVRSWQkweDA4CS8qIG9uZSByZXRyeSBuZWVkZWQgdG8gWG1pdCAqLworI2RlZmluZSBYTUlUX0RFRgkweDA0CS8qIERlZmVycmVkICovCisjZGVmaW5lIFhNSVRfU1RBUlQJMHgwMgkvKiBTdGFydCBvZiBQYWNrZXQgKi8KKyNkZWZpbmUgWE1JVF9FTkQJMHgwMQkvKiBFbmQgb2YgUGFja2V0ICovCisKKy8qCisgKiB0cmFuc21pdCBzdGF0dXMgKDIpICh2YWxpZCBpZiBYTUlUX0VSUiA9PSAxKQorICovCisKKyNkZWZpbmUgWE1JVF9URFJNQVNLICAgIDB4MDNmZgkvKiB0aW1lLWRvbWFpbi1yZWZsZWN0b21ldGVyLXZhbHVlICovCisjZGVmaW5lIFhNSVRfUlRSWSAJMHgwNDAwCS8qIEZhaWxlZCBhZnRlciAxNiByZXRyYW5zbWlzc2lvbnMgICovCisjZGVmaW5lIFhNSVRfTENBUiAJMHgwODAwCS8qIExvc3Mgb2YgQ2FycmllciAqLworI2RlZmluZSBYTUlUX0xDT0wgCTB4MTAwMAkvKiBMYXRlIGNvbGxpc2lvbiAqLworI2RlZmluZSBYTUlUX1JFU0VSViAJMHgyMDAwCS8qIFJlc2VydmVkICovCisjZGVmaW5lIFhNSVRfVUZMTyAJMHg0MDAwCS8qIFVuZGVyZmxvdyAobGF0ZSBtZW1vcnkpICovCisjZGVmaW5lIFhNSVRfQlVGRiAJMHg4MDAwCS8qIEJ1ZmZlcmluZyBlcnJvciAobm8gRU5QKSAqLworCitzdHJ1Y3QgaW5pdF9ibG9jayB7CisJdW5zaWduZWQgc2hvcnQgbW9kZTsKKwl1bnNpZ25lZCBjaGFyIGVhZGRyWzZdOworCXVuc2lnbmVkIGNoYXIgZmlsdGVyWzhdOworCS8qIGJpdCAyOS0zMTogbnVtYmVyIG9mIHJtZCdzIChwb3dlciBvZiAyKSAqLworCXUzMiBycnA7CQkvKiByZWNlaXZlIHJpbmcgcG9pbnRlciAoYWxpZ24gOCkgKi8KKwkvKiBiaXQgMjktMzE6IG51bWJlciBvZiB0bWQncyAocG93ZXIgb2YgMikgKi8KKwl1MzIgdHJwOwkJLyogdHJhbnNtaXQgcmluZyBwb2ludGVyIChhbGlnbiA4KSAqLworfTsKKworc3RydWN0IHJtZCB7CQkJLyogUmVjZWl2ZSBNZXNzYWdlIERlc2NyaXB0b3IgKi8KKwl1bmlvbiB7CisJCXZvbGF0aWxlIHUzMiBidWZmZXI7CisJCXN0cnVjdCB7CisJCQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGR1bW15WzNdOworCQkJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBzdGF0dXM7CisJCX0gczsKKwl9IHU7CisJdm9sYXRpbGUgc2hvcnQgYmxlbjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBtbGVuOworfTsKKworc3RydWN0IHRtZCB7CisJdW5pb24geworCQl2b2xhdGlsZSB1MzIgYnVmZmVyOworCQlzdHJ1Y3QgeworCQkJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBkdW1teVszXTsKKwkJCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgc3RhdHVzOworCQl9IHM7CisJfSB1OworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGJsZW47CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgc3RhdHVzMjsKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uczgzODIwLmMgYi9kcml2ZXJzL25ldC9uczgzODIwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjYzE4MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L25zODM4MjAuYwpAQCAtMCwwICsxLDIyMjIgQEAKKyNkZWZpbmUgX1ZFUlNJT04gIjAuMjAiCisvKiBuczgzODIwLmMgYnkgQmVuamFtaW4gTGFIYWlzZSB3aXRoIGNvbnRyaWJ1dGlvbnMuCisgKgorICogUXVlc3Rpb25zL2NvbW1lbnRzL2Rpc2N1c3Npb24gdG8gbGludXgtbnM4MzgyMEBrdmFjay5vcmcuCisgKgorICogJFJldmlzaW9uOiAxLjM0LjIuMjMgJAorICoKKyAqIENvcHlyaWdodCAyMDAxIEJlbmphbWluIExhSGFpc2UuCisgKiBDb3B5cmlnaHQgMjAwMSwgMjAwMiBSZWQgSGF0LgorICoKKyAqIE1tbW0sIGNob2NvbGF0ZSB2YW5pbGxhIG1vY2hhLi4uCisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKgorICogQ2hhbmdlTG9nCisgKiA9PT09PT09PT0KKyAqCTIwMDEwNDE0CTAuMSAtIGNyZWF0ZWQKKyAqCTIwMDEwNjIyCTAuMiAtIGJhc2ljIHJ4IGFuZCB0eC4KKyAqCTIwMDEwNzExCTAuMyAtIGFkZGVkIGR1cGxleCBhbmQgbGluayBzdGF0ZSBkZXRlY3Rpb24gc3VwcG9ydC4KKyAqCTIwMDEwNzEzCTAuNCAtIHplcm8gY29weSwgbm8gaGFuZ3MuCisgKgkJCTAuNSAtIDY0IGJpdCBkbWEgc3VwcG9ydCAoZGF2ZW0gd2lsbCBoYXRlIG1lIGZvciB0aGlzKQorICoJCQkgICAgLSBkaXNhYmxlIGp1bWJvIGZyYW1lcyB0byBhdm9pZCB0eCBoYW5ncworICoJCQkgICAgLSB3b3JrIGFyb3VuZCB0eCBkZWFkbG9ja3Mgb24gbXkgMS4wMiBjYXJkIHZpYQorICoJCQkgICAgICBmaWRkbGluZyB3aXRoIFRYQ0ZHCisgKgkyMDAxMDgxMAkwLjYgLSB1c2UgcGNpIGRtYSBhcGkgZm9yIHJpbmdidWZmZXJzLCB3b3JrIG9uIGlhNjQKKyAqCTIwMDEwODE2CTAuNyAtIG1pc2MgY2xlYW51cHMKKyAqCTIwMDEwODI2CTAuOCAtIGZpeCBjcml0aWNhbCB6ZXJvIGNvcHkgYnVncworICoJCQkwLjkgLSBpbnRlcm5hbCBleHBlcmltZW50CisgKgkyMDAxMDgyNwkwLjEwIC0gZml4IGlhNjQgdW5hbGlnbmVkIGFjY2Vzcy4KKyAqCTIwMDEwOTA2CTAuMTEgLSBhY2NlcHQgYWxsIHBhY2tldHMgd2l0aCBjaGVja3N1bSBlcnJvcnMgYXMKKyAqCQkJICAgICAgIG90aGVyd2lzZSBmcmFnbWVudHMgZ2V0IGxvc3QKKyAqCQkJICAgICAtIGZpeCA+PiAzMiBidWdzCisgKgkJCTAuMTIgLSBhZGQgc3RhdGlzdGljcyBjb3VudGVycworICoJCQkgICAgIC0gYWRkIGFsbG11bHRpL3Byb21pc2Mgc3VwcG9ydAorICoJMjAwMTEwMDkJMC4xMyAtIGhvdHBsdWcgc3VwcG9ydCwgb3RoZXIgc21hbGxlciBwY2kgYXBpIGNsZWFudXBzCisgKgkyMDAxMTIwNAkwLjEzYSAtIG9wdGljYWwgdHJhbnNjZWl2ZXIgc3VwcG9ydCBhZGRlZAorICoJCQkJYnkgTWljaGFlbCBDbGFyayA8bWljaGFlbEBtZXRhcGFyYWRpZ20uY29tPgorICoJMjAwMTEyMDUJMC4xM2IgLSBjYWxsIHJlZ2lzdGVyX25ldGRldiBlYXJsaWVyIGluIGluaXRpYWxpemF0aW9uCisgKgkJCQlzdXBwcmVzcyBkdXBsaWNhdGUgbGluayBzdGF0dXMgbWVzc2FnZXMKKyAqCTIwMDExMTE3IAkwLjE0IC0gZXRodG9vbCBHRFJWSU5GTywgR0xJTksgc3VwcG9ydCBmcm9tIGpnYXJ6aWsKKyAqCTIwMDExMjA0IAkwLjE1CWdldCBwcGMgKGJpZyBlbmRpYW4pIHdvcmtpbmcKKyAqCTIwMDExMjE4CTAuMTYJdmFyaW91cyBjbGVhbnVwcworICoJMjAwMjAzMTAJMC4xNwlzcGVlZHVwcworICoJMjAwMjA2MTAJMC4xOCAtCWFjdHVhbGx5IHVzZSB0aGUgcGNpIGRtYSBhcGkgZm9yIGhpZ2htZW0KKyAqCQkJICAgICAtCXJlbW92ZSBwY2kgbGF0ZW5jeSByZWdpc3RlciBmaWRkbGluZworICoJCQkwLjE5IC0JYmV0dGVyIGJpc3Qgc3VwcG9ydAorICoJCQkgICAgIC0JYWRkIGlociBhbmQgcmVzZXRfcGh5IHBhcmFtZXRlcnMKKyAqCQkJICAgICAtCWdtaWkgYnVzIHByb2JpbmcKKyAqCQkJICAgICAtCWZpeCBtaXNzZWQgdHhvayBpbnRyb2R1Y2VkIGR1cmluZyBwZXJmb3JtYW5jZQorICoJCQkJdHVuaW5nCisgKgkJCTAuMjAgLQlmaXggc3R1cGlkIFJGRU4gdGhpbmtvLiAgaSBhbSBzdWNoIGEgc211cmYuCisgKgorICoJMjAwNDA4MjgJMC4yMSAtCWFkZCBoYXJkd2FyZSB2bGFuIGFjY2xlcmF0aW9uCisgKgkJCQlieSBOZWlsIEhvcm1hbiA8bmhvcm1hbkByZWRoYXQuY29tPgorICogRHJpdmVyIE92ZXJ2aWV3CisgKiA9PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIGRyaXZlciB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGZvciB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcgorICogODM4MjAgY2hpcCwgYSAxMC8xMDAvMTAwMCBNYnBzIDY0IGJpdCBQQ0kgZXRoZXJuZXQgTklDLiAgSG9wZWZ1bGx5CisgKiB0aGlzIGNvZGUgd2lsbCB0dXJuIG91dCB0byBiZSBhKSBjbGVhbiwgYikgY29ycmVjdCwgYW5kIGMpIGZhc3QuCisgKiBXaXRoIHRoYXQgaW4gbWluZCwgSSdtIGFpbWluZyB0byBzcGxpdCB0aGUgY29kZSB1cCBhcyBtdWNoIGFzCisgKiByZWFzb25hYmx5IHBvc3NpYmxlLiAgQXQgcHJlc2VudCB0aGVyZSBhcmUgWCBtYWpvciBzZWN0aW9ucyB0aGF0CisgKiBicmVhayBkb3duIGludG8gYSkgcGFja2V0IHJlY2VpdmUsIGIpIHBhY2tldCB0cmFuc21pdCwgYykgbGluaworICogbWFuYWdlbWVudCwgZCkgaW5pdGlhbGl6YXRpb24gYW5kIGNvbmZpZ3VyYXRpb24uICBXaGVyZSBwb3NzaWJsZSwKKyAqIHRoZXNlIGNvZGUgcGF0aHMgYXJlIGRlc2lnbmVkIHRvIHJ1biBpbiBwYXJhbGxlbC4KKyAqCisgKiBUaGlzIGRyaXZlciBoYXMgYmVlbiB0ZXN0ZWQgYW5kIGZvdW5kIHRvIHdvcmsgd2l0aCB0aGUgZm9sbG93aW5nCisgKiBjYXJkcyAoaW4gbm8gcGFydGljdWxhciBvcmRlcik6CisgKgorICoJQ2FtZW8JCVNPSE8tR0EyMDAwVAlTT0hPLUdBMjUwMFQKKyAqCUQtTGluawkJREdFLTUwMFQKKyAqCVB1cmVEYXRhCVBEUDgwMjNaLVRHCisgKglTTUMJCVNNQzk0NTJUWAlTTUM5NDYyVFgKKyAqCU5ldGdlYXIJCUdBNjIxCisgKgorICogU3BlY2lhbCB0aGFua3MgdG8gU01DIGZvciBwcm92aWRpbmcgaGFyZHdhcmUgdG8gdGVzdCB0aGlzIGRyaXZlciBvbi4KKyAqCisgKiBSZXBvcnRzIG9mIHN1Y2Nlc3Mgb3IgZmFpbHVyZSB3b3VsZCBiZSBncmVhdGx5IGFwcHJlY2lhdGVkLgorICovCisvLyNkZWZpbmUgZHByaW50awkJcHJpbnRrCisjZGVmaW5lIGRwcmludGsoeC4uLikJCWRvIHsgfSB3aGlsZSAoMCkKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4JLyogZm9yIGlwaCAqLworI2luY2x1ZGUgPGxpbnV4L2luLmg+CS8qIGZvciBJUFBST1RPXy4uLiAqLworI2luY2x1ZGUgPGxpbnV4L2VlcHJvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2RlZmluZSBEUlZfTkFNRSAibnM4MzgyMCIKKworLyogR2xvYmFsIHBhcmFtZXRlcnMuICBTZWUgbW9kdWxlX3BhcmFtIG5lYXIgdGhlIGJvdHRvbS4gKi8KK3N0YXRpYyBpbnQgaWhyID0gMjsKK3N0YXRpYyBpbnQgcmVzZXRfcGh5ID0gMDsKK3N0YXRpYyBpbnQgbG5rc3RzID0gMDsJCS8qIENGR19MTktTVFMgYml0IHBvbGFyaXR5ICovCisKKy8qIERwcmludGsgaXMgdXNlZCBmb3IgbW9yZSBpbnRlcmVzdGluZyBkZWJ1ZyBldmVudHMgKi8KKyN1bmRlZiBEcHJpbnRrCisjZGVmaW5lCURwcmludGsJCQlkcHJpbnRrCisKKyNpZiBkZWZpbmVkKENPTkZJR19ISUdITUVNNjRHKSB8fCBkZWZpbmVkKF9faWE2NF9fKQorI2RlZmluZSBVU0VfNjRCSVRfQUREUgkiKyIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChVU0VfNjRCSVRfQUREUikKKyNkZWZpbmUJVkVSU0lPTglfVkVSU0lPTiBVU0VfNjRCSVRfQUREUgorI2RlZmluZSBUUllfREFDCTEKKyNlbHNlCisjZGVmaW5lCVZFUlNJT04JX1ZFUlNJT04KKyNkZWZpbmUgVFJZX0RBQwkwCisjZW5kaWYKKworLyogdHVuYWJsZXMgKi8KKyNkZWZpbmUgUlhfQlVGX1NJWkUJMTUwMAkvKiA4MTkyICovCisjaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCisjZGVmaW5lIE5TODM4MjBfVkxBTl9BQ0NFTF9TVVBQT1JUCisjZW5kaWYKKworLyogTXVzdCBub3QgZXhjZWVkIH42NTAwMC4gKi8KKyNkZWZpbmUgTlJfUlhfREVTQwk2NAorI2RlZmluZSBOUl9UWF9ERVNDCTEyOAorCisvKiBub3QgdHVuYWJsZSAqLworI2RlZmluZSBSRUFMX1JYX0JVRl9TSVpFIChSWF9CVUZfU0laRSArIDE0KQkvKiByeC90eCBtYWMgYWRkciArIHR5cGUgKi8KKworI2RlZmluZSBNSU5fVFhfREVTQ19GUkVFCTgKKworLyogcmVnaXN0ZXIgZGVmaW5lcyAqLworI2RlZmluZSBDRkdDUwkJMHgwNAorCisjZGVmaW5lIENSX1RYRQkJMHgwMDAwMDAwMQorI2RlZmluZSBDUl9UWEQJCTB4MDAwMDAwMDIKKy8qIFJhbWl0IDogSGVyZSdzIGEgdGlwLCBkb24ndCBkbyBhIFJYRCBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhbiBSWEUKKyAqIFRoZSBSZWNlaXZlIGVuZ2luZSBza2lwcyBvbmUgZGVzY3JpcHRvciBhbmQgbW92ZXMKKyAqIG9udG8gdGhlIG5leHQgb25lISEgKi8KKyNkZWZpbmUgQ1JfUlhFCQkweDAwMDAwMDA0CisjZGVmaW5lIENSX1JYRAkJMHgwMDAwMDAwOAorI2RlZmluZSBDUl9UWFIJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQ1JfUlhSCQkweDAwMDAwMDIwCisjZGVmaW5lIENSX1NXSQkJMHgwMDAwMDA4MAorI2RlZmluZSBDUl9SU1QJCTB4MDAwMDAxMDAKKworI2RlZmluZSBQVFNDUl9FRUJJU1RfRkFJTCAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFBUU0NSX0VFQklTVF9FTiAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgUFRTQ1JfRUVMT0FEX0VOICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBQVFNDUl9SQklTVF9GQUlMICAgICAgICAweDAwMDAwMWI4CisjZGVmaW5lIFBUU0NSX1JCSVNUX0RPTkUgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgUFRTQ1JfUkJJU1RfRU4gICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBQVFNDUl9SQklTVF9SU1QgICAgICAgICAweDAwMDAyMDAwCisKKyNkZWZpbmUgTUVBUl9FRURJCQkweDAwMDAwMDAxCisjZGVmaW5lIE1FQVJfRUVETwkJMHgwMDAwMDAwMgorI2RlZmluZSBNRUFSX0VFQ0xLCQkweDAwMDAwMDA0CisjZGVmaW5lIE1FQVJfRUVTRUwJCTB4MDAwMDAwMDgKKyNkZWZpbmUgTUVBUl9NRElPCQkweDAwMDAwMDEwCisjZGVmaW5lIE1FQVJfTURESVIJCTB4MDAwMDAwMjAKKyNkZWZpbmUgTUVBUl9NREMJCTB4MDAwMDAwNDAKKworI2RlZmluZSBJU1JfVFhERVNDMwkweDQwMDAwMDAwCisjZGVmaW5lIElTUl9UWERFU0MyCTB4MjAwMDAwMDAKKyNkZWZpbmUgSVNSX1RYREVTQzEJMHgxMDAwMDAwMAorI2RlZmluZSBJU1JfVFhERVNDMAkweDA4MDAwMDAwCisjZGVmaW5lIElTUl9SWERFU0MzCTB4MDQwMDAwMDAKKyNkZWZpbmUgSVNSX1JYREVTQzIJMHgwMjAwMDAwMAorI2RlZmluZSBJU1JfUlhERVNDMQkweDAxMDAwMDAwCisjZGVmaW5lIElTUl9SWERFU0MwCTB4MDA4MDAwMDAKKyNkZWZpbmUgSVNSX1RYUkNNUAkweDAwNDAwMDAwCisjZGVmaW5lIElTUl9SWFJDTVAJMHgwMDIwMDAwMAorI2RlZmluZSBJU1JfRFBFUlIJMHgwMDEwMDAwMAorI2RlZmluZSBJU1JfU1NFUlIJMHgwMDA4MDAwMAorI2RlZmluZSBJU1JfUk1BQlQJMHgwMDA0MDAwMAorI2RlZmluZSBJU1JfUlRBQlQJMHgwMDAyMDAwMAorI2RlZmluZSBJU1JfUlhTT1ZSCTB4MDAwMTAwMDAKKyNkZWZpbmUgSVNSX0hJQklOVAkweDAwMDA4MDAwCisjZGVmaW5lIElTUl9QSFkJCTB4MDAwMDQwMDAKKyNkZWZpbmUgSVNSX1BNRQkJMHgwMDAwMjAwMAorI2RlZmluZSBJU1JfU1dJCQkweDAwMDAxMDAwCisjZGVmaW5lIElTUl9NSUIJCTB4MDAwMDA4MDAKKyNkZWZpbmUgSVNSX1RYVVJOCTB4MDAwMDA0MDAKKyNkZWZpbmUgSVNSX1RYSURMRQkweDAwMDAwMjAwCisjZGVmaW5lIElTUl9UWEVSUgkweDAwMDAwMTAwCisjZGVmaW5lIElTUl9UWERFU0MJMHgwMDAwMDA4MAorI2RlZmluZSBJU1JfVFhPSwkweDAwMDAwMDQwCisjZGVmaW5lIElTUl9SWE9STgkweDAwMDAwMDIwCisjZGVmaW5lIElTUl9SWElETEUJMHgwMDAwMDAxMAorI2RlZmluZSBJU1JfUlhFQVJMWQkweDAwMDAwMDA4CisjZGVmaW5lIElTUl9SWEVSUgkweDAwMDAwMDA0CisjZGVmaW5lIElTUl9SWERFU0MJMHgwMDAwMDAwMgorI2RlZmluZSBJU1JfUlhPSwkweDAwMDAwMDAxCisKKyNkZWZpbmUgVFhDRkdfQ1NJCTB4ODAwMDAwMDAKKyNkZWZpbmUgVFhDRkdfSEJJCTB4NDAwMDAwMDAKKyNkZWZpbmUgVFhDRkdfTUxCCTB4MjAwMDAwMDAKKyNkZWZpbmUgVFhDRkdfQVRQCTB4MTAwMDAwMDAKKyNkZWZpbmUgVFhDRkdfRUNSRVRSWQkweDAwODAwMDAwCisjZGVmaW5lIFRYQ0ZHX0JSU1RfRElTCTB4MDAwODAwMDAKKyNkZWZpbmUgVFhDRkdfTVhETUExMDI0CTB4MDAwMDAwMDAKKyNkZWZpbmUgVFhDRkdfTVhETUE1MTIJMHgwMDcwMDAwMAorI2RlZmluZSBUWENGR19NWERNQTI1NgkweDAwNjAwMDAwCisjZGVmaW5lIFRYQ0ZHX01YRE1BMTI4CTB4MDA1MDAwMDAKKyNkZWZpbmUgVFhDRkdfTVhETUE2NAkweDAwNDAwMDAwCisjZGVmaW5lIFRYQ0ZHX01YRE1BMzIJMHgwMDMwMDAwMAorI2RlZmluZSBUWENGR19NWERNQTE2CTB4MDAyMDAwMDAKKyNkZWZpbmUgVFhDRkdfTVhETUE4CTB4MDAxMDAwMDAKKworI2RlZmluZSBDRkdfTE5LU1RTCTB4ODAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1NQRFNUUwkweDYwMDAwMDAwCisjZGVmaW5lIENGR19TUERTVFMxCTB4NDAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1NQRFNUUzAJMHgyMDAwMDAwMAorI2RlZmluZSBDRkdfRFVQU1RTCTB4MTAwMDAwMDAKKyNkZWZpbmUgQ0ZHX1RCSV9FTgkweDAxMDAwMDAwCisjZGVmaW5lIENGR19NT0RFXzEwMDAJMHgwMDQwMDAwMAorLyogUmFtaXQgOiBEb250JyBldmVyIHVzZSBBVVRPXzEwMDAsIGl0IG5ldmVyIHdvcmtzIGFuZCBpcyBidWdneS4KKyAqIFJlYWQgdGhlIFBoeSByZXNwb25zZSBhbmQgdGhlbiBjb25maWd1cmUgdGhlIE1BQyBhY2NvcmRpbmdseSAqLworI2RlZmluZSBDRkdfQVVUT18xMDAwCTB4MDAyMDAwMDAKKyNkZWZpbmUgQ0ZHX1BJTlRfQ1RMCTB4MDAxYzAwMDAKKyNkZWZpbmUgQ0ZHX1BJTlRfRFVQU1RTCTB4MDAxMDAwMDAKKyNkZWZpbmUgQ0ZHX1BJTlRfTE5LU1RTCTB4MDAwODAwMDAKKyNkZWZpbmUgQ0ZHX1BJTlRfU1BEU1RTCTB4MDAwNDAwMDAKKyNkZWZpbmUgQ0ZHX1RNUlRFU1QJMHgwMDAyMDAwMAorI2RlZmluZSBDRkdfTVJNX0RJUwkweDAwMDEwMDAwCisjZGVmaW5lIENGR19NV0lfRElTCTB4MDAwMDgwMDAKKyNkZWZpbmUgQ0ZHX1Q2NEFERFIJMHgwMDAwNDAwMAorI2RlZmluZSBDRkdfUENJNjRfREVUCTB4MDAwMDIwMDAKKyNkZWZpbmUgQ0ZHX0RBVEE2NF9FTgkweDAwMDAxMDAwCisjZGVmaW5lIENGR19NNjRBRERSCTB4MDAwMDA4MDAKKyNkZWZpbmUgQ0ZHX1BIWV9SU1QJMHgwMDAwMDQwMAorI2RlZmluZSBDRkdfUEhZX0RJUwkweDAwMDAwMjAwCisjZGVmaW5lIENGR19FWFRTVFNfRU4JMHgwMDAwMDEwMAorI2RlZmluZSBDRkdfUkVRQUxHCTB4MDAwMDAwODAKKyNkZWZpbmUgQ0ZHX1NCCQkweDAwMDAwMDQwCisjZGVmaW5lIENGR19QT1cJCTB4MDAwMDAwMjAKKyNkZWZpbmUgQ0ZHX0VYRAkJMHgwMDAwMDAxMAorI2RlZmluZSBDRkdfUEVTRUwJMHgwMDAwMDAwOAorI2RlZmluZSBDRkdfQlJPTV9ESVMJMHgwMDAwMDAwNAorI2RlZmluZSBDRkdfRVhUXzEyNQkweDAwMDAwMDAyCisjZGVmaW5lIENGR19CRU0JCTB4MDAwMDAwMDEKKworI2RlZmluZSBFWFRTVFNfVURQUEtUCTB4MDAyMDAwMDAKKyNkZWZpbmUgRVhUU1RTX1RDUFBLVAkweDAwMDgwMDAwCisjZGVmaW5lIEVYVFNUU19JUFBLVAkweDAwMDIwMDAwCisjZGVmaW5lIEVYVFNUU19WUEtUCTB4MDAwMTAwMDAKKyNkZWZpbmUgRVhUU1RTX1ZUR19NQVNLCTB4MDAwMGZmZmYKKworI2RlZmluZSBTUERTVFNfUE9MQVJJVFkJKENGR19TUERTVFMxIHwgQ0ZHX1NQRFNUUzAgfCBDRkdfRFVQU1RTIHwgKGxua3N0cyA/IENGR19MTktTVFMgOiAwKSkKKworI2RlZmluZSBNSUJDX01JQlMJMHgwMDAwMDAwOAorI2RlZmluZSBNSUJDX0FDTFIJMHgwMDAwMDAwNAorI2RlZmluZSBNSUJDX0ZSWgkweDAwMDAwMDAyCisjZGVmaW5lIE1JQkNfV1JOCTB4MDAwMDAwMDEKKworI2RlZmluZSBQQ1JfUFNFTgkoMSA8PCAzMSkKKyNkZWZpbmUgUENSX1BTX01DQVNUCSgxIDw8IDMwKQorI2RlZmluZSBQQ1JfUFNfREEJKDEgPDwgMjkpCisjZGVmaW5lIFBDUl9TVEhJXzgJKDMgPDwgMjMpCisjZGVmaW5lIFBDUl9TVExPXzQJKDEgPDwgMjMpCisjZGVmaW5lIFBDUl9GRkhJXzhLCSgzIDw8IDIxKQorI2RlZmluZSBQQ1JfRkZMT180SwkoMSA8PCAyMSkKKyNkZWZpbmUgUENSX1BBVVNFX0NOVAkweEZGRkUKKworI2RlZmluZSBSWENGR19BRVAJMHg4MDAwMDAwMAorI2RlZmluZSBSWENGR19BUlAJMHg0MDAwMDAwMAorI2RlZmluZSBSWENGR19TVFJJUENSQwkweDIwMDAwMDAwCisjZGVmaW5lIFJYQ0ZHX1JYX0ZECTB4MTAwMDAwMDAKKyNkZWZpbmUgUlhDRkdfQUxQCTB4MDgwMDAwMDAKKyNkZWZpbmUgUlhDRkdfQUlSTAkweDA0MDAwMDAwCisjZGVmaW5lIFJYQ0ZHX01YRE1BNTEyCTB4MDA3MDAwMDAKKyNkZWZpbmUgUlhDRkdfRFJUSAkweDAwMDAwMDNlCisjZGVmaW5lIFJYQ0ZHX0RSVEgwCTB4MDAwMDAwMDIKKworI2RlZmluZSBSRkNSX1JGRU4JMHg4MDAwMDAwMAorI2RlZmluZSBSRkNSX0FBQgkweDQwMDAwMDAwCisjZGVmaW5lIFJGQ1JfQUFNCTB4MjAwMDAwMDAKKyNkZWZpbmUgUkZDUl9BQVUJMHgxMDAwMDAwMAorI2RlZmluZSBSRkNSX0FQTQkweDA4MDAwMDAwCisjZGVmaW5lIFJGQ1JfQVBBVAkweDA3ODAwMDAwCisjZGVmaW5lIFJGQ1JfQVBBVDMJMHgwNDAwMDAwMAorI2RlZmluZSBSRkNSX0FQQVQyCTB4MDIwMDAwMDAKKyNkZWZpbmUgUkZDUl9BUEFUMQkweDAxMDAwMDAwCisjZGVmaW5lIFJGQ1JfQVBBVDAJMHgwMDgwMDAwMAorI2RlZmluZSBSRkNSX0FBUlAJMHgwMDQwMDAwMAorI2RlZmluZSBSRkNSX01IRU4JMHgwMDIwMDAwMAorI2RlZmluZSBSRkNSX1VIRU4JMHgwMDEwMDAwMAorI2RlZmluZSBSRkNSX1VMTQkweDAwMDgwMDAwCisKKyNkZWZpbmUgVlJDUl9SVURQRQkweDAwMDAwMDgwCisjZGVmaW5lIFZSQ1JfUlRDUEUJMHgwMDAwMDA0MAorI2RlZmluZSBWUkNSX1JJUEUJMHgwMDAwMDAyMAorI2RlZmluZSBWUkNSX0lQRU4JMHgwMDAwMDAxMAorI2RlZmluZSBWUkNSX0RVVEYJMHgwMDAwMDAwOAorI2RlZmluZSBWUkNSX0RWVEYJMHgwMDAwMDAwNAorI2RlZmluZSBWUkNSX1ZUUkVOCTB4MDAwMDAwMDIKKyNkZWZpbmUgVlJDUl9WVERFTgkweDAwMDAwMDAxCisKKyNkZWZpbmUgVlRDUl9QUENISwkweDAwMDAwMDA4CisjZGVmaW5lIFZUQ1JfR0NISwkweDAwMDAwMDA0CisjZGVmaW5lIFZUQ1JfVlBQVEkJMHgwMDAwMDAwMgorI2RlZmluZSBWVENSX1ZHVEkJMHgwMDAwMDAwMQorCisjZGVmaW5lIENSCQkweDAwCisjZGVmaW5lIENGRwkJMHgwNAorI2RlZmluZSBNRUFSCQkweDA4CisjZGVmaW5lIFBUU0NSCQkweDBjCisjZGVmaW5lCUlTUgkJMHgxMAorI2RlZmluZQlJTVIJCTB4MTQKKyNkZWZpbmUJSUVSCQkweDE4CisjZGVmaW5lCUlIUgkJMHgxYworI2RlZmluZSBUWERQCQkweDIwCisjZGVmaW5lIFRYRFBfSEkJCTB4MjQKKyNkZWZpbmUgVFhDRkcJCTB4MjgKKyNkZWZpbmUgR1BJT1IJCTB4MmMKKyNkZWZpbmUgUlhEUAkJMHgzMAorI2RlZmluZSBSWERQX0hJCQkweDM0CisjZGVmaW5lIFJYQ0ZHCQkweDM4CisjZGVmaW5lIFBRQ1IJCTB4M2MKKyNkZWZpbmUgV0NTUgkJMHg0MAorI2RlZmluZSBQQ1IJCTB4NDQKKyNkZWZpbmUgUkZDUgkJMHg0OAorI2RlZmluZSBSRkRSCQkweDRjCisKKyNkZWZpbmUgU1JSCQkweDU4CisKKyNkZWZpbmUgVlJDUgkJMHhiYworI2RlZmluZSBWVENSCQkweGMwCisjZGVmaW5lIFZEUgkJMHhjNAorI2RlZmluZSBDQ1NSCQkweGNjCisKKyNkZWZpbmUgVEJJQ1IJCTB4ZTAKKyNkZWZpbmUgVEJJU1IJCTB4ZTQKKyNkZWZpbmUgVEFOQVIJCTB4ZTgKKyNkZWZpbmUgVEFOTFBBUgkJMHhlYworI2RlZmluZSBUQU5FUgkJMHhmMAorI2RlZmluZSBURVNSCQkweGY0CisKKyNkZWZpbmUgVEJJQ1JfTVJfQU5fRU5BQkxFCTB4MDAwMDEwMDAKKyNkZWZpbmUgVEJJQ1JfTVJfUkVTVEFSVF9BTgkweDAwMDAwMjAwCisKKyNkZWZpbmUgVEJJU1JfTVJfTElOS19TVEFUVVMJMHgwMDAwMDAyMAorI2RlZmluZSBUQklTUl9NUl9BTl9DT01QTEVURQkweDAwMDAwMDA0CisKKyNkZWZpbmUgVEFOQVJfUFMyIAkJMHgwMDAwMDEwMAorI2RlZmluZSBUQU5BUl9QUzEgCQkweDAwMDAwMDgwCisjZGVmaW5lIFRBTkFSX0hBTEZfRFVQIAkJMHgwMDAwMDA0MAorI2RlZmluZSBUQU5BUl9GVUxMX0RVUCAJCTB4MDAwMDAwMjAKKworI2RlZmluZSBHUElPUl9HUDVfT0UJCTB4MDAwMDAyMDAKKyNkZWZpbmUgR1BJT1JfR1A0X09FCQkweDAwMDAwMTAwCisjZGVmaW5lIEdQSU9SX0dQM19PRQkJMHgwMDAwMDA4MAorI2RlZmluZSBHUElPUl9HUDJfT0UJCTB4MDAwMDAwNDAKKyNkZWZpbmUgR1BJT1JfR1AxX09FCQkweDAwMDAwMDIwCisjZGVmaW5lIEdQSU9SX0dQM19PVVQJCTB4MDAwMDAwMDQKKyNkZWZpbmUgR1BJT1JfR1AxX09VVAkJMHgwMDAwMDAwMQorCisjZGVmaW5lIExJTktfQVVUT05FR09USUFURQkweDAxCisjZGVmaW5lIExJTktfRE9XTgkJMHgwMgorI2RlZmluZSBMSU5LX1VQCQkJMHgwNAorCisjaWZkZWYgVVNFXzY0QklUX0FERFIKKyNkZWZpbmUgSFdfQUREUl9MRU4JOAorI2RlZmluZSBkZXNjX2FkZHJfc2V0KGRlc2MsIGFkZHIpCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJdTY0IF9fYWRkciA9IChhZGRyKTsJCQkJXAorCQkoZGVzYylbMF0gPSBjcHVfdG9fbGUzMihfX2FkZHIpOwkJXAorCQkoZGVzYylbMV0gPSBjcHVfdG9fbGUzMihfX2FkZHIgPj4gMzIpOwkJXAorCX0gd2hpbGUoMCkKKyNkZWZpbmUgZGVzY19hZGRyX2dldChkZXNjKQkJCQkJXAorCQkoKCh1NjQpbGUzMl90b19jcHUoKGRlc2MpWzFdKSA8PCAzMikJCVwKKwkJICAgICB8IGxlMzJfdG9fY3B1KChkZXNjKVswXSkpCisjZWxzZQorI2RlZmluZSBIV19BRERSX0xFTgk0CisjZGVmaW5lIGRlc2NfYWRkcl9zZXQoZGVzYywgYWRkcikJKChkZXNjKVswXSA9IGNwdV90b19sZTMyKGFkZHIpKQorI2RlZmluZSBkZXNjX2FkZHJfZ2V0KGRlc2MpCQkobGUzMl90b19jcHUoKGRlc2MpWzBdKSkKKyNlbmRpZgorCisjZGVmaW5lIERFU0NfTElOSwkJMAorI2RlZmluZSBERVNDX0JVRlBUUgkJKERFU0NfTElOSyArIEhXX0FERFJfTEVOLzQpCisjZGVmaW5lIERFU0NfQ01EU1RTCQkoREVTQ19CVUZQVFIgKyBIV19BRERSX0xFTi80KQorI2RlZmluZSBERVNDX0VYVFNUUwkJKERFU0NfQ01EU1RTICsgNC80KQorCisjZGVmaW5lIENNRFNUU19PV04JMHg4MDAwMDAwMAorI2RlZmluZSBDTURTVFNfTU9SRQkweDQwMDAwMDAwCisjZGVmaW5lIENNRFNUU19JTlRSCTB4MjAwMDAwMDAKKyNkZWZpbmUgQ01EU1RTX0VSUgkweDEwMDAwMDAwCisjZGVmaW5lIENNRFNUU19PSwkweDA4MDAwMDAwCisjZGVmaW5lIENNRFNUU19SVU5UCTB4MDAyMDAwMDAKKyNkZWZpbmUgQ01EU1RTX0xFTl9NQVNLCTB4MDAwMGZmZmYKKworI2RlZmluZSBDTURTVFNfREVTVF9NQVNLCTB4MDE4MDAwMDAKKyNkZWZpbmUgQ01EU1RTX0RFU1RfU0VMRgkweDAwODAwMDAwCisjZGVmaW5lIENNRFNUU19ERVNUX01VTFRJCTB4MDEwMDAwMDAKKworI2RlZmluZSBERVNDX1NJWkUJOAkJLyogU2hvdWxkIGJlIGNhY2hlIGxpbmUgc2l6ZWQgKi8KKworc3RydWN0IHJ4X2luZm8geworCXNwaW5sb2NrX3QJbG9jazsKKwlpbnQJCXVwOworCWxvbmcJCWlkbGU7CisKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tic1tOUl9SWF9ERVNDXTsKKworCXUzMgkJKm5leHRfcnhfZGVzYzsKKwl1MTYJCW5leHRfcngsIG5leHRfZW1wdHk7CisKKwl1MzIJCSpkZXNjczsKKwlkbWFfYWRkcl90CXBoeV9kZXNjczsKK307CisKKworc3RydWN0IG5zODM4MjAgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOworCXU4CQkJX19pb21lbSAqYmFzZTsKKworCXN0cnVjdCBwY2lfZGV2CQkqcGNpX2RldjsKKworI2lmZGVmIE5TODM4MjBfVkxBTl9BQ0NFTF9TVVBQT1JUCisJc3RydWN0IHZsYW5fZ3JvdXAJKnZsZ3JwOworI2VuZGlmCisKKwlzdHJ1Y3QgcnhfaW5mbwkJcnhfaW5mbzsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJcnhfdGFza2xldDsKKworCXVuc2lnbmVkCQlpaHI7CisJc3RydWN0IHdvcmtfc3RydWN0CXRxX3JlZmlsbDsKKworCS8qIHByb3RlY3RzIGV2ZXJ5dGhpbmcgYmVsb3cuICBpcnFzYXZlIHdoZW4gdXNpbmcuICovCisJc3BpbmxvY2tfdAkJbWlzY19sb2NrOworCisJdTMyCQkJQ0ZHX2NhY2hlOworCisJdTMyCQkJTUVBUl9jYWNoZTsKKwl1MzIJCQlJTVJfY2FjaGU7CisJc3RydWN0IGVlcHJvbQkJZWU7CisKKwl1bnNpZ25lZAkJbGlua3N0YXRlOworCisJc3BpbmxvY2tfdAl0eF9sb2NrOworCisJdTE2CQl0eF9kb25lX2lkeDsKKwl1MTYJCXR4X2lkeDsKKwl2b2xhdGlsZSB1MTYJdHhfZnJlZV9pZHg7CS8qIGlkeCBvZiBmcmVlIGRlc2MgY2hhaW4gKi8KKwl1MTYJCXR4X2ludHJfaWR4OworCisJYXRvbWljX3QJbnJfdHhfc2ticzsKKwlzdHJ1Y3Qgc2tfYnVmZgkqdHhfc2tic1tOUl9UWF9ERVNDXTsKKworCWNoYXIJCXBhZFsxNl0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKTsKKwl1MzIJCSp0eF9kZXNjczsKKwlkbWFfYWRkcl90CXR4X3BoeV9kZXNjczsKKworCXN0cnVjdCB0aW1lcl9saXN0CXR4X3dhdGNoZG9nOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbnM4MzgyMCAqUFJJVihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBuZXRkZXZfcHJpdihkZXYpOworfQorCisjZGVmaW5lIF9fa2lja19yeChkZXYpCXdyaXRlbChDUl9SWEUsIGRldi0+YmFzZSArIENSKQorCitzdGF0aWMgaW5saW5lIHZvaWQga2lja19yeChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgbnM4MzgyMCAqZGV2ID0gUFJJVihuZGV2KTsKKwlkcHJpbnRrKCJraWNrX3J4OiBtYXliZSBraWNraW5nXG4iKTsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KDAsICZkZXYtPnJ4X2luZm8uaWRsZSkpIHsKKwkJZHByaW50aygiYWN0dWFsbHkga2lja2luZ1xuIik7CisJCXdyaXRlbChkZXYtPnJ4X2luZm8ucGh5X2Rlc2NzICsKKwkJCSg0ICogREVTQ19TSVpFICogZGV2LT5yeF9pbmZvLm5leHRfcngpLAorCQkgICAgICAgZGV2LT5iYXNlICsgUlhEUCk7CisJCWlmIChkZXYtPnJ4X2luZm8ubmV4dF9yeCA9PSBkZXYtPnJ4X2luZm8ubmV4dF9lbXB0eSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdWgtb2g6IG5leHRfcnggPT0gbmV4dF9lbXB0eT8/P1xuIiwKKwkJCQluZGV2LT5uYW1lKTsKKwkJX19raWNrX3J4KGRldik7CisJfQorfQorCisvL2ZyZWUgPSAodHhfZG9uZV9pZHggKyBOUl9UWF9ERVNDLTIgLSBmcmVlX2lkeCkgJSBOUl9UWF9ERVNDCisjZGVmaW5lIHN0YXJ0X3R4X29rYXkoZGV2KQlcCisJKCgoTlJfVFhfREVTQy0yICsgZGV2LT50eF9kb25lX2lkeCAtIGRldi0+dHhfZnJlZV9pZHgpICUgTlJfVFhfREVTQykgPiBNSU5fVFhfREVTQ19GUkVFKQorCisKKyNpZmRlZiBOUzgzODIwX1ZMQU5fQUNDRUxfU1VQUE9SVCAKK3N0YXRpYyB2b2lkIG5zODM4MjBfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKK3sKKwlzdHJ1Y3QgbnM4MzgyMCAqZGV2ID0gUFJJVihuZGV2KTsKKworCXNwaW5fbG9ja19pcnEoJmRldi0+bWlzY19sb2NrKTsKKwlzcGluX2xvY2soJmRldi0+dHhfbG9jayk7CisKKwlkZXYtPnZsZ3JwID0gZ3JwOworCisJc3Bpbl91bmxvY2soJmRldi0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPm1pc2NfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIG5zODM4MjBfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKQoreworCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOworCisJc3Bpbl9sb2NrX2lycSgmZGV2LT5taXNjX2xvY2spOworCXNwaW5fbG9jaygmZGV2LT50eF9sb2NrKTsKKwlpZiAoZGV2LT52bGdycCkKKwkJZGV2LT52bGdycC0+dmxhbl9kZXZpY2VzW3ZpZF0gPSBOVUxMOworCXNwaW5fdW5sb2NrKCZkZXYtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5taXNjX2xvY2spOworfQorI2VuZGlmCisKKy8qIFBhY2tldCBSZWNlaXZlcgorICoKKyAqIFRoZSBoYXJkd2FyZSBzdXBwb3J0cyBsaW5rZWQgbGlzdHMgb2YgcmVjZWl2ZSBkZXNjcmlwdG9ycyBmb3IKKyAqIHdoaWNoIG93bmVyc2hpcCBpcyB0cmFuc2ZlcmVkIGJhY2sgYW5kIGZvcnRoIGJ5IG1lYW5zIG9mIGFuCisgKiBvd25lcnNoaXAgYml0LiAgV2hpbGUgdGhlIGhhcmR3YXJlIGRvZXMgc3VwcG9ydCB0aGUgdXNlIG9mIGEKKyAqIHJpbmcgZm9yIHJlY2VpdmUgZGVzY3JpcHRvcnMsIHdlIG9ubHkgbWFrZSB1c2Ugb2YgYSBjaGFpbiBpbgorICogYW4gYXR0ZW1wdCB0byByZWR1Y2UgYnVzIHRyYWZmaWMgdW5kZXIgaGVhdnkgbG9hZCBzY2VuYXJpb3MuCisgKiBUaGlzIHdpbGwgYWxzbyBtYWtlIGJ1Z3MgYSBiaXQgbW9yZSBvYnZpb3VzLiAgVGhlIGN1cnJlbnQgY29kZQorICogb25seSBtYWtlcyB1c2Ugb2YgYSBzaW5nbGUgcnggY2hhaW47IEkgaG9wZSB0byBpbXBsZW1lbnQKKyAqIHByaW9yaXR5IGJhc2VkIHJ4IGZvciB2ZXJzaW9uIDEuMC4gIEdvYWw6IGV2ZW4gdW5kZXIgb3ZlcmxvYWQKKyAqIGNvbmRpdGlvbnMsIHN0aWxsIHJvdXRlIHJlYWx0aW1lIHRyYWZmaWMgd2l0aCBhcyBsb3cgaml0dGVyIGFzCisgKiBwb3NzaWJsZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJ1aWxkX3J4X2Rlc2Moc3RydWN0IG5zODM4MjAgKmRldiwgdTMyICpkZXNjLCBkbWFfYWRkcl90IGxpbmssIGRtYV9hZGRyX3QgYnVmLCB1MzIgY21kc3RzLCB1MzIgZXh0c3RzKQoreworCWRlc2NfYWRkcl9zZXQoZGVzYyArIERFU0NfTElOSywgbGluayk7CisJZGVzY19hZGRyX3NldChkZXNjICsgREVTQ19CVUZQVFIsIGJ1Zik7CisJZGVzY1tERVNDX0VYVFNUU10gPSBjcHVfdG9fbGUzMihleHRzdHMpOworCW1iKCk7CisJZGVzY1tERVNDX0NNRFNUU10gPSBjcHVfdG9fbGUzMihjbWRzdHMpOworfQorCisjZGVmaW5lIG5yX3J4X2VtcHR5KGRldikgKChOUl9SWF9ERVNDLTIgKyBkZXYtPnJ4X2luZm8ubmV4dF9yeCAtIGRldi0+cnhfaW5mby5uZXh0X2VtcHR5KSAlIE5SX1JYX0RFU0MpCitzdGF0aWMgaW5saW5lIGludCBuczgzODIwX2FkZF9yeF9za2Ioc3RydWN0IG5zODM4MjAgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1bnNpZ25lZCBuZXh0X2VtcHR5OworCXUzMiBjbWRzdHM7CisJdTMyICpzZzsKKwlkbWFfYWRkcl90IGJ1ZjsKKworCW5leHRfZW1wdHkgPSBkZXYtPnJ4X2luZm8ubmV4dF9lbXB0eTsKKworCS8qIGRvbid0IG92ZXJydW4gbGFzdCByeCBtYXJrZXIgKi8KKwlpZiAodW5saWtlbHkobnJfcnhfZW1wdHkoZGV2KSA8PSAyKSkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDE7CisJfQorCisjaWYgMAorCWRwcmludGsoIm5leHRfZW1wdHlbJWRdIG5yX3VzZWRbJWRdIG5leHRfcnhbJWRdXG4iLAorCQlkZXYtPnJ4X2luZm8ubmV4dF9lbXB0eSwKKwkJZGV2LT5yeF9pbmZvLm5yX3VzZWQsCisJCWRldi0+cnhfaW5mby5uZXh0X3J4CisJCSk7CisjZW5kaWYKKworCXNnID0gZGV2LT5yeF9pbmZvLmRlc2NzICsgKG5leHRfZW1wdHkgKiBERVNDX1NJWkUpOworCWlmICh1bmxpa2VseShOVUxMICE9IGRldi0+cnhfaW5mby5za2JzW25leHRfZW1wdHldKSkKKwkJQlVHKCk7CisJZGV2LT5yeF9pbmZvLnNrYnNbbmV4dF9lbXB0eV0gPSBza2I7CisKKwlkZXYtPnJ4X2luZm8ubmV4dF9lbXB0eSA9IChuZXh0X2VtcHR5ICsgMSkgJSBOUl9SWF9ERVNDOworCWNtZHN0cyA9IFJFQUxfUlhfQlVGX1NJWkUgfCBDTURTVFNfSU5UUjsKKwlidWYgPSBwY2lfbWFwX3NpbmdsZShkZXYtPnBjaV9kZXYsIHNrYi0+dGFpbCwKKwkJCSAgICAgUkVBTF9SWF9CVUZfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlidWlsZF9yeF9kZXNjKGRldiwgc2csIDAsIGJ1ZiwgY21kc3RzLCAwKTsKKwkvKiB1cGRhdGUgbGluayBvZiBwcmV2aW91cyByeCAqLworCWlmIChsaWtlbHkobmV4dF9lbXB0eSAhPSBkZXYtPnJ4X2luZm8ubmV4dF9yeCkpCisJCWRldi0+cnhfaW5mby5kZXNjc1soKE5SX1JYX0RFU0MgKyBuZXh0X2VtcHR5IC0gMSkgJSBOUl9SWF9ERVNDKSAqIERFU0NfU0laRV0gPSBjcHVfdG9fbGUzMihkZXYtPnJ4X2luZm8ucGh5X2Rlc2NzICsgKG5leHRfZW1wdHkgKiBERVNDX1NJWkUgKiA0KSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcnhfcmVmaWxsKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBpbnQgZ2ZwKQoreworCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOworCXVuc2lnbmVkIGk7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwlpZiAodW5saWtlbHkobnJfcnhfZW1wdHkoZGV2KSA8PSAyKSkKKwkJcmV0dXJuIDA7CisKKwlkcHJpbnRrKCJyeF9yZWZpbGwoJXApXG4iLCBuZGV2KTsKKwlpZiAoZ2ZwID09IEdGUF9BVE9NSUMpCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnJ4X2luZm8ubG9jaywgZmxhZ3MpOworCWZvciAoaT0wOyBpPE5SX1JYX0RFU0M7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlsb25nIHJlczsKKwkJLyogZXh0cmEgMTYgYnl0ZXMgZm9yIGFsaWdubWVudCAqLworCQlza2IgPSBfX2Rldl9hbGxvY19za2IoUkVBTF9SWF9CVUZfU0laRSsxNiwgZ2ZwKTsKKwkJaWYgKHVubGlrZWx5KCFza2IpKQorCQkJYnJlYWs7CisKKwkJcmVzID0gKGxvbmcpc2tiLT50YWlsICYgMHhmOworCQlyZXMgPSAweDEwIC0gcmVzOworCQlyZXMgJj0gMHhmOworCQlza2JfcmVzZXJ2ZShza2IsIHJlcyk7CisKKwkJc2tiLT5kZXYgPSBuZGV2OworCQlpZiAoZ2ZwICE9IEdGUF9BVE9NSUMpCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5yeF9pbmZvLmxvY2ssIGZsYWdzKTsKKwkJcmVzID0gbnM4MzgyMF9hZGRfcnhfc2tiKGRldiwgc2tiKTsKKwkJaWYgKGdmcCAhPSBHRlBfQVRPTUlDKQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5yeF9pbmZvLmxvY2ssIGZsYWdzKTsKKwkJaWYgKHJlcykgeworCQkJaSA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoZ2ZwID09IEdGUF9BVE9NSUMpCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cnhfaW5mby5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gaSA/IDAgOiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBGQVNUQ0FMTChyeF9yZWZpbGxfYXRvbWljKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KSk7CitzdGF0aWMgdm9pZCBmYXN0Y2FsbCByeF9yZWZpbGxfYXRvbWljKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXJ4X3JlZmlsbChuZGV2LCBHRlBfQVRPTUlDKTsKK30KKworLyogUkVGSUxMICovCitzdGF0aWMgaW5saW5lIHZvaWQgcXVldWVfcmVmaWxsKHZvaWQgKl9kZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBfZGV2OworCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOworCisJcnhfcmVmaWxsKG5kZXYsIEdGUF9LRVJORUwpOworCWlmIChkZXYtPnJ4X2luZm8udXApCisJCWtpY2tfcngobmRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9yeF9kZXNjKHN0cnVjdCBuczgzODIwICpkZXYsIHVuc2lnbmVkIGkpCit7CisJYnVpbGRfcnhfZGVzYyhkZXYsIGRldi0+cnhfaW5mby5kZXNjcyArIChERVNDX1NJWkUgKiBpKSwgMCwgMCwgQ01EU1RTX09XTiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIEZBU1RDQUxMKHBoeV9pbnRyKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KSk7CitzdGF0aWMgdm9pZCBmYXN0Y2FsbCBwaHlfaW50cihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgbnM4MzgyMCAqZGV2ID0gUFJJVihuZGV2KTsKKwlzdGF0aWMgY2hhciAqc3BlZWRzW10gPSB7ICIxMCIsICIxMDAiLCAiMTAwMCIsICIxMDAwKD8pIiwgIjEwMDBGIiB9OworCXUzMiBjZmcsIG5ld19jZmc7CisJdTMyIHRiaXNyLCB0YW5hciwgdGFubHBhcjsKKwlpbnQgc3BlZWQsIGZ1bGxkdXBsZXgsIG5ld2xpbmtzdGF0ZTsKKworCWNmZyA9IHJlYWRsKGRldi0+YmFzZSArIENGRykgXiBTUERTVFNfUE9MQVJJVFk7CisKKwlpZiAoZGV2LT5DRkdfY2FjaGUgJiBDRkdfVEJJX0VOKSB7CisJCS8qIHdlIGhhdmUgYW4gb3B0aWNhbCB0cmFuc2NlaXZlciAqLworCQl0YmlzciA9IHJlYWRsKGRldi0+YmFzZSArIFRCSVNSKTsKKwkJdGFuYXIgPSByZWFkbChkZXYtPmJhc2UgKyBUQU5BUik7CisJCXRhbmxwYXIgPSByZWFkbChkZXYtPmJhc2UgKyBUQU5MUEFSKTsKKwkJZHByaW50aygicGh5X2ludHI6IHRiaXNyPSUwOHgsIHRhbmFyPSUwOHgsIHRhbmxwYXI9JTA4eFxuIiwKKwkJCXRiaXNyLCB0YW5hciwgdGFubHBhcik7CisKKwkJaWYgKCAoZnVsbGR1cGxleCA9ICh0YW5scGFyICYgVEFOQVJfRlVMTF9EVVApCisJCSAgICAgICYmICh0YW5hciAmIFRBTkFSX0ZVTExfRFVQKSkgKSB7CisKKwkJCS8qIGJvdGggb2YgdXMgYXJlIGZ1bGwgZHVwbGV4ICovCisJCQl3cml0ZWwocmVhZGwoZGV2LT5iYXNlICsgVFhDRkcpCisJCQkgICAgICAgfCBUWENGR19DU0kgfCBUWENGR19IQkkgfCBUWENGR19BVFAsCisJCQkgICAgICAgZGV2LT5iYXNlICsgVFhDRkcpOworCQkJd3JpdGVsKHJlYWRsKGRldi0+YmFzZSArIFJYQ0ZHKSB8IFJYQ0ZHX1JYX0ZELAorCQkJICAgICAgIGRldi0+YmFzZSArIFJYQ0ZHKTsKKwkJCS8qIExpZ2h0IHVwIGZ1bGwgZHVwbGV4IExFRCAqLworCQkJd3JpdGVsKHJlYWRsKGRldi0+YmFzZSArIEdQSU9SKSB8IEdQSU9SX0dQMV9PVVQsCisJCQkgICAgICAgZGV2LT5iYXNlICsgR1BJT1IpOworCisJCX0gZWxzZSBpZigoKHRhbmxwYXIgJiBUQU5BUl9IQUxGX0RVUCkKKwkJCSAgICYmICh0YW5hciAmIFRBTkFSX0hBTEZfRFVQKSkKKwkJCXx8ICgodGFubHBhciAmIFRBTkFSX0ZVTExfRFVQKQorCQkJICAgICYmICh0YW5hciAmIFRBTkFSX0hBTEZfRFVQKSkKKwkJCXx8ICgodGFubHBhciAmIFRBTkFSX0hBTEZfRFVQKQorCQkJICAgICYmICh0YW5hciAmIFRBTkFSX0ZVTExfRFVQKSkpIHsKKworCQkJLyogb25lIG9yIGJvdGggb2YgdXMgYXJlIGhhbGYgZHVwbGV4ICovCisJCQl3cml0ZWwoKHJlYWRsKGRldi0+YmFzZSArIFRYQ0ZHKQorCQkJCSYgfihUWENGR19DU0kgfCBUWENGR19IQkkpKSB8IFRYQ0ZHX0FUUCwKKwkJCSAgICAgICBkZXYtPmJhc2UgKyBUWENGRyk7CisJCQl3cml0ZWwocmVhZGwoZGV2LT5iYXNlICsgUlhDRkcpICYgflJYQ0ZHX1JYX0ZELAorCQkJICAgICAgIGRldi0+YmFzZSArIFJYQ0ZHKTsKKwkJCS8qIFR1cm4gb2ZmIGZ1bGwgZHVwbGV4IExFRCAqLworCQkJd3JpdGVsKHJlYWRsKGRldi0+YmFzZSArIEdQSU9SKSAmIH5HUElPUl9HUDFfT1VULAorCQkJICAgICAgIGRldi0+YmFzZSArIEdQSU9SKTsKKwkJfQorCisJCXNwZWVkID0gNDsgLyogMTAwMEYgKi8KKworCX0gZWxzZSB7CisJCS8qIHdlIGhhdmUgYSBjb3BwZXIgdHJhbnNjZWl2ZXIgKi8KKwkJbmV3X2NmZyA9IGRldi0+Q0ZHX2NhY2hlICYgfihDRkdfU0IgfCBDRkdfTU9ERV8xMDAwIHwgQ0ZHX1NQRFNUUyk7CisKKwkJaWYgKGNmZyAmIENGR19TUERTVFMxKQorCQkJbmV3X2NmZyB8PSBDRkdfTU9ERV8xMDAwOworCQllbHNlCisJCQluZXdfY2ZnICY9IH5DRkdfTU9ERV8xMDAwOworCisJCXNwZWVkID0gKChjZmcgLyBDRkdfU1BEU1RTMCkgJiAzKTsKKwkJZnVsbGR1cGxleCA9IChjZmcgJiBDRkdfRFVQU1RTKTsKKworCQlpZiAoZnVsbGR1cGxleCkKKwkJCW5ld19jZmcgfD0gQ0ZHX1NCOworCisJCWlmICgoY2ZnICYgQ0ZHX0xOS1NUUykgJiYKKwkJICAgICgobmV3X2NmZyBeIGRldi0+Q0ZHX2NhY2hlKSAmIENGR19NT0RFXzEwMDApKSB7CisJCQl3cml0ZWwobmV3X2NmZywgZGV2LT5iYXNlICsgQ0ZHKTsKKwkJCWRldi0+Q0ZHX2NhY2hlID0gbmV3X2NmZzsKKwkJfQorCisJCWRldi0+Q0ZHX2NhY2hlICY9IH5DRkdfU1BEU1RTOworCQlkZXYtPkNGR19jYWNoZSB8PSBjZmcgJiBDRkdfU1BEU1RTOworCX0KKworCW5ld2xpbmtzdGF0ZSA9IChjZmcgJiBDRkdfTE5LU1RTKSA/IExJTktfVVAgOiBMSU5LX0RPV047CisKKwlpZiAobmV3bGlua3N0YXRlICYgTElOS19VUAorCSAgICAmJiBkZXYtPmxpbmtzdGF0ZSAhPSBuZXdsaW5rc3RhdGUpIHsKKwkJbmV0aWZfc3RhcnRfcXVldWUobmRldik7CisJCW5ldGlmX3dha2VfcXVldWUobmRldik7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIG5vdyAlcyBtYnBzLCAlcyBkdXBsZXggYW5kIHVwLlxuIiwKKwkJCW5kZXYtPm5hbWUsCisJCQlzcGVlZHNbc3BlZWRdLAorCQkJZnVsbGR1cGxleCA/ICJmdWxsIiA6ICJoYWxmIik7CisJfSBlbHNlIGlmIChuZXdsaW5rc3RhdGUgJiBMSU5LX0RPV04KKwkJICAgJiYgZGV2LT5saW5rc3RhdGUgIT0gbmV3bGlua3N0YXRlKSB7CisJCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIG5vdyBkb3duLlxuIiwgbmRldi0+bmFtZSk7CisJfQorCisJZGV2LT5saW5rc3RhdGUgPSBuZXdsaW5rc3RhdGU7Cit9CisKK3N0YXRpYyBpbnQgbnM4MzgyMF9zZXR1cF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgbnM4MzgyMCAqZGV2ID0gUFJJVihuZGV2KTsKKwl1bnNpZ25lZCBpOworCWludCByZXQ7CisKKwlkcHJpbnRrKCJuczgzODIwX3NldHVwX3J4KCVwKVxuIiwgbmRldik7CisKKwlkZXYtPnJ4X2luZm8uaWRsZSA9IDE7CisJZGV2LT5yeF9pbmZvLm5leHRfcnggPSAwOworCWRldi0+cnhfaW5mby5uZXh0X3J4X2Rlc2MgPSBkZXYtPnJ4X2luZm8uZGVzY3M7CisJZGV2LT5yeF9pbmZvLm5leHRfZW1wdHkgPSAwOworCisJZm9yIChpPTA7IGk8TlJfUlhfREVTQzsgaSsrKQorCQljbGVhcl9yeF9kZXNjKGRldiwgaSk7CisKKwl3cml0ZWwoMCwgZGV2LT5iYXNlICsgUlhEUF9ISSk7CisJd3JpdGVsKGRldi0+cnhfaW5mby5waHlfZGVzY3MsIGRldi0+YmFzZSArIFJYRFApOworCisJcmV0ID0gcnhfcmVmaWxsKG5kZXYsIEdGUF9LRVJORUwpOworCWlmICghcmV0KSB7CisJCWRwcmludGsoInN0YXJ0aW5nIHJlY2VpdmVyXG4iKTsKKwkJLyogcHJldmVudCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgZnJvbSBzdG9tcGluZyBvbiB1cyAqLworCQlzcGluX2xvY2tfaXJxKCZkZXYtPnJ4X2luZm8ubG9jayk7CisKKwkJd3JpdGVsKDB4MDAwMSwgZGV2LT5iYXNlICsgQ0NTUik7CisJCXdyaXRlbCgwLCBkZXYtPmJhc2UgKyBSRkNSKTsKKwkJd3JpdGVsKDB4N2ZjMDAwMDAsIGRldi0+YmFzZSArIFJGQ1IpOworCQl3cml0ZWwoMHhmZmMwMDAwMCwgZGV2LT5iYXNlICsgUkZDUik7CisKKwkJZGV2LT5yeF9pbmZvLnVwID0gMTsKKworCQlwaHlfaW50cihuZGV2KTsKKworCQkvKiBPa2F5LCBsZXQgaXQgcmlwICovCisJCXNwaW5fbG9ja19pcnEoJmRldi0+bWlzY19sb2NrKTsKKwkJZGV2LT5JTVJfY2FjaGUgfD0gSVNSX1BIWTsKKwkJZGV2LT5JTVJfY2FjaGUgfD0gSVNSX1JYUkNNUDsKKwkJLy9kZXYtPklNUl9jYWNoZSB8PSBJU1JfUlhFUlI7CisJCS8vZGV2LT5JTVJfY2FjaGUgfD0gSVNSX1JYT0s7CisJCWRldi0+SU1SX2NhY2hlIHw9IElTUl9SWE9STjsKKwkJZGV2LT5JTVJfY2FjaGUgfD0gSVNSX1JYU09WUjsKKwkJZGV2LT5JTVJfY2FjaGUgfD0gSVNSX1JYREVTQzsKKwkJZGV2LT5JTVJfY2FjaGUgfD0gSVNSX1JYSURMRTsKKwkJZGV2LT5JTVJfY2FjaGUgfD0gSVNSX1RYREVTQzsKKwkJZGV2LT5JTVJfY2FjaGUgfD0gSVNSX1RYSURMRTsKKworCQl3cml0ZWwoZGV2LT5JTVJfY2FjaGUsIGRldi0+YmFzZSArIElNUik7CisJCXdyaXRlbCgxLCBkZXYtPmJhc2UgKyBJRVIpOworCQlzcGluX3VubG9ja19pcnEoJmRldi0+bWlzY19sb2NrKTsKKworCQlraWNrX3J4KG5kZXYpOworCisJCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5yeF9pbmZvLmxvY2spOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBuczgzODIwX2NsZWFudXBfcngoc3RydWN0IG5zODM4MjAgKmRldikKK3sKKwl1bnNpZ25lZCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkcHJpbnRrKCJuczgzODIwX2NsZWFudXBfcngoJXApXG4iLCBkZXYpOworCisJLyogZGlzYWJsZSByZWNlaXZlIGludGVycnVwdHMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5taXNjX2xvY2ssIGZsYWdzKTsKKwlkZXYtPklNUl9jYWNoZSAmPSB+KElTUl9SWE9LIHwgSVNSX1JYREVTQyB8IElTUl9SWEVSUiB8IElTUl9SWEVBUkxZIHwgSVNSX1JYSURMRSk7CisJd3JpdGVsKGRldi0+SU1SX2NhY2hlLCBkZXYtPmJhc2UgKyBJTVIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bWlzY19sb2NrLCBmbGFncyk7CisKKwkvKiBzeW5jaHJvbml6ZSB3aXRoIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBhbmQga2lsbCBpdCAqLworCWRldi0+cnhfaW5mby51cCA9IDA7CisJc3luY2hyb25pemVfaXJxKGRldi0+cGNpX2Rldi0+aXJxKTsKKworCS8qIHRvdWNoIHRoZSBwY2kgYnVzLi4uICovCisJcmVhZGwoZGV2LT5iYXNlICsgSU1SKTsKKworCS8qIGFzc3VtZXMgdGhlIHRyYW5zbWl0dGVyIGlzIGFscmVhZHkgZGlzYWJsZWQgYW5kIHJlc2V0ICovCisJd3JpdGVsKDAsIGRldi0+YmFzZSArIFJYRFBfSEkpOworCXdyaXRlbCgwLCBkZXYtPmJhc2UgKyBSWERQKTsKKworCWZvciAoaT0wOyBpPE5SX1JYX0RFU0M7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2LT5yeF9pbmZvLnNrYnNbaV07CisJCWRldi0+cnhfaW5mby5za2JzW2ldID0gTlVMTDsKKwkJY2xlYXJfcnhfZGVzYyhkZXYsIGkpOworCQlpZiAoc2tiKQorCQkJa2ZyZWVfc2tiKHNrYik7CisJfQorfQorCitzdGF0aWMgdm9pZCBGQVNUQ0FMTChuczgzODIwX3J4X2tpY2soc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpKTsKK3N0YXRpYyB2b2lkIGZhc3RjYWxsIG5zODM4MjBfcnhfa2ljayhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgbnM4MzgyMCAqZGV2ID0gUFJJVihuZGV2KTsKKwkvKmlmIChucl9yeF9lbXB0eShkZXYpID49IE5SX1JYX0RFU0MvNCkqLyB7CisJCWlmIChkZXYtPnJ4X2luZm8udXApIHsKKwkJCXJ4X3JlZmlsbF9hdG9taWMobmRldik7CisJCQlraWNrX3J4KG5kZXYpOworCQl9CisJfQorCisJaWYgKGRldi0+cnhfaW5mby51cCAmJiBucl9yeF9lbXB0eShkZXYpID4gTlJfUlhfREVTQyozLzQpCisJCXNjaGVkdWxlX3dvcmsoJmRldi0+dHFfcmVmaWxsKTsKKwllbHNlCisJCWtpY2tfcngobmRldik7CisJaWYgKGRldi0+cnhfaW5mby5pZGxlKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEJBRFxuIiwgbmRldi0+bmFtZSk7Cit9CisKKy8qIHJ4X2lycQorICoJCisgKi8KK3N0YXRpYyB2b2lkIEZBU1RDQUxMKHJ4X2lycShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikpOworc3RhdGljIHZvaWQgZmFzdGNhbGwgcnhfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOworCXN0cnVjdCByeF9pbmZvICppbmZvID0gJmRldi0+cnhfaW5mbzsKKwl1bnNpZ25lZCBuZXh0X3J4OworCWludCByeF9yYywgbGVuOworCXUzMiBjbWRzdHMsICpkZXNjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG5yID0gMDsKKworCWRwcmludGsoInJ4X2lycSglcClcbiIsIG5kZXYpOworCWRwcmludGsoInJ4ZHA6ICUwOHgsIGRlc2NzOiAlMDhseCBuZXh0X3J4WyVkXTogJXAgbmV4dF9lbXB0eVslZF06ICVwXG4iLAorCQlyZWFkbChkZXYtPmJhc2UgKyBSWERQKSwKKwkJKGxvbmcpKGRldi0+cnhfaW5mby5waHlfZGVzY3MpLAorCQkoaW50KWRldi0+cnhfaW5mby5uZXh0X3J4LAorCQkoZGV2LT5yeF9pbmZvLmRlc2NzICsgKERFU0NfU0laRSAqIGRldi0+cnhfaW5mby5uZXh0X3J4KSksCisJCShpbnQpZGV2LT5yeF9pbmZvLm5leHRfZW1wdHksCisJCShkZXYtPnJ4X2luZm8uZGVzY3MgKyAoREVTQ19TSVpFICogZGV2LT5yeF9pbmZvLm5leHRfZW1wdHkpKQorCQkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlpZiAoIWluZm8tPnVwKQorCQlnb3RvIG91dDsKKworCWRwcmludGsoIndhbGtpbmcgZGVzY3NcbiIpOworCW5leHRfcnggPSBpbmZvLT5uZXh0X3J4OworCWRlc2MgPSBpbmZvLT5uZXh0X3J4X2Rlc2M7CisJd2hpbGUgKChDTURTVFNfT1dOICYgKGNtZHN0cyA9IGxlMzJfdG9fY3B1KGRlc2NbREVTQ19DTURTVFNdKSkpICYmCisJICAgICAgIChjbWRzdHMgIT0gQ01EU1RTX09XTikpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdTMyIGV4dHN0cyA9IGxlMzJfdG9fY3B1KGRlc2NbREVTQ19FWFRTVFNdKTsKKwkJZG1hX2FkZHJfdCBidWZwdHIgPSBkZXNjX2FkZHJfZ2V0KGRlc2MgKyBERVNDX0JVRlBUUik7CisKKwkJZHByaW50aygiY21kc3RzOiAlMDh4XG4iLCBjbWRzdHMpOworCQlkcHJpbnRrKCJsaW5rOiAlMDh4XG4iLCBjcHVfdG9fbGUzMihkZXNjW0RFU0NfTElOS10pKTsKKwkJZHByaW50aygiZXh0c3RzOiAlMDh4XG4iLCBleHRzdHMpOworCisJCXNrYiA9IGluZm8tPnNrYnNbbmV4dF9yeF07CisJCWluZm8tPnNrYnNbbmV4dF9yeF0gPSBOVUxMOworCQlpbmZvLT5uZXh0X3J4ID0gKG5leHRfcnggKyAxKSAlIE5SX1JYX0RFU0M7CisKKwkJbWIoKTsKKwkJY2xlYXJfcnhfZGVzYyhkZXYsIG5leHRfcngpOworCisJCXBjaV91bm1hcF9zaW5nbGUoZGV2LT5wY2lfZGV2LCBidWZwdHIsCisJCQkJIFJYX0JVRl9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlsZW4gPSBjbWRzdHMgJiBDTURTVFNfTEVOX01BU0s7CisjaWZkZWYgTlM4MzgyMF9WTEFOX0FDQ0VMX1NVUFBPUlQKKwkJLyogTkg6IEFzIHdhcyBtZW50aW9uZWQgYmVsb3csIHRoaXMgY2hpcCBpcyBraW5kYQorCQkgKiBicmFpbiBkZWFkIGFib3V0IHZsYW4gdGFnIHN0cmlwcGluZy4gIEZyYW1lcworCQkgKiB0aGF0IGFyZSA2NCBieXRlcyB3aXRoIGEgdmxhbiBoZWFkZXIgYXBwZW5kZWQKKwkJICogbGlrZSBhcnAgZnJhbWVzLCBvciBwaW5ncywgYXJlIGZsYWdnZWQgYXMgUnVudHMKKwkJICogd2hlbiB0aGUgdGFnIGlzIHN0cmlwcGVkIGFuZCBoYXJkd2FyZS4gIFRoaXMKKwkJICogYWxzbyBtZWFucyB0aGF0IHRoZSBPSyBiaXQgaW4gdGhlIGRlc2NyaXB0b3IgCisJCSAqIGlzIGNsZWFyZWQgd2hlbiB0aGUgZnJhbWUgY29tZXMgaW4gc28gd2UgaGF2ZQorCQkgKiB0byBkbyBhIHNwZWNpZmljIGxlbmd0aCBjaGVjayBoZXJlIHRvIG1ha2Ugc3VyZQorCQkgKiB0aGUgZnJhbWUgd291bGQgaGF2ZSBiZWVuIG9rLCBoYWQgd2Ugbm90IHN0cmlwcGVkCisJCSAqIHRoZSB0YWcuCisJCSAqLyAKKwkJaWYgKGxpa2VseSgoQ01EU1RTX09LICYgY21kc3RzKSB8fAorCQkJKChjbWRzdHMgJiBDTURTVFNfUlVOVCkgJiYgbGVuID49IDU2KSkpIHsgICAKKyNlbHNlCisJCWlmIChsaWtlbHkoQ01EU1RTX09LICYgY21kc3RzKSkgeworI2VuZGlmCisJCQlza2JfcHV0KHNrYiwgbGVuKTsKKwkJCWlmICh1bmxpa2VseSghc2tiKSkKKwkJCQlnb3RvIG5ldGRldl9tYW5nbGVfbWVfaGFyZGVyX2ZhaWxlZDsKKwkJCWlmIChjbWRzdHMgJiBDTURTVFNfREVTVF9NVUxUSSkKKwkJCQlkZXYtPnN0YXRzLm11bHRpY2FzdCArKzsKKwkJCWRldi0+c3RhdHMucnhfcGFja2V0cyArKzsKKwkJCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQkJaWYgKChleHRzdHMgJiAweDAwMmEwMDAwKSAmJiAhKGV4dHN0cyAmIDB4MDA1NDAwMDApKSB7CisJCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJCX0gZWxzZSB7CisJCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQkJfQorCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmRldik7CisjaWZkZWYgTlM4MzgyMF9WTEFOX0FDQ0VMX1NVUFBPUlQgCisJCQlpZihleHRzdHMgJiBFWFRTVFNfVlBLVCkgeworCQkJCXVuc2lnbmVkIHNob3J0IHRhZzsKKwkJCQl0YWcgPSBudG9ocyhleHRzdHMgJiBFWFRTVFNfVlRHX01BU0spOworCQkJCXJ4X3JjID0gdmxhbl9od2FjY2VsX3J4KHNrYixkZXYtPnZsZ3JwLHRhZyk7CisJCQl9IGVsc2UgeworCQkJCXJ4X3JjID0gbmV0aWZfcngoc2tiKTsKKwkJCX0KKyNlbHNlCisJCQlyeF9yYyA9IG5ldGlmX3J4KHNrYik7CisjZW5kaWYKKwkJCWlmIChORVRfUlhfRFJPUCA9PSByeF9yYykgeworbmV0ZGV2X21hbmdsZV9tZV9oYXJkZXJfZmFpbGVkOgorCQkJCWRldi0+c3RhdHMucnhfZHJvcHBlZCArKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWtmcmVlX3NrYihza2IpOworCQl9CisKKwkJbnIrKzsKKwkJbmV4dF9yeCA9IGluZm8tPm5leHRfcng7CisJCWRlc2MgPSBpbmZvLT5kZXNjcyArIChERVNDX1NJWkUgKiBuZXh0X3J4KTsKKwl9CisJaW5mby0+bmV4dF9yeCA9IG5leHRfcng7CisJaW5mby0+bmV4dF9yeF9kZXNjID0gaW5mby0+ZGVzY3MgKyAoREVTQ19TSVpFICogbmV4dF9yeCk7CisKK291dDoKKwlpZiAoMCAmJiAhbnIpIHsKKwkJRHByaW50aygiZGF6ZWQ6IGNtZHN0c19mOiAlMDh4XG4iLCBjbWRzdHMpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcnhfYWN0aW9uKHVuc2lnbmVkIGxvbmcgX2RldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9ICh2b2lkICopX2RldjsKKwlzdHJ1Y3QgbnM4MzgyMCAqZGV2ID0gUFJJVihuZGV2KTsKKwlyeF9pcnEobmRldik7CisJd3JpdGVsKGlociwgZGV2LT5iYXNlICsgSUhSKTsKKworCXNwaW5fbG9ja19pcnEoJmRldi0+bWlzY19sb2NrKTsKKwlkZXYtPklNUl9jYWNoZSB8PSBJU1JfUlhERVNDOworCXdyaXRlbChkZXYtPklNUl9jYWNoZSwgZGV2LT5iYXNlICsgSU1SKTsKKwlzcGluX3VubG9ja19pcnEoJmRldi0+bWlzY19sb2NrKTsKKworCXJ4X2lycShuZGV2KTsKKwluczgzODIwX3J4X2tpY2sobmRldik7Cit9CisKKy8qIFBhY2tldCBUcmFuc21pdCBjb2RlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBraWNrX3R4KHN0cnVjdCBuczgzODIwICpkZXYpCit7CisJZHByaW50aygia2lja190eCglcCk6IHR4X2lkeD0lZCBmcmVlX2lkeD0lZFxuIiwKKwkJZGV2LCBkZXYtPnR4X2lkeCwgZGV2LT50eF9mcmVlX2lkeCk7CisJd3JpdGVsKENSX1RYRSwgZGV2LT5iYXNlICsgQ1IpOworfQorCisvKiBObyBzcGlubG9jayBuZWVkZWQgb24gdGhlIHRyYW5zbWl0IGlycSBwYXRoIGFzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBpcworICogc2VyaWFsaXplZC4KKyAqLworc3RhdGljIHZvaWQgZG9fdHhfZG9uZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgbnM4MzgyMCAqZGV2ID0gUFJJVihuZGV2KTsKKwl1MzIgY21kc3RzLCB0eF9kb25lX2lkeCwgKmRlc2M7CisKKwlzcGluX2xvY2tfaXJxKCZkZXYtPnR4X2xvY2spOworCisJZHByaW50aygiZG9fdHhfZG9uZSglcClcbiIsIG5kZXYpOworCXR4X2RvbmVfaWR4ID0gZGV2LT50eF9kb25lX2lkeDsKKwlkZXNjID0gZGV2LT50eF9kZXNjcyArICh0eF9kb25lX2lkeCAqIERFU0NfU0laRSk7CisKKwlkcHJpbnRrKCJ0eF9kb25lX2lkeD0lZCBmcmVlX2lkeD0lZCBjbWRzdHM9JTA4eFxuIiwKKwkJdHhfZG9uZV9pZHgsIGRldi0+dHhfZnJlZV9pZHgsIGxlMzJfdG9fY3B1KGRlc2NbREVTQ19DTURTVFNdKSk7CisJd2hpbGUgKCh0eF9kb25lX2lkeCAhPSBkZXYtPnR4X2ZyZWVfaWR4KSAmJgorCSAgICAgICAhKENNRFNUU19PV04gJiAoY21kc3RzID0gbGUzMl90b19jcHUoZGVzY1tERVNDX0NNRFNUU10pKSkgKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXVuc2lnbmVkIGxlbjsKKwkJZG1hX2FkZHJfdCBhZGRyOworCisJCWlmIChjbWRzdHMgJiBDTURTVFNfRVJSKQorCQkJZGV2LT5zdGF0cy50eF9lcnJvcnMgKys7CisJCWlmIChjbWRzdHMgJiBDTURTVFNfT0spCisJCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMgKys7CisJCWlmIChjbWRzdHMgJiBDTURTVFNfT0spCisJCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IGNtZHN0cyAmIDB4ZmZmZjsKKworCQlkcHJpbnRrKCJ0eF9kb25lX2lkeD0lZCBmcmVlX2lkeD0lZCBjbWRzdHM9JTA4eFxuIiwKKwkJCXR4X2RvbmVfaWR4LCBkZXYtPnR4X2ZyZWVfaWR4LCBjbWRzdHMpOworCQlza2IgPSBkZXYtPnR4X3NrYnNbdHhfZG9uZV9pZHhdOworCQlkZXYtPnR4X3NrYnNbdHhfZG9uZV9pZHhdID0gTlVMTDsKKwkJZHByaW50aygiZG9uZSglcClcbiIsIHNrYik7CisKKwkJbGVuID0gY21kc3RzICYgQ01EU1RTX0xFTl9NQVNLOworCQlhZGRyID0gZGVzY19hZGRyX2dldChkZXNjICsgREVTQ19CVUZQVFIpOworCQlpZiAoc2tiKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKGRldi0+cGNpX2RldiwKKwkJCQkJYWRkciwKKwkJCQkJbGVuLAorCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQlhdG9taWNfZGVjKCZkZXYtPm5yX3R4X3NrYnMpOworCQl9IGVsc2UKKwkJCXBjaV91bm1hcF9wYWdlKGRldi0+cGNpX2RldiwgCisJCQkJCWFkZHIsCisJCQkJCWxlbiwKKwkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisKKwkJdHhfZG9uZV9pZHggPSAodHhfZG9uZV9pZHggKyAxKSAlIE5SX1RYX0RFU0M7CisJCWRldi0+dHhfZG9uZV9pZHggPSB0eF9kb25lX2lkeDsKKwkJZGVzY1tERVNDX0NNRFNUU10gPSBjcHVfdG9fbGUzMigwKTsKKwkJbWIoKTsKKwkJZGVzYyA9IGRldi0+dHhfZGVzY3MgKyAodHhfZG9uZV9pZHggKiBERVNDX1NJWkUpOworCX0KKworCS8qIEFsbG93IG5ldHdvcmsgc3RhY2sgdG8gcmVzdW1lIHF1ZXVlaW5nIHBhY2tldHMgYWZ0ZXIgd2UndmUKKwkgKiBmaW5pc2hlZCB0cmFuc21pdHRpbmcgYXQgbGVhc3QgMS80IG9mIHRoZSBwYWNrZXRzIGluIHRoZSBxdWV1ZS4KKwkgKi8KKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChuZGV2KSAmJiBzdGFydF90eF9va2F5KGRldikpIHsKKwkJZHByaW50aygic3RhcnRfcXVldWUoJXApXG4iLCBuZGV2KTsKKwkJbmV0aWZfc3RhcnRfcXVldWUobmRldik7CisJCW5ldGlmX3dha2VfcXVldWUobmRldik7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmZGV2LT50eF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgbnM4MzgyMF9jbGVhbnVwX3R4KHN0cnVjdCBuczgzODIwICpkZXYpCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaT0wOyBpPE5SX1RYX0RFU0M7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2LT50eF9za2JzW2ldOworCQlkZXYtPnR4X3NrYnNbaV0gPSBOVUxMOworCQlpZiAoc2tiKSB7CisJCQl1MzIgKmRlc2MgPSBkZXYtPnR4X2Rlc2NzICsgKGkgKiBERVNDX1NJWkUpOworCQkJcGNpX3VubWFwX3NpbmdsZShkZXYtPnBjaV9kZXYsCisJCQkJCWRlc2NfYWRkcl9nZXQoZGVzYyArIERFU0NfQlVGUFRSKSwKKwkJCQkJbGUzMl90b19jcHUoZGVzY1tERVNDX0NNRFNUU10pICYgQ01EU1RTX0xFTl9NQVNLLAorCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQlhdG9taWNfZGVjKCZkZXYtPm5yX3R4X3NrYnMpOworCQl9CisJfQorCisJbWVtc2V0KGRldi0+dHhfZGVzY3MsIDAsIE5SX1RYX0RFU0MgKiBERVNDX1NJWkUgKiA0KTsKK30KKworLyogdHJhbnNtaXQgcm91dGluZS4gIFRoaXMgY29kZSByZWxpZXMgb24gdGhlIG5ldHdvcmsgbGF5ZXIgc2VyaWFsaXppbmcKKyAqIGl0cyBjYWxscyBpbiwgYnV0IHdpbGwgcnVuIGhhcHBpbHkgaW4gcGFyYWxsZWwgd2l0aCB0aGUgaW50ZXJydXB0CisgKiBoYW5kbGVyLiAgVGhpcyBjb2RlIGN1cnJlbnRseSBoYXMgcHJvdmlzaW9ucyBmb3IgZnJhZ21lbnRpbmcgdHggYnVmZmVycworICogd2hpbGUgdHJ5aW5nIHRvIHRyYWNrIGRvd24gYSBidWcgaW4gZWl0aGVyIHRoZSB6ZXJvIGNvcHkgY29kZSBvcgorICogdGhlIHR4IGZpZm8gKGhlbmNlIHRoZSBNQVhfRlJBR19MRU4pLgorICovCitzdGF0aWMgaW50IG5zODM4MjBfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOworCXUzMiBmcmVlX2lkeCwgY21kc3RzLCBleHRzdHM7CisJaW50IG5yX2ZyZWUsIG5yX2ZyYWdzOworCXVuc2lnbmVkIHR4X2RvbmVfaWR4LCBsYXN0X2lkeDsKKwlkbWFfYWRkcl90IGJ1ZjsKKwl1bnNpZ25lZCBsZW47CisJc2tiX2ZyYWdfdCAqZnJhZzsKKwlpbnQgc3RvcHBlZCA9IDA7CisJaW50IGRvX2ludHIgPSAwOworCXZvbGF0aWxlIHUzMiAqZmlyc3RfZGVzYzsKKworCWRwcmludGsoIm5zODM4MjBfaGFyZF9zdGFydF94bWl0XG4iKTsKKworCW5yX2ZyYWdzID0gIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CithZ2FpbjoKKwlpZiAodW5saWtlbHkoZGV2LT5DRkdfY2FjaGUgJiBDRkdfTE5LU1RTKSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCQlpZiAodW5saWtlbHkoZGV2LT5DRkdfY2FjaGUgJiBDRkdfTE5LU1RTKSkKKwkJCXJldHVybiAxOworCQluZXRpZl9zdGFydF9xdWV1ZShuZGV2KTsKKwl9CisKKwlsYXN0X2lkeCA9IGZyZWVfaWR4ID0gZGV2LT50eF9mcmVlX2lkeDsKKwl0eF9kb25lX2lkeCA9IGRldi0+dHhfZG9uZV9pZHg7CisJbnJfZnJlZSA9ICh0eF9kb25lX2lkeCArIE5SX1RYX0RFU0MtMiAtIGZyZWVfaWR4KSAlIE5SX1RYX0RFU0M7CisJbnJfZnJlZSAtPSAxOworCWlmIChucl9mcmVlIDw9IG5yX2ZyYWdzKSB7CisJCWRwcmludGsoInN0b3BfcXVldWUgLSBub3QgZW5vdWdoKCVwKVxuIiwgbmRldik7CisJCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisKKwkJLyogQ2hlY2sgYWdhaW46IHdlIG1heSBoYXZlIHJhY2VkIHdpdGggYSB0eCBkb25lIGlycSAqLworCQlpZiAoZGV2LT50eF9kb25lX2lkeCAhPSB0eF9kb25lX2lkeCkgeworCQkJZHByaW50aygicmVzdGFydCBxdWV1ZSglcClcbiIsIG5kZXYpOworCQkJbmV0aWZfc3RhcnRfcXVldWUobmRldik7CisJCQlnb3RvIGFnYWluOworCQl9CisJCXJldHVybiAxOworCX0KKworCWlmIChmcmVlX2lkeCA9PSBkZXYtPnR4X2ludHJfaWR4KSB7CisJCWRvX2ludHIgPSAxOworCQlkZXYtPnR4X2ludHJfaWR4ID0gKGRldi0+dHhfaW50cl9pZHggKyBOUl9UWF9ERVNDLzQpICUgTlJfVFhfREVTQzsKKwl9CisKKwlucl9mcmVlIC09IG5yX2ZyYWdzOworCWlmIChucl9mcmVlIDwgTUlOX1RYX0RFU0NfRlJFRSkgeworCQlkcHJpbnRrKCJzdG9wX3F1ZXVlIC0gbGFzdCBlbnRyeSglcClcbiIsIG5kZXYpOworCQluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCQlzdG9wcGVkID0gMTsKKwl9CisKKwlmcmFnID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnczsKKwlpZiAoIW5yX2ZyYWdzKQorCQlmcmFnID0gTlVMTDsKKwlleHRzdHMgPSAwOworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQlleHRzdHMgfD0gRVhUU1RTX0lQUEtUOworCQlpZiAoSVBQUk9UT19UQ1AgPT0gc2tiLT5uaC5pcGgtPnByb3RvY29sKQorCQkJZXh0c3RzIHw9IEVYVFNUU19UQ1BQS1Q7CisJCWVsc2UgaWYgKElQUFJPVE9fVURQID09IHNrYi0+bmguaXBoLT5wcm90b2NvbCkKKwkJCWV4dHN0cyB8PSBFWFRTVFNfVURQUEtUOworCX0KKworI2lmZGVmIE5TODM4MjBfVkxBTl9BQ0NFTF9TVVBQT1JUCisJaWYodmxhbl90eF90YWdfcHJlc2VudChza2IpKSB7CisJCS8qIGZldGNoIHRoZSB2bGFuIHRhZyBpbmZvIG91dCBvZiB0aGUKKwkJICogYW5jaWxsaWFyeSBkYXRhIGlmIHRoZSB2bGFuIGNvZGUKKwkJICogaXMgdXNpbmcgaHcgdmxhbiBhY2NlbGVyYXRpb24KKwkJICovCisJCXNob3J0IHRhZyA9IHZsYW5fdHhfdGFnX2dldChza2IpOworCQlleHRzdHMgfD0gKEVYVFNUU19WUEtUIHwgaHRvbnModGFnKSk7CisJfQorI2VuZGlmCisKKwlsZW4gPSBza2ItPmxlbjsKKwlpZiAobnJfZnJhZ3MpCisJCWxlbiAtPSBza2ItPmRhdGFfbGVuOworCWJ1ZiA9IHBjaV9tYXBfc2luZ2xlKGRldi0+cGNpX2Rldiwgc2tiLT5kYXRhLCBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJZmlyc3RfZGVzYyA9IGRldi0+dHhfZGVzY3MgKyAoZnJlZV9pZHggKiBERVNDX1NJWkUpOworCisJZm9yICg7OykgeworCQl2b2xhdGlsZSB1MzIgKmRlc2MgPSBkZXYtPnR4X2Rlc2NzICsgKGZyZWVfaWR4ICogREVTQ19TSVpFKTsKKwkJdTMyIHJlc2lkdWUgPSAwOworCisJCWRwcmludGsoImZyYWdbJTN1XTogJTR1IEAgMHglMDhMeFxuIiwgZnJlZV9pZHgsIGxlbiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYnVmKTsKKwkJbGFzdF9pZHggPSBmcmVlX2lkeDsKKwkJZnJlZV9pZHggPSAoZnJlZV9pZHggKyAxKSAlIE5SX1RYX0RFU0M7CisJCWRlc2NbREVTQ19MSU5LXSA9IGNwdV90b19sZTMyKGRldi0+dHhfcGh5X2Rlc2NzICsgKGZyZWVfaWR4ICogREVTQ19TSVpFICogNCkpOworCQlkZXNjX2FkZHJfc2V0KGRlc2MgKyBERVNDX0JVRlBUUiwgYnVmKTsKKwkJZGVzY1tERVNDX0VYVFNUU10gPSBjcHVfdG9fbGUzMihleHRzdHMpOworCisJCWNtZHN0cyA9ICgobnJfZnJhZ3N8cmVzaWR1ZSkgPyBDTURTVFNfTU9SRSA6IGRvX2ludHIgPyBDTURTVFNfSU5UUiA6IDApOworCQljbWRzdHMgfD0gKGRlc2MgPT0gZmlyc3RfZGVzYykgPyAwIDogQ01EU1RTX09XTjsKKwkJY21kc3RzIHw9IGxlbjsKKwkJZGVzY1tERVNDX0NNRFNUU10gPSBjcHVfdG9fbGUzMihjbWRzdHMpOworCisJCWlmIChyZXNpZHVlKSB7CisJCQlidWYgKz0gbGVuOworCQkJbGVuID0gcmVzaWR1ZTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFucl9mcmFncykKKwkJCWJyZWFrOworCisJCWJ1ZiA9IHBjaV9tYXBfcGFnZShkZXYtPnBjaV9kZXYsIGZyYWctPnBhZ2UsCisJCQkJICAgZnJhZy0+cGFnZV9vZmZzZXQsCisJCQkJICAgZnJhZy0+c2l6ZSwgUENJX0RNQV9UT0RFVklDRSk7CisJCWRwcmludGsoImZyYWc6IGJ1Zj0lMDhMeCAgcGFnZT0lMDhseCBvZmZzZXQ9JTA4bHhcbiIsCisJCQkobG9uZyBsb25nKWJ1ZiwgKGxvbmcpIHBhZ2VfdG9fcGZuKGZyYWctPnBhZ2UpLAorCQkJZnJhZy0+cGFnZV9vZmZzZXQpOworCQlsZW4gPSBmcmFnLT5zaXplOworCQlmcmFnKys7CisJCW5yX2ZyYWdzLS07CisJfQorCWRwcmludGsoImRvbmUgcGt0XG4iKTsKKworCXNwaW5fbG9ja19pcnEoJmRldi0+dHhfbG9jayk7CisJZGV2LT50eF9za2JzW2xhc3RfaWR4XSA9IHNrYjsKKwlmaXJzdF9kZXNjW0RFU0NfQ01EU1RTXSB8PSBjcHVfdG9fbGUzMihDTURTVFNfT1dOKTsKKwlkZXYtPnR4X2ZyZWVfaWR4ID0gZnJlZV9pZHg7CisJYXRvbWljX2luYygmZGV2LT5ucl90eF9za2JzKTsKKwlzcGluX3VubG9ja19pcnEoJmRldi0+dHhfbG9jayk7CisKKwlraWNrX3R4KGRldik7CisKKwkvKiBDaGVjayBhZ2Fpbjogd2UgbWF5IGhhdmUgcmFjZWQgd2l0aCBhIHR4IGRvbmUgaXJxICovCisJaWYgKHN0b3BwZWQgJiYgKGRldi0+dHhfZG9uZV9pZHggIT0gdHhfZG9uZV9pZHgpICYmIHN0YXJ0X3R4X29rYXkoZGV2KSkKKwkJbmV0aWZfc3RhcnRfcXVldWUobmRldik7CisKKwkvKiBzZXQgdGhlIHRyYW5zbWl0IHN0YXJ0IHRpbWUgdG8gY2F0Y2ggdHJhbnNtaXQgdGltZW91dHMgKi8KKwluZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5zODM4MjBfdXBkYXRlX3N0YXRzKHN0cnVjdCBuczgzODIwICpkZXYpCit7CisJdTggX19pb21lbSAqYmFzZSA9IGRldi0+YmFzZTsKKworCS8qIHRoZSBEUDgzODIwIHdpbGwgZnJlZXplIGNvdW50ZXJzLCBzbyB3ZSBuZWVkIHRvIHJlYWQgYWxsIG9mIHRoZW0gKi8KKwlkZXYtPnN0YXRzLnJ4X2Vycm9ycwkJKz0gcmVhZGwoYmFzZSArIDB4NjApICYgMHhmZmZmOworCWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycwkrPSByZWFkbChiYXNlICsgMHg2NCkgJiAweGZmZmY7CisJZGV2LT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzCSs9IHJlYWRsKGJhc2UgKyAweDY4KSAmIDB4ZmZmZjsKKwlkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycwkrPSByZWFkbChiYXNlICsgMHg2YykgJiAweGZmZmY7CisJLypkZXYtPnN0YXRzLnJ4X3N5bWJvbF9lcnJvcnMgKz0qLyByZWFkbChiYXNlICsgMHg3MCk7CisJZGV2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzCSs9IHJlYWRsKGJhc2UgKyAweDc0KSAmIDB4ZmZmZjsKKwlkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMJKz0gcmVhZGwoYmFzZSArIDB4NzgpICYgMHhmZmZmOworCS8qZGV2LT5zdGF0cy5yeF9iYWRvcGNvZGVfZXJyb3JzICs9ICovIHJlYWRsKGJhc2UgKyAweDdjKTsKKwkvKmRldi0+c3RhdHMucnhfcGF1c2VfY291bnQgKz0gKi8gIHJlYWRsKGJhc2UgKyAweDgwKTsKKwkvKmRldi0+c3RhdHMudHhfcGF1c2VfY291bnQgKz0gKi8gIHJlYWRsKGJhc2UgKyAweDg0KTsKKwlkZXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzCSs9IHJlYWRsKGJhc2UgKyAweDg4KSAmIDB4ZmY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbnM4MzgyMF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IG5zODM4MjAgKmRldiA9IFBSSVYobmRldik7CisKKwkvKiBzb21ld2hhdCBvdmVya2lsbCAqLworCXNwaW5fbG9ja19pcnEoJmRldi0+bWlzY19sb2NrKTsKKwluczgzODIwX3VwZGF0ZV9zdGF0cyhkZXYpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5taXNjX2xvY2spOworCisJcmV0dXJuICZkZXYtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCBuczgzODIwX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOworCXN0cmNweShpbmZvLT5kcml2ZXIsICJuczgzODIwIik7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIFZFUlNJT04pOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoZGV2LT5wY2lfZGV2KSk7Cit9CisKK3N0YXRpYyB1MzIgbnM4MzgyMF9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgbnM4MzgyMCAqZGV2ID0gUFJJVihuZGV2KTsKKwl1MzIgY2ZnID0gcmVhZGwoZGV2LT5iYXNlICsgQ0ZHKSBeIFNQRFNUU19QT0xBUklUWTsKKwlyZXR1cm4gY2ZnICYgQ0ZHX0xOS1NUUyA/IDEgOiAwOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG9wcyA9IHsKKwkuZ2V0X2RydmluZm8gPSBuczgzODIwX2dldF9kcnZpbmZvLAorCS5nZXRfbGluayA9IG5zODM4MjBfZ2V0X2xpbmsKK307CisKK3N0YXRpYyB2b2lkIG5zODM4MjBfbWliX2lzcihzdHJ1Y3QgbnM4MzgyMCAqZGV2KQoreworCXNwaW5fbG9jaygmZGV2LT5taXNjX2xvY2spOworCW5zODM4MjBfdXBkYXRlX3N0YXRzKGRldik7CisJc3Bpbl91bmxvY2soJmRldi0+bWlzY19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgbnM4MzgyMF9kb19pc3Ioc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHUzMiBpc3IpOworc3RhdGljIGlycXJldHVybl90IG5zODM4MjBfaXJxKGludCBmb28sIHZvaWQgKmRhdGEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgbnM4MzgyMCAqZGV2ID0gUFJJVihuZGV2KTsKKwl1MzIgaXNyOworCWRwcmludGsoIm5zODM4MjBfaXJxKCVwKVxuIiwgbmRldik7CisKKwlkZXYtPmlociA9IDA7CisKKwlpc3IgPSByZWFkbChkZXYtPmJhc2UgKyBJU1IpOworCWRwcmludGsoImlycTogJTA4eFxuIiwgaXNyKTsKKwluczgzODIwX2RvX2lzcihuZGV2LCBpc3IpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgbnM4MzgyMF9kb19pc3Ioc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHUzMiBpc3IpCit7CisJc3RydWN0IG5zODM4MjAgKmRldiA9IFBSSVYobmRldik7CisjaWZkZWYgREVCVUcKKwlpZiAoaXNyICYgfihJU1JfUEhZIHwgSVNSX1JYREVTQyB8IElTUl9SWEVBUkxZIHwgSVNSX1JYT0sgfCBJU1JfUlhFUlIgfCBJU1JfVFhJRExFIHwgSVNSX1RYT0sgfCBJU1JfVFhERVNDKSkKKwkJRHByaW50aygib2RkIGlzcj8gMHglMDh4XG4iLCBpc3IpOworI2VuZGlmCisKKwlpZiAoSVNSX1JYSURMRSAmIGlzcikgeworCQlkZXYtPnJ4X2luZm8uaWRsZSA9IDE7CisJCURwcmludGsoIm9oIGRlYXIsIHdlIGFyZSBpZGxlXG4iKTsKKwkJbnM4MzgyMF9yeF9raWNrKG5kZXYpOworCX0KKworCWlmICgoSVNSX1JYREVTQyB8IElTUl9SWE9LKSAmIGlzcikgeworCQlwcmVmZXRjaChkZXYtPnJ4X2luZm8ubmV4dF9yeF9kZXNjKTsKKworCQlzcGluX2xvY2tfaXJxKCZkZXYtPm1pc2NfbG9jayk7CisJCWRldi0+SU1SX2NhY2hlICY9IH4oSVNSX1JYREVTQyB8IElTUl9SWE9LKTsKKwkJd3JpdGVsKGRldi0+SU1SX2NhY2hlLCBkZXYtPmJhc2UgKyBJTVIpOworCQlzcGluX3VubG9ja19pcnEoJmRldi0+bWlzY19sb2NrKTsKKworCQl0YXNrbGV0X3NjaGVkdWxlKCZkZXYtPnJ4X3Rhc2tsZXQpOworCQkvL3J4X2lycShuZGV2KTsKKwkJLy93cml0ZWwoNCwgZGV2LT5iYXNlICsgSUhSKTsKKwl9CisKKwlpZiAoKElTUl9SWElETEUgfCBJU1JfUlhPUk4gfCBJU1JfUlhERVNDIHwgSVNSX1JYT0sgfCBJU1JfUlhFUlIpICYgaXNyKQorCQluczgzODIwX3J4X2tpY2sobmRldik7CisKKwlpZiAodW5saWtlbHkoSVNSX1JYU09WUiAmIGlzcikpIHsKKwkJLy9wcmludGsoIm92ZXJydW46IHJ4c292clxuIik7CisJCWRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMgKys7CisJfQorCisJaWYgKHVubGlrZWx5KElTUl9SWE9STiAmIGlzcikpIHsKKwkJLy9wcmludGsoIm92ZXJydW46IHJ4b3JuXG4iKTsKKwkJZGV2LT5zdGF0cy5yeF9maWZvX2Vycm9ycyArKzsKKwl9CisKKwlpZiAoKElTUl9SWFJDTVAgJiBpc3IpICYmIGRldi0+cnhfaW5mby51cCkKKwkJd3JpdGVsKENSX1JYRSwgZGV2LT5iYXNlICsgQ1IpOworCisJaWYgKElTUl9UWElETEUgJiBpc3IpIHsKKwkJdTMyIHR4ZHA7CisJCXR4ZHAgPSByZWFkbChkZXYtPmJhc2UgKyBUWERQKTsKKwkJZHByaW50aygidHhkcDogJTA4eFxuIiwgdHhkcCk7CisJCXR4ZHAgLT0gZGV2LT50eF9waHlfZGVzY3M7CisJCWRldi0+dHhfaWR4ID0gdHhkcCAvIChERVNDX1NJWkUgKiA0KTsKKwkJaWYgKGRldi0+dHhfaWR4ID49IE5SX1RYX0RFU0MpIHsKKwkJCXByaW50ayhLRVJOX0FMRVJUICIlczogQlVHIC0tIHR4ZHAgb3V0IG9mIHJhbmdlXG4iLCBuZGV2LT5uYW1lKTsKKwkJCWRldi0+dHhfaWR4ID0gMDsKKwkJfQorCQkvKiBUaGUgbWF5IGhhdmUgYmVlbiBhIHJhY2UgYmV0d2VlbiBhIHBjaSBvcmlnaW5hdGVkIHJlYWQKKwkJICogYW5kIHRoZSBkZXNjcmlwdG9yIHVwZGF0ZSBmcm9tIHRoZSBjcHUuICBKdXN0IGluIGNhc2UsIAorCQkgKiBraWNrIHRoZSB0cmFuc21pdHRlciBpZiB0aGUgaGFyZHdhcmUgdGhpbmtzIGl0IGlzIG9uIGEgCisJCSAqIGRpZmZlcmVudCBkZXNjcmlwdG9yIHRoYW4gd2UgYXJlLgorCQkgKi8KKwkJaWYgKGRldi0+dHhfaWR4ICE9IGRldi0+dHhfZnJlZV9pZHgpCisJCQlraWNrX3R4KGRldik7CisJfQorCisJLyogRGVmZXIgdHggcmluZyBwcm9jZXNzaW5nIHVudGlsIG1vcmUgdGhhbiBhIG1pbmltdW0gYW1vdW50IG9mCisJICogd29yayBoYXMgYWNjdW11bGF0ZWQKKwkgKi8KKwlpZiAoKElTUl9UWERFU0MgfCBJU1JfVFhJRExFIHwgSVNSX1RYT0sgfCBJU1JfVFhFUlIpICYgaXNyKSB7CisJCWRvX3R4X2RvbmUobmRldik7CisKKwkJLyogRGlzYWJsZSBUeE9rIGlmIHRoZXJlIGFyZSBubyBvdXRzdGFuZGluZyB0eCBwYWNrZXRzLgorCQkgKi8KKwkJaWYgKChkZXYtPnR4X2RvbmVfaWR4ID09IGRldi0+dHhfZnJlZV9pZHgpICYmCisJCSAgICAoZGV2LT5JTVJfY2FjaGUgJiBJU1JfVFhPSykpIHsKKwkJCXNwaW5fbG9ja19pcnEoJmRldi0+bWlzY19sb2NrKTsKKwkJCWRldi0+SU1SX2NhY2hlICY9IH5JU1JfVFhPSzsKKwkJCXdyaXRlbChkZXYtPklNUl9jYWNoZSwgZGV2LT5iYXNlICsgSU1SKTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5taXNjX2xvY2spOworCQl9CisJfQorCisJLyogVGhlIFR4SWRsZSBpbnRlcnJ1cHQgY2FuIGNvbWUgaW4gYmVmb3JlIHRoZSB0cmFuc21pdCBoYXMKKwkgKiBjb21wbGV0ZWQuICBOb3JtYWxseSB3ZSByZWFwIHBhY2tldHMgb2ZmIG9mIHRoZSBjb21iaW5hdGlvbgorCSAqIG9mIFR4RGVzYyBhbmQgVHhJZGxlIGFuZCBsZWF2ZSBUeE9rIGRpc2FibGVkIChzaW5jZSBpdCAKKwkgKiBvY2N1cnMgb24gZXZlcnkgcGFja2V0KSwgYnV0IHdoZW4gbm8gZnVydGhlciBpcnFzIG9mIHRoaXMgCisJICogbmF0dXJlIGFyZSBleHBlY3RlZCwgd2UgbXVzdCBlbmFibGUgVHhPay4KKwkgKi8KKwlpZiAoKElTUl9UWElETEUgJiBpc3IpICYmIChkZXYtPnR4X2RvbmVfaWR4ICE9IGRldi0+dHhfZnJlZV9pZHgpKSB7CisJCXNwaW5fbG9ja19pcnEoJmRldi0+bWlzY19sb2NrKTsKKwkJZGV2LT5JTVJfY2FjaGUgfD0gSVNSX1RYT0s7CisJCXdyaXRlbChkZXYtPklNUl9jYWNoZSwgZGV2LT5iYXNlICsgSU1SKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPm1pc2NfbG9jayk7CisJfQorCisJLyogTUlCIGludGVycnVwdDogb25lIG9mIHRoZSBzdGF0aXN0aWNzIGNvdW50ZXJzIGlzIGFib3V0IHRvIG92ZXJmbG93ICovCisJaWYgKHVubGlrZWx5KElTUl9NSUIgJiBpc3IpKQorCQluczgzODIwX21pYl9pc3IoZGV2KTsKKworCS8qIFBIWTogTGluayB1cC9kb3duL25lZ290aWF0aW9uIHN0YXRlIGNoYW5nZSAqLworCWlmICh1bmxpa2VseShJU1JfUEhZICYgaXNyKSkKKwkJcGh5X2ludHIobmRldik7CisKKyNpZiAwCS8qIFN0aWxsIHdvcmtpbmcgb24gdGhlIGludGVycnVwdCBtaXRpZ2F0aW9uIHN0cmF0ZWd5ICovCisJaWYgKGRldi0+aWhyKQorCQl3cml0ZWwoZGV2LT5paHIsIGRldi0+YmFzZSArIElIUik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgbnM4MzgyMF9kb19yZXNldChzdHJ1Y3QgbnM4MzgyMCAqZGV2LCB1MzIgd2hpY2gpCit7CisJRHByaW50aygicmVzZXR0aW5nIGNoaXAuLi5cbiIpOworCXdyaXRlbCh3aGljaCwgZGV2LT5iYXNlICsgQ1IpOworCWRvIHsKKwkJc2NoZWR1bGUoKTsKKwl9IHdoaWxlIChyZWFkbChkZXYtPmJhc2UgKyBDUikgJiB3aGljaCk7CisJRHByaW50aygib2theSFcbiIpOworfQorCitzdGF0aWMgaW50IG5zODM4MjBfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgbnM4MzgyMCAqZGV2ID0gUFJJVihuZGV2KTsKKworCS8qIEZJWE1FOiBwcm90ZWN0IGFnYWluc3QgaW50ZXJydXB0IGhhbmRsZXI/ICovCisJZGVsX3RpbWVyX3N5bmMoJmRldi0+dHhfd2F0Y2hkb2cpOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJd3JpdGVsKDAsIGRldi0+YmFzZSArIElNUik7CisJd3JpdGVsKDAsIGRldi0+YmFzZSArIElFUik7CisJcmVhZGwoZGV2LT5iYXNlICsgSUVSKTsKKworCWRldi0+cnhfaW5mby51cCA9IDA7CisJc3luY2hyb25pemVfaXJxKGRldi0+cGNpX2Rldi0+aXJxKTsKKworCW5zODM4MjBfZG9fcmVzZXQoZGV2LCBDUl9SU1QpOworCisJc3luY2hyb25pemVfaXJxKGRldi0+cGNpX2Rldi0+aXJxKTsKKworCXNwaW5fbG9ja19pcnEoJmRldi0+bWlzY19sb2NrKTsKKwlkZXYtPklNUl9jYWNoZSAmPSB+KElTUl9UWFVSTiB8IElTUl9UWElETEUgfCBJU1JfVFhFUlIgfCBJU1JfVFhERVNDIHwgSVNSX1RYT0spOworCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5taXNjX2xvY2spOworCisJbnM4MzgyMF9jbGVhbnVwX3J4KGRldik7CisJbnM4MzgyMF9jbGVhbnVwX3R4KGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbnM4MzgyMF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOworICAgICAgICB1MzIgdHhfZG9uZV9pZHgsICpkZXNjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwl0eF9kb25lX2lkeCA9IGRldi0+dHhfZG9uZV9pZHg7CisJZGVzYyA9IGRldi0+dHhfZGVzY3MgKyAodHhfZG9uZV9pZHggKiBERVNDX1NJWkUpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHR4X3RpbWVvdXQ6IHR4X2RvbmVfaWR4PSVkIGZyZWVfaWR4PSVkIGNtZHN0cz0lMDh4XG4iLAorCQluZGV2LT5uYW1lLAorCQl0eF9kb25lX2lkeCwgZGV2LT50eF9mcmVlX2lkeCwgbGUzMl90b19jcHUoZGVzY1tERVNDX0NNRFNUU10pKTsKKworI2lmIGRlZmluZWQoREVCVUcpCisJeworCQl1MzIgaXNyOworCQlpc3IgPSByZWFkbChkZXYtPmJhc2UgKyBJU1IpOworCQlwcmludGsoImlycTogJTA4eCBpbXI6ICUwOHhcbiIsIGlzciwgZGV2LT5JTVJfY2FjaGUpOworCQluczgzODIwX2RvX2lzcihuZGV2LCBpc3IpOworCX0KKyNlbmRpZgorCisJZG9fdHhfZG9uZShuZGV2KTsKKworCXR4X2RvbmVfaWR4ID0gZGV2LT50eF9kb25lX2lkeDsKKwlkZXNjID0gZGV2LT50eF9kZXNjcyArICh0eF9kb25lX2lkeCAqIERFU0NfU0laRSk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogYWZ0ZXI6IHR4X2RvbmVfaWR4PSVkIGZyZWVfaWR4PSVkIGNtZHN0cz0lMDh4XG4iLAorCQluZGV2LT5uYW1lLAorCQl0eF9kb25lX2lkeCwgZGV2LT50eF9mcmVlX2lkeCwgbGUzMl90b19jcHUoZGVzY1tERVNDX0NNRFNUU10pKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbnM4MzgyMF90eF93YXRjaCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSAodm9pZCAqKWRhdGE7CisJc3RydWN0IG5zODM4MjAgKmRldiA9IFBSSVYobmRldik7CisKKyNpZiBkZWZpbmVkKERFQlVHKQorCXByaW50aygibnM4MzgyMF90eF93YXRjaDogJXUgJXUgJWRcbiIsCisJCWRldi0+dHhfZG9uZV9pZHgsIGRldi0+dHhfZnJlZV9pZHgsIGF0b21pY19yZWFkKCZkZXYtPm5yX3R4X3NrYnMpCisJCSk7CisjZW5kaWYKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIG5kZXYtPnRyYW5zX3N0YXJ0ICsgMSpIWikgJiYKKwkgICAgZGV2LT50eF9kb25lX2lkeCAhPSBkZXYtPnR4X2ZyZWVfaWR4KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogbnM4MzgyMF90eF93YXRjaDogJXUgJXUgJWRcbiIsCisJCQluZGV2LT5uYW1lLAorCQkJZGV2LT50eF9kb25lX2lkeCwgZGV2LT50eF9mcmVlX2lkeCwKKwkJCWF0b21pY19yZWFkKCZkZXYtPm5yX3R4X3NrYnMpKTsKKwkJbnM4MzgyMF90eF90aW1lb3V0KG5kZXYpOworCX0KKworCW1vZF90aW1lcigmZGV2LT50eF93YXRjaGRvZywgamlmZmllcyArIDIqSFopOworfQorCitzdGF0aWMgaW50IG5zODM4MjBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgbnM4MzgyMCAqZGV2ID0gUFJJVihuZGV2KTsKKwl1bnNpZ25lZCBpOworCXUzMiBkZXNjOworCWludCByZXQ7CisKKwlkcHJpbnRrKCJuczgzODIwX29wZW5cbiIpOworCisJd3JpdGVsKDAsIGRldi0+YmFzZSArIFBRQ1IpOworCisJcmV0ID0gbnM4MzgyMF9zZXR1cF9yeChuZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxlZDsKKworCW1lbXNldChkZXYtPnR4X2Rlc2NzLCAwLCA0ICogTlJfVFhfREVTQyAqIERFU0NfU0laRSk7CisJZm9yIChpPTA7IGk8TlJfVFhfREVTQzsgaSsrKSB7CisJCWRldi0+dHhfZGVzY3NbKGkgKiBERVNDX1NJWkUpICsgREVTQ19MSU5LXQorCQkJCT0gY3B1X3RvX2xlMzIoCisJCQkJICBkZXYtPnR4X3BoeV9kZXNjcworCQkJCSAgKyAoKGkrMSkgJSBOUl9UWF9ERVNDKSAqIERFU0NfU0laRSAqIDQpOworCX0KKworCWRldi0+dHhfaWR4ID0gMDsKKwlkZXYtPnR4X2RvbmVfaWR4ID0gMDsKKwlkZXNjID0gZGV2LT50eF9waHlfZGVzY3M7CisJd3JpdGVsKDAsIGRldi0+YmFzZSArIFRYRFBfSEkpOworCXdyaXRlbChkZXNjLCBkZXYtPmJhc2UgKyBUWERQKTsKKworCWluaXRfdGltZXIoJmRldi0+dHhfd2F0Y2hkb2cpOworCWRldi0+dHhfd2F0Y2hkb2cuZGF0YSA9ICh1bnNpZ25lZCBsb25nKW5kZXY7CisJZGV2LT50eF93YXRjaGRvZy5mdW5jdGlvbiA9IG5zODM4MjBfdHhfd2F0Y2g7CisJbW9kX3RpbWVyKCZkZXYtPnR4X3dhdGNoZG9nLCBqaWZmaWVzICsgMipIWik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShuZGV2KTsJLyogRklYTUU6IHdhaXQgZm9yIHBoeSB0byBjb21lIHVwICovCisKKwlyZXR1cm4gMDsKKworZmFpbGVkOgorCW5zODM4MjBfc3RvcChuZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBuczgzODIwX2dldG1hYyhzdHJ1Y3QgbnM4MzgyMCAqZGV2LCB1OCAqbWFjKQoreworCXVuc2lnbmVkIGk7CisJZm9yIChpPTA7IGk8MzsgaSsrKSB7CisJCXUzMiBkYXRhOworI2lmIDAJLyogSSd2ZSBsZWZ0IHRoaXMgaW4gYXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIGVlcHJvbS5oICovCisJCWRhdGEgPSBlZXByb21fcmVhZHcoJmRldi0+ZWUsIDB4YSArIDIgLSBpKTsKKyNlbHNlCisJCS8qIFJlYWQgZnJvbSB0aGUgcGVyZmVjdCBtYXRjaCBtZW1vcnk6IHRoaXMgaXMgbG9hZGVkIGJ5CisJCSAqIHRoZSBjaGlwIGZyb20gdGhlIEVFUFJPTSB2aWEgdGhlIEVFTE9BRCBzZWxmIHRlc3QuCisJCSAqLworCQl3cml0ZWwoaSoyLCBkZXYtPmJhc2UgKyBSRkNSKTsKKwkJZGF0YSA9IHJlYWRsKGRldi0+YmFzZSArIFJGRFIpOworI2VuZGlmCisJCSptYWMrKyA9IGRhdGE7CisJCSptYWMrKyA9IGRhdGEgPj4gODsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbnM4MzgyMF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBpbnQgbmV3X210dSkKK3sKKwlpZiAobmV3X210dSA+IFJYX0JVRl9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwluZGV2LT5tdHUgPSBuZXdfbXR1OworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuczgzODIwX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IG5zODM4MjAgKmRldiA9IFBSSVYobmRldik7CisJdTggX19pb21lbSAqcmZjciA9IGRldi0+YmFzZSArIFJGQ1I7CisJdTMyIGFuZF9tYXNrID0gMHhmZmZmZmZmZjsKKwl1MzIgb3JfbWFzayA9IDA7CisJdTMyIHZhbDsKKworCWlmIChuZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCQlvcl9tYXNrIHw9IFJGQ1JfQUFVIHwgUkZDUl9BQU07CisJZWxzZQorCQlhbmRfbWFzayAmPSB+KFJGQ1JfQUFVIHwgUkZDUl9BQU0pOworCisJaWYgKG5kZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQorCQlvcl9tYXNrIHw9IFJGQ1JfQUFNOworCWVsc2UKKwkJYW5kX21hc2sgJj0gflJGQ1JfQUFNOworCisJc3Bpbl9sb2NrX2lycSgmZGV2LT5taXNjX2xvY2spOworCXZhbCA9IChyZWFkbChyZmNyKSAmIGFuZF9tYXNrKSB8IG9yX21hc2s7CisJLyogUmFtaXQgOiBSRkNSIFdyaXRlIEZpeCBkb2Mgc2F5cyBSRkVOIG11c3QgYmUgMCBtb2RpZnkgb3RoZXIgYml0cyAqLworCXdyaXRlbCh2YWwgJiB+UkZDUl9SRkVOLCByZmNyKTsKKwl3cml0ZWwodmFsLCByZmNyKTsKKwlzcGluX3VubG9ja19pcnEoJmRldi0+bWlzY19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgbnM4MzgyMF9ydW5fYmlzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgY29uc3QgY2hhciAqbmFtZSwgdTMyIGVuYWJsZSwgdTMyIGRvbmUsIHUzMiBmYWlsKQoreworCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOworCWludCB0aW1lZF9vdXQgPSAwOworCWxvbmcgc3RhcnQ7CisJdTMyIHN0YXR1czsKKwlpbnQgbG9vcHMgPSAwOworCisJZHByaW50aygiJXM6IHN0YXJ0ICVzXG4iLCBuZGV2LT5uYW1lLCBuYW1lKTsKKworCXN0YXJ0ID0gamlmZmllczsKKworCXdyaXRlbChlbmFibGUsIGRldi0+YmFzZSArIFBUU0NSKTsKKwlmb3IgKDs7KSB7CisJCWxvb3BzKys7CisJCXN0YXR1cyA9IHJlYWRsKGRldi0+YmFzZSArIFBUU0NSKTsKKwkJaWYgKCEoc3RhdHVzICYgZW5hYmxlKSkKKwkJCWJyZWFrOworCQlpZiAoc3RhdHVzICYgZG9uZSkKKwkJCWJyZWFrOworCQlpZiAoc3RhdHVzICYgZmFpbCkKKwkJCWJyZWFrOworCQlpZiAoKGppZmZpZXMgLSBzdGFydCkgPj0gSFopIHsKKwkJCXRpbWVkX291dCA9IDE7CisJCQlicmVhazsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJfQorCisJaWYgKHN0YXR1cyAmIGZhaWwpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBmYWlsZWQhICgweCUwOHggJiAweCUwOHgpXG4iLAorCQkJbmRldi0+bmFtZSwgbmFtZSwgc3RhdHVzLCBmYWlsKTsKKwllbHNlIGlmICh0aW1lZF9vdXQpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBydW5fYmlzdCAlcyB0aW1lZCBvdXQhICglMDh4KVxuIiwKKwkJCW5kZXYtPm5hbWUsIG5hbWUsIHN0YXR1cyk7CisKKwlkcHJpbnRrKCIlczogZG9uZSAlcyBpbiAlZCBsb29wc1xuIiwgbmRldi0+bmFtZSwgbmFtZSwgbG9vcHMpOworfQorCisjaWZkZWYgUEhZX0NPREVfSVNfRklOSVNIRUQKK3N0YXRpYyB2b2lkIG5zODM4MjBfbWlpX3dyaXRlX2JpdChzdHJ1Y3QgbnM4MzgyMCAqZGV2LCBpbnQgYml0KQoreworCS8qIGRyaXZlIE1EQyBsb3cgKi8KKwlkZXYtPk1FQVJfY2FjaGUgJj0gfk1FQVJfTURDOworCXdyaXRlbChkZXYtPk1FQVJfY2FjaGUsIGRldi0+YmFzZSArIE1FQVIpOworCXJlYWRsKGRldi0+YmFzZSArIE1FQVIpOworCisJLyogZW5hYmxlIG91dHB1dCwgc2V0IGJpdCAqLworCWRldi0+TUVBUl9jYWNoZSB8PSBNRUFSX01ERElSOworCWlmIChiaXQpCisJCWRldi0+TUVBUl9jYWNoZSB8PSBNRUFSX01ESU87CisJZWxzZQorCQlkZXYtPk1FQVJfY2FjaGUgJj0gfk1FQVJfTURJTzsKKworCS8qIHNldCB0aGUgb3V0cHV0IGJpdCAqLworCXdyaXRlbChkZXYtPk1FQVJfY2FjaGUsIGRldi0+YmFzZSArIE1FQVIpOworCXJlYWRsKGRldi0+YmFzZSArIE1FQVIpOworCisJLyogV2FpdC4gIE1heCBjbG9jayByYXRlIGlzIDIuNU1IeiwgdGhpcyB3YXkgd2UgY29tZSBpbiB1bmRlciAxTUh6ICovCisJdWRlbGF5KDEpOworCisJLyogZHJpdmUgTURDIGhpZ2ggY2F1c2luZyB0aGUgZGF0YSBiaXQgdG8gYmUgbGF0Y2hlZCAqLworCWRldi0+TUVBUl9jYWNoZSB8PSBNRUFSX01EQzsKKwl3cml0ZWwoZGV2LT5NRUFSX2NhY2hlLCBkZXYtPmJhc2UgKyBNRUFSKTsKKwlyZWFkbChkZXYtPmJhc2UgKyBNRUFSKTsKKworCS8qIFdhaXQgYWdhaW4uLi4gKi8KKwl1ZGVsYXkoMSk7Cit9CisKK3N0YXRpYyBpbnQgbnM4MzgyMF9taWlfcmVhZF9iaXQoc3RydWN0IG5zODM4MjAgKmRldikKK3sKKwlpbnQgYml0OworCisJLyogZHJpdmUgTURDIGxvdywgZGlzYWJsZSBvdXRwdXQgKi8KKwlkZXYtPk1FQVJfY2FjaGUgJj0gfk1FQVJfTURDOworCWRldi0+TUVBUl9jYWNoZSAmPSB+TUVBUl9NRERJUjsKKwl3cml0ZWwoZGV2LT5NRUFSX2NhY2hlLCBkZXYtPmJhc2UgKyBNRUFSKTsKKwlyZWFkbChkZXYtPmJhc2UgKyBNRUFSKTsKKworCS8qIFdhaXQuICBNYXggY2xvY2sgcmF0ZSBpcyAyLjVNSHosIHRoaXMgd2F5IHdlIGNvbWUgaW4gdW5kZXIgMU1IeiAqLworCXVkZWxheSgxKTsKKworCS8qIGRyaXZlIE1EQyBoaWdoIGNhdXNpbmcgdGhlIGRhdGEgYml0IHRvIGJlIGxhdGNoZWQgKi8KKwliaXQgPSAocmVhZGwoZGV2LT5iYXNlICsgTUVBUikgJiBNRUFSX01ESU8pID8gMSA6IDA7CisJZGV2LT5NRUFSX2NhY2hlIHw9IE1FQVJfTURDOworCXdyaXRlbChkZXYtPk1FQVJfY2FjaGUsIGRldi0+YmFzZSArIE1FQVIpOworCisJLyogV2FpdCBhZ2Fpbi4uLiAqLworCXVkZWxheSgxKTsKKworCXJldHVybiBiaXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBuczgzODIwX21paV9yZWFkX3JlZyhzdHJ1Y3QgbnM4MzgyMCAqZGV2LCB1bnNpZ25lZCBwaHksIHVuc2lnbmVkIHJlZykKK3sKKwl1bnNpZ25lZCBkYXRhID0gMDsKKwlpbnQgaTsKKworCS8qIHJlYWQgc29tZSBnYXJiYWdlIHNvIHRoYXQgd2UgZXZlbnR1YWxseSBzeW5jIHVwICovCisJZm9yIChpPTA7IGk8NjQ7IGkrKykKKwkJbnM4MzgyMF9taWlfcmVhZF9iaXQoZGV2KTsKKworCW5zODM4MjBfbWlpX3dyaXRlX2JpdChkZXYsIDApOwkvKiBzdGFydCAqLworCW5zODM4MjBfbWlpX3dyaXRlX2JpdChkZXYsIDEpOworCW5zODM4MjBfbWlpX3dyaXRlX2JpdChkZXYsIDEpOwkvKiBvcGNvZGUgcmVhZCAqLworCW5zODM4MjBfbWlpX3dyaXRlX2JpdChkZXYsIDApOworCisJLyogd3JpdGUgb3V0IHRoZSBwaHkgYWRkcmVzczogNSBiaXRzLCBtc2IgZmlyc3QgKi8KKwlmb3IgKGk9MDsgaTw1OyBpKyspCisJCW5zODM4MjBfbWlpX3dyaXRlX2JpdChkZXYsIHBoeSAmICgweDEwID4+IGkpKTsKKworCS8qIHdyaXRlIG91dCB0aGUgcmVnaXN0ZXIgYWRkcmVzcywgNSBiaXRzLCBtc2IgZmlyc3QgKi8KKwlmb3IgKGk9MDsgaTw1OyBpKyspCisJCW5zODM4MjBfbWlpX3dyaXRlX2JpdChkZXYsIHJlZyAmICgweDEwID4+IGkpKTsKKworCW5zODM4MjBfbWlpX3JlYWRfYml0KGRldik7CS8qIHR1cm4gYXJvdW5kIGN5Y2xlcyAqLworCW5zODM4MjBfbWlpX3JlYWRfYml0KGRldik7CisKKwkvKiByZWFkIGluIHRoZSByZWdpc3RlciBkYXRhLCAxNiBiaXRzIG1zYiBmaXJzdCAqLworCWZvciAoaT0wOyBpPDE2OyBpKyspIHsKKwkJZGF0YSA8PD0gMTsKKwkJZGF0YSB8PSBuczgzODIwX21paV9yZWFkX2JpdChkZXYpOworCX0KKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdW5zaWduZWQgbnM4MzgyMF9taWlfd3JpdGVfcmVnKHN0cnVjdCBuczgzODIwICpkZXYsIHVuc2lnbmVkIHBoeSwgdW5zaWduZWQgcmVnLCB1bnNpZ25lZCBkYXRhKQoreworCWludCBpOworCisJLyogcmVhZCBzb21lIGdhcmJhZ2Ugc28gdGhhdCB3ZSBldmVudHVhbGx5IHN5bmMgdXAgKi8KKwlmb3IgKGk9MDsgaTw2NDsgaSsrKQorCQluczgzODIwX21paV9yZWFkX2JpdChkZXYpOworCisJbnM4MzgyMF9taWlfd3JpdGVfYml0KGRldiwgMCk7CS8qIHN0YXJ0ICovCisJbnM4MzgyMF9taWlfd3JpdGVfYml0KGRldiwgMSk7CisJbnM4MzgyMF9taWlfd3JpdGVfYml0KGRldiwgMCk7CS8qIG9wY29kZSByZWFkICovCisJbnM4MzgyMF9taWlfd3JpdGVfYml0KGRldiwgMSk7CisKKwkvKiB3cml0ZSBvdXQgdGhlIHBoeSBhZGRyZXNzOiA1IGJpdHMsIG1zYiBmaXJzdCAqLworCWZvciAoaT0wOyBpPDU7IGkrKykKKwkJbnM4MzgyMF9taWlfd3JpdGVfYml0KGRldiwgcGh5ICYgKDB4MTAgPj4gaSkpOworCisJLyogd3JpdGUgb3V0IHRoZSByZWdpc3RlciBhZGRyZXNzLCA1IGJpdHMsIG1zYiBmaXJzdCAqLworCWZvciAoaT0wOyBpPDU7IGkrKykKKwkJbnM4MzgyMF9taWlfd3JpdGVfYml0KGRldiwgcmVnICYgKDB4MTAgPj4gaSkpOworCisJbnM4MzgyMF9taWlfcmVhZF9iaXQoZGV2KTsJLyogdHVybiBhcm91bmQgY3ljbGVzICovCisJbnM4MzgyMF9taWlfcmVhZF9iaXQoZGV2KTsKKworCS8qIHJlYWQgaW4gdGhlIHJlZ2lzdGVyIGRhdGEsIDE2IGJpdHMgbXNiIGZpcnN0ICovCisJZm9yIChpPTA7IGk8MTY7IGkrKykKKwkJbnM4MzgyMF9taWlfd3JpdGVfYml0KGRldiwgKGRhdGEgPj4gKDE1IC0gaSkpICYgMSk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQgbnM4MzgyMF9wcm9iZV9waHkoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IG5zODM4MjAgKmRldiA9IFBSSVYobmRldik7CisJc3RhdGljIGludCBmaXJzdDsKKwlpbnQgaTsKKyNkZWZpbmUgTUlJX1BIWUlEUjEJMHgwMgorI2RlZmluZSBNSUlfUEhZSURSMgkweDAzCisKKyNpZiAwCisJaWYgKCFmaXJzdCkgeworCQl1bnNpZ25lZCB0bXA7CisJCW5zODM4MjBfbWlpX3JlYWRfcmVnKGRldiwgMSwgMHgwOSk7CisJCW5zODM4MjBfbWlpX3dyaXRlX3JlZyhkZXYsIDEsIDB4MTAsIDB4MGQzZSk7CisKKwkJdG1wID0gbnM4MzgyMF9taWlfcmVhZF9yZWcoZGV2LCAxLCAweDAwKTsKKwkJbnM4MzgyMF9taWlfd3JpdGVfcmVnKGRldiwgMSwgMHgwMCwgdG1wIHwgMHg4MDAwKTsKKwkJdWRlbGF5KDEzMDApOworCQluczgzODIwX21paV9yZWFkX3JlZyhkZXYsIDEsIDB4MDkpOworCX0KKyNlbmRpZgorCWZpcnN0ID0gMTsKKworCWZvciAoaT0xOyBpPDI7IGkrKykgeworCQlpbnQgajsKKwkJdW5zaWduZWQgYSwgYjsKKwkJYSA9IG5zODM4MjBfbWlpX3JlYWRfcmVnKGRldiwgaSwgTUlJX1BIWUlEUjEpOworCQliID0gbnM4MzgyMF9taWlfcmVhZF9yZWcoZGV2LCBpLCBNSUlfUEhZSURSMik7CisKKwkJLy9wcmludGsoIiVzOiBwaHkgJWQ6IDB4JTA0eCAweCUwNHhcbiIsCisJCS8vCW5kZXYtPm5hbWUsIGksIGEsIGIpOworCisJCWZvciAoaj0wOyBqPDB4MTY7IGorPTQpIHsKKwkJCWRwcmludGsoIiVzOiBbMHglMDJ4XSAlMDR4ICUwNHggJTA0eCAlMDR4XG4iLAorCQkJCW5kZXYtPm5hbWUsIGosCisJCQkJbnM4MzgyMF9taWlfcmVhZF9yZWcoZGV2LCBpLCAwICsgaiksCisJCQkJbnM4MzgyMF9taWlfcmVhZF9yZWcoZGV2LCBpLCAxICsgaiksCisJCQkJbnM4MzgyMF9taWlfcmVhZF9yZWcoZGV2LCBpLCAyICsgaiksCisJCQkJbnM4MzgyMF9taWlfcmVhZF9yZWcoZGV2LCBpLCAzICsgaikKKwkJCQkpOworCQl9CisJfQorCXsKKwkJdW5zaWduZWQgYSwgYjsKKwkJLyogcmVhZCBmaXJtd2FyZSB2ZXJzaW9uOiBtZW1vcnkgYWRkciBpcyAweDg0MDIgYW5kIDB4ODQwMyAqLworCQluczgzODIwX21paV93cml0ZV9yZWcoZGV2LCAxLCAweDE2LCAweDAwMGQpOworCQluczgzODIwX21paV93cml0ZV9yZWcoZGV2LCAxLCAweDFlLCAweDgxMGUpOworCQlhID0gbnM4MzgyMF9taWlfcmVhZF9yZWcoZGV2LCAxLCAweDFkKTsKKworCQluczgzODIwX21paV93cml0ZV9yZWcoZGV2LCAxLCAweDE2LCAweDAwMGQpOworCQluczgzODIwX21paV93cml0ZV9yZWcoZGV2LCAxLCAweDFlLCAweDgxMGUpOworCQliID0gbnM4MzgyMF9taWlfcmVhZF9yZWcoZGV2LCAxLCAweDFkKTsKKwkJZHByaW50aygidmVyc2lvbjogMHglMDR4IDB4JTA0eFxuIiwgYSwgYik7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG5zODM4MjBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwlzdHJ1Y3QgbnM4MzgyMCAqZGV2OworCWxvbmcgYWRkcjsKKwlpbnQgZXJyOworCWludCB1c2luZ19kYWMgPSAwOworCisJLyogU2VlIGlmIHdlIGNhbiBzZXQgdGhlIGRtYSBtYXNrIGVhcmx5IG9uOyBmYWlsdXJlIGlzIGZhdGFsLiAqLworCWlmIChUUllfREFDICYmICFwY2lfc2V0X2RtYV9tYXNrKHBjaV9kZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCkpIHsKKwkJdXNpbmdfZGFjID0gMTsKKwl9IGVsc2UgaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBjaV9kZXYsIDB4ZmZmZmZmZmYpKSB7CisJCXVzaW5nX2RhYyA9IDA7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibnM4MzgyMC5jOiBwY2lfc2V0X2RtYV9tYXNrIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwluZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuczgzODIwKSk7CisJZGV2ID0gUFJJVihuZGV2KTsKKwllcnIgPSAtRU5PTUVNOworCWlmICghZGV2KQorCQlnb3RvIG91dDsKKworCXNwaW5fbG9ja19pbml0KCZkZXYtPnJ4X2luZm8ubG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmRldi0+dHhfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmRldi0+bWlzY19sb2NrKTsKKwlkZXYtPnBjaV9kZXYgPSBwY2lfZGV2OworCisJZGV2LT5lZS5jYWNoZSA9ICZkZXYtPk1FQVJfY2FjaGU7CisJZGV2LT5lZS5sb2NrID0gJmRldi0+bWlzY19sb2NrOworCVNFVF9NT0RVTEVfT1dORVIobmRldik7CisJU0VUX05FVERFVl9ERVYobmRldiwgJnBjaV9kZXYtPmRldik7CisKKwlJTklUX1dPUksoJmRldi0+dHFfcmVmaWxsLCBxdWV1ZV9yZWZpbGwsIG5kZXYpOworCXRhc2tsZXRfaW5pdCgmZGV2LT5yeF90YXNrbGV0LCByeF9hY3Rpb24sICh1bnNpZ25lZCBsb25nKW5kZXYpOworCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpX2Rldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9JTkZPICJuczgzODIwOiBwY2lfZW5hYmxlX2RldiBmYWlsZWQ6ICVkXG4iLCBlcnIpOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBjaV9kZXYpOworCWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMSk7CisJZGV2LT5iYXNlID0gaW9yZW1hcF9ub2NhY2hlKGFkZHIsIFBBR0VfU0laRSk7CisJZGV2LT50eF9kZXNjcyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBjaV9kZXYsCisJCQk0ICogREVTQ19TSVpFICogTlJfVFhfREVTQywgJmRldi0+dHhfcGh5X2Rlc2NzKTsKKwlkZXYtPnJ4X2luZm8uZGVzY3MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LAorCQkJNCAqIERFU0NfU0laRSAqIE5SX1JYX0RFU0MsICZkZXYtPnJ4X2luZm8ucGh5X2Rlc2NzKTsKKwllcnIgPSAtRU5PTUVNOworCWlmICghZGV2LT5iYXNlIHx8ICFkZXYtPnR4X2Rlc2NzIHx8ICFkZXYtPnJ4X2luZm8uZGVzY3MpCisJCWdvdG8gb3V0X2Rpc2FibGU7CisKKwlkcHJpbnRrKCIlcDogJTA4bHggICVwOiAlMDhseFxuIiwKKwkJZGV2LT50eF9kZXNjcywgKGxvbmcpZGV2LT50eF9waHlfZGVzY3MsCisJCWRldi0+cnhfaW5mby5kZXNjcywgKGxvbmcpZGV2LT5yeF9pbmZvLnBoeV9kZXNjcyk7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwl3cml0ZWwoMCwgZGV2LT5iYXNlICsgSU1SKTsKKwl3cml0ZWwoMCwgZGV2LT5iYXNlICsgSUVSKTsKKwlyZWFkbChkZXYtPmJhc2UgKyBJRVIpOworCisJZGV2LT5JTVJfY2FjaGUgPSAwOworCisJc2V0dXBfZWVfbWVtX2JpdGJhbmdlcigmZGV2LT5lZSwgZGV2LT5iYXNlICsgTUVBUiwgMywgMiwgMSwgMCwKKwkJMCk7CisKKwllcnIgPSByZXF1ZXN0X2lycShwY2lfZGV2LT5pcnEsIG5zODM4MjBfaXJxLCBTQV9TSElSUSwKKwkJCSAgRFJWX05BTUUsIG5kZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAibnM4MzgyMDogdW5hYmxlIHRvIHJlZ2lzdGVyIGlycSAlZFxuIiwKKwkJCXBjaV9kZXYtPmlycSk7CisJCWdvdG8gb3V0X2Rpc2FibGU7CisJfQorCisJLyoKKwkgKiBGSVhNRTogd2UgYXJlIGhvbGRpbmcgcnRubF9sb2NrKCkgb3ZlciBvYnNjZW5lbHkgbG9uZyBhcmVhIG9ubHkKKwkgKiBiZWNhdXNlIHNvbWUgb2YgdGhlIHNldHVwIGNvZGUgdXNlcyBkZXYtPm5hbWUuICBJdCdzIFdyb25nKHRtKSAtCisJICogd2Ugc2hvdWxkIGJlIHVzaW5nIGRyaXZlci1zcGVjaWZpYyBuYW1lcyBmb3IgYWxsIHRoYXQgc3R1ZmYuCisJICogRm9yIG5vdyB0aGF0IHdpbGwgZG8sIGJ1dCB3ZSByZWFsbHkgbmVlZCB0byBjb21lIGJhY2sgYW5kIGtpbGwKKwkgKiBtb3N0IG9mIHRoZSBkZXZfYWxsb2NfbmFtZSgpIHVzZXJzIGxhdGVyLgorCSAqLworCXJ0bmxfbG9jaygpOworCWVyciA9IGRldl9hbGxvY19uYW1lKG5kZXYsIG5kZXYtPm5hbWUpOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIm5zODM4MjA6IHVuYWJsZSB0byBnZXQgbmV0ZGV2IG5hbWU6ICVkXG4iLCBlcnIpOworCQlnb3RvIG91dF9mcmVlX2lycTsKKwl9CisKKwlwcmludGsoIiVzOiBuczgzODIwLmM6IDB4MjJjOiAlMDh4LCBzdWJzeXN0ZW06ICUwNHg6JTA0eFxuIiwKKwkJbmRldi0+bmFtZSwgbGUzMl90b19jcHUocmVhZGwoZGV2LT5iYXNlICsgMHgyMmMpKSwKKwkJcGNpX2Rldi0+c3Vic3lzdGVtX3ZlbmRvciwgcGNpX2Rldi0+c3Vic3lzdGVtX2RldmljZSk7CisKKwluZGV2LT5vcGVuID0gbnM4MzgyMF9vcGVuOworCW5kZXYtPnN0b3AgPSBuczgzODIwX3N0b3A7CisJbmRldi0+aGFyZF9zdGFydF94bWl0ID0gbnM4MzgyMF9oYXJkX3N0YXJ0X3htaXQ7CisJbmRldi0+Z2V0X3N0YXRzID0gbnM4MzgyMF9nZXRfc3RhdHM7CisJbmRldi0+Y2hhbmdlX210dSA9IG5zODM4MjBfY2hhbmdlX210dTsKKwluZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBuczgzODIwX3NldF9tdWx0aWNhc3Q7CisJU0VUX0VUSFRPT0xfT1BTKG5kZXYsICZvcHMpOworCW5kZXYtPnR4X3RpbWVvdXQgPSBuczgzODIwX3R4X3RpbWVvdXQ7CisJbmRldi0+d2F0Y2hkb2dfdGltZW8gPSA1ICogSFo7CisJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIG5kZXYpOworCisJbnM4MzgyMF9kb19yZXNldChkZXYsIENSX1JTVCk7CisKKwkvKiBNdXN0IHJlc2V0IHRoZSByYW0gYmlzdCBiZWZvcmUgcnVubmluZyBpdCAqLworCXdyaXRlbChQVFNDUl9SQklTVF9SU1QsIGRldi0+YmFzZSArIFBUU0NSKTsKKwluczgzODIwX3J1bl9iaXN0KG5kZXYsICJzcmFtIGJpc3QiLCAgIFBUU0NSX1JCSVNUX0VOLAorCQkJIFBUU0NSX1JCSVNUX0RPTkUsIFBUU0NSX1JCSVNUX0ZBSUwpOworCW5zODM4MjBfcnVuX2Jpc3QobmRldiwgImVlcHJvbSBiaXN0IiwgUFRTQ1JfRUVCSVNUX0VOLCAwLAorCQkJIFBUU0NSX0VFQklTVF9GQUlMKTsKKwluczgzODIwX3J1bl9iaXN0KG5kZXYsICJlZXByb20gbG9hZCIsIFBUU0NSX0VFTE9BRF9FTiwgMCwgMCk7CisKKwkvKiBJIGxvdmUgY29uZmlnIHJlZ2lzdGVycyAqLworCWRldi0+Q0ZHX2NhY2hlID0gcmVhZGwoZGV2LT5iYXNlICsgQ0ZHKTsKKworCWlmICgoZGV2LT5DRkdfY2FjaGUgJiBDRkdfUENJNjRfREVUKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogZGV0ZWN0ZWQgNjQgYml0IFBDSSBkYXRhIGJ1cy5cbiIsCisJCQluZGV2LT5uYW1lKTsKKwkJLypkZXYtPkNGR19jYWNoZSB8PSBDRkdfREFUQTY0X0VOOyovCisJCWlmICghKGRldi0+Q0ZHX2NhY2hlICYgQ0ZHX0RBVEE2NF9FTikpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRUVQUk9NIGRpZCBub3QgZW5hYmxlIDY0IGJpdCBidXMuICBEaXNhYmxlZC5cbiIsCisJCQkJbmRldi0+bmFtZSk7CisJfSBlbHNlCisJCWRldi0+Q0ZHX2NhY2hlICY9IH4oQ0ZHX0RBVEE2NF9FTik7CisKKwlkZXYtPkNGR19jYWNoZSAmPSAoQ0ZHX1RCSV9FTiAgfCBDRkdfTVJNX0RJUyAgIHwgQ0ZHX01XSV9ESVMgfAorCQkJICAgQ0ZHX1Q2NEFERFIgfCBDRkdfREFUQTY0X0VOIHwgQ0ZHX0VYVF8xMjUgfAorCQkJICAgQ0ZHX002NEFERFIpOworCWRldi0+Q0ZHX2NhY2hlIHw9IENGR19QSU5UX0RVUFNUUyB8IENGR19QSU5UX0xOS1NUUyB8IENGR19QSU5UX1NQRFNUUyB8CisJCQkgIENGR19FWFRTVFNfRU4gICB8IENGR19FWEQgICAgICAgICB8IENGR19QRVNFTDsKKwlkZXYtPkNGR19jYWNoZSB8PSBDRkdfUkVRQUxHOworCWRldi0+Q0ZHX2NhY2hlIHw9IENGR19QT1c7CisJZGV2LT5DRkdfY2FjaGUgfD0gQ0ZHX1RNUlRFU1Q7CisKKwkvKiBXaGVuIGNvbXBpbGVkIHdpdGggNjQgYml0IGFkZHJlc3NpbmcsIHdlIG11c3QgYWx3YXlzIGVuYWJsZQorCSAqIHRoZSA2NCBiaXQgZGVzY3JpcHRvciBmb3JtYXQuCisJICovCisjaWZkZWYgVVNFXzY0QklUX0FERFIKKwlkZXYtPkNGR19jYWNoZSB8PSBDRkdfTTY0QUREUjsKKyNlbmRpZgorCWlmICh1c2luZ19kYWMpCisJCWRldi0+Q0ZHX2NhY2hlIHw9IENGR19UNjRBRERSOworCisJLyogQmlnIGVuZGlhbiBtb2RlIGRvZXMgbm90IHNlZW0gdG8gZG8gd2hhdCB0aGUgZG9jcyBzdWdnZXN0ICovCisJZGV2LT5DRkdfY2FjaGUgJj0gfkNGR19CRU07CisKKwkvKiBzZXR1cCBvcHRpY2FsIHRyYW5zY2VpdmVyIGlmIHdlIGhhdmUgb25lICovCisJaWYgKGRldi0+Q0ZHX2NhY2hlICYgQ0ZHX1RCSV9FTikgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogZW5hYmxpbmcgb3B0aWNhbCB0cmFuc2NlaXZlclxuIiwKKwkJCW5kZXYtPm5hbWUpOworCQl3cml0ZWwocmVhZGwoZGV2LT5iYXNlICsgR1BJT1IpIHwgMHgzZTgsIGRldi0+YmFzZSArIEdQSU9SKTsKKworCQkvKiBzZXR1cCBhdXRvIG5lZ290aWF0aW9uIGZlYXR1cmUgYWR2ZXJ0aXNlbWVudCAqLworCQl3cml0ZWwocmVhZGwoZGV2LT5iYXNlICsgVEFOQVIpCisJCSAgICAgICB8IFRBTkFSX0hBTEZfRFVQIHwgVEFOQVJfRlVMTF9EVVAsCisJCSAgICAgICBkZXYtPmJhc2UgKyBUQU5BUik7CisKKwkJLyogc3RhcnQgYXV0byBuZWdvdGlhdGlvbiAqLworCQl3cml0ZWwoVEJJQ1JfTVJfQU5fRU5BQkxFIHwgVEJJQ1JfTVJfUkVTVEFSVF9BTiwKKwkJICAgICAgIGRldi0+YmFzZSArIFRCSUNSKTsKKwkJd3JpdGVsKFRCSUNSX01SX0FOX0VOQUJMRSwgZGV2LT5iYXNlICsgVEJJQ1IpOworCQlkZXYtPmxpbmtzdGF0ZSA9IExJTktfQVVUT05FR09USUFURTsKKworCQlkZXYtPkNGR19jYWNoZSB8PSBDRkdfTU9ERV8xMDAwOworCX0KKworCXdyaXRlbChkZXYtPkNGR19jYWNoZSwgZGV2LT5iYXNlICsgQ0ZHKTsKKwlkcHJpbnRrKCJDRkc6ICUwOHhcbiIsIGRldi0+Q0ZHX2NhY2hlKTsKKworCWlmIChyZXNldF9waHkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlc2V0dGluZyBwaHlcbiIsIG5kZXYtPm5hbWUpOworCQl3cml0ZWwoZGV2LT5DRkdfY2FjaGUgfCBDRkdfUEhZX1JTVCwgZGV2LT5iYXNlICsgQ0ZHKTsKKwkJbXNsZWVwKDEwKTsKKwkJd3JpdGVsKGRldi0+Q0ZHX2NhY2hlLCBkZXYtPmJhc2UgKyBDRkcpOworCX0KKworI2lmIDAJLyogSHVoPyAgVGhpcyBzZXRzIHRoZSBQQ0kgbGF0ZW5jeSByZWdpc3Rlci4gIFNob3VsZCBiZSBkb25lIHZpYSAKKwkgKiB0aGUgUENJIGxheWVyLiAgRklYTUUuCisJICovCisJaWYgKHJlYWRsKGRldi0+YmFzZSArIFNSUikpCisJCXdyaXRlbChyZWFkbChkZXYtPmJhc2UrMHgyMGMpIHwgMHhmZTAwLCBkZXYtPmJhc2UgKyAweDIwYyk7CisjZW5kaWYKKworCS8qIE5vdGUhICBUaGUgRE1BIGJ1cnN0IHNpemUgaW50ZXJhY3RzIHdpdGggcGFja2V0CisJICogdHJhbnNtaXNzaW9uLCBzdWNoIHRoYXQgdGhlIGxhcmdlc3QgcGFja2V0IHRoYXQKKwkgKiBjYW4gYmUgdHJhbnNtaXR0ZWQgaXMgODE5MiAtIEZMVEggLSBidXJzdCBzaXplLgorCSAqIElmIG9ubHkgdGhlIHRyYW5zbWl0IGZpZm8gd2FzIGxhcmdlci4uLgorCSAqLworCS8qIFJhbWl0IDogMTAyNCBETUEgaXMgbm90IGEgZ29vZCBpZGVhLCBpdCBlbmRzIHVwIGJhbmdpbmcgCisJICogc29tZSBERUxMIGFuZCBDT01QQVEgU01QIHN5c3RlbXMgKi8KKwl3cml0ZWwoVFhDRkdfQ1NJIHwgVFhDRkdfSEJJIHwgVFhDRkdfQVRQIHwgVFhDRkdfTVhETUE1MTIKKwkJfCAoKDE2MDAgLyAzMikgKiAweDEwMCksCisJCWRldi0+YmFzZSArIFRYQ0ZHKTsKKworCS8qIEZsdXNoIHRoZSBpbnRlcnJ1cHQgaG9sZG9mZiB0aW1lciAqLworCXdyaXRlbCgweDAwMCwgZGV2LT5iYXNlICsgSUhSKTsKKwl3cml0ZWwoMHgxMDAsIGRldi0+YmFzZSArIElIUik7CisJd3JpdGVsKDB4MDAwLCBkZXYtPmJhc2UgKyBJSFIpOworCisJLyogU2V0IFJ4IHRvIGZ1bGwgZHVwbGV4LCBkb24ndCBhY2NlcHQgcnVudCwgZXJyb3JlZCwgbG9uZyBvciBsZW5ndGgKKwkgKiByYW5nZSBlcnJvcmVkIHBhY2tldHMuICBVc2UgNTEyIGJ5dGUgRE1BLgorCSAqLworCS8qIFJhbWl0IDogMTAyNCBETUEgaXMgbm90IGEgZ29vZCBpZGVhLCBpdCBlbmRzIHVwIGJhbmdpbmcgCisJICogc29tZSBERUxMIGFuZCBDT01QQVEgU01QIHN5c3RlbXMgCisJICogVHVybiBvbiBBTFAsIG9ubHkgd2UgYXJlIGFjY3BldGluZyBKdW1ibyBQYWNrZXRzICovCisJd3JpdGVsKFJYQ0ZHX0FFUCB8IFJYQ0ZHX0FSUCB8IFJYQ0ZHX0FJUkwgfCBSWENGR19SWF9GRAorCQl8IFJYQ0ZHX1NUUklQQ1JDCisJCS8vfCBSWENGR19BTFAKKwkJfCAoUlhDRkdfTVhETUE1MTIpIHwgMCwgZGV2LT5iYXNlICsgUlhDRkcpOworCisJLyogRGlzYWJsZSBwcmlvcml0eSBxdWV1ZWluZyAqLworCXdyaXRlbCgwLCBkZXYtPmJhc2UgKyBQUUNSKTsKKworCS8qIEVuYWJsZSBJUCBjaGVja3N1bSB2YWxpZGF0aW9uIGFuZCBkZXRldGlvbiBvZiBWTEFOIGhlYWRlcnMuCisJICogTm90ZTogZG8gbm90IHNldCB0aGUgcmVqZWN0IG9wdGlvbnMgYXMgYXQgbGVhc3QgdGhlIDB4MTAyCisJICogcmV2aXNpb24gb2YgdGhlIGNoaXAgZG9lcyBub3QgcHJvcGVybHkgYWNjZXB0IElQIGZyYWdtZW50cworCSAqIGF0IGxlYXN0IGZvciBVRFAuCisJICovCisJLyogUmFtaXQgOiBCZSBzdXJlIHRvIHR1cm4gb24gUlhDRkdfQVJQIGlmIFZMQU4ncyBhcmUgZW5hYmxlZCwgc2luY2UKKwkgKiB0aGUgTUFDIGl0IGNhbGN1bGF0ZXMgdGhlIHBhY2tldHNpemUgQUZURVIgc3RyaXBwaW5nIHRoZSBWTEFOCisJICogaGVhZGVyLCBhbmQgaWYgYSBWTEFOIFRhZ2dlZCBwYWNrZXQgb2YgNjQgYnl0ZXMgaXMgcmVjZWl2ZWQgKGxpa2UKKwkgKiBhIHBpbmcgd2l0aCBhIFZMQU4gaGVhZGVyKSB0aGVuIHRoZSBjYXJkLCBzdHJpcHMgdGhlIDQgYnl0ZSBWTEFOCisJICogdGFnIGFuZCB0aGVuIGNoZWNrcyB0aGUgcGFja2V0IHNpemUsIHNvIGlmIFJYQ0ZHX0FSUCBpcyBub3QgZW5hYmxlZCwKKwkgKiBpdCBkaXNjcmFyZHMgaXQhLiAgVGhlc2UgZ3V5cy4uLi4uLgorCSAqIGFsc28gdHVybiBvbiB0YWcgc3RyaXBwaW5nIGlmIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBlbmFibGVkCisJICovCisjaWZkZWYgTlM4MzgyMF9WTEFOX0FDQ0VMX1NVUFBPUlQKKyNkZWZpbmUgVlJDUl9JTklUX1ZBTFVFIChWUkNSX0lQRU58VlJDUl9WVERFTnxWUkNSX1ZUUkVOKSAKKyNlbHNlCisjZGVmaW5lIFZSQ1JfSU5JVF9WQUxVRSAoVlJDUl9JUEVOfFZSQ1JfVlRERU4pCisjZW5kaWYKKwl3cml0ZWwoVlJDUl9JTklUX1ZBTFVFLCBkZXYtPmJhc2UgKyBWUkNSKTsKKworCS8qIEVuYWJsZSBwZXItcGFja2V0IFRDUC9VRFAvSVAgY2hlY2tzdW1taW5nCisJICogYW5kIHBlciBwYWNrZXQgdmxhbiB0YWcgaW5zZXJ0aW9uIGlmCisJICogdmxhbiBoYXJkd2FyZSBhY2NlbGVyYXRpb24gaXMgZW5hYmxlZAorCSAqLworI2lmZGVmIE5TODM4MjBfVkxBTl9BQ0NFTF9TVVBQT1JUCisjZGVmaW5lIFZUQ1JfSU5JVF9WQUxVRSAoVlRDUl9QUENIS3xWVENSX1ZQUFRJKQorI2Vsc2UKKyNkZWZpbmUgVlRDUl9JTklUX1ZBTFVFIFZUQ1JfUFBDSEsKKyNlbmRpZgorCXdyaXRlbChWVENSX0lOSVRfVkFMVUUsIGRldi0+YmFzZSArIFZUQ1IpOworCisJLyogUmFtaXQgOiBFbmFibGUgYXN5bmMgYW5kIHN5bmMgcGF1c2UgZnJhbWVzICovCisJLyogd3JpdGVsKDAsIGRldi0+YmFzZSArIFBDUik7ICovCisJd3JpdGVsKChQQ1JfUFNfTUNBU1QgfCBQQ1JfUFNfREEgfCBQQ1JfUFNFTiB8IFBDUl9GRkxPXzRLIHwKKwkJUENSX0ZGSElfOEsgfCBQQ1JfU1RMT180IHwgUENSX1NUSElfOCB8IFBDUl9QQVVTRV9DTlQpLAorCQlkZXYtPmJhc2UgKyBQQ1IpOworCisJLyogRGlzYWJsZSBXYWtlIE9uIExhbiAqLworCXdyaXRlbCgwLCBkZXYtPmJhc2UgKyBXQ1NSKTsKKworCW5zODM4MjBfZ2V0bWFjKGRldiwgbmRldi0+ZGV2X2FkZHIpOworCisJLyogWWVzLCB3ZSBzdXBwb3J0IGR1bWIgSVAgY2hlY2tzdW0gb24gdHJhbnNtaXQgKi8KKwluZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHOworCW5kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSVBfQ1NVTTsKKworI2lmZGVmIE5TODM4MjBfVkxBTl9BQ0NFTF9TVVBQT1JUCisJLyogV2UgYWxzbyBzdXBwb3J0IGhhcmR3YXJlIHZsYW4gYWNjZWxlcmF0aW9uICovCisJbmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYOworCW5kZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPSBuczgzODIwX3ZsYW5fcnhfcmVnaXN0ZXI7CisJbmRldi0+dmxhbl9yeF9raWxsX3ZpZCA9IG5zODM4MjBfdmxhbl9yeF9raWxsX3ZpZDsKKyNlbmRpZgorCisJaWYgKHVzaW5nX2RhYykgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogdXNpbmcgNjQgYml0IGFkZHJlc3NpbmcuXG4iLAorCQkJbmRldi0+bmFtZSk7CisJCW5kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogbnM4MzgyMCB2IiBWRVJTSU9OICI6IERQODM4MjAgdiV1LiV1OiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBpbz0weCUwOGx4IGlycT0lZCBmPSVzXG4iLAorCQluZGV2LT5uYW1lLAorCQkodW5zaWduZWQpcmVhZGwoZGV2LT5iYXNlICsgU1JSKSA+PiA4LAorCQkodW5zaWduZWQpcmVhZGwoZGV2LT5iYXNlICsgU1JSKSAmIDB4ZmYsCisJCW5kZXYtPmRldl9hZGRyWzBdLCBuZGV2LT5kZXZfYWRkclsxXSwKKwkJbmRldi0+ZGV2X2FkZHJbMl0sIG5kZXYtPmRldl9hZGRyWzNdLAorCQluZGV2LT5kZXZfYWRkcls0XSwgbmRldi0+ZGV2X2FkZHJbNV0sCisJCWFkZHIsIHBjaV9kZXYtPmlycSwKKwkJKG5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9ISUdIRE1BKSA/ICJoLHNnIiA6ICJzZyIKKwkJKTsKKworI2lmZGVmIFBIWV9DT0RFX0lTX0ZJTklTSEVECisJbnM4MzgyMF9wcm9iZV9waHkobmRldik7CisjZW5kaWYKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldmljZShuZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0lORk8gIm5zODM4MjA6IHVuYWJsZSB0byByZWdpc3RlciBuZXRkZXY6ICVkXG4iLCBlcnIpOworCQlnb3RvIG91dF9jbGVhbnVwOworCX0KKwlydG5sX3VubG9jaygpOworCisJcmV0dXJuIDA7CisKK291dF9jbGVhbnVwOgorCXdyaXRlbCgwLCBkZXYtPmJhc2UgKyBJTVIpOwkvKiBwYXJhbm9pYSAqLworCXdyaXRlbCgwLCBkZXYtPmJhc2UgKyBJRVIpOworCXJlYWRsKGRldi0+YmFzZSArIElFUik7CitvdXRfZnJlZV9pcnE6CisJcnRubF91bmxvY2soKTsKKwlmcmVlX2lycShwY2lfZGV2LT5pcnEsIG5kZXYpOworb3V0X2Rpc2FibGU6CisJaWYgKGRldi0+YmFzZSkKKwkJaW91bm1hcChkZXYtPmJhc2UpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGNpX2RldiwgNCAqIERFU0NfU0laRSAqIE5SX1RYX0RFU0MsIGRldi0+dHhfZGVzY3MsIGRldi0+dHhfcGh5X2Rlc2NzKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBjaV9kZXYsIDQgKiBERVNDX1NJWkUgKiBOUl9SWF9ERVNDLCBkZXYtPnJ4X2luZm8uZGVzY3MsIGRldi0+cnhfaW5mby5waHlfZGVzY3MpOworCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKK291dF9mcmVlOgorCWZyZWVfbmV0ZGV2KG5kZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBOVUxMKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgbnM4MzgyMF9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOyAvKiBvayBldmVuIGlmIE5VTEwgKi8KKworCWlmICghbmRldikJCQkvKiBwYXJhbm9pYSAqLworCQlyZXR1cm47CisKKwl3cml0ZWwoMCwgZGV2LT5iYXNlICsgSU1SKTsJLyogcGFyYW5vaWEgKi8KKwl3cml0ZWwoMCwgZGV2LT5iYXNlICsgSUVSKTsKKwlyZWFkbChkZXYtPmJhc2UgKyBJRVIpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYobmRldik7CisJZnJlZV9pcnEoZGV2LT5wY2lfZGV2LT5pcnEsIG5kZXYpOworCWlvdW5tYXAoZGV2LT5iYXNlKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGNpX2RldiwgNCAqIERFU0NfU0laRSAqIE5SX1RYX0RFU0MsCisJCQlkZXYtPnR4X2Rlc2NzLCBkZXYtPnR4X3BoeV9kZXNjcyk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBjaV9kZXYsIDQgKiBERVNDX1NJWkUgKiBOUl9SWF9ERVNDLAorCQkJZGV2LT5yeF9pbmZvLmRlc2NzLCBkZXYtPnJ4X2luZm8ucGh5X2Rlc2NzKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2LT5wY2lfZGV2KTsKKwlmcmVlX25ldGRldihuZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBuczgzODIwX3BjaV90YmxbXSA9IHsKKwl7IDB4MTAwYiwgMHgwMDIyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAuZHJpdmVyX2RhdGEgPSAwLCB9LAorCXsgMCwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUJCT0gIm5zODM4MjAiLAorCS5pZF90YWJsZQk9IG5zODM4MjBfcGNpX3RibCwKKwkucHJvYmUJCT0gbnM4MzgyMF9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG5zODM4MjBfcmVtb3ZlX29uZSksCisjaWYgMAkvKiBGSVhNRTogaW1wbGVtZW50ICovCisJLnN1c3BlbmQJPSAsCisJLnJlc3VtZQkJPSAsCisjZW5kaWYKK307CisKKworc3RhdGljIGludCBfX2luaXQgbnM4MzgyMF9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAibnM4MzgyMC5jOiBOYXRpb25hbCBTZW1pY29uZHVjdG9yIERQODM4MjAgMTAvMTAwLzEwMDAgZHJpdmVyLlxuIik7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG5zODM4MjBfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiQmVuamFtaW4gTGFIYWlzZSA8YmNybEBrdmFjay5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgRFA4MzgyMCAxMC8xMDAvMTAwMCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG5zODM4MjBfcGNpX3RibCk7CisKK21vZHVsZV9wYXJhbShsbmtzdHMsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxua3N0cywgIlBvbGFyaXR5IG9mIExOS1NUUyBiaXQiKTsKKworbW9kdWxlX3BhcmFtKGlociwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaWhyLCAiVGltZSBpbiAxMDAgdXMgaW5jcmVtZW50cyB0byBkZWxheSBpbnRlcnJ1cHRzIChyYW5nZSAwLTEyNykiKTsKKworbW9kdWxlX3BhcmFtKHJlc2V0X3BoeSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocmVzZXRfcGh5LCAiU2V0IHRvIDEgdG8gcmVzZXQgdGhlIFBIWSBvbiBzdGFydHVwIik7CisKK21vZHVsZV9pbml0KG5zODM4MjBfaW5pdCk7Cittb2R1bGVfZXhpdChuczgzODIwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvb2FrbmV0LmMgYi9kcml2ZXJzL25ldC9vYWtuZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjE2N2EyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvb2FrbmV0LmMKQEAgLTAsMCArMSw2NjUgQEAKKy8qCisgKgorICogICAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgR3JhbnQgRXJpY2tzb24gPGdyYW50QGxjc2UudW1uLmVkdT4KKyAqCisgKiAgICBNb2R1bGUgbmFtZTogb2FrbmV0LmMKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgRHJpdmVyIGZvciB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBEUDgzOTAyQVYgRXRoZXJuZXQgY29udHJvbGxlcgorICogICAgICBvbi1ib2FyZCB0aGUgSUJNIFBvd2VyUEMgIk9hayIgZXZhbHVhdGlvbiBib2FyZC4gQWRhcHRlZCBmcm9tIHRoZQorICogICAgICB2YXJpb3VzIG90aGVyIDgzOTAgZHJpdmVycyB3cml0dGVuIGJ5IERvbmFsZCBCZWNrZXIgYW5kIFBhdWwgR29ydG1ha2VyLgorICoKKyAqICAgICAgQWRkaXRpb25hbCBpbnNwaXJhdGlvbiBmcm9tIHRoZSAidGNkODM5MC5jIiBkcml2ZXIgZnJvbSBUaVZvLCBJbmMuIAorICogICAgICBhbmQgImVuZXRMaWIuYyIgZnJvbSBJQk0uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vYm9hcmQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgIjgzOTAuaCIKKworCisvKiBQcmVwcm9jZXNzb3IgRGVmaW5lcyAqLworCisjaWYgIWRlZmluZWQoVFJVRSkgfHwgVFJVRSAhPSAxCisjZGVmaW5lCVRSVUUJMQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChGQUxTRSkgfHwgRkFMU0UgIT0gMAorI2RlZmluZQlGQUxTRQkwCisjZW5kaWYKKworI2RlZmluZQlPQUtORVRfU1RBUlRfUEcJCTB4MjAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKyNkZWZpbmUJT0FLTkVUX1NUT1BfUEcJCTB4NDAJLyogTGFzdCBwYWdnZSArMSBvZiBSWCByaW5nICovCisKKyNkZWZpbmUJT0FLTkVUX1dBSVQJCSgyICogSFogLyAxMDApCS8qIDIwIG1zICovCisKKy8qIEV4cGVyaW1lbnRpbmcgd2l0aCBzb21lIGZpeGVzIGZvciBhIGJyb2tlbiBkcml2ZXIuLi4gKi8KKworI2RlZmluZQlPQUtORVRfRElTSU5UCisjZGVmaW5lCU9BS05FVF9IRUFEQ0hFQ0sKKyNkZWZpbmUJT0FLTkVUX1JXRklYCisKKworLyogR2xvYmFsIFZhcmlhYmxlcyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqbmFtZSA9ICJOYXRpb25hbCBEUDgzOTAyQVYiOworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKm9ha25ldF9kZXZzOworCisKKy8qIEZ1bmN0aW9uIFByb3RvdHlwZXMgKi8KKworc3RhdGljIGludAkgb2FrbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CSBvYWtuZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyB2b2lkCSBvYWtuZXRfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkCSBvYWtuZXRfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKTsKK3N0YXRpYyB2b2lkCSBvYWtuZXRfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQJIG9ha25ldF9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RhcnRfcGFnZSk7CisKK3N0YXRpYyB2b2lkCSBvYWtuZXRfZG1hX2Vycm9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpOworCisKKy8qCisgKiBpbnQgb2FrbmV0X2luaXQoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYWxsIHRoZSBuZWNlc3NhcnkgcGxhdGZvcm0tc3BlY2lmaWMgaW5pdGlhbGktCisgKiAgIHphdGlvbiBhbmQgc2V0LXVwIGZvciB0aGUgSUJNICJPYWsiIGV2YWx1YXRpb24gYm9hcmQncyBOYXRpb25hbAorICogICBTZW1pY29uZHVjdG9yIERQODM5MDJBViAiU1QtTklDIiBFdGhlcm5ldCBjb250cm9sbGVyLgorICoKKyAqIElucHV0KHMpOgorICogICBOL0EKKyAqCisgKiBPdXRwdXQocyk6CisgKiAgIE4vQQorICoKKyAqIFJldHVybnM6CisgKiAgIDAgaWYgT0ssIG90aGVyd2lzZSBzeXN0ZW0gZXJyb3IgbnVtYmVyIG9uIGVycm9yLgorICoKKyAqLworc3RhdGljIGludCBfX2luaXQgb2FrbmV0X2luaXQodm9pZCkKK3sKKwlyZWdpc3RlciBpbnQgaTsKKwlpbnQgcmVnMCwgcmVnZDsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworI2lmIDAKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IE9BS05FVF9JT19CQVNFOyAKKyNlbHNlCisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBpb3JlbWFwKE9BS05FVF9JT19CQVNFLCBPQUtORVRfSU9fU0laRSk7CisjZW5kaWYKKwliZF90ICpiaXAgPSAoYmRfdCAqKV9fcmVzOworCisJaWYgKCFpb2FkZHIpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJaWYgKCFkZXYpCisJCWdvdG8gb3V0X3VubWFwOworCisJcmV0ID0gLUVCVVNZOworCWlmICghcmVxdWVzdF9yZWdpb24oT0FLTkVUX0lPX0JBU0UsIE9BS05FVF9JT19TSVpFLCBuYW1lKSkKKwkJZ290byBvdXRfZGV2OworCisJLyogUXVpY2sgcmVnaXN0ZXIgY2hlY2sgdG8gc2VlIGlmIHRoZSBkZXZpY2UgaXMgcmVhbGx5IHRoZXJlLiAqLworCisJcmV0ID0gLUVOT0RFVjsKKwlpZiAoKHJlZzAgPSBlaV9pYnAoaW9hZGRyKSkgPT0gMHhGRikKKwkJZ290byBvdXRfcmVnaW9uOworCisJLyoKKwkgKiBUaGF0IHdvcmtlZC4gTm93IGEgbW9yZSB0aG9yb3VnaCBjaGVjaywgdXNpbmcgdGhlIG11bHRpY2FzdAorCSAqIGFkZHJlc3MgcmVnaXN0ZXJzLCB0aGF0IHRoZSBkZXZpY2UgaXMgZGVmaW5pdGVseSBvdXQgdGhlcmUKKwkgKiBhbmQgc2VtaS1mdW5jdGlvbmFsLgorCSAqLworCisJZWlfb2JwKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTEgKyBFODM5MF9TVE9QLCBpb2FkZHIgKyBFODM5MF9DTUQpOworCXJlZ2QgPSBlaV9pYnAoaW9hZGRyICsgMHgwRCk7CisJZWlfb2JwKDB4RkYsIGlvYWRkciArIDB4MEQpOworCWVpX29icChFODM5MF9OT0RNQSArIEU4MzkwX1BBR0UwLCBpb2FkZHIgKyBFODM5MF9DTUQpOworCWVpX2licChpb2FkZHIgKyBFTjBfQ09VTlRFUjApOworCisJLyogSXQncyBubyBnb29kLiBGaXggdGhpbmdzIGJhY2sgdXAgYW5kIGxlYXZlLiAqLworCisJcmV0ID0gLUVOT0RFVjsKKwlpZiAoZWlfaWJwKGlvYWRkciArIEVOMF9DT1VOVEVSMCkgIT0gMCkgeworCQllaV9vYnAocmVnMCwgaW9hZGRyKTsKKwkJZWlfb2JwKHJlZ2QsIGlvYWRkciArIDB4MEQpOworCQlnb3RvIG91dF9yZWdpb247CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJLyoKKwkgKiBUaGlzIGNvbnRyb2xsZXIgaXMgb24gYW4gZW1iZWRkZWQgYm9hcmQsIHNvIHRoZSBiYXNlIGFkZHJlc3MKKwkgKiBhbmQgaW50ZXJydXB0IGFzc2lnbm1lbnRzIGFyZSBwcmUtYXNzaWduZWQgYW5kIHVuY2hhZ2VhYmxlLgorCSAqLworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJZGV2LT5pcnEgPSBPQUtORVRfSU5UOworCisJLyoKKwkgKiBEaXNhYmxlIGFsbCBjaGlwIGludGVycnVwdHMgZm9yIG5vdyBhbmQgQUNLIGFsbCBwZW5kaW5nCisJICogaW50ZXJydXB0cy4KKwkgKi8KKworCWVpX29icCgweDAsIGlvYWRkciArIEVOMF9JTVIpOworCWVpX29icCgweEZGLCBpb2FkZHIgKyBFTjBfSVNSKTsKKworCS8qIEF0dGVtcHQgdG8gZ2V0IHRoZSBpbnRlcnJ1cHQgbGluZSAqLworCisJcmV0ID0gLUVBR0FJTjsKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGVpX2ludGVycnVwdCwgMCwgbmFtZSwgZGV2KSkgeworCQlwcmludGsoIiVzOiB1bmFibGUgdG8gcmVxdWVzdCBpbnRlcnJ1cHQgJWQuXG4iLAorCQkgICAgICAgbmFtZSwgZGV2LT5pcnEpOworCQlnb3RvIG91dF9yZWdpb247CisJfQorCisJLyogVGVsbCB0aGUgd29ybGQgYWJvdXQgd2hhdCBhbmQgd2hlcmUgd2UndmUgZm91bmQuICovCisKKwlwcmludGsoIiVzOiAlcyBhdCIsIGRldi0+bmFtZSwgbmFtZSk7CisJZm9yIChpID0gMDsgaSA8IEVUSEVSX0FERFJfTEVOOyArK2kpIHsKKwkJZGV2LT5kZXZfYWRkcltpXSA9IGJpcC0+YmlfZW5ldGFkZHJbaV07CisJCXByaW50aygiJWMlLjJ4IiwgKGkgPyAnOicgOiAnICcpLCBkZXYtPmRldl9hZGRyW2ldKTsKKwl9CisJcHJpbnRrKCIsIGZvdW5kIGF0ICUjbHgsIHVzaW5nIElSUSAlZC5cbiIsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CisKKwkvKiBTZXQgdXAgc29tZSByZXF1aXJlZCBkcml2ZXIgZmllbGRzIGFuZCB0aGVuIHdlJ3JlIGRvbmUuICovCisKKwllaV9zdGF0dXMubmFtZQkJPSBuYW1lOworCWVpX3N0YXR1cy53b3JkMTYJPSBGQUxTRTsKKwllaV9zdGF0dXMudHhfc3RhcnRfcGFnZQk9IE9BS05FVF9TVEFSVF9QRzsKKwllaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IE9BS05FVF9TVEFSVF9QRyArIFRYX1BBR0VTOworCWVpX3N0YXR1cy5zdG9wX3BhZ2UJPSBPQUtORVRfU1RPUF9QRzsKKworCWVpX3N0YXR1cy5yZXNldF84MzkwCT0gJm9ha25ldF9yZXNldF84MzkwOworCWVpX3N0YXR1cy5ibG9ja19pbnB1dAk9ICZvYWtuZXRfYmxvY2tfaW5wdXQ7CisJZWlfc3RhdHVzLmJsb2NrX291dHB1dAk9ICZvYWtuZXRfYmxvY2tfb3V0cHV0OworCWVpX3N0YXR1cy5nZXRfODM5MF9oZHIJPSAmb2FrbmV0X2dldF84MzkwX2hkcjsKKworCWRldi0+b3BlbiA9IG9ha25ldF9vcGVuOworCWRldi0+c3RvcCA9IG9ha25ldF9jbG9zZTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKKyNlbmRpZgorCisJTlM4MzkwX2luaXQoZGV2LCBGQUxTRSk7CisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfaXJxOworCQorCW9ha25ldF9kZXZzID0gZGV2OworCXJldHVybiAwOworCitvdXRfaXJxOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworb3V0X3JlZ2lvbjoKKwlyZWxlYXNlX3JlZ2lvbihPQUtORVRfSU9fQkFTRSwgT0FLTkVUX0lPX1NJWkUpOworb3V0X2RldjoKKwlmcmVlX25ldGRldihkZXYpOworb3V0X3VubWFwOgorCWlvdW5tYXAoaW9hZGRyKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogc3RhdGljIGludCBvYWtuZXRfb3BlbigpCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFRoaXMgcm91dGluZSBpcyBhIG1vZGVzdCB3cmFwcGVyIGFyb3VuZCBlaV9vcGVuLCB0aGUgODM5MC1nZW5lcmljLAorICogICBkcml2ZXIgb3BlbiByb3V0aW5lLiBUaGlzIGp1c3QgaW5jcmVtZW50cyB0aGUgbW9kdWxlIHVzYWdlIGNvdW50CisgKiAgIGFuZCBwYXNzZXMgYWxvbmcgdGhlIHN0YXR1cyBmcm9tIGVpX29wZW4uCisgKgorICogSW5wdXQocyk6CisgKiAgKmRldiAtIFBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUgZm9yIHRoaXMgZHJpdmVyLgorICoKKyAqIE91dHB1dChzKToKKyAqICAqZGV2IC0gUG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZSBmb3IgdGhpcyBkcml2ZXIsIHBvdGVudGlhbGx5CisgKiAgICAgICAgIG1vZGlmaWVkIGJ5IGVpX29wZW4uCisgKgorICogUmV0dXJuczoKKyAqICAgMCBpZiBPSywgb3RoZXJ3aXNlIDwgMCBvbiBlcnJvci4KKyAqCisgKi8KK3N0YXRpYyBpbnQKK29ha25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHN0YXR1cyA9IGVpX29wZW4oZGV2KTsKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qCisgKiBzdGF0aWMgaW50IG9ha25ldF9jbG9zZSgpCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFRoaXMgcm91dGluZSBpcyBhIG1vZGVzdCB3cmFwcGVyIGFyb3VuZCBlaV9jbG9zZSwgdGhlIDgzOTAtZ2VuZXJpYywKKyAqICAgZHJpdmVyIGNsb3NlIHJvdXRpbmUuIFRoaXMganVzdCBkZWNyZW1lbnRzIHRoZSBtb2R1bGUgdXNhZ2UgY291bnQKKyAqICAgYW5kIHBhc3NlcyBhbG9uZyB0aGUgc3RhdHVzIGZyb20gZWlfY2xvc2UuCisgKgorICogSW5wdXQocyk6CisgKiAgKmRldiAtIFBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUgZm9yIHRoaXMgZHJpdmVyLgorICoKKyAqIE91dHB1dChzKToKKyAqICAqZGV2IC0gUG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZSBmb3IgdGhpcyBkcml2ZXIsIHBvdGVudGlhbGx5CisgKiAgICAgICAgIG1vZGlmaWVkIGJ5IGVpX2Nsb3NlLgorICoKKyAqIFJldHVybnM6CisgKiAgIDAgaWYgT0ssIG90aGVyd2lzZSA8IDAgb24gZXJyb3IuCisgKgorICovCitzdGF0aWMgaW50CitvYWtuZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgc3RhdHVzID0gZWlfY2xvc2UoZGV2KTsKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qCisgKiBzdGF0aWMgdm9pZCBvYWtuZXRfcmVzZXRfODM5MCgpCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFRoaXMgcm91dGluZSByZXNldHMgdGhlIERQODM5MDIgY2hpcC4KKyAqCisgKiBJbnB1dChzKToKKyAqICAqZGV2IC0gUG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZSBmb3IgdGhpcyBkcml2ZXIuCisgKgorICogT3V0cHV0KHMpOgorICogICBOL0EKKyAqCisgKiBSZXR1cm5zOgorICogICBOL0EKKyAqCisgKi8KK3N0YXRpYyB2b2lkCitvYWtuZXRfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBiYXNlID0gRTgzOTBfQkFTRTsKKworCS8qCisJICogV2UgaGF2ZSBubyBwcm92aXNpb24gb2YgcmVzZXRpbmcgdGhlIGNvbnRyb2xsZXIgYXMgaXMgZG9uZQorCSAqIGluIG90aGVyIGRyaXZlcnMsIHN1Y2ggYXMgIm5lLmMiLiBIb3dldmVyLCB0aGUgZm9sbG93aW5nCisJICogc2VlbXMgdG8gd29yayB3ZWxsIGVub3VnaCBpbiB0aGUgVGlWbyBkcml2ZXIuCisJICovCisKKwlwcmludGsoIlJlc2V0dGluZyAlcy4uLlxuIiwgZGV2LT5uYW1lKTsKKwllaV9vYnAoRTgzOTBfU1RPUCB8IEU4MzkwX05PRE1BIHwgRTgzOTBfUEFHRTAsIGJhc2UgKyBFODM5MF9DTUQpOworCWVpX3N0YXR1cy50eGluZyA9IDA7CisJZWlfc3RhdHVzLmRtYWluZyA9IDA7Cit9CisKKy8qCisgKiBzdGF0aWMgdm9pZCBvYWtuZXRfZ2V0XzgzOTBfaGRyKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyByb3V0aW5lIGdyYWJzIHRoZSA4MzkwLXNwZWNpZmljIGhlYWRlci4gSXQncyBzaW1pbGFyIHRvIHRoZQorICogICBibG9jayBpbnB1dCByb3V0aW5lLCBidXQgd2UgZG9uJ3QgbmVlZCB0byBiZSBjb25jZXJuZWQgd2l0aCByaW5nIHdyYXAKKyAqICAgYXMgdGhlIGhlYWRlciB3aWxsIGJlIGF0IHRoZSBzdGFydCBvZiBhIHBhZ2UsIHNvIHdlIG9wdGltaXplIGFjY29yZGluZ2x5LgorICoKKyAqIElucHV0KHMpOgorICogICpkZXYgICAgICAgLSBQb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlIGZvciB0aGlzIGRyaXZlci4KKyAqICAqaGRyICAgICAgIC0gUG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgODM5MC1zcGVjaWZpYyBwYWNrZXQgaGVhZGVyLgorICogICByaW5nX3BhZ2UgLSA/CisgKgorICogT3V0cHV0KHMpOgorICogICpoZHIgICAgICAgLSBQb2ludGVyIHRvIHRoZSA4MzkwLXNwZWNpZmljIHBhY2tldCBoZWFkZXIgZm9yIHRoZSBqdXN0LQorICogICAgICAgICAgICAgICByZWNlaXZlZCBmcmFtZS4KKyAqCisgKiBSZXR1cm5zOgorICogICBOL0EKKyAqCisgKi8KK3N0YXRpYyB2b2lkCitvYWtuZXRfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsCisJCSAgICBpbnQgcmluZ19wYWdlKQoreworCWludCBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKwkvKgorCSAqIFRoaXMgc2hvdWxkIE5PVCBoYXBwZW4uIElmIGl0IGRvZXMsIGl0IGlzIHRoZSBMQVNUIHRoaW5nIHlvdSdsbAorCSAqIHNlZS4KKwkgKi8KKworCWlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJCW9ha25ldF9kbWFfZXJyb3IoZGV2LCAib2FrbmV0X2dldF84MzkwX2hkciIpOworCQlyZXR1cm47CisJfQorCisJZWlfc3RhdHVzLmRtYWluZyB8PSAweDAxOworCW91dGJfcChFODM5MF9OT0RNQSArIEU4MzkwX1BBR0UwICsgRTgzOTBfU1RBUlQsIGJhc2UgKyBPQUtORVRfQ01EKTsKKwlvdXRiX3Aoc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSwgYmFzZSArIEVOMF9SQ05UTE8pOworCW91dGJfcCgwLCBiYXNlICsgRU4wX1JDTlRISSk7CisJb3V0Yl9wKDAsIGJhc2UgKyBFTjBfUlNBUkxPKTsJCS8qIE9uIHBhZ2UgYm91bmRhcnkgKi8KKwlvdXRiX3AocmluZ19wYWdlLCBiYXNlICsgRU4wX1JTQVJISSk7CisJb3V0Yl9wKEU4MzkwX1JSRUFEICsgRTgzOTBfU1RBUlQsIGJhc2UgKyBPQUtORVRfQ01EKTsKKworCWlmIChlaV9zdGF0dXMud29yZDE2KQorCQlpbnN3KGJhc2UgKyBPQUtORVRfREFUQSwgaGRyLAorCQkgICAgIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcikgPj4gMSk7CisJZWxzZQorCQlpbnNiKGJhc2UgKyBPQUtORVRfREFUQSwgaGRyLAorCQkgICAgIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcikpOworCisJLyogQnl0ZS1zd2FwIHRoZSBwYWNrZXQgYnl0ZSBjb3VudCAqLworCisJaGRyLT5jb3VudCA9IGxlMTZfdG9fY3B1KGhkci0+Y291bnQpOworCisJb3V0Yl9wKEVOSVNSX1JEQywgYmFzZSArIEVOMF9JU1IpOwkvKiBBQ0sgUmVtb3RlIERNQSBpbnRlcnJ1cHQgKi8KKwllaV9zdGF0dXMuZG1haW5nICY9IH4weDAxOworfQorCisvKgorICogWFhYIC0gRG9jdW1lbnQgbWUuCisgKi8KK3N0YXRpYyB2b2lkCitvYWtuZXRfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICBpbnQgcmluZ19vZmZzZXQpCit7CisJaW50IGJhc2UgPSBPQUtORVRfQkFTRTsKKwljaGFyICpidWYgPSBza2ItPmRhdGE7CisKKwkvKgorCSAqIFRoaXMgc2hvdWxkIE5PVCBoYXBwZW4uIElmIGl0IGRvZXMsIGl0IGlzIHRoZSBMQVNUIHRoaW5nIHlvdSdsbAorCSAqIHNlZS4KKwkgKi8KKworCWlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJCW9ha25ldF9kbWFfZXJyb3IoZGV2LCAib2FrbmV0X2Jsb2NrX2lucHV0Iik7CisJCXJldHVybjsKKwl9CisKKyNpZmRlZiBPQUtORVRfRElTSU5UCisJc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7CisjZW5kaWYKKworCWVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKwllaV9vYnAoRTgzOTBfTk9ETUEgKyBFODM5MF9QQUdFMCArIEU4MzkwX1NUQVJULCBiYXNlICsgRTgzOTBfQ01EKTsKKwllaV9vYnAoY291bnQgJiAweGZmLCBiYXNlICsgRU4wX1JDTlRMTyk7CisJZWlfb2JwKGNvdW50ID4+IDgsIGJhc2UgKyBFTjBfUkNOVEhJKTsKKwllaV9vYnAocmluZ19vZmZzZXQgJiAweGZmLCBiYXNlICsgRU4wX1JTQVJMTyk7CisJZWlfb2JwKHJpbmdfb2Zmc2V0ID4+IDgsIGJhc2UgKyBFTjBfUlNBUkhJKTsKKwllaV9vYnAoRTgzOTBfUlJFQUQgKyBFODM5MF9TVEFSVCwgYmFzZSArIEU4MzkwX0NNRCk7CisJaWYgKGVpX3N0YXR1cy53b3JkMTYpIHsKKwkJZWlfaXN3KGJhc2UgKyBFODM5MF9EQVRBLCBidWYsIGNvdW50ID4+IDEpOworCQlpZiAoY291bnQgJiAweDAxKSB7CisJCQlidWZbY291bnQgLSAxXSA9IGVpX2liKGJhc2UgKyBFODM5MF9EQVRBKTsKKyNpZmRlZiBPQUtORVRfSEVBRENIRUNLCisJCQlieXRlcysrOworI2VuZGlmCisJCX0KKwl9IGVsc2UgeworCQllaV9pc2IoYmFzZSArIEU4MzkwX0RBVEEsIGJ1ZiwgY291bnQpOworCX0KKyNpZmRlZiBPQUtORVRfSEVBRENIRUNLCisJLyoKKwkgKiBUaGlzIHdhcyBmb3IgdGhlIEFMUEhBIHZlcnNpb24gb25seSwgYnV0IGVub3VnaCBwZW9wbGUgaGF2ZQorCSAqIGJlZW4gZW5jb3VudGVyaW5nIHByb2JsZW1zIHNvIGl0IGlzIHN0aWxsIGhlcmUuICBJZiB5b3Ugc2VlCisJICogdGhpcyBtZXNzYWdlIHlvdSBlaXRoZXIgMSkgaGF2ZSBhIHNsaWdodGx5IGluY29tcGF0aWJsZSBjbG9uZQorCSAqIG9yIDIpIGhhdmUgbm9pc2Uvc3BlZWQgcHJvYmxlbXMgd2l0aCB5b3VyIGJ1cy4KKwkgKi8KKworCS8qIERNQSB0ZXJtaW5hdGlvbiBhZGRyZXNzIGNoZWNrLi4uICovCisJeworCQlpbnQgYWRkciwgdHJpZXMgPSAyMDsKKwkJZG8geworCQkJLyogRE9OJ1QgY2hlY2sgZm9yICdlaV9pYnAoRU4wX0lTUikgJiBFTklTUl9SREMnIGhlcmUKKwkJCSAgIC0tIGl0J3MgYnJva2VuIGZvciBSeCBvbiBzb21lIGNhcmRzISAqLworCQkJaW50IGhpZ2ggPSBlaV9pYnAoYmFzZSArIEVOMF9SU0FSSEkpOworCQkJaW50IGxvdyA9IGVpX2licChiYXNlICsgRU4wX1JTQVJMTyk7CisJCQlhZGRyID0gKGhpZ2ggPDwgOCkgKyBsb3c7CisJCQlpZiAoKChyaW5nX29mZnNldCArIGJ5dGVzKSAmIDB4ZmYpID09IGxvdykKKwkJCQlicmVhazsKKwkJfSB3aGlsZSAoLS10cmllcyA+IDApOworCSAJaWYgKHRyaWVzIDw9IDApCisJCQlwcmludGsoIiVzOiBSWCB0cmFuc2ZlciBhZGRyZXNzIG1pc21hdGNoLCIKKwkJCSAgICAgICAiJSM0LjR4IChleHBlY3RlZCkgdnMuICUjNC40eCAoYWN0dWFsKS5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCByaW5nX29mZnNldCArIGJ5dGVzLCBhZGRyKTsKKwl9CisjZW5kaWYKKwllaV9vYnAoRU5JU1JfUkRDLCBiYXNlICsgRU4wX0lTUik7CS8qIEFDSyBSZW1vdGUgRE1BIGludGVycnVwdCAqLworCWVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7CisKKyNpZmRlZiBPQUtORVRfRElTSU5UCisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisjZW5kaWYKK30KKworLyoKKyAqIHN0YXRpYyB2b2lkIG9ha25ldF9ibG9ja19vdXRwdXQoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBUaGlzIHJvdXRpbmUuLi4KKyAqCisgKiBJbnB1dChzKToKKyAqICAqZGV2ICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUgZm9yIHRoaXMgZHJpdmVyLgorICogICBjb3VudCAgICAgIC0gTnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHRyYW5zZmVycmVkLgorICogICpidWYgICAgICAgIC0gCisgKiAgIHN0YXJ0X3BhZ2UgLSAKKyAqCisgKiBPdXRwdXQocyk6CisgKiAgIE4vQQorICoKKyAqIFJldHVybnM6CisgKiAgIE4vQQorICoKKyAqLworc3RhdGljIHZvaWQKK29ha25ldF9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RhcnRfcGFnZSkKK3sKKwlpbnQgYmFzZSA9IEU4MzkwX0JBU0U7CisjaWYgMAorCWludCBidWc7CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworI2lmZGVmIE9BS05FVF9ESVNJTlQKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2VuZGlmCisjaWZkZWYgT0FLTkVUX0hFQURDSEVDSworCWludCByZXRyaWVzID0gMDsKKyNlbmRpZgorCisJLyogUm91bmQgdGhlIGNvdW50IHVwIGZvciB3b3JkIHdyaXRlcy4gKi8KKworCWlmIChlaV9zdGF0dXMud29yZDE2ICYmIChjb3VudCAmIDB4MSkpCisJCWNvdW50Kys7CisKKwkvKgorCSAqIFRoaXMgc2hvdWxkIE5PVCBoYXBwZW4uIElmIGl0IGRvZXMsIGl0IGlzIHRoZSBMQVNUIHRoaW5nIHlvdSdsbAorCSAqIHNlZS4KKwkgKi8KKworCWlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJCW9ha25ldF9kbWFfZXJyb3IoZGV2LCAib2FrbmV0X2Jsb2NrX291dHB1dCIpOworCQlyZXR1cm47CisJfQorCisjaWZkZWYgT0FLTkVUX0RJU0lOVAorCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworI2VuZGlmCisKKwllaV9zdGF0dXMuZG1haW5nIHw9IDB4MDE7CisKKwkvKiBNYWtlIHN1cmUgd2UgYXJlIGluIHBhZ2UgMC4gKi8KKworCWVpX29icChFODM5MF9QQUdFMCArIEU4MzkwX1NUQVJUICsgRTgzOTBfTk9ETUEsIGJhc2UgKyBFODM5MF9DTUQpOworCisjaWZkZWYgT0FLTkVUX0hFQURDSEVDSworcmV0cnk6CisjZW5kaWYKKworI2lmIDAKKwkvKgorCSAqIFRoZSA4MzkwMiBkb2N1bWVudGF0aW9uIHN0YXRlcyB0aGF0IHRoZSBwcm9jZXNzb3IgbmVlZHMgdG8KKwkgKiBkbyBhICJkdW1teSByZWFkIiBiZWZvcmUgZG9pbmcgdGhlIHJlbW90ZSB3cml0ZSB0byB3b3JrCisJICogYXJvdW5kIGEgY2hpcCBidWcgdGhleSBkb24ndCBmZWVsIGxpa2UgZml4aW5nLgorCSAqLworCisJYnVnID0gMDsKKwl3aGlsZSAoMSkgeworCQl1bnNpZ25lZCBpbnQgcmRoaTsKKwkJdW5zaWduZWQgaW50IHJkbG87CisKKwkJLyogTm93IHRoZSBub3JtYWwgb3V0cHV0LiAqLworCQllaV9vYnAoRU5JU1JfUkRDLCBiYXNlICsgRU4wX0lTUik7CisJCWVpX29icChjb3VudCAmIDB4ZmYsIGJhc2UgKyBFTjBfUkNOVExPKTsKKwkJZWlfb2JwKGNvdW50ID4+IDgsICAgYmFzZSArIEVOMF9SQ05USEkpOworCQllaV9vYnAoMHgwMCwgYmFzZSArIEVOMF9SU0FSTE8pOworCQllaV9vYnAoc3RhcnRfcGFnZSwgYmFzZSArIEVOMF9SU0FSSEkpOworCisJCWlmIChidWcrKykKKwkJCWJyZWFrOworCisJCS8qIFBlcmZvcm0gdGhlIGR1bW15IHJlYWQgKi8KKwkJcmRoaSA9IGVpX2licChiYXNlICsgRU4wX0NSREFISSk7CisJCXJkbG8gPSBlaV9pYnAoYmFzZSArIEVOMF9DUkRBTE8pOworCQllaV9vYnAoRTgzOTBfUlJFQUQgKyBFODM5MF9TVEFSVCwgYmFzZSArIEU4MzkwX0NNRCk7CisKKwkJd2hpbGUgKDEpIHsKKwkJCXVuc2lnbmVkIGludCBucmRoaTsKKwkJCXVuc2lnbmVkIGludCBucmRsbzsKKwkJCW5yZGhpID0gZWlfaWJwKGJhc2UgKyBFTjBfQ1JEQUhJKTsKKwkJCW5yZGxvID0gZWlfaWJwKGJhc2UgKyBFTjBfQ1JEQUxPKTsKKwkJCWlmICgocmRoaSAhPSBucmRoaSkgfHwgKHJkbG8gIT0gbnJkbG8pKQorCQkJCWJyZWFrOworCQl9CisJfQorI2Vsc2UKKyNpZmRlZiBPQUtORVRfUldGSVgKKwkvKgorCSAqIEhhbmRsZSB0aGUgcmVhZC1iZWZvcmUtd3JpdGUgYnVnIHRoZSBzYW1lIHdheSBhcyB0aGUKKwkgKiBDcnlud3IgcGFja2V0IGRyaXZlciAtLSB0aGUgTmF0J2wgU2VtaS4gbWV0aG9kIGRvZXNuJ3Qgd29yay4KKwkgKiBBY3R1YWxseSB0aGlzIGRvZXNuJ3QgYWx3YXlzIHdvcmsgZWl0aGVyLCBidXQgaWYgeW91IGhhdmUKKwkgKiBwcm9ibGVtcyB3aXRoIHlvdXIgODM5MDIgdGhpcyBpcyBiZXR0ZXIgdGhhbiBub3RoaW5nIQorCSAqLworCisJZWlfb2JwKDB4NDIsIGJhc2UgKyBFTjBfUkNOVExPKTsKKwllaV9vYnAoMHgwMCwgYmFzZSArIEVOMF9SQ05USEkpOworCWVpX29icCgweDQyLCBiYXNlICsgRU4wX1JTQVJMTyk7CisJZWlfb2JwKDB4MDAsIGJhc2UgKyBFTjBfUlNBUkhJKTsKKwllaV9vYnAoRTgzOTBfUlJFQUQgKyBFODM5MF9TVEFSVCwgYmFzZSArIEU4MzkwX0NNRCk7CisJLyogTWFrZSBjZXJ0YWluIHRoYXQgdGhlIGR1bW15IHJlYWQgaGFzIG9jY3VycmVkLiAqLworCXVkZWxheSg2KTsKKyNlbmRpZgorCisJZWlfb2JwKEVOSVNSX1JEQywgYmFzZSArIEVOMF9JU1IpOworCisJLyogTm93IHRoZSBub3JtYWwgb3V0cHV0LiAqLworCWVpX29icChjb3VudCAmIDB4ZmYsIGJhc2UgKyBFTjBfUkNOVExPKTsKKwllaV9vYnAoY291bnQgPj4gOCwgICBiYXNlICsgRU4wX1JDTlRISSk7CisJZWlfb2JwKDB4MDAsIGJhc2UgKyBFTjBfUlNBUkxPKTsKKwllaV9vYnAoc3RhcnRfcGFnZSwgYmFzZSArIEVOMF9SU0FSSEkpOworI2VuZGlmIC8qIDAvMSAqLworCisJZWlfb2JwKEU4MzkwX1JXUklURSArIEU4MzkwX1NUQVJULCBiYXNlICsgRTgzOTBfQ01EKTsKKwlpZiAoZWlfc3RhdHVzLndvcmQxNikgeworCQllaV9vc3coRTgzOTBfQkFTRSArIEU4MzkwX0RBVEEsIGJ1ZiwgY291bnQgPj4gMSk7CisJfSBlbHNlIHsKKwkJZWlfb3NiKEU4MzkwX0JBU0UgKyBFODM5MF9EQVRBLCBidWYsIGNvdW50KTsKKwl9CisKKyNpZmRlZiBPQUtORVRfRElTSU5UCisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisjZW5kaWYKKworCXN0YXJ0ID0gamlmZmllczsKKworI2lmZGVmIE9BS05FVF9IRUFEQ0hFQ0sKKwkvKgorCSAqIFRoaXMgd2FzIGZvciB0aGUgQUxQSEEgdmVyc2lvbiBvbmx5LCBidXQgZW5vdWdoIHBlb3BsZSBoYXZlCisJICogYmVlbiBlbmNvdW50ZXJpbmcgcHJvYmxlbXMgc28gaXQgaXMgc3RpbGwgaGVyZS4KKwkgKi8KKwkKKwl7CisJCS8qIERNQSB0ZXJtaW5hdGlvbiBhZGRyZXNzIGNoZWNrLi4uICovCisJCWludCBhZGRyLCB0cmllcyA9IDIwOworCQlkbyB7CisJCQlpbnQgaGlnaCA9IGVpX2licChiYXNlICsgRU4wX1JTQVJISSk7CisJCQlpbnQgbG93ID0gZWlfaWJwKGJhc2UgKyBFTjBfUlNBUkxPKTsKKwkJCWFkZHIgPSAoaGlnaCA8PCA4KSArIGxvdzsKKwkJCWlmICgoc3RhcnRfcGFnZSA8PCA4KSArIGNvdW50ID09IGFkZHIpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKC0tdHJpZXMgPiAwKTsKKworCQlpZiAodHJpZXMgPD0gMCkgeworCQkJcHJpbnRrKCIlczogVHggcGFja2V0IHRyYW5zZmVyIGFkZHJlc3MgbWlzbWF0Y2gsIgorCQkJICAgICAgICIlIzQuNHggKGV4cGVjdGVkKSB2cy4gJSM0LjR4IChhY3R1YWwpLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIChzdGFydF9wYWdlIDw8IDgpICsgY291bnQsIGFkZHIpOworCQkJaWYgKHJldHJpZXMrKyA9PSAwKQorCQkJCWdvdG8gcmV0cnk7CisJCX0KKwl9CisjZW5kaWYKKworCXdoaWxlICgoZWlfaWJwKGJhc2UgKyBFTjBfSVNSKSAmIEVOSVNSX1JEQykgPT0gMCkgeworCQlpZiAoamlmZmllcyAtIHN0YXJ0ID4gT0FLTkVUX1dBSVQpIHsKKwkJCXByaW50aygiJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IgVHggUkRDLlxuIiwgZGV2LT5uYW1lKTsKKwkJCW9ha25ldF9yZXNldF84MzkwKGRldik7CisJCQlOUzgzOTBfaW5pdChkZXYsIFRSVUUpOworCQkJYnJlYWs7CisJCX0KKwl9CisJCisJZWlfb2JwKEVOSVNSX1JEQywgYmFzZSArIEVOMF9JU1IpOwkvKiBBY2sgaW50ci4gKi8KKwllaV9zdGF0dXMuZG1haW5nICY9IH4weDAxOworfQorCisvKgorICogc3RhdGljIHZvaWQgb2FrbmV0X2RtYV9lcnJvcigpCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFRoaXMgcm91dGluZSBwcmludHMgb3V0IGEgbGFzdC1kaXRjaCBpbmZvcm1hdGl2ZSBtZXNzYWdlIHRvIHRoZSBjb25zb2xlCisgKiAgIGluZGljYXRpbmcgdGhhdCBhIERNQSBlcnJvciBvY2N1cnJlZC4gSWYgeW91IHNlZSB0aGlzLCBpdCdzIHRoZSBsYXN0CisgKiAgIHRoaW5nIHlvdSdsbCBzZWUuCisgKgorICogSW5wdXQocyk6CisgKiAgKmRldiAgLSBQb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlIGZvciB0aGlzIGRyaXZlci4KKyAqICAqbmFtZSAtIEluZm9ybWF0aXZlIHRleHQgKGUuZy4gZnVuY3Rpb24gbmFtZSkgaW5kaWNhdGluZyB3aGVyZSB0aGUKKyAqICAgICAgICAgIERNQSBlcnJvciBvY2N1cnJlZC4KKyAqCisgKiBPdXRwdXQocyk6CisgKiAgIE4vQQorICoKKyAqIFJldHVybnM6CisgKiAgIE4vQQorICoKKyAqLworc3RhdGljIHZvaWQKK29ha25ldF9kbWFfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlwcmludGsoS0VSTl9FTUVSRyAiJXM6IERNQWluZyBjb25mbGljdCBpbiAlcy4iCisJICAgICAgICJbRE1Bc3RhdDolZF1baXJxbG9jazolZF1baW50cjolbGRdXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIG5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrLAorCSAgICAgICBkZXYtPmludGVycnVwdCk7Cit9CisKKy8qCisgKiBPYWsgRXRoZXJuZXQgbW9kdWxlIHVubG9hZCBpbnRlcmZhY2UuCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBvYWtuZXRfY2xlYW51cF9tb2R1bGUgKHZvaWQpCit7CisJLyogQ29udmVydCB0byBsb29wIG9uY2UgZHJpdmVyIHN1cHBvcnRzIG11bHRpcGxlIGRldmljZXMuICovCisJdW5yZWdpc3Rlcl9uZXRkZXYob2FrbmV0X2Rldik7CisJZnJlZV9pcnEob2FrbmV0X2RldnMtPmlycSwgb2FrbmV0X2RldnMpOworCXJlbGVhc2VfcmVnaW9uKG9ha25ldF9kZXZzLT5iYXNlX2FkZHIsIE9BS05FVF9JT19TSVpFKTsKKwlpb3VubWFwKGlvYWRkcik7CisJZnJlZV9uZXRkZXYob2FrbmV0X2RldnMpOworfQorCittb2R1bGVfaW5pdChvYWtuZXRfaW5pdCk7Cittb2R1bGVfZXhpdChvYWtuZXRfY2xlYW51cF9tb2R1bGUpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNpLXNrZWxldG9uLmMgYi9kcml2ZXJzL25ldC9wY2ktc2tlbGV0b24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjFjM2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcGNpLXNrZWxldG9uLmMKQEAgLTAsMCArMSwxOTc3IEBACisvKgorCisJZHJpdmVycy9uZXQvcGNpLXNrZWxldG9uLmMKKworCU1haW50YWluZWQgYnkgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorCisJT3JpZ2luYWwgY29kZSBjYW1lIGZyb20gODEzOXRvby5jLCB3aGljaCBpbiB0dXJucyB3YXMgYmFzZWQKKwlvcmlnaW5hbGx5IG9uIERvbmFsZCBCZWNrZXIncyBydGw4MTM5LmMgZHJpdmVyLCB2ZXJzaW9ucyAxLjExCisJYW5kIG9sZGVyLiAgVGhpcyBkcml2ZXIgd2FzIG9yaWdpbmFsbHkgYmFzZWQgb24gcnRsODEzOS5jCisJdmVyc2lvbiAxLjA3LiAgSGVhZGVyIG9mIHJ0bDgxMzkuYyB2ZXJzaW9uIDEuMTE6CisKKwktLS0tLTxzbmlwPi0tLS0tCisKKyAgICAgICAgCVdyaXR0ZW4gMTk5Ny0yMDAwIGJ5IERvbmFsZCBCZWNrZXIuCisJCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUKKwkJdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQKKwkJaGVyZWluIGJ5IHJlZmVyZW5jZS4gIERyaXZlcnMgYmFzZWQgb24gb3IgZGVyaXZlZCBmcm9tIHRoaXMKKwkJY29kZSBmYWxsIHVuZGVyIHRoZSBHUEwgYW5kIG11c3QgcmV0YWluIHRoZSBhdXRob3JzaGlwLAorCQljb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlLiAgVGhpcyBmaWxlIGlzIG5vdCBhIGNvbXBsZXRlCisJCXByb2dyYW0gYW5kIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgZW50aXJlIG9wZXJhdGluZworCQlzeXN0ZW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4KKworCQlUaGlzIGRyaXZlciBpcyBmb3IgYm9hcmRzIGJhc2VkIG9uIHRoZSBSVEw4MTI5IGFuZCBSVEw4MTM5CisJCVBDSSBldGhlcm5ldCBjaGlwcy4KKworCQlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTyBTY3lsZAorCQlDb21wdXRpbmcgQ29ycG9yYXRpb24gNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAgQW5uYXBvbGlzCisJCU1EIDIxNDAzCisKKwkJU3VwcG9ydCBhbmQgdXBkYXRlcyBhdmFpbGFibGUgYXQKKwkJaHR0cDovL3d3dy5zY3lsZC5jb20vbmV0d29yay9ydGw4MTM5Lmh0bWwKKworCQlUd2lzdGVyLXR1bmluZyB0YWJsZSBwcm92aWRlZCBieSBLaW5zdG9uCisJCTxzaGFuZ2hAcmVhbHRlay5jb20udHc+LgorCisJLS0tLS08c25pcD4tLS0tLQorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCQkJCVRoZW9yeSBvZiBPcGVyYXRpb24KKworSS4gQm9hcmQgQ29tcGF0aWJpbGl0eQorCitUaGlzIGRldmljZSBkcml2ZXIgaXMgZGVzaWduZWQgZm9yIHRoZSBSZWFsVGVrIFJUTDgxMzkgc2VyaWVzLCB0aGUgUmVhbFRlaworRmFzdCBFdGhlcm5ldCBjb250cm9sbGVycyBmb3IgUENJIGFuZCBDYXJkQnVzLiAgVGhpcyBjaGlwIGlzIHVzZWQgb24gbWFueQorbG93LWVuZCBib2FyZHMsIHNvbWV0aW1lcyB3aXRoIGl0cyBtYXJraW5ncyBjaGFuZ2VkLgorCisKK0lJLiBCb2FyZC1zcGVjaWZpYyBzZXR0aW5ncworCitQQ0kgYnVzIGRldmljZXMgYXJlIGNvbmZpZ3VyZWQgYnkgdGhlIHN5c3RlbSBhdCBib290IHRpbWUsIHNvIG5vIGp1bXBlcnMKK25lZWQgdG8gYmUgc2V0IG9uIHRoZSBib2FyZC4gIFRoZSBzeXN0ZW0gQklPUyB3aWxsIGFzc2lnbiB0aGUKK1BDSSBJTlRBIHNpZ25hbCB0byBhIChwcmVmZXJhYmx5IG90aGVyd2lzZSB1bnVzZWQpIHN5c3RlbSBJUlEgbGluZS4KKworSUlJLiBEcml2ZXIgb3BlcmF0aW9uCisKK0lJSWEuIFJ4IFJpbmcgYnVmZmVycworCitUaGUgcmVjZWl2ZSB1bml0IHVzZXMgYSBzaW5nbGUgbGluZWFyIHJpbmcgYnVmZmVyIHJhdGhlciB0aGFuIHRoZSBtb3JlCitjb21tb24gKGFuZCBtb3JlIGVmZmljaWVudCkgZGVzY3JpcHRvci1iYXNlZCBhcmNoaXRlY3R1cmUuICBJbmNvbWluZyBmcmFtZXMKK2FyZSBzZXF1ZW50aWFsbHkgc3RvcmVkIGludG8gdGhlIFJ4IHJlZ2lvbiwgYW5kIHRoZSBob3N0IGNvcGllcyB0aGVtIGludG8KK3NrYnVmZnMuCisKK0NvbW1lbnQ6IFdoaWxlIGl0IGlzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgdG8gcHJvY2VzcyBtYW55IGZyYW1lcyBpbiBwbGFjZSwKK2FueSBkZWxheSBpbiBSeCBwcm9jZXNzaW5nIHdvdWxkIGNhdXNlIHVzIHRvIGRyb3AgZnJhbWVzLiAgTW9yZSBpbXBvcnRhbnRseSwKK3RoZSBMaW51eCBwcm90b2NvbCBzdGFjayBpcyBub3QgZGVzaWduZWQgdG8gb3BlcmF0ZSBpbiB0aGlzIG1hbm5lci4KKworSUlJYi4gVHggb3BlcmF0aW9uCisKK1RoZSBSVEw4MTM5IHVzZXMgYSBmaXhlZCBzZXQgb2YgZm91ciBUeCBkZXNjcmlwdG9ycyBpbiByZWdpc3RlciBzcGFjZS4KK0luIGEgc3R1bm5pbmdseSBiYWQgZGVzaWduIGNob2ljZSwgVHggZnJhbWVzIG11c3QgYmUgMzIgYml0IGFsaWduZWQuICBMaW51eAorYWxpZ25zIHRoZSBJUCBoZWFkZXIgb24gd29yZCBib3VuZGFyaWVzLCBhbmQgMTQgYnl0ZSBldGhlcm5ldCBoZWFkZXIgbWVhbnMKK3RoYXQgYWxtb3N0IGFsbCBmcmFtZXMgd2lsbCBuZWVkIHRvIGJlIGNvcGllZCB0byBhbiBhbGlnbm1lbnQgYnVmZmVyLgorCitJVmIuIFJlZmVyZW5jZXMKKworaHR0cDovL3d3dy5yZWFsdGVrLmNvbS50dy9jbi9jbi5odG1sCitodHRwOi8vd3d3LnNjeWxkLmNvbS9leHBlcnQvTldheS5odG1sCisKK0lWYy4gRXJyYXRhCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIE5FVERSVl9WRVJTSU9OCQkiMS4wLjAiCisjZGVmaW5lIE1PRE5BTUUJCQkibmV0ZHJ2IgorI2RlZmluZSBORVREUlZfRFJJVkVSX0xPQURfTVNHCSJNeVZlbmRvciBGYXN0IEV0aGVybmV0IGRyaXZlciAiIE5FVERSVl9WRVJTSU9OICIgbG9hZGVkIgorI2RlZmluZSBQRlgJCQlNT0ROQU1FICI6ICIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorS0VSTl9JTkZPIE5FVERSVl9EUklWRVJfTE9BRF9NU0cgIlxuIgorS0VSTl9JTkZPICIgIFN1cHBvcnQgYXZhaWxhYmxlIGZyb20gaHR0cDovL2Zvby5jb20vYmFyL2Jhei5odG1sXG4iOworCisvKiBkZWZpbmUgdG8gMSB0byBlbmFibGUgUElPIGluc3RlYWQgb2YgTU1JTyAqLworI3VuZGVmIFVTRV9JT19PUFMKKworLyogZGVmaW5lIHRvIDEgdG8gZW5hYmxlIGNvcGlvdXMgZGVidWdnaW5nIGluZm8gKi8KKyN1bmRlZiBORVREUlZfREVCVUcKKworLyogZGVmaW5lIHRvIDEgdG8gZGlzYWJsZSBsaWdodHdlaWdodCBydW50aW1lIGRlYnVnZ2luZyBjaGVja3MgKi8KKyN1bmRlZiBORVREUlZfTkRFQlVHCisKKworI2lmZGVmIE5FVERSVl9ERUJVRworLyogbm90ZTogcHJpbnRzIGZ1bmN0aW9uIG5hbWUgZm9yIHlvdSAqLworIyAgZGVmaW5lIERQUklOVEsoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKQorI2Vsc2UKKyMgIGRlZmluZSBEUFJJTlRLKGZtdCwgYXJncy4uLikKKyNlbmRpZgorCisjaWZkZWYgTkVURFJWX05ERUJVRworIyAgZGVmaW5lIGFzc2VydChleHByKSBkbyB7fSB3aGlsZSAoMCkKKyNlbHNlCisjICBkZWZpbmUgYXNzZXJ0KGV4cHIpIFwKKyAgICAgICAgaWYoIShleHByKSkgewkJCQkJXAorICAgICAgICBwcmludGsoICJBc3NlcnRpb24gZmFpbGVkISAlcywlcywlcyxsaW5lPSVkXG4iLAlcCisgICAgICAgICNleHByLF9fRklMRV9fLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7CQlcCisgICAgICAgIH0KKyNlbmRpZgorCisKKy8qIEEgZmV3IHVzZXItY29uZmlndXJhYmxlIHZhbHVlcy4gKi8KKy8qIG1lZGlhIG9wdGlvbnMgKi8KK3N0YXRpYyBpbnQgbWVkaWFbXSA9IHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9OworCisvKiBNYXhpbXVtIGV2ZW50cyAoUnggcGFja2V0cywgZXRjLikgdG8gaGFuZGxlIGF0IGVhY2ggaW50ZXJydXB0LiAqLworc3RhdGljIGludCBtYXhfaW50ZXJydXB0X3dvcmsgPSAyMDsKKworLyogTWF4aW11bSBudW1iZXIgb2YgbXVsdGljYXN0IGFkZHJlc3NlcyB0byBmaWx0ZXIgKHZzLiBSeC1hbGwtbXVsdGljYXN0KS4KKyAgIFRoZSBSVEwgY2hpcHMgdXNlIGEgNjQgZWxlbWVudCBoYXNoIHRhYmxlIGJhc2VkIG9uIHRoZSBFdGhlcm5ldCBDUkMuICAqLworc3RhdGljIGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gMzI7CisKKy8qIFNpemUgb2YgdGhlIGluLW1lbW9yeSByZWNlaXZlIHJpbmcuICovCisjZGVmaW5lIFJYX0JVRl9MRU5fSURYCTIJLyogMD09OEssIDE9PTE2SywgMj09MzJLLCAzPT02NEsgKi8KKyNkZWZpbmUgUlhfQlVGX0xFTiAoODE5MiA8PCBSWF9CVUZfTEVOX0lEWCkKKyNkZWZpbmUgUlhfQlVGX1BBRCAxNgorI2RlZmluZSBSWF9CVUZfV1JBUF9QQUQgMjA0OCAvKiBzcGFyZSBwYWRkaW5nIHRvIGhhbmRsZSBsYWNrIG9mIHBhY2tldCB3cmFwICovCisjZGVmaW5lIFJYX0JVRl9UT1RfTEVOIChSWF9CVUZfTEVOICsgUlhfQlVGX1BBRCArIFJYX0JVRl9XUkFQX1BBRCkKKworLyogTnVtYmVyIG9mIFR4IGRlc2NyaXB0b3IgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBOVU1fVFhfREVTQwk0CisKKy8qIG1heCBzdXBwb3J0ZWQgZXRoZXJuZXQgZnJhbWUgc2l6ZSAtLSBtdXN0IGJlIGF0IGxlYXN0IChkZXYtPm10dSsxNCs0KS4qLworI2RlZmluZSBNQVhfRVRIX0ZSQU1FX1NJWkUJMTUzNgorCisvKiBTaXplIG9mIHRoZSBUeCBib3VuY2UgYnVmZmVycyAtLSBtdXN0IGJlIGF0IGxlYXN0IChkZXYtPm10dSsxNCs0KS4gKi8KKyNkZWZpbmUgVFhfQlVGX1NJWkUJTUFYX0VUSF9GUkFNRV9TSVpFCisjZGVmaW5lIFRYX0JVRl9UT1RfTEVOCShUWF9CVUZfU0laRSAqIE5VTV9UWF9ERVNDKQorCisvKiBQQ0kgVHVuaW5nIFBhcmFtZXRlcnMKKyAgIFRocmVzaG9sZCBpcyBieXRlcyB0cmFuc2ZlcnJlZCB0byBjaGlwIGJlZm9yZSB0cmFuc21pc3Npb24gc3RhcnRzLiAqLworI2RlZmluZSBUWF9GSUZPX1RIUkVTSCAyNTYJLyogSW4gYnl0ZXMsIHJvdW5kZWQgZG93biB0byAzMiBieXRlIHVuaXRzLiAqLworCisvKiBUaGUgZm9sbG93aW5nIHNldHRpbmdzIGFyZSBsb2dfMihieXRlcyktNDogIDAgPT0gMTYgYnl0ZXMgLi4gNj09MTAyNCwgNz09ZW5kIG9mIHBhY2tldC4gKi8KKyNkZWZpbmUgUlhfRklGT19USFJFU0gJNgkvKiBSeCBidWZmZXIgbGV2ZWwgYmVmb3JlIGZpcnN0IFBDSSB4ZmVyLiAgKi8KKyNkZWZpbmUgUlhfRE1BX0JVUlNUCTYJLyogTWF4aW11bSBQQ0kgYnVyc3QsICc2JyBpcyAxMDI0ICovCisjZGVmaW5lIFRYX0RNQV9CVVJTVAk2CS8qIE1heGltdW0gUENJIGJ1cnN0LCAnNicgaXMgMTAyNCAqLworCisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCB1c3VhbGx5IGFyZSBub3QgY2hhbmdlZC4gKi8KKy8qIFRpbWUgaW4gamlmZmllcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZy4gKi8KKyNkZWZpbmUgVFhfVElNRU9VVCAgKDYqSFopCisKKworZW51bSB7CisJSEFTX0NISVBfWENWUiA9IDB4MDIwMDAwLAorCUhBU19MTktfQ0hORyA9IDB4MDQwMDAwLAorfTsKKworI2RlZmluZSBORVREUlZfTUlOX0lPX1NJWkUgMHg4MAorI2RlZmluZSBSVEw4MTM5Ql9JT19TSVpFIDI1NgorCisjZGVmaW5lIE5FVERSVl9DQVBTCUhBU19DSElQX1hDVlJ8SEFTX0xOS19DSE5HCisKK3R5cGVkZWYgZW51bSB7CisJUlRMODEzOSA9IDAsCisJTkVURFJWX0NCLAorCVNNQzEyMTFUWCwKKwkvKk1QWDUwMzAsKi8KKwlERUxUQTgxMzksCisJQUREVFJPTjgxMzksCit9IGJvYXJkX3Q7CisKKworLyogaW5kZXhlZCBieSBib2FyZF90LCBhYm92ZSAqLworc3RhdGljIHN0cnVjdCB7CisJY29uc3QgY2hhciAqbmFtZTsKK30gYm9hcmRfaW5mb1tdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyAiUmVhbFRlayBSVEw4MTM5IEZhc3QgRXRoZXJuZXQiIH0sCisJeyAiUmVhbFRlayBSVEw4MTM5QiBQQ0kvQ2FyZEJ1cyIgfSwKKwl7ICJTTUMxMjExVFggRVpDYXJkIDEwLzEwMCAoUmVhbFRlayBSVEw4MTM5KSIgfSwKKy8qCXsgTVBYNTAzMCwgIkFjY3RvbiBNUFg1MDMwIChSZWFsVGVrIFJUTDgxMzkpIiB9LCovCisJeyAiRGVsdGEgRWxlY3Ryb25pY3MgODEzOSAxMC8xMDBCYXNlVFgiIH0sCisJeyAiQWRkdHJvbiBUZWNobm9sZ3kgODEzOSAxMC8xMDBCYXNlVFgiIH0sCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBuZXRkcnZfcGNpX3RibFtdID0geworCXsweDEwZWMsIDB4ODEzOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUlRMODEzOSB9LAorCXsweDEwZWMsIDB4ODEzOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTkVURFJWX0NCIH0sCisJezB4MTExMywgMHgxMjExLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBTTUMxMjExVFggfSwKKy8qCXsweDExMTMsIDB4MTIxMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVBYNTAzMCB9LCovCisJezB4MTUwMCwgMHgxMzYwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBERUxUQTgxMzkgfSwKKwl7MHg0MDMzLCAweDEzNjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEFERFRST044MTM5IH0sCisJezAsfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgbmV0ZHJ2X3BjaV90YmwpOworCisKKy8qIFRoZSByZXN0IG9mIHRoZXNlIHZhbHVlcyBzaG91bGQgbmV2ZXIgY2hhbmdlLiAqLworCisvKiBTeW1ib2xpYyBvZmZzZXRzIHRvIHJlZ2lzdGVycy4gKi8KK2VudW0gTkVURFJWX3JlZ2lzdGVycyB7CisJTUFDMCA9IDAsCQkvKiBFdGhlcm5ldCBoYXJkd2FyZSBhZGRyZXNzLiAqLworCU1BUjAgPSA4LAkJLyogTXVsdGljYXN0IGZpbHRlci4gKi8KKwlUeFN0YXR1czAgPSAweDEwLAkvKiBUcmFuc21pdCBzdGF0dXMgKEZvdXIgMzJiaXQgcmVnaXN0ZXJzKS4gKi8KKwlUeEFkZHIwID0gMHgyMCwJCS8qIFR4IGRlc2NyaXB0b3JzIChhbHNvIGZvdXIgMzJiaXQpLiAqLworCVJ4QnVmID0gMHgzMCwKKwlSeEVhcmx5Q250ID0gMHgzNCwKKwlSeEVhcmx5U3RhdHVzID0gMHgzNiwKKwlDaGlwQ21kID0gMHgzNywKKwlSeEJ1ZlB0ciA9IDB4MzgsCisJUnhCdWZBZGRyID0gMHgzQSwKKwlJbnRyTWFzayA9IDB4M0MsCisJSW50clN0YXR1cyA9IDB4M0UsCisJVHhDb25maWcgPSAweDQwLAorCUNoaXBWZXJzaW9uID0gMHg0MywKKwlSeENvbmZpZyA9IDB4NDQsCisJVGltZXIgPSAweDQ4LAkJLyogQSBnZW5lcmFsLXB1cnBvc2UgY291bnRlci4gKi8KKwlSeE1pc3NlZCA9IDB4NEMsCS8qIDI0IGJpdHMgdmFsaWQsIHdyaXRlIGNsZWFycy4gKi8KKwlDZmc5MzQ2ID0gMHg1MCwKKwlDb25maWcwID0gMHg1MSwKKwlDb25maWcxID0gMHg1MiwKKwlGbGFzaFJlZyA9IDB4NTQsCisJTWVkaWFTdGF0dXMgPSAweDU4LAorCUNvbmZpZzMgPSAweDU5LAorCUNvbmZpZzQgPSAweDVBLAkJLyogYWJzZW50IG9uIFJUTC04MTM5QSAqLworCUhsdENsayA9IDB4NUIsCisJTXVsdGlJbnRyID0gMHg1QywKKwlUeFN1bW1hcnkgPSAweDYwLAorCUJhc2ljTW9kZUN0cmwgPSAweDYyLAorCUJhc2ljTW9kZVN0YXR1cyA9IDB4NjQsCisJTldheUFkdmVydCA9IDB4NjYsCisJTldheUxQQVIgPSAweDY4LAorCU5XYXlFeHBhbnNpb24gPSAweDZBLAorCS8qIFVuZG9jdW1lbnRlZCByZWdpc3RlcnMsIGJ1dCByZXF1aXJlZCBmb3IgcHJvcGVyIG9wZXJhdGlvbi4gKi8KKwlGSUZPVE1TID0gMHg3MCwJCS8qIEZJRk8gQ29udHJvbCBhbmQgdGVzdC4gKi8KKwlDU0NSID0gMHg3NCwJCS8qIENoaXAgU3RhdHVzIGFuZCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLiAqLworCVBBUkE3OCA9IDB4NzgsCisJUEFSQTdjID0gMHg3YywJCS8qIE1hZ2ljIHRyYW5zY2VpdmVyIHBhcmFtZXRlciByZWdpc3Rlci4gKi8KKwlDb25maWc1ID0gMHhEOCwJCS8qIGFic2VudCBvbiBSVEwtODEzOUEgKi8KK307CisKK2VudW0gQ2xlYXJCaXRNYXNrcyB7CisJTXVsdGlJbnRyQ2xlYXIgPSAweEYwMDAsCisJQ2hpcENtZENsZWFyID0gMHhFMiwKKwlDb25maWcxQ2xlYXIgPSAoMTw8Nyl8KDE8PDYpfCgxPDwzKXwoMTw8Mil8KDE8PDEpLAorfTsKKworZW51bSBDaGlwQ21kQml0cyB7CisJQ21kUmVzZXQgPSAweDEwLAorCUNtZFJ4RW5iID0gMHgwOCwKKwlDbWRUeEVuYiA9IDB4MDQsCisJUnhCdWZFbXB0eSA9IDB4MDEsCit9OworCisvKiBJbnRlcnJ1cHQgcmVnaXN0ZXIgYml0cywgdXNpbmcgbXkgb3duIG1lYW5pbmdmdWwgbmFtZXMuICovCitlbnVtIEludHJTdGF0dXNCaXRzIHsKKwlQQ0lFcnIgPSAweDgwMDAsCisJUENTVGltZW91dCA9IDB4NDAwMCwKKwlSeEZJRk9PdmVyID0gMHg0MCwKKwlSeFVuZGVycnVuID0gMHgyMCwKKwlSeE92ZXJmbG93ID0gMHgxMCwKKwlUeEVyciA9IDB4MDgsCisJVHhPSyA9IDB4MDQsCisJUnhFcnIgPSAweDAyLAorCVJ4T0sgPSAweDAxLAorfTsKK2VudW0gVHhTdGF0dXNCaXRzIHsKKwlUeEhvc3RPd25zID0gMHgyMDAwLAorCVR4VW5kZXJydW4gPSAweDQwMDAsCisJVHhTdGF0T0sgPSAweDgwMDAsCisJVHhPdXRPZldpbmRvdyA9IDB4MjAwMDAwMDAsCisJVHhBYm9ydGVkID0gMHg0MDAwMDAwMCwKKwlUeENhcnJpZXJMb3N0ID0gMHg4MDAwMDAwMCwKK307CitlbnVtIFJ4U3RhdHVzQml0cyB7CisJUnhNdWx0aWNhc3QgPSAweDgwMDAsCisJUnhQaHlzaWNhbCA9IDB4NDAwMCwKKwlSeEJyb2FkY2FzdCA9IDB4MjAwMCwKKwlSeEJhZFN5bWJvbCA9IDB4MDAyMCwKKwlSeFJ1bnQgPSAweDAwMTAsCisJUnhUb29Mb25nID0gMHgwMDA4LAorCVJ4Q1JDRXJyID0gMHgwMDA0LAorCVJ4QmFkQWxpZ24gPSAweDAwMDIsCisJUnhTdGF0dXNPSyA9IDB4MDAwMSwKK307CisKKy8qIEJpdHMgaW4gUnhDb25maWcuICovCitlbnVtIHJ4X21vZGVfYml0cyB7CisJQWNjZXB0RXJyID0gMHgyMCwKKwlBY2NlcHRSdW50ID0gMHgxMCwKKwlBY2NlcHRCcm9hZGNhc3QgPSAweDA4LAorCUFjY2VwdE11bHRpY2FzdCA9IDB4MDQsCisJQWNjZXB0TXlQaHlzID0gMHgwMiwKKwlBY2NlcHRBbGxQaHlzID0gMHgwMSwKK307CisKKy8qIEJpdHMgaW4gVHhDb25maWcuICovCitlbnVtIHR4X2NvbmZpZ19iaXRzIHsKKwlUeElGRzEgPSAoMSA8PCAyNSksCS8qIEludGVyZnJhbWUgR2FwIFRpbWUgKi8KKwlUeElGRzAgPSAoMSA8PCAyNCksCS8qIEVuYWJsaW5nIHRoZXNlIGJpdHMgdmlvbGF0ZXMgSUVFRSA4MDIuMyAqLworCVR4TG9vcEJhY2sgPSAoMSA8PCAxOCkgfCAoMSA8PCAxNyksIC8qIGVuYWJsZSBsb29wYmFjayB0ZXN0IG1vZGUgKi8KKwlUeENSQyA9ICgxIDw8IDE2KSwJLyogRElTQUJMRSBhcHBlbmRpbmcgQ1JDIHRvIGVuZCBvZiBUeCBwYWNrZXRzICovCisJVHhDbGVhckFidCA9ICgxIDw8IDApLAkvKiBDbGVhciBhYm9ydCAoV08pICovCisJVHhETUFTaGlmdCA9IDgsCQkvKiBETUEgYnVyc3QgdmFsdWUgKDAtNykgaXMgc2hpZnQgdGhpcyBtYW55IGJpdHMgKi8KKworCVR4VmVyc2lvbk1hc2sgPSAweDdDODAwMDAwLCAvKiBtYXNrIG91dCB2ZXJzaW9uIGJpdHMgMzAtMjYsIDIzICovCit9OworCisvKiBCaXRzIGluIENvbmZpZzEgKi8KK2VudW0gQ29uZmlnMUJpdHMgeworCUNmZzFfUE1fRW5hYmxlID0gMHgwMSwKKwlDZmcxX1ZQRF9FbmFibGUgPSAweDAyLAorCUNmZzFfUElPID0gMHgwNCwKKwlDZmcxX01NSU8gPSAweDA4LAorCUNmZzFfTFdBS0UgPSAweDEwLAorCUNmZzFfRHJpdmVyX0xvYWQgPSAweDIwLAorCUNmZzFfTEVEMCA9IDB4NDAsCisJQ2ZnMV9MRUQxID0gMHg4MCwKK307CisKK2VudW0gUnhDb25maWdCaXRzIHsKKwkvKiBFYXJseSBSeCB0aHJlc2hvbGQsIG5vbmUgb3IgWC8xNiAqLworCVJ4Q2ZnRWFybHlSeE5vbmUgPSAwLAorCVJ4Q2ZnRWFybHlSeFNoaWZ0ID0gMjQsCisKKwkvKiByeCBmaWZvIHRocmVzaG9sZCAqLworCVJ4Q2ZnRklGT1NoaWZ0ID0gMTMsCisJUnhDZmdGSUZPTm9uZSA9ICg3IDw8IFJ4Q2ZnRklGT1NoaWZ0KSwKKworCS8qIE1heCBETUEgYnVyc3QgKi8KKwlSeENmZ0RNQVNoaWZ0ID0gOCwKKwlSeENmZ0RNQVVubGltaXRlZCA9ICg3IDw8IFJ4Q2ZnRE1BU2hpZnQpLAorCisJLyogcnggcmluZyBidWZmZXIgbGVuZ3RoICovCisJUnhDZmdSY3Y4SyA9IDAsCisJUnhDZmdSY3YxNksgPSAoMSA8PCAxMSksCisJUnhDZmdSY3YzMksgPSAoMSA8PCAxMiksCisJUnhDZmdSY3Y2NEsgPSAoMSA8PCAxMSkgfCAoMSA8PCAxMiksCisKKwkvKiBEaXNhYmxlIHBhY2tldCB3cmFwIGF0IGVuZCBvZiBSeCBidWZmZXIgKi8KKwlSeE5vV3JhcCA9ICgxIDw8IDcpLAorfTsKKworCisvKiBUd2lzdGVyIHR1bmluZyBwYXJhbWV0ZXJzIGZyb20gUmVhbFRlay4KKyAgIENvbXBsZXRlbHkgdW5kb2N1bWVudGVkLCBidXQgcmVxdWlyZWQgdG8gdHVuZSBiYWQgbGlua3MuICovCitlbnVtIENTQ1JCaXRzIHsKKwlDU0NSX0xpbmtPS0JpdCA9IDB4MDQwMCwKKwlDU0NSX0xpbmtDaGFuZ2VCaXQgPSAweDA4MDAsCisJQ1NDUl9MaW5rU3RhdHVzQml0cyA9IDB4MGYwMDAsCisJQ1NDUl9MaW5rRG93bk9mZkNtZCA9IDB4MDAzYzAsCisJQ1NDUl9MaW5rRG93bkNtZCA9IDB4MGYzYzAsCit9OworCisKK2VudW0gQ2ZnOTM0NkJpdHMgeworCUNmZzkzNDZfTG9jayA9IDB4MDAsCisJQ2ZnOTM0Nl9VbmxvY2sgPSAweEMwLAorfTsKKworCisjZGVmaW5lIFBBUkE3OF9kZWZhdWx0CTB4NzhmYTgzODgKKyNkZWZpbmUgUEFSQTdjX2RlZmF1bHQJMHhjYjM4ZGU0MwkvKiBwYXJhbVswXVszXSAqLworI2RlZmluZSBQQVJBN2NfeHh4CQkweGNiMzhkZTQzCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBwYXJhbVs0XVs0XSA9IHsKKwl7MHhjYjM5ZGU0MywgMHhjYjM5Y2U0MywgMHhmYjM4ZGUwMywgMHhjYjM4ZGU0M30sCisJezB4Y2IzOWRlNDMsIDB4Y2IzOWNlNDMsIDB4Y2IzOWNlODMsIDB4Y2IzOWNlODN9LAorCXsweGNiMzlkZTQzLCAweGNiMzljZTQzLCAweGNiMzljZTgzLCAweGNiMzljZTgzfSwKKwl7MHhiYjM5ZGU0MywgMHhiYjM5Y2U0MywgMHhiYjM5Y2U4MywgMHhiYjM5Y2U4M30KK307CisKK3N0cnVjdCByaW5nX2luZm8geworCXN0cnVjdCBza19idWZmICpza2I7CisJZG1hX2FkZHJfdCBtYXBwaW5nOworfTsKKworCit0eXBlZGVmIGVudW0geworCUNIXzgxMzkgPSAwLAorCUNIXzgxMzlfSywKKwlDSF84MTM5QSwKKwlDSF84MTM5QiwKKwlDSF84MTMwLAorCUNIXzgxMzlDLAorfSBjaGlwX3Q7CisKKworLyogZGlyZWN0bHkgaW5kZXhlZCBieSBjaGlwX3QsIGFib3ZlICovCitjb25zdCBzdGF0aWMgc3RydWN0IHsKKwljb25zdCBjaGFyICpuYW1lOworCXU4IHZlcnNpb247IC8qIGZyb20gUlRMODEzOUMgZG9jcyAqLworCXUzMiBSeENvbmZpZ01hc2s7IC8qIHNob3VsZCBjbGVhciB0aGUgYml0cyBzdXBwb3J0ZWQgYnkgdGhpcyBjaGlwICovCit9IHJ0bF9jaGlwX2luZm9bXSA9IHsKKwl7ICJSVEwtODEzOSIsCisJICAweDQwLAorCSAgMHhmMGZlMDA0MCwgLyogWFhYIGNvcGllZCBmcm9tIFJUTDgxMzlBLCB2ZXJpZnkgKi8KKwl9LAorCisJeyAiUlRMLTgxMzkgcmV2IEsiLAorCSAgMHg2MCwKKwkgIDB4ZjBmZTAwNDAsCisJfSwKKworCXsgIlJUTC04MTM5QSIsCisJICAweDcwLAorCSAgMHhmMGZlMDA0MCwKKwl9LAorCisJeyAiUlRMLTgxMzlCIiwKKwkgIDB4NzgsCisJICAweGYwZmMwMDQwCisJfSwKKworCXsgIlJUTC04MTMwIiwKKwkgIDB4N0MsCisJICAweGYwZmUwMDQwLCAvKiBYWFggY29waWVkIGZyb20gUlRMODEzOUEsIHZlcmlmeSAqLworCX0sCisKKwl7ICJSVEwtODEzOUMiLAorCSAgMHg3NCwKKwkgIDB4ZjBmYzAwNDAsIC8qIFhYWCBjb3BpZWQgZnJvbSBSVEw4MTM5QiwgdmVyaWZ5ICovCisJfSwKKworfTsKKworCitzdHJ1Y3QgbmV0ZHJ2X3ByaXZhdGUgeworCWJvYXJkX3QgYm9hcmQ7CisJdm9pZCAqbW1pb19hZGRyOworCWludCBkcnZfZmxhZ3M7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CS8qIE1lZGlhIHNlbGVjdGlvbiB0aW1lci4gKi8KKwl1bnNpZ25lZCBjaGFyICpyeF9yaW5nOworCXVuc2lnbmVkIGludCBjdXJfcng7CS8qIEluZGV4IGludG8gdGhlIFJ4IGJ1ZmZlciBvZiBuZXh0IFJ4IHBrdC4gKi8KKwl1bnNpZ25lZCBpbnQgdHhfZmxhZzsKKwlhdG9taWNfdCBjdXJfdHg7CisJYXRvbWljX3QgZGlydHlfdHg7CisJLyogVGhlIHNhdmVkIGFkZHJlc3Mgb2YgYSBzZW50LWluLXBsYWNlIHBhY2tldC9idWZmZXIsIGZvciBza2ZyZWUoKS4gKi8KKwlzdHJ1Y3QgcmluZ19pbmZvIHR4X2luZm9bTlVNX1RYX0RFU0NdOworCXVuc2lnbmVkIGNoYXIgKnR4X2J1ZltOVU1fVFhfREVTQ107CS8qIFR4IGJvdW5jZSBidWZmZXJzICovCisJdW5zaWduZWQgY2hhciAqdHhfYnVmczsJLyogVHggYm91bmNlIGJ1ZmZlciByZWdpb24uICovCisJZG1hX2FkZHJfdCByeF9yaW5nX2RtYTsKKwlkbWFfYWRkcl90IHR4X2J1ZnNfZG1hOworCWNoYXIgcGh5c1s0XTsJCS8qIE1JSSBkZXZpY2UgYWRkcmVzc2VzLiAqLworCWNoYXIgdHdpc3RpZSwgdHdpc3Rfcm93LCB0d2lzdF9jb2w7CS8qIFR3aXN0ZXIgdHVuZSBzdGF0ZS4gKi8KKwl1bnNpZ25lZCBpbnQgZnVsbF9kdXBsZXg6MTsJLyogRnVsbC1kdXBsZXggb3BlcmF0aW9uIHJlcXVlc3RlZC4gKi8KKwl1bnNpZ25lZCBpbnQgZHVwbGV4X2xvY2s6MTsKKwl1bnNpZ25lZCBpbnQgZGVmYXVsdF9wb3J0OjQ7CS8qIExhc3QgZGV2LT5pZl9wb3J0IHZhbHVlLiAqLworCXVuc2lnbmVkIGludCBtZWRpYTI6NDsJLyogU2Vjb25kYXJ5IG1vbml0b3JlZCBtZWRpYSBwb3J0LiAqLworCXVuc2lnbmVkIGludCBtZWRpYWxvY2s6MTsJLyogRG9uJ3Qgc2Vuc2UgbWVkaWEgdHlwZS4gKi8KKwl1bnNpZ25lZCBpbnQgbWVkaWFzZW5zZToxOwkvKiBNZWRpYSBzZW5zaW5nIGluIHByb2dyZXNzLiAqLworCXNwaW5sb2NrX3QgbG9jazsKKwljaGlwX3QgY2hpcHNldDsKK307CisKK01PRFVMRV9BVVRIT1IgKCJKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJTa2VsZXRvbiBmb3IgYSBQQ0kgRmFzdCBFdGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9QQVJNIChtdWx0aWNhc3RfZmlsdGVyX2xpbWl0LCAiaSIpOworTU9EVUxFX1BBUk0gKG1heF9pbnRlcnJ1cHRfd29yaywgImkiKTsKK01PRFVMRV9QQVJNIChtZWRpYSwgIjEtIiBfX01PRFVMRV9TVFJJTkcoOCkgImkiKTsKK01PRFVMRV9QQVJNX0RFU0MgKG11bHRpY2FzdF9maWx0ZXJfbGltaXQsICJwY2ktc2tlbGV0b24gbWF4aW11bSBudW1iZXIgb2YgZmlsdGVyZWQgbXVsdGljYXN0IGFkZHJlc3NlcyIpOworTU9EVUxFX1BBUk1fREVTQyAobWF4X2ludGVycnVwdF93b3JrLCAicGNpLXNrZWxldG9uIG1heGltdW0gZXZlbnRzIGhhbmRsZWQgcGVyIGludGVycnVwdCIpOworTU9EVUxFX1BBUk1fREVTQyAobWVkaWEsICJwY2ktc2tlbGV0b246IEJpdHMgMC0zOiBtZWRpYSB0eXBlLCBiaXQgMTc6IGZ1bGwgZHVwbGV4Iik7CisKK3N0YXRpYyBpbnQgcmVhZF9lZXByb20gKHZvaWQgKmlvYWRkciwgaW50IGxvY2F0aW9uLCBpbnQgYWRkcl9sZW4pOworc3RhdGljIGludCBuZXRkcnZfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG1kaW9fcmVhZCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwKKwkJCWludCB2YWwpOworc3RhdGljIHZvaWQgbmV0ZHJ2X3RpbWVyICh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgbmV0ZHJ2X3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbmV0ZHJ2X2luaXRfcmluZyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG5ldGRydl9zdGFydF94bWl0IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IG5ldGRydl9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwKKwkJCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IG5ldGRydl9jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG5ldGRydl9pb2N0bCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldGRydl9nZXRfc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbmV0ZHJ2X3NldF9yeF9tb2RlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG5ldGRydl9od19zdGFydCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworI2lmZGVmIFVTRV9JT19PUFMKKworI2RlZmluZSBORVREUlZfUjgocmVnKQkJaW5iICgoKHVuc2lnbmVkIGxvbmcpaW9hZGRyKSArIChyZWcpKQorI2RlZmluZSBORVREUlZfUjE2KHJlZykJCWludyAoKCh1bnNpZ25lZCBsb25nKWlvYWRkcikgKyAocmVnKSkKKyNkZWZpbmUgTkVURFJWX1IzMihyZWcpCQkoKHVuc2lnbmVkIGxvbmcpIGlubCAoKCh1bnNpZ25lZCBsb25nKWlvYWRkcikgKyAocmVnKSkpCisjZGVmaW5lIE5FVERSVl9XOChyZWcsIHZhbDgpCW91dGIgKCh2YWw4KSwgKCh1bnNpZ25lZCBsb25nKWlvYWRkcikgKyAocmVnKSkKKyNkZWZpbmUgTkVURFJWX1cxNihyZWcsIHZhbDE2KQlvdXR3ICgodmFsMTYpLCAoKHVuc2lnbmVkIGxvbmcpaW9hZGRyKSArIChyZWcpKQorI2RlZmluZSBORVREUlZfVzMyKHJlZywgdmFsMzIpCW91dGwgKCh2YWwzMiksICgodW5zaWduZWQgbG9uZylpb2FkZHIpICsgKHJlZykpCisjZGVmaW5lIE5FVERSVl9XOF9GCQlORVREUlZfVzgKKyNkZWZpbmUgTkVURFJWX1cxNl9GCQlORVREUlZfVzE2CisjZGVmaW5lIE5FVERSVl9XMzJfRgkJTkVURFJWX1czMgorI3VuZGVmIHJlYWRiCisjdW5kZWYgcmVhZHcKKyN1bmRlZiByZWFkbAorI3VuZGVmIHdyaXRlYgorI3VuZGVmIHdyaXRldworI3VuZGVmIHdyaXRlbAorI2RlZmluZSByZWFkYihhZGRyKSBpbmIoKHVuc2lnbmVkIGxvbmcpKGFkZHIpKQorI2RlZmluZSByZWFkdyhhZGRyKSBpbncoKHVuc2lnbmVkIGxvbmcpKGFkZHIpKQorI2RlZmluZSByZWFkbChhZGRyKSBpbmwoKHVuc2lnbmVkIGxvbmcpKGFkZHIpKQorI2RlZmluZSB3cml0ZWIodmFsLGFkZHIpIG91dGIoKHZhbCksKHVuc2lnbmVkIGxvbmcpKGFkZHIpKQorI2RlZmluZSB3cml0ZXcodmFsLGFkZHIpIG91dHcoKHZhbCksKHVuc2lnbmVkIGxvbmcpKGFkZHIpKQorI2RlZmluZSB3cml0ZWwodmFsLGFkZHIpIG91dGwoKHZhbCksKHVuc2lnbmVkIGxvbmcpKGFkZHIpKQorCisjZWxzZQorCisvKiB3cml0ZSBNTUlPIHJlZ2lzdGVyLCB3aXRoIGZsdXNoICovCisvKiBGbHVzaCBhdm9pZHMgcnRsODEzOSBidWcgdy8gcG9zdGVkIE1NSU8gd3JpdGVzICovCisjZGVmaW5lIE5FVERSVl9XOF9GKHJlZywgdmFsOCkJZG8geyB3cml0ZWIgKCh2YWw4KSwgaW9hZGRyICsgKHJlZykpOyByZWFkYiAoaW9hZGRyICsgKHJlZykpOyB9IHdoaWxlICgwKQorI2RlZmluZSBORVREUlZfVzE2X0YocmVnLCB2YWwxNikJZG8geyB3cml0ZXcgKCh2YWwxNiksIGlvYWRkciArIChyZWcpKTsgcmVhZHcgKGlvYWRkciArIChyZWcpKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgTkVURFJWX1czMl9GKHJlZywgdmFsMzIpCWRvIHsgd3JpdGVsICgodmFsMzIpLCBpb2FkZHIgKyAocmVnKSk7IHJlYWRsIChpb2FkZHIgKyAocmVnKSk7IH0gd2hpbGUgKDApCisKKworI2lmIE1NSU9fRkxVU0hfQVVESVRfQ09NUExFVEUKKworLyogd3JpdGUgTU1JTyByZWdpc3RlciAqLworI2RlZmluZSBORVREUlZfVzgocmVnLCB2YWw4KQl3cml0ZWIgKCh2YWw4KSwgaW9hZGRyICsgKHJlZykpCisjZGVmaW5lIE5FVERSVl9XMTYocmVnLCB2YWwxNikJd3JpdGV3ICgodmFsMTYpLCBpb2FkZHIgKyAocmVnKSkKKyNkZWZpbmUgTkVURFJWX1czMihyZWcsIHZhbDMyKQl3cml0ZWwgKCh2YWwzMiksIGlvYWRkciArIChyZWcpKQorCisjZWxzZQorCisvKiB3cml0ZSBNTUlPIHJlZ2lzdGVyLCB0aGVuIGZsdXNoICovCisjZGVmaW5lIE5FVERSVl9XOAkJTkVURFJWX1c4X0YKKyNkZWZpbmUgTkVURFJWX1cxNgkJTkVURFJWX1cxNl9GCisjZGVmaW5lIE5FVERSVl9XMzIJCU5FVERSVl9XMzJfRgorCisjZW5kaWYgLyogTU1JT19GTFVTSF9BVURJVF9DT01QTEVURSAqLworCisvKiByZWFkIE1NSU8gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTkVURFJWX1I4KHJlZykJCXJlYWRiIChpb2FkZHIgKyAocmVnKSkKKyNkZWZpbmUgTkVURFJWX1IxNihyZWcpCQlyZWFkdyAoaW9hZGRyICsgKHJlZykpCisjZGVmaW5lIE5FVERSVl9SMzIocmVnKQkJKCh1bnNpZ25lZCBsb25nKSByZWFkbCAoaW9hZGRyICsgKHJlZykpKQorCisjZW5kaWYgLyogVVNFX0lPX09QUyAqLworCisKK3N0YXRpYyBjb25zdCB1MTYgbmV0ZHJ2X2ludHJfbWFzayA9CisJUENJRXJyIHwgUENTVGltZW91dCB8IFJ4VW5kZXJydW4gfCBSeE92ZXJmbG93IHwgUnhGSUZPT3ZlciB8CisJVHhFcnIgfCBUeE9LIHwgUnhFcnIgfCBSeE9LOworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5ldGRydl9yeF9jb25maWcgPQorCSAgUnhDZmdFYXJseVJ4Tm9uZSB8IFJ4Q2ZnUmN2MzJLIHwgUnhOb1dyYXAgfAorCSAgKFJYX0ZJRk9fVEhSRVNIIDw8IFJ4Q2ZnRklGT1NoaWZ0KSB8CisJICAoUlhfRE1BX0JVUlNUIDw8IFJ4Q2ZnRE1BU2hpZnQpOworCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG5ldGRydl9pbml0X2JvYXJkIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICoqZGV2X291dCwKKwkJCQkJIHZvaWQgKippb2FkZHJfb3V0KQoreworCXZvaWQgKmlvYWRkciA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0ZHJ2X3ByaXZhdGUgKnRwOworCWludCByYywgaTsKKwl1MzIgcGlvX3N0YXJ0LCBwaW9fZW5kLCBwaW9fZmxhZ3MsIHBpb19sZW47CisJdW5zaWduZWQgbG9uZyBtbWlvX3N0YXJ0LCBtbWlvX2VuZCwgbW1pb19mbGFncywgbW1pb19sZW47CisJdTMyIHRtcDsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlhc3NlcnQgKHBkZXYgIT0gTlVMTCk7CisJYXNzZXJ0IChpb2FkZHJfb3V0ICE9IE5VTEwpOworCisJKmlvYWRkcl9vdXQgPSBOVUxMOworCSpkZXZfb3V0ID0gTlVMTDsKKworCS8qIGRldiB6ZXJvZWQgaW4gYWxsb2NfZXRoZXJkZXYgKi8KKwlkZXYgPSBhbGxvY19ldGhlcmRldiAoc2l6ZW9mICgqdHApKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggInVuYWJsZSB0byBhbGxvYyBuZXcgZXRoZXJuZXRcbiIpOworCQlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIC1FTk9NRU1cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisJdHAgPSBkZXYtPnByaXY7CisKKwkvKiBlbmFibGUgZGV2aWNlIChpbmNsLiBQQ0kgUE0gd2FrZXVwKSwgYW5kIGJ1cy1tYXN0ZXJpbmcgKi8KKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlIChwZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dDsKKworCXBpb19zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMCk7CisJcGlvX2VuZCA9IHBjaV9yZXNvdXJjZV9lbmQgKHBkZXYsIDApOworCXBpb19mbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFncyAocGRldiwgMCk7CisJcGlvX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4gKHBkZXYsIDApOworCisJbW1pb19zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMSk7CisJbW1pb19lbmQgPSBwY2lfcmVzb3VyY2VfZW5kIChwZGV2LCAxKTsKKwltbWlvX2ZsYWdzID0gcGNpX3Jlc291cmNlX2ZsYWdzIChwZGV2LCAxKTsKKwltbWlvX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4gKHBkZXYsIDEpOworCisJLyogc2V0IHRoaXMgaW1tZWRpYXRlbHksIHdlIG5lZWQgdG8ga25vdyBiZWZvcmUKKwkgKiB3ZSB0YWxrIHRvIHRoZSBjaGlwIGRpcmVjdGx5ICovCisJRFBSSU5USygiUElPIHJlZ2lvbiBzaXplID09IDB4JTAyWFxuIiwgcGlvX2xlbik7CisJRFBSSU5USygiTU1JTyByZWdpb24gc2l6ZSA9PSAweCUwMmxYXG4iLCBtbWlvX2xlbik7CisKKwkvKiBtYWtlIHN1cmUgUENJIGJhc2UgYWRkciAwIGlzIFBJTyAqLworCWlmICghKHBpb19mbGFncyAmIElPUkVTT1VSQ0VfSU8pKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJyZWdpb24gIzAgbm90IGEgUElPIHJlc291cmNlLCBhYm9ydGluZ1xuIik7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qIG1ha2Ugc3VyZSBQQ0kgYmFzZSBhZGRyIDEgaXMgTU1JTyAqLworCWlmICghKG1taW9fZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggInJlZ2lvbiAjMSBub3QgYW4gTU1JTyByZXNvdXJjZSwgYWJvcnRpbmdcbiIpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKiBjaGVjayBmb3Igd2VpcmQvYnJva2VuIFBDSSByZWdpb24gcmVwb3J0aW5nICovCisJaWYgKChwaW9fbGVuIDwgTkVURFJWX01JTl9JT19TSVpFKSB8fAorCSAgICAobW1pb19sZW4gPCBORVREUlZfTUlOX0lPX1NJWkUpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJJbnZhbGlkIFBDSSByZWdpb24gc2l6ZShzKSwgYWJvcnRpbmdcbiIpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMgKHBkZXYsICJwY2ktc2tlbGV0b24iKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dDsKKworCXBjaV9zZXRfbWFzdGVyIChwZGV2KTsKKworI2lmZGVmIFVTRV9JT19PUFMKKwlpb2FkZHIgPSAodm9pZCAqKSBwaW9fc3RhcnQ7CisjZWxzZQorCS8qIGlvcmVtYXAgTU1JTyByZWdpb24gKi8KKwlpb2FkZHIgPSBpb3JlbWFwIChtbWlvX3N0YXJ0LCBtbWlvX2xlbik7CisJaWYgKGlvYWRkciA9PSBOVUxMKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVtYXAgTU1JTywgYWJvcnRpbmdcbiIpOworCQlyYyA9IC1FSU87CisJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKKwl9CisjZW5kaWYgLyogVVNFX0lPX09QUyAqLworCisJLyogU29mdCByZXNldCB0aGUgY2hpcC4gKi8KKwlORVREUlZfVzggKENoaXBDbWQsIChORVREUlZfUjggKENoaXBDbWQpICYgQ2hpcENtZENsZWFyKSB8IENtZFJlc2V0KTsKKworCS8qIENoZWNrIHRoYXQgdGhlIGNoaXAgaGFzIGZpbmlzaGVkIHRoZSByZXNldC4gKi8KKwlmb3IgKGkgPSAxMDAwOyBpID4gMDsgaS0tKQorCQlpZiAoKE5FVERSVl9SOCAoQ2hpcENtZCkgJiBDbWRSZXNldCkgPT0gMCkKKwkJCWJyZWFrOworCQllbHNlCisJCQl1ZGVsYXkgKDEwKTsKKworCS8qIEJyaW5nIHRoZSBjaGlwIG91dCBvZiBsb3ctcG93ZXIgbW9kZS4gKi8KKwkvKiA8aW5zZXJ0IGRldmljZS1zcGVjaWZpYyBjb2RlIGhlcmU+ICovCisKKyNpZm5kZWYgVVNFX0lPX09QUworCS8qIHNhbml0eSBjaGVja3MgLS0gZW5zdXJlIFBJTyBhbmQgTU1JTyByZWdpc3RlcnMgYWdyZWUgKi8KKwlhc3NlcnQgKGluYiAocGlvX3N0YXJ0K0NvbmZpZzApID09IHJlYWRiIChpb2FkZHIrQ29uZmlnMCkpOworCWFzc2VydCAoaW5iIChwaW9fc3RhcnQrQ29uZmlnMSkgPT0gcmVhZGIgKGlvYWRkcitDb25maWcxKSk7CisJYXNzZXJ0IChpbmIgKHBpb19zdGFydCtUeENvbmZpZykgPT0gcmVhZGIgKGlvYWRkcitUeENvbmZpZykpOworCWFzc2VydCAoaW5iIChwaW9fc3RhcnQrUnhDb25maWcpID09IHJlYWRiIChpb2FkZHIrUnhDb25maWcpKTsKKyNlbmRpZiAvKiAhVVNFX0lPX09QUyAqLworCisJLyogaWRlbnRpZnkgY2hpcCBhdHRhY2hlZCB0byBib2FyZCAqLworCXRtcCA9IE5FVERSVl9SOCAoQ2hpcFZlcnNpb24pOworCWZvciAoaSA9IEFSUkFZX1NJWkUgKHJ0bF9jaGlwX2luZm8pIC0gMTsgaSA+PSAwOyBpLS0pCisJCWlmICh0bXAgPT0gcnRsX2NoaXBfaW5mb1tpXS52ZXJzaW9uKSB7CisJCQl0cC0+Y2hpcHNldCA9IGk7CisJCQlnb3RvIG1hdGNoOworCQl9CisKKwkvKiBpZiB1bmtub3duIGNoaXAsIGFzc3VtZSBhcnJheSBlbGVtZW50ICMwLCBvcmlnaW5hbCBSVEwtODEzOSBpbiB0aGlzIGNhc2UgKi8KKwlwcmludGsgKEtFUk5fREVCVUcgUEZYICJQQ0kgZGV2aWNlICVzOiB1bmtub3duIGNoaXAgdmVyc2lvbiwgYXNzdW1pbmcgUlRMLTgxMzlcbiIsCisJCXBjaV9uYW1lKHBkZXYpKTsKKwlwcmludGsgKEtFUk5fREVCVUcgUEZYICJQQ0kgZGV2aWNlICVzOiBUeENvbmZpZyA9IDB4JWx4XG4iLCBwY2lfbmFtZShwZGV2KSwgTkVURFJWX1IzMiAoVHhDb25maWcpKTsKKwl0cC0+Y2hpcHNldCA9IDA7CisKK21hdGNoOgorCURQUklOVEsgKCJjaGlwc2V0IGlkICglZCkgPT0gaW5kZXggJWQsICclcydcbiIsCisJCXRtcCwKKwkJdHAtPmNoaXBzZXQsCisJCXJ0bF9jaGlwX2luZm9bdHAtPmNoaXBzZXRdLm5hbWUpOworCisJaSA9IHJlZ2lzdGVyX25ldGRldiAoZGV2KTsKKwlpZiAoaSkKKwkJZ290byBlcnJfb3V0X3VubWFwOworCisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAwXG4iKTsKKwkqaW9hZGRyX291dCA9IGlvYWRkcjsKKwkqZGV2X291dCA9IGRldjsKKwlyZXR1cm4gMDsKKworZXJyX291dF91bm1hcDoKKyNpZm5kZWYgVVNFX0lPX09QUworCWlvdW5tYXAoaW9hZGRyKTsKK2Vycl9vdXRfZnJlZV9yZXM6CisjZW5kaWYKKwlwY2lfcmVsZWFzZV9yZWdpb25zIChwZGV2KTsKK2Vycl9vdXQ6CisJZnJlZV9uZXRkZXYgKGRldik7CisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAlZFxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBuZXRkcnZfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCBuZXRkcnZfcHJpdmF0ZSAqdHA7CisJaW50IGksIGFkZHJfbGVuLCBvcHRpb247CisJdm9pZCAqaW9hZGRyID0gTlVMTDsKKwlzdGF0aWMgaW50IGJvYXJkX2lkeCA9IC0xOworCisvKiB3aGVuIGJ1aWx0IGludG8gdGhlIGtlcm5lbCwgd2Ugb25seSBwcmludCB2ZXJzaW9uIGlmIGRldmljZSBpcyBmb3VuZCAqLworI2lmbmRlZiBNT0RVTEUKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlhc3NlcnQgKHBkZXYgIT0gTlVMTCk7CisJYXNzZXJ0IChlbnQgIT0gTlVMTCk7CisKKwlib2FyZF9pZHgrKzsKKworCWkgPSBuZXRkcnZfaW5pdF9ib2FyZCAocGRldiwgJmRldiwgJmlvYWRkcik7CisJaWYgKGkgPCAwKSB7CisJCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgJWRcbiIsIGkpOworCQlyZXR1cm4gaTsKKwl9CisKKwl0cCA9IGRldi0+cHJpdjsKKworCWFzc2VydCAoaW9hZGRyICE9IE5VTEwpOworCWFzc2VydCAoZGV2ICE9IE5VTEwpOworCWFzc2VydCAodHAgIT0gTlVMTCk7CisKKwlhZGRyX2xlbiA9IHJlYWRfZWVwcm9tIChpb2FkZHIsIDAsIDgpID09IDB4ODEyOSA/IDggOiA2OworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCSgodTE2ICopIChkZXYtPmRldl9hZGRyKSlbaV0gPQorCQkgICAgbGUxNl90b19jcHUgKHJlYWRfZWVwcm9tIChpb2FkZHIsIGkgKyA3LCBhZGRyX2xlbikpOworCisJLyogVGhlIFJ0bDgxMzktc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSBuZXRkcnZfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IG5ldGRydl9zdGFydF94bWl0OworCWRldi0+c3RvcCA9IG5ldGRydl9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9IG5ldGRydl9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBuZXRkcnZfc2V0X3J4X21vZGU7CisJZGV2LT5kb19pb2N0bCA9IG5ldGRydl9pb2N0bDsKKwlkZXYtPnR4X3RpbWVvdXQgPSBuZXRkcnZfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKworCWRldi0+aXJxID0gcGRldi0+aXJxOworCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGlvYWRkcjsKKworCS8qIGRldi0+cHJpdi90cCB6ZXJvZWQgYW5kIGFsaWduZWQgaW4gYWxsb2NfZXRoZXJkZXYgKi8KKwl0cCA9IGRldi0+cHJpdjsKKworCS8qIG5vdGU6IHRwLT5jaGlwc2V0IHNldCBpbiBuZXRkcnZfaW5pdF9ib2FyZCAqLworCXRwLT5kcnZfZmxhZ3MgPSBQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01FTU9SWSB8CisJCQlQQ0lfQ09NTUFORF9NQVNURVIgfCBORVREUlZfQ0FQUzsKKwl0cC0+cGNpX2RldiA9IHBkZXY7CisJdHAtPmJvYXJkID0gZW50LT5kcml2ZXJfZGF0YTsKKwl0cC0+bW1pb19hZGRyID0gaW9hZGRyOworCXNwaW5fbG9ja19pbml0KCZ0cC0+bG9jayk7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCXRwLT5waHlzWzBdID0gMzI7CisKKwlwcmludGsgKEtFUk5fSU5GTyAiJXM6ICVzIGF0IDB4JWx4LCAiCisJCSIlMi4yeDolMi4yeDolMi4yeDolMi4yeDolMi4yeDolMi4yeCwgIgorCQkiSVJRICVkXG4iLAorCQlkZXYtPm5hbWUsCisJCWJvYXJkX2luZm9bZW50LT5kcml2ZXJfZGF0YV0ubmFtZSwKKwkJZGV2LT5iYXNlX2FkZHIsCisJCWRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sCisJCWRldi0+ZGV2X2FkZHJbMl0sIGRldi0+ZGV2X2FkZHJbM10sCisJCWRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0sCisJCWRldi0+aXJxKTsKKworCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6ICBJZGVudGlmaWVkIDgxMzkgY2hpcCB0eXBlICclcydcbiIsCisJCWRldi0+bmFtZSwgcnRsX2NoaXBfaW5mb1t0cC0+Y2hpcHNldF0ubmFtZSk7CisKKwkvKiBQdXQgdGhlIGNoaXAgaW50byBsb3ctcG93ZXIgbW9kZS4gKi8KKwlORVREUlZfVzhfRiAoQ2ZnOTM0NiwgQ2ZnOTM0Nl9VbmxvY2spOworCisJLyogVGhlIGxvd2VyIGZvdXIgYml0cyBhcmUgdGhlIG1lZGlhIHR5cGUuICovCisJb3B0aW9uID0gKGJvYXJkX2lkeCA+IDcpID8gMCA6IG1lZGlhW2JvYXJkX2lkeF07CisJaWYgKG9wdGlvbiA+IDApIHsKKwkJdHAtPmZ1bGxfZHVwbGV4ID0gKG9wdGlvbiAmIDB4MjAwKSA/IDEgOiAwOworCQl0cC0+ZGVmYXVsdF9wb3J0ID0gb3B0aW9uICYgMTU7CisJCWlmICh0cC0+ZGVmYXVsdF9wb3J0KQorCQkJdHAtPm1lZGlhbG9jayA9IDE7CisJfQorCisJaWYgKHRwLT5mdWxsX2R1cGxleCkgeworCQlwcmludGsgKEtFUk5fSU5GTworCQkJIiVzOiBNZWRpYSB0eXBlIGZvcmNlZCB0byBGdWxsIER1cGxleC5cbiIsCisJCQlkZXYtPm5hbWUpOworCQltZGlvX3dyaXRlIChkZXYsIHRwLT5waHlzWzBdLCBNSUlfQURWRVJUSVNFLCBBRFZFUlRJU0VfRlVMTCk7CisJCXRwLT5kdXBsZXhfbG9jayA9IDE7CisJfQorCisJRFBSSU5USyAoIkVYSVQgLSByZXR1cm5pbmcgMFxuIik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IG5ldGRydl9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKwlzdHJ1Y3QgbmV0ZHJ2X3ByaXZhdGUgKm5wOworCisJRFBSSU5USyAoIkVOVEVSXG4iKTsKKworCWFzc2VydCAoZGV2ICE9IE5VTEwpOworCisJbnAgPSBkZXYtPnByaXY7CisJYXNzZXJ0IChucCAhPSBOVUxMKTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2IChkZXYpOworCisjaWZuZGVmIFVTRV9JT19PUFMKKwlpb3VubWFwIChucC0+bW1pb19hZGRyKTsKKyNlbmRpZiAvKiAhVVNFX0lPX09QUyAqLworCisJcGNpX3JlbGVhc2VfcmVnaW9ucyAocGRldik7CisKKwlmcmVlX25ldGRldiAoZGV2KTsKKworCXBjaV9zZXRfZHJ2ZGF0YSAocGRldiwgTlVMTCk7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UgKHBkZXYpOworCisJRFBSSU5USyAoIkVYSVRcbiIpOworfQorCisKKy8qIFNlcmlhbCBFRVBST00gc2VjdGlvbi4gKi8KKworLyogIEVFUFJPTV9DdHJsIGJpdHMuICovCisjZGVmaW5lIEVFX1NISUZUX0NMSwkweDA0CS8qIEVFUFJPTSBzaGlmdCBjbG9jay4gKi8KKyNkZWZpbmUgRUVfQ1MJCQkweDA4CS8qIEVFUFJPTSBjaGlwIHNlbGVjdC4gKi8KKyNkZWZpbmUgRUVfREFUQV9XUklURQkweDAyCS8qIEVFUFJPTSBjaGlwIGRhdGEgaW4uICovCisjZGVmaW5lIEVFX1dSSVRFXzAJCTB4MDAKKyNkZWZpbmUgRUVfV1JJVEVfMQkJMHgwMgorI2RlZmluZSBFRV9EQVRBX1JFQUQJMHgwMQkvKiBFRVBST00gY2hpcCBkYXRhIG91dC4gKi8KKyNkZWZpbmUgRUVfRU5CCQkJKDB4ODAgfCBFRV9DUykKKworLyogRGVsYXkgYmV0d2VlbiBFRVBST00gY2xvY2sgdHJhbnNpdGlvbnMuCisgICBObyBleHRyYSBkZWxheSBpcyBuZWVkZWQgd2l0aCAzM01oeiBQQ0ksIGJ1dCA2Nk1oeiBtYXkgY2hhbmdlIHRoaXMuCisgKi8KKworI2RlZmluZSBlZXByb21fZGVsYXkoKQlyZWFkbChlZV9hZGRyKQorCisvKiBUaGUgRUVQUk9NIGNvbW1hbmRzIGluY2x1ZGUgdGhlIGFsd2F5LXNldCBsZWFkaW5nIGJpdC4gKi8KKyNkZWZpbmUgRUVfV1JJVEVfQ01ECSg1KQorI2RlZmluZSBFRV9SRUFEX0NNRAkJKDYpCisjZGVmaW5lIEVFX0VSQVNFX0NNRAkoNykKKworc3RhdGljIGludCBfX2RldmluaXQgcmVhZF9lZXByb20gKHZvaWQgKmlvYWRkciwgaW50IGxvY2F0aW9uLCBpbnQgYWRkcl9sZW4pCit7CisJaW50IGk7CisJdW5zaWduZWQgcmV0dmFsID0gMDsKKwl2b2lkICplZV9hZGRyID0gaW9hZGRyICsgQ2ZnOTM0NjsKKwlpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IChFRV9SRUFEX0NNRCA8PCBhZGRyX2xlbik7CisKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJd3JpdGViIChFRV9FTkIgJiB+RUVfQ1MsIGVlX2FkZHIpOworCXdyaXRlYiAoRUVfRU5CLCBlZV9hZGRyKTsKKwllZXByb21fZGVsYXkgKCk7CisKKwkvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDQgKyBhZGRyX2xlbjsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGRhdGF2YWwgPSAocmVhZF9jbWQgJiAoMSA8PCBpKSkgPyBFRV9EQVRBX1dSSVRFIDogMDsKKwkJd3JpdGViIChFRV9FTkIgfCBkYXRhdmFsLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5ICgpOworCQl3cml0ZWIgKEVFX0VOQiB8IGRhdGF2YWwgfCBFRV9TSElGVF9DTEssIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkgKCk7CisJfQorCXdyaXRlYiAoRUVfRU5CLCBlZV9hZGRyKTsKKwllZXByb21fZGVsYXkgKCk7CisKKwlmb3IgKGkgPSAxNjsgaSA+IDA7IGktLSkgeworCQl3cml0ZWIgKEVFX0VOQiB8IEVFX1NISUZUX0NMSywgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheSAoKTsKKwkJcmV0dmFsID0KKwkJICAgIChyZXR2YWwgPDwgMSkgfCAoKHJlYWRiIChlZV9hZGRyKSAmIEVFX0RBVEFfUkVBRCkgPyAxIDoKKwkJCQkgICAgIDApOworCQl3cml0ZWIgKEVFX0VOQiwgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheSAoKTsKKwl9CisKKwkvKiBUZXJtaW5hdGUgdGhlIEVFUFJPTSBhY2Nlc3MuICovCisJd3JpdGViICh+RUVfQ1MsIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheSAoKTsKKworCURQUklOVEsgKCJFWElUIC0gcmV0dXJuaW5nICVkXG4iLCByZXR2YWwpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIE1JSSBzZXJpYWwgbWFuYWdlbWVudDogbW9zdGx5IGJvZ3VzIGZvciBub3cuICovCisvKiBSZWFkIGFuZCB3cml0ZSB0aGUgTUlJIG1hbmFnZW1lbnQgcmVnaXN0ZXJzIHVzaW5nIHNvZnR3YXJlLWdlbmVyYXRlZAorICAgc2VyaWFsIE1ESU8gcHJvdG9jb2wuCisgICBUaGUgbWF4aW11bSBkYXRhIGNsb2NrIHJhdGUgaXMgMi41IE1oei4gIFRoZSBtaW5pbXVtIHRpbWluZyBpcyB1c3VhbGx5CisgICBtZXQgYnkgYmFjay10by1iYWNrIFBDSSBJL08gY3ljbGVzLCBidXQgd2UgaW5zZXJ0IGEgZGVsYXkgdG8gYXZvaWQKKyAgICJvdmVyY2xvY2tpbmciIGlzc3Vlcy4gKi8KKyNkZWZpbmUgTURJT19ESVIJCTB4ODAKKyNkZWZpbmUgTURJT19EQVRBX09VVAkweDA0CisjZGVmaW5lIE1ESU9fREFUQV9JTgkweDAyCisjZGVmaW5lIE1ESU9fQ0xLCQkweDAxCisjZGVmaW5lIE1ESU9fV1JJVEUwIChNRElPX0RJUikKKyNkZWZpbmUgTURJT19XUklURTEgKE1ESU9fRElSIHwgTURJT19EQVRBX09VVCkKKworI2RlZmluZSBtZGlvX2RlbGF5KCkJcmVhZGIobWRpb19hZGRyKQorCisKK3N0YXRpYyBjaGFyIG1paV8yXzgxMzlfbWFwWzhdID0geworCUJhc2ljTW9kZUN0cmwsCisJQmFzaWNNb2RlU3RhdHVzLAorCTAsCisJMCwKKwlOV2F5QWR2ZXJ0LAorCU5XYXlMUEFSLAorCU5XYXlFeHBhbnNpb24sCisJMAorfTsKKworCisvKiBTeW5jcm9uaXplIHRoZSBNSUkgbWFuYWdlbWVudCBpbnRlcmZhY2UgYnkgc2hpZnRpbmcgMzIgb25lIGJpdHMgb3V0LiAqLworc3RhdGljIHZvaWQgbWRpb19zeW5jICh2b2lkICptZGlvX2FkZHIpCit7CisJaW50IGk7CisKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJZm9yIChpID0gMzI7IGkgPj0gMDsgaS0tKSB7CisJCXdyaXRlYiAoTURJT19XUklURTEsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkgKCk7CisJCXdyaXRlYiAoTURJT19XUklURTEgfCBNRElPX0NMSywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSAoKTsKKwl9CisKKwlEUFJJTlRLICgiRVhJVFxuIik7Cit9CisKKworc3RhdGljIGludCBtZGlvX3JlYWQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKK3sKKwlzdHJ1Y3QgbmV0ZHJ2X3ByaXZhdGUgKnRwID0gZGV2LT5wcml2OworCXZvaWQgKm1kaW9fYWRkciA9IHRwLT5tbWlvX2FkZHIgKyBDb25maWc0OworCWludCBtaWlfY21kID0gKDB4ZjYgPDwgMTApIHwgKHBoeV9pZCA8PCA1KSB8IGxvY2F0aW9uOworCWludCByZXR2YWwgPSAwOworCWludCBpOworCisJRFBSSU5USyAoIkVOVEVSXG4iKTsKKworCWlmIChwaHlfaWQgPiAzMSkgewkvKiBSZWFsbHkgYSA4MTM5LiAgVXNlIGludGVybmFsIHJlZ2lzdGVycy4gKi8KKwkJRFBSSU5USyAoIkVYSVQgYWZ0ZXIgZGlyZWN0bHkgdXNpbmcgODEzOSBpbnRlcm5hbCByZWdzXG4iKTsKKwkJcmV0dXJuIGxvY2F0aW9uIDwgOCAmJiBtaWlfMl84MTM5X21hcFtsb2NhdGlvbl0gPworCQkgICAgcmVhZHcgKHRwLT5tbWlvX2FkZHIgKyBtaWlfMl84MTM5X21hcFtsb2NhdGlvbl0pIDogMDsKKwl9CisJbWRpb19zeW5jIChtZGlvX2FkZHIpOworCS8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKSB7CisJCWludCBkYXRhdmFsID0gKG1paV9jbWQgJiAoMSA8PCBpKSkgPyBNRElPX0RBVEFfT1VUIDogMDsKKworCQl3cml0ZWIgKE1ESU9fRElSIHwgZGF0YXZhbCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSAoKTsKKwkJd3JpdGViIChNRElPX0RJUiB8IGRhdGF2YWwgfCBNRElPX0NMSywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSAoKTsKKwl9CisKKwkvKiBSZWFkIHRoZSB0d28gdHJhbnNpdGlvbiwgMTYgZGF0YSwgYW5kIHdpcmUtaWRsZSBiaXRzLiAqLworCWZvciAoaSA9IDE5OyBpID4gMDsgaS0tKSB7CisJCXdyaXRlYiAoMCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSAoKTsKKwkJcmV0dmFsID0KKwkJICAgIChyZXR2YWwgPDwgMSkgfCAoKHJlYWRiIChtZGlvX2FkZHIpICYgTURJT19EQVRBX0lOKSA/IDEKKwkJCQkgICAgIDogMCk7CisJCXdyaXRlYiAoTURJT19DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkgKCk7CisJfQorCisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAlZFxuIiwgKHJldHZhbCA+PiAxKSAmIDB4ZmZmZik7CisJcmV0dXJuIChyZXR2YWwgPj4gMSkgJiAweGZmZmY7Cit9CisKKworc3RhdGljIHZvaWQgbWRpb193cml0ZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLAorCQkJaW50IHZhbHVlKQoreworCXN0cnVjdCBuZXRkcnZfcHJpdmF0ZSAqdHAgPSBkZXYtPnByaXY7CisJdm9pZCAqbWRpb19hZGRyID0gdHAtPm1taW9fYWRkciArIENvbmZpZzQ7CisJaW50IG1paV9jbWQgPQorCSAgICAoMHg1MDAyIDw8IDE2KSB8IChwaHlfaWQgPDwgMjMpIHwgKGxvY2F0aW9uIDw8IDE4KSB8IHZhbHVlOworCWludCBpOworCisJRFBSSU5USyAoIkVOVEVSXG4iKTsKKworCWlmIChwaHlfaWQgPiAzMSkgewkvKiBSZWFsbHkgYSA4MTM5LiAgVXNlIGludGVybmFsIHJlZ2lzdGVycy4gKi8KKwkJaWYgKGxvY2F0aW9uIDwgOCAmJiBtaWlfMl84MTM5X21hcFtsb2NhdGlvbl0pIHsKKwkJCXdyaXRldyAodmFsdWUsCisJCQkJdHAtPm1taW9fYWRkciArIG1paV8yXzgxMzlfbWFwW2xvY2F0aW9uXSk7CisJCQlyZWFkdyAodHAtPm1taW9fYWRkciArIG1paV8yXzgxMzlfbWFwW2xvY2F0aW9uXSk7CisJCX0KKwkJRFBSSU5USyAoIkVYSVQgYWZ0ZXIgZGlyZWN0bHkgdXNpbmcgODEzOSBpbnRlcm5hbCByZWdzXG4iKTsKKwkJcmV0dXJuOworCX0KKwltZGlvX3N5bmMgKG1kaW9fYWRkcik7CisKKwkvKiBTaGlmdCB0aGUgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGRhdGF2YWwgPQorCQkgICAgKG1paV9jbWQgJiAoMSA8PCBpKSkgPyBNRElPX1dSSVRFMSA6IE1ESU9fV1JJVEUwOworCQl3cml0ZWIgKGRhdGF2YWwsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkgKCk7CisJCXdyaXRlYiAoZGF0YXZhbCB8IE1ESU9fQ0xLLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5ICgpOworCX0KKworCS8qIENsZWFyIG91dCBleHRyYSBiaXRzLiAqLworCWZvciAoaSA9IDI7IGkgPiAwOyBpLS0pIHsKKwkJd3JpdGViICgwLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5ICgpOworCQl3cml0ZWIgKE1ESU9fQ0xLLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5ICgpOworCX0KKworCURQUklOVEsgKCJFWElUXG4iKTsKK30KKworCitzdGF0aWMgaW50IG5ldGRydl9vcGVuIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkcnZfcHJpdmF0ZSAqdHAgPSBkZXYtPnByaXY7CisJaW50IHJldHZhbDsKKyNpZmRlZiBORVREUlZfREVCVUcKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworI2VuZGlmCisKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJcmV0dmFsID0gcmVxdWVzdF9pcnEgKGRldi0+aXJxLCBuZXRkcnZfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXR2YWwpIHsKKwkJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAlZFxuIiwgcmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwl0cC0+dHhfYnVmcyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHRwLT5wY2lfZGV2LCBUWF9CVUZfVE9UX0xFTiwKKwkJCQkJICAgJnRwLT50eF9idWZzX2RtYSk7CisJdHAtPnJ4X3JpbmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudCh0cC0+cGNpX2RldiwgUlhfQlVGX1RPVF9MRU4sCisJCQkJCSAgICZ0cC0+cnhfcmluZ19kbWEpOworCWlmICh0cC0+dHhfYnVmcyA9PSBOVUxMIHx8IHRwLT5yeF9yaW5nID09IE5VTEwpIHsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwkJaWYgKHRwLT50eF9idWZzKQorCQkJcGNpX2ZyZWVfY29uc2lzdGVudCh0cC0+cGNpX2RldiwgVFhfQlVGX1RPVF9MRU4sCisJCQkJCSAgICB0cC0+dHhfYnVmcywgdHAtPnR4X2J1ZnNfZG1hKTsKKwkJaWYgKHRwLT5yeF9yaW5nKQorCQkJcGNpX2ZyZWVfY29uc2lzdGVudCh0cC0+cGNpX2RldiwgUlhfQlVGX1RPVF9MRU4sCisJCQkJCSAgICB0cC0+cnhfcmluZywgdHAtPnJ4X3JpbmdfZG1hKTsKKworCQlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIC1FTk9NRU1cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKworCX0KKworCXRwLT5mdWxsX2R1cGxleCA9IHRwLT5kdXBsZXhfbG9jazsKKwl0cC0+dHhfZmxhZyA9IChUWF9GSUZPX1RIUkVTSCA8PCAxMSkgJiAweDAwM2YwMDAwOworCisJbmV0ZHJ2X2luaXRfcmluZyAoZGV2KTsKKwluZXRkcnZfaHdfc3RhcnQgKGRldik7CisKKwlEUFJJTlRLICgiJXM6IG5ldGRydl9vcGVuKCkgaW9hZGRyICUjbHggSVJRICVkIgorCQkJIiBHUCBQaW5zICUyLjJ4ICVzLWR1cGxleC5cbiIsCisJCQlkZXYtPm5hbWUsIHBjaV9yZXNvdXJjZV9zdGFydCAodHAtPnBjaV9kZXYsIDEpLAorCQkJZGV2LT5pcnEsIE5FVERSVl9SOCAoTWVkaWFTdGF0dXMpLAorCQkJdHAtPmZ1bGxfZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiKTsKKworCS8qIFNldCB0aGUgdGltZXIgdG8gc3dpdGNoIHRvIGNoZWNrIGZvciBsaW5rIGJlYXQgYW5kIHBlcmhhcHMgc3dpdGNoCisJICAgdG8gYW4gYWx0ZXJuYXRlIG1lZGlhIHR5cGUuICovCisJaW5pdF90aW1lciAoJnRwLT50aW1lcik7CisJdHAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMyAqIEhaOworCXRwLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKwl0cC0+dGltZXIuZnVuY3Rpb24gPSAmbmV0ZHJ2X3RpbWVyOworCWFkZF90aW1lciAoJnRwLT50aW1lcik7CisKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIDBcbiIpOworCXJldHVybiAwOworfQorCisKKy8qIFN0YXJ0IHRoZSBoYXJkd2FyZSBhdCBvcGVuIG9yIHJlc3VtZS4gKi8KK3N0YXRpYyB2b2lkIG5ldGRydl9od19zdGFydCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZHJ2X3ByaXZhdGUgKnRwID0gZGV2LT5wcml2OworCXZvaWQgKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdTMyIGk7CisKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJLyogU29mdCByZXNldCB0aGUgY2hpcC4gKi8KKwlORVREUlZfVzggKENoaXBDbWQsIChORVREUlZfUjggKENoaXBDbWQpICYgQ2hpcENtZENsZWFyKSB8IENtZFJlc2V0KTsKKwl1ZGVsYXkgKDEwMCk7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBjaGlwIGhhcyBmaW5pc2hlZCB0aGUgcmVzZXQuICovCisJZm9yIChpID0gMTAwMDsgaSA+IDA7IGktLSkKKwkJaWYgKChORVREUlZfUjggKENoaXBDbWQpICYgQ21kUmVzZXQpID09IDApCisJCQlicmVhazsKKworCS8qIFJlc3RvcmUgb3VyIGlkZWEgb2YgdGhlIE1BQyBhZGRyZXNzLiAqLworCU5FVERSVl9XMzJfRiAoTUFDMCArIDAsIGNwdV90b19sZTMyICgqKHUzMiAqKSAoZGV2LT5kZXZfYWRkciArIDApKSk7CisJTkVURFJWX1czMl9GIChNQUMwICsgNCwgY3B1X3RvX2xlMzIgKCoodTMyICopIChkZXYtPmRldl9hZGRyICsgNCkpKTsKKworCS8qIE11c3QgZW5hYmxlIFR4L1J4IGJlZm9yZSBzZXR0aW5nIHRyYW5zZmVyIHRocmVzaG9sZHMhICovCisJTkVURFJWX1c4X0YgKENoaXBDbWQsIChORVREUlZfUjggKENoaXBDbWQpICYgQ2hpcENtZENsZWFyKSB8CisJCQkgICBDbWRSeEVuYiB8IENtZFR4RW5iKTsKKworCWkgPSBuZXRkcnZfcnhfY29uZmlnIHwKKwkgICAgKE5FVERSVl9SMzIgKFJ4Q29uZmlnKSAmIHJ0bF9jaGlwX2luZm9bdHAtPmNoaXBzZXRdLlJ4Q29uZmlnTWFzayk7CisJTkVURFJWX1czMl9GIChSeENvbmZpZywgaSk7CisKKwkvKiBDaGVjayB0aGlzIHZhbHVlOiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgSUZHIGNvbnRyYWRpY3RzIGlmc2VsZi4gKi8KKwlORVREUlZfVzMyIChUeENvbmZpZywgKFRYX0RNQV9CVVJTVCA8PCBUeERNQVNoaWZ0KSk7CisKKwkvKiB1bmxvY2sgQ29uZmlnWzAxMjM0XSBhbmQgQk1DUiByZWdpc3RlciB3cml0ZXMgKi8KKwlORVREUlZfVzhfRiAoQ2ZnOTM0NiwgQ2ZnOTM0Nl9VbmxvY2spOworCXVkZWxheSAoMTApOworCisJdHAtPmN1cl9yeCA9IDA7CisKKwkvKiBMb2NrIENvbmZpZ1swMTIzNF0gYW5kIEJNQ1IgcmVnaXN0ZXIgd3JpdGVzICovCisJTkVURFJWX1c4X0YgKENmZzkzNDYsIENmZzkzNDZfTG9jayk7CisJdWRlbGF5ICgxMCk7CisKKwkvKiBpbml0IFJ4IHJpbmcgYnVmZmVyIERNQSBhZGRyZXNzICovCisJTkVURFJWX1czMl9GIChSeEJ1ZiwgdHAtPnJ4X3JpbmdfZG1hKTsKKworCS8qIGluaXQgVHggYnVmZmVyIERNQSBhZGRyZXNzZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKykKKwkJTkVURFJWX1czMl9GIChUeEFkZHIwICsgKGkgKiA0KSwgdHAtPnR4X2J1ZnNfZG1hICsgKHRwLT50eF9idWZbaV0gLSB0cC0+dHhfYnVmcykpOworCisJTkVURFJWX1czMl9GIChSeE1pc3NlZCwgMCk7CisKKwluZXRkcnZfc2V0X3J4X21vZGUgKGRldik7CisKKwkvKiBubyBlYXJseS1yeCBpbnRlcnJ1cHRzICovCisJTkVURFJWX1cxNiAoTXVsdGlJbnRyLCBORVREUlZfUjE2IChNdWx0aUludHIpICYgTXVsdGlJbnRyQ2xlYXIpOworCisJLyogbWFrZSBzdXJlIFJ4VHggaGFzIHN0YXJ0ZWQgKi8KKwlORVREUlZfVzhfRiAoQ2hpcENtZCwgKE5FVERSVl9SOCAoQ2hpcENtZCkgJiBDaGlwQ21kQ2xlYXIpIHwKKwkJCSAgIENtZFJ4RW5iIHwgQ21kVHhFbmIpOworCisJLyogRW5hYmxlIGFsbCBrbm93biBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCU5FVERSVl9XMTZfRiAoSW50ck1hc2ssIG5ldGRydl9pbnRyX21hc2spOworCisJbmV0aWZfc3RhcnRfcXVldWUgKGRldik7CisKKwlEUFJJTlRLICgiRVhJVFxuIik7Cit9CisKKworLyogSW5pdGlhbGl6ZSB0aGUgUnggYW5kIFR4IHJpbmdzLCBhbG9uZyB3aXRoIHZhcmlvdXMgJ2RldicgYml0cy4gKi8KK3N0YXRpYyB2b2lkIG5ldGRydl9pbml0X3JpbmcgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRydl9wcml2YXRlICp0cCA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwl0cC0+Y3VyX3J4ID0gMDsKKwlhdG9taWNfc2V0ICgmdHAtPmN1cl90eCwgMCk7CisJYXRvbWljX3NldCAoJnRwLT5kaXJ0eV90eCwgMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKykgeworCQl0cC0+dHhfaW5mb1tpXS5za2IgPSBOVUxMOworCQl0cC0+dHhfaW5mb1tpXS5tYXBwaW5nID0gMDsKKwkJdHAtPnR4X2J1ZltpXSA9ICZ0cC0+dHhfYnVmc1tpICogVFhfQlVGX1NJWkVdOworCX0KKworCURQUklOVEsgKCJFWElUXG4iKTsKK30KKworCitzdGF0aWMgdm9pZCBuZXRkcnZfdGltZXIgKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7CisJc3RydWN0IG5ldGRydl9wcml2YXRlICp0cCA9IGRldi0+cHJpdjsKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCWludCBuZXh0X3RpY2sgPSA2MCAqIEhaOworCWludCBtaWlfbHBhOworCisJbWlpX2xwYSA9IG1kaW9fcmVhZCAoZGV2LCB0cC0+cGh5c1swXSwgTUlJX0xQQSk7CisKKwlpZiAoIXRwLT5kdXBsZXhfbG9jayAmJiBtaWlfbHBhICE9IDB4ZmZmZikgeworCQlpbnQgZHVwbGV4ID0gKG1paV9scGEgJiBMUEFfMTAwRlVMTCkKKwkJICAgIHx8IChtaWlfbHBhICYgMHgwMUMwKSA9PSAweDAwNDA7CisJCWlmICh0cC0+ZnVsbF9kdXBsZXggIT0gZHVwbGV4KSB7CisJCQl0cC0+ZnVsbF9kdXBsZXggPSBkdXBsZXg7CisJCQlwcmludGsgKEtFUk5fSU5GTworCQkJCSIlczogU2V0dGluZyAlcy1kdXBsZXggYmFzZWQgb24gTUlJICMlZCBsaW5rIgorCQkJCSIgcGFydG5lciBhYmlsaXR5IG9mICU0LjR4LlxuIiwgZGV2LT5uYW1lLAorCQkJCXRwLT5mdWxsX2R1cGxleCA/ICJmdWxsIiA6ICJoYWxmIiwKKwkJCQl0cC0+cGh5c1swXSwgbWlpX2xwYSk7CisJCQlORVREUlZfVzggKENmZzkzNDYsIENmZzkzNDZfVW5sb2NrKTsKKwkJCU5FVERSVl9XOCAoQ29uZmlnMSwgdHAtPmZ1bGxfZHVwbGV4ID8gMHg2MCA6IDB4MjApOworCQkJTkVURFJWX1c4IChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOworCQl9CisJfQorCisJRFBSSU5USyAoIiVzOiBNZWRpYSBzZWxlY3Rpb24gdGljaywgTGluayBwYXJ0bmVyICU0LjR4LlxuIiwKKwkJIGRldi0+bmFtZSwgTkVURFJWX1IxNiAoTldheUxQQVIpKTsKKwlEUFJJTlRLICgiJXM6ICBPdGhlciByZWdpc3RlcnMgYXJlIEludE1hc2sgJTQuNHggSW50U3RhdHVzICU0LjR4IgorCQkgIiBSeFN0YXR1cyAlNC40eC5cbiIsIGRldi0+bmFtZSwKKwkJIE5FVERSVl9SMTYgKEludHJNYXNrKSwKKwkJIE5FVERSVl9SMTYgKEludHJTdGF0dXMpLAorCQkgTkVURFJWX1IzMiAoUnhFYXJseVN0YXR1cykpOworCURQUklOVEsgKCIlczogIENoaXAgY29uZmlnICUyLjJ4ICUyLjJ4LlxuIiwKKwkJIGRldi0+bmFtZSwgTkVURFJWX1I4IChDb25maWcwKSwKKwkJIE5FVERSVl9SOCAoQ29uZmlnMSkpOworCisJdHAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbmV4dF90aWNrOworCWFkZF90aW1lciAoJnRwLT50aW1lcik7Cit9CisKKworc3RhdGljIHZvaWQgbmV0ZHJ2X3R4X2NsZWFyIChzdHJ1Y3QgbmV0ZHJ2X3ByaXZhdGUgKnRwKQoreworCWludCBpOworCisJYXRvbWljX3NldCAoJnRwLT5jdXJfdHgsIDApOworCWF0b21pY19zZXQgKCZ0cC0+ZGlydHlfdHgsIDApOworCisJLyogRHVtcCB0aGUgdW5zZW50IFR4IHBhY2tldHMuICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9UWF9ERVNDOyBpKyspIHsKKwkJc3RydWN0IHJpbmdfaW5mbyAqcnAgPSAmdHAtPnR4X2luZm9baV07CisJCWlmIChycC0+bWFwcGluZyAhPSAwKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlICh0cC0+cGNpX2RldiwgcnAtPm1hcHBpbmcsCisJCQkJCSAgcnAtPnNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCXJwLT5tYXBwaW5nID0gMDsKKwkJfQorCQlpZiAocnAtPnNrYikgeworCQkJZGV2X2tmcmVlX3NrYiAocnAtPnNrYik7CisJCQlycC0+c2tiID0gTlVMTDsKKwkJCXRwLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCX0KKwl9Cit9CisKKworc3RhdGljIHZvaWQgbmV0ZHJ2X3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRydl9wcml2YXRlICp0cCA9IGRldi0+cHJpdjsKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCWludCBpOworCXU4IHRtcDg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURQUklOVEsgKCIlczogVHJhbnNtaXQgdGltZW91dCwgc3RhdHVzICUyLjJ4ICU0LjR4ICIKKwkJICJtZWRpYSAlMi4yeC5cbiIsIGRldi0+bmFtZSwKKwkJIE5FVERSVl9SOCAoQ2hpcENtZCksCisJCSBORVREUlZfUjE2IChJbnRyU3RhdHVzKSwKKwkJIE5FVERSVl9SOCAoTWVkaWFTdGF0dXMpKTsKKworCS8qIGRpc2FibGUgVHggQVNBUCwgaWYgbm90IGFscmVhZHkgKi8KKwl0bXA4ID0gTkVURFJWX1I4IChDaGlwQ21kKTsKKwlpZiAodG1wOCAmIENtZFR4RW5iKQorCQlORVREUlZfVzggKENoaXBDbWQsIHRtcDggJiB+Q21kVHhFbmIpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGJ5IGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlORVREUlZfVzE2IChJbnRyTWFzaywgMHgwMDAwKTsKKworCS8qIEVtaXQgaW5mbyB0byBmaWd1cmUgb3V0IHdoYXQgd2VudCB3cm9uZy4gKi8KKwlwcmludGsgKEtFUk5fREVCVUcgIiVzOiBUeCBxdWV1ZSBzdGFydCBlbnRyeSAlZCAgZGlydHkgZW50cnkgJWQuXG4iLAorCQlkZXYtPm5hbWUsIGF0b21pY19yZWFkICgmdHAtPmN1cl90eCksCisJCWF0b21pY19yZWFkICgmdHAtPmRpcnR5X3R4KSk7CisJZm9yIChpID0gMDsgaSA8IE5VTV9UWF9ERVNDOyBpKyspCisJCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6ICBUeCBkZXNjcmlwdG9yICVkIGlzICU4LjhseC4lc1xuIiwKKwkJCWRldi0+bmFtZSwgaSwgTkVURFJWX1IzMiAoVHhTdGF0dXMwICsgKGkgKiA0KSksCisJCQlpID09IGF0b21pY19yZWFkICgmdHAtPmRpcnR5X3R4KSAlIE5VTV9UWF9ERVNDID8KKwkJCQkiIChxdWV1ZSBoZWFkKSIgOiAiIik7CisKKwkvKiBTdG9wIGEgc2hhcmVkIGludGVycnVwdCBmcm9tIHNjYXZlbmdpbmcgd2hpbGUgd2UgYXJlLiAqLworCXNwaW5fbG9ja19pcnFzYXZlICgmdHAtPmxvY2ssIGZsYWdzKTsKKwkKKwluZXRkcnZfdHhfY2xlYXIgKHRwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJLyogLi4uYW5kIGZpbmFsbHksIHJlc2V0IGV2ZXJ5dGhpbmcgKi8KKwluZXRkcnZfaHdfc3RhcnQgKGRldik7CisKKwluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworfQorCisKKworc3RhdGljIGludCBuZXRkcnZfc3RhcnRfeG1pdCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZHJ2X3ByaXZhdGUgKnRwID0gZGV2LT5wcml2OworCXZvaWQgKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJaW50IGVudHJ5OworCisJLyogQ2FsY3VsYXRlIHRoZSBuZXh0IFR4IGRlc2NyaXB0b3IgZW50cnkuICovCisJZW50cnkgPSBhdG9taWNfcmVhZCAoJnRwLT5jdXJfdHgpICUgTlVNX1RYX0RFU0M7CisKKwlhc3NlcnQgKHRwLT50eF9pbmZvW2VudHJ5XS5za2IgPT0gTlVMTCk7CisJYXNzZXJ0ICh0cC0+dHhfaW5mb1tlbnRyeV0ubWFwcGluZyA9PSAwKTsKKworCXRwLT50eF9pbmZvW2VudHJ5XS5za2IgPSBza2I7CisJLyogdHAtPnR4X2luZm9bZW50cnldLm1hcHBpbmcgPSAwOyAqLworCW1lbWNweSAodHAtPnR4X2J1ZltlbnRyeV0sIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCisJLyogTm90ZTogdGhlIGNoaXAgZG9lc24ndCBoYXZlIGF1dG8tcGFkISAqLworCU5FVERSVl9XMzIgKFR4U3RhdHVzMCArIChlbnRyeSAqIHNpemVvZih1MzIpKSwKKwkJIHRwLT50eF9mbGFnIHwgKHNrYi0+bGVuID49IEVUSF9aTEVOID8gc2tiLT5sZW4gOiBFVEhfWkxFTikpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJYXRvbWljX2luYyAoJnRwLT5jdXJfdHgpOworCWlmICgoYXRvbWljX3JlYWQgKCZ0cC0+Y3VyX3R4KSAtIGF0b21pY19yZWFkICgmdHAtPmRpcnR5X3R4KSkgPj0gTlVNX1RYX0RFU0MpCisJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisKKwlEUFJJTlRLICgiJXM6IFF1ZXVlZCBUeCBwYWNrZXQgYXQgJXAgc2l6ZSAldSB0byBzbG90ICVkLlxuIiwKKwkJIGRldi0+bmFtZSwgc2tiLT5kYXRhLCBza2ItPmxlbiwgZW50cnkpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgbmV0ZHJ2X3R4X2ludGVycnVwdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBuZXRkcnZfcHJpdmF0ZSAqdHAsCisJCQkJICB2b2lkICppb2FkZHIpCit7CisJaW50IGN1cl90eCwgZGlydHlfdHgsIHR4X2xlZnQ7CisKKwlhc3NlcnQgKGRldiAhPSBOVUxMKTsKKwlhc3NlcnQgKHRwICE9IE5VTEwpOworCWFzc2VydCAoaW9hZGRyICE9IE5VTEwpOworCisJZGlydHlfdHggPSBhdG9taWNfcmVhZCAoJnRwLT5kaXJ0eV90eCk7CisKKwljdXJfdHggPSBhdG9taWNfcmVhZCAoJnRwLT5jdXJfdHgpOworCXR4X2xlZnQgPSBjdXJfdHggLSBkaXJ0eV90eDsKKwl3aGlsZSAodHhfbGVmdCA+IDApIHsKKwkJaW50IGVudHJ5ID0gZGlydHlfdHggJSBOVU1fVFhfREVTQzsKKwkJaW50IHR4c3RhdHVzOworCisJCXR4c3RhdHVzID0gTkVURFJWX1IzMiAoVHhTdGF0dXMwICsgKGVudHJ5ICogc2l6ZW9mICh1MzIpKSk7CisKKwkJaWYgKCEodHhzdGF0dXMgJiAoVHhTdGF0T0sgfCBUeFVuZGVycnVuIHwgVHhBYm9ydGVkKSkpCisJCQlicmVhazsJLyogSXQgc3RpbGwgaGFzbid0IGJlZW4gVHhlZCAqLworCisJCS8qIE5vdGU6IFR4Q2Fycmllckxvc3QgaXMgYWx3YXlzIGFzc2VydGVkIGF0IDEwMG1icHMuICovCisJCWlmICh0eHN0YXR1cyAmIChUeE91dE9mV2luZG93IHwgVHhBYm9ydGVkKSkgeworCQkJLyogVGhlcmUgd2FzIGFuIG1ham9yIGVycm9yLCBsb2cgaXQuICovCisJCQlEUFJJTlRLICgiJXM6IFRyYW5zbWl0IGVycm9yLCBUeCBzdGF0dXMgJTguOHguXG4iLAorCQkJCSBkZXYtPm5hbWUsIHR4c3RhdHVzKTsKKwkJCXRwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmICh0eHN0YXR1cyAmIFR4QWJvcnRlZCkgeworCQkJCXRwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJCU5FVERSVl9XMzIgKFR4Q29uZmlnLCBUeENsZWFyQWJ0IHwgKFRYX0RNQV9CVVJTVCA8PCBUeERNQVNoaWZ0KSk7CisJCQl9CisJCQlpZiAodHhzdGF0dXMgJiBUeENhcnJpZXJMb3N0KQorCQkJCXRwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJaWYgKHR4c3RhdHVzICYgVHhPdXRPZldpbmRvdykKKwkJCQl0cC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJaWYgKHR4c3RhdHVzICYgVHhVbmRlcnJ1bikgeworCQkJCS8qIEFkZCA2NCB0byB0aGUgVHggRklGTyB0aHJlc2hvbGQuICovCisJCQkJaWYgKHRwLT50eF9mbGFnIDwgMHgwMDMwMDAwMCkKKwkJCQkJdHAtPnR4X2ZsYWcgKz0gMHgwMDAyMDAwMDsKKwkJCQl0cC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCX0KKwkJCXRwLT5zdGF0cy5jb2xsaXNpb25zICs9ICh0eHN0YXR1cyA+PiAyNCkgJiAxNTsKKwkJCXRwLT5zdGF0cy50eF9ieXRlcyArPSB0eHN0YXR1cyAmIDB4N2ZmOworCQkJdHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJfQorCisJCS8qIEZyZWUgdGhlIG9yaWdpbmFsIHNrYi4gKi8KKwkJaWYgKHRwLT50eF9pbmZvW2VudHJ5XS5tYXBwaW5nICE9IDApIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUodHAtPnBjaV9kZXYsCisJCQkJCSB0cC0+dHhfaW5mb1tlbnRyeV0ubWFwcGluZywKKwkJCQkJIHRwLT50eF9pbmZvW2VudHJ5XS5za2ItPmxlbiwKKwkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJdHAtPnR4X2luZm9bZW50cnldLm1hcHBpbmcgPSAwOworCQl9CisJCWRldl9rZnJlZV9za2JfaXJxICh0cC0+dHhfaW5mb1tlbnRyeV0uc2tiKTsKKwkJdHAtPnR4X2luZm9bZW50cnldLnNrYiA9IE5VTEw7CisJCWRpcnR5X3R4Kys7CisJCWlmIChkaXJ0eV90eCA8IDApIHsgLyogaGFuZGxlIHNpZ25lZCBpbnQgb3ZlcmZsb3cgKi8KKwkJCWF0b21pY19zdWIgKGN1cl90eCwgJnRwLT5jdXJfdHgpOyAvKiBYWFggcmFjeT8gKi8KKwkJCWRpcnR5X3R4ID0gY3VyX3R4IC0gdHhfbGVmdCArIDE7CisJCX0KKwkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQgKGRldikpCisJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCisJCWN1cl90eCA9IGF0b21pY19yZWFkICgmdHAtPmN1cl90eCk7CisJCXR4X2xlZnQgPSBjdXJfdHggLSBkaXJ0eV90eDsKKworCX0KKworI2lmbmRlZiBORVREUlZfTkRFQlVHCisJaWYgKGF0b21pY19yZWFkICgmdHAtPmN1cl90eCkgLSBkaXJ0eV90eCA+IE5VTV9UWF9ERVNDKSB7CisJCXByaW50ayAoS0VSTl9FUlIKKwkJICAiJXM6IE91dC1vZi1zeW5jIGRpcnR5IHBvaW50ZXIsICVkIHZzLiAlZC5cbiIsCisJCSAgICAgZGV2LT5uYW1lLCBkaXJ0eV90eCwgYXRvbWljX3JlYWQgKCZ0cC0+Y3VyX3R4KSk7CisJCWRpcnR5X3R4ICs9IE5VTV9UWF9ERVNDOworCX0KKyNlbmRpZiAvKiBORVREUlZfTkRFQlVHICovCisKKwlhdG9taWNfc2V0ICgmdHAtPmRpcnR5X3R4LCBkaXJ0eV90eCk7Cit9CisKKworLyogVE9ETzogY2xlYW4gdGhpcyB1cCEgIFJ4IHJlc2V0IG5lZWQgbm90IGJlIHRoaXMgaW50ZW5zaXZlICovCitzdGF0aWMgdm9pZCBuZXRkcnZfcnhfZXJyICh1MzIgcnhfc3RhdHVzLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBuZXRkcnZfcHJpdmF0ZSAqdHAsIHZvaWQgKmlvYWRkcikKK3sKKwl1OCB0bXA4OworCWludCB0bXBfd29yayA9IDEwMDA7CisKKwlEUFJJTlRLICgiJXM6IEV0aGVybmV0IGZyYW1lIGhhZCBlcnJvcnMsIHN0YXR1cyAlOC44eC5cbiIsCisJICAgICAgICAgZGV2LT5uYW1lLCByeF9zdGF0dXMpOworCWlmIChyeF9zdGF0dXMgJiBSeFRvb0xvbmcpIHsKKwkJRFBSSU5USyAoIiVzOiBPdmVyc2l6ZWQgRXRoZXJuZXQgZnJhbWUsIHN0YXR1cyAlNC40eCFcbiIsCisJCQkgZGV2LT5uYW1lLCByeF9zdGF0dXMpOworCQkvKiBBLkMuOiBUaGUgY2hpcCBoYW5ncyBoZXJlLiAqLworCX0KKwl0cC0+c3RhdHMucnhfZXJyb3JzKys7CisJaWYgKHJ4X3N0YXR1cyAmIChSeEJhZFN5bWJvbCB8IFJ4QmFkQWxpZ24pKQorCQl0cC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJaWYgKHJ4X3N0YXR1cyAmIChSeFJ1bnQgfCBSeFRvb0xvbmcpKQorCQl0cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCWlmIChyeF9zdGF0dXMgJiBSeENSQ0VycikKKwkJdHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkvKiBSZXNldCB0aGUgcmVjZWl2ZXIsIGJhc2VkIG9uIFJlYWxUZWsgcmVjb21tZW5kYXRpb24uIChCdWc/KSAqLworCXRwLT5jdXJfcnggPSAwOworCisJLyogZGlzYWJsZSByZWNlaXZlICovCisJdG1wOCA9IE5FVERSVl9SOCAoQ2hpcENtZCkgJiBDaGlwQ21kQ2xlYXI7CisJTkVURFJWX1c4X0YgKENoaXBDbWQsIHRtcDggfCBDbWRUeEVuYik7CisKKwkvKiBBLkMuOiBSZXNldCB0aGUgbXVsdGljYXN0IGxpc3QuICovCisJbmV0ZHJ2X3NldF9yeF9tb2RlIChkZXYpOworCisJLyogWFhYIHBvdGVudGlhbGx5IHRlbXBvcmFyeSBoYWNrIHRvCisJICogcmVzdGFydCBodW5nIHJlY2VpdmVyICovCisJd2hpbGUgKC0tdG1wX3dvcmsgPiAwKSB7CisJCXRtcDggPSBORVREUlZfUjggKENoaXBDbWQpOworCQlpZiAoKHRtcDggJiBDbWRSeEVuYikgJiYgKHRtcDggJiBDbWRUeEVuYikpCisJCQlicmVhazsKKwkJTkVURFJWX1c4X0YgKENoaXBDbWQsCisJCQkgICh0bXA4ICYgQ2hpcENtZENsZWFyKSB8IENtZFJ4RW5iIHwgQ21kVHhFbmIpOworCX0KKworCS8qIEcuUy46IFJlLWVuYWJsZSByZWNlaXZlciAqLworCS8qIFhYWCB0ZW1wb3JhcnkgaGFjayB0byB3b3JrIGFyb3VuZCByZWNlaXZlciBoYW5nICovCisJbmV0ZHJ2X3NldF9yeF9tb2RlIChkZXYpOworCisJaWYgKHRtcF93b3JrIDw9IDApCisJCXByaW50ayAoS0VSTl9XQVJOSU5HIFBGWCAidHgvcnggZW5hYmxlIHdhaXQgdG9vIGxvbmdcbiIpOworfQorCisKKy8qIFRoZSBkYXRhIHNoZWV0IGRvZXNuJ3QgZGVzY3JpYmUgdGhlIFJ4IHJpbmcgYXQgYWxsLCBzbyBJJ20gZ3Vlc3NpbmcgYXQgdGhlCisgICBmaWVsZCBhbGlnbm1lbnRzIGFuZCBzZW1hbnRpY3MuICovCitzdGF0aWMgdm9pZCBuZXRkcnZfcnhfaW50ZXJydXB0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IG5ldGRydl9wcml2YXRlICp0cCwgdm9pZCAqaW9hZGRyKQoreworCXVuc2lnbmVkIGNoYXIgKnJ4X3Jpbmc7CisJdTE2IGN1cl9yeDsKKworCWFzc2VydCAoZGV2ICE9IE5VTEwpOworCWFzc2VydCAodHAgIT0gTlVMTCk7CisJYXNzZXJ0IChpb2FkZHIgIT0gTlVMTCk7CisKKwlyeF9yaW5nID0gdHAtPnJ4X3Jpbmc7CisJY3VyX3J4ID0gdHAtPmN1cl9yeDsKKworCURQUklOVEsgKCIlczogSW4gbmV0ZHJ2X3J4KCksIGN1cnJlbnQgJTQuNHggQnVmQWRkciAlNC40eCwiCisJCSAiIGZyZWUgdG8gJTQuNHgsIENtZCAlMi4yeC5cbiIsIGRldi0+bmFtZSwgY3VyX3J4LAorCQkgTkVURFJWX1IxNiAoUnhCdWZBZGRyKSwKKwkJIE5FVERSVl9SMTYgKFJ4QnVmUHRyKSwgTkVURFJWX1I4IChDaGlwQ21kKSk7CisKKwl3aGlsZSAoKE5FVERSVl9SOCAoQ2hpcENtZCkgJiBSeEJ1ZkVtcHR5KSA9PSAwKSB7CisJCWludCByaW5nX29mZnNldCA9IGN1cl9yeCAlIFJYX0JVRl9MRU47CisJCXUzMiByeF9zdGF0dXM7CisJCXVuc2lnbmVkIGludCByeF9zaXplOworCQl1bnNpZ25lZCBpbnQgcGt0X3NpemU7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJLyogcmVhZCBzaXplK3N0YXR1cyBvZiBuZXh0IGZyYW1lIGZyb20gRE1BIHJpbmcgYnVmZmVyICovCisJCXJ4X3N0YXR1cyA9IGxlMzJfdG9fY3B1ICgqKHUzMiAqKSAocnhfcmluZyArIHJpbmdfb2Zmc2V0KSk7CisJCXJ4X3NpemUgPSByeF9zdGF0dXMgPj4gMTY7CisJCXBrdF9zaXplID0gcnhfc2l6ZSAtIDQ7CisKKwkJRFBSSU5USyAoIiVzOiAgbmV0ZHJ2X3J4KCkgc3RhdHVzICU0LjR4LCBzaXplICU0LjR4LCIKKwkJCSAiIGN1ciAlNC40eC5cbiIsIGRldi0+bmFtZSwgcnhfc3RhdHVzLAorCQkJIHJ4X3NpemUsIGN1cl9yeCk7CisjaWYgTkVURFJWX0RFQlVHID4gMgorCQl7CisJCQlpbnQgaTsKKwkJCURQUklOVEsgKCIlczogRnJhbWUgY29udGVudHMgIiwgZGV2LT5uYW1lKTsKKwkJCWZvciAoaSA9IDA7IGkgPCA3MDsgaSsrKQorCQkJCXByaW50ayAoIiAlMi4yeCIsCisJCQkJCXJ4X3JpbmdbcmluZ19vZmZzZXQgKyBpXSk7CisJCQlwcmludGsgKCIuXG4iKTsKKwkJfQorI2VuZGlmCisKKwkJLyogSWYgUnggZXJyIG9yIGludmFsaWQgcnhfc2l6ZS9yeF9zdGF0dXMgcmVjZWl2ZWQKKwkJICogKHdoaWNoIGhhcHBlbnMgaWYgd2UgZ2V0IGxvc3QgaW4gdGhlIHJpbmcpLAorCQkgKiBSeCBwcm9jZXNzIGdldHMgcmVzZXQsIHNvIHdlIGFib3J0IGFueSBmdXJ0aGVyCisJCSAqIFJ4IHByb2Nlc3NpbmcuCisJCSAqLworCQlpZiAoKHJ4X3NpemUgPiAoTUFYX0VUSF9GUkFNRV9TSVpFKzQpKSB8fAorCQkgICAgKCEocnhfc3RhdHVzICYgUnhTdGF0dXNPSykpKSB7CisJCQluZXRkcnZfcnhfZXJyIChyeF9zdGF0dXMsIGRldiwgdHAsIGlvYWRkcik7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlciwgY29tcGF0aWJsZSB3aXRoIG5ldC0yZS4gKi8KKwkJLyogT21pdCB0aGUgZm91ciBvY3RldCBDUkMgZnJvbSB0aGUgbGVuZ3RoLiAqLworCisJCS8qIFRPRE86IGNvbnNpZGVyIGFsbG9jYXRpbmcgc2tiJ3Mgb3V0c2lkZSBvZgorCQkgKiBpbnRlcnJ1cHQgY29udGV4dCwgYm90aCB0byBzcGVlZCBpbnRlcnJ1cHQgcHJvY2Vzc2luZywKKwkJICogYW5kIGFsc28gdG8gcmVkdWNlIHRoZSBjaGFuY2VzIG9mIGhhdmluZyB0bworCQkgKiBkcm9wIHBhY2tldHMgaGVyZSB1bmRlciBtZW1vcnkgcHJlc3N1cmUuCisJCSAqLworCisJCXNrYiA9IGRldl9hbGxvY19za2IgKHBrdF9zaXplICsgMik7CisJCWlmIChza2IpIHsKKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJc2tiX3Jlc2VydmUgKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGZpZWxkcy4gKi8KKworCQkJZXRoX2NvcHlfYW5kX3N1bSAoc2tiLCAmcnhfcmluZ1tyaW5nX29mZnNldCArIDRdLCBwa3Rfc2l6ZSwgMCk7CisJCQlza2JfcHV0IChza2IsIHBrdF9zaXplKTsKKworCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zIChza2IsIGRldik7CisJCQluZXRpZl9yeCAoc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQl0cC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X3NpemU7CisJCQl0cC0+c3RhdHMucnhfcGFja2V0cysrOworCQl9IGVsc2UgeworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcKKwkJCQkiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCQl0cC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQl9CisKKwkJY3VyX3J4ID0gKGN1cl9yeCArIHJ4X3NpemUgKyA0ICsgMykgJiB+MzsKKwkJTkVURFJWX1cxNl9GIChSeEJ1ZlB0ciwgY3VyX3J4IC0gMTYpOworCX0KKworCURQUklOVEsgKCIlczogRG9uZSBuZXRkcnZfcngoKSwgY3VycmVudCAlNC40eCBCdWZBZGRyICU0LjR4LCIKKwkJICIgZnJlZSB0byAlNC40eCwgQ21kICUyLjJ4LlxuIiwgZGV2LT5uYW1lLCBjdXJfcngsCisJCSBORVREUlZfUjE2IChSeEJ1ZkFkZHIpLAorCQkgTkVURFJWX1IxNiAoUnhCdWZQdHIpLCBORVREUlZfUjggKENoaXBDbWQpKTsKKworCXRwLT5jdXJfcnggPSBjdXJfcng7Cit9CisKKworc3RhdGljIHZvaWQgbmV0ZHJ2X3dlaXJkX2ludGVycnVwdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBuZXRkcnZfcHJpdmF0ZSAqdHAsCisJCQkJICAgICB2b2lkICppb2FkZHIsCisJCQkJICAgICBpbnQgc3RhdHVzLCBpbnQgbGlua19jaGFuZ2VkKQoreworCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6IEFibm9ybWFsIGludGVycnVwdCwgc3RhdHVzICU4Ljh4LlxuIiwKKwkJZGV2LT5uYW1lLCBzdGF0dXMpOworCisJYXNzZXJ0IChkZXYgIT0gTlVMTCk7CisJYXNzZXJ0ICh0cCAhPSBOVUxMKTsKKwlhc3NlcnQgKGlvYWRkciAhPSBOVUxMKTsKKworCS8qIFVwZGF0ZSB0aGUgZXJyb3IgY291bnQuICovCisJdHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gTkVURFJWX1IzMiAoUnhNaXNzZWQpOworCU5FVERSVl9XMzIgKFJ4TWlzc2VkLCAwKTsKKworCWlmICgoc3RhdHVzICYgUnhVbmRlcnJ1bikgJiYgbGlua19jaGFuZ2VkICYmCisJICAgICh0cC0+ZHJ2X2ZsYWdzICYgSEFTX0xOS19DSE5HKSkgeworCQkvKiBSZWFsbHkgbGluay1jaGFuZ2Ugb24gbmV3IGNoaXBzLiAqLworCQlpbnQgbHBhciA9IE5FVERSVl9SMTYgKE5XYXlMUEFSKTsKKwkJaW50IGR1cGxleCA9IChscGFyICYgMHgwMTAwKSB8fCAobHBhciAmIDB4MDFDMCkgPT0gMHgwMDQwCisJCQkJfHwgdHAtPmR1cGxleF9sb2NrOworCQlpZiAodHAtPmZ1bGxfZHVwbGV4ICE9IGR1cGxleCkgeworCQkJdHAtPmZ1bGxfZHVwbGV4ID0gZHVwbGV4OworCQkJTkVURFJWX1c4IChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisJCQlORVREUlZfVzggKENvbmZpZzEsIHRwLT5mdWxsX2R1cGxleCA/IDB4NjAgOiAweDIwKTsKKwkJCU5FVERSVl9XOCAoQ2ZnOTM0NiwgQ2ZnOTM0Nl9Mb2NrKTsKKwkJfQorCQlzdGF0dXMgJj0gflJ4VW5kZXJydW47CisJfQorCisJLyogWFhYIGFsb25nIHdpdGggbmV0ZHJ2X3J4X2VyciwgYXJlIHdlIGRvdWJsZS1jb3VudGluZyBlcnJvcnM/ICovCisJaWYgKHN0YXR1cyAmCisJICAgIChSeFVuZGVycnVuIHwgUnhPdmVyZmxvdyB8IFJ4RXJyIHwgUnhGSUZPT3ZlcikpCisJCXRwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKworCWlmIChzdGF0dXMgJiAoUENTVGltZW91dCkpCisJCXRwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIChSeFVuZGVycnVuIHwgUnhGSUZPT3ZlcikpCisJCXRwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCWlmIChzdGF0dXMgJiBSeE92ZXJmbG93KSB7CisJCXRwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQl0cC0+Y3VyX3J4ID0gTkVURFJWX1IxNiAoUnhCdWZBZGRyKSAlIFJYX0JVRl9MRU47CisJCU5FVERSVl9XMTZfRiAoUnhCdWZQdHIsIHRwLT5jdXJfcnggLSAxNik7CisJfQorCWlmIChzdGF0dXMgJiBQQ0lFcnIpIHsKKwkJdTE2IHBjaV9jbWRfc3RhdHVzOworCQlwY2lfcmVhZF9jb25maWdfd29yZCAodHAtPnBjaV9kZXYsIFBDSV9TVEFUVVMsICZwY2lfY21kX3N0YXR1cyk7CisKKwkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IFBDSSBCdXMgZXJyb3IgJTQuNHguXG4iLAorCQkJZGV2LT5uYW1lLCBwY2lfY21kX3N0YXR1cyk7CisJfQorfQorCisKKy8qIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBkb2VzIGFsbCBvZiB0aGUgUnggdGhyZWFkIHdvcmsgYW5kIGNsZWFucyB1cAorICAgYWZ0ZXIgdGhlIFR4IHRocmVhZC4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBuZXRkcnZfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsCisJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IG5ldGRydl9wcml2YXRlICp0cCA9IGRldi0+cHJpdjsKKwlpbnQgYm9ndXNjbnQgPSBtYXhfaW50ZXJydXB0X3dvcms7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwlpbnQgc3RhdHVzID0gMCwgbGlua19jaGFuZ2VkID0gMDsgLyogYXZvaWQgYm9ndXMgInVuaW5pdCIgd2FybmluZyAqLworCWludCBoYW5kbGVkID0gMDsKKworCXNwaW5fbG9jayAoJnRwLT5sb2NrKTsKKworCWRvIHsKKwkJc3RhdHVzID0gTkVURFJWX1IxNiAoSW50clN0YXR1cyk7CisKKwkJLyogaC93IG5vIGxvbmdlciBwcmVzZW50IChob3RwbHVnPykgb3IgbWFqb3IgZXJyb3IsIGJhaWwgKi8KKwkJaWYgKHN0YXR1cyA9PSAweEZGRkYpCisJCQlicmVhazsKKworCQloYW5kbGVkID0gMTsKKwkJLyogQWNrbm93bGVkZ2UgYWxsIG9mIHRoZSBjdXJyZW50IGludGVycnVwdCBzb3VyY2VzIEFTQVAgKi8KKwkJTkVURFJWX1cxNl9GIChJbnRyU3RhdHVzLCBzdGF0dXMpOworCisJCURQUklOVEsgKCIlczogaW50ZXJydXB0ICBzdGF0dXM9JSM0LjR4IG5ldyBpbnRzdGF0PSUjNC40eC5cbiIsCisJCQkJZGV2LT5uYW1lLCBzdGF0dXMsCisJCQkJTkVURFJWX1IxNiAoSW50clN0YXR1cykpOworCisJCWlmICgoc3RhdHVzICYKKwkJICAgICAoUENJRXJyIHwgUENTVGltZW91dCB8IFJ4VW5kZXJydW4gfCBSeE92ZXJmbG93IHwKKwkJICAgICAgUnhGSUZPT3ZlciB8IFR4RXJyIHwgVHhPSyB8IFJ4RXJyIHwgUnhPSykpID09IDApCisJCQlicmVhazsKKworCQkvKiBDaGVjayB1bmNvbW1vbiBldmVudHMgd2l0aCBvbmUgdGVzdC4gKi8KKwkJaWYgKHN0YXR1cyAmIChQQ0lFcnIgfCBQQ1NUaW1lb3V0IHwgUnhVbmRlcnJ1biB8IFJ4T3ZlcmZsb3cgfAorCQkgIAkgICAgICBSeEZJRk9PdmVyIHwgVHhFcnIgfCBSeEVycikpCisJCQluZXRkcnZfd2VpcmRfaW50ZXJydXB0IChkZXYsIHRwLCBpb2FkZHIsCisJCQkJCQkgc3RhdHVzLCBsaW5rX2NoYW5nZWQpOworCisJCWlmIChzdGF0dXMgJiAoUnhPSyB8IFJ4VW5kZXJydW4gfCBSeE92ZXJmbG93IHwgUnhGSUZPT3ZlcikpCS8qIFJ4IGludGVycnVwdCAqLworCQkJbmV0ZHJ2X3J4X2ludGVycnVwdCAoZGV2LCB0cCwgaW9hZGRyKTsKKworCQlpZiAoc3RhdHVzICYgKFR4T0sgfCBUeEVycikpCisJCQluZXRkcnZfdHhfaW50ZXJydXB0IChkZXYsIHRwLCBpb2FkZHIpOworCisJCWJvZ3VzY250LS07CisJfSB3aGlsZSAoYm9ndXNjbnQgPiAwKTsKKworCWlmIChib2d1c2NudCA8PSAwKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HCisJCQkiJXM6IFRvbyBtdWNoIHdvcmsgYXQgaW50ZXJydXB0LCAiCisJCQkiSW50clN0YXR1cz0weCU0LjR4LlxuIiwgZGV2LT5uYW1lLAorCQkJc3RhdHVzKTsKKworCQkvKiBDbGVhciBhbGwgaW50ZXJydXB0IHNvdXJjZXMuICovCisJCU5FVERSVl9XMTYgKEludHJTdGF0dXMsIDB4ZmZmZik7CisJfQorCisJc3Bpbl91bmxvY2sgKCZ0cC0+bG9jayk7CisKKwlEUFJJTlRLICgiJXM6IGV4aXRpbmcgaW50ZXJydXB0LCBpbnRyX3N0YXR1cz0lIzQuNHguXG4iLAorCQkgZGV2LT5uYW1lLCBORVREUlZfUjE2IChJbnRyU3RhdHVzKSk7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKworc3RhdGljIGludCBuZXRkcnZfY2xvc2UgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRydl9wcml2YXRlICp0cCA9IGRldi0+cHJpdjsKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworCURQUklOVEsgKCIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQsIHN0YXR1cyB3YXMgMHglNC40eC5cbiIsCisJCQlkZXYtPm5hbWUsIE5FVERSVl9SMTYgKEludHJTdGF0dXMpKTsKKworCWRlbF90aW1lcl9zeW5jICgmdHAtPnRpbWVyKTsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmdHAtPmxvY2ssIGZsYWdzKTsKKworCS8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggRE1BIHByb2Nlc3Nlcy4gKi8KKwlORVREUlZfVzggKENoaXBDbWQsIChORVREUlZfUjggKENoaXBDbWQpICYgQ2hpcENtZENsZWFyKSk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYnkgY2xlYXJpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCU5FVERSVl9XMTYgKEludHJNYXNrLCAweDAwMDApOworCisJLyogVXBkYXRlIHRoZSBlcnJvciBjb3VudHMuICovCisJdHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gTkVURFJWX1IzMiAoUnhNaXNzZWQpOworCU5FVERSVl9XMzIgKFJ4TWlzc2VkLCAwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJc3luY2hyb25pemVfaXJxICgpOworCWZyZWVfaXJxIChkZXYtPmlycSwgZGV2KTsKKworCW5ldGRydl90eF9jbGVhciAodHApOworCisJcGNpX2ZyZWVfY29uc2lzdGVudCh0cC0+cGNpX2RldiwgUlhfQlVGX1RPVF9MRU4sCisJCQkgICAgdHAtPnJ4X3JpbmcsIHRwLT5yeF9yaW5nX2RtYSk7CisJcGNpX2ZyZWVfY29uc2lzdGVudCh0cC0+cGNpX2RldiwgVFhfQlVGX1RPVF9MRU4sCisJCQkgICAgdHAtPnR4X2J1ZnMsIHRwLT50eF9idWZzX2RtYSk7CisJdHAtPnJ4X3JpbmcgPSBOVUxMOworCXRwLT50eF9idWZzID0gTlVMTDsKKworCS8qIEdyZWVuISBQdXQgdGhlIGNoaXAgaW4gbG93LXBvd2VyIG1vZGUuICovCisJTkVURFJWX1c4IChDZmc5MzQ2LCBDZmc5MzQ2X1VubG9jayk7CisJTkVURFJWX1c4IChDb25maWcxLCAweDAzKTsKKwlORVREUlZfVzggKENmZzkzNDYsIENmZzkzNDZfTG9jayk7CisKKwlEUFJJTlRLICgiRVhJVFxuIik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBuZXRkcnZfaW9jdGwgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IG5ldGRydl9wcml2YXRlICp0cCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkocnEpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gMDsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0dNSUlQSFk6CQkvKiBHZXQgYWRkcmVzcyBvZiBNSUkgUEhZIGluIHVzZS4gKi8KKwkJZGF0YS0+cGh5X2lkID0gdHAtPnBoeXNbMF0gJiAweDNmOworCQkvKiBGYWxsIFRocm91Z2ggKi8KKworCWNhc2UgU0lPQ0dNSUlSRUc6CQkvKiBSZWFkIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJCXNwaW5fbG9ja19pcnFzYXZlICgmdHAtPmxvY2ssIGZsYWdzKTsKKwkJZGF0YS0+dmFsX291dCA9IG1kaW9fcmVhZCAoZGV2LCBkYXRhLT5waHlfaWQgJiAweDFmLCBkYXRhLT5yZWdfbnVtICYgMHgxZik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZ0cC0+bG9jaywgZmxhZ3MpOworCQlicmVhazsKKworCWNhc2UgU0lPQ1NNSUlSRUc6CQkvKiBXcml0ZSBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCQlpZiAoIWNhcGFibGUgKENBUF9ORVRfQURNSU4pKSB7CisJCQlyYyA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUgKCZ0cC0+bG9jaywgZmxhZ3MpOworCQltZGlvX3dyaXRlIChkZXYsIGRhdGEtPnBoeV9pZCAmIDB4MWYsIGRhdGEtPnJlZ19udW0gJiAweDFmLCBkYXRhLT52YWxfaW4pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmdHAtPmxvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyYyA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKKwl9CisKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nICVkXG4iLCByYyk7CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0ZHJ2X2dldF9zdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZHJ2X3ByaXZhdGUgKnRwID0gZGV2LT5wcml2OworCXZvaWQgKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJYXNzZXJ0ICh0cCAhPSBOVUxMKTsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSAoJnRwLT5sb2NrLCBmbGFncyk7CisKKwkJdHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gTkVURFJWX1IzMiAoUnhNaXNzZWQpOworCQlORVREUlZfVzMyIChSeE1pc3NlZCwgMCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnRwLT5sb2NrLCBmbGFncyk7CisJfQorCisJRFBSSU5USyAoIkVYSVRcbiIpOworCXJldHVybiAmdHAtPnN0YXRzOworfQorCisvKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAgIFRoaXMgcm91dGluZSBpcyBub3Qgc3RhdGUgc2Vuc2l0aXZlIGFuZCBuZWVkIG5vdCBiZSBTTVAgbG9ja2VkLiAqLworCitzdGF0aWMgdm9pZCBuZXRkcnZfc2V0X3J4X21vZGUgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRydl9wcml2YXRlICp0cCA9IGRldi0+cHJpdjsKKwl2b2lkICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXUzMiBtY19maWx0ZXJbMl07CS8qIE11bHRpY2FzdCBoYXNoIGZpbHRlciAqLworCWludCBpLCByeF9tb2RlOworCXUzMiB0bXA7CisKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJRFBSSU5USyAoIiVzOiAgIG5ldGRydl9zZXRfcnhfbW9kZSglNC40eCkgZG9uZSAtLSBSeCBjb25maWcgJTguOHguXG4iLAorCQkJZGV2LT5uYW1lLCBkZXYtPmZsYWdzLCBORVREUlZfUjMyIChSeENvbmZpZykpOworCisJLyogTm90ZTogZG8gbm90IHJlb3JkZXIsIEdDQyBpcyBjbGV2ZXIgYWJvdXQgY29tbW9uIHN0YXRlbWVudHMuICovCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQkvKiBVbmNvbmRpdGlvbmFsbHkgbG9nIG5ldCB0YXBzLiAqLworCQlwcmludGsgKEtFUk5fTk9USUNFICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwKKwkJCWRldi0+bmFtZSk7CisJCXJ4X21vZGUgPQorCQkgICAgQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXVsdGljYXN0IHwgQWNjZXB0TXlQaHlzIHwKKwkJICAgIEFjY2VwdEFsbFBoeXM7CisJCW1jX2ZpbHRlclsxXSA9IG1jX2ZpbHRlclswXSA9IDB4ZmZmZmZmZmY7CisJfSBlbHNlIGlmICgoZGV2LT5tY19jb3VudCA+IG11bHRpY2FzdF9maWx0ZXJfbGltaXQpCisJCSAgIHx8IChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQkvKiBUb28gbWFueSB0byBmaWx0ZXIgcGVyZmVjdGx5IC0tIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KKwkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdE15UGh5czsKKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMHhmZmZmZmZmZjsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdE15UGh5czsKKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMDsKKwkJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7CisJCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCWludCBiaXRfbnIgPSBldGhlcl9jcmMoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpID4+IDI2OworCisJCQltY19maWx0ZXJbYml0X25yID4+IDVdIHw9IDEgPDwgKGJpdF9uciAmIDMxKTsKKwkJfQorCX0KKworCS8qIGlmIGNhbGxlZCBmcm9tIGlycSBoYW5kbGVyLCBsb2NrIGFscmVhZHkgYWNxdWlyZWQgKi8KKwlpZiAoIWluX2lycSAoKSkKKwkJc3Bpbl9sb2NrX2lycSAoJnRwLT5sb2NrKTsKKworCS8qIFdlIGNhbiBzYWZlbHkgdXBkYXRlIHdpdGhvdXQgc3RvcHBpbmcgdGhlIGNoaXAuICovCisJdG1wID0gbmV0ZHJ2X3J4X2NvbmZpZyB8IHJ4X21vZGUgfAorCQkoTkVURFJWX1IzMiAoUnhDb25maWcpICYgcnRsX2NoaXBfaW5mb1t0cC0+Y2hpcHNldF0uUnhDb25maWdNYXNrKTsKKwlORVREUlZfVzMyX0YgKFJ4Q29uZmlnLCB0bXApOworCU5FVERSVl9XMzJfRiAoTUFSMCArIDAsIG1jX2ZpbHRlclswXSk7CisJTkVURFJWX1czMl9GIChNQVIwICsgNCwgbWNfZmlsdGVyWzFdKTsKKworCWlmICghaW5faXJxICgpKQorCQlzcGluX3VubG9ja19pcnEgKCZ0cC0+bG9jayk7CisKKwlEUFJJTlRLICgiRVhJVFxuIik7Cit9CisKKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IG5ldGRydl9zdXNwZW5kIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOworCXN0cnVjdCBuZXRkcnZfcHJpdmF0ZSAqdHAgPSBkZXYtPnByaXY7CisJdm9pZCAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAwOworCW5ldGlmX2RldmljZV9kZXRhY2ggKGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJnRwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMsIHN0b3AgVHggYW5kIFJ4LiAqLworCU5FVERSVl9XMTYgKEludHJNYXNrLCAweDAwMDApOworCU5FVERSVl9XOCAoQ2hpcENtZCwgKE5FVERSVl9SOCAoQ2hpcENtZCkgJiBDaGlwQ21kQ2xlYXIpKTsKKworCS8qIFVwZGF0ZSB0aGUgZXJyb3IgY291bnRzLiAqLworCXRwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IE5FVERSVl9SMzIgKFJ4TWlzc2VkKTsKKwlORVREUlZfVzMyIChSeE1pc3NlZCwgMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmdHAtPmxvY2ssIGZsYWdzKTsKKworCXBjaV9zYXZlX3N0YXRlIChwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlIChwZGV2LCBQQ0lfRDNob3QpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBuZXRkcnZfcmVzdW1lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKwlzdHJ1Y3QgbmV0ZHJ2X3ByaXZhdGUgKnRwID0gZGV2LT5wcml2OworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAwOworCXBjaV9zZXRfcG93ZXJfc3RhdGUgKHBkZXYsIFBDSV9EMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUgKHBkZXYpOworCW5ldGlmX2RldmljZV9hdHRhY2ggKGRldik7CisJbmV0ZHJ2X2h3X3N0YXJ0IChkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbmV0ZHJ2X3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gTU9ETkFNRSwKKwkuaWRfdGFibGUJPSBuZXRkcnZfcGNpX3RibCwKKwkucHJvYmUJCT0gbmV0ZHJ2X2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobmV0ZHJ2X3JlbW92ZV9vbmUpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gbmV0ZHJ2X3N1c3BlbmQsCisJLnJlc3VtZQkJPSBuZXRkcnZfcmVzdW1lLAorI2VuZGlmIC8qIENPTkZJR19QTSAqLworfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBuZXRkcnZfaW5pdF9tb2R1bGUgKHZvaWQpCit7CisvKiB3aGVuIGEgbW9kdWxlLCB0aGlzIGlzIHByaW50ZWQgd2hldGhlciBvciBub3QgZGV2aWNlcyBhcmUgZm91bmQgaW4gcHJvYmUgKi8KKyNpZmRlZiBNT0RVTEUKKwlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0ICgmbmV0ZHJ2X3BjaV9kcml2ZXIpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuZXRkcnZfY2xlYW51cF9tb2R1bGUgKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmbmV0ZHJ2X3BjaV9kcml2ZXIpOworfQorCisKK21vZHVsZV9pbml0KG5ldGRydl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChuZXRkcnZfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTc0X2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvM2M1NzRfY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWU1MTcxMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU3NF9jcy5jCkBAIC0wLDAgKzEsMTMwNyBAQAorLyogM2M1NzQuYzogQSBQQ01DSUEgZXRoZXJuZXQgZHJpdmVyIGZvciB0aGUgM2NvbSAzYzU3NCAiUm9hZFJ1bm5lciIuCisKKwlXcml0dGVuIDE5OTMtMTk5OCBieQorCURvbmFsZCBCZWNrZXIsIGJlY2tlckBzY3lsZC5jb20sIChkcml2ZXIgY29yZSkgYW5kCisJRGF2aWQgSGluZHMsIGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0IChmcm9tIGhpcyBQQyBjYXJkIGNvZGUpLgorCUxvY2tpbmcgZml4ZXMgKEMpIENvcHlyaWdodCAyMDAzIFJlZCBIYXQgSW5jCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisJdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCVRoaXMgZHJpdmVyIGRlcml2ZXMgZnJvbSBEb25hbGQgQmVja2VyJ3MgM2M1MDkgY29yZSwgd2hpY2ggaGFzIHRoZQorCWZvbGxvd2luZyBjb3B5cmlnaHQ6CisJQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorCURpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCisJCisKKyovCisKKy8qCisJCQkJVGhlb3J5IG9mIE9wZXJhdGlvbgorCitJLiBCb2FyZCBDb21wYXRpYmlsaXR5CisKK1RoaXMgZGV2aWNlIGRyaXZlciBpcyBkZXNpZ25lZCBmb3IgdGhlIDNDb20gM2M1NzQgUEMgY2FyZCBGYXN0IEV0aGVybmV0CitBZGFwdGVyLgorCitJSS4gQm9hcmQtc3BlY2lmaWMgc2V0dGluZ3MKKworTm9uZSAtLSBQQyBjYXJkcyBhcmUgYXV0b2NvbmZpZ3VyZWQuCisKK0lJSS4gRHJpdmVyIG9wZXJhdGlvbgorCitUaGUgM2M1NzQgdXNlcyBhIEJvb21lcmFuZy1zdHlsZSBpbnRlcmZhY2UsIHdpdGhvdXQgdGhlIGJ1cy1tYXN0ZXIgY2FwYWJpbGl0eS4KK1NlZSB0aGUgQm9vbWVyYW5nIGRyaXZlciBhbmQgZG9jdW1lbnRhdGlvbiBmb3IgbW9zdCBkZXRhaWxzLgorCitJVi4gTm90ZXMgYW5kIGNoaXAgZG9jdW1lbnRhdGlvbi4KKworVHdvIGFkZGVkIHJlZ2lzdGVycyBhcmUgdXNlZCB0byBlbmhhbmNlIFBJTyBwZXJmb3JtYW5jZSwgUnVubmVyUmRDdHJsIGFuZAorUnVubmVyV3JDdHJsLiAgVGhlc2UgYXJlIDExIGJpdCBkb3duLWNvdW50ZXJzIHRoYXQgYXJlIHByZWxvYWRlZCB3aXRoIHRoZQorY291bnQgb2Ygd29yZCAoMTYgYml0cykgcmVhZHMgb3Igd3JpdGVzIHRoZSBkcml2ZXIgaXMgYWJvdXQgdG8gZG8gdG8gdGhlIFJ4CitvciBUeCBGSUZPLiAgVGhlIGNoaXAgaXMgdGhlbiBhYmxlIHRvIGhpZGUgdGhlIGludGVybmFsLVBDSS1idXMgdG8gUEMtY2FyZAordHJhbnNsYXRpb24gbGF0ZW5jeSBieSBidWZmZXJpbmcgdGhlIEkvTyBvcGVyYXRpb25zIHdpdGggYW4gOCB3b3JkIEZJRk8uCitOb3RlOiBObyBvdGhlciBjaGlwIGFjY2Vzc2VzIGFyZSBwZXJtaXR0ZWQgd2hlbiB0aGlzIGJ1ZmZlciBpcyB1c2VkLgorCitBIHNlY29uZCBlbmhhbmNlbWVudCBpcyB0aGF0IGJvdGggYXR0cmlidXRlIGFuZCBjb21tb24gbWVtb3J5IHNwYWNlCisweDA4MDAtMHgwZmZmIGNhbiB0cmFuc2xhdGVkIHRvIHRoZSBQSU8gRklGTy4gIFRodXMgbWVtb3J5IG9wZXJhdGlvbnMgKGZhc3Rlcgord2l0aCAqc29tZSogUENjYXJkIGJyaWRnZXMpIG1heSBiZSB1c2VkIGluc3RlYWQgb2YgSS9PIG9wZXJhdGlvbnMuCitUaGlzIGlzIGVuYWJsZWQgYnkgc2V0dGluZyB0aGUgMHgxMCBiaXQgaW4gdGhlIFBDTUNJQSBMQU4gQ09SLgorCitTb21lIHNsb3cgUEMgY2FyZCBicmlkZ2VzIHdvcmsgYmV0dGVyIGlmIHRoZXkgbmV2ZXIgc2VlIGEgV0FJVCBzaWduYWwuCitUaGlzIGlzIGNvbmZpZ3VyZWQgYnkgc2V0dGluZyB0aGUgMHgyMCBiaXQgaW4gdGhlIFBDTUNJQSBMQU4gQ09SLgorT25seSBkbyB0aGlzIGFmdGVyIHRlc3RpbmcgdGhhdCBpdCBpcyByZWxpYWJsZSBhbmQgaW1wcm92ZXMgcGVyZm9ybWFuY2UuCisKK1RoZSB1cHBlciBmaXZlIGJpdHMgb2YgUnVubmVyUmRDdHJsIGFyZSB1c2VkIHRvIHdpbmRvdyBpbnRvIFBDY2FyZAorY29uZmlndXJhdGlvbiBzcGFjZSByZWdpc3RlcnMuICBXaW5kb3cgMCBpcyB0aGUgcmVndWxhciBCb29tZXJhbmcvT2RpZQorcmVnaXN0ZXIgc2V0LCAxLTUgYXJlIHZhcmlvdXMgUEMgY2FyZCBjb250cm9sIHJlZ2lzdGVycywgYW5kIDE2LTMxIGFyZQordGhlIChyZXZlcnNlZCEpIENJUyB0YWJsZS4KKworQSBmaW5hbCBub3RlOiB3cml0aW5nIHRoZSBJbnRlcm5hbENvbmZpZyByZWdpc3RlciBpbiB3aW5kb3cgMyB3aXRoIGFuCitpbnZhbGlkIHJhbVdpZHRoIGlzIFZlcnkgQmFkLgorCitWLiBSZWZlcmVuY2VzCisKK2h0dHA6Ly93d3cuc2N5bGQuY29tL2V4cGVydC9OV2F5Lmh0bWwKK2h0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0RQL0RQODM4NDAuaHRtbAorCitUaGFua3MgdG8gVGVycnkgTXVycGh5IG9mIDNDb20gZm9yIHByb3ZpZGluZyBkZXZlbG9wbWVudCBpbmZvcm1hdGlvbiBmb3IKK2VhcmxpZXIgM0NvbSBwcm9kdWN0cy4KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKyNpbmNsdWRlIDxwY21jaWEvbWVtX29wLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIEhpbmRzIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiM0NvbSAzYzU3NCBzZXJpZXMgUENNQ0lBIGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIElOVF9NT0RVTEVfUEFSTShuLCB2KSBzdGF0aWMgaW50IG4gPSB2OyBtb2R1bGVfcGFyYW0obiwgaW50LCAwKQorCisvKiBNYXhpbXVtIGV2ZW50cyAoUnggcGFja2V0cywgZXRjLikgdG8gaGFuZGxlIGF0IGVhY2ggaW50ZXJydXB0LiAqLworSU5UX01PRFVMRV9QQVJNKG1heF9pbnRlcnJ1cHRfd29yaywgMzIpOworCisvKiBGb3JjZSBmdWxsIGR1cGxleCBtb2Rlcz8gKi8KK0lOVF9NT0RVTEVfUEFSTShmdWxsX2R1cGxleCwgMCk7CisKKy8qIEF1dG9kZXRlY3QgbGluayBwb2xhcml0eSByZXZlcnNhbD8gKi8KK0lOVF9NT0RVTEVfUEFSTShhdXRvX3BvbGFyaXR5LCAxKTsKKworI2lmZGVmIFBDTUNJQV9ERUJVRworSU5UX01PRFVMRV9QQVJNKHBjX2RlYnVnLCBQQ01DSUFfREVCVUcpOworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBpZiAocGNfZGVidWc+KG4pKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKQorc3RhdGljIGNoYXIgKnZlcnNpb24gPQorIjNjNTc0X2NzLmMgMS42NWFjMSAyMDAzLzA0LzA3IERvbmFsZCBCZWNrZXIvRGF2aWQgSGluZHMsIGJlY2tlckBzY3lsZC5jb20uXG4iOworI2Vsc2UKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAoKDgwMCpIWikvMTAwMCkKKworLyogVG8gbWluaW1pemUgdGhlIHNpemUgb2YgdGhlIGRyaXZlciBzb3VyY2UgYW5kIG1ha2UgdGhlIGRyaXZlciBtb3JlCisgICByZWFkYWJsZSBub3QgYWxsIGNvbnN0YW50cyBhcmUgc3ltYm9saWNhbGx5IGRlZmluZWQuCisgICBZb3UnbGwgbmVlZCB0aGUgbWFudWFsIGlmIHlvdSB3YW50IHRvIHVuZGVyc3RhbmQgZHJpdmVyIGRldGFpbHMgYW55d2F5LiAqLworLyogT2Zmc2V0cyBmcm9tIGJhc2UgSS9PIGFkZHJlc3MuICovCisjZGVmaW5lIEVMM19EQVRBCTB4MDAKKyNkZWZpbmUgRUwzX0NNRAkJMHgwZQorI2RlZmluZSBFTDNfU1RBVFVTCTB4MGUKKworI2RlZmluZSBFTDNXSU5ET1cod2luX251bSkgb3V0dyhTZWxlY3RXaW5kb3cgKyAod2luX251bSksIGlvYWRkciArIEVMM19DTUQpCisKKy8qIFRoZSB0b3AgZml2ZSBiaXRzIHdyaXR0ZW4gdG8gRUwzX0NNRCBhcmUgYSBjb21tYW5kLCB0aGUgbG93ZXIKKyAgIDExIGJpdHMgYXJlIHRoZSBwYXJhbWV0ZXIsIGlmIGFwcGxpY2FibGUuICovCitlbnVtIGVsM19jbWRzIHsKKwlUb3RhbFJlc2V0ID0gMDw8MTEsIFNlbGVjdFdpbmRvdyA9IDE8PDExLCBTdGFydENvYXggPSAyPDwxMSwKKwlSeERpc2FibGUgPSAzPDwxMSwgUnhFbmFibGUgPSA0PDwxMSwgUnhSZXNldCA9IDU8PDExLCBSeERpc2NhcmQgPSA4PDwxMSwKKwlUeEVuYWJsZSA9IDk8PDExLCBUeERpc2FibGUgPSAxMDw8MTEsIFR4UmVzZXQgPSAxMTw8MTEsCisJRmFrZUludHIgPSAxMjw8MTEsIEFja0ludHIgPSAxMzw8MTEsIFNldEludHJFbmIgPSAxNDw8MTEsCisJU2V0U3RhdHVzRW5iID0gMTU8PDExLCBTZXRSeEZpbHRlciA9IDE2PDwxMSwgU2V0UnhUaHJlc2hvbGQgPSAxNzw8MTEsCisJU2V0VHhUaHJlc2hvbGQgPSAxODw8MTEsIFNldFR4U3RhcnQgPSAxOTw8MTEsIFN0YXRzRW5hYmxlID0gMjE8PDExLAorCVN0YXRzRGlzYWJsZSA9IDIyPDwxMSwgU3RvcENvYXggPSAyMzw8MTEsCit9OworCitlbnVtIGVseGxfc3RhdHVzIHsKKwlJbnRMYXRjaCA9IDB4MDAwMSwgQWRhcHRlckZhaWx1cmUgPSAweDAwMDIsIFR4Q29tcGxldGUgPSAweDAwMDQsCisJVHhBdmFpbGFibGUgPSAweDAwMDgsIFJ4Q29tcGxldGUgPSAweDAwMTAsIFJ4RWFybHkgPSAweDAwMjAsCisJSW50UmVxID0gMHgwMDQwLCBTdGF0c0Z1bGwgPSAweDAwODAsIENtZEJ1c3kgPSAweDEwMDAgfTsKKworLyogVGhlIFNldFJ4RmlsdGVyIGNvbW1hbmQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGNsYXNzZXM6ICovCitlbnVtIFJ4RmlsdGVyIHsKKwlSeFN0YXRpb24gPSAxLCBSeE11bHRpY2FzdCA9IDIsIFJ4QnJvYWRjYXN0ID0gNCwgUnhQcm9tID0gOAorfTsKKworZW51bSBXaW5kb3cwIHsKKwlXbjBFZXByb21DbWQgPSAxMCwgV24wRWVwcm9tRGF0YSA9IDEyLCAvKiBFRVBST00gY29tbWFuZC9hZGRyZXNzLCBkYXRhLiAqLworCUludHJTdGF0dXM9MHgwRSwJCS8qIFZhbGlkIGluIGFsbCB3aW5kb3dzLiAqLworfTsKKy8qIFRoZXNlIGFzc3VtZXMgdGhlIGxhcmdlciBFRVBST00uICovCitlbnVtIFdpbjBfRUVQUk9NX2NtZHMgeworCUVFUFJPTV9SZWFkID0gMHgyMDAsIEVFUFJPTV9XUklURSA9IDB4MTAwLCBFRVBST01fRVJBU0UgPSAweDMwMCwKKwlFRVBST01fRVdFTkIgPSAweDMwLAkJLyogRW5hYmxlIGVyYXNpbmcvd3JpdGluZyBmb3IgMTAgbXNlYy4gKi8KKwlFRVBST01fRVdESVMgPSAweDAwLAkJLyogRGlzYWJsZSBFV0VOQiBiZWZvcmUgMTAgbXNlYyB0aW1lb3V0LiAqLworfTsKKworLyogUmVnaXN0ZXIgd2luZG93IDEgb2Zmc2V0cywgdGhlIHdpbmRvdyB1c2VkIGluIG5vcm1hbCBvcGVyYXRpb24uCisgICBPbiB0aGUgIk9kaWUiIHRoaXMgd2luZG93IGlzIGFsd2F5cyBtYXBwZWQgYXQgb2Zmc2V0cyAweDEwLTB4MWYuCisgICBFeGNlcHQgZm9yIFR4RnJlZSwgd2hpY2ggaXMgb3ZlcmxhcHBlZCBieSBSdW5uZXJXckN0cmwuICovCitlbnVtIFdpbmRvdzEgeworCVRYX0ZJRk8gPSAweDEwLCAgUlhfRklGTyA9IDB4MTAsICBSeEVycm9ycyA9IDB4MTQsCisJUnhTdGF0dXMgPSAweDE4LCAgVGltZXI9MHgxQSwgVHhTdGF0dXMgPSAweDFCLAorCVR4RnJlZSA9IDB4MEMsIC8qIFJlbWFpbmluZyBmcmVlIGJ5dGVzIGluIFR4IGJ1ZmZlci4gKi8KKwlSdW5uZXJSZEN0cmwgPSAweDE2LCBSdW5uZXJXckN0cmwgPSAweDFjLAorfTsKKworZW51bSBXaW5kb3czIHsJCQkvKiBXaW5kb3cgMzogTUFDL2NvbmZpZyBiaXRzLiAqLworCVduM19Db25maWc9MCwgV24zX01BQ19DdHJsPTYsIFduM19PcHRpb25zPTgsCit9OwordW5pb24gd24zX2NvbmZpZyB7CisJaW50IGk7CisJc3RydWN0IHczX2NvbmZpZ19maWVsZHMgeworCQl1bnNpZ25lZCBpbnQgcmFtX3NpemU6MywgcmFtX3dpZHRoOjEsIHJhbV9zcGVlZDoyLCByb21fc2l6ZToyOworCQlpbnQgcGFkODo4OworCQl1bnNpZ25lZCBpbnQgcmFtX3NwbGl0OjIsIHBhZDE4OjIsIHhjdnI6MywgcGFkMjE6MSwgYXV0b3NlbGVjdDoxOworCQlpbnQgcGFkMjQ6NzsKKwl9IHU7Cit9OworCitlbnVtIFdpbmRvdzQgewkJLyogV2luZG93IDQ6IFhjdnIvbWVkaWEgYml0cy4gKi8KKwlXbjRfRklGT0RpYWcgPSA0LCBXbjRfTmV0RGlhZyA9IDYsIFduNF9QaHlzaWNhbE1nbXQ9OCwgV240X01lZGlhID0gMTAsCit9OworCisjZGVmaW5lIE1FRElBX1RQCTB4MDBDMAkvKiBFbmFibGUgbGluayBiZWF0IGFuZCBqYWJiZXIgZm9yIDEwYmFzZVQuICovCisKK3N0cnVjdCBlbDNfcHJpdmF0ZSB7CisJZGV2X2xpbmtfdCBsaW5rOworCWRldl9ub2RlX3Qgbm9kZTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwl1MTYgYWR2ZXJ0aXNpbmcsIHBhcnRuZXI7CQkvKiBOV2F5IG1lZGlhIGFkdmVydGlzZW1lbnQgKi8KKwl1bnNpZ25lZCBjaGFyIHBoeXM7CQkJLyogTUlJIGRldmljZSBhZGRyZXNzICovCisJdW5zaWduZWQgaW50IGF1dG9zZWxlY3Q6MSwgZGVmYXVsdF9tZWRpYTozOwkvKiBSZWFkIGZyb20gdGhlIEVFUFJPTS9XbjNfQ29uZmlnLiAqLworCS8qIGZvciB0cmFuc2NlaXZlciBtb25pdG9yaW5nICovCisJc3RydWN0IHRpbWVyX2xpc3QgbWVkaWE7CisJdW5zaWduZWQgc2hvcnQgbWVkaWFfc3RhdHVzOworCXVuc2lnbmVkIHNob3J0IGZhc3RfcG9sbDsKKwl1bnNpZ25lZCBsb25nIGxhc3RfaXJxOworCXNwaW5sb2NrX3Qgd2luZG93X2xvY2s7CQkJLyogR3VhcmRzIHRoZSBXaW5kb3cgc2VsZWN0aW9uICovCit9OworCisvKiBTZXQgaWZmIGEgTUlJIHRyYW5zY2VpdmVyIG9uIGFueSBpbnRlcmZhY2UgcmVxdWlyZXMgbWRpbyBwcmVhbWJsZS4KKyAgIFRoaXMgb25seSBzZXQgd2l0aCB0aGUgb3JpZ2luYWwgRFA4Mzg0MCBvbiBvbGRlciAzYzkwNSBib2FyZHMsIHNvIHRoZSBleHRyYQorICAgY29kZSBzaXplIG9mIGEgcGVyLWludGVyZmFjZSBmbGFnIGlzIG5vdCB3b3J0aHdoaWxlLiAqLworc3RhdGljIGNoYXIgbWlpX3ByZWFtYmxlX3JlcXVpcmVkID0gMDsKKworLyogSW5kZXggb2YgZnVuY3Rpb25zLiAqLworCitzdGF0aWMgdm9pZCB0YzU3NF9jb25maWcoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgdm9pZCB0YzU3NF9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIGludCB0YzU3NF9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCQkJCSAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CisKK3N0YXRpYyB2b2lkIG1kaW9fc3luYyhraW9fYWRkcl90IGlvYWRkciwgaW50IGJpdHMpOworc3RhdGljIGludCBtZGlvX3JlYWQoa2lvX2FkZHJfdCBpb2FkZHIsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbik7CitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKGtpb19hZGRyX3QgaW9hZGRyLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSk7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcmVhZF9lZXByb20oa2lvX2FkZHJfdCBpb2FkZHIsIGludCBpbmRleCk7CitzdGF0aWMgdm9pZCB0YzU3NF93YWl0X2Zvcl9jb21wbGV0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjbWQpOworCitzdGF0aWMgdm9pZCB0YzU3NF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG1lZGlhX2NoZWNrKHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgZWwzX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGVsM19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGVsM19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCB1cGRhdGVfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmVsM19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGVsM19yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgd29ya2xpbWl0KTsKK3N0YXRpYyBpbnQgZWwzX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWwzX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGVsM19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvID0gIjNjNTc0X2NzIjsKKworc3RhdGljIGRldl9saW5rX3QgKnRjNTc0X2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIHRjNTc0X2RldGFjaChkZXZfbGlua190ICopOworCitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3Q7CisKKy8qCisJdGM1NzRfYXR0YWNoKCkgY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcKKwlsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQKKwl3aXRoIENhcmQgU2VydmljZXMuCisqLworCitzdGF0aWMgZGV2X2xpbmtfdCAqdGM1NzRfYXR0YWNoKHZvaWQpCit7CisJc3RydWN0IGVsM19wcml2YXRlICpscDsKKwljbGllbnRfcmVnX3QgY2xpZW50X3JlZzsKKwlkZXZfbGlua190ICpsaW5rOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IHJldDsKKworCURFQlVHKDAsICIzYzU3NF9hdHRhY2goKVxuIik7CisKKwkvKiBDcmVhdGUgdGhlIFBDIGNhcmQgZGV2aWNlIG9iamVjdC4gKi8KKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGVsM19wcml2YXRlKSk7CisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsaW5rID0gJmxwLT5saW5rOworCWxpbmstPnByaXYgPSBkZXY7CisKKwlzcGluX2xvY2tfaW5pdCgmbHAtPndpbmRvd19sb2NrKTsKKwlsaW5rLT5pby5OdW1Qb3J0czEgPSAzMjsKKwlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKKwlsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKKwlsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisJbGluay0+aXJxLkhhbmRsZXIgPSAmZWwzX2ludGVycnVwdDsKKwlsaW5rLT5pcnEuSW5zdGFuY2UgPSBkZXY7CisJbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROworCWxpbmstPmNvbmYuVmNjID0gNTA7CisJbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisJbGluay0+Y29uZi5Db25maWdJbmRleCA9IDE7CisJbGluay0+Y29uZi5QcmVzZW50ID0gUFJFU0VOVF9PUFRJT047CisKKwkvKiBUaGUgRUwzLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmZWwzX3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgPSAmZWwzX2dldF9zdGF0czsKKwlkZXYtPmRvX2lvY3RsID0gJmVsM19pb2N0bDsKKwlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmbmV0ZGV2X2V0aHRvb2xfb3BzKTsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZTsKKwlkZXYtPm9wZW4gPSAmZWwzX29wZW47CisJZGV2LT5zdG9wID0gJmVsM19jbG9zZTsKKyNpZmRlZiBIQVZFX1RYX1RJTUVPVVQKKwlkZXYtPnR4X3RpbWVvdXQgPSBlbDNfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKyNlbmRpZgorCisJLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisJbGluay0+bmV4dCA9IGRldl9saXN0OworCWRldl9saXN0ID0gbGluazsKKwljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworCWNsaWVudF9yZWcuRXZlbnRNYXNrID0KKwkJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorCQkJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKwkJCQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZ0YzU3NF9ldmVudDsKKwljbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKwlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwkJdGM1NzRfZGV0YWNoKGxpbmspOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gbGluazsKK30gLyogdGM1NzRfYXR0YWNoICovCisKKy8qCisKKwlUaGlzIGRlbGV0ZXMgYSBkcml2ZXIgImluc3RhbmNlIi4gIFRoZSBkZXZpY2UgaXMgZGUtcmVnaXN0ZXJlZAorCXdpdGggQ2FyZCBTZXJ2aWNlcy4gIElmIGl0IGhhcyBiZWVuIHJlbGVhc2VkLCBhbGwgbG9jYWwgZGF0YQorCXN0cnVjdHVyZXMgYXJlIGZyZWVkLiAgT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGZyZWVkCisJd2hlbiB0aGUgZGV2aWNlIGlzIHJlbGVhc2VkLgorCisqLworCitzdGF0aWMgdm9pZCB0YzU3NF9kZXRhY2goZGV2X2xpbmtfdCAqbGluaykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKwlkZXZfbGlua190ICoqbGlua3A7CisKKwlERUJVRygwLCAiM2M1NzRfZGV0YWNoKDB4JXApXG4iLCBsaW5rKTsKKworCS8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisJZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkKKwkJaWYgKCpsaW5rcCA9PSBsaW5rKSBicmVhazsKKwlpZiAoKmxpbmtwID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChsaW5rLT5kZXYpCisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCQl0YzU3NF9yZWxlYXNlKGxpbmspOworCisJaWYgKGxpbmstPmhhbmRsZSkKKwkJcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGxpbmstPmhhbmRsZSk7CisKKwkvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBiaXRzICovCisJKmxpbmtwID0gbGluay0+bmV4dDsKKwlmcmVlX25ldGRldihkZXYpOworfSAvKiB0YzU3NF9kZXRhY2ggKi8KKworLyoKKwl0YzU3NF9jb25maWcoKSBpcyBzY2hlZHVsZWQgdG8gcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gZXZlbnQKKwlpcyByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUKKwlldGhlcm5ldCBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCisqLworCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKKyAgZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKworc3RhdGljIGNoYXIgKnJhbV9zcGxpdFtdID0geyI1OjMiLCAiMzoxIiwgIjE6MSIsICIzOjUifTsKKworc3RhdGljIHZvaWQgdGM1NzRfY29uZmlnKGRldl9saW5rX3QgKmxpbmspCit7CisJY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl0dXBsZV90IHR1cGxlOworCWNpc3BhcnNlX3QgcGFyc2U7CisJdW5zaWduZWQgc2hvcnQgYnVmWzMyXTsKKwlpbnQgbGFzdF9mbiwgbGFzdF9yZXQsIGksIGo7CisJa2lvX2FkZHJfdCBpb2FkZHI7CisJdTE2ICpwaHlzX2FkZHI7CisJY2hhciAqY2FyZG5hbWU7CisJdW5pb24gd24zX2NvbmZpZyBjb25maWc7CisKKwlwaHlzX2FkZHIgPSAodTE2ICopZGV2LT5kZXZfYWRkcjsKKworCURFQlVHKDAsICIzYzU3NF9jb25maWcoMHglcClcbiIsIGxpbmspOworCisJdHVwbGUuQXR0cmlidXRlcyA9IDA7CisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKwlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKKwl0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKKwl0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisJQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKwlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOworCWxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKworCS8qIENvbmZpZ3VyZSBjYXJkICovCisJbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKworCWxpbmstPmlvLklPQWRkckxpbmVzID0gMTY7CisJZm9yIChpID0gaiA9IDA7IGogPCAweDQwMDsgaiArPSAweDIwKSB7CisJCWxpbmstPmlvLkJhc2VQb3J0MSA9IGogXiAweDMwMDsKKwkJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwkJaWYgKGkgPT0gQ1NfU1VDQ0VTUykgYnJlYWs7CisJfQorCWlmIChpICE9IENTX1NVQ0NFU1MpIHsKKwkJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0SU8sIGkpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSkpOworCUNTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKworCWRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworCWRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwkvKiBUaGUgM2M1NzQgbm9ybWFsbHkgdXNlcyBhbiBFRVBST00gZm9yIGNvbmZpZ3VyYXRpb24gaW5mbywgaW5jbHVkaW5nCisJICAgdGhlIGhhcmR3YXJlIGFkZHJlc3MuICBUaGUgZnV0dXJlIHByb2R1Y3RzIG1heSBpbmNsdWRlIGEgbW9kZW0gY2hpcAorCSAgIGFuZCBwdXQgdGhlIGFkZHJlc3MgaW4gdGhlIENJUy4gKi8KKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSAweDg4OworCWlmIChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSA9PSBDU19TVUNDRVNTKSB7CisJCXBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSk7CisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQlwaHlzX2FkZHJbaV0gPSBodG9ucyhidWZbaV0pOworCX0gZWxzZSB7CisJCUVMM1dJTkRPVygwKTsKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCXBoeXNfYWRkcltpXSA9IGh0b25zKHJlYWRfZWVwcm9tKGlvYWRkciwgaSArIDEwKSk7CisJCWlmIChwaHlzX2FkZHJbMF0gPT0gMHg2MDYwKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIjNjNTc0X2NzOiBJTyBwb3J0IGNvbmZsaWN0IGF0IDB4JTAzbHgiCisJCQkJICAgIi0weCUwM2x4XG4iLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5iYXNlX2FkZHIrMTUpOworCQkJZ290byBmYWlsZWQ7CisJCX0KKwl9CisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX1ZFUlNfMTsKKwlpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUyAmJgorCQlwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpID09IENTX1NVQ0NFU1MgJiYKKwkJcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpID09IENTX1NVQ0NFU1MpIHsKKwkJY2FyZG5hbWUgPSBwYXJzZS52ZXJzaW9uXzEuc3RyICsgcGFyc2UudmVyc2lvbl8xLm9mc1sxXTsKKwl9IGVsc2UKKwkJY2FyZG5hbWUgPSAiM0NvbSAzYzU3NCI7CisKKwl7CisJCXVfY2hhciBtY3I7CisJCW91dHcoMjw8MTEsIGlvYWRkciArIFJ1bm5lclJkQ3RybCk7CisJCW1jciA9IGluYihpb2FkZHIgKyAyKTsKKwkJb3V0dygwPDwxMSwgaW9hZGRyICsgUnVubmVyUmRDdHJsKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICBBU0lDIHJldiAlZCwiLCBtY3I+PjMpOworCQlFTDNXSU5ET1coMyk7CisJCWNvbmZpZy5pID0gaW5sKGlvYWRkciArIFduM19Db25maWcpOworCQlscC0+ZGVmYXVsdF9tZWRpYSA9IGNvbmZpZy51LnhjdnI7CisJCWxwLT5hdXRvc2VsZWN0ID0gY29uZmlnLnUuYXV0b3NlbGVjdDsKKwl9CisKKwlpbml0X3RpbWVyKCZscC0+bWVkaWEpOworCisJeworCQlpbnQgcGh5OworCQkKKwkJLyogUm9hZHJ1bm5lciBvbmx5OiBUdXJuIG9uIHRoZSBNSUkgdHJhbnNjZWl2ZXIgKi8KKwkJb3V0dygweDgwNDAsIGlvYWRkciArIFduM19PcHRpb25zKTsKKwkJbWRlbGF5KDEpOworCQlvdXR3KDB4YzA0MCwgaW9hZGRyICsgV24zX09wdGlvbnMpOworCQl0YzU3NF93YWl0X2Zvcl9jb21wbGV0aW9uKGRldiwgVHhSZXNldCk7CisJCXRjNTc0X3dhaXRfZm9yX2NvbXBsZXRpb24oZGV2LCBSeFJlc2V0KTsKKwkJbWRlbGF5KDEpOworCQlvdXR3KDB4ODA0MCwgaW9hZGRyICsgV24zX09wdGlvbnMpOworCQkKKwkJRUwzV0lORE9XKDQpOworCQlmb3IgKHBoeSA9IDE7IHBoeSA8PSAzMjsgcGh5KyspIHsKKwkJCWludCBtaWlfc3RhdHVzOworCQkJbWRpb19zeW5jKGlvYWRkciwgMzIpOworCQkJbWlpX3N0YXR1cyA9IG1kaW9fcmVhZChpb2FkZHIsIHBoeSAmIDB4MWYsIDEpOworCQkJaWYgKG1paV9zdGF0dXMgIT0gMHhmZmZmKSB7CisJCQkJbHAtPnBoeXMgPSBwaHkgJiAweDFmOworCQkJCURFQlVHKDAsICIgIE1JSSB0cmFuc2NlaXZlciBhdCBpbmRleCAlZCwgc3RhdHVzICV4LlxuIiwKKwkJCQkJICBwaHksIG1paV9zdGF0dXMpOworCQkJCWlmICgobWlpX3N0YXR1cyAmIDB4MDA0MCkgPT0gMCkKKwkJCQkJbWlpX3ByZWFtYmxlX3JlcXVpcmVkID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAocGh5ID4gMzIpIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiICBObyBNSUkgdHJhbnNjZWl2ZXJzIGZvdW5kIVxuIik7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCQlpID0gbWRpb19yZWFkKGlvYWRkciwgbHAtPnBoeXMsIDE2KSB8IDB4NDA7CisJCW1kaW9fd3JpdGUoaW9hZGRyLCBscC0+cGh5cywgMTYsIGkpOworCQlscC0+YWR2ZXJ0aXNpbmcgPSBtZGlvX3JlYWQoaW9hZGRyLCBscC0+cGh5cywgNCk7CisJCWlmIChmdWxsX2R1cGxleCkgeworCQkJLyogT25seSBhZHZlcnRpc2UgdGhlIEZEIG1lZGlhIHR5cGVzLiAqLworCQkJbHAtPmFkdmVydGlzaW5nICY9IH4weDAyYTA7CisJCQltZGlvX3dyaXRlKGlvYWRkciwgbHAtPnBoeXMsIDQsIGxwLT5hZHZlcnRpc2luZyk7CisJCX0KKwl9CisKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworCWxpbmstPmRldiA9ICZscC0+bm9kZTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZoYW5kbGVfdG9fZGV2KGhhbmRsZSkpOworCisJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIzYzU3NF9jczogcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKKwkJbGluay0+ZGV2ID0gTlVMTDsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJc3RyY3B5KGxwLT5ub2RlLmRldl9uYW1lLCBkZXYtPm5hbWUpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGF0IGlvICUjM2x4LCBpcnEgJWQsIGh3X2FkZHIgIiwKKwkJICAgZGV2LT5uYW1lLCBjYXJkbmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiUwMlglcyIsIGRldi0+ZGV2X2FkZHJbaV0sICgoaTw1KSA/ICI6IiA6ICIuXG4iKSk7CisJcHJpbnRrKCIgJWRLIEZJRk8gc3BsaXQgJXMgUng6VHgsICVzTUlJIGludGVyZmFjZS5cbiIsCisJCSAgIDggPDwgY29uZmlnLnUucmFtX3NpemUsIHJhbV9zcGxpdFtjb25maWcudS5yYW1fc3BsaXRdLAorCQkgICBjb25maWcudS5hdXRvc2VsZWN0ID8gImF1dG9zZWxlY3QgIiA6ICIiKTsKKworCXJldHVybjsKKworY3NfZmFpbGVkOgorCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworZmFpbGVkOgorCXRjNTc0X3JlbGVhc2UobGluayk7CisJcmV0dXJuOworCit9IC8qIHRjNTc0X2NvbmZpZyAqLworCisvKgorCUFmdGVyIGEgY2FyZCBpcyByZW1vdmVkLCB0YzU3NF9yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZSBuZXQKKwlkZXZpY2UsIGFuZCByZWxlYXNlIHRoZSBQQ01DSUEgY29uZmlndXJhdGlvbi4gIElmIHRoZSBkZXZpY2UgaXMKKwlzdGlsbCBvcGVuLCB0aGlzIHdpbGwgYmUgcG9zdHBvbmVkIHVudGlsIGl0IGlzIGNsb3NlZC4KKyovCisKK3N0YXRpYyB2b2lkIHRjNTc0X3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKwlERUJVRygwLCAiM2M1NzRfcmVsZWFzZSgweCVwKVxuIiwgbGluayk7CisKKwlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCXBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworCisJbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7Cit9CisKKy8qCisJVGhlIGNhcmQgc3RhdHVzIGV2ZW50IGhhbmRsZXIuICBNb3N0bHksIHRoaXMgc2NoZWR1bGVzIG90aGVyCisJc3R1ZmYgdG8gcnVuIGFmdGVyIGFuIGV2ZW50IGlzIHJlY2VpdmVkLiAgQSBDQVJEX1JFTU9WQUwgZXZlbnQKKwlhbHNvIHNldHMgc29tZSBmbGFncyB0byBkaXNjb3VyYWdlIHRoZSBuZXQgZHJpdmVycyBmcm9tIHRyeWluZworCXRvIHRhbGsgdG8gdGhlIGNhcmQgYW55IG1vcmUuCisqLworCitzdGF0aWMgaW50IHRjNTc0X2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJCQkJICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworCWRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKworCURFQlVHKDEsICIzYzU3NF9ldmVudCgweCUwNngpXG4iLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJCWxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwkJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJCXRjNTc0X2NvbmZpZyhsaW5rKTsKKwkJYnJlYWs7CisJY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgorCQlsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKwkJLyogRmFsbCB0aHJvdWdoLi4uICovCisJY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJaWYgKGxpbmstPm9wZW4pCisJCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQkJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCQl9CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisJCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKwkJCWlmIChsaW5rLT5vcGVuKSB7CisJCQkJdGM1NzRfcmVzZXQoZGV2KTsKKwkJCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfSAvKiB0YzU3NF9ldmVudCAqLworCitzdGF0aWMgdm9pZCBkdW1wX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJRUwzV0lORE9XKDEpOworCXByaW50ayhLRVJOX0lORk8gIiAgaXJxIHN0YXR1cyAlMDR4LCByeCBzdGF0dXMgJTA0eCwgdHggc3RhdHVzICIKKwkJICAgIiUwMngsIHR4IGZyZWUgJTA0eFxuIiwgaW53KGlvYWRkcitFTDNfU1RBVFVTKSwKKwkJICAgaW53KGlvYWRkcitSeFN0YXR1cyksIGluYihpb2FkZHIrVHhTdGF0dXMpLAorCQkgICBpbncoaW9hZGRyK1R4RnJlZSkpOworCUVMM1dJTkRPVyg0KTsKKwlwcmludGsoS0VSTl9JTkZPICIgIGRpYWdub3N0aWNzOiBmaWZvICUwNHggbmV0ICUwNHggZXRoZXJuZXQgJTA0eCIKKwkJICAgIiBtZWRpYSAlMDR4XG4iLCBpbncoaW9hZGRyKzB4MDQpLCBpbncoaW9hZGRyKzB4MDYpLAorCQkgICBpbncoaW9hZGRyKzB4MDgpLCBpbncoaW9hZGRyKzB4MGEpKTsKKwlFTDNXSU5ET1coMSk7Cit9CisKKy8qCisgIFVzZSB0aGlzIGZvciBjb21tYW5kcyB0aGF0IG1heSB0YWtlIHRpbWUgdG8gZmluaXNoCisqLworc3RhdGljIHZvaWQgdGM1NzRfd2FpdF9mb3JfY29tcGxldGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY21kKQoreworCWludCBpID0gMTUwMDsKKwlvdXR3KGNtZCwgZGV2LT5iYXNlX2FkZHIgKyBFTDNfQ01EKTsKKwl3aGlsZSAoLS1pID4gMCkKKwkJaWYgKCEoaW53KGRldi0+YmFzZV9hZGRyICsgRUwzX1NUQVRVUykgJiAweDEwMDApKSBicmVhazsKKwlpZiAoaSA9PSAwKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBjb21tYW5kIDB4JTA0eCBkaWQgbm90IGNvbXBsZXRlIVxuIiwgZGV2LT5uYW1lLCBjbWQpOworfQorCisvKiBSZWFkIGEgd29yZCBmcm9tIHRoZSBFRVBST00gdXNpbmcgdGhlIHJlZ3VsYXIgRUVQUk9NIGFjY2VzcyByZWdpc3Rlci4KKyAgIEFzc3VtZSB0aGF0IHdlIGFyZSBpbiByZWdpc3RlciB3aW5kb3cgemVyby4KKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IHJlYWRfZWVwcm9tKGtpb19hZGRyX3QgaW9hZGRyLCBpbnQgaW5kZXgpCit7CisJaW50IHRpbWVyOworCW91dHcoRUVQUk9NX1JlYWQgKyBpbmRleCwgaW9hZGRyICsgV24wRWVwcm9tQ21kKTsKKwkvKiBQYXVzZSBmb3IgYXQgbGVhc3QgMTYyIHVzZWMgZm9yIHRoZSByZWFkIHRvIHRha2UgcGxhY2UuICovCisJZm9yICh0aW1lciA9IDE2MjA7IHRpbWVyID49IDA7IHRpbWVyLS0pIHsKKwkJaWYgKChpbncoaW9hZGRyICsgV24wRWVwcm9tQ21kKSAmIDB4ODAwMCkgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gaW53KGlvYWRkciArIFduMEVlcHJvbURhdGEpOworfQorCisvKiBNSUkgdHJhbnNjZWl2ZXIgY29udHJvbCBzZWN0aW9uLgorICAgUmVhZCBhbmQgd3JpdGUgdGhlIE1JSSByZWdpc3RlcnMgdXNpbmcgc29mdHdhcmUtZ2VuZXJhdGVkIHNlcmlhbAorICAgTURJTyBwcm90b2NvbC4gIFNlZSB0aGUgTUlJIHNwZWNpZmljYXRpb25zIG9yIERQODM4NDBBIGRhdGEgc2hlZXQKKyAgIGZvciBkZXRhaWxzLgorICAgVGhlIG1heGl1bSBkYXRhIGNsb2NrIHJhdGUgaXMgMi41IE1oei4gIFRoZSB0aW1pbmcgaXMgZWFzaWx5IG1ldCBieSB0aGUKKyAgIHNsb3cgUEMgY2FyZCBpbnRlcmZhY2UuICovCisKKyNkZWZpbmUgTURJT19TSElGVF9DTEsJMHgwMQorI2RlZmluZSBNRElPX0RJUl9XUklURQkweDA0CisjZGVmaW5lIE1ESU9fREFUQV9XUklURTAgKDB4MDAgfCBNRElPX0RJUl9XUklURSkKKyNkZWZpbmUgTURJT19EQVRBX1dSSVRFMSAoMHgwMiB8IE1ESU9fRElSX1dSSVRFKQorI2RlZmluZSBNRElPX0RBVEFfUkVBRAkweDAyCisjZGVmaW5lIE1ESU9fRU5CX0lOCQkweDAwCisKKy8qIEdlbmVyYXRlIHRoZSBwcmVhbWJsZSByZXF1aXJlZCBmb3IgaW5pdGlhbCBzeW5jaHJvbml6YXRpb24gYW5kCisgICBhIGZldyBvbGRlciB0cmFuc2NlaXZlcnMuICovCitzdGF0aWMgdm9pZCBtZGlvX3N5bmMoa2lvX2FkZHJfdCBpb2FkZHIsIGludCBiaXRzKQoreworCWtpb19hZGRyX3QgbWRpb19hZGRyID0gaW9hZGRyICsgV240X1BoeXNpY2FsTWdtdDsKKworCS8qIEVzdGFibGlzaCBzeW5jIGJ5IHNlbmRpbmcgYXQgbGVhc3QgMzIgbG9naWMgb25lcy4gKi8KKwl3aGlsZSAoLS0gYml0cyA+PSAwKSB7CisJCW91dHcoTURJT19EQVRBX1dSSVRFMSwgbWRpb19hZGRyKTsKKwkJb3V0dyhNRElPX0RBVEFfV1JJVEUxIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJfQorfQorCitzdGF0aWMgaW50IG1kaW9fcmVhZChraW9fYWRkcl90IGlvYWRkciwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoreworCWludCBpOworCWludCByZWFkX2NtZCA9ICgweGY2IDw8IDEwKSB8IChwaHlfaWQgPDwgNSkgfCBsb2NhdGlvbjsKKwl1bnNpZ25lZCBpbnQgcmV0dmFsID0gMDsKKwlraW9fYWRkcl90IG1kaW9fYWRkciA9IGlvYWRkciArIFduNF9QaHlzaWNhbE1nbXQ7CisKKwlpZiAobWlpX3ByZWFtYmxlX3JlcXVpcmVkKQorCQltZGlvX3N5bmMoaW9hZGRyLCAzMik7CisKKwkvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDE0OyBpID49IDA7IGktLSkgeworCQlpbnQgZGF0YXZhbCA9IChyZWFkX2NtZCYoMTw8aSkpID8gTURJT19EQVRBX1dSSVRFMSA6IE1ESU9fREFUQV9XUklURTA7CisJCW91dHcoZGF0YXZhbCwgbWRpb19hZGRyKTsKKwkJb3V0dyhkYXRhdmFsIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJfQorCS8qIFJlYWQgdGhlIHR3byB0cmFuc2l0aW9uLCAxNiBkYXRhLCBhbmQgd2lyZS1pZGxlIGJpdHMuICovCisJZm9yIChpID0gMTk7IGkgPiAwOyBpLS0pIHsKKwkJb3V0dyhNRElPX0VOQl9JTiwgbWRpb19hZGRyKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW53KG1kaW9fYWRkcikgJiBNRElPX0RBVEFfUkVBRCkgPyAxIDogMCk7CisJCW91dHcoTURJT19FTkJfSU4gfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwl9CisJcmV0dXJuIChyZXR2YWw+PjEpICYgMHhmZmZmOworfQorCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKGtpb19hZGRyX3QgaW9hZGRyLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKK3sKKwlpbnQgd3JpdGVfY21kID0gMHg1MDAyMDAwMCB8IChwaHlfaWQgPDwgMjMpIHwgKGxvY2F0aW9uIDw8IDE4KSB8IHZhbHVlOworCWtpb19hZGRyX3QgbWRpb19hZGRyID0gaW9hZGRyICsgV240X1BoeXNpY2FsTWdtdDsKKwlpbnQgaTsKKworCWlmIChtaWlfcHJlYW1ibGVfcmVxdWlyZWQpCisJCW1kaW9fc3luYyhpb2FkZHIsIDMyKTsKKworCS8qIFNoaWZ0IHRoZSBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDMxOyBpID49IDA7IGktLSkgeworCQlpbnQgZGF0YXZhbCA9ICh3cml0ZV9jbWQmKDE8PGkpKSA/IE1ESU9fREFUQV9XUklURTEgOiBNRElPX0RBVEFfV1JJVEUwOworCQlvdXR3KGRhdGF2YWwsIG1kaW9fYWRkcik7CisJCW91dHcoZGF0YXZhbCB8IE1ESU9fU0hJRlRfQ0xLLCBtZGlvX2FkZHIpOworCX0KKwkvKiBMZWF2ZSB0aGUgaW50ZXJmYWNlIGlkbGUuICovCisJZm9yIChpID0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJb3V0dyhNRElPX0VOQl9JTiwgbWRpb19hZGRyKTsKKwkJb3V0dyhNRElPX0VOQl9JTiB8IE1ESU9fU0hJRlRfQ0xLLCBtZGlvX2FkZHIpOworCX0KKworCXJldHVybjsKK30KKworLyogUmVzZXQgYW5kIHJlc3RvcmUgYWxsIG9mIHRoZSAzYzU3NCByZWdpc3RlcnMuICovCitzdGF0aWMgdm9pZCB0YzU3NF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCWtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXRjNTc0X3dhaXRfZm9yX2NvbXBsZXRpb24oZGV2LCBUb3RhbFJlc2V0fDB4MTApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT53aW5kb3dfbG9jaywgZmxhZ3MpOworCS8qIENsZWFyIGFueSB0cmFuc2FjdGlvbnMgaW4gcHJvZ3Jlc3MuICovCisJb3V0dygwLCBpb2FkZHIgKyBSdW5uZXJXckN0cmwpOworCW91dHcoMCwgaW9hZGRyICsgUnVubmVyUmRDdHJsKTsKKworCS8qIFNldCB0aGUgc3RhdGlvbiBhZGRyZXNzIGFuZCBtYXNrLiAqLworCUVMM1dJTkRPVygyKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlvdXRiKGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIGkpOworCWZvciAoOyBpIDwgMTI7IGkrPTIpCisJCW91dHcoMCwgaW9hZGRyICsgaSk7CisKKwkvKiBSZXNldCBjb25maWcgb3B0aW9ucyAqLworCUVMM1dJTkRPVygzKTsKKwlvdXRiKChkZXYtPm10dSA+IDE1MDAgPyAweDQwIDogMCksIGlvYWRkciArIFduM19NQUNfQ3RybCk7CisJb3V0bCgobHAtPmF1dG9zZWxlY3QgPyAweDAxMDAwMDAwIDogMCkgfCAweDAwNjIwMDFiLAorCQkgaW9hZGRyICsgV24zX0NvbmZpZyk7CisJLyogUm9hZHJ1bm5lciBvbmx5OiBUdXJuIG9uIHRoZSBNSUkgdHJhbnNjZWl2ZXIuICovCisJb3V0dygweDgwNDAsIGlvYWRkciArIFduM19PcHRpb25zKTsKKwltZGVsYXkoMSk7CisJb3V0dygweGMwNDAsIGlvYWRkciArIFduM19PcHRpb25zKTsKKwlFTDNXSU5ET1coMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPndpbmRvd19sb2NrLCBmbGFncyk7CisJCisJdGM1NzRfd2FpdF9mb3JfY29tcGxldGlvbihkZXYsIFR4UmVzZXQpOworCXRjNTc0X3dhaXRfZm9yX2NvbXBsZXRpb24oZGV2LCBSeFJlc2V0KTsKKwltZGVsYXkoMSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT53aW5kb3dfbG9jaywgZmxhZ3MpOworCUVMM1dJTkRPVygzKTsKKwlvdXR3KDB4ODA0MCwgaW9hZGRyICsgV24zX09wdGlvbnMpOworCisJLyogU3dpdGNoIHRvIHRoZSBzdGF0cyB3aW5kb3csIGFuZCBjbGVhciBhbGwgc3RhdHMgYnkgcmVhZGluZy4gKi8KKwlvdXR3KFN0YXRzRGlzYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJRUwzV0lORE9XKDYpOworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorCQlpbmIoaW9hZGRyICsgaSk7CisJaW53KGlvYWRkciArIDEwKTsKKwlpbncoaW9hZGRyICsgMTIpOworCUVMM1dJTkRPVyg0KTsKKwlpbmIoaW9hZGRyICsgMTIpOworCWluYihpb2FkZHIgKyAxMyk7CisKKwkvKiAuLiBlbmFibGUgYW55IGV4dHJhIHN0YXRpc3RpY3MgYml0cy4uICovCisJb3V0dygweDAwNDAsIGlvYWRkciArIFduNF9OZXREaWFnKTsKKwkKKwlFTDNXSU5ET1coMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPndpbmRvd19sb2NrLCBmbGFncyk7CisJCisJLyogLi4gcmUtc3luYyBNSUkgYW5kIHJlLWZpbGwgd2hhdCBOV2F5IGlzIGFkdmVydGlzaW5nLiAqLworCW1kaW9fc3luYyhpb2FkZHIsIDMyKTsKKwltZGlvX3dyaXRlKGlvYWRkciwgbHAtPnBoeXMsIDQsIGxwLT5hZHZlcnRpc2luZyk7CisJaWYgKCFhdXRvX3BvbGFyaXR5KSB7CisJCS8qIHdvcmtzIGZvciBUREsgNzhRMjEyMCBzZXJpZXMgTUlJJ3MgKi8KKwkJaW50IGkgPSBtZGlvX3JlYWQoaW9hZGRyLCBscC0+cGh5cywgMTYpIHwgMHgyMDsKKwkJbWRpb193cml0ZShpb2FkZHIsIGxwLT5waHlzLCAxNiwgaSk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT53aW5kb3dfbG9jaywgZmxhZ3MpOworCS8qIFN3aXRjaCB0byByZWdpc3RlciBzZXQgMSBmb3Igbm9ybWFsIHVzZSwganVzdCBmb3IgVHhGcmVlLiAqLworCXNldF9yeF9tb2RlKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPndpbmRvd19sb2NrLCBmbGFncyk7CisJb3V0dyhTdGF0c0VuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7IC8qIFR1cm4gb24gc3RhdGlzdGljcy4gKi8KKwlvdXR3KFJ4RW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsgLyogRW5hYmxlIHRoZSByZWNlaXZlci4gKi8KKwlvdXR3KFR4RW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsgLyogRW5hYmxlIHRyYW5zbWl0dGVyLiAqLworCS8qIEFsbG93IHN0YXR1cyBiaXRzIHRvIGJlIHNlZW4uICovCisJb3V0dyhTZXRTdGF0dXNFbmIgfCAweGZmLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkvKiBBY2sgYWxsIHBlbmRpbmcgZXZlbnRzLCBhbmQgc2V0IGFjdGl2ZSBpbmRpY2F0b3IgbWFzay4gKi8KKwlvdXR3KEFja0ludHIgfCBJbnRMYXRjaCB8IFR4QXZhaWxhYmxlIHwgUnhFYXJseSB8IEludFJlcSwKKwkJIGlvYWRkciArIEVMM19DTUQpOworCW91dHcoU2V0SW50ckVuYiB8IEludExhdGNoIHwgVHhBdmFpbGFibGUgfCBSeENvbXBsZXRlIHwgU3RhdHNGdWxsCisJCSB8IEFkYXB0ZXJGYWlsdXJlIHwgUnhFYXJseSwgaW9hZGRyICsgRUwzX0NNRCk7Cit9CisKK3N0YXRpYyBpbnQgZWwzX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlkZXZfbGlua190ICpsaW5rID0gJmxwLT5saW5rOworCisJaWYgKCFERVZfT0sobGluaykpCisJCXJldHVybiAtRU5PREVWOworCQorCWxpbmstPm9wZW4rKzsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQorCXRjNTc0X3Jlc2V0KGRldik7CisJbHAtPm1lZGlhLmZ1bmN0aW9uID0gJm1lZGlhX2NoZWNrOworCWxwLT5tZWRpYS5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKwlscC0+bWVkaWEuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKwlhZGRfdGltZXIoJmxwLT5tZWRpYSk7CisJCisJREVCVUcoMiwgIiVzOiBvcGVuZWQsIHN0YXR1cyAlNC40eC5cbiIsCisJCSAgZGV2LT5uYW1lLCBpbncoZGV2LT5iYXNlX2FkZHIgKyBFTDNfU1RBVFVTKSk7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVsM190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJa2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwkKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQhXG4iLCBkZXYtPm5hbWUpOworCWR1bXBfc3RhdHVzKGRldik7CisJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCS8qIElzc3VlIFRYX1JFU0VUIGFuZCBUWF9TVEFSVCBjb21tYW5kcy4gKi8KKwl0YzU3NF93YWl0X2Zvcl9jb21wbGV0aW9uKGRldiwgVHhSZXNldCk7CisJb3V0dyhUeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgdm9pZCBwb3BfdHhfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJa2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaTsKKyAgICAKKwkvKiBDbGVhciB0aGUgVHggc3RhdHVzIHN0YWNrLiAqLworCWZvciAoaSA9IDMyOyBpID4gMDsgaS0tKSB7CisJCXVfY2hhciB0eF9zdGF0dXMgPSBpbmIoaW9hZGRyICsgVHhTdGF0dXMpOworCQlpZiAoISh0eF9zdGF0dXMgJiAweDg0KSkKKwkJCWJyZWFrOworCQkvKiByZXNldCB0cmFuc21pdHRlciBvbiBqYWJiZXIgZXJyb3Igb3IgdW5kZXJydW4gKi8KKwkJaWYgKHR4X3N0YXR1cyAmIDB4MzApCisJCQl0YzU3NF93YWl0X2Zvcl9jb21wbGV0aW9uKGRldiwgVHhSZXNldCk7CisJCWlmICh0eF9zdGF0dXMgJiAweDM4KSB7CisJCQlERUJVRygxLCAiJXM6IHRyYW5zbWl0IGVycm9yOiBzdGF0dXMgMHglMDJ4XG4iLAorCQkJCSAgZGV2LT5uYW1lLCB0eF9zdGF0dXMpOworCQkJb3V0dyhUeEVuYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJfQorCQlvdXRiKDB4MDAsIGlvYWRkciArIFR4U3RhdHVzKTsgLyogUG9wIHRoZSBzdGF0dXMgc3RhY2suICovCisJfQorfQorCitzdGF0aWMgaW50IGVsM19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJa2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJREVCVUcoMywgIiVzOiBlbDNfc3RhcnRfeG1pdChsZW5ndGggPSAlbGQpIGNhbGxlZCwgIgorCQkgICJzdGF0dXMgJTQuNHguXG4iLCBkZXYtPm5hbWUsIChsb25nKXNrYi0+bGVuLAorCQkgIGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPndpbmRvd19sb2NrLCBmbGFncyk7CisJb3V0dyhza2ItPmxlbiwgaW9hZGRyICsgVFhfRklGTyk7CisJb3V0dygwLCBpb2FkZHIgKyBUWF9GSUZPKTsKKwlvdXRzbChpb2FkZHIgKyBUWF9GSUZPLCBza2ItPmRhdGEsIChza2ItPmxlbiszKT4+Mik7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIFR4RnJlZSBhcHBlYXJzIG9ubHkgaW4gV2luZG93IDEsIG5vdCBvZmZzZXQgMHgxYy4gKi8KKwlpZiAoaW53KGlvYWRkciArIFR4RnJlZSkgPD0gMTUzNikgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCS8qIEludGVycnVwdCB1cyB3aGVuIHRoZSBGSUZPIGhhcyByb29tIGZvciBtYXgtc2l6ZWQgcGFja2V0LiAKKwkJICAgVGhlIHRocmVzaG9sZCBpcyBpbiB1bml0cyBvZiBkd29yZHMuICovCisJCW91dHcoU2V0VHhUaHJlc2hvbGQgKyAoMTUzNj4+MiksIGlvYWRkciArIEVMM19DTUQpOworCX0KKworCXBvcF90eF9zdGF0dXMoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+d2luZG93X2xvY2ssIGZsYWdzKTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBFTDMgaW50ZXJydXB0IGhhbmRsZXIuICovCitzdGF0aWMgaXJxcmV0dXJuX3QgZWwzX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWtpb19hZGRyX3QgaW9hZGRyOworCXVuc2lnbmVkIHN0YXR1czsKKwlpbnQgd29ya19idWRnZXQgPSBtYXhfaW50ZXJydXB0X3dvcms7CisJaW50IGhhbmRsZWQgPSAwOworCisJaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCQlyZXR1cm4gSVJRX05PTkU7CisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlERUJVRygzLCAiJXM6IGludGVycnVwdCwgc3RhdHVzICU0LjR4LlxuIiwKKwkJICBkZXYtPm5hbWUsIGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSk7CisKKwlzcGluX2xvY2soJmxwLT53aW5kb3dfbG9jayk7CisJCisJd2hpbGUgKChzdGF0dXMgPSBpbncoaW9hZGRyICsgRUwzX1NUQVRVUykpICYKKwkJICAgKEludExhdGNoIHwgUnhDb21wbGV0ZSB8IFJ4RWFybHkgfCBTdGF0c0Z1bGwpKSB7CisJCWlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSB8fAorCQkJKChzdGF0dXMgJiAweGUwMDApICE9IDB4MjAwMCkpIHsKKwkJCURFQlVHKDEsICIlczogSW50ZXJydXB0IGZyb20gZGVhZCBjYXJkXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKworCQloYW5kbGVkID0gMTsKKworCQlpZiAoc3RhdHVzICYgUnhDb21wbGV0ZSkKKwkJCXdvcmtfYnVkZ2V0ID0gZWwzX3J4KGRldiwgd29ya19idWRnZXQpOworCisJCWlmIChzdGF0dXMgJiBUeEF2YWlsYWJsZSkgeworCQkJREVCVUcoMywgIiAgVFggcm9vbSBiaXQgd2FzIGhhbmRsZWQuXG4iKTsKKwkJCS8qIFRoZXJlJ3Mgcm9vbSBpbiB0aGUgRklGTyBmb3IgYSBmdWxsLXNpemVkIHBhY2tldC4gKi8KKwkJCW91dHcoQWNrSW50ciB8IFR4QXZhaWxhYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfQorCisJCWlmIChzdGF0dXMgJiBUeENvbXBsZXRlKQorCQkJcG9wX3R4X3N0YXR1cyhkZXYpOworCisJCWlmIChzdGF0dXMgJiAoQWRhcHRlckZhaWx1cmUgfCBSeEVhcmx5IHwgU3RhdHNGdWxsKSkgeworCQkJLyogSGFuZGxlIGFsbCB1bmNvbW1vbiBpbnRlcnJ1cHRzLiAqLworCQkJaWYgKHN0YXR1cyAmIFN0YXRzRnVsbCkKKwkJCQl1cGRhdGVfc3RhdHMoZGV2KTsKKwkJCWlmIChzdGF0dXMgJiBSeEVhcmx5KSB7CisJCQkJd29ya19idWRnZXQgPSBlbDNfcngoZGV2LCB3b3JrX2J1ZGdldCk7CisJCQkJb3V0dyhBY2tJbnRyIHwgUnhFYXJseSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQl9CisJCQlpZiAoc3RhdHVzICYgQWRhcHRlckZhaWx1cmUpIHsKKwkJCQl1MTYgZmlmb19kaWFnOworCQkJCUVMM1dJTkRPVyg0KTsKKwkJCQlmaWZvX2RpYWcgPSBpbncoaW9hZGRyICsgV240X0ZJRk9EaWFnKTsKKwkJCQlFTDNXSU5ET1coMSk7CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogYWRhcHRlciBmYWlsdXJlLCBGSUZPIGRpYWdub3N0aWMiCisJCQkJCSAgICIgcmVnaXN0ZXIgJTA0eC5cbiIsIGRldi0+bmFtZSwgZmlmb19kaWFnKTsKKwkJCQlpZiAoZmlmb19kaWFnICYgMHgwNDAwKSB7CisJCQkJCS8qIFR4IG92ZXJydW4gKi8KKwkJCQkJdGM1NzRfd2FpdF9mb3JfY29tcGxldGlvbihkZXYsIFR4UmVzZXQpOworCQkJCQlvdXR3KFR4RW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJCQl9CisJCQkJaWYgKGZpZm9fZGlhZyAmIDB4MjAwMCkgeworCQkJCQkvKiBSeCB1bmRlcnJ1biAqLworCQkJCQl0YzU3NF93YWl0X2Zvcl9jb21wbGV0aW9uKGRldiwgUnhSZXNldCk7CisJCQkJCXNldF9yeF9tb2RlKGRldik7CisJCQkJCW91dHcoUnhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCQkJCX0KKwkJCQlvdXR3KEFja0ludHIgfCBBZGFwdGVyRmFpbHVyZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQl9CisJCX0KKworCQlpZiAoLS13b3JrX2J1ZGdldCA8IDApIHsKKwkJCURFQlVHKDAsICIlczogVG9vIG11Y2ggd29yayBpbiBpbnRlcnJ1cHQsICIKKwkJCQkgICJzdGF0dXMgJTQuNHguXG4iLCBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCQkvKiBDbGVhciBhbGwgaW50ZXJydXB0cyAqLworCQkJb3V0dyhBY2tJbnRyIHwgMHhGRiwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQlicmVhazsKKwkJfQorCQkvKiBBY2tub3dsZWRnZSB0aGUgSVJRLiAqLworCQlvdXR3KEFja0ludHIgfCBJbnRSZXEgfCBJbnRMYXRjaCwgaW9hZGRyICsgRUwzX0NNRCk7CisJfQorCisJREVCVUcoMywgIiVzOiBleGl0aW5nIGludGVycnVwdCwgc3RhdHVzICU0LjR4LlxuIiwKKwkJICBkZXYtPm5hbWUsIGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSk7CisJCSAgCisJc3Bpbl91bmxvY2soJmxwLT53aW5kb3dfbG9jayk7CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qCisgICAgVGhpcyB0aW1lciBzZXJ2ZXMgdHdvIHB1cnBvc2VzOiB0byBjaGVjayBmb3IgbWlzc2VkIGludGVycnVwdHMKKwkoYW5kIGFzIGEgbGFzdCByZXNvcnQsIHBvbGwgdGhlIE5JQyBmb3IgZXZlbnRzKSwgYW5kIHRvIG1vbml0b3IKKwl0aGUgTUlJLCByZXBvcnRpbmcgY2hhbmdlcyBpbiBjYWJsZSBzdGF0dXMuCisqLworc3RhdGljIHZvaWQgbWVkaWFfY2hlY2sodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBhcmc7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJa2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHNob3J0IC8qIGNhYmxlLCAqLyBtZWRpYSwgcGFydG5lcjsKKworCWlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKwkJZ290byByZXNjaGVkdWxlOworCQorCS8qIENoZWNrIGZvciBwZW5kaW5nIGludGVycnVwdCB3aXRoIGV4cGlyZWQgbGF0ZW5jeSB0aW1lcjogd2l0aAorCSAgIHRoaXMsIHdlIGNhbiBsaW1wIGFsb25nIGV2ZW4gaWYgdGhlIGludGVycnVwdCBpcyBibG9ja2VkICovCisJaWYgKChpbncoaW9hZGRyICsgRUwzX1NUQVRVUykgJiBJbnRMYXRjaCkgJiYgKGluYihpb2FkZHIgKyBUaW1lcikgPT0gMHhmZikpIHsKKwkJaWYgKCFscC0+ZmFzdF9wb2xsKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludGVycnVwdChzKSBkcm9wcGVkIVxuIiwgZGV2LT5uYW1lKTsKKwkJZWwzX2ludGVycnVwdChkZXYtPmlycSwgbHAsIE5VTEwpOworCQlscC0+ZmFzdF9wb2xsID0gSFo7CisJfQorCWlmIChscC0+ZmFzdF9wb2xsKSB7CisJCWxwLT5mYXN0X3BvbGwtLTsKKwkJbHAtPm1lZGlhLmV4cGlyZXMgPSBqaWZmaWVzICsgMipIWi8xMDA7CisJCWFkZF90aW1lcigmbHAtPm1lZGlhKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+d2luZG93X2xvY2ssIGZsYWdzKTsKKwlFTDNXSU5ET1coNCk7CisJbWVkaWEgPSBtZGlvX3JlYWQoaW9hZGRyLCBscC0+cGh5cywgMSk7CisJcGFydG5lciA9IG1kaW9fcmVhZChpb2FkZHIsIGxwLT5waHlzLCA1KTsKKwlFTDNXSU5ET1coMSk7CisJCisJaWYgKG1lZGlhICE9IGxwLT5tZWRpYV9zdGF0dXMpIHsKKwkJaWYgKChtZWRpYSBeIGxwLT5tZWRpYV9zdGF0dXMpICYgMHgwMDA0KQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGxpbmsgYmVhdFxuIiwgZGV2LT5uYW1lLAorCQkJCSAgIChscC0+bWVkaWFfc3RhdHVzICYgMHgwMDA0KSA/ICJsb3N0IiA6ICJmb3VuZCIpOworCQlpZiAoKG1lZGlhIF4gbHAtPm1lZGlhX3N0YXR1cykgJiAweDAwMjApIHsKKwkJCWxwLT5wYXJ0bmVyID0gMDsKKwkJCWlmIChscC0+bWVkaWFfc3RhdHVzICYgMHgwMDIwKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGF1dG9uZWdvdGlhdGlvbiByZXN0YXJ0ZWRcbiIsCisJCQkJCSAgIGRldi0+bmFtZSk7CisJCQl9IGVsc2UgaWYgKHBhcnRuZXIpIHsKKwkJCQlwYXJ0bmVyICY9IGxwLT5hZHZlcnRpc2luZzsKKwkJCQlscC0+cGFydG5lciA9IHBhcnRuZXI7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGF1dG9uZWdvdGlhdGlvbiBjb21wbGV0ZTogIgorCQkJCQkgICAiJXNiYXNlVC0lY0Qgc2VsZWN0ZWRcbiIsIGRldi0+bmFtZSwKKwkJCQkJICAgKChwYXJ0bmVyICYgMHgwMTgwKSA/ICIxMDAiIDogIjEwIiksCisJCQkJCSAgICgocGFydG5lciAmIDB4MDE0MCkgPyAnRicgOiAnSCcpKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgcGFydG5lciBkaWQgbm90IGF1dG9uZWdvdGlhdGVcbiIsCisJCQkJCSAgIGRldi0+bmFtZSk7CisJCQl9CisKKwkJCUVMM1dJTkRPVygzKTsKKwkJCW91dGIoKHBhcnRuZXIgJiAweDAxNDAgPyAweDIwIDogMCkgfAorCQkJCSAoZGV2LT5tdHUgPiAxNTAwID8gMHg0MCA6IDApLCBpb2FkZHIgKyBXbjNfTUFDX0N0cmwpOworCQkJRUwzV0lORE9XKDEpOworCisJCX0KKwkJaWYgKG1lZGlhICYgMHgwMDEwKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlbW90ZSBmYXVsdCBkZXRlY3RlZFxuIiwKKwkJCQkgICBkZXYtPm5hbWUpOworCQlpZiAobWVkaWEgJiAweDAwMDIpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogamFiYmVyIGRldGVjdGVkXG4iLCBkZXYtPm5hbWUpOworCQlscC0+bWVkaWFfc3RhdHVzID0gbWVkaWE7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT53aW5kb3dfbG9jaywgZmxhZ3MpOworCityZXNjaGVkdWxlOgorCWxwLT5tZWRpYS5leHBpcmVzID0gamlmZmllcyArIEhaOworCWFkZF90aW1lcigmbHAtPm1lZGlhKTsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICplbDNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAobmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPndpbmRvd19sb2NrLCBmbGFncyk7CisJCXVwZGF0ZV9zdGF0cyhkZXYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+d2luZG93X2xvY2ssIGZsYWdzKTsKKwl9CisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qICBVcGRhdGUgc3RhdGlzdGljcy4KKwlTdXByaXNpbmdseSB0aGlzIG5lZWQgbm90IGJlIHJ1biBzaW5nbGUtdGhyZWFkZWQsIGJ1dCBpdCBlZmZlY3RpdmVseSBpcy4KKwlUaGUgY291bnRlcnMgY2xlYXIgd2hlbiByZWFkLCBzbyB0aGUgYWRkcyBtdXN0IG1lcmVseSBiZSBhdG9taWMuCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdTggcngsIHR4LCB1cDsKKworCURFQlVHKDIsICIlczogdXBkYXRpbmcgdGhlIHN0YXRpc3RpY3MuXG4iLCBkZXYtPm5hbWUpOworCisJaWYgKGludyhpb2FkZHIrRUwzX1NUQVRVUykgPT0gMHhmZmZmKSAvKiBObyBjYXJkLiAqLworCQlyZXR1cm47CisJCQorCS8qIFVubGlrZSB0aGUgM2M1MDkgd2UgbmVlZCBub3QgdHVybiBvZmYgc3RhdHMgdXBkYXRlcyB3aGlsZSByZWFkaW5nLiAqLworCS8qIFN3aXRjaCB0byB0aGUgc3RhdHMgd2luZG93LCBhbmQgcmVhZCBldmVyeXRoaW5nLiAqLworCUVMM1dJTkRPVyg2KTsKKwlscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMgCQkrPSBpbmIoaW9hZGRyICsgMCk7CisJbHAtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMJCSs9IGluYihpb2FkZHIgKyAxKTsKKwkvKiBNdWx0aXBsZSBjb2xsaXNpb25zLiAqLwkgICAJaW5iKGlvYWRkciArIDIpOworCWxwLT5zdGF0cy5jb2xsaXNpb25zCQkJKz0gaW5iKGlvYWRkciArIDMpOworCWxwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzCQkrPSBpbmIoaW9hZGRyICsgNCk7CisJbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzCQkrPSBpbmIoaW9hZGRyICsgNSk7CisJbHAtPnN0YXRzLnR4X3BhY2tldHMJCQkrPSBpbmIoaW9hZGRyICsgNik7CisJdXAJCSAJCQkgPSBpbmIoaW9hZGRyICsgOSk7CisJbHAtPnN0YXRzLnR4X3BhY2tldHMJCQkrPSAodXAmMHgzMCkgPDwgNDsKKwkvKiBSeCBwYWNrZXRzICAgKi8JCQkgICBpbmIoaW9hZGRyICsgNyk7CisJLyogVHggZGVmZXJyYWxzICovCQkJICAgaW5iKGlvYWRkciArIDgpOworCXJ4CQkgCQkJID0gaW53KGlvYWRkciArIDEwKTsKKwl0eAkJCQkJID0gaW53KGlvYWRkciArIDEyKTsKKworCUVMM1dJTkRPVyg0KTsKKwkvKiBCYWRTU0QgKi8JCQkJICAgaW5iKGlvYWRkciArIDEyKTsKKwl1cAkJCQkJID0gaW5iKGlvYWRkciArIDEzKTsKKworCWxwLT5zdGF0cy50eF9ieXRlcyAJCQkrPSB0eCArICgodXAgJiAweGYwKSA8PCAxMik7CisKKwlFTDNXSU5ET1coMSk7Cit9CisKK3N0YXRpYyBpbnQgZWwzX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB3b3JrbGltaXQpCit7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJa2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzaG9ydCByeF9zdGF0dXM7CisJCisJREVCVUcoMywgIiVzOiBpbiByeF9wYWNrZXQoKSwgc3RhdHVzICU0LjR4LCByeF9zdGF0dXMgJTQuNHguXG4iLAorCQkgIGRldi0+bmFtZSwgaW53KGlvYWRkcitFTDNfU1RBVFVTKSwgaW53KGlvYWRkcitSeFN0YXR1cykpOworCXdoaWxlICghKChyeF9zdGF0dXMgPSBpbncoaW9hZGRyICsgUnhTdGF0dXMpKSAmIDB4ODAwMCkgJiYKKwkJICAgKC0td29ya2xpbWl0ID49IDApKSB7CisJCWlmIChyeF9zdGF0dXMgJiAweDQwMDApIHsgLyogRXJyb3IsIHVwZGF0ZSBzdGF0cy4gKi8KKwkJCXNob3J0IGVycm9yID0gcnhfc3RhdHVzICYgMHgzODAwOworCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJc3dpdGNoIChlcnJvcikgeworCQkJY2FzZSAweDAwMDA6CWxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOyBicmVhazsKKwkJCWNhc2UgMHgwODAwOglscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOyBicmVhazsKKwkJCWNhc2UgMHgxMDAwOglscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7IGJyZWFrOworCQkJY2FzZSAweDE4MDA6CWxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7IGJyZWFrOworCQkJY2FzZSAweDIwMDA6CWxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsgYnJlYWs7CisJCQljYXNlIDB4MjgwMDoJbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsgYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzaG9ydCBwa3RfbGVuID0gcnhfc3RhdHVzICYgMHg3ZmY7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4rNSk7CisKKwkJCURFQlVHKDMsICIgIFJlY2VpdmluZyBwYWNrZXQgc2l6ZSAlZCBzdGF0dXMgJTQuNHguXG4iLAorCQkJCSAgcGt0X2xlbiwgcnhfc3RhdHVzKTsKKwkJCWlmIChza2IgIT0gTlVMTCkgeworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJCQkJaW5zbChpb2FkZHIrUlhfRklGTywgc2tiX3B1dChza2IsIHBrdF9sZW4pLAorCQkJCQkJKChwa3RfbGVuKzMpPj4yKSk7CisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCQluZXRpZl9yeChza2IpOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJCX0gZWxzZSB7CisJCQkJREVCVUcoMSwgIiVzOiBjb3VsZG4ndCBhbGxvY2F0ZSBhIHNrX2J1ZmYgb2YiCisJCQkJCSAgIiBzaXplICVkLlxuIiwgZGV2LT5uYW1lLCBwa3RfbGVuKTsKKwkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJfQorCQl9CisJCXRjNTc0X3dhaXRfZm9yX2NvbXBsZXRpb24oZGV2LCBSeERpc2NhcmQpOworCX0KKworCXJldHVybiB3b3JrbGltaXQ7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgIjNjNTc0X2NzIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBuZXRkZXZfZ2V0X2RydmluZm8sCit9OworCisvKiBQcm92aWRlIGlvY3RsKCkgY2FsbHMgdG8gZXhhbWluZSB0aGUgTUlJIHhjdnIgc3RhdGUuICovCitzdGF0aWMgaW50IGVsM19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdTE2ICpkYXRhID0gKHUxNiAqKSZycS0+aWZyX2lmcnU7CisJaW50IHBoeSA9IGxwLT5waHlzICYgMHgxZjsKKworCURFQlVHKDIsICIlczogSW4gaW9jdCglLS42cywgJSM0LjR4KSAlNC40eCAlNC40eCAlNC40eCAlNC40eC5cbiIsCisJCSAgZGV2LT5uYW1lLCBycS0+aWZyX2lmcm4uaWZybl9uYW1lLCBjbWQsCisJCSAgZGF0YVswXSwgZGF0YVsxXSwgZGF0YVsyXSwgZGF0YVszXSk7CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBTSU9DR01JSVBIWToJCS8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgUEhZIGluIHVzZS4gKi8KKwkJZGF0YVswXSA9IHBoeTsKKwljYXNlIFNJT0NHTUlJUkVHOgkJLyogUmVhZCB0aGUgc3BlY2lmaWVkIE1JSSByZWdpc3Rlci4gKi8KKwkJeworCQkJaW50IHNhdmVkX3dpbmRvdzsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+d2luZG93X2xvY2ssIGZsYWdzKTsKKwkJCXNhdmVkX3dpbmRvdyA9IGludyhpb2FkZHIgKyBFTDNfQ01EKSA+PiAxMzsKKwkJCUVMM1dJTkRPVyg0KTsKKwkJCWRhdGFbM10gPSBtZGlvX3JlYWQoaW9hZGRyLCBkYXRhWzBdICYgMHgxZiwgZGF0YVsxXSAmIDB4MWYpOworCQkJRUwzV0lORE9XKHNhdmVkX3dpbmRvdyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+d2luZG93X2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAwOworCQl9CisJY2FzZSBTSU9DU01JSVJFRzoJCS8qIFdyaXRlIHRoZSBzcGVjaWZpZWQgTUlJIHJlZ2lzdGVyICovCisJCXsKKwkJCWludCBzYXZlZF93aW5kb3c7CisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT53aW5kb3dfbG9jaywgZmxhZ3MpOworCQkJc2F2ZWRfd2luZG93ID0gaW53KGlvYWRkciArIEVMM19DTUQpID4+IDEzOworCQkJRUwzV0lORE9XKDQpOworCQkJbWRpb193cml0ZShpb2FkZHIsIGRhdGFbMF0gJiAweDFmLCBkYXRhWzFdICYgMHgxZiwgZGF0YVsyXSk7CisJCQlFTDNXSU5ET1coc2F2ZWRfd2luZG93KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT53aW5kb3dfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIDA7CisJCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCisvKiBUaGUgT2RpZSBjaGlwIGhhcyBhIDY0IGJpbiBtdWx0aWNhc3QgZmlsdGVyLCBidXQgdGhlIGJpdCBsYXlvdXQgaXMgbm90CisgICBkb2N1bWVudGVkLiAgVW50aWwgaXQgaXMgd2UgcmV2ZXJ0IHRvIHJlY2VpdmluZyBhbGwgbXVsdGljYXN0IGZyYW1lcyB3aGVuCisgICBhbnkgbXVsdGljYXN0IHJlY2VwdGlvbiBpcyBkZXNpcmVkLgorICAgTm90ZTogTXkgb3RoZXIgZHJpdmVycyBlbWl0IGEgbG9nIG1lc3NhZ2Ugd2hlbmV2ZXIgcHJvbWlzY3VvdXMgbW9kZSBpcworICAgZW50ZXJlZCB0byBoZWxwIGRldGVjdCBwYXNzd29yZCBzbmlmZmVycy4gIFRoaXMgaXMgbGVzcyBkZXNpcmFibGUgb24KKyAgIHR5cGljYWwgUEMgY2FyZCBtYWNoaW5lcywgc28gd2Ugb21pdCB0aGUgbWVzc2FnZS4KKyAgICovCisKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJa2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCW91dHcoU2V0UnhGaWx0ZXIgfCBSeFN0YXRpb24gfCBSeE11bHRpY2FzdCB8IFJ4QnJvYWRjYXN0IHwgUnhQcm9tLAorCQkJIGlvYWRkciArIEVMM19DTUQpOworCWVsc2UgaWYgKGRldi0+bWNfY291bnQgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKQorCQlvdXR3KFNldFJ4RmlsdGVyfFJ4U3RhdGlvbnxSeE11bHRpY2FzdHxSeEJyb2FkY2FzdCwgaW9hZGRyICsgRUwzX0NNRCk7CisJZWxzZQorCQlvdXR3KFNldFJ4RmlsdGVyIHwgUnhTdGF0aW9uIHwgUnhCcm9hZGNhc3QsIGlvYWRkciArIEVMM19DTUQpOworfQorCitzdGF0aWMgaW50IGVsM19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJZGV2X2xpbmtfdCAqbGluayA9ICZscC0+bGluazsKKworCURFQlVHKDIsICIlczogc2h1dHRpbmcgZG93biBldGhlcmNhcmQuXG4iLCBkZXYtPm5hbWUpOworCQorCWlmIChERVZfT0sobGluaykpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkvKiBUdXJuIG9mZiBzdGF0aXN0aWNzIEFTQVAuICBXZSB1cGRhdGUgbHAtPnN0YXRzIGJlbG93LiAqLworCQlvdXR3KFN0YXRzRGlzYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJCQorCQkvKiBEaXNhYmxlIHRoZSByZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXIuICovCisJCW91dHcoUnhEaXNhYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJb3V0dyhUeERpc2FibGUsIGlvYWRkciArIEVMM19DTUQpOworCQkKKwkJLyogTm90ZTogU3dpdGNoaW5nIHRvIHdpbmRvdyAwIG1heSBkaXNhYmxlIHRoZSBJUlEuICovCisJCUVMM1dJTkRPVygwKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT53aW5kb3dfbG9jaywgZmxhZ3MpOworCQl1cGRhdGVfc3RhdHMoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPndpbmRvd19sb2NrLCBmbGFncyk7CisJfQorCisJbGluay0+b3Blbi0tOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlkZWxfdGltZXJfc3luYygmbHAtPm1lZGlhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgdGM1NzRfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSAiM2M1NzRfY3MiLAorCX0sCisJLmF0dGFjaAkJPSB0YzU3NF9hdHRhY2gsCisJLmRldGFjaAkJPSB0YzU3NF9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3RjNTc0KHZvaWQpCit7CisJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJnRjNTc0X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3RjNTc0KHZvaWQpCit7CisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZ0YzU3NF9kcml2ZXIpOworCUJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF90YzU3NCk7Cittb2R1bGVfZXhpdChleGl0X3RjNTc0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU4OV9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTg5X2NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhYmRkYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU4OV9jcy5jCkBAIC0wLDAgKzEsMTA4MSBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBBIFBDTUNJQSBldGhlcm5ldCBkcml2ZXIgZm9yIHRoZSAzY29tIDNjNTg5IGNhcmQuCisgICAgCisgICAgQ29weXJpZ2h0IChDKSAxOTk5IERhdmlkIEEuIEhpbmRzIC0tIGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0CisKKyAgICAzYzU4OV9jcy5jIDEuMTYyIDIwMDEvMTAvMTMgMDA6MDg6NTAKKworICAgIFRoZSBuZXR3b3JrIGRyaXZlciBjb2RlIGlzIGJhc2VkIG9uIERvbmFsZCBCZWNrZXIncyAzYzU4OSBjb2RlOgorICAgIAorICAgIFdyaXR0ZW4gMTk5NCBieSBEb25hbGQgQmVja2VyLgorICAgIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKyAgICBEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQKKyAgICBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAgICBEb25hbGQgQmVja2VyIG1heSBiZSByZWFjaGVkIGF0IGJlY2tlckBzY3lsZC5jb20KKyAgICAKKyAgICBVcGRhdGVkIGZvciAyLjUueCBieSBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBEUlZfTkFNRQkiM2M1ODlfY3MiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjE2Mi1hYyIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisvKiBUbyBtaW5pbWl6ZSB0aGUgc2l6ZSBvZiB0aGUgZHJpdmVyIHNvdXJjZSBJIG9ubHkgZGVmaW5lIG9wZXJhdGluZworICAgY29uc3RhbnRzIGlmIHRoZXkgYXJlIHVzZWQgc2V2ZXJhbCB0aW1lcy4gIFlvdSdsbCBuZWVkIHRoZSBtYW51YWwKKyAgIGlmIHlvdSB3YW50IHRvIHVuZGVyc3RhbmQgZHJpdmVyIGRldGFpbHMuICovCisvKiBPZmZzZXRzIGZyb20gYmFzZSBJL08gYWRkcmVzcy4gKi8KKyNkZWZpbmUgRUwzX0RBVEEJMHgwMAorI2RlZmluZSBFTDNfVElNRVIJMHgwYQorI2RlZmluZSBFTDNfQ01ECQkweDBlCisjZGVmaW5lIEVMM19TVEFUVVMJMHgwZQorCisjZGVmaW5lIEVFUFJPTV9SRUFECTB4MDA4MAorI2RlZmluZSBFRVBST01fQlVTWQkweDgwMDAKKworI2RlZmluZSBFTDNXSU5ET1cod2luX251bSkgb3V0dyhTZWxlY3RXaW5kb3cgKyAod2luX251bSksIGlvYWRkciArIEVMM19DTUQpCisKKy8qIFRoZSB0b3AgZml2ZSBiaXRzIHdyaXR0ZW4gdG8gRUwzX0NNRCBhcmUgYSBjb21tYW5kLCB0aGUgbG93ZXIKKyAgIDExIGJpdHMgYXJlIHRoZSBwYXJhbWV0ZXIsIGlmIGFwcGxpY2FibGUuICovCitlbnVtIGM1MDljbWQgeworICAgIFRvdGFsUmVzZXQgPSAwPDwxMSwgU2VsZWN0V2luZG93ID0gMTw8MTEsIFN0YXJ0Q29heCA9IDI8PDExLAorICAgIFJ4RGlzYWJsZSA9IDM8PDExLCBSeEVuYWJsZSA9IDQ8PDExLCBSeFJlc2V0ID0gNTw8MTEsIFJ4RGlzY2FyZCA9IDg8PDExLAorICAgIFR4RW5hYmxlID0gOTw8MTEsIFR4RGlzYWJsZSA9IDEwPDwxMSwgVHhSZXNldCA9IDExPDwxMSwKKyAgICBGYWtlSW50ciA9IDEyPDwxMSwgQWNrSW50ciA9IDEzPDwxMSwgU2V0SW50ckVuYiA9IDE0PDwxMSwKKyAgICBTZXRTdGF0dXNFbmIgPSAxNTw8MTEsIFNldFJ4RmlsdGVyID0gMTY8PDExLCBTZXRSeFRocmVzaG9sZCA9IDE3PDwxMSwKKyAgICBTZXRUeFRocmVzaG9sZCA9IDE4PDwxMSwgU2V0VHhTdGFydCA9IDE5PDwxMSwgU3RhdHNFbmFibGUgPSAyMTw8MTEsCisgICAgU3RhdHNEaXNhYmxlID0gMjI8PDExLCBTdG9wQ29heCA9IDIzPDwxMSwKK307CisKK2VudW0gYzUwOXN0YXR1cyB7CisgICAgSW50TGF0Y2ggPSAweDAwMDEsIEFkYXB0ZXJGYWlsdXJlID0gMHgwMDAyLCBUeENvbXBsZXRlID0gMHgwMDA0LAorICAgIFR4QXZhaWxhYmxlID0gMHgwMDA4LCBSeENvbXBsZXRlID0gMHgwMDEwLCBSeEVhcmx5ID0gMHgwMDIwLAorICAgIEludFJlcSA9IDB4MDA0MCwgU3RhdHNGdWxsID0gMHgwMDgwLCBDbWRCdXN5ID0gMHgxMDAwCit9OworCisvKiBUaGUgU2V0UnhGaWx0ZXIgY29tbWFuZCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgY2xhc3NlczogKi8KK2VudW0gUnhGaWx0ZXIgeworICAgIFJ4U3RhdGlvbiA9IDEsIFJ4TXVsdGljYXN0ID0gMiwgUnhCcm9hZGNhc3QgPSA0LCBSeFByb20gPSA4Cit9OworCisvKiBSZWdpc3RlciB3aW5kb3cgMSBvZmZzZXRzLCB0aGUgd2luZG93IHVzZWQgaW4gbm9ybWFsIG9wZXJhdGlvbi4gKi8KKyNkZWZpbmUgVFhfRklGTwkJMHgwMAorI2RlZmluZSBSWF9GSUZPCQkweDAwCisjZGVmaW5lIFJYX1NUQVRVUyAJMHgwOAorI2RlZmluZSBUWF9TVEFUVVMgCTB4MEIKKyNkZWZpbmUgVFhfRlJFRQkJMHgwQwkvKiBSZW1haW5pbmcgZnJlZSBieXRlcyBpbiBUeCBidWZmZXIuICovCisKKyNkZWZpbmUgV04wX0lSUQkJMHgwOAkvKiBXaW5kb3cgMDogU2V0IElSUSBsaW5lIGluIGJpdHMgMTItMTUuICovCisjZGVmaW5lIFdONF9NRURJQQkweDBBCS8qIFdpbmRvdyA0OiBWYXJpb3VzIHRyYW5zY3ZyL21lZGlhIGJpdHMuICovCisjZGVmaW5lIE1FRElBX1RQCTB4MDBDMAkvKiBFbmFibGUgbGluayBiZWF0IGFuZCBqYWJiZXIgZm9yIDEwYmFzZVQuICovCisjZGVmaW5lIE1FRElBX0xFRAkweDAwMDEJLyogRW5hYmxlIGxpbmsgbGlnaHQgb24gM0M1ODlFIGNhcmRzLiAqLworCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgVHggaHVuZyAqLworI2RlZmluZSBUWF9USU1FT1VUCSgoNDAwKkhaKS8xMDAwKQorCitzdHJ1Y3QgZWwzX3ByaXZhdGUgeworICAgIGRldl9saW5rX3QJCWxpbms7CisgICAgZGV2X25vZGVfdCAJCW5vZGU7CisgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisgICAgLyogRm9yIHRyYW5zY2VpdmVyIG1vbml0b3JpbmcgKi8KKyAgICBzdHJ1Y3QgdGltZXJfbGlzdAltZWRpYTsKKyAgICB1MTYJCQltZWRpYV9zdGF0dXM7CisgICAgdTE2CQkJZmFzdF9wb2xsOworICAgIHVuc2lnbmVkIGxvbmcJbGFzdF9pcnE7CisgICAgc3BpbmxvY2tfdAkJbG9jazsKK307CisKK3N0YXRpYyBjaGFyICppZl9uYW1lc1tdID0geyAiYXV0byIsICIxMGJhc2VUIiwgIjEwYmFzZTIiLCAiQVVJIiB9OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KKworTU9EVUxFX0FVVEhPUigiRGF2aWQgSGluZHMgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCIzQ29tIDNjNTg5IHNlcmllcyBQQ01DSUEgZXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgSU5UX01PRFVMRV9QQVJNKG4sIHYpIHN0YXRpYyBpbnQgbiA9IHY7IG1vZHVsZV9wYXJhbShuLCBpbnQsIDApCisKKy8qIFNwZWNpYWwgaG9vayBmb3Igc2V0dGluZyBpZl9wb3J0IHdoZW4gbW9kdWxlIGlzIGxvYWRlZCAqLworSU5UX01PRFVMRV9QQVJNKGlmX3BvcnQsIDApOworCisjaWZkZWYgUENNQ0lBX0RFQlVHCitJTlRfTU9EVUxFX1BBUk0ocGNfZGVidWcsIFBDTUNJQV9ERUJVRyk7CisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpCitzdGF0aWMgY2hhciAqdmVyc2lvbiA9CitEUlZfTkFNRSAiLmMgIiBEUlZfVkVSU0lPTiAiIDIwMDEvMTAvMTMgMDA6MDg6NTAgKERhdmlkIEhpbmRzKSI7CisjZWxzZQorI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKQorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCB0YzU4OV9jb25maWcoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgdm9pZCB0YzU4OV9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIGludCB0YzU4OV9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCSAgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpOworCitzdGF0aWMgdTE2IHJlYWRfZWVwcm9tKGtpb19hZGRyX3QgaW9hZGRyLCBpbnQgaW5kZXgpOworc3RhdGljIHZvaWQgdGM1ODlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBtZWRpYV9jaGVjayh1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IGVsM19jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApOworc3RhdGljIGludCBlbDNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZWwzX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgZWwzX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZWwzX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZWwzX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBlbDNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlbDNfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOworCitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICIzYzU4OV9jcyI7CisKK3N0YXRpYyBkZXZfbGlua190ICp0YzU4OV9hdHRhY2godm9pZCk7CitzdGF0aWMgdm9pZCB0YzU4OV9kZXRhY2goZGV2X2xpbmtfdCAqKTsKKworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIHRjNTg5X2F0dGFjaCgpIGNyZWF0ZXMgYW4gImluc3RhbmNlIiBvZiB0aGUgZHJpdmVyLCBhbGxvY2F0aW5nCisgICAgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBvbmUgZGV2aWNlLiAgVGhlIGRldmljZSBpcyByZWdpc3RlcmVkCisgICAgd2l0aCBDYXJkIFNlcnZpY2VzLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGRldl9saW5rX3QgKnRjNTg5X2F0dGFjaCh2b2lkKQoreworICAgIHN0cnVjdCBlbDNfcHJpdmF0ZSAqbHA7CisgICAgY2xpZW50X3JlZ190IGNsaWVudF9yZWc7CisgICAgZGV2X2xpbmtfdCAqbGluazsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgIGludCByZXQ7CisKKyAgICBERUJVRygwLCAiM2M1ODlfYXR0YWNoKClcbiIpOworICAgIAorICAgIC8qIENyZWF0ZSBuZXcgZXRoZXJuZXQgZGV2aWNlICovCisgICAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBlbDNfcHJpdmF0ZSkpOworICAgIGlmICghZGV2KQorCSByZXR1cm4gTlVMTDsKKyAgICBscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgbGluayA9ICZscC0+bGluazsKKyAgICBsaW5rLT5wcml2ID0gZGV2OworCisgICAgc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKyAgICBsaW5rLT5pby5OdW1Qb3J0czEgPSAxNjsKKyAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF8xNjsKKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKKyAgICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisgICAgbGluay0+aXJxLkhhbmRsZXIgPSAmZWwzX2ludGVycnVwdDsKKyAgICBsaW5rLT5pcnEuSW5zdGFuY2UgPSBkZXY7CisgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROworICAgIGxpbmstPmNvbmYuVmNjID0gNTA7CisgICAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IDE7CisgICAgbGluay0+Y29uZi5QcmVzZW50ID0gUFJFU0VOVF9PUFRJT047CisgICAgCisgICAgLyogVGhlIEVMMy1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZlbDNfc3RhcnRfeG1pdDsKKyAgICBkZXYtPnNldF9jb25maWcgPSAmZWwzX2NvbmZpZzsKKyAgICBkZXYtPmdldF9zdGF0cyA9ICZlbDNfZ2V0X3N0YXRzOworICAgIGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9tdWx0aWNhc3RfbGlzdDsKKyAgICBkZXYtPm9wZW4gPSAmZWwzX29wZW47CisgICAgZGV2LT5zdG9wID0gJmVsM19jbG9zZTsKKyNpZmRlZiBIQVZFX1RYX1RJTUVPVVQKKyAgICBkZXYtPnR4X3RpbWVvdXQgPSBlbDNfdHhfdGltZW91dDsKKyAgICBkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKyNlbmRpZgorICAgIFNFVF9FVEhUT09MX09QUyhkZXYsICZuZXRkZXZfZXRodG9vbF9vcHMpOworCisgICAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgbGluay0+bmV4dCA9IGRldl9saXN0OworICAgIGRldl9saXN0ID0gbGluazsKKyAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KKwlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKwlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZ0YzU4OV9ldmVudDsKKyAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKyAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworCXRjNTg5X2RldGFjaChsaW5rKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIGxpbms7Cit9IC8qIHRjNTg5X2F0dGFjaCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkCisgICAgd2l0aCBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCisgICAgc3RydWN0dXJlcyBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQKKyAgICB3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCB0YzU4OV9kZXRhY2goZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBkZXZfbGlua190ICoqbGlua3A7CisgICAgCisgICAgREVCVUcoMCwgIjNjNTg5X2RldGFjaCgweCVwKVxuIiwgbGluayk7CisgICAgCisgICAgLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKyAgICBmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorCWlmICgqbGlua3AgPT0gbGluaykgYnJlYWs7CisgICAgaWYgKCpsaW5rcCA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGlmIChsaW5rLT5kZXYpCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJdGM1ODlfcmVsZWFzZShsaW5rKTsKKyAgICAKKyAgICBpZiAobGluay0+aGFuZGxlKQorCXBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworICAgIAorICAgIC8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIGJpdHMgKi8KKyAgICAqbGlua3AgPSBsaW5rLT5uZXh0OworICAgIGZyZWVfbmV0ZGV2KGRldik7Cit9IC8qIHRjNTg5X2RldGFjaCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIHRjNTg5X2NvbmZpZygpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudAorICAgIGlzIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZQorICAgIGV0aGVybmV0IGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKyAgICAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKK2RvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIHRjNTg5X2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICBjaXNwYXJzZV90IHBhcnNlOworICAgIHUxNiBidWZbMzJdLCAqcGh5c19hZGRyOworICAgIGludCBsYXN0X2ZuLCBsYXN0X3JldCwgaSwgaiwgbXVsdGkgPSAwLCBmaWZvOworICAgIGtpb19hZGRyX3QgaW9hZGRyOworICAgIGNoYXIgKnJhbV9zcGxpdFtdID0geyI1OjMiLCAiMzoxIiwgIjE6MSIsICIzOjUifTsKKyAgICAKKyAgICBERUJVRygwLCAiM2M1ODlfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKKworICAgIHBoeXNfYWRkciA9ICh1MTYgKilkZXYtPmRldl9hZGRyOworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICAgIHR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CisgICAgCisgICAgLyogSXMgdGhpcyBhIDNjNTYyPyAqLworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9NQU5GSUQ7CisgICAgdHVwbGUuQXR0cmlidXRlcyA9IFRVUExFX1JFVFVSTl9DT01NT047CisgICAgaWYgKChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSA9PSBDU19TVUNDRVNTKSAmJgorCShwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpID09IENTX1NVQ0NFU1MpKSB7CisJaWYgKGxlMTZfdG9fY3B1KGJ1ZlswXSkgIT0gTUFORklEXzNDT00pCisJICAgIHByaW50ayhLRVJOX0lORk8gIjNjNTg5X2NzOiBobW1tLCBpcyB0aGlzIHJlYWxseSBhICIKKwkJICAgIjNDb20gY2FyZD8/XG4iKTsKKwltdWx0aSA9IChsZTE2X3RvX2NwdShidWZbMV0pID09IFBST0RJRF8zQ09NXzNDNTYyKTsKKyAgICB9CisgICAgCisgICAgLyogQ29uZmlndXJlIGNhcmQgKi8KKyAgICBsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworCisgICAgLyogRm9yIHRoZSAzYzU2MiwgdGhlIGJhc2UgYWRkcmVzcyBtdXN0IGJlIHh4MDAteHg3ZiAqLworICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gMTY7CisgICAgZm9yIChpID0gaiA9IDA7IGogPCAweDQwMDsgaiArPSAweDEwKSB7CisJaWYgKG11bHRpICYmIChqICYgMHg4MCkpIGNvbnRpbnVlOworCWxpbmstPmlvLkJhc2VQb3J0MSA9IGogXiAweDMwMDsKKwlpID0gcGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCWlmIChpID09IENTX1NVQ0NFU1MpIGJyZWFrOworICAgIH0KKyAgICBpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0SU8sIGkpOworCWdvdG8gZmFpbGVkOworICAgIH0KKyAgICBDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKSk7CisgICAgQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZikpOworCQorICAgIGRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworICAgIGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworICAgIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIEVMM1dJTkRPVygwKTsKKworICAgIC8qIFRoZSAzYzU4OSBoYXMgYW4gZXh0cmEgRUVQUk9NIGZvciBjb25maWd1cmF0aW9uIGluZm8sIGluY2x1ZGluZworICAgICAgIHRoZSBoYXJkd2FyZSBhZGRyZXNzLiAgVGhlIDNjNTYyIHB1dHMgdGhlIGFkZHJlc3MgaW4gdGhlIENJUy4gKi8KKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSAweDg4OworICAgIGlmIChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSA9PSBDU19TVUNDRVNTKSB7CisJcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCSAgICBwaHlzX2FkZHJbaV0gPSBodG9ucyhidWZbaV0pOworICAgIH0gZWxzZSB7CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkgICAgcGh5c19hZGRyW2ldID0gaHRvbnMocmVhZF9lZXByb20oaW9hZGRyLCBpKSk7CisJaWYgKHBoeXNfYWRkclswXSA9PSAweDYwNjApIHsKKwkgICAgcHJpbnRrKEtFUk5fRVJSICIzYzU4OV9jczogSU8gcG9ydCBjb25mbGljdCBhdCAweCUwM2x4IgorCQkgICAiLTB4JTAzbHhcbiIsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmJhc2VfYWRkcisxNSk7CisJICAgIGdvdG8gZmFpbGVkOworCX0KKyAgICB9CisKKyAgICAvKiBUaGUgYWRkcmVzcyBhbmQgcmVzb3VyY2UgY29uZmlndXJhdGlvbiByZWdpc3RlciBhcmVuJ3QgbG9hZGVkIGZyb20KKyAgICAgICB0aGUgRUVQUk9NIGFuZCAqbXVzdCogYmUgc2V0IHRvIDAgYW5kIElSUTMgZm9yIHRoZSBQQ01DSUEgdmVyc2lvbi4gKi8KKyAgICBvdXR3KDB4M2YwMCwgaW9hZGRyICsgOCk7CisgICAgZmlmbyA9IGlubChpb2FkZHIpOworCisgICAgLyogVGhlIGlmX3BvcnQgc3ltYm9sIGNhbiBiZSBzZXQgd2hlbiB0aGUgbW9kdWxlIGlzIGxvYWRlZCAqLworICAgIGlmICgoaWZfcG9ydCA+PSAwKSAmJiAoaWZfcG9ydCA8PSAzKSkKKwlkZXYtPmlmX3BvcnQgPSBpZl9wb3J0OworICAgIGVsc2UKKwlwcmludGsoS0VSTl9FUlIgIjNjNTg5X2NzOiBpbnZhbGlkIGlmX3BvcnQgcmVxdWVzdGVkXG4iKTsKKyAgICAKKyAgICBsaW5rLT5kZXYgPSAmbHAtPm5vZGU7CisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKyAgICBTRVRfTkVUREVWX0RFVihkZXYsICZoYW5kbGVfdG9fZGV2KGhhbmRsZSkpOworCisgICAgaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpICE9IDApIHsKKwlwcmludGsoS0VSTl9FUlIgIjNjNTg5X2NzOiByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWRcbiIpOworCWxpbmstPmRldiA9IE5VTEw7CisJZ290byBmYWlsZWQ7CisgICAgfQorCisgICAgc3RyY3B5KGxwLT5ub2RlLmRldl9uYW1lLCBkZXYtPm5hbWUpOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IDNDb20gM2MlcywgaW8gJSMzbHgsIGlycSAlZCwgaHdfYWRkciAiLAorCSAgIGRldi0+bmFtZSwgKG11bHRpID8gIjU2MiIgOiAiNTg5IiksIGRldi0+YmFzZV9hZGRyLAorCSAgIGRldi0+aXJxKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXByaW50aygiJTAyWCVzIiwgZGV2LT5kZXZfYWRkcltpXSwgKChpPDUpID8gIjoiIDogIlxuIikpOworICAgIHByaW50ayhLRVJOX0lORk8gIiAgJWRLIEZJRk8gc3BsaXQgJXMgUng6VHgsICVzIHhjdnJcbiIsCisJICAgKGZpZm8gJiA3KSA/IDMyIDogOCwgcmFtX3NwbGl0WyhmaWZvID4+IDE2KSAmIDNdLAorCSAgIGlmX25hbWVzW2Rldi0+aWZfcG9ydF0pOworICAgIHJldHVybjsKKworY3NfZmFpbGVkOgorICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworZmFpbGVkOgorICAgIHRjNTg5X3JlbGVhc2UobGluayk7CisgICAgcmV0dXJuOworICAgIAorfSAvKiB0YzU4OV9jb25maWcgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgdGM1ODlfcmVsZWFzZSgpIHdpbGwgdW5yZWdpc3RlciB0aGUgbmV0CisgICAgZGV2aWNlLCBhbmQgcmVsZWFzZSB0aGUgUENNQ0lBIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgZGV2aWNlIGlzCisgICAgc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCisgICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgdGM1ODlfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworICAgIERFQlVHKDAsICIzYzU4OV9yZWxlYXNlKDB4JXApXG4iLCBsaW5rKTsKKyAgICAKKyAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisgICAgcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworICAgIHBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworICAgIAorICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiAgTW9zdGx5LCB0aGlzIHNjaGVkdWxlcyBvdGhlcgorICAgIHN0dWZmIHRvIHJ1biBhZnRlciBhbiBldmVudCBpcyByZWNlaXZlZC4gIEEgQ0FSRF9SRU1PVkFMIGV2ZW50CisgICAgYWxzbyBzZXRzIHNvbWUgZmxhZ3MgdG8gZGlzY291cmFnZSB0aGUgbmV0IGRyaXZlcnMgZnJvbSB0cnlpbmcKKyAgICB0byB0YWxrIHRvIHRoZSBjYXJkIGFueSBtb3JlLgorICAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgdGM1ODlfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkgICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworICAgIGRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICAKKyAgICBERUJVRygxLCAiM2M1ODlfZXZlbnQoMHglMDZ4KVxuIiwgZXZlbnQpOworICAgIAorICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX1BSRVNFTlQ7CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkgICAgbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJdGM1ODlfY29uZmlnKGxpbmspOworCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwlsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkgICAgaWYgKGxpbmstPm9wZW4pCisJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwkgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCX0KKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisJLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkgICAgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKwkgICAgaWYgKGxpbmstPm9wZW4pIHsKKwkJdGM1ODlfcmVzZXQoZGV2KTsKKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCSAgICB9CisJfQorCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30gLyogdGM1ODlfZXZlbnQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgIFVzZSB0aGlzIGZvciBjb21tYW5kcyB0aGF0IG1heSB0YWtlIHRpbWUgdG8gZmluaXNoCisqLworc3RhdGljIHZvaWQgdGM1ODlfd2FpdF9mb3JfY29tcGxldGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY21kKQoreworICAgIGludCBpID0gMTAwOworICAgIG91dHcoY21kLCBkZXYtPmJhc2VfYWRkciArIEVMM19DTUQpOworICAgIHdoaWxlICgtLWkgPiAwKQorCWlmICghKGludyhkZXYtPmJhc2VfYWRkciArIEVMM19TVEFUVVMpICYgMHgxMDAwKSkgYnJlYWs7CisgICAgaWYgKGkgPT0gMCkKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY29tbWFuZCAweCUwNHggZGlkIG5vdCBjb21wbGV0ZSFcbiIsCisJICAgICAgIGRldi0+bmFtZSwgY21kKTsKK30KKworLyoKKyAgUmVhZCBhIHdvcmQgZnJvbSB0aGUgRUVQUk9NIHVzaW5nIHRoZSByZWd1bGFyIEVFUFJPTSBhY2Nlc3MgcmVnaXN0ZXIuCisgIEFzc3VtZSB0aGF0IHdlIGFyZSBpbiByZWdpc3RlciB3aW5kb3cgemVyby4KKyovCitzdGF0aWMgdTE2IHJlYWRfZWVwcm9tKGtpb19hZGRyX3QgaW9hZGRyLCBpbnQgaW5kZXgpCit7CisgICAgaW50IGk7CisgICAgb3V0dyhFRVBST01fUkVBRCArIGluZGV4LCBpb2FkZHIgKyAxMCk7CisgICAgLyogUmVhZGluZyB0aGUgZWVwcm9tIHRha2VzIDE2MiB1cyAqLworICAgIGZvciAoaSA9IDE2MjA7IGkgPj0gMDsgaS0tKQorCWlmICgoaW53KGlvYWRkciArIDEwKSAmIEVFUFJPTV9CVVNZKSA9PSAwKQorCSAgICBicmVhazsKKyAgICByZXR1cm4gaW53KGlvYWRkciArIDEyKTsKK30KKworLyoKKyAgU2V0IHRyYW5zY2VpdmVyIHR5cGUsIHBlcmhhcHMgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gd2hhdCB0aGUgdXNlcgorICBzcGVjaWZpZWQgaW4gZGV2LT5pZl9wb3J0LgorKi8KK3N0YXRpYyB2b2lkIHRjNTg5X3NldF94Y3ZyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpZl9wb3J0KQoreworICAgIHN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgCisgICAgRUwzV0lORE9XKDApOworICAgIHN3aXRjaCAoaWZfcG9ydCkgeworICAgIGNhc2UgMDogY2FzZSAxOiBvdXR3KDAsIGlvYWRkciArIDYpOyBicmVhazsKKyAgICBjYXNlIDI6IG91dHcoMzw8MTQsIGlvYWRkciArIDYpOyBicmVhazsKKyAgICBjYXNlIDM6IG91dHcoMTw8MTQsIGlvYWRkciArIDYpOyBicmVhazsKKyAgICB9CisgICAgLyogT24gUENNQ0lBLCB0aGlzIGp1c3QgdHVybnMgb24gdGhlIExFRCAqLworICAgIG91dHcoKGlmX3BvcnQgPT0gMikgPyBTdGFydENvYXggOiBTdG9wQ29heCwgaW9hZGRyICsgRUwzX0NNRCk7CisgICAgLyogMTBiYXNlVCBpbnRlcmZhY2UsIGVuYWJsZSBsaW5rIGJlYXQgYW5kIGphYmJlciBjaGVjay4gKi8KKyAgICBFTDNXSU5ET1coNCk7CisgICAgb3V0dyhNRURJQV9MRUQgfCAoKGlmX3BvcnQgPCAyKSA/IE1FRElBX1RQIDogMCksIGlvYWRkciArIFdONF9NRURJQSk7CisgICAgRUwzV0lORE9XKDEpOworICAgIGlmIChpZl9wb3J0ID09IDIpCisJbHAtPm1lZGlhX3N0YXR1cyA9ICgoZGV2LT5pZl9wb3J0ID09IDApID8gMHg4MDAwIDogMHg0MDAwKTsKKyAgICBlbHNlCisJbHAtPm1lZGlhX3N0YXR1cyA9ICgoZGV2LT5pZl9wb3J0ID09IDApID8gMHg0MDEwIDogMHg4ODAwKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIEVMM1dJTkRPVygxKTsKKyAgICBwcmludGsoS0VSTl9JTkZPICIgIGlycSBzdGF0dXMgJTA0eCwgcnggc3RhdHVzICUwNHgsIHR4IHN0YXR1cyAiCisJICAgIiUwMnggIHR4IGZyZWUgJTA0eFxuIiwgaW53KGlvYWRkcitFTDNfU1RBVFVTKSwKKwkgICBpbncoaW9hZGRyK1JYX1NUQVRVUyksIGluYihpb2FkZHIrVFhfU1RBVFVTKSwKKwkgICBpbncoaW9hZGRyK1RYX0ZSRUUpKTsKKyAgICBFTDNXSU5ET1coNCk7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAiICBkaWFnbm9zdGljczogZmlmbyAlMDR4IG5ldCAlMDR4IGV0aGVybmV0ICUwNHgiCisJICAgIiBtZWRpYSAlMDR4XG4iLCBpbncoaW9hZGRyKzB4MDQpLCBpbncoaW9hZGRyKzB4MDYpLAorCSAgIGludyhpb2FkZHIrMHgwOCksIGludyhpb2FkZHIrMHgwYSkpOworICAgIEVMM1dJTkRPVygxKTsKK30KKworLyogUmVzZXQgYW5kIHJlc3RvcmUgYWxsIG9mIHRoZSAzYzU4OSByZWdpc3RlcnMuICovCitzdGF0aWMgdm9pZCB0YzU4OV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGk7CisgICAgCisgICAgRUwzV0lORE9XKDApOworICAgIG91dHcoMHgwMDAxLCBpb2FkZHIgKyA0KTsJCQkvKiBBY3RpdmF0ZSBib2FyZC4gKi8gCisgICAgb3V0dygweDNmMDAsIGlvYWRkciArIDgpOwkJCS8qIFNldCB0aGUgSVJRIGxpbmUuICovCisgICAgCisgICAgLyogU2V0IHRoZSBzdGF0aW9uIGFkZHJlc3MgaW4gd2luZG93IDIuICovCisgICAgRUwzV0lORE9XKDIpOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJb3V0YihkZXYtPmRldl9hZGRyW2ldLCBpb2FkZHIgKyBpKTsKKworICAgIHRjNTg5X3NldF94Y3ZyKGRldiwgZGV2LT5pZl9wb3J0KTsKKyAgICAKKyAgICAvKiBTd2l0Y2ggdG8gdGhlIHN0YXRzIHdpbmRvdywgYW5kIGNsZWFyIGFsbCBzdGF0cyBieSByZWFkaW5nLiAqLworICAgIG91dHcoU3RhdHNEaXNhYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKyAgICBFTDNXSU5ET1coNik7CisgICAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykKKwlpbmIoaW9hZGRyK2kpOworICAgIGludyhpb2FkZHIgKyAxMCk7CisgICAgaW53KGlvYWRkciArIDEyKTsKKyAgICAKKyAgICAvKiBTd2l0Y2ggdG8gcmVnaXN0ZXIgc2V0IDEgZm9yIG5vcm1hbCB1c2UuICovCisgICAgRUwzV0lORE9XKDEpOworCisgICAgLyogQWNjZXB0IGItY2FzdCBhbmQgcGh5cyBhZGRyIG9ubHkuICovCisgICAgb3V0dyhTZXRSeEZpbHRlciB8IFJ4U3RhdGlvbiB8IFJ4QnJvYWRjYXN0LCBpb2FkZHIgKyBFTDNfQ01EKTsKKyAgICBvdXR3KFN0YXRzRW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsgLyogVHVybiBvbiBzdGF0aXN0aWNzLiAqLworICAgIG91dHcoUnhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOyAvKiBFbmFibGUgdGhlIHJlY2VpdmVyLiAqLworICAgIG91dHcoVHhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOyAvKiBFbmFibGUgdHJhbnNtaXR0ZXIuICovCisgICAgLyogQWxsb3cgc3RhdHVzIGJpdHMgdG8gYmUgc2Vlbi4gKi8KKyAgICBvdXR3KFNldFN0YXR1c0VuYiB8IDB4ZmYsIGlvYWRkciArIEVMM19DTUQpOworICAgIC8qIEFjayBhbGwgcGVuZGluZyBldmVudHMsIGFuZCBzZXQgYWN0aXZlIGluZGljYXRvciBtYXNrLiAqLworICAgIG91dHcoQWNrSW50ciB8IEludExhdGNoIHwgVHhBdmFpbGFibGUgfCBSeEVhcmx5IHwgSW50UmVxLAorCSBpb2FkZHIgKyBFTDNfQ01EKTsKKyAgICBvdXR3KFNldEludHJFbmIgfCBJbnRMYXRjaCB8IFR4QXZhaWxhYmxlIHwgUnhDb21wbGV0ZSB8IFN0YXRzRnVsbAorCSB8IEFkYXB0ZXJGYWlsdXJlLCBpb2FkZHIgKyBFTDNfQ01EKTsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzcHJpbnRmKGluZm8tPmJ1c19pbmZvLCAiUENNQ0lBIDB4JWx4IiwgZGV2LT5iYXNlX2FkZHIpOworfQorCisjaWZkZWYgUENNQ0lBX0RFQlVHCitzdGF0aWMgdTMyIG5ldGRldl9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gcGNfZGVidWc7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGxldmVsKQoreworCXBjX2RlYnVnID0gbGV2ZWw7Cit9CisjZW5kaWYgLyogUENNQ0lBX0RFQlVHICovCisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBuZXRkZXZfZ2V0X2RydmluZm8sCisjaWZkZWYgUENNQ0lBX0RFQlVHCisJLmdldF9tc2dsZXZlbAkJPSBuZXRkZXZfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gbmV0ZGV2X3NldF9tc2dsZXZlbCwKKyNlbmRpZiAvKiBQQ01DSUFfREVCVUcgKi8KK307CisKK3N0YXRpYyBpbnQgZWwzX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCkKK3sKKyAgICBpZiAoKG1hcC0+cG9ydCAhPSAodV9jaGFyKSgtMSkpICYmIChtYXAtPnBvcnQgIT0gZGV2LT5pZl9wb3J0KSkgeworCWlmIChtYXAtPnBvcnQgPD0gMykgeworCSAgICBkZXYtPmlmX3BvcnQgPSBtYXAtPnBvcnQ7CisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBzd2l0Y2hlZCB0byAlcyBwb3J0XG4iLAorCQkgICBkZXYtPm5hbWUsIGlmX25hbWVzW2Rldi0+aWZfcG9ydF0pOworCSAgICB0YzU4OV9zZXRfeGN2cihkZXYsIGRldi0+aWZfcG9ydCk7CisJfSBlbHNlCisJICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbDNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGRldl9saW5rX3QgKmxpbmsgPSAmbHAtPmxpbms7CisgICAgCisgICAgaWYgKCFERVZfT0sobGluaykpCisJcmV0dXJuIC1FTk9ERVY7CisKKyAgICBsaW5rLT5vcGVuKys7CisgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyAgICAKKyAgICB0YzU4OV9yZXNldChkZXYpOworICAgIGluaXRfdGltZXIoJmxwLT5tZWRpYSk7CisgICAgbHAtPm1lZGlhLmZ1bmN0aW9uID0gJm1lZGlhX2NoZWNrOworICAgIGxwLT5tZWRpYS5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKyAgICBscC0+bWVkaWEuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKyAgICBhZGRfdGltZXIoJmxwLT5tZWRpYSk7CisKKyAgICBERUJVRygxLCAiJXM6IG9wZW5lZCwgc3RhdHVzICU0LjR4LlxuIiwKKwkgIGRldi0+bmFtZSwgaW53KGRldi0+YmFzZV9hZGRyICsgRUwzX1NUQVRVUykpOworICAgIAorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbDNfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgCisgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRyYW5zbWl0IHRpbWVkIG91dCFcbiIsIGRldi0+bmFtZSk7CisgICAgZHVtcF9zdGF0dXMoZGV2KTsKKyAgICBscC0+c3RhdHMudHhfZXJyb3JzKys7CisgICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisgICAgLyogSXNzdWUgVFhfUkVTRVQgYW5kIFRYX1NUQVJUIGNvbW1hbmRzLiAqLworICAgIHRjNTg5X3dhaXRfZm9yX2NvbXBsZXRpb24oZGV2LCBUeFJlc2V0KTsKKyAgICBvdXR3KFR4RW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKyAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIHBvcF90eF9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBpOworICAgIAorICAgIC8qIENsZWFyIHRoZSBUeCBzdGF0dXMgc3RhY2suICovCisgICAgZm9yIChpID0gMzI7IGkgPiAwOyBpLS0pIHsKKwl1X2NoYXIgdHhfc3RhdHVzID0gaW5iKGlvYWRkciArIFRYX1NUQVRVUyk7CisJaWYgKCEodHhfc3RhdHVzICYgMHg4NCkpIGJyZWFrOworCS8qIHJlc2V0IHRyYW5zbWl0dGVyIG9uIGphYmJlciBlcnJvciBvciB1bmRlcnJ1biAqLworCWlmICh0eF9zdGF0dXMgJiAweDMwKQorCSAgICB0YzU4OV93YWl0X2Zvcl9jb21wbGV0aW9uKGRldiwgVHhSZXNldCk7CisJaWYgKHR4X3N0YXR1cyAmIDB4MzgpIHsKKwkgICAgREVCVUcoMSwgIiVzOiB0cmFuc21pdCBlcnJvcjogc3RhdHVzIDB4JTAyeFxuIiwKKwkJICBkZXYtPm5hbWUsIHR4X3N0YXR1cyk7CisJICAgIG91dHcoVHhFbmFibGUsIGlvYWRkciArIEVMM19DTUQpOworCSAgICBscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwl9CisJb3V0YigweDAwLCBpb2FkZHIgKyBUWF9TVEFUVVMpOyAvKiBQb3AgdGhlIHN0YXR1cyBzdGFjay4gKi8KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZWwzX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHN0cnVjdCBlbDNfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICBERUJVRygzLCAiJXM6IGVsM19zdGFydF94bWl0KGxlbmd0aCA9ICVsZCkgY2FsbGVkLCAiCisJICAic3RhdHVzICU0LjR4LlxuIiwgZGV2LT5uYW1lLCAobG9uZylza2ItPmxlbiwKKwkgIGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSk7CisKKyAgICBwcml2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworICAgIC8qIFB1dCBvdXQgdGhlIGRvdWJsZXdvcmQgaGVhZGVyLi4uICovCisgICAgb3V0dyhza2ItPmxlbiwgaW9hZGRyICsgVFhfRklGTyk7CisgICAgb3V0dygweDAwLCBpb2FkZHIgKyBUWF9GSUZPKTsKKyAgICAvKiAuLi4gYW5kIHRoZSBwYWNrZXQgcm91bmRlZCB0byBhIGRvdWJsZXdvcmQuICovCisgICAgb3V0c2woaW9hZGRyICsgVFhfRklGTywgc2tiLT5kYXRhLCAoc2tiLT5sZW4gKyAzKSA+PiAyKTsKKworICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworICAgIGlmIChpbncoaW9hZGRyICsgVFhfRlJFRSkgPD0gMTUzNikgeworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkvKiBJbnRlcnJ1cHQgdXMgd2hlbiB0aGUgRklGTyBoYXMgcm9vbSBmb3IgbWF4LXNpemVkIHBhY2tldC4gKi8KKwlvdXR3KFNldFR4VGhyZXNob2xkICsgMTUzNiwgaW9hZGRyICsgRUwzX0NNRCk7CisgICAgfQorCisgICAgZGV2X2tmcmVlX3NrYihza2IpOworICAgIHBvcF90eF9zdGF0dXMoZGV2KTsKKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworLyogVGhlIEVMMyBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBlbDNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisgICAgc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHI7CisgICAgX191MTYgc3RhdHVzOworICAgIGludCBpID0gMCwgaGFuZGxlZCA9IDE7CisgICAgCisgICAgaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCXJldHVybiBJUlFfTk9ORTsKKworICAgIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgICAgREVCVUcoMywgIiVzOiBpbnRlcnJ1cHQsIHN0YXR1cyAlNC40eC5cbiIsCisJICBkZXYtPm5hbWUsIGludyhpb2FkZHIgKyBFTDNfU1RBVFVTKSk7CisKKyAgICBzcGluX2xvY2soJmxwLT5sb2NrKTsgICAgCisgICAgd2hpbGUgKChzdGF0dXMgPSBpbncoaW9hZGRyICsgRUwzX1NUQVRVUykpICYKKwkoSW50TGF0Y2ggfCBSeENvbXBsZXRlIHwgU3RhdHNGdWxsKSkgeworCWlmICgoc3RhdHVzICYgMHhlMDAwKSAhPSAweDIwMDApIHsKKwkgICAgREVCVUcoMSwgIiVzOiBpbnRlcnJ1cHQgZnJvbSBkZWFkIGNhcmRcbiIsIGRldi0+bmFtZSk7CisJICAgIGhhbmRsZWQgPSAwOworCSAgICBicmVhazsKKwl9CisJCisJaWYgKHN0YXR1cyAmIFJ4Q29tcGxldGUpCisJICAgIGVsM19yeChkZXYpOworCQorCWlmIChzdGF0dXMgJiBUeEF2YWlsYWJsZSkgeworCSAgICBERUJVRygzLCAiICAgIFRYIHJvb20gYml0IHdhcyBoYW5kbGVkLlxuIik7CisJICAgIC8qIFRoZXJlJ3Mgcm9vbSBpbiB0aGUgRklGTyBmb3IgYSBmdWxsLXNpemVkIHBhY2tldC4gKi8KKwkgICAgb3V0dyhBY2tJbnRyIHwgVHhBdmFpbGFibGUsIGlvYWRkciArIEVMM19DTUQpOworCSAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCQorCWlmIChzdGF0dXMgJiBUeENvbXBsZXRlKQorCSAgICBwb3BfdHhfc3RhdHVzKGRldik7CisKKwlpZiAoc3RhdHVzICYgKEFkYXB0ZXJGYWlsdXJlIHwgUnhFYXJseSB8IFN0YXRzRnVsbCkpIHsKKwkgICAgLyogSGFuZGxlIGFsbCB1bmNvbW1vbiBpbnRlcnJ1cHRzLiAqLworCSAgICBpZiAoc3RhdHVzICYgU3RhdHNGdWxsKQkJLyogRW1wdHkgc3RhdGlzdGljcy4gKi8KKwkJdXBkYXRlX3N0YXRzKGRldik7CisJICAgIGlmIChzdGF0dXMgJiBSeEVhcmx5KSB7CQkvKiBSeCBlYXJseSBpcyB1bnVzZWQuICovCisJCWVsM19yeChkZXYpOworCQlvdXR3KEFja0ludHIgfCBSeEVhcmx5LCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkgICAgfQorCSAgICBpZiAoc3RhdHVzICYgQWRhcHRlckZhaWx1cmUpIHsKKwkJdTE2IGZpZm9fZGlhZzsKKwkJRUwzV0lORE9XKDQpOworCQlmaWZvX2RpYWcgPSBpbncoaW9hZGRyICsgNCk7CisJCUVMM1dJTkRPVygxKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGFkYXB0ZXIgZmFpbHVyZSwgRklGTyBkaWFnbm9zdGljIgorCQkgICAgICAgIiByZWdpc3RlciAlMDR4LlxuIiwgZGV2LT5uYW1lLCBmaWZvX2RpYWcpOworCQlpZiAoZmlmb19kaWFnICYgMHgwNDAwKSB7CisJCSAgICAvKiBUeCBvdmVycnVuICovCisJCSAgICB0YzU4OV93YWl0X2Zvcl9jb21wbGV0aW9uKGRldiwgVHhSZXNldCk7CisJCSAgICBvdXR3KFR4RW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJfQorCQlpZiAoZmlmb19kaWFnICYgMHgyMDAwKSB7CisJCSAgICAvKiBSeCB1bmRlcnJ1biAqLworCQkgICAgdGM1ODlfd2FpdF9mb3JfY29tcGxldGlvbihkZXYsIFJ4UmVzZXQpOworCQkgICAgc2V0X211bHRpY2FzdF9saXN0KGRldik7CisJCSAgICBvdXR3KFJ4RW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkJfQorCQlvdXR3KEFja0ludHIgfCBBZGFwdGVyRmFpbHVyZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJICAgIH0KKwl9CisJCisJaWYgKCsraSA+IDEwKSB7CisJICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IGluZmluaXRlIGxvb3AgaW4gaW50ZXJydXB0LCAiCisJCSAgICJzdGF0dXMgJTQuNHguXG4iLCBkZXYtPm5hbWUsIHN0YXR1cyk7CisJICAgIC8qIENsZWFyIGFsbCBpbnRlcnJ1cHRzICovCisJICAgIG91dHcoQWNrSW50ciB8IDB4RkYsIGlvYWRkciArIEVMM19DTUQpOworCSAgICBicmVhazsKKwl9CisJLyogQWNrbm93bGVkZ2UgdGhlIElSUS4gKi8KKwlvdXR3KEFja0ludHIgfCBJbnRSZXEgfCBJbnRMYXRjaCwgaW9hZGRyICsgRUwzX0NNRCk7CisgICAgfQorCisgICAgbHAtPmxhc3RfaXJxID0gamlmZmllczsKKyAgICBzcGluX3VubG9jaygmbHAtPmxvY2spOyAgICAKKyAgICBERUJVRygzLCAiJXM6IGV4aXRpbmcgaW50ZXJydXB0LCBzdGF0dXMgJTQuNHguXG4iLAorCSAgZGV2LT5uYW1lLCBpbncoaW9hZGRyICsgRUwzX1NUQVRVUykpOworICAgIHJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgdm9pZCBtZWRpYV9jaGVjayh1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopKGFyZyk7CisgICAgc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB1MTYgbWVkaWEsIGVycnM7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIGlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkgZ290byByZXNjaGVkdWxlOworCisgICAgRUwzV0lORE9XKDEpOworICAgIC8qIENoZWNrIGZvciBwZW5kaW5nIGludGVycnVwdCB3aXRoIGV4cGlyZWQgbGF0ZW5jeSB0aW1lcjogd2l0aAorICAgICAgIHRoaXMsIHdlIGNhbiBsaW1wIGFsb25nIGV2ZW4gaWYgdGhlIGludGVycnVwdCBpcyBibG9ja2VkICovCisgICAgaWYgKChpbncoaW9hZGRyICsgRUwzX1NUQVRVUykgJiBJbnRMYXRjaCkgJiYKKwkoaW5iKGlvYWRkciArIEVMM19USU1FUikgPT0gMHhmZikpIHsKKwlpZiAoIWxwLT5mYXN0X3BvbGwpCisJICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpbnRlcnJ1cHQocykgZHJvcHBlZCFcbiIsIGRldi0+bmFtZSk7CisJZWwzX2ludGVycnVwdChkZXYtPmlycSwgbHAsIE5VTEwpOworCWxwLT5mYXN0X3BvbGwgPSBIWjsKKyAgICB9CisgICAgaWYgKGxwLT5mYXN0X3BvbGwpIHsKKwlscC0+ZmFzdF9wb2xsLS07CisJbHAtPm1lZGlhLmV4cGlyZXMgPSBqaWZmaWVzICsgSFovMTAwOworCWFkZF90aW1lcigmbHAtPm1lZGlhKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogbHAtPmxvY2sgZ3VhcmRzIHRoZSBFTDMgd2luZG93LiBXaW5kb3cgc2hvdWxkIGFsd2F5cyBiZSAxIGV4Y2VwdAorICAgICAgIHdoZW4gdGhlIGxvY2sgaXMgaGVsZCAqLworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOyAgICAKKyAgICBFTDNXSU5ET1coNCk7CisgICAgbWVkaWEgPSBpbncoaW9hZGRyK1dONF9NRURJQSkgJiAweGM4MTA7CisKKyAgICAvKiBJZ25vcmUgY29sbGlzaW9ucyB1bmxlc3Mgd2UndmUgaGFkIG5vIGlycSdzIHJlY2VudGx5ICovCisgICAgaWYgKGppZmZpZXMgLSBscC0+bGFzdF9pcnEgPCBIWikgeworCW1lZGlhICY9IH4weDAwMTA7CisgICAgfSBlbHNlIHsKKwkvKiBUcnkgaGFyZGVyIHRvIGRldGVjdCBjYXJyaWVyIGVycm9ycyAqLworCUVMM1dJTkRPVyg2KTsKKwlvdXR3KFN0YXRzRGlzYWJsZSwgaW9hZGRyICsgRUwzX0NNRCk7CisJZXJycyA9IGluYihpb2FkZHIgKyAwKTsKKwlvdXR3KFN0YXRzRW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwlscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMgKz0gZXJyczsKKwlpZiAoZXJycyB8fCAobHAtPm1lZGlhX3N0YXR1cyAmIDB4MDAxMCkpIG1lZGlhIHw9IDB4MDAxMDsKKyAgICB9CisKKyAgICBpZiAobWVkaWEgIT0gbHAtPm1lZGlhX3N0YXR1cykgeworCWlmICgobWVkaWEgJiBscC0+bWVkaWFfc3RhdHVzICYgMHg4MDAwKSAmJgorCSAgICAoKGxwLT5tZWRpYV9zdGF0dXMgXiBtZWRpYSkgJiAweDA4MDApKQorCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogJXMgbGluayBiZWF0XG4iLCBkZXYtPm5hbWUsCisJCSAgIChscC0+bWVkaWFfc3RhdHVzICYgMHgwODAwID8gImxvc3QiIDogImZvdW5kIikpOworCWVsc2UgaWYgKChtZWRpYSAmIGxwLT5tZWRpYV9zdGF0dXMgJiAweDQwMDApICYmCisJCSAoKGxwLT5tZWRpYV9zdGF0dXMgXiBtZWRpYSkgJiAweDAwMTApKQorCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogY29heCBjYWJsZSAlc1xuIiwgZGV2LT5uYW1lLAorCQkgICAobHAtPm1lZGlhX3N0YXR1cyAmIDB4MDAxMCA/ICJvayIgOiAicHJvYmxlbSIpKTsKKwlpZiAoZGV2LT5pZl9wb3J0ID09IDApIHsKKwkgICAgaWYgKG1lZGlhICYgMHg4MDAwKSB7CisJCWlmIChtZWRpYSAmIDB4MDgwMCkKKwkJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBmbGlwcGVkIHRvIDEwYmFzZVRcbiIsCisJCQkgICBkZXYtPm5hbWUpOworCQllbHNlCisJCSAgICB0YzU4OV9zZXRfeGN2cihkZXYsIDIpOworCSAgICB9IGVsc2UgaWYgKG1lZGlhICYgMHg0MDAwKSB7CisJCWlmIChtZWRpYSAmIDB4MDAxMCkKKwkJICAgIHRjNTg5X3NldF94Y3ZyKGRldiwgMSk7CisJCWVsc2UKKwkJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBmbGlwcGVkIHRvIDEwYmFzZTJcbiIsCisJCQkgICBkZXYtPm5hbWUpOworCSAgICB9CisJfQorCWxwLT5tZWRpYV9zdGF0dXMgPSBtZWRpYTsKKyAgICB9CisgICAgCisgICAgRUwzV0lORE9XKDEpOworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7ICAgIAorCityZXNjaGVkdWxlOgorICAgIGxwLT5tZWRpYS5leHBpcmVzID0gamlmZmllcyArIEhaOworICAgIGFkZF90aW1lcigmbHAtPm1lZGlhKTsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICplbDNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBkZXZfbGlua190ICpsaW5rID0gJmxwLT5saW5rOworCisgICAgaWYgKERFVl9PSyhsaW5rKSkgeworICAgIAlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwl1cGRhdGVfc3RhdHMoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworICAgIH0KKyAgICByZXR1cm4gJmxwLT5zdGF0czsKK30KKworLyoKKyAgVXBkYXRlIHN0YXRpc3RpY3MuICBXZSBjaGFuZ2UgdG8gcmVnaXN0ZXIgd2luZG93IDYsIHNvIHRoaXMgc2hvdWxkIGJlIHJ1bgorICBzaW5nbGUtdGhyZWFkZWQgaWYgdGhlIGRldmljZSBpcyBhY3RpdmUuIFRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYSByYXJlCisgIG9wZXJhdGlvbiwgYW5kIGl0J3Mgc2ltcGxlciBmb3IgdGhlIHJlc3Qgb2YgdGhlIGRyaXZlciB0byBhc3N1bWUgdGhhdAorICB3aW5kb3cgMSBpcyBhbHdheXMgdmFsaWQgcmF0aGVyIHRoYW4gdXNlIGEgc3BlY2lhbCB3aW5kb3ctc3RhdGUgdmFyaWFibGUuCisgIAorICBDYWxsZXIgbXVzdCBob2xkIHRoZSBsb2NrIGZvciB0aGlzCisqLworc3RhdGljIHZvaWQgdXBkYXRlX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIERFQlVHKDIsICIlczogdXBkYXRpbmcgdGhlIHN0YXRpc3RpY3MuXG4iLCBkZXYtPm5hbWUpOworICAgIC8qIFR1cm4gb2ZmIHN0YXRpc3RpY3MgdXBkYXRlcyB3aGlsZSByZWFkaW5nLiAqLworICAgIG91dHcoU3RhdHNEaXNhYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKyAgICAvKiBTd2l0Y2ggdG8gdGhlIHN0YXRzIHdpbmRvdywgYW5kIHJlYWQgZXZlcnl0aGluZy4gKi8KKyAgICBFTDNXSU5ET1coNik7CisgICAgbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzIAkrPSBpbmIoaW9hZGRyICsgMCk7CisgICAgbHAtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMJKz0gaW5iKGlvYWRkciArIDEpOworICAgIC8qIE11bHRpcGxlIGNvbGxpc2lvbnMuICovCSAgIAlpbmIoaW9hZGRyICsgMik7CisgICAgbHAtPnN0YXRzLmNvbGxpc2lvbnMJCSs9IGluYihpb2FkZHIgKyAzKTsKKyAgICBscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycwkJKz0gaW5iKGlvYWRkciArIDQpOworICAgIGxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycwkJKz0gaW5iKGlvYWRkciArIDUpOworICAgIGxwLT5zdGF0cy50eF9wYWNrZXRzCQkrPSBpbmIoaW9hZGRyICsgNik7CisgICAgLyogUnggcGFja2V0cyAgICovCQkJaW5iKGlvYWRkciArIDcpOworICAgIC8qIFR4IGRlZmVycmFscyAqLwkJCWluYihpb2FkZHIgKyA4KTsKKyAgICAvKiBSeCBvY3RldHMgKi8JCQlpbncoaW9hZGRyICsgMTApOworICAgIC8qIFR4IG9jdGV0cyAqLwkJCWludyhpb2FkZHIgKyAxMik7CisgICAgCisgICAgLyogQmFjayB0byB3aW5kb3cgMSwgYW5kIHR1cm4gc3RhdGlzdGljcyBiYWNrIG9uLiAqLworICAgIEVMM1dJTkRPVygxKTsKKyAgICBvdXR3KFN0YXRzRW5hYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKK30KKworc3RhdGljIGludCBlbDNfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZWwzX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCB3b3JrbGltaXQgPSAzMjsKKyAgICBzaG9ydCByeF9zdGF0dXM7CisgICAgCisgICAgREVCVUcoMywgIiVzOiBpbiByeF9wYWNrZXQoKSwgc3RhdHVzICU0LjR4LCByeF9zdGF0dXMgJTQuNHguXG4iLAorCSAgZGV2LT5uYW1lLCBpbncoaW9hZGRyK0VMM19TVEFUVVMpLCBpbncoaW9hZGRyK1JYX1NUQVRVUykpOworICAgIHdoaWxlICghKChyeF9zdGF0dXMgPSBpbncoaW9hZGRyICsgUlhfU1RBVFVTKSkgJiAweDgwMDApICYmCisJICAgKC0td29ya2xpbWl0ID49IDApKSB7CisJaWYgKHJ4X3N0YXR1cyAmIDB4NDAwMCkgeyAvKiBFcnJvciwgdXBkYXRlIHN0YXRzLiAqLworCSAgICBzaG9ydCBlcnJvciA9IHJ4X3N0YXR1cyAmIDB4MzgwMDsKKwkgICAgbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCSAgICBzd2l0Y2ggKGVycm9yKSB7CisJICAgIGNhc2UgMHgwMDAwOglscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsgYnJlYWs7CisJICAgIGNhc2UgMHgwODAwOglscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOyBicmVhazsKKwkgICAgY2FzZSAweDEwMDA6CWxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsgYnJlYWs7CisJICAgIGNhc2UgMHgxODAwOglscC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOyBicmVhazsKKwkgICAgY2FzZSAweDIwMDA6CWxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsgYnJlYWs7CisJICAgIGNhc2UgMHgyODAwOglscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOyBicmVhazsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIHNob3J0IHBrdF9sZW4gPSByeF9zdGF0dXMgJiAweDdmZjsKKwkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkgICAgCisJICAgIHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbis1KTsKKwkgICAgCisJICAgIERFQlVHKDMsICIgICAgUmVjZWl2aW5nIHBhY2tldCBzaXplICVkIHN0YXR1cyAlNC40eC5cbiIsCisJCSAgcGt0X2xlbiwgcnhfc3RhdHVzKTsKKwkgICAgaWYgKHNrYiAhPSBOVUxMKSB7CisJCXNrYi0+ZGV2ID0gZGV2OworCQlza2JfcmVzZXJ2ZShza2IsIDIpOworCQlpbnNsKGlvYWRkcitSWF9GSUZPLCBza2JfcHV0KHNrYiwgcGt0X2xlbiksCisJCQkocGt0X2xlbiszKT4+Mik7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCW5ldGlmX3J4KHNrYik7CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCSAgICB9IGVsc2UgeworCQlERUJVRygxLCAiJXM6IGNvdWxkbid0IGFsbG9jYXRlIGEgc2tfYnVmZiBvZiIKKwkJICAgICAgIiBzaXplICVkLlxuIiwgZGV2LT5uYW1lLCBwa3RfbGVuKTsKKwkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkgICAgfQorCX0KKwkvKiBQb3AgdGhlIHRvcCBvZiB0aGUgUnggRklGTyAqLworCXRjNTg5X3dhaXRfZm9yX2NvbXBsZXRpb24oZGV2LCBSeERpc2NhcmQpOworICAgIH0KKyAgICBpZiAod29ya2xpbWl0ID09IDApCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRvbyBtdWNoIHdvcmsgaW4gZWwzX3J4IVxuIiwgZGV2LT5uYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGVsM19wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgZGV2X2xpbmtfdCAqbGluayA9ICZscC0+bGluazsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHUxNiBvcHRzID0gU2V0UnhGaWx0ZXIgfCBSeFN0YXRpb24gfCBSeEJyb2FkY2FzdDsKKworICAgIGlmICghKERFVl9PSyhsaW5rKSkpIHJldHVybjsKKyAgICBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCW9wdHMgfD0gUnhNdWx0aWNhc3QgfCBSeFByb207CisgICAgZWxzZSBpZiAoZGV2LT5tY19jb3VudCB8fCAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpCisJb3B0cyB8PSBSeE11bHRpY2FzdDsKKyAgICBvdXR3KG9wdHMsIGlvYWRkciArIEVMM19DTUQpOworfQorCitzdGF0aWMgaW50IGVsM19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBlbDNfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGRldl9saW5rX3QgKmxpbmsgPSAmbHAtPmxpbms7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAKKyAgICBERUJVRygxLCAiJXM6IHNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKKworICAgIGlmIChERVZfT0sobGluaykpIHsKKwkvKiBUdXJuIG9mZiBzdGF0aXN0aWNzIEFTQVAuICBXZSB1cGRhdGUgbHAtPnN0YXRzIGJlbG93LiAqLworCW91dHcoU3RhdHNEaXNhYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkKKwkvKiBEaXNhYmxlIHRoZSByZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXIuICovCisJb3V0dyhSeERpc2FibGUsIGlvYWRkciArIEVMM19DTUQpOworCW91dHcoVHhEaXNhYmxlLCBpb2FkZHIgKyBFTDNfQ01EKTsKKwkKKwlpZiAoZGV2LT5pZl9wb3J0ID09IDIpCisJICAgIC8qIFR1cm4gb2ZmIHRoaW5uZXQgcG93ZXIuICBHcmVlbiEgKi8KKwkgICAgb3V0dyhTdG9wQ29heCwgaW9hZGRyICsgRUwzX0NNRCk7CisJZWxzZSBpZiAoZGV2LT5pZl9wb3J0ID09IDEpIHsKKwkgICAgLyogRGlzYWJsZSBsaW5rIGJlYXQgYW5kIGphYmJlciAqLworCSAgICBFTDNXSU5ET1coNCk7CisJICAgIG91dHcoMCwgaW9hZGRyICsgV040X01FRElBKTsKKwl9CisJCisJLyogU3dpdGNoaW5nIGJhY2sgdG8gd2luZG93IDAgZGlzYWJsZXMgdGhlIElSUS4gKi8KKwlFTDNXSU5ET1coMCk7CisJLyogQnV0IHdlIGV4cGxpY2l0bHkgemVybyB0aGUgSVJRIGxpbmUgc2VsZWN0IGFueXdheS4gKi8KKwlvdXR3KDB4MGYwMCwgaW9hZGRyICsgV04wX0lSUSk7CisgICAgICAgIAorCS8qIENoZWNrIGlmIHRoZSBjYXJkIHN0aWxsIGV4aXN0cyAqLworCWlmICgoaW53KGlvYWRkcitFTDNfU1RBVFVTKSAmIDB4ZTAwMCkgPT0gMHgyMDAwKQorCSAgICB1cGRhdGVfc3RhdHMoZGV2KTsKKyAgICB9CisKKyAgICBsaW5rLT5vcGVuLS07CisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworICAgIGRlbF90aW1lcl9zeW5jKCZscC0+bWVkaWEpOworICAgIAorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgdGM1ODlfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSAiM2M1ODlfY3MiLAorCX0sCisJLmF0dGFjaAkJPSB0YzU4OV9hdHRhY2gsCisJLmRldGFjaAkJPSB0YzU4OV9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3RjNTg5KHZvaWQpCit7CisJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJnRjNTg5X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3RjNTg5KHZvaWQpCit7CisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZ0YzU4OV9kcml2ZXIpOworCUJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF90YzU4OSk7Cittb2R1bGVfZXhpdChleGl0X3RjNTg5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9LY29uZmlnIGIvZHJpdmVycy9uZXQvcGNtY2lhL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRmODYyMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9LY29uZmlnCkBAIC0wLDAgKzEsMTMyIEBACisjCisjIFBDTUNJQSBOZXR3b3JrIGRldmljZSBjb25maWd1cmF0aW9uCisjCisKK21lbnUgIlBDTUNJQSBuZXR3b3JrIGRldmljZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUREVWSUNFUyAmJiBQQ01DSUEhPW4KKworY29uZmlnIE5FVF9QQ01DSUEKKwlib29sICJQQ01DSUEgbmV0d29yayBkZXZpY2Ugc3VwcG9ydCIKKwktLS1oZWxwLS0tCisJICBTYXkgWSBpZiB5b3Ugd291bGQgbGlrZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIGFueSBQQ01DSUEgb3IgQ2FyZEJ1cworCSAgbmV0d29yayBhZGFwdGVycywgdGhlbiBzYXkgWSB0byB0aGUgZHJpdmVyIGZvciB5b3VyIHBhcnRpY3VsYXIgY2FyZAorCSAgYmVsb3cuICBQQ01DSUEtIG9yIFBDLWNhcmRzIGFyZSBjcmVkaXQtY2FyZCBzaXplIGRldmljZXMgb2Z0ZW4gdXNlZAorCSAgd2l0aCBsYXB0b3BzIGNvbXB1dGVyczsgQ2FyZEJ1cyBpcyB0aGUgbmV3ZXIgYW5kIGZhc3RlciB2ZXJzaW9uIG9mCisJICBQQ01DSUEuCisKKwkgIFRvIHVzZSB5b3VyIFBDLWNhcmRzLCB5b3Ugd2lsbCBuZWVkIHN1cHBvcnRpbmcgc29mdHdhcmUgZnJvbSBEYXZpZAorCSAgSGluZHMnIHBjbWNpYS1jcyBwYWNrYWdlIChzZWUgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9DaGFuZ2VzPgorCSAgZm9yIGxvY2F0aW9uKS4gIFlvdSBhbHNvIHdhbnQgdG8gY2hlY2sgb3V0IHRoZSBQQ01DSUEtSE9XVE8sCisJICBhdmFpbGFibGUgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgUENNQ0lBXzNDNTg5CisJdHJpc3RhdGUgIjNDb20gM2M1ODkgUENNQ0lBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENNQ0lBICYmIFBDTUNJQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggYSAzQ29tIDNjNTg5IG9yIGNvbXBhdGlibGUgUENNQ0lBCisJICAoUEMtY2FyZCkgRXRoZXJuZXQgY2FyZCB0byB5b3VyIGNvbXB1dGVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCAzYzU4OV9jcy4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBQQ01DSUFfM0M1NzQKKwl0cmlzdGF0ZSAiM0NvbSAzYzU3NCBQQ01DSUEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9QQ01DSUEgJiYgUENNQ0lBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIGF0dGFjaCBhIDNDb20gM2M1NzQgb3IgY29tcGF0aWJsZSBQQ01DSUEKKwkgIChQQy1jYXJkKSBGYXN0IEV0aGVybmV0IGNhcmQgdG8geW91ciBjb21wdXRlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgM2M1NzRfY3MuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgUENNQ0lBX0ZNVkoxOFgKKwl0cmlzdGF0ZSAiRnVqaXRzdSBGTVYtSjE4eCBQQ01DSUEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9QQ01DSUEgJiYgUENNQ0lBCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIGF0dGFjaCBhIEZ1aml0c3UgRk1WLUoxOHggb3IgY29tcGF0aWJsZQorCSAgUENNQ0lBIChQQy1jYXJkKSBFdGhlcm5ldCBjYXJkIHRvIHlvdXIgY29tcHV0ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGZtdmoxOHhfY3MuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgUENNQ0lBX1BDTkVUCisJdHJpc3RhdGUgIk5FMjAwMCBjb21wYXRpYmxlIFBDTUNJQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDTUNJQSAmJiBQQ01DSUEKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIGFuIE5FMjAwMCBjb21wYXRpYmxlIFBDTUNJQQorCSAgKFBDLWNhcmQpIEV0aGVybmV0IG9yIEZhc3QgRXRoZXJuZXQgY2FyZCB0byB5b3VyIGNvbXB1dGVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBwY25ldF9jcy4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBQQ01DSUFfTk1DTEFOCisJdHJpc3RhdGUgIk5ldyBNZWRpYSBQQ01DSUEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9QQ01DSUEgJiYgUENNQ0lBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIGF0dGFjaCBhIE5ldyBNZWRpYSBFdGhlcm5ldCBvciBMaXZlV2lyZQorCSAgUENNQ0lBIChQQy1jYXJkKSBFdGhlcm5ldCBjYXJkIHRvIHlvdXIgY29tcHV0ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIG5tY2xhbl9jcy4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBQQ01DSUFfU01DOTFDOTIKKwl0cmlzdGF0ZSAiU01DIDkxQ3h4IFBDTUNJQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDTUNJQSAmJiBQQ01DSUEKKwlzZWxlY3QgQ1JDMzIKKwlzZWxlY3QgTUlJCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIGF0dGFjaCBhbiBTTUMgOTFDeHggY29tcGF0aWJsZSBQQ01DSUEKKwkgIChQQy1jYXJkKSBFdGhlcm5ldCBvciBGYXN0IEV0aGVybmV0IGNhcmQgdG8geW91ciBjb21wdXRlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgc21jOTFjOTJfY3MuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgUENNQ0lBX1hJUkMyUFMKKwl0cmlzdGF0ZSAiWGlyY29tIDE2LWJpdCBQQ01DSUEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9QQ01DSUEgJiYgUENNQ0lBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIGF0dGFjaCBhIFhpcmNvbSAxNi1iaXQgUENNQ0lBIChQQy1jYXJkKQorCSAgRXRoZXJuZXQgb3IgRmFzdCBFdGhlcm5ldCBjYXJkIHRvIHlvdXIgY29tcHV0ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHhpcmMycHNfY3MuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgUENNQ0lBX0FYTkVUCisJdHJpc3RhdGUgIkFzaXggQVg4ODE5MCBQQ01DSUEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9QQ01DSUEgJiYgUENNQ0lBCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIGF0dGFjaCBhbiBBc2l4IEFYODgxOTAtYmFzZWQgUENNQ0lBCisJICAoUEMtY2FyZCkgRmFzdCBFdGhlcm5ldCBjYXJkIHRvIHlvdXIgY29tcHV0ZXIuICBUaGVzZSBjYXJkcyBhcmUKKwkgIG5lYXJseSBORTIwMDAgY29tcGF0aWJsZSBidXQgbmVlZCBhIHNlcGFyYXRlIGRyaXZlciBkdWUgdG8gYSBmZXcKKwkgIG1pc2ZlYXR1cmVzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBheG5ldF9jcy4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBBUkNORVRfQ09NMjAwMjBfQ1MKKwl0cmlzdGF0ZSAiQ09NMjAwMjAgQVJDbmV0IFBDTUNJQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDTUNJQSAmJiBBUkNORVRfQ09NMjAwMjAgJiYgUENNQ0lBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIGF0dGFjaCB0aGlzIHR5cGUgb2YgQVJDbmV0IFBDTUNJQSBjYXJkCisJICB0byB5b3VyIGNvbXB1dGVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBjb20yMDAyMF9jcy4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBQQ01DSUFfSUJNVFIKKwl0cmlzdGF0ZSAiSUJNIFBDTUNJQSB0b2tlbnJpbmcgYWRhcHRlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1BDTUNJQSAmJiBJQk1UUiE9eSAmJiBUUiAmJiBQQ01DSUEgJiYgITY0QklUCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIGF0dGFjaCB0aGlzIHR5cGUgb2YgVG9rZW4gUmluZyBQQ01DSUEKKwkgIGNhcmQgdG8geW91ciBjb21wdXRlci4gWW91IHRoZW4gYWxzbyBuZWVkIHRvIHNheSBZIHRvICJUb2tlbiBSaW5nCisJICBkcml2ZXIgc3VwcG9ydCIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGlibXRyX2NzLgorCitlbmRtZW51CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3BjbWNpYS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2QyZDk5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL01ha2VmaWxlCkBAIC0wLDAgKzEsMTYgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBQQ01DSUEgbmV0d29yayBkZXZpY2UgZHJpdmVycy4KKyMKKworIyAxNi1iaXQgY2xpZW50IGRyaXZlcnMKK29iai0kKENPTkZJR19QQ01DSUFfM0M1ODkpCSs9IDNjNTg5X2NzLm8KK29iai0kKENPTkZJR19QQ01DSUFfM0M1NzQpCSs9IDNjNTc0X2NzLm8KK29iai0kKENPTkZJR19QQ01DSUFfRk1WSjE4WCkJKz0gZm12ajE4eF9jcy5vCitvYmotJChDT05GSUdfUENNQ0lBX05NQ0xBTikJKz0gbm1jbGFuX2NzLm8KK29iai0kKENPTkZJR19QQ01DSUFfUENORVQpCSs9IHBjbmV0X2NzLm8KK29iai0kKENPTkZJR19QQ01DSUFfU01DOTFDOTIpCSs9IHNtYzkxYzkyX2NzLm8KK29iai0kKENPTkZJR19QQ01DSUFfWElSQzJQUykJKz0geGlyYzJwc19jcy5vCitvYmotJChDT05GSUdfQVJDTkVUX0NPTTIwMDIwX0NTKSs9IGNvbTIwMDIwX2NzLm8KK29iai0kKENPTkZJR19QQ01DSUFfQVhORVQpCSs9IGF4bmV0X2NzLm8KKworb2JqLSQoQ09ORklHX1BDTUNJQV9JQk1UUikJKz0gaWJtdHJfY3MubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvYXhuZXRfY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTNiNTg2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMKQEAgLTAsMCArMSwxODY0IEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEEgUENNQ0lBIGV0aGVybmV0IGRyaXZlciBmb3IgQXNpeCBBWDg4MTkwLWJhc2VkIGNhcmRzCisKKyAgICBUaGUgQXNpeCBBWDg4MTkwIGlzIGEgTlM4MzkwLWRlcml2ZWQgY2hpcHNldCB3aXRoIGEgZmV3IG5hc3R5CisgICAgaWRpb3N5bmNyYWNpZXMgdGhhdCBtYWtlIGl0IHZlcnkgaW5jb252ZW5pZW50IHRvIHN1cHBvcnQgd2l0aCBhCisgICAgc3RhbmRhcmQgODM5MCBkcml2ZXIuICBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiBwY25ldF9jcywgd2l0aCB0aGUKKyAgICB0d2Vha2VkIDgzOTAgY29kZSBncmFmdGVkIG9uIHRoZSBlbmQuICBNdWNoIG9mIHdoYXQgSSBkaWQgd2FzIHRvCisgICAgY2xlYW4gdXAgYW5kIHVwZGF0ZSBhIHNpbWlsYXIgZHJpdmVyIHN1cHBsaWVkIGJ5IEFzaXgsIHdoaWNoIHdhcworICAgIGFkYXB0ZWQgYnkgV2lsbGlhbSBMZWUsIHdpbGxpYW1AYXNpeC5jb20udHcuCisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDEgRGF2aWQgQS4gSGluZHMgLS0gZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKKworICAgIGF4bmV0X2NzLmMgMS4yOCAyMDAyLzA2LzI5IDA2OjI3OjM3CisKKyAgICBUaGUgbmV0d29yayBkcml2ZXIgY29kZSBpcyBiYXNlZCBvbiBEb25hbGQgQmVja2VyJ3MgTkUyMDAwIGNvZGU6CisKKyAgICBXcml0dGVuIDE5OTIsMTk5MyBieSBEb25hbGQgQmVja2VyLgorICAgIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKyAgICBEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQKKyAgICBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAgICBEb25hbGQgQmVja2VyIG1heSBiZSByZWFjaGVkIGF0IGJlY2tlckBzY3lsZC5jb20KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlICIuLi84MzkwLmgiCisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzY29kZS5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBBWE5FVF9DTUQJMHgwMAorI2RlZmluZSBBWE5FVF9EQVRBUE9SVAkweDEwCS8qIE5hdFNlbWktZGVmaW5lZCBwb3J0IHdpbmRvdyBvZmZzZXQuICovCisjZGVmaW5lIEFYTkVUX1JFU0VUCTB4MWYJLyogSXNzdWUgYSByZWFkIHRvIHJlc2V0LCBhIHdyaXRlIHRvIGNsZWFyLiAqLworI2RlZmluZSBBWE5FVF9NSUlfRUVQCTB4MTQJLyogT2Zmc2V0IG9mIE1JSSBhY2Nlc3MgcG9ydCAqLworI2RlZmluZSBBWE5FVF9URVNUCTB4MTUJLyogT2Zmc2V0IG9mIFRFU1QgUmVnaXN0ZXIgcG9ydCAqLworI2RlZmluZSBBWE5FVF9HUElPCTB4MTcJLyogT2Zmc2V0IG9mIEdlbmVyYWwgUHVycG9zZSBSZWdpc3RlciBQb3J0ICovCisKKyNkZWZpbmUgQVhORVRfU1RBUlRfUEcJMHg0MAkvKiBGaXJzdCBwYWdlIG9mIFRYIGJ1ZmZlciAqLworI2RlZmluZSBBWE5FVF9TVE9QX1BHCTB4ODAJLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcgKi8KKworI2RlZmluZSBBWE5FVF9SRENfVElNRU9VVCAweDAyCS8qIE1heCB3YWl0IGluIGppZmZpZXMgZm9yIFR4IFJEQyAqLworCisjZGVmaW5lIElTX0FYODgxOTAJMHgwMDAxCisjZGVmaW5lIElTX0FYODg3OTAJMHgwMDAyCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBIaW5kcyA8ZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFzaXggQVg4ODE5MCBQQ01DSUEgZXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKKyNkZWZpbmUgSU5UX01PRFVMRV9QQVJNKG4sIHYpIHN0YXRpYyBpbnQgbiA9IHY7IG1vZHVsZV9wYXJhbShuLCBpbnQsIDApCisKK0lOVF9NT0RVTEVfUEFSTShwY19kZWJ1ZywgUENNQ0lBX0RFQlVHKTsKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgaWYgKHBjX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncykKK3N0YXRpYyBjaGFyICp2ZXJzaW9uID0KKyJheG5ldF9jcy5jIDEuMjggMjAwMi8wNi8yOSAwNjoyNzozNyAoRGF2aWQgSGluZHMpIjsKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGF4bmV0X2NvbmZpZyhkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyB2b2lkIGF4bmV0X3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgaW50IGF4bmV0X2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJICAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CitzdGF0aWMgaW50IGF4bmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGF4bmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBheG5ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOworc3RhdGljIGlycXJldHVybl90IGVpX2lycV93cmFwcGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgZWlfd2F0Y2hkb2codV9sb25nIGFyZyk7CitzdGF0aWMgdm9pZCBheG5ldF9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgaW50IG1kaW9fcmVhZChraW9fYWRkcl90IGFkZHIsIGludCBwaHlfaWQsIGludCBsb2MpOworc3RhdGljIHZvaWQgbWRpb193cml0ZShraW9fYWRkcl90IGFkZHIsIGludCBwaHlfaWQsIGludCBsb2MsIGludCB2YWx1ZSk7CisKK3N0YXRpYyB2b2lkIGdldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqLAorCQkJIHN0cnVjdCBlODM5MF9wa3RfaGRyICosIGludCk7CitzdGF0aWMgdm9pZCBibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQgYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCSBjb25zdCB1X2NoYXIgKmJ1ZiwgY29uc3QgaW50IHN0YXJ0X3BhZ2UpOworCitzdGF0aWMgZGV2X2xpbmtfdCAqYXhuZXRfYXR0YWNoKHZvaWQpOworc3RhdGljIHZvaWQgYXhuZXRfZGV0YWNoKGRldl9saW5rX3QgKik7CisKK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvID0gImF4bmV0X2NzIjsKK3N0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdDsKKworc3RhdGljIHZvaWQgYXhkZXZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBBWDg4MTkwX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXJ0cCk7CitzdGF0aWMgaW50IGF4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGF4X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGF4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3R5cGVkZWYgc3RydWN0IGF4bmV0X2Rldl90IHsKKyAgICBkZXZfbGlua190CQlsaW5rOworICAgIGRldl9ub2RlX3QJCW5vZGU7CisgICAgY2FkZHJfdAkJYmFzZTsKKyAgICBzdHJ1Y3QgdGltZXJfbGlzdAl3YXRjaGRvZzsKKyAgICBpbnQJCQlzdGFsZSwgZmFzdF9wb2xsOworICAgIHVfc2hvcnQJCWxpbmtfc3RhdHVzOworICAgIHVfY2hhcgkJZHVwbGV4X2ZsYWc7CisgICAgaW50CQkJcGh5X2lkOworICAgIGludAkJCWZsYWdzOworfSBheG5ldF9kZXZfdDsKKworc3RhdGljIGlubGluZSBheG5ldF9kZXZfdCAqUFJJVihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXZvaWQgKnAgPSAoY2hhciAqKW5ldGRldl9wcml2KGRldikgKyBzaXplb2Yoc3RydWN0IGVpX2RldmljZSk7CisJcmV0dXJuIHA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgYXhuZXRfYXR0YWNoKCkgY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcKKyAgICBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQKKyAgICB3aXRoIENhcmQgU2VydmljZXMuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgZGV2X2xpbmtfdCAqYXhuZXRfYXR0YWNoKHZvaWQpCit7CisgICAgYXhuZXRfZGV2X3QgKmluZm87CisgICAgZGV2X2xpbmtfdCAqbGluazsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgIGNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworICAgIGludCByZXQ7CisKKyAgICBERUJVRygwLCAiYXhuZXRfYXR0YWNoKClcbiIpOworCisgICAgZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgZWlfZGV2aWNlKSArIHNpemVvZihheG5ldF9kZXZfdCksCisJCQkiZXRoJWQiLCBheGRldl9zZXR1cCk7CisKKyAgICBpZiAoIWRldikKKwlyZXR1cm4gTlVMTDsKKworICAgIGluZm8gPSBQUklWKGRldik7CisgICAgbGluayA9ICZpbmZvLT5saW5rOworICAgIGxpbmstPnByaXYgPSBkZXY7CisgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkU7CisgICAgbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOworICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKKyAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKworICAgIGRldi0+b3BlbiA9ICZheG5ldF9vcGVuOworICAgIGRldi0+c3RvcCA9ICZheG5ldF9jbG9zZTsKKyAgICBkZXYtPmRvX2lvY3RsID0gJmF4bmV0X2lvY3RsOworICAgIFNFVF9FVEhUT09MX09QUyhkZXYsICZuZXRkZXZfZXRodG9vbF9vcHMpOworCisgICAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgbGluay0+bmV4dCA9IGRldl9saXN0OworICAgIGRldl9saXN0ID0gbGluazsKKyAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KKwlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKwlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZheG5ldF9ldmVudDsKKyAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKyAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKyAgICBpZiAocmV0ICE9IENTX1NVQ0NFU1MpIHsKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworCWF4bmV0X2RldGFjaChsaW5rKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbGluazsKK30gLyogYXhuZXRfYXR0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQKKyAgICB3aXRoIENhcmQgU2VydmljZXMuICBJZiBpdCBoYXMgYmVlbiByZWxlYXNlZCwgYWxsIGxvY2FsIGRhdGEKKyAgICBzdHJ1Y3R1cmVzIGFyZSBmcmVlZC4gIE90aGVyd2lzZSwgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZSBmcmVlZAorICAgIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGF4bmV0X2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGRldl9saW5rX3QgKipsaW5rcDsKKworICAgIERFQlVHKDAsICJheG5ldF9kZXRhY2goMHglcClcbiIsIGxpbmspOworCisgICAgLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKyAgICBmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorCWlmICgqbGlua3AgPT0gbGluaykgYnJlYWs7CisgICAgaWYgKCpsaW5rcCA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGlmIChsaW5rLT5kZXYpCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJYXhuZXRfcmVsZWFzZShsaW5rKTsKKworICAgIGlmIChsaW5rLT5oYW5kbGUpCisJcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGxpbmstPmhhbmRsZSk7CisKKyAgICAvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBiaXRzICovCisgICAgKmxpbmtwID0gbGluay0+bmV4dDsKKyAgICBmcmVlX25ldGRldihkZXYpOworfSAvKiBheG5ldF9kZXRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGlzIHByb2JlcyBmb3IgYSBjYXJkJ3MgaGFyZHdhcmUgYWRkcmVzcyBieSByZWFkaW5nIHRoZSBQUk9NLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBnZXRfcHJvbShkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGksIGo7CisKKyAgICAvKiBUaGlzIGlzIGJhc2VkIG9uIGRyaXZlcnMvbmV0L25lLmMgKi8KKyAgICBzdHJ1Y3QgeworCXVfY2hhciB2YWx1ZSwgb2Zmc2V0OworICAgIH0gcHJvZ3JhbV9zZXFbXSA9IHsKKwl7RTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgRTgzOTBfQ01EfSwgLyogU2VsZWN0IHBhZ2UgMCovCisJezB4MDEsCUVOMF9EQ0ZHfSwJLyogU2V0IHdvcmQtd2lkZSBhY2Nlc3MuICovCisJezB4MDAsCUVOMF9SQ05UTE99LAkvKiBDbGVhciB0aGUgY291bnQgcmVncy4gKi8KKwl7MHgwMCwJRU4wX1JDTlRISX0sCisJezB4MDAsCUVOMF9JTVJ9LAkvKiBNYXNrIGNvbXBsZXRpb24gaXJxLiAqLworCXsweEZGLAlFTjBfSVNSfSwKKwl7RTgzOTBfUlhPRkZ8MHg0MCwgRU4wX1JYQ1J9LAkvKiAweDYwICBTZXQgdG8gbW9uaXRvciAqLworCXtFODM5MF9UWE9GRiwgRU4wX1RYQ1J9LAkvKiAweDAyICBhbmQgbG9vcGJhY2sgbW9kZS4gKi8KKwl7MHgxMCwJRU4wX1JDTlRMT30sCisJezB4MDAsCUVOMF9SQ05USEl9LAorCXsweDAwLAlFTjBfUlNBUkxPfSwJLyogRE1BIHN0YXJ0aW5nIGF0IDB4MDQwMC4gKi8KKwl7MHgwNCwJRU4wX1JTQVJISX0sCisJe0U4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBFODM5MF9DTUR9LAorICAgIH07CisKKyAgICAvKiBOb3QgbXVjaCBvZiBhIHRlc3QsIGJ1dCB0aGUgYWx0ZXJuYXRpdmVzIGFyZSBtZXNzeSAqLworICAgIGlmIChsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgIT0gMHgwM2MwKQorCXJldHVybiAwOworCisgICAgYXhuZXRfcmVzZXRfODM5MChkZXYpOworICAgIG1kZWxheSgxMCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHByb2dyYW1fc2VxKS9zaXplb2YocHJvZ3JhbV9zZXFbMF0pOyBpKyspCisJb3V0Yl9wKHByb2dyYW1fc2VxW2ldLnZhbHVlLCBpb2FkZHIgKyBwcm9ncmFtX3NlcVtpXS5vZmZzZXQpOworCisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkgKz0gMikgeworCWogPSBpbncoaW9hZGRyICsgQVhORVRfREFUQVBPUlQpOworCWRldi0+ZGV2X2FkZHJbaV0gPSBqICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyW2krMV0gPSBqID4+IDg7CisgICAgfQorICAgIHJldHVybiAxOworfSAvKiBnZXRfcHJvbSAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIGF4bmV0X2NvbmZpZygpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudAorICAgIGlzIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZQorICAgIGV0aGVybmV0IGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKworc3RhdGljIGludCB0cnlfaW9fcG9ydChkZXZfbGlua190ICpsaW5rKQoreworICAgIGludCBqLCByZXQ7CisgICAgaWYgKGxpbmstPmlvLk51bVBvcnRzMSA9PSAzMikgeworCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisJaWYgKGxpbmstPmlvLk51bVBvcnRzMiA+IDApIHsKKwkgICAgLyogZm9yIG1hc3Rlci9zbGF2ZSBtdWx0aWZ1bmN0aW9uIGNhcmRzICovCisJICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMyID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0gCisJCUlSUV9UWVBFX0RZTkFNSUNfU0hBUklOR3xJUlFfRklSU1RfU0hBUkVEOworCX0KKyAgICB9IGVsc2UgeworCS8qIFRoaXMgc2hvdWxkIGJlIHR3byAxNi1wb3J0IHdpbmRvd3MgKi8KKwlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OworCWxpbmstPmlvLkF0dHJpYnV0ZXMyID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OworICAgIH0KKyAgICBpZiAobGluay0+aW8uQmFzZVBvcnQxID09IDApIHsKKwlsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDE2OworCWZvciAoaiA9IDA7IGogPCAweDQwMDsgaiArPSAweDIwKSB7CisJICAgIGxpbmstPmlvLkJhc2VQb3J0MSA9IGogXiAweDMwMDsKKwkgICAgbGluay0+aW8uQmFzZVBvcnQyID0gKGogXiAweDMwMCkgKyAweDEwOworCSAgICByZXQgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJICAgIGlmIChyZXQgPT0gQ1NfU1VDQ0VTUykgcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworCXJldHVybiBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBheG5ldF9jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBjbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGF4bmV0X2Rldl90ICppbmZvID0gUFJJVihkZXYpOworICAgIHR1cGxlX3QgdHVwbGU7CisgICAgY2lzcGFyc2VfdCBwYXJzZTsKKyAgICBpbnQgaSwgaiwgbGFzdF9yZXQsIGxhc3RfZm47CisgICAgdV9zaG9ydCBidWZbNjRdOworICAgIGNvbmZpZ19pbmZvX3QgY29uZjsKKworICAgIERFQlVHKDAsICJheG5ldF9jb25maWcoMHglcClcbiIsIGxpbmspOworCisgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CisgICAgdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKKyAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKyAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICBDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOworICAgIC8qIGRvbid0IHRydXN0IHRoZSBDSVMgb24gdGhpczsgTGlua3N5cyBnb3QgaXQgd3JvbmcgKi8KKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSAweDYzOworCisgICAgLyogQ29uZmlndXJlIGNhcmQgKi8KKyAgICBsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworCisgICAgLyogTG9vayB1cCBjdXJyZW50IFZjYyAqLworICAgIENTX0NIRUNLKEdldENvbmZpZ3VyYXRpb25JbmZvLCBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhoYW5kbGUsICZjb25mKSk7CisgICAgbGluay0+Y29uZi5WY2MgPSBjb25mLlZjYzsKKworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOworICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICB3aGlsZSAobGFzdF9yZXQgPT0gQ1NfU1VDQ0VTUykgeworCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZyA9ICYocGFyc2UuY2Z0YWJsZV9lbnRyeSk7CisJY2lzdHBsX2lvX3QgKmlvID0gJihwYXJzZS5jZnRhYmxlX2VudHJ5LmlvKTsKKwkKKwlpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSAhPSAwIHx8CisJCXBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSAhPSAwIHx8CisJCWNmZy0+aW5kZXggPT0gMCB8fCBjZmctPmlvLm53aW4gPT0gMCkKKwkgICAgZ290byBuZXh0X2VudHJ5OworCQorCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAweDA1OworCS8qIEZvciBtdWx0aWZ1bmN0aW9uIGNhcmRzLCBieSBjb252ZW50aW9uLCB3ZSBjb25maWd1cmUgdGhlCisJICAgbmV0d29yayBmdW5jdGlvbiB3aXRoIHdpbmRvdyAwLCBhbmQgc2VyaWFsIHdpdGggd2luZG93IDEgKi8KKwlpZiAoaW8tPm53aW4gPiAxKSB7CisJICAgIGkgPSAoaW8tPndpblsxXS5sZW4gPiBpby0+d2luWzBdLmxlbik7CisJICAgIGxpbmstPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMS1pXS5iYXNlOworCSAgICBsaW5rLT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzEtaV0ubGVuOworCX0gZWxzZSB7CisJICAgIGkgPSBsaW5rLT5pby5OdW1Qb3J0czIgPSAwOworCX0KKwlsaW5rLT5pby5CYXNlUG9ydDEgPSBpby0+d2luW2ldLmJhc2U7CisJbGluay0+aW8uTnVtUG9ydHMxID0gaW8tPndpbltpXS5sZW47CisJbGluay0+aW8uSU9BZGRyTGluZXMgPSBpby0+ZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKKwlpZiAobGluay0+aW8uTnVtUG9ydHMxICsgbGluay0+aW8uTnVtUG9ydHMyID49IDMyKSB7CisJICAgIGxhc3RfcmV0ID0gdHJ5X2lvX3BvcnQobGluayk7CisJICAgIGlmIChsYXN0X3JldCA9PSBDU19TVUNDRVNTKSBicmVhazsKKwl9CisgICAgbmV4dF9lbnRyeToKKwlsYXN0X3JldCA9IHBjbWNpYV9nZXRfbmV4dF90dXBsZShoYW5kbGUsICZ0dXBsZSk7CisgICAgfQorICAgIGlmIChsYXN0X3JldCAhPSBDU19TVUNDRVNTKSB7CisJY3NfZXJyb3IoaGFuZGxlLCBSZXF1ZXN0SU8sIGxhc3RfcmV0KTsKKwlnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgICBDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEoaGFuZGxlLCAmbGluay0+aXJxKSk7CisgICAgCisgICAgaWYgKGxpbmstPmlvLk51bVBvcnRzMiA9PSA4KSB7CisJbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX1NQS1I7CisJbGluay0+Y29uZi5TdGF0dXMgPSBDQ1NSX0FVRElPX0VOQTsKKyAgICB9CisgICAgCisgICAgQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24oaGFuZGxlLCAmbGluay0+Y29uZikpOworICAgIGRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworICAgIGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworCisgICAgaWYgKCFnZXRfcHJvbShsaW5rKSkgeworCXByaW50ayhLRVJOX05PVElDRSAiYXhuZXRfY3M6IHRoaXMgaXMgbm90IGFuIEFYODgxOTAgY2FyZCFcbiIpOworCXByaW50ayhLRVJOX05PVElDRSAiYXhuZXRfY3M6IHVzZSBwY25ldF9jcyBpbnN0ZWFkLlxuIik7CisJZ290byBmYWlsZWQ7CisgICAgfQorCisgICAgZWlfc3RhdHVzLm5hbWUgPSAiQVg4ODE5MCI7CisgICAgZWlfc3RhdHVzLndvcmQxNiA9IDE7CisgICAgZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBBWE5FVF9TVEFSVF9QRzsKKyAgICBlaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IEFYTkVUX1NUQVJUX1BHICsgVFhfUEFHRVM7CisgICAgZWlfc3RhdHVzLnN0b3BfcGFnZSA9IEFYTkVUX1NUT1BfUEc7CisgICAgZWlfc3RhdHVzLnJlc2V0XzgzOTAgPSAmYXhuZXRfcmVzZXRfODM5MDsKKyAgICBlaV9zdGF0dXMuZ2V0XzgzOTBfaGRyID0gJmdldF84MzkwX2hkcjsKKyAgICBlaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmYmxvY2tfaW5wdXQ7CisgICAgZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZibG9ja19vdXRwdXQ7CisKKyAgICBpZiAoaW5iKGRldi0+YmFzZV9hZGRyICsgQVhORVRfVEVTVCkgIT0gMCkKKwlpbmZvLT5mbGFncyB8PSBJU19BWDg4NzkwOworICAgIGVsc2UKKwlpbmZvLT5mbGFncyB8PSBJU19BWDg4MTkwOworCisgICAgaWYgKGluZm8tPmZsYWdzICYgSVNfQVg4ODc5MCkKKwlvdXRiKDB4MTAsIGRldi0+YmFzZV9hZGRyICsgQVhORVRfR1BJTyk7ICAvKiBzZWxlY3QgSW50ZXJuYWwgUEhZICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCWogPSBtZGlvX3JlYWQoZGV2LT5iYXNlX2FkZHIgKyBBWE5FVF9NSUlfRUVQLCBpLCAxKTsKKwlpZiAoKGogIT0gMCkgJiYgKGogIT0gMHhmZmZmKSkgYnJlYWs7CisgICAgfQorCisgICAgLyogTWF5YmUgUEhZIGlzIGluIHBvd2VyIGRvd24gbW9kZS4gKFBQRF9TRVQgPSAxKSAKKyAgICAgICBCaXQgMiBvZiBDQ1NSIGlzIGFjdGl2ZSBsb3cuICovIAorICAgIGlmIChpID09IDMyKSB7CisJY29uZl9yZWdfdCByZWcgPSB7IDAsIENTX1dSSVRFLCBDSVNSRUdfQ0NTUiwgMHgwNCB9OworIAlwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIobGluay0+aGFuZGxlLCAmcmVnKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCSAgICBqID0gbWRpb19yZWFkKGRldi0+YmFzZV9hZGRyICsgQVhORVRfTUlJX0VFUCwgaSwgMSk7CisJICAgIGlmICgoaiAhPSAwKSAmJiAoaiAhPSAweGZmZmYpKSBicmVhazsKKwl9CisgICAgfQorCisgICAgaW5mby0+cGh5X2lkID0gKGkgPCAzMikgPyBpIDogLTE7CisgICAgbGluay0+ZGV2ID0gJmluZm8tPm5vZGU7CisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKyAgICBTRVRfTkVUREVWX0RFVihkZXYsICZoYW5kbGVfdG9fZGV2KGhhbmRsZSkpOworCisgICAgaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpICE9IDApIHsKKwlwcmludGsoS0VSTl9OT1RJQ0UgImF4bmV0X2NzOiByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWRcbiIpOworCWxpbmstPmRldiA9IE5VTEw7CisJZ290byBmYWlsZWQ7CisgICAgfQorCisgICAgc3RyY3B5KGluZm8tPm5vZGUuZGV2X25hbWUsIGRldi0+bmFtZSk7CisKKyAgICBwcmludGsoS0VSTl9JTkZPICIlczogQXNpeCBBWDg4JWQ5MDogaW8gJSMzbHgsIGlycSAlZCwgaHdfYWRkciAiLAorCSAgIGRldi0+bmFtZSwgKChpbmZvLT5mbGFncyAmIElTX0FYODg3OTApID8gNyA6IDEpLAorCSAgIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlwcmludGsoIiUwMlglcyIsIGRldi0+ZGV2X2FkZHJbaV0sICgoaTw1KSA/ICI6IiA6ICJcbiIpKTsKKyAgICBpZiAoaW5mby0+cGh5X2lkICE9IC0xKSB7CisJREVCVUcoMCwgIiAgTUlJIHRyYW5zY2VpdmVyIGF0IGluZGV4ICVkLCBzdGF0dXMgJXguXG4iLCBpbmZvLT5waHlfaWQsIGopOworICAgIH0gZWxzZSB7CisJcHJpbnRrKEtFUk5fTk9USUNFICIgIE5vIE1JSSB0cmFuc2NlaXZlcnMgZm91bmQhXG4iKTsKKyAgICB9CisgICAgcmV0dXJuOworCitjc19mYWlsZWQ6CisgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBsYXN0X2ZuLCBsYXN0X3JldCk7CitmYWlsZWQ6CisgICAgYXhuZXRfcmVsZWFzZShsaW5rKTsKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworICAgIHJldHVybjsKK30gLyogYXhuZXRfY29uZmlnICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIGF4bmV0X3JlbGVhc2UoKSB3aWxsIHVucmVnaXN0ZXIgdGhlIG5ldAorICAgIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICAgIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgYXhuZXRfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworICAgIERFQlVHKDAsICJheG5ldF9yZWxlYXNlKDB4JXApXG4iLCBsaW5rKTsKKworICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKyAgICBwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisgICAgcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gIE1vc3RseSwgdGhpcyBzY2hlZHVsZXMgb3RoZXIKKyAgICBzdHVmZiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuICBBIENBUkRfUkVNT1ZBTCBldmVudAorICAgIGFsc28gc2V0cyBzb21lIGZsYWdzIHRvIGRpc2NvdXJhZ2UgdGhlIG5ldCBkcml2ZXJzIGZyb20gdHJ5aW5nCisgICAgdG8gdGFsayB0byB0aGUgY2FyZCBhbnkgbW9yZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgYXhuZXRfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkgICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworICAgIGRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKworICAgIERFQlVHKDIsICJheG5ldF9ldmVudCgweCUwNngpXG4iLCBldmVudCk7CisKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJICAgIG5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorCWxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOworCWF4bmV0X2NvbmZpZyhsaW5rKTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIGlmIChsaW5rLT5vcGVuKQorCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwl9CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisJbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisJICAgIGlmIChsaW5rLT5vcGVuKSB7CisJCWF4bmV0X3Jlc2V0XzgzOTAoZGV2KTsKKwkJQVg4ODE5MF9pbml0KGRldiwgMSk7CisJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwkgICAgfQorCX0KKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9IC8qIGF4bmV0X2V2ZW50ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgTUlJIGludGVyZmFjZSBzdXBwb3J0CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1ESU9fU0hJRlRfQ0xLCQkweDAxCisjZGVmaW5lIE1ESU9fREFUQV9XUklURTAJMHgwMAorI2RlZmluZSBNRElPX0RBVEFfV1JJVEUxCTB4MDgKKyNkZWZpbmUgTURJT19EQVRBX1JFQUQJCTB4MDQKKyNkZWZpbmUgTURJT19NQVNLCQkweDBmCisjZGVmaW5lIE1ESU9fRU5CX0lOCQkweDAyCisKK3N0YXRpYyB2b2lkIG1kaW9fc3luYyhraW9fYWRkcl90IGFkZHIpCit7CisgICAgaW50IGJpdHM7CisgICAgZm9yIChiaXRzID0gMDsgYml0cyA8IDMyOyBiaXRzKyspIHsKKwlvdXRiX3AoTURJT19EQVRBX1dSSVRFMSwgYWRkcik7CisJb3V0Yl9wKE1ESU9fREFUQV9XUklURTEgfCBNRElPX1NISUZUX0NMSywgYWRkcik7CisgICAgfQorfQorCitzdGF0aWMgaW50IG1kaW9fcmVhZChraW9fYWRkcl90IGFkZHIsIGludCBwaHlfaWQsIGludCBsb2MpCit7CisgICAgdV9pbnQgY21kID0gKDB4ZjY8PDEwKXwocGh5X2lkPDw1KXxsb2M7CisgICAgaW50IGksIHJldHZhbCA9IDA7CisKKyAgICBtZGlvX3N5bmMoYWRkcik7CisgICAgZm9yIChpID0gMTQ7IGkgPj0gMDsgaS0tKSB7CisJaW50IGRhdCA9IChjbWQmKDE8PGkpKSA/IE1ESU9fREFUQV9XUklURTEgOiBNRElPX0RBVEFfV1JJVEUwOworCW91dGJfcChkYXQsIGFkZHIpOworCW91dGJfcChkYXQgfCBNRElPX1NISUZUX0NMSywgYWRkcik7CisgICAgfQorICAgIGZvciAoaSA9IDE5OyBpID4gMDsgaS0tKSB7CisJb3V0Yl9wKE1ESU9fRU5CX0lOLCBhZGRyKTsKKwlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpbmJfcChhZGRyKSAmIE1ESU9fREFUQV9SRUFEKSAhPSAwKTsKKwlvdXRiX3AoTURJT19FTkJfSU4gfCBNRElPX1NISUZUX0NMSywgYWRkcik7CisgICAgfQorICAgIHJldHVybiAocmV0dmFsPj4xKSAmIDB4ZmZmZjsKK30KKworc3RhdGljIHZvaWQgbWRpb193cml0ZShraW9fYWRkcl90IGFkZHIsIGludCBwaHlfaWQsIGludCBsb2MsIGludCB2YWx1ZSkKK3sKKyAgICB1X2ludCBjbWQgPSAoMHgwNTw8MjgpfChwaHlfaWQ8PDIzKXwobG9jPDwxOCl8KDE8PDE3KXx2YWx1ZTsKKyAgICBpbnQgaTsKKworICAgIG1kaW9fc3luYyhhZGRyKTsKKyAgICBmb3IgKGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsKKwlpbnQgZGF0ID0gKGNtZCYoMTw8aSkpID8gTURJT19EQVRBX1dSSVRFMSA6IE1ESU9fREFUQV9XUklURTA7CisJb3V0Yl9wKGRhdCwgYWRkcik7CisJb3V0Yl9wKGRhdCB8IE1ESU9fU0hJRlRfQ0xLLCBhZGRyKTsKKyAgICB9CisgICAgZm9yIChpID0gMTsgaSA+PSAwOyBpLS0pIHsKKwlvdXRiX3AoTURJT19FTkJfSU4sIGFkZHIpOworCW91dGJfcChNRElPX0VOQl9JTiB8IE1ESU9fU0hJRlRfQ0xLLCBhZGRyKTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGF4bmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBheG5ldF9kZXZfdCAqaW5mbyA9IFBSSVYoZGV2KTsKKyAgICBkZXZfbGlua190ICpsaW5rID0gJmluZm8tPmxpbms7CisgICAgCisgICAgREVCVUcoMiwgImF4bmV0X29wZW4oJyVzJylcbiIsIGRldi0+bmFtZSk7CisKKyAgICBpZiAoIURFVl9PSyhsaW5rKSkKKwlyZXR1cm4gLUVOT0RFVjsKKworICAgIGxpbmstPm9wZW4rKzsKKworICAgIHJlcXVlc3RfaXJxKGRldi0+aXJxLCBlaV9pcnFfd3JhcHBlciwgU0FfU0hJUlEsIGRldl9pbmZvLCBkZXYpOworCisgICAgaW5mby0+bGlua19zdGF0dXMgPSAweDAwOworICAgIGluaXRfdGltZXIoJmluZm8tPndhdGNoZG9nKTsKKyAgICBpbmZvLT53YXRjaGRvZy5mdW5jdGlvbiA9ICZlaV93YXRjaGRvZzsKKyAgICBpbmZvLT53YXRjaGRvZy5kYXRhID0gKHVfbG9uZylkZXY7CisgICAgaW5mby0+d2F0Y2hkb2cuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKyAgICBhZGRfdGltZXIoJmluZm8tPndhdGNoZG9nKTsKKworICAgIHJldHVybiBheF9vcGVuKGRldik7Cit9IC8qIGF4bmV0X29wZW4gKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgYXhuZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBheG5ldF9kZXZfdCAqaW5mbyA9IFBSSVYoZGV2KTsKKyAgICBkZXZfbGlua190ICpsaW5rID0gJmluZm8tPmxpbms7CisKKyAgICBERUJVRygyLCAiYXhuZXRfY2xvc2UoJyVzJylcbiIsIGRldi0+bmFtZSk7CisKKyAgICBheF9jbG9zZShkZXYpOworICAgIGZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworICAgIAorICAgIGxpbmstPm9wZW4tLTsKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgZGVsX3RpbWVyX3N5bmMoJmluZm8tPndhdGNoZG9nKTsKKworICAgIHJldHVybiAwOworfSAvKiBheG5ldF9jbG9zZSAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEhhcmQgcmVzZXQgdGhlIGNhcmQuICBUaGlzIHVzZWQgdG8gcGF1c2UgZm9yIHRoZSBzYW1lIHBlcmlvZCB0aGF0CisgICAgYSA4MzkwIHJlc2V0IGNvbW1hbmQgcmVxdWlyZWQsIGJ1dCB0aGF0IHNob3VsZG4ndCBiZSBuZWNlc3NhcnkuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBheG5ldF9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAga2lvX2FkZHJfdCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBpOworCisgICAgZWlfc3RhdHVzLnR4aW5nID0gZWlfc3RhdHVzLmRtYWluZyA9IDA7CisKKyAgICBvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgbmljX2Jhc2UgKyBFODM5MF9DTUQpOworCisgICAgb3V0YihpbmIobmljX2Jhc2UgKyBBWE5FVF9SRVNFVCksIG5pY19iYXNlICsgQVhORVRfUkVTRVQpOworCisgICAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJaWYgKChpbmJfcChuaWNfYmFzZStFTjBfSVNSKSAmIEVOSVNSX1JFU0VUKSAhPSAwKQorCSAgICBicmVhazsKKwl1ZGVsYXkoMTAwKTsKKyAgICB9CisgICAgb3V0Yl9wKEVOSVNSX1JFU0VULCBuaWNfYmFzZSArIEVOMF9JU1IpOyAvKiBBY2sgaW50ci4gKi8KKyAgICAKKyAgICBpZiAoaSA9PSAxMDApCisJcHJpbnRrKEtFUk5fRVJSICIlczogYXhuZXRfcmVzZXRfODM5MCgpIGRpZCBub3QgY29tcGxldGUuXG4iLAorCSAgICAgICBkZXYtPm5hbWUpOworICAgIAorfSAvKiBheG5ldF9yZXNldF84MzkwICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaXJxcmV0dXJuX3QgZWlfaXJxX3dyYXBwZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworICAgIFBSSVYoZGV2KS0+c3RhbGUgPSAwOworICAgIHJldHVybiBheF9pbnRlcnJ1cHQoaXJxLCBkZXZfaWQsIHJlZ3MpOworfQorCitzdGF0aWMgdm9pZCBlaV93YXRjaGRvZyh1X2xvbmcgYXJnKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikoYXJnKTsKKyAgICBheG5ldF9kZXZfdCAqaW5mbyA9IFBSSVYoZGV2KTsKKyAgICBraW9fYWRkcl90IG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAga2lvX2FkZHJfdCBtaWlfYWRkciA9IG5pY19iYXNlICsgQVhORVRfTUlJX0VFUDsKKyAgICB1X3Nob3J0IGxpbms7CisKKyAgICBpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpIGdvdG8gcmVzY2hlZHVsZTsKKworICAgIC8qIENoZWNrIGZvciBwZW5kaW5nIGludGVycnVwdCB3aXRoIGV4cGlyZWQgbGF0ZW5jeSB0aW1lcjogd2l0aAorICAgICAgIHRoaXMsIHdlIGNhbiBsaW1wIGFsb25nIGV2ZW4gaWYgdGhlIGludGVycnVwdCBpcyBibG9ja2VkICovCisgICAgaWYgKGluZm8tPnN0YWxlKysgJiYgKGluYl9wKG5pY19iYXNlICsgRU4wX0lTUikgJiBFTklTUl9BTEwpKSB7CisJaWYgKCFpbmZvLT5mYXN0X3BvbGwpCisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBpbnRlcnJ1cHQocykgZHJvcHBlZCFcbiIsIGRldi0+bmFtZSk7CisJZWlfaXJxX3dyYXBwZXIoZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJaW5mby0+ZmFzdF9wb2xsID0gSFo7CisgICAgfQorICAgIGlmIChpbmZvLT5mYXN0X3BvbGwpIHsKKwlpbmZvLT5mYXN0X3BvbGwtLTsKKwlpbmZvLT53YXRjaGRvZy5leHBpcmVzID0gamlmZmllcyArIDE7CisJYWRkX3RpbWVyKCZpbmZvLT53YXRjaGRvZyk7CisJcmV0dXJuOworICAgIH0KKworICAgIGlmIChpbmZvLT5waHlfaWQgPCAwKQorCWdvdG8gcmVzY2hlZHVsZTsKKyAgICBsaW5rID0gbWRpb19yZWFkKG1paV9hZGRyLCBpbmZvLT5waHlfaWQsIDEpOworICAgIGlmICghbGluayB8fCAobGluayA9PSAweGZmZmYpKSB7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1JSSBpcyBtaXNzaW5nIVxuIiwgZGV2LT5uYW1lKTsKKwlpbmZvLT5waHlfaWQgPSAtMTsKKwlnb3RvIHJlc2NoZWR1bGU7CisgICAgfQorCisgICAgbGluayAmPSAweDAwMDQ7CisgICAgaWYgKGxpbmsgIT0gaW5mby0+bGlua19zdGF0dXMpIHsKKwl1X3Nob3J0IHAgPSBtZGlvX3JlYWQobWlpX2FkZHIsIGluZm8tPnBoeV9pZCwgNSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGxpbmsgYmVhdFxuIiwgZGV2LT5uYW1lLAorCSAgICAgICAobGluaykgPyAiZm91bmQiIDogImxvc3QiKTsKKwlpZiAobGluaykgeworCSAgICBpbmZvLT5kdXBsZXhfZmxhZyA9IChwICYgMHgwMTQwKSA/IDB4ODAgOiAweDAwOworCSAgICBpZiAocCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGF1dG9uZWdvdGlhdGlvbiBjb21wbGV0ZTogIgorCQkgICAgICAgIiVzYmFzZVQtJWNEIHNlbGVjdGVkXG4iLCBkZXYtPm5hbWUsCisJCSAgICAgICAoKHAgJiAweDAxODApID8gIjEwMCIgOiAiMTAiKSwKKwkJICAgICAgICgocCAmIDB4MDE0MCkgPyAnRicgOiAnSCcpKTsKKwkgICAgZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICIlczogbGluayBwYXJ0bmVyIGRpZCBub3QgYXV0b25lZ290aWF0ZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJICAgIEFYODgxOTBfaW5pdChkZXYsIDEpOworCX0KKwlpbmZvLT5saW5rX3N0YXR1cyA9IGxpbms7CisgICAgfQorCityZXNjaGVkdWxlOgorICAgIGluZm8tPndhdGNoZG9nLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisgICAgYWRkX3RpbWVyKCZpbmZvLT53YXRjaGRvZyk7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgImF4bmV0X2NzIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBuZXRkZXZfZ2V0X2RydmluZm8sCit9OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBheG5ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworICAgIGF4bmV0X2Rldl90ICppbmZvID0gUFJJVihkZXYpOworICAgIHUxNiAqZGF0YSA9ICh1MTYgKikmcnEtPmlmcl9pZnJ1OworICAgIGtpb19hZGRyX3QgbWlpX2FkZHIgPSBkZXYtPmJhc2VfYWRkciArIEFYTkVUX01JSV9FRVA7CisgICAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIFNJT0NHTUlJUEhZOgorCWRhdGFbMF0gPSBpbmZvLT5waHlfaWQ7CisgICAgY2FzZSBTSU9DR01JSVJFRzoJCS8qIFJlYWQgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwlkYXRhWzNdID0gbWRpb19yZWFkKG1paV9hZGRyLCBkYXRhWzBdLCBkYXRhWzFdICYgMHgxZik7CisJcmV0dXJuIDA7CisgICAgY2FzZSBTSU9DU01JSVJFRzoJCS8qIFdyaXRlIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCSAgICByZXR1cm4gLUVQRVJNOworCW1kaW9fd3JpdGUobWlpX2FkZHIsIGRhdGFbMF0sIGRhdGFbMV0gJiAweDFmLCBkYXRhWzJdKTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwKKwkJCSBpbnQgcmluZ19wYWdlKQoreworICAgIGtpb19hZGRyX3QgbmljX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIG91dGJfcCgwLCBuaWNfYmFzZSArIEVOMF9SU0FSTE8pOwkJLyogT24gcGFnZSBib3VuZGFyeSAqLworICAgIG91dGJfcChyaW5nX3BhZ2UsIG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisgICAgb3V0Yl9wKEU4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIEFYTkVUX0NNRCk7CisKKyAgICBpbnN3KG5pY19iYXNlICsgQVhORVRfREFUQVBPUlQsIGhkciwKKwkgICAgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKT4+MSk7CisgICAgLyogRml4IGZvciBiaWcgZW5kaWFuIHN5c3RlbXMgKi8KKyAgICBoZHItPmNvdW50ID0gbGUxNl90b19jcHUoaGRyLT5jb3VudCk7CisKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGJsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCXN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCkKK3sKKyAgICBraW9fYWRkcl90IG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IHhmZXJfY291bnQgPSBjb3VudDsKKyAgICBjaGFyICpidWYgPSBza2ItPmRhdGE7CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgICBpZiAoKGVpX2RlYnVnID4gNCkgJiYgKGNvdW50ICE9IDQpKQorCXByaW50ayhLRVJOX0RFQlVHICIlczogW2JpPSVkXVxuIiwgZGV2LT5uYW1lLCBjb3VudCs0KTsKKyNlbmRpZgorICAgIG91dGJfcChyaW5nX29mZnNldCAmIDB4ZmYsIG5pY19iYXNlICsgRU4wX1JTQVJMTyk7CisgICAgb3V0Yl9wKHJpbmdfb2Zmc2V0ID4+IDgsIG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisgICAgb3V0Yl9wKEU4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIEFYTkVUX0NNRCk7CisKKyAgICBpbnN3KG5pY19iYXNlICsgQVhORVRfREFUQVBPUlQsYnVmLGNvdW50Pj4xKTsKKyAgICBpZiAoY291bnQgJiAweDAxKQorCWJ1Zltjb3VudC0xXSA9IGluYihuaWNfYmFzZSArIEFYTkVUX0RBVEFQT1JUKSwgeGZlcl9jb3VudCsrOworCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJIGNvbnN0IHVfY2hhciAqYnVmLCBjb25zdCBpbnQgc3RhcnRfcGFnZSkKK3sKKyAgICBraW9fYWRkcl90IG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgICBpZiAoZWlfZGVidWcgPiA0KQorCXByaW50ayhLRVJOX0RFQlVHICIlczogW2JvPSVkXVxuIiwgZGV2LT5uYW1lLCBjb3VudCk7CisjZW5kaWYKKworICAgIC8qIFJvdW5kIHRoZSBjb3VudCB1cCBmb3Igd29yZCB3cml0ZXMuICBEbyB3ZSBuZWVkIHRvIGRvIHRoaXM/CisgICAgICAgV2hhdCBlZmZlY3Qgd2lsbCBhbiBvZGQgYnl0ZSBjb3VudCBoYXZlIG9uIHRoZSA4MzkwPworICAgICAgIEkgc2hvdWxkIGNoZWNrIHNvbWVkYXkuICovCisgICAgaWYgKGNvdW50ICYgMHgwMSkKKwljb3VudCsrOworCisgICAgb3V0Yl9wKDB4MDAsIG5pY19iYXNlICsgRU4wX1JTQVJMTyk7CisgICAgb3V0Yl9wKHN0YXJ0X3BhZ2UsIG5pY19iYXNlICsgRU4wX1JTQVJISSk7CisgICAgb3V0Yl9wKEU4MzkwX1JXUklURStFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBBWE5FVF9DTUQpOworICAgIG91dHN3KG5pY19iYXNlICsgQVhORVRfREFUQVBPUlQsIGJ1ZiwgY291bnQ+PjEpOworfQorCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgYXhuZXRfY3NfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSAiYXhuZXRfY3MiLAorCX0sCisJLmF0dGFjaAkJPSBheG5ldF9hdHRhY2gsCisJLmRldGFjaAkJPSBheG5ldF9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2F4bmV0X2NzKHZvaWQpCit7CisJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJmF4bmV0X2NzX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2F4bmV0X2NzKHZvaWQpCit7CisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZheG5ldF9jc19kcml2ZXIpOworCUJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9heG5ldF9jcyk7Cittb2R1bGVfZXhpdChleGl0X2F4bmV0X2NzKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIDgzOTAuYzogQSBnZW5lcmFsIE5TODM5MCBldGhlcm5ldCBkcml2ZXIgY29yZSBmb3IgbGludXguICovCisvKgorCVdyaXR0ZW4gMTk5Mi05NCBieSBEb25hbGQgQmVja2VyLgorICAKKwlDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisJRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisgIFRoaXMgaXMgdGhlIGNoaXAtc3BlY2lmaWMgY29kZSBmb3IgbWFueSA4MzkwLWJhc2VkIGV0aGVybmV0IGFkYXB0b3JzLgorICBUaGlzIGlzIG5vdCBhIGNvbXBsZXRlIGRyaXZlciwgaXQgbXVzdCBiZSBjb21iaW5lZCB3aXRoIGJvYXJkLXNwZWNpZmljCisgIGNvZGUgc3VjaCBhcyBuZS5jLCB3ZC5jLCAzYzUwMy5jLCBldGMuCisKKyAgU2VlaW5nIGhvdyBhdCBsZWFzdCBlaWdodCBkcml2ZXJzIHVzZSB0aGlzIGNvZGUsIChub3QgY291bnRpbmcgdGhlCisgIFBDTUNJQSBvbmVzIGVpdGhlcikgaXQgaXMgZWFzeSB0byBicmVhayBzb21lIGNhcmQgYnkgd2hhdCBzZWVtcyBsaWtlCisgIGEgc2ltcGxlIGlubm9jZW50IGNoYW5nZS4gUGxlYXNlIGNvbnRhY3QgbWUgb3IgRG9uYWxkIGlmIHlvdSB0aGluaworICB5b3UgaGF2ZSBmb3VuZCBzb21ldGhpbmcgdGhhdCBuZWVkcyBjaGFuZ2luZy4gLS0gUEcKKworICBDaGFuZ2Vsb2c6CisKKyAgUGF1bCBHb3J0bWFrZXIJOiByZW1vdmUgc2V0X2JpdCBsb2NrLCBvdGhlciBjbGVhbnVwcy4KKyAgUGF1bCBHb3J0bWFrZXIJOiBhZGQgZWlfZ2V0XzgzOTBfaGRyKCkgc28gd2UgY2FuIHBhc3Mgc2tiJ3MgdG8gCisJCQkgIGVpX2Jsb2NrX2lucHV0KCkgZm9yIGV0aF9pb19jb3B5X2FuZF9zdW0oKS4KKyAgUGF1bCBHb3J0bWFrZXIJOiBleGNoYW5nZSBzdGF0aWMgaW50IGVpX3Bpbmdwb25nIGZvciBhICNkZWZpbmUsCisJCQkgIGFsc28gYWRkIGJldHRlciBUeCBlcnJvciBoYW5kbGluZy4KKyAgUGF1bCBHb3J0bWFrZXIJOiByZXdyaXRlIFJ4IG92ZXJydW4gaGFuZGxpbmcgYXMgcGVyIE5TIHNwZWNzLgorICBBbGV4ZXkgS3V6bmV0c292CTogdXNlIHRoZSA4MzkwJ3Mgc2l4IGJpdCBoYXNoIG11bHRpY2FzdCBmaWx0ZXIuCisgIFBhdWwgR29ydG1ha2VyCTogdHdlYWsgQU5LJ3MgYWJvdmUgbXVsdGljYXN0IGNoYW5nZXMgYSBiaXQuCisgIFBhdWwgR29ydG1ha2VyCTogdXBkYXRlIHBhY2tldCBzdGF0aXN0aWNzIGZvciB2Mi4xLngKKyAgQWxhbiBDb3gJCTogc3VwcG9ydCBhcmJpdGFyeSBzdHVwaWQgcG9ydCBtYXBwaW5ncyBvbiB0aGUKKyAgCQkJICA2OEsgTWFjaW50b3NoLiBTdXBwb3J0ID4xNmJpdCBJL08gc3BhY2VzCisgIFBhdWwgR29ydG1ha2VyCTogYWRkIGttb2Qgc3VwcG9ydCBmb3IgYXV0by1sb2FkaW5nIG9mIHRoZSA4MzkwCisJCQkgIG1vZHVsZSBieSBhbGwgZHJpdmVycyB0aGF0IHJlcXVpcmUgaXQuCisgIEFsYW4gQ294CQk6IFNwaW5sb2NraW5nIHdvcmssIGFkZGVkICdCVUdfODNDNjkwJworICBQYXVsIEdvcnRtYWtlcgk6IFNlcGFyYXRlIG91dCBUeCB0aW1lb3V0IGNvZGUgZnJvbSBUeCBwYXRoLgorCisgIFNvdXJjZXM6CisgIFRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExBTiBEYXRhYm9vaywgYW5kIHRoZSAzQ29tIDNjNTAzIGRhdGFib29rLgorCisgICovCisKK3N0YXRpYyBjb25zdCBjaGFyICp2ZXJzaW9uXzgzOTAgPQorICAgICI4MzkwLmM6djEuMTBjdnMgOS8yMy85NCBEb25hbGQgQmVja2VyIChiZWNrZXJAc2N5bGQuY29tKVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorCisjZGVmaW5lIEJVR184M0M2OTAKKworLyogVGhlc2UgYXJlIHRoZSBvcGVyYXRpb25hbCBmdW5jdGlvbiBpbnRlcmZhY2VzIHRvIGJvYXJkLXNwZWNpZmljCisgICByb3V0aW5lcy4KKwl2b2lkIHJlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKwkJUmVzZXRzIHRoZSBib2FyZCBhc3NvY2lhdGVkIHdpdGggREVWLCBpbmNsdWRpbmcgYSBoYXJkd2FyZSByZXNldCBvZgorCQl0aGUgODM5MC4gIFRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhIHRyYW5zbWl0IHRpbWVvdXQsIGFuZAorCQlpdCBpcyBhbHdheXMgZm9sbG93ZWQgYnkgODM5MF9pbml0KCkuCisJdm9pZCBibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkJCSAgaW50IHN0YXJ0X3BhZ2UpCisJCVdyaXRlIHRoZSBDT1VOVCBieXRlcyBvZiBCVUYgdG8gdGhlIHBhY2tldCBidWZmZXIgYXQgU1RBUlRfUEFHRS4gIFRoZQorCQkicGFnZSIgdmFsdWUgdXNlcyB0aGUgODM5MCdzIDI1Ni1ieXRlIHBhZ2VzLgorCXZvaWQgZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSkKKwkJUmVhZCB0aGUgNCBieXRlLCBwYWdlIGFsaWduZWQgODM5MCBoZWFkZXIuICpJZiogdGhlcmUgaXMgYQorCQlzdWJzZXF1ZW50IHJlYWQsIGl0IHdpbGwgYmUgb2YgdGhlIHJlc3Qgb2YgdGhlIHBhY2tldC4KKwl2b2lkIGJsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KQorCQlSZWFkIENPVU5UIGJ5dGVzIGZyb20gdGhlIHBhY2tldCBidWZmZXIgaW50byB0aGUgc2tiIGRhdGEgYXJlYS4gU3RhcnQgCisJCXJlYWRpbmcgZnJvbSBSSU5HX09GRlNFVCwgdGhlIGFkZHJlc3MgYXMgdGhlIDgzOTAgc2VlcyBpdC4gIFRoaXMgd2lsbCBhbHdheXMKKwkJZm9sbG93IHRoZSByZWFkIG9mIHRoZSA4MzkwIGhlYWRlci4gCisqLworI2RlZmluZSBlaV9yZXNldF84MzkwIChlaV9sb2NhbC0+cmVzZXRfODM5MCkKKyNkZWZpbmUgZWlfYmxvY2tfb3V0cHV0IChlaV9sb2NhbC0+YmxvY2tfb3V0cHV0KQorI2RlZmluZSBlaV9ibG9ja19pbnB1dCAoZWlfbG9jYWwtPmJsb2NrX2lucHV0KQorI2RlZmluZSBlaV9nZXRfODM5MF9oZHIgKGVpX2xvY2FsLT5nZXRfODM5MF9oZHIpCisKKy8qIHVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sID4yIGZvciBkZWJ1ZyAqLworI2lmbmRlZiBlaV9kZWJ1ZworaW50IGVpX2RlYnVnID0gMTsKKyNlbmRpZgorCisvKiBJbmRleCB0byBmdW5jdGlvbnMuICovCitzdGF0aWMgdm9pZCBlaV90eF9pbnRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWlfdHhfZXJyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZWlfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGVpX3JlY2VpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBlaV9yeF9vdmVycnVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBSb3V0aW5lcyBnZW5lcmljIHRvIE5TODM5MC1iYXNlZCBib2FyZHMuICovCitzdGF0aWMgdm9pZCBOUzgzOTBfdHJpZ2dlcl9zZW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBsZW5ndGgsCisJCQkJCQkJCWludCBzdGFydF9wYWdlKTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGRvX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoKKyAqCVNNUCBhbmQgdGhlIDgzOTAgc2V0dXAuCisgKgorICoJVGhlIDgzOTAgaXNudCBleGFjdGx5IGRlc2lnbmVkIHRvIGJlIG11bHRpdGhyZWFkZWQgb24gUlgvVFguIFRoZXJlIGlzCisgKglhIHBhZ2UgcmVnaXN0ZXIgdGhhdCBjb250cm9scyBiYW5rIGFuZCBwYWNrZXQgYnVmZmVyIGFjY2Vzcy4gV2UgZ3VhcmQKKyAqCXRoaXMgd2l0aCBlaV9sb2NhbC0+cGFnZV9sb2NrLiBOb2JvZHkgc2hvdWxkIGFzc3VtZSBvciBzZXQgdGhlIHBhZ2Ugb3RoZXIKKyAqCXRoYW4gemVybyB3aGVuIHRoZSBsb2NrIGlzIG5vdCBoZWxkLiBMb2NrIGhvbGRlcnMgbXVzdCByZXN0b3JlIHBhZ2UgMAorICoJYmVmb3JlIHVubG9ja2luZy4gRXZlbiBwdXJlIHJlYWRlcnMgbXVzdCB0YWtlIHRoZSBsb2NrIHRvIHByb3RlY3QgaW4gCisgKglwYWdlIDAuCisgKgorICoJVG8gbWFrZSBsaWZlIGRpZmZpY3VsdCB0aGUgY2hpcCBjYW4gYWxzbyBiZSB2ZXJ5IHNsb3cuIFdlIHRoZXJlZm9yZSBjYW4ndAorICoJanVzdCB1c2Ugc3BpbmxvY2tzLiBGb3IgdGhlIGxvbmdlciBsb2NrdXBzIHdlIGRpc2FibGUgdGhlIGlycSB0aGUgZGV2aWNlCisgKglzaXRzIG9uIGFuZCBob2xkIHRoZSBsb2NrLiBXZSBtdXN0IGhvbGQgdGhlIGxvY2sgYmVjYXVzZSB0aGVyZSBpcyBhIGR1YWwKKyAqCXByb2Nlc3NvciBjYXNlIG90aGVyIHRoYW4gaW50ZXJydXB0cyAoZ2V0IHN0YXRzL3NldCBtdWx0aWNhc3QgbGlzdCBpbgorICoJcGFyYWxsZWwgd2l0aCBlYWNoIG90aGVyIGFuZCB0cmFuc21pdCkuCisgKgorICoJTm90ZTogaW4gdGhlb3J5IHdlIGNhbiBqdXN0IGRpc2FibGUgdGhlIGlycSBvbiB0aGUgY2FyZCBfYnV0XyB0aGVyZSBpcworICoJYSBsYXRlbmN5IG9uIFNNUCBpcnEgZGVsaXZlcnkuIFNvIHdlIGNhbiBlYXNpbHkgZ28gImRpc2FibGUgaXJxIiAic3luYyBpcnFzIgorICoJZW50ZXIgbG9jaywgdGFrZSB0aGUgcXVldWVkIGlycS4gU28gd2Ugd2FkZGxlIGluc3RlYWQgb2YgZmx5aW5nLgorICoKKyAqCUZpbmFsbHkgYnkgc3BlY2lhbCBhcnJhbmdlbWVudCBmb3IgdGhlIHB1cnBvc2Ugb2YgYmVpbmcgZ2VuZXJhbGx5IAorICoJYW5ub3lpbmcgdGhlIHRyYW5zbWl0IGZ1bmN0aW9uIGlzIGNhbGxlZCBiaCBhdG9taWMuIFRoYXQgcGxhY2VzCisgKglyZXN0cmljdGlvbnMgb24gdGhlIHVzZXIgY29udGV4dCBjYWxsZXJzIGFzIGRpc2FibGVfaXJxIHdvbid0IHNhdmUKKyAqCXRoZW0uCisgKi8KKyAKKy8qKgorICogYXhfb3BlbiAtIE9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuCisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSB0byBpbml0aWFsaXplCisgKgorICogVGhpcyByb3V0aW5lIGdvZXMgYWxsLW91dCwgc2V0dGluZyBldmVyeXRoaW5nCisgKiB1cCBhbmV3IGF0IGVhY2ggb3BlbiwgZXZlbiB0aG91Z2ggbWFueSBvZiB0aGVzZSByZWdpc3RlcnMgc2hvdWxkIG9ubHkKKyAqIG5lZWQgdG8gYmUgc2V0IG9uY2UgYXQgYm9vdC4KKyAqLworc3RhdGljIGludCBheF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisKKyNpZmRlZiBIQVZFX1RYX1RJTUVPVVQKKwkvKiBUaGUgY2FyZCBJL08gcGFydCBvZiB0aGUgZHJpdmVyIChlLmcuIDNjNTAzKSBjYW4gaG9vayBhIFR4IHRpbWVvdXQKKwkgICAgd3JhcHBlciB0aGF0IGRvZXMgZS5nLiBtZWRpYSBjaGVjayAmIHRoZW4gY2FsbHMgZWlfdHhfdGltZW91dC4gKi8KKwlpZiAoZGV2LT50eF90aW1lb3V0ID09IE5VTEwpCisJCSBkZXYtPnR4X3RpbWVvdXQgPSBlaV90eF90aW1lb3V0OworCWlmIChkZXYtPndhdGNoZG9nX3RpbWVvIDw9IDApCisJCSBkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKyNlbmRpZgorCisJLyoKKwkgKglHcmFiIHRoZSBwYWdlIGxvY2sgc28gd2Ugb3duIHRoZSByZWdpc3RlciBzZXQsIHRoZW4gY2FsbAorCSAqCXRoZSBpbml0IGZ1bmN0aW9uLgorCSAqLworICAgICAgCisgICAgICAJc3Bpbl9sb2NrX2lycXNhdmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwlBWDg4MTkwX2luaXQoZGV2LCAxKTsKKwkvKiBTZXQgdGhlIGZsYWcgYmVmb3JlIHdlIGRyb3AgdGhlIGxvY2ssIFRoYXQgd2F5IHRoZSBJUlEgYXJyaXZlcworCSAgIGFmdGVyIGl0cyBzZXQgYW5kIHdlIGdldCBubyBzaWxseSB3YXJuaW5ncyAqLworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgICAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOworCWVpX2xvY2FsLT5pcnFsb2NrID0gMDsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBkZXZfbG9jayhkZXYpICgoKHN0cnVjdCBlaV9kZXZpY2UgKiluZXRkZXZfcHJpdihkZXYpKS0+cGFnZV9sb2NrKQorCisvKioKKyAqIGF4X2Nsb3NlIC0gc2h1dCBkb3duIG5ldHdvcmsgZGV2aWNlCisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSB0byBjbG9zZQorICoKKyAqIE9wcG9zaXRlIG9mIGF4X29wZW4oKS4gT25seSB1c2VkIHdoZW4gImlmY29uZmlnIDxkZXZuYW1lPiBkb3duIiBpcyBkb25lLgorICovCitpbnQgYXhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiAgICAgIEhvbGQgdGhlIHBhZ2UgbG9jayBkdXJpbmcgY2xvc2UKKwkgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZfbG9jayhkZXYpLCBmbGFncyk7CisJQVg4ODE5MF9pbml0KGRldiwgMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X2xvY2soZGV2KSwgZmxhZ3MpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBlaV90eF90aW1lb3V0IC0gaGFuZGxlIHRyYW5zbWl0IHRpbWUgb3V0IGNvbmRpdGlvbgorICogQGRldjogbmV0d29yayBkZXZpY2Ugd2hpY2ggaGFzIGFwcGFyZW50bHkgZmFsbGVuIGFzbGVlcAorICoKKyAqIENhbGxlZCBieSBrZXJuZWwgd2hlbiBkZXZpY2UgbmV2ZXIgYWNrbm93bGVkZ2VzIGEgdHJhbnNtaXQgaGFzCisgKiBjb21wbGV0ZWQgKG9yIGZhaWxlZCkgLSBpLmUuIG5ldmVyIHBvc3RlZCBhIFR4IHJlbGF0ZWQgaW50ZXJydXB0LgorICovCisKK3ZvaWQgZWlfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgdHhzciwgaXNyLCB0aWNrc3NvZmFyID0gamlmZmllcyAtIGRldi0+dHJhbnNfc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWVpX2xvY2FsLT5zdGF0LnR4X2Vycm9ycysrOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVpX2xvY2FsLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwl0eHNyID0gaW5iKGU4MzkwX2Jhc2UrRU4wX1RTUik7CisJaXNyID0gaW5iKGU4MzkwX2Jhc2UrRU4wX0lTUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWlfbG9jYWwtPnBhZ2VfbG9jaywgZmxhZ3MpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUeCB0aW1lZCBvdXQsICVzIFRTUj0lIzJ4LCBJU1I9JSMyeCwgdD0lZC5cbiIsCisJCWRldi0+bmFtZSwgKHR4c3IgJiBFTlRTUl9BQlQpID8gImV4Y2VzcyBjb2xsaXNpb25zLiIgOgorCQkoaXNyKSA/ICJsb3N0IGludGVycnVwdD8iIDogImNhYmxlIHByb2JsZW0/IiwgdHhzciwgaXNyLCB0aWNrc3NvZmFyKTsKKworCWlmICghaXNyICYmICFlaV9sb2NhbC0+c3RhdC50eF9wYWNrZXRzKSAKKwl7CisJCS8qIFRoZSA4MzkwIHByb2JhYmx5IGhhc24ndCBnb3R0ZW4gb24gdGhlIGNhYmxlIHlldC4gKi8KKwkJZWlfbG9jYWwtPmludGVyZmFjZV9udW0gXj0gMTsgICAvKiBUcnkgYSBkaWZmZXJlbnQgeGN2ci4gICovCisJfQorCisJLyogVWdseSBidXQgYSByZXNldCBjYW4gYmUgc2xvdywgeWV0IG11c3QgYmUgcHJvdGVjdGVkICovCisJCQorCWRpc2FibGVfaXJxX25vc3luYyhkZXYtPmlycSk7CisJc3Bpbl9sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKKwkJCisJLyogVHJ5IHRvIHJlc3RhcnQgdGhlIGNhcmQuICBQZXJoYXBzIHRoZSB1c2VyIGhhcyBmaXhlZCBzb21ldGhpbmcuICovCisJZWlfcmVzZXRfODM5MChkZXYpOworCUFYODgxOTBfaW5pdChkZXYsIDEpOworCQkKKwlzcGluX3VubG9jaygmZWlfbG9jYWwtPnBhZ2VfbG9jayk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorICAgIAorLyoqCisgKiBlaV9zdGFydF94bWl0IC0gYmVnaW4gcGFja2V0IHRyYW5zbWlzc2lvbgorICogQHNrYjogcGFja2V0IHRvIGJlIHNlbnQKKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHRvIHdoaWNoIHBhY2tldCBpcyBzZW50CisgKgorICogU2VuZHMgYSBwYWNrZXQgdG8gYW4gODM5MCBuZXR3b3JrIGRldmljZS4KKyAqLworIAorc3RhdGljIGludCBlaV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworCWludCBsZW5ndGgsIHNlbmRfbGVuZ3RoLCBvdXRwdXRfcGFnZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IHBhY2tldFtFVEhfWkxFTl07CisJCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJbGVuZ3RoID0gc2tiLT5sZW47CisKKwkvKiBNYXNrIGludGVycnVwdHMgZnJvbSB0aGUgZXRoZXJjYXJkLiAKKwkgICBTTVA6IFdlIGhhdmUgdG8gZ3JhYiB0aGUgbG9jayBoZXJlIG90aGVyd2lzZSB0aGUgSVJRIGhhbmRsZXIKKwkgICBvbiBhbm90aGVyIENQVSBjYW4gZmxpcCB3aW5kb3cgYW5kIHJhY2UgdGhlIElSUSBtYXNrIHNldC4gV2UgZW5kCisJICAgdXAgdHJhc2hpbmcgdGhlIG1jYXN0IGZpbHRlciBub3QgZGlzYWJsaW5nIGlycXMgaWYgd2UgZG9uJ3QgbG9jayAqLworCSAgIAorCXNwaW5fbG9ja19pcnFzYXZlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7CisJb3V0Yl9wKDB4MDAsIGU4MzkwX2Jhc2UgKyBFTjBfSU1SKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7CisJCisJLyoKKwkgKglTbG93IHBoYXNlIHdpdGggbG9jayBoZWxkLgorCSAqLworCSAKKwlkaXNhYmxlX2lycV9ub3N5bmMoZGV2LT5pcnEpOworCQorCXNwaW5fbG9jaygmZWlfbG9jYWwtPnBhZ2VfbG9jayk7CisJCisJZWlfbG9jYWwtPmlycWxvY2sgPSAxOworCisJc2VuZF9sZW5ndGggPSBFVEhfWkxFTiA8IGxlbmd0aCA/IGxlbmd0aCA6IEVUSF9aTEVOOworCQorCS8qCisJICogV2UgaGF2ZSB0d28gVHggc2xvdHMgYXZhaWxhYmxlIGZvciB1c2UuIEZpbmQgdGhlIGZpcnN0IGZyZWUKKwkgKiBzbG90LCBhbmQgdGhlbiBwZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNrcy4gV2l0aCB0d28gVHggYnVmcywKKwkgKiB5b3UgZ2V0IHZlcnkgY2xvc2UgdG8gdHJhbnNtaXR0aW5nIGJhY2stdG8tYmFjayBwYWNrZXRzLiBXaXRoCisJICogb25seSBvbmUgVHggYnVmLCB0aGUgdHJhbnNtaXR0ZXIgc2l0cyBpZGxlIHdoaWxlIHlvdSByZWxvYWQgdGhlCisJICogY2FyZCwgbGVhdmluZyBhIHN1YnN0YW50aWFsIGdhcCBiZXR3ZWVuIGVhY2ggdHJhbnNtaXR0ZWQgcGFja2V0LgorCSAqLworCisJaWYgKGVpX2xvY2FsLT50eDEgPT0gMCkgCisJeworCQlvdXRwdXRfcGFnZSA9IGVpX2xvY2FsLT50eF9zdGFydF9wYWdlOworCQllaV9sb2NhbC0+dHgxID0gc2VuZF9sZW5ndGg7CisJCWlmIChlaV9kZWJ1ZyAgJiYgIGVpX2xvY2FsLT50eDIgPiAwKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpZGxlIHRyYW5zbWl0dGVyIHR4Mj0lZCwgbGFzdHR4PSVkLCB0eGluZz0lZC5cbiIsCisJCQkJZGV2LT5uYW1lLCBlaV9sb2NhbC0+dHgyLCBlaV9sb2NhbC0+bGFzdHR4LCBlaV9sb2NhbC0+dHhpbmcpOworCX0KKwllbHNlIGlmIChlaV9sb2NhbC0+dHgyID09IDApIAorCXsKKwkJb3V0cHV0X3BhZ2UgPSBlaV9sb2NhbC0+dHhfc3RhcnRfcGFnZSArIFRYX1BBR0VTLzI7CisJCWVpX2xvY2FsLT50eDIgPSBzZW5kX2xlbmd0aDsKKwkJaWYgKGVpX2RlYnVnICAmJiAgZWlfbG9jYWwtPnR4MSA+IDApCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlkbGUgdHJhbnNtaXR0ZXIsIHR4MT0lZCwgbGFzdHR4PSVkLCB0eGluZz0lZC5cbiIsCisJCQkJZGV2LT5uYW1lLCBlaV9sb2NhbC0+dHgxLCBlaV9sb2NhbC0+bGFzdHR4LCBlaV9sb2NhbC0+dHhpbmcpOworCX0KKwllbHNlCisJewkvKiBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUuICovCisJCWlmIChlaV9kZWJ1ZykKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTm8gVHggYnVmZmVycyBmcmVlISB0eDE9JWQgdHgyPSVkIGxhc3Q9JWRcbiIsCisJCQkJZGV2LT5uYW1lLCBlaV9sb2NhbC0+dHgxLCBlaV9sb2NhbC0+dHgyLCBlaV9sb2NhbC0+bGFzdHR4KTsKKwkJZWlfbG9jYWwtPmlycWxvY2sgPSAwOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCW91dGJfcChFTklTUl9BTEwsIGU4MzkwX2Jhc2UgKyBFTjBfSU1SKTsKKwkJc3Bpbl91bmxvY2soJmVpX2xvY2FsLT5wYWdlX2xvY2spOworCQllbmFibGVfaXJxKGRldi0+aXJxKTsKKwkJZWlfbG9jYWwtPnN0YXQudHhfZXJyb3JzKys7CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogT2theSwgbm93IHVwbG9hZCB0aGUgcGFja2V0IGFuZCB0cmlnZ2VyIGEgc2VuZCBpZiB0aGUgdHJhbnNtaXR0ZXIKKwkgKiBpc24ndCBhbHJlYWR5IHNlbmRpbmcuIElmIGl0IGlzIGJ1c3ksIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aWxsCisJICogdHJpZ2dlciB0aGUgc2VuZCBsYXRlciwgdXBvbiByZWNlaXZpbmcgYSBUeCBkb25lIGludGVycnVwdC4KKwkgKi8KKworCWlmIChsZW5ndGggPT0gc2tiLT5sZW4pCisJCWVpX2Jsb2NrX291dHB1dChkZXYsIGxlbmd0aCwgc2tiLT5kYXRhLCBvdXRwdXRfcGFnZSk7CisJZWxzZSB7CisJCW1lbXNldChwYWNrZXQsIDAsIEVUSF9aTEVOKTsKKwkJbWVtY3B5KHBhY2tldCwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCWVpX2Jsb2NrX291dHB1dChkZXYsIGxlbmd0aCwgcGFja2V0LCBvdXRwdXRfcGFnZSk7CisJfQorCQorCWlmICghIGVpX2xvY2FsLT50eGluZykgCisJeworCQllaV9sb2NhbC0+dHhpbmcgPSAxOworCQlOUzgzOTBfdHJpZ2dlcl9zZW5kKGRldiwgc2VuZF9sZW5ndGgsIG91dHB1dF9wYWdlKTsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCWlmIChvdXRwdXRfcGFnZSA9PSBlaV9sb2NhbC0+dHhfc3RhcnRfcGFnZSkgCisJCXsKKwkJCWVpX2xvY2FsLT50eDEgPSAtMTsKKwkJCWVpX2xvY2FsLT5sYXN0dHggPSAtMTsKKwkJfQorCQllbHNlIAorCQl7CisJCQllaV9sb2NhbC0+dHgyID0gLTE7CisJCQllaV9sb2NhbC0+bGFzdHR4ID0gLTI7CisJCX0KKwl9CisJZWxzZSBlaV9sb2NhbC0+dHhxdWV1ZSsrOworCisJaWYgKGVpX2xvY2FsLT50eDEgICYmICBlaV9sb2NhbC0+dHgyKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJZWxzZQorCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJLyogVHVybiA4MzkwIGludGVycnVwdHMgYmFjayBvbi4gKi8KKwllaV9sb2NhbC0+aXJxbG9jayA9IDA7CisJb3V0Yl9wKEVOSVNSX0FMTCwgZTgzOTBfYmFzZSArIEVOMF9JTVIpOworCQorCXNwaW5fdW5sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKKworCWRldl9rZnJlZV9za2IgKHNrYik7CisJZWlfbG9jYWwtPnN0YXQudHhfYnl0ZXMgKz0gc2VuZF9sZW5ndGg7CisgICAgCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYXhfaW50ZXJydXB0IC0gaGFuZGxlIHRoZSBpbnRlcnJ1cHRzIGZyb20gYW4gODM5MAorICogQGlycTogaW50ZXJydXB0IG51bWJlcgorICogQGRldl9pZDogYSBwb2ludGVyIHRvIHRoZSBuZXRfZGV2aWNlCisgKiBAcmVnczogdW51c2VkCisgKgorICogSGFuZGxlIHRoZSBldGhlciBpbnRlcmZhY2UgaW50ZXJydXB0cy4gV2UgcHVsbCBwYWNrZXRzIGZyb20KKyAqIHRoZSA4MzkwIHZpYSB0aGUgY2FyZCBzcGVjaWZpYyBmdW5jdGlvbnMgYW5kIGZpcmUgdGhlbSBhdCB0aGUgbmV0d29ya2luZworICogc3RhY2suIFdlIGFsc28gaGFuZGxlIHRyYW5zbWl0IGNvbXBsZXRpb25zIGFuZCB3YWtlIHRoZSB0cmFuc21pdCBwYXRoIGlmCisgKiBuZWNlc3NhcnkuIFdlIGFsc28gdXBkYXRlIHRoZSBjb3VudGVycyBhbmQgZG8gb3RoZXIgaG91c2VrZWVwaW5nIGFzCisgKiBuZWVkZWQuCisgKi8KKworc3RhdGljIGlycXJldHVybl90IGF4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCWxvbmcgZTgzOTBfYmFzZTsKKwlpbnQgaW50ZXJydXB0cywgbnJfc2VydmljZWQgPSAwLCBpOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsOworICAgIAlpbnQgaGFuZGxlZCA9IDA7CisKKwlpZiAoZGV2ID09IE5VTEwpIAorCXsKKwkJcHJpbnRrICgibmV0X2ludGVycnVwdCgpOiBpcnEgJWQgZm9yIHVua25vd24gZGV2aWNlLlxuIiwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKyAgICAKKwllODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworCisJLyoKKwkgKglQcm90ZWN0IHRoZSBpcnEgdGVzdCB0b28uCisJICovCisJIAorCXNwaW5fbG9jaygmZWlfbG9jYWwtPnBhZ2VfbG9jayk7CisKKwlpZiAoZWlfbG9jYWwtPmlycWxvY2spIAorCXsKKyNpZiAxIC8qIFRoaXMgbWlnaHQganVzdCBiZSBhbiBpbnRlcnJ1cHQgZm9yIGEgUENJIGRldmljZSBzaGFyaW5nIHRoaXMgbGluZSAqLworCQkvKiBUaGUgImlycWxvY2siIGNoZWNrIGlzIG9ubHkgZm9yIHRlc3RpbmcuICovCisJCXByaW50ayhlaV9sb2NhbC0+aXJxbG9jaworCQkJICAgPyAiJXM6IEludGVycnVwdGVkIHdoaWxlIGludGVycnVwdHMgYXJlIG1hc2tlZCEgaXNyPSUjMnggaW1yPSUjMnguXG4iCisJCQkgICA6ICIlczogUmVlbnRlcmluZyB0aGUgaW50ZXJydXB0IGhhbmRsZXIhIGlzcj0lIzJ4IGltcj0lIzJ4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9JU1IpLAorCQkJICAgaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9JTVIpKTsKKyNlbmRpZgorCQlzcGluX3VubG9jaygmZWlfbG9jYWwtPnBhZ2VfbG9jayk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisgICAgCisJaWYgKGVpX2RlYnVnID4gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcnJ1cHQoaXNyPSUjMi4yeCkuXG4iLCBkZXYtPm5hbWUsCisJCQkgICBpbmJfcChlODM5MF9iYXNlICsgRU4wX0lTUikpOworCisJb3V0Yl9wKDB4MDAsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsKKwllaV9sb2NhbC0+aXJxbG9jayA9IDE7CisgICAKKwkvKiAhIUFzc3VtcHRpb24hISAtLSB3ZSBzdGF5IGluIHBhZ2UgMC4JIERvbid0IGJyZWFrIHRoaXMuICovCisJd2hpbGUgKChpbnRlcnJ1cHRzID0gaW5iX3AoZTgzOTBfYmFzZSArIEVOMF9JU1IpKSAhPSAwCisJCSAgICYmICsrbnJfc2VydmljZWQgPCBNQVhfU0VSVklDRSkgCisJeworCQlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSB8fCAoaW50ZXJydXB0cyA9PSAweGZmKSkgeworCQkJaWYgKGVpX2RlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaW50ZXJydXB0IGZyb20gc3RvcHBlZCBjYXJkXG4iLCBkZXYtPm5hbWUpOworCQkJb3V0Yl9wKGludGVycnVwdHMsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsKKwkJCWludGVycnVwdHMgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJaGFuZGxlZCA9IDE7CisKKwkJLyogQVg4ODE5MCBidWcgZml4LiAqLworCQlvdXRiX3AoaW50ZXJydXB0cywgZTgzOTBfYmFzZSArIEVOMF9JU1IpOworCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQkJaWYgKCEoaW5iKGU4MzkwX2Jhc2UgKyBFTjBfSVNSKSAmIGludGVycnVwdHMpKQorCQkJCWJyZWFrOworCQkJb3V0Yl9wKDAsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsKKwkJCW91dGJfcChpbnRlcnJ1cHRzLCBlODM5MF9iYXNlICsgRU4wX0lTUik7CisJCX0KKwkJaWYgKGludGVycnVwdHMgJiBFTklTUl9PVkVSKSAKKwkJCWVpX3J4X292ZXJydW4oZGV2KTsKKwkJZWxzZSBpZiAoaW50ZXJydXB0cyAmIChFTklTUl9SWCtFTklTUl9SWF9FUlIpKSAKKwkJeworCQkJLyogR290IGEgZ29vZCAoPykgcGFja2V0LiAqLworCQkJZWlfcmVjZWl2ZShkZXYpOworCQl9CisJCS8qIFB1c2ggdGhlIG5leHQgdG8tdHJhbnNtaXQgcGFja2V0IHRocm91Z2guICovCisJCWlmIChpbnRlcnJ1cHRzICYgRU5JU1JfVFgpCisJCQllaV90eF9pbnRyKGRldik7CisJCWVsc2UgaWYgKGludGVycnVwdHMgJiBFTklTUl9UWF9FUlIpCisJCQllaV90eF9lcnIoZGV2KTsKKworCQlpZiAoaW50ZXJydXB0cyAmIEVOSVNSX0NPVU5URVJTKSAKKwkJeworCQkJZWlfbG9jYWwtPnN0YXQucnhfZnJhbWVfZXJyb3JzICs9IGluYl9wKGU4MzkwX2Jhc2UgKyBFTjBfQ09VTlRFUjApOworCQkJZWlfbG9jYWwtPnN0YXQucnhfY3JjX2Vycm9ycyAgICs9IGluYl9wKGU4MzkwX2Jhc2UgKyBFTjBfQ09VTlRFUjEpOworCQkJZWlfbG9jYWwtPnN0YXQucnhfbWlzc2VkX2Vycm9ycys9IGluYl9wKGU4MzkwX2Jhc2UgKyBFTjBfQ09VTlRFUjIpOworCQl9CisJfQorICAgIAorCWlmIChpbnRlcnJ1cHRzICYmIGVpX2RlYnVnKSAKKwl7CisJCWhhbmRsZWQgPSAxOworCQlpZiAobnJfc2VydmljZWQgPj0gTUFYX1NFUlZJQ0UpIAorCQl7CisJCQkvKiAweEZGIGlzIHZhbGlkIGZvciBhIGNhcmQgcmVtb3ZhbCAqLworCQkJaWYoaW50ZXJydXB0cyE9MHhGRikKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVG9vIG11Y2ggd29yayBhdCBpbnRlcnJ1cHQsIHN0YXR1cyAlIzIuMnhcbiIsCisJCQkJICAgZGV2LT5uYW1lLCBpbnRlcnJ1cHRzKTsKKwkJCW91dGJfcChFTklTUl9BTEwsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsgLyogQWNrLiBtb3N0IGludHJzLiAqLworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVua25vd24gaW50ZXJydXB0ICUjMnhcbiIsIGRldi0+bmFtZSwgaW50ZXJydXB0cyk7CisJCQlvdXRiX3AoMHhmZiwgZTgzOTBfYmFzZSArIEVOMF9JU1IpOyAvKiBBY2suIGFsbCBpbnRycy4gKi8KKwkJfQorCX0KKworCS8qIFR1cm4gODM5MCBpbnRlcnJ1cHRzIGJhY2sgb24uICovCisJZWlfbG9jYWwtPmlycWxvY2sgPSAwOworCW91dGJfcChFTklTUl9BTEwsIGU4MzkwX2Jhc2UgKyBFTjBfSU1SKTsKKworCXNwaW5fdW5sb2NrKCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworLyoqCisgKiBlaV90eF9lcnIgLSBoYW5kbGUgdHJhbnNtaXR0ZXIgZXJyb3IKKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHdoaWNoIHRocmV3IHRoZSBleGNlcHRpb24KKyAqCisgKiBBIHRyYW5zbWl0dGVyIGVycm9yIGhhcyBoYXBwZW5lZC4gTW9zdCBsaWtlbHkgZXhjZXNzIGNvbGxpc2lvbnMgKHdoaWNoCisgKiBpcyBhIGZhaXJseSBub3JtYWwgY29uZGl0aW9uKS4gSWYgdGhlIGVycm9yIGlzIG9uZSB3aGVyZSB0aGUgVHggd2lsbAorICogaGF2ZSBiZWVuIGFib3J0ZWQsIHdlIHRyeSBhbmQgc2VuZCBhbm90aGVyIG9uZSByaWdodCBhd2F5LCBpbnN0ZWFkIG9mCisgKiBsZXR0aW5nIHRoZSBmYWlsZWQgcGFja2V0IHNpdCBhbmQgY29sbGVjdCBkdXN0IGluIHRoZSBUeCBidWZmZXIuIFRoaXMKKyAqIGlzIGEgbXVjaCBiZXR0ZXIgc29sdXRpb24gYXMgaXQgYXZvaWRzIGtlcm5lbCBiYXNlZCBUeCB0aW1lb3V0cywgYW5kCisgKiBhbiB1bm5lY2Vzc2FyeSBjYXJkIHJlc2V0LgorICoKKyAqIENhbGxlZCB3aXRoIGxvY2sgaGVsZC4KKyAqLworCitzdGF0aWMgdm9pZCBlaV90eF9lcnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgY2hhciB0eHNyID0gaW5iX3AoZTgzOTBfYmFzZStFTjBfVFNSKTsKKwl1bnNpZ25lZCBjaGFyIHR4X3dhc19hYm9ydGVkID0gdHhzciAmIChFTlRTUl9BQlQrRU5UU1JfRlUpOworCisjaWZkZWYgVkVSQk9TRV9FUlJPUl9EVU1QCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0cmFuc21pdHRlciBlcnJvciAoJSMyeCk6ICIsIGRldi0+bmFtZSwgdHhzcik7CisJaWYgKHR4c3IgJiBFTlRTUl9BQlQpCisJCXByaW50aygiZXhjZXNzLWNvbGxpc2lvbnMgIik7CisJaWYgKHR4c3IgJiBFTlRTUl9ORCkKKwkJcHJpbnRrKCJub24tZGVmZXJyYWwgIik7CisJaWYgKHR4c3IgJiBFTlRTUl9DUlMpCisJCXByaW50aygibG9zdC1jYXJyaWVyICIpOworCWlmICh0eHNyICYgRU5UU1JfRlUpCisJCXByaW50aygiRklGTy11bmRlcnJ1biAiKTsKKwlpZiAodHhzciAmIEVOVFNSX0NESCkKKwkJcHJpbnRrKCJsb3N0LWhlYXJ0YmVhdCAiKTsKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKworCWlmICh0eF93YXNfYWJvcnRlZCkKKwkJZWlfdHhfaW50cihkZXYpOworCWVsc2UgCisJeworCQllaV9sb2NhbC0+c3RhdC50eF9lcnJvcnMrKzsKKwkJaWYgKHR4c3IgJiBFTlRTUl9DUlMpIGVpX2xvY2FsLT5zdGF0LnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCWlmICh0eHNyICYgRU5UU1JfQ0RIKSBlaV9sb2NhbC0+c3RhdC50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCWlmICh0eHNyICYgRU5UU1JfT1dDKSBlaV9sb2NhbC0+c3RhdC50eF93aW5kb3dfZXJyb3JzKys7CisJfQorfQorCisvKioKKyAqIGVpX3R4X2ludHIgLSB0cmFuc21pdCBpbnRlcnJ1cHQgaGFuZGxlcgorICogQGRldjogbmV0d29yayBkZXZpY2UgZm9yIHdoaWNoIHR4IGludHIgaXMgaGFuZGxlZAorICoKKyAqIFdlIGhhdmUgZmluaXNoZWQgYSB0cmFuc21pdDogY2hlY2sgZm9yIGVycm9ycyBhbmQgdGhlbiB0cmlnZ2VyIHRoZSBuZXh0CisgKiBwYWNrZXQgdG8gYmUgc2VudC4gQ2FsbGVkIHdpdGggbG9jayBoZWxkLgorICovCisKK3N0YXRpYyB2b2lkIGVpX3R4X2ludHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJaW50IHN0YXR1cyA9IGluYihlODM5MF9iYXNlICsgRU4wX1RTUik7CisgICAgCisJLyoKKwkgKiBUaGVyZSBhcmUgdHdvIFR4IGJ1ZmZlcnMsIHNlZSB3aGljaCBvbmUgZmluaXNoZWQsIGFuZCB0cmlnZ2VyCisJICogdGhlIHNlbmQgb2YgYW5vdGhlciBvbmUgaWYgaXQgZXhpc3RzLgorCSAqLworCWVpX2xvY2FsLT50eHF1ZXVlLS07CisKKwlpZiAoZWlfbG9jYWwtPnR4MSA8IDApIAorCXsKKwkJaWYgKGVpX2xvY2FsLT5sYXN0dHggIT0gMSAmJiBlaV9sb2NhbC0+bGFzdHR4ICE9IC0xKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogYm9ndXMgbGFzdF90eF9idWZmZXIgJWQsIHR4MT0lZC5cbiIsCisJCQkJZWlfbG9jYWwtPm5hbWUsIGVpX2xvY2FsLT5sYXN0dHgsIGVpX2xvY2FsLT50eDEpOworCQllaV9sb2NhbC0+dHgxID0gMDsKKwkJaWYgKGVpX2xvY2FsLT50eDIgPiAwKSAKKwkJeworCQkJZWlfbG9jYWwtPnR4aW5nID0gMTsKKwkJCU5TODM5MF90cmlnZ2VyX3NlbmQoZGV2LCBlaV9sb2NhbC0+dHgyLCBlaV9sb2NhbC0+dHhfc3RhcnRfcGFnZSArIDYpOworCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQllaV9sb2NhbC0+dHgyID0gLTEsCisJCQllaV9sb2NhbC0+bGFzdHR4ID0gMjsKKwkJfQorCQllbHNlIGVpX2xvY2FsLT5sYXN0dHggPSAyMCwgZWlfbG9jYWwtPnR4aW5nID0gMDsJCisJfQorCWVsc2UgaWYgKGVpX2xvY2FsLT50eDIgPCAwKSAKKwl7CisJCWlmIChlaV9sb2NhbC0+bGFzdHR4ICE9IDIgICYmICBlaV9sb2NhbC0+bGFzdHR4ICE9IC0yKQorCQkJcHJpbnRrKCIlczogYm9ndXMgbGFzdF90eF9idWZmZXIgJWQsIHR4Mj0lZC5cbiIsCisJCQkJZWlfbG9jYWwtPm5hbWUsIGVpX2xvY2FsLT5sYXN0dHgsIGVpX2xvY2FsLT50eDIpOworCQllaV9sb2NhbC0+dHgyID0gMDsKKwkJaWYgKGVpX2xvY2FsLT50eDEgPiAwKSAKKwkJeworCQkJZWlfbG9jYWwtPnR4aW5nID0gMTsKKwkJCU5TODM5MF90cmlnZ2VyX3NlbmQoZGV2LCBlaV9sb2NhbC0+dHgxLCBlaV9sb2NhbC0+dHhfc3RhcnRfcGFnZSk7CisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJCWVpX2xvY2FsLT50eDEgPSAtMTsKKwkJCWVpX2xvY2FsLT5sYXN0dHggPSAxOworCQl9CisJCWVsc2UKKwkJCWVpX2xvY2FsLT5sYXN0dHggPSAxMCwgZWlfbG9jYWwtPnR4aW5nID0gMDsKKwl9CisvLwllbHNlIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmV4cGVjdGVkIFRYLWRvbmUgaW50ZXJydXB0LCBsYXN0dHg9JWQuXG4iLAorLy8JCQlkZXYtPm5hbWUsIGVpX2xvY2FsLT5sYXN0dHgpOworCisJLyogTWluaW1pemUgVHggbGF0ZW5jeTogdXBkYXRlIHRoZSBzdGF0aXN0aWNzIGFmdGVyIHdlIHJlc3RhcnQgVFhpbmcuICovCisJaWYgKHN0YXR1cyAmIEVOVFNSX0NPTCkKKwkJZWlfbG9jYWwtPnN0YXQuY29sbGlzaW9ucysrOworCWlmIChzdGF0dXMgJiBFTlRTUl9QVFgpCisJCWVpX2xvY2FsLT5zdGF0LnR4X3BhY2tldHMrKzsKKwllbHNlIAorCXsKKwkJZWlfbG9jYWwtPnN0YXQudHhfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBFTlRTUl9BQlQpIAorCQl7CisJCQllaV9sb2NhbC0+c3RhdC50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJZWlfbG9jYWwtPnN0YXQuY29sbGlzaW9ucyArPSAxNjsKKwkJfQorCQlpZiAoc3RhdHVzICYgRU5UU1JfQ1JTKSAKKwkJCWVpX2xvY2FsLT5zdGF0LnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBFTlRTUl9GVSkgCisJCQllaV9sb2NhbC0+c3RhdC50eF9maWZvX2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgRU5UU1JfQ0RIKQorCQkJZWlfbG9jYWwtPnN0YXQudHhfaGVhcnRiZWF0X2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgRU5UU1JfT1dDKQorCQkJZWlfbG9jYWwtPnN0YXQudHhfd2luZG93X2Vycm9ycysrOworCX0KKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qKgorICogZWlfcmVjZWl2ZSAtIHJlY2VpdmUgc29tZSBwYWNrZXRzCisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSB3aXRoIHdoaWNoIHJlY2VpdmUgd2lsbCBiZSBydW4KKyAqCisgKiBXZSBoYXZlIGEgZ29vZCBwYWNrZXQocyksIGdldCBpdC90aGVtIG91dCBvZiB0aGUgYnVmZmVycy4gCisgKiBDYWxsZWQgd2l0aCBsb2NrIGhlbGQuCisgKi8KKworc3RhdGljIHZvaWQgZWlfcmVjZWl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgZTgzOTBfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBjaGFyIHJ4aW5nX3BhZ2UsIHRoaXNfZnJhbWUsIG5leHRfZnJhbWU7CisJdW5zaWduZWQgc2hvcnQgY3VycmVudF9vZmZzZXQ7CisJaW50IHJ4X3BrdF9jb3VudCA9IDA7CisJc3RydWN0IGU4MzkwX3BrdF9oZHIgcnhfZnJhbWU7CisgICAgCisJd2hpbGUgKCsrcnhfcGt0X2NvdW50IDwgMTApIAorCXsKKwkJaW50IHBrdF9sZW4sIHBrdF9zdGF0OworCQkKKwkJLyogR2V0IHRoZSByeCBwYWdlIChpbmNvbWluZyBwYWNrZXQgcG9pbnRlcikuICovCisJCXJ4aW5nX3BhZ2UgPSBpbmJfcChlODM5MF9iYXNlICsgRU4xX0NVUlBBRyAtMSk7CisJCQorCQkvKiBSZW1vdmUgb25lIGZyYW1lIGZyb20gdGhlIHJpbmcuICBCb3VuZGFyeSBpcyBhbHdheXMgYSBwYWdlIGJlaGluZC4gKi8KKwkJdGhpc19mcmFtZSA9IGluYl9wKGU4MzkwX2Jhc2UgKyBFTjBfQk9VTkRBUlkpICsgMTsKKwkJaWYgKHRoaXNfZnJhbWUgPj0gZWlfbG9jYWwtPnN0b3BfcGFnZSkKKwkJCXRoaXNfZnJhbWUgPSBlaV9sb2NhbC0+cnhfc3RhcnRfcGFnZTsKKwkJCisJCS8qIFNvbWVkYXkgd2UnbGwgb21pdCB0aGUgcHJldmlvdXMsIGlmZiB3ZSBuZXZlciBnZXQgdGhpcyBtZXNzYWdlLgorCQkgICAoVGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNsb25lIGNsYWltZWQgdG8gaGF2ZSBhIHByb2JsZW0uKSAgCisJCSAgIAorCQkgICBLZWVwIHF1aWV0IGlmIGl0IGxvb2tzIGxpa2UgYSBjYXJkIHJlbW92YWwuIE9uZSBwcm9ibGVtIGhlcmUKKwkJICAgaXMgdGhhdCBzb21lIGNsb25lcyBjcmFzaCBpbiByb3VnaGx5IHRoZSBzYW1lIHdheS4KKwkJICovCisJCWlmIChlaV9kZWJ1ZyA+IDAgICYmICB0aGlzX2ZyYW1lICE9IGVpX2xvY2FsLT5jdXJyZW50X3BhZ2UgJiYgKHRoaXNfZnJhbWUhPTB4MCB8fCByeGluZ19wYWdlIT0weEZGKSkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IG1pc21hdGNoZWQgcmVhZCBwYWdlIHBvaW50ZXJzICUyeCB2cyAlMnguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgdGhpc19mcmFtZSwgZWlfbG9jYWwtPmN1cnJlbnRfcGFnZSk7CisJCQorCQlpZiAodGhpc19mcmFtZSA9PSByeGluZ19wYWdlKQkvKiBSZWFkIGFsbCB0aGUgZnJhbWVzPyAqLworCQkJYnJlYWs7CQkJCS8qIERvbmUgZm9yIG5vdyAqLworCQkKKwkJY3VycmVudF9vZmZzZXQgPSB0aGlzX2ZyYW1lIDw8IDg7CisJCWVpX2dldF84MzkwX2hkcihkZXYsICZyeF9mcmFtZSwgdGhpc19mcmFtZSk7CisJCQorCQlwa3RfbGVuID0gcnhfZnJhbWUuY291bnQgLSBzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpOworCQlwa3Rfc3RhdCA9IHJ4X2ZyYW1lLnN0YXR1czsKKwkJCisJCW5leHRfZnJhbWUgPSB0aGlzX2ZyYW1lICsgMSArICgocGt0X2xlbis0KT4+OCk7CisJCQorCQlpZiAocGt0X2xlbiA8IDYwICB8fCAgcGt0X2xlbiA+IDE1MTgpIAorCQl7CisJCQlpZiAoZWlfZGVidWcpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBib2d1cyBwYWNrZXQgc2l6ZTogJWQsIHN0YXR1cz0lIzJ4IG54cGc9JSMyeC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgcnhfZnJhbWUuY291bnQsIHJ4X2ZyYW1lLnN0YXR1cywKKwkJCQkJICAgcnhfZnJhbWUubmV4dCk7CisJCQllaV9sb2NhbC0+c3RhdC5yeF9lcnJvcnMrKzsKKwkJCWVpX2xvY2FsLT5zdGF0LnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJfQorCQkgZWxzZSBpZiAoKHBrdF9zdGF0ICYgMHgwRikgPT0gRU5SU1JfUlhPSykgCisJCXsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisJCQkKKwkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbisyKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgCisJCQl7CisJCQkJaWYgKGVpX2RlYnVnID4gMSkKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDb3VsZG4ndCBhbGxvY2F0ZSBhIHNrX2J1ZmYgb2Ygc2l6ZSAlZC5cbiIsCisJCQkJCQkgICBkZXYtPm5hbWUsIHBrdF9sZW4pOworCQkJCWVpX2xvY2FsLT5zdGF0LnJ4X2Ryb3BwZWQrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlza2JfcmVzZXJ2ZShza2IsMik7CS8qIElQIGhlYWRlcnMgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwkvKiBNYWtlIHJvb20gKi8KKwkJCQllaV9ibG9ja19pbnB1dChkZXYsIHBrdF9sZW4sIHNrYiwgY3VycmVudF9vZmZzZXQgKyBzaXplb2YocnhfZnJhbWUpKTsKKwkJCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQllaV9sb2NhbC0+c3RhdC5yeF9wYWNrZXRzKys7CisJCQkJZWlfbG9jYWwtPnN0YXQucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJCQlpZiAocGt0X3N0YXQgJiBFTlJTUl9QSFkpCisJCQkJCWVpX2xvY2FsLT5zdGF0Lm11bHRpY2FzdCsrOworCQkJfQorCQl9IAorCQllbHNlIAorCQl7CisJCQlpZiAoZWlfZGVidWcpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBib2d1cyBwYWNrZXQ6IHN0YXR1cz0lIzJ4IG54cGc9JSMyeCBzaXplPSVkXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHJ4X2ZyYW1lLnN0YXR1cywgcnhfZnJhbWUubmV4dCwKKwkJCQkJICAgcnhfZnJhbWUuY291bnQpOworCQkJZWlfbG9jYWwtPnN0YXQucnhfZXJyb3JzKys7CisJCQkvKiBOQjogVGhlIE5JQyBjb3VudHMgQ1JDLCBmcmFtZSBhbmQgbWlzc2VkIGVycm9ycy4gKi8KKwkJCWlmIChwa3Rfc3RhdCAmIEVOUlNSX0ZPKQorCQkJCWVpX2xvY2FsLT5zdGF0LnJ4X2ZpZm9fZXJyb3JzKys7CisJCX0KKwkJbmV4dF9mcmFtZSA9IHJ4X2ZyYW1lLm5leHQ7CisJCQorCQkvKiBUaGlzIF9zaG91bGRfIG5ldmVyIGhhcHBlbjogaXQncyBoZXJlIGZvciBhdm9pZGluZyBiYWQgY2xvbmVzLiAqLworCQlpZiAobmV4dF9mcmFtZSA+PSBlaV9sb2NhbC0+c3RvcF9wYWdlKSB7CisJCQlwcmludGsoIiVzOiBuZXh0IGZyYW1lIGluY29uc2lzdGVuY3ksICUjMnhcbiIsIGRldi0+bmFtZSwKKwkJCQkgICBuZXh0X2ZyYW1lKTsKKwkJCW5leHRfZnJhbWUgPSBlaV9sb2NhbC0+cnhfc3RhcnRfcGFnZTsKKwkJfQorCQllaV9sb2NhbC0+Y3VycmVudF9wYWdlID0gbmV4dF9mcmFtZTsKKwkJb3V0Yl9wKG5leHRfZnJhbWUtMSwgZTgzOTBfYmFzZStFTjBfQk9VTkRBUlkpOworCX0KKworCXJldHVybjsKK30KKworLyoqCisgKiBlaV9yeF9vdmVycnVuIC0gaGFuZGxlIHJlY2VpdmVyIG92ZXJydW4KKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlIHdoaWNoIHRocmV3IGV4Y2VwdGlvbgorICoKKyAqIFdlIGhhdmUgYSByZWNlaXZlciBvdmVycnVuOiB3ZSBoYXZlIHRvIGtpY2sgdGhlIDgzOTAgdG8gZ2V0IGl0IHN0YXJ0ZWQKKyAqIGFnYWluLiBQcm9ibGVtIGlzIHRoYXQgeW91IGhhdmUgdG8ga2ljayBpdCBleGFjdGx5IGFzIE5TIHByZXNjcmliZXMgaW4KKyAqIHRoZSB1cGRhdGVkIGRhdGFzaGVldHMsIG9yICJ0aGUgTklDIG1heSBhY3QgaW4gYW4gdW5wcmVkaWN0YWJsZSBtYW5uZXIuIgorICogVGhpcyBpbmNsdWRlcyBjYXVzaW5nICJ0aGUgTklDIHRvIGRlZmVyIGluZGVmaW5pdGVseSB3aGVuIGl0IGlzIHN0b3BwZWQKKyAqIG9uIGEgYnVzeSBuZXR3b3JrLiIgIFVnaC4KKyAqIENhbGxlZCB3aXRoIGxvY2sgaGVsZC4gRG9uJ3QgY2FsbCB0aGlzIHdpdGggdGhlIGludGVycnVwdHMgb2ZmIG9yIHlvdXIKKyAqIGNvbXB1dGVyIHdpbGwgaGF0ZSB5b3UgLSBpdCB0YWtlcyAxMG1zIG9yIHNvLiAKKyAqLworCitzdGF0aWMgdm9pZCBlaV9yeF9vdmVycnVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJYXhuZXRfZGV2X3QgKmluZm8gPSAoYXhuZXRfZGV2X3QgKilkZXY7CisJbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgY2hhciB3YXNfdHhpbmcsIG11c3RfcmVzZW5kID0gMDsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisgICAgCisJLyoKKwkgKiBSZWNvcmQgd2hldGhlciBhIFR4IHdhcyBpbiBwcm9ncmVzcyBhbmQgdGhlbiBpc3N1ZSB0aGUKKwkgKiBzdG9wIGNvbW1hbmQuCisJICovCisJd2FzX3R4aW5nID0gaW5iX3AoZTgzOTBfYmFzZStFODM5MF9DTUQpICYgRTgzOTBfVFJBTlM7CisJb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsKKyAgICAKKwlpZiAoZWlfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlY2VpdmVyIG92ZXJydW4uXG4iLCBkZXYtPm5hbWUpOworCWVpX2xvY2FsLT5zdGF0LnJ4X292ZXJfZXJyb3JzKys7CisgICAgCisJLyogCisJICogV2FpdCBhIGZ1bGwgVHggdGltZSAoMS4ybXMpICsgc29tZSBndWFyZCB0aW1lLCBOUyBzYXlzIDEuNm1zIHRvdGFsLgorCSAqIEVhcmx5IGRhdGFzaGVldHMgc2FpZCB0byBwb2xsIHRoZSByZXNldCBiaXQsIGJ1dCBub3cgdGhleSBzYXkgdGhhdAorCSAqIGl0ICJpcyBub3QgYSByZWxpYWJsZSBpbmRpY2F0b3IgYW5kIHN1YnNlcXVlbnRseSBzaG91bGQgYmUgaWdub3JlZC4iCisJICogV2Ugd2FpdCBhdCBsZWFzdCAxMG1zLgorCSAqLworCisJbWRlbGF5KDEwKTsKKworCS8qCisJICogUmVzZXQgUkJDUlswMV0gYmFjayB0byB6ZXJvIGFzIHBlciBtYWdpYyBpbmNhbnRhdGlvbi4KKwkgKi8KKwlvdXRiX3AoMHgwMCwgZTgzOTBfYmFzZStFTjBfUkNOVExPKTsKKwlvdXRiX3AoMHgwMCwgZTgzOTBfYmFzZStFTjBfUkNOVEhJKTsKKworCS8qCisJICogU2VlIGlmIGFueSBUeCB3YXMgaW50ZXJydXB0ZWQgb3Igbm90LiBBY2NvcmRpbmcgdG8gTlMsIHRoaXMKKwkgKiBzdGVwIGlzIHZpdGFsLCBhbmQgc2tpcHBpbmcgaXQgd2lsbCBjYXVzZSBubyBlbmQgb2YgaGF2b2MuCisJICovCisKKwlpZiAod2FzX3R4aW5nKQorCXsgCisJCXVuc2lnbmVkIGNoYXIgdHhfY29tcGxldGVkID0gaW5iX3AoZTgzOTBfYmFzZStFTjBfSVNSKSAmIChFTklTUl9UWCtFTklTUl9UWF9FUlIpOworCQlpZiAoIXR4X2NvbXBsZXRlZCkKKwkJCW11c3RfcmVzZW5kID0gMTsKKwl9CisKKwkvKgorCSAqIEhhdmUgdG8gZW50ZXIgbG9vcGJhY2sgbW9kZSBhbmQgdGhlbiByZXN0YXJ0IHRoZSBOSUMgYmVmb3JlCisJICogeW91IGFyZSBhbGxvd2VkIHRvIHNsdXJwIHBhY2tldHMgdXAgb2ZmIHRoZSByaW5nLgorCSAqLworCW91dGJfcChFODM5MF9UWE9GRiwgZTgzOTBfYmFzZSArIEVOMF9UWENSKTsKKwlvdXRiX3AoRTgzOTBfTk9ETUEgKyBFODM5MF9QQUdFMCArIEU4MzkwX1NUQVJULCBlODM5MF9iYXNlICsgRTgzOTBfQ01EKTsKKworCS8qCisJICogQ2xlYXIgdGhlIFJ4IHJpbmcgb2YgYWxsIHRoZSBkZWJyaXMsIGFuZCBhY2sgdGhlIGludGVycnVwdC4KKwkgKi8KKwllaV9yZWNlaXZlKGRldik7CisKKwkvKgorCSAqIExlYXZlIGxvb3BiYWNrIG1vZGUsIGFuZCByZXNlbmQgYW55IHBhY2tldCB0aGF0IGdvdCBzdG9wcGVkLgorCSAqLworCW91dGJfcChFODM5MF9UWENPTkZJRyB8IGluZm8tPmR1cGxleF9mbGFnLCBlODM5MF9iYXNlICsgRU4wX1RYQ1IpOyAKKwlpZiAobXVzdF9yZXNlbmQpCisgICAgCQlvdXRiX3AoRTgzOTBfTk9ETUEgKyBFODM5MF9QQUdFMCArIEU4MzkwX1NUQVJUICsgRTgzOTBfVFJBTlMsIGU4MzkwX2Jhc2UgKyBFODM5MF9DTUQpOworfQorCisvKgorICoJQ29sbGVjdCB0aGUgc3RhdHMuIFRoaXMgaXMgY2FsbGVkIHVubG9ja2VkIGFuZCBmcm9tIHNldmVyYWwgY29udGV4dHMuCisgKi8KKyAKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgZWlfZGV2aWNlICplaV9sb2NhbCA9IChzdHJ1Y3QgZWlfZGV2aWNlICopIG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAKKwkvKiBJZiB0aGUgY2FyZCBpcyBzdG9wcGVkLCBqdXN0IHJldHVybiB0aGUgcHJlc2VudCBzdGF0cy4gKi8KKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuICZlaV9sb2NhbC0+c3RhdDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLGZsYWdzKTsKKwkvKiBSZWFkIHRoZSBjb3VudGVyIHJlZ2lzdGVycywgYXNzdW1pbmcgd2UgYXJlIGluIHBhZ2UgMC4gKi8KKwllaV9sb2NhbC0+c3RhdC5yeF9mcmFtZV9lcnJvcnMgKz0gaW5iX3AoaW9hZGRyICsgRU4wX0NPVU5URVIwKTsKKwllaV9sb2NhbC0+c3RhdC5yeF9jcmNfZXJyb3JzICAgKz0gaW5iX3AoaW9hZGRyICsgRU4wX0NPVU5URVIxKTsKKwllaV9sb2NhbC0+c3RhdC5yeF9taXNzZWRfZXJyb3JzKz0gaW5iX3AoaW9hZGRyICsgRU4wX0NPVU5URVIyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaV9sb2NhbC0+cGFnZV9sb2NrLCBmbGFncyk7CisgICAgCisJcmV0dXJuICZlaV9sb2NhbC0+c3RhdDsKK30KKworLyoqCisgKiBkb19zZXRfbXVsdGljYXN0X2xpc3QgLSBzZXQvY2xlYXIgbXVsdGljYXN0IGZpbHRlcgorICogQGRldjogbmV0IGRldmljZSBmb3Igd2hpY2ggbXVsdGljYXN0IGZpbHRlciBpcyBhZGp1c3RlZAorICoKKyAqCVNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLiBNYXkgYmUgY2FsbGVkCisgKglmcm9tIGEgQkggaW4gMi4xLnguIE11c3QgYmUgY2FsbGVkIHdpdGggbG9jayBoZWxkLiAKKyAqLworIAorc3RhdGljIHZvaWQgZG9fc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgCWlmKGRldi0+ZmxhZ3MmSUZGX1BST01JU0MpCisgIAkJb3V0Yl9wKEU4MzkwX1JYQ09ORklHIHwgMHg1OCwgZTgzOTBfYmFzZSArIEVOMF9SWENSKTsKKwllbHNlIGlmKGRldi0+ZmxhZ3MmSUZGX0FMTE1VTFRJIHx8IGRldi0+bWNfbGlzdCkKKyAgCQlvdXRiX3AoRTgzOTBfUlhDT05GSUcgfCAweDQ4LCBlODM5MF9iYXNlICsgRU4wX1JYQ1IpOworICAJZWxzZQorICAJCW91dGJfcChFODM5MF9SWENPTkZJRyB8IDB4NDAsIGU4MzkwX2Jhc2UgKyBFTjBfUlhDUik7Cit9CisKKy8qCisgKglDYWxsZWQgd2l0aG91dCBsb2NrIGhlbGQuIFRoaXMgaXMgaW52b2tlZCBmcm9tIHVzZXIgY29udGV4dCBhbmQgbWF5CisgKgliZSBwYXJhbGxlbCB0byBqdXN0IGFib3V0IGV2ZXJ5dGhpbmcgZWxzZS4gSXRzIGFsc28gZmFpcmx5IHF1aWNrIGFuZAorICoJbm90IGNhbGxlZCB0b28gb2Z0ZW4uIE11c3QgcHJvdGVjdCBhZ2FpbnN0IGJvdGggYmggYW5kIGlycSB1c2VycworICovCisKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X2xvY2soZGV2KSwgZmxhZ3MpOworCWRvX3NldF9tdWx0aWNhc3RfbGlzdChkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9sb2NrKGRldiksIGZsYWdzKTsKK30JCisKKy8qKgorICogYXhkZXZfc2V0dXAgLSBpbml0IHJlc3Qgb2YgODM5MCBkZXZpY2Ugc3RydWN0CisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUgdG8gaW5pdAorICoKKyAqIEluaXRpYWxpemUgdGhlIHJlc3Qgb2YgdGhlIDgzOTAgZGV2aWNlIHN0cnVjdHVyZS4gIERvIE5PVCBfX2luaXQKKyAqIHRoaXMsIGFzIGl0IGlzIHVzZWQgYnkgODM5MCBiYXNlZCBtb2R1bGFyIGRyaXZlcnMgdG9vLgorICovCisKK3N0YXRpYyB2b2lkIGF4ZGV2X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWw7CisJaWYgKGVpX2RlYnVnID4gMSkKKwkJcHJpbnRrKHZlcnNpb25fODM5MCk7CisgICAgCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJCQorCWVpX2xvY2FsID0gKHN0cnVjdCBlaV9kZXZpY2UgKiluZXRkZXZfcHJpdihkZXYpOworCXNwaW5fbG9ja19pbml0KCZlaV9sb2NhbC0+cGFnZV9sb2NrKTsKKyAgICAKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZlaV9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzCT0gZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9tdWx0aWNhc3RfbGlzdDsKKworCWV0aGVyX3NldHVwKGRldik7Cit9CisKKy8qIFRoaXMgcGFnZSBvZiBmdW5jdGlvbnMgc2hvdWxkIGJlIDgzOTAgZ2VuZXJpYyAqLworLyogRm9sbG93IE5hdGlvbmFsIFNlbWkncyByZWNvbW1lbmRhdGlvbnMgZm9yIGluaXRpYWxpemluZyB0aGUgIk5JQyIuICovCisKKy8qKgorICogQVg4ODE5MF9pbml0IC0gaW5pdGlhbGl6ZSA4MzkwIGhhcmR3YXJlCisgKiBAZGV2OiBuZXR3b3JrIGRldmljZSB0byBpbml0aWFsaXplCisgKiBAc3RhcnRwOiBib29sZWFuLiAgbm9uLXplcm8gdmFsdWUgdG8gaW5pdGlhdGUgY2hpcCBwcm9jZXNzaW5nCisgKgorICoJTXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NrIGhlbGQuCisgKi8KKworc3RhdGljIHZvaWQgQVg4ODE5MF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdGFydHApCit7CisJYXhuZXRfZGV2X3QgKmluZm8gPSBQUklWKGRldik7CisJbG9uZyBlODM5MF9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCWludCBlbmRjZmcgPSBlaV9sb2NhbC0+d29yZDE2ID8gKDB4NDggfCBFTkRDRkdfV1RTKSA6IDB4NDg7CisgICAgCisJaWYoc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSE9NCkKKyAgICAJCXBhbmljKCI4MzkwLmM6IGhlYWRlciBzdHJ1Y3QgbWlzcGFja2VkXG4iKTsgICAgCisJLyogRm9sbG93IE5hdGlvbmFsIFNlbWkncyByZWNvbW1lbmRhdGlvbnMgZm9yIGluaXRpbmcgdGhlIERQODM5MDIuICovCisJb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIGU4MzkwX2Jhc2UrRTgzOTBfQ01EKTsgLyogMHgyMSAqLworCW91dGJfcChlbmRjZmcsIGU4MzkwX2Jhc2UgKyBFTjBfRENGRyk7CS8qIDB4NDggb3IgMHg0OSAqLworCS8qIENsZWFyIHRoZSByZW1vdGUgYnl0ZSBjb3VudCByZWdpc3RlcnMuICovCisJb3V0Yl9wKDB4MDAsICBlODM5MF9iYXNlICsgRU4wX1JDTlRMTyk7CisJb3V0Yl9wKDB4MDAsICBlODM5MF9iYXNlICsgRU4wX1JDTlRISSk7CisJLyogU2V0IHRvIG1vbml0b3IgYW5kIGxvb3BiYWNrIG1vZGUgLS0gdGhpcyBpcyB2aXRhbCEuICovCisJb3V0Yl9wKEU4MzkwX1JYT0ZGfDB4NDAsIGU4MzkwX2Jhc2UgKyBFTjBfUlhDUik7IC8qIDB4NjAgKi8KKwlvdXRiX3AoRTgzOTBfVFhPRkYsIGU4MzkwX2Jhc2UgKyBFTjBfVFhDUik7IC8qIDB4MDIgKi8KKwkvKiBTZXQgdGhlIHRyYW5zbWl0IHBhZ2UgYW5kIHJlY2VpdmUgcmluZy4gKi8KKwlvdXRiX3AoZWlfbG9jYWwtPnR4X3N0YXJ0X3BhZ2UsIGU4MzkwX2Jhc2UgKyBFTjBfVFBTUik7CisJZWlfbG9jYWwtPnR4MSA9IGVpX2xvY2FsLT50eDIgPSAwOworCW91dGJfcChlaV9sb2NhbC0+cnhfc3RhcnRfcGFnZSwgZTgzOTBfYmFzZSArIEVOMF9TVEFSVFBHKTsKKwlvdXRiX3AoZWlfbG9jYWwtPnN0b3BfcGFnZS0xLCBlODM5MF9iYXNlICsgRU4wX0JPVU5EQVJZKTsJLyogM2M1MDMgc2F5cyAweDNmLE5TMHgyNiovCisJZWlfbG9jYWwtPmN1cnJlbnRfcGFnZSA9IGVpX2xvY2FsLT5yeF9zdGFydF9wYWdlOwkJLyogYXNzZXJ0IGJvdW5kYXJ5KzEgKi8KKwlvdXRiX3AoZWlfbG9jYWwtPnN0b3BfcGFnZSwgZTgzOTBfYmFzZSArIEVOMF9TVE9QUEcpOworCS8qIENsZWFyIHRoZSBwZW5kaW5nIGludGVycnVwdHMgYW5kIG1hc2suICovCisJb3V0Yl9wKDB4RkYsIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsKKwlvdXRiX3AoMHgwMCwgIGU4MzkwX2Jhc2UgKyBFTjBfSU1SKTsKKyAgICAKKwkvKiBDb3B5IHRoZSBzdGF0aW9uIGFkZHJlc3MgaW50byB0aGUgRFM4MzkwIHJlZ2lzdGVycy4gKi8KKworCW91dGJfcChFODM5MF9OT0RNQSArIEU4MzkwX1BBR0UxICsgRTgzOTBfU1RPUCwgZTgzOTBfYmFzZStFODM5MF9DTUQpOyAvKiAweDYxICovCisJZm9yKGkgPSAwOyBpIDwgNjsgaSsrKSAKKwl7CisJCW91dGJfcChkZXYtPmRldl9hZGRyW2ldLCBlODM5MF9iYXNlICsgRU4xX1BIWVNfU0hJRlQoaSkpOworCQlpZihpbmJfcChlODM5MF9iYXNlICsgRU4xX1BIWVNfU0hJRlQoaSkpIT1kZXYtPmRldl9hZGRyW2ldKQorCQkJcHJpbnRrKEtFUk5fRVJSICJIdy4gYWRkcmVzcyByZWFkL3dyaXRlIG1pc21hcCAlZFxuIixpKTsKKwl9CisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBtdWx0aWNhc3QgbGlzdCB0byBhY2NlcHQtYWxsLiAgSWYgd2UgZW5hYmxlIG11bHRpY2FzdAorCSAqIHRoZSBoaWdoZXIgbGV2ZWxzIGNhbiBkbyB0aGUgZmlsdGVyaW5nLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCW91dGJfcCgweGZmLCBlODM5MF9iYXNlICsgRU4xX01VTFQgKyBpKTsKKworCW91dGJfcChlaV9sb2NhbC0+cnhfc3RhcnRfcGFnZSwgZTgzOTBfYmFzZSArIEVOMV9DVVJQQUcpOworCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVE9QLCBlODM5MF9iYXNlK0U4MzkwX0NNRCk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCWVpX2xvY2FsLT50eDEgPSBlaV9sb2NhbC0+dHgyID0gMDsKKwllaV9sb2NhbC0+dHhpbmcgPSAwOworCisJaWYgKHN0YXJ0cCkgCisJeworCQlvdXRiX3AoMHhmZiwgIGU4MzkwX2Jhc2UgKyBFTjBfSVNSKTsKKwkJb3V0Yl9wKEVOSVNSX0FMTCwgIGU4MzkwX2Jhc2UgKyBFTjBfSU1SKTsKKwkJb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUQVJULCBlODM5MF9iYXNlK0U4MzkwX0NNRCk7CisJCW91dGJfcChFODM5MF9UWENPTkZJRyB8IGluZm8tPmR1cGxleF9mbGFnLAorCQkgICAgICAgZTgzOTBfYmFzZSArIEVOMF9UWENSKTsgLyogeG1pdCBvbi4gKi8KKwkJLyogM2M1MDMgVGVjaE1hbiBzYXlzIHJ4Y29uZmlnIG9ubHkgYWZ0ZXIgdGhlIE5JQyBpcyBzdGFydGVkLiAqLworCQlvdXRiX3AoRTgzOTBfUlhDT05GSUcgfCAweDQwLCBlODM5MF9iYXNlICsgRU4wX1JYQ1IpOyAvKiByeCBvbiwgKi8KKwkJZG9fc2V0X211bHRpY2FzdF9saXN0KGRldik7CS8qIChyZSlsb2FkIHRoZSBtY2FzdCB0YWJsZSAqLworCX0KK30KKworLyogVHJpZ2dlciBhIHRyYW5zbWl0IHN0YXJ0LCBhc3N1bWluZyB0aGUgbGVuZ3RoIGlzIHZhbGlkLiAKKyAgIEFsd2F5cyBjYWxsZWQgd2l0aCB0aGUgcGFnZSBsb2NrIGhlbGQgKi8KKyAgIAorc3RhdGljIHZvaWQgTlM4MzkwX3RyaWdnZXJfc2VuZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbGVuZ3RoLAorCQkJCQkJCQlpbnQgc3RhcnRfcGFnZSkKK3sKKwlsb25nIGU4MzkwX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgX19hdHRyaWJ1dGUoKHVudXNlZCkpID0gKHN0cnVjdCBlaV9kZXZpY2UgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAKKwlpZiAoaW5iX3AoZTgzOTBfYmFzZSkgJiBFODM5MF9UUkFOUykgCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJpZ2dlcl9zZW5kKCkgY2FsbGVkIHdpdGggdGhlIHRyYW5zbWl0dGVyIGJ1c3kuXG4iLAorCQkJZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKwlvdXRiX3AobGVuZ3RoICYgMHhmZiwgZTgzOTBfYmFzZSArIEVOMF9UQ05UTE8pOworCW91dGJfcChsZW5ndGggPj4gOCwgZTgzOTBfYmFzZSArIEVOMF9UQ05USEkpOworCW91dGJfcChzdGFydF9wYWdlLCBlODM5MF9iYXNlICsgRU4wX1RQU1IpOworCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9UUkFOUytFODM5MF9TVEFSVCwgZTgzOTBfYmFzZStFODM5MF9DTUQpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL2NvbTIwMDIwX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvY29tMjAwMjBfY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjk0ZTFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL2NvbTIwMDIwX2NzLmMKQEAgLTAsMCArMSw1MDkgQEAKKy8qCisgKiBMaW51eCBBUkNuZXQgZHJpdmVyIC0gQ09NMjAwMjAgUENNQ0lBIHN1cHBvcnQKKyAqIAorICogV3JpdHRlbiAxOTk0LTE5OTkgYnkgQXZlcnkgUGVubmFydW4sCisgKiAgICBiYXNlZCBvbiBhbiBJU0EgdmVyc2lvbiBieSBEYXZpZCBXb29kaG91c2UuCisgKiBEZXJpdmVkIGZyb20gaWJtdHJfY3MuYyBieSBTdGV2ZSBLaXBpc3ogKHBjbWNpYS1jcyAzLjEuNCkKKyAqICAgIHdoaWNoIHdhcyBkZXJpdmVkIGZyb20gcGNuZXRfY3MuYyBieSBEYXZpZCBIaW5kcy4KKyAqIFNvbWUgYWRkaXRpb25hbCBwb3J0aW9ucyBkZXJpdmVkIGZyb20gc2tlbGV0b24uYyBieSBEb25hbGQgQmVja2VyLgorICoKKyAqIFNwZWNpYWwgdGhhbmtzIHRvIENvbnRlbXBvcmFyeSBDb250cm9scywgSW5jLiAod3d3LmNjb250cm9scy5jb20pCisgKiAgZm9yIHNwb25zb3JpbmcgdGhlIGZ1cnRoZXIgZGV2ZWxvcG1lbnQgb2YgdGhpcyBkcml2ZXIuCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoZSBvcmlnaW5hbCBjb3B5cmlnaHQgb2Ygc2tlbGV0b24uYyB3YXMgYXMgZm9sbG93czoKKyAqCisgKiBza2VsZXRvbi5jIFdyaXR0ZW4gMTk5MyBieSBEb25hbGQgQmVja2VyLgorICogQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICogRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4gIFRoaXMgc29mdHdhcmUgbWF5IG9ubHkgYmUgdXNlZAorICogYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBtb2RpZmllZCBieSBTUkMsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICogCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKiBDaGFuZ2VzOgorICogQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+IC0gMDgvMDgvMjAwMAorICogLSByZW9yZ2FuaXplIGttYWxsb2NzIGluIGNvbTIwMDIwX2F0dGFjaCwgY2hlY2tpbmcgYWxsIGZvciBmYWlsdXJlCisgKiAgIGFuZCByZWxlYXNpbmcgdGhlIHByZXZpb3VzIGFsbG9jYXRpb25zIGlmIG9uZSBmYWlscworICogKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgZHJpdmVycy9uZXQvYXJjbmV0LmMKKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hcmNkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jb20yMDAyMC5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNkZWZpbmUgVkVSU0lPTiAiYXJjbmV0OiBDT00yMDAyMCBQQ01DSUEgc3VwcG9ydCBsb2FkZWQuXG4iCisKKyNpZmRlZiBQQ01DSUFfREVCVUcKKworc3RhdGljIGludCBwY19kZWJ1ZyA9IFBDTUNJQV9ERUJVRzsKK21vZHVsZV9wYXJhbShwY19kZWJ1ZywgaW50LCAwKTsKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgaWYgKHBjX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncykKKworc3RhdGljIHZvaWQgcmVnZHVtcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgY291bnQ7CisgICAgCisgICAgcHJpbnRrKCJjb20yMDAyMCByZWdpc3RlciBkdW1wOlxuIik7CisgICAgZm9yIChjb3VudCA9IGlvYWRkcjsgY291bnQgPCBpb2FkZHIgKyAxNjsgY291bnQrKykKKyAgICB7CisJaWYgKCEoY291bnQgJSAxNikpCisJICAgIHByaW50aygiXG4lMDRYOiAiLCBjb3VudCk7CisJcHJpbnRrKCIlMDJYICIsIGluYihjb3VudCkpOworICAgIH0KKyAgICBwcmludGsoIlxuIik7CisgICAgCisgICAgcHJpbnRrKCJidWZmZXIwIGR1bXA6XG4iKTsKKwkvKiBzZXQgdXAgdGhlIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKyAgICAgICAgY291bnQgPSAwOworCW91dGIoKGNvdW50ID4+IDgpIHwgUkREQVRBZmxhZyB8IEFVVE9JTkNmbGFnLCBfQUREUl9ISSk7CisJb3V0Yihjb3VudCAmIDB4ZmYsIF9BRERSX0xPKTsKKyAgICAKKyAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCAyNTYrMzI7IGNvdW50KyspCisgICAgeworCWlmICghKGNvdW50ICUgMTYpKQorCSAgICBwcmludGsoIlxuJTA0WDogIiwgY291bnQpOworCQorCS8qIGNvcHkgdGhlIGRhdGEgKi8KKwlwcmludGsoIiUwMlggIiwgaW5iKF9NRU1EQVRBKSk7CisgICAgfQorICAgIHByaW50aygiXG4iKTsKK30KKworI2Vsc2UKKworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBkbyB7IH0gd2hpbGUgKDApCitzdGF0aWMgaW5saW5lIHZvaWQgcmVnZHVtcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7IH0KKworI2VuZGlmCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IHdpdGggJ2luc21vZCcgKi8KKworc3RhdGljIGludCBub2RlOworc3RhdGljIGludCB0aW1lb3V0ID0gMzsKK3N0YXRpYyBpbnQgYmFja3BsYW5lOworc3RhdGljIGludCBjbG9ja3A7CitzdGF0aWMgaW50IGNsb2NrbTsKKworbW9kdWxlX3BhcmFtKG5vZGUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0odGltZW91dCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShiYWNrcGxhbmUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY2xvY2twLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGNsb2NrbSwgaW50LCAwKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgY29tMjAwMjBfY29uZmlnKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIHZvaWQgY29tMjAwMjBfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyBpbnQgY29tMjAwMjBfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpOworCitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJjb20yMDAyMF9jcyI7CisKK3N0YXRpYyBkZXZfbGlua190ICpjb20yMDAyMF9hdHRhY2godm9pZCk7CitzdGF0aWMgdm9pZCBjb20yMDAyMF9kZXRhY2goZGV2X2xpbmtfdCAqKTsKKworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordHlwZWRlZiBzdHJ1Y3QgY29tMjAwMjBfZGV2X3QgeworICAgIHN0cnVjdCBuZXRfZGV2aWNlICAgICAgICpkZXY7CisgICAgZGV2X25vZGVfdCAgICAgICAgICBub2RlOworfSBjb20yMDAyMF9kZXZfdDsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBjb20yMDAyMF9hdHRhY2goKSBjcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZworICAgIGxvY2FsIGRhdGEgc3RydWN0dXJlcyBmb3Igb25lIGRldmljZS4gIFRoZSBkZXZpY2UgaXMgcmVnaXN0ZXJlZAorICAgIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBkZXZfbGlua190ICpjb20yMDAyMF9hdHRhY2godm9pZCkKK3sKKyAgICBjbGllbnRfcmVnX3QgY2xpZW50X3JlZzsKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIGNvbTIwMDIwX2Rldl90ICppbmZvOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgaW50IHJldDsKKyAgICBzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscDsKKyAgICAKKyAgICBERUJVRygwLCAiY29tMjAwMjBfYXR0YWNoKClcbiIpOworCisgICAgLyogQ3JlYXRlIG5ldyBuZXR3b3JrIGRldmljZSAqLworICAgIGxpbmsgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGV2X2xpbmtfdCksIEdGUF9LRVJORUwpOworICAgIGlmICghbGluaykKKwlyZXR1cm4gTlVMTDsKKworICAgIGluZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY29tMjAwMjBfZGV2X3QpLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIWluZm8pCisJZ290byBmYWlsX2FsbG9jX2luZm87CisKKyAgICBkZXYgPSBhbGxvY19hcmNkZXYoIiIpOworICAgIGlmICghZGV2KQorCWdvdG8gZmFpbF9hbGxvY19kZXY7CisKKyAgICBtZW1zZXQoaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBjb20yMDAyMF9kZXZfdCkpOworICAgIG1lbXNldChsaW5rLCAwLCBzaXplb2Yoc3RydWN0IGRldl9saW5rX3QpKTsKKyAgICBscCA9IGRldi0+cHJpdjsKKyAgICBscC0+dGltZW91dCA9IHRpbWVvdXQ7CisgICAgbHAtPmJhY2twbGFuZSA9IGJhY2twbGFuZTsKKyAgICBscC0+Y2xvY2twID0gY2xvY2twOworICAgIGxwLT5jbG9ja20gPSBjbG9ja20gJiAzOworICAgIGxwLT5ody5vd25lciA9IFRISVNfTU9EVUxFOworCisgICAgLyogZmlsbCBpbiBvdXIgbW9kdWxlIHBhcmFtZXRlcnMgYXMgZGVmYXVsdHMgKi8KKyAgICBkZXYtPmRldl9hZGRyWzBdID0gbm9kZTsKKworICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisgICAgbGluay0+aW8uTnVtUG9ydHMxID0gMTY7CisgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSAxNjsKKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRTsKKyAgICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROworICAgIGxpbmstPmNvbmYuVmNjID0gNTA7CisgICAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisgICAgbGluay0+Y29uZi5QcmVzZW50ID0gUFJFU0VOVF9PUFRJT047CisKKworICAgIGxpbmstPmlycS5JbnN0YW5jZSA9IGluZm8tPmRldiA9IGRldjsKKyAgICBsaW5rLT5wcml2ID0gaW5mbzsKKworICAgIC8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKKyAgICBkZXZfbGlzdCA9IGxpbms7CisgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKKyAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9CisgICAgICAgIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKyAgICAgICAgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKyAgICAgICAgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKKyAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmY29tMjAwMjBfZXZlbnQ7CisgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisgICAgICAgIGNvbTIwMDIwX2RldGFjaChsaW5rKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGxpbms7CisKK2ZhaWxfYWxsb2NfZGV2OgorICAgIGtmcmVlKGluZm8pOworZmFpbF9hbGxvY19pbmZvOgorICAgIGtmcmVlKGxpbmspOworICAgIHJldHVybiBOVUxMOworfSAvKiBjb20yMDAyMF9hdHRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGlzIGRlbGV0ZXMgYSBkcml2ZXIgImluc3RhbmNlIi4gIFRoZSBkZXZpY2UgaXMgZGUtcmVnaXN0ZXJlZAorICAgIHdpdGggQ2FyZCBTZXJ2aWNlcy4gIElmIGl0IGhhcyBiZWVuIHJlbGVhc2VkLCBhbGwgbG9jYWwgZGF0YQorICAgIHN0cnVjdHVyZXMgYXJlIGZyZWVkLiAgT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGZyZWVkCisgICAgd2hlbiB0aGUgZGV2aWNlIGlzIHJlbGVhc2VkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgY29tMjAwMjBfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgc3RydWN0IGNvbTIwMDIwX2Rldl90ICppbmZvID0gbGluay0+cHJpdjsKKyAgICBkZXZfbGlua190ICoqbGlua3A7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsgCisgICAgCisgICAgREVCVUcoMSwiZGV0YWNoLi4uXG4iKTsKKworICAgIERFQlVHKDAsICJjb20yMDAyMF9kZXRhY2goMHglcClcbiIsIGxpbmspOworCisgICAgLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKyAgICBmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorICAgICAgICBpZiAoKmxpbmtwID09IGxpbmspIGJyZWFrOworICAgIGlmICgqbGlua3AgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZGV2ID0gaW5mby0+ZGV2OworCisgICAgaWYgKGxpbmstPmRldikgeworCURFQlVHKDEsInVucmVnaXN0ZXIuLi5cbiIpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkgICAgCisJLyoKKwkgKiB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIHJlZ2lzdGVyIG91ciBJUlEgc2VwYXJhdGVseQorCSAqIGZyb20gY2FyZCBzZXJ2aWNlcy4KKwkgKi8KKwlpZiAoZGV2LT5pcnEpCisJICAgIGZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworICAgIH0KKworICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisgICAgICAgIGNvbTIwMDIwX3JlbGVhc2UobGluayk7CisKKyAgICBpZiAobGluay0+aGFuZGxlKQorICAgICAgICBwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKworICAgIC8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIGJpdHMgKi8KKyAgICBERUJVRygxLCJ1bmxpbmtpbmcuLi5cbiIpOworICAgICpsaW5rcCA9IGxpbmstPm5leHQ7CisgICAgaWYgKGxpbmstPnByaXYpCisgICAgeworCWRldiA9IGluZm8tPmRldjsKKwlpZiAoZGV2KQorCXsKKwkgICAgREVCVUcoMSwia2ZyZWUuLi5cbiIpOworCSAgICBmcmVlX25ldGRldihkZXYpOworCX0KKwlERUJVRygxLCJrZnJlZTIuLi5cbiIpOworCWtmcmVlKGluZm8pOworICAgIH0KKyAgICBERUJVRygxLCJrZnJlZTMuLi5cbiIpOworICAgIGtmcmVlKGxpbmspOworCit9IC8qIGNvbTIwMDIwX2RldGFjaCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIGNvbTIwMDIwX2NvbmZpZygpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudAorICAgIGlzIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZQorICAgIGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgY29tMjAwMjBfY29uZmlnKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgc3RydWN0IGFyY25ldF9sb2NhbCAqbHA7CisgICAgY2xpZW50X2hhbmRsZV90IGhhbmRsZTsKKyAgICB0dXBsZV90IHR1cGxlOworICAgIGNpc3BhcnNlX3QgcGFyc2U7CisgICAgY29tMjAwMjBfZGV2X3QgKmluZm87CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBpbnQgaSwgbGFzdF9yZXQsIGxhc3RfZm47CisgICAgdV9jaGFyIGJ1Zls2NF07CisgICAgaW50IGlvYWRkcjsKKworICAgIGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKyAgICBpbmZvID0gbGluay0+cHJpdjsKKyAgICBkZXYgPSBpbmZvLT5kZXY7CisKKyAgICBERUJVRygxLCJjb25maWcuLi5cbiIpOworCisgICAgREVCVUcoMCwgImNvbTIwMDIwX2NvbmZpZygweCVwKVxuIiwgbGluayk7CisKKyAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKyAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7CisgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKworICAgIC8qIENvbmZpZ3VyZSBjYXJkICovCisgICAgbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKworICAgIERFQlVHKDEsImFyY25ldDogYmFzZXBvcnQxIGlzICVYaFxuIiwgbGluay0+aW8uQmFzZVBvcnQxKTsKKyAgICBpID0gIUNTX1NVQ0NFU1M7CisgICAgaWYgKCFsaW5rLT5pby5CYXNlUG9ydDEpCisgICAgeworCWZvciAoaW9hZGRyID0gMHgxMDA7IGlvYWRkciA8IDB4NDAwOyBpb2FkZHIgKz0gMHgxMCkKKwl7CisJICAgIGxpbmstPmlvLkJhc2VQb3J0MSA9IGlvYWRkcjsKKwkgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwkgICAgaWYgKGkgPT0gQ1NfU1VDQ0VTUykKKwkJYnJlYWs7CisJfQorICAgIH0KKyAgICBlbHNlCisJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgICAKKyAgICBpZiAoaSAhPSBDU19TVUNDRVNTKQorICAgIHsKKwlERUJVRygxLCJhcmNuZXQ6IHJlcXVlc3RJTyBmYWlsZWQgdG90YWxseSFcbiIpOworCWdvdG8gZmFpbGVkOworICAgIH0KKwkKKyAgICBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKyAgICBERUJVRygxLCJhcmNuZXQ6IGdvdCBpb2FkZHIgJVhoXG4iLCBpb2FkZHIpOworCisgICAgREVCVUcoMSwiYXJjbmV0OiByZXF1ZXN0IElSUSAlZCAoJVhoLyVYaClcbiIsCisJICAgbGluay0+aXJxLkFzc2lnbmVkSVJRLAorCSAgIGxpbmstPmlycS5JUlFJbmZvMSwgbGluay0+aXJxLklSUUluZm8yKTsKKyAgICBpID0gcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisgICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykKKyAgICB7CisJREVCVUcoMSwiYXJjbmV0OiByZXF1ZXN0SVJRIGZhaWxlZCB0b3RhbGx5IVxuIik7CisJZ290byBmYWlsZWQ7CisgICAgfQorCisgICAgZGV2LT5pcnEgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CisKKyAgICBDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKSk7CisKKyAgICBpZiAoY29tMjAwMjBfY2hlY2soZGV2KSkKKyAgICB7CisJcmVnZHVtcChkZXYpOworCWdvdG8gZmFpbGVkOworICAgIH0KKyAgICAKKyAgICBscCA9IGRldi0+cHJpdjsKKyAgICBscC0+Y2FyZF9uYW1lID0gIlBDTUNJQSBDT00yMDAyMCI7CisgICAgbHAtPmNhcmRfZmxhZ3MgPSBBUkNfQ0FOXzEwTUJJVDsgLyogcHJldGVuZCBhbGwgb2YgdGhlbSBjYW4gMTBNYml0ICovCisKKyAgICBsaW5rLT5kZXYgPSAmaW5mby0+bm9kZTsKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworICAgIFNFVF9ORVRERVZfREVWKGRldiwgJmhhbmRsZV90b19kZXYoaGFuZGxlKSk7CisKKyAgICBpID0gY29tMjAwMjBfZm91bmQoZGV2LCAwKTsJLyogY2FsbHMgcmVnaXN0ZXJfbmV0ZGV2ICovCisgICAgCisgICAgaWYgKGkgIT0gMCkgeworCURFQlVHKDEsS0VSTl9OT1RJQ0UgImNvbTIwMDIwX2NzOiBjb20yMDAyMF9mb3VuZCgpIGZhaWxlZFxuIik7CisJbGluay0+ZGV2ID0gTlVMTDsKKwlnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgICBzdHJjcHkoaW5mby0+bm9kZS5kZXZfbmFtZSwgZGV2LT5uYW1lKTsKKworICAgIERFQlVHKDEsS0VSTl9JTkZPICIlczogcG9ydCAlIzNseCwgaXJxICVkXG4iLAorICAgICAgICAgICBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CisgICAgcmV0dXJuOworCitjc19mYWlsZWQ6CisgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBsYXN0X2ZuLCBsYXN0X3JldCk7CitmYWlsZWQ6CisgICAgREVCVUcoMSwiY29tMjAwMjBfY29uZmlnIGZhaWxlZC4uLlxuIik7CisgICAgY29tMjAwMjBfcmVsZWFzZShsaW5rKTsKK30gLyogY29tMjAwMjBfY29uZmlnICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIGNvbTIwMDIwX3JlbGVhc2UoKSB3aWxsIHVucmVnaXN0ZXIgdGhlIG5ldAorICAgIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICAgIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgY29tMjAwMjBfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworCisgICAgREVCVUcoMSwicmVsZWFzZS4uLlxuIik7CisKKyAgICBERUJVRygwLCAiY29tMjAwMjBfcmVsZWFzZSgweCVwKVxuIiwgbGluayk7CisKKyAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisgICAgcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworICAgIHBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworCisgICAgbGluay0+c3RhdGUgJj0gfihERVZfQ09ORklHIHwgREVWX1JFTEVBU0VfUEVORElORyk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhlIGNhcmQgc3RhdHVzIGV2ZW50IGhhbmRsZXIuICBNb3N0bHksIHRoaXMgc2NoZWR1bGVzIG90aGVyCisgICAgc3R1ZmYgdG8gcnVuIGFmdGVyIGFuIGV2ZW50IGlzIHJlY2VpdmVkLiAgQSBDQVJEX1JFTU9WQUwgZXZlbnQKKyAgICBhbHNvIHNldHMgc29tZSBmbGFncyB0byBkaXNjb3VyYWdlIHRoZSBuZXQgZHJpdmVycyBmcm9tIHRyeWluZworICAgIHRvIHRhbGsgdG8gdGhlIGNhcmQgYW55IG1vcmUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGNvbTIwMDIwX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJCSAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworICAgIGRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKyAgICBjb20yMDAyMF9kZXZfdCAqaW5mbyA9IGxpbmstPnByaXY7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGluZm8tPmRldjsKKworICAgIERFQlVHKDEsICJjb20yMDAyMF9ldmVudCgweCUwNngpXG4iLCBldmVudCk7CisgICAgCisgICAgc3dpdGNoIChldmVudCkgeworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgorICAgICAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX1BSRVNFTlQ7CisgICAgICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisgICAgICAgICAgICBuZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisgICAgICAgIGxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UOworCWNvbTIwMDIwX2NvbmZpZyhsaW5rKTsgCisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgorICAgICAgICBsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKyAgICAgICAgLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKyAgICAgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworICAgICAgICAgICAgaWYgKGxpbmstPm9wZW4pIHsKKyAgICAgICAgICAgICAgICBuZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisgICAgICAgIGxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKyAgICAgICAgLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorICAgICAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisgICAgICAgICAgICBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworICAgICAgICAgICAgaWYgKGxpbmstPm9wZW4pIHsKKwkJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCQlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwkJQVJDUkVTRVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfSAvKiBjb20yMDAyMF9ldmVudCAqLworCisKKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIGNvbTIwMDIwX2NzX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gImNvbTIwMDIwX2NzIiwKKwl9LAorCS5hdHRhY2gJCT0gY29tMjAwMjBfYXR0YWNoLAorCS5kZXRhY2gJCT0gY29tMjAwMjBfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9jb20yMDAyMF9jcyh2b2lkKQoreworCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZjb20yMDAyMF9jc19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9jb20yMDAyMF9jcyh2b2lkKQoreworCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmY29tMjAwMjBfY3NfZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfY29tMjAwMjBfY3MpOworbW9kdWxlX2V4aXQoZXhpdF9jb20yMDAyMF9jcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvZm12ajE4eF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL2ZtdmoxOHhfY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDI0ODY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL2ZtdmoxOHhfY3MuYwpAQCAtMCwwICsxLDEyODYgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIGZtdmoxOHhfY3MuYyAyLjggMjAwMi8wMy8yMworCisgICAgQSBmbXZqMTh4IChhbmQgaXRzIGNvbXBhdGlibGVzKSBQQ01DSUEgY2xpZW50IGRyaXZlcgorCisgICAgQ29udHJpYnV0ZWQgYnkgU2hpbmdvIEZ1amltb3RvLCBzaGluZ29AZmxhYi5mdWppdHN1LmNvLmpwCisKKyAgICBUREsgTEFLLUNEMDIxIGFuZCBDT05URUMgQy1ORVQoUEMpQyBzdXBwb3J0IGFkZGVkIGJ5IAorICAgIE5vYnVoaXJvIEthdGF5YW1hLCBrYXRhLW5AcG8uaWlqbmV0Lm9yLmpwCisKKyAgICBUaGUgUENNQ0lBIGNsaWVudCBjb2RlIGlzIGJhc2VkIG9uIGNvZGUgd3JpdHRlbiBieSBEYXZpZCBIaW5kcy4KKyAgICBOZXR3b3JrIGNvZGUgaXMgYmFzZWQgb24gdGhlICJGTVYtMTh4IGRyaXZlciIgYnkgWXV0YWthIFRBTUlZQQorICAgIGJ1dCBpcyBhY3R1YWxseSBsYXJnZWx5IERvbmFsZCBCZWNrZXIncyBBVDE3MDAgZHJpdmVyLCB3aGljaAorICAgIGNhcnJpZXMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGlvbjoKKworICAgIFdyaXR0ZW4gMTk5My05NCBieSBEb25hbGQgQmVja2VyLgorCisgICAgQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICAgIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCisgICAgCisgICAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICAgIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgICAgCisgICAgVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKyAgICBTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKyAgICA0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorICAgIEFubmFwb2xpcyBNRCAyMTQwMworICAgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBEUlZfTkFNRQkiZm12ajE4eF9jcyIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjIuOCIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNjb2RlLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCisKK01PRFVMRV9ERVNDUklQVElPTigiZm12ajE4eCBhbmQgY29tcGF0aWJsZSBQQ01DSUEgZXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgSU5UX01PRFVMRV9QQVJNKG4sIHYpIHN0YXRpYyBpbnQgbiA9IHY7IG1vZHVsZV9wYXJhbShuLCBpbnQsIDApCisKKy8qIFNSQU0gY29uZmlndXJhdGlvbiAqLworLyogMDo0S0IqMiBUWCBidWZmZXIgICBlbHNlOjhLQioyIFRYIGJ1ZmZlciAqLworSU5UX01PRFVMRV9QQVJNKHNyYW1fY29uZmlnLCAwKTsKKworI2lmZGVmIFBDTUNJQV9ERUJVRworSU5UX01PRFVMRV9QQVJNKHBjX2RlYnVnLCBQQ01DSUFfREVCVUcpOworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBpZiAocGNfZGVidWc+KG4pKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKQorc3RhdGljIGNoYXIgKnZlcnNpb24gPSBEUlZfTkFNRSAiLmMgIiBEUlZfVkVSU0lPTiAiIDIwMDIvMDMvMjMiOworI2Vsc2UKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qCisgICAgUENNQ0lBIGV2ZW50IGhhbmRsZXJzCisgKi8KK3N0YXRpYyB2b2lkIGZtdmoxOHhfY29uZmlnKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIGludCBmbXZqMTh4X2dldF9od2luZm8oZGV2X2xpbmtfdCAqbGluaywgdV9jaGFyICpub2RlX2lkKTsKK3N0YXRpYyBpbnQgZm12ajE4eF9zZXR1cF9tZmMoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgdm9pZCBmbXZqMTh4X3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgaW50IGZtdmoxOHhfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpOworc3RhdGljIGRldl9saW5rX3QgKmZtdmoxOHhfYXR0YWNoKHZvaWQpOworc3RhdGljIHZvaWQgZm12ajE4eF9kZXRhY2goZGV2X2xpbmtfdCAqKTsKKworLyoKKyAgICBMQU4gY29udHJvbGxlcihNQkg4Njk2MEEpIHNwZWNpZmljIHJvdXRpbmVzCisgKi8KK3N0YXRpYyBpbnQgZmpuX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCk7CitzdGF0aWMgaW50IGZqbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBmam5fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGZqbl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGZqbl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBmam5fcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBmam5fcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmZqbl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGZqbl90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CisKK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvID0gImZtdmoxOHhfY3MiOworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0OworCisvKgorICAgIGNhcmQgdHlwZQorICovCit0eXBlZGVmIGVudW0geyBNQkgxMDMwMiwgTUJIMTAzMDQsIFRESywgQ09OVEVDLCBMQTUwMSwgVU5HRVJNQU5OLCAKKwkgICAgICAgWFhYMTAzMDQKK30gY2FyZHR5cGVfdDsKKworLyoKKyAgICBkcml2ZXIgc3BlY2lmaWMgZGF0YSBzdHJ1Y3R1cmUKKyovCit0eXBlZGVmIHN0cnVjdCBsb2NhbF9pbmZvX3QgeworICAgIGRldl9saW5rX3QgbGluazsKKyAgICBkZXZfbm9kZV90IG5vZGU7CisgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisgICAgbG9uZyBvcGVuX3RpbWU7CisgICAgdWludCB0eF9zdGFydGVkOjE7CisgICAgdWludCB0eF9xdWV1ZTsKKyAgICB1X3Nob3J0IHR4X3F1ZXVlX2xlbjsKKyAgICBjYXJkdHlwZV90IGNhcmR0eXBlOworICAgIHVfc2hvcnQgc2VudDsKKyAgICB1X2NoYXIgbWNfZmlsdGVyWzhdOworfSBsb2NhbF9pbmZvX3Q7CisKKyNkZWZpbmUgTUNfRklMVEVSQlJFQUsgNjQKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAKKyAgICBpb3BvcnQgb2Zmc2V0IGZyb20gdGhlIGJhc2UgYWRkcmVzcyAKKyAqLworI2RlZmluZSBUWF9TVEFUVVMgICAgICAgICAgICAgICAwIC8qIHRyYW5zbWl0IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBSWF9TVEFUVVMgICAgICAgICAgICAgICAxIC8qIHJlY2VpdmUgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIFRYX0lOVFIgICAgICAgICAgICAgICAgIDIgLyogdHJhbnNtaXQgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlhfSU5UUiAgICAgICAgICAgICAgICAgMyAvKiByZWNlaXZlIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCisjZGVmaW5lIFRYX01PREUgICAgICAgICAgICAgICAgIDQgLyogdHJhbnNtaXQgbW9kZSByZWdpc3RlciAqLworI2RlZmluZSBSWF9NT0RFICAgICAgICAgICAgICAgICA1IC8qIHJlY2VpdmUgbW9kZSByZWdpc3RlciAqLworI2RlZmluZSBDT05GSUdfMCAgICAgICAgICAgICAgICA2IC8qIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMCAqLworI2RlZmluZSBDT05GSUdfMSAgICAgICAgICAgICAgICA3IC8qIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgMSAqLworCisjZGVmaW5lIE5PREVfSUQgICAgICAgICAgICAgICAgIDggLyogbm9kZSBJRCByZWdpc3RlciAgICAgICAgICAgIChiYW5rIDApICovCisjZGVmaW5lIE1BUl9BRFIgICAgICAgICAgICAgICAgIDggLyogbXVsdGljYXN0IGFkZHJlc3MgcmVnaXN0ZXJzIChiYW5rIDEpICovCisKKyNkZWZpbmUgREFUQVBPUlQgICAgICAgICAgICAgICAgOCAvKiBidWZmZXIgbWVtIHBvcnQgcmVnaXN0ZXJzICAgKGJhbmsgMikgKi8KKyNkZWZpbmUgVFhfU1RBUlQgICAgICAgICAgICAgICAxMCAvKiB0cmFuc21pdCBzdGFydCByZWdpc3RlciAqLworI2RlZmluZSBDT0xfQ1RSTCAgICAgICAgICAgICAgIDExIC8qIDE2IGNvbGxpc2lvbiBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIEJNUFIxMiAgICAgICAgICAgICAgICAgMTIgLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQk1QUjEzICAgICAgICAgICAgICAgICAxMyAvKiByZXNlcnZlZCAqLworI2RlZmluZSBSWF9TS0lQICAgICAgICAgICAgICAgIDE0IC8qIHNraXAgcmVjZWl2ZWQgcGFja2V0IHJlZ2lzdGVyICovCisKKyNkZWZpbmUgTEFOX0NUUkwgICAgICAgICAgICAgICAxNiAvKiBMQU4gY2FyZCBjb250cm9sIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgTUFDX0lEICAgICAgICAgICAgICAgMHgxYSAvKiBoYXJkd2FyZSBhZGRyZXNzICovCisjZGVmaW5lIFVOR0VSTUFOTl9NQUNfSUQgICAgIDB4MTggLyogVU5HRVJNQU5OLUJBU1MgaGFyZHdhcmUgYWRkcmVzcyAqLworCisvKiAKKyAgICBjb250cm9sIGJpdHMgCisgKi8KKyNkZWZpbmUgRU5BX1RNVF9PSyAgICAgICAgICAgMHg4MAorI2RlZmluZSBFTkFfVE1UX1JFQyAgICAgICAgICAweDIwCisjZGVmaW5lIEVOQV9DT0wgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRU5BXzE2X0NPTCAgICAgICAgICAgMHgwMgorI2RlZmluZSBFTkFfVEJVU19FUlIgICAgICAgICAweDAxCisKKyNkZWZpbmUgRU5BX1BLVF9SRFkgICAgICAgICAgMHg4MAorI2RlZmluZSBFTkFfQlVTX0VSUiAgICAgICAgICAweDQwCisjZGVmaW5lIEVOQV9MRU5fRVJSICAgICAgICAgIDB4MDgKKyNkZWZpbmUgRU5BX0FMR19FUlIgICAgICAgICAgMHgwNAorI2RlZmluZSBFTkFfQ1JDX0VSUiAgICAgICAgICAweDAyCisjZGVmaW5lIEVOQV9PVlJfRkxPICAgICAgICAgIDB4MDEKKworLyogZmxhZ3MgKi8KKyNkZWZpbmUgRl9UTVRfUkRZICAgICAgICAgICAgMHg4MCAvKiBjYW4gYWNjZXB0IG5ldyBwYWNrZXQgKi8KKyNkZWZpbmUgRl9ORVRfQlNZICAgICAgICAgICAgMHg0MCAvKiBjYXJyaWVyIGlzIGRldGVjdGVkICovCisjZGVmaW5lIEZfVE1UX09LICAgICAgICAgICAgIDB4MjAgLyogc2VuZCBwYWNrZXQgc3VjY2Vzc2Z1bGx5ICovCisjZGVmaW5lIEZfU1JUX1BLVCAgICAgICAgICAgIDB4MTAgLyogc2hvcnQgcGFja2V0IGVycm9yICovCisjZGVmaW5lIEZfQ09MX0VSUiAgICAgICAgICAgIDB4MDQgLyogY29sbGlzaW9uIGVycm9yICovCisjZGVmaW5lIEZfMTZfQ09MICAgICAgICAgICAgIDB4MDIgLyogMTYgY29sbGlzaW9uIGVycm9yICovCisjZGVmaW5lIEZfVEJVU19FUlIgICAgICAgICAgIDB4MDEgLyogYnVzIHJlYWQgZXJyb3IgKi8KKworI2RlZmluZSBGX1BLVF9SRFkgICAgICAgICAgICAweDgwIC8qIHBhY2tldChzKSBpbiBidWZmZXIgKi8KKyNkZWZpbmUgRl9CVVNfRVJSICAgICAgICAgICAgMHg0MCAvKiBidXMgcmVhZCBlcnJvciAqLworI2RlZmluZSBGX0xFTl9FUlIgICAgICAgICAgICAweDA4IC8qIHNob3J0IHBhY2tldCAqLworI2RlZmluZSBGX0FMR19FUlIgICAgICAgICAgICAweDA0IC8qIGZyYW1lIGVycm9yICovCisjZGVmaW5lIEZfQ1JDX0VSUiAgICAgICAgICAgIDB4MDIgLyogQ1JDIGVycm9yICovCisjZGVmaW5lIEZfT1ZSX0ZMTyAgICAgICAgICAgIDB4MDEgLyogb3ZlcmZsb3cgZXJyb3IgKi8KKworI2RlZmluZSBGX0JVRl9FTVAgICAgICAgICAgICAweDQwIC8qIHJlY2VpdmUgYnVmZmVyIGlzIGVtcHR5ICovCisKKyNkZWZpbmUgRl9TS1BfUEtUICAgICAgICAgICAgMHgwNSAvKiBkcm9wIHBhY2tldCBpbiBidWZmZXIgKi8KKworLyogZGVmYXVsdCBiaXRtYXBzICovCisjZGVmaW5lIERfVFhfSU5UUiAgKCBFTkFfVE1UX09LICkKKyNkZWZpbmUgRF9SWF9JTlRSICAoIEVOQV9QS1RfUkRZIHwgRU5BX0xFTl9FUlIgXAorCQkgICB8IEVOQV9BTEdfRVJSIHwgRU5BX0NSQ19FUlIgfCBFTkFfT1ZSX0ZMTyApCisjZGVmaW5lIFRYX1NUQVRfTSAgKCBGX1RNVF9SRFkgKQorI2RlZmluZSBSWF9TVEFUX00gICggRl9QS1RfUkRZIHwgRl9MRU5fRVJSIFwKKyAgICAgICAgICAgICAgICAgICB8IEZfQUxHX0VSUiB8IEZfQ1JDX0VSUiB8IEZfT1ZSX0ZMTyApCisKKy8qIGNvbW1hbmRzICovCisjZGVmaW5lIERfVFhfTU9ERSAgICAgICAgICAgIDB4MDYgLyogbm8gdGVzdHMsIGRldGVjdCBjYXJyaWVyICovCisjZGVmaW5lIElEX01BVENIRUQgICAgICAgICAgIDB4MDIgLyogKFJYX01PREUpICovCisjZGVmaW5lIFJFQ1ZfQUxMICAgICAgICAgICAgIDB4MDMgLyogKFJYX01PREUpICovCisjZGVmaW5lIENPTkZJRzBfREZMICAgICAgICAgIDB4NWEgLyogMTZiaXQgYnVzLCA0SyB4IDIgVHggcXVldWVzICovCisjZGVmaW5lIENPTkZJRzBfREZMXzEgICAgICAgIDB4NWUgLyogMTZiaXQgYnVzLCA4SyB4IDIgVHggcXVldWVzICovCisjZGVmaW5lIENPTkZJRzBfUlNUICAgICAgICAgIDB4ZGEgLyogRGF0YSBMaW5rIENvbnRyb2xsZXIgb2ZmIChDT05GSUdfMCkgKi8KKyNkZWZpbmUgQ09ORklHMF9SU1RfMSAgICAgICAgMHhkZSAvKiBEYXRhIExpbmsgQ29udHJvbGxlciBvZmYgKENPTkZJR18wKSAqLworI2RlZmluZSBCQU5LXzAgICAgICAgICAgICAgICAweGEwIC8qIGJhbmsgMCAoQ09ORklHXzEpICovCisjZGVmaW5lIEJBTktfMSAgICAgICAgICAgICAgIDB4YTQgLyogYmFuayAxIChDT05GSUdfMSkgKi8KKyNkZWZpbmUgQkFOS18yICAgICAgICAgICAgICAgMHhhOCAvKiBiYW5rIDIgKENPTkZJR18xKSAqLworI2RlZmluZSBDSElQX09GRiAgICAgICAgICAgICAweDgwIC8qIGNvbnRybCBjaGlwIHBvd2VyIG9mZiAoQ09ORklHXzEpICovCisjZGVmaW5lIERPX1RYICAgICAgICAgICAgICAgIDB4ODAgLyogZG8gdHJhbnNtaXQgcGFja2V0ICovCisjZGVmaW5lIFNFTkRfUEtUICAgICAgICAgICAgIDB4ODEgLyogc2VuZCBhIHBhY2tldCAqLworI2RlZmluZSBBVVRPX01PREUgICAgICAgICAgICAweDA3IC8qIEF1dG8gc2tpcCBwYWNrZXQgb24gMTYgY29sIGRldGVjdGVkICovCisjZGVmaW5lIE1BTlVfTU9ERSAgICAgICAgICAgIDB4MDMgLyogU3RvcCBhbmQgc2tpcCBwYWNrZXQgb24gMTYgY29sICovCisjZGVmaW5lIFRES19BVVRPX01PREUgICAgICAgIDB4NDcgLyogQXV0byBza2lwIHBhY2tldCBvbiAxNiBjb2wgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgVERLX01BTlVfTU9ERSAgICAgICAgMHg0MyAvKiBTdG9wIGFuZCBza2lwIHBhY2tldCBvbiAxNiBjb2wgKi8KKyNkZWZpbmUgSU5UUl9PRkYgICAgICAgICAgICAgMHgwZCAvKiBMQU4gY29udHJvbGxlciBpZ25vcmVzIGludGVycnVwdHMgKi8KKyNkZWZpbmUgSU5UUl9PTiAgICAgICAgICAgICAgMHgxZCAvKiBMQU4gY29udHJvbGxlciB3aWxsIGNhdGNoIGludGVycnVwdHMgKi8KKworI2RlZmluZSBUWF9USU1FT1VUCQkoKDQwMCpIWikvMTAwMCkKKworI2RlZmluZSBCQU5LXzBVICAgICAgICAgICAgICAweDIwIC8qIGJhbmsgMCAoQ09ORklHXzEpICovCisjZGVmaW5lIEJBTktfMVUgICAgICAgICAgICAgIDB4MjQgLyogYmFuayAxIChDT05GSUdfMSkgKi8KKyNkZWZpbmUgQkFOS18yVSAgICAgICAgICAgICAgMHgyOCAvKiBiYW5rIDIgKENPTkZJR18xKSAqLworCitzdGF0aWMgZGV2X2xpbmtfdCAqZm12ajE4eF9hdHRhY2godm9pZCkKK3sKKyAgICBsb2NhbF9pbmZvX3QgKmxwOworICAgIGRldl9saW5rX3QgKmxpbms7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBjbGllbnRfcmVnX3QgY2xpZW50X3JlZzsKKyAgICBpbnQgcmV0OworICAgIAorICAgIERFQlVHKDAsICJmbXZqMTh4X2F0dGFjaCgpXG4iKTsKKworICAgIC8qIE1ha2UgdXAgYSBGTVZKMTh4IHNwZWNpZmljIGRhdGEgc3RydWN0dXJlICovCisgICAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKGxvY2FsX2luZm9fdCkpOworICAgIGlmICghZGV2KQorCXJldHVybiBOVUxMOworICAgIGxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBsaW5rID0gJmxwLT5saW5rOworICAgIGxpbmstPnByaXYgPSBkZXY7CisKKyAgICAvKiBUaGUgaW8gc3RydWN0dXJlIGRlc2NyaWJlcyBJTyBwb3J0IG1hcHBpbmcgKi8KKyAgICBsaW5rLT5pby5OdW1Qb3J0czEgPSAzMjsKKyAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gNTsKKworICAgIC8qIEludGVycnVwdCBzZXR1cCAqLworICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFIHwgSVJRX0hBTkRMRV9QUkVTRU5UOworICAgIGxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKKyAgICBsaW5rLT5pcnEuSGFuZGxlciA9ICZmam5faW50ZXJydXB0OworICAgIGxpbmstPmlycS5JbnN0YW5jZSA9IGRldjsKKyAgICAKKyAgICAvKiBHZW5lcmFsIHNvY2tldCBjb25maWd1cmF0aW9uICovCisgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROworICAgIGxpbmstPmNvbmYuVmNjID0gNTA7CisgICAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisKKyAgICAvKiBUaGUgRk1WSjE4eCBzcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZmam5fc3RhcnRfeG1pdDsKKyAgICBkZXYtPnNldF9jb25maWcgPSAmZmpuX2NvbmZpZzsKKyAgICBkZXYtPmdldF9zdGF0cyA9ICZmam5fZ2V0X3N0YXRzOworICAgIGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOworICAgIGRldi0+b3BlbiA9ICZmam5fb3BlbjsKKyAgICBkZXYtPnN0b3AgPSAmZmpuX2Nsb3NlOworI2lmZGVmIEhBVkVfVFhfVElNRU9VVAorICAgIGRldi0+dHhfdGltZW91dCA9IGZqbl90eF90aW1lb3V0OworICAgIGRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworI2VuZGlmCisgICAgU0VUX0VUSFRPT0xfT1BTKGRldiwgJm5ldGRldl9ldGh0b29sX29wcyk7CisgICAgCisgICAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgbGluay0+bmV4dCA9IGRldl9saXN0OworICAgIGRldl9saXN0ID0gbGluazsKKyAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KKwlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKwlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZmbXZqMTh4X2V2ZW50OworICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKKyAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOworICAgIGlmIChyZXQgIT0gMCkgeworCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisJZm12ajE4eF9kZXRhY2gobGluayk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGxpbms7Cit9IC8qIGZtdmoxOHhfYXR0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBmbXZqMTh4X2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGRldl9saW5rX3QgKipsaW5rcDsKKyAgICAKKyAgICBERUJVRygwLCAiZm12ajE4eF9kZXRhY2goMHglcClcbiIsIGxpbmspOworICAgIAorICAgIC8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisgICAgZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkKKwlpZiAoKmxpbmtwID09IGxpbmspIGJyZWFrOworICAgIGlmICgqbGlua3AgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICBpZiAobGluay0+ZGV2KQorCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKyAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCWZtdmoxOHhfcmVsZWFzZShsaW5rKTsKKworICAgIC8qIEJyZWFrIHRoZSBsaW5rIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworICAgIGlmIChsaW5rLT5oYW5kbGUpCisJcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGxpbmstPmhhbmRsZSk7CisgICAgCisgICAgLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGZyZWUgcGllY2VzICovCisgICAgKmxpbmtwID0gbGluay0+bmV4dDsKKyAgICBmcmVlX25ldGRldihkZXYpOworfSAvKiBmbXZqMTh4X2RldGFjaCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCitkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQorCitzdGF0aWMgaW50IG1mY190cnlfaW9fcG9ydChkZXZfbGlua190ICpsaW5rKQoreworICAgIGludCBpLCByZXQ7CisgICAgc3RhdGljIGtpb19hZGRyX3Qgc2VyaWFsX2Jhc2VbNV0gPSB7IDB4M2Y4LCAweDJmOCwgMHgzZTgsIDB4MmU4LCAweDAgfTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwlsaW5rLT5pby5CYXNlUG9ydDIgPSBzZXJpYWxfYmFzZVtpXTsKKwlsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF84OworCWlmIChsaW5rLT5pby5CYXNlUG9ydDIgPT0gMCkgeworCSAgICBsaW5rLT5pby5OdW1Qb3J0czIgPSAwOworCSAgICBwcmludGsoS0VSTl9OT1RJQ0UgImZtdmoxOHhfY3M6IG91dCBvZiByZXNvdXJjZSBmb3Igc2VyaWFsXG4iKTsKKwl9CisJcmV0ID0gcGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCWlmIChyZXQgPT0gQ1NfU1VDQ0VTUykgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB1bmdlcm1hbm5fdHJ5X2lvX3BvcnQoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBpbnQgcmV0OworICAgIGtpb19hZGRyX3QgaW9hZGRyOworICAgIC8qCisJVW5nZXJtYW5uLUJhc3MgQWNjZXNzL0NBUkQgYWNjZXB0cyAweDMwMCwweDMyMCwweDM0MCwweDM2MAorCTB4MzgwLDB4M2MwIG9ubHkgZm9yIGlvcG9ydC4KKyAgICAqLworICAgIGZvciAoaW9hZGRyID0gMHgzMDA7IGlvYWRkciA8IDB4M2UwOyBpb2FkZHIgKz0gMHgyMCkgeworCWxpbmstPmlvLkJhc2VQb3J0MSA9IGlvYWRkcjsKKwlyZXQgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJaWYgKHJldCA9PSBDU19TVUNDRVNTKSB7CisJICAgIC8qIGNhbGN1bGF0ZSBDb25maWdJbmRleCB2YWx1ZSAqLworCSAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gCisJCSgobGluay0+aW8uQmFzZVBvcnQxICYgMHgwZjApID4+IDMpIHwgMHgyMjsKKwkgICAgcmV0dXJuIHJldDsKKwl9CisgICAgfQorICAgIHJldHVybiByZXQ7CS8qIFJlcXVlc3RJTyBmYWlsZWQgKi8KK30KKworc3RhdGljIHZvaWQgZm12ajE4eF9jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBjbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGxvY2FsX2luZm9fdCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHR1cGxlX3QgdHVwbGU7CisgICAgY2lzcGFyc2VfdCBwYXJzZTsKKyAgICB1X3Nob3J0IGJ1ZlszMl07CisgICAgaW50IGksIGxhc3RfZm4sIGxhc3RfcmV0LCByZXQ7CisgICAga2lvX2FkZHJfdCBpb2FkZHI7CisgICAgY2FyZHR5cGVfdCBjYXJkdHlwZTsKKyAgICBjaGFyICpjYXJkX25hbWUgPSAidW5rbm93biI7CisgICAgdV9jaGFyICpub2RlX2lkOworCisgICAgREVCVUcoMCwgImZtdmoxOHhfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKKworICAgIC8qCisgICAgICAgVGhpcyByZWFkcyB0aGUgY2FyZCdzIENPTkZJRyB0dXBsZSB0byBmaW5kIGl0cyBjb25maWd1cmF0aW9uCisgICAgICAgcmVnaXN0ZXJzLgorICAgICovCisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKyAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgdHVwbGUuVHVwbGVEYXRhID0gKHVfY2hhciAqKWJ1ZjsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKKyAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICBDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworICAgIAorICAgIC8qIENvbmZpZ3VyZSBjYXJkICovCisgICAgbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKworICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOyAKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CisKKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfRlVOQ0U7CisgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICAgIGlmIChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSA9PSBDU19TVUNDRVNTKSB7CisJLyogWWVzLCBJIGhhdmUgQ0lTVFBMX0ZVTkNFLiBMZXQncyBjaGVjayBDSVNUUExfTUFORklEICovCisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CisJQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisJQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKwlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gcGFyc2UuY2Z0YWJsZV9lbnRyeS5pbmRleDsKKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfTUFORklEOworCWlmIChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSA9PSBDU19TVUNDRVNTKQorCSAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworCWVsc2UKKwkgICAgYnVmWzBdID0gMHhmZmZmOworCXN3aXRjaCAobGUxNl90b19jcHUoYnVmWzBdKSkgeworCWNhc2UgTUFORklEX1RESzoKKwkgICAgY2FyZHR5cGUgPSBUREs7CisJICAgIGlmIChsZTE2X3RvX2NwdShidWZbMV0pID09IFBST0RJRF9UREtfQ0YwMTApIHsKKwkJY3Nfc3RhdHVzX3Qgc3RhdHVzOworCQlwY21jaWFfZ2V0X3N0YXR1cyhoYW5kbGUsICZzdGF0dXMpOworCQlpZiAoc3RhdHVzLkNhcmRTdGF0ZSAmIENTX0VWRU5UXzNWQ0FSRCkKKwkJICAgIGxpbmstPmNvbmYuVmNjID0gMzM7IC8qIGluc2VydGVkIGluIDMuM1Ygc2xvdCAqLworCSAgICB9IGVsc2UgaWYgKGxlMTZfdG9fY3B1KGJ1ZlsxXSkgPT0gUFJPRElEX1RES19HTjM0MTApIHsKKwkJLyogTXVsdGlGdW5jdGlvbiBDYXJkICovCisJCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IDB4ODAwOworCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMHg0NzsKKwkJbGluay0+aW8uTnVtUG9ydHMyID0gODsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIE1BTkZJRF9DT05URUM6CisJICAgIGNhcmR0eXBlID0gQ09OVEVDOworCSAgICBicmVhazsKKwljYXNlIE1BTkZJRF9GVUpJVFNVOgorCSAgICBpZiAobGUxNl90b19jcHUoYnVmWzFdKSA9PSBQUk9ESURfRlVKSVRTVV9NQkgxMDMwMikKKyAgICAgICAgICAgICAgICAvKiBSQVRPQyBSRVgtNTU4OC85ODIyLzQ4ODYncyBQUk9ESUQgYXJlIDAwMDQoPU1CSDEwMzAyKSwKKyAgICAgICAgICAgICAgICAgICBidXQgdGhlc2UgYXJlIE1CSDEwMzA0IGJhc2VkIGNhcmQuICovIAorCQljYXJkdHlwZSA9IE1CSDEwMzA0OworCSAgICBlbHNlIGlmIChsZTE2X3RvX2NwdShidWZbMV0pID09IFBST0RJRF9GVUpJVFNVX01CSDEwMzA0KQorCQljYXJkdHlwZSA9IE1CSDEwMzA0OworCSAgICBlbHNlCisJCWNhcmR0eXBlID0gTEE1MDE7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIGNhcmR0eXBlID0gTUJIMTAzMDQ7CisJfQorICAgIH0gZWxzZSB7CisJLyogb2xkIHR5cGUgY2FyZCAqLworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9NQU5GSUQ7CisJaWYgKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpID09IENTX1NVQ0NFU1MpCisJICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisJZWxzZQorCSAgICBidWZbMF0gPSAweGZmZmY7CisJc3dpdGNoIChsZTE2X3RvX2NwdShidWZbMF0pKSB7CisJY2FzZSBNQU5GSURfRlVKSVRTVToKKwkgICAgaWYgKGxlMTZfdG9fY3B1KGJ1ZlsxXSkgPT0gUFJPRElEX0ZVSklUU1VfTUJIMTAzMDQpIHsKKwkJY2FyZHR5cGUgPSBYWFgxMDMwNDsgICAgLyogTUJIMTAzMDQgd2l0aCBidWdneSBDSVMgKi8KKwkgICAgICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAweDIwOworCSAgICB9IGVsc2UgeworCQljYXJkdHlwZSA9IE1CSDEwMzAyOyAgICAvKiBOZXh0Q29tIE5DNTMxMCwgZXRjLiAqLworCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIE1BTkZJRF9VTkdFUk1BTk46CisJICAgIGNhcmR0eXBlID0gVU5HRVJNQU5OOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBjYXJkdHlwZSA9IE1CSDEwMzAyOworCSAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMTsKKwl9CisgICAgfQorCisgICAgaWYgKGxpbmstPmlvLk51bVBvcnRzMiAhPSAwKSB7CisgICAgCWxpbmstPmlycS5BdHRyaWJ1dGVzID0KKwkJSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HfElSUV9GSVJTVF9TSEFSRUR8SVJRX0hBTkRMRV9QUkVTRU5UOworCXJldCA9IG1mY190cnlfaW9fcG9ydChsaW5rKTsKKwlpZiAocmV0ICE9IENTX1NVQ0NFU1MpIGdvdG8gY3NfZmFpbGVkOworICAgIH0gZWxzZSBpZiAoY2FyZHR5cGUgPT0gVU5HRVJNQU5OKSB7CisJcmV0ID0gdW5nZXJtYW5uX3RyeV9pb19wb3J0KGxpbmspOworCWlmIChyZXQgIT0gQ1NfU1VDQ0VTUykgZ290byBjc19mYWlsZWQ7CisgICAgfSBlbHNlIHsgCisJQ1NfQ0hFQ0soUmVxdWVzdElPLCBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbykpOworICAgIH0KKyAgICBDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKSk7CisgICAgQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZikpOworICAgIGRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworICAgIGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworCisgICAgaWYgKGxpbmstPmlvLkJhc2VQb3J0MiAhPSAwKQorCWZtdmoxOHhfc2V0dXBfbWZjKGxpbmspOworCisgICAgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICAvKiBSZXNldCBjb250cm9sbGVyICovCisgICAgaWYgKHNyYW1fY29uZmlnID09IDApIAorCW91dGIoQ09ORklHMF9SU1QsIGlvYWRkciArIENPTkZJR18wKTsKKyAgICBlbHNlCisJb3V0YihDT05GSUcwX1JTVF8xLCBpb2FkZHIgKyBDT05GSUdfMCk7CisKKyAgICAvKiBQb3dlciBPbiBjaGlwIGFuZCBzZWxlY3QgYmFuayAwICovCisgICAgaWYgKGNhcmR0eXBlID09IE1CSDEwMzAyKQorCW91dGIoQkFOS18wLCBpb2FkZHIgKyBDT05GSUdfMSk7CisgICAgZWxzZQorCW91dGIoQkFOS18wVSwgaW9hZGRyICsgQ09ORklHXzEpOworICAgIAorICAgIC8qIFNldCBoYXJkd2FyZSBhZGRyZXNzICovCisgICAgc3dpdGNoIChjYXJkdHlwZSkgeworICAgIGNhc2UgTUJIMTAzMDQ6CisgICAgY2FzZSBUREs6CisgICAgY2FzZSBMQTUwMToKKyAgICBjYXNlIENPTlRFQzoKKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfRlVOQ0U7CisJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwl0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisJQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKwlpZiAoY2FyZHR5cGUgPT0gTUJIMTAzMDQpIHsKKwkgICAgLyogTUJIMTAzMDQncyBDSVNfRlVOQ0UgaXMgY29ycnVwdGVkICovCisJICAgIG5vZGVfaWQgPSAmKHR1cGxlLlR1cGxlRGF0YVs1XSk7CisJICAgIGNhcmRfbmFtZSA9ICJGTVYtSjE4MiI7CisJfSBlbHNlIHsKKwkgICAgd2hpbGUgKHR1cGxlLlR1cGxlRGF0YVswXSAhPSBDSVNUUExfRlVOQ0VfTEFOX05PREVfSUQgKSB7CisJCUNTX0NIRUNLKEdldE5leHRUdXBsZSwgcGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJCUNTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisJICAgIH0KKwkgICAgbm9kZV9pZCA9ICYodHVwbGUuVHVwbGVEYXRhWzJdKTsKKwkgICAgaWYoIGNhcmR0eXBlID09IFRESyApIHsKKwkJY2FyZF9uYW1lID0gIlRESyBMQUstQ0QwMjEiOworCSAgICB9IGVsc2UgaWYoIGNhcmR0eXBlID09IExBNTAxICkgeworCQljYXJkX25hbWUgPSAiTEE1MDEiOworCSAgICB9IGVsc2UgeworCQljYXJkX25hbWUgPSAiQy1ORVQoUEMpQyI7CisJICAgIH0KKwl9CisJLyogUmVhZCBNQUNJRCBmcm9tIENJUyAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJICAgIGRldi0+ZGV2X2FkZHJbaV0gPSBub2RlX2lkW2ldOworCWJyZWFrOworICAgIGNhc2UgVU5HRVJNQU5OOgorCS8qIFJlYWQgTUFDSUQgZnJvbSByZWdpc3RlciAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIAorCSAgICBkZXYtPmRldl9hZGRyW2ldID0gaW5iKGlvYWRkciArIFVOR0VSTUFOTl9NQUNfSUQgKyBpKTsKKwljYXJkX25hbWUgPSAiQWNjZXNzL0NBUkQiOworCWJyZWFrOworICAgIGNhc2UgWFhYMTAzMDQ6CisJLyogUmVhZCBNQUNJRCBmcm9tIEJ1Z2d5IENJUyAqLworCWlmIChmbXZqMTh4X2dldF9od2luZm8obGluaywgdHVwbGUuVHVwbGVEYXRhKSA9PSAtMSkgeworCSAgICBwcmludGsoS0VSTl9OT1RJQ0UgImZtdmoxOHhfY3M6IHVuYWJsZSB0byByZWFkIGhhcmR3YXJlIG5ldCBhZGRyZXNzLlxuIik7CisJICAgIGdvdG8gZmFpbGVkOworCX0KKwlmb3IgKGkgPSAwIDsgaSA8IDY7IGkrKykgeworCSAgICBkZXYtPmRldl9hZGRyW2ldID0gdHVwbGUuVHVwbGVEYXRhW2ldOworCX0KKwljYXJkX25hbWUgPSAiRk1WLUoxODIiOworCWJyZWFrOworICAgIGNhc2UgTUJIMTAzMDI6CisgICAgZGVmYXVsdDoKKwkvKiBSZWFkIE1BQ0lEIGZyb20gcmVnaXN0ZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSAKKwkgICAgZGV2LT5kZXZfYWRkcltpXSA9IGluYihpb2FkZHIgKyBNQUNfSUQgKyBpKTsKKwljYXJkX25hbWUgPSAiRk1WLUoxODEiOworCWJyZWFrOworICAgIH0KKworICAgIGxwLT5jYXJkdHlwZSA9IGNhcmR0eXBlOworICAgIGxpbmstPmRldiA9ICZscC0+bm9kZTsKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworICAgIFNFVF9ORVRERVZfREVWKGRldiwgJmhhbmRsZV90b19kZXYoaGFuZGxlKSk7CisKKyAgICBpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgIT0gMCkgeworCXByaW50ayhLRVJOX05PVElDRSAiZm12ajE4eF9jczogcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKKwlsaW5rLT5kZXYgPSBOVUxMOworCWdvdG8gZmFpbGVkOworICAgIH0KKworICAgIHN0cmNweShscC0+bm9kZS5kZXZfbmFtZSwgZGV2LT5uYW1lKTsKKworICAgIC8qIHByaW50IGN1cnJlbnQgY29uZmlndXJhdGlvbiAqLworICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiAlcywgc3JhbSAlcywgcG9ydCAlIzNseCwgaXJxICVkLCBod19hZGRyICIsIAorCSAgIGRldi0+bmFtZSwgY2FyZF9uYW1lLCBzcmFtX2NvbmZpZyA9PSAwID8gIjRLIFRYKjIiIDogIjhLIFRYKjIiLCAKKwkgICBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJcHJpbnRrKCIlMDJYJXMiLCBkZXYtPmRldl9hZGRyW2ldLCAoKGk8NSkgPyAiOiIgOiAiXG4iKSk7CisKKyAgICByZXR1cm47CisgICAgCitjc19mYWlsZWQ6CisgICAgLyogQWxsIENhcmQgU2VydmljZXMgZXJyb3JzIGVuZCB1cCBoZXJlICovCisgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBsYXN0X2ZuLCBsYXN0X3JldCk7CitmYWlsZWQ6CisgICAgZm12ajE4eF9yZWxlYXNlKGxpbmspOworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisKK30gLyogZm12ajE4eF9jb25maWcgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGZtdmoxOHhfZ2V0X2h3aW5mbyhkZXZfbGlua190ICpsaW5rLCB1X2NoYXIgKm5vZGVfaWQpCit7CisgICAgd2luX3JlcV90IHJlcTsKKyAgICBtZW1yZXFfdCBtZW07CisgICAgdV9jaGFyIF9faW9tZW0gKmJhc2U7CisgICAgaW50IGksIGo7CisKKyAgICAvKiBBbGxvY2F0ZSBhIHNtYWxsIG1lbW9yeSB3aW5kb3cgKi8KKyAgICByZXEuQXR0cmlidXRlcyA9IFdJTl9EQVRBX1dJRFRIXzh8V0lOX01FTU9SWV9UWVBFX0FNfFdJTl9FTkFCTEU7CisgICAgcmVxLkJhc2UgPSAwOyByZXEuU2l6ZSA9IDA7CisgICAgcmVxLkFjY2Vzc1NwZWVkID0gMDsKKyAgICBpID0gcGNtY2lhX3JlcXVlc3Rfd2luZG93KCZsaW5rLT5oYW5kbGUsICZyZXEsICZsaW5rLT53aW4pOworICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHsKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlcXVlc3RXaW5kb3csIGkpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBiYXNlID0gaW9yZW1hcChyZXEuQmFzZSwgcmVxLlNpemUpOworICAgIG1lbS5QYWdlID0gMDsKKyAgICBtZW0uQ2FyZE9mZnNldCA9IDA7CisgICAgcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLT53aW4sICZtZW0pOworCisgICAgLyoKKyAgICAgKiAgTUJIMTAzMDQgQ0lTVFBMX0ZVTkNFX0xBTl9OT0RFX0lEIGZvcm1hdAorICAgICAqICAyMiAwZCB4eCB4eCB4eCAwNCAwNiB5eSB5eSB5eSB5eSB5eSB5eSBmZgorICAgICAqICAneHgnIGlzIGdhcmJhZ2UuCisgICAgICogICd5eScgaXMgTUFDIGFkZHJlc3MuCisgICAgKi8gCisgICAgZm9yIChpID0gMDsgaSA8IDB4MjAwOyBpKyspIHsKKwlpZiAocmVhZGIoYmFzZStpKjIpID09IDB4MjIpIHsJCisJICAgIGlmIChyZWFkYihiYXNlKyhpLTEpKjIpID09IDB4ZmYKKwkgICAgICYmIHJlYWRiKGJhc2UrKGkrNSkqMikgPT0gMHgwNAorCSAgICAgJiYgcmVhZGIoYmFzZSsoaSs2KSoyKSA9PSAweDA2CisJICAgICAmJiByZWFkYihiYXNlKyhpKzEzKSoyKSA9PSAweGZmKSAKKwkJYnJlYWs7CisJfQorICAgIH0KKworICAgIGlmIChpICE9IDB4MjAwKSB7CisJZm9yIChqID0gMCA7IGogPCA2OyBqKyssaSsrKSB7CisJICAgIG5vZGVfaWRbal0gPSByZWFkYihiYXNlKyhpKzcpKjIpOworCX0KKyAgICB9CisKKyAgICBpb3VubWFwKGJhc2UpOworICAgIGogPSBwY21jaWFfcmVsZWFzZV93aW5kb3cobGluay0+d2luKTsKKyAgICBpZiAoaiAhPSBDU19TVUNDRVNTKQorCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVsZWFzZVdpbmRvdywgaik7CisgICAgcmV0dXJuIChpICE9IDB4MjAwKSA/IDAgOiAtMTsKKworfSAvKiBmbXZqMTh4X2dldF9od2luZm8gKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGZtdmoxOHhfc2V0dXBfbWZjKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgd2luX3JlcV90IHJlcTsKKyAgICBtZW1yZXFfdCBtZW07CisgICAgdV9jaGFyIF9faW9tZW0gKmJhc2U7CisgICAgaW50IGksIGo7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAga2lvX2FkZHJfdCBpb2FkZHI7CisKKyAgICAvKiBBbGxvY2F0ZSBhIHNtYWxsIG1lbW9yeSB3aW5kb3cgKi8KKyAgICByZXEuQXR0cmlidXRlcyA9IFdJTl9EQVRBX1dJRFRIXzh8V0lOX01FTU9SWV9UWVBFX0FNfFdJTl9FTkFCTEU7CisgICAgcmVxLkJhc2UgPSAwOyByZXEuU2l6ZSA9IDA7CisgICAgcmVxLkFjY2Vzc1NwZWVkID0gMDsKKyAgICBpID0gcGNtY2lhX3JlcXVlc3Rfd2luZG93KCZsaW5rLT5oYW5kbGUsICZyZXEsICZsaW5rLT53aW4pOworICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHsKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlcXVlc3RXaW5kb3csIGkpOworCXJldHVybiAtMTsKKyAgICB9CisKKyAgICBiYXNlID0gaW9yZW1hcChyZXEuQmFzZSwgcmVxLlNpemUpOworICAgIG1lbS5QYWdlID0gMDsKKyAgICBtZW0uQ2FyZE9mZnNldCA9IDA7CisgICAgcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLT53aW4sICZtZW0pOworCisgICAgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgd3JpdGViKDB4NDcsIGJhc2UrMHg4MDApOwkvKiBDb25maWcgT3B0aW9uIFJlZ2lzdGVyIG9mIExBTiAqLworICAgIHdyaXRlYigweDAsIGJhc2UrMHg4MDIpOwkvKiBDb25maWcgYW5kIFN0YXR1cyBSZWdpc3RlciAqLworCisgICAgd3JpdGViKGlvYWRkciAmIDB4ZmYsIGJhc2UrMHg4MGEpOwkJLyogSS9PIEJhc2UoTG93KSBvZiBMQU4gKi8KKyAgICB3cml0ZWIoKGlvYWRkciA+PiA4KSAmIDB4ZmYsIGJhc2UrMHg4MGMpOwkvKiBJL08gQmFzZShIaWdoKSBvZiBMQU4gKi8KKyAgIAorICAgIHdyaXRlYigweDQ1LCBiYXNlKzB4ODIwKTsJLyogQ29uZmlnIE9wdGlvbiBSZWdpc3RlciBvZiBNb2RlbSAqLworICAgIHdyaXRlYigweDgsIGJhc2UrMHg4MjIpOwkvKiBDb25maWcgYW5kIFN0YXR1cyBSZWdpc3RlciAqLworCisgICAgaW91bm1hcChiYXNlKTsKKyAgICBqID0gcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxpbmstPndpbik7CisgICAgaWYgKGogIT0gQ1NfU1VDQ0VTUykKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlbGVhc2VXaW5kb3csIGopOworICAgIHJldHVybiAwOworCit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgZm12ajE4eF9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspCit7CisKKyAgICBERUJVRygwLCAiZm12ajE4eF9yZWxlYXNlKDB4JXApXG4iLCBsaW5rKTsKKworICAgIC8qIERvbid0IGJvdGhlciBjaGVja2luZyB0byBzZWUgaWYgdGhlc2Ugc3VjY2VlZCBvciBub3QgKi8KKyAgICBwY21jaWFfcmVsZWFzZV93aW5kb3cobGluay0+d2luKTsKKyAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisgICAgcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworICAgIHBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworICAgIAorICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBmbXZqMTh4X2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJCSAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworICAgIGRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKworICAgIERFQlVHKDEsICJmbXZqMTh4X2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKyAgICAKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJICAgIG5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorCWxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOworCWZtdmoxOHhfY29uZmlnKGxpbmspOworCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwlsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkgICAgaWYgKGxpbmstPm9wZW4pCisJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwkgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCX0KKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisJLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFU0VUOgorCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkgICAgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKwkgICAgaWYgKGxpbmstPm9wZW4pIHsKKwkJZmpuX3Jlc2V0KGRldik7CisJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwkgICAgfQorCX0KKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9IC8qIGZtdmoxOHhfZXZlbnQgKi8KKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIGZtdmoxOHhfY3NfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSAiZm12ajE4eF9jcyIsCisJfSwKKwkuYXR0YWNoCQk9IGZtdmoxOHhfYXR0YWNoLAorCS5kZXRhY2gJCT0gZm12ajE4eF9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2ZtdmoxOHhfY3Modm9pZCkKK3sKKwlyZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmZm12ajE4eF9jc19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9mbXZqMTh4X2NzKHZvaWQpCit7CisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZmbXZqMTh4X2NzX2RyaXZlcik7CisJQlVHX09OKGRldl9saXN0ICE9IE5VTEwpOworfQorCittb2R1bGVfaW5pdChpbml0X2ZtdmoxOHhfY3MpOworbW9kdWxlX2V4aXQoZXhpdF9mbXZqMTh4X2NzKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBmam5faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKyAgICBsb2NhbF9pbmZvX3QgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkcjsKKyAgICB1bnNpZ25lZCBzaG9ydCB0eF9zdGF0LCByeF9zdGF0OworCisgICAgaWYgKGxwID09IE5VTEwpIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fTk9USUNFICJmam5faW50ZXJydXB0KCk6IGlycSAlZCBmb3IgIgorCSAgICAgICAidW5rbm93biBkZXZpY2UuXG4iLCBpcnEpOworICAgICAgICByZXR1cm4gSVJRX05PTkU7CisgICAgfQorICAgIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgICAgLyogYXZvaWQgbXVsdGlwbGUgaW50ZXJydXB0cyAqLworICAgIG91dHcoMHgwMDAwLCBpb2FkZHIgKyBUWF9JTlRSKTsKKworICAgIC8qIHdhaXQgZm9yIGEgd2hpbGUgKi8KKyAgICB1ZGVsYXkoMSk7CisKKyAgICAvKiBnZXQgc3RhdHVzICovCisgICAgdHhfc3RhdCA9IGluYihpb2FkZHIgKyBUWF9TVEFUVVMpOworICAgIHJ4X3N0YXQgPSBpbmIoaW9hZGRyICsgUlhfU1RBVFVTKTsKKworICAgIC8qIGNsZWFyIHN0YXR1cyAqLworICAgIG91dGIodHhfc3RhdCwgaW9hZGRyICsgVFhfU1RBVFVTKTsKKyAgICBvdXRiKHJ4X3N0YXQsIGlvYWRkciArIFJYX1NUQVRVUyk7CisgICAgCisgICAgREVCVUcoNCwgIiVzOiBpbnRlcnJ1cHQsIHJ4X3N0YXR1cyAlMDJ4LlxuIiwgZGV2LT5uYW1lLCByeF9zdGF0KTsKKyAgICBERUJVRyg0LCAiICAgICAgICAgICAgICAgdHhfc3RhdHVzICUwMnguXG4iLCB0eF9zdGF0KTsKKyAgICAKKyAgICBpZiAocnhfc3RhdCB8fCAoaW5iKGlvYWRkciArIFJYX01PREUpICYgRl9CVUZfRU1QKSA9PSAwKSB7CisJLyogdGhlcmUgaXMgcGFja2V0KHMpIGluIHJ4IGJ1ZmZlciAqLworCWZqbl9yeChkZXYpOworICAgIH0KKyAgICBpZiAodHhfc3RhdCAmIEZfVE1UX1JEWSkgeworCWxwLT5zdGF0cy50eF9wYWNrZXRzICs9IGxwLT5zZW50IDsKKyAgICAgICAgbHAtPnNlbnQgPSAwIDsKKwlpZiAobHAtPnR4X3F1ZXVlKSB7CisJICAgIG91dGIoRE9fVFggfCBscC0+dHhfcXVldWUsIGlvYWRkciArIFRYX1NUQVJUKTsKKwkgICAgbHAtPnNlbnQgPSBscC0+dHhfcXVldWUgOworCSAgICBscC0+dHhfcXVldWUgPSAwOworCSAgICBscC0+dHhfcXVldWVfbGVuID0gMDsKKwkgICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJfSBlbHNlIHsKKwkgICAgbHAtPnR4X3N0YXJ0ZWQgPSAwOworCX0KKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisgICAgfQorICAgIERFQlVHKDQsICIlczogZXhpdGluZyBpbnRlcnJ1cHQsXG4iLCBkZXYtPm5hbWUpOworICAgIERFQlVHKDQsICIgICAgdHhfc3RhdHVzICUwMngsIHJ4X3N0YXR1cyAlMDJ4LlxuIiwgdHhfc3RhdCwgcnhfc3RhdCk7CisKKyAgICBvdXRiKERfVFhfSU5UUiwgaW9hZGRyICsgVFhfSU5UUik7CisgICAgb3V0YihEX1JYX0lOVFIsIGlvYWRkciArIFJYX0lOVFIpOworICAgIHJldHVybiBJUlFfSEFORExFRDsKKworfSAvKiBmam5faW50ZXJydXB0ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBmam5fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBsb2NhbF9pbmZvX3QgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgICAgcHJpbnRrKEtFUk5fTk9USUNFICIlczogdHJhbnNtaXQgdGltZWQgb3V0IHdpdGggc3RhdHVzICUwNHgsICVzP1xuIiwKKwkgICBkZXYtPm5hbWUsIGh0b25zKGludyhpb2FkZHIgKyBUWF9TVEFUVVMpKSwKKwkgICBpbmIoaW9hZGRyICsgVFhfU1RBVFVTKSAmIEZfVE1UX1JEWQorCSAgID8gIklSUSBjb25mbGljdCIgOiAibmV0d29yayBjYWJsZSBwcm9ibGVtIik7CisgICAgcHJpbnRrKEtFUk5fTk9USUNFICIlczogdGltZW91dCByZWdpc3RlcnM6ICUwNHggJTA0eCAlMDR4ICIKKwkgICAiJTA0eCAlMDR4ICUwNHggJTA0eCAlMDR4LlxuIiwKKwkgICBkZXYtPm5hbWUsIGh0b25zKGludyhpb2FkZHIgKyAwKSksCisJICAgaHRvbnMoaW53KGlvYWRkciArIDIpKSwgaHRvbnMoaW53KGlvYWRkciArIDQpKSwKKwkgICBodG9ucyhpbncoaW9hZGRyICsgNikpLCBodG9ucyhpbncoaW9hZGRyICsgOCkpLAorCSAgIGh0b25zKGludyhpb2FkZHIgKzEwKSksIGh0b25zKGludyhpb2FkZHIgKzEyKSksCisJICAgaHRvbnMoaW53KGlvYWRkciArMTQpKSk7CisgICAgbHAtPnN0YXRzLnR4X2Vycm9ycysrOworICAgIC8qIFRvRG86IFdlIHNob3VsZCB0cnkgdG8gcmVzdGFydCB0aGUgYWRhcHRvci4uLiAqLworICAgIGxvY2FsX2lycV9kaXNhYmxlKCk7CisgICAgZmpuX3Jlc2V0KGRldik7CisKKyAgICBscC0+dHhfc3RhcnRlZCA9IDA7CisgICAgbHAtPnR4X3F1ZXVlID0gMDsKKyAgICBscC0+dHhfcXVldWVfbGVuID0gMDsKKyAgICBscC0+c2VudCA9IDA7CisgICAgbHAtPm9wZW5fdGltZSA9IGppZmZpZXM7CisgICAgbG9jYWxfaXJxX2VuYWJsZSgpOworICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBmam5fc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBsb2NhbF9pbmZvX3QgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHNob3J0IGxlbmd0aCA9IHNrYi0+bGVuOworICAgIAorICAgIGlmIChsZW5ndGggPCBFVEhfWkxFTikKKyAgICB7CisgICAgCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKKyAgICAJaWYgKHNrYiA9PSBOVUxMKQorICAgIAkJcmV0dXJuIDA7CisgICAgCWxlbmd0aCA9IEVUSF9aTEVOOworICAgIH0KKworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworICAgIHsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSBza2ItPmRhdGE7CisKKwlpZiAobGVuZ3RoID4gRVRIX0ZSQU1FX0xFTikgeworCSAgICBwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBBdHRlbXB0aW5nIHRvIHNlbmQgYSBsYXJnZSBwYWNrZXQiCisJCSAgICIgKCVkIGJ5dGVzKS5cbiIsIGRldi0+bmFtZSwgbGVuZ3RoKTsKKwkgICAgcmV0dXJuIDE7CisJfQorCisJREVCVUcoNCwgIiVzOiBUcmFuc21pdHRpbmcgYSBwYWNrZXQgb2YgbGVuZ3RoICVsdS5cbiIsCisJICAgICAgZGV2LT5uYW1lLCAodW5zaWduZWQgbG9uZylza2ItPmxlbik7CisJbHAtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCisJLyogRGlzYWJsZSBib3RoIGludGVycnVwdHMuICovCisJb3V0dygweDAwMDAsIGlvYWRkciArIFRYX0lOVFIpOworCisJLyogd2FpdCBmb3IgYSB3aGlsZSAqLworCXVkZWxheSgxKTsKKworCW91dHcobGVuZ3RoLCBpb2FkZHIgKyBEQVRBUE9SVCk7CisJb3V0c3coaW9hZGRyICsgREFUQVBPUlQsIGJ1ZiwgKGxlbmd0aCArIDEpID4+IDEpOworCisJbHAtPnR4X3F1ZXVlKys7CisJbHAtPnR4X3F1ZXVlX2xlbiArPSAoKGxlbmd0aCszKSAmIH4xKTsKKworCWlmIChscC0+dHhfc3RhcnRlZCA9PSAwKSB7CisJICAgIC8qIElmIHRoZSBUeCBpcyBpZGxlLCBhbHdheXMgdHJpZ2dlciBhIHRyYW5zbWl0LiAqLworCSAgICBvdXRiKERPX1RYIHwgbHAtPnR4X3F1ZXVlLCBpb2FkZHIgKyBUWF9TVEFSVCk7CisJICAgIGxwLT5zZW50ID0gbHAtPnR4X3F1ZXVlIDsKKwkgICAgbHAtPnR4X3F1ZXVlID0gMDsKKwkgICAgbHAtPnR4X3F1ZXVlX2xlbiA9IDA7CisJICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCSAgICBscC0+dHhfc3RhcnRlZCA9IDE7CisJICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJfSBlbHNlIHsKKwkgICAgaWYoIHNyYW1fY29uZmlnID09IDAgKSB7CisJCWlmIChscC0+dHhfcXVldWVfbGVuIDwgKDQwOTYgLSAoRVRIX0ZSQU1FX0xFTiArMikpICkKKwkJICAgIC8qIFllcywgdGhlcmUgaXMgcm9vbSBmb3Igb25lIG1vcmUgcGFja2V0LiAqLworCQkgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkgICAgfSBlbHNlIHsKKwkJaWYgKGxwLT50eF9xdWV1ZV9sZW4gPCAoODE5MiAtIChFVEhfRlJBTUVfTEVOICsyKSkgJiYgCisJCQkJCQlscC0+dHhfcXVldWUgPCAxMjcgKQorCQkgICAgLyogWWVzLCB0aGVyZSBpcyByb29tIGZvciBvbmUgbW9yZSBwYWNrZXQuICovCisJCSAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCSAgICB9CisJfQorCisJLyogUmUtZW5hYmxlIGludGVycnVwdHMgKi8KKwlvdXRiKERfVFhfSU5UUiwgaW9hZGRyICsgVFhfSU5UUik7CisJb3V0YihEX1JYX0lOVFIsIGlvYWRkciArIFJYX0lOVFIpOworICAgIH0KKyAgICBkZXZfa2ZyZWVfc2tiIChza2IpOworCisgICAgcmV0dXJuIDA7Cit9IC8qIGZqbl9zdGFydF94bWl0ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBmam5fcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgbG9jYWxfaW5mb190ICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgaTsKKworICAgIERFQlVHKDQsICJmam5fcmVzZXQoJXMpIGNhbGxlZC5cbiIsZGV2LT5uYW1lKTsKKworICAgIC8qIFJlc2V0IGNvbnRyb2xsZXIgKi8KKyAgICBpZiggc3JhbV9jb25maWcgPT0gMCApIAorCW91dGIoQ09ORklHMF9SU1QsIGlvYWRkciArIENPTkZJR18wKTsKKyAgICBlbHNlCisJb3V0YihDT05GSUcwX1JTVF8xLCBpb2FkZHIgKyBDT05GSUdfMCk7CisKKyAgICAvKiBQb3dlciBPbiBjaGlwIGFuZCBzZWxlY3QgYmFuayAwICovCisgICAgaWYgKGxwLT5jYXJkdHlwZSA9PSBNQkgxMDMwMikKKwlvdXRiKEJBTktfMCwgaW9hZGRyICsgQ09ORklHXzEpOworICAgIGVsc2UKKwlvdXRiKEJBTktfMFUsIGlvYWRkciArIENPTkZJR18xKTsKKworICAgIC8qIFNldCBUeCBtb2RlcyAqLworICAgIG91dGIoRF9UWF9NT0RFLCBpb2FkZHIgKyBUWF9NT0RFKTsKKyAgICAvKiBzZXQgUnggbW9kZXMgKi8KKyAgICBvdXRiKElEX01BVENIRUQsIGlvYWRkciArIFJYX01PREUpOworCisgICAgLyogU2V0IGhhcmR3YXJlIGFkZHJlc3MgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSAKKyAgICAgICAgb3V0YihkZXYtPmRldl9hZGRyW2ldLCBpb2FkZHIgKyBOT0RFX0lEICsgaSk7CisKKyAgICAvKiBTd2l0Y2ggdG8gYmFuayAxICovCisgICAgaWYgKGxwLT5jYXJkdHlwZSA9PSBNQkgxMDMwMikKKwlvdXRiKEJBTktfMSwgaW9hZGRyICsgQ09ORklHXzEpOworICAgIGVsc2UKKwlvdXRiKEJBTktfMVUsIGlvYWRkciArIENPTkZJR18xKTsKKworICAgIC8qIHNldCB0aGUgbXVsdGljYXN0IHRhYmxlIHRvIGFjY2VwdCBub25lLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIAorICAgICAgICBvdXRiKDB4MDAsIGlvYWRkciArIE1BUl9BRFIgKyBpKTsKKworICAgIC8qIFN3aXRjaCB0byBiYW5rIDIgKHJ1bnRpbWUgbW9kZSkgKi8KKyAgICBpZiAobHAtPmNhcmR0eXBlID09IE1CSDEwMzAyKQorCW91dGIoQkFOS18yLCBpb2FkZHIgKyBDT05GSUdfMSk7CisgICAgZWxzZQorCW91dGIoQkFOS18yVSwgaW9hZGRyICsgQ09ORklHXzEpOworCisgICAgLyogc2V0IDE2Y29sIGN0cmwgYml0cyAqLworICAgIGlmKCBscC0+Y2FyZHR5cGUgPT0gVERLIHx8IGxwLT5jYXJkdHlwZSA9PSBDT05URUMpIAorICAgICAgICBvdXRiKFRES19BVVRPX01PREUsIGlvYWRkciArIENPTF9DVFJMKTsKKyAgICBlbHNlCisgICAgICAgIG91dGIoQVVUT19NT0RFLCBpb2FkZHIgKyBDT0xfQ1RSTCk7CisKKyAgICAvKiBjbGVhciBSZXNlcnZlZCBSZWdzICovCisgICAgb3V0YigweDAwLCBpb2FkZHIgKyBCTVBSMTIpOworICAgIG91dGIoMHgwMCwgaW9hZGRyICsgQk1QUjEzKTsKKworICAgIC8qIHJlc2V0IFNraXAgcGFja2V0IHJlZy4gKi8KKyAgICBvdXRiKDB4MDEsIGlvYWRkciArIFJYX1NLSVApOworCisgICAgLyogRW5hYmxlIFR4IGFuZCBSeCAqLworICAgIGlmKCBzcmFtX2NvbmZpZyA9PSAwICkKKwlvdXRiKENPTkZJRzBfREZMLCBpb2FkZHIgKyBDT05GSUdfMCk7CisgICAgZWxzZQorCW91dGIoQ09ORklHMF9ERkxfMSwgaW9hZGRyICsgQ09ORklHXzApOworCisgICAgLyogSW5pdCByZWNlaXZlIHBvaW50ZXIgPyAqLworICAgIGludyhpb2FkZHIgKyBEQVRBUE9SVCk7CisgICAgaW53KGlvYWRkciArIERBVEFQT1JUKTsKKworICAgIC8qIENsZWFyIGFsbCBzdGF0dXMgKi8KKyAgICBvdXRiKDB4ZmYsIGlvYWRkciArIFRYX1NUQVRVUyk7CisgICAgb3V0YigweGZmLCBpb2FkZHIgKyBSWF9TVEFUVVMpOworCisgICAgaWYgKGxwLT5jYXJkdHlwZSA9PSBNQkgxMDMwMikKKwlvdXRiKElOVFJfT0ZGLCBpb2FkZHIgKyBMQU5fQ1RSTCk7CisKKyAgICAvKiBUdXJuIG9uIFJ4IGludGVycnVwdHMgKi8KKyAgICBvdXRiKERfVFhfSU5UUiwgaW9hZGRyICsgVFhfSU5UUik7CisgICAgb3V0YihEX1JYX0lOVFIsIGlvYWRkciArIFJYX0lOVFIpOworCisgICAgLyogVHVybiBvbiBpbnRlcnJ1cHRzIGZyb20gTEFOIGNhcmQgY29udHJvbGxlciAqLworICAgIGlmIChscC0+Y2FyZHR5cGUgPT0gTUJIMTAzMDIpCisJb3V0YihJTlRSX09OLCBpb2FkZHIgKyBMQU5fQ1RSTCk7Cit9IC8qIGZqbl9yZXNldCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgZmpuX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGxvY2FsX2luZm9fdCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGJvZ3VzY291bnQgPSAxMDsJLyogNSAtPiAxMDogYnkgYWd5IDE5OTQwOTIyICovCisKKyAgICBERUJVRyg0LCAiJXM6IGluIHJ4X3BhY2tldCgpLCByeF9zdGF0dXMgJTAyeC5cbiIsCisJICBkZXYtPm5hbWUsIGluYihpb2FkZHIgKyBSWF9TVEFUVVMpKTsKKworICAgIHdoaWxlICgoaW5iKGlvYWRkciArIFJYX01PREUpICYgRl9CVUZfRU1QKSA9PSAwKSB7CisJdV9zaG9ydCBzdGF0dXMgPSBpbncoaW9hZGRyICsgREFUQVBPUlQpOworCisJREVCVUcoNCwgIiVzOiBSeGluZyBwYWNrZXQgbW9kZSAlMDJ4IHN0YXR1cyAlMDR4LlxuIiwKKwkgICAgICBkZXYtPm5hbWUsIGluYihpb2FkZHIgKyBSWF9NT0RFKSwgc3RhdHVzKTsKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCWlmIChzdGF0dXMgPT0gMCkgeworCSAgICBvdXRiKEZfU0tQX1BLVCwgaW9hZGRyICsgUlhfU0tJUCk7CisJICAgIGJyZWFrOworCX0KKyNlbmRpZgorCWlmICgoc3RhdHVzICYgMHhGMCkgIT0gMHgyMCkgewkvKiBUaGVyZSB3YXMgYW4gZXJyb3IuICovCisJICAgIGxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkgICAgaWYgKHN0YXR1cyAmIEZfTEVOX0VSUikgbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkgICAgaWYgKHN0YXR1cyAmIEZfQUxHX0VSUikgbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCSAgICBpZiAoc3RhdHVzICYgRl9DUkNfRVJSKSBscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCSAgICBpZiAoc3RhdHVzICYgRl9PVlJfRkxPKSBscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwl9IGVsc2UgeworCSAgICB1X3Nob3J0IHBrdF9sZW4gPSBpbncoaW9hZGRyICsgREFUQVBPUlQpOworCSAgICAvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlci4gKi8KKwkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCSAgICBpZiAocGt0X2xlbiA+IDE1NTApIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogVGhlIEZNVi0xOHggY2xhaW1lZCBhIHZlcnkgIgorCQkgICAgICAgImxhcmdlIHBhY2tldCwgc2l6ZSAlZC5cbiIsIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCW91dGIoRl9TS1BfUEtULCBpb2FkZHIgKyBSWF9TS0lQKTsKKwkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlicmVhazsKKwkgICAgfQorCSAgICBza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4rMik7CisJICAgIGlmIChza2IgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgIgorCQkgICAgICAgInBhY2tldCAobGVuICVkKS5cbiIsIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCW91dGIoRl9TS1BfUEtULCBpb2FkZHIgKyBSWF9TS0lQKTsKKwkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgc2tiLT5kZXYgPSBkZXY7CisKKwkgICAgc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkgICAgaW5zdyhpb2FkZHIgKyBEQVRBUE9SVCwgc2tiX3B1dChza2IsIHBrdF9sZW4pLAorCQkgKHBrdF9sZW4gKyAxKSA+PiAxKTsKKwkgICAgc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworI2lmZGVmIFBDTUNJQV9ERUJVRworCSAgICBpZiAocGNfZGVidWcgPiA1KSB7CisJCWludCBpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJ4ZWQgcGFja2V0IG9mIGxlbmd0aCAlZDogIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKQorCQkgICAgcHJpbnRrKCIgJTAyeCIsIHNrYi0+ZGF0YVtpXSk7CisJCXByaW50aygiLlxuIik7CisJICAgIH0KKyNlbmRpZgorCisJICAgIG5ldGlmX3J4KHNrYik7CisJICAgIGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJICAgIGxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJICAgIGxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCX0KKwlpZiAoLS1ib2d1c2NvdW50IDw9IDApCisJICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIElmIGFueSB3b3J0aC13aGlsZSBwYWNrZXRzIGhhdmUgYmVlbiByZWNlaXZlZCwgZGV2X3JpbnQoKQorCSAgIGhhcyBkb25lIGEgbmV0aWZfd2FrZV9xdWV1ZSgpIGZvciB1cyBhbmQgd2lsbCB3b3JrIG9uIHRoZW0KKwkgICB3aGVuIHdlIGdldCB0byB0aGUgYm90dG9tLWhhbGYgcm91dGluZS4gKi8KKy8qCisgICAgaWYgKGxwLT5jYXJkdHlwZSAhPSBUREspIHsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworCSAgICBpZiAoKGluYihpb2FkZHIgKyBSWF9NT0RFKSAmIEZfQlVGX0VNUCkgPT0gRl9CVUZfRU1QKQorCQlicmVhazsKKwkgICAgKHZvaWQpaW53KGlvYWRkciArIERBVEFQT1JUKTsgIC8rIGR1bW15IHN0YXR1cyByZWFkICsvCisJICAgIG91dGIoRl9TS1BfUEtULCBpb2FkZHIgKyBSWF9TS0lQKTsKKwl9CisKKwlpZiAoaSA+IDApCisJICAgIERFQlVHKDUsICIlczogRXhpbnQgUnggcGFja2V0IHdpdGggbW9kZSAlMDJ4IGFmdGVyICIKKwkJICAiJWQgdGlja3MuXG4iLCBkZXYtPm5hbWUsIGluYihpb2FkZHIgKyBSWF9NT0RFKSwgaSk7CisgICAgfQorKi8KKworICAgIHJldHVybjsKK30gLyogZmpuX3J4ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXNwcmludGYoaW5mby0+YnVzX2luZm8sICJQQ01DSUEgMHglbHgiLCBkZXYtPmJhc2VfYWRkcik7Cit9CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKK3N0YXRpYyB1MzIgbmV0ZGV2X2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBwY19kZWJ1ZzsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgbGV2ZWwpCit7CisJcGNfZGVidWcgPSBsZXZlbDsKK30KKyNlbmRpZiAvKiBQQ01DSUFfREVCVUcgKi8KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKKyNpZmRlZiBQQ01DSUFfREVCVUcKKwkuZ2V0X21zZ2xldmVsCQk9IG5ldGRldl9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSBuZXRkZXZfc2V0X21zZ2xldmVsLAorI2VuZGlmIC8qIFBDTUNJQV9ERUJVRyAqLworfTsKKworc3RhdGljIGludCBmam5fY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKXsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmam5fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBsb2NhbF9pbmZvX3QgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBkZXZfbGlua190ICpsaW5rID0gJmxwLT5saW5rOworCisgICAgREVCVUcoNCwgImZqbl9vcGVuKCclcycpLlxuIiwgZGV2LT5uYW1lKTsKKworICAgIGlmICghREVWX09LKGxpbmspKQorCXJldHVybiAtRU5PREVWOworICAgIAorICAgIGxpbmstPm9wZW4rKzsKKyAgICAKKyAgICBmam5fcmVzZXQoZGV2KTsKKyAgICAKKyAgICBscC0+dHhfc3RhcnRlZCA9IDA7CisgICAgbHAtPnR4X3F1ZXVlID0gMDsKKyAgICBscC0+dHhfcXVldWVfbGVuID0gMDsKKyAgICBscC0+b3Blbl90aW1lID0gamlmZmllczsKKyAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworICAgIAorICAgIHJldHVybiAwOworfSAvKiBmam5fb3BlbiAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBmam5fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgbG9jYWxfaW5mb190ICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgZGV2X2xpbmtfdCAqbGluayA9ICZscC0+bGluazsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgICAgREVCVUcoNCwgImZqbl9jbG9zZSgnJXMnKS5cbiIsIGRldi0+bmFtZSk7CisKKyAgICBscC0+b3Blbl90aW1lID0gMDsKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgICAvKiBTZXQgY29uZmlndXJhdGlvbiByZWdpc3RlciAwIHRvIGRpc2FibGUgVHggYW5kIFJ4LiAqLworICAgIGlmKCBzcmFtX2NvbmZpZyA9PSAwICkgCisJb3V0YihDT05GSUcwX1JTVCAsaW9hZGRyICsgQ09ORklHXzApOworICAgIGVsc2UKKwlvdXRiKENPTkZJRzBfUlNUXzEgLGlvYWRkciArIENPTkZJR18wKTsKKworICAgIC8qIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyAtLSBUb0RvLiAqLworCisgICAgLyogUG93ZXItZG93biB0aGUgY2hpcC4gIEdyZWVuLCBncmVlbiwgZ3JlZW4hICovCisgICAgb3V0YihDSElQX09GRiAsaW9hZGRyICsgQ09ORklHXzEpOworCisgICAgLyogU2V0IHRoZSBldGhlcm5ldCBhZGFwdG9yIGRpc2FibGUgSVJRICovCisgICAgaWYgKGxwLT5jYXJkdHlwZSA9PSBNQkgxMDMwMikKKwlvdXRiKElOVFJfT0ZGLCBpb2FkZHIgKyBMQU5fQ1RSTCk7CisKKyAgICBsaW5rLT5vcGVuLS07CisKKyAgICByZXR1cm4gMDsKK30gLyogZmpuX2Nsb3NlICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmZqbl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBsb2NhbF9pbmZvX3QgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICByZXR1cm4gJmxwLT5zdGF0czsKK30gLyogZmpuX2dldF9zdGF0cyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAgU2V0IHRoZSBtdWx0aWNhc3QvcHJvbWlzY3VvdXMgbW9kZSBmb3IgdGhpcyBhZGFwdG9yLgorKi8KKworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHN0cnVjdCBsb2NhbF9pbmZvX3QgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgbWNfZmlsdGVyWzhdOwkJIC8qIE11bHRpY2FzdCBoYXNoIGZpbHRlciAqLworICAgIHVfbG9uZyBmbGFnczsKKyAgICBpbnQgaTsKKyAgICAKKyAgICBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJLyogVW5jb25kaXRpb25hbGx5IGxvZyBuZXQgdGFwcy4gKi8KKwlwcmludGsoIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLCBkZXYtPm5hbWUpOworCW1lbXNldChtY19maWx0ZXIsIDB4ZmYsIHNpemVvZihtY19maWx0ZXIpKTsKKwlvdXRiKDMsIGlvYWRkciArIFJYX01PREUpOwkvKiBFbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworICAgIH0gZWxzZSBpZiAoZGV2LT5tY19jb3VudCA+IE1DX0ZJTFRFUkJSRUFLCisJICAgICAgIHx8ICAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKKwkvKiBUb28gbWFueSB0byBmaWx0ZXIgcGVyZmVjdGx5IC0tIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KKwltZW1zZXQobWNfZmlsdGVyLCAweGZmLCBzaXplb2YobWNfZmlsdGVyKSk7CisJb3V0YigyLCBpb2FkZHIgKyBSWF9NT0RFKTsJLyogVXNlIG5vcm1hbCBtb2RlLiAqLworICAgIH0gZWxzZSBpZiAoZGV2LT5tY19jb3VudCA9PSAwKSB7CisJbWVtc2V0KG1jX2ZpbHRlciwgMHgwMCwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCW91dGIoMSwgaW9hZGRyICsgUlhfTU9ERSk7CS8qIElnbm9yZSBhbG1vc3QgYWxsIG11bHRpY2FzdHMuICovCisgICAgfSBlbHNlIHsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwlpbnQgaTsKKwkKKwltZW1zZXQobWNfZmlsdGVyLCAwLCBzaXplb2YobWNfZmlsdGVyKSk7CisJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7CisJICAgICBpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCSAgICB1bnNpZ25lZCBpbnQgYml0ID0KKwkgICAgCWV0aGVyX2NyY19sZShFVEhfQUxFTiwgbWNsaXN0LT5kbWlfYWRkcikgJiAweDNmOworCSAgICBtY19maWx0ZXJbYml0ID4+IDNdIHw9ICgxIDw8IGJpdCk7CisJfQorICAgIH0KKworICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsgCisgICAgaWYgKG1lbWNtcChtY19maWx0ZXIsIGxwLT5tY19maWx0ZXIsIHNpemVvZihtY19maWx0ZXIpKSkgeworCWludCBzYXZlZF9iYW5rID0gaW5iKGlvYWRkciArIENPTkZJR18xKTsKKwkvKiBTd2l0Y2ggdG8gYmFuayAxIGFuZCBzZXQgdGhlIG11bHRpY2FzdCB0YWJsZS4gKi8KKwlvdXRiKDB4ZTQsIGlvYWRkciArIENPTkZJR18xKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCSAgICBvdXRiKG1jX2ZpbHRlcltpXSwgaW9hZGRyICsgOCArIGkpOworCW1lbWNweShscC0+bWNfZmlsdGVyLCBtY19maWx0ZXIsIHNpemVvZihtY19maWx0ZXIpKTsKKwlvdXRiKHNhdmVkX2JhbmssIGlvYWRkciArIENPTkZJR18xKTsKKyAgICB9CisgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL2libXRyX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvaWJtdHJfY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTA3Y2NmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL2libXRyX2NzLmMKQEAgLTAsMCArMSw1MzUgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQSBQQ01DSUEgdG9rZW4tcmluZyBkcml2ZXIgZm9yIElCTS1iYXNlZCBjYXJkcworCisgICAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIElCTSBQQ01DSUEgVG9rZW4tUmluZyBDYXJkLgorICAgIFdyaXR0ZW4gYnkgU3RldmUgS2lwaXN6LCBraXBpc3pAdm5ldC5pYm0uY29tIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmd5QGlibS5uZXQKKworICAgIFdyaXR0ZW4gMTk5NSwxOTk2LgorCisgICAgVGhpcyBjb2RlIGlzIGJhc2VkIG9uIHBjbmV0X2NzLmMgZnJvbSBEYXZpZCBIaW5kcy4KKyAgICAKKyAgICBWMi4yLjAgRmVicnVhcnkgMTk5OSAtIE1pa2UgUGhpbGxpcHMgcGhpbGxpbUBhbXRyYWsuY29tCisKKyAgICBMaW51eCBWMi4yLnggcHJlc2VudGVkIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcKKyAgICBpYm10ci5jIGNvZGUuICBNYWlubHkgdGhlIGNvZGUgYmVjYW1lIGEgbG90IG1vcmUgb3JnYW5pemVkIGFuZAorICAgIG1vZHVsYXIuCisKKyAgICBUaGlzIGNhdXNlZCB0aGUgb2xkIFBDTUNJQSBUb2tlbiBSaW5nIGRyaXZlciB0byBnaXZlIHVwIGFuZCBnbyAKKyAgICBob21lIGVhcmx5LiBJbnN0ZWFkIG9mIGp1c3QgcGF0Y2hpbmcgdGhlIG9sZCBjb2RlIHRvIG1ha2UgaXQgCisgICAgd29yaywgdGhlIFBDTUNJQSBjb2RlIGhhcyBiZWVuIHN0cmVhbWxpbmVkLCB1cGRhdGVkIGFuZCBwb3NzaWJseQorICAgIGltcHJvdmVkLgorCisgICAgVGhpcyBjb2RlIG5vdyBvbmx5IGNvbnRhaW5zIGNvZGUgcmVxdWlyZWQgZm9yIHRoZSBDYXJkIFNlcnZpY2VzLgorICAgIEFsbCB3ZSBkbyBoZXJlIGlzIHNldCB0aGUgY2FyZCB1cCBlbm91Z2ggc28gdGhhdCB0aGUgcmVhbCBpYm10ci5jCisgICAgZHJpdmVyIGNhbiBmaW5kIGl0IGFuZCB3b3JrIHdpdGggaXQgcHJvcGVybHkuCisKKyAgICBpLmUuIFdlIHNldCB1cCB0aGUgaW8gcG9ydCwgaXJxLCBtbWlvIG1lbW9yeSBhbmQgc2hhcmVkIHJhbQorICAgIG1lbW9yeS4gIFRoaXMgZW5hYmxlcyBpYm10cl9wcm9iZSBpbiBpYm10ci5jIHRvIGZpbmQgdGhlIGNhcmQgYW5kCisgICAgY29uZmlndXJlIGl0IGFzIHRob3VnaCBpdCB3YXMgYSBub3JtYWwgSVNBIGFuZC9vciBQblAgY2FyZC4KKworICAgIENIQU5HRVMKKworICAgIHYyLjIuNSBBcHJpbCAxOTk5IE1pa2UgUGhpbGxpcHMgKHBoaWxsaW1AYW10cmFrLmNvbSkKKyAgICBPYnNjdXJlIGJ1ZyBmaXgsIHJlcXVpcmVkIGNoYW5nZWQgdG8gaWJtdHIuYyBub3QgaWJtdHJfY3MuYworICAgIAorICAgIHYyLjIuNyBNYXkgMTk5OSBNaWtlIFBoaWxsaXBzIChwaGlsbGltQGFtdHJhay5jb20pCisgICAgVXBkYXRlZCB0byB2ZXJzaW9uIDIuMi43IHRvIG1hdGNoIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIHRoZSBrZXJuZWwKKyAgICB0aGF0IHRoZSBtb2RpZmljYXRpb24gdG8gaWJtdHIuYyB3ZXJlIGluY29ycG9yYXRlZCBpbnRvLgorICAgIAorICAgIHYyLjIuMTcgSnVseSAyMDAwIEJ1cnQgU2lsdmVybWFuIChidXJ0c0B1cy5pYm0uY29tKQorICAgIEFkZHJlc3MgdHJhbnNsYXRpb24gZmVhdHVyZSBvZiBQQ01DSUEgY29udHJvbGxlciBpcyB1c2FibGUgc28KKyAgICBtZW1vcnkgd2luZG93cyBjYW4gYmUgcGxhY2VkIGluIEhpZ2ggbWVtb3J5IChtZWFuaW5nIGFib3ZlCisgICAgMHhGRkZGRi4pCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90cmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2libXRyLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjZGVmaW5lIFBDTUNJQQorI2luY2x1ZGUgIi4uL3Rva2VucmluZy9pYm10ci5jIgorCisjaWZkZWYgUENNQ0lBX0RFQlVHCitzdGF0aWMgaW50IHBjX2RlYnVnID0gUENNQ0lBX0RFQlVHOworbW9kdWxlX3BhcmFtKHBjX2RlYnVnLCBpbnQsIDApOworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBpZiAocGNfZGVidWc+KG4pKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKQorc3RhdGljIGNoYXIgKnZlcnNpb24gPQorImlibXRyX2NzLmMgMS4xMCAgIDE5OTYvMDEvMDYgMDU6MTk6MDAgKFN0ZXZlIEtpcGlzeilcbiIKKyIgICAgICAgICAgIDIuMi43ICAxOTk5LzA1LzAzIDEyOjAwOjAwIChNaWtlIFBoaWxsaXBzKVxuIgorIiAgICAgICAgICAgMi40LjIgIDIwMDEvMzAvMjggTWlkbmlnaHQgKEJ1cnQgU2lsdmVybWFuKVxuIjsKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IHdpdGggJ2luc21vZCcgKi8KKworLyogTU1JTyBiYXNlIGFkZHJlc3MgKi8KK3N0YXRpYyB1X2xvbmcgbW1pb2Jhc2UgPSAweGNlMDAwOworCisvKiBTUkFNIGJhc2UgYWRkcmVzcyAqLworc3RhdGljIHVfbG9uZyBzcmFtYmFzZSA9IDB4ZDAwMDA7CisKKy8qIFNSQU0gc2l6ZSA4LDE2LDMyLDY0ICovCitzdGF0aWMgdV9sb25nIHNyYW1zaXplID0gNjQ7CisKKy8qIFJpbmdzcGVlZCA0LDE2ICovCitzdGF0aWMgaW50IHJpbmdzcGVlZCA9IDE2OworCittb2R1bGVfcGFyYW0obW1pb2Jhc2UsIHVsb25nLCAwKTsKK21vZHVsZV9wYXJhbShzcmFtYmFzZSwgdWxvbmcsIDApOworbW9kdWxlX3BhcmFtKHNyYW1zaXplLCB1bG9uZywgMCk7Cittb2R1bGVfcGFyYW0ocmluZ3NwZWVkLCBpbnQsIDApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgaWJtdHJfY29uZmlnKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIHZvaWQgaWJtdHJfaHdfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9pbnQgbW1pb2Jhc2UpOworc3RhdGljIHZvaWQgaWJtdHJfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyBpbnQgaWJtdHJfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpOworCitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJpYm10cl9jcyI7CisKK3N0YXRpYyBkZXZfbGlua190ICppYm10cl9hdHRhY2godm9pZCk7CitzdGF0aWMgdm9pZCBpYm10cl9kZXRhY2goZGV2X2xpbmtfdCAqKTsKKworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0OworCitleHRlcm4gaW50IGlibXRyX3Byb2JlX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaXJxcmV0dXJuX3QgdG9rX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit0eXBlZGVmIHN0cnVjdCBpYm10cl9kZXZfdCB7CisgICAgZGV2X2xpbmtfdAkJbGluazsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OworICAgIGRldl9ub2RlX3QgICAgICAgICAgbm9kZTsKKyAgICB3aW5kb3dfaGFuZGxlX3QgICAgIHNyYW1fd2luX2hhbmRsZTsKKyAgICBzdHJ1Y3QgdG9rX2luZm8JKnRpOworfSBpYm10cl9kZXZfdDsKKworc3RhdGljIHZvaWQgbmV0ZGV2X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCAiaWJtdHJfY3MiKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgaWJtdHJfYXR0YWNoKCkgY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcKKyAgICBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQKKyAgICB3aXRoIENhcmQgU2VydmljZXMuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgZGV2X2xpbmtfdCAqaWJtdHJfYXR0YWNoKHZvaWQpCit7CisgICAgaWJtdHJfZGV2X3QgKmluZm87CisgICAgZGV2X2xpbmtfdCAqbGluazsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICAgIGNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworICAgIGludCByZXQ7CisgICAgCisgICAgREVCVUcoMCwgImlibXRyX2F0dGFjaCgpXG4iKTsKKworICAgIC8qIENyZWF0ZSBuZXcgdG9rZW4tcmluZyBkZXZpY2UgKi8KKyAgICBpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsgCisgICAgaWYgKCFpbmZvKSByZXR1cm4gTlVMTDsKKyAgICBtZW1zZXQoaW5mbywwLHNpemVvZigqaW5mbykpOworICAgIGRldiA9IGFsbG9jX3RyZGV2KHNpemVvZihzdHJ1Y3QgdG9rX2luZm8pKTsKKyAgICBpZiAoIWRldikgeyAKKwlrZnJlZShpbmZvKTsgCisJcmV0dXJuIE5VTEw7CisgICAgfSAKKworICAgIGxpbmsgPSAmaW5mby0+bGluazsKKyAgICBsaW5rLT5wcml2ID0gaW5mbzsKKyAgICBpbmZvLT50aSA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OworICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDQ7CisgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSAxNjsKKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKKyAgICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisgICAgbGluay0+aXJxLkhhbmRsZXIgPSAmdG9rX2ludGVycnVwdDsKKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CisgICAgbGluay0+Y29uZi5WY2MgPSA1MDsKKyAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBQUkVTRU5UX09QVElPTjsKKworICAgIGxpbmstPmlycS5JbnN0YW5jZSA9IGluZm8tPmRldiA9IGRldjsKKyAgICAKKyAgICBTRVRfRVRIVE9PTF9PUFMoZGV2LCAmbmV0ZGV2X2V0aHRvb2xfb3BzKTsKKworICAgIC8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKKyAgICBkZXZfbGlzdCA9IGxpbms7CisgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKKyAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9CisgICAgICAgIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKyAgICAgICAgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKyAgICAgICAgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKKyAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmaWJtdHJfZXZlbnQ7CisgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisJZ290byBvdXRfZGV0YWNoOworICAgIH0KKworb3V0OgorICAgIHJldHVybiBsaW5rOworCitvdXRfZGV0YWNoOgorICAgIGlibXRyX2RldGFjaChsaW5rKTsKKyAgICBsaW5rID0gTlVMTDsKKyAgICBnb3RvIG91dDsKK30gLyogaWJtdHJfYXR0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQKKyAgICB3aXRoIENhcmQgU2VydmljZXMuICBJZiBpdCBoYXMgYmVlbiByZWxlYXNlZCwgYWxsIGxvY2FsIGRhdGEKKyAgICBzdHJ1Y3R1cmVzIGFyZSBmcmVlZC4gIE90aGVyd2lzZSwgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZSBmcmVlZAorICAgIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGlibXRyX2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBpYm10cl9kZXZfdCAqaW5mbyA9IGxpbmstPnByaXY7CisgICAgZGV2X2xpbmtfdCAqKmxpbmtwOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKyAgICBERUJVRygwLCAiaWJtdHJfZGV0YWNoKDB4JXApXG4iLCBsaW5rKTsKKworICAgIC8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisgICAgZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkKKyAgICAgICAgaWYgKCpsaW5rcCA9PSBsaW5rKSBicmVhazsKKyAgICBpZiAoKmxpbmtwID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIGRldiA9IGluZm8tPmRldjsKKworICAgIGlmIChsaW5rLT5kZXYpCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworICAgIHsKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlkZWxfdGltZXJfc3luYygmKHRpLT50cl90aW1lcikpOworICAgIH0KKyAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorICAgICAgICBpYm10cl9yZWxlYXNlKGxpbmspOworCisgICAgaWYgKGxpbmstPmhhbmRsZSkKKyAgICAgICAgcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGxpbmstPmhhbmRsZSk7CisKKyAgICAvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBiaXRzICovCisgICAgKmxpbmtwID0gbGluay0+bmV4dDsKKyAgICBmcmVlX25ldGRldihkZXYpOworICAgIGtmcmVlKGluZm8pOyAKK30gLyogaWJtdHJfZGV0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgaWJtdHJfY29uZmlnKCkgaXMgc2NoZWR1bGVkIHRvIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50CisgICAgaXMgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlCisgICAgdG9rZW4tcmluZyBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKK2RvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIGlibXRyX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgaWJtdHJfZGV2X3QgKmluZm8gPSBsaW5rLT5wcml2OworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpbmZvLT5kZXY7CisgICAgc3RydWN0IHRva19pbmZvICp0aSA9IG5ldGRldl9wcml2KGRldik7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICBjaXNwYXJzZV90IHBhcnNlOworICAgIHdpbl9yZXFfdCByZXE7CisgICAgbWVtcmVxX3QgbWVtOworICAgIGludCBpLCBsYXN0X3JldCwgbGFzdF9mbjsKKyAgICB1X2NoYXIgYnVmWzY0XTsKKworICAgIERFQlVHKDAsICJpYm10cl9jb25maWcoMHglcClcbiIsIGxpbmspOworCisgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CisgICAgdHVwbGUuVHVwbGVEYXRhID0gYnVmOworICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDY0OworICAgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworICAgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisgICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CisKKyAgICAvKiBDb25maWd1cmUgY2FyZCAqLworICAgIGxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMHg2MTsKKworICAgIC8qIERldGVybWluZSBpZiB0aGlzIGlzIFBSSU1BUlkgb3IgQUxURVJOQVRFLiAqLworCisgICAgLyogVHJ5IFBSSU1BUlkgY2FyZCBhdCAweEEyMC0weEEyMyAqLworICAgIGxpbmstPmlvLkJhc2VQb3J0MSA9IDB4QTIwOworICAgIGkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisgICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykgeworCS8qIENvdWxkbid0IGdldCAweEEyMC0weEEyMy4gIFRyeSBBTFRFUk5BVEUgYXQgMHhBMjQtMHhBMjcuICovCisJbGluay0+aW8uQmFzZVBvcnQxID0gMHhBMjQ7CisJQ1NfQ0hFQ0soUmVxdWVzdElPLCBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbykpOworICAgIH0KKyAgICBkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKworICAgIENTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpKTsKKyAgICBkZXYtPmlycSA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKKyAgICB0aS0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworICAgIHRpLT5nbG9iYWxfaW50X2VuYWJsZT1HTE9CQUxfSU5UX0VOQUJMRSsoKGRldi0+aXJxPT05KSA/IDIgOiBkZXYtPmlycSk7CisKKyAgICAvKiBBbGxvY2F0ZSB0aGUgTU1JTyBtZW1vcnkgd2luZG93ICovCisgICAgcmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF8xNnxXSU5fTUVNT1JZX1RZUEVfQ018V0lOX0VOQUJMRTsKKyAgICByZXEuQXR0cmlidXRlcyB8PSBXSU5fVVNFX1dBSVQ7CisgICAgcmVxLkJhc2UgPSAwOyAKKyAgICByZXEuU2l6ZSA9IDB4MjAwMDsKKyAgICByZXEuQWNjZXNzU3BlZWQgPSAyNTA7CisgICAgQ1NfQ0hFQ0soUmVxdWVzdFdpbmRvdywgcGNtY2lhX3JlcXVlc3Rfd2luZG93KCZsaW5rLT5oYW5kbGUsICZyZXEsICZsaW5rLT53aW4pKTsKKworICAgIG1lbS5DYXJkT2Zmc2V0ID0gbW1pb2Jhc2U7CisgICAgbWVtLlBhZ2UgPSAwOworICAgIENTX0NIRUNLKE1hcE1lbVBhZ2UsIHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluay0+d2luLCAmbWVtKSk7CisgICAgdGktPm1taW8gPSBpb3JlbWFwKHJlcS5CYXNlLCByZXEuU2l6ZSk7CisKKyAgICAvKiBBbGxvY2F0ZSB0aGUgU1JBTSBtZW1vcnkgd2luZG93ICovCisgICAgcmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF8xNnxXSU5fTUVNT1JZX1RZUEVfQ018V0lOX0VOQUJMRTsKKyAgICByZXEuQXR0cmlidXRlcyB8PSBXSU5fVVNFX1dBSVQ7CisgICAgcmVxLkJhc2UgPSAwOworICAgIHJlcS5TaXplID0gc3JhbXNpemUgKiAxMDI0OworICAgIHJlcS5BY2Nlc3NTcGVlZCA9IDI1MDsKKyAgICBDU19DSEVDSyhSZXF1ZXN0V2luZG93LCBwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmstPmhhbmRsZSwgJnJlcSwgJmluZm8tPnNyYW1fd2luX2hhbmRsZSkpOworCisgICAgbWVtLkNhcmRPZmZzZXQgPSBzcmFtYmFzZTsKKyAgICBtZW0uUGFnZSA9IDA7CisgICAgQ1NfQ0hFQ0soTWFwTWVtUGFnZSwgcGNtY2lhX21hcF9tZW1fcGFnZShpbmZvLT5zcmFtX3dpbl9oYW5kbGUsICZtZW0pKTsKKworICAgIHRpLT5zcmFtX2Jhc2UgPSBtZW0uQ2FyZE9mZnNldCA+PiAxMjsKKyAgICB0aS0+c3JhbV92aXJ0ID0gaW9yZW1hcChyZXEuQmFzZSwgcmVxLlNpemUpOworICAgIHRpLT5zcmFtX3BoeXMgPSByZXEuQmFzZTsKKworICAgIENTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKworICAgIC8qICBTZXQgdXAgdGhlIFRva2VuLVJpbmcgQ29udHJvbGxlciBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIGFuZAorICAgICAgICB0dXJuIG9uIHRoZSBjYXJkLiAgQ2hlY2sgdGhlICJMb2NhbCBBcmVhIE5ldHdvcmsgQ3JlZGl0IENhcmQKKyAgICAgICAgQWRhcHRlcnMgVGVjaG5pY2FsIFJlZmVyZW5jZSIgIFNDMzAtMzU4NSBmb3IgdGhpcyBpbmZvLiAgKi8KKyAgICBpYm10cl9od19zZXR1cChkZXYsIG1taW9iYXNlKTsKKworICAgIGxpbmstPmRldiA9ICZpbmZvLT5ub2RlOworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAgU0VUX05FVERFVl9ERVYoZGV2LCAmaGFuZGxlX3RvX2RldihoYW5kbGUpKTsKKworICAgIGkgPSBpYm10cl9wcm9iZV9jYXJkKGRldik7CisgICAgaWYgKGkgIT0gMCkgeworCXByaW50ayhLRVJOX05PVElDRSAiaWJtdHJfY3M6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7CisJbGluay0+ZGV2ID0gTlVMTDsKKwlnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgICBzdHJjcHkoaW5mby0+bm9kZS5kZXZfbmFtZSwgZGV2LT5uYW1lKTsKKworICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBwb3J0ICUjM2x4LCBpcnEgJWQsIiwKKyAgICAgICAgICAgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworICAgIHByaW50ayAoIiBtbWlvICUjNWx4LCIsICh1X2xvbmcpdGktPm1taW8pOworICAgIHByaW50ayAoIiBzcmFtICUjNWx4LCIsICh1X2xvbmcpdGktPnNyYW1fYmFzZSA8PCAxMik7CisgICAgcHJpbnRrICgiXG4iIEtFUk5fSU5GTyAiICBod2FkZHI9Iik7CisgICAgZm9yIChpID0gMDsgaSA8IFRSX0FMRU47IGkrKykKKyAgICAgICAgcHJpbnRrKCIlMDJYIiwgZGV2LT5kZXZfYWRkcltpXSk7CisgICAgcHJpbnRrKCJcbiIpOworICAgIHJldHVybjsKKworY3NfZmFpbGVkOgorICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworZmFpbGVkOgorICAgIGlibXRyX3JlbGVhc2UobGluayk7Cit9IC8qIGlibXRyX2NvbmZpZyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEFmdGVyIGEgY2FyZCBpcyByZW1vdmVkLCBpYm10cl9yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZSBuZXQKKyAgICBkZXZpY2UsIGFuZCByZWxlYXNlIHRoZSBQQ01DSUEgY29uZmlndXJhdGlvbi4gIElmIHRoZSBkZXZpY2UgaXMKKyAgICBzdGlsbCBvcGVuLCB0aGlzIHdpbGwgYmUgcG9zdHBvbmVkIHVudGlsIGl0IGlzIGNsb3NlZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGlibXRyX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBpYm10cl9kZXZfdCAqaW5mbyA9IGxpbmstPnByaXY7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGluZm8tPmRldjsKKworICAgIERFQlVHKDAsICJpYm10cl9yZWxlYXNlKDB4JXApXG4iLCBsaW5rKTsKKworICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKyAgICBwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisgICAgcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisgICAgaWYgKGxpbmstPndpbikgeworCXN0cnVjdCB0b2tfaW5mbyAqdGkgPSBuZXRkZXZfcHJpdihkZXYpOworCWlvdW5tYXAodGktPm1taW8pOworCXBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOworCXBjbWNpYV9yZWxlYXNlX3dpbmRvdyhpbmZvLT5zcmFtX3dpbl9oYW5kbGUpOworICAgIH0KKworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiAgTW9zdGx5LCB0aGlzIHNjaGVkdWxlcyBvdGhlcgorICAgIHN0dWZmIHRvIHJ1biBhZnRlciBhbiBldmVudCBpcyByZWNlaXZlZC4gIEEgQ0FSRF9SRU1PVkFMIGV2ZW50CisgICAgYWxzbyBzZXRzIHNvbWUgZmxhZ3MgdG8gZGlzY291cmFnZSB0aGUgbmV0IGRyaXZlcnMgZnJvbSB0cnlpbmcKKyAgICB0byB0YWxrIHRvIHRoZSBjYXJkIGFueSBtb3JlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBpYm10cl9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncykKK3sKKyAgICBkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisgICAgaWJtdHJfZGV2X3QgKmluZm8gPSBsaW5rLT5wcml2OworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpbmZvLT5kZXY7CisKKyAgICBERUJVRygxLCAiaWJtdHJfZXZlbnQoMHglMDZ4KVxuIiwgZXZlbnQpOworCisgICAgc3dpdGNoIChldmVudCkgeworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgorICAgICAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX1BSRVNFTlQ7CisgICAgICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkgICAgLyogc2V0IGZsYWcgdG8gYnlwYXNzIG5vcm1hbCBpbnRlcnJ1cHQgY29kZSAqLworCSAgICBzdHJ1Y3QgdG9rX2luZm8gKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCSAgICBwcml2LT5zcmFtX3BoeXMgfD0gMTsKKwkgICAgbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisgICAgICAgIGxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UOworCWlibXRyX2NvbmZpZyhsaW5rKTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisgICAgICAgIGxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOworICAgICAgICAvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorICAgICAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisgICAgICAgICAgICBpZiAobGluay0+b3BlbikKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworICAgICAgICAgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorICAgICAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisgICAgICAgIC8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKyAgICAgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworICAgICAgICAgICAgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKyAgICAgICAgICAgIGlmIChsaW5rLT5vcGVuKSB7CisJCWlibXRyX3Byb2JlKGRldik7CS8qIHJlYWxseT8gKi8KKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30gLyogaWJtdHJfZXZlbnQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGlibXRyX2h3X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfaW50IG1taW9iYXNlKQoreworICAgIGludCBpOworCisgICAgLyogQml6YXJyZSBJQk0gYmVoYXZpb3IsIHRoZXJlIGFyZSAxNiBiaXRzIG9mIGluZm9ybWF0aW9uIHdlCisgICAgICAgbmVlZCB0byBzZXQsIGJ1dCB0aGUgY2FyZCBvbmx5IGFsbG93cyB1cyB0byBzZW5kIDQgYml0cyBhdCBhIAorICAgICAgIHRpbWUuICBGb3IgZWFjaCBieXRlIHNlbnQgdG8gYmFzZV9hZGRyLCBiaXRzIDctNCB0ZWxsIHRoZQorICAgICAgIGNhcmQgd2hpY2ggcGFydCBvZiB0aGUgMTYgYml0cyB3ZSBhcmUgc2V0dGluZywgYml0cyAzLTAgY29udGFpbiAKKyAgICAgICB0aGUgYWN0dWFsIGluZm9ybWF0aW9uICovCisKKyAgICAvKiBGaXJzdCBuaWJibGUgcHJvdmlkZXMgNCBiaXRzIG9mIG1taW8gKi8KKyAgICBpID0gKG1taW9iYXNlID4+IDE2KSAmIDB4MEY7CisgICAgb3V0YihpLCBkZXYtPmJhc2VfYWRkcik7CisKKyAgICAvKiBTZWNvbmQgbmliYmxlIHByb3ZpZGVzIDMgYml0cyBvZiBtbWlvICovCisgICAgaSA9IDB4MTAgfCAoKG1taW9iYXNlID4+IDEyKSAmIDB4MEUpOworICAgIG91dGIoaSwgZGV2LT5iYXNlX2FkZHIpOworCisgICAgLyogVGhpcmQgbmliYmxlLCBoYXJkLWNvZGVkIHZhbHVlcyAqLworICAgIGkgPSAweDI2OworICAgIG91dGIoaSwgZGV2LT5iYXNlX2FkZHIpOworCisgICAgLyogRm91cnRoIG5pYmJsZSBzZXRzIHNoYXJlZCByYW0gcGFnZSBzaXplICovCisKKyAgICAvKiA4ID0gMDAsIDE2ID0gMDEsIDMyID0gMTAsIDY0ID0gMTEgKi8gICAgICAgICAgCisgICAgaSA9IChzcmFtc2l6ZSA+PiA0KSAmIDB4MDc7CisgICAgaSA9ICgoaSA9PSA0KSA/IDMgOiBpKSA8PCAyOworICAgIGkgfD0gMHgzMDsKKworICAgIGlmIChyaW5nc3BlZWQgPT0gMTYpCisJaSB8PSAyOworICAgIGlmIChkZXYtPmJhc2VfYWRkciA9PSAweEEyNCkKKwlpIHw9IDE7CisgICAgb3V0YihpLCBkZXYtPmJhc2VfYWRkcik7CisKKyAgICAvKiAweDQwIHdpbGwgcmVsZWFzZSB0aGUgY2FyZCBmb3IgdXNlICovCisgICAgb3V0YigweDQwLCBkZXYtPmJhc2VfYWRkcik7CisKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBpYm10cl9jc19kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICJpYm10cl9jcyIsCisJfSwKKwkuYXR0YWNoCQk9IGlibXRyX2F0dGFjaCwKKwkuZGV0YWNoCQk9IGlibXRyX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfaWJtdHJfY3Modm9pZCkKK3sKKwlyZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmaWJtdHJfY3NfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfaWJtdHJfY3Modm9pZCkKK3sKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJmlibXRyX2NzX2RyaXZlcik7CisJQlVHX09OKGRldl9saXN0ICE9IE5VTEwpOworfQorCittb2R1bGVfaW5pdChpbml0X2libXRyX2NzKTsKK21vZHVsZV9leGl0KGV4aXRfaWJtdHJfY3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL25tY2xhbl9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL25tY2xhbl9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDM4MDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wY21jaWEvbm1jbGFuX2NzLmMKQEAgLTAsMCArMSwxNjk5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMaW51eCBQQ01DSUEgZXRoZXJuZXQgYWRhcHRlciBkcml2ZXIgZm9yIHRoZSBOZXcgTWVkaWEgRXRoZXJuZXQgTEFOLgorICBubWNsYW5fY3MuYyx2IDAuMTYgMTk5NS8wNy8wMSAwNjo0MjoxNyBycGFvIEV4cCBycGFvCisKKyAgVGhlIEV0aGVybmV0IExBTiB1c2VzIHRoZSBBZHZhbmNlZCBNaWNybyBEZXZpY2VzIChBTUQpIEFtNzlDOTQwIE1lZGlhCisgIEFjY2VzcyBDb250cm9sbGVyIGZvciBFdGhlcm5ldCAoTUFDRSkuICBJdCBpcyBlc3NlbnRpYWxseSB0aGUgQW0yMTUwCisgIFBDTUNJQSBFdGhlcm5ldCBjYXJkIGNvbnRhaW5lZCBpbiB0aGUgQW0yMTUwIERlbW8gS2l0LgorCitXcml0dGVuIGJ5IFJvZ2VyIEMuIFBhbyA8cnBhb0BwYW9uZXQub3JnPgorICBDb3B5cmlnaHQgMTk5NSBSb2dlciBDLiBQYW8KKyAgTGludXggMi41IGNsZWFudXBzIENvcHlyaWdodCBSZWQgSGF0IDIwMDMKKworICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworUG9ydGVkIHRvIExpbnV4IDEuMy4qIG5ldHdvcmsgZHJpdmVyIGVudmlyb25tZW50IGJ5CisgIE1hdHRpIEFhcm5pbyA8bWVhQHV0dS5maT4KKworUmVmZXJlbmNlcworCisgIEFtMjE1MCBUZWNobmljYWwgUmVmZXJlbmNlIE1hbnVhbCwgUmV2aXNpb24gMS4wLCBBdWd1c3QgMTcsIDE5OTMKKyAgQW03OUM5NDAgKE1BQ0UpIERhdGEgU2hlZXQsIDE5OTQKKyAgQW03OUM5MCAoQy1MQU5DRSkgRGF0YSBTaGVldCwgMTk5NAorICBMaW51eCBQQ01DSUEgUHJvZ3JhbW1lcidzIEd1aWRlIHYxLjE3CisgIC91c3Ivc3JjL2xpbnV4L25ldC9pbmV0L2Rldi5jLCBMaW51eCBrZXJuZWwgMS4yLjgKKworICBFcmljIE1lYXJzLCBOZXcgTWVkaWEgQ29ycG9yYXRpb24KKyAgVG9tIFBvbGxhcmQsIE5ldyBNZWRpYSBDb3Jwb3JhdGlvbgorICBEZWFuIFNpYXNveWNvLCBOZXcgTWVkaWEgQ29ycG9yYXRpb24KKyAgS2VuIExlc25pYWssIFNpbGljb24gR3JhcGhpY3MsIEluYy4gPGxlc25pYWtAYm9zdG9uLnNnaS5jb20+CisgIERvbmFsZCBCZWNrZXIgPGJlY2tlckBzY3lsZC5jb20+CisgIERhdmlkIEhpbmRzIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKworICBUaGUgTGludXggY2xpZW50IGRyaXZlciBpcyBiYXNlZCBvbiB0aGUgM2M1ODlfY3MuYyBjbGllbnQgZHJpdmVyIGJ5CisgIERhdmlkIEhpbmRzLgorCisgIFRoZSBMaW51eCBuZXR3b3JrIGRyaXZlciBvdXRsaW5lIGlzIGJhc2VkIG9uIHRoZSAzYzU4OV9jcy5jIGRyaXZlciwKKyAgdGhlIDgzOTAuYyBkcml2ZXIsIGFuZCB0aGUgZXhhbXBsZSBza2VsZXRvbi5jIGtlcm5lbCBjb2RlLCB3aGljaCBhcmUKKyAgYnkgRG9uYWxkIEJlY2tlci4KKworICBUaGUgQW0yMTUwIG5ldHdvcmsgZHJpdmVyIGhhcmR3YXJlIGludGVyZmFjZSBjb2RlIGlzIGJhc2VkIG9uIHRoZQorICBPUy85MDAwIGRyaXZlciBmb3IgdGhlIE5ldyBNZWRpYSBFdGhlcm5ldCBMQU4gYnkgRXJpYyBNZWFycy4KKworICBTcGVjaWFsIHRoYW5rcyBmb3IgdGVzdGluZyBhbmQgaGVscCBpbiBkZWJ1Z2dpbmcgdGhpcyBkcml2ZXIgZ29lcworICB0byBLZW4gTGVzbmlhay4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRHJpdmVyIE5vdGVzIGFuZCBJc3N1ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMS4gRGV2ZWxvcGVkIG9uIGEgRGVsbCAzMjBTTGkKKyAgIFBDTUNJQSBDYXJkIFNlcnZpY2VzIDIuNi4yCisgICBMaW51eCBkZWxsIDEuMi4xMCAjMSBUaHUgSnVuIDI5IDIwOjIzOjQxIFBEVCAxOTk1IGkzODYKKworMi4gcmMucGNtY2lhIG1heSByZXF1aXJlIGxvYWRpbmcgcGNtY2lhX2NvcmUgd2l0aCBpb19zcGVlZD0zMDA6CisgICAnaW5zbW9kIHBjbWNpYV9jb3JlLm8gaW9fc3BlZWQ9MzAwJy4KKyAgIFRoaXMgd2lsbCBhdm9pZCBwcm9ibGVtcyB3aXRoIGZhc3Qgc3lzdGVtcyB3aGljaCBjYXVzZXMgcnhfZnJhbWVjbnQKKyAgIHRvIHJldHVybiByYW5kb20gdmFsdWVzLgorCiszLiBJZiBob3QgZXh0cmFjdGlvbiBkb2VzIG5vdCB3b3JrIGZvciB5b3UsIHVzZSAnaWZjb25maWcgZXRoMCBkb3duJworICAgYmVmb3JlIGV4dHJhY3Rpb24uCisKKzQuIFRoZXJlIGlzIGEgYmFkIHNsb3ctZG93biBwcm9ibGVtIGluIHRoaXMgZHJpdmVyLgorCis1LiBGdXR1cmU6IE11bHRpY2FzdCBwcm9jZXNzaW5nLiAgSW4gdGhlIG1lYW50aW1lLCBkbyBfbm90XyBjb21waWxlIHlvdXIKKyAgIGtlcm5lbCB3aXRoIG11bHRpY2FzdCBpcCBlbmFibGVkLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitIaXN0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMb2c6IG5tY2xhbl9jcy5jLHYKKyAqIDIuNS43NS1hYzEgMjAwMy8wNy8xMSBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICogRml4ZWQgaGFuZyBvbiBjYXJkIGVqZWN0IGFzIHdlIHByb2JlIGl0CisgKiBDbGVhbmVkIHVwIHRvIHVzZSBuZXcgc3R5bGUgbG9ja2luZy4KKyAqCisgKiBSZXZpc2lvbiAwLjE2ICAxOTk1LzA3LzAxICAwNjo0MjoxNyAgcnBhbworICogQnVnIGZpeDogbm1jbGFuX3Jlc2V0KCkgY2FsbGVkIENhcmRTZXJ2aWNlcyBpbmNvcnJlY3RseS4KKyAqCisgKiBSZXZpc2lvbiAwLjE1ICAxOTk1LzA1LzI0ICAwODowOTo0NyAgcnBhbworICogUmUtaW1wbGVtZW50IE1VTFRJX1RYIGRldi0+dGJ1c3kgaGFuZGxpbmcuCisgKgorICogUmV2aXNpb24gMC4xNCAgMTk5NS8wNS8yMyAgMDM6MTk6MzAgIHJwYW8KKyAqIEFkZGVkLCBpbiBubWNsYW5fY29uZmlnKCksICJ0dXBsZS5BdHRyaWJ1dGVzID0gMDsiLgorICogTW9kaWZpZWQgTUFDRSBJRCBjaGVjayB0byBpZ25vcmUgY2hpcCByZXZpc2lvbiBsZXZlbC4KKyAqIEF2b2lkIHR4X2ZyZWVfZnJhbWVzIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gX3N0YXJ0X3htaXQgYW5kIF9pbnRlcnJ1cHQuCisgKgorICogUmV2aXNpb24gMC4xMyAgMTk5NS8wNS8xOCAgMDU6NTY6MzQgIHJwYW8KKyAqIFN0YXRpc3RpY3MgY2hhbmdlcy4KKyAqIEJ1ZyBmaXg6IG5tY2xhbl9yZXNldCBkaWQgbm90IGVuYWJsZSBUWCBhbmQgUlg6IGNhbGwgcmVzdG9yZV9tdWx0aWNhc3RfbGlzdC4KKyAqIEJ1ZyBmaXg6IG1hY2VfaW50ZXJydXB0IGNoZWNrcyB+TUFDRV9JTVJfREVGQVVMVC4gIEZpeGVzIGRyaXZlciBsb2NrdXAuCisgKgorICogUmV2aXNpb24gMC4xMiAgMTk5NS8wNS8xNCAgMDA6MTI6MjMgIHJwYW8KKyAqIFN0YXRpc3RpY3Mgb3ZlcmhhdWwuCisgKgorCis5NS8wNS8xMyBycGFvCVYwLjEwYQorCQlCdWcgZml4OiBNQUNFIHN0YXRpc3RpY3MgY291bnRlcnMgdXNlZCB3cm9uZyBJL08gcG9ydHMuCisJCUJ1ZyBmaXg6IG1hY2VfaW50ZXJydXB0KCkgbmVlZGVkIHRvIGFsbG93IHN0YXRpc3RpY3MgdG8gYmUKKwkJcHJvY2Vzc2VkIHdpdGhvdXQgUlggb3IgVFggaW50ZXJydXB0cyBwZW5kaW5nLgorOTUvMDUvMTEgcnBhbwlWMC4xMAorCQlNdWx0aXBsZSB0cmFuc21pdCByZXF1ZXN0IHByb2Nlc3NpbmcuCisJCU1vZGlmaWVkIHN0YXRpc3RpY3MgdG8gdXNlIE1BQ0UgY291bnRlcnMgd2hlcmUgcG9zc2libGUuCis5NS8wNS8xMCBycGFvCVYwLjA5IEJ1ZyBmaXg6IE11c3QgdXNlIElPX0RBVEFfUEFUSF9XSURUSF9BVVRPLgorCQkqUmVsZWFzZWQKKzk1LzA1LzEwIHJwYW8JVjAuMDgKKwkJQnVnIGZpeDogTWFrZSBhbGwgbm9uLWV4cG9ydGVkIGZ1bmN0aW9ucyBwcml2YXRlIGJ5IHVzaW5nCisJCXN0YXRpYyBrZXl3b3JkLgorCQlCdWcgZml4OiBUZXN0IEludHJDbnQgX2JlZm9yZV8gcmVhZGluZyBNQUNFX0lSLgorOTUvMDUvMTAgcnBhbwlWMC4wNyBTdGF0aXN0aWNzLgorOTUvMDUvMDkgcnBhbwlWMC4wNiBGaXggcnhfZnJhbWVjbnQgcHJvYmxlbSBieSBhZGRpdGlvbiBvZiBQQ0lDIHdhaXQgc3RhdGVzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgRFJWX05BTUUJIm5tY2xhbl9jcyIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMTYiCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ29uZGl0aW9uYWwgQ29tcGlsYXRpb24gT3B0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE1VTFRJX1RYCQkJMAorI2RlZmluZSBSRVNFVF9PTl9USU1FT1VUCQkxCisjZGVmaW5lIFRYX0lOVEVSUlVQVEFCTEUJCTEKKyNkZWZpbmUgUkVTRVRfWElMSU5YCQkJMAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitJbmNsdWRlIEZpbGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0RlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBFVEhFUl9BRERSX0xFTgkJCUVUSF9BTEVOCisJCQkJCS8qIDYgYnl0ZXMgaW4gYW4gRXRoZXJuZXQgQWRkcmVzcyAqLworI2RlZmluZSBNQUNFX0xBRFJGX0xFTgkJCTgKKwkJCQkJLyogOCBieXRlcyBpbiBMb2dpY2FsIEFkZHJlc3MgRmlsdGVyICovCisKKy8qIExvb3AgQ29udHJvbCBEZWZpbmVzICovCisjZGVmaW5lIE1BQ0VfTUFYX0lSX0lURVJBVElPTlMJCTEwCisjZGVmaW5lIE1BQ0VfTUFYX1JYX0lURVJBVElPTlMJCTEyCisJLyoKKwlUQkQ6IERlYW4gYnJvdWdodCB0aGlzIHVwLCBhbmQgSSBhc3N1bWVkIHRoZSBoYXJkd2FyZSB3b3VsZAorCWhhbmRsZSBpdDoKKworCUlmIE1BQ0VfTUFYX1JYX0lURVJBVElPTlMgaXMgPiAxLCByeF9mcmFtZWNudCBtYXkgc3RpbGwgYmUKKwlub24temVybyB3aGVuIHRoZSBpc3IgZXhpdHMuICBXZSBtYXkgbm90IGdldCBhbm90aGVyIGludGVycnVwdAorCXRvIHByb2Nlc3MgdGhlIHJlbWFpbmluZyBwYWNrZXRzIGZvciBzb21lIHRpbWUuCisJKi8KKworLyoKK1RoZSBBbTIxNTAgaGFzIGEgWGlsaW54IFhDMzA0MiBmaWVsZCBwcm9ncmFtbWFibGUgZ2F0ZSBhcnJheSAoRlBHQSkKK3doaWNoIG1hbmFnZXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBNQUNFIGFuZCB0aGUgUENNQ0lBIGJ1cy4gIEl0CithbHNvIGluY2x1ZGVzIGJ1ZmZlciBtYW5hZ2VtZW50IGZvciB0aGUgMzJLIHggOCBTUkFNIHRvIGNvbnRyb2wgdXAgdG8KK2ZvdXIgdHJhbnNtaXQgYW5kIDEyIHJlY2VpdmUgZnJhbWVzIGF0IGEgdGltZS4KKyovCisjZGVmaW5lIEFNMjE1MF9NQVhfVFhfRlJBTUVTCQk0CisjZGVmaW5lIEFNMjE1MF9NQVhfUlhfRlJBTUVTCQkxMgorCisvKiBBbTIxNTAgRXRoZXJuZXQgQ2FyZCBJL08gTWFwcGluZyAqLworI2RlZmluZSBBTTIxNTBfUkNWCQkJMHgwMAorI2RlZmluZSBBTTIxNTBfWE1UCQkJMHgwNAorI2RlZmluZSBBTTIxNTBfWE1UX1NLSVAJCQkweDA5CisjZGVmaW5lIEFNMjE1MF9SQ1ZfTkVYVAkJCTB4MEEKKyNkZWZpbmUgQU0yMTUwX1JDVl9GUkFNRV9DT1VOVAkJMHgwQgorI2RlZmluZSBBTTIxNTBfTUFDRV9CQU5LCQkweDBDCisjZGVmaW5lIEFNMjE1MF9NQUNFX0JBU0UJCTB4MTAKKworLyogTUFDRSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUFDRV9SQ1ZGSUZPCQkJMAorI2RlZmluZSBNQUNFX1hNVEZJRk8JCQkxCisjZGVmaW5lIE1BQ0VfWE1URkMJCQkyCisjZGVmaW5lIE1BQ0VfWE1URlMJCQkzCisjZGVmaW5lIE1BQ0VfWE1UUkMJCQk0CisjZGVmaW5lIE1BQ0VfUkNWRkMJCQk1CisjZGVmaW5lIE1BQ0VfUkNWRlMJCQk2CisjZGVmaW5lIE1BQ0VfRklGT0ZDCQkJNworI2RlZmluZSBNQUNFX0lSCQkJCTgKKyNkZWZpbmUgTUFDRV9JTVIJCQk5CisjZGVmaW5lIE1BQ0VfUFIJCQkJMTAKKyNkZWZpbmUgTUFDRV9CSVVDQwkJCTExCisjZGVmaW5lIE1BQ0VfRklGT0NDCQkJMTIKKyNkZWZpbmUgTUFDRV9NQUNDQwkJCTEzCisjZGVmaW5lIE1BQ0VfUExTQ0MJCQkxNAorI2RlZmluZSBNQUNFX1BIWUNDCQkJMTUKKyNkZWZpbmUgTUFDRV9DSElQSURMCQkJMTYKKyNkZWZpbmUgTUFDRV9DSElQSURICQkJMTcKKyNkZWZpbmUgTUFDRV9JQUMJCQkxOAorLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUFDRV9MQURSRgkJCTIwCisjZGVmaW5lIE1BQ0VfUEFEUgkJCTIxCisvKiBSZXNlcnZlZCAqLworLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUFDRV9NUEMJCQkyNAorLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUFDRV9STlRQQwkJCTI2CisjZGVmaW5lIE1BQ0VfUkNWQ0MJCQkyNworLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUFDRV9VVFIJCQkyOQorI2RlZmluZSBNQUNFX1JUUjEJCQkzMAorI2RlZmluZSBNQUNFX1JUUjIJCQkzMQorCisvKiBNQUNFIEJpdCBNYXNrcyAqLworI2RlZmluZSBNQUNFX1hNVFJDX0VYREVGCQkweDgwCisjZGVmaW5lIE1BQ0VfWE1UUkNfWE1UUkMJCTB4MEYKKworI2RlZmluZSBNQUNFX1hNVEZTX1hNVFNWCQkweDgwCisjZGVmaW5lIE1BQ0VfWE1URlNfVUZMTwkJCTB4NDAKKyNkZWZpbmUgTUFDRV9YTVRGU19MQ09MCQkJMHgyMAorI2RlZmluZSBNQUNFX1hNVEZTX01PUkUJCQkweDEwCisjZGVmaW5lIE1BQ0VfWE1URlNfT05FCQkJMHgwOAorI2RlZmluZSBNQUNFX1hNVEZTX0RFRkVSCQkweDA0CisjZGVmaW5lIE1BQ0VfWE1URlNfTENBUgkJCTB4MDIKKyNkZWZpbmUgTUFDRV9YTVRGU19SVFJZCQkJMHgwMQorCisjZGVmaW5lIE1BQ0VfUkNWRlNfUkNWU1RTCQkweEYwMDAKKyNkZWZpbmUgTUFDRV9SQ1ZGU19PRkxPCQkJMHg4MDAwCisjZGVmaW5lIE1BQ0VfUkNWRlNfQ0xTTgkJCTB4NDAwMAorI2RlZmluZSBNQUNFX1JDVkZTX0ZSQU0JCQkweDIwMDAKKyNkZWZpbmUgTUFDRV9SQ1ZGU19GQ1MJCQkweDEwMDAKKworI2RlZmluZSBNQUNFX0ZJRk9GQ19SQ1ZGQwkJMHhGMAorI2RlZmluZSBNQUNFX0ZJRk9GQ19YTVRGQwkJMHgwRgorCisjZGVmaW5lIE1BQ0VfSVJfSkFCCQkJMHg4MAorI2RlZmluZSBNQUNFX0lSX0JBQkwJCQkweDQwCisjZGVmaW5lIE1BQ0VfSVJfQ0VSUgkJCTB4MjAKKyNkZWZpbmUgTUFDRV9JUl9SQ1ZDQ08JCQkweDEwCisjZGVmaW5lIE1BQ0VfSVJfUk5UUENPCQkJMHgwOAorI2RlZmluZSBNQUNFX0lSX01QQ08JCQkweDA0CisjZGVmaW5lIE1BQ0VfSVJfUkNWSU5UCQkJMHgwMgorI2RlZmluZSBNQUNFX0lSX1hNVElOVAkJCTB4MDEKKworI2RlZmluZSBNQUNFX01BQ0NDX1BST00JCQkweDgwCisjZGVmaW5lIE1BQ0VfTUFDQ0NfRFhNVDJQRAkJMHg0MAorI2RlZmluZSBNQUNFX01BQ0NDX0VNQkEJCQkweDIwCisjZGVmaW5lIE1BQ0VfTUFDQ0NfUkVTRVJWRUQJCTB4MTAKKyNkZWZpbmUgTUFDRV9NQUNDQ19EUkNWUEEJCTB4MDgKKyNkZWZpbmUgTUFDRV9NQUNDQ19EUkNWQkMJCTB4MDQKKyNkZWZpbmUgTUFDRV9NQUNDQ19FTlhNVAkJMHgwMgorI2RlZmluZSBNQUNFX01BQ0NDX0VOUkNWCQkweDAxCisKKyNkZWZpbmUgTUFDRV9QSFlDQ19MTktGTAkJMHg4MAorI2RlZmluZSBNQUNFX1BIWUNDX0RMTktUU1QJCTB4NDAKKyNkZWZpbmUgTUFDRV9QSFlDQ19SRVZQT0wJCTB4MjAKKyNkZWZpbmUgTUFDRV9QSFlDQ19EQVBDCQkJMHgxMAorI2RlZmluZSBNQUNFX1BIWUNDX0xSVAkJCTB4MDgKKyNkZWZpbmUgTUFDRV9QSFlDQ19BU0VMCQkJMHgwNAorI2RlZmluZSBNQUNFX1BIWUNDX1JXQUtFCQkweDAyCisjZGVmaW5lIE1BQ0VfUEhZQ0NfQVdBS0UJCTB4MDEKKworI2RlZmluZSBNQUNFX0lBQ19BRERSQ0hHCQkweDgwCisjZGVmaW5lIE1BQ0VfSUFDX1BIWUFERFIJCTB4MDQKKyNkZWZpbmUgTUFDRV9JQUNfTE9HQUREUgkJMHgwMgorCisjZGVmaW5lIE1BQ0VfVVRSX1JUUkUJCQkweDgwCisjZGVmaW5lIE1BQ0VfVVRSX1JUUkQJCQkweDQwCisjZGVmaW5lIE1BQ0VfVVRSX1JQQQkJCTB4MjAKKyNkZWZpbmUgTUFDRV9VVFJfRkNPTEwJCQkweDEwCisjZGVmaW5lIE1BQ0VfVVRSX1JDVkZDU0UJCTB4MDgKKyNkZWZpbmUgTUFDRV9VVFJfTE9PUF9JTkNMX01FTkRFQwkweDA2CisjZGVmaW5lIE1BQ0VfVVRSX0xPT1BfTk9fTUVOREVDCQkweDA0CisjZGVmaW5lIE1BQ0VfVVRSX0xPT1BfRVhURVJOQUwJCTB4MDIKKyNkZWZpbmUgTUFDRV9VVFJfTE9PUF9OT05FCQkweDAwCisjZGVmaW5lIE1BQ0VfVVRSX1JFU0VSVkVECQkweDAxCisKKy8qIFN3aXRjaCBNQUNFIHJlZ2lzdGVyIGJhbmsgKG9ubHkgMCBhbmQgMSBhcmUgdmFsaWQpICovCisjZGVmaW5lIE1BQ0VCQU5LKHdpbl9udW0pIG91dGIoKHdpbl9udW0pLCBpb2FkZHIgKyBBTTIxNTBfTUFDRV9CQU5LKQorCisjZGVmaW5lIE1BQ0VfSU1SX0RFRkFVTFQgXAorICAoMHhGRiAtIFwKKyAgICAoIFwKKyAgICAgIE1BQ0VfSVJfQ0VSUiB8IFwKKyAgICAgIE1BQ0VfSVJfUkNWQ0NPIHwgXAorICAgICAgTUFDRV9JUl9STlRQQ08gfCBcCisgICAgICBNQUNFX0lSX01QQ08gfCBcCisgICAgICBNQUNFX0lSX1JDVklOVCB8IFwKKyAgICAgIE1BQ0VfSVJfWE1USU5UIFwKKyAgICApIFwKKyAgKQorI3VuZGVmIE1BQ0VfSU1SX0RFRkFVTFQKKyNkZWZpbmUgTUFDRV9JTVJfREVGQVVMVCAweDAwIC8qIE5ldyBzdGF0aXN0aWNzIGhhbmRsaW5nOiBncmFiIGV2ZXJ5dGhpbmcgKi8KKworI2RlZmluZSBUWF9USU1FT1VUCQkoKDQwMCpIWikvMTAwMCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVHlwZSBEZWZpbml0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0eXBlZGVmIHN0cnVjdCBfbWFjZV9zdGF0aXN0aWNzIHsKKyAgICAvKiBNQUNFX1hNVEZTICovCisgICAgaW50IHhtdHN2OworICAgIGludCB1ZmxvOworICAgIGludCBsY29sOworICAgIGludCBtb3JlOworICAgIGludCBvbmU7CisgICAgaW50IGRlZmVyOworICAgIGludCBsY2FyOworICAgIGludCBydHJ5OworCisgICAgLyogTUFDRV9YTVRSQyAqLworICAgIGludCBleGRlZjsKKyAgICBpbnQgeG10cmM7CisKKyAgICAvKiBSRlMxLS1SZWNlaXZlIFN0YXR1cyAoUkNWU1RTKSAqLworICAgIGludCBvZmxvOworICAgIGludCBjbHNuOworICAgIGludCBmcmFtOworICAgIGludCBmY3M7CisKKyAgICAvKiBSRlMyLS1SdW50IFBhY2tldCBDb3VudCAoUk5UUEMpICovCisgICAgaW50IHJmc19ybnRwYzsKKworICAgIC8qIFJGUzMtLVJlY2VpdmUgQ29sbGlzaW9uIENvdW50IChSQ1ZDQykgKi8KKyAgICBpbnQgcmZzX3JjdmNjOworCisgICAgLyogTUFDRV9JUiAqLworICAgIGludCBqYWI7CisgICAgaW50IGJhYmw7CisgICAgaW50IGNlcnI7CisgICAgaW50IHJjdmNjbzsKKyAgICBpbnQgcm50cGNvOworICAgIGludCBtcGNvOworCisgICAgLyogTUFDRV9NUEMgKi8KKyAgICBpbnQgbXBjOworCisgICAgLyogTUFDRV9STlRQQyAqLworICAgIGludCBybnRwYzsKKworICAgIC8qIE1BQ0VfUkNWQ0MgKi8KKyAgICBpbnQgcmN2Y2M7Cit9IG1hY2Vfc3RhdGlzdGljczsKKwordHlwZWRlZiBzdHJ1Y3QgX21hY2VfcHJpdmF0ZSB7CisgICAgZGV2X2xpbmtfdCBsaW5rOworICAgIGRldl9ub2RlX3Qgbm9kZTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBsaW51eF9zdGF0czsgLyogTGludXggc3RhdGlzdGljcyBjb3VudGVycyAqLworICAgIG1hY2Vfc3RhdGlzdGljcyBtYWNlX3N0YXRzOyAvKiBNQUNFIGNoaXAgc3RhdGlzdGljcyBjb3VudGVycyAqLworCisgICAgLyogcmVzdG9yZV9tdWx0aWNhc3RfbGlzdCgpIHN0YXRlIHZhcmlhYmxlcyAqLworICAgIGludCBtdWx0aWNhc3RfbGFkcmZbTUFDRV9MQURSRl9MRU5dOyAvKiBMb2dpY2FsIGFkZHJlc3MgZmlsdGVyICovCisgICAgaW50IG11bHRpY2FzdF9udW1fYWRkcnM7CisKKyAgICBjaGFyIHR4X2ZyZWVfZnJhbWVzOyAvKiBOdW1iZXIgb2YgZnJlZSB0cmFuc21pdCBmcmFtZSBidWZmZXJzICovCisgICAgY2hhciB0eF9pcnFfZGlzYWJsZWQ7IC8qIE1BQ0UgVFggaW50ZXJydXB0IGRpc2FibGVkICovCisgICAgCisgICAgc3BpbmxvY2tfdCBiYW5rX2xvY2s7IC8qIE11c3QgYmUgaGVsZCBpZiB5b3Ugc3RlcCBvZmYgYmFuayAwICovCit9IG1hY2VfcHJpdmF0ZTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUHJpdmF0ZSBHbG9iYWwgVmFyaWFibGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBQQ01DSUFfREVCVUcKK3N0YXRpYyBjaGFyIHJjc2lkW10gPQorIm5tY2xhbl9jcy5jLHYgMC4xNiAxOTk1LzA3LzAxIDA2OjQyOjE3IHJwYW8gRXhwIHJwYW8iOworc3RhdGljIGNoYXIgKnZlcnNpb24gPQorRFJWX05BTUUgIiAiIERSVl9WRVJTSU9OICIgKFJvZ2VyIEMuIFBhbykiOworI2VuZGlmCisKK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvPSJubWNsYW5fY3MiOworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0OworCitzdGF0aWMgY2hhciAqaWZfbmFtZXNbXT17CisgICAgIkF1dG8iLCAiMTBiYXNlVCIsICJCTkMiLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUGFyYW1ldGVycworCVRoZXNlIGFyZSB0aGUgcGFyYW1ldGVycyB0aGF0IGNhbiBiZSBzZXQgZHVyaW5nIGxvYWRpbmcgd2l0aAorCSdpbnNtb2QnLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitNT0RVTEVfREVTQ1JJUFRJT04oIk5ldyBNZWRpYSBQQ01DSUEgZXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgSU5UX01PRFVMRV9QQVJNKG4sIHYpIHN0YXRpYyBpbnQgbiA9IHY7IG1vZHVsZV9wYXJhbShuLCBpbnQsIDApCisKKy8qIDA9YXV0bywgMT0xMGJhc2VULCAyID0gMTBiYXNlMiwgZGVmYXVsdD1hdXRvICovCitJTlRfTU9EVUxFX1BBUk0oaWZfcG9ydCwgMCk7CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKK0lOVF9NT0RVTEVfUEFSTShwY19kZWJ1ZywgUENNQ0lBX0RFQlVHKTsKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgaWYgKHBjX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncykKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRnVuY3Rpb24gUHJvdG90eXBlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBubWNsYW5fY29uZmlnKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIHZvaWQgbm1jbGFuX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgaW50IG5tY2xhbl9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCQlldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpOworCitzdGF0aWMgdm9pZCBubWNsYW5fcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG1hY2VfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKTsKK3N0YXRpYyBpbnQgbWFjZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBtYWNlX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBtYWNlX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBtYWNlX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgbWFjZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm1hY2VfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBtYWNlX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgUnhDbnQpOworc3RhdGljIHZvaWQgcmVzdG9yZV9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOworCisKK3N0YXRpYyBkZXZfbGlua190ICpubWNsYW5fYXR0YWNoKHZvaWQpOworc3RhdGljIHZvaWQgbm1jbGFuX2RldGFjaChkZXZfbGlua190ICopOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitubWNsYW5fYXR0YWNoCisJQ3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcgbG9jYWwgZGF0YQorCXN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQgd2l0aCBDYXJkCisJU2VydmljZXMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBkZXZfbGlua190ICpubWNsYW5fYXR0YWNoKHZvaWQpCit7CisgICAgbWFjZV9wcml2YXRlICpscDsKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgY2xpZW50X3JlZ190IGNsaWVudF9yZWc7CisgICAgaW50IHJldDsKKworICAgIERFQlVHKDAsICJubWNsYW5fYXR0YWNoKClcbiIpOworICAgIERFQlVHKDEsICIlc1xuIiwgcmNzaWQpOworCisgICAgLyogQ3JlYXRlIG5ldyBldGhlcm5ldCBkZXZpY2UgKi8KKyAgICBkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YobWFjZV9wcml2YXRlKSk7CisgICAgaWYgKCFkZXYpCisJcmV0dXJuIE5VTEw7CisgICAgbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGxpbmsgPSAmbHAtPmxpbms7CisgICAgbGluay0+cHJpdiA9IGRldjsKKyAgICAKKyAgICBzcGluX2xvY2tfaW5pdCgmbHAtPmJhbmtfbG9jayk7CisgICAgbGluay0+aW8uTnVtUG9ydHMxID0gMzI7CisgICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKKyAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDU7CisgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfSEFORExFX1BSRVNFTlQ7CisgICAgbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOworICAgIGxpbmstPmlycS5IYW5kbGVyID0gJm1hY2VfaW50ZXJydXB0OworICAgIGxpbmstPmlycS5JbnN0YW5jZSA9IGRldjsKKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CisgICAgbGluay0+Y29uZi5WY2MgPSA1MDsKKyAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMTsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBQUkVTRU5UX09QVElPTjsKKworICAgIGxwLT50eF9mcmVlX2ZyYW1lcz1BTTIxNTBfTUFYX1RYX0ZSQU1FUzsKKworICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZtYWNlX3N0YXJ0X3htaXQ7CisgICAgZGV2LT5zZXRfY29uZmlnID0gJm1hY2VfY29uZmlnOworICAgIGRldi0+Z2V0X3N0YXRzID0gJm1hY2VfZ2V0X3N0YXRzOworICAgIGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9tdWx0aWNhc3RfbGlzdDsKKyAgICBTRVRfRVRIVE9PTF9PUFMoZGV2LCAmbmV0ZGV2X2V0aHRvb2xfb3BzKTsKKyAgICBkZXYtPm9wZW4gPSAmbWFjZV9vcGVuOworICAgIGRldi0+c3RvcCA9ICZtYWNlX2Nsb3NlOworI2lmZGVmIEhBVkVfVFhfVElNRU9VVAorICAgIGRldi0+dHhfdGltZW91dCA9IG1hY2VfdHhfdGltZW91dDsKKyAgICBkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKyNlbmRpZgorCisgICAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgbGluay0+bmV4dCA9IGRldl9saXN0OworICAgIGRldl9saXN0ID0gbGluazsKKyAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KKwlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKwlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZubWNsYW5fZXZlbnQ7CisgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisgICAgaWYgKHJldCAhPSAwKSB7CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwlubWNsYW5fZGV0YWNoKGxpbmspOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBsaW5rOworfSAvKiBubWNsYW5fYXR0YWNoICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25tY2xhbl9kZXRhY2gKKwlUaGlzIGRlbGV0ZXMgYSBkcml2ZXIgImluc3RhbmNlIi4gIFRoZSBkZXZpY2UgaXMgZGUtcmVnaXN0ZXJlZAorCXdpdGggQ2FyZCBTZXJ2aWNlcy4gIElmIGl0IGhhcyBiZWVuIHJlbGVhc2VkLCBhbGwgbG9jYWwgZGF0YQorCXN0cnVjdHVyZXMgYXJlIGZyZWVkLiAgT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGZyZWVkCisJd2hlbiB0aGUgZGV2aWNlIGlzIHJlbGVhc2VkLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBubWNsYW5fZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgZGV2X2xpbmtfdCAqKmxpbmtwOworCisgICAgREVCVUcoMCwgIm5tY2xhbl9kZXRhY2goMHglcClcbiIsIGxpbmspOworCisgICAgLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKyAgICBmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorCWlmICgqbGlua3AgPT0gbGluaykgYnJlYWs7CisgICAgaWYgKCpsaW5rcCA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGlmIChsaW5rLT5kZXYpCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJbm1jbGFuX3JlbGVhc2UobGluayk7CisKKyAgICBpZiAobGluay0+aGFuZGxlKQorCXBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworCisgICAgLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGZyZWUgYml0cyAqLworICAgICpsaW5rcCA9IGxpbmstPm5leHQ7CisgICAgZnJlZV9uZXRkZXYoZGV2KTsKK30gLyogbm1jbGFuX2RldGFjaCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittYWNlX3JlYWQKKwlSZWFkcyBhIE1BQ0UgcmVnaXN0ZXIuICBUaGlzIGlzIGJhbmsgaW5kZXBlbmRlbnQ7IGhvd2V2ZXIsIHRoZQorCWNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IHRoaXMgY2FsbCBpcyBub3QgaW50ZXJydXB0YWJsZS4gIFdlIGFyZQorCWFzc3VtaW5nIHRoYXQgZHVyaW5nIG5vcm1hbCBvcGVyYXRpb24sIHRoZSBNQUNFIGlzIGFsd2F5cyBpbgorCWJhbmsgMC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbnQgbWFjZV9yZWFkKG1hY2VfcHJpdmF0ZSAqbHAsIGtpb19hZGRyX3QgaW9hZGRyLCBpbnQgcmVnKQoreworICBpbnQgZGF0YSA9IDB4RkY7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgc3dpdGNoIChyZWcgPj4gNCkgeworICAgIGNhc2UgMDogLyogcmVnaXN0ZXIgMC0xNSAqLworICAgICAgZGF0YSA9IGluYihpb2FkZHIgKyBBTTIxNTBfTUFDRV9CQVNFICsgcmVnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTogLyogcmVnaXN0ZXIgMTYtMzEgKi8KKyAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+YmFua19sb2NrLCBmbGFncyk7CisgICAgICBNQUNFQkFOSygxKTsKKyAgICAgIGRhdGEgPSBpbmIoaW9hZGRyICsgQU0yMTUwX01BQ0VfQkFTRSArIChyZWcgJiAweDBGKSk7CisgICAgICBNQUNFQkFOSygwKTsKKyAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5iYW5rX2xvY2ssIGZsYWdzKTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAoZGF0YSAmIDB4RkYpOworfSAvKiBtYWNlX3JlYWQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbWFjZV93cml0ZQorCVdyaXRlcyB0byBhIE1BQ0UgcmVnaXN0ZXIuICBUaGlzIGlzIGJhbmsgaW5kZXBlbmRlbnQ7IGhvd2V2ZXIsCisJdGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IHRoaXMgY2FsbCBpcyBub3QgaW50ZXJydXB0YWJsZS4gIFdlCisJYXJlIGFzc3VtaW5nIHRoYXQgZHVyaW5nIG5vcm1hbCBvcGVyYXRpb24sIHRoZSBNQUNFIGlzIGFsd2F5cyBpbgorCWJhbmsgMC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB2b2lkIG1hY2Vfd3JpdGUobWFjZV9wcml2YXRlICpscCwga2lvX2FkZHJfdCBpb2FkZHIsIGludCByZWcsIGludCBkYXRhKQoreworICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgIHN3aXRjaCAocmVnID4+IDQpIHsKKyAgICBjYXNlIDA6IC8qIHJlZ2lzdGVyIDAtMTUgKi8KKyAgICAgIG91dGIoZGF0YSAmIDB4RkYsIGlvYWRkciArIEFNMjE1MF9NQUNFX0JBU0UgKyByZWcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOiAvKiByZWdpc3RlciAxNi0zMSAqLworICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5iYW5rX2xvY2ssIGZsYWdzKTsKKyAgICAgIE1BQ0VCQU5LKDEpOworICAgICAgb3V0YihkYXRhICYgMHhGRiwgaW9hZGRyICsgQU0yMTUwX01BQ0VfQkFTRSArIChyZWcgJiAweDBGKSk7CisgICAgICBNQUNFQkFOSygwKTsKKyAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5iYW5rX2xvY2ssIGZsYWdzKTsKKyAgICAgIGJyZWFrOworICB9Cit9IC8qIG1hY2Vfd3JpdGUgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbWFjZV9pbml0CisJUmVzZXRzIHRoZSBNQUNFIGNoaXAuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50IG1hY2VfaW5pdChtYWNlX3ByaXZhdGUgKmxwLCBraW9fYWRkcl90IGlvYWRkciwgY2hhciAqZW5ldF9hZGRyKQoreworICBpbnQgaTsKKyAgaW50IGN0ID0gMDsKKworICAvKiBNQUNFIFNvZnR3YXJlIHJlc2V0ICovCisgIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9CSVVDQywgMSk7CisgIHdoaWxlIChtYWNlX3JlYWQobHAsIGlvYWRkciwgTUFDRV9CSVVDQykgJiAweDAxKSB7CisgICAgLyogV2FpdCBmb3IgcmVzZXQgYml0IHRvIGJlIGNsZWFyZWQgYXV0b21hdGljYWxseSBhZnRlciA8PSAyMDBucyAqLzsKKyAgICBpZigrK2N0ID4gNTAwKQorICAgIHsKKyAgICAJcHJpbnRrKEtFUk5fRVJSICJtYWNlOiByZXNldCBmYWlsZWQsIGNhcmQgcmVtb3ZlZCA/XG4iKTsKKyAgICAJcmV0dXJuIC0xOworICAgIH0KKyAgICB1ZGVsYXkoMSk7CisgIH0KKyAgbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX0JJVUNDLCAwKTsKKworICAvKiBUaGUgQW0yMTUwIHJlcXVpcmVzIHRoYXQgdGhlIE1BQ0UgRklGT3Mgb3BlcmF0ZSBpbiBidXJzdCBtb2RlLiAqLworICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfRklGT0NDLCAweDBGKTsKKworICBtYWNlX3dyaXRlKGxwLGlvYWRkciwgTUFDRV9SQ1ZGQywgMCk7IC8qIERpc2FibGUgQXV0byBTdHJpcCBSZWNlaXZlICovCisgIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9JTVIsIDB4RkYpOyAvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIHVudGlsIF9vcGVuICovCisKKyAgLyoKKyAgICogQml0IDItMSBQT1JUU0VMWzEtMF0gUG9ydCBTZWxlY3QuCisgICAqIDAwIEFVSS8xMEJhc2UtMgorICAgKiAwMSAxMEJhc2UtVAorICAgKiAxMCBEQUkgUG9ydCAocmVzZXJ2ZWQgaW4gQW0yMTUwKQorICAgKiAxMSBHUFNJCisgICAqIEZvciB0aGlzIGNhcmQsIG9ubHkgdGhlIGZpcnN0IHR3byBhcmUgdmFsaWQuCisgICAqIFNvLCBQTFNDQyBzaG91bGQgYmUgc2V0IHRvCisgICAqIDB4MDAgZm9yIDEwQmFzZS0yCisgICAqIDB4MDIgZm9yIDEwQmFzZS1UCisgICAqIE9yIGp1c3Qgc2V0IEFTRUwgaW4gUEhZQ0MgYmVsb3chCisgICAqLworICBzd2l0Y2ggKGlmX3BvcnQpIHsKKyAgICBjYXNlIDE6CisgICAgICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfUExTQ0MsIDB4MDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX1BMU0NDLCAweDAwKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfUEhZQ0MsIC8qIEFTRUwgKi8gNCk7CisgICAgICAvKiBBU0VMIEF1dG8gU2VsZWN0LiAgV2hlbiBzZXQsIHRoZSBQT1JUU0VMWzEtMF0gYml0cyBhcmUgb3ZlcnJpZGRlbiwKKwkgYW5kIHRoZSBNQUNFIGRldmljZSB3aWxsIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZSBvcGVyYXRpbmcgbWVkaWEKKwkgaW50ZXJmYWNlIHBvcnQuICovCisgICAgICBicmVhazsKKyAgfQorCisgIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9JQUMsIE1BQ0VfSUFDX0FERFJDSEcgfCBNQUNFX0lBQ19QSFlBRERSKTsKKyAgLyogUG9sbCBBRERSQ0hHIGJpdCAqLworICBjdCA9IDA7CisgIHdoaWxlIChtYWNlX3JlYWQobHAsIGlvYWRkciwgTUFDRV9JQUMpICYgTUFDRV9JQUNfQUREUkNIRykKKyAgeworICAJaWYoKysgY3QgPiA1MDApCisgIAl7CisgIAkJcHJpbnRrKEtFUk5fRVJSICJtYWNlOiBBRERSQ0hHIHRpbWVvdXQsIGNhcmQgcmVtb3ZlZCA/XG4iKTsKKyAgCQlyZXR1cm4gLTE7CisgIAl9CisgIH0KKyAgLyogU2V0IFBBRFIgcmVnaXN0ZXIgKi8KKyAgZm9yIChpID0gMDsgaSA8IEVUSEVSX0FERFJfTEVOOyBpKyspCisgICAgbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX1BBRFIsIGVuZXRfYWRkcltpXSk7CisKKyAgLyogTUFDIENvbmZpZ3VyYXRpb24gQ29udHJvbCBSZWdpc3RlciBzaG91bGQgYmUgd3JpdHRlbiBsYXN0ICovCisgIC8qIExldCBzZXRfbXVsdGljYXN0X2xpc3Qgc2V0IHRoaXMuICovCisgIC8qIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9NQUNDQywgTUFDRV9NQUNDQ19FTlhNVCB8IE1BQ0VfTUFDQ0NfRU5SQ1YpOyAqLworICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfTUFDQ0MsIDB4MDApOworICByZXR1cm4gMDsKK30gLyogbWFjZV9pbml0ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25tY2xhbl9jb25maWcKKwlUaGlzIHJvdXRpbmUgaXMgc2NoZWR1bGVkIHRvIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50CisJaXMgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlCisJZXRoZXJuZXQgZGV2aWNlIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKKyAgZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgbm1jbGFuX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworICBjbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOworICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgbWFjZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgIHR1cGxlX3QgdHVwbGU7CisgIGNpc3BhcnNlX3QgcGFyc2U7CisgIHVfY2hhciBidWZbNjRdOworICBpbnQgaSwgbGFzdF9yZXQsIGxhc3RfZm47CisgIGtpb19hZGRyX3QgaW9hZGRyOworCisgIERFQlVHKDAsICJubWNsYW5fY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKKworICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKyAgdHVwbGUuVHVwbGVEYXRhID0gYnVmOworICB0dXBsZS5UdXBsZURhdGFNYXggPSA2NDsKKyAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisgIENTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOworCisgIC8qIENvbmZpZ3VyZSBjYXJkICovCisgIGxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisKKyAgQ1NfQ0hFQ0soUmVxdWVzdElPLCBwY21jaWFfcmVxdWVzdF9pbyhoYW5kbGUsICZsaW5rLT5pbykpOworICBDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEoaGFuZGxlLCAmbGluay0+aXJxKSk7CisgIENTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKyAgZGV2LT5pcnEgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CisgIGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworCisgIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgIC8qIFJlYWQgdGhlIGV0aGVybmV0IGFkZHJlc3MgZnJvbSB0aGUgQ0lTLiAqLworICB0dXBsZS5EZXNpcmVkVHVwbGUgPSAweDgwIC8qIENJU1RQTF9DRlRBQkxFX0VOVFJZX01JU0MgKi87CisgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKKyAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7CisgIHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKyAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICBDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworICBtZW1jcHkoZGV2LT5kZXZfYWRkciwgdHVwbGUuVHVwbGVEYXRhLCBFVEhFUl9BRERSX0xFTik7CisKKyAgLyogVmVyaWZ5IGNvbmZpZ3VyYXRpb24gYnkgcmVhZGluZyB0aGUgTUFDRSBJRC4gKi8KKyAgeworICAgIGNoYXIgc2lnWzJdOworCisgICAgc2lnWzBdID0gbWFjZV9yZWFkKGxwLCBpb2FkZHIsIE1BQ0VfQ0hJUElETCk7CisgICAgc2lnWzFdID0gbWFjZV9yZWFkKGxwLCBpb2FkZHIsIE1BQ0VfQ0hJUElESCk7CisgICAgaWYgKChzaWdbMF0gPT0gMHg0MCkgJiYgKChzaWdbMV0gJiAweDBGKSA9PSAweDA5KSkgeworICAgICAgREVCVUcoMCwgIm5tY2xhbl9jcyBjb25maWd1cmVkOiBtYWNlIGlkPSV4ICV4XG4iLAorCSAgICBzaWdbMF0sIHNpZ1sxXSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ayhLRVJOX05PVElDRSAibm1jbGFuX2NzOiBtYWNlIGlkIG5vdCBmb3VuZDogJXggJXggc2hvdWxkIgorCSAgICAgIiBiZSAweDQwIDB4PzlcbiIsIHNpZ1swXSwgc2lnWzFdKTsKKyAgICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgaWYobWFjZV9pbml0KGxwLCBpb2FkZHIsIGRldi0+ZGV2X2FkZHIpID09IC0xKQorICAJZ290byBmYWlsZWQ7CisKKyAgLyogVGhlIGlmX3BvcnQgc3ltYm9sIGNhbiBiZSBzZXQgd2hlbiB0aGUgbW9kdWxlIGlzIGxvYWRlZCAqLworICBpZiAoaWZfcG9ydCA8PSAyKQorICAgIGRldi0+aWZfcG9ydCA9IGlmX3BvcnQ7CisgIGVsc2UKKyAgICBwcmludGsoS0VSTl9OT1RJQ0UgIm5tY2xhbl9jczogaW52YWxpZCBpZl9wb3J0IHJlcXVlc3RlZFxuIik7CisKKyAgbGluay0+ZGV2ID0gJmxwLT5ub2RlOworICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworICBTRVRfTkVUREVWX0RFVihkZXYsICZoYW5kbGVfdG9fZGV2KGhhbmRsZSkpOworCisgIGkgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKyAgaWYgKGkgIT0gMCkgeworICAgIHByaW50ayhLRVJOX05PVElDRSAibm1jbGFuX2NzOiByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWRcbiIpOworICAgIGxpbmstPmRldiA9IE5VTEw7CisgICAgZ290byBmYWlsZWQ7CisgIH0KKworICBzdHJjcHkobHAtPm5vZGUuZGV2X25hbWUsIGRldi0+bmFtZSk7CisKKyAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5tY2xhbjogcG9ydCAlIzNseCwgaXJxICVkLCAlcyBwb3J0LCBod19hZGRyICIsCisJIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxLCBpZl9uYW1lc1tkZXYtPmlmX3BvcnRdKTsKKyAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgIHByaW50aygiJTAyWCVzIiwgZGV2LT5kZXZfYWRkcltpXSwgKChpPDUpID8gIjoiIDogIlxuIikpOworICByZXR1cm47CisKK2NzX2ZhaWxlZDoKKyAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKK2ZhaWxlZDoKKyAgICBubWNsYW5fcmVsZWFzZShsaW5rKTsKKyAgICByZXR1cm47CisKK30gLyogbm1jbGFuX2NvbmZpZyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitubWNsYW5fcmVsZWFzZQorCUFmdGVyIGEgY2FyZCBpcyByZW1vdmVkLCBubWNsYW5fcmVsZWFzZSgpIHdpbGwgdW5yZWdpc3RlciB0aGUKKwluZXQgZGV2aWNlLCBhbmQgcmVsZWFzZSB0aGUgUENNQ0lBIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgZGV2aWNlCisJaXMgc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdm9pZCBubWNsYW5fcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworCisgIERFQlVHKDAsICJubWNsYW5fcmVsZWFzZSgweCVwKVxuIiwgbGluayk7CisKKyAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworICBwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisgIHBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworCisgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitubWNsYW5fZXZlbnQKKwlUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gIE1vc3RseSwgdGhpcyBzY2hlZHVsZXMgb3RoZXIKKwlzdHVmZiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuICBBIENBUkRfUkVNT1ZBTCBldmVudAorCWFsc28gc2V0cyBzb21lIGZsYWdzIHRvIGRpc2NvdXJhZ2UgdGhlIG5ldCBkcml2ZXJzIGZyb20gdHJ5aW5nCisJdG8gdGFsayB0byB0aGUgY2FyZCBhbnkgbW9yZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbnQgbm1jbGFuX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJICAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncykKK3sKKyAgZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKworICBERUJVRygxLCAibm1jbGFuX2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKworICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisgICAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX1BSRVNFTlQ7CisgICAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisgICAgICBsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKKyAgICAgIG5tY2xhbl9jb25maWcobGluayk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisgICAgICBsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKyAgICAgIC8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisgICAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJaWYgKGxpbmstPm9wZW4pCisJICBuZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisgICAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisgICAgICAvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisgICAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKwlpZiAobGluay0+b3BlbikgeworCSAgbm1jbGFuX3Jlc2V0KGRldik7CisJICBuZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9SRVNFVF9SRVFVRVNUOgorICAgICAgcmV0dXJuIDE7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gMDsKK30gLyogbm1jbGFuX2V2ZW50ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25tY2xhbl9yZXNldAorCVJlc2V0IGFuZCByZXN0b3JlIGFsbCBvZiB0aGUgWGlsaW54IGFuZCBNQUNFIHJlZ2lzdGVycy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB2b2lkIG5tY2xhbl9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICBtYWNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworI2lmIFJFU0VUX1hJTElOWAorICBkZXZfbGlua190ICpsaW5rID0gJmxwLT5saW5rOworICBjb25mX3JlZ190IHJlZzsKKyAgdV9sb25nIE9yaWdDb3JWYWx1ZTsgCisKKyAgLyogU2F2ZSBvcmlnaW5hbCBDT1IgdmFsdWUgKi8KKyAgcmVnLkZ1bmN0aW9uID0gMDsKKyAgcmVnLkFjdGlvbiA9IENTX1JFQUQ7CisgIHJlZy5PZmZzZXQgPSBDSVNSRUdfQ09SOworICByZWcuVmFsdWUgPSAwOworICBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIobGluay0+aGFuZGxlLCAmcmVnKTsKKyAgT3JpZ0NvclZhbHVlID0gcmVnLlZhbHVlOworCisgIC8qIFJlc2V0IFhpbGlueCAqLworICByZWcuQWN0aW9uID0gQ1NfV1JJVEU7CisgIHJlZy5PZmZzZXQgPSBDSVNSRUdfQ09SOworICBERUJVRygxLCAibm1jbGFuX3Jlc2V0OiBPcmlnQ29yVmFsdWU9MHglbFgsIHJlc2V0dGluZy4uLlxuIiwKKwlPcmlnQ29yVmFsdWUpOworICByZWcuVmFsdWUgPSBDT1JfU09GVF9SRVNFVDsKKyAgcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGxpbmstPmhhbmRsZSwgJnJlZyk7CisgIC8qIE5lZWQgdG8gd2FpdCBmb3IgMjAgbXMgZm9yIFBDTUNJQSB0byBmaW5pc2ggcmVzZXQuICovCisKKyAgLyogUmVzdG9yZSBvcmlnaW5hbCBDT1IgY29uZmlndXJhdGlvbiBpbmRleCAqLworICByZWcuVmFsdWUgPSBDT1JfTEVWRUxfUkVRIHwgKE9yaWdDb3JWYWx1ZSAmIENPUl9DT05GSUdfTUFTSyk7CisgIHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihsaW5rLT5oYW5kbGUsICZyZWcpOworICAvKiBYaWxpbnggaXMgbm93IGNvbXBsZXRlbHkgcmVzZXQgYWxvbmcgd2l0aCB0aGUgTUFDRSBjaGlwLiAqLworICBscC0+dHhfZnJlZV9mcmFtZXM9QU0yMTUwX01BWF9UWF9GUkFNRVM7CisKKyNlbmRpZiAvKiAjaWYgUkVTRVRfWElMSU5YICovCisKKyAgLyogWGlsaW54IGlzIG5vdyBjb21wbGV0ZWx5IHJlc2V0IGFsb25nIHdpdGggdGhlIE1BQ0UgY2hpcC4gKi8KKyAgbHAtPnR4X2ZyZWVfZnJhbWVzPUFNMjE1MF9NQVhfVFhfRlJBTUVTOworCisgIC8qIFJlaW5pdGlhbGl6ZSB0aGUgTUFDRSBjaGlwIGZvciBvcGVyYXRpb24uICovCisgIG1hY2VfaW5pdChscCwgZGV2LT5iYXNlX2FkZHIsIGRldi0+ZGV2X2FkZHIpOworICBtYWNlX3dyaXRlKGxwLCBkZXYtPmJhc2VfYWRkciwgTUFDRV9JTVIsIE1BQ0VfSU1SX0RFRkFVTFQpOworCisgIC8qIFJlc3RvcmUgdGhlIG11bHRpY2FzdCBsaXN0IGFuZCBlbmFibGUgVFggYW5kIFJYLiAqLworICByZXN0b3JlX211bHRpY2FzdF9saXN0KGRldik7Cit9IC8qIG5tY2xhbl9yZXNldCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittYWNlX2NvbmZpZworCVtTb21lb25lIHRlbGwgbWUgd2hhdCB0aGlzIGlzIHN1cHBvc2VkIHRvIGRvPyAgSXMgaWZfcG9ydCBhIGRlZmluZWQKKwlzdGFuZGFyZD8gIElmIHNvLCB0aGVyZSBzaG91bGQgYmUgZGVmaW5lcyB0byBpbmRpY2F0ZSAxPTEwQmFzZS1ULAorCTI9MTBCYXNlLTIsIGV0Yy4gaW5jbHVkaW5nIGxpbWl0ZWQgYXV0b21hdGljIGRldGVjdGlvbi5dCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50IG1hY2VfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKQoreworICBpZiAoKG1hcC0+cG9ydCAhPSAodV9jaGFyKSgtMSkpICYmIChtYXAtPnBvcnQgIT0gZGV2LT5pZl9wb3J0KSkgeworICAgIGlmIChtYXAtPnBvcnQgPD0gMikgeworICAgICAgZGV2LT5pZl9wb3J0ID0gbWFwLT5wb3J0OworICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHN3aXRjaGVkIHRvICVzIHBvcnRcbiIsIGRldi0+bmFtZSwKKwkgICAgIGlmX25hbWVzW2Rldi0+aWZfcG9ydF0pOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIC1FSU5WQUw7CisgIH0KKyAgcmV0dXJuIDA7Cit9IC8qIG1hY2VfY29uZmlnICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21hY2Vfb3BlbgorCU9wZW4gZGV2aWNlIGRyaXZlci4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbnQgbWFjZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgIG1hY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICBkZXZfbGlua190ICpsaW5rID0gJmxwLT5saW5rOworCisgIGlmICghREVWX09LKGxpbmspKQorICAgIHJldHVybiAtRU5PREVWOworCisgIGxpbmstPm9wZW4rKzsKKworICBNQUNFQkFOSygwKTsKKworICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworICBubWNsYW5fcmVzZXQoZGV2KTsKKworICByZXR1cm4gMDsgLyogQWx3YXlzIHN1Y2NlZWQgKi8KK30gLyogbWFjZV9vcGVuICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21hY2VfY2xvc2UKKwlDbG9zZXMgZGV2aWNlIGRyaXZlci4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbnQgbWFjZV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICBtYWNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgZGV2X2xpbmtfdCAqbGluayA9ICZscC0+bGluazsKKworICBERUJVRygyLCAiJXM6IHNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKKworICAvKiBNYXNrIG9mZiBhbGwgaW50ZXJydXB0cyBmcm9tIHRoZSBNQUNFIGNoaXAuICovCisgIG91dGIoMHhGRiwgaW9hZGRyICsgQU0yMTUwX01BQ0VfQkFTRSArIE1BQ0VfSU1SKTsKKworICBsaW5rLT5vcGVuLS07CisgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworICByZXR1cm4gMDsKK30gLyogbWFjZV9jbG9zZSAqLworCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXNwcmludGYoaW5mby0+YnVzX2luZm8sICJQQ01DSUEgMHglbHgiLCBkZXYtPmJhc2VfYWRkcik7Cit9CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKK3N0YXRpYyB1MzIgbmV0ZGV2X2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBwY19kZWJ1ZzsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgbGV2ZWwpCit7CisJcGNfZGVidWcgPSBsZXZlbDsKK30KKyNlbmRpZiAvKiBQQ01DSUFfREVCVUcgKi8KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKKyNpZmRlZiBQQ01DSUFfREVCVUcKKwkuZ2V0X21zZ2xldmVsCQk9IG5ldGRldl9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSBuZXRkZXZfc2V0X21zZ2xldmVsLAorI2VuZGlmIC8qIFBDTUNJQV9ERUJVRyAqLworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbWFjZV9zdGFydF94bWl0CisJVGhpcyByb3V0aW5lIGJlZ2lucyB0aGUgcGFja2V0IHRyYW5zbWl0IGZ1bmN0aW9uLiAgV2hlbiBjb21wbGV0ZWQsCisJaXQgd2lsbCBnZW5lcmF0ZSBhIHRyYW5zbWl0IGludGVycnVwdC4KKworCUFjY29yZGluZyB0byAvdXNyL3NyYy9saW51eC9uZXQvaW5ldC9kZXYuYywgaWYgX3N0YXJ0X3htaXQKKwlyZXR1cm5zIDAsIHRoZSAicGFja2V0IGlzIG5vdyBzb2xlbHkgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZQorCWRyaXZlci4iICBJZiBfc3RhcnRfeG1pdCByZXR1cm5zIG5vbi16ZXJvLCB0aGUgInRyYW5zbWlzc2lvbgorCWZhaWxlZCwgcHV0IHNrYiBiYWNrIGludG8gYSBsaXN0LiIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgbWFjZV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgIG1hY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICBkZXZfbGlua190ICpsaW5rID0gJmxwLT5saW5rOworCisgIHByaW50ayhLRVJOX05PVElDRSAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCAtLSAiLCBkZXYtPm5hbWUpOworI2lmIFJFU0VUX09OX1RJTUVPVVQKKyAgcHJpbnRrKCJyZXNldHRpbmcgY2FyZFxuIik7CisgIHBjbWNpYV9yZXNldF9jYXJkKGxpbmstPmhhbmRsZSwgTlVMTCk7CisjZWxzZSAvKiAjaWYgUkVTRVRfT05fVElNRU9VVCAqLworICBwcmludGsoIk5PVCByZXNldHRpbmcgY2FyZFxuIik7CisjZW5kaWYgLyogI2lmIFJFU0VUX09OX1RJTUVPVVQgKi8KKyAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBtYWNlX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgbWFjZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgIERFQlVHKDMsICIlczogbWFjZV9zdGFydF94bWl0KGxlbmd0aCA9ICVsZCkgY2FsbGVkLlxuIiwKKwlkZXYtPm5hbWUsIChsb25nKXNrYi0+bGVuKTsKKworI2lmICghVFhfSU5URVJSVVBUQUJMRSkKKyAgLyogRGlzYWJsZSBNQUNFIFRYIGludGVycnVwdHMuICovCisgIG91dGIoTUFDRV9JTVJfREVGQVVMVCB8IE1BQ0VfSVJfWE1USU5ULAorICAgIGlvYWRkciArIEFNMjE1MF9NQUNFX0JBU0UgKyBNQUNFX0lNUik7CisgIGxwLT50eF9pcnFfZGlzYWJsZWQ9MTsKKyNlbmRpZiAvKiAjaWYgKCFUWF9JTlRFUlJVUFRBQkxFKSAqLworCisgIHsKKyAgICAvKiBUaGlzIGJsb2NrIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IGFub3RoZXIgdHJhbnNtaXQgcmVxdWVzdCEKKyAgICAgICBtYWNlX3R4X3RpbWVvdXQgd2lsbCB0YWtlIGNhcmUgb2YgdGltZXItYmFzZWQgcmV0cmFuc21pc3Npb25zIGZyb20KKyAgICAgICB0aGUgdXBwZXIgbGF5ZXJzLiAgVGhlIGludGVycnVwdCBoYW5kbGVyIGlzIGd1YXJhbnRlZWQgbmV2ZXIgdG8KKyAgICAgICBzZXJ2aWNlIGEgdHJhbnNtaXQgaW50ZXJydXB0IHdoaWxlIHdlIGFyZSBpbiBoZXJlLgorICAgICovCisKKyAgICBscC0+bGludXhfc3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisgICAgbHAtPnR4X2ZyZWVfZnJhbWVzLS07CisKKyAgICAvKiBXQVJOSU5HOiBXcml0ZSB0aGUgX2V4YWN0XyBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpbiB0aGUgaGVhZGVyISAqLworICAgIC8qIFB1dCBvdXQgdGhlIHdvcmQgaGVhZGVyIFttdXN0IGJlIGFuIG91dHcoKV0gLiAuIC4gKi8KKyAgICBvdXR3KHNrYi0+bGVuLCBpb2FkZHIgKyBBTTIxNTBfWE1UKTsKKyAgICAvKiAuIC4gLiBhbmQgdGhlIHBhY2tldCBbbWF5IGJlIGFueSBjb21iaW5hdGlvbiBvZiBvdXR3KCkgYW5kIG91dGIoKV0gKi8KKyAgICBvdXRzdyhpb2FkZHIgKyBBTTIxNTBfWE1ULCBza2ItPmRhdGEsIHNrYi0+bGVuID4+IDEpOworICAgIGlmIChza2ItPmxlbiAmIDEpIHsKKyAgICAgIC8qIE9kZCBieXRlIHRyYW5zZmVyICovCisgICAgICBvdXRiKHNrYi0+ZGF0YVtza2ItPmxlbi0xXSwgaW9hZGRyICsgQU0yMTUwX1hNVCk7CisgICAgfQorCisgICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKyNpZiBNVUxUSV9UWAorICAgIGlmIChscC0+dHhfZnJlZV9mcmFtZXMgPiAwKQorICAgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyNlbmRpZiAvKiAjaWYgTVVMVElfVFggKi8KKyAgfQorCisjaWYgKCFUWF9JTlRFUlJVUFRBQkxFKQorICAvKiBSZS1lbmFibGUgTUFDRSBUWCBpbnRlcnJ1cHRzLiAqLworICBscC0+dHhfaXJxX2Rpc2FibGVkPTA7CisgIG91dGIoTUFDRV9JTVJfREVGQVVMVCwgaW9hZGRyICsgQU0yMTUwX01BQ0VfQkFTRSArIE1BQ0VfSU1SKTsKKyNlbmRpZiAvKiAjaWYgKCFUWF9JTlRFUlJVUFRBQkxFKSAqLworCisgIGRldl9rZnJlZV9za2Ioc2tiKTsKKworICByZXR1cm4gMDsKK30gLyogbWFjZV9zdGFydF94bWl0ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21hY2VfaW50ZXJydXB0CisJVGhlIGludGVycnVwdCBoYW5kbGVyLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlycXJldHVybl90IG1hY2VfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworICBtYWNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgaW50IHN0YXR1czsKKyAgaW50IEludHJDbnQgPSBNQUNFX01BWF9JUl9JVEVSQVRJT05TOworCisgIGlmIChkZXYgPT0gTlVMTCkgeworICAgIERFQlVHKDIsICJtYWNlX2ludGVycnVwdCgpOiBpcnEgMHglWCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLAorCSAgaXJxKTsKKyAgICByZXR1cm4gSVJRX05PTkU7CisgIH0KKworICBpZiAobHAtPnR4X2lycV9kaXNhYmxlZCkgeworICAgIHByaW50aygKKyAgICAgIChscC0+dHhfaXJxX2Rpc2FibGVkPworICAgICAgIEtFUk5fTk9USUNFICIlczogSW50ZXJydXB0IHdpdGggdHhfaXJxX2Rpc2FibGVkICIKKyAgICAgICAiW2lzcj0lMDJYLCBpbXI9JTAyWF1cbiI6IAorICAgICAgIEtFUk5fTk9USUNFICIlczogUmUtZW50ZXJpbmcgdGhlIGludGVycnVwdCBoYW5kbGVyICIKKyAgICAgICAiW2lzcj0lMDJYLCBpbXI9JTAyWF1cbiIpLAorICAgICAgZGV2LT5uYW1lLAorICAgICAgaW5iKGlvYWRkciArIEFNMjE1MF9NQUNFX0JBU0UgKyBNQUNFX0lSKSwKKyAgICAgIGluYihpb2FkZHIgKyBBTTIxNTBfTUFDRV9CQVNFICsgTUFDRV9JTVIpCisgICAgKTsKKyAgICAvKiBXQVJOSU5HOiBNQUNFX0lSIGhhcyBiZWVuIHJlYWQhICovCisgICAgcmV0dXJuIElSUV9OT05FOworICB9CisKKyAgaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKSB7CisgICAgREVCVUcoMiwgIiVzOiBpbnRlcnJ1cHQgZnJvbSBkZWFkIGNhcmRcbiIsIGRldi0+bmFtZSk7CisgICAgcmV0dXJuIElSUV9OT05FOworICB9CisKKyAgZG8geworICAgIC8qIFdBUk5JTkc6IE1BQ0VfSVIgaXMgYSBSRUFEL0NMRUFSIHBvcnQhICovCisgICAgc3RhdHVzID0gaW5iKGlvYWRkciArIEFNMjE1MF9NQUNFX0JBU0UgKyBNQUNFX0lSKTsKKworICAgIERFQlVHKDMsICJtYWNlX2ludGVycnVwdDogaXJxIDB4JVggc3RhdHVzIDB4JVguXG4iLCBpcnEsIHN0YXR1cyk7CisKKyAgICBpZiAoc3RhdHVzICYgTUFDRV9JUl9SQ1ZJTlQpIHsKKyAgICAgIG1hY2VfcngoZGV2LCBNQUNFX01BWF9SWF9JVEVSQVRJT05TKTsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICYgTUFDRV9JUl9YTVRJTlQpIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgZmlmb2ZjOworICAgICAgdW5zaWduZWQgY2hhciB4bXRyYzsKKyAgICAgIHVuc2lnbmVkIGNoYXIgeG10ZnM7CisKKyAgICAgIGZpZm9mYyA9IGluYihpb2FkZHIgKyBBTTIxNTBfTUFDRV9CQVNFICsgTUFDRV9GSUZPRkMpOworICAgICAgaWYgKChmaWZvZmMgJiBNQUNFX0ZJRk9GQ19YTVRGQyk9PTApIHsKKwlscC0+bGludXhfc3RhdHMudHhfZXJyb3JzKys7CisJb3V0YigweEZGLCBpb2FkZHIgKyBBTTIxNTBfWE1UX1NLSVApOworICAgICAgfQorCisgICAgICAvKiBUcmFuc21pdCBSZXRyeSBDb3VudCAoWE1UUkMsIHJlZyA0KSAqLworICAgICAgeG10cmMgPSBpbmIoaW9hZGRyICsgQU0yMTUwX01BQ0VfQkFTRSArIE1BQ0VfWE1UUkMpOworICAgICAgaWYgKHhtdHJjICYgTUFDRV9YTVRSQ19FWERFRikgbHAtPm1hY2Vfc3RhdHMuZXhkZWYrKzsKKyAgICAgIGxwLT5tYWNlX3N0YXRzLnhtdHJjICs9ICh4bXRyYyAmIE1BQ0VfWE1UUkNfWE1UUkMpOworCisgICAgICBpZiAoCisgICAgICAgICh4bXRmcyA9IGluYihpb2FkZHIgKyBBTTIxNTBfTUFDRV9CQVNFICsgTUFDRV9YTVRGUykpICYKKyAgICAgICAgTUFDRV9YTVRGU19YTVRTViAvKiBUcmFuc21pdCBTdGF0dXMgVmFsaWQgKi8KKyAgICAgICkgeworCWxwLT5tYWNlX3N0YXRzLnhtdHN2Kys7CisKKwlpZiAoeG10ZnMgJiB+TUFDRV9YTVRGU19YTVRTVikgeworCSAgaWYgKHhtdGZzICYgTUFDRV9YTVRGU19VRkxPKSB7CisJICAgIC8qIFVuZGVyZmxvdy4gIEluZGljYXRlcyB0aGF0IHRoZSBUcmFuc21pdCBGSUZPIGVtcHRpZWQgYmVmb3JlCisJICAgICAgIHRoZSBlbmQgb2YgZnJhbWUgd2FzIHJlYWNoZWQuICovCisJICAgIGxwLT5tYWNlX3N0YXRzLnVmbG8rKzsKKwkgIH0KKwkgIGlmICh4bXRmcyAmIE1BQ0VfWE1URlNfTENPTCkgeworCSAgICAvKiBMYXRlIENvbGxpc2lvbiAqLworCSAgICBscC0+bWFjZV9zdGF0cy5sY29sKys7CisJICB9CisJICBpZiAoeG10ZnMgJiBNQUNFX1hNVEZTX01PUkUpIHsKKwkgICAgLyogTU9SRSB0aGFuIG9uZSByZXRyeSB3YXMgbmVlZGVkICovCisJICAgIGxwLT5tYWNlX3N0YXRzLm1vcmUrKzsKKwkgIH0KKwkgIGlmICh4bXRmcyAmIE1BQ0VfWE1URlNfT05FKSB7CisJICAgIC8qIEV4YWN0bHkgT05FIHJldHJ5IG9jY3VycmVkICovCisJICAgIGxwLT5tYWNlX3N0YXRzLm9uZSsrOworCSAgfQorCSAgaWYgKHhtdGZzICYgTUFDRV9YTVRGU19ERUZFUikgeworCSAgICAvKiBUcmFuc21pc3Npb24gd2FzIGRlZmVyZWQgKi8KKwkgICAgbHAtPm1hY2Vfc3RhdHMuZGVmZXIrKzsKKwkgIH0KKwkgIGlmICh4bXRmcyAmIE1BQ0VfWE1URlNfTENBUikgeworCSAgICAvKiBMb3NzIG9mIGNhcnJpZXIgKi8KKwkgICAgbHAtPm1hY2Vfc3RhdHMubGNhcisrOworCSAgfQorCSAgaWYgKHhtdGZzICYgTUFDRV9YTVRGU19SVFJZKSB7CisJICAgIC8qIFJldHJ5IGVycm9yOiB0cmFuc21pdCBhYm9ydGVkIGFmdGVyIDE2IGF0dGVtcHRzICovCisJICAgIGxwLT5tYWNlX3N0YXRzLnJ0cnkrKzsKKwkgIH0KKyAgICAgICAgfSAvKiBpZiAoeG10ZnMgJiB+TUFDRV9YTVRGU19YTVRTVikgKi8KKworICAgICAgfSAvKiBpZiAoeG10ZnMgJiBNQUNFX1hNVEZTX1hNVFNWKSAqLworCisgICAgICBscC0+bGludXhfc3RhdHMudHhfcGFja2V0cysrOworICAgICAgbHAtPnR4X2ZyZWVfZnJhbWVzKys7CisgICAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisgICAgfSAvKiBpZiAoc3RhdHVzICYgTUFDRV9JUl9YTVRJTlQpICovCisKKyAgICBpZiAoc3RhdHVzICYgfk1BQ0VfSU1SX0RFRkFVTFQgJiB+TUFDRV9JUl9SQ1ZJTlQgJiB+TUFDRV9JUl9YTVRJTlQpIHsKKyAgICAgIGlmIChzdGF0dXMgJiBNQUNFX0lSX0pBQikgeworICAgICAgICAvKiBKYWJiZXIgRXJyb3IuICBFeGNlc3NpdmUgdHJhbnNtaXQgZHVyYXRpb24gKDIwLTE1MG1zKS4gKi8KKyAgICAgICAgbHAtPm1hY2Vfc3RhdHMuamFiKys7CisgICAgICB9CisgICAgICBpZiAoc3RhdHVzICYgTUFDRV9JUl9CQUJMKSB7CisgICAgICAgIC8qIEJhYmJsZSBFcnJvci4gID4xNTE4IGJ5dGVzIHRyYW5zbWl0dGVkLiAqLworICAgICAgICBscC0+bWFjZV9zdGF0cy5iYWJsKys7CisgICAgICB9CisgICAgICBpZiAoc3RhdHVzICYgTUFDRV9JUl9DRVJSKSB7CisJLyogQ29sbGlzaW9uIEVycm9yLiAgQ0VSUiBpbmRpY2F0ZXMgdGhlIGFic2VuY2Ugb2YgdGhlCisJICAgU2lnbmFsIFF1YWxpdHkgRXJyb3IgVGVzdCBtZXNzYWdlIGFmdGVyIGEgcGFja2V0CisJICAgdHJhbnNtaXNzaW9uLiAqLworICAgICAgICBscC0+bWFjZV9zdGF0cy5jZXJyKys7CisgICAgICB9CisgICAgICBpZiAoc3RhdHVzICYgTUFDRV9JUl9SQ1ZDQ08pIHsKKyAgICAgICAgLyogUmVjZWl2ZSBDb2xsaXNpb24gQ291bnQgT3ZlcmZsb3c7ICovCisgICAgICAgIGxwLT5tYWNlX3N0YXRzLnJjdmNjbysrOworICAgICAgfQorICAgICAgaWYgKHN0YXR1cyAmIE1BQ0VfSVJfUk5UUENPKSB7CisgICAgICAgIC8qIFJ1bnQgUGFja2V0IENvdW50IE92ZXJmbG93ICovCisgICAgICAgIGxwLT5tYWNlX3N0YXRzLnJudHBjbysrOworICAgICAgfQorICAgICAgaWYgKHN0YXR1cyAmIE1BQ0VfSVJfTVBDTykgeworICAgICAgICAvKiBNaXNzZWQgUGFja2V0IENvdW50IE92ZXJmbG93ICovCisgICAgICAgIGxwLT5tYWNlX3N0YXRzLm1wY28rKzsKKyAgICAgIH0KKyAgICB9IC8qIGlmIChzdGF0dXMgJiB+TUFDRV9JTVJfREVGQVVMVCAmIH5NQUNFX0lSX1JDVklOVCAmIH5NQUNFX0lSX1hNVElOVCkgKi8KKworICB9IHdoaWxlICgoc3RhdHVzICYgfk1BQ0VfSU1SX0RFRkFVTFQpICYmICgtLUludHJDbnQpKTsKKworICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9IC8qIG1hY2VfaW50ZXJydXB0ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21hY2VfcngKKwlSZWNlaXZlcyBwYWNrZXRzLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCBtYWNlX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgUnhDbnQpCit7CisgIG1hY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICB1bnNpZ25lZCBjaGFyIHJ4X2ZyYW1lY250OworICB1bnNpZ25lZCBzaG9ydCByeF9zdGF0dXM7CisKKyAgd2hpbGUgKAorICAgICgocnhfZnJhbWVjbnQgPSBpbmIoaW9hZGRyICsgQU0yMTUwX1JDVl9GUkFNRV9DT1VOVCkpID4gMCkgJiYKKyAgICAocnhfZnJhbWVjbnQgPD0gMTIpICYmIC8qIHJ4X2ZyYW1lY250PT0weEZGIGlmIGNhcmQgaXMgZXh0cmFjdGVkLiAqLworICAgIChSeENudC0tKQorICApIHsKKyAgICByeF9zdGF0dXMgPSBpbncoaW9hZGRyICsgQU0yMTUwX1JDVik7CisKKyAgICBERUJVRygzLCAiJXM6IGluIG1hY2VfcngoKSwgZnJhbWVjbnQgMHglWCwgcnhfc3RhdHVzIgorCSAgIiAweCVYLlxuIiwgZGV2LT5uYW1lLCByeF9mcmFtZWNudCwgcnhfc3RhdHVzKTsKKworICAgIGlmIChyeF9zdGF0dXMgJiBNQUNFX1JDVkZTX1JDVlNUUykgeyAvKiBFcnJvciwgdXBkYXRlIHN0YXRzLiAqLworICAgICAgbHAtPmxpbnV4X3N0YXRzLnJ4X2Vycm9ycysrOworICAgICAgaWYgKHJ4X3N0YXR1cyAmIE1BQ0VfUkNWRlNfT0ZMTykgeworICAgICAgICBscC0+bWFjZV9zdGF0cy5vZmxvKys7CisgICAgICB9CisgICAgICBpZiAocnhfc3RhdHVzICYgTUFDRV9SQ1ZGU19DTFNOKSB7CisgICAgICAgIGxwLT5tYWNlX3N0YXRzLmNsc24rKzsKKyAgICAgIH0KKyAgICAgIGlmIChyeF9zdGF0dXMgJiBNQUNFX1JDVkZTX0ZSQU0pIHsKKwlscC0+bWFjZV9zdGF0cy5mcmFtKys7CisgICAgICB9CisgICAgICBpZiAocnhfc3RhdHVzICYgTUFDRV9SQ1ZGU19GQ1MpIHsKKyAgICAgICAgbHAtPm1hY2Vfc3RhdHMuZmNzKys7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHNob3J0IHBrdF9sZW4gPSAocnhfc3RhdHVzICYgfk1BQ0VfUkNWRlNfUkNWU1RTKSAtIDQ7CisgICAgICAgIC8qIEF1dG8gU3RyaXAgaXMgb2ZmLCBhbHdheXMgc3VidHJhY3QgNCAqLworICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworICAgICAgbHAtPm1hY2Vfc3RhdHMucmZzX3JudHBjICs9IGluYihpb2FkZHIgKyBBTTIxNTBfUkNWKTsKKyAgICAgICAgLyogcnVudCBwYWNrZXQgY291bnQgKi8KKyAgICAgIGxwLT5tYWNlX3N0YXRzLnJmc19yY3ZjYyArPSBpbmIoaW9hZGRyICsgQU0yMTUwX1JDVik7CisgICAgICAgIC8qIHJjdiBjb2xsaXNpb24gY291bnQgKi8KKworICAgICAgREVCVUcoMywgIiAgICByZWNlaXZpbmcgcGFja2V0IHNpemUgMHglWCByeF9zdGF0dXMiCisJICAgICIgMHglWC5cbiIsIHBrdF9sZW4sIHJ4X3N0YXR1cyk7CisKKyAgICAgIHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbisyKTsKKworICAgICAgaWYgKHNrYiAhPSBOVUxMKSB7CisJc2tiLT5kZXYgPSBkZXY7CisKKwlza2JfcmVzZXJ2ZShza2IsIDIpOworCWluc3coaW9hZGRyICsgQU0yMTUwX1JDViwgc2tiX3B1dChza2IsIHBrdF9sZW4pLCBwa3RfbGVuPj4xKTsKKwlpZiAocGt0X2xlbiAmIDEpCisJICAgICooc2tiLT50YWlsLTEpID0gaW5iKGlvYWRkciArIEFNMjE1MF9SQ1YpOworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCisJbmV0aWZfcngoc2tiKTsgLyogU2VuZCB0aGUgcGFja2V0IHRvIHRoZSB1cHBlciAocHJvdG9jb2wpIGxheWVycy4gKi8KKworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJbHAtPmxpbnV4X3N0YXRzLnJ4X3BhY2tldHMrKzsKKwlscC0+bGludXhfc3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJb3V0YigweEZGLCBpb2FkZHIgKyBBTTIxNTBfUkNWX05FWFQpOyAvKiBza2lwIHRvIG5leHQgZnJhbWUgKi8KKwljb250aW51ZTsKKyAgICAgIH0gZWxzZSB7CisJREVCVUcoMSwgIiVzOiBjb3VsZG4ndCBhbGxvY2F0ZSBhIHNrX2J1ZmYgb2Ygc2l6ZSIKKwkgICAgICAiICVkLlxuIiwgZGV2LT5uYW1lLCBwa3RfbGVuKTsKKwlscC0+bGludXhfc3RhdHMucnhfZHJvcHBlZCsrOworICAgICAgfQorICAgIH0KKyAgICBvdXRiKDB4RkYsIGlvYWRkciArIEFNMjE1MF9SQ1ZfTkVYVCk7IC8qIHNraXAgdG8gbmV4dCBmcmFtZSAqLworICB9IC8qIHdoaWxlICovCisKKyAgcmV0dXJuIDA7Cit9IC8qIG1hY2VfcnggKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcHJfbGludXhfc3RhdHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyB2b2lkIHByX2xpbnV4X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwc3RhdHMpCit7CisgIERFQlVHKDIsICJwcl9saW51eF9zdGF0c1xuIik7CisgIERFQlVHKDIsICIgcnhfcGFja2V0cz0lLTdsZCAgICAgICAgdHhfcGFja2V0cz0lbGRcbiIsCisJKGxvbmcpcHN0YXRzLT5yeF9wYWNrZXRzLCAobG9uZylwc3RhdHMtPnR4X3BhY2tldHMpOworICBERUJVRygyLCAiIHJ4X2Vycm9ycz0lLTdsZCAgICAgICAgIHR4X2Vycm9ycz0lbGRcbiIsCisJKGxvbmcpcHN0YXRzLT5yeF9lcnJvcnMsIChsb25nKXBzdGF0cy0+dHhfZXJyb3JzKTsKKyAgREVCVUcoMiwgIiByeF9kcm9wcGVkPSUtN2xkICAgICAgICB0eF9kcm9wcGVkPSVsZFxuIiwKKwkobG9uZylwc3RhdHMtPnJ4X2Ryb3BwZWQsIChsb25nKXBzdGF0cy0+dHhfZHJvcHBlZCk7CisgIERFQlVHKDIsICIgbXVsdGljYXN0PSUtN2xkICAgICAgICAgY29sbGlzaW9ucz0lbGRcbiIsCisJKGxvbmcpcHN0YXRzLT5tdWx0aWNhc3QsIChsb25nKXBzdGF0cy0+Y29sbGlzaW9ucyk7CisKKyAgREVCVUcoMiwgIiByeF9sZW5ndGhfZXJyb3JzPSUtN2xkICByeF9vdmVyX2Vycm9ycz0lbGRcbiIsCisJKGxvbmcpcHN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzLCAobG9uZylwc3RhdHMtPnJ4X292ZXJfZXJyb3JzKTsKKyAgREVCVUcoMiwgIiByeF9jcmNfZXJyb3JzPSUtN2xkICAgICByeF9mcmFtZV9lcnJvcnM9JWxkXG4iLAorCShsb25nKXBzdGF0cy0+cnhfY3JjX2Vycm9ycywgKGxvbmcpcHN0YXRzLT5yeF9mcmFtZV9lcnJvcnMpOworICBERUJVRygyLCAiIHJ4X2ZpZm9fZXJyb3JzPSUtN2xkICAgIHJ4X21pc3NlZF9lcnJvcnM9JWxkXG4iLAorCShsb25nKXBzdGF0cy0+cnhfZmlmb19lcnJvcnMsIChsb25nKXBzdGF0cy0+cnhfbWlzc2VkX2Vycm9ycyk7CisKKyAgREVCVUcoMiwgIiB0eF9hYm9ydGVkX2Vycm9ycz0lLTdsZCB0eF9jYXJyaWVyX2Vycm9ycz0lbGRcbiIsCisJKGxvbmcpcHN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycywgKGxvbmcpcHN0YXRzLT50eF9jYXJyaWVyX2Vycm9ycyk7CisgIERFQlVHKDIsICIgdHhfZmlmb19lcnJvcnM9JS03bGQgICAgdHhfaGVhcnRiZWF0X2Vycm9ycz0lbGRcbiIsCisJKGxvbmcpcHN0YXRzLT50eF9maWZvX2Vycm9ycywgKGxvbmcpcHN0YXRzLT50eF9oZWFydGJlYXRfZXJyb3JzKTsKKyAgREVCVUcoMiwgIiB0eF93aW5kb3dfZXJyb3JzPSVsZFxuIiwKKwkobG9uZylwc3RhdHMtPnR4X3dpbmRvd19lcnJvcnMpOworfSAvKiBwcl9saW51eF9zdGF0cyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwcl9tYWNlX3N0YXRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdm9pZCBwcl9tYWNlX3N0YXRzKG1hY2Vfc3RhdGlzdGljcyAqcHN0YXRzKQoreworICBERUJVRygyLCAicHJfbWFjZV9zdGF0c1xuIik7CisKKyAgREVCVUcoMiwgIiB4bXRzdj0lLTdkICAgICAgICAgICAgIHVmbG89JWRcbiIsCisJcHN0YXRzLT54bXRzdiwgcHN0YXRzLT51ZmxvKTsKKyAgREVCVUcoMiwgIiBsY29sPSUtN2QgICAgICAgICAgICAgIG1vcmU9JWRcbiIsCisJcHN0YXRzLT5sY29sLCBwc3RhdHMtPm1vcmUpOworICBERUJVRygyLCAiIG9uZT0lLTdkICAgICAgICAgICAgICAgZGVmZXI9JWRcbiIsCisJcHN0YXRzLT5vbmUsIHBzdGF0cy0+ZGVmZXIpOworICBERUJVRygyLCAiIGxjYXI9JS03ZCAgICAgICAgICAgICAgcnRyeT0lZFxuIiwKKwlwc3RhdHMtPmxjYXIsIHBzdGF0cy0+cnRyeSk7CisKKyAgLyogTUFDRV9YTVRSQyAqLworICBERUJVRygyLCAiIGV4ZGVmPSUtN2QgICAgICAgICAgICAgeG10cmM9JWRcbiIsCisJcHN0YXRzLT5leGRlZiwgcHN0YXRzLT54bXRyYyk7CisKKyAgLyogUkZTMS0tUmVjZWl2ZSBTdGF0dXMgKFJDVlNUUykgKi8KKyAgREVCVUcoMiwgIiBvZmxvPSUtN2QgICAgICAgICAgICAgIGNsc249JWRcbiIsCisJcHN0YXRzLT5vZmxvLCBwc3RhdHMtPmNsc24pOworICBERUJVRygyLCAiIGZyYW09JS03ZCAgICAgICAgICAgICAgZmNzPSVkXG4iLAorCXBzdGF0cy0+ZnJhbSwgcHN0YXRzLT5mY3MpOworCisgIC8qIFJGUzItLVJ1bnQgUGFja2V0IENvdW50IChSTlRQQykgKi8KKyAgLyogUkZTMy0tUmVjZWl2ZSBDb2xsaXNpb24gQ291bnQgKFJDVkNDKSAqLworICBERUJVRygyLCAiIHJmc19ybnRwYz0lLTdkICAgICAgICAgcmZzX3JjdmNjPSVkXG4iLAorCXBzdGF0cy0+cmZzX3JudHBjLCBwc3RhdHMtPnJmc19yY3ZjYyk7CisKKyAgLyogTUFDRV9JUiAqLworICBERUJVRygyLCAiIGphYj0lLTdkICAgICAgICAgICAgICAgYmFibD0lZFxuIiwKKwlwc3RhdHMtPmphYiwgcHN0YXRzLT5iYWJsKTsKKyAgREVCVUcoMiwgIiBjZXJyPSUtN2QgICAgICAgICAgICAgIHJjdmNjbz0lZFxuIiwKKwlwc3RhdHMtPmNlcnIsIHBzdGF0cy0+cmN2Y2NvKTsKKyAgREVCVUcoMiwgIiBybnRwY289JS03ZCAgICAgICAgICAgIG1wY289JWRcbiIsCisJcHN0YXRzLT5ybnRwY28sIHBzdGF0cy0+bXBjbyk7CisKKyAgLyogTUFDRV9NUEMgKi8KKyAgREVCVUcoMiwgIiBtcGM9JWRcbiIsIHBzdGF0cy0+bXBjKTsKKworICAvKiBNQUNFX1JOVFBDICovCisgIERFQlVHKDIsICIgcm50cGM9JWRcbiIsIHBzdGF0cy0+cm50cGMpOworCisgIC8qIE1BQ0VfUkNWQ0MgKi8KKyAgREVCVUcoMiwgIiByY3ZjYz0lZFxuIiwgcHN0YXRzLT5yY3ZjYyk7CisKK30gLyogcHJfbWFjZV9zdGF0cyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit1cGRhdGVfc3RhdHMKKwlVcGRhdGUgc3RhdGlzdGljcy4gIFdlIGNoYW5nZSB0byByZWdpc3RlciB3aW5kb3cgMSwgc28gdGhpcworCXNob3VsZCBiZSBydW4gc2luZ2xlLXRocmVhZGVkIGlmIHRoZSBkZXZpY2UgaXMgYWN0aXZlLiBUaGlzIGlzCisJZXhwZWN0ZWQgdG8gYmUgYSByYXJlIG9wZXJhdGlvbiwgYW5kIGl0J3Mgc2ltcGxlciBmb3IgdGhlIHJlc3QKKwlvZiB0aGUgZHJpdmVyIHRvIGFzc3VtZSB0aGF0IHdpbmRvdyAwIGlzIGFsd2F5cyB2YWxpZCByYXRoZXIKKwl0aGFuIHVzZSBhIHNwZWNpYWwgd2luZG93LXN0YXRlIHZhcmlhYmxlLgorCisJb2ZsbyAmIHVmbG8gc2hvdWxkIF9uZXZlcl8gb2NjdXIgc2luY2UgaXQgd291bGQgbWVhbiB0aGUgWGlsaW54CisJd2FzIG5vdCBhYmxlIHRvIHRyYW5zZmVyIGRhdGEgYmV0d2VlbiB0aGUgTUFDRSBGSUZPIGFuZCB0aGUKKwljYXJkJ3MgU1JBTSBmYXN0IGVub3VnaC4gIElmIHRoaXMgaGFwcGVucywgc29tZXRoaW5nIGlzCisJc2VyaW91c2x5IHdyb25nIHdpdGggdGhlIGhhcmR3YXJlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHZvaWQgdXBkYXRlX3N0YXRzKGtpb19hZGRyX3QgaW9hZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICBtYWNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICBscC0+bWFjZV9zdGF0cy5yY3ZjYyArPSBtYWNlX3JlYWQobHAsIGlvYWRkciwgTUFDRV9SQ1ZDQyk7CisgIGxwLT5tYWNlX3N0YXRzLnJudHBjICs9IG1hY2VfcmVhZChscCwgaW9hZGRyLCBNQUNFX1JOVFBDKTsKKyAgbHAtPm1hY2Vfc3RhdHMubXBjICs9IG1hY2VfcmVhZChscCwgaW9hZGRyLCBNQUNFX01QQyk7CisgIC8qIEF0IHRoaXMgcG9pbnQsIG1hY2Vfc3RhdHMgaXMgZnVsbHkgdXBkYXRlZCBmb3IgdGhpcyBjYWxsLgorICAgICBXZSBtYXkgbm93IHVwZGF0ZSB0aGUgbGludXhfc3RhdHMuICovCisKKyAgLyogVGhlIE1BQ0UgaGFzIG5vIGVxdWl2YWxlbnQgZm9yIGxpbnV4X3N0YXRzIGZpZWxkIHdoaWNoIGFyZSBjb21tZW50ZWQKKyAgICAgb3V0LiAqLworCisgIC8qIGxwLT5saW51eF9zdGF0cy5tdWx0aWNhc3Q7ICovCisgIGxwLT5saW51eF9zdGF0cy5jb2xsaXNpb25zID0gCisgICAgbHAtPm1hY2Vfc3RhdHMucmN2Y2NvICogMjU2ICsgbHAtPm1hY2Vfc3RhdHMucmN2Y2M7CisgICAgLyogQ29sbGlzaW9uOiBUaGUgTUFDRSBtYXkgcmV0cnkgc2VuZGluZyBhIHBhY2tldCAxNSB0aW1lcworICAgICAgIGJlZm9yZSBnaXZpbmcgdXAuICBUaGUgcmV0cnkgY291bnQgaXMgaW4gWE1UUkMuCisgICAgICAgRG9lcyBlYWNoIHJldHJ5IGNvbnN0aXR1dGUgYSBjb2xsaXNpb24/CisgICAgICAgSWYgc28sIHdoeSBkb2Vzbid0IHRoZSBSQ1ZDQyByZWNvcmQgdGhlc2UgY29sbGlzaW9ucz8gKi8KKworICAvKiBkZXRhaWxlZCByeF9lcnJvcnM6ICovCisgIGxwLT5saW51eF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gCisgICAgbHAtPm1hY2Vfc3RhdHMucm50cGNvICogMjU2ICsgbHAtPm1hY2Vfc3RhdHMucm50cGM7CisgIC8qIGxwLT5saW51eF9zdGF0cy5yeF9vdmVyX2Vycm9ycyAqLworICBscC0+bGludXhfc3RhdHMucnhfY3JjX2Vycm9ycyA9IGxwLT5tYWNlX3N0YXRzLmZjczsKKyAgbHAtPmxpbnV4X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IGxwLT5tYWNlX3N0YXRzLmZyYW07CisgIGxwLT5saW51eF9zdGF0cy5yeF9maWZvX2Vycm9ycyA9IGxwLT5tYWNlX3N0YXRzLm9mbG87CisgIGxwLT5saW51eF9zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gCisgICAgbHAtPm1hY2Vfc3RhdHMubXBjbyAqIDI1NiArIGxwLT5tYWNlX3N0YXRzLm1wYzsKKworICAvKiBkZXRhaWxlZCB0eF9lcnJvcnMgKi8KKyAgbHAtPmxpbnV4X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzID0gbHAtPm1hY2Vfc3RhdHMucnRyeTsKKyAgbHAtPmxpbnV4X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzID0gbHAtPm1hY2Vfc3RhdHMubGNhcjsKKyAgICAvKiBMQ0FSIHVzdWFsbHkgcmVzdWx0cyBmcm9tIGJhZCBjYWJsaW5nLiAqLworICBscC0+bGludXhfc3RhdHMudHhfZmlmb19lcnJvcnMgPSBscC0+bWFjZV9zdGF0cy51ZmxvOworICBscC0+bGludXhfc3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycyA9IGxwLT5tYWNlX3N0YXRzLmNlcnI7CisgIC8qIGxwLT5saW51eF9zdGF0cy50eF93aW5kb3dfZXJyb3JzOyAqLworCisgIHJldHVybjsKK30gLyogdXBkYXRlX3N0YXRzICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21hY2VfZ2V0X3N0YXRzCisJR2F0aGVycyBldGhlcm5ldCBzdGF0aXN0aWNzIGZyb20gdGhlIE1BQ0UgY2hpcC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbWFjZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgbWFjZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgdXBkYXRlX3N0YXRzKGRldi0+YmFzZV9hZGRyLCBkZXYpOworCisgIERFQlVHKDEsICIlczogdXBkYXRpbmcgdGhlIHN0YXRpc3RpY3MuXG4iLCBkZXYtPm5hbWUpOworICBwcl9saW51eF9zdGF0cygmbHAtPmxpbnV4X3N0YXRzKTsKKyAgcHJfbWFjZV9zdGF0cygmbHAtPm1hY2Vfc3RhdHMpOworCisgIHJldHVybiAmbHAtPmxpbnV4X3N0YXRzOworfSAvKiBuZXRfZGV2aWNlX3N0YXRzICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3VwZGF0ZUNSQworCU1vZGlmaWVkIGZyb20gQW03OUM5MCBkYXRhIHNoZWV0LgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgQlJPS0VOX01VTFRJQ0FTVAorCitzdGF0aWMgdm9pZCB1cGRhdGVDUkMoaW50ICpDUkMsIGludCBiaXQpCit7CisgIGludCBwb2x5W109eworICAgIDEsMSwxLDAsIDEsMSwwLDEsCisgICAgMSwwLDEsMSwgMSwwLDAsMCwKKyAgICAxLDAsMCwwLCAwLDAsMSwxLAorICAgIDAsMCwxLDAsIDAsMCwwLDAKKyAgfTsgLyogQ1JDIHBvbHlub21pYWwuICBwb2x5W25dID0gY29lZmZpY2llbnQgb2YgdGhlIHgqKm4gdGVybSBvZiB0aGUKKwlDUkMgZ2VuZXJhdG9yIHBvbHlub21pYWwuICovCisKKyAgaW50IGo7CisKKyAgLyogc2hpZnQgQ1JDIGFuZCBjb250cm9sIGJpdCAoQ1JDWzMyXSkgKi8KKyAgZm9yIChqID0gMzI7IGogPiAwOyBqLS0pCisgICAgQ1JDW2pdID0gQ1JDW2otMV07CisgIENSQ1swXSA9IDA7CisKKyAgLyogSWYgYml0IFhPUihjb250cm9sIGJpdCkgPSAxLCBzZXQgQ1JDID0gQ1JDIFhPUiBwb2x5bm9taWFsLiAqLworICBpZiAoYml0IF4gQ1JDWzMyXSkKKyAgICBmb3IgKGogPSAwOyBqIDwgMzI7IGorKykKKyAgICAgIENSQ1tqXSBePSBwb2x5W2pdOworfSAvKiB1cGRhdGVDUkMgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQnVpbGRMQUYKKwlCdWlsZCBsb2dpY2FsIGFkZHJlc3MgZmlsdGVyLgorCU1vZGlmaWVkIGZyb20gQW03OUM5MCBkYXRhIHNoZWV0LgorCitJbnB1dAorCWxhZHJmOiBsb2dpY2FsIGFkZHJlc3MgZmlsdGVyIChjb250ZW50cyBpbml0aWFsaXplZCB0byAwKQorCWFkcjogZXRoZXJuZXQgYWRkcmVzcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHZvaWQgQnVpbGRMQUYoaW50ICpsYWRyZiwgaW50ICphZHIpCit7CisgIGludCBDUkNbMzNdPXsxfTsgLyogQ1JDIHJlZ2lzdGVyLCAxIHdvcmQvYml0ICsgZXh0cmEgY29udHJvbCBiaXQgKi8KKworICBpbnQgaSwgYnl0ZTsgLyogdGVtcG9yYXJ5IGFycmF5IGluZGljZXMgKi8KKyAgaW50IGhhc2hjb2RlOyAvKiB0aGUgb3V0cHV0IG9iamVjdCAqLworCisgIENSQ1szMl09MDsKKworICBmb3IgKGJ5dGUgPSAwOyBieXRlIDwgNjsgYnl0ZSsrKQorICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICB1cGRhdGVDUkMoQ1JDLCAoYWRyW2J5dGVdID4+IGkpICYgMSk7CisKKyAgaGFzaGNvZGUgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgIGhhc2hjb2RlID0gKGhhc2hjb2RlIDw8IDEpICsgQ1JDW2ldOworCisgIGJ5dGUgPSBoYXNoY29kZSA+PiAzOworICBsYWRyZltieXRlXSB8PSAoMSA8PCAoaGFzaGNvZGUgJiA3KSk7CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgaWYgKHBjX2RlYnVnID4gMikgeworICAgIHByaW50ayhLRVJOX0RFQlVHICIgICAgYWRyID0iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgcHJpbnRrKCIgJTAyWCIsIGFkcltpXSk7CisgICAgcHJpbnRrKCJcbiIgS0VSTl9ERUJVRyAiICAgIGhhc2hjb2RlID0gJWQoZGVjaW1hbCksIGxhZHJmWzA6NjNdIgorCSAgICIgPSIsIGhhc2hjb2RlKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgcHJpbnRrKCIgJTAyWCIsIGxhZHJmW2ldKTsKKyAgICBwcmludGsoIlxuIik7CisgIH0KKyNlbmRpZgorfSAvKiBCdWlsZExBRiAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityZXN0b3JlX211bHRpY2FzdF9saXN0CisJUmVzdG9yZXMgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIE1BQ0UgY2hpcCB0byB0aGUgbGFzdAorCXNldF9tdWx0aWNhc3RfbGlzdCgpIGNhbGwuCisKK0lucHV0CisJbXVsdGljYXN0X251bV9hZGRycworCW11bHRpY2FzdF9sYWRyZltdCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdm9pZCByZXN0b3JlX211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgIG1hY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICBpbnQgbnVtX2FkZHJzID0gbHAtPm11bHRpY2FzdF9udW1fYWRkcnM7CisgIGludCAqbGFkcmYgPSBscC0+bXVsdGljYXN0X2xhZHJmOworICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICBpbnQgaTsKKworICBERUJVRygyLCAiJXM6IHJlc3RvcmluZyBSeCBtb2RlIHRvICVkIGFkZHJlc3Nlcy5cbiIsCisJZGV2LT5uYW1lLCBudW1fYWRkcnMpOworCisgIGlmIChudW1fYWRkcnMgPiAwKSB7CisKKyAgICBERUJVRygxLCAiQXR0ZW1wdCB0byByZXN0b3JlIG11bHRpY2FzdCBsaXN0IGRldGVjdGVkLlxuIik7CisKKyAgICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfSUFDLCBNQUNFX0lBQ19BRERSQ0hHIHwgTUFDRV9JQUNfTE9HQUREUik7CisgICAgLyogUG9sbCBBRERSQ0hHIGJpdCAqLworICAgIHdoaWxlIChtYWNlX3JlYWQobHAsIGlvYWRkciwgTUFDRV9JQUMpICYgTUFDRV9JQUNfQUREUkNIRykKKyAgICAgIDsKKyAgICAvKiBTZXQgTEFEUkYgcmVnaXN0ZXIgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFDRV9MQURSRl9MRU47IGkrKykKKyAgICAgIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9MQURSRiwgbGFkcmZbaV0pOworCisgICAgbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX1VUUiwgTUFDRV9VVFJfUkNWRkNTRSB8IE1BQ0VfVVRSX0xPT1BfRVhURVJOQUwpOworICAgIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9NQUNDQywgTUFDRV9NQUNDQ19FTlhNVCB8IE1BQ0VfTUFDQ0NfRU5SQ1YpOworCisgIH0gZWxzZSBpZiAobnVtX2FkZHJzIDwgMCkgeworCisgICAgLyogUHJvbWlzY3VvdXMgbW9kZTogcmVjZWl2ZSBhbGwgcGFja2V0cyAqLworICAgIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9VVFIsIE1BQ0VfVVRSX0xPT1BfRVhURVJOQUwpOworICAgIG1hY2Vfd3JpdGUobHAsIGlvYWRkciwgTUFDRV9NQUNDQywKKyAgICAgIE1BQ0VfTUFDQ0NfUFJPTSB8IE1BQ0VfTUFDQ0NfRU5YTVQgfCBNQUNFX01BQ0NDX0VOUkNWCisgICAgKTsKKworICB9IGVsc2UgeworCisgICAgLyogTm9ybWFsIG1vZGUgKi8KKyAgICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfVVRSLCBNQUNFX1VUUl9MT09QX0VYVEVSTkFMKTsKKyAgICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfTUFDQ0MsIE1BQ0VfTUFDQ0NfRU5YTVQgfCBNQUNFX01BQ0NDX0VOUkNWKTsKKworICB9Cit9IC8qIHJlc3RvcmVfbXVsdGljYXN0X2xpc3QgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc2V0X211bHRpY2FzdF9saXN0CisJU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisKK0lucHV0CisJbnVtX2FkZHJzID09IC0xCVByb21pc2N1b3VzIG1vZGUsIHJlY2VpdmUgYWxsIHBhY2tldHMKKwludW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKKwludW1fYWRkcnMgPiAwCU11bHRpY2FzdCBtb2RlLCByZWNlaXZlIG5vcm1hbCBhbmQgTUMgcGFja2V0cywgYW5kIGRvCisJCQliZXN0LWVmZm9ydCBmaWx0ZXJpbmcuCitPdXRwdXQKKwltdWx0aWNhc3RfbnVtX2FkZHJzCisJbXVsdGljYXN0X2xhZHJmW10KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgIG1hY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICBpbnQgYWRyW0VUSEVSX0FERFJfTEVOXSA9IHswfTsgLyogRXRoZXJuZXQgYWRkcmVzcyAqLworICBpbnQgaTsKKyAgc3RydWN0IGRldl9tY19saXN0ICpkbWkgPSBkZXYtPm1jX2xpc3Q7CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgaWYgKHBjX2RlYnVnID4gMSkgeworICAgIHN0YXRpYyBpbnQgb2xkOworICAgIGlmIChkZXYtPm1jX2NvdW50ICE9IG9sZCkgeworICAgICAgb2xkID0gZGV2LT5tY19jb3VudDsKKyAgICAgIERFQlVHKDAsICIlczogc2V0dGluZyBSeCBtb2RlIHRvICVkIGFkZHJlc3Nlcy5cbiIsCisJICAgIGRldi0+bmFtZSwgb2xkKTsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIC8qIFNldCBtdWx0aWNhc3RfbnVtX2FkZHJzLiAqLworICBscC0+bXVsdGljYXN0X251bV9hZGRycyA9IGRldi0+bWNfY291bnQ7CisKKyAgLyogU2V0IG11bHRpY2FzdF9sYWRyZi4gKi8KKyAgaWYgKG51bV9hZGRycyA+IDApIHsKKyAgICAvKiBDYWxjdWxhdGUgbXVsdGljYXN0IGxvZ2ljYWwgYWRkcmVzcyBmaWx0ZXIgKi8KKyAgICBtZW1zZXQobHAtPm11bHRpY2FzdF9sYWRyZiwgMCwgTUFDRV9MQURSRl9MRU4pOworICAgIGZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyspIHsKKyAgICAgIG1lbWNweShhZHIsIGRtaS0+ZG1pX2FkZHIsIEVUSEVSX0FERFJfTEVOKTsKKyAgICAgIGRtaSA9IGRtaS0+bmV4dDsKKyAgICAgIEJ1aWxkTEFGKGxwLT5tdWx0aWNhc3RfbGFkcmYsIGFkcik7CisgICAgfQorICB9CisKKyAgcmVzdG9yZV9tdWx0aWNhc3RfbGlzdChkZXYpOworCit9IC8qIHNldF9tdWx0aWNhc3RfbGlzdCAqLworCisjZW5kaWYgLyogQlJPS0VOX01VTFRJQ0FTVCAqLworCitzdGF0aWMgdm9pZCByZXN0b3JlX211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgIG1hY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgIERFQlVHKDIsICIlczogcmVzdG9yaW5nIFJ4IG1vZGUgdG8gJWQgYWRkcmVzc2VzLlxuIiwgZGV2LT5uYW1lLAorCWxwLT5tdWx0aWNhc3RfbnVtX2FkZHJzKTsKKworICBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisgICAgLyogUHJvbWlzY3VvdXMgbW9kZTogcmVjZWl2ZSBhbGwgcGFja2V0cyAqLworICAgIG1hY2Vfd3JpdGUobHAsaW9hZGRyLCBNQUNFX1VUUiwgTUFDRV9VVFJfTE9PUF9FWFRFUk5BTCk7CisgICAgbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX01BQ0NDLAorICAgICAgTUFDRV9NQUNDQ19QUk9NIHwgTUFDRV9NQUNDQ19FTlhNVCB8IE1BQ0VfTUFDQ0NfRU5SQ1YKKyAgICApOworICB9IGVsc2UgeworICAgIC8qIE5vcm1hbCBtb2RlICovCisgICAgbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX1VUUiwgTUFDRV9VVFJfTE9PUF9FWFRFUk5BTCk7CisgICAgbWFjZV93cml0ZShscCwgaW9hZGRyLCBNQUNFX01BQ0NDLCBNQUNFX01BQ0NDX0VOWE1UIHwgTUFDRV9NQUNDQ19FTlJDVik7CisgIH0KK30gLyogcmVzdG9yZV9tdWx0aWNhc3RfbGlzdCAqLworCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgbWFjZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgaWYgKHBjX2RlYnVnID4gMSkgeworICAgIHN0YXRpYyBpbnQgb2xkOworICAgIGlmIChkZXYtPm1jX2NvdW50ICE9IG9sZCkgeworICAgICAgb2xkID0gZGV2LT5tY19jb3VudDsKKyAgICAgIERFQlVHKDAsICIlczogc2V0dGluZyBSeCBtb2RlIHRvICVkIGFkZHJlc3Nlcy5cbiIsCisJICAgIGRldi0+bmFtZSwgb2xkKTsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIGxwLT5tdWx0aWNhc3RfbnVtX2FkZHJzID0gZGV2LT5tY19jb3VudDsKKyAgcmVzdG9yZV9tdWx0aWNhc3RfbGlzdChkZXYpOworCit9IC8qIHNldF9tdWx0aWNhc3RfbGlzdCAqLworCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgbm1jbGFuX2NzX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gIm5tY2xhbl9jcyIsCisJfSwKKwkuYXR0YWNoCQk9IG5tY2xhbl9hdHRhY2gsCisJLmRldGFjaAkJPSBubWNsYW5fZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubWNsYW5fY3Modm9pZCkKK3sKKwlyZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmbm1jbGFuX2NzX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25tY2xhbl9jcyh2b2lkKQoreworCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmbm1jbGFuX2NzX2RyaXZlcik7CisJQlVHX09OKGRldl9saXN0ICE9IE5VTEwpOworfQorCittb2R1bGVfaW5pdChpbml0X25tY2xhbl9jcyk7Cittb2R1bGVfZXhpdChleGl0X25tY2xhbl9jcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvb3NpdGVjaC5oIGIvZHJpdmVycy9uZXQvcGNtY2lhL29zaXRlY2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTI2ZWZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL29zaXRlY2guaApAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAgICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGZpcm13YXJlIG9mIFNldmVuIG9mIERpYW1vbmRzIGZyb20gT1NJVEVDSC4KKyAgICAoU3BlY2lhbCB0aGFua3MgdG8gS2V2aW4gTWFjUGhlcnNvbiBvZiBPU0lURUNIKQorCisgICAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorICAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisqLworCisgICAgc3RhdGljIGNvbnN0IHVfY2hhciBfX1hpbGlueDdPRFtdID0geworICAgIDB4RkYsIDB4MDQsIDB4QTAsIDB4MzYsIDB4RjMsIDB4RUMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REYsIDB4RkIsIDB4RkYsCisgICAgMHhGMywgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhFRiwgMHgzRiwgMHhGRiwgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHg3RiwgMHhGRSwgMHhGRiwKKyAgICAweENFLCAweEZFLCAweEZFLCAweEZFLCAKKyAgICAweEZFLCAweERFLCAweEJELCAweERELCAweEZELCAweEZGLCAweEZELCAweENGLCAweEY3LCAweEJGLCAweDdGLCAweEZGLAorICAgIDB4N0YsIDB4M0YsIDB4RkUsIDB4QkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkMsIDB4RkYsIDB4RkYsIDB4QkQsIDB4QjUsIDB4N0YsIDB4N0YsIDB4QkYsIDB4QkYsCisgICAgMHg3RiwgMHhGRiwgMHhFRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGQiwgMHhGRiwgMHhGNywgMHhGNywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHhERSwKKyAgICAweEZFLCAweEZFLCAweEZBLCAweERFLCAKKyAgICAweEJELCAweEZELCAweEVELCAweEZELCAweEZELCAweENGLCAweEVGLCAweEVGLCAweEVGLCAweEVGLCAweEM3LCAweERGLAorICAgIDB4REYsIDB4REYsIDB4REYsIDB4REYsIAorICAgIDB4RkYsIDB4N0UsIDB4RkUsIDB4RkQsIDB4N0QsIDB4NkQsIDB4RUUsIDB4RkUsIDB4N0MsIDB4RkIsIDB4RjQsIDB4RkIsCisgICAgMHhDRiwgMHhEQiwgMHhERiwgMHhGRiwgCisgICAgMHhGRiwgMHhCQiwgMHg3RiwgMHhGRiwgMHg3RiwgMHhGRiwgMHhGNywgMHhGRiwgMHg5RSwgMHhCRiwgMHgzQiwgMHhCRiwKKyAgICAweEJGLCAweDdGLCAweDdGLCAweDdGLCAKKyAgICAweDdFLCAweDZGLCAweERGLCAweEVGLCAweEY1LCAweEY2LCAweEZELCAweEY2LCAweEY1LCAweEVELCAweEVCLCAweEZGLAorICAgIDB4RUYsIDB4RUYsIDB4RUYsIDB4N0UsIAorICAgIDB4N0YsIDB4N0YsIDB4NkYsIDB4N0YsIDB4RkYsIDB4RkUsIDB4RkUsIDB4RkUsIDB4RkUsIDB4RkUsIDB4RUYsIDB4QkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCQywgMHgxRiwgMHgxRiwgMHhFRSwgMHhGRiwgMHhCQywKKyAgICAweEI3LCAweEZGLCAweERGLCAweEZGLCAKKyAgICAweERGLCAweEVGLCAweDNCLCAweEUzLCAweEQzLCAweEZGLCAweEZCLCAweEZGLCAweEZGLCAweERGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4QkEsIDB4QkYsIDB4MkQsIAorICAgIDB4REIsIDB4QkQsIDB4RkQsIDB4REIsIDB4REYsIDB4RkEsIDB4RkIsIDB4RkYsIDB4RUYsIDB4RkIsIDB4REIsIDB4RjMsCisgICAgMHhGRiwgMHhERiwgMHhGRCwgMHg3RiwgCisgICAgMHhFRiwgMHhGQiwgMHhGRiwgMHhGRiwgMHhCRSwgMHhCRiwgMHgyNywgMHhCQSwgMHhGRSwgMHhGQiwgMHhERiwgMHhGRiwKKyAgICAweEY2LCAweEZGLCAweEZGLCAweEVGLCAKKyAgICAweEZCLCAweERCLCAweEYzLCAweEQ5LCAweDlBLCAweDNGLCAweEZGLCAweEFGLCAweEJGLCAweEZGLCAweEZGLCAweEJFLAorICAgIDB4M0YsIDB4MzcsIDB4QkQsIDB4OTYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUUsIDB4RkIsIDB4RjMsIDB4RjMsIDB4RUIsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGNywgMHhGQSwgMHhCQywgMHhBRSwgMHhGRSwgMHhCRSwgMHhGRSwgMHhCQiwgMHg3RiwgMHhGRCwgMHhGRiwKKyAgICAweDdGLCAweEVGLCAweEY3LCAweEZCLCAKKyAgICAweEJCLCAweEQ3LCAweEY3LCAweDdGLCAweEZGLCAweEY3LCAweEZGLCAweEZGLCAweEY3LCAweEJDLCAweEVELCAweEZELAorICAgIDB4QkQsIDB4OUQsIDB4N0QsIDB4N0IsIAorICAgIDB4RkIsIDB4N0IsIDB4N0IsIDB4RkIsIDB4QUYsIDB4RkYsIDB4RkUsIDB4RkQsIDB4RkQsIDB4RkUsIDB4RkUsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNywgCisgICAgMHhBQSwgMHhCOSwgMHhCRiwgMHg4RiwgMHhCRiwgMHhERiwgMHhGRiwgMHg3RiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhDRiwKKyAgICAweEZCLCAweEVCLCAweENCLCAweEVCLCAKKyAgICAweEVFLCAweEZGLCAweEZGLCAweEQ3LCAweEZGLCAweEZGLCAweEZGLCAweDNFLCAweDMzLCAweDNGLCAweDFDLCAweDdDLAorICAgIDB4RkMsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4Q0YsIDB4RDMsIDB4RjMsIDB4RTMsIDB4RjMsIDB4RkIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhFQiwgMHhGRSwgMHgzNSwgCisgICAgMHgzRiwgMHgzRCwgMHhGRCwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCRiwgMHhGRiwgMHhFRiwgMHg2RiwgMHhFMywKKyAgICAweEUzLCAweEUzLCAweEVGLCAweEZGLCAKKyAgICAweEZGLCAweERGLCAweEZGLCAweEZGLCAweEY3LCAweEZFLCAweDNFLCAweDVFLCAweEZFLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIAorICAgIDB4QUYsIDB4Q0YsIDB4RjIsIDB4Q0IsIDB4Q0YsIDB4OEUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkQsCisgICAgMHhGQywgMHgzRSwgMHgxRiwgMHg5RSwgCisgICAgMHhBRCwgMHhGRCwgMHhGRiwgMHhGRiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhCMywgMHhGNywgMHhFNywKKyAgICAweEY3LCAweEZBLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEVFLCAweEVCLCAweEFCLCAweEFGLCAweDlGLCAweEUzLCAweDdGLCAweEZGLCAweERFLAorICAgIDB4RkYsIDB4N0YsIDB4RUUsIDB4RkYsIAorICAgIDB4RkYsIDB4RkIsIDB4M0EsIDB4RkEsIDB4RkYsIDB4RjIsIDB4NzcsIDB4RkYsIDB4RkYsIDB4RjcsIDB4RkUsIDB4RkYsCisgICAgMHhGRSwgMHhCRCwgMHhBRSwgMHhERSwgCisgICAgMHg3RCwgMHg3RCwgMHhGRCwgMHhGRiwgMHhCRiwgMHhFRSwgMHhGRiwgMHhGRCwgMHhGRiwgMHhEQiwgMHhGQiwgMHhGRiwKKyAgICAweEY3LCAweEVGLCAweEZCLCAweEZGLCAKKyAgICAweEZGLCAweEZFLCAweEZGLCAweDJELCAweEFGLCAweEI5LCAweEZELCAweDc5LCAweEZCLCAweEZBLCAweEZGLCAweEJGLAorICAgIDB4RUYsIDB4RkYsIDB4RkYsIDB4OTEsIAorICAgIDB4RkEsIDB4RkIsIDB4REYsIDB4RjcsIDB4RjcsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkMsIDB4Q0YsIDB4MzcsIDB4QkYsCisgICAgMHhCRiwgMHhGRiwgMHg3RiwgMHg3RiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhBRiwgMHhGRiwgMHhGRiwgMHhGMywgMHhGQiwgMHhGQiwgMHhGRiwgMHhGNSwgMHhFRiwKKyAgICAweEZGLCAweEZGLCAweEY3LCAweEZBLCAKKyAgICAweEZGLCAweEZGLCAweEVFLCAweEZBLCAweEZFLCAweEZCLCAweDU1LCAweERELCAweEZGLCAweDdGLCAweEFGLCAweEZFLAorICAgIDB4RkYsIDB4RkIsIDB4RkIsIDB4RjUsIAorICAgIDB4RkYsIDB4RjcsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkUsIDB4QkQsIDB4QkQsIDB4QkQsIDB4QkQsIDB4N0QsCisgICAgMHg3QiwgMHg3QiwgMHg3QiwgMHg3QiwgCisgICAgMHhGQiwgMHhBRSwgMHhGRiwgMHhGRCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEY3LCAweERBLCAweEI3LCAweDYxLCAKKyAgICAweEZGLCAweEI5LCAweDU5LCAweEYzLCAweDczLCAweEYzLCAweERGLCAweDdGLCAweDZGLCAweERGLCAweEVGLCAweEY3LAorICAgIDB4RUIsIDB4RUIsIDB4RDcsIDB4RkYsIAorICAgIDB4RDcsIDB4RkYsIDB4RkYsIDB4RjcsIDB4RkUsIDB4N0YsIDB4RkIsIDB4M0UsIDB4MzgsIDB4NzMsIDB4RjYsIDB4N0YsCisgICAgMHhGQywgMHhGRiwgMHhGRiwgMHhDRiwgCisgICAgMHhGRiwgMHhCNywgMHhGQiwgMHhCMywgMHhCMywgMHg2NywgMHhGRiwgMHhFNywgMHhGRCwgMHhGRiwgMHhFRiwgMHhGNiwKKyAgICAweDdGLCAweEI3LCAweEJDLCAweEY1LCAKKyAgICAweDdCLCAweEY2LCAweEY3LCAweEY1LCAweEZGLCAweEZGLCAweEVGLCAweEZGLCAweEY3LCAweEZGLCAweEY3LCAweENFLAorICAgIDB4RTcsIDB4RkYsIDB4OUYsIDB4RkYsIAorICAgIDB4RkYsIDB4RjUsIDB4RkUsIDB4N0QsIDB4RkYsIDB4NUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhFRiwgMHhGRiwgMHhGNiwgCisgICAgMHhDQiwgMHhEQiwgMHhFRSwgMHhGRSwgMHhGRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgMHg3RiwgMHhCRSwKKyAgICAweDFFLCAweDNFLCAweEZFLCAweEZGLCAKKyAgICAweDdELCAweEZFLCAweEZGLCAweEZGLCAweEVGLCAweEJGLCAweEU3LCAweEZGLCAweEUzLCAweEUzLCAweEZGLCAweERGLAorICAgIDB4RTcsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4QjgsIDB4RUYsIDB4QjcsIDB4MkYsIDB4RUUsIDB4RkYsIDB4REYsIDB4RkYsIDB4QkYsIDB4RkYsIDB4N0YsIDB4RUYsCisgICAgMHhFQiwgMHhCRiwgMHhBMywgMHhEMywgCisgICAgMHhGRiwgMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNywgMHhCRSwgMHhGRCwgMHgzRiwgMHhDRiwgMHhGRCwKKyAgICAweEZCLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEFGLCAweEZCLCAweEJGLCAweEJCLCAweEJGLCAweERCLCAweEZELCAweEZCLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4M0UsIDB4RkUsIAorICAgIDB4M0YsIDB4QkEsIDB4QkEsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RUYsIDB4QzMsIDB4N0YsCisgICAgMHhCMiwgMHg5QiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHgzQywgMHhGRiwgMHgzRiwgMHgzQywgMHhGRiwgMHhGRSwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEFGLCAweEYzLCAweEZFLCAweEYzLCAweEUzLCAweEVCLCAweEZGLCAweEZGLCAweEZGLCAweEZCLCAweEZGLCAweEY3LAorICAgIDB4OUEsIDB4RkUsIDB4QUYsIDB4OUUsIAorICAgIDB4QkUsIDB4RkUsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsIDB4N0IsIDB4RUYsIDB4RjcsIDB4QkYsIDB4RkIsIDB4RkIsCisgICAgMHhGQiwgMHhGRiwgMHhGRiwgMHg3RiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhCQywgMHhCRCwgMHhGRCwgMHhCRCwgMHhERCwgMHg3RCwgMHg3QiwgMHg3QiwgMHg3QiwKKyAgICAweDdCLCAweEZCLCAweEFFLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZFLCAweEZFLCAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEY3LCAweDlBLCAweEZGLAorICAgIDB4OUYsIDB4RkYsIDB4QUYsIDB4RUYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsIDB4Q0YsIDB4RjMsIDB4RkYsIDB4RUIsIDB4RkYsIDB4RUIsIDB4RkYsCisgICAgMHhGRiwgMHhCRiwgMHhGRiwgMHhGRiwgCisgICAgMHhFRiwgMHhGRSwgMHhGRiwgMHgzNywgMHhGQywgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweENGLCAweEVGLCAweEZELCAweEYzLCAKKyAgICAweEZGLCAweEVFLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDZFLCAweEZELCAweDJGLCAweEZELAorICAgIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4Q0YsIDB4RkYsIDB4RjMsIDB4QkYsIDB4NjksIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRSwgCisgICAgMHhGQiwgMHg5RiwgMHhGRiwgMHhCRiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHg4NywKKyAgICAweEZFLCAweERBLCAweEVGLCAweENGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEVGLCAweEJGLCAweEVGLCAweEVGLCAweEZELAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RUYsIDB4RkQsIDB4RkYsIDB4N0IsIDB4RkYsIDB4RUIsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhFQiwgMHhGOCwgMHhGRiwgMHhFRiwgCisgICAgMHhBRiwgMHhGRiwgMHhGRiwgMHhCRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhFRSwgMHg3RiwgMHhFRiwgMHhGRiwKKyAgICAweEJCLCAweEZGLCAweEJGLCAweEZCLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEY3LCAweEY2LCAweEZCLCAweEJELCAweEZELCAweERELCAweEY1LCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUYsIAorICAgIDB4RkYsIDB4NUYsIDB4RjUsIDB4REYsIDB4RkYsIDB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjYsCisgICAgMHhGMywgMHhGRiwgMHhERSwgMHhGRSwgCisgICAgMHhFRiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhERSwgMHhERiwgMHg1RiwgMHhERiwKKyAgICAweEZELCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweEZGLCAweEZFLCAweEZFLCAweEZGLCAweEZELCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4QUYsIDB4RkYsIDB4RkYsIAorICAgIDB4RUYsIDB4RUQsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkIsIDB4RkYsIDB4RkYsIDB4REEsIDB4QkQsIDB4QkUsCisgICAgMHhBRSwgMHhGRSwgMHg3RiwgMHhGRCwgCisgICAgMHhERiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhFRiwgMHhGRiwgMHhGQiwgMHhGQiwgMHhGQiwgMHg3RiwgMHhGNywgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEY3LCAKKyAgICAweEJDLCAweEZELCAweEJELCAweEJELCAweEJELCAweEZELCAweDdCLCAweDdCLCAweDdCLCAweDdCLCAweEZCLCAweEFFLAorICAgIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkEsIDB4OUYsIDB4QkYsIDB4QkYsIDB4Q0YsCisgICAgMHg3RiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhBRiwgMHhGRiwgMHhFQiwgMHhFQiwgMHhFQiwgMHhGRiwgMHhENywgMHhGRSwgMHhGRiwgMHhGRiwKKyAgICAweEJGLCAweEU3LCAweEZFLCAweEJGLCAKKyAgICAweDdGLCAweEZDLCAweEZGLCAweEZGLCAweEVELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDRGLCAweEZGLCAweEZCLAorICAgIDB4RkIsIDB4RkYsIDB4RkYsIDB4REQsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4QkQsIDB4REYsIDB4OUQsIDB4RkQsIDB4REYsIDB4QjksCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhFRiwgMHhGRiwgMHhGQiwgMHhFRiwgMHhFQiwgMHhGRiwgMHhERSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEY2LCAweDlGLCAweEZGLCAweEZDLCAKKyAgICAweEZFLCAweEZCLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweERGLCAweEZBLCAweENELCAweENGLAorICAgIDB4QkYsIDB4OUYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RjcsIDB4RkUsIDB4QkYsIDB4RkYsIDB4REYsIDB4RUYsIDB4NUYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHg3RiwgMHg2RiwgMHhGRiwgCisgICAgMHhCQiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3RSwgMHhGRiwKKyAgICAweDVGLCAweEZGLCAweEJGLCAweEJGLCAKKyAgICAweEY5LCAweEZGLCAweEZGLCAweEZGLCAweDdGLCAweDZFLCAweDdCLCAweEZGLCAweEVGLCAweEZELCAweEVCLCAweERGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RjcsIDB4QjYsIDB4M0UsIDB4RkMsIDB4RkQsIDB4QkYsIDB4N0UsIDB4RkIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjcsCisgICAgMHhFRiwgMHhGNywgMHhGMywgMHhGNywgCisgICAgMHhGRiwgMHhGQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg2RSwgMHgzNSwgMHg3OSwgMHhGRiwKKyAgICAweEJGLCAweEZDLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEZCLCAweDUzLCAweERGLCAweEZGLCAweEVCLCAweEJGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkMsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUYsIDB4RjUsCisgICAgMHhGRiwgMHhGNywgMHhGRiwgMHhGQiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCQSwgMHhBQSwgMHhFRSwgMHhGRSwgMHgzRiwgMHg3RCwKKyAgICAweEZELCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweDdGLCAweEFGLCAweDc3LCAweEZCLCAweEZCLCAweEZGLCAweEZCLCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RjcsIDB4QkUsIDB4QkQsIDB4QkQsIAorICAgIDB4QkQsIDB4QkQsIDB4RkQsIDB4N0IsIDB4N0IsIDB4N0IsIDB4N0IsIDB4RkIsIDB4QUUsIDB4RkYsIDB4RUYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg5QSwgMHhEOSwgMHhCOCwgMHhGRiwgMHhGRiwgMHg3OSwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweENGLCAKKyAgICAweEZCLCAweEZGLCAweEVCLCAweEZGLCAweEVCLCAweEQ3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEU3LCAweERFLAorICAgIDB4RjgsIDB4RkIsIDB4RkUsIDB4M0YsIAorICAgIDB4RkIsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4QUQsIDB4QkYsIDB4RkEsIDB4RkYsIDB4NzMsCisgICAgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHgzQSwgMHhGNSwgMHhCNywgMHhGQywgMHgzRiwgMHhGOSwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweDdGLCAweEVGLCAweEYzLCAweEZGLCAKKyAgICAweEJGLCAweEZFLCAweEYzLCAweDlGLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEY3LCAweDNFLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4QkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QUYsIDB4RDMsIDB4RkUsIDB4REIsIDB4RkYsIDB4REIsIDB4REYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHgzRSwgMHhGRiwgMHhCRiwgMHhGRiwgMHg3RiwgMHhGRiwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4RiwKKyAgICAweEYzLCAweEZGLCAweEVELCAweEZGLCAKKyAgICAweEY3LCAweEZCLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEY2LCAweDNDLCAweEZFLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4OUYsIDB4RUYsIDB4RUYsIDB4RDEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHg3RSwgMHhCRiwgCisgICAgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCQiwgMHhFRiwgMHhERiwgMHhGMSwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVFLCAweDNFLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIAorICAgIDB4RUYsIDB4RkQsIDB4QzMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4QkYsIDB4RkYsCisgICAgMHhGQywgMHgzRSwgMHhGRSwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyRSwgMHhFRiwgMHhGMywgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEY3LCAweEJBLCAweEJFLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4N0YsIDB4QUYsIDB4RkIsIAorICAgIDB4RkIsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjIsIDB4RDYsIDB4RUQsCisgICAgMHhCRCwgMHhCRCwgMHhCRCwgMHg3RCwgCisgICAgMHg3QiwgMHg3QiwgMHg3QiwgMHg3QiwgMHhGQiwgMHhBRiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweDkyLCAweEJGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDdGLAorICAgIDB4QUYsIDB4RUIsIDB4RUIsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RTcsIDB4RkUsIDB4MkUsIDB4RkUsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHg0RiwgMHhFRiwgMHhGMywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZFLCAKKyAgICAweDNDLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweENFLAorICAgIDB4QzMsIDB4RkQsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4NUQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhFRiwgMHhDRiwgMHhFQiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEY3LCAweEVFLCAweDNFLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDdGLCAweEVGLCAweERGLCAweEUyLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkIsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjYsIDB4QkUsIDB4RkMsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHg3RiwgMHhFRSwgCisgICAgMHg1RiwgMHhFNiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzRSwKKyAgICAweDdELCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEYzLCAweEZCLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4QkYsIDB4RjcsIDB4MzYsIDB4QkUsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhFRiwgMHhEMywgMHhGNiwgCisgICAgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQywgMHg3RiwgMHhFRSwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEFGLCAweEVGLCAweEVCLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4QkEsIDB4QkUsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUUsCisgICAgMHhGQiwgMHhGQSwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNywgMHhENiwgMHhGRCwgMHhCRCwgMHhCRCwgMHhCRCwKKyAgICAweDdELCAweDdCLCAweDdCLCAweDdCLCAKKyAgICAweDdCLCAweEZCLCAweEFFLCAweEZGLCAweDdFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RjcsIDB4QkEsIDB4QkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsIDB4RUYsIDB4RUIsIDB4NkIsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNywgMHhGRSwgMHhCRSwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweDRGLCAweEVGLCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLAorICAgIDB4M0UsIDB4NkUsIDB4RkMsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4QzMsIDB4QzksIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHgzRSwgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEVGLCAweEZCLCAKKyAgICAweEQ1LCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEZFLAorICAgIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NkYsIDB4RUYsIDB4RkIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkIsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGNiwgMHhERiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhGRSwKKyAgICAweEVGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEU3LCAweEZGLCAweEZFLCAweEZGLCAweEY3LCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4N0YsIDB4RkEsIDB4RUYsIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhFNywgMHhGRiwgMHhGRSwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhGRSwgMHhFRiwgMHhCRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEE3LCAweEZGLCAweEZDLCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsIAorICAgIDB4RkUsIDB4QUUsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RTcsCisgICAgMHhGNywgMHhGQSwgMHhGRiwgMHhGRCwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3RiwgMHhBRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEY3LCAweEJFLCAweEJELCAweEJELCAweEJELCAweEJELCAweDdELCAweDdCLCAweDdCLAorICAgIDB4N0IsIDB4N0IsIDB4RkIsIDB4QUYsIAorICAgIDB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0EsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg3RiwgMHg2RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEU3LCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4Q0YsIDB4RkUsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4REYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjcsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGQiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEU3LCAweEYyLCAweEZDLCAKKyAgICAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDdGLCAweEFFLCAweEVGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RjcsIDB4N0UsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhFRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCRiwgMHhGRiwKKyAgICAweEZFLCAweEZFLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweERGLCAweEVGLCAweERELCAweEZFLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhBRiwgMHhFRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCQSwgMHhGRSwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEVGLCAweEZBLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RjYsIDB4OUMsIDB4QkQsIDB4QkQsIDB4QkQsIDB4QkQsIDB4N0QsIDB4N0IsIDB4N0IsIDB4N0IsIDB4N0IsIDB4RkIsCisgICAgMHhBRSwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGNywgMHg3QSwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweERGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweDZGLCAweEVGLCAweEY3LCAweEZGLCAweEZGLCAweEZGLCAweERGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RjcsIDB4RkUsIAorICAgIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4REYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4RUIsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHg5RSwgMHhGQywgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEVGLCAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkUsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsIDB4RUYsIDB4Q0IsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRCwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhCRSwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEVGLCAKKyAgICAweEVGLCAweEZGLCAweEZGLCAweEZGLCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY4LAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4QkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZCLCAweEFGLCAweDdGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweERGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEVGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhCRiwgMHhGRiwgCisgICAgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhBRSwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY3LCAweEZBLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4N0YsIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGNywgMHhCQywgMHhCRCwgCisgICAgMHhCRCwgMHhCRCwgMHhCRCwgMHg3RCwgMHg3QiwgMHg3QiwgMHg3QiwgMHg3QiwgMHhGQiwgMHhBRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEY3LCAweEZBLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4N0YsIAorICAgIDB4QUYsIDB4N0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsCisgICAgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhDRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZCLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEJGLCAweEZGLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZDLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIAorICAgIDB4RkYsIDB4RkYsIDB4RkIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RUYsIDB4RkUsIDB4RkYsIDB4OUYsIDB4OUYsCisgICAgMHg5RiwgMHgzRiwgMHgzRiwgMHgzRiwgCisgICAgMHgzRiwgMHgzRiwgMHhGRiwgMHhFRiwgMHhERiwgMHhERiwgMHhERiwgMHhERiwgMHhDRiwgMHhCNywgMHhCRiwgMHhCRiwKKyAgICAweEJGLCAweEJGLCAweEZGLCAweEJDLCAKKyAgICAweEI5LCAweDlELCAweEJELCAweEJELCAweDdELCAweDdCLCAweDdCLCAweDdCLCAweDdCLCAweEZCLCAweEVGLCAweEQ3LAorICAgIDB4RjUsIDB4RjMsIDB4RjEsIDB4RDEsIAorICAgIDB4NjUsIDB4RTMsIDB4RTMsIDB4RTMsIDB4QTMsIDB4RkYsIDB4RkUsIDB4N0YsIDB4RkUsIDB4REUsIDB4REUsIDB4RkYsCisgICAgMHhCRCwgMHhCRCwgMHhCRCwgMHhCRCwgCisgICAgMHhERiwgMHhFRiwgMHhGQiwgMHhGNywgMHhGMywgMHhGMywgMHhGMywgMHhFNywgMHhFNywgMHhFNywgMHhFNywgMHhFNywKKyAgICAweEZCLCAweEZFLCAweEZGLCAweEZGLCAKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGCisgICAgCisgICAgfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9wY25ldF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL3BjbmV0X2NzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxMjYzMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9wY25ldF9jcy5jCkBAIC0wLDAgKzEsMTY1OSBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBBIFBDTUNJQSBldGhlcm5ldCBkcml2ZXIgZm9yIE5TODM5MC1iYXNlZCBjYXJkcworCisgICAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIEQtTGluayBERS02NTAgYW5kIExpbmtzeXMgRXRoZXJuZXRDYXJkCisgICAgY2FyZHMsIHRoZSBuZXdlciBELUxpbmsgYW5kIExpbmtzeXMgY29tYm8gY2FyZHMsIEFjY3RvbiBFTjIyMTIKKyAgICBjYXJkcywgdGhlIFJQVEkgRVA0MDAsIGFuZCB0aGUgUHJlTWF4IFBFLTIwMCBpbiBub24tc2hhcmVkLW1lbW9yeQorICAgIG1vZGUsIGFuZCB0aGUgSUJNIENyZWRpdCBDYXJkIEFkYXB0ZXIsIHRoZSBORTQxMDAsIHRoZSBUaG9tYXMKKyAgICBDb25yYWQgZXRoZXJuZXQgY2FyZCwgYW5kIHRoZSBLaW5nc3RvbiBLTkUtUENNL3ggaW4gc2hhcmVkLW1lbW9yeQorICAgIG1vZGUuICBJdCB3aWxsIGFsc28gaGFuZGxlIHRoZSBTb2NrZXQgRUEgY2FyZCBpbiBlaXRoZXIgbW9kZS4KKworICAgIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBBLiBIaW5kcyAtLSBkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorCisgICAgcGNuZXRfY3MuYyAxLjE1MyAyMDAzLzExLzA5IDE4OjUzOjA5CisgICAgCisgICAgVGhlIG5ldHdvcmsgZHJpdmVyIGNvZGUgaXMgYmFzZWQgb24gRG9uYWxkIEJlY2tlcidzIE5FMjAwMCBjb2RlOgorCisgICAgV3JpdHRlbiAxOTkyLDE5OTMgYnkgRG9uYWxkIEJlY2tlci4KKyAgICBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgICAgRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4gIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kCisgICAgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgICAgRG9uYWxkIEJlY2tlciBtYXkgYmUgcmVhY2hlZCBhdCBiZWNrZXJAc2N5bGQuY29tCisKKyAgICBCYXNlZCBhbHNvIG9uIEtlaXRoIE1vb3JlJ3MgY2hhbmdlcyB0byBEb24gQmVja2VyJ3MgY29kZSwgZm9yIElCTQorICAgIENDQUUgc3VwcG9ydC4gIERyaXZlcnMgbWVyZ2VkIGJhY2sgdG9nZXRoZXIsIGFuZCBzaGFyZWQtbWVtb3J5CisgICAgU29ja2V0IEVBIHN1cHBvcnQgYWRkZWQsIGJ5IEtlbiBSYWVidXJuLCBTZXB0ZW1iZXIgMTk5NS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8Li4vZHJpdmVycy9uZXQvODM5MC5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgUENORVRfQ01ECTB4MDAKKyNkZWZpbmUgUENORVRfREFUQVBPUlQJMHgxMAkvKiBOYXRTZW1pLWRlZmluZWQgcG9ydCB3aW5kb3cgb2Zmc2V0LiAqLworI2RlZmluZSBQQ05FVF9SRVNFVAkweDFmCS8qIElzc3VlIGEgcmVhZCB0byByZXNldCwgYSB3cml0ZSB0byBjbGVhci4gKi8KKyNkZWZpbmUgUENORVRfTUlTQwkweDE4CS8qIEZvciBJQk0gQ0NBRSBhbmQgU29ja2V0IEVBIGNhcmRzICovCisKKyNkZWZpbmUgUENORVRfU1RBUlRfUEcJMHg0MAkvKiBGaXJzdCBwYWdlIG9mIFRYIGJ1ZmZlciAqLworI2RlZmluZSBQQ05FVF9TVE9QX1BHCTB4ODAJLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcgKi8KKworLyogU29ja2V0IEVBIGNhcmRzIGhhdmUgYSBsYXJnZXIgcGFja2V0IGJ1ZmZlciAqLworI2RlZmluZSBTT0NLRVRfU1RBUlRfUEcJMHgwMQorI2RlZmluZSBTT0NLRVRfU1RPUF9QRwkweGZmCisKKyNkZWZpbmUgUENORVRfUkRDX1RJTUVPVVQgKDIqSFovMTAwKQkvKiBNYXggd2FpdCBpbiBqaWZmaWVzIGZvciBUeCBSREMgKi8KKworc3RhdGljIGNoYXIgKmlmX25hbWVzW10gPSB7ICJhdXRvIiwgIjEwYmFzZVQiLCAiMTBiYXNlMiJ9OworCisjaWZkZWYgUENNQ0lBX0RFQlVHCitzdGF0aWMgaW50IHBjX2RlYnVnID0gUENNQ0lBX0RFQlVHOworbW9kdWxlX3BhcmFtKHBjX2RlYnVnLCBpbnQsIDApOworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBpZiAocGNfZGVidWc+KG4pKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKQorc3RhdGljIGNoYXIgKnZlcnNpb24gPQorInBjbmV0X2NzLmMgMS4xNTMgMjAwMy8xMS8wOSAxODo1MzowOSAoRGF2aWQgSGluZHMpIjsKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCisKK01PRFVMRV9BVVRIT1IoIkRhdmlkIEhpbmRzIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTkUyMDAwIGNvbXBhdGlibGUgUENNQ0lBIGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIElOVF9NT0RVTEVfUEFSTShuLCB2KSBzdGF0aWMgaW50IG4gPSB2OyBtb2R1bGVfcGFyYW0obiwgaW50LCAwKQorCitJTlRfTU9EVUxFX1BBUk0oaWZfcG9ydCwJMSk7CS8qIFRyYW5zY2VpdmVyIHR5cGUgKi8KK0lOVF9NT0RVTEVfUEFSTSh1c2VfYmlnX2J1ZiwJMSk7CS8qIHVzZSA2NEsgcGFja2V0IGJ1ZmZlcj8gKi8KK0lOVF9NT0RVTEVfUEFSTShtZW1fc3BlZWQsCTApOwkvKiBzaGFyZWQgbWVtIHNwZWVkLCBpbiBucyAqLworSU5UX01PRFVMRV9QQVJNKGRlbGF5X291dHB1dCwJMCk7CS8qIHBhdXNlIGFmdGVyIHhtaXQ/ICovCitJTlRfTU9EVUxFX1BBUk0oZGVsYXlfdGltZSwJNCk7CS8qIGluIHVzZWMgKi8KK0lOVF9NT0RVTEVfUEFSTSh1c2Vfc2htZW0sCS0xKTsJLyogdXNlIHNoYXJlZCBtZW1vcnk/ICovCitJTlRfTU9EVUxFX1BBUk0oZnVsbF9kdXBsZXgsCTApOwkvKiBmdWxsIGR1cGxleD8gKi8KKworLyogVWdoISAgTGV0IHRoZSB1c2VyIGhhcmR3aXJlIHRoZSBoYXJkd2FyZSBhZGRyZXNzIGZvciBxdWVlciBjYXJkcyAqLworc3RhdGljIGludCBod19hZGRyWzZdID0geyAwLCAvKiAuLi4gKi8gfTsKK21vZHVsZV9wYXJhbV9hcnJheShod19hZGRyLCBpbnQsIE5VTEwsIDApOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgbWlpX3BoeV9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHBjbmV0X2NvbmZpZyhkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyB2b2lkIHBjbmV0X3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgaW50IHBjbmV0X2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJICAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CitzdGF0aWMgaW50IHBjbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHBjbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBlaV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOworc3RhdGljIGlycXJldHVybl90IGVpX2lycV93cmFwcGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgZWlfd2F0Y2hkb2codV9sb25nIGFyZyk7CitzdGF0aWMgdm9pZCBwY25ldF9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzZXRfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKTsKK3N0YXRpYyBpbnQgc2V0dXBfc2htZW1fd2luZG93KGRldl9saW5rX3QgKmxpbmssIGludCBzdGFydF9wZywKKwkJCSAgICAgIGludCBzdG9wX3BnLCBpbnQgY21fb2Zmc2V0KTsKK3N0YXRpYyBpbnQgc2V0dXBfZG1hX2NvbmZpZyhkZXZfbGlua190ICpsaW5rLCBpbnQgc3RhcnRfcGcsCisJCQkgICAgaW50IHN0b3BfcGcpOworCitzdGF0aWMgZGV2X2xpbmtfdCAqcGNuZXRfYXR0YWNoKHZvaWQpOworc3RhdGljIHZvaWQgcGNuZXRfZGV0YWNoKGRldl9saW5rX3QgKik7CisKK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvID0gInBjbmV0X2NzIjsKK3N0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdDsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3R5cGVkZWYgc3RydWN0IGh3X2luZm9fdCB7CisgICAgdV9pbnQJb2Zmc2V0OworICAgIHVfY2hhcglhMCwgYTEsIGEyOworICAgIHVfaW50CWZsYWdzOworfSBod19pbmZvX3Q7CisKKyNkZWZpbmUgREVMQVlfT1VUUFVUCTB4MDEKKyNkZWZpbmUgSEFTX01JU0NfUkVHCTB4MDIKKyNkZWZpbmUgVVNFX0JJR19CVUYJMHgwNAorI2RlZmluZSBIQVNfSUJNX01JU0MJMHgwOAorI2RlZmluZSBJU19ETDEwMDE5CTB4MTAKKyNkZWZpbmUgSVNfREwxMDAyMgkweDIwCisjZGVmaW5lIEhBU19NSUkJCTB4NDAKKyNkZWZpbmUgVVNFX1NITUVNCTB4ODAJLyogYXV0b2RldGVjdGVkICovCisKKyNkZWZpbmUgQU03OUM5WFhfSE9NRV9QSFkJMHgwMDAwNkI5MCAgLyogSG9tZVBOQSBQSFkgKi8KKyNkZWZpbmUgQU03OUM5WFhfRVRIX1BIWQkweDAwMDA2QjcwICAvKiAxMGJhc2VUIFBIWSAqLworI2RlZmluZSBNSUlfUEhZSURfUkVWX01BU0sJMHhmZmZmZmZmMAorI2RlZmluZSBNSUlfUEhZSURfUkVHMQkJMHgwMgorI2RlZmluZSBNSUlfUEhZSURfUkVHMgkJMHgwMworCitzdGF0aWMgaHdfaW5mb190IGh3X2luZm9bXSA9IHsKKyAgICB7IC8qIEFjY3RvbiBFTjIyMTIgKi8gMHgwZmYwLCAweDAwLCAweDAwLCAweGU4LCBERUxBWV9PVVRQVVQgfSwgCisgICAgeyAvKiBBbGxpZWQgVGVsZXNpcyBMQS1QQ00gKi8gMHgwZmYwLCAweDAwLCAweDAwLCAweGY0LCAwIH0sCisgICAgeyAvKiBBUEVYIE11bHRpQ2FyZCAqLyAweDAzZjQsIDB4MDAsIDB4MjAsIDB4ZTUsIDAgfSwKKyAgICB7IC8qIEFTQU5URSBGcmllbmRseU5ldCAqLyAweDQ5MTAsIDB4MDAsIDB4MDAsIDB4OTQsCisgICAgICBERUxBWV9PVVRQVVQgfCBIQVNfSUJNX01JU0MgfSwKKyAgICB7IC8qIERhbnBleCBFTi02MjAwUDIgKi8gMHgwMTEwLCAweDAwLCAweDQwLCAweGM3LCAwIH0sCisgICAgeyAvKiBEYXRhVHJlayBOZXRDYXJkICovIDB4MGZmMCwgMHgwMCwgMHgyMCwgMHhlOCwgMCB9LAorICAgIHsgLyogRGF5bmEgQ29tbXVuaUNhcmQgRSAqLyAweDAxMTAsIDB4MDAsIDB4ODAsIDB4MTksIDAgfSwKKyAgICB7IC8qIEQtTGluayBERS02NTAgKi8gMHgwMDQwLCAweDAwLCAweDgwLCAweGM4LCAwIH0sCisgICAgeyAvKiBFUC0yMTAgRXRoZXJuZXQgKi8gMHgwMTEwLCAweDAwLCAweDQwLCAweDMzLCAwIH0sCisgICAgeyAvKiBFUDQwMDAgRXRoZXJuZXQgKi8gMHgwMWMwLCAweDAwLCAweDAwLCAweGI0LCAwIH0sCisgICAgeyAvKiBFcHNvbiBFRU4xMEIgKi8gMHgwZmYwLCAweDAwLCAweDAwLCAweDQ4LAorICAgICAgSEFTX01JU0NfUkVHIHwgSEFTX0lCTV9NSVNDIH0sCisgICAgeyAvKiBFTEVDT00gTGFuZWVkIExELUNEV0EgKi8gMHhiOCwgMHgwOCwgMHgwMCwgMHg0MiwgMCB9LAorICAgIHsgLyogSHlwZXJ0ZWMgRXRoZXJuZXQgKi8gMHgwMWMwLCAweDAwLCAweDQwLCAweDRjLCAwIH0sCisgICAgeyAvKiBJQk0gQ0NBRSAqLyAweDBmZjAsIDB4MDgsIDB4MDAsIDB4NWEsCisgICAgICBIQVNfTUlTQ19SRUcgfCBIQVNfSUJNX01JU0MgfSwKKyAgICB7IC8qIElCTSBDQ0FFICovIDB4MGZmMCwgMHgwMCwgMHgwNCwgMHhhYywKKyAgICAgIEhBU19NSVNDX1JFRyB8IEhBU19JQk1fTUlTQyB9LAorICAgIHsgLyogSUJNIENDQUUgKi8gMHgwZmYwLCAweDAwLCAweDA2LCAweDI5LAorICAgICAgSEFTX01JU0NfUkVHIHwgSEFTX0lCTV9NSVNDIH0sCisgICAgeyAvKiBJQk0gRk1FICovIDB4MDM3NCwgMHgwOCwgMHgwMCwgMHg1YSwKKyAgICAgIEhBU19NSVNDX1JFRyB8IEhBU19JQk1fTUlTQyB9LAorICAgIHsgLyogSUJNIEZNRSAqLyAweDAzNzQsIDB4MDAsIDB4MDQsIDB4YWMsCisgICAgICBIQVNfTUlTQ19SRUcgfCBIQVNfSUJNX01JU0MgfSwKKyAgICB7IC8qIEthbnNhaSBLTEEtUENNL1QgKi8gMHgwZmYwLCAweDAwLCAweDYwLCAweDg3LAorICAgICAgSEFTX01JU0NfUkVHIHwgSEFTX0lCTV9NSVNDIH0sCisgICAgeyAvKiBOU0MgRFA4MzkwMyAqLyAweDAzNzQsIDB4MDgsIDB4MDAsIDB4MTcsCisgICAgICBIQVNfTUlTQ19SRUcgfCBIQVNfSUJNX01JU0MgfSwKKyAgICB7IC8qIE5TQyBEUDgzOTAzICovIDB4MDM3NCwgMHgwMCwgMHhjMCwgMHhhOCwKKyAgICAgIEhBU19NSVNDX1JFRyB8IEhBU19JQk1fTUlTQyB9LAorICAgIHsgLyogTlNDIERQODM5MDMgKi8gMHgwMzc0LCAweDAwLCAweGEwLCAweGIwLAorICAgICAgSEFTX01JU0NfUkVHIHwgSEFTX0lCTV9NSVNDIH0sCisgICAgeyAvKiBOU0MgRFA4MzkwMyAqLyAweDAxOTgsIDB4MDAsIDB4MjAsIDB4ZTAsCisgICAgICBIQVNfTUlTQ19SRUcgfCBIQVNfSUJNX01JU0MgfSwKKyAgICB7IC8qIEktTyBEQVRBIFBDTEEvVCAqLyAweDBmZjAsIDB4MDAsIDB4YTAsIDB4YjAsIDAgfSwKKyAgICB7IC8qIEthdHJvbiBQRS01MjAgKi8gMHgwMTEwLCAweDAwLCAweDQwLCAweGY2LCAwIH0sCisgICAgeyAvKiBLaW5nc3RvbiBLTkUtUENNL3ggKi8gMHgwZmYwLCAweDAwLCAweGMwLCAweGYwLAorICAgICAgSEFTX01JU0NfUkVHIHwgSEFTX0lCTV9NSVNDIH0sCisgICAgeyAvKiBLaW5nc3RvbiBLTkUtUENNL3ggKi8gMHgwZmYwLCAweGUyLCAweDBjLCAweDBmLAorICAgICAgSEFTX01JU0NfUkVHIHwgSEFTX0lCTV9NSVNDIH0sCisgICAgeyAvKiBLaW5nc3RvbiBLTkUtUEMyICovIDB4MDE4MCwgMHgwMCwgMHhjMCwgMHhmMCwgMCB9LAorICAgIHsgLyogTWF4dGVjaCBQQ04yMDAwICovIDB4NTAwMCwgMHgwMCwgMHgwMCwgMHhlOCwgMCB9LAorICAgIHsgLyogTkRDIEluc3RhbnQtTGluayAqLyAweDAwM2EsIDB4MDAsIDB4ODAsIDB4YzYsIDAgfSwKKyAgICB7IC8qIE5FMjAwMCBDb21wYXRpYmxlICovIDB4MGZmMCwgMHgwMCwgMHhhMCwgMHgwYywgMCB9LAorICAgIHsgLyogTmV0d29yayBHZW5lcmFsIFNuaWZmZXIgKi8gMHgwZmYwLCAweDAwLCAweDAwLCAweDY1LAorICAgICAgSEFTX01JU0NfUkVHIHwgSEFTX0lCTV9NSVNDIH0sCisgICAgeyAvKiBQYW5hc29uaWMgVkVMMjExICovIDB4MGZmMCwgMHgwMCwgMHg4MCwgMHg0NSwgCisgICAgICBIQVNfTUlTQ19SRUcgfCBIQVNfSUJNX01JU0MgfSwKKyAgICB7IC8qIFByZU1heCBQRS0yMDAgKi8gMHgwN2YwLCAweDAwLCAweDIwLCAweGUwLCAwIH0sCisgICAgeyAvKiBSUFRJIEVQNDAwICovIDB4MDExMCwgMHgwMCwgMHg0MCwgMHg5NSwgMCB9LAorICAgIHsgLyogU0NNIEV0aGVybmV0ICovIDB4MGZmMCwgMHgwMCwgMHgyMCwgMHhjYiwgMCB9LAorICAgIHsgLyogU29ja2V0IEVBICovIDB4NDAwMCwgMHgwMCwgMHhjMCwgMHgxYiwKKyAgICAgIERFTEFZX09VVFBVVCB8IEhBU19NSVNDX1JFRyB8IFVTRV9CSUdfQlVGIH0sCisgICAgeyAvKiBTb2NrZXQgTFAtRSBDRisgKi8gMHgwMWMwLCAweDAwLCAweGMwLCAweDFiLCAwIH0sCisgICAgeyAvKiBTdXBlclNvY2tldCBSRTQ1MFQgKi8gMHgwMTEwLCAweDAwLCAweGUwLCAweDk4LCAwIH0sCisgICAgeyAvKiBWb2xrdGVrIE5QTC00MDJDVCAqLyAweDAwNjAsIDB4MDAsIDB4NDAsIDB4MDUsIDAgfSwKKyAgICB7IC8qIE5FQyBQQy05ODAxTi1KMTIgKi8gMHgwZmYwLCAweDAwLCAweDAwLCAweDRjLCAwIH0sCisgICAgeyAvKiBQQ01DSUEgVGVjaG5vbG9neSBPRU0gKi8gMHgwMWM4LCAweDAwLCAweGEwLCAweDBjLCAwIH0KK307CisKKyNkZWZpbmUgTlJfSU5GTwkJKHNpemVvZihod19pbmZvKS9zaXplb2YoaHdfaW5mb190KSkKKworc3RhdGljIGh3X2luZm9fdCBkZWZhdWx0X2luZm8gPSB7IDAsIDAsIDAsIDAsIDAgfTsKK3N0YXRpYyBod19pbmZvX3QgZGwxMDAxOV9pbmZvID0geyAwLCAwLCAwLCAwLCBJU19ETDEwMDE5fEhBU19NSUkgfTsKK3N0YXRpYyBod19pbmZvX3QgZGwxMDAyMl9pbmZvID0geyAwLCAwLCAwLCAwLCBJU19ETDEwMDIyfEhBU19NSUkgfTsKKwordHlwZWRlZiBzdHJ1Y3QgcGNuZXRfZGV2X3QgeworICAgIGRldl9saW5rX3QJCWxpbms7CisgICAgZGV2X25vZGVfdAkJbm9kZTsKKyAgICB1X2ludAkJZmxhZ3M7CisgICAgdm9pZAkJX19pb21lbSAqYmFzZTsKKyAgICBzdHJ1Y3QgdGltZXJfbGlzdAl3YXRjaGRvZzsKKyAgICBpbnQJCQlzdGFsZSwgZmFzdF9wb2xsOworICAgIHVfY2hhcgkJcGh5X2lkOworICAgIHVfY2hhcgkJZXRoX3BoeSwgcG5hX3BoeTsKKyAgICB1X3Nob3J0CQlsaW5rX3N0YXR1czsKKyAgICB1X2xvbmcJCW1paV9yZXNldDsKK30gcGNuZXRfZGV2X3Q7CisKK3N0YXRpYyBpbmxpbmUgcGNuZXRfZGV2X3QgKlBSSVYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwljaGFyICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gKHBjbmV0X2Rldl90ICopKHAgKyBzaXplb2Yoc3RydWN0IGVpX2RldmljZSkpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIHBjbmV0X2F0dGFjaCgpIGNyZWF0ZXMgYW4gImluc3RhbmNlIiBvZiB0aGUgZHJpdmVyLCBhbGxvY2F0aW5nCisgICAgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBvbmUgZGV2aWNlLiAgVGhlIGRldmljZSBpcyByZWdpc3RlcmVkCisgICAgd2l0aCBDYXJkIFNlcnZpY2VzLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGRldl9saW5rX3QgKnBjbmV0X2F0dGFjaCh2b2lkKQoreworICAgIHBjbmV0X2Rldl90ICppbmZvOworICAgIGRldl9saW5rX3QgKmxpbms7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBjbGllbnRfcmVnX3QgY2xpZW50X3JlZzsKKyAgICBpbnQgcmV0OworCisgICAgREVCVUcoMCwgInBjbmV0X2F0dGFjaCgpXG4iKTsKKworICAgIC8qIENyZWF0ZSBuZXcgZXRoZXJuZXQgZGV2aWNlICovCisgICAgZGV2ID0gX19hbGxvY19laV9uZXRkZXYoc2l6ZW9mKHBjbmV0X2Rldl90KSk7CisgICAgaWYgKCFkZXYpIHJldHVybiBOVUxMOworICAgIGluZm8gPSBQUklWKGRldik7CisgICAgbGluayA9ICZpbmZvLT5saW5rOworICAgIGxpbmstPnByaXYgPSBkZXY7CisKKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRTsKKyAgICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROworICAgIGxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworCisgICAgU0VUX01PRFVMRV9PV05FUihkZXYpOworICAgIGRldi0+b3BlbiA9ICZwY25ldF9vcGVuOworICAgIGRldi0+c3RvcCA9ICZwY25ldF9jbG9zZTsKKyAgICBkZXYtPnNldF9jb25maWcgPSAmc2V0X2NvbmZpZzsKKworICAgIC8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKKyAgICBkZXZfbGlzdCA9IGxpbms7CisgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKKyAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9CisJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKKyAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmcGNuZXRfZXZlbnQ7CisgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisgICAgaWYgKHJldCAhPSBDU19TVUNDRVNTKSB7CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwlwY25ldF9kZXRhY2gobGluayk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGxpbms7Cit9IC8qIHBjbmV0X2F0dGFjaCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkCisgICAgd2l0aCBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCisgICAgc3RydWN0dXJlcyBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQKKyAgICB3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBwY25ldF9kZXRhY2goZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBkZXZfbGlua190ICoqbGlua3A7CisKKyAgICBERUJVRygwLCAicGNuZXRfZGV0YWNoKDB4JXApXG4iLCBsaW5rKTsKKworICAgIC8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisgICAgZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkKKwlpZiAoKmxpbmtwID09IGxpbmspIGJyZWFrOworICAgIGlmICgqbGlua3AgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICBpZiAobGluay0+ZGV2KQorCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKyAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCXBjbmV0X3JlbGVhc2UobGluayk7CisKKyAgICBpZiAobGluay0+aGFuZGxlKQorCXBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworCisgICAgLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGZyZWUgYml0cyAqLworICAgICpsaW5rcCA9IGxpbmstPm5leHQ7CisgICAgZnJlZV9uZXRkZXYoZGV2KTsKK30gLyogcGNuZXRfZGV0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhpcyBwcm9iZXMgZm9yIGEgY2FyZCdzIGhhcmR3YXJlIGFkZHJlc3MsIGZvciBjYXJkIHR5cGVzIHRoYXQKKyAgICBlbmNvZGUgdGhpcyBpbmZvcm1hdGlvbiBpbiB0aGVpciBDSVMuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaHdfaW5mb190ICpnZXRfaHdpbmZvKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgd2luX3JlcV90IHJlcTsKKyAgICBtZW1yZXFfdCBtZW07CisgICAgdV9jaGFyIF9faW9tZW0gKmJhc2UsICp2aXJ0OworICAgIGludCBpLCBqOworCisgICAgLyogQWxsb2NhdGUgYSBzbWFsbCBtZW1vcnkgd2luZG93ICovCisgICAgcmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF84fFdJTl9NRU1PUllfVFlQRV9BTXxXSU5fRU5BQkxFOworICAgIHJlcS5CYXNlID0gMDsgcmVxLlNpemUgPSAwOworICAgIHJlcS5BY2Nlc3NTcGVlZCA9IDA7CisgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluay0+aGFuZGxlLCAmcmVxLCAmbGluay0+d2luKTsKKyAgICBpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0V2luZG93LCBpKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB2aXJ0ID0gaW9yZW1hcChyZXEuQmFzZSwgcmVxLlNpemUpOworICAgIG1lbS5QYWdlID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlJfSU5GTzsgaSsrKSB7CisJbWVtLkNhcmRPZmZzZXQgPSBod19pbmZvW2ldLm9mZnNldCAmIH4ocmVxLlNpemUtMSk7CisJcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLT53aW4sICZtZW0pOworCWJhc2UgPSAmdmlydFtod19pbmZvW2ldLm9mZnNldCAmIChyZXEuU2l6ZS0xKV07CisJaWYgKChyZWFkYihiYXNlKzApID09IGh3X2luZm9baV0uYTApICYmCisJICAgIChyZWFkYihiYXNlKzIpID09IGh3X2luZm9baV0uYTEpICYmCisJICAgIChyZWFkYihiYXNlKzQpID09IGh3X2luZm9baV0uYTIpKQorCSAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGkgPCBOUl9JTkZPKSB7CisJZm9yIChqID0gMDsgaiA8IDY7IGorKykKKwkgICAgZGV2LT5kZXZfYWRkcltqXSA9IHJlYWRiKGJhc2UgKyAoajw8MSkpOworICAgIH0KKyAgICAKKyAgICBpb3VubWFwKHZpcnQpOworICAgIGogPSBwY21jaWFfcmVsZWFzZV93aW5kb3cobGluay0+d2luKTsKKyAgICBpZiAoaiAhPSBDU19TVUNDRVNTKQorCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVsZWFzZVdpbmRvdywgaik7CisgICAgcmV0dXJuIChpIDwgTlJfSU5GTykgPyBod19pbmZvK2kgOiBOVUxMOworfSAvKiBnZXRfaHdpbmZvICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhpcyBwcm9iZXMgZm9yIGEgY2FyZCdzIGhhcmR3YXJlIGFkZHJlc3MgYnkgcmVhZGluZyB0aGUgUFJPTS4KKyAgICBJdCBjaGVja3MgdGhlIGFkZHJlc3MgYWdhaW5zdCBhIGxpc3Qgb2Yga25vd24gdHlwZXMsIHRoZW4gZmFsbHMKKyAgICBiYWNrIHRvIGEgc2ltcGxlIE5FMjAwMCBjbG9uZSBzaWduYXR1cmUgY2hlY2suCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaHdfaW5mb190ICpnZXRfcHJvbShkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdV9jaGFyIHByb21bMzJdOworICAgIGludCBpLCBqOworCisgICAgLyogVGhpcyBpcyBsaWZ0ZWQgc3RyYWlnaHQgZnJvbSBkcml2ZXJzL25ldC9uZS5jICovCisgICAgc3RydWN0IHsKKwl1X2NoYXIgdmFsdWUsIG9mZnNldDsKKyAgICB9IHByb2dyYW1fc2VxW10gPSB7CisJe0U4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIEU4MzkwX0NNRH0sIC8qIFNlbGVjdCBwYWdlIDAqLworCXsweDQ4LAlFTjBfRENGR30sCS8qIFNldCBieXRlLXdpZGUgKDB4NDgpIGFjY2Vzcy4gKi8KKwl7MHgwMCwJRU4wX1JDTlRMT30sCS8qIENsZWFyIHRoZSBjb3VudCByZWdzLiAqLworCXsweDAwLAlFTjBfUkNOVEhJfSwKKwl7MHgwMCwJRU4wX0lNUn0sCS8qIE1hc2sgY29tcGxldGlvbiBpcnEuICovCisJezB4RkYsCUVOMF9JU1J9LAorCXtFODM5MF9SWE9GRiwgRU4wX1JYQ1J9LAkvKiAweDIwICBTZXQgdG8gbW9uaXRvciAqLworCXtFODM5MF9UWE9GRiwgRU4wX1RYQ1J9LAkvKiAweDAyICBhbmQgbG9vcGJhY2sgbW9kZS4gKi8KKwl7MzIsCUVOMF9SQ05UTE99LAorCXsweDAwLAlFTjBfUkNOVEhJfSwKKwl7MHgwMCwJRU4wX1JTQVJMT30sCS8qIERNQSBzdGFydGluZyBhdCAweDAwMDAuICovCisJezB4MDAsCUVOMF9SU0FSSEl9LAorCXtFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgRTgzOTBfQ01EfSwKKyAgICB9OworCisgICAgcGNuZXRfcmVzZXRfODM5MChkZXYpOworICAgIG1kZWxheSgxMCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHByb2dyYW1fc2VxKS9zaXplb2YocHJvZ3JhbV9zZXFbMF0pOyBpKyspCisJb3V0Yl9wKHByb2dyYW1fc2VxW2ldLnZhbHVlLCBpb2FkZHIgKyBwcm9ncmFtX3NlcVtpXS5vZmZzZXQpOworCisgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJcHJvbVtpXSA9IGluYihpb2FkZHIgKyBQQ05FVF9EQVRBUE9SVCk7CisgICAgZm9yIChpID0gMDsgaSA8IE5SX0lORk87IGkrKykgeworCWlmICgocHJvbVswXSA9PSBod19pbmZvW2ldLmEwKSAmJgorCSAgICAocHJvbVsyXSA9PSBod19pbmZvW2ldLmExKSAmJgorCSAgICAocHJvbVs0XSA9PSBod19pbmZvW2ldLmEyKSkKKwkgICAgYnJlYWs7CisgICAgfQorICAgIGlmICgoaSA8IE5SX0lORk8pIHx8ICgocHJvbVsyOF0gPT0gMHg1NykgJiYgKHByb21bMzBdID09IDB4NTcpKSkgeworCWZvciAoaiA9IDA7IGogPCA2OyBqKyspCisJICAgIGRldi0+ZGV2X2FkZHJbal0gPSBwcm9tW2o8PDFdOworCXJldHVybiAoaSA8IE5SX0lORk8pID8gaHdfaW5mbytpIDogJmRlZmF1bHRfaW5mbzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9IC8qIGdldF9wcm9tICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgRm9yIERMMTAwMTkgYmFzZWQgY2FyZHMsIGxpa2UgdGhlIExpbmtzeXMgRXRoZXJGYXN0CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaHdfaW5mb190ICpnZXRfZGwxMDAxOShkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGludCBpOworICAgIHVfY2hhciBzdW07CisKKyAgICBmb3IgKHN1bSA9IDAsIGkgPSAweDE0OyBpIDwgMHgxYzsgaSsrKQorCXN1bSArPSBpbmJfcChkZXYtPmJhc2VfYWRkciArIGkpOworICAgIGlmIChzdW0gIT0gMHhmZikKKwlyZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCWRldi0+ZGV2X2FkZHJbaV0gPSBpbmJfcChkZXYtPmJhc2VfYWRkciArIDB4MTQgKyBpKTsKKyAgICBpID0gaW5iKGRldi0+YmFzZV9hZGRyICsgMHgxZik7CisgICAgcmV0dXJuICgoaSA9PSAweDkxKXx8KGkgPT0gMHg5OSkpID8gJmRsMTAwMjJfaW5mbyA6ICZkbDEwMDE5X2luZm87Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgRm9yIEFzaXggQVg4ODE5MCBiYXNlZCBjYXJkcworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGh3X2luZm9fdCAqZ2V0X2F4ODgxOTAoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBpLCBqOworCisgICAgLyogTm90IG11Y2ggb2YgYSB0ZXN0LCBidXQgdGhlIGFsdGVybmF0aXZlcyBhcmUgbWVzc3kgKi8KKyAgICBpZiAobGluay0+Y29uZi5Db25maWdCYXNlICE9IDB4MDNjMCkKKwlyZXR1cm4gTlVMTDsKKworICAgIG91dGJfcCgweDAxLCBpb2FkZHIgKyBFTjBfRENGRyk7CS8qIFNldCB3b3JkLXdpZGUgYWNjZXNzLiAqLworICAgIG91dGJfcCgweDAwLCBpb2FkZHIgKyBFTjBfUlNBUkxPKTsJLyogRE1BIHN0YXJ0aW5nIGF0IDB4MDQwMC4gKi8KKyAgICBvdXRiX3AoMHgwNCwgaW9hZGRyICsgRU4wX1JTQVJISSk7CisgICAgb3V0Yl9wKEU4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBpb2FkZHIgKyBFODM5MF9DTUQpOworCisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkgKz0gMikgeworCWogPSBpbncoaW9hZGRyICsgUENORVRfREFUQVBPUlQpOworCWRldi0+ZGV2X2FkZHJbaV0gPSBqICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyW2krMV0gPSBqID4+IDg7CisgICAgfQorICAgIHByaW50ayhLRVJOX05PVElDRSAicGNuZXRfY3M6IHRoaXMgaXMgYW4gQVg4ODE5MCBjYXJkIVxuIik7CisgICAgcHJpbnRrKEtFUk5fTk9USUNFICJwY25ldF9jczogdXNlIGF4bmV0X2NzIGluc3RlYWQuXG4iKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGlzIHNob3VsZCBiZSB0b3RhbGx5IHVubmVjZXNzYXJ5Li4uIGJ1dCB3aGVuIHdlIGNhbid0IGZpZ3VyZQorICAgIG91dCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBhbnkgb3RoZXIgd2F5LCB3ZSdsbCBsZXQgdGhlIHVzZXIgaGFyZAorICAgIHdpcmUgaXQgd2hlbiB0aGUgbW9kdWxlIGlzIGluaXRpYWxpemVkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGh3X2luZm9fdCAqZ2V0X2h3aXJlZChkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlpZiAoaHdfYWRkcltpXSAhPSAwKSBicmVhazsKKyAgICBpZiAoaSA9PSA2KQorCXJldHVybiBOVUxMOworCisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlkZXYtPmRldl9hZGRyW2ldID0gaHdfYWRkcltpXTsKKworICAgIHJldHVybiAmZGVmYXVsdF9pbmZvOworfSAvKiBnZXRfaHdpcmVkICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgcGNuZXRfY29uZmlnKCkgaXMgc2NoZWR1bGVkIHRvIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50CisgICAgaXMgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlCisgICAgZXRoZXJuZXQgZGV2aWNlIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCitkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQorCitzdGF0aWMgaW50IHRyeV9pb19wb3J0KGRldl9saW5rX3QgKmxpbmspCit7CisgICAgaW50IGosIHJldDsKKyAgICBpZiAobGluay0+aW8uTnVtUG9ydHMxID09IDMyKSB7CisJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzsKKwlpZiAobGluay0+aW8uTnVtUG9ydHMyID4gMCkgeworCSAgICAvKiBmb3IgbWFzdGVyL3NsYXZlIG11bHRpZnVuY3Rpb24gY2FyZHMgKi8KKwkgICAgbGluay0+aW8uQXR0cmlidXRlczIgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwkgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSAKKwkJSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HfElSUV9GSVJTVF9TSEFSRUQ7CisJfQorICAgIH0gZWxzZSB7CisJLyogVGhpcyBzaG91bGQgYmUgdHdvIDE2LXBvcnQgd2luZG93cyAqLworCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJbGluay0+aW8uQXR0cmlidXRlczIgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisgICAgfQorICAgIGlmIChsaW5rLT5pby5CYXNlUG9ydDEgPT0gMCkgeworCWxpbmstPmlvLklPQWRkckxpbmVzID0gMTY7CisJZm9yIChqID0gMDsgaiA8IDB4NDAwOyBqICs9IDB4MjApIHsKKwkgICAgbGluay0+aW8uQmFzZVBvcnQxID0gaiBeIDB4MzAwOworCSAgICBsaW5rLT5pby5CYXNlUG9ydDIgPSAoaiBeIDB4MzAwKSArIDB4MTA7CisJICAgIHJldCA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwkgICAgaWYgKHJldCA9PSBDU19TVUNDRVNTKSByZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gcmV0OworICAgIH0gZWxzZSB7CisJcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0X2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgcGNuZXRfZGV2X3QgKmluZm8gPSBQUklWKGRldik7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICBjaXNwYXJzZV90IHBhcnNlOworICAgIGludCBpLCBsYXN0X3JldCwgbGFzdF9mbiwgc3RhcnRfcGcsIHN0b3BfcGcsIGNtX29mZnNldDsKKyAgICBpbnQgbWFuZmlkID0gMCwgcHJvZGlkID0gMCwgaGFzX3NobWVtID0gMDsKKyAgICB1X3Nob3J0IGJ1Zls2NF07CisgICAgY29uZmlnX2luZm9fdCBjb25mOworICAgIGh3X2luZm9fdCAqaHdfaW5mbzsKKworICAgIERFQlVHKDAsICJwY25ldF9jb25maWcoMHglcClcbiIsIGxpbmspOworCisgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CisgICAgdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKKyAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKyAgICBDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICBDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOworICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKworICAgIC8qIENvbmZpZ3VyZSBjYXJkICovCisgICAgbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKworICAgIC8qIExvb2sgdXAgY3VycmVudCBWY2MgKi8KKyAgICBDU19DSEVDSyhHZXRDb25maWd1cmF0aW9uSW5mbywgcGNtY2lhX2dldF9jb25maWd1cmF0aW9uX2luZm8oaGFuZGxlLCAmY29uZikpOworICAgIGxpbmstPmNvbmYuVmNjID0gY29uZi5WY2M7CisKKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfTUFORklEOworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSBUVVBMRV9SRVRVUk5fQ09NTU9OOworICAgIGlmICgocGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUykgJiYKKyAJKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkgPT0gQ1NfU1VDQ0VTUykpIHsKKwltYW5maWQgPSBsZTE2X3RvX2NwdShidWZbMF0pOworCXByb2RpZCA9IGxlMTZfdG9fY3B1KGJ1ZlsxXSk7CisgICAgfQorICAgIAorICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSAwOworICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICB3aGlsZSAobGFzdF9yZXQgPT0gQ1NfU1VDQ0VTUykgeworCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZyA9ICYocGFyc2UuY2Z0YWJsZV9lbnRyeSk7CisJY2lzdHBsX2lvX3QgKmlvID0gJihwYXJzZS5jZnRhYmxlX2VudHJ5LmlvKTsKKwkKKwlpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSAhPSAwIHx8CisJCQlwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkgIT0gMCB8fAorCQkJY2ZnLT5pbmRleCA9PSAwIHx8IGNmZy0+aW8ubndpbiA9PSAwKQorCQlnb3RvIG5leHRfZW50cnk7CisJCisJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXg7CisJLyogRm9yIG11bHRpZnVuY3Rpb24gY2FyZHMsIGJ5IGNvbnZlbnRpb24sIHdlIGNvbmZpZ3VyZSB0aGUKKwkgICBuZXR3b3JrIGZ1bmN0aW9uIHdpdGggd2luZG93IDAsIGFuZCBzZXJpYWwgd2l0aCB3aW5kb3cgMSAqLworCWlmIChpby0+bndpbiA+IDEpIHsKKwkgICAgaSA9IChpby0+d2luWzFdLmxlbiA+IGlvLT53aW5bMF0ubGVuKTsKKwkgICAgbGluay0+aW8uQmFzZVBvcnQyID0gaW8tPndpblsxLWldLmJhc2U7CisJICAgIGxpbmstPmlvLk51bVBvcnRzMiA9IGlvLT53aW5bMS1pXS5sZW47CisJfSBlbHNlIHsKKwkgICAgaSA9IGxpbmstPmlvLk51bVBvcnRzMiA9IDA7CisJfQorCWhhc19zaG1lbSA9ICgoY2ZnLT5tZW0ubndpbiA9PSAxKSAmJgorCQkgICAgIChjZmctPm1lbS53aW5bMF0ubGVuID49IDB4NDAwMCkpOworCWxpbmstPmlvLkJhc2VQb3J0MSA9IGlvLT53aW5baV0uYmFzZTsKKwlsaW5rLT5pby5OdW1Qb3J0czEgPSBpby0+d2luW2ldLmxlbjsKKwlsaW5rLT5pby5JT0FkZHJMaW5lcyA9IGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCWlmIChsaW5rLT5pby5OdW1Qb3J0czEgKyBsaW5rLT5pby5OdW1Qb3J0czIgPj0gMzIpIHsKKwkgICAgbGFzdF9yZXQgPSB0cnlfaW9fcG9ydChsaW5rKTsKKwkgICAgaWYgKGxhc3RfcmV0ID09IENTX1NVQ0NFU1MpIGJyZWFrOworCX0KKyAgICBuZXh0X2VudHJ5OgorCWxhc3RfcmV0ID0gcGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKTsKKyAgICB9CisgICAgaWYgKGxhc3RfcmV0ICE9IENTX1NVQ0NFU1MpIHsKKwljc19lcnJvcihoYW5kbGUsIFJlcXVlc3RJTywgbGFzdF9yZXQpOworCWdvdG8gZmFpbGVkOworICAgIH0KKworICAgIENTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShoYW5kbGUsICZsaW5rLT5pcnEpKTsKKyAgICAKKyAgICBpZiAobGluay0+aW8uTnVtUG9ydHMyID09IDgpIHsKKwlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKKwlsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOworICAgIH0KKyAgICBpZiAoKG1hbmZpZCA9PSBNQU5GSURfSUJNKSAmJgorCShwcm9kaWQgPT0gUFJPRElEX0lCTV9IT01FX0FORF9BV0FZKSkKKwlsaW5rLT5jb25mLkNvbmZpZ0luZGV4IHw9IDB4MTA7CisgICAgCisgICAgQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24oaGFuZGxlLCAmbGluay0+Y29uZikpOworICAgIGRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworICAgIGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworICAgIGlmIChpbmZvLT5mbGFncyAmIEhBU19NSVNDX1JFRykgeworCWlmICgoaWZfcG9ydCA9PSAxKSB8fCAoaWZfcG9ydCA9PSAyKSkKKwkgICAgZGV2LT5pZl9wb3J0ID0gaWZfcG9ydDsKKwllbHNlCisJICAgIHByaW50ayhLRVJOX05PVElDRSAicGNuZXRfY3M6IGludmFsaWQgaWZfcG9ydCByZXF1ZXN0ZWRcbiIpOworICAgIH0gZWxzZSB7CisJZGV2LT5pZl9wb3J0ID0gMDsKKyAgICB9CisKKyAgICBod19pbmZvID0gZ2V0X2h3aW5mbyhsaW5rKTsKKyAgICBpZiAoaHdfaW5mbyA9PSBOVUxMKQorCWh3X2luZm8gPSBnZXRfcHJvbShsaW5rKTsKKyAgICBpZiAoaHdfaW5mbyA9PSBOVUxMKQorCWh3X2luZm8gPSBnZXRfZGwxMDAxOShsaW5rKTsKKyAgICBpZiAoaHdfaW5mbyA9PSBOVUxMKQorCWh3X2luZm8gPSBnZXRfYXg4ODE5MChsaW5rKTsKKyAgICBpZiAoaHdfaW5mbyA9PSBOVUxMKQorCWh3X2luZm8gPSBnZXRfaHdpcmVkKGxpbmspOworICAgIAorICAgIGlmIChod19pbmZvID09IE5VTEwpIHsKKwlwcmludGsoS0VSTl9OT1RJQ0UgInBjbmV0X2NzOiB1bmFibGUgdG8gcmVhZCBoYXJkd2FyZSBuZXQiCisJICAgICAgICIgYWRkcmVzcyBmb3IgaW8gYmFzZSAlIzNseFxuIiwgZGV2LT5iYXNlX2FkZHIpOworCWdvdG8gZmFpbGVkOworICAgIH0KKworICAgIGluZm8tPmZsYWdzID0gaHdfaW5mby0+ZmxhZ3M7CisgICAgLyogQ2hlY2sgZm9yIHVzZXIgb3ZlcnJpZGVzICovCisgICAgaW5mby0+ZmxhZ3MgfD0gKGRlbGF5X291dHB1dCkgPyBERUxBWV9PVVRQVVQgOiAwOworICAgIGlmICgobWFuZmlkID09IE1BTkZJRF9TT0NLRVQpICYmCisJKChwcm9kaWQgPT0gUFJPRElEX1NPQ0tFVF9MUEUpIHx8CisJIChwcm9kaWQgPT0gUFJPRElEX1NPQ0tFVF9MUEVfQ0YpIHx8CisJIChwcm9kaWQgPT0gUFJPRElEX1NPQ0tFVF9FSU8pKSkKKwlpbmZvLT5mbGFncyAmPSB+VVNFX0JJR19CVUY7CisgICAgaWYgKCF1c2VfYmlnX2J1ZikKKwlpbmZvLT5mbGFncyAmPSB+VVNFX0JJR19CVUY7CisgICAgCisgICAgaWYgKGluZm8tPmZsYWdzICYgVVNFX0JJR19CVUYpIHsKKwlzdGFydF9wZyA9IFNPQ0tFVF9TVEFSVF9QRzsKKwlzdG9wX3BnID0gU09DS0VUX1NUT1BfUEc7CisJY21fb2Zmc2V0ID0gMHgxMDAwMDsKKyAgICB9IGVsc2UgeworCXN0YXJ0X3BnID0gUENORVRfU1RBUlRfUEc7CisJc3RvcF9wZyA9IFBDTkVUX1NUT1BfUEc7CisJY21fb2Zmc2V0ID0gMDsKKyAgICB9CisKKyAgICAvKiBoYXNfc2htZW0gaXMgaWdub3JlZCBpZiB1c2Vfc2htZW0gIT0gLTEgKi8KKyAgICBpZiAoKHVzZV9zaG1lbSA9PSAwKSB8fCAoIWhhc19zaG1lbSAmJiAodXNlX3NobWVtID09IC0xKSkgfHwKKwkoc2V0dXBfc2htZW1fd2luZG93KGxpbmssIHN0YXJ0X3BnLCBzdG9wX3BnLCBjbV9vZmZzZXQpICE9IDApKQorCXNldHVwX2RtYV9jb25maWcobGluaywgc3RhcnRfcGcsIHN0b3BfcGcpOworCisgICAgZWlfc3RhdHVzLm5hbWUgPSAiTkUyMDAwIjsKKyAgICBlaV9zdGF0dXMud29yZDE2ID0gMTsKKyAgICBlaV9zdGF0dXMucmVzZXRfODM5MCA9ICZwY25ldF9yZXNldF84MzkwOworCisgICAgU0VUX0VUSFRPT0xfT1BTKGRldiwgJm5ldGRldl9ldGh0b29sX29wcyk7CisKKyAgICBpZiAoaW5mby0+ZmxhZ3MgJiAoSVNfREwxMDAxOXxJU19ETDEwMDIyKSkgeworCXVfY2hhciBpZCA9IGluYihkZXYtPmJhc2VfYWRkciArIDB4MWEpOworCWRldi0+ZG9faW9jdGwgPSAmZWlfaW9jdGw7CisJbWlpX3BoeV9wcm9iZShkZXYpOworCWlmICgoaWQgPT0gMHgzMCkgJiYgIWluZm8tPnBuYV9waHkgJiYgKGluZm8tPmV0aF9waHkgPT0gNCkpCisJICAgIGluZm8tPmV0aF9waHkgPSAwOworICAgIH0KKworICAgIGxpbmstPmRldiA9ICZpbmZvLT5ub2RlOworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAgU0VUX05FVERFVl9ERVYoZGV2LCAmaGFuZGxlX3RvX2RldihoYW5kbGUpKTsKKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisgICAgZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlaV9wb2xsOworI2VuZGlmCisKKyAgICBpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgIT0gMCkgeworCXByaW50ayhLRVJOX05PVElDRSAicGNuZXRfY3M6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7CisJbGluay0+ZGV2ID0gTlVMTDsKKwlnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgICBzdHJjcHkoaW5mby0+bm9kZS5kZXZfbmFtZSwgZGV2LT5uYW1lKTsKKworICAgIGlmIChpbmZvLT5mbGFncyAmIChJU19ETDEwMDE5fElTX0RMMTAwMjIpKSB7CisJdV9jaGFyIGlkID0gaW5iKGRldi0+YmFzZV9hZGRyICsgMHgxYSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5FMjAwMCAoREwxMDAlZCByZXYgJTAyeCk6ICIsCisJICAgICAgIGRldi0+bmFtZSwgKChpbmZvLT5mbGFncyAmIElTX0RMMTAwMjIpID8gMjIgOiAxOSksIGlkKTsKKwlpZiAoaW5mby0+cG5hX3BoeSkKKwkgICAgcHJpbnRrKCJQTkEsICIpOworICAgIH0gZWxzZSB7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5FMjAwMCBDb21wYXRpYmxlOiAiLCBkZXYtPm5hbWUpOworICAgIH0KKyAgICBwcmludGsoImlvICUjM2x4LCBpcnEgJWQsIiwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKyAgICBpZiAoaW5mby0+ZmxhZ3MgJiBVU0VfU0hNRU0pCisJcHJpbnRrICgiIG1lbSAlIzVseCwiLCBkZXYtPm1lbV9zdGFydCk7CisgICAgaWYgKGluZm8tPmZsYWdzICYgSEFTX01JU0NfUkVHKQorCXByaW50aygiICVzIHhjdnIsIiwgaWZfbmFtZXNbZGV2LT5pZl9wb3J0XSk7CisgICAgcHJpbnRrKCIgaHdfYWRkciAiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXByaW50aygiJTAyWCVzIiwgZGV2LT5kZXZfYWRkcltpXSwgKChpPDUpID8gIjoiIDogIlxuIikpOworICAgIHJldHVybjsKKworY3NfZmFpbGVkOgorICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworZmFpbGVkOgorICAgIHBjbmV0X3JlbGVhc2UobGluayk7CisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKyAgICByZXR1cm47Cit9IC8qIHBjbmV0X2NvbmZpZyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEFmdGVyIGEgY2FyZCBpcyByZW1vdmVkLCBwY25ldF9yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZSBuZXQKKyAgICBkZXZpY2UsIGFuZCByZWxlYXNlIHRoZSBQQ01DSUEgY29uZmlndXJhdGlvbi4gIElmIHRoZSBkZXZpY2UgaXMKKyAgICBzdGlsbCBvcGVuLCB0aGlzIHdpbGwgYmUgcG9zdHBvbmVkIHVudGlsIGl0IGlzIGNsb3NlZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHBjbmV0X3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBwY25ldF9kZXZfdCAqaW5mbyA9IFBSSVYobGluay0+cHJpdik7CisKKyAgICBERUJVRygwLCAicGNuZXRfcmVsZWFzZSgweCVwKVxuIiwgbGluayk7CisKKyAgICBpZiAoaW5mby0+ZmxhZ3MgJiBVU0VfU0hNRU0pIHsKKwlpb3VubWFwKGluZm8tPmJhc2UpOworCXBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOworICAgIH0KKyAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisgICAgcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworICAgIHBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworCisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhlIGNhcmQgc3RhdHVzIGV2ZW50IGhhbmRsZXIuICBNb3N0bHksIHRoaXMgc2NoZWR1bGVzIG90aGVyCisgICAgc3R1ZmYgdG8gcnVuIGFmdGVyIGFuIGV2ZW50IGlzIHJlY2VpdmVkLiAgQSBDQVJEX1JFTU9WQUwgZXZlbnQKKyAgICBhbHNvIHNldHMgc29tZSBmbGFncyB0byBkaXNjb3VyYWdlIHRoZSBuZXQgZHJpdmVycyBmcm9tIHRyeWluZworICAgIHRvIHRhbGsgdG8gdGhlIGNhcmQgYW55IG1vcmUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHBjbmV0X2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJICAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncykKK3sKKyAgICBkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisKKyAgICBERUJVRygyLCAicGNuZXRfZXZlbnQoMHglMDZ4KVxuIiwgZXZlbnQpOworCisgICAgc3dpdGNoIChldmVudCkgeworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgorCWxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCSAgICBuZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwlsaW5rLT5zdGF0ZSB8PSBERVZfUFJFU0VOVCB8IERFVl9DT05GSUdfUEVORElORzsKKwlwY25ldF9jb25maWcobGluayk7CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9TVVNQRU5EOgorCWxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOworCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCSAgICBpZiAobGluay0+b3BlbikKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCSAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJfQorCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCSAgICBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworCSAgICBpZiAobGluay0+b3BlbikgeworCQlwY25ldF9yZXNldF84MzkwKGRldik7CisJCU5TODM5MF9pbml0KGRldiwgMSk7CisJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwkgICAgfQorCX0KKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9IC8qIHBjbmV0X2V2ZW50ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgTUlJIGludGVyZmFjZSBzdXBwb3J0IGZvciBETDEwMDE5IGFuZCBETDEwMDIyIGJhc2VkIGNhcmRzCisKKyAgICBPbiB0aGUgREwxMDAxOSwgdGhlIE1JSSBJTyBkaXJlY3Rpb24gYml0IGlzIDB4MTA7IG9uIHRoZSBETDEwMDIyCisgICAgaXQgaXMgMHgyMC4gIFNldHRpbmcgYm90aCBiaXRzIHNlZW1zIHRvIHdvcmsgb24gYm90aCBjYXJkIHR5cGVzLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBETElOS19HUElPCQkweDFjCisjZGVmaW5lIERMSU5LX0RJQUcJCTB4MWQKKyNkZWZpbmUgRExJTktfRUVQUk9NCQkweDFlCisKKyNkZWZpbmUgTURJT19TSElGVF9DTEsJCTB4ODAKKyNkZWZpbmUgTURJT19EQVRBX09VVAkJMHg0MAorI2RlZmluZSBNRElPX0RJUl9XUklURQkJMHgzMAorI2RlZmluZSBNRElPX0RBVEFfV1JJVEUwCShNRElPX0RJUl9XUklURSkKKyNkZWZpbmUgTURJT19EQVRBX1dSSVRFMQkoTURJT19ESVJfV1JJVEUgfCBNRElPX0RBVEFfT1VUKQorI2RlZmluZSBNRElPX0RBVEFfUkVBRAkJMHgxMAorI2RlZmluZSBNRElPX01BU0sJCTB4MGYKKworc3RhdGljIHZvaWQgbWRpb19zeW5jKGtpb19hZGRyX3QgYWRkcikKK3sKKyAgICBpbnQgYml0cywgbWFzayA9IGluYihhZGRyKSAmIE1ESU9fTUFTSzsKKyAgICBmb3IgKGJpdHMgPSAwOyBiaXRzIDwgMzI7IGJpdHMrKykgeworCW91dGIobWFzayB8IE1ESU9fREFUQV9XUklURTEsIGFkZHIpOworCW91dGIobWFzayB8IE1ESU9fREFUQV9XUklURTEgfCBNRElPX1NISUZUX0NMSywgYWRkcik7CisgICAgfQorfQorCitzdGF0aWMgaW50IG1kaW9fcmVhZChraW9fYWRkcl90IGFkZHIsIGludCBwaHlfaWQsIGludCBsb2MpCit7CisgICAgdV9pbnQgY21kID0gKDB4MDY8PDEwKXwocGh5X2lkPDw1KXxsb2M7CisgICAgaW50IGksIHJldHZhbCA9IDAsIG1hc2sgPSBpbmIoYWRkcikgJiBNRElPX01BU0s7CisKKyAgICBtZGlvX3N5bmMoYWRkcik7CisgICAgZm9yIChpID0gMTM7IGkgPj0gMDsgaS0tKSB7CisJaW50IGRhdCA9IChjbWQmKDE8PGkpKSA/IE1ESU9fREFUQV9XUklURTEgOiBNRElPX0RBVEFfV1JJVEUwOworCW91dGIobWFzayB8IGRhdCwgYWRkcik7CisJb3V0YihtYXNrIHwgZGF0IHwgTURJT19TSElGVF9DTEssIGFkZHIpOworICAgIH0KKyAgICBmb3IgKGkgPSAxOTsgaSA+IDA7IGktLSkgeworCW91dGIobWFzaywgYWRkcik7CisJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW5iKGFkZHIpICYgTURJT19EQVRBX1JFQUQpICE9IDApOworCW91dGIobWFzayB8IE1ESU9fU0hJRlRfQ0xLLCBhZGRyKTsKKyAgICB9CisgICAgcmV0dXJuIChyZXR2YWw+PjEpICYgMHhmZmZmOworfQorCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKGtpb19hZGRyX3QgYWRkciwgaW50IHBoeV9pZCwgaW50IGxvYywgaW50IHZhbHVlKQoreworICAgIHVfaW50IGNtZCA9ICgweDA1PDwyOCl8KHBoeV9pZDw8MjMpfChsb2M8PDE4KXwoMTw8MTcpfHZhbHVlOworICAgIGludCBpLCBtYXNrID0gaW5iKGFkZHIpICYgTURJT19NQVNLOworCisgICAgbWRpb19zeW5jKGFkZHIpOworICAgIGZvciAoaSA9IDMxOyBpID49IDA7IGktLSkgeworCWludCBkYXQgPSAoY21kJigxPDxpKSkgPyBNRElPX0RBVEFfV1JJVEUxIDogTURJT19EQVRBX1dSSVRFMDsKKwlvdXRiKG1hc2sgfCBkYXQsIGFkZHIpOworCW91dGIobWFzayB8IGRhdCB8IE1ESU9fU0hJRlRfQ0xLLCBhZGRyKTsKKyAgICB9CisgICAgZm9yIChpID0gMTsgaSA+PSAwOyBpLS0pIHsKKwlvdXRiKG1hc2ssIGFkZHIpOworCW91dGIobWFzayB8IE1ESU9fU0hJRlRfQ0xLLCBhZGRyKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG1kaW9fcmVzZXQoa2lvX2FkZHJfdCBhZGRyLCBpbnQgcGh5X2lkKQoreworICAgIG91dGJfcCgweDA4LCBhZGRyKTsKKyAgICBvdXRiX3AoMHgwYywgYWRkcik7CisgICAgb3V0Yl9wKDB4MDgsIGFkZHIpOworICAgIG91dGJfcCgweDBjLCBhZGRyKTsKKyAgICBvdXRiX3AoMHgwMCwgYWRkcik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgRUVQUk9NIGFjY2VzcyByb3V0aW5lcyBmb3IgREwxMDAxOSBhbmQgREwxMDAyMiBiYXNlZCBjYXJkcworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBFRV9FRVAJCTB4NDAKKyNkZWZpbmUgRUVfQVNJQwkJMHgxMAorI2RlZmluZSBFRV9DUwkJMHgwOAorI2RlZmluZSBFRV9DSwkJMHgwNAorI2RlZmluZSBFRV9ETwkJMHgwMgorI2RlZmluZSBFRV9ESQkJMHgwMQorI2RlZmluZSBFRV9BRE9UCQkweDAxCS8qIERhdGFPdXQgZm9yIEFTSUMgKi8KKyNkZWZpbmUgRUVfUkVBRF9DTUQJMHgwNgorCisjZGVmaW5lIERMMTlGRFVQTFgJMHgwNDAwCS8qIERMMTAwMTkgRnVsbCBkdXBsZXggbW9kZSAqLworCitzdGF0aWMgaW50IHJlYWRfZWVwcm9tKGtpb19hZGRyX3QgaW9hZGRyLCBpbnQgbG9jYXRpb24pCit7CisgICAgaW50IGksIHJldHZhbCA9IDA7CisgICAga2lvX2FkZHJfdCBlZV9hZGRyID0gaW9hZGRyICsgRExJTktfRUVQUk9NOworICAgIGludCByZWFkX2NtZCA9IGxvY2F0aW9uIHwgKEVFX1JFQURfQ01EIDw8IDgpOworCisgICAgb3V0YigwLCBlZV9hZGRyKTsKKyAgICBvdXRiKEVFX0VFUHxFRV9DUywgZWVfYWRkcik7CisKKyAgICAvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLworICAgIGZvciAoaSA9IDEwOyBpID49IDA7IGktLSkgeworCXNob3J0IGRhdGF2YWwgPSAocmVhZF9jbWQgJiAoMSA8PCBpKSkgPyBFRV9ETyA6IDA7CisJb3V0Yl9wKEVFX0VFUHxFRV9DU3xkYXRhdmFsLCBlZV9hZGRyKTsKKwlvdXRiX3AoRUVfRUVQfEVFX0NTfGRhdGF2YWx8RUVfQ0ssIGVlX2FkZHIpOworICAgIH0KKyAgICBvdXRiKEVFX0VFUHxFRV9DUywgZWVfYWRkcik7CisKKyAgICBmb3IgKGkgPSAxNjsgaSA+IDA7IGktLSkgeworCW91dGJfcChFRV9FRVB8RUVfQ1MgfCBFRV9DSywgZWVfYWRkcik7CisJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW5iKGVlX2FkZHIpICYgRUVfREkpID8gMSA6IDApOworCW91dGJfcChFRV9FRVB8RUVfQ1MsIGVlX2FkZHIpOworICAgIH0KKworICAgIC8qIFRlcm1pbmF0ZSB0aGUgRUVQUk9NIGFjY2Vzcy4gKi8KKyAgICBvdXRiKDAsIGVlX2FkZHIpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgICAgVGhlIGludGVybmFsIEFTSUMgcmVnaXN0ZXJzIGNhbiBiZSBjaGFuZ2VkIGJ5IEVFUFJPTSBSRUFEIGFjY2VzcworICAgIHdpdGggRUVfQVNJQyBiaXQgc2V0LgorICAgIEluIEFTSUMgbW9kZSwgRUVfQURPVCBpcyB1c2VkIHRvIG91dHB1dCB0aGUgZGF0YSB0byB0aGUgQVNJQy4KKyovCisKK3N0YXRpYyB2b2lkIHdyaXRlX2FzaWMoa2lvX2FkZHJfdCBpb2FkZHIsIGludCBsb2NhdGlvbiwgc2hvcnQgYXNpY19kYXRhKQoreworCWludCBpOworCWtpb19hZGRyX3QgZWVfYWRkciA9IGlvYWRkciArIERMSU5LX0VFUFJPTTsKKwlzaG9ydCBkYXRhdmFsOworCWludCByZWFkX2NtZCA9IGxvY2F0aW9uIHwgKEVFX1JFQURfQ01EIDw8IDgpOworCisJYXNpY19kYXRhIHw9IHJlYWRfZWVwcm9tKGlvYWRkciwgbG9jYXRpb24pOworCisJb3V0YigwLCBlZV9hZGRyKTsKKwlvdXRiKEVFX0FTSUN8RUVfQ1N8RUVfREksIGVlX2FkZHIpOworCisJcmVhZF9jbWQgPSByZWFkX2NtZCA+PiAxOworCisJLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSA5OyBpID49IDA7IGktLSkgeworCQlkYXRhdmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gRUVfRE8gOiAwOworCQlvdXRiX3AoRUVfQVNJQ3xFRV9DU3xFRV9ESXxkYXRhdmFsLCBlZV9hZGRyKTsKKwkJb3V0Yl9wKEVFX0FTSUN8RUVfQ1N8RUVfREl8ZGF0YXZhbHxFRV9DSywgZWVfYWRkcik7CisJCW91dGJfcChFRV9BU0lDfEVFX0NTfEVFX0RJfGRhdGF2YWwsIGVlX2FkZHIpOworCX0KKwkvLyBzeW5jCisJb3V0YihFRV9BU0lDfEVFX0NTLCBlZV9hZGRyKTsKKwlvdXRiKEVFX0FTSUN8RUVfQ1N8RUVfQ0ssIGVlX2FkZHIpOworCW91dGIoRUVfQVNJQ3xFRV9DUywgZWVfYWRkcik7CisKKwlmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pIHsKKwkJZGF0YXZhbCA9IChhc2ljX2RhdGEgJiAoMSA8PCBpKSkgPyBFRV9BRE9UIDogMDsKKwkJb3V0Yl9wKEVFX0FTSUN8RUVfQ1N8ZGF0YXZhbCwgZWVfYWRkcik7CisJCW91dGJfcChFRV9BU0lDfEVFX0NTfGRhdGF2YWx8RUVfQ0ssIGVlX2FkZHIpOworCQlvdXRiX3AoRUVfQVNJQ3xFRV9DU3xkYXRhdmFsLCBlZV9hZGRyKTsKKwl9CisKKwkvKiBUZXJtaW5hdGUgdGhlIEFTSUMgYWNjZXNzLiAqLworCW91dGIoRUVfQVNJQ3xFRV9ESSwgZWVfYWRkcik7CisJb3V0YihFRV9BU0lDfEVFX0RJfCBFRV9DSywgZWVfYWRkcik7CisJb3V0YihFRV9BU0lDfEVFX0RJLCBlZV9hZGRyKTsKKworCW91dGIoMCwgZWVfYWRkcik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBzZXRfbWlzY19yZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBraW9fYWRkcl90IG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgcGNuZXRfZGV2X3QgKmluZm8gPSBQUklWKGRldik7CisgICAgdV9jaGFyIHRtcDsKKyAgICAKKyAgICBpZiAoaW5mby0+ZmxhZ3MgJiBIQVNfTUlTQ19SRUcpIHsKKwl0bXAgPSBpbmJfcChuaWNfYmFzZSArIFBDTkVUX01JU0MpICYgfjM7CisJaWYgKGRldi0+aWZfcG9ydCA9PSAyKQorCSAgICB0bXAgfD0gMTsKKwlpZiAoaW5mby0+ZmxhZ3MgJiBVU0VfQklHX0JVRikKKwkgICAgdG1wIHw9IDI7CisJaWYgKGluZm8tPmZsYWdzICYgSEFTX0lCTV9NSVNDKQorCSAgICB0bXAgfD0gODsKKwlvdXRiX3AodG1wLCBuaWNfYmFzZSArIFBDTkVUX01JU0MpOworICAgIH0KKyAgICBpZiAoaW5mby0+ZmxhZ3MgJiBJU19ETDEwMDIyKSB7CisJaWYgKGluZm8tPmZsYWdzICYgSEFTX01JSSkgeworCSAgICBtZGlvX3Jlc2V0KG5pY19iYXNlICsgRExJTktfR1BJTywgaW5mby0+ZXRoX3BoeSk7CisJICAgIC8qIFJlc3RhcnQgTUlJIGF1dG9uZWdvdGlhdGlvbiAqLworCSAgICBtZGlvX3dyaXRlKG5pY19iYXNlICsgRExJTktfR1BJTywgaW5mby0+ZXRoX3BoeSwgMCwgMHgwMDAwKTsKKwkgICAgbWRpb193cml0ZShuaWNfYmFzZSArIERMSU5LX0dQSU8sIGluZm8tPmV0aF9waHksIDAsIDB4MTIwMCk7CisJICAgIGluZm8tPm1paV9yZXNldCA9IGppZmZpZXM7CisJfSBlbHNlIHsKKwkgICAgb3V0YihmdWxsX2R1cGxleCA/IDQgOiAwLCBuaWNfYmFzZSArIERMSU5LX0RJQUcpOworCX0KKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBtaWlfcGh5X3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgcGNuZXRfZGV2X3QgKmluZm8gPSBQUklWKGRldik7CisgICAga2lvX2FkZHJfdCBtaWlfYWRkciA9IGRldi0+YmFzZV9hZGRyICsgRExJTktfR1BJTzsKKyAgICBpbnQgaTsKKyAgICB1X2ludCB0bXAsIHBoeWlkOworCisgICAgZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisJdG1wID0gbWRpb19yZWFkKG1paV9hZGRyLCBpLCAxKTsKKwlpZiAoKHRtcCA9PSAwKSB8fCAodG1wID09IDB4ZmZmZikpCisJICAgIGNvbnRpbnVlOworCXRtcCA9IG1kaW9fcmVhZChtaWlfYWRkciwgaSwgTUlJX1BIWUlEX1JFRzEpOworCXBoeWlkID0gdG1wIDw8IDE2OworCXBoeWlkIHw9IG1kaW9fcmVhZChtaWlfYWRkciwgaSwgTUlJX1BIWUlEX1JFRzIpOworCXBoeWlkICY9IE1JSV9QSFlJRF9SRVZfTUFTSzsKKwlERUJVRygwLCAiJXM6IE1JSSBhdCAlZCBpcyAweCUwOHhcbiIsIGRldi0+bmFtZSwgaSwgcGh5aWQpOworCWlmIChwaHlpZCA9PSBBTTc5QzlYWF9IT01FX1BIWSkgeworCSAgICBpbmZvLT5wbmFfcGh5ID0gaTsKKwl9IGVsc2UgaWYgKHBoeWlkICE9IEFNNzlDOVhYX0VUSF9QSFkpIHsKKwkgICAgaW5mby0+ZXRoX3BoeSA9IGk7CisJfQorICAgIH0KK30KKworc3RhdGljIGludCBwY25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgcGNuZXRfZGV2X3QgKmluZm8gPSBQUklWKGRldik7CisgICAgZGV2X2xpbmtfdCAqbGluayA9ICZpbmZvLT5saW5rOworICAgIAorICAgIERFQlVHKDIsICJwY25ldF9vcGVuKCclcycpXG4iLCBkZXYtPm5hbWUpOworCisgICAgaWYgKCFERVZfT0sobGluaykpCisJcmV0dXJuIC1FTk9ERVY7CisKKyAgICBsaW5rLT5vcGVuKys7CisKKyAgICBzZXRfbWlzY19yZWcoZGV2KTsKKyAgICByZXF1ZXN0X2lycShkZXYtPmlycSwgZWlfaXJxX3dyYXBwZXIsIFNBX1NISVJRLCBkZXZfaW5mbywgZGV2KTsKKworICAgIGluZm8tPnBoeV9pZCA9IGluZm8tPmV0aF9waHk7CisgICAgaW5mby0+bGlua19zdGF0dXMgPSAweDAwOworICAgIGluaXRfdGltZXIoJmluZm8tPndhdGNoZG9nKTsKKyAgICBpbmZvLT53YXRjaGRvZy5mdW5jdGlvbiA9ICZlaV93YXRjaGRvZzsKKyAgICBpbmZvLT53YXRjaGRvZy5kYXRhID0gKHVfbG9uZylkZXY7CisgICAgaW5mby0+d2F0Y2hkb2cuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKyAgICBhZGRfdGltZXIoJmluZm8tPndhdGNoZG9nKTsKKworICAgIHJldHVybiBlaV9vcGVuKGRldik7Cit9IC8qIHBjbmV0X29wZW4gKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgcGNuZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBwY25ldF9kZXZfdCAqaW5mbyA9IFBSSVYoZGV2KTsKKyAgICBkZXZfbGlua190ICpsaW5rID0gJmluZm8tPmxpbms7CisKKyAgICBERUJVRygyLCAicGNuZXRfY2xvc2UoJyVzJylcbiIsIGRldi0+bmFtZSk7CisKKyAgICBlaV9jbG9zZShkZXYpOworICAgIGZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworICAgIAorICAgIGxpbmstPm9wZW4tLTsKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgZGVsX3RpbWVyX3N5bmMoJmluZm8tPndhdGNoZG9nKTsKKworICAgIHJldHVybiAwOworfSAvKiBwY25ldF9jbG9zZSAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEhhcmQgcmVzZXQgdGhlIGNhcmQuICBUaGlzIHVzZWQgdG8gcGF1c2UgZm9yIHRoZSBzYW1lIHBlcmlvZCB0aGF0CisgICAgYSA4MzkwIHJlc2V0IGNvbW1hbmQgcmVxdWlyZWQsIGJ1dCB0aGF0IHNob3VsZG4ndCBiZSBuZWNlc3NhcnkuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBwY25ldF9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAga2lvX2FkZHJfdCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBpOworCisgICAgZWlfc3RhdHVzLnR4aW5nID0gZWlfc3RhdHVzLmRtYWluZyA9IDA7CisKKyAgICBvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgbmljX2Jhc2UgKyBFODM5MF9DTUQpOworCisgICAgb3V0YihpbmIobmljX2Jhc2UgKyBQQ05FVF9SRVNFVCksIG5pY19iYXNlICsgUENORVRfUkVTRVQpOworCisgICAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJaWYgKChpbmJfcChuaWNfYmFzZStFTjBfSVNSKSAmIEVOSVNSX1JFU0VUKSAhPSAwKQorCSAgICBicmVhazsKKwl1ZGVsYXkoMTAwKTsKKyAgICB9CisgICAgb3V0Yl9wKEVOSVNSX1JFU0VULCBuaWNfYmFzZSArIEVOMF9JU1IpOyAvKiBBY2sgaW50ci4gKi8KKyAgICAKKyAgICBpZiAoaSA9PSAxMDApCisJcHJpbnRrKEtFUk5fRVJSICIlczogcGNuZXRfcmVzZXRfODM5MCgpIGRpZCBub3QgY29tcGxldGUuXG4iLAorCSAgICAgICBkZXYtPm5hbWUpOworICAgIHNldF9taXNjX3JlZyhkZXYpOworICAgIAorfSAvKiBwY25ldF9yZXNldF84MzkwICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHNldF9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApCit7CisgICAgcGNuZXRfZGV2X3QgKmluZm8gPSBQUklWKGRldik7CisgICAgaWYgKChtYXAtPnBvcnQgIT0gKHVfY2hhcikoLTEpKSAmJiAobWFwLT5wb3J0ICE9IGRldi0+aWZfcG9ydCkpIHsKKwlpZiAoIShpbmZvLT5mbGFncyAmIEhBU19NSVNDX1JFRykpCisJICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKwllbHNlIGlmICgobWFwLT5wb3J0IDwgMSkgfHwgKG1hcC0+cG9ydCA+IDIpKQorCSAgICByZXR1cm4gLUVJTlZBTDsKKwlkZXYtPmlmX3BvcnQgPSBtYXAtPnBvcnQ7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHN3aXRjaGVkIHRvICVzIHBvcnRcbiIsCisJICAgICAgIGRldi0+bmFtZSwgaWZfbmFtZXNbZGV2LT5pZl9wb3J0XSk7CisJTlM4MzkwX2luaXQoZGV2LCAxKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaXJxcmV0dXJuX3QgZWlfaXJxX3dyYXBwZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworICAgIHBjbmV0X2Rldl90ICppbmZvID0gUFJJVihkZXYpOworICAgIGlycXJldHVybl90IHJldCA9IGVpX2ludGVycnVwdChpcnEsIGRldl9pZCwgcmVncyk7CisKKyAgICBpZiAocmV0ID09IElSUV9IQU5ETEVEKQorCSAgICBpbmZvLT5zdGFsZSA9IDA7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZWlfd2F0Y2hkb2codV9sb25nIGFyZykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopYXJnOworICAgIHBjbmV0X2Rldl90ICppbmZvID0gUFJJVihkZXYpOworICAgIGtpb19hZGRyX3QgbmljX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBraW9fYWRkcl90IG1paV9hZGRyID0gbmljX2Jhc2UgKyBETElOS19HUElPOworICAgIHVfc2hvcnQgbGluazsKKworICAgIGlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkgZ290byByZXNjaGVkdWxlOworCisgICAgLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0IHdpdGggZXhwaXJlZCBsYXRlbmN5IHRpbWVyOiB3aXRoCisgICAgICAgdGhpcywgd2UgY2FuIGxpbXAgYWxvbmcgZXZlbiBpZiB0aGUgaW50ZXJydXB0IGlzIGJsb2NrZWQgKi8KKyAgICBvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTAsIG5pY19iYXNlICsgRTgzOTBfQ01EKTsKKyAgICBpZiAoaW5mby0+c3RhbGUrKyAmJiAoaW5iX3AobmljX2Jhc2UgKyBFTjBfSVNSKSAmIEVOSVNSX0FMTCkpIHsKKwlpZiAoIWluZm8tPmZhc3RfcG9sbCkKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludGVycnVwdChzKSBkcm9wcGVkIVxuIiwgZGV2LT5uYW1lKTsKKwllaV9pcnFfd3JhcHBlcihkZXYtPmlycSwgZGV2LCBOVUxMKTsKKwlpbmZvLT5mYXN0X3BvbGwgPSBIWjsKKyAgICB9CisgICAgaWYgKGluZm8tPmZhc3RfcG9sbCkgeworCWluZm8tPmZhc3RfcG9sbC0tOworCWluZm8tPndhdGNoZG9nLmV4cGlyZXMgPSBqaWZmaWVzICsgMTsKKwlhZGRfdGltZXIoJmluZm8tPndhdGNoZG9nKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKCEoaW5mby0+ZmxhZ3MgJiBIQVNfTUlJKSkKKwlnb3RvIHJlc2NoZWR1bGU7CisKKyAgICBtZGlvX3JlYWQobWlpX2FkZHIsIGluZm8tPnBoeV9pZCwgMSk7CisgICAgbGluayA9IG1kaW9fcmVhZChtaWlfYWRkciwgaW5mby0+cGh5X2lkLCAxKTsKKyAgICBpZiAoIWxpbmsgfHwgKGxpbmsgPT0gMHhmZmZmKSkgeworCWlmIChpbmZvLT5ldGhfcGh5KSB7CisJICAgIGluZm8tPnBoeV9pZCA9IGluZm8tPmV0aF9waHkgPSAwOworCX0gZWxzZSB7CisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBNSUkgaXMgbWlzc2luZyFcbiIsIGRldi0+bmFtZSk7CisJICAgIGluZm8tPmZsYWdzICY9IH5IQVNfTUlJOworCX0KKwlnb3RvIHJlc2NoZWR1bGU7CisgICAgfQorCisgICAgbGluayAmPSAweDAwMDQ7CisgICAgaWYgKGxpbmsgIT0gaW5mby0+bGlua19zdGF0dXMpIHsKKwl1X3Nob3J0IHAgPSBtZGlvX3JlYWQobWlpX2FkZHIsIGluZm8tPnBoeV9pZCwgNSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGxpbmsgYmVhdFxuIiwgZGV2LT5uYW1lLAorCSAgICAgICAobGluaykgPyAiZm91bmQiIDogImxvc3QiKTsKKwlpZiAobGluayAmJiAoaW5mby0+ZmxhZ3MgJiBJU19ETDEwMDIyKSkgeworCSAgICAvKiBEaXNhYmxlIGNvbGxpc2lvbiBkZXRlY3Rpb24gb24gZnVsbCBkdXBsZXggbGlua3MgKi8KKwkgICAgb3V0YigocCAmIDB4MDE0MCkgPyA0IDogMCwgbmljX2Jhc2UgKyBETElOS19ESUFHKTsKKwl9IGVsc2UgaWYgKGxpbmsgJiYgKGluZm8tPmZsYWdzICYgSVNfREwxMDAxOSkpIHsKKwkgICAgLyogRGlzYWJsZSBjb2xsaXNpb24gZGV0ZWN0aW9uIG9uIGZ1bGwgZHVwbGV4IGxpbmtzICovCisJICAgIHdyaXRlX2FzaWMoZGV2LT5iYXNlX2FkZHIsIDQsIChwICYgMHgxNDApID8gREwxOUZEVVBMWCA6IDApOworCX0KKwlpZiAobGluaykgeworCSAgICBpZiAoaW5mby0+cGh5X2lkID09IGluZm8tPmV0aF9waHkpIHsKKwkJaWYgKHApCisJCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogYXV0b25lZ290aWF0aW9uIGNvbXBsZXRlOiAiCisJCQkgICAiJXNiYXNlVC0lY0Qgc2VsZWN0ZWRcbiIsIGRldi0+bmFtZSwKKwkJCSAgICgocCAmIDB4MDE4MCkgPyAiMTAwIiA6ICIxMCIpLAorCQkJICAgKChwICYgMHgwMTQwKSA/ICdGJyA6ICdIJykpOworCQllbHNlCisJCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogbGluayBwYXJ0bmVyIGRpZCBub3QgIgorCQkJICAgImF1dG9uZWdvdGlhdGVcbiIsIGRldi0+bmFtZSk7CisJICAgIH0KKwkgICAgTlM4MzkwX2luaXQoZGV2LCAxKTsKKwl9CisJaW5mby0+bGlua19zdGF0dXMgPSBsaW5rOworICAgIH0KKyAgICBpZiAoaW5mby0+cG5hX3BoeSAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIGluZm8tPm1paV9yZXNldCArIDYqSFopKSB7CisJbGluayA9IG1kaW9fcmVhZChtaWlfYWRkciwgaW5mby0+ZXRoX3BoeSwgMSkgJiAweDAwMDQ7CisJaWYgKCgoaW5mby0+cGh5X2lkID09IGluZm8tPnBuYV9waHkpICYmIGxpbmspIHx8CisJICAgICgoaW5mby0+cGh5X2lkICE9IGluZm8tPnBuYV9waHkpICYmICFsaW5rKSkgeworCSAgICAvKiBpc29sYXRlIHRoaXMgTUlJIGFuZCB0cnkgZmxpcHBpbmcgdG8gdGhlIG90aGVyIG9uZSAqLworCSAgICBtZGlvX3dyaXRlKG1paV9hZGRyLCBpbmZvLT5waHlfaWQsIDAsIDB4MDQwMCk7CisJICAgIGluZm8tPnBoeV9pZCBePSBpbmZvLT5wbmFfcGh5IF4gaW5mby0+ZXRoX3BoeTsKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHN3aXRjaGVkIHRvICVzIHRyYW5zY2VpdmVyXG4iLCBkZXYtPm5hbWUsCisJCSAgIChpbmZvLT5waHlfaWQgPT0gaW5mby0+ZXRoX3BoeSkgPyAiZXRoZXJuZXQiIDogIlBOQSIpOworCSAgICBtZGlvX3dyaXRlKG1paV9hZGRyLCBpbmZvLT5waHlfaWQsIDAsCisJCSAgICAgICAoaW5mby0+cGh5X2lkID09IGluZm8tPmV0aF9waHkpID8gMHgxMDAwIDogMCk7CisJICAgIGluZm8tPmxpbmtfc3RhdHVzID0gMDsKKwkgICAgaW5mby0+bWlpX3Jlc2V0ID0gamlmZmllczsKKwl9CisgICAgfQorCityZXNjaGVkdWxlOgorICAgIGluZm8tPndhdGNoZG9nLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisgICAgYWRkX3RpbWVyKCZpbmZvLT53YXRjaGRvZyk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmNweShpbmZvLT5kcml2ZXIsICJwY25ldF9jcyIpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorfTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworc3RhdGljIGludCBlaV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworICAgIHBjbmV0X2Rldl90ICppbmZvID0gUFJJVihkZXYpOworICAgIHUxNiAqZGF0YSA9ICh1MTYgKikmcnEtPmlmcl9pZnJ1OworICAgIGtpb19hZGRyX3QgbWlpX2FkZHIgPSBkZXYtPmJhc2VfYWRkciArIERMSU5LX0dQSU87CisgICAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIFNJT0NHTUlJUEhZOgorCWRhdGFbMF0gPSBpbmZvLT5waHlfaWQ7CisgICAgY2FzZSBTSU9DR01JSVJFRzoJCS8qIFJlYWQgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwlkYXRhWzNdID0gbWRpb19yZWFkKG1paV9hZGRyLCBkYXRhWzBdLCBkYXRhWzFdICYgMHgxZik7CisJcmV0dXJuIDA7CisgICAgY2FzZSBTSU9DU01JSVJFRzoJCS8qIFdyaXRlIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCSAgICByZXR1cm4gLUVQRVJNOworCW1kaW9fd3JpdGUobWlpX2FkZHIsIGRhdGFbMF0sIGRhdGFbMV0gJiAweDFmLCBkYXRhWzJdKTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgZG1hX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLAorCQkJICAgICBpbnQgcmluZ19wYWdlKQoreworICAgIGtpb19hZGRyX3QgbmljX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIGlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogRE1BaW5nIGNvbmZsaWN0IGluIGRtYV9ibG9ja19pbnB1dC4iCisJICAgICAgICJbRE1Bc3RhdDolMXhdW2lycWxvY2s6JTF4XVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBlaV9zdGF0dXMuZG1haW5nLCBlaV9zdGF0dXMuaXJxbG9jayk7CisJcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBlaV9zdGF0dXMuZG1haW5nIHw9IDB4MDE7CisgICAgb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIFBDTkVUX0NNRCk7CisgICAgb3V0Yl9wKHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkciksIG5pY19iYXNlICsgRU4wX1JDTlRMTyk7CisgICAgb3V0Yl9wKDAsIG5pY19iYXNlICsgRU4wX1JDTlRISSk7CisgICAgb3V0Yl9wKDAsIG5pY19iYXNlICsgRU4wX1JTQVJMTyk7CQkvKiBPbiBwYWdlIGJvdW5kYXJ5ICovCisgICAgb3V0Yl9wKHJpbmdfcGFnZSwgbmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKyAgICBvdXRiX3AoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIG5pY19iYXNlICsgUENORVRfQ01EKTsKKworICAgIGluc3cobmljX2Jhc2UgKyBQQ05FVF9EQVRBUE9SVCwgaGRyLAorCSAgICBzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpPj4xKTsKKyAgICAvKiBGaXggZm9yIGJpZyBlbmRpYW4gc3lzdGVtcyAqLworICAgIGhkci0+Y291bnQgPSBsZTE2X3RvX2NwdShoZHItPmNvdW50KTsKKworICAgIG91dGJfcChFTklTUl9SREMsIG5pY19iYXNlICsgRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworICAgIGVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBkbWFfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCkKK3sKKyAgICBraW9fYWRkcl90IG5pY19iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IHhmZXJfY291bnQgPSBjb3VudDsKKyAgICBjaGFyICpidWYgPSBza2ItPmRhdGE7CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgICBpZiAoKGVpX2RlYnVnID4gNCkgJiYgKGNvdW50ICE9IDQpKQorCXByaW50ayhLRVJOX0RFQlVHICIlczogW2JpPSVkXVxuIiwgZGV2LT5uYW1lLCBjb3VudCs0KTsKKyNlbmRpZgorICAgIGlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogRE1BaW5nIGNvbmZsaWN0IGluIGRtYV9ibG9ja19pbnB1dC4iCisJICAgICAgICJbRE1Bc3RhdDolMXhdW2lycWxvY2s6JTF4XVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBlaV9zdGF0dXMuZG1haW5nLCBlaV9zdGF0dXMuaXJxbG9jayk7CisJcmV0dXJuOworICAgIH0KKyAgICBlaV9zdGF0dXMuZG1haW5nIHw9IDB4MDE7CisgICAgb3V0Yl9wKEU4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIFBDTkVUX0NNRCk7CisgICAgb3V0Yl9wKGNvdW50ICYgMHhmZiwgbmljX2Jhc2UgKyBFTjBfUkNOVExPKTsKKyAgICBvdXRiX3AoY291bnQgPj4gOCwgbmljX2Jhc2UgKyBFTjBfUkNOVEhJKTsKKyAgICBvdXRiX3AocmluZ19vZmZzZXQgJiAweGZmLCBuaWNfYmFzZSArIEVOMF9SU0FSTE8pOworICAgIG91dGJfcChyaW5nX29mZnNldCA+PiA4LCBuaWNfYmFzZSArIEVOMF9SU0FSSEkpOworICAgIG91dGJfcChFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBQQ05FVF9DTUQpOworCisgICAgaW5zdyhuaWNfYmFzZSArIFBDTkVUX0RBVEFQT1JULGJ1Zixjb3VudD4+MSk7CisgICAgaWYgKGNvdW50ICYgMHgwMSkKKwlidWZbY291bnQtMV0gPSBpbmIobmljX2Jhc2UgKyBQQ05FVF9EQVRBUE9SVCksIHhmZXJfY291bnQrKzsKKworICAgIC8qIFRoaXMgd2FzIGZvciB0aGUgQUxQSEEgdmVyc2lvbiBvbmx5LCBidXQgZW5vdWdoIHBlb3BsZSBoYXZlCisgICAgICAgZW5jb3VudGVyaW5nIHByb2JsZW1zIHRoYXQgaXQgaXMgc3RpbGwgaGVyZS4gKi8KKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgICBpZiAoZWlfZGVidWcgPiA0KSB7CQkvKiBETUEgdGVybWluYXRpb24gYWRkcmVzcyBjaGVjay4uLiAqLworCWludCBhZGRyLCB0cmllcyA9IDIwOworCWRvIHsKKwkgICAgLyogRE9OJ1QgY2hlY2sgZm9yICdpbmJfcChFTjBfSVNSKSAmIEVOSVNSX1JEQycgaGVyZQorCSAgICAgICAtLSBpdCdzIGJyb2tlbiBmb3IgUnggb24gc29tZSBjYXJkcyEgKi8KKwkgICAgaW50IGhpZ2ggPSBpbmJfcChuaWNfYmFzZSArIEVOMF9SU0FSSEkpOworCSAgICBpbnQgbG93ID0gaW5iX3AobmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKwkgICAgYWRkciA9IChoaWdoIDw8IDgpICsgbG93OworCSAgICBpZiAoKChyaW5nX29mZnNldCArIHhmZXJfY291bnQpICYgMHhmZikgPT0gKGFkZHIgJiAweGZmKSkKKwkJYnJlYWs7CisJfSB3aGlsZSAoLS10cmllcyA+IDApOworCWlmICh0cmllcyA8PSAwKQorCSAgICBwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBSWCB0cmFuc2ZlciBhZGRyZXNzIG1pc21hdGNoLCIKKwkJICAgIiUjNC40eCAoZXhwZWN0ZWQpIHZzLiAlIzQuNHggKGFjdHVhbCkuXG4iLAorCQkgICBkZXYtPm5hbWUsIHJpbmdfb2Zmc2V0ICsgeGZlcl9jb3VudCwgYWRkcik7CisgICAgfQorI2VuZGlmCisgICAgb3V0Yl9wKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBFTjBfSVNSKTsJLyogQWNrIGludHIuICovCisgICAgZWlfc3RhdHVzLmRtYWluZyAmPSB+MHgwMTsKK30gLyogZG1hX2Jsb2NrX2lucHV0ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBkbWFfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCSAgICAgY29uc3QgdV9jaGFyICpidWYsIGNvbnN0IGludCBzdGFydF9wYWdlKQoreworICAgIGtpb19hZGRyX3QgbmljX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBwY25ldF9kZXZfdCAqaW5mbyA9IFBSSVYoZGV2KTsKKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgICBpbnQgcmV0cmllcyA9IDA7CisjZW5kaWYKKyAgICB1X2xvbmcgZG1hX3N0YXJ0OworCisjaWZkZWYgUENNQ0lBX0RFQlVHCisgICAgaWYgKGVpX2RlYnVnID4gNCkKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFtibz0lZF1cbiIsIGRldi0+bmFtZSwgY291bnQpOworI2VuZGlmCisKKyAgICAvKiBSb3VuZCB0aGUgY291bnQgdXAgZm9yIHdvcmQgd3JpdGVzLiAgRG8gd2UgbmVlZCB0byBkbyB0aGlzPworICAgICAgIFdoYXQgZWZmZWN0IHdpbGwgYW4gb2RkIGJ5dGUgY291bnQgaGF2ZSBvbiB0aGUgODM5MD8KKyAgICAgICBJIHNob3VsZCBjaGVjayBzb21lZGF5LiAqLworICAgIGlmIChjb3VudCAmIDB4MDEpCisJY291bnQrKzsKKyAgICBpZiAoZWlfc3RhdHVzLmRtYWluZykgeworCXByaW50ayhLRVJOX05PVElDRSAiJXM6IERNQWluZyBjb25mbGljdCBpbiBkbWFfYmxvY2tfb3V0cHV0LiIKKwkgICAgICAgIltETUFzdGF0OiUxeF1baXJxbG9jazolMXhdXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrKTsKKwlyZXR1cm47CisgICAgfQorICAgIGVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKyAgICAvKiBXZSBzaG91bGQgYWxyZWFkeSBiZSBpbiBwYWdlIDAsIGJ1dCB0byBiZSBzYWZlLi4uICovCisgICAgb3V0Yl9wKEU4MzkwX1BBR0UwK0U4MzkwX1NUQVJUK0U4MzkwX05PRE1BLCBuaWNfYmFzZStQQ05FVF9DTUQpOworCisjaWZkZWYgUENNQ0lBX0RFQlVHCisgIHJldHJ5OgorI2VuZGlmCisKKyAgICBvdXRiX3AoRU5JU1JfUkRDLCBuaWNfYmFzZSArIEVOMF9JU1IpOworCisgICAgLyogTm93IHRoZSBub3JtYWwgb3V0cHV0LiAqLworICAgIG91dGJfcChjb3VudCAmIDB4ZmYsIG5pY19iYXNlICsgRU4wX1JDTlRMTyk7CisgICAgb3V0Yl9wKGNvdW50ID4+IDgsICAgbmljX2Jhc2UgKyBFTjBfUkNOVEhJKTsKKyAgICBvdXRiX3AoMHgwMCwgbmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKyAgICBvdXRiX3Aoc3RhcnRfcGFnZSwgbmljX2Jhc2UgKyBFTjBfUlNBUkhJKTsKKworICAgIG91dGJfcChFODM5MF9SV1JJVEUrRTgzOTBfU1RBUlQsIG5pY19iYXNlICsgUENORVRfQ01EKTsKKyAgICBvdXRzdyhuaWNfYmFzZSArIFBDTkVUX0RBVEFQT1JULCBidWYsIGNvdW50Pj4xKTsKKworICAgIGRtYV9zdGFydCA9IGppZmZpZXM7CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgICAvKiBUaGlzIHdhcyBmb3IgdGhlIEFMUEhBIHZlcnNpb24gb25seSwgYnV0IGVub3VnaCBwZW9wbGUgaGF2ZQorICAgICAgIGVuY291bnRlcmluZyBwcm9ibGVtcyB0aGF0IGl0IGlzIHN0aWxsIGhlcmUuICovCisgICAgaWYgKGVpX2RlYnVnID4gNCkgewkvKiBETUEgdGVybWluYXRpb24gYWRkcmVzcyBjaGVjay4uLiAqLworCWludCBhZGRyLCB0cmllcyA9IDIwOworCWRvIHsKKwkgICAgaW50IGhpZ2ggPSBpbmJfcChuaWNfYmFzZSArIEVOMF9SU0FSSEkpOworCSAgICBpbnQgbG93ID0gaW5iX3AobmljX2Jhc2UgKyBFTjBfUlNBUkxPKTsKKwkgICAgYWRkciA9IChoaWdoIDw8IDgpICsgbG93OworCSAgICBpZiAoKHN0YXJ0X3BhZ2UgPDwgOCkgKyBjb3VudCA9PSBhZGRyKQorCQlicmVhazsKKwl9IHdoaWxlICgtLXRyaWVzID4gMCk7CisJaWYgKHRyaWVzIDw9IDApIHsKKwkgICAgcHJpbnRrKEtFUk5fTk9USUNFICIlczogVHggcGFja2V0IHRyYW5zZmVyIGFkZHJlc3MgbWlzbWF0Y2gsIgorCQkgICAiJSM0LjR4IChleHBlY3RlZCkgdnMuICUjNC40eCAoYWN0dWFsKS5cbiIsCisJCSAgIGRldi0+bmFtZSwgKHN0YXJ0X3BhZ2UgPDwgOCkgKyBjb3VudCwgYWRkcik7CisJICAgIGlmIChyZXRyaWVzKysgPT0gMCkKKwkJZ290byByZXRyeTsKKwl9CisgICAgfQorI2VuZGlmCisKKyAgICB3aGlsZSAoKGluYl9wKG5pY19iYXNlICsgRU4wX0lTUikgJiBFTklTUl9SREMpID09IDApCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZG1hX3N0YXJ0ICsgUENORVRfUkRDX1RJTUVPVVQpKSB7CisJICAgIHByaW50ayhLRVJOX05PVElDRSAiJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IgVHggUkRDLlxuIiwKKwkJICAgZGV2LT5uYW1lKTsKKwkgICAgcGNuZXRfcmVzZXRfODM5MChkZXYpOworCSAgICBOUzgzOTBfaW5pdChkZXYsIDEpOworCSAgICBicmVhazsKKwl9CisKKyAgICBvdXRiX3AoRU5JU1JfUkRDLCBuaWNfYmFzZSArIEVOMF9JU1IpOwkvKiBBY2sgaW50ci4gKi8KKyAgICBpZiAoaW5mby0+ZmxhZ3MgJiBERUxBWV9PVVRQVVQpCisJdWRlbGF5KChsb25nKWRlbGF5X3RpbWUpOworICAgIGVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHNldHVwX2RtYV9jb25maWcoZGV2X2xpbmtfdCAqbGluaywgaW50IHN0YXJ0X3BnLAorCQkJICAgIGludCBzdG9wX3BnKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCisgICAgZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBzdGFydF9wZzsKKyAgICBlaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IHN0YXJ0X3BnICsgVFhfUEFHRVM7CisgICAgZWlfc3RhdHVzLnN0b3BfcGFnZSA9IHN0b3BfcGc7CisKKyAgICAvKiBzZXQgdXAgYmxvY2sgaS9vIGZ1bmN0aW9ucyAqLworICAgIGVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmZG1hX2dldF84MzkwX2hkcjsKKyAgICBlaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmZG1hX2Jsb2NrX2lucHV0OworICAgIGVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmZG1hX2Jsb2NrX291dHB1dDsKKworICAgIHJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgY29weWluKHZvaWQgKmRlc3QsIHZvaWQgX19pb21lbSAqc3JjLCBpbnQgYykKK3sKKyAgICB1X3Nob3J0ICpkID0gZGVzdDsKKyAgICB1X3Nob3J0IF9faW9tZW0gKnMgPSBzcmM7CisgICAgaW50IG9kZDsKKworICAgIGlmIChjIDw9IDApCisJcmV0dXJuOworICAgIG9kZCA9IChjICYgMSk7IGMgPj49IDE7CisKKyAgICBpZiAoYykgeworCWRvIHsgKmQrKyA9IF9fcmF3X3JlYWR3KHMrKyk7IH0gd2hpbGUgKC0tYyk7CisgICAgfQorICAgIC8qIGdldCBsYXN0IGJ5dGUgYnkgZmV0Y2hpbmcgYSB3b3JkIGFuZCBtYXNraW5nICovCisgICAgaWYgKG9kZCkKKwkqKCh1X2NoYXIgKilkKSA9IHJlYWR3KHMpICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQgY29weW91dCh2b2lkIF9faW9tZW0gKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgaW50IGMpCit7CisgICAgdV9zaG9ydCBfX2lvbWVtICpkID0gZGVzdDsKKyAgICBjb25zdCB1X3Nob3J0ICpzID0gc3JjOworICAgIGludCBvZGQ7CisKKyAgICBpZiAoYyA8PSAwKQorCXJldHVybjsKKyAgICBvZGQgPSAoYyAmIDEpOyBjID4+PSAxOworCisgICAgaWYgKGMpIHsKKwlkbyB7IF9fcmF3X3dyaXRldygqcysrLCBkKyspOyB9IHdoaWxlICgtLWMpOworICAgIH0KKyAgICAvKiBjb3B5IGxhc3QgYnl0ZSBkb2luZyBhIHJlYWQtbW9kaWZ5LXdyaXRlICovCisgICAgaWYgKG9kZCkKKwl3cml0ZXcoKHJlYWR3KGQpICYgMHhmZjAwKSB8ICoodV9jaGFyICopcywgZCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBzaG1lbV9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLAorCQkJICAgICAgIGludCByaW5nX3BhZ2UpCit7CisgICAgdm9pZCBfX2lvbWVtICp4ZmVyX3N0YXJ0ID0gZWlfc3RhdHVzLm1lbSArIChUWF9QQUdFUzw8OCkKKwkJCQkrIChyaW5nX3BhZ2UgPDwgOCkKKwkJCQktIChlaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA8PCA4KTsKKyAgICAKKyAgICBjb3B5aW4oaGRyLCB4ZmVyX3N0YXJ0LCBzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpKTsKKyAgICAvKiBGaXggZm9yIGJpZyBlbmRpYW4gc3lzdGVtcyAqLworICAgIGhkci0+Y291bnQgPSBsZTE2X3RvX2NwdShoZHItPmNvdW50KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHNobWVtX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCkKK3sKKyAgICB2b2lkIF9faW9tZW0gKnhmZXJfc3RhcnQgPSBlaV9zdGF0dXMubWVtICsgKFRYX1BBR0VTPDw4KQorCQkJCSsgcmluZ19vZmZzZXQKKwkJCQktIChlaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA8PCA4KTsKKyAgICBjaGFyICpidWYgPSBza2ItPmRhdGE7CisgICAgCisgICAgaWYgKHhmZXJfc3RhcnQgKyBjb3VudCA+ICh2b2lkIF9faW9tZW0gKillaV9zdGF0dXMucm1lbV9lbmQpIHsKKwkvKiBXZSBtdXN0IHdyYXAgdGhlIGlucHV0IG1vdmUuICovCisJaW50IHNlbWlfY291bnQgPSAodm9pZCBfX2lvbWVtICopZWlfc3RhdHVzLnJtZW1fZW5kIC0geGZlcl9zdGFydDsKKwljb3B5aW4oYnVmLCB4ZmVyX3N0YXJ0LCBzZW1pX2NvdW50KTsKKwlidWYgKz0gc2VtaV9jb3VudDsKKwl4ZmVyX3N0YXJ0ID0gZWlfc3RhdHVzLm1lbSArIChUWF9QQUdFUzw8OCk7CisJY291bnQgLT0gc2VtaV9jb3VudDsKKyAgICB9CisgICAgY29weWluKGJ1ZiwgeGZlcl9zdGFydCwgY291bnQpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgc2htZW1fYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCSAgICAgICBjb25zdCB1X2NoYXIgKmJ1ZiwgY29uc3QgaW50IHN0YXJ0X3BhZ2UpCit7CisgICAgdm9pZCBfX2lvbWVtICpzaG1lbSA9IGVpX3N0YXR1cy5tZW0gKyAoc3RhcnRfcGFnZSA8PCA4KTsKKyAgICBzaG1lbSAtPSBlaV9zdGF0dXMudHhfc3RhcnRfcGFnZSA8PCA4OworICAgIGNvcHlvdXQoc2htZW0sIGJ1ZiwgY291bnQpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBzZXR1cF9zaG1lbV93aW5kb3coZGV2X2xpbmtfdCAqbGluaywgaW50IHN0YXJ0X3BnLAorCQkJICAgICAgaW50IHN0b3BfcGcsIGludCBjbV9vZmZzZXQpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgcGNuZXRfZGV2X3QgKmluZm8gPSBQUklWKGRldik7CisgICAgd2luX3JlcV90IHJlcTsKKyAgICBtZW1yZXFfdCBtZW07CisgICAgaW50IGksIHdpbmRvd19zaXplLCBvZmZzZXQsIGxhc3RfcmV0LCBsYXN0X2ZuOworCisgICAgd2luZG93X3NpemUgPSAoc3RvcF9wZyAtIHN0YXJ0X3BnKSA8PCA4OworICAgIGlmICh3aW5kb3dfc2l6ZSA+IDMyICogMTAyNCkKKwl3aW5kb3dfc2l6ZSA9IDMyICogMTAyNDsKKworICAgIC8qIE1ha2Ugc3VyZSBpdCdzIGEgcG93ZXIgb2YgdHdvLiAgKi8KKyAgICB3aGlsZSAoKHdpbmRvd19zaXplICYgKHdpbmRvd19zaXplIC0gMSkpICE9IDApCisJd2luZG93X3NpemUgKz0gd2luZG93X3NpemUgJiB+KHdpbmRvd19zaXplIC0gMSk7CisKKyAgICAvKiBBbGxvY2F0ZSBhIG1lbW9yeSB3aW5kb3cgKi8KKyAgICByZXEuQXR0cmlidXRlcyA9IFdJTl9EQVRBX1dJRFRIXzE2fFdJTl9NRU1PUllfVFlQRV9DTXxXSU5fRU5BQkxFOworICAgIHJlcS5BdHRyaWJ1dGVzIHw9IFdJTl9VU0VfV0FJVDsKKyAgICByZXEuQmFzZSA9IDA7IHJlcS5TaXplID0gd2luZG93X3NpemU7CisgICAgcmVxLkFjY2Vzc1NwZWVkID0gbWVtX3NwZWVkOworICAgIENTX0NIRUNLKFJlcXVlc3RXaW5kb3csIHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluay0+aGFuZGxlLCAmcmVxLCAmbGluay0+d2luKSk7CisKKyAgICBtZW0uQ2FyZE9mZnNldCA9IChzdGFydF9wZyA8PCA4KSArIGNtX29mZnNldDsKKyAgICBvZmZzZXQgPSBtZW0uQ2FyZE9mZnNldCAlIHdpbmRvd19zaXplOworICAgIG1lbS5DYXJkT2Zmc2V0IC09IG9mZnNldDsKKyAgICBtZW0uUGFnZSA9IDA7CisgICAgQ1NfQ0hFQ0soTWFwTWVtUGFnZSwgcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLT53aW4sICZtZW0pKTsKKworICAgIC8qIFRyeSBzY3JpYmJsaW5nIG9uIHRoZSBidWZmZXIgKi8KKyAgICBpbmZvLT5iYXNlID0gaW9yZW1hcChyZXEuQmFzZSwgd2luZG93X3NpemUpOworICAgIGZvciAoaSA9IDA7IGkgPCAoVFhfUEFHRVM8PDgpOyBpICs9IDIpCisJX19yYXdfd3JpdGV3KChpPj4xKSwgaW5mby0+YmFzZStvZmZzZXQraSk7CisgICAgdWRlbGF5KDEwMCk7CisgICAgZm9yIChpID0gMDsgaSA8IChUWF9QQUdFUzw8OCk7IGkgKz0gMikKKwlpZiAoX19yYXdfcmVhZHcoaW5mby0+YmFzZStvZmZzZXQraSkgIT0gKGk+PjEpKSBicmVhazsKKyAgICBwY25ldF9yZXNldF84MzkwKGRldik7CisgICAgaWYgKGkgIT0gKFRYX1BBR0VTPDw4KSkgeworCWlvdW5tYXAoaW5mby0+YmFzZSk7CisJcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxpbmstPndpbik7CisJaW5mby0+YmFzZSA9IE5VTEw7IGxpbmstPndpbiA9IE5VTEw7CisJZ290byBmYWlsZWQ7CisgICAgfQorICAgIAorICAgIGVpX3N0YXR1cy5tZW0gPSBpbmZvLT5iYXNlICsgb2Zmc2V0OworICAgIGRldi0+bWVtX3N0YXJ0ID0gKHVfbG9uZyllaV9zdGF0dXMubWVtOworICAgIGRldi0+bWVtX2VuZCA9IGVpX3N0YXR1cy5ybWVtX2VuZCA9ICh1X2xvbmcpaW5mby0+YmFzZSArIHJlcS5TaXplOworCisgICAgZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBzdGFydF9wZzsKKyAgICBlaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IHN0YXJ0X3BnICsgVFhfUEFHRVM7CisgICAgZWlfc3RhdHVzLnN0b3BfcGFnZSA9IHN0YXJ0X3BnICsgKChyZXEuU2l6ZSAtIG9mZnNldCkgPj4gOCk7CisKKyAgICAvKiBzZXQgdXAgYmxvY2sgaS9vIGZ1bmN0aW9ucyAqLworICAgIGVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmc2htZW1fZ2V0XzgzOTBfaGRyOworICAgIGVpX3N0YXR1cy5ibG9ja19pbnB1dCA9ICZzaG1lbV9ibG9ja19pbnB1dDsKKyAgICBlaV9zdGF0dXMuYmxvY2tfb3V0cHV0ID0gJnNobWVtX2Jsb2NrX291dHB1dDsKKworICAgIGluZm8tPmZsYWdzIHw9IFVTRV9TSE1FTTsKKyAgICByZXR1cm4gMDsKKworY3NfZmFpbGVkOgorICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworZmFpbGVkOgorICAgIHJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHBjbmV0X2RyaXZlciA9IHsKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSAicGNuZXRfY3MiLAorCX0sCisJLmF0dGFjaAkJPSBwY25ldF9hdHRhY2gsCisJLmRldGFjaAkJPSBwY25ldF9kZXRhY2gsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9wY25ldF9jcyh2b2lkKQoreworICAgIHJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZwY25ldF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9wY25ldF9jcyh2b2lkKQoreworICAgIERFQlVHKDAsICJwY25ldF9jczogdW5sb2FkaW5nXG4iKTsKKyAgICBwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJnBjbmV0X2RyaXZlcik7CisgICAgQlVHX09OKGRldl9saXN0ICE9IE5VTEwpOworfQorCittb2R1bGVfaW5pdChpbml0X3BjbmV0X2NzKTsKK21vZHVsZV9leGl0KGV4aXRfcGNuZXRfY3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvc21jOTFjOTJfY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWExNTIxNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jCkBAIC0wLDAgKzEsMjI2MCBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBBIFBDTUNJQSBldGhlcm5ldCBkcml2ZXIgZm9yIFNNQzkxYzkyLWJhc2VkIGNhcmRzLgorCisgICAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgTWVnYWhlcnR6IFBDTUNJQSBldGhlcm5ldCBjYXJkczsgYW5kCisgICAgTWVnYWhlcnR6LCBNb3Rvcm9sYSwgT3NpdGVjaCwgYW5kIFBzaW9uIERhY29tIGV0aGVybmV0L21vZGVtCisgICAgbXVsdGlmdW5jdGlvbiBjYXJkcy4KKworICAgIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBBLiBIaW5kcyAtLSBkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorCisgICAgc21jOTFjOTJfY3MuYyAxLjEyMiAyMDAyLzEwLzI1IDA2OjI2OjM5CisKKyAgICBUaGlzIGRyaXZlciBjb250YWlucyBjb2RlIHdyaXR0ZW4gYnkgRG9uYWxkIEJlY2tlcgorICAgIChiZWNrZXJAc2N5bGQuY29tKSwgUm93YW4gSHVnaGVzICh4LWNzcmRoQGpjdS5lZHUuYXUpLAorICAgIERhdmlkIEhpbmRzIChkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCksIGFuZCBFcmlrIFN0YWhsbWFuCisgICAgKGVyaWtAdnQuZWR1KS4gIERvbmFsZCB3cm90ZSB0aGUgU01DIDkxYzkyIGNvZGUgdXNpbmcgcGFydHMgb2YKKyAgICBFcmlrJ3MgU01DIDkxYzk0IGRyaXZlci4gIFJvd2FuIHdyb3RlIGEgc2ltaWxhciBkcml2ZXIsIGFuZCBJJ3ZlCisgICAgaW5jb3Jwb3JhdGVkIHNvbWUgcGFydHMgb2YgaGlzIGRyaXZlciBoZXJlLiAgSSAoRGF2ZSkgd3JvdGUgbW9zdAorICAgIG9mIHRoZSBQQ01DSUEgZ2x1ZSBjb2RlLCBhbmQgdGhlIE9zaXRlY2ggc3VwcG9ydCBjb2RlLiAgS2VsbHkKKyAgICBTdGVwaGVucyAoa3N0ZXBoZW5AaG9sbGkuY29tKSBhZGRlZCBzdXBwb3J0IGZvciB0aGUgTW90b3JvbGEKKyAgICBNYXJpbmVyLCB3aXRoIGhlbHAgZnJvbSBBbGxlbiBCcm9zdC4KKworICAgIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKyAgICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc2NvZGUuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKiBPc2l0ZWNoIFNldmVuIG9mIERpYW1vbmRzIGZpcm13YXJlICovCisjaW5jbHVkZSAib3NpdGVjaC5oIgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGNoYXIgKmlmX25hbWVzW10gPSB7ICJhdXRvIiwgIjEwYmFzZVQiLCAiMTBiYXNlMiJ9OworCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNNQyA5MWM5MiBzZXJpZXMgUENNQ0lBIGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIElOVF9NT0RVTEVfUEFSTShuLCB2KSBzdGF0aWMgaW50IG4gPSB2OyBtb2R1bGVfcGFyYW0obiwgaW50LCAwKQorCisvKgorICBUcmFuc2NlaXZlci9tZWRpYSB0eXBlLgorICAgMCA9IGF1dG8KKyAgIDEgPSAxMGJhc2VUIChhbmQgYXV0b3NlbGVjdCBpZiAjZGVmaW5lIEFVVE9TRUxFQ1QpLAorICAgMiA9IEFVSS8xMGJhc2UyLAorKi8KK0lOVF9NT0RVTEVfUEFSTShpZl9wb3J0LCAwKTsKKworI2lmZGVmIFBDTUNJQV9ERUJVRworSU5UX01PRFVMRV9QQVJNKHBjX2RlYnVnLCBQQ01DSUFfREVCVUcpOworc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb24gPQorInNtYzkxYzkyX2NzLmMgMC4wOSAxOTk2LzgvNCBEb25hbGQgQmVja2VyLCBiZWNrZXJAc2N5bGQuY29tLlxuIjsKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgaWYgKHBjX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncykKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCisjZW5kaWYKKworI2RlZmluZSBEUlZfTkFNRQkic21jOTFjOTJfY3MiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjEyMiIKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlciB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgVHggaHVuZyAqLworI2RlZmluZSBUWF9USU1FT1VUCQkoKDQwMCpIWikvMTAwMCkKKworLyogTWF4aW11bSBldmVudHMgKFJ4IHBhY2tldHMsIGV0Yy4pIHRvIGhhbmRsZSBhdCBlYWNoIGludGVycnVwdC4gKi8KKyNkZWZpbmUgSU5UUl9XT1JLCQk0CisKKy8qIFRpbWVzIHRvIGNoZWNrIHRoZSBjaGVjayB0aGUgY2hpcCBiZWZvcmUgY29uY2x1ZGluZyB0aGF0IGl0IGRvZXNuJ3QKKyAgIGN1cnJlbnRseSBoYXZlIHJvb20gZm9yIGFub3RoZXIgVHggcGFja2V0LiAqLworI2RlZmluZSBNRU1PUllfV0FJVF9USU1FICAgICAgIAk4CisKK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvID0gInNtYzkxYzkyX2NzIjsKKworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0OworCitzdHJ1Y3Qgc21jX3ByaXZhdGUgeworICAgIGRldl9saW5rX3QJCQlsaW5rOworICAgIHNwaW5sb2NrX3QJCQlsb2NrOworICAgIHVfc2hvcnQJCQltYW5maWQ7CisgICAgdV9zaG9ydAkJCWNhcmRpZDsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKKyAgICBkZXZfbm9kZV90CQkJbm9kZTsKKyAgICBzdHJ1Y3Qgc2tfYnVmZgkJKnNhdmVkX3NrYjsKKyAgICBpbnQJCQkJcGFja2V0c193YWl0aW5nOworICAgIHZvaWQJCQlfX2lvbWVtICpiYXNlOworICAgIHVfc2hvcnQJCQljZmc7CisgICAgc3RydWN0IHRpbWVyX2xpc3QJCW1lZGlhOworICAgIGludAkJCQl3YXRjaGRvZywgdHhfZXJyOworICAgIHVfc2hvcnQJCQltZWRpYV9zdGF0dXM7CisgICAgdV9zaG9ydAkJCWZhc3RfcG9sbDsKKyAgICB1X3Nob3J0CQkJbGlua19zdGF0dXM7CisgICAgc3RydWN0IG1paV9pZl9pbmZvCQltaWlfaWY7CisgICAgaW50CQkJCWR1cGxleDsKKyAgICBpbnQJCQkJcnhfb3ZybjsKK307CisKKy8qIFNwZWNpYWwgZGVmaW5pdGlvbnMgZm9yIE1lZ2FoZXJ0eiBtdWx0aWZ1bmN0aW9uIGNhcmRzICovCisjZGVmaW5lIE1FR0FIRVJUWl9JU1IJCTB4MDM4MAorCisvKiBTcGVjaWFsIGZ1bmN0aW9uIHJlZ2lzdGVycyBmb3IgTW90b3JvbGEgTWFyaW5lciAqLworI2RlZmluZSBNT1RfTEFOCQkJMHgwMDAwCisjZGVmaW5lIE1PVF9VQVJUCQkweDAwMjAKKyNkZWZpbmUgTU9UX0VFUFJPTQkJMHgyMAorCisjZGVmaW5lIE1PVF9OT1JNQUwgXAorKENPUl9MRVZFTF9SRVEgfCBDT1JfRlVOQ19FTkEgfCBDT1JfQUREUl9ERUNPREUgfCBDT1JfSVJFUV9FTkEpCisKKy8qIFNwZWNpYWwgZnVuY3Rpb24gcmVnaXN0ZXJzIGZvciBPc2l0ZWNoIGNhcmRzICovCisjZGVmaW5lIE9TSVRFQ0hfQVVJX0NUTAkJMHgwYworI2RlZmluZSBPU0lURUNIX1BXUkRPV04JCTB4MGQKKyNkZWZpbmUgT1NJVEVDSF9SRVNFVAkJMHgwZQorI2RlZmluZSBPU0lURUNIX0lTUgkJMHgwZgorI2RlZmluZSBPU0lURUNIX0FVSV9QV1IJCTB4MGMKKyNkZWZpbmUgT1NJVEVDSF9SRVNFVF9JU1IJMHgwZQorCisjZGVmaW5lIE9TSV9BVUlfUFdSCQkweDQwCisjZGVmaW5lIE9TSV9MQU5fUFdSRE9XTgkJMHgwMgorI2RlZmluZSBPU0lfTU9ERU1fUFdSRE9XTgkweDAxCisjZGVmaW5lIE9TSV9MQU5fUkVTRVQJCTB4MDIKKyNkZWZpbmUgT1NJX01PREVNX1JFU0VUCQkweDAxCisKKy8qIFN5bWJvbGljIGNvbnN0YW50cyBmb3IgdGhlIFNNQzkxYzkqIHNlcmllcyBjaGlwcywgZnJvbSBFcmlrIFN0YWhsbWFuLiAqLworI2RlZmluZQlCQU5LX1NFTEVDVAkJMTQJCS8qIFdpbmRvdyBzZWxlY3QgcmVnaXN0ZXIuICovCisjZGVmaW5lIFNNQ19TRUxFQ1RfQkFOSyh4KSAgeyBvdXR3KHgsIGlvYWRkciArIEJBTktfU0VMRUNUKTsgfQorCisvKiBCYW5rIDAgcmVnaXN0ZXJzLiAqLworI2RlZmluZQlUQ1IgCQkwCS8qIHRyYW5zbWl0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJIFRDUl9DTEVBUgkwCS8qIGRvIE5PVEhJTkcgKi8KKyNkZWZpbmUgIFRDUl9FTkFCTEUJMHgwMDAxCS8qIGlmIHRoaXMgaXMgMSwgd2UgY2FuIHRyYW5zbWl0ICovCisjZGVmaW5lCSBUQ1JfUEFEX0VOCTB4MDA4MAkvKiBwYWRzIHNob3J0IHBhY2tldHMgdG8gNjQgYnl0ZXMgKi8KKyNkZWZpbmUgIFRDUl9NT05DU04JMHgwNDAwICAvKiBNb25pdG9yIENhcnJpZXIuICovCisjZGVmaW5lICBUQ1JfRkRVUExYCTB4MDgwMCAgLyogRnVsbCBkdXBsZXggbW9kZS4gKi8KKyNkZWZpbmUJIFRDUl9OT1JNQUwgVENSX0VOQUJMRSB8IFRDUl9QQURfRU4KKworI2RlZmluZSBFUEgJCTIJLyogRXRoZXJuZXQgUHJvdG9jb2wgSGFuZGxlciByZXBvcnQuICovCisjZGVmaW5lICBFUEhfVFhfU1VDCTB4MDAwMQorI2RlZmluZSAgRVBIX1NOR0xDT0wJMHgwMDAyCisjZGVmaW5lICBFUEhfTVVMQ09MCTB4MDAwNAorI2RlZmluZSAgRVBIX0xUWF9NVUxUCTB4MDAwOAorI2RlZmluZSAgRVBIXzE2Q09MCTB4MDAxMAorI2RlZmluZSAgRVBIX1NRRVQJMHgwMDIwCisjZGVmaW5lICBFUEhfTFRYX0JSRAkweDAwNDAKKyNkZWZpbmUgIEVQSF9UWF9ERUZSCTB4MDA4MAorI2RlZmluZSAgRVBIX0xBVF9DT0wJMHgwMjAwCisjZGVmaW5lICBFUEhfTE9TVF9DQVIJMHgwNDAwCisjZGVmaW5lICBFUEhfRVhDX0RFRgkweDA4MDAKKyNkZWZpbmUgIEVQSF9DVFJfUk9MCTB4MTAwMAorI2RlZmluZSAgRVBIX1JYX09WUk4JMHgyMDAwCisjZGVmaW5lICBFUEhfTElOS19PSwkweDQwMDAKKyNkZWZpbmUgIEVQSF9UWF9VTlJOCTB4ODAwMAorI2RlZmluZSBNRU1JTkZPCQk4CS8qIE1lbW9yeSBJbmZvcm1hdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBNRU1DRkcJCTEwCS8qIE1lbW9yeSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisKKy8qIEJhbmsgMSByZWdpc3RlcnMuICovCisjZGVmaW5lIENPTkZJRwkJCTAKKyNkZWZpbmUgIENGR19NSUlfU0VMRUNUCQkweDgwMDAJLyogOTFDMTAwIG9ubHkgKi8KKyNkZWZpbmUgIENGR19OT19XQUlUCQkweDEwMDAKKyNkZWZpbmUgIENGR19GVUxMX1NURVAJCTB4MDQwMAorI2RlZmluZSAgQ0ZHX1NFVF9TUUxDSAkJMHgwMjAwCisjZGVmaW5lICBDRkdfQVVJX1NFTEVDVAkgCTB4MDEwMAorI2RlZmluZSAgQ0ZHXzE2QklUCQkweDAwODAKKyNkZWZpbmUgIENGR19ESVNfTElOSwkJMHgwMDQwCisjZGVmaW5lICBDRkdfU1RBVElDCQkweDAwMzAKKyNkZWZpbmUgIENGR19JUlFfU0VMXzEJCTB4MDAwNAorI2RlZmluZSAgQ0ZHX0lSUV9TRUxfMAkJMHgwMDAyCisjZGVmaW5lIEJBU0VfQUREUgkJMgorI2RlZmluZQlBRERSMAkJCTQKKyNkZWZpbmUJR0VORVJBTAkJCTEwCisjZGVmaW5lCUNPTlRST0wJCQkxMgorI2RlZmluZSAgQ1RMX1NUT1JFCQkweDAwMDEKKyNkZWZpbmUgIENUTF9SRUxPQUQJCTB4MDAwMgorI2RlZmluZSAgQ1RMX0VFX1NFTEVDVAkJMHgwMDA0CisjZGVmaW5lICBDVExfVEVfRU5BQkxFCQkweDAwMjAKKyNkZWZpbmUgIENUTF9DUl9FTkFCTEUJCTB4MDA0MAorI2RlZmluZSAgQ1RMX0xFX0VOQUJMRQkJMHgwMDgwCisjZGVmaW5lICBDVExfQVVUT19SRUxFQVNFCTB4MDgwMAorI2RlZmluZQkgQ1RMX1BPV0VSRE9XTgkJMHgyMDAwCisKKy8qIEJhbmsgMiByZWdpc3RlcnMuICovCisjZGVmaW5lIE1NVV9DTUQJCTAKKyNkZWZpbmUJIE1DX0FMTE9DCTB4MjAgIAkvKiBvciB3aXRoIG51bWJlciBvZiAyNTYgYnl0ZSBwYWNrZXRzICovCisjZGVmaW5lCSBNQ19SRVNFVAkweDQwCisjZGVmaW5lICBNQ19SRUxFQVNFICAJMHg4MCAgCS8qIHJlbW92ZSBhbmQgcmVsZWFzZSB0aGUgY3VycmVudCByeCBwYWNrZXQgKi8KKyNkZWZpbmUgIE1DX0ZSRUVQS1QgIAkweEEwICAJLyogUmVsZWFzZSBwYWNrZXQgaW4gUE5SIHJlZ2lzdGVyICovCisjZGVmaW5lICBNQ19FTlFVRVVFCTB4QzAgCS8qIEVucXVldWUgdGhlIHBhY2tldCBmb3IgdHJhbnNtaXQgKi8KKyNkZWZpbmUJUE5SX0FSUgkJMgorI2RlZmluZSBGSUZPX1BPUlRTCTQKKyNkZWZpbmUgIEZQX1JYRU1QVFkJMHg4MDAwCisjZGVmaW5lCVBPSU5URVIJCTYKKyNkZWZpbmUgIFBUUl9BVVRPX0lOQwkweDAwNDAKKyNkZWZpbmUgIFBUUl9SRUFECTB4MjAwMAorI2RlZmluZQkgUFRSX0FVVE9JTkMgCTB4NDAwMAorI2RlZmluZQkgUFRSX1JDVgkweDgwMDAKKyNkZWZpbmUJREFUQV8xCQk4CisjZGVmaW5lCUlOVEVSUlVQVAkxMgorI2RlZmluZSAgSU1fUkNWX0lOVAkJMHgxCisjZGVmaW5lCSBJTV9UWF9JTlQJCTB4MgorI2RlZmluZQkgSU1fVFhfRU1QVFlfSU5UCTB4NAorI2RlZmluZQkgSU1fQUxMT0NfSU5UCQkweDgKKyNkZWZpbmUJIElNX1JYX09WUk5fSU5UCQkweDEwCisjZGVmaW5lCSBJTV9FUEhfSU5UCQkweDIwCisKKyNkZWZpbmUJUkNSCQk0CitlbnVtIFJ4Q2ZnIHsgUnhBbGxNdWx0aSA9IDB4MDAwNCwgUnhQcm9taXNjID0gMHgwMDAyLAorCSAgICAgUnhFbmFibGUgPSAweDAxMDAsIFJ4U3RyaXBDUkMgPSAweDAyMDB9OworI2RlZmluZSAgUkNSX1NPRlRSRVNFVAkweDgwMDAgCS8qIHJlc2V0cyB0aGUgY2hpcCAqLworI2RlZmluZQkgUkNSX1NUUklQX0NSQwkweDIwMAkvKiBzdHJpcHMgQ1JDICovCisjZGVmaW5lICBSQ1JfRU5BQkxFCTB4MTAwCS8qIElGRiB0aGlzIGlzIHNldCwgd2UgY2FuIHJlY2VpdmUgcGFja2V0cyAqLworI2RlZmluZSAgUkNSX0FMTVVMCTB4NCAJLyogcmVjZWl2ZSBhbGwgbXVsdGljYXN0IHBhY2tldHMgKi8KKyNkZWZpbmUJIFJDUl9QUk9NSVNDCTB4MgkvKiBlbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworCisvKiB0aGUgbm9ybWFsIHNldHRpbmdzIGZvciB0aGUgUkNSIHJlZ2lzdGVyIDogKi8KKyNkZWZpbmUJIFJDUl9OT1JNQUwJKFJDUl9TVFJJUF9DUkMgfCBSQ1JfRU5BQkxFKQorI2RlZmluZSAgUkNSX0NMRUFSCTB4MAkJLyogc2V0IGl0IHRvIGEgYmFzZSBzdGF0ZSAqLworI2RlZmluZQlDT1VOVEVSCQk2CisKKy8qIEJBTksgMyAtLSBub3QgdGhlIHNhbWUgdmFsdWVzIGFzIGluIHNtYzkxOTQhICovCisjZGVmaW5lCU1VTFRJQ0FTVDAJMAorI2RlZmluZQlNVUxUSUNBU1QyCTIKKyNkZWZpbmUJTVVMVElDQVNUNAk0CisjZGVmaW5lCU1VTFRJQ0FTVDYJNgorI2RlZmluZSBNR01UICAgIAk4CisjZGVmaW5lIFJFVklTSU9OCTB4MGEKKworLyogVHJhbnNtaXQgc3RhdHVzIGJpdHMuICovCisjZGVmaW5lIFRTX1NVQ0NFU1MgMHgwMDAxCisjZGVmaW5lIFRTXzE2Q09MICAgMHgwMDEwCisjZGVmaW5lIFRTX0xBVENPTCAgMHgwMjAwCisjZGVmaW5lIFRTX0xPU1RDQVIgMHgwNDAwCisKKy8qIFJlY2VpdmUgc3RhdHVzIGJpdHMuICovCisjZGVmaW5lIFJTX0FMR05FUlIJMHg4MDAwCisjZGVmaW5lIFJTX0JBRENSQwkweDIwMDAKKyNkZWZpbmUgUlNfT0RERlJBTUUJMHgxMDAwCisjZGVmaW5lIFJTX1RPT0xPTkcJMHgwODAwCisjZGVmaW5lIFJTX1RPT1NIT1JUCTB4MDQwMAorI2RlZmluZSBSU19NVUxUSUNBU1QJMHgwMDAxCisjZGVmaW5lIFJTX0VSUk9SUwkoUlNfQUxHTkVSUiB8IFJTX0JBRENSQyB8IFJTX1RPT0xPTkcgfCBSU19UT09TSE9SVCkKKworI2RlZmluZSBzZXRfYml0cyh2LCBwKSBvdXR3KGludyhwKXwodiksIChwKSkKKyNkZWZpbmUgbWFza19iaXRzKHYsIHApIG91dHcoaW53KHApJih2KSwgKHApKQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGRldl9saW5rX3QgKnNtYzkxYzkyX2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIHNtYzkxYzkyX2RldGFjaChkZXZfbGlua190ICopOworc3RhdGljIHZvaWQgc21jOTFjOTJfY29uZmlnKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIHZvaWQgc21jOTFjOTJfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyBpbnQgc21jOTFjOTJfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpOworCitzdGF0aWMgaW50IHNtY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyB2b2lkIHNtY190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWNfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBzbWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgc21jX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzbWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHM5a19jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApOworc3RhdGljIHZvaWQgc21jX3NldF94Y3ZyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpZl9wb3J0KTsKK3N0YXRpYyB2b2lkIHNtY19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG1lZGlhX2NoZWNrKHVfbG9uZyBhcmcpOworc3RhdGljIHZvaWQgbWRpb19zeW5jKGtpb19hZGRyX3QgYWRkcik7CitzdGF0aWMgaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvYywgaW50IHZhbHVlKTsKK3N0YXRpYyBpbnQgc21jX2xpbmtfb2soc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICBzbWM5MWM5Ml9hdHRhY2goKSBjcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZworICBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQKKyAgd2l0aCBDYXJkIFNlcnZpY2VzLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGRldl9saW5rX3QgKnNtYzkxYzkyX2F0dGFjaCh2b2lkKQoreworICAgIGNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jOworICAgIGRldl9saW5rX3QgKmxpbms7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBpbnQgcmV0OworCisgICAgREVCVUcoMCwgInNtYzkxYzkyX2F0dGFjaCgpXG4iKTsKKworICAgIC8qIENyZWF0ZSBuZXcgZXRoZXJuZXQgZGV2aWNlICovCisgICAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBzbWNfcHJpdmF0ZSkpOworICAgIGlmICghZGV2KQorCXJldHVybiBOVUxMOworICAgIHNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAgbGluayA9ICZzbWMtPmxpbms7CisgICAgbGluay0+cHJpdiA9IGRldjsKKworICAgIHNwaW5fbG9ja19pbml0KCZzbWMtPmxvY2spOworICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDE2OworICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSA0OworICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFIHwgSVJRX0hBTkRMRV9QUkVTRU5UOworICAgIGxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9MRVZFTF9JRDsKKyAgICBsaW5rLT5pcnEuSGFuZGxlciA9ICZzbWNfaW50ZXJydXB0OworICAgIGxpbmstPmlycS5JbnN0YW5jZSA9IGRldjsKKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CisgICAgbGluay0+Y29uZi5WY2MgPSA1MDsKKyAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKworICAgIC8qIFRoZSBTTUM5MWM5Mi1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZzbWNfc3RhcnRfeG1pdDsKKyAgICBkZXYtPmdldF9zdGF0cyA9ICZzbWNfZ2V0X3N0YXRzOworICAgIGRldi0+c2V0X2NvbmZpZyA9ICZzOWtfY29uZmlnOworICAgIGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOworICAgIGRldi0+b3BlbiA9ICZzbWNfb3BlbjsKKyAgICBkZXYtPnN0b3AgPSAmc21jX2Nsb3NlOworICAgIGRldi0+ZG9faW9jdGwgPSAmc21jX2lvY3RsOworICAgIFNFVF9FVEhUT09MX09QUyhkZXYsICZldGh0b29sX29wcyk7CisjaWZkZWYgSEFWRV9UWF9USU1FT1VUCisgICAgZGV2LT50eF90aW1lb3V0ID0gc21jX3R4X3RpbWVvdXQ7CisgICAgZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisjZW5kaWYKKworICAgIHNtYy0+bWlpX2lmLmRldiA9IGRldjsKKyAgICBzbWMtPm1paV9pZi5tZGlvX3JlYWQgPSBtZGlvX3JlYWQ7CisgICAgc21jLT5taWlfaWYubWRpb193cml0ZSA9IG1kaW9fd3JpdGU7CisgICAgc21jLT5taWlfaWYucGh5X2lkX21hc2sgPSAweDFmOworICAgIHNtYy0+bWlpX2lmLnJlZ19udW1fbWFzayA9IDB4MWY7CisKKyAgICAvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisgICAgZGV2X2xpc3QgPSBsaW5rOworICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisgICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKwlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZzbWM5MWM5Ml9ldmVudDsKKyAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKyAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlZ2lzdGVyQ2xpZW50LCByZXQpOworCXNtYzkxYzkyX2RldGFjaChsaW5rKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbGluazsKK30gLyogc21jOTFjOTJfYXR0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQKKyAgICB3aXRoIENhcmQgU2VydmljZXMuICBJZiBpdCBoYXMgYmVlbiByZWxlYXNlZCwgYWxsIGxvY2FsIGRhdGEKKyAgICBzdHJ1Y3R1cmVzIGFyZSBmcmVlZC4gIE90aGVyd2lzZSwgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZSBmcmVlZAorICAgIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHNtYzkxYzkyX2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGRldl9saW5rX3QgKipsaW5rcDsKKworICAgIERFQlVHKDAsICJzbWM5MWM5Ml9kZXRhY2goMHglcClcbiIsIGxpbmspOworCisgICAgLyogTG9jYXRlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKyAgICBmb3IgKGxpbmtwID0gJmRldl9saXN0OyAqbGlua3A7IGxpbmtwID0gJigqbGlua3ApLT5uZXh0KQorCWlmICgqbGlua3AgPT0gbGluaykgYnJlYWs7CisgICAgaWYgKCpsaW5rcCA9PSBOVUxMKQorCXJldHVybjsKKworICAgIGlmIChsaW5rLT5kZXYpCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJc21jOTFjOTJfcmVsZWFzZShsaW5rKTsKKworICAgIGlmIChsaW5rLT5oYW5kbGUpCisJcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGxpbmstPmhhbmRsZSk7CisKKyAgICAvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBiaXRzICovCisgICAgKmxpbmtwID0gbGluay0+bmV4dDsKKyAgICBmcmVlX25ldGRldihkZXYpOworfSAvKiBzbWM5MWM5Ml9kZXRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgY3Z0X2FzY2lpX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqcykKK3sKKyAgICBpbnQgaSwgaiwgZGEsIGM7CisKKyAgICBpZiAoc3RybGVuKHMpICE9IDEyKQorCXJldHVybiAtMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJZGEgPSAwOworCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkgICAgYyA9ICpzKys7CisJICAgIGRhIDw8PSA0OworCSAgICBkYSArPSAoKGMgPj0gJzAnKSAmJiAoYyA8PSAnOScpKSA/CisJCShjIC0gJzAnKSA6ICgoYyAmIDB4MGYpICsgOSk7CisJfQorCWRldi0+ZGV2X2FkZHJbaV0gPSBkYTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGZpcnN0X3R1cGxlKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIHR1cGxlX3QgKnR1cGxlLAorCQljaXNwYXJzZV90ICpwYXJzZSkKK3sKKwlpbnQgaTsKKworCWlmICgoaSA9IHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCB0dXBsZSkpICE9IENTX1NVQ0NFU1MgfHwKKwkJCShpID0gcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgdHVwbGUpKSAhPSBDU19TVUNDRVNTKQorCQlyZXR1cm4gaTsKKwlyZXR1cm4gcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgdHVwbGUsIHBhcnNlKTsKK30KKworc3RhdGljIGludCBuZXh0X3R1cGxlKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIHR1cGxlX3QgKnR1cGxlLAorCQljaXNwYXJzZV90ICpwYXJzZSkKK3sKKwlpbnQgaTsKKworCWlmICgoaSA9IHBjbWNpYV9nZXRfbmV4dF90dXBsZShoYW5kbGUsIHR1cGxlKSkgIT0gQ1NfU1VDQ0VTUyB8fAorCQkJKGkgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCB0dXBsZSkpICE9IENTX1NVQ0NFU1MpCisJCXJldHVybiBpOworCXJldHVybiBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIENvbmZpZ3VyYXRpb24gc3R1ZmYgZm9yIE1lZ2FoZXJ0eiBjYXJkcworCisgICAgbWh6XzMyODhfcG93ZXIoKSBpcyB1c2VkIHRvIHBvd2VyIHVwIGEgMzI4OCdzIGV0aGVybmV0IGNoaXAuCisgICAgbWh6X21mY19jb25maWcoKSBoYW5kbGVzIHNvY2tldCBzZXR1cCBmb3IgbXVsdGlmdW5jdGlvbiAoMTE0NAorICAgIGFuZCAzMjg4KSBjYXJkcy4gIG1oel9zZXR1cCgpIGdldHMgYSBjYXJkJ3MgaGFyZHdhcmUgZXRoZXJuZXQKKyAgICBhZGRyZXNzLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBtaHpfMzI4OF9wb3dlcihkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgdG1wOworCisgICAgLyogUmVhZCB0aGUgSVNSIHR3aWNlLi4uICovCisgICAgcmVhZGIoc21jLT5iYXNlK01FR0FIRVJUWl9JU1IpOworICAgIHVkZWxheSg1KTsKKyAgICByZWFkYihzbWMtPmJhc2UrTUVHQUhFUlRaX0lTUik7CisKKyAgICAvKiBQYXVzZSAyMDBtcy4uLiAqLworICAgIG1kZWxheSgyMDApOworCisgICAgLyogTm93IHJlYWQgYW5kIHdyaXRlIHRoZSBDT1IuLi4gKi8KKyAgICB0bXAgPSByZWFkYihzbWMtPmJhc2UgKyBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgKyBDSVNSRUdfQ09SKTsKKyAgICB1ZGVsYXkoNSk7CisgICAgd3JpdGViKHRtcCwgc21jLT5iYXNlICsgbGluay0+Y29uZi5Db25maWdCYXNlICsgQ0lTUkVHX0NPUik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtaHpfbWZjX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB0dXBsZV90IHR1cGxlOworICAgIGNpc3BhcnNlX3QgcGFyc2U7CisgICAgdV9jaGFyIGJ1ZlsyNTVdOworICAgIGNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmID0gJnBhcnNlLmNmdGFibGVfZW50cnk7CisgICAgd2luX3JlcV90IHJlcTsKKyAgICBtZW1yZXFfdCBtZW07CisgICAgaW50IGksIGs7CisKKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKKyAgICBsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOworICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0KKwlJUlFfVFlQRV9EWU5BTUlDX1NIQVJJTkd8SVJRX0ZJUlNUX1NIQVJFRHxJUlFfSEFORExFX1BSRVNFTlQ7CisgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSAxNjsKKyAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF84OworICAgIGxpbmstPmlvLk51bVBvcnRzMiA9IDg7CisKKyAgICB0dXBsZS5BdHRyaWJ1dGVzID0gdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICAgIHR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CisKKyAgICBpID0gZmlyc3RfdHVwbGUobGluay0+aGFuZGxlLCAmdHVwbGUsICZwYXJzZSk7CisgICAgLyogVGhlIE1lZ2FoZXJ0eiBjb21ibyBjYXJkcyBoYXZlIG1vZGVtLWxpa2UgQ0lTIGVudHJpZXMsIHNvCisgICAgICAgd2UgaGF2ZSB0byBleHBsaWNpdGx5IHRyeSBhIGJ1bmNoIG9mIHBvcnQgY29tYmluYXRpb25zLiAqLworICAgIHdoaWxlIChpID09IENTX1NVQ0NFU1MpIHsKKwlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2YtPmluZGV4OworCWxpbmstPmlvLkJhc2VQb3J0MiA9IGNmLT5pby53aW5bMF0uYmFzZTsKKwlmb3IgKGsgPSAwOyBrIDwgMHg0MDA7IGsgKz0gMHgxMCkgeworCSAgICBpZiAoayAmIDB4ODApIGNvbnRpbnVlOworCSAgICBsaW5rLT5pby5CYXNlUG9ydDEgPSBrIF4gMHgzMDA7CisJICAgIGkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJICAgIGlmIChpID09IENTX1NVQ0NFU1MpIGJyZWFrOworCX0KKwlpZiAoaSA9PSBDU19TVUNDRVNTKSBicmVhazsKKwlpID0gbmV4dF90dXBsZShsaW5rLT5oYW5kbGUsICZ0dXBsZSwgJnBhcnNlKTsKKyAgICB9CisgICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykKKwlyZXR1cm4gaTsKKyAgICBkZXYtPmJhc2VfYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKworICAgIC8qIEFsbG9jYXRlIGEgbWVtb3J5IHdpbmRvdywgZm9yIGFjY2Vzc2luZyB0aGUgSVNSICovCisgICAgcmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF84fFdJTl9NRU1PUllfVFlQRV9BTXxXSU5fRU5BQkxFOworICAgIHJlcS5CYXNlID0gcmVxLlNpemUgPSAwOworICAgIHJlcS5BY2Nlc3NTcGVlZCA9IDA7CisgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluay0+aGFuZGxlLCAmcmVxLCAmbGluay0+d2luKTsKKyAgICBpZiAoaSAhPSBDU19TVUNDRVNTKQorCXJldHVybiBpOworICAgIHNtYy0+YmFzZSA9IGlvcmVtYXAocmVxLkJhc2UsIHJlcS5TaXplKTsKKyAgICBtZW0uQ2FyZE9mZnNldCA9IG1lbS5QYWdlID0gMDsKKyAgICBpZiAoc21jLT5tYW5maWQgPT0gTUFORklEX01PVE9ST0xBKQorCW1lbS5DYXJkT2Zmc2V0ID0gbGluay0+Y29uZi5Db25maWdCYXNlOworICAgIGkgPSBwY21jaWFfbWFwX21lbV9wYWdlKGxpbmstPndpbiwgJm1lbSk7CisKKyAgICBpZiAoKGkgPT0gQ1NfU1VDQ0VTUykKKwkmJiAoc21jLT5tYW5maWQgPT0gTUFORklEX01FR0FIRVJUWikKKwkmJiAoc21jLT5jYXJkaWQgPT0gUFJPRElEX01FR0FIRVJUWl9FTTMyODgpKQorCW1oel8zMjg4X3Bvd2VyKGxpbmspOworCisgICAgcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgbWh6X3NldHVwKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICB0dXBsZV90IHR1cGxlOworICAgIGNpc3BhcnNlX3QgcGFyc2U7CisgICAgdV9jaGFyIGJ1ZlsyNTVdLCAqc3RhdGlvbl9hZGRyOworCisgICAgdHVwbGUuQXR0cmlidXRlcyA9IHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKyAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisKKyAgICAvKiBSZWFkIHRoZSBzdGF0aW9uIGFkZHJlc3MgZnJvbSB0aGUgQ0lTLiAgSXQgaXMgc3RvcmVkIGFzIHRoZSBsYXN0CisgICAgICAgKGZvdXJ0aCkgc3RyaW5nIGluIHRoZSBWZXJzaW9uIDEgVmVyc2lvbi9JRCB0dXBsZS4gKi8KKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfVkVSU18xOworICAgIGlmIChmaXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSAhPSBDU19TVUNDRVNTKQorCXJldHVybiAtMTsKKyAgICAvKiBVZ2ggLS0gdGhlIEVNMTE0NCBjYXJkIGhhcyB0d28gVkVSU18xIHR1cGxlcyE/ISAqLworICAgIGlmIChuZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpICE9IENTX1NVQ0NFU1MpCisJZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSk7CisgICAgaWYgKHBhcnNlLnZlcnNpb25fMS5ucyA+IDMpIHsKKwlzdGF0aW9uX2FkZHIgPSBwYXJzZS52ZXJzaW9uXzEuc3RyICsgcGFyc2UudmVyc2lvbl8xLm9mc1szXTsKKwlpZiAoY3Z0X2FzY2lpX2FkZHJlc3MoZGV2LCBzdGF0aW9uX2FkZHIpID09IDApCisJICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIEFub3RoZXIgcG9zc2liaWxpdHk6IGZvciB0aGUgRU0zMjg4LCBpbiBhIHNwZWNpYWwgdHVwbGUgKi8KKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSAweDgxOworICAgIGlmIChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSAhPSBDU19TVUNDRVNTKQorCXJldHVybiAtMTsKKyAgICBpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSAhPSBDU19TVUNDRVNTKQorCXJldHVybiAtMTsKKyAgICBidWZbMTJdID0gJ1wwJzsKKyAgICBpZiAoY3Z0X2FzY2lpX2FkZHJlc3MoZGV2LCBidWYpID09IDApCisJcmV0dXJuIDA7CisKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQ29uZmlndXJhdGlvbiBzdHVmZiBmb3IgdGhlIE1vdG9yb2xhIE1hcmluZXIKKworICAgIG1vdF9jb25maWcoKSB3cml0ZXMgZGlyZWN0bHkgdG8gdGhlIE1hcmluZXIgY29uZmlndXJhdGlvbgorICAgIHJlZ2lzdGVycyBiZWNhdXNlIHRoZSBDSVMgaXMganVzdCBib2d1cy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIG1vdF9jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBraW9fYWRkcl90IGlvdWFydCA9IGxpbmstPmlvLkJhc2VQb3J0MjsKKworICAgIC8qIFNldCBVQVJUIGJhc2UgYWRkcmVzcyBhbmQgZm9yY2UgbWFwIHdpdGggQ09SIGJpdCAxICovCisgICAgd3JpdGViKGlvdWFydCAmIDB4ZmYsICAgICAgICBzbWMtPmJhc2UgKyBNT1RfVUFSVCArIENJU1JFR19JT0JBU0VfMCk7CisgICAgd3JpdGViKChpb3VhcnQgPj4gOCkgJiAweGZmLCBzbWMtPmJhc2UgKyBNT1RfVUFSVCArIENJU1JFR19JT0JBU0VfMSk7CisgICAgd3JpdGViKE1PVF9OT1JNQUwsICAgICAgICAgICBzbWMtPmJhc2UgKyBNT1RfVUFSVCArIENJU1JFR19DT1IpOworCisgICAgLyogU2V0IFNNQyBiYXNlIGFkZHJlc3MgYW5kIGZvcmNlIG1hcCB3aXRoIENPUiBiaXQgMSAqLworICAgIHdyaXRlYihpb2FkZHIgJiAweGZmLCAgICAgICAgc21jLT5iYXNlICsgTU9UX0xBTiArIENJU1JFR19JT0JBU0VfMCk7CisgICAgd3JpdGViKChpb2FkZHIgPj4gOCkgJiAweGZmLCBzbWMtPmJhc2UgKyBNT1RfTEFOICsgQ0lTUkVHX0lPQkFTRV8xKTsKKyAgICB3cml0ZWIoTU9UX05PUk1BTCwgICAgICAgICAgIHNtYy0+YmFzZSArIE1PVF9MQU4gKyBDSVNSRUdfQ09SKTsKKworICAgIC8qIFdhaXQgZm9yIHRoaW5ncyB0byBzZXR0bGUgZG93biAqLworICAgIG1kZWxheSgxMDApOworfQorCitzdGF0aWMgaW50IG1vdF9zZXR1cChkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGksIHdhaXQsIGxvb3A7CisgICAgdV9pbnQgYWRkcjsKKworICAgIC8qIFJlYWQgRXRoZXJuZXQgYWRkcmVzcyBmcm9tIFNlcmlhbCBFRVBST00gKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwlTTUNfU0VMRUNUX0JBTksoMik7CisJb3V0dyhNT1RfRUVQUk9NICsgaSwgaW9hZGRyICsgUE9JTlRFUik7CisJU01DX1NFTEVDVF9CQU5LKDEpOworCW91dHcoKENUTF9SRUxPQUQgfCBDVExfRUVfU0VMRUNUKSwgaW9hZGRyICsgQ09OVFJPTCk7CisKKwlmb3IgKGxvb3AgPSB3YWl0ID0gMDsgbG9vcCA8IDIwMDsgbG9vcCsrKSB7CisJICAgIHVkZWxheSgxMCk7CisJICAgIHdhaXQgPSAoKENUTF9SRUxPQUQgfCBDVExfU1RPUkUpICYgaW53KGlvYWRkciArIENPTlRST0wpKTsKKwkgICAgaWYgKHdhaXQgPT0gMCkgYnJlYWs7CisJfQorCQorCWlmICh3YWl0KQorCSAgICByZXR1cm4gLTE7CisJCisJYWRkciA9IGludyhpb2FkZHIgKyBHRU5FUkFMKTsKKwlkZXYtPmRldl9hZGRyWzIqaV0gICA9IGFkZHIgJiAweGZmOworCWRldi0+ZGV2X2FkZHJbMippKzFdID0gKGFkZHIgPj4gOCkgJiAweGZmOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBzbWNfY29uZmlnKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICBjaXNwYXJzZV90IHBhcnNlOworICAgIHVfY2hhciBidWZbMjU1XTsKKyAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZiA9ICZwYXJzZS5jZnRhYmxlX2VudHJ5OworICAgIGludCBpOworCisgICAgdHVwbGUuQXR0cmlidXRlcyA9IHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKyAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOworICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworCisgICAgbGluay0+aW8uTnVtUG9ydHMxID0gMTY7CisgICAgaSA9IGZpcnN0X3R1cGxlKGxpbmstPmhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpOworICAgIHdoaWxlIChpICE9IENTX05PX01PUkVfSVRFTVMpIHsKKwlpZiAoaSA9PSBDU19TVUNDRVNTKSB7CisJICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSBjZi0+aW5kZXg7CisJICAgIGxpbmstPmlvLkJhc2VQb3J0MSA9IGNmLT5pby53aW5bMF0uYmFzZTsKKwkgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSBjZi0+aW8uZmxhZ3MgJiBDSVNUUExfSU9fTElORVNfTUFTSzsKKwkgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwkgICAgaWYgKGkgPT0gQ1NfU1VDQ0VTUykgYnJlYWs7CisJfQorCWkgPSBuZXh0X3R1cGxlKGxpbmstPmhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpOworICAgIH0KKyAgICBpZiAoaSA9PSBDU19TVUNDRVNTKQorCWRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworICAgIHJldHVybiBpOworfQorCitzdGF0aWMgaW50IHNtY19zZXR1cChkZXZfbGlua190ICpsaW5rKQoreworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICBjaXNwYXJzZV90IHBhcnNlOworICAgIGNpc3RwbF9sYW5fbm9kZV9pZF90ICpub2RlX2lkOworICAgIHVfY2hhciBidWZbMjU1XSwgKnN0YXRpb25fYWRkcjsKKyAgICBpbnQgaTsKKworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgdHVwbGUuVHVwbGVEYXRhID0gYnVmOworICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOworCisgICAgLyogQ2hlY2sgZm9yIGEgTEFOIGZ1bmN0aW9uIGV4dGVuc2lvbiB0dXBsZSAqLworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9GVU5DRTsKKyAgICBpID0gZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSk7CisgICAgd2hpbGUgKGkgPT0gQ1NfU1VDQ0VTUykgeworCWlmIChwYXJzZS5mdW5jZS50eXBlID09IENJU1RQTF9GVU5DRV9MQU5fTk9ERV9JRCkKKwkgICAgYnJlYWs7CisJaSA9IG5leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSk7CisgICAgfQorICAgIGlmIChpID09IENTX1NVQ0NFU1MpIHsKKwlub2RlX2lkID0gKGNpc3RwbF9sYW5fbm9kZV9pZF90ICopcGFyc2UuZnVuY2UuZGF0YTsKKwlpZiAobm9kZV9pZC0+bmIgPT0gNikgeworCSAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gbm9kZV9pZC0+aWRbaV07CisJICAgIHJldHVybiAwOworCX0KKyAgICB9CisgICAgLyogVHJ5IHRoZSB0aGlyZCBzdHJpbmcgaW4gdGhlIFZlcnNpb24gMSBWZXJzaW9uL0lEIHR1cGxlLiAqLworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9WRVJTXzE7CisgICAgaWYgKGZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpICE9IENTX1NVQ0NFU1MpCisJcmV0dXJuIC0xOworICAgIHN0YXRpb25fYWRkciA9IHBhcnNlLnZlcnNpb25fMS5zdHIgKyBwYXJzZS52ZXJzaW9uXzEub2ZzWzJdOworICAgIGlmIChjdnRfYXNjaWlfYWRkcmVzcyhkZXYsIHN0YXRpb25fYWRkcikgPT0gMCkKKwlyZXR1cm4gMDsKKworICAgIHJldHVybiAtMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgb3NpX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIHN0YXRpYyBraW9fYWRkcl90IGNvbVs0XSA9IHsgMHgzZjgsIDB4MmY4LCAweDNlOCwgMHgyZTggfTsKKyAgICBpbnQgaSwgajsKKworICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9TUEtSOworICAgIGxpbmstPmNvbmYuU3RhdHVzID0gQ0NTUl9BVURJT19FTkE7CisgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPQorCUlSUV9UWVBFX0RZTkFNSUNfU0hBUklOR3xJUlFfRklSU1RfU0hBUkVEfElSUV9IQU5ETEVfUFJFU0VOVDsKKyAgICBsaW5rLT5pby5OdW1Qb3J0czEgPSA2NDsKKyAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IElPX0RBVEFfUEFUSF9XSURUSF84OworICAgIGxpbmstPmlvLk51bVBvcnRzMiA9IDg7CisgICAgbGluay0+aW8uSU9BZGRyTGluZXMgPSAxNjsKKworICAgIC8qIEVuYWJsZSBIYXJkIERlY29kZSwgTEFOLCBNb2RlbSAqLworICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAweDIzOworCisgICAgZm9yIChpID0gaiA9IDA7IGogPCA0OyBqKyspIHsKKwlsaW5rLT5pby5CYXNlUG9ydDIgPSBjb21bal07CisJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwlpZiAoaSA9PSBDU19TVUNDRVNTKSBicmVhazsKKyAgICB9CisgICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykgeworCS8qIEZhbGxiYWNrOiB0dXJuIG9mZiBoYXJkIGRlY29kZSAqLworCWxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAweDAzOworCWxpbmstPmlvLk51bVBvcnRzMiA9IDA7CisJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgICB9CisgICAgZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDEgKyAweDEwOworICAgIHJldHVybiBpOworfQorCitzdGF0aWMgaW50IG9zaV9zZXR1cChkZXZfbGlua190ICpsaW5rLCB1X3Nob3J0IG1hbmZpZCwgdV9zaG9ydCBjYXJkaWQpCit7CisgICAgY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICB0dXBsZV90IHR1cGxlOworICAgIHVfY2hhciBidWZbMjU1XTsKKyAgICBpbnQgaTsKKworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSBUVVBMRV9SRVRVUk5fQ09NTU9OOworICAgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKKyAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisKKyAgICAvKiBSZWFkIHRoZSBzdGF0aW9uIGFkZHJlc3MgZnJvbSB0dXBsZSAweDkwLCBzdWJ0dXBsZSAweDA0ICovCisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gMHg5MDsKKyAgICBpID0gcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSk7CisgICAgd2hpbGUgKGkgPT0gQ1NfU1VDQ0VTUykgeworCWkgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpOworCWlmICgoaSAhPSBDU19TVUNDRVNTKSB8fCAoYnVmWzBdID09IDB4MDQpKQorCSAgICBicmVhazsKKwlpID0gcGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKTsKKyAgICB9CisgICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykKKwlyZXR1cm4gLTE7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlkZXYtPmRldl9hZGRyW2ldID0gYnVmW2krMl07CisKKyAgICBpZiAoKChtYW5maWQgPT0gTUFORklEX09TSVRFQ0gpICYmCisJIChjYXJkaWQgPT0gUFJPRElEX09TSVRFQ0hfU0VWRU4pKSB8fAorCSgobWFuZmlkID09IE1BTkZJRF9QU0lPTikgJiYKKwkgKGNhcmRpZCA9PSBQUk9ESURfUFNJT05fTkVUMTAwKSkpIHsKKwkvKiBEb3dubG9hZCB0aGUgU2V2ZW4gb2YgRGlhbW9uZHMgZmlybXdhcmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKF9fWGlsaW54N09EKTsgaSsrKSB7CisJICAgIG91dGIoX19YaWxpbng3T0RbaV0sIGxpbmstPmlvLkJhc2VQb3J0MSsyKTsKKwkgICAgdWRlbGF5KDUwKTsKKwl9CisgICAgfSBlbHNlIGlmIChtYW5maWQgPT0gTUFORklEX09TSVRFQ0gpIHsKKwkvKiBNYWtlIHN1cmUgYm90aCBmdW5jdGlvbnMgYXJlIHBvd2VyZWQgdXAgKi8KKwlzZXRfYml0cygweDMwMCwgbGluay0+aW8uQmFzZVBvcnQxICsgT1NJVEVDSF9BVUlfUFdSKTsKKwkvKiBOb3csIHR1cm4gb24gdGhlIGludGVycnVwdCBmb3IgYm90aCBjYXJkIGZ1bmN0aW9ucyAqLworCXNldF9iaXRzKDB4MzAwLCBsaW5rLT5pby5CYXNlUG9ydDEgKyBPU0lURUNIX1JFU0VUX0lTUik7CisJREVCVUcoMiwgIkFVSS9QV1I6ICU0LjR4IFJFU0VUL0lTUjogJTQuNHhcbiIsCisJICAgICAgaW53KGxpbmstPmlvLkJhc2VQb3J0MSArIE9TSVRFQ0hfQVVJX1BXUiksCisJICAgICAgaW53KGxpbmstPmlvLkJhc2VQb3J0MSArIE9TSVRFQ0hfUkVTRVRfSVNSKSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhpcyB2ZXJpZmllcyB0aGF0IHRoZSBjaGlwIGlzIHNvbWUgU01DOTFjWFggdmFyaWFudCwgYW5kIHJldHVybnMKKyAgICB0aGUgcmV2aXNpb24gY29kZSBpZiBzdWNjZXNzZnVsLiAgT3RoZXJ3aXNlLCBpdCByZXR1cm5zIC1FTk9ERVYuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGNoZWNrX3NpZyhkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IHdpZHRoOworICAgIHVfc2hvcnQgczsKKworICAgIFNNQ19TRUxFQ1RfQkFOSygxKTsKKyAgICBpZiAoaW53KGlvYWRkciArIEJBTktfU0VMRUNUKSA+PiA4ICE9IDB4MzMpIHsKKwkvKiBUcnkgcG93ZXJpbmcgdXAgdGhlIGNoaXAgKi8KKwlvdXR3KDAsIGlvYWRkciArIENPTlRST0wpOworCW1kZWxheSg1NSk7CisgICAgfQorCisgICAgLyogVHJ5IHNldHRpbmcgYnVzIHdpZHRoICovCisgICAgd2lkdGggPSAobGluay0+aW8uQXR0cmlidXRlczEgPT0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE8pOworICAgIHMgPSBpbmIoaW9hZGRyICsgQ09ORklHKTsKKyAgICBpZiAod2lkdGgpCisJcyB8PSBDRkdfMTZCSVQ7CisgICAgZWxzZQorCXMgJj0gfkNGR18xNkJJVDsKKyAgICBvdXRiKHMsIGlvYWRkciArIENPTkZJRyk7CisKKyAgICAvKiBDaGVjayBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgdG8gbWFrZSBzdXJlIGJ1cyB3aWR0aCBpcyBPSyAqLworICAgIHMgPSBpbncoaW9hZGRyICsgQkFTRV9BRERSKTsKKyAgICBpZiAoKGludyhpb2FkZHIgKyBCQU5LX1NFTEVDVCkgPj4gOCA9PSAweDMzKSAmJgorCSgocyA+PiA4KSAhPSAocyAmIDB4ZmYpKSkgeworCVNNQ19TRUxFQ1RfQkFOSygzKTsKKwlzID0gaW53KGlvYWRkciArIFJFVklTSU9OKTsKKwlyZXR1cm4gKHMgJiAweGZmKTsKKyAgICB9CisKKyAgICBpZiAod2lkdGgpIHsKKwlldmVudF9jYWxsYmFja19hcmdzX3QgYXJnczsKKwlwcmludGsoS0VSTl9JTkZPICJzbWM5MWM5Ml9jczogdXNpbmcgOC1iaXQgSU8gd2luZG93LlxuIik7CisJYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisJc21jOTFjOTJfZXZlbnQoQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwsIDAsICZhcmdzKTsKKwlwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKwlwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJc21jOTFjOTJfZXZlbnQoQ1NfRVZFTlRfQ0FSRF9SRVNFVCwgMCwgJmFyZ3MpOworCXJldHVybiBjaGVja19zaWcobGluayk7CisgICAgfQorICAgIHJldHVybiAtRU5PREVWOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIHNtYzkxYzkyX2NvbmZpZygpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudAorICAgIGlzIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZQorICAgIGV0aGVybmV0IGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgQ1NfRVhJVF9URVNUKHJldCwgc3ZjLCBsYWJlbCkgXAoraWYgKHJldCAhPSBDU19TVUNDRVNTKSB7IGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgc3ZjLCByZXQpOyBnb3RvIGxhYmVsOyB9CisKK3N0YXRpYyB2b2lkIHNtYzkxYzkyX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHR1cGxlX3QgdHVwbGU7CisgICAgY2lzcGFyc2VfdCBwYXJzZTsKKyAgICB1X3Nob3J0IGJ1ZlszMl07CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgaSwgaiwgcmV2OworICAgIGtpb19hZGRyX3QgaW9hZGRyOworICAgIHVfbG9uZyBtaXI7CisKKyAgICBERUJVRygwLCAic21jOTFjOTJfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKKworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKKworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisgICAgaSA9IGZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpOworICAgIENTX0VYSVRfVEVTVChpLCBQYXJzZVR1cGxlLCBjb25maWdfZmFpbGVkKTsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CisKKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfTUFORklEOworICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSBUVVBMRV9SRVRVUk5fQ09NTU9OOworICAgIGlmIChmaXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSA9PSBDU19TVUNDRVNTKSB7CisJc21jLT5tYW5maWQgPSBwYXJzZS5tYW5maWQubWFuZjsKKwlzbWMtPmNhcmRpZCA9IHBhcnNlLm1hbmZpZC5jYXJkOworICAgIH0KKworICAgIC8qIENvbmZpZ3VyZSBjYXJkICovCisgICAgbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKworICAgIGlmICgoc21jLT5tYW5maWQgPT0gTUFORklEX09TSVRFQ0gpICYmCisJKHNtYy0+Y2FyZGlkICE9IFBST0RJRF9PU0lURUNIX1NFVkVOKSkgeworCWkgPSBvc2lfY29uZmlnKGxpbmspOworICAgIH0gZWxzZSBpZiAoKHNtYy0+bWFuZmlkID09IE1BTkZJRF9NT1RPUk9MQSkgfHwKKwkgICAgICAgKChzbWMtPm1hbmZpZCA9PSBNQU5GSURfTUVHQUhFUlRaKSAmJgorCQkoKHNtYy0+Y2FyZGlkID09IFBST0RJRF9NRUdBSEVSVFpfVkFSSU9VUykgfHwKKwkJIChzbWMtPmNhcmRpZCA9PSBQUk9ESURfTUVHQUhFUlRaX0VNMzI4OCkpKSkgeworCWkgPSBtaHpfbWZjX2NvbmZpZyhsaW5rKTsKKyAgICB9IGVsc2UgeworCWkgPSBzbWNfY29uZmlnKGxpbmspOworICAgIH0KKyAgICBDU19FWElUX1RFU1QoaSwgUmVxdWVzdElPLCBjb25maWdfZmFpbGVkKTsKKworICAgIGkgPSBwY21jaWFfcmVxdWVzdF9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKyAgICBDU19FWElUX1RFU1QoaSwgUmVxdWVzdElSUSwgY29uZmlnX2ZhaWxlZCk7CisgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisgICAgQ1NfRVhJVF9URVNUKGksIFJlcXVlc3RDb25maWd1cmF0aW9uLCBjb25maWdfZmFpbGVkKTsKKworICAgIGlmIChzbWMtPm1hbmZpZCA9PSBNQU5GSURfTU9UT1JPTEEpCisJbW90X2NvbmZpZyhsaW5rKTsKKworICAgIGRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworCisgICAgaWYgKChpZl9wb3J0ID49IDApICYmIChpZl9wb3J0IDw9IDIpKQorCWRldi0+aWZfcG9ydCA9IGlmX3BvcnQ7CisgICAgZWxzZQorCXByaW50ayhLRVJOX05PVElDRSAic21jOTFjOTJfY3M6IGludmFsaWQgaWZfcG9ydCByZXF1ZXN0ZWRcbiIpOworCisgICAgc3dpdGNoIChzbWMtPm1hbmZpZCkgeworICAgIGNhc2UgTUFORklEX09TSVRFQ0g6CisgICAgY2FzZSBNQU5GSURfUFNJT046CisJaSA9IG9zaV9zZXR1cChsaW5rLCBzbWMtPm1hbmZpZCwgc21jLT5jYXJkaWQpOyBicmVhazsKKyAgICBjYXNlIE1BTkZJRF9TTUM6CisgICAgY2FzZSBNQU5GSURfTkVXX01FRElBOgorCWkgPSBzbWNfc2V0dXAobGluayk7IGJyZWFrOworICAgIGNhc2UgMHgxMjg6IC8qIEZvciBicm9rZW4gTWVnYWhlcnR6IGNhcmRzICovCisgICAgY2FzZSBNQU5GSURfTUVHQUhFUlRaOgorCWkgPSBtaHpfc2V0dXAobGluayk7IGJyZWFrOworICAgIGNhc2UgTUFORklEX01PVE9ST0xBOgorICAgIGRlZmF1bHQ6IC8qIGdldCB0aGUgaHcgYWRkcmVzcyBmcm9tIEVFUFJPTSAqLworCWkgPSBtb3Rfc2V0dXAobGluayk7IGJyZWFrOworICAgIH0KKworICAgIGlmIChpICE9IDApIHsKKwlwcmludGsoS0VSTl9OT1RJQ0UgInNtYzkxYzkyX2NzOiBVbmFibGUgdG8gZmluZCBoYXJkd2FyZSBhZGRyZXNzLlxuIik7CisJZ290byBjb25maWdfdW5kbzsKKyAgICB9CisKKyAgICBzbWMtPmR1cGxleCA9IDA7CisgICAgc21jLT5yeF9vdnJuID0gMDsKKworICAgIHJldiA9IGNoZWNrX3NpZyhsaW5rKTsKKyAgICBuYW1lID0gIj8/PyI7CisgICAgaWYgKHJldiA+IDApCisJc3dpdGNoIChyZXYgPj4gNCkgeworCWNhc2UgMzogbmFtZSA9ICI5MiI7IGJyZWFrOworCWNhc2UgNDogbmFtZSA9ICgocmV2ICYgMTUpID49IDYpID8gIjk2IiA6ICI5NCI7IGJyZWFrOworCWNhc2UgNTogbmFtZSA9ICI5NSI7IGJyZWFrOworCWNhc2UgNzogbmFtZSA9ICIxMDAiOyBicmVhazsKKwljYXNlIDg6IG5hbWUgPSAiMTAwLUZEIjsgYnJlYWs7CisJY2FzZSA5OiBuYW1lID0gIjExMCI7IGJyZWFrOworCX0KKworICAgIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGlmIChyZXYgPiAwKSB7CisJdV9sb25nIG1jcjsKKwlTTUNfU0VMRUNUX0JBTksoMCk7CisJbWlyID0gaW53KGlvYWRkciArIE1FTUlORk8pICYgMHhmZjsKKwlpZiAobWlyID09IDB4ZmYpIG1pcisrOworCS8qIEdldCBzY2FsZSBmYWN0b3IgZm9yIG1lbW9yeSBzaXplICovCisJbWNyID0gKChyZXYgPj4gNCkgPiAzKSA/IGludyhpb2FkZHIgKyBNRU1DRkcpIDogMHgwMjAwOworCW1pciAqPSAxMjggKiAoMTw8KChtY3IgPj4gOSkgJiA3KSk7CisJU01DX1NFTEVDVF9CQU5LKDEpOworCXNtYy0+Y2ZnID0gaW53KGlvYWRkciArIENPTkZJRykgJiB+Q0ZHX0FVSV9TRUxFQ1Q7CisJc21jLT5jZmcgfD0gQ0ZHX05PX1dBSVQgfCBDRkdfMTZCSVQgfCBDRkdfU1RBVElDOworCWlmIChzbWMtPm1hbmZpZCA9PSBNQU5GSURfT1NJVEVDSCkKKwkgICAgc21jLT5jZmcgfD0gQ0ZHX0lSUV9TRUxfMSB8IENGR19JUlFfU0VMXzA7CisJaWYgKChyZXYgPj4gNCkgPj0gNykKKwkgICAgc21jLT5jZmcgfD0gQ0ZHX01JSV9TRUxFQ1Q7CisgICAgfSBlbHNlCisJbWlyID0gMDsKKworICAgIGlmIChzbWMtPmNmZyAmIENGR19NSUlfU0VMRUNUKSB7CisJU01DX1NFTEVDVF9CQU5LKDMpOworCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkgICAgaiA9IG1kaW9fcmVhZChkZXYsIGksIDEpOworCSAgICBpZiAoKGogIT0gMCkgJiYgKGogIT0gMHhmZmZmKSkgYnJlYWs7CisJfQorCXNtYy0+bWlpX2lmLnBoeV9pZCA9IChpIDwgMzIpID8gaSA6IC0xOworCisJU01DX1NFTEVDVF9CQU5LKDApOworICAgIH0KKworICAgIGxpbmstPmRldiA9ICZzbWMtPm5vZGU7CisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKyAgICBTRVRfTkVUREVWX0RFVihkZXYsICZoYW5kbGVfdG9fZGV2KGhhbmRsZSkpOworCisgICAgaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpICE9IDApIHsKKwlwcmludGsoS0VSTl9FUlIgInNtYzkxYzkyX2NzOiByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWRcbiIpOworCWxpbmstPmRldiA9IE5VTEw7CisJZ290byBjb25maWdfdW5kbzsKKyAgICB9CisKKyAgICBzdHJjcHkoc21jLT5ub2RlLmRldl9uYW1lLCBkZXYtPm5hbWUpOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNtYzkxYyVzIHJldiAlZDogaW8gJSMzbHgsIGlycSAlZCwgIgorCSAgICJod19hZGRyICIsIGRldi0+bmFtZSwgbmFtZSwgKHJldiAmIDB4MGYpLCBkZXYtPmJhc2VfYWRkciwKKwkgICBkZXYtPmlycSk7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlwcmludGsoIiUwMlglcyIsIGRldi0+ZGV2X2FkZHJbaV0sICgoaTw1KSA/ICI6IiA6ICJcbiIpKTsKKworICAgIGlmIChyZXYgPiAwKSB7CisJaWYgKG1pciAmIDB4M2ZmKQorCSAgICBwcmludGsoS0VSTl9JTkZPICIgICVsdSBieXRlIiwgbWlyKTsKKwllbHNlCisJICAgIHByaW50ayhLRVJOX0lORk8gIiAgJWx1IGtiIiwgbWlyPj4xMCk7CisJcHJpbnRrKCIgYnVmZmVyLCAlcyB4Y3ZyXG4iLCAoc21jLT5jZmcgJiBDRkdfTUlJX1NFTEVDVCkgPworCSAgICAgICAiTUlJIiA6IGlmX25hbWVzW2Rldi0+aWZfcG9ydF0pOworICAgIH0KKworICAgIGlmIChzbWMtPmNmZyAmIENGR19NSUlfU0VMRUNUKSB7CisJaWYgKHNtYy0+bWlpX2lmLnBoeV9pZCAhPSAtMSkgeworCSAgICBERUJVRygwLCAiICBNSUkgdHJhbnNjZWl2ZXIgYXQgaW5kZXggJWQsIHN0YXR1cyAleC5cbiIsCisJCSAgc21jLT5taWlfaWYucGh5X2lkLCBqKTsKKwl9IGVsc2UgeworICAgIAkgICAgcHJpbnRrKEtFUk5fTk9USUNFICIgIE5vIE1JSSB0cmFuc2NlaXZlcnMgZm91bmQhXG4iKTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuOworCitjb25maWdfdW5kbzoKKyAgICB1bnJlZ2lzdGVyX25ldGRldihkZXYpOworY29uZmlnX2ZhaWxlZDoJCQkvKiBDU19FWElUX1RFU1QoKSBjYWxscyBqdW1wIHRvIGhlcmUuLi4gKi8KKyAgICBzbWM5MWM5Ml9yZWxlYXNlKGxpbmspOworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisKK30gLyogc21jOTFjOTJfY29uZmlnICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIHNtYzkxYzkyX3JlbGVhc2UoKSB3aWxsIHVucmVnaXN0ZXIgdGhlIG5ldAorICAgIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICAgIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgc21jOTFjOTJfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworCisgICAgREVCVUcoMCwgInNtYzkxYzkyX3JlbGVhc2UoMHglcClcbiIsIGxpbmspOworCisgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworICAgIHBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgICBwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKyAgICBpZiAobGluay0+d2luKSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisJc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworCWlvdW5tYXAoc21jLT5iYXNlKTsKKwlwY21jaWFfcmVsZWFzZV93aW5kb3cobGluay0+d2luKTsKKyAgICB9CisKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gIE1vc3RseSwgdGhpcyBzY2hlZHVsZXMgb3RoZXIKKyAgICBzdHVmZiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuICBBIENBUkRfUkVNT1ZBTCBldmVudAorICAgIGFsc28gc2V0cyBzb21lIGZsYWdzIHRvIGRpc2NvdXJhZ2UgdGhlIG5ldCBkcml2ZXJzIGZyb20gdHJ5aW5nCisgICAgdG8gdGFsayB0byB0aGUgY2FyZCBhbnkgbW9yZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgc21jOTFjOTJfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCit7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBpbnQgaTsKKworICAgIERFQlVHKDEsICJzbWM5MWM5Ml9ldmVudCgweCUwNngpXG4iLCBldmVudCk7CisKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJICAgIG5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorCWxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOworCXNtYzkxYzkyX2NvbmZpZyhsaW5rKTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIGlmIChsaW5rLT5vcGVuKQorCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwl9CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisJbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIGlmICgoc21jLT5tYW5maWQgPT0gTUFORklEX01FR0FIRVJUWikgJiYKKwkJKHNtYy0+Y2FyZGlkID09IFBST0RJRF9NRUdBSEVSVFpfRU0zMjg4KSkKKwkJbWh6XzMyODhfcG93ZXIobGluayk7CisJICAgIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisJICAgIGlmIChzbWMtPm1hbmZpZCA9PSBNQU5GSURfTU9UT1JPTEEpCisJCW1vdF9jb25maWcobGluayk7CisJICAgIGlmICgoc21jLT5tYW5maWQgPT0gTUFORklEX09TSVRFQ0gpICYmCisJCShzbWMtPmNhcmRpZCAhPSBQUk9ESURfT1NJVEVDSF9TRVZFTikpIHsKKwkJLyogUG93ZXIgdXAgdGhlIGNhcmQgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJCXNldF9iaXRzKDB4MDMwMCwgZGV2LT5iYXNlX2FkZHItMHgxMCtPU0lURUNIX0FVSV9QV1IpOworCQlzZXRfYml0cygweDAzMDAsIGRldi0+YmFzZV9hZGRyLTB4MTArT1NJVEVDSF9SRVNFVF9JU1IpOworCSAgICB9CisJICAgIGlmICgoKHNtYy0+bWFuZmlkID09IE1BTkZJRF9PU0lURUNIKSAmJgorCSAJKHNtYy0+Y2FyZGlkID09IFBST0RJRF9PU0lURUNIX1NFVkVOKSkgfHwKKwkJKChzbWMtPm1hbmZpZCA9PSBNQU5GSURfUFNJT04pICYmCisJIAkoc21jLT5jYXJkaWQgPT0gUFJPRElEX1BTSU9OX05FVDEwMCkpKSB7CisJCS8qIERvd25sb2FkIHRoZSBTZXZlbiBvZiBEaWFtb25kcyBmaXJtd2FyZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKF9fWGlsaW54N09EKTsgaSsrKSB7CisJICAgIAkgICAgb3V0YihfX1hpbGlueDdPRFtpXSwgbGluay0+aW8uQmFzZVBvcnQxKzIpOworCSAgIAkgICAgdWRlbGF5KDUwKTsKKwkJfQorCSAgICB9CisJICAgIGlmIChsaW5rLT5vcGVuKSB7CisJCXNtY19yZXNldChkZXYpOworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJICAgIH0KKwl9CisJYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfSAvKiBzbWM5MWM5Ml9ldmVudCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIE1JSSBpbnRlcmZhY2Ugc3VwcG9ydCBmb3IgU01DOTFjWFggYmFzZWQgY2FyZHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIE1ESU9fU0hJRlRfQ0xLCQkweDA0CisjZGVmaW5lIE1ESU9fREFUQV9PVVQJCTB4MDEKKyNkZWZpbmUgTURJT19ESVJfV1JJVEUJCTB4MDgKKyNkZWZpbmUgTURJT19EQVRBX1dSSVRFMAkoTURJT19ESVJfV1JJVEUpCisjZGVmaW5lIE1ESU9fREFUQV9XUklURTEJKE1ESU9fRElSX1dSSVRFIHwgTURJT19EQVRBX09VVCkKKyNkZWZpbmUgTURJT19EQVRBX1JFQUQJCTB4MDIKKworc3RhdGljIHZvaWQgbWRpb19zeW5jKGtpb19hZGRyX3QgYWRkcikKK3sKKyAgICBpbnQgYml0czsKKyAgICBmb3IgKGJpdHMgPSAwOyBiaXRzIDwgMzI7IGJpdHMrKykgeworCW91dGIoTURJT19EQVRBX1dSSVRFMSwgYWRkcik7CisJb3V0YihNRElPX0RBVEFfV1JJVEUxIHwgTURJT19TSElGVF9DTEssIGFkZHIpOworICAgIH0KK30KKworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvYykKK3sKKyAgICBraW9fYWRkcl90IGFkZHIgPSBkZXYtPmJhc2VfYWRkciArIE1HTVQ7CisgICAgdV9pbnQgY21kID0gKDB4MDY8PDEwKXwocGh5X2lkPDw1KXxsb2M7CisgICAgaW50IGksIHJldHZhbCA9IDA7CisKKyAgICBtZGlvX3N5bmMoYWRkcik7CisgICAgZm9yIChpID0gMTM7IGkgPj0gMDsgaS0tKSB7CisJaW50IGRhdCA9IChjbWQmKDE8PGkpKSA/IE1ESU9fREFUQV9XUklURTEgOiBNRElPX0RBVEFfV1JJVEUwOworCW91dGIoZGF0LCBhZGRyKTsKKwlvdXRiKGRhdCB8IE1ESU9fU0hJRlRfQ0xLLCBhZGRyKTsKKyAgICB9CisgICAgZm9yIChpID0gMTk7IGkgPiAwOyBpLS0pIHsKKwlvdXRiKDAsIGFkZHIpOworCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGluYihhZGRyKSAmIE1ESU9fREFUQV9SRUFEKSAhPSAwKTsKKwlvdXRiKE1ESU9fU0hJRlRfQ0xLLCBhZGRyKTsKKyAgICB9CisgICAgcmV0dXJuIChyZXR2YWw+PjEpICYgMHhmZmZmOworfQorCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2MsIGludCB2YWx1ZSkKK3sKKyAgICBraW9fYWRkcl90IGFkZHIgPSBkZXYtPmJhc2VfYWRkciArIE1HTVQ7CisgICAgdV9pbnQgY21kID0gKDB4MDU8PDI4KXwocGh5X2lkPDwyMyl8KGxvYzw8MTgpfCgxPDwxNyl8dmFsdWU7CisgICAgaW50IGk7CisKKyAgICBtZGlvX3N5bmMoYWRkcik7CisgICAgZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisJaW50IGRhdCA9IChjbWQmKDE8PGkpKSA/IE1ESU9fREFUQV9XUklURTEgOiBNRElPX0RBVEFfV1JJVEUwOworCW91dGIoZGF0LCBhZGRyKTsKKwlvdXRiKGRhdCB8IE1ESU9fU0hJRlRfQ0xLLCBhZGRyKTsKKyAgICB9CisgICAgZm9yIChpID0gMTsgaSA+PSAwOyBpLS0pIHsKKwlvdXRiKDAsIGFkZHIpOworCW91dGIoTURJT19TSElGVF9DTEssIGFkZHIpOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGUgZHJpdmVyIGNvcmUgY29kZSwgbW9zdCBvZiB3aGljaCBzaG91bGQgYmUgY29tbW9uIHdpdGggYQorICAgIG5vbi1QQ01DSUEgaW1wbGVtZW50YXRpb24uCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaWZkZWYgUENNQ0lBX0RFQlVHCitzdGF0aWMgdm9pZCBzbWNfZHVtcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdV9zaG9ydCBpLCB3LCBzYXZlOworICAgIHNhdmUgPSBpbncoaW9hZGRyICsgQkFOS19TRUxFQ1QpOworICAgIGZvciAodyA9IDA7IHcgPCA0OyB3KyspIHsKKwlTTUNfU0VMRUNUX0JBTksodyk7CisJcHJpbnRrKEtFUk5fREVCVUcgImJhbmsgJWQ6ICIsIHcpOworCWZvciAoaSA9IDA7IGkgPCAxNDsgaSArPSAyKQorCSAgICBwcmludGsoIiAlMDR4IiwgaW53KGlvYWRkciArIGkpKTsKKwlwcmludGsoIlxuIik7CisgICAgfQorICAgIG91dHcoc2F2ZSwgaW9hZGRyICsgQkFOS19TRUxFQ1QpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgc21jX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAgZGV2X2xpbmtfdCAqbGluayA9ICZzbWMtPmxpbms7CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgICBERUJVRygwLCAiJXM6IHNtY19vcGVuKCVwKSwgSUQvV2luZG93ICU0LjR4LlxuIiwKKwkgIGRldi0+bmFtZSwgZGV2LCBpbncoZGV2LT5iYXNlX2FkZHIgKyBCQU5LX1NFTEVDVCkpOworICAgIGlmIChwY19kZWJ1ZyA+IDEpIHNtY19kdW1wKGRldik7CisjZW5kaWYKKworICAgIC8qIENoZWNrIHRoYXQgdGhlIFBDTUNJQSBjYXJkIGlzIHN0aWxsIGhlcmUuICovCisgICAgaWYgKCFERVZfT0sobGluaykpCisJcmV0dXJuIC1FTk9ERVY7CisgICAgLyogUGh5c2ljYWwgZGV2aWNlIHByZXNlbnQgc2lnbmF0dXJlLiAqLworICAgIGlmIChjaGVja19zaWcobGluaykgPCAwKSB7CisJcHJpbnRrKCJzbWM5MWM5Ml9jczogWWlrZXMhICBCYWQgY2hpcCBzaWduYXR1cmUhXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKKyAgICB9CisgICAgbGluay0+b3BlbisrOworCisgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyAgICBzbWMtPnNhdmVkX3NrYiA9IE5VTEw7CisgICAgc21jLT5wYWNrZXRzX3dhaXRpbmcgPSAwOworCisgICAgc21jX3Jlc2V0KGRldik7CisgICAgaW5pdF90aW1lcigmc21jLT5tZWRpYSk7CisgICAgc21jLT5tZWRpYS5mdW5jdGlvbiA9ICZtZWRpYV9jaGVjazsKKyAgICBzbWMtPm1lZGlhLmRhdGEgPSAodV9sb25nKSBkZXY7CisgICAgc21jLT5tZWRpYS5leHBpcmVzID0gamlmZmllcyArIEhaOworICAgIGFkZF90aW1lcigmc21jLT5tZWRpYSk7CisKKyAgICByZXR1cm4gMDsKK30gLyogc21jX29wZW4gKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgc21jX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGRldl9saW5rX3QgKmxpbmsgPSAmc21jLT5saW5rOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBERUJVRygwLCAiJXM6IHNtY19jbG9zZSgpLCBzdGF0dXMgJTQuNHguXG4iLAorCSAgZGV2LT5uYW1lLCBpbncoaW9hZGRyICsgQkFOS19TRUxFQ1QpKTsKKworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworICAgIC8qIFNodXQgb2ZmIGFsbCBpbnRlcnJ1cHRzLCBhbmQgdHVybiBvZmYgdGhlIFR4IGFuZCBSeCBzZWN0aW9ucy4KKyAgICAgICBEb24ndCBib3RoZXIgdG8gY2hlY2sgZm9yIGNoaXAgcHJlc2VudC4gKi8KKyAgICBTTUNfU0VMRUNUX0JBTksoMik7CS8qIE5vbWluYWxseSBwYXJhbm9pYSwgYnV0IGRvIG5vIGFzc3VtZS4uLiAqLworICAgIG91dHcoMCwgaW9hZGRyICsgSU5URVJSVVBUKTsKKyAgICBTTUNfU0VMRUNUX0JBTksoMCk7CisgICAgbWFza19iaXRzKDB4ZmYwMCwgaW9hZGRyICsgUkNSKTsKKyAgICBtYXNrX2JpdHMoMHhmZjAwLCBpb2FkZHIgKyBUQ1IpOworCisgICAgLyogUHV0IHRoZSBjaGlwIGludG8gcG93ZXItZG93biBtb2RlLiAqLworICAgIFNNQ19TRUxFQ1RfQkFOSygxKTsKKyAgICBvdXR3KENUTF9QT1dFUkRPV04sIGlvYWRkciArIENPTlRST0wgKTsKKworICAgIGxpbmstPm9wZW4tLTsKKyAgICBkZWxfdGltZXJfc3luYygmc21jLT5tZWRpYSk7CisKKyAgICByZXR1cm4gMDsKK30gLyogc21jX2Nsb3NlICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBUcmFuc2ZlciBhIHBhY2tldCB0byB0aGUgaGFyZHdhcmUgYW5kIHRyaWdnZXIgdGhlIHBhY2tldCBzZW5kLgorICAgVGhpcyBtYXkgYmUgY2FsbGVkIGF0IGVpdGhlciBmcm9tIGVpdGhlciB0aGUgVHggcXVldWUgY29kZQorICAgb3IgdGhlIGludGVycnVwdCBoYW5kbGVyLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgc21jX2hhcmR3YXJlX3NlbmRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc21jLT5zYXZlZF9za2I7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB1X2NoYXIgcGFja2V0X25vOworCisgICAgaWYgKCFza2IpIHsKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBJbiBYTUlUIHdpdGggbm8gcGFja2V0IHRvIHNlbmQuXG4iLCBkZXYtPm5hbWUpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBUaGVyZSBzaG91bGQgYmUgYSBwYWNrZXQgc2xvdCB3YWl0aW5nLiAqLworICAgIHBhY2tldF9ubyA9IGludyhpb2FkZHIgKyBQTlJfQVJSKSA+PiA4OworICAgIGlmIChwYWNrZXRfbm8gJiAweDgwKSB7CisJLyogSWYgbm90LCB0aGVyZSBpcyBhIGhhcmR3YXJlIHByb2JsZW0hICBMaWtlbHkgYW4gZWplY3RlZCBjYXJkLiAqLworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiA5MWM5MiBoYXJkd2FyZSBUeCBidWZmZXIgYWxsb2NhdGlvbiIKKwkgICAgICAgIiBmYWlsZWQsIHN0YXR1cyAlIzIuMnguXG4iLCBkZXYtPm5hbWUsIHBhY2tldF9ubyk7CisJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwlzbWMtPnNhdmVkX3NrYiA9IE5VTEw7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm47CisgICAgfQorCisgICAgc21jLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKyAgICAvKiBUaGUgY2FyZCBzaG91bGQgdXNlIHRoZSBqdXN0LWFsbG9jYXRlZCBidWZmZXIuICovCisgICAgb3V0dyhwYWNrZXRfbm8sIGlvYWRkciArIFBOUl9BUlIpOworICAgIC8qIHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhY2tldCAqLworICAgIG91dHcoUFRSX0FVVE9JTkMgLCBpb2FkZHIgKyBQT0lOVEVSKTsKKworICAgIC8qIFNlbmQgdGhlIHBhY2tldCBsZW5ndGggKCs2IGZvciBzdGF0dXMsIGxlbmd0aCBhbmQgY3RsIGJ5dGUpCisgICAgICAgYW5kIHRoZSBzdGF0dXMgd29yZCAoc2V0IHRvIHplcm9zKS4gKi8KKyAgICB7CisJdV9jaGFyICpidWYgPSBza2ItPmRhdGE7CisJdV9pbnQgbGVuZ3RoID0gc2tiLT5sZW47IC8qIFRoZSBjaGlwIHdpbGwgcGFkIHRvIGV0aGVybmV0IG1pbi4gKi8KKworCURFQlVHKDIsICIlczogVHJ5aW5nIHRvIHhtaXQgcGFja2V0IG9mIGxlbmd0aCAlZC5cbiIsCisJICAgICAgZGV2LT5uYW1lLCBsZW5ndGgpOworCQorCS8qIHNlbmQgdGhlIHBhY2tldCBsZW5ndGg6ICs2IGZvciBzdGF0dXMgd29yZCwgbGVuZ3RoLCBhbmQgY3RsICovCisJb3V0dygwLCBpb2FkZHIgKyBEQVRBXzEpOworCW91dHcobGVuZ3RoICsgNiwgaW9hZGRyICsgREFUQV8xKTsKKwlvdXRzdyhpb2FkZHIgKyBEQVRBXzEsIGJ1ZiwgbGVuZ3RoID4+IDEpOworCQorCS8qIFRoZSBvZGQgbGFzdCBieXRlLCBpZiB0aGVyZSBpcyBvbmUsIGdvZXMgaW4gdGhlIGNvbnRyb2wgd29yZC4gKi8KKwlvdXR3KChsZW5ndGggJiAxKSA/IDB4MjAwMCB8IGJ1ZltsZW5ndGgtMV0gOiAwLCBpb2FkZHIgKyBEQVRBXzEpOworICAgIH0KKworICAgIC8qIEVuYWJsZSB0aGUgVHggaW50ZXJydXB0cywgYm90aCBUeCAoVHhFcnIpIGFuZCBUeEVtcHR5LiAqLworICAgIG91dHcoKChJTV9UWF9JTlR8SU1fVFhfRU1QVFlfSU5UKTw8OCkgfAorCSAoaW53KGlvYWRkciArIElOVEVSUlVQVCkgJiAweGZmMDApLAorCSBpb2FkZHIgKyBJTlRFUlJVUFQpOworCisgICAgLyogVGhlIGNoaXAgZG9lcyB0aGUgcmVzdCBvZiB0aGUgd29yay4gKi8KKyAgICBvdXR3KE1DX0VOUVVFVUUgLCBpb2FkZHIgKyBNTVVfQ01EKTsKKworICAgIHNtYy0+c2F2ZWRfc2tiID0gTlVMTDsKKyAgICBkZXZfa2ZyZWVfc2tiX2lycShza2IpOworICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgc21jX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIHByaW50ayhLRVJOX05PVElDRSAiJXM6IFNNQzkxYzkyIHRyYW5zbWl0IHRpbWVkIG91dCwgIgorCSAgICJUeF9zdGF0dXMgJTIuMnggc3RhdHVzICU0LjR4LlxuIiwKKwkgICBkZXYtPm5hbWUsIGludyhpb2FkZHIpJjB4ZmYsIGludyhpb2FkZHIgKyAyKSk7CisgICAgc21jLT5zdGF0cy50eF9lcnJvcnMrKzsKKyAgICBzbWNfcmVzZXQoZGV2KTsKKyAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICBzbWMtPnNhdmVkX3NrYiA9IE5VTEw7CisgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IHNtY19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdV9zaG9ydCBudW1fcGFnZXM7CisgICAgc2hvcnQgdGltZV9vdXQsIGlyOworCisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgICAgREVCVUcoMiwgIiVzOiBzbWNfc3RhcnRfeG1pdChsZW5ndGggPSAlZCkgY2FsbGVkLCIKKwkgICIgc3RhdHVzICU0LjR4LlxuIiwgZGV2LT5uYW1lLCBza2ItPmxlbiwgaW53KGlvYWRkciArIDIpKTsKKworICAgIGlmIChzbWMtPnNhdmVkX3NrYikgeworCS8qIFRISVMgU0hPVUxEIE5FVkVSIEhBUFBFTi4gKi8KKwlzbWMtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJbnRlcm5hbCBlcnJvciAtLSBzZW50IHBhY2tldCB3aGlsZSBidXN5LlxuIiwKKwkgICAgICAgZGV2LT5uYW1lKTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgc21jLT5zYXZlZF9za2IgPSBza2I7CisKKyAgICBudW1fcGFnZXMgPSBza2ItPmxlbiA+PiA4OworCisgICAgaWYgKG51bV9wYWdlcyA+IDcpIHsKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBGYXIgdG9vIGJpZyBwYWNrZXQgZXJyb3IuXG4iLCBkZXYtPm5hbWUpOworCWRldl9rZnJlZV9za2IgKHNrYik7CisJc21jLT5zYXZlZF9za2IgPSBOVUxMOworCXNtYy0+c3RhdHMudHhfZHJvcHBlZCsrOworCXJldHVybiAwOwkJLyogRG8gbm90IHJlLXF1ZXVlIHRoaXMgcGFja2V0LiAqLworICAgIH0KKyAgICAvKiBBIHBhY2tldCBpcyBub3cgd2FpdGluZy4gKi8KKyAgICBzbWMtPnBhY2tldHNfd2FpdGluZysrOworCisgICAgU01DX1NFTEVDVF9CQU5LKDIpOwkvKiBQYXJhbm9pYSwgd2Ugc2hvdWxkIGFsd2F5cyBiZSBpbiB3aW5kb3cgMiAqLworCisgICAgLyogbmVlZCBNQ19SRVNFVCB0byBrZWVwIHRoZSBtZW1vcnkgY29uc2lzdGVudC4gZXJyYXRhPyAqLworICAgIGlmIChzbWMtPnJ4X292cm4pIHsKKwlvdXR3KE1DX1JFU0VULCBpb2FkZHIgKyBNTVVfQ01EKTsKKwlzbWMtPnJ4X292cm4gPSAwOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIHRoZSBtZW1vcnk7IHNlbmQgdGhlIHBhY2tldCBub3cgaWYgd2Ugd2luLiAqLworICAgIG91dHcoTUNfQUxMT0MgfCBudW1fcGFnZXMsIGlvYWRkciArIE1NVV9DTUQpOworICAgIGZvciAodGltZV9vdXQgPSBNRU1PUllfV0FJVF9USU1FOyB0aW1lX291dCA+PSAwOyB0aW1lX291dC0tKSB7CisJaXIgPSBpbncoaW9hZGRyK0lOVEVSUlVQVCk7CisJaWYgKGlyICYgSU1fQUxMT0NfSU5UKSB7CisJICAgIC8qIEFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHQsIHNlbmQgdGhlIHBhY2tldC4gKi8KKwkgICAgb3V0dygoaXImMHhmZjAwKSB8IElNX0FMTE9DX0lOVCwgaW9hZGRyICsgSU5URVJSVVBUKTsKKwkgICAgc21jX2hhcmR3YXJlX3NlbmRfcGFja2V0KGRldik7CS8qIFNlbmQgdGhlIHBhY2tldCBub3cuLiAqLworCSAgICByZXR1cm4gMDsKKwl9CisgICAgfQorCisgICAgLyogT3RoZXJ3aXNlIGRlZmVyIHVudGlsIHRoZSBUeC1zcGFjZS1hbGxvY2F0ZWQgaW50ZXJydXB0LiAqLworICAgIERFQlVHKDIsICIlczogbWVtb3J5IGFsbG9jYXRpb24gZGVmZXJyZWQuXG4iLCBkZXYtPm5hbWUpOworICAgIG91dHcoKElNX0FMTE9DX0lOVCA8PCA4KSB8IChpciAmIDB4ZmYwMCksIGlvYWRkciArIElOVEVSUlVQVCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBIYW5kbGUgYSBUeCBhbm9tb2xvdXMgZXZlbnQuICBFbnRlcmVkIHdoaWxlIGluIFdpbmRvdyAyLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgc21jX3R4X2VycihzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgc2F2ZWRfcGFja2V0ID0gaW53KGlvYWRkciArIFBOUl9BUlIpICYgMHhmZjsKKyAgICBpbnQgcGFja2V0X25vID0gaW53KGlvYWRkciArIEZJRk9fUE9SVFMpICYgMHg3ZjsKKyAgICBpbnQgdHhfc3RhdHVzOworCisgICAgLyogc2VsZWN0IHRoaXMgYXMgdGhlIHBhY2tldCB0byByZWFkIGZyb20gKi8KKyAgICBvdXR3KHBhY2tldF9ubywgaW9hZGRyICsgUE5SX0FSUik7CisKKyAgICAvKiByZWFkIHRoZSBmaXJzdCB3b3JkIGZyb20gdGhpcyBwYWNrZXQgKi8KKyAgICBvdXR3KFBUUl9BVVRPSU5DIHwgUFRSX1JFQUQgfCAwLCBpb2FkZHIgKyBQT0lOVEVSKTsKKworICAgIHR4X3N0YXR1cyA9IGludyhpb2FkZHIgKyBEQVRBXzEpOworCisgICAgc21jLT5zdGF0cy50eF9lcnJvcnMrKzsKKyAgICBpZiAodHhfc3RhdHVzICYgVFNfTE9TVENBUikgc21jLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworICAgIGlmICh0eF9zdGF0dXMgJiBUU19MQVRDT0wpICBzbWMtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKyAgICBpZiAodHhfc3RhdHVzICYgVFNfMTZDT0wpIHsKKwlzbWMtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJc21jLT50eF9lcnIrKzsKKyAgICB9CisKKyAgICBpZiAodHhfc3RhdHVzICYgVFNfU1VDQ0VTUykgeworCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFN1Y2Nlc3NmdWwgcGFja2V0IGNhdXNlZCBlcnJvciAiCisJICAgICAgICJpbnRlcnJ1cHQ/XG4iLCBkZXYtPm5hbWUpOworICAgIH0KKyAgICAvKiByZS1lbmFibGUgdHJhbnNtaXQgKi8KKyAgICBTTUNfU0VMRUNUX0JBTksoMCk7CisgICAgb3V0dyhpbncoaW9hZGRyICsgVENSKSB8IFRDUl9FTkFCTEUgfCBzbWMtPmR1cGxleCwgaW9hZGRyICsgVENSKTsKKyAgICBTTUNfU0VMRUNUX0JBTksoMik7CisKKyAgICBvdXR3KE1DX0ZSRUVQS1QsIGlvYWRkciArIE1NVV9DTUQpOyAJLyogRnJlZSB0aGUgcGFja2V0IG1lbW9yeS4gKi8KKworICAgIC8qIG9uZSBsZXNzIHBhY2tldCB3YWl0aW5nIGZvciBtZSAqLworICAgIHNtYy0+cGFja2V0c193YWl0aW5nLS07CisKKyAgICBvdXR3KHNhdmVkX3BhY2tldCwgaW9hZGRyICsgUE5SX0FSUik7CisgICAgcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgc21jX2VwaF9pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB1X3Nob3J0IGNhcmRfc3RhdHMsIGVwaHM7CisKKyAgICBTTUNfU0VMRUNUX0JBTksoMCk7CisgICAgZXBocyA9IGludyhpb2FkZHIgKyBFUEgpOworICAgIERFQlVHKDIsICIlczogRXRoZXJuZXQgcHJvdG9jb2wgaGFuZGxlciBpbnRlcnJ1cHQsIHN0YXR1cyIKKwkgICIgJTQuNHguXG4iLCBkZXYtPm5hbWUsIGVwaHMpOworICAgIC8qIENvdWxkIGJlIGEgY291bnRlciByb2xsLW92ZXIgd2FybmluZzogdXBkYXRlIHN0YXRzLiAqLworICAgIGNhcmRfc3RhdHMgPSBpbncoaW9hZGRyICsgQ09VTlRFUik7CisgICAgLyogc2luZ2xlIGNvbGxpc2lvbnMgKi8KKyAgICBzbWMtPnN0YXRzLmNvbGxpc2lvbnMgKz0gY2FyZF9zdGF0cyAmIDB4RjsKKyAgICBjYXJkX3N0YXRzID4+PSA0OworICAgIC8qIG11bHRpcGxlIGNvbGxpc2lvbnMgKi8KKyAgICBzbWMtPnN0YXRzLmNvbGxpc2lvbnMgKz0gY2FyZF9zdGF0cyAmIDB4RjsKKyNpZiAwIAkJLyogVGhlc2UgYXJlIGZvciB3aGVuIGxpbnV4IHN1cHBvcnRzIHRoZXNlIHN0YXRpc3RpY3MgKi8KKyAgICBjYXJkX3N0YXRzID4+PSA0OwkJCS8qIGRlZmVycmVkICovCisgICAgY2FyZF9zdGF0cyA+Pj0gNDsJCQkvKiBleGNlc3MgZGVmZXJyZWQgKi8KKyNlbmRpZgorICAgIC8qIElmIHdlIGhhZCBhIHRyYW5zbWl0IGVycm9yIHdlIG11c3QgcmUtZW5hYmxlIHRoZSB0cmFuc21pdHRlci4gKi8KKyAgICBvdXR3KGludyhpb2FkZHIgKyBUQ1IpIHwgVENSX0VOQUJMRSB8IHNtYy0+ZHVwbGV4LCBpb2FkZHIgKyBUQ1IpOworCisgICAgLyogQ2xlYXIgYSBsaW5rIGVycm9yIGludGVycnVwdC4gKi8KKyAgICBTTUNfU0VMRUNUX0JBTksoMSk7CisgICAgb3V0dyhDVExfQVVUT19SRUxFQVNFIHwgMHgwMDAwLCBpb2FkZHIgKyBDT05UUk9MKTsKKyAgICBvdXR3KENUTF9BVVRPX1JFTEVBU0UgfCBDVExfVEVfRU5BQkxFIHwgQ1RMX0NSX0VOQUJMRSwKKwkgaW9hZGRyICsgQ09OVFJPTCk7CisgICAgU01DX1NFTEVDVF9CQU5LKDIpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGlycXJldHVybl90IHNtY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkcjsKKyAgICB1X3Nob3J0IHNhdmVkX2JhbmssIHNhdmVkX3BvaW50ZXIsIG1hc2ssIHN0YXR1czsKKyAgICB1bnNpZ25lZCBpbnQgaGFuZGxlZCA9IDE7CisgICAgY2hhciBib2d1c19jbnQgPSBJTlRSX1dPUks7CQkvKiBXb3JrIHdlIGFyZSB3aWxsaW5nIHRvIGRvLiAqLworCisgICAgaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCXJldHVybiBJUlFfTk9ORTsKKworICAgIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgICAgREVCVUcoMywgIiVzOiBTTUM5MWM5MiBpbnRlcnJ1cHQgJWQgYXQgJSN4LlxuIiwgZGV2LT5uYW1lLAorCSAgaXJxLCBpb2FkZHIpOworCisgICAgc21jLT53YXRjaGRvZyA9IDA7CisgICAgc2F2ZWRfYmFuayA9IGludyhpb2FkZHIgKyBCQU5LX1NFTEVDVCk7CisgICAgaWYgKChzYXZlZF9iYW5rICYgMHhmZjAwKSAhPSAweDMzMDApIHsKKwkvKiBUaGUgZGV2aWNlIGRvZXMgbm90IGV4aXN0IC0tIHRoZSBjYXJkIGNvdWxkIGJlIG9mZi1saW5lLCBvcgorCSAgIG1heWJlIGl0IGhhcyBiZWVuIGVqZWN0ZWQuICovCisJREVCVUcoMSwgIiVzOiBTTUM5MWM5MiBpbnRlcnJ1cHQgJWQgZm9yIG5vbi1leGlzdGVudCIKKwkgICAgICAiL2VqZWN0ZWQgZGV2aWNlLlxuIiwgZGV2LT5uYW1lLCBpcnEpOworCWhhbmRsZWQgPSAwOworCWdvdG8gaXJxX2RvbmU7CisgICAgfQorCisgICAgU01DX1NFTEVDVF9CQU5LKDIpOworICAgIHNhdmVkX3BvaW50ZXIgPSBpbncoaW9hZGRyICsgUE9JTlRFUik7CisgICAgbWFzayA9IGludyhpb2FkZHIgKyBJTlRFUlJVUFQpID4+IDg7CisgICAgLyogY2xlYXIgYWxsIGludGVycnVwdHMgKi8KKyAgICBvdXR3KDAsIGlvYWRkciArIElOVEVSUlVQVCk7CisKKyAgICBkbyB7IC8qIHJlYWQgdGhlIHN0YXR1cyBmbGFnLCBhbmQgbWFzayBpdCAqLworCXN0YXR1cyA9IGludyhpb2FkZHIgKyBJTlRFUlJVUFQpICYgMHhmZjsKKwlERUJVRygzLCAiJXM6IFN0YXR1cyBpcyAlIzIuMnggKG1hc2sgJSMyLjJ4KS5cbiIsIGRldi0+bmFtZSwKKwkgICAgICBzdGF0dXMsIG1hc2spOworCWlmICgoc3RhdHVzICYgbWFzaykgPT0gMCkgeworCSAgICBpZiAoYm9ndXNfY250ID09IElOVFJfV09SSykKKwkJaGFuZGxlZCA9IDA7CisJICAgIGJyZWFrOworCX0KKwlpZiAoc3RhdHVzICYgSU1fUkNWX0lOVCkgeworCSAgICAvKiBHb3QgYSBwYWNrZXQocykuICovCisJICAgIHNtY19yeChkZXYpOworCX0KKwlpZiAoc3RhdHVzICYgSU1fVFhfSU5UKSB7CisJICAgIHNtY190eF9lcnIoZGV2KTsKKwkgICAgb3V0dyhJTV9UWF9JTlQsIGlvYWRkciArIElOVEVSUlVQVCk7CisJfQorCXN0YXR1cyAmPSBtYXNrOworCWlmIChzdGF0dXMgJiBJTV9UWF9FTVBUWV9JTlQpIHsKKwkgICAgb3V0dyhJTV9UWF9FTVBUWV9JTlQsIGlvYWRkciArIElOVEVSUlVQVCk7CisJICAgIG1hc2sgJj0gfklNX1RYX0VNUFRZX0lOVDsKKwkgICAgc21jLT5zdGF0cy50eF9wYWNrZXRzICs9IHNtYy0+cGFja2V0c193YWl0aW5nOworCSAgICBzbWMtPnBhY2tldHNfd2FpdGluZyA9IDA7CisJfQorCWlmIChzdGF0dXMgJiBJTV9BTExPQ19JTlQpIHsKKwkgICAgLyogQ2xlYXIgdGhpcyBpbnRlcnJ1cHQgc28gaXQgZG9lc24ndCBoYXBwZW4gYWdhaW4gKi8KKwkgICAgbWFzayAmPSB+SU1fQUxMT0NfSU5UOworCQorCSAgICBzbWNfaGFyZHdhcmVfc2VuZF9wYWNrZXQoZGV2KTsKKwkKKwkgICAgLyogZW5hYmxlIHhtaXQgaW50ZXJydXB0cyBiYXNlZCBvbiB0aGlzICovCisJICAgIG1hc2sgfD0gKElNX1RYX0VNUFRZX0lOVCB8IElNX1RYX0lOVCk7CisJCisJICAgIC8qIGFuZCBsZXQgdGhlIGNhcmQgc2VuZCBtb3JlIHBhY2tldHMgdG8gbWUgKi8KKwkgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKwlpZiAoc3RhdHVzICYgSU1fUlhfT1ZSTl9JTlQpIHsKKwkgICAgc21jLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkgICAgc21jLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCSAgICBpZiAoc21jLT5kdXBsZXgpCisJCXNtYy0+cnhfb3ZybiA9IDE7IC8qIG5lZWQgTUNfUkVTRVQgb3V0c2lkZSBzbWNfaW50ZXJydXB0ICovCisJICAgIG91dHcoSU1fUlhfT1ZSTl9JTlQsIGlvYWRkciArIElOVEVSUlVQVCk7CisJfQorCWlmIChzdGF0dXMgJiBJTV9FUEhfSU5UKQorCSAgICBzbWNfZXBoX2lycShkZXYpOworICAgIH0gd2hpbGUgKC0tYm9ndXNfY250KTsKKworICAgIERFQlVHKDMsICIgIFJlc3RvcmluZyBzYXZlZCByZWdpc3RlcnMgbWFzayAlMi4yeCBiYW5rICU0LjR4IgorCSAgIiBwb2ludGVyICU0LjR4LlxuIiwgbWFzaywgc2F2ZWRfYmFuaywgc2F2ZWRfcG9pbnRlcik7CisKKyAgICAvKiByZXN0b3JlIHN0YXRlIHJlZ2lzdGVyICovCisgICAgb3V0dygobWFzazw8OCksIGlvYWRkciArIElOVEVSUlVQVCk7CisgICAgb3V0dyhzYXZlZF9wb2ludGVyLCBpb2FkZHIgKyBQT0lOVEVSKTsKKyAgICBTTUNfU0VMRUNUX0JBTksoc2F2ZWRfYmFuayk7CisKKyAgICBERUJVRygzLCAiJXM6IEV4aXRpbmcgaW50ZXJydXB0IElSUSVkLlxuIiwgZGV2LT5uYW1lLCBpcnEpOworCitpcnFfZG9uZToKKworICAgIGlmICgoc21jLT5tYW5maWQgPT0gTUFORklEX09TSVRFQ0gpICYmCisJKHNtYy0+Y2FyZGlkICE9IFBST0RJRF9PU0lURUNIX1NFVkVOKSkgeworCS8qIFJldHJpZ2dlciBpbnRlcnJ1cHQgaWYgbmVlZGVkICovCisJbWFza19iaXRzKDB4MDBmZiwgaW9hZGRyLTB4MTArT1NJVEVDSF9SRVNFVF9JU1IpOworCXNldF9iaXRzKDB4MDMwMCwgaW9hZGRyLTB4MTArT1NJVEVDSF9SRVNFVF9JU1IpOworICAgIH0KKyAgICBpZiAoc21jLT5tYW5maWQgPT0gTUFORklEX01PVE9ST0xBKSB7CisJdV9jaGFyIGNvcjsKKwljb3IgPSByZWFkYihzbWMtPmJhc2UgKyBNT1RfVUFSVCArIENJU1JFR19DT1IpOworCXdyaXRlYihjb3IgJiB+Q09SX0lSRVFfRU5BLCBzbWMtPmJhc2UgKyBNT1RfVUFSVCArIENJU1JFR19DT1IpOworCXdyaXRlYihjb3IsIHNtYy0+YmFzZSArIE1PVF9VQVJUICsgQ0lTUkVHX0NPUik7CisJY29yID0gcmVhZGIoc21jLT5iYXNlICsgTU9UX0xBTiArIENJU1JFR19DT1IpOworCXdyaXRlYihjb3IgJiB+Q09SX0lSRVFfRU5BLCBzbWMtPmJhc2UgKyBNT1RfTEFOICsgQ0lTUkVHX0NPUik7CisJd3JpdGViKGNvciwgc21jLT5iYXNlICsgTU9UX0xBTiArIENJU1JFR19DT1IpOworICAgIH0KKyNpZmRlZiBET0VTX05PVF9XT1JLCisgICAgaWYgKHNtYy0+YmFzZSAhPSBOVUxMKSB7IC8qIE1lZ2FoZXJ0eiBNRkMncyAqLworCXJlYWRiKHNtYy0+YmFzZStNRUdBSEVSVFpfSVNSKTsKKwlyZWFkYihzbWMtPmJhc2UrTUVHQUhFUlRaX0lTUik7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBzbWNfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgcnhfc3RhdHVzOworICAgIGludCBwYWNrZXRfbGVuZ3RoOwkvKiBDYXV0aW9uOiBub3QgZnJhbWUgbGVuZ3RoLCByYXRoZXIgd29yZHMKKwkJCSAgIHRvIHRyYW5zZmVyIGZyb20gdGhlIGNoaXAuICovCisKKyAgICAvKiBBc3NlcnRpb246IHdlIGFyZSBpbiBXaW5kb3cgMi4gKi8KKworICAgIGlmIChpbncoaW9hZGRyICsgRklGT19QT1JUUykgJiBGUF9SWEVNUFRZKSB7CisJcHJpbnRrKEtFUk5fRVJSICIlczogc21jX3J4KCkgd2l0aCBub3RoaW5nIG9uIFJ4IEZJRk8uXG4iLAorCSAgICAgICBkZXYtPm5hbWUpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiAgUmVzZXQgdGhlIHJlYWQgcG9pbnRlciwgYW5kIHJlYWQgdGhlIHN0YXR1cyBhbmQgcGFja2V0IGxlbmd0aC4gKi8KKyAgICBvdXR3KFBUUl9SRUFEIHwgUFRSX1JDViB8IFBUUl9BVVRPSU5DLCBpb2FkZHIgKyBQT0lOVEVSKTsKKyAgICByeF9zdGF0dXMgPSBpbncoaW9hZGRyICsgREFUQV8xKTsKKyAgICBwYWNrZXRfbGVuZ3RoID0gaW53KGlvYWRkciArIERBVEFfMSkgJiAweDA3ZmY7CisKKyAgICBERUJVRygyLCAiJXM6IFJlY2VpdmUgc3RhdHVzICU0LjR4IGxlbmd0aCAlZC5cbiIsCisJICBkZXYtPm5hbWUsIHJ4X3N0YXR1cywgcGFja2V0X2xlbmd0aCk7CisKKyAgICBpZiAoIShyeF9zdGF0dXMgJiBSU19FUlJPUlMpKSB7CQkKKwkvKiBkbyBzdHVmZiB0byBtYWtlIGEgbmV3IHBhY2tldCAqLworCXN0cnVjdCBza19idWZmICpza2I7CisJCisJLyogTm90ZTogcGFja2V0X2xlbmd0aCBhZGRzIDUgb3IgNiBleHRyYSBieXRlcyBoZXJlISAqLworCXNrYiA9IGRldl9hbGxvY19za2IocGFja2V0X2xlbmd0aCsyKTsKKwkKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkgICAgREVCVUcoMSwgIiVzOiBMb3cgbWVtb3J5LCBwYWNrZXQgZHJvcHBlZC5cbiIsIGRldi0+bmFtZSk7CisJICAgIHNtYy0+c3RhdHMucnhfZHJvcHBlZCsrOworCSAgICBvdXR3KE1DX1JFTEVBU0UsIGlvYWRkciArIE1NVV9DTUQpOworCSAgICByZXR1cm47CisJfQorCQorCXBhY2tldF9sZW5ndGggLT0gKHJ4X3N0YXR1cyAmIFJTX09EREZSQU1FID8gNSA6IDYpOworCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJaW5zdyhpb2FkZHIrREFUQV8xLCBza2JfcHV0KHNrYiwgcGFja2V0X2xlbmd0aCksCisJICAgICAocGFja2V0X2xlbmd0aCsxKT4+MSk7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkKKwlza2ItPmRldiA9IGRldjsKKwluZXRpZl9yeChza2IpOworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJc21jLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJc21jLT5zdGF0cy5yeF9ieXRlcyArPSBwYWNrZXRfbGVuZ3RoOworCWlmIChyeF9zdGF0dXMgJiBSU19NVUxUSUNBU1QpCisJICAgIHNtYy0+c3RhdHMubXVsdGljYXN0Kys7CisgICAgfSBlbHNlIHsKKwkvKiBlcnJvciAuLi4gKi8KKwlzbWMtPnN0YXRzLnJ4X2Vycm9ycysrOworCQorCWlmIChyeF9zdGF0dXMgJiBSU19BTEdORVJSKSAgc21jLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwlpZiAocnhfc3RhdHVzICYgKFJTX1RPT1NIT1JUIHwgUlNfVE9PTE9ORykpCisJICAgIHNtYy0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCWlmIChyeF9zdGF0dXMgJiBSU19CQURDUkMpCXNtYy0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworICAgIH0KKyAgICAvKiBMZXQgdGhlIE1NVSBmcmVlIHRoZSBtZW1vcnkgb2YgdGhpcyBwYWNrZXQuICovCisgICAgb3V0dyhNQ19SRUxFQVNFLCBpb2FkZHIgKyBNTVVfQ01EKTsKKworICAgIHJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc21jX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAvKiBOb3RoaW5nIHRvIHVwZGF0ZSAtIHRoZSA5MWM5MiBpcyBhIHByZXR0eSBwcmltYXRpdmUgY2hpcC4gKi8KKyAgICByZXR1cm4gJnNtYy0+c3RhdHM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQ2FsY3VsYXRlIHZhbHVlcyBmb3IgdGhlIGhhcmR3YXJlIG11bHRpY2FzdCBmaWx0ZXIgaGFzaCB0YWJsZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGZpbGxfbXVsdGljYXN0X3RibChpbnQgY291bnQsIHN0cnVjdCBkZXZfbWNfbGlzdCAqYWRkcnMsCisJCQkgICAgICAgdV9jaGFyICptdWx0aWNhc3RfdGFibGUpCit7CisgICAgc3RydWN0IGRldl9tY19saXN0CSptY19hZGRyOworCisgICAgZm9yIChtY19hZGRyID0gYWRkcnM7ICBtY19hZGRyICYmIC0tY291bnQgPiAwOyAgbWNfYWRkciA9IG1jX2FkZHItPm5leHQpIHsKKwl1X2ludCBwb3NpdGlvbiA9IGV0aGVyX2NyYyg2LCBtY19hZGRyLT5kbWlfYWRkcik7CisjaWZuZGVmIGZpbmFsX3ZlcnNpb24JCS8qIFZlcmlmeSBtdWx0aWNhc3QgYWRkcmVzcy4gKi8KKwlpZiAoKG1jX2FkZHItPmRtaV9hZGRyWzBdICYgMSkgPT0gMCkKKwkgICAgY29udGludWU7CisjZW5kaWYKKwltdWx0aWNhc3RfdGFibGVbcG9zaXRpb24gPj4gMjldIHw9IDEgPDwgKChwb3NpdGlvbiA+PiAyNikgJiA3KTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgU2V0IHRoZSByZWNlaXZlIG1vZGUuCisKKyAgICBUaGlzIHJvdXRpbmUgaXMgdXNlZCBieSBib3RoIHRoZSBwcm90b2NvbCBsZXZlbCB0byBub3RpZnkgdXMgb2YKKyAgICBwcm9taXNjdW91cy9tdWx0aWNhc3QgbW9kZSBjaGFuZ2VzLCBhbmQgYnkgdGhlIG9wZW4vcmVzZXQgY29kZSB0bworICAgIGluaXRpYWxpemUgdGhlIFJ4IHJlZ2lzdGVycy4gIFdlIGFsd2F5cyBzZXQgdGhlIG11bHRpY2FzdCBsaXN0IGFuZAorICAgIGxlYXZlIHRoZSByZWNlaXZlciBydW5uaW5nLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2ludCBtdWx0aWNhc3RfdGFibGVbIDIgXSA9IHsgMCwgfTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIHVfc2hvcnQgcnhfY2ZnX3NldHRpbmc7CisKKyAgICBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogc2V0dGluZyBSeCBtb2RlIHRvIHByb21pc2N1b3VzLlxuIiwgZGV2LT5uYW1lKTsKKwlyeF9jZmdfc2V0dGluZyA9IFJ4U3RyaXBDUkMgfCBSeEVuYWJsZSB8IFJ4UHJvbWlzYyB8IFJ4QWxsTXVsdGk7CisgICAgfSBlbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQorCXJ4X2NmZ19zZXR0aW5nID0gUnhTdHJpcENSQyB8IFJ4RW5hYmxlIHwgUnhBbGxNdWx0aTsKKyAgICBlbHNlIHsKKwlpZiAoZGV2LT5tY19jb3VudCkgIHsKKwkgICAgZmlsbF9tdWx0aWNhc3RfdGJsKGRldi0+bWNfY291bnQsIGRldi0+bWNfbGlzdCwKKwkJCSAgICAgICAodV9jaGFyICopbXVsdGljYXN0X3RhYmxlKTsKKwl9CisJcnhfY2ZnX3NldHRpbmcgPSBSeFN0cmlwQ1JDIHwgUnhFbmFibGU7CisgICAgfQorCisgICAgLyogTG9hZCBNQyB0YWJsZSBhbmQgUnggc2V0dGluZyBpbnRvIHRoZSBjaGlwIHdpdGhvdXQgaW50ZXJydXB0cy4gKi8KKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmc21jLT5sb2NrLCBmbGFncyk7CisgICAgU01DX1NFTEVDVF9CQU5LKDMpOworICAgIG91dGwobXVsdGljYXN0X3RhYmxlWzBdLCBpb2FkZHIgKyBNVUxUSUNBU1QwKTsKKyAgICBvdXRsKG11bHRpY2FzdF90YWJsZVsxXSwgaW9hZGRyICsgTVVMVElDQVNUNCk7CisgICAgU01DX1NFTEVDVF9CQU5LKDApOworICAgIG91dHcocnhfY2ZnX3NldHRpbmcsIGlvYWRkciArIFJDUik7CisgICAgU01DX1NFTEVDVF9CQU5LKDIpOworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNtYy0+bG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFNlbnNlcyB3aGVuIGEgY2FyZCdzIGNvbmZpZyBjaGFuZ2VzLiBIZXJlLCBpdCdzIGNvYXggb3IgVFAuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHM5a19jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApCit7CisgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGlmICgobWFwLT5wb3J0ICE9ICh1X2NoYXIpKC0xKSkgJiYgKG1hcC0+cG9ydCAhPSBkZXYtPmlmX3BvcnQpKSB7CisJaWYgKHNtYy0+Y2ZnICYgQ0ZHX01JSV9TRUxFQ1QpCisJICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKwllbHNlIGlmIChtYXAtPnBvcnQgPiAyKQorCSAgICByZXR1cm4gLUVJTlZBTDsKKwlkZXYtPmlmX3BvcnQgPSBtYXAtPnBvcnQ7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHN3aXRjaGVkIHRvICVzIHBvcnRcbiIsCisJICAgICAgIGRldi0+bmFtZSwgaWZfbmFtZXNbZGV2LT5pZl9wb3J0XSk7CisJc21jX3Jlc2V0KGRldik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFJlc2V0IHRoZSBjaGlwLCByZWxvYWRpbmcgZXZlcnkgcmVnaXN0ZXIgdGhhdCBtaWdodCBiZSBjb3JydXB0ZWQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICBTZXQgdHJhbnNjZWl2ZXIgdHlwZSwgcGVyaGFwcyB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiB3aGF0IHRoZSB1c2VyCisgIHNwZWNpZmllZCBpbiBkZXYtPmlmX3BvcnQuCisqLworc3RhdGljIHZvaWQgc21jX3NldF94Y3ZyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpZl9wb3J0KQoreworICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHVfc2hvcnQgc2F2ZWRfYmFuazsKKworICAgIHNhdmVkX2JhbmsgPSBpbncoaW9hZGRyICsgQkFOS19TRUxFQ1QpOworICAgIFNNQ19TRUxFQ1RfQkFOSygxKTsKKyAgICBpZiAoaWZfcG9ydCA9PSAyKSB7CisJb3V0dyhzbWMtPmNmZyB8IENGR19BVUlfU0VMRUNULCBpb2FkZHIgKyBDT05GSUcpOworCWlmICgoc21jLT5tYW5maWQgPT0gTUFORklEX09TSVRFQ0gpICYmCisJICAgIChzbWMtPmNhcmRpZCAhPSBQUk9ESURfT1NJVEVDSF9TRVZFTikpCisJICAgIHNldF9iaXRzKE9TSV9BVUlfUFdSLCBpb2FkZHIgLSAweDEwICsgT1NJVEVDSF9BVUlfUFdSKTsKKwlzbWMtPm1lZGlhX3N0YXR1cyA9ICgoZGV2LT5pZl9wb3J0ID09IDApID8gMHgwMDAxIDogMHgwMDAyKTsKKyAgICB9IGVsc2UgeworCW91dHcoc21jLT5jZmcsIGlvYWRkciArIENPTkZJRyk7CisJaWYgKChzbWMtPm1hbmZpZCA9PSBNQU5GSURfT1NJVEVDSCkgJiYKKwkgICAgKHNtYy0+Y2FyZGlkICE9IFBST0RJRF9PU0lURUNIX1NFVkVOKSkKKwkgICAgbWFza19iaXRzKH5PU0lfQVVJX1BXUiwgaW9hZGRyIC0gMHgxMCArIE9TSVRFQ0hfQVVJX1BXUik7CisJc21jLT5tZWRpYV9zdGF0dXMgPSAoKGRldi0+aWZfcG9ydCA9PSAwKSA/IDB4MDAxMiA6IDB4NDAwMSk7CisgICAgfQorICAgIFNNQ19TRUxFQ1RfQkFOSyhzYXZlZF9iYW5rKTsKK30KKworc3RhdGljIHZvaWQgc21jX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IGk7CisKKyAgICBERUJVRygwLCAiJXM6IHNtYzkxYzkyIHJlc2V0IGNhbGxlZC5cbiIsIGRldi0+bmFtZSk7CisKKyAgICAvKiBUaGUgZmlyc3QgaW50ZXJhY3Rpb24gbXVzdCBiZSBhIHdyaXRlIHRvIGJyaW5nIHRoZSBjaGlwIG91dAorICAgICAgIG9mIHNsZWVwIG1vZGUuICovCisgICAgU01DX1NFTEVDVF9CQU5LKDApOworICAgIC8qIFJlc2V0IHRoZSBjaGlwLiAqLworICAgIG91dHcoUkNSX1NPRlRSRVNFVCwgaW9hZGRyICsgUkNSKTsKKyAgICB1ZGVsYXkoMTApOworCisgICAgLyogQ2xlYXIgdGhlIHRyYW5zbWl0IGFuZCByZWNlaXZlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLiAqLworICAgIG91dHcoUkNSX0NMRUFSLCBpb2FkZHIgKyBSQ1IpOworICAgIG91dHcoVENSX0NMRUFSLCBpb2FkZHIgKyBUQ1IpOworCisgICAgLyogU2V0IHRoZSBXaW5kb3cgMSBjb250cm9sLCBjb25maWd1cmF0aW9uIGFuZCBzdGF0aW9uIGFkZHIgcmVnaXN0ZXJzLgorICAgICAgIE5vIHBvaW50IGluIHdyaXRpbmcgdGhlIEkvTyBiYXNlIHJlZ2lzdGVyIDstPiAqLworICAgIFNNQ19TRUxFQ1RfQkFOSygxKTsKKyAgICAvKiBBdXRvbWF0aWNhbGx5IHJlbGVhc2Ugc3VjY2VzZnVsbHkgdHJhbnNtaXR0ZWQgcGFja2V0cywKKyAgICAgICBBY2NlcHQgbGluayBlcnJvcnMsIGNvdW50ZXIgYW5kIFR4IGVycm9yIGludGVycnVwdHMuICovCisgICAgb3V0dyhDVExfQVVUT19SRUxFQVNFIHwgQ1RMX1RFX0VOQUJMRSB8IENUTF9DUl9FTkFCTEUsCisJIGlvYWRkciArIENPTlRST0wpOworICAgIHNtY19zZXRfeGN2cihkZXYsIGRldi0+aWZfcG9ydCk7CisgICAgaWYgKChzbWMtPm1hbmZpZCA9PSBNQU5GSURfT1NJVEVDSCkgJiYKKwkoc21jLT5jYXJkaWQgIT0gUFJPRElEX09TSVRFQ0hfU0VWRU4pKQorCW91dHcoKGRldi0+aWZfcG9ydCA9PSAyID8gT1NJX0FVSV9QV1IgOiAwKSB8CisJICAgICAoaW53KGlvYWRkci0weDEwK09TSVRFQ0hfQVVJX1BXUikgJiAweGZmMDApLAorCSAgICAgaW9hZGRyIC0gMHgxMCArIE9TSVRFQ0hfQVVJX1BXUik7CisKKyAgICAvKiBGaWxsIGluIHRoZSBwaHlzaWNhbCBhZGRyZXNzLiAgVGhlIGRhdGFib29rIGlzIHdyb25nIGFib3V0IHRoZSBvcmRlciEgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSArPSAyKQorCW91dHcoKGRldi0+ZGV2X2FkZHJbaSsxXTw8OCkrZGV2LT5kZXZfYWRkcltpXSwKKwkgICAgIGlvYWRkciArIEFERFIwICsgaSk7CisKKyAgICAvKiBSZXNldCB0aGUgTU1VICovCisgICAgU01DX1NFTEVDVF9CQU5LKDIpOworICAgIG91dHcoTUNfUkVTRVQsIGlvYWRkciArIE1NVV9DTUQpOworICAgIG91dHcoMCwgaW9hZGRyICsgSU5URVJSVVBUKTsKKworICAgIC8qIFJlLWVuYWJsZSB0aGUgY2hpcC4gKi8KKyAgICBTTUNfU0VMRUNUX0JBTksoMCk7CisgICAgb3V0dygoKHNtYy0+Y2ZnICYgQ0ZHX01JSV9TRUxFQ1QpID8gMCA6IFRDUl9NT05DU04pIHwKKwkgVENSX0VOQUJMRSB8IFRDUl9QQURfRU4gfCBzbWMtPmR1cGxleCwgaW9hZGRyICsgVENSKTsKKyAgICBzZXRfcnhfbW9kZShkZXYpOworCisgICAgaWYgKHNtYy0+Y2ZnICYgQ0ZHX01JSV9TRUxFQ1QpIHsKKwlTTUNfU0VMRUNUX0JBTksoMyk7CisKKwkvKiBSZXNldCBNSUkgKi8KKwltZGlvX3dyaXRlKGRldiwgc21jLT5taWlfaWYucGh5X2lkLCAwLCAweDgwMDApOworCisJLyogQWR2ZXJ0aXNlIDEwMEYsIDEwMEgsIDEwRiwgMTBIICovCisJbWRpb193cml0ZShkZXYsIHNtYy0+bWlpX2lmLnBoeV9pZCwgNCwgMHgwMWUxKTsKKworCS8qIFJlc3RhcnQgTUlJIGF1dG9uZWdvdGlhdGlvbiAqLworCW1kaW9fd3JpdGUoZGV2LCBzbWMtPm1paV9pZi5waHlfaWQsIDAsIDB4MDAwMCk7CisJbWRpb193cml0ZShkZXYsIHNtYy0+bWlpX2lmLnBoeV9pZCwgMCwgMHgxMjAwKTsKKyAgICB9CisKKyAgICAvKiBFbmFibGUgaW50ZXJydXB0cy4gKi8KKyAgICBTTUNfU0VMRUNUX0JBTksoMik7CisgICAgb3V0dygoSU1fRVBIX0lOVCB8IElNX1JYX09WUk5fSU5UIHwgSU1fUkNWX0lOVCkgPDwgOCwKKwkgaW9hZGRyICsgSU5URVJSVVBUKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBNZWRpYSBzZWxlY3Rpb24gdGltZXIgcm91dGluZQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgbWVkaWFfY2hlY2sodV9sb25nIGFyZykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGFyZzsKKyAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB1X3Nob3J0IGksIG1lZGlhLCBzYXZlZF9iYW5rOworICAgIHVfc2hvcnQgbGluazsKKworICAgIHNhdmVkX2JhbmsgPSBpbncoaW9hZGRyICsgQkFOS19TRUxFQ1QpOworCisgICAgaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCWdvdG8gcmVzY2hlZHVsZTsKKworICAgIFNNQ19TRUxFQ1RfQkFOSygyKTsKKworICAgIC8qIG5lZWQgTUNfUkVTRVQgdG8ga2VlcCB0aGUgbWVtb3J5IGNvbnNpc3RlbnQuIGVycmF0YT8gKi8KKyAgICBpZiAoc21jLT5yeF9vdnJuKSB7CisJb3V0dyhNQ19SRVNFVCwgaW9hZGRyICsgTU1VX0NNRCk7CisJc21jLT5yeF9vdnJuID0gMDsKKyAgICB9CisgICAgaSA9IGludyhpb2FkZHIgKyBJTlRFUlJVUFQpOworICAgIFNNQ19TRUxFQ1RfQkFOSygwKTsKKyAgICBtZWRpYSA9IGludyhpb2FkZHIgKyBFUEgpICYgRVBIX0xJTktfT0s7CisgICAgU01DX1NFTEVDVF9CQU5LKDEpOworICAgIG1lZGlhIHw9IChpbncoaW9hZGRyICsgQ09ORklHKSAmIENGR19BVUlfU0VMRUNUKSA/IDIgOiAxOworCisgICAgLyogQ2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0IHdpdGggd2F0Y2hkb2cgZmxhZyBzZXQ6IHdpdGgKKyAgICAgICB0aGlzLCB3ZSBjYW4gbGltcCBhbG9uZyBldmVuIGlmIHRoZSBpbnRlcnJ1cHQgaXMgYmxvY2tlZCAqLworICAgIGlmIChzbWMtPndhdGNoZG9nKysgJiYgKChpPj44KSAmIGkpKSB7CisJaWYgKCFzbWMtPmZhc3RfcG9sbCkKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludGVycnVwdChzKSBkcm9wcGVkIVxuIiwgZGV2LT5uYW1lKTsKKwlzbWNfaW50ZXJydXB0KGRldi0+aXJxLCBzbWMsIE5VTEwpOworCXNtYy0+ZmFzdF9wb2xsID0gSFo7CisgICAgfQorICAgIGlmIChzbWMtPmZhc3RfcG9sbCkgeworCXNtYy0+ZmFzdF9wb2xsLS07CisJc21jLT5tZWRpYS5leHBpcmVzID0gamlmZmllcyArIEhaLzEwMDsKKwlhZGRfdGltZXIoJnNtYy0+bWVkaWEpOworCVNNQ19TRUxFQ1RfQkFOSyhzYXZlZF9iYW5rKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKHNtYy0+Y2ZnICYgQ0ZHX01JSV9TRUxFQ1QpIHsKKwlpZiAoc21jLT5taWlfaWYucGh5X2lkIDwgMCkKKwkgICAgZ290byByZXNjaGVkdWxlOworCisJU01DX1NFTEVDVF9CQU5LKDMpOworCWxpbmsgPSBtZGlvX3JlYWQoZGV2LCBzbWMtPm1paV9pZi5waHlfaWQsIDEpOworCWlmICghbGluayB8fCAobGluayA9PSAweGZmZmYpKSB7CisgIAkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1JSSBpcyBtaXNzaW5nIVxuIiwgZGV2LT5uYW1lKTsKKwkgICAgc21jLT5taWlfaWYucGh5X2lkID0gLTE7CisJICAgIGdvdG8gcmVzY2hlZHVsZTsKKwl9CisKKwlsaW5rICY9IDB4MDAwNDsKKwlpZiAobGluayAhPSBzbWMtPmxpbmtfc3RhdHVzKSB7CisJICAgIHVfc2hvcnQgcCA9IG1kaW9fcmVhZChkZXYsIHNtYy0+bWlpX2lmLnBoeV9pZCwgNSk7CisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBsaW5rIGJlYXRcbiIsIGRldi0+bmFtZSwKKwkJKGxpbmspID8gImZvdW5kIiA6ICJsb3N0Iik7CisJICAgIHNtYy0+ZHVwbGV4ID0gKCgocCAmIDB4MDEwMCkgfHwgKChwICYgMHgxYzApID09IDB4NDApKQorCQkJICAgPyBUQ1JfRkRVUExYIDogMCk7CisJICAgIGlmIChsaW5rKSB7CisJICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogYXV0b25lZ290aWF0aW9uIGNvbXBsZXRlOiAiCisJCSAgICAgICAiJXNiYXNlVC0lY0Qgc2VsZWN0ZWRcbiIsIGRldi0+bmFtZSwKKwkJICAgICAgICgocCAmIDB4MDE4MCkgPyAiMTAwIiA6ICIxMCIpLAorCQkgICAgICAgKHNtYy0+ZHVwbGV4ID8gJ0YnIDogJ0gnKSk7CisJICAgIH0KKwkgICAgU01DX1NFTEVDVF9CQU5LKDApOworCSAgICBvdXR3KGludyhpb2FkZHIgKyBUQ1IpIHwgc21jLT5kdXBsZXgsIGlvYWRkciArIFRDUik7CisJICAgIHNtYy0+bGlua19zdGF0dXMgPSBsaW5rOworCX0KKwlnb3RvIHJlc2NoZWR1bGU7CisgICAgfQorCisgICAgLyogSWdub3JlIGNvbGxpc2lvbnMgdW5sZXNzIHdlJ3ZlIGhhZCBubyByeCdzIHJlY2VudGx5ICovCisgICAgaWYgKGppZmZpZXMgLSBkZXYtPmxhc3RfcnggPiBIWikgeworCWlmIChzbWMtPnR4X2VyciB8fCAoc21jLT5tZWRpYV9zdGF0dXMgJiBFUEhfMTZDT0wpKQorCSAgICBtZWRpYSB8PSBFUEhfMTZDT0w7CisgICAgfQorICAgIHNtYy0+dHhfZXJyID0gMDsKKworICAgIGlmIChtZWRpYSAhPSBzbWMtPm1lZGlhX3N0YXR1cykgeworCWlmICgobWVkaWEgJiBzbWMtPm1lZGlhX3N0YXR1cyAmIDEpICYmCisJICAgICgoc21jLT5tZWRpYV9zdGF0dXMgXiBtZWRpYSkgJiBFUEhfTElOS19PSykpCisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBsaW5rIGJlYXRcbiIsIGRldi0+bmFtZSwKKwkJICAgKHNtYy0+bWVkaWFfc3RhdHVzICYgRVBIX0xJTktfT0sgPyAibG9zdCIgOiAiZm91bmQiKSk7CisJZWxzZSBpZiAoKG1lZGlhICYgc21jLT5tZWRpYV9zdGF0dXMgJiAyKSAmJgorCQkgKChzbWMtPm1lZGlhX3N0YXR1cyBeIG1lZGlhKSAmIEVQSF8xNkNPTCkpCisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBjb2F4IGNhYmxlICVzXG4iLCBkZXYtPm5hbWUsCisJCSAgIChtZWRpYSAmIEVQSF8xNkNPTCA/ICJwcm9ibGVtIiA6ICJvayIpKTsKKwlpZiAoZGV2LT5pZl9wb3J0ID09IDApIHsKKwkgICAgaWYgKG1lZGlhICYgMSkgeworCQlpZiAobWVkaWEgJiBFUEhfTElOS19PSykKKwkJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBmbGlwcGVkIHRvIDEwYmFzZVRcbiIsCisJCQkgICBkZXYtPm5hbWUpOworCQllbHNlCisJCSAgICBzbWNfc2V0X3hjdnIoZGV2LCAyKTsKKwkgICAgfSBlbHNlIHsKKwkJaWYgKG1lZGlhICYgRVBIXzE2Q09MKQorCQkgICAgc21jX3NldF94Y3ZyKGRldiwgMSk7CisJCWVsc2UKKwkJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBmbGlwcGVkIHRvIDEwYmFzZTJcbiIsCisJCQkgICBkZXYtPm5hbWUpOworCSAgICB9CisJfQorCXNtYy0+bWVkaWFfc3RhdHVzID0gbWVkaWE7CisgICAgfQorCityZXNjaGVkdWxlOgorICAgIHNtYy0+bWVkaWEuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKyAgICBhZGRfdGltZXIoJnNtYy0+bWVkaWEpOworICAgIFNNQ19TRUxFQ1RfQkFOSyhzYXZlZF9iYW5rKTsKK30KKworc3RhdGljIGludCBzbWNfbGlua19vayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgaWYgKHNtYy0+Y2ZnICYgQ0ZHX01JSV9TRUxFQ1QpIHsKKwlyZXR1cm4gbWlpX2xpbmtfb2soJnNtYy0+bWlpX2lmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBTTUNfU0VMRUNUX0JBTksoMCk7CisJcmV0dXJuIGludyhpb2FkZHIgKyBFUEgpICYgRVBIX0xJTktfT0s7CisgICAgfQorfQorCitzdGF0aWMgaW50IHNtY19uZXRkZXZfZ2V0X2VjbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworICAgIHUxNiB0bXA7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIGVjbWQtPnN1cHBvcnRlZCA9IChTVVBQT1JURURfVFAgfCBTVVBQT1JURURfQVVJIHwKKwlTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCk7CisJCQorICAgIFNNQ19TRUxFQ1RfQkFOSygxKTsKKyAgICB0bXAgPSBpbncoaW9hZGRyICsgQ09ORklHKTsKKyAgICBlY21kLT5wb3J0ID0gKHRtcCAmIENGR19BVUlfU0VMRUNUKSA/IFBPUlRfQVVJIDogUE9SVF9UUDsKKyAgICBlY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisgICAgZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDsKKyAgICBlY21kLT5waHlfYWRkcmVzcyA9IGlvYWRkciArIE1HTVQ7CisKKyAgICBTTUNfU0VMRUNUX0JBTksoMCk7CisgICAgdG1wID0gaW53KGlvYWRkciArIFRDUik7CisgICAgZWNtZC0+ZHVwbGV4ID0gKHRtcCAmIFRDUl9GRFVQTFgpID8gRFVQTEVYX0ZVTEwgOiBEVVBMRVhfSEFMRjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNtY19uZXRkZXZfc2V0X2VjbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworICAgIHUxNiB0bXA7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIGlmIChlY21kLT5zcGVlZCAhPSBTUEVFRF8xMCkKKyAgICAJcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKGVjbWQtPmR1cGxleCAhPSBEVVBMRVhfSEFMRiAmJiBlY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpCisgICAgCXJldHVybiAtRUlOVkFMOworICAgIGlmIChlY21kLT5wb3J0ICE9IFBPUlRfVFAgJiYgZWNtZC0+cG9ydCAhPSBQT1JUX0FVSSkKKwlyZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAoZWNtZC0+dHJhbnNjZWl2ZXIgIT0gWENWUl9JTlRFUk5BTCkKKyAgICAJcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoZWNtZC0+cG9ydCA9PSBQT1JUX0FVSSkKKwlzbWNfc2V0X3hjdnIoZGV2LCAxKTsKKyAgICBlbHNlCisJc21jX3NldF94Y3ZyKGRldiwgMCk7CisKKyAgICBTTUNfU0VMRUNUX0JBTksoMCk7CisgICAgdG1wID0gaW53KGlvYWRkciArIFRDUik7CisgICAgaWYgKGVjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwl0bXAgfD0gVENSX0ZEVVBMWDsKKyAgICBlbHNlCisJdG1wICY9IH5UQ1JfRkRVUExYOworICAgIG91dHcodG1wLCBpb2FkZHIgKyBUQ1IpOworCQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX2lmX3J1bm5pbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNtY19nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworfQorCitzdGF0aWMgaW50IHNtY19nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXUxNiBzYXZlZF9iYW5rID0gaW53KGlvYWRkciArIEJBTktfU0VMRUNUKTsKKwlpbnQgcmV0OworCisJU01DX1NFTEVDVF9CQU5LKDMpOworCXNwaW5fbG9ja19pcnEoJnNtYy0+bG9jayk7CisJaWYgKHNtYy0+Y2ZnICYgQ0ZHX01JSV9TRUxFQ1QpCisJCXJldCA9IG1paV9ldGh0b29sX2dzZXQoJnNtYy0+bWlpX2lmLCBlY21kKTsKKwllbHNlCisJCXJldCA9IHNtY19uZXRkZXZfZ2V0X2VjbWQoZGV2LCBlY21kKTsKKwlzcGluX3VubG9ja19pcnEoJnNtYy0+bG9jayk7CisJU01DX1NFTEVDVF9CQU5LKHNhdmVkX2JhbmspOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc21jX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworCWtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdTE2IHNhdmVkX2JhbmsgPSBpbncoaW9hZGRyICsgQkFOS19TRUxFQ1QpOworCWludCByZXQ7CisKKwlTTUNfU0VMRUNUX0JBTksoMyk7CisJc3Bpbl9sb2NrX2lycSgmc21jLT5sb2NrKTsKKwlpZiAoc21jLT5jZmcgJiBDRkdfTUlJX1NFTEVDVCkKKwkJcmV0ID0gbWlpX2V0aHRvb2xfc3NldCgmc21jLT5taWlfaWYsIGVjbWQpOworCWVsc2UKKwkJcmV0ID0gc21jX25ldGRldl9zZXRfZWNtZChkZXYsIGVjbWQpOworCXNwaW5fdW5sb2NrX2lycSgmc21jLT5sb2NrKTsKKwlTTUNfU0VMRUNUX0JBTksoc2F2ZWRfYmFuayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUzMiBzbWNfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisJa2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1MTYgc2F2ZWRfYmFuayA9IGludyhpb2FkZHIgKyBCQU5LX1NFTEVDVCk7CisJdTMyIHJldDsKKworCVNNQ19TRUxFQ1RfQkFOSygzKTsKKwlzcGluX2xvY2tfaXJxKCZzbWMtPmxvY2spOworCXJldCA9IHNtY19saW5rX29rKGRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZzbWMtPmxvY2spOworCVNNQ19TRUxFQ1RfQkFOSyhzYXZlZF9iYW5rKTsKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgUENNQ0lBX0RFQlVHCitzdGF0aWMgdTMyIHNtY19nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gcGNfZGVidWc7Cit9CisKK3N0YXRpYyB2b2lkIHNtY19zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbCkKK3sKKwlwY19kZWJ1ZyA9IHZhbDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHNtY19ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworCWlmIChzbWMtPmNmZyAmIENGR19NSUlfU0VMRUNUKSB7CisJCWtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJCXUxNiBzYXZlZF9iYW5rID0gaW53KGlvYWRkciArIEJBTktfU0VMRUNUKTsKKwkJaW50IHJlczsKKworCQlTTUNfU0VMRUNUX0JBTksoMyk7CisJCXJlcyA9IG1paV9ud2F5X3Jlc3RhcnQoJnNtYy0+bWlpX2lmKTsKKwkJU01DX1NFTEVDVF9CQU5LKHNhdmVkX2JhbmspOworCisJCXJldHVybiByZXM7CisJfSBlbHNlCisJCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBldGh0b29sX29wcyA9IHsKKwkuYmVnaW4gPSBjaGVja19pZl9ydW5uaW5nLAorCS5nZXRfZHJ2aW5mbyA9IHNtY19nZXRfZHJ2aW5mbywKKwkuZ2V0X3NldHRpbmdzID0gc21jX2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzID0gc21jX3NldF9zZXR0aW5ncywKKwkuZ2V0X2xpbmsgPSBzbWNfZ2V0X2xpbmssCisjaWZkZWYgUENNQ0lBX0RFQlVHCisJLmdldF9tc2dsZXZlbCA9IHNtY19nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbCA9IHNtY19zZXRfbXNnbGV2ZWwsCisjZW5kaWYKKwkubndheV9yZXNldCA9IHNtY19ud2F5X3Jlc2V0LAorfTsKKworc3RhdGljIGludCBzbWNfaW9jdGwgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqbWlpID0gaWZfbWlpKHJxKTsKKwlpbnQgcmMgPSAwOworCXUxNiBzYXZlZF9iYW5rOworCWtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxKCZzbWMtPmxvY2spOworCXNhdmVkX2JhbmsgPSBpbncoaW9hZGRyICsgQkFOS19TRUxFQ1QpOworCVNNQ19TRUxFQ1RfQkFOSygzKTsKKwlyYyA9IGdlbmVyaWNfbWlpX2lvY3RsKCZzbWMtPm1paV9pZiwgbWlpLCBjbWQsIE5VTEwpOworCVNNQ19TRUxFQ1RfQkFOSyhzYXZlZF9iYW5rKTsKKwlzcGluX3VubG9ja19pcnEoJnNtYy0+bG9jayk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgc21jOTFjOTJfY3NfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJ2CQk9IHsKKwkJLm5hbWUJPSAic21jOTFjOTJfY3MiLAorCX0sCisJLmF0dGFjaAkJPSBzbWM5MWM5Ml9hdHRhY2gsCisJLmRldGFjaAkJPSBzbWM5MWM5Ml9kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3NtYzkxYzkyX2NzKHZvaWQpCit7CisJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJnNtYzkxYzkyX2NzX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3NtYzkxYzkyX2NzKHZvaWQpCit7CisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZzbWM5MWM5Ml9jc19kcml2ZXIpOworCUJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9zbWM5MWM5Ml9jcyk7Cittb2R1bGVfZXhpdChleGl0X3NtYzkxYzkyX2NzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS94aXJjMnBzX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEveGlyYzJwc19jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MTc3ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wY21jaWEveGlyYzJwc19jcy5jCkBAIC0wLDAgKzEsMjAzMSBAQAorLyogW3hpcmMycHNfY3MuYyB3ayAwMy4xMS45OV0gKDEuNDAgMTk5OS8xMS8xOCAwMDowNjowMykKKyAqIFhpcmNvbSBDcmVkaXRDYXJkIEV0aGVybmV0IEFkYXB0ZXIgSUlwcyBkcml2ZXIKKyAqIFhpcmNvbSBSZWFscG9ydCAxMC8xMDAgKFJFLTEwMCkgZHJpdmVyIAorICoKKyAqIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHZhcmlvdXMgWGlyY29tIENyZWRpdENhcmQgRXRoZXJuZXQgYWRhcHRlcnMKKyAqIGluY2x1ZGluZyB0aGUgQ0UyLCBDRSBJSXBzLCBSRS0xMCwgQ0VNMjgsIENFTTMzLCBDRTMzLCBDRU01NiwKKyAqIENFMy0xMDAsIENFM0IsIFJFLTEwMCwgUkVNMTBCVCwgYW5kIFJFTTU2Ry0xMDAuCisgKgorICogMjAwMC0wOS0yNCA8cHNoZWVyQGljb24uY28uemE+IFRoZSBYaXJjb20gQ0UzQi0xMDAgbWF5IG5vdAorICogYXV0b2RldGVjdCB0aGUgbWVkaWEgcHJvcGVybHkuIEluIHRoaXMgY2FzZSB1c2UgdGhlCisgKiBpZl9wb3J0PTEgKGZvciAxMEJhc2VUKSBvciBpZl9wb3J0PTQgKGZvciAxMDBCYXNlVCkgb3B0aW9ucworICogdG8gZm9yY2UgdGhlIG1lZGlhIHR5cGUuCisgKiAKKyAqIFdyaXR0ZW4gb3JpZ2luYWxseSBieSBXZXJuZXIgS29jaCBiYXNlZCBvbiBEYXZpZCBIaW5kcycgc2tlbGV0b24gb2YgdGhlCisgKiBQQ01DSUEgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NywxOTk4IFdlcm5lciBLb2NoIChkZDlqbikKKyAqCisgKiBUaGlzIGRyaXZlciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogSXQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIGRyaXZlciBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UsIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhpcyBsaWNlbnNlCisgKiBhcmUgcmVxdWlyZWQgSU5TVEVBRCBPRiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICAoVGhpcyBjbGF1c2UKKyAqIGlzIG5lY2Vzc2FyeSBkdWUgdG8gYSBwb3RlbnRpYWwgYmFkIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIEdQTCBhbmQKKyAqIHRoZSByZXN0cmljdGlvbnMgY29udGFpbmVkIGluIGEgQlNELXN0eWxlIGNvcHlyaWdodC4pCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCBhbmQgdGhlIGVudGlyZSBwZXJtaXNzaW9uIG5vdGljZSBpbiBpdHMgZW50aXJldHksCisgKiAgICBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudGllcy4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNjb2RlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmbmRlZiBNQU5GSURfQ09NUEFRCisgICNkZWZpbmUgTUFORklEX0NPTVBBUSAJICAgMHgwMTM4CisgICNkZWZpbmUgTUFORklEX0NPTVBBUTIJICAgMHgwMTgzICAvKiBpcyB0aGlzIGNvcnJlY3Q/ICovCisjZW5kaWYKKworI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgVHggaHVuZyAqLworI2RlZmluZSBUWF9USU1FT1VUCSgoNDAwKkhaKS8xMDAwKQorCisvKioqKioqKioqKioqKioqKgorICogU29tZSBjb25zdGFudHMgdXNlZCB0byBhY2Nlc3MgdGhlIGhhcmR3YXJlCisgKi8KKworLyogUmVnaXN0ZXIgb2Zmc2V0cyBhbmQgdmFsdWUgY29uc3RhbnMgKi8KKyNkZWZpbmUgWElSQ1JFR19DUiAgMAkvKiBDb21tYW5kIHJlZ2lzdGVyICh3cikgKi8KK2VudW0geGlyY19jciB7CisgICAgVHJhbnNtaXRQYWNrZXQgPSAweDAxLAorICAgIFNvZnRSZXNldCA9IDB4MDIsCisgICAgRW5hYmxlSW50ciA9IDB4MDQsCisgICAgRm9yY2VJbnRyICA9IDB4MDgsCisgICAgQ2xlYXJUeEZJRk8gPSAweDEwLAorICAgIENsZWFyUnhPdnJ1biA9IDB4MjAsCisgICAgUmVzdGFydFR4CSA9IDB4NDAKK307CisjZGVmaW5lIFhJUkNSRUdfRVNSIDAJLyogRXRoZXJuZXQgc3RhdHVzIHJlZ2lzdGVyIChyZCkgKi8KK2VudW0geGlyY19lc3IgeworICAgIEZ1bGxQa3RSY3ZkID0gMHgwMSwgLyogZnVsbCBwYWNrZXQgaW4gcmVjZWl2ZSBidWZmZXIgKi8KKyAgICBQa3RSZWplY3RlZCA9IDB4MDQsIC8qIGEgcGFja2V0IGhhcyBiZWVuIHJlamVjdGVkICovCisgICAgVHhQa3RQZW5kID0gMHgwOCwJLyogVFggUGFja2V0IFBlbmRpbmcgKi8KKyAgICBJbmNvclBvbGFyaXR5ID0gMHgxMCwKKyAgICBNZWRpYVNlbGVjdCA9IDB4MjAJLyogc2V0IGlmIFRQLCBjbGVhciBpZiBBVUkgKi8KK307CisjZGVmaW5lIFhJUkNSRUdfUFIgIDEJLyogUGFnZSBSZWdpc3RlciBzZWxlY3QgKi8KKyNkZWZpbmUgWElSQ1JFR19FRFAgNAkvKiBFdGhlcm5ldCBEYXRhIFBvcnQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWElSQ1JFR19JU1IgNgkvKiBFdGhlcm5ldCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCitlbnVtIHhpcmNfaXNyIHsKKyAgICBUeEJ1Zk92ciA9IDB4MDEsCS8qIFRYIEJ1ZmZlciBPdmVyZmxvdyAqLworICAgIFBrdFR4ZWQgID0gMHgwMiwJLyogUGFja2V0IFRyYW5zbWl0dGVkICovCisgICAgTUFDSW50ciAgPSAweDA0LAkvKiBNQUMgSW50ZXJydXB0IG9jY3VycmVkICovCisgICAgVHhSZXNHcmFudCA9IDB4MDgsCS8qIFR4IFJlc2VydmF0aW9uIEdyYW50ZWQgKi8KKyAgICBSeEZ1bGxQa3QgPSAweDIwLAkvKiBSeCBGdWxsIFBhY2tldCAqLworICAgIFJ4UGt0UmVqICA9IDB4NDAsCS8qIFJ4IFBhY2tldCBSZWplY3RlZCAqLworICAgIEZvcmNlZEludHI9IDB4ODAJLyogRm9yY2VkIEludGVycnVwdCAqLworfTsKKyNkZWZpbmUgWElSQ1JFRzFfSU1SMCAxMiAvKiBFdGhlcm5ldCBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAob24gcGFnZSAxKSovCisjZGVmaW5lIFhJUkNSRUcxX0lNUjEgMTMKKyNkZWZpbmUgWElSQ1JFRzBfVFNPICA4ICAvKiBUcmFuc21pdCBTcGFjZSBPcGVuIFJlZ2lzdGVyIChvbiBwYWdlIDApKi8KKyNkZWZpbmUgWElSQ1JFRzBfVFJTICAxMCAvKiBUcmFuc21pdCByZXNlcnZhdGlvbiBTaXplIFJlZ2lzdGVyIChwYWdlIDApKi8KKyNkZWZpbmUgWElSQ1JFRzBfRE8gICAxMiAvKiBEYXRhIE9mZnNldCBSZWdpc3RlciAocGFnZSAwKSAod3IpICovCisjZGVmaW5lIFhJUkNSRUcwX1JTUiAgMTIgLyogUmVjZWl2ZSBTdGF0dXMgUmVnaXN0ZXIgKHBhZ2UgMCkgKHJkKSAqLworZW51bSB4aXJjX3JzciB7CisgICAgUGh5UGt0ID0gMHgwMSwJLyogc2V0OnBoeXNpY2FsIHBhY2tldCwgY2xlYXI6IG11bHRpY2FzdCBwYWNrZXQgKi8KKyAgICBCcmRjc3RQa3QgPSAweDAyLAkvKiBzZXQgaWYgaXQgaXMgYSBicm9hZGNhc3QgcGFja2V0ICovCisgICAgUGt0VG9vTG9uZyA9IDB4MDQsCS8qIHNldCBpZiBwYWNrZXQgbGVuZ3RoID4gMTUxOCAqLworICAgIEFsaWduRXJyID0gMHgxMCwJLyogaW5jb3JyZWN0IENSQyBhbmQgbGFzdCBvY3RldCBub3QgY29tcGxldGUgKi8KKyAgICBDUkNFcnIgPSAweDIwLAkvKiBpbmNvcnJlY3QgQ1JDIGFuZCBsYXN0IG9jdGV0IGlzIGNvbXBsZXRlICovCisgICAgUGt0UnhPayA9IDB4ODAJLyogcmVjZWl2ZWQgb2sgKi8KK307CisjZGVmaW5lIFhJUkNSRUcwX1BUUiAxMyAvKiBwYWNrZXRzIHRyYW5zbWl0dGVkIHJlZ2lzdGVyIChyZCkgKi8KKyNkZWZpbmUgWElSQ1JFRzBfUkJDIDE0IC8qIHJlY2VpdmUgYnl0ZSBjb3VudCByZWdzaXN0ZXIgKHJkKSAqLworI2RlZmluZSBYSVJDUkVHMV9FQ1IgMTQgLyogZXRoZXJuZXQgY29uZmlndXJhdGlvbm4gcmVnaXN0ZXIgKi8KK2VudW0geGlyY19lY3IgeworICAgIEZ1bGxEdXBsZXggPSAweDA0LAkvKiBlbmFibGUgZnVsbCBkdXBsZXggbW9kZSAqLworICAgIExvbmdUUE1vZGUgPSAweDA4LAkvKiBhZGp1c3QgZm9yIGxvbmdlciBsZW5ndGhzIG9mIFRQIGNhYmxlICovCisgICAgRGlzYWJsZVBvbENvciA9IDB4MTAsLyogZGlzYWJsZSBhdXRvIHBvbGFyaXR5IGNvcnJlY3Rpb24gKi8KKyAgICBEaXNhYmxlTGlua1B1bHNlID0gMHgyMCwgLyogZGlzYWJsZSBsaW5rIHB1bHNlIGdlbmVyYXRpb24gKi8KKyAgICBEaXNhYmxlQXV0b1R4ID0gMHg0MCwgLyogZGlzYWJsZSBhdXRvLXRyYW5zbWl0ICovCit9OworI2RlZmluZSBYSVJDUkVHMl9SQlMgOAkvKiByZWNlaXZlIGJ1ZmZlciBzdGFydCByZWdpc3RlciAqLworI2RlZmluZSBYSVJDUkVHMl9MRUQgMTAgLyogTEVEIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKy8qIHZhbHVlcyBmb3IgdGhlIGxlZHM6ICAgIEJpdHMgMi0wIGZvciBsZWQgMQorICogIDAgZGlzYWJsZWQJCSAgIEJpdHMgNS0zIGZvciBsZWQgMgorICogIDEgY29sbGlzaW9uCisgKiAgMiBub25jb2xsaXNpb24KKyAqICAzIGxpbmtfZGV0ZWN0ZWQKKyAqICA0IGluY29yX3BvbGFyaXR5CisgKiAgNSBqYWJiZXIKKyAqICA2IGF1dG9fYXNzZXJ0aW9uCisgKiAgNyByeF90eF9hY3Rpdml0eQorICovCisjZGVmaW5lIFhJUkNSRUcyX01TUiAxMiAvKiBNb2hhd2sgc3BlY2lmaWMgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBYSVJDUkVHNF9HUFIwIDggLyogR2VuZXJhbCBQdXJwb3NlIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgWElSQ1JFRzRfR1BSMSA5IC8qIEdlbmVyYWwgUHVycG9zZSBSZWdpc3RlciAxICovCisjZGVmaW5lIFhJUkNSRUcyX0dQUjIgMTMgLyogR2VuZXJhbCBQdXJwb3NlIFJlZ2lzdGVyIDIgKHBhZ2UyISkqLworI2RlZmluZSBYSVJDUkVHNF9CT1YgMTAgLyogQm9uZGluZyBWZXJzaW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIFhJUkNSRUc0X0xNQSAxMiAvKiBMb2NhbCBNZW1vcnkgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZSBYSVJDUkVHNF9MTUQgMTQgLyogTG9jYWwgTWVtb3J5IERhdGEgUG9ydCAqLworLyogTUFDIHJlZ2lzdGVyIGNhbiBvbmx5IGJ5IGFjY2Vzc2VkIHdpdGggOCBiaXQgb3BlcmF0aW9ucyAqLworI2RlZmluZSBYSVJDUkVHNDBfQ01EMCA4ICAgIC8qIENvbW1hbmQgUmVnaXN0ZXIgKHdyKSAqLworZW51bSB4aXJjX2NtZCB7IAkgICAgLyogQ29tbWFuZHMgKi8KKyAgICBUcmFuc21pdCA9IDB4MDEsCisgICAgRW5hYmxlUmVjdiA9IDB4MDQsCisgICAgRGlzYWJsZVJlY3YgPSAweDA4LAorICAgIEFib3J0ID0gMHgxMCwKKyAgICBPbmxpbmUgPSAweDIwLAorICAgIEludHJBY2sgPSAweDQwLAorICAgIE9mZmxpbmUgPSAweDgwCit9OworI2RlZmluZSBYSVJDUkVHNV9SSFNBMAkxMCAgLyogUnggSG9zdCBTdGFydCBBZGRyZXNzICovCisjZGVmaW5lIFhJUkNSRUc0MF9SWFNUMCA5ICAgLyogUmVjZWl2ZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWElSQ1JFRzQwX1RYU1QwIDExICAvKiBUcmFuc21pdCBTdGF0dXMgUmVnaXN0ZXIgMCAqLworI2RlZmluZSBYSVJDUkVHNDBfVFhTVDEgMTIgIC8qIFRyYW5zbWl0IFN0YXR1cyBSZWdpc3RlciAxMCAqLworI2RlZmluZSBYSVJDUkVHNDBfUk1BU0swIDEzICAvKiBSZWNlaXZlIE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWElSQ1JFRzQwX1RNQVNLMCAxNCAgLyogVHJhbnNtaXQgTWFzayBSZWdpc3RlciAwICovCisjZGVmaW5lIFhJUkNSRUc0MF9UTUFTSzEgMTUgIC8qIFRyYW5zbWl0IE1hc2sgUmVnaXN0ZXIgMCAqLworI2RlZmluZSBYSVJDUkVHNDJfU1dDMAk4ICAgLyogU29mdHdhcmUgQ29uZmlndXJhdGlvbiAwICovCisjZGVmaW5lIFhJUkNSRUc0Ml9TV0MxCTkgICAvKiBTb2Z0d2FyZSBDb25maWd1cmF0aW9uIDEgKi8KKyNkZWZpbmUgWElSQ1JFRzQyX0JPQwkxMCAgLyogQmFjay1PZmYgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBYSVJDUkVHNDRfVERSMAk4ICAgLyogVGltZSBEb21haW4gUmVmbGVjdG9tZXRyeSAwICovCisjZGVmaW5lIFhJUkNSRUc0NF9URFIxCTkgICAvKiBUaW1lIERvbWFpbiBSZWZsZWN0b21ldHJ5IDEgKi8KKyNkZWZpbmUgWElSQ1JFRzQ0X1JYQkNfTE8gMTAgLyogUnggQnl0ZSBDb3VudCAwIChyZCkgKi8KKyNkZWZpbmUgWElSQ1JFRzQ0X1JYQkNfSEkgMTEgLyogUnggQnl0ZSBDb3VudCAxIChyZCkgKi8KKyNkZWZpbmUgWElSQ1JFRzQ1X1JFVgkgMTUgLyogUmV2aXNpb24gUmVnaXN0ZXIgKHJkKSAqLworI2RlZmluZSBYSVJDUkVHNTBfSUEJOCAgIC8qIEluZGl2aWR1YWwgQWRkcmVzcyAoOC0xMykgKi8KKworc3RhdGljIGNoYXIgKmlmX25hbWVzW10gPSB7ICJBdXRvIiwgIjEwQmFzZVQiLCAiMTBCYXNlMiIsICJBVUkiLCAiMTAwQmFzZVQiIH07CisKKy8qKioqKioqKioqKioqKioqCisgKiBBbGwgdGhlIFBDTUNJQSBtb2R1bGVzIHVzZSBQQ01DSUFfREVCVUcgdG8gY29udHJvbCBkZWJ1Z2dpbmcuICBJZgorICogeW91IGRvIG5vdCBkZWZpbmUgUENNQ0lBX0RFQlVHIGF0IGFsbCwgYWxsIHRoZSBkZWJ1ZyBjb2RlIHdpbGwgYmUKKyAqIGxlZnQgb3V0LiAgSWYgeW91IGNvbXBpbGUgd2l0aCBQQ01DSUFfREVCVUc9MCwgdGhlIGRlYnVnIGNvZGUgd2lsbAorICogYmUgcHJlc2VudCBidXQgZGlzYWJsZWQgLS0gYnV0IGl0IGNhbiB0aGVuIGJlIGVuYWJsZWQgZm9yIHNwZWNpZmljCisgKiBtb2R1bGVzIGF0IGxvYWQgdGltZSB3aXRoIGEgJ3BjX2RlYnVnPSMnIG9wdGlvbiB0byBpbnNtb2QuCisgKi8KKyNpZmRlZiBQQ01DSUFfREVCVUcKK3N0YXRpYyBpbnQgcGNfZGVidWcgPSBQQ01DSUFfREVCVUc7Cittb2R1bGVfcGFyYW0ocGNfZGVidWcsIGludCwgMCk7CisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhLREJHX1hJUkMgYXJncykKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCisjZW5kaWYKKworI2RlZmluZSBLREJHX1hJUkMgS0VSTl9ERUJVRyAgICJ4aXJjMnBzX2NzOiAiCisjZGVmaW5lIEtFUlJfWElSQyBLRVJOX0VSUiAgICAgInhpcmMycHNfY3M6ICIKKyNkZWZpbmUgS1dSTl9YSVJDIEtFUk5fV0FSTklORyAieGlyYzJwc19jczogIgorI2RlZmluZSBLTk9UX1hJUkMgS0VSTl9OT1RJQ0UgICJ4aXJjMnBzX2NzOiAiCisjZGVmaW5lIEtJTkZfWElSQyBLRVJOX0lORk8gICAgInhpcmMycHNfY3M6ICIKKworLyogY2FyZCB0eXBlcyAqLworI2RlZmluZSBYSVJfVU5LTk9XTiAgMAkvKiB1bmtub3duOiBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIFhJUl9DRQkgICAgIDEJLyogKHByb2RpZCAxKSBkaWZmZXJlbnQgaGFyZHdhcmU6IG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgWElSX0NFMiAgICAgIDIJLyogKHByb2RpZCAyKSAqLworI2RlZmluZSBYSVJfQ0UzICAgICAgMwkvKiAocHJvZGlkIDMpICovCisjZGVmaW5lIFhJUl9DRU0gICAgICA0CS8qIChwcm9kaWQgMSkgZGlmZmVyZW50IGhhcmR3YXJlOiBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIFhJUl9DRU0yICAgICA1CS8qIChwcm9kaWQgMikgKi8KKyNkZWZpbmUgWElSX0NFTTMgICAgIDYJLyogKHByb2RpZCAzKSAqLworI2RlZmluZSBYSVJfQ0VNMzMgICAgNwkvKiAocHJvZGlkIDQpICovCisjZGVmaW5lIFhJUl9DRU01Nk0gICA4CS8qIChwcm9kaWQgNSkgKi8KKyNkZWZpbmUgWElSX0NFTTU2ICAgIDkJLyogKHByb2RpZCA2KSAqLworI2RlZmluZSBYSVJfQ00yOCAgICAxMAkvKiAocHJvZGlkIDMpIG1vZGVtIG9ubHk6IG5vdCBzdXBwb3J0ZWQgaGVyZSAqLworI2RlZmluZSBYSVJfQ00zMyAgICAxMQkvKiAocHJvZGlkIDQpIG1vZGVtIG9ubHk6IG5vdCBzdXBwb3J0ZWQgaGVyZSAqLworI2RlZmluZSBYSVJfQ001NiAgICAxMgkvKiAocHJvZGlkIDUpIG1vZGVtIG9ubHk6IG5vdCBzdXBwb3J0ZWQgaGVyZSAqLworI2RlZmluZSBYSVJfQ0cJICAgIDEzCS8qIChwcm9kaWQgMSkgR1NNIG1vZGVtIG9ubHk6IG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgWElSX0NCRSAgICAgMTQJLyogKHByb2RpZCAxKSBjYXJkYnVzIGV0aGVybmV0OiBub3Qgc3VwcG9ydGVkICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJYaXJjb20gUENNQ0lBIGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTVBML0dQTCIpOworCisjZGVmaW5lIElOVF9NT0RVTEVfUEFSTShuLCB2KSBzdGF0aWMgaW50IG4gPSB2OyBtb2R1bGVfcGFyYW0obiwgaW50LCAwKQorCitJTlRfTU9EVUxFX1BBUk0oaWZfcG9ydCwJMCk7CitJTlRfTU9EVUxFX1BBUk0oZnVsbF9kdXBsZXgsCTApOworSU5UX01PRFVMRV9QQVJNKGRvX3NvdW5kLCAJMSk7CitJTlRfTU9EVUxFX1BBUk0obG9ja3VwX2hhY2ssCTApOyAgLyogYW50aSBsb2NrdXAgaGFjayAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogV2UgZG8gbm90IHByb2Nlc3MgbW9yZSB0aGFuIHRoZXNlIG51bWJlciBvZiBieXRlcyBkdXJpbmcgb25lCisgKiBpbnRlcnJ1cHQuIChPZiBjb3Vyc2Ugd2UgcmVjZWl2ZSBjb21wbGV0ZSBwYWNrZXRzLCBzbyB0aGlzIGlzIG5vdAorICogYW4gZXhhY3QgdmFsdWUpLgorICogU29tZXRoaW5nIGJldHdlZW4gMjAwMC4uMjIwMDA7IGZpcnN0IHZhbHVlIGdpdmVzIGJlc3QgaW50ZXJydXB0IGxhdGVuY3ksCisgKiB0aGUgc2Vjb25kIGVuYWJsZXMgdGhlIHVzYWdlIG9mIHRoZSBjb21wbGV0ZSBvbi1jaGlwIGJ1ZmZlci4gV2UgdXNlIHRoZQorICogaGlnaCB2YWx1ZSBhcyB0aGUgaW5pdGlhbCB2YWx1ZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIG1heHJ4X2J5dGVzID0gMjIwMDA7CisKKy8qIE1JSSBtYW5hZ2VtZW50IHByb3RvdHlwZXMgKi8KK3N0YXRpYyB2b2lkIG1paV9pZGxlKGtpb19hZGRyX3QgaW9hZGRyKTsKK3N0YXRpYyB2b2lkIG1paV9wdXRiaXQoa2lvX2FkZHJfdCBpb2FkZHIsIHVuc2lnbmVkIGRhdGEpOworc3RhdGljIGludCAgbWlpX2dldGJpdChraW9fYWRkcl90IGlvYWRkcik7CitzdGF0aWMgdm9pZCBtaWlfd2JpdHMoa2lvX2FkZHJfdCBpb2FkZHIsIHVuc2lnbmVkIGRhdGEsIGludCBsZW4pOworc3RhdGljIHVuc2lnbmVkIG1paV9yZChraW9fYWRkcl90IGlvYWRkciwgdV9jaGFyIHBoeWFkZHIsIHVfY2hhciBwaHlyZWcpOworc3RhdGljIHZvaWQgbWlpX3dyKGtpb19hZGRyX3QgaW9hZGRyLCB1X2NoYXIgcGh5YWRkciwgdV9jaGFyIHBoeXJlZywKKwkJICAgdW5zaWduZWQgZGF0YSwgaW50IGxlbik7CisKKy8qCisgKiBUaGUgZXZlbnQoKSBmdW5jdGlvbiBpcyB0aGlzIGRyaXZlcidzIENhcmQgU2VydmljZXMgZXZlbnQgaGFuZGxlci4KKyAqIEl0IHdpbGwgYmUgY2FsbGVkIGJ5IENhcmQgU2VydmljZXMgd2hlbiBhbiBhcHByb3ByaWF0ZSBjYXJkIHN0YXR1cworICogZXZlbnQgaXMgcmVjZWl2ZWQuICBUaGUgY29uZmlnKCkgYW5kIHJlbGVhc2UoKSBlbnRyeSBwb2ludHMgYXJlCisgKiB1c2VkIHRvIGNvbmZpZ3VyZSBvciByZWxlYXNlIGEgc29ja2V0LCBpbiByZXNwb25zZSB0byBjYXJkIGluc2VydGlvbgorICogYW5kIGVqZWN0aW9uIGV2ZW50cy4gIFRoZXkgYXJlIGludm9rZWQgZnJvbSB0aGUgZXZlbnQgaGFuZGxlci4KKyAqLworCitzdGF0aWMgaW50IGhhc19jZTJfc3RyaW5nKGRldl9saW5rX3QgKiBsaW5rKTsKK3N0YXRpYyB2b2lkIHhpcmMycHNfY29uZmlnKGRldl9saW5rX3QgKiBsaW5rKTsKK3N0YXRpYyB2b2lkIHhpcmMycHNfcmVsZWFzZShkZXZfbGlua190ICogbGluayk7CitzdGF0aWMgaW50IHhpcmMycHNfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqIGFyZ3MpOworCisvKioqKioqKioqKioqKioqKgorICogVGhlIGF0dGFjaCgpIGFuZCBkZXRhY2goKSBlbnRyeSBwb2ludHMgYXJlIHVzZWQgdG8gY3JlYXRlIGFuZCBkZXN0cm95CisgKiAiaW5zdGFuY2VzIiBvZiB0aGUgZHJpdmVyLCB3aGVyZSBlYWNoIGluc3RhbmNlIHJlcHJlc2VudHMgZXZlcnl0aGluZworICogbmVlZGVkIHRvIG1hbmFnZSBvbmUgYWN0dWFsIFBDTUNJQSBjYXJkLgorICovCisKK3N0YXRpYyBkZXZfbGlua190ICp4aXJjMnBzX2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIHhpcmMycHNfZGV0YWNoKGRldl9saW5rX3QgKik7CisKKy8qKioqKioqKioqKioqKioqCisgKiBZb3UnbGwgYWxzbyBuZWVkIHRvIHByb3RvdHlwZSBhbGwgdGhlIGZ1bmN0aW9ucyB0aGF0IHdpbGwgYWN0dWFsbHkKKyAqIGJlIHVzZWQgdG8gdGFsayB0byB5b3VyIGRldmljZS4gIFNlZSAncGNtZW1fY3MnIGZvciBhIGdvb2QgZXhhbXBsZQorICogb2YgYSBmdWxseSBzZWxmLXN1ZmZpY2llbnQgZHJpdmVyOyB0aGUgb3RoZXIgZHJpdmVycyByZWx5IG1vcmUgb3IKKyAqIGxlc3Mgb24gb3RoZXIgcGFydHMgb2YgdGhlIGtlcm5lbC4KKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgeGlyYzJwc19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKy8qCisgKiBUaGUgZGV2X2luZm8gdmFyaWFibGUgaXMgdGhlICJrZXkiIHRoYXQgaXMgdXNlZCB0byBtYXRjaCB1cCB0aGlzCisgKiBkZXZpY2UgZHJpdmVyIHdpdGggYXBwcm9wcmlhdGUgY2FyZHMsIHRocm91Z2ggdGhlIGNhcmQgY29uZmlndXJhdGlvbgorICogZGF0YWJhc2UuCisgKi8KKworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAieGlyYzJwc19jcyI7CisKKy8qKioqKioqKioqKioqKioqCisgKiBBIGxpbmtlZCBsaXN0IG9mICJpbnN0YW5jZXMiIG9mIHRoZSBkZXZpY2UuICBFYWNoIGFjdHVhbAorICogUENNQ0lBIGNhcmQgY29ycmVzcG9uZHMgdG8gb25lIGRldmljZSBpbnN0YW5jZSwgYW5kIGlzIGRlc2NyaWJlZAorICogYnkgb25lIGRldl9saW5rX3Qgc3RydWN0dXJlIChkZWZpbmVkIGluIGRzLmgpLgorICoKKyAqIFlvdSBtYXkgbm90IHdhbnQgdG8gdXNlIGEgbGlua2VkIGxpc3QgZm9yIHRoaXMgLS0gZm9yIGV4YW1wbGUsIHRoZQorICogbWVtb3J5IGNhcmQgZHJpdmVyIHVzZXMgYW4gYXJyYXkgb2YgZGV2X2xpbmtfdCBwb2ludGVycywgd2hlcmUgbWlub3IKKyAqIGRldmljZSBudW1iZXJzIGFyZSB1c2VkIHRvIGRlcml2ZSB0aGUgY29ycmVzcG9uZGluZyBhcnJheSBpbmRleC4KKyAqLworCitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3Q7CisKKy8qKioqKioqKioqKioqKioqCisgKiBBIGRldl9saW5rX3Qgc3RydWN0dXJlIGhhcyBmaWVsZHMgZm9yIG1vc3QgdGhpbmdzIHRoYXQgYXJlIG5lZWRlZAorICogdG8ga2VlcCB0cmFjayBvZiBhIHNvY2tldCwgYnV0IHRoZXJlIHdpbGwgdXN1YWxseSBiZSBzb21lIGRldmljZQorICogc3BlY2lmaWMgaW5mb3JtYXRpb24gdGhhdCBhbHNvIG5lZWRzIHRvIGJlIGtlcHQgdHJhY2sgb2YuICBUaGUKKyAqICdwcml2JyBwb2ludGVyIGluIGEgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgdG8gcG9pbnQgdG8KKyAqIGEgZGV2aWNlLXNwZWNpZmljIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUsIGxpa2UgdGhpcy4KKyAqCisgKiBBIGRyaXZlciBuZWVkcyB0byBwcm92aWRlIGEgZGV2X25vZGVfdCBzdHJ1Y3R1cmUgZm9yIGVhY2ggZGV2aWNlCisgKiBvbiBhIGNhcmQuICBJbiBzb21lIGNhc2VzLCB0aGVyZSBpcyBvbmx5IG9uZSBkZXZpY2UgcGVyIGNhcmQgKGZvcgorICogZXhhbXBsZSwgZXRoZXJuZXQgY2FyZHMsIG1vZGVtcykuICBJbiBvdGhlciBjYXNlcywgdGhlcmUgbWF5IGJlCisgKiBtYW55IGFjdHVhbCBvciBsb2dpY2FsIGRldmljZXMgKFNDU0kgYWRhcHRlcnMsIG1lbW9yeSBjYXJkcyB3aXRoCisgKiBtdWx0aXBsZSBwYXJ0aXRpb25zKS4gIFRoZSBkZXZfbm9kZV90IHN0cnVjdHVyZXMgbmVlZCB0byBiZSBrZXB0CisgKiBpbiBhIGxpbmtlZCBsaXN0IHN0YXJ0aW5nIGF0IHRoZSAnZGV2JyBmaWVsZCBvZiBhIGRldl9saW5rX3QKKyAqIHN0cnVjdHVyZS4gIFdlIGFsbG9jYXRlIHRoZW0gaW4gdGhlIGNhcmQncyBwcml2YXRlIGRhdGEgc3RydWN0dXJlLAorICogYmVjYXVzZSB0aGV5IGdlbmVyYWxseSBjYW4ndCBiZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHkuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbG9jYWxfaW5mb190IHsKKyAgICBkZXZfbGlua190IGxpbms7CisgICAgZGV2X25vZGVfdCBub2RlOworICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworICAgIGludCBjYXJkX3R5cGU7CisgICAgaW50IHByb2JlX3BvcnQ7CisgICAgaW50IHNpbGljb247IC8qIHNpbGljb24gcmV2aXNpb24uIDA9b2xkIENFMiwgMT1TY2lwcGVyLCA0PU1vaGF3ayAqLworICAgIGludCBtb2hhd2s7ICAvKiBhIENFMyB0eXBlIGNhcmQgKi8KKyAgICBpbnQgZGluZ287CSAvKiBhIENFTTU2IHR5cGUgY2FyZCAqLworICAgIGludCBuZXdfbWlpOyAvKiBoYXMgZnVsbCAxMGJhc2VULzEwMGJhc2VUIE1JSSAqLworICAgIGludCBtb2RlbTsJIC8qIGlzIGEgbXVsdGkgZnVuY3Rpb24gY2FyZCAoaS5lIHdpdGggYSBtb2RlbSkgKi8KKyAgICB2b2lkIF9faW9tZW0gKmRpbmdvX2NjcjsgLyogb25seSB1c2VkIGZvciBDRU01NiBjYXJkcyAqLworICAgIHVuc2lnbmVkIGxhc3RfcHRyX3ZhbHVlOyAvKiBsYXN0IHBhY2tldHMgdHJhbnNtaXR0ZWQgdmFsdWUgKi8KKyAgICBjb25zdCBjaGFyICptYW5mX3N0cjsKK30gbG9jYWxfaW5mb190OworCisvKioqKioqKioqKioqKioqKgorICogU29tZSBtb3JlIHByb3RvdHlwZXMKKyAqLworc3RhdGljIGludCBkb19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZG9fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZG9fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X2FkZHJlc3NlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc2V0X2NhcmRfdHlwZShkZXZfbGlua190ICpsaW5rLCBjb25zdCB2b2lkICpzKTsKK3N0YXRpYyBpbnQgZG9fY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKTsKK3N0YXRpYyBpbnQgZG9fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZG9faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wczsKK3N0YXRpYyB2b2lkIGhhcmRyZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGRvX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBmdWxsKTsKK3N0YXRpYyBpbnQgaW5pdF9taWkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBkb19wb3dlcmRvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGRvX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qPT09PT09PT09PT09PT09IEhlbHBlciBmdW5jdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50CitmaXJzdF90dXBsZShjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCB0dXBsZV90ICp0dXBsZSwgY2lzcGFyc2VfdCAqcGFyc2UpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsIHR1cGxlKSkgPT0gMCAmJgorCQkJKGVyciA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsIHR1cGxlKSkgPT0gMCkKKwkJZXJyID0gcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgdHVwbGUsIHBhcnNlKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50CituZXh0X3R1cGxlKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIHR1cGxlX3QgKnR1cGxlLCBjaXNwYXJzZV90ICpwYXJzZSkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBwY21jaWFfZ2V0X25leHRfdHVwbGUoaGFuZGxlLCB0dXBsZSkpID09IDAgJiYKKwkJCShlcnIgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCB0dXBsZSkpID09IDApCisJCWVyciA9IHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSk7CisJcmV0dXJuIGVycjsKK30KKworI2RlZmluZSBTZWxlY3RQYWdlKHBnbnIpICAgb3V0YigocGduciksIGlvYWRkciArIFhJUkNSRUdfUFIpCisjZGVmaW5lIEdldEJ5dGUocmVnKQkgICAoKHVuc2lnbmVkKWluYihpb2FkZHIgKyAocmVnKSkpCisjZGVmaW5lIEdldFdvcmQocmVnKQkgICAoKHVuc2lnbmVkKWludyhpb2FkZHIgKyAocmVnKSkpCisjZGVmaW5lIFB1dEJ5dGUocmVnLHZhbHVlKSBvdXRiKCh2YWx1ZSksIGlvYWRkcisocmVnKSkKKyNkZWZpbmUgUHV0V29yZChyZWcsdmFsdWUpIG91dHcoKHZhbHVlKSwgaW9hZGRyKyhyZWcpKQorCisvKj09PT09PSBGdW5jdGlvbnMgdXNlZCBmb3IgZGVidWdnaW5nID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaWYgZGVmaW5lZChQQ01DSUFfREVCVUcpICYmIDAgLyogcmVhZGluZyByZWdzIG1heSBjaGFuZ2Ugc3lzdGVtIHN0YXR1cyAqLworc3RhdGljIHZvaWQKK1ByaW50UmVnaXN0ZXJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIGlmIChwY19kZWJ1ZyA+IDEpIHsKKwlpbnQgaSwgcGFnZTsKKworCXByaW50ayhLREJHX1hJUkMgIlJlZ2lzdGVyICBjb21tb246ICIpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJICAgIHByaW50aygiICUyLjJ4IiwgR2V0Qnl0ZShpKSk7CisJcHJpbnRrKCJcbiIpOworCWZvciAocGFnZSA9IDA7IHBhZ2UgPD0gODsgcGFnZSsrKSB7CisJICAgIHByaW50ayhLREJHX1hJUkMgIlJlZ2lzdGVyIHBhZ2UgJTJ4OiAiLCBwYWdlKTsKKwkgICAgU2VsZWN0UGFnZShwYWdlKTsKKwkgICAgZm9yIChpID0gODsgaSA8IDE2OyBpKyspCisJCXByaW50aygiICUyLjJ4IiwgR2V0Qnl0ZShpKSk7CisJICAgIHByaW50aygiXG4iKTsKKwl9CisJZm9yIChwYWdlPTB4NDAgOyBwYWdlIDw9IDB4NWY7IHBhZ2UrKykgeworCSAgICBpZiAocGFnZSA9PSAweDQzIHx8IChwYWdlID49IDB4NDYgJiYgcGFnZSA8PSAweDRmKQorCQl8fCAocGFnZSA+PSAweDUxICYmIHBhZ2UgPD0weDVlKSkKKwkJY29udGludWU7CisJICAgIHByaW50ayhLREJHX1hJUkMgIlJlZ2lzdGVyIHBhZ2UgJTJ4OiAiLCBwYWdlKTsKKwkgICAgU2VsZWN0UGFnZShwYWdlKTsKKwkgICAgZm9yIChpID0gODsgaSA8IDE2OyBpKyspCisJCXByaW50aygiICUyLjJ4IiwgR2V0Qnl0ZShpKSk7CisJICAgIHByaW50aygiXG4iKTsKKwl9CisgICAgfQorfQorI2VuZGlmIC8qIFBDTUNJQV9ERUJVRyAqLworCisvKj09PT09PT09PT09PT09IE1JSSBNYW5hZ2VtZW50IGZ1bmN0aW9ucyA9PT09PT09PT09PT09PT0qLworCisvKioqKioqKioqKioqKioqKgorICogVHVybiBhcm91bmQgZm9yIHJlYWQKKyAqLworc3RhdGljIHZvaWQKK21paV9pZGxlKGtpb19hZGRyX3QgaW9hZGRyKQoreworICAgIFB1dEJ5dGUoWElSQ1JFRzJfR1BSMiwgMHgwNHwwKTsgLyogZHJpdmUgTURDSyBsb3cgKi8KKyAgICB1ZGVsYXkoMSk7CisgICAgUHV0Qnl0ZShYSVJDUkVHMl9HUFIyLCAweDA0fDEpOyAvKiBhbmQgZHJpdmUgTURDSyBoaWdoICovCisgICAgdWRlbGF5KDEpOworfQorCisvKioqKioqKioqKioqKioqKgorICogV3JpdGUgYSBiaXQgdG8gTURJL08KKyAqLworc3RhdGljIHZvaWQKK21paV9wdXRiaXQoa2lvX2FkZHJfdCBpb2FkZHIsIHVuc2lnbmVkIGRhdGEpCit7CisgICNpZiAxCisgICAgaWYgKGRhdGEpIHsKKwlQdXRCeXRlKFhJUkNSRUcyX0dQUjIsIDB4MGN8MnwwKTsgLyogc2V0IE1ESU8gKi8KKwl1ZGVsYXkoMSk7CisJUHV0Qnl0ZShYSVJDUkVHMl9HUFIyLCAweDBjfDJ8MSk7IC8qIGFuZCBkcml2ZSBNRENLIGhpZ2ggKi8KKwl1ZGVsYXkoMSk7CisgICAgfSBlbHNlIHsKKwlQdXRCeXRlKFhJUkNSRUcyX0dQUjIsIDB4MGN8MHwwKTsgLyogY2xlYXIgTURJTyAqLworCXVkZWxheSgxKTsKKwlQdXRCeXRlKFhJUkNSRUcyX0dQUjIsIDB4MGN8MHwxKTsgLyogYW5kIGRyaXZlIE1EQ0sgaGlnaCAqLworCXVkZWxheSgxKTsKKyAgICB9CisgICNlbHNlCisgICAgaWYgKGRhdGEpIHsKKwlQdXRXb3JkKFhJUkNSRUcyX0dQUjItMSwgMHgwZTBlKTsKKwl1ZGVsYXkoMSk7CisJUHV0V29yZChYSVJDUkVHMl9HUFIyLTEsIDB4MGYwZik7CisJdWRlbGF5KDEpOworICAgIH0gZWxzZSB7CisJUHV0V29yZChYSVJDUkVHMl9HUFIyLTEsIDB4MGMwYyk7CisJdWRlbGF5KDEpOworCVB1dFdvcmQoWElSQ1JFRzJfR1BSMi0xLCAweDBkMGQpOworCXVkZWxheSgxKTsKKyAgICB9CisgICNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKgorICogR2V0IGEgYml0IGZyb20gTURJL08KKyAqLworc3RhdGljIGludAorbWlpX2dldGJpdChraW9fYWRkcl90IGlvYWRkcikKK3sKKyAgICB1bnNpZ25lZCBkOworCisgICAgUHV0Qnl0ZShYSVJDUkVHMl9HUFIyLCA0fDApOyAvKiBkcml2ZSBNRENLIGxvdyAqLworICAgIHVkZWxheSgxKTsKKyAgICBkID0gR2V0Qnl0ZShYSVJDUkVHMl9HUFIyKTsgLyogcmVhZCBNRElPICovCisgICAgUHV0Qnl0ZShYSVJDUkVHMl9HUFIyLCA0fDEpOyAvKiBkcml2ZSBNRENLIGhpZ2ggYWdhaW4gKi8KKyAgICB1ZGVsYXkoMSk7CisgICAgcmV0dXJuIGQgJiAweDIwOyAvKiByZWFkIE1ESU8gKi8KK30KKworc3RhdGljIHZvaWQKK21paV93Yml0cyhraW9fYWRkcl90IGlvYWRkciwgdW5zaWduZWQgZGF0YSwgaW50IGxlbikKK3sKKyAgICB1bnNpZ25lZCBtID0gMSA8PCAobGVuLTEpOworICAgIGZvciAoOyBtOyBtID4+PSAxKQorCW1paV9wdXRiaXQoaW9hZGRyLCBkYXRhICYgbSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAorbWlpX3JkKGtpb19hZGRyX3QgaW9hZGRyLAl1X2NoYXIgcGh5YWRkciwgdV9jaGFyIHBoeXJlZykKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBkYXRhPTAsIG07CisKKyAgICBTZWxlY3RQYWdlKDIpOworICAgIGZvciAoaT0wOyBpIDwgMzI7IGkrKykJCS8qIDMyIGJpdCBwcmVhbWJsZSAqLworCW1paV9wdXRiaXQoaW9hZGRyLCAxKTsKKyAgICBtaWlfd2JpdHMoaW9hZGRyLCAweDA2LCA0KTsgCS8qIFN0YXJ0IGFuZCBvcGNvZGUgZm9yIHJlYWQgKi8KKyAgICBtaWlfd2JpdHMoaW9hZGRyLCBwaHlhZGRyLCA1KTsJLyogUEhZIGFkZHJlc3MgdG8gYmUgYWNjZXNzZWQgKi8KKyAgICBtaWlfd2JpdHMoaW9hZGRyLCBwaHlyZWcsIDUpOwkvKiBQSFkgcmVnaXN0ZXIgdG8gcmVhZCAqLworICAgIG1paV9pZGxlKGlvYWRkcik7CQkJLyogdHVybiBhcm91bmQgKi8KKyAgICBtaWlfZ2V0Yml0KGlvYWRkcik7CisKKyAgICBmb3IgKG0gPSAxPDwxNTsgbTsgbSA+Pj0gMSkKKwlpZiAobWlpX2dldGJpdChpb2FkZHIpKQorCSAgICBkYXRhIHw9IG07CisgICAgbWlpX2lkbGUoaW9hZGRyKTsKKyAgICByZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQKK21paV93cihraW9fYWRkcl90IGlvYWRkciwgdV9jaGFyIHBoeWFkZHIsIHVfY2hhciBwaHlyZWcsIHVuc2lnbmVkIGRhdGEsIGludCBsZW4pCit7CisgICAgaW50IGk7CisKKyAgICBTZWxlY3RQYWdlKDIpOworICAgIGZvciAoaT0wOyBpIDwgMzI7IGkrKykJCS8qIDMyIGJpdCBwcmVhbWJsZSAqLworCW1paV9wdXRiaXQoaW9hZGRyLCAxKTsKKyAgICBtaWlfd2JpdHMoaW9hZGRyLCAweDA1LCA0KTsgCS8qIFN0YXJ0IGFuZCBvcGNvZGUgZm9yIHdyaXRlICovCisgICAgbWlpX3diaXRzKGlvYWRkciwgcGh5YWRkciwgNSk7CS8qIFBIWSBhZGRyZXNzIHRvIGJlIGFjY2Vzc2VkICovCisgICAgbWlpX3diaXRzKGlvYWRkciwgcGh5cmVnLCA1KTsJLyogUEhZIFJlZ2lzdGVyIHRvIHdyaXRlICovCisgICAgbWlpX3B1dGJpdChpb2FkZHIsIDEpOwkJLyogdHVybiBhcm91bmQgKi8KKyAgICBtaWlfcHV0Yml0KGlvYWRkciwgMCk7CisgICAgbWlpX3diaXRzKGlvYWRkciwgZGF0YSwgbGVuKTsJLyogQW5kIHdyaXRlIHRoZSBkYXRhICovCisgICAgbWlpX2lkbGUoaW9hZGRyKTsKK30KKworLyo9PT09PT09PT09PT09IE1haW4gYnVsayBvZiBmdW5jdGlvbnMJPT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqCisgKiB4aXJjMnBzX2F0dGFjaCgpIGNyZWF0ZXMgYW4gImluc3RhbmNlIiBvZiB0aGUgZHJpdmVyLCBhbGxvY2F0aW5nCisgKiBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQKKyAqIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKyAqCisgKiBUaGUgZGV2X2xpbmsgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkKKyAqIGNvbmZpZ3VyZSB0aGUgY2FyZCBhdCB0aGlzIHBvaW50IC0tIHdlIHdhaXQgdW50aWwgd2UgcmVjZWl2ZSBhCisgKiBjYXJkIGluc2VydGlvbiBldmVudC4KKyAqLworCitzdGF0aWMgZGV2X2xpbmtfdCAqCit4aXJjMnBzX2F0dGFjaCh2b2lkKQoreworICAgIGNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworICAgIGRldl9saW5rX3QgKmxpbms7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBsb2NhbF9pbmZvX3QgKmxvY2FsOworICAgIGludCBlcnI7CisKKyAgICBERUJVRygwLCAiYXR0YWNoKClcbiIpOworCisgICAgLyogQWxsb2NhdGUgdGhlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKyAgICBkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YobG9jYWxfaW5mb190KSk7CisgICAgaWYgKCFkZXYpCisJICAgIHJldHVybiBOVUxMOworICAgIGxvY2FsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBsaW5rID0gJmxvY2FsLT5saW5rOworICAgIGxpbmstPnByaXYgPSBkZXY7CisKKyAgICAvKiBHZW5lcmFsIHNvY2tldCBjb25maWd1cmF0aW9uICovCisgICAgbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gQ09ORl9FTkFCTEVfSVJROworICAgIGxpbmstPmNvbmYuVmNjID0gNTA7CisgICAgbGluay0+Y29uZi5JbnRUeXBlID0gSU5UX01FTU9SWV9BTkRfSU87CisgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IDE7CisgICAgbGluay0+Y29uZi5QcmVzZW50ID0gUFJFU0VOVF9PUFRJT047CisgICAgbGluay0+aXJxLkhhbmRsZXIgPSB4aXJjMnBzX2ludGVycnVwdDsKKyAgICBsaW5rLT5pcnEuSW5zdGFuY2UgPSBkZXY7CisKKyAgICAvKiBGaWxsIGluIGNhcmQgc3BlY2lmaWMgZW50cmllcyAqLworICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZkb19zdGFydF94bWl0OworICAgIGRldi0+c2V0X2NvbmZpZyA9ICZkb19jb25maWc7CisgICAgZGV2LT5nZXRfc3RhdHMgPSAmZG9fZ2V0X3N0YXRzOworICAgIGRldi0+ZG9faW9jdGwgPSAmZG9faW9jdGw7CisgICAgU0VUX0VUSFRPT0xfT1BTKGRldiwgJm5ldGRldl9ldGh0b29sX29wcyk7CisgICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OworICAgIGRldi0+b3BlbiA9ICZkb19vcGVuOworICAgIGRldi0+c3RvcCA9ICZkb19zdG9wOworI2lmZGVmIEhBVkVfVFhfVElNRU9VVAorICAgIGRldi0+dHhfdGltZW91dCA9IGRvX3R4X3RpbWVvdXQ7CisgICAgZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisjZW5kaWYKKworICAgIC8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKKyAgICBkZXZfbGlzdCA9IGxpbms7CisgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKKyAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9CisJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKKyAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmeGlyYzJwc19ldmVudDsKKyAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKyAgICBpZiAoKGVyciA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpKSkgeworCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIGVycik7CisJeGlyYzJwc19kZXRhY2gobGluayk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGxpbms7Cit9IC8qIHhpcmMycHNfYXR0YWNoICovCisKKy8qKioqKioqKioqKioqKioqCisgKiAgVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQKKyAqICB3aXRoIENhcmQgU2VydmljZXMuICBJZiBpdCBoYXMgYmVlbiByZWxlYXNlZCwgYWxsIGxvY2FsIGRhdGEKKyAqICBzdHJ1Y3R1cmVzIGFyZSBmcmVlZC4gIE90aGVyd2lzZSwgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZSBmcmVlZAorICogIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KKyAqLworCitzdGF0aWMgdm9pZAoreGlyYzJwc19kZXRhY2goZGV2X2xpbmtfdCAqIGxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgZGV2X2xpbmtfdCAqKmxpbmtwOworCisgICAgREVCVUcoMCwgImRldGFjaCgweCVwKVxuIiwgbGluayk7CisKKyAgICAvKiBMb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworICAgIGZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJaWYgKCpsaW5rcCA9PSBsaW5rKQorCSAgICBicmVhazsKKyAgICBpZiAoISpsaW5rcCkgeworCURFQlVHKDAsICJkZXRhY2goMHglcCk6IGRldl9saW5rIGxvc3RcbiIsIGxpbmspOworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAobGluay0+ZGV2KQorCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKyAgICAvKgorICAgICAqIElmIHRoZSBkZXZpY2UgaXMgY3VycmVudGx5IGNvbmZpZ3VyZWQgYW5kIGFjdGl2ZSwgd2Ugd29uJ3QKKyAgICAgKiBhY3R1YWxseSBkZWxldGUgaXQgeWV0LglJbnN0ZWFkLCBpdCBpcyBtYXJrZWQgc28gdGhhdCB3aGVuCisgICAgICogdGhlIHJlbGVhc2UoKSBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoYXQgd2lsbCB0cmlnZ2VyIGEgcHJvcGVyCisgICAgICogZGV0YWNoKCkuCisgICAgICovCisgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwl4aXJjMnBzX3JlbGVhc2UobGluayk7CisKKyAgICAvKiBCcmVhayB0aGUgbGluayB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBpZiAobGluay0+aGFuZGxlKQorCXBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworCisgICAgLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGZyZWUgaXQgKi8KKyAgICAqbGlua3AgPSBsaW5rLT5uZXh0OworICAgIGZyZWVfbmV0ZGV2KGRldik7Cit9IC8qIHhpcmMycHNfZGV0YWNoICovCisKKy8qKioqKioqKioqKioqKioqCisgKiBEZXRlY3QgdGhlIHR5cGUgb2YgdGhlIGNhcmQuIHMgaXMgdGhlIGJ1ZmZlciB3aXRoIHRoZSBkYXRhIG9mIHR1cGxlIDB4MjAKKyAqIFJldHVybnM6IDAgOj0gbm90IHN1cHBvcnRlZAorICoJCSAgICAgICBtZWRpYWlkPTExIGFuZCBwcm9kaWQ9NDcKKyAqIE1lZGlhLUlkIGJpdHM6CisgKiAgRXRoZXJuZXQJICAgIDB4MDEKKyAqICBUb2tlbnJpbmcJICAgIDB4MDIKKyAqICBBcmNuZXQJICAgIDB4MDQKKyAqICBXaXJlbGVzcwkgICAgMHgwOAorICogIE1vZGVtCSAgICAweDEwCisgKiAgR1NNIG9ubHkJICAgIDB4MjAKKyAqIFByb2QtSWQgYml0czoKKyAqICBQb2NrZXQJICAgIDB4MTAKKyAqICBFeHRlcm5hbAkgICAgMHgyMAorICogIENyZWRpdGNhcmQJICAgIDB4NDAKKyAqICBDYXJkYnVzCSAgICAweDgwCisgKgorICovCitzdGF0aWMgaW50CitzZXRfY2FyZF90eXBlKGRldl9saW5rX3QgKmxpbmssIGNvbnN0IHZvaWQgKnMpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgbG9jYWxfaW5mb190ICpsb2NhbCA9IG5ldGRldl9wcml2KGRldik7CisgICNpZmRlZiBQQ01DSUFfREVCVUcKKyAgICB1bnNpZ25lZCBjaXNyZXYgPSAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzKVsyXTsKKyAgI2VuZGlmCisgICAgdW5zaWduZWQgbWVkaWFpZD0gKChjb25zdCB1bnNpZ25lZCBjaGFyICopcylbM107CisgICAgdW5zaWduZWQgcHJvZGlkID0gKChjb25zdCB1bnNpZ25lZCBjaGFyICopcylbNF07CisKKyAgICBERUJVRygwLCAiY2lzcmV2PSUwMnggbWVkaWFpZD0lMDJ4IHByb2RpZD0lMDJ4XG4iLAorCSAgY2lzcmV2LCBtZWRpYWlkLCBwcm9kaWQpOworCisgICAgbG9jYWwtPm1vaGF3ayA9IDA7CisgICAgbG9jYWwtPmRpbmdvID0gMDsKKyAgICBsb2NhbC0+bW9kZW0gPSAwOworICAgIGxvY2FsLT5jYXJkX3R5cGUgPSBYSVJfVU5LTk9XTjsKKyAgICBpZiAoIShwcm9kaWQgJiAweDQwKSkgeworCXByaW50ayhLTk9UX1hJUkMgIk9vb3BzOiBOb3QgYSBjcmVkaXRjYXJkXG4iKTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCEobWVkaWFpZCAmIDB4MDEpKSB7CisJcHJpbnRrKEtOT1RfWElSQyAiTm90IGFuIEV0aGVybmV0IGNhcmRcbiIpOworCXJldHVybiAwOworICAgIH0KKyAgICBpZiAobWVkaWFpZCAmIDB4MTApIHsKKwlsb2NhbC0+bW9kZW0gPSAxOworCXN3aXRjaChwcm9kaWQgJiAxNSkgeworCSAgY2FzZSAxOiBsb2NhbC0+Y2FyZF90eXBlID0gWElSX0NFTSAgIDsgYnJlYWs7CisJICBjYXNlIDI6IGxvY2FsLT5jYXJkX3R5cGUgPSBYSVJfQ0VNMiAgOyBicmVhazsKKwkgIGNhc2UgMzogbG9jYWwtPmNhcmRfdHlwZSA9IFhJUl9DRU0zICA7IGJyZWFrOworCSAgY2FzZSA0OiBsb2NhbC0+Y2FyZF90eXBlID0gWElSX0NFTTMzIDsgYnJlYWs7CisJICBjYXNlIDU6IGxvY2FsLT5jYXJkX3R5cGUgPSBYSVJfQ0VNNTZNOworCQkgIGxvY2FsLT5tb2hhd2sgPSAxOworCQkgIGJyZWFrOworCSAgY2FzZSA2OgorCSAgY2FzZSA3OiAvKiA3IGlzIHRoZSBSZWFsUG9ydCAxMC81NiAqLworCQkgIGxvY2FsLT5jYXJkX3R5cGUgPSBYSVJfQ0VNNTYgOworCQkgIGxvY2FsLT5tb2hhd2sgPSAxOworCQkgIGxvY2FsLT5kaW5nbyA9IDE7CisJCSAgYnJlYWs7CisJfQorICAgIH0gZWxzZSB7CisJc3dpdGNoKHByb2RpZCAmIDE1KSB7CisJICBjYXNlIDE6IGxvY2FsLT5jYXJkX3R5cGUgPSBoYXNfY2UyX3N0cmluZyhsaW5rKT8gWElSX0NFMiA6IFhJUl9DRSA7CisJCSAgYnJlYWs7CisJICBjYXNlIDI6IGxvY2FsLT5jYXJkX3R5cGUgPSBYSVJfQ0UyOyBicmVhazsKKwkgIGNhc2UgMzogbG9jYWwtPmNhcmRfdHlwZSA9IFhJUl9DRTM7CisJCSAgbG9jYWwtPm1vaGF3ayA9IDE7CisJCSAgYnJlYWs7CisJfQorICAgIH0KKyAgICBpZiAobG9jYWwtPmNhcmRfdHlwZSA9PSBYSVJfQ0UgfHwgbG9jYWwtPmNhcmRfdHlwZSA9PSBYSVJfQ0VNKSB7CisJcHJpbnRrKEtOT1RfWElSQyAiU29ycnksIHRoaXMgaXMgYW4gb2xkIENFIGNhcmRcbiIpOworCXJldHVybiAwOworICAgIH0KKyAgICBpZiAobG9jYWwtPmNhcmRfdHlwZSA9PSBYSVJfVU5LTk9XTikKKwlwcmludGsoS05PVF9YSVJDICJ1bmtub3duIGNhcmQgKG1lZGlhaWQ9JTAyeCBwcm9kaWQ9JTAyeClcbiIsCisJICAgICAgIG1lZGlhaWQsIHByb2RpZCk7CisKKyAgICByZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioKKyAqIFRoZXJlIGFyZSBzb21lIENFMiBjYXJkcyBvdXQgd2hpY2ggY2xhaW0gdG8gYmUgYSBDRSBjYXJkLgorICogVGhpcyBmdW5jdGlvbiBsb29rcyBmb3IgYSAiQ0UyIiBpbiB0aGUgM3JkIHZlcnNpb24gZmllbGQuCisgKiBSZXR1cm5zOiB0cnVlIGlmIHRoaXMgaXMgYSBDRTIKKyAqLworc3RhdGljIGludAoraGFzX2NlMl9zdHJpbmcoZGV2X2xpbmtfdCAqIGxpbmspCit7CisgICAgY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKyAgICB0dXBsZV90IHR1cGxlOworICAgIGNpc3BhcnNlX3QgcGFyc2U7CisgICAgdV9jaGFyIGJ1ZlsyNTZdOworCisgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CisgICAgdHVwbGUuVHVwbGVEYXRhID0gYnVmOworICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IDI1NDsKKyAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX1ZFUlNfMTsKKyAgICBpZiAoIWZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpICYmIHBhcnNlLnZlcnNpb25fMS5ucyA+IDIpIHsKKwlpZiAoc3Ryc3RyKHBhcnNlLnZlcnNpb25fMS5zdHIgKyBwYXJzZS52ZXJzaW9uXzEub2ZzWzJdLCAiQ0UyIikpCisJICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioKKyAqIHhpcmMycHNfY29uZmlnKCkgaXMgc2NoZWR1bGVkIHRvIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50CisgKiBpcyByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUKKyAqIGV0aGVybmV0IGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKyAqLworc3RhdGljIHZvaWQKK3hpcmMycHNfY29uZmlnKGRldl9saW5rX3QgKiBsaW5rKQoreworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgbG9jYWxfaW5mb190ICpsb2NhbCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICBjaXNwYXJzZV90IHBhcnNlOworICAgIGtpb19hZGRyX3QgaW9hZGRyOworICAgIGludCBlcnIsIGk7CisgICAgdV9jaGFyIGJ1Zls2NF07CisgICAgY2lzdHBsX2xhbl9ub2RlX2lkX3QgKm5vZGVfaWQgPSAoY2lzdHBsX2xhbl9ub2RlX2lkX3QqKXBhcnNlLmZ1bmNlLmRhdGE7CisgICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2YgPSAmcGFyc2UuY2Z0YWJsZV9lbnRyeTsKKworICAgIGxvY2FsLT5kaW5nb19jY3IgPSBOVUxMOworCisgICAgREVCVUcoMCwgImNvbmZpZygweCVwKVxuIiwgbGluayk7CisKKyAgICAvKgorICAgICAqIFRoaXMgcmVhZHMgdGhlIGNhcmQncyBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMgY29uZmlndXJhdGlvbgorICAgICAqIHJlZ2lzdGVycy4KKyAgICAgKi8KKyAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKyAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7CisgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworCisgICAgLyogSXMgdGhpcyBhIHZhbGlkCWNhcmQgKi8KKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfTUFORklEOworICAgIGlmICgoZXJyPWZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKSkgeworCXByaW50ayhLTk9UX1hJUkMgIm1hbmZpZCBub3QgZm91bmQgaW4gQ0lTXG4iKTsKKwlnb3RvIGZhaWx1cmU7CisgICAgfQorCisgICAgc3dpdGNoKHBhcnNlLm1hbmZpZC5tYW5mKSB7CisgICAgICBjYXNlIE1BTkZJRF9YSVJDT006CisJbG9jYWwtPm1hbmZfc3RyID0gIlhpcmNvbSI7CisJYnJlYWs7CisgICAgICBjYXNlIE1BTkZJRF9BQ0NUT046CisJbG9jYWwtPm1hbmZfc3RyID0gIkFjY3RvbiI7CisJYnJlYWs7CisgICAgICBjYXNlIE1BTkZJRF9DT01QQVE6CisgICAgICBjYXNlIE1BTkZJRF9DT01QQVEyOgorCWxvY2FsLT5tYW5mX3N0ciA9ICJDb21wYXEiOworCWJyZWFrOworICAgICAgY2FzZSBNQU5GSURfSU5URUw6CisJbG9jYWwtPm1hbmZfc3RyID0gIkludGVsIjsKKwlicmVhazsKKyAgICAgIGNhc2UgTUFORklEX1RPU0hJQkE6CisJbG9jYWwtPm1hbmZfc3RyID0gIlRvc2hpYmEiOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlwcmludGsoS05PVF9YSVJDICJVbmtub3duIENhcmQgTWFudWZhY3R1cmVyIElEOiAweCUwNHhcbiIsCisJICAgICAgICh1bnNpZ25lZClwYXJzZS5tYW5maWQubWFuZik7CisJZ290byBmYWlsdXJlOworICAgIH0KKyAgICBERUJVRygwLCAiZm91bmQgJXMgY2FyZFxuIiwgbG9jYWwtPm1hbmZfc3RyKTsKKworICAgIGlmICghc2V0X2NhcmRfdHlwZShsaW5rLCBidWYpKSB7CisJcHJpbnRrKEtOT1RfWElSQyAidGhpcyBjYXJkIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOworCWdvdG8gZmFpbHVyZTsKKyAgICB9CisKKyAgICAvKiBnZXQgY29uZmlndXJhdGlvbiBzdHVmZiAqLworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisgICAgaWYgKChlcnI9Zmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpKQorCWdvdG8gY2lzX2Vycm9yOworICAgIGxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOworICAgIGxpbmstPmNvbmYuUHJlc2VudCA9ICAgIHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKworICAgIC8qIGdldCB0aGUgZXRoZXJuZXQgYWRkcmVzcyBmcm9tIHRoZSBDSVMgKi8KKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfRlVOQ0U7CisgICAgZm9yIChlcnIgPSBmaXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKTsgIWVycjsKKwkJCSAgICAgZXJyID0gbmV4dF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSkgeworCS8qIE9uY2UgSSBzYXcgdHdvIENJU1RQTF9GVU5DRV9MQU5fTk9ERV9JRCBlbnRyaWVzOgorCSAqIHRoZSBmaXJzdCBvbmUgd2l0aCBhIGxlbmd0aCBvZiB6ZXJvIHRoZSBzZWNvbmQgY29ycmVjdCAtCisJICogc28gSSBza2lwIGFsbCBlbnRyaWVzIHdpdGggbGVuZ3RoIDAgKi8KKwlpZiAocGFyc2UuZnVuY2UudHlwZSA9PSBDSVNUUExfRlVOQ0VfTEFOX05PREVfSUQKKwkgICAgJiYgKChjaXN0cGxfbGFuX25vZGVfaWRfdCAqKXBhcnNlLmZ1bmNlLmRhdGEpLT5uYikKKwkgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChlcnIpIHsgLyogbm90IGZvdW5kOiB0cnkgdG8gZ2V0IHRoZSBub2RlLWlkIGZyb20gdHVwbGUgMHg4OSAqLworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IDB4ODk7ICAvKiBkYXRhIGxheW91dCBsb29rcyBsaWtlIHR1cGxlIDB4MjIgKi8KKwlpZiAoKGVyciA9IHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKSA9PSAwICYmCisJCShlcnIgPSBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKSA9PSAwKSB7CisJICAgIGlmICh0dXBsZS5UdXBsZURhdGFMZW4gPT0gOCAmJiAqYnVmID09IENJU1RQTF9GVU5DRV9MQU5fTk9ERV9JRCkKKwkJbWVtY3B5KCZwYXJzZSwgYnVmLCA4KTsKKwkgICAgZWxzZQorCQllcnIgPSAtMTsKKwl9CisgICAgfQorICAgIGlmIChlcnIpIHsgLyogYW5vdGhlciB0cnkJKEphbWVzIExlaG1lcidzIENFMiB2ZXJzaW9uIDQuMSkqLworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9GVU5DRTsKKwlmb3IgKGVyciA9IGZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpOyAhZXJyOworCQkJCSBlcnIgPSBuZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKSB7CisJICAgIGlmIChwYXJzZS5mdW5jZS50eXBlID09IDB4MDIgJiYgcGFyc2UuZnVuY2UuZGF0YVswXSA9PSAxCisJCSYmIHBhcnNlLmZ1bmNlLmRhdGFbMV0gPT0gNiAmJiB0dXBsZS5UdXBsZURhdGFMZW4gPT0gMTMpIHsKKwkJYnVmWzFdID0gNDsKKwkJbWVtY3B5KCZwYXJzZSwgYnVmKzEsIDgpOworCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisgICAgaWYgKGVycikgeworCXByaW50ayhLTk9UX1hJUkMgIm5vZGUtaWQgbm90IGZvdW5kIGluIENJU1xuIik7CisJZ290byBmYWlsdXJlOworICAgIH0KKyAgICBub2RlX2lkID0gKGNpc3RwbF9sYW5fbm9kZV9pZF90ICopcGFyc2UuZnVuY2UuZGF0YTsKKyAgICBpZiAobm9kZV9pZC0+bmIgIT0gNikgeworCXByaW50ayhLTk9UX1hJUkMgIm1hbGZvcm1lZCBub2RlLWlkIGluIENJU1xuIik7CisJZ290byBmYWlsdXJlOworICAgIH0KKyAgICBmb3IgKGk9MDsgaSA8IDY7IGkrKykKKwlkZXYtPmRldl9hZGRyW2ldID0gbm9kZV9pZC0+aWRbaV07CisKKyAgICAvKiBDb25maWd1cmUgY2FyZCAqLworICAgIGxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisKKyAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9MTA7CisgICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfSEFORExFX1BSRVNFTlQ7CisgICAgbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOworICAgIGlmIChsb2NhbC0+bW9kZW0pIHsKKwlpbnQgcGFzczsKKworCWlmIChkb19zb3VuZCkgeworCSAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKKwkgICAgbGluay0+Y29uZi5TdGF0dXMgfD0gQ0NTUl9BVURJT19FTkE7CisJfQorCWxpbmstPmlycS5BdHRyaWJ1dGVzIHw9IElSUV9UWVBFX0RZTkFNSUNfU0hBUklOR3xJUlFfRklSU1RfU0hBUkVEIDsKKwlsaW5rLT5pby5OdW1Qb3J0czIgPSA4OworCWxpbmstPmlvLkF0dHJpYnV0ZXMyID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJaWYgKGxvY2FsLT5kaW5nbykgeworCSAgICAvKiBUYWtlIHRoZSBNb2RlbSBJTyBwb3J0IGZyb20gdGhlIENJUyBhbmQgc2NhbiBmb3IgYSBmcmVlCisJICAgICAqIEV0aGVybmV0IHBvcnQgKi8KKwkgICAgbGluay0+aW8uTnVtUG9ydHMxID0gMTY7IC8qIG5vIE1ha28gc3R1ZmYgYW55bW9yZSAqLworCSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKKwkgICAgZm9yIChlcnIgPSBmaXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKTsgIWVycjsKKwkJCQkgZXJyID0gbmV4dF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSkgeworCQlpZiAoY2YtPmlvLm53aW4gPiAwICAmJiAgKGNmLT5pby53aW5bMF0uYmFzZSAmIDB4ZikgPT0gOCkgeworCQkgICAgZm9yIChpb2FkZHIgPSAweDMwMDsgaW9hZGRyIDwgMHg0MDA7IGlvYWRkciArPSAweDEwKSB7CisJCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2YtPmluZGV4IDsKKwkJCWxpbmstPmlvLkJhc2VQb3J0MiA9IGNmLT5pby53aW5bMF0uYmFzZTsKKwkJCWxpbmstPmlvLkJhc2VQb3J0MSA9IGlvYWRkcjsKKwkJCWlmICghKGVycj1wY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbykpKQorCQkJICAgIGdvdG8gcG9ydF9mb3VuZDsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfSBlbHNlIHsKKwkgICAgbGluay0+aW8uTnVtUG9ydHMxID0gMTg7CisJICAgIC8qIFdlIGRvIDIgcGFzc2VzIGhlcmU6IFRoZSBmaXJzdCBvbmUgdXNlcyB0aGUgcmVndWxhciBtYXBwaW5nIGFuZAorCSAgICAgKiB0aGUgc2Vjb25kIHRyaWVzIGFnYWluLCB0aGVyZWJ5IGNvbnNpZGVyaW5nIHRoYXQgdGhlIDMyIHBvcnRzIGFyZQorCSAgICAgKiBtaXJyb3JlZCBldmVyeSAzMiBieXRlcy4gQWN0dWFsbHkgd2UgdXNlIGEgbWlycm9yZWQgcG9ydCBmb3IKKwkgICAgICogdGhlIE1ha28gaWYgKG9uIHRoZSBmaXJzdCBwYXNzKSB0aGUgQ09SIGJpdCA1IGlzIHNldC4KKwkgICAgICovCisJICAgIGZvciAocGFzcz0wOyBwYXNzIDwgMjsgcGFzcysrKSB7CisJCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworCQlmb3IgKGVyciA9IGZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpOyAhZXJyOworCQkJCSAgICAgZXJyID0gbmV4dF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSl7CisJCSAgICBpZiAoY2YtPmlvLm53aW4gPiAwICAmJiAgKGNmLT5pby53aW5bMF0uYmFzZSAmIDB4ZikgPT0gOCl7CisJCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2YtPmluZGV4IDsKKwkJCWxpbmstPmlvLkJhc2VQb3J0MiA9IGNmLT5pby53aW5bMF0uYmFzZTsKKwkJCWxpbmstPmlvLkJhc2VQb3J0MSA9IGxpbmstPmlvLkJhc2VQb3J0MgorCQkJCSAgICArIChwYXNzID8gKGNmLT5pbmRleCAmIDB4MjAgPyAtMjQ6OCkKKwkJCQkJICAgIDogKGNmLT5pbmRleCAmIDB4MjAgPyAgIDg6LTI0KSk7CisJCQlpZiAoIShlcnI9cGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pKSkKKwkJCSAgICBnb3RvIHBvcnRfZm91bmQ7CisJCSAgICB9CisJCX0KKwkgICAgfQorCSAgICAvKiBpZiBzcGVjaWFsIG9wdGlvbjoKKwkgICAgICogdHJ5IHRvIGNvbmZpZ3VyZSBhcyBFdGhlcm5ldCBvbmx5LgorCSAgICAgKiAuLi4uICovCisJfQorCXByaW50ayhLTk9UX1hJUkMgIm5vIHBvcnRzIGF2YWlsYWJsZVxuIik7CisgICAgfSBlbHNlIHsKKwlsaW5rLT5pcnEuQXR0cmlidXRlcyB8PSBJUlFfVFlQRV9FWENMVVNJVkU7CisJbGluay0+aW8uTnVtUG9ydHMxID0gMTY7CisJZm9yIChpb2FkZHIgPSAweDMwMDsgaW9hZGRyIDwgMHg0MDA7IGlvYWRkciArPSAweDEwKSB7CisJICAgIGxpbmstPmlvLkJhc2VQb3J0MSA9IGlvYWRkcjsKKwkgICAgaWYgKCEoZXJyPXBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKSkpCisJCWdvdG8gcG9ydF9mb3VuZDsKKwl9CisJbGluay0+aW8uQmFzZVBvcnQxID0gMDsgLyogbGV0IENTIGRlY2lkZSAqLworCWlmICgoZXJyPXBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKSkpIHsKKwkgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0SU8sIGVycik7CisJICAgIGdvdG8gY29uZmlnX2Vycm9yOworCX0KKyAgICB9CisgIHBvcnRfZm91bmQ6CisgICAgaWYgKGVycikKKwkgZ290byBjb25maWdfZXJyb3I7CisKKyAgICAvKioqKioqKioqKioqKioqKgorICAgICAqIE5vdyBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZS4JTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QKKyAgICAgKiBhY3R1YWxseSBhc3NpZ24gYSBoYW5kbGVyIHRvIHRoZSBpbnRlcnJ1cHQuCisgICAgICovCisgICAgaWYgKChlcnI9cGNtY2lhX3JlcXVlc3RfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSkpKSB7CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0SVJRLCBlcnIpOworCWdvdG8gY29uZmlnX2Vycm9yOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqCisgICAgICogVGhpcyBhY3R1YWxseSBjb25maWd1cmVzIHRoZSBQQ01DSUEgc29ja2V0IC0tIHNldHRpbmcgdXAKKyAgICAgKiB0aGUgSS9PIHdpbmRvd3MgYW5kIHRoZSBpbnRlcnJ1cHQgbWFwcGluZy4KKyAgICAgKi8KKyAgICBpZiAoKGVycj1wY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpKSkgeworCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVxdWVzdENvbmZpZ3VyYXRpb24sIGVycik7CisJZ290byBjb25maWdfZXJyb3I7CisgICAgfQorCisgICAgaWYgKGxvY2FsLT5kaW5nbykgeworCWNvbmZfcmVnX3QgcmVnOworCXdpbl9yZXFfdCByZXE7CisJbWVtcmVxX3QgbWVtOworCisJLyogUmVzZXQgdGhlIG1vZGVtJ3MgQkFSIHRvIHRoZSBjb3JyZWN0IHZhbHVlCisJICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBpbiB0aGUgUmVxdWVzdENvbmZpZ3VyYXRpb24gY2FsbCwKKwkgKiB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBldGhlcm5ldCBwb3J0IChCYXNlUG9ydDEpIGlzIHdyaXR0ZW4KKwkgKiB0byB0aGUgQkFSIHJlZ2lzdGVycyBvZiB0aGUgbW9kZW0uCisJICovCisJcmVnLkFjdGlvbiA9IENTX1dSSVRFOworCXJlZy5PZmZzZXQgPSBDSVNSRUdfSU9CQVNFXzA7CisJcmVnLlZhbHVlID0gbGluay0+aW8uQmFzZVBvcnQyICYgMHhmZjsKKwlpZiAoKGVyciA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihsaW5rLT5oYW5kbGUsICZyZWcpKSkgeworCSAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIEFjY2Vzc0NvbmZpZ3VyYXRpb25SZWdpc3RlciwgZXJyKTsKKwkgICAgZ290byBjb25maWdfZXJyb3I7CisJfQorCXJlZy5BY3Rpb24gPSBDU19XUklURTsKKwlyZWcuT2Zmc2V0ID0gQ0lTUkVHX0lPQkFTRV8xOworCXJlZy5WYWx1ZSA9IChsaW5rLT5pby5CYXNlUG9ydDIgPj4gOCkgJiAweGZmOworCWlmICgoZXJyID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGxpbmstPmhhbmRsZSwgJnJlZykpKSB7CisJICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgQWNjZXNzQ29uZmlndXJhdGlvblJlZ2lzdGVyLCBlcnIpOworCSAgICBnb3RvIGNvbmZpZ19lcnJvcjsKKwl9CisKKwkvKiBUaGVyZSBpcyBubyBjb25maWcgZW50cnkgZm9yIHRoZSBFdGhlcm5ldCBwYXJ0IHdoaWNoCisJICogaXMgYXQgMHgwODAwLiBTbyB3ZSBhbGxvY2F0ZSBhIHdpbmRvdyBpbnRvIHRoZSBhdHRyaWJ1dGUKKwkgKiBtZW1vcnkgYW5kIHdyaXRlIGRpcmVjdCB0byB0aGUgQ0lTIHJlZ2lzdGVycworCSAqLworCXJlcS5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfOHxXSU5fTUVNT1JZX1RZUEVfQU18V0lOX0VOQUJMRTsKKwlyZXEuQmFzZSA9IHJlcS5TaXplID0gMDsKKwlyZXEuQWNjZXNzU3BlZWQgPSAwOworCWlmICgoZXJyID0gcGNtY2lhX3JlcXVlc3Rfd2luZG93KCZsaW5rLT5oYW5kbGUsICZyZXEsICZsaW5rLT53aW4pKSkgeworCSAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlcXVlc3RXaW5kb3csIGVycik7CisJICAgIGdvdG8gY29uZmlnX2Vycm9yOworCX0KKwlsb2NhbC0+ZGluZ29fY2NyID0gaW9yZW1hcChyZXEuQmFzZSwweDEwMDApICsgMHgwODAwOworCW1lbS5DYXJkT2Zmc2V0ID0gMHgwOworCW1lbS5QYWdlID0gMDsKKwlpZiAoKGVyciA9IHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluay0+d2luLCAmbWVtKSkpIHsKKwkgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBNYXBNZW1QYWdlLCBlcnIpOworCSAgICBnb3RvIGNvbmZpZ19lcnJvcjsKKwl9CisKKwkvKiBTZXR1cCB0aGUgQ0NSczsgdGhlcmUgYXJlIG5vIGluZm9zIGluIHRoZSBDSVMgYWJvdXQgdGhlIEV0aGVybmV0CisJICogcGFydC4KKwkgKi8KKwl3cml0ZWIoMHg0NywgbG9jYWwtPmRpbmdvX2NjciArIENJU1JFR19DT1IpOworCWlvYWRkciA9IGxpbmstPmlvLkJhc2VQb3J0MTsKKwl3cml0ZWIoaW9hZGRyICYgMHhmZgkgICwgbG9jYWwtPmRpbmdvX2NjciArIENJU1JFR19JT0JBU0VfMCk7CisJd3JpdGViKChpb2FkZHIgPj4gOCkmMHhmZiAsIGxvY2FsLT5kaW5nb19jY3IgKyBDSVNSRUdfSU9CQVNFXzEpOworCisgICAgICAjaWYgMAorCXsKKwkgICAgdV9jaGFyIHRtcDsKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiRUNPUjoiKTsKKwkgICAgZm9yIChpPTA7IGkgPCA3OyBpKyspIHsKKwkJdG1wID0gcmVhZGIobG9jYWwtPmRpbmdvX2NjciArIGkqMik7CisJCXByaW50aygiICUwMngiLCB0bXApOworCSAgICB9CisJICAgIHByaW50aygiXG4iKTsKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiRENPUjoiKTsKKwkgICAgZm9yIChpPTA7IGkgPCA0OyBpKyspIHsKKwkJdG1wID0gcmVhZGIobG9jYWwtPmRpbmdvX2NjciArIDB4MjAgKyBpKjIpOworCQlwcmludGsoIiAlMDJ4IiwgdG1wKTsKKwkgICAgfQorCSAgICBwcmludGsoIlxuIik7CisJICAgIHByaW50ayhLRVJOX0lORk8gIlNDT1I6Iik7CisJICAgIGZvciAoaT0wOyBpIDwgMTA7IGkrKykgeworCQl0bXAgPSByZWFkYihsb2NhbC0+ZGluZ29fY2NyICsgMHg0MCArIGkqMik7CisJCXByaW50aygiICUwMngiLCB0bXApOworCSAgICB9CisJICAgIHByaW50aygiXG4iKTsKKwl9CisgICAgICAjZW5kaWYKKworCXdyaXRlYigweDAxLCBsb2NhbC0+ZGluZ29fY2NyICsgMHgyMCk7CisJd3JpdGViKDB4MGMsIGxvY2FsLT5kaW5nb19jY3IgKyAweDIyKTsKKwl3cml0ZWIoMHgwMCwgbG9jYWwtPmRpbmdvX2NjciArIDB4MjQpOworCXdyaXRlYigweDAwLCBsb2NhbC0+ZGluZ29fY2NyICsgMHgyNik7CisJd3JpdGViKDB4MDAsIGxvY2FsLT5kaW5nb19jY3IgKyAweDI4KTsKKyAgICB9CisKKyAgICAvKiBUaGUgaWZfcG9ydCBzeW1ib2wgY2FuIGJlIHNldCB3aGVuIHRoZSBtb2R1bGUgaXMgbG9hZGVkICovCisgICAgbG9jYWwtPnByb2JlX3BvcnQ9MDsKKyAgICBpZiAoIWlmX3BvcnQpIHsKKwlsb2NhbC0+cHJvYmVfcG9ydCA9IGRldi0+aWZfcG9ydCA9IDE7CisgICAgfSBlbHNlIGlmICgoaWZfcG9ydCA+PSAxICYmIGlmX3BvcnQgPD0gMikgfHwKKwkgICAgICAgKGxvY2FsLT5tb2hhd2sgJiYgaWZfcG9ydD09NCkpCisJZGV2LT5pZl9wb3J0ID0gaWZfcG9ydDsKKyAgICBlbHNlCisJcHJpbnRrKEtOT1RfWElSQyAiaW52YWxpZCBpZl9wb3J0IHJlcXVlc3RlZFxuIik7CisKKyAgICAvKiB3ZSBjYW4gbm93IHJlZ2lzdGVyIHRoZSBkZXZpY2Ugd2l0aCB0aGUgbmV0IHN1YnN5c3RlbSAqLworICAgIGRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworICAgIGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworCisgICAgaWYgKGxvY2FsLT5kaW5nbykKKwlkb19yZXNldChkZXYsIDEpOyAvKiBhIGtsdWRnZSB0byBtYWtlIHRoZSBjZW01NiB3b3JrICovCisKKyAgICBsaW5rLT5kZXYgPSAmbG9jYWwtPm5vZGU7CisgICAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKyAgICBTRVRfTkVUREVWX0RFVihkZXYsICZoYW5kbGVfdG9fZGV2KGhhbmRsZSkpOworCisgICAgaWYgKChlcnI9cmVnaXN0ZXJfbmV0ZGV2KGRldikpKSB7CisJcHJpbnRrKEtOT1RfWElSQyAicmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKKwlsaW5rLT5kZXYgPSBOVUxMOworCWdvdG8gY29uZmlnX2Vycm9yOworICAgIH0KKworICAgIHN0cmNweShsb2NhbC0+bm9kZS5kZXZfbmFtZSwgZGV2LT5uYW1lKTsKKworICAgIC8qIGdpdmUgc29tZSBpbmZvcyBhYm91dCB0aGUgaGFyZHdhcmUgKi8KKyAgICBwcmludGsoS0VSTl9JTkZPICIlczogJXM6IHBvcnQgJSMzbHgsIGlycSAlZCwgaHdhZGRyIiwKKwkgZGV2LT5uYW1lLCBsb2NhbC0+bWFuZl9zdHIsKHVfbG9uZylkZXYtPmJhc2VfYWRkciwgKGludClkZXYtPmlycSk7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlwcmludGsoIiVjJTAyWCIsIGk/JzonOicgJywgZGV2LT5kZXZfYWRkcltpXSk7CisgICAgcHJpbnRrKCJcbiIpOworCisgICAgcmV0dXJuOworCisgIGNvbmZpZ19lcnJvcjoKKyAgICBsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworICAgIHhpcmMycHNfcmVsZWFzZShsaW5rKTsKKyAgICByZXR1cm47CisKKyAgY2lzX2Vycm9yOgorICAgIHByaW50ayhLTk9UX1hJUkMgInVuYWJsZSB0byBwYXJzZSBDSVNcbiIpOworICBmYWlsdXJlOgorICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7Cit9IC8qIHhpcmMycHNfY29uZmlnICovCisKKy8qKioqKioqKioqKioqKioqCisgKiBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgeGlyYzJwc19yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZSBuZXQKKyAqIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICogc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCisgKi8KK3N0YXRpYyB2b2lkCit4aXJjMnBzX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKworICAgIERFQlVHKDAsICJyZWxlYXNlKDB4JXApXG4iLCBsaW5rKTsKKworICAgIGlmIChsaW5rLT53aW4pIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpZiAobG9jYWwtPmRpbmdvKQorCSAgICBpb3VubWFwKGxvY2FsLT5kaW5nb19jY3IgLSAweDA4MDApOworCXBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOworICAgIH0KKyAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisgICAgcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworICAgIHBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworCit9IC8qIHhpcmMycHNfcmVsZWFzZSAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqKioqKioqKioqKioqKioKKyAqIFRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiAgTW9zdGx5LCB0aGlzIHNjaGVkdWxlcyBvdGhlcgorICogc3R1ZmYgdG8gcnVuIGFmdGVyIGFuIGV2ZW50IGlzIHJlY2VpdmVkLiAgQSBDQVJEX1JFTU9WQUwgZXZlbnQKKyAqIGFsc28gc2V0cyBzb21lIGZsYWdzIHRvIGRpc2NvdXJhZ2UgdGhlIG5ldCBkcml2ZXJzIGZyb20gdHJ5aW5nCisgKiB0byB0YWxrIHRvIHRoZSBjYXJkIGFueSBtb3JlLgorICoKKyAqIFdoZW4gYSBDQVJEX1JFTU9WQUwgZXZlbnQgaXMgcmVjZWl2ZWQsIHdlIGltbWVkaWF0ZWx5IHNldCBhIGZsYWcKKyAqIHRvIGJsb2NrIGZ1dHVyZSBhY2Nlc3NlcyB0byB0aGlzIGRldmljZS4gIEFsbCB0aGUgZnVuY3Rpb25zIHRoYXQKKyAqIGFjdHVhbGx5IGFjY2VzcyB0aGUgZGV2aWNlIHNob3VsZCBjaGVjayB0aGlzIGZsYWcgdG8gbWFrZSBzdXJlCisgKiB0aGUgY2FyZCBpcyBzdGlsbCBwcmVzZW50LgorICovCisKK3N0YXRpYyBpbnQKK3hpcmMycHNfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCSAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqIGFyZ3MpCit7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCisgICAgREVCVUcoMCwgImV2ZW50KCVkKVxuIiwgKGludClldmVudCk7CisKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBDU19FVkVOVF9SRUdJU1RSQVRJT05fQ09NUExFVEU6CisJREVCVUcoMCwgInJlZ2lzdHJhdGlvbiBjb21wbGV0ZVxuIik7CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJICAgIG5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OOgorCWxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOworCXhpcmMycHNfY29uZmlnKGxpbmspOworCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwlsaW5rLT5zdGF0ZSB8PSBERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkgICAgaWYgKGxpbmstPm9wZW4pIHsKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQlkb19wb3dlcmRvd24oZGV2KTsKKwkgICAgfQorCSAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJfQorCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCSAgICBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpOworCSAgICBpZiAobGluay0+b3BlbikgeworCQlkb19yZXNldChkZXYsMSk7CisJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwkgICAgfQorCX0KKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9IC8qIHhpcmMycHNfZXZlbnQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKioqKioqKioqKioqKioqCisgKiBUaGlzIGlzIHRoZSBJbnRlcnJ1cHQgc2VydmljZSByb3V0ZS4KKyAqLworc3RhdGljIGlycXJldHVybl90Cit4aXJjMnBzX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisgICAgbG9jYWxfaW5mb190ICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHI7CisgICAgdV9jaGFyIHNhdmVkX3BhZ2U7CisgICAgdW5zaWduZWQgYnl0ZXNfcmN2ZDsKKyAgICB1bnNpZ25lZCBpbnRfc3RhdHVzLCBldGhfc3RhdHVzLCByeF9zdGF0dXMsIHR4X3N0YXR1czsKKyAgICB1bnNpZ25lZCByc3IsIHBrdGxlbjsKKyAgICB1bG9uZyBzdGFydF90aWNrcyA9IGppZmZpZXM7IC8qIGZpeG1lOiBqaWZmaWVzIHJvbGxvdmVyIGV2ZXJ5IDQ5NyBkYXlzCisJCQkJICAqIGlzIHRoaXMgc29tZXRoaW5nIHRvIHdvcnJ5IGFib3V0PworCQkJCSAgKiAtLSBvbiBhIGxhcHRvcD8KKwkJCQkgICovCisKKyAgICBpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJcmV0dXJuIElSUV9IQU5ETEVEOworCisgICAgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaWYgKGxwLT5tb2hhd2spIHsgLyogbXVzdCBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgKi8KKwlQdXRCeXRlKFhJUkNSRUdfQ1IsIDApOworICAgIH0KKworICAgIERFQlVHKDYsICIlczogaW50ZXJydXB0ICVkIGF0ICUjeC5cbiIsIGRldi0+bmFtZSwgaXJxLCBpb2FkZHIpOworCisgICAgc2F2ZWRfcGFnZSA9IEdldEJ5dGUoWElSQ1JFR19QUik7CisgICAgLyogUmVhZCB0aGUgSVNSIHRvIHNlZSB3aGF0cyB0aGUgY2F1c2UgZm9yIHRoZSBpbnRlcnJ1cHQuCisgICAgICogVGhpcyBhbHNvIGNsZWFycyB0aGUgaW50ZXJydXB0IGZsYWdzIG9uIENFMiBjYXJkcworICAgICAqLworICAgIGludF9zdGF0dXMgPSBHZXRCeXRlKFhJUkNSRUdfSVNSKTsKKyAgICBieXRlc19yY3ZkID0gMDsKKyAgbG9vcF9lbnRyeToKKyAgICBpZiAoaW50X3N0YXR1cyA9PSAweGZmKSB7IC8qIGNhcmQgbWF5IGJlIGVqZWN0ZWQgKi8KKwlERUJVRygzLCAiJXM6IGludGVycnVwdCAlZCBmb3IgZGVhZCBjYXJkXG4iLCBkZXYtPm5hbWUsIGlycSk7CisJZ290byBsZWF2ZTsKKyAgICB9CisgICAgZXRoX3N0YXR1cyA9IEdldEJ5dGUoWElSQ1JFR19FU1IpOworCisgICAgU2VsZWN0UGFnZSgweDQwKTsKKyAgICByeF9zdGF0dXMgID0gR2V0Qnl0ZShYSVJDUkVHNDBfUlhTVDApOworICAgIFB1dEJ5dGUoWElSQ1JFRzQwX1JYU1QwLCAofnJ4X3N0YXR1cyAmIDB4ZmYpKTsKKyAgICB0eF9zdGF0dXMgPSBHZXRCeXRlKFhJUkNSRUc0MF9UWFNUMCk7CisgICAgdHhfc3RhdHVzIHw9IEdldEJ5dGUoWElSQ1JFRzQwX1RYU1QxKSA8PCA4OworICAgIFB1dEJ5dGUoWElSQ1JFRzQwX1RYU1QwLCAwKTsKKyAgICBQdXRCeXRlKFhJUkNSRUc0MF9UWFNUMSwgMCk7CisKKyAgICBERUJVRygzLCAiJXM6IElTUj0lIzIuMnggRVNSPSUjMi4yeCBSU1I9JSMyLjJ4IFRTUj0lIzQuNHhcbiIsCisJICBkZXYtPm5hbWUsIGludF9zdGF0dXMsIGV0aF9zdGF0dXMsIHJ4X3N0YXR1cywgdHhfc3RhdHVzKTsKKworICAgIC8qKioqKiByZWNlaXZlIHNlY3Rpb24gKioqKioqLworICAgIFNlbGVjdFBhZ2UoMCk7CisgICAgd2hpbGUgKGV0aF9zdGF0dXMgJiBGdWxsUGt0UmN2ZCkgeworCXJzciA9IEdldEJ5dGUoWElSQ1JFRzBfUlNSKTsKKwlpZiAoYnl0ZXNfcmN2ZCA+IG1heHJ4X2J5dGVzICYmIChyc3IgJiBQa3RSeE9rKSkgeworCSAgICAvKiB0b28gbWFueSBieXRlcyByZWNlaXZlZCBkdXJpbmcgdGhpcyBpbnQsIGRyb3AgdGhlIHJlc3Qgb2YgdGhlCisJICAgICAqIHBhY2tldHMgKi8KKwkgICAgbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkgICAgREVCVUcoMiwgIiVzOiBSWCBkcm9wLCB0b28gbXVjaCBkb25lXG4iLCBkZXYtPm5hbWUpOworCX0gZWxzZSBpZiAocnNyICYgUGt0UnhPaykgeworCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJICAgIHBrdGxlbiA9IEdldFdvcmQoWElSQ1JFRzBfUkJDKTsKKwkgICAgYnl0ZXNfcmN2ZCArPSBwa3RsZW47CisKKwkgICAgREVCVUcoNSwgInJzcj0lIzAyeCBwYWNrZXRfbGVuZ3RoPSV1XG4iLCByc3IsIHBrdGxlbik7CisKKwkgICAgc2tiID0gZGV2X2FsbG9jX3NrYihwa3RsZW4rMyk7IC8qIDEgZXh0cmEgc28gd2UgY2FuIHVzZSBpbnN3ICovCisJICAgIGlmICghc2tiKSB7CisJCXByaW50ayhLTk9UX1hJUkMgImxvdyBtZW1vcnksIHBhY2tldCBkcm9wcGVkIChzaXplPSV1KVxuIiwKKwkJICAgICAgIHBrdGxlbik7CisJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJICAgIH0gZWxzZSB7IC8qIG9rYXkgZ2V0IHRoZSBwYWNrZXQgKi8KKwkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkJaWYgKGxwLT5zaWxpY29uID09IDAgKSB7IC8qIHdvcmsgYXJvdW5kIGEgaGFyZHdhcmUgYnVnICovCisJCSAgICB1bnNpZ25lZCByaHNhOyAvKiByZWNlaXZlIHN0YXJ0IGFkZHJlc3MgKi8KKworCQkgICAgU2VsZWN0UGFnZSg1KTsKKwkJICAgIHJoc2EgPSBHZXRXb3JkKFhJUkNSRUc1X1JIU0EwKTsKKwkJICAgIFNlbGVjdFBhZ2UoMCk7CisJCSAgICByaHNhICs9IDM7IC8qIHNraXAgY29udHJvbCBpbmZvcyAqLworCQkgICAgaWYgKHJoc2EgPj0gMHg4MDAwKQorCQkJcmhzYSA9IDA7CisJCSAgICBpZiAocmhzYSArIHBrdGxlbiA+IDB4ODAwMCkgeworCQkJdW5zaWduZWQgaTsKKwkJCXVfY2hhciAqYnVmID0gc2tiX3B1dChza2IsIHBrdGxlbik7CisJCQlmb3IgKGk9MDsgaSA8IHBrdGxlbiA7IGkrKywgcmhzYSsrKSB7CisJCQkgICAgYnVmW2ldID0gR2V0Qnl0ZShYSVJDUkVHX0VEUCk7CisJCQkgICAgaWYgKHJoc2EgPT0gMHg4MDAwKSB7CisJCQkJcmhzYSA9IDA7CisJCQkJaS0tOworCQkJICAgIH0KKwkJCX0KKwkJICAgIH0gZWxzZSB7CisJCQlpbnN3KGlvYWRkcitYSVJDUkVHX0VEUCwKKwkJCQlza2JfcHV0KHNrYiwgcGt0bGVuKSwgKHBrdGxlbisxKT4+MSk7CisJCSAgICB9CisJCX0KKwkgICAgICAjaWYgMAorCQllbHNlIGlmIChscC0+bW9oYXdrKSB7CisJCSAgICAvKiBUbyB1c2UgdGhpcyAzMiBiaXQgYWNjZXNzIHdlIHNob3VsZCB1c2UKKwkJICAgICAqIGEgbWFudWFsIG9wdGltaXplZCBsb29wCisJCSAgICAgKiBBbHNvIHRoZSB3b3JkcyBhcmUgc3dhcHBlZCwgd2UgY2FuIGdldCBtb3JlCisJCSAgICAgKiBwZXJmb3JtYW5jZSBieSB1c2luZyAzMiBiaXQgYWNjZXNzIGFuZCBzd2FwcGluZworCQkgICAgICogdGhlIHdvcmRzIGluIGEgcmVnaXN0ZXIuIFdpbGwgbmVlZCB0aGlzIGZvciBjYXJkYnVzCisJCSAgICAgKgorCQkgICAgICogTm90ZTogZG9uJ3QgZm9yZ2V0IHRvIGNoYW5nZSB0aGUgQUxMT0NfU0tCIHRvIC4uICszCisJCSAgICAgKi8KKwkJICAgIHVuc2lnbmVkIGk7CisJCSAgICB1X2xvbmcgKnAgPSBza2JfcHV0KHNrYiwgcGt0bGVuKTsKKwkJICAgIHJlZ2lzdGVyIHVfbG9uZyBhOworCQkgICAga2lvX2FkZHJfdCBlZHByZWcgPSBpb2FkZHIrWElSQ1JFR19FRFAtMjsKKwkJICAgIGZvciAoaT0wOyBpIDwgbGVuIDsgaSArPSA0LCBwKyspIHsKKwkJCWEgPSBpbmwoZWRwcmVnKTsKKwkJCV9fYXNtX18oInJvcmwgJDE2LCUwXG5cdCIKKwkJCQk6Ij1xIiAoYSkKKwkJCQk6ICIwIiAoYSkpOworCQkJKnAgPSBhOworCQkgICAgfQorCQl9CisJICAgICAgI2VuZGlmCisJCWVsc2UgeworCQkgICAgaW5zdyhpb2FkZHIrWElSQ1JFR19FRFAsIHNrYl9wdXQoc2tiLCBwa3RsZW4pLAorCQkJICAgIChwa3RsZW4rMSk+PjEpOworCQl9CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCXNrYi0+ZGV2ID0gZGV2OworCQluZXRpZl9yeChza2IpOworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0bGVuOworCQlpZiAoIShyc3IgJiBQaHlQa3QpKQorCQkgICAgbHAtPnN0YXRzLm11bHRpY2FzdCsrOworCSAgICB9CisJfSBlbHNlIHsgLyogYmFkIHBhY2tldCAqLworCSAgICBERUJVRyg1LCAicnNyPSUjMDJ4XG4iLCByc3IpOworCX0KKwlpZiAocnNyICYgUGt0VG9vTG9uZykgeworCSAgICBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJICAgIERFQlVHKDMsICIlczogUGFja2V0IHRvbyBsb25nXG4iLCBkZXYtPm5hbWUpOworCX0KKwlpZiAocnNyICYgQ1JDRXJyKSB7CisJICAgIGxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJICAgIERFQlVHKDMsICIlczogQ1JDIGVycm9yXG4iLCBkZXYtPm5hbWUpOworCX0KKwlpZiAocnNyICYgQWxpZ25FcnIpIHsKKwkgICAgbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7IC8qIG9rYXkgPyAqLworCSAgICBERUJVRygzLCAiJXM6IEFsaWdubWVudCBlcnJvclxuIiwgZGV2LT5uYW1lKTsKKwl9CisKKwkvKiBjbGVhciB0aGUgcmVjZWl2ZWQvZHJvcHBlZC9lcnJvciBwYWNrZXQgKi8KKwlQdXRXb3JkKFhJUkNSRUcwX0RPLCAweDgwMDApOyAvKiBpc3N1ZSBjbWQ6IHNraXBfcnhfcGFja2V0ICovCisKKwkvKiBnZXQgdGhlIG5ldyBldGhlcm5ldCBzdGF0dXMgKi8KKwlldGhfc3RhdHVzID0gR2V0Qnl0ZShYSVJDUkVHX0VTUik7CisgICAgfQorICAgIGlmIChyeF9zdGF0dXMgJiAweDEwKSB7IC8qIFJlY2VpdmUgb3ZlcnJ1biAqLworCWxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCVB1dEJ5dGUoWElSQ1JFR19DUiwgQ2xlYXJSeE92cnVuKTsKKwlERUJVRygzLCAicmVjZWl2ZSBvdmVycnVuIGNsZWFyZWRcbiIpOworICAgIH0KKworICAgIC8qKioqKiB0cmFuc21pdCBzZWN0aW9uICoqKioqKi8KKyAgICBpZiAoaW50X3N0YXR1cyAmIFBrdFR4ZWQpIHsKKwl1bnNpZ25lZCBuLCBubjsKKworCW4gPSBscC0+bGFzdF9wdHJfdmFsdWU7CisJbm4gPSBHZXRCeXRlKFhJUkNSRUcwX1BUUik7CisJbHAtPmxhc3RfcHRyX3ZhbHVlID0gbm47CisJaWYgKG5uIDwgbikgLyogcm9sbG92ZXIgKi8KKwkgICAgbHAtPnN0YXRzLnR4X3BhY2tldHMgKz0gMjU2IC0gbjsKKwllbHNlIGlmIChuID09IG5uKSB7IC8qIGhhcHBlbnMgc29tZXRpbWVzIC0gZG9uJ3Qga25vdyB3aHkgKi8KKwkgICAgREVCVUcoMCwgIlBUUiBub3QgY2hhbmdlZD9cbiIpOworCX0gZWxzZQorCSAgICBscC0+c3RhdHMudHhfcGFja2V0cyArPSBscC0+bGFzdF9wdHJfdmFsdWUgLSBuOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKyAgICB9CisgICAgaWYgKHR4X3N0YXR1cyAmIDB4MDAwMikgewkvKiBFeGVjZXNzaXZlIGNvbGxpc3Npb25zICovCisJREVCVUcoMCwgInR4IHJlc3RhcnRlZCBkdWUgdG8gZXhlY3NzaXZlIGNvbGxpc3Npb25zXG4iKTsKKwlQdXRCeXRlKFhJUkNSRUdfQ1IsIFJlc3RhcnRUeCk7ICAvKiByZXN0YXJ0IHRyYW5zbWl0dGVyIHByb2Nlc3MgKi8KKyAgICB9CisgICAgaWYgKHR4X3N0YXR1cyAmIDB4MDA0MCkKKwlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKworICAgIC8qIHJlY2FsY3VsYXRlIG91ciB3b3JrIGNodW5rIHNvIHRoYXQgd2UgbGltaXQgdGhlIGR1cmF0aW9uIG9mIHRoaXMKKyAgICAgKiBJU1IgdG8gYWJvdXQgMS8xMCBvZiBhIHNlY29uZC4KKyAgICAgKiBDYWxjdWxhdGUgb25seSBpZiB3ZSByZWNlaXZlZCBhIHJlYXNvbmFibGUgYW1vdW50IG9mIGJ5dGVzLgorICAgICAqLworICAgIGlmIChieXRlc19yY3ZkID4gMTAwMCkgeworCXVfbG9uZyBkdXJhdGlvbiA9IGppZmZpZXMgLSBzdGFydF90aWNrczsKKworCWlmIChkdXJhdGlvbiA+PSBIWi8xMCkgeyAvKiBpZiBtb3JlIHRoYW4gYWJvdXQgMS8xMCBzZWNvbmQgKi8KKwkgICAgbWF4cnhfYnl0ZXMgPSAoYnl0ZXNfcmN2ZCAqIChIWi8xMCkpIC8gZHVyYXRpb247CisJICAgIGlmIChtYXhyeF9ieXRlcyA8IDIwMDApCisJCW1heHJ4X2J5dGVzID0gMjAwMDsKKwkgICAgZWxzZSBpZiAobWF4cnhfYnl0ZXMgPiAyMjAwMCkKKwkJbWF4cnhfYnl0ZXMgPSAyMjAwMDsKKwkgICAgREVCVUcoMSwgInNldCBtYXhyeD0ldSAocmN2ZD0ldSB0aWNrcz0lbHUpXG4iLAorCQkgIG1heHJ4X2J5dGVzLCBieXRlc19yY3ZkLCBkdXJhdGlvbik7CisJfSBlbHNlIGlmICghZHVyYXRpb24gJiYgbWF4cnhfYnl0ZXMgPCAyMjAwMCkgeworCSAgICAvKiBub3cgbXVjaCBmYXN0ZXIgKi8KKwkgICAgbWF4cnhfYnl0ZXMgKz0gMjAwMDsKKwkgICAgaWYgKG1heHJ4X2J5dGVzID4gMjIwMDApCisJCW1heHJ4X2J5dGVzID0gMjIwMDA7CisJICAgIERFQlVHKDEsICJzZXQgbWF4cng9JXVcbiIsIG1heHJ4X2J5dGVzKTsKKwl9CisgICAgfQorCisgIGxlYXZlOgorICAgIGlmIChsb2NrdXBfaGFjaykgeworCWlmIChpbnRfc3RhdHVzICE9IDB4ZmYgJiYgKGludF9zdGF0dXMgPSBHZXRCeXRlKFhJUkNSRUdfSVNSKSkgIT0gMCkKKwkgICAgZ290byBsb29wX2VudHJ5OworICAgIH0KKyAgICBTZWxlY3RQYWdlKHNhdmVkX3BhZ2UpOworICAgIFB1dEJ5dGUoWElSQ1JFR19DUiwgRW5hYmxlSW50cik7ICAvKiByZS1lbmFibGUgaW50ZXJydXB0cyAqLworICAgIC8qIEluc3RlYWQgb2YgZHJvcHBpbmcgcGFja2V0cyBkdXJpbmcgYSByZWNlaXZlLCB3ZSBjb3VsZAorICAgICAqIGZvcmNlIGFuIGludGVycnVwdCB3aXRoIHRoaXMgY29tbWFuZDoKKyAgICAgKgkgIFB1dEJ5dGUoWElSQ1JFR19DUiwgRW5hYmxlSW50cnxGb3JjZUludHIpOworICAgICAqLworICAgIHJldHVybiBJUlFfSEFORExFRDsKK30gLyogeGlyYzJwc19pbnRlcnJ1cHQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkCitkb190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgbG9jYWxfaW5mb190ICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgcHJpbnRrKEtFUk5fTk9USUNFICIlczogdHJhbnNtaXQgdGltZWQgb3V0XG4iLCBkZXYtPm5hbWUpOworICAgIGxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKyAgICAvKiByZXNldCB0aGUgY2FyZCAqLworICAgIGRvX3Jlc2V0KGRldiwxKTsKKyAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyBpbnQKK2RvX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBsb2NhbF9pbmZvX3QgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBva2F5OworICAgIHVuc2lnbmVkIGZyZWVzcGFjZTsKKyAgICB1bnNpZ25lZCBwa3RsZW4gPSBza2I/IHNrYi0+bGVuIDogMDsKKworICAgIERFQlVHKDEsICJkb19zdGFydF94bWl0KHNrYj0lcCwgZGV2PSVwKSBsZW49JXVcbiIsCisJICBza2IsIGRldiwgcGt0bGVuKTsKKworCisgICAgLyogYWRqdXN0IHRoZSBwYWNrZXQgbGVuZ3RoIHRvIG1pbi4gcmVxdWlyZWQKKyAgICAgKiBhbmQgaG9wZSB0aGF0IHRoZSBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoCisgICAgICogdG8gcHJvdmlkZSBzb21lIHJhbmRvbSBkYXRhLgorICAgICAqIGZpeG1lOiBGb3IgTW9oYXdrIHdlIGNhbiBjaGFuZ2UgdGhpcyBieSBzZW5kaW5nCisgICAgICogYSBsYXJnZXIgcGFja2V0bGVuIHRoYW4gd2UgYWN0dWFsbHkgaGF2ZTsgdGhlIGNoaXAgd2lsbAorICAgICAqIHBhZCB0aGlzIGluIGhpcyBidWZmZXIgd2l0aCByYW5kb20gYnl0ZXMKKyAgICAgKi8KKyAgICBpZiAocGt0bGVuIDwgRVRIX1pMRU4pCisgICAgeworICAgICAgICBza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisgICAgICAgIGlmIChza2IgPT0gTlVMTCkKKyAgICAgICAgCXJldHVybiAwOworCXBrdGxlbiA9IEVUSF9aTEVOOworICAgIH0KKworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKyAgICBTZWxlY3RQYWdlKDApOworICAgIFB1dFdvcmQoWElSQ1JFRzBfVFJTLCAodV9zaG9ydClwa3RsZW4rMik7CisgICAgZnJlZXNwYWNlID0gR2V0V29yZChYSVJDUkVHMF9UU08pOworICAgIG9rYXkgPSBmcmVlc3BhY2UgJiAweDgwMDA7CisgICAgZnJlZXNwYWNlICY9IDB4N2ZmZjsKKyAgICAvKiBUUlMgZG9lc24ndCB3b3JrIC0gKGluZGVlZCBpdCBpcyBlbGltaW5hdGVkIHdpdGggc2lsLXJldiAxKSAqLworICAgIG9rYXkgPSBwa3RsZW4gKzIgPCBmcmVlc3BhY2U7CisgICAgREVCVUcoMiArIChva2F5ID8gMiA6IDApLCAiJXM6IGF2YWlsLiB0eCBzcGFjZT0ldSVzXG4iLAorCSAgZGV2LT5uYW1lLCBmcmVlc3BhY2UsIG9rYXkgPyAiIChva2F5KSI6IiAobm90IGVub3VnaCkiKTsKKyAgICBpZiAoIW9rYXkpIHsgLyogbm90IGVub3VnaCBzcGFjZSAqLworCXJldHVybiAxOyAgLyogdXBwZXIgbGF5ZXIgbWF5IGRlY2lkZSB0byByZXF1ZXVlIHRoaXMgcGFja2V0ICovCisgICAgfQorICAgIC8qIHNlbmQgdGhlIHBhY2tldCAqLworICAgIFB1dFdvcmQoWElSQ1JFR19FRFAsICh1X3Nob3J0KXBrdGxlbik7CisgICAgb3V0c3coaW9hZGRyK1hJUkNSRUdfRURQLCBza2ItPmRhdGEsIHBrdGxlbj4+MSk7CisgICAgaWYgKHBrdGxlbiAmIDEpCisJUHV0Qnl0ZShYSVJDUkVHX0VEUCwgc2tiLT5kYXRhW3BrdGxlbi0xXSk7CisKKyAgICBpZiAobHAtPm1vaGF3aykKKwlQdXRCeXRlKFhJUkNSRUdfQ1IsIFRyYW5zbWl0UGFja2V0fEVuYWJsZUludHIpOworCisgICAgZGV2X2tmcmVlX3NrYiAoc2tiKTsKKyAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICBscC0+c3RhdHMudHhfYnl0ZXMgKz0gcGt0bGVuOworICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCitkb19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBsb2NhbF9pbmZvX3QgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgIC8qCWxwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gR2V0Qnl0ZSg/KSAqLworICAgIHJldHVybiAmbHAtPnN0YXRzOworfQorCisvKioqKioqKioqKioqKioqKgorICogU2V0IGFsbCBhZGRyZXNzZXM6IFRoaXMgZmlyc3Qgb25lIGlzIHRoZSBpbmRpdmlkdWFsIGFkZHJlc3MsCisgKiB0aGUgbmV4dCA5IGFkZHJlc3NlcyBhcmUgdGFrZW4gZnJvbSB0aGUgbXVsdGljYXN0IGxpc3QgYW5kCisgKiB0aGUgcmVzdCBpcyBmaWxsZWQgd2l0aCB0aGUgaW5kaXZpZHVhbCBhZGRyZXNzLgorICovCitzdGF0aWMgdm9pZAorc2V0X2FkZHJlc3NlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgbG9jYWxfaW5mb190ICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgc3RydWN0IGRldl9tY19saXN0ICpkbWkgPSBkZXYtPm1jX2xpc3Q7CisgICAgY2hhciAqYWRkcjsKKyAgICBpbnQgaSxqLGssbjsKKworICAgIFNlbGVjdFBhZ2Uoaz0weDUwKTsKKyAgICBmb3IgKGk9MCxqPTgsbj0wOyA7IGkrKywgaisrKSB7CisJaWYgKGkgPiA1KSB7CisJICAgIGlmICgrK24gPiA5KQorCQlicmVhazsKKwkgICAgaSA9IDA7CisJfQorCWlmIChqID4gMTUpIHsKKwkgICAgaiA9IDg7CisJICAgIGsrKzsKKwkgICAgU2VsZWN0UGFnZShrKTsKKwl9CisKKwlpZiAobiAmJiBuIDw9IGRldi0+bWNfY291bnQgJiYgZG1pKSB7CisJICAgIGFkZHIgPSBkbWktPmRtaV9hZGRyOworCSAgICBkbWkgPSBkbWktPm5leHQ7CisJfSBlbHNlCisJICAgIGFkZHIgPSBkZXYtPmRldl9hZGRyOworCisJaWYgKGxwLT5tb2hhd2spCisJICAgIFB1dEJ5dGUoaiwgYWRkcls1LWldKTsKKwllbHNlCisJICAgIFB1dEJ5dGUoaiwgYWRkcltpXSk7CisgICAgfQorICAgIFNlbGVjdFBhZ2UoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqCisgKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAqIFdlIGNhbiBmaWx0ZXIgdXAgdG8gOSBhZGRyZXNzZXMsIGlmIG1vcmUgYXJlIHJlcXVlc3RlZCB3ZSBzZXQKKyAqIG11bHRpY2FzdCBwcm9taXNjdW91cyBtb2RlLgorICovCisKK3N0YXRpYyB2b2lkCitzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgICAgU2VsZWN0UGFnZSgweDQyKTsKKyAgICBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7IC8qIHNub29wICovCisJUHV0Qnl0ZShYSVJDUkVHNDJfU1dDMSwgMHgwNik7IC8qIHNldCBNUEUgYW5kIFBNRSAqLworICAgIH0gZWxzZSBpZiAoZGV2LT5tY19jb3VudCA+IDkgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJUHV0Qnl0ZShYSVJDUkVHNDJfU1dDMSwgMHgwNik7IC8qIHNldCBNUEUgKi8KKyAgICB9IGVsc2UgaWYgKGRldi0+bWNfY291bnQpIHsKKwkvKiB0aGUgY2hpcCBjYW4gZmlsdGVyIDkgYWRkcmVzc2VzIHBlcmZlY3RseSAqLworCVB1dEJ5dGUoWElSQ1JFRzQyX1NXQzEsIDB4MDApOworCVNlbGVjdFBhZ2UoMHg0MCk7CisJUHV0Qnl0ZShYSVJDUkVHNDBfQ01EMCwgT2ZmbGluZSk7CisJc2V0X2FkZHJlc3NlcyhkZXYpOworCVNlbGVjdFBhZ2UoMHg0MCk7CisJUHV0Qnl0ZShYSVJDUkVHNDBfQ01EMCwgRW5hYmxlUmVjdiB8IE9ubGluZSk7CisgICAgfSBlbHNlIHsgLyogc3RhbmRhcmQgdXNhZ2UgKi8KKwlQdXRCeXRlKFhJUkNSRUc0Ml9TV0MxLCAweDAwKTsKKyAgICB9CisgICAgU2VsZWN0UGFnZSgwKTsKK30KKworc3RhdGljIGludAorZG9fY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKQoreworICAgIGxvY2FsX2luZm9fdCAqbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgREVCVUcoMCwgImRvX2NvbmZpZyglcClcbiIsIGRldik7CisgICAgaWYgKG1hcC0+cG9ydCAhPSAyNTUgJiYgbWFwLT5wb3J0ICE9IGRldi0+aWZfcG9ydCkgeworCWlmIChtYXAtPnBvcnQgPiA0KQorCSAgICByZXR1cm4gLUVJTlZBTDsKKwlpZiAoIW1hcC0+cG9ydCkgeworCSAgICBsb2NhbC0+cHJvYmVfcG9ydCA9IDE7CisJICAgIGRldi0+aWZfcG9ydCA9IDE7CisJfSBlbHNlIHsKKwkgICAgbG9jYWwtPnByb2JlX3BvcnQgPSAwOworCSAgICBkZXYtPmlmX3BvcnQgPSBtYXAtPnBvcnQ7CisJfQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBzd2l0Y2hpbmcgdG8gJXMgcG9ydFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBpZl9uYW1lc1tkZXYtPmlmX3BvcnRdKTsKKwlkb19yZXNldChkZXYsMSk7ICAvKiBub3QgdGhlIGZpbmUgd2F5IDotKSAqLworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioKKyAqIE9wZW4gdGhlIGRyaXZlcgorICovCitzdGF0aWMgaW50Citkb19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgbG9jYWxfaW5mb190ICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgZGV2X2xpbmtfdCAqbGluayA9ICZscC0+bGluazsKKworICAgIERFQlVHKDAsICJkb19vcGVuKCVwKVxuIiwgZGV2KTsKKworICAgIC8qIENoZWNrIHRoYXQgdGhlIFBDTUNJQSBjYXJkIGlzIHN0aWxsIGhlcmUuICovCisgICAgLyogUGh5c2ljYWwgZGV2aWNlIHByZXNlbnQgc2lnbmF0dXJlLiAqLworICAgIGlmICghREVWX09LKGxpbmspKQorCXJldHVybiAtRU5PREVWOworCisgICAgLyogb2theSAqLworICAgIGxpbmstPm9wZW4rKzsKKworICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgZG9fcmVzZXQoZGV2LDEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgInhpcmMycHNfY3MiKTsKKwlzcHJpbnRmKGluZm8tPmJ1c19pbmZvLCAiUENNQ0lBIDB4JWx4IiwgZGV2LT5iYXNlX2FkZHIpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorfTsKKworc3RhdGljIGludAorZG9faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKyAgICBsb2NhbF9pbmZvX3QgKmxvY2FsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHUxNiAqZGF0YSA9ICh1MTYgKikmcnEtPmlmcl9pZnJ1OworCisgICAgREVCVUcoMSwgIiVzOiBpb2N0bCglLS42cywgJSMwNHgpICUwNHggJTA0eCAlMDR4ICUwNHhcbiIsCisJICBkZXYtPm5hbWUsIHJxLT5pZnJfaWZybi5pZnJuX25hbWUsIGNtZCwKKwkgIGRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM10pOworCisgICAgaWYgKCFsb2NhbC0+bW9oYXdrKQorCXJldHVybiAtRU9QTk9UU1VQUDsKKworICAgIHN3aXRjaChjbWQpIHsKKyAgICAgIGNhc2UgU0lPQ0dNSUlQSFk6CQkvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIFBIWSBpbiB1c2UuICovCisJZGF0YVswXSA9IDA7CQkvKiB3ZSBoYXZlIG9ubHkgdGhpcyBhZGRyZXNzICovCisJLyogZmFsbCB0cm91Z2ggKi8KKyAgICAgIGNhc2UgU0lPQ0dNSUlSRUc6CQkvKiBSZWFkIHRoZSBzcGVjaWZpZWQgTUlJIHJlZ2lzdGVyLiAqLworCWRhdGFbM10gPSBtaWlfcmQoaW9hZGRyLCBkYXRhWzBdICYgMHgxZiwgZGF0YVsxXSAmIDB4MWYpOworCWJyZWFrOworICAgICAgY2FzZSBTSU9DU01JSVJFRzoJCS8qIFdyaXRlIHRoZSBzcGVjaWZpZWQgTUlJIHJlZ2lzdGVyICovCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCSAgICByZXR1cm4gLUVQRVJNOworCW1paV93cihpb2FkZHIsIGRhdGFbMF0gJiAweDFmLCBkYXRhWzFdICYgMHgxZiwgZGF0YVsyXSwgMTYpOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlyZXR1cm4gLUVPUE5PVFNVUFA7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoraGFyZHJlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgbG9jYWxfaW5mb190ICpsb2NhbCA9IG5ldGRldl9wcml2KGRldik7CisgICAga2lvX2FkZHJfdCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIFNlbGVjdFBhZ2UoNCk7CisgICAgdWRlbGF5KDEpOworICAgIFB1dEJ5dGUoWElSQ1JFRzRfR1BSMSwgMCk7CSAgICAgLyogY2xlYXIgYml0IDA6IHBvd2VyIGRvd24gKi8KKyAgICBtc2xlZXAoNDApOwkJCQkgICAgIC8qIHdhaXQgNDAgbXNlYyAqLworICAgIGlmIChsb2NhbC0+bW9oYXdrKQorCVB1dEJ5dGUoWElSQ1JFRzRfR1BSMSwgMSk7CSAvKiBzZXQgYml0IDA6IHBvd2VyIHVwICovCisgICAgZWxzZQorCVB1dEJ5dGUoWElSQ1JFRzRfR1BSMSwgMSB8IDQpOwkgLyogc2V0IGJpdCAwOiBwb3dlciB1cCwgYml0IDI6IEFJQyAqLworICAgIG1zbGVlcCgyMCk7CQkJICAgICAvKiB3YWl0IDIwIG1zZWMgKi8KK30KKworc3RhdGljIHZvaWQKK2RvX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBmdWxsKQoreworICAgIGxvY2FsX2luZm9fdCAqbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdW5zaWduZWQgdmFsdWU7CisKKyAgICBERUJVRygwLCAiJXM6IGRvX3Jlc2V0KCVwLCVkKVxuIiwgZGV2PyBkZXYtPm5hbWU6ImV0aD8iLCBkZXYsIGZ1bGwpOworCisgICAgaGFyZHJlc2V0KGRldik7CisgICAgUHV0Qnl0ZShYSVJDUkVHX0NSLCBTb2Z0UmVzZXQpOyAvKiBzZXQgKi8KKyAgICBtc2xlZXAoMjApOwkJCSAgICAgLyogd2FpdCAyMCBtc2VjICovCisgICAgUHV0Qnl0ZShYSVJDUkVHX0NSLCAwKTsJICAgICAvKiBjbGVhciAqLworICAgIG1zbGVlcCg0MCk7CQkJICAgICAvKiB3YWl0IDQwIG1zZWMgKi8KKyAgICBpZiAobG9jYWwtPm1vaGF3aykgeworCVNlbGVjdFBhZ2UoNCk7CisJLyogc2V0IHBpbiBHUDEgYW5kIEdQMiB0byBvdXRwdXQgICgweDBjKQorCSAqIHNldCBHUDEgdG8gbG93IHRvIHBvd2VyIHVwIHRoZSBNTDY2OTIgKDB4MDApCisJICogc2V0IEdQMiB0byBoaWdoIHRvIHBvd2VyIHVwIHRoZSAxME1oeiBjaGlwICAoMHgwMikKKwkgKi8KKwlQdXRCeXRlKFhJUkNSRUc0X0dQUjAsIDB4MGUpOworICAgIH0KKworICAgIC8qIGdpdmUgdGhlIGNpcmN1aXRzIHNvbWUgdGltZSB0byBwb3dlciB1cCAqLworICAgIG1zbGVlcCg1MDApOwkJCS8qIGFib3V0IDUwMG1zICovCisKKyAgICBsb2NhbC0+bGFzdF9wdHJfdmFsdWUgPSAwOworICAgIGxvY2FsLT5zaWxpY29uID0gbG9jYWwtPm1vaGF3ayA/IChHZXRCeXRlKFhJUkNSRUc0X0JPVikgJiAweDcwKSA+PiA0CisJCQkJICAgOiAoR2V0Qnl0ZShYSVJDUkVHNF9CT1YpICYgMHgzMCkgPj4gNDsKKworICAgIGlmIChsb2NhbC0+cHJvYmVfcG9ydCkgeworCWlmICghbG9jYWwtPm1vaGF3aykgeworCSAgICBTZWxlY3RQYWdlKDQpOworCSAgICBQdXRCeXRlKFhJUkNSRUc0X0dQUjAsIDQpOworCSAgICBsb2NhbC0+cHJvYmVfcG9ydCA9IDA7CisJfQorICAgIH0gZWxzZSBpZiAoZGV2LT5pZl9wb3J0ID09IDIpIHsgLyogZW5hYmxlIDEwQmFzZTIgKi8KKwlTZWxlY3RQYWdlKDB4NDIpOworCVB1dEJ5dGUoWElSQ1JFRzQyX1NXQzEsIDB4QzApOworICAgIH0gZWxzZSB7IC8qIGVuYWJsZSAxMEJhc2VUICovCisJU2VsZWN0UGFnZSgweDQyKTsKKwlQdXRCeXRlKFhJUkNSRUc0Ml9TV0MxLCAweDgwKTsKKyAgICB9CisgICAgbXNsZWVwKDQwKTsJCQkgICAgIC8qIHdhaXQgNDAgbXNlYyB0byBsZXQgaXQgY29tcGxldGUgKi8KKworICAjaWZkZWYgUENNQ0lBX0RFQlVHCisgICAgaWYgKHBjX2RlYnVnKSB7CisJU2VsZWN0UGFnZSgwKTsKKwl2YWx1ZSA9IEdldEJ5dGUoWElSQ1JFR19FU1IpOwkgLyogcmVhZCB0aGUgRVNSICovCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBFU1IgaXM6ICUjMDJ4XG4iLCBkZXYtPm5hbWUsIHZhbHVlKTsKKyAgICB9CisgICNlbmRpZgorCisgICAgLyogc2V0dXAgdGhlIEVDUiAqLworICAgIFNlbGVjdFBhZ2UoMSk7CisgICAgUHV0Qnl0ZShYSVJDUkVHMV9JTVIwLCAweGZmKTsgLyogYWxsb3cgYWxsIGludHMgKi8KKyAgICBQdXRCeXRlKFhJUkNSRUcxX0lNUjEsIDEJKTsgLyogYW5kIFNldCBUeFVuZGVycnVuRGV0ZWN0ICovCisgICAgdmFsdWUgPSBHZXRCeXRlKFhJUkNSRUcxX0VDUik7CisgICNpZiAwCisgICAgaWYgKGxvY2FsLT5tb2hhd2spCisJdmFsdWUgfD0gRGlzYWJsZUxpbmtQdWxzZTsKKyAgICBQdXRCeXRlKFhJUkNSRUcxX0VDUiwgdmFsdWUpOworICAjZW5kaWYKKyAgICBERUJVRygwLCAiJXM6IEVDUiBpczogJSMwMnhcbiIsIGRldi0+bmFtZSwgdmFsdWUpOworCisgICAgU2VsZWN0UGFnZSgweDQyKTsKKyAgICBQdXRCeXRlKFhJUkNSRUc0Ml9TV0MwLCAweDIwKTsgLyogZGlzYWJsZSBzb3VyY2UgaW5zZXJ0aW9uICovCisKKyAgICBpZiAobG9jYWwtPnNpbGljb24gIT0gMSkgeworCS8qIHNldCB0aGUgbG9jYWwgbWVtb3J5IGRpdmlkaW5nIGxpbmUuCisJICogVGhlIGNvbW1lbnRzIGluIHRoZSBzYW1wbGUgY29kZSBzYXkgdGhhdCB0aGlzIGlzIG9ubHkKKwkgKiBzZXR0YWJsZSB3aXRoIHRoZSBzY2lwcGVyIHZlcnNpb24gMiB3aGljaCBpcyByZXZpc2lvbiAwLgorCSAqIEFsd2F5cyBmb3IgQ0UzIGNhcmRzCisJICovCisJU2VsZWN0UGFnZSgyKTsKKwlQdXRXb3JkKFhJUkNSRUcyX1JCUywgMHgyMDAwKTsKKyAgICB9CisKKyAgICBpZiAoZnVsbCkKKwlzZXRfYWRkcmVzc2VzKGRldik7CisKKyAgICAvKiBIYXJkd2FyZSB3b3JrYXJvdW5kOgorICAgICAqIFRoZSByZWNlaXZlIGJ5dGUgcG9pbnRlciBhZnRlciByZXNldCBpcyBvZmYgYnkgMSBzbyB3ZSBuZWVkCisgICAgICogdG8gbW92ZSB0aGUgb2Zmc2V0IHBvaW50ZXIgYmFjayB0byAwLgorICAgICAqLworICAgIFNlbGVjdFBhZ2UoMCk7CisgICAgUHV0V29yZChYSVJDUkVHMF9ETywgMHgyMDAwKTsgLyogY2hhbmdlIG9mZnNldCBjb21tYW5kLCBvZmY9MCAqLworCisgICAgLyogc2V0dXAgTUFDIElNUnMgYW5kIGNsZWFyIHN0YXR1cyByZWdpc3RlcnMgKi8KKyAgICBTZWxlY3RQYWdlKDB4NDApOwkJICAgICAvKiBCaXQgNyAuLi4gYml0IDAgKi8KKyAgICBQdXRCeXRlKFhJUkNSRUc0MF9STUFTSzAsIDB4ZmYpOyAvKiBST0ssIFJBQiwgcnN2LCBSTywgQ1JDLCBBRSwgUFRMLCBNUCAqLworICAgIFB1dEJ5dGUoWElSQ1JFRzQwX1RNQVNLMCwgMHhmZik7IC8qIFRPSywgVEFCLCBTUUUsIExMLCBUVSwgSkFCLCBFWEMsIENSUyAqLworICAgIFB1dEJ5dGUoWElSQ1JFRzQwX1RNQVNLMSwgMHhiMCk7IC8qIHJzdiwgcnN2LCBQVEQsIEVYVCwgcnN2LHJzdixyc3YsIHJzdiovCisgICAgUHV0Qnl0ZShYSVJDUkVHNDBfUlhTVDAsICAweDAwKTsgLyogUk9LLCBSQUIsIFJFTiwgUk8sIENSQywgQUUsIFBUTCwgTVAgKi8KKyAgICBQdXRCeXRlKFhJUkNSRUc0MF9UWFNUMCwgIDB4MDApOyAvKiBUT0ssIFRBQiwgU1FFLCBMTCwgVFUsIEpBQiwgRVhDLCBDUlMgKi8KKyAgICBQdXRCeXRlKFhJUkNSRUc0MF9UWFNUMSwgIDB4MDApOyAvKiBURU4sIHJzdiwgUFRELCBFWFQsIHJldHJ5X2NvdW50ZXI6NCAgKi8KKworICAgIGlmIChmdWxsICYmIGxvY2FsLT5tb2hhd2sgJiYgaW5pdF9taWkoZGV2KSkgeworCWlmIChkZXYtPmlmX3BvcnQgPT0gNCB8fCBsb2NhbC0+ZGluZ28gfHwgbG9jYWwtPm5ld19taWkpIHsKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1JSSBzZWxlY3RlZFxuIiwgZGV2LT5uYW1lKTsKKwkgICAgU2VsZWN0UGFnZSgyKTsKKwkgICAgUHV0Qnl0ZShYSVJDUkVHMl9NU1IsIEdldEJ5dGUoWElSQ1JFRzJfTVNSKSB8IDB4MDgpOworCSAgICBtc2xlZXAoMjApOworCX0gZWxzZSB7CisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBNSUkgZGV0ZWN0ZWQ7IHVzaW5nIDEwbWJzXG4iLAorCQkgICBkZXYtPm5hbWUpOworCSAgICBTZWxlY3RQYWdlKDB4NDIpOworCSAgICBpZiAoZGV2LT5pZl9wb3J0ID09IDIpIC8qIGVuYWJsZSAxMEJhc2UyICovCisJCVB1dEJ5dGUoWElSQ1JFRzQyX1NXQzEsIDB4QzApOworCSAgICBlbHNlICAvKiBlbmFibGUgMTBCYXNlVCAqLworCQlQdXRCeXRlKFhJUkNSRUc0Ml9TV0MxLCAweDgwKTsKKwkgICAgbXNsZWVwKDQwKTsJCQkvKiB3YWl0IDQwIG1zZWMgdG8gbGV0IGl0IGNvbXBsZXRlICovCisJfQorCWlmIChmdWxsX2R1cGxleCkKKwkgICAgUHV0Qnl0ZShYSVJDUkVHMV9FQ1IsIEdldEJ5dGUoWElSQ1JFRzFfRUNSIHwgRnVsbER1cGxleCkpOworICAgIH0gZWxzZSB7ICAvKiBObyBNSUkgKi8KKwlTZWxlY3RQYWdlKDApOworCXZhbHVlID0gR2V0Qnl0ZShYSVJDUkVHX0VTUik7CSAvKiByZWFkIHRoZSBFU1IgKi8KKwlkZXYtPmlmX3BvcnQgPSAodmFsdWUgJiBNZWRpYVNlbGVjdCkgPyAxIDogMjsKKyAgICB9CisKKyAgICAvKiBjb25maWd1cmUgdGhlIExFRHMgKi8KKyAgICBTZWxlY3RQYWdlKDIpOworICAgIGlmIChkZXYtPmlmX3BvcnQgPT0gMSB8fCBkZXYtPmlmX3BvcnQgPT0gNCkgLyogVFA6IExpbmsgYW5kIEFjdGl2aXR5ICovCisJUHV0Qnl0ZShYSVJDUkVHMl9MRUQsIDB4M2IpOworICAgIGVsc2UJCQkgICAgICAvKiBDb2F4OiBOb3QtQ29sbGlzaW9uIGFuZCBBY3Rpdml0eSAqLworCVB1dEJ5dGUoWElSQ1JFRzJfTEVELCAweDNhKTsKKworICAgIGlmIChsb2NhbC0+ZGluZ28pCisJUHV0Qnl0ZSgweDBiLCAweDA0KTsgLyogMTAwIE1iaXQgTEVEICovCisKKyAgICAvKiBlbmFibGUgcmVjZWl2ZXIgYW5kIHB1dCB0aGUgbWFjIG9ubGluZSAqLworICAgIGlmIChmdWxsKSB7CisJU2VsZWN0UGFnZSgweDQwKTsKKwlQdXRCeXRlKFhJUkNSRUc0MF9DTUQwLCBFbmFibGVSZWN2IHwgT25saW5lKTsKKyAgICB9CisKKyAgICAvKiBzZXR1cCBFdGhlcm5ldCBJTVIgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzICovCisgICAgU2VsZWN0UGFnZSgxKTsKKyAgICBQdXRCeXRlKFhJUkNSRUcxX0lNUjAsIDB4ZmYpOworICAgIHVkZWxheSgxKTsKKyAgICBTZWxlY3RQYWdlKDApOworICAgIFB1dEJ5dGUoWElSQ1JFR19DUiwgRW5hYmxlSW50cik7CisgICAgaWYgKGxvY2FsLT5tb2RlbSAmJiAhbG9jYWwtPmRpbmdvKSB7IC8qIGRvIHNvbWUgbWFnaWMgKi8KKwlpZiAoIShHZXRCeXRlKDB4MTApICYgMHgwMSkpCisJICAgIFB1dEJ5dGUoMHgxMCwgMHgxMSk7IC8qIHVubWFzayBtYXN0ZXItaW50IGJpdCAqLworICAgIH0KKworICAgIGlmIChmdWxsKQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBtZWRpYSAlcywgc2lsaWNvbiByZXZpc2lvbiAlZFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBpZl9uYW1lc1tkZXYtPmlmX3BvcnRdLCBsb2NhbC0+c2lsaWNvbik7CisgICAgLyogV2Ugc2hvdWxkIHN3aXRjaCBiYWNrIHRvIHBhZ2UgMCB0byBhdm9pZCBhIGJ1ZyBpbiByZXZpc2lvbiAwCisgICAgICogd2hlcmUgcmVncyB3aXRoIG9mZnNldCBiZWxvdyA4IGNhbid0IGJlIHJlYWQgYWZ0ZXIgYW4gYWNjZXNzCisgICAgICogdG8gdGhlIE1BQyByZWdpc3RlcnMgKi8KKyAgICBTZWxlY3RQYWdlKDApOworfQorCisvKioqKioqKioqKioqKioqKgorICogSW5pdGlhbGl6ZSB0aGUgTWVkaWEtSW5kZXBlbmRlbnQtSW50ZXJmYWNlCisgKiBSZXR1cm5zOiBUcnVlIGlmIHdlIGhhdmUgYSBnb29kIE1JSQorICovCitzdGF0aWMgaW50Citpbml0X21paShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGxvY2FsX2luZm9fdCAqbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdW5zaWduZWQgY29udHJvbCwgc3RhdHVzLCBsaW5rcGFydG5lcjsKKyAgICBpbnQgaTsKKworICAgIGlmIChpZl9wb3J0ID09IDQgfHwgaWZfcG9ydCA9PSAxKSB7IC8qIGZvcmNlIDEwMEJhc2VUIG9yIDEwQmFzZVQgKi8KKwlkZXYtPmlmX3BvcnQgPSBpZl9wb3J0OworCWxvY2FsLT5wcm9iZV9wb3J0ID0gMDsKKwlyZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBtaWlfcmQoaW9hZGRyLCAgMCwgMSk7CisgICAgaWYgKChzdGF0dXMgJiAweGZmMDApICE9IDB4NzgwMCkKKwlyZXR1cm4gMDsgLyogTm8gTUlJICovCisKKyAgICBsb2NhbC0+bmV3X21paSA9IChtaWlfcmQoaW9hZGRyLCAwLCAyKSAhPSAweGZmZmYpOworICAgIAorICAgIGlmIChsb2NhbC0+cHJvYmVfcG9ydCkKKwljb250cm9sID0gMHgxMDAwOyAvKiBhdXRvIG5lZyAqLworICAgIGVsc2UgaWYgKGRldi0+aWZfcG9ydCA9PSA0KQorCWNvbnRyb2wgPSAweDIwMDA7IC8qIG5vIGF1dG8gbmVnLCAxMDBtYnMgbW9kZSAqLworICAgIGVsc2UKKwljb250cm9sID0gMHgwMDAwOyAvKiBubyBhdXRvIG5lZywgMTBtYnMgbW9kZSAqLworICAgIG1paV93cihpb2FkZHIsICAwLCAwLCBjb250cm9sLCAxNik7CisgICAgdWRlbGF5KDEwMCk7CisgICAgY29udHJvbCA9IG1paV9yZChpb2FkZHIsIDAsIDApOworCisgICAgaWYgKGNvbnRyb2wgJiAweDA0MDApIHsKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIGNhbid0IHRha2UgUEhZIG91dCBvZiBpc29sYXRpb24gbW9kZVxuIiwKKwkgICAgICAgZGV2LT5uYW1lKTsKKwlsb2NhbC0+cHJvYmVfcG9ydCA9IDA7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGxvY2FsLT5wcm9iZV9wb3J0KSB7CisJLyogYWNjb3JkaW5nIHRvIHRoZSBEUDgzODQwQSBzcGVjcyB0aGUgYXV0byBuZWdvdGlhdGlvbiBwcm9jZXNzCisJICogbWF5IHRha2UgdXAgdG8gMy41IHNlYywgc28gd2UgdXNlIHRoaXMgYWxzbyBmb3Igb3VyIE1MNjY5MgorCSAqIEZpeG1lOiBCZXR0ZXIgdG8gdXNlIGEgdGltZXIgaGVyZSEKKwkgKi8KKwlmb3IgKGk9MDsgaSA8IDM1OyBpKyspIHsKKwkgICAgbXNsZWVwKDEwMCk7CSAvKiB3YWl0IDEwMCBtc2VjICovCisJICAgIHN0YXR1cyA9IG1paV9yZChpb2FkZHIsICAwLCAxKTsKKwkgICAgaWYgKChzdGF0dXMgJiAweDAwMjApICYmIChzdGF0dXMgJiAweDAwMDQpKQorCQlicmVhazsKKwl9CisKKwlpZiAoIShzdGF0dXMgJiAweDAwMjApKSB7CisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBhdXRvbmVnb3RpYXRpb24gZmFpbGVkOyIKKwkJICAgIiB1c2luZyAxMG1ic1xuIiwgZGV2LT5uYW1lKTsKKwkgICAgaWYgKCFsb2NhbC0+bmV3X21paSkgeworCQljb250cm9sID0gMHgwMDAwOworCQltaWlfd3IoaW9hZGRyLCAgMCwgMCwgY29udHJvbCwgMTYpOworCQl1ZGVsYXkoMTAwKTsKKwkJU2VsZWN0UGFnZSgwKTsKKwkJZGV2LT5pZl9wb3J0ID0gKEdldEJ5dGUoWElSQ1JFR19FU1IpICYgTWVkaWFTZWxlY3QpID8gMSA6IDI7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBsaW5rcGFydG5lciA9IG1paV9yZChpb2FkZHIsIDAsIDUpOworCSAgICBwcmludGsoS0VSTl9JTkZPICIlczogTUlJIGxpbmsgcGFydG5lcjogJTA0eFxuIiwKKwkJICAgZGV2LT5uYW1lLCBsaW5rcGFydG5lcik7CisJICAgIGlmIChsaW5rcGFydG5lciAmIDB4MDA4MCkgeworCQlkZXYtPmlmX3BvcnQgPSA0OworCSAgICB9IGVsc2UKKwkJZGV2LT5pZl9wb3J0ID0gMTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCitkb19wb3dlcmRvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBERUJVRygwLCAiZG9fcG93ZXJkb3duKCVwKVxuIiwgZGV2KTsKKworICAgIFNlbGVjdFBhZ2UoNCk7CisgICAgUHV0Qnl0ZShYSVJDUkVHNF9HUFIxLCAwKTsJICAgICAvKiBjbGVhciBiaXQgMDogcG93ZXIgZG93biAqLworICAgIFNlbGVjdFBhZ2UoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2RvX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBraW9fYWRkcl90IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIGxvY2FsX2luZm9fdCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGRldl9saW5rX3QgKmxpbmsgPSAmbHAtPmxpbms7CisKKyAgICBERUJVRygwLCAiZG9fc3RvcCglcClcbiIsIGRldik7CisKKyAgICBpZiAoIWxpbmspCisJcmV0dXJuIC1FTk9ERVY7CisKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgICBTZWxlY3RQYWdlKDApOworICAgIFB1dEJ5dGUoWElSQ1JFR19DUiwgMCk7ICAvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKyAgICBTZWxlY3RQYWdlKDB4MDEpOworICAgIFB1dEJ5dGUoWElSQ1JFRzFfSU1SMCwgMHgwMCk7IC8qIGZvcmJpZCBhbGwgaW50cyAqLworICAgIFNlbGVjdFBhZ2UoNCk7CisgICAgUHV0Qnl0ZShYSVJDUkVHNF9HUFIxLCAwKTsJLyogY2xlYXIgYml0IDA6IHBvd2VyIGRvd24gKi8KKyAgICBTZWxlY3RQYWdlKDApOworCisgICAgbGluay0+b3Blbi0tOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgeGlyYzJwc19jc19kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICJ4aXJjMnBzX2NzIiwKKwl9LAorCS5hdHRhY2gJCT0geGlyYzJwc19hdHRhY2gsCisJLmRldGFjaAkJPSB4aXJjMnBzX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0Citpbml0X3hpcmMycHNfY3Modm9pZCkKK3sKKwlyZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmeGlyYzJwc19jc19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2V4aXRfeGlyYzJwc19jcyh2b2lkKQoreworCXBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmeGlyYzJwc19jc19kcml2ZXIpOworCUJVR19PTihkZXZfbGlzdCAhPSBOVUxMKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF94aXJjMnBzX2NzKTsKK21vZHVsZV9leGl0KGV4aXRfeGlyYzJwc19jcyk7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF94aXJjMnBzX2NzKGNoYXIgKnN0cikKK3sKKwkvKiBpZl9wb3J0LCBmdWxsX2R1cGxleCwgZG9fc291bmQsIGxvY2t1cF9oYWNrCisJICovCisJaW50IGludHNbMTBdID0geyAtMSB9OworCisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCA5LCBpbnRzKTsKKworI2RlZmluZSBNQVlCRV9TRVQoWCxZKSBpZiAoaW50c1swXSA+PSBZICYmIGludHNbWV0gIT0gLTEpIHsgWCA9IGludHNbWV07IH0KKwlNQVlCRV9TRVQoaWZfcG9ydCwgMyk7CisJTUFZQkVfU0VUKGZ1bGxfZHVwbGV4LCA0KTsKKwlNQVlCRV9TRVQoZG9fc291bmQsIDUpOworCU1BWUJFX1NFVChsb2NrdXBfaGFjaywgNik7CisjdW5kZWYgIE1BWUJFX1NFVAorCisJcmV0dXJuIDA7Cit9CisKK19fc2V0dXAoInhpcmMycHNfY3M9Iiwgc2V0dXBfeGlyYzJwc19jcyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbmV0MzIuYyBiL2RyaXZlcnMvbmV0L3BjbmV0MzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzk0N2U2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcGNuZXQzMi5jCkBAIC0wLDAgKzEsMjM1OCBAQAorLyogcGNuZXQzMi5jOiBBbiBBTUQgUENuZXQzMiBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4LiAqLworLyoKKyAqCUNvcHlyaWdodCAxOTk2LTE5OTkgVGhvbWFzIEJvZ2VuZG9lcmZlcgorICoKKyAqCURlcml2ZWQgZnJvbSB0aGUgbGFuY2UgZHJpdmVyIHdyaXR0ZW4gMTk5MywxOTk0LDE5OTUgYnkgRG9uYWxkIEJlY2tlci4KKyAqCisgKglDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgKglEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LgorICoKKyAqCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICoJVGhpcyBkcml2ZXIgaXMgZm9yIFBDbmV0MzIgYW5kIFBDbmV0UENJIGJhc2VkIGV0aGVyY2FyZHMKKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgMjMgT2N0LCAyMDAwLgorICogIEZpeGVkIGEgZmV3IGJ1Z3MsIHJlbGF0ZWQgdG8gcnVubmluZyB0aGUgY29udHJvbGxlciBpbiAzMmJpdCBtb2RlLgorICoKKyAqICBDYXJzdGVuIExhbmdnYWFyZCwgY2Fyc3RlbmxAbWlwcy5jb20KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRFJWX05BTUUJInBjbmV0MzIiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjMwaSIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIjA2LjI4LjIwMDQiCisjZGVmaW5lIFBGWAkJRFJWX05BTUUgIjogIgorCitzdGF0aWMgY29uc3QgY2hhciAqdmVyc2lvbiA9CitEUlZfTkFNRSAiLmM6diIgRFJWX1ZFUlNJT04gIiAiIERSVl9SRUxEQVRFICIgdHNib2dlbmRAYWxwaGEuZnJhbmtlbi5kZVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisvKgorICogUENJIGRldmljZSBpZGVudGlmaWVycyBmb3IgIm5ldyBzdHlsZSIgTGludXggUENJIERldmljZSBEcml2ZXJzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY25ldDMyX3BjaV90YmxbXSA9IHsKKyAgICB7IFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF9MQU5DRV9IT01FLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisgICAgeyBQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfTEFOQ0UsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKyAgICAvKgorICAgICAqIEFkYXB0ZXJzIHRoYXQgd2VyZSBzb2xkIHdpdGggSUJNJ3MgUlMvNjAwMCBvciBwU2VyaWVzIGhhcmR3YXJlIGhhdmUKKyAgICAgKiB0aGUgaW5jb3JyZWN0IHZlbmRvciBpZC4KKyAgICAgKi8KKyAgICB7IFBDSV9WRU5ET1JfSURfVFJJREVOVCwgUENJX0RFVklDRV9JRF9BTURfTEFOQ0UsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJICAgIFBDSV9DTEFTU19ORVRXT1JLX0VUSEVSTkVUIDw8IDgsIDB4ZmZmZjAwLCAwIH0sCisgICAgeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFIChwY2ksIHBjbmV0MzJfcGNpX3RibCk7CisKK3N0YXRpYyBpbnQgY2FyZHNfZm91bmQ7CisKKy8qCisgKiBWTEIgSS9PIGFkZHJlc3NlcworICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBjbmV0MzJfcG9ydGxpc3RbXSBfX2luaXRkYXRhID0KKwl7IDB4MzAwLCAweDMyMCwgMHgzNDAsIDB4MzYwLCAwIH07CisKKworCitzdGF0aWMgaW50IHBjbmV0MzJfZGVidWcgPSAwOworc3RhdGljIGludCB0eF9zdGFydCA9IDE7IC8qIE1hcHBpbmcgLS0gMDoyMCwgMTo2NCwgMjoxMjgsIDM6fjIyMCAoZGVwZW5kcyBvbiBjaGlwIHZlcnMpICovCitzdGF0aWMgaW50IHBjbmV0MzJ2bGI7CSAvKiBjaGVjayBmb3IgVkxCIGNhcmRzID8gKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpwY25ldDMyX2RldjsKKworc3RhdGljIGludCBtYXhfaW50ZXJydXB0X3dvcmsgPSAyOworc3RhdGljIGludCByeF9jb3B5YnJlYWsgPSAyMDA7CisKKyNkZWZpbmUgUENORVQzMl9QT1JUX0FVSSAgICAgIDB4MDAKKyNkZWZpbmUgUENORVQzMl9QT1JUXzEwQlQgICAgIDB4MDEKKyNkZWZpbmUgUENORVQzMl9QT1JUX0dQU0kgICAgIDB4MDIKKyNkZWZpbmUgUENORVQzMl9QT1JUX01JSSAgICAgIDB4MDMKKworI2RlZmluZSBQQ05FVDMyX1BPUlRfUE9SVFNFTCAgMHgwMworI2RlZmluZSBQQ05FVDMyX1BPUlRfQVNFTCAgICAgMHgwNAorI2RlZmluZSBQQ05FVDMyX1BPUlRfMTAwICAgICAgMHg0MAorI2RlZmluZSBQQ05FVDMyX1BPUlRfRkQJICAgICAgMHg4MAorCisjZGVmaW5lIFBDTkVUMzJfRE1BX01BU0sgMHhmZmZmZmZmZgorCisjZGVmaW5lIFBDTkVUMzJfV0FUQ0hET0dfVElNRU9VVCAoamlmZmllcyArICgyICogSFopKQorI2RlZmluZSBQQ05FVDMyX0JMSU5LX1RJTUVPVVQJKGppZmZpZXMgKyAoSFovNCkpCisKKy8qCisgKiB0YWJsZSB0byB0cmFuc2xhdGUgb3B0aW9uIHZhbHVlcyBmcm9tIHR1bGlwCisgKiB0byBpbnRlcm5hbCBvcHRpb25zCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG9wdGlvbnNfbWFwcGluZ1tdID0geworICAgIFBDTkVUMzJfUE9SVF9BU0VMLAkJCSAgIC8qICAwIEF1dG8tc2VsZWN0CSAgKi8KKyAgICBQQ05FVDMyX1BPUlRfQVVJLAkJCSAgIC8qICAxIEJOQy9BVUkJICAqLworICAgIFBDTkVUMzJfUE9SVF9BVUksCQkJICAgLyogIDIgQVVJL0JOQwkgICovCisgICAgUENORVQzMl9QT1JUX0FTRUwsCQkJICAgLyogIDMgbm90IHN1cHBvcnRlZAkgICovCisgICAgUENORVQzMl9QT1JUXzEwQlQgfCBQQ05FVDMyX1BPUlRfRkQsICAgLyogIDQgMTBiYXNlVC1GRAkgICovCisgICAgUENORVQzMl9QT1JUX0FTRUwsCQkJICAgLyogIDUgbm90IHN1cHBvcnRlZAkgICovCisgICAgUENORVQzMl9QT1JUX0FTRUwsCQkJICAgLyogIDYgbm90IHN1cHBvcnRlZAkgICovCisgICAgUENORVQzMl9QT1JUX0FTRUwsCQkJICAgLyogIDcgbm90IHN1cHBvcnRlZAkgICovCisgICAgUENORVQzMl9QT1JUX0FTRUwsCQkJICAgLyogIDggbm90IHN1cHBvcnRlZAkgICovCisgICAgUENORVQzMl9QT1JUX01JSSwJCQkgICAvKiAgOSBNSUkgMTBiYXNlVAkgICovCisgICAgUENORVQzMl9QT1JUX01JSSB8IFBDTkVUMzJfUE9SVF9GRCwJICAgLyogMTAgTUlJIDEwYmFzZVQtRkQJICAqLworICAgIFBDTkVUMzJfUE9SVF9NSUksCQkJICAgLyogMTEgTUlJIChhdXRvc2VsKQkgICovCisgICAgUENORVQzMl9QT1JUXzEwQlQsCQkJICAgLyogMTIgMTBCYXNlVAkgICovCisgICAgUENORVQzMl9QT1JUX01JSSB8IFBDTkVUMzJfUE9SVF8xMDAsICAgLyogMTMgTUlJIDEwMEJhc2VUeAkgICovCisgICAgUENORVQzMl9QT1JUX01JSSB8IFBDTkVUMzJfUE9SVF8xMDAgfCBQQ05FVDMyX1BPUlRfRkQsIC8qIDE0IE1JSSAxMDBCYXNlVHgtRkQgKi8KKyAgICBQQ05FVDMyX1BPUlRfQVNFTAkJCSAgIC8qIDE1IG5vdCBzdXBwb3J0ZWQJICAqLworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgcGNuZXQzMl9nc3RyaW5nc190ZXN0W11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKKyAgICAiTG9vcGJhY2sgdGVzdCAgKG9mZmxpbmUpIgorfTsKKyNkZWZpbmUgUENORVQzMl9URVNUX0xFTiAoc2l6ZW9mKHBjbmV0MzJfZ3N0cmluZ3NfdGVzdCkgLyBFVEhfR1NUUklOR19MRU4pCisKKyNkZWZpbmUgUENORVQzMl9OVU1fUkVHUyAxNjgKKworI2RlZmluZSBNQVhfVU5JVFMgOAkvKiBNb3JlIGFyZSBzdXBwb3J0ZWQsIGxpbWl0IG9ubHkgb24gb3B0aW9ucyAqLworc3RhdGljIGludCBvcHRpb25zW01BWF9VTklUU107CitzdGF0aWMgaW50IGZ1bGxfZHVwbGV4W01BWF9VTklUU107CitzdGF0aWMgaW50IGhvbWVwbmFbTUFYX1VOSVRTXTsKKworLyoKKyAqCQkJCVRoZW9yeSBvZiBPcGVyYXRpb24KKyAqCisgKiBUaGlzIGRyaXZlciB1c2VzIHRoZSBzYW1lIHNvZnR3YXJlIHN0cnVjdHVyZSBhcyB0aGUgbm9ybWFsIGxhbmNlCisgKiBkcml2ZXIuIFNvIGxvb2sgZm9yIGEgdmVyYm9zZSBkZXNjcmlwdGlvbiBpbiBsYW5jZS5jLiBUaGUgZGlmZmVyZW5jZXMKKyAqIHRvIHRoZSBub3JtYWwgbGFuY2UgZHJpdmVyIGlzIHRoZSB1c2Ugb2YgdGhlIDMyYml0IG1vZGUgb2YgUENuZXQzMgorICogYW5kIFBDbmV0UENJIGNoaXBzLiBCZWNhdXNlIHRoZXNlIGNoaXBzIGFyZSAzMmJpdCBjaGlwcywgdGhlcmUgaXMgbm8KKyAqIDE2TUIgbGltaXRhdGlvbiBhbmQgd2UgZG9uJ3QgbmVlZCBib3VuY2UgYnVmZmVycy4KKyAqLworCisvKgorICogSGlzdG9yeToKKyAqIHYwLjAxOiAgSW5pdGlhbCB2ZXJzaW9uCisgKgkgICBvbmx5IHRlc3RlZCBvbiBBbHBoYSBOb25hbWUgQm9hcmQKKyAqIHYwLjAyOiAgY2hhbmdlZCBJUlEgaGFuZGxpbmcgZm9yIG5ldyBpbnRlcnJ1cHQgc2NoZW1lIChkZXZfaWQpCisgKgkgICB0ZXN0ZWQgb24gYSBBU1VTIFNQM0cKKyAqIHYwLjEwOiAgZml4ZWQgYW4gb2RkIHByb2JsZW0gd2l0aCB0aGUgNzlDOTc0IGluIGEgQ29tcGFxIERlc2twcm8gWEwKKyAqCSAgIGxvb2tzIGxpa2UgdGhlIDk3NCBkb2Vzbid0IGxpa2Ugc3RvcHBpbmcgYW5kIHJlc3RhcnRpbmcgaW4gYQorICoJICAgc2hvcnQgcGVyaW9kIG9mIHRpbWU7IG5vdyB3ZSBkbyBhIHJlaW5pdCBvZiB0aGUgbGFuY2U7IHRoZQorICoJICAgYnVnIHdhcyB0cmlnZ2VyZWQgYnkgZG9pbmcgaWZjb25maWcgZXRoMCA8aXA+IGJyb2FkY2FzdCA8YWRkcj4KKyAqCSAgIGFuZCBoYW5ncyB0aGUgbWFjaGluZSAodGhhbmtzIHRvIEtsYXVzIExpZWRsIGZvciBkZWJ1Z2dpbmcpCisgKiB2MC4xMjogIGJ5IHN1Z2dlc3Rpb24gZnJvbSBEb25hbGQgQmVja2VyOiBSZW5hbWVkIGRyaXZlciB0byBwY25ldDMyLAorICoJICAgbWFkZSBpdCBzdGFuZGFsb25lIChubyBuZWVkIGZvciBsYW5jZS5jKQorICogdjAuMTM6ICBhZGRlZCBhZGRpdGlvbmFsIFBDSSBkZXRlY3RpbmcgZm9yIHNwZWNpYWwgUENJIGRldmljZXMgKENvbXBhcSkKKyAqIHYwLjE0OiAgc3RyaXBwZWQgZG93biBhZGRpdGlvbmFsIFBDSSBwcm9iZSAodGhhbmtzIHRvIERhdmlkIEMgTmllbWkKKyAqCSAgIGFuZCBzdmVuZXJpY0B4czRhbGwubmwgZm9yIHRlc3RpbmcgdGhpcyBvbiB0aGVpciBDb21wYXEgYm94ZXMpCisgKiB2MC4xNTogIGFkZGVkIDc5Qzk2NSAoVkxCKSBwcm9iZQorICoJICAgYWRkZWQgaW50ZXJydXB0IHNoYXJpbmcgZm9yIFBDSSBjaGlwcworICogdjAuMTY6ICBmaXhlZCBzZXRfbXVsdGljYXN0X2xpc3Qgb24gQWxwaGEgbWFjaGluZXMKKyAqIHYwLjE3OiAgcmVtb3ZlZCBoYWNrIGZyb20gZGV2LmM7IG5vdyBwY25ldDMyIHVzZXMgZXRoaWZfcHJvYmUgaW4gU3BhY2UuYworICogdjAuMTk6ICBjaGFuZ2VkIHNldHRpbmcgb2YgYXV0b3NlbGVjdCBiaXQKKyAqIHYwLjIwOiAgcmVtb3ZlZCBhZGRpdGlvbmFsIENvbXBhcSBQQ0kgcHJvYmU7IHRoZXJlIGlzIG5vdyBhIHdvcmtpbmcgb25lCisgKgkgICBpbiBhcmNoL2kzODYvYmlvczMyLmMKKyAqIHYwLjIxOiAgYWRkZWQgZW5kaWFuIGNvbnZlcnNpb24gZm9yIHBwYywgZnJvbSB3b3JrIGJ5IGNvcnRAY3Mubm10LmVkdQorICogdjAuMjI6ICBhZGRlZCBwcmludGluZyBvZiBzdGF0dXMgdG8gcmluZyBkdW1wCisgKiB2MC4yMzogIGNoYW5nZWQgZW5ldF9zdGF0aXN0aWNzIHRvIG5ldF9kZXZpdmVfc3RhdHMKKyAqIHYwLjkwOiAgYWRkZWQgbXVsdGljYXN0IGZpbHRlcgorICoJICAgYWRkZWQgbW9kdWxlIHN1cHBvcnQKKyAqCSAgIGNoYW5nZWQgaXJxIHByb2JlIHRvIG5ldyBzdHlsZQorICoJICAgYWRkZWQgUENuZXRGYXN0IGNoaXAgaWQKKyAqCSAgIGFkZGVkIGZpeCBmb3IgcmVjZWl2ZSBzdGFsbHMgd2l0aCBJbnRlbCBzYXR1cm4gY2hpcHNldHMKKyAqCSAgIGFkZGVkIGluLXBsYWNlIHJ4IHNrYnMgbGlrZSBpbiB0aGUgdHVsaXAgZHJpdmVyCisgKgkgICBtaW5vciBjbGVhbnVwcworICogdjAuOTE6ICBhZGRlZCBQQ25ldEZhc3QrIGNoaXAgaWQKKyAqCSAgIGJhY2sgcG9ydCB0byAyLjAueAorICogdjEuMDA6ICBhZGRlZCBzb21lIHN0dWZmIGZyb20gRG9uYWxkIEJlY2tlcidzIDIuMC4zNCB2ZXJzaW9uCisgKgkgICBhZGRlZCBzdXBwb3J0IGZvciBieXRlIGNvdW50ZXJzIGluIG5ldF9kZXZfc3RhdHMKKyAqIHYxLjAxOiAgZG8gcmluZyBkdW1wcywgb25seSB3aGVuIGRlYnVnZ2luZyB0aGUgZHJpdmVyCisgKgkgICBpbmNyZWFzZWQgdGhlIHRyYW5zbWl0IHRpbWVvdXQKKyAqIHYxLjAyOiAgZml4ZWQgbWVtb3J5IGxlYWsgaW4gcGNuZXQzMl9pbml0X3JpbmcoKQorICogdjEuMTA6ICB3b3JrYXJvdW5kIGZvciBzdG9wcGVkIHRyYW5zbWl0dGVyCisgKgkgICBhZGRlZCBwb3J0IHNlbGVjdGlvbiBmb3IgbW9kdWxlcworICoJICAgZGV0ZWN0IHNwZWNpYWwgVDEvRTEgV0FOIGNhcmQgYW5kIHNldHVwIHBvcnQgc2VsZWN0aW9uCisgKiB2MS4xMTogIGZpeGVkIHdyb25nIGNoZWNraW5nIG9mIFR4IGVycm9ycworICogdjEuMjA6ICBhZGRlZCBjaGVjayBvZiByZXR1cm4gdmFsdWUga21hbGxvYyAoY3BldGVyc29AY3Mud2FzaGluZ3Rvbi5lZHUpCisgKgkgICBhZGRlZCBzYXZlIG9yaWdpbmFsIGttYWxsb2MgYWRkciBmb3IgZnJlZWluZyAobWNyQHNvbGlkdW0uY29tKQorICoJICAgYWRkZWQgc3VwcG9ydCBmb3IgUENuZXRIb21lIGNoaXAgKGpvZUBNSVQuRURVKQorICoJICAgcmV3cml0dGVuIFBDSSBjYXJkIGRldGVjdGlvbgorICoJICAgYWRkZWQgZHdpbyBtb2RlIHRvIGdldCBkcml2ZXIgd29ya2luZyBvbiBzb21lIFBQQyBtYWNoaW5lcworICogdjEuMjE6ICBhZGRlZCBtaWkgc2VsZWN0aW9uIGFuZCBtaWkgaW9jdGwKKyAqIHYxLjIyOiAgY2hhbmdlZCBwY2kgc2Nhbm5pbmcgY29kZSB0byBtYWtlIFBQQyBwZW9wbGUgaGFwcHkKKyAqCSAgIGZpeGVkIHN3aXRjaGluZyB0byAzMmJpdCBtb2RlIGluIHBjbmV0MzJfb3BlbigpICh0aGFua3MKKyAqCSAgIHRvIE1pY2hhZWwgUmljaGFyZCA8bWNyQHNvbGlkdW0uY29tPiBmb3Igbm90aWNpbmcgdGhpcyBvbmUpCisgKgkgICBhZGRlZCBzdWIgdmVuZG9yL2RldmljZSBpZCBtYXRjaGluZyAodGhhbmtzIGFnYWluIHRvCisgKgkgICBNaWNoYWVsIFJpY2hhcmQgPG1jckBzb2xpZHVtLmNvbT4pCisgKgkgICBhZGRlZCBjaGlwIGlkIGZvciA3OWM5NzMvOTc1ICh0aGFua3MgdG8gWmFjaCBCcm93biA8emFiQHphYmJvLm5ldD4pCisgKiB2MS4yMyAgIGZpeGVkIHNtYWxsIGJ1Zywgd2hlbiBtYW51YWwgc2VsZWN0aW5nIE1JSSBzcGVlZC9kdXBsZXgKKyAqIHYxLjI0ICAgQXBwbGllZCBUaG9tYXMnIHBhdGNoIHRvIHVzZSBUeFN0YXJ0UG9pbnQgYW5kIHRodXMgZGVjcmVhc2UgVHhGSUZPCisgKgkgICB1bmRlcmZsb3dzLglBZGRlZCB0eF9zdGFydF9wdCBtb2R1bGUgcGFyYW1ldGVyLiBJbmNyZWFzZWQKKyAqCSAgIFRYX1JJTkdfU0laRSBmcm9tIDE2IHRvIDMyLglBZGRlZCAjaWZkZWYnZCBjb2RlIHRvIHVzZSBEWFNVRkxPCisgKgkgICBmb3IgRkFTVFsrXSBjaGlwc2V0cy4gPGthZkBmYy5ocC5jb20+CisgKiB2MS4yNGFjIEFkZGVkIFNNUCBzcGlubG9ja2luZyAtIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKiB2MS4yNWtmIEFkZGVkIE5vIEludGVycnVwdCBvbiBzdWNjZXNzZnVsIFR4IGZvciBzb21lIFR4J3MgPGthZkBmYy5ocC5jb20+CisgKiB2MS4yNiAgIENvbnZlcnRlZCB0byBwY2lfYWxsb2NfY29uc2lzdGVudCwgSmFtZXkgSGlja3MgLyBHZW9yZ2UgRnJhbmNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amFtZXlAY3JsLmRlYy5jb20+CisgKiAtCSAgIEZpeGVkIGEgZmV3IGJ1Z3MsIHJlbGF0ZWQgdG8gcnVubmluZyB0aGUgY29udHJvbGxlciBpbiAzMmJpdCBtb2RlLgorICoJICAgMjMgT2N0LCAyMDAwLiAgQ2Fyc3RlbiBMYW5nZ2FhcmQsIGNhcnN0ZW5sQG1pcHMuY29tCisgKgkgICBDb3B5cmlnaHQgKEMpIDIwMDAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiB2MS4yNnAgIEZpeCBvb3BzIG9uIHJtbW9kK2luc21vZDsgcGx1ZyBpL28gcmVzb3VyY2UgbGVhayAtIFBhdWwgR29ydG1ha2VyCisgKiB2MS4yNyAgIGltcHJvdmVkIENTUi9QUk9NIGFkZHJlc3MgZGV0ZWN0aW9uLCBsb3RzIG9mIGNsZWFudXBzLAorICogCSAgIG5ldyBwY25ldDMydmxiIG1vZHVsZSBvcHRpb24sIEhQLVBBUklTQyBzdXBwb3J0LAorICogCSAgIGFkZGVkIG1vZHVsZSBwYXJhbWV0ZXIgZGVzY3JpcHRpb25zLAorICogCSAgIGluaXRpYWwgZXRodG9vbCBzdXBwb3J0IC0gSGVsZ2UgRGVsbGVyIDxkZWxsZXJAZ214LmRlPgorICogdjEuMjdhICBTdW4gRmViIDEwIDIwMDIgR28gVGFuaWd1Y2hpIDxnb0B0dXJib2xpbnV4LmNvLmpwPgorICoJICAgdXNlIGFsbG9jX2V0aGVyZGV2IGFuZCByZWdpc3Rlcl9uZXRkZXYKKyAqCSAgIGZpeCBwY2kgcHJvYmUgbm90IGluY3JlbWVudCBjYXJkc19mb3VuZAorICoJICAgRkQgYXV0byBuZWdvdGlhdGUgZXJyb3Igd29ya2Fyb3VuZCBmb3IgeFNlcmllczI1MAorICoJICAgY2xlYW4gdXAgYW5kIHVzaW5nIG5ldyBtaWkgbW9kdWxlCisgKiB2MS4yN2IgIFNlcCAzMCAyMDAyIEtlbnQgWW9kZXIgPHlvZGVyMUB1cy5pYm0uY29tPgorICogCSAgIEFkZGVkIHRpbWVyIGZvciBjYWJsZSBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZXMuCisgKiB2MS4yOCAgIDIwIEZlYiAyMDA0IERvbiBGcnkgPGJyYXppbG51dEB1cy5pYm0uY29tPgorICoJICAgSm9uIE1hc29uIDxqb25tYXNvbkB1cy5pYm0uY29tPiwgQ2hpbm1heSBBbGJhbCA8YWxiYWxAaW4uaWJtLmNvbT4KKyAqCSAgIE5vdyB1c2VzIGV0aHRvb2xfb3BzLCBuZXRpZl9tc2dfKiBhbmQgZ2VuZXJpY19taWlfaW9jdGwuCisgKgkgICBGaXhlcyBib2d1cyAnQnVzIG1hc3RlciBhcmJpdHJhdGlvbiBmYWlsdXJlJywgcGNpX1t1bl1tYXBfc2luZ2xlCisgKgkgICBsZW5ndGggZXJyb3JzLCBhbmQgdHJhbnNtaXQgaGFuZ3MuICBDbGVhbnMgdXAgYWZ0ZXIgZXJyb3JzIGluIG9wZW4uCisgKgkgICBKaW0gTGV3aXMgPGprbGV3aXNAdXMuaWJtLmNvbT4gYWRkZWQgZXRoZXJuZXQgbG9vcGJhY2sgdGVzdC4KKyAqCSAgIFRob21hcyBNdW5jayBTdGVlbmhvbGR0IDx0bXVzQHRtdXMuZGs+IG5vbi1taWkgaW9jdGwgY29ycmVjdGlvbnMuCisgKiB2MS4yOSAgIDYgQXByIDIwMDQgSmltIExld2lzIDxqa2xld2lzQHVzLmlibS5jb20+IGFkZGVkIHBoeXNpY2FsCisgKgkgICBpZGVudGlmaWNhdGlvbiBjb2RlIChibGluayBsZWQncykgYW5kIHJlZ2lzdGVyIGR1bXAuCisgKgkgICBEb24gRnJ5IGFkZGVkIHRpbWVyIGZvciA5NzEvOTcyIHNvIHNrYnVmcyBkb24ndCByZW1haW4gb24gdHggcmluZworICoJICAgZm9yZXZlci4KKyAqIHYxLjMwICAgMTggTWF5IDIwMDQgRG9uIEZyeSByZW1vdmVkIHRpbWVyIGFuZCBMYXN0IFRyYW5zbWl0IEludGVycnVwdAorICoJICAgKGx0aW50KSBhcyB0aGV5IGFkZGVkIGNvbXBsZXhpdHkgYW5kIGRpZG4ndCBnaXZlIGdvb2QgdGhyb3VnaHB1dC4KKyAqIHYxLjMwYSAgMjIgTWF5IDIwMDQgRG9uIEZyeSBsaW1pdCBmcmFtZXMgcmVjZWl2ZWQgZHVyaW5nIGludGVycnVwdC4KKyAqIHYxLjMwYiAgMjQgTWF5IDIwMDQgRG9uIEZyeSBmaXggYm9ndXMgdHggY2FycmllciBlcnJvcnMgd2l0aCA3OWM5NzMsCisgKgkgICBhc3Npc3RlZCBieSBCcnVjZSBQZW5yb2QgPGJtcGVucm9kQGVuZHJ1bnRlY2hub2xvZ2llcy5jb20+LgorICogdjEuMzBjICAyNSBNYXkgMjAwNCBEb24gRnJ5IGFkZGVkIG5ldGlmX3dha2VfcXVldWUgYWZ0ZXIgcGNuZXQzMl9yZXN0YXJ0LgorICogdjEuMzBkICAwMSBKdW4gMjAwNCBEb24gRnJ5IGRpc2NhcmQgb3ZlcnNpemUgcnggcGFja2V0cy4KKyAqIHYxLjMwZSAgMTEgSnVuIDIwMDQgRG9uIEZyeSByZWNvdmVyIGFmdGVyIGZpZm8gZXJyb3IgYW5kIHJ4IGhhbmcuCisgKiB2MS4zMGYgIDE2IEp1biAyMDA0IERvbiBGcnkgY2xlYW51cCBJUlEgdG8gYWxsb3cgMCBhbmQgMSBmb3IgUENJLAorICogCSAgIGV4cGFuZGluZyBvbiBzdWdnZXN0aW9ucyBmcm9tIFJhbGYgQmFlY2hsZSA8cmFsZkBsaW51eC1taXBzLm9yZz4sCisgKiAJICAgYW5kIEJyaWFuIE11cnBoeSA8YnJpYW5AbXVycGh5LmRrPi4KKyAqIHYxLjMwZyAgMjIgSnVuIDIwMDQgUGF0cmljayBTaW1tb25zIDxwc2ltbW9uc0BmbGFzaC5uZXQ+IGFkZGVkIG9wdGlvbgorICoJICAgaG9tZXBuYSBmb3Igc2VsZWN0aW5nIEhvbWVQTkEgbW9kZSBmb3IgUENOZXQvSG9tZSA3OUM5NzguCisgKiB2MS4zMGggIDI0IEp1biAyMDA0IERvbiBGcnkgY29ycmVjdGx5IHNlbGVjdCBhdXRvLCBzcGVlZCwgZHVwbGV4IGluIGJjcjMyLgorICogdjEuMzBpICAyOCBKdW4gMjAwNCBEb24gRnJ5IGNoYW5nZSB0byB1c2UgbW9kdWxlX3BhcmFtLgorICovCisKKworLyoKKyAqIFNldCB0aGUgbnVtYmVyIG9mIFR4IGFuZCBSeCBidWZmZXJzLCB1c2luZyBMb2dfMigjIGJ1ZmZlcnMpLgorICogUmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlcyBhcmUgNCBUeCBidWZmZXJzLCBhbmQgMTYgUnggYnVmZmVycy4KKyAqIFRoYXQgdHJhbnNsYXRlcyB0byAyICg0ID09IDJeXjIpIGFuZCA0ICgxNiA9PSAyXl40KS4KKyAqLworI2lmbmRlZiBQQ05FVDMyX0xPR19UWF9CVUZGRVJTCisjZGVmaW5lIFBDTkVUMzJfTE9HX1RYX0JVRkZFUlMgNAorI2RlZmluZSBQQ05FVDMyX0xPR19SWF9CVUZGRVJTIDUKKyNlbmRpZgorCisjZGVmaW5lIFRYX1JJTkdfU0laRQkJKDEgPDwgKFBDTkVUMzJfTE9HX1RYX0JVRkZFUlMpKQorI2RlZmluZSBUWF9SSU5HX01PRF9NQVNLCShUWF9SSU5HX1NJWkUgLSAxKQorI2RlZmluZSBUWF9SSU5HX0xFTl9CSVRTCSgoUENORVQzMl9MT0dfVFhfQlVGRkVSUykgPDwgMTIpCisKKyNkZWZpbmUgUlhfUklOR19TSVpFCQkoMSA8PCAoUENORVQzMl9MT0dfUlhfQlVGRkVSUykpCisjZGVmaW5lIFJYX1JJTkdfTU9EX01BU0sJKFJYX1JJTkdfU0laRSAtIDEpCisjZGVmaW5lIFJYX1JJTkdfTEVOX0JJVFMJKChQQ05FVDMyX0xPR19SWF9CVUZGRVJTKSA8PCA0KQorCisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1NDQKKworLyogT2Zmc2V0cyBmcm9tIGJhc2UgSS9PIGFkZHJlc3MuICovCisjZGVmaW5lIFBDTkVUMzJfV0lPX1JEUAkJMHgxMAorI2RlZmluZSBQQ05FVDMyX1dJT19SQVAJCTB4MTIKKyNkZWZpbmUgUENORVQzMl9XSU9fUkVTRVQJMHgxNAorI2RlZmluZSBQQ05FVDMyX1dJT19CRFAJCTB4MTYKKworI2RlZmluZSBQQ05FVDMyX0RXSU9fUkRQCTB4MTAKKyNkZWZpbmUgUENORVQzMl9EV0lPX1JBUAkweDE0CisjZGVmaW5lIFBDTkVUMzJfRFdJT19SRVNFVAkweDE4CisjZGVmaW5lIFBDTkVUMzJfRFdJT19CRFAJMHgxQworCisjZGVmaW5lIFBDTkVUMzJfVE9UQUxfU0laRQkweDIwCisKKy8qIFRoZSBQQ05FVDMyIFJ4IGFuZCBUeCByaW5nIGRlc2NyaXB0b3JzLiAqLworc3RydWN0IHBjbmV0MzJfcnhfaGVhZCB7CisgICAgdTMyIGJhc2U7CisgICAgczE2IGJ1Zl9sZW5ndGg7CisgICAgczE2IHN0YXR1czsKKyAgICB1MzIgbXNnX2xlbmd0aDsKKyAgICB1MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgcGNuZXQzMl90eF9oZWFkIHsKKyAgICB1MzIgYmFzZTsKKyAgICBzMTYgbGVuZ3RoOworICAgIHMxNiBzdGF0dXM7CisgICAgdTMyIG1pc2M7CisgICAgdTMyIHJlc2VydmVkOworfTsKKworLyogVGhlIFBDTkVUMzIgMzItQml0IGluaXRpYWxpemF0aW9uIGJsb2NrLCBkZXNjcmliZWQgaW4gZGF0YWJvb2suICovCitzdHJ1Y3QgcGNuZXQzMl9pbml0X2Jsb2NrIHsKKyAgICB1MTYgbW9kZTsKKyAgICB1MTYgdGxlbl9ybGVuOworICAgIHU4CXBoeXNfYWRkcls2XTsKKyAgICB1MTYgcmVzZXJ2ZWQ7CisgICAgdTMyIGZpbHRlclsyXTsKKyAgICAvKiBSZWNlaXZlIGFuZCB0cmFuc21pdCByaW5nIGJhc2UsIGFsb25nIHdpdGggZXh0cmEgYml0cy4gKi8KKyAgICB1MzIgcnhfcmluZzsKKyAgICB1MzIgdHhfcmluZzsKK307CisKKy8qIFBDbmV0MzIgYWNjZXNzIGZ1bmN0aW9ucyAqLworc3RydWN0IHBjbmV0MzJfYWNjZXNzIHsKKyAgICB1MTYgKCpyZWFkX2NzcikodW5zaWduZWQgbG9uZywgaW50KTsKKyAgICB2b2lkICgqd3JpdGVfY3NyKSh1bnNpZ25lZCBsb25nLCBpbnQsIHUxNik7CisgICAgdTE2ICgqcmVhZF9iY3IpKHVuc2lnbmVkIGxvbmcsIGludCk7CisgICAgdm9pZCAoKndyaXRlX2JjcikodW5zaWduZWQgbG9uZywgaW50LCB1MTYpOworICAgIHUxNiAoKnJlYWRfcmFwKSh1bnNpZ25lZCBsb25nKTsKKyAgICB2b2lkICgqd3JpdGVfcmFwKSh1bnNpZ25lZCBsb25nLCB1MTYpOworICAgIHZvaWQgKCpyZXNldCkodW5zaWduZWQgbG9uZyk7Cit9OworCisvKgorICogVGhlIGZpcnN0IHRocmVlIGZpZWxkcyBvZiBwY25ldDMyX3ByaXZhdGUgYXJlIHJlYWQgYnkgdGhlIGV0aGVybmV0IGRldmljZQorICogc28gd2UgYWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBzaG91bGQgYmUgYWxsb2NhdGVkIGJ5IHBjaV9hbGxvY19jb25zaXN0ZW50KCkuCisgKi8KK3N0cnVjdCBwY25ldDMyX3ByaXZhdGUgeworICAgIC8qIFRoZSBUeCBhbmQgUnggcmluZyBlbnRyaWVzIG11c3QgYmUgYWxpZ25lZCBvbiAxNi1ieXRlIGJvdW5kYXJpZXMgaW4gMzJiaXQgbW9kZS4gKi8KKyAgICBzdHJ1Y3QgcGNuZXQzMl9yeF9oZWFkICAgIHJ4X3JpbmdbUlhfUklOR19TSVpFXTsKKyAgICBzdHJ1Y3QgcGNuZXQzMl90eF9oZWFkICAgIHR4X3JpbmdbVFhfUklOR19TSVpFXTsKKyAgICBzdHJ1Y3QgcGNuZXQzMl9pbml0X2Jsb2NrIGluaXRfYmxvY2s7CisgICAgZG1hX2FkZHJfdAkJZG1hX2FkZHI7CS8qIERNQSBhZGRyZXNzIG9mIGJlZ2lubmluZyBvZiB0aGlzCisJCQkJCSAgIG9iamVjdCwgcmV0dXJuZWQgYnkKKwkJCQkJICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQgKi8KKyAgICBzdHJ1Y3QgcGNpX2RldgkqcGNpX2RldjsJLyogUG9pbnRlciB0byB0aGUgYXNzb2NpYXRlZCBwY2kgZGV2aWNlCisJCQkJCSAgIHN0cnVjdHVyZSAqLworICAgIGNvbnN0IGNoYXIJCSpuYW1lOworICAgIC8qIFRoZSBzYXZlZCBhZGRyZXNzIG9mIGEgc2VudC1pbi1wbGFjZSBwYWNrZXQvYnVmZmVyLCBmb3Igc2tmcmVlKCkuICovCisgICAgc3RydWN0IHNrX2J1ZmYJKnR4X3NrYnVmZltUWF9SSU5HX1NJWkVdOworICAgIHN0cnVjdCBza19idWZmCSpyeF9za2J1ZmZbUlhfUklOR19TSVpFXTsKKyAgICBkbWFfYWRkcl90CQl0eF9kbWFfYWRkcltUWF9SSU5HX1NJWkVdOworICAgIGRtYV9hZGRyX3QJCXJ4X2RtYV9hZGRyW1JYX1JJTkdfU0laRV07CisgICAgc3RydWN0IHBjbmV0MzJfYWNjZXNzCWE7CisgICAgc3BpbmxvY2tfdAkJbG9jazsJCS8qIEd1YXJkIGxvY2sgKi8KKyAgICB1bnNpZ25lZCBpbnQJY3VyX3J4LCBjdXJfdHg7CS8qIFRoZSBuZXh0IGZyZWUgcmluZyBlbnRyeSAqLworICAgIHVuc2lnbmVkIGludAlkaXJ0eV9yeCwgZGlydHlfdHg7IC8qIFRoZSByaW5nIGVudHJpZXMgdG8gYmUgZnJlZSgpZWQuICovCisgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisgICAgY2hhcgkJdHhfZnVsbDsKKyAgICBpbnQJCQlvcHRpb25zOworICAgIHVuc2lnbmVkIGludAlzaGFyZWRfaXJxOjEsCS8qIHNoYXJlZCBpcnEgcG9zc2libGUgKi8KKwkJCWR4c3VmbG86MSwJLyogZGlzYWJsZSB0cmFuc21pdCBzdG9wIG9uIHVmbG8gKi8KKwkJCW1paToxOwkJLyogbWlpIHBvcnQgYXZhaWxhYmxlICovCisgICAgc3RydWN0IG5ldF9kZXZpY2UJKm5leHQ7CisgICAgc3RydWN0IG1paV9pZl9pbmZvCW1paV9pZjsKKyAgICBzdHJ1Y3QgdGltZXJfbGlzdAl3YXRjaGRvZ190aW1lcjsKKyAgICBzdHJ1Y3QgdGltZXJfbGlzdAlibGlua190aW1lcjsKKyAgICB1MzIJCQltc2dfZW5hYmxlOwkvKiBkZWJ1ZyBtZXNzYWdlIGxldmVsICovCit9OworCitzdGF0aWMgdm9pZCBwY25ldDMyX3Byb2JlX3ZsYnVzKHZvaWQpOworc3RhdGljIGludCAgcGNuZXQzMl9wcm9iZV9wY2koc3RydWN0IHBjaV9kZXYgKiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKik7CitzdGF0aWMgaW50ICBwY25ldDMyX3Byb2JlMSh1bnNpZ25lZCBsb25nLCBpbnQsIHN0cnVjdCBwY2lfZGV2ICopOworc3RhdGljIGludCAgcGNuZXQzMl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCAgcGNuZXQzMl9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50ICBwY25ldDMyX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50ICBwY25ldDMyX3J4KHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHZvaWQgcGNuZXQzMl90eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBwY25ldDMyX2ludGVycnVwdChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgaW50ICBwY25ldDMyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwY25ldDMyX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyB2b2lkIHBjbmV0MzJfbG9hZF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBwY25ldDMyX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQgIHBjbmV0MzJfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGlmcmVxICosIGludCk7CitzdGF0aWMgdm9pZCBwY25ldDMyX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IHJlZ19udW0pOworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnX251bSwgaW50IHZhbCk7CitzdGF0aWMgdm9pZCBwY25ldDMyX3Jlc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNzcjBfYml0cyk7CitzdGF0aWMgdm9pZCBwY25ldDMyX2V0aHRvb2xfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXN0cnVjdCBldGh0b29sX3Rlc3QgKmV0aF90ZXN0LCB1NjQgKmRhdGEpOworc3RhdGljIGludCBwY25ldDMyX2xvb3BiYWNrX3Rlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdWludDY0X3QgKmRhdGExKTsKK3N0YXRpYyBpbnQgcGNuZXQzMl9waHlzX2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKTsKK3N0YXRpYyB2b2lkIHBjbmV0MzJfbGVkX2JsaW5rX2NhbGxiYWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBwY25ldDMyX2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHBjbmV0MzJfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywKKwl2b2lkICpwdHIpOworCitlbnVtIHBjaV9mbGFnc19iaXQgeworICAgIFBDSV9VU0VTX0lPPTEsIFBDSV9VU0VTX01FTT0yLCBQQ0lfVVNFU19NQVNURVI9NCwKKyAgICBQQ0lfQUREUjA9MHgxMDw8MCwgUENJX0FERFIxPTB4MTA8PDEsIFBDSV9BRERSMj0weDEwPDwyLCBQQ0lfQUREUjM9MHgxMDw8MywKK307CisKKworc3RhdGljIHUxNiBwY25ldDMyX3dpb19yZWFkX2NzciAodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgpCit7CisgICAgb3V0dyAoaW5kZXgsIGFkZHIrUENORVQzMl9XSU9fUkFQKTsKKyAgICByZXR1cm4gaW53IChhZGRyK1BDTkVUMzJfV0lPX1JEUCk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfd2lvX3dyaXRlX2NzciAodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgsIHUxNiB2YWwpCit7CisgICAgb3V0dyAoaW5kZXgsIGFkZHIrUENORVQzMl9XSU9fUkFQKTsKKyAgICBvdXR3ICh2YWwsIGFkZHIrUENORVQzMl9XSU9fUkRQKTsKK30KKworc3RhdGljIHUxNiBwY25ldDMyX3dpb19yZWFkX2JjciAodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgpCit7CisgICAgb3V0dyAoaW5kZXgsIGFkZHIrUENORVQzMl9XSU9fUkFQKTsKKyAgICByZXR1cm4gaW53IChhZGRyK1BDTkVUMzJfV0lPX0JEUCk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfd2lvX3dyaXRlX2JjciAodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgsIHUxNiB2YWwpCit7CisgICAgb3V0dyAoaW5kZXgsIGFkZHIrUENORVQzMl9XSU9fUkFQKTsKKyAgICBvdXR3ICh2YWwsIGFkZHIrUENORVQzMl9XSU9fQkRQKTsKK30KKworc3RhdGljIHUxNiBwY25ldDMyX3dpb19yZWFkX3JhcCAodW5zaWduZWQgbG9uZyBhZGRyKQoreworICAgIHJldHVybiBpbncgKGFkZHIrUENORVQzMl9XSU9fUkFQKTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl93aW9fd3JpdGVfcmFwICh1bnNpZ25lZCBsb25nIGFkZHIsIHUxNiB2YWwpCit7CisgICAgb3V0dyAodmFsLCBhZGRyK1BDTkVUMzJfV0lPX1JBUCk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfd2lvX3Jlc2V0ICh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisgICAgaW53IChhZGRyK1BDTkVUMzJfV0lPX1JFU0VUKTsKK30KKworc3RhdGljIGludCBwY25ldDMyX3dpb19jaGVjayAodW5zaWduZWQgbG9uZyBhZGRyKQoreworICAgIG91dHcgKDg4LCBhZGRyK1BDTkVUMzJfV0lPX1JBUCk7CisgICAgcmV0dXJuIChpbncgKGFkZHIrUENORVQzMl9XSU9fUkFQKSA9PSA4OCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNuZXQzMl9hY2Nlc3MgcGNuZXQzMl93aW8gPSB7CisgICAgLnJlYWRfY3NyCT0gcGNuZXQzMl93aW9fcmVhZF9jc3IsCisgICAgLndyaXRlX2Nzcgk9IHBjbmV0MzJfd2lvX3dyaXRlX2NzciwKKyAgICAucmVhZF9iY3IJPSBwY25ldDMyX3dpb19yZWFkX2JjciwKKyAgICAud3JpdGVfYmNyCT0gcGNuZXQzMl93aW9fd3JpdGVfYmNyLAorICAgIC5yZWFkX3JhcAk9IHBjbmV0MzJfd2lvX3JlYWRfcmFwLAorICAgIC53cml0ZV9yYXAJPSBwY25ldDMyX3dpb193cml0ZV9yYXAsCisgICAgLnJlc2V0CT0gcGNuZXQzMl93aW9fcmVzZXQKK307CisKK3N0YXRpYyB1MTYgcGNuZXQzMl9kd2lvX3JlYWRfY3NyICh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBpbmRleCkKK3sKKyAgICBvdXRsIChpbmRleCwgYWRkcitQQ05FVDMyX0RXSU9fUkFQKTsKKyAgICByZXR1cm4gKGlubCAoYWRkcitQQ05FVDMyX0RXSU9fUkRQKSAmIDB4ZmZmZik7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfZHdpb193cml0ZV9jc3IgKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGluZGV4LCB1MTYgdmFsKQoreworICAgIG91dGwgKGluZGV4LCBhZGRyK1BDTkVUMzJfRFdJT19SQVApOworICAgIG91dGwgKHZhbCwgYWRkcitQQ05FVDMyX0RXSU9fUkRQKTsKK30KKworc3RhdGljIHUxNiBwY25ldDMyX2R3aW9fcmVhZF9iY3IgKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGluZGV4KQoreworICAgIG91dGwgKGluZGV4LCBhZGRyK1BDTkVUMzJfRFdJT19SQVApOworICAgIHJldHVybiAoaW5sIChhZGRyK1BDTkVUMzJfRFdJT19CRFApICYgMHhmZmZmKTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl9kd2lvX3dyaXRlX2JjciAodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgaW5kZXgsIHUxNiB2YWwpCit7CisgICAgb3V0bCAoaW5kZXgsIGFkZHIrUENORVQzMl9EV0lPX1JBUCk7CisgICAgb3V0bCAodmFsLCBhZGRyK1BDTkVUMzJfRFdJT19CRFApOworfQorCitzdGF0aWMgdTE2IHBjbmV0MzJfZHdpb19yZWFkX3JhcCAodW5zaWduZWQgbG9uZyBhZGRyKQoreworICAgIHJldHVybiAoaW5sIChhZGRyK1BDTkVUMzJfRFdJT19SQVApICYgMHhmZmZmKTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl9kd2lvX3dyaXRlX3JhcCAodW5zaWduZWQgbG9uZyBhZGRyLCB1MTYgdmFsKQoreworICAgIG91dGwgKHZhbCwgYWRkcitQQ05FVDMyX0RXSU9fUkFQKTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl9kd2lvX3Jlc2V0ICh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisgICAgaW5sIChhZGRyK1BDTkVUMzJfRFdJT19SRVNFVCk7Cit9CisKK3N0YXRpYyBpbnQgcGNuZXQzMl9kd2lvX2NoZWNrICh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisgICAgb3V0bCAoODgsIGFkZHIrUENORVQzMl9EV0lPX1JBUCk7CisgICAgcmV0dXJuICgoaW5sIChhZGRyK1BDTkVUMzJfRFdJT19SQVApICYgMHhmZmZmKSA9PSA4OCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNuZXQzMl9hY2Nlc3MgcGNuZXQzMl9kd2lvID0geworICAgIC5yZWFkX2Nzcgk9IHBjbmV0MzJfZHdpb19yZWFkX2NzciwKKyAgICAud3JpdGVfY3NyCT0gcGNuZXQzMl9kd2lvX3dyaXRlX2NzciwKKyAgICAucmVhZF9iY3IJPSBwY25ldDMyX2R3aW9fcmVhZF9iY3IsCisgICAgLndyaXRlX2Jjcgk9IHBjbmV0MzJfZHdpb193cml0ZV9iY3IsCisgICAgLnJlYWRfcmFwCT0gcGNuZXQzMl9kd2lvX3JlYWRfcmFwLAorICAgIC53cml0ZV9yYXAJPSBwY25ldDMyX2R3aW9fd3JpdGVfcmFwLAorICAgIC5yZXNldAk9IHBjbmV0MzJfZHdpb19yZXNldAorfTsKKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBwY25ldDMyX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGRpc2FibGVfaXJxKGRldi0+aXJxKTsKKyAgICBwY25ldDMyX2ludGVycnVwdCgwLCBkZXYsIE5VTEwpOworICAgIGVuYWJsZV9pcnEoZGV2LT5pcnEpOworfQorI2VuZGlmCisKKworc3RhdGljIGludCBwY25ldDMyX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGludCByID0gLUVPUE5PVFNVUFA7CisKKyAgICBpZiAobHAtPm1paSkgeworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCW1paV9ldGh0b29sX2dzZXQoJmxwLT5taWlfaWYsIGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwlyID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgcGNuZXQzMl9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBpbnQgciA9IC1FT1BOT1RTVVBQOworCisgICAgaWYgKGxwLT5taWkpIHsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwlyID0gbWlpX2V0aHRvb2xfc3NldCgmbHAtPm1paV9pZiwgY21kKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworICAgIH0KKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCisgICAgc3RyY3B5IChpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKyAgICBzdHJjcHkgKGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKyAgICBpZiAobHAtPnBjaV9kZXYpCisJc3RyY3B5IChpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobHAtPnBjaV9kZXYpKTsKKyAgICBlbHNlCisJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIlZMQiAweCVseCIsIGRldi0+YmFzZV9hZGRyKTsKK30KKworc3RhdGljIHUzMiBwY25ldDMyX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBpbnQgcjsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworICAgIGlmIChscC0+bWlpKSB7CisJciA9IG1paV9saW5rX29rKCZscC0+bWlpX2lmKTsKKyAgICB9IGVsc2UgeworCXVsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOwkvKiBjYXJkIGJhc2UgSS9PIGFkZHJlc3MgKi8KKwlyID0gKGxwLT5hLnJlYWRfYmNyKGlvYWRkciwgNCkgIT0gMHhjMCk7CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIHUzMiBwY25ldDMyX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIHJldHVybiBscC0+bXNnX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQgcGNuZXQzMl9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbHVlKQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIGxwLT5tc2dfZW5hYmxlID0gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgcGNuZXQzMl9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBpbnQgciA9IC1FT1BOT1RTVVBQOworCisgICAgaWYgKGxwLT5taWkpIHsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwlyID0gbWlpX253YXlfcmVzdGFydCgmbHAtPm1paV9pZik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICB9CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKmVyaW5nKQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCisgICAgZXJpbmctPnR4X21heF9wZW5kaW5nID0gVFhfUklOR19TSVpFIC0gMTsKKyAgICBlcmluZy0+dHhfcGVuZGluZyA9IGxwLT5jdXJfdHggLSBscC0+ZGlydHlfdHg7CisgICAgZXJpbmctPnJ4X21heF9wZW5kaW5nID0gUlhfUklOR19TSVpFIC0gMTsKKyAgICBlcmluZy0+cnhfcGVuZGluZyA9IGxwLT5jdXJfcnggJiBSWF9SSU5HX01PRF9NQVNLOworfQorCitzdGF0aWMgdm9pZCBwY25ldDMyX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpkYXRhKQoreworICAgIG1lbWNweShkYXRhLCBwY25ldDMyX2dzdHJpbmdzX3Rlc3QsIHNpemVvZihwY25ldDMyX2dzdHJpbmdzX3Rlc3QpKTsKK30KKworc3RhdGljIGludCBwY25ldDMyX3NlbGZfdGVzdF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHJldHVybiBQQ05FVDMyX1RFU1RfTEVOOworfQorCitzdGF0aWMgdm9pZCBwY25ldDMyX2V0aHRvb2xfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXN0cnVjdCBldGh0b29sX3Rlc3QgKnRlc3QsIHU2NCAqZGF0YSkKK3sKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyAgICBpbnQgcmM7CisKKyAgICBpZiAodGVzdC0+ZmxhZ3MgPT0gRVRIX1RFU1RfRkxfT0ZGTElORSkgeworCXJjID0gcGNuZXQzMl9sb29wYmFja190ZXN0KGRldiwgZGF0YSk7CisJaWYgKHJjKSB7CisJICAgIGlmIChuZXRpZl9tc2dfaHcobHApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IExvb3BiYWNrIHRlc3QgZmFpbGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkgICAgdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOworCX0gZWxzZSBpZiAobmV0aWZfbXNnX2h3KGxwKSkKKwkgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBMb29wYmFjayB0ZXN0IHBhc3NlZC5cbiIsIGRldi0+bmFtZSk7CisgICAgfSBlbHNlIGlmIChuZXRpZl9tc2dfaHcobHApKQorCXByaW50ayhLRVJOX0RFQlVHICIlczogTm8gdGVzdHMgdG8gcnVuIChzcGVjaWZ5ICdPZmZsaW5lJyBvbiBldGh0b29sKS4iLAkgICAgZGV2LT5uYW1lKTsKK30gLyogZW5kIHBjbmV0MzJfZXRodG9vbF90ZXN0ICovCisKK3N0YXRpYyBpbnQgcGNuZXQzMl9sb29wYmFja190ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVpbnQ2NF90ICpkYXRhMSkKK3sKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyAgICBzdHJ1Y3QgcGNuZXQzMl9hY2Nlc3MgKmEgPSAmbHAtPmE7CS8qIGFjY2VzcyB0byByZWdpc3RlcnMgKi8KKyAgICB1bG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsJLyogY2FyZCBiYXNlIEkvTyBhZGRyZXNzICovCisgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsJCS8qIHNrIGJ1ZmYgKi8KKyAgICBpbnQgeCwgaTsJCQkJLyogY291bnRlcnMgKi8KKyAgICBpbnQgbnVtYnVmZnMgPSA0OwkJCS8qIG51bWJlciBvZiBUWC9SWCBidWZmZXJzIGFuZCBkZXNjcyAqLworICAgIHUxNiBzdGF0dXMgPSAweDgzMDA7CQkvKiBUWCByaW5nIHN0YXR1cyAqLworICAgIHUxNiB0ZXN0c3RhdHVzOwkJCS8qIHRlc3Qgb2YgcmluZyBzdGF0dXMgKi8KKyAgICBpbnQgcmM7CQkJCS8qIHJldHVybiBjb2RlICovCisgICAgaW50IHNpemU7CQkJCS8qIHNpemUgb2YgcGFja2V0cyAqLworICAgIHVuc2lnbmVkIGNoYXIgKnBhY2tldDsJCS8qIHNvdXJjZSBwYWNrZXQgZGF0YSAqLworICAgIHN0YXRpYyBpbnQgZGF0YV9sZW4gPSA2MDsJCS8qIGxlbmd0aCBvZiBzb3VyY2UgcGFja2V0cyAqLworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgdW5zaWduZWQgbG9uZyB0aWNrczsKKworICAgICpkYXRhMSA9IDE7CQkJLyogc3RhdHVzIG9mIHRlc3QsIGRlZmF1bHQgdG8gZmFpbCAqLworICAgIHJjID0gMTsJCQkvKiBkZWZhdWx0IHRvIGZhaWwgKi8KKworICAgIGlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJcGNuZXQzMl9jbG9zZShkZXYpOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKyAgICAvKiBSZXNldCB0aGUgUENORVQzMiAqLworICAgIGxwLT5hLnJlc2V0IChpb2FkZHIpOworCisgICAgLyogc3dpdGNoIHBjbmV0MzIgdG8gMzJiaXQgbW9kZSAqLworICAgIGxwLT5hLndyaXRlX2JjciAoaW9hZGRyLCAyMCwgMik7CisKKyAgICBscC0+aW5pdF9ibG9jay5tb2RlID0gbGUxNl90b19jcHUoKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX1BPUlRTRUwpIDw8IDcpOworICAgIGxwLT5pbml0X2Jsb2NrLmZpbHRlclswXSA9IDA7CisgICAgbHAtPmluaXRfYmxvY2suZmlsdGVyWzFdID0gMDsKKworICAgIC8qIHB1cmdlICYgaW5pdCByaW5ncyBidXQgZG9uJ3QgYWN0dWFsbHkgcmVzdGFydCAqLworICAgIHBjbmV0MzJfcmVzdGFydChkZXYsIDB4MDAwMCk7CisKKyAgICBscC0+YS53cml0ZV9jc3IoaW9hZGRyLCAwLCAweDAwMDQpOwkvKiBTZXQgU1RPUCBiaXQgKi8KKworICAgIC8qIEluaXRpYWxpemUgVHJhbnNtaXQgYnVmZmVycy4gKi8KKyAgICBzaXplID0gZGF0YV9sZW4gKyAxNTsKKyAgICBmb3IgKHg9MDsgeDxudW1idWZmczsgeCsrKSB7CisJaWYgKCEoc2tiID0gZGV2X2FsbG9jX3NrYihzaXplKSkpIHsKKwkgICAgaWYgKG5ldGlmX21zZ19odyhscCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogQ2Fubm90IGFsbG9jYXRlIHNrYiBhdCBsaW5lOiAlZCFcbiIsCisJCSAgICBkZXYtPm5hbWUsIF9fTElORV9fKTsKKwkgICAgZ290byBjbGVhbl91cDsKKwl9IGVsc2UgeworCSAgICBwYWNrZXQgPSBza2ItPmRhdGE7CisJICAgIHNrYl9wdXQoc2tiLCBzaXplKTsJCS8qIGNyZWF0ZSBzcGFjZSBmb3IgZGF0YSAqLworCSAgICBscC0+dHhfc2tidWZmW3hdID0gc2tiOworCSAgICBscC0+dHhfcmluZ1t4XS5sZW5ndGggPSBsZTE2X3RvX2NwdSgtc2tiLT5sZW4pOworCSAgICBscC0+dHhfcmluZ1t4XS5taXNjID0gMDsKKworICAgICAgICAgICAgLyogcHV0IERBIGFuZCBTQSBpbnRvIHRoZSBza2IgKi8KKwkgICAgZm9yIChpPTA7IGk8NjsgaSsrKQorCQkqcGFja2V0KysgPSBkZXYtPmRldl9hZGRyW2ldOworCSAgICBmb3IgKGk9MDsgaTw2OyBpKyspCisJCSpwYWNrZXQrKyA9IGRldi0+ZGV2X2FkZHJbaV07CisJICAgIC8qIHR5cGUgKi8KKwkgICAgKnBhY2tldCsrID0gMHgwODsKKwkgICAgKnBhY2tldCsrID0gMHgwNjsKKwkgICAgLyogcGFja2V0IG51bWJlciAqLworCSAgICAqcGFja2V0KysgPSB4OworCSAgICAvKiBmaWxsIHBhY2tldCB3aXRoIGRhdGEgKi8KKwkgICAgZm9yIChpPTA7IGk8ZGF0YV9sZW47IGkrKykKKwkJKnBhY2tldCsrID0gaTsKKworCSAgICBscC0+dHhfZG1hX2FkZHJbeF0gPSBwY2lfbWFwX3NpbmdsZShscC0+cGNpX2Rldiwgc2tiLT5kYXRhLAorCQkgICAgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCSAgICBscC0+dHhfcmluZ1t4XS5iYXNlID0gKHUzMilsZTMyX3RvX2NwdShscC0+dHhfZG1hX2FkZHJbeF0pOworCSAgICB3bWIoKTsgLyogTWFrZSBzdXJlIG93bmVyIGNoYW5nZXMgYWZ0ZXIgYWxsIG90aGVycyBhcmUgdmlzaWJsZSAqLworCSAgICBscC0+dHhfcmluZ1t4XS5zdGF0dXMgPSBsZTE2X3RvX2NwdShzdGF0dXMpOworCX0KKyAgICB9CisKKyAgICB4ID0gYS0+cmVhZF9iY3IoaW9hZGRyLCAzMik7CS8qIHNldCBpbnRlcm5hbCBsb29wYmFjayBpbiBCU1IzMiAqLworICAgIHggPSB4IHwgMHgwMDAyOworICAgIGEtPndyaXRlX2Jjcihpb2FkZHIsIDMyLCB4KTsKKworICAgIGxwLT5hLndyaXRlX2NzciAoaW9hZGRyLCAxNSwgMHgwMDQ0KTsJLyogc2V0IGludCBsb29wYmFjayBpbiBDU1IxNSAqLworCisgICAgdGVzdHN0YXR1cyA9IGxlMTZfdG9fY3B1KDB4ODAwMCk7CisgICAgbHAtPmEud3JpdGVfY3NyKGlvYWRkciwgMCwgMHgwMDAyKTsJCS8qIFNldCBTVFJUIGJpdCAqLworCisgICAgLyogQ2hlY2sgc3RhdHVzIG9mIGRlc2NyaXB0b3JzICovCisgICAgZm9yICh4PTA7IHg8bnVtYnVmZnM7IHgrKykgeworCXRpY2tzID0gMDsKKwlybWIoKTsKKwl3aGlsZSAoKGxwLT5yeF9yaW5nW3hdLnN0YXR1cyAmIHRlc3RzdGF0dXMpICYmICh0aWNrcyA8IDIwMCkpIHsKKwkgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwkgICAgbWRlbGF5KDEpOworCSAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwkgICAgcm1iKCk7CisJICAgIHRpY2tzKys7CisJfQorCWlmICh0aWNrcyA9PSAyMDApIHsKKwkgICAgaWYgKG5ldGlmX21zZ19odyhscCkpCisJCXByaW50aygiJXM6IERlc2MgJWQgZmFpbGVkIHRvIHJlc2V0IVxuIixkZXYtPm5hbWUseCk7CisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgICBscC0+YS53cml0ZV9jc3IoaW9hZGRyLCAwLCAweDAwMDQpOwkJLyogU2V0IFNUT1AgYml0ICovCisgICAgd21iKCk7CisgICAgaWYgKG5ldGlmX21zZ19odyhscCkgJiYgbmV0aWZfbXNnX3BrdGRhdGEobHApKSB7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSWCBsb29wYmFjayBwYWNrZXRzOlxuIiwgZGV2LT5uYW1lKTsKKworCWZvciAoeD0wOyB4PG51bWJ1ZmZzOyB4KyspIHsKKwkgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBQYWNrZXQgJWQ6XG4iLCBkZXYtPm5hbWUsIHgpOworCSAgICBza2IgPSBscC0+cnhfc2tidWZmW3hdOworCSAgICBmb3IgKGk9MDsgaTxzaXplOyBpKyspIHsKKwkJcHJpbnRrKCIlMDJ4ICIsICooc2tiLT5kYXRhK2kpKTsKKwkgICAgfQorCSAgICBwcmludGsoIlxuIik7CisJfQorICAgIH0KKworICAgIHggPSAwOworICAgIHJjID0gMDsKKyAgICB3aGlsZSAoeDxudW1idWZmcyAmJiAhcmMpIHsKKwlza2IgPSBscC0+cnhfc2tidWZmW3hdOworCXBhY2tldCA9IGxwLT50eF9za2J1ZmZbeF0tPmRhdGE7CisJZm9yIChpPTA7IGk8c2l6ZTsgaSsrKSB7CisJICAgIGlmICgqKHNrYi0+ZGF0YStpKSAhPSBwYWNrZXRbaV0pIHsKKwkJaWYgKG5ldGlmX21zZ19odyhscCkpCisJCSAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IEVycm9yIGluIGNvbXBhcmUhICUyeCAtICUwMnggJTAyeFxuIiwKKwkJCSAgICBkZXYtPm5hbWUsIGksICooc2tiLT5kYXRhK2kpLCBwYWNrZXRbaV0pOworCQlyYyA9IDE7CisJCWJyZWFrOworCSAgICB9CisJfQorCXgrKzsKKyAgICB9CisgICAgaWYgKCFyYykgeworCSpkYXRhMSA9IDA7CisgICAgfQorCitjbGVhbl91cDoKKyAgICB4ID0gYS0+cmVhZF9jc3IoaW9hZGRyLCAxNSkgJiAweEZGRkY7CisgICAgYS0+d3JpdGVfY3NyKGlvYWRkciwgMTUsICh4ICYgfjB4MDA0NCkpOwkvKiByZXNldCBiaXRzIDYgYW5kIDIgKi8KKworICAgIHggPSBhLT5yZWFkX2Jjcihpb2FkZHIsIDMyKTsJCS8qIHJlc2V0IGludGVybmFsIGxvb3BiYWNrICovCisgICAgeCA9IHggJiB+MHgwMDAyOworICAgIGEtPndyaXRlX2Jjcihpb2FkZHIsIDMyLCB4KTsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKyAgICBpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJcGNuZXQzMl9vcGVuKGRldik7CisgICAgfSBlbHNlIHsKKwlscC0+YS53cml0ZV9iY3IgKGlvYWRkciwgMjAsIDQpOwkvKiByZXR1cm4gdG8gMTZiaXQgbW9kZSAqLworICAgIH0KKworICAgIHJldHVybihyYyk7Cit9IC8qIGVuZCBwY25ldDMyX2xvb3BiYWNrX3Rlc3QgICovCisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfbGVkX2JsaW5rX2NhbGxiYWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgc3RydWN0IHBjbmV0MzJfYWNjZXNzICphID0gJmxwLT5hOworICAgIHVsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgaW50IGk7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICBmb3IgKGk9NDsgaTw4OyBpKyspIHsKKwlhLT53cml0ZV9iY3IoaW9hZGRyLCBpLCBhLT5yZWFkX2Jjcihpb2FkZHIsIGkpIF4gMHg0MDAwKTsKKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworICAgIG1vZF90aW1lcigmbHAtPmJsaW5rX3RpbWVyLCBQQ05FVDMyX0JMSU5LX1RJTUVPVVQpOworfQorCitzdGF0aWMgaW50IHBjbmV0MzJfcGh5c19pZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKK3sKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyAgICBzdHJ1Y3QgcGNuZXQzMl9hY2Nlc3MgKmEgPSAmbHAtPmE7CisgICAgdWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBpbnQgaSwgcmVnc1s0XTsKKworICAgIGlmICghbHAtPmJsaW5rX3RpbWVyLmZ1bmN0aW9uKSB7CisJaW5pdF90aW1lcigmbHAtPmJsaW5rX3RpbWVyKTsKKwlscC0+YmxpbmtfdGltZXIuZnVuY3Rpb24gPSAodm9pZCAqKSBwY25ldDMyX2xlZF9ibGlua19jYWxsYmFjazsKKwlscC0+YmxpbmtfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisgICAgfQorCisgICAgLyogU2F2ZSB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYmNycyAqLworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworICAgIGZvciAoaT00OyBpPDg7IGkrKykgeworCXJlZ3NbaS00XSA9IGEtPnJlYWRfYmNyKGlvYWRkciwgaSk7CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKyAgICBtb2RfdGltZXIoJmxwLT5ibGlua190aW1lciwgamlmZmllcyk7CisgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworICAgIGlmICgoIWRhdGEpIHx8IChkYXRhID4gKHUzMikoTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWikpKQorICAgIGRhdGEgPSAodTMyKShNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKTsKKworICAgIHNjaGVkdWxlX3RpbWVvdXQoZGF0YSAqIEhaKTsKKyAgICBkZWxfdGltZXJfc3luYygmbHAtPmJsaW5rX3RpbWVyKTsKKworICAgIC8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSBiY3JzICovCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisgICAgZm9yIChpPTQ7IGk8ODsgaSsrKSB7CisJYS0+d3JpdGVfYmNyKGlvYWRkciwgaSwgcmVnc1tpLTRdKTsKKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjbmV0MzJfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgcmV0dXJuKFBDTkVUMzJfTlVNX1JFR1MgKiBzaXplb2YodTE2KSk7Cit9CisKK3N0YXRpYyB2b2lkIHBjbmV0MzJfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywKKwl2b2lkICpwdHIpCit7CisgICAgaW50IGksIGNzcjA7CisgICAgdTE2ICpidWZmID0gcHRyOworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIHN0cnVjdCBwY25ldDMyX2FjY2VzcyAqYSA9ICZscC0+YTsKKyAgICB1bG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgdGlja3M7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisgICAgY3NyMCA9IGEtPnJlYWRfY3NyKGlvYWRkciwgMCk7CisgICAgaWYgKCEoY3NyMCAmIDB4MDAwNCkpIHsJLyogSWYgbm90IHN0b3BwZWQgKi8KKwkvKiBzZXQgU1VTUEVORCAoU1BORCkgLSBDU1I1IGJpdCAwICovCisJYS0+d3JpdGVfY3NyKGlvYWRkciwgNSwgMHgwMDAxKTsKKworCS8qIHBvbGwgd2FpdGluZyBmb3IgYml0IHRvIGJlIHNldCAqLworCXRpY2tzID0gMDsKKwl3aGlsZSAoIShhLT5yZWFkX2Nzcihpb2FkZHIsIDUpICYgMHgwMDAxKSkgeworCSAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCSAgICBtZGVsYXkoMSk7CisJICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCSAgICB0aWNrcysrOworCSAgICBpZiAodGlja3MgPiAyMDApIHsKKwkJaWYgKG5ldGlmX21zZ19odyhscCkpCisJCSAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IEVycm9yIGdldHRpbmcgaW50byBzdXNwZW5kIVxuIiwKKwkJCSAgICBkZXYtPm5hbWUpOworCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgICAvKiByZWFkIGFkZHJlc3MgUFJPTSAqLworICAgIGZvciAoaT0wOyBpPDE2OyBpICs9IDIpCisJKmJ1ZmYrKyA9IGludyhpb2FkZHIgKyBpKTsKKworICAgIC8qIHJlYWQgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVycyAqLworICAgIGZvciAoaT0wOyBpPDkwOyBpKyspIHsKKwkqYnVmZisrID0gYS0+cmVhZF9jc3IoaW9hZGRyLCBpKTsKKyAgICB9CisKKyAgICAqYnVmZisrID0gYS0+cmVhZF9jc3IoaW9hZGRyLCAxMTIpOworICAgICpidWZmKysgPSBhLT5yZWFkX2Nzcihpb2FkZHIsIDExNCk7CisKKyAgICAvKiByZWFkIGJ1cyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworICAgIGZvciAoaT0wOyBpPDM2OyBpKyspIHsKKwkqYnVmZisrID0gYS0+cmVhZF9iY3IoaW9hZGRyLCBpKTsKKyAgICB9CisKKyAgICAvKiByZWFkIG1paSBwaHkgcmVnaXN0ZXJzICovCisgICAgaWYgKGxwLT5taWkpIHsKKwlmb3IgKGk9MDsgaTwzMjsgaSsrKSB7CisJICAgIGxwLT5hLndyaXRlX2Jjcihpb2FkZHIsIDMzLCAoKGxwLT5taWlfaWYucGh5X2lkKSA8PCA1KSB8IGkpOworCSAgICAqYnVmZisrID0gbHAtPmEucmVhZF9iY3IoaW9hZGRyLCAzNCk7CisJfQorICAgIH0KKworICAgIGlmICghKGNzcjAgJiAweDAwMDQpKSB7CS8qIElmIG5vdCBzdG9wcGVkICovCisJLyogY2xlYXIgU1VTUEVORCAoU1BORCkgLSBDU1I1IGJpdCAwICovCisJYS0+d3JpdGVfY3NyKGlvYWRkciwgNSwgMHgwMDAwKTsKKyAgICB9CisKKyAgICBpID0gYnVmZiAtICh1MTYgKilwdHI7CisgICAgZm9yICg7IGkgPCBQQ05FVDMyX05VTV9SRUdTOyBpKyspCisJKmJ1ZmYrKyA9IDA7CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHBjbmV0MzJfZXRodG9vbF9vcHMgPSB7CisgICAgLmdldF9zZXR0aW5ncwk9IHBjbmV0MzJfZ2V0X3NldHRpbmdzLAorICAgIC5zZXRfc2V0dGluZ3MJPSBwY25ldDMyX3NldF9zZXR0aW5ncywKKyAgICAuZ2V0X2RydmluZm8JPSBwY25ldDMyX2dldF9kcnZpbmZvLAorICAgIC5nZXRfbXNnbGV2ZWwJPSBwY25ldDMyX2dldF9tc2dsZXZlbCwKKyAgICAuc2V0X21zZ2xldmVsCT0gcGNuZXQzMl9zZXRfbXNnbGV2ZWwsCisgICAgLm53YXlfcmVzZXQJCT0gcGNuZXQzMl9ud2F5X3Jlc2V0LAorICAgIC5nZXRfbGluawkJPSBwY25ldDMyX2dldF9saW5rLAorICAgIC5nZXRfcmluZ3BhcmFtCT0gcGNuZXQzMl9nZXRfcmluZ3BhcmFtLAorICAgIC5nZXRfdHhfY3N1bQk9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCisgICAgLmdldF9zZwkJPSBldGh0b29sX29wX2dldF9zZywKKyAgICAuZ2V0X3RzbwkJPSBldGh0b29sX29wX2dldF90c28sCisgICAgLmdldF9zdHJpbmdzCT0gcGNuZXQzMl9nZXRfc3RyaW5ncywKKyAgICAuc2VsZl90ZXN0X2NvdW50CT0gcGNuZXQzMl9zZWxmX3Rlc3RfY291bnQsCisgICAgLnNlbGZfdGVzdAkJPSBwY25ldDMyX2V0aHRvb2xfdGVzdCwKKyAgICAucGh5c19pZAkJPSBwY25ldDMyX3BoeXNfaWQsCisgICAgLmdldF9yZWdzX2xlbgk9IHBjbmV0MzJfZ2V0X3JlZ3NfbGVuLAorICAgIC5nZXRfcmVncwkJPSBwY25ldDMyX2dldF9yZWdzLAorfTsKKworLyogb25seSBwcm9iZXMgZm9yIG5vbi1QQ0kgZGV2aWNlcywgdGhlIHJlc3QgYXJlIGhhbmRsZWQgYnkKKyAqIHBjaV9yZWdpc3Rlcl9kcml2ZXIgdmlhIHBjbmV0MzJfcHJvYmVfcGNpICovCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorcGNuZXQzMl9wcm9iZV92bGJ1cyh2b2lkKQoreworICAgIHVuc2lnbmVkIGludCAqcG9ydCwgaW9hZGRyOworCisgICAgLyogc2VhcmNoIGZvciBQQ25ldDMyIFZMQiBjYXJkcyBhdCBrbm93biBhZGRyZXNzZXMgKi8KKyAgICBmb3IgKHBvcnQgPSBwY25ldDMyX3BvcnRsaXN0OyAoaW9hZGRyID0gKnBvcnQpOyBwb3J0KyspIHsKKwlpZiAocmVxdWVzdF9yZWdpb24oaW9hZGRyLCBQQ05FVDMyX1RPVEFMX1NJWkUsICJwY25ldDMyX3Byb2JlX3ZsYnVzIikpIHsKKwkgICAgLyogY2hlY2sgaWYgdGhlcmUgaXMgcmVhbGx5IGEgcGNuZXQgY2hpcCBvbiB0aGF0IGlvYWRkciAqLworCSAgICBpZiAoKGluYihpb2FkZHIgKyAxNCkgPT0gMHg1NykgJiYgKGluYihpb2FkZHIgKyAxNSkgPT0gMHg1NykpIHsKKwkJcGNuZXQzMl9wcm9iZTEoaW9hZGRyLCAwLCBOVUxMKTsKKwkgICAgfSBlbHNlIHsKKwkJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBQQ05FVDMyX1RPVEFMX1NJWkUpOworCSAgICB9CisJfQorICAgIH0KK30KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorcGNuZXQzMl9wcm9iZV9wY2koc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisgICAgdW5zaWduZWQgbG9uZyBpb2FkZHI7CisgICAgaW50IGVycjsKKworICAgIGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworICAgIGlmIChlcnIgPCAwKSB7CisJaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpCisJICAgIHByaW50ayhLRVJOX0VSUiBQRlggImZhaWxlZCB0byBlbmFibGUgZGV2aWNlIC0tIGVycj0lZFxuIiwgZXJyKTsKKwlyZXR1cm4gZXJyOworICAgIH0KKyAgICBwY2lfc2V0X21hc3RlcihwZGV2KTsKKworICAgIGlvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMCk7CisgICAgaWYgKCFpb2FkZHIpIHsKKwlpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19QUk9CRSkKKwkgICAgcHJpbnRrIChLRVJOX0VSUiBQRlggImNhcmQgaGFzIG5vIFBDSSBJTyByZXNvdXJjZXMsIGFib3J0aW5nXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICBpZiAoIXBjaV9kbWFfc3VwcG9ydGVkKHBkZXYsIFBDTkVUMzJfRE1BX01BU0spKSB7CisJaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpCisJICAgIHByaW50ayhLRVJOX0VSUiBQRlggImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDMyYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKKyAgICB9CisgICAgaWYgKHJlcXVlc3RfcmVnaW9uKGlvYWRkciwgUENORVQzMl9UT1RBTF9TSVpFLCAicGNuZXQzMl9wcm9iZV9wY2kiKSA9PSBOVUxMKSB7CisJaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpCisJICAgIHByaW50ayhLRVJOX0VSUiBQRlggImlvIGFkZHJlc3MgcmFuZ2UgYWxyZWFkeSBhbGxvY2F0ZWRcbiIpOworCXJldHVybiAtRUJVU1k7CisgICAgfQorCisgICAgZXJyID0gIHBjbmV0MzJfcHJvYmUxKGlvYWRkciwgMSwgcGRldik7CisgICAgaWYgKGVyciA8IDApIHsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKKworLyogcGNuZXQzMl9wcm9iZTEKKyAqICBDYWxsZWQgZnJvbSBib3RoIHBjbmV0MzJfcHJvYmVfdmxidXMgYW5kIHBjbmV0X3Byb2JlX3BjaS4KKyAqICBwZGV2IHdpbGwgYmUgTlVMTCB3aGVuIGNhbGxlZCBmcm9tIHBjbmV0MzJfcHJvYmVfdmxidXMuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0CitwY25ldDMyX3Byb2JlMSh1bnNpZ25lZCBsb25nIGlvYWRkciwgaW50IHNoYXJlZCwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHA7CisgICAgZG1hX2FkZHJfdCBscF9kbWFfYWRkcjsKKyAgICBpbnQgaSwgbWVkaWE7CisgICAgaW50IGZkeCwgbWlpLCBmc2V0LCBkeHN1ZmxvOworICAgIGludCBjaGlwX3ZlcnNpb247CisgICAgY2hhciAqY2hpcG5hbWU7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICBzdHJ1Y3QgcGNuZXQzMl9hY2Nlc3MgKmEgPSBOVUxMOworICAgIHU4IHByb21hZGRyWzZdOworICAgIGludCByZXQgPSAtRU5PREVWOworCisgICAgLyogcmVzZXQgdGhlIGNoaXAgKi8KKyAgICBwY25ldDMyX3dpb19yZXNldChpb2FkZHIpOworCisgICAgLyogTk9URTogMTYtYml0IGNoZWNrIGlzIGZpcnN0LCBvdGhlcndpc2Ugc29tZSBvbGRlciBQQ25ldCBjaGlwcyBmYWlsICovCisgICAgaWYgKHBjbmV0MzJfd2lvX3JlYWRfY3NyKGlvYWRkciwgMCkgPT0gNCAmJiBwY25ldDMyX3dpb19jaGVjayhpb2FkZHIpKSB7CisJYSA9ICZwY25ldDMyX3dpbzsKKyAgICB9IGVsc2UgeworCXBjbmV0MzJfZHdpb19yZXNldChpb2FkZHIpOworCWlmIChwY25ldDMyX2R3aW9fcmVhZF9jc3IoaW9hZGRyLCAwKSA9PSA0ICYmIHBjbmV0MzJfZHdpb19jaGVjayhpb2FkZHIpKSB7CisJICAgIGEgPSAmcGNuZXQzMl9kd2lvOworCX0gZWxzZQorCSAgICBnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbjsKKyAgICB9CisKKyAgICBjaGlwX3ZlcnNpb24gPSBhLT5yZWFkX2Nzcihpb2FkZHIsIDg4KSB8IChhLT5yZWFkX2Nzcihpb2FkZHIsODkpIDw8IDE2KTsKKyAgICBpZiAoKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpICYmIChwY25ldDMyX2RlYnVnICYgTkVUSUZfTVNHX0hXKSkKKwlwcmludGsoS0VSTl9JTkZPICIgIFBDbmV0IGNoaXAgdmVyc2lvbiBpcyAlI3guXG4iLCBjaGlwX3ZlcnNpb24pOworICAgIGlmICgoY2hpcF92ZXJzaW9uICYgMHhmZmYpICE9IDB4MDAzKSB7CisJaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpCisJICAgIHByaW50ayhLRVJOX0lORk8gUEZYICJVbnN1cHBvcnRlZCBjaGlwIHZlcnNpb24uXG4iKTsKKwlnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbjsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIHZhcmlhYmxlcyAqLworICAgIGZkeCA9IG1paSA9IGZzZXQgPSBkeHN1ZmxvID0gMDsKKyAgICBjaGlwX3ZlcnNpb24gPSAoY2hpcF92ZXJzaW9uID4+IDEyKSAmIDB4ZmZmZjsKKworICAgIHN3aXRjaCAoY2hpcF92ZXJzaW9uKSB7CisgICAgY2FzZSAweDI0MjA6CisJY2hpcG5hbWUgPSAiUENuZXQvUENJIDc5Qzk3MCI7IC8qIFBDSSAqLworCWJyZWFrOworICAgIGNhc2UgMHgyNDMwOgorCWlmIChzaGFyZWQpCisJICAgIGNoaXBuYW1lID0gIlBDbmV0L1BDSSA3OUM5NzAiOyAvKiA5NzAgZ2l2ZXMgdGhlIHdyb25nIGNoaXAgaWQgYmFjayAqLworCWVsc2UKKwkgICAgY2hpcG5hbWUgPSAiUENuZXQvMzIgNzlDOTY1IjsgLyogNDg2L1ZMIGJ1cyAqLworCWJyZWFrOworICAgIGNhc2UgMHgyNjIxOgorCWNoaXBuYW1lID0gIlBDbmV0L1BDSSBJSSA3OUM5NzBBIjsgLyogUENJICovCisJZmR4ID0gMTsKKwlicmVhazsKKyAgICBjYXNlIDB4MjYyMzoKKwljaGlwbmFtZSA9ICJQQ25ldC9GQVNUIDc5Qzk3MSI7IC8qIFBDSSAqLworCWZkeCA9IDE7IG1paSA9IDE7IGZzZXQgPSAxOworCWJyZWFrOworICAgIGNhc2UgMHgyNjI0OgorCWNoaXBuYW1lID0gIlBDbmV0L0ZBU1QrIDc5Qzk3MiI7IC8qIFBDSSAqLworCWZkeCA9IDE7IG1paSA9IDE7IGZzZXQgPSAxOworCWJyZWFrOworICAgIGNhc2UgMHgyNjI1OgorCWNoaXBuYW1lID0gIlBDbmV0L0ZBU1QgSUlJIDc5Qzk3MyI7IC8qIFBDSSAqLworCWZkeCA9IDE7IG1paSA9IDE7CisJYnJlYWs7CisgICAgY2FzZSAweDI2MjY6CisJY2hpcG5hbWUgPSAiUENuZXQvSG9tZSA3OUM5NzgiOyAvKiBQQ0kgKi8KKwlmZHggPSAxOworCS8qCisJICogVGhpcyBpcyBiYXNlZCBvbiBzcGVjcyBwdWJsaXNoZWQgYXQgd3d3LmFtZC5jb20uICBUaGlzIHNlY3Rpb24KKwkgKiBhc3N1bWVzIHRoYXQgYSBjYXJkIHdpdGggYSA3OUM5Nzggd2FudHMgdG8gZ28gaW50byBzdGFuZGFyZAorCSAqIGV0aGVybmV0IG1vZGUuICBUaGUgNzlDOTc4IGNhbiBhbHNvIGdvIGludG8gMU1iIEhvbWVQTkEgbW9kZSwKKwkgKiBhbmQgdGhlIG1vZHVsZSBvcHRpb24gaG9tZXBuYT0xIGNhbiBzZWxlY3QgdGhpcyBpbnN0ZWFkLgorCSAqLworCW1lZGlhID0gYS0+cmVhZF9iY3IoaW9hZGRyLCA0OSk7CisJbWVkaWEgJj0gfjM7CQkvKiBkZWZhdWx0IHRvIDEwTWIgZXRoZXJuZXQgKi8KKwlpZiAoY2FyZHNfZm91bmQgPCBNQVhfVU5JVFMgJiYgaG9tZXBuYVtjYXJkc19mb3VuZF0pCisJICAgIG1lZGlhIHw9IDE7IAkvKiBzd2l0Y2ggdG8gaG9tZSB3aXJpbmcgbW9kZSAqLworCWlmIChwY25ldDMyX2RlYnVnICYgTkVUSUZfTVNHX1BST0JFKQorCSAgICBwcmludGsoS0VSTl9ERUJVRyBQRlggIm1lZGlhIHNldCB0byAlc01iaXQgbW9kZS5cbiIsIAorCQkgICAgKG1lZGlhICYgMSkgPyAiMSIgOiAiMTAiKTsKKwlhLT53cml0ZV9iY3IoaW9hZGRyLCA0OSwgbWVkaWEpOworCWJyZWFrOworICAgIGNhc2UgMHgyNjI3OgorCWNoaXBuYW1lID0gIlBDbmV0L0ZBU1QgSUlJIDc5Qzk3NSI7IC8qIFBDSSAqLworCWZkeCA9IDE7IG1paSA9IDE7CisJYnJlYWs7CisgICAgY2FzZSAweDI2Mjg6CisJY2hpcG5hbWUgPSAiUENuZXQvUFJPIDc5Qzk3NiI7CisJZmR4ID0gMTsgbWlpID0gMTsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCWlmIChwY25ldDMyX2RlYnVnICYgTkVUSUZfTVNHX1BST0JFKQorCSAgICBwcmludGsoS0VSTl9JTkZPIFBGWCAiUENuZXQgdmVyc2lvbiAlI3gsIG5vIFBDbmV0MzIgY2hpcC5cbiIsCisJCSAgICBjaGlwX3ZlcnNpb24pOworCWdvdG8gZXJyX3JlbGVhc2VfcmVnaW9uOworICAgIH0KKworICAgIC8qCisgICAgICoJT24gc2VsZWN0ZWQgY2hpcHMgdHVybiBvbiB0aGUgQkNSMTg6Tk9VRkxPIGJpdC4gVGhpcyBzdG9wcyB0cmFuc21pdAorICAgICAqCXN0YXJ0aW5nIHVudGlsIHRoZSBwYWNrZXQgaXMgbG9hZGVkLiBTdHJpa2Ugb25lIGZvciByZWxpYWJpbGl0eSwgbG9zZQorICAgICAqCW9uZSBmb3IgbGF0ZW5jeSAtIGFsdGhvdWdoIG9uIFBDSSB0aGlzIGlzbnQgYSBiaWcgbG9zcy4gT2xkZXIgY2hpcHMKKyAgICAgKgloYXZlIEZJRk8ncyBzbWFsbGVyIHRoYW4gYSBwYWNrZXQsIHNvIHlvdSBjYW4ndCBkbyB0aGlzLgorICAgICAqCVR1cm4gb24gQkNSMTg6QnVyc3RSZEVuIGFuZCBCQ1IxODpCdXJzdFdyRW4uCisgICAgICovCisKKyAgICBpZiAoZnNldCkgeworCWEtPndyaXRlX2Jjcihpb2FkZHIsIDE4LCAoYS0+cmVhZF9iY3IoaW9hZGRyLCAxOCkgfCAweDA4NjApKTsKKwlhLT53cml0ZV9jc3IoaW9hZGRyLCA4MCwgKGEtPnJlYWRfY3NyKGlvYWRkciwgODApICYgMHgwQzAwKSB8IDB4MGMwMCk7CisJZHhzdWZsbyA9IDE7CisgICAgfQorCisgICAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoMCk7CisgICAgaWYgKCFkZXYpIHsKKwlpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19QUk9CRSkKKwkgICAgcHJpbnRrKEtFUk5fRVJSIFBGWCAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLlxuIik7CisJcmV0ID0gLUVOT01FTTsKKwlnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbjsKKyAgICB9CisgICAgU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworICAgIGlmIChwY25ldDMyX2RlYnVnICYgTkVUSUZfTVNHX1BST0JFKQorCXByaW50ayhLRVJOX0lORk8gUEZYICIlcyBhdCAlIzNseCwiLCBjaGlwbmFtZSwgaW9hZGRyKTsKKworICAgIC8qIEluIG1vc3QgY2hpcHMsIGFmdGVyIGEgY2hpcCByZXNldCwgdGhlIGV0aGVybmV0IGFkZHJlc3MgaXMgcmVhZCBmcm9tIHRoZQorICAgICAqIHN0YXRpb24gYWRkcmVzcyBQUk9NIGF0IHRoZSBiYXNlIGFkZHJlc3MgYW5kIHByb2dyYW1tZWQgaW50byB0aGUKKyAgICAgKiAiUGh5c2ljYWwgQWRkcmVzcyBSZWdpc3RlcnMiIENTUjEyLTE0LgorICAgICAqIEFzIGEgcHJlY2F1dGlvbmFyeSBtZWFzdXJlLCB3ZSByZWFkIHRoZSBQUk9NIHZhbHVlcyBhbmQgY29tcGxhaW4gaWYKKyAgICAgKiB0aGV5IGRpc2FncmVlIHdpdGggdGhlIENTUnMuICBFaXRoZXIgd2F5LCB3ZSB1c2UgdGhlIENTUiB2YWx1ZXMsIGFuZAorICAgICAqIGRvdWJsZSBjaGVjayB0aGF0IHRoZXkgYXJlIHZhbGlkLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwl1bnNpZ25lZCBpbnQgdmFsOworCXZhbCA9IGEtPnJlYWRfY3NyKGlvYWRkciwgaSsxMikgJiAweDBmZmZmOworCS8qIFRoZXJlIG1heSBiZSBlbmRpYW5uZXNzIGlzc3VlcyBoZXJlLiAqLworCWRldi0+ZGV2X2FkZHJbMippXSA9IHZhbCAmIDB4MGZmOworCWRldi0+ZGV2X2FkZHJbMippKzFdID0gKHZhbCA+PiA4KSAmIDB4MGZmOworICAgIH0KKworICAgIC8qIHJlYWQgUFJPTSBhZGRyZXNzIGFuZCBjb21wYXJlIHdpdGggQ1NSIGFkZHJlc3MgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCXByb21hZGRyW2ldID0gaW5iKGlvYWRkciArIGkpOworCisgICAgaWYgKG1lbWNtcChwcm9tYWRkciwgZGV2LT5kZXZfYWRkciwgNikKKwl8fCAhaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkgeworI2lmbmRlZiBfX3Bvd2VycGNfXworCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKHByb21hZGRyKSkgeworI2Vsc2UKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcikKKwkgICAgJiYgaXNfdmFsaWRfZXRoZXJfYWRkcihwcm9tYWRkcikpIHsKKyNlbmRpZgorCSAgICBpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19QUk9CRSkgeworCQlwcmludGsoIiB3YXJuaW5nOiBDU1IgYWRkcmVzcyBpbnZhbGlkLFxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIiAgICB1c2luZyBpbnN0ZWFkIFBST00gYWRkcmVzcyBvZiIpOworCSAgICB9CisJICAgIG1lbWNweShkZXYtPmRldl9hZGRyLCBwcm9tYWRkciwgNik7CisJfQorICAgIH0KKworICAgIC8qIGlmIHRoZSBldGhlcm5ldCBhZGRyZXNzIGlzIG5vdCB2YWxpZCwgZm9yY2UgdG8gMDA6MDA6MDA6MDA6MDA6MDAgKi8KKyAgICBpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcikpCisJbWVtc2V0KGRldi0+ZGV2X2FkZHIsIDAsIHNpemVvZihkZXYtPmRldl9hZGRyKSk7CisKKyAgICBpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19QUk9CRSkgeworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJICAgIHByaW50aygiICUyLjJ4IiwgZGV2LT5kZXZfYWRkcltpXSk7CisKKwkvKiBWZXJzaW9uIDB4MjYyMyBhbmQgMHgyNjI0ICovCisJaWYgKCgoY2hpcF92ZXJzaW9uICsgMSkgJiAweGZmZmUpID09IDB4MjYyNCkgeworCSAgICBpID0gYS0+cmVhZF9jc3IoaW9hZGRyLCA4MCkgJiAweDBDMDA7ICAvKiBDaGVjayB0eF9zdGFydF9wdCAqLworCSAgICBwcmludGsoIlxuIiBLRVJOX0lORk8gIiAgICB0eF9zdGFydF9wdCgweCUwNHgpOiIsaSk7CisJICAgIHN3aXRjaChpPj4xMCkgeworCQljYXNlIDA6IHByaW50aygiICAyMCBieXRlcywiKTsgYnJlYWs7CisJCWNhc2UgMTogcHJpbnRrKCIgIDY0IGJ5dGVzLCIpOyBicmVhazsKKwkJY2FzZSAyOiBwcmludGsoIiAxMjggYnl0ZXMsIik7IGJyZWFrOworCQljYXNlIDM6IHByaW50aygifjIyMCBieXRlcywiKTsgYnJlYWs7CisJICAgIH0KKwkgICAgaSA9IGEtPnJlYWRfYmNyKGlvYWRkciwgMTgpOyAgLyogQ2hlY2sgQnVyc3QvQnVzIGNvbnRyb2wgKi8KKwkgICAgcHJpbnRrKCIgQkNSMTgoJXgpOiIsaSYweGZmZmYpOworCSAgICBpZiAoaSAmICgxPDw1KSkgcHJpbnRrKCJCdXJzdFdyRW4gIik7CisJICAgIGlmIChpICYgKDE8PDYpKSBwcmludGsoIkJ1cnN0UmRFbiAiKTsKKwkgICAgaWYgKGkgJiAoMTw8NykpIHByaW50aygiRFdvcmRJTyAiKTsKKwkgICAgaWYgKGkgJiAoMTw8MTEpKSBwcmludGsoIk5vVUZsb3cgIik7CisJICAgIGkgPSBhLT5yZWFkX2Jjcihpb2FkZHIsIDI1KTsKKwkgICAgcHJpbnRrKCJcbiIgS0VSTl9JTkZPICIgICAgU1JBTVNJWkU9MHglMDR4LCIsaTw8OCk7CisJICAgIGkgPSBhLT5yZWFkX2Jjcihpb2FkZHIsIDI2KTsKKwkgICAgcHJpbnRrKCIgU1JBTV9CTkQ9MHglMDR4LCIsaTw8OCk7CisJICAgIGkgPSBhLT5yZWFkX2Jjcihpb2FkZHIsIDI3KTsKKwkgICAgaWYgKGkgJiAoMTw8MTQpKSBwcmludGsoIkxvd0xhdFJ4Iik7CisJfQorICAgIH0KKworICAgIGRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworICAgIC8qIHBjaV9hbGxvY19jb25zaXN0ZW50IHJldHVybnMgcGFnZS1hbGlnbmVkIG1lbW9yeSwgc28gd2UgZG8gbm90IGhhdmUgdG8gY2hlY2sgdGhlIGFsaWdubWVudCAqLworICAgIGlmICgobHAgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplb2YoKmxwKSwgJmxwX2RtYV9hZGRyKSkgPT0gTlVMTCkgeworCWlmIChwY25ldDMyX2RlYnVnICYgTkVUSUZfTVNHX1BST0JFKQorCSAgICBwcmludGsoS0VSTl9FUlIgUEZYICJDb25zaXN0ZW50IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC5cbiIpOworCXJldCA9IC1FTk9NRU07CisJZ290byBlcnJfZnJlZV9uZXRkZXY7CisgICAgfQorCisgICAgbWVtc2V0KGxwLCAwLCBzaXplb2YoKmxwKSk7CisgICAgbHAtPmRtYV9hZGRyID0gbHBfZG1hX2FkZHI7CisgICAgbHAtPnBjaV9kZXYgPSBwZGV2OworCisgICAgc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKworICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgICBTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworICAgIGRldi0+cHJpdiA9IGxwOworICAgIGxwLT5uYW1lID0gY2hpcG5hbWU7CisgICAgbHAtPnNoYXJlZF9pcnEgPSBzaGFyZWQ7CisgICAgbHAtPm1paV9pZi5mdWxsX2R1cGxleCA9IGZkeDsKKyAgICBscC0+bWlpX2lmLnBoeV9pZF9tYXNrID0gMHgxZjsKKyAgICBscC0+bWlpX2lmLnJlZ19udW1fbWFzayA9IDB4MWY7CisgICAgbHAtPmR4c3VmbG8gPSBkeHN1ZmxvOworICAgIGxwLT5taWkgPSBtaWk7CisgICAgbHAtPm1zZ19lbmFibGUgPSBwY25ldDMyX2RlYnVnOworICAgIGlmICgoY2FyZHNfZm91bmQgPj0gTUFYX1VOSVRTKSB8fCAob3B0aW9uc1tjYXJkc19mb3VuZF0gPiBzaXplb2Yob3B0aW9uc19tYXBwaW5nKSkpCisJbHAtPm9wdGlvbnMgPSBQQ05FVDMyX1BPUlRfQVNFTDsKKyAgICBlbHNlCisJbHAtPm9wdGlvbnMgPSBvcHRpb25zX21hcHBpbmdbb3B0aW9uc1tjYXJkc19mb3VuZF1dOworICAgIGxwLT5taWlfaWYuZGV2ID0gZGV2OworICAgIGxwLT5taWlfaWYubWRpb19yZWFkID0gbWRpb19yZWFkOworICAgIGxwLT5taWlfaWYubWRpb193cml0ZSA9IG1kaW9fd3JpdGU7CisKKyAgICBpZiAoZmR4ICYmICEobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfQVNFTCkgJiYKKwkJKChjYXJkc19mb3VuZD49TUFYX1VOSVRTKSB8fCBmdWxsX2R1cGxleFtjYXJkc19mb3VuZF0pKQorCWxwLT5vcHRpb25zIHw9IFBDTkVUMzJfUE9SVF9GRDsKKworICAgIGlmICghYSkgeworCWlmIChwY25ldDMyX2RlYnVnICYgTkVUSUZfTVNHX1BST0JFKQorCSAgICBwcmludGsoS0VSTl9FUlIgUEZYICJObyBhY2Nlc3MgbWV0aG9kc1xuIik7CisJcmV0ID0gLUVOT0RFVjsKKwlnb3RvIGVycl9mcmVlX2NvbnNpc3RlbnQ7CisgICAgfQorICAgIGxwLT5hID0gKmE7CisKKyAgICAvKiBkZXRlY3Qgc3BlY2lhbCBUMS9FMSBXQU4gY2FyZCBieSBjaGVja2luZyBmb3IgTUFDIGFkZHJlc3MgKi8KKyAgICBpZiAoZGV2LT5kZXZfYWRkclswXSA9PSAweDAwICYmIGRldi0+ZGV2X2FkZHJbMV0gPT0gMHhlMAorCSAgICAmJiBkZXYtPmRldl9hZGRyWzJdID09IDB4NzUpCisJbHAtPm9wdGlvbnMgPSBQQ05FVDMyX1BPUlRfRkQgfCBQQ05FVDMyX1BPUlRfR1BTSTsKKworICAgIGxwLT5pbml0X2Jsb2NrLm1vZGUgPSBsZTE2X3RvX2NwdSgweDAwMDMpOwkvKiBEaXNhYmxlIFJ4IGFuZCBUeC4gKi8KKyAgICBscC0+aW5pdF9ibG9jay50bGVuX3JsZW4gPSBsZTE2X3RvX2NwdShUWF9SSU5HX0xFTl9CSVRTIHwgUlhfUklOR19MRU5fQklUUyk7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlscC0+aW5pdF9ibG9jay5waHlzX2FkZHJbaV0gPSBkZXYtPmRldl9hZGRyW2ldOworICAgIGxwLT5pbml0X2Jsb2NrLmZpbHRlclswXSA9IDB4MDAwMDAwMDA7CisgICAgbHAtPmluaXRfYmxvY2suZmlsdGVyWzFdID0gMHgwMDAwMDAwMDsKKyAgICBscC0+aW5pdF9ibG9jay5yeF9yaW5nID0gKHUzMilsZTMyX3RvX2NwdShscC0+ZG1hX2FkZHIgKworCSAgICBvZmZzZXRvZihzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlLCByeF9yaW5nKSk7CisgICAgbHAtPmluaXRfYmxvY2sudHhfcmluZyA9ICh1MzIpbGUzMl90b19jcHUobHAtPmRtYV9hZGRyICsKKwkgICAgb2Zmc2V0b2Yoc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSwgdHhfcmluZykpOworCisgICAgLyogc3dpdGNoIHBjbmV0MzIgdG8gMzJiaXQgbW9kZSAqLworICAgIGEtPndyaXRlX2Jjcihpb2FkZHIsIDIwLCAyKTsKKworICAgIGEtPndyaXRlX2Nzcihpb2FkZHIsIDEsIChscC0+ZG1hX2FkZHIgKyBvZmZzZXRvZihzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlLAorCQkgICAgaW5pdF9ibG9jaykpICYgMHhmZmZmKTsKKyAgICBhLT53cml0ZV9jc3IoaW9hZGRyLCAyLCAobHAtPmRtYV9hZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSwKKwkJICAgIGluaXRfYmxvY2spKSA+PiAxNik7CisKKyAgICBpZiAocGRldikgewkJLyogdXNlIHRoZSBJUlEgcHJvdmlkZWQgYnkgUENJICovCisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpCisJICAgIHByaW50aygiIGFzc2lnbmVkIElSUSAlZC5cbiIsIGRldi0+aXJxKTsKKyAgICB9IGVsc2UgeworCXVuc2lnbmVkIGxvbmcgaXJxX21hc2sgPSBwcm9iZV9pcnFfb24oKTsKKworCS8qCisJICogVG8gYXV0by1JUlEgd2UgZW5hYmxlIHRoZSBpbml0aWFsaXphdGlvbi1kb25lIGFuZCBETUEgZXJyb3IKKwkgKiBpbnRlcnJ1cHRzLiBGb3IgSVNBIGJvYXJkcyB3ZSBnZXQgYSBETUEgZXJyb3IsIGJ1dCBWTEIgYW5kIFBDSQorCSAqIGJvYXJkcyB3aWxsIHdvcmsuCisJICovCisJLyogVHJpZ2dlciBhbiBpbml0aWFsaXphdGlvbiBqdXN0IGZvciB0aGUgaW50ZXJydXB0LiAqLworCWEtPndyaXRlX2NzciAoaW9hZGRyLCAwLCAweDQxKTsKKwltZGVsYXkgKDEpOworCisJZGV2LT5pcnEgPSBwcm9iZV9pcnFfb2ZmIChpcnFfbWFzayk7CisJaWYgKCFkZXYtPmlycSkgeworCSAgICBpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19QUk9CRSkKKwkJcHJpbnRrKCIsIGZhaWxlZCB0byBkZXRlY3QgSVJRIGxpbmUuXG4iKTsKKwkgICAgcmV0ID0gLUVOT0RFVjsKKwkgICAgZ290byBlcnJfZnJlZV9jb25zaXN0ZW50OworCX0KKwlpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19QUk9CRSkKKwkgICAgcHJpbnRrKCIsIHByb2JlZCBJUlEgJWQuXG4iLCBkZXYtPmlycSk7CisgICAgfQorCisgICAgLyogU2V0IHRoZSBtaWkgcGh5X2lkIHNvIHRoYXQgd2UgY2FuIHF1ZXJ5IHRoZSBsaW5rIHN0YXRlICovCisgICAgaWYgKGxwLT5taWkpCisJbHAtPm1paV9pZi5waHlfaWQgPSAoKGxwLT5hLnJlYWRfYmNyIChpb2FkZHIsIDMzKSkgPj4gNSkgJiAweDFmOworCisgICAgaW5pdF90aW1lciAoJmxwLT53YXRjaGRvZ190aW1lcik7CisgICAgbHAtPndhdGNoZG9nX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworICAgIGxwLT53YXRjaGRvZ190aW1lci5mdW5jdGlvbiA9ICh2b2lkICopICZwY25ldDMyX3dhdGNoZG9nOworCisgICAgLyogVGhlIFBDTkVUMzItc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKyAgICBkZXYtPm9wZW4gPSAmcGNuZXQzMl9vcGVuOworICAgIGRldi0+aGFyZF9zdGFydF94bWl0ID0gJnBjbmV0MzJfc3RhcnRfeG1pdDsKKyAgICBkZXYtPnN0b3AgPSAmcGNuZXQzMl9jbG9zZTsKKyAgICBkZXYtPmdldF9zdGF0cyA9ICZwY25ldDMyX2dldF9zdGF0czsKKyAgICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZwY25ldDMyX3NldF9tdWx0aWNhc3RfbGlzdDsKKyAgICBkZXYtPmRvX2lvY3RsID0gJnBjbmV0MzJfaW9jdGw7CisgICAgZGV2LT5ldGh0b29sX29wcyA9ICZwY25ldDMyX2V0aHRvb2xfb3BzOworICAgIGRldi0+dHhfdGltZW91dCA9IHBjbmV0MzJfdHhfdGltZW91dDsKKyAgICBkZXYtPndhdGNoZG9nX3RpbWVvID0gKDUqSFopOworCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKyAgICBkZXYtPnBvbGxfY29udHJvbGxlciA9IHBjbmV0MzJfcG9sbF9jb250cm9sbGVyOworI2VuZGlmCisKKyAgICAvKiBGaWxsIGluIHRoZSBnZW5lcmljIGZpZWxkcyBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKyAgICBpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpCisJZ290byBlcnJfZnJlZV9jb25zaXN0ZW50OworCisgICAgaWYgKHBkZXYpIHsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKyAgICB9IGVsc2UgeworCWxwLT5uZXh0ID0gcGNuZXQzMl9kZXY7CisJcGNuZXQzMl9kZXYgPSBkZXY7CisgICAgfQorCisgICAgaWYgKHBjbmV0MzJfZGVidWcgJiBORVRJRl9NU0dfUFJPQkUpCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlZ2lzdGVyZWQgYXMgJXNcbiIsIGRldi0+bmFtZSwgbHAtPm5hbWUpOworICAgIGNhcmRzX2ZvdW5kKys7CisKKyAgICAvKiBlbmFibGUgTEVEIHdyaXRlcyAqLworICAgIGEtPndyaXRlX2Jjcihpb2FkZHIsIDIsIGEtPnJlYWRfYmNyKGlvYWRkciwgMikgfCAweDEwMDApOworCisgICAgcmV0dXJuIDA7CisKK2Vycl9mcmVlX2NvbnNpc3RlbnQ6CisgICAgcGNpX2ZyZWVfY29uc2lzdGVudChscC0+cGNpX2Rldiwgc2l6ZW9mKCpscCksIGxwLCBscC0+ZG1hX2FkZHIpOworZXJyX2ZyZWVfbmV0ZGV2OgorICAgIGZyZWVfbmV0ZGV2KGRldik7CitlcnJfcmVsZWFzZV9yZWdpb246CisgICAgcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBQQ05FVDMyX1RPVEFMX1NJWkUpOworICAgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludAorcGNuZXQzMl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB1MTYgdmFsOworICAgIGludCBpOworICAgIGludCByYzsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmcGNuZXQzMl9pbnRlcnJ1cHQsCisJCSAgICBscC0+c2hhcmVkX2lycSA/IFNBX1NISVJRIDogMCwgZGV2LT5uYW1lLCAodm9pZCAqKWRldikpIHsKKwlyZXR1cm4gLUVBR0FJTjsKKyAgICB9CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICAvKiBDaGVjayBmb3IgYSB2YWxpZCBzdGF0aW9uIGFkZHJlc3MgKi8KKyAgICBpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcikpIHsKKwlyYyA9IC1FSU5WQUw7CisJZ290byBlcnJfZnJlZV9pcnE7CisgICAgfQorCisgICAgLyogUmVzZXQgdGhlIFBDTkVUMzIgKi8KKyAgICBscC0+YS5yZXNldCAoaW9hZGRyKTsKKworICAgIC8qIHN3aXRjaCBwY25ldDMyIHRvIDMyYml0IG1vZGUgKi8KKyAgICBscC0+YS53cml0ZV9iY3IgKGlvYWRkciwgMjAsIDIpOworCisgICAgaWYgKG5ldGlmX21zZ19pZnVwKGxwKSkKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHBjbmV0MzJfb3BlbigpIGlycSAlZCB0eC9yeCByaW5ncyAlI3gvJSN4IGluaXQgJSN4LlxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBkZXYtPmlycSwKKwkgICAgICAgKHUzMikgKGxwLT5kbWFfYWRkciArIG9mZnNldG9mKHN0cnVjdCBwY25ldDMyX3ByaXZhdGUsIHR4X3JpbmcpKSwKKwkgICAgICAgKHUzMikgKGxwLT5kbWFfYWRkciArIG9mZnNldG9mKHN0cnVjdCBwY25ldDMyX3ByaXZhdGUsIHJ4X3JpbmcpKSwKKwkgICAgICAgKHUzMikgKGxwLT5kbWFfYWRkciArIG9mZnNldG9mKHN0cnVjdCBwY25ldDMyX3ByaXZhdGUsIGluaXRfYmxvY2spKSk7CisKKyAgICAvKiBzZXQvcmVzZXQgYXV0b3NlbGVjdCBiaXQgKi8KKyAgICB2YWwgPSBscC0+YS5yZWFkX2JjciAoaW9hZGRyLCAyKSAmIH4yOworICAgIGlmIChscC0+b3B0aW9ucyAmIFBDTkVUMzJfUE9SVF9BU0VMKQorCXZhbCB8PSAyOworICAgIGxwLT5hLndyaXRlX2JjciAoaW9hZGRyLCAyLCB2YWwpOworCisgICAgLyogaGFuZGxlIGZ1bGwgZHVwbGV4IHNldHRpbmcgKi8KKyAgICBpZiAobHAtPm1paV9pZi5mdWxsX2R1cGxleCkgeworCXZhbCA9IGxwLT5hLnJlYWRfYmNyIChpb2FkZHIsIDkpICYgfjM7CisJaWYgKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX0ZEKSB7CisJICAgIHZhbCB8PSAxOworCSAgICBpZiAobHAtPm9wdGlvbnMgPT0gKFBDTkVUMzJfUE9SVF9GRCB8IFBDTkVUMzJfUE9SVF9BVUkpKQorCQl2YWwgfD0gMjsKKwl9IGVsc2UgaWYgKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX0FTRUwpIHsKKwkvKiB3b3JrYXJvdW5kIG9mIHhTZXJpZXMyNTAsIHR1cm4gb24gZm9yIDc5Qzk3NSBvbmx5ICovCisJICAgIGkgPSAoKGxwLT5hLnJlYWRfY3NyKGlvYWRkciwgODgpIHwKKwkJCShscC0+YS5yZWFkX2Nzcihpb2FkZHIsODkpIDw8IDE2KSkgPj4gMTIpICYgMHhmZmZmOworCSAgICBpZiAoaSA9PSAweDI2MjcpCisJCXZhbCB8PSAzOworCX0KKwlscC0+YS53cml0ZV9iY3IgKGlvYWRkciwgOSwgdmFsKTsKKyAgICB9CisKKyAgICAvKiBzZXQvcmVzZXQgR1BTSSBiaXQgaW4gdGVzdCByZWdpc3RlciAqLworICAgIHZhbCA9IGxwLT5hLnJlYWRfY3NyIChpb2FkZHIsIDEyNCkgJiB+MHgxMDsKKyAgICBpZiAoKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX1BPUlRTRUwpID09IFBDTkVUMzJfUE9SVF9HUFNJKQorCXZhbCB8PSAweDEwOworICAgIGxwLT5hLndyaXRlX2NzciAoaW9hZGRyLCAxMjQsIHZhbCk7CisKKyAgICAvKiBBbGxpZWQgVGVsZXN5biBBVCAyNzAwLzI3MDEgRlggbG9vc2VzIHRoZSBsaW5rLCBzbyBza2lwIHRoYXQgKi8KKyAgICBpZiAobHAtPnBjaV9kZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9BVCAmJgorICAgICAgICAobHAtPnBjaV9kZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gUENJX1NVQkRFVklDRV9JRF9BVF8yNzAwRlggfHwKKwkgbHAtPnBjaV9kZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gUENJX1NVQkRFVklDRV9JRF9BVF8yNzAxRlgpKSB7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTa2lwcGluZyBQSFkgc2VsZWN0aW9uLlxuIiwgZGV2LT5uYW1lKTsKKyAgICB9IGVsc2UgeworCS8qCisJICogMjQgSnVuIDIwMDQgYWNjb3JkaW5nIEFNRCwgaW4gb3JkZXIgdG8gY2hhbmdlIHRoZSBQSFksCisJICogREFOQVMgKG9yIERJU1BNIGZvciA3OUM5NzYpIG11c3QgYmUgc2V0OyB0aGVuIHNlbGVjdCB0aGUgc3BlZWQsCisJICogZHVwbGV4LCBhbmQvb3IgZW5hYmxlIGF1dG8gbmVnb3RpYXRpb24sIGFuZCBjbGVhciBEQU5BUworCSAqLworCWlmIChscC0+bWlpICYmICEobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfQVNFTCkpIHsKKwkgICAgbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgMzIsCisJCQkJbHAtPmEucmVhZF9iY3IoaW9hZGRyLCAzMikgfCAweDAwODApOworCSAgICAvKiBkaXNhYmxlIEF1dG8gTmVnb3RpYXRpb24sIHNldCAxME1wYnMsIEhEICovCisJICAgIHZhbCA9IGxwLT5hLnJlYWRfYmNyKGlvYWRkciwgMzIpICYgfjB4Yjg7CisJICAgIGlmIChscC0+b3B0aW9ucyAmIFBDTkVUMzJfUE9SVF9GRCkKKwkJdmFsIHw9IDB4MTA7CisJICAgIGlmIChscC0+b3B0aW9ucyAmIFBDTkVUMzJfUE9SVF8xMDApCisJCXZhbCB8PSAweDA4OworCSAgICBscC0+YS53cml0ZV9iY3IgKGlvYWRkciwgMzIsIHZhbCk7CisJfSBlbHNlIHsKKwkgICAgaWYgKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX0FTRUwpIHsKKwkJbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgMzIsCisJCQlscC0+YS5yZWFkX2Jjcihpb2FkZHIsIDMyKSB8IDB4MDA4MCk7CisJCS8qIGVuYWJsZSBhdXRvIG5lZ290aWF0ZSwgc2V0dXAsIGRpc2FibGUgZmQgKi8KKwkJdmFsID0gbHAtPmEucmVhZF9iY3IoaW9hZGRyLCAzMikgJiB+MHg5ODsKKwkJdmFsIHw9IDB4MjA7CisJCWxwLT5hLndyaXRlX2Jjcihpb2FkZHIsIDMyLCB2YWwpOworCSAgICB9CisJfQorICAgIH0KKworI2lmZGVmIERPX0RYU1VGTE8KKyAgICBpZiAobHAtPmR4c3VmbG8pIHsgLyogRGlzYWJsZSB0cmFuc21pdCBzdG9wIG9uIHVuZGVyZmxvdyAqLworCXZhbCA9IGxwLT5hLnJlYWRfY3NyIChpb2FkZHIsIDMpOworCXZhbCB8PSAweDQwOworCWxwLT5hLndyaXRlX2NzciAoaW9hZGRyLCAzLCB2YWwpOworICAgIH0KKyNlbmRpZgorCisgICAgbHAtPmluaXRfYmxvY2subW9kZSA9IGxlMTZfdG9fY3B1KChscC0+b3B0aW9ucyAmIFBDTkVUMzJfUE9SVF9QT1JUU0VMKSA8PCA3KTsKKyAgICBwY25ldDMyX2xvYWRfbXVsdGljYXN0KGRldik7CisKKyAgICBpZiAocGNuZXQzMl9pbml0X3JpbmcoZGV2KSkgeworCXJjID0gLUVOT01FTTsKKwlnb3RvIGVycl9mcmVlX3Jpbmc7CisgICAgfQorCisgICAgLyogUmUtaW5pdGlhbGl6ZSB0aGUgUENORVQzMiwgYW5kIHN0YXJ0IGl0IHdoZW4gZG9uZS4gKi8KKyAgICBscC0+YS53cml0ZV9jc3IgKGlvYWRkciwgMSwgKGxwLT5kbWFfYWRkciArCisJCW9mZnNldG9mKHN0cnVjdCBwY25ldDMyX3ByaXZhdGUsIGluaXRfYmxvY2spKSAmIDB4ZmZmZik7CisgICAgbHAtPmEud3JpdGVfY3NyIChpb2FkZHIsIDIsIChscC0+ZG1hX2FkZHIgKworCQlvZmZzZXRvZihzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlLCBpbml0X2Jsb2NrKSkgPj4gMTYpOworCisgICAgbHAtPmEud3JpdGVfY3NyIChpb2FkZHIsIDQsIDB4MDkxNSk7CisgICAgbHAtPmEud3JpdGVfY3NyIChpb2FkZHIsIDAsIDB4MDAwMSk7CisKKyAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisgICAgLyogSWYgd2UgaGF2ZSBtaWksIHByaW50IHRoZSBsaW5rIHN0YXR1cyBhbmQgc3RhcnQgdGhlIHdhdGNoZG9nICovCisgICAgaWYgKGxwLT5taWkpIHsKKwltaWlfY2hlY2tfbWVkaWEgKCZscC0+bWlpX2lmLCBuZXRpZl9tc2dfbGluayhscCksIDEpOworCW1vZF90aW1lciAoJihscC0+d2F0Y2hkb2dfdGltZXIpLCBQQ05FVDMyX1dBVENIRE9HX1RJTUVPVVQpOworICAgIH0KKworICAgIGkgPSAwOworICAgIHdoaWxlIChpKysgPCAxMDApCisJaWYgKGxwLT5hLnJlYWRfY3NyIChpb2FkZHIsIDApICYgMHgwMTAwKQorCSAgICBicmVhazsKKyAgICAvKgorICAgICAqIFdlIHVzZWQgdG8gY2xlYXIgdGhlIEluaXREb25lIGJpdCwgMHgwMTAwLCBoZXJlIGJ1dCBNYXJrIFN0b2NrdG9uCisgICAgICogcmVwb3J0cyB0aGF0IGRvaW5nIHNvIHRyaWdnZXJzIGEgYnVnIGluIHRoZSAnOTc0LgorICAgICAqLworICAgIGxwLT5hLndyaXRlX2NzciAoaW9hZGRyLCAwLCAweDAwNDIpOworCisgICAgaWYgKG5ldGlmX21zZ19pZnVwKGxwKSkKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHBjbmV0MzIgb3BlbiBhZnRlciAlZCB0aWNrcywgaW5pdCBibG9jayAlI3ggY3NyMCAlNC40eC5cbiIsCisJCWRldi0+bmFtZSwgaSwgKHUzMikgKGxwLT5kbWFfYWRkciArCisJCSAgICBvZmZzZXRvZihzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlLCBpbml0X2Jsb2NrKSksCisJCWxwLT5hLnJlYWRfY3NyKGlvYWRkciwgMCkpOworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiAwOwkvKiBBbHdheXMgc3VjY2VlZCAqLworCitlcnJfZnJlZV9yaW5nOgorICAgIC8qIGZyZWUgYW55IGFsbG9jYXRlZCBza2J1ZmZzICovCisgICAgZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJbHAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gMDsKKwlpZiAobHAtPnJ4X3NrYnVmZltpXSkgeworCSAgICBwY2lfdW5tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LCBscC0+cnhfZG1hX2FkZHJbaV0sIFBLVF9CVUZfU1otMiwKKwkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJICAgIGRldl9rZnJlZV9za2IobHAtPnJ4X3NrYnVmZltpXSk7CisJfQorCWxwLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCWxwLT5yeF9kbWFfYWRkcltpXSA9IDA7CisgICAgfQorICAgIC8qCisgICAgICogU3dpdGNoIGJhY2sgdG8gMTZiaXQgbW9kZSB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIGR1bWIKKyAgICAgKiBET1MgcGFja2V0IGRyaXZlciBhZnRlciBhIHdhcm0gcmVib290CisgICAgICovCisgICAgbHAtPmEud3JpdGVfYmNyIChpb2FkZHIsIDIwLCA0KTsKKworZXJyX2ZyZWVfaXJxOgorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisgICAgZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisgICAgcmV0dXJuIHJjOworfQorCisvKgorICogVGhlIExBTkNFIGhhcyBiZWVuIGhhbHRlZCBmb3Igb25lIHJlYXNvbiBvciBhbm90aGVyIChidXNtYXN0ZXIgbWVtb3J5CisgKiBhcmJpdHJhdGlvbiBlcnJvciwgVHggRklGTyB1bmRlcmZsb3csIGRyaXZlciBzdG9wcGVkIGl0IHRvIHJlY29uZmlndXJlLAorICogZXRjLikuICBNb2Rlcm4gTEFOQ0UgdmFyaWFudHMgYWx3YXlzIHJlbG9hZCB0aGVpciByaW5nLWJ1ZmZlcgorICogY29uZmlndXJhdGlvbiB3aGVuIHJlc3RhcnRlZCwgc28gd2UgbXVzdCByZWluaXRpYWxpemUgb3VyIHJpbmcKKyAqIGNvbnRleHQgYmVmb3JlIHJlc3RhcnRpbmcuICBBcyBwYXJ0IG9mIHRoaXMgcmVpbml0aWFsaXphdGlvbiwKKyAqIGZpbmQgYWxsIHBhY2tldHMgc3RpbGwgb24gdGhlIFR4IHJpbmcgYW5kIHByZXRlbmQgdGhhdCB0aGV5IGhhZCBiZWVuCisgKiBzZW50IChpbiBlZmZlY3QsIGRyb3AgdGhlIHBhY2tldHMgb24gdGhlIGZsb29yKSAtIHRoZSBoaWdoZXItbGV2ZWwKKyAqIHByb3RvY29scyB3aWxsIHRpbWUgb3V0IGFuZCByZXRyYW5zbWl0LiAgSXQnZCBiZSBiZXR0ZXIgdG8gc2h1ZmZsZQorICogdGhlc2Ugc2ticyB0byBhIHRlbXAgbGlzdCBhbmQgdGhlbiBhY3R1YWxseSByZS1UeCB0aGVtIGFmdGVyCisgKiByZXN0YXJ0aW5nIHRoZSBjaGlwLCBidXQgSSdtIHRvbyBsYXp5IHRvIGRvIHNvIHJpZ2h0IG5vdy4gIGRwbGF0dEAzZG8uY29tCisgKi8KKworc3RhdGljIHZvaWQKK3BjbmV0MzJfcHVyZ2VfdHhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJbHAtPnR4X3JpbmdbaV0uc3RhdHVzID0gMDsJLyogQ1BVIG93bnMgYnVmZmVyICovCisJd21iKCk7CS8qIE1ha2Ugc3VyZSBhZGFwdGVyIHNlZXMgb3duZXIgY2hhbmdlICovCisJaWYgKGxwLT50eF9za2J1ZmZbaV0pIHsKKwkgICAgcGNpX3VubWFwX3NpbmdsZShscC0+cGNpX2RldiwgbHAtPnR4X2RtYV9hZGRyW2ldLAorCQkgICAgbHAtPnR4X3NrYnVmZltpXS0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkgICAgZGV2X2tmcmVlX3NrYl9hbnkobHAtPnR4X3NrYnVmZltpXSk7CisJfQorCWxwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCWxwLT50eF9kbWFfYWRkcltpXSA9IDA7CisgICAgfQorfQorCisKKy8qIEluaXRpYWxpemUgdGhlIFBDTkVUMzIgUnggYW5kIFR4IHJpbmdzLiAqLworc3RhdGljIGludAorcGNuZXQzMl9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyAgICBpbnQgaTsKKworICAgIGxwLT50eF9mdWxsID0gMDsKKyAgICBscC0+Y3VyX3J4ID0gbHAtPmN1cl90eCA9IDA7CisgICAgbHAtPmRpcnR5X3J4ID0gbHAtPmRpcnR5X3R4ID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCXN0cnVjdCBza19idWZmICpyeF9za2J1ZmYgPSBscC0+cnhfc2tidWZmW2ldOworCWlmIChyeF9za2J1ZmYgPT0gTlVMTCkgeworCSAgICBpZiAoIShyeF9za2J1ZmYgPSBscC0+cnhfc2tidWZmW2ldID0gZGV2X2FsbG9jX3NrYiAoUEtUX0JVRl9TWikpKSB7CisJCS8qIHRoZXJlIGlzIG5vdCBtdWNoLCB3ZSBjYW4gZG8gYXQgdGhpcyBwb2ludCAqLworCQlpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19EUlYpCisJCSAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBwY25ldDMyX2luaXRfcmluZyBkZXZfYWxsb2Nfc2tiIGZhaWxlZC5cbiIsCisJCQkgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCSAgICB9CisJICAgIHNrYl9yZXNlcnZlIChyeF9za2J1ZmYsIDIpOworCX0KKworCXJtYigpOworCWlmIChscC0+cnhfZG1hX2FkZHJbaV0gPT0gMCkKKwkgICAgbHAtPnJ4X2RtYV9hZGRyW2ldID0gcGNpX21hcF9zaW5nbGUobHAtPnBjaV9kZXYsIHJ4X3NrYnVmZi0+dGFpbCwKKwkJICAgIFBLVF9CVUZfU1otMiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlscC0+cnhfcmluZ1tpXS5iYXNlID0gKHUzMilsZTMyX3RvX2NwdShscC0+cnhfZG1hX2FkZHJbaV0pOworCWxwLT5yeF9yaW5nW2ldLmJ1Zl9sZW5ndGggPSBsZTE2X3RvX2NwdSgyLVBLVF9CVUZfU1opOworCXdtYigpOwkvKiBNYWtlIHN1cmUgb3duZXIgY2hhbmdlcyBhZnRlciBhbGwgb3RoZXJzIGFyZSB2aXNpYmxlICovCisJbHAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gbGUxNl90b19jcHUoMHg4MDAwKTsKKyAgICB9CisgICAgLyogVGhlIFR4IGJ1ZmZlciBhZGRyZXNzIGlzIGZpbGxlZCBpbiBhcyBuZWVkZWQsIGJ1dCB3ZSBkbyBuZWVkIHRvIGNsZWFyCisgICAgICogdGhlIHVwcGVyIG93bmVyc2hpcCBiaXQuICovCisgICAgZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJbHAtPnR4X3JpbmdbaV0uc3RhdHVzID0gMDsJLyogQ1BVIG93bnMgYnVmZmVyICovCisJd21iKCk7CS8qIE1ha2Ugc3VyZSBhZGFwdGVyIHNlZXMgb3duZXIgY2hhbmdlICovCisJbHAtPnR4X3JpbmdbaV0uYmFzZSA9IDA7CisJbHAtPnR4X2RtYV9hZGRyW2ldID0gMDsKKyAgICB9CisKKyAgICBscC0+aW5pdF9ibG9jay50bGVuX3JsZW4gPSBsZTE2X3RvX2NwdShUWF9SSU5HX0xFTl9CSVRTIHwgUlhfUklOR19MRU5fQklUUyk7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlscC0+aW5pdF9ibG9jay5waHlzX2FkZHJbaV0gPSBkZXYtPmRldl9hZGRyW2ldOworICAgIGxwLT5pbml0X2Jsb2NrLnJ4X3JpbmcgPSAodTMyKWxlMzJfdG9fY3B1KGxwLT5kbWFfYWRkciArCisJICAgIG9mZnNldG9mKHN0cnVjdCBwY25ldDMyX3ByaXZhdGUsIHJ4X3JpbmcpKTsKKyAgICBscC0+aW5pdF9ibG9jay50eF9yaW5nID0gKHUzMilsZTMyX3RvX2NwdShscC0+ZG1hX2FkZHIgKworCSAgICBvZmZzZXRvZihzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlLCB0eF9yaW5nKSk7CisgICAgd21iKCk7CS8qIE1ha2Ugc3VyZSBhbGwgY2hhbmdlcyBhcmUgdmlzaWJsZSAqLworICAgIHJldHVybiAwOworfQorCisvKiB0aGUgcGNuZXQzMiBoYXMgYmVlbiBpc3N1ZWQgYSBzdG9wIG9yIHJlc2V0LiAgV2FpdCBmb3IgdGhlIHN0b3AgYml0CisgKiB0aGVuIGZsdXNoIHRoZSBwZW5kaW5nIHRyYW5zbWl0IG9wZXJhdGlvbnMsIHJlLWluaXRpYWxpemUgdGhlIHJpbmcsCisgKiBhbmQgdGVsbCB0aGUgY2hpcCB0byBpbml0aWFsaXplLgorICovCitzdGF0aWMgdm9pZAorcGNuZXQzMl9yZXN0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjc3IwX2JpdHMpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgaTsKKworICAgIC8qIHdhaXQgZm9yIHN0b3AgKi8KKyAgICBmb3IgKGk9MDsgaTwxMDA7IGkrKykKKwlpZiAobHAtPmEucmVhZF9jc3IoaW9hZGRyLCAwKSAmIDB4MDAwNCkKKwkgICBicmVhazsKKworICAgIGlmIChpID49IDEwMCAmJiBuZXRpZl9tc2dfZHJ2KGxwKSkKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBwY25ldDMyX3Jlc3RhcnQgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHN0b3AuXG4iLAorCQlkZXYtPm5hbWUpOworCisgICAgcGNuZXQzMl9wdXJnZV90eF9yaW5nKGRldik7CisgICAgaWYgKHBjbmV0MzJfaW5pdF9yaW5nKGRldikpCisJcmV0dXJuOworCisgICAgLyogUmVJbml0IFJpbmcgKi8KKyAgICBscC0+YS53cml0ZV9jc3IgKGlvYWRkciwgMCwgMSk7CisgICAgaSA9IDA7CisgICAgd2hpbGUgKGkrKyA8IDEwMDApCisJaWYgKGxwLT5hLnJlYWRfY3NyIChpb2FkZHIsIDApICYgMHgwMTAwKQorCSAgICBicmVhazsKKworICAgIGxwLT5hLndyaXRlX2NzciAoaW9hZGRyLCAwLCBjc3IwX2JpdHMpOworfQorCisKK3N0YXRpYyB2b2lkCitwY25ldDMyX3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciwgZmxhZ3M7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICAvKiBUcmFuc21pdHRlciB0aW1lb3V0LCBzZXJpb3VzIHByb2JsZW1zLiAqLworICAgIGlmIChwY25ldDMyX2RlYnVnICYgTkVUSUZfTVNHX0RSVikKKwlwcmludGsoS0VSTl9FUlIgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlNC40eCwgcmVzZXR0aW5nLlxuIiwKKwkJZGV2LT5uYW1lLCBscC0+YS5yZWFkX2Nzcihpb2FkZHIsIDApKTsKKyAgICBscC0+YS53cml0ZV9jc3IgKGlvYWRkciwgMCwgMHgwMDA0KTsKKyAgICBscC0+c3RhdHMudHhfZXJyb3JzKys7CisgICAgaWYgKG5ldGlmX21zZ190eF9lcnIobHApKSB7CisJaW50IGk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiBSaW5nIGRhdGEgZHVtcDogZGlydHlfdHggJWQgY3VyX3R4ICVkJXMgY3VyX3J4ICVkLiIsCisJICAgbHAtPmRpcnR5X3R4LCBscC0+Y3VyX3R4LCBscC0+dHhfZnVsbCA/ICIgKGZ1bGwpIiA6ICIiLAorCSAgIGxwLT5jdXJfcngpOworCWZvciAoaSA9IDAgOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCisJcHJpbnRrKCIlcyAlMDh4ICUwNHggJTA4eCAlMDR4IiwgaSAmIDEgPyAiIiA6ICJcbiAiLAorCSAgICAgICBsZTMyX3RvX2NwdShscC0+cnhfcmluZ1tpXS5iYXNlKSwKKwkgICAgICAgKC1sZTE2X3RvX2NwdShscC0+cnhfcmluZ1tpXS5idWZfbGVuZ3RoKSkgJiAweGZmZmYsCisJICAgICAgIGxlMzJfdG9fY3B1KGxwLT5yeF9yaW5nW2ldLm1zZ19sZW5ndGgpLAorCSAgICAgICBsZTE2X3RvX2NwdShscC0+cnhfcmluZ1tpXS5zdGF0dXMpKTsKKwlmb3IgKGkgPSAwIDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCXByaW50aygiJXMgJTA4eCAlMDR4ICUwOHggJTA0eCIsIGkgJiAxID8gIiIgOiAiXG4gIiwKKwkgICAgICAgbGUzMl90b19jcHUobHAtPnR4X3JpbmdbaV0uYmFzZSksCisJICAgICAgICgtbGUxNl90b19jcHUobHAtPnR4X3JpbmdbaV0ubGVuZ3RoKSkgJiAweGZmZmYsCisJICAgICAgIGxlMzJfdG9fY3B1KGxwLT50eF9yaW5nW2ldLm1pc2MpLAorCSAgICAgICBsZTE2X3RvX2NwdShscC0+dHhfcmluZ1tpXS5zdGF0dXMpKTsKKwlwcmludGsoIlxuIik7CisgICAgfQorICAgIHBjbmV0MzJfcmVzdGFydChkZXYsIDB4MDA0Mik7CisKKyAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworfQorCisKK3N0YXRpYyBpbnQKK3BjbmV0MzJfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIHVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdTE2IHN0YXR1czsKKyAgICBpbnQgZW50cnk7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisgICAgaWYgKG5ldGlmX21zZ190eF9xdWV1ZWQobHApKSB7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBwY25ldDMyX3N0YXJ0X3htaXQoKSBjYWxsZWQsIGNzcjAgJTQuNHguXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGxwLT5hLnJlYWRfY3NyKGlvYWRkciwgMCkpOworICAgIH0KKworICAgIC8qIERlZmF1bHQgc3RhdHVzIC0tIHdpbGwgbm90IGVuYWJsZSBTdWNjZXNzZnVsLVR4RG9uZQorICAgICAqIGludGVycnVwdCB3aGVuIHRoYXQgb3B0aW9uIGlzIGF2YWlsYWJsZSB0byB1cy4KKyAgICAgKi8KKyAgICBzdGF0dXMgPSAweDgzMDA7CisKKyAgICAvKiBGaWxsIGluIGEgVHggcmluZyBlbnRyeSAqLworCisgICAgLyogTWFzayB0byByaW5nIGJ1ZmZlciBib3VuZGFyeS4gKi8KKyAgICBlbnRyeSA9IGxwLT5jdXJfdHggJiBUWF9SSU5HX01PRF9NQVNLOworCisgICAgLyogQ2F1dGlvbjogdGhlIHdyaXRlIG9yZGVyIGlzIGltcG9ydGFudCBoZXJlLCBzZXQgdGhlIHN0YXR1cworICAgICAqIHdpdGggdGhlICJvd25lcnNoaXAiIGJpdHMgbGFzdC4gKi8KKworICAgIGxwLT50eF9yaW5nW2VudHJ5XS5sZW5ndGggPSBsZTE2X3RvX2NwdSgtc2tiLT5sZW4pOworCisgICAgbHAtPnR4X3JpbmdbZW50cnldLm1pc2MgPSAweDAwMDAwMDAwOworCisgICAgbHAtPnR4X3NrYnVmZltlbnRyeV0gPSBza2I7CisgICAgbHAtPnR4X2RtYV9hZGRyW2VudHJ5XSA9IHBjaV9tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLAorCSAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKyAgICBscC0+dHhfcmluZ1tlbnRyeV0uYmFzZSA9ICh1MzIpbGUzMl90b19jcHUobHAtPnR4X2RtYV9hZGRyW2VudHJ5XSk7CisgICAgd21iKCk7IC8qIE1ha2Ugc3VyZSBvd25lciBjaGFuZ2VzIGFmdGVyIGFsbCBvdGhlcnMgYXJlIHZpc2libGUgKi8KKyAgICBscC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzID0gbGUxNl90b19jcHUoc3RhdHVzKTsKKworICAgIGxwLT5jdXJfdHgrKzsKKyAgICBscC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKyAgICAvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSBzZW5kIHBvbGwuICovCisgICAgbHAtPmEud3JpdGVfY3NyIChpb2FkZHIsIDAsIDB4MDA0OCk7CisKKyAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworICAgIGlmIChscC0+dHhfcmluZ1soZW50cnkrMSkgJiBUWF9SSU5HX01PRF9NQVNLXS5iYXNlICE9IDApIHsKKwlscC0+dHhfZnVsbCA9IDE7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworICAgIH0KKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworICAgIHJldHVybiAwOworfQorCisvKiBUaGUgUENORVQzMiBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorcGNuZXQzMl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscDsKKyAgICB1bnNpZ25lZCBsb25nIGlvYWRkcjsKKyAgICB1MTYgY3NyMCxyYXA7CisgICAgaW50IGJvZ3VzY250ID0gIG1heF9pbnRlcnJ1cHRfd29yazsKKyAgICBpbnQgbXVzdF9yZXN0YXJ0OworCisgICAgaWYgKCFkZXYpIHsKKwlpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19JTlRSKQorCSAgICBwcmludGsgKEtFUk5fREVCVUcgIiVzKCk6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2VcbiIsCisJCV9fRlVOQ1RJT05fXywgaXJxKTsKKwlyZXR1cm4gSVJRX05PTkU7CisgICAgfQorCisgICAgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgbHAgPSBkZXYtPnByaXY7CisKKyAgICBzcGluX2xvY2soJmxwLT5sb2NrKTsKKworICAgIHJhcCA9IGxwLT5hLnJlYWRfcmFwKGlvYWRkcik7CisgICAgd2hpbGUgKChjc3IwID0gbHAtPmEucmVhZF9jc3IgKGlvYWRkciwgMCkpICYgMHg4ZjAwICYmIC0tYm9ndXNjbnQgPj0gMCkgeworCWlmIChjc3IwID09IDB4ZmZmZikgeworCSAgICBicmVhazsJCQkvKiBQQ01DSUEgcmVtb3ZlIGhhcHBlbmVkICovCisJfQorCS8qIEFja25vd2xlZGdlIGFsbCBvZiB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc291cmNlcyBBU0FQLiAqLworCWxwLT5hLndyaXRlX2NzciAoaW9hZGRyLCAwLCBjc3IwICYgfjB4MDA0Zik7CisKKwltdXN0X3Jlc3RhcnQgPSAwOworCisJaWYgKG5ldGlmX21zZ19pbnRyKGxwKSkKKwkgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcnJ1cHQgIGNzcjA9JSMyLjJ4IG5ldyBjc3I9JSMyLjJ4LlxuIiwKKwkJICAgZGV2LT5uYW1lLCBjc3IwLCBscC0+YS5yZWFkX2NzciAoaW9hZGRyLCAwKSk7CisKKwlpZiAoY3NyMCAmIDB4MDQwMCkJCS8qIFJ4IGludGVycnVwdCAqLworCSAgICBwY25ldDMyX3J4KGRldik7CisKKwlpZiAoY3NyMCAmIDB4MDIwMCkgewkJLyogVHgtZG9uZSBpbnRlcnJ1cHQgKi8KKwkgICAgdW5zaWduZWQgaW50IGRpcnR5X3R4ID0gbHAtPmRpcnR5X3R4OworCSAgICBpbnQgZGVsdGE7CisKKwkgICAgd2hpbGUgKGRpcnR5X3R4ICE9IGxwLT5jdXJfdHgpIHsKKwkJaW50IGVudHJ5ID0gZGlydHlfdHggJiBUWF9SSU5HX01PRF9NQVNLOworCQlpbnQgc3RhdHVzID0gKHNob3J0KWxlMTZfdG9fY3B1KGxwLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMpOworCisJCWlmIChzdGF0dXMgPCAwKQorCQkgICAgYnJlYWs7CQkvKiBJdCBzdGlsbCBoYXNuJ3QgYmVlbiBUeGVkICovCisKKwkJbHAtPnR4X3JpbmdbZW50cnldLmJhc2UgPSAwOworCisJCWlmIChzdGF0dXMgJiAweDQwMDApIHsKKwkJICAgIC8qIFRoZXJlIHdhcyBhbiBtYWpvciBlcnJvciwgbG9nIGl0LiAqLworCQkgICAgaW50IGVycl9zdGF0dXMgPSBsZTMyX3RvX2NwdShscC0+dHhfcmluZ1tlbnRyeV0ubWlzYyk7CisJCSAgICBscC0+c3RhdHMudHhfZXJyb3JzKys7CisJCSAgICBpZiAobmV0aWZfbXNnX3R4X2VycihscCkpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUeCBlcnJvciBzdGF0dXM9JTA0eCBlcnJfc3RhdHVzPSUwOHhcbiIsCisJCQkJZGV2LT5uYW1lLCBzdGF0dXMsIGVycl9zdGF0dXMpOworCQkgICAgaWYgKGVycl9zdGF0dXMgJiAweDA0MDAwMDAwKSBscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJICAgIGlmIChlcnJfc3RhdHVzICYgMHgwODAwMDAwMCkgbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCSAgICBpZiAoZXJyX3N0YXR1cyAmIDB4MTAwMDAwMDApIGxwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisjaWZuZGVmIERPX0RYU1VGTE8KKwkJICAgIGlmIChlcnJfc3RhdHVzICYgMHg0MDAwMDAwMCkgeworCQkJbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkvKiBBY2trISAgT24gRklGTyBlcnJvcnMgdGhlIFR4IHVuaXQgaXMgdHVybmVkIG9mZiEgKi8KKwkJCS8qIFJlbW92ZSB0aGlzIHZlcmJvc2l0eSBsYXRlciEgKi8KKwkJCWlmIChuZXRpZl9tc2dfdHhfZXJyKGxwKSkKKwkJCSAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBUeCBGSUZPIGVycm9yISBDU1IwPSU0LjR4XG4iLAorCQkJCSAgICBkZXYtPm5hbWUsIGNzcjApOworCQkJbXVzdF9yZXN0YXJ0ID0gMTsKKwkJICAgIH0KKyNlbHNlCisJCSAgICBpZiAoZXJyX3N0YXR1cyAmIDB4NDAwMDAwMDApIHsKKwkJCWxwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJaWYgKCEgbHAtPmR4c3VmbG8pIHsgIC8qIElmIGNvbnRyb2xsZXIgZG9lc24ndCByZWNvdmVyIC4uLiAqLworCQkJICAgIC8qIEFja2shICBPbiBGSUZPIGVycm9ycyB0aGUgVHggdW5pdCBpcyB0dXJuZWQgb2ZmISAqLworCQkJICAgIC8qIFJlbW92ZSB0aGlzIHZlcmJvc2l0eSBsYXRlciEgKi8KKwkJCSAgICBpZiAobmV0aWZfbXNnX3R4X2VycihscCkpCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVHggRklGTyBlcnJvciEgQ1NSMD0lNC40eFxuIiwKKwkJCQkJZGV2LT5uYW1lLCBjc3IwKTsKKwkJCSAgICBtdXN0X3Jlc3RhcnQgPSAxOworCQkJfQorCQkgICAgfQorI2VuZGlmCisJCX0gZWxzZSB7CisJCSAgICBpZiAoc3RhdHVzICYgMHgxODAwKQorCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJICAgIGxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCX0KKworCQkvKiBXZSBtdXN0IGZyZWUgdGhlIG9yaWdpbmFsIHNrYiAqLworCQlpZiAobHAtPnR4X3NrYnVmZltlbnRyeV0pIHsKKwkJICAgIHBjaV91bm1hcF9zaW5nbGUobHAtPnBjaV9kZXYsIGxwLT50eF9kbWFfYWRkcltlbnRyeV0sCisJCQlscC0+dHhfc2tidWZmW2VudHJ5XS0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJICAgIGRldl9rZnJlZV9za2JfaXJxKGxwLT50eF9za2J1ZmZbZW50cnldKTsKKwkJICAgIGxwLT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJICAgIGxwLT50eF9kbWFfYWRkcltlbnRyeV0gPSAwOworCQl9CisJCWRpcnR5X3R4Kys7CisJICAgIH0KKworCSAgICBkZWx0YSA9IChscC0+Y3VyX3R4IC0gZGlydHlfdHgpICYgKFRYX1JJTkdfTU9EX01BU0sgKyBUWF9SSU5HX1NJWkUpOworCSAgICBpZiAoZGVsdGEgPiBUWF9SSU5HX1NJWkUpIHsKKwkJaWYgKG5ldGlmX21zZ19kcnYobHApKQorCQkgICAgcHJpbnRrKEtFUk5fRVJSICIlczogb3V0LW9mLXN5bmMgZGlydHkgcG9pbnRlciwgJWQgdnMuICVkLCBmdWxsPSVkLlxuIiwKKwkJCSAgICBkZXYtPm5hbWUsIGRpcnR5X3R4LCBscC0+Y3VyX3R4LCBscC0+dHhfZnVsbCk7CisJCWRpcnR5X3R4ICs9IFRYX1JJTkdfU0laRTsKKwkJZGVsdGEgLT0gVFhfUklOR19TSVpFOworCSAgICB9CisKKwkgICAgaWYgKGxwLT50eF9mdWxsICYmCisJCW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJgorCQlkZWx0YSA8IFRYX1JJTkdfU0laRSAtIDIpIHsKKwkJLyogVGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwsIGNsZWFyIHRidXN5LiAqLworCQlscC0+dHhfZnVsbCA9IDA7CisJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJICAgIH0KKwkgICAgbHAtPmRpcnR5X3R4ID0gZGlydHlfdHg7CisJfQorCisJLyogTG9nIG1pc2MgZXJyb3JzLiAqLworCWlmIChjc3IwICYgMHg0MDAwKSBscC0+c3RhdHMudHhfZXJyb3JzKys7IC8qIFR4IGJhYmJsZS4gKi8KKwlpZiAoY3NyMCAmIDB4MTAwMCkgeworCSAgICAvKgorCSAgICAgKiB0aGlzIGhhcHBlbnMgd2hlbiBvdXIgcmVjZWl2ZSByaW5nIGlzIGZ1bGwuIFRoaXMgc2hvdWxkbid0CisJICAgICAqIGJlIGEgcHJvYmxlbSBhcyB3ZSB3aWxsIHNlZSBub3JtYWwgcnggaW50ZXJydXB0cyBmb3IgdGhlIGZyYW1lcworCSAgICAgKiBpbiB0aGUgcmVjZWl2ZSByaW5nLiBCdXQgdGhlcmUgYXJlIHNvbWUgUENJIGNoaXBzZXRzIChJIGNhbgorCSAgICAgKiByZXByb2R1Y2UgdGhpcyBvbiBTUDNHIHdpdGggSW50ZWwgc2F0dXJuIGNoaXBzZXQpIHdoaWNoIGhhdmUKKwkgICAgICogc29tZXRpbWVzIHByb2JsZW1zIGFuZCB3aWxsIGZpbGwgdXAgdGhlIHJlY2VpdmUgcmluZyB3aXRoCisJICAgICAqIGVycm9yIGRlc2NyaXB0b3JzLiBJbiB0aGlzIHNpdHVhdGlvbiB3ZSBkb24ndCBnZXQgYSByeAorCSAgICAgKiBpbnRlcnJ1cHQsIGJ1dCBhIG1pc3NlZCBmcmFtZSBpbnRlcnJ1cHQgc29vbmVyIG9yIGxhdGVyLgorCSAgICAgKiBTbyB3ZSB0cnkgdG8gY2xlYW4gdXAgb3VyIHJlY2VpdmUgcmluZyBoZXJlLgorCSAgICAgKi8KKwkgICAgcGNuZXQzMl9yeChkZXYpOworCSAgICBscC0+c3RhdHMucnhfZXJyb3JzKys7IC8qIE1pc3NlZCBhIFJ4IGZyYW1lLiAqLworCX0KKwlpZiAoY3NyMCAmIDB4MDgwMCkgeworCSAgICBpZiAobmV0aWZfbXNnX2RydihscCkpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEJ1cyBtYXN0ZXIgYXJiaXRyYXRpb24gZmFpbHVyZSwgc3RhdHVzICU0LjR4LlxuIiwKKwkJCWRldi0+bmFtZSwgY3NyMCk7CisJICAgIC8qIHVubGlrZSBmb3IgdGhlIGxhbmNlLCB0aGVyZSBpcyBubyByZXN0YXJ0IG5lZWRlZCAqLworCX0KKworCWlmIChtdXN0X3Jlc3RhcnQpIHsKKwkgICAgLyogcmVzZXQgdGhlIGNoaXAgdG8gY2xlYXIgdGhlIGVycm9yIGNvbmRpdGlvbiwgdGhlbiByZXN0YXJ0ICovCisJICAgIGxwLT5hLnJlc2V0KGlvYWRkcik7CisJICAgIGxwLT5hLndyaXRlX2Nzcihpb2FkZHIsIDQsIDB4MDkxNSk7CisJICAgIHBjbmV0MzJfcmVzdGFydChkZXYsIDB4MDAwMik7CisJICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisgICAgfQorCisgICAgLyogU2V0IGludGVycnVwdCBlbmFibGUuICovCisgICAgbHAtPmEud3JpdGVfY3NyIChpb2FkZHIsIDAsIDB4MDA0MCk7CisgICAgbHAtPmEud3JpdGVfcmFwIChpb2FkZHIscmFwKTsKKworICAgIGlmIChuZXRpZl9tc2dfaW50cihscCkpCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleGl0aW5nIGludGVycnVwdCwgY3NyMD0lIzQuNHguXG4iLAorCQlkZXYtPm5hbWUsIGxwLT5hLnJlYWRfY3NyIChpb2FkZHIsIDApKTsKKworICAgIHNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisKKyAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQKK3BjbmV0MzJfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgcGNuZXQzMl9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKyAgICBpbnQgZW50cnkgPSBscC0+Y3VyX3J4ICYgUlhfUklOR19NT0RfTUFTSzsKKyAgICBpbnQgYm9ndXNjbnQgPSBSWF9SSU5HX1NJWkUgLyAyOworCisgICAgLyogSWYgd2Ugb3duIHRoZSBuZXh0IGVudHJ5LCBpdCdzIGEgbmV3IHBhY2tldC4gU2VuZCBpdCB1cC4gKi8KKyAgICB3aGlsZSAoKHNob3J0KWxlMTZfdG9fY3B1KGxwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMpID49IDApIHsKKwlpbnQgc3RhdHVzID0gKHNob3J0KWxlMTZfdG9fY3B1KGxwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMpID4+IDg7CisKKwlpZiAoc3RhdHVzICE9IDB4MDMpIHsJCQkvKiBUaGVyZSB3YXMgYW4gZXJyb3IuICovCisJICAgIC8qCisJICAgICAqIFRoZXJlIGlzIGEgdHJpY2t5IGVycm9yIG5vdGVkIGJ5IEpvaG4gTXVycGh5LAorCSAgICAgKiA8bXVyZkBwZXJmdGVjaC5jb20+IHRvIFJ1c3MgTmVsc29uOiBFdmVuIHdpdGggZnVsbC1zaXplZAorCSAgICAgKiBidWZmZXJzIGl0J3MgcG9zc2libGUgZm9yIGEgamFiYmVyIHBhY2tldCB0byB1c2UgdHdvCisJICAgICAqIGJ1ZmZlcnMsIHdpdGggb25seSB0aGUgbGFzdCBjb3JyZWN0bHkgbm90aW5nIHRoZSBlcnJvci4KKwkgICAgICovCisJICAgIGlmIChzdGF0dXMgJiAweDAxKQkvKiBPbmx5IGNvdW50IGEgZ2VuZXJhbCBlcnJvciBhdCB0aGUgKi8KKwkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOyAvKiBlbmQgb2YgYSBwYWNrZXQuKi8KKwkgICAgaWYgKHN0YXR1cyAmIDB4MjApIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkgICAgaWYgKHN0YXR1cyAmIDB4MTApIGxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCSAgICBpZiAoc3RhdHVzICYgMHgwOCkgbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkgICAgaWYgKHN0YXR1cyAmIDB4MDQpIGxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCSAgICBscC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzICY9IGxlMTZfdG9fY3B1KDB4MDNmZik7CisJfSBlbHNlIHsKKwkgICAgLyogTWFsbG9jIHVwIG5ldyBidWZmZXIsIGNvbXBhdGlibGUgd2l0aCBuZXQtMmUuICovCisJICAgIHNob3J0IHBrdF9sZW4gPSAobGUzMl90b19jcHUobHAtPnJ4X3JpbmdbZW50cnldLm1zZ19sZW5ndGgpICYgMHhmZmYpLTQ7CisJICAgIHN0cnVjdCBza19idWZmICpza2I7CisKKwkgICAgLyogRGlzY2FyZCBvdmVyc2l6ZSBmcmFtZXMuICovCisJICAgIGlmICh1bmxpa2VseShwa3RfbGVuID4gUEtUX0JVRl9TWiAtIDIpKSB7CisJCWlmIChuZXRpZl9tc2dfZHJ2KGxwKSkKKwkJICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IEltcG9zc2libGUgcGFja2V0IHNpemUgJWQhXG4iLAorCQkJICAgIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkgICAgfSBlbHNlIGlmIChwa3RfbGVuIDwgNjApIHsKKwkJaWYgKG5ldGlmX21zZ19yeF9lcnIobHApKQorCQkgICAgcHJpbnRrKEtFUk5fRVJSICIlczogUnVudCBwYWNrZXQhXG4iLCBkZXYtPm5hbWUpOworCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJICAgIH0gZWxzZSB7CisJCWludCByeF9pbl9wbGFjZSA9IDA7CisKKwkJaWYgKHBrdF9sZW4gPiByeF9jb3B5YnJlYWspIHsKKwkJICAgIHN0cnVjdCBza19idWZmICpuZXdza2I7CisKKwkJICAgIGlmICgobmV3c2tiID0gZGV2X2FsbG9jX3NrYihQS1RfQlVGX1NaKSkpIHsKKwkJCXNrYl9yZXNlcnZlIChuZXdza2IsIDIpOworCQkJc2tiID0gbHAtPnJ4X3NrYnVmZltlbnRyeV07CisJCQlwY2lfdW5tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LCBscC0+cnhfZG1hX2FkZHJbZW50cnldLAorCQkJCVBLVF9CVUZfU1otMiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXNrYl9wdXQgKHNrYiwgcGt0X2xlbik7CisJCQlscC0+cnhfc2tidWZmW2VudHJ5XSA9IG5ld3NrYjsKKwkJCW5ld3NrYi0+ZGV2ID0gZGV2OworCQkJbHAtPnJ4X2RtYV9hZGRyW2VudHJ5XSA9CisJCQkgICAgcGNpX21hcF9zaW5nbGUobHAtPnBjaV9kZXYsIG5ld3NrYi0+dGFpbCwKKwkJCQkgICAgUEtUX0JVRl9TWi0yLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJbHAtPnJ4X3JpbmdbZW50cnldLmJhc2UgPSBsZTMyX3RvX2NwdShscC0+cnhfZG1hX2FkZHJbZW50cnldKTsKKwkJCXJ4X2luX3BsYWNlID0gMTsKKwkJICAgIH0gZWxzZQorCQkJc2tiID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJICAgIHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbisyKTsKKwkJfQorCisJCWlmIChza2IgPT0gTlVMTCkgeworCQkgICAgaW50IGk7CisJCSAgICBpZiAobmV0aWZfbXNnX2RydihscCkpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZGVmZXJyaW5nIHBhY2tldC5cbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJICAgIGZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykKKwkJCWlmICgoc2hvcnQpbGUxNl90b19jcHUobHAtPnJ4X3JpbmdbKGVudHJ5K2kpCisJCQkJICAgICYgUlhfUklOR19NT0RfTUFTS10uc3RhdHVzKSA8IDApCisJCQkgICAgYnJlYWs7CisKKwkJICAgIGlmIChpID4gUlhfUklOR19TSVpFIC0yKSB7CisJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJbHAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyB8PSBsZTE2X3RvX2NwdSgweDgwMDApOworCQkJd21iKCk7CS8qIE1ha2Ugc3VyZSBhZGFwdGVyIHNlZXMgb3duZXIgY2hhbmdlICovCisJCQlscC0+Y3VyX3J4Kys7CisJCSAgICB9CisJCSAgICBicmVhazsKKwkJfQorCQlza2ItPmRldiA9IGRldjsKKwkJaWYgKCFyeF9pbl9wbGFjZSkgeworCQkgICAgc2tiX3Jlc2VydmUoc2tiLDIpOyAvKiAxNiBieXRlIGFsaWduICovCisJCSAgICBza2JfcHV0KHNrYixwa3RfbGVuKTsJLyogTWFrZSByb29tICovCisJCSAgICBwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobHAtPnBjaV9kZXYsCisJCQkJCQlscC0+cnhfZG1hX2FkZHJbZW50cnldLAorCQkJCQkJUEtUX0JVRl9TWi0yLAorCQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJICAgIGV0aF9jb3B5X2FuZF9zdW0oc2tiLAorCQkJICAgICh1bnNpZ25lZCBjaGFyICopKGxwLT5yeF9za2J1ZmZbZW50cnldLT50YWlsKSwKKwkJCSAgICBwa3RfbGVuLDApOworCQkgICAgcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGxwLT5wY2lfZGV2LAorCQkJCQkJICAgbHAtPnJ4X2RtYV9hZGRyW2VudHJ5XSwKKwkJCQkJCSAgIFBLVF9CVUZfU1otMiwKKwkJCQkJCSAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCX0KKwkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCQluZXRpZl9yeChza2IpOworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCSAgICB9CisJfQorCS8qCisJICogVGhlIGRvY3Mgc2F5IHRoYXQgdGhlIGJ1ZmZlciBsZW5ndGggaXNuJ3QgdG91Y2hlZCwgYnV0IEFuZHJldyBCb3lkCisJICogb2YgUU5YIHJlcG9ydHMgdGhhdCBzb21lIHJldnMgb2YgdGhlIDc5Qzk2NSBjbGVhciBpdC4KKwkgKi8KKwlscC0+cnhfcmluZ1tlbnRyeV0uYnVmX2xlbmd0aCA9IGxlMTZfdG9fY3B1KDItUEtUX0JVRl9TWik7CisJd21iKCk7IC8qIE1ha2Ugc3VyZSBvd25lciBjaGFuZ2VzIGFmdGVyIGFsbCBvdGhlcnMgYXJlIHZpc2libGUgKi8KKwlscC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzIHw9IGxlMTZfdG9fY3B1KDB4ODAwMCk7CisJZW50cnkgPSAoKytscC0+Y3VyX3J4KSAmIFJYX1JJTkdfTU9EX01BU0s7CisJaWYgKC0tYm9ndXNjbnQgPD0gMCkgYnJlYWs7CS8qIGRvbid0IHN0YXkgaW4gbG9vcCBmb3JldmVyICovCisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3BjbmV0MzJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICB1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIGludCBpOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBkZWxfdGltZXJfc3luYygmbHAtPndhdGNoZG9nX3RpbWVyKTsKKworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisgICAgbHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSBscC0+YS5yZWFkX2NzciAoaW9hZGRyLCAxMTIpOworCisgICAgaWYgKG5ldGlmX21zZ19pZmRvd24obHApKQorCXByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQsIHN0YXR1cyB3YXMgJTIuMnguXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGxwLT5hLnJlYWRfY3NyIChpb2FkZHIsIDApKTsKKworICAgIC8qIFdlIHN0b3AgdGhlIFBDTkVUMzIgaGVyZSAtLSBpdCBvY2Nhc2lvbmFsbHkgcG9sbHMgbWVtb3J5IGlmIHdlIGRvbid0LiAqLworICAgIGxwLT5hLndyaXRlX2NzciAoaW9hZGRyLCAwLCAweDAwMDQpOworCisgICAgLyoKKyAgICAgKiBTd2l0Y2ggYmFjayB0byAxNmJpdCBtb2RlIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggZHVtYgorICAgICAqIERPUyBwYWNrZXQgZHJpdmVyIGFmdGVyIGEgd2FybSByZWJvb3QKKyAgICAgKi8KKyAgICBscC0+YS53cml0ZV9iY3IgKGlvYWRkciwgMjAsIDQpOworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworICAgIGZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisKKyAgICAvKiBmcmVlIGFsbCBhbGxvY2F0ZWQgc2tidWZmcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCWxwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJd21iKCk7CQkvKiBNYWtlIHN1cmUgYWRhcHRlciBzZWVzIG93bmVyIGNoYW5nZSAqLworCWlmIChscC0+cnhfc2tidWZmW2ldKSB7CisJICAgIHBjaV91bm1hcF9zaW5nbGUobHAtPnBjaV9kZXYsIGxwLT5yeF9kbWFfYWRkcltpXSwgUEtUX0JVRl9TWi0yLAorCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkgICAgZGV2X2tmcmVlX3NrYihscC0+cnhfc2tidWZmW2ldKTsKKwl9CisJbHAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJbHAtPnJ4X2RtYV9hZGRyW2ldID0gMDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwlscC0+dHhfcmluZ1tpXS5zdGF0dXMgPSAwOwkvKiBDUFUgb3ducyBidWZmZXIgKi8KKwl3bWIoKTsJCS8qIE1ha2Ugc3VyZSBhZGFwdGVyIHNlZXMgb3duZXIgY2hhbmdlICovCisJaWYgKGxwLT50eF9za2J1ZmZbaV0pIHsKKwkgICAgcGNpX3VubWFwX3NpbmdsZShscC0+cGNpX2RldiwgbHAtPnR4X2RtYV9hZGRyW2ldLAorCQkgICAgbHAtPnR4X3NrYnVmZltpXS0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkgICAgZGV2X2tmcmVlX3NrYihscC0+dHhfc2tidWZmW2ldKTsKKwl9CisJbHAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJbHAtPnR4X2RtYV9hZGRyW2ldID0gMDsKKyAgICB9CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCitwY25ldDMyX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIHVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdTE2IHNhdmVkX2FkZHI7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworICAgIHNhdmVkX2FkZHIgPSBscC0+YS5yZWFkX3JhcChpb2FkZHIpOworICAgIGxwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gbHAtPmEucmVhZF9jc3IgKGlvYWRkciwgMTEyKTsKKyAgICBscC0+YS53cml0ZV9yYXAoaW9hZGRyLCBzYXZlZF9hZGRyKTsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qIHRha2VuIGZyb20gdGhlIHN1bmxhbmNlIGRyaXZlciwgd2hpY2ggaXQgdG9vayBmcm9tIHRoZSBkZXBjYSBkcml2ZXIgKi8KK3N0YXRpYyB2b2lkIHBjbmV0MzJfbG9hZF9tdWx0aWNhc3QgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgdm9sYXRpbGUgc3RydWN0IHBjbmV0MzJfaW5pdF9ibG9jayAqaWIgPSAmbHAtPmluaXRfYmxvY2s7CisgICAgdm9sYXRpbGUgdTE2ICptY2FzdF90YWJsZSA9ICh1MTYgKikmaWItPmZpbHRlcjsKKyAgICBzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaT1kZXYtPm1jX2xpc3Q7CisgICAgY2hhciAqYWRkcnM7CisgICAgaW50IGk7CisgICAgdTMyIGNyYzsKKworICAgIC8qIHNldCBhbGwgbXVsdGljYXN0IGJpdHMgKi8KKyAgICBpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCWliLT5maWx0ZXJbMF0gPSAweGZmZmZmZmZmOworCWliLT5maWx0ZXJbMV0gPSAweGZmZmZmZmZmOworCXJldHVybjsKKyAgICB9CisgICAgLyogY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgKi8KKyAgICBpYi0+ZmlsdGVyWzBdID0gMDsKKyAgICBpYi0+ZmlsdGVyWzFdID0gMDsKKworICAgIC8qIEFkZCBhZGRyZXNzZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrKSB7CisJYWRkcnMgPSBkbWktPmRtaV9hZGRyOworCWRtaSAgID0gZG1pLT5uZXh0OworCisJLyogbXVsdGljYXN0IGFkZHJlc3M/ICovCisJaWYgKCEoKmFkZHJzICYgMSkpCisJICAgIGNvbnRpbnVlOworCisJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGFkZHJzKTsKKwljcmMgPSBjcmMgPj4gMjY7CisJbWNhc3RfdGFibGUgW2NyYyA+PiA0XSA9IGxlMTZfdG9fY3B1KAorCQlsZTE2X3RvX2NwdShtY2FzdF90YWJsZSBbY3JjID4+IDRdKSB8ICgxIDw8IChjcmMgJiAweGYpKSk7CisgICAgfQorICAgIHJldHVybjsKK30KKworCisvKgorICogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgKi8KK3N0YXRpYyB2b2lkIHBjbmV0MzJfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciwgZmxhZ3M7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICBpZiAoZGV2LT5mbGFncyZJRkZfUFJPTUlTQykgeworCS8qIExvZyBhbnkgbmV0IHRhcHMuICovCisJaWYgKG5ldGlmX21zZ19odyhscCkpCisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLCBkZXYtPm5hbWUpOworCWxwLT5pbml0X2Jsb2NrLm1vZGUgPSBsZTE2X3RvX2NwdSgweDgwMDAgfCAobHAtPm9wdGlvbnMgJiBQQ05FVDMyX1BPUlRfUE9SVFNFTCkgPDwgNyk7CisgICAgfSBlbHNlIHsKKwlscC0+aW5pdF9ibG9jay5tb2RlID0gbGUxNl90b19jcHUoKGxwLT5vcHRpb25zICYgUENORVQzMl9QT1JUX1BPUlRTRUwpIDw8IDcpOworCXBjbmV0MzJfbG9hZF9tdWx0aWNhc3QgKGRldik7CisgICAgfQorCisgICAgbHAtPmEud3JpdGVfY3NyIChpb2FkZHIsIDAsIDB4MDAwNCk7IC8qIFRlbXBvcmFyaWx5IHN0b3AgdGhlIGxhbmNlLiAqLworICAgIHBjbmV0MzJfcmVzdGFydChkZXYsIDB4MDA0Mik7IC8qICBSZXN1bWUgbm9ybWFsIG9wZXJhdGlvbiAqLworICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIFRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgdGhlIGxwLT5sb2NrIGlzIGhlbGQgKi8KK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCByZWdfbnVtKQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIHVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgdTE2IHZhbF9vdXQ7CisKKyAgICBpZiAoIWxwLT5taWkpCisJcmV0dXJuIDA7CisKKyAgICBscC0+YS53cml0ZV9iY3IoaW9hZGRyLCAzMywgKChwaHlfaWQgJiAweDFmKSA8PCA1KSB8IChyZWdfbnVtICYgMHgxZikpOworICAgIHZhbF9vdXQgPSBscC0+YS5yZWFkX2Jjcihpb2FkZHIsIDM0KTsKKworICAgIHJldHVybiB2YWxfb3V0OworfQorCisvKiBUaGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0IHRoZSBscC0+bG9jayBpcyBoZWxkICovCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCByZWdfbnVtLCBpbnQgdmFsKQoreworICAgIHN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworICAgIHVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBpZiAoIWxwLT5taWkpCisJcmV0dXJuOworCisgICAgbHAtPmEud3JpdGVfYmNyKGlvYWRkciwgMzMsICgocGh5X2lkICYgMHgxZikgPDwgNSkgfCAocmVnX251bSAmIDB4MWYpKTsKKyAgICBscC0+YS53cml0ZV9iY3IoaW9hZGRyLCAzNCwgdmFsKTsKK30KKworc3RhdGljIGludCBwY25ldDMyX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgaW50IHJjOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICAvKiBTSU9DW0dTXU1JSXh4eCBpb2N0bHMgKi8KKyAgICBpZiAobHAtPm1paSkgeworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCXJjID0gZ2VuZXJpY19taWlfaW9jdGwoJmxwLT5taWlfaWYsIGlmX21paShycSksIGNtZCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICB9IGVsc2UgeworCXJjID0gLUVPUE5PVFNVUFA7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBwY25ldDMyX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIC8qIFByaW50IHRoZSBsaW5rIHN0YXR1cyBpZiBpdCBoYXMgY2hhbmdlZCAqLworICAgIGlmIChscC0+bWlpKSB7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJbWlpX2NoZWNrX21lZGlhICgmbHAtPm1paV9pZiwgbmV0aWZfbXNnX2xpbmsobHApLCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworICAgIH0KKworICAgIG1vZF90aW1lciAoJihscC0+d2F0Y2hkb2dfdGltZXIpLCBQQ05FVDMyX1dBVENIRE9HX1RJTUVPVVQpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcGNuZXQzMl9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKyAgICBpZiAoZGV2KSB7CisJc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBQQ05FVDMyX1RPVEFMX1NJWkUpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQobHAtPnBjaV9kZXYsIHNpemVvZigqbHApLCBscCwgbHAtPmRtYV9hZGRyKTsKKwlmcmVlX25ldGRldihkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisgICAgfQorfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcGNuZXQzMl9kcml2ZXIgPSB7CisgICAgLm5hbWUJPSBEUlZfTkFNRSwKKyAgICAucHJvYmUJPSBwY25ldDMyX3Byb2JlX3BjaSwKKyAgICAucmVtb3ZlCT0gX19kZXZleGl0X3AocGNuZXQzMl9yZW1vdmVfb25lKSwKKyAgICAuaWRfdGFibGUJPSBwY25ldDMyX3BjaV90YmwsCit9OworCisvKiBBbiBhZGRpdGlvbmFsIHBhcmFtZXRlciB0aGF0IG1heSBiZSBwYXNzZWQgaW4uLi4gKi8KK3N0YXRpYyBpbnQgZGVidWcgPSAtMTsKK3N0YXRpYyBpbnQgdHhfc3RhcnRfcHQgPSAtMTsKK3N0YXRpYyBpbnQgcGNuZXQzMl9oYXZlX3BjaTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgRFJWX05BTUUgIiBkZWJ1ZyBsZXZlbCIpOworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWF4X2ludGVycnVwdF93b3JrLCBEUlZfTkFNRSAiIG1heGltdW0gZXZlbnRzIGhhbmRsZWQgcGVyIGludGVycnVwdCIpOworbW9kdWxlX3BhcmFtKHJ4X2NvcHlicmVhaywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocnhfY29weWJyZWFrLCBEUlZfTkFNRSAiIGNvcHkgYnJlYWtwb2ludCBmb3IgY29weS1vbmx5LXRpbnktZnJhbWVzIik7Cittb2R1bGVfcGFyYW0odHhfc3RhcnRfcHQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHR4X3N0YXJ0X3B0LCBEUlZfTkFNRSAiIHRyYW5zbWl0IHN0YXJ0IHBvaW50ICgwLTMpIik7Cittb2R1bGVfcGFyYW0ocGNuZXQzMnZsYiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocGNuZXQzMnZsYiwgRFJWX05BTUUgIiBWZXNhIGxvY2FsIGJ1cyAoVkxCKSBzdXBwb3J0ICgwLzEpIik7Cittb2R1bGVfcGFyYW1fYXJyYXkob3B0aW9ucywgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mob3B0aW9ucywgRFJWX05BTUUgIiBpbml0aWFsIG9wdGlvbiBzZXR0aW5nKHMpICgwLTE1KSIpOworbW9kdWxlX3BhcmFtX2FycmF5KGZ1bGxfZHVwbGV4LCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhmdWxsX2R1cGxleCwgRFJWX05BTUUgIiBmdWxsIGR1cGxleCBzZXR0aW5nKHMpICgxKSIpOworLyogTW9kdWxlIFBhcmFtZXRlciBmb3IgSG9tZVBOQSBjYXJkcyBhZGRlZCBieSBQYXRyaWNrIFNpbW1vbnMsIDIwMDQgKi8KK21vZHVsZV9wYXJhbV9hcnJheShob21lcG5hLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhob21lcG5hLCBEUlZfTkFNRSAiIG1vZGUgZm9yIDc5Qzk3OCBjYXJkcyAoMSBmb3IgSG9tZVBOQSwgMCBmb3IgRXRoZXJuZXQsIGRlZmF1bHQgRXRoZXJuZXQiKTsKKworTU9EVUxFX0FVVEhPUigiVGhvbWFzIEJvZ2VuZG9lcmZlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIFBDbmV0MzIgYW5kIFBDbmV0UENJIGJhc2VkIGV0aGVyY2FyZHMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBQQ05FVDMyX01TR19ERUZBVUxUIChORVRJRl9NU0dfRFJWIHwgTkVUSUZfTVNHX1BST0JFIHwgTkVUSUZfTVNHX0xJTkspCisKK3N0YXRpYyBpbnQgX19pbml0IHBjbmV0MzJfaW5pdF9tb2R1bGUodm9pZCkKK3sKKyAgICBwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworCisgICAgcGNuZXQzMl9kZWJ1ZyA9IG5ldGlmX21zZ19pbml0KGRlYnVnLCBQQ05FVDMyX01TR19ERUZBVUxUKTsKKworICAgIGlmICgodHhfc3RhcnRfcHQgPj0gMCkgJiYgKHR4X3N0YXJ0X3B0IDw9IDMpKQorCXR4X3N0YXJ0ID0gdHhfc3RhcnRfcHQ7CisKKyAgICAvKiBmaW5kIHRoZSBQQ0kgZGV2aWNlcyAqLworICAgIGlmICghcGNpX21vZHVsZV9pbml0KCZwY25ldDMyX2RyaXZlcikpCisJcGNuZXQzMl9oYXZlX3BjaSA9IDE7CisKKyAgICAvKiBzaG91bGQgd2UgZmluZCBhbnkgcmVtYWluaW5nIFZMYnVzIGRldmljZXMgPyAqLworICAgIGlmIChwY25ldDMydmxiKQorCXBjbmV0MzJfcHJvYmVfdmxidXMoKTsKKworICAgIGlmIChjYXJkc19mb3VuZCAmJiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19QUk9CRSkpCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVkIGNhcmRzX2ZvdW5kLlxuIiwgY2FyZHNfZm91bmQpOworCisgICAgcmV0dXJuIChwY25ldDMyX2hhdmVfcGNpICsgY2FyZHNfZm91bmQpID8gMCA6IC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwY25ldDMyX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5leHRfZGV2OworCisgICAgd2hpbGUgKHBjbmV0MzJfZGV2KSB7CisJc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBwY25ldDMyX2Rldi0+cHJpdjsKKwluZXh0X2RldiA9IGxwLT5uZXh0OworCXVucmVnaXN0ZXJfbmV0ZGV2KHBjbmV0MzJfZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihwY25ldDMyX2Rldi0+YmFzZV9hZGRyLCBQQ05FVDMyX1RPVEFMX1NJWkUpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQobHAtPnBjaV9kZXYsIHNpemVvZigqbHApLCBscCwgbHAtPmRtYV9hZGRyKTsKKwlmcmVlX25ldGRldihwY25ldDMyX2Rldik7CisJcGNuZXQzMl9kZXYgPSBuZXh0X2RldjsKKyAgICB9CisKKyAgICBpZiAocGNuZXQzMl9oYXZlX3BjaSkKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnBjbmV0MzJfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocGNuZXQzMl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChwY25ldDMyX2NsZWFudXBfbW9kdWxlKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWluZGVudC1sZXZlbDogNAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wbGlwLmMgYi9kcml2ZXJzL25ldC9wbGlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRiNjI0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BsaXAuYwpAQCAtMCwwICsxLDE0MjcgQEAKKy8qICRJZDogcGxpcC5jLHYgMS4zLjYuMiAxOTk3LzA0LzE2IDE1OjA3OjU2IHBoaWwgRXhwICQgKi8KKy8qIFBMSVA6IEEgcGFyYWxsZWwgcG9ydCAibmV0d29yayIgZHJpdmVyIGZvciBMaW51eC4gKi8KKy8qIFRoaXMgZHJpdmVyIGlzIGZvciBwYXJhbGxlbCBwb3J0IHdpdGggNS1iaXQgY2FibGUgKExhcExpbmsgKFIpIGNhYmxlKS4gKi8KKy8qCisgKiBBdXRob3JzOglEb25hbGQgQmVja2VyIDxiZWNrZXJAc2N5bGQuY29tPgorICoJCVRvbW15IFRob3JuIDx0aG9ybkBkYWltaS5hYXUuZGs+CisgKgkJVGFuYWJlIEhpcm95YXN1IDxoaXJvQHNhbnBvLnQudS10b2t5by5hYy5qcD4KKyAqCQlBbGFuIENveCA8Z3c0cHRzQGd3NHB0cy5hbXByLm9yZz4KKyAqCQlQZXRlciBCYXVlciA8MTAwMTM2LjM1MzBAY29tcHVzZXJ2ZS5jb20+CisgKgkJTmlpYmUgWXV0YWthIDxnbmlpYmVAbXJpLmNvLmpwPgorICoJCU5pbXJvZCBaaW1lcm1hbiA8emltZXJtYW5AbWFpbGFuZG5ld3MuY29tPgorICoKKyAqIEVuaGFuY2VtZW50czoKKyAqCQlNb2R1bGFyaXphdGlvbiBhbmQgaWZyZXEvaWZtYXAgc3VwcG9ydCBieSBBbGFuIENveC4KKyAqCQlSZXdyaXR0ZW4gYnkgTmlpYmUgWXV0YWthLgorICoJCXBhcnBvcnQtc2hhcmluZyBhd2FyZW5lc3MgY29kZSBieSBQaGlsaXAgQmx1bmRlbGwuCisgKgkJU01QIGxvY2tpbmcgYnkgTmlpYmUgWXV0YWthLgorICoJCVN1cHBvcnQgZm9yIHBhcmFsbGVsIHBvcnRzIHdpdGggbm8gSVJRIChwb2xsIG1vZGUpLAorICoJCU1vZGlmaWNhdGlvbnMgdG8gdXNlIHRoZSBwYXJhbGxlbCBwb3J0IEFQSSAKKyAqCQlieSBOaW1yb2QgWmltZXJtYW4uCisgKgorICogRml4ZXM6CisgKgkJTmlpYmUgWXV0YWthCisgKgkJICAtIE1vZHVsZSBpbml0aWFsaXphdGlvbi4KKyAqCQkgIC0gTVRVIGZpeC4KKyAqCQkgIC0gTWFrZSBzdXJlIG90aGVyIGVuZCBpcyBPSywgYmVmb3JlIHNlbmRpbmcgYSBwYWNrZXQuCisgKgkJICAtIEZpeCBpbW1lZGlhdGUgdGltZXIgcHJvYmxlbS4KKyAqCisgKgkJQWwgVmlybworICoJCSAgLSBDaGFuZ2VkIHtlbmFibGUsZGlzYWJsZX1faXJxIGhhbmRsaW5nIHRvIG1ha2UgaXQgd29yaworICoJCSAgICB3aXRoIG5ldyAoInN0YWNrIikgc2VtYW50aWNzLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy8qCisgKiBPcmlnaW5hbCB2ZXJzaW9uIGFuZCB0aGUgbmFtZSAnUExJUCcgZnJvbSBEb25hbGQgQmVja2VyIDxiZWNrZXJAc2N5bGQuY29tPgorICogaW5zcGlyZWQgYnkgUnVzcyBOZWxzb24ncyBwYXJhbGxlbCBwb3J0IHBhY2tldCBkcml2ZXIuCisgKgorICogTk9URToKKyAqICAgICBUYW5hYmUgSGlyb3lhc3UgaGFkIGNoYW5nZWQgdGhlIHByb3RvY29sLCBhbmQgaXQgd2FzIGluIExpbnV4IHYxLjAuCisgKiAgICAgQmVjYXVzZSBvZiB0aGUgbmVjZXNzaXR5IHRvIGNvbW11bmljYXRlIHRvIERPUyBtYWNoaW5lcyB3aXRoIHRoZQorICogICAgIENyeW53ciBwYWNrZXQgZHJpdmVyLCBQZXRlciBCYXVlciBjaGFuZ2VkIHRoZSBwcm90b2NvbCBhZ2FpbgorICogICAgIGJhY2sgdG8gb3JpZ2luYWwgcHJvdG9jb2wuCisgKgorICogICAgIFRoaXMgdmVyc2lvbiBmb2xsb3dzIG9yaWdpbmFsIFBMSVAgcHJvdG9jb2wuCisgKiAgICAgU28sIHRoaXMgUExJUCBjYW4ndCBjb21tdW5pY2F0ZSB0aGUgUExJUCBvZiBMaW51eCB2MS4wLgorICovCisKKy8qCisgKiAgICAgVG8gdXNlIHdpdGggRE9TIGJveCwgcGxlYXNlIGRvIChUdXJuIG9uIEFSUCBzd2l0Y2gpOgorICoJIyBpZmNvbmZpZyBwbGlwWzAtMl0gYXJwCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9ICJORVQzIFBMSVAgdmVyc2lvbiAyLjQtcGFycG9ydCBnbmlpYmVAbXJpLmNvLmpwXG4iOworCisvKgorICBTb3VyY2VzOgorCUlkZWFzIGFuZCBwcm90b2NvbHMgY2FtZSBmcm9tIFJ1c3MgTmVsc29uJ3MgPG5lbHNvbkBjcnlud3IuY29tPgorCSJwYXJhbGxlbC5hc20iIHBhcmFsbGVsIHBvcnQgcGFja2V0IGRyaXZlci4KKworICBUaGUgIkNyeW53ciIgcGFyYWxsZWwgcG9ydCBzdGFuZGFyZCBzcGVjaWZpZXMgdGhlIGZvbGxvd2luZyBwcm90b2NvbDoKKyAgICBUcmlnZ2VyIGJ5IHNlbmRpbmcgbmliYmxlICcweDgnICh0aGlzIGNhdXNlcyBpbnRlcnJ1cHQgb24gb3RoZXIgZW5kKQorICAgIGNvdW50LWxvdyBvY3RldAorICAgIGNvdW50LWhpZ2ggb2N0ZXQKKyAgICAuLi4gZGF0YSBvY3RldHMKKyAgICBjaGVja3N1bSBvY3RldAorICBFYWNoIG9jdGV0IGlzIHNlbnQgYXMgPHdhaXQgZm9yIHJ4LiAnMHgxPyc+IDxzZW5kIDB4MTArKG9jdGV0JjB4MEYpPgorCQkJPHdhaXQgZm9yIHJ4LiAnMHgwPyc+IDxzZW5kIDB4MDArKChvY3RldD4+NCkmMHgwRik+CisKKyAgVGhlIHBhY2tldCBpcyBlbmNhcHN1bGF0ZWQgYXMgaWYgaXQgd2VyZSBldGhlcm5ldC4KKworICBUaGUgY2FibGUgdXNlZCBpcyBhIGRlIGZhY3RvIHN0YW5kYXJkIHBhcmFsbGVsIG51bGwgY2FibGUgLS0gc29sZCBhcworICBhICJMYXBMaW5rIiBjYWJsZSBieSB2YXJpb3VzIHBsYWNlcy4gIFlvdSdsbCBuZWVkIGEgMTItY29uZHVjdG9yIGNhYmxlIHRvCisgIG1ha2Ugb25lIHlvdXJzZWxmLiAgVGhlIHdpcmluZyBpczoKKyAgICBTTENUSU4JMTcgLSAxNworICAgIEdST1VORAkyNSAtIDI1CisgICAgRDAtPkVSUk9SCTIgLSAxNQkJMTUgLSAyCisgICAgRDEtPlNMQ1QJMyAtIDEzCQkxMyAtIDMKKyAgICBEMi0+UEFQT1VUCTQgLSAxMgkJMTIgLSA0CisgICAgRDMtPkFDSwk1IC0gMTAJCTEwIC0gNQorICAgIEQ0LT5CVVNZCTYgLSAxMQkJMTEgLSA2CisgIERvIG5vdCBjb25uZWN0IHRoZSBvdGhlciBwaW5zLiAgVGhleSBhcmUKKyAgICBENSxENixENyBhcmUgNyw4LDkKKyAgICBTVFJPQkUgaXMgMSwgRkVFRCBpcyAxNCwgSU5JVCBpcyAxNgorICAgIGV4dHJhIGdyb3VuZHMgYXJlIDE4LDE5LDIwLDIxLDIyLDIzLDI0CisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbHAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcGxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8bmV0L25laWdoYm91ci5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisvKiBNYXhpbXVtIG51bWJlciBvZiBkZXZpY2VzIHRvIHN1cHBvcnQuICovCisjZGVmaW5lIFBMSVBfTUFYICA4CisKKy8qIFVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sID4yIGZvciBkZWJ1ZyAqLworI2lmbmRlZiBORVRfREVCVUcKKyNkZWZpbmUgTkVUX0RFQlVHIDEKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGludCBuZXRfZGVidWcgPSBORVRfREVCVUc7CisKKyNkZWZpbmUgRU5BQkxFKGlycSkgIGlmIChpcnEgIT0gLTEpIGVuYWJsZV9pcnEoaXJxKQorI2RlZmluZSBESVNBQkxFKGlycSkgaWYgKGlycSAhPSAtMSkgZGlzYWJsZV9pcnEoaXJxKQorCisvKiBJbiBtaWNybyBzZWNvbmQgKi8KKyNkZWZpbmUgUExJUF9ERUxBWV9VTklUCQkgICAxCisKKy8qIENvbm5lY3Rpb24gdGltZSBvdXQgPSBQTElQX1RSSUdHRVJfV0FJVCAqIFBMSVBfREVMQVlfVU5JVCB1c2VjICovCisjZGVmaW5lIFBMSVBfVFJJR0dFUl9XQUlUCSA1MDAKKworLyogTmliYmxlIHRpbWUgb3V0ID0gUExJUF9OSUJCTEVfV0FJVCAqIFBMSVBfREVMQVlfVU5JVCB1c2VjICovCisjZGVmaW5lIFBMSVBfTklCQkxFX1dBSVQgICAgICAgIDMwMDAKKworLyogQm90dG9tIGhhbHZlcyAqLworc3RhdGljIHZvaWQgcGxpcF9raWNrX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcGxpcF9iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHBsaXBfdGltZXJfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIEludGVycnVwdCBoYW5kbGVyICovCitzdGF0aWMgdm9pZCBwbGlwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworLyogRnVuY3Rpb25zIGZvciBERVYgbWV0aG9kcyAqLworc3RhdGljIGludCBwbGlwX3R4X3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcGxpcF9oYXJkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQgKmRhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pOworc3RhdGljIGludCBwbGlwX2hhcmRfaGVhZGVyX2NhY2hlKHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBoaF9jYWNoZSAqaGgpOworc3RhdGljIGludCBwbGlwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHBsaXBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnBsaXBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBwbGlwX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgcGxpcF9wcmVlbXB0KHZvaWQgKmhhbmRsZSk7CitzdGF0aWMgdm9pZCBwbGlwX3dha2V1cCh2b2lkICpoYW5kbGUpOworDAorZW51bSBwbGlwX2Nvbm5lY3Rpb25fc3RhdGUgeworCVBMSVBfQ05fTk9ORT0wLAorCVBMSVBfQ05fUkVDRUlWRSwKKwlQTElQX0NOX1NFTkQsCisJUExJUF9DTl9DTE9TSU5HLAorCVBMSVBfQ05fRVJST1IKK307CisKK2VudW0gcGxpcF9wYWNrZXRfc3RhdGUgeworCVBMSVBfUEtfRE9ORT0wLAorCVBMSVBfUEtfVFJJR0dFUiwKKwlQTElQX1BLX0xFTkdUSF9MU0IsCisJUExJUF9QS19MRU5HVEhfTVNCLAorCVBMSVBfUEtfREFUQSwKKwlQTElQX1BLX0NIRUNLU1VNCit9OworCitlbnVtIHBsaXBfbmliYmxlX3N0YXRlIHsKKwlQTElQX05CX0JFR0lOLAorCVBMSVBfTkJfMSwKKwlQTElQX05CXzIsCit9OworCitzdHJ1Y3QgcGxpcF9sb2NhbCB7CisJZW51bSBwbGlwX3BhY2tldF9zdGF0ZSBzdGF0ZTsKKwllbnVtIHBsaXBfbmliYmxlX3N0YXRlIG5pYmJsZTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJCQl1bnNpZ25lZCBjaGFyIGxzYjsKKwkJCXVuc2lnbmVkIGNoYXIgbXNiOworI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJCQl1bnNpZ25lZCBjaGFyIG1zYjsKKwkJCXVuc2lnbmVkIGNoYXIgbHNiOworI2Vsc2UKKyNlcnJvcgkiUGxlYXNlIGZpeCB0aGUgZW5kaWFubmVzcyBkZWZpbmVzIGluIDxhc20vYnl0ZW9yZGVyLmg+IgorI2VuZGlmCisJCX0gYjsKKwkJdW5zaWduZWQgc2hvcnQgaDsKKwl9IGxlbmd0aDsKKwl1bnNpZ25lZCBzaG9ydCBieXRlOworCXVuc2lnbmVkIGNoYXIgIGNoZWNrc3VtOworCXVuc2lnbmVkIGNoYXIgIGRhdGE7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKK307CisKK3N0cnVjdCBuZXRfbG9jYWwgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIGVuZXRfc3RhdHM7CisJc3RydWN0IHdvcmtfc3RydWN0IGltbWVkaWF0ZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZGVmZXJyZWQ7CisJc3RydWN0IHdvcmtfc3RydWN0IHRpbWVyOworCXN0cnVjdCBwbGlwX2xvY2FsIHNuZF9kYXRhOworCXN0cnVjdCBwbGlwX2xvY2FsIHJjdl9kYXRhOworCXN0cnVjdCBwYXJkZXZpY2UgKnBhcmRldjsKKwl1bnNpZ25lZCBsb25nICB0cmlnZ2VyOworCXVuc2lnbmVkIGxvbmcgIG5pYmJsZTsKKwllbnVtIHBsaXBfY29ubmVjdGlvbl9zdGF0ZSBjb25uZWN0aW9uOworCXVuc2lnbmVkIHNob3J0IHRpbWVvdXRfY291bnQ7CisJaW50IGlzX2RlZmVycmVkOworCWludCBwb3J0X293bmVyOworCWludCBzaG91bGRfcmVsaW5xdWlzaDsKKwlpbnQgKCpvcmlnX2hhcmRfaGVhZGVyKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQgKmRhZGRyLAorCSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pOworCWludCAoKm9yaWdfaGFyZF9oZWFkZXJfY2FjaGUpKHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBoaF9jYWNoZSAqaGgpOworCXNwaW5sb2NrX3QgbG9jazsKKwlhdG9taWNfdCBraWxsX3RpbWVyOworCXN0cnVjdCBzZW1hcGhvcmUga2lsbGVkX3RpbWVyX3NlbTsKK307CisMCitpbmxpbmUgc3RhdGljIHZvaWQgZW5hYmxlX3BhcnBvcnRfaW50ZXJydXB0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2LT5pcnEgIT0gLTEpCisJeworCQlzdHJ1Y3QgcGFycG9ydCAqcG9ydCA9CisJCSAgICgoc3RydWN0IG5ldF9sb2NhbCAqKWRldi0+cHJpdiktPnBhcmRldi0+cG9ydDsKKwkJcG9ydC0+b3BzLT5lbmFibGVfaXJxIChwb3J0KTsKKwl9Cit9CisKK2lubGluZSBzdGF0aWMgdm9pZCBkaXNhYmxlX3BhcnBvcnRfaW50ZXJydXB0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2LT5pcnEgIT0gLTEpCisJeworCQlzdHJ1Y3QgcGFycG9ydCAqcG9ydCA9CisJCSAgICgoc3RydWN0IG5ldF9sb2NhbCAqKWRldi0+cHJpdiktPnBhcmRldi0+cG9ydDsKKwkJcG9ydC0+b3BzLT5kaXNhYmxlX2lycSAocG9ydCk7CisJfQorfQorCitpbmxpbmUgc3RhdGljIHZvaWQgd3JpdGVfZGF0YSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciBkYXRhKQoreworCXN0cnVjdCBwYXJwb3J0ICpwb3J0ID0KKwkgICAoKHN0cnVjdCBuZXRfbG9jYWwgKilkZXYtPnByaXYpLT5wYXJkZXYtPnBvcnQ7CisKKwlwb3J0LT5vcHMtPndyaXRlX2RhdGEgKHBvcnQsIGRhdGEpOworfQorCitpbmxpbmUgc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVhZF9zdGF0dXMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBhcnBvcnQgKnBvcnQgPQorCSAgICgoc3RydWN0IG5ldF9sb2NhbCAqKWRldi0+cHJpdiktPnBhcmRldi0+cG9ydDsKKworCXJldHVybiBwb3J0LT5vcHMtPnJlYWRfc3RhdHVzIChwb3J0KTsKK30KKwwKKy8qIEVudHJ5IHBvaW50IG9mIFBMSVAgZHJpdmVyLgorICAgUHJvYmUgdGhlIGhhcmR3YXJlLCBhbmQgcmVnaXN0ZXIvaW5pdGlhbGl6ZSB0aGUgZHJpdmVyLgorCisgICBQTElQIGlzIHJhdGhlciB3ZWlyZCwgYmVjYXVzZSBvZiB0aGUgd2F5IGl0IGludGVyYWN0cyB3aXRoIHRoZSBwYXJwb3J0CisgICBzeXN0ZW0uICBJdCBpcyBfbm90XyBpbml0aWFsaXNlZCBmcm9tIFNwYWNlLmMuICBJbnN0ZWFkLCBwbGlwX2luaXQoKQorICAgaXMgY2FsbGVkLCBhbmQgdGhhdCBmdW5jdGlvbiBtYWtlcyB1cCBhICJzdHJ1Y3QgbmV0X2RldmljZSIgZm9yIGVhY2ggcG9ydCwgYW5kCisgICB0aGVuIGNhbGxzIHVzIGhlcmUuCisKKyAgICovCitzdGF0aWMgdm9pZAorcGxpcF9pbml0X25ldGRldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKm5sID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIFRoZW4sIG92ZXJyaWRlIHBhcnRzIG9mIGl0ICovCisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJID0gcGxpcF90eF9wYWNrZXQ7CisJZGV2LT5vcGVuCQkgPSBwbGlwX29wZW47CisJZGV2LT5zdG9wCQkgPSBwbGlwX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzIAkJID0gcGxpcF9nZXRfc3RhdHM7CisJZGV2LT5kb19pb2N0bAkJID0gcGxpcF9pb2N0bDsKKwlkZXYtPmhlYWRlcl9jYWNoZV91cGRhdGUgPSBOVUxMOworCWRldi0+dHhfcXVldWVfbGVuIAkgPSAxMDsKKwlkZXYtPmZsYWdzCSAgICAgICAgID0gSUZGX1BPSU5UT1BPSU5UfElGRl9OT0FSUDsKKwltZW1zZXQoZGV2LT5kZXZfYWRkciwgMHhmYywgRVRIX0FMRU4pOworCisJLyogU2V0IHRoZSBwcml2YXRlIHN0cnVjdHVyZSAqLworCW5sLT5vcmlnX2hhcmRfaGVhZGVyICAgID0gZGV2LT5oYXJkX2hlYWRlcjsKKwlkZXYtPmhhcmRfaGVhZGVyICAgICAgICA9IHBsaXBfaGFyZF9oZWFkZXI7CisKKwlubC0+b3JpZ19oYXJkX2hlYWRlcl9jYWNoZSA9IGRldi0+aGFyZF9oZWFkZXJfY2FjaGU7CisJZGV2LT5oYXJkX2hlYWRlcl9jYWNoZSAgICAgPSBwbGlwX2hhcmRfaGVhZGVyX2NhY2hlOworCisKKwlubC0+cG9ydF9vd25lciA9IDA7CisKKwkvKiBJbml0aWFsaXplIGNvbnN0YW50cyAqLworCW5sLT50cmlnZ2VyCT0gUExJUF9UUklHR0VSX1dBSVQ7CisJbmwtPm5pYmJsZQk9IFBMSVBfTklCQkxFX1dBSVQ7CisKKwkvKiBJbml0aWFsaXplIHRhc2sgcXVldWUgc3RydWN0dXJlcyAqLworCUlOSVRfV09SSygmbmwtPmltbWVkaWF0ZSwgKHZvaWQgKCopKHZvaWQgKikpcGxpcF9iaCwgZGV2KTsKKwlJTklUX1dPUksoJm5sLT5kZWZlcnJlZCwgKHZvaWQgKCopKHZvaWQgKikpcGxpcF9raWNrX2JoLCBkZXYpOworCisJaWYgKGRldi0+aXJxID09IC0xKQorCQlJTklUX1dPUksoJm5sLT50aW1lciwgKHZvaWQgKCopKHZvaWQgKikpcGxpcF90aW1lcl9iaCwgZGV2KTsKKworCXNwaW5fbG9ja19pbml0KCZubC0+bG9jayk7Cit9CisMCisvKiBCb3R0b20gaGFsZiBoYW5kbGVyIGZvciB0aGUgZGVsYXllZCByZXF1ZXN0LgorICAgVGhpcyByb3V0aW5lIGlzIGtpY2tlZCBieSBkb190aW1lcigpLgorICAgUmVxdWVzdCBgcGxpcF9iaCcgdG8gYmUgaW52b2tlZC4gKi8KK3N0YXRpYyB2b2lkCitwbGlwX2tpY2tfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpubCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAobmwtPmlzX2RlZmVycmVkKQorCQlzY2hlZHVsZV93b3JrKCZubC0+aW1tZWRpYXRlKTsKK30KKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgaW50ZXJuYWwgcm91dGluZXMgKi8KK3N0YXRpYyBpbnQgcGxpcF9ub25lKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBuZXRfbG9jYWwgKiwKKwkJICAgICBzdHJ1Y3QgcGxpcF9sb2NhbCAqLCBzdHJ1Y3QgcGxpcF9sb2NhbCAqKTsKK3N0YXRpYyBpbnQgcGxpcF9yZWNlaXZlX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgbmV0X2xvY2FsICosCisJCQkgICAgICAgc3RydWN0IHBsaXBfbG9jYWwgKiwgc3RydWN0IHBsaXBfbG9jYWwgKik7CitzdGF0aWMgaW50IHBsaXBfc2VuZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IG5ldF9sb2NhbCAqLAorCQkJICAgIHN0cnVjdCBwbGlwX2xvY2FsICosIHN0cnVjdCBwbGlwX2xvY2FsICopOworc3RhdGljIGludCBwbGlwX2Nvbm5lY3Rpb25fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IG5ldF9sb2NhbCAqLAorCQkJCSBzdHJ1Y3QgcGxpcF9sb2NhbCAqLCBzdHJ1Y3QgcGxpcF9sb2NhbCAqKTsKK3N0YXRpYyBpbnQgcGxpcF9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgbmV0X2xvY2FsICosCisJCSAgICAgIHN0cnVjdCBwbGlwX2xvY2FsICosIHN0cnVjdCBwbGlwX2xvY2FsICopOworc3RhdGljIGludCBwbGlwX2JoX3RpbWVvdXRfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldF9sb2NhbCAqbmwsCisJCQkJIHN0cnVjdCBwbGlwX2xvY2FsICpzbmQsCisJCQkJIHN0cnVjdCBwbGlwX2xvY2FsICpyY3YsCisJCQkJIGludCBlcnJvcik7CisKKyNkZWZpbmUgT0sgICAgICAgIDAKKyNkZWZpbmUgVElNRU9VVCAgIDEKKyNkZWZpbmUgRVJST1IgICAgIDIKKyNkZWZpbmUgSFNfVElNRU9VVAkzCisKK3R5cGVkZWYgaW50ICgqcGxpcF9mdW5jKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmV0X2xvY2FsICpubCwKKwkJCSBzdHJ1Y3QgcGxpcF9sb2NhbCAqc25kLCBzdHJ1Y3QgcGxpcF9sb2NhbCAqcmN2KTsKKworc3RhdGljIHBsaXBfZnVuYyBjb25uZWN0aW9uX3N0YXRlX3RhYmxlW10gPQoreworCXBsaXBfbm9uZSwKKwlwbGlwX3JlY2VpdmVfcGFja2V0LAorCXBsaXBfc2VuZF9wYWNrZXQsCisJcGxpcF9jb25uZWN0aW9uX2Nsb3NlLAorCXBsaXBfZXJyb3IKK307CisKKy8qIEJvdHRvbSBoYWxmIGhhbmRsZXIgb2YgUExJUC4gKi8KK3N0YXRpYyB2b2lkCitwbGlwX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbmwgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwbGlwX2xvY2FsICpzbmQgPSAmbmwtPnNuZF9kYXRhOworCXN0cnVjdCBwbGlwX2xvY2FsICpyY3YgPSAmbmwtPnJjdl9kYXRhOworCXBsaXBfZnVuYyBmOworCWludCByOworCisJbmwtPmlzX2RlZmVycmVkID0gMDsKKwlmID0gY29ubmVjdGlvbl9zdGF0ZV90YWJsZVtubC0+Y29ubmVjdGlvbl07CisJaWYgKChyID0gKCpmKShkZXYsIG5sLCBzbmQsIHJjdikpICE9IE9LCisJICAgICYmIChyID0gcGxpcF9iaF90aW1lb3V0X2Vycm9yKGRldiwgbmwsIHNuZCwgcmN2LCByKSkgIT0gT0spIHsKKwkJbmwtPmlzX2RlZmVycmVkID0gMTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZubC0+ZGVmZXJyZWQsIDEpOworCX0KK30KKworc3RhdGljIHZvaWQKK3BsaXBfdGltZXJfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpubCA9IG5ldGRldl9wcml2KGRldik7CisJCisJaWYgKCEoYXRvbWljX3JlYWQgKCZubC0+a2lsbF90aW1lcikpKSB7CisJCXBsaXBfaW50ZXJydXB0ICgtMSwgZGV2LCBOVUxMKTsKKworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm5sLT50aW1lciwgMSk7CisJfQorCWVsc2UgeworCQl1cCAoJm5sLT5raWxsZWRfdGltZXJfc2VtKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3BsaXBfYmhfdGltZW91dF9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmV0X2xvY2FsICpubCwKKwkJICAgICAgc3RydWN0IHBsaXBfbG9jYWwgKnNuZCwgc3RydWN0IHBsaXBfbG9jYWwgKnJjdiwKKwkJICAgICAgaW50IGVycm9yKQoreworCXVuc2lnbmVkIGNoYXIgYzA7CisJLyoKKwkgKiBUaGlzIGlzIHRyaWNreS4gSWYgd2UgZ290IGhlcmUgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHNlbmQgKGVpdGhlcgorCSAqIHdpdGggRVJST1Igb3IgSFNfVElNRU9VVCkgd2UgaGF2ZSBJUlEgZW5hYmxlZC4gT3RoZXJ3aXNlIGl0J3MKKwkgKiBhbHJlYWR5IGRpc2FibGVkLiBXaXRoIHRoZSBvbGQgdmFyaWFudCBvZiB7ZW5hYmxlLGRpc2FibGV9X2lycSgpCisJICogZXh0cmEgZGlzYWJsZV9pcnEoKSB3YXMgYSBuby1vcC4gTm93IGl0IGJlY2FtZSBtb3J0YWwgLSBpdCdzCisJICogdW5iYWxhbmNlZCBhbmQgdGh1cyB3ZSdsbCBuZXZlciByZS1lbmFibGUgSVJRICh1bnRpbCBybW1vZCBwbGlwLAorCSAqIHRoYXQgaXMpLiBTbyB3ZSBoYXZlIHRvIHRyZWF0IEhTX1RJTUVPVVQgYW5kIEVSUk9SIGZyb20gc2VuZAorCSAqIGluIGEgc3BlY2lhbCB3YXkuCisJICovCisKKwlzcGluX2xvY2tfaXJxKCZubC0+bG9jayk7CisJaWYgKG5sLT5jb25uZWN0aW9uID09IFBMSVBfQ05fU0VORCkgeworCisJCWlmIChlcnJvciAhPSBFUlJPUikgeyAvKiBUaW1lb3V0ICovCisJCQlubC0+dGltZW91dF9jb3VudCsrOworCQkJaWYgKChlcnJvciA9PSBIU19USU1FT1VUCisJCQkgICAgICYmIG5sLT50aW1lb3V0X2NvdW50IDw9IDEwKQorCQkJICAgIHx8IG5sLT50aW1lb3V0X2NvdW50IDw9IDMpIHsKKwkJCQlzcGluX3VubG9ja19pcnEoJm5sLT5sb2NrKTsKKwkJCQkvKiBUcnkgYWdhaW4gbGF0ZXIgKi8KKwkJCQlyZXR1cm4gVElNRU9VVDsKKwkJCX0KKwkJCWMwID0gcmVhZF9zdGF0dXMoZGV2KTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0cmFuc21pdCB0aW1lb3V0KCVkLCUwMngpXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgc25kLT5zdGF0ZSwgYzApOworCQl9IGVsc2UKKwkJCWVycm9yID0gSFNfVElNRU9VVDsKKwkJbmwtPmVuZXRfc3RhdHMudHhfZXJyb3JzKys7CisJCW5sLT5lbmV0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJfSBlbHNlIGlmIChubC0+Y29ubmVjdGlvbiA9PSBQTElQX0NOX1JFQ0VJVkUpIHsKKwkJaWYgKHJjdi0+c3RhdGUgPT0gUExJUF9QS19UUklHR0VSKSB7CisJCQkvKiBUcmFuc21pc3Npb24gd2FzIGludGVycnVwdGVkLiAqLworCQkJc3Bpbl91bmxvY2tfaXJxKCZubC0+bG9jayk7CisJCQlyZXR1cm4gT0s7CisJCX0KKwkJaWYgKGVycm9yICE9IEVSUk9SKSB7IC8qIFRpbWVvdXQgKi8KKwkJCWlmICgrK25sLT50aW1lb3V0X2NvdW50IDw9IDMpIHsKKwkJCQlzcGluX3VubG9ja19pcnEoJm5sLT5sb2NrKTsKKwkJCQkvKiBUcnkgYWdhaW4gbGF0ZXIgKi8KKwkJCQlyZXR1cm4gVElNRU9VVDsKKwkJCX0KKwkJCWMwID0gcmVhZF9zdGF0dXMoZGV2KTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByZWNlaXZlIHRpbWVvdXQoJWQsJTAyeClcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCByY3YtPnN0YXRlLCBjMCk7CisJCX0KKwkJbmwtPmVuZXRfc3RhdHMucnhfZHJvcHBlZCsrOworCX0KKwlyY3YtPnN0YXRlID0gUExJUF9QS19ET05FOworCWlmIChyY3YtPnNrYikgeworCQlrZnJlZV9za2IocmN2LT5za2IpOworCQlyY3YtPnNrYiA9IE5VTEw7CisJfQorCXNuZC0+c3RhdGUgPSBQTElQX1BLX0RPTkU7CisJaWYgKHNuZC0+c2tiKSB7CisJCWRldl9rZnJlZV9za2Ioc25kLT5za2IpOworCQlzbmQtPnNrYiA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmbmwtPmxvY2spOworCWlmIChlcnJvciA9PSBIU19USU1FT1VUKSB7CisJCURJU0FCTEUoZGV2LT5pcnEpOworCQlzeW5jaHJvbml6ZV9pcnEoZGV2LT5pcnEpOworCX0KKwlkaXNhYmxlX3BhcnBvcnRfaW50ZXJydXB0cyAoZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCW5sLT5jb25uZWN0aW9uID0gUExJUF9DTl9FUlJPUjsKKwl3cml0ZV9kYXRhIChkZXYsIDB4MDApOworCisJcmV0dXJuIFRJTUVPVVQ7Cit9CisMCitzdGF0aWMgaW50CitwbGlwX25vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldF9sb2NhbCAqbmwsCisJICBzdHJ1Y3QgcGxpcF9sb2NhbCAqc25kLCBzdHJ1Y3QgcGxpcF9sb2NhbCAqcmN2KQoreworCXJldHVybiBPSzsKK30KKworLyogUExJUF9SRUNFSVZFIC0tLSByZWNlaXZlIGEgYnl0ZSh0d28gbmliYmxlcykKKyAgIFJldHVybnMgT0sgb24gc3VjY2VzcywgVElNRU9VVCBvbiB0aW1lb3V0ICovCitpbmxpbmUgc3RhdGljIGludAorcGxpcF9yZWNlaXZlKHVuc2lnbmVkIHNob3J0IG5pYmJsZV90aW1lb3V0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCSAgICAgZW51bSBwbGlwX25pYmJsZV9zdGF0ZSAqbnNfcCwgdW5zaWduZWQgY2hhciAqZGF0YV9wKQoreworCXVuc2lnbmVkIGNoYXIgYzAsIGMxOworCXVuc2lnbmVkIGludCBjeDsKKworCXN3aXRjaCAoKm5zX3ApIHsKKwljYXNlIFBMSVBfTkJfQkVHSU46CisJCWN4ID0gbmliYmxlX3RpbWVvdXQ7CisJCXdoaWxlICgxKSB7CisJCQljMCA9IHJlYWRfc3RhdHVzKGRldik7CisJCQl1ZGVsYXkoUExJUF9ERUxBWV9VTklUKTsKKwkJCWlmICgoYzAgJiAweDgwKSA9PSAwKSB7CisJCQkJYzEgPSByZWFkX3N0YXR1cyhkZXYpOworCQkJCWlmIChjMCA9PSBjMSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoLS1jeCA9PSAwKQorCQkJCXJldHVybiBUSU1FT1VUOworCQl9CisJCSpkYXRhX3AgPSAoYzAgPj4gMykgJiAweDBmOworCQl3cml0ZV9kYXRhIChkZXYsIDB4MTApOyAvKiBzZW5kIEFDSyAqLworCQkqbnNfcCA9IFBMSVBfTkJfMTsKKworCWNhc2UgUExJUF9OQl8xOgorCQljeCA9IG5pYmJsZV90aW1lb3V0OworCQl3aGlsZSAoMSkgeworCQkJYzAgPSByZWFkX3N0YXR1cyhkZXYpOworCQkJdWRlbGF5KFBMSVBfREVMQVlfVU5JVCk7CisJCQlpZiAoYzAgJiAweDgwKSB7CisJCQkJYzEgPSByZWFkX3N0YXR1cyhkZXYpOworCQkJCWlmIChjMCA9PSBjMSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoLS1jeCA9PSAwKQorCQkJCXJldHVybiBUSU1FT1VUOworCQl9CisJCSpkYXRhX3AgfD0gKGMwIDw8IDEpICYgMHhmMDsKKwkJd3JpdGVfZGF0YSAoZGV2LCAweDAwKTsgLyogc2VuZCBBQ0sgKi8KKwkJKm5zX3AgPSBQTElQX05CX0JFR0lOOworCWNhc2UgUExJUF9OQl8yOgorCQlicmVhazsKKwl9CisJcmV0dXJuIE9LOworfQorCisvKgorICoJRGV0ZXJtaW5lIHRoZSBwYWNrZXQncyBwcm90b2NvbCBJRC4gVGhlIHJ1bGUgaGVyZSBpcyB0aGF0IHdlIAorICoJYXNzdW1lIDgwMi4zIGlmIHRoZSB0eXBlIGZpZWxkIGlzIHNob3J0IGVub3VnaCB0byBiZSBhIGxlbmd0aC4KKyAqCVRoaXMgaXMgbm9ybWFsIHByYWN0aWNlIGFuZCB3b3JrcyBmb3IgYW55ICdub3cgaW4gdXNlJyBwcm90b2NvbC4KKyAqCisgKglQTElQIGlzIGV0aGVybmV0IGlzaCBidXQgdGhlIGRhZGRyIG1pZ2h0IG5vdCBiZSB2YWxpZCBpZiB1bmljYXN0LgorICoJUExJUCBmb3J0dW5hdGVseSBoYXMgbm8gYnVzIGFyY2hpdGVjdHVyZSAoaXRzIFBvaW50LXRvLXBvaW50KS4KKyAqCisgKglXZSBjYW4ndCBmaXggdGhlIGRhZGRyIHRoaW5nIGFzIHRoYXQgcXVpcmsgKG1vcmUgYnVnKSBpcyBlbWJlZGRlZAorICoJaW4gZmFyIHRvbyBtYW55IG9sZCBzeXN0ZW1zIG5vdCBhbGwgZXZlbiBydW5uaW5nIExpbnV4LgorICovCisgCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcGxpcF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV0aGhkciAqZXRoOworCXVuc2lnbmVkIGNoYXIgKnJhd3A7CisJCisJc2tiLT5tYWMucmF3PXNrYi0+ZGF0YTsKKwlza2JfcHVsbChza2IsZGV2LT5oYXJkX2hlYWRlcl9sZW4pOworCWV0aCA9IGV0aF9oZHIoc2tiKTsKKwkKKwlpZigqZXRoLT5oX2Rlc3QmMSkKKwl7CisJCWlmKG1lbWNtcChldGgtPmhfZGVzdCxkZXYtPmJyb2FkY2FzdCwgRVRIX0FMRU4pPT0wKQorCQkJc2tiLT5wa3RfdHlwZT1QQUNLRVRfQlJPQURDQVNUOworCQllbHNlCisJCQlza2ItPnBrdF90eXBlPVBBQ0tFVF9NVUxUSUNBU1Q7CisJfQorCQorCS8qCisJICoJVGhpcyBBTExNVUxUSSBjaGVjayBzaG91bGQgYmUgcmVkdW5kYW50IGJ5IDEuNAorCSAqCXNvIGRvbid0IGZvcmdldCB0byByZW1vdmUgaXQuCisJICovCisJIAorCWlmIChudG9ocyhldGgtPmhfcHJvdG8pID49IDE1MzYpCisJCXJldHVybiBldGgtPmhfcHJvdG87CisJCQorCXJhd3AgPSBza2ItPmRhdGE7CisJCisJLyoKKwkgKglUaGlzIGlzIGEgbWFnaWMgaGFjayB0byBzcG90IElQWCBwYWNrZXRzLiBPbGRlciBOb3ZlbGwgYnJlYWtzCisJICoJdGhlIHByb3RvY29sIGRlc2lnbiBhbmQgcnVucyBJUFggb3ZlciA4MDIuMyB3aXRob3V0IGFuIDgwMi4yIExMQworCSAqCWxheWVyLiBXZSBsb29rIGZvciBGRkZGIHdoaWNoIGlzbid0IGEgdXNlZCA4MDIuMiBTU0FQL0RTQVAuIFRoaXMKKwkgKgl3b24ndCB3b3JrIGZvciBmYXVsdCB0b2xlcmFudCBuZXR3YXJlIGJ1dCBkb2VzIGZvciB0aGUgcmVzdC4KKwkgKi8KKwlpZiAoKih1bnNpZ25lZCBzaG9ydCAqKXJhd3AgPT0gMHhGRkZGKQorCQlyZXR1cm4gaHRvbnMoRVRIX1BfODAyXzMpOworCQkKKwkvKgorCSAqCVJlYWwgODAyLjIgTExDCisJICovCisJcmV0dXJuIGh0b25zKEVUSF9QXzgwMl8yKTsKK30KKworCisvKiBQTElQX1JFQ0VJVkVfUEFDS0VUIC0tLSByZWNlaXZlIGEgcGFja2V0ICovCitzdGF0aWMgaW50CitwbGlwX3JlY2VpdmVfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZXRfbG9jYWwgKm5sLAorCQkgICAgc3RydWN0IHBsaXBfbG9jYWwgKnNuZCwgc3RydWN0IHBsaXBfbG9jYWwgKnJjdikKK3sKKwl1bnNpZ25lZCBzaG9ydCBuaWJibGVfdGltZW91dCA9IG5sLT5uaWJibGU7CisJdW5zaWduZWQgY2hhciAqbGJ1ZjsKKworCXN3aXRjaCAocmN2LT5zdGF0ZSkgeworCWNhc2UgUExJUF9QS19UUklHR0VSOgorCQlESVNBQkxFKGRldi0+aXJxKTsKKwkJLyogRG9uJ3QgbmVlZCB0byBzeW5jaHJvbml6ZSBpcnEsIGFzIHdlIGNhbiBzYWZlbHkgaWdub3JlIGl0ICovCisJCWRpc2FibGVfcGFycG9ydF9pbnRlcnJ1cHRzIChkZXYpOworCQl3cml0ZV9kYXRhIChkZXYsIDB4MDEpOyAvKiBzZW5kIEFDSyAqLworCQlpZiAobmV0X2RlYnVnID4gMikKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVjZWl2ZSBzdGFydFxuIiwgZGV2LT5uYW1lKTsKKwkJcmN2LT5zdGF0ZSA9IFBMSVBfUEtfTEVOR1RIX0xTQjsKKwkJcmN2LT5uaWJibGUgPSBQTElQX05CX0JFR0lOOworCisJY2FzZSBQTElQX1BLX0xFTkdUSF9MU0I6CisJCWlmIChzbmQtPnN0YXRlICE9IFBMSVBfUEtfRE9ORSkgeworCQkJaWYgKHBsaXBfcmVjZWl2ZShubC0+dHJpZ2dlciwgZGV2LAorCQkJCQkgJnJjdi0+bmliYmxlLCAmcmN2LT5sZW5ndGguYi5sc2IpKSB7CisJCQkJLyogY29sbGlzaW9uLCBoZXJlIGRldi0+dGJ1c3kgPT0gMSAqLworCQkJCXJjdi0+c3RhdGUgPSBQTElQX1BLX0RPTkU7CisJCQkJbmwtPmlzX2RlZmVycmVkID0gMTsKKwkJCQlubC0+Y29ubmVjdGlvbiA9IFBMSVBfQ05fU0VORDsKKwkJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm5sLT5kZWZlcnJlZCwgMSk7CisJCQkJZW5hYmxlX3BhcnBvcnRfaW50ZXJydXB0cyAoZGV2KTsKKwkJCQlFTkFCTEUoZGV2LT5pcnEpOworCQkJCXJldHVybiBPSzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChwbGlwX3JlY2VpdmUobmliYmxlX3RpbWVvdXQsIGRldiwKKwkJCQkJICZyY3YtPm5pYmJsZSwgJnJjdi0+bGVuZ3RoLmIubHNiKSkKKwkJCQlyZXR1cm4gVElNRU9VVDsKKwkJfQorCQlyY3YtPnN0YXRlID0gUExJUF9QS19MRU5HVEhfTVNCOworCisJY2FzZSBQTElQX1BLX0xFTkdUSF9NU0I6CisJCWlmIChwbGlwX3JlY2VpdmUobmliYmxlX3RpbWVvdXQsIGRldiwKKwkJCQkgJnJjdi0+bmliYmxlLCAmcmN2LT5sZW5ndGguYi5tc2IpKQorCQkJcmV0dXJuIFRJTUVPVVQ7CisJCWlmIChyY3YtPmxlbmd0aC5oID4gZGV2LT5tdHUgKyBkZXYtPmhhcmRfaGVhZGVyX2xlbgorCQkgICAgfHwgcmN2LT5sZW5ndGguaCA8IDgpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBib2d1cyBwYWNrZXQgc2l6ZSAlZC5cbiIsIGRldi0+bmFtZSwgcmN2LT5sZW5ndGguaCk7CisJCQlyZXR1cm4gRVJST1I7CisJCX0KKwkJLyogTWFsbG9jIHVwIG5ldyBidWZmZXIuICovCisJCXJjdi0+c2tiID0gZGV2X2FsbG9jX3NrYihyY3YtPmxlbmd0aC5oICsgMik7CisJCWlmIChyY3YtPnNrYiA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBNZW1vcnkgc3F1ZWV6ZS5cbiIsIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gRVJST1I7CisJCX0KKwkJc2tiX3Jlc2VydmUocmN2LT5za2IsIDIpOwkvKiBBbGlnbiBJUCBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KKwkJc2tiX3B1dChyY3YtPnNrYixyY3YtPmxlbmd0aC5oKTsKKwkJcmN2LT5za2ItPmRldiA9IGRldjsKKwkJcmN2LT5zdGF0ZSA9IFBMSVBfUEtfREFUQTsKKwkJcmN2LT5ieXRlID0gMDsKKwkJcmN2LT5jaGVja3N1bSA9IDA7CisKKwljYXNlIFBMSVBfUEtfREFUQToKKwkJbGJ1ZiA9IHJjdi0+c2tiLT5kYXRhOworCQlkbworCQkJaWYgKHBsaXBfcmVjZWl2ZShuaWJibGVfdGltZW91dCwgZGV2LAorCQkJCQkgJnJjdi0+bmliYmxlLCAmbGJ1ZltyY3YtPmJ5dGVdKSkKKwkJCQlyZXR1cm4gVElNRU9VVDsKKwkJd2hpbGUgKCsrcmN2LT5ieXRlIDwgcmN2LT5sZW5ndGguaCk7CisJCWRvCisJCQlyY3YtPmNoZWNrc3VtICs9IGxidWZbLS1yY3YtPmJ5dGVdOworCQl3aGlsZSAocmN2LT5ieXRlKTsKKwkJcmN2LT5zdGF0ZSA9IFBMSVBfUEtfQ0hFQ0tTVU07CisKKwljYXNlIFBMSVBfUEtfQ0hFQ0tTVU06CisJCWlmIChwbGlwX3JlY2VpdmUobmliYmxlX3RpbWVvdXQsIGRldiwKKwkJCQkgJnJjdi0+bmliYmxlLCAmcmN2LT5kYXRhKSkKKwkJCXJldHVybiBUSU1FT1VUOworCQlpZiAocmN2LT5kYXRhICE9IHJjdi0+Y2hlY2tzdW0pIHsKKwkJCW5sLT5lbmV0X3N0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChuZXRfZGVidWcpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjaGVja3N1bSBlcnJvclxuIiwgZGV2LT5uYW1lKTsKKwkJCXJldHVybiBFUlJPUjsKKwkJfQorCQlyY3YtPnN0YXRlID0gUExJUF9QS19ET05FOworCisJY2FzZSBQTElQX1BLX0RPTkU6CisJCS8qIEluZm9ybSB0aGUgdXBwZXIgbGF5ZXIgZm9yIHRoZSBhcnJpdmFsIG9mIGEgcGFja2V0LiAqLworCQlyY3YtPnNrYi0+cHJvdG9jb2w9cGxpcF90eXBlX3RyYW5zKHJjdi0+c2tiLCBkZXYpOworCQluZXRpZl9yeChyY3YtPnNrYik7CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCW5sLT5lbmV0X3N0YXRzLnJ4X2J5dGVzICs9IHJjdi0+bGVuZ3RoLmg7CisJCW5sLT5lbmV0X3N0YXRzLnJ4X3BhY2tldHMrKzsKKwkJcmN2LT5za2IgPSBOVUxMOworCQlpZiAobmV0X2RlYnVnID4gMikKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVjZWl2ZSBlbmRcbiIsIGRldi0+bmFtZSk7CisKKwkJLyogQ2xvc2UgdGhlIGNvbm5lY3Rpb24uICovCisJCXdyaXRlX2RhdGEgKGRldiwgMHgwMCk7CisJCXNwaW5fbG9ja19pcnEoJm5sLT5sb2NrKTsKKwkJaWYgKHNuZC0+c3RhdGUgIT0gUExJUF9QS19ET05FKSB7CisJCQlubC0+Y29ubmVjdGlvbiA9IFBMSVBfQ05fU0VORDsKKwkJCXNwaW5fdW5sb2NrX2lycSgmbmwtPmxvY2spOworCQkJc2NoZWR1bGVfd29yaygmbmwtPmltbWVkaWF0ZSk7CisJCQllbmFibGVfcGFycG9ydF9pbnRlcnJ1cHRzIChkZXYpOworCQkJRU5BQkxFKGRldi0+aXJxKTsKKwkJCXJldHVybiBPSzsKKwkJfSBlbHNlIHsKKwkJCW5sLT5jb25uZWN0aW9uID0gUExJUF9DTl9OT05FOworCQkJc3Bpbl91bmxvY2tfaXJxKCZubC0+bG9jayk7CisJCQllbmFibGVfcGFycG9ydF9pbnRlcnJ1cHRzIChkZXYpOworCQkJRU5BQkxFKGRldi0+aXJxKTsKKwkJCXJldHVybiBPSzsKKwkJfQorCX0KKwlyZXR1cm4gT0s7Cit9CisKKy8qIFBMSVBfU0VORCAtLS0gc2VuZCBhIGJ5dGUgKHR3byBuaWJibGVzKQorICAgUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBUSU1FT1VUIHdoZW4gdGltZW91dCAgICAqLworaW5saW5lIHN0YXRpYyBpbnQKK3BsaXBfc2VuZCh1bnNpZ25lZCBzaG9ydCBuaWJibGVfdGltZW91dCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkgIGVudW0gcGxpcF9uaWJibGVfc3RhdGUgKm5zX3AsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwl1bnNpZ25lZCBjaGFyIGMwOworCXVuc2lnbmVkIGludCBjeDsKKworCXN3aXRjaCAoKm5zX3ApIHsKKwljYXNlIFBMSVBfTkJfQkVHSU46CisJCXdyaXRlX2RhdGEgKGRldiwgZGF0YSAmIDB4MGYpOworCQkqbnNfcCA9IFBMSVBfTkJfMTsKKworCWNhc2UgUExJUF9OQl8xOgorCQl3cml0ZV9kYXRhIChkZXYsIDB4MTAgfCAoZGF0YSAmIDB4MGYpKTsKKwkJY3ggPSBuaWJibGVfdGltZW91dDsKKwkJd2hpbGUgKDEpIHsKKwkJCWMwID0gcmVhZF9zdGF0dXMoZGV2KTsKKwkJCWlmICgoYzAgJiAweDgwKSA9PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKC0tY3ggPT0gMCkKKwkJCQlyZXR1cm4gVElNRU9VVDsKKwkJCXVkZWxheShQTElQX0RFTEFZX1VOSVQpOworCQl9CisJCXdyaXRlX2RhdGEgKGRldiwgMHgxMCB8IChkYXRhID4+IDQpKTsKKwkJKm5zX3AgPSBQTElQX05CXzI7CisKKwljYXNlIFBMSVBfTkJfMjoKKwkJd3JpdGVfZGF0YSAoZGV2LCAoZGF0YSA+PiA0KSk7CisJCWN4ID0gbmliYmxlX3RpbWVvdXQ7CisJCXdoaWxlICgxKSB7CisJCQljMCA9IHJlYWRfc3RhdHVzKGRldik7CisJCQlpZiAoYzAgJiAweDgwKQorCQkJCWJyZWFrOworCQkJaWYgKC0tY3ggPT0gMCkKKwkJCQlyZXR1cm4gVElNRU9VVDsKKwkJCXVkZWxheShQTElQX0RFTEFZX1VOSVQpOworCQl9CisJCSpuc19wID0gUExJUF9OQl9CRUdJTjsKKwkJcmV0dXJuIE9LOworCX0KKwlyZXR1cm4gT0s7Cit9CisKKy8qIFBMSVBfU0VORF9QQUNLRVQgLS0tIHNlbmQgYSBwYWNrZXQgKi8KK3N0YXRpYyBpbnQKK3BsaXBfc2VuZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldF9sb2NhbCAqbmwsCisJCSBzdHJ1Y3QgcGxpcF9sb2NhbCAqc25kLCBzdHJ1Y3QgcGxpcF9sb2NhbCAqcmN2KQoreworCXVuc2lnbmVkIHNob3J0IG5pYmJsZV90aW1lb3V0ID0gbmwtPm5pYmJsZTsKKwl1bnNpZ25lZCBjaGFyICpsYnVmOworCXVuc2lnbmVkIGNoYXIgYzA7CisJdW5zaWduZWQgaW50IGN4OworCisJaWYgKHNuZC0+c2tiID09IE5VTEwgfHwgKGxidWYgPSBzbmQtPnNrYi0+ZGF0YSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNlbmQgc2tiIGxvc3RcbiIsIGRldi0+bmFtZSk7CisJCXNuZC0+c3RhdGUgPSBQTElQX1BLX0RPTkU7CisJCXNuZC0+c2tiID0gTlVMTDsKKwkJcmV0dXJuIEVSUk9SOworCX0KKworCXN3aXRjaCAoc25kLT5zdGF0ZSkgeworCWNhc2UgUExJUF9QS19UUklHR0VSOgorCQlpZiAoKHJlYWRfc3RhdHVzKGRldikgJiAweGY4KSAhPSAweDgwKQorCQkJcmV0dXJuIEhTX1RJTUVPVVQ7CisKKwkJLyogVHJpZ2dlciByZW1vdGUgcnggaW50ZXJydXB0LiAqLworCQl3cml0ZV9kYXRhIChkZXYsIDB4MDgpOworCQljeCA9IG5sLT50cmlnZ2VyOworCQl3aGlsZSAoMSkgeworCQkJdWRlbGF5KFBMSVBfREVMQVlfVU5JVCk7CisJCQlzcGluX2xvY2tfaXJxKCZubC0+bG9jayk7CisJCQlpZiAobmwtPmNvbm5lY3Rpb24gPT0gUExJUF9DTl9SRUNFSVZFKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxKCZubC0+bG9jayk7CisJCQkJLyogSW50ZXJydXB0ZWQuICovCisJCQkJbmwtPmVuZXRfc3RhdHMuY29sbGlzaW9ucysrOworCQkJCXJldHVybiBPSzsKKwkJCX0KKwkJCWMwID0gcmVhZF9zdGF0dXMoZGV2KTsKKwkJCWlmIChjMCAmIDB4MDgpIHsKKwkJCQlzcGluX3VubG9ja19pcnEoJm5sLT5sb2NrKTsKKwkJCQlESVNBQkxFKGRldi0+aXJxKTsKKwkJCQlzeW5jaHJvbml6ZV9pcnEoZGV2LT5pcnEpOworCQkJCWlmIChubC0+Y29ubmVjdGlvbiA9PSBQTElQX0NOX1JFQ0VJVkUpIHsKKwkJCQkJLyogSW50ZXJydXB0ZWQuCisJCQkJCSAgIFdlIGRvbid0IG5lZWQgdG8gZW5hYmxlIGlycSwKKwkJCQkJICAgYXMgaXQgaXMgc29vbiBkaXNhYmxlZC4gICAgKi8KKwkJCQkJLyogWWVzLCB3ZSBkby4gTmV3IHZhcmlhbnQgb2YKKwkJCQkJICAge2VuYWJsZSxkaXNhYmxlfV9pcnEgKmNvdW50cyoKKwkJCQkJICAgdGhlbS4gIC0tIEFWICAqLworCQkJCQlFTkFCTEUoZGV2LT5pcnEpOworCQkJCQlubC0+ZW5ldF9zdGF0cy5jb2xsaXNpb25zKys7CisJCQkJCXJldHVybiBPSzsKKwkJCQl9CisJCQkJZGlzYWJsZV9wYXJwb3J0X2ludGVycnVwdHMgKGRldik7CisJCQkJaWYgKG5ldF9kZWJ1ZyA+IDIpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogc2VuZCBzdGFydFxuIiwgZGV2LT5uYW1lKTsKKwkJCQlzbmQtPnN0YXRlID0gUExJUF9QS19MRU5HVEhfTFNCOworCQkJCXNuZC0+bmliYmxlID0gUExJUF9OQl9CRUdJTjsKKwkJCQlubC0+dGltZW91dF9jb3VudCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnEoJm5sLT5sb2NrKTsKKwkJCWlmICgtLWN4ID09IDApIHsKKwkJCQl3cml0ZV9kYXRhIChkZXYsIDB4MDApOworCQkJCXJldHVybiBIU19USU1FT1VUOworCQkJfQorCQl9CisKKwljYXNlIFBMSVBfUEtfTEVOR1RIX0xTQjoKKwkJaWYgKHBsaXBfc2VuZChuaWJibGVfdGltZW91dCwgZGV2LAorCQkJICAgICAgJnNuZC0+bmliYmxlLCBzbmQtPmxlbmd0aC5iLmxzYikpCisJCQlyZXR1cm4gVElNRU9VVDsKKwkJc25kLT5zdGF0ZSA9IFBMSVBfUEtfTEVOR1RIX01TQjsKKworCWNhc2UgUExJUF9QS19MRU5HVEhfTVNCOgorCQlpZiAocGxpcF9zZW5kKG5pYmJsZV90aW1lb3V0LCBkZXYsCisJCQkgICAgICAmc25kLT5uaWJibGUsIHNuZC0+bGVuZ3RoLmIubXNiKSkKKwkJCXJldHVybiBUSU1FT1VUOworCQlzbmQtPnN0YXRlID0gUExJUF9QS19EQVRBOworCQlzbmQtPmJ5dGUgPSAwOworCQlzbmQtPmNoZWNrc3VtID0gMDsKKworCWNhc2UgUExJUF9QS19EQVRBOgorCQlkbworCQkJaWYgKHBsaXBfc2VuZChuaWJibGVfdGltZW91dCwgZGV2LAorCQkJCSAgICAgICZzbmQtPm5pYmJsZSwgbGJ1ZltzbmQtPmJ5dGVdKSkKKwkJCQlyZXR1cm4gVElNRU9VVDsKKwkJd2hpbGUgKCsrc25kLT5ieXRlIDwgc25kLT5sZW5ndGguaCk7CisJCWRvCisJCQlzbmQtPmNoZWNrc3VtICs9IGxidWZbLS1zbmQtPmJ5dGVdOworCQl3aGlsZSAoc25kLT5ieXRlKTsKKwkJc25kLT5zdGF0ZSA9IFBMSVBfUEtfQ0hFQ0tTVU07CisKKwljYXNlIFBMSVBfUEtfQ0hFQ0tTVU06CisJCWlmIChwbGlwX3NlbmQobmliYmxlX3RpbWVvdXQsIGRldiwKKwkJCSAgICAgICZzbmQtPm5pYmJsZSwgc25kLT5jaGVja3N1bSkpCisJCQlyZXR1cm4gVElNRU9VVDsKKworCQlubC0+ZW5ldF9zdGF0cy50eF9ieXRlcyArPSBzbmQtPnNrYi0+bGVuOworCQlkZXZfa2ZyZWVfc2tiKHNuZC0+c2tiKTsKKwkJbmwtPmVuZXRfc3RhdHMudHhfcGFja2V0cysrOworCQlzbmQtPnN0YXRlID0gUExJUF9QS19ET05FOworCisJY2FzZSBQTElQX1BLX0RPTkU6CisJCS8qIENsb3NlIHRoZSBjb25uZWN0aW9uICovCisJCXdyaXRlX2RhdGEgKGRldiwgMHgwMCk7CisJCXNuZC0+c2tiID0gTlVMTDsKKwkJaWYgKG5ldF9kZWJ1ZyA+IDIpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNlbmQgZW5kXG4iLCBkZXYtPm5hbWUpOworCQlubC0+Y29ubmVjdGlvbiA9IFBMSVBfQ05fQ0xPU0lORzsKKwkJbmwtPmlzX2RlZmVycmVkID0gMTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZubC0+ZGVmZXJyZWQsIDEpOworCQllbmFibGVfcGFycG9ydF9pbnRlcnJ1cHRzIChkZXYpOworCQlFTkFCTEUoZGV2LT5pcnEpOworCQlyZXR1cm4gT0s7CisJfQorCXJldHVybiBPSzsKK30KKworc3RhdGljIGludAorcGxpcF9jb25uZWN0aW9uX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZXRfbG9jYWwgKm5sLAorCQkgICAgICBzdHJ1Y3QgcGxpcF9sb2NhbCAqc25kLCBzdHJ1Y3QgcGxpcF9sb2NhbCAqcmN2KQoreworCXNwaW5fbG9ja19pcnEoJm5sLT5sb2NrKTsKKwlpZiAobmwtPmNvbm5lY3Rpb24gPT0gUExJUF9DTl9DTE9TSU5HKSB7CisJCW5sLT5jb25uZWN0aW9uID0gUExJUF9DTl9OT05FOworCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCX0KKwlzcGluX3VubG9ja19pcnEoJm5sLT5sb2NrKTsKKwlpZiAobmwtPnNob3VsZF9yZWxpbnF1aXNoKSB7CisJCW5sLT5zaG91bGRfcmVsaW5xdWlzaCA9IG5sLT5wb3J0X293bmVyID0gMDsKKwkJcGFycG9ydF9yZWxlYXNlKG5sLT5wYXJkZXYpOworCX0KKwlyZXR1cm4gT0s7Cit9CisKKy8qIFBMSVBfRVJST1IgLS0tIHdhaXQgdGlsbCBvdGhlciBlbmQgc2V0dGxlZCAqLworc3RhdGljIGludAorcGxpcF9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmV0X2xvY2FsICpubCwKKwkgICBzdHJ1Y3QgcGxpcF9sb2NhbCAqc25kLCBzdHJ1Y3QgcGxpcF9sb2NhbCAqcmN2KQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCisJc3RhdHVzID0gcmVhZF9zdGF0dXMoZGV2KTsKKwlpZiAoKHN0YXR1cyAmIDB4ZjgpID09IDB4ODApIHsKKwkJaWYgKG5ldF9kZWJ1ZyA+IDIpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlc2V0IGludGVyZmFjZS5cbiIsIGRldi0+bmFtZSk7CisJCW5sLT5jb25uZWN0aW9uID0gUExJUF9DTl9OT05FOworCQlubC0+c2hvdWxkX3JlbGlucXVpc2ggPSAwOworCQluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKwkJZW5hYmxlX3BhcnBvcnRfaW50ZXJydXB0cyAoZGV2KTsKKwkJRU5BQkxFKGRldi0+aXJxKTsKKwkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwl9IGVsc2UgeworCQlubC0+aXNfZGVmZXJyZWQgPSAxOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm5sLT5kZWZlcnJlZCwgMSk7CisJfQorCisJcmV0dXJuIE9LOworfQorDAorLyogSGFuZGxlIHRoZSBwYXJhbGxlbCBwb3J0IGludGVycnVwdHMuICovCitzdGF0aWMgdm9pZAorcGxpcF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpubDsKKwlzdHJ1Y3QgcGxpcF9sb2NhbCAqcmN2OworCXVuc2lnbmVkIGNoYXIgYzA7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInBsaXBfaW50ZXJydXB0OiBpcnEgJWQgZm9yIHVua25vd24gZGV2aWNlLlxuIiwgaXJxKTsKKwkJcmV0dXJuOworCX0KKworCW5sID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyY3YgPSAmbmwtPnJjdl9kYXRhOworCisJc3Bpbl9sb2NrX2lycSAoJm5sLT5sb2NrKTsKKworCWMwID0gcmVhZF9zdGF0dXMoZGV2KTsKKwlpZiAoKGMwICYgMHhmOCkgIT0gMHhjMCkgeworCQlpZiAoKGRldi0+aXJxICE9IC0xKSAmJiAobmV0X2RlYnVnID4gMSkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNwdXJpb3VzIGludGVycnVwdFxuIiwgZGV2LT5uYW1lKTsKKwkJc3Bpbl91bmxvY2tfaXJxICgmbmwtPmxvY2spOworCQlyZXR1cm47CisJfQorCisJaWYgKG5ldF9kZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogaW50ZXJydXB0LlxuIiwgZGV2LT5uYW1lKTsKKworCXN3aXRjaCAobmwtPmNvbm5lY3Rpb24pIHsKKwljYXNlIFBMSVBfQ05fQ0xPU0lORzoKKwkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwljYXNlIFBMSVBfQ05fTk9ORToKKwljYXNlIFBMSVBfQ05fU0VORDoKKwkJcmN2LT5zdGF0ZSA9IFBMSVBfUEtfVFJJR0dFUjsKKwkJbmwtPmNvbm5lY3Rpb24gPSBQTElQX0NOX1JFQ0VJVkU7CisJCW5sLT50aW1lb3V0X2NvdW50ID0gMDsKKwkJc2NoZWR1bGVfd29yaygmbmwtPmltbWVkaWF0ZSk7CisJCWJyZWFrOworCisJY2FzZSBQTElQX0NOX1JFQ0VJVkU6CisJCS8qIE1heSBvY2N1ciBiZWNhdXNlIHRoZXJlIGlzIHJhY2UgY29uZGl0aW9uCisJCSAgIGFyb3VuZCB0ZXN0IGFuZCBzZXQgb2YgZGV2LT5pbnRlcnJ1cHQuCisJCSAgIElnbm9yZSB0aGlzIGludGVycnVwdC4gKi8KKwkJYnJlYWs7CisKKwljYXNlIFBMSVBfQ05fRVJST1I6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlY2VpdmUgaW50ZXJydXB0IGluIGVycm9yIHN0YXRlXG4iLCBkZXYtPm5hbWUpOworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9ja19pcnEoJm5sLT5sb2NrKTsKK30KKwwKK3N0YXRpYyBpbnQKK3BsaXBfdHhfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbmwgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwbGlwX2xvY2FsICpzbmQgPSAmbmwtPnNuZF9kYXRhOworCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJcmV0dXJuIDE7CisKKwkvKiBXZSBtYXkgbmVlZCB0byBncmFiIHRoZSBidXMgKi8KKwlpZiAoIW5sLT5wb3J0X293bmVyKSB7CisJCWlmIChwYXJwb3J0X2NsYWltKG5sLT5wYXJkZXYpKQorCQkJcmV0dXJuIDE7CisJCW5sLT5wb3J0X293bmVyID0gMTsKKwl9CisKKwluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCQorCWlmIChza2ItPmxlbiA+IGRldi0+bXR1ICsgZGV2LT5oYXJkX2hlYWRlcl9sZW4pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHBhY2tldCB0b28gYmlnLCAlZC5cbiIsIGRldi0+bmFtZSwgKGludClza2ItPmxlbik7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlIChkZXYpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAobmV0X2RlYnVnID4gMikKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzZW5kIHJlcXVlc3RcbiIsIGRldi0+bmFtZSk7CisKKwlzcGluX2xvY2tfaXJxKCZubC0+bG9jayk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJc25kLT5za2IgPSBza2I7CisJc25kLT5sZW5ndGguaCA9IHNrYi0+bGVuOworCXNuZC0+c3RhdGUgPSBQTElQX1BLX1RSSUdHRVI7CisJaWYgKG5sLT5jb25uZWN0aW9uID09IFBMSVBfQ05fTk9ORSkgeworCQlubC0+Y29ubmVjdGlvbiA9IFBMSVBfQ05fU0VORDsKKwkJbmwtPnRpbWVvdXRfY291bnQgPSAwOworCX0KKwlzY2hlZHVsZV93b3JrKCZubC0+aW1tZWRpYXRlKTsKKwlzcGluX3VubG9ja19pcnEoJm5sLT5sb2NrKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3BsaXBfcmV3cml0ZV9hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGhoZHIgKmV0aCkKK3sKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisKKwlpZiAoKGluX2Rldj1kZXYtPmlwX3B0cikgIT0gTlVMTCkgeworCQkvKiBBbnkgYWRkcmVzcyB3aWxsIGRvIC0gd2UgdGFrZSB0aGUgZmlyc3QgKi8KKwkJc3RydWN0IGluX2lmYWRkciAqaWZhPWluX2Rldi0+aWZhX2xpc3Q7CisJCWlmIChpZmEgIT0gTlVMTCkgeworCQkJbWVtY3B5KGV0aC0+aF9zb3VyY2UsIGRldi0+ZGV2X2FkZHIsIDYpOworCQkJbWVtc2V0KGV0aC0+aF9kZXN0LCAweGZjLCAyKTsKKwkJCW1lbWNweShldGgtPmhfZGVzdCsyLCAmaWZhLT5pZmFfYWRkcmVzcywgNCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQKK3BsaXBfaGFyZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwgdm9pZCAqZGFkZHIsCisJICAgICAgICAgdm9pZCAqc2FkZHIsIHVuc2lnbmVkIGxlbikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpubCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJldDsKKworCWlmICgocmV0ID0gbmwtPm9yaWdfaGFyZF9oZWFkZXIoc2tiLCBkZXYsIHR5cGUsIGRhZGRyLCBzYWRkciwgbGVuKSkgPj0gMCkKKwkJcGxpcF9yZXdyaXRlX2FkZHJlc3MgKGRldiwgKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGEpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHBsaXBfaGFyZF9oZWFkZXJfY2FjaGUoc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaGhfY2FjaGUgKmhoKQoreworCXN0cnVjdCBuZXRfbG9jYWwgKm5sID0gbmVpZ2gtPmRldi0+cHJpdjsKKwlpbnQgcmV0OworCQorCWlmICgocmV0ID0gbmwtPm9yaWdfaGFyZF9oZWFkZXJfY2FjaGUobmVpZ2gsIGhoKSkgPT0gMCkKKwl7CisJCXN0cnVjdCBldGhoZHIgKmV0aDsKKworCQlldGggPSAoc3RydWN0IGV0aGhkciopKCgodTgqKWhoLT5oaF9kYXRhKSArCisJCQkJICAgICAgIEhIX0RBVEFfT0ZGKHNpemVvZigqZXRoKSkpOworCQlwbGlwX3Jld3JpdGVfYWRkcmVzcyAobmVpZ2gtPmRldiwgZXRoKTsKKwl9CisJCisJcmV0dXJuIHJldDsKK30gICAgICAgICAgICAgICAgICAgICAgICAgIAorCisvKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiAgVGhpcyBpcyBjYWxsZWQgKGluIHRoZSBjdXJyZW50IGtlcm5lbCkKKyAgIHNvbWV0aW1lIGFmdGVyIGJvb3Rpbmcgd2hlbiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KKworICAgVGhpcyByb3V0aW5lIGdldHMgZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgcGFyYWxsZWwgcG9ydCBieSBhbGxvY2F0aW5nCisgICBpdHMgSVJRIGxpbmUuCisgKi8KK3N0YXRpYyBpbnQKK3BsaXBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKm5sID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisKKwkvKiBHcmFiIHRoZSBwb3J0ICovCisJaWYgKCFubC0+cG9ydF9vd25lcikgeworCQlpZiAocGFycG9ydF9jbGFpbShubC0+cGFyZGV2KSkgcmV0dXJuIC1FQUdBSU47CisJCW5sLT5wb3J0X293bmVyID0gMTsKKwl9CisKKwlubC0+c2hvdWxkX3JlbGlucXVpc2ggPSAwOworCisJLyogQ2xlYXIgdGhlIGRhdGEgcG9ydC4gKi8KKwl3cml0ZV9kYXRhIChkZXYsIDB4MDApOworCisJLyogRW5hYmxlIHJ4IGludGVycnVwdC4gKi8KKwllbmFibGVfcGFycG9ydF9pbnRlcnJ1cHRzIChkZXYpOworCWlmIChkZXYtPmlycSA9PSAtMSkKKwl7CisJCWF0b21pY19zZXQgKCZubC0+a2lsbF90aW1lciwgMCk7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbmwtPnRpbWVyLCAxKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBzdGF0ZSBtYWNoaW5lLiAqLworCW5sLT5yY3ZfZGF0YS5zdGF0ZSA9IG5sLT5zbmRfZGF0YS5zdGF0ZSA9IFBMSVBfUEtfRE9ORTsKKwlubC0+cmN2X2RhdGEuc2tiID0gbmwtPnNuZF9kYXRhLnNrYiA9IE5VTEw7CisJbmwtPmNvbm5lY3Rpb24gPSBQTElQX0NOX05PTkU7CisJbmwtPmlzX2RlZmVycmVkID0gMDsKKworCS8qIEZpbGwgaW4gdGhlIE1BQy1sZXZlbCBoZWFkZXIuCisJICAgV2UgdXNlZCB0byBhYnVzZSBkZXYtPmJyb2FkY2FzdCB0byBzdG9yZSB0aGUgcG9pbnQtdG8tcG9pbnQKKwkgICBNQUMgYWRkcmVzcywgYnV0IHdlIG5vIGxvbmdlciBkbyBpdC4gSW5zdGVhZCwgd2UgZmV0Y2ggdGhlCisJICAgaW50ZXJmYWNlIGFkZHJlc3Mgd2hlbmV2ZXIgaXQgaXMgbmVlZGVkLCB3aGljaCBpcyBjaGVhcCBlbm91Z2gKKwkgICBiZWNhdXNlIHdlIHVzZSB0aGUgaGhfY2FjaGUuIEFjdHVhbGx5LCBhYnVzaW5nIGRldi0+YnJvYWRjYXN0CisJICAgZGlkbid0IHdvcmssIGJlY2F1c2Ugd2hlbiB1c2luZyBwbGlwX29wZW4gdGhlIHBvaW50LXRvLXBvaW50CisJICAgYWRkcmVzcyBpc24ndCB5ZXQga25vd24uCisJICAgUExJUCBkb2Vzbid0IGhhdmUgYSByZWFsIE1BQyBhZGRyZXNzLCBidXQgd2UgbmVlZCBpdCB0byBiZQorCSAgIERPUyBjb21wYXRpYmxlLCBhbmQgdG8gcHJvcGVybHkgc3VwcG9ydCB0YXBzIChvdGhlcndpc2UsCisJICAgd2hlbiB0aGUgZGV2aWNlIGFkZHJlc3MgaXNuJ3QgaWRlbnRpY2FsIHRvIHRoZSBhZGRyZXNzIG9mIGEKKwkgICByZWNlaXZlZCBmcmFtZSwgdGhlIGtlcm5lbCBpbmNvcnJlY3RseSBkcm9wcyBpdCkuICAgICAgICAgICAgICovCisKKwlpZiAoKGluX2Rldj1kZXYtPmlwX3B0cikgIT0gTlVMTCkgeworCQkvKiBBbnkgYWRkcmVzcyB3aWxsIGRvIC0gd2UgdGFrZSB0aGUgZmlyc3QuIFdlIGFscmVhZHkKKwkJICAgaGF2ZSB0aGUgZmlyc3QgdHdvIGJ5dGVzIGZpbGxlZCB3aXRoIDB4ZmMsIGZyb20KKwkJICAgcGxpcF9pbml0X2RldigpLiAqLworCQlzdHJ1Y3QgaW5faWZhZGRyICppZmE9aW5fZGV2LT5pZmFfbGlzdDsKKwkJaWYgKGlmYSAhPSBOVUxMKSB7CisJCQltZW1jcHkoZGV2LT5kZXZfYWRkcisyLCAmaWZhLT5pZmFfbG9jYWwsIDQpOworCQl9CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUgKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIGludmVyc2Ugcm91dGluZSB0byBwbGlwX29wZW4gKCkuICovCitzdGF0aWMgaW50CitwbGlwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbmwgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwbGlwX2xvY2FsICpzbmQgPSAmbmwtPnNuZF9kYXRhOworCXN0cnVjdCBwbGlwX2xvY2FsICpyY3YgPSAmbmwtPnJjdl9kYXRhOworCisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKwlESVNBQkxFKGRldi0+aXJxKTsKKwlzeW5jaHJvbml6ZV9pcnEoZGV2LT5pcnEpOworCisJaWYgKGRldi0+aXJxID09IC0xKQorCXsKKwkJaW5pdF9NVVRFWF9MT0NLRUQgKCZubC0+a2lsbGVkX3RpbWVyX3NlbSk7CisJCWF0b21pY19zZXQgKCZubC0+a2lsbF90aW1lciwgMSk7CisJCWRvd24gKCZubC0+a2lsbGVkX3RpbWVyX3NlbSk7CisJfQorCisjaWZkZWYgTk9UREVGCisJb3V0YigweDAwLCBQQVJfREFUQShkZXYpKTsKKyNlbmRpZgorCW5sLT5pc19kZWZlcnJlZCA9IDA7CisJbmwtPmNvbm5lY3Rpb24gPSBQTElQX0NOX05PTkU7CisJaWYgKG5sLT5wb3J0X293bmVyKSB7CisJCXBhcnBvcnRfcmVsZWFzZShubC0+cGFyZGV2KTsKKwkJbmwtPnBvcnRfb3duZXIgPSAwOworCX0KKworCXNuZC0+c3RhdGUgPSBQTElQX1BLX0RPTkU7CisJaWYgKHNuZC0+c2tiKSB7CisJCWRldl9rZnJlZV9za2Ioc25kLT5za2IpOworCQlzbmQtPnNrYiA9IE5VTEw7CisJfQorCXJjdi0+c3RhdGUgPSBQTElQX1BLX0RPTkU7CisJaWYgKHJjdi0+c2tiKSB7CisJCWtmcmVlX3NrYihyY3YtPnNrYik7CisJCXJjdi0+c2tiID0gTlVMTDsKKwl9CisKKyNpZmRlZiBOT1RERUYKKwkvKiBSZXNldC4gKi8KKwlvdXRiKDB4MDAsIFBBUl9DT05UUk9MKGRldikpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3BsaXBfcHJlZW1wdCh2b2lkICpoYW5kbGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWhhbmRsZTsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpubCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBTdGFuZCBvdXIgZ3JvdW5kIGlmIGEgZGF0YWdyYW0gaXMgb24gdGhlIHdpcmUgKi8KKwlpZiAobmwtPmNvbm5lY3Rpb24gIT0gUExJUF9DTl9OT05FKSB7CisJCW5sLT5zaG91bGRfcmVsaW5xdWlzaCA9IDE7CisJCXJldHVybiAxOworCX0KKworCW5sLT5wb3J0X293bmVyID0gMDsJLyogUmVtZW1iZXIgdGhhdCB3ZSByZWxlYXNlZCB0aGUgYnVzICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitwbGlwX3dha2V1cCh2b2lkICpoYW5kbGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWhhbmRsZTsKKwlzdHJ1Y3QgbmV0X2xvY2FsICpubCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAobmwtPnBvcnRfb3duZXIpIHsKKwkJLyogV2h5IGFyZSB3ZSBiZWluZyB3b2tlbiB1cD8gKi8KKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3aHkgYW0gSSBiZWluZyB3b2tlbiB1cD9cbiIsIGRldi0+bmFtZSk7CisJCWlmICghcGFycG9ydF9jbGFpbShubC0+cGFyZGV2KSkKKwkJCS8qIGJ1c19vd25lciBpcyBhbHJlYWR5IHNldCAoYnV0IHdoeT8pICovCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEknbSBicm9rZW4uXG4iLCBkZXYtPm5hbWUpOworCQllbHNlCisJCQlyZXR1cm47CisJfQorCQorCWlmICghKGRldi0+ZmxhZ3MgJiBJRkZfVVApKQorCQkvKiBEb24ndCBuZWVkIHRoZSBwb3J0IHdoZW4gdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJCXJldHVybjsKKworCWlmICghcGFycG9ydF9jbGFpbShubC0+cGFyZGV2KSkgeworCQlubC0+cG9ydF9vd25lciA9IDE7CisJCS8qIENsZWFyIHRoZSBkYXRhIHBvcnQuICovCisJCXdyaXRlX2RhdGEgKGRldiwgMHgwMCk7CisJfQorCisJcmV0dXJuOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgorcGxpcF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpubCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnIgPSAmbmwtPmVuZXRfc3RhdHM7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludAorcGxpcF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBuZXRfbG9jYWwgKm5sID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGxpcGNvbmYgKnBjID0gKHN0cnVjdCBwbGlwY29uZiAqKSAmcnEtPmlmcl9pZnJ1OworCisJaWYgKGNtZCAhPSBTSU9DREVWUExJUCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJc3dpdGNoKHBjLT5wY21kKSB7CisJY2FzZSBQTElQX0dFVF9USU1FT1VUOgorCQlwYy0+dHJpZ2dlciA9IG5sLT50cmlnZ2VyOworCQlwYy0+bmliYmxlICA9IG5sLT5uaWJibGU7CisJCWJyZWFrOworCWNhc2UgUExJUF9TRVRfVElNRU9VVDoKKwkJaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlubC0+dHJpZ2dlciA9IHBjLT50cmlnZ2VyOworCQlubC0+bmliYmxlICA9IHBjLT5uaWJibGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIDA7Cit9CisMCitzdGF0aWMgaW50IHBhcnBvcnRbUExJUF9NQVhdID0geyBbMCAuLi4gUExJUF9NQVgtMV0gPSAtMSB9Oworc3RhdGljIGludCB0aW1pZDsKKworbW9kdWxlX3BhcmFtX2FycmF5KHBhcnBvcnQsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0odGltaWQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBhcnBvcnQsICJMaXN0IG9mIHBhcnBvcnQgZGV2aWNlIG51bWJlcnMgdG8gdXNlIGJ5IHBsaXAiKTsKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfcGxpcFtQTElQX01BWF0gPSB7IE5VTEwsIH07CisKK3N0YXRpYyBpbmxpbmUgaW50CitwbGlwX3NlYXJjaGZvcihpbnQgbGlzdFtdLCBpbnQgYSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgUExJUF9NQVggJiYgbGlzdFtpXSAhPSAtMTsgaSsrKSB7CisJCWlmIChsaXN0W2ldID09IGEpIHJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogcGxpcF9hdHRhY2goKSBpcyBjYWxsZWQgKGJ5IHRoZSBwYXJwb3J0IGNvZGUpIHdoZW4gYSBwb3J0IGlzCisgKiBhdmFpbGFibGUgdG8gdXNlLiAqLworc3RhdGljIHZvaWQgcGxpcF9hdHRhY2ggKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQoreworCXN0YXRpYyBpbnQgdW5pdDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBuZXRfbG9jYWwgKm5sOworCWNoYXIgbmFtZVtJRk5BTVNJWl07CisKKwlpZiAoKHBhcnBvcnRbMF0gPT0gLTEgJiYgKCF0aW1pZCB8fCAhcG9ydC0+ZGV2aWNlcykpIHx8IAorCSAgICBwbGlwX3NlYXJjaGZvcihwYXJwb3J0LCBwb3J0LT5udW1iZXIpKSB7CisJCWlmICh1bml0ID09IFBMSVBfTUFYKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInBsaXA6IHRvbyBtYW55IGRldmljZXNcbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJc3ByaW50ZihuYW1lLCAicGxpcCVkIiwgdW5pdCk7CisJCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisJCWlmICghZGV2KSB7CisJCQlwcmludGsoS0VSTl9FUlIgInBsaXA6IG1lbW9yeSBzcXVlZXplXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJc3RyY3B5KGRldi0+bmFtZSwgbmFtZSk7CisKKwkJU0VUX01PRFVMRV9PV05FUihkZXYpOworCQlkZXYtPmlycSA9IHBvcnQtPmlycTsKKwkJZGV2LT5iYXNlX2FkZHIgPSBwb3J0LT5iYXNlOworCQlpZiAocG9ydC0+aXJxID09IC0xKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJwbGlwOiAlcyBoYXMgbm8gSVJRLiBVc2luZyBJUlEtbGVzcyBtb2RlLCIKKwkJICAgICAgICAgICAgICAgICAid2hpY2ggaXMgZmFpcmx5IGluZWZmaWNpZW50IVxuIiwgcG9ydC0+bmFtZSk7CisJCX0KKworCQlubCA9IG5ldGRldl9wcml2KGRldik7CisJCW5sLT5wYXJkZXYgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwb3J0LCBuYW1lLCBwbGlwX3ByZWVtcHQsCisJCQkJCQkgcGxpcF93YWtldXAsIHBsaXBfaW50ZXJydXB0LCAKKwkJCQkJCSAwLCBkZXYpOworCisJCWlmICghbmwtPnBhcmRldikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcGFycG9ydF9yZWdpc3RlciBmYWlsZWRcbiIsIG5hbWUpOworCQkJZ290byBlcnJfZnJlZV9kZXY7CisJCQlyZXR1cm47CisJCX0KKworCQlwbGlwX2luaXRfbmV0ZGV2KGRldik7CisKKwkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBuZXR3b3JrIHJlZ2lzdGVyIGZhaWxlZFxuIiwgbmFtZSk7CisJCQlnb3RvIGVycl9wYXJwb3J0X3VucmVnaXN0ZXI7CisJCX0KKworCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworCQlpZiAoZGV2LT5pcnEgIT0gLTEpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUGFyYWxsZWwgcG9ydCBhdCAlIzNseCwgIgorCQkJCQkgInVzaW5nIElSUSAlZC5cbiIsCisJCQkJICAgICAgICAgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworCQllbHNlCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUGFyYWxsZWwgcG9ydCBhdCAlIzNseCwgIgorCQkJCQkgIm5vdCB1c2luZyBJUlEuXG4iLAorCQkJCQkgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkcik7CisJCWRldl9wbGlwW3VuaXQrK10gPSBkZXY7CisJfQorCXJldHVybjsKKworZXJyX3BhcnBvcnRfdW5yZWdpc3RlcjoKKwlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKG5sLT5wYXJkZXYpOworZXJyX2ZyZWVfZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuOworfQorCisvKiBwbGlwX2RldGFjaCgpIGlzIGNhbGxlZCAoYnkgdGhlIHBhcnBvcnQgY29kZSkgd2hlbiBhIHBvcnQgaXMKKyAqIG5vIGxvbmdlciBhdmFpbGFibGUgdG8gdXNlLiAqLworc3RhdGljIHZvaWQgcGxpcF9kZXRhY2ggKHN0cnVjdCBwYXJwb3J0ICpwb3J0KQoreworCS8qIE5vdGhpbmcgdG8gZG8gKi8KK30KKworc3RhdGljIHN0cnVjdCBwYXJwb3J0X2RyaXZlciBwbGlwX2RyaXZlciA9IHsKKwkubmFtZQk9ICJwbGlwIiwKKwkuYXR0YWNoID0gcGxpcF9hdHRhY2gsCisJLmRldGFjaCA9IHBsaXBfZGV0YWNoCit9OworCitzdGF0aWMgdm9pZCBfX2V4aXQgcGxpcF9jbGVhbnVwX21vZHVsZSAodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpOworCisJcGFycG9ydF91bnJlZ2lzdGVyX2RyaXZlciAoJnBsaXBfZHJpdmVyKTsKKworCWZvciAoaT0wOyBpIDwgUExJUF9NQVg7IGkrKykgeworCQlpZiAoKGRldiA9IGRldl9wbGlwW2ldKSkgeworCQkJc3RydWN0IG5ldF9sb2NhbCAqbmwgPSBuZXRkZXZfcHJpdihkZXYpOworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWlmIChubC0+cG9ydF9vd25lcikKKwkJCQlwYXJwb3J0X3JlbGVhc2UobmwtPnBhcmRldik7CisJCQlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKG5sLT5wYXJkZXYpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCWRldl9wbGlwW2ldID0gTlVMTDsKKwkJfQorCX0KK30KKworI2lmbmRlZiBNT0RVTEUKKworc3RhdGljIGludCBwYXJwb3J0X3B0cjsKKworc3RhdGljIGludCBfX2luaXQgcGxpcF9zZXR1cChjaGFyICpzdHIpCit7CisJaW50IGludHNbNF07CisKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCisJLyogVWdoLiAqLworCWlmICghc3RybmNtcChzdHIsICJwYXJwb3J0IiwgNykpIHsKKwkJaW50IG4gPSBzaW1wbGVfc3RydG91bChzdHIrNywgTlVMTCwgMTApOworCQlpZiAocGFycG9ydF9wdHIgPCBQTElQX01BWCkKKwkJCXBhcnBvcnRbcGFycG9ydF9wdHIrK10gPSBuOworCQllbHNlCisJCQlwcmludGsoS0VSTl9JTkZPICJwbGlwOiB0b28gbWFueSBwb3J0cywgJXMgaWdub3JlZC5cbiIsCisJCQkgICAgICAgc3RyKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAidGltaWQiKSkgeworCQl0aW1pZCA9IDE7CisJfSBlbHNlIHsKKwkJaWYgKGludHNbMF0gPT0gMCB8fCBpbnRzWzFdID09IDApIHsKKwkJCS8qIGRpc2FibGUgZHJpdmVyIG9uICJwbGlwPSIgb3IgInBsaXA9MCIgKi8KKwkJCXBhcnBvcnRbMF0gPSAtMjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIndhcm5pbmc6ICdwbGlwPTB4JXgnIGlnbm9yZWRcbiIsIAorCQkJICAgICAgIGludHNbMV0pOworCQl9CisJfQorCXJldHVybiAxOworfQorCitfX3NldHVwKCJwbGlwPSIsIHBsaXBfc2V0dXApOworCisjZW5kaWYgLyogIU1PRFVMRSAqLworCitzdGF0aWMgaW50IF9faW5pdCBwbGlwX2luaXQgKHZvaWQpCit7CisJaWYgKHBhcnBvcnRbMF0gPT0gLTIpCisJCXJldHVybiAwOworCisJaWYgKHBhcnBvcnRbMF0gIT0gLTEgJiYgdGltaWQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicGxpcDogd2FybmluZywgaWdub3JpbmcgYHRpbWlkJyBzaW5jZSBzcGVjaWZpYyBwb3J0cyBnaXZlbi5cbiIpOworCQl0aW1pZCA9IDA7CisJfQorCisJaWYgKHBhcnBvcnRfcmVnaXN0ZXJfZHJpdmVyICgmcGxpcF9kcml2ZXIpKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICJwbGlwOiBjb3VsZG4ndCByZWdpc3RlciBkcml2ZXJcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQocGxpcF9pbml0KTsKK21vZHVsZV9leGl0KHBsaXBfY2xlYW51cF9tb2R1bGUpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVUxFIC1ETU9EVkVSU0lPTlMgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU8yIC1nIC1mb21pdC1mcmFtZS1wb2ludGVyIC1waXBlIC1jIHBsaXAuYyIKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwX2FzeW5jLmMgYi9kcml2ZXJzL25ldC9wcHBfYXN5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2I5ZDc5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcHBwX2FzeW5jLmMKQEAgLTAsMCArMSwxMDMzIEBACisvKgorICogUFBQIGFzeW5jIHNlcmlhbCBjaGFubmVsIGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IDE5OTkgUGF1bCBNYWNrZXJyYXMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBkcml2ZXIgcHJvdmlkZXMgdGhlIGVuY2Fwc3VsYXRpb24gYW5kIGZyYW1pbmcgZm9yIHNlbmRpbmcKKyAqIGFuZCByZWNlaXZpbmcgUFBQIGZyYW1lcyBvdmVyIGFzeW5jIHNlcmlhbCBsaW5lcy4gIEl0IHJlbGllcyBvbgorICogdGhlIGdlbmVyaWMgUFBQIGxheWVyIHRvIGdpdmUgaXQgZnJhbWVzIHRvIHNlbmQgYW5kIHRvIHByb2Nlc3MKKyAqIHJlY2VpdmVkIGZyYW1lcy4gIEl0IGltcGxlbWVudHMgdGhlIFBQUCBsaW5lIGRpc2NpcGxpbmUuCisgKgorICogUGFydCBvZiB0aGUgY29kZSBpbiB0aGlzIGRyaXZlciB3YXMgaW5zcGlyZWQgYnkgdGhlIG9sZCBhc3luYy1vbmx5CisgKiBQUFAgZHJpdmVyLCB3cml0dGVuIGJ5IE1pY2hhZWwgQ2FsbGFoYW4gYW5kIEFsIExvbmd5ZWFyLCBhbmQKKyAqIHN1YnNlcXVlbnRseSBoYWNrZWQgYnkgUGF1bCBNYWNrZXJyYXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMtY2NpdHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcHBfZGVmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3BwcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcF9jaGFubmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBQUFBfVkVSU0lPTgkiMi40LjIiCisKKyNkZWZpbmUgT0JVRlNJWkUJMjU2CisKKy8qIFN0cnVjdHVyZSBmb3Igc3RvcmluZyBsb2NhbCBzdGF0ZS4gKi8KK3N0cnVjdCBhc3luY3BwcCB7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBpbnQJZmxhZ3M7CisJdW5zaWduZWQgaW50CXN0YXRlOworCXVuc2lnbmVkIGludAlyYml0czsKKwlpbnQJCW1ydTsKKwlzcGlubG9ja190CXhtaXRfbG9jazsKKwlzcGlubG9ja190CXJlY3ZfbG9jazsKKwl1bnNpZ25lZCBsb25nCXhtaXRfZmxhZ3M7CisJdTMyCQl4YWNjbVs4XTsKKwl1MzIJCXJhY2NtOworCXVuc2lnbmVkIGludAlieXRlc19zZW50OworCXVuc2lnbmVkIGludAlieXRlc19yY3ZkOworCisJc3RydWN0IHNrX2J1ZmYJKnRwa3Q7CisJaW50CQl0cGt0X3BvczsKKwl1MTYJCXRmY3M7CisJdW5zaWduZWQgY2hhcgkqb3B0cjsKKwl1bnNpZ25lZCBjaGFyCSpvbGltOworCXVuc2lnbmVkIGxvbmcJbGFzdF94bWl0OworCisJc3RydWN0IHNrX2J1ZmYJKnJwa3Q7CisJaW50CQlsY3BfZmNzOworCXN0cnVjdCBza19idWZmX2hlYWQgcnF1ZXVlOworCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHRzazsKKworCWF0b21pY190CXJlZmNudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGRlYWRfc2VtOworCXN0cnVjdCBwcHBfY2hhbm5lbCBjaGFuOwkvKiBpbnRlcmZhY2UgdG8gZ2VuZXJpYyBwcHAgbGF5ZXIgKi8KKwl1bnNpZ25lZCBjaGFyCW9idWZbT0JVRlNJWkVdOworfTsKKworLyogQml0IG51bWJlcnMgaW4geG1pdF9mbGFncyAqLworI2RlZmluZSBYTUlUX1dBS0VVUAkwCisjZGVmaW5lIFhNSVRfRlVMTAkxCisjZGVmaW5lIFhNSVRfQlVTWQkyCisKKy8qIFN0YXRlIGJpdHMgKi8KKyNkZWZpbmUgU0NfVE9TUwkJMQorI2RlZmluZSBTQ19FU0NBUEUJMgorI2RlZmluZSBTQ19QUkVWX0VSUk9SCTQKKworLyogQml0cyBpbiByYml0cyAqLworI2RlZmluZSBTQ19SQ1ZfQklUUwkoU0NfUkNWX0I3XzF8U0NfUkNWX0I3XzB8U0NfUkNWX09ERFB8U0NfUkNWX0VWTlApCisKK3N0YXRpYyBpbnQgZmxhZ190aW1lID0gSFo7Cittb2R1bGVfcGFyYW0oZmxhZ190aW1lLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmbGFnX3RpbWUsICJwcHBfYXN5bmM6IGludGVydmFsIGJldHdlZW4gZmxhZ2dlZCBwYWNrZXRzIChpbiBjbG9jayB0aWNrcykiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19MRElTQyhOX1BQUCk7CisKKy8qCisgKiBQcm90b3R5cGVzLgorICovCitzdGF0aWMgaW50IHBwcF9hc3luY19lbmNvZGUoc3RydWN0IGFzeW5jcHBwICphcCk7CitzdGF0aWMgaW50IHBwcF9hc3luY19zZW5kKHN0cnVjdCBwcHBfY2hhbm5lbCAqY2hhbiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgaW50IHBwcF9hc3luY19wdXNoKHN0cnVjdCBhc3luY3BwcCAqYXApOworc3RhdGljIHZvaWQgcHBwX2FzeW5jX2ZsdXNoX291dHB1dChzdHJ1Y3QgYXN5bmNwcHAgKmFwKTsKK3N0YXRpYyB2b2lkIHBwcF9hc3luY19pbnB1dChzdHJ1Y3QgYXN5bmNwcHAgKmFwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkgICAgY2hhciAqZmxhZ3MsIGludCBjb3VudCk7CitzdGF0aWMgaW50IHBwcF9hc3luY19pb2N0bChzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW4sIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgdm9pZCBwcHBfYXN5bmNfcHJvY2Vzcyh1bnNpZ25lZCBsb25nIGFyZyk7CisKK3N0YXRpYyB2b2lkIGFzeW5jX2xjcF9wZWVrKHN0cnVjdCBhc3luY3BwcCAqYXAsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkgICBpbnQgbGVuLCBpbnQgaW5ib3VuZCk7CisKK3N0YXRpYyBzdHJ1Y3QgcHBwX2NoYW5uZWxfb3BzIGFzeW5jX29wcyA9IHsKKwlwcHBfYXN5bmNfc2VuZCwKKwlwcHBfYXN5bmNfaW9jdGwKK307CisKKy8qCisgKiBSb3V0aW5lcyBpbXBsZW1lbnRpbmcgdGhlIFBQUCBsaW5lIGRpc2NpcGxpbmUuCisgKi8KKworLyoKKyAqIFdlIGhhdmUgYSBwb3RlbnRpYWwgcmFjZSBvbiBkZXJlZmVyZW5jaW5nIHR0eS0+ZGlzY19kYXRhLAorICogYmVjYXVzZSB0aGUgdHR5IGxheWVyIHByb3ZpZGVzIG5vIGxvY2tpbmcgYXQgYWxsIC0gdGh1cyBvbmUKKyAqIGNwdSBjb3VsZCBiZSBydW5uaW5nIHBwcF9hc3luY3R0eV9yZWNlaXZlIHdoaWxlIGFub3RoZXIKKyAqIGNhbGxzIHBwcF9hc3luY3R0eV9jbG9zZSwgd2hpY2ggemVyb2VzIHR0eS0+ZGlzY19kYXRhIGFuZAorICogZnJlZXMgdGhlIG1lbW9yeSB0aGF0IHBwcF9hc3luY3R0eV9yZWNlaXZlIGlzIHVzaW5nLiAgVGhlIGJlc3QKKyAqIHdheSB0byBmaXggdGhpcyBpcyB0byB1c2UgYSByd2xvY2sgaW4gdGhlIHR0eSBzdHJ1Y3QsIGJ1dCBmb3Igbm93CisgKiB3ZSB1c2UgYSBzaW5nbGUgZ2xvYmFsIHJ3bG9jayBmb3IgYWxsIHR0eXMgaW4gcHBwIGxpbmUgZGlzY2lwbGluZS4KKyAqCisgKiBGSVhNRTogdGhpcyBpcyBubyBsb25nZXIgdHJ1ZS4gVGhlIF9jbG9zZSBwYXRoIGZvciB0aGUgbGRpc2MgaXMgCisgKiBub3cgZ3VhcmFudGVlZCB0byBiZSBzYW5lLiAKKyAqLworc3RhdGljIERFRklORV9SV0xPQ0soZGlzY19kYXRhX2xvY2spOworCitzdGF0aWMgc3RydWN0IGFzeW5jcHBwICphcF9nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgYXN5bmNwcHAgKmFwOworCisJcmVhZF9sb2NrKCZkaXNjX2RhdGFfbG9jayk7CisJYXAgPSB0dHktPmRpc2NfZGF0YTsKKwlpZiAoYXAgIT0gTlVMTCkKKwkJYXRvbWljX2luYygmYXAtPnJlZmNudCk7CisJcmVhZF91bmxvY2soJmRpc2NfZGF0YV9sb2NrKTsKKwlyZXR1cm4gYXA7Cit9CisKK3N0YXRpYyB2b2lkIGFwX3B1dChzdHJ1Y3QgYXN5bmNwcHAgKmFwKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZhcC0+cmVmY250KSkKKwkJdXAoJmFwLT5kZWFkX3NlbSk7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiBhIHR0eSBpcyBwdXQgaW50byBQUFAgbGluZSBkaXNjaXBsaW5lLiBDYWxsZWQgaW4gcHJvY2VzcworICogY29udGV4dC4KKyAqLworc3RhdGljIGludAorcHBwX2FzeW5jdHR5X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgYXN5bmNwcHAgKmFwOworCWludCBlcnI7CisKKwllcnIgPSAtRU5PTUVNOworCWFwID0ga21hbGxvYyhzaXplb2YoKmFwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFwID09IDApCisJCWdvdG8gb3V0OworCisJLyogaW5pdGlhbGl6ZSB0aGUgYXN5bmNwcHAgc3RydWN0dXJlICovCisJbWVtc2V0KGFwLCAwLCBzaXplb2YoKmFwKSk7CisJYXAtPnR0eSA9IHR0eTsKKwlhcC0+bXJ1ID0gUFBQX01SVTsKKwlzcGluX2xvY2tfaW5pdCgmYXAtPnhtaXRfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmFwLT5yZWN2X2xvY2spOworCWFwLT54YWNjbVswXSA9IH4wVTsKKwlhcC0+eGFjY21bM10gPSAweDYwMDAwMDAwVTsKKwlhcC0+cmFjY20gPSB+MFU7CisJYXAtPm9wdHIgPSBhcC0+b2J1ZjsKKwlhcC0+b2xpbSA9IGFwLT5vYnVmOworCWFwLT5sY3BfZmNzID0gLTE7CisKKwlza2JfcXVldWVfaGVhZF9pbml0KCZhcC0+cnF1ZXVlKTsKKwl0YXNrbGV0X2luaXQoJmFwLT50c2ssIHBwcF9hc3luY19wcm9jZXNzLCAodW5zaWduZWQgbG9uZykgYXApOworCisJYXRvbWljX3NldCgmYXAtPnJlZmNudCwgMSk7CisJaW5pdF9NVVRFWF9MT0NLRUQoJmFwLT5kZWFkX3NlbSk7CisKKwlhcC0+Y2hhbi5wcml2YXRlID0gYXA7CisJYXAtPmNoYW4ub3BzID0gJmFzeW5jX29wczsKKwlhcC0+Y2hhbi5tdHUgPSBQUFBfTVJVOworCWVyciA9IHBwcF9yZWdpc3Rlcl9jaGFubmVsKCZhcC0+Y2hhbik7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZTsKKworCXR0eS0+ZGlzY19kYXRhID0gYXA7CisKKwlyZXR1cm4gMDsKKworIG91dF9mcmVlOgorCWtmcmVlKGFwKTsKKyBvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIHRoZSB0dHkgaXMgcHV0IGludG8gYW5vdGhlciBsaW5lIGRpc2NpcGxpbmUKKyAqIG9yIGl0IGhhbmdzIHVwLiAgV2UgaGF2ZSB0byB3YWl0IGZvciBhbnkgY3B1IGN1cnJlbnRseQorICogZXhlY3V0aW5nIGluIGFueSBvZiB0aGUgb3RoZXIgcHBwX2FzeW5jdHR5Xyogcm91dGluZXMgdG8KKyAqIGZpbmlzaCBiZWZvcmUgd2UgY2FuIGNhbGwgcHBwX3VucmVnaXN0ZXJfY2hhbm5lbCBhbmQgZnJlZQorICogdGhlIGFzeW5jcHBwIHN0cnVjdC4gIFRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBmcm9tCisgKiBwcm9jZXNzIGNvbnRleHQsIG5vdCBpbnRlcnJ1cHQgb3Igc29mdGlycSBjb250ZXh0LgorICovCitzdGF0aWMgdm9pZAorcHBwX2FzeW5jdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGFzeW5jcHBwICphcDsKKworCXdyaXRlX2xvY2tfaXJxKCZkaXNjX2RhdGFfbG9jayk7CisJYXAgPSB0dHktPmRpc2NfZGF0YTsKKwl0dHktPmRpc2NfZGF0YSA9IE5VTEw7CisJd3JpdGVfdW5sb2NrX2lycSgmZGlzY19kYXRhX2xvY2spOworCWlmIChhcCA9PSAwKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFdlIGhhdmUgbm93IGVuc3VyZWQgdGhhdCBub2JvZHkgY2FuIHN0YXJ0IHVzaW5nIGFwIGZyb20gbm93CisJICogb24sIGJ1dCB3ZSBoYXZlIHRvIHdhaXQgZm9yIGFsbCBleGlzdGluZyB1c2VycyB0byBmaW5pc2guCisJICogTm90ZSB0aGF0IHBwcF91bnJlZ2lzdGVyX2NoYW5uZWwgZW5zdXJlcyB0aGF0IG5vIGNhbGxzIHRvCisJICogb3VyIGNoYW5uZWwgb3BzIChpLmUuIHBwcF9hc3luY19zZW5kL2lvY3RsKSBhcmUgaW4gcHJvZ3Jlc3MKKwkgKiBieSB0aGUgdGltZSBpdCByZXR1cm5zLgorCSAqLworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmYXAtPnJlZmNudCkpCisJCWRvd24oJmFwLT5kZWFkX3NlbSk7CisJdGFza2xldF9raWxsKCZhcC0+dHNrKTsKKworCXBwcF91bnJlZ2lzdGVyX2NoYW5uZWwoJmFwLT5jaGFuKTsKKwlpZiAoYXAtPnJwa3QgIT0gMCkKKwkJa2ZyZWVfc2tiKGFwLT5ycGt0KTsKKwlza2JfcXVldWVfcHVyZ2UoJmFwLT5ycXVldWUpOworCWlmIChhcC0+dHBrdCAhPSAwKQorCQlrZnJlZV9za2IoYXAtPnRwa3QpOworCWtmcmVlKGFwKTsKK30KKworLyoKKyAqIENhbGxlZCBvbiB0dHkgaGFuZ3VwIGluIHByb2Nlc3MgY29udGV4dC4KKyAqCisgKiBXYWl0IGZvciBJL08gdG8gZHJpdmVyIHRvIGNvbXBsZXRlIGFuZCB1bnJlZ2lzdGVyIFBQUCBjaGFubmVsLgorICogVGhpcyBpcyBhbHJlYWR5IGRvbmUgYnkgdGhlIGNsb3NlIHJvdXRpbmUsIHNvIGp1c3QgY2FsbCB0aGF0LgorICovCitzdGF0aWMgaW50IHBwcF9hc3luY3R0eV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlwcHBfYXN5bmN0dHlfY2xvc2UodHR5KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgZG9lcyBub3RoaW5nIC0gbm8gZGF0YSBpcyBldmVyIGF2YWlsYWJsZSB0aGlzIHdheS4KKyAqIFBwcGQgcmVhZHMgYW5kIHdyaXRlcyBwYWNrZXRzIHZpYSAvZGV2L3BwcCBpbnN0ZWFkLgorICovCitzdGF0aWMgc3NpemVfdAorcHBwX2FzeW5jdHR5X3JlYWQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgdW5zaWduZWQgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiAtRUFHQUlOOworfQorCisvKgorICogV3JpdGUgb24gdGhlIHR0eSBkb2VzIG5vdGhpbmcsIHRoZSBwYWNrZXRzIGFsbCBjb21lIGluCisgKiBmcm9tIHRoZSBwcHAgZ2VuZXJpYyBzdHVmZi4KKyAqLworc3RhdGljIHNzaXplX3QKK3BwcF9hc3luY3R0eV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIC1FQUdBSU47Cit9CisKKy8qCisgKiBDYWxsZWQgaW4gcHJvY2VzcyBjb250ZXh0IG9ubHkuIE1heSBiZSByZS1lbnRlcmVkIGJ5IG11bHRpcGxlCisgKiBpb2N0bCBjYWxsaW5nIHRocmVhZHMuCisgKi8KKyAKK3N0YXRpYyBpbnQKK3BwcF9hc3luY3R0eV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGFzeW5jcHBwICphcCA9IGFwX2dldCh0dHkpOworCWludCBlcnIsIHZhbDsKKwlpbnQgX191c2VyICpwID0gKGludCBfX3VzZXIgKilhcmc7CisKKwlpZiAoYXAgPT0gMCkKKwkJcmV0dXJuIC1FTlhJTzsKKwllcnIgPSAtRUZBVUxUOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBQUFBJT0NHQ0hBTjoKKwkJZXJyID0gLUVOWElPOworCQlpZiAoYXAgPT0gMCkKKwkJCWJyZWFrOworCQllcnIgPSAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIocHBwX2NoYW5uZWxfaW5kZXgoJmFwLT5jaGFuKSwgcCkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ0dVTklUOgorCQllcnIgPSAtRU5YSU87CisJCWlmIChhcCA9PSAwKQorCQkJYnJlYWs7CisJCWVyciA9IC1FRkFVTFQ7CisJCWlmIChwdXRfdXNlcihwcHBfdW5pdF9udW1iZXIoJmFwLT5jaGFuKSwgcCkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFRDR0VUUzoKKwljYXNlIFRDR0VUQToKKwkJZXJyID0gbl90dHlfaW9jdGwodHR5LCBmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBUQ0ZMU0g6CisJCS8qIGZsdXNoIG91ciBidWZmZXJzIGFuZCB0aGUgc2VyaWFsIHBvcnQncyBidWZmZXIgKi8KKwkJaWYgKGFyZyA9PSBUQ0lPRkxVU0ggfHwgYXJnID09IFRDT0ZMVVNIKQorCQkJcHBwX2FzeW5jX2ZsdXNoX291dHB1dChhcCk7CisJCWVyciA9IG5fdHR5X2lvY3RsKHR0eSwgZmlsZSwgY21kLCBhcmcpOworCQlicmVhazsKKworCWNhc2UgRklPTlJFQUQ6CisJCXZhbCA9IDA7CisJCWlmIChwdXRfdXNlcih2YWwsIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT0lPQ1RMQ01EOworCX0KKworCWFwX3B1dChhcCk7CisJcmV0dXJuIGVycjsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSBmaW5lICovCitzdGF0aWMgdW5zaWduZWQgaW50CitwcHBfYXN5bmN0dHlfcG9sbChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHBwX2FzeW5jdHR5X3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlyZXR1cm4gNjU1MzU7Cit9CisKKy8qCisgKiBUaGlzIGNhbiBub3cgYmUgY2FsbGVkIGZyb20gaGFyZCBpbnRlcnJ1cHQgbGV2ZWwgYXMgd2VsbAorICogYXMgc29mdCBpbnRlcnJ1cHQgbGV2ZWwgb3IgbWFpbmxpbmUuCisgKi8KK3N0YXRpYyB2b2lkCitwcHBfYXN5bmN0dHlfcmVjZWl2ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCSAgY2hhciAqY2ZsYWdzLCBpbnQgY291bnQpCit7CisJc3RydWN0IGFzeW5jcHBwICphcCA9IGFwX2dldCh0dHkpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoYXAgPT0gMCkKKwkJcmV0dXJuOworCXNwaW5fbG9ja19pcnFzYXZlKCZhcC0+cmVjdl9sb2NrLCBmbGFncyk7CisJcHBwX2FzeW5jX2lucHV0KGFwLCBidWYsIGNmbGFncywgY291bnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwLT5yZWN2X2xvY2ssIGZsYWdzKTsKKwlpZiAoc2tiX3F1ZXVlX2xlbigmYXAtPnJxdWV1ZSkpCisJCXRhc2tsZXRfc2NoZWR1bGUoJmFwLT50c2spOworCWFwX3B1dChhcCk7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncykKKwkgICAgJiYgdHR5LT5kcml2ZXItPnVudGhyb3R0bGUpCisJCXR0eS0+ZHJpdmVyLT51bnRocm90dGxlKHR0eSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcHBfYXN5bmN0dHlfd2FrZXVwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGFzeW5jcHBwICphcCA9IGFwX2dldCh0dHkpOworCisJY2xlYXJfYml0KFRUWV9ET19XUklURV9XQUtFVVAsICZ0dHktPmZsYWdzKTsKKwlpZiAoYXAgPT0gMCkKKwkJcmV0dXJuOworCXNldF9iaXQoWE1JVF9XQUtFVVAsICZhcC0+eG1pdF9mbGFncyk7CisJdGFza2xldF9zY2hlZHVsZSgmYXAtPnRzayk7CisJYXBfcHV0KGFwKTsKK30KKworCitzdGF0aWMgc3RydWN0IHR0eV9sZGlzYyBwcHBfbGRpc2MgPSB7CisJLm93bmVyICA9IFRISVNfTU9EVUxFLAorCS5tYWdpYwk9IFRUWV9MRElTQ19NQUdJQywKKwkubmFtZQk9ICJwcHAiLAorCS5vcGVuCT0gcHBwX2FzeW5jdHR5X29wZW4sCisJLmNsb3NlCT0gcHBwX2FzeW5jdHR5X2Nsb3NlLAorCS5oYW5ndXAJPSBwcHBfYXN5bmN0dHlfaGFuZ3VwLAorCS5yZWFkCT0gcHBwX2FzeW5jdHR5X3JlYWQsCisJLndyaXRlCT0gcHBwX2FzeW5jdHR5X3dyaXRlLAorCS5pb2N0bAk9IHBwcF9hc3luY3R0eV9pb2N0bCwKKwkucG9sbAk9IHBwcF9hc3luY3R0eV9wb2xsLAorCS5yZWNlaXZlX3Jvb20gPSBwcHBfYXN5bmN0dHlfcm9vbSwKKwkucmVjZWl2ZV9idWYgPSBwcHBfYXN5bmN0dHlfcmVjZWl2ZSwKKwkud3JpdGVfd2FrZXVwID0gcHBwX2FzeW5jdHR5X3dha2V1cCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitwcHBfYXN5bmNfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSB0dHlfcmVnaXN0ZXJfbGRpc2MoTl9QUFAsICZwcHBfbGRpc2MpOworCWlmIChlcnIgIT0gMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJQUFBfYXN5bmM6IGVycm9yICVkIHJlZ2lzdGVyaW5nIGxpbmUgZGlzYy5cbiIsCisJCSAgICAgICBlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIHByb3ZpZGUgdGhlIFBQUCBjaGFubmVsIGludGVyZmFjZS4KKyAqLworc3RhdGljIGludAorcHBwX2FzeW5jX2lvY3RsKHN0cnVjdCBwcHBfY2hhbm5lbCAqY2hhbiwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGFzeW5jcHBwICphcCA9IGNoYW4tPnByaXZhdGU7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJaW50IGVyciwgdmFsOworCXUzMiBhY2NtWzhdOworCisJZXJyID0gLUVGQVVMVDsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUFBQSU9DR0ZMQUdTOgorCQl2YWwgPSBhcC0+ZmxhZ3MgfCBhcC0+cmJpdHM7CisJCWlmIChwdXRfdXNlcih2YWwsIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCWNhc2UgUFBQSU9DU0ZMQUdTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCWJyZWFrOworCQlhcC0+ZmxhZ3MgPSB2YWwgJiB+U0NfUkNWX0JJVFM7CisJCXNwaW5fbG9ja19pcnEoJmFwLT5yZWN2X2xvY2spOworCQlhcC0+cmJpdHMgPSB2YWwgJiBTQ19SQ1ZfQklUUzsKKwkJc3Bpbl91bmxvY2tfaXJxKCZhcC0+cmVjdl9sb2NrKTsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ0dBU1lOQ01BUDoKKwkJaWYgKHB1dF91c2VyKGFwLT54YWNjbVswXSwgKHUzMiBfX3VzZXIgKilhcmdwKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKwljYXNlIFBQUElPQ1NBU1lOQ01BUDoKKwkJaWYgKGdldF91c2VyKGFwLT54YWNjbVswXSwgKHUzMiBfX3VzZXIgKilhcmdwKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DR1JBU1lOQ01BUDoKKwkJaWYgKHB1dF91c2VyKGFwLT5yYWNjbSwgKHUzMiBfX3VzZXIgKilhcmdwKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKwljYXNlIFBQUElPQ1NSQVNZTkNNQVA6CisJCWlmIChnZXRfdXNlcihhcC0+cmFjY20sICh1MzIgX191c2VyICopYXJncCkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ0dYQVNZTkNNQVA6CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgYXAtPnhhY2NtLCBzaXplb2YoYXAtPnhhY2NtKSkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisJY2FzZSBQUFBJT0NTWEFTWU5DTUFQOgorCQlpZiAoY29weV9mcm9tX3VzZXIoYWNjbSwgYXJncCwgc2l6ZW9mKGFjY20pKSkKKwkJCWJyZWFrOworCQlhY2NtWzJdICY9IH4weDQwMDAwMDAwVTsJLyogY2FuJ3QgZXNjYXBlIDB4NWUgKi8KKwkJYWNjbVszXSB8PSAweDYwMDAwMDAwVTsJCS8qIG11c3QgZXNjYXBlIDB4N2QsIDB4N2UgKi8KKwkJbWVtY3B5KGFwLT54YWNjbSwgYWNjbSwgc2l6ZW9mKGFwLT54YWNjbSkpOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DR01SVToKKwkJaWYgKHB1dF91c2VyKGFwLT5tcnUsIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCWNhc2UgUFBQSU9DU01SVToKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlicmVhazsKKwkJaWYgKHZhbCA8IFBQUF9NUlUpCisJCQl2YWwgPSBQUFBfTVJVOworCQlhcC0+bXJ1ID0gdmFsOworCQllcnIgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FTk9UVFk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGF0IHNvZnRpcnEgbGV2ZWwgdG8gZGVsaXZlciByZWNlaXZlZCBwYWNrZXRzCisgKiB0byB0aGUgcHBwX2dlbmVyaWMgY29kZSwgYW5kIHRvIHRlbGwgdGhlIHBwcF9nZW5lcmljIGNvZGUKKyAqIGlmIHdlIGNhbiBhY2NlcHQgbW9yZSBvdXRwdXQgbm93LgorICovCitzdGF0aWMgdm9pZCBwcHBfYXN5bmNfcHJvY2Vzcyh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYXN5bmNwcHAgKmFwID0gKHN0cnVjdCBhc3luY3BwcCAqKSBhcmc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCS8qIHByb2Nlc3MgcmVjZWl2ZWQgcGFja2V0cyAqLworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmFwLT5ycXVldWUpKSAhPSBOVUxMKSB7CisJCWlmIChza2ItPmNiWzBdKQorCQkJcHBwX2lucHV0X2Vycm9yKCZhcC0+Y2hhbiwgMCk7CisJCXBwcF9pbnB1dCgmYXAtPmNoYW4sIHNrYik7CisJfQorCisJLyogdHJ5IHRvIHB1c2ggbW9yZSBzdHVmZiBvdXQgKi8KKwlpZiAodGVzdF9iaXQoWE1JVF9XQUtFVVAsICZhcC0+eG1pdF9mbGFncykgJiYgcHBwX2FzeW5jX3B1c2goYXApKQorCQlwcHBfb3V0cHV0X3dha2V1cCgmYXAtPmNoYW4pOworfQorCisvKgorICogUHJvY2VkdXJlcyBmb3IgZW5jYXBzdWxhdGlvbiBhbmQgZnJhbWluZy4KKyAqLworCisvKgorICogUHJvY2VkdXJlIHRvIGVuY29kZSB0aGUgZGF0YSBmb3IgYXN5bmMgc2VyaWFsIHRyYW5zbWlzc2lvbi4KKyAqIERvZXMgb2N0ZXQgc3R1ZmZpbmcgKGVzY2FwaW5nKSwgcHV0cyB0aGUgYWRkcmVzcy9jb250cm9sIGJ5dGVzCisgKiBvbiBpZiBBL0MgY29tcHJlc3Npb24gaXMgZGlzYWJsZWQsIGFuZCBkb2VzIHByb3RvY29sIGNvbXByZXNzaW9uLgorICogQXNzdW1lcyBhcC0+dHBrdCAhPSAwIG9uIGVudHJ5LgorICogUmV0dXJucyAxIGlmIHdlIGZpbmlzaGVkIHRoZSBjdXJyZW50IGZyYW1lLCAwIG90aGVyd2lzZS4KKyAqLworCisjZGVmaW5lIFBVVF9CWVRFKGFwLCBidWYsIGMsIGlzbGNwKQlkbyB7CQlcCisJaWYgKChpc2xjcCAmJiBjIDwgMHgyMCkgfHwgKGFwLT54YWNjbVtjID4+IDVdICYgKDEgPDwgKGMgJiAweDFmKSkpKSB7XAorCQkqYnVmKysgPSBQUFBfRVNDQVBFOwkJCVwKKwkJKmJ1ZisrID0gYyBeIDB4MjA7CQkJXAorCX0gZWxzZQkJCQkJCVwKKwkJKmJ1ZisrID0gYzsJCQkJXAorfSB3aGlsZSAoMCkKKworc3RhdGljIGludAorcHBwX2FzeW5jX2VuY29kZShzdHJ1Y3QgYXN5bmNwcHAgKmFwKQoreworCWludCBmY3MsIGksIGNvdW50LCBjLCBwcm90bzsKKwl1bnNpZ25lZCBjaGFyICpidWYsICpidWZsaW07CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwlpbnQgaXNsY3A7CisKKwlidWYgPSBhcC0+b2J1ZjsKKwlhcC0+b2xpbSA9IGJ1ZjsKKwlhcC0+b3B0ciA9IGJ1ZjsKKwlpID0gYXAtPnRwa3RfcG9zOworCWRhdGEgPSBhcC0+dHBrdC0+ZGF0YTsKKwljb3VudCA9IGFwLT50cGt0LT5sZW47CisJZmNzID0gYXAtPnRmY3M7CisJcHJvdG8gPSAoZGF0YVswXSA8PCA4KSArIGRhdGFbMV07CisKKwkvKgorCSAqIExDUCBwYWNrZXRzIHdpdGggY29kZSB2YWx1ZXMgYmV0d2VlbiAxIChjb25maWd1cmUtcmVxZXN0KQorCSAqIGFuZCA3IChjb2RlLXJlamVjdCkgbXVzdCBiZSBzZW50IGFzIHRob3VnaCBubyBvcHRpb25zCisJICogaGFkIGJlZW4gbmVnb3RpYXRlZC4KKwkgKi8KKwlpc2xjcCA9IHByb3RvID09IFBQUF9MQ1AgJiYgMSA8PSBkYXRhWzJdICYmIGRhdGFbMl0gPD0gNzsKKworCWlmIChpID09IDApIHsKKwkJaWYgKGlzbGNwKQorCQkJYXN5bmNfbGNwX3BlZWsoYXAsIGRhdGEsIGNvdW50LCAwKTsKKworCQkvKgorCQkgKiBTdGFydCBvZiBhIG5ldyBwYWNrZXQgLSBpbnNlcnQgdGhlIGxlYWRpbmcgRkxBRworCQkgKiBjaGFyYWN0ZXIgaWYgbmVjZXNzYXJ5LgorCQkgKi8KKwkJaWYgKGlzbGNwIHx8IGZsYWdfdGltZSA9PSAwCisJCSAgICB8fCBqaWZmaWVzIC0gYXAtPmxhc3RfeG1pdCA+PSBmbGFnX3RpbWUpCisJCQkqYnVmKysgPSBQUFBfRkxBRzsKKwkJYXAtPmxhc3RfeG1pdCA9IGppZmZpZXM7CisJCWZjcyA9IFBQUF9JTklURkNTOworCisJCS8qCisJCSAqIFB1dCBpbiB0aGUgYWRkcmVzcy9jb250cm9sIGJ5dGVzIGlmIG5lY2Vzc2FyeQorCQkgKi8KKwkJaWYgKChhcC0+ZmxhZ3MgJiBTQ19DT01QX0FDKSA9PSAwIHx8IGlzbGNwKSB7CisJCQlQVVRfQllURShhcCwgYnVmLCAweGZmLCBpc2xjcCk7CisJCQlmY3MgPSBQUFBfRkNTKGZjcywgMHhmZik7CisJCQlQVVRfQllURShhcCwgYnVmLCAweDAzLCBpc2xjcCk7CisJCQlmY3MgPSBQUFBfRkNTKGZjcywgMHgwMyk7CisJCX0KKwl9CisKKwkvKgorCSAqIE9uY2Ugd2UgcHV0IGluIHRoZSBsYXN0IGJ5dGUsIHdlIG5lZWQgdG8gcHV0IGluIHRoZSBGQ1MKKwkgKiBhbmQgY2xvc2luZyBmbGFnLCBzbyBtYWtlIHN1cmUgdGhlcmUgaXMgYXQgbGVhc3QgNyBieXRlcworCSAqIG9mIGZyZWUgc3BhY2UgaW4gdGhlIG91dHB1dCBidWZmZXIuCisJICovCisJYnVmbGltID0gYXAtPm9idWYgKyBPQlVGU0laRSAtIDY7CisJd2hpbGUgKGkgPCBjb3VudCAmJiBidWYgPCBidWZsaW0pIHsKKwkJYyA9IGRhdGFbaSsrXTsKKwkJaWYgKGkgPT0gMSAmJiBjID09IDAgJiYgKGFwLT5mbGFncyAmIFNDX0NPTVBfUFJPVCkpCisJCQljb250aW51ZTsJLyogY29tcHJlc3MgcHJvdG9jb2wgZmllbGQgKi8KKwkJZmNzID0gUFBQX0ZDUyhmY3MsIGMpOworCQlQVVRfQllURShhcCwgYnVmLCBjLCBpc2xjcCk7CisJfQorCisJaWYgKGkgPCBjb3VudCkgeworCQkvKgorCQkgKiBSZW1lbWJlciB3aGVyZSB3ZSBhcmUgdXAgdG8gaW4gdGhpcyBwYWNrZXQuCisJCSAqLworCQlhcC0+b2xpbSA9IGJ1ZjsKKwkJYXAtPnRwa3RfcG9zID0gaTsKKwkJYXAtPnRmY3MgPSBmY3M7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogV2UgaGF2ZSBmaW5pc2hlZCB0aGUgcGFja2V0LiAgQWRkIHRoZSBGQ1MgYW5kIGZsYWcuCisJICovCisJZmNzID0gfmZjczsKKwljID0gZmNzICYgMHhmZjsKKwlQVVRfQllURShhcCwgYnVmLCBjLCBpc2xjcCk7CisJYyA9IChmY3MgPj4gOCkgJiAweGZmOworCVBVVF9CWVRFKGFwLCBidWYsIGMsIGlzbGNwKTsKKwkqYnVmKysgPSBQUFBfRkxBRzsKKwlhcC0+b2xpbSA9IGJ1ZjsKKworCWtmcmVlX3NrYihhcC0+dHBrdCk7CisJYXAtPnRwa3QgPSBOVUxMOworCXJldHVybiAxOworfQorCisvKgorICogVHJhbnNtaXQtc2lkZSByb3V0aW5lcy4KKyAqLworCisvKgorICogU2VuZCBhIHBhY2tldCB0byB0aGUgcGVlciBvdmVyIGFuIGFzeW5jIHR0eSBsaW5lLgorICogUmV0dXJucyAxIGlmZiB0aGUgcGFja2V0IHdhcyBhY2NlcHRlZC4KKyAqIElmIHRoZSBwYWNrZXQgd2FzIG5vdCBhY2NlcHRlZCwgd2Ugd2lsbCBjYWxsIHBwcF9vdXRwdXRfd2FrZXVwCisgKiBhdCBzb21lIGxhdGVyIHRpbWUuCisgKi8KK3N0YXRpYyBpbnQKK3BwcF9hc3luY19zZW5kKHN0cnVjdCBwcHBfY2hhbm5lbCAqY2hhbiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgYXN5bmNwcHAgKmFwID0gY2hhbi0+cHJpdmF0ZTsKKworCXBwcF9hc3luY19wdXNoKGFwKTsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KFhNSVRfRlVMTCwgJmFwLT54bWl0X2ZsYWdzKSkKKwkJcmV0dXJuIDA7CS8qIGFscmVhZHkgZnVsbCAqLworCWFwLT50cGt0ID0gc2tiOworCWFwLT50cGt0X3BvcyA9IDA7CisKKwlwcHBfYXN5bmNfcHVzaChhcCk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBQdXNoIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSBvdXQgdG8gdGhlIHR0eS4KKyAqLworc3RhdGljIGludAorcHBwX2FzeW5jX3B1c2goc3RydWN0IGFzeW5jcHBwICphcCkKK3sKKwlpbnQgYXZhaWwsIHNlbnQsIGRvbmUgPSAwOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBhcC0+dHR5OworCWludCB0dHlfc3R1ZmZlZCA9IDA7CisKKwkvKgorCSAqIFdlIGNhbiBnZXQgY2FsbGVkIHJlY3Vyc2l2ZWx5IGhlcmUgaWYgdGhlIHR0eSB3cml0ZQorCSAqIGZ1bmN0aW9uIGNhbGxzIG91ciB3YWtldXAgZnVuY3Rpb24uICBUaGlzIGNhbiBoYXBwZW4KKwkgKiBmb3IgZXhhbXBsZSBvbiBhIHB0eSB3aXRoIGJvdGggdGhlIG1hc3RlciBhbmQgc2xhdmUKKwkgKiBzZXQgdG8gUFBQIGxpbmUgZGlzY2lwbGluZS4KKwkgKiBXZSB1c2UgdGhlIFhNSVRfQlVTWSBiaXQgdG8gZGV0ZWN0IHRoaXMgYW5kIGdldCBvdXQsCisJICogbGVhdmluZyB0aGUgWE1JVF9XQUtFVVAgYml0IHNldCB0byB0ZWxsIHRoZSBvdGhlcgorCSAqIGluc3RhbmNlIHRoYXQgaXQgbWF5IG5vdyBiZSBhYmxlIHRvIHdyaXRlIG1vcmUgbm93LgorCSAqLworCWlmICh0ZXN0X2FuZF9zZXRfYml0KFhNSVRfQlVTWSwgJmFwLT54bWl0X2ZsYWdzKSkKKwkJcmV0dXJuIDA7CisJc3Bpbl9sb2NrX2JoKCZhcC0+eG1pdF9sb2NrKTsKKwlmb3IgKDs7KSB7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoWE1JVF9XQUtFVVAsICZhcC0+eG1pdF9mbGFncykpCisJCQl0dHlfc3R1ZmZlZCA9IDA7CisJCWlmICghdHR5X3N0dWZmZWQgJiYgYXAtPm9wdHIgPCBhcC0+b2xpbSkgeworCQkJYXZhaWwgPSBhcC0+b2xpbSAtIGFwLT5vcHRyOworCQkJc2V0X2JpdChUVFlfRE9fV1JJVEVfV0FLRVVQLCAmdHR5LT5mbGFncyk7CisJCQlzZW50ID0gdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgYXAtPm9wdHIsIGF2YWlsKTsKKwkJCWlmIChzZW50IDwgMCkKKwkJCQlnb3RvIGZsdXNoOwkvKiBlcnJvciwgZS5nLiBsb3NzIG9mIENEICovCisJCQlhcC0+b3B0ciArPSBzZW50OworCQkJaWYgKHNlbnQgPCBhdmFpbCkKKwkJCQl0dHlfc3R1ZmZlZCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYXAtPm9wdHIgPj0gYXAtPm9saW0gJiYgYXAtPnRwa3QgIT0gMCkgeworCQkJaWYgKHBwcF9hc3luY19lbmNvZGUoYXApKSB7CisJCQkJLyogZmluaXNoZWQgcHJvY2Vzc2luZyBhcC0+dHBrdCAqLworCQkJCWNsZWFyX2JpdChYTUlUX0ZVTEwsICZhcC0+eG1pdF9mbGFncyk7CisJCQkJZG9uZSA9IDE7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBXZSBoYXZlbid0IG1hZGUgYW55IHByb2dyZXNzIHRoaXMgdGltZSBhcm91bmQuCisJCSAqIENsZWFyIFhNSVRfQlVTWSB0byBsZXQgb3RoZXIgY2FsbGVycyBpbiwgYnV0CisJCSAqIGFmdGVyIGRvaW5nIHNvIHdlIGhhdmUgdG8gY2hlY2sgaWYgYW55b25lIHNldAorCQkgKiBYTUlUX1dBS0VVUCBzaW5jZSB3ZSBsYXN0IGNoZWNrZWQgaXQuICBJZiB0aGV5CisJCSAqIGRpZCwgd2Ugc2hvdWxkIHRyeSBhZ2FpbiB0byBzZXQgWE1JVF9CVVNZIGFuZCBnbworCQkgKiBhcm91bmQgYWdhaW4gaW4gY2FzZSBYTUlUX0JVU1kgd2FzIHN0aWxsIHNldCB3aGVuCisJCSAqIHRoZSBvdGhlciBjYWxsZXIgdHJpZWQuCisJCSAqLworCQljbGVhcl9iaXQoWE1JVF9CVVNZLCAmYXAtPnhtaXRfZmxhZ3MpOworCQkvKiBhbnkgbW9yZSB3b3JrIHRvIGRvPyBpZiBub3QsIGV4aXQgdGhlIGxvb3AgKi8KKwkJaWYgKCEodGVzdF9iaXQoWE1JVF9XQUtFVVAsICZhcC0+eG1pdF9mbGFncykKKwkJICAgICAgfHwgKCF0dHlfc3R1ZmZlZCAmJiBhcC0+dHBrdCAhPSAwKSkpCisJCQlicmVhazsKKwkJLyogbW9yZSB3b3JrIHRvIGRvLCBzZWUgaWYgd2UgY2FuIGRvIGl0IG5vdyAqLworCQlpZiAodGVzdF9hbmRfc2V0X2JpdChYTUlUX0JVU1ksICZhcC0+eG1pdF9mbGFncykpCisJCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmFwLT54bWl0X2xvY2spOworCXJldHVybiBkb25lOworCitmbHVzaDoKKwljbGVhcl9iaXQoWE1JVF9CVVNZLCAmYXAtPnhtaXRfZmxhZ3MpOworCWlmIChhcC0+dHBrdCAhPSAwKSB7CisJCWtmcmVlX3NrYihhcC0+dHBrdCk7CisJCWFwLT50cGt0ID0gTlVMTDsKKwkJY2xlYXJfYml0KFhNSVRfRlVMTCwgJmFwLT54bWl0X2ZsYWdzKTsKKwkJZG9uZSA9IDE7CisJfQorCWFwLT5vcHRyID0gYXAtPm9saW07CisJc3Bpbl91bmxvY2tfYmgoJmFwLT54bWl0X2xvY2spOworCXJldHVybiBkb25lOworfQorCisvKgorICogRmx1c2ggb3V0cHV0IGZyb20gb3VyIGludGVybmFsIGJ1ZmZlcnMuCisgKiBDYWxsZWQgZm9yIHRoZSBUQ0ZMU0ggaW9jdGwuIENhbiBiZSBlbnRlcmVkIGluIHBhcmFsbGVsCisgKiBidXQgdGhpcyBpcyBjb3ZlcmVkIGJ5IHRoZSB4bWl0X2xvY2suCisgKi8KK3N0YXRpYyB2b2lkCitwcHBfYXN5bmNfZmx1c2hfb3V0cHV0KHN0cnVjdCBhc3luY3BwcCAqYXApCit7CisJaW50IGRvbmUgPSAwOworCisJc3Bpbl9sb2NrX2JoKCZhcC0+eG1pdF9sb2NrKTsKKwlhcC0+b3B0ciA9IGFwLT5vbGltOworCWlmIChhcC0+dHBrdCAhPSBOVUxMKSB7CisJCWtmcmVlX3NrYihhcC0+dHBrdCk7CisJCWFwLT50cGt0ID0gTlVMTDsKKwkJY2xlYXJfYml0KFhNSVRfRlVMTCwgJmFwLT54bWl0X2ZsYWdzKTsKKwkJZG9uZSA9IDE7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZhcC0+eG1pdF9sb2NrKTsKKwlpZiAoZG9uZSkKKwkJcHBwX291dHB1dF93YWtldXAoJmFwLT5jaGFuKTsKK30KKworLyoKKyAqIFJlY2VpdmUtc2lkZSByb3V0aW5lcy4KKyAqLworCisvKiBzZWUgaG93IG1hbnkgb3JkaW5hcnkgY2hhcnMgdGhlcmUgYXJlIGF0IHRoZSBzdGFydCBvZiBidWYgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzY2FuX29yZGluYXJ5KHN0cnVjdCBhc3luY3BwcCAqYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCWludCBpLCBjOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKwkJYyA9IGJ1ZltpXTsKKwkJaWYgKGMgPT0gUFBQX0VTQ0FQRSB8fCBjID09IFBQUF9GTEFHCisJCSAgICB8fCAoYyA8IDB4MjAgJiYgKGFwLT5yYWNjbSAmICgxIDw8IGMpKSAhPSAwKSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gaTsKK30KKworLyogY2FsbGVkIHdoZW4gYSBmbGFnIGlzIHNlZW4gLSBkbyBlbmQtb2YtcGFja2V0IHByb2Nlc3NpbmcgKi8KK3N0YXRpYyB2b2lkCitwcm9jZXNzX2lucHV0X3BhY2tldChzdHJ1Y3QgYXN5bmNwcHAgKmFwKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciAqcDsKKwl1bnNpZ25lZCBpbnQgbGVuLCBmY3MsIHByb3RvOworCisJc2tiID0gYXAtPnJwa3Q7CisJaWYgKGFwLT5zdGF0ZSAmIChTQ19UT1NTIHwgU0NfRVNDQVBFKSkKKwkJZ290byBlcnI7CisKKwlpZiAoc2tiID09IE5VTEwpCisJCXJldHVybjsJCS8qIDAtbGVuZ3RoIHBhY2tldCAqLworCisJLyogY2hlY2sgdGhlIEZDUyAqLworCXAgPSBza2ItPmRhdGE7CisJbGVuID0gc2tiLT5sZW47CisJaWYgKGxlbiA8IDMpCisJCWdvdG8gZXJyOwkvKiB0b28gc2hvcnQgKi8KKwlmY3MgPSBQUFBfSU5JVEZDUzsKKwlmb3IgKDsgbGVuID4gMDsgLS1sZW4pCisJCWZjcyA9IFBQUF9GQ1MoZmNzLCAqcCsrKTsKKwlpZiAoZmNzICE9IFBQUF9HT09ERkNTKQorCQlnb3RvIGVycjsJLyogYmFkIEZDUyAqLworCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSAyKTsKKworCS8qIGNoZWNrIGZvciBhZGRyZXNzL2NvbnRyb2wgYW5kIHByb3RvY29sIGNvbXByZXNzaW9uICovCisJcCA9IHNrYi0+ZGF0YTsKKwlpZiAocFswXSA9PSBQUFBfQUxMU1RBVElPTlMgJiYgcFsxXSA9PSBQUFBfVUkpIHsKKwkJLyogY2hvcCBvZmYgYWRkcmVzcy9jb250cm9sICovCisJCWlmIChza2ItPmxlbiA8IDMpCisJCQlnb3RvIGVycjsKKwkJcCA9IHNrYl9wdWxsKHNrYiwgMik7CisJfQorCXByb3RvID0gcFswXTsKKwlpZiAocHJvdG8gJiAxKSB7CisJCS8qIHByb3RvY29sIGlzIGNvbXByZXNzZWQgKi8KKwkJc2tiX3B1c2goc2tiLCAxKVswXSA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKHNrYi0+bGVuIDwgMikKKwkJCWdvdG8gZXJyOworCQlwcm90byA9IChwcm90byA8PCA4KSArIHBbMV07CisJCWlmIChwcm90byA9PSBQUFBfTENQKQorCQkJYXN5bmNfbGNwX3BlZWsoYXAsIHAsIHNrYi0+bGVuLCAxKTsKKwl9CisKKwkvKiBxdWV1ZSB0aGUgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkICovCisJc2tiLT5jYlswXSA9IGFwLT5zdGF0ZTsKKwlza2JfcXVldWVfdGFpbCgmYXAtPnJxdWV1ZSwgc2tiKTsKKwlhcC0+cnBrdCA9IE5VTEw7CisJYXAtPnN0YXRlID0gMDsKKwlyZXR1cm47CisKKyBlcnI6CisJLyogZnJhbWUgaGFkIGFuIGVycm9yLCByZW1lbWJlciB0aGF0LCByZXNldCBTQ19UT1NTICYgU0NfRVNDQVBFICovCisJYXAtPnN0YXRlID0gU0NfUFJFVl9FUlJPUjsKKwlpZiAoc2tiKQorCQlza2JfdHJpbShza2IsIDApOworfQorCisvKiBDYWxsZWQgd2hlbiB0aGUgdHR5IGRyaXZlciBoYXMgZGF0YSBmb3IgdXMuIFJ1bnMgcGFyYWxsZWwgd2l0aCB0aGUKKyAgIG90aGVyIGxkaXNjIGZ1bmN0aW9ucyBidXQgd2lsbCBub3QgYmUgcmUtZW50ZXJlZCAqLworCitzdGF0aWMgdm9pZAorcHBwX2FzeW5jX2lucHV0KHN0cnVjdCBhc3luY3BwcCAqYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJY2hhciAqZmxhZ3MsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBjLCBpLCBqLCBuLCBzLCBmOworCXVuc2lnbmVkIGNoYXIgKnNwOworCisJLyogdXBkYXRlIGJpdHMgdXNlZCBmb3IgOC1iaXQgY2xlYW5uZXNzIGRldGVjdGlvbiAqLworCWlmICh+YXAtPnJiaXRzICYgU0NfUkNWX0JJVFMpIHsKKwkJcyA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisJCQljID0gYnVmW2ldOworCQkJaWYgKGZsYWdzICE9IDAgJiYgZmxhZ3NbaV0gIT0gMCkKKwkJCQljb250aW51ZTsKKwkJCXMgfD0gKGMgJiAweDgwKT8gU0NfUkNWX0I3XzE6IFNDX1JDVl9CN18wOworCQkJYyA9ICgoYyA+PiA0KSBeIGMpICYgMHhmOworCQkJcyB8PSAoMHg2OTk2ICYgKDEgPDwgYykpPyBTQ19SQ1ZfT0REUDogU0NfUkNWX0VWTlA7CisJCX0KKwkJYXAtPnJiaXRzIHw9IHM7CisJfQorCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQkvKiBzY2FuIHRocm91Z2ggYW5kIHNlZSBob3cgbWFueSBjaGFycyB3ZSBjYW4gZG8gaW4gYnVsayAqLworCQlpZiAoKGFwLT5zdGF0ZSAmIFNDX0VTQ0FQRSkgJiYgYnVmWzBdID09IFBQUF9FU0NBUEUpCisJCQluID0gMTsKKwkJZWxzZQorCQkJbiA9IHNjYW5fb3JkaW5hcnkoYXAsIGJ1ZiwgY291bnQpOworCisJCWYgPSAwOworCQlpZiAoZmxhZ3MgIT0gMCAmJiAoYXAtPnN0YXRlICYgU0NfVE9TUykgPT0gMCkgeworCQkJLyogY2hlY2sgdGhlIGZsYWdzIHRvIHNlZSBpZiBhbnkgY2hhciBoYWQgYW4gZXJyb3IgKi8KKwkJCWZvciAoaiA9IDA7IGogPCBuOyArK2opCisJCQkJaWYgKChmID0gZmxhZ3Nbal0pICE9IDApCisJCQkJCWJyZWFrOworCQl9CisJCWlmIChmICE9IDApIHsKKwkJCS8qIHN0YXJ0IHRvc3NpbmcgKi8KKwkJCWFwLT5zdGF0ZSB8PSBTQ19UT1NTOworCisJCX0gZWxzZSBpZiAobiA+IDAgJiYgKGFwLT5zdGF0ZSAmIFNDX1RPU1MpID09IDApIHsKKwkJCS8qIHN0dWZmIHRoZSBjaGFycyBpbiB0aGUgc2tiICovCisJCQlza2IgPSBhcC0+cnBrdDsKKwkJCWlmIChza2IgPT0gMCkgeworCQkJCXNrYiA9IGRldl9hbGxvY19za2IoYXAtPm1ydSArIFBQUF9IRFJMRU4gKyAyKTsKKwkJCQlpZiAoc2tiID09IDApCisJCQkJCWdvdG8gbm9tZW07CisJCQkJLyogVHJ5IHRvIGdldCB0aGUgcGF5bG9hZCA0LWJ5dGUgYWxpZ25lZCAqLworCQkJCWlmIChidWZbMF0gIT0gUFBQX0FMTFNUQVRJT05TKQorCQkJCQlza2JfcmVzZXJ2ZShza2IsIDIgKyAoYnVmWzBdICYgMSkpOworCQkJCWFwLT5ycGt0ID0gc2tiOworCQkJfQorCQkJaWYgKG4gPiBza2JfdGFpbHJvb20oc2tiKSkgeworCQkJCS8qIHBhY2tldCBvdmVyZmxvd2VkIE1SVSAqLworCQkJCWFwLT5zdGF0ZSB8PSBTQ19UT1NTOworCQkJfSBlbHNlIHsKKwkJCQlzcCA9IHNrYl9wdXQoc2tiLCBuKTsKKwkJCQltZW1jcHkoc3AsIGJ1Ziwgbik7CisJCQkJaWYgKGFwLT5zdGF0ZSAmIFNDX0VTQ0FQRSkgeworCQkJCQlzcFswXSBePSAweDIwOworCQkJCQlhcC0+c3RhdGUgJj0gflNDX0VTQ0FQRTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAobiA+PSBjb3VudCkKKwkJCWJyZWFrOworCisJCWMgPSBidWZbbl07CisJCWlmIChmbGFncyAhPSBOVUxMICYmIGZsYWdzW25dICE9IDApIHsKKwkJCWFwLT5zdGF0ZSB8PSBTQ19UT1NTOworCQl9IGVsc2UgaWYgKGMgPT0gUFBQX0ZMQUcpIHsKKwkJCXByb2Nlc3NfaW5wdXRfcGFja2V0KGFwKTsKKwkJfSBlbHNlIGlmIChjID09IFBQUF9FU0NBUEUpIHsKKwkJCWFwLT5zdGF0ZSB8PSBTQ19FU0NBUEU7CisJCX0gZWxzZSBpZiAoSV9JWE9OKGFwLT50dHkpKSB7CisJCQlpZiAoYyA9PSBTVEFSVF9DSEFSKGFwLT50dHkpKQorCQkJCXN0YXJ0X3R0eShhcC0+dHR5KTsKKwkJCWVsc2UgaWYgKGMgPT0gU1RPUF9DSEFSKGFwLT50dHkpKQorCQkJCXN0b3BfdHR5KGFwLT50dHkpOworCQl9CisJCS8qIG90aGVyd2lzZSBpdCdzIGEgY2hhciBpbiB0aGUgcmVjdiBBQ0NNICovCisJCSsrbjsKKworCQlidWYgKz0gbjsKKwkJaWYgKGZsYWdzICE9IDApCisJCQlmbGFncyArPSBuOworCQljb3VudCAtPSBuOworCX0KKwlyZXR1cm47CisKKyBub21lbToKKwlwcmludGsoS0VSTl9FUlIgIlBQUGFzeW5jOiBubyBtZW1vcnkgKGlucHV0IHBrdClcbiIpOworCWFwLT5zdGF0ZSB8PSBTQ19UT1NTOworfQorCisvKgorICogV2UgbG9vayBhdCBMQ1AgZnJhbWVzIGdvaW5nIHBhc3Qgc28gdGhhdCB3ZSBjYW4gbm90aWNlCisgKiBhbmQgcmVhY3QgdG8gdGhlIExDUCBjb25maWd1cmUtYWNrIGZyb20gdGhlIHBlZXIuCisgKiBJbiB0aGUgc2l0dWF0aW9uIHdoZXJlIHRoZSBwZWVyIGhhcyBiZWVuIHNlbnQgYSBjb25maWd1cmUtYWNrCisgKiBhbHJlYWR5LCBMQ1AgaXMgdXAgb25jZSBpdCBoYXMgc2VudCBpdHMgY29uZmlndXJlLWFjaworICogc28gdGhlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBwYWNrZXQgY2FuIGJlIHNlbnQgd2l0aCB0aGUKKyAqIGNvbmZpZ3VyZWQgTENQIG9wdGlvbnMuICBUaGlzIGFsbG93cyB1cyB0byBwcm9jZXNzIHRoZSBmb2xsb3dpbmcKKyAqIHBhY2tldCBjb3JyZWN0bHkgd2l0aG91dCBwcHBkIG5lZWRpbmcgdG8gcmVzcG9uZCBxdWlja2x5LgorICoKKyAqIFdlIG9ubHkgcmVzcG9uZCB0byB0aGUgcmVjZWl2ZWQgY29uZmlndXJlLWFjayBpZiB3ZSBoYXZlIGp1c3QKKyAqIHNlbnQgYSBjb25maWd1cmUtcmVxdWVzdCwgYW5kIHRoZSBjb25maWd1cmUtYWNrIGNvbnRhaW5zIHRoZQorICogc2FtZSBkYXRhICh0aGlzIGlzIGNoZWNrZWQgdXNpbmcgYSAxNi1iaXQgY3JjIG9mIHRoZSBkYXRhKS4KKyAqLworI2RlZmluZSBDT05GUkVRCQkxCS8qIExDUCBjb2RlIGZpZWxkIHZhbHVlcyAqLworI2RlZmluZSBDT05GQUNLCQkyCisjZGVmaW5lIExDUF9NUlUJCTEJLyogTENQIG9wdGlvbiBudW1iZXJzICovCisjZGVmaW5lIExDUF9BU1lOQ01BUAkyCisKK3N0YXRpYyB2b2lkIGFzeW5jX2xjcF9wZWVrKHN0cnVjdCBhc3luY3BwcCAqYXAsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkgICBpbnQgbGVuLCBpbnQgaW5ib3VuZCkKK3sKKwlpbnQgZGxlbiwgZmNzLCBpLCBjb2RlOworCXUzMiB2YWw7CisKKwlkYXRhICs9IDI7CQkvKiBza2lwIHByb3RvY29sIGJ5dGVzICovCisJbGVuIC09IDI7CisJaWYgKGxlbiA8IDQpCQkvKiA0ID0gY29kZSwgSUQsIGxlbmd0aCAqLworCQlyZXR1cm47CisJY29kZSA9IGRhdGFbMF07CisJaWYgKGNvZGUgIT0gQ09ORkFDSyAmJiBjb2RlICE9IENPTkZSRVEpCisJCXJldHVybjsKKwlkbGVuID0gKGRhdGFbMl0gPDwgOCkgKyBkYXRhWzNdOworCWlmIChsZW4gPCBkbGVuKQorCQlyZXR1cm47CQkvKiBwYWNrZXQgZ290IHRydW5jYXRlZCBvciBsZW5ndGggaXMgYm9ndXMgKi8KKworCWlmIChjb2RlID09IChpbmJvdW5kPyBDT05GQUNLOiBDT05GUkVRKSkgeworCQkvKgorCQkgKiBzZW50IGNvbmZyZXEgb3IgcmVjZWl2ZWQgY29uZmFjazoKKwkJICogY2FsY3VsYXRlIHRoZSBjcmMgb2YgdGhlIGRhdGEgZnJvbSB0aGUgSUQgZmllbGQgb24uCisJCSAqLworCQlmY3MgPSBQUFBfSU5JVEZDUzsKKwkJZm9yIChpID0gMTsgaSA8IGRsZW47ICsraSkKKwkJCWZjcyA9IFBQUF9GQ1MoZmNzLCBkYXRhW2ldKTsKKworCQlpZiAoIWluYm91bmQpIHsKKwkJCS8qIG91dGJvdW5kIGNvbmZyZXEgLSByZW1lbWJlciB0aGUgY3JjIGZvciBsYXRlciAqLworCQkJYXAtPmxjcF9mY3MgPSBmY3M7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiByZWNlaXZlZCBjb25mYWNrLCBjaGVjayB0aGUgY3JjICovCisJCWZjcyBePSBhcC0+bGNwX2ZjczsKKwkJYXAtPmxjcF9mY3MgPSAtMTsKKwkJaWYgKGZjcyAhPSAwKQorCQkJcmV0dXJuOworCX0gZWxzZSBpZiAoaW5ib3VuZCkKKwkJcmV0dXJuOwkvKiBub3QgaW50ZXJlc3RlZCBpbiByZWNlaXZlZCBjb25mcmVxICovCisKKwkvKiBwcm9jZXNzIHRoZSBvcHRpb25zIGluIHRoZSBjb25mYWNrICovCisJZGF0YSArPSA0OworCWRsZW4gLT0gNDsKKwkvKiBkYXRhWzBdIGlzIGNvZGUsIGRhdGFbMV0gaXMgbGVuZ3RoICovCisJd2hpbGUgKGRsZW4gPj0gMiAmJiBkbGVuID49IGRhdGFbMV0gJiYgZGF0YVsxXSA+PSAyKSB7CisJCXN3aXRjaCAoZGF0YVswXSkgeworCQljYXNlIExDUF9NUlU6CisJCQl2YWwgPSAoZGF0YVsyXSA8PCA4KSArIGRhdGFbM107CisJCQlpZiAoaW5ib3VuZCkKKwkJCQlhcC0+bXJ1ID0gdmFsOworCQkJZWxzZQorCQkJCWFwLT5jaGFuLm10dSA9IHZhbDsKKwkJCWJyZWFrOworCQljYXNlIExDUF9BU1lOQ01BUDoKKwkJCXZhbCA9IChkYXRhWzJdIDw8IDI0KSArIChkYXRhWzNdIDw8IDE2KQorCQkJCSsgKGRhdGFbNF0gPDwgOCkgKyBkYXRhWzVdOworCQkJaWYgKGluYm91bmQpCisJCQkJYXAtPnJhY2NtID0gdmFsOworCQkJZWxzZQorCQkJCWFwLT54YWNjbVswXSA9IHZhbDsKKwkJCWJyZWFrOworCQl9CisJCWRsZW4gLT0gZGF0YVsxXTsKKwkJZGF0YSArPSBkYXRhWzFdOworCX0KK30KKworc3RhdGljIHZvaWQgX19leGl0IHBwcF9hc3luY19jbGVhbnVwKHZvaWQpCit7CisJaWYgKHR0eV9yZWdpc3Rlcl9sZGlzYyhOX1BQUCwgTlVMTCkgIT0gMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gdW5yZWdpc3RlciBQUFAgbGluZSBkaXNjaXBsaW5lXG4iKTsKK30KKworbW9kdWxlX2luaXQocHBwX2FzeW5jX2luaXQpOworbW9kdWxlX2V4aXQocHBwX2FzeW5jX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwX2RlZmxhdGUuYyBiL2RyaXZlcnMvbmV0L3BwcF9kZWZsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA3ZDYzMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BwcF9kZWZsYXRlLmMKQEAgLTAsMCArMSw2NTkgQEAKKy8qCisgKiAgPT1GSUxFVkVSU0lPTiA5ODAzMTk9PQorICoKKyAqIHBwcF9kZWZsYXRlLmMgLSBpbnRlcmZhY2UgdGhlIHpsaWIgcHJvY2VkdXJlcyBmb3IgRGVmbGF0ZSBjb21wcmVzc2lvbgorICogYW5kIGRlY29tcHJlc3Npb24gKGFzIHVzZWQgYnkgZ3ppcCkgdG8gdGhlIFBQUCBjb2RlLgorICogVGhpcyB2ZXJzaW9uIGlzIGZvciB1c2Ugd2l0aCBMaW51eCBrZXJuZWwgMS4zLlguCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0IFRoZSBBdXN0cmFsaWFuIE5hdGlvbmFsIFVuaXZlcnNpdHkuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCB3aXRob3V0IGFueQorICogd2FycmFudHksIGV4cHJlc3Mgb3IgaW1wbGllZC4gVGhlIEF1c3RyYWxpYW4gTmF0aW9uYWwgVW5pdmVyc2l0eQorICogbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvcgorICogYW55IHB1cnBvc2UuCisgKgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVU1RSQUxJQU4gTkFUSU9OQUwgVU5JVkVSU0lUWSBCRSBMSUFCTEUgVE8gQU5ZCisgKiBQQVJUWSBGT1IgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUgQU5EIElUUyBET0NVTUVOVEFUSU9OLCBFVkVOIElGCisgKiBUSEUgQVVTVFJBTElBTiBOQVRJT05BTCBVTklWRVJTSVRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZCisgKiBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUSEUgQVVTVFJBTElBTiBOQVRJT05BTCBVTklWRVJTSVRZIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKKyAqIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBTT0ZUV0FSRSBQUk9WSURFRCBIRVJFVU5ERVIgSVMKKyAqIE9OIEFOICJBUyBJUyIgQkFTSVMsIEFORCBUSEUgQVVTVFJBTElBTiBOQVRJT05BTCBVTklWRVJTSVRZIEhBUyBOTworICogT0JMSUdBVElPTiBUTyBQUk9WSURFIE1BSU5URU5BTkNFLCBTVVBQT1JULCBVUERBVEVTLCBFTkhBTkNFTUVOVFMsCisgKiBPUiBNT0RJRklDQVRJT05TLgorICoKKyAqIEZyb206IGRlZmxhdGUuYyx2IDEuMSAxOTk2LzAxLzE4IDAzOjE3OjQ4IHBhdWx1cyBFeHAKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wcHBfZGVmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcC1jb21wLmg+CisKKyNpbmNsdWRlIDxsaW51eC96bGliLmg+CisKKy8qCisgKiBTdGF0ZSBmb3IgYSBEZWZsYXRlIChkZSljb21wcmVzc29yLgorICovCitzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgeworICAgIGludAkJc2Vxbm87CisgICAgaW50CQl3X3NpemU7CisgICAgaW50CQl1bml0OworICAgIGludAkJbXJ1OworICAgIGludAkJZGVidWc7CisgICAgel9zdHJlYW0Jc3RybTsKKyAgICBzdHJ1Y3QgY29tcHN0YXQgc3RhdHM7Cit9OworCisjZGVmaW5lIERFRkxBVEVfT1ZIRAkyCQkvKiBEZWZsYXRlIG92ZXJoZWFkL3BhY2tldCAqLworCitzdGF0aWMgdm9pZAkqel9jb21wX2FsbG9jKHVuc2lnbmVkIGNoYXIgKm9wdGlvbnMsIGludCBvcHRfbGVuKTsKK3N0YXRpYyB2b2lkCSp6X2RlY29tcF9hbGxvYyh1bnNpZ25lZCBjaGFyICpvcHRpb25zLCBpbnQgb3B0X2xlbik7CitzdGF0aWMgdm9pZAl6X2NvbXBfZnJlZSh2b2lkICpzdGF0ZSk7CitzdGF0aWMgdm9pZAl6X2RlY29tcF9mcmVlKHZvaWQgKnN0YXRlKTsKK3N0YXRpYyBpbnQJel9jb21wX2luaXQodm9pZCAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgKm9wdGlvbnMsCisJCQkJIGludCBvcHRfbGVuLAorCQkJCSBpbnQgdW5pdCwgaW50IGhkcmxlbiwgaW50IGRlYnVnKTsKK3N0YXRpYyBpbnQJel9kZWNvbXBfaW5pdCh2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqb3B0aW9ucywKKwkJCQkgICBpbnQgb3B0X2xlbiwKKwkJCQkgICBpbnQgdW5pdCwgaW50IGhkcmxlbiwgaW50IG1ydSwgaW50IGRlYnVnKTsKK3N0YXRpYyBpbnQJel9jb21wcmVzcyh2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqcnB0ciwKKwkJCQl1bnNpZ25lZCBjaGFyICpvYnVmLAorCQkJCWludCBpc2l6ZSwgaW50IG9zaXplKTsKK3N0YXRpYyB2b2lkCXpfaW5jb21wKHZvaWQgKnN0YXRlLCB1bnNpZ25lZCBjaGFyICppYnVmLCBpbnQgaWNudCk7CitzdGF0aWMgaW50CXpfZGVjb21wcmVzcyh2b2lkICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqaWJ1ZiwKKwkJCQlpbnQgaXNpemUsIHVuc2lnbmVkIGNoYXIgKm9idWYsIGludCBvc2l6ZSk7CitzdGF0aWMgdm9pZAl6X2NvbXBfcmVzZXQodm9pZCAqc3RhdGUpOworc3RhdGljIHZvaWQJel9kZWNvbXBfcmVzZXQodm9pZCAqc3RhdGUpOworc3RhdGljIHZvaWQJel9jb21wX3N0YXRzKHZvaWQgKnN0YXRlLCBzdHJ1Y3QgY29tcHN0YXQgKnN0YXRzKTsKKworLyoqCisgKgl6X2NvbXBfZnJlZSAtIGZyZWUgdGhlIG1lbW9yeSB1c2VkIGJ5IGEgY29tcHJlc3NvcgorICoJQGFyZzoJcG9pbnRlciB0byB0aGUgcHJpdmF0ZSBzdGF0ZSBmb3IgdGhlIGNvbXByZXNzb3IuCisgKi8KK3N0YXRpYyB2b2lkIHpfY29tcF9mcmVlKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqKSBhcmc7CisKKwlpZiAoc3RhdGUpIHsKKwkJemxpYl9kZWZsYXRlRW5kKCZzdGF0ZS0+c3RybSk7CisJCWlmIChzdGF0ZS0+c3RybS53b3Jrc3BhY2UpCisJCQl2ZnJlZShzdGF0ZS0+c3RybS53b3Jrc3BhY2UpOworCQlrZnJlZShzdGF0ZSk7CisJfQorfQorCisvKioKKyAqCXpfY29tcF9hbGxvYyAtIGFsbG9jYXRlIHNwYWNlIGZvciBhIGNvbXByZXNzb3IuCisgKglAb3B0aW9uczogcG9pbnRlciB0byBDQ1Agb3B0aW9uIGRhdGEKKyAqCUBvcHRfbGVuOiBsZW5ndGggb2YgdGhlIENDUCBvcHRpb24gYXQgQG9wdGlvbnMuCisgKgorICoJVGhlIEBvcHRpb25zIHBvaW50ZXIgcG9pbnRzIHRvIHRoZSBhIGJ1ZmZlciBjb250YWluaW5nIHRoZQorICoJQ0NQIG9wdGlvbiBkYXRhIGZvciB0aGUgY29tcHJlc3Npb24gYmVpbmcgbmVnb3RpYXRlZC4gIEl0IGlzCisgKglmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIFJGQzE5NzksIGFuZCBkZXNjcmliZXMgdGhlIHdpbmRvdworICoJc2l6ZSB0aGF0IHRoZSBwZWVyIGlzIHJlcXVlc3RpbmcgdGhhdCB3ZSB1c2UgaW4gY29tcHJlc3NpbmcKKyAqCWRhdGEgdG8gYmUgc2VudCB0byBpdC4KKyAqCisgKglSZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBwcml2YXRlIHN0YXRlIGZvciB0aGUgY29tcHJlc3NvciwKKyAqCW9yIE5VTEwgaWYgd2UgY291bGQgbm90IGFsbG9jYXRlIGVub3VnaCBtZW1vcnkuCisgKi8KK3N0YXRpYyB2b2lkICp6X2NvbXBfYWxsb2ModW5zaWduZWQgY2hhciAqb3B0aW9ucywgaW50IG9wdF9sZW4pCit7CisJc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICpzdGF0ZTsKKwlpbnQgd19zaXplOworCisJaWYgKG9wdF9sZW4gIT0gQ0lMRU5fREVGTEFURQorCSAgICB8fCAob3B0aW9uc1swXSAhPSBDSV9ERUZMQVRFICYmIG9wdGlvbnNbMF0gIT0gQ0lfREVGTEFURV9EUkFGVCkKKwkgICAgfHwgb3B0aW9uc1sxXSAhPSBDSUxFTl9ERUZMQVRFCisJICAgIHx8IERFRkxBVEVfTUVUSE9EKG9wdGlvbnNbMl0pICE9IERFRkxBVEVfTUVUSE9EX1ZBTAorCSAgICB8fCBvcHRpb25zWzNdICE9IERFRkxBVEVfQ0hLX1NFUVVFTkNFKQorCQlyZXR1cm4gTlVMTDsKKwl3X3NpemUgPSBERUZMQVRFX1NJWkUob3B0aW9uc1syXSk7CisJaWYgKHdfc2l6ZSA8IERFRkxBVEVfTUlOX1NJWkUgfHwgd19zaXplID4gREVGTEFURV9NQVhfU0laRSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzdGF0ZSA9IChzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKikga21hbGxvYyhzaXplb2YoKnN0YXRlKSwKKwkJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0IChzdGF0ZSwgMCwgc2l6ZW9mIChzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUpKTsKKwlzdGF0ZS0+c3RybS5uZXh0X2luICAgPSBOVUxMOworCXN0YXRlLT53X3NpemUgICAgICAgICA9IHdfc2l6ZTsKKwlzdGF0ZS0+c3RybS53b3Jrc3BhY2UgPSB2bWFsbG9jKHpsaWJfZGVmbGF0ZV93b3Jrc3BhY2VzaXplKCkpOworCWlmIChzdGF0ZS0+c3RybS53b3Jrc3BhY2UgPT0gTlVMTCkKKwkJZ290byBvdXRfZnJlZTsKKworCWlmICh6bGliX2RlZmxhdGVJbml0Migmc3RhdGUtPnN0cm0sIFpfREVGQVVMVF9DT01QUkVTU0lPTiwKKwkJCSBERUZMQVRFX01FVEhPRF9WQUwsIC13X3NpemUsIDgsIFpfREVGQVVMVF9TVFJBVEVHWSkKKwkgICAgIT0gWl9PSykKKwkJZ290byBvdXRfZnJlZTsKKwlyZXR1cm4gKHZvaWQgKikgc3RhdGU7CisKK291dF9mcmVlOgorCXpfY29tcF9mcmVlKHN0YXRlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKgl6X2NvbXBfaW5pdCAtIGluaXRpYWxpemUgYSBwcmV2aW91c2x5LWFsbG9jYXRlZCBjb21wcmVzc29yLgorICoJQGFyZzoJcG9pbnRlciB0byB0aGUgcHJpdmF0ZSBzdGF0ZSBmb3IgdGhlIGNvbXByZXNzb3IKKyAqCUBvcHRpb25zOiBwb2ludGVyIHRvIHRoZSBDQ1Agb3B0aW9uIGRhdGEgZGVzY3JpYmluZyB0aGUKKyAqCQljb21wcmVzc2lvbiB0aGF0IHdhcyBuZWdvdGlhdGVkIHdpdGggdGhlIHBlZXIKKyAqCUBvcHRfbGVuOiBsZW5ndGggb2YgdGhlIENDUCBvcHRpb24gZGF0YSBhdCBAb3B0aW9ucworICoJQHVuaXQ6CVBQUCB1bml0IG51bWJlciBmb3IgZGlhZ25vc3RpYyBtZXNzYWdlcworICoJQGhkcmxlbjogaWdub3JlZCAocHJlc2VudCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpCisgKglAZGVidWc6CWRlYnVnIGZsYWc7IGlmIG5vbi16ZXJvLCBkZWJ1ZyBtZXNzYWdlcyBhcmUgcHJpbnRlZC4KKyAqCisgKglUaGUgQ0NQIG9wdGlvbnMgZGVzY3JpYmVkIGJ5IEBvcHRpb25zIG11c3QgbWF0Y2ggdGhlIG9wdGlvbnMKKyAqCXNwZWNpZmllZCB3aGVuIHRoZSBjb21wcmVzc29yIHdhcyBhbGxvY2F0ZWQuICBUaGUgY29tcHJlc3NvcgorICoJaGlzdG9yeSBpcyByZXNldC4gIFJldHVybnMgMCBmb3IgZmFpbHVyZSAoQ0NQIG9wdGlvbnMgZG9uJ3QKKyAqCW1hdGNoKSBvciAxIGZvciBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IHpfY29tcF9pbml0KHZvaWQgKmFyZywgdW5zaWduZWQgY2hhciAqb3B0aW9ucywgaW50IG9wdF9sZW4sCisJCSAgICAgICBpbnQgdW5pdCwgaW50IGhkcmxlbiwgaW50IGRlYnVnKQoreworCXN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICopIGFyZzsKKworCWlmIChvcHRfbGVuIDwgQ0lMRU5fREVGTEFURQorCSAgICB8fCAob3B0aW9uc1swXSAhPSBDSV9ERUZMQVRFICYmIG9wdGlvbnNbMF0gIT0gQ0lfREVGTEFURV9EUkFGVCkKKwkgICAgfHwgb3B0aW9uc1sxXSAhPSBDSUxFTl9ERUZMQVRFCisJICAgIHx8IERFRkxBVEVfTUVUSE9EKG9wdGlvbnNbMl0pICE9IERFRkxBVEVfTUVUSE9EX1ZBTAorCSAgICB8fCBERUZMQVRFX1NJWkUob3B0aW9uc1syXSkgIT0gc3RhdGUtPndfc2l6ZQorCSAgICB8fCBvcHRpb25zWzNdICE9IERFRkxBVEVfQ0hLX1NFUVVFTkNFKQorCQlyZXR1cm4gMDsKKworCXN0YXRlLT5zZXFubyA9IDA7CisJc3RhdGUtPnVuaXQgID0gdW5pdDsKKwlzdGF0ZS0+ZGVidWcgPSBkZWJ1ZzsKKworCXpsaWJfZGVmbGF0ZVJlc2V0KCZzdGF0ZS0+c3RybSk7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKgl6X2NvbXBfcmVzZXQgLSByZXNldCBhIHByZXZpb3VzbHktYWxsb2NhdGVkIGNvbXByZXNzb3IuCisgKglAYXJnOglwb2ludGVyIHRvIHByaXZhdGUgc3RhdGUgZm9yIHRoZSBjb21wcmVzc29yLgorICoKKyAqCVRoaXMgY2xlYXJzIHRoZSBoaXN0b3J5IGZvciB0aGUgY29tcHJlc3NvciBhbmQgbWFrZXMgaXQKKyAqCXJlYWR5IHRvIHN0YXJ0IGVtaXR0aW5nIGEgbmV3IGNvbXByZXNzZWQgc3RyZWFtLgorICovCitzdGF0aWMgdm9pZCB6X2NvbXBfcmVzZXQodm9pZCAqYXJnKQoreworCXN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICopIGFyZzsKKworCXN0YXRlLT5zZXFubyA9IDA7CisJemxpYl9kZWZsYXRlUmVzZXQoJnN0YXRlLT5zdHJtKTsKK30KKworLyoqCisgKgl6X2NvbXByZXNzIC0gY29tcHJlc3MgYSBQUFAgcGFja2V0IHdpdGggRGVmbGF0ZSBjb21wcmVzc2lvbi4KKyAqCUBhcmc6CXBvaW50ZXIgdG8gcHJpdmF0ZSBzdGF0ZSBmb3IgdGhlIGNvbXByZXNzb3IKKyAqCUBycHRyOgl1bmNvbXByZXNzZWQgcGFja2V0IChpbnB1dCkKKyAqCUBvYnVmOgljb21wcmVzc2VkIHBhY2tldCAob3V0cHV0KQorICoJQGlzaXplOglzaXplIG9mIHVuY29tcHJlc3NlZCBwYWNrZXQKKyAqCUBvc2l6ZToJc3BhY2UgYXZhaWxhYmxlIGF0IEBvYnVmCisgKgorICoJUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBjb21wcmVzc2VkIHBhY2tldCwgb3IgMCBpZiB0aGUKKyAqCXBhY2tldCBpcyBpbmNvbXByZXNzaWJsZS4KKyAqLworaW50IHpfY29tcHJlc3Modm9pZCAqYXJnLCB1bnNpZ25lZCBjaGFyICpycHRyLCB1bnNpZ25lZCBjaGFyICpvYnVmLAorCSAgICAgICBpbnQgaXNpemUsIGludCBvc2l6ZSkKK3sKKwlzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqKSBhcmc7CisJaW50IHIsIHByb3RvLCBvZmYsIG9sZW4sIG9hdmFpbDsKKwl1bnNpZ25lZCBjaGFyICp3cHRyOworCisJLyoKKwkgKiBDaGVjayB0aGF0IHRoZSBwcm90b2NvbCBpcyBpbiB0aGUgcmFuZ2Ugd2UgaGFuZGxlLgorCSAqLworCXByb3RvID0gUFBQX1BST1RPQ09MKHJwdHIpOworCWlmIChwcm90byA+IDB4M2ZmZiB8fCBwcm90byA9PSAweGZkIHx8IHByb3RvID09IDB4ZmIpCisJCXJldHVybiAwOworCisJLyogRG9uJ3QgZ2VuZXJhdGUgY29tcHJlc3NlZCBwYWNrZXRzIHdoaWNoIGFyZSBsYXJnZXIgdGhhbgorCSAgIHRoZSB1bmNvbXByZXNzZWQgcGFja2V0LiAqLworCWlmIChvc2l6ZSA+IGlzaXplKQorCQlvc2l6ZSA9IGlzaXplOworCisJd3B0ciA9IG9idWY7CisKKwkvKgorCSAqIENvcHkgb3ZlciB0aGUgUFBQIGhlYWRlciBhbmQgc3RvcmUgdGhlIDItYnl0ZSBzZXF1ZW5jZSBudW1iZXIuCisJICovCisJd3B0clswXSA9IFBQUF9BRERSRVNTKHJwdHIpOworCXdwdHJbMV0gPSBQUFBfQ09OVFJPTChycHRyKTsKKwl3cHRyWzJdID0gUFBQX0NPTVAgPj4gODsKKwl3cHRyWzNdID0gUFBQX0NPTVA7CisJd3B0ciArPSBQUFBfSERSTEVOOworCXdwdHJbMF0gPSBzdGF0ZS0+c2Vxbm8gPj4gODsKKwl3cHRyWzFdID0gc3RhdGUtPnNlcW5vOworCXdwdHIgKz0gREVGTEFURV9PVkhEOworCW9sZW4gPSBQUFBfSERSTEVOICsgREVGTEFURV9PVkhEOworCXN0YXRlLT5zdHJtLm5leHRfb3V0ID0gd3B0cjsKKwlzdGF0ZS0+c3RybS5hdmFpbF9vdXQgPSBvYXZhaWwgPSBvc2l6ZSAtIG9sZW47CisJKytzdGF0ZS0+c2Vxbm87CisKKwlvZmYgPSAocHJvdG8gPiAweGZmKSA/IDIgOiAzOwkvKiBza2lwIDFzdCBwcm90byBieXRlIGlmIDAgKi8KKwlycHRyICs9IG9mZjsKKwlzdGF0ZS0+c3RybS5uZXh0X2luID0gcnB0cjsKKwlzdGF0ZS0+c3RybS5hdmFpbF9pbiA9IChpc2l6ZSAtIG9mZik7CisKKwlmb3IgKDs7KSB7CisJCXIgPSB6bGliX2RlZmxhdGUoJnN0YXRlLT5zdHJtLCBaX1BBQ0tFVF9GTFVTSCk7CisJCWlmIChyICE9IFpfT0spIHsKKwkJCWlmIChzdGF0ZS0+ZGVidWcpCisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICJ6X2NvbXByZXNzOiBkZWZsYXRlIHJldHVybmVkICVkXG4iLCByKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzdGF0ZS0+c3RybS5hdmFpbF9vdXQgPT0gMCkgeworCQkJb2xlbiArPSBvYXZhaWw7CisJCQlzdGF0ZS0+c3RybS5uZXh0X291dCA9IE5VTEw7CisJCQlzdGF0ZS0+c3RybS5hdmFpbF9vdXQgPSBvYXZhaWwgPSAxMDAwMDAwOworCQl9IGVsc2UgeworCQkJYnJlYWs7CQkvKiBhbGwgZG9uZSAqLworCQl9CisJfQorCW9sZW4gKz0gb2F2YWlsIC0gc3RhdGUtPnN0cm0uYXZhaWxfb3V0OworCisJLyoKKwkgKiBTZWUgaWYgd2UgbWFuYWdlZCB0byByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIHBhY2tldC4KKwkgKi8KKwlpZiAob2xlbiA8IGlzaXplKSB7CisJCXN0YXRlLT5zdGF0cy5jb21wX2J5dGVzICs9IG9sZW47CisJCXN0YXRlLT5zdGF0cy5jb21wX3BhY2tldHMrKzsKKwl9IGVsc2UgeworCQlzdGF0ZS0+c3RhdHMuaW5jX2J5dGVzICs9IGlzaXplOworCQlzdGF0ZS0+c3RhdHMuaW5jX3BhY2tldHMrKzsKKwkJb2xlbiA9IDA7CisJfQorCXN0YXRlLT5zdGF0cy51bmNfYnl0ZXMgKz0gaXNpemU7CisJc3RhdGUtPnN0YXRzLnVuY19wYWNrZXRzKys7CisKKwlyZXR1cm4gb2xlbjsKK30KKworLyoqCisgKgl6X2NvbXBfc3RhdHMgLSByZXR1cm4gY29tcHJlc3Npb24gc3RhdGlzdGljcyBmb3IgYSBjb21wcmVzc29yCisgKgkJb3IgZGVjb21wcmVzc29yLgorICoJQGFyZzoJcG9pbnRlciB0byBwcml2YXRlIHNwYWNlIGZvciB0aGUgKGRlKWNvbXByZXNzb3IKKyAqCUBzdGF0czoJcG9pbnRlciB0byBhIHN0cnVjdCBjb21wc3RhdCB0byByZWNlaXZlIHRoZSByZXN1bHQuCisgKi8KK3N0YXRpYyB2b2lkIHpfY29tcF9zdGF0cyh2b2lkICphcmcsIHN0cnVjdCBjb21wc3RhdCAqc3RhdHMpCit7CisJc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKikgYXJnOworCisJKnN0YXRzID0gc3RhdGUtPnN0YXRzOworfQorCisvKioKKyAqCXpfZGVjb21wX2ZyZWUgLSBGcmVlIHRoZSBtZW1vcnkgdXNlZCBieSBhIGRlY29tcHJlc3Nvci4KKyAqCUBhcmc6CXBvaW50ZXIgdG8gcHJpdmF0ZSBzcGFjZSBmb3IgdGhlIGRlY29tcHJlc3Nvci4KKyAqLworc3RhdGljIHZvaWQgel9kZWNvbXBfZnJlZSh2b2lkICphcmcpCit7CisJc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKikgYXJnOworCisJaWYgKHN0YXRlKSB7CisJCXpsaWJfaW5mbGF0ZUVuZCgmc3RhdGUtPnN0cm0pOworCQlpZiAoc3RhdGUtPnN0cm0ud29ya3NwYWNlKQorCQkJa2ZyZWUoc3RhdGUtPnN0cm0ud29ya3NwYWNlKTsKKwkJa2ZyZWUoc3RhdGUpOworCX0KK30KKworLyoqCisgKgl6X2RlY29tcF9hbGxvYyAtIGFsbG9jYXRlIHNwYWNlIGZvciBhIGRlY29tcHJlc3Nvci4KKyAqCUBvcHRpb25zOiBwb2ludGVyIHRvIENDUCBvcHRpb24gZGF0YQorICoJQG9wdF9sZW46IGxlbmd0aCBvZiB0aGUgQ0NQIG9wdGlvbiBhdCBAb3B0aW9ucy4KKyAqCisgKglUaGUgQG9wdGlvbnMgcG9pbnRlciBwb2ludHMgdG8gdGhlIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlCisgKglDQ1Agb3B0aW9uIGRhdGEgZm9yIHRoZSBjb21wcmVzc2lvbiBiZWluZyBuZWdvdGlhdGVkLiAgSXQgaXMKKyAqCWZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gUkZDMTk3OSwgYW5kIGRlc2NyaWJlcyB0aGUgd2luZG93CisgKglzaXplIHRoYXQgd2UgYXJlIHJlcXVlc3RpbmcgdGhlIHBlZXIgdG8gdXNlIGluIGNvbXByZXNzaW5nCisgKglkYXRhIHRvIGJlIHNlbnQgdG8gdXMuCisgKgorICoJUmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgcHJpdmF0ZSBzdGF0ZSBmb3IgdGhlIGRlY29tcHJlc3NvciwKKyAqCW9yIE5VTEwgaWYgd2UgY291bGQgbm90IGFsbG9jYXRlIGVub3VnaCBtZW1vcnkuCisgKi8KK3N0YXRpYyB2b2lkICp6X2RlY29tcF9hbGxvYyh1bnNpZ25lZCBjaGFyICpvcHRpb25zLCBpbnQgb3B0X2xlbikKK3sKKwlzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKnN0YXRlOworCWludCB3X3NpemU7CisKKwlpZiAob3B0X2xlbiAhPSBDSUxFTl9ERUZMQVRFCisJICAgIHx8IChvcHRpb25zWzBdICE9IENJX0RFRkxBVEUgJiYgb3B0aW9uc1swXSAhPSBDSV9ERUZMQVRFX0RSQUZUKQorCSAgICB8fCBvcHRpb25zWzFdICE9IENJTEVOX0RFRkxBVEUKKwkgICAgfHwgREVGTEFURV9NRVRIT0Qob3B0aW9uc1syXSkgIT0gREVGTEFURV9NRVRIT0RfVkFMCisJICAgIHx8IG9wdGlvbnNbM10gIT0gREVGTEFURV9DSEtfU0VRVUVOQ0UpCisJCXJldHVybiBOVUxMOworCXdfc2l6ZSA9IERFRkxBVEVfU0laRShvcHRpb25zWzJdKTsKKwlpZiAod19zaXplIDwgREVGTEFURV9NSU5fU0laRSB8fCB3X3NpemUgPiBERUZMQVRFX01BWF9TSVpFKQorCQlyZXR1cm4gTlVMTDsKKworCXN0YXRlID0gKHN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqKSBrbWFsbG9jKHNpemVvZigqc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3RhdGUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQgKHN0YXRlLCAwLCBzaXplb2YgKHN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSkpOworCXN0YXRlLT53X3NpemUgICAgICAgICA9IHdfc2l6ZTsKKwlzdGF0ZS0+c3RybS5uZXh0X291dCAgPSBOVUxMOworCXN0YXRlLT5zdHJtLndvcmtzcGFjZSA9IGttYWxsb2MoemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSwKKwkJCQkJR0ZQX0tFUk5FTHxfX0dGUF9SRVBFQVQpOworCWlmIChzdGF0ZS0+c3RybS53b3Jrc3BhY2UgPT0gTlVMTCkKKwkJZ290byBvdXRfZnJlZTsKKworCWlmICh6bGliX2luZmxhdGVJbml0Migmc3RhdGUtPnN0cm0sIC13X3NpemUpICE9IFpfT0spCisJCWdvdG8gb3V0X2ZyZWU7CisJcmV0dXJuICh2b2lkICopIHN0YXRlOworCitvdXRfZnJlZToKKwl6X2RlY29tcF9mcmVlKHN0YXRlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKgl6X2RlY29tcF9pbml0IC0gaW5pdGlhbGl6ZSBhIHByZXZpb3VzbHktYWxsb2NhdGVkIGRlY29tcHJlc3Nvci4KKyAqCUBhcmc6CXBvaW50ZXIgdG8gdGhlIHByaXZhdGUgc3RhdGUgZm9yIHRoZSBkZWNvbXByZXNzb3IKKyAqCUBvcHRpb25zOiBwb2ludGVyIHRvIHRoZSBDQ1Agb3B0aW9uIGRhdGEgZGVzY3JpYmluZyB0aGUKKyAqCQljb21wcmVzc2lvbiB0aGF0IHdhcyBuZWdvdGlhdGVkIHdpdGggdGhlIHBlZXIKKyAqCUBvcHRfbGVuOiBsZW5ndGggb2YgdGhlIENDUCBvcHRpb24gZGF0YSBhdCBAb3B0aW9ucworICoJQHVuaXQ6CVBQUCB1bml0IG51bWJlciBmb3IgZGlhZ25vc3RpYyBtZXNzYWdlcworICoJQGhkcmxlbjogaWdub3JlZCAocHJlc2VudCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpCisgKglAbXJ1OgltYXhpbXVtIGxlbmd0aCBvZiBkZWNvbXByZXNzZWQgcGFja2V0cworICoJQGRlYnVnOglkZWJ1ZyBmbGFnOyBpZiBub24temVybywgZGVidWcgbWVzc2FnZXMgYXJlIHByaW50ZWQuCisgKgorICoJVGhlIENDUCBvcHRpb25zIGRlc2NyaWJlZCBieSBAb3B0aW9ucyBtdXN0IG1hdGNoIHRoZSBvcHRpb25zCisgKglzcGVjaWZpZWQgd2hlbiB0aGUgZGVjb21wcmVzc29yIHdhcyBhbGxvY2F0ZWQuICBUaGUgZGVjb21wcmVzc29yCisgKgloaXN0b3J5IGlzIHJlc2V0LiAgUmV0dXJucyAwIGZvciBmYWlsdXJlIChDQ1Agb3B0aW9ucyBkb24ndAorICoJbWF0Y2gpIG9yIDEgZm9yIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgel9kZWNvbXBfaW5pdCh2b2lkICphcmcsIHVuc2lnbmVkIGNoYXIgKm9wdGlvbnMsIGludCBvcHRfbGVuLAorCQkJIGludCB1bml0LCBpbnQgaGRybGVuLCBpbnQgbXJ1LCBpbnQgZGVidWcpCit7CisJc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKikgYXJnOworCisJaWYgKG9wdF9sZW4gPCBDSUxFTl9ERUZMQVRFCisJICAgIHx8IChvcHRpb25zWzBdICE9IENJX0RFRkxBVEUgJiYgb3B0aW9uc1swXSAhPSBDSV9ERUZMQVRFX0RSQUZUKQorCSAgICB8fCBvcHRpb25zWzFdICE9IENJTEVOX0RFRkxBVEUKKwkgICAgfHwgREVGTEFURV9NRVRIT0Qob3B0aW9uc1syXSkgIT0gREVGTEFURV9NRVRIT0RfVkFMCisJICAgIHx8IERFRkxBVEVfU0laRShvcHRpb25zWzJdKSAhPSBzdGF0ZS0+d19zaXplCisJICAgIHx8IG9wdGlvbnNbM10gIT0gREVGTEFURV9DSEtfU0VRVUVOQ0UpCisJCXJldHVybiAwOworCisJc3RhdGUtPnNlcW5vID0gMDsKKwlzdGF0ZS0+dW5pdCAgPSB1bml0OworCXN0YXRlLT5kZWJ1ZyA9IGRlYnVnOworCXN0YXRlLT5tcnUgICA9IG1ydTsKKworCXpsaWJfaW5mbGF0ZVJlc2V0KCZzdGF0ZS0+c3RybSk7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKgl6X2RlY29tcF9yZXNldCAtIHJlc2V0IGEgcHJldmlvdXNseS1hbGxvY2F0ZWQgZGVjb21wcmVzc29yLgorICoJQGFyZzoJcG9pbnRlciB0byBwcml2YXRlIHN0YXRlIGZvciB0aGUgZGVjb21wcmVzc29yLgorICoKKyAqCVRoaXMgY2xlYXJzIHRoZSBoaXN0b3J5IGZvciB0aGUgZGVjb21wcmVzc29yIGFuZCBtYWtlcyBpdAorICoJcmVhZHkgdG8gcmVjZWl2ZSBhIG5ldyBjb21wcmVzc2VkIHN0cmVhbS4KKyAqLworc3RhdGljIHZvaWQgel9kZWNvbXBfcmVzZXQodm9pZCAqYXJnKQoreworCXN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICopIGFyZzsKKworCXN0YXRlLT5zZXFubyA9IDA7CisJemxpYl9pbmZsYXRlUmVzZXQoJnN0YXRlLT5zdHJtKTsKK30KKworLyoqCisgKgl6X2RlY29tcHJlc3MgLSBkZWNvbXByZXNzIGEgRGVmbGF0ZS1jb21wcmVzc2VkIHBhY2tldC4KKyAqCUBhcmc6CXBvaW50ZXIgdG8gcHJpdmF0ZSBzdGF0ZSBmb3IgdGhlIGRlY29tcHJlc3NvcgorICoJQGlidWY6CXBvaW50ZXIgdG8gaW5wdXQgKGNvbXByZXNzZWQpIHBhY2tldCBkYXRhCisgKglAaXNpemU6CWxlbmd0aCBvZiBpbnB1dCBwYWNrZXQKKyAqCUBvYnVmOglwb2ludGVyIHRvIHNwYWNlIGZvciBvdXRwdXQgKGRlY29tcHJlc3NlZCkgcGFja2V0CisgKglAb3NpemU6CWFtb3VudCBvZiBzcGFjZSBhdmFpbGFibGUgYXQgQG9idWYKKyAqCisgKiBCZWNhdXNlIG9mIHBhdGVudCBwcm9ibGVtcywgd2UgcmV0dXJuIERFQ09NUF9FUlJPUiBmb3IgZXJyb3JzCisgKiBmb3VuZCBieSBpbnNwZWN0aW5nIHRoZSBpbnB1dCBkYXRhIGFuZCBmb3Igc3lzdGVtIHByb2JsZW1zLCBidXQKKyAqIERFQ09NUF9GQVRBTEVSUk9SIGZvciBhbnkgZXJyb3JzIHdoaWNoIGNvdWxkIHBvc3NpYmx5IGJlIHNhaWQgdG8KKyAqIGJlIGJlaW5nIGRldGVjdGVkICJhZnRlciIgZGVjb21wcmVzc2lvbi4gIEZvciBERUNPTVBfRVJST1IsCisgKiB3ZSBjYW4gaXNzdWUgYSBDQ1AgcmVzZXQtcmVxdWVzdDsgZm9yIERFQ09NUF9GQVRBTEVSUk9SLCB3ZSBtYXkgYmUKKyAqIGluZnJpbmdpbmcgYSBwYXRlbnQgb2YgTW90b3JvbGEncyBpZiB3ZSBkbywgc28gd2UgdGFrZSBDQ1AgZG93bgorICogaW5zdGVhZC4KKyAqCisgKiBHaXZlbiB0aGF0IHRoZSBmcmFtZSBoYXMgdGhlIGNvcnJlY3Qgc2VxdWVuY2UgbnVtYmVyIGFuZCBhIGdvb2QgRkNTLAorICogZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBjb2RlcyBpbiB0aGUgaW5wdXQgbW9zdCBsaWtlbHkgaW5kaWNhdGUgYQorICogYnVnLCBzbyB3ZSByZXR1cm4gREVDT01QX0ZBVEFMRVJST1IgZm9yIHRoZW0gaW4gb3JkZXIgdG8gdHVybiBvZmYKKyAqIGNvbXByZXNzaW9uLCBldmVuIHRob3VnaCB0aGV5IGFyZSBkZXRlY3RlZCBieSBpbnNwZWN0aW5nIHRoZSBpbnB1dC4KKyAqLworaW50IHpfZGVjb21wcmVzcyh2b2lkICphcmcsIHVuc2lnbmVkIGNoYXIgKmlidWYsIGludCBpc2l6ZSwKKwkJIHVuc2lnbmVkIGNoYXIgKm9idWYsIGludCBvc2l6ZSkKK3sKKwlzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBwcHBfZGVmbGF0ZV9zdGF0ZSAqKSBhcmc7CisJaW50IG9sZW4sIHNlcSwgcjsKKwlpbnQgZGVjb2RlX3Byb3RvLCBvdmVyZmxvdzsKKwl1bnNpZ25lZCBjaGFyIG92ZXJmbG93X2J1ZlsxXTsKKworCWlmIChpc2l6ZSA8PSBQUFBfSERSTEVOICsgREVGTEFURV9PVkhEKSB7CisJCWlmIChzdGF0ZS0+ZGVidWcpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiel9kZWNvbXByZXNzJWQ6IHNob3J0IHBrdCAoJWQpXG4iLAorCQkJICAgICAgIHN0YXRlLT51bml0LCBpc2l6ZSk7CisJCXJldHVybiBERUNPTVBfRVJST1I7CisJfQorCisJLyogQ2hlY2sgdGhlIHNlcXVlbmNlIG51bWJlci4gKi8KKwlzZXEgPSAoaWJ1ZltQUFBfSERSTEVOXSA8PCA4KSArIGlidWZbUFBQX0hEUkxFTisxXTsKKwlpZiAoc2VxICE9IChzdGF0ZS0+c2Vxbm8gJiAweGZmZmYpKSB7CisJCWlmIChzdGF0ZS0+ZGVidWcpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiel9kZWNvbXByZXNzJWQ6IGJhZCBzZXEgIyAlZCwgZXhwZWN0ZWQgJWRcbiIsCisJCQkgICAgICAgc3RhdGUtPnVuaXQsIHNlcSwgc3RhdGUtPnNlcW5vICYgMHhmZmZmKTsKKwkJcmV0dXJuIERFQ09NUF9FUlJPUjsKKwl9CisJKytzdGF0ZS0+c2Vxbm87CisKKwkvKgorCSAqIEZpbGwgaW4gdGhlIGZpcnN0IHBhcnQgb2YgdGhlIFBQUCBoZWFkZXIuICBUaGUgcHJvdG9jb2wgZmllbGQKKwkgKiBjb21lcyBmcm9tIHRoZSBkZWNvbXByZXNzZWQgZGF0YS4KKwkgKi8KKwlvYnVmWzBdID0gUFBQX0FERFJFU1MoaWJ1Zik7CisJb2J1ZlsxXSA9IFBQUF9DT05UUk9MKGlidWYpOworCW9idWZbMl0gPSAwOworCisJLyoKKwkgKiBTZXQgdXAgdG8gY2FsbCBpbmZsYXRlLiAgV2Ugc2V0IGF2YWlsX291dCB0byAxIGluaXRpYWxseSBzbyB3ZSBjYW4KKwkgKiBsb29rIGF0IHRoZSBmaXJzdCBieXRlIG9mIHRoZSBvdXRwdXQgYW5kIGRlY2lkZSB3aGV0aGVyIHdlIGhhdmUKKwkgKiBhIDEtYnl0ZSBvciAyLWJ5dGUgcHJvdG9jb2wgZmllbGQuCisJICovCisJc3RhdGUtPnN0cm0ubmV4dF9pbiA9IGlidWYgKyBQUFBfSERSTEVOICsgREVGTEFURV9PVkhEOworCXN0YXRlLT5zdHJtLmF2YWlsX2luID0gaXNpemUgLSAoUFBQX0hEUkxFTiArIERFRkxBVEVfT1ZIRCk7CisJc3RhdGUtPnN0cm0ubmV4dF9vdXQgPSBvYnVmICsgMzsKKwlzdGF0ZS0+c3RybS5hdmFpbF9vdXQgPSAxOworCWRlY29kZV9wcm90byA9IDE7CisJb3ZlcmZsb3cgPSAwOworCisJLyoKKwkgKiBDYWxsIGluZmxhdGUsIHN1cHBseWluZyBtb3JlIGlucHV0IG9yIG91dHB1dCBhcyBuZWVkZWQuCisJICovCisJZm9yICg7OykgeworCQlyID0gemxpYl9pbmZsYXRlKCZzdGF0ZS0+c3RybSwgWl9QQUNLRVRfRkxVU0gpOworCQlpZiAociAhPSBaX09LKSB7CisJCQlpZiAoc3RhdGUtPmRlYnVnKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJ6X2RlY29tcHJlc3MlZDogaW5mbGF0ZSByZXR1cm5lZCAlZCAoJXMpXG4iLAorCQkJCSAgICAgICBzdGF0ZS0+dW5pdCwgciwgKHN0YXRlLT5zdHJtLm1zZz8gc3RhdGUtPnN0cm0ubXNnOiAiIikpOworCQkJcmV0dXJuIERFQ09NUF9GQVRBTEVSUk9SOworCQl9CisJCWlmIChzdGF0ZS0+c3RybS5hdmFpbF9vdXQgIT0gMCkKKwkJCWJyZWFrOwkJLyogYWxsIGRvbmUgKi8KKwkJaWYgKGRlY29kZV9wcm90bykgeworCQkJc3RhdGUtPnN0cm0uYXZhaWxfb3V0ID0gb3NpemUgLSBQUFBfSERSTEVOOworCQkJaWYgKChvYnVmWzNdICYgMSkgPT0gMCkgeworCQkJCS8qIDItYnl0ZSBwcm90b2NvbCBmaWVsZCAqLworCQkJCW9idWZbMl0gPSBvYnVmWzNdOworCQkJCS0tc3RhdGUtPnN0cm0ubmV4dF9vdXQ7CisJCQkJKytzdGF0ZS0+c3RybS5hdmFpbF9vdXQ7CisJCQl9CisJCQlkZWNvZGVfcHJvdG8gPSAwOworCQl9IGVsc2UgaWYgKCFvdmVyZmxvdykgeworCQkJLyoKKwkJCSAqIFdlJ3ZlIGZpbGxlZCB1cCB0aGUgb3V0cHV0IGJ1ZmZlcjsgdGhlIG9ubHkgd2F5IHRvCisJCQkgKiBmaW5kIG91dCB3aGV0aGVyIGluZmxhdGUgaGFzIGFueSBtb3JlIGNoYXJhY3RlcnMKKwkJCSAqIGxlZnQgaXMgdG8gZ2l2ZSBpdCBhbm90aGVyIGJ5dGUgb2Ygb3V0cHV0IHNwYWNlLgorCQkJICovCisJCQlzdGF0ZS0+c3RybS5uZXh0X291dCA9IG92ZXJmbG93X2J1ZjsKKwkJCXN0YXRlLT5zdHJtLmF2YWlsX291dCA9IDE7CisJCQlvdmVyZmxvdyA9IDE7CisJCX0gZWxzZSB7CisJCQlpZiAoc3RhdGUtPmRlYnVnKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJ6X2RlY29tcHJlc3MlZDogcmFuIG91dCBvZiBtcnVcbiIsCisJCQkJICAgICAgIHN0YXRlLT51bml0KTsKKwkJCXJldHVybiBERUNPTVBfRkFUQUxFUlJPUjsKKwkJfQorCX0KKworCWlmIChkZWNvZGVfcHJvdG8pIHsKKwkJaWYgKHN0YXRlLT5kZWJ1ZykKKwkJCXByaW50ayhLRVJOX0RFQlVHICJ6X2RlY29tcHJlc3MlZDogZGlkbid0IGdldCBwcm90b1xuIiwKKwkJCSAgICAgICBzdGF0ZS0+dW5pdCk7CisJCXJldHVybiBERUNPTVBfRVJST1I7CisJfQorCisJb2xlbiA9IG9zaXplICsgb3ZlcmZsb3cgLSBzdGF0ZS0+c3RybS5hdmFpbF9vdXQ7CisJc3RhdGUtPnN0YXRzLnVuY19ieXRlcyArPSBvbGVuOworCXN0YXRlLT5zdGF0cy51bmNfcGFja2V0cysrOworCXN0YXRlLT5zdGF0cy5jb21wX2J5dGVzICs9IGlzaXplOworCXN0YXRlLT5zdGF0cy5jb21wX3BhY2tldHMrKzsKKworCXJldHVybiBvbGVuOworfQorCisvKioKKyAqCXpfaW5jb21wIC0gYWRkIGluY29tcHJlc3NpYmxlIGlucHV0IGRhdGEgdG8gdGhlIGhpc3RvcnkuCisgKglAYXJnOglwb2ludGVyIHRvIHByaXZhdGUgc3RhdGUgZm9yIHRoZSBkZWNvbXByZXNzb3IKKyAqCUBpYnVmOglwb2ludGVyIHRvIGlucHV0IHBhY2tldCBkYXRhCisgKglAaWNudDoJbGVuZ3RoIG9mIGlucHV0IGRhdGEuCisgKi8KK3N0YXRpYyB2b2lkIHpfaW5jb21wKHZvaWQgKmFyZywgdW5zaWduZWQgY2hhciAqaWJ1ZiwgaW50IGljbnQpCit7CisJc3RydWN0IHBwcF9kZWZsYXRlX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgcHBwX2RlZmxhdGVfc3RhdGUgKikgYXJnOworCWludCBwcm90bywgcjsKKworCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgcHJvdG9jb2wgaXMgb25lIHdlIGhhbmRsZS4KKwkgKi8KKwlwcm90byA9IFBQUF9QUk9UT0NPTChpYnVmKTsKKwlpZiAocHJvdG8gPiAweDNmZmYgfHwgcHJvdG8gPT0gMHhmZCB8fCBwcm90byA9PSAweGZiKQorCQlyZXR1cm47CisKKwkrK3N0YXRlLT5zZXFubzsKKworCS8qCisJICogV2Ugc3RhcnQgYXQgdGhlIGVpdGhlciB0aGUgMXN0IG9yIDJuZCBieXRlIG9mIHRoZSBwcm90b2NvbCBmaWVsZCwKKwkgKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcHJvdG9jb2wgdmFsdWUgaXMgY29tcHJlc3NpYmxlLgorCSAqLworCXN0YXRlLT5zdHJtLm5leHRfaW4gPSBpYnVmICsgMzsKKwlzdGF0ZS0+c3RybS5hdmFpbF9pbiA9IGljbnQgLSAzOworCWlmIChwcm90byA+IDB4ZmYpIHsKKwkJLS1zdGF0ZS0+c3RybS5uZXh0X2luOworCQkrK3N0YXRlLT5zdHJtLmF2YWlsX2luOworCX0KKworCXIgPSB6bGliX2luZmxhdGVJbmNvbXAoJnN0YXRlLT5zdHJtKTsKKwlpZiAociAhPSBaX09LKSB7CisJCS8qIGdhayEgKi8KKwkJaWYgKHN0YXRlLT5kZWJ1ZykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInpfaW5jb21wJWQ6IGluZmxhdGVJbmNvbXAgcmV0dXJuZWQgJWQgKCVzKVxuIiwKKwkJCSAgICAgICBzdGF0ZS0+dW5pdCwgciwgKHN0YXRlLT5zdHJtLm1zZz8gc3RhdGUtPnN0cm0ubXNnOiAiIikpOworCQl9CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFVwZGF0ZSBzdGF0cy4KKwkgKi8KKwlzdGF0ZS0+c3RhdHMuaW5jX2J5dGVzICs9IGljbnQ7CisJc3RhdGUtPnN0YXRzLmluY19wYWNrZXRzKys7CisJc3RhdGUtPnN0YXRzLnVuY19ieXRlcyArPSBpY250OworCXN0YXRlLT5zdGF0cy51bmNfcGFja2V0cysrOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTW9kdWxlIGludGVyZmFjZSB0YWJsZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZXNlIGFyZSBpbiBwcHBfZ2VuZXJpYy5jICovCitleHRlcm4gaW50ICBwcHBfcmVnaXN0ZXJfY29tcHJlc3NvciAgIChzdHJ1Y3QgY29tcHJlc3NvciAqY3ApOworZXh0ZXJuIHZvaWQgcHBwX3VucmVnaXN0ZXJfY29tcHJlc3NvciAoc3RydWN0IGNvbXByZXNzb3IgKmNwKTsKKworLyoKKyAqIFByb2NlZHVyZXMgZXhwb3J0ZWQgdG8gaWZfcHBwLmMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY29tcHJlc3NvciBwcHBfZGVmbGF0ZSA9IHsKKwkuY29tcHJlc3NfcHJvdG8gPQlDSV9ERUZMQVRFLAorCS5jb21wX2FsbG9jID0JCXpfY29tcF9hbGxvYywKKwkuY29tcF9mcmVlID0JCXpfY29tcF9mcmVlLAorCS5jb21wX2luaXQgPQkJel9jb21wX2luaXQsCisJLmNvbXBfcmVzZXQgPQkJel9jb21wX3Jlc2V0LAorCS5jb21wcmVzcyA9CQl6X2NvbXByZXNzLAorCS5jb21wX3N0YXQgPQkJel9jb21wX3N0YXRzLAorCS5kZWNvbXBfYWxsb2MgPQkJel9kZWNvbXBfYWxsb2MsCisJLmRlY29tcF9mcmVlID0JCXpfZGVjb21wX2ZyZWUsCisJLmRlY29tcF9pbml0ID0JCXpfZGVjb21wX2luaXQsCisJLmRlY29tcF9yZXNldCA9CQl6X2RlY29tcF9yZXNldCwKKwkuZGVjb21wcmVzcyA9CQl6X2RlY29tcHJlc3MsCisJLmluY29tcCA9CQl6X2luY29tcCwKKwkuZGVjb21wX3N0YXQgPQkJel9jb21wX3N0YXRzLAorCS5vd25lciA9CQlUSElTX01PRFVMRQorfTsKKworc3RhdGljIHN0cnVjdCBjb21wcmVzc29yIHBwcF9kZWZsYXRlX2RyYWZ0ID0geworCS5jb21wcmVzc19wcm90byA9CUNJX0RFRkxBVEVfRFJBRlQsCisJLmNvbXBfYWxsb2MgPQkJel9jb21wX2FsbG9jLAorCS5jb21wX2ZyZWUgPQkJel9jb21wX2ZyZWUsCisJLmNvbXBfaW5pdCA9CQl6X2NvbXBfaW5pdCwKKwkuY29tcF9yZXNldCA9CQl6X2NvbXBfcmVzZXQsCisJLmNvbXByZXNzID0JCXpfY29tcHJlc3MsCisJLmNvbXBfc3RhdCA9CQl6X2NvbXBfc3RhdHMsCisJLmRlY29tcF9hbGxvYyA9CQl6X2RlY29tcF9hbGxvYywKKwkuZGVjb21wX2ZyZWUgPQkJel9kZWNvbXBfZnJlZSwKKwkuZGVjb21wX2luaXQgPQkJel9kZWNvbXBfaW5pdCwKKwkuZGVjb21wX3Jlc2V0ID0JCXpfZGVjb21wX3Jlc2V0LAorCS5kZWNvbXByZXNzID0JCXpfZGVjb21wcmVzcywKKwkuaW5jb21wID0JCXpfaW5jb21wLAorCS5kZWNvbXBfc3RhdCA9CQl6X2NvbXBfc3RhdHMsCisJLm93bmVyID0JCVRISVNfTU9EVUxFCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkZWZsYXRlX2luaXQodm9pZCkKK3sgIAorICAgICAgICBpbnQgYW5zd2VyID0gcHBwX3JlZ2lzdGVyX2NvbXByZXNzb3IoJnBwcF9kZWZsYXRlKTsKKyAgICAgICAgaWYgKGFuc3dlciA9PSAwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJQUFAgRGVmbGF0ZSBDb21wcmVzc2lvbiBtb2R1bGUgcmVnaXN0ZXJlZFxuIik7CisJcHBwX3JlZ2lzdGVyX2NvbXByZXNzb3IoJnBwcF9kZWZsYXRlX2RyYWZ0KTsKKyAgICAgICAgcmV0dXJuIGFuc3dlcjsKK30KKyAgICAgCitzdGF0aWMgdm9pZCBfX2V4aXQgZGVmbGF0ZV9jbGVhbnVwKHZvaWQpCit7CisJcHBwX3VucmVnaXN0ZXJfY29tcHJlc3NvcigmcHBwX2RlZmxhdGUpOworCXBwcF91bnJlZ2lzdGVyX2NvbXByZXNzb3IoJnBwcF9kZWZsYXRlX2RyYWZ0KTsKK30KKworbW9kdWxlX2luaXQoZGVmbGF0ZV9pbml0KTsKK21vZHVsZV9leGl0KGRlZmxhdGVfY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CitNT0RVTEVfQUxJQVMoInBwcC1jb21wcmVzcy0iIF9fc3RyaW5naWZ5KENJX0RFRkxBVEUpKTsKK01PRFVMRV9BTElBUygicHBwLWNvbXByZXNzLSIgX19zdHJpbmdpZnkoQ0lfREVGTEFURV9EUkFGVCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYyBiL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1NmRjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMKQEAgLTAsMCArMSwyNzQ2IEBACisvKgorICogR2VuZXJpYyBQUFAgbGF5ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAxOTk5LTIwMDIgUGF1bCBNYWNrZXJyYXMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIGdlbmVyaWMgUFBQIGxheWVyIGhhbmRsZXMgdGhlIFBQUCBuZXR3b3JrIGludGVyZmFjZXMsIHRoZQorICogL2Rldi9wcHAgZGV2aWNlLCBwYWNrZXQgYW5kIFZKIGNvbXByZXNzaW9uLCBhbmQgbXVsdGlsaW5rLgorICogSXQgdGFsa3MgdG8gUFBQIGBjaGFubmVscycgdmlhIHRoZSBpbnRlcmZhY2UgZGVmaW5lZCBpbgorICogaW5jbHVkZS9saW51eC9wcHBfY2hhbm5lbC5oLiAgQ2hhbm5lbHMgcHJvdmlkZSB0aGUgYmFzaWMgbWVhbnMgZm9yCisgKiBzZW5kaW5nIGFuZCByZWNlaXZpbmcgUFBQIGZyYW1lcyBvbiBzb21lIGtpbmQgb2YgY29tbXVuaWNhdGlvbnMKKyAqIGNoYW5uZWwuCisgKgorICogUGFydCBvZiB0aGUgY29kZSBpbiB0aGlzIGRyaXZlciB3YXMgaW5zcGlyZWQgYnkgdGhlIG9sZCBhc3luYy1vbmx5CisgKiBQUFAgZHJpdmVyLCB3cml0dGVuIGJ5IE1pY2hhZWwgQ2FsbGFoYW4gYW5kIEFsIExvbmd5ZWFyLCBhbmQKKyAqIHN1YnNlcXVlbnRseSBoYWNrZWQgYnkgUGF1bCBNYWNrZXJyYXMuCisgKgorICogPT1GSUxFVkVSU0lPTiAyMDA0MTEwOD09CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcHBfZGVmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3BwcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcF9jaGFubmVsLmg+CisjaW5jbHVkZSA8bGludXgvcHBwLWNvbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPG5ldC9zbGhjX3ZqLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisjZGVmaW5lIFBQUF9WRVJTSU9OCSIyLjQuMiIKKworLyoKKyAqIE5ldHdvcmsgcHJvdG9jb2xzIHdlIHN1cHBvcnQuCisgKi8KKyNkZWZpbmUgTlBfSVAJMAkJLyogSW50ZXJuZXQgUHJvdG9jb2wgVjQgKi8KKyNkZWZpbmUgTlBfSVBWNgkxCQkvKiBJbnRlcm5ldCBQcm90b2NvbCBWNiAqLworI2RlZmluZSBOUF9JUFgJMgkJLyogSVBYIHByb3RvY29sICovCisjZGVmaW5lIE5QX0FUCTMJCS8qIEFwcGxldGFsayBwcm90b2NvbCAqLworI2RlZmluZSBOUF9NUExTX1VDIDQJCS8qIE1QTFMgdW5pY2FzdCAqLworI2RlZmluZSBOUF9NUExTX01DIDUJCS8qIE1QTFMgbXVsdGljYXN0ICovCisjZGVmaW5lIE5VTV9OUAk2CQkvKiBOdW1iZXIgb2YgTlBzLiAqLworCisjZGVmaW5lIE1QSERSTEVOCTYJLyogbXVsdGlsaW5rIHByb3RvY29sIGhlYWRlciBsZW5ndGggKi8KKyNkZWZpbmUgTVBIRFJMRU5fU1NOCTQJLyogZGl0dG8gd2l0aCBzaG9ydCBzZXF1ZW5jZSBudW1iZXJzICovCisjZGVmaW5lIE1JTl9GUkFHX1NJWkUJNjQKKworLyoKKyAqIEFuIGluc3RhbmNlIG9mIC9kZXYvcHBwIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZWl0aGVyIGEgcHBwCisgKiBpbnRlcmZhY2UgdW5pdCBvciBhIHBwcCBjaGFubmVsLiAgSW4gYm90aCBjYXNlcywgZmlsZS0+cHJpdmF0ZV9kYXRhCisgKiBwb2ludHMgdG8gb25lIG9mIHRoZXNlLgorICovCitzdHJ1Y3QgcHBwX2ZpbGUgeworCWVudW0geworCQlJTlRFUkZBQ0U9MSwgQ0hBTk5FTAorCX0JCWtpbmQ7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCB4cTsJCS8qIHBwcGQgdHJhbnNtaXQgcXVldWUgKi8KKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJxOwkJLyogcmVjZWl2ZSBxdWV1ZSBmb3IgcHBwZCAqLworCXdhaXRfcXVldWVfaGVhZF90IHJ3YWl0OwkvKiBmb3IgcG9sbCBvbiByZWFkaW5nIC9kZXYvcHBwICovCisJYXRvbWljX3QJcmVmY250OwkJLyogIyByZWZzIChpbmNsIC9kZXYvcHBwIGF0dGFjaGVkKSAqLworCWludAkJaGRybGVuOwkJLyogc3BhY2UgdG8gbGVhdmUgZm9yIGhlYWRlcnMgKi8KKwlpbnQJCWluZGV4OwkJLyogaW50ZXJmYWNlIHVuaXQgLyBjaGFubmVsIG51bWJlciAqLworCWludAkJZGVhZDsJCS8qIHVuaXQvY2hhbm5lbCBoYXMgYmVlbiBzaHV0IGRvd24gKi8KK307CisKKyNkZWZpbmUgUEZfVE9fWChwZiwgWCkJCSgoWCAqKSgoY2hhciAqKShwZikgLSBvZmZzZXRvZihYLCBmaWxlKSkpCisKKyNkZWZpbmUgUEZfVE9fUFBQKHBmKQkJUEZfVE9fWChwZiwgc3RydWN0IHBwcCkKKyNkZWZpbmUgUEZfVE9fQ0hBTk5FTChwZikJUEZfVE9fWChwZiwgc3RydWN0IGNoYW5uZWwpCisKKyNkZWZpbmUgUk9VTkRVUChuLCB4KQkJKCgobikgKyAoeCkgLSAxKSAvICh4KSkKKworLyoKKyAqIERhdGEgc3RydWN0dXJlIGRlc2NyaWJpbmcgb25lIHBwcCB1bml0LgorICogQSBwcHAgdW5pdCBjb3JyZXNwb25kcyB0byBhIHBwcCBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2UKKyAqIGFuZCByZXByZXNlbnRzIGEgbXVsdGlsaW5rIGJ1bmRsZS4KKyAqIEl0IGNhbiBoYXZlIDAgb3IgbW9yZSBwcHAgY2hhbm5lbHMgY29ubmVjdGVkIHRvIGl0LgorICovCitzdHJ1Y3QgcHBwIHsKKwlzdHJ1Y3QgcHBwX2ZpbGUJZmlsZTsJCS8qIHN0dWZmIGZvciByZWFkL3dyaXRlL3BvbGwgMCAqLworCXN0cnVjdCBmaWxlCSpvd25lcjsJCS8qIGZpbGUgdGhhdCBvd25zIHRoaXMgdW5pdCA0OCAqLworCXN0cnVjdCBsaXN0X2hlYWQgY2hhbm5lbHM7CS8qIGxpc3Qgb2YgYXR0YWNoZWQgY2hhbm5lbHMgNGMgKi8KKwlpbnQJCW5fY2hhbm5lbHM7CS8qIGhvdyBtYW55IGNoYW5uZWxzIGFyZSBhdHRhY2hlZCA1NCAqLworCXNwaW5sb2NrX3QJcmxvY2s7CQkvKiBsb2NrIGZvciByZWNlaXZlIHNpZGUgNTggKi8KKwlzcGlubG9ja190CXdsb2NrOwkJLyogbG9jayBmb3IgdHJhbnNtaXQgc2lkZSA1YyAqLworCWludAkJbXJ1OwkJLyogbWF4IHJlY2VpdmUgdW5pdCA2MCAqLworCXVuc2lnbmVkIGludAlmbGFnczsJCS8qIGNvbnRyb2wgYml0cyA2NCAqLworCXVuc2lnbmVkIGludAl4c3RhdGU7CQkvKiB0cmFuc21pdCBzdGF0ZSBiaXRzIDY4ICovCisJdW5zaWduZWQgaW50CXJzdGF0ZTsJCS8qIHJlY2VpdmUgc3RhdGUgYml0cyA2YyAqLworCWludAkJZGVidWc7CQkvKiBkZWJ1ZyBmbGFncyA3MCAqLworCXN0cnVjdCBzbGNvbXByZXNzICp2ajsJCS8qIHN0YXRlIGZvciBWSiBoZWFkZXIgY29tcHJlc3Npb24gKi8KKwllbnVtIE5QbW9kZQlucG1vZGVbTlVNX05QXTsJLyogd2hhdCB0byBkbyB3aXRoIGVhY2ggbmV0IHByb3RvIDc4ICovCisJc3RydWN0IHNrX2J1ZmYJKnhtaXRfcGVuZGluZzsJLyogYSBwYWNrZXQgcmVhZHkgdG8gZ28gb3V0IDg4ICovCisJc3RydWN0IGNvbXByZXNzb3IgKnhjb21wOwkvKiB0cmFuc21pdCBwYWNrZXQgY29tcHJlc3NvciA4YyAqLworCXZvaWQJCSp4Y19zdGF0ZTsJLyogaXRzIGludGVybmFsIHN0YXRlIDkwICovCisJc3RydWN0IGNvbXByZXNzb3IgKnJjb21wOwkvKiByZWNlaXZlIGRlY29tcHJlc3NvciA5NCAqLworCXZvaWQJCSpyY19zdGF0ZTsJLyogaXRzIGludGVybmFsIHN0YXRlIDk4ICovCisJdW5zaWduZWQgbG9uZwlsYXN0X3htaXQ7CS8qIGppZmZpZXMgd2hlbiBsYXN0IHBrdCBzZW50IDljICovCisJdW5zaWduZWQgbG9uZwlsYXN0X3JlY3Y7CS8qIGppZmZpZXMgd2hlbiBsYXN0IHBrdCByY3ZkIGEwICovCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsJCS8qIG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBhNCAqLworI2lmZGVmIENPTkZJR19QUFBfTVVMVElMSU5LCisJaW50CQlueGNoYW47CQkvKiBuZXh0IGNoYW5uZWwgdG8gc2VuZCBzb21ldGhpbmcgb24gKi8KKwl1MzIJCW54c2VxOwkJLyogbmV4dCBzZXF1ZW5jZSBudW1iZXIgdG8gc2VuZCAqLworCWludAkJbXJydTsJCS8qIE1QOiBtYXggcmVjb25zdC4gcmVjZWl2ZSB1bml0ICovCisJdTMyCQluZXh0c2VxOwkvKiBNUDogc2VxIG5vIG9mIG5leHQgcGFja2V0ICovCisJdTMyCQltaW5zZXE7CQkvKiBNUDogbWluIG9mIG1vc3QgcmVjZW50IHNlcW5vcyAqLworCXN0cnVjdCBza19idWZmX2hlYWQgbXJxOwkvKiBNUDogcmVjZWl2ZSByZWNvbnN0cnVjdGlvbiBxdWV1ZSAqLworI2VuZGlmIC8qIENPTkZJR19QUFBfTVVMVElMSU5LICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CS8qIHN0YXRpc3RpY3MgKi8KKyNpZmRlZiBDT05GSUdfUFBQX0ZJTFRFUgorCXN0cnVjdCBzb2NrX2ZpbHRlciAqcGFzc19maWx0ZXI7CS8qIGZpbHRlciBmb3IgcGFja2V0cyB0byBwYXNzICovCisJc3RydWN0IHNvY2tfZmlsdGVyICphY3RpdmVfZmlsdGVyOy8qIGZpbHRlciBmb3IgcGt0cyB0byByZXNldCBpZGxlICovCisJdW5zaWduZWQgcGFzc19sZW4sIGFjdGl2ZV9sZW47CisjZW5kaWYgLyogQ09ORklHX1BQUF9GSUxURVIgKi8KK307CisKKy8qCisgKiBCaXRzIGluIGZsYWdzOiBTQ19OT19UQ1BfQ0NJRCwgU0NfQ0NQX09QRU4sIFNDX0NDUF9VUCwgU0NfTE9PUF9UUkFGRklDLAorICogU0NfTVVMVElMSU5LLCBTQ19NUF9TSE9SVFNFUSwgU0NfTVBfWFNIT1JUU0VRLCBTQ19DT01QX1RDUCwgU0NfUkVKX0NPTVBfVENQLgorICogQml0cyBpbiByc3RhdGU6IFNDX0RFQ09NUF9SVU4sIFNDX0RDX0VSUk9SLCBTQ19EQ19GRVJST1IuCisgKiBCaXRzIGluIHhzdGF0ZTogU0NfQ09NUF9SVU4KKyAqLworI2RlZmluZSBTQ19GTEFHX0JJVFMJKFNDX05PX1RDUF9DQ0lEfFNDX0NDUF9PUEVOfFNDX0NDUF9VUHxTQ19MT09QX1RSQUZGSUMgXAorCQkJIHxTQ19NVUxUSUxJTkt8U0NfTVBfU0hPUlRTRVF8U0NfTVBfWFNIT1JUU0VRIFwKKwkJCSB8U0NfQ09NUF9UQ1B8U0NfUkVKX0NPTVBfVENQKQorCisvKgorICogUHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSBmb3IgZWFjaCBjaGFubmVsLgorICogVGhpcyBpbmNsdWRlcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgdXNlZCBmb3IgbXVsdGlsaW5rLgorICovCitzdHJ1Y3QgY2hhbm5lbCB7CisJc3RydWN0IHBwcF9maWxlCWZpbGU7CQkvKiBzdHVmZiBmb3IgcmVhZC93cml0ZS9wb2xsICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyogbGluayBpbiBhbGwvbmV3X2NoYW5uZWxzIGxpc3QgKi8KKwlzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW47CS8qIHB1YmxpYyBjaGFubmVsIGRhdGEgc3RydWN0dXJlICovCisJc3RydWN0IHJ3X3NlbWFwaG9yZSBjaGFuX3NlbTsJLyogcHJvdGVjdHMgYGNoYW4nIGR1cmluZyBjaGFuIGlvY3RsICovCisJc3BpbmxvY2tfdAlkb3dubDsJCS8qIHByb3RlY3RzIGBjaGFuJywgZmlsZS54cSBkZXF1ZXVlICovCisJc3RydWN0IHBwcAkqcHBwOwkJLyogcHBwIHVuaXQgd2UncmUgY29ubmVjdGVkIHRvICovCisJc3RydWN0IGxpc3RfaGVhZCBjbGlzdDsJCS8qIGxpbmsgaW4gbGlzdCBvZiBjaGFubmVscyBwZXIgdW5pdCAqLworCXJ3bG9ja190CXVwbDsJCS8qIHByb3RlY3RzIGBwcHAnICovCisjaWZkZWYgQ09ORklHX1BQUF9NVUxUSUxJTksKKwl1OAkJYXZhaWw7CQkvKiBmbGFnIHVzZWQgaW4gbXVsdGlsaW5rIHN0dWZmICovCisJdTgJCWhhZF9mcmFnOwkvKiA+PSAxIGZyYWdtZW50cyBoYXZlIGJlZW4gc2VudCAqLworCXUzMgkJbGFzdHNlcTsJLyogTVA6IGxhc3Qgc2VxdWVuY2UgIyByZWNlaXZlZCAqLworI2VuZGlmIC8qIENPTkZJR19QUFBfTVVMVElMSU5LICovCit9OworCisvKgorICogU01QIGxvY2tpbmcgaXNzdWVzOgorICogQm90aCB0aGUgcHBwLnJsb2NrIGFuZCBwcHAud2xvY2sgbG9ja3MgcHJvdGVjdCB0aGUgcHBwLmNoYW5uZWxzCisgKiBsaXN0IGFuZCB0aGUgcHBwLm5fY2hhbm5lbHMgZmllbGQsIHlvdSBuZWVkIHRvIHRha2UgYm90aCBsb2NrcworICogYmVmb3JlIHlvdSBtb2RpZnkgdGhlbS4KKyAqIFRoZSBsb2NrIG9yZGVyaW5nIGlzOiBjaGFubmVsLnVwbCAtPiBwcHAud2xvY2sgLT4gcHBwLnJsb2NrIC0+CisgKiBjaGFubmVsLmRvd25sLgorICovCisKKy8qCisgKiBBIGNhcmRtYXAgcmVwcmVzZW50cyBhIG1hcHBpbmcgZnJvbSB1bnNpZ25lZCBpbnRlZ2VycyB0byBwb2ludGVycywKKyAqIGFuZCBwcm92aWRlcyBhIGZhc3QgImZpbmQgbG93ZXN0IHVudXNlZCBudW1iZXIiIG9wZXJhdGlvbi4KKyAqIEl0IHVzZXMgYSBicm9hZCAoMzItd2F5KSB0cmVlIHdpdGggYSBiaXRtYXAgYXQgZWFjaCBsZXZlbC4KKyAqIEl0IGlzIGRlc2lnbmVkIHRvIGJlIHNwYWNlLWVmZmljaWVudCBmb3Igc21hbGwgbnVtYmVycyBvZiBlbnRyaWVzCisgKiBhbmQgdGltZS1lZmZpY2llbnQgZm9yIGxhcmdlIG51bWJlcnMgb2YgZW50cmllcy4KKyAqLworI2RlZmluZSBDQVJETUFQX09SREVSCTUKKyNkZWZpbmUgQ0FSRE1BUF9XSURUSAkoMVUgPDwgQ0FSRE1BUF9PUkRFUikKKyNkZWZpbmUgQ0FSRE1BUF9NQVNLCShDQVJETUFQX1dJRFRIIC0gMSkKKworc3RydWN0IGNhcmRtYXAgeworCWludCBzaGlmdDsKKwl1bnNpZ25lZCBsb25nIGludXNlOworCXN0cnVjdCBjYXJkbWFwICpwYXJlbnQ7CisJdm9pZCAqcHRyW0NBUkRNQVBfV0lEVEhdOworfTsKK3N0YXRpYyB2b2lkICpjYXJkbWFwX2dldChzdHJ1Y3QgY2FyZG1hcCAqbWFwLCB1bnNpZ25lZCBpbnQgbnIpOworc3RhdGljIHZvaWQgY2FyZG1hcF9zZXQoc3RydWN0IGNhcmRtYXAgKiptYXAsIHVuc2lnbmVkIGludCBuciwgdm9pZCAqcHRyKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2FyZG1hcF9maW5kX2ZpcnN0X2ZyZWUoc3RydWN0IGNhcmRtYXAgKm1hcCk7CitzdGF0aWMgdm9pZCBjYXJkbWFwX2Rlc3Ryb3koc3RydWN0IGNhcmRtYXAgKiptYXApOworCisvKgorICogYWxsX3BwcF9zZW0gcHJvdGVjdHMgdGhlIGFsbF9wcHBfdW5pdHMgbWFwcGluZy4KKyAqIEl0IGFsc28gZW5zdXJlcyB0aGF0IGZpbmRpbmcgYSBwcHAgdW5pdCBpbiB0aGUgYWxsX3BwcF91bml0cyBtYXAKKyAqIGFuZCB1cGRhdGluZyBpdHMgZmlsZS5yZWZjbnQgZmllbGQgaXMgYXRvbWljLgorICovCitzdGF0aWMgREVDTEFSRV9NVVRFWChhbGxfcHBwX3NlbSk7CitzdGF0aWMgc3RydWN0IGNhcmRtYXAgKmFsbF9wcHBfdW5pdHM7CitzdGF0aWMgYXRvbWljX3QgcHBwX3VuaXRfY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKKworLyoKKyAqIGFsbF9jaGFubmVsc19sb2NrIHByb3RlY3RzIGFsbF9jaGFubmVscyBhbmQgbGFzdF9jaGFubmVsX2luZGV4LAorICogYW5kIHRoZSBhdG9taWNpdHkgb2YgZmluZCBhIGNoYW5uZWwgYW5kIHVwZGF0aW5nIGl0cyBmaWxlLnJlZmNudAorICogZmllbGQuCisgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWxsX2NoYW5uZWxzX2xvY2spOworc3RhdGljIExJU1RfSEVBRChhbGxfY2hhbm5lbHMpOworc3RhdGljIExJU1RfSEVBRChuZXdfY2hhbm5lbHMpOworc3RhdGljIGludCBsYXN0X2NoYW5uZWxfaW5kZXg7CitzdGF0aWMgYXRvbWljX3QgY2hhbm5lbF9jb3VudCA9IEFUT01JQ19JTklUKDApOworCisvKiBHZXQgdGhlIFBQUCBwcm90b2NvbCBudW1iZXIgZnJvbSBhIHNrYiAqLworI2RlZmluZSBQUFBfUFJPVE8oc2tiKQkoKChza2IpLT5kYXRhWzBdIDw8IDgpICsgKHNrYiktPmRhdGFbMV0pCisKKy8qIFdlIGxpbWl0IHRoZSBsZW5ndGggb2YgcHBwLT5maWxlLnJxIHRvIHRoaXMgKGFyYml0cmFyeSkgdmFsdWUgKi8KKyNkZWZpbmUgUFBQX01BWF9SUUxFTgkzMgorCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgbXVsdGlsaW5rIGZyYWdtZW50cyBxdWV1ZWQgdXAuCisgKiBUaGlzIGhhcyB0byBiZSBsYXJnZSBlbm91Z2ggdG8gY29wZSB3aXRoIHRoZSBtYXhpbXVtIGxhdGVuY3kgb2YKKyAqIHRoZSBzbG93ZXN0IGNoYW5uZWwgcmVsYXRpdmUgdG8gdGhlIG90aGVycy4gIFN0cmljdGx5IGl0IHNob3VsZAorICogZGVwZW5kIG9uIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIHRoZWlyIGNoYXJhY3RlcmlzdGljcy4KKyAqLworI2RlZmluZSBQUFBfTVBfTUFYX1FMRU4JMTI4CisKKy8qIE11bHRpbGluayBoZWFkZXIgYml0cy4gKi8KKyNkZWZpbmUgQgkweDgwCQkvKiB0aGlzIGZyYWdtZW50IGJlZ2lucyBhIHBhY2tldCAqLworI2RlZmluZSBFCTB4NDAJCS8qIHRoaXMgZnJhZ21lbnQgZW5kcyBhIHBhY2tldCAqLworCisvKiBDb21wYXJlIG11bHRpbGluayBzZXF1ZW5jZSBudW1iZXJzIChhc3N1bWVkIHRvIGJlIDMyIGJpdHMgd2lkZSkgKi8KKyNkZWZpbmUgc2VxX2JlZm9yZShhLCBiKQkoKHMzMikoKGEpIC0gKGIpKSA8IDApCisjZGVmaW5lIHNlcV9hZnRlcihhLCBiKQkJKChzMzIpKChhKSAtIChiKSkgPiAwKQorCisvKiBQcm90b3R5cGVzLiAqLworc3RhdGljIGludCBwcHBfdW5hdHRhY2hlZF9pb2N0bChzdHJ1Y3QgcHBwX2ZpbGUgKnBmLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgdm9pZCBwcHBfeG1pdF9wcm9jZXNzKHN0cnVjdCBwcHAgKnBwcCk7CitzdGF0aWMgdm9pZCBwcHBfc2VuZF9mcmFtZShzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgcHBwX3B1c2goc3RydWN0IHBwcCAqcHBwKTsKK3N0YXRpYyB2b2lkIHBwcF9jaGFubmVsX3B1c2goc3RydWN0IGNoYW5uZWwgKnBjaCk7CitzdGF0aWMgdm9pZCBwcHBfcmVjZWl2ZV9mcmFtZShzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICBzdHJ1Y3QgY2hhbm5lbCAqcGNoKTsKK3N0YXRpYyB2b2lkIHBwcF9yZWNlaXZlX2Vycm9yKHN0cnVjdCBwcHAgKnBwcCk7CitzdGF0aWMgdm9pZCBwcHBfcmVjZWl2ZV9ub25tcF9mcmFtZShzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHN0cnVjdCBza19idWZmICpwcHBfZGVjb21wcmVzc19mcmFtZShzdHJ1Y3QgcHBwICpwcHAsCisJCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKyNpZmRlZiBDT05GSUdfUFBQX01VTFRJTElOSworc3RhdGljIHZvaWQgcHBwX3JlY2VpdmVfbXBfZnJhbWUoc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCXN0cnVjdCBjaGFubmVsICpwY2gpOworc3RhdGljIHZvaWQgcHBwX21wX2luc2VydChzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHN0cnVjdCBza19idWZmICpwcHBfbXBfcmVjb25zdHJ1Y3Qoc3RydWN0IHBwcCAqcHBwKTsKK3N0YXRpYyBpbnQgcHBwX21wX2V4cGxvZGUoc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKyNlbmRpZiAvKiBDT05GSUdfUFBQX01VTFRJTElOSyAqLworc3RhdGljIGludCBwcHBfc2V0X2NvbXByZXNzKHN0cnVjdCBwcHAgKnBwcCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHZvaWQgcHBwX2NjcF9wZWVrKHN0cnVjdCBwcHAgKnBwcCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGluYm91bmQpOworc3RhdGljIHZvaWQgcHBwX2NjcF9jbG9zZWQoc3RydWN0IHBwcCAqcHBwKTsKK3N0YXRpYyBzdHJ1Y3QgY29tcHJlc3NvciAqZmluZF9jb21wcmVzc29yKGludCB0eXBlKTsKK3N0YXRpYyB2b2lkIHBwcF9nZXRfc3RhdHMoc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3QgcHBwX3N0YXRzICpzdCk7CitzdGF0aWMgc3RydWN0IHBwcCAqcHBwX2NyZWF0ZV9pbnRlcmZhY2UoaW50IHVuaXQsIGludCAqcmV0cCk7CitzdGF0aWMgdm9pZCBpbml0X3BwcF9maWxlKHN0cnVjdCBwcHBfZmlsZSAqcGYsIGludCBraW5kKTsKK3N0YXRpYyB2b2lkIHBwcF9zaHV0ZG93bl9pbnRlcmZhY2Uoc3RydWN0IHBwcCAqcHBwKTsKK3N0YXRpYyB2b2lkIHBwcF9kZXN0cm95X2ludGVyZmFjZShzdHJ1Y3QgcHBwICpwcHApOworc3RhdGljIHN0cnVjdCBwcHAgKnBwcF9maW5kX3VuaXQoaW50IHVuaXQpOworc3RhdGljIHN0cnVjdCBjaGFubmVsICpwcHBfZmluZF9jaGFubmVsKGludCB1bml0KTsKK3N0YXRpYyBpbnQgcHBwX2Nvbm5lY3RfY2hhbm5lbChzdHJ1Y3QgY2hhbm5lbCAqcGNoLCBpbnQgdW5pdCk7CitzdGF0aWMgaW50IHBwcF9kaXNjb25uZWN0X2NoYW5uZWwoc3RydWN0IGNoYW5uZWwgKnBjaCk7CitzdGF0aWMgdm9pZCBwcHBfZGVzdHJveV9jaGFubmVsKHN0cnVjdCBjaGFubmVsICpwY2gpOworCitzdGF0aWMgc3RydWN0IGNsYXNzX3NpbXBsZSAqcHBwX2NsYXNzOworCisvKiBUcmFuc2xhdGVzIGEgUFBQIHByb3RvY29sIG51bWJlciB0byBhIE5QIGluZGV4IChOUCA9PSBuZXR3b3JrIHByb3RvY29sKSAqLworc3RhdGljIGlubGluZSBpbnQgcHJvdG9fdG9fbnBpbmRleChpbnQgcHJvdG8pCit7CisJc3dpdGNoIChwcm90bykgeworCWNhc2UgUFBQX0lQOgorCQlyZXR1cm4gTlBfSVA7CisJY2FzZSBQUFBfSVBWNjoKKwkJcmV0dXJuIE5QX0lQVjY7CisJY2FzZSBQUFBfSVBYOgorCQlyZXR1cm4gTlBfSVBYOworCWNhc2UgUFBQX0FUOgorCQlyZXR1cm4gTlBfQVQ7CisJY2FzZSBQUFBfTVBMU19VQzoKKwkJcmV0dXJuIE5QX01QTFNfVUM7CisJY2FzZSBQUFBfTVBMU19NQzoKKwkJcmV0dXJuIE5QX01QTFNfTUM7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCisvKiBUcmFuc2xhdGVzIGFuIE5QIGluZGV4IGludG8gYSBQUFAgcHJvdG9jb2wgbnVtYmVyICovCitzdGF0aWMgY29uc3QgaW50IG5waW5kZXhfdG9fcHJvdG9bTlVNX05QXSA9IHsKKwlQUFBfSVAsCisJUFBQX0lQVjYsCisJUFBQX0lQWCwKKwlQUFBfQVQsCisJUFBQX01QTFNfVUMsCisJUFBQX01QTFNfTUMsCit9OworCQorLyogVHJhbnNsYXRlcyBhbiBldGhlcnR5cGUgaW50byBhbiBOUCBpbmRleCAqLworc3RhdGljIGlubGluZSBpbnQgZXRoZXJ0eXBlX3RvX25waW5kZXgoaW50IGV0aGVydHlwZSkKK3sKKwlzd2l0Y2ggKGV0aGVydHlwZSkgeworCWNhc2UgRVRIX1BfSVA6CisJCXJldHVybiBOUF9JUDsKKwljYXNlIEVUSF9QX0lQVjY6CisJCXJldHVybiBOUF9JUFY2OworCWNhc2UgRVRIX1BfSVBYOgorCQlyZXR1cm4gTlBfSVBYOworCWNhc2UgRVRIX1BfUFBQVEFMSzoKKwljYXNlIEVUSF9QX0FUQUxLOgorCQlyZXR1cm4gTlBfQVQ7CisJY2FzZSBFVEhfUF9NUExTX1VDOgorCQlyZXR1cm4gTlBfTVBMU19VQzsKKwljYXNlIEVUSF9QX01QTFNfTUM6CisJCXJldHVybiBOUF9NUExTX01DOworCX0KKwlyZXR1cm4gLTE7Cit9CisKKy8qIFRyYW5zbGF0ZXMgYW4gTlAgaW5kZXggaW50byBhbiBldGhlcnR5cGUgKi8KK3N0YXRpYyBjb25zdCBpbnQgbnBpbmRleF90b19ldGhlcnR5cGVbTlVNX05QXSA9IHsKKwlFVEhfUF9JUCwKKwlFVEhfUF9JUFY2LAorCUVUSF9QX0lQWCwKKwlFVEhfUF9QUFBUQUxLLAorCUVUSF9QX01QTFNfVUMsCisJRVRIX1BfTVBMU19NQywKK307CisKKy8qCisgKiBMb2NraW5nIHNob3J0aGFuZC4KKyAqLworI2RlZmluZSBwcHBfeG1pdF9sb2NrKHBwcCkJc3Bpbl9sb2NrX2JoKCYocHBwKS0+d2xvY2spCisjZGVmaW5lIHBwcF94bWl0X3VubG9jayhwcHApCXNwaW5fdW5sb2NrX2JoKCYocHBwKS0+d2xvY2spCisjZGVmaW5lIHBwcF9yZWN2X2xvY2socHBwKQlzcGluX2xvY2tfYmgoJihwcHApLT5ybG9jaykKKyNkZWZpbmUgcHBwX3JlY3ZfdW5sb2NrKHBwcCkJc3Bpbl91bmxvY2tfYmgoJihwcHApLT5ybG9jaykKKyNkZWZpbmUgcHBwX2xvY2socHBwKQkJZG8geyBwcHBfeG1pdF9sb2NrKHBwcCk7IFwKKwkJCQkgICAgIHBwcF9yZWN2X2xvY2socHBwKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgcHBwX3VubG9jayhwcHApCQlkbyB7IHBwcF9yZWN2X3VubG9jayhwcHApOyBcCisJCQkJICAgICBwcHBfeG1pdF91bmxvY2socHBwKTsgfSB3aGlsZSAoMCkKKworLyoKKyAqIC9kZXYvcHBwIGRldmljZSByb3V0aW5lcy4KKyAqIFRoZSAvZGV2L3BwcCBkZXZpY2UgaXMgdXNlZCBieSBwcHBkIHRvIGNvbnRyb2wgdGhlIHBwcCB1bml0LgorICogSXQgc3VwcG9ydHMgdGhlIHJlYWQsIHdyaXRlLCBpb2N0bCBhbmQgcG9sbCBmdW5jdGlvbnMuCisgKiBPcGVuIGluc3RhbmNlcyBvZiAvZGV2L3BwcCBjYW4gYmUgaW4gb25lIG9mIHRocmVlIHN0YXRlczoKKyAqIHVuYXR0YWNoZWQsIGF0dGFjaGVkIHRvIGEgcHBwIHVuaXQsIG9yIGF0dGFjaGVkIHRvIGEgcHBwIGNoYW5uZWwuCisgKi8KK3N0YXRpYyBpbnQgcHBwX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyoKKwkgKiBUaGlzIGNvdWxkIChzaG91bGQ/KSBiZSBlbmZvcmNlZCBieSB0aGUgcGVybWlzc2lvbnMgb24gL2Rldi9wcHAuCisJICovCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBwcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBwcHBfZmlsZSAqcGYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHBwcCAqcHBwOworCisJaWYgKHBmICE9IDApIHsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwkJaWYgKHBmLT5raW5kID09IElOVEVSRkFDRSkgeworCQkJcHBwID0gUEZfVE9fUFBQKHBmKTsKKwkJCWlmIChmaWxlID09IHBwcC0+b3duZXIpCisJCQkJcHBwX3NodXRkb3duX2ludGVyZmFjZShwcHApOworCQl9CisJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZwZi0+cmVmY250KSkgeworCQkJc3dpdGNoIChwZi0+a2luZCkgeworCQkJY2FzZSBJTlRFUkZBQ0U6CisJCQkJcHBwX2Rlc3Ryb3lfaW50ZXJmYWNlKFBGX1RPX1BQUChwZikpOworCQkJCWJyZWFrOworCQkJY2FzZSBDSEFOTkVMOgorCQkJCXBwcF9kZXN0cm95X2NoYW5uZWwoUEZfVE9fQ0hBTk5FTChwZikpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBwcHBfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBwcHBfZmlsZSAqcGYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3NpemVfdCByZXQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisKKwlyZXQgPSBjb3VudDsKKworCWlmIChwZiA9PSAwKQorCQlyZXR1cm4gLUVOWElPOworCWFkZF93YWl0X3F1ZXVlKCZwZi0+cndhaXQsICZ3YWl0KTsKKwlmb3IgKDs7KSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNrYiA9IHNrYl9kZXF1ZXVlKCZwZi0+cnEpOworCQlpZiAoc2tiKQorCQkJYnJlYWs7CisJCXJldCA9IDA7CisJCWlmIChwZi0+ZGVhZCkKKwkJCWJyZWFrOworCQlpZiAocGYtPmtpbmQgPT0gSU5URVJGQUNFKSB7CisJCQkvKgorCQkJICogUmV0dXJuIDAgKEVPRikgb24gYW4gaW50ZXJmYWNlIHRoYXQgaGFzIG5vCisJCQkgKiBjaGFubmVscyBjb25uZWN0ZWQsIHVubGVzcyBpdCBpcyBsb29waW5nCisJCQkgKiBuZXR3b3JrIHRyYWZmaWMgKGRlbWFuZCBtb2RlKS4KKwkJCSAqLworCQkJc3RydWN0IHBwcCAqcHBwID0gUEZfVE9fUFBQKHBmKTsKKwkJCWlmIChwcHAtPm5fY2hhbm5lbHMgPT0gMAorCQkJICAgICYmIChwcHAtPmZsYWdzICYgU0NfTE9PUF9UUkFGRklDKSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisJCXJldCA9IC1FQUdBSU47CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCWJyZWFrOworCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQlzY2hlZHVsZSgpOworCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZwZi0+cndhaXQsICZ3YWl0KTsKKworCWlmIChza2IgPT0gMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSAtRU9WRVJGTE9XOworCWlmIChza2ItPmxlbiA+IGNvdW50KQorCQlnb3RvIG91dGY7CisJcmV0ID0gLUVGQVVMVDsKKwlpZiAoY29weV90b191c2VyKGJ1Ziwgc2tiLT5kYXRhLCBza2ItPmxlbikpCisJCWdvdG8gb3V0ZjsKKwlyZXQgPSBza2ItPmxlbjsKKworIG91dGY6CisJa2ZyZWVfc2tiKHNrYik7Cisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBwcF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgcHBwX2ZpbGUgKnBmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3NpemVfdCByZXQ7CisKKwlpZiAocGYgPT0gMCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlyZXQgPSAtRU5PTUVNOworCXNrYiA9IGFsbG9jX3NrYihjb3VudCArIHBmLT5oZHJsZW4sIEdGUF9LRVJORUwpOworCWlmIChza2IgPT0gMCkKKwkJZ290byBvdXQ7CisJc2tiX3Jlc2VydmUoc2tiLCBwZi0+aGRybGVuKTsKKwlyZXQgPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcihza2JfcHV0KHNrYiwgY291bnQpLCBidWYsIGNvdW50KSkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJZ290byBvdXQ7CisJfQorCisJc2tiX3F1ZXVlX3RhaWwoJnBmLT54cSwgc2tiKTsKKworCXN3aXRjaCAocGYtPmtpbmQpIHsKKwljYXNlIElOVEVSRkFDRToKKwkJcHBwX3htaXRfcHJvY2VzcyhQRl9UT19QUFAocGYpKTsKKwkJYnJlYWs7CisJY2FzZSBDSEFOTkVMOgorCQlwcHBfY2hhbm5lbF9wdXNoKFBGX1RPX0NIQU5ORUwocGYpKTsKKwkJYnJlYWs7CisJfQorCisJcmV0ID0gY291bnQ7CisKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSBmaW5lICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBwcF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBwcHBfZmlsZSAqcGYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IG1hc2s7CisKKwlpZiAocGYgPT0gMCkKKwkJcmV0dXJuIDA7CisJcG9sbF93YWl0KGZpbGUsICZwZi0+cndhaXQsIHdhaXQpOworCW1hc2sgPSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwlpZiAoc2tiX3BlZWsoJnBmLT5ycSkgIT0gMCkKKwkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCWlmIChwZi0+ZGVhZCkKKwkJbWFzayB8PSBQT0xMSFVQOworCWVsc2UgaWYgKHBmLT5raW5kID09IElOVEVSRkFDRSkgeworCQkvKiBzZWUgY29tbWVudCBpbiBwcHBfcmVhZCAqLworCQlzdHJ1Y3QgcHBwICpwcHAgPSBQRl9UT19QUFAocGYpOworCQlpZiAocHBwLT5uX2NoYW5uZWxzID09IDAKKwkJICAgICYmIChwcHAtPmZsYWdzICYgU0NfTE9PUF9UUkFGRklDKSA9PSAwKQorCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KKworCXJldHVybiBtYXNrOworfQorCisjaWZkZWYgQ09ORklHX1BQUF9GSUxURVIKK3N0YXRpYyBpbnQgZ2V0X2ZpbHRlcih2b2lkIF9fdXNlciAqYXJnLCBzdHJ1Y3Qgc29ja19maWx0ZXIgKipwKQoreworCXN0cnVjdCBzb2NrX2Zwcm9nIHVwcm9nOworCXN0cnVjdCBzb2NrX2ZpbHRlciAqY29kZSA9IE5VTEw7CisJaW50IGxlbiwgZXJyOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1cHJvZywgYXJnLCBzaXplb2YodXByb2cpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAodXByb2cubGVuID4gQlBGX01BWElOU05TKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghdXByb2cubGVuKSB7CisJCSpwID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJbGVuID0gdXByb2cubGVuICogc2l6ZW9mKHN0cnVjdCBzb2NrX2ZpbHRlcik7CisJY29kZSA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoY29kZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihjb2RlLCB1cHJvZy5maWx0ZXIsIGxlbikpIHsKKwkJa2ZyZWUoY29kZSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWVyciA9IHNrX2Noa19maWx0ZXIoY29kZSwgdXByb2cubGVuKTsKKwlpZiAoZXJyKSB7CisJCWtmcmVlKGNvZGUpOworCQlyZXR1cm4gZXJyOworCX0KKworCSpwID0gY29kZTsKKwlyZXR1cm4gdXByb2cubGVuOworfQorI2VuZGlmIC8qIENPTkZJR19QUFBfRklMVEVSICovCisKK3N0YXRpYyBpbnQgcHBwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBwcHBfZmlsZSAqcGYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHBwcCAqcHBwOworCWludCBlcnIgPSAtRUZBVUxULCB2YWwsIHZhbDIsIGk7CisJc3RydWN0IHBwcF9pZGxlIGlkbGU7CisJc3RydWN0IG5waW9jdGwgbnBpOworCWludCB1bml0LCBjZmxhZ3M7CisJc3RydWN0IHNsY29tcHJlc3MgKnZqOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCisJaWYgKHBmID09IDApCisJCXJldHVybiBwcHBfdW5hdHRhY2hlZF9pb2N0bChwZiwgZmlsZSwgY21kLCBhcmcpOworCisJaWYgKGNtZCA9PSBQUFBJT0NERVRBQ0gpIHsKKwkJLyoKKwkJICogV2UgaGF2ZSB0byBiZSBjYXJlZnVsIGhlcmUuLi4gaWYgdGhlIGZpbGUgZGVzY3JpcHRvcgorCQkgKiBoYXMgYmVlbiBkdXAnZCwgd2UgY291bGQgaGF2ZSBhbm90aGVyIHByb2Nlc3MgaW4gdGhlCisJCSAqIG1pZGRsZSBvZiBhIHBvbGwgdXNpbmcgdGhlIHNhbWUgZmlsZSAqLCBzbyB3ZSBoYWQKKwkJICogYmV0dGVyIG5vdCBmcmVlIHRoZSBpbnRlcmZhY2UgZGF0YSBzdHJ1Y3R1cmVzIC0KKwkJICogaW5zdGVhZCB3ZSBmYWlsIHRoZSBpb2N0bC4gIEV2ZW4gaW4gdGhpcyBjYXNlLCB3ZQorCQkgKiBzaHV0IGRvd24gdGhlIGludGVyZmFjZSBpZiB3ZSBhcmUgdGhlIG93bmVyIG9mIGl0LgorCQkgKiBBY3R1YWxseSwgd2Ugc2hvdWxkIGdldCByaWQgb2YgUFBQSU9DREVUQUNILCB1c2VybGFuZAorCQkgKiAoaS5lLiBwcHBkKSBjb3VsZCBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdCBieSBjbG9zaW5nCisJCSAqIHRoaXMgZmQgYW5kIHJlb3BlbmluZyAvZGV2L3BwcC4KKwkJICovCisJCWVyciA9IC1FSU5WQUw7CisJCWlmIChwZi0+a2luZCA9PSBJTlRFUkZBQ0UpIHsKKwkJCXBwcCA9IFBGX1RPX1BQUChwZik7CisJCQlpZiAoZmlsZSA9PSBwcHAtPm93bmVyKQorCQkJCXBwcF9zaHV0ZG93bl9pbnRlcmZhY2UocHBwKTsKKwkJfQorCQlpZiAoYXRvbWljX3JlYWQoJmZpbGUtPmZfY291bnQpIDw9IDIpIHsKKwkJCXBwcF9yZWxlYXNlKGlub2RlLCBmaWxlKTsKKwkJCWVyciA9IDA7CisJCX0gZWxzZQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIlBQUElPQ0RFVEFDSCBmaWxlLT5mX2NvdW50PSVkXG4iLAorCQkJICAgICAgIGF0b21pY19yZWFkKCZmaWxlLT5mX2NvdW50KSk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKHBmLT5raW5kID09IENIQU5ORUwpIHsKKwkJc3RydWN0IGNoYW5uZWwgKnBjaCA9IFBGX1RPX0NIQU5ORUwocGYpOworCQlzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW47CisKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBQUFBJT0NDT05ORUNUOgorCQkJaWYgKGdldF91c2VyKHVuaXQsIHApKQorCQkJCWJyZWFrOworCQkJZXJyID0gcHBwX2Nvbm5lY3RfY2hhbm5lbChwY2gsIHVuaXQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQUFBJT0NESVNDT05OOgorCQkJZXJyID0gcHBwX2Rpc2Nvbm5lY3RfY2hhbm5lbChwY2gpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWRvd25fcmVhZCgmcGNoLT5jaGFuX3NlbSk7CisJCQljaGFuID0gcGNoLT5jaGFuOworCQkJZXJyID0gLUVOT1RUWTsKKwkJCWlmIChjaGFuICYmIGNoYW4tPm9wcy0+aW9jdGwpCisJCQkJZXJyID0gY2hhbi0+b3BzLT5pb2N0bChjaGFuLCBjbWQsIGFyZyk7CisJCQl1cF9yZWFkKCZwY2gtPmNoYW5fc2VtKTsKKwkJfQorCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChwZi0+a2luZCAhPSBJTlRFUkZBQ0UpIHsKKwkJLyogY2FuJ3QgaGFwcGVuICovCisJCXByaW50ayhLRVJOX0VSUiAiUFBQOiBub3QgaW50ZXJmYWNlIG9yIGNoYW5uZWw/P1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBwcCA9IFBGX1RPX1BQUChwZik7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFBQUElPQ1NNUlU6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJYnJlYWs7CisJCXBwcC0+bXJ1ID0gdmFsOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DU0ZMQUdTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCWJyZWFrOworCQlwcHBfbG9jayhwcHApOworCQljZmxhZ3MgPSBwcHAtPmZsYWdzICYgfnZhbDsKKwkJcHBwLT5mbGFncyA9IHZhbCAmIFNDX0ZMQUdfQklUUzsKKwkJcHBwX3VubG9jayhwcHApOworCQlpZiAoY2ZsYWdzICYgU0NfQ0NQX09QRU4pCisJCQlwcHBfY2NwX2Nsb3NlZChwcHApOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DR0ZMQUdTOgorCQl2YWwgPSBwcHAtPmZsYWdzIHwgcHBwLT54c3RhdGUgfCBwcHAtPnJzdGF0ZTsKKwkJaWYgKHB1dF91c2VyKHZhbCwgcCkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ1NDT01QUkVTUzoKKwkJZXJyID0gcHBwX3NldF9jb21wcmVzcyhwcHAsIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NHVU5JVDoKKwkJaWYgKHB1dF91c2VyKHBwcC0+ZmlsZS5pbmRleCwgcCkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ1NERUJVRzoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlicmVhazsKKwkJcHBwLT5kZWJ1ZyA9IHZhbDsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ0dERUJVRzoKKwkJaWYgKHB1dF91c2VyKHBwcC0+ZGVidWcsIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NHSURMRToKKwkJaWRsZS54bWl0X2lkbGUgPSAoamlmZmllcyAtIHBwcC0+bGFzdF94bWl0KSAvIEhaOworCQlpZGxlLnJlY3ZfaWRsZSA9IChqaWZmaWVzIC0gcHBwLT5sYXN0X3JlY3YpIC8gSFo7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmlkbGUsIHNpemVvZihpZGxlKSkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ1NNQVhDSUQ6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJYnJlYWs7CisJCXZhbDIgPSAxNTsKKwkJaWYgKCh2YWwgPj4gMTYpICE9IDApIHsKKwkJCXZhbDIgPSB2YWwgPj4gMTY7CisJCQl2YWwgJj0gMHhmZmZmOworCQl9CisJCXZqID0gc2xoY19pbml0KHZhbDIrMSwgdmFsKzEpOworCQlpZiAodmogPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJQUFA6IG5vIG1lbW9yeSAoVkogY29tcHJlc3NvcilcbiIpOworCQkJZXJyID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisJCXBwcF9sb2NrKHBwcCk7CisJCWlmIChwcHAtPnZqICE9IDApCisJCQlzbGhjX2ZyZWUocHBwLT52aik7CisJCXBwcC0+dmogPSB2ajsKKwkJcHBwX3VubG9jayhwcHApOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DR05QTU9ERToKKwljYXNlIFBQUElPQ1NOUE1PREU6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbnBpLCBhcmdwLCBzaXplb2YobnBpKSkpCisJCQlicmVhazsKKwkJZXJyID0gcHJvdG9fdG9fbnBpbmRleChucGkucHJvdG9jb2wpOworCQlpZiAoZXJyIDwgMCkKKwkJCWJyZWFrOworCQlpID0gZXJyOworCQlpZiAoY21kID09IFBQUElPQ0dOUE1PREUpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlucGkubW9kZSA9IHBwcC0+bnBtb2RlW2ldOworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmbnBpLCBzaXplb2YobnBpKSkpCisJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlwcHAtPm5wbW9kZVtpXSA9IG5waS5tb2RlOworCQkJLyogd2UgbWF5IGJlIGFibGUgdG8gdHJhbnNtaXQgbW9yZSBwYWNrZXRzIG5vdyAoPz8pICovCisJCQluZXRpZl93YWtlX3F1ZXVlKHBwcC0+ZGV2KTsKKwkJfQorCQllcnIgPSAwOworCQlicmVhazsKKworI2lmZGVmIENPTkZJR19QUFBfRklMVEVSCisJY2FzZSBQUFBJT0NTUEFTUzoKKwl7CisJCXN0cnVjdCBzb2NrX2ZpbHRlciAqY29kZTsKKwkJZXJyID0gZ2V0X2ZpbHRlcihhcmdwLCAmY29kZSk7CisJCWlmIChlcnIgPj0gMCkgeworCQkJcHBwX2xvY2socHBwKTsKKwkJCWtmcmVlKHBwcC0+cGFzc19maWx0ZXIpOworCQkJcHBwLT5wYXNzX2ZpbHRlciA9IGNvZGU7CisJCQlwcHAtPnBhc3NfbGVuID0gZXJyOworCQkJcHBwX3VubG9jayhwcHApOworCQkJZXJyID0gMDsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBQUFBJT0NTQUNUSVZFOgorCXsKKwkJc3RydWN0IHNvY2tfZmlsdGVyICpjb2RlOworCQllcnIgPSBnZXRfZmlsdGVyKGFyZ3AsICZjb2RlKTsKKwkJaWYgKGVyciA+PSAwKSB7CisJCQlwcHBfbG9jayhwcHApOworCQkJa2ZyZWUocHBwLT5hY3RpdmVfZmlsdGVyKTsKKwkJCXBwcC0+YWN0aXZlX2ZpbHRlciA9IGNvZGU7CisJCQlwcHAtPmFjdGl2ZV9sZW4gPSBlcnI7CisJCQlwcHBfdW5sb2NrKHBwcCk7CisJCQllcnIgPSAwOworCQl9CisJCWJyZWFrOworCX0KKyNlbmRpZiAvKiBDT05GSUdfUFBQX0ZJTFRFUiAqLworCisjaWZkZWYgQ09ORklHX1BQUF9NVUxUSUxJTksKKwljYXNlIFBQUElPQ1NNUlJVOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCWJyZWFrOworCQlwcHBfcmVjdl9sb2NrKHBwcCk7CisJCXBwcC0+bXJydSA9IHZhbDsKKwkJcHBwX3JlY3ZfdW5sb2NrKHBwcCk7CisJCWVyciA9IDA7CisJCWJyZWFrOworI2VuZGlmIC8qIENPTkZJR19QUFBfTVVMVElMSU5LICovCisKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PVFRZOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcHBwX3VuYXR0YWNoZWRfaW9jdGwoc3RydWN0IHBwcF9maWxlICpwZiwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHVuaXQsIGVyciA9IC1FRkFVTFQ7CisJc3RydWN0IHBwcCAqcHBwOworCXN0cnVjdCBjaGFubmVsICpjaGFuOworCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBQUFBJT0NORVdVTklUOgorCQkvKiBDcmVhdGUgYSBuZXcgcHBwIHVuaXQgKi8KKwkJaWYgKGdldF91c2VyKHVuaXQsIHApKQorCQkJYnJlYWs7CisJCXBwcCA9IHBwcF9jcmVhdGVfaW50ZXJmYWNlKHVuaXQsICZlcnIpOworCQlpZiAocHBwID09IDApCisJCQlicmVhazsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gJnBwcC0+ZmlsZTsKKwkJcHBwLT5vd25lciA9IGZpbGU7CisJCWVyciA9IC1FRkFVTFQ7CisJCWlmIChwdXRfdXNlcihwcHAtPmZpbGUuaW5kZXgsIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NBVFRBQ0g6CisJCS8qIEF0dGFjaCB0byBhbiBleGlzdGluZyBwcHAgdW5pdCAqLworCQlpZiAoZ2V0X3VzZXIodW5pdCwgcCkpCisJCQlicmVhazsKKwkJZG93bigmYWxsX3BwcF9zZW0pOworCQllcnIgPSAtRU5YSU87CisJCXBwcCA9IHBwcF9maW5kX3VuaXQodW5pdCk7CisJCWlmIChwcHAgIT0gMCkgeworCQkJYXRvbWljX2luYygmcHBwLT5maWxlLnJlZmNudCk7CisJCQlmaWxlLT5wcml2YXRlX2RhdGEgPSAmcHBwLT5maWxlOworCQkJZXJyID0gMDsKKwkJfQorCQl1cCgmYWxsX3BwcF9zZW0pOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DQVRUQ0hBTjoKKwkJaWYgKGdldF91c2VyKHVuaXQsIHApKQorCQkJYnJlYWs7CisJCXNwaW5fbG9ja19iaCgmYWxsX2NoYW5uZWxzX2xvY2spOworCQllcnIgPSAtRU5YSU87CisJCWNoYW4gPSBwcHBfZmluZF9jaGFubmVsKHVuaXQpOworCQlpZiAoY2hhbiAhPSAwKSB7CisJCQlhdG9taWNfaW5jKCZjaGFuLT5maWxlLnJlZmNudCk7CisJCQlmaWxlLT5wcml2YXRlX2RhdGEgPSAmY2hhbi0+ZmlsZTsKKwkJCWVyciA9IDA7CisJCX0KKwkJc3Bpbl91bmxvY2tfYmgoJmFsbF9jaGFubmVsc19sb2NrKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PVFRZOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcHBfZGV2aWNlX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWFkCQk9IHBwcF9yZWFkLAorCS53cml0ZQkJPSBwcHBfd3JpdGUsCisJLnBvbGwJCT0gcHBwX3BvbGwsCisJLmlvY3RsCQk9IHBwcF9pb2N0bCwKKwkub3BlbgkJPSBwcHBfb3BlbiwKKwkucmVsZWFzZQk9IHBwcF9yZWxlYXNlCit9OworCisjZGVmaW5lIFBQUF9NQUpPUgkxMDgKKworLyogQ2FsbGVkIGF0IGJvb3QgdGltZSBpZiBwcHAgaXMgY29tcGlsZWQgaW50byB0aGUga2VybmVsLAorICAgb3IgYXQgbW9kdWxlIGxvYWQgdGltZSAoZnJvbSBpbml0X21vZHVsZSkgaWYgY29tcGlsZWQgYXMgYSBtb2R1bGUuICovCitzdGF0aWMgaW50IF9faW5pdCBwcHBfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlwcmludGsoS0VSTl9JTkZPICJQUFAgZ2VuZXJpYyBkcml2ZXIgdmVyc2lvbiAiIFBQUF9WRVJTSU9OICJcbiIpOworCWVyciA9IHJlZ2lzdGVyX2NocmRldihQUFBfTUFKT1IsICJwcHAiLCAmcHBwX2RldmljZV9mb3BzKTsKKwlpZiAoIWVycikgeworCQlwcHBfY2xhc3MgPSBjbGFzc19zaW1wbGVfY3JlYXRlKFRISVNfTU9EVUxFLCAicHBwIik7CisJCWlmIChJU19FUlIocHBwX2NsYXNzKSkgeworCQkJZXJyID0gUFRSX0VSUihwcHBfY2xhc3MpOworCQkJZ290byBvdXRfY2hyZGV2OworCQl9CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfYWRkKHBwcF9jbGFzcywgTUtERVYoUFBQX01BSk9SLCAwKSwgTlVMTCwgInBwcCIpOworCQllcnIgPSBkZXZmc19ta19jZGV2KE1LREVWKFBQUF9NQUpPUiwgMCksCisJCQkJU19JRkNIUnxTX0lSVVNSfFNfSVdVU1IsICJwcHAiKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2NsYXNzOworCX0KKworb3V0OgorCWlmIChlcnIpCisJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIHJlZ2lzdGVyIFBQUCBkZXZpY2UgKCVkKVxuIiwgZXJyKTsKKwlyZXR1cm4gZXJyOworCitvdXRfY2xhc3M6CisJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoUFBQX01BSk9SLDApKTsKKwljbGFzc19zaW1wbGVfZGVzdHJveShwcHBfY2xhc3MpOworb3V0X2NocmRldjoKKwl1bnJlZ2lzdGVyX2NocmRldihQUFBfTUFKT1IsICJwcHAiKTsKKwlnb3RvIG91dDsKK30KKworLyoKKyAqIE5ldHdvcmsgaW50ZXJmYWNlIHVuaXQgcm91dGluZXMuCisgKi8KK3N0YXRpYyBpbnQKK3BwcF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBwcCAqcHBwID0gKHN0cnVjdCBwcHAgKikgZGV2LT5wcml2OworCWludCBucGksIHByb3RvOworCXVuc2lnbmVkIGNoYXIgKnBwOworCisJbnBpID0gZXRoZXJ0eXBlX3RvX25waW5kZXgobnRvaHMoc2tiLT5wcm90b2NvbCkpOworCWlmIChucGkgPCAwKQorCQlnb3RvIG91dGY7CisKKwkvKiBEcm9wLCBhY2NlcHQgb3IgcmVqZWN0IHRoZSBwYWNrZXQgKi8KKwlzd2l0Y2ggKHBwcC0+bnBtb2RlW25waV0pIHsKKwljYXNlIE5QTU9ERV9QQVNTOgorCQlicmVhazsKKwljYXNlIE5QTU9ERV9RVUVVRToKKwkJLyogaXQgd291bGQgYmUgbmljZSB0byBoYXZlIGEgd2F5IHRvIHRlbGwgdGhlIG5ldHdvcmsKKwkJICAgc3lzdGVtIHRvIHF1ZXVlIHRoaXMgb25lIHVwIGZvciBsYXRlci4gKi8KKwkJZ290byBvdXRmOworCWNhc2UgTlBNT0RFX0RST1A6CisJY2FzZSBOUE1PREVfRVJST1I6CisJCWdvdG8gb3V0ZjsKKwl9CisKKwkvKiBQdXQgdGhlIDItYnl0ZSBQUFAgcHJvdG9jb2wgbnVtYmVyIG9uIHRoZSBmcm9udCwKKwkgICBtYWtpbmcgc3VyZSB0aGVyZSBpcyByb29tIGZvciB0aGUgYWRkcmVzcyBhbmQgY29udHJvbCBmaWVsZHMuICovCisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgUFBQX0hEUkxFTikgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqbnM7CisKKwkJbnMgPSBhbGxvY19za2Ioc2tiLT5sZW4gKyBkZXYtPmhhcmRfaGVhZGVyX2xlbiwgR0ZQX0FUT01JQyk7CisJCWlmIChucyA9PSAwKQorCQkJZ290byBvdXRmOworCQlza2JfcmVzZXJ2ZShucywgZGV2LT5oYXJkX2hlYWRlcl9sZW4pOworCQlza2JfY29weV9iaXRzKHNrYiwgMCwgc2tiX3B1dChucywgc2tiLT5sZW4pLCBza2ItPmxlbik7CisJCWtmcmVlX3NrYihza2IpOworCQlza2IgPSBuczsKKwl9CisJcHAgPSBza2JfcHVzaChza2IsIDIpOworCXByb3RvID0gbnBpbmRleF90b19wcm90b1tucGldOworCXBwWzBdID0gcHJvdG8gPj4gODsKKwlwcFsxXSA9IHByb3RvOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXNrYl9xdWV1ZV90YWlsKCZwcHAtPmZpbGUueHEsIHNrYik7CisJcHBwX3htaXRfcHJvY2VzcyhwcHApOworCXJldHVybiAwOworCisgb3V0ZjoKKwlrZnJlZV9za2Ioc2tiKTsKKwkrK3BwcC0+c3RhdHMudHhfZHJvcHBlZDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKK3BwcF9uZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHBwICpwcHAgPSAoc3RydWN0IHBwcCAqKSBkZXYtPnByaXY7CisKKwlyZXR1cm4gJnBwcC0+c3RhdHM7Cit9CisKK3N0YXRpYyBpbnQKK3BwcF9uZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IHBwcCAqcHBwID0gZGV2LT5wcml2OworCWludCBlcnIgPSAtRUZBVUxUOworCXZvaWQgX191c2VyICphZGRyID0gKHZvaWQgX191c2VyICopIGlmci0+aWZyX2lmcnUuaWZydV9kYXRhOworCXN0cnVjdCBwcHBfc3RhdHMgc3RhdHM7CisJc3RydWN0IHBwcF9jb21wX3N0YXRzIGNzdGF0czsKKwljaGFyICp2ZXJzOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHUFBQU1RBVFM6CisJCXBwcF9nZXRfc3RhdHMocHBwLCAmc3RhdHMpOworCQlpZiAoY29weV90b191c2VyKGFkZHIsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHUFBQQ1NUQVRTOgorCQltZW1zZXQoJmNzdGF0cywgMCwgc2l6ZW9mKGNzdGF0cykpOworCQlpZiAocHBwLT54Y19zdGF0ZSAhPSAwKQorCQkJcHBwLT54Y29tcC0+Y29tcF9zdGF0KHBwcC0+eGNfc3RhdGUsICZjc3RhdHMuYyk7CisJCWlmIChwcHAtPnJjX3N0YXRlICE9IDApCisJCQlwcHAtPnJjb21wLT5kZWNvbXBfc3RhdChwcHAtPnJjX3N0YXRlLCAmY3N0YXRzLmQpOworCQlpZiAoY29weV90b191c2VyKGFkZHIsICZjc3RhdHMsIHNpemVvZihjc3RhdHMpKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dQUFBWRVI6CisJCXZlcnMgPSBQUFBfVkVSU0lPTjsKKwkJaWYgKGNvcHlfdG9fdXNlcihhZGRyLCB2ZXJzLCBzdHJsZW4odmVycykgKyAxKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgcHBwX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBQUFBfSERSTEVOOworCWRldi0+bXR1ID0gUFBQX01UVTsKKwlkZXYtPmFkZHJfbGVuID0gMDsKKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IDM7CisJZGV2LT50eXBlID0gQVJQSFJEX1BQUDsKKwlkZXYtPmZsYWdzID0gSUZGX1BPSU5UT1BPSU5UIHwgSUZGX05PQVJQIHwgSUZGX01VTFRJQ0FTVDsKK30KKworLyoKKyAqIFRyYW5zbWl0LXNpZGUgcm91dGluZXMuCisgKi8KKworLyoKKyAqIENhbGxlZCB0byBkbyBhbnkgd29yayBxdWV1ZWQgdXAgb24gdGhlIHRyYW5zbWl0IHNpZGUKKyAqIHRoYXQgY2FuIG5vdyBiZSBkb25lLgorICovCitzdGF0aWMgdm9pZAorcHBwX3htaXRfcHJvY2VzcyhzdHJ1Y3QgcHBwICpwcHApCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXBwcF94bWl0X2xvY2socHBwKTsKKwlpZiAocHBwLT5kZXYgIT0gMCkgeworCQlwcHBfcHVzaChwcHApOworCQl3aGlsZSAocHBwLT54bWl0X3BlbmRpbmcgPT0gMAorCQkgICAgICAgJiYgKHNrYiA9IHNrYl9kZXF1ZXVlKCZwcHAtPmZpbGUueHEpKSAhPSAwKQorCQkJcHBwX3NlbmRfZnJhbWUocHBwLCBza2IpOworCQkvKiBJZiB0aGVyZSdzIG5vIHdvcmsgbGVmdCB0byBkbywgdGVsbCB0aGUgY29yZSBuZXQKKwkJICAgY29kZSB0aGF0IHdlIGNhbiBhY2NlcHQgc29tZSBtb3JlLiAqLworCQlpZiAocHBwLT54bWl0X3BlbmRpbmcgPT0gMCAmJiBza2JfcGVlaygmcHBwLT5maWxlLnhxKSA9PSAwKQorCQkJbmV0aWZfd2FrZV9xdWV1ZShwcHAtPmRldik7CisJfQorCXBwcF94bWl0X3VubG9jayhwcHApOworfQorCisvKgorICogQ29tcHJlc3MgYW5kIHNlbmQgYSBmcmFtZS4KKyAqIFRoZSBjYWxsZXIgc2hvdWxkIGhhdmUgbG9ja2VkIHRoZSB4bWl0IHBhdGgsCisgKiBhbmQgeG1pdF9wZW5kaW5nIHNob3VsZCBiZSAwLgorICovCitzdGF0aWMgdm9pZAorcHBwX3NlbmRfZnJhbWUoc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBwcm90byA9IFBQUF9QUk9UTyhza2IpOworCXN0cnVjdCBza19idWZmICpuZXdfc2tiOworCWludCBsZW47CisJdW5zaWduZWQgY2hhciAqY3A7CisKKwlpZiAocHJvdG8gPCAweDgwMDApIHsKKyNpZmRlZiBDT05GSUdfUFBQX0ZJTFRFUgorCQkvKiBjaGVjayBpZiB3ZSBzaG91bGQgcGFzcyB0aGlzIHBhY2tldCAqLworCQkvKiB0aGUgZmlsdGVyIGluc3RydWN0aW9ucyBhcmUgY29uc3RydWN0ZWQgYXNzdW1pbmcKKwkJICAgYSBmb3VyLWJ5dGUgUFBQIGhlYWRlciBvbiBlYWNoIHBhY2tldCAqLworCQkqc2tiX3B1c2goc2tiLCAyKSA9IDE7CisJCWlmIChwcHAtPnBhc3NfZmlsdGVyCisJCSAgICAmJiBza19ydW5fZmlsdGVyKHNrYiwgcHBwLT5wYXNzX2ZpbHRlciwKKwkJCQkgICAgIHBwcC0+cGFzc19sZW4pID09IDApIHsKKwkJCWlmIChwcHAtPmRlYnVnICYgMSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiUFBQOiBvdXRib3VuZCBmcmFtZSBub3QgcGFzc2VkXG4iKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJcmV0dXJuOworCQl9CisJCS8qIGlmIHRoaXMgcGFja2V0IHBhc3NlcyB0aGUgYWN0aXZlIGZpbHRlciwgcmVjb3JkIHRoZSB0aW1lICovCisJCWlmICghKHBwcC0+YWN0aXZlX2ZpbHRlcgorCQkgICAgICAmJiBza19ydW5fZmlsdGVyKHNrYiwgcHBwLT5hY3RpdmVfZmlsdGVyLAorCQkJCSAgICAgICBwcHAtPmFjdGl2ZV9sZW4pID09IDApKQorCQkJcHBwLT5sYXN0X3htaXQgPSBqaWZmaWVzOworCQlza2JfcHVsbChza2IsIDIpOworI2Vsc2UKKwkJLyogZm9yIGRhdGEgcGFja2V0cywgcmVjb3JkIHRoZSB0aW1lICovCisJCXBwcC0+bGFzdF94bWl0ID0gamlmZmllczsKKyNlbmRpZiAvKiBDT05GSUdfUFBQX0ZJTFRFUiAqLworCX0KKworCSsrcHBwLT5zdGF0cy50eF9wYWNrZXRzOworCXBwcC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW4gLSAyOworCisJc3dpdGNoIChwcm90bykgeworCWNhc2UgUFBQX0lQOgorCQlpZiAocHBwLT52aiA9PSAwIHx8IChwcHAtPmZsYWdzICYgU0NfQ09NUF9UQ1ApID09IDApCisJCQlicmVhazsKKwkJLyogdHJ5IHRvIGRvIFZKIFRDUCBoZWFkZXIgY29tcHJlc3Npb24gKi8KKwkJbmV3X3NrYiA9IGFsbG9jX3NrYihza2ItPmxlbiArIHBwcC0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4gLSAyLAorCQkJCSAgICBHRlBfQVRPTUlDKTsKKwkJaWYgKG5ld19za2IgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJQUFA6IG5vIG1lbW9yeSAoVkogY29tcCBwa3QpXG4iKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCBwcHAtPmRldi0+aGFyZF9oZWFkZXJfbGVuIC0gMik7CisJCWNwID0gc2tiLT5kYXRhICsgMjsKKwkJbGVuID0gc2xoY19jb21wcmVzcyhwcHAtPnZqLCBjcCwgc2tiLT5sZW4gLSAyLAorCQkJCSAgICBuZXdfc2tiLT5kYXRhICsgMiwgJmNwLAorCQkJCSAgICAhKHBwcC0+ZmxhZ3MgJiBTQ19OT19UQ1BfQ0NJRCkpOworCQlpZiAoY3AgPT0gc2tiLT5kYXRhICsgMikgeworCQkJLyogZGlkbid0IGNvbXByZXNzICovCisJCQlrZnJlZV9za2IobmV3X3NrYik7CisJCX0gZWxzZSB7CisJCQlpZiAoY3BbMF0gJiBTTF9UWVBFX0NPTVBSRVNTRURfVENQKSB7CisJCQkJcHJvdG8gPSBQUFBfVkpDX0NPTVA7CisJCQkJY3BbMF0gJj0gflNMX1RZUEVfQ09NUFJFU1NFRF9UQ1A7CisJCQl9IGVsc2UgeworCQkJCXByb3RvID0gUFBQX1ZKQ19VTkNPTVA7CisJCQkJY3BbMF0gPSBza2ItPmRhdGFbMl07CisJCQl9CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXNrYiA9IG5ld19za2I7CisJCQljcCA9IHNrYl9wdXQoc2tiLCBsZW4gKyAyKTsKKwkJCWNwWzBdID0gMDsKKwkJCWNwWzFdID0gcHJvdG87CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFBQUF9DQ1A6CisJCS8qIHBlZWsgYXQgb3V0Ym91bmQgQ0NQIGZyYW1lcyAqLworCQlwcHBfY2NwX3BlZWsocHBwLCBza2IsIDApOworCQlicmVhazsKKwl9CisKKwkvKiB0cnkgdG8gZG8gcGFja2V0IGNvbXByZXNzaW9uICovCisJaWYgKChwcHAtPnhzdGF0ZSAmIFNDX0NPTVBfUlVOKSAmJiBwcHAtPnhjX3N0YXRlICE9IDAKKwkgICAgJiYgcHJvdG8gIT0gUFBQX0xDUCAmJiBwcm90byAhPSBQUFBfQ0NQKSB7CisJCW5ld19za2IgPSBhbGxvY19za2IocHBwLT5kZXYtPm10dSArIHBwcC0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4sCisJCQkJICAgIEdGUF9BVE9NSUMpOworCQlpZiAobmV3X3NrYiA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlBQUDogbm8gbWVtb3J5IChjb21wIHBrdClcbiIpOworCQkJZ290byBkcm9wOworCQl9CisJCWlmIChwcHAtPmRldi0+aGFyZF9oZWFkZXJfbGVuID4gUFBQX0hEUkxFTikKKwkJCXNrYl9yZXNlcnZlKG5ld19za2IsCisJCQkJICAgIHBwcC0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4gLSBQUFBfSERSTEVOKTsKKworCQkvKiBjb21wcmVzc29yIHN0aWxsIGV4cGVjdHMgQS9DIGJ5dGVzIGluIGhkciAqLworCQlsZW4gPSBwcHAtPnhjb21wLT5jb21wcmVzcyhwcHAtPnhjX3N0YXRlLCBza2ItPmRhdGEgLSAyLAorCQkJCQkgICBuZXdfc2tiLT5kYXRhLCBza2ItPmxlbiArIDIsCisJCQkJCSAgIHBwcC0+ZGV2LT5tdHUgKyBQUFBfSERSTEVOKTsKKwkJaWYgKGxlbiA+IDAgJiYgKHBwcC0+ZmxhZ3MgJiBTQ19DQ1BfVVApKSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXNrYiA9IG5ld19za2I7CisJCQlza2JfcHV0KHNrYiwgbGVuKTsKKwkJCXNrYl9wdWxsKHNrYiwgMik7CS8qIHB1bGwgb2ZmIEEvQyBieXRlcyAqLworCQl9IGVsc2UgeworCQkJLyogZGlkbid0IGNvbXByZXNzLCBvciBDQ1Agbm90IHVwIHlldCAqLworCQkJa2ZyZWVfc2tiKG5ld19za2IpOworCQl9CisJfQorCisJLyoKKwkgKiBJZiB3ZSBhcmUgd2FpdGluZyBmb3IgdHJhZmZpYyAoZGVtYW5kIGRpYWxsaW5nKSwKKwkgKiBxdWV1ZSBpdCB1cCBmb3IgcHBwZCB0byByZWNlaXZlLgorCSAqLworCWlmIChwcHAtPmZsYWdzICYgU0NfTE9PUF9UUkFGRklDKSB7CisJCWlmIChwcHAtPmZpbGUucnEucWxlbiA+IFBQUF9NQVhfUlFMRU4pCisJCQlnb3RvIGRyb3A7CisJCXNrYl9xdWV1ZV90YWlsKCZwcHAtPmZpbGUucnEsIHNrYik7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHBwLT5maWxlLnJ3YWl0KTsKKwkJcmV0dXJuOworCX0KKworCXBwcC0+eG1pdF9wZW5kaW5nID0gc2tiOworCXBwcF9wdXNoKHBwcCk7CisJcmV0dXJuOworCisgZHJvcDoKKwlrZnJlZV9za2Ioc2tiKTsKKwkrK3BwcC0+c3RhdHMudHhfZXJyb3JzOworfQorCisvKgorICogVHJ5IHRvIHNlbmQgdGhlIGZyYW1lIGluIHhtaXRfcGVuZGluZy4KKyAqIFRoZSBjYWxsZXIgc2hvdWxkIGhhdmUgdGhlIHhtaXQgcGF0aCBsb2NrZWQuCisgKi8KK3N0YXRpYyB2b2lkCitwcHBfcHVzaChzdHJ1Y3QgcHBwICpwcHApCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgY2hhbm5lbCAqcGNoOworCXN0cnVjdCBza19idWZmICpza2IgPSBwcHAtPnhtaXRfcGVuZGluZzsKKworCWlmIChza2IgPT0gMCkKKwkJcmV0dXJuOworCisJbGlzdCA9ICZwcHAtPmNoYW5uZWxzOworCWlmIChsaXN0X2VtcHR5KGxpc3QpKSB7CisJCS8qIG5vd2hlcmUgdG8gc2VuZCB0aGUgcGFja2V0LCBqdXN0IGRyb3AgaXQgKi8KKwkJcHBwLT54bWl0X3BlbmRpbmcgPSBOVUxMOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgocHBwLT5mbGFncyAmIFNDX01VTFRJTElOSykgPT0gMCkgeworCQkvKiBub3QgZG9pbmcgbXVsdGlsaW5rOiBzZW5kIGl0IGRvd24gdGhlIGZpcnN0IGNoYW5uZWwgKi8KKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJCXBjaCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGNoYW5uZWwsIGNsaXN0KTsKKworCQlzcGluX2xvY2tfYmgoJnBjaC0+ZG93bmwpOworCQlpZiAocGNoLT5jaGFuKSB7CisJCQlpZiAocGNoLT5jaGFuLT5vcHMtPnN0YXJ0X3htaXQocGNoLT5jaGFuLCBza2IpKQorCQkJCXBwcC0+eG1pdF9wZW5kaW5nID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCS8qIGNoYW5uZWwgZ290IHVucmVnaXN0ZXJlZCAqLworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlwcHAtPnhtaXRfcGVuZGluZyA9IE5VTEw7CisJCX0KKwkJc3Bpbl91bmxvY2tfYmgoJnBjaC0+ZG93bmwpOworCQlyZXR1cm47CisJfQorCisjaWZkZWYgQ09ORklHX1BQUF9NVUxUSUxJTksKKwkvKiBNdWx0aWxpbms6IGZyYWdtZW50IHRoZSBwYWNrZXQgb3ZlciBhcyBtYW55IGxpbmtzCisJICAgYXMgY2FuIHRha2UgdGhlIHBhY2tldCBhdCB0aGUgbW9tZW50LiAqLworCWlmICghcHBwX21wX2V4cGxvZGUocHBwLCBza2IpKQorCQlyZXR1cm47CisjZW5kaWYgLyogQ09ORklHX1BQUF9NVUxUSUxJTksgKi8KKworCXBwcC0+eG1pdF9wZW5kaW5nID0gTlVMTDsKKwlrZnJlZV9za2Ioc2tiKTsKK30KKworI2lmZGVmIENPTkZJR19QUFBfTVVMVElMSU5LCisvKgorICogRGl2aWRlIGEgcGFja2V0IHRvIGJlIHRyYW5zbWl0dGVkIGludG8gZnJhZ21lbnRzIGFuZAorICogc2VuZCB0aGVtIG91dCB0aGUgaW5kaXZpZHVhbCBsaW5rcy4KKyAqLworc3RhdGljIGludCBwcHBfbXBfZXhwbG9kZShzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IG5jaCwgbGVuLCBmcmFnc2l6ZTsKKwlpbnQgaSwgYml0cywgaGRybGVuLCBtdHU7CisJaW50IGZsZW4sIGZuYjsKKwl1bnNpZ25lZCBjaGFyICpwLCAqcTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBjaGFubmVsICpwY2g7CisJc3RydWN0IHNrX2J1ZmYgKmZyYWc7CisJc3RydWN0IHBwcF9jaGFubmVsICpjaGFuOworCisJbmNoID0gMDsKKwloZHJsZW4gPSAocHBwLT5mbGFncyAmIFNDX01QX1hTSE9SVFNFUSk/IE1QSERSTEVOX1NTTjogTVBIRFJMRU47CisJbGlzdCA9ICZwcHAtPmNoYW5uZWxzOworCXdoaWxlICgobGlzdCA9IGxpc3QtPm5leHQpICE9ICZwcHAtPmNoYW5uZWxzKSB7CisJCXBjaCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGNoYW5uZWwsIGNsaXN0KTsKKwkJbmNoICs9IHBjaC0+YXZhaWwgPSAoc2tiX3F1ZXVlX2xlbigmcGNoLT5maWxlLnhxKSA9PSAwKTsKKwkJLyoKKwkJICogSWYgYSBjaGFubmVsIGhhc24ndCBoYWQgYSBmcmFnbWVudCB5ZXQsIGl0IGhhcyB0byBnZXQKKwkJICogb25lIGJlZm9yZSB3ZSBzZW5kIGFueSBmcmFnbWVudHMgb24gbGF0ZXIgY2hhbm5lbHMuCisJCSAqIElmIGl0IGNhbid0IHRha2UgYSBmcmFnbWVudCBub3csIGRvbid0IGdpdmUgYW55CisJCSAqIHRvIHN1YnNlcXVlbnQgY2hhbm5lbHMuCisJCSAqLworCQlpZiAoIXBjaC0+aGFkX2ZyYWcgJiYgIXBjaC0+YXZhaWwpIHsKKwkJCXdoaWxlICgobGlzdCA9IGxpc3QtPm5leHQpICE9ICZwcHAtPmNoYW5uZWxzKSB7CisJCQkJcGNoID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgY2hhbm5lbCwgY2xpc3QpOworCQkJCXBjaC0+YXZhaWwgPSAwOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKG5jaCA9PSAwKQorCQlyZXR1cm4gMDsJLyogY2FuJ3QgdGFrZSBub3csIGxlYXZlIGl0IGluIHhtaXRfcGVuZGluZyAqLworCisJLyogRG8gcHJvdG9jb2wgZmllbGQgY29tcHJlc3Npb24gKFhYWCB0aGlzIHNob3VsZCBiZSBvcHRpb25hbCkgKi8KKwlwID0gc2tiLT5kYXRhOworCWxlbiA9IHNrYi0+bGVuOworCWlmICgqcCA9PSAwKSB7CisJCSsrcDsKKwkJLS1sZW47CisJfQorCisJLyogZGVjaWRlIG9uIGZyYWdtZW50IHNpemUgKi8KKwlmcmFnc2l6ZSA9IGxlbjsKKwlpZiAobmNoID4gMSkgeworCQlpbnQgbWF4Y2ggPSBST1VORFVQKGxlbiwgTUlOX0ZSQUdfU0laRSk7CisJCWlmIChuY2ggPiBtYXhjaCkKKwkJCW5jaCA9IG1heGNoOworCQlmcmFnc2l6ZSA9IFJPVU5EVVAoZnJhZ3NpemUsIG5jaCk7CisJfQorCisJLyogc2tpcCB0byB0aGUgY2hhbm5lbCBhZnRlciB0aGUgb25lIHdlIGxhc3QgdXNlZAorCSAgIGFuZCBzdGFydCBhdCB0aGF0IG9uZSAqLworCWZvciAoaSA9IDA7IGkgPCBwcHAtPm54Y2hhbjsgKytpKSB7CisJCWxpc3QgPSBsaXN0LT5uZXh0OworCQlpZiAobGlzdCA9PSAmcHBwLT5jaGFubmVscykgeworCQkJaSA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIGNyZWF0ZSBhIGZyYWdtZW50IGZvciBlYWNoIGNoYW5uZWwgKi8KKwliaXRzID0gQjsKKwlkbyB7CisJCWxpc3QgPSBsaXN0LT5uZXh0OworCQlpZiAobGlzdCA9PSAmcHBwLT5jaGFubmVscykgeworCQkJaSA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlwY2ggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjaGFubmVsLCBjbGlzdCk7CisJCSsraTsKKwkJaWYgKCFwY2gtPmF2YWlsKQorCQkJY29udGludWU7CisKKwkJLyogY2hlY2sgdGhlIGNoYW5uZWwncyBtdHUgYW5kIHdoZXRoZXIgaXQgaXMgc3RpbGwgYXR0YWNoZWQuICovCisJCXNwaW5fbG9ja19iaCgmcGNoLT5kb3dubCk7CisJCWlmIChwY2gtPmNoYW4gPT0gMCB8fCAobXR1ID0gcGNoLT5jaGFuLT5tdHUpIDwgaGRybGVuKSB7CisJCQkvKiBjYW4ndCB1c2UgdGhpcyBjaGFubmVsICovCisJCQlzcGluX3VubG9ja19iaCgmcGNoLT5kb3dubCk7CisJCQlwY2gtPmF2YWlsID0gMDsKKwkJCWlmICgtLW5jaCA9PSAwKQorCQkJCWJyZWFrOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBXZSBoYXZlIHRvIGNyZWF0ZSBtdWx0aXBsZSBmcmFnbWVudHMgZm9yIHRoaXMgY2hhbm5lbAorCQkgKiBpZiBmcmFnc2l6ZSBpcyBncmVhdGVyIHRoYW4gdGhlIGNoYW5uZWwncyBtdHUuCisJCSAqLworCQlpZiAoZnJhZ3NpemUgPiBsZW4pCisJCQlmcmFnc2l6ZSA9IGxlbjsKKwkJZm9yIChmbGVuID0gZnJhZ3NpemU7IGZsZW4gPiAwOyBmbGVuIC09IGZuYikgeworCQkJZm5iID0gZmxlbjsKKwkJCWlmIChmbmIgPiBtdHUgKyAyIC0gaGRybGVuKQorCQkJCWZuYiA9IG10dSArIDIgLSBoZHJsZW47CisJCQlpZiAoZm5iID49IGxlbikKKwkJCQliaXRzIHw9IEU7CisJCQlmcmFnID0gYWxsb2Nfc2tiKGZuYiArIGhkcmxlbiwgR0ZQX0FUT01JQyk7CisJCQlpZiAoZnJhZyA9PSAwKQorCQkJCWdvdG8gbm9za2I7CisJCQlxID0gc2tiX3B1dChmcmFnLCBmbmIgKyBoZHJsZW4pOworCQkJLyogbWFrZSB0aGUgTVAgaGVhZGVyICovCisJCQlxWzBdID0gUFBQX01QID4+IDg7CisJCQlxWzFdID0gUFBQX01QOworCQkJaWYgKHBwcC0+ZmxhZ3MgJiBTQ19NUF9YU0hPUlRTRVEpIHsKKwkJCQlxWzJdID0gYml0cyArICgocHBwLT5ueHNlcSA+PiA4KSAmIDB4Zik7CisJCQkJcVszXSA9IHBwcC0+bnhzZXE7CisJCQl9IGVsc2UgeworCQkJCXFbMl0gPSBiaXRzOworCQkJCXFbM10gPSBwcHAtPm54c2VxID4+IDE2OworCQkJCXFbNF0gPSBwcHAtPm54c2VxID4+IDg7CisJCQkJcVs1XSA9IHBwcC0+bnhzZXE7CisJCQl9CisKKwkJCS8qIGNvcHkgdGhlIGRhdGEgaW4gKi8KKwkJCW1lbWNweShxICsgaGRybGVuLCBwLCBmbmIpOworCisJCQkvKiB0cnkgdG8gc2VuZCBpdCBkb3duIHRoZSBjaGFubmVsICovCisJCQljaGFuID0gcGNoLT5jaGFuOworCQkJaWYgKCFjaGFuLT5vcHMtPnN0YXJ0X3htaXQoY2hhbiwgZnJhZykpCisJCQkJc2tiX3F1ZXVlX3RhaWwoJnBjaC0+ZmlsZS54cSwgZnJhZyk7CisJCQlwY2gtPmhhZF9mcmFnID0gMTsKKwkJCXAgKz0gZm5iOworCQkJbGVuIC09IGZuYjsKKwkJCSsrcHBwLT5ueHNlcTsKKwkJCWJpdHMgPSAwOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZwY2gtPmRvd25sKTsKKwl9IHdoaWxlIChsZW4gPiAwKTsKKwlwcHAtPm54Y2hhbiA9IGk7CisKKwlyZXR1cm4gMTsKKworIG5vc2tiOgorCXNwaW5fdW5sb2NrX2JoKCZwY2gtPmRvd25sKTsKKwlpZiAocHBwLT5kZWJ1ZyAmIDEpCisJCXByaW50ayhLRVJOX0VSUiAiUFBQOiBubyBtZW1vcnkgKGZyYWdtZW50KVxuIik7CisJKytwcHAtPnN0YXRzLnR4X2Vycm9yczsKKwkrK3BwcC0+bnhzZXE7CisJcmV0dXJuIDE7CS8qIGFiYW5kb24gdGhlIGZyYW1lICovCit9CisjZW5kaWYgLyogQ09ORklHX1BQUF9NVUxUSUxJTksgKi8KKworLyoKKyAqIFRyeSB0byBzZW5kIGRhdGEgb3V0IG9uIGEgY2hhbm5lbC4KKyAqLworc3RhdGljIHZvaWQKK3BwcF9jaGFubmVsX3B1c2goc3RydWN0IGNoYW5uZWwgKnBjaCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBwcHAgKnBwcDsKKworCXNwaW5fbG9ja19iaCgmcGNoLT5kb3dubCk7CisJaWYgKHBjaC0+Y2hhbiAhPSAwKSB7CisJCXdoaWxlIChza2JfcXVldWVfbGVuKCZwY2gtPmZpbGUueHEpID4gMCkgeworCQkJc2tiID0gc2tiX2RlcXVldWUoJnBjaC0+ZmlsZS54cSk7CisJCQlpZiAoIXBjaC0+Y2hhbi0+b3BzLT5zdGFydF94bWl0KHBjaC0+Y2hhbiwgc2tiKSkgeworCQkJCS8qIHB1dCB0aGUgcGFja2V0IGJhY2sgYW5kIHRyeSBhZ2FpbiBsYXRlciAqLworCQkJCXNrYl9xdWV1ZV9oZWFkKCZwY2gtPmZpbGUueHEsIHNrYik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBjaGFubmVsIGdvdCBkZXJlZ2lzdGVyZWQgKi8KKwkJc2tiX3F1ZXVlX3B1cmdlKCZwY2gtPmZpbGUueHEpOworCX0KKwlzcGluX3VubG9ja19iaCgmcGNoLT5kb3dubCk7CisJLyogc2VlIGlmIHRoZXJlIGlzIGFueXRoaW5nIGZyb20gdGhlIGF0dGFjaGVkIHVuaXQgdG8gYmUgc2VudCAqLworCWlmIChza2JfcXVldWVfbGVuKCZwY2gtPmZpbGUueHEpID09IDApIHsKKwkJcmVhZF9sb2NrX2JoKCZwY2gtPnVwbCk7CisJCXBwcCA9IHBjaC0+cHBwOworCQlpZiAocHBwICE9IDApCisJCQlwcHBfeG1pdF9wcm9jZXNzKHBwcCk7CisJCXJlYWRfdW5sb2NrX2JoKCZwY2gtPnVwbCk7CisJfQorfQorCisvKgorICogUmVjZWl2ZS1zaWRlIHJvdXRpbmVzLgorICovCisKKy8qIG1pc3VzZSBhIGZldyBmaWVsZHMgb2YgdGhlIHNrYiBmb3IgTVAgcmVjb25zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgc2VxdWVuY2UJcHJpb3JpdHkKKyNkZWZpbmUgQkViaXRzCQljYlswXQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3BwcF9kb19yZWN2KHN0cnVjdCBwcHAgKnBwcCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNoYW5uZWwgKnBjaCkKK3sKKwlwcHBfcmVjdl9sb2NrKHBwcCk7CisJLyogcHBwLT5kZXYgPT0gMCBtZWFucyBpbnRlcmZhY2UgaXMgY2xvc2luZyBkb3duICovCisJaWYgKHBwcC0+ZGV2ICE9IDApCisJCXBwcF9yZWNlaXZlX2ZyYW1lKHBwcCwgc2tiLCBwY2gpOworCWVsc2UKKwkJa2ZyZWVfc2tiKHNrYik7CisJcHBwX3JlY3ZfdW5sb2NrKHBwcCk7Cit9CisKK3ZvaWQKK3BwcF9pbnB1dChzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW4sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGNoYW5uZWwgKnBjaCA9IGNoYW4tPnBwcDsKKwlpbnQgcHJvdG87CisKKwlpZiAocGNoID09IDAgfHwgc2tiLT5sZW4gPT0gMCkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKwkKKwlwcm90byA9IFBQUF9QUk9UTyhza2IpOworCXJlYWRfbG9ja19iaCgmcGNoLT51cGwpOworCWlmIChwY2gtPnBwcCA9PSAwIHx8IHByb3RvID49IDB4YzAwMCB8fCBwcm90byA9PSBQUFBfQ0NQRlJBRykgeworCQkvKiBwdXQgaXQgb24gdGhlIGNoYW5uZWwgcXVldWUgKi8KKwkJc2tiX3F1ZXVlX3RhaWwoJnBjaC0+ZmlsZS5ycSwgc2tiKTsKKwkJLyogZHJvcCBvbGQgZnJhbWVzIGlmIHF1ZXVlIHRvbyBsb25nICovCisJCXdoaWxlIChwY2gtPmZpbGUucnEucWxlbiA+IFBQUF9NQVhfUlFMRU4KKwkJICAgICAgICYmIChza2IgPSBza2JfZGVxdWV1ZSgmcGNoLT5maWxlLnJxKSkgIT0gMCkKKwkJCWtmcmVlX3NrYihza2IpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBjaC0+ZmlsZS5yd2FpdCk7CisJfSBlbHNlIHsKKwkJcHBwX2RvX3JlY3YocGNoLT5wcHAsIHNrYiwgcGNoKTsKKwl9CisJcmVhZF91bmxvY2tfYmgoJnBjaC0+dXBsKTsKK30KKworLyogUHV0IGEgMC1sZW5ndGggc2tiIGluIHRoZSByZWNlaXZlIHF1ZXVlIGFzIGFuIGVycm9yIGluZGljYXRpb24gKi8KK3ZvaWQKK3BwcF9pbnB1dF9lcnJvcihzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW4sIGludCBjb2RlKQoreworCXN0cnVjdCBjaGFubmVsICpwY2ggPSBjaGFuLT5wcHA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlmIChwY2ggPT0gMCkKKwkJcmV0dXJuOworCisJcmVhZF9sb2NrX2JoKCZwY2gtPnVwbCk7CisJaWYgKHBjaC0+cHBwICE9IDApIHsKKwkJc2tiID0gYWxsb2Nfc2tiKDAsIEdGUF9BVE9NSUMpOworCQlpZiAoc2tiICE9IDApIHsKKwkJCXNrYi0+bGVuID0gMDsJCS8qIHByb2JhYmx5IHVubmVjZXNzYXJ5ICovCisJCQlza2ItPmNiWzBdID0gY29kZTsKKwkJCXBwcF9kb19yZWN2KHBjaC0+cHBwLCBza2IsIHBjaCk7CisJCX0KKwl9CisJcmVhZF91bmxvY2tfYmgoJnBjaC0+dXBsKTsKK30KKworLyoKKyAqIFdlIGNvbWUgaW4gaGVyZSB0byBwcm9jZXNzIGEgcmVjZWl2ZWQgZnJhbWUuCisgKiBUaGUgcmVjZWl2ZSBzaWRlIG9mIHRoZSBwcHAgdW5pdCBpcyBsb2NrZWQuCisgKi8KK3N0YXRpYyB2b2lkCitwcHBfcmVjZWl2ZV9mcmFtZShzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBjaGFubmVsICpwY2gpCit7CisJaWYgKHNrYi0+bGVuID49IDIpIHsKKyNpZmRlZiBDT05GSUdfUFBQX01VTFRJTElOSworCQkvKiBYWFggZG8gY2hhbm5lbC1sZXZlbCBkZWNvbXByZXNzaW9uIGhlcmUgKi8KKwkJaWYgKFBQUF9QUk9UTyhza2IpID09IFBQUF9NUCkKKwkJCXBwcF9yZWNlaXZlX21wX2ZyYW1lKHBwcCwgc2tiLCBwY2gpOworCQllbHNlCisjZW5kaWYgLyogQ09ORklHX1BQUF9NVUxUSUxJTksgKi8KKwkJCXBwcF9yZWNlaXZlX25vbm1wX2ZyYW1lKHBwcCwgc2tiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChza2ItPmxlbiA+IDApCisJCS8qIG5vdGU6IGEgMC1sZW5ndGggc2tiIGlzIHVzZWQgYXMgYW4gZXJyb3IgaW5kaWNhdGlvbiAqLworCQkrK3BwcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKKworCWtmcmVlX3NrYihza2IpOworCXBwcF9yZWNlaXZlX2Vycm9yKHBwcCk7Cit9CisKK3N0YXRpYyB2b2lkCitwcHBfcmVjZWl2ZV9lcnJvcihzdHJ1Y3QgcHBwICpwcHApCit7CisJKytwcHAtPnN0YXRzLnJ4X2Vycm9yczsKKwlpZiAocHBwLT52aiAhPSAwKQorCQlzbGhjX3Rvc3MocHBwLT52aik7Cit9CisKK3N0YXRpYyB2b2lkCitwcHBfcmVjZWl2ZV9ub25tcF9mcmFtZShzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKm5zOworCWludCBwcm90bywgbGVuLCBucGk7CisKKwkvKgorCSAqIERlY29tcHJlc3MgdGhlIGZyYW1lLCBpZiBjb21wcmVzc2VkLgorCSAqIE5vdGUgdGhhdCBzb21lIGRlY29tcHJlc3NvcnMgbmVlZCB0byBzZWUgdW5jb21wcmVzc2VkIGZyYW1lcworCSAqIHRoYXQgY29tZSBpbiBhcyB3ZWxsIGFzIGNvbXByZXNzZWQgZnJhbWVzLgorCSAqLworCWlmIChwcHAtPnJjX3N0YXRlICE9IDAgJiYgKHBwcC0+cnN0YXRlICYgU0NfREVDT01QX1JVTikKKwkgICAgJiYgKHBwcC0+cnN0YXRlICYgKFNDX0RDX0ZFUlJPUiB8IFNDX0RDX0VSUk9SKSkgPT0gMCkKKwkJc2tiID0gcHBwX2RlY29tcHJlc3NfZnJhbWUocHBwLCBza2IpOworCisJcHJvdG8gPSBQUFBfUFJPVE8oc2tiKTsKKwlzd2l0Y2ggKHByb3RvKSB7CisJY2FzZSBQUFBfVkpDX0NPTVA6CisJCS8qIGRlY29tcHJlc3MgVkogY29tcHJlc3NlZCBwYWNrZXRzICovCisJCWlmIChwcHAtPnZqID09IDAgfHwgKHBwcC0+ZmxhZ3MgJiBTQ19SRUpfQ09NUF9UQ1ApKQorCQkJZ290byBlcnI7CisKKwkJaWYgKHNrYl90YWlscm9vbShza2IpIDwgMTI0KSB7CisJCQkvKiBjb3B5IHRvIGEgbmV3IHNrX2J1ZmYgd2l0aCBtb3JlIHRhaWxyb29tICovCisJCQlucyA9IGRldl9hbGxvY19za2Ioc2tiLT5sZW4gKyAxMjgpOworCQkJaWYgKG5zID09IDApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIiUFBQOiBubyBtZW1vcnkgKFZKIGRlY29tcClcbiIpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJc2tiX3Jlc2VydmUobnMsIDIpOworCQkJc2tiX2NvcHlfYml0cyhza2IsIDAsIHNrYl9wdXQobnMsIHNrYi0+bGVuKSwgc2tiLT5sZW4pOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlza2IgPSBuczsKKwkJfQorCQllbHNlIGlmICghcHNrYl9tYXlfcHVsbChza2IsIHNrYi0+bGVuKSkKKwkJCWdvdG8gZXJyOworCisJCWxlbiA9IHNsaGNfdW5jb21wcmVzcyhwcHAtPnZqLCBza2ItPmRhdGEgKyAyLCBza2ItPmxlbiAtIDIpOworCQlpZiAobGVuIDw9IDApIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJQUFA6IFZKIGRlY29tcHJlc3Npb24gZXJyb3JcbiIpOworCQkJZ290byBlcnI7CisJCX0KKwkJbGVuICs9IDI7CisJCWlmIChsZW4gPiBza2ItPmxlbikKKwkJCXNrYl9wdXQoc2tiLCBsZW4gLSBza2ItPmxlbik7CisJCWVsc2UgaWYgKGxlbiA8IHNrYi0+bGVuKQorCQkJc2tiX3RyaW0oc2tiLCBsZW4pOworCQlwcm90byA9IFBQUF9JUDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUF9WSkNfVU5DT01QOgorCQlpZiAocHBwLT52aiA9PSAwIHx8IChwcHAtPmZsYWdzICYgU0NfUkVKX0NPTVBfVENQKSkKKwkJCWdvdG8gZXJyOworCQkKKwkJLyogVW50aWwgd2UgZml4IHRoZSBkZWNvbXByZXNzb3IgbmVlZCB0byBtYWtlIHN1cmUKKwkJICogZGF0YSBwb3J0aW9uIGlzIGxpbmVhci4KKwkJICovCisJCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNrYi0+bGVuKSkgCisJCQlnb3RvIGVycjsKKworCQlpZiAoc2xoY19yZW1lbWJlcihwcHAtPnZqLCBza2ItPmRhdGEgKyAyLCBza2ItPmxlbiAtIDIpIDw9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiUFBQOiBWSiB1bmNvbXByZXNzZWQgZXJyb3JcbiIpOworCQkJZ290byBlcnI7CisJCX0KKwkJcHJvdG8gPSBQUFBfSVA7CisJCWJyZWFrOworCisJY2FzZSBQUFBfQ0NQOgorCQlwcHBfY2NwX3BlZWsocHBwLCBza2IsIDEpOworCQlicmVhazsKKwl9CisKKwkrK3BwcC0+c3RhdHMucnhfcGFja2V0czsKKwlwcHAtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuIC0gMjsKKworCW5waSA9IHByb3RvX3RvX25waW5kZXgocHJvdG8pOworCWlmIChucGkgPCAwKSB7CisJCS8qIGNvbnRyb2wgb3IgdW5rbm93biBmcmFtZSAtIHBhc3MgaXQgdG8gcHBwZCAqLworCQlza2JfcXVldWVfdGFpbCgmcHBwLT5maWxlLnJxLCBza2IpOworCQkvKiBsaW1pdCBxdWV1ZSBsZW5ndGggYnkgZHJvcHBpbmcgb2xkIGZyYW1lcyAqLworCQl3aGlsZSAocHBwLT5maWxlLnJxLnFsZW4gPiBQUFBfTUFYX1JRTEVOCisJCSAgICAgICAmJiAoc2tiID0gc2tiX2RlcXVldWUoJnBwcC0+ZmlsZS5ycSkpICE9IDApCisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJLyogd2FrZSB1cCBhbnkgcHJvY2VzcyBwb2xsaW5nIG9yIGJsb2NraW5nIG9uIHJlYWQgKi8KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcHAtPmZpbGUucndhaXQpOworCisJfSBlbHNlIHsKKwkJLyogbmV0d29yayBwcm90b2NvbCBmcmFtZSAtIGdpdmUgaXQgdG8gdGhlIGtlcm5lbCAqLworCisjaWZkZWYgQ09ORklHX1BQUF9GSUxURVIKKwkJLyogY2hlY2sgaWYgdGhlIHBhY2tldCBwYXNzZXMgdGhlIHBhc3MgYW5kIGFjdGl2ZSBmaWx0ZXJzICovCisJCS8qIHRoZSBmaWx0ZXIgaW5zdHJ1Y3Rpb25zIGFyZSBjb25zdHJ1Y3RlZCBhc3N1bWluZworCQkgICBhIGZvdXItYnl0ZSBQUFAgaGVhZGVyIG9uIGVhY2ggcGFja2V0ICovCisJCSpza2JfcHVzaChza2IsIDIpID0gMDsKKwkJaWYgKHBwcC0+cGFzc19maWx0ZXIKKwkJICAgICYmIHNrX3J1bl9maWx0ZXIoc2tiLCBwcHAtPnBhc3NfZmlsdGVyLAorCQkJCSAgICAgcHBwLT5wYXNzX2xlbikgPT0gMCkgeworCQkJaWYgKHBwcC0+ZGVidWcgJiAxKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJQUFA6IGluYm91bmQgZnJhbWUgbm90IHBhc3NlZFxuIik7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoIShwcHAtPmFjdGl2ZV9maWx0ZXIKKwkJICAgICAgJiYgc2tfcnVuX2ZpbHRlcihza2IsIHBwcC0+YWN0aXZlX2ZpbHRlciwKKwkJCQkgICAgICAgcHBwLT5hY3RpdmVfbGVuKSA9PSAwKSkKKwkJCXBwcC0+bGFzdF9yZWN2ID0gamlmZmllczsKKwkJc2tiX3B1bGwoc2tiLCAyKTsKKyNlbHNlCisJCXBwcC0+bGFzdF9yZWN2ID0gamlmZmllczsKKyNlbmRpZiAvKiBDT05GSUdfUFBQX0ZJTFRFUiAqLworCisJCWlmICgocHBwLT5kZXYtPmZsYWdzICYgSUZGX1VQKSA9PSAwCisJCSAgICB8fCBwcHAtPm5wbW9kZVtucGldICE9IE5QTU9ERV9QQVNTKSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJfSBlbHNlIHsKKwkJCXNrYl9wdWxsKHNrYiwgMik7CS8qIGNob3Agb2ZmIHByb3RvY29sICovCisJCQlza2ItPmRldiA9IHBwcC0+ZGV2OworCQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKG5waW5kZXhfdG9fZXRoZXJ0eXBlW25waV0pOworCQkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCQkJc2tiLT5pbnB1dF9kZXYgPSBwcHAtPmRldjsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlwcHAtPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCX0KKwl9CisJcmV0dXJuOworCisgZXJyOgorCWtmcmVlX3NrYihza2IpOworCXBwcF9yZWNlaXZlX2Vycm9yKHBwcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCitwcHBfZGVjb21wcmVzc19mcmFtZShzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHByb3RvID0gUFBQX1BST1RPKHNrYik7CisJc3RydWN0IHNrX2J1ZmYgKm5zOworCWludCBsZW47CisKKwkvKiBVbnRpbCB3ZSBmaXggYWxsIHRoZSBkZWNvbXByZXNzb3IncyBuZWVkIHRvIG1ha2Ugc3VyZQorCSAqIGRhdGEgcG9ydGlvbiBpcyBsaW5lYXIuCisJICovCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2tiLT5sZW4pKQorCQlnb3RvIGVycjsKKworCWlmIChwcm90byA9PSBQUFBfQ09NUCkgeworCQlucyA9IGRldl9hbGxvY19za2IocHBwLT5tcnUgKyBQUFBfSERSTEVOKTsKKwkJaWYgKG5zID09IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAicHBwX2RlY29tcHJlc3NfZnJhbWU6IG5vIG1lbW9yeVxuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCQkvKiB0aGUgZGVjb21wcmVzc29yIHN0aWxsIGV4cGVjdHMgdGhlIEEvQyBieXRlcyBpbiB0aGUgaGRyICovCisJCWxlbiA9IHBwcC0+cmNvbXAtPmRlY29tcHJlc3MocHBwLT5yY19zdGF0ZSwgc2tiLT5kYXRhIC0gMiwKKwkJCQlza2ItPmxlbiArIDIsIG5zLT5kYXRhLCBwcHAtPm1ydSArIFBQUF9IRFJMRU4pOworCQlpZiAobGVuIDwgMCkgeworCQkJLyogUGFzcyB0aGUgY29tcHJlc3NlZCBmcmFtZSB0byBwcHBkIGFzIGFuCisJCQkgICBlcnJvciBpbmRpY2F0aW9uLiAqLworCQkJaWYgKGxlbiA9PSBERUNPTVBfRkFUQUxFUlJPUikKKwkJCQlwcHAtPnJzdGF0ZSB8PSBTQ19EQ19GRVJST1I7CisJCQlrZnJlZV9za2IobnMpOworCQkJZ290byBlcnI7CisJCX0KKworCQlrZnJlZV9za2Ioc2tiKTsKKwkJc2tiID0gbnM7CisJCXNrYl9wdXQoc2tiLCBsZW4pOworCQlza2JfcHVsbChza2IsIDIpOwkvKiBwdWxsIG9mZiB0aGUgQS9DIGJ5dGVzICovCisKKwl9IGVsc2UgeworCQkvKiBVbmNvbXByZXNzZWQgZnJhbWUgLSBwYXNzIHRvIGRlY29tcHJlc3NvciBzbyBpdAorCQkgICBjYW4gdXBkYXRlIGl0cyBkaWN0aW9uYXJ5IGlmIG5lY2Vzc2FyeS4gKi8KKwkJaWYgKHBwcC0+cmNvbXAtPmluY29tcCkKKwkJCXBwcC0+cmNvbXAtPmluY29tcChwcHAtPnJjX3N0YXRlLCBza2ItPmRhdGEgLSAyLAorCQkJCQkgICBza2ItPmxlbiArIDIpOworCX0KKworCXJldHVybiBza2I7CisKKyBlcnI6CisJcHBwLT5yc3RhdGUgfD0gU0NfRENfRVJST1I7CisJcHBwX3JlY2VpdmVfZXJyb3IocHBwKTsKKwlyZXR1cm4gc2tiOworfQorCisjaWZkZWYgQ09ORklHX1BQUF9NVUxUSUxJTksKKy8qCisgKiBSZWNlaXZlIGEgbXVsdGlsaW5rIGZyYW1lLgorICogV2UgcHV0IGl0IG9uIHRoZSByZWNvbnN0cnVjdGlvbiBxdWV1ZSBhbmQgdGhlbiBwdWxsIG9mZgorICogYXMgbWFueSBjb21wbGV0ZWQgZnJhbWVzIGFzIHdlIGNhbi4KKyAqLworc3RhdGljIHZvaWQKK3BwcF9yZWNlaXZlX21wX2ZyYW1lKHN0cnVjdCBwcHAgKnBwcCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGNoYW5uZWwgKnBjaCkKK3sKKwl1MzIgbWFzaywgc2VxOworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJaW50IG1waGRybGVuID0gKHBwcC0+ZmxhZ3MgJiBTQ19NUF9TSE9SVFNFUSk/IE1QSERSTEVOX1NTTjogTVBIRFJMRU47CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBtcGhkcmxlbiArIDEpIHx8IHBwcC0+bXJydSA9PSAwKQorCQlnb3RvIGVycjsJCS8qIG5vIGdvb2QsIHRocm93IGl0IGF3YXkgKi8KKworCS8qIERlY29kZSBzZXF1ZW5jZSBudW1iZXIgYW5kIGJlZ2luL2VuZCBiaXRzICovCisJaWYgKHBwcC0+ZmxhZ3MgJiBTQ19NUF9TSE9SVFNFUSkgeworCQlzZXEgPSAoKHNrYi0+ZGF0YVsyXSAmIDB4MGYpIDw8IDgpIHwgc2tiLT5kYXRhWzNdOworCQltYXNrID0gMHhmZmY7CisJfSBlbHNlIHsKKwkJc2VxID0gKHNrYi0+ZGF0YVszXSA8PCAxNikgfCAoc2tiLT5kYXRhWzRdIDw8IDgpfCBza2ItPmRhdGFbNV07CisJCW1hc2sgPSAweGZmZmZmZjsKKwl9CisJc2tiLT5CRWJpdHMgPSBza2ItPmRhdGFbMl07CisJc2tiX3B1bGwoc2tiLCBtcGhkcmxlbik7CS8qIHB1bGwgb2ZmIFBQUCBhbmQgTVAgaGVhZGVycyAqLworCisJLyoKKwkgKiBEbyBwcm90b2NvbCBJRCBkZWNvbXByZXNzaW9uIG9uIHRoZSBmaXJzdCBmcmFnbWVudCBvZiBlYWNoIHBhY2tldC4KKwkgKi8KKwlpZiAoKHNrYi0+QkViaXRzICYgQikgJiYgKHNrYi0+ZGF0YVswXSAmIDEpKQorCQkqc2tiX3B1c2goc2tiLCAxKSA9IDA7CisKKwkvKgorCSAqIEV4cGFuZCBzZXF1ZW5jZSBudW1iZXIgdG8gMzIgYml0cywgbWFraW5nIGl0IGFzIGNsb3NlCisJICogYXMgcG9zc2libGUgdG8gcHBwLT5taW5zZXEuCisJICovCisJc2VxIHw9IHBwcC0+bWluc2VxICYgfm1hc2s7CisJaWYgKChpbnQpKHBwcC0+bWluc2VxIC0gc2VxKSA+IChpbnQpKG1hc2sgPj4gMSkpCisJCXNlcSArPSBtYXNrICsgMTsKKwllbHNlIGlmICgoaW50KShzZXEgLSBwcHAtPm1pbnNlcSkgPiAoaW50KShtYXNrID4+IDEpKQorCQlzZXEgLT0gbWFzayArIDE7CS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwlza2ItPnNlcXVlbmNlID0gc2VxOworCXBjaC0+bGFzdHNlcSA9IHNlcTsKKworCS8qCisJICogSWYgdGhpcyBwYWNrZXQgY29tZXMgYmVmb3JlIHRoZSBuZXh0IG9uZSB3ZSB3ZXJlIGV4cGVjdGluZywKKwkgKiBkcm9wIGl0LgorCSAqLworCWlmIChzZXFfYmVmb3JlKHNlcSwgcHBwLT5uZXh0c2VxKSkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJKytwcHAtPnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCXBwcF9yZWNlaXZlX2Vycm9yKHBwcCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFJlZXZhbHVhdGUgbWluc2VxLCB0aGUgbWluaW11bSBvdmVyIGFsbCBjaGFubmVscyBvZiB0aGUKKwkgKiBsYXN0IHNlcXVlbmNlIG51bWJlciByZWNlaXZlZCBvbiBlYWNoIGNoYW5uZWwuICBCZWNhdXNlIG9mCisJICogdGhlIGluY3JlYXNpbmcgc2VxdWVuY2UgbnVtYmVyIHJ1bGUsIHdlIGtub3cgdGhhdCBhbnkgZnJhZ21lbnQKKwkgKiBiZWZvcmUgYG1pbnNlcScgd2hpY2ggaGFzbid0IGFycml2ZWQgaXMgbmV2ZXIgZ29pbmcgdG8gYXJyaXZlLgorCSAqIFRoZSBsaXN0IG9mIGNoYW5uZWxzIGNhbid0IGNoYW5nZSBiZWNhdXNlIHdlIGhhdmUgdGhlIHJlY2VpdmUKKwkgKiBzaWRlIG9mIHRoZSBwcHAgdW5pdCBsb2NrZWQuCisJICovCisJZm9yIChsID0gcHBwLT5jaGFubmVscy5uZXh0OyBsICE9ICZwcHAtPmNoYW5uZWxzOyBsID0gbC0+bmV4dCkgeworCQlzdHJ1Y3QgY2hhbm5lbCAqY2ggPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBjaGFubmVsLCBjbGlzdCk7CisJCWlmIChzZXFfYmVmb3JlKGNoLT5sYXN0c2VxLCBzZXEpKQorCQkJc2VxID0gY2gtPmxhc3RzZXE7CisJfQorCWlmIChzZXFfYmVmb3JlKHBwcC0+bWluc2VxLCBzZXEpKQorCQlwcHAtPm1pbnNlcSA9IHNlcTsKKworCS8qIFB1dCB0aGUgZnJhZ21lbnQgb24gdGhlIHJlY29uc3RydWN0aW9uIHF1ZXVlICovCisJcHBwX21wX2luc2VydChwcHAsIHNrYik7CisKKwkvKiBJZiB0aGUgcXVldWUgaXMgZ2V0dGluZyBsb25nLCBkb24ndCB3YWl0IGFueSBsb25nZXIgZm9yIHBhY2tldHMKKwkgICBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBxdWV1ZS4gKi8KKwlpZiAoc2tiX3F1ZXVlX2xlbigmcHBwLT5tcnEpID49IFBQUF9NUF9NQVhfUUxFTgorCSAgICAmJiBzZXFfYmVmb3JlKHBwcC0+bWluc2VxLCBwcHAtPm1ycS5uZXh0LT5zZXF1ZW5jZSkpCisJCXBwcC0+bWluc2VxID0gcHBwLT5tcnEubmV4dC0+c2VxdWVuY2U7CisKKwkvKiBQdWxsIGNvbXBsZXRlZCBwYWNrZXRzIG9mZiB0aGUgcXVldWUgYW5kIHJlY2VpdmUgdGhlbS4gKi8KKwl3aGlsZSAoKHNrYiA9IHBwcF9tcF9yZWNvbnN0cnVjdChwcHApKSAhPSAwKQorCQlwcHBfcmVjZWl2ZV9ub25tcF9mcmFtZShwcHAsIHNrYik7CisKKwlyZXR1cm47CisKKyBlcnI6CisJa2ZyZWVfc2tiKHNrYik7CisJcHBwX3JlY2VpdmVfZXJyb3IocHBwKTsKK30KKworLyoKKyAqIEluc2VydCBhIGZyYWdtZW50IG9uIHRoZSBNUCByZWNvbnN0cnVjdGlvbiBxdWV1ZS4KKyAqIFRoZSBxdWV1ZSBpcyBvcmRlcmVkIGJ5IGluY3JlYXNpbmcgc2VxdWVuY2UgbnVtYmVyLgorICovCitzdGF0aWMgdm9pZAorcHBwX21wX2luc2VydChzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKnA7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCA9ICZwcHAtPm1ycTsKKwl1MzIgc2VxID0gc2tiLT5zZXF1ZW5jZTsKKworCS8qIE4uQi4gd2UgZG9uJ3QgbmVlZCB0byBsb2NrIHRoZSBsaXN0IGxvY2sgYmVjYXVzZSB3ZSBoYXZlIHRoZQorCSAgIHBwcCB1bml0IHJlY2VpdmUtc2lkZSBsb2NrLiAqLworCWZvciAocCA9IGxpc3QtPm5leHQ7IHAgIT0gKHN0cnVjdCBza19idWZmICopbGlzdDsgcCA9IHAtPm5leHQpCisJCWlmIChzZXFfYmVmb3JlKHNlcSwgcC0+c2VxdWVuY2UpKQorCQkJYnJlYWs7CisJX19za2JfaW5zZXJ0KHNrYiwgcC0+cHJldiwgcCwgbGlzdCk7Cit9CisKKy8qCisgKiBSZWNvbnN0cnVjdCBhIHBhY2tldCBmcm9tIHRoZSBNUCBmcmFnbWVudCBxdWV1ZS4KKyAqIFdlIGdvIHRocm91Z2ggaW5jcmVhc2luZyBzZXF1ZW5jZSBudW1iZXJzIHVudGlsIHdlIGZpbmQgYQorICogY29tcGxldGUgcGFja2V0LCBvciB3ZSBnZXQgdG8gdGhlIHNlcXVlbmNlIG51bWJlciBmb3IgYSBmcmFnbWVudAorICogd2hpY2ggaGFzbid0IGFycml2ZWQgYnV0IG1pZ2h0IHN0aWxsIGRvIHNvLgorICovCitzdHJ1Y3Qgc2tfYnVmZiAqCitwcHBfbXBfcmVjb25zdHJ1Y3Qoc3RydWN0IHBwcCAqcHBwKQoreworCXUzMiBzZXEgPSBwcHAtPm5leHRzZXE7CisJdTMyIG1pbnNlcSA9IHBwcC0+bWluc2VxOworCXN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QgPSAmcHBwLT5tcnE7CisJc3RydWN0IHNrX2J1ZmYgKnAsICpuZXh0OworCXN0cnVjdCBza19idWZmICpoZWFkLCAqdGFpbDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlpbnQgbG9zdCA9IDAsIGxlbiA9IDA7CisKKwlpZiAocHBwLT5tcnJ1ID09IDApCS8qIGRvIG5vdGhpbmcgdW50aWwgbXJydSBpcyBzZXQgKi8KKwkJcmV0dXJuIE5VTEw7CisJaGVhZCA9IGxpc3QtPm5leHQ7CisJdGFpbCA9IE5VTEw7CisJZm9yIChwID0gaGVhZDsgcCAhPSAoc3RydWN0IHNrX2J1ZmYgKikgbGlzdDsgcCA9IG5leHQpIHsKKwkJbmV4dCA9IHAtPm5leHQ7CisJCWlmIChzZXFfYmVmb3JlKHAtPnNlcXVlbmNlLCBzZXEpKSB7CisJCQkvKiB0aGlzIGNhbid0IGhhcHBlbiwgYW55d2F5IGlnbm9yZSB0aGUgc2tiICovCisJCQlwcmludGsoS0VSTl9FUlIgInBwcF9tcF9yZWNvbnN0cnVjdCBiYWQgc2VxICV1IDwgJXVcbiIsCisJCQkgICAgICAgcC0+c2VxdWVuY2UsIHNlcSk7CisJCQloZWFkID0gbmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChwLT5zZXF1ZW5jZSAhPSBzZXEpIHsKKwkJCS8qIEZyYWdtZW50IGBzZXEnIGlzIG1pc3NpbmcuICBJZiBpdCBpcyBhZnRlcgorCQkJICAgbWluc2VxLCBpdCBtaWdodCBhcnJpdmUgbGF0ZXIsIHNvIHN0b3AgaGVyZS4gKi8KKwkJCWlmIChzZXFfYWZ0ZXIoc2VxLCBtaW5zZXEpKQorCQkJCWJyZWFrOworCQkJLyogRnJhZ21lbnQgYHNlcScgaXMgbG9zdCwga2VlcCBnb2luZy4gKi8KKwkJCWxvc3QgPSAxOworCQkJc2VxID0gc2VxX2JlZm9yZShtaW5zZXEsIHAtPnNlcXVlbmNlKT8KKwkJCQltaW5zZXEgKyAxOiBwLT5zZXF1ZW5jZTsKKwkJCW5leHQgPSBwOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBhbGwgdGhlIGZyYWdtZW50cyBmcm9tCisJCSAqIHBwcC0+bmV4dHNlcSB0byBzZXEgYXJlIGVpdGhlciBwcmVzZW50IG9yIGxvc3QuCisJCSAqIEFsc28sIHRoZXJlIGFyZSBubyBjb21wbGV0ZSBwYWNrZXRzIGluIHRoZSBxdWV1ZQorCQkgKiB0aGF0IGhhdmUgbm8gbWlzc2luZyBmcmFnbWVudHMgYW5kIGVuZCBiZWZvcmUgdGhpcworCQkgKiBmcmFnbWVudC4KKwkJICovCisKKwkJLyogQiBiaXQgc2V0IGluZGljYXRlcyB0aGlzIGZyYWdtZW50IHN0YXJ0cyBhIHBhY2tldCAqLworCQlpZiAocC0+QkViaXRzICYgQikgeworCQkJaGVhZCA9IHA7CisJCQlsb3N0ID0gMDsKKwkJCWxlbiA9IDA7CisJCX0KKworCQlsZW4gKz0gcC0+bGVuOworCisJCS8qIEdvdCBhIGNvbXBsZXRlIHBhY2tldCB5ZXQ/ICovCisJCWlmIChsb3N0ID09IDAgJiYgKHAtPkJFYml0cyAmIEUpICYmIChoZWFkLT5CRWJpdHMgJiBCKSkgeworCQkJaWYgKGxlbiA+IHBwcC0+bXJydSArIDIpIHsKKwkJCQkrK3BwcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiUFBQOiByZWNvbnN0cnVjdGVkIHBhY2tldCIKKwkJCQkgICAgICAgIiBpcyB0b28gbG9uZyAoJWQpXG4iLCBsZW4pOworCQkJfSBlbHNlIGlmIChwID09IGhlYWQpIHsKKwkJCQkvKiBmcmFnbWVudCBpcyBjb21wbGV0ZSBwYWNrZXQgLSByZXVzZSBza2IgKi8KKwkJCQl0YWlsID0gcDsKKwkJCQlza2IgPSBza2JfZ2V0KHApOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmICgoc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pKSA9PSBOVUxMKSB7CisJCQkJKytwcHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnM7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIlBQUDogbm8gbWVtb3J5IGZvciAiCisJCQkJICAgICAgICJyZWNvbnN0cnVjdGVkIHBhY2tldCIpOworCQkJfSBlbHNlIHsKKwkJCQl0YWlsID0gcDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXBwcC0+bmV4dHNlcSA9IHNlcSArIDE7CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGlzIGlzIHRoZSBlbmRpbmcgZnJhZ21lbnQgb2YgYSBwYWNrZXQsCisJCSAqIGFuZCB3ZSBoYXZlbid0IGZvdW5kIGEgY29tcGxldGUgdmFsaWQgcGFja2V0IHlldCwKKwkJICogd2UgY2FuIGRpc2NhcmQgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGlzIGZyYWdtZW50LgorCQkgKi8KKwkJaWYgKHAtPkJFYml0cyAmIEUpCisJCQloZWFkID0gbmV4dDsKKworCQkrK3NlcTsKKwl9CisKKwkvKiBJZiB3ZSBoYXZlIGEgY29tcGxldGUgcGFja2V0LCBjb3B5IGl0IGFsbCBpbnRvIG9uZSBza2IuICovCisJaWYgKHRhaWwgIT0gTlVMTCkgeworCQkvKiBJZiB3ZSBoYXZlIGRpc2NhcmRlZCBhbnkgZnJhZ21lbnRzLAorCQkgICBzaWduYWwgYSByZWNlaXZlIGVycm9yLiAqLworCQlpZiAoaGVhZC0+c2VxdWVuY2UgIT0gcHBwLT5uZXh0c2VxKSB7CisJCQlpZiAocHBwLT5kZWJ1ZyAmIDEpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgbWlzc2VkIHBrdHMgJXUuLiV1XG4iLAorCQkJCSAgICAgICBwcHAtPm5leHRzZXEsIGhlYWQtPnNlcXVlbmNlLTEpOworCQkJKytwcHAtPnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCQlwcHBfcmVjZWl2ZV9lcnJvcihwcHApOworCQl9CisKKwkJaWYgKGhlYWQgIT0gdGFpbCkKKwkJCS8qIGNvcHkgdG8gYSBzaW5nbGUgc2tiICovCisJCQlmb3IgKHAgPSBoZWFkOyBwICE9IHRhaWwtPm5leHQ7IHAgPSBwLT5uZXh0KQorCQkJCXNrYl9jb3B5X2JpdHMocCwgMCwgc2tiX3B1dChza2IsIHAtPmxlbiksIHAtPmxlbik7CisJCXBwcC0+bmV4dHNlcSA9IHRhaWwtPnNlcXVlbmNlICsgMTsKKwkJaGVhZCA9IHRhaWwtPm5leHQ7CisJfQorCisJLyogRGlzY2FyZCBhbGwgdGhlIHNrYnVmZnMgdGhhdCB3ZSBoYXZlIGNvcGllZCB0aGUgZGF0YSBvdXQgb2YKKwkgICBvciB0aGF0IHdlIGNhbid0IHVzZS4gKi8KKwl3aGlsZSAoKHAgPSBsaXN0LT5uZXh0KSAhPSBoZWFkKSB7CisJCV9fc2tiX3VubGluayhwLCBsaXN0KTsKKwkJa2ZyZWVfc2tiKHApOworCX0KKworCXJldHVybiBza2I7Cit9CisjZW5kaWYgLyogQ09ORklHX1BQUF9NVUxUSUxJTksgKi8KKworLyoKKyAqIENoYW5uZWwgaW50ZXJmYWNlLgorICovCisKKy8qCisgKiBDcmVhdGUgYSBuZXcsIHVuYXR0YWNoZWQgcHBwIGNoYW5uZWwuCisgKi8KK2ludAorcHBwX3JlZ2lzdGVyX2NoYW5uZWwoc3RydWN0IHBwcF9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBjaGFubmVsICpwY2g7CisKKwlwY2ggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY2hhbm5lbCksIEdGUF9LRVJORUwpOworCWlmIChwY2ggPT0gMCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KHBjaCwgMCwgc2l6ZW9mKHN0cnVjdCBjaGFubmVsKSk7CisJcGNoLT5wcHAgPSBOVUxMOworCXBjaC0+Y2hhbiA9IGNoYW47CisJY2hhbi0+cHBwID0gcGNoOworCWluaXRfcHBwX2ZpbGUoJnBjaC0+ZmlsZSwgQ0hBTk5FTCk7CisJcGNoLT5maWxlLmhkcmxlbiA9IGNoYW4tPmhkcmxlbjsKKyNpZmRlZiBDT05GSUdfUFBQX01VTFRJTElOSworCXBjaC0+bGFzdHNlcSA9IC0xOworI2VuZGlmIC8qIENPTkZJR19QUFBfTVVMVElMSU5LICovCisJaW5pdF9yd3NlbSgmcGNoLT5jaGFuX3NlbSk7CisJc3Bpbl9sb2NrX2luaXQoJnBjaC0+ZG93bmwpOworCXJ3bG9ja19pbml0KCZwY2gtPnVwbCk7CisJc3Bpbl9sb2NrX2JoKCZhbGxfY2hhbm5lbHNfbG9jayk7CisJcGNoLT5maWxlLmluZGV4ID0gKytsYXN0X2NoYW5uZWxfaW5kZXg7CisJbGlzdF9hZGQoJnBjaC0+bGlzdCwgJm5ld19jaGFubmVscyk7CisJYXRvbWljX2luYygmY2hhbm5lbF9jb3VudCk7CisJc3Bpbl91bmxvY2tfYmgoJmFsbF9jaGFubmVsc19sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJldHVybiB0aGUgaW5kZXggb2YgYSBjaGFubmVsLgorICovCitpbnQgcHBwX2NoYW5uZWxfaW5kZXgoc3RydWN0IHBwcF9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBjaGFubmVsICpwY2ggPSBjaGFuLT5wcHA7CisKKwlpZiAocGNoICE9IDApCisJCXJldHVybiBwY2gtPmZpbGUuaW5kZXg7CisJcmV0dXJuIC0xOworfQorCisvKgorICogUmV0dXJuIHRoZSBQUFAgdW5pdCBudW1iZXIgdG8gd2hpY2ggYSBjaGFubmVsIGlzIGNvbm5lY3RlZC4KKyAqLworaW50IHBwcF91bml0X251bWJlcihzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGNoYW5uZWwgKnBjaCA9IGNoYW4tPnBwcDsKKwlpbnQgdW5pdCA9IC0xOworCisJaWYgKHBjaCAhPSAwKSB7CisJCXJlYWRfbG9ja19iaCgmcGNoLT51cGwpOworCQlpZiAocGNoLT5wcHAgIT0gMCkKKwkJCXVuaXQgPSBwY2gtPnBwcC0+ZmlsZS5pbmRleDsKKwkJcmVhZF91bmxvY2tfYmgoJnBjaC0+dXBsKTsKKwl9CisJcmV0dXJuIHVuaXQ7Cit9CisKKy8qCisgKiBEaXNjb25uZWN0IGEgY2hhbm5lbCBmcm9tIHRoZSBnZW5lcmljIGxheWVyLgorICogVGhpcyBtdXN0IGJlIGNhbGxlZCBpbiBwcm9jZXNzIGNvbnRleHQuCisgKi8KK3ZvaWQKK3BwcF91bnJlZ2lzdGVyX2NoYW5uZWwoc3RydWN0IHBwcF9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBjaGFubmVsICpwY2ggPSBjaGFuLT5wcHA7CisKKwlpZiAocGNoID09IDApCisJCXJldHVybjsJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwljaGFuLT5wcHAgPSBOVUxMOworCisJLyoKKwkgKiBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBoYXZlIHJldHVybmVkIGZyb20gYW55IGNhbGxzIGludG8gdGhlCisJICogdGhlIGNoYW5uZWwncyBzdGFydF94bWl0IG9yIGlvY3RsIHJvdXRpbmUgYmVmb3JlIHdlIHByb2NlZWQuCisJICovCisJZG93bl93cml0ZSgmcGNoLT5jaGFuX3NlbSk7CisJc3Bpbl9sb2NrX2JoKCZwY2gtPmRvd25sKTsKKwlwY2gtPmNoYW4gPSBOVUxMOworCXNwaW5fdW5sb2NrX2JoKCZwY2gtPmRvd25sKTsKKwl1cF93cml0ZSgmcGNoLT5jaGFuX3NlbSk7CisJcHBwX2Rpc2Nvbm5lY3RfY2hhbm5lbChwY2gpOworCXNwaW5fbG9ja19iaCgmYWxsX2NoYW5uZWxzX2xvY2spOworCWxpc3RfZGVsKCZwY2gtPmxpc3QpOworCXNwaW5fdW5sb2NrX2JoKCZhbGxfY2hhbm5lbHNfbG9jayk7CisJcGNoLT5maWxlLmRlYWQgPSAxOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcGNoLT5maWxlLnJ3YWl0KTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcGNoLT5maWxlLnJlZmNudCkpCisJCXBwcF9kZXN0cm95X2NoYW5uZWwocGNoKTsKK30KKworLyoKKyAqIENhbGxiYWNrIGZyb20gYSBjaGFubmVsIHdoZW4gaXQgY2FuIGFjY2VwdCBtb3JlIHRvIHRyYW5zbWl0LgorICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGF0IEJIL3NvZnRpcnEgbGV2ZWwsIG5vdCBpbnRlcnJ1cHQgbGV2ZWwuCisgKi8KK3ZvaWQKK3BwcF9vdXRwdXRfd2FrZXVwKHN0cnVjdCBwcHBfY2hhbm5lbCAqY2hhbikKK3sKKwlzdHJ1Y3QgY2hhbm5lbCAqcGNoID0gY2hhbi0+cHBwOworCisJaWYgKHBjaCA9PSAwKQorCQlyZXR1cm47CisJcHBwX2NoYW5uZWxfcHVzaChwY2gpOworfQorCisvKgorICogQ29tcHJlc3Npb24gY29udHJvbC4KKyAqLworCisvKiBQcm9jZXNzIHRoZSBQUFBJT0NTQ09NUFJFU1MgaW9jdGwuICovCitzdGF0aWMgaW50CitwcHBfc2V0X2NvbXByZXNzKHN0cnVjdCBwcHAgKnBwcCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgY29tcHJlc3NvciAqY3AsICpvY29tcDsKKwlzdHJ1Y3QgcHBwX29wdGlvbl9kYXRhIGRhdGE7CisJdm9pZCAqc3RhdGUsICpvc3RhdGU7CisJdW5zaWduZWQgY2hhciBjY3Bfb3B0aW9uW0NDUF9NQVhfT1BUSU9OX0xFTkdUSF07CisKKwllcnIgPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcigmZGF0YSwgKHZvaWQgX191c2VyICopIGFyZywgc2l6ZW9mKGRhdGEpKQorCSAgICB8fCAoZGF0YS5sZW5ndGggPD0gQ0NQX01BWF9PUFRJT05fTEVOR1RICisJCSYmIGNvcHlfZnJvbV91c2VyKGNjcF9vcHRpb24sICh2b2lkIF9fdXNlciAqKSBkYXRhLnB0ciwgZGF0YS5sZW5ndGgpKSkKKwkJZ290byBvdXQ7CisJZXJyID0gLUVJTlZBTDsKKwlpZiAoZGF0YS5sZW5ndGggPiBDQ1BfTUFYX09QVElPTl9MRU5HVEgKKwkgICAgfHwgY2NwX29wdGlvblsxXSA8IDIgfHwgY2NwX29wdGlvblsxXSA+IGRhdGEubGVuZ3RoKQorCQlnb3RvIG91dDsKKworCWNwID0gZmluZF9jb21wcmVzc29yKGNjcF9vcHRpb25bMF0pOworI2lmZGVmIENPTkZJR19LTU9ECisJaWYgKGNwID09IDApIHsKKwkJcmVxdWVzdF9tb2R1bGUoInBwcC1jb21wcmVzcy0lZCIsIGNjcF9vcHRpb25bMF0pOworCQljcCA9IGZpbmRfY29tcHJlc3NvcihjY3Bfb3B0aW9uWzBdKTsKKwl9CisjZW5kaWYgLyogQ09ORklHX0tNT0QgKi8KKwlpZiAoY3AgPT0gMCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRU5PQlVGUzsKKwlpZiAoZGF0YS50cmFuc21pdCkgeworCQlzdGF0ZSA9IGNwLT5jb21wX2FsbG9jKGNjcF9vcHRpb24sIGRhdGEubGVuZ3RoKTsKKwkJaWYgKHN0YXRlICE9IDApIHsKKwkJCXBwcF94bWl0X2xvY2socHBwKTsKKwkJCXBwcC0+eHN0YXRlICY9IH5TQ19DT01QX1JVTjsKKwkJCW9jb21wID0gcHBwLT54Y29tcDsKKwkJCW9zdGF0ZSA9IHBwcC0+eGNfc3RhdGU7CisJCQlwcHAtPnhjb21wID0gY3A7CisJCQlwcHAtPnhjX3N0YXRlID0gc3RhdGU7CisJCQlwcHBfeG1pdF91bmxvY2socHBwKTsKKwkJCWlmIChvc3RhdGUgIT0gMCkgeworCQkJCW9jb21wLT5jb21wX2ZyZWUob3N0YXRlKTsKKwkJCQltb2R1bGVfcHV0KG9jb21wLT5vd25lcik7CisJCQl9CisJCQllcnIgPSAwOworCQl9IGVsc2UKKwkJCW1vZHVsZV9wdXQoY3AtPm93bmVyKTsKKworCX0gZWxzZSB7CisJCXN0YXRlID0gY3AtPmRlY29tcF9hbGxvYyhjY3Bfb3B0aW9uLCBkYXRhLmxlbmd0aCk7CisJCWlmIChzdGF0ZSAhPSAwKSB7CisJCQlwcHBfcmVjdl9sb2NrKHBwcCk7CisJCQlwcHAtPnJzdGF0ZSAmPSB+U0NfREVDT01QX1JVTjsKKwkJCW9jb21wID0gcHBwLT5yY29tcDsKKwkJCW9zdGF0ZSA9IHBwcC0+cmNfc3RhdGU7CisJCQlwcHAtPnJjb21wID0gY3A7CisJCQlwcHAtPnJjX3N0YXRlID0gc3RhdGU7CisJCQlwcHBfcmVjdl91bmxvY2socHBwKTsKKwkJCWlmIChvc3RhdGUgIT0gMCkgeworCQkJCW9jb21wLT5kZWNvbXBfZnJlZShvc3RhdGUpOworCQkJCW1vZHVsZV9wdXQob2NvbXAtPm93bmVyKTsKKwkJCX0KKwkJCWVyciA9IDA7CisJCX0gZWxzZQorCQkJbW9kdWxlX3B1dChjcC0+b3duZXIpOworCX0KKworIG91dDoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogTG9vayBhdCBhIENDUCBwYWNrZXQgYW5kIHVwZGF0ZSBvdXIgc3RhdGUgYWNjb3JkaW5nbHkuCisgKiBXZSBhc3N1bWUgdGhlIGNhbGxlciBoYXMgdGhlIHhtaXQgb3IgcmVjdiBwYXRoIGxvY2tlZC4KKyAqLworc3RhdGljIHZvaWQKK3BwcF9jY3BfcGVlayhzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IsIGludCBpbmJvdW5kKQoreworCXVuc2lnbmVkIGNoYXIgKmRwOworCWludCBsZW47CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBDQ1BfSERSTEVOICsgMikpCisJCXJldHVybjsJLyogbm8gaGVhZGVyICovCisJZHAgPSBza2ItPmRhdGEgKyAyOworCisJc3dpdGNoIChDQ1BfQ09ERShkcCkpIHsKKwljYXNlIENDUF9DT05GUkVROgorCisJCS8qIEEgQ29uZlJlcSBzdGFydHMgbmVnb3RpYXRpb24gb2YgY29tcHJlc3Npb24gCisJCSAqIGluIG9uZSBkaXJlY3Rpb24gb2YgdHJhbnNtaXNzaW9uLAorCQkgKiBhbmQgaGVuY2UgYnJpbmdzIGl0IGRvd24uLi5idXQgd2hpY2ggd2F5PworCQkgKgorCQkgKiBSZW1lbWJlcjoKKwkJICogQSBDb25mUmVxIGluZGljYXRlcyB3aGF0IHRoZSBzZW5kZXIgd291bGQgbGlrZSB0byByZWNlaXZlCisJCSAqLworCQlpZihpbmJvdW5kKQorCQkJLyogSGUgaXMgcHJvcG9zaW5nIHdoYXQgSSBzaG91bGQgc2VuZCAqLworCQkJcHBwLT54c3RhdGUgJj0gflNDX0NPTVBfUlVOOworCQllbHNlCQorCQkJLyogSSBhbSBwcm9wb3NpbmcgdG8gd2hhdCBoZSBzaG91bGQgc2VuZCAqLworCQkJcHBwLT5yc3RhdGUgJj0gflNDX0RFQ09NUF9SVU47CisJCQorCQlicmVhazsKKwkJCisJY2FzZSBDQ1BfVEVSTVJFUToKKwljYXNlIENDUF9URVJNQUNLOgorCQkvKgorCQkgKiBDQ1AgaXMgZ29pbmcgZG93biwgYm90aCBkaXJlY3Rpb25zIG9mIHRyYW5zbWlzc2lvbiAKKwkJICovCisJCXBwcC0+cnN0YXRlICY9IH5TQ19ERUNPTVBfUlVOOworCQlwcHAtPnhzdGF0ZSAmPSB+U0NfQ09NUF9SVU47CisJCWJyZWFrOworCisJY2FzZSBDQ1BfQ09ORkFDSzoKKwkJaWYgKChwcHAtPmZsYWdzICYgKFNDX0NDUF9PUEVOIHwgU0NfQ0NQX1VQKSkgIT0gU0NfQ0NQX09QRU4pCisJCQlicmVhazsKKwkJbGVuID0gQ0NQX0xFTkdUSChkcCk7CisJCWlmICghcHNrYl9tYXlfcHVsbChza2IsIGxlbiArIDIpKQorCQkJcmV0dXJuOwkJLyogdG9vIHNob3J0ICovCisJCWRwICs9IENDUF9IRFJMRU47CisJCWxlbiAtPSBDQ1BfSERSTEVOOworCQlpZiAobGVuIDwgQ0NQX09QVF9NSU5MRU4gfHwgbGVuIDwgQ0NQX09QVF9MRU5HVEgoZHApKQorCQkJYnJlYWs7CisJCWlmIChpbmJvdW5kKSB7CisJCQkvKiB3ZSB3aWxsIHN0YXJ0IHJlY2VpdmluZyBjb21wcmVzc2VkIHBhY2tldHMgKi8KKwkJCWlmIChwcHAtPnJjX3N0YXRlID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAocHBwLT5yY29tcC0+ZGVjb21wX2luaXQocHBwLT5yY19zdGF0ZSwgZHAsIGxlbiwKKwkJCQkJcHBwLT5maWxlLmluZGV4LCAwLCBwcHAtPm1ydSwgcHBwLT5kZWJ1ZykpIHsKKwkJCQlwcHAtPnJzdGF0ZSB8PSBTQ19ERUNPTVBfUlVOOworCQkJCXBwcC0+cnN0YXRlICY9IH4oU0NfRENfRVJST1IgfCBTQ19EQ19GRVJST1IpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogd2Ugd2lsbCBzb29uIHN0YXJ0IHNlbmRpbmcgY29tcHJlc3NlZCBwYWNrZXRzICovCisJCQlpZiAocHBwLT54Y19zdGF0ZSA9PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKHBwcC0+eGNvbXAtPmNvbXBfaW5pdChwcHAtPnhjX3N0YXRlLCBkcCwgbGVuLAorCQkJCQlwcHAtPmZpbGUuaW5kZXgsIDAsIHBwcC0+ZGVidWcpKQorCQkJCXBwcC0+eHN0YXRlIHw9IFNDX0NPTVBfUlVOOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDQ1BfUkVTRVRBQ0s6CisJCS8qIHJlc2V0IHRoZSBbZGVdY29tcHJlc3NvciAqLworCQlpZiAoKHBwcC0+ZmxhZ3MgJiBTQ19DQ1BfVVApID09IDApCisJCQlicmVhazsKKwkJaWYgKGluYm91bmQpIHsKKwkJCWlmIChwcHAtPnJjX3N0YXRlICYmIChwcHAtPnJzdGF0ZSAmIFNDX0RFQ09NUF9SVU4pKSB7CisJCQkJcHBwLT5yY29tcC0+ZGVjb21wX3Jlc2V0KHBwcC0+cmNfc3RhdGUpOworCQkJCXBwcC0+cnN0YXRlICY9IH5TQ19EQ19FUlJPUjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChwcHAtPnhjX3N0YXRlICYmIChwcHAtPnhzdGF0ZSAmIFNDX0NPTVBfUlVOKSkKKwkJCQlwcHAtPnhjb21wLT5jb21wX3Jlc2V0KHBwcC0+eGNfc3RhdGUpOworCQl9CisJCWJyZWFrOworCX0KK30KKworLyogRnJlZSB1cCBjb21wcmVzc2lvbiByZXNvdXJjZXMuICovCitzdGF0aWMgdm9pZAorcHBwX2NjcF9jbG9zZWQoc3RydWN0IHBwcCAqcHBwKQoreworCXZvaWQgKnhzdGF0ZSwgKnJzdGF0ZTsKKwlzdHJ1Y3QgY29tcHJlc3NvciAqeGNvbXAsICpyY29tcDsKKworCXBwcF9sb2NrKHBwcCk7CisJcHBwLT5mbGFncyAmPSB+KFNDX0NDUF9PUEVOIHwgU0NfQ0NQX1VQKTsKKwlwcHAtPnhzdGF0ZSA9IDA7CisJeGNvbXAgPSBwcHAtPnhjb21wOworCXhzdGF0ZSA9IHBwcC0+eGNfc3RhdGU7CisJcHBwLT54Y19zdGF0ZSA9IE5VTEw7CisJcHBwLT5yc3RhdGUgPSAwOworCXJjb21wID0gcHBwLT5yY29tcDsKKwlyc3RhdGUgPSBwcHAtPnJjX3N0YXRlOworCXBwcC0+cmNfc3RhdGUgPSBOVUxMOworCXBwcF91bmxvY2socHBwKTsKKworCWlmICh4c3RhdGUpIHsKKwkJeGNvbXAtPmNvbXBfZnJlZSh4c3RhdGUpOworCQltb2R1bGVfcHV0KHhjb21wLT5vd25lcik7CisJfQorCWlmIChyc3RhdGUpIHsKKwkJcmNvbXAtPmRlY29tcF9mcmVlKHJzdGF0ZSk7CisJCW1vZHVsZV9wdXQocmNvbXAtPm93bmVyKTsKKwl9Cit9CisKKy8qIExpc3Qgb2YgY29tcHJlc3NvcnMuICovCitzdGF0aWMgTElTVF9IRUFEKGNvbXByZXNzb3JfbGlzdCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNvbXByZXNzb3JfbGlzdF9sb2NrKTsKKworc3RydWN0IGNvbXByZXNzb3JfZW50cnkgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgY29tcHJlc3NvciAqY29tcDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY29tcHJlc3Nvcl9lbnRyeSAqCitmaW5kX2NvbXBfZW50cnkoaW50IHByb3RvKQoreworCXN0cnVjdCBjb21wcmVzc29yX2VudHJ5ICpjZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0ID0gJmNvbXByZXNzb3JfbGlzdDsKKworCXdoaWxlICgobGlzdCA9IGxpc3QtPm5leHQpICE9ICZjb21wcmVzc29yX2xpc3QpIHsKKwkJY2UgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjb21wcmVzc29yX2VudHJ5LCBsaXN0KTsKKwkJaWYgKGNlLT5jb21wLT5jb21wcmVzc19wcm90byA9PSBwcm90bykKKwkJCXJldHVybiBjZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFJlZ2lzdGVyIGEgY29tcHJlc3NvciAqLworaW50CitwcHBfcmVnaXN0ZXJfY29tcHJlc3NvcihzdHJ1Y3QgY29tcHJlc3NvciAqY3ApCit7CisJc3RydWN0IGNvbXByZXNzb3JfZW50cnkgKmNlOworCWludCByZXQ7CisJc3Bpbl9sb2NrKCZjb21wcmVzc29yX2xpc3RfbG9jayk7CisJcmV0ID0gLUVFWElTVDsKKwlpZiAoZmluZF9jb21wX2VudHJ5KGNwLT5jb21wcmVzc19wcm90bykgIT0gMCkKKwkJZ290byBvdXQ7CisJcmV0ID0gLUVOT01FTTsKKwljZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21wcmVzc29yX2VudHJ5KSwgR0ZQX0FUT01JQyk7CisJaWYgKGNlID09IDApCisJCWdvdG8gb3V0OworCXJldCA9IDA7CisJY2UtPmNvbXAgPSBjcDsKKwlsaXN0X2FkZCgmY2UtPmxpc3QsICZjb21wcmVzc29yX2xpc3QpOworIG91dDoKKwlzcGluX3VubG9jaygmY29tcHJlc3Nvcl9saXN0X2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qIFVucmVnaXN0ZXIgYSBjb21wcmVzc29yICovCit2b2lkCitwcHBfdW5yZWdpc3Rlcl9jb21wcmVzc29yKHN0cnVjdCBjb21wcmVzc29yICpjcCkKK3sKKwlzdHJ1Y3QgY29tcHJlc3Nvcl9lbnRyeSAqY2U7CisKKwlzcGluX2xvY2soJmNvbXByZXNzb3JfbGlzdF9sb2NrKTsKKwljZSA9IGZpbmRfY29tcF9lbnRyeShjcC0+Y29tcHJlc3NfcHJvdG8pOworCWlmIChjZSAhPSAwICYmIGNlLT5jb21wID09IGNwKSB7CisJCWxpc3RfZGVsKCZjZS0+bGlzdCk7CisJCWtmcmVlKGNlKTsKKwl9CisJc3Bpbl91bmxvY2soJmNvbXByZXNzb3JfbGlzdF9sb2NrKTsKK30KKworLyogRmluZCBhIGNvbXByZXNzb3IuICovCitzdGF0aWMgc3RydWN0IGNvbXByZXNzb3IgKgorZmluZF9jb21wcmVzc29yKGludCB0eXBlKQoreworCXN0cnVjdCBjb21wcmVzc29yX2VudHJ5ICpjZTsKKwlzdHJ1Y3QgY29tcHJlc3NvciAqY3AgPSBOVUxMOworCisJc3Bpbl9sb2NrKCZjb21wcmVzc29yX2xpc3RfbG9jayk7CisJY2UgPSBmaW5kX2NvbXBfZW50cnkodHlwZSk7CisJaWYgKGNlICE9IDApIHsKKwkJY3AgPSBjZS0+Y29tcDsKKwkJaWYgKCF0cnlfbW9kdWxlX2dldChjcC0+b3duZXIpKQorCQkJY3AgPSBOVUxMOworCX0KKwlzcGluX3VubG9jaygmY29tcHJlc3Nvcl9saXN0X2xvY2spOworCXJldHVybiBjcDsKK30KKworLyoKKyAqIE1pc2NlbGxlbmVvdXMgc3R1ZmYuCisgKi8KKworc3RhdGljIHZvaWQKK3BwcF9nZXRfc3RhdHMoc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3QgcHBwX3N0YXRzICpzdCkKK3sKKwlzdHJ1Y3Qgc2xjb21wcmVzcyAqdmogPSBwcHAtPnZqOworCisJbWVtc2V0KHN0LCAwLCBzaXplb2YoKnN0KSk7CisJc3QtPnAucHBwX2lwYWNrZXRzID0gcHBwLT5zdGF0cy5yeF9wYWNrZXRzOworCXN0LT5wLnBwcF9pZXJyb3JzID0gcHBwLT5zdGF0cy5yeF9lcnJvcnM7CisJc3QtPnAucHBwX2lieXRlcyA9IHBwcC0+c3RhdHMucnhfYnl0ZXM7CisJc3QtPnAucHBwX29wYWNrZXRzID0gcHBwLT5zdGF0cy50eF9wYWNrZXRzOworCXN0LT5wLnBwcF9vZXJyb3JzID0gcHBwLT5zdGF0cy50eF9lcnJvcnM7CisJc3QtPnAucHBwX29ieXRlcyA9IHBwcC0+c3RhdHMudHhfYnl0ZXM7CisJaWYgKHZqID09IDApCisJCXJldHVybjsKKwlzdC0+dmoudmpzX3BhY2tldHMgPSB2ai0+c2xzX29fY29tcHJlc3NlZCArIHZqLT5zbHNfb191bmNvbXByZXNzZWQ7CisJc3QtPnZqLnZqc19jb21wcmVzc2VkID0gdmotPnNsc19vX2NvbXByZXNzZWQ7CisJc3QtPnZqLnZqc19zZWFyY2hlcyA9IHZqLT5zbHNfb19zZWFyY2hlczsKKwlzdC0+dmoudmpzX21pc3NlcyA9IHZqLT5zbHNfb19taXNzZXM7CisJc3QtPnZqLnZqc19lcnJvcmluID0gdmotPnNsc19pX2Vycm9yOworCXN0LT52ai52anNfdG9zc2VkID0gdmotPnNsc19pX3Rvc3NlZDsKKwlzdC0+dmoudmpzX3VuY29tcHJlc3NlZGluID0gdmotPnNsc19pX3VuY29tcHJlc3NlZDsKKwlzdC0+dmoudmpzX2NvbXByZXNzZWRpbiA9IHZqLT5zbHNfaV9jb21wcmVzc2VkOworfQorCisvKgorICogU3R1ZmYgZm9yIGhhbmRsaW5nIHRoZSBsaXN0cyBvZiBwcHAgdW5pdHMgYW5kIGNoYW5uZWxzCisgKiBhbmQgZm9yIGluaXRpYWxpemF0aW9uLgorICovCisKKy8qCisgKiBDcmVhdGUgYSBuZXcgcHBwIGludGVyZmFjZSB1bml0LiAgRmFpbHMgaWYgaXQgY2FuJ3QgYWxsb2NhdGUgbWVtb3J5CisgKiBvciBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgdW5pdCB3aXRoIHRoZSByZXF1ZXN0ZWQgbnVtYmVyLgorICogdW5pdCA9PSAtMSBtZWFucyBhbGxvY2F0ZSBhIG5ldyBudW1iZXIuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcHBwICoKK3BwcF9jcmVhdGVfaW50ZXJmYWNlKGludCB1bml0LCBpbnQgKnJldHApCit7CisJc3RydWN0IHBwcCAqcHBwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCWludCByZXQgPSAtRU5PTUVNOworCWludCBpOworCisJcHBwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBwcCksIEdGUF9LRVJORUwpOworCWlmICghcHBwKQorCQlnb3RvIG91dDsKKwlkZXYgPSBhbGxvY19uZXRkZXYoMCwgIiIsIHBwcF9zZXR1cCk7CisJaWYgKCFkZXYpCisJCWdvdG8gb3V0MTsKKwltZW1zZXQocHBwLCAwLCBzaXplb2Yoc3RydWN0IHBwcCkpOworCisJcHBwLT5tcnUgPSBQUFBfTVJVOworCWluaXRfcHBwX2ZpbGUoJnBwcC0+ZmlsZSwgSU5URVJGQUNFKTsKKwlwcHAtPmZpbGUuaGRybGVuID0gUFBQX0hEUkxFTiAtIDI7CS8qIGRvbid0IGNvdW50IHByb3RvIGJ5dGVzICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9OUDsgKytpKQorCQlwcHAtPm5wbW9kZVtpXSA9IE5QTU9ERV9QQVNTOworCUlOSVRfTElTVF9IRUFEKCZwcHAtPmNoYW5uZWxzKTsKKwlzcGluX2xvY2tfaW5pdCgmcHBwLT5ybG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnBwcC0+d2xvY2spOworI2lmZGVmIENPTkZJR19QUFBfTVVMVElMSU5LCisJcHBwLT5taW5zZXEgPSAtMTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZwcHAtPm1ycSk7CisjZW5kaWYgLyogQ09ORklHX1BQUF9NVUxUSUxJTksgKi8KKwlwcHAtPmRldiA9IGRldjsKKwlkZXYtPnByaXYgPSBwcHA7CisKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHBwcF9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gcHBwX25ldF9zdGF0czsKKwlkZXYtPmRvX2lvY3RsID0gcHBwX25ldF9pb2N0bDsKKworCXJldCA9IC1FRVhJU1Q7CisJZG93bigmYWxsX3BwcF9zZW0pOworCWlmICh1bml0IDwgMCkKKwkJdW5pdCA9IGNhcmRtYXBfZmluZF9maXJzdF9mcmVlKGFsbF9wcHBfdW5pdHMpOworCWVsc2UgaWYgKGNhcmRtYXBfZ2V0KGFsbF9wcHBfdW5pdHMsIHVuaXQpICE9IE5VTEwpCisJCWdvdG8gb3V0MjsJLyogdW5pdCBhbHJlYWR5IGV4aXN0cyAqLworCisJLyogSW5pdGlhbGl6ZSB0aGUgbmV3IHBwcCB1bml0ICovCisJcHBwLT5maWxlLmluZGV4ID0gdW5pdDsKKwlzcHJpbnRmKGRldi0+bmFtZSwgInBwcCVkIiwgdW5pdCk7CisKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJQUFA6IGNvdWxkbid0IHJlZ2lzdGVyIGRldmljZSAlcyAoJWQpXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCByZXQpOworCQlnb3RvIG91dDI7CisJfQorCisJYXRvbWljX2luYygmcHBwX3VuaXRfY291bnQpOworCWNhcmRtYXBfc2V0KCZhbGxfcHBwX3VuaXRzLCB1bml0LCBwcHApOworCXVwKCZhbGxfcHBwX3NlbSk7CisJKnJldHAgPSAwOworCXJldHVybiBwcHA7CisKK291dDI6CisJdXAoJmFsbF9wcHBfc2VtKTsKKwlmcmVlX25ldGRldihkZXYpOworb3V0MToKKwlrZnJlZShwcHApOworb3V0OgorCSpyZXRwID0gcmV0OworCXJldHVybiBOVUxMOworfQorCisvKgorICogSW5pdGlhbGl6ZSBhIHBwcF9maWxlIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQKK2luaXRfcHBwX2ZpbGUoc3RydWN0IHBwcF9maWxlICpwZiwgaW50IGtpbmQpCit7CisJcGYtPmtpbmQgPSBraW5kOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnBmLT54cSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcGYtPnJxKTsKKwlhdG9taWNfc2V0KCZwZi0+cmVmY250LCAxKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwZi0+cndhaXQpOworfQorCisvKgorICogVGFrZSBkb3duIGEgcHBwIGludGVyZmFjZSB1bml0IC0gY2FsbGVkIHdoZW4gdGhlIG93bmluZyBmaWxlCisgKiAodGhlIG9uZSB0aGF0IGNyZWF0ZWQgdGhlIHVuaXQpIGlzIGNsb3NlZCBvciBkZXRhY2hlZC4KKyAqLworc3RhdGljIHZvaWQgcHBwX3NodXRkb3duX2ludGVyZmFjZShzdHJ1Y3QgcHBwICpwcHApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCWRvd24oJmFsbF9wcHBfc2VtKTsKKwlwcHBfbG9jayhwcHApOworCWRldiA9IHBwcC0+ZGV2OworCXBwcC0+ZGV2ID0gTlVMTDsKKwlwcHBfdW5sb2NrKHBwcCk7CisJLyogVGhpcyB3aWxsIGNhbGwgZGV2X2Nsb3NlKCkgZm9yIHVzLiAqLworCWlmIChkZXYpIHsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwl9CisJY2FyZG1hcF9zZXQoJmFsbF9wcHBfdW5pdHMsIHBwcC0+ZmlsZS5pbmRleCwgTlVMTCk7CisJcHBwLT5maWxlLmRlYWQgPSAxOworCXBwcC0+b3duZXIgPSBOVUxMOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHBwLT5maWxlLnJ3YWl0KTsKKwl1cCgmYWxsX3BwcF9zZW0pOworfQorCisvKgorICogRnJlZSB0aGUgbWVtb3J5IHVzZWQgYnkgYSBwcHAgdW5pdC4gIFRoaXMgaXMgb25seSBjYWxsZWQgb25jZQorICogdGhlcmUgYXJlIG5vIGNoYW5uZWxzIGNvbm5lY3RlZCB0byB0aGUgdW5pdCBhbmQgbm8gZmlsZSBzdHJ1Y3RzCisgKiB0aGF0IHJlZmVyZW5jZSB0aGUgdW5pdC4KKyAqLworc3RhdGljIHZvaWQgcHBwX2Rlc3Ryb3lfaW50ZXJmYWNlKHN0cnVjdCBwcHAgKnBwcCkKK3sKKwlhdG9taWNfZGVjKCZwcHBfdW5pdF9jb3VudCk7CisKKwlpZiAoIXBwcC0+ZmlsZS5kZWFkIHx8IHBwcC0+bl9jaGFubmVscykgeworCQkvKiAiY2FuJ3QgaGFwcGVuIiAqLworCQlwcmludGsoS0VSTl9FUlIgInBwcDogZGVzdHJveWluZyBwcHAgc3RydWN0ICVwIGJ1dCBkZWFkPSVkICIKKwkJICAgICAgICJuX2NoYW5uZWxzPSVkICFcbiIsIHBwcCwgcHBwLT5maWxlLmRlYWQsCisJCSAgICAgICBwcHAtPm5fY2hhbm5lbHMpOworCQlyZXR1cm47CisJfQorCisJcHBwX2NjcF9jbG9zZWQocHBwKTsKKwlpZiAocHBwLT52aikgeworCQlzbGhjX2ZyZWUocHBwLT52aik7CisJCXBwcC0+dmogPSBOVUxMOworCX0KKwlza2JfcXVldWVfcHVyZ2UoJnBwcC0+ZmlsZS54cSk7CisJc2tiX3F1ZXVlX3B1cmdlKCZwcHAtPmZpbGUucnEpOworI2lmZGVmIENPTkZJR19QUFBfTVVMVElMSU5LCisJc2tiX3F1ZXVlX3B1cmdlKCZwcHAtPm1ycSk7CisjZW5kaWYgLyogQ09ORklHX1BQUF9NVUxUSUxJTksgKi8KKyNpZmRlZiBDT05GSUdfUFBQX0ZJTFRFUgorCWlmIChwcHAtPnBhc3NfZmlsdGVyKSB7CisJCWtmcmVlKHBwcC0+cGFzc19maWx0ZXIpOworCQlwcHAtPnBhc3NfZmlsdGVyID0gTlVMTDsKKwl9CisJaWYgKHBwcC0+YWN0aXZlX2ZpbHRlcikgeworCQlrZnJlZShwcHAtPmFjdGl2ZV9maWx0ZXIpOworCQlwcHAtPmFjdGl2ZV9maWx0ZXIgPSBOVUxMOworCX0KKyNlbmRpZiAvKiBDT05GSUdfUFBQX0ZJTFRFUiAqLworCisJa2ZyZWUocHBwKTsKK30KKworLyoKKyAqIExvY2F0ZSBhbiBleGlzdGluZyBwcHAgdW5pdC4KKyAqIFRoZSBjYWxsZXIgc2hvdWxkIGhhdmUgbG9ja2VkIHRoZSBhbGxfcHBwX3NlbS4KKyAqLworc3RhdGljIHN0cnVjdCBwcHAgKgorcHBwX2ZpbmRfdW5pdChpbnQgdW5pdCkKK3sKKwlyZXR1cm4gY2FyZG1hcF9nZXQoYWxsX3BwcF91bml0cywgdW5pdCk7Cit9CisKKy8qCisgKiBMb2NhdGUgYW4gZXhpc3RpbmcgcHBwIGNoYW5uZWwuCisgKiBUaGUgY2FsbGVyIHNob3VsZCBoYXZlIGxvY2tlZCB0aGUgYWxsX2NoYW5uZWxzX2xvY2suCisgKiBGaXJzdCB3ZSBsb29rIGluIHRoZSBuZXdfY2hhbm5lbHMgbGlzdCwgdGhlbiBpbiB0aGUKKyAqIGFsbF9jaGFubmVscyBsaXN0LiAgSWYgZm91bmQgaW4gdGhlIG5ld19jaGFubmVscyBsaXN0LAorICogd2UgbW92ZSBpdCB0byB0aGUgYWxsX2NoYW5uZWxzIGxpc3QuICBUaGlzIGlzIGZvciBzcGVlZAorICogd2hlbiB3ZSBoYXZlIGEgbG90IG9mIGNoYW5uZWxzIGluIHVzZS4KKyAqLworc3RhdGljIHN0cnVjdCBjaGFubmVsICoKK3BwcF9maW5kX2NoYW5uZWwoaW50IHVuaXQpCit7CisJc3RydWN0IGNoYW5uZWwgKnBjaDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCisJbGlzdCA9ICZuZXdfY2hhbm5lbHM7CisJd2hpbGUgKChsaXN0ID0gbGlzdC0+bmV4dCkgIT0gJm5ld19jaGFubmVscykgeworCQlwY2ggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjaGFubmVsLCBsaXN0KTsKKwkJaWYgKHBjaC0+ZmlsZS5pbmRleCA9PSB1bml0KSB7CisJCQlsaXN0X2RlbCgmcGNoLT5saXN0KTsKKwkJCWxpc3RfYWRkKCZwY2gtPmxpc3QsICZhbGxfY2hhbm5lbHMpOworCQkJcmV0dXJuIHBjaDsKKwkJfQorCX0KKwlsaXN0ID0gJmFsbF9jaGFubmVsczsKKwl3aGlsZSAoKGxpc3QgPSBsaXN0LT5uZXh0KSAhPSAmYWxsX2NoYW5uZWxzKSB7CisJCXBjaCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGNoYW5uZWwsIGxpc3QpOworCQlpZiAocGNoLT5maWxlLmluZGV4ID09IHVuaXQpCisJCQlyZXR1cm4gcGNoOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIENvbm5lY3QgYSBQUFAgY2hhbm5lbCB0byBhIFBQUCBpbnRlcmZhY2UgdW5pdC4KKyAqLworc3RhdGljIGludAorcHBwX2Nvbm5lY3RfY2hhbm5lbChzdHJ1Y3QgY2hhbm5lbCAqcGNoLCBpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgcHBwICpwcHA7CisJaW50IHJldCA9IC1FTlhJTzsKKwlpbnQgaGRybGVuOworCisJZG93bigmYWxsX3BwcF9zZW0pOworCXBwcCA9IHBwcF9maW5kX3VuaXQodW5pdCk7CisJaWYgKHBwcCA9PSAwKQorCQlnb3RvIG91dDsKKwl3cml0ZV9sb2NrX2JoKCZwY2gtPnVwbCk7CisJcmV0ID0gLUVJTlZBTDsKKwlpZiAocGNoLT5wcHAgIT0gMCkKKwkJZ290byBvdXRsOworCisJcHBwX2xvY2socHBwKTsKKwlpZiAocGNoLT5maWxlLmhkcmxlbiA+IHBwcC0+ZmlsZS5oZHJsZW4pCisJCXBwcC0+ZmlsZS5oZHJsZW4gPSBwY2gtPmZpbGUuaGRybGVuOworCWhkcmxlbiA9IHBjaC0+ZmlsZS5oZHJsZW4gKyAyOwkvKiBmb3IgcHJvdG9jb2wgYnl0ZXMgKi8KKwlpZiAocHBwLT5kZXYgJiYgaGRybGVuID4gcHBwLT5kZXYtPmhhcmRfaGVhZGVyX2xlbikKKwkJcHBwLT5kZXYtPmhhcmRfaGVhZGVyX2xlbiA9IGhkcmxlbjsKKwlsaXN0X2FkZF90YWlsKCZwY2gtPmNsaXN0LCAmcHBwLT5jaGFubmVscyk7CisJKytwcHAtPm5fY2hhbm5lbHM7CisJcGNoLT5wcHAgPSBwcHA7CisJYXRvbWljX2luYygmcHBwLT5maWxlLnJlZmNudCk7CisJcHBwX3VubG9jayhwcHApOworCXJldCA9IDA7CisKKyBvdXRsOgorCXdyaXRlX3VubG9ja19iaCgmcGNoLT51cGwpOworIG91dDoKKwl1cCgmYWxsX3BwcF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBEaXNjb25uZWN0IGEgY2hhbm5lbCBmcm9tIGl0cyBwcHAgdW5pdC4KKyAqLworc3RhdGljIGludAorcHBwX2Rpc2Nvbm5lY3RfY2hhbm5lbChzdHJ1Y3QgY2hhbm5lbCAqcGNoKQoreworCXN0cnVjdCBwcHAgKnBwcDsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCXdyaXRlX2xvY2tfYmgoJnBjaC0+dXBsKTsKKwlwcHAgPSBwY2gtPnBwcDsKKwlwY2gtPnBwcCA9IE5VTEw7CisJd3JpdGVfdW5sb2NrX2JoKCZwY2gtPnVwbCk7CisJaWYgKHBwcCAhPSAwKSB7CisJCS8qIHJlbW92ZSBpdCBmcm9tIHRoZSBwcHAgdW5pdCdzIGxpc3QgKi8KKwkJcHBwX2xvY2socHBwKTsKKwkJbGlzdF9kZWwoJnBjaC0+Y2xpc3QpOworCQlpZiAoLS1wcHAtPm5fY2hhbm5lbHMgPT0gMCkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHBwLT5maWxlLnJ3YWl0KTsKKwkJcHBwX3VubG9jayhwcHApOworCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcHBwLT5maWxlLnJlZmNudCkpCisJCQlwcHBfZGVzdHJveV9pbnRlcmZhY2UocHBwKTsKKwkJZXJyID0gMDsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIEZyZWUgdXAgdGhlIHJlc291cmNlcyB1c2VkIGJ5IGEgcHBwIGNoYW5uZWwuCisgKi8KK3N0YXRpYyB2b2lkIHBwcF9kZXN0cm95X2NoYW5uZWwoc3RydWN0IGNoYW5uZWwgKnBjaCkKK3sKKwlhdG9taWNfZGVjKCZjaGFubmVsX2NvdW50KTsKKworCWlmICghcGNoLT5maWxlLmRlYWQpIHsKKwkJLyogImNhbid0IGhhcHBlbiIgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJwcHA6IGRlc3Ryb3lpbmcgdW5kZWFkIGNoYW5uZWwgJXAgIVxuIiwKKwkJICAgICAgIHBjaCk7CisJCXJldHVybjsKKwl9CisJc2tiX3F1ZXVlX3B1cmdlKCZwY2gtPmZpbGUueHEpOworCXNrYl9xdWV1ZV9wdXJnZSgmcGNoLT5maWxlLnJxKTsKKwlrZnJlZShwY2gpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcHBwX2NsZWFudXAodm9pZCkKK3sKKwkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJaWYgKGF0b21pY19yZWFkKCZwcHBfdW5pdF9jb3VudCkgfHwgYXRvbWljX3JlYWQoJmNoYW5uZWxfY291bnQpKQorCQlwcmludGsoS0VSTl9FUlIgIlBQUDogcmVtb3ZpbmcgbW9kdWxlIGJ1dCB1bml0cyByZW1haW4hXG4iKTsKKwljYXJkbWFwX2Rlc3Ryb3koJmFsbF9wcHBfdW5pdHMpOworCWlmICh1bnJlZ2lzdGVyX2NocmRldihQUFBfTUFKT1IsICJwcHAiKSAhPSAwKQorCQlwcmludGsoS0VSTl9FUlIgIlBQUDogZmFpbGVkIHRvIHVucmVnaXN0ZXIgUFBQIGRldmljZVxuIik7CisJZGV2ZnNfcmVtb3ZlKCJwcHAiKTsKKwljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihQUFBfTUFKT1IsIDApKTsKKwljbGFzc19zaW1wbGVfZGVzdHJveShwcHBfY2xhc3MpOworfQorCisvKgorICogQ2FyZG1hcCBpbXBsZW1lbnRhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgKmNhcmRtYXBfZ2V0KHN0cnVjdCBjYXJkbWFwICptYXAsIHVuc2lnbmVkIGludCBucikKK3sKKwlzdHJ1Y3QgY2FyZG1hcCAqcDsKKwlpbnQgaTsKKworCWZvciAocCA9IG1hcDsgcCAhPSBOVUxMOyApIHsKKwkJaWYgKChpID0gbnIgPj4gcC0+c2hpZnQpID49IENBUkRNQVBfV0lEVEgpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKHAtPnNoaWZ0ID09IDApCisJCQlyZXR1cm4gcC0+cHRyW2ldOworCQluciAmPSB+KENBUkRNQVBfTUFTSyA8PCBwLT5zaGlmdCk7CisJCXAgPSBwLT5wdHJbaV07CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBjYXJkbWFwX3NldChzdHJ1Y3QgY2FyZG1hcCAqKnBtYXAsIHVuc2lnbmVkIGludCBuciwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBjYXJkbWFwICpwOworCWludCBpOworCisJcCA9ICpwbWFwOworCWlmIChwID09IE5VTEwgfHwgKG5yID4+IHAtPnNoaWZ0KSA+PSBDQVJETUFQX1dJRFRIKSB7CisJCWRvIHsKKwkJCS8qIG5lZWQgYSBuZXcgdG9wIGxldmVsICovCisJCQlzdHJ1Y3QgY2FyZG1hcCAqbnAgPSBrbWFsbG9jKHNpemVvZigqbnApLCBHRlBfS0VSTkVMKTsKKwkJCW1lbXNldChucCwgMCwgc2l6ZW9mKCpucCkpOworCQkJbnAtPnB0clswXSA9IHA7CisJCQlpZiAocCAhPSBOVUxMKSB7CisJCQkJbnAtPnNoaWZ0ID0gcC0+c2hpZnQgKyBDQVJETUFQX09SREVSOworCQkJCXAtPnBhcmVudCA9IG5wOworCQkJfSBlbHNlCisJCQkJbnAtPnNoaWZ0ID0gMDsKKwkJCXAgPSBucDsKKwkJfSB3aGlsZSAoKG5yID4+IHAtPnNoaWZ0KSA+PSBDQVJETUFQX1dJRFRIKTsKKwkJKnBtYXAgPSBwOworCX0KKwl3aGlsZSAocC0+c2hpZnQgPiAwKSB7CisJCWkgPSAobnIgPj4gcC0+c2hpZnQpICYgQ0FSRE1BUF9NQVNLOworCQlpZiAocC0+cHRyW2ldID09IE5VTEwpIHsKKwkJCXN0cnVjdCBjYXJkbWFwICpucCA9IGttYWxsb2Moc2l6ZW9mKCpucCksIEdGUF9LRVJORUwpOworCQkJbWVtc2V0KG5wLCAwLCBzaXplb2YoKm5wKSk7CisJCQlucC0+c2hpZnQgPSBwLT5zaGlmdCAtIENBUkRNQVBfT1JERVI7CisJCQlucC0+cGFyZW50ID0gcDsKKwkJCXAtPnB0cltpXSA9IG5wOworCQl9CisJCWlmIChwdHIgPT0gTlVMTCkKKwkJCWNsZWFyX2JpdChpLCAmcC0+aW51c2UpOworCQlwID0gcC0+cHRyW2ldOworCX0KKwlpID0gbnIgJiBDQVJETUFQX01BU0s7CisJcC0+cHRyW2ldID0gcHRyOworCWlmIChwdHIgIT0gTlVMTCkKKwkJc2V0X2JpdChpLCAmcC0+aW51c2UpOworCWVsc2UKKwkJY2xlYXJfYml0KGksICZwLT5pbnVzZSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2FyZG1hcF9maW5kX2ZpcnN0X2ZyZWUoc3RydWN0IGNhcmRtYXAgKm1hcCkKK3sKKwlzdHJ1Y3QgY2FyZG1hcCAqcDsKKwl1bnNpZ25lZCBpbnQgbnIgPSAwOworCWludCBpOworCisJaWYgKChwID0gbWFwKSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlmb3IgKDs7KSB7CisJCWkgPSBmaW5kX2ZpcnN0X3plcm9fYml0KCZwLT5pbnVzZSwgQ0FSRE1BUF9XSURUSCk7CisJCWlmIChpID49IENBUkRNQVBfV0lEVEgpIHsKKwkJCWlmIChwLT5wYXJlbnQgPT0gTlVMTCkKKwkJCQlyZXR1cm4gQ0FSRE1BUF9XSURUSCA8PCBwLT5zaGlmdDsKKwkJCXAgPSBwLT5wYXJlbnQ7CisJCQlpID0gKG5yID4+IHAtPnNoaWZ0KSAmIENBUkRNQVBfTUFTSzsKKwkJCXNldF9iaXQoaSwgJnAtPmludXNlKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW5yID0gKG5yICYgKH5DQVJETUFQX01BU0sgPDwgcC0+c2hpZnQpKSB8IChpIDw8IHAtPnNoaWZ0KTsKKwkJaWYgKHAtPnNoaWZ0ID09IDAgfHwgcC0+cHRyW2ldID09IE5VTEwpCisJCQlyZXR1cm4gbnI7CisJCXAgPSBwLT5wdHJbaV07CisJfQorfQorCitzdGF0aWMgdm9pZCBjYXJkbWFwX2Rlc3Ryb3koc3RydWN0IGNhcmRtYXAgKipwbWFwKQoreworCXN0cnVjdCBjYXJkbWFwICpwLCAqbnA7CisJaW50IGk7CisKKwlmb3IgKHAgPSAqcG1hcDsgcCAhPSBOVUxMOyBwID0gbnApIHsKKwkJaWYgKHAtPnNoaWZ0ICE9IDApIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBDQVJETUFQX1dJRFRIOyArK2kpCisJCQkJaWYgKHAtPnB0cltpXSAhPSBOVUxMKQorCQkJCQlicmVhazsKKwkJCWlmIChpIDwgQ0FSRE1BUF9XSURUSCkgeworCQkJCW5wID0gcC0+cHRyW2ldOworCQkJCXAtPnB0cltpXSA9IE5VTEw7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJbnAgPSBwLT5wYXJlbnQ7CisJCWtmcmVlKHApOworCX0KKwkqcG1hcCA9IE5VTEw7Cit9CisKKy8qIE1vZHVsZS9pbml0aWFsaXphdGlvbiBzdHVmZiAqLworCittb2R1bGVfaW5pdChwcHBfaW5pdCk7Cittb2R1bGVfZXhpdChwcHBfY2xlYW51cCk7CisKK0VYUE9SVF9TWU1CT0wocHBwX3JlZ2lzdGVyX2NoYW5uZWwpOworRVhQT1JUX1NZTUJPTChwcHBfdW5yZWdpc3Rlcl9jaGFubmVsKTsKK0VYUE9SVF9TWU1CT0wocHBwX2NoYW5uZWxfaW5kZXgpOworRVhQT1JUX1NZTUJPTChwcHBfdW5pdF9udW1iZXIpOworRVhQT1JUX1NZTUJPTChwcHBfaW5wdXQpOworRVhQT1JUX1NZTUJPTChwcHBfaW5wdXRfZXJyb3IpOworRVhQT1JUX1NZTUJPTChwcHBfb3V0cHV0X3dha2V1cCk7CitFWFBPUlRfU1lNQk9MKHBwcF9yZWdpc3Rlcl9jb21wcmVzc29yKTsKK0VYUE9SVF9TWU1CT0wocHBwX3VucmVnaXN0ZXJfY29tcHJlc3Nvcik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfQ0hBUkRFVl9NQUpPUihQUFBfTUFKT1IpOworTU9EVUxFX0FMSUFTKCIvZGV2L3BwcCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwX3N5bmN0dHkuYyBiL2RyaXZlcnMvbmV0L3BwcF9zeW5jdHR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QwMTUwYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BwcF9zeW5jdHR5LmMKQEAgLTAsMCArMSw4MDMgQEAKKy8qCisgKiBQUFAgc3luY2hyb25vdXMgdHR5IGNoYW5uZWwgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBUaGlzIGlzIGEgcHBwIGNoYW5uZWwgZHJpdmVyIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCB0dHkgZGV2aWNlIGRyaXZlcnMKKyAqIHRoYXQgYXJlIGZyYW1lIG9yaWVudGVkLCBzdWNoIGFzIHN5bmNocm9ub3VzIEhETEMgZGV2aWNlcy4KKyAqCisgKiBDb21wbGV0ZSBQUFAgZnJhbWVzIHdpdGhvdXQgZW5jb2RpbmcvZGVjb2RpbmcgYXJlIGV4Y2hhbmdlZCBiZXR3ZWVuCisgKiB0aGUgY2hhbm5lbCBkcml2ZXIgYW5kIHRoZSBkZXZpY2UgZHJpdmVyLgorICogCisgKiBUaGUgYXN5bmMgbWFwIElPQ1RMIGNvZGVzIGFyZSBpbXBsZW1lbnRlZCB0byBrZWVwIHRoZSB1c2VyIG1vZGUKKyAqIGFwcGxpY2F0aW9ucyBoYXBweSBpZiB0aGV5IGNhbGwgdGhlbS4gU3luY2hyb25vdXMgUFBQIGRvZXMgbm90IHVzZQorICogdGhlIGFzeW5jIG1hcHMuCisgKgorICogQ29weXJpZ2h0IDE5OTkgUGF1bCBNYWNrZXJyYXMuCisgKgorICogQWxzbyB0b3VjaGVkIGJ5IHRoZSBncnViYnkgaGFuZHMgb2YgUGF1bCBGdWxnaHVtIHBhdWxrZkBtaWNyb2dhdGUuY29tCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBkcml2ZXIgcHJvdmlkZXMgdGhlIGVuY2Fwc3VsYXRpb24gYW5kIGZyYW1pbmcgZm9yIHNlbmRpbmcKKyAqIGFuZCByZWNlaXZpbmcgUFBQIGZyYW1lcyBvdmVyIHN5bmMgc2VyaWFsIGxpbmVzLiAgSXQgcmVsaWVzIG9uCisgKiB0aGUgZ2VuZXJpYyBQUFAgbGF5ZXIgdG8gZ2l2ZSBpdCBmcmFtZXMgdG8gc2VuZCBhbmQgdG8gcHJvY2VzcworICogcmVjZWl2ZWQgZnJhbWVzLiAgSXQgaW1wbGVtZW50cyB0aGUgUFBQIGxpbmUgZGlzY2lwbGluZS4KKyAqCisgKiBQYXJ0IG9mIHRoZSBjb2RlIGluIHRoaXMgZHJpdmVyIHdhcyBpbnNwaXJlZCBieSB0aGUgb2xkIGFzeW5jLW9ubHkKKyAqIFBQUCBkcml2ZXIsIHdyaXR0ZW4gYnkgTWljaGFlbCBDYWxsYWhhbiBhbmQgQWwgTG9uZ3llYXIsIGFuZAorICogc3Vic2VxdWVudGx5IGhhY2tlZCBieSBQYXVsIE1hY2tlcnJhcy4KKyAqCisgKiA9PUZJTEVWRVJTSU9OIDIwMDQwNjE2PT0KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcF9kZWZzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcHBwLmg+CisjaW5jbHVkZSA8bGludXgvcHBwX2NoYW5uZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKworI2RlZmluZSBQUFBfVkVSU0lPTgkiMi40LjIiCisKKy8qIFN0cnVjdHVyZSBmb3Igc3RvcmluZyBsb2NhbCBzdGF0ZS4gKi8KK3N0cnVjdCBzeW5jcHBwIHsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXVuc2lnbmVkIGludAlmbGFnczsKKwl1bnNpZ25lZCBpbnQJcmJpdHM7CisJaW50CQltcnU7CisJc3BpbmxvY2tfdAl4bWl0X2xvY2s7CisJc3BpbmxvY2tfdAlyZWN2X2xvY2s7CisJdW5zaWduZWQgbG9uZwl4bWl0X2ZsYWdzOworCXUzMgkJeGFjY21bOF07CisJdTMyCQlyYWNjbTsKKwl1bnNpZ25lZCBpbnQJYnl0ZXNfc2VudDsKKwl1bnNpZ25lZCBpbnQJYnl0ZXNfcmN2ZDsKKworCXN0cnVjdCBza19idWZmCSp0cGt0OworCXVuc2lnbmVkIGxvbmcJbGFzdF94bWl0OworCisJc3RydWN0IHNrX2J1ZmZfaGVhZCBycXVldWU7CisKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdHNrOworCisJYXRvbWljX3QJcmVmY250OworCXN0cnVjdCBzZW1hcGhvcmUgZGVhZF9zZW07CisJc3RydWN0IHBwcF9jaGFubmVsIGNoYW47CS8qIGludGVyZmFjZSB0byBnZW5lcmljIHBwcCBsYXllciAqLworfTsKKworLyogQml0IG51bWJlcnMgaW4geG1pdF9mbGFncyAqLworI2RlZmluZSBYTUlUX1dBS0VVUAkwCisjZGVmaW5lIFhNSVRfRlVMTAkxCisKKy8qIEJpdHMgaW4gcmJpdHMgKi8KKyNkZWZpbmUgU0NfUkNWX0JJVFMJKFNDX1JDVl9CN18xfFNDX1JDVl9CN18wfFNDX1JDVl9PRERQfFNDX1JDVl9FVk5QKQorCisjZGVmaW5lIFBQUFNZTkNfTUFYX1JRTEVOCTMyCS8qIGFyYml0cmFyeSAqLworCisvKgorICogUHJvdG90eXBlcy4KKyAqLworc3RhdGljIHN0cnVjdCBza19idWZmKiBwcHBfc3luY190eG11bmdlKHN0cnVjdCBzeW5jcHBwICphcCwgc3RydWN0IHNrX2J1ZmYgKik7CitzdGF0aWMgaW50IHBwcF9zeW5jX3NlbmQoc3RydWN0IHBwcF9jaGFubmVsICpjaGFuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgcHBwX3N5bmNfaW9jdGwoc3RydWN0IHBwcF9jaGFubmVsICpjaGFuLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgdm9pZCBwcHBfc3luY19wcm9jZXNzKHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgcHBwX3N5bmNfcHVzaChzdHJ1Y3Qgc3luY3BwcCAqYXApOworc3RhdGljIHZvaWQgcHBwX3N5bmNfZmx1c2hfb3V0cHV0KHN0cnVjdCBzeW5jcHBwICphcCk7CitzdGF0aWMgdm9pZCBwcHBfc3luY19pbnB1dChzdHJ1Y3Qgc3luY3BwcCAqYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCSAgIGNoYXIgKmZsYWdzLCBpbnQgY291bnQpOworCitzdGF0aWMgc3RydWN0IHBwcF9jaGFubmVsX29wcyBzeW5jX29wcyA9IHsKKwlwcHBfc3luY19zZW5kLAorCXBwcF9zeW5jX2lvY3RsCit9OworCisvKgorICogVXRpbGl0eSBwcm9jZWR1cmVzIHRvIHByaW50IGEgYnVmZmVyIGluIGhleC9hc2NpaQorICovCitzdGF0aWMgdm9pZAorcHBwX3ByaW50X2hleCAocmVnaXN0ZXIgX191OCAqIG91dCwgY29uc3QgX191OCAqIGluLCBpbnQgY291bnQpCit7CisJcmVnaXN0ZXIgX191OCBuZXh0X2NoOworCXN0YXRpYyBjaGFyIGhleFtdID0gIjAxMjM0NTY3ODlBQkNERUYiOworCisJd2hpbGUgKGNvdW50LS0gPiAwKSB7CisJCW5leHRfY2ggPSAqaW4rKzsKKwkJKm91dCsrID0gaGV4WyhuZXh0X2NoID4+IDQpICYgMHgwRl07CisJCSpvdXQrKyA9IGhleFtuZXh0X2NoICYgMHgwRl07CisJCSsrb3V0OworCX0KK30KKworc3RhdGljIHZvaWQKK3BwcF9wcmludF9jaGFyIChyZWdpc3RlciBfX3U4ICogb3V0LCBjb25zdCBfX3U4ICogaW4sIGludCBjb3VudCkKK3sKKwlyZWdpc3RlciBfX3U4IG5leHRfY2g7CisKKwl3aGlsZSAoY291bnQtLSA+IDApIHsKKwkJbmV4dF9jaCA9ICppbisrOworCisJCWlmIChuZXh0X2NoIDwgMHgyMCB8fCBuZXh0X2NoID4gMHg3ZSkKKwkJCSpvdXQrKyA9ICcuJzsKKwkJZWxzZSB7CisJCQkqb3V0KysgPSBuZXh0X2NoOworCQkJaWYgKG5leHRfY2ggPT0gJyUnKSAgIC8qIHByaW50ay9zeXNsb2dkIGhhcyBhIGJ1ZyAhISAqLworCQkJCSpvdXQrKyA9ICclJzsKKwkJfQorCX0KKwkqb3V0ID0gJ1wwJzsKK30KKworc3RhdGljIHZvaWQKK3BwcF9wcmludF9idWZmZXIgKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IF9fdTggKmJ1ZiwgaW50IGNvdW50KQoreworCV9fdTggbGluZVs0NF07CisKKwlpZiAobmFtZSAhPSBOVUxMKQorCQlwcmludGsoS0VSTl9ERUJVRyAicHBwX3N5bmN0dHk6ICVzLCBjb3VudCA9ICVkXG4iLCBuYW1lLCBjb3VudCk7CisKKwl3aGlsZSAoY291bnQgPiA4KSB7CisJCW1lbXNldCAobGluZSwgMzIsIDQ0KTsKKwkJcHBwX3ByaW50X2hleCAobGluZSwgYnVmLCA4KTsKKwkJcHBwX3ByaW50X2NoYXIgKCZsaW5lWzggKiAzXSwgYnVmLCA4KTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBsaW5lKTsKKwkJY291bnQgLT0gODsKKwkJYnVmICs9IDg7CisJfQorCisJaWYgKGNvdW50ID4gMCkgeworCQltZW1zZXQgKGxpbmUsIDMyLCA0NCk7CisJCXBwcF9wcmludF9oZXggKGxpbmUsIGJ1ZiwgY291bnQpOworCQlwcHBfcHJpbnRfY2hhciAoJmxpbmVbOCAqIDNdLCBidWYsIGNvdW50KTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBsaW5lKTsKKwl9Cit9CisKKworLyoKKyAqIFJvdXRpbmVzIGltcGxlbWVudGluZyB0aGUgc3luY2hyb25vdXMgUFBQIGxpbmUgZGlzY2lwbGluZS4KKyAqLworCisvKgorICogV2UgaGF2ZSBhIHBvdGVudGlhbCByYWNlIG9uIGRlcmVmZXJlbmNpbmcgdHR5LT5kaXNjX2RhdGEsCisgKiBiZWNhdXNlIHRoZSB0dHkgbGF5ZXIgcHJvdmlkZXMgbm8gbG9ja2luZyBhdCBhbGwgLSB0aHVzIG9uZQorICogY3B1IGNvdWxkIGJlIHJ1bm5pbmcgcHBwX3N5bmN0dHlfcmVjZWl2ZSB3aGlsZSBhbm90aGVyCisgKiBjYWxscyBwcHBfc3luY3R0eV9jbG9zZSwgd2hpY2ggemVyb2VzIHR0eS0+ZGlzY19kYXRhIGFuZAorICogZnJlZXMgdGhlIG1lbW9yeSB0aGF0IHBwcF9zeW5jdHR5X3JlY2VpdmUgaXMgdXNpbmcuICBUaGUgYmVzdAorICogd2F5IHRvIGZpeCB0aGlzIGlzIHRvIHVzZSBhIHJ3bG9jayBpbiB0aGUgdHR5IHN0cnVjdCwgYnV0IGZvciBub3cKKyAqIHdlIHVzZSBhIHNpbmdsZSBnbG9iYWwgcndsb2NrIGZvciBhbGwgdHR5cyBpbiBwcHAgbGluZSBkaXNjaXBsaW5lLgorICoKKyAqIEZJWE1FOiBGaXhlZCBpbiB0dHlfaW8gbm93ZGF5cy4KKyAqLworc3RhdGljIERFRklORV9SV0xPQ0soZGlzY19kYXRhX2xvY2spOworCitzdGF0aWMgc3RydWN0IHN5bmNwcHAgKnNwX2dldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzeW5jcHBwICphcDsKKworCXJlYWRfbG9jaygmZGlzY19kYXRhX2xvY2spOworCWFwID0gdHR5LT5kaXNjX2RhdGE7CisJaWYgKGFwICE9IE5VTEwpCisJCWF0b21pY19pbmMoJmFwLT5yZWZjbnQpOworCXJlYWRfdW5sb2NrKCZkaXNjX2RhdGFfbG9jayk7CisJcmV0dXJuIGFwOworfQorCitzdGF0aWMgdm9pZCBzcF9wdXQoc3RydWN0IHN5bmNwcHAgKmFwKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZhcC0+cmVmY250KSkKKwkJdXAoJmFwLT5kZWFkX3NlbSk7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiBhIHR0eSBpcyBwdXQgaW50byBzeW5jLVBQUCBsaW5lIGRpc2NpcGxpbmUuCisgKi8KK3N0YXRpYyBpbnQKK3BwcF9zeW5jX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgc3luY3BwcCAqYXA7CisJaW50IGVycjsKKworCWFwID0ga21hbGxvYyhzaXplb2YoKmFwKSwgR0ZQX0tFUk5FTCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoYXAgPT0gMCkKKwkJZ290byBvdXQ7CisKKwkvKiBpbml0aWFsaXplIHRoZSBzeW5jcHBwIHN0cnVjdHVyZSAqLworCW1lbXNldChhcCwgMCwgc2l6ZW9mKCphcCkpOworCWFwLT50dHkgPSB0dHk7CisJYXAtPm1ydSA9IFBQUF9NUlU7CisJc3Bpbl9sb2NrX2luaXQoJmFwLT54bWl0X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZhcC0+cmVjdl9sb2NrKTsKKwlhcC0+eGFjY21bMF0gPSB+MFU7CisJYXAtPnhhY2NtWzNdID0gMHg2MDAwMDAwMFU7CisJYXAtPnJhY2NtID0gfjBVOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYXAtPnJxdWV1ZSk7CisJdGFza2xldF9pbml0KCZhcC0+dHNrLCBwcHBfc3luY19wcm9jZXNzLCAodW5zaWduZWQgbG9uZykgYXApOworCisJYXRvbWljX3NldCgmYXAtPnJlZmNudCwgMSk7CisJaW5pdF9NVVRFWF9MT0NLRUQoJmFwLT5kZWFkX3NlbSk7CisKKwlhcC0+Y2hhbi5wcml2YXRlID0gYXA7CisJYXAtPmNoYW4ub3BzID0gJnN5bmNfb3BzOworCWFwLT5jaGFuLm10dSA9IFBQUF9NUlU7CisJYXAtPmNoYW4uaGRybGVuID0gMjsJLyogZm9yIEEvQyBieXRlcyAqLworCWVyciA9IHBwcF9yZWdpc3Rlcl9jaGFubmVsKCZhcC0+Y2hhbik7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZTsKKworCXR0eS0+ZGlzY19kYXRhID0gYXA7CisKKwlyZXR1cm4gMDsKKworIG91dF9mcmVlOgorCWtmcmVlKGFwKTsKKyBvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIHRoZSB0dHkgaXMgcHV0IGludG8gYW5vdGhlciBsaW5lIGRpc2NpcGxpbmUKKyAqIG9yIGl0IGhhbmdzIHVwLiAgV2UgaGF2ZSB0byB3YWl0IGZvciBhbnkgY3B1IGN1cnJlbnRseQorICogZXhlY3V0aW5nIGluIGFueSBvZiB0aGUgb3RoZXIgcHBwX3N5bmN0dHlfKiByb3V0aW5lcyB0bworICogZmluaXNoIGJlZm9yZSB3ZSBjYW4gY2FsbCBwcHBfdW5yZWdpc3Rlcl9jaGFubmVsIGFuZCBmcmVlCisgKiB0aGUgc3luY3BwcCBzdHJ1Y3QuICBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgZnJvbQorICogcHJvY2VzcyBjb250ZXh0LCBub3QgaW50ZXJydXB0IG9yIHNvZnRpcnEgY29udGV4dC4KKyAqLworc3RhdGljIHZvaWQKK3BwcF9zeW5jX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHN5bmNwcHAgKmFwOworCisJd3JpdGVfbG9ja19pcnEoJmRpc2NfZGF0YV9sb2NrKTsKKwlhcCA9IHR0eS0+ZGlzY19kYXRhOworCXR0eS0+ZGlzY19kYXRhID0gTlVMTDsKKwl3cml0ZV91bmxvY2tfaXJxKCZkaXNjX2RhdGFfbG9jayk7CisJaWYgKGFwID09IDApCisJCXJldHVybjsKKworCS8qCisJICogV2UgaGF2ZSBub3cgZW5zdXJlZCB0aGF0IG5vYm9keSBjYW4gc3RhcnQgdXNpbmcgYXAgZnJvbSBub3cKKwkgKiBvbiwgYnV0IHdlIGhhdmUgdG8gd2FpdCBmb3IgYWxsIGV4aXN0aW5nIHVzZXJzIHRvIGZpbmlzaC4KKwkgKiBOb3RlIHRoYXQgcHBwX3VucmVnaXN0ZXJfY2hhbm5lbCBlbnN1cmVzIHRoYXQgbm8gY2FsbHMgdG8KKwkgKiBvdXIgY2hhbm5lbCBvcHMgKGkuZS4gcHBwX3N5bmNfc2VuZC9pb2N0bCkgYXJlIGluIHByb2dyZXNzCisJICogYnkgdGhlIHRpbWUgaXQgcmV0dXJucy4KKwkgKi8KKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmFwLT5yZWZjbnQpKQorCQlkb3duKCZhcC0+ZGVhZF9zZW0pOworCXRhc2tsZXRfa2lsbCgmYXAtPnRzayk7CisKKwlwcHBfdW5yZWdpc3Rlcl9jaGFubmVsKCZhcC0+Y2hhbik7CisJc2tiX3F1ZXVlX3B1cmdlKCZhcC0+cnF1ZXVlKTsKKwlpZiAoYXAtPnRwa3QgIT0gMCkKKwkJa2ZyZWVfc2tiKGFwLT50cGt0KTsKKwlrZnJlZShhcCk7Cit9CisKKy8qCisgKiBDYWxsZWQgb24gdHR5IGhhbmd1cCBpbiBwcm9jZXNzIGNvbnRleHQuCisgKgorICogV2FpdCBmb3IgSS9PIHRvIGRyaXZlciB0byBjb21wbGV0ZSBhbmQgdW5yZWdpc3RlciBQUFAgY2hhbm5lbC4KKyAqIFRoaXMgaXMgYWxyZWFkeSBkb25lIGJ5IHRoZSBjbG9zZSByb3V0aW5lLCBzbyBqdXN0IGNhbGwgdGhhdC4KKyAqLworc3RhdGljIGludCBwcHBfc3luY19oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlwcHBfc3luY19jbG9zZSh0dHkpOworCXJldHVybiAwOworfQorCisvKgorICogUmVhZCBkb2VzIG5vdGhpbmcgLSBubyBkYXRhIGlzIGV2ZXIgYXZhaWxhYmxlIHRoaXMgd2F5LgorICogUHBwZCByZWFkcyBhbmQgd3JpdGVzIHBhY2tldHMgdmlhIC9kZXYvcHBwIGluc3RlYWQuCisgKi8KK3N0YXRpYyBzc2l6ZV90CitwcHBfc3luY19yZWFkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCSAgICAgICB1bnNpZ25lZCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIC1FQUdBSU47Cit9CisKKy8qCisgKiBXcml0ZSBvbiB0aGUgdHR5IGRvZXMgbm90aGluZywgdGhlIHBhY2tldHMgYWxsIGNvbWUgaW4KKyAqIGZyb20gdGhlIHBwcCBnZW5lcmljIHN0dWZmLgorICovCitzdGF0aWMgc3NpemVfdAorcHBwX3N5bmNfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiAtRUFHQUlOOworfQorCitzdGF0aWMgaW50CitwcHBfc3luY3R0eV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc3luY3BwcCAqYXAgPSBzcF9nZXQodHR5KTsKKwlpbnQgX191c2VyICpwID0gKGludCBfX3VzZXIgKilhcmc7CisJaW50IGVyciwgdmFsOworCisJaWYgKGFwID09IDApCisJCXJldHVybiAtRU5YSU87CisJZXJyID0gLUVGQVVMVDsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUFBQSU9DR0NIQU46CisJCWVyciA9IC1FTlhJTzsKKwkJaWYgKGFwID09IDApCisJCQlicmVhazsKKwkJZXJyID0gLUVGQVVMVDsKKwkJaWYgKHB1dF91c2VyKHBwcF9jaGFubmVsX2luZGV4KCZhcC0+Y2hhbiksIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NHVU5JVDoKKwkJZXJyID0gLUVOWElPOworCQlpZiAoYXAgPT0gMCkKKwkJCWJyZWFrOworCQllcnIgPSAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIocHBwX3VuaXRfbnVtYmVyKCZhcC0+Y2hhbiksIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBUQ0dFVFM6CisJY2FzZSBUQ0dFVEE6CisJCWVyciA9IG5fdHR5X2lvY3RsKHR0eSwgZmlsZSwgY21kLCBhcmcpOworCQlicmVhazsKKworCWNhc2UgVENGTFNIOgorCQkvKiBmbHVzaCBvdXIgYnVmZmVycyBhbmQgdGhlIHNlcmlhbCBwb3J0J3MgYnVmZmVyICovCisJCWlmIChhcmcgPT0gVENJT0ZMVVNIIHx8IGFyZyA9PSBUQ09GTFVTSCkKKwkJCXBwcF9zeW5jX2ZsdXNoX291dHB1dChhcCk7CisJCWVyciA9IG5fdHR5X2lvY3RsKHR0eSwgZmlsZSwgY21kLCBhcmcpOworCQlicmVhazsKKworCWNhc2UgRklPTlJFQUQ6CisJCXZhbCA9IDA7CisJCWlmIChwdXRfdXNlcih2YWwsIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT0lPQ1RMQ01EOworCX0KKworCXNwX3B1dChhcCk7CisJcmV0dXJuIGVycjsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSBmaW5lICovCitzdGF0aWMgdW5zaWduZWQgaW50CitwcHBfc3luY19wb2xsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwcHBfc3luY19yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmV0dXJuIDY1NTM1OworfQorCisvKgorICogVGhpcyBjYW4gbm93IGJlIGNhbGxlZCBmcm9tIGhhcmQgaW50ZXJydXB0IGxldmVsIGFzIHdlbGwKKyAqIGFzIHNvZnQgaW50ZXJydXB0IGxldmVsIG9yIG1haW5saW5lLgorICovCitzdGF0aWMgdm9pZAorcHBwX3N5bmNfcmVjZWl2ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCSAgY2hhciAqY2ZsYWdzLCBpbnQgY291bnQpCit7CisJc3RydWN0IHN5bmNwcHAgKmFwID0gc3BfZ2V0KHR0eSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChhcCA9PSAwKQorCQlyZXR1cm47CisJc3Bpbl9sb2NrX2lycXNhdmUoJmFwLT5yZWN2X2xvY2ssIGZsYWdzKTsKKwlwcHBfc3luY19pbnB1dChhcCwgYnVmLCBjZmxhZ3MsIGNvdW50KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcC0+cmVjdl9sb2NrLCBmbGFncyk7CisJaWYgKHNrYl9xdWV1ZV9sZW4oJmFwLT5ycXVldWUpKQorCQl0YXNrbGV0X3NjaGVkdWxlKCZhcC0+dHNrKTsKKwlzcF9wdXQoYXApOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoVFRZX1RIUk9UVExFRCwgJnR0eS0+ZmxhZ3MpCisJICAgICYmIHR0eS0+ZHJpdmVyLT51bnRocm90dGxlKQorCQl0dHktPmRyaXZlci0+dW50aHJvdHRsZSh0dHkpOworfQorCitzdGF0aWMgdm9pZAorcHBwX3N5bmNfd2FrZXVwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHN5bmNwcHAgKmFwID0gc3BfZ2V0KHR0eSk7CisKKwljbGVhcl9iaXQoVFRZX0RPX1dSSVRFX1dBS0VVUCwgJnR0eS0+ZmxhZ3MpOworCWlmIChhcCA9PSAwKQorCQlyZXR1cm47CisJc2V0X2JpdChYTUlUX1dBS0VVUCwgJmFwLT54bWl0X2ZsYWdzKTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZhcC0+dHNrKTsKKwlzcF9wdXQoYXApOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2xkaXNjIHBwcF9zeW5jX2xkaXNjID0geworCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5tYWdpYwk9IFRUWV9MRElTQ19NQUdJQywKKwkubmFtZQk9ICJwcHBzeW5jIiwKKwkub3Blbgk9IHBwcF9zeW5jX29wZW4sCisJLmNsb3NlCT0gcHBwX3N5bmNfY2xvc2UsCisJLmhhbmd1cAk9IHBwcF9zeW5jX2hhbmd1cCwKKwkucmVhZAk9IHBwcF9zeW5jX3JlYWQsCisJLndyaXRlCT0gcHBwX3N5bmNfd3JpdGUsCisJLmlvY3RsCT0gcHBwX3N5bmN0dHlfaW9jdGwsCisJLnBvbGwJPSBwcHBfc3luY19wb2xsLAorCS5yZWNlaXZlX3Jvb20gPSBwcHBfc3luY19yb29tLAorCS5yZWNlaXZlX2J1ZiA9IHBwcF9zeW5jX3JlY2VpdmUsCisJLndyaXRlX3dha2V1cCA9IHBwcF9zeW5jX3dha2V1cCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitwcHBfc3luY19pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCWVyciA9IHR0eV9yZWdpc3Rlcl9sZGlzYyhOX1NZTkNfUFBQLCAmcHBwX3N5bmNfbGRpc2MpOworCWlmIChlcnIgIT0gMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJQUFBfc3luYzogZXJyb3IgJWQgcmVnaXN0ZXJpbmcgbGluZSBkaXNjLlxuIiwKKwkJICAgICAgIGVycik7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgcHJvdmlkZSB0aGUgUFBQIGNoYW5uZWwgaW50ZXJmYWNlLgorICovCitzdGF0aWMgaW50CitwcHBfc3luY19pb2N0bChzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW4sIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzeW5jcHBwICphcCA9IGNoYW4tPnByaXZhdGU7CisJaW50IGVyciwgdmFsOworCXUzMiBhY2NtWzhdOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXUzMiBfX3VzZXIgKnAgPSBhcmdwOworCisJZXJyID0gLUVGQVVMVDsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUFBQSU9DR0ZMQUdTOgorCQl2YWwgPSBhcC0+ZmxhZ3MgfCBhcC0+cmJpdHM7CisJCWlmIChwdXRfdXNlcih2YWwsIChpbnQgX191c2VyICopIGFyZ3ApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCWNhc2UgUFBQSU9DU0ZMQUdTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKSBhcmdwKSkKKwkJCWJyZWFrOworCQlhcC0+ZmxhZ3MgPSB2YWwgJiB+U0NfUkNWX0JJVFM7CisJCXNwaW5fbG9ja19pcnEoJmFwLT5yZWN2X2xvY2spOworCQlhcC0+cmJpdHMgPSB2YWwgJiBTQ19SQ1ZfQklUUzsKKwkJc3Bpbl91bmxvY2tfaXJxKCZhcC0+cmVjdl9sb2NrKTsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ0dBU1lOQ01BUDoKKwkJaWYgKHB1dF91c2VyKGFwLT54YWNjbVswXSwgcCkpCisJCQlicmVhazsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisJY2FzZSBQUFBJT0NTQVNZTkNNQVA6CisJCWlmIChnZXRfdXNlcihhcC0+eGFjY21bMF0sIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NHUkFTWU5DTUFQOgorCQlpZiAocHV0X3VzZXIoYXAtPnJhY2NtLCBwKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKwljYXNlIFBQUElPQ1NSQVNZTkNNQVA6CisJCWlmIChnZXRfdXNlcihhcC0+cmFjY20sIHApKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NHWEFTWU5DTUFQOgorCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGFwLT54YWNjbSwgc2l6ZW9mKGFwLT54YWNjbSkpKQorCQkJYnJlYWs7CisJCWVyciA9IDA7CisJCWJyZWFrOworCWNhc2UgUFBQSU9DU1hBU1lOQ01BUDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGFjY20sIGFyZ3AsIHNpemVvZihhY2NtKSkpCisJCQlicmVhazsKKwkJYWNjbVsyXSAmPSB+MHg0MDAwMDAwMFU7CS8qIGNhbid0IGVzY2FwZSAweDVlICovCisJCWFjY21bM10gfD0gMHg2MDAwMDAwMFU7CQkvKiBtdXN0IGVzY2FwZSAweDdkLCAweDdlICovCisJCW1lbWNweShhcC0+eGFjY20sIGFjY20sIHNpemVvZihhcC0+eGFjY20pKTsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ0dNUlU6CisJCWlmIChwdXRfdXNlcihhcC0+bXJ1LCAoaW50IF9fdXNlciAqKSBhcmdwKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKwljYXNlIFBQUElPQ1NNUlU6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopIGFyZ3ApKQorCQkJYnJlYWs7CisJCWlmICh2YWwgPCBQUFBfTVJVKQorCQkJdmFsID0gUFBQX01SVTsKKwkJYXAtPm1ydSA9IHZhbDsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PVFRZOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgYXQgc29mdGlycSBsZXZlbCB0byBkZWxpdmVyIHJlY2VpdmVkIHBhY2tldHMKKyAqIHRvIHRoZSBwcHBfZ2VuZXJpYyBjb2RlLCBhbmQgdG8gdGVsbCB0aGUgcHBwX2dlbmVyaWMgY29kZQorICogaWYgd2UgY2FuIGFjY2VwdCBtb3JlIG91dHB1dCBub3cuCisgKi8KK3N0YXRpYyB2b2lkIHBwcF9zeW5jX3Byb2Nlc3ModW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHN5bmNwcHAgKmFwID0gKHN0cnVjdCBzeW5jcHBwICopIGFyZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJLyogcHJvY2VzcyByZWNlaXZlZCBwYWNrZXRzICovCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmYXAtPnJxdWV1ZSkpICE9IE5VTEwpIHsKKwkJaWYgKHNrYi0+bGVuID09IDApIHsKKwkJCS8qIHplcm8gbGVuZ3RoIGJ1ZmZlcnMgaW5kaWNhdGUgZXJyb3IgKi8KKwkJCXBwcF9pbnB1dF9lcnJvcigmYXAtPmNoYW4sIDApOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCX0KKwkJZWxzZQorCQkJcHBwX2lucHV0KCZhcC0+Y2hhbiwgc2tiKTsKKwl9CisKKwkvKiB0cnkgdG8gcHVzaCBtb3JlIHN0dWZmIG91dCAqLworCWlmICh0ZXN0X2JpdChYTUlUX1dBS0VVUCwgJmFwLT54bWl0X2ZsYWdzKSAmJiBwcHBfc3luY19wdXNoKGFwKSkKKwkJcHBwX291dHB1dF93YWtldXAoJmFwLT5jaGFuKTsKK30KKworLyoKKyAqIFByb2NlZHVyZXMgZm9yIGVuY2Fwc3VsYXRpb24gYW5kIGZyYW1pbmcuCisgKi8KKworc3RydWN0IHNrX2J1ZmYqCitwcHBfc3luY190eG11bmdlKHN0cnVjdCBzeW5jcHBwICphcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcHJvdG87CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwlpbnQgaXNsY3A7CisKKwlkYXRhICA9IHNrYi0+ZGF0YTsKKwlwcm90byA9IChkYXRhWzBdIDw8IDgpICsgZGF0YVsxXTsKKworCS8qIExDUCBwYWNrZXRzIHdpdGggY29kZXMgYmV0d2VlbiAxIChjb25maWd1cmUtcmVxdWVzdCkKKwkgKiBhbmQgNyAoY29kZS1yZWplY3QpIG11c3QgYmUgc2VudCBhcyB0aG91Z2ggbm8gb3B0aW9ucworCSAqIGhhdmUgYmVlbiBuZWdvdGlhdGVkLgorCSAqLworCWlzbGNwID0gcHJvdG8gPT0gUFBQX0xDUCAmJiAxIDw9IGRhdGFbMl0gJiYgZGF0YVsyXSA8PSA3OworCisJLyogY29tcHJlc3MgcHJvdG9jb2wgZmllbGQgaWYgb3B0aW9uIGVuYWJsZWQgKi8KKwlpZiAoZGF0YVswXSA9PSAwICYmIChhcC0+ZmxhZ3MgJiBTQ19DT01QX1BST1QpICYmICFpc2xjcCkKKwkJc2tiX3B1bGwoc2tiLDEpOworCisJLyogcHJlcGVuZCBhZGRyZXNzL2NvbnRyb2wgZmllbGRzIGlmIG5lY2Vzc2FyeSAqLworCWlmICgoYXAtPmZsYWdzICYgU0NfQ09NUF9BQykgPT0gMCB8fCBpc2xjcCkgeworCQlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCAyKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqbnBrdCA9IGRldl9hbGxvY19za2Ioc2tiLT5sZW4gKyAyKTsKKwkJCWlmIChucGt0ID09IE5VTEwpIHsKKwkJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCXNrYl9yZXNlcnZlKG5wa3QsMik7CisJCQltZW1jcHkoc2tiX3B1dChucGt0LHNrYi0+bGVuKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXNrYiA9IG5wa3Q7CisJCX0KKwkJc2tiX3B1c2goc2tiLDIpOworCQlza2ItPmRhdGFbMF0gPSBQUFBfQUxMU1RBVElPTlM7CisJCXNrYi0+ZGF0YVsxXSA9IFBQUF9VSTsKKwl9CisKKwlhcC0+bGFzdF94bWl0ID0gamlmZmllczsKKworCWlmIChza2IgJiYgYXAtPmZsYWdzICYgU0NfTE9HX09VVFBLVCkKKwkJcHBwX3ByaW50X2J1ZmZlciAoInNlbmQgYnVmZmVyIiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKwlyZXR1cm4gc2tiOworfQorCisvKgorICogVHJhbnNtaXQtc2lkZSByb3V0aW5lcy4KKyAqLworCisvKgorICogU2VuZCBhIHBhY2tldCB0byB0aGUgcGVlciBvdmVyIGFuIHN5bmMgdHR5IGxpbmUuCisgKiBSZXR1cm5zIDEgaWZmIHRoZSBwYWNrZXQgd2FzIGFjY2VwdGVkLgorICogSWYgdGhlIHBhY2tldCB3YXMgbm90IGFjY2VwdGVkLCB3ZSB3aWxsIGNhbGwgcHBwX291dHB1dF93YWtldXAKKyAqIGF0IHNvbWUgbGF0ZXIgdGltZS4KKyAqLworc3RhdGljIGludAorcHBwX3N5bmNfc2VuZChzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW4sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHN5bmNwcHAgKmFwID0gY2hhbi0+cHJpdmF0ZTsKKworCXBwcF9zeW5jX3B1c2goYXApOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoWE1JVF9GVUxMLCAmYXAtPnhtaXRfZmxhZ3MpKQorCQlyZXR1cm4gMDsJLyogYWxyZWFkeSBmdWxsICovCisJc2tiID0gcHBwX3N5bmNfdHhtdW5nZShhcCwgc2tiKTsKKwlpZiAoc2tiICE9IE5VTEwpCisJCWFwLT50cGt0ID0gc2tiOworCWVsc2UKKwkJY2xlYXJfYml0KFhNSVRfRlVMTCwgJmFwLT54bWl0X2ZsYWdzKTsKKworCXBwcF9zeW5jX3B1c2goYXApOworCXJldHVybiAxOworfQorCisvKgorICogUHVzaCBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUgb3V0IHRvIHRoZSB0dHkuCisgKi8KK3N0YXRpYyBpbnQKK3BwcF9zeW5jX3B1c2goc3RydWN0IHN5bmNwcHAgKmFwKQoreworCWludCBzZW50LCBkb25lID0gMDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gYXAtPnR0eTsKKwlpbnQgdHR5X3N0dWZmZWQgPSAwOworCisJaWYgKCFzcGluX3RyeWxvY2tfYmgoJmFwLT54bWl0X2xvY2spKQorCQlyZXR1cm4gMDsKKwlmb3IgKDs7KSB7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoWE1JVF9XQUtFVVAsICZhcC0+eG1pdF9mbGFncykpCisJCQl0dHlfc3R1ZmZlZCA9IDA7CisJCWlmICghdHR5X3N0dWZmZWQgJiYgYXAtPnRwa3QgIT0gMCkgeworCQkJc2V0X2JpdChUVFlfRE9fV1JJVEVfV0FLRVVQLCAmdHR5LT5mbGFncyk7CisJCQlzZW50ID0gdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgYXAtPnRwa3QtPmRhdGEsIGFwLT50cGt0LT5sZW4pOworCQkJaWYgKHNlbnQgPCAwKQorCQkJCWdvdG8gZmx1c2g7CS8qIGVycm9yLCBlLmcuIGxvc3Mgb2YgQ0QgKi8KKwkJCWlmIChzZW50IDwgYXAtPnRwa3QtPmxlbikgeworCQkJCXR0eV9zdHVmZmVkID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJa2ZyZWVfc2tiKGFwLT50cGt0KTsKKwkJCQlhcC0+dHBrdCA9IE5VTEw7CisJCQkJY2xlYXJfYml0KFhNSVRfRlVMTCwgJmFwLT54bWl0X2ZsYWdzKTsKKwkJCQlkb25lID0gMTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIGhhdmVuJ3QgbWFkZSBhbnkgcHJvZ3Jlc3MgKi8KKwkJc3Bpbl91bmxvY2tfYmgoJmFwLT54bWl0X2xvY2spOworCQlpZiAoISh0ZXN0X2JpdChYTUlUX1dBS0VVUCwgJmFwLT54bWl0X2ZsYWdzKQorCQkgICAgICB8fCAoIXR0eV9zdHVmZmVkICYmIGFwLT50cGt0ICE9IDApKSkKKwkJCWJyZWFrOworCQlpZiAoIXNwaW5fdHJ5bG9ja19iaCgmYXAtPnhtaXRfbG9jaykpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGRvbmU7CisKK2ZsdXNoOgorCWlmIChhcC0+dHBrdCAhPSAwKSB7CisJCWtmcmVlX3NrYihhcC0+dHBrdCk7CisJCWFwLT50cGt0ID0gTlVMTDsKKwkJY2xlYXJfYml0KFhNSVRfRlVMTCwgJmFwLT54bWl0X2ZsYWdzKTsKKwkJZG9uZSA9IDE7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZhcC0+eG1pdF9sb2NrKTsKKwlyZXR1cm4gZG9uZTsKK30KKworLyoKKyAqIEZsdXNoIG91dHB1dCBmcm9tIG91ciBpbnRlcm5hbCBidWZmZXJzLgorICogQ2FsbGVkIGZvciB0aGUgVENGTFNIIGlvY3RsLgorICovCitzdGF0aWMgdm9pZAorcHBwX3N5bmNfZmx1c2hfb3V0cHV0KHN0cnVjdCBzeW5jcHBwICphcCkKK3sKKwlpbnQgZG9uZSA9IDA7CisKKwlzcGluX2xvY2tfYmgoJmFwLT54bWl0X2xvY2spOworCWlmIChhcC0+dHBrdCAhPSBOVUxMKSB7CisJCWtmcmVlX3NrYihhcC0+dHBrdCk7CisJCWFwLT50cGt0ID0gTlVMTDsKKwkJY2xlYXJfYml0KFhNSVRfRlVMTCwgJmFwLT54bWl0X2ZsYWdzKTsKKwkJZG9uZSA9IDE7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZhcC0+eG1pdF9sb2NrKTsKKwlpZiAoZG9uZSkKKwkJcHBwX291dHB1dF93YWtldXAoJmFwLT5jaGFuKTsKK30KKworLyoKKyAqIFJlY2VpdmUtc2lkZSByb3V0aW5lcy4KKyAqLworCisvKiBjYWxsZWQgd2hlbiB0aGUgdHR5IGRyaXZlciBoYXMgZGF0YSBmb3IgdXMuCisgKgorICogRGF0YSBpcyBmcmFtZSBvcmllbnRlZDogZWFjaCBjYWxsIHRvIHBwcF9zeW5jX2lucHV0IGlzIGNvbnNpZGVyZWQKKyAqIGEgd2hvbGUgZnJhbWUuIElmIHRoZSAxc3QgZmxhZyBieXRlIGlzIG5vbi16ZXJvIHRoZW4gdGhlIHdob2xlCisgKiBmcmFtZSBpcyBjb25zaWRlcmVkIHRvIGJlIGluIGVycm9yIGFuZCBpcyB0b3NzZWQuCisgKi8KK3N0YXRpYyB2b2lkCitwcHBfc3luY19pbnB1dChzdHJ1Y3Qgc3luY3BwcCAqYXAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJY2hhciAqZmxhZ3MsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgKnA7CisKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKGFwLT5mbGFncyAmIFNDX0xPR19JTlBLVCkKKwkJcHBwX3ByaW50X2J1ZmZlciAoInJlY2VpdmUgYnVmZmVyIiwgYnVmLCBjb3VudCk7CisKKwkvKiBzdHVmZiB0aGUgY2hhcnMgaW4gdGhlIHNrYiAqLworCWlmICgoc2tiID0gZGV2X2FsbG9jX3NrYihhcC0+bXJ1ICsgUFBQX0hEUkxFTiArIDIpKSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUFBQc3luYzogbm8gbWVtb3J5IChpbnB1dCBwa3QpXG4iKTsKKwkJZ290byBlcnI7CisJfQorCS8qIFRyeSB0byBnZXQgdGhlIHBheWxvYWQgNC1ieXRlIGFsaWduZWQgKi8KKwlpZiAoYnVmWzBdICE9IFBQUF9BTExTVEFUSU9OUykKKwkJc2tiX3Jlc2VydmUoc2tiLCAyICsgKGJ1ZlswXSAmIDEpKTsKKworCWlmIChmbGFncyAhPSAwICYmICpmbGFncykgeworCQkvKiBlcnJvciBmbGFnIHNldCwgaWdub3JlIGZyYW1lICovCisJCWdvdG8gZXJyOworCX0gZWxzZSBpZiAoY291bnQgPiBza2JfdGFpbHJvb20oc2tiKSkgeworCQkvKiBwYWNrZXQgb3ZlcmZsb3dlZCBNUlUgKi8KKwkJZ290byBlcnI7CisJfQorCisJcCA9IHNrYl9wdXQoc2tiLCBjb3VudCk7CisJbWVtY3B5KHAsIGJ1ZiwgY291bnQpOworCisJLyogc3RyaXAgYWRkcmVzcy9jb250cm9sIGZpZWxkIGlmIHByZXNlbnQgKi8KKwlwID0gc2tiLT5kYXRhOworCWlmIChwWzBdID09IFBQUF9BTExTVEFUSU9OUyAmJiBwWzFdID09IFBQUF9VSSkgeworCQkvKiBjaG9wIG9mZiBhZGRyZXNzL2NvbnRyb2wgKi8KKwkJaWYgKHNrYi0+bGVuIDwgMykKKwkJCWdvdG8gZXJyOworCQlwID0gc2tiX3B1bGwoc2tiLCAyKTsKKwl9CisKKwkvKiBkZWNvbXByZXNzIHByb3RvY29sIGZpZWxkIGlmIGNvbXByZXNzZWQgKi8KKwlpZiAocFswXSAmIDEpIHsKKwkJLyogcHJvdG9jb2wgaXMgY29tcHJlc3NlZCAqLworCQlza2JfcHVzaChza2IsIDEpWzBdID0gMDsKKwl9IGVsc2UgaWYgKHNrYi0+bGVuIDwgMikKKwkJZ290byBlcnI7CisKKwkvKiBxdWV1ZSB0aGUgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkICovCisJc2tiX3F1ZXVlX3RhaWwoJmFwLT5ycXVldWUsIHNrYik7CisJcmV0dXJuOworCitlcnI6CisJLyogcXVldWUgemVybyBsZW5ndGggcGFja2V0IGFzIGVycm9yIGluZGljYXRpb24gKi8KKwlpZiAoc2tiIHx8IChza2IgPSBkZXZfYWxsb2Nfc2tiKDApKSkgeworCQlza2JfdHJpbShza2IsIDApOworCQlza2JfcXVldWVfdGFpbCgmYXAtPnJxdWV1ZSwgc2tiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorcHBwX3N5bmNfY2xlYW51cCh2b2lkKQoreworCWlmICh0dHlfcmVnaXN0ZXJfbGRpc2MoTl9TWU5DX1BQUCwgTlVMTCkgIT0gMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gdW5yZWdpc3RlciBTeW5jIFBQUCBsaW5lIGRpc2NpcGxpbmVcbiIpOworfQorCittb2R1bGVfaW5pdChwcHBfc3luY19pbml0KTsKK21vZHVsZV9leGl0KHBwcF9zeW5jX2NsZWFudXApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX0xESVNDKE5fU1lOQ19QUFApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwb2UuYyBiL2RyaXZlcnMvbmV0L3BwcG9lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UxYTliZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BwcG9lLmMKQEAgLTAsMCArMSwxMTUzIEBACisvKiogLSotIGxpbnV4LWMgLSotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaW51eCBQUFAgb3ZlciBFdGhlcm5ldCAoUFBQb1gvUFBQb0UpIFNvY2tldHMKKyAqCisgKiBQUFBvWCAtLS0gR2VuZXJpYyBQUFAgZW5jYXBzdWxhdGlvbiBzb2NrZXQgZmFtaWx5CisgKiBQUFBvRSAtLS0gUFBQIG92ZXIgRXRoZXJuZXQgKFJGQyAyNTE2KQorICoKKyAqCisgKiBWZXJzaW9uOgkwLjcuMAorICoKKyAqIDIyMDEwMiA6CUZpeCBtb2R1bGUgdXNlIGNvdW50IG9uIGZhaWx1cmUgaW4gcHBwb2VfY3JlYXRlLCBwcHBveF9zayAtYWNtZQorICogMDMwNzAwIDoJRml4ZWQgY29ubmVjdCBsb2dpYyB0byBhbGxvdyBmb3IgZGlzY29ubmVjdC4KKyAqIDI3MDcwMCA6CUZpeGVkIHBvdGVudGlhbCBTTVAgcHJvYmxlbXM7IHdlIG11c3QgcHJvdGVjdCBhZ2FpbnN0CisgKgkJc2ltdWx0YW5lb3VzIGludm9jYXRpb24gb2YgcHBwX2lucHV0CisgKgkJYW5kIHBwcF91bnJlZ2lzdGVyX2NoYW5uZWwuCisgKiAwNDA4MDAgOglSZXNwZWN0IHJlZmVyZW5jZSBjb3VudCBtZWNoYW5pc21zIG9uIG5ldC1kZXZpY2VzLgorICogMjAwODAwIDoJZml4IGtmcmVlKHNrYikgaW4gcHBwb2VfcmN2IChhY21lKQorICoJCU1vZHVsZSByZWZlcmVuY2UgY291bnQgaXMgZGVjcmVtZW50ZWQgaW4gdGhlIHJpZ2h0IHNwb3Qgbm93LAorICoJCWd1YXJkcyBhZ2FpbnN0IHNvY2tfcHV0IG5vdCBhY3R1YWxseSBmcmVlaW5nIHRoZSBzaworICoJCWluIHBwcG9lX3JlbGVhc2UuCisgKiAwNTEwMDAgOglJbml0aWFsaXphdGlvbiBjbGVhbnVwLgorICogMTExMTAwIDoJRml4IHJlY3Ztc2cuCisgKiAwNTAxMDEgOglGaXggUEFEVCBwcm9jZXNpbmcuCisgKiAxNDA1MDEgOglVc2UgcHBwb2VfcmN2X2NvcmUgdG8gaGFuZGxlIGFsbCBiYWNrbG9nLiAoQWxleGV5KQorICogMTcwNzAxIDoJRG8gbm90IGxvY2tfc29jayB3aXRoIHJ3bG9jayBoZWxkLiAoRGF2ZU0pCisgKgkJSWdub3JlIGRpc2NvdmVyeSBmcmFtZXMgaWYgdXNlciBoYXMgc29ja2V0CisgKgkJbG9ja2VkLiAoRGF2ZU0pCisgKgkJSWdub3JlIHJldHVybiB2YWx1ZSBvZiBkZXZfcXVldWVfeG1pdCBpbiBfX3BwcG9lX3htaXQKKyAqCQlvciBlbHNlIHdlIG1heSBrZnJlZSBhbiBTS0IgdHdpY2UuIChEYXZlTSkKKyAqIDE5MDcwMSA6CVdoZW4gZG9pbmcgY29waWVzIG9mIHNrYidzIGluIF9fcHBwb2VfeG1pdCwgYWx3YXlzIGRlbGV0ZQorICoJCXRoZSBvcmlnaW5hbCBza2IgdGhhdCB3YXMgcGFzc2VkIGluIG9uIHN1Y2Nlc3MsIG5ldmVyIG9uCisgKgkJZmFpbHVyZS4gIERlbGV0ZSB0aGUgY29weSBvZiB0aGUgc2tiIG9uIGZhaWx1cmUgdG8gYXZvaWQKKyAqCQlhIG1lbW9yeSBsZWFrLgorICogMDgxMDAxIDoJTWlzYy4gY2xlYW51cCAobGljZW5jZSBzdHJpbmcsIG5vbi1ibG9ja2luZywgcHJldmVudAorICoJCXJlZmVyZW5jZSBvZiBkZXZpY2Ugb24gY2xvc2UpLgorICogMTIxMzAxIDoJTmV3IHBwcCBjaGFubmVscyBpbnRlcmZhY2U7IGNhbm5vdCB1bnJlZ2lzdGVyIGEgY2hhbm5lbAorICoJCWZyb20gaW50ZXJydXB0cy4gIFRodXMsIHdlIG1hcmsgdGhlIHNvY2tldCBhcyBhIFpPTUJJRQorICoJCWFuZCBkbyB0aGUgdW5yZWdpc3RyYXRpb24gbGF0ZXIuCisgKiAwODEwMDIgOglzZXFfZmlsZSBzdXBwb3J0IGZvciBwcm9jIHN0dWZmIC1hY21lCisgKiAxMTE2MDIgOglNZXJnZSBhbGwgMi40IGZpeGVzIGludG8gMi41LzIuNiB0cmVlLiAgTGFiZWwgMi41LzIuNgorICoJCWFzIHZlcnNpb24gMC43LiAgU3BhY2luZyBjbGVhbnVwLgorICogQXV0aG9yOglNaWNoYWwgT3N0cm93c2tpIDxtb3N0cm93c0BzcGVha2Vhc3kubmV0PgorICogQ29udHJpYnV0b3JzOgorICogCQlBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAqCQlEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKgorICogTGljZW5zZToKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcHBwb3guaD4KKyNpbmNsdWRlIDxsaW51eC9wcHBfY2hhbm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcF9kZWZzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcHBwLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBQUFBPRV9IQVNIX0JJVFMgNAorI2RlZmluZSBQUFBPRV9IQVNIX1NJWkUgKDE8PFBQUE9FX0hBU0hfQklUUykKKworc3RhdGljIHN0cnVjdCBwcHBfY2hhbm5lbF9vcHMgcHBwb2VfY2hhbl9vcHM7CisKK3N0YXRpYyBpbnQgcHBwb2VfaW9jdGwoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCBwcHBvZV94bWl0KHN0cnVjdCBwcHBfY2hhbm5lbCAqY2hhbiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgaW50IF9fcHBwb2VfeG1pdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOworCitzdGF0aWMgc3RydWN0IHByb3RvX29wcyBwcHBvZV9vcHM7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhwcHBvZV9oYXNoX2xvY2spOworCitzdGF0aWMgc3RydWN0IHBwcF9jaGFubmVsX29wcyBwcHBvZV9jaGFuX29wczsKKworc3RhdGljIGlubGluZSBpbnQgY21wXzJfYWRkcihzdHJ1Y3QgcHBwb2VfYWRkciAqYSwgc3RydWN0IHBwcG9lX2FkZHIgKmIpCit7CisJcmV0dXJuIChhLT5zaWQgPT0gYi0+c2lkICYmCisJCShtZW1jbXAoYS0+cmVtb3RlLCBiLT5yZW1vdGUsIEVUSF9BTEVOKSA9PSAwKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNtcF9hZGRyKHN0cnVjdCBwcHBvZV9hZGRyICphLCB1bnNpZ25lZCBsb25nIHNpZCwgY2hhciAqYWRkcikKK3sKKwlyZXR1cm4gKGEtPnNpZCA9PSBzaWQgJiYKKwkJKG1lbWNtcChhLT5yZW1vdGUsYWRkcixFVEhfQUxFTikgPT0gMCkpOworfQorCitzdGF0aWMgaW50IGhhc2hfaXRlbSh1bnNpZ25lZCBsb25nIHNpZCwgdW5zaWduZWQgY2hhciAqYWRkcikKK3sKKwljaGFyIGhhc2ggPSAwOworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOIDsgKytpKSB7CisJCWZvciAoaiA9IDA7IGogPCA4L1BQUE9FX0hBU0hfQklUUyA7ICsraikgeworCQkJaGFzaCBePSBhZGRyW2ldID4+ICggaiAqIFBQUE9FX0hBU0hfQklUUyApOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IChzaXplb2YodW5zaWduZWQgbG9uZykqOCkgLyBQUFBPRV9IQVNIX0JJVFMgOyArK2kpCisJCWhhc2ggXj0gc2lkID4+IChpKlBQUE9FX0hBU0hfQklUUyk7CisKKwlyZXR1cm4gaGFzaCAmICggUFBQT0VfSEFTSF9TSVpFIC0gMSApOworfQorCisvKiB6ZXJvZWQgYmVjYXVzZSBpdHMgaW4gLmJzcyAqLworc3RhdGljIHN0cnVjdCBwcHBveF9zb2NrICppdGVtX2hhc2hfdGFibGVbUFBQT0VfSEFTSF9TSVpFXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgU2V0L2dldC9kZWxldGUvcmVoYXNoIGl0ZW1zICAoaW50ZXJuYWwgdmVyc2lvbnMpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc3RydWN0IHBwcG94X3NvY2sgKl9fZ2V0X2l0ZW0odW5zaWduZWQgbG9uZyBzaWQsIHVuc2lnbmVkIGNoYXIgKmFkZHIpCit7CisJaW50IGhhc2ggPSBoYXNoX2l0ZW0oc2lkLCBhZGRyKTsKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcmV0OworCisJcmV0ID0gaXRlbV9oYXNoX3RhYmxlW2hhc2hdOworCisJd2hpbGUgKHJldCAmJiAhY21wX2FkZHIoJnJldC0+cHBwb2VfcGEsIHNpZCwgYWRkcikpCisJCXJldCA9IHJldC0+bmV4dDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19zZXRfaXRlbShzdHJ1Y3QgcHBwb3hfc29jayAqcG8pCit7CisJaW50IGhhc2ggPSBoYXNoX2l0ZW0ocG8tPnBwcG9lX3BhLnNpZCwgcG8tPnBwcG9lX3BhLnJlbW90ZSk7CisJc3RydWN0IHBwcG94X3NvY2sgKnJldDsKKworCXJldCA9IGl0ZW1faGFzaF90YWJsZVtoYXNoXTsKKwl3aGlsZSAocmV0KSB7CisJCWlmIChjbXBfMl9hZGRyKCZyZXQtPnBwcG9lX3BhLCAmcG8tPnBwcG9lX3BhKSkKKwkJCXJldHVybiAtRUFMUkVBRFk7CisKKwkJcmV0ID0gcmV0LT5uZXh0OworCX0KKworCWlmICghcmV0KSB7CisJCXBvLT5uZXh0ID0gaXRlbV9oYXNoX3RhYmxlW2hhc2hdOworCQlpdGVtX2hhc2hfdGFibGVbaGFzaF0gPSBwbzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwcHBveF9zb2NrICpfX2RlbGV0ZV9pdGVtKHVuc2lnbmVkIGxvbmcgc2lkLCBjaGFyICphZGRyKQoreworCWludCBoYXNoID0gaGFzaF9pdGVtKHNpZCwgYWRkcik7CisJc3RydWN0IHBwcG94X3NvY2sgKnJldCwgKipzcmM7CisKKwlyZXQgPSBpdGVtX2hhc2hfdGFibGVbaGFzaF07CisJc3JjID0gJml0ZW1faGFzaF90YWJsZVtoYXNoXTsKKworCXdoaWxlIChyZXQpIHsKKwkJaWYgKGNtcF9hZGRyKCZyZXQtPnBwcG9lX3BhLCBzaWQsIGFkZHIpKSB7CisJCQkqc3JjID0gcmV0LT5uZXh0OworCQkJYnJlYWs7CisJCX0KKworCQlzcmMgPSAmcmV0LT5uZXh0OworCQlyZXQgPSByZXQtPm5leHQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgU2V0L2dldC9kZWxldGUvcmVoYXNoIGl0ZW1zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwcHBveF9zb2NrICpnZXRfaXRlbSh1bnNpZ25lZCBsb25nIHNpZCwKKwkJCQkJIHVuc2lnbmVkIGNoYXIgKmFkZHIpCit7CisJc3RydWN0IHBwcG94X3NvY2sgKnBvOworCisJcmVhZF9sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOworCXBvID0gX19nZXRfaXRlbShzaWQsIGFkZHIpOworCWlmIChwbykKKwkJc29ja19ob2xkKHNrX3BwcG94KHBvKSk7CisJcmVhZF91bmxvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CisKKwlyZXR1cm4gcG87Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBwcG94X3NvY2sgKmdldF9pdGVtX2J5X2FkZHIoc3RydWN0IHNvY2thZGRyX3BwcG94ICpzcCkKK3sKKwlyZXR1cm4gZ2V0X2l0ZW0oc3AtPnNhX2FkZHIucHBwb2Uuc2lkLCBzcC0+c2FfYWRkci5wcHBvZS5yZW1vdGUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBzZXRfaXRlbShzdHJ1Y3QgcHBwb3hfc29jayAqcG8pCit7CisJaW50IGk7CisKKwlpZiAoIXBvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdyaXRlX2xvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CisJaSA9IF9fc2V0X2l0ZW0ocG8pOworCXdyaXRlX3VubG9ja19iaCgmcHBwb2VfaGFzaF9sb2NrKTsKKworCXJldHVybiBpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwcHBveF9zb2NrICpkZWxldGVfaXRlbSh1bnNpZ25lZCBsb25nIHNpZCwgY2hhciAqYWRkcikKK3sKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcmV0OworCisJd3JpdGVfbG9ja19iaCgmcHBwb2VfaGFzaF9sb2NrKTsKKwlyZXQgPSBfX2RlbGV0ZV9pdGVtKHNpZCwgYWRkcik7CisJd3JpdGVfdW5sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgSGFuZGxlciBmb3IgZGV2aWNlIGV2ZW50cy4KKyAqICBDZXJ0YWluIGRldmljZSBldmVudHMgcmVxdWlyZSB0aGF0IHNvY2tldHMgYmUgdW5jb25uZWN0ZWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBwcHBvZV9mbHVzaF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaGFzaDsKKworCUJVR19PTihkZXYgPT0gTlVMTCk7CisKKwlyZWFkX2xvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CisJZm9yIChoYXNoID0gMDsgaGFzaCA8IFBQUE9FX0hBU0hfU0laRTsgaGFzaCsrKSB7CisJCXN0cnVjdCBwcHBveF9zb2NrICpwbyA9IGl0ZW1faGFzaF90YWJsZVtoYXNoXTsKKworCQl3aGlsZSAocG8gIT0gTlVMTCkgeworCQkJaWYgKHBvLT5wcHBvZV9kZXYgPT0gZGV2KSB7CisJCQkJc3RydWN0IHNvY2sgKnNrID0gc2tfcHBwb3gocG8pOworCisJCQkJc29ja19ob2xkKHNrKTsKKwkJCQlwby0+cHBwb2VfZGV2ID0gTlVMTDsKKworCQkJCS8qIFdlIGhvbGQgYSByZWZlcmVuY2UgdG8gU0ssIG5vdyBkcm9wIHRoZQorCQkJCSAqIGhhc2ggdGFibGUgbG9jayBzbyB0aGF0IHdlIG1heSBhdHRlbXB0CisJCQkJICogdG8gbG9jayB0aGUgc29ja2V0ICh3aGljaCBjYW4gc2xlZXApLgorCQkJCSAqLworCQkJCXJlYWRfdW5sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOworCisJCQkJbG9ja19zb2NrKHNrKTsKKworCQkJCWlmIChzay0+c2tfc3RhdGUgJgorCQkJCSAgICAoUFBQT1hfQ09OTkVDVEVEIHwgUFBQT1hfQk9VTkQpKSB7CisJCQkJCXBwcG94X3VuYmluZF9zb2NrKHNrKTsKKwkJCQkJZGV2X3B1dChkZXYpOworCQkJCQlzay0+c2tfc3RhdGUgPSBQUFBPWF9aT01CSUU7CisJCQkJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOworCQkJCX0KKworCQkJCXJlbGVhc2Vfc29jayhzayk7CisKKwkJCQlzb2NrX3B1dChzayk7CisKKwkJCQlyZWFkX2xvY2tfYmgoJnBwcG9lX2hhc2hfbG9jayk7CisKKwkJCQkvKiBOb3cgcmVzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhpcworCQkJCSAqIGhhc2ggY2hhaW4uICBXZSBhbHdheXMgTlVMTCBvdXQgcHBwb2VfZGV2CisJCQkJICogc28gd2UgYXJlIGd1YXJhbnRlZWQgdG8gbWFrZSBmb3J3YXJkCisJCQkJICogcHJvZ3Jlc3MuCisJCQkJICovCisJCQkJcG8gPSBpdGVtX2hhc2hfdGFibGVbaGFzaF07CisJCQkJY29udGludWU7CisJCQl9CisJCQlwbyA9IHBvLT5uZXh0OworCQl9CisJfQorCXJlYWRfdW5sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOworfQorCitzdGF0aWMgaW50IHBwcG9lX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBwdHI7CisKKwkvKiBPbmx5IGxvb2sgYXQgc29ja2V0cyB0aGF0IGFyZSB1c2luZyB0aGlzIHNwZWNpZmljIGRldmljZS4gKi8KKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBORVRERVZfQ0hBTkdFTVRVOgorCQkvKiBBIGNoYW5nZSBpbiBtdHUgaXMgYSBiYWQgdGhpbmcsIHJlcXVpcmluZworCQkgKiBMQ1AgcmUtbmVnb3RpYXRpb24uCisJCSAqLworCisJY2FzZSBORVRERVZfR09JTkdfRE9XTjoKKwljYXNlIE5FVERFVl9ET1dOOgorCQkvKiBGaW5kIGV2ZXJ5IHNvY2tldCBvbiB0aGlzIGRldmljZSBhbmQga2lsbCBpdC4gKi8KKwkJcHBwb2VfZmx1c2hfZGV2KGRldik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBwcG9lX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gcHBwb2VfZGV2aWNlX2V2ZW50LAorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRG8gdGhlIHJlYWwgd29yayBvZiByZWNlaXZpbmcgYSBQUFBvRSBTZXNzaW9uIGZyYW1lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHBwb2VfcmN2X2NvcmUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBwcHBveF9zb2NrICpwbyA9IHBwcG94X3NrKHNrKTsKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcmVsYXlfcG8gPSBOVUxMOworCisJaWYgKHNrLT5za19zdGF0ZSAmIFBQUE9YX0JPVU5EKSB7CisJCXN0cnVjdCBwcHBvZV9oZHIgKnBoID0gKHN0cnVjdCBwcHBvZV9oZHIgKikgc2tiLT5uaC5yYXc7CisJCWludCBsZW4gPSBudG9ocyhwaC0+bGVuZ3RoKTsKKwkJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHBwcG9lX2hkcikpOworCQlza2JfcG9zdHB1bGxfcmNzdW0oc2tiLCBwaCwgc2l6ZW9mKCpwaCkpOworCQlpZiAocHNrYl90cmltX3Jjc3VtKHNrYiwgbGVuKSkKKwkJCWdvdG8gYWJvcnRfa2ZyZWU7CisKKwkJcHBwX2lucHV0KCZwby0+Y2hhbiwgc2tiKTsKKwl9IGVsc2UgaWYgKHNrLT5za19zdGF0ZSAmIFBQUE9YX1JFTEFZKSB7CisJCXJlbGF5X3BvID0gZ2V0X2l0ZW1fYnlfYWRkcigmcG8tPnBwcG9lX3JlbGF5KTsKKworCQlpZiAocmVsYXlfcG8gPT0gTlVMTCkKKwkJCWdvdG8gYWJvcnRfa2ZyZWU7CisKKwkJaWYgKChza19wcHBveChyZWxheV9wbyktPnNrX3N0YXRlICYgUFBQT1hfQ09OTkVDVEVEKSA9PSAwKQorCQkJZ290byBhYm9ydF9wdXQ7CisKKwkJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHBwcG9lX2hkcikpOworCQlpZiAoIV9fcHBwb2VfeG1pdChza19wcHBveChyZWxheV9wbyksIHNrYikpCisJCQlnb3RvIGFib3J0X3B1dDsKKwl9IGVsc2UgeworCQlpZiAoc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpKQorCQkJZ290byBhYm9ydF9rZnJlZTsKKwl9CisKKwlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7CisKK2Fib3J0X3B1dDoKKwlzb2NrX3B1dChza19wcHBveChyZWxheV9wbykpOworCithYm9ydF9rZnJlZToKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gTkVUX1JYX0RST1A7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSZWNlaXZlIHdyYXBwZXIgY2FsbGVkIGluIEJIIGNvbnRleHQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBwcHBvZV9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHQpCisKK3sKKwlzdHJ1Y3QgcHBwb2VfaGRyICpwaDsKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcG87CisJc3RydWN0IHNvY2sgKnNrOworCWludCByZXQ7CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHBwcG9lX2hkcikpKQorCQlnb3RvIGRyb3A7CisKKwlpZiAoIShza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKSkpIAorCQlnb3RvIG91dDsKKworCXBoID0gKHN0cnVjdCBwcHBvZV9oZHIgKikgc2tiLT5uaC5yYXc7CisKKwlwbyA9IGdldF9pdGVtKCh1bnNpZ25lZCBsb25nKSBwaC0+c2lkLCBldGhfaGRyKHNrYiktPmhfc291cmNlKTsKKwlpZiAoIXBvKSAKKwkJZ290byBkcm9wOworCisJc2sgPSBza19wcHBveChwbyk7CisJYmhfbG9ja19zb2NrKHNrKTsKKworCS8qIFNvY2tldCBzdGF0ZSBpcyB1bmtub3duLCBtdXN0IHB1dCBza2IgaW50byBiYWNrbG9nLiAqLworCWlmIChzb2NrX293bmVkX2J5X3VzZXIoc2spICE9IDApIHsKKwkJc2tfYWRkX2JhY2tsb2coc2ssIHNrYik7CisJCXJldCA9IE5FVF9SWF9TVUNDRVNTOworCX0gZWxzZSB7CisJCXJldCA9IHBwcG9lX3Jjdl9jb3JlKHNrLCBza2IpOworCX0KKworCWJoX3VubG9ja19zb2NrKHNrKTsKKwlzb2NrX3B1dChzayk7CisKKwlyZXR1cm4gcmV0OworZHJvcDoKKwlrZnJlZV9za2Ioc2tiKTsKK291dDoKKwlyZXR1cm4gTkVUX1JYX0RST1A7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSZWNlaXZlIGEgUFBQb0UgRGlzY292ZXJ5IGZyYW1lLgorICogVGhpcyBpcyBzb2xlbHkgZm9yIGRldGVjdGlvbiBvZiBQQURUIGZyYW1lcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHBwb2VfZGlzY19yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IHBhY2tldF90eXBlICpwdCkKKworeworCXN0cnVjdCBwcHBvZV9oZHIgKnBoOworCXN0cnVjdCBwcHBveF9zb2NrICpwbzsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgcHBwb2VfaGRyKSkpCisJCWdvdG8gYWJvcnQ7CisKKwlpZiAoIShza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKSkpIAorCQlnb3RvIG91dDsKKworCXBoID0gKHN0cnVjdCBwcHBvZV9oZHIgKikgc2tiLT5uaC5yYXc7CisJaWYgKHBoLT5jb2RlICE9IFBBRFRfQ09ERSkKKwkJZ290byBhYm9ydDsKKworCXBvID0gZ2V0X2l0ZW0oKHVuc2lnbmVkIGxvbmcpIHBoLT5zaWQsIGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UpOworCWlmIChwbykgeworCQlzdHJ1Y3Qgc29jayAqc2sgPSBza19wcHBveChwbyk7CisKKwkJYmhfbG9ja19zb2NrKHNrKTsKKworCQkvKiBJZiB0aGUgdXNlciBoYXMgbG9ja2VkIHRoZSBzb2NrZXQsIGp1c3QgaWdub3JlCisJCSAqIHRoZSBwYWNrZXQuICBXaXRoIHRoZSB3YXkgdHdvIHJjdiBwcm90b2NvbHMgaG9vayBpbnRvCisJCSAqIG9uZSBzb2NrZXQgZmFtaWx5IHR5cGUsIHdlIGNhbm5vdCAoZWFzaWx5KSBkaXN0aW5ndWlzaAorCQkgKiB3aGF0IGtpbmQgb2YgU0tCIGl0IGlzIGR1cmluZyBiYWNrbG9nIHJjdi4KKwkJICovCisJCWlmIChzb2NrX293bmVkX2J5X3VzZXIoc2spID09IDApIHsKKwkJCS8qIFdlJ3JlIG5vIGxvbmdlciBjb25uZWN0IGF0IHRoZSBQUFBPRSBsYXllciwKKwkJCSAqIGFuZCBtdXN0IHdhaXQgZm9yIHBwcCBjaGFubmVsIHRvIGRpc2Nvbm5lY3QgdXMuCisJCQkgKi8KKwkJCXNrLT5za19zdGF0ZSA9IFBQUE9YX1pPTUJJRTsKKwkJfQorCisJCWJoX3VubG9ja19zb2NrKHNrKTsKKwkJc29ja19wdXQoc2spOworCX0KKworYWJvcnQ6CisJa2ZyZWVfc2tiKHNrYik7CitvdXQ6CisJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOyAvKiBMaWVzLi4uIDotKSAqLworfQorCitzdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIHBwcG9lc19wdHlwZSA9IHsKKwkudHlwZQk9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfUFBQX1NFUyksCisJLmZ1bmMJPSBwcHBvZV9yY3YsCit9OworCitzdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIHBwcG9lZF9wdHlwZSA9IHsKKwkudHlwZQk9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfUFBQX0RJU0MpLAorCS5mdW5jCT0gcHBwb2VfZGlzY19yY3YsCit9OworCitzdGF0aWMgc3RydWN0IHByb3RvIHBwcG9lX3NrX3Byb3RvID0geworCS5uYW1lCSAgPSAiUFBQT0UiLAorCS5vd25lcgkgID0gVEhJU19NT0RVTEUsCisJLm9ial9zaXplID0gc2l6ZW9mKHN0cnVjdCBwcHBveF9zb2NrKSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEluaXRpYWxpemUgYSBuZXcgc3RydWN0IHNvY2suCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHBwcG9lX2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCWludCBlcnJvciA9IC1FTk9NRU07CisJc3RydWN0IHNvY2sgKnNrOworCisJc2sgPSBza19hbGxvYyhQRl9QUFBPWCwgR0ZQX0tFUk5FTCwgJnBwcG9lX3NrX3Byb3RvLCAxKTsKKwlpZiAoIXNrKQorCQlnb3RvIG91dDsKKworCXNvY2tfaW5pdF9kYXRhKHNvY2ssIHNrKTsKKworCXNvY2stPnN0YXRlID0gU1NfVU5DT05ORUNURUQ7CisJc29jay0+b3BzICAgPSAmcHBwb2Vfb3BzOworCisJc2stPnNrX2JhY2tsb2dfcmN2ID0gcHBwb2VfcmN2X2NvcmU7CisJc2stPnNrX3N0YXRlCSAgID0gUFBQT1hfTk9ORTsKKwlzay0+c2tfdHlwZQkgICA9IFNPQ0tfU1RSRUFNOworCXNrLT5za19mYW1pbHkJICAgPSBQRl9QUFBPWDsKKwlzay0+c2tfcHJvdG9jb2wJICAgPSBQWF9QUk9UT19PRTsKKworCWVycm9yID0gMDsKK291dDoJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IHBwcG9lX3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcG87CisJaW50IGVycm9yID0gMDsKKworCWlmICghc2spCisJCXJldHVybiAwOworCisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkKKwkJcmV0dXJuIC1FQkFERjsKKworCXBwcG94X3VuYmluZF9zb2NrKHNrKTsKKworCS8qIFNpZ25hbCB0aGUgZGVhdGggb2YgdGhlIHNvY2tldC4gKi8KKwlzay0+c2tfc3RhdGUgPSBQUFBPWF9ERUFEOworCisJcG8gPSBwcHBveF9zayhzayk7CisJaWYgKHBvLT5wcHBvZV9wYS5zaWQpIHsKKwkJZGVsZXRlX2l0ZW0ocG8tPnBwcG9lX3BhLnNpZCwgcG8tPnBwcG9lX3BhLnJlbW90ZSk7CisJfQorCisJaWYgKHBvLT5wcHBvZV9kZXYpCisJCWRldl9wdXQocG8tPnBwcG9lX2Rldik7CisKKwlwby0+cHBwb2VfZGV2ID0gTlVMTDsKKworCXNvY2tfb3JwaGFuKHNrKTsKKwlzb2NrLT5zayA9IE5VTEw7CisKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKwlzb2NrX3B1dChzayk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworc3RhdGljIGludCBwcHBvZV9jb25uZWN0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdXNlcnZhZGRyLAorCQkgIGludCBzb2NrYWRkcl9sZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3Qgc29ja2FkZHJfcHBwb3ggKnNwID0gKHN0cnVjdCBzb2NrYWRkcl9wcHBveCAqKSB1c2VydmFkZHI7CisJc3RydWN0IHBwcG94X3NvY2sgKnBvID0gcHBwb3hfc2soc2spOworCWludCBlcnJvcjsKKworCWxvY2tfc29jayhzayk7CisKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKHNwLT5zYV9wcm90b2NvbCAhPSBQWF9QUk9UT19PRSkKKwkJZ290byBlbmQ7CisKKwkvKiBDaGVjayBmb3IgYWxyZWFkeSBib3VuZCBzb2NrZXRzICovCisJZXJyb3IgPSAtRUJVU1k7CisJaWYgKChzay0+c2tfc3RhdGUgJiBQUFBPWF9DT05ORUNURUQpICYmIHNwLT5zYV9hZGRyLnBwcG9lLnNpZCkKKwkJZ290byBlbmQ7CisKKwkvKiBDaGVjayBmb3IgYWxyZWFkeSBkaXNjb25uZWN0ZWQgc29ja2V0cywgb24gYXR0ZW1wdHMgdG8gZGlzY29ubmVjdCAqLworCWVycm9yID0gLUVBTFJFQURZOworCWlmICgoc2stPnNrX3N0YXRlICYgUFBQT1hfREVBRCkgJiYgIXNwLT5zYV9hZGRyLnBwcG9lLnNpZCApCisJCWdvdG8gZW5kOworCisJZXJyb3IgPSAwOworCWlmIChwby0+cHBwb2VfcGEuc2lkKSB7CisJCXBwcG94X3VuYmluZF9zb2NrKHNrKTsKKworCQkvKiBEZWxldGUgdGhlIG9sZCBiaW5kaW5nICovCisJCWRlbGV0ZV9pdGVtKHBvLT5wcHBvZV9wYS5zaWQscG8tPnBwcG9lX3BhLnJlbW90ZSk7CisKKwkJaWYocG8tPnBwcG9lX2RldikKKwkJCWRldl9wdXQocG8tPnBwcG9lX2Rldik7CisKKwkJbWVtc2V0KHNrX3BwcG94KHBvKSArIDEsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHBwcG94X3NvY2spIC0gc2l6ZW9mKHN0cnVjdCBzb2NrKSk7CisKKwkJc2stPnNrX3N0YXRlID0gUFBQT1hfTk9ORTsKKwl9CisKKwkvKiBEb24ndCByZS1iaW5kIGlmIHNpZD09MCAqLworCWlmIChzcC0+c2FfYWRkci5wcHBvZS5zaWQgIT0gMCkgeworCQlkZXYgPSBkZXZfZ2V0X2J5X25hbWUoc3AtPnNhX2FkZHIucHBwb2UuZGV2KTsKKworCQllcnJvciA9IC1FTk9ERVY7CisJCWlmICghZGV2KQorCQkJZ290byBlbmQ7CisKKwkJcG8tPnBwcG9lX2RldiA9IGRldjsKKworCQlpZiAoIShkZXYtPmZsYWdzICYgSUZGX1VQKSkKKwkJCWdvdG8gZXJyX3B1dDsKKworCQltZW1jcHkoJnBvLT5wcHBvZV9wYSwKKwkJICAgICAgICZzcC0+c2FfYWRkci5wcHBvZSwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgcHBwb2VfYWRkcikpOworCisJCWVycm9yID0gc2V0X2l0ZW0ocG8pOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBlcnJfcHV0OworCisJCXBvLT5jaGFuLmhkcmxlbiA9IChzaXplb2Yoc3RydWN0IHBwcG9lX2hkcikgKworCQkJCSAgIGRldi0+aGFyZF9oZWFkZXJfbGVuKTsKKworCQlwby0+Y2hhbi5wcml2YXRlID0gc2s7CisJCXBvLT5jaGFuLm9wcyA9ICZwcHBvZV9jaGFuX29wczsKKworCQllcnJvciA9IHBwcF9yZWdpc3Rlcl9jaGFubmVsKCZwby0+Y2hhbik7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyX3B1dDsKKworCQlzay0+c2tfc3RhdGUgPSBQUFBPWF9DT05ORUNURUQ7CisJfQorCisJcG8tPm51bSA9IHNwLT5zYV9hZGRyLnBwcG9lLnNpZDsKKworIGVuZDoKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiBlcnJvcjsKK2Vycl9wdXQ6CisJaWYgKHBvLT5wcHBvZV9kZXYpIHsKKwkJZGV2X3B1dChwby0+cHBwb2VfZGV2KTsKKwkJcG8tPnBwcG9lX2RldiA9IE5VTEw7CisJfQorCWdvdG8gZW5kOworfQorCisKK3N0YXRpYyBpbnQgcHBwb2VfZ2V0bmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLAorCQkgIGludCAqdXNvY2thZGRyX2xlbiwgaW50IHBlZXIpCit7CisJaW50IGxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfcHBwb3gpOworCXN0cnVjdCBzb2NrYWRkcl9wcHBveCBzcDsKKworCXNwLnNhX2ZhbWlseQk9IEFGX1BQUE9YOworCXNwLnNhX3Byb3RvY29sCT0gUFhfUFJPVE9fT0U7CisJbWVtY3B5KCZzcC5zYV9hZGRyLnBwcG9lLCAmcHBwb3hfc2soc29jay0+c2spLT5wcHBvZV9wYSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBwcHBvZV9hZGRyKSk7CisKKwltZW1jcHkodWFkZHIsICZzcCwgbGVuKTsKKworCSp1c29ja2FkZHJfbGVuID0gbGVuOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcHBvZV9pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLAorCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcG8gPSBwcHBveF9zayhzayk7CisJaW50IHZhbCA9IDA7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUFBQSU9DR01SVToKKwkJZXJyID0gLUVOWElPOworCisJCWlmICghKHNrLT5za19zdGF0ZSAmIFBQUE9YX0NPTk5FQ1RFRCkpCisJCQlicmVhazsKKworCQllcnIgPSAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIocG8tPnBwcG9lX2Rldi0+bXR1IC0KKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBwcHBvZV9oZHIpIC0KKwkJCSAgICAgUFBQX0hEUkxFTiwKKwkJCSAgICAgKGludCBfX3VzZXIgKikgYXJnKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQSU9DU01SVToKKwkJZXJyID0gLUVOWElPOworCQlpZiAoIShzay0+c2tfc3RhdGUgJiBQUFBPWF9DT05ORUNURUQpKQorCQkJYnJlYWs7CisKKwkJZXJyID0gLUVGQVVMVDsKKwkJaWYgKGdldF91c2VyKHZhbCwoaW50IF9fdXNlciAqKSBhcmcpKQorCQkJYnJlYWs7CisKKwkJaWYgKHZhbCA8IChwby0+cHBwb2VfZGV2LT5tdHUKKwkJCSAgIC0gc2l6ZW9mKHN0cnVjdCBwcHBvZV9oZHIpCisJCQkgICAtIFBQUF9IRFJMRU4pKQorCQkJZXJyID0gMDsKKwkJZWxzZQorCQkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ1NGTEFHUzoKKwkJZXJyID0gLUVGQVVMVDsKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKikgYXJnKSkKKwkJCWJyZWFrOworCQllcnIgPSAwOworCQlicmVhazsKKworCWNhc2UgUFBQT0VJT0NTRldEOgorCXsKKwkJc3RydWN0IHBwcG94X3NvY2sgKnJlbGF5X3BvOworCisJCWVyciA9IC1FQlVTWTsKKwkJaWYgKHNrLT5za19zdGF0ZSAmIChQUFBPWF9CT1VORCB8IFBQUE9YX1pPTUJJRSB8IFBQUE9YX0RFQUQpKQorCQkJYnJlYWs7CisKKwkJZXJyID0gLUVOT1RDT05OOworCQlpZiAoIShzay0+c2tfc3RhdGUgJiBQUFBPWF9DT05ORUNURUQpKQorCQkJYnJlYWs7CisKKwkJLyogUFBQb0UgYWRkcmVzcyBmcm9tIHRoZSB1c2VyIHNwZWNpZmllcyBhbiBvdXRib3VuZAorCQkgICBQUFBvRSBhZGRyZXNzIHRvIHdoaWNoIGZyYW1lcyBhcmUgZm9yd2FyZGVkIHRvICovCisJCWVyciA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcG8tPnBwcG9lX3JlbGF5LAorCQkJCSAgICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3BwcG94KSkpCisJCQlicmVhazsKKworCQllcnIgPSAtRUlOVkFMOworCQlpZiAocG8tPnBwcG9lX3JlbGF5LnNhX2ZhbWlseSAhPSBBRl9QUFBPWCB8fAorCQkgICAgcG8tPnBwcG9lX3JlbGF5LnNhX3Byb3RvY29sIT0gUFhfUFJPVE9fT0UpCisJCQlicmVhazsKKworCQkvKiBDaGVjayB0aGF0IHRoZSBzb2NrZXQgcmVmZXJlbmNlZCBieSB0aGUgYWRkcmVzcworCQkgICBhY3R1YWxseSBleGlzdHMuICovCisJCXJlbGF5X3BvID0gZ2V0X2l0ZW1fYnlfYWRkcigmcG8tPnBwcG9lX3JlbGF5KTsKKworCQlpZiAoIXJlbGF5X3BvKQorCQkJYnJlYWs7CisKKwkJc29ja19wdXQoc2tfcHBwb3gocmVsYXlfcG8pKTsKKwkJc2stPnNrX3N0YXRlIHw9IFBQUE9YX1JFTEFZOworCQllcnIgPSAwOworCQlicmVhazsKKwl9CisKKwljYXNlIFBQUE9FSU9DREZXRDoKKwkJZXJyID0gLUVBTFJFQURZOworCQlpZiAoIShzay0+c2tfc3RhdGUgJiBQUFBPWF9SRUxBWSkpCisJCQlicmVhazsKKworCQlzay0+c2tfc3RhdGUgJj0gflBQUE9YX1JFTEFZOworCQllcnIgPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6OworCX07CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgcHBwb2Vfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIAorCQkgIHN0cnVjdCBtc2doZHIgKm0sIHNpemVfdCB0b3RhbF9sZW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHBwcG94X3NvY2sgKnBvID0gcHBwb3hfc2soc2spOworCWludCBlcnJvciA9IDA7CisJc3RydWN0IHBwcG9lX2hkciBoZHI7CisJc3RydWN0IHBwcG9lX2hkciAqcGg7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwljaGFyICpzdGFydDsKKworCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkgfHwgIShzay0+c2tfc3RhdGUgJiBQUFBPWF9DT05ORUNURUQpKSB7CisJCWVycm9yID0gLUVOT1RDT05OOworCQlnb3RvIGVuZDsKKwl9CisKKwloZHIudmVyID0gMTsKKwloZHIudHlwZSA9IDE7CisJaGRyLmNvZGUgPSAwOworCWhkci5zaWQgPSBwby0+bnVtOworCisJbG9ja19zb2NrKHNrKTsKKworCWRldiA9IHBvLT5wcHBvZV9kZXY7CisKKwllcnJvciA9IC1FTVNHU0laRTsKKyAJaWYgKHRvdGFsX2xlbiA+IChkZXYtPm10dSArIGRldi0+aGFyZF9oZWFkZXJfbGVuKSkKKwkJZ290byBlbmQ7CisKKworCXNrYiA9IHNvY2tfd21hbGxvYyhzaywgdG90YWxfbGVuICsgZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyAzMiwKKwkJCSAgIDAsIEdGUF9LRVJORUwpOworCWlmICghc2tiKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlbmQ7CisJfQorCisJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgaGVhZGVycy4gKi8KKwlza2JfcmVzZXJ2ZShza2IsIGRldi0+aGFyZF9oZWFkZXJfbGVuKTsKKwlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKworCXNrYi0+ZGV2ID0gZGV2OworCisJc2tiLT5wcmlvcml0eSA9IHNrLT5za19wcmlvcml0eTsKKwlza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9QUFBfU0VTKTsKKworCXBoID0gKHN0cnVjdCBwcHBvZV9oZHIgKikgc2tiX3B1dChza2IsIHRvdGFsX2xlbiArIHNpemVvZihzdHJ1Y3QgcHBwb2VfaGRyKSk7CisJc3RhcnQgPSAoY2hhciAqKSAmcGgtPnRhZ1swXTsKKworCWVycm9yID0gbWVtY3B5X2Zyb21pb3ZlYyhzdGFydCwgbS0+bXNnX2lvdiwgdG90YWxfbGVuKTsKKworCWlmIChlcnJvciA8IDApIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCWdvdG8gZW5kOworCX0KKworCWVycm9yID0gdG90YWxfbGVuOworCWRldi0+aGFyZF9oZWFkZXIoc2tiLCBkZXYsIEVUSF9QX1BQUF9TRVMsCisJCQkgcG8tPnBwcG9lX3BhLnJlbW90ZSwgTlVMTCwgdG90YWxfbGVuKTsKKworCW1lbWNweShwaCwgJmhkciwgc2l6ZW9mKHN0cnVjdCBwcHBvZV9oZHIpKTsKKworCXBoLT5sZW5ndGggPSBodG9ucyh0b3RhbF9sZW4pOworCisJZGV2X3F1ZXVlX3htaXQoc2tiKTsKKworZW5kOgorCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycm9yOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB4bWl0IGZ1bmN0aW9uIGZvciBpbnRlcm5hbCB1c2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBfX3BwcG9lX3htaXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBwcHBveF9zb2NrICpwbyA9IHBwcG94X3NrKHNrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG8tPnBwcG9lX2RldjsKKwlzdHJ1Y3QgcHBwb2VfaGRyIGhkcjsKKwlzdHJ1Y3QgcHBwb2VfaGRyICpwaDsKKwlpbnQgaGVhZHJvb20gPSBza2JfaGVhZHJvb20oc2tiKTsKKwlpbnQgZGF0YV9sZW4gPSBza2ItPmxlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKKworCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkgfHwgIShzay0+c2tfc3RhdGUgJiBQUFBPWF9DT05ORUNURUQpKQorCQlnb3RvIGFib3J0OworCisJaGRyLnZlcgk9IDE7CisJaGRyLnR5cGUgPSAxOworCWhkci5jb2RlID0gMDsKKwloZHIuc2lkCT0gcG8tPm51bTsKKwloZHIubGVuZ3RoID0gaHRvbnMoc2tiLT5sZW4pOworCisJaWYgKCFkZXYpCisJCWdvdG8gYWJvcnQ7CisKKwkvKiBDb3B5IHRoZSBza2IgaWYgdGhlcmUgaXMgbm8gc3BhY2UgZm9yIHRoZSBoZWFkZXIuICovCisJaWYgKGhlYWRyb29tIDwgKHNpemVvZihzdHJ1Y3QgcHBwb2VfaGRyKSArIGRldi0+aGFyZF9oZWFkZXJfbGVuKSkgeworCQlza2IyID0gZGV2X2FsbG9jX3NrYigzMitza2ItPmxlbiArCisJCQkJICAgICBzaXplb2Yoc3RydWN0IHBwcG9lX2hkcikgKworCQkJCSAgICAgZGV2LT5oYXJkX2hlYWRlcl9sZW4pOworCisJCWlmIChza2IyID09IE5VTEwpCisJCQlnb3RvIGFib3J0OworCisJCXNrYl9yZXNlcnZlKHNrYjIsIGRldi0+aGFyZF9oZWFkZXJfbGVuICsgc2l6ZW9mKHN0cnVjdCBwcHBvZV9oZHIpKTsKKwkJbWVtY3B5KHNrYl9wdXQoc2tiMiwgc2tiLT5sZW4pLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwl9IGVsc2UgeworCQkvKiBNYWtlIGEgY2xvbmUgc28gYXMgdG8gbm90IGRpc3R1cmIgdGhlIG9yaWdpbmFsIHNrYiwKKwkJICogZ2l2ZSBkZXZfcXVldWVfeG1pdCBzb21ldGhpbmcgaXQgY2FuIGZyZWUuCisJCSAqLworCQlza2IyID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJfQorCisJcGggPSAoc3RydWN0IHBwcG9lX2hkciAqKSBza2JfcHVzaChza2IyLCBzaXplb2Yoc3RydWN0IHBwcG9lX2hkcikpOworCW1lbWNweShwaCwgJmhkciwgc2l6ZW9mKHN0cnVjdCBwcHBvZV9oZHIpKTsKKwlza2IyLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfUFBQX1NFUyk7CisKKwlza2IyLT5uaC5yYXcgPSBza2IyLT5kYXRhOworCisJc2tiMi0+ZGV2ID0gZGV2OworCisJZGV2LT5oYXJkX2hlYWRlcihza2IyLCBkZXYsIEVUSF9QX1BQUF9TRVMsCisJCQkgcG8tPnBwcG9lX3BhLnJlbW90ZSwgTlVMTCwgZGF0YV9sZW4pOworCisJLyogV2UncmUgdHJhbnNtaXR0aW5nIHNrYjIsIGFuZCBhc3N1bWluZyB0aGF0IGRldl9xdWV1ZV94bWl0CisJICogd2lsbCBmcmVlIGl0LiAgVGhlIGdlbmVyaWMgcHBwIGxheWVyIGhvd2V2ZXIsIGlzIGV4cGVjdGluZworCSAqIHRoYXQgd2UgZ2l2ZSBiYWNrICdza2InIChub3QgJ3NrYjInKSBpbiBjYXNlIG9mIGZhaWx1cmUsCisJICogYnV0IGZyZWUgaXQgaW4gY2FzZSBvZiBzdWNjZXNzLgorCSAqLworCisJaWYgKGRldl9xdWV1ZV94bWl0KHNrYjIpIDwgMCkKKwkJZ290byBhYm9ydDsKKworCWtmcmVlX3NrYihza2IpOworCXJldHVybiAxOworCithYm9ydDoKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogeG1pdCBmdW5jdGlvbiBjYWxsZWQgYnkgZ2VuZXJpYyBQUFAgZHJpdmVyCisgKiBzZW5kcyBQUFAgZnJhbWUgb3ZlciBQUFBvRSBzb2NrZXQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHBwcG9lX3htaXQoc3RydWN0IHBwcF9jaGFubmVsICpjaGFuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBzb2NrICpzayA9IChzdHJ1Y3Qgc29jayAqKSBjaGFuLT5wcml2YXRlOworCXJldHVybiBfX3BwcG9lX3htaXQoc2ssIHNrYik7Cit9CisKKworc3RhdGljIHN0cnVjdCBwcHBfY2hhbm5lbF9vcHMgcHBwb2VfY2hhbl9vcHMgPSB7IAorCS5zdGFydF94bWl0ID0gcHBwb2VfeG1pdCwgCit9OworCitzdGF0aWMgaW50IHBwcG9lX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkgIHN0cnVjdCBtc2doZHIgKm0sIHNpemVfdCB0b3RhbF9sZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlpbnQgZXJyb3IgPSAwOworCWludCBsZW47CisJc3RydWN0IHBwcG9lX2hkciAqcGggPSBOVUxMOworCisJaWYgKHNrLT5za19zdGF0ZSAmIFBQUE9YX0JPVU5EKSB7CisJCWVycm9yID0gLUVJTzsKKwkJZ290byBlbmQ7CisJfQorCisJc2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc2ssIGZsYWdzICYgfk1TR19ET05UV0FJVCwKKwkJCQlmbGFncyAmIE1TR19ET05UV0FJVCwgJmVycm9yKTsKKworCWlmIChlcnJvciA8IDApIHsKKwkJZ290byBlbmQ7CisJfQorCisJbS0+bXNnX25hbWVsZW4gPSAwOworCisJaWYgKHNrYikgeworCQllcnJvciA9IDA7CisJCXBoID0gKHN0cnVjdCBwcHBvZV9oZHIgKikgc2tiLT5uaC5yYXc7CisJCWxlbiA9IG50b2hzKHBoLT5sZW5ndGgpOworCisJCWVycm9yID0gbWVtY3B5X3RvaW92ZWMobS0+bXNnX2lvdiwgKHVuc2lnbmVkIGNoYXIgKikgJnBoLT50YWdbMF0sIGxlbik7CisJCWlmIChlcnJvciA8IDApCisJCQlnb3RvIGRvX3NrYl9mcmVlOworCQllcnJvciA9IGxlbjsKKwl9CisKK2RvX3NrYl9mcmVlOgorCWlmIChza2IpCisJCWtmcmVlX3NrYihza2IpOworZW5kOgorCXJldHVybiBlcnJvcjsKK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgaW50IHBwcG9lX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBwcHBveF9zb2NrICpwbzsKKwljaGFyICpkZXZfbmFtZTsKKworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzZXFfcHV0cyhzZXEsICJJZCAgICAgICBBZGRyZXNzICAgICAgICAgICAgICBEZXZpY2VcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlwbyA9IHY7CisJZGV2X25hbWUgPSBwby0+cHBwb2VfcGEuZGV2OworCisJc2VxX3ByaW50ZihzZXEsICIlMDhYICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYICU4c1xuIiwKKwkJICAgcG8tPnBwcG9lX3BhLnNpZCwKKwkJICAgcG8tPnBwcG9lX3BhLnJlbW90ZVswXSwgcG8tPnBwcG9lX3BhLnJlbW90ZVsxXSwKKwkJICAgcG8tPnBwcG9lX3BhLnJlbW90ZVsyXSwgcG8tPnBwcG9lX3BhLnJlbW90ZVszXSwKKwkJICAgcG8tPnBwcG9lX3BhLnJlbW90ZVs0XSwgcG8tPnBwcG9lX3BhLnJlbW90ZVs1XSwgZGV2X25hbWUpOworb3V0OgorCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgcHBwb3hfc29jayAqcHBwb2VfZ2V0X2lkeChsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBwcHBveF9zb2NrICpwbyA9IE5VTEw7CisJaW50IGkgPSAwOworCisJZm9yICg7IGkgPCBQUFBPRV9IQVNIX1NJWkU7IGkrKykgeworCQlwbyA9IGl0ZW1faGFzaF90YWJsZVtpXTsKKwkJd2hpbGUgKHBvKSB7CisJCQlpZiAoIXBvcy0tKQorCQkJCWdvdG8gb3V0OworCQkJcG8gPSBwby0+bmV4dDsKKwkJfQorCX0KK291dDoKKwlyZXR1cm4gcG87Cit9CisKK3N0YXRpYyB2b2lkICpwcHBvZV9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCWxvZmZfdCBsID0gKnBvczsKKworCXJlYWRfbG9ja19iaCgmcHBwb2VfaGFzaF9sb2NrKTsKKwlyZXR1cm4gbCA/IHBwcG9lX2dldF9pZHgoLS1sKSA6IFNFUV9TVEFSVF9UT0tFTjsKK30KKworc3RhdGljIHZvaWQgKnBwcG9lX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcG87CisKKwkrKypwb3M7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CisJCXBvID0gcHBwb2VfZ2V0X2lkeCgwKTsKKwkJZ290byBvdXQ7CisJfQorCXBvID0gdjsKKwlpZiAocG8tPm5leHQpIAorCQlwbyA9IHBvLT5uZXh0OworCWVsc2UgeworCQlpbnQgaGFzaCA9IGhhc2hfaXRlbShwby0+cHBwb2VfcGEuc2lkLCBwby0+cHBwb2VfcGEucmVtb3RlKTsKKworCQl3aGlsZSAoKytoYXNoIDwgUFBQT0VfSEFTSF9TSVpFKSB7CisJCQlwbyA9IGl0ZW1faGFzaF90YWJsZVtoYXNoXTsKKwkJCWlmIChwbykKKwkJCQlicmVhazsKKwkJfQorCX0KK291dDoKKwlyZXR1cm4gcG87Cit9CisKK3N0YXRpYyB2b2lkIHBwcG9lX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXJlYWRfdW5sb2NrX2JoKCZwcHBvZV9oYXNoX2xvY2spOworfQorCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHBwcG9lX3NlcV9vcHMgPSB7CisJLnN0YXJ0CQk9IHBwcG9lX3NlcV9zdGFydCwKKwkubmV4dAkJPSBwcHBvZV9zZXFfbmV4dCwKKwkuc3RvcAkJPSBwcHBvZV9zZXFfc3RvcCwKKwkuc2hvdwkJPSBwcHBvZV9zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQgcHBwb2Vfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZwcHBvZV9zZXFfb3BzKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHBwb2Vfc2VxX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHBwcG9lX3NlcV9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwcHBvZV9wcm9jX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnA7CisKKwlwID0gY3JlYXRlX3Byb2NfZW50cnkoInBwcG9lIiwgU19JUlVHTywgcHJvY19uZXQpOworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwLT5wcm9jX2ZvcHMgPSAmcHBwb2Vfc2VxX2ZvcHM7CisJcmV0dXJuIDA7Cit9CisjZWxzZSAvKiBDT05GSUdfUFJPQ19GUyAqLworc3RhdGljIGlubGluZSBpbnQgcHBwb2VfcHJvY19pbml0KHZvaWQpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCisvKiAtPmlvY3RsIGFyZSBzZXQgYXQgcHBwb3hfY3JlYXRlICovCisKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIHBwcG9lX29wcyA9IHsKKyAgICAuZmFtaWx5CQk9IEFGX1BQUE9YLAorICAgIC5vd25lcgkJPSBUSElTX01PRFVMRSwKKyAgICAucmVsZWFzZQkJPSBwcHBvZV9yZWxlYXNlLAorICAgIC5iaW5kCQk9IHNvY2tfbm9fYmluZCwKKyAgICAuY29ubmVjdAkJPSBwcHBvZV9jb25uZWN0LAorICAgIC5zb2NrZXRwYWlyCQk9IHNvY2tfbm9fc29ja2V0cGFpciwKKyAgICAuYWNjZXB0CQk9IHNvY2tfbm9fYWNjZXB0LAorICAgIC5nZXRuYW1lCQk9IHBwcG9lX2dldG5hbWUsCisgICAgLnBvbGwJCT0gZGF0YWdyYW1fcG9sbCwKKyAgICAubGlzdGVuCQk9IHNvY2tfbm9fbGlzdGVuLAorICAgIC5zaHV0ZG93bgkJPSBzb2NrX25vX3NodXRkb3duLAorICAgIC5zZXRzb2Nrb3B0CQk9IHNvY2tfbm9fc2V0c29ja29wdCwKKyAgICAuZ2V0c29ja29wdAkJPSBzb2NrX25vX2dldHNvY2tvcHQsCisgICAgLnNlbmRtc2cJCT0gcHBwb2Vfc2VuZG1zZywKKyAgICAucmVjdm1zZwkJPSBwcHBvZV9yZWN2bXNnLAorICAgIC5tbWFwCQk9IHNvY2tfbm9fbW1hcAorfTsKKworc3RhdGljIHN0cnVjdCBwcHBveF9wcm90byBwcHBvZV9wcm90byA9IHsKKyAgICAuY3JlYXRlCT0gcHBwb2VfY3JlYXRlLAorICAgIC5pb2N0bAk9IHBwcG9lX2lvY3RsLAorICAgIC5vd25lcgk9IFRISVNfTU9EVUxFLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBwcHBvZV9pbml0KHZvaWQpCit7CisJaW50IGVyciA9IHByb3RvX3JlZ2lzdGVyKCZwcHBvZV9za19wcm90bywgMCk7CisKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworIAllcnIgPSByZWdpc3Rlcl9wcHBveF9wcm90byhQWF9QUk9UT19PRSwgJnBwcG9lX3Byb3RvKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bnJlZ2lzdGVyX3BwcG9lX3Byb3RvOworCisJZXJyID0gcHBwb2VfcHJvY19pbml0KCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5yZWdpc3Rlcl9wcHBveF9wcm90bzsKKwkKKwlkZXZfYWRkX3BhY2soJnBwcG9lc19wdHlwZSk7CisJZGV2X2FkZF9wYWNrKCZwcHBvZWRfcHR5cGUpOworCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmcHBwb2Vfbm90aWZpZXIpOworb3V0OgorCXJldHVybiBlcnI7CitvdXRfdW5yZWdpc3Rlcl9wcHBveF9wcm90bzoKKwl1bnJlZ2lzdGVyX3BwcG94X3Byb3RvKFBYX1BST1RPX09FKTsKK291dF91bnJlZ2lzdGVyX3BwcG9lX3Byb3RvOgorCXByb3RvX3VucmVnaXN0ZXIoJnBwcG9lX3NrX3Byb3RvKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBwcG9lX2V4aXQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX3BwcG94X3Byb3RvKFBYX1BST1RPX09FKTsKKwlkZXZfcmVtb3ZlX3BhY2soJnBwcG9lc19wdHlwZSk7CisJZGV2X3JlbW92ZV9wYWNrKCZwcHBvZWRfcHR5cGUpOworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZwcHBvZV9ub3RpZmllcik7CisJcmVtb3ZlX3Byb2NfZW50cnkoInBwcG9lIiwgcHJvY19uZXQpOworCXByb3RvX3VucmVnaXN0ZXIoJnBwcG9lX3NrX3Byb3RvKTsKK30KKworbW9kdWxlX2luaXQocHBwb2VfaW5pdCk7Cittb2R1bGVfZXhpdChwcHBvZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWljaGFsIE9zdHJvd3NraSA8bW9zdHJvd3NAc3BlYWtlYXN5Lm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUFBQIG92ZXIgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTkVUUFJPVE8oUEZfUFBQT1gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwb3guYyBiL2RyaXZlcnMvbmV0L3BwcG94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMxZTExNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BwcG94LmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qKiAtKi0gbGludXgtYyAtKi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpbnV4IFBQUCBvdmVyIFgvRXRoZXJuZXQgKFBQUG9YL1BQUG9FKSBTb2NrZXRzCisgKgorICogUFBQb1ggLS0tIEdlbmVyaWMgUFBQIGVuY2Fwc3VsYXRpb24gc29ja2V0IGZhbWlseQorICogUFBQb0UgLS0tIFBQUCBvdmVyIEV0aGVybmV0IChSRkMgMjUxNikKKyAqCisgKgorICogVmVyc2lvbjoJMC41LjIKKyAqCisgKiBBdXRob3I6CU1pY2hhbCBPc3Ryb3dza2kgPG1vc3Ryb3dzQHNwZWFrZWFzeS5uZXQ+CisgKgorICogMDUxMDAwIDoJSW5pdGlhbGl6YXRpb24gY2xlYW51cAorICoKKyAqIExpY2Vuc2U6CisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wcHBveC5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcF9kZWZzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcHBwLmg+CisjaW5jbHVkZSA8bGludXgvcHBwX2NoYW5uZWwuaD4KKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgc3RydWN0IHBwcG94X3Byb3RvICpwcHBveF9wcm90b3NbUFhfTUFYX1BST1RPICsgMV07CisKK2ludCByZWdpc3Rlcl9wcHBveF9wcm90byhpbnQgcHJvdG9fbnVtLCBzdHJ1Y3QgcHBwb3hfcHJvdG8gKnBwKQoreworCWlmIChwcm90b19udW0gPCAwIHx8IHByb3RvX251bSA+IFBYX01BWF9QUk9UTykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBwcG94X3Byb3Rvc1twcm90b19udW1dKQorCQlyZXR1cm4gLUVBTFJFQURZOworCXBwcG94X3Byb3Rvc1twcm90b19udW1dID0gcHA7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdW5yZWdpc3Rlcl9wcHBveF9wcm90byhpbnQgcHJvdG9fbnVtKQoreworCWlmIChwcm90b19udW0gPj0gMCAmJiBwcm90b19udW0gPD0gUFhfTUFYX1BST1RPKQorCQlwcHBveF9wcm90b3NbcHJvdG9fbnVtXSA9IE5VTEw7Cit9CisKK3ZvaWQgcHBwb3hfdW5iaW5kX3NvY2soc3RydWN0IHNvY2sgKnNrKQoreworCS8qIENsZWFyIGNvbm5lY3Rpb24gdG8gcHBwIGRldmljZSwgaWYgYXR0YWNoZWQuICovCisKKwlpZiAoc2stPnNrX3N0YXRlICYgKFBQUE9YX0JPVU5EIHwgUFBQT1hfWk9NQklFKSkgeworCQlwcHBfdW5yZWdpc3Rlcl9jaGFubmVsKCZwcHBveF9zayhzayktPmNoYW4pOworCQlzay0+c2tfc3RhdGUgPSBQUFBPWF9ERUFEOworCX0KK30KKworRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9wcHBveF9wcm90byk7CitFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfcHBwb3hfcHJvdG8pOworRVhQT1JUX1NZTUJPTChwcHBveF91bmJpbmRfc29jayk7CisKK3N0YXRpYyBpbnQgcHBwb3hfaW9jdGwoc3RydWN0IHNvY2tldCogc29jaywgdW5zaWduZWQgaW50IGNtZCwgCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcG8gPSBwcHBveF9zayhzayk7CisJaW50IHJjID0gMDsKKworCWxvY2tfc29jayhzayk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgUFBQSU9DR0NIQU46IHsKKwkJaW50IGluZGV4OworCQlyYyA9IC1FTk9UQ09OTjsKKwkJaWYgKCEoc2stPnNrX3N0YXRlICYgUFBQT1hfQ09OTkVDVEVEKSkKKwkJCWJyZWFrOworCisJCXJjID0gLUVJTlZBTDsKKwkJaW5kZXggPSBwcHBfY2hhbm5lbF9pbmRleCgmcG8tPmNoYW4pOworCQlpZiAocHV0X3VzZXIoaW5kZXggLCAoaW50IF9fdXNlciAqKSBhcmcpKQorCQkJYnJlYWs7CisKKwkJcmMgPSAwOworCQlzay0+c2tfc3RhdGUgfD0gUFBQT1hfQk9VTkQ7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlpZiAocHBwb3hfcHJvdG9zW3NrLT5za19wcm90b2NvbF0tPmlvY3RsKQorCQkJcmMgPSBwcHBveF9wcm90b3Nbc2stPnNrX3Byb3RvY29sXS0+aW9jdGwoc29jaywgY21kLAorCQkJCQkJCQkgIGFyZyk7CisKKwkJYnJlYWs7CisJfTsKKworCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBpbnQgcHBwb3hfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCkKK3sKKwlpbnQgcmMgPSAtRVBST1RPVFlQRTsKKworCWlmIChwcm90b2NvbCA8IDAgfHwgcHJvdG9jb2wgPiBQWF9NQVhfUFJPVE8pCisJCWdvdG8gb3V0OworCisJcmMgPSAtRVBST1RPTk9TVVBQT1JUOworCWlmICghcHBwb3hfcHJvdG9zW3Byb3RvY29sXSB8fAorCSAgICAhdHJ5X21vZHVsZV9nZXQocHBwb3hfcHJvdG9zW3Byb3RvY29sXS0+b3duZXIpKQorCQlnb3RvIG91dDsKKworCXJjID0gcHBwb3hfcHJvdG9zW3Byb3RvY29sXS0+Y3JlYXRlKHNvY2spOworCWlmICghcmMpIHsKKwkJLyogV2UgZ2V0IHRvIHNldCB0aGUgaW9jdGwgaGFuZGxlci4gKi8KKwkJLyogRm9yIGV2ZXJ5dGhpbmcgZWxzZSwgcHBwb3ggaXMganVzdCBhIHNoZWxsLiAqLworCQlzb2NrLT5vcHMtPmlvY3RsID0gcHBwb3hfaW9jdGw7CisJfQorCW1vZHVsZV9wdXQocHBwb3hfcHJvdG9zW3Byb3RvY29sXS0+b3duZXIpOworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9fZmFtaWx5IHBwcG94X3Byb3RvX2ZhbWlseSA9IHsKKwkuZmFtaWx5CT0gUEZfUFBQT1gsCisJLmNyZWF0ZQk9IHBwcG94X2NyZWF0ZSwKKwkub3duZXIJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBwcG94X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc29ja19yZWdpc3RlcigmcHBwb3hfcHJvdG9fZmFtaWx5KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBwcG94X2V4aXQodm9pZCkKK3sKKwlzb2NrX3VucmVnaXN0ZXIoUEZfUFBQT1gpOworfQorCittb2R1bGVfaW5pdChwcHBveF9pbml0KTsKK21vZHVsZV9leGl0KHBwcG94X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNaWNoYWwgT3N0cm93c2tpIDxtb3N0cm93c0BzcGVha2Vhc3kubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQUFAgb3ZlciBFdGhlcm5ldCBkcml2ZXIgKGdlbmVyaWMgc29ja2V0IGxheWVyKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcjgxNjkuYyBiL2RyaXZlcnMvbmV0L3I4MTY5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0ZTRmZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3I4MTY5LmMKQEAgLTAsMCArMSwyNTIzIEBACisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIHI4MTY5LmM6IEEgUmVhbFRlayBSVEwtODE2OSBHaWdhYml0IEV0aGVybmV0IGRyaXZlciBmb3IgTGludXgga2VybmVsIDIuNC54LgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyBIaXN0b3J5OgorIEZlYiAgNCAyMDAyCS0gY3JlYXRlZCBpbml0aWFsbHkgYnkgU2h1Q2hlbiA8c2h1Y2hlbkByZWFsdGVrLmNvbS50dz4uCisgTWF5IDIwIDIwMDIJLSBBZGQgbGluayBzdGF0dXMgZm9yY2UtbW9kZSBhbmQgVEJJIG1vZGUgc3VwcG9ydC4KKyAgICAgICAgMjAwNAktIE1hc3NpdmUgdXBkYXRlcy4gU2VlIGtlcm5lbCBTQ00gc3lzdGVtIGZvciBkZXRhaWxzLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAxLiBbREVQUkVDQVRFRDogdXNlIGV0aHRvb2wgaW5zdGVhZF0gVGhlIG1lZGlhIGNhbiBiZSBmb3JjZWQgaW4gNSBtb2Rlcy4KKwkgQ29tbWFuZDogJ2luc21vZCByODE2OSBtZWRpYSA9IFNFVF9NRURJQScKKwkgRXg6CSAgJ2luc21vZCByODE2OSBtZWRpYSA9IDB4MDQnIHdpbGwgZm9yY2UgUEhZIHRvIG9wZXJhdGUgaW4gMTAwTXBicyBIYWxmLWR1cGxleC4KKwkKKwkgU0VUX01FRElBIGNhbiBiZToKKyAJCV8xMF9IYWxmCT0gMHgwMQorIAkJXzEwX0Z1bGwJPSAweDAyCisgCQlfMTAwX0hhbGYJPSAweDA0CisgCQlfMTAwX0Z1bGwJPSAweDA4CisgCQlfMTAwMF9GdWxsCT0gMHgxMAorICAKKyAgMi4gU3VwcG9ydCBUQkkgbW9kZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1ZFUlNJT04gMS4xCTwyMDAyLzEwLzQ+CisKKwlUaGUgYml0NDowIG9mIE1JSSByZWdpc3RlciA0IGlzIGNhbGxlZCAic2VsZWN0b3IgZmllbGQiLCBhbmQgaGF2ZSB0byBiZQorCTAwMDAxYiB0byBpbmRpY2F0ZSBzdXBwb3J0IG9mIElFRUUgc3RkIDgwMi4zIGR1cmluZyBOV2F5IHByb2Nlc3Mgb2YKKwlleGNoYW5naW5nIExpbmsgQ29kZSBXb3JkIChGTFApLiAKKworVkVSU0lPTiAxLjIJPDIwMDIvMTEvMzA+CisKKwktIExhcmdlIHN0eWxlIGNsZWFudXAKKwktIFVzZSBldGhlcl9jcmMgaW4gc3RvY2sga2VybmVsIChsaW51eC9jcmMzMi5oKQorCS0gQ29weSBtY19maWx0ZXIgc2V0dXAgY29kZSBmcm9tIDgxMzljcAorCSAgKGluY2x1ZGVzIGFuIG9wdGltaXphdGlvbiwgYW5kIGF2b2lkcyBzZXRfYml0IHVzZSkKKworVkVSU0lPTiAxLjZMSwk8MjAwNC8wNC8xND4KKworCS0gTWVyZ2Ugb2YgUmVhbHRlaydzIHZlcnNpb24gMS42CisJLSBDb252ZXJzaW9uIHRvIERNQSBBUEkKKwktIFN1c3BlbmQvcmVzdW1lCisJLSBFbmRpYW5uZXNzCisJLSBNaXNjIFJ4L1R4IGJ1Z3MKKworVkVSU0lPTiAyLjJMSwk8MjAwNS8wMS8yNT4KKworCS0gUlggY3N1bSwgVFggY3N1bS9TRywgVFNPCisJLSBWTEFOCisJLSBiYWJ5ICg8IDcyMDApIEp1bWJvIGZyYW1lcyBzdXBwb3J0CisJLSBNZXJnZSBvZiBSZWFsdGVrJ3MgdmVyc2lvbiAyLjIgKG5ldyBwaHkpCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNkZWZpbmUgUlRMODE2OV9WRVJTSU9OICIyLjJMSyIKKyNkZWZpbmUgTU9EVUxFTkFNRSAicjgxNjkiCisjZGVmaW5lIFBGWCBNT0RVTEVOQU1FICI6ICIKKworI2lmZGVmIFJUTDgxNjlfREVCVUcKKyNkZWZpbmUgYXNzZXJ0KGV4cHIpIFwKKyAgICAgICAgaWYoIShleHByKSkgewkJCQkJXAorCSAgICAgICAgcHJpbnRrKCAiQXNzZXJ0aW9uIGZhaWxlZCEgJXMsJXMsJXMsbGluZT0lZFxuIiwJXAorICAgICAgICAJI2V4cHIsX19GSUxFX18sX19GVU5DVElPTl9fLF9fTElORV9fKTsJCVwKKyAgICAgICAgfQorI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJncy4uLikJZG8geyBwcmludGsoUEZYIGZtdCwgIyMgYXJncyk7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBhc3NlcnQoZXhwcikgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmdzLi4uKQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBSVEw4MTY5X0RFQlVHICovCisKKyNkZWZpbmUgVFhfQlVGRlNfQVZBSUwodHApIFwKKwkodHAtPmRpcnR5X3R4ICsgTlVNX1RYX0RFU0MgLSB0cC0+Y3VyX3R4IC0gMSkKKworI2lmZGVmIENPTkZJR19SODE2OV9OQVBJCisjZGVmaW5lIHJ0bDgxNjlfcnhfc2tiCQkJbmV0aWZfcmVjZWl2ZV9za2IKKyNkZWZpbmUgcnRsODE2OV9yeF9od2FjY2VsX3NrYgkJdmxhbl9od2FjY2VsX3J4CisjZGVmaW5lIHJ0bDgxNjlfcnhfcXVvdGEoY291bnQsIHF1b3RhKQltaW4oY291bnQsIHF1b3RhKQorI2Vsc2UKKyNkZWZpbmUgcnRsODE2OV9yeF9za2IJCQluZXRpZl9yeAorI2RlZmluZSBydGw4MTY5X3J4X2h3YWNjZWxfc2tiCQl2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2IKKyNkZWZpbmUgcnRsODE2OV9yeF9xdW90YShjb3VudCwgcXVvdGEpCWNvdW50CisjZW5kaWYKKworLyogbWVkaWEgb3B0aW9ucyAqLworI2RlZmluZSBNQVhfVU5JVFMgOAorc3RhdGljIGludCBtZWRpYVtNQVhfVU5JVFNdID0geyAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfTsKK3N0YXRpYyBpbnQgbnVtX21lZGlhID0gMDsKKworLyogTWF4aW11bSBldmVudHMgKFJ4IHBhY2tldHMsIGV0Yy4pIHRvIGhhbmRsZSBhdCBlYWNoIGludGVycnVwdC4gKi8KK3N0YXRpYyBpbnQgbWF4X2ludGVycnVwdF93b3JrID0gMjA7CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIG11bHRpY2FzdCBhZGRyZXNzZXMgdG8gZmlsdGVyICh2cy4gUngtYWxsLW11bHRpY2FzdCkuCisgICBUaGUgUlRMIGNoaXBzIHVzZSBhIDY0IGVsZW1lbnQgaGFzaCB0YWJsZSBiYXNlZCBvbiB0aGUgRXRoZXJuZXQgQ1JDLiAqLworc3RhdGljIGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gMzI7CisKKy8qIE1BQyBhZGRyZXNzIGxlbmd0aCAqLworI2RlZmluZSBNQUNfQUREUl9MRU4JNgorCisjZGVmaW5lIFJYX0ZJRk9fVEhSRVNICTcJLyogNyBtZWFucyBOTyB0aHJlc2hvbGQsIFJ4IGJ1ZmZlciBsZXZlbCBiZWZvcmUgZmlyc3QgUENJIHhmZXIuICovCisjZGVmaW5lIFJYX0RNQV9CVVJTVAk2CS8qIE1heGltdW0gUENJIGJ1cnN0LCAnNicgaXMgMTAyNCAqLworI2RlZmluZSBUWF9ETUFfQlVSU1QJNgkvKiBNYXhpbXVtIFBDSSBidXJzdCwgJzYnIGlzIDEwMjQgKi8KKyNkZWZpbmUgRWFybHlUeFRobGQgCTB4M0YJLyogMHgzRiBtZWFucyBOTyBlYXJseSB0cmFuc21pdCAqLworI2RlZmluZSBSeFBhY2tldE1heFNpemUJMHgzRkU4CS8qIDE2SyAtIDEgLSBFVEhfSExFTiAtIFZMQU4gLSBDUkMuLi4gKi8KKyNkZWZpbmUgU2FmZU10dQkJMHgxYzIwCS8qIC4uLiBhY3R1YWxseSBsaWZlIHN1Y2tzIGJleW9uZCB+N2sgKi8KKyNkZWZpbmUgSW50ZXJGcmFtZUdhcAkweDAzCS8qIDMgbWVhbnMgSW50ZXJGcmFtZUdhcCA9IHRoZSBzaG9ydGVzdCBvbmUgKi8KKworI2RlZmluZSBSODE2OV9SRUdTX1NJWkUJCTI1NgorI2RlZmluZSBSODE2OV9OQVBJX1dFSUdIVAk2NAorI2RlZmluZSBOVU1fVFhfREVTQwk2NAkvKiBOdW1iZXIgb2YgVHggZGVzY3JpcHRvciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTlVNX1JYX0RFU0MJMjU2CS8qIE51bWJlciBvZiBSeCBkZXNjcmlwdG9yIHJlZ2lzdGVycyAqLworI2RlZmluZSBSWF9CVUZfU0laRQkxNTM2CS8qIFJ4IEJ1ZmZlciBzaXplICovCisjZGVmaW5lIFI4MTY5X1RYX1JJTkdfQllURVMJKE5VTV9UWF9ERVNDICogc2l6ZW9mKHN0cnVjdCBUeERlc2MpKQorI2RlZmluZSBSODE2OV9SWF9SSU5HX0JZVEVTCShOVU1fUlhfREVTQyAqIHNpemVvZihzdHJ1Y3QgUnhEZXNjKSkKKworI2RlZmluZSBSVEw4MTY5X1RYX1RJTUVPVVQJKDYqSFopCisjZGVmaW5lIFJUTDgxNjlfUEhZX1RJTUVPVVQJKDEwKkhaKQorCisvKiB3cml0ZS9yZWFkIE1NSU8gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlRMX1c4KHJlZywgdmFsOCkJd3JpdGViICgodmFsOCksIGlvYWRkciArIChyZWcpKQorI2RlZmluZSBSVExfVzE2KHJlZywgdmFsMTYpCXdyaXRldyAoKHZhbDE2KSwgaW9hZGRyICsgKHJlZykpCisjZGVmaW5lIFJUTF9XMzIocmVnLCB2YWwzMikJd3JpdGVsICgodmFsMzIpLCBpb2FkZHIgKyAocmVnKSkKKyNkZWZpbmUgUlRMX1I4KHJlZykJCXJlYWRiIChpb2FkZHIgKyAocmVnKSkKKyNkZWZpbmUgUlRMX1IxNihyZWcpCQlyZWFkdyAoaW9hZGRyICsgKHJlZykpCisjZGVmaW5lIFJUTF9SMzIocmVnKQkJKCh1bnNpZ25lZCBsb25nKSByZWFkbCAoaW9hZGRyICsgKHJlZykpKQorCitlbnVtIG1hY192ZXJzaW9uIHsKKwlSVExfR0lHQV9NQUNfVkVSX0IgPSAweDAwLAorCS8qIFJUTF9HSUdBX01BQ19WRVJfQyA9IDB4MDMsICovCisJUlRMX0dJR0FfTUFDX1ZFUl9EID0gMHgwMSwKKwlSVExfR0lHQV9NQUNfVkVSX0UgPSAweDAyLAorCVJUTF9HSUdBX01BQ19WRVJfWCA9IDB4MDQJLyogR3JlYXRlciB0aGFuIFJUTF9HSUdBX01BQ19WRVJfRSAqLworfTsKKworZW51bSBwaHlfdmVyc2lvbiB7CisJUlRMX0dJR0FfUEhZX1ZFUl9DID0gMHgwMywgLyogUEhZIFJlZyAweDAzIGJpdDAtMyA9PSAweDAwMDAgKi8KKwlSVExfR0lHQV9QSFlfVkVSX0QgPSAweDA0LCAvKiBQSFkgUmVnIDB4MDMgYml0MC0zID09IDB4MDAwMCAqLworCVJUTF9HSUdBX1BIWV9WRVJfRSA9IDB4MDUsIC8qIFBIWSBSZWcgMHgwMyBiaXQwLTMgPT0gMHgwMDAwICovCisJUlRMX0dJR0FfUEhZX1ZFUl9GID0gMHgwNiwgLyogUEhZIFJlZyAweDAzIGJpdDAtMyA9PSAweDAwMDEgKi8KKwlSVExfR0lHQV9QSFlfVkVSX0cgPSAweDA3LCAvKiBQSFkgUmVnIDB4MDMgYml0MC0zID09IDB4MDAwMiAqLworCVJUTF9HSUdBX1BIWV9WRVJfSCA9IDB4MDgsIC8qIFBIWSBSZWcgMHgwMyBiaXQwLTMgPT0gMHgwMDAzICovCit9OworCisKKyNkZWZpbmUgX1IoTkFNRSxNQUMsTUFTSykgXAorCXsgLm5hbWUgPSBOQU1FLCAubWFjX3ZlcnNpb24gPSBNQUMsIC5SeENvbmZpZ01hc2sgPSBNQVNLIH0KKworY29uc3Qgc3RhdGljIHN0cnVjdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1OCBtYWNfdmVyc2lvbjsKKwl1MzIgUnhDb25maWdNYXNrOwkvKiBDbGVhcnMgdGhlIGJpdHMgc3VwcG9ydGVkIGJ5IHRoaXMgY2hpcCAqLworfSBydGxfY2hpcF9pbmZvW10gPSB7CisJX1IoIlJUTDgxNjkiLAkJUlRMX0dJR0FfTUFDX1ZFUl9CLCAweGZmN2UxODgwKSwKKwlfUigiUlRMODE2OXMvODExMHMiLAlSVExfR0lHQV9NQUNfVkVSX0QsIDB4ZmY3ZTE4ODApLAorCV9SKCJSVEw4MTY5cy84MTEwcyIsCVJUTF9HSUdBX01BQ19WRVJfRSwgMHhmZjdlMTg4MCksCisJX1IoIlJUTDgxNjlzLzgxMTBzIiwJUlRMX0dJR0FfTUFDX1ZFUl9YLCAweGZmN2UxODgwKSwKK307CisjdW5kZWYgX1IKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJ0bDgxNjlfcGNpX3RibFtdID0geworCXsweDEwZWMsIDB4ODE2OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJezB4MTE4NiwgMHg0MzAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7MCx9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHJ0bDgxNjlfcGNpX3RibCk7CisKK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrID0gMjAwOworc3RhdGljIGludCB1c2VfZGFjOworCitlbnVtIFJUTDgxNjlfcmVnaXN0ZXJzIHsKKwlNQUMwID0gMCwJCS8qIEV0aGVybmV0IGhhcmR3YXJlIGFkZHJlc3MuICovCisJTUFSMCA9IDgsCQkvKiBNdWx0aWNhc3QgZmlsdGVyLiAqLworCVR4RGVzY1N0YXJ0QWRkckxvdyA9IDB4MjAsCisJVHhEZXNjU3RhcnRBZGRySGlnaCA9IDB4MjQsCisJVHhIRGVzY1N0YXJ0QWRkckxvdyA9IDB4MjgsCisJVHhIRGVzY1N0YXJ0QWRkckhpZ2ggPSAweDJjLAorCUZMQVNIID0gMHgzMCwKKwlFUlNSID0gMHgzNiwKKwlDaGlwQ21kID0gMHgzNywKKwlUeFBvbGwgPSAweDM4LAorCUludHJNYXNrID0gMHgzQywKKwlJbnRyU3RhdHVzID0gMHgzRSwKKwlUeENvbmZpZyA9IDB4NDAsCisJUnhDb25maWcgPSAweDQ0LAorCVJ4TWlzc2VkID0gMHg0QywKKwlDZmc5MzQ2ID0gMHg1MCwKKwlDb25maWcwID0gMHg1MSwKKwlDb25maWcxID0gMHg1MiwKKwlDb25maWcyID0gMHg1MywKKwlDb25maWczID0gMHg1NCwKKwlDb25maWc0ID0gMHg1NSwKKwlDb25maWc1ID0gMHg1NiwKKwlNdWx0aUludHIgPSAweDVDLAorCVBIWUFSID0gMHg2MCwKKwlUQklDU1IgPSAweDY0LAorCVRCSV9BTkFSID0gMHg2OCwKKwlUQklfTFBBUiA9IDB4NkEsCisJUEhZc3RhdHVzID0gMHg2QywKKwlSeE1heFNpemUgPSAweERBLAorCUNQbHVzQ21kID0gMHhFMCwKKwlJbnRyTWl0aWdhdGUgPSAweEUyLAorCVJ4RGVzY0FkZHJMb3cgPSAweEU0LAorCVJ4RGVzY0FkZHJIaWdoID0gMHhFOCwKKwlFYXJseVR4VGhyZXMgPSAweEVDLAorCUZ1bmNFdmVudCA9IDB4RjAsCisJRnVuY0V2ZW50TWFzayA9IDB4RjQsCisJRnVuY1ByZXNldFN0YXRlID0gMHhGOCwKKwlGdW5jRm9yY2VFdmVudCA9IDB4RkMsCit9OworCitlbnVtIFJUTDgxNjlfcmVnaXN0ZXJfY29udGVudCB7CisJLyogSW50ZXJydXB0U3RhdHVzQml0cyAqLworCVNZU0VyciA9IDB4ODAwMCwKKwlQQ1NUaW1lb3V0ID0gMHg0MDAwLAorCVNXSW50ID0gMHgwMTAwLAorCVR4RGVzY1VuYXZhaWwgPSAweDgwLAorCVJ4RklGT092ZXIgPSAweDQwLAorCUxpbmtDaGcgPSAweDIwLAorCVJ4T3ZlcmZsb3cgPSAweDEwLAorCVR4RXJyID0gMHgwOCwKKwlUeE9LID0gMHgwNCwKKwlSeEVyciA9IDB4MDIsCisJUnhPSyA9IDB4MDEsCisKKwkvKiBSeFN0YXR1c0Rlc2MgKi8KKwlSeFJFUyA9IDB4MDAyMDAwMDAsCisJUnhDUkMgPSAweDAwMDgwMDAwLAorCVJ4UlVOVCA9IDB4MDAxMDAwMDAsCisJUnhSV1QgPSAweDAwNDAwMDAwLAorCisJLyogQ2hpcENtZEJpdHMgKi8KKwlDbWRSZXNldCA9IDB4MTAsCisJQ21kUnhFbmIgPSAweDA4LAorCUNtZFR4RW5iID0gMHgwNCwKKwlSeEJ1ZkVtcHR5ID0gMHgwMSwKKworCS8qIENmZzkzNDZCaXRzICovCisJQ2ZnOTM0Nl9Mb2NrID0gMHgwMCwKKwlDZmc5MzQ2X1VubG9jayA9IDB4QzAsCisKKwkvKiByeF9tb2RlX2JpdHMgKi8KKwlBY2NlcHRFcnIgPSAweDIwLAorCUFjY2VwdFJ1bnQgPSAweDEwLAorCUFjY2VwdEJyb2FkY2FzdCA9IDB4MDgsCisJQWNjZXB0TXVsdGljYXN0ID0gMHgwNCwKKwlBY2NlcHRNeVBoeXMgPSAweDAyLAorCUFjY2VwdEFsbFBoeXMgPSAweDAxLAorCisJLyogUnhDb25maWdCaXRzICovCisJUnhDZmdGSUZPU2hpZnQgPSAxMywKKwlSeENmZ0RNQVNoaWZ0ID0gOCwKKworCS8qIFR4Q29uZmlnQml0cyAqLworCVR4SW50ZXJGcmFtZUdhcFNoaWZ0ID0gMjQsCisJVHhETUFTaGlmdCA9IDgsCS8qIERNQSBidXJzdCB2YWx1ZSAoMC03KSBpcyBzaGlmdCB0aGlzIG1hbnkgYml0cyAqLworCisJLyogVEJJQ1NSIHAuMjggKi8KKwlUQklSZXNldAk9IDB4ODAwMDAwMDAsCisJVEJJTG9vcGJhY2sJPSAweDQwMDAwMDAwLAorCVRCSU53RW5hYmxlCT0gMHgyMDAwMDAwMCwKKwlUQklOd1Jlc3RhcnQJPSAweDEwMDAwMDAwLAorCVRCSUxpbmtPawk9IDB4MDIwMDAwMDAsCisJVEJJTndDb21wbGV0ZQk9IDB4MDEwMDAwMDAsCisKKwkvKiBDUGx1c0NtZCBwLjMxICovCisJUnhWbGFuCQk9ICgxIDw8IDYpLAorCVJ4Q2hrU3VtCT0gKDEgPDwgNSksCisJUENJREFDCQk9ICgxIDw8IDQpLAorCVBDSU11bFJXCT0gKDEgPDwgMyksCisKKwkvKiBydGw4MTY5X1BIWXN0YXR1cyAqLworCVRCSV9FbmFibGUgPSAweDgwLAorCVR4Rmxvd0N0cmwgPSAweDQwLAorCVJ4Rmxvd0N0cmwgPSAweDIwLAorCV8xMDAwYnBzRiA9IDB4MTAsCisJXzEwMGJwcyA9IDB4MDgsCisJXzEwYnBzID0gMHgwNCwKKwlMaW5rU3RhdHVzID0gMHgwMiwKKwlGdWxsRHVwID0gMHgwMSwKKworCS8qIEdJR0FCSVRfUEhZX3JlZ2lzdGVycyAqLworCVBIWV9DVFJMX1JFRyA9IDAsCisJUEhZX1NUQVRfUkVHID0gMSwKKwlQSFlfQVVUT19ORUdPX1JFRyA9IDQsCisJUEhZXzEwMDBfQ1RSTF9SRUcgPSA5LAorCisJLyogR0lHQUJJVF9QSFlfUkVHX0JJVCAqLworCVBIWV9SZXN0YXJ0X0F1dG9fTmVnbyA9IDB4MDIwMCwKKwlQSFlfRW5hYmxlX0F1dG9fTmVnbyA9IDB4MTAwMCwKKworCS8qIFBIWV9TVEFUX1JFRyA9IDEgKi8KKwlQSFlfQXV0b19OZWNvX0NvbXAgPSAweDAwMjAsCisKKwkvKiBQSFlfQVVUT19ORUdPX1JFRyA9IDQgKi8KKwlQSFlfQ2FwXzEwX0hhbGYgPSAweDAwMjAsCisJUEhZX0NhcF8xMF9GdWxsID0gMHgwMDQwLAorCVBIWV9DYXBfMTAwX0hhbGYgPSAweDAwODAsCisJUEhZX0NhcF8xMDBfRnVsbCA9IDB4MDEwMCwKKworCS8qIFBIWV8xMDAwX0NUUkxfUkVHID0gOSAqLworCVBIWV9DYXBfMTAwMF9GdWxsID0gMHgwMjAwLAorCisJUEhZX0NhcF9OdWxsID0gMHgwLAorCisJLyogX01lZGlhVHlwZSAqLworCV8xMF9IYWxmID0gMHgwMSwKKwlfMTBfRnVsbCA9IDB4MDIsCisJXzEwMF9IYWxmID0gMHgwNCwKKwlfMTAwX0Z1bGwgPSAweDA4LAorCV8xMDAwX0Z1bGwgPSAweDEwLAorCisJLyogX1RCSUNTUkJpdCAqLworCVRCSUxpbmtPSyA9IDB4MDIwMDAwMDAsCit9OworCitlbnVtIF9EZXNjU3RhdHVzQml0IHsKKwlEZXNjT3duCQk9ICgxIDw8IDMxKSwgLyogRGVzY3JpcHRvciBpcyBvd25lZCBieSBOSUMgKi8KKwlSaW5nRW5kCQk9ICgxIDw8IDMwKSwgLyogRW5kIG9mIGRlc2NyaXB0b3IgcmluZyAqLworCUZpcnN0RnJhZwk9ICgxIDw8IDI5KSwgLyogRmlyc3Qgc2VnbWVudCBvZiBhIHBhY2tldCAqLworCUxhc3RGcmFnCT0gKDEgPDwgMjgpLCAvKiBGaW5hbCBzZWdtZW50IG9mIGEgcGFja2V0ICovCisKKwkvKiBUeCBwcml2YXRlICovCisJTGFyZ2VTZW5kCT0gKDEgPDwgMjcpLCAvKiBUQ1AgTGFyZ2UgU2VuZCBPZmZsb2FkIChUU08pICovCisJTVNTU2hpZnQJPSAxNiwgICAgICAgIC8qIE1TUyB2YWx1ZSBwb3NpdGlvbiAqLworCU1TU01hc2sJCT0gMHhmZmYsICAgICAvKiBNU1MgdmFsdWUgKyBMYXJnZVNlbmQgYml0OiAxMiBiaXRzICovCisJSVBDUwkJPSAoMSA8PCAxOCksIC8qIENhbGN1bGF0ZSBJUCBjaGVja3N1bSAqLworCVVEUENTCQk9ICgxIDw8IDE3KSwgLyogQ2FsY3VsYXRlIFVEUC9JUCBjaGVja3N1bSAqLworCVRDUENTCQk9ICgxIDw8IDE2KSwgLyogQ2FsY3VsYXRlIFRDUC9JUCBjaGVja3N1bSAqLworCVR4VmxhblRhZwk9ICgxIDw8IDE3KSwgLyogQWRkIFZMQU4gdGFnICovCisKKwkvKiBSeCBwcml2YXRlICovCisJUElEMQkJPSAoMSA8PCAxOCksIC8qIFByb3RvY29sIElEIGJpdCAxLzIgKi8KKwlQSUQwCQk9ICgxIDw8IDE3KSwgLyogUHJvdG9jb2wgSUQgYml0IDIvMiAqLworCisjZGVmaW5lIFJ4UHJvdG9VRFAJKFBJRDEpCisjZGVmaW5lIFJ4UHJvdG9UQ1AJKFBJRDApCisjZGVmaW5lIFJ4UHJvdG9JUAkoUElEMSB8IFBJRDApCisjZGVmaW5lIFJ4UHJvdG9NYXNrCVJ4UHJvdG9JUAorCisJSVBGYWlsCQk9ICgxIDw8IDE2KSwgLyogSVAgY2hlY2tzdW0gZmFpbGVkICovCisJVURQRmFpbAkJPSAoMSA8PCAxNSksIC8qIFVEUC9JUCBjaGVja3N1bSBmYWlsZWQgKi8KKwlUQ1BGYWlsCQk9ICgxIDw8IDE0KSwgLyogVENQL0lQIGNoZWNrc3VtIGZhaWxlZCAqLworCVJ4VmxhblRhZwk9ICgxIDw8IDE2KSwgLyogVkxBTiB0YWcgYXZhaWxhYmxlICovCit9OworCisjZGVmaW5lIFJzdmRNYXNrCTB4M2ZmZmMwMDAKKworc3RydWN0IFR4RGVzYyB7CisJdTMyIG9wdHMxOworCXUzMiBvcHRzMjsKKwl1NjQgYWRkcjsKK307CisKK3N0cnVjdCBSeERlc2MgeworCXUzMiBvcHRzMTsKKwl1MzIgb3B0czI7CisJdTY0IGFkZHI7Cit9OworCitzdHJ1Y3QgcmluZ19pbmZvIHsKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOworCXUzMgkJbGVuOworCXU4CQlfX3BhZFtzaXplb2Yodm9pZCAqKSAtIHNpemVvZih1MzIpXTsKK307CisKK3N0cnVjdCBydGw4MTY5X3ByaXZhdGUgeworCXZvaWQgX19pb21lbSAqbW1pb19hZGRyOwkvKiBtZW1vcnkgbWFwIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsJLyogSW5kZXggb2YgUENJIGRldmljZSAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwkvKiBzdGF0aXN0aWNzIG9mIG5ldCBkZXZpY2UgKi8KKwlzcGlubG9ja190IGxvY2s7CQkvKiBzcGluIGxvY2sgZmxhZyAqLworCWludCBjaGlwc2V0OworCWludCBtYWNfdmVyc2lvbjsKKwlpbnQgcGh5X3ZlcnNpb247CisJdTMyIGN1cl9yeDsgLyogSW5kZXggaW50byB0aGUgUnggZGVzY3JpcHRvciBidWZmZXIgb2YgbmV4dCBSeCBwa3QuICovCisJdTMyIGN1cl90eDsgLyogSW5kZXggaW50byB0aGUgVHggZGVzY3JpcHRvciBidWZmZXIgb2YgbmV4dCBSeCBwa3QuICovCisJdTMyIGRpcnR5X3J4OworCXUzMiBkaXJ0eV90eDsKKwlzdHJ1Y3QgVHhEZXNjICpUeERlc2NBcnJheTsJLyogMjU2LWFsaWduZWQgVHggZGVzY3JpcHRvciByaW5nICovCisJc3RydWN0IFJ4RGVzYyAqUnhEZXNjQXJyYXk7CS8qIDI1Ni1hbGlnbmVkIFJ4IGRlc2NyaXB0b3IgcmluZyAqLworCWRtYV9hZGRyX3QgVHhQaHlBZGRyOworCWRtYV9hZGRyX3QgUnhQaHlBZGRyOworCXN0cnVjdCBza19idWZmICpSeF9za2J1ZmZbTlVNX1JYX0RFU0NdOwkvKiBSeCBkYXRhIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3QgcmluZ19pbmZvIHR4X3NrYltOVU1fVFhfREVTQ107CS8qIFR4IGRhdGEgYnVmZmVycyAqLworCXVuc2lnbmVkIHJ4X2J1Zl9zejsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwl1MTYgY3BfY21kOworCXUxNiBpbnRyX21hc2s7CisJaW50IHBoeV9hdXRvX25lZ29fcmVnOworCWludCBwaHlfMTAwMF9jdHJsX3JlZzsKKyNpZmRlZiBDT05GSUdfUjgxNjlfVkxBTgorCXN0cnVjdCB2bGFuX2dyb3VwICp2bGdycDsKKyNlbmRpZgorCWludCAoKnNldF9zcGVlZCkoc3RydWN0IG5ldF9kZXZpY2UgKiwgdTggYXV0b25lZywgdTE2IHNwZWVkLCB1OCBkdXBsZXgpOworCXZvaWQgKCpnZXRfc2V0dGluZ3MpKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBldGh0b29sX2NtZCAqKTsKKwl2b2lkICgqcGh5X3Jlc2V0X2VuYWJsZSkodm9pZCBfX2lvbWVtICopOworCXVuc2lnbmVkIGludCAoKnBoeV9yZXNldF9wZW5kaW5nKSh2b2lkIF9faW9tZW0gKik7CisJdW5zaWduZWQgaW50ICgqbGlua19vaykodm9pZCBfX2lvbWVtICopOworCXN0cnVjdCB3b3JrX3N0cnVjdCB0YXNrOworfTsKKworTU9EVUxFX0FVVEhPUigiUmVhbHRlayBhbmQgdGhlIExpbnV4IHI4MTY5IGNyZXcgPG5ldGRldkBvc3Muc2dpLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmVhbFRlayBSVEwtODE2OSBHaWdhYml0IEV0aGVybmV0IGRyaXZlciIpOworbW9kdWxlX3BhcmFtX2FycmF5KG1lZGlhLCBpbnQsICZudW1fbWVkaWEsIDApOworbW9kdWxlX3BhcmFtKHJ4X2NvcHlicmVhaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh1c2VfZGFjLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh1c2VfZGFjLCAiRW5hYmxlIFBDSSBEQUMuIFVuc2FmZSBvbiAzMiBiaXQgUENJIHNsb3QuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihSVEw4MTY5X1ZFUlNJT04pOworCitzdGF0aWMgaW50IHJ0bDgxNjlfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcnRsODE2OV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IHJ0bDgxNjlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwKKwkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgcnRsODE2OV9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBydGw4MTY5X2h3X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBydGw4MTY5X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcnRsODE2OV9zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcnRsODE2OV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgaW50IHJ0bDgxNjlfcnhfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKiwKKwkJCQl2b2lkIF9faW9tZW0gKik7CitzdGF0aWMgaW50IHJ0bDgxNjlfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgbmV3X210dSk7CitzdGF0aWMgdm9pZCBydGw4MTY5X2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKyNpZmRlZiBDT05GSUdfUjgxNjlfTkFQSQorc3RhdGljIGludCBydGw4MTY5X3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpOworI2VuZGlmCisKK3N0YXRpYyBjb25zdCB1MTYgcnRsODE2OV9pbnRyX21hc2sgPQorCVNZU0VyciB8IExpbmtDaGcgfCBSeE92ZXJmbG93IHwgUnhGSUZPT3ZlciB8IFR4RXJyIHwgVHhPSyB8IFJ4RXJyIHwgUnhPSzsKK3N0YXRpYyBjb25zdCB1MTYgcnRsODE2OV9uYXBpX2V2ZW50ID0KKwlSeE9LIHwgUnhPdmVyZmxvdyB8IFJ4RklGT092ZXIgfCBUeE9LIHwgVHhFcnI7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJ0bDgxNjlfcnhfY29uZmlnID0KKyAgICAoUlhfRklGT19USFJFU0ggPDwgUnhDZmdGSUZPU2hpZnQpIHwgKFJYX0RNQV9CVVJTVCA8PCBSeENmZ0RNQVNoaWZ0KTsKKworI2RlZmluZSBQSFlfQ2FwXzEwX0hhbGZfT3JfTGVzcyBQSFlfQ2FwXzEwX0hhbGYKKyNkZWZpbmUgUEhZX0NhcF8xMF9GdWxsX09yX0xlc3MgUEhZX0NhcF8xMF9GdWxsIHwgUEhZX0NhcF8xMF9IYWxmX09yX0xlc3MKKyNkZWZpbmUgUEhZX0NhcF8xMDBfSGFsZl9Pcl9MZXNzIFBIWV9DYXBfMTAwX0hhbGYgfCBQSFlfQ2FwXzEwX0Z1bGxfT3JfTGVzcworI2RlZmluZSBQSFlfQ2FwXzEwMF9GdWxsX09yX0xlc3MgUEhZX0NhcF8xMDBfRnVsbCB8IFBIWV9DYXBfMTAwX0hhbGZfT3JfTGVzcworCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgUmVnQWRkciwgaW50IHZhbHVlKQoreworCWludCBpOworCisJUlRMX1czMihQSFlBUiwgMHg4MDAwMDAwMCB8IChSZWdBZGRyICYgMHhGRikgPDwgMTYgfCB2YWx1ZSk7CisJdWRlbGF5KDEwMDApOworCisJZm9yIChpID0gMjAwMDsgaSA+IDA7IGktLSkgeworCQkvKiBDaGVjayBpZiB0aGUgUlRMODE2OSBoYXMgY29tcGxldGVkIHdyaXRpbmcgdG8gdGhlIHNwZWNpZmllZCBNSUkgcmVnaXN0ZXIgKi8KKwkJaWYgKCEoUlRMX1IzMihQSFlBUikgJiAweDgwMDAwMDAwKSkgCisJCQlicmVhazsKKwkJdWRlbGF5KDEwMCk7CisJfQorfQorCitzdGF0aWMgaW50IG1kaW9fcmVhZCh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IFJlZ0FkZHIpCit7CisJaW50IGksIHZhbHVlID0gLTE7CisKKwlSVExfVzMyKFBIWUFSLCAweDAgfCAoUmVnQWRkciAmIDB4RkYpIDw8IDE2KTsKKwl1ZGVsYXkoMTAwMCk7CisKKwlmb3IgKGkgPSAyMDAwOyBpID4gMDsgaS0tKSB7CisJCS8qIENoZWNrIGlmIHRoZSBSVEw4MTY5IGhhcyBjb21wbGV0ZWQgcmV0cmlldmluZyBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBNSUkgcmVnaXN0ZXIgKi8KKwkJaWYgKFJUTF9SMzIoUEhZQVIpICYgMHg4MDAwMDAwMCkgeworCQkJdmFsdWUgPSAoaW50KSAoUlRMX1IzMihQSFlBUikgJiAweEZGRkYpOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEwMCk7CisJfQorCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9pcnFfbWFza19hbmRfYWNrKHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCVJUTF9XMTYoSW50ck1hc2ssIDB4MDAwMCk7CisKKwlSVExfVzE2KEludHJTdGF0dXMsIDB4ZmZmZik7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfYXNpY19kb3duKHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCVJUTF9XOChDaGlwQ21kLCAweDAwKTsKKwlydGw4MTY5X2lycV9tYXNrX2FuZF9hY2soaW9hZGRyKTsKKwlSVExfUjE2KENQbHVzQ21kKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBydGw4MTY5X3RiaV9yZXNldF9wZW5kaW5nKHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCXJldHVybiBSVExfUjMyKFRCSUNTUikgJiBUQklSZXNldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBydGw4MTY5X3htaWlfcmVzZXRfcGVuZGluZyh2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwlyZXR1cm4gbWRpb19yZWFkKGlvYWRkciwgMCkgJiAweDgwMDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnRsODE2OV90YmlfbGlua19vayh2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwlyZXR1cm4gUlRMX1IzMihUQklDU1IpICYgVEJJTGlua09rOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHJ0bDgxNjlfeG1paV9saW5rX29rKHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCXJldHVybiBSVExfUjgoUEhZc3RhdHVzKSAmIExpbmtTdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfdGJpX3Jlc2V0X2VuYWJsZSh2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwlSVExfVzMyKFRCSUNTUiwgUlRMX1IzMihUQklDU1IpIHwgVEJJUmVzZXQpOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3htaWlfcmVzZXRfZW5hYmxlKHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwl2YWwgPSAobWRpb19yZWFkKGlvYWRkciwgUEhZX0NUUkxfUkVHKSB8IDB4ODAwMCkgJiAweGZmZmY7CisJbWRpb193cml0ZShpb2FkZHIsIFBIWV9DVFJMX1JFRywgdmFsKTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9jaGVja19saW5rX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwLCB2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CisJaWYgKHRwLT5saW5rX29rKGlvYWRkcikpIHsKKwkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6IGxpbmsgdXBcbiIsIGRldi0+bmFtZSk7CisJfSBlbHNlCisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9saW5rX29wdGlvbihpbnQgaWR4LCB1OCAqYXV0b25lZywgdTE2ICpzcGVlZCwgdTggKmR1cGxleCkKK3sKKwlzdHJ1Y3QgeworCQl1MTYgc3BlZWQ7CisJCXU4IGR1cGxleDsKKwkJdTggYXV0b25lZzsKKwkJdTggbWVkaWE7CisJfSBsaW5rX3NldHRpbmdzW10gPSB7CisJCXsgU1BFRURfMTAsCURVUExFWF9IQUxGLCBBVVRPTkVHX0RJU0FCTEUsCV8xMF9IYWxmIH0sCisJCXsgU1BFRURfMTAsCURVUExFWF9GVUxMLCBBVVRPTkVHX0RJU0FCTEUsCV8xMF9GdWxsIH0sCisJCXsgU1BFRURfMTAwLAlEVVBMRVhfSEFMRiwgQVVUT05FR19ESVNBQkxFLAlfMTAwX0hhbGYgfSwKKwkJeyBTUEVFRF8xMDAsCURVUExFWF9GVUxMLCBBVVRPTkVHX0RJU0FCTEUsCV8xMDBfRnVsbCB9LAorCQl7IFNQRUVEXzEwMDAsCURVUExFWF9GVUxMLCBBVVRPTkVHX0RJU0FCTEUsCV8xMDAwX0Z1bGwgfSwKKwkJLyogTWFrZSBUQkkgaGFwcHkgKi8KKwkJeyBTUEVFRF8xMDAwLAlEVVBMRVhfRlVMTCwgQVVUT05FR19FTkFCTEUsCTB4ZmYgfQorCX0sICpwOworCXVuc2lnbmVkIGNoYXIgb3B0aW9uOworCQorCW9wdGlvbiA9ICgoaWR4IDwgTUFYX1VOSVRTKSAmJiAoaWR4ID49IDApKSA/IG1lZGlhW2lkeF0gOiAweGZmOworCisJaWYgKChvcHRpb24gIT0gMHhmZikgJiYgIWlkeCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIm1lZGlhIG9wdGlvbiBpcyBkZXByZWNhdGVkLlxuIik7CisKKwlmb3IgKHAgPSBsaW5rX3NldHRpbmdzOyBwLT5tZWRpYSAhPSAweGZmOyBwKyspIHsKKwkJaWYgKHAtPm1lZGlhID09IG9wdGlvbikKKwkJCWJyZWFrOworCX0KKwkqYXV0b25lZyA9IHAtPmF1dG9uZWc7CisJKnNwZWVkID0gcC0+c3BlZWQ7CisJKmR1cGxleCA9IHAtPmR1cGxleDsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RyY3B5KGluZm8tPmRyaXZlciwgTU9EVUxFTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIFJUTDgxNjlfVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZSh0cC0+cGNpX2RldikpOworfQorCitzdGF0aWMgaW50IHJ0bDgxNjlfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIFI4MTY5X1JFR1NfU0laRTsKK30KKworc3RhdGljIGludCBydGw4MTY5X3NldF9zcGVlZF90Ymkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgdTggYXV0b25lZywgdTE2IHNwZWVkLCB1OCBkdXBsZXgpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwlpbnQgcmV0ID0gMDsKKwl1MzIgcmVnOworCisJcmVnID0gUlRMX1IzMihUQklDU1IpOworCWlmICgoYXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUpICYmIChzcGVlZCA9PSBTUEVFRF8xMDAwKSAmJgorCSAgICAoZHVwbGV4ID09IERVUExFWF9GVUxMKSkgeworCQlSVExfVzMyKFRCSUNTUiwgcmVnICYgfihUQklOd0VuYWJsZSB8IFRCSU53UmVzdGFydCkpOworCX0gZWxzZSBpZiAoYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkKKwkJUlRMX1czMihUQklDU1IsIHJlZyB8IFRCSU53RW5hYmxlIHwgVEJJTndSZXN0YXJ0KTsKKwllbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlgKKwkJICAgICAgICIlczogaW5jb3JyZWN0IHNwZWVkIHNldHRpbmcgcmVmdXNlZCBpbiBUQkkgbW9kZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV9zZXRfc3BlZWRfeG1paShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgdTggYXV0b25lZywgdTE2IHNwZWVkLCB1OCBkdXBsZXgpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwlpbnQgYXV0b19uZWdvLCBnaWdhX2N0cmw7CisKKwlhdXRvX25lZ28gPSBtZGlvX3JlYWQoaW9hZGRyLCBQSFlfQVVUT19ORUdPX1JFRyk7CisJYXV0b19uZWdvICY9IH4oUEhZX0NhcF8xMF9IYWxmIHwgUEhZX0NhcF8xMF9GdWxsIHwKKwkJICAgICAgIFBIWV9DYXBfMTAwX0hhbGYgfCBQSFlfQ2FwXzEwMF9GdWxsKTsKKwlnaWdhX2N0cmwgPSBtZGlvX3JlYWQoaW9hZGRyLCBQSFlfMTAwMF9DVFJMX1JFRyk7CisJZ2lnYV9jdHJsICY9IH4oUEhZX0NhcF8xMDAwX0Z1bGwgfCBQSFlfQ2FwX051bGwpOworCisJaWYgKGF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJYXV0b19uZWdvIHw9IChQSFlfQ2FwXzEwX0hhbGYgfCBQSFlfQ2FwXzEwX0Z1bGwgfAorCQkJICAgICAgUEhZX0NhcF8xMDBfSGFsZiB8IFBIWV9DYXBfMTAwX0Z1bGwpOworCQlnaWdhX2N0cmwgfD0gUEhZX0NhcF8xMDAwX0Z1bGw7CisJfSBlbHNlIHsKKwkJaWYgKHNwZWVkID09IFNQRUVEXzEwKQorCQkJYXV0b19uZWdvIHw9IFBIWV9DYXBfMTBfSGFsZiB8IFBIWV9DYXBfMTBfRnVsbDsKKwkJZWxzZSBpZiAoc3BlZWQgPT0gU1BFRURfMTAwKQorCQkJYXV0b19uZWdvIHw9IFBIWV9DYXBfMTAwX0hhbGYgfCBQSFlfQ2FwXzEwMF9GdWxsOworCQllbHNlIGlmIChzcGVlZCA9PSBTUEVFRF8xMDAwKQorCQkJZ2lnYV9jdHJsIHw9IFBIWV9DYXBfMTAwMF9GdWxsOworCisJCWlmIChkdXBsZXggPT0gRFVQTEVYX0hBTEYpCisJCQlhdXRvX25lZ28gJj0gfihQSFlfQ2FwXzEwX0Z1bGwgfCBQSFlfQ2FwXzEwMF9GdWxsKTsKKwl9CisKKwl0cC0+cGh5X2F1dG9fbmVnb19yZWcgPSBhdXRvX25lZ287CisJdHAtPnBoeV8xMDAwX2N0cmxfcmVnID0gZ2lnYV9jdHJsOworCisJbWRpb193cml0ZShpb2FkZHIsIFBIWV9BVVRPX05FR09fUkVHLCBhdXRvX25lZ28pOworCW1kaW9fd3JpdGUoaW9hZGRyLCBQSFlfMTAwMF9DVFJMX1JFRywgZ2lnYV9jdHJsKTsKKwltZGlvX3dyaXRlKGlvYWRkciwgUEhZX0NUUkxfUkVHLCBQSFlfRW5hYmxlX0F1dG9fTmVnbyB8CisJCQkJCSBQSFlfUmVzdGFydF9BdXRvX05lZ28pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0bDgxNjlfc2V0X3NwZWVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHU4IGF1dG9uZWcsIHUxNiBzcGVlZCwgdTggZHVwbGV4KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gdHAtPnNldF9zcGVlZChkZXYsIGF1dG9uZWcsIHNwZWVkLCBkdXBsZXgpOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSAmJiAodHAtPnBoeV8xMDAwX2N0cmxfcmVnICYgUEhZX0NhcF8xMDAwX0Z1bGwpKQorCQltb2RfdGltZXIoJnRwLT50aW1lciwgamlmZmllcyArIFJUTDgxNjlfUEhZX1RJTUVPVVQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBydGw4MTY5X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CisJcmV0ID0gcnRsODE2OV9zZXRfc3BlZWQoZGV2LCBjbWQtPmF1dG9uZWcsIGNtZC0+c3BlZWQsIGNtZC0+ZHVwbGV4KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworCQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1MzIgcnRsODE2OV9nZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiB0cC0+Y3BfY21kICYgUnhDaGtTdW07Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV9zZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKKworCWlmIChkYXRhKQorCQl0cC0+Y3BfY21kIHw9IFJ4Q2hrU3VtOworCWVsc2UKKwkJdHAtPmNwX2NtZCAmPSB+UnhDaGtTdW07CisKKwlSVExfVzE2KENQbHVzQ21kLCB0cC0+Y3BfY21kKTsKKwlSVExfUjE2KENQbHVzQ21kKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19SODE2OV9WTEFOCisKK3N0YXRpYyBpbmxpbmUgdTMyIHJ0bDgxNjlfdHhfdmxhbl90YWcoc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHRwLT52bGdycCAmJiB2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpID8KKwkJVHhWbGFuVGFnIHwgc3dhYjE2KHZsYW5fdHhfdGFnX2dldChza2IpKSA6IDB4MDA7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKKwl0cC0+dmxncnAgPSBncnA7CisJaWYgKHRwLT52bGdycCkKKwkJdHAtPmNwX2NtZCB8PSBSeFZsYW47CisJZWxzZQorCQl0cC0+Y3BfY21kICY9IH5SeFZsYW47CisJUlRMX1cxNihDUGx1c0NtZCwgdHAtPmNwX2NtZCk7CisJUlRMX1IxNihDUGx1c0NtZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworCWlmICh0cC0+dmxncnApCisJCXRwLT52bGdycC0+dmxhbl9kZXZpY2VzW3ZpZF0gPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV9yeF92bGFuX3NrYihzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCwgc3RydWN0IFJ4RGVzYyAqZGVzYywKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXUzMiBvcHRzMiA9IGxlMzJfdG9fY3B1KGRlc2MtPm9wdHMyKTsKKwlpbnQgcmV0OworCisJaWYgKHRwLT52bGdycCAmJiAob3B0czIgJiBSeFZsYW5UYWcpKSB7CisJCXJ0bDgxNjlfcnhfaHdhY2NlbF9za2Ioc2tiLCB0cC0+dmxncnAsCisJCQkJICAgICAgIHN3YWIxNihvcHRzMiAmIDB4ZmZmZikpOworCQlyZXQgPSAwOworCX0gZWxzZQorCQlyZXQgPSAtMTsKKwlkZXNjLT5vcHRzMiA9IDA7CisJcmV0dXJuIHJldDsKK30KKworI2Vsc2UgLyogIUNPTkZJR19SODE2OV9WTEFOICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIHJ0bDgxNjlfdHhfdmxhbl90YWcoc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGw4MTY5X3J4X3ZsYW5fc2tiKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwLCBzdHJ1Y3QgUnhEZXNjICpkZXNjLAorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIC0xOworfQorCisjZW5kaWYKKworc3RhdGljIHZvaWQgcnRsODE2OV9nc2V0X3RiaShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXUzMiBzdGF0dXM7CisKKwljbWQtPnN1cHBvcnRlZCA9CisJCVNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF9BdXRvbmVnIHwgU1VQUE9SVEVEX0ZJQlJFOworCWNtZC0+cG9ydCA9IFBPUlRfRklCUkU7CisJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisKKwlzdGF0dXMgPSBSVExfUjMyKFRCSUNTUik7CisJY21kLT5hZHZlcnRpc2luZyA9IChzdGF0dXMgJiBUQklOd0VuYWJsZSkgPyAgQURWRVJUSVNFRF9BdXRvbmVnIDogMDsKKwljbWQtPmF1dG9uZWcgPSAhIShzdGF0dXMgJiBUQklOd0VuYWJsZSk7CisKKwljbWQtPnNwZWVkID0gU1BFRURfMTAwMDsKKwljbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOyAvKiBBbHdheXMgc2V0ICovCit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfZ3NldF94bWlpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdTggc3RhdHVzOworCisJY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkJCSBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKKwkJCSBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8CisJCQkgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfAorCQkJIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQkgU1VQUE9SVEVEX0F1dG9uZWcgfAorCQkgICAgICAgICBTVVBQT1JURURfVFA7CisKKwljbWQtPmF1dG9uZWcgPSAxOworCWNtZC0+YWR2ZXJ0aXNpbmcgPSBBRFZFUlRJU0VEX1RQIHwgQURWRVJUSVNFRF9BdXRvbmVnOworCisJaWYgKHRwLT5waHlfYXV0b19uZWdvX3JlZyAmIFBIWV9DYXBfMTBfSGFsZikKKwkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZjsKKwlpZiAodHAtPnBoeV9hdXRvX25lZ29fcmVnICYgUEhZX0NhcF8xMF9GdWxsKQorCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsOworCWlmICh0cC0+cGh5X2F1dG9fbmVnb19yZWcgJiBQSFlfQ2FwXzEwMF9IYWxmKQorCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZjsKKwlpZiAodHAtPnBoeV9hdXRvX25lZ29fcmVnICYgUEhZX0NhcF8xMDBfRnVsbCkKKwkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGw7CisJaWYgKHRwLT5waHlfMTAwMF9jdHJsX3JlZyAmIFBIWV9DYXBfMTAwMF9GdWxsKQorCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGw7CisKKwlzdGF0dXMgPSBSVExfUjgoUEhZc3RhdHVzKTsKKworCWlmIChzdGF0dXMgJiBfMTAwMGJwc0YpCisJCWNtZC0+c3BlZWQgPSBTUEVFRF8xMDAwOworCWVsc2UgaWYgKHN0YXR1cyAmIF8xMDBicHMpCisJCWNtZC0+c3BlZWQgPSBTUEVFRF8xMDA7CisJZWxzZSBpZiAoc3RhdHVzICYgXzEwYnBzKQorCQljbWQtPnNwZWVkID0gU1BFRURfMTA7CisKKwljbWQtPmR1cGxleCA9ICgoc3RhdHVzICYgXzEwMDBicHNGKSB8fCAoc3RhdHVzICYgRnVsbER1cCkpID8KKwkJICAgICAgRFVQTEVYX0ZVTEwgOiBEVVBMRVhfSEFMRjsKK30KKworc3RhdGljIGludCBydGw4MTY5X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJdHAtPmdldF9zZXR0aW5ncyhkZXYsIGNtZCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsCisJCQkgICAgIHZvaWQgKnApCit7CisgICAgICAgIHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgICAgICBpZiAocmVncy0+bGVuID4gUjgxNjlfUkVHU19TSVpFKQorICAgICAgICAJcmVncy0+bGVuID0gUjgxNjlfUkVHU19TSVpFOworCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworICAgICAgICBtZW1jcHlfZnJvbWlvKHAsIHRwLT5tbWlvX2FkZHIsIHJlZ3MtPmxlbik7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgcnRsODE2OV9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gcnRsODE2OV9nZXRfZHJ2aW5mbywKKwkuZ2V0X3JlZ3NfbGVuCQk9IHJ0bDgxNjlfZ2V0X3JlZ3NfbGVuLAorCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfc2V0dGluZ3MJCT0gcnRsODE2OV9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSBydGw4MTY5X3NldF9zZXR0aW5ncywKKwkuZ2V0X3J4X2NzdW0JCT0gcnRsODE2OV9nZXRfcnhfY3N1bSwKKwkuc2V0X3J4X2NzdW0JCT0gcnRsODE2OV9zZXRfcnhfY3N1bSwKKwkuZ2V0X3R4X2NzdW0JCT0gZXRodG9vbF9vcF9nZXRfdHhfY3N1bSwKKwkuc2V0X3R4X2NzdW0JCT0gZXRodG9vbF9vcF9zZXRfdHhfY3N1bSwKKwkuZ2V0X3NnCQkJPSBldGh0b29sX29wX2dldF9zZywKKwkuc2V0X3NnCQkJPSBldGh0b29sX29wX3NldF9zZywKKwkuZ2V0X3RzbwkJPSBldGh0b29sX29wX2dldF90c28sCisJLnNldF90c28JCT0gZXRodG9vbF9vcF9zZXRfdHNvLAorCS5nZXRfcmVncwkJPSBydGw4MTY5X2dldF9yZWdzLAorfTsKKworc3RhdGljIHZvaWQgcnRsODE2OV93cml0ZV9nbWlpX3JlZ19iaXQodm9pZCBfX2lvbWVtICppb2FkZHIsIGludCByZWcsIGludCBiaXRudW0sCisJCQkJICAgICAgIGludCBiaXR2YWwpCit7CisJaW50IHZhbDsKKworCXZhbCA9IG1kaW9fcmVhZChpb2FkZHIsIHJlZyk7CisJdmFsID0gKGJpdHZhbCA9PSAxKSA/CisJCXZhbCB8IChiaXR2YWwgPDwgYml0bnVtKSA6ICB2YWwgJiB+KDB4MDAwMSA8PCBiaXRudW0pOworCW1kaW9fd3JpdGUoaW9hZGRyLCByZWcsIHZhbCAmIDB4ZmZmZik7IAorfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X2dldF9tYWNfdmVyc2lvbihzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCwgdm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJY29uc3Qgc3RydWN0IHsKKwkJdTMyIG1hc2s7CisJCWludCBtYWNfdmVyc2lvbjsKKwl9IG1hY19pbmZvW10gPSB7CisJCXsgMHgxIDw8IDI4LAlSVExfR0lHQV9NQUNfVkVSX1ggfSwKKwkJeyAweDEgPDwgMjYsCVJUTF9HSUdBX01BQ19WRVJfRSB9LAorCQl7IDB4MSA8PCAyMywJUlRMX0dJR0FfTUFDX1ZFUl9EIH0sIAorCQl7IDB4MDAwMDAwMDAsCVJUTF9HSUdBX01BQ19WRVJfQiB9IC8qIENhdGNoLWFsbCAqLworCX0sICpwID0gbWFjX2luZm87CisJdTMyIHJlZzsKKworCXJlZyA9IFJUTF9SMzIoVHhDb25maWcpICYgMHg3YzgwMDAwMDsKKwl3aGlsZSAoKHJlZyAmIHAtPm1hc2spICE9IHAtPm1hc2spCisJCXArKzsKKwl0cC0+bWFjX3ZlcnNpb24gPSBwLT5tYWNfdmVyc2lvbjsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9wcmludF9tYWNfdmVyc2lvbihzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKK3sKKwlzdHJ1Y3QgeworCQlpbnQgdmVyc2lvbjsKKwkJY2hhciAqbXNnOworCX0gbWFjX3ByaW50W10gPSB7CisJCXsgUlRMX0dJR0FfTUFDX1ZFUl9FLCAiUlRMX0dJR0FfTUFDX1ZFUl9FIiB9LAorCQl7IFJUTF9HSUdBX01BQ19WRVJfRCwgIlJUTF9HSUdBX01BQ19WRVJfRCIgfSwKKwkJeyBSVExfR0lHQV9NQUNfVkVSX0IsICJSVExfR0lHQV9NQUNfVkVSX0IiIH0sCisJCXsgMCwgTlVMTCB9CisJfSwgKnA7CisKKwlmb3IgKHAgPSBtYWNfcHJpbnQ7IHAtPm1zZzsgcCsrKSB7CisJCWlmICh0cC0+bWFjX3ZlcnNpb24gPT0gcC0+dmVyc2lvbikgeworCQkJZHByaW50aygibWFjX3ZlcnNpb24gPT0gJXMgKCUwNGQpXG4iLCBwLT5tc2csCisJCQkJICBwLT52ZXJzaW9uKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlkcHJpbnRrKCJtYWNfdmVyc2lvbiA9PSBVbmtub3duXG4iKTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9nZXRfcGh5X3ZlcnNpb24oc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAsIHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCWNvbnN0IHN0cnVjdCB7CisJCXUxNiBtYXNrOworCQl1MTYgc2V0OworCQlpbnQgcGh5X3ZlcnNpb247CisJfSBwaHlfaW5mb1tdID0geworCQl7IDB4MDAwZiwgMHgwMDAyLCBSVExfR0lHQV9QSFlfVkVSX0cgfSwKKwkJeyAweDAwMGYsIDB4MDAwMSwgUlRMX0dJR0FfUEhZX1ZFUl9GIH0sCisJCXsgMHgwMDBmLCAweDAwMDAsIFJUTF9HSUdBX1BIWV9WRVJfRSB9LAorCQl7IDB4MDAwMCwgMHgwMDAwLCBSVExfR0lHQV9QSFlfVkVSX0QgfSAvKiBDYXRjaC1hbGwgKi8KKwl9LCAqcCA9IHBoeV9pbmZvOworCXUxNiByZWc7CisKKwlyZWcgPSBtZGlvX3JlYWQoaW9hZGRyLCAzKSAmIDB4ZmZmZjsKKwl3aGlsZSAoKHJlZyAmIHAtPm1hc2spICE9IHAtPnNldCkKKwkJcCsrOworCXRwLT5waHlfdmVyc2lvbiA9IHAtPnBoeV92ZXJzaW9uOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3ByaW50X3BoeV92ZXJzaW9uKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwKQoreworCXN0cnVjdCB7CisJCWludCB2ZXJzaW9uOworCQljaGFyICptc2c7CisJCXUzMiByZWc7CisJfSBwaHlfcHJpbnRbXSA9IHsKKwkJeyBSVExfR0lHQV9QSFlfVkVSX0csICJSVExfR0lHQV9QSFlfVkVSX0ciLCAweDAwMDIgfSwKKwkJeyBSVExfR0lHQV9QSFlfVkVSX0YsICJSVExfR0lHQV9QSFlfVkVSX0YiLCAweDAwMDEgfSwKKwkJeyBSVExfR0lHQV9QSFlfVkVSX0UsICJSVExfR0lHQV9QSFlfVkVSX0UiLCAweDAwMDAgfSwKKwkJeyBSVExfR0lHQV9QSFlfVkVSX0QsICJSVExfR0lHQV9QSFlfVkVSX0QiLCAweDAwMDAgfSwKKwkJeyAwLCBOVUxMLCAweDAwMDAgfQorCX0sICpwOworCisJZm9yIChwID0gcGh5X3ByaW50OyBwLT5tc2c7IHArKykgeworCQlpZiAodHAtPnBoeV92ZXJzaW9uID09IHAtPnZlcnNpb24pIHsKKwkJCWRwcmludGsoInBoeV92ZXJzaW9uID09ICVzICglMDR4KVxuIiwgcC0+bXNnLCBwLT5yZWcpOworCQkJcmV0dXJuOworCQl9CisJfQorCWRwcmludGsoInBoeV92ZXJzaW9uID09IFVua25vd25cbiIpOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X2h3X3BoeV9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXN0cnVjdCB7CisJCXUxNiByZWdzWzVdOyAvKiBCZXdhcmUgb2YgYml0LXNpZ24gcHJvcGFnYXRpb24gKi8KKwl9IHBoeV9tYWdpY1s1XSA9IHsgeworCQl7IDB4MDAwMCwJLy93IDQgMTUgMTIgMAorCQkgIDB4MDBhMSwJLy93IDMgMTUgMCAwMGExCisJCSAgMHgwMDA4LAkvL3cgMiAxNSAwIDAwMDgKKwkJICAweDEwMjAsCS8vdyAxIDE1IDAgMTAyMAorCQkgIDB4MTAwMCB9IH0sewkvL3cgMCAxNSAwIDEwMDAKKwkJeyAweDcwMDAsCS8vdyA0IDE1IDEyIDcKKwkJICAweGZmNDEsCS8vdyAzIDE1IDAgZmY0MQorCQkgIDB4ZGU2MCwJLy93IDIgMTUgMCBkZTYwCisJCSAgMHgwMTQwLAkvL3cgMSAxNSAwIDAxNDAKKwkJICAweDAwNzcgfSB9LHsJLy93IDAgMTUgMCAwMDc3CisJCXsgMHhhMDAwLAkvL3cgNCAxNSAxMiBhCisJCSAgMHhkZjAxLAkvL3cgMyAxNSAwIGRmMDEKKwkJICAweGRmMjAsCS8vdyAyIDE1IDAgZGYyMAorCQkgIDB4ZmY5NSwJLy93IDEgMTUgMCBmZjk1CisJCSAgMHhmYTAwIH0gfSx7CS8vdyAwIDE1IDAgZmEwMAorCQl7IDB4YjAwMCwJLy93IDQgMTUgMTIgYgorCQkgIDB4ZmY0MSwJLy93IDMgMTUgMCBmZjQxCisJCSAgMHhkZTIwLAkvL3cgMiAxNSAwIGRlMjAKKwkJICAweDAxNDAsCS8vdyAxIDE1IDAgMDE0MAorCQkgIDB4MDBiYiB9IH0sewkvL3cgMCAxNSAwIDAwYmIKKwkJeyAweGYwMDAsCS8vdyA0IDE1IDEyIGYKKwkJICAweGRmMDEsCS8vdyAzIDE1IDAgZGYwMQorCQkgIDB4ZGYyMCwJLy93IDIgMTUgMCBkZjIwCisJCSAgMHhmZjk1LAkvL3cgMSAxNSAwIGZmOTUKKwkJICAweGJmMDAgfQkvL3cgMCAxNSAwIGJmMDAKKwkJfQorCX0sICpwID0gcGh5X21hZ2ljOworCWludCBpOworCisJcnRsODE2OV9wcmludF9tYWNfdmVyc2lvbih0cCk7CisJcnRsODE2OV9wcmludF9waHlfdmVyc2lvbih0cCk7CisKKwlpZiAodHAtPm1hY192ZXJzaW9uIDw9IFJUTF9HSUdBX01BQ19WRVJfQikKKwkJcmV0dXJuOworCWlmICh0cC0+cGh5X3ZlcnNpb24gPj0gUlRMX0dJR0FfUEhZX1ZFUl9IKQorCQlyZXR1cm47CisKKwlkcHJpbnRrKCJNQUMgdmVyc2lvbiAhPSAwICYmIFBIWSB2ZXJzaW9uID09IDAgb3IgMVxuIik7CisJZHByaW50aygiRG8gZmluYWxfcmVnMi5jZmdcbiIpOworCisJLyogU2hhemFtICEgKi8KKworCWlmICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl9YKSB7CisJCW1kaW9fd3JpdGUoaW9hZGRyLCAzMSwgMHgwMDAxKTsKKwkJbWRpb193cml0ZShpb2FkZHIsICA5LCAweDI3M2EpOworCQltZGlvX3dyaXRlKGlvYWRkciwgMTQsIDB4N2JmYik7CisJCW1kaW9fd3JpdGUoaW9hZGRyLCAyNywgMHg4NDFlKTsKKworCQltZGlvX3dyaXRlKGlvYWRkciwgMzEsIDB4MDAwMik7CisJCW1kaW9fd3JpdGUoaW9hZGRyLCAgMSwgMHg5MGQwKTsKKwkJbWRpb193cml0ZShpb2FkZHIsIDMxLCAweDAwMDApOworCQlyZXR1cm47CisJfQorCisJLyogcGh5IGNvbmZpZyBmb3IgUlRMODE2OXMgbWFjX3ZlcnNpb24gQyBjaGlwICovCisJbWRpb193cml0ZShpb2FkZHIsIDMxLCAweDAwMDEpOwkJCS8vdyAzMSAyIDAgMQorCW1kaW9fd3JpdGUoaW9hZGRyLCAyMSwgMHgxMDAwKTsJCQkvL3cgMjEgMTUgMCAxMDAwCisJbWRpb193cml0ZShpb2FkZHIsIDI0LCAweDY1YzcpOwkJCS8vdyAyNCAxNSAwIDY1YzcKKwlydGw4MTY5X3dyaXRlX2dtaWlfcmVnX2JpdChpb2FkZHIsIDQsIDExLCAwKTsJLy93IDQgMTEgMTEgMAorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGh5X21hZ2ljKTsgaSsrLCBwKyspIHsKKwkJaW50IHZhbCwgcG9zID0gNDsKKworCQl2YWwgPSAobWRpb19yZWFkKGlvYWRkciwgcG9zKSAmIDB4MGZmZikgfCAocC0+cmVnc1swXSAmIDB4ZmZmZik7CisJCW1kaW9fd3JpdGUoaW9hZGRyLCBwb3MsIHZhbCk7CisJCXdoaWxlICgtLXBvcyA+PSAwKQorCQkJbWRpb193cml0ZShpb2FkZHIsIHBvcywgcC0+cmVnc1s0IC0gcG9zXSAmIDB4ZmZmZik7CisJCXJ0bDgxNjlfd3JpdGVfZ21paV9yZWdfYml0KGlvYWRkciwgNCwgMTEsIDEpOyAvL3cgNCAxMSAxMSAxCisJCXJ0bDgxNjlfd3JpdGVfZ21paV9yZWdfYml0KGlvYWRkciwgNCwgMTEsIDApOyAvL3cgNCAxMSAxMSAwCisJfQorCW1kaW9fd3JpdGUoaW9hZGRyLCAzMSwgMHgwMDAwKTsgLy93IDMxIDIgMCAwCit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfcGh5X3RpbWVyKHVuc2lnbmVkIGxvbmcgX19vcGFxdWUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKV9fb3BhcXVlOworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIgPSAmdHAtPnRpbWVyOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBSVEw4MTY5X1BIWV9USU1FT1VUOworCisJYXNzZXJ0KHRwLT5tYWNfdmVyc2lvbiA+IFJUTF9HSUdBX01BQ19WRVJfQik7CisJYXNzZXJ0KHRwLT5waHlfdmVyc2lvbiA8IFJUTF9HSUdBX1BIWV9WRVJfSCk7CisKKwlpZiAoISh0cC0+cGh5XzEwMDBfY3RybF9yZWcgJiBQSFlfQ2FwXzEwMDBfRnVsbCkpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKworCWlmICh0cC0+cGh5X3Jlc2V0X3BlbmRpbmcoaW9hZGRyKSkgeworCQkvKiAKKwkJICogQSBidXN5IGxvb3AgY291bGQgYnVybiBxdWl0ZSBhIGZldyBjeWNsZXMgb24gbm93YWRheXMgQ1BVLgorCQkgKiBMZXQncyBkZWxheSB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0aW1lciBmb3IgYSBmZXcgdGlja3MuCisJCSAqLworCQl0aW1lb3V0ID0gSFovMTA7CisJCWdvdG8gb3V0X21vZF90aW1lcjsKKwl9CisKKwlpZiAodHAtPmxpbmtfb2soaW9hZGRyKSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIiVzOiBQSFkgcmVzZXQgdW50aWwgbGluayB1cFxuIiwgZGV2LT5uYW1lKTsKKworCXRwLT5waHlfcmVzZXRfZW5hYmxlKGlvYWRkcik7CisKK291dF9tb2RfdGltZXI6CisJbW9kX3RpbWVyKHRpbWVyLCBqaWZmaWVzICsgdGltZW91dCk7CitvdXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRsODE2OV9kZWxldGVfdGltZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyID0gJnRwLT50aW1lcjsKKworCWlmICgodHAtPm1hY192ZXJzaW9uIDw9IFJUTF9HSUdBX01BQ19WRVJfQikgfHwKKwkgICAgKHRwLT5waHlfdmVyc2lvbiA+PSBSVExfR0lHQV9QSFlfVkVSX0gpKQorCQlyZXR1cm47CisKKwlkZWxfdGltZXJfc3luYyh0aW1lcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGw4MTY5X3JlcXVlc3RfdGltZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyID0gJnRwLT50aW1lcjsKKworCWlmICgodHAtPm1hY192ZXJzaW9uIDw9IFJUTF9HSUdBX01BQ19WRVJfQikgfHwKKwkgICAgKHRwLT5waHlfdmVyc2lvbiA+PSBSVExfR0lHQV9QSFlfVkVSX0gpKQorCQlyZXR1cm47CisKKwlpbml0X3RpbWVyKHRpbWVyKTsKKwl0aW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyBSVEw4MTY5X1BIWV9USU1FT1VUOworCXRpbWVyLT5kYXRhID0gKHVuc2lnbmVkIGxvbmcpKGRldik7CisJdGltZXItPmZ1bmN0aW9uID0gcnRsODE2OV9waHlfdGltZXI7CisJYWRkX3RpbWVyKHRpbWVyKTsKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisvKgorICogUG9sbGluZyAnaW50ZXJydXB0JyAtIHVzZWQgYnkgdGhpbmdzIGxpa2UgbmV0Y29uc29sZSB0byBzZW5kIHNrYnMKKyAqIHdpdGhvdXQgaGF2aW5nIHRvIHJlLWVuYWJsZSBpbnRlcnJ1cHRzLiBJdCdzIG5vdCBjYWxsZWQgd2hpbGUKKyAqIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBpcyBleGVjdXRpbmcuCisgKi8KK3N0YXRpYyB2b2lkIHJ0bDgxNjlfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRwLT5wY2lfZGV2OworCisJZGlzYWJsZV9pcnEocGRldi0+aXJxKTsKKwlydGw4MTY5X2ludGVycnVwdChwZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJZW5hYmxlX2lycShwZGV2LT5pcnEpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfcmVsZWFzZV9ib2FyZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCWlvdW5tYXAoaW9hZGRyKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlmcmVlX25ldGRldihkZXYpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorcnRsODE2OV9pbml0X2JvYXJkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqKmRldl9vdXQsCisJCSAgIHZvaWQgX19pb21lbSAqKmlvYWRkcl9vdXQpCit7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cDsKKwlpbnQgcmMgPSAtRU5PTUVNLCBpLCBhY3BpX2lkbGVfc3RhdGUgPSAwLCBwbV9jYXA7CisKKwlhc3NlcnQoaW9hZGRyX291dCAhPSBOVUxMKTsKKworCS8qIGRldiB6ZXJvZWQgaW4gYWxsb2NfZXRoZXJkZXYgKi8KKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YgKCp0cCkpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gYWxsb2MgbmV3IGV0aGVybmV0XG4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCXRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIGVuYWJsZSBkZXZpY2UgKGluY2wuIFBDSSBQTSB3YWtldXAgYW5kIGhvdHBsdWcgc2V0dXApICovCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IGVuYWJsZSBmYWlsdXJlXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gZXJyX291dF9mcmVlX2RldjsKKwl9CisKKwlyYyA9IHBjaV9zZXRfbXdpKHBkZXYpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCisJLyogc2F2ZSBwb3dlciBzdGF0ZSBiZWZvcmUgcGNpX2VuYWJsZV9kZXZpY2Ugb3ZlcndyaXRlcyBpdCAqLworCXBtX2NhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9QTSk7CisJaWYgKHBtX2NhcCkgeworCQl1MTYgcHdyX2NvbW1hbmQ7CisKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG1fY2FwICsgUENJX1BNX0NUUkwsICZwd3JfY29tbWFuZCk7CisJCWFjcGlfaWRsZV9zdGF0ZSA9IHB3cl9jb21tYW5kICYgUENJX1BNX0NUUkxfU1RBVEVfTUFTSzsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCSAgICAgICAiQ2Fubm90IGZpbmQgUG93ZXJNYW5hZ2VtZW50IGNhcGFiaWxpdHksIGFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9td2k7CisJfQorCisJLyogbWFrZSBzdXJlIFBDSSBiYXNlIGFkZHIgMSBpcyBNTUlPICovCisJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDEpICYgSU9SRVNPVVJDRV9NRU0pKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJICAgICAgICJyZWdpb24gIzEgbm90IGFuIE1NSU8gcmVzb3VyY2UsIGFib3J0aW5nXG4iKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfbXdpOworCX0KKwkvKiBjaGVjayBmb3Igd2VpcmQvYnJva2VuIFBDSSByZWdpb24gcmVwb3J0aW5nICovCisJaWYgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkgPCBSODE2OV9SRUdTX1NJWkUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSW52YWxpZCBQQ0kgcmVnaW9uIHNpemUocyksIGFib3J0aW5nXG4iKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfbXdpOworCX0KKworCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBNT0RVTEVOQU1FKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IGNvdWxkIG5vdCByZXF1ZXN0IHJlZ2lvbnMuXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlnb3RvIGVycl9vdXRfbXdpOworCX0KKworCXRwLT5jcF9jbWQgPSBQQ0lNdWxSVyB8IFJ4Q2hrU3VtOworCisJaWYgKChzaXplb2YoZG1hX2FkZHJfdCkgPiA0KSAmJgorCSAgICAhcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykgJiYgdXNlX2RhYykgeworCQl0cC0+Y3BfY21kIHw9IFBDSURBQzsKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CisJfSBlbHNlIHsKKwkJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRE1BIGNvbmZpZ3VyYXRpb24gZmFpbGVkLlxuIik7CisJCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJCX0KKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCS8qIGlvcmVtYXAgTU1JTyByZWdpb24gKi8KKwlpb2FkZHIgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKSwgUjgxNjlfUkVHU19TSVpFKTsKKwlpZiAoaW9hZGRyID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlbWFwIE1NSU8sIGFib3J0aW5nXG4iKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJfQorCisJLyogVW5uZWVkZWQgPyBEb24ndCBtZXNzIHdpdGggTXJzLiBNdXJwaHkuICovCisJcnRsODE2OV9pcnFfbWFza19hbmRfYWNrKGlvYWRkcik7CisKKwkvKiBTb2Z0IHJlc2V0IHRoZSBjaGlwLiAqLworCVJUTF9XOChDaGlwQ21kLCBDbWRSZXNldCk7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBjaGlwIGhhcyBmaW5pc2hlZCB0aGUgcmVzZXQuICovCisJZm9yIChpID0gMTAwMDsgaSA+IDA7IGktLSkgeworCQlpZiAoKFJUTF9SOChDaGlwQ21kKSAmIENtZFJlc2V0KSA9PSAwKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCisJLyogSWRlbnRpZnkgY2hpcCBhdHRhY2hlZCB0byBib2FyZCAqLworCXJ0bDgxNjlfZ2V0X21hY192ZXJzaW9uKHRwLCBpb2FkZHIpOworCXJ0bDgxNjlfZ2V0X3BoeV92ZXJzaW9uKHRwLCBpb2FkZHIpOworCisJcnRsODE2OV9wcmludF9tYWNfdmVyc2lvbih0cCk7CisJcnRsODE2OV9wcmludF9waHlfdmVyc2lvbih0cCk7CisKKwlmb3IgKGkgPSBBUlJBWV9TSVpFKHJ0bF9jaGlwX2luZm8pIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKHRwLT5tYWNfdmVyc2lvbiA9PSBydGxfY2hpcF9pbmZvW2ldLm1hY192ZXJzaW9uKQorCQkJYnJlYWs7CisJfQorCWlmIChpIDwgMCkgeworCQkvKiBVbmtub3duIGNoaXA6IGFzc3VtZSBhcnJheSBlbGVtZW50ICMwLCBvcmlnaW5hbCBSVEwtODE2OSAqLworCQlwcmludGsoS0VSTl9ERUJVRyBQRlgKKwkJICAgICAgICJQQ0kgZGV2aWNlICVzOiB1bmtub3duIGNoaXAgdmVyc2lvbiwgYXNzdW1pbmcgJXNcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSwgcnRsX2NoaXBfaW5mb1swXS5uYW1lKTsKKwkJaSsrOworCX0KKwl0cC0+Y2hpcHNldCA9IGk7CisKKwkqaW9hZGRyX291dCA9IGlvYWRkcjsKKwkqZGV2X291dCA9IGRldjsKK291dDoKKwlyZXR1cm4gcmM7CisKK2Vycl9vdXRfZnJlZV9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworZXJyX291dF9td2k6CisJcGNpX2NsZWFyX213aShwZGV2KTsKKworZXJyX291dF9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworZXJyX291dF9mcmVlX2RldjoKKwlmcmVlX25ldGRldihkZXYpOworZXJyX291dDoKKwkqaW9hZGRyX291dCA9IE5VTEw7CisJKmRldl9vdXQgPSBOVUxMOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorcnRsODE2OV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cDsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IE5VTEw7CisJc3RhdGljIGludCBib2FyZF9pZHggPSAtMTsKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbiA9IDA7CisJdTggYXV0b25lZywgZHVwbGV4OworCXUxNiBzcGVlZDsKKwlpbnQgaSwgcmM7CisKKwlhc3NlcnQocGRldiAhPSBOVUxMKTsKKwlhc3NlcnQoZW50ICE9IE5VTEwpOworCisJYm9hcmRfaWR4Kys7CisKKwlpZiAoIXByaW50ZWRfdmVyc2lvbikgeworCQlwcmludGsoS0VSTl9JTkZPICIlcyBHaWdhYml0IEV0aGVybmV0IGRyaXZlciAlcyBsb2FkZWRcbiIsCisJCSAgICAgICBNT0RVTEVOQU1FLCBSVEw4MTY5X1ZFUlNJT04pOworCQlwcmludGVkX3ZlcnNpb24gPSAxOworCX0KKworCXJjID0gcnRsODE2OV9pbml0X2JvYXJkKHBkZXYsICZkZXYsICZpb2FkZHIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWFzc2VydChpb2FkZHIgIT0gTlVMTCk7CisKKwlpZiAoUlRMX1I4KFBIWXN0YXR1cykgJiBUQklfRW5hYmxlKSB7CisJCXRwLT5zZXRfc3BlZWQgPSBydGw4MTY5X3NldF9zcGVlZF90Ymk7CisJCXRwLT5nZXRfc2V0dGluZ3MgPSBydGw4MTY5X2dzZXRfdGJpOworCQl0cC0+cGh5X3Jlc2V0X2VuYWJsZSA9IHJ0bDgxNjlfdGJpX3Jlc2V0X2VuYWJsZTsKKwkJdHAtPnBoeV9yZXNldF9wZW5kaW5nID0gcnRsODE2OV90YmlfcmVzZXRfcGVuZGluZzsKKwkJdHAtPmxpbmtfb2sgPSBydGw4MTY5X3RiaV9saW5rX29rOworCisJCXRwLT5waHlfMTAwMF9jdHJsX3JlZyA9IFBIWV9DYXBfMTAwMF9GdWxsOyAvKiBJbXBsaWVkIGJ5IFRCSSAqLworCX0gZWxzZSB7CisJCXRwLT5zZXRfc3BlZWQgPSBydGw4MTY5X3NldF9zcGVlZF94bWlpOworCQl0cC0+Z2V0X3NldHRpbmdzID0gcnRsODE2OV9nc2V0X3htaWk7CisJCXRwLT5waHlfcmVzZXRfZW5hYmxlID0gcnRsODE2OV94bWlpX3Jlc2V0X2VuYWJsZTsKKwkJdHAtPnBoeV9yZXNldF9wZW5kaW5nID0gcnRsODE2OV94bWlpX3Jlc2V0X3BlbmRpbmc7CisJCXRwLT5saW5rX29rID0gcnRsODE2OV94bWlpX2xpbmtfb2s7CisJfQorCisJLyogR2V0IE1BQyBhZGRyZXNzLiAgRklYTUU6IHJlYWQgRUVQUk9NICovCisJZm9yIChpID0gMDsgaSA8IE1BQ19BRERSX0xFTjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gUlRMX1I4KE1BQzAgKyBpKTsKKworCWRldi0+b3BlbiA9IHJ0bDgxNjlfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHJ0bDgxNjlfc3RhcnRfeG1pdDsKKwlkZXYtPmdldF9zdGF0cyA9IHJ0bDgxNjlfZ2V0X3N0YXRzOworCVNFVF9FVEhUT09MX09QUyhkZXYsICZydGw4MTY5X2V0aHRvb2xfb3BzKTsKKwlkZXYtPnN0b3AgPSBydGw4MTY5X2Nsb3NlOworCWRldi0+dHhfdGltZW91dCA9IHJ0bDgxNjlfdHhfdGltZW91dDsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHJ0bDgxNjlfc2V0X3J4X21vZGU7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFJUTDgxNjlfVFhfVElNRU9VVDsKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKSBpb2FkZHI7CisJZGV2LT5jaGFuZ2VfbXR1ID0gcnRsODE2OV9jaGFuZ2VfbXR1OworCisjaWZkZWYgQ09ORklHX1I4MTY5X05BUEkKKwlkZXYtPnBvbGwgPSBydGw4MTY5X3BvbGw7CisJZGV2LT53ZWlnaHQgPSBSODE2OV9OQVBJX1dFSUdIVDsKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiTkFQSSBlbmFibGVkXG4iKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1I4MTY5X1ZMQU4KKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9UWCB8IE5FVElGX0ZfSFdfVkxBTl9SWDsKKwlkZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPSBydGw4MTY5X3ZsYW5fcnhfcmVnaXN0ZXI7CisJZGV2LT52bGFuX3J4X2tpbGxfdmlkID0gcnRsODE2OV92bGFuX3J4X2tpbGxfdmlkOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gcnRsODE2OV9uZXRwb2xsOworI2VuZGlmCisKKwl0cC0+aW50cl9tYXNrID0gMHhmZmZmOworCXRwLT5wY2lfZGV2ID0gcGRldjsKKwl0cC0+bW1pb19hZGRyID0gaW9hZGRyOworCisJc3Bpbl9sb2NrX2luaXQoJnRwLT5sb2NrKTsKKworCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJjKSB7CisJCXJ0bDgxNjlfcmVsZWFzZV9ib2FyZChwZGV2LCBkZXYsIGlvYWRkcik7CisJCXJldHVybiByYzsKKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IElkZW50aWZpZWQgY2hpcCB0eXBlIGlzICclcycuXG4iLCBkZXYtPm5hbWUsCisJICAgICAgIHJ0bF9jaGlwX2luZm9bdHAtPmNoaXBzZXRdLm5hbWUpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgYXQgMHglbHgsICIKKwkgICAgICAgIiUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4LCAiCisJICAgICAgICJJUlEgJWRcbiIsCisJICAgICAgIGRldi0+bmFtZSwKKwkgICAgICAgcnRsX2NoaXBfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXS5uYW1lLAorCSAgICAgICBkZXYtPmJhc2VfYWRkciwKKwkgICAgICAgZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwKKwkgICAgICAgZGV2LT5kZXZfYWRkclsyXSwgZGV2LT5kZXZfYWRkclszXSwKKwkgICAgICAgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSwgZGV2LT5pcnEpOworCisJcnRsODE2OV9od19waHlfY29uZmlnKGRldik7CisKKwlkcHJpbnRrKCJTZXQgTUFDIFJlZyBDK0NSIE9mZnNldCAweDgyaCA9IDB4MDFoXG4iKTsKKwlSVExfVzgoMHg4MiwgMHgwMSk7CisKKwlpZiAodHAtPm1hY192ZXJzaW9uIDwgUlRMX0dJR0FfTUFDX1ZFUl9FKSB7CisJCWRwcmludGsoIlNldCBQQ0kgTGF0ZW5jeT0weDQwXG4iKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDQwKTsKKwl9CisKKwlpZiAodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfRCkgeworCQlkcHJpbnRrKCJTZXQgTUFDIFJlZyBDK0NSIE9mZnNldCAweDgyaCA9IDB4MDFoXG4iKTsKKwkJUlRMX1c4KDB4ODIsIDB4MDEpOworCQlkcHJpbnRrKCJTZXQgUEhZIFJlZyAweDBiaCA9IDB4MDBoXG4iKTsKKwkJbWRpb193cml0ZShpb2FkZHIsIDB4MGIsIDB4MDAwMCk7IC8vdyAweDBiIDE1IDAgMAorCX0KKworCXJ0bDgxNjlfbGlua19vcHRpb24oYm9hcmRfaWR4LCAmYXV0b25lZywgJnNwZWVkLCAmZHVwbGV4KTsKKworCXJ0bDgxNjlfc2V0X3NwZWVkKGRldiwgYXV0b25lZywgc3BlZWQsIGR1cGxleCk7CisJCisJaWYgKFJUTF9SOChQSFlzdGF0dXMpICYgVEJJX0VuYWJsZSkKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBUQkkgYXV0by1uZWdvdGlhdGluZ1xuIiwgZGV2LT5uYW1lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQKK3J0bDgxNjlfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWFzc2VydChkZXYgIT0gTlVMTCk7CisJYXNzZXJ0KHRwICE9IE5VTEwpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlydGw4MTY5X3JlbGVhc2VfYm9hcmQocGRldiwgZGV2LCB0cC0+bW1pb19hZGRyKTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIGludCBydGw4MTY5X3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gMDsKKwkKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzLCBzdG9wIFJ4IGFuZCBUeCAqLworCVJUTF9XMTYoSW50ck1hc2ssIDApOworCVJUTF9XOChDaGlwQ21kLCAwKTsKKwkJCisJLyogVXBkYXRlIHRoZSBlcnJvciBjb3VudHMuICovCisJdHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gUlRMX1IzMihSeE1pc3NlZCk7CisJUlRMX1czMihSeE1pc3NlZCwgMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGw4MTY5X3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJICAgIHJldHVybiAwOworCisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCXJ0bDgxNjlfaHdfc3RhcnQoZGV2KTsKKworCXJldHVybiAwOworfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIHZvaWQgcnRsODE2OV9zZXRfcnhidWZzaXplKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwLAorCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBpbnQgbXR1ID0gZGV2LT5tdHU7CisKKwl0cC0+cnhfYnVmX3N6ID0gKG10dSA+IFJYX0JVRl9TSVpFKSA/IG10dSArIEVUSF9ITEVOICsgOCA6IFJYX0JVRl9TSVpFOworfQorCitzdGF0aWMgaW50IHJ0bDgxNjlfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRwLT5wY2lfZGV2OworCWludCByZXR2YWw7CisKKwlydGw4MTY5X3NldF9yeGJ1ZnNpemUodHAsIGRldik7CisKKwlyZXR2YWwgPQorCSAgICByZXF1ZXN0X2lycShkZXYtPmlycSwgcnRsODE2OV9pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0dmFsID0gLUVOT01FTTsKKworCS8qCisJICogUnggYW5kIFR4IGRlc3NjcmlwdG9ycyBuZWVkcyAyNTYgYnl0ZXMgYWxpZ25tZW50LgorCSAqIHBjaV9hbGxvY19jb25zaXN0ZW50IHByb3ZpZGVzIG1vcmUuCisJICovCisJdHAtPlR4RGVzY0FycmF5ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgUjgxNjlfVFhfUklOR19CWVRFUywKKwkJCQkJICAgICAgICZ0cC0+VHhQaHlBZGRyKTsKKwlpZiAoIXRwLT5UeERlc2NBcnJheSkKKwkJZ290byBlcnJfZnJlZV9pcnE7CisKKwl0cC0+UnhEZXNjQXJyYXkgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBSODE2OV9SWF9SSU5HX0JZVEVTLAorCQkJCQkgICAgICAgJnRwLT5SeFBoeUFkZHIpOworCWlmICghdHAtPlJ4RGVzY0FycmF5KQorCQlnb3RvIGVycl9mcmVlX3R4OworCisJcmV0dmFsID0gcnRsODE2OV9pbml0X3JpbmcoZGV2KTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBlcnJfZnJlZV9yeDsKKworCUlOSVRfV09SSygmdHAtPnRhc2ssIE5VTEwsIGRldik7CisKKwlydGw4MTY5X2h3X3N0YXJ0KGRldik7CisKKwlydGw4MTY5X3JlcXVlc3RfdGltZXIoZGV2KTsKKworCXJ0bDgxNjlfY2hlY2tfbGlua19zdGF0dXMoZGV2LCB0cCwgdHAtPm1taW9fYWRkcik7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKKworZXJyX2ZyZWVfcng6CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSODE2OV9SWF9SSU5HX0JZVEVTLCB0cC0+UnhEZXNjQXJyYXksCisJCQkgICAgdHAtPlJ4UGh5QWRkcik7CitlcnJfZnJlZV90eDoKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFI4MTY5X1RYX1JJTkdfQllURVMsIHRwLT5UeERlc2NBcnJheSwKKwkJCSAgICB0cC0+VHhQaHlBZGRyKTsKK2Vycl9mcmVlX2lycToKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9od19yZXNldCh2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlydGw4MTY5X2lycV9tYXNrX2FuZF9hY2soaW9hZGRyKTsKKworCS8qIFJlc2V0IHRoZSBjaGlwc2V0ICovCisJUlRMX1c4KENoaXBDbWQsIENtZFJlc2V0KTsKKworCS8qIFBDSSBjb21taXQgKi8KKwlSVExfUjgoQ2hpcENtZCk7Cit9CisKK3N0YXRpYyB2b2lkCitydGw4MTY5X2h3X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwl1MzIgaTsKKworCS8qIFNvZnQgcmVzZXQgdGhlIGNoaXAuICovCisJUlRMX1c4KENoaXBDbWQsIENtZFJlc2V0KTsKKworCS8qIENoZWNrIHRoYXQgdGhlIGNoaXAgaGFzIGZpbmlzaGVkIHRoZSByZXNldC4gKi8KKwlmb3IgKGkgPSAxMDAwOyBpID4gMDsgaS0tKSB7CisJCWlmICgoUlRMX1I4KENoaXBDbWQpICYgQ21kUmVzZXQpID09IDApCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwlSVExfVzgoQ2ZnOTM0NiwgQ2ZnOTM0Nl9VbmxvY2spOworCVJUTF9XOChDaGlwQ21kLCBDbWRUeEVuYiB8IENtZFJ4RW5iKTsKKwlSVExfVzgoRWFybHlUeFRocmVzLCBFYXJseVR4VGhsZCk7CisKKwkvKiBGb3IgZ2lnYWJpdCBydGw4MTY5LCBNVFUgKyBoZWFkZXIgKyBDUkMgKyBWTEFOICovCisJUlRMX1cxNihSeE1heFNpemUsIHRwLT5yeF9idWZfc3opOworCisJLyogU2V0IFJ4IENvbmZpZyByZWdpc3RlciAqLworCWkgPSBydGw4MTY5X3J4X2NvbmZpZyB8CisJCShSVExfUjMyKFJ4Q29uZmlnKSAmIHJ0bF9jaGlwX2luZm9bdHAtPmNoaXBzZXRdLlJ4Q29uZmlnTWFzayk7CisJUlRMX1czMihSeENvbmZpZywgaSk7CisKKwkvKiBTZXQgRE1BIGJ1cnN0IHNpemUgYW5kIEludGVyZnJhbWUgR2FwIFRpbWUgKi8KKwlSVExfVzMyKFR4Q29uZmlnLAorCQkoVFhfRE1BX0JVUlNUIDw8IFR4RE1BU2hpZnQpIHwgKEludGVyRnJhbWVHYXAgPDwKKwkJCQkJCVR4SW50ZXJGcmFtZUdhcFNoaWZ0KSk7CisJdHAtPmNwX2NtZCB8PSBSVExfUjE2KENQbHVzQ21kKTsKKwlSVExfVzE2KENQbHVzQ21kLCB0cC0+Y3BfY21kKTsKKworCWlmICgodHAtPm1hY192ZXJzaW9uID09IFJUTF9HSUdBX01BQ19WRVJfRCkgfHwKKwkgICAgKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSX0UpKSB7CisJCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiU2V0IE1BQyBSZWcgQytDUiBPZmZzZXQgMHhFMC4gIgorCQkJIkJpdC0zIGFuZCBiaXQtMTQgTVVTVCBiZSAxXG4iKTsKKwkJdHAtPmNwX2NtZCB8PSAoMSA8PCAxNCkgfCBQQ0lNdWxSVzsKKwkJUlRMX1cxNihDUGx1c0NtZCwgdHAtPmNwX2NtZCk7CisJfQorCisJLyoKKwkgKiBVbmRvY3VtZW50ZWQgY29ybmVyLiBTdXBwb3NlZGx5OgorCSAqIChUeFRpbWVyIDw8IDEyKSB8IChUeFBhY2tldHMgPDwgOCkgfCAoUnhUaW1lciA8PCA0KSB8IFJ4UGFja2V0cworCSAqLworCVJUTF9XMTYoSW50ck1pdGlnYXRlLCAweDAwMDApOworCisJUlRMX1czMihUeERlc2NTdGFydEFkZHJMb3csICgodTY0KSB0cC0+VHhQaHlBZGRyICYgRE1BXzMyQklUX01BU0spKTsKKwlSVExfVzMyKFR4RGVzY1N0YXJ0QWRkckhpZ2gsICgodTY0KSB0cC0+VHhQaHlBZGRyID4+IDMyKSk7CisJUlRMX1czMihSeERlc2NBZGRyTG93LCAoKHU2NCkgdHAtPlJ4UGh5QWRkciAmIERNQV8zMkJJVF9NQVNLKSk7CisJUlRMX1czMihSeERlc2NBZGRySGlnaCwgKCh1NjQpIHRwLT5SeFBoeUFkZHIgPj4gMzIpKTsKKwlSVExfVzgoQ2ZnOTM0NiwgQ2ZnOTM0Nl9Mb2NrKTsKKwl1ZGVsYXkoMTApOworCisJUlRMX1czMihSeE1pc3NlZCwgMCk7CisKKwlydGw4MTY5X3NldF9yeF9tb2RlKGRldik7CisKKwkvKiBubyBlYXJseS1yeCBpbnRlcnJ1cHRzICovCisJUlRMX1cxNihNdWx0aUludHIsIFJUTF9SMTYoTXVsdGlJbnRyKSAmIDB4RjAwMCk7CisKKwkvKiBFbmFibGUgYWxsIGtub3duIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJUlRMX1cxNihJbnRyTWFzaywgcnRsODE2OV9pbnRyX21hc2spOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBydGw4MTY5X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXQgPSAwOworCisJaWYgKG5ld19tdHUgPCBFVEhfWkxFTiB8fCBuZXdfbXR1ID4gU2FmZU10dSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXYtPm10dSA9IG5ld19tdHU7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJZ290byBvdXQ7CisKKwlydGw4MTY5X2Rvd24oZGV2KTsKKworCXJ0bDgxNjlfc2V0X3J4YnVmc2l6ZSh0cCwgZGV2KTsKKworCXJldCA9IHJ0bDgxNjlfaW5pdF9yaW5nKGRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJbmV0aWZfcG9sbF9lbmFibGUoZGV2KTsKKworCXJ0bDgxNjlfaHdfc3RhcnQoZGV2KTsKKworCXJ0bDgxNjlfcmVxdWVzdF90aW1lcihkZXYpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0bDgxNjlfbWFrZV91bnVzYWJsZV9ieV9hc2ljKHN0cnVjdCBSeERlc2MgKmRlc2MpCit7CisJZGVzYy0+YWRkciA9IDB4MGJhZGJhZGJhZGJhZGJhZHVsbDsKKwlkZXNjLT5vcHRzMSAmPSB+Y3B1X3RvX2xlMzIoRGVzY093biB8IFJzdmRNYXNrKTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV9mcmVlX3J4X3NrYihzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqKnNrX2J1ZmYsIHN0cnVjdCBSeERlc2MgKmRlc2MpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0cC0+cGNpX2RldjsKKworCXBjaV91bm1hcF9zaW5nbGUocGRldiwgbGU2NF90b19jcHUoZGVzYy0+YWRkciksIHRwLT5yeF9idWZfc3osCisJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlkZXZfa2ZyZWVfc2tiKCpza19idWZmKTsKKwkqc2tfYnVmZiA9IE5VTEw7CisJcnRsODE2OV9tYWtlX3VudXNhYmxlX2J5X2FzaWMoZGVzYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGw4MTY5X21hcmtfdG9fYXNpYyhzdHJ1Y3QgUnhEZXNjICpkZXNjLCB1MzIgcnhfYnVmX3N6KQoreworCXUzMiBlb3IgPSBsZTMyX3RvX2NwdShkZXNjLT5vcHRzMSkgJiBSaW5nRW5kOworCisJZGVzYy0+b3B0czEgPSBjcHVfdG9fbGUzMihEZXNjT3duIHwgZW9yIHwgcnhfYnVmX3N6KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0bDgxNjlfbWFwX3RvX2FzaWMoc3RydWN0IFJ4RGVzYyAqZGVzYywgZG1hX2FkZHJfdCBtYXBwaW5nLAorCQkJCSAgICAgICB1MzIgcnhfYnVmX3N6KQoreworCWRlc2MtPmFkZHIgPSBjcHVfdG9fbGU2NChtYXBwaW5nKTsKKwl3bWIoKTsKKwlydGw4MTY5X21hcmtfdG9fYXNpYyhkZXNjLCByeF9idWZfc3opOworfQorCitzdGF0aWMgaW50IHJ0bDgxNjlfYWxsb2Nfcnhfc2tiKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqKnNrX2J1ZmYsCisJCQkJc3RydWN0IFJ4RGVzYyAqZGVzYywgaW50IHJ4X2J1Zl9zeikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWRtYV9hZGRyX3QgbWFwcGluZzsKKwlpbnQgcmV0ID0gMDsKKworCXNrYiA9IGRldl9hbGxvY19za2IocnhfYnVmX3N6ICsgTkVUX0lQX0FMSUdOKTsKKwlpZiAoIXNrYikKKwkJZ290byBlcnJfb3V0OworCisJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOworCSpza19idWZmID0gc2tiOworCisJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsIHNrYi0+dGFpbCwgcnhfYnVmX3N6LAorCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJcnRsODE2OV9tYXBfdG9fYXNpYyhkZXNjLCBtYXBwaW5nLCByeF9idWZfc3opOworCitvdXQ6CisJcmV0dXJuIHJldDsKKworZXJyX291dDoKKwlyZXQgPSAtRU5PTUVNOworCXJ0bDgxNjlfbWFrZV91bnVzYWJsZV9ieV9hc2ljKGRlc2MpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3J4X2NsZWFyKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9ERVNDOyBpKyspIHsKKwkJaWYgKHRwLT5SeF9za2J1ZmZbaV0pIHsKKwkJCXJ0bDgxNjlfZnJlZV9yeF9za2IodHAsIHRwLT5SeF9za2J1ZmYgKyBpLAorCQkJCQkgICAgdHAtPlJ4RGVzY0FycmF5ICsgaSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB1MzIgcnRsODE2OV9yeF9maWxsKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgdTMyIHN0YXJ0LCB1MzIgZW5kKQoreworCXUzMiBjdXI7CisJCisJZm9yIChjdXIgPSBzdGFydDsgZW5kIC0gY3VyID4gMDsgY3VyKyspIHsKKwkJaW50IHJldCwgaSA9IGN1ciAlIE5VTV9SWF9ERVNDOworCisJCWlmICh0cC0+Unhfc2tidWZmW2ldKQorCQkJY29udGludWU7CisJCQkKKwkJcmV0ID0gcnRsODE2OV9hbGxvY19yeF9za2IodHAtPnBjaV9kZXYsIHRwLT5SeF9za2J1ZmYgKyBpLAorCQkJCQkgICB0cC0+UnhEZXNjQXJyYXkgKyBpLCB0cC0+cnhfYnVmX3N6KTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGN1ciAtIHN0YXJ0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRsODE2OV9tYXJrX2FzX2xhc3RfZGVzY3JpcHRvcihzdHJ1Y3QgUnhEZXNjICpkZXNjKQoreworCWRlc2MtPm9wdHMxIHw9IGNwdV90b19sZTMyKFJpbmdFbmQpOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X2luaXRfcmluZ19pbmRleGVzKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwKQoreworCXRwLT5kaXJ0eV90eCA9IHRwLT5kaXJ0eV9yeCA9IHRwLT5jdXJfdHggPSB0cC0+Y3VyX3J4ID0gMDsKK30KKworc3RhdGljIGludCBydGw4MTY5X2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJ0bDgxNjlfaW5pdF9yaW5nX2luZGV4ZXModHApOworCisJbWVtc2V0KHRwLT50eF9za2IsIDB4MCwgTlVNX1RYX0RFU0MgKiBzaXplb2Yoc3RydWN0IHJpbmdfaW5mbykpOworCW1lbXNldCh0cC0+Unhfc2tidWZmLCAweDAsIE5VTV9SWF9ERVNDICogc2l6ZW9mKHN0cnVjdCBza19idWZmICopKTsKKworCWlmIChydGw4MTY5X3J4X2ZpbGwodHAsIGRldiwgMCwgTlVNX1JYX0RFU0MpICE9IE5VTV9SWF9ERVNDKQorCQlnb3RvIGVycl9vdXQ7CisKKwlydGw4MTY5X21hcmtfYXNfbGFzdF9kZXNjcmlwdG9yKHRwLT5SeERlc2NBcnJheSArIE5VTV9SWF9ERVNDIC0gMSk7CisKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlydGw4MTY5X3J4X2NsZWFyKHRwKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgcnRsODE2OV91bm1hcF90eF9za2Ioc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCByaW5nX2luZm8gKnR4X3NrYiwKKwkJCQkgc3RydWN0IFR4RGVzYyAqZGVzYykKK3sKKwl1bnNpZ25lZCBpbnQgbGVuID0gdHhfc2tiLT5sZW47CisKKwlwY2lfdW5tYXBfc2luZ2xlKHBkZXYsIGxlNjRfdG9fY3B1KGRlc2MtPmFkZHIpLCBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCWRlc2MtPm9wdHMxID0gMHgwMDsKKwlkZXNjLT5vcHRzMiA9IDB4MDA7CisJZGVzYy0+YWRkciA9IDB4MDA7CisJdHhfc2tiLT5sZW4gPSAwOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3R4X2NsZWFyKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gdHAtPmRpcnR5X3R4OyBpIDwgdHAtPmRpcnR5X3R4ICsgTlVNX1RYX0RFU0M7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgZW50cnkgPSBpICUgTlVNX1RYX0RFU0M7CisJCXN0cnVjdCByaW5nX2luZm8gKnR4X3NrYiA9IHRwLT50eF9za2IgKyBlbnRyeTsKKwkJdW5zaWduZWQgaW50IGxlbiA9IHR4X3NrYi0+bGVuOworCisJCWlmIChsZW4pIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSB0eF9za2ItPnNrYjsKKworCQkJcnRsODE2OV91bm1hcF90eF9za2IodHAtPnBjaV9kZXYsIHR4X3NrYiwKKwkJCQkJICAgICB0cC0+VHhEZXNjQXJyYXkgKyBlbnRyeSk7CisJCQlpZiAoc2tiKSB7CisJCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJCXR4X3NrYi0+c2tiID0gTlVMTDsKKwkJCX0KKwkJCXRwLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCX0KKwl9CisJdHAtPmN1cl90eCA9IHRwLT5kaXJ0eV90eCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfc2NoZWR1bGVfd29yayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICgqdGFzaykodm9pZCAqKSkKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlQUkVQQVJFX1dPUksoJnRwLT50YXNrLCB0YXNrLCBkZXYpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdHAtPnRhc2ssIDQpOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3dhaXRfZm9yX3F1aWVzY2VuY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCisJc3luY2hyb25pemVfaXJxKGRldi0+aXJxKTsKKworCS8qIFdhaXQgZm9yIGFueSBwZW5kaW5nIE5BUEkgdGFzayB0byBjb21wbGV0ZSAqLworCW5ldGlmX3BvbGxfZGlzYWJsZShkZXYpOworCisJcnRsODE2OV9pcnFfbWFza19hbmRfYWNrKGlvYWRkcik7CisKKwluZXRpZl9wb2xsX2VuYWJsZShkZXYpOworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3JlaW5pdF90YXNrKHZvaWQgKl9kYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBfZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlydGw4MTY5X3dhaXRfZm9yX3F1aWVzY2VuY2UoZGV2KTsKKwkJcnRsODE2OV9jbG9zZShkZXYpOworCX0KKworCXJldCA9IHJ0bDgxNjlfb3BlbihkZXYpOworCWlmICh1bmxpa2VseShyZXQgPCAwKSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoUEZYIEtFUk5fRVJSICIlczogcmVpbml0IGZhaWx1cmUgKHN0YXR1cyA9ICVkKS4iCisJCQkgICAgICAgIiBSZXNjaGVkdWxpbmcuXG4iLCBkZXYtPm5hbWUsIHJldCk7CisJCX0KKwkJcnRsODE2OV9zY2hlZHVsZV93b3JrKGRldiwgcnRsODE2OV9yZWluaXRfdGFzayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3Jlc2V0X3Rhc2sodm9pZCAqX2RhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IF9kYXRhOworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm47CisKKwlydGw4MTY5X3dhaXRfZm9yX3F1aWVzY2VuY2UoZGV2KTsKKworCXJ0bDgxNjlfcnhfaW50ZXJydXB0KGRldiwgdHAsIHRwLT5tbWlvX2FkZHIpOworCXJ0bDgxNjlfdHhfY2xlYXIodHApOworCisJaWYgKHRwLT5kaXJ0eV9yeCA9PSB0cC0+Y3VyX3J4KSB7CisJCXJ0bDgxNjlfaW5pdF9yaW5nX2luZGV4ZXModHApOworCQlydGw4MTY5X2h3X3N0YXJ0KGRldik7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9IGVsc2UgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoUEZYIEtFUk5fRU1FUkcgIiVzOiBSeCBidWZmZXJzIHNob3J0YWdlXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCX0KKwkJcnRsODE2OV9zY2hlZHVsZV93b3JrKGRldiwgcnRsODE2OV9yZXNldF90YXNrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxNjlfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJ0bDgxNjlfaHdfcmVzZXQodHAtPm1taW9fYWRkcik7CisKKwkvKiBMZXQncyB3YWl0IGEgYml0IHdoaWxlIGFueSAoYXN5bmMpIGlycSBsYW5kcyBvbiAqLworCXJ0bDgxNjlfc2NoZWR1bGVfd29yayhkZXYsIHJ0bDgxNjlfcmVzZXRfdGFzayk7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV94bWl0X2ZyYWdzKHN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgdTMyIG9wdHMxKQoreworCXN0cnVjdCBza2Jfc2hhcmVkX2luZm8gKmluZm8gPSBza2Jfc2hpbmZvKHNrYik7CisJdW5zaWduZWQgaW50IGN1cl9mcmFnLCBlbnRyeTsKKwlzdHJ1Y3QgVHhEZXNjICp0eGQ7CisKKwllbnRyeSA9IHRwLT5jdXJfdHg7CisJZm9yIChjdXJfZnJhZyA9IDA7IGN1cl9mcmFnIDwgaW5mby0+bnJfZnJhZ3M7IGN1cl9mcmFnKyspIHsKKwkJc2tiX2ZyYWdfdCAqZnJhZyA9IGluZm8tPmZyYWdzICsgY3VyX2ZyYWc7CisJCWRtYV9hZGRyX3QgbWFwcGluZzsKKwkJdTMyIHN0YXR1cywgbGVuOworCQl2b2lkICphZGRyOworCisJCWVudHJ5ID0gKGVudHJ5ICsgMSkgJSBOVU1fVFhfREVTQzsKKworCQl0eGQgPSB0cC0+VHhEZXNjQXJyYXkgKyBlbnRyeTsKKwkJbGVuID0gZnJhZy0+c2l6ZTsKKwkJYWRkciA9ICgodm9pZCAqKSBwYWdlX2FkZHJlc3MoZnJhZy0+cGFnZSkpICsgZnJhZy0+cGFnZV9vZmZzZXQ7CisJCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGNpX2RldiwgYWRkciwgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCQkvKiBhbnRpIGdjYyAyLjk1LjMgYnVnd2FyZSAoc2ljKSAqLworCQlzdGF0dXMgPSBvcHRzMSB8IGxlbiB8IChSaW5nRW5kICogISgoZW50cnkgKyAxKSAlIE5VTV9UWF9ERVNDKSk7CisKKwkJdHhkLT5vcHRzMSA9IGNwdV90b19sZTMyKHN0YXR1cyk7CisJCXR4ZC0+YWRkciA9IGNwdV90b19sZTY0KG1hcHBpbmcpOworCisJCXRwLT50eF9za2JbZW50cnldLmxlbiA9IGxlbjsKKwl9CisKKwlpZiAoY3VyX2ZyYWcpIHsKKwkJdHAtPnR4X3NrYltlbnRyeV0uc2tiID0gc2tiOworCQl0eGQtPm9wdHMxIHw9IGNwdV90b19sZTMyKExhc3RGcmFnKTsKKwl9CisKKwlyZXR1cm4gY3VyX2ZyYWc7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHJ0bDgxNjlfdHNvX2NzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfVFNPKSB7CisJCXUzMiBtc3MgPSBza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplOworCisJCWlmIChtc3MpCisJCQlyZXR1cm4gTGFyZ2VTZW5kIHwgKChtc3MgJiBNU1NNYXNrKSA8PCBNU1NTaGlmdCk7CisJfQorCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwID0gc2tiLT5uaC5pcGg7CisKKwkJaWYgKGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKKwkJCXJldHVybiBJUENTIHwgVENQQ1M7CisJCWVsc2UgaWYgKGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkKKwkJCXJldHVybiBJUENTIHwgVURQQ1M7CisJCVdBUk5fT04oMSk7CS8qIHdlIG5lZWQgYSBXQVJOKCkgKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE2OV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBmcmFncywgZW50cnkgPSB0cC0+Y3VyX3R4ICUgTlVNX1RYX0RFU0M7CisJc3RydWN0IFR4RGVzYyAqdHhkID0gdHAtPlR4RGVzY0FycmF5ICsgZW50cnk7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCWRtYV9hZGRyX3QgbWFwcGluZzsKKwl1MzIgc3RhdHVzLCBsZW47CisJdTMyIG9wdHMxOworCWludCByZXQgPSAwOworCQorCWlmICh1bmxpa2VseShUWF9CVUZGU19BVkFJTCh0cCkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogQlVHISBUeCBSaW5nIGZ1bGwgd2hlbiBxdWV1ZSBhd2FrZSFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIGVycl9zdG9wOworCX0KKworCWlmICh1bmxpa2VseShsZTMyX3RvX2NwdSh0eGQtPm9wdHMxKSAmIERlc2NPd24pKQorCQlnb3RvIGVycl9zdG9wOworCisJb3B0czEgPSBEZXNjT3duIHwgcnRsODE2OV90c29fY3N1bShza2IsIGRldik7CisKKwlmcmFncyA9IHJ0bDgxNjlfeG1pdF9mcmFncyh0cCwgc2tiLCBvcHRzMSk7CisJaWYgKGZyYWdzKSB7CisJCWxlbiA9IHNrYl9oZWFkbGVuKHNrYik7CisJCW9wdHMxIHw9IEZpcnN0RnJhZzsKKwl9IGVsc2UgeworCQlsZW4gPSBza2ItPmxlbjsKKworCQlpZiAodW5saWtlbHkobGVuIDwgRVRIX1pMRU4pKSB7CisJCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisJCQlpZiAoIXNrYikKKwkJCQlnb3RvIGVycl91cGRhdGVfc3RhdHM7CisJCQlsZW4gPSBFVEhfWkxFTjsKKwkJfQorCisJCW9wdHMxIHw9IEZpcnN0RnJhZyB8IExhc3RGcmFnOworCQl0cC0+dHhfc2tiW2VudHJ5XS5za2IgPSBza2I7CisJfQorCisJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHRwLT5wY2lfZGV2LCBza2ItPmRhdGEsIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisKKwl0cC0+dHhfc2tiW2VudHJ5XS5sZW4gPSBsZW47CisJdHhkLT5hZGRyID0gY3B1X3RvX2xlNjQobWFwcGluZyk7CisJdHhkLT5vcHRzMiA9IGNwdV90b19sZTMyKHJ0bDgxNjlfdHhfdmxhbl90YWcodHAsIHNrYikpOworCisJd21iKCk7CisKKwkvKiBhbnRpIGdjYyAyLjk1LjMgYnVnd2FyZSAoc2ljKSAqLworCXN0YXR1cyA9IG9wdHMxIHwgbGVuIHwgKFJpbmdFbmQgKiAhKChlbnRyeSArIDEpICUgTlVNX1RYX0RFU0MpKTsKKwl0eGQtPm9wdHMxID0gY3B1X3RvX2xlMzIoc3RhdHVzKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJdHAtPmN1cl90eCArPSBmcmFncyArIDE7CisKKwlzbXBfd21iKCk7CisKKwlSVExfVzgoVHhQb2xsLCAweDQwKTsJLyogc2V0IHBvbGxpbmcgYml0ICovCisKKwlpZiAoVFhfQlVGRlNfQVZBSUwodHApIDwgTUFYX1NLQl9GUkFHUykgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXNtcF9ybWIoKTsKKwkJaWYgKFRYX0JVRkZTX0FWQUlMKHRwKSA+PSBNQVhfU0tCX0ZSQUdTKQorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKworb3V0OgorCXJldHVybiByZXQ7CisKK2Vycl9zdG9wOgorCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlyZXQgPSAxOworZXJyX3VwZGF0ZV9zdGF0czoKKwl0cC0+c3RhdHMudHhfZHJvcHBlZCsrOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZCBydGw4MTY5X3BjaWVycl9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0cC0+cGNpX2RldjsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdTE2IHBjaV9zdGF0dXMsIHBjaV9jbWQ7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jbWQpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9TVEFUVVMsICZwY2lfc3RhdHVzKTsKKworCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBQQ0kgZXJyb3IgKGNtZCA9IDB4JTA0eCwgc3RhdHVzID0gMHglMDR4KS5cbiIsCisJICAgICAgIGRldi0+bmFtZSwgcGNpX2NtZCwgcGNpX3N0YXR1cyk7CisKKwkvKgorCSAqIFRoZSByZWNvdmVyeSBzZXF1ZW5jZSBiZWxvdyBhZG1pdHMgYSB2ZXJ5IGVsYWJvcmF0ZWQgZXhwbGFuYXRpb246CisJICogLSBpdCBzZWVtcyB0byB3b3JrOworCSAqIC0gSSBkaWQgbm90IHNlZSB3aGF0IGVsc2UgY291bGQgYmUgZG9uZS4KKwkgKgorCSAqIEZlZWwgZnJlZSB0byBhZGp1c3QgdG8geW91ciBuZWVkcy4KKwkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsCisJCQkgICAgICBwY2lfY21kIHwgUENJX0NPTU1BTkRfU0VSUiB8IFBDSV9DT01NQU5EX1BBUklUWSk7CisKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX1NUQVRVUywKKwkJcGNpX3N0YXR1cyAmIChQQ0lfU1RBVFVTX0RFVEVDVEVEX1BBUklUWSB8CisJCVBDSV9TVEFUVVNfU0lHX1NZU1RFTV9FUlJPUiB8IFBDSV9TVEFUVVNfUkVDX01BU1RFUl9BQk9SVCB8CisJCVBDSV9TVEFUVVNfUkVDX1RBUkdFVF9BQk9SVCB8IFBDSV9TVEFUVVNfU0lHX1RBUkdFVF9BQk9SVCkpOworCisJLyogVGhlIGluZmFtb3VzIERBQyBmKmNrdXAgb25seSBoYXBwZW5zIGF0IGJvb3QgdGltZSAqLworCWlmICgodHAtPmNwX2NtZCAmIFBDSURBQykgJiYgIXRwLT5kaXJ0eV9yeCAmJiAhdHAtPmN1cl9yeCkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6IGRpc2FibGluZyBQQ0kgREFDLlxuIiwgZGV2LT5uYW1lKTsKKwkJdHAtPmNwX2NtZCAmPSB+UENJREFDOworCQlSVExfVzE2KENQbHVzQ21kLCB0cC0+Y3BfY21kKTsKKwkJZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9ISUdIRE1BOworCQlydGw4MTY5X3NjaGVkdWxlX3dvcmsoZGV2LCBydGw4MTY5X3JlaW5pdF90YXNrKTsKKwl9CisKKwlydGw4MTY5X2h3X3Jlc2V0KGlvYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkCitydGw4MTY5X3R4X2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCwKKwkJICAgICB2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwl1bnNpZ25lZCBpbnQgZGlydHlfdHgsIHR4X2xlZnQ7CisKKwlhc3NlcnQoZGV2ICE9IE5VTEwpOworCWFzc2VydCh0cCAhPSBOVUxMKTsKKwlhc3NlcnQoaW9hZGRyICE9IE5VTEwpOworCisJZGlydHlfdHggPSB0cC0+ZGlydHlfdHg7CisJc21wX3JtYigpOworCXR4X2xlZnQgPSB0cC0+Y3VyX3R4IC0gZGlydHlfdHg7CisKKwl3aGlsZSAodHhfbGVmdCA+IDApIHsKKwkJdW5zaWduZWQgaW50IGVudHJ5ID0gZGlydHlfdHggJSBOVU1fVFhfREVTQzsKKwkJc3RydWN0IHJpbmdfaW5mbyAqdHhfc2tiID0gdHAtPnR4X3NrYiArIGVudHJ5OworCQl1MzIgbGVuID0gdHhfc2tiLT5sZW47CisJCXUzMiBzdGF0dXM7CisKKwkJcm1iKCk7CisJCXN0YXR1cyA9IGxlMzJfdG9fY3B1KHRwLT5UeERlc2NBcnJheVtlbnRyeV0ub3B0czEpOworCQlpZiAoc3RhdHVzICYgRGVzY093bikKKwkJCWJyZWFrOworCisJCXRwLT5zdGF0cy50eF9ieXRlcyArPSBsZW47CisJCXRwLT5zdGF0cy50eF9wYWNrZXRzKys7CisKKwkJcnRsODE2OV91bm1hcF90eF9za2IodHAtPnBjaV9kZXYsIHR4X3NrYiwgdHAtPlR4RGVzY0FycmF5ICsgZW50cnkpOworCisJCWlmIChzdGF0dXMgJiBMYXN0RnJhZykgeworCQkJZGV2X2tmcmVlX3NrYl9pcnEodHhfc2tiLT5za2IpOworCQkJdHhfc2tiLT5za2IgPSBOVUxMOworCQl9CisJCWRpcnR5X3R4Kys7CisJCXR4X2xlZnQtLTsKKwl9CisKKwlpZiAodHAtPmRpcnR5X3R4ICE9IGRpcnR5X3R4KSB7CisJCXRwLT5kaXJ0eV90eCA9IGRpcnR5X3R4OworCQlzbXBfd21iKCk7CisJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYKKwkJICAgIChUWF9CVUZGU19BVkFJTCh0cCkgPj0gTUFYX1NLQl9GUkFHUykpIHsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfQorCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0bDgxNjlfcnhfY3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUnhEZXNjICpkZXNjKQoreworCXUzMiBvcHRzMSA9IGxlMzJfdG9fY3B1KGRlc2MtPm9wdHMxKTsKKwl1MzIgc3RhdHVzID0gb3B0czEgJiBSeFByb3RvTWFzazsKKworCWlmICgoKHN0YXR1cyA9PSBSeFByb3RvVENQKSAmJiAhKG9wdHMxICYgVENQRmFpbCkpIHx8CisJICAgICgoc3RhdHVzID09IFJ4UHJvdG9VRFApICYmICEob3B0czEgJiBVRFBGYWlsKSkgfHwKKwkgICAgKChzdGF0dXMgPT0gUnhQcm90b0lQKSAmJiAhKG9wdHMxICYgSVBGYWlsKSkpCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJZWxzZQorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJ0bDgxNjlfdHJ5X3J4X2NvcHkoc3RydWN0IHNrX2J1ZmYgKipza19idWZmLCBpbnQgcGt0X3NpemUsCisJCQkJICAgICAgc3RydWN0IFJ4RGVzYyAqZGVzYywgaW50IHJ4X2J1Zl9zeikKK3sKKwlpbnQgcmV0ID0gLTE7CisKKwlpZiAocGt0X3NpemUgPCByeF9jb3B5YnJlYWspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9zaXplICsgTkVUX0lQX0FMSUdOKTsKKwkJaWYgKHNrYikgeworCQkJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOworCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIHNrX2J1ZmZbMF0tPnRhaWwsIHBrdF9zaXplLCAwKTsKKwkJCSpza19idWZmID0gc2tiOworCQkJcnRsODE2OV9tYXJrX3RvX2FzaWMoZGVzYywgcnhfYnVmX3N6KTsKKwkJCXJldCA9IDA7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorcnRsODE2OV9yeF9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAsCisJCSAgICAgdm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJdW5zaWduZWQgaW50IGN1cl9yeCwgcnhfbGVmdDsKKwl1bnNpZ25lZCBpbnQgZGVsdGEsIGNvdW50OworCisJYXNzZXJ0KGRldiAhPSBOVUxMKTsKKwlhc3NlcnQodHAgIT0gTlVMTCk7CisJYXNzZXJ0KGlvYWRkciAhPSBOVUxMKTsKKworCWN1cl9yeCA9IHRwLT5jdXJfcng7CisJcnhfbGVmdCA9IE5VTV9SWF9ERVNDICsgdHAtPmRpcnR5X3J4IC0gY3VyX3J4OworCXJ4X2xlZnQgPSBydGw4MTY5X3J4X3F1b3RhKHJ4X2xlZnQsICh1MzIpIGRldi0+cXVvdGEpOworCisJd2hpbGUgKHJ4X2xlZnQgPiAwKSB7CisJCXVuc2lnbmVkIGludCBlbnRyeSA9IGN1cl9yeCAlIE5VTV9SWF9ERVNDOworCQl1MzIgc3RhdHVzOworCisJCXJtYigpOworCQlzdGF0dXMgPSBsZTMyX3RvX2NwdSh0cC0+UnhEZXNjQXJyYXlbZW50cnldLm9wdHMxKTsKKworCQlpZiAoc3RhdHVzICYgRGVzY093bikKKwkJCWJyZWFrOworCQlpZiAoc3RhdHVzICYgUnhSRVMpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSeCBFUlJPUiEhIVxuIiwgZGV2LT5uYW1lKTsKKwkJCXRwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiAoUnhSV1QgfCBSeFJVTlQpKQorCQkJCXRwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgUnhDUkMpCisJCQkJdHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBSeERlc2MgKmRlc2MgPSB0cC0+UnhEZXNjQXJyYXkgKyBlbnRyeTsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSB0cC0+Unhfc2tidWZmW2VudHJ5XTsKKwkJCWludCBwa3Rfc2l6ZSA9IChzdGF0dXMgJiAweDAwMDAxRkZGKSAtIDQ7CisJCQl2b2lkICgqcGNpX2FjdGlvbikoc3RydWN0IHBjaV9kZXYgKiwgZG1hX2FkZHJfdCwKKwkJCQlzaXplX3QsIGludCkgPSBwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2U7CisKKwkJCXJ0bDgxNjlfcnhfY3N1bShza2IsIGRlc2MpOworCQkJCisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUodHAtPnBjaV9kZXYsCisJCQkJbGU2NF90b19jcHUoZGVzYy0+YWRkciksIHRwLT5yeF9idWZfc3osCisJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJaWYgKHJ0bDgxNjlfdHJ5X3J4X2NvcHkoJnNrYiwgcGt0X3NpemUsIGRlc2MsCisJCQkJCQl0cC0+cnhfYnVmX3N6KSkgeworCQkJCXBjaV9hY3Rpb24gPSBwY2lfdW5tYXBfc2luZ2xlOworCQkJCXRwLT5SeF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJCX0KKworCQkJcGNpX2FjdGlvbih0cC0+cGNpX2RldiwgbGU2NF90b19jcHUoZGVzYy0+YWRkciksCisJCQkJICAgdHAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJc2tiLT5kZXYgPSBkZXY7CisJCQlza2JfcHV0KHNrYiwgcGt0X3NpemUpOworCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworCQkJaWYgKHJ0bDgxNjlfcnhfdmxhbl9za2IodHAsIGRlc2MsIHNrYikgPCAwKQorCQkJCXJ0bDgxNjlfcnhfc2tiKHNrYik7CisKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQl0cC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X3NpemU7CisJCQl0cC0+c3RhdHMucnhfcGFja2V0cysrOworCQl9CisJCQorCQljdXJfcngrKzsgCisJCXJ4X2xlZnQtLTsKKwl9CisKKwljb3VudCA9IGN1cl9yeCAtIHRwLT5jdXJfcng7CisJdHAtPmN1cl9yeCA9IGN1cl9yeDsKKworCWRlbHRhID0gcnRsODE2OV9yeF9maWxsKHRwLCBkZXYsIHRwLT5kaXJ0eV9yeCwgdHAtPmN1cl9yeCk7CisJaWYgKCFkZWx0YSAmJiBjb3VudCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIFJ4IGJ1ZmZlciBhbGxvY2F0ZWRcbiIsIGRldi0+bmFtZSk7CisJdHAtPmRpcnR5X3J4ICs9IGRlbHRhOworCisJLyoKKwkgKiBGSVhNRTogdW50aWwgdGhlcmUgaXMgcGVyaW9kaWMgdGltZXIgdG8gdHJ5IGFuZCByZWZpbGwgdGhlIHJpbmcsCisJICogYSB0ZW1wb3Jhcnkgc2hvcnRhZ2UgbWF5IGRlZmluaXRlbHkga2lsbCB0aGUgUnggcHJvY2Vzcy4KKwkgKiAtIGRpc2FibGUgdGhlIGFzaWMgdG8gdHJ5IGFuZCBhdm9pZCBhbiBvdmVyZmxvdyBhbmQga2ljayBpdCBhZ2FpbgorCSAqICAgYWZ0ZXIgcmVmaWxsID8KKwkgKiAtIGhvdyBkbyBvdGhlcnMgZHJpdmVyIGhhbmRsZSB0aGlzIGNvbmRpdGlvbiAoVWggb2guLi4pLgorCSAqLworCWlmICh0cC0+ZGlydHlfcnggKyBOVU1fUlhfREVTQyA9PSB0cC0+Y3VyX3J4KQorCQlwcmludGsoS0VSTl9FTUVSRyAiJXM6IFJ4IGJ1ZmZlcnMgZXhoYXVzdGVkXG4iLCBkZXYtPm5hbWUpOworCisJcmV0dXJuIGNvdW50OworfQorCisvKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgZG9lcyBhbGwgb2YgdGhlIFJ4IHRocmVhZCB3b3JrIGFuZCBjbGVhbnMgdXAgYWZ0ZXIgdGhlIFR4IHRocmVhZC4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorcnRsODE2OV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGJvZ3VzY250ID0gbWF4X2ludGVycnVwdF93b3JrOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPm1taW9fYWRkcjsKKwlpbnQgc3RhdHVzOworCWludCBoYW5kbGVkID0gMDsKKworCWRvIHsKKwkJc3RhdHVzID0gUlRMX1IxNihJbnRyU3RhdHVzKTsKKworCQkvKiBob3RwbHVnL21ham9yIGVycm9yL25vIG1vcmUgd29yay9zaGFyZWQgaXJxICovCisJCWlmICgoc3RhdHVzID09IDB4RkZGRikgfHwgIXN0YXR1cykKKwkJCWJyZWFrOworCisJCWhhbmRsZWQgPSAxOworCisJCWlmICh1bmxpa2VseSghbmV0aWZfcnVubmluZyhkZXYpKSkgeworCQkJcnRsODE2OV9hc2ljX2Rvd24oaW9hZGRyKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJc3RhdHVzICY9IHRwLT5pbnRyX21hc2s7CisJCVJUTF9XMTYoSW50clN0YXR1cywKKwkJCShzdGF0dXMgJiBSeEZJRk9PdmVyKSA/IChzdGF0dXMgfCBSeE92ZXJmbG93KSA6IHN0YXR1cyk7CisKKwkJaWYgKCEoc3RhdHVzICYgcnRsODE2OV9pbnRyX21hc2spKQorCQkJYnJlYWs7CisKKwkJaWYgKHVubGlrZWx5KHN0YXR1cyAmIFNZU0VycikpIHsKKwkJCXJ0bDgxNjlfcGNpZXJyX2ludGVycnVwdChkZXYpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc3RhdHVzICYgTGlua0NoZykKKwkJCXJ0bDgxNjlfY2hlY2tfbGlua19zdGF0dXMoZGV2LCB0cCwgaW9hZGRyKTsKKworI2lmZGVmIENPTkZJR19SODE2OV9OQVBJCisJCVJUTF9XMTYoSW50ck1hc2ssIHJ0bDgxNjlfaW50cl9tYXNrICYgfnJ0bDgxNjlfbmFwaV9ldmVudCk7CisJCXRwLT5pbnRyX21hc2sgPSB+cnRsODE2OV9uYXBpX2V2ZW50OworCisJCWlmIChsaWtlbHkobmV0aWZfcnhfc2NoZWR1bGVfcHJlcChkZXYpKSkKKwkJCV9fbmV0aWZfcnhfc2NoZWR1bGUoZGV2KTsKKwkJZWxzZSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogaW50ZXJydXB0ICUwNHggdGFrZW4gaW4gcG9sbFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cyk7CQorCQl9CisJCWJyZWFrOworI2Vsc2UKKwkJLyogUnggaW50ZXJydXB0ICovCisJCWlmIChzdGF0dXMgJiAoUnhPSyB8IFJ4T3ZlcmZsb3cgfCBSeEZJRk9PdmVyKSkgeworCQkJcnRsODE2OV9yeF9pbnRlcnJ1cHQoZGV2LCB0cCwgaW9hZGRyKTsKKwkJfQorCQkvKiBUeCBpbnRlcnJ1cHQgKi8KKwkJaWYgKHN0YXR1cyAmIChUeE9LIHwgVHhFcnIpKQorCQkJcnRsODE2OV90eF9pbnRlcnJ1cHQoZGV2LCB0cCwgaW9hZGRyKTsKKyNlbmRpZgorCisJCWJvZ3VzY250LS07CisJfSB3aGlsZSAoYm9ndXNjbnQgPiAwKTsKKworCWlmIChib2d1c2NudCA8PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUb28gbXVjaCB3b3JrIGF0IGludGVycnVwdCFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQkvKiBDbGVhciBhbGwgaW50ZXJydXB0IHNvdXJjZXMuICovCisJCVJUTF9XMTYoSW50clN0YXR1cywgMHhmZmZmKTsKKwl9CitvdXQ6CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUjgxNjlfTkFQSQorc3RhdGljIGludCBydGw4MTY5X3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpCit7CisJdW5zaWduZWQgaW50IHdvcmtfZG9uZSwgd29ya190b19kbyA9IG1pbigqYnVkZ2V0LCBkZXYtPnF1b3RhKTsKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCisJd29ya19kb25lID0gcnRsODE2OV9yeF9pbnRlcnJ1cHQoZGV2LCB0cCwgaW9hZGRyKTsKKwlydGw4MTY5X3R4X2ludGVycnVwdChkZXYsIHRwLCBpb2FkZHIpOworCisJKmJ1ZGdldCAtPSB3b3JrX2RvbmU7CisJZGV2LT5xdW90YSAtPSB3b3JrX2RvbmU7CisKKwlpZiAod29ya19kb25lIDwgd29ya190b19kbykgeworCQluZXRpZl9yeF9jb21wbGV0ZShkZXYpOworCQl0cC0+aW50cl9tYXNrID0gMHhmZmZmOworCQkvKgorCQkgKiAyMDA0MDQyNjogdGhlIGJhcnJpZXIgaXMgbm90IHN0cmljdGx5IHJlcXVpcmVkIGJ1dCB0aGUKKwkJICogYmVoYXZpb3Igb2YgdGhlIGlycSBoYW5kbGVyIGNvdWxkIGJlIGxlc3MgcHJlZGljdGFibGUKKwkJICogd2l0aG91dCBpdC4gQnR3LCB0aGUgbGFjayBvZiBmbHVzaCBmb3IgdGhlIHBvc3RlZCBwY2kKKwkJICogd3JpdGUgaXMgc2FmZSAtIEZSCisJCSAqLworCQlzbXBfd21iKCk7CisJCVJUTF9XMTYoSW50ck1hc2ssIHJ0bDgxNjlfaW50cl9tYXNrKTsKKwl9CisKKwlyZXR1cm4gKHdvcmtfZG9uZSA+PSB3b3JrX3RvX2RvKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBydGw4MTY5X2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXVuc2lnbmVkIGludCBwb2xsX2xvY2tlZCA9IDA7CisKKwlydGw4MTY5X2RlbGV0ZV90aW1lcihkZXYpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworY29yZV9kb3duOgorCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKworCXJ0bDgxNjlfYXNpY19kb3duKGlvYWRkcik7CisKKwkvKiBVcGRhdGUgdGhlIGVycm9yIGNvdW50cy4gKi8KKwl0cC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBSVExfUjMyKFJ4TWlzc2VkKTsKKwlSVExfVzMyKFJ4TWlzc2VkLCAwKTsKKworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCisJc3luY2hyb25pemVfaXJxKGRldi0+aXJxKTsKKworCWlmICghcG9sbF9sb2NrZWQpIHsKKwkJbmV0aWZfcG9sbF9kaXNhYmxlKGRldik7CisJCXBvbGxfbG9ja2VkKys7CisJfQorCisJLyogR2l2ZSBhIHJhY2luZyBoYXJkX3N0YXJ0X3htaXQgYSBmZXcgY3ljbGVzIHRvIGNvbXBsZXRlLiAqLworCXN5bmNocm9uaXplX2tlcm5lbCgpOworCisJLyoKKwkgKiBBbmQgbm93IGZvciB0aGUgNTBrJCBxdWVzdGlvbjogYXJlIElSUSBkaXNhYmxlZCBvciBub3QgPworCSAqCisJICogVHdvIHBhdGhzIGxlYWQgaGVyZToKKwkgKiAxKSBkZXYtPmNsb3NlCisJICogICAgLT4gbmV0aWZfcnVubmluZygpIGlzIGF2YWlsYWJsZSB0byBzeW5jIHRoZSBjdXJyZW50IGNvZGUgYW5kIHRoZQorCSAqICAgICAgIElSUSBoYW5kbGVyLiBTZWUgcnRsODE2OV9pbnRlcnJ1cHQgZm9yIGRldGFpbHMuCisJICogMikgZGV2LT5jaGFuZ2VfbXR1CisJICogICAgLT4gcnRsODE2OV9wb2xsIGNhbiBub3QgYmUgaXNzdWVkIGFnYWluIGFuZCByZS1lbmFibGUgdGhlCisJICogICAgICAgaW50ZXJydXB0aW9ucy4gTGV0J3Mgc2ltcGx5IGlzc3VlIHRoZSBJUlEgZG93biBzZXF1ZW5jZSBhZ2Fpbi4KKwkgKi8KKwlpZiAoUlRMX1IxNihJbnRyTWFzaykpCisJCWdvdG8gY29yZV9kb3duOworCisJcnRsODE2OV90eF9jbGVhcih0cCk7CisKKwlydGw4MTY5X3J4X2NsZWFyKHRwKTsKK30KKworc3RhdGljIGludCBydGw4MTY5X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdHAtPnBjaV9kZXY7CisKKwlydGw4MTY5X2Rvd24oZGV2KTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJbmV0aWZfcG9sbF9lbmFibGUoZGV2KTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgUjgxNjlfUlhfUklOR19CWVRFUywgdHAtPlJ4RGVzY0FycmF5LAorCQkJICAgIHRwLT5SeFBoeUFkZHIpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgUjgxNjlfVFhfUklOR19CWVRFUywgdHAtPlR4RGVzY0FycmF5LAorCQkJICAgIHRwLT5UeFBoeUFkZHIpOworCXRwLT5UeERlc2NBcnJheSA9IE5VTEw7CisJdHAtPlJ4RGVzY0FycmF5ID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorcnRsODE2OV9zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgbWNfZmlsdGVyWzJdOwkvKiBNdWx0aWNhc3QgaGFzaCBmaWx0ZXIgKi8KKwlpbnQgaSwgcnhfbW9kZTsKKwl1MzIgdG1wID0gMDsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJLyogVW5jb25kaXRpb25hbGx5IGxvZyBuZXQgdGFwcy4gKi8KKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogUHJvbWlzY3VvdXMgbW9kZSBlbmFibGVkLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJ4X21vZGUgPQorCQkgICAgQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXVsdGljYXN0IHwgQWNjZXB0TXlQaHlzIHwKKwkJICAgIEFjY2VwdEFsbFBoeXM7CisJCW1jX2ZpbHRlclsxXSA9IG1jX2ZpbHRlclswXSA9IDB4ZmZmZmZmZmY7CisJfSBlbHNlIGlmICgoZGV2LT5tY19jb3VudCA+IG11bHRpY2FzdF9maWx0ZXJfbGltaXQpCisJCSAgIHx8IChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQkvKiBUb28gbWFueSB0byBmaWx0ZXIgcGVyZmVjdGx5IC0tIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KKwkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdE15UGh5czsKKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMHhmZmZmZmZmZjsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE15UGh5czsKKwkJbWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzBdID0gMDsKKwkJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7CisJCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCWludCBiaXRfbnIgPSBldGhlcl9jcmMoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpID4+IDI2OworCQkJbWNfZmlsdGVyW2JpdF9uciA+PiA1XSB8PSAxIDw8IChiaXRfbnIgJiAzMSk7CisJCQlyeF9tb2RlIHw9IEFjY2VwdE11bHRpY2FzdDsKKwkJfQorCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJdG1wID0gcnRsODE2OV9yeF9jb25maWcgfCByeF9tb2RlIHwKKwkgICAgICAoUlRMX1IzMihSeENvbmZpZykgJiBydGxfY2hpcF9pbmZvW3RwLT5jaGlwc2V0XS5SeENvbmZpZ01hc2spOworCisJUlRMX1czMihSeENvbmZpZywgdG1wKTsKKwlSVExfVzMyKE1BUjAgKyAwLCBtY19maWx0ZXJbMF0pOworCVJUTF9XMzIoTUFSMCArIDQsIG1jX2ZpbHRlclsxXSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqICBydGw4MTY5X2dldF9zdGF0cyAtIEdldCBydGw4MTY5IHJlYWQvd3JpdGUgc3RhdGlzdGljcworICogIEBkZXY6IFRoZSBFdGhlcm5ldCBEZXZpY2UgdG8gZ2V0IHN0YXRpc3RpY3MgZm9yCisgKgorICogIEdldCBUWC9SWCBzdGF0aXN0aWNzIGZvciBydGw4MTY5CisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcnRsODE2OV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworCQl0cC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBSVExfUjMyKFJ4TWlzc2VkKTsKKwkJUlRMX1czMihSeE1pc3NlZCwgMCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisJfQorCQkKKwlyZXR1cm4gJnRwLT5zdGF0czsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHJ0bDgxNjlfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSBNT0RVTEVOQU1FLAorCS5pZF90YWJsZQk9IHJ0bDgxNjlfcGNpX3RibCwKKwkucHJvYmUJCT0gcnRsODE2OV9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHJ0bDgxNjlfcmVtb3ZlX29uZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBydGw4MTY5X3N1c3BlbmQsCisJLnJlc3VtZQkJPSBydGw4MTY5X3Jlc3VtZSwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBfX2luaXQKK3J0bDgxNjlfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZydGw4MTY5X3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK3J0bDgxNjlfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnJ0bDgxNjlfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHJ0bDgxNjlfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQocnRsODE2OV9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ycnVubmVyLmMgYi9kcml2ZXJzL25ldC9ycnVubmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJhODZmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3JydW5uZXIuYwpAQCAtMCwwICsxLDE3NTYgQEAKKy8qCisgKiBycnVubmVyLmM6IExpbnV4IGRyaXZlciBmb3IgdGhlIEVzc2VudGlhbCBSb2FkUnVubmVyIEhJUFBJIGJvYXJkLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAyIGJ5IEplcyBTb3JlbnNlbiwgPGplc0B3aWxkb3BlbnNvdXJjZS5jb20+LgorICoKKyAqIFRoYW5rcyB0byBFc3NlbnRpYWwgQ29tbXVuaWNhdGlvbiBmb3IgcHJvdmlkaW5nIHVzIHdpdGggaGFyZHdhcmUKKyAqIGFuZCB2ZXJ5IGNvbXByZWhlbnNpdmUgZG9jdW1lbnRhdGlvbiB3aXRob3V0IHdoaWNoIEkgd291bGQgbm90IGhhdmUKKyAqIGJlZW4gYWJsZSB0byB3cml0ZSB0aGlzIGRyaXZlci4gQSBzcGVjaWFsIHRoYW5rIHlvdSB0byBKb2huIEdpYmJvbgorICogZm9yIHNvcnRpbmcgb3V0IHRoZSBsZWdhbCBpc3N1ZXMsIHdpdGggdGhlIE5EQSwgYWxsb3dpbmcgdGhlIGNvZGUgdG8KKyAqIGJlIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGFua3MgdG8gSmF5YXJhbSBCaGF0IGZyb20gT0RTL0Vzc2VudGlhbCBmb3IgZml4aW5nIHNvbWUgb2YgdGhlCisgKiBzdHVwaWQgYnVncyBpbiBteSBjb2RlLgorICoKKyAqIFNvZnRuZXQgc3VwcG9ydCBhbmQgdmFyaW91cyBvdGhlciBwYXRjaGVzIGZyb20gVmFsIEhlbnNvbiBvZgorICogT0RTL0Vzc2VudGlhbC4KKyAqCisgKiBQQ0kgRE1BIG1hcHBpbmcgY29kZSBwYXJ0bHkgYmFzZWQgb24gd29yayBieSBGcmFuY29pcyBSb21pZXUuCisgKi8KKworCisjZGVmaW5lIERFQlVHIDEKKyNkZWZpbmUgUlhfRE1BX1NLQlVGRiAxCisjZGVmaW5lIFBLVF9DT1BZX1RIUkVTSE9MRCA1MTIKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9oaXBwaWRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgcnJfaWZfYnVzeShkZXYpICAgICBuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikKKyNkZWZpbmUgcnJfaWZfcnVubmluZyhkZXYpICBuZXRpZl9ydW5uaW5nKGRldikKKworI2luY2x1ZGUgInJydW5uZXIuaCIKKworI2RlZmluZSBSVU5fQVQoeCkgKGppZmZpZXMgKyAoeCkpCisKKworTU9EVUxFX0FVVEhPUigiSmVzIFNvcmVuc2VuIDxqZXNAd2lsZG9wZW5zb3VyY2UuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFc3NlbnRpYWwgUm9hZFJ1bm5lciBISVBQSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPSAicnJ1bm5lci5jOiB2MC41MCAxMS8xMS8yMDAyICBKZXMgU29yZW5zZW4gKGplc0B3aWxkb3BlbnNvdXJjZS5jb20pXG4iOworCisvKgorICogSW1wbGVtZW50YXRpb24gbm90ZXM6CisgKgorICogVGhlIERNQSBlbmdpbmUgb25seSBhbGxvd3MgZm9yIERNQSB3aXRoaW4gcGh5c2ljYWwgNjRLQiBjaHVua3Mgb2YKKyAqIG1lbW9yeS4gVGhlIGN1cnJlbnQgYXBwcm9hY2ggb2YgdGhlIGRyaXZlciAoYW5kIHN0YWNrKSBpcyB0byB1c2UKKyAqIGxpbmVhciBibG9ja3Mgb2YgbWVtb3J5IGZvciB0aGUgc2tidWZmcy4gSG93ZXZlciwgYXMgdGhlIGRhdGEgYmxvY2sKKyAqIGlzIGFsd2F5cyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgc2tiIGFuZCBza2JzIGFyZSAyXm4gYWxpZ25lZCBzbyB3ZQorICogYXJlIGd1YXJhbnR0ZWQgdG8gZ2V0IHRoZSB3aG9sZSBibG9jayB3aXRoaW4gb25lIDY0S0IgYWxpZ24gNjRLQgorICogY2h1bmsuCisgKgorICogT24gdGhlIGxvbmcgdGVybSwgcmVseWluZyBvbiBiZWluZyBhYmxlIHRvIGFsbG9jYXRlIDY0S0IgbGluZWFyCisgKiBjaHVua3Mgb2YgbWVtb3J5IGlzIG5vdCBmZWFzaWJsZSBhbmQgdGhlIHNrYiBoYW5kbGluZyBjb2RlIGFuZCB0aGUKKyAqIHN0YWNrIHdpbGwgbmVlZCB0byBrbm93IGFib3V0IEkvTyB2ZWN0b3JzIG9yIHNvbWV0aGluZyBzaW1pbGFyLgorICovCisKKy8qCisgKiBUaGVzZSBhcmUgY2hlY2tlZCBhdCBpbml0IHRpbWUgdG8gc2VlIGlmIHRoZXkgYXJlIGF0IGxlYXN0IDI1NktCCisgKiBhbmQgaW5jcmVhc2VkIHRvIDI1NktCIGlmIHRoZXkgYXJlIG5vdC4gVGhpcyBpcyBkb25lIHRvIGF2b2lkIGVuZGluZworICogdXAgd2l0aCBzb2NrZXQgYnVmZmVycyBzbWFsbGVyIHRoYW4gdGhlIE1UVSBzaXplLAorICovCitleHRlcm4gX191MzIgc3lzY3RsX3dtZW1fbWF4OworZXh0ZXJuIF9fdTMyIHN5c2N0bF9ybWVtX21heDsKKworc3RhdGljIGludCBfX2RldmluaXQgcnJfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0YXRpYyBpbnQgdmVyc2lvbl9kaXNwOworCXU4IHBjaV9sYXRlbmN5OworCXN0cnVjdCBycl9wcml2YXRlICpycnByaXY7CisJdm9pZCAqdG1wcHRyOworCWRtYV9hZGRyX3QgcmluZ19kbWE7CisJaW50IHJldCA9IC1FTk9NRU07CisKKwlkZXYgPSBhbGxvY19oaXBwaV9kZXYoc2l6ZW9mKHN0cnVjdCBycl9wcml2YXRlKSk7CisJaWYgKCFkZXYpCisJCWdvdG8gb3V0MzsKKworCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXQpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQyOworCX0KKworCXJycHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsICJycnVubmVyIikpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlycnByaXYtPnBjaV9kZXYgPSBwZGV2OworCisJc3Bpbl9sb2NrX2luaXQoJnJycHJpdi0+bG9jayk7CisKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKwlkZXYtPm9wZW4gPSAmcnJfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZycl9zdGFydF94bWl0OworCWRldi0+c3RvcCA9ICZycl9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9ICZycl9nZXRfc3RhdHM7CisJZGV2LT5kb19pb2N0bCA9ICZycl9pb2N0bDsKKworCWRldi0+YmFzZV9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCisJLyogZGlzcGxheSB2ZXJzaW9uIGluZm8gaWYgYWRhcHRlciBpcyBmb3VuZCAqLworCWlmICghdmVyc2lvbl9kaXNwKSB7CisJCS8qIHNldCBkaXNwbGF5IGZsYWcgdG8gVFJVRSBzbyB0aGF0ICovCisJCS8qIHdlIG9ubHkgZGlzcGxheSB0aGlzIHN0cmluZyBPTkNFICovCisJCXZlcnNpb25fZGlzcCA9IDE7CisJCXByaW50ayh2ZXJzaW9uKTsKKwl9CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgJnBjaV9sYXRlbmN5KTsKKwlpZiAocGNpX2xhdGVuY3kgPD0gMHg1OCl7CisJCXBjaV9sYXRlbmN5ID0gMHg1ODsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCBwY2lfbGF0ZW5jeSk7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogRXNzZW50aWFsIFJvYWRSdW5uZXIgc2VyaWFsIEhJUFBJICIKKwkgICAgICAgImF0IDB4JTA4bHgsIGlycSAlaSwgUENJIGxhdGVuY3kgJWlcbiIsIGRldi0+bmFtZSwKKwkgICAgICAgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxLCBwY2lfbGF0ZW5jeSk7CisKKwkvKgorCSAqIFJlbWFwIHRoZSByZWdzIGludG8ga2VybmVsIHNwYWNlLgorCSAqLworCisJcnJwcml2LT5yZWdzID0gaW9yZW1hcChkZXYtPmJhc2VfYWRkciwgMHgxMDAwKTsKKworCWlmICghcnJwcml2LT5yZWdzKXsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogIFVuYWJsZSB0byBtYXAgSS9PIHJlZ2lzdGVyLCAiCisJCQkiUm9hZFJ1bm5lciB3aWxsIGJlIGRpc2FibGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJdG1wcHRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKKwlycnByaXYtPnR4X3JpbmcgPSB0bXBwdHI7CisJcnJwcml2LT50eF9yaW5nX2RtYSA9IHJpbmdfZG1hOworCisJaWYgKCF0bXBwdHIpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJdG1wcHRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKKwlycnByaXYtPnJ4X3JpbmcgPSB0bXBwdHI7CisJcnJwcml2LT5yeF9yaW5nX2RtYSA9IHJpbmdfZG1hOworCisJaWYgKCF0bXBwdHIpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJdG1wcHRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgRVZUX1JJTkdfU0laRSwgJnJpbmdfZG1hKTsKKwlycnByaXYtPmV2dF9yaW5nID0gdG1wcHRyOworCXJycHJpdi0+ZXZ0X3JpbmdfZG1hID0gcmluZ19kbWE7CisKKwlpZiAoIXRtcHB0cikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIERvbid0IGFjY2VzcyBhbnkgcmVnaXN0ZXIgYmVmb3JlIHRoaXMgcG9pbnQhCisJICovCisjaWZkZWYgX19CSUdfRU5ESUFOCisJd3JpdGVsKHJlYWRsKCZycnByaXYtPnJlZ3MtPkhvc3RDdHJsKSB8IE5PX1NXQVAsCisJCSZycnByaXYtPnJlZ3MtPkhvc3RDdHJsKTsKKyNlbmRpZgorCS8qCisJICogTmVlZCB0byBhZGQgYSBjYXNlIGZvciBsaXR0bGUtZW5kaWFuIDY0LWJpdCBob3N0cyBoZXJlLgorCSAqLworCisJcnJfaW5pdChkZXYpOworCisJZGV2LT5iYXNlX2FkZHIgPSAwOworCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisJcmV0dXJuIDA7CisKKyBvdXQ6CisJaWYgKHJycHJpdi0+cnhfcmluZykKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCBycnByaXYtPnJ4X3JpbmcsIAorCQkJCSAgICBycnByaXYtPnJ4X3JpbmdfZG1hKTsKKwlpZiAocnJwcml2LT50eF9yaW5nKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFRYX1RPVEFMX1NJWkUsIHJycHJpdi0+dHhfcmluZywKKwkJCQkgICAgcnJwcml2LT50eF9yaW5nX2RtYSk7CisJaWYgKHJycHJpdi0+cmVncykKKwkJaW91bm1hcChycnByaXYtPnJlZ3MpOwkKKwlpZiAocGRldikgeworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJfQorIG91dDI6CisJZnJlZV9uZXRkZXYoZGV2KTsKKyBvdXQzOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBycl9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGRldikgeworCQlzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnIgPSBuZXRkZXZfcHJpdihkZXYpOworCisJCWlmICghKHJlYWRsKCZyci0+cmVncy0+SG9zdEN0cmwpICYgTklDX0hBTFRFRCkpeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdHJ5aW5nIHRvIHVubG9hZCBydW5uaW5nIE5JQ1xuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJd3JpdGVsKEhBTFRfTklDLCAmcnItPnJlZ3MtPkhvc3RDdHJsKTsKKwkJfQorCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgRVZUX1JJTkdfU0laRSwgcnItPmV2dF9yaW5nLAorCQkJCSAgICByci0+ZXZ0X3JpbmdfZG1hKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCByci0+cnhfcmluZywKKwkJCQkgICAgcnItPnJ4X3JpbmdfZG1hKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBUWF9UT1RBTF9TSVpFLCByci0+dHhfcmluZywKKwkJCQkgICAgcnItPnR4X3JpbmdfZG1hKTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJaW91bm1hcChyci0+cmVncyk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCX0KK30KKworCisvKgorICogQ29tbWFuZHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgc2xvdywgdGh1cyB0aGVyZSBpcyBubyByZWFzb24gdG8KKyAqIGlubGluZSB0aGlzLgorICovCitzdGF0aWMgdm9pZCBycl9pc3N1ZV9jbWQoc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdiwgc3RydWN0IGNtZCAqY21kKQoreworCXN0cnVjdCBycl9yZWdzIF9faW9tZW0gKnJlZ3M7CisJdTMyIGlkeDsKKworCXJlZ3MgPSBycnByaXYtPnJlZ3M7CisJLyoKKwkgKiBUaGlzIGlzIHRlbXBvcmFyeSAtIGl0IHdpbGwgZ28gYXdheSBpbiB0aGUgZmluYWwgdmVyc2lvbi4KKwkgKiBXZSBwcm9iYWJseSBhbHNvIHdhbnQgdG8gbWFrZSB0aGlzIGZ1bmN0aW9uIGlubGluZS4KKwkgKi8KKwlpZiAocmVhZGwoJnJlZ3MtPkhvc3RDdHJsKSAmIE5JQ19IQUxURUQpeworCQlwcmludGsoImlzc3VpbmcgY29tbWFuZCBmb3IgaGFsdGVkIE5JQywgY29kZSAweCV4LCAiCisJCSAgICAgICAiSG9zdEN0cmwgJTA4eFxuIiwgY21kLT5jb2RlLCByZWFkbCgmcmVncy0+SG9zdEN0cmwpKTsKKwkJaWYgKHJlYWRsKCZyZWdzLT5Nb2RlKSAmIEZBVEFMX0VSUikKKwkJCXByaW50aygiZXJyb3IgY29kZXMgRmFpbDEgJTAyeCwgRmFpbDIgJTAyeFxuIiwKKwkJCSAgICAgICByZWFkbCgmcmVncy0+RmFpbDEpLCByZWFkbCgmcmVncy0+RmFpbDIpKTsKKwl9CisKKwlpZHggPSBycnByaXYtPmluZm8tPmNtZF9jdHJsLnBpOworCisJd3JpdGVsKCoodTMyKikoY21kKSwgJnJlZ3MtPkNtZFJpbmdbaWR4XSk7CisJd21iKCk7CisKKwlpZHggPSAoaWR4IC0gMSkgJSBDTURfUklOR19FTlRSSUVTOworCXJycHJpdi0+aW5mby0+Y21kX2N0cmwucGkgPSBpZHg7CisJd21iKCk7CisKKwlpZiAocmVhZGwoJnJlZ3MtPk1vZGUpICYgRkFUQUxfRVJSKQorCQlwcmludGsoImVycm9yIGNvZGUgJTAyeFxuIiwgcmVhZGwoJnJlZ3MtPkZhaWwxKSk7Cit9CisKKworLyoKKyAqIFJlc2V0IHRoZSBib2FyZCBpbiBhIHNlbnNpYmxlIG1hbm5lci4gVGhlIE5JQyBpcyBhbHJlYWR5IGhhbHRlZAorICogd2hlbiB3ZSBnZXQgaGVyZSBhbmQgYSBzcGluLWxvY2sgaXMgaGVsZC4KKyAqLworc3RhdGljIGludCBycl9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBycl9wcml2YXRlICpycnByaXY7CisJc3RydWN0IHJyX3JlZ3MgX19pb21lbSAqcmVnczsKKwlzdHJ1Y3QgZWVwcm9tICpodyA9IE5VTEw7CisJdTMyIHN0YXJ0X3BjOworCWludCBpOworCisJcnJwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZWdzID0gcnJwcml2LT5yZWdzOworCisJcnJfbG9hZF9maXJtd2FyZShkZXYpOworCisJd3JpdGVsKDB4MDEwMDAwMDAsICZyZWdzLT5UWF9zdGF0ZSk7CisJd3JpdGVsKDB4ZmY4MDAwMDAsICZyZWdzLT5SWF9zdGF0ZSk7CisJd3JpdGVsKDAsICZyZWdzLT5Bc3Npc3RTdGF0ZSk7CisJd3JpdGVsKENMRUFSX0lOVEEsICZyZWdzLT5Mb2NhbEN0cmwpOworCXdyaXRlbCgweDAxLCAmcmVncy0+QnJrUHQpOworCXdyaXRlbCgwLCAmcmVncy0+VGltZXIpOworCXdyaXRlbCgwLCAmcmVncy0+VGltZXJSZWYpOworCXdyaXRlbChSRVNFVF9ETUEsICZyZWdzLT5EbWFSZWFkU3RhdGUpOworCXdyaXRlbChSRVNFVF9ETUEsICZyZWdzLT5EbWFXcml0ZVN0YXRlKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkRtYVdyaXRlSG9zdEhpKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkRtYVdyaXRlSG9zdExvKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkRtYVJlYWRIb3N0SGkpOworCXdyaXRlbCgwLCAmcmVncy0+RG1hUmVhZEhvc3RMbyk7CisJd3JpdGVsKDAsICZyZWdzLT5EbWFSZWFkTGVuKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkRtYVdyaXRlTGVuKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkRtYVdyaXRlTGNsKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkRtYVdyaXRlSVBjaGVja3N1bSk7CisJd3JpdGVsKDAsICZyZWdzLT5EbWFSZWFkTGNsKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkRtYVJlYWRJUGNoZWNrc3VtKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPlBjaVN0YXRlKTsKKyNpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkgJiYgZGVmaW5lZCBfX0xJVFRMRV9FTkRJQU4KKwl3cml0ZWwoU1dBUF9EQVRBIHwgUFRSNjRCSVQgfCBQVFJfV0RfU1dBUCwgJnJlZ3MtPk1vZGUpOworI2VsaWYgKEJJVFNfUEVSX0xPTkcgPT0gNjQpCisJd3JpdGVsKFNXQVBfREFUQSB8IFBUUjY0QklUIHwgUFRSX1dEX05PU1dBUCwgJnJlZ3MtPk1vZGUpOworI2Vsc2UKKwl3cml0ZWwoU1dBUF9EQVRBIHwgUFRSMzJCSVQgfCBQVFJfV0RfTk9TV0FQLCAmcmVncy0+TW9kZSk7CisjZW5kaWYKKworI2lmIDAKKwkvKgorCSAqIERvbid0IHdvcnJ5LCB0aGlzIGlzIGp1c3QgYmxhY2sgbWFnaWMuCisJICovCisJd3JpdGVsKDB4ZGYwMDAsICZyZWdzLT5SeEJhc2UpOworCXdyaXRlbCgweGRmMDAwLCAmcmVncy0+UnhQcmQpOworCXdyaXRlbCgweGRmMDAwLCAmcmVncy0+UnhDb24pOworCXdyaXRlbCgweGNlMDAwLCAmcmVncy0+VHhCYXNlKTsKKwl3cml0ZWwoMHhjZTAwMCwgJnJlZ3MtPlR4UHJkKTsKKwl3cml0ZWwoMHhjZTAwMCwgJnJlZ3MtPlR4Q29uKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPlJ4SW5kUHJvKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPlJ4SW5kQ29uKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPlJ4SW5kUmVmKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPlR4SW5kUHJvKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPlR4SW5kQ29uKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPlR4SW5kUmVmKTsKKwl3cml0ZWwoMHhjYzAwMCwgJnJlZ3MtPnBhZDEwWzBdKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkRyQ21uZFBybyk7CisJd3JpdGVsKDAsICZyZWdzLT5EckNtbmRDb24pOworCXdyaXRlbCgwLCAmcmVncy0+RHdDbW5kUHJvKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkR3Q21uZENvbik7CisJd3JpdGVsKDAsICZyZWdzLT5Ed0NtbmRSZWYpOworCXdyaXRlbCgwLCAmcmVncy0+RHJEYXRhUHJvKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkRyRGF0YUNvbik7CisJd3JpdGVsKDAsICZyZWdzLT5EckRhdGFSZWYpOworCXdyaXRlbCgwLCAmcmVncy0+RHdEYXRhUHJvKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkR3RGF0YUNvbik7CisJd3JpdGVsKDAsICZyZWdzLT5Ed0RhdGFSZWYpOworI2VuZGlmCisKKwl3cml0ZWwoMHhmZmZmZmZmZiwgJnJlZ3MtPk1iRXZlbnQpOworCXdyaXRlbCgwLCAmcmVncy0+RXZlbnQpOworCisJd3JpdGVsKDAsICZyZWdzLT5UeFBpKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPklwUnhQaSk7CisKKwl3cml0ZWwoMCwgJnJlZ3MtPkV2dENvbik7CisJd3JpdGVsKDAsICZyZWdzLT5FdnRQcmQpOworCisJcnJwcml2LT5pbmZvLT5ldnRfY3RybC5waSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ01EX1JJTkdfRU5UUklFUzsgaSsrKQorCQl3cml0ZWwoMCwgJnJlZ3MtPkNtZFJpbmdbaV0pOworCisvKgorICogV2h5IDMyID8gaXMgdGhpcyBub3QgY2FjaGUgbGluZSBzaXplIGRlcGVuZGVudD8KKyAqLworCXdyaXRlbChSQlVSU1RfNjR8V0JVUlNUXzY0LCAmcmVncy0+UGNpU3RhdGUpOworCXdtYigpOworCisJc3RhcnRfcGMgPSBycl9yZWFkX2VlcHJvbV93b3JkKHJycHJpdiwgJmh3LT5ybmNkX2luZm8uRndTdGFydCk7CisKKyNpZiAoREVCVUcgPiAxKQorCXByaW50aygiJXM6IEV4ZWN1dGluZyBmaXJtd2FyZSBhdCBhZGRyZXNzIDB4JTA2eFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBzdGFydF9wYyk7CisjZW5kaWYKKworCXdyaXRlbChzdGFydF9wYyArIDB4ODAwLCAmcmVncy0+UGMpOworCXdtYigpOworCXVkZWxheSg1KTsKKworCXdyaXRlbChzdGFydF9wYywgJnJlZ3MtPlBjKTsKKwl3bWIoKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBSZWFkIGEgc3RyaW5nIGZyb20gdGhlIEVFUFJPTS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBycl9yZWFkX2VlcHJvbShzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2LAorCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCXVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCQl1bnNpZ25lZCBsb25nIGxlbmd0aCkKK3sKKwlzdHJ1Y3QgcnJfcmVncyBfX2lvbWVtICpyZWdzID0gcnJwcml2LT5yZWdzOworCXUzMiBtaXNjLCBpbywgaG9zdCwgaTsKKworCWlvID0gcmVhZGwoJnJlZ3MtPkV4dElvKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkV4dElvKTsKKwltaXNjID0gcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJd3JpdGVsKDAsICZyZWdzLT5Mb2NhbEN0cmwpOworCWhvc3QgPSByZWFkbCgmcmVncy0+SG9zdEN0cmwpOworCXdyaXRlbChob3N0IHwgSEFMVF9OSUMsICZyZWdzLT5Ib3N0Q3RybCk7CisJbWIoKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKyl7CisJCXdyaXRlbCgoRUVQUk9NX0JBU0UgKyAoKG9mZnNldCtpKSA8PCAzKSksICZyZWdzLT5XaW5CYXNlKTsKKwkJbWIoKTsKKwkJYnVmW2ldID0gKHJlYWRsKCZyZWdzLT5XaW5EYXRhKSA+PiAyNCkgJiAweGZmOworCQltYigpOworCX0KKworCXdyaXRlbChob3N0LCAmcmVncy0+SG9zdEN0cmwpOworCXdyaXRlbChtaXNjLCAmcmVncy0+TG9jYWxDdHJsKTsKKwl3cml0ZWwoaW8sICZyZWdzLT5FeHRJbyk7CisJbWIoKTsKKwlyZXR1cm4gaTsKK30KKworCisvKgorICogU2hvcnRjdXQgdG8gcmVhZCBvbmUgd29yZCAoNCBieXRlcykgb3V0IG9mIHRoZSBFRVBST00gYW5kIGNvbnZlcnQKKyAqIGl0IHRvIG91ciBDUFUgYnl0ZS1vcmRlci4KKyAqLworc3RhdGljIHUzMiBycl9yZWFkX2VlcHJvbV93b3JkKHN0cnVjdCBycl9wcml2YXRlICpycnByaXYsCisJCQkgICAgdm9pZCAqIG9mZnNldCkKK3sKKwl1MzIgd29yZDsKKworCWlmICgocnJfcmVhZF9lZXByb20ocnJwcml2LCAodW5zaWduZWQgbG9uZylvZmZzZXQsCisJCQkgICAgKGNoYXIgKikmd29yZCwgNCkgPT0gNCkpCisJCXJldHVybiBiZTMyX3RvX2NwdSh3b3JkKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogV3JpdGUgYSBzdHJpbmcgdG8gdGhlIEVFUFJPTS4KKyAqCisgKiBUaGlzIGlzIG9ubHkgY2FsbGVkIHdoZW4gdGhlIGZpcm13YXJlIGlzIG5vdCBydW5uaW5nLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHdyaXRlX2VlcHJvbShzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2LAorCQkJCSB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJCSB1bnNpZ25lZCBsb25nIGxlbmd0aCkKK3sKKwlzdHJ1Y3QgcnJfcmVncyBfX2lvbWVtICpyZWdzID0gcnJwcml2LT5yZWdzOworCXUzMiBtaXNjLCBpbywgZGF0YSwgaSwgaiwgcmVhZHksIGVycm9yID0gMDsKKworCWlvID0gcmVhZGwoJnJlZ3MtPkV4dElvKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkV4dElvKTsKKwltaXNjID0gcmVhZGwoJnJlZ3MtPkxvY2FsQ3RybCk7CisJd3JpdGVsKEVOQUJMRV9FRVBST01fV1JJVEUsICZyZWdzLT5Mb2NhbEN0cmwpOworCW1iKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspeworCQl3cml0ZWwoKEVFUFJPTV9CQVNFICsgKChvZmZzZXQraSkgPDwgMykpLCAmcmVncy0+V2luQmFzZSk7CisJCW1iKCk7CisJCWRhdGEgPSBidWZbaV0gPDwgMjQ7CisJCS8qCisJCSAqIE9ubHkgdHJ5IHRvIHdyaXRlIHRoZSBkYXRhIGlmIGl0IGlzIG5vdCB0aGUgc2FtZQorCQkgKiB2YWx1ZSBhbHJlYWR5LgorCQkgKi8KKwkJaWYgKChyZWFkbCgmcmVncy0+V2luRGF0YSkgJiAweGZmMDAwMDAwKSAhPSBkYXRhKXsKKwkJCXdyaXRlbChkYXRhLCAmcmVncy0+V2luRGF0YSk7CisJCQlyZWFkeSA9IDA7CisJCQlqID0gMDsKKwkJCW1iKCk7CisJCQl3aGlsZSghcmVhZHkpeworCQkJCXVkZWxheSgyMCk7CisJCQkJaWYgKChyZWFkbCgmcmVncy0+V2luRGF0YSkgJiAweGZmMDAwMDAwKSA9PQorCQkJCSAgICBkYXRhKQorCQkJCQlyZWFkeSA9IDE7CisJCQkJbWIoKTsKKwkJCQlpZiAoaisrID4gNTAwMCl7CisJCQkJCXByaW50aygiZGF0YSBtaXNtYXRjaDogJTA4eCwgIgorCQkJCQkgICAgICAgIldpbkRhdGEgJTA4eFxuIiwgZGF0YSwKKwkJCQkJICAgICAgIHJlYWRsKCZyZWdzLT5XaW5EYXRhKSk7CisJCQkJCXJlYWR5ID0gMTsKKwkJCQkJZXJyb3IgPSAxOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXdyaXRlbChtaXNjLCAmcmVncy0+TG9jYWxDdHJsKTsKKwl3cml0ZWwoaW8sICZyZWdzLT5FeHRJbyk7CisJbWIoKTsKKworCXJldHVybiBlcnJvcjsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBycl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdjsKKwlzdHJ1Y3QgcnJfcmVncyBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBlZXByb20gKmh3ID0gTlVMTDsKKwl1MzIgc3JhbV9zaXplLCByZXY7CisJaW50IGk7CisKKwlycnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXJlZ3MgPSBycnByaXYtPnJlZ3M7CisKKwlyZXYgPSByZWFkbCgmcmVncy0+RndSZXYpOworCXJycHJpdi0+ZndfcmV2ID0gcmV2OworCWlmIChyZXYgPiAweDAwMDIwMDI0KQorCQlwcmludGsoIiAgRmlybXdhcmUgcmV2aXNpb246ICVpLiVpLiVpXG4iLCAocmV2ID4+IDE2KSwKKwkJICAgICAgICgocmV2ID4+IDgpICYgMHhmZiksIChyZXYgJiAweGZmKSk7CisJZWxzZSBpZiAocmV2ID49IDB4MDAwMjAwMDApIHsKKwkJcHJpbnRrKCIgIEZpcm13YXJlIHJldmlzaW9uOiAlaS4laS4laSAoMi4wLjM3IG9yICIKKwkJICAgICAgICJsYXRlciBpcyByZWNvbW1lbmRlZClcbiIsIChyZXYgPj4gMTYpLAorCQkgICAgICAgKChyZXYgPj4gOCkgJiAweGZmKSwgKHJldiAmIDB4ZmYpKTsKKwl9ZWxzZXsKKwkJcHJpbnRrKCIgIEZpcm13YXJlIHJldmlzaW9uIHRvbyBvbGQ6ICVpLiVpLiVpLCBwbGVhc2UgIgorCQkgICAgICAgInVwZ3JhZGUgdG8gMi4wLjM3IG9yIGxhdGVyLlxuIiwKKwkJICAgICAgIChyZXYgPj4gMTYpLCAoKHJldiA+PiA4KSAmIDB4ZmYpLCAocmV2ICYgMHhmZikpOworCX0KKworI2lmIChERUJVRyA+IDIpCisJcHJpbnRrKCIgIE1heGltdW0gcmVjZWl2ZSByaW5ncyAlaVxuIiwgcmVhZGwoJnJlZ3MtPk1heFJ4Um5nKSk7CisjZW5kaWYKKworCS8qCisJICogUmVhZCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBmcm9tIHRoZSBlZXByb20uICBUaGUgSFcgYWRkcmVzcworCSAqIGlzIG5vdCByZWFsbHkgbmVjZXNzYXJ5IGZvciBISVBQSSBidXQgYXdmdWxseSBjb252ZW5pZW50LgorCSAqIFRoZSBwb2ludGVyIGFyaXRobWV0aWMgdG8gcHV0IGl0IGluIGRldl9hZGRyIGlzIHVnbHksIGJ1dAorCSAqIERvbmFsZCBCZWNrZXIgZG9lcyBpdCB0aGlzIHdheSBmb3IgdGhlIEdpZ0UgdmVyc2lvbiBvZiB0aGlzCisJICogY2FyZCBhbmQgaXQncyBzaG9ydGVyIGFuZCBtb3JlIHBvcnRhYmxlIHRoYW4gYW55CisJICogb3RoZXIgbWV0aG9kIEkndmUgc2Vlbi4gIC1WQUwKKwkgKi8KKworCSoodTE2ICopKGRldi0+ZGV2X2FkZHIpID0KKwkgIGh0b25zKHJyX3JlYWRfZWVwcm9tX3dvcmQocnJwcml2LCAmaHctPm1hbmYuQm9hcmRVTEEpKTsKKwkqKHUzMiAqKShkZXYtPmRldl9hZGRyKzIpID0KKwkgIGh0b25sKHJyX3JlYWRfZWVwcm9tX3dvcmQocnJwcml2LCAmaHctPm1hbmYuQm9hcmRVTEFbNF0pKTsKKwkKKwlwcmludGsoIiAgTUFDOiAiKTsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCXByaW50aygiJTIuMng6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCIlMi4yeFxuIiwgZGV2LT5kZXZfYWRkcltpXSk7CisKKwlzcmFtX3NpemUgPSBycl9yZWFkX2VlcHJvbV93b3JkKHJycHJpdiwgKHZvaWQgKik4KTsKKwlwcmludGsoIiAgU1JBTSBzaXplIDB4JTA2eFxuIiwgc3JhbV9zaXplKTsKKworCWlmIChzeXNjdGxfcm1lbV9tYXggPCAyNjIxNDQpeworCQlwcmludGsoIiAgUmVjZWl2ZSBzb2NrZXQgYnVmZmVyIGxpbWl0IHRvbyBsb3cgKCVpKSwgIgorCQkgICAgICAgInNldHRpbmcgdG8gMjYyMTQ0XG4iLCBzeXNjdGxfcm1lbV9tYXgpOworCQlzeXNjdGxfcm1lbV9tYXggPSAyNjIxNDQ7CisJfQorCisJaWYgKHN5c2N0bF93bWVtX21heCA8IDI2MjE0NCl7CisJCXByaW50aygiICBUcmFuc21pdCBzb2NrZXQgYnVmZmVyIGxpbWl0IHRvbyBsb3cgKCVpKSwgIgorCQkgICAgICAgInNldHRpbmcgdG8gMjYyMTQ0XG4iLCBzeXNjdGxfd21lbV9tYXgpOworCQlzeXNjdGxfd21lbV9tYXggPSAyNjIxNDQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBycl9pbml0MShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBycl9wcml2YXRlICpycnByaXY7CisJc3RydWN0IHJyX3JlZ3MgX19pb21lbSAqcmVnczsKKwl1bnNpZ25lZCBsb25nIG15amlmLCBmbGFnczsKKwlzdHJ1Y3QgY21kIGNtZDsKKwl1MzIgaG9zdGN0cmw7CisJaW50IGVjb2RlID0gMDsKKwlzaG9ydCBpOworCisJcnJwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZWdzID0gcnJwcml2LT5yZWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJycHJpdi0+bG9jaywgZmxhZ3MpOworCisJaG9zdGN0cmwgPSByZWFkbCgmcmVncy0+SG9zdEN0cmwpOworCXdyaXRlbChob3N0Y3RybCB8IEhBTFRfTklDIHwgUlJfQ0xFQVJfSU5ULCAmcmVncy0+SG9zdEN0cmwpOworCXdtYigpOworCisJaWYgKGhvc3RjdHJsICYgUEFSSVRZX0VSUil7CisJCXByaW50aygiJXM6IFBhcml0eSBlcnJvciBoYWx0aW5nIE5JQyAtIHRoaXMgaXMgc2VyaW91cyFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJZWNvZGUgPSAtRUZBVUxUOworCQlnb3RvIGVycm9yOworCX0KKworCXNldF9yeGFkZHIocmVncywgcnJwcml2LT5yeF9jdHJsX2RtYSk7CisJc2V0X2luZm9hZGRyKHJlZ3MsIHJycHJpdi0+aW5mb19kbWEpOworCisJcnJwcml2LT5pbmZvLT5ldnRfY3RybC5lbnRyeV9zaXplID0gc2l6ZW9mKHN0cnVjdCBldmVudCk7CisJcnJwcml2LT5pbmZvLT5ldnRfY3RybC5lbnRyaWVzID0gRVZUX1JJTkdfRU5UUklFUzsKKwlycnByaXYtPmluZm8tPmV2dF9jdHJsLm1vZGUgPSAwOworCXJycHJpdi0+aW5mby0+ZXZ0X2N0cmwucGkgPSAwOworCXNldF9ycmFkZHIoJnJycHJpdi0+aW5mby0+ZXZ0X2N0cmwucm5ncHRyLCBycnByaXYtPmV2dF9yaW5nX2RtYSk7CisKKwlycnByaXYtPmluZm8tPmNtZF9jdHJsLmVudHJ5X3NpemUgPSBzaXplb2Yoc3RydWN0IGNtZCk7CisJcnJwcml2LT5pbmZvLT5jbWRfY3RybC5lbnRyaWVzID0gQ01EX1JJTkdfRU5UUklFUzsKKwlycnByaXYtPmluZm8tPmNtZF9jdHJsLm1vZGUgPSAwOworCXJycHJpdi0+aW5mby0+Y21kX2N0cmwucGkgPSAxNTsKKworCWZvciAoaSA9IDA7IGkgPCBDTURfUklOR19FTlRSSUVTOyBpKyspIHsKKwkJd3JpdGVsKDAsICZyZWdzLT5DbWRSaW5nW2ldKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19FTlRSSUVTOyBpKyspIHsKKwkJcnJwcml2LT50eF9yaW5nW2ldLnNpemUgPSAwOworCQlzZXRfcnJhZGRyKCZycnByaXYtPnR4X3JpbmdbaV0uYWRkciwgMCk7CisJCXJycHJpdi0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwl9CisJcnJwcml2LT5pbmZvLT50eF9jdHJsLmVudHJ5X3NpemUgPSBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpOworCXJycHJpdi0+aW5mby0+dHhfY3RybC5lbnRyaWVzID0gVFhfUklOR19FTlRSSUVTOworCXJycHJpdi0+aW5mby0+dHhfY3RybC5tb2RlID0gMDsKKwlycnByaXYtPmluZm8tPnR4X2N0cmwucGkgPSAwOworCXNldF9ycmFkZHIoJnJycHJpdi0+aW5mby0+dHhfY3RybC5ybmdwdHIsIHJycHJpdi0+dHhfcmluZ19kbWEpOworCisJLyoKKwkgKiBTZXQgZGlydHlfdHggYmVmb3JlIHdlIHN0YXJ0IHJlY2VpdmluZyBpbnRlcnJ1cHRzLCBvdGhlcndpc2UKKwkgKiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgbWlnaHQgdGhpbmsgaXQgaXMgc3VwcG9zZWQgdG8gcHJvY2VzcworCSAqIHR4IGludHMgYmVmb3JlIHdlIGFyZSB1cCBhbmQgcnVubmluZywgd2hpY2ggbWF5IGNhdXNlIGEgbnVsbAorCSAqIHBvaW50ZXIgYWNjZXNzIGluIHRoZSBpbnQgaGFuZGxlci4KKwkgKi8KKwlycnByaXYtPnR4X2Z1bGwgPSAwOworCXJycHJpdi0+Y3VyX3J4ID0gMDsKKwlycnByaXYtPmRpcnR5X3J4ID0gcnJwcml2LT5kaXJ0eV90eCA9IDA7CisKKwlycl9yZXNldChkZXYpOworCisJLyogVHVuaW5nIHZhbHVlcyAqLworCXdyaXRlbCgweDUwMDAsICZyZWdzLT5Db25SZXRyeSk7CisJd3JpdGVsKDB4MTAwLCAmcmVncy0+Q29uUmV0cnlUbXIpOworCXdyaXRlbCgweDUwMDAwMCwgJnJlZ3MtPkNvblRtb3V0KTsKKyAJd3JpdGVsKDB4NjAsICZyZWdzLT5JbnRyVG1yKTsKKwl3cml0ZWwoMHg1MDAwMDAsICZyZWdzLT5UeERhdGFNdlRpbWVvdXQpOworCXdyaXRlbCgweDIwMDAwMCwgJnJlZ3MtPlJ4RGF0YU12VGltZW91dCk7CisgCXdyaXRlbCgweDgwLCAmcmVncy0+V3JpdGVEbWFUaHJlc2gpOworIAl3cml0ZWwoMHg4MCwgJnJlZ3MtPlJlYWREbWFUaHJlc2gpOworCisJcnJwcml2LT5md19ydW5uaW5nID0gMDsKKwl3bWIoKTsKKworCWhvc3RjdHJsICY9IH4oSEFMVF9OSUMgfCBJTlZBTElEX0lOU1RfQiB8IFBBUklUWV9FUlIpOworCXdyaXRlbChob3N0Y3RybCwgJnJlZ3MtPkhvc3RDdHJsKTsKKwl3bWIoKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJycHJpdi0+bG9jaywgZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfRU5UUklFUzsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWRtYV9hZGRyX3QgYWRkcjsKKworCQlycnByaXYtPnJ4X3JpbmdbaV0ubW9kZSA9IDA7CisJCXNrYiA9IGFsbG9jX3NrYihkZXYtPm10dSArIEhJUFBJX0hMRU4sIEdGUF9BVE9NSUMpOworCQlpZiAoIXNrYikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgIgorCQkJICAgICAgICJmb3IgcmVjZWl2ZSByaW5nIC0gaGFsdGluZyBOSUNcbiIsIGRldi0+bmFtZSk7CisJCQllY29kZSA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yOworCQl9CisJCXJycHJpdi0+cnhfc2tidWZmW2ldID0gc2tiOworCSAgICAgICAgYWRkciA9IHBjaV9tYXBfc2luZ2xlKHJycHJpdi0+cGNpX2Rldiwgc2tiLT5kYXRhLAorCQkJZGV2LT5tdHUgKyBISVBQSV9ITEVOLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkvKgorCQkgKiBTYW5pdHkgdGVzdCB0byBzZWUgaWYgd2UgY29uZmxpY3Qgd2l0aCB0aGUgRE1BCisJCSAqIGxpbWl0YXRpb25zIG9mIHRoZSBSb2FkcnVubmVyLgorCQkgKi8KKwkJaWYgKCgoKHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhKSAmIDB4ZmZmKSA+IH42NTMyMCkKKwkJCXByaW50aygic2tiIGFsbG9jIGVycm9yXG4iKTsKKworCQlzZXRfcnJhZGRyKCZycnByaXYtPnJ4X3JpbmdbaV0uYWRkciwgYWRkcik7CisJCXJycHJpdi0+cnhfcmluZ1tpXS5zaXplID0gZGV2LT5tdHUgKyBISVBQSV9ITEVOOworCX0KKworCXJycHJpdi0+cnhfY3RybFs0XS5lbnRyeV9zaXplID0gc2l6ZW9mKHN0cnVjdCByeF9kZXNjKTsKKwlycnByaXYtPnJ4X2N0cmxbNF0uZW50cmllcyA9IFJYX1JJTkdfRU5UUklFUzsKKwlycnByaXYtPnJ4X2N0cmxbNF0ubW9kZSA9IDg7CisJcnJwcml2LT5yeF9jdHJsWzRdLnBpID0gMDsKKwl3bWIoKTsKKwlzZXRfcnJhZGRyKCZycnByaXYtPnJ4X2N0cmxbNF0ucm5ncHRyLCBycnByaXYtPnJ4X3JpbmdfZG1hKTsKKworCXVkZWxheSgxMDAwKTsKKworCS8qCisJICogTm93IHN0YXJ0IHRoZSBGaXJtV2FyZS4KKwkgKi8KKwljbWQuY29kZSA9IENfU1RBUlRfRlc7CisJY21kLnJpbmcgPSAwOworCWNtZC5pbmRleCA9IDA7CisKKwlycl9pc3N1ZV9jbWQocnJwcml2LCAmY21kKTsKKworCS8qCisJICogR2l2ZSB0aGUgRmlybVdhcmUgdGltZSB0byBjaGV3IG9uIHRoZSBgZ2V0IHJ1bm5pbmcnIGNvbW1hbmQuCisJICovCisJbXlqaWYgPSBqaWZmaWVzICsgNSAqIEhaOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBteWppZikgJiYgIXJycHJpdi0+ZndfcnVubmluZykKKwkJY3B1X3JlbGF4KCk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIGVjb2RlOworCisgZXJyb3I6CisJLyoKKwkgKiBXZSBtaWdodCBoYXZlIGdvdHRlbiBoZXJlIGJlY2F1c2Ugd2UgYXJlIG91dCBvZiBtZW1vcnksCisJICogbWFrZSBzdXJlIHdlIHJlbGVhc2UgZXZlcnl0aGluZyB3ZSBhbGxvY2F0ZWQgYmVmb3JlIGZhaWxpbmcKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19FTlRSSUVTOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJycHJpdi0+cnhfc2tidWZmW2ldOworCisJCWlmIChza2IpIHsKKwkgICAgICAgIAlwY2lfdW5tYXBfc2luZ2xlKHJycHJpdi0+cGNpX2RldiwgCisJCQkJCSBycnByaXYtPnJ4X3JpbmdbaV0uYWRkci5hZGRybG8sIAorCQkJCQkgZGV2LT5tdHUgKyBISVBQSV9ITEVOLAorCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXJycHJpdi0+cnhfcmluZ1tpXS5zaXplID0gMDsKKwkJCXNldF9ycmFkZHIoJnJycHJpdi0+cnhfcmluZ1tpXS5hZGRyLCAwKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJycHJpdi0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gZWNvZGU7Cit9CisKKworLyoKKyAqIEFsbCBldmVudHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgc2xvdyAoUlgvVFggaW50cyBkbyBub3QgZ2VuZXJhdGUKKyAqIGV2ZW50cykgYW5kIGFyZSBoYW5kbGVkIGhlcmUsIG91dHNpZGUgdGhlIG1haW4gaW50ZXJydXB0IGhhbmRsZXIsCisgKiB0byByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGhhbmRsZXIuCisgKi8KK3N0YXRpYyB1MzIgcnJfaGFuZGxlX2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBwcm9kaWR4LCB1MzIgZWlkeCkKK3sKKwlzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2OworCXN0cnVjdCBycl9yZWdzIF9faW9tZW0gKnJlZ3M7CisJdTMyIHRtcDsKKworCXJycHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcmVncyA9IHJycHJpdi0+cmVnczsKKworCXdoaWxlIChwcm9kaWR4ICE9IGVpZHgpeworCQlzd2l0Y2ggKHJycHJpdi0+ZXZ0X3JpbmdbZWlkeF0uY29kZSl7CisJCWNhc2UgRV9OSUNfVVA6CisJCQl0bXAgPSByZWFkbCgmcmVncy0+RndSZXYpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZpcm13YXJlIHJldmlzaW9uICVpLiVpLiVpICIKKwkJCSAgICAgICAidXAgYW5kIHJ1bm5pbmdcbiIsIGRldi0+bmFtZSwKKwkJCSAgICAgICAodG1wID4+IDE2KSwgKCh0bXAgPj4gOCkgJiAweGZmKSwgKHRtcCAmIDB4ZmYpKTsKKwkJCXJycHJpdi0+ZndfcnVubmluZyA9IDE7CisJCQl3cml0ZWwoUlhfUklOR19FTlRSSUVTIC0gMSwgJnJlZ3MtPklwUnhQaSk7CisJCQl3bWIoKTsKKwkJCWJyZWFrOworCQljYXNlIEVfTElOS19PTjoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBPcHRpY2FsIGxpbmsgT05cbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSBFX0xJTktfT0ZGOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE9wdGljYWwgbGluayBPRkZcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSBFX1JYX0lETEU6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUlggZGF0YSBub3QgbW92aW5nXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlnb3RvIGRyb3A7CisJCWNhc2UgRV9XQVRDSERPRzoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUaGUgd2F0Y2hkb2cgaXMgaGVyZSB0byBzZWUgIgorCQkJICAgICAgICJ1c1xuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIEVfSU5URVJOX0VSUjoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEhJUFBJIEludGVybmFsIE5JQyBlcnJvclxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJd3JpdGVsKHJlYWRsKCZyZWdzLT5Ib3N0Q3RybCl8SEFMVF9OSUN8UlJfQ0xFQVJfSU5ULCAKKwkJCSAgICAgICAmcmVncy0+SG9zdEN0cmwpOworCQkJd21iKCk7CisJCQlicmVhazsKKwkJY2FzZSBFX0hPU1RfRVJSOgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSG9zdCBzb2Z0d2FyZSBlcnJvclxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJd3JpdGVsKHJlYWRsKCZyZWdzLT5Ib3N0Q3RybCl8SEFMVF9OSUN8UlJfQ0xFQVJfSU5ULCAKKwkJCSAgICAgICAmcmVncy0+SG9zdEN0cmwpOworCQkJd21iKCk7CisJCQlicmVhazsKKwkJLyoKKwkJICogVFggZXZlbnRzLgorCQkgKi8KKwkJY2FzZSBFX0NPTl9SRUo6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ29ubmVjdGlvbiByZWplY3RlZFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJcnJwcml2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJYnJlYWs7CisJCWNhc2UgRV9DT05fVE1PVVQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ29ubmVjdGlvbiB0aW1lb3V0XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSBFX0RJU0NfRVJSOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEhJUFBJIGRpc2Nvbm5lY3QgZXJyb3JcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXJycHJpdi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWJyZWFrOworCQljYXNlIEVfSU5UX1BSVFk6CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBISVBQSSBJbnRlcm5hbCBQYXJpdHkgZXJyb3JcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXdyaXRlbChyZWFkbCgmcmVncy0+SG9zdEN0cmwpfEhBTFRfTklDfFJSX0NMRUFSX0lOVCwgCisJCQkgICAgICAgJnJlZ3MtPkhvc3RDdHJsKTsKKwkJCXdtYigpOworCQkJYnJlYWs7CisJCWNhc2UgRV9UWF9JRExFOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRyYW5zbWl0dGVyIGlkbGVcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIEVfVFhfTElOS19EUk9QOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IExpbmsgbG9zdCBkdXJpbmcgdHJhbnNtaXRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXJycHJpdi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCXdyaXRlbChyZWFkbCgmcmVncy0+SG9zdEN0cmwpfEhBTFRfTklDfFJSX0NMRUFSX0lOVCwgCisJCQkgICAgICAgJnJlZ3MtPkhvc3RDdHJsKTsKKwkJCXdtYigpOworCQkJYnJlYWs7CisJCWNhc2UgRV9UWF9JTlZfUk5HOgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBzZW5kIHJpbmcgYmxvY2tcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXdyaXRlbChyZWFkbCgmcmVncy0+SG9zdEN0cmwpfEhBTFRfTklDfFJSX0NMRUFSX0lOVCwgCisJCQkgICAgICAgJnJlZ3MtPkhvc3RDdHJsKTsKKwkJCXdtYigpOworCQkJYnJlYWs7CisJCWNhc2UgRV9UWF9JTlZfQlVGOgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBzZW5kIGJ1ZmZlciBhZGRyZXNzXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQl3cml0ZWwocmVhZGwoJnJlZ3MtPkhvc3RDdHJsKXxIQUxUX05JQ3xSUl9DTEVBUl9JTlQsIAorCQkJICAgICAgICZyZWdzLT5Ib3N0Q3RybCk7CisJCQl3bWIoKTsKKwkJCWJyZWFrOworCQljYXNlIEVfVFhfSU5WX0RTQzoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgZGVzY3JpcHRvciBhZGRyZXNzXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQl3cml0ZWwocmVhZGwoJnJlZ3MtPkhvc3RDdHJsKXxIQUxUX05JQ3xSUl9DTEVBUl9JTlQsIAorCQkJICAgICAgICZyZWdzLT5Ib3N0Q3RybCk7CisJCQl3bWIoKTsKKwkJCWJyZWFrOworCQkvKgorCQkgKiBSWCBldmVudHMuCisJCSAqLworCQljYXNlIEVfUlhfUk5HX09VVDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZWNlaXZlIHJpbmcgZnVsbFxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRV9SWF9QQVJfRVJSOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlY2VpdmUgcGFyaXR5IGVycm9yXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlnb3RvIGRyb3A7CisJCWNhc2UgRV9SWF9MTFJDX0VSUjoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZWNlaXZlIExMUkMgZXJyb3JcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWdvdG8gZHJvcDsKKwkJY2FzZSBFX1BLVF9MTl9FUlI6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZSBwYWNrZXQgbGVuZ3RoICIKKwkJCSAgICAgICAiZXJyb3JcbiIsIGRldi0+bmFtZSk7CisJCQlnb3RvIGRyb3A7CisJCWNhc2UgRV9EVEFfQ0tTTV9FUlI6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRGF0YSBjaGVja3N1bSBlcnJvclxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJZ290byBkcm9wOworCQljYXNlIEVfU0hUX0JTVDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmV4cGVjdGVkIHNob3J0IGJ1cnN0ICIKKwkJCSAgICAgICAiZXJyb3JcbiIsIGRldi0+bmFtZSk7CisJCQlnb3RvIGRyb3A7CisJCWNhc2UgRV9TVEFURV9FUlI6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjdi4gc3RhdGUgdHJhbnNpdGlvbiIKKwkJCSAgICAgICAiIGVycm9yXG4iLCBkZXYtPm5hbWUpOworCQkJZ290byBkcm9wOworCQljYXNlIEVfVU5FWFBfREFUQToKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmV4cGVjdGVkIGRhdGEgZXJyb3JcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWdvdG8gZHJvcDsKKwkJY2FzZSBFX0xTVF9MTktfRVJSOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IExpbmsgbG9zdCBlcnJvclxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJZ290byBkcm9wOworCQljYXNlIEVfRlJNX0VSUjoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGcmFtbWluZyBFcnJvclxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJZ290byBkcm9wOworCQljYXNlIEVfRkxHX1NZTl9FUlI6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRmxhZyBzeW5jLiBsb3N0IGR1cmluZyIKKwkJCSAgICAgICAicGFja2V0XG4iLCBkZXYtPm5hbWUpOworCQkJZ290byBkcm9wOworCQljYXNlIEVfUlhfSU5WX0JVRjoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgcmVjZWl2ZSBidWZmZXIgIgorCQkJICAgICAgICJhZGRyZXNzXG4iLCBkZXYtPm5hbWUpOworCQkJd3JpdGVsKHJlYWRsKCZyZWdzLT5Ib3N0Q3RybCl8SEFMVF9OSUN8UlJfQ0xFQVJfSU5ULCAKKwkJCSAgICAgICAmcmVncy0+SG9zdEN0cmwpOworCQkJd21iKCk7CisJCQlicmVhazsKKwkJY2FzZSBFX1JYX0lOVl9EU0M6CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIHJlY2VpdmUgZGVzY3JpcHRvciAiCisJCQkgICAgICAgImFkZHJlc3NcbiIsIGRldi0+bmFtZSk7CisJCQl3cml0ZWwocmVhZGwoJnJlZ3MtPkhvc3RDdHJsKXxIQUxUX05JQ3xSUl9DTEVBUl9JTlQsIAorCQkJICAgICAgICZyZWdzLT5Ib3N0Q3RybCk7CisJCQl3bWIoKTsKKwkJCWJyZWFrOworCQljYXNlIEVfUk5HX0JMSzoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgcmluZyBibG9ja1xuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJd3JpdGVsKHJlYWRsKCZyZWdzLT5Ib3N0Q3RybCl8SEFMVF9OSUN8UlJfQ0xFQVJfSU5ULCAKKwkJCSAgICAgICAmcmVncy0+SG9zdEN0cmwpOworCQkJd21iKCk7CisJCQlicmVhazsKKwkJZHJvcDoKKwkJCS8qIExhYmVsIHBhY2tldCB0byBiZSBkcm9wcGVkLgorCQkJICogQWN0dWFsIGRyb3BwaW5nIG9jY3VycyBpbiByeAorCQkJICogaGFuZGxpbmcuCisJCQkgKgorCQkJICogVGhlIGluZGV4IG9mIHBhY2tldCB3ZSBnZXQgdG8gZHJvcCBpcworCQkJICogdGhlIGluZGV4IG9mIHRoZSBwYWNrZXQgZm9sbG93aW5nCisJCQkgKiB0aGUgYmFkIHBhY2tldC4gLWtiZgorCQkJICovCisJCQl7CisJCQkJdTE2IGluZGV4ID0gcnJwcml2LT5ldnRfcmluZ1tlaWR4XS5pbmRleDsKKwkJCQlpbmRleCA9IChpbmRleCArIChSWF9SSU5HX0VOVFJJRVMgLSAxKSkgJQorCQkJCQlSWF9SSU5HX0VOVFJJRVM7CisJCQkJcnJwcml2LT5yeF9yaW5nW2luZGV4XS5tb2RlIHw9CisJCQkJCShQQUNLRVRfQkFEIHwgUEFDS0VUX0VORCk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmhhbmRsZWQgZXZlbnQgMHglMDJ4XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgcnJwcml2LT5ldnRfcmluZ1tlaWR4XS5jb2RlKTsKKwkJfQorCQllaWR4ID0gKGVpZHggKyAxKSAlIEVWVF9SSU5HX0VOVFJJRVM7CisJfQorCisJcnJwcml2LT5pbmZvLT5ldnRfY3RybC5waSA9IGVpZHg7CisJd21iKCk7CisJcmV0dXJuIGVpZHg7Cit9CisKKworc3RhdGljIHZvaWQgcnhfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiByeGxpbWl0LCB1MzIgaW5kZXgpCit7CisJc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHJyX3JlZ3MgX19pb21lbSAqcmVncyA9IHJycHJpdi0+cmVnczsKKworCWRvIHsKKwkJc3RydWN0IHJ4X2Rlc2MgKmRlc2M7CisJCXUzMiBwa3RfbGVuOworCisJCWRlc2MgPSAmKHJycHJpdi0+cnhfcmluZ1tpbmRleF0pOworCQlwa3RfbGVuID0gZGVzYy0+c2l6ZTsKKyNpZiAoREVCVUcgPiAyKQorCQlwcmludGsoImluZGV4ICVpLCByeGxpbWl0ICVpXG4iLCBpbmRleCwgcnhsaW1pdCk7CisJCXByaW50aygibGVuICV4LCBtb2RlICV4XG4iLCBwa3RfbGVuLCBkZXNjLT5tb2RlKTsKKyNlbmRpZgorCQlpZiAoIChycnByaXYtPnJ4X3JpbmdbaW5kZXhdLm1vZGUgJiBQQUNLRVRfQkFEKSA9PSBQQUNLRVRfQkFEKXsKKwkJCXJycHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJZ290byBkZWZlcjsKKwkJfQorCisJCWlmIChwa3RfbGVuID4gMCl7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqcnhfc2tiOworCisJCQlyeF9za2IgPSBycnByaXYtPnJ4X3NrYnVmZltpbmRleF07CisKKwkJCWlmIChwa3RfbGVuIDwgUEtUX0NPUFlfVEhSRVNIT0xEKSB7CisJCQkJc2tiID0gYWxsb2Nfc2tiKHBrdF9sZW4sIEdGUF9BVE9NSUMpOworCQkJCWlmIChza2IgPT0gTlVMTCl7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgc2tiICglaSBieXRlcyksIGRlZmVycmluZyBwYWNrZXRcbiIsIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCQkJCXJycHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCQlnb3RvIGRlZmVyOworCQkJCX0gZWxzZSB7CisJCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShycnByaXYtPnBjaV9kZXYsCisJCQkJCQkJCSAgICBkZXNjLT5hZGRyLmFkZHJsbywKKwkJCQkJCQkJICAgIHBrdF9sZW4sCisJCQkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQkJCW1lbWNweShza2JfcHV0KHNrYiwgcGt0X2xlbiksCisJCQkJCSAgICAgICByeF9za2ItPmRhdGEsIHBrdF9sZW4pOworCisJCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShycnByaXYtPnBjaV9kZXYsCisJCQkJCQkJCSAgICAgICBkZXNjLT5hZGRyLmFkZHJsbywKKwkJCQkJCQkJICAgICAgIHBrdF9sZW4sCisJCQkJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCX0KKwkJCX1lbHNleworCQkJCXN0cnVjdCBza19idWZmICpuZXdza2I7CisKKwkJCQluZXdza2IgPSBhbGxvY19za2IoZGV2LT5tdHUgKyBISVBQSV9ITEVOLAorCQkJCQlHRlBfQVRPTUlDKTsKKwkJCQlpZiAobmV3c2tiKXsKKwkJCQkJZG1hX2FkZHJfdCBhZGRyOworCisJICAgICAgICAJCQlwY2lfdW5tYXBfc2luZ2xlKHJycHJpdi0+cGNpX2RldiwgCisJCQkJCQlkZXNjLT5hZGRyLmFkZHJsbywgZGV2LT5tdHUgKyAKKwkJCQkJCUhJUFBJX0hMRU4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJCXNrYiA9IHJ4X3NrYjsKKwkJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJCQlycnByaXYtPnJ4X3NrYnVmZltpbmRleF0gPSBuZXdza2I7CisJICAgICAgICAJCQlhZGRyID0gcGNpX21hcF9zaW5nbGUocnJwcml2LT5wY2lfZGV2LCAKKwkJCQkJCW5ld3NrYi0+ZGF0YSwgCisJCQkJCQlkZXYtPm10dSArIEhJUFBJX0hMRU4sIAorCQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQkJc2V0X3JyYWRkcigmZGVzYy0+YWRkciwgYWRkcik7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRrKCIlczogT3V0IG9mIG1lbW9yeSwgZGVmZXJyaW5nICIKKwkJCQkJICAgICAgICJwYWNrZXRcbiIsIGRldi0+bmFtZSk7CisJCQkJCXJycHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCQlnb3RvIGRlZmVyOworCQkJCX0KKwkJCX0KKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJc2tiLT5wcm90b2NvbCA9IGhpcHBpX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCisJCQluZXRpZl9yeChza2IpOwkJLyogc2VuZCBpdCB1cCAqLworCisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJcnJwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlycnByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCX0KKwlkZWZlcjoKKwkJZGVzYy0+bW9kZSA9IDA7CisJCWRlc2MtPnNpemUgPSBkZXYtPm10dSArIEhJUFBJX0hMRU47CisKKwkJaWYgKChpbmRleCAmIDcpID09IDcpCisJCQl3cml0ZWwoaW5kZXgsICZyZWdzLT5JcFJ4UGkpOworCisJCWluZGV4ID0gKGluZGV4ICsgMSkgJSBSWF9SSU5HX0VOVFJJRVM7CisJfSB3aGlsZShpbmRleCAhPSByeGxpbWl0KTsKKworCXJycHJpdi0+Y3VyX3J4ID0gaW5kZXg7CisJd21iKCk7Cit9CisKKworc3RhdGljIGlycXJldHVybl90IHJyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpwdHJlZ3MpCit7CisJc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdjsKKwlzdHJ1Y3QgcnJfcmVncyBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisJdTMyIHByb2RpZHgsIHJ4aW5kZXgsIGVpZHgsIHR4Y3NtciwgcnhsaW1pdCwgdHhjb247CisKKwlycnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXJlZ3MgPSBycnByaXYtPnJlZ3M7CisKKwlpZiAoIShyZWFkbCgmcmVncy0+SG9zdEN0cmwpICYgUlJfSU5UKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJc3Bpbl9sb2NrKCZycnByaXYtPmxvY2spOworCisJcHJvZGlkeCA9IHJlYWRsKCZyZWdzLT5FdnRQcmQpOworCXR4Y3NtciA9IChwcm9kaWR4ID4+IDgpICYgMHhmZjsKKwlyeGxpbWl0ID0gKHByb2RpZHggPj4gMTYpICYgMHhmZjsKKwlwcm9kaWR4ICY9IDB4ZmY7CisKKyNpZiAoREVCVUcgPiAyKQorCXByaW50aygiJXM6IGludGVycnVwdCwgcHJvZGlkeCA9ICVpLCBlaWR4ID0gJWlcbiIsIGRldi0+bmFtZSwKKwkgICAgICAgcHJvZGlkeCwgcnJwcml2LT5pbmZvLT5ldnRfY3RybC5waSk7CisjZW5kaWYKKwkvKgorCSAqIE9yZGVyIGhlcmUgaXMgaW1wb3J0YW50LiAgV2UgbXVzdCBoYW5kbGUgZXZlbnRzCisJICogYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UgaW4gb3JkZXIgdG8gY2F0Y2gKKwkgKiBzdWNoIHRoaW5ncyBhcyBMTFJDIGVycm9ycywgZXRjIC1rYmYKKwkgKi8KKworCWVpZHggPSBycnByaXYtPmluZm8tPmV2dF9jdHJsLnBpOworCWlmIChwcm9kaWR4ICE9IGVpZHgpCisJCWVpZHggPSBycl9oYW5kbGVfZXZlbnQoZGV2LCBwcm9kaWR4LCBlaWR4KTsKKworCXJ4aW5kZXggPSBycnByaXYtPmN1cl9yeDsKKwlpZiAocnhpbmRleCAhPSByeGxpbWl0KQorCQlyeF9pbnQoZGV2LCByeGxpbWl0LCByeGluZGV4KTsKKworCXR4Y29uID0gcnJwcml2LT5kaXJ0eV90eDsKKwlpZiAodHhjc21yICE9IHR4Y29uKSB7CisJCWRvIHsKKwkJCS8qIER1ZSB0byBvY2NhdGlvbmFsIGZpcm13YXJlIFRYIHByb2R1Y2VyL2NvbnN1bWVyIG91dAorCQkJICogb2Ygc3luYy4gZXJyb3IgbmVlZCB0byBjaGVjayBlbnRyeSBpbiByaW5nIC1rYmYKKwkJCSAqLworCQkJaWYocnJwcml2LT50eF9za2J1ZmZbdHhjb25dKXsKKwkJCQlzdHJ1Y3QgdHhfZGVzYyAqZGVzYzsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQkJZGVzYyA9ICYocnJwcml2LT50eF9yaW5nW3R4Y29uXSk7CisJCQkJc2tiID0gcnJwcml2LT50eF9za2J1ZmZbdHhjb25dOworCisJCQkJcnJwcml2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQkJcnJwcml2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCQkJCXBjaV91bm1hcF9zaW5nbGUocnJwcml2LT5wY2lfZGV2LAorCQkJCQkJIGRlc2MtPmFkZHIuYWRkcmxvLCBza2ItPmxlbiwKKwkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCisJCQkJcnJwcml2LT50eF9za2J1ZmZbdHhjb25dID0gTlVMTDsKKwkJCQlkZXNjLT5zaXplID0gMDsKKwkJCQlzZXRfcnJhZGRyKCZycnByaXYtPnR4X3JpbmdbdHhjb25dLmFkZHIsIDApOworCQkJCWRlc2MtPm1vZGUgPSAwOworCQkJfQorCQkJdHhjb24gPSAodHhjb24gKyAxKSAlIFRYX1JJTkdfRU5UUklFUzsKKwkJfSB3aGlsZSAodHhjc21yICE9IHR4Y29uKTsKKwkJd21iKCk7CisKKwkJcnJwcml2LT5kaXJ0eV90eCA9IHR4Y29uOworCQlpZiAocnJwcml2LT50eF9mdWxsICYmIHJyX2lmX2J1c3koZGV2KSAmJgorCQkgICAgKCgocnJwcml2LT5pbmZvLT50eF9jdHJsLnBpICsgMSkgJSBUWF9SSU5HX0VOVFJJRVMpCisJCSAgICAgIT0gcnJwcml2LT5kaXJ0eV90eCkpeworCQkJcnJwcml2LT50eF9mdWxsID0gMDsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfQorCX0KKworCWVpZHggfD0gKCh0eGNzbXIgPDwgOCkgfCAocnhsaW1pdCA8PCAxNikpOworCXdyaXRlbChlaWR4LCAmcmVncy0+RXZ0Q29uKTsKKwl3bWIoKTsKKworCXNwaW5fdW5sb2NrKCZycnByaXYtPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJyX3Jhel90eChzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2LAorCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfRU5UUklFUzsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBycnByaXYtPnR4X3NrYnVmZltpXTsKKworCQlpZiAoc2tiKSB7CisJCQlzdHJ1Y3QgdHhfZGVzYyAqZGVzYyA9ICYocnJwcml2LT50eF9yaW5nW2ldKTsKKworCSAgICAgICAgCXBjaV91bm1hcF9zaW5nbGUocnJwcml2LT5wY2lfZGV2LCBkZXNjLT5hZGRyLmFkZHJsbywKKwkJCQlza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXNjLT5zaXplID0gMDsKKwkJCXNldF9ycmFkZHIoJmRlc2MtPmFkZHIsIDApOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJcnJwcml2LT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQl9CisJfQorfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBycl9yYXpfcngoc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdiwKKwkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX0VOVFJJRVM7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcnJwcml2LT5yeF9za2J1ZmZbaV07CisKKwkJaWYgKHNrYikgeworCQkJc3RydWN0IHJ4X2Rlc2MgKmRlc2MgPSAmKHJycHJpdi0+cnhfcmluZ1tpXSk7CisKKwkgICAgICAgIAlwY2lfdW5tYXBfc2luZ2xlKHJycHJpdi0+cGNpX2RldiwgZGVzYy0+YWRkci5hZGRybG8sCisJCQkJZGV2LT5tdHUgKyBISVBQSV9ITEVOLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGVzYy0+c2l6ZSA9IDA7CisJCQlzZXRfcnJhZGRyKCZkZXNjLT5hZGRyLCAwKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJycHJpdi0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcnJfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBycl9wcml2YXRlICpycnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBycl9yZWdzIF9faW9tZW0gKnJlZ3MgPSBycnByaXYtPnJlZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChyZWFkbCgmcmVncy0+SG9zdEN0cmwpICYgTklDX0hBTFRFRCl7CisJCXByaW50aygiJXM6IFJlc3RhcnRpbmcgbmljXG4iLCBkZXYtPm5hbWUpOworCQltZW1zZXQocnJwcml2LT5yeF9jdHJsLCAwLCAyNTYgKiBzaXplb2Yoc3RydWN0IHJpbmdfY3RybCkpOworCQltZW1zZXQocnJwcml2LT5pbmZvLCAwLCBzaXplb2Yoc3RydWN0IHJyX2luZm8pKTsKKwkJd21iKCk7CisKKwkJcnJfcmF6X3R4KHJycHJpdiwgZGV2KTsKKwkJcnJfcmF6X3J4KHJycHJpdiwgZGV2KTsKKworCQlpZiAocnJfaW5pdDEoZGV2KSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJycHJpdi0+bG9jaywgZmxhZ3MpOworCQkJd3JpdGVsKHJlYWRsKCZyZWdzLT5Ib3N0Q3RybCl8SEFMVF9OSUN8UlJfQ0xFQVJfSU5ULCAKKwkJCSAgICAgICAmcmVncy0+SG9zdEN0cmwpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnJwcml2LT5sb2NrLCBmbGFncyk7CisJCX0KKwl9CisJcnJwcml2LT50aW1lci5leHBpcmVzID0gUlVOX0FUKDUqSFopOworCWFkZF90aW1lcigmcnJwcml2LT50aW1lcik7Cit9CisKKworc3RhdGljIGludCBycl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBycnByaXYtPnBjaV9kZXY7CisJc3RydWN0IHJyX3JlZ3MgX19pb21lbSAqcmVnczsKKwlpbnQgZWNvZGUgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKworCXJlZ3MgPSBycnByaXYtPnJlZ3M7CisKKwlpZiAocnJwcml2LT5md19yZXYgPCAweDAwMDIwMDAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0cnlpbmcgdG8gY29uZmlndXJlIGRldmljZSB3aXRoICIKKwkJICAgICAgICJvYnNvbGV0ZSBmaXJtd2FyZVxuIiwgZGV2LT5uYW1lKTsKKwkJZWNvZGUgPSAtRUJVU1k7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcnJwcml2LT5yeF9jdHJsID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwKKwkJCQkJICAgICAgIDI1NiAqIHNpemVvZihzdHJ1Y3QgcmluZ19jdHJsKSwKKwkJCQkJICAgICAgICZkbWFfYWRkcik7CisJaWYgKCFycnByaXYtPnJ4X2N0cmwpIHsKKwkJZWNvZGUgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKwlycnByaXYtPnJ4X2N0cmxfZG1hID0gZG1hX2FkZHI7CisJbWVtc2V0KHJycHJpdi0+cnhfY3RybCwgMCwgMjU2KnNpemVvZihzdHJ1Y3QgcmluZ19jdHJsKSk7CisKKwlycnByaXYtPmluZm8gPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplb2Yoc3RydWN0IHJyX2luZm8pLAorCQkJCQkgICAgJmRtYV9hZGRyKTsKKwlpZiAoIXJycHJpdi0+aW5mbykgeworCQllY29kZSA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCXJycHJpdi0+aW5mb19kbWEgPSBkbWFfYWRkcjsKKwltZW1zZXQocnJwcml2LT5pbmZvLCAwLCBzaXplb2Yoc3RydWN0IHJyX2luZm8pKTsKKwl3bWIoKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZycnByaXYtPmxvY2ssIGZsYWdzKTsKKwl3cml0ZWwocmVhZGwoJnJlZ3MtPkhvc3RDdHJsKXxIQUxUX05JQ3xSUl9DTEVBUl9JTlQsICZyZWdzLT5Ib3N0Q3RybCk7CisJcmVhZGwoJnJlZ3MtPkhvc3RDdHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycnByaXYtPmxvY2ssIGZsYWdzKTsKKworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgcnJfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZXF1ZXN0ZWQgSVJRICVkIGlzIGJ1c3lcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJZWNvZGUgPSAtRUFHQUlOOworCQlnb3RvIGVycm9yOworCX0KKworCWlmICgoZWNvZGUgPSBycl9pbml0MShkZXYpKSkKKwkJZ290byBlcnJvcjsKKworCS8qIFNldCB0aGUgdGltZXIgdG8gc3dpdGNoIHRvIGNoZWNrIGZvciBsaW5rIGJlYXQgYW5kIHBlcmhhcHMgc3dpdGNoCisJICAgdG8gYW4gYWx0ZXJuYXRlIG1lZGlhIHR5cGUuICovCisJaW5pdF90aW1lcigmcnJwcml2LT50aW1lcik7CisJcnJwcml2LT50aW1lci5leHBpcmVzID0gUlVOX0FUKDUqSFopOyAgICAgICAgICAgLyogNSBzZWMuIHdhdGNoZG9nICovCisJcnJwcml2LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCXJycHJpdi0+dGltZXIuZnVuY3Rpb24gPSAmcnJfdGltZXI7ICAgICAgICAgICAgICAgLyogdGltZXIgaGFuZGxlciAqLworCWFkZF90aW1lcigmcnJwcml2LT50aW1lcik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIGVjb2RlOworCisgZXJyb3I6CisJc3Bpbl9sb2NrX2lycXNhdmUoJnJycHJpdi0+bG9jaywgZmxhZ3MpOworCXdyaXRlbChyZWFkbCgmcmVncy0+SG9zdEN0cmwpfEhBTFRfTklDfFJSX0NMRUFSX0lOVCwgJnJlZ3MtPkhvc3RDdHJsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycnByaXYtPmxvY2ssIGZsYWdzKTsKKworCWlmIChycnByaXYtPmluZm8pIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplb2Yoc3RydWN0IHJyX2luZm8pLCBycnByaXYtPmluZm8sCisJCQkJICAgIHJycHJpdi0+aW5mb19kbWEpOworCQlycnByaXYtPmluZm8gPSBOVUxMOworCX0KKwlpZiAocnJwcml2LT5yeF9jdHJsKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCByaW5nX2N0cmwpLAorCQkJCSAgICBycnByaXYtPnJ4X2N0cmwsIHJycHJpdi0+cnhfY3RybF9kbWEpOworCQlycnByaXYtPnJ4X2N0cmwgPSBOVUxMOworCX0KKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwlyZXR1cm4gZWNvZGU7Cit9CisKKworc3RhdGljIHZvaWQgcnJfZHVtcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBycl9wcml2YXRlICpycnByaXY7CisJc3RydWN0IHJyX3JlZ3MgX19pb21lbSAqcmVnczsKKwl1MzIgaW5kZXgsIGNvbnM7CisJc2hvcnQgaTsKKwlpbnQgbGVuOworCisJcnJwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZWdzID0gcnJwcml2LT5yZWdzOworCisJcHJpbnRrKCIlczogZHVtcGluZyBOSUMgVFggcmluZ3NcbiIsIGRldi0+bmFtZSk7CisKKwlwcmludGsoIlJ4UHJkICUwOHgsIFR4UHJkICUwMngsIEV2dFByZCAlMDh4LCBUeFBpICUwMngsIFR4Q3RybFBpICUwMnhcbiIsCisJICAgICAgIHJlYWRsKCZyZWdzLT5SeFByZCksIHJlYWRsKCZyZWdzLT5UeFByZCksCisJICAgICAgIHJlYWRsKCZyZWdzLT5FdnRQcmQpLCByZWFkbCgmcmVncy0+VHhQaSksCisJICAgICAgIHJycHJpdi0+aW5mby0+dHhfY3RybC5waSk7CisKKwlwcmludGsoIkVycm9yIGNvZGUgMHgleFxuIiwgcmVhZGwoJnJlZ3MtPkZhaWwxKSk7CisKKwlpbmRleCA9ICgoKHJlYWRsKCZyZWdzLT5FdnRQcmQpID4+IDgpICYgMHhmZiApIC0gMSkgJSBFVlRfUklOR19FTlRSSUVTOworCWNvbnMgPSBycnByaXYtPmRpcnR5X3R4OworCXByaW50aygiVFggcmluZyBpbmRleCAlaSwgVFggY29uc3VtZXIgJWlcbiIsCisJICAgICAgIGluZGV4LCBjb25zKTsKKworCWlmIChycnByaXYtPnR4X3NrYnVmZltpbmRleF0peworCQlsZW4gPSBtaW5fdChpbnQsIDB4ODAsIHJycHJpdi0+dHhfc2tidWZmW2luZGV4XS0+bGVuKTsKKwkJcHJpbnRrKCJza2J1ZmYgZm9yIGluZGV4ICVpIGlzIHZhbGlkIC0gZHVtcGluZyBkYXRhICgweCV4IGJ5dGVzIC0gRE1BIGxlbiAweCV4KVxuIiwgaW5kZXgsIGxlbiwgcnJwcml2LT50eF9yaW5nW2luZGV4XS5zaXplKTsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKXsKKwkJCWlmICghKGkgJiA3KSkKKwkJCQlwcmludGsoIlxuIik7CisJCQlwcmludGsoIiUwMnggIiwgKHVuc2lnbmVkIGNoYXIpIHJycHJpdi0+dHhfc2tidWZmW2luZGV4XS0+ZGF0YVtpXSk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCX0KKworCWlmIChycnByaXYtPnR4X3NrYnVmZltjb25zXSl7CisJCWxlbiA9IG1pbl90KGludCwgMHg4MCwgcnJwcml2LT50eF9za2J1ZmZbY29uc10tPmxlbik7CisJCXByaW50aygic2tidWZmIGZvciBjb25zICVpIGlzIHZhbGlkIC0gZHVtcGluZyBkYXRhICgweCV4IGJ5dGVzIC0gc2tidWZmIGxlbiAweCV4KVxuIiwgY29ucywgbGVuLCBycnByaXYtPnR4X3NrYnVmZltjb25zXS0+bGVuKTsKKwkJcHJpbnRrKCJtb2RlIDB4JXgsIHNpemUgMHgleCxcbiBwaHlzICUwOEx4LCBza2J1ZmYtYWRkciAlMDhseCwgdHJ1ZXNpemUgMHgleFxuIiwKKwkJICAgICAgIHJycHJpdi0+dHhfcmluZ1tjb25zXS5tb2RlLAorCQkgICAgICAgcnJwcml2LT50eF9yaW5nW2NvbnNdLnNpemUsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBycnByaXYtPnR4X3JpbmdbY29uc10uYWRkci5hZGRybG8sCisJCSAgICAgICAodW5zaWduZWQgbG9uZylycnByaXYtPnR4X3NrYnVmZltjb25zXS0+ZGF0YSwKKwkJICAgICAgICh1bnNpZ25lZCBpbnQpcnJwcml2LT50eF9za2J1ZmZbY29uc10tPnRydWVzaXplKTsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKXsKKwkJCWlmICghKGkgJiA3KSkKKwkJCQlwcmludGsoIlxuIik7CisJCQlwcmludGsoIiUwMnggIiwgKHVuc2lnbmVkIGNoYXIpcnJwcml2LT50eF9yaW5nW2NvbnNdLnNpemUpOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9CisKKwlwcmludGsoImR1bXBpbmcgVFggcmluZyBpbmZvOlxuIik7CisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfRU5UUklFUzsgaSsrKQorCQlwcmludGsoIm1vZGUgMHgleCwgc2l6ZSAweCV4LCBwaHlzLWFkZHIgJTA4THhcbiIsCisJCSAgICAgICBycnByaXYtPnR4X3JpbmdbaV0ubW9kZSwKKwkJICAgICAgIHJycHJpdi0+dHhfcmluZ1tpXS5zaXplLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcnJwcml2LT50eF9yaW5nW2ldLmFkZHIuYWRkcmxvKTsKKworfQorCisKK3N0YXRpYyBpbnQgcnJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2OworCXN0cnVjdCBycl9yZWdzIF9faW9tZW0gKnJlZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdG1wOworCXNob3J0IGk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlycnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXJlZ3MgPSBycnByaXYtPnJlZ3M7CisKKwkvKgorCSAqIExvY2sgdG8gbWFrZSBzdXJlIHdlIGFyZSBub3QgY2xlYW5pbmcgdXAgd2hpbGUgYW5vdGhlciBDUFUKKwkgKiBpcyBoYW5kbGluZyBpbnRlcnJ1cHRzLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZycnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXRtcCA9IHJlYWRsKCZyZWdzLT5Ib3N0Q3RybCk7CisJaWYgKHRtcCAmIE5JQ19IQUxURUQpeworCQlwcmludGsoIiVzOiBOSUMgYWxyZWFkeSBoYWx0ZWRcbiIsIGRldi0+bmFtZSk7CisJCXJyX2R1bXAoZGV2KTsKKwl9ZWxzZXsKKwkJdG1wIHw9IEhBTFRfTklDIHwgUlJfQ0xFQVJfSU5UOworCQl3cml0ZWwodG1wLCAmcmVncy0+SG9zdEN0cmwpOworCQlyZWFkbCgmcmVncy0+SG9zdEN0cmwpOworCX0KKworCXJycHJpdi0+ZndfcnVubmluZyA9IDA7CisKKwlkZWxfdGltZXJfc3luYygmcnJwcml2LT50aW1lcik7CisKKwl3cml0ZWwoMCwgJnJlZ3MtPlR4UGkpOworCXdyaXRlbCgwLCAmcmVncy0+SXBSeFBpKTsKKworCXdyaXRlbCgwLCAmcmVncy0+RXZ0Q29uKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkV2dFByZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ01EX1JJTkdfRU5UUklFUzsgaSsrKQorCQl3cml0ZWwoMCwgJnJlZ3MtPkNtZFJpbmdbaV0pOworCisJcnJwcml2LT5pbmZvLT50eF9jdHJsLmVudHJpZXMgPSAwOworCXJycHJpdi0+aW5mby0+Y21kX2N0cmwucGkgPSAwOworCXJycHJpdi0+aW5mby0+ZXZ0X2N0cmwucGkgPSAwOworCXJycHJpdi0+cnhfY3RybFs0XS5lbnRyaWVzID0gMDsKKworCXJyX3Jhel90eChycnByaXYsIGRldik7CisJcnJfcmF6X3J4KHJycHJpdiwgZGV2KTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocnJwcml2LT5wY2lfZGV2LCAyNTYgKiBzaXplb2Yoc3RydWN0IHJpbmdfY3RybCksCisJCQkgICAgcnJwcml2LT5yeF9jdHJsLCBycnByaXYtPnJ4X2N0cmxfZG1hKTsKKwlycnByaXYtPnJ4X2N0cmwgPSBOVUxMOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChycnByaXYtPnBjaV9kZXYsIHNpemVvZihzdHJ1Y3QgcnJfaW5mbyksCisJCQkgICAgcnJwcml2LT5pbmZvLCBycnByaXYtPmluZm9fZG1hKTsKKwlycnByaXYtPmluZm8gPSBOVUxMOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnJwcml2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHJyX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcnJfcmVncyBfX2lvbWVtICpyZWdzID0gcnJwcml2LT5yZWdzOworCXN0cnVjdCByaW5nX2N0cmwgKnR4Y3RybDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBpbmRleCwgbGVuID0gc2tiLT5sZW47CisJdTMyICppZmllbGQ7CisJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisKKwlpZiAocmVhZGwoJnJlZ3MtPk1vZGUpICYgRkFUQUxfRVJSKQorCQlwcmludGsoImVycm9yIGNvZGVzIEZhaWwxICUwMngsIEZhaWwyICUwMnhcbiIsCisJCSAgICAgICByZWFkbCgmcmVncy0+RmFpbDEpLCByZWFkbCgmcmVncy0+RmFpbDIpKTsKKworCS8qCisJICogV2UgcHJvYmFibHkgbmVlZCB0byBkZWFsIHdpdGggdGJ1c3kgaGVyZSB0byBwcmV2ZW50IG92ZXJydW5zLgorCSAqLworCisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgOCl7CisJCXByaW50aygiaW5jb21pbmcgc2tiIHRvbyBzbWFsbCAtIHJlYWxsb2NhdGluZ1xuIik7CisJCWlmICghKG5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDgpKSkgeworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCA4KTsKKwkJc2tiX3B1dChuZXdfc2tiLCBsZW4pOworCQltZW1jcHkobmV3X3NrYi0+ZGF0YSwgc2tiLT5kYXRhLCBsZW4pOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXNrYiA9IG5ld19za2I7CisJfQorCisJaWZpZWxkID0gKHUzMiAqKXNrYl9wdXNoKHNrYiwgOCk7CisKKwlpZmllbGRbMF0gPSAwOworCWlmaWVsZFsxXSA9IHNrYi0+cHJpdmF0ZS5pZmllbGQ7CisKKwkvKgorCSAqIFdlIGRvbid0IG5lZWQgdGhlIGxvY2sgYmVmb3JlIHdlIGFyZSBhY3R1YWxseSBnb2luZyB0byBzdGFydAorCSAqIGZpZGRsaW5nIHdpdGggdGhlIGNvbnRyb2wgYmxvY2tzLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZycnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXR4Y3RybCA9ICZycnByaXYtPmluZm8tPnR4X2N0cmw7CisKKwlpbmRleCA9IHR4Y3RybC0+cGk7CisKKwlycnByaXYtPnR4X3NrYnVmZltpbmRleF0gPSBza2I7CisJc2V0X3JyYWRkcigmcnJwcml2LT50eF9yaW5nW2luZGV4XS5hZGRyLCBwY2lfbWFwX3NpbmdsZSgKKwkJcnJwcml2LT5wY2lfZGV2LCBza2ItPmRhdGEsIGxlbiArIDgsIFBDSV9ETUFfVE9ERVZJQ0UpKTsKKwlycnByaXYtPnR4X3JpbmdbaW5kZXhdLnNpemUgPSBsZW4gKyA4OyAvKiBpbmNsdWRlIElGSUVMRCAqLworCXJycHJpdi0+dHhfcmluZ1tpbmRleF0ubW9kZSA9IFBBQ0tFVF9TVEFSVCB8IFBBQ0tFVF9FTkQ7CisJdHhjdHJsLT5waSA9IChpbmRleCArIDEpICUgVFhfUklOR19FTlRSSUVTOworCXdtYigpOworCXdyaXRlbCh0eGN0cmwtPnBpLCAmcmVncy0+VHhQaSk7CisKKwlpZiAodHhjdHJsLT5waSA9PSBycnByaXYtPmRpcnR5X3R4KXsKKwkJcnJwcml2LT50eF9mdWxsID0gMTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJycHJpdi0+bG9jaywgZmxhZ3MpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpycl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2OworCisJcnJwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybigmcnJwcml2LT5zdGF0cyk7Cit9CisKKworLyoKKyAqIFJlYWQgdGhlIGZpcm13YXJlIG91dCBvZiB0aGUgRUVQUk9NIGFuZCBwdXQgaXQgaW50byB0aGUgU1JBTQorICogKG9yIGZyb20gdXNlciBzcGFjZSAtIGxhdGVyKQorICoKKyAqIFRoaXMgb3BlcmF0aW9uIHJlcXVpcmVzIHRoZSBOSUMgdG8gYmUgaGFsdGVkIGFuZCBpcyBwZXJmb3JtZWQgd2l0aAorICogaW50ZXJydXB0cyBkaXNhYmxlZCBhbmQgd2l0aCB0aGUgc3BpbmxvY2sgaG9sZC4KKyAqLworc3RhdGljIGludCBycl9sb2FkX2Zpcm13YXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdjsKKwlzdHJ1Y3QgcnJfcmVncyBfX2lvbWVtICpyZWdzOworCXVuc2lnbmVkIGxvbmcgZXB0ciwgc2VncHRyOworCWludCBpLCBqOworCXUzMiBsb2NhbGN0cmwsIHNwdHIsIGxlbiwgdG1wOworCXUzMiBwMmxlbiwgcDJzaXplLCBucl9zZWcsIHJldmlzaW9uLCBpbywgc3JhbV9zaXplOworCXN0cnVjdCBlZXByb20gKmh3ID0gTlVMTDsKKworCXJycHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcmVncyA9IHJycHJpdi0+cmVnczsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKCEocmVhZGwoJnJlZ3MtPkhvc3RDdHJsKSAmIE5JQ19IQUxURUQpKXsKKwkJcHJpbnRrKCIlczogVHJ5aW5nIHRvIGxvYWQgZmlybXdhcmUgdG8gYSBydW5uaW5nIE5JQy5cbiIsIAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlsb2NhbGN0cmwgPSByZWFkbCgmcmVncy0+TG9jYWxDdHJsKTsKKwl3cml0ZWwoMCwgJnJlZ3MtPkxvY2FsQ3RybCk7CisKKwl3cml0ZWwoMCwgJnJlZ3MtPkV2dFByZCk7CisJd3JpdGVsKDAsICZyZWdzLT5SeFByZCk7CisJd3JpdGVsKDAsICZyZWdzLT5UeFByZCk7CisKKwkvKgorCSAqIEZpcnN0IHdpcGUgdGhlIGVudGlyZSBTUkFNLCBvdGhlcndpc2Ugd2UgbWlnaHQgcnVuIGludG8gYWxsCisJICoga2luZHMgb2YgdHJvdWJsZSAuLi4gc2lnaCwgdGhpcyB0b29rIGFsbW9zdCBhbGwgYWZ0ZXJub29uCisJICogdG8gdHJhY2sgZG93biA7LSgKKwkgKi8KKwlpbyA9IHJlYWRsKCZyZWdzLT5FeHRJbyk7CisJd3JpdGVsKDAsICZyZWdzLT5FeHRJbyk7CisJc3JhbV9zaXplID0gcnJfcmVhZF9lZXByb21fd29yZChycnByaXYsICh2b2lkICopOCk7CisKKwlmb3IgKGkgPSAyMDA7IGkgPCBzcmFtX3NpemUgLyA0OyBpKyspeworCQl3cml0ZWwoaSAqIDQsICZyZWdzLT5XaW5CYXNlKTsKKwkJbWIoKTsKKwkJd3JpdGVsKDAsICZyZWdzLT5XaW5EYXRhKTsKKwkJbWIoKTsKKwl9CisJd3JpdGVsKGlvLCAmcmVncy0+RXh0SW8pOworCW1iKCk7CisKKwllcHRyID0gKHVuc2lnbmVkIGxvbmcpcnJfcmVhZF9lZXByb21fd29yZChycnByaXYsCisJCQkJCSAgICAgICAmaHctPnJuY2RfaW5mby5BZGRyUnVuQ29kZVNlZ3MpOworCWVwdHIgPSAoKGVwdHIgJiAweDFmZmZmZikgPj4gMyk7CisKKwlwMmxlbiA9IHJyX3JlYWRfZWVwcm9tX3dvcmQocnJwcml2LCAodm9pZCAqKSgweDgzKjQpKTsKKwlwMmxlbiA9IChwMmxlbiA8PCAyKTsKKwlwMnNpemUgPSBycl9yZWFkX2VlcHJvbV93b3JkKHJycHJpdiwgKHZvaWQgKikoMHg4NCo0KSk7CisJcDJzaXplID0gKChwMnNpemUgJiAweDFmZmZmZikgPj4gMyk7CisKKwlpZiAoKGVwdHIgPCBwMnNpemUpIHx8IChlcHRyID4gKHAyc2l6ZSArIHAybGVuKSkpeworCQlwcmludGsoIiVzOiBlcHRyIGlzIGludmFsaWRcbiIsIGRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCXJldmlzaW9uID0gcnJfcmVhZF9lZXByb21fd29yZChycnByaXYsICZody0+bWFuZi5IZWFkZXJGbXQpOworCisJaWYgKHJldmlzaW9uICE9IDEpeworCQlwcmludGsoIiVzOiBpbnZhbGlkIGZpcm13YXJlIGZvcm1hdCAoJWkpXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCByZXZpc2lvbik7CisJCWdvdG8gb3V0OworCX0KKworCW5yX3NlZyA9IHJyX3JlYWRfZWVwcm9tX3dvcmQocnJwcml2LCAodm9pZCAqKWVwdHIpOworCWVwdHIgKz00OworI2lmIChERUJVRyA+IDEpCisJcHJpbnRrKCIlczogbnJfc2VnICVpXG4iLCBkZXYtPm5hbWUsIG5yX3NlZyk7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBucl9zZWc7IGkrKyl7CisJCXNwdHIgPSBycl9yZWFkX2VlcHJvbV93b3JkKHJycHJpdiwgKHZvaWQgKillcHRyKTsKKwkJZXB0ciArPSA0OworCQlsZW4gPSBycl9yZWFkX2VlcHJvbV93b3JkKHJycHJpdiwgKHZvaWQgKillcHRyKTsKKwkJZXB0ciArPSA0OworCQlzZWdwdHIgPSAodW5zaWduZWQgbG9uZylycl9yZWFkX2VlcHJvbV93b3JkKHJycHJpdiwgKHZvaWQgKillcHRyKTsKKwkJc2VncHRyID0gKChzZWdwdHIgJiAweDFmZmZmZikgPj4gMyk7CisJCWVwdHIgKz0gNDsKKyNpZiAoREVCVUcgPiAxKQorCQlwcmludGsoIiVzOiBzZWdtZW50ICVpLCBzcmFtIGFkZHJlc3MgJTA2eCwgbGVuZ3RoICUwNHgsIHNlZ3B0ciAlMDZ4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBpLCBzcHRyLCBsZW4sIHNlZ3B0cik7CisjZW5kaWYKKwkJZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKXsKKwkJCXRtcCA9IHJyX3JlYWRfZWVwcm9tX3dvcmQocnJwcml2LCAodm9pZCAqKXNlZ3B0cik7CisJCQl3cml0ZWwoc3B0ciwgJnJlZ3MtPldpbkJhc2UpOworCQkJbWIoKTsKKwkJCXdyaXRlbCh0bXAsICZyZWdzLT5XaW5EYXRhKTsKKwkJCW1iKCk7CisJCQlzZWdwdHIgKz0gNDsKKwkJCXNwdHIgKz0gNDsKKwkJfQorCX0KKworb3V0OgorCXdyaXRlbChsb2NhbGN0cmwsICZyZWdzLT5Mb2NhbEN0cmwpOworCW1iKCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBycl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBycl9wcml2YXRlICpycnByaXY7CisJdW5zaWduZWQgY2hhciAqaW1hZ2UsICpvbGRpbWFnZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpOworCWludCBlcnJvciA9IC1FT1BOT1RTVVBQOworCisJcnJwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXN3aXRjaChjbWQpeworCWNhc2UgU0lPQ1JSR0ZXOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpeworCQkJcmV0dXJuIC1FUEVSTTsKKwkJfQorCisJCWltYWdlID0ga21hbGxvYyhFRVBST01fV09SRFMgKiBzaXplb2YodTMyKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaW1hZ2UpeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSAiCisJCQkgICAgICAgImZvciBFRVBST00gaW1hZ2VcbiIsIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisKKwkJaWYgKHJycHJpdi0+ZndfcnVubmluZyl7CisJCQlwcmludGsoIiVzOiBGaXJtd2FyZSBhbHJlYWR5IHJ1bm5pbmdcbiIsIGRldi0+bmFtZSk7CisJCQllcnJvciA9IC1FUEVSTTsKKwkJCWdvdG8gZ2Zfb3V0OworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJycHJpdi0+bG9jaywgZmxhZ3MpOworCQlpID0gcnJfcmVhZF9lZXByb20ocnJwcml2LCAwLCBpbWFnZSwgRUVQUk9NX0JZVEVTKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnJwcml2LT5sb2NrLCBmbGFncyk7CisJCWlmIChpICE9IEVFUFJPTV9CWVRFUyl7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciByZWFkaW5nIEVFUFJPTVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJZXJyb3IgPSAtRUZBVUxUOworCQkJZ290byBnZl9vdXQ7CisJCX0KKwkJZXJyb3IgPSBjb3B5X3RvX3VzZXIocnEtPmlmcl9kYXRhLCBpbWFnZSwgRUVQUk9NX0JZVEVTKTsKKwkJaWYgKGVycm9yKQorCQkJZXJyb3IgPSAtRUZBVUxUOworCWdmX291dDoKKwkJa2ZyZWUoaW1hZ2UpOworCQlyZXR1cm4gZXJyb3I7CisJCQorCWNhc2UgU0lPQ1JSUEZXOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpeworCQkJcmV0dXJuIC1FUEVSTTsKKwkJfQorCisJCWltYWdlID0ga21hbGxvYyhFRVBST01fV09SRFMgKiBzaXplb2YodTMyKSwgR0ZQX0tFUk5FTCk7CisJCW9sZGltYWdlID0ga21hbGxvYyhFRVBST01fV09SRFMgKiBzaXplb2YodTMyKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaW1hZ2UgfHwgIW9sZGltYWdlKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5ICIKKwkJCSAgICAgICAiZm9yIEVFUFJPTSBpbWFnZVxuIiwgZGV2LT5uYW1lKTsKKwkJCWVycm9yID0gLUVOT01FTTsKKwkJCWdvdG8gd2Zfb3V0OworCQl9CisKKwkJZXJyb3IgPSBjb3B5X2Zyb21fdXNlcihpbWFnZSwgcnEtPmlmcl9kYXRhLCBFRVBST01fQllURVMpOworCQlpZiAoZXJyb3IpIHsKKwkJCWVycm9yID0gLUVGQVVMVDsKKwkJCWdvdG8gd2Zfb3V0OworCQl9CisKKwkJaWYgKHJycHJpdi0+ZndfcnVubmluZyl7CisJCQlwcmludGsoIiVzOiBGaXJtd2FyZSBhbHJlYWR5IHJ1bm5pbmdcbiIsIGRldi0+bmFtZSk7CisJCQllcnJvciA9IC1FUEVSTTsKKwkJCWdvdG8gd2Zfb3V0OworCQl9CisKKwkJcHJpbnRrKCIlczogVXBkYXRpbmcgRUVQUk9NIGZpcm13YXJlXG4iLCBkZXYtPm5hbWUpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZycnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJZXJyb3IgPSB3cml0ZV9lZXByb20ocnJwcml2LCAwLCBpbWFnZSwgRUVQUk9NX0JZVEVTKTsKKwkJaWYgKGVycm9yKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3Igd3JpdGluZyBFRVBST01cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKworCQlpID0gcnJfcmVhZF9lZXByb20ocnJwcml2LCAwLCBvbGRpbWFnZSwgRUVQUk9NX0JZVEVTKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnJwcml2LT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKGkgIT0gRUVQUk9NX0JZVEVTKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgcmVhZGluZyBiYWNrIEVFUFJPTSAiCisJCQkgICAgICAgImltYWdlXG4iLCBkZXYtPm5hbWUpOworCisJCWVycm9yID0gbWVtY21wKGltYWdlLCBvbGRpbWFnZSwgRUVQUk9NX0JZVEVTKTsKKwkJaWYgKGVycm9yKXsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIHZlcmlmeWluZyBFRVBST00gaW1hZ2VcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWVycm9yID0gLUVGQVVMVDsKKwkJfQorCXdmX291dDoKKwkJaWYgKG9sZGltYWdlKQorCQkJa2ZyZWUob2xkaW1hZ2UpOworCQlpZiAoaW1hZ2UpCisJCQlrZnJlZShpbWFnZSk7CisJCXJldHVybiBlcnJvcjsKKwkJCisJY2FzZSBTSU9DUlJJRDoKKwkJcmV0dXJuIHB1dF91c2VyKDB4NTI1MjMwMzIsIChpbnQgX191c2VyICopcnEtPmlmcl9kYXRhKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZXJyb3I7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcnJfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9FU1NFTlRJQUwsIFBDSV9ERVZJQ0VfSURfRVNTRU5USUFMX1JPQURSVU5ORVIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyAwLH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcnJfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBycl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInJydW5uZXIiLAorCS5pZF90YWJsZQk9IHJyX3BjaV90YmwsCisJLnByb2JlCQk9IHJyX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocnJfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBycl9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnJyX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBycl9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcnJfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQocnJfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQocnJfY2xlYW51cF9tb2R1bGUpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1EX19LRVJORUxfXyAtSS4uLy4uL2luY2x1ZGUgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzIgLXBpcGUgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1zdHJlbmd0aC1yZWR1Y2UgLW00ODYgLW1hbGlnbi1sb29wcz0yIC1tYWxpZ24tanVtcHM9MiAtbWFsaWduLWZ1bmN0aW9ucz0yIC1ETU9EVUxFIC1ETU9EVkVSU0lPTlMgLWluY2x1ZGUgLi4vLi4vaW5jbHVkZS9saW51eC9tb2R2ZXJzaW9ucy5oIC1jIHJydW5uZXIuYyIKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcnJ1bm5lci5oIGIvZHJpdmVycy9uZXQvcnJ1bm5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYmFhZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ycnVubmVyLmgKQEAgLTAsMCArMSw4NDggQEAKKyNpZm5kZWYgX1JSVU5ORVJfSF8KKyNkZWZpbmUgX1JSVU5ORVJfSF8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaWYgKChCSVRTX1BFUl9MT05HICE9IDMyKSAmJiAoQklUU19QRVJfTE9ORyAhPSA2NCkpCisjZXJyb3IgIkJJVFNfUEVSX0xPTkcgbm90IGRlZmluZWQgb3Igbm90IHZhbGlkIgorI2VuZGlmCisKKworc3RydWN0IHJyX3JlZ3MgeworCisJdTMyCXBhZDBbMTZdOworCisJdTMyCUhvc3RDdHJsOworCXUzMglMb2NhbEN0cmw7CisJdTMyCVBjOworCXUzMglCcmtQdDsKKworLyogVGltZXIgaW5jcmVtZW50cyBldmVyeSAwLjk3IG1pY3JvLXNlY29uZHMgKHVuc2lnbmVkIGludCkgKi8KKwl1MzIJVGltZXJfSGk7CisJdTMyCVRpbWVyOworCXUzMglUaW1lclJlZjsKKwl1MzIJUGNpU3RhdGU7CisKKwl1MzIJRXZlbnQ7CisJdTMyCU1iRXZlbnQ7CisKKwl1MzIJV2luQmFzZTsKKwl1MzIJV2luRGF0YTsKKwl1MzIJUlhfc3RhdGU7CisJdTMyCVRYX3N0YXRlOworCisJdTMyCU92ZXJoZWFkOworCXUzMglFeHRJbzsKKworCXUzMglEbWFXcml0ZUhvc3RIaTsKKwl1MzIJRG1hV3JpdGVIb3N0TG87CisKKwl1MzIJcGFkMVsyXTsKKworCXUzMglEbWFSZWFkSG9zdEhpOworCXUzMglEbWFSZWFkSG9zdExvOworCisJdTMyCXBhZDI7CisKKwl1MzIJRG1hUmVhZExlbjsKKwl1MzIJRG1hV3JpdGVTdGF0ZTsKKworCXUzMglEbWFXcml0ZUxjbDsKKwl1MzIJRG1hV3JpdGVJUGNoZWNrc3VtOworCXUzMglEbWFXcml0ZUxlbjsKKwl1MzIJRG1hUmVhZFN0YXRlOworCXUzMglEbWFSZWFkTGNsOworCXUzMglEbWFSZWFkSVBjaGVja3N1bTsKKwl1MzIJcGFkMzsKKworCXUzMglSeEJhc2U7CisJdTMyCVJ4UHJkOworCXUzMglSeENvbjsKKworCXUzMglwYWQ0OworCisJdTMyCVR4QmFzZTsKKwl1MzIJVHhQcmQ7CisJdTMyCVR4Q29uOworCisJdTMyCXBhZDU7CisKKwl1MzIJUnhJbmRQcm87CisJdTMyCVJ4SW5kQ29uOworCXUzMglSeEluZFJlZjsKKworCXUzMglwYWQ2OworCisJdTMyCVR4SW5kUHJvOworCXUzMglUeEluZENvbjsKKwl1MzIJVHhJbmRSZWY7CisKKwl1MzIJcGFkN1sxN107CisKKwl1MzIJRHJDbW5kUHJvOworCXUzMglEckNtbmRDb247CisJdTMyCURyQ21uZFJlZjsKKworCXUzMglwYWQ4OworCisJdTMyCUR3Q21uZFBybzsKKwl1MzIJRHdDbW5kQ29uOworCXUzMglEd0NtbmRSZWY7CisKKwl1MzIJQXNzaXN0U3RhdGU7CisKKwl1MzIJRHJEYXRhUHJvOworCXUzMglEckRhdGFDb247CisJdTMyCURyRGF0YVJlZjsKKworCXUzMglwYWQ5OworCisJdTMyCUR3RGF0YVBybzsKKwl1MzIJRHdEYXRhQ29uOworCXUzMglEd0RhdGFSZWY7CisKKwl1MzIJcGFkMTBbMzNdOworCisJdTMyCUV2dENvbjsKKworCXUzMglwYWQxMVs1XTsKKworCXUzMglUeFBpOworCXUzMglJcFJ4UGk7CisKKwl1MzIJcGFkMTFhWzhdOworCisJdTMyCUNtZFJpbmdbMTZdOworCisvKiBUaGUgVUxBIGlzIGluIHR3byByZWdpc3RlcnMgdGhlIGhpZ2ggb3JkZXIgdHdvIGJ5dGVzIG9mIHRoZSBmaXJzdAorICogd29yZCBjb250YWluIHRoZSBSdW5Db2RlIGZlYXR1cmVzLgorICogdWxhMAkJcmVzCXJlcwlieXRlMAlieXRlMQorICogdWxhMQkJYnl0ZTIJYnl0ZTMJYnl0ZTQJYnl0ZTUKKyAqLworCXUzMglVbGEwOworCXUzMglVbGExOworCisJdTMyCVJ4UmluZ0hpOworCXUzMglSeFJpbmdMbzsKKworCXUzMglJbmZvUHRySGk7CisJdTMyCUluZm9QdHJMbzsKKworCXUzMglNb2RlOworCisJdTMyCUNvblJldHJ5OworCXUzMglDb25SZXRyeVRtcjsKKworCXUzMglDb25UbW91dDsKKwl1MzIJQ3RhdFRtcjsKKworCXUzMglNYXhSeFJuZzsKKworCXUzMglJbnRyVG1yOworCXUzMglUeERhdGFNdlRpbWVvdXQ7CisJdTMyCVJ4RGF0YU12VGltZW91dDsKKworCXUzMglFdnRQcmQ7CisJdTMyCVRyYWNlSWR4OworCisJdTMyCUZhaWwxOworCXUzMglGYWlsMjsKKworCXUzMglEcnZQcm07CisKKwl1MzIJRmlsdGVyTEE7CisKKwl1MzIJRndSZXY7CisJdTMyCUZ3UmVzMTsKKwl1MzIJRndSZXMyOworCXUzMglGd1JlczM7CisKKwl1MzIJV3JpdGVEbWFUaHJlc2g7CisJdTMyCVJlYWREbWFUaHJlc2g7CisKKwl1MzIJcGFkMTJbMzI1XTsKKwl1MzIJV2luZG93WzUxMl07Cit9OworCisvKgorICogSG9zdCBjb250cm9sIHJlZ2lzdGVyIGJpdHMuCisgKi8KKwkKKyNkZWZpbmUgUlJfSU5UCQkweDAxCisjZGVmaW5lIFJSX0NMRUFSX0lOVAkweDAyCisjZGVmaW5lIE5PX1NXQVAJCTB4MDQwMDAwMDQKKyNkZWZpbmUgTk9fU1dBUDEJMHgwMDAwMDAwNAorI2RlZmluZSBQQ0lfUkVTRVRfTklDCTB4MDgKKyNkZWZpbmUgSEFMVF9OSUMJMHgxMAorI2RlZmluZSBTU1RFUF9OSUMJMHgyMAorI2RlZmluZSBNRU1fUkVBRF9NVUxUSQkweDQwCisjZGVmaW5lIE5JQ19IQUxURUQJMHgxMDAKKyNkZWZpbmUgSEFMVF9JTlNUCTB4MjAwCisjZGVmaW5lIFBBUklUWV9FUlIJMHg0MDAKKyNkZWZpbmUgSU5WQUxJRF9JTlNUX0IJMHg4MDAKKyNkZWZpbmUgUlJfUkVWXzIJMHgyMDAwMDAwMAorI2RlZmluZSBSUl9SRVZfTUFTSwkweGYwMDAwMDAwCisKKy8qCisgKiBMb2NhbCBjb250cm9sIHJlZ2lzdGVyIGJpdHMuCisgKi8KKworI2RlZmluZSBJTlRBX1NUQVRFCQkweDAxCisjZGVmaW5lIENMRUFSX0lOVEEJCTB4MDIKKyNkZWZpbmUgRkFTVF9FRVBST01fQUNDRVNTCTB4MDgKKyNkZWZpbmUgRU5BQkxFX0VYVFJBX1NSQU0JMHgxMDAKKyNkZWZpbmUgRU5BQkxFX0VYVFJBX0RFU0MJMHgyMDAKKyNkZWZpbmUgRU5BQkxFX1BBUklUWQkJMHg0MDAKKyNkZWZpbmUgRk9SQ0VfRE1BX1BBUklUWV9FUlJPUgkweDgwMAorI2RlZmluZSBFTkFCTEVfRUVQUk9NX1dSSVRFCTB4MTAwMAorI2RlZmluZSBFTkFCTEVfREFUQV9DQUNIRQkweDIwMDAKKyNkZWZpbmUgU1JBTV9MT19QQVJJVFlfRVJSCTB4NDAwMAorI2RlZmluZSBTUkFNX0hJX1BBUklUWV9FUlIJMHg4MDAwCisKKy8qCisgKiBQQ0kgc3RhdGUgYml0cy4KKyAqLworCisjZGVmaW5lIEZPUkNFX1BDSV9SRVNFVAkJMHgwMQorI2RlZmluZSBQUk9WSURFX0xFTkdUSAkJMHgwMgorI2RlZmluZSBNQVNLX0RNQV9SRUFEX01BWAkweDFDCisjZGVmaW5lIFJCVVJTVF9ESVNBQkxFCQkweDAwCisjZGVmaW5lIFJCVVJTVF80CQkweDA0CisjZGVmaW5lIFJCVVJTVF8xNgkJMHgwOAorI2RlZmluZSBSQlVSU1RfMzIJCTB4MEMKKyNkZWZpbmUgUkJVUlNUXzY0CQkweDEwCisjZGVmaW5lIFJCVVJTVF8xMjgJCTB4MTQKKyNkZWZpbmUgUkJVUlNUXzI1NgkJMHgxOAorI2RlZmluZSBSQlVSU1RfMTAyNAkJMHgxQworI2RlZmluZSBNQVNLX0RNQV9XUklURV9NQVgJMHhFMAorI2RlZmluZSBXQlVSU1RfRElTQUJMRQkJMHgwMAorI2RlZmluZSBXQlVSU1RfNAkJMHgyMAorI2RlZmluZSBXQlVSU1RfMTYJCTB4NDAKKyNkZWZpbmUgV0JVUlNUXzMyCQkweDYwCisjZGVmaW5lIFdCVVJTVF82NAkJMHg4MAorI2RlZmluZSBXQlVSU1RfMTI4CQkweGEwCisjZGVmaW5lIFdCVVJTVF8yNTYJCTB4YzAKKyNkZWZpbmUgV0JVUlNUXzEwMjQJCTB4ZTAKKyNkZWZpbmUgTUFTS19NSU5fRE1BCQkweEZGMDAKKyNkZWZpbmUgRklGT19SRVRSWV9FTkFCTEUJMHgxMDAwMAorCisvKgorICogRXZlbnQgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIERNQV9XUklURV9ET05FCQkweDEwMDAwCisjZGVmaW5lIERNQV9SRUFEX0RPTkUJCTB4MjAwMDAKKyNkZWZpbmUgRE1BX1dSSVRFX0VSUgkJMHg0MDAwMAorI2RlZmluZSBETUFfUkVBRF9FUlIJCTB4ODAwMDAKKworLyoKKyAqIFJlY2VpdmUgc3RhdGUKKyAqCisgKiBSb2FkUnVubmVyIEhJUFBJIFJlY2VpdmUgU3RhdGUgUmVnaXN0ZXIgY29udHJvbHMgYW5kIG1vbml0b3JzIHRoZSAKKyAqIEhJUFBJIHJlY2VpdmUgaW50ZXJmYWNlIGluIHRoZSBOSUMuIExvb2sgYXQgZXJyIGJpdHMgd2hlbiBhIEhJUFBJCisgKiByZWNlaXZlIEVycm9yIEV2ZW50IG9jY3Vycy4gCisgKi8KKworI2RlZmluZSBFTkFCTEVfTkVXX0NPTgkJMHgwMQorI2RlZmluZSBSRVNFVF9SRUNWCQkweDAyCisjZGVmaW5lIFJFQ1ZfQUxMCQkweDAwCisjZGVmaW5lIFJFQ1ZfMUsJCQkweDIwCisjZGVmaW5lIFJFQ1ZfMksJCQkweDQwCisjZGVmaW5lIFJFQ1ZfNEsJCQkweDYwCisjZGVmaW5lIFJFQ1ZfOEsJCQkweDgwCisjZGVmaW5lIFJFQ1ZfMTZLCQkweGEwCisjZGVmaW5lIFJFQ1ZfMzJLCQkweGMwCisjZGVmaW5lIFJFQ1ZfNjRLCQkweGUwCisKKy8qCisgKiBUcmFuc21pdCBzdGF0dXMuCisgKi8KKworI2RlZmluZSBFTkFfWE1JVAkJMHgwMQorI2RlZmluZSBQRVJNX0NPTgkJMHgwMgorCisvKgorICogRE1BIHdyaXRlIHN0YXRlCisgKi8KKworI2RlZmluZSBSRVNFVF9ETUEJCTB4MDEKKyNkZWZpbmUgTk9fU1dBUF9ETUEJCTB4MDIKKyNkZWZpbmUgRE1BX0FDVElWRQkJMHgwNAorI2RlZmluZSBUSFJFU0hfTUFTSwkJMHgxRgorI2RlZmluZSBETUFfRVJST1JfTUFTSwkJMHhmZjAwMDAwMAorCisvKgorICogR29vZGRpZXMgc3RvcmVkIGluIHRoZSBVTEEgcmVnaXN0ZXJzLgorICovCisKKyNkZWZpbmUgVFJBQ0VfT05fV0hBVF9CSVQJMHgwMDAyMDAwMCAgICAvKiBUcmFjZXMgb24gKi8KKyNkZWZpbmUgT05FTV9CVUZfV0hBVF9CSVQJMHgwMDA0MDAwMCAgICAvKiAxTWVnIHZzIDI1NksgKi8KKyNkZWZpbmUgQ0hBUl9BUElfV0hBVF9CSVQJMHgwMDA4MDAwMCAgICAvKiBDaGFyIEFQSSB2cyBuZXR3b3JrIG9ubHkgKi8KKyNkZWZpbmUgQ01EX0VWVF9XSEFUX0JJVAkweDAwMjAwMDAwICAgIC8qIENvbW1hbmQgZXZlbnQgKi8KKyNkZWZpbmUgTE9OR19UWF9XSEFUX0JJVAkweDAwNDAwMDAwCisjZGVmaW5lIExPTkdfUlhfV0hBVF9CSVQJMHgwMDgwMDAwMAorI2RlZmluZSBXSEFUX0JJVF9NQVNLCQkweEZGRkQwMDAwICAgIC8qIEZlYXR1cmUgYml0IG1hc2sgKi8KKworLyoKKyAqIE1vZGUgc3RhdHVzCisgKi8KKworI2RlZmluZSBFVkVOVF9PVkZMCQkweDgwMDAwMDAwCisjZGVmaW5lIEZBVEFMX0VSUgkJMHg0MDAwMDAwMAorI2RlZmluZSBMT09QX0JBQ0sJCTB4MDEKKyNkZWZpbmUgTU9ERV9QSAkJCTB4MDIKKyNkZWZpbmUgTU9ERV9GUAkJCTB4MDAKKyNkZWZpbmUgUFRSNjRCSVQJCTB4MDQKKyNkZWZpbmUgUFRSMzJCSVQJCTB4MDAKKyNkZWZpbmUgUFRSX1dEX1NXQVAJCTB4MDgKKyNkZWZpbmUgUFRSX1dEX05PU1dBUAkJMHgwMAorI2RlZmluZSBQT1NUX1dBUk5fRVZFTlQJCTB4MTAKKyNkZWZpbmUgRVJSX1RFUk0JCTB4MjAKKyNkZWZpbmUgRElSRUNUX0NPTk4JCTB4NDAKKyNkZWZpbmUgTk9fTklDX1dBVENIRE9HCQkweDgwCisjZGVmaW5lIFNXQVBfREFUQQkJMHgxMDAKKyNkZWZpbmUgU1dBUF9DT05UUk9MCQkweDIwMAorI2RlZmluZSBOSUNfSEFMVF9PTl9FUlIJCTB4NDAwCisjZGVmaW5lIE5JQ19OT19SRVNUQVJUCQkweDgwMAorI2RlZmluZSBIQUxGX0RVUF9UWAkJMHgxMDAwCisjZGVmaW5lIEhBTEZfRFVQX1JYCQkweDIwMDAKKworCisvKgorICogRXJyb3IgY29kZXMKKyAqLworCisvKiBIb3N0IEVycm9yIENvZGVzIC0gdmFsdWVzIG9mIGZhaWwxICovCisjZGVmaW5lIEVSUl9VTktOT1dOX01CT1gJMHgxMDAxCisjZGVmaW5lIEVSUl9VTktOT1dOX0NNRAkJMHgxMDAyCisjZGVmaW5lIEVSUl9NQVhfUklORwkJMHgxMDAzCisjZGVmaW5lIEVSUl9SSU5HX0NMT1NFRAkJMHgxMDA0CisjZGVmaW5lIEVSUl9SSU5HX09QRU4JCTB4MTAwNQorLyogRmlybXdhcmUgaW50ZXJuYWwgZXJyb3JzICovCisjZGVmaW5lIEVSUl9FVkVOVF9SSU5HX0ZVTEwJMHgwMQorI2RlZmluZSBFUlJfRFdfUEVORF9DTU5EX0ZVTEwJMHgwMgorI2RlZmluZSBFUlJfRFJfUEVORF9DTU5EX0ZVTEwJMHgwMworI2RlZmluZSBFUlJfRFdfUEVORF9EQVRBX0ZVTEwJMHgwNAorI2RlZmluZSBFUlJfRFJfUEVORF9EQVRBX0ZVTEwJMHgwNQorI2RlZmluZSBFUlJfSUxMRUdBTF9KVU1QCTB4MDYKKyNkZWZpbmUgRVJSX1VOSU1QTEVNRU5URUQJMHgwNworI2RlZmluZSBFUlJfVFhfSU5GT19GVUxMCTB4MDgKKyNkZWZpbmUgRVJSX1JYX0lORk9fRlVMTAkweDA5CisjZGVmaW5lIEVSUl9JTExFR0FMX01PREUJMHgwQQorI2RlZmluZSBFUlJfTUFJTl9USU1FT1VUCTB4MEIKKyNkZWZpbmUgRVJSX0VWRU5UX0JJVFMJCTB4MEMKKyNkZWZpbmUgRVJSX1VOUEVORF9GVUxMCQkweDBECisjZGVmaW5lIEVSUl9USU1FUl9RVUVVRV9GVUxMCTB4MEUKKyNkZWZpbmUgRVJSX1RJTUVSX1FVRVVFX0VNUFRZCTB4MEYKKyNkZWZpbmUgRVJSX1RJTUVSX05PX0ZSRUUJMHgxMAorI2RlZmluZSBFUlJfSU5UUl9TVEFSVAkJMHgxMQorI2RlZmluZSBFUlJfQkFEX1NUQVJUVVAJCTB4MTIKKyNkZWZpbmUgRVJSX05PX1BLVF9FTkQJCTB4MTMKKyNkZWZpbmUgRVJSX0hBTFRFRF9PTl9FUlIJMHgxNAorLyogSGFyZHdhcmUgTklDIEVycm9ycyAqLworI2RlZmluZSBFUlJfV1JJVEVfRE1BCQkweDAxMDEKKyNkZWZpbmUgRVJSX1JFQURfRE1BCQkweDAxMDIKKyNkZWZpbmUgRVJSX0VYVF9TRVJJQUwJCTB4MDEwMworI2RlZmluZSBFUlJfVFhfSU5UX1BBUklUWQkweDAxMDQKKworCisvKgorICogRXZlbnQgZGVmaW5pdGlvbnMKKyAqLworCisjZGVmaW5lIEVWVF9SSU5HX0VOVFJJRVMJNjQKKyNkZWZpbmUgRVZUX1JJTkdfU0laRQkJKEVWVF9SSU5HX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IGV2ZW50KSkKKworc3RydWN0IGV2ZW50IHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KKwl1MTYgICAgIGluZGV4OworCXU4ICAgICAgcmluZzsKKwl1OCAgICAgIGNvZGU7CisjZWxzZQorCXU4ICAgICAgY29kZTsKKwl1OCAgICAgIHJpbmc7CisJdTE2ICAgICBpbmRleDsKKyNlbmRpZgorCXUzMiAgICAgdGltZXN0YW1wOworfTsKKworLyoKKyAqIEdlbmVyYWwgRXZlbnRzCisgKi8KKworI2RlZmluZSBFX05JQ19VUAkweDAxCisjZGVmaW5lIEVfV0FUQ0hET0cJMHgwMgorCisjZGVmaW5lIEVfU1RBVF9VUEQJMHgwNAorI2RlZmluZSBFX0lOVkFMX0NNRAkweDA1CisjZGVmaW5lIEVfU0VUX0NNRF9DT05TCTB4MDYKKyNkZWZpbmUgRV9MSU5LX09OCTB4MDcKKyNkZWZpbmUgRV9MSU5LX09GRgkweDA4CisjZGVmaW5lIEVfSU5URVJOX0VSUgkweDA5CisjZGVmaW5lIEVfSE9TVF9FUlIJMHgwQQorI2RlZmluZSBFX1NUQVRTX1VQREFURQkweDBCCisjZGVmaW5lIEVfUkVKRUNUSU5HCTB4MEMKKworLyoKKyAqIFNlbmQgIEV2ZW50cworICovCisjZGVmaW5lIEVfQ09OX1JFSgkweDEzCisjZGVmaW5lIEVfQ09OX1RNT1VUCTB4MTQKKyNkZWZpbmUgRV9DT05fTkNfVE1PVVQJMHgxNQkvKiBJICAsIENvbm5lY3Rpb24gTm8gQ2FtcG9uIFRpbWVvdXQgKi8KKyNkZWZpbmUgRV9ESVNDX0VSUgkweDE2CisjZGVmaW5lIEVfSU5UX1BSVFkJMHgxNworI2RlZmluZSBFX1RYX0lETEUJMHgxOAorI2RlZmluZSBFX1RYX0xJTktfRFJPUAkweDE5CisjZGVmaW5lIEVfVFhfSU5WX1JORwkweDFBCisjZGVmaW5lIEVfVFhfSU5WX0JVRgkweDFCCisjZGVmaW5lIEVfVFhfSU5WX0RTQwkweDFDCisKKy8qCisgKiBEZXN0aW5hdGlvbiBFdmVudHMKKyAqLworLyoKKyAqIEdlbmVyYWwgUmVjZWl2ZSBldmVudHMKKyAqLworI2RlZmluZSBFX1ZBTF9STkcJMHgyMAorI2RlZmluZSBFX1JYX1JOR19FTkVSCTB4MjEKKyNkZWZpbmUgRV9JTlZfUk5HCTB4MjIKKyNkZWZpbmUgRV9SWF9STkdfU1BDCTB4MjMKKyNkZWZpbmUgRV9SWF9STkdfT1VUCTB4MjQKKyNkZWZpbmUgRV9QS1RfRElTQ0FSRAkweDI1CisjZGVmaW5lIEVfSU5GT19FVlQJMHgyNworCisvKgorICogRGF0YSBjb3JydXB0ZWQgZXZlbnRzCisgKi8KKyNkZWZpbmUgRV9SWF9QQVJfRVJSCTB4MkIKKyNkZWZpbmUgRV9SWF9MTFJDX0VSUgkweDJDCisjZGVmaW5lIEVfSVBfQ0tTTV9FUlIJMHgyRAorI2RlZmluZSBFX0RUQV9DS1NNX0VSUgkweDJFCisjZGVmaW5lIEVfU0hUX0JTVAkweDJGCisKKy8qCisgKiBEYXRhIGxvc3QgZXZlbnRzCisgKi8KKyNkZWZpbmUgRV9MU1RfTE5LX0VSUgkweDMwCisjZGVmaW5lIEVfRkxHX1NZTl9FUlIJMHgzMQorI2RlZmluZSBFX0ZSTV9FUlIJMHgzMgorI2RlZmluZSBFX1JYX0lETEUJMHgzMworI2RlZmluZSBFX1BLVF9MTl9FUlIJMHgzNAorI2RlZmluZSBFX1NUQVRFX0VSUgkweDM1CisjZGVmaW5lIEVfVU5FWFBfREFUQQkweDNDCisKKy8qCisgKiBGYXRhbCBldmVudHMKKyAqLworI2RlZmluZSBFX1JYX0lOVl9CVUYJMHgzNgorI2RlZmluZSBFX1JYX0lOVl9EU0MJMHgzNworI2RlZmluZSBFX1JOR19CTEsJMHgzOAorCisvKgorICogV2FybmluZyBldmVudHMKKyAqLworI2RlZmluZSBFX1JYX1RPCQkweDM5CisjZGVmaW5lIEVfQkZSX1NQQwkweDNBCisjZGVmaW5lIEVfSU5WX1VMUAkweDNCCisKKyNkZWZpbmUgRV9OT1RfSU1QTEVNRU5URUQgMHg0MAorCisKKy8qCisgKiBDb21tYW5kcworICovCisKKyNkZWZpbmUgQ01EX1JJTkdfRU5UUklFUwkxNgorCitzdHJ1Y3QgY21kIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KKwl1MTYgICAgIGluZGV4OworCXU4ICAgICAgcmluZzsKKwl1OCAgICAgIGNvZGU7CisjZWxzZQorCXU4ICAgICAgY29kZTsKKwl1OCAgICAgIHJpbmc7CisJdTE2ICAgICBpbmRleDsKKyNlbmRpZgorfTsKKworI2RlZmluZSBDX1NUQVJUX0ZXCTB4MDEKKyNkZWZpbmUgQ19VUERfU1RBVAkweDAyCisjZGVmaW5lIENfV0FUQ0hET0cJMHgwNQorI2RlZmluZSBDX0RFTF9STkcJMHgwOQorI2RlZmluZSBDX05FV19STkcJMHgwQQorI2RlZmluZSBDX0NPTk4JCTB4MEQKKworCisvKgorICogTW9kZSBiaXRzCisgKi8KKworI2RlZmluZSAgUEFDS0VUX0JBRAkJMHgwMSAvKiBQYWNrZXQgaGFkIGxpbmstbGF5ZXIgZXJyb3IgKi8KKyNkZWZpbmUgIElOVEVSUlVQVAkJMHgwMgorI2RlZmluZSAgVFhfSVBfQ0tTVU0JCTB4MDQKKyNkZWZpbmUgIFBBQ0tFVF9FTkQJCTB4MDgKKyNkZWZpbmUgIFBBQ0tFVF9TVEFSVAkJMHgxMAorI2RlZmluZSAgU0FNRV9JRklFTEQJCTB4ODAKKworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgKEJJVFNfUEVSX0xPTkcgPT0gNjQpCisJdTY0IGFkZHJsbzsKKyNlbHNlCisJdTMyIGFkZHJoaTsKKwl1MzIgYWRkcmxvOworI2VuZGlmCit9IHJyYWRkcjsKKworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3JyYWRkcihycmFkZHIgKnJhLCBkbWFfYWRkcl90IGFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBiYWRkciA9IGFkZHI7CisjaWYgKEJJVFNfUEVSX0xPTkcgPT0gNjQpCisJcmEtPmFkZHJsbyA9IGJhZGRyOworI2Vsc2UKKyAgICAvKiBEb24ndCBib3RoZXIgc2V0dGluZyB6ZXJvIGV2ZXJ5IHRpbWUgKi8KKwlyYS0+YWRkcmxvID0gYmFkZHI7CisjZW5kaWYKKwltYigpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcnhhZGRyKHN0cnVjdCBycl9yZWdzIF9faW9tZW0gKnJlZ3MsIHZvbGF0aWxlIGRtYV9hZGRyX3QgYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGJhZGRyID0gYWRkcjsKKyNpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkgJiYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJd3JpdGVsKGJhZGRyICYgMHhmZmZmZmZmZiwgJnJlZ3MtPlJ4UmluZ0hpKTsKKwl3cml0ZWwoYmFkZHIgPj4gMzIsICZyZWdzLT5SeFJpbmdMbyk7CisjZWxpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkKKwl3cml0ZWwoYmFkZHIgPj4gMzIsICZyZWdzLT5SeFJpbmdIaSk7CisJd3JpdGVsKGJhZGRyICYgMHhmZmZmZmZmZiwgJnJlZ3MtPlJ4UmluZ0xvKTsKKyNlbHNlCisJd3JpdGVsKDAsICZyZWdzLT5SeFJpbmdIaSk7CisJd3JpdGVsKGJhZGRyLCAmcmVncy0+UnhSaW5nTG8pOworI2VuZGlmCisJbWIoKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2luZm9hZGRyKHN0cnVjdCBycl9yZWdzIF9faW9tZW0gKnJlZ3MsIHZvbGF0aWxlIGRtYV9hZGRyX3QgYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGJhZGRyID0gYWRkcjsKKyNpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkgJiYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJd3JpdGVsKGJhZGRyICYgMHhmZmZmZmZmZiwgJnJlZ3MtPkluZm9QdHJIaSk7CisJd3JpdGVsKGJhZGRyID4+IDMyLCAmcmVncy0+SW5mb1B0ckxvKTsKKyNlbGlmIChCSVRTX1BFUl9MT05HID09IDY0KQorCXdyaXRlbChiYWRkciA+PiAzMiwgJnJlZ3MtPkluZm9QdHJIaSk7CisJd3JpdGVsKGJhZGRyICYgMHhmZmZmZmZmZiwgJnJlZ3MtPkluZm9QdHJMbyk7CisjZWxzZQorCXdyaXRlbCgwLCAmcmVncy0+SW5mb1B0ckhpKTsKKwl3cml0ZWwoYmFkZHIsICZyZWdzLT5JbmZvUHRyTG8pOworI2VuZGlmCisJbWIoKTsKK30KKworCisvKgorICogVFggcmluZworICovCisKKyNpZmRlZiBDT05GSUdfUk9BRFJVTk5FUl9MQVJHRV9SSU5HUworI2RlZmluZSBUWF9SSU5HX0VOVFJJRVMJMzIKKyNlbHNlCisjZGVmaW5lIFRYX1JJTkdfRU5UUklFUwkxNgorI2VuZGlmCisjZGVmaW5lIFRYX1RPVEFMX1NJWkUJKFRYX1JJTkdfRU5UUklFUyAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYykpCisKK3N0cnVjdCB0eF9kZXNjeworCXJyYWRkcglhZGRyOworCXUzMglyZXM7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisJdTE2CXNpemU7CisJdTgJcGFkOworCXU4CW1vZGU7CisjZWxzZQorCXU4CW1vZGU7CisJdTgJcGFkOworCXUxNglzaXplOworI2VuZGlmCit9OworCisKKyNpZmRlZiBDT05GSUdfUk9BRFJVTk5FUl9MQVJHRV9SSU5HUworI2RlZmluZSBSWF9SSU5HX0VOVFJJRVMJMzIKKyNlbHNlCisjZGVmaW5lIFJYX1JJTkdfRU5UUklFUyAxNgorI2VuZGlmCisjZGVmaW5lIFJYX1RPVEFMX1NJWkUJKFJYX1JJTkdfRU5UUklFUyAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYykpCisKK3N0cnVjdCByeF9kZXNjeworCXJyYWRkcglhZGRyOworCXUzMglyZXM7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisJdTE2CXNpemU7CisJdTgJcGFkOworCXU4CW1vZGU7CisjZWxzZQorCXU4CW1vZGU7CisJdTgJcGFkOworCXUxNglzaXplOworI2VuZGlmCit9OworCisKKy8qCisgKiBpb2N0bCdzCisgKi8KKworI2RlZmluZSBTSU9DUlJQRlcJU0lPQ0RFVlBSSVZBVEUJCS8qIHB1dCBmaXJtd2FyZSAqLworI2RlZmluZSBTSU9DUlJHRlcJU0lPQ0RFVlBSSVZBVEUrMQkvKiBnZXQgZmlybXdhcmUgKi8KKyNkZWZpbmUgU0lPQ1JSSUQJU0lPQ0RFVlBSSVZBVEUrMgkvKiBpZGVudGlmeSAqLworCisKK3N0cnVjdCBzZWdfaGRyIHsKKwl1MzIJc2VnX3N0YXJ0OworCXUzMglzZWdfbGVuOworCXUzMglzZWdfZWVzdGFydDsKK307CisKKworI2RlZmluZSBFRVBST01fQkFTRSAweDgwMDAwMDAwCisjZGVmaW5lIEVFUFJPTV9XT1JEUyA4MTkyCisjZGVmaW5lIEVFUFJPTV9CWVRFUyAoRUVQUk9NX1dPUkRTICogc2l6ZW9mKHUzMikpCisKK3N0cnVjdCBlZXByb21fYm9vdCB7CisJdTMyCWtleTE7CisJdTMyCWtleTI7CisJdTMyCXNyYW1fc2l6ZTsKKwlzdHJ1Y3QJc2VnX2hkciBsb2FkZXI7CisJdTMyCWluaXRfY2hrc3VtOworCXUzMglyZXNlcnZlZDE7Cit9OworCitzdHJ1Y3QgZWVwcm9tX21hbmYgeworCXUzMglIZWFkZXJGbXQ7CisJdTMyCUZpcm13YXJlOworCXUzMglCb2FyZFJldmlzaW9uOworCXUzMglSb2FkcnVubmVyUmV2OworCWNoYXIJT3B0aWNzUGFydFs4XTsKKwl1MzIJT3B0aWNzUmV2OworCXUzMglwYWQxOworCWNoYXIJU3JhbVBhcnRbOF07CisJdTMyCVNyYW1SZXY7CisJdTMyCXBhZDI7CisJY2hhcglFZXByb21QYXJ0WzhdOworCXUzMglFZXByb21SZXY7CisJdTMyCUVlcHJvbVNpemU7CisJY2hhcglQYWxQYXJ0WzhdOworCXUzMglQYWxSZXY7CisJdTMyCXBhZDM7CisJY2hhcglQYWxDb2RlRmlsZVsxMl07CisJdTMyCVBhbENvZGVSZXY7CisJY2hhcglCb2FyZFVMQVs4XTsKKwljaGFyCVNlcmlhbE5vWzhdOworCWNoYXIJTWZnRGF0ZVs4XTsKKwljaGFyCU1mZ1RpbWVbOF07CisJY2hhcglNb2RpZnlEYXRlWzhdOworCXUzMglNb2RDb3VudDsKKwl1MzIJcGFkNFsxM107Cit9OworCisKK3N0cnVjdCBlZXByb21fcGhhc2VfaW5mbyB7CisJY2hhcglwaGFzZTFGaWxlWzEyXTsKKwl1MzIJcGhhc2UxUmV2OworCWNoYXIJcGhhc2UxRGF0ZVs4XTsKKwljaGFyCXBoYXNlMkZpbGVbMTJdOworCXUzMglwaGFzZTJSZXY7CisJY2hhcglwaGFzZTJEYXRlWzhdOworCXUzMglyZXNlcnZlZDdbNF07Cit9OworCitzdHJ1Y3QgZWVwcm9tX3JuY2RfaW5mbyB7CisJdTMyCUZ3U3RhcnQ7CisJdTMyCUZ3UmV2OworCWNoYXIJRndEYXRlWzhdOworCXUzMglBZGRyUnVuQ29kZVNlZ3M7CisJdTMyCUZpbGVOYW1lczsKKwljaGFyCUZpbGVbMTNdWzhdOworfTsKKworCisvKiBQaGFzZSAxIHJlZ2lvbiAoc3RhcnRzIGFyZSB3b3JkIG9mZnNldCAweDgwKSAqLworc3RydWN0IHBoYXNlMV9oZHJ7CisJdTMyCWp1bXA7CisJdTMyCW5vb3A7CisJc3RydWN0IHNlZ19oZHIgcGhhc2UyU2VnOworfTsKKworc3RydWN0IGVlcHJvbSB7CisJc3RydWN0IGVlcHJvbV9ib290CWJvb3Q7CisJdTMyCQkJcGFkMVs4XTsKKwlzdHJ1Y3QgZWVwcm9tX21hbmYJbWFuZjsKKwlzdHJ1Y3QgZWVwcm9tX3BoYXNlX2luZm8gcGhhc2VfaW5mbzsKKwlzdHJ1Y3QgZWVwcm9tX3JuY2RfaW5mbwlybmNkX2luZm87CisJdTMyCQkJcGFkMlsxNV07CisJdTMyCQkJaGRyX2NoZWNrc3VtOworCXN0cnVjdCBwaGFzZTFfaGRyCXBoYXNlMTsKK307CisKKworc3RydWN0IHJyX3N0YXRzIHsKKwl1MzIJTmljVGltZVN0YW1wOworCXUzMglSbmdDcmVhdGVkOworCXUzMglSbmdEZWxldGVkOworCXUzMglJbnRyR2VuOworCXUzMglORXZ0T3ZmbDsKKwl1MzIJSW52Q21kOworCXUzMglEbWFSZWFkRXJyczsKKwl1MzIJRG1hV3JpdGVFcnJzOworCXUzMglTdGF0VXBkdFQ7CisJdTMyCVN0YXRVcGR0QzsKKwl1MzIJV2F0Y2hEb2c7CisJdTMyCVRyYWNlOwkKKworCS8qIFNlcmlhbCBISVBQSSAqLworCXUzMglMbmtSZHlFc3Q7CisJdTMyCUdMaW5rRXJyOworCXUzMglBbHRGbGdFcnI7CisJdTMyCU92aGRCaXQ4U3luYzsKKwl1MzIJUm10U2VyUHJ0eUVycjsKKwl1MzIJUm10UGFyUHJ0eUVycjsKKwl1MzIJUm10TG9vcEJrOworCXUzMglwYWQxOworCisJLyogSElQUEkgdHggKi8KKwl1MzIJQ29uRXN0OworCXUzMglDb25SZWpTOworCXUzMglDb25SZXRyeTsKKwl1MzIJQ29uVG1PdXQ7CisJdTMyCVNuZENvbkRpc2NvbjsKKwl1MzIJU25kUGFyRXJyOworCXUzMglQa3RTbnQ7CisJdTMyCXBhZDJbMl07CisJdTMyCVNoRkJzdFNudDsKKwl1NjQJQnl0U2VudDsKKwl1MzIJVHhUaW1lb3V0OworCXUzMglwYWQzWzNdOworCisJLyogSElQUEkgcnggKi8KKwl1MzIJQ29uQWNjOworCXUzMglDb25SZWpkaVBydHk7CisJdTMyCUNvblJlamQ2NGI7CisJdTMyCUNvblJlamRCdWY7CisJdTMyCVJ4Q29uRGlzY29uOworCXUzMglSeENvbk5vRGF0YTsKKwl1MzIJUGt0Ung7CisJdTMyCXBhZDRbMl07CisJdTMyCVNoRkJzdFJ4OworCXU2NAlCeXRSeDsKKwl1MzIJUnhQYXJFcnI7CisJdTMyCVJ4TExSQ2VycjsKKwl1MzIJUnhCc3RTWmVycjsKKwl1MzIJUnhTdGF0ZUVycjsKKwl1MzIJUnhSZHlFcnI7CisJdTMyCVJ4SW52VUxQOworCXUzMglSeFNwY0J1ZjsKKwl1MzIJUnhTcGNEZXNjOworCXUzMglSeFJuZ1NwYzsKKwl1MzIJUnhSbmdGdWxsOworCXUzMglSeFBrdExlbkVycjsKKwl1MzIJUnhDa3NtRXJyOworCXUzMglSeFBrdERycDsKKwl1MzIJUm5nTG93U3BjOworCXUzMglSbmdEYXRhQ2xvc2U7CisJdTMyCVJ4VGltZW91dDsKKwl1MzIJUnhJZGxlOworfTsKKworCisvKgorICogVGhpcyBzdHJ1Y3QgaXMgc2hhcmVkIHdpdGggdGhlIE5JQyBmaXJtd2FyZS4KKyAqLworc3RydWN0IHJpbmdfY3RybCB7CisJcnJhZGRyCXJuZ3B0cjsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KKwl1MTYJZW50cmllczsKKwl1OAlwYWQ7CisJdTgJZW50cnlfc2l6ZTsKKwl1MTYJcGk7CisJdTE2CW1vZGU7CisjZWxzZQorCXU4CWVudHJ5X3NpemU7CisJdTgJcGFkOworCXUxNgllbnRyaWVzOworCXUxNgltb2RlOworCXUxNglwaTsKKyNlbmRpZgorfTsKKworc3RydWN0IHJyX2luZm8geworCXVuaW9uIHsKKwkJc3RydWN0IHJyX3N0YXRzIHN0YXRzOworCQl1MzIgc3RhdGlbMTI4XTsKKwl9IHM7CisJc3RydWN0IHJpbmdfY3RybAlldnRfY3RybDsKKwlzdHJ1Y3QgcmluZ19jdHJsCWNtZF9jdHJsOworCXN0cnVjdCByaW5nX2N0cmwJdHhfY3RybDsKKwl1OAkJCXBhZFs0NjRdOworCXU4CQkJdHJhY2VbMzA3Ml07Cit9OworCisvKgorICogVGhlIGxpbnV4IHN0cnVjdHVyZSBmb3IgdGhlIFJvYWRSdW5uZXIuCisgKgorICogUlgvVFggZGVzY3JpcHRvcnMgYXJlIHB1dCBmaXJzdCB0byBtYWtlIHN1cmUgdGhleSBhcmUgcHJvcGVybHkKKyAqIGFsaWduZWQgYW5kIGRvIG5vdCBjcm9zcyBjYWNoZS1saW5lIGJvdW5kYXJpZXMuCisgKi8KKworc3RydWN0IHJyX3ByaXZhdGUKK3sKKwlzdHJ1Y3QgcnhfZGVzYwkJKnJ4X3Jpbmc7CisJc3RydWN0IHR4X2Rlc2MJCSp0eF9yaW5nOworCXN0cnVjdCBldmVudAkJKmV2dF9yaW5nOworCWRtYV9hZGRyX3QgCQl0eF9yaW5nX2RtYTsKKwlkbWFfYWRkcl90IAkJcnhfcmluZ19kbWE7CisJZG1hX2FkZHJfdCAJCWV2dF9yaW5nX2RtYTsKKwkvKiBBbGlnbm1lbnQgb2sgPyAqLworCXN0cnVjdCBza19idWZmCQkqcnhfc2tidWZmW1JYX1JJTkdfRU5UUklFU107CisJc3RydWN0IHNrX2J1ZmYJCSp0eF9za2J1ZmZbVFhfUklOR19FTlRSSUVTXTsKKwlzdHJ1Y3QgcnJfcmVncwkJX19pb21lbSAqcmVnczsJCS8qIFJlZ2lzdGVyIGJhc2UgKi8KKwlzdHJ1Y3QgcmluZ19jdHJsCSpyeF9jdHJsOwkvKiBSZWNlaXZlIHJpbmcgY29udHJvbCAqLworCXN0cnVjdCBycl9pbmZvCQkqaW5mbzsJCS8qIFNoYXJlZCBpbmZvIHBhZ2UgKi8KKwlkbWFfYWRkcl90IAkJcnhfY3RybF9kbWE7CisJZG1hX2FkZHJfdCAJCWluZm9fZG1hOworCXNwaW5sb2NrX3QJCWxvY2s7CisJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CisJdTMyCQkJY3VyX3J4LCBjdXJfY21kLCBjdXJfZXZ0OworCXUzMgkJCWRpcnR5X3J4LCBkaXJ0eV90eDsKKwl1MzIJCQl0eF9mdWxsOworCXUzMgkJCWZ3X3JldjsKKwl2b2xhdGlsZSBzaG9ydAkJZndfcnVubmluZzsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgcGNpX2RldgkJKnBjaV9kZXY7Cit9OworCisKKy8qCisgKiBQcm90b3R5cGVzCisgKi8KK3N0YXRpYyBpbnQgcnJfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcnJfaW5pdDEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgcnJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCitzdGF0aWMgaW50IHJyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHJyX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHJyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpycl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHJyX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIHVuc2lnbmVkIGludCBycl9yZWFkX2VlcHJvbShzdHJ1Y3QgcnJfcHJpdmF0ZSAqcnJwcml2LAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCSAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGxlbmd0aCk7CitzdGF0aWMgdTMyIHJyX3JlYWRfZWVwcm9tX3dvcmQoc3RydWN0IHJyX3ByaXZhdGUgKnJycHJpdiwgdm9pZCAqIG9mZnNldCk7CitzdGF0aWMgaW50IHJyX2xvYWRfZmlybXdhcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW5saW5lIHZvaWQgcnJfcmF6X3R4KHN0cnVjdCBycl9wcml2YXRlICosIHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGlubGluZSB2b2lkIHJyX3Jhel9yeChzdHJ1Y3QgcnJfcHJpdmF0ZSAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKyNlbmRpZiAvKiBfUlJVTk5FUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvczJpby1yZWdzLmggYi9kcml2ZXJzL25ldC9zMmlvLXJlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDkyY2E2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvczJpby1yZWdzLmgKQEAgLTAsMCArMSw3NzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHJlZ3MuaDogQSBMaW51eCBQQ0ktWCBFdGhlcm5ldCBkcml2ZXIgZm9yIFMySU8gMTBHYkUgU2VydmVyIE5JQworICogQ29weXJpZ2h0KGMpIDIwMDItMjAwNSBOZXRlcmlvbiBJbmMuCisKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKiBEcml2ZXJzIGJhc2VkIG9uIG9yIGRlcml2ZWQgZnJvbSB0aGlzIGNvZGUgZmFsbCB1bmRlciB0aGUgR1BMIGFuZCBtdXN0CisgKiByZXRhaW4gdGhlIGF1dGhvcnNoaXAsIGNvcHlyaWdodCBhbmQgbGljZW5zZSBub3RpY2UuICBUaGlzIGZpbGUgaXMgbm90CisgKiBhIGNvbXBsZXRlIHByb2dyYW0gYW5kIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgZW50aXJlIG9wZXJhdGluZworICogc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuCisgKiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9SRUdTX0gKKyNkZWZpbmUgX1JFR1NfSAorCisjZGVmaW5lIFRCRCAwCisKK3R5cGVkZWYgc3RydWN0IF9YRU5BX2Rldl9jb25maWcgeworLyogQ29udmVudGlvbjogbUhBTF9YWFggaXMgbWFzaywgdkhBTF9YWFggaXMgdmFsdWUgKi8KKworLyogR2VuZXJhbCBDb250cm9sLVN0YXR1cyBSZWdpc3RlcnMgKi8KKwl1NjQgZ2VuZXJhbF9pbnRfc3RhdHVzOworI2RlZmluZSBHRU5fSU5UUl9UWFBJQyAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgR0VOX0lOVFJfVFhETUEgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIEdFTl9JTlRSX1RYTUFDICAgICAgICAgICAgIEJJVCgyKQorI2RlZmluZSBHRU5fSU5UUl9UWFhHWFMgICAgICAgICAgICBCSVQoMykKKyNkZWZpbmUgR0VOX0lOVFJfVFhUUkFGRklDICAgICAgICAgQklUKDgpCisjZGVmaW5lIEdFTl9JTlRSX1JYUElDICAgICAgICAgICAgIEJJVCgzMikKKyNkZWZpbmUgR0VOX0lOVFJfUlhETUEgICAgICAgICAgICAgQklUKDMzKQorI2RlZmluZSBHRU5fSU5UUl9SWE1BQyAgICAgICAgICAgICBCSVQoMzQpCisjZGVmaW5lIEdFTl9JTlRSX01DICAgICAgICAgICAgICAgIEJJVCgzNSkKKyNkZWZpbmUgR0VOX0lOVFJfUlhYR1hTICAgICAgICAgICAgQklUKDM2KQorI2RlZmluZSBHRU5fSU5UUl9SWFRSQUZGSUMgICAgICAgICBCSVQoNDApCisjZGVmaW5lIEdFTl9FUlJPUl9JTlRSICAgICAgICAgICAgIEdFTl9JTlRSX1RYUElDIHwgR0VOX0lOVFJfUlhQSUMgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTl9JTlRSX1RYRE1BIHwgR0VOX0lOVFJfUlhETUEgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTl9JTlRSX1RYTUFDIHwgR0VOX0lOVFJfUlhNQUMgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTl9JTlRSX1RYWEdYU3wgR0VOX0lOVFJfUlhYR1hTfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTl9JTlRSX01DCisKKwl1NjQgZ2VuZXJhbF9pbnRfbWFzazsKKworCXU4IHVudXNlZDBbMHgxMDAgLSAweDEwXTsKKworCXU2NCBzd19yZXNldDsKKy8qIFhHWFMgbXVzdCBiZSByZW1vdmVkIGZyb20gcmVzZXQgb25seSBvbmNlLiAqLworI2RlZmluZSBTV19SRVNFVF9YRU5BICAgICAgICAgICAgICB2QklUKDB4QTUsMCw4KQorI2RlZmluZSBTV19SRVNFVF9GTEFTSCAgICAgICAgICAgICB2QklUKDB4QTUsOCw4KQorI2RlZmluZSBTV19SRVNFVF9FT0kgICAgICAgICAgICAgICB2QklUKDB4QTUsMTYsOCkKKyNkZWZpbmUgU1dfUkVTRVRfQUxMICAgICAgICAgICAgICAgKFNXX1JFU0VUX1hFTkEgICAgIHwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV19SRVNFVF9GTEFTSCAgICB8ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dfUkVTRVRfRU9JKQorLyogVGhlIFNXX1JFU0VUIHJlZ2lzdGVyIG11c3QgcmVhZCB0aGlzIHZhbHVlIGFmdGVyIGEgc3VjY2Vzc2Z1bCByZXNldC4gKi8KKyNkZWZpbmUJU1dfUkVTRVRfUkFXX1ZBTAkJCTB4QTUwMDAwMDAKKworCisJdTY0IGFkYXB0ZXJfc3RhdHVzOworI2RlZmluZSBBREFQVEVSX1NUQVRVU19URE1BX1JFQURZICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBBREFQVEVSX1NUQVRVU19SRE1BX1JFQURZICAgICAgICAgIEJJVCgxKQorI2RlZmluZSBBREFQVEVSX1NUQVRVU19QRkNfUkVBRFkgICAgICAgICAgIEJJVCgyKQorI2RlZmluZSBBREFQVEVSX1NUQVRVU19UTUFDX0JVRl9FTVBUWSAgICAgIEJJVCgzKQorI2RlZmluZSBBREFQVEVSX1NUQVRVU19QSUNfUVVJRVNDRU5UICAgICAgIEJJVCg1KQorI2RlZmluZSBBREFQVEVSX1NUQVRVU19STUFDX1JFTU9URV9GQVVMVCAgIEJJVCg2KQorI2RlZmluZSBBREFQVEVSX1NUQVRVU19STUFDX0xPQ0FMX0ZBVUxUICAgIEJJVCg3KQorI2RlZmluZSBBREFQVEVSX1NUQVRVU19STUFDX1BDQ19JRExFICAgICAgIHZCSVQoMHhGRiw4LDgpCisjZGVmaW5lIEFEQVBURVJfU1RBVFVTX1JDX1BSQ19RVUlFU0NFTlQgICAgdkJJVCgweEZGLDE2LDgpCisjZGVmaW5lIEFEQVBURVJfU1RBVFVTX01DX0RSQU1fUkVBRFkgICAgICAgQklUKDI0KQorI2RlZmluZSBBREFQVEVSX1NUQVRVU19NQ19RVUVVRVNfUkVBRFkgICAgIEJJVCgyNSkKKyNkZWZpbmUgQURBUFRFUl9TVEFUVVNfTV9QTExfTE9DSyAgICAgICAgICBCSVQoMzApCisjZGVmaW5lIEFEQVBURVJfU1RBVFVTX1BfUExMX0xPQ0sgICAgICAgICAgQklUKDMxKQorCisJdTY0IGFkYXB0ZXJfY29udHJvbDsKKyNkZWZpbmUgQURBUFRFUl9DTlRMX0VOICAgICAgICAgICAgICAgICAgICBCSVQoNykKKyNkZWZpbmUgQURBUFRFUl9FT0lfVFhfT04gICAgICAgICAgICAgICAgICBCSVQoMTUpCisjZGVmaW5lIEFEQVBURVJfTEVEX09OICAgICAgICAgICAgICAgICAgICAgQklUKDIzKQorI2RlZmluZSBBREFQVEVSX1VEUEkodmFsKSAgICAgICAgICAgICAgICAgIHZCSVQodmFsLDM2LDQpCisjZGVmaW5lIEFEQVBURVJfV0FJVF9JTlQgICAgICAgICAgICAgICAgICAgQklUKDQ4KQorI2RlZmluZSBBREFQVEVSX0VDQ19FTiAgICAgICAgICAgICAgICAgICAgIEJJVCg1NSkKKworCXU2NCBzZXJyX3NvdXJjZTsKKyNkZWZpbmUgU0VSUl9TT1VSQ0VfUElDCQkJCQlCSVQoMCkKKyNkZWZpbmUgU0VSUl9TT1VSQ0VfVFhETUEJCQkJQklUKDEpCisjZGVmaW5lIFNFUlJfU09VUkNFX1JYRE1BCQkJCUJJVCgyKQorI2RlZmluZSBTRVJSX1NPVVJDRV9NQUMgICAgICAgICAgICAgICAgIEJJVCgzKQorI2RlZmluZSBTRVJSX1NPVVJDRV9NQyAgICAgICAgICAgICAgICAgIEJJVCg0KQorI2RlZmluZSBTRVJSX1NPVVJDRV9YR1hTICAgICAgICAgICAgICAgIEJJVCg1KQorI2RlZmluZQlTRVJSX1NPVVJDRV9BTlkJCQkJCShTRVJSX1NPVVJDRV9QSUMJCXwgXAorCQkJCQkJCQkJCVNFUlJfU09VUkNFX1RYRE1BCXwgXAorCQkJCQkJCQkJCVNFUlJfU09VUkNFX1JYRE1BCXwgXAorCQkJCQkJCQkJCVNFUlJfU09VUkNFX01BQwkJfCBcCisJCQkJCQkJCQkJU0VSUl9TT1VSQ0VfTUMgICAgICB8IFwKKwkJCQkJCQkJCQlTRVJSX1NPVVJDRV9YR1hTKQorCisKKwl1OCB1bnVzZWRfMFsweDgwMCAtIDB4MTIwXTsKKworLyogUENJLVggQ29udHJvbGxlciByZWdpc3RlcnMgKi8KKwl1NjQgcGljX2ludF9zdGF0dXM7CisJdTY0IHBpY19pbnRfbWFzazsKKyNkZWZpbmUgUElDX0lOVF9UWCAgICAgICAgICAgICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBQSUNfSU5UX0ZMU0ggICAgICAgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIFBJQ19JTlRfTURJTyAgICAgICAgICAgICAgICAgICBCSVQoMikKKyNkZWZpbmUgUElDX0lOVF9JSUMgICAgICAgICAgICAgICAgICAgIEJJVCgzKQorI2RlZmluZSBQSUNfSU5UX0dQSU8gICAgICAgICAgICAgICAgICAgQklUKDQpCisjZGVmaW5lIFBJQ19JTlRfUlggICAgICAgICAgICAgICAgICAgICBCSVQoMzIpCisKKwl1NjQgdHhwaWNfaW50X3JlZzsKKwl1NjQgdHhwaWNfaW50X21hc2s7CisjZGVmaW5lIFBDSVhfSU5UX1JFR19FQ0NfU0dfRVJSICAgICAgICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBQQ0lYX0lOVF9SRUdfRUNDX0RCX0VSUiAgICAgICAgICAgICAgICBCSVQoMSkKKyNkZWZpbmUgUENJWF9JTlRfUkVHX0ZMQVNIUl9SX0ZTTV9FUlIgICAgICAgICAgQklUKDgpCisjZGVmaW5lIFBDSVhfSU5UX1JFR19GTEFTSFJfV19GU01fRVJSICAgICAgICAgIEJJVCg5KQorI2RlZmluZSBQQ0lYX0lOVF9SRUdfSU5JX1RYX0ZTTV9TRVJSICAgICAgICAgICBCSVQoMTApCisjZGVmaW5lIFBDSVhfSU5UX1JFR19JTklfVFhPX0ZTTV9FUlIgICAgICAgICAgIEJJVCgxMSkKKyNkZWZpbmUgUENJWF9JTlRfUkVHX1RSVF9GU01fU0VSUiAgICAgICAgICAgICAgQklUKDEzKQorI2RlZmluZSBQQ0lYX0lOVF9SRUdfU1JUX0ZTTV9TRVJSICAgICAgICAgICAgICBCSVQoMTQpCisjZGVmaW5lIFBDSVhfSU5UX1JFR19QSUZSX0ZTTV9TRVJSICAgICAgICAgICAgIEJJVCgxNSkKKyNkZWZpbmUgUENJWF9JTlRfUkVHX1dSQ19UWF9TRU5EX0ZTTV9TRVJSICAgICAgQklUKDIxKQorI2RlZmluZSBQQ0lYX0lOVF9SRUdfUlJDX1RYX1JFUV9GU01fU0VSUiAgICAgICBCSVQoMjMpCisjZGVmaW5lIFBDSVhfSU5UX1JFR19JTklfUlhfRlNNX1NFUlIgICAgICAgICAgIEJJVCg0OCkKKyNkZWZpbmUgUENJWF9JTlRfUkVHX1JBX1JYX0ZTTV9TRVJSICAgICAgICAgICAgQklUKDUwKQorLyoKKyNkZWZpbmUgUENJWF9JTlRfUkVHX1dSQ19SWF9TRU5EX0ZTTV9TRVJSICAgICAgQklUKDUyKQorI2RlZmluZSBQQ0lYX0lOVF9SRUdfUlJDX1JYX1JFUV9GU01fU0VSUiAgICAgICBCSVQoNTQpCisjZGVmaW5lIFBDSVhfSU5UX1JFR19SUkNfUlhfU1BMSVRfRlNNX1NFUlIgICAgIEJJVCg1OCkKKyovCisJdTY0IHR4cGljX2FsYXJtczsKKwl1NjQgcnhwaWNfaW50X3JlZzsKKwl1NjQgcnhwaWNfaW50X21hc2s7CisJdTY0IHJ4cGljX2FsYXJtczsKKworCXU2NCBmbHNoX2ludF9yZWc7CisJdTY0IGZsc2hfaW50X21hc2s7CisjZGVmaW5lIFBJQ19GTFNIX0lOVF9SRUdfQ1lDTEVfRlNNX0VSUiAgICAgICAgIEJJVCg2MykKKyNkZWZpbmUgUElDX0ZMU0hfSU5UX1JFR19FUlIgICAgICAgICAgICAgICAgICAgQklUKDYyKQorCXU2NCBmbGFzaF9hbGFybXM7CisKKwl1NjQgbWRpb19pbnRfcmVnOworCXU2NCBtZGlvX2ludF9tYXNrOworI2RlZmluZSBNRElPX0lOVF9SRUdfTURJT19CVVNfRVJSICAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgTURJT19JTlRfUkVHX0RUWF9CVVNfRVJSICAgICAgICAgICAgICAgQklUKDgpCisjZGVmaW5lIE1ESU9fSU5UX1JFR19MQVNJICAgICAgICAgICAgICAgICAgICAgIEJJVCgzOSkKKwl1NjQgbWRpb19hbGFybXM7CisKKwl1NjQgaWljX2ludF9yZWc7CisJdTY0IGlpY19pbnRfbWFzazsKKyNkZWZpbmUgSUlDX0lOVF9SRUdfQlVTX0ZTTV9FUlIgICAgICAgICAgICAgICAgQklUKDQpCisjZGVmaW5lIElJQ19JTlRfUkVHX0JJVF9GU01fRVJSICAgICAgICAgICAgICAgIEJJVCg1KQorI2RlZmluZSBJSUNfSU5UX1JFR19DWUNMRV9GU01fRVJSICAgICAgICAgICAgICBCSVQoNikKKyNkZWZpbmUgSUlDX0lOVF9SRUdfUkVRX0ZTTV9FUlIgICAgICAgICAgICAgICAgQklUKDcpCisjZGVmaW5lIElJQ19JTlRfUkVHX0FDS19FUlIgICAgICAgICAgICAgICAgICAgIEJJVCg4KQorCXU2NCBpaWNfYWxhcm1zOworCisJdTggdW51c2VkNFsweDA4XTsKKworCXU2NCBncGlvX2ludF9yZWc7CisJdTY0IGdwaW9faW50X21hc2s7CisJdTY0IGdwaW9fYWxhcm1zOworCisJdTggdW51c2VkNVsweDM4XTsKKworCXU2NCB0eF90cmFmZmljX2ludDsKKyNkZWZpbmUgVFhfVFJBRkZJQ19JTlRfbihuKSAgICAgICAgICAgICAgICAgICAgQklUKG4pCisJdTY0IHR4X3RyYWZmaWNfbWFzazsKKworCXU2NCByeF90cmFmZmljX2ludDsKKyNkZWZpbmUgUlhfVFJBRkZJQ19JTlRfbihuKSAgICAgICAgICAgICAgICAgICAgQklUKG4pCisJdTY0IHJ4X3RyYWZmaWNfbWFzazsKKworLyogUElDIENvbnRyb2wgcmVnaXN0ZXJzICovCisJdTY0IHBpY19jb250cm9sOworI2RlZmluZSBQSUNfQ05UTF9SWF9BTEFSTV9NQVBfMSAgICAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgUElDX0NOVExfU0hBUkVEX1NQTElUUyhuKSAgICAgICAgICAgICAgdkJJVChuLDExLDQpCisKKwl1NjQgc3dhcHBlcl9jdHJsOworI2RlZmluZSBTV0FQUEVSX0NUUkxfUElGX1JfRkUgICAgICAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1BJRl9SX1NFICAgICAgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIFNXQVBQRVJfQ1RSTF9QSUZfV19GRSAgICAgICAgICAgICAgICAgIEJJVCg4KQorI2RlZmluZSBTV0FQUEVSX0NUUkxfUElGX1dfU0UgICAgICAgICAgICAgICAgICBCSVQoOSkKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1RYUF9GRSAgICAgICAgICAgICAgICAgICAgQklUKDE2KQorI2RlZmluZSBTV0FQUEVSX0NUUkxfVFhQX1NFICAgICAgICAgICAgICAgICAgICBCSVQoMTcpCisjZGVmaW5lIFNXQVBQRVJfQ1RSTF9UWERfUl9GRSAgICAgICAgICAgICAgICAgIEJJVCgxOCkKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1RYRF9SX1NFICAgICAgICAgICAgICAgICAgQklUKDE5KQorI2RlZmluZSBTV0FQUEVSX0NUUkxfVFhEX1dfRkUgICAgICAgICAgICAgICAgICBCSVQoMjApCisjZGVmaW5lIFNXQVBQRVJfQ1RSTF9UWERfV19TRSAgICAgICAgICAgICAgICAgIEJJVCgyMSkKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1RYRl9SX0ZFICAgICAgICAgICAgICAgICAgQklUKDIyKQorI2RlZmluZSBTV0FQUEVSX0NUUkxfVFhGX1JfU0UgICAgICAgICAgICAgICAgICBCSVQoMjMpCisjZGVmaW5lIFNXQVBQRVJfQ1RSTF9SWERfUl9GRSAgICAgICAgICAgICAgICAgIEJJVCgzMikKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1JYRF9SX1NFICAgICAgICAgICAgICAgICAgQklUKDMzKQorI2RlZmluZSBTV0FQUEVSX0NUUkxfUlhEX1dfRkUgICAgICAgICAgICAgICAgICBCSVQoMzQpCisjZGVmaW5lIFNXQVBQRVJfQ1RSTF9SWERfV19TRSAgICAgICAgICAgICAgICAgIEJJVCgzNSkKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1JYRl9XX0ZFICAgICAgICAgICAgICAgICAgQklUKDM2KQorI2RlZmluZSBTV0FQUEVSX0NUUkxfUlhGX1dfU0UgICAgICAgICAgICAgICAgICBCSVQoMzcpCisjZGVmaW5lIFNXQVBQRVJfQ1RSTF9YTVNJX0ZFICAgICAgICAgICAgICAgICAgIEJJVCg0MCkKKyNkZWZpbmUgU1dBUFBFUl9DVFJMX1hNU0lfU0UgICAgICAgICAgICAgICAgICAgQklUKDQxKQorI2RlZmluZSBTV0FQUEVSX0NUUkxfU1RBVFNfRkUgICAgICAgICAgICAgICAgICBCSVQoNDgpCisjZGVmaW5lIFNXQVBQRVJfQ1RSTF9TVEFUU19TRSAgICAgICAgICAgICAgICAgIEJJVCg0OSkKKworCXU2NCBwaWZfcmRfc3dhcHBlcl9mYjsKKyNkZWZpbmUgSUZfUkRfU1dBUFBFUl9GQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMjM0NTY3ODlBQkNERUYKKworCXU2NCBzY2hlZHVsZWRfaW50X2N0cmw7CisjZGVmaW5lIFNDSEVEX0lOVF9DVFJMX1RJTUVSX0VOICAgICAgICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBTQ0hFRF9JTlRfQ1RSTF9PTkVfU0hPVCAgICAgICAgICAgICAgICBCSVQoMSkKKyNkZWZpbmUgU0NIRURfSU5UX0NUUkxfSU5UMk1TSSAgICAgICAgICAgICAgICAgVEJECisjZGVmaW5lIFNDSEVEX0lOVF9QRVJJT0QgICAgICAgICAgICAgICAgICAgICAgIFRCRAorCisJdTY0IHR4cmVxdGltZW91dDsKKyNkZWZpbmUgVFhSRVFUT19WQUwodmFsKQkJCQkJCXZCSVQodmFsLDAsMzIpCisjZGVmaW5lIFRYUkVRVE9fRU4JCQkJCQkJCUJJVCg2MykKKworCXU2NCBzdGF0c3JlcXRpbWVvdXQ7CisjZGVmaW5lIFNUQVRSRVFUT19WQUwobikgICAgICAgICAgICAgICAgICAgICAgIFRCRAorI2RlZmluZSBTVEFUUkVRVE9fRU4gICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoNjMpCisKKwl1NjQgcmVhZF9yZXRyeV9kZWxheTsKKwl1NjQgcmVhZF9yZXRyeV9hY2NlbGVyYXRpb247CisJdTY0IHdyaXRlX3JldHJ5X2RlbGF5OworCXU2NCB3cml0ZV9yZXRyeV9hY2NlbGVyYXRpb247CisKKwl1NjQgeG1zaV9jb250cm9sOworCXU2NCB4bXNpX2FjY2VzczsKKwl1NjQgeG1zaV9hZGRyZXNzOworCXU2NCB4bXNpX2RhdGE7CisKKwl1NjQgcnhfbWF0OworCisJdTggdW51c2VkNlsweDhdOworCisJdTY0IHR4X21hdDBfNzsKKwl1NjQgdHhfbWF0OF8xNTsKKwl1NjQgdHhfbWF0MTZfMjM7CisJdTY0IHR4X21hdDI0XzMxOworCXU2NCB0eF9tYXQzMl8zOTsKKwl1NjQgdHhfbWF0NDBfNDc7CisJdTY0IHR4X21hdDQ4XzU1OworCXU2NCB0eF9tYXQ1Nl82MzsKKworCXU4IHVudXNlZF8xWzB4MTBdOworCisJLyogQXV0b21hdGVkIHN0YXRpc3RpY3MgY29sbGVjdGlvbiAqLworCXU2NCBzdGF0X2NmZzsKKyNkZWZpbmUgU1RBVF9DRkdfU1RBVF9FTiAgICAgICAgICAgQklUKDApCisjZGVmaW5lIFNUQVRfQ0ZHX09ORV9TSE9UX0VOICAgICAgIEJJVCgxKQorI2RlZmluZSBTVEFUX0NGR19TVEFUX05TX0VOICAgICAgICBCSVQoOCkKKyNkZWZpbmUgU1RBVF9DRkdfU1RBVF9STyAgICAgICAgICAgQklUKDkpCisjZGVmaW5lIFNUQVRfVFJTRl9QRVIobikgICAgICAgICAgIFRCRAorI2RlZmluZQlQRVJfU0VDCQkJCQkgICAweDIwOGQ1CisjZGVmaW5lCVNFVF9VUERUX1BFUklPRChuKQkJICAgdkJJVCgoUEVSX1NFQypuKSwzMiwzMikKKworCXU2NCBzdGF0X2FkZHI7CisKKwkvKiBHZW5lcmFsIENvbmZpZ3VyYXRpb24gKi8KKwl1NjQgbWRpb19jb250cm9sOworCisJdTY0IGR0eF9jb250cm9sOworCisJdTY0IGkyY19jb250cm9sOworI2RlZmluZQlJMkNfQ09OVFJPTF9ERVZfSUQoaWQpCQl2QklUKGlkLDEsMykKKyNkZWZpbmUJSTJDX0NPTlRST0xfQUREUihhZGRyKQkJdkJJVChhZGRyLDUsMTEpCisjZGVmaW5lCUkyQ19DT05UUk9MX0JZVEVfQ05UKGNudCkJdkJJVChjbnQsMjIsMikKKyNkZWZpbmUJSTJDX0NPTlRST0xfUkVBRAkJCUJJVCgyNCkKKyNkZWZpbmUJSTJDX0NPTlRST0xfTkFDSwkJCUJJVCgyNSkKKyNkZWZpbmUJSTJDX0NPTlRST0xfQ05UTF9TVEFSVAkJdkJJVCgweEUsMjgsNCkKKyNkZWZpbmUJSTJDX0NPTlRST0xfQ05UTF9FTkQodmFsKQkodmFsICYgdkJJVCgweDEsMjgsNCkpCisjZGVmaW5lCUkyQ19DT05UUk9MX0dFVF9EQVRBKHZhbCkJKHUzMikodmFsICYgMHhGRkZGRkZGRikKKyNkZWZpbmUJSTJDX0NPTlRST0xfU0VUX0RBVEEodmFsKQl2QklUKHZhbCwzMiwzMikKKworCXU2NCBncGlvX2NvbnRyb2w7CisjZGVmaW5lIEdQSU9fQ1RSTF9HUElPXzAJCUJJVCg4KQorCisJdTggdW51c2VkN1sweDYwMF07CisKKy8qIFR4RE1BIHJlZ2lzdGVycyAqLworCXU2NCB0eGRtYV9pbnRfc3RhdHVzOworCXU2NCB0eGRtYV9pbnRfbWFzazsKKyNkZWZpbmUgVFhETUFfUEZDX0lOVCAgICAgICAgICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBUWERNQV9UREFfSU5UICAgICAgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIFRYRE1BX1BDQ19JTlQgICAgICAgICAgICAgICAgICBCSVQoMikKKyNkZWZpbmUgVFhETUFfVFRJX0lOVCAgICAgICAgICAgICAgICAgIEJJVCgzKQorI2RlZmluZSBUWERNQV9MU09fSU5UICAgICAgICAgICAgICAgICAgQklUKDQpCisjZGVmaW5lIFRYRE1BX1RQQV9JTlQgICAgICAgICAgICAgICAgICBCSVQoNSkKKyNkZWZpbmUgVFhETUFfU01fSU5UICAgICAgICAgICAgICAgICAgIEJJVCg2KQorCXU2NCBwZmNfZXJyX3JlZzsKKwl1NjQgcGZjX2Vycl9tYXNrOworCXU2NCBwZmNfZXJyX2FsYXJtOworCisJdTY0IHRkYV9lcnJfcmVnOworCXU2NCB0ZGFfZXJyX21hc2s7CisJdTY0IHRkYV9lcnJfYWxhcm07CisKKwl1NjQgcGNjX2Vycl9yZWc7CisjZGVmaW5lIFBDQ19GQl9FQ0NfREJfRVJSCQl2QklUKDB4RkYsIDE2LCA4KQorCisJdTY0IHBjY19lcnJfbWFzazsKKwl1NjQgcGNjX2Vycl9hbGFybTsKKworCXU2NCB0dGlfZXJyX3JlZzsKKwl1NjQgdHRpX2Vycl9tYXNrOworCXU2NCB0dGlfZXJyX2FsYXJtOworCisJdTY0IGxzb19lcnJfcmVnOworCXU2NCBsc29fZXJyX21hc2s7CisJdTY0IGxzb19lcnJfYWxhcm07CisKKwl1NjQgdHBhX2Vycl9yZWc7CisJdTY0IHRwYV9lcnJfbWFzazsKKwl1NjQgdHBhX2Vycl9hbGFybTsKKworCXU2NCBzbV9lcnJfcmVnOworCXU2NCBzbV9lcnJfbWFzazsKKwl1NjQgc21fZXJyX2FsYXJtOworCisJdTggdW51c2VkOFsweDEwMCAtIDB4QjhdOworCisvKiBUeERNQSBhcmJpdGVyICovCisJdTY0IHR4X2RtYV93cmFwX3N0YXQ7CisKKy8qIFR4IEZJRk8gY29udHJvbGxlciAqLworI2RlZmluZSBYX01BWF9GSUZPUyAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgWF9GSUZPX01BWF9MRU4gICAgICAgICAgICAgICAgICAgICAweDFGRkYJLyo4MTkxICovCisJdTY0IHR4X2ZpZm9fcGFydGl0aW9uXzA7CisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OX0VOICAgICAgICAgICAgICAgQklUKDApCisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OXzBfUFJJKHZhbCkgICAgICAgdkJJVCh2YWwsNSwzKQorI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl8wX0xFTih2YWwpICAgICAgIHZCSVQodmFsLDE5LDEzKQorI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl8xX1BSSSh2YWwpICAgICAgIHZCSVQodmFsLDM3LDMpCisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OXzFfTEVOKHZhbCkgICAgICAgdkJJVCh2YWwsNTEsMTMgICkKKworCXU2NCB0eF9maWZvX3BhcnRpdGlvbl8xOworI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl8yX1BSSSh2YWwpICAgICAgIHZCSVQodmFsLDUsMykKKyNkZWZpbmUgVFhfRklGT19QQVJUSVRJT05fMl9MRU4odmFsKSAgICAgICB2QklUKHZhbCwxOSwxMykKKyNkZWZpbmUgVFhfRklGT19QQVJUSVRJT05fM19QUkkodmFsKSAgICAgICB2QklUKHZhbCwzNywzKQorI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl8zX0xFTih2YWwpICAgICAgIHZCSVQodmFsLDUxLDEzKQorCisJdTY0IHR4X2ZpZm9fcGFydGl0aW9uXzI7CisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OXzRfUFJJKHZhbCkgICAgICAgdkJJVCh2YWwsNSwzKQorI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl80X0xFTih2YWwpICAgICAgIHZCSVQodmFsLDE5LDEzKQorI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl81X1BSSSh2YWwpICAgICAgIHZCSVQodmFsLDM3LDMpCisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OXzVfTEVOKHZhbCkgICAgICAgdkJJVCh2YWwsNTEsMTMpCisKKwl1NjQgdHhfZmlmb19wYXJ0aXRpb25fMzsKKyNkZWZpbmUgVFhfRklGT19QQVJUSVRJT05fNl9QUkkodmFsKSAgICAgICB2QklUKHZhbCw1LDMpCisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OXzZfTEVOKHZhbCkgICAgICAgdkJJVCh2YWwsMTksMTMpCisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OXzdfUFJJKHZhbCkgICAgICAgdkJJVCh2YWwsMzcsMykKKyNkZWZpbmUgVFhfRklGT19QQVJUSVRJT05fN19MRU4odmFsKSAgICAgICB2QklUKHZhbCw1MSwxMykKKworI2RlZmluZSBUWF9GSUZPX1BBUlRJVElPTl9QUklfMCAgICAgICAgICAgICAgICAgMAkvKiBoaWdoZXN0ICovCisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OX1BSSV8xICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OX1BSSV8yICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OX1BSSV8zICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OX1BSSV80ICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OX1BSSV81ICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OX1BSSV82ICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFRYX0ZJRk9fUEFSVElUSU9OX1BSSV83ICAgICAgICAgICAgICAgICA3CS8qIGxvd2VzdCAqLworCisJdTY0IHR4X3dfcm91bmRfcm9iaW5fMDsKKwl1NjQgdHhfd19yb3VuZF9yb2Jpbl8xOworCXU2NCB0eF93X3JvdW5kX3JvYmluXzI7CisJdTY0IHR4X3dfcm91bmRfcm9iaW5fMzsKKwl1NjQgdHhfd19yb3VuZF9yb2Jpbl80OworCisJdTY0IHR0aV9jb21tYW5kX21lbTsKKyNkZWZpbmUgVFRJX0NNRF9NRU1fV0UgICAgICAgICAgICAgICAgICAgICBCSVQoNykKKyNkZWZpbmUgVFRJX0NNRF9NRU1fU1RST0JFX05FV19DTUQgICAgICAgICBCSVQoMTUpCisjZGVmaW5lIFRUSV9DTURfTUVNX1NUUk9CRV9CRUlOR19FWEVDVVRFRCAgQklUKDE1KQorI2RlZmluZSBUVElfQ01EX01FTV9PRkZTRVQobikgICAgICAgICAgICAgIHZCSVQobiwyNiw2KQorCisJdTY0IHR0aV9kYXRhMV9tZW07CisjZGVmaW5lIFRUSV9EQVRBMV9NRU1fVFhfVElNRVJfVkFMKG4pICAgICAgdkJJVChuLDYsMjYpCisjZGVmaW5lIFRUSV9EQVRBMV9NRU1fVFhfVElNRVJfQUNfQ0kobikgICAgdkJJVChuLDM4LDIpCisjZGVmaW5lIFRUSV9EQVRBMV9NRU1fVFhfVElNRVJfQUNfRU4gICAgICAgQklUKDM4KQorI2RlZmluZSBUVElfREFUQTFfTUVNX1RYX1RJTUVSX0NJX0VOICAgICAgIEJJVCgzOSkKKyNkZWZpbmUgVFRJX0RBVEExX01FTV9UWF9VUk5HX0EobikgICAgICAgICB2QklUKG4sNDEsNykKKyNkZWZpbmUgVFRJX0RBVEExX01FTV9UWF9VUk5HX0IobikgICAgICAgICB2QklUKG4sNDksNykKKyNkZWZpbmUgVFRJX0RBVEExX01FTV9UWF9VUk5HX0MobikgICAgICAgICB2QklUKG4sNTcsNykKKworCXU2NCB0dGlfZGF0YTJfbWVtOworI2RlZmluZSBUVElfREFUQTJfTUVNX1RYX1VGQ19BKG4pICAgICAgICAgIHZCSVQobiwwLDE2KQorI2RlZmluZSBUVElfREFUQTJfTUVNX1RYX1VGQ19CKG4pICAgICAgICAgIHZCSVQobiwxNiwxNikKKyNkZWZpbmUgVFRJX0RBVEEyX01FTV9UWF9VRkNfQyhuKSAgICAgICAgICB2QklUKG4sMzIsMTYpCisjZGVmaW5lIFRUSV9EQVRBMl9NRU1fVFhfVUZDX0QobikgICAgICAgICAgdkJJVChuLDQ4LDE2KQorCisvKiBUeCBQcm90b2NvbCBhc3Npc3QgKi8KKwl1NjQgdHhfcGFfY2ZnOworI2RlZmluZSBUWF9QQV9DRkdfSUdOT1JFX0ZSTV9FUlIgICAgICAgICAgIEJJVCgxKQorI2RlZmluZSBUWF9QQV9DRkdfSUdOT1JFX1NOQVBfT1VJICAgICAgICAgIEJJVCgyKQorI2RlZmluZSBUWF9QQV9DRkdfSUdOT1JFX0xMQ19DVFJMICAgICAgICAgIEJJVCgzKQorI2RlZmluZQlUWF9QQV9DRkdfSUdOT1JFX0wyX0VSUgkJCSAgIEJJVCg2KQorCisvKiBSZWNlbnQgYWRkLCB1c2VkIG9ubHkgZGVidWcgcHVycG9zZXMuICovCisJdTY0IHBjY19lbmFibGU7CisKKwl1OCB1bnVzZWQ5WzB4NzAwIC0gMHgxNzhdOworCisJdTY0IHR4ZG1hX2RlYnVnX2N0cmw7CisKKwl1OCB1bnVzZWQxMFsweDE4MDAgLSAweDE3MDhdOworCisvKiBSeERNQSBSZWdpc3RlcnMgKi8KKwl1NjQgcnhkbWFfaW50X3N0YXR1czsKKwl1NjQgcnhkbWFfaW50X21hc2s7CisjZGVmaW5lIFJYRE1BX0lOVF9SQ19JTlRfTSAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgUlhETUFfSU5UX1JQQV9JTlRfTSAgICAgICAgICAgIEJJVCgxKQorI2RlZmluZSBSWERNQV9JTlRfUkRBX0lOVF9NICAgICAgICAgICAgQklUKDIpCisjZGVmaW5lIFJYRE1BX0lOVF9SVElfSU5UX00gICAgICAgICAgICBCSVQoMykKKworCXU2NCByZGFfZXJyX3JlZzsKKwl1NjQgcmRhX2Vycl9tYXNrOworCXU2NCByZGFfZXJyX2FsYXJtOworCisJdTY0IHJjX2Vycl9yZWc7CisJdTY0IHJjX2Vycl9tYXNrOworCXU2NCByY19lcnJfYWxhcm07CisKKwl1NjQgcHJjX3BjaXhfZXJyX3JlZzsKKwl1NjQgcHJjX3BjaXhfZXJyX21hc2s7CisJdTY0IHByY19wY2l4X2Vycl9hbGFybTsKKworCXU2NCBycGFfZXJyX3JlZzsKKwl1NjQgcnBhX2Vycl9tYXNrOworCXU2NCBycGFfZXJyX2FsYXJtOworCisJdTY0IHJ0aV9lcnJfcmVnOworCXU2NCBydGlfZXJyX21hc2s7CisJdTY0IHJ0aV9lcnJfYWxhcm07CisKKwl1OCB1bnVzZWQxMVsweDEwMCAtIDB4ODhdOworCisvKiBETUEgYXJiaXRlciAqLworCXU2NCByeF9xdWV1ZV9wcmlvcml0eTsKKyNkZWZpbmUgUlhfUVVFVUVfMF9QUklPUklUWSh2YWwpICAgICAgIHZCSVQodmFsLDUsMykKKyNkZWZpbmUgUlhfUVVFVUVfMV9QUklPUklUWSh2YWwpICAgICAgIHZCSVQodmFsLDEzLDMpCisjZGVmaW5lIFJYX1FVRVVFXzJfUFJJT1JJVFkodmFsKSAgICAgICB2QklUKHZhbCwyMSwzKQorI2RlZmluZSBSWF9RVUVVRV8zX1BSSU9SSVRZKHZhbCkgICAgICAgdkJJVCh2YWwsMjksMykKKyNkZWZpbmUgUlhfUVVFVUVfNF9QUklPUklUWSh2YWwpICAgICAgIHZCSVQodmFsLDM3LDMpCisjZGVmaW5lIFJYX1FVRVVFXzVfUFJJT1JJVFkodmFsKSAgICAgICB2QklUKHZhbCw0NSwzKQorI2RlZmluZSBSWF9RVUVVRV82X1BSSU9SSVRZKHZhbCkgICAgICAgdkJJVCh2YWwsNTMsMykKKyNkZWZpbmUgUlhfUVVFVUVfN19QUklPUklUWSh2YWwpICAgICAgIHZCSVQodmFsLDYxLDMpCisKKyNkZWZpbmUgUlhfUVVFVUVfUFJJXzAgICAgICAgICAgICAgICAgIDAJLyogaGlnaGVzdCAqLworI2RlZmluZSBSWF9RVUVVRV9QUklfMSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBSWF9RVUVVRV9QUklfMiAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBSWF9RVUVVRV9QUklfMyAgICAgICAgICAgICAgICAgMworI2RlZmluZSBSWF9RVUVVRV9QUklfNCAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBSWF9RVUVVRV9QUklfNSAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBSWF9RVUVVRV9QUklfNiAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBSWF9RVUVVRV9QUklfNyAgICAgICAgICAgICAgICAgNwkvKiBsb3dlc3QgKi8KKworCXU2NCByeF93X3JvdW5kX3JvYmluXzA7CisJdTY0IHJ4X3dfcm91bmRfcm9iaW5fMTsKKwl1NjQgcnhfd19yb3VuZF9yb2Jpbl8yOworCXU2NCByeF93X3JvdW5kX3JvYmluXzM7CisJdTY0IHJ4X3dfcm91bmRfcm9iaW5fNDsKKworCS8qIFBlci1yaW5nIGNvbnRyb2xsZXIgcmVncyAqLworI2RlZmluZSBSWF9NQVhfUklOR1MgICAgICAgICAgICAgICAgOAorI2lmIDAKKyNkZWZpbmUgUlhfTUFYX1JJTkdTX1NaICAgICAgICAgICAgIDB4RkZGRgkvKiA2NTUzNiAqLworI2RlZmluZSBSWF9NSU5fUklOR1NfU1ogICAgICAgICAgICAgMHgzRgkvKiA2MyAqLworI2VuZGlmCisJdTY0IHByY19yeGQwX25bUlhfTUFYX1JJTkdTXTsKKwl1NjQgcHJjX2N0cmxfbltSWF9NQVhfUklOR1NdOworI2RlZmluZSBQUkNfQ1RSTF9SQ19FTkFCTEVEICAgICAgICAgICAgICAgICAgICBCSVQoNykKKyNkZWZpbmUgUFJDX0NUUkxfUklOR19NT0RFICAgICAgICAgICAgICAgICAgICAgKEJJVCgxNCl8QklUKDE1KSkKKyNkZWZpbmUgUFJDX0NUUkxfUklOR19NT0RFXzEgICAgICAgICAgICAgICAgICAgdkJJVCgwLDE0LDIpCisjZGVmaW5lIFBSQ19DVFJMX1JJTkdfTU9ERV8zICAgICAgICAgICAgICAgICAgIHZCSVQoMSwxNCwyKQorI2RlZmluZSBQUkNfQ1RSTF9SSU5HX01PREVfNSAgICAgICAgICAgICAgICAgICB2QklUKDIsMTQsMikKKyNkZWZpbmUgUFJDX0NUUkxfUklOR19NT0RFX3ggICAgICAgICAgICAgICAgICAgdkJJVCgzLDE0LDIpCisjZGVmaW5lIFBSQ19DVFJMX05PX1NOT09QICAgICAgICAgICAgICAgICAgICAgIChCSVQoMjIpfEJJVCgyMykpCisjZGVmaW5lIFBSQ19DVFJMX05PX1NOT09QX0RFU0MgICAgICAgICAgICAgICAgIEJJVCgyMikKKyNkZWZpbmUgUFJDX0NUUkxfTk9fU05PT1BfQlVGRiAgICAgICAgICAgICAgICAgQklUKDIzKQorI2RlZmluZSBQUkNfQ1RSTF9SWERfQkFDS09GRl9JTlRFUlZBTCh2YWwpICAgICB2QklUKHZhbCw0MCwyNCkKKworCXU2NCBwcmNfYWxhcm1fYWN0aW9uOworI2RlZmluZSBQUkNfQUxBUk1fQUNUSU9OX1JSX1IwX1NUT1AgICAgICAgICAgICBCSVQoMykKKyNkZWZpbmUgUFJDX0FMQVJNX0FDVElPTl9SV19SMF9TVE9QICAgICAgICAgICAgQklUKDcpCisjZGVmaW5lIFBSQ19BTEFSTV9BQ1RJT05fUlJfUjFfU1RPUCAgICAgICAgICAgIEJJVCgxMSkKKyNkZWZpbmUgUFJDX0FMQVJNX0FDVElPTl9SV19SMV9TVE9QICAgICAgICAgICAgQklUKDE1KQorI2RlZmluZSBQUkNfQUxBUk1fQUNUSU9OX1JSX1IyX1NUT1AgICAgICAgICAgICBCSVQoMTkpCisjZGVmaW5lIFBSQ19BTEFSTV9BQ1RJT05fUldfUjJfU1RPUCAgICAgICAgICAgIEJJVCgyMykKKyNkZWZpbmUgUFJDX0FMQVJNX0FDVElPTl9SUl9SM19TVE9QICAgICAgICAgICAgQklUKDI3KQorI2RlZmluZSBQUkNfQUxBUk1fQUNUSU9OX1JXX1IzX1NUT1AgICAgICAgICAgICBCSVQoMzEpCisjZGVmaW5lIFBSQ19BTEFSTV9BQ1RJT05fUlJfUjRfU1RPUCAgICAgICAgICAgIEJJVCgzNSkKKyNkZWZpbmUgUFJDX0FMQVJNX0FDVElPTl9SV19SNF9TVE9QICAgICAgICAgICAgQklUKDM5KQorI2RlZmluZSBQUkNfQUxBUk1fQUNUSU9OX1JSX1I1X1NUT1AgICAgICAgICAgICBCSVQoNDMpCisjZGVmaW5lIFBSQ19BTEFSTV9BQ1RJT05fUldfUjVfU1RPUCAgICAgICAgICAgIEJJVCg0NykKKyNkZWZpbmUgUFJDX0FMQVJNX0FDVElPTl9SUl9SNl9TVE9QICAgICAgICAgICAgQklUKDUxKQorI2RlZmluZSBQUkNfQUxBUk1fQUNUSU9OX1JXX1I2X1NUT1AgICAgICAgICAgICBCSVQoNTUpCisjZGVmaW5lIFBSQ19BTEFSTV9BQ1RJT05fUlJfUjdfU1RPUCAgICAgICAgICAgIEJJVCg1OSkKKyNkZWZpbmUgUFJDX0FMQVJNX0FDVElPTl9SV19SN19TVE9QICAgICAgICAgICAgQklUKDYzKQorCisvKiBSZWNlaXZlIHRyYWZmaWMgaW50ZXJydXB0cyAqLworCXU2NCBydGlfY29tbWFuZF9tZW07CisjZGVmaW5lIFJUSV9DTURfTUVNX1dFICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoNykKKyNkZWZpbmUgUlRJX0NNRF9NRU1fU1RST0JFICAgICAgICAgICAgICAgICAgICAgIEJJVCgxNSkKKyNkZWZpbmUgUlRJX0NNRF9NRU1fU1RST0JFX05FV19DTUQgICAgICAgICAgICAgIEJJVCgxNSkKKyNkZWZpbmUgUlRJX0NNRF9NRU1fU1RST0JFX0NNRF9CRUlOR19FWEVDVVRFRCAgIEJJVCgxNSkKKyNkZWZpbmUgUlRJX0NNRF9NRU1fT0ZGU0VUKG4pICAgICAgICAgICAgICAgICAgIHZCSVQobiwyOSwzKQorCisJdTY0IHJ0aV9kYXRhMV9tZW07CisjZGVmaW5lIFJUSV9EQVRBMV9NRU1fUlhfVElNRVJfVkFMKG4pICAgICAgdkJJVChuLDMsMjkpCisjZGVmaW5lIFJUSV9EQVRBMV9NRU1fUlhfVElNRVJfQUNfRU4gICAgICAgQklUKDM4KQorI2RlZmluZSBSVElfREFUQTFfTUVNX1JYX1RJTUVSX0NJX0VOICAgICAgIEJJVCgzOSkKKyNkZWZpbmUgUlRJX0RBVEExX01FTV9SWF9VUk5HX0EobikgICAgICAgICB2QklUKG4sNDEsNykKKyNkZWZpbmUgUlRJX0RBVEExX01FTV9SWF9VUk5HX0IobikgICAgICAgICB2QklUKG4sNDksNykKKyNkZWZpbmUgUlRJX0RBVEExX01FTV9SWF9VUk5HX0MobikgICAgICAgICB2QklUKG4sNTcsNykKKworCXU2NCBydGlfZGF0YTJfbWVtOworI2RlZmluZSBSVElfREFUQTJfTUVNX1JYX1VGQ19BKG4pICAgICAgICAgIHZCSVQobiwwLDE2KQorI2RlZmluZSBSVElfREFUQTJfTUVNX1JYX1VGQ19CKG4pICAgICAgICAgIHZCSVQobiwxNiwxNikKKyNkZWZpbmUgUlRJX0RBVEEyX01FTV9SWF9VRkNfQyhuKSAgICAgICAgICB2QklUKG4sMzIsMTYpCisjZGVmaW5lIFJUSV9EQVRBMl9NRU1fUlhfVUZDX0QobikgICAgICAgICAgdkJJVChuLDQ4LDE2KQorCisJdTY0IHJ4X3BhX2NmZzsKKyNkZWZpbmUgUlhfUEFfQ0ZHX0lHTk9SRV9GUk1fRVJSICAgICAgICAgICBCSVQoMSkKKyNkZWZpbmUgUlhfUEFfQ0ZHX0lHTk9SRV9TTkFQX09VSSAgICAgICAgICBCSVQoMikKKyNkZWZpbmUgUlhfUEFfQ0ZHX0lHTk9SRV9MTENfQ1RSTCAgICAgICAgICBCSVQoMykKKyNkZWZpbmUgUlhfUEFfQ0ZHX0lHTk9SRV9MMl9FUlIgICAgICAgICAgICBCSVQoNikKKworCXU4IHVudXNlZDEyWzB4NzAwIC0gMHgxRDhdOworCisJdTY0IHJ4ZG1hX2RlYnVnX2N0cmw7CisKKwl1OCB1bnVzZWQxM1sweDIwMDAgLSAweDFmMDhdOworCisvKiBNZWRpYSBBY2Nlc3MgQ29udHJvbGxlciBSZWdpc3RlciAqLworCXU2NCBtYWNfaW50X3N0YXR1czsKKwl1NjQgbWFjX2ludF9tYXNrOworI2RlZmluZSBNQUNfSU5UX1NUQVRVU19UTUFDX0lOVCAgICAgICAgICAgIEJJVCgwKQorI2RlZmluZSBNQUNfSU5UX1NUQVRVU19STUFDX0lOVCAgICAgICAgICAgIEJJVCgxKQorCisJdTY0IG1hY190bWFjX2Vycl9yZWc7CisjZGVmaW5lIFRNQUNfRVJSX1JFR19UTUFDX0VDQ19EQl9FUlIgICAgICAgQklUKDE1KQorI2RlZmluZSBUTUFDX0VSUl9SRUdfVE1BQ19UWF9CVUZfT1ZSTiAgICAgIEJJVCgyMykKKyNkZWZpbmUgVE1BQ19FUlJfUkVHX1RNQUNfVFhfQ1JJX0VSUiAgICAgICBCSVQoMzEpCisJdTY0IG1hY190bWFjX2Vycl9tYXNrOworCXU2NCBtYWNfdG1hY19lcnJfYWxhcm07CisKKwl1NjQgbWFjX3JtYWNfZXJyX3JlZzsKKyNkZWZpbmUgUk1BQ19FUlJfUkVHX1JYX0JVRkZfT1ZSTiAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgUk1BQ19FUlJfUkVHX1JUU19FQ0NfREJfRVJSICAgICAgICBCSVQoMTQpCisjZGVmaW5lIFJNQUNfRVJSX1JFR19FQ0NfREJfRVJSICAgICAgICAgICAgQklUKDE1KQorI2RlZmluZSBSTUFDX0xJTktfU1RBVEVfQ0hBTkdFX0lOVCAgICAgICAgIEJJVCgzMSkKKwl1NjQgbWFjX3JtYWNfZXJyX21hc2s7CisJdTY0IG1hY19ybWFjX2Vycl9hbGFybTsKKworCXU4IHVudXNlZDE0WzB4MTAwIC0gMHg0MF07CisKKwl1NjQgbWFjX2NmZzsKKyNkZWZpbmUgTUFDX0NGR19UTUFDX0VOQUJMRSAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgTUFDX0NGR19STUFDX0VOQUJMRSAgICAgICAgICAgICBCSVQoMSkKKyNkZWZpbmUgTUFDX0NGR19MQU5fTk9UX1dBTiAgICAgICAgICAgICBCSVQoMikKKyNkZWZpbmUgTUFDX0NGR19UTUFDX0xPT1BCQUNLICAgICAgICAgICBCSVQoMykKKyNkZWZpbmUgTUFDX0NGR19UTUFDX0FQUEVORF9QQUQgICAgICAgICBCSVQoNCkKKyNkZWZpbmUgTUFDX0NGR19STUFDX1NUUklQX0ZDUyAgICAgICAgICBCSVQoNSkKKyNkZWZpbmUgTUFDX0NGR19STUFDX1NUUklQX1BBRCAgICAgICAgICBCSVQoNikKKyNkZWZpbmUgTUFDX0NGR19STUFDX1BST01fRU5BQkxFICAgICAgICBCSVQoNykKKyNkZWZpbmUgTUFDX1JNQUNfRElTQ0FSRF9QRlJNICAgICAgICAgICBCSVQoOCkKKyNkZWZpbmUgTUFDX1JNQUNfQkNBU1RfRU5BQkxFICAgICAgICAgICBCSVQoOSkKKyNkZWZpbmUgTUFDX1JNQUNfQUxMX0FERFJfRU5BQkxFICAgICAgICBCSVQoMTApCisjZGVmaW5lIE1BQ19STUFDX0lOVkxEX0lQR19USFIodmFsKSAgICAgdkJJVCh2YWwsMTYsOCkKKworCXU2NCB0bWFjX2F2Z19pcGc7CisjZGVmaW5lIFRNQUNfQVZHX0lQRyh2YWwpICAgICAgICAgICB2QklUKHZhbCwwLDgpCisKKwl1NjQgcm1hY19tYXhfcHlsZF9sZW47CisjZGVmaW5lIFJNQUNfTUFYX1BZTERfTEVOKHZhbCkgICAgICB2QklUKHZhbCwyLDE0KQorI2RlZmluZSBSTUFDX01BWF9QWUxEX0xFTl9ERUYgICAgICAgdkJJVCgxNTAwLDIsMTQpCisjZGVmaW5lIFJNQUNfTUFYX1BZTERfTEVOX0pVTUJPX0RFRiB2QklUKDk2MDAsMiwxNCkKKworCXU2NCBybWFjX2Vycl9jZmc7CisjZGVmaW5lIFJNQUNfRVJSX0ZDUyAgICAgICAgICAgICAgICAgICAgQklUKDApCisjZGVmaW5lIFJNQUNfRVJSX0ZDU19BQ0NFUFQgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIFJNQUNfRVJSX1RPT19MT05HICAgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIFJNQUNfRVJSX1RPT19MT05HX0FDQ0VQVCAgICAgICAgQklUKDEpCisjZGVmaW5lIFJNQUNfRVJSX1JVTlQgICAgICAgICAgICAgICAgICAgQklUKDIpCisjZGVmaW5lIFJNQUNfRVJSX1JVTlRfQUNDRVBUICAgICAgICAgICAgQklUKDIpCisjZGVmaW5lIFJNQUNfRVJSX0xFTl9NSVNNQVRDSCAgICAgICAgICAgQklUKDMpCisjZGVmaW5lIFJNQUNfRVJSX0xFTl9NSVNNQVRDSF9BQ0NFUFQgICAgQklUKDMpCisKKwl1NjQgcm1hY19jZmdfa2V5OworI2RlZmluZSBSTUFDX0NGR19LRVkodmFsKSAgICAgICAgICAgICAgIHZCSVQodmFsLDAsMTYpCisKKyNkZWZpbmUgTUFYX01BQ19BRERSRVNTRVMgICAgICAgICAgIDE2CisjZGVmaW5lIE1BWF9NQ19BRERSRVNTRVMgICAgICAgICAgICAzMgkvKiBNdWx0aWNhc3QgYWRkcmVzc2VzICovCisjZGVmaW5lIE1BQ19NQUNfQUREUl9TVEFSVF9PRkZTRVQgICAwCisjZGVmaW5lIE1BQ19NQ19BRERSX1NUQVJUX09GRlNFVCAgICAxNgorI2RlZmluZSBNQUNfTUNfQUxMX01DX0FERFJfT0ZGU0VUICAgNjMJLyogZW5hYmxlcyBhbGwgbXVsdGljYXN0IHBrdHMgKi8KKwl1NjQgcm1hY19hZGRyX2NtZF9tZW07CisjZGVmaW5lIFJNQUNfQUREUl9DTURfTUVNX1dFICAgICAgICAgICAgICAgICAgICBCSVQoNykKKyNkZWZpbmUgUk1BQ19BRERSX0NNRF9NRU1fUkQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUk1BQ19BRERSX0NNRF9NRU1fU1RST0JFX05FV19DTUQgICAgICAgIEJJVCgxNSkKKyNkZWZpbmUgUk1BQ19BRERSX0NNRF9NRU1fU1RST0JFX0NNRF9FWEVDVVRJTkcgIEJJVCgxNSkKKyNkZWZpbmUgUk1BQ19BRERSX0NNRF9NRU1fT0ZGU0VUKG4pICAgICAgICAgICAgIHZCSVQobiwyNiw2KQorCisJdTY0IHJtYWNfYWRkcl9kYXRhMF9tZW07CisjZGVmaW5lIFJNQUNfQUREUl9EQVRBMF9NRU1fQUREUihuKSAgICB2QklUKG4sMCw0OCkKKyNkZWZpbmUgUk1BQ19BRERSX0RBVEEwX01FTV9VU0VSICAgICAgIEJJVCg0OCkKKworCXU2NCBybWFjX2FkZHJfZGF0YTFfbWVtOworI2RlZmluZSBSTUFDX0FERFJfREFUQTFfTUVNX01BU0sobikgICAgdkJJVChuLDAsNDgpCisKKwl1OCB1bnVzZWQxNVsweDhdOworCisvKgorICAgICAgICB1NjQgcm1hY19hZGRyX2NmZzsKKyNkZWZpbmUgUk1BQ19BRERSX1VDQVNUbl9FTihuKSAgICAgbUJJVCgwKV9uKG4pCisjZGVmaW5lIFJNQUNfQUREUl9NQ0FTVG5fRU4obikgICAgIG1CSVQoMClfbihuKQorI2RlZmluZSBSTUFDX0FERFJfQkNBU1RfRU4gICAgICAgICB2QklUKDApXzQ4IAorI2RlZmluZSBSTUFDX0FERFJfQUxMX0FERFJfRU4gICAgICB2QklUKDApXzQ5IAorKi8KKwl1NjQgdG1hY19pcGdfY2ZnOworCisJdTY0IHJtYWNfcGF1c2VfY2ZnOworI2RlZmluZSBSTUFDX1BBVVNFX0dFTiAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgUk1BQ19QQVVTRV9HRU5fRU5BQkxFICAgICAgQklUKDApCisjZGVmaW5lIFJNQUNfUEFVU0VfUlggICAgICAgICAgICAgIEJJVCgxKQorI2RlZmluZSBSTUFDX1BBVVNFX1JYX0VOQUJMRSAgICAgICBCSVQoMSkKKyNkZWZpbmUgUk1BQ19QQVVTRV9IR19QVElNRV9ERUYgICAgdkJJVCgweEZGRkYsMTYsMTYpCisjZGVmaW5lIFJNQUNfUEFVU0VfSEdfUFRJTUUodmFsKSAgICB2QklUKHZhbCwxNiwxNikKKworCXU2NCBybWFjX3JlZF9jZmc7CisKKwl1NjQgcm1hY19yZWRfcmF0ZV9xMHEzOworCXU2NCBybWFjX3JlZF9yYXRlX3E0cTc7CisKKwl1NjQgbWFjX2xpbmtfdXRpbDsKKyNkZWZpbmUgTUFDX1RYX0xJTktfVVRJTCAgICAgICAgICAgdkJJVCgweEZFLDEsNykKKyNkZWZpbmUgTUFDX1RYX0xJTktfVVRJTF9ESVNBQkxFICAgdkJJVCgweEYsIDgsNCkKKyNkZWZpbmUgTUFDX1RYX0xJTktfVVRJTF9WQUwoIG4gKSAgdkJJVChuLDgsNCkKKyNkZWZpbmUgTUFDX1JYX0xJTktfVVRJTCAgICAgICAgICAgdkJJVCgweEZFLDMzLDcpCisjZGVmaW5lIE1BQ19SWF9MSU5LX1VUSUxfRElTQUJMRSAgIHZCSVQoMHhGLDQwLDQpCisjZGVmaW5lIE1BQ19SWF9MSU5LX1VUSUxfVkFMKCBuICkgIHZCSVQobiw0MCw0KQorCisjZGVmaW5lIE1BQ19MSU5LX1VUSUxfRElTQUJMRSAgICAgIE1BQ19UWF9MSU5LX1VUSUxfRElTQUJMRSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFDX1JYX0xJTktfVVRJTF9ESVNBQkxFCisKKwl1NjQgcm1hY19pbnZhbGlkX2lwZzsKKworLyogcnggdHJhZmZpYyBzdGVlcmluZyAqLworI2RlZmluZQlNQUNfUlRTX0ZSTV9MRU5fU0VUKGxlbikJdkJJVChsZW4sMiwxNCkKKwl1NjQgcnRzX2ZybV9sZW5fbls4XTsKKworCXU2NCBydHNfcW9zX3N0ZWVyaW5nOworCisjZGVmaW5lIE1BWF9ESVhfTUFQICAgICAgICAgICAgICAgICAgICAgICAgIDQKKwl1NjQgcnRzX2RpeF9tYXBfbltNQVhfRElYX01BUF07CisjZGVmaW5lIFJUU19ESVhfTUFQX0VUWVBFKHZhbCkgICAgICAgICAgICAgdkJJVCh2YWwsMCwxNikKKyNkZWZpbmUgUlRTX0RJWF9NQVBfU0NXKHZhbCkgICAgICAgICAgICAgICBCSVQodmFsLDIxKQorCisJdTY0IHJ0c19xX2FsdGVybmF0ZXM7CisJdTY0IHJ0c19kZWZhdWx0X3E7CisKKwl1NjQgcnRzX2N0cmw7CisjZGVmaW5lIFJUU19DVFJMX0lHTk9SRV9TTkFQX09VSSAgICAgICAgICAgQklUKDIpCisjZGVmaW5lIFJUU19DVFJMX0lHTk9SRV9MTENfQ1RSTCAgICAgICAgICAgQklUKDMpCisKKwl1NjQgcnRzX3BuX2NhbV9jdHJsOworI2RlZmluZSBSVFNfUE5fQ0FNX0NUUkxfV0UgICAgICAgICAgICAgICAgIEJJVCg3KQorI2RlZmluZSBSVFNfUE5fQ0FNX0NUUkxfU1RST0JFX05FV19DTUQgICAgIEJJVCgxNSkKKyNkZWZpbmUgUlRTX1BOX0NBTV9DVFJMX1NUUk9CRV9CRUlOR19FWEVDVVRFRCAgIEJJVCgxNSkKKyNkZWZpbmUgUlRTX1BOX0NBTV9DVFJMX09GRlNFVChuKSAgICAgICAgICB2QklUKG4sMjQsOCkKKwl1NjQgcnRzX3BuX2NhbV9kYXRhOworI2RlZmluZSBSVFNfUE5fQ0FNX0RBVEFfVENQX1NFTEVDVCAgICAgICAgIEJJVCg3KQorI2RlZmluZSBSVFNfUE5fQ0FNX0RBVEFfUE9SVCh2YWwpICAgICAgICAgIHZCSVQodmFsLDgsMTYpCisjZGVmaW5lIFJUU19QTl9DQU1fREFUQV9TQ1codmFsKSAgICAgICAgICAgdkJJVCh2YWwsMjQsOCkKKworCXU2NCBydHNfZHNfbWVtX2N0cmw7CisjZGVmaW5lIFJUU19EU19NRU1fQ1RSTF9XRSAgICAgICAgICAgICAgICAgQklUKDcpCisjZGVmaW5lIFJUU19EU19NRU1fQ1RSTF9TVFJPQkVfTkVXX0NNRCAgICAgQklUKDE1KQorI2RlZmluZSBSVFNfRFNfTUVNX0NUUkxfU1RST0JFX0NNRF9CRUlOR19FWEVDVVRFRCAgIEJJVCgxNSkKKyNkZWZpbmUgUlRTX0RTX01FTV9DVFJMX09GRlNFVChuKSAgICAgICAgICB2QklUKG4sMjYsNikKKwl1NjQgcnRzX2RzX21lbV9kYXRhOworI2RlZmluZSBSVFNfRFNfTUVNX0RBVEEobikgICAgICAgICAgICAgICAgIHZCSVQobiwwLDgpCisKKwl1OCB1bnVzZWQxNlsweDcwMCAtIDB4MjIwXTsKKworCXU2NCBtYWNfZGVidWdfY3RybDsKKyNkZWZpbmUgTUFDX0RCR19BQ1RJVklUWV9WQUxVRQkJICAgMHg0MTEwNDA0MDAwMDAwMDBVTEwKKworCXU4IHVudXNlZDE3WzB4MjgwMCAtIDB4MjcwOF07CisKKy8qIG1lbW9yeSBjb250cm9sbGVyIHJlZ2lzdGVycyAqLworCXU2NCBtY19pbnRfc3RhdHVzOworI2RlZmluZSBNQ19JTlRfU1RBVFVTX01DX0lOVCAgICAgICAgICAgICAgIEJJVCgwKQorCXU2NCBtY19pbnRfbWFzazsKKyNkZWZpbmUgTUNfSU5UX01BU0tfTUNfSU5UICAgICAgICAgICAgICAgICBCSVQoMCkKKworCXU2NCBtY19lcnJfcmVnOworI2RlZmluZSBNQ19FUlJfUkVHX0VDQ19EQl9FUlJfTCAgICAgICAgICAgIEJJVCgxNCkKKyNkZWZpbmUgTUNfRVJSX1JFR19FQ0NfREJfRVJSX1UgICAgICAgICAgICBCSVQoMTUpCisjZGVmaW5lIE1DX0VSUl9SRUdfTUlSSV9DUklfRVJSXzAgICAgICAgICAgQklUKDIyKQorI2RlZmluZSBNQ19FUlJfUkVHX01JUklfQ1JJX0VSUl8xICAgICAgICAgIEJJVCgyMykKKyNkZWZpbmUgTUNfRVJSX1JFR19TTV9FUlIgICAgICAgICAgICAgICAgICBCSVQoMzEpCisJdTY0IG1jX2Vycl9tYXNrOworCXU2NCBtY19lcnJfYWxhcm07CisKKwl1OCB1bnVzZWQxOFsweDEwMCAtIDB4MjhdOworCisvKiBNQyBjb25maWd1cmF0aW9uICovCisJdTY0IHJ4X3F1ZXVlX2NmZzsKKyNkZWZpbmUgUlhfUVVFVUVfQ0ZHX1EwX1NaKG4pICAgICAgICAgICAgICB2QklUKG4sMCw4KQorI2RlZmluZSBSWF9RVUVVRV9DRkdfUTFfU1oobikgICAgICAgICAgICAgIHZCSVQobiw4LDgpCisjZGVmaW5lIFJYX1FVRVVFX0NGR19RMl9TWihuKSAgICAgICAgICAgICAgdkJJVChuLDE2LDgpCisjZGVmaW5lIFJYX1FVRVVFX0NGR19RM19TWihuKSAgICAgICAgICAgICAgdkJJVChuLDI0LDgpCisjZGVmaW5lIFJYX1FVRVVFX0NGR19RNF9TWihuKSAgICAgICAgICAgICAgdkJJVChuLDMyLDgpCisjZGVmaW5lIFJYX1FVRVVFX0NGR19RNV9TWihuKSAgICAgICAgICAgICAgdkJJVChuLDQwLDgpCisjZGVmaW5lIFJYX1FVRVVFX0NGR19RNl9TWihuKSAgICAgICAgICAgICAgdkJJVChuLDQ4LDgpCisjZGVmaW5lIFJYX1FVRVVFX0NGR19RN19TWihuKSAgICAgICAgICAgICAgdkJJVChuLDU2LDgpCisKKwl1NjQgbWNfcmxkcmFtX21yczsKKyNkZWZpbmUJTUNfUkxEUkFNX1FVRVVFX1NJWkVfRU5BQkxFCQkJQklUKDM5KQorI2RlZmluZQlNQ19STERSQU1fTVJTX0VOQUJMRQkJCQlCSVQoNDcpCisKKwl1NjQgbWNfcmxkcmFtX2ludGVybGVhdmU7CisKKwl1NjQgbWNfcGF1c2VfdGhyZXNoX3EwcTM7CisJdTY0IG1jX3BhdXNlX3RocmVzaF9xNHE3OworCisJdTY0IG1jX3JlZF90aHJlc2hfcVs4XTsKKworCXU4IHVudXNlZDE5WzB4MjAwIC0gMHgxNjhdOworCXU2NCBtY19ybGRyYW1fcmVmX3BlcjsKKwl1OCB1bnVzZWQyMFsweDIyMCAtIDB4MjA4XTsKKwl1NjQgbWNfcmxkcmFtX3Rlc3RfY3RybDsKKyNkZWZpbmUgTUNfUkxEUkFNX1RFU1RfTU9ERQkJQklUKDQ3KQorI2RlZmluZSBNQ19STERSQU1fVEVTVF9XUklURQlCSVQoNykKKyNkZWZpbmUgTUNfUkxEUkFNX1RFU1RfR08JCUJJVCgxNSkKKyNkZWZpbmUgTUNfUkxEUkFNX1RFU1RfRE9ORQkJQklUKDIzKQorI2RlZmluZSBNQ19STERSQU1fVEVTVF9QQVNTCQlCSVQoMzEpCisKKwl1OCB1bnVzZWQyMVsweDI0MCAtIDB4MjI4XTsKKwl1NjQgbWNfcmxkcmFtX3Rlc3RfYWRkOworCXU4IHVudXNlZDIyWzB4MjYwIC0gMHgyNDhdOworCXU2NCBtY19ybGRyYW1fdGVzdF9kMDsKKwl1OCB1bnVzZWQyM1sweDI4MCAtIDB4MjY4XTsKKwl1NjQgbWNfcmxkcmFtX3Rlc3RfZDE7CisJdTggdW51c2VkMjRbMHgzMDAgLSAweDI4OF07CisJdTY0IG1jX3JsZHJhbV90ZXN0X2QyOworCXU4IHVudXNlZDI1WzB4NzAwIC0gMHgzMDhdOworCXU2NCBtY19kZWJ1Z19jdHJsOworCisJdTggdW51c2VkMjZbMHgzMDAwIC0gMHgyZjA4XTsKKworLyogWEdYRyAqLworCS8qIFhHWFMgY29udHJvbCByZWdpc3RlcnMgKi8KKworCXU2NCB4Z3hzX2ludF9zdGF0dXM7CisjZGVmaW5lIFhHWFNfSU5UX1NUQVRVU19UWEdYUyAgICAgICAgICAgICAgQklUKDApCisjZGVmaW5lIFhHWFNfSU5UX1NUQVRVU19SWEdYUyAgICAgICAgICAgICAgQklUKDEpCisJdTY0IHhneHNfaW50X21hc2s7CisjZGVmaW5lIFhHWFNfSU5UX01BU0tfVFhHWFMgICAgICAgICAgICAgICAgQklUKDApCisjZGVmaW5lIFhHWFNfSU5UX01BU0tfUlhHWFMgICAgICAgICAgICAgICAgQklUKDEpCisKKwl1NjQgeGd4c190eGd4c19lcnJfcmVnOworI2RlZmluZSBUWEdYU19FQ0NfREJfRVJSICAgICAgICAgICAgICAgICAgIEJJVCgxNSkKKwl1NjQgeGd4c190eGd4c19lcnJfbWFzazsKKwl1NjQgeGd4c190eGd4c19lcnJfYWxhcm07CisKKwl1NjQgeGd4c19yeGd4c19lcnJfcmVnOworCXU2NCB4Z3hzX3J4Z3hzX2Vycl9tYXNrOworCXU2NCB4Z3hzX3J4Z3hzX2Vycl9hbGFybTsKKworCXU4IHVudXNlZDI3WzB4MTAwIC0gMHg0MF07CisKKwl1NjQgeGd4c19jZmc7CisJdTY0IHhneHNfc3RhdHVzOworCisJdTY0IHhneHNfY2ZnX2tleTsKKwl1NjQgeGd4c19lZmlmb19jZmc7CS8qIENIQU5HRUQgKi8KKwl1NjQgcnhneHNfYmVyXzA7CS8qIENIQU5HRUQgKi8KKwl1NjQgcnhneHNfYmVyXzE7CS8qIENIQU5HRUQgKi8KKworfSBYRU5BX2Rldl9jb25maWdfdDsKKworI2RlZmluZSBYRU5BX1JFR19TUEFDRQlzaXplb2YoWEVOQV9kZXZfY29uZmlnX3QpCisjZGVmaW5lCVhFTkFfRUVQUk9NX1NQQUNFICgweDAxIDw8IDExKQorCisjZW5kaWYJCQkJLyogX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvczJpby5jIGIvZHJpdmVycy9uZXQvczJpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMjI0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zMmlvLmMKQEAgLTAsMCArMSw0OTUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzMmlvLmM6IEEgTGludXggUENJLVggRXRoZXJuZXQgZHJpdmVyIGZvciBTMklPIDEwR2JFIFNlcnZlciBOSUMKKyAqIENvcHlyaWdodChjKSAyMDAyLTIwMDUgTmV0ZXJpb24gSW5jLgorCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICogRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdAorICogcmV0YWluIHRoZSBhdXRob3JzaGlwLCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlLiAgVGhpcyBmaWxlIGlzIG5vdAorICogYSBjb21wbGV0ZSBwcm9ncmFtIGFuZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdGhlIGVudGlyZSBvcGVyYXRpbmcKKyAqIHN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorICogU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhpcyBkaXN0cmlidXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogQ3JlZGl0czoKKyAqIEplZmYgR2FyemlrCQk6IEZvciBwb2ludGluZyBvdXQgdGhlIGltcHJvcGVyIGVycm9yIGNvbmRpdGlvbiAKKyAqCQkJICBjaGVjayBpbiB0aGUgczJpb194bWl0IHJvdXRpbmUgYW5kIGFsc28gc29tZSAKKyAqIAkJCSAgaXNzdWVzIGluIHRoZSBUeCB3YXRjaCBkb2cgZnVuY3Rpb24uIEFsc28gZm9yCisgKgkJCSAgcGF0aWVudGx5IGFuc3dlcmluZyBhbGwgdGhvc2UgaW5udW1lcmFibGUgCisgKgkJCSAgcXVlc3Rpb25zIHJlZ2FyaW5nIHRoZSAyLjYgcG9ydGluZyBpc3N1ZXMuCisgKiBTdGVwaGVuIEhlbW1pbmdlcgk6IFByb3ZpZGluZyBwcm9wZXIgMi42IHBvcnRpbmcgbWVjaGFuaXNtIGZvciBzb21lCisgKgkJCSAgbWFjcm9zIGF2YWlsYWJsZSBvbmx5IGluIDIuNiBLZXJuZWwuCisgKiBGcmFuY29pcyBSb21pZXUJOiBGb3IgcG9pbnRpbmcgb3V0IGFsbCBjb2RlIHBhcnQgdGhhdCB3ZXJlIAorICoJCQkgIGRlcHJlY2F0ZWQgYW5kIGFsc28gc3R5bGluZyByZWxhdGVkIGNvbW1lbnRzLgorICogR3JhbnQgR3J1bmRsZXIJOiBGb3IgaGVscGluZyBtZSBnZXQgcmlkIG9mIHNvbWUgQXJjaGl0ZWN0dXJlIAorICoJCQkgIGRlcGVuZGVudCBjb2RlLgorICogQ2hyaXN0b3BoZXIgSGVsbHdpZwk6IFNvbWUgbW9yZSAyLjYgc3BlY2lmaWMgaXNzdWVzIGluIHRoZSBkcml2ZXIuCisgKgkJCSAgCQorICogVGhlIG1vZHVsZSBsb2FkYWJsZSBwYXJhbWV0ZXJzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyIGFuZCBhIGJyaWVmCisgKiBleHBsYWluYXRpb24gb2YgYWxsIHRoZSB2YXJpYWJsZXMuCisgKiByeF9yaW5nX251bSA6IFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvZ3JhbSB0aGUgbnVtYmVyIG9mIHJlY2VpdmUgcmluZ3MgdXNlZCAKKyAqIGluIHRoZSBkcml2ZXIuICAJCQkJCQorICogcnhfcmluZ19sZW46IFRoaXMgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGVhY2ggcmluZyBjYW4gaGF2ZS4gVGhpcyAKKyAqIGlzIGFsc28gYW4gYXJyYXkgb2Ygc2l6ZSA4LgorICogdHhfZmlmb19udW06IFRoaXMgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIFR4IEZJRk9zIHRoYXRzIHVzZWQgaW50IHRoZSBkcml2ZXIuCisgKiB0eF9maWZvX2xlbjogVGhpcyB0b28gaXMgYW4gYXJyYXkgb2YgOC4gRWFjaCBlbGVtZW50IGRlZmluZXMgdGhlIG51bWJlciBvZiAKKyAqIFR4IGRlc2NyaXB0b3JzIHRoYXQgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGNvcnJlc3BvbmRpbmcgRklGTy4KKyAqIGluIFBDSSBDb25maWd1cmF0aW9uIHNwYWNlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyogbG9jYWwgaW5jbHVkZSAqLworI2luY2x1ZGUgInMyaW8uaCIKKyNpbmNsdWRlICJzMmlvLXJlZ3MuaCIKKworLyogUzJpbyBEcml2ZXIgbmFtZSAmIHZlcnNpb24uICovCitzdGF0aWMgY2hhciBzMmlvX2RyaXZlcl9uYW1lW10gPSAiczJpbyI7CitzdGF0aWMgY2hhciBzMmlvX2RyaXZlcl92ZXJzaW9uW10gPSAiVmVyc2lvbiAxLjcuNy4xIjsKKworLyogCisgKiBDYXJkcyB3aXRoIGZvbGxvd2luZyBzdWJzeXN0ZW1faWQgaGF2ZSBhIGxpbmsgc3RhdGUgaW5kaWNhdGlvbgorICogcHJvYmxlbSwgNjAwQiwgNjAwQywgNjAwRCwgNjQwQiwgNjQwQyBhbmQgNjQwRC4KKyAqIG1hY3JvIGJlbG93IGlkZW50aWZpZXMgdGhlc2UgY2FyZHMgZ2l2ZW4gdGhlIHN1YnN5c3RlbV9pZC4KKyAqLworI2RlZmluZSBDQVJEU19XSVRIX0ZBVUxUWV9MSU5LX0lORElDQVRPUlMoc3ViaWQpIFwKKwkJKCgoc3ViaWQgPj0gMHg2MDBCKSAmJiAoc3ViaWQgPD0gMHg2MDBEKSkgfHwgXAorCQkgKChzdWJpZCA+PSAweDY0MEIpICYmIChzdWJpZCA8PSAweDY0MEQpKSkgPyAxIDogMAorCisjZGVmaW5lIExJTktfSVNfVVAodmFsNjQpICghKHZhbDY0ICYgKEFEQVBURVJfU1RBVFVTX1JNQUNfUkVNT1RFX0ZBVUxUIHwgXAorCQkJCSAgICAgIEFEQVBURVJfU1RBVFVTX1JNQUNfTE9DQUxfRkFVTFQpKSkKKyNkZWZpbmUgVEFTS0xFVF9JTl9VU0UgdGVzdF9hbmRfc2V0X2JpdCgwLCAoJnNwLT50YXNrbGV0X3N0YXR1cykpCisjZGVmaW5lIFBBTklDCTEKKyNkZWZpbmUgTE9XCTIKK3N0YXRpYyBpbmxpbmUgaW50IHJ4X2J1ZmZlcl9sZXZlbChuaWNfdCAqIHNwLCBpbnQgcnhiX3NpemUsIGludCByaW5nKQoreworCWludCBsZXZlbCA9IDA7CisJaWYgKChzcC0+cGt0X2NudFtyaW5nXSAtIHJ4Yl9zaXplKSA+IDE2KSB7CisJCWxldmVsID0gTE9XOworCQlpZiAoKHNwLT5wa3RfY250W3JpbmddIC0gcnhiX3NpemUpIDwgTUFYX1JYRFNfUEVSX0JMT0NLKSB7CisJCQlsZXZlbCA9IFBBTklDOworCQl9CisJfQorCisJcmV0dXJuIGxldmVsOworfQorCisvKiBFdGh0b29sIHJlbGF0ZWQgdmFyaWFibGVzIGFuZCBNYWNyb3MuICovCitzdGF0aWMgY2hhciBzMmlvX2dzdHJpbmdzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKKwkiUmVnaXN0ZXIgdGVzdFx0KG9mZmxpbmUpIiwKKwkiRWVwcm9tIHRlc3RcdChvZmZsaW5lKSIsCisJIkxpbmsgdGVzdFx0KG9ubGluZSkiLAorCSJSTERSQU0gdGVzdFx0KG9mZmxpbmUpIiwKKwkiQklTVCBUZXN0XHQob2ZmbGluZSkiCit9OworCitzdGF0aWMgY2hhciBldGh0b29sX3N0YXRzX2tleXNbXVtFVEhfR1NUUklOR19MRU5dID0geworCXsidG1hY19mcm1zIn0sCisJeyJ0bWFjX2RhdGFfb2N0ZXRzIn0sCisJeyJ0bWFjX2Ryb3BfZnJtcyJ9LAorCXsidG1hY19tY3N0X2ZybXMifSwKKwl7InRtYWNfYmNzdF9mcm1zIn0sCisJeyJ0bWFjX3BhdXNlX2N0cmxfZnJtcyJ9LAorCXsidG1hY19hbnlfZXJyX2ZybXMifSwKKwl7InRtYWNfdmxkX2lwX29jdGV0cyJ9LAorCXsidG1hY192bGRfaXAifSwKKwl7InRtYWNfZHJvcF9pcCJ9LAorCXsidG1hY19pY21wIn0sCisJeyJ0bWFjX3JzdF90Y3AifSwKKwl7InRtYWNfdGNwIn0sCisJeyJ0bWFjX3VkcCJ9LAorCXsicm1hY192bGRfZnJtcyJ9LAorCXsicm1hY19kYXRhX29jdGV0cyJ9LAorCXsicm1hY19mY3NfZXJyX2ZybXMifSwKKwl7InJtYWNfZHJvcF9mcm1zIn0sCisJeyJybWFjX3ZsZF9tY3N0X2ZybXMifSwKKwl7InJtYWNfdmxkX2Jjc3RfZnJtcyJ9LAorCXsicm1hY19pbl9ybmdfbGVuX2Vycl9mcm1zIn0sCisJeyJybWFjX2xvbmdfZnJtcyJ9LAorCXsicm1hY19wYXVzZV9jdHJsX2ZybXMifSwKKwl7InJtYWNfZGlzY2FyZGVkX2ZybXMifSwKKwl7InJtYWNfdXNpemVkX2ZybXMifSwKKwl7InJtYWNfb3NpemVkX2ZybXMifSwKKwl7InJtYWNfZnJhZ19mcm1zIn0sCisJeyJybWFjX2phYmJlcl9mcm1zIn0sCisJeyJybWFjX2lwIn0sCisJeyJybWFjX2lwX29jdGV0cyJ9LAorCXsicm1hY19oZHJfZXJyX2lwIn0sCisJeyJybWFjX2Ryb3BfaXAifSwKKwl7InJtYWNfaWNtcCJ9LAorCXsicm1hY190Y3AifSwKKwl7InJtYWNfdWRwIn0sCisJeyJybWFjX2Vycl9kcnBfdWRwIn0sCisJeyJybWFjX3BhdXNlX2NudCJ9LAorCXsicm1hY19hY2NlcHRlZF9pcCJ9LAorCXsicm1hY19lcnJfdGNwIn0sCit9OworCisjZGVmaW5lIFMySU9fU1RBVF9MRU4gc2l6ZW9mKGV0aHRvb2xfc3RhdHNfa2V5cykvIEVUSF9HU1RSSU5HX0xFTgorI2RlZmluZSBTMklPX1NUQVRfU1RSSU5HU19MRU4gUzJJT19TVEFUX0xFTiAqIEVUSF9HU1RSSU5HX0xFTgorCisjZGVmaW5lIFMySU9fVEVTVF9MRU4Jc2l6ZW9mKHMyaW9fZ3N0cmluZ3MpIC8gRVRIX0dTVFJJTkdfTEVOCisjZGVmaW5lIFMySU9fU1RSSU5HU19MRU4JUzJJT19URVNUX0xFTiAqIEVUSF9HU1RSSU5HX0xFTgorCisKKy8qIAorICogQ29uc3RhbnRzIHRvIGJlIHByb2dyYW1tZWQgaW50byB0aGUgWGVuYSdzIHJlZ2lzdGVycywgdG8gY29uZmlndXJlCisgKiB0aGUgWEFVSS4KKyAqLworCisjZGVmaW5lIFNXSVRDSF9TSUdOCTB4QTVBNUE1QTVBNUE1QTVBNVVMTAorI2RlZmluZQlFTkRfU0lHTgkweDAKKworc3RhdGljIHU2NCBkZWZhdWx0X21kaW9fY2ZnW10gPSB7CisJLyogUmVzZXQgUE1BIFBMTCAqLworCTB4QzAwMTAxMDAwMDAwMDAwMFVMTCwgMHhDMDAxMDEwMDAwMDAwMEUwVUxMLAorCTB4QzAwMTAxMDAwMDgwMDBFNFVMTCwKKwkvKiBSZW1vdmUgUmVzZXQgZnJvbSBQTUEgUExMICovCisJMHhDMDAxMDEwMDAwMDAwMDAwVUxMLCAweEMwMDEwMTAwMDAwMDAwRTBVTEwsCisJMHhDMDAxMDEwMDAwMDAwMEU0VUxMLAorCUVORF9TSUdOCit9OworCitzdGF0aWMgdTY0IGRlZmF1bHRfZHR4X2NmZ1tdID0geworCTB4ODAwMDA1MTUwMDAwMDAwMFVMTCwgMHg4MDAwMDUxNTAwMDAwMEUwVUxMLAorCTB4ODAwMDA1MTVEOTM1MDBFNFVMTCwgMHg4MDAxMDUxNTAwMDAwMDAwVUxMLAorCTB4ODAwMTA1MTUwMDAwMDBFMFVMTCwgMHg4MDAxMDUxNTAwMUUwMEU0VUxMLAorCTB4ODAwMjA1MTUwMDAwMDAwMFVMTCwgMHg4MDAyMDUxNTAwMDAwMEUwVUxMLAorCTB4ODAwMjA1MTVGMjEwMDBFNFVMTCwKKwkvKiBTZXQgUEFETE9PUEJBQ0tOICovCisJMHg4MDAyMDUxNTAwMDAwMDAwVUxMLCAweDgwMDIwNTE1MDAwMDAwRTBVTEwsCisJMHg4MDAyMDUxNUIyMDAwMEU0VUxMLCAweDgwMDMwNTE1MDAwMDAwMDBVTEwsCisJMHg4MDAzMDUxNTAwMDAwMEUwVUxMLCAweDgwMDMwNTE1QjIwMDAwRTRVTEwsCisJMHg4MDA0MDUxNTAwMDAwMDAwVUxMLCAweDgwMDQwNTE1MDAwMDAwRTBVTEwsCisJMHg4MDA0MDUxNUIyMDAwMEU0VUxMLCAweDgwMDUwNTE1MDAwMDAwMDBVTEwsCisJMHg4MDA1MDUxNTAwMDAwMEUwVUxMLCAweDgwMDUwNTE1QjIwMDAwRTRVTEwsCisJU1dJVENIX1NJR04sCisJLyogUmVtb3ZlIFBBRExPT1BCQUNLTiAqLworCTB4ODAwMjA1MTUwMDAwMDAwMFVMTCwgMHg4MDAyMDUxNTAwMDAwMEUwVUxMLAorCTB4ODAwMjA1MTVGMjAwMDBFNFVMTCwgMHg4MDAzMDUxNTAwMDAwMDAwVUxMLAorCTB4ODAwMzA1MTUwMDAwMDBFMFVMTCwgMHg4MDAzMDUxNUYyMDAwMEU0VUxMLAorCTB4ODAwNDA1MTUwMDAwMDAwMFVMTCwgMHg4MDA0MDUxNTAwMDAwMEUwVUxMLAorCTB4ODAwNDA1MTVGMjAwMDBFNFVMTCwgMHg4MDA1MDUxNTAwMDAwMDAwVUxMLAorCTB4ODAwNTA1MTUwMDAwMDBFMFVMTCwgMHg4MDA1MDUxNUYyMDAwMEU0VUxMLAorCUVORF9TSUdOCit9OworCisKKy8qIAorICogQ29uc3RhbnRzIGZvciBGaXhpbmcgdGhlIE1hY0FkZHJlc3MgcHJvYmxlbSBzZWVuIG1vc3RseSBvbgorICogQWxwaGEgbWFjaGluZXMuCisgKi8KK3N0YXRpYyB1NjQgZml4X21hY1tdID0geworCTB4MDA2MDAwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDA0MDYwMDAwMDAwMDAwMFVMTCwgMHgwMDAwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDAyMDYwMDAwMDAwMDAwMFVMTCwgMHgwMDAwNjAwMDAwMDAwMDAwVUxMLAorCTB4MDA0MDYwMDAwMDAwMDAwMFVMTCwgMHgwMDYwNjAwMDAwMDAwMDAwVUxMLAorCUVORF9TSUdOCit9OworCisvKiBNb2R1bGUgTG9hZGFibGUgcGFyYW1ldGVycy4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHhfZmlmb19udW0gPSAxOworc3RhdGljIHVuc2lnbmVkIGludCB0eF9maWZvX2xlbltNQVhfVFhfRklGT1NdID0KKyAgICB7WzAgLi4uKE1BWF9UWF9GSUZPUyAtIDEpXSA9IDAgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnhfcmluZ19udW0gPSAxOworc3RhdGljIHVuc2lnbmVkIGludCByeF9yaW5nX3N6W01BWF9SWF9SSU5HU10gPQorICAgIHtbMCAuLi4oTUFYX1JYX1JJTkdTIC0gMSldID0gMCB9Oworc3RhdGljIHVuc2lnbmVkIGludCBTdGF0c19yZWZyZXNoX3RpbWUgPSA0Oworc3RhdGljIHVuc2lnbmVkIGludCBybWFjX3BhdXNlX3RpbWUgPSA2NTUzNTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWNfcGF1c2VfdGhyZXNob2xkX3EwcTMgPSAxODc7CitzdGF0aWMgdW5zaWduZWQgaW50IG1jX3BhdXNlX3RocmVzaG9sZF9xNHE3ID0gMTg3Oworc3RhdGljIHVuc2lnbmVkIGludCBzaGFyZWRfc3BsaXRzOworc3RhdGljIHVuc2lnbmVkIGludCB0bWFjX3V0aWxfcGVyaW9kID0gNTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcm1hY191dGlsX3BlcmlvZCA9IDU7CisjaWZuZGVmIENPTkZJR19TMklPX05BUEkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW5kaWNhdGVfbWF4X3BrdHM7CisjZW5kaWYKKworLyogCisgKiBTMklPIGRldmljZSB0YWJsZS4KKyAqIFRoaXMgdGFibGUgbGlzdHMgYWxsIHRoZSBkZXZpY2VzIHRoYXQgdGhpcyBkcml2ZXIgc3VwcG9ydHMuIAorICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgczJpb190YmxbXSBfX2RldmluaXRkYXRhID0geworCXtQQ0lfVkVORE9SX0lEX1MySU8sIFBDSV9ERVZJQ0VfSURfUzJJT19XSU4sCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUR9LAorCXtQQ0lfVkVORE9SX0lEX1MySU8sIFBDSV9ERVZJQ0VfSURfUzJJT19VTkksCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUR9LAorCXtQQ0lfVkVORE9SX0lEX1MySU8sIFBDSV9ERVZJQ0VfSURfSEVSQ19XSU4sCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUR9LAorCXtQQ0lfVkVORE9SX0lEX1MySU8sIFBDSV9ERVZJQ0VfSURfSEVSQ19VTkksCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUR9LAorCXswLH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzMmlvX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzMmlvX2RyaXZlciA9IHsKKyAgICAgIC5uYW1lID0gIlMySU8iLAorICAgICAgLmlkX3RhYmxlID0gczJpb190YmwsCisgICAgICAucHJvYmUgPSBzMmlvX2luaXRfbmljLAorICAgICAgLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHMyaW9fcmVtX25pYyksCit9OworCisvKiBBIHNpbXBsaWZpZXIgbWFjcm8gdXNlZCBib3RoIGJ5IGluaXQgYW5kIGZyZWUgc2hhcmVkX21lbSBGbnMoKS4gKi8KKyNkZWZpbmUgVFhEX01FTV9QQUdFX0NOVChsZW4sIHBlcl9lYWNoKSAoKGxlbitwZXJfZWFjaCAtIDEpIC8gcGVyX2VhY2gpCisKKy8qKgorICogaW5pdF9zaGFyZWRfbWVtIC0gQWxsb2NhdGlvbiBhbmQgSW5pdGlhbGl6YXRpb24gb2YgTWVtb3J5CisgKiBAbmljOiBEZXZpY2UgcHJpdmF0ZSB2YXJpYWJsZS4KKyAqIERlc2NyaXB0aW9uOiBUaGUgZnVuY3Rpb24gYWxsb2NhdGVzIGFsbCB0aGUgbWVtb3J5IGFyZWFzIHNoYXJlZCAKKyAqIGJldHdlZW4gdGhlIE5JQyBhbmQgdGhlIGRyaXZlci4gVGhpcyBpbmNsdWRlcyBUeCBkZXNjcmlwdG9ycywgCisgKiBSeCBkZXNjcmlwdG9ycyBhbmQgdGhlIHN0YXRpc3RpY3MgYmxvY2suCisgKi8KKworc3RhdGljIGludCBpbml0X3NoYXJlZF9tZW0oc3RydWN0IHMyaW9fbmljICpuaWMpCit7CisJdTMyIHNpemU7CisJdm9pZCAqdG1wX3ZfYWRkciwgKnRtcF92X2FkZHJfbmV4dDsKKwlkbWFfYWRkcl90IHRtcF9wX2FkZHIsIHRtcF9wX2FkZHJfbmV4dDsKKwlSeERfYmxvY2tfdCAqcHJlX3J4ZF9ibGsgPSBOVUxMOworCWludCBpLCBqLCBibGtfY250OworCWludCBsc3Rfc2l6ZSwgbHN0X3Blcl9wYWdlOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuaWMtPmRldjsKKyNpZmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCXVuc2lnbmVkIGxvbmcgdG1wOworCWJ1ZmZBZGRfdCAqYmE7CisjZW5kaWYKKworCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKKworCW1hY19jb250cm9sID0gJm5pYy0+bWFjX2NvbnRyb2w7CisJY29uZmlnID0gJm5pYy0+Y29uZmlnOworCisKKwkvKiBBbGxvY2F0aW9uIGFuZCBpbml0aWFsaXphdGlvbiBvZiBUWERMcyBpbiBGSU9GcyAqLworCXNpemUgPSAwOworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnR4X2ZpZm9fbnVtOyBpKyspIHsKKwkJc2l6ZSArPSBjb25maWctPnR4X2NmZ1tpXS5maWZvX2xlbjsKKwl9CisJaWYgKHNpemUgPiBNQVhfQVZBSUxBQkxFX1RYRFMpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogVG90YWwgbnVtYmVyIG9mIFR4IEZJRk9zICIsCisJCQkgIGRldi0+bmFtZSk7CisJCURCR19QUklOVChFUlJfREJHLCAiZXhjZWVkcyB0aGUgbWF4aW11bSB2YWx1ZSAiKTsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICJ0aGF0IGNhbiBiZSB1c2VkXG4iKTsKKwkJcmV0dXJuIEZBSUxVUkU7CisJfQorCisJbHN0X3NpemUgPSAoc2l6ZW9mKFR4RF90KSAqIGNvbmZpZy0+bWF4X3R4ZHMpOworCWxzdF9wZXJfcGFnZSA9IFBBR0VfU0laRSAvIGxzdF9zaXplOworCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+dHhfZmlmb19udW07IGkrKykgeworCQlpbnQgZmlmb19sZW4gPSBjb25maWctPnR4X2NmZ1tpXS5maWZvX2xlbjsKKwkJaW50IGxpc3RfaG9sZGVyX3NpemUgPSBmaWZvX2xlbiAqIHNpemVvZihsaXN0X2luZm9faG9sZF90KTsKKwkJbmljLT5saXN0X2luZm9baV0gPSBrbWFsbG9jKGxpc3RfaG9sZGVyX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIW5pYy0+bGlzdF9pbmZvW2ldKSB7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywKKwkJCQkgICJNYWxsb2MgZmFpbGVkIGZvciBsaXN0X2luZm9cbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbWVtc2V0KG5pYy0+bGlzdF9pbmZvW2ldLCAwLCBsaXN0X2hvbGRlcl9zaXplKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+dHhfZmlmb19udW07IGkrKykgeworCQlpbnQgcGFnZV9udW0gPSBUWERfTUVNX1BBR0VfQ05UKGNvbmZpZy0+dHhfY2ZnW2ldLmZpZm9fbGVuLAorCQkJCQkJbHN0X3Blcl9wYWdlKTsKKwkJbWFjX2NvbnRyb2wtPnR4X2N1cnJfcHV0X2luZm9baV0ub2Zmc2V0ID0gMDsKKwkJbWFjX2NvbnRyb2wtPnR4X2N1cnJfcHV0X2luZm9baV0uZmlmb19sZW4gPQorCQkgICAgY29uZmlnLT50eF9jZmdbaV0uZmlmb19sZW4gLSAxOworCQltYWNfY29udHJvbC0+dHhfY3Vycl9nZXRfaW5mb1tpXS5vZmZzZXQgPSAwOworCQltYWNfY29udHJvbC0+dHhfY3Vycl9nZXRfaW5mb1tpXS5maWZvX2xlbiA9CisJCSAgICBjb25maWctPnR4X2NmZ1tpXS5maWZvX2xlbiAtIDE7CisJCWZvciAoaiA9IDA7IGogPCBwYWdlX251bTsgaisrKSB7CisJCQlpbnQgayA9IDA7CisJCQlkbWFfYWRkcl90IHRtcF9wOworCQkJdm9pZCAqdG1wX3Y7CisJCQl0bXBfdiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KG5pYy0+cGRldiwKKwkJCQkJCSAgICAgUEFHRV9TSVpFLCAmdG1wX3ApOworCQkJaWYgKCF0bXBfdikgeworCQkJCURCR19QUklOVChFUlJfREJHLAorCQkJCQkgICJwY2lfYWxsb2NfY29uc2lzdGVudCAiKTsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgImZhaWxlZCBmb3IgVHhETFxuIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQl3aGlsZSAoayA8IGxzdF9wZXJfcGFnZSkgeworCQkJCWludCBsID0gKGogKiBsc3RfcGVyX3BhZ2UpICsgazsKKwkJCQlpZiAobCA9PSBjb25maWctPnR4X2NmZ1tpXS5maWZvX2xlbikKKwkJCQkJZ290byBlbmRfdHhkX2FsbG9jOworCQkJCW5pYy0+bGlzdF9pbmZvW2ldW2xdLmxpc3RfdmlydF9hZGRyID0KKwkJCQkgICAgdG1wX3YgKyAoayAqIGxzdF9zaXplKTsKKwkJCQluaWMtPmxpc3RfaW5mb1tpXVtsXS5saXN0X3BoeV9hZGRyID0KKwkJCQkgICAgdG1wX3AgKyAoayAqIGxzdF9zaXplKTsKKwkJCQlrKys7CisJCQl9CisJCX0KKwl9CisgICAgICBlbmRfdHhkX2FsbG9jOgorCisJLyogQWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24gb2YgUlhEcyBpbiBSaW5ncyAqLworCXNpemUgPSAwOworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnJ4X3JpbmdfbnVtOyBpKyspIHsKKwkJaWYgKGNvbmZpZy0+cnhfY2ZnW2ldLm51bV9yeGQgJSAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSkpIHsKKwkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IFJ4RCBjb3VudCBvZiAiLCBkZXYtPm5hbWUpOworCQkJREJHX1BSSU5UKEVSUl9EQkcsICJSaW5nJWQgaXMgbm90IGEgbXVsdGlwbGUgb2YgIiwKKwkJCQkgIGkpOworCQkJREJHX1BSSU5UKEVSUl9EQkcsICJSeERzIHBlciBCbG9jayIpOworCQkJcmV0dXJuIEZBSUxVUkU7CisJCX0KKwkJc2l6ZSArPSBjb25maWctPnJ4X2NmZ1tpXS5udW1fcnhkOworCQluaWMtPmJsb2NrX2NvdW50W2ldID0KKwkJICAgIGNvbmZpZy0+cnhfY2ZnW2ldLm51bV9yeGQgLyAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSk7CisJCW5pYy0+cGt0X2NudFtpXSA9CisJCSAgICBjb25maWctPnJ4X2NmZ1tpXS5udW1fcnhkIC0gbmljLT5ibG9ja19jb3VudFtpXTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CisJCW1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldLmJsb2NrX2luZGV4ID0gMDsKKwkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfZ2V0X2luZm9baV0ub2Zmc2V0ID0gMDsKKwkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfZ2V0X2luZm9baV0ucmluZ19sZW4gPQorCQkgICAgY29uZmlnLT5yeF9jZmdbaV0ubnVtX3J4ZCAtIDE7CisJCW1hY19jb250cm9sLT5yeF9jdXJyX3B1dF9pbmZvW2ldLmJsb2NrX2luZGV4ID0gMDsKKwkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9baV0ub2Zmc2V0ID0gMDsKKwkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9baV0ucmluZ19sZW4gPQorCQkgICAgY29uZmlnLT5yeF9jZmdbaV0ubnVtX3J4ZCAtIDE7CisJCWJsa19jbnQgPQorCQkgICAgY29uZmlnLT5yeF9jZmdbaV0ubnVtX3J4ZCAvIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKTsKKwkJLyogIEFsbG9jYXRpbmcgYWxsIHRoZSBSeCBibG9ja3MgKi8KKwkJZm9yIChqID0gMDsgaiA8IGJsa19jbnQ7IGorKykgeworI2lmbmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCQkJc2l6ZSA9IChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKSAqIChzaXplb2YoUnhEX3QpKTsKKyNlbHNlCisJCQlzaXplID0gU0laRV9PRl9CTE9DSzsKKyNlbmRpZgorCQkJdG1wX3ZfYWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KG5pYy0+cGRldiwgc2l6ZSwKKwkJCQkJCQkgICZ0bXBfcF9hZGRyKTsKKwkJCWlmICh0bXBfdl9hZGRyID09IE5VTEwpIHsKKwkJCQkvKgorCQkJCSAqIEluIGNhc2Ugb2YgZmFpbHVyZSwgZnJlZV9zaGFyZWRfbWVtKCkgCisJCQkJICogaXMgY2FsbGVkLCB3aGljaCBzaG91bGQgZnJlZSBhbnkgCisJCQkJICogbWVtb3J5IHRoYXQgd2FzIGFsbG9jZWQgdGlsbCB0aGUgCisJCQkJICogZmFpbHVyZSBoYXBwZW5lZC4KKwkJCQkgKi8KKwkJCQluaWMtPnJ4X2Jsb2Nrc1tpXVtqXS5ibG9ja192aXJ0X2FkZHIgPQorCQkJCSAgICB0bXBfdl9hZGRyOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJbWVtc2V0KHRtcF92X2FkZHIsIDAsIHNpemUpOworCQkJbmljLT5yeF9ibG9ja3NbaV1bal0uYmxvY2tfdmlydF9hZGRyID0gdG1wX3ZfYWRkcjsKKwkJCW5pYy0+cnhfYmxvY2tzW2ldW2pdLmJsb2NrX2RtYV9hZGRyID0gdG1wX3BfYWRkcjsKKwkJfQorCQkvKiBJbnRlcmxpbmtpbmcgYWxsIFJ4IEJsb2NrcyAqLworCQlmb3IgKGogPSAwOyBqIDwgYmxrX2NudDsgaisrKSB7CisJCQl0bXBfdl9hZGRyID0gbmljLT5yeF9ibG9ja3NbaV1bal0uYmxvY2tfdmlydF9hZGRyOworCQkJdG1wX3ZfYWRkcl9uZXh0ID0KKwkJCSAgICBuaWMtPnJ4X2Jsb2Nrc1tpXVsoaiArIDEpICUKKwkJCQkJICAgICAgYmxrX2NudF0uYmxvY2tfdmlydF9hZGRyOworCQkJdG1wX3BfYWRkciA9IG5pYy0+cnhfYmxvY2tzW2ldW2pdLmJsb2NrX2RtYV9hZGRyOworCQkJdG1wX3BfYWRkcl9uZXh0ID0KKwkJCSAgICBuaWMtPnJ4X2Jsb2Nrc1tpXVsoaiArIDEpICUKKwkJCQkJICAgICAgYmxrX2NudF0uYmxvY2tfZG1hX2FkZHI7CisKKwkJCXByZV9yeGRfYmxrID0gKFJ4RF9ibG9ja190ICopIHRtcF92X2FkZHI7CisJCQlwcmVfcnhkX2Jsay0+cmVzZXJ2ZWRfMSA9IEVORF9PRl9CTE9DSzsJLyogbGFzdCBSeEQgCisJCQkJCQkJCSAqIG1hcmtlci4KKwkJCQkJCQkJICovCisjaWZuZGVmCUNPTkZJR18yQlVGRl9NT0RFCisJCQlwcmVfcnhkX2Jsay0+cmVzZXJ2ZWRfMl9wTmV4dF9SeERfYmxvY2sgPQorCQkJICAgICh1bnNpZ25lZCBsb25nKSB0bXBfdl9hZGRyX25leHQ7CisjZW5kaWYKKwkJCXByZV9yeGRfYmxrLT5wTmV4dF9SeERfQmxrX3BoeXNpY2FsID0KKwkJCSAgICAodTY0KSB0bXBfcF9hZGRyX25leHQ7CisJCX0KKwl9CisKKyNpZmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCS8qIAorCSAqIEFsbG9jYXRpb24gb2YgU3RvcmFnZXMgZm9yIGJ1ZmZlciBhZGRyZXNzZXMgaW4gMkJVRkYgbW9kZQorCSAqIGFuZCB0aGUgYnVmZmVycyBhcyB3ZWxsLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnJ4X3JpbmdfbnVtOyBpKyspIHsKKwkJYmxrX2NudCA9CisJCSAgICBjb25maWctPnJ4X2NmZ1tpXS5udW1fcnhkIC8gKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpOworCQluaWMtPmJhW2ldID0ga21hbGxvYygoc2l6ZW9mKGJ1ZmZBZGRfdCAqKSAqIGJsa19jbnQpLAorCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghbmljLT5iYVtpXSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlmb3IgKGogPSAwOyBqIDwgYmxrX2NudDsgaisrKSB7CisJCQlpbnQgayA9IDA7CisJCQluaWMtPmJhW2ldW2pdID0ga21hbGxvYygoc2l6ZW9mKGJ1ZmZBZGRfdCkgKgorCQkJCQkJIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKSksCisJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmICghbmljLT5iYVtpXVtqXSkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCXdoaWxlIChrICE9IE1BWF9SWERTX1BFUl9CTE9DSykgeworCQkJCWJhID0gJm5pYy0+YmFbaV1bal1ba107CisKKwkJCQliYS0+YmFfMF9vcmcgPSBrbWFsbG9jCisJCQkJICAgIChCVUYwX0xFTiArIEFMSUdOX1NJWkUsIEdGUF9LRVJORUwpOworCQkJCWlmICghYmEtPmJhXzBfb3JnKQorCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQl0bXAgPSAodW5zaWduZWQgbG9uZykgYmEtPmJhXzBfb3JnOworCQkJCXRtcCArPSBBTElHTl9TSVpFOworCQkJCXRtcCAmPSB+KCh1bnNpZ25lZCBsb25nKSBBTElHTl9TSVpFKTsKKwkJCQliYS0+YmFfMCA9ICh2b2lkICopIHRtcDsKKworCQkJCWJhLT5iYV8xX29yZyA9IGttYWxsb2MKKwkJCQkgICAgKEJVRjFfTEVOICsgQUxJR05fU0laRSwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKCFiYS0+YmFfMV9vcmcpCisJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCXRtcCA9ICh1bnNpZ25lZCBsb25nKSBiYS0+YmFfMV9vcmc7CisJCQkJdG1wICs9IEFMSUdOX1NJWkU7CisJCQkJdG1wICY9IH4oKHVuc2lnbmVkIGxvbmcpIEFMSUdOX1NJWkUpOworCQkJCWJhLT5iYV8xID0gKHZvaWQgKikgdG1wOworCQkJCWsrKzsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJLyogQWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24gb2YgU3RhdGlzdGljcyBibG9jayAqLworCXNpemUgPSBzaXplb2YoU3RhdEluZm9fdCk7CisJbWFjX2NvbnRyb2wtPnN0YXRzX21lbSA9IHBjaV9hbGxvY19jb25zaXN0ZW50CisJICAgIChuaWMtPnBkZXYsIHNpemUsICZtYWNfY29udHJvbC0+c3RhdHNfbWVtX3BoeSk7CisKKwlpZiAoIW1hY19jb250cm9sLT5zdGF0c19tZW0pIHsKKwkJLyogCisJCSAqIEluIGNhc2Ugb2YgZmFpbHVyZSwgZnJlZV9zaGFyZWRfbWVtKCkgaXMgY2FsbGVkLCB3aGljaCAKKwkJICogc2hvdWxkIGZyZWUgYW55IG1lbW9yeSB0aGF0IHdhcyBhbGxvY2VkIHRpbGwgdGhlIAorCQkgKiBmYWlsdXJlIGhhcHBlbmVkLgorCQkgKi8KKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1hY19jb250cm9sLT5zdGF0c19tZW1fc3ogPSBzaXplOworCisJdG1wX3ZfYWRkciA9IG1hY19jb250cm9sLT5zdGF0c19tZW07CisJbWFjX2NvbnRyb2wtPnN0YXRzX2luZm8gPSAoU3RhdEluZm9fdCAqKSB0bXBfdl9hZGRyOworCW1lbXNldCh0bXBfdl9hZGRyLCAwLCBzaXplKTsKKworCURCR19QUklOVChJTklUX0RCRywgIiVzOlJpbmcgTWVtIFBIWTogMHglbGx4XG4iLCBkZXYtPm5hbWUsCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdG1wX3BfYWRkcik7CisKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyoqICAKKyAqIGZyZWVfc2hhcmVkX21lbSAtIEZyZWUgdGhlIGFsbG9jYXRlZCBNZW1vcnkgCisgKiBAbmljOiAgRGV2aWNlIHByaXZhdGUgdmFyaWFibGUuCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyB0byBmcmVlIGFsbCBtZW1vcnkgbG9jYXRpb25zIGFsbG9jYXRlZCBieQorICogdGhlIGluaXRfc2hhcmVkX21lbSgpIGZ1bmN0aW9uIGFuZCByZXR1cm4gaXQgdG8gdGhlIGtlcm5lbC4KKyAqLworCitzdGF0aWMgdm9pZCBmcmVlX3NoYXJlZF9tZW0oc3RydWN0IHMyaW9fbmljICpuaWMpCit7CisJaW50IGksIGosIGJsa19jbnQsIHNpemU7CisJdm9pZCAqdG1wX3ZfYWRkcjsKKwlkbWFfYWRkcl90IHRtcF9wX2FkZHI7CisJbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOworCWludCBsc3Rfc2l6ZSwgbHN0X3Blcl9wYWdlOworCisKKwlpZiAoIW5pYykKKwkJcmV0dXJuOworCisJbWFjX2NvbnRyb2wgPSAmbmljLT5tYWNfY29udHJvbDsKKwljb25maWcgPSAmbmljLT5jb25maWc7CisKKwlsc3Rfc2l6ZSA9IChzaXplb2YoVHhEX3QpICogY29uZmlnLT5tYXhfdHhkcyk7CisJbHN0X3Blcl9wYWdlID0gUEFHRV9TSVpFIC8gbHN0X3NpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT50eF9maWZvX251bTsgaSsrKSB7CisJCWludCBwYWdlX251bSA9IFRYRF9NRU1fUEFHRV9DTlQoY29uZmlnLT50eF9jZmdbaV0uZmlmb19sZW4sCisJCQkJCQlsc3RfcGVyX3BhZ2UpOworCQlmb3IgKGogPSAwOyBqIDwgcGFnZV9udW07IGorKykgeworCQkJaW50IG1lbV9ibGtzID0gKGogKiBsc3RfcGVyX3BhZ2UpOworCQkJaWYgKCFuaWMtPmxpc3RfaW5mb1tpXVttZW1fYmxrc10ubGlzdF92aXJ0X2FkZHIpCisJCQkJYnJlYWs7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KG5pYy0+cGRldiwgUEFHRV9TSVpFLAorCQkJCQkgICAgbmljLT5saXN0X2luZm9baV1bbWVtX2Jsa3NdLgorCQkJCQkgICAgbGlzdF92aXJ0X2FkZHIsCisJCQkJCSAgICBuaWMtPmxpc3RfaW5mb1tpXVttZW1fYmxrc10uCisJCQkJCSAgICBsaXN0X3BoeV9hZGRyKTsKKwkJfQorCQlrZnJlZShuaWMtPmxpc3RfaW5mb1tpXSk7CisJfQorCisjaWZuZGVmIENPTkZJR18yQlVGRl9NT0RFCisJc2l6ZSA9IChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKSAqIChzaXplb2YoUnhEX3QpKTsKKyNlbHNlCisJc2l6ZSA9IFNJWkVfT0ZfQkxPQ0s7CisjZW5kaWYKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CisJCWJsa19jbnQgPSBuaWMtPmJsb2NrX2NvdW50W2ldOworCQlmb3IgKGogPSAwOyBqIDwgYmxrX2NudDsgaisrKSB7CisJCQl0bXBfdl9hZGRyID0gbmljLT5yeF9ibG9ja3NbaV1bal0uYmxvY2tfdmlydF9hZGRyOworCQkJdG1wX3BfYWRkciA9IG5pYy0+cnhfYmxvY2tzW2ldW2pdLmJsb2NrX2RtYV9hZGRyOworCQkJaWYgKHRtcF92X2FkZHIgPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQobmljLT5wZGV2LCBzaXplLAorCQkJCQkgICAgdG1wX3ZfYWRkciwgdG1wX3BfYWRkcik7CisJCX0KKwl9CisKKyNpZmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCS8qIEZyZWVpbmcgYnVmZmVyIHN0b3JhZ2UgYWRkcmVzc2VzIGluIDJCVUZGIG1vZGUuICovCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgeworCQlibGtfY250ID0KKwkJICAgIGNvbmZpZy0+cnhfY2ZnW2ldLm51bV9yeGQgLyAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSk7CisJCWlmICghbmljLT5iYVtpXSkKKwkJCWdvdG8gZW5kX2ZyZWU7CisJCWZvciAoaiA9IDA7IGogPCBibGtfY250OyBqKyspIHsKKwkJCWludCBrID0gMDsKKwkJCWlmICghbmljLT5iYVtpXVtqXSkgeworCQkJCWtmcmVlKG5pYy0+YmFbaV0pOworCQkJCWdvdG8gZW5kX2ZyZWU7CisJCQl9CisJCQl3aGlsZSAoayAhPSBNQVhfUlhEU19QRVJfQkxPQ0spIHsKKwkJCQlidWZmQWRkX3QgKmJhID0gJm5pYy0+YmFbaV1bal1ba107CisJCQkJaWYgKCFiYSB8fCAhYmEtPmJhXzBfb3JnIHx8ICFiYS0+YmFfMV9vcmcpCisJCQkJeworCQkJCQlrZnJlZShuaWMtPmJhW2ldKTsKKwkJCQkJa2ZyZWUobmljLT5iYVtpXVtqXSk7CisJCQkJCWlmKGJhLT5iYV8wX29yZykKKwkJCQkJCWtmcmVlKGJhLT5iYV8wX29yZyk7CisJCQkJCWlmKGJhLT5iYV8xX29yZykKKwkJCQkJCWtmcmVlKGJhLT5iYV8xX29yZyk7CisJCQkJCWdvdG8gZW5kX2ZyZWU7CisJCQkJfQorCQkJCWtmcmVlKGJhLT5iYV8wX29yZyk7CisJCQkJa2ZyZWUoYmEtPmJhXzFfb3JnKTsKKwkJCQlrKys7CisJCQl9CisJCQlrZnJlZShuaWMtPmJhW2ldW2pdKTsKKwkJfQorCQlrZnJlZShuaWMtPmJhW2ldKTsKKwl9CitlbmRfZnJlZToKKyNlbmRpZgorCisJaWYgKG1hY19jb250cm9sLT5zdGF0c19tZW0pIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChuaWMtPnBkZXYsCisJCQkJICAgIG1hY19jb250cm9sLT5zdGF0c19tZW1fc3osCisJCQkJICAgIG1hY19jb250cm9sLT5zdGF0c19tZW0sCisJCQkJICAgIG1hY19jb250cm9sLT5zdGF0c19tZW1fcGh5KTsKKwl9Cit9CisKKy8qKiAgCisgKiAgaW5pdF9uaWMgLSBJbml0aWFsaXphdGlvbiBvZiBoYXJkd2FyZSAKKyAqICBAbmljOiBkZXZpY2UgcGVpdmF0ZSB2YXJpYWJsZQorICogIERlc2NyaXB0aW9uOiBUaGUgZnVuY3Rpb24gc2VxdWVudGlhbGx5IGNvbmZpZ3VyZXMgZXZlcnkgYmxvY2sgCisgKiAgb2YgdGhlIEgvVyBmcm9tIHRoZWlyIHJlc2V0IHZhbHVlcy4gCisgKiAgUmV0dXJuIFZhbHVlOiAgU1VDQ0VTUyBvbiBzdWNjZXNzIGFuZCAKKyAqICAnLTEnIG9uIGZhaWx1cmUgKGVuZGlhbiBzZXR0aW5ncyBpbmNvcnJlY3QpLgorICovCisKK3N0YXRpYyBpbnQgaW5pdF9uaWMoc3RydWN0IHMyaW9fbmljICpuaWMpCit7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmljLT5kZXY7CisJcmVnaXN0ZXIgdTY0IHZhbDY0ID0gMDsKKwl2b2lkIF9faW9tZW0gKmFkZDsKKwl1MzIgdGltZTsKKwlpbnQgaSwgajsKKwltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CisJaW50IG1kaW9fY250ID0gMCwgZHR4X2NudCA9IDA7CisJdW5zaWduZWQgbG9uZyBsb25nIG1lbV9zaGFyZTsKKworCW1hY19jb250cm9sID0gJm5pYy0+bWFjX2NvbnRyb2w7CisJY29uZmlnID0gJm5pYy0+Y29uZmlnOworCisJLyogSW5pdGlhbGl6ZSBzd2FwcGVyIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlpZiAoczJpb19zZXRfc3dhcHBlcihuaWMpKSB7CisJCURCR19QUklOVChFUlJfREJHLCJFUlJPUjogU2V0dGluZyBTd2FwcGVyIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBSZW1vdmUgWEdYUyBmcm9tIHJlc2V0IHN0YXRlICovCisJdmFsNjQgPSAwOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnN3X3Jlc2V0KTsKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5zd19yZXNldCk7CisJbXNsZWVwKDUwMCk7CisKKwkvKiAgRW5hYmxlIFJlY2VpdmluZyBicm9hZGNhc3RzICovCisJYWRkID0gJmJhcjAtPm1hY19jZmc7CisJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWFjX2NmZyk7CisJdmFsNjQgfD0gTUFDX1JNQUNfQkNBU1RfRU5BQkxFOworCXdyaXRlcShSTUFDX0NGR19LRVkoMHg0QzBEKSwgJmJhcjAtPnJtYWNfY2ZnX2tleSk7CisJd3JpdGVsKCh1MzIpIHZhbDY0LCBhZGQpOworCXdyaXRlcShSTUFDX0NGR19LRVkoMHg0QzBEKSwgJmJhcjAtPnJtYWNfY2ZnX2tleSk7CisJd3JpdGVsKCh1MzIpICh2YWw2NCA+PiAzMiksIChhZGQgKyA0KSk7CisKKwkvKiBSZWFkIHJlZ2lzdGVycyBpbiBhbGwgYmxvY2tzICovCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWFjX2ludF9tYXNrKTsKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tY19pbnRfbWFzayk7CisJdmFsNjQgPSByZWFkcSgmYmFyMC0+eGd4c19pbnRfbWFzayk7CisKKwkvKiAgU2V0IE1UVSAqLworCXZhbDY0ID0gZGV2LT5tdHU7CisJd3JpdGVxKHZCSVQodmFsNjQsIDIsIDE0KSwgJmJhcjAtPnJtYWNfbWF4X3B5bGRfbGVuKTsKKworCS8qIAorCSAqIENvbmZpZ3VyaW5nIHRoZSBYQVVJIEludGVyZmFjZSBvZiBYZW5hLiAKKwkgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBUbyBDb25maWd1cmUgdGhlIFhlbmEncyBYQVVJLCBvbmUgaGFzIHRvIHdyaXRlIGEgc2VyaWVzIAorCSAqIG9mIDY0IGJpdCB2YWx1ZXMgaW50byB0d28gcmVnaXN0ZXJzIGluIGEgcGFydGljdWxhciAKKwkgKiBzZXF1ZW5jZS4gSGVuY2UgYSBtYWNybyAnU1dJVENIX1NJR04nIGhhcyBiZWVuIGRlZmluZWQgCisJICogd2hpY2ggd2lsbCBiZSBkZWZpbmVkIGluIHRoZSBhcnJheSBvZiBjb25maWd1cmF0aW9uIHZhbHVlcyAKKwkgKiAoZGVmYXVsdF9kdHhfY2ZnICYgZGVmYXVsdF9tZGlvX2NmZykgYXQgYXBwcm9wcmlhdGUgcGxhY2VzIAorCSAqIHRvIHN3aXRjaCB3cml0aW5nIGZyb20gb25lIHJlZ3NpdGVyIHRvIGFub3RoZXIuIFdlIGNvbnRpbnVlIAorCSAqIHdyaXRpbmcgdGhlc2UgdmFsdWVzIHVudGlsIHdlIGVuY291bnRlciB0aGUgJ0VORF9TSUdOJyBtYWNyby4KKwkgKiBGb3IgZXhhbXBsZSwgQWZ0ZXIgbWFraW5nIGEgc2VyaWVzIG9mIDIxIHdyaXRlcyBpbnRvIAorCSAqIGR0eF9jb250cm9sIHJlZ2lzdGVyIHRoZSAnU1dJVENIX1NJR04nIGFwcGVhcnMgYW5kIGhlbmNlIHdlIAorCSAqIHN0YXJ0IHdyaXRpbmcgaW50byBtZGlvX2NvbnRyb2wgdW50aWwgd2UgZW5jb3VudGVyIEVORF9TSUdOLgorCSAqLworCXdoaWxlICgxKSB7CisJICAgICAgZHR4X2NmZzoKKwkJd2hpbGUgKGRlZmF1bHRfZHR4X2NmZ1tkdHhfY250XSAhPSBFTkRfU0lHTikgeworCQkJaWYgKGRlZmF1bHRfZHR4X2NmZ1tkdHhfY250XSA9PSBTV0lUQ0hfU0lHTikgeworCQkJCWR0eF9jbnQrKzsKKwkJCQlnb3RvIG1kaW9fY2ZnOworCQkJfQorCQkJU1BFQ0lBTF9SRUdfV1JJVEUoZGVmYXVsdF9kdHhfY2ZnW2R0eF9jbnRdLAorCQkJCQkgICZiYXIwLT5kdHhfY29udHJvbCwgVUYpOworCQkJdmFsNjQgPSByZWFkcSgmYmFyMC0+ZHR4X2NvbnRyb2wpOworCQkJZHR4X2NudCsrOworCQl9CisJICAgICAgbWRpb19jZmc6CisJCXdoaWxlIChkZWZhdWx0X21kaW9fY2ZnW21kaW9fY250XSAhPSBFTkRfU0lHTikgeworCQkJaWYgKGRlZmF1bHRfbWRpb19jZmdbbWRpb19jbnRdID09IFNXSVRDSF9TSUdOKSB7CisJCQkJbWRpb19jbnQrKzsKKwkJCQlnb3RvIGR0eF9jZmc7CisJCQl9CisJCQlTUEVDSUFMX1JFR19XUklURShkZWZhdWx0X21kaW9fY2ZnW21kaW9fY250XSwKKwkJCQkJICAmYmFyMC0+bWRpb19jb250cm9sLCBVRik7CisJCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tZGlvX2NvbnRyb2wpOworCQkJbWRpb19jbnQrKzsKKwkJfQorCQlpZiAoKGRlZmF1bHRfZHR4X2NmZ1tkdHhfY250XSA9PSBFTkRfU0lHTikgJiYKKwkJICAgIChkZWZhdWx0X21kaW9fY2ZnW21kaW9fY250XSA9PSBFTkRfU0lHTikpIHsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJZ290byBkdHhfY2ZnOworCQl9CisJfQorCisJLyogIFR4IERNQSBJbml0aWFsaXphdGlvbiAqLworCXZhbDY0ID0gMDsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT50eF9maWZvX3BhcnRpdGlvbl8wKTsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT50eF9maWZvX3BhcnRpdGlvbl8xKTsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT50eF9maWZvX3BhcnRpdGlvbl8yKTsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT50eF9maWZvX3BhcnRpdGlvbl8zKTsKKworCisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBjb25maWctPnR4X2ZpZm9fbnVtOyBpKyspIHsKKwkJdmFsNjQgfD0KKwkJICAgIHZCSVQoY29uZmlnLT50eF9jZmdbaV0uZmlmb19sZW4gLSAxLCAoKGkgKiAzMikgKyAxOSksCisJCQkgMTMpIHwgdkJJVChjb25maWctPnR4X2NmZ1tpXS5maWZvX3ByaW9yaXR5LAorCQkJCSAgICAoKGkgKiAzMikgKyA1KSwgMyk7CisKKwkJaWYgKGkgPT0gKGNvbmZpZy0+dHhfZmlmb19udW0gLSAxKSkgeworCQkJaWYgKGkgJSAyID09IDApCisJCQkJaSsrOworCQl9CisKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgMToKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnR4X2ZpZm9fcGFydGl0aW9uXzApOworCQkJdmFsNjQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnR4X2ZpZm9fcGFydGl0aW9uXzEpOworCQkJdmFsNjQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnR4X2ZpZm9fcGFydGl0aW9uXzIpOworCQkJdmFsNjQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnR4X2ZpZm9fcGFydGl0aW9uXzMpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBFbmFibGUgVHggRklGTyBwYXJ0aXRpb24gMC4gKi8KKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT50eF9maWZvX3BhcnRpdGlvbl8wKTsKKwl2YWw2NCB8PSBCSVQoMCk7CS8qIFRvIGVuYWJsZSB0aGUgRklGTyBwYXJ0aXRpb24uICovCisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+dHhfZmlmb19wYXJ0aXRpb25fMCk7CisKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT50eF9maWZvX3BhcnRpdGlvbl8wKTsKKwlEQkdfUFJJTlQoSU5JVF9EQkcsICJGaWZvIHBhcnRpdGlvbiBhdDogMHglcCBpczogMHglbGx4XG4iLAorCQkgICZiYXIwLT50eF9maWZvX3BhcnRpdGlvbl8wLCAodW5zaWduZWQgbG9uZyBsb25nKSB2YWw2NCk7CisKKwkvKiAKKwkgKiBJbml0aWFsaXphdGlvbiBvZiBUeF9QQV9DT05GSUcgcmVnaXN0ZXIgdG8gaWdub3JlIHBhY2tldCAKKwkgKiBpbnRlZ3JpdHkgY2hlY2tpbmcuCisJICovCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+dHhfcGFfY2ZnKTsKKwl2YWw2NCB8PSBUWF9QQV9DRkdfSUdOT1JFX0ZSTV9FUlIgfCBUWF9QQV9DRkdfSUdOT1JFX1NOQVBfT1VJIHwKKwkgICAgVFhfUEFfQ0ZHX0lHTk9SRV9MTENfQ1RSTCB8IFRYX1BBX0NGR19JR05PUkVfTDJfRVJSOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnR4X3BhX2NmZyk7CisKKwkvKiBSeCBETUEgaW50aWFsaXphdGlvbi4gKi8KKwl2YWw2NCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgeworCQl2YWw2NCB8PQorCQkgICAgdkJJVChjb25maWctPnJ4X2NmZ1tpXS5yaW5nX3ByaW9yaXR5LCAoNSArIChpICogOCkpLAorCQkJIDMpOworCX0KKwl3cml0ZXEodmFsNjQsICZiYXIwLT5yeF9xdWV1ZV9wcmlvcml0eSk7CisKKwkvKiAKKwkgKiBBbGxvY2F0aW5nIGVxdWFsIHNoYXJlIG9mIG1lbW9yeSB0byBhbGwgdGhlIAorCSAqIGNvbmZpZ3VyZWQgUmluZ3MuCisJICovCisJdmFsNjQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnJ4X3JpbmdfbnVtOyBpKyspIHsKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgMDoKKwkJCW1lbV9zaGFyZSA9ICg2NCAvIGNvbmZpZy0+cnhfcmluZ19udW0gKworCQkJCSAgICAgNjQgJSBjb25maWctPnJ4X3JpbmdfbnVtKTsKKwkJCXZhbDY0IHw9IFJYX1FVRVVFX0NGR19RMF9TWihtZW1fc2hhcmUpOworCQkJY29udGludWU7CisJCWNhc2UgMToKKwkJCW1lbV9zaGFyZSA9ICg2NCAvIGNvbmZpZy0+cnhfcmluZ19udW0pOworCQkJdmFsNjQgfD0gUlhfUVVFVUVfQ0ZHX1ExX1NaKG1lbV9zaGFyZSk7CisJCQljb250aW51ZTsKKwkJY2FzZSAyOgorCQkJbWVtX3NoYXJlID0gKDY0IC8gY29uZmlnLT5yeF9yaW5nX251bSk7CisJCQl2YWw2NCB8PSBSWF9RVUVVRV9DRkdfUTJfU1oobWVtX3NoYXJlKTsKKwkJCWNvbnRpbnVlOworCQljYXNlIDM6CisJCQltZW1fc2hhcmUgPSAoNjQgLyBjb25maWctPnJ4X3JpbmdfbnVtKTsKKwkJCXZhbDY0IHw9IFJYX1FVRVVFX0NGR19RM19TWihtZW1fc2hhcmUpOworCQkJY29udGludWU7CisJCWNhc2UgNDoKKwkJCW1lbV9zaGFyZSA9ICg2NCAvIGNvbmZpZy0+cnhfcmluZ19udW0pOworCQkJdmFsNjQgfD0gUlhfUVVFVUVfQ0ZHX1E0X1NaKG1lbV9zaGFyZSk7CisJCQljb250aW51ZTsKKwkJY2FzZSA1OgorCQkJbWVtX3NoYXJlID0gKDY0IC8gY29uZmlnLT5yeF9yaW5nX251bSk7CisJCQl2YWw2NCB8PSBSWF9RVUVVRV9DRkdfUTVfU1oobWVtX3NoYXJlKTsKKwkJCWNvbnRpbnVlOworCQljYXNlIDY6CisJCQltZW1fc2hhcmUgPSAoNjQgLyBjb25maWctPnJ4X3JpbmdfbnVtKTsKKwkJCXZhbDY0IHw9IFJYX1FVRVVFX0NGR19RNl9TWihtZW1fc2hhcmUpOworCQkJY29udGludWU7CisJCWNhc2UgNzoKKwkJCW1lbV9zaGFyZSA9ICg2NCAvIGNvbmZpZy0+cnhfcmluZ19udW0pOworCQkJdmFsNjQgfD0gUlhfUVVFVUVfQ0ZHX1E3X1NaKG1lbV9zaGFyZSk7CisJCQljb250aW51ZTsKKwkJfQorCX0KKwl3cml0ZXEodmFsNjQsICZiYXIwLT5yeF9xdWV1ZV9jZmcpOworCisJLyogCisJICogSW5pdGlhbGl6aW5nIHRoZSBUeCByb3VuZCByb2JpbiByZWdpc3RlcnMgdG8gMC4KKwkgKiBGaWxsaW5nIFR4IGFuZCBSeCByb3VuZCByb2JpbiByZWdpc3RlcnMgYXMgcGVyIHRoZSAKKwkgKiBudW1iZXIgb2YgRklGT3MgYW5kIFJpbmdzIGlzIHN0aWxsIFRPRE8uCisJICovCisJd3JpdGVxKDAsICZiYXIwLT50eF93X3JvdW5kX3JvYmluXzApOworCXdyaXRlcSgwLCAmYmFyMC0+dHhfd19yb3VuZF9yb2Jpbl8xKTsKKwl3cml0ZXEoMCwgJmJhcjAtPnR4X3dfcm91bmRfcm9iaW5fMik7CisJd3JpdGVxKDAsICZiYXIwLT50eF93X3JvdW5kX3JvYmluXzMpOworCXdyaXRlcSgwLCAmYmFyMC0+dHhfd19yb3VuZF9yb2Jpbl80KTsKKworCS8qIAorCSAqIFRPRE8KKwkgKiBEaXNhYmxlIFJ4IHN0ZWVyaW5nLiBIYXJkIGNvZGluZyBhbGwgcGFja2V0cyBiZSBzdGVlcmVkIHRvCisJICogUXVldWUgMCBmb3Igbm93LiAKKwkgKi8KKwl2YWw2NCA9IDB4ODA4MDgwODA4MDgwODA4MFVMTDsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5ydHNfcW9zX3N0ZWVyaW5nKTsKKworCS8qIFVEUCBGaXggKi8KKwl2YWw2NCA9IDA7CisJZm9yIChpID0gMTsgaSA8IDg7IGkrKykKKwkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cnRzX2ZybV9sZW5fbltpXSk7CisKKwkvKiBTZXQgcnRzX2ZybV9sZW4gcmVnaXN0ZXIgZm9yIGZpZm8gMCAqLworCXdyaXRlcShNQUNfUlRTX0ZSTV9MRU5fU0VUKGRldi0+bXR1ICsgMjIpLAorCSAgICAgICAmYmFyMC0+cnRzX2ZybV9sZW5fblswXSk7CisKKwkvKiBFbmFibGUgc3RhdGlzdGljcyAqLworCXdyaXRlcShtYWNfY29udHJvbC0+c3RhdHNfbWVtX3BoeSwgJmJhcjAtPnN0YXRfYWRkcik7CisJdmFsNjQgPSBTRVRfVVBEVF9QRVJJT0QoU3RhdHNfcmVmcmVzaF90aW1lKSB8CisJICAgIFNUQVRfQ0ZHX1NUQVRfUk8gfCBTVEFUX0NGR19TVEFUX0VOOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnN0YXRfY2ZnKTsKKworCS8qIAorCSAqIEluaXRpYWxpemluZyB0aGUgc2FtcGxpbmcgcmF0ZSBmb3IgdGhlIGRldmljZSB0byBjYWxjdWxhdGUgdGhlCisJICogYmFuZHdpZHRoIHV0aWxpemF0aW9uLgorCSAqLworCXZhbDY0ID0gTUFDX1RYX0xJTktfVVRJTF9WQUwodG1hY191dGlsX3BlcmlvZCkgfAorCSAgICBNQUNfUlhfTElOS19VVElMX1ZBTChybWFjX3V0aWxfcGVyaW9kKTsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5tYWNfbGlua191dGlsKTsKKworCisJLyogCisJICogSW5pdGlhbGl6aW5nIHRoZSBUcmFuc21pdCBhbmQgUmVjZWl2ZSBUcmFmZmljIEludGVycnVwdCAKKwkgKiBTY2hlbWUuCisJICovCisJLyogVFRJIEluaXRpYWxpemF0aW9uLiBEZWZhdWx0IFR4IHRpbWVyIGdldHMgdXMgYWJvdXQKKwkgKiAyNTAgaW50ZXJydXB0cyBwZXIgc2VjLiBDb250aW51b3VzIGludGVycnVwdHMgYXJlIGVuYWJsZWQKKwkgKiBieSBkZWZhdWx0LgorCSAqLworCXZhbDY0ID0gVFRJX0RBVEExX01FTV9UWF9USU1FUl9WQUwoMHgyMDc4KSB8CisJICAgIFRUSV9EQVRBMV9NRU1fVFhfVVJOR19BKDB4QSkgfAorCSAgICBUVElfREFUQTFfTUVNX1RYX1VSTkdfQigweDEwKSB8CisJICAgIFRUSV9EQVRBMV9NRU1fVFhfVVJOR19DKDB4MzApIHwgVFRJX0RBVEExX01FTV9UWF9USU1FUl9BQ19FTiB8CisJCVRUSV9EQVRBMV9NRU1fVFhfVElNRVJfQ0lfRU47CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+dHRpX2RhdGExX21lbSk7CisKKwl2YWw2NCA9IFRUSV9EQVRBMl9NRU1fVFhfVUZDX0EoMHgxMCkgfAorCSAgICBUVElfREFUQTJfTUVNX1RYX1VGQ19CKDB4MjApIHwKKwkgICAgVFRJX0RBVEEyX01FTV9UWF9VRkNfQygweDQwKSB8IFRUSV9EQVRBMl9NRU1fVFhfVUZDX0QoMHg4MCk7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+dHRpX2RhdGEyX21lbSk7CisKKwl2YWw2NCA9IFRUSV9DTURfTUVNX1dFIHwgVFRJX0NNRF9NRU1fU1RST0JFX05FV19DTUQ7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+dHRpX2NvbW1hbmRfbWVtKTsKKworCS8qIAorCSAqIE9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMsIHRoZSBTdHJvYmUgYml0IG9mIHRoZSBjb21tYW5kCisJICogcmVnaXN0ZXIgd2lsbCBiZSByZXNldC4gV2UgcG9sbCBmb3IgdGhpcyBwYXJ0aWN1bGFyIGNvbmRpdGlvbgorCSAqIFdlIHdhaXQgZm9yIGEgbWF4aW11bSBvZiA1MDBtcyBmb3IgdGhlIG9wZXJhdGlvbiB0byBjb21wbGV0ZSwKKwkgKiBpZiBpdCdzIG5vdCBjb21wbGV0ZSBieSB0aGVuIHdlIHJldHVybiBlcnJvci4KKwkgKi8KKwl0aW1lID0gMDsKKwl3aGlsZSAoVFJVRSkgeworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT50dGlfY29tbWFuZF9tZW0pOworCQlpZiAoISh2YWw2NCAmIFRUSV9DTURfTUVNX1NUUk9CRV9ORVdfQ01EKSkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHRpbWUgPiAxMCkgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogVFRJIGluaXQgRmFpbGVkXG4iLAorCQkJCSAgZGV2LT5uYW1lKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQltc2xlZXAoNTApOworCQl0aW1lKys7CisJfQorCisJLyogUlRJIEluaXRpYWxpemF0aW9uICovCisJdmFsNjQgPSBSVElfREFUQTFfTUVNX1JYX1RJTUVSX1ZBTCgweEZGRikgfAorCSAgICBSVElfREFUQTFfTUVNX1JYX1VSTkdfQSgweEEpIHwKKwkgICAgUlRJX0RBVEExX01FTV9SWF9VUk5HX0IoMHgxMCkgfAorCSAgICBSVElfREFUQTFfTUVNX1JYX1VSTkdfQygweDMwKSB8IFJUSV9EQVRBMV9NRU1fUlhfVElNRVJfQUNfRU47CisKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5ydGlfZGF0YTFfbWVtKTsKKworCXZhbDY0ID0gUlRJX0RBVEEyX01FTV9SWF9VRkNfQSgweDEpIHwKKwkgICAgUlRJX0RBVEEyX01FTV9SWF9VRkNfQigweDIpIHwKKwkgICAgUlRJX0RBVEEyX01FTV9SWF9VRkNfQygweDQwKSB8IFJUSV9EQVRBMl9NRU1fUlhfVUZDX0QoMHg4MCk7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cnRpX2RhdGEyX21lbSk7CisKKwl2YWw2NCA9IFJUSV9DTURfTUVNX1dFIHwgUlRJX0NNRF9NRU1fU1RST0JFX05FV19DTUQ7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cnRpX2NvbW1hbmRfbWVtKTsKKworCS8qIAorCSAqIE9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMsIHRoZSBTdHJvYmUgYml0IG9mIHRoZSBjb21tYW5kCisJICogcmVnaXN0ZXIgd2lsbCBiZSByZXNldC4gV2UgcG9sbCBmb3IgdGhpcyBwYXJ0aWN1bGFyIGNvbmRpdGlvbgorCSAqIFdlIHdhaXQgZm9yIGEgbWF4aW11bSBvZiA1MDBtcyBmb3IgdGhlIG9wZXJhdGlvbiB0byBjb21wbGV0ZSwKKwkgKiBpZiBpdCdzIG5vdCBjb21wbGV0ZSBieSB0aGVuIHdlIHJldHVybiBlcnJvci4KKwkgKi8KKwl0aW1lID0gMDsKKwl3aGlsZSAoVFJVRSkgeworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ydGlfY29tbWFuZF9tZW0pOworCQlpZiAoISh2YWw2NCAmIFRUSV9DTURfTUVNX1NUUk9CRV9ORVdfQ01EKSkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHRpbWUgPiAxMCkgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogUlRJIGluaXQgRmFpbGVkXG4iLAorCQkJCSAgZGV2LT5uYW1lKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQl0aW1lKys7CisJCW1zbGVlcCg1MCk7CisJfQorCisJLyogCisJICogSW5pdGlhbGl6aW5nIHByb3BlciB2YWx1ZXMgYXMgUGF1c2UgdGhyZXNob2xkIGludG8gYWxsIAorCSAqIHRoZSA4IFF1ZXVlcyBvbiBSeCBzaWRlLgorCSAqLworCXdyaXRlcSgweGZmYmJmZmJiZmZiYmZmYmJVTEwsICZiYXIwLT5tY19wYXVzZV90aHJlc2hfcTBxMyk7CisJd3JpdGVxKDB4ZmZiYmZmYmJmZmJiZmZiYlVMTCwgJmJhcjAtPm1jX3BhdXNlX3RocmVzaF9xNHE3KTsKKworCS8qIERpc2FibGUgUk1BQyBQQUQgU1RSSVBQSU5HICovCisJYWRkID0gJmJhcjAtPm1hY19jZmc7CisJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWFjX2NmZyk7CisJdmFsNjQgJj0gfihNQUNfQ0ZHX1JNQUNfU1RSSVBfUEFEKTsKKwl3cml0ZXEoUk1BQ19DRkdfS0VZKDB4NEMwRCksICZiYXIwLT5ybWFjX2NmZ19rZXkpOworCXdyaXRlbCgodTMyKSAodmFsNjQpLCBhZGQpOworCXdyaXRlcShSTUFDX0NGR19LRVkoMHg0QzBEKSwgJmJhcjAtPnJtYWNfY2ZnX2tleSk7CisJd3JpdGVsKCh1MzIpICh2YWw2NCA+PiAzMiksIChhZGQgKyA0KSk7CisJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWFjX2NmZyk7CisKKwkvKiAKKwkgKiBTZXQgdGhlIHRpbWUgdmFsdWUgdG8gYmUgaW5zZXJ0ZWQgaW4gdGhlIHBhdXNlIGZyYW1lIAorCSAqIGdlbmVyYXRlZCBieSB4ZW5hLgorCSAqLworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnJtYWNfcGF1c2VfY2ZnKTsKKwl2YWw2NCAmPSB+KFJNQUNfUEFVU0VfSEdfUFRJTUUoMHhmZmZmKSk7CisJdmFsNjQgfD0gUk1BQ19QQVVTRV9IR19QVElNRShuaWMtPm1hY19jb250cm9sLnJtYWNfcGF1c2VfdGltZSk7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cm1hY19wYXVzZV9jZmcpOworCisJLyogCisJICogU2V0IHRoZSBUaHJlc2hvbGQgTGltaXQgZm9yIEdlbmVyYXRpbmcgdGhlIHBhdXNlIGZyYW1lCisJICogSWYgdGhlIGFtb3VudCBvZiBkYXRhIGluIGFueSBRdWV1ZSBleGNlZWRzIHJhdGlvIG9mCisJICogKG1hY19jb250cm9sLm1jX3BhdXNlX3RocmVzaG9sZF9xMHEzIG9yIHE0cTcpLzI1NgorCSAqIHBhdXNlIGZyYW1lIGlzIGdlbmVyYXRlZAorCSAqLworCXZhbDY0ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXZhbDY0IHw9CisJCSAgICAoKCh1NjQpIDB4RkYwMCB8IG5pYy0+bWFjX2NvbnRyb2wuCisJCSAgICAgIG1jX3BhdXNlX3RocmVzaG9sZF9xMHEzKQorCQkgICAgIDw8IChpICogMiAqIDgpKTsKKwl9CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+bWNfcGF1c2VfdGhyZXNoX3EwcTMpOworCisJdmFsNjQgPSAwOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJdmFsNjQgfD0KKwkJICAgICgoKHU2NCkgMHhGRjAwIHwgbmljLT5tYWNfY29udHJvbC4KKwkJICAgICAgbWNfcGF1c2VfdGhyZXNob2xkX3E0cTcpCisJCSAgICAgPDwgKGkgKiAyICogOCkpOworCX0KKwl3cml0ZXEodmFsNjQsICZiYXIwLT5tY19wYXVzZV90aHJlc2hfcTRxNyk7CisKKwkvKiAKKwkgKiBUeERNQSB3aWxsIHN0b3AgUmVhZCByZXF1ZXN0IGlmIHRoZSBudW1iZXIgb2YgcmVhZCBzcGxpdCBoYXMgCisJICogZXhjZWVkZWQgdGhlIGxpbWl0IHBvaW50ZWQgYnkgc2hhcmVkX3NwbGl0cworCSAqLworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnBpY19jb250cm9sKTsKKwl2YWw2NCB8PSBQSUNfQ05UTF9TSEFSRURfU1BMSVRTKHNoYXJlZF9zcGxpdHMpOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnBpY19jb250cm9sKTsKKworCXJldHVybiBTVUNDRVNTOworfQorCisvKiogIAorICogIGVuX2Rpc19hYmxlX25pY19pbnRycyAtIEVuYWJsZSBvciBEaXNhYmxlIHRoZSBpbnRlcnJ1cHRzIAorICogIEBuaWM6IGRldmljZSBwcml2YXRlIHZhcmlhYmxlLAorICogIEBtYXNrOiBBIG1hc2sgaW5kaWNhdGluZyB3aGljaCBJbnRyIGJsb2NrIG11c3QgYmUgbW9kaWZpZWQgYW5kLAorICogIEBmbGFnOiBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBJbnRycy4KKyAqICBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiB3aWxsIGVpdGhlciBkaXNhYmxlIG9yIGVuYWJsZSB0aGUgaW50ZXJydXB0cworICogIGRlcGVuZGluZyBvbiB0aGUgZmxhZyBhcmd1bWVudC4gVGhlIG1hc2sgYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gCisgKiAgZW5hYmxlL2Rpc2FibGUgYW55IEludHIgYmxvY2suIAorICogIFJldHVybiBWYWx1ZTogTk9ORS4KKyAqLworCitzdGF0aWMgdm9pZCBlbl9kaXNfYWJsZV9uaWNfaW50cnMoc3RydWN0IHMyaW9fbmljICpuaWMsIHUxNiBtYXNrLCBpbnQgZmxhZykKK3sKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gbmljLT5iYXIwOworCXJlZ2lzdGVyIHU2NCB2YWw2NCA9IDAsIHRlbXA2NCA9IDA7CisKKwkvKiAgVG9wIGxldmVsIGludGVycnVwdCBjbGFzc2lmaWNhdGlvbiAqLworCS8qICBQSUMgSW50ZXJydXB0cyAqLworCWlmICgobWFzayAmIChUWF9QSUNfSU5UUiB8IFJYX1BJQ19JTlRSKSkpIHsKKwkJLyogIEVuYWJsZSBQSUMgSW50cnMgaW4gdGhlIGdlbmVyYWwgaW50ciBtYXNrIHJlZ2lzdGVyICovCisJCXZhbDY0ID0gVFhQSUNfSU5UX00gfCBQSUNfUlhfSU5UX007CisJCWlmIChmbGFnID09IEVOQUJMRV9JTlRSUykgeworCQkJdGVtcDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJdGVtcDY0ICY9IH4oKHU2NCkgdmFsNjQpOworCQkJd3JpdGVxKHRlbXA2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJLyogIAorCQkJICogRGlzYWJsZWQgYWxsIFBDSVgsIEZsYXNoLCBNRElPLCBJSUMgYW5kIEdQSU8KKwkJCSAqIGludGVycnVwdHMgZm9yIG5vdy4gCisJCQkgKiBUT0RPIAorCQkJICovCisJCQl3cml0ZXEoRElTQUJMRV9BTExfSU5UUlMsICZiYXIwLT5waWNfaW50X21hc2spOworCQkJLyogCisJCQkgKiBObyBNU0kgU3VwcG9ydCBpcyBhdmFpbGFibGUgcHJlc2VudGx5LCBzbyBUVEkgYW5kCisJCQkgKiBSVEkgaW50ZXJydXB0cyBhcmUgYWxzbyBkaXNhYmxlZC4KKwkJCSAqLworCQl9IGVsc2UgaWYgKGZsYWcgPT0gRElTQUJMRV9JTlRSUykgeworCQkJLyogIAorCQkJICogRGlzYWJsZSBQSUMgSW50cnMgaW4gdGhlIGdlbmVyYWwgCisJCQkgKiBpbnRyIG1hc2sgcmVnaXN0ZXIgCisJCQkgKi8KKwkJCXdyaXRlcShESVNBQkxFX0FMTF9JTlRSUywgJmJhcjAtPnBpY19pbnRfbWFzayk7CisJCQl0ZW1wNjQgPSByZWFkcSgmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCQl2YWw2NCB8PSB0ZW1wNjQ7CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJfQorCX0KKworCS8qICBETUEgSW50ZXJydXB0cyAqLworCS8qICBFbmFibGluZy9EaXNhYmxpbmcgVHggRE1BIGludGVycnVwdHMgKi8KKwlpZiAobWFzayAmIFRYX0RNQV9JTlRSKSB7CisJCS8qIEVuYWJsZSBUeERNQSBJbnRycyBpbiB0aGUgZ2VuZXJhbCBpbnRyIG1hc2sgcmVnaXN0ZXIgKi8KKwkJdmFsNjQgPSBUWERNQV9JTlRfTTsKKwkJaWYgKGZsYWcgPT0gRU5BQkxFX0lOVFJTKSB7CisJCQl0ZW1wNjQgPSByZWFkcSgmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCQl0ZW1wNjQgJj0gfigodTY0KSB2YWw2NCk7CisJCQl3cml0ZXEodGVtcDY0LCAmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCQkvKiAKKwkJCSAqIEtlZXAgYWxsIGludGVycnVwdHMgb3RoZXIgdGhhbiBQRkMgaW50ZXJydXB0IAorCQkJICogYW5kIFBDQyBpbnRlcnJ1cHQgZGlzYWJsZWQgaW4gRE1BIGxldmVsLgorCQkJICovCisJCQl2YWw2NCA9IERJU0FCTEVfQUxMX0lOVFJTICYgfihUWERNQV9QRkNfSU5UX00gfAorCQkJCQkJICAgICAgVFhETUFfUENDX0lOVF9NKTsKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnR4ZG1hX2ludF9tYXNrKTsKKwkJCS8qIAorCQkJICogRW5hYmxlIG9ubHkgdGhlIE1JU0MgZXJyb3IgMSBpbnRlcnJ1cHQgaW4gUEZDIGJsb2NrIAorCQkJICovCisJCQl2YWw2NCA9IERJU0FCTEVfQUxMX0lOVFJTICYgKH5QRkNfTUlTQ19FUlJfMSk7CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5wZmNfZXJyX21hc2spOworCQkJLyogCisJCQkgKiBFbmFibGUgb25seSB0aGUgRkJfRUNDIGVycm9yIGludGVycnVwdCBpbiBQQ0MgYmxvY2sgCisJCQkgKi8KKwkJCXZhbDY0ID0gRElTQUJMRV9BTExfSU5UUlMgJiAoflBDQ19GQl9FQ0NfRVJSKTsKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnBjY19lcnJfbWFzayk7CisJCX0gZWxzZSBpZiAoZmxhZyA9PSBESVNBQkxFX0lOVFJTKSB7CisJCQkvKiAKKwkJCSAqIERpc2FibGUgVHhETUEgSW50cnMgaW4gdGhlIGdlbmVyYWwgaW50ciBtYXNrIAorCQkJICogcmVnaXN0ZXIgCisJCQkgKi8KKwkJCXdyaXRlcShESVNBQkxFX0FMTF9JTlRSUywgJmJhcjAtPnR4ZG1hX2ludF9tYXNrKTsKKwkJCXdyaXRlcShESVNBQkxFX0FMTF9JTlRSUywgJmJhcjAtPnBmY19lcnJfbWFzayk7CisJCQl0ZW1wNjQgPSByZWFkcSgmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCQl2YWw2NCB8PSB0ZW1wNjQ7CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJfQorCX0KKworCS8qICBFbmFibGluZy9EaXNhYmxpbmcgUnggRE1BIGludGVycnVwdHMgKi8KKwlpZiAobWFzayAmIFJYX0RNQV9JTlRSKSB7CisJCS8qICBFbmFibGUgUnhETUEgSW50cnMgaW4gdGhlIGdlbmVyYWwgaW50ciBtYXNrIHJlZ2lzdGVyICovCisJCXZhbDY0ID0gUlhETUFfSU5UX007CisJCWlmIChmbGFnID09IEVOQUJMRV9JTlRSUykgeworCQkJdGVtcDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJdGVtcDY0ICY9IH4oKHU2NCkgdmFsNjQpOworCQkJd3JpdGVxKHRlbXA2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJLyogCisJCQkgKiBBbGwgUnhETUEgYmxvY2sgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgZm9yIG5vdyAKKwkJCSAqIFRPRE8gCisJCQkgKi8KKwkJCXdyaXRlcShESVNBQkxFX0FMTF9JTlRSUywgJmJhcjAtPnJ4ZG1hX2ludF9tYXNrKTsKKwkJfSBlbHNlIGlmIChmbGFnID09IERJU0FCTEVfSU5UUlMpIHsKKwkJCS8qICAKKwkJCSAqIERpc2FibGUgUnhETUEgSW50cnMgaW4gdGhlIGdlbmVyYWwgaW50ciBtYXNrIAorCQkJICogcmVnaXN0ZXIgCisJCQkgKi8KKwkJCXdyaXRlcShESVNBQkxFX0FMTF9JTlRSUywgJmJhcjAtPnJ4ZG1hX2ludF9tYXNrKTsKKwkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJCXZhbDY0IHw9IHRlbXA2NDsKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQl9CisJfQorCisJLyogIE1BQyBJbnRlcnJ1cHRzICovCisJLyogIEVuYWJsaW5nL0Rpc2FibGluZyBNQUMgaW50ZXJydXB0cyAqLworCWlmIChtYXNrICYgKFRYX01BQ19JTlRSIHwgUlhfTUFDX0lOVFIpKSB7CisJCXZhbDY0ID0gVFhNQUNfSU5UX00gfCBSWE1BQ19JTlRfTTsKKwkJaWYgKGZsYWcgPT0gRU5BQkxFX0lOVFJTKSB7CisJCQl0ZW1wNjQgPSByZWFkcSgmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCQl0ZW1wNjQgJj0gfigodTY0KSB2YWw2NCk7CisJCQl3cml0ZXEodGVtcDY0LCAmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCQkvKiAKKwkJCSAqIEFsbCBNQUMgYmxvY2sgZXJyb3IgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgZm9yIG5vdyAKKwkJCSAqIGV4Y2VwdCB0aGUgbGluayBzdGF0dXMgY2hhbmdlIGludGVycnVwdC4KKwkJCSAqIFRPRE8KKwkJCSAqLworCQkJdmFsNjQgPSBNQUNfSU5UX1NUQVRVU19STUFDX0lOVDsKKwkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5tYWNfaW50X21hc2spOworCQkJdGVtcDY0ICY9IH4oKHU2NCkgdmFsNjQpOworCQkJd3JpdGVxKHRlbXA2NCwgJmJhcjAtPm1hY19pbnRfbWFzayk7CisKKwkJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPm1hY19ybWFjX2Vycl9tYXNrKTsKKwkJCXZhbDY0ICY9IH4oKHU2NCkgUk1BQ19MSU5LX1NUQVRFX0NIQU5HRV9JTlQpOworCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+bWFjX3JtYWNfZXJyX21hc2spOworCQl9IGVsc2UgaWYgKGZsYWcgPT0gRElTQUJMRV9JTlRSUykgeworCQkJLyogIAorCQkJICogRGlzYWJsZSBNQUMgSW50cnMgaW4gdGhlIGdlbmVyYWwgaW50ciBtYXNrIHJlZ2lzdGVyIAorCQkJICovCisJCQl3cml0ZXEoRElTQUJMRV9BTExfSU5UUlMsICZiYXIwLT5tYWNfaW50X21hc2spOworCQkJd3JpdGVxKERJU0FCTEVfQUxMX0lOVFJTLAorCQkJICAgICAgICZiYXIwLT5tYWNfcm1hY19lcnJfbWFzayk7CisKKwkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJCXZhbDY0IHw9IHRlbXA2NDsKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQl9CisJfQorCisJLyogIFhHWFMgSW50ZXJydXB0cyAqLworCWlmIChtYXNrICYgKFRYX1hHWFNfSU5UUiB8IFJYX1hHWFNfSU5UUikpIHsKKwkJdmFsNjQgPSBUWFhHWFNfSU5UX00gfCBSWFhHWFNfSU5UX007CisJCWlmIChmbGFnID09IEVOQUJMRV9JTlRSUykgeworCQkJdGVtcDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJdGVtcDY0ICY9IH4oKHU2NCkgdmFsNjQpOworCQkJd3JpdGVxKHRlbXA2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJLyogCisJCQkgKiBBbGwgWEdYUyBibG9jayBlcnJvciBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBmb3Igbm93CisJCQkgKiBUT0RPIAorCQkJICovCisJCQl3cml0ZXEoRElTQUJMRV9BTExfSU5UUlMsICZiYXIwLT54Z3hzX2ludF9tYXNrKTsKKwkJfSBlbHNlIGlmIChmbGFnID09IERJU0FCTEVfSU5UUlMpIHsKKwkJCS8qICAKKwkJCSAqIERpc2FibGUgTUMgSW50cnMgaW4gdGhlIGdlbmVyYWwgaW50ciBtYXNrIHJlZ2lzdGVyIAorCQkJICovCisJCQl3cml0ZXEoRElTQUJMRV9BTExfSU5UUlMsICZiYXIwLT54Z3hzX2ludF9tYXNrKTsKKwkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJCXZhbDY0IHw9IHRlbXA2NDsKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQl9CisJfQorCisJLyogIE1lbW9yeSBDb250cm9sbGVyKE1DKSBpbnRlcnJ1cHRzICovCisJaWYgKG1hc2sgJiBNQ19JTlRSKSB7CisJCXZhbDY0ID0gTUNfSU5UX007CisJCWlmIChmbGFnID09IEVOQUJMRV9JTlRSUykgeworCQkJdGVtcDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJdGVtcDY0ICY9IH4oKHU2NCkgdmFsNjQpOworCQkJd3JpdGVxKHRlbXA2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJLyogCisJCQkgKiBBbGwgTUMgYmxvY2sgZXJyb3IgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgZm9yIG5vdworCQkJICogVE9ETyAKKwkJCSAqLworCQkJd3JpdGVxKERJU0FCTEVfQUxMX0lOVFJTLCAmYmFyMC0+bWNfaW50X21hc2spOworCQl9IGVsc2UgaWYgKGZsYWcgPT0gRElTQUJMRV9JTlRSUykgeworCQkJLyoKKwkJCSAqIERpc2FibGUgTUMgSW50cnMgaW4gdGhlIGdlbmVyYWwgaW50ciBtYXNrIHJlZ2lzdGVyCisJCQkgKi8KKwkJCXdyaXRlcShESVNBQkxFX0FMTF9JTlRSUywgJmJhcjAtPm1jX2ludF9tYXNrKTsKKwkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJCXZhbDY0IHw9IHRlbXA2NDsKKwkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQl9CisJfQorCisKKwkvKiAgVHggdHJhZmZpYyBpbnRlcnJ1cHRzICovCisJaWYgKG1hc2sgJiBUWF9UUkFGRklDX0lOVFIpIHsKKwkJdmFsNjQgPSBUWFRSQUZGSUNfSU5UX007CisJCWlmIChmbGFnID09IEVOQUJMRV9JTlRSUykgeworCQkJdGVtcDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJdGVtcDY0ICY9IH4oKHU2NCkgdmFsNjQpOworCQkJd3JpdGVxKHRlbXA2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJLyogCisJCQkgKiBFbmFibGUgYWxsIHRoZSBUeCBzaWRlIGludGVycnVwdHMKKwkJCSAqIHdyaXRpbmcgMCBFbmFibGVzIGFsbCA2NCBUWCBpbnRlcnJ1cHQgbGV2ZWxzIAorCQkJICovCisJCQl3cml0ZXEoMHgwLCAmYmFyMC0+dHhfdHJhZmZpY19tYXNrKTsKKwkJfSBlbHNlIGlmIChmbGFnID09IERJU0FCTEVfSU5UUlMpIHsKKwkJCS8qIAorCQkJICogRGlzYWJsZSBUeCBUcmFmZmljIEludHJzIGluIHRoZSBnZW5lcmFsIGludHIgbWFzayAKKwkJCSAqIHJlZ2lzdGVyLgorCQkJICovCisJCQl3cml0ZXEoRElTQUJMRV9BTExfSU5UUlMsICZiYXIwLT50eF90cmFmZmljX21hc2spOworCQkJdGVtcDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJdmFsNjQgfD0gdGVtcDY0OworCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCX0KKwl9CisKKwkvKiAgUnggdHJhZmZpYyBpbnRlcnJ1cHRzICovCisJaWYgKG1hc2sgJiBSWF9UUkFGRklDX0lOVFIpIHsKKwkJdmFsNjQgPSBSWFRSQUZGSUNfSU5UX007CisJCWlmIChmbGFnID09IEVOQUJMRV9JTlRSUykgeworCQkJdGVtcDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJdGVtcDY0ICY9IH4oKHU2NCkgdmFsNjQpOworCQkJd3JpdGVxKHRlbXA2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOworCQkJLyogd3JpdGluZyAwIEVuYWJsZXMgYWxsIDggUlggaW50ZXJydXB0IGxldmVscyAqLworCQkJd3JpdGVxKDB4MCwgJmJhcjAtPnJ4X3RyYWZmaWNfbWFzayk7CisJCX0gZWxzZSBpZiAoZmxhZyA9PSBESVNBQkxFX0lOVFJTKSB7CisJCQkvKiAgCisJCQkgKiBEaXNhYmxlIFJ4IFRyYWZmaWMgSW50cnMgaW4gdGhlIGdlbmVyYWwgaW50ciBtYXNrIAorCQkJICogcmVnaXN0ZXIuCisJCQkgKi8KKwkJCXdyaXRlcShESVNBQkxFX0FMTF9JTlRSUywgJmJhcjAtPnJ4X3RyYWZmaWNfbWFzayk7CisJCQl0ZW1wNjQgPSByZWFkcSgmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJCQl2YWw2NCB8PSB0ZW1wNjQ7CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwkJfQorCX0KK30KKworLyoqICAKKyAqICB2ZXJpZnlfeGVuYV9xdWllc2NlbmNlIC0gQ2hlY2tzIHdoZXRoZXIgdGhlIEgvVyBpcyByZWFkeSAKKyAqICBAdmFsNjQgOiAgVmFsdWUgcmVhZCBmcm9tIGFkYXB0ZXIgc3RhdHVzIHJlZ2lzdGVyLgorICogIEBmbGFnIDogaW5kaWNhdGVzIGlmIHRoZSBhZGFwdGVyIGVuYWJsZSBiaXQgd2FzIGV2ZXIgd3JpdHRlbiBvbmNlCisgKiAgYmVmb3JlLgorICogIERlc2NyaXB0aW9uOiBSZXR1cm5zIHdoZXRoZXIgdGhlIEgvVyBpcyByZWFkeSB0byBnbyBvciBub3QuIERlcGVuZGluZworICogIG9uIHdoZXRoZXIgYWRhcHRlciBlbmFibGUgYml0IHdhcyB3cml0dGVuIG9yIG5vdCB0aGUgY29tcGFyaXNvbiAKKyAqICBkaWZmZXJzIGFuZCB0aGUgY2FsbGluZyBmdW5jdGlvbiBwYXNzZXMgdGhlIGlucHV0IGFyZ3VtZW50IGZsYWcgdG8KKyAqICBpbmRpY2F0ZSB0aGlzLgorICogIFJldHVybjogMSBJZiB4ZW5hIGlzIHF1aWVzY2VuY2UgCisgKiAgICAgICAgICAwIElmIFhlbmEgaXMgbm90IHF1aWVzY2VuY2UKKyAqLworCitzdGF0aWMgaW50IHZlcmlmeV94ZW5hX3F1aWVzY2VuY2UodTY0IHZhbDY0LCBpbnQgZmxhZykKK3sKKwlpbnQgcmV0ID0gMDsKKwl1NjQgdG1wNjQgPSB+KCh1NjQpIHZhbDY0KTsKKworCWlmICghCisJICAgICh0bXA2NCAmCisJICAgICAoQURBUFRFUl9TVEFUVVNfVERNQV9SRUFEWSB8IEFEQVBURVJfU1RBVFVTX1JETUFfUkVBRFkgfAorCSAgICAgIEFEQVBURVJfU1RBVFVTX1BGQ19SRUFEWSB8IEFEQVBURVJfU1RBVFVTX1RNQUNfQlVGX0VNUFRZIHwKKwkgICAgICBBREFQVEVSX1NUQVRVU19QSUNfUVVJRVNDRU5UIHwgQURBUFRFUl9TVEFUVVNfTUNfRFJBTV9SRUFEWSB8CisJICAgICAgQURBUFRFUl9TVEFUVVNfTUNfUVVFVUVTX1JFQURZIHwgQURBUFRFUl9TVEFUVVNfTV9QTExfTE9DSyB8CisJICAgICAgQURBUFRFUl9TVEFUVVNfUF9QTExfTE9DSykpKSB7CisJCWlmIChmbGFnID09IEZBTFNFKSB7CisJCQlpZiAoISh2YWw2NCAmIEFEQVBURVJfU1RBVFVTX1JNQUNfUENDX0lETEUpICYmCisJCQkgICAgKCh2YWw2NCAmIEFEQVBURVJfU1RBVFVTX1JDX1BSQ19RVUlFU0NFTlQpID09CisJCQkgICAgIEFEQVBURVJfU1RBVFVTX1JDX1BSQ19RVUlFU0NFTlQpKSB7CisKKwkJCQlyZXQgPSAxOworCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoKCh2YWw2NCAmIEFEQVBURVJfU1RBVFVTX1JNQUNfUENDX0lETEUpID09CisJCQkgICAgIEFEQVBURVJfU1RBVFVTX1JNQUNfUENDX0lETEUpICYmCisJCQkgICAgKCEodmFsNjQgJiBBREFQVEVSX1NUQVRVU19SQ19QUkNfUVVJRVNDRU5UKSB8fAorCQkJICAgICAoKHZhbDY0ICYgQURBUFRFUl9TVEFUVVNfUkNfUFJDX1FVSUVTQ0VOVCkgPT0KKwkJCSAgICAgIEFEQVBURVJfU1RBVFVTX1JDX1BSQ19RVUlFU0NFTlQpKSkgeworCisJCQkJcmV0ID0gMTsKKworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBmaXhfbWFjX2FkZHJlc3MgLSAgRml4IGZvciBNYWMgYWRkciBwcm9ibGVtIG9uIEFscGhhIHBsYXRmb3JtcworICogQHNwOiBQb2ludGVyIHRvIGRldmljZSBzcGVjaWZjIHN0cnVjdHVyZQorICogRGVzY3JpcHRpb24gOiAKKyAqIE5ldyBwcm9jZWR1cmUgdG8gY2xlYXIgbWFjIGFkZHJlc3MgcmVhZGluZyAgcHJvYmxlbXMgb24gQWxwaGEgcGxhdGZvcm1zCisgKgorICovCisKK3N0YXRpYyB2b2lkIGZpeF9tYWNfYWRkcmVzcyhuaWNfdCAqIHNwKQoreworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKwl1NjQgdmFsNjQ7CisJaW50IGkgPSAwOworCisJd2hpbGUgKGZpeF9tYWNbaV0gIT0gRU5EX1NJR04pIHsKKwkJd3JpdGVxKGZpeF9tYWNbaSsrXSwgJmJhcjAtPmdwaW9fY29udHJvbCk7CisJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmdwaW9fY29udHJvbCk7CisJfQorfQorCisvKioKKyAqICBzdGFydF9uaWMgLSBUdXJucyB0aGUgZGV2aWNlIG9uICAgCisgKiAgQG5pYyA6IGRldmljZSBwcml2YXRlIHZhcmlhYmxlLgorICogIERlc2NyaXB0aW9uOiAKKyAqICBUaGlzIGZ1bmN0aW9uIGFjdHVhbGx5IHR1cm5zIHRoZSBkZXZpY2Ugb24uIEJlZm9yZSB0aGlzICBmdW5jdGlvbiBpcyAKKyAqICBjYWxsZWQsYWxsIFJlZ2lzdGVycyBhcmUgY29uZmlndXJlZCBmcm9tIHRoZWlyIHJlc2V0IHN0YXRlcyAKKyAqICBhbmQgc2hhcmVkIG1lbW9yeSBpcyBhbGxvY2F0ZWQgYnV0IHRoZSBOSUMgaXMgc3RpbGwgcXVpZXNjZW50LiBPbiAKKyAqICBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIHRoZSBkZXZpY2UgaW50ZXJydXB0cyBhcmUgY2xlYXJlZCBhbmQgdGhlIE5JQyBpcworICogIGxpdGVyYWxseSBzd2l0Y2hlZCBvbiBieSB3cml0aW5nIGludG8gdGhlIGFkYXB0ZXIgY29udHJvbCByZWdpc3Rlci4KKyAqICBSZXR1cm4gVmFsdWU6IAorICogIFNVQ0NFU1Mgb24gc3VjY2VzcyBhbmQgLTEgb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IHN0YXJ0X25pYyhzdHJ1Y3QgczJpb19uaWMgKm5pYykKK3sKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gbmljLT5iYXIwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuaWMtPmRldjsKKwlyZWdpc3RlciB1NjQgdmFsNjQgPSAwOworCXUxNiBpbnRlcnJ1cHRpYmxlLCBpOworCXUxNiBzdWJpZDsKKwltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CisKKwltYWNfY29udHJvbCA9ICZuaWMtPm1hY19jb250cm9sOworCWNvbmZpZyA9ICZuaWMtPmNvbmZpZzsKKworCS8qICBQUkMgSW5pdGlhbGl6YXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CisJCXdyaXRlcSgodTY0KSBuaWMtPnJ4X2Jsb2Nrc1tpXVswXS5ibG9ja19kbWFfYWRkciwKKwkJICAgICAgICZiYXIwLT5wcmNfcnhkMF9uW2ldKTsKKworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5wcmNfY3RybF9uW2ldKTsKKyNpZm5kZWYgQ09ORklHXzJCVUZGX01PREUKKwkJdmFsNjQgfD0gUFJDX0NUUkxfUkNfRU5BQkxFRDsKKyNlbHNlCisJCXZhbDY0IHw9IFBSQ19DVFJMX1JDX0VOQUJMRUQgfCBQUkNfQ1RSTF9SSU5HX01PREVfMzsKKyNlbmRpZgorCQl3cml0ZXEodmFsNjQsICZiYXIwLT5wcmNfY3RybF9uW2ldKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCS8qIEVuYWJsaW5nIDIgYnVmZmVyIG1vZGUgYnkgd3JpdGluZyBpbnRvIFJ4X3BhX2NmZyByZWcuICovCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+cnhfcGFfY2ZnKTsKKwl2YWw2NCB8PSBSWF9QQV9DRkdfSUdOT1JFX0wyX0VSUjsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5yeF9wYV9jZmcpOworI2VuZGlmCisKKwkvKiAKKwkgKiBFbmFibGluZyBNQy1STERSQU0uIEFmdGVyIGVuYWJsaW5nIHRoZSBkZXZpY2UsIHdlIHRpbWVvdXQKKwkgKiBmb3IgYXJvdW5kIDEwMG1zLCB3aGljaCBpcyBhcHByb3hpbWF0ZWx5IHRoZSB0aW1lIHJlcXVpcmVkCisJICogZm9yIHRoZSBkZXZpY2UgdG8gYmUgcmVhZHkgZm9yIG9wZXJhdGlvbi4KKwkgKi8KKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tY19ybGRyYW1fbXJzKTsKKwl2YWw2NCB8PSBNQ19STERSQU1fUVVFVUVfU0laRV9FTkFCTEUgfCBNQ19STERSQU1fTVJTX0VOQUJMRTsKKwlTUEVDSUFMX1JFR19XUklURSh2YWw2NCwgJmJhcjAtPm1jX3JsZHJhbV9tcnMsIFVGKTsKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tY19ybGRyYW1fbXJzKTsKKworCW1zbGVlcCgxMDApOwkJCS8qIERlbGF5IGJ5IGFyb3VuZCAxMDAgbXMuICovCisKKwkvKiBFbmFibGluZyBFQ0MgUHJvdGVjdGlvbi4gKi8KKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCXZhbDY0ICY9IH5BREFQVEVSX0VDQ19FTjsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCisJLyogCisJICogQ2xlYXJpbmcgYW55IHBvc3NpYmxlIExpbmsgc3RhdGUgY2hhbmdlIGludGVycnVwdHMgdGhhdCAKKwkgKiBjb3VsZCBoYXZlIHBvcHBlZCB1cCBqdXN0IGJlZm9yZSBFbmFibGluZyB0aGUgY2FyZC4KKwkgKi8KKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tYWNfcm1hY19lcnJfcmVnKTsKKwlpZiAodmFsNjQpCisJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPm1hY19ybWFjX2Vycl9yZWcpOworCisJLyogCisJICogVmVyaWZ5IGlmIHRoZSBkZXZpY2UgaXMgcmVhZHkgdG8gYmUgZW5hYmxlZCwgaWYgc28gZW5hYmxlIAorCSAqIGl0LgorCSAqLworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfc3RhdHVzKTsKKwlpZiAoIXZlcmlmeV94ZW5hX3F1aWVzY2VuY2UodmFsNjQsIG5pYy0+ZGV2aWNlX2VuYWJsZWRfb25jZSkpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogZGV2aWNlIGlzIG5vdCByZWFkeSwgIiwgZGV2LT5uYW1lKTsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICJBZGFwdGVyIHN0YXR1cyByZWFkczogMHglbGx4XG4iLAorCQkJICAodW5zaWduZWQgbG9uZyBsb25nKSB2YWw2NCk7CisJCXJldHVybiBGQUlMVVJFOworCX0KKworCS8qICBFbmFibGUgc2VsZWN0IGludGVycnVwdHMgKi8KKwlpbnRlcnJ1cHRpYmxlID0gVFhfVFJBRkZJQ19JTlRSIHwgUlhfVFJBRkZJQ19JTlRSIHwgVFhfTUFDX0lOVFIgfAorCSAgICBSWF9NQUNfSU5UUjsKKwllbl9kaXNfYWJsZV9uaWNfaW50cnMobmljLCBpbnRlcnJ1cHRpYmxlLCBFTkFCTEVfSU5UUlMpOworCisJLyogCisJICogV2l0aCBzb21lIHN3aXRjaGVzLCBsaW5rIG1pZ2h0IGJlIGFscmVhZHkgdXAgYXQgdGhpcyBwb2ludC4KKwkgKiBCZWNhdXNlIG9mIHRoaXMgd2VpcmQgYmVoYXZpb3IsIHdoZW4gd2UgZW5hYmxlIGxhc2VyLCAKKwkgKiB3ZSBtYXkgbm90IGdldCBsaW5rLiBXZSBuZWVkIHRvIGhhbmRsZSB0aGlzLiBXZSBjYW5ub3QgCisJICogZmlndXJlIG91dCB3aGljaCBzd2l0Y2ggaXMgbWlzYmVoYXZpbmcuIFNvIHdlIGFyZSBmb3JjZWQgdG8gCisJICogbWFrZSBhIGdsb2JhbCBjaGFuZ2UuIAorCSAqLworCisJLyogRW5hYmxpbmcgTGFzZXIuICovCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+YWRhcHRlcl9jb250cm9sKTsKKwl2YWw2NCB8PSBBREFQVEVSX0VPSV9UWF9PTjsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCisJLyogU1hFLTAwMjogSW5pdGlhbGl6ZSBsaW5rIGFuZCBhY3Rpdml0eSBMRUQgKi8KKwlzdWJpZCA9IG5pYy0+cGRldi0+c3Vic3lzdGVtX2RldmljZTsKKwlpZiAoKHN1YmlkICYgMHhGRikgPj0gMHgwNykgeworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ncGlvX2NvbnRyb2wpOworCQl2YWw2NCB8PSAweDAwMDA4MDAwMDAwMDAwMDBVTEw7CisJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdwaW9fY29udHJvbCk7CisJCXZhbDY0ID0gMHgwNDExMDQwNDAwMDAwMDAwVUxMOworCQl3cml0ZXEodmFsNjQsICh2b2lkIF9faW9tZW0gKikgYmFyMCArIDB4MjcwMCk7CisJfQorCisJLyogCisJICogRG9uJ3Qgc2VlIGxpbmsgc3RhdGUgaW50ZXJydXB0cyBvbiBjZXJ0YWluIHN3aXRjaGVzLCBzbyAKKwkgKiBkaXJlY3RseSBzY2hlZHVsaW5nIGEgbGluayBzdGF0ZSB0YXNrIGZyb20gaGVyZS4KKwkgKi8KKwlzY2hlZHVsZV93b3JrKCZuaWMtPnNldF9saW5rX3Rhc2spOworCisJLyogCisJICogSGVyZSB3ZSBhcmUgcGVyZm9ybWluZyBzb2Z0IHJlc2V0IG9uIFhHWFMgdG8gCisJICogZm9yY2UgbGluayBkb3duLiBTaW5jZSBsaW5rIGlzIGFscmVhZHkgdXAsIHdlIHdpbGwgZ2V0CisJICogbGluayBzdGF0ZSBjaGFuZ2UgaW50ZXJydXB0IGFmdGVyIHRoaXMgcmVzZXQKKwkgKi8KKwlTUEVDSUFMX1JFR19XUklURSgweDgwMDEwNTE1MDAxRTAwMDBVTEwsICZiYXIwLT5kdHhfY29udHJvbCwgVUYpOworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmR0eF9jb250cm9sKTsKKwl1ZGVsYXkoNTApOworCVNQRUNJQUxfUkVHX1dSSVRFKDB4ODAwMTA1MTUwMDFFMDBFMFVMTCwgJmJhcjAtPmR0eF9jb250cm9sLCBVRik7CisJdmFsNjQgPSByZWFkcSgmYmFyMC0+ZHR4X2NvbnRyb2wpOworCXVkZWxheSg1MCk7CisJU1BFQ0lBTF9SRUdfV1JJVEUoMHg4MDA3MDUxNTAwMUYwMEU0VUxMLCAmYmFyMC0+ZHR4X2NvbnRyb2wsIFVGKTsKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5kdHhfY29udHJvbCk7CisJdWRlbGF5KDUwKTsKKworCXJldHVybiBTVUNDRVNTOworfQorCisvKiogCisgKiAgZnJlZV90eF9idWZmZXJzIC0gRnJlZSBhbGwgcXVldWVkIFR4IGJ1ZmZlcnMgCisgKiAgQG5pYyA6IGRldmljZSBwcml2YXRlIHZhcmlhYmxlLgorICogIERlc2NyaXB0aW9uOiAKKyAqICBGcmVlIGFsbCBxdWV1ZWQgVHggYnVmZmVycy4KKyAqICBSZXR1cm4gVmFsdWU6IHZvaWQgCisqLworCitzdGF0aWMgdm9pZCBmcmVlX3R4X2J1ZmZlcnMoc3RydWN0IHMyaW9fbmljICpuaWMpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5pYy0+ZGV2OworCXN0cnVjdCBza19idWZmICpza2I7CisJVHhEX3QgKnR4ZHA7CisJaW50IGksIGo7CisJbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOworCWludCBjbnQgPSAwOworCisJbWFjX2NvbnRyb2wgPSAmbmljLT5tYWNfY29udHJvbDsKKwljb25maWcgPSAmbmljLT5jb25maWc7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT50eF9maWZvX251bTsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBjb25maWctPnR4X2NmZ1tpXS5maWZvX2xlbiAtIDE7IGorKykgeworCQkJdHhkcCA9IChUeERfdCAqKSBuaWMtPmxpc3RfaW5mb1tpXVtqXS4KKwkJCSAgICBsaXN0X3ZpcnRfYWRkcjsKKwkJCXNrYiA9CisJCQkgICAgKHN0cnVjdCBza19idWZmICopICgodW5zaWduZWQgbG9uZykgdHhkcC0+CisJCQkJCQlIb3N0X0NvbnRyb2wpOworCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJbWVtc2V0KHR4ZHAsIDAsIHNpemVvZihUeERfdCkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJbWVtc2V0KHR4ZHAsIDAsIHNpemVvZihUeERfdCkpOworCQkJY250Kys7CisJCX0KKwkJREJHX1BSSU5UKElOVFJfREJHLAorCQkJICAiJXM6Zm9yY2libHkgZnJlZWluZyAlZCBza2JzIG9uIEZJRk8lZFxuIiwKKwkJCSAgZGV2LT5uYW1lLCBjbnQsIGkpOworCQltYWNfY29udHJvbC0+dHhfY3Vycl9nZXRfaW5mb1tpXS5vZmZzZXQgPSAwOworCQltYWNfY29udHJvbC0+dHhfY3Vycl9wdXRfaW5mb1tpXS5vZmZzZXQgPSAwOworCX0KK30KKworLyoqICAKKyAqICAgc3RvcF9uaWMgLSAgVG8gc3RvcCB0aGUgbmljICAKKyAqICAgQG5pYyA7IGRldmljZSBwcml2YXRlIHZhcmlhYmxlLgorICogICBEZXNjcmlwdGlvbjogCisgKiAgIFRoaXMgZnVuY3Rpb24gZG9lcyBleGFjdGx5IHRoZSBvcHBvc2l0ZSBvZiB3aGF0IHRoZSBzdGFydF9uaWMoKSAKKyAqICAgZnVuY3Rpb24gZG9lcy4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gc3RvcCB0aGUgZGV2aWNlLgorICogICBSZXR1cm4gVmFsdWU6CisgKiAgIHZvaWQuCisgKi8KKworc3RhdGljIHZvaWQgc3RvcF9uaWMoc3RydWN0IHMyaW9fbmljICpuaWMpCit7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKKwlyZWdpc3RlciB1NjQgdmFsNjQgPSAwOworCXUxNiBpbnRlcnJ1cHRpYmxlLCBpOworCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKKworCW1hY19jb250cm9sID0gJm5pYy0+bWFjX2NvbnRyb2w7CisJY29uZmlnID0gJm5pYy0+Y29uZmlnOworCisJLyogIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwlpbnRlcnJ1cHRpYmxlID0gVFhfVFJBRkZJQ19JTlRSIHwgUlhfVFJBRkZJQ19JTlRSIHwgVFhfTUFDX0lOVFIgfAorCSAgICBSWF9NQUNfSU5UUjsKKwllbl9kaXNfYWJsZV9uaWNfaW50cnMobmljLCBpbnRlcnJ1cHRpYmxlLCBESVNBQkxFX0lOVFJTKTsKKworCS8qICBEaXNhYmxlIFBSQ3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CisJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnByY19jdHJsX25baV0pOworCQl2YWw2NCAmPSB+KCh1NjQpIFBSQ19DVFJMX1JDX0VOQUJMRUQpOworCQl3cml0ZXEodmFsNjQsICZiYXIwLT5wcmNfY3RybF9uW2ldKTsKKwl9Cit9CisKKy8qKiAgCisgKiAgZmlsbF9yeF9idWZmZXJzIC0gQWxsb2NhdGVzIHRoZSBSeCBzaWRlIHNrYnMgCisgKiAgQG5pYzogIGRldmljZSBwcml2YXRlIHZhcmlhYmxlCisgKiAgQHJpbmdfbm86IHJpbmcgbnVtYmVyIAorICogIERlc2NyaXB0aW9uOiAKKyAqICBUaGUgZnVuY3Rpb24gYWxsb2NhdGVzIFJ4IHNpZGUgc2ticyBhbmQgcHV0cyB0aGUgcGh5c2ljYWwKKyAqICBhZGRyZXNzIG9mIHRoZXNlIGJ1ZmZlcnMgaW50byB0aGUgUnhEIGJ1ZmZlciBwb2ludGVycywgc28gdGhhdCB0aGUgTklDCisgKiAgY2FuIERNQSB0aGUgcmVjZWl2ZWQgZnJhbWUgaW50byB0aGVzZSBsb2NhdGlvbnMuCisgKiAgVGhlIE5JQyBzdXBwb3J0cyAzIHJlY2VpdmUgbW9kZXMsIHZpegorICogIDEuIHNpbmdsZSBidWZmZXIsCisgKiAgMi4gdGhyZWUgYnVmZmVyIGFuZAorICogIDMuIEZpdmUgYnVmZmVyIG1vZGVzLgorICogIEVhY2ggbW9kZSBkZWZpbmVzIGhvdyBtYW55IGZyYWdtZW50cyB0aGUgcmVjZWl2ZWQgZnJhbWUgd2lsbCBiZSBzcGxpdCAKKyAqICB1cCBpbnRvIGJ5IHRoZSBOSUMuIFRoZSBmcmFtZSBpcyBzcGxpdCBpbnRvIEwzIGhlYWRlciwgTDQgSGVhZGVyLCAKKyAqICBMNCBwYXlsb2FkIGluIHRocmVlIGJ1ZmZlciBtb2RlIGFuZCBpbiA1IGJ1ZmZlciBtb2RlLCBMNCBwYXlsb2FkIGl0c2VsZgorICogIGlzIHNwbGl0IGludG8gMyBmcmFnbWVudHMuIEFzIG9mIG5vdyBvbmx5IHNpbmdsZSBidWZmZXIgbW9kZSBpcworICogIHN1cHBvcnRlZC4KKyAqICAgUmV0dXJuIFZhbHVlOgorICogIFNVQ0NFU1Mgb24gc3VjY2VzcyBvciBhbiBhcHByb3ByaWF0ZSAtdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IGZpbGxfcnhfYnVmZmVycyhzdHJ1Y3QgczJpb19uaWMgKm5pYywgaW50IHJpbmdfbm8pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5pYy0+ZGV2OworCXN0cnVjdCBza19idWZmICpza2I7CisJUnhEX3QgKnJ4ZHA7CisJaW50IG9mZiwgb2ZmMSwgc2l6ZSwgYmxvY2tfbm8sIGJsb2NrX25vMTsKKwlpbnQgb2Zmc2V0LCBvZmZzZXQxOworCXUzMiBhbGxvY190YWIgPSAwOworCXUzMiBhbGxvY19jbnQgPSBuaWMtPnBrdF9jbnRbcmluZ19ub10gLQorCSAgICBhdG9taWNfcmVhZCgmbmljLT5yeF9idWZzX2xlZnRbcmluZ19ub10pOworCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKKyNpZmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCVJ4RF90ICpyeGRwbmV4dDsKKwlpbnQgbmV4dGJsazsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlidWZmQWRkX3QgKmJhOworCWRtYV9hZGRyX3QgcnhkcHBoeXM7CisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX1MySU9fTkFQSQorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjZW5kaWYKKworCW1hY19jb250cm9sID0gJm5pYy0+bWFjX2NvbnRyb2w7CisJY29uZmlnID0gJm5pYy0+Y29uZmlnOworCisJc2l6ZSA9IGRldi0+bXR1ICsgSEVBREVSX0VUSEVSTkVUX0lJXzgwMl8zX1NJWkUgKworCSAgICBIRUFERVJfODAyXzJfU0laRSArIEhFQURFUl9TTkFQX1NJWkU7CisKKwl3aGlsZSAoYWxsb2NfdGFiIDwgYWxsb2NfY250KSB7CisJCWJsb2NrX25vID0gbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9bcmluZ19ub10uCisJCSAgICBibG9ja19pbmRleDsKKwkJYmxvY2tfbm8xID0gbWFjX2NvbnRyb2wtPnJ4X2N1cnJfZ2V0X2luZm9bcmluZ19ub10uCisJCSAgICBibG9ja19pbmRleDsKKwkJb2ZmID0gbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9bcmluZ19ub10ub2Zmc2V0OworCQlvZmYxID0gbWFjX2NvbnRyb2wtPnJ4X2N1cnJfZ2V0X2luZm9bcmluZ19ub10ub2Zmc2V0OworI2lmbmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCQlvZmZzZXQgPSBibG9ja19ubyAqIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKSArIG9mZjsKKwkJb2Zmc2V0MSA9IGJsb2NrX25vMSAqIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKSArIG9mZjE7CisjZWxzZQorCQlvZmZzZXQgPSBibG9ja19ubyAqIChNQVhfUlhEU19QRVJfQkxPQ0spICsgb2ZmOworCQlvZmZzZXQxID0gYmxvY2tfbm8xICogKE1BWF9SWERTX1BFUl9CTE9DSykgKyBvZmYxOworI2VuZGlmCisKKwkJcnhkcCA9IG5pYy0+cnhfYmxvY2tzW3Jpbmdfbm9dW2Jsb2NrX25vXS4KKwkJICAgIGJsb2NrX3ZpcnRfYWRkciArIG9mZjsKKwkJaWYgKChvZmZzZXQgPT0gb2Zmc2V0MSkgJiYgKHJ4ZHAtPkhvc3RfQ29udHJvbCkpIHsKKwkJCURCR19QUklOVChJTlRSX0RCRywgIiVzOiBHZXQgYW5kIFB1dCIsIGRldi0+bmFtZSk7CisJCQlEQkdfUFJJTlQoSU5UUl9EQkcsICIgaW5mbyBlcXVhdGVkXG4iKTsKKwkJCWdvdG8gZW5kOworCQl9CisjaWZuZGVmCUNPTkZJR18yQlVGRl9NT0RFCisJCWlmIChyeGRwLT5Db250cm9sXzEgPT0gRU5EX09GX0JMT0NLKSB7CisJCQltYWNfY29udHJvbC0+cnhfY3Vycl9wdXRfaW5mb1tyaW5nX25vXS4KKwkJCSAgICBibG9ja19pbmRleCsrOworCQkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9bcmluZ19ub10uCisJCQkgICAgYmxvY2tfaW5kZXggJT0gbmljLT5ibG9ja19jb3VudFtyaW5nX25vXTsKKwkJCWJsb2NrX25vID0gbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm8KKwkJCSAgICBbcmluZ19ub10uYmxvY2tfaW5kZXg7CisJCQlvZmYrKzsKKwkJCW9mZiAlPSAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSk7CisJCQltYWNfY29udHJvbC0+cnhfY3Vycl9wdXRfaW5mb1tyaW5nX25vXS5vZmZzZXQgPQorCQkJICAgIG9mZjsKKwkJCXJ4ZHAgPSAoUnhEX3QgKikgKCh1bnNpZ25lZCBsb25nKSByeGRwLT5Db250cm9sXzIpOworCQkJREJHX1BSSU5UKElOVFJfREJHLCAiJXM6IE5leHQgYmxvY2sgYXQ6ICVwXG4iLAorCQkJCSAgZGV2LT5uYW1lLCByeGRwKTsKKwkJfQorI2lmbmRlZiBDT05GSUdfUzJJT19OQVBJCisJCXNwaW5fbG9ja19pcnFzYXZlKCZuaWMtPnB1dF9sb2NrLCBmbGFncyk7CisJCW5pYy0+cHV0X3Bvc1tyaW5nX25vXSA9CisJCSAgICAoYmxvY2tfbm8gKiAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSkpICsgb2ZmOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuaWMtPnB1dF9sb2NrLCBmbGFncyk7CisjZW5kaWYKKyNlbHNlCisJCWlmIChyeGRwLT5Ib3N0X0NvbnRyb2wgPT0gRU5EX09GX0JMT0NLKSB7CisJCQltYWNfY29udHJvbC0+cnhfY3Vycl9wdXRfaW5mb1tyaW5nX25vXS4KKwkJCSAgICBibG9ja19pbmRleCsrOworCQkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9bcmluZ19ub10uCisJCQkgICAgYmxvY2tfaW5kZXggJT0gbmljLT5ibG9ja19jb3VudFtyaW5nX25vXTsKKwkJCWJsb2NrX25vID0gbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm8KKwkJCSAgICBbcmluZ19ub10uYmxvY2tfaW5kZXg7CisJCQlvZmYgPSAwOworCQkJREJHX1BSSU5UKElOVFJfREJHLCAiJXM6IGJsb2NrJWQgYXQ6IDB4JWxseFxuIiwKKwkJCQkgIGRldi0+bmFtZSwgYmxvY2tfbm8sCisJCQkJICAodW5zaWduZWQgbG9uZyBsb25nKSByeGRwLT5Db250cm9sXzEpOworCQkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9bcmluZ19ub10ub2Zmc2V0ID0KKwkJCSAgICBvZmY7CisJCQlyeGRwID0gbmljLT5yeF9ibG9ja3NbcmluZ19ub11bYmxvY2tfbm9dLgorCQkJICAgIGJsb2NrX3ZpcnRfYWRkcjsKKwkJfQorI2lmbmRlZiBDT05GSUdfUzJJT19OQVBJCisJCXNwaW5fbG9ja19pcnFzYXZlKCZuaWMtPnB1dF9sb2NrLCBmbGFncyk7CisJCW5pYy0+cHV0X3Bvc1tyaW5nX25vXSA9IChibG9ja19ubyAqCisJCQkJCSAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSkpICsgb2ZmOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuaWMtPnB1dF9sb2NrLCBmbGFncyk7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmCUNPTkZJR18yQlVGRl9NT0RFCisJCWlmIChyeGRwLT5Db250cm9sXzEgJiBSWERfT1dOX1hFTkEpCisjZWxzZQorCQlpZiAocnhkcC0+Q29udHJvbF8yICYgQklUKDApKQorI2VuZGlmCisJCXsKKwkJCW1hY19jb250cm9sLT5yeF9jdXJyX3B1dF9pbmZvW3Jpbmdfbm9dLgorCQkJICAgIG9mZnNldCA9IG9mZjsKKwkJCWdvdG8gZW5kOworCQl9CisjaWZkZWYJQ09ORklHXzJCVUZGX01PREUKKwkJLyogCisJCSAqIFJ4RHMgU3Bhbm5pbmcgY2FjaGUgbGluZXMgd2lsbCBiZSByZXBsZW5pc2hlZCBvbmx5IAorCQkgKiBpZiB0aGUgc3VjY2VlZGluZyBSeEQgaXMgYWxzbyBvd25lZCBieSBIb3N0LiBJdCAKKwkJICogd2lsbCBhbHdheXMgYmUgdGhlICgoOCppKSszKSBhbmQgKCg4KmkpKzYpIAorCQkgKiBkZXNjcmlwdG9ycyBmb3IgdGhlIDQ4IGJ5dGUgZGVzY3JpcHRvci4gVGhlIG9mZmVuZGluZyAKKwkJICogZGVjc3JpcHRvciBpcyBvZi1jb3Vyc2UgdGhlIDNyZCBkZXNjcmlwdG9yLgorCQkgKi8KKwkJcnhkcHBoeXMgPSBuaWMtPnJ4X2Jsb2Nrc1tyaW5nX25vXVtibG9ja19ub10uCisJCSAgICBibG9ja19kbWFfYWRkciArIChvZmYgKiBzaXplb2YoUnhEX3QpKTsKKwkJaWYgKCgodTY0KSAocnhkcHBoeXMpKSAlIDEyOCA+IDgwKSB7CisJCQlyeGRwbmV4dCA9IG5pYy0+cnhfYmxvY2tzW3Jpbmdfbm9dW2Jsb2NrX25vXS4KKwkJCSAgICBibG9ja192aXJ0X2FkZHIgKyAob2ZmICsgMSk7CisJCQlpZiAocnhkcG5leHQtPkhvc3RfQ29udHJvbCA9PSBFTkRfT0ZfQkxPQ0spIHsKKwkJCQluZXh0YmxrID0gKGJsb2NrX25vICsgMSkgJQorCQkJCSAgICAobmljLT5ibG9ja19jb3VudFtyaW5nX25vXSk7CisJCQkJcnhkcG5leHQgPSBuaWMtPnJ4X2Jsb2Nrc1tyaW5nX25vXQorCQkJCSAgICBbbmV4dGJsa10uYmxvY2tfdmlydF9hZGRyOworCQkJfQorCQkJaWYgKHJ4ZHBuZXh0LT5Db250cm9sXzIgJiBCSVQoMCkpCisJCQkJZ290byBlbmQ7CisJCX0KKyNlbmRpZgorCisjaWZuZGVmCUNPTkZJR18yQlVGRl9NT0RFCisJCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZSArIE5FVF9JUF9BTElHTik7CisjZWxzZQorCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGRldi0+bXR1ICsgQUxJR05fU0laRSArIEJVRjBfTEVOICsgNCk7CisjZW5kaWYKKwkJaWYgKCFza2IpIHsKKwkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IE91dCBvZiAiLCBkZXYtPm5hbWUpOworCQkJREJHX1BSSU5UKEVSUl9EQkcsICJtZW1vcnkgdG8gYWxsb2NhdGUgU0tCc1xuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorI2lmbmRlZglDT05GSUdfMkJVRkZfTU9ERQorCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CisJCW1lbXNldChyeGRwLCAwLCBzaXplb2YoUnhEX3QpKTsKKwkJcnhkcC0+QnVmZmVyMF9wdHIgPSBwY2lfbWFwX3NpbmdsZQorCQkgICAgKG5pYy0+cGRldiwgc2tiLT5kYXRhLCBzaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlyeGRwLT5Db250cm9sXzIgJj0gKH5NQVNLX0JVRkZFUjBfU0laRSk7CisJCXJ4ZHAtPkNvbnRyb2xfMiB8PSBTRVRfQlVGRkVSMF9TSVpFKHNpemUpOworCQlyeGRwLT5Ib3N0X0NvbnRyb2wgPSAodW5zaWduZWQgbG9uZykgKHNrYik7CisJCXJ4ZHAtPkNvbnRyb2xfMSB8PSBSWERfT1dOX1hFTkE7CisJCW9mZisrOworCQlvZmYgJT0gKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpOworCQltYWNfY29udHJvbC0+cnhfY3Vycl9wdXRfaW5mb1tyaW5nX25vXS5vZmZzZXQgPSBvZmY7CisjZWxzZQorCQliYSA9ICZuaWMtPmJhW3Jpbmdfbm9dW2Jsb2NrX25vXVtvZmZdOworCQlza2JfcmVzZXJ2ZShza2IsIEJVRjBfTEVOKTsKKwkJdG1wID0gKHVuc2lnbmVkIGxvbmcpIHNrYi0+ZGF0YTsKKwkJdG1wICs9IEFMSUdOX1NJWkU7CisJCXRtcCAmPSB+QUxJR05fU0laRTsKKwkJc2tiLT5kYXRhID0gKHZvaWQgKikgdG1wOworCQlza2ItPnRhaWwgPSAodm9pZCAqKSB0bXA7CisKKwkJbWVtc2V0KHJ4ZHAsIDAsIHNpemVvZihSeERfdCkpOworCQlyeGRwLT5CdWZmZXIyX3B0ciA9IHBjaV9tYXBfc2luZ2xlCisJCSAgICAobmljLT5wZGV2LCBza2ItPmRhdGEsIGRldi0+bXR1ICsgQlVGMF9MRU4gKyA0LAorCQkgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCXJ4ZHAtPkJ1ZmZlcjBfcHRyID0KKwkJICAgIHBjaV9tYXBfc2luZ2xlKG5pYy0+cGRldiwgYmEtPmJhXzAsIEJVRjBfTEVOLAorCQkJCSAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCXJ4ZHAtPkJ1ZmZlcjFfcHRyID0KKwkJICAgIHBjaV9tYXBfc2luZ2xlKG5pYy0+cGRldiwgYmEtPmJhXzEsIEJVRjFfTEVOLAorCQkJCSAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJcnhkcC0+Q29udHJvbF8yID0gU0VUX0JVRkZFUjJfU0laRShkZXYtPm10dSArIDQpOworCQlyeGRwLT5Db250cm9sXzIgfD0gU0VUX0JVRkZFUjBfU0laRShCVUYwX0xFTik7CisJCXJ4ZHAtPkNvbnRyb2xfMiB8PSBTRVRfQlVGRkVSMV9TSVpFKDEpOwkvKiBkdW1teS4gKi8KKwkJcnhkcC0+Q29udHJvbF8yIHw9IEJJVCgwKTsJLyogU2V0IEJ1ZmZlcl9FbXB0eSBiaXQuICovCisJCXJ4ZHAtPkhvc3RfQ29udHJvbCA9ICh1NjQpICgodW5zaWduZWQgbG9uZykgKHNrYikpOworCQlyeGRwLT5Db250cm9sXzEgfD0gUlhEX09XTl9YRU5BOworCQlvZmYrKzsKKwkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9bcmluZ19ub10ub2Zmc2V0ID0gb2ZmOworI2VuZGlmCisJCWF0b21pY19pbmMoJm5pYy0+cnhfYnVmc19sZWZ0W3Jpbmdfbm9dKTsKKwkJYWxsb2NfdGFiKys7CisJfQorCisgICAgICBlbmQ6CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICogIGZyZWVfcnhfYnVmZmVycyAtIEZyZWVzIGFsbCBSeCBidWZmZXJzICAgCisgKiAgQHNwOiBkZXZpY2UgcHJpdmF0ZSB2YXJpYWJsZS4KKyAqICBEZXNjcmlwdGlvbjogCisgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGZyZWUgYWxsIFJ4IGJ1ZmZlcnMgYWxsb2NhdGVkIGJ5IGhvc3QuCisgKiAgUmV0dXJuIFZhbHVlOgorICogIE5PTkUuCisgKi8KKworc3RhdGljIHZvaWQgZnJlZV9yeF9idWZmZXJzKHN0cnVjdCBzMmlvX25pYyAqc3ApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNwLT5kZXY7CisJaW50IGksIGosIGJsayA9IDAsIG9mZiwgYnVmX2NudCA9IDA7CisJUnhEX3QgKnJ4ZHA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CisjaWZkZWYgQ09ORklHXzJCVUZGX01PREUKKwlidWZmQWRkX3QgKmJhOworI2VuZGlmCisKKwltYWNfY29udHJvbCA9ICZzcC0+bWFjX2NvbnRyb2w7CisJY29uZmlnID0gJnNwLT5jb25maWc7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CisJCWZvciAoaiA9IDAsIGJsayA9IDA7IGogPCBjb25maWctPnJ4X2NmZ1tpXS5udW1fcnhkOyBqKyspIHsKKwkJCW9mZiA9IGogJSAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSk7CisJCQlyeGRwID0gc3AtPnJ4X2Jsb2Nrc1tpXVtibGtdLmJsb2NrX3ZpcnRfYWRkciArIG9mZjsKKworI2lmbmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCQkJaWYgKHJ4ZHAtPkNvbnRyb2xfMSA9PSBFTkRfT0ZfQkxPQ0spIHsKKwkJCQlyeGRwID0KKwkJCQkgICAgKFJ4RF90ICopICgodW5zaWduZWQgbG9uZykgcnhkcC0+CisJCQkJCSAgICAgICBDb250cm9sXzIpOworCQkJCWorKzsKKwkJCQlibGsrKzsKKwkJCX0KKyNlbHNlCisJCQlpZiAocnhkcC0+SG9zdF9Db250cm9sID09IEVORF9PRl9CTE9DSykgeworCQkJCWJsaysrOworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmCisKKwkJCWlmICghKHJ4ZHAtPkNvbnRyb2xfMSAmIFJYRF9PV05fWEVOQSkpIHsKKwkJCQltZW1zZXQocnhkcCwgMCwgc2l6ZW9mKFJ4RF90KSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXNrYiA9CisJCQkgICAgKHN0cnVjdCBza19idWZmICopICgodW5zaWduZWQgbG9uZykgcnhkcC0+CisJCQkJCQlIb3N0X0NvbnRyb2wpOworCQkJaWYgKHNrYikgeworI2lmbmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCQkJCXBjaV91bm1hcF9zaW5nbGUoc3AtPnBkZXYsIChkbWFfYWRkcl90KQorCQkJCQkJIHJ4ZHAtPkJ1ZmZlcjBfcHRyLAorCQkJCQkJIGRldi0+bXR1ICsKKwkJCQkJCSBIRUFERVJfRVRIRVJORVRfSUlfODAyXzNfU0laRQorCQkJCQkJICsgSEVBREVSXzgwMl8yX1NJWkUgKworCQkJCQkJIEhFQURFUl9TTkFQX1NJWkUsCisJCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKyNlbHNlCisJCQkJYmEgPSAmc3AtPmJhW2ldW2Jsa11bb2ZmXTsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHNwLT5wZGV2LCAoZG1hX2FkZHJfdCkKKwkJCQkJCSByeGRwLT5CdWZmZXIwX3B0ciwKKwkJCQkJCSBCVUYwX0xFTiwKKwkJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCXBjaV91bm1hcF9zaW5nbGUoc3AtPnBkZXYsIChkbWFfYWRkcl90KQorCQkJCQkJIHJ4ZHAtPkJ1ZmZlcjFfcHRyLAorCQkJCQkJIEJVRjFfTEVOLAorCQkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJcGNpX3VubWFwX3NpbmdsZShzcC0+cGRldiwgKGRtYV9hZGRyX3QpCisJCQkJCQkgcnhkcC0+QnVmZmVyMl9wdHIsCisJCQkJCQkgZGV2LT5tdHUgKyBCVUYwX0xFTiArIDQsCisJCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKyNlbmRpZgorCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCQlhdG9taWNfZGVjKCZzcC0+cnhfYnVmc19sZWZ0W2ldKTsKKwkJCQlidWZfY250Kys7CisJCQl9CisJCQltZW1zZXQocnhkcCwgMCwgc2l6ZW9mKFJ4RF90KSk7CisJCX0KKwkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfcHV0X2luZm9baV0uYmxvY2tfaW5kZXggPSAwOworCQltYWNfY29udHJvbC0+cnhfY3Vycl9nZXRfaW5mb1tpXS5ibG9ja19pbmRleCA9IDA7CisJCW1hY19jb250cm9sLT5yeF9jdXJyX3B1dF9pbmZvW2ldLm9mZnNldCA9IDA7CisJCW1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldLm9mZnNldCA9IDA7CisJCWF0b21pY19zZXQoJnNwLT5yeF9idWZzX2xlZnRbaV0sIDApOworCQlEQkdfUFJJTlQoSU5JVF9EQkcsICIlczpGcmVlZCAweCV4IFJ4IEJ1ZmZlcnMgb24gcmluZyVkXG4iLAorCQkJICBkZXYtPm5hbWUsIGJ1Zl9jbnQsIGkpOworCX0KK30KKworLyoqCisgKiBzMmlvX3BvbGwgLSBSeCBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgTkFQSSBzdXBwb3J0CisgKiBAZGV2IDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KKyAqIEBidWRnZXQgOiBUaGUgbnVtYmVyIG9mIHBhY2tldHMgdGhhdCB3ZXJlIGJ1ZGdldGVkIHRvIGJlIHByb2Nlc3NlZCAKKyAqIGR1cmluZyAgb25lIHBhc3MgdGhyb3VnaCB0aGUgJ1BvbGwiIGZ1bmN0aW9uLgorICogRGVzY3JpcHRpb246CisgKiBDb21lcyBpbnRvIHBpY3R1cmUgb25seSBpZiBOQVBJIHN1cHBvcnQgaGFzIGJlZW4gaW5jb3Jwb3JhdGVkLiBJdCBkb2VzCisgKiB0aGUgc2FtZSB0aGluZyB0aGF0IHJ4X2ludHJfaGFuZGxlciBkb2VzLCBidXQgbm90IGluIGEgaW50ZXJydXB0IGNvbnRleHQKKyAqIGFsc28gSXQgd2lsbCBwcm9jZXNzIG9ubHkgYSBnaXZlbiBudW1iZXIgb2YgcGFja2V0cy4KKyAqIFJldHVybiB2YWx1ZToKKyAqIDAgb24gc3VjY2VzcyBhbmQgMSBpZiB0aGVyZSBhcmUgTm8gUnggcGFja2V0cyB0byBiZSBwcm9jZXNzZWQuCisgKi8KKworI2lmZGVmIENPTkZJR19TMklPX05BUEkKK3N0YXRpYyBpbnQgczJpb19wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQoreworCW5pY190ICpuaWMgPSBkZXYtPnByaXY7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKKwlpbnQgcGt0c190b19wcm9jZXNzID0gKmJ1ZGdldCwgcGt0X2NudCA9IDA7CisJcmVnaXN0ZXIgdTY0IHZhbDY0ID0gMDsKKwlyeF9jdXJyX2dldF9pbmZvX3QgZ2V0X2luZm8sIHB1dF9pbmZvOworCWludCBpLCBnZXRfYmxvY2ssIHB1dF9ibG9jaywgZ2V0X29mZnNldCwgcHV0X29mZnNldCwgcmluZ19idWZzOworI2lmbmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCXUxNiB2YWwxNiwgY2tzdW07CisjZW5kaWYKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCVJ4RF90ICpyeGRwOworCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKKyNpZmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCWJ1ZmZBZGRfdCAqYmE7CisjZW5kaWYKKworCW1hY19jb250cm9sID0gJm5pYy0+bWFjX2NvbnRyb2w7CisJY29uZmlnID0gJm5pYy0+Y29uZmlnOworCisJaWYgKHBrdHNfdG9fcHJvY2VzcyA+IGRldi0+cXVvdGEpCisJCXBrdHNfdG9fcHJvY2VzcyA9IGRldi0+cXVvdGE7CisKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5yeF90cmFmZmljX2ludCk7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cnhfdHJhZmZpY19pbnQpOworCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgeworCQlnZXRfaW5mbyA9IG1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldOworCQlnZXRfYmxvY2sgPSBnZXRfaW5mby5ibG9ja19pbmRleDsKKwkJcHV0X2luZm8gPSBtYWNfY29udHJvbC0+cnhfY3Vycl9wdXRfaW5mb1tpXTsKKwkJcHV0X2Jsb2NrID0gcHV0X2luZm8uYmxvY2tfaW5kZXg7CisJCXJpbmdfYnVmcyA9IGNvbmZpZy0+cnhfY2ZnW2ldLm51bV9yeGQ7CisJCXJ4ZHAgPSBuaWMtPnJ4X2Jsb2Nrc1tpXVtnZXRfYmxvY2tdLmJsb2NrX3ZpcnRfYWRkciArCisJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisjaWZuZGVmCUNPTkZJR18yQlVGRl9NT0RFCisJCWdldF9vZmZzZXQgPSAoZ2V0X2Jsb2NrICogKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpKSArCisJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisJCXB1dF9vZmZzZXQgPSAocHV0X2Jsb2NrICogKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpKSArCisJCSAgICBwdXRfaW5mby5vZmZzZXQ7CisJCXdoaWxlICgoIShyeGRwLT5Db250cm9sXzEgJiBSWERfT1dOX1hFTkEpKSAmJgorCQkgICAgICAgKCgoZ2V0X29mZnNldCArIDEpICUgcmluZ19idWZzKSAhPSBwdXRfb2Zmc2V0KSkgeworCQkJaWYgKC0tcGt0c190b19wcm9jZXNzIDwgMCkgeworCQkJCWdvdG8gbm9fcng7CisJCQl9CisJCQlpZiAocnhkcC0+Q29udHJvbF8xID09IEVORF9PRl9CTE9DSykgeworCQkJCXJ4ZHAgPQorCQkJCSAgICAoUnhEX3QgKikgKCh1bnNpZ25lZCBsb25nKSByeGRwLT4KKwkJCQkJICAgICAgIENvbnRyb2xfMik7CisJCQkJZ2V0X2luZm8ub2Zmc2V0Kys7CisJCQkJZ2V0X2luZm8ub2Zmc2V0ICU9CisJCQkJICAgIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKTsKKwkJCQlnZXRfYmxvY2srKzsKKwkJCQlnZXRfYmxvY2sgJT0gbmljLT5ibG9ja19jb3VudFtpXTsKKwkJCQltYWNfY29udHJvbC0+cnhfY3Vycl9nZXRfaW5mb1tpXS4KKwkJCQkgICAgb2Zmc2V0ID0gZ2V0X2luZm8ub2Zmc2V0OworCQkJCW1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldLgorCQkJCSAgICBibG9ja19pbmRleCA9IGdldF9ibG9jazsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWdldF9vZmZzZXQgPQorCQkJICAgIChnZXRfYmxvY2sgKiAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSkpICsKKwkJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisJCQlza2IgPQorCQkJICAgIChzdHJ1Y3Qgc2tfYnVmZiAqKSAoKHVuc2lnbmVkIGxvbmcpIHJ4ZHAtPgorCQkJCQkJSG9zdF9Db250cm9sKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IFRoZSBza2IgaXMgIiwKKwkJCQkJICBkZXYtPm5hbWUpOworCQkJCURCR19QUklOVChFUlJfREJHLCAiTnVsbCBpbiBSeCBJbnRyXG4iKTsKKwkJCQlnb3RvIG5vX3J4OworCQkJfQorCQkJdmFsNjQgPSBSWERfR0VUX0JVRkZFUjBfU0laRShyeGRwLT5Db250cm9sXzIpOworCQkJdmFsMTYgPSAodTE2KSAodmFsNjQgPj4gNDgpOworCQkJY2tzdW0gPSBSWERfR0VUX0w0X0NLU1VNKHJ4ZHAtPkNvbnRyb2xfMSk7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwgKGRtYV9hZGRyX3QpCisJCQkJCSByeGRwLT5CdWZmZXIwX3B0ciwKKwkJCQkJIGRldi0+bXR1ICsKKwkJCQkJIEhFQURFUl9FVEhFUk5FVF9JSV84MDJfM19TSVpFICsKKwkJCQkJIEhFQURFUl84MDJfMl9TSVpFICsKKwkJCQkJIEhFQURFUl9TTkFQX1NJWkUsCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJcnhfb3NtX2hhbmRsZXIobmljLCB2YWwxNiwgcnhkcCwgaSk7CisJCQlwa3RfY250Kys7CisJCQlnZXRfaW5mby5vZmZzZXQrKzsKKwkJCWdldF9pbmZvLm9mZnNldCAlPSAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSk7CisJCQlyeGRwID0KKwkJCSAgICBuaWMtPnJ4X2Jsb2Nrc1tpXVtnZXRfYmxvY2tdLmJsb2NrX3ZpcnRfYWRkciArCisJCQkgICAgZ2V0X2luZm8ub2Zmc2V0OworCQkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfZ2V0X2luZm9baV0ub2Zmc2V0ID0KKwkJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisJCX0KKyNlbHNlCisJCWdldF9vZmZzZXQgPSAoZ2V0X2Jsb2NrICogKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpKSArCisJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisJCXB1dF9vZmZzZXQgPSAocHV0X2Jsb2NrICogKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpKSArCisJCSAgICBwdXRfaW5mby5vZmZzZXQ7CisJCXdoaWxlICgoKCEocnhkcC0+Q29udHJvbF8xICYgUlhEX09XTl9YRU5BKSkgJiYKKwkJCSEocnhkcC0+Q29udHJvbF8yICYgQklUKDApKSkgJiYKKwkJICAgICAgICgoKGdldF9vZmZzZXQgKyAxKSAlIHJpbmdfYnVmcykgIT0gcHV0X29mZnNldCkpIHsKKwkJCWlmICgtLXBrdHNfdG9fcHJvY2VzcyA8IDApIHsKKwkJCQlnb3RvIG5vX3J4OworCQkJfQorCQkJc2tiID0gKHN0cnVjdCBza19idWZmICopICgodW5zaWduZWQgbG9uZykKKwkJCQkJCSAgcnhkcC0+SG9zdF9Db250cm9sKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IFRoZSBza2IgaXMgIiwKKwkJCQkJICBkZXYtPm5hbWUpOworCQkJCURCR19QUklOVChFUlJfREJHLCAiTnVsbCBpbiBSeCBJbnRyXG4iKTsKKwkJCQlnb3RvIG5vX3J4OworCQkJfQorCisJCQlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwgKGRtYV9hZGRyX3QpCisJCQkJCSByeGRwLT5CdWZmZXIwX3B0ciwKKwkJCQkJIEJVRjBfTEVOLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJcGNpX3VubWFwX3NpbmdsZShuaWMtPnBkZXYsIChkbWFfYWRkcl90KQorCQkJCQkgcnhkcC0+QnVmZmVyMV9wdHIsCisJCQkJCSBCVUYxX0xFTiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXBjaV91bm1hcF9zaW5nbGUobmljLT5wZGV2LCAoZG1hX2FkZHJfdCkKKwkJCQkJIHJ4ZHAtPkJ1ZmZlcjJfcHRyLAorCQkJCQkgZGV2LT5tdHUgKyBCVUYwX0xFTiArIDQsCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJYmEgPSAmbmljLT5iYVtpXVtnZXRfYmxvY2tdW2dldF9pbmZvLm9mZnNldF07CisKKwkJCXJ4X29zbV9oYW5kbGVyKG5pYywgcnhkcCwgaSwgYmEpOworCisJCQlnZXRfaW5mby5vZmZzZXQrKzsKKwkJCW1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldLm9mZnNldCA9CisJCQkgICAgZ2V0X2luZm8ub2Zmc2V0OworCQkJcnhkcCA9CisJCQkgICAgbmljLT5yeF9ibG9ja3NbaV1bZ2V0X2Jsb2NrXS5ibG9ja192aXJ0X2FkZHIgKworCQkJICAgIGdldF9pbmZvLm9mZnNldDsKKworCQkJaWYgKGdldF9pbmZvLm9mZnNldCAmJgorCQkJICAgICghKGdldF9pbmZvLm9mZnNldCAlIE1BWF9SWERTX1BFUl9CTE9DSykpKSB7CisJCQkJZ2V0X2luZm8ub2Zmc2V0ID0gMDsKKwkJCQltYWNfY29udHJvbC0+cnhfY3Vycl9nZXRfaW5mb1tpXS4KKwkJCQkgICAgb2Zmc2V0ID0gZ2V0X2luZm8ub2Zmc2V0OworCQkJCWdldF9ibG9jaysrOworCQkJCWdldF9ibG9jayAlPSBuaWMtPmJsb2NrX2NvdW50W2ldOworCQkJCW1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldLgorCQkJCSAgICBibG9ja19pbmRleCA9IGdldF9ibG9jazsKKwkJCQlyeGRwID0KKwkJCQkgICAgbmljLT5yeF9ibG9ja3NbaV1bZ2V0X2Jsb2NrXS4KKwkJCQkgICAgYmxvY2tfdmlydF9hZGRyOworCQkJfQorCQkJZ2V0X29mZnNldCA9CisJCQkgICAgKGdldF9ibG9jayAqIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKSkgKworCQkJICAgIGdldF9pbmZvLm9mZnNldDsKKwkJCXBrdF9jbnQrKzsKKwkJfQorI2VuZGlmCisJfQorCWlmICghcGt0X2NudCkKKwkJcGt0X2NudCA9IDE7CisKKwlkZXYtPnF1b3RhIC09IHBrdF9jbnQ7CisJKmJ1ZGdldCAtPSBwa3RfY250OworCW5ldGlmX3J4X2NvbXBsZXRlKGRldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CisJCWlmIChmaWxsX3J4X2J1ZmZlcnMobmljLCBpKSA9PSAtRU5PTUVNKSB7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOk91dCBvZiBtZW1vcnkiLCBkZXYtPm5hbWUpOworCQkJREJHX1BSSU5UKEVSUl9EQkcsICIgaW4gUnggUG9sbCEhXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qIFJlIGVuYWJsZSB0aGUgUnggaW50ZXJydXB0cy4gKi8KKwllbl9kaXNfYWJsZV9uaWNfaW50cnMobmljLCBSWF9UUkFGRklDX0lOVFIsIEVOQUJMRV9JTlRSUyk7CisJcmV0dXJuIDA7CisKKyAgICAgIG5vX3J4OgorCWRldi0+cXVvdGEgLT0gcGt0X2NudDsKKwkqYnVkZ2V0IC09IHBrdF9jbnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CisJCWlmIChmaWxsX3J4X2J1ZmZlcnMobmljLCBpKSA9PSAtRU5PTUVNKSB7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOk91dCBvZiBtZW1vcnkiLCBkZXYtPm5hbWUpOworCQkJREJHX1BSSU5UKEVSUl9EQkcsICIgaW4gUnggUG9sbCEhXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAxOworfQorI2Vsc2UKKy8qKiAgCisgKiAgcnhfaW50cl9oYW5kbGVyIC0gUnggaW50ZXJydXB0IGhhbmRsZXIKKyAqICBAbmljOiBkZXZpY2UgcHJpdmF0ZSB2YXJpYWJsZS4KKyAqICBEZXNjcmlwdGlvbjogCisgKiAgSWYgdGhlIGludGVycnVwdCBpcyBiZWNhdXNlIG9mIGEgcmVjZWl2ZWQgZnJhbWUgb3IgaWYgdGhlIAorICogIHJlY2VpdmUgcmluZyBjb250YWlucyBmcmVzaCBhcyB5ZXQgdW4tcHJvY2Vzc2VkIGZyYW1lcyx0aGlzIGZ1bmN0aW9uIGlzCisgKiAgY2FsbGVkLiBJdCBwaWNrcyBvdXQgdGhlIFJ4RCBhdCB3aGljaCBwbGFjZSB0aGUgbGFzdCBSeCBwcm9jZXNzaW5nIGhhZCAKKyAqICBzdG9wcGVkIGFuZCBzZW5kcyB0aGUgc2tiIHRvIHRoZSBPU00ncyBSeCBoYW5kbGVyIGFuZCB0aGVuIGluY3JlbWVudHMgCisgKiAgdGhlIG9mZnNldC4KKyAqICBSZXR1cm4gVmFsdWU6CisgKiAgTk9ORS4KKyAqLworCitzdGF0aWMgdm9pZCByeF9pbnRyX2hhbmRsZXIoc3RydWN0IHMyaW9fbmljICpuaWMpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBuaWMtPmRldjsKKwlYRU5BX2Rldl9jb25maWdfdCAqYmFyMCA9IChYRU5BX2Rldl9jb25maWdfdCAqKSBuaWMtPmJhcjA7CisJcnhfY3Vycl9nZXRfaW5mb190IGdldF9pbmZvLCBwdXRfaW5mbzsKKwlSeERfdCAqcnhkcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworI2lmbmRlZiBDT05GSUdfMkJVRkZfTU9ERQorCXUxNiB2YWwxNiwgY2tzdW07CisjZW5kaWYKKwlyZWdpc3RlciB1NjQgdmFsNjQgPSAwOworCWludCBnZXRfYmxvY2ssIGdldF9vZmZzZXQsIHB1dF9ibG9jaywgcHV0X29mZnNldCwgcmluZ19idWZzOworCWludCBpLCBwa3RfY250ID0gMDsKKwltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CisjaWZkZWYgQ09ORklHXzJCVUZGX01PREUKKwlidWZmQWRkX3QgKmJhOworI2VuZGlmCisKKwltYWNfY29udHJvbCA9ICZuaWMtPm1hY19jb250cm9sOworCWNvbmZpZyA9ICZuaWMtPmNvbmZpZzsKKworCS8qIAorCSAqIHJ4X3RyYWZmaWNfaW50IHJlZyBpcyBhbiBSMSByZWdpc3RlciwgaGVuY2Ugd2UgcmVhZCBhbmQgd3JpdGUgYmFjayAKKwkgKiB0aGUgc2FtZXZhbHVlIGluIHRoZSByZWdpc3RlciB0byBjbGVhciBpdC4KKwkgKi8KKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5yeF90cmFmZmljX2ludCk7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cnhfdHJhZmZpY19pbnQpOworCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgeworCQlnZXRfaW5mbyA9IG1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldOworCQlnZXRfYmxvY2sgPSBnZXRfaW5mby5ibG9ja19pbmRleDsKKwkJcHV0X2luZm8gPSBtYWNfY29udHJvbC0+cnhfY3Vycl9wdXRfaW5mb1tpXTsKKwkJcHV0X2Jsb2NrID0gcHV0X2luZm8uYmxvY2tfaW5kZXg7CisJCXJpbmdfYnVmcyA9IGNvbmZpZy0+cnhfY2ZnW2ldLm51bV9yeGQ7CisJCXJ4ZHAgPSBuaWMtPnJ4X2Jsb2Nrc1tpXVtnZXRfYmxvY2tdLmJsb2NrX3ZpcnRfYWRkciArCisJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisjaWZuZGVmCUNPTkZJR18yQlVGRl9NT0RFCisJCWdldF9vZmZzZXQgPSAoZ2V0X2Jsb2NrICogKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpKSArCisJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisJCXNwaW5fbG9jaygmbmljLT5wdXRfbG9jayk7CisJCXB1dF9vZmZzZXQgPSBuaWMtPnB1dF9wb3NbaV07CisJCXNwaW5fdW5sb2NrKCZuaWMtPnB1dF9sb2NrKTsKKwkJd2hpbGUgKCghKHJ4ZHAtPkNvbnRyb2xfMSAmIFJYRF9PV05fWEVOQSkpICYmCisJCSAgICAgICAoKChnZXRfb2Zmc2V0ICsgMSkgJSByaW5nX2J1ZnMpICE9IHB1dF9vZmZzZXQpKSB7CisJCQlpZiAocnhkcC0+Q29udHJvbF8xID09IEVORF9PRl9CTE9DSykgeworCQkJCXJ4ZHAgPSAoUnhEX3QgKikgKCh1bnNpZ25lZCBsb25nKQorCQkJCQkJICByeGRwLT5Db250cm9sXzIpOworCQkJCWdldF9pbmZvLm9mZnNldCsrOworCQkJCWdldF9pbmZvLm9mZnNldCAlPQorCQkJCSAgICAoTUFYX1JYRFNfUEVSX0JMT0NLICsgMSk7CisJCQkJZ2V0X2Jsb2NrKys7CisJCQkJZ2V0X2Jsb2NrICU9IG5pYy0+YmxvY2tfY291bnRbaV07CisJCQkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfZ2V0X2luZm9baV0uCisJCQkJICAgIG9mZnNldCA9IGdldF9pbmZvLm9mZnNldDsKKwkJCQltYWNfY29udHJvbC0+cnhfY3Vycl9nZXRfaW5mb1tpXS4KKwkJCQkgICAgYmxvY2tfaW5kZXggPSBnZXRfYmxvY2s7CisJCQkJY29udGludWU7CisJCQl9CisJCQlnZXRfb2Zmc2V0ID0KKwkJCSAgICAoZ2V0X2Jsb2NrICogKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpKSArCisJCQkgICAgZ2V0X2luZm8ub2Zmc2V0OworCQkJc2tiID0gKHN0cnVjdCBza19idWZmICopICgodW5zaWduZWQgbG9uZykKKwkJCQkJCSAgcnhkcC0+SG9zdF9Db250cm9sKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IFRoZSBza2IgaXMgIiwKKwkJCQkJICBkZXYtPm5hbWUpOworCQkJCURCR19QUklOVChFUlJfREJHLCAiTnVsbCBpbiBSeCBJbnRyXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQl2YWw2NCA9IFJYRF9HRVRfQlVGRkVSMF9TSVpFKHJ4ZHAtPkNvbnRyb2xfMik7CisJCQl2YWwxNiA9ICh1MTYpICh2YWw2NCA+PiA0OCk7CisJCQlja3N1bSA9IFJYRF9HRVRfTDRfQ0tTVU0ocnhkcC0+Q29udHJvbF8xKTsKKwkJCXBjaV91bm1hcF9zaW5nbGUobmljLT5wZGV2LCAoZG1hX2FkZHJfdCkKKwkJCQkJIHJ4ZHAtPkJ1ZmZlcjBfcHRyLAorCQkJCQkgZGV2LT5tdHUgKworCQkJCQkgSEVBREVSX0VUSEVSTkVUX0lJXzgwMl8zX1NJWkUgKworCQkJCQkgSEVBREVSXzgwMl8yX1NJWkUgKworCQkJCQkgSEVBREVSX1NOQVBfU0laRSwKKwkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlyeF9vc21faGFuZGxlcihuaWMsIHZhbDE2LCByeGRwLCBpKTsKKwkJCWdldF9pbmZvLm9mZnNldCsrOworCQkJZ2V0X2luZm8ub2Zmc2V0ICU9IChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKTsKKwkJCXJ4ZHAgPQorCQkJICAgIG5pYy0+cnhfYmxvY2tzW2ldW2dldF9ibG9ja10uYmxvY2tfdmlydF9hZGRyICsKKwkJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisJCQltYWNfY29udHJvbC0+cnhfY3Vycl9nZXRfaW5mb1tpXS5vZmZzZXQgPQorCQkJICAgIGdldF9pbmZvLm9mZnNldDsKKwkJCXBrdF9jbnQrKzsKKwkJCWlmICgoaW5kaWNhdGVfbWF4X3BrdHMpCisJCQkgICAgJiYgKHBrdF9jbnQgPiBpbmRpY2F0ZV9tYXhfcGt0cykpCisJCQkJYnJlYWs7CisJCX0KKyNlbHNlCisJCWdldF9vZmZzZXQgPSAoZ2V0X2Jsb2NrICogKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpKSArCisJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisJCXNwaW5fbG9jaygmbmljLT5wdXRfbG9jayk7CisJCXB1dF9vZmZzZXQgPSBuaWMtPnB1dF9wb3NbaV07CisJCXNwaW5fdW5sb2NrKCZuaWMtPnB1dF9sb2NrKTsKKwkJd2hpbGUgKCgoIShyeGRwLT5Db250cm9sXzEgJiBSWERfT1dOX1hFTkEpKSAmJgorCQkJIShyeGRwLT5Db250cm9sXzIgJiBCSVQoMCkpKSAmJgorCQkgICAgICAgKCgoZ2V0X29mZnNldCArIDEpICUgcmluZ19idWZzKSAhPSBwdXRfb2Zmc2V0KSkgeworCQkJc2tiID0gKHN0cnVjdCBza19idWZmICopICgodW5zaWduZWQgbG9uZykKKwkJCQkJCSAgcnhkcC0+SG9zdF9Db250cm9sKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IFRoZSBza2IgaXMgIiwKKwkJCQkJICBkZXYtPm5hbWUpOworCQkJCURCR19QUklOVChFUlJfREJHLCAiTnVsbCBpbiBSeCBJbnRyXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCXBjaV91bm1hcF9zaW5nbGUobmljLT5wZGV2LCAoZG1hX2FkZHJfdCkKKwkJCQkJIHJ4ZHAtPkJ1ZmZlcjBfcHRyLAorCQkJCQkgQlVGMF9MRU4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwgKGRtYV9hZGRyX3QpCisJCQkJCSByeGRwLT5CdWZmZXIxX3B0ciwKKwkJCQkJIEJVRjFfTEVOLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJcGNpX3VubWFwX3NpbmdsZShuaWMtPnBkZXYsIChkbWFfYWRkcl90KQorCQkJCQkgcnhkcC0+QnVmZmVyMl9wdHIsCisJCQkJCSBkZXYtPm10dSArIEJVRjBfTEVOICsgNCwKKwkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQliYSA9ICZuaWMtPmJhW2ldW2dldF9ibG9ja11bZ2V0X2luZm8ub2Zmc2V0XTsKKworCQkJcnhfb3NtX2hhbmRsZXIobmljLCByeGRwLCBpLCBiYSk7CisKKwkJCWdldF9pbmZvLm9mZnNldCsrOworCQkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfZ2V0X2luZm9baV0ub2Zmc2V0ID0KKwkJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisJCQlyeGRwID0KKwkJCSAgICBuaWMtPnJ4X2Jsb2Nrc1tpXVtnZXRfYmxvY2tdLmJsb2NrX3ZpcnRfYWRkciArCisJCQkgICAgZ2V0X2luZm8ub2Zmc2V0OworCisJCQlpZiAoZ2V0X2luZm8ub2Zmc2V0ICYmCisJCQkgICAgKCEoZ2V0X2luZm8ub2Zmc2V0ICUgTUFYX1JYRFNfUEVSX0JMT0NLKSkpIHsKKwkJCQlnZXRfaW5mby5vZmZzZXQgPSAwOworCQkJCW1hY19jb250cm9sLT5yeF9jdXJyX2dldF9pbmZvW2ldLgorCQkJCSAgICBvZmZzZXQgPSBnZXRfaW5mby5vZmZzZXQ7CisJCQkJZ2V0X2Jsb2NrKys7CisJCQkJZ2V0X2Jsb2NrICU9IG5pYy0+YmxvY2tfY291bnRbaV07CisJCQkJbWFjX2NvbnRyb2wtPnJ4X2N1cnJfZ2V0X2luZm9baV0uCisJCQkJICAgIGJsb2NrX2luZGV4ID0gZ2V0X2Jsb2NrOworCQkJCXJ4ZHAgPQorCQkJCSAgICBuaWMtPnJ4X2Jsb2Nrc1tpXVtnZXRfYmxvY2tdLgorCQkJCSAgICBibG9ja192aXJ0X2FkZHI7CisJCQl9CisJCQlnZXRfb2Zmc2V0ID0KKwkJCSAgICAoZ2V0X2Jsb2NrICogKE1BWF9SWERTX1BFUl9CTE9DSyArIDEpKSArCisJCQkgICAgZ2V0X2luZm8ub2Zmc2V0OworCQkJcGt0X2NudCsrOworCQkJaWYgKChpbmRpY2F0ZV9tYXhfcGt0cykKKwkJCSAgICAmJiAocGt0X2NudCA+IGluZGljYXRlX21heF9wa3RzKSkKKwkJCQlicmVhazsKKwkJfQorI2VuZGlmCisJCWlmICgoaW5kaWNhdGVfbWF4X3BrdHMpICYmIChwa3RfY250ID4gaW5kaWNhdGVfbWF4X3BrdHMpKQorCQkJYnJlYWs7CisJfQorfQorI2VuZGlmCisvKiogIAorICogIHR4X2ludHJfaGFuZGxlciAtIFRyYW5zbWl0IGludGVycnVwdCBoYW5kbGVyCisgKiAgQG5pYyA6IGRldmljZSBwcml2YXRlIHZhcmlhYmxlCisgKiAgRGVzY3JpcHRpb246IAorICogIElmIGFuIGludGVycnVwdCB3YXMgcmFpc2VkIHRvIGluZGljYXRlIERNQSBjb21wbGV0ZSBvZiB0aGUgCisgKiAgVHggcGFja2V0LCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gSXQgaWRlbnRpZmllcyB0aGUgbGFzdCBUeEQgCisgKiAgd2hvc2UgYnVmZmVyIHdhcyBmcmVlZCBhbmQgZnJlZXMgYWxsIHNrYnMgd2hvc2UgZGF0YSBoYXZlIGFscmVhZHkgCisgKiAgRE1BJ2VkIGludG8gdGhlIE5JQ3MgaW50ZXJuYWwgbWVtb3J5LgorICogIFJldHVybiBWYWx1ZToKKyAqICBOT05FCisgKi8KKworc3RhdGljIHZvaWQgdHhfaW50cl9oYW5kbGVyKHN0cnVjdCBzMmlvX25pYyAqbmljKQoreworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBuaWMtPmJhcjA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBuaWMtPmRldjsKKwl0eF9jdXJyX2dldF9pbmZvX3QgZ2V0X2luZm8sIHB1dF9pbmZvOworCXN0cnVjdCBza19idWZmICpza2I7CisJVHhEX3QgKnR4ZGxwOworCXJlZ2lzdGVyIHU2NCB2YWw2NCA9IDA7CisJaW50IGk7CisJdTE2IGosIGZyZ19jbnQ7CisJbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOworCisJbWFjX2NvbnRyb2wgPSAmbmljLT5tYWNfY29udHJvbDsKKwljb25maWcgPSAmbmljLT5jb25maWc7CisKKwkvKiAKKwkgKiB0eF90cmFmZmljX2ludCByZWcgaXMgYW4gUjEgcmVnaXN0ZXIsIGhlbmNlIHdlIHJlYWQgYW5kIHdyaXRlIAorCSAqIGJhY2sgdGhlIHNhbWV2YWx1ZSBpbiB0aGUgcmVnaXN0ZXIgdG8gY2xlYXIgaXQuCisJICovCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+dHhfdHJhZmZpY19pbnQpOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnR4X3RyYWZmaWNfaW50KTsKKworCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnR4X2ZpZm9fbnVtOyBpKyspIHsKKwkJZ2V0X2luZm8gPSBtYWNfY29udHJvbC0+dHhfY3Vycl9nZXRfaW5mb1tpXTsKKwkJcHV0X2luZm8gPSBtYWNfY29udHJvbC0+dHhfY3Vycl9wdXRfaW5mb1tpXTsKKwkJdHhkbHAgPSAoVHhEX3QgKikgbmljLT5saXN0X2luZm9baV1bZ2V0X2luZm8ub2Zmc2V0XS4KKwkJICAgIGxpc3RfdmlydF9hZGRyOworCQl3aGlsZSAoKCEodHhkbHAtPkNvbnRyb2xfMSAmIFRYRF9MSVNUX09XTl9YRU5BKSkgJiYKKwkJICAgICAgIChnZXRfaW5mby5vZmZzZXQgIT0gcHV0X2luZm8ub2Zmc2V0KSAmJgorCQkgICAgICAgKHR4ZGxwLT5Ib3N0X0NvbnRyb2wpKSB7CisJCQkvKiBDaGVjayBmb3IgVHhEIGVycm9ycyAqLworCQkJaWYgKHR4ZGxwLT5Db250cm9sXzEgJiBUWERfVF9DT0RFKSB7CisJCQkJdW5zaWduZWQgbG9uZyBsb25nIGVycjsKKwkJCQllcnIgPSB0eGRscC0+Q29udHJvbF8xICYgVFhEX1RfQ09ERTsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIioqKlR4RCBlcnJvciAlbGx4XG4iLAorCQkJCQkgIGVycik7CisJCQl9CisKKwkJCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAoKHVuc2lnbmVkIGxvbmcpCisJCQkJCQkgIHR4ZGxwLT5Ib3N0X0NvbnRyb2wpOworCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogTnVsbCBza2IgIiwKKwkJCQkJICBkZXYtPm5hbWUpOworCQkJCURCR19QUklOVChFUlJfREJHLCAiaW4gVHggRnJlZSBJbnRyXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQluaWMtPnR4X3BrdF9jb3VudCsrOworCisJCQlmcmdfY250ID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKworCQkJLyogIEZvciB1bmZyYWdtZW50ZWQgc2tiICovCisJCQlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwgKGRtYV9hZGRyX3QpCisJCQkJCSB0eGRscC0+QnVmZmVyX1BvaW50ZXIsCisJCQkJCSBza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW4sCisJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWlmIChmcmdfY250KSB7CisJCQkJVHhEX3QgKnRlbXAgPSB0eGRscDsKKwkJCQl0eGRscCsrOworCQkJCWZvciAoaiA9IDA7IGogPCBmcmdfY250OyBqKyssIHR4ZGxwKyspIHsKKwkJCQkJc2tiX2ZyYWdfdCAqZnJhZyA9CisJCQkJCSAgICAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tqXTsKKwkJCQkJcGNpX3VubWFwX3BhZ2UobmljLT5wZGV2LAorCQkJCQkJICAgICAgIChkbWFfYWRkcl90KQorCQkJCQkJICAgICAgIHR4ZGxwLT4KKwkJCQkJCSAgICAgICBCdWZmZXJfUG9pbnRlciwKKwkJCQkJCSAgICAgICBmcmFnLT5zaXplLAorCQkJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCX0KKwkJCQl0eGRscCA9IHRlbXA7CisJCQl9CisJCQltZW1zZXQodHhkbHAsIDAsCisJCQkgICAgICAgKHNpemVvZihUeERfdCkgKiBjb25maWctPm1heF90eGRzKSk7CisKKwkJCS8qIFVwZGF0aW5nIHRoZSBzdGF0aXN0aWNzIGJsb2NrICovCisJCQluaWMtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCW5pYy0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCisJCQlnZXRfaW5mby5vZmZzZXQrKzsKKwkJCWdldF9pbmZvLm9mZnNldCAlPSBnZXRfaW5mby5maWZvX2xlbiArIDE7CisJCQl0eGRscCA9IChUeERfdCAqKSBuaWMtPmxpc3RfaW5mb1tpXQorCQkJICAgIFtnZXRfaW5mby5vZmZzZXRdLmxpc3RfdmlydF9hZGRyOworCQkJbWFjX2NvbnRyb2wtPnR4X2N1cnJfZ2V0X2luZm9baV0ub2Zmc2V0ID0KKwkJCSAgICBnZXRfaW5mby5vZmZzZXQ7CisJCX0KKwl9CisKKwlzcGluX2xvY2soJm5pYy0+dHhfbG9jayk7CisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXNwaW5fdW5sb2NrKCZuaWMtPnR4X2xvY2spOworfQorCisvKiogIAorICogIGFsYXJtX2ludHJfaGFuZGxlciAtIEFsYXJtIEludGVycnJ1cHQgaGFuZGxlcgorICogIEBuaWM6IGRldmljZSBwcml2YXRlIHZhcmlhYmxlCisgKiAgRGVzY3JpcHRpb246IElmIHRoZSBpbnRlcnJ1cHQgd2FzIG5laXRoZXIgYmVjYXVzZSBvZiBSeCBwYWNrZXQgb3IgVHggCisgKiAgY29tcGxldGUsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiBJZiB0aGUgaW50ZXJydXB0IHdhcyB0byBpbmRpY2F0ZQorICogIGEgbG9zcyBvZiBsaW5rLCB0aGUgT1NNIGxpbmsgc3RhdHVzIGhhbmRsZXIgaXMgaW52b2tlZCBmb3IgYW55IG90aGVyIAorICogIGFsYXJtIGludGVycnVwdCB0aGUgYmxvY2sgdGhhdCByYWlzZWQgdGhlIGludGVycnVwdCBpcyBkaXNwbGF5ZWQgCisgKiAgYW5kIGEgSC9XIHJlc2V0IGlzIGlzc3VlZC4KKyAqICBSZXR1cm4gVmFsdWU6CisgKiAgTk9ORQorKi8KKworc3RhdGljIHZvaWQgYWxhcm1faW50cl9oYW5kbGVyKHN0cnVjdCBzMmlvX25pYyAqbmljKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgbmljLT5kZXY7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKKwlyZWdpc3RlciB1NjQgdmFsNjQgPSAwLCBlcnJfcmVnID0gMDsKKworCS8qIEhhbmRsaW5nIGxpbmsgc3RhdHVzIGNoYW5nZSBlcnJvciBJbnRyICovCisJZXJyX3JlZyA9IHJlYWRxKCZiYXIwLT5tYWNfcm1hY19lcnJfcmVnKTsKKwl3cml0ZXEoZXJyX3JlZywgJmJhcjAtPm1hY19ybWFjX2Vycl9yZWcpOworCWlmIChlcnJfcmVnICYgUk1BQ19MSU5LX1NUQVRFX0NIQU5HRV9JTlQpIHsKKwkJc2NoZWR1bGVfd29yaygmbmljLT5zZXRfbGlua190YXNrKTsKKwl9CisKKwkvKiBJbiBjYXNlIG9mIGEgc2VyaW91cyBlcnJvciwgdGhlIGRldmljZSB3aWxsIGJlIFJlc2V0LiAqLworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnNlcnJfc291cmNlKTsKKwlpZiAodmFsNjQgJiBTRVJSX1NPVVJDRV9BTlkpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogRGV2aWNlIGluZGljYXRlcyAiLCBkZXYtPm5hbWUpOworCQlEQkdfUFJJTlQoRVJSX0RCRywgInNlcmlvdXMgZXJyb3IhIVxuIik7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc2NoZWR1bGVfd29yaygmbmljLT5yc3RfdGltZXJfdGFzayk7CisJfQorCisJLyoKKwkgKiBBbHNvIGFzIG1lbnRpb25lZCBpbiB0aGUgbGF0ZXN0IEVycmF0YSBzaGVldHMgaWYgdGhlIFBDQ19GQl9FQ0MKKwkgKiBFcnJvciBvY2N1cnMsIHRoZSBhZGFwdGVyIHdpbGwgYmUgcmVjeWNsZWQgYnkgZGlzYWJsaW5nIHRoZQorCSAqIGFkYXB0ZXIgZW5hYmxlIGJpdCBhbmQgZW5hYmxpbmcgaXQgYWdhaW4gYWZ0ZXIgdGhlIGRldmljZSAKKwkgKiBiZWNvbWVzIFF1aWVzY2VudC4KKwkgKi8KKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5wY2NfZXJyX3JlZyk7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cGNjX2Vycl9yZWcpOworCWlmICh2YWw2NCAmIFBDQ19GQl9FQ0NfREJfRVJSKSB7CisJCXU2NCBhYyA9IHJlYWRxKCZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCQlhYyAmPSB+KEFEQVBURVJfQ05UTF9FTik7CisJCXdyaXRlcShhYywgJmJhcjAtPmFkYXB0ZXJfY29udHJvbCk7CisJCWFjID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfY29udHJvbCk7CisJCXNjaGVkdWxlX3dvcmsoJm5pYy0+c2V0X2xpbmtfdGFzayk7CisJfQorCisJLyogT3RoZXIgdHlwZSBvZiBpbnRlcnJ1cHRzIGFyZSBub3QgYmVpbmcgaGFuZGxlZCBub3csICBUT0RPICovCit9CisKKy8qKiAKKyAqICB3YWl0X2Zvcl9jbWRfY29tcGxldGUgLSB3YWl0cyBmb3IgYSBjb21tYW5kIHRvIGNvbXBsZXRlLgorICogIEBzcCA6IHByaXZhdGUgbWVtYmVyIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLCB3aGljaCBpcyBhIHBvaW50ZXIgdG8gdGhlIAorICogIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqICBEZXNjcmlwdGlvbjogRnVuY3Rpb24gdGhhdCB3YWl0cyBmb3IgYSBjb21tYW5kIHRvIFdyaXRlIGludG8gUk1BQyAKKyAqICBBRERSIERBVEEgcmVnaXN0ZXJzIHRvIGJlIGNvbXBsZXRlZCBhbmQgcmV0dXJucyBlaXRoZXIgc3VjY2VzcyBvciAKKyAqICBlcnJvciBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgY29tbWFuZCB3YXMgY29tcGxldGUgb3Igbm90LiAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgIFNVQ0NFU1Mgb24gc3VjY2VzcyBhbmQgRkFJTFVSRSBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgd2FpdF9mb3JfY21kX2NvbXBsZXRlKG5pY190ICogc3ApCit7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCWludCByZXQgPSBGQUlMVVJFLCBjbnQgPSAwOworCXU2NCB2YWw2NDsKKworCXdoaWxlIChUUlVFKSB7CisJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnJtYWNfYWRkcl9jbWRfbWVtKTsKKwkJaWYgKCEodmFsNjQgJiBSTUFDX0FERFJfQ01EX01FTV9TVFJPQkVfQ01EX0VYRUNVVElORykpIHsKKwkJCXJldCA9IFNVQ0NFU1M7CisJCQlicmVhazsKKwkJfQorCQltc2xlZXAoNTApOworCQlpZiAoY250KysgPiAxMCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKiAKKyAqICBzMmlvX3Jlc2V0IC0gUmVzZXRzIHRoZSBjYXJkLiAKKyAqICBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KKyAqICBEZXNjcmlwdGlvbjogRnVuY3Rpb24gdG8gUmVzZXQgdGhlIGNhcmQuIFRoaXMgZnVuY3Rpb24gdGhlbiBhbHNvCisgKiAgcmVzdG9yZXMgdGhlIHByZXZpb3VzbHkgc2F2ZWQgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgcmVnaXN0ZXJzIGFzIAorICogIHRoZSBjYXJkIHJlc2V0IGFsc28gcmVzZXRzIHRoZSBjb25maWd1cmF0aW9uIHNwYWNlLgorICogIFJldHVybiB2YWx1ZToKKyAqICB2b2lkLgorICovCisKK3N0YXRpYyB2b2lkIHMyaW9fcmVzZXQobmljX3QgKiBzcCkKK3sKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJdTY0IHZhbDY0OworCXUxNiBzdWJpZDsKKworCXZhbDY0ID0gU1dfUkVTRVRfQUxMOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnN3X3Jlc2V0KTsKKworCS8qIAorCSAqIEF0IHRoaXMgc3RhZ2UsIGlmIHRoZSBQQ0kgd3JpdGUgaXMgaW5kZWVkIGNvbXBsZXRlZCwgdGhlIAorCSAqIGNhcmQgaXMgcmVzZXQgYW5kIHNvIGlzIHRoZSBQQ0kgQ29uZmlnIHNwYWNlIG9mIHRoZSBkZXZpY2UuIAorCSAqIFNvIGEgcmVhZCBjYW5ub3QgYmUgaXNzdWVkIGF0IHRoaXMgc3RhZ2Ugb24gYW55IG9mIHRoZSAKKwkgKiByZWdpc3RlcnMgdG8gZW5zdXJlIHRoZSB3cml0ZSBpbnRvICJzd19yZXNldCIgcmVnaXN0ZXIKKwkgKiBoYXMgZ29uZSB0aHJvdWdoLgorCSAqIFF1ZXN0aW9uOiBJcyB0aGVyZSBhbnkgc3lzdGVtIGNhbGwgdGhhdCB3aWxsIGV4cGxpY2l0bHkgZm9yY2UKKwkgKiBhbGwgdGhlIHdyaXRlIGNvbW1hbmRzIHN0aWxsIHBlbmRpbmcgb24gdGhlIGJ1cyB0byBiZSBwdXNoZWQKKwkgKiB0aHJvdWdoPworCSAqIEFzIG9mIG5vdyBJJ2FtIGp1c3QgZ2l2aW5nIGEgMjUwbXMgZGVsYXkgYW5kIGhvcGluZyB0aGF0IHRoZQorCSAqIFBDSSB3cml0ZSB0byBzd19yZXNldCByZWdpc3RlciBpcyBkb25lIGJ5IHRoaXMgdGltZS4KKwkgKi8KKwltc2xlZXAoMjUwKTsKKworCS8qIFJlc3RvcmUgdGhlIFBDSSBzdGF0ZSBzYXZlZCBkdXJpbmcgaW5pdGlhbGl6YXJpb24uICovCisJcGNpX3Jlc3RvcmVfc3RhdGUoc3AtPnBkZXYpOworCXMyaW9faW5pdF9wY2koc3ApOworCisJbXNsZWVwKDI1MCk7CisKKwkvKiBTWEUtMDAyOiBDb25maWd1cmUgbGluayBhbmQgYWN0aXZpdHkgTEVEIHRvIHR1cm4gaXQgb2ZmICovCisJc3ViaWQgPSBzcC0+cGRldi0+c3Vic3lzdGVtX2RldmljZTsKKwlpZiAoKHN1YmlkICYgMHhGRikgPj0gMHgwNykgeworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ncGlvX2NvbnRyb2wpOworCQl2YWw2NCB8PSAweDAwMDA4MDAwMDAwMDAwMDBVTEw7CisJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdwaW9fY29udHJvbCk7CisJCXZhbDY0ID0gMHgwNDExMDQwNDAwMDAwMDAwVUxMOworCQl3cml0ZXEodmFsNjQsICh2b2lkIF9faW9tZW0gKikgYmFyMCArIDB4MjcwMCk7CisJfQorCisJc3AtPmRldmljZV9lbmFibGVkX29uY2UgPSBGQUxTRTsKK30KKworLyoqCisgKiAgczJpb19zZXRfc3dhcHBlciAtIHRvIHNldCB0aGUgc3dhcHBlciBjb250cm9sZSBvbiB0aGUgY2FyZCAKKyAqICBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgCisgKiAgcG9pbnRlciB0byB0aGUgczJpb19uaWMgc3RydWN0dXJlLgorICogIERlc2NyaXB0aW9uOiBGdW5jdGlvbiB0byBzZXQgdGhlIHN3YXBwZXIgY29udHJvbCBvbiB0aGUgY2FyZCAKKyAqICBjb3JyZWN0bHkgZGVwZW5kaW5nIG9uIHRoZSAnZW5kaWFubmVzcycgb2YgdGhlIHN5c3RlbS4KKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgU1VDQ0VTUyBvbiBzdWNjZXNzIGFuZCBGQUlMVVJFIG9uIGZhaWx1cmUuCisgKi8KKworc3RhdGljIGludCBzMmlvX3NldF9zd2FwcGVyKG5pY190ICogc3ApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNwLT5kZXY7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCXU2NCB2YWw2NCwgdmFsdCwgdmFscjsKKworCS8qIAorCSAqIFNldCBwcm9wZXIgZW5kaWFuIHNldHRpbmdzIGFuZCB2ZXJpZnkgdGhlIHNhbWUgYnkgcmVhZGluZworCSAqIHRoZSBQSUYgRmVlZC1iYWNrIHJlZ2lzdGVyLgorCSAqLworCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+cGlmX3JkX3N3YXBwZXJfZmIpOworCWlmICh2YWw2NCAhPSAweDAxMjM0NTY3ODlBQkNERUZVTEwpIHsKKwkJaW50IGkgPSAwOworCQl1NjQgdmFsdWVbXSA9IHsgMHhDMzAwMDBDM0MzMDAwMEMzVUxMLCAgIC8qIEZFPTEsIFNFPTEgKi8KKwkJCQkweDgxMDAwMDgxODEwMDAwODFVTEwsICAvKiBGRT0xLCBTRT0wICovCisJCQkJMHg0MjAwMDA0MjQyMDAwMDQyVUxMLCAgLyogRkU9MCwgU0U9MSAqLworCQkJCTB9OyAgICAgICAgICAgICAgICAgICAgIC8qIEZFPTAsIFNFPTAgKi8KKworCQl3aGlsZShpPDQpIHsKKwkJCXdyaXRlcSh2YWx1ZVtpXSwgJmJhcjAtPnN3YXBwZXJfY3RybCk7CisJCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5waWZfcmRfc3dhcHBlcl9mYik7CisJCQlpZiAodmFsNjQgPT0gMHgwMTIzNDU2Nzg5QUJDREVGVUxMKQorCQkJCWJyZWFrOworCQkJaSsrOworCQl9CisJCWlmIChpID09IDQpIHsKKwkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IEVuZGlhbiBzZXR0aW5ncyBhcmUgd3JvbmcsICIsCisJCQkJZGV2LT5uYW1lKTsKKwkJCURCR19QUklOVChFUlJfREJHLCAiZmVlZGJhY2sgcmVhZCAlbGx4XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHZhbDY0KTsKKwkJCXJldHVybiBGQUlMVVJFOworCQl9CisJCXZhbHIgPSB2YWx1ZVtpXTsKKwl9IGVsc2UgeworCQl2YWxyID0gcmVhZHEoJmJhcjAtPnN3YXBwZXJfY3RybCk7CisJfQorCisJdmFsdCA9IDB4MDEyMzQ1Njc4OUFCQ0RFRlVMTDsKKwl3cml0ZXEodmFsdCwgJmJhcjAtPnhtc2lfYWRkcmVzcyk7CisJdmFsNjQgPSByZWFkcSgmYmFyMC0+eG1zaV9hZGRyZXNzKTsKKworCWlmKHZhbDY0ICE9IHZhbHQpIHsKKwkJaW50IGkgPSAwOworCQl1NjQgdmFsdWVbXSA9IHsgMHgwMEMzQzMwMDAwQzNDMzAwVUxMLCAgLyogRkU9MSwgU0U9MSAqLworCQkJCTB4MDA4MTgxMDAwMDgxODEwMFVMTCwgIC8qIEZFPTEsIFNFPTAgKi8KKwkJCQkweDAwNDI0MjAwMDA0MjQyMDBVTEwsICAvKiBGRT0wLCBTRT0xICovCisJCQkJMH07ICAgICAgICAgICAgICAgICAgICAgLyogRkU9MCwgU0U9MCAqLworCisJCXdoaWxlKGk8NCkgeworCQkJd3JpdGVxKCh2YWx1ZVtpXSB8IHZhbHIpLCAmYmFyMC0+c3dhcHBlcl9jdHJsKTsKKwkJCXdyaXRlcSh2YWx0LCAmYmFyMC0+eG1zaV9hZGRyZXNzKTsKKwkJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnhtc2lfYWRkcmVzcyk7CisJCQlpZih2YWw2NCA9PSB2YWx0KQorCQkJCWJyZWFrOworCQkJaSsrOworCQl9CisJCWlmKGkgPT0gNCkgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsICJXcml0ZSBmYWlsZWQsIFhtc2lfYWRkciAiKTsKKwkJCURCR19QUklOVChFUlJfREJHLCAicmVhZHM6MHglbGx4XG4iLHZhbDY0KTsKKwkJCXJldHVybiBGQUlMVVJFOworCQl9CisJfQorCXZhbDY0ID0gcmVhZHEoJmJhcjAtPnN3YXBwZXJfY3RybCk7CisJdmFsNjQgJj0gMHhGRkZGMDAwMDAwMDAwMDAwVUxMOworCisjaWZkZWYgIF9fQklHX0VORElBTgorCS8qIAorCSAqIFRoZSBkZXZpY2UgYnkgZGVmYXVsdCBzZXQgdG8gYSBiaWcgZW5kaWFuIGZvcm1hdCwgc28gYSAKKwkgKiBiaWcgZW5kaWFuIGRyaXZlciBuZWVkIG5vdCBzZXQgYW55dGhpbmcuCisJICovCisJdmFsNjQgfD0gKFNXQVBQRVJfQ1RSTF9UWFBfRkUgfAorCQkgU1dBUFBFUl9DVFJMX1RYUF9TRSB8CisJCSBTV0FQUEVSX0NUUkxfVFhEX1JfRkUgfAorCQkgU1dBUFBFUl9DVFJMX1RYRF9XX0ZFIHwKKwkJIFNXQVBQRVJfQ1RSTF9UWEZfUl9GRSB8CisJCSBTV0FQUEVSX0NUUkxfUlhEX1JfRkUgfAorCQkgU1dBUFBFUl9DVFJMX1JYRF9XX0ZFIHwKKwkJIFNXQVBQRVJfQ1RSTF9SWEZfV19GRSB8CisJCSBTV0FQUEVSX0NUUkxfWE1TSV9GRSB8CisJCSBTV0FQUEVSX0NUUkxfWE1TSV9TRSB8CisJCSBTV0FQUEVSX0NUUkxfU1RBVFNfRkUgfCBTV0FQUEVSX0NUUkxfU1RBVFNfU0UpOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnN3YXBwZXJfY3RybCk7CisjZWxzZQorCS8qIAorCSAqIEluaXRpYWxseSB3ZSBlbmFibGUgYWxsIGJpdHMgdG8gbWFrZSBpdCBhY2Nlc3NpYmxlIGJ5IHRoZQorCSAqIGRyaXZlciwgdGhlbiB3ZSBzZWxlY3RpdmVseSBlbmFibGUgb25seSB0aG9zZSBiaXRzIHRoYXQgCisJICogd2Ugd2FudCB0byBzZXQuCisJICovCisJdmFsNjQgfD0gKFNXQVBQRVJfQ1RSTF9UWFBfRkUgfAorCQkgU1dBUFBFUl9DVFJMX1RYUF9TRSB8CisJCSBTV0FQUEVSX0NUUkxfVFhEX1JfRkUgfAorCQkgU1dBUFBFUl9DVFJMX1RYRF9SX1NFIHwKKwkJIFNXQVBQRVJfQ1RSTF9UWERfV19GRSB8CisJCSBTV0FQUEVSX0NUUkxfVFhEX1dfU0UgfAorCQkgU1dBUFBFUl9DVFJMX1RYRl9SX0ZFIHwKKwkJIFNXQVBQRVJfQ1RSTF9SWERfUl9GRSB8CisJCSBTV0FQUEVSX0NUUkxfUlhEX1JfU0UgfAorCQkgU1dBUFBFUl9DVFJMX1JYRF9XX0ZFIHwKKwkJIFNXQVBQRVJfQ1RSTF9SWERfV19TRSB8CisJCSBTV0FQUEVSX0NUUkxfUlhGX1dfRkUgfAorCQkgU1dBUFBFUl9DVFJMX1hNU0lfRkUgfAorCQkgU1dBUFBFUl9DVFJMX1hNU0lfU0UgfAorCQkgU1dBUFBFUl9DVFJMX1NUQVRTX0ZFIHwgU1dBUFBFUl9DVFJMX1NUQVRTX1NFKTsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5zd2FwcGVyX2N0cmwpOworI2VuZGlmCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+c3dhcHBlcl9jdHJsKTsKKworCS8qIAorCSAqIFZlcmlmeWluZyBpZiBlbmRpYW4gc2V0dGluZ3MgYXJlIGFjY3VyYXRlIGJ5IHJlYWRpbmcgYSAKKwkgKiBmZWVkYmFjayByZWdpc3Rlci4KKwkgKi8KKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5waWZfcmRfc3dhcHBlcl9mYik7CisJaWYgKHZhbDY0ICE9IDB4MDEyMzQ1Njc4OUFCQ0RFRlVMTCkgeworCQkvKiBFbmRpYW4gc2V0dGluZ3MgYXJlIGluY29ycmVjdCwgY2FsbHMgZm9yIGFub3RoZXIgZGVra28uICovCisJCURCR19QUklOVChFUlJfREJHLCAiJXM6IEVuZGlhbiBzZXR0aW5ncyBhcmUgd3JvbmcsICIsCisJCQkgIGRldi0+bmFtZSk7CisJCURCR19QUklOVChFUlJfREJHLCAiZmVlZGJhY2sgcmVhZCAlbGx4XG4iLAorCQkJICAodW5zaWduZWQgbG9uZyBsb25nKSB2YWw2NCk7CisJCXJldHVybiBGQUlMVVJFOworCX0KKworCXJldHVybiBTVUNDRVNTOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKgorICogRnVuY3Rpb25zIGRlZmluZWQgYmVsb3cgY29uY2VybiB0aGUgT1MgcGFydCBvZiB0aGUgZHJpdmVyICoKKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKiogIAorICogIHMyaW9fb3BlbiAtIG9wZW4gZW50cnkgcG9pbnQgb2YgdGhlIGRyaXZlcgorICogIEBkZXYgOiBwb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlLgorICogIERlc2NyaXB0aW9uOgorICogIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG9wZW4gZW50cnkgcG9pbnQgb2YgdGhlIGRyaXZlci4gSXQgbWFpbmx5IGNhbGxzIGEKKyAqICBmdW5jdGlvbiB0byBhbGxvY2F0ZSBSeCBidWZmZXJzIGFuZCBpbnNlcnRzIHRoZW0gaW50byB0aGUgYnVmZmVyCisgKiAgZGVzY3JpcHRvcnMgYW5kIHRoZW4gZW5hYmxlcyB0aGUgUnggcGFydCBvZiB0aGUgTklDLiAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgMCBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSAoLSl2ZSBpbnRlZ2VyIGFzIGRlZmluZWQgaW4gZXJybm8uaAorICogICBmaWxlIG9uIGZhaWx1cmUuCisgKi8KKworc3RhdGljIGludCBzMmlvX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisJaW50IGVyciA9IDA7CisKKwkvKiAKKwkgKiBNYWtlIHN1cmUgeW91IGhhdmUgbGluayBvZmYgYnkgZGVmYXVsdCBldmVyeSB0aW1lIAorCSAqIE5pYyBpcyBpbml0aWFsaXplZAorCSAqLworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJc3AtPmxhc3RfbGlua19zdGF0ZSA9IExJTktfRE9XTjsKKworCS8qIEluaXRpYWxpemUgSC9XIGFuZCBlbmFibGUgaW50ZXJydXB0cyAqLworCWlmIChzMmlvX2NhcmRfdXAoc3ApKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiJXM6IEgvVyBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsCisJCQkgIGRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEFmdGVyIHByb3BlciBpbml0aWFsaXphdGlvbiBvZiBIL1csIHJlZ2lzdGVyIElTUiAqLworCWVyciA9IHJlcXVlc3RfaXJxKChpbnQpIHNwLT5pcnEsIHMyaW9faXNyLCBTQV9TSElSUSwKKwkJCSAgc3AtPm5hbWUsIGRldik7CisJaWYgKGVycikgeworCQlzMmlvX3Jlc2V0KHNwKTsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogSVNSIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIsCisJCQkgIGRldi0+bmFtZSk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKHMyaW9fc2V0X21hY19hZGRyKGRldiwgZGV2LT5kZXZfYWRkcikgPT0gRkFJTFVSRSkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIlNldCBNYWMgQWRkcmVzcyBGYWlsZWRcbiIpOworCQlzMmlvX3Jlc2V0KHNwKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgczJpb19jbG9zZSAtY2xvc2UgZW50cnkgcG9pbnQgb2YgdGhlIGRyaXZlcgorICogIEBkZXYgOiBkZXZpY2UgcG9pbnRlci4KKyAqICBEZXNjcmlwdGlvbjoKKyAqICBUaGlzIGlzIHRoZSBzdG9wIGVudHJ5IHBvaW50IG9mIHRoZSBkcml2ZXIuIEl0IG5lZWRzIHRvIHVuZG8gZXhhY3RseQorICogIHdoYXRldmVyIHdhcyBkb25lIGJ5IHRoZSBvcGVuIGVudHJ5IHBvaW50LHRodXMgaXQncyB1c3VhbGx5IHJlZmVycmVkIHRvCisgKiAgYXMgdGhlIGNsb3NlIGZ1bmN0aW9uLkFtb25nIG90aGVyIHRoaW5ncyB0aGlzIGZ1bmN0aW9uIG1haW5seSBzdG9wcyB0aGUKKyAqICBSeCBzaWRlIG9mIHRoZSBOSUMgYW5kIGZyZWVzIGFsbCB0aGUgUnggYnVmZmVycyBpbiB0aGUgUnggcmluZ3MuCisgKiAgUmV0dXJuIHZhbHVlOgorICogIDAgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgKC0pdmUgaW50ZWdlciBhcyBkZWZpbmVkIGluIGVycm5vLmgKKyAqICBmaWxlIG9uIGZhaWx1cmUuCisgKi8KKworc3RhdGljIGludCBzMmlvX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJLyogUmVzZXQgY2FyZCwga2lsbCB0YXNrbGV0IGFuZCBmcmVlIFR4IGFuZCBSeCBidWZmZXJzLiAqLworCXMyaW9fY2FyZF9kb3duKHNwKTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXNwLT5kZXZpY2VfY2xvc2VfZmxhZyA9IFRSVUU7CS8qIERldmljZSBpcyBzaHV0IGRvd24uICovCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIHMyaW9feG1pdCAtIFR4IGVudHJ5IHBvaW50IG9mIHRlIGRyaXZlcgorICogIEBza2IgOiB0aGUgc29ja2V0IGJ1ZmZlciBjb250YWluaW5nIHRoZSBUeCBkYXRhLgorICogIEBkZXYgOiBkZXZpY2UgcG9pbnRlci4KKyAqICBEZXNjcmlwdGlvbiA6CisgKiAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgVHggZW50cnkgcG9pbnQgb2YgdGhlIGRyaXZlci4gUzJJTyBOSUMgc3VwcG9ydHMKKyAqICBjZXJ0YWluIHByb3RvY29sIGFzc2lzdCBmZWF0dXJlcyBvbiBUeCBzaWRlLCBuYW1lbHkgIENTTywgUy9HLCBMU08uCisgKiAgTk9URTogd2hlbiBkZXZpY2UgY2FudCBxdWV1ZSB0aGUgcGt0LGp1c3QgdGhlIHRyYW5zX3N0YXJ0IHZhcmlhYmxlIHdpbGwKKyAqICBub3QgYmUgdXBhZHRlZC4KKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgMCBvbiBzdWNjZXNzICYgMSBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgczJpb194bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCXUxNiBmcmdfY250LCBmcmdfbGVuLCBpLCBxdWV1ZSwgcXVldWVfbGVuLCBwdXRfb2ZmLCBnZXRfb2ZmOworCXJlZ2lzdGVyIHU2NCB2YWw2NDsKKwlUeERfdCAqdHhkcDsKKwlUeEZJRk9fZWxlbWVudF90IF9faW9tZW0gKnR4X2ZpZm87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZmRlZiBORVRJRl9GX1RTTworCWludCBtc3M7CisjZW5kaWYKKwltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCisJbWFjX2NvbnRyb2wgPSAmc3AtPm1hY19jb250cm9sOworCWNvbmZpZyA9ICZzcC0+Y29uZmlnOworCisJREJHX1BSSU5UKFRYX0RCRywgIiVzOiBJbiBTMklPIFR4IHJvdXRpbmVcbiIsIGRldi0+bmFtZSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwLT50eF9sb2NrLCBmbGFncyk7CisKKwlpZiAoYXRvbWljX3JlYWQoJnNwLT5jYXJkX3N0YXRlKSA9PSBDQVJEX0RPV04pIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogQ2FyZCBnb2luZyBkb3duIGZvciByZXNldFxuIiwKKwkJCSAgZGV2LT5uYW1lKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPnR4X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcXVldWUgPSAwOworCXB1dF9vZmYgPSAodTE2KSBtYWNfY29udHJvbC0+dHhfY3Vycl9wdXRfaW5mb1txdWV1ZV0ub2Zmc2V0OworCWdldF9vZmYgPSAodTE2KSBtYWNfY29udHJvbC0+dHhfY3Vycl9nZXRfaW5mb1txdWV1ZV0ub2Zmc2V0OworCXR4ZHAgPSAoVHhEX3QgKikgc3AtPmxpc3RfaW5mb1txdWV1ZV1bcHV0X29mZl0ubGlzdF92aXJ0X2FkZHI7CisKKwlxdWV1ZV9sZW4gPSBtYWNfY29udHJvbC0+dHhfY3Vycl9wdXRfaW5mb1txdWV1ZV0uZmlmb19sZW4gKyAxOworCS8qIEF2b2lkICJwdXQiIHBvaW50ZXIgZ29pbmcgYmV5b25kICJnZXQiIHBvaW50ZXIgKi8KKwlpZiAodHhkcC0+SG9zdF9Db250cm9sIHx8ICgoKHB1dF9vZmYgKyAxKSAlIHF1ZXVlX2xlbikgPT0gZ2V0X29mZikpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICJFcnJvciBpbiB4bWl0LCBObyBmcmVlIFRYRHMuXG4iKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwLT50eF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKyNpZmRlZiBORVRJRl9GX1RTTworCW1zcyA9IHNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemU7CisJaWYgKG1zcykgeworCQl0eGRwLT5Db250cm9sXzEgfD0gVFhEX1RDUF9MU09fRU47CisJCXR4ZHAtPkNvbnRyb2xfMSB8PSBUWERfVENQX0xTT19NU1MobXNzKTsKKwl9CisjZW5kaWYKKworCWZyZ19jbnQgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCWZyZ19sZW4gPSBza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW47CisKKwl0eGRwLT5Ib3N0X0NvbnRyb2wgPSAodW5zaWduZWQgbG9uZykgc2tiOworCXR4ZHAtPkJ1ZmZlcl9Qb2ludGVyID0gcGNpX21hcF9zaW5nbGUKKwkgICAgKHNwLT5wZGV2LCBza2ItPmRhdGEsIGZyZ19sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQl0eGRwLT5Db250cm9sXzIgfD0KKwkJICAgIChUWERfVFhfQ0tPX0lQVjRfRU4gfCBUWERfVFhfQ0tPX1RDUF9FTiB8CisJCSAgICAgVFhEX1RYX0NLT19VRFBfRU4pOworCX0KKworCXR4ZHAtPkNvbnRyb2xfMiB8PSBjb25maWctPnR4X2ludHJfdHlwZTsKKworCXR4ZHAtPkNvbnRyb2xfMSB8PSAoVFhEX0JVRkZFUjBfU0laRShmcmdfbGVuKSB8CisJCQkgICAgVFhEX0dBVEhFUl9DT0RFX0ZJUlNUKTsKKwl0eGRwLT5Db250cm9sXzEgfD0gVFhEX0xJU1RfT1dOX1hFTkE7CisKKwkvKiBGb3IgZnJhZ21lbnRlZCBTS0IuICovCisJZm9yIChpID0gMDsgaSA8IGZyZ19jbnQ7IGkrKykgeworCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisJCXR4ZHArKzsKKwkJdHhkcC0+QnVmZmVyX1BvaW50ZXIgPSAodTY0KSBwY2lfbWFwX3BhZ2UKKwkJICAgIChzcC0+cGRldiwgZnJhZy0+cGFnZSwgZnJhZy0+cGFnZV9vZmZzZXQsCisJCSAgICAgZnJhZy0+c2l6ZSwgUENJX0RNQV9UT0RFVklDRSk7CisJCXR4ZHAtPkNvbnRyb2xfMSB8PSBUWERfQlVGRkVSMF9TSVpFKGZyYWctPnNpemUpOworCX0KKwl0eGRwLT5Db250cm9sXzEgfD0gVFhEX0dBVEhFUl9DT0RFX0xBU1Q7CisKKwl0eF9maWZvID0gbWFjX2NvbnRyb2wtPnR4X0ZJRk9fc3RhcnRbcXVldWVdOworCXZhbDY0ID0gc3AtPmxpc3RfaW5mb1txdWV1ZV1bcHV0X29mZl0ubGlzdF9waHlfYWRkcjsKKwl3cml0ZXEodmFsNjQsICZ0eF9maWZvLT5UeERMX1BvaW50ZXIpOworCisJdmFsNjQgPSAoVFhfRklGT19MQVNUX1RYRF9OVU0oZnJnX2NudCkgfCBUWF9GSUZPX0ZJUlNUX0xJU1QgfAorCQkgVFhfRklGT19MQVNUX0xJU1QpOworI2lmZGVmIE5FVElGX0ZfVFNPCisJaWYgKG1zcykKKwkJdmFsNjQgfD0gVFhfRklGT19TUEVDSUFMX0ZVTkM7CisjZW5kaWYKKwl3cml0ZXEodmFsNjQsICZ0eF9maWZvLT5MaXN0X0NvbnRyb2wpOworCisJLyogUGVyZm9ybSBhIFBDSSByZWFkIHRvIGZsdXNoIHByZXZpb3VzIHdyaXRlcyAqLworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X3N0YXR1cyk7CisKKwlwdXRfb2ZmKys7CisJcHV0X29mZiAlPSBtYWNfY29udHJvbC0+dHhfY3Vycl9wdXRfaW5mb1txdWV1ZV0uZmlmb19sZW4gKyAxOworCW1hY19jb250cm9sLT50eF9jdXJyX3B1dF9pbmZvW3F1ZXVlXS5vZmZzZXQgPSBwdXRfb2ZmOworCisJLyogQXZvaWQgInB1dCIgcG9pbnRlciBnb2luZyBiZXlvbmQgImdldCIgcG9pbnRlciAqLworCWlmICgoKHB1dF9vZmYgKyAxKSAlIHF1ZXVlX2xlbikgPT0gZ2V0X29mZikgeworCQlEQkdfUFJJTlQoVFhfREJHLAorCQkJICAiTm8gZnJlZSBUeERzIGZvciB4bWl0LCBQdXQ6IDB4JXggR2V0OjB4JXhcbiIsCisJCQkgIHB1dF9vZmYsIGdldF9vZmYpOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJfQorCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPnR4X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqICBzMmlvX2lzciAtIElTUiBoYW5kbGVyIG9mIHRoZSBkZXZpY2UgLgorICogIEBpcnE6IHRoZSBpcnEgb2YgdGhlIGRldmljZS4KKyAqICBAZGV2X2lkOiBhIHZvaWQgcG9pbnRlciB0byB0aGUgZGV2IHN0cnVjdHVyZSBvZiB0aGUgTklDLgorICogIEBwdF9yZWdzOiBwb2ludGVyIHRvIHRoZSByZWdpc3RlcnMgcHVzaGVkIG9uIHRoZSBzdGFjay4KKyAqICBEZXNjcmlwdGlvbjogIFRoaXMgZnVuY3Rpb24gaXMgdGhlIElTUiBoYW5kbGVyIG9mIHRoZSBkZXZpY2UuIEl0IAorICogIGlkZW50aWZpZXMgdGhlIHJlYXNvbiBmb3IgdGhlIGludGVycnVwdCBhbmQgY2FsbHMgdGhlIHJlbGV2YW50IAorICogIHNlcnZpY2Ugcm91dGluZXMuIEFzIGEgY29udG9uZ2VuY3kgbWVhc3VyZSwgdGhpcyBJU1IgYWxsb2NhdGVzIHRoZSAKKyAqICByZWN2IGJ1ZmZlcnMsIGlmIHRoZWlyIG51bWJlcnMgYXJlIGJlbG93IHRoZSBwYW5pYyB2YWx1ZSB3aGljaCBpcworICogIHByZXNlbnRseSBzZXQgdG8gMjUlIG9mIHRoZSBvcmlnaW5hbCBudW1iZXIgb2YgcmN2IGJ1ZmZlcnMgYWxsb2NhdGVkLgorICogIFJldHVybiB2YWx1ZToKKyAqICAgSVJRX0hBTkRMRUQ6IHdpbGwgYmUgcmV0dXJuZWQgaWYgSVJRIHdhcyBoYW5kbGVkIGJ5IHRoaXMgcm91dGluZSAKKyAqICAgSVJRX05PTkU6IHdpbGwgYmUgcmV0dXJuZWQgaWYgaW50ZXJydXB0IGlzIG5vdCBmcm9tIG91ciBkZXZpY2UKKyAqLworc3RhdGljIGlycXJldHVybl90IHMyaW9faXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKyNpZm5kZWYgQ09ORklHX1MySU9fTkFQSQorCWludCBpLCByZXQ7CisjZW5kaWYKKwl1NjQgcmVhc29uID0gMDsKKwltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CisKKwltYWNfY29udHJvbCA9ICZzcC0+bWFjX2NvbnRyb2w7CisJY29uZmlnID0gJnNwLT5jb25maWc7CisKKwkvKiAKKwkgKiBJZGVudGlmeSB0aGUgY2F1c2UgZm9yIGludGVycnVwdCBhbmQgY2FsbCB0aGUgYXBwcm9wcmlhdGUKKwkgKiBpbnRlcnJ1cHQgaGFuZGxlci4gQ2F1c2VzIGZvciB0aGUgaW50ZXJydXB0IGNvdWxkIGJlOworCSAqIDEuIFJ4IG9mIHBhY2tldC4KKwkgKiAyLiBUeCBjb21wbGV0ZS4KKwkgKiAzLiBMaW5rIGRvd24uCisJICogNC4gRXJyb3IgaW4gYW55IGZ1bmN0aW9uYWwgYmxvY2tzIG9mIHRoZSBOSUMuIAorCSAqLworCXJlYXNvbiA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9zdGF0dXMpOworCisJaWYgKCFyZWFzb24pIHsKKwkJLyogVGhlIGludGVycnVwdCB3YXMgbm90IHJhaXNlZCBieSBYZW5hLiAqLworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJLyogSWYgSW50ciBpcyBiZWNhdXNlIG9mIFR4IFRyYWZmaWMgKi8KKwlpZiAocmVhc29uICYgR0VOX0lOVFJfVFhUUkFGRklDKSB7CisJCXR4X2ludHJfaGFuZGxlcihzcCk7CisJfQorCisJLyogSWYgSW50ciBpcyBiZWNhdXNlIG9mIGFuIGVycm9yICovCisJaWYgKHJlYXNvbiAmIChHRU5fRVJST1JfSU5UUikpCisJCWFsYXJtX2ludHJfaGFuZGxlcihzcCk7CisKKyNpZmRlZiBDT05GSUdfUzJJT19OQVBJCisJaWYgKHJlYXNvbiAmIEdFTl9JTlRSX1JYVFJBRkZJQykgeworCQlpZiAobmV0aWZfcnhfc2NoZWR1bGVfcHJlcChkZXYpKSB7CisJCQllbl9kaXNfYWJsZV9uaWNfaW50cnMoc3AsIFJYX1RSQUZGSUNfSU5UUiwKKwkJCQkJICAgICAgRElTQUJMRV9JTlRSUyk7CisJCQlfX25ldGlmX3J4X3NjaGVkdWxlKGRldik7CisJCX0KKwl9CisjZWxzZQorCS8qIElmIEludHIgaXMgYmVjYXVzZSBvZiBSeCBUcmFmZmljICovCisJaWYgKHJlYXNvbiAmIEdFTl9JTlRSX1JYVFJBRkZJQykgeworCQlyeF9pbnRyX2hhbmRsZXIoc3ApOworCX0KKyNlbmRpZgorCisJLyogCisJICogSWYgdGhlIFJ4IGJ1ZmZlciBjb3VudCBpcyBiZWxvdyB0aGUgcGFuaWMgdGhyZXNob2xkIHRoZW4gCisJICogcmVhbGxvY2F0ZSB0aGUgYnVmZmVycyBmcm9tIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBpdHNlbGYsIAorCSAqIGVsc2Ugc2NoZWR1bGUgYSB0YXNrbGV0IHRvIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlcnMuCisJICovCisjaWZuZGVmIENPTkZJR19TMklPX05BUEkKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CisJCWludCByeGJfc2l6ZSA9IGF0b21pY19yZWFkKCZzcC0+cnhfYnVmc19sZWZ0W2ldKTsKKwkJaW50IGxldmVsID0gcnhfYnVmZmVyX2xldmVsKHNwLCByeGJfc2l6ZSwgaSk7CisKKwkJaWYgKChsZXZlbCA9PSBQQU5JQykgJiYgKCFUQVNLTEVUX0lOX1VTRSkpIHsKKwkJCURCR19QUklOVChJTlRSX0RCRywgIiVzOiBSeCBCRCBoaXQgIiwgZGV2LT5uYW1lKTsKKwkJCURCR19QUklOVChJTlRSX0RCRywgIlBBTklDIGxldmVsc1xuIik7CisJCQlpZiAoKHJldCA9IGZpbGxfcnhfYnVmZmVycyhzcCwgaSkpID09IC1FTk9NRU0pIHsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOk91dCBvZiBtZW1vcnkiLAorCQkJCQkgIGRldi0+bmFtZSk7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICIgaW4gSVNSISFcbiIpOworCQkJCWNsZWFyX2JpdCgwLCAoJnNwLT50YXNrbGV0X3N0YXR1cykpOworCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0KKwkJCWNsZWFyX2JpdCgwLCAoJnNwLT50YXNrbGV0X3N0YXR1cykpOworCQl9IGVsc2UgaWYgKGxldmVsID09IExPVykgeworCQkJdGFza2xldF9zY2hlZHVsZSgmc3AtPnRhc2spOworCQl9CisJfQorI2VuZGlmCisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICogIHMyaW9fZ2V0X3N0YXRzIC0gVXBkYXRlcyB0aGUgZGV2aWNlIHN0YXRpc3RpY3Mgc3RydWN0dXJlLiAKKyAqICBAZGV2IDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KKyAqICBEZXNjcmlwdGlvbjoKKyAqICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIGRldmljZSBzdGF0aXN0aWNzIHN0cnVjdHVyZSBpbiB0aGUgczJpb19uaWMgCisgKiAgc3RydWN0dXJlIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc2FtZS4KKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBuZXRfZGV2aWNlX3N0YXRzIHN0cnVjdHVyZS4KKyAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnMyaW9fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKKworCW1hY19jb250cm9sID0gJnNwLT5tYWNfY29udHJvbDsKKwljb25maWcgPSAmc3AtPmNvbmZpZzsKKworCXNwLT5zdGF0cy50eF9lcnJvcnMgPSBtYWNfY29udHJvbC0+c3RhdHNfaW5mby0+dG1hY19hbnlfZXJyX2ZybXM7CisJc3AtPnN0YXRzLnJ4X2Vycm9ycyA9IG1hY19jb250cm9sLT5zdGF0c19pbmZvLT5ybWFjX2Ryb3BfZnJtczsKKwlzcC0+c3RhdHMubXVsdGljYXN0ID0gbWFjX2NvbnRyb2wtPnN0YXRzX2luZm8tPnJtYWNfdmxkX21jc3RfZnJtczsKKwlzcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9CisJICAgIG1hY19jb250cm9sLT5zdGF0c19pbmZvLT5ybWFjX2xvbmdfZnJtczsKKworCXJldHVybiAoJnNwLT5zdGF0cyk7Cit9CisKKy8qKgorICogIHMyaW9fc2V0X211bHRpY2FzdCAtIGVudHJ5IHBvaW50IGZvciBtdWx0aWNhc3QgYWRkcmVzcyBlbmFibGUvZGlzYWJsZS4KKyAqICBAZGV2IDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogIERlc2NyaXB0aW9uOgorICogIFRoaXMgZnVuY3Rpb24gaXMgYSBkcml2ZXIgZW50cnkgcG9pbnQgd2hpY2ggZ2V0cyBjYWxsZWQgYnkgdGhlIGtlcm5lbCAKKyAqICB3aGVuZXZlciBtdWx0aWNhc3QgYWRkcmVzc2VzIG11c3QgYmUgZW5hYmxlZC9kaXNhYmxlZC4gVGhpcyBhbHNvIGdldHMgCisgKiAgY2FsbGVkIHRvIHNldC9yZXNldCBwcm9taXNjdW91cyBtb2RlLiBEZXBlbmRpbmcgb24gdGhlIGRlaXZjZSBmbGFnLCB3ZQorICogIGRldGVybWluZSwgaWYgbXVsdGljYXN0IGFkZHJlc3MgbXVzdCBiZSBlbmFibGVkIG9yIGlmIHByb21pc2N1b3VzIG1vZGUKKyAqICBpcyB0byBiZSBkaXNhYmxlZCBldGMuCisgKiAgUmV0dXJuIHZhbHVlOgorICogIHZvaWQuCisgKi8KKworc3RhdGljIHZvaWQgczJpb19zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGksIGosIHByZXZfY250OworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJdTY0IHZhbDY0ID0gMCwgbXVsdGlfbWFjID0gMHgwMTAyMDMwNDA1MDZVTEwsIG1hc2sgPQorCSAgICAweGZlZmZmZmZmZmZmZlVMTDsKKwl1NjQgZGlzX2FkZHIgPSAweGZmZmZmZmZmZmZmZlVMTCwgbWFjX2FkZHIgPSAwOworCXZvaWQgX19pb21lbSAqYWRkOworCisJaWYgKChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSAmJiAoIXNwLT5tX2Nhc3RfZmxnKSkgeworCQkvKiAgRW5hYmxlIGFsbCBNdWx0aWNhc3QgYWRkcmVzc2VzICovCisJCXdyaXRlcShSTUFDX0FERFJfREFUQTBfTUVNX0FERFIobXVsdGlfbWFjKSwKKwkJICAgICAgICZiYXIwLT5ybWFjX2FkZHJfZGF0YTBfbWVtKTsKKwkJd3JpdGVxKFJNQUNfQUREUl9EQVRBMV9NRU1fTUFTSyhtYXNrKSwKKwkJICAgICAgICZiYXIwLT5ybWFjX2FkZHJfZGF0YTFfbWVtKTsKKwkJdmFsNjQgPSBSTUFDX0FERFJfQ01EX01FTV9XRSB8CisJCSAgICBSTUFDX0FERFJfQ01EX01FTV9TVFJPQkVfTkVXX0NNRCB8CisJCSAgICBSTUFDX0FERFJfQ01EX01FTV9PRkZTRVQoTUFDX01DX0FMTF9NQ19BRERSX09GRlNFVCk7CisJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnJtYWNfYWRkcl9jbWRfbWVtKTsKKwkJLyogV2FpdCB0aWxsIGNvbW1hbmQgY29tcGxldGVzICovCisJCXdhaXRfZm9yX2NtZF9jb21wbGV0ZShzcCk7CisKKwkJc3AtPm1fY2FzdF9mbGcgPSAxOworCQlzcC0+YWxsX211bHRpX3BvcyA9IE1BQ19NQ19BTExfTUNfQUREUl9PRkZTRVQ7CisJfSBlbHNlIGlmICgoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgJiYgKHNwLT5tX2Nhc3RfZmxnKSkgeworCQkvKiAgRGlzYWJsZSBhbGwgTXVsdGljYXN0IGFkZHJlc3NlcyAqLworCQl3cml0ZXEoUk1BQ19BRERSX0RBVEEwX01FTV9BRERSKGRpc19hZGRyKSwKKwkJICAgICAgICZiYXIwLT5ybWFjX2FkZHJfZGF0YTBfbWVtKTsKKwkJdmFsNjQgPSBSTUFDX0FERFJfQ01EX01FTV9XRSB8CisJCSAgICBSTUFDX0FERFJfQ01EX01FTV9TVFJPQkVfTkVXX0NNRCB8CisJCSAgICBSTUFDX0FERFJfQ01EX01FTV9PRkZTRVQoc3AtPmFsbF9tdWx0aV9wb3MpOworCQl3cml0ZXEodmFsNjQsICZiYXIwLT5ybWFjX2FkZHJfY21kX21lbSk7CisJCS8qIFdhaXQgdGlsbCBjb21tYW5kIGNvbXBsZXRlcyAqLworCQl3YWl0X2Zvcl9jbWRfY29tcGxldGUoc3ApOworCisJCXNwLT5tX2Nhc3RfZmxnID0gMDsKKwkJc3AtPmFsbF9tdWx0aV9wb3MgPSAwOworCX0KKworCWlmICgoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSAmJiAoIXNwLT5wcm9taXNjX2ZsZykpIHsKKwkJLyogIFB1dCB0aGUgTklDIGludG8gcHJvbWlzY3VvdXMgbW9kZSAqLworCQlhZGQgPSAmYmFyMC0+bWFjX2NmZzsKKwkJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWFjX2NmZyk7CisJCXZhbDY0IHw9IE1BQ19DRkdfUk1BQ19QUk9NX0VOQUJMRTsKKworCQl3cml0ZXEoUk1BQ19DRkdfS0VZKDB4NEMwRCksICZiYXIwLT5ybWFjX2NmZ19rZXkpOworCQl3cml0ZWwoKHUzMikgdmFsNjQsIGFkZCk7CisJCXdyaXRlcShSTUFDX0NGR19LRVkoMHg0QzBEKSwgJmJhcjAtPnJtYWNfY2ZnX2tleSk7CisJCXdyaXRlbCgodTMyKSAodmFsNjQgPj4gMzIpLCAoYWRkICsgNCkpOworCisJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPm1hY19jZmcpOworCQlzcC0+cHJvbWlzY19mbGcgPSAxOworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBlbnRlcmVkIHByb21pc2N1b3VzIG1vZGVcbiIsCisJCQkgIGRldi0+bmFtZSk7CisJfSBlbHNlIGlmICghKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgJiYgKHNwLT5wcm9taXNjX2ZsZykpIHsKKwkJLyogIFJlbW92ZSB0aGUgTklDIGZyb20gcHJvbWlzY3VvdXMgbW9kZSAqLworCQlhZGQgPSAmYmFyMC0+bWFjX2NmZzsKKwkJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWFjX2NmZyk7CisJCXZhbDY0ICY9IH5NQUNfQ0ZHX1JNQUNfUFJPTV9FTkFCTEU7CisKKwkJd3JpdGVxKFJNQUNfQ0ZHX0tFWSgweDRDMEQpLCAmYmFyMC0+cm1hY19jZmdfa2V5KTsKKwkJd3JpdGVsKCh1MzIpIHZhbDY0LCBhZGQpOworCQl3cml0ZXEoUk1BQ19DRkdfS0VZKDB4NEMwRCksICZiYXIwLT5ybWFjX2NmZ19rZXkpOworCQl3cml0ZWwoKHUzMikgKHZhbDY0ID4+IDMyKSwgKGFkZCArIDQpKTsKKworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tYWNfY2ZnKTsKKwkJc3AtPnByb21pc2NfZmxnID0gMDsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogbGVmdCBwcm9taXNjdW91cyBtb2RlXG4iLAorCQkJICBkZXYtPm5hbWUpOworCX0KKworCS8qICBVcGRhdGUgaW5kaXZpZHVhbCBNX0NBU1QgYWRkcmVzcyBsaXN0ICovCisJaWYgKCghc3AtPm1fY2FzdF9mbGcpICYmIGRldi0+bWNfY291bnQpIHsKKwkJaWYgKGRldi0+bWNfY291bnQgPgorCQkgICAgKE1BWF9BRERSU19TVVBQT1JURUQgLSBNQUNfTUNfQUREUl9TVEFSVF9PRkZTRVQgLSAxKSkgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogTm8gbW9yZSBSeCBmaWx0ZXJzICIsCisJCQkJICBkZXYtPm5hbWUpOworCQkJREJHX1BSSU5UKEVSUl9EQkcsICJjYW4gYmUgYWRkZWQsIHBsZWFzZSBlbmFibGUgIik7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywgIkFMTF9NVUxUSSBpbnN0ZWFkXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXByZXZfY250ID0gc3AtPm1jX2FkZHJfY291bnQ7CisJCXNwLT5tY19hZGRyX2NvdW50ID0gZGV2LT5tY19jb3VudDsKKworCQkvKiBDbGVhciBvdXQgdGhlIHByZXZpb3VzIGxpc3Qgb2YgTWMgaW4gdGhlIEgvVy4gKi8KKwkJZm9yIChpID0gMDsgaSA8IHByZXZfY250OyBpKyspIHsKKwkJCXdyaXRlcShSTUFDX0FERFJfREFUQTBfTUVNX0FERFIoZGlzX2FkZHIpLAorCQkJICAgICAgICZiYXIwLT5ybWFjX2FkZHJfZGF0YTBfbWVtKTsKKwkJCXdyaXRlcShSTUFDX0FERFJfREFUQTFfTUVNX01BU0soMFVMTCksCisJCSAgICAgICAJCSZiYXIwLT5ybWFjX2FkZHJfZGF0YTFfbWVtKTsKKwkJCXZhbDY0ID0gUk1BQ19BRERSX0NNRF9NRU1fV0UgfAorCQkJICAgIFJNQUNfQUREUl9DTURfTUVNX1NUUk9CRV9ORVdfQ01EIHwKKwkJCSAgICBSTUFDX0FERFJfQ01EX01FTV9PRkZTRVQKKwkJCSAgICAoTUFDX01DX0FERFJfU1RBUlRfT0ZGU0VUICsgaSk7CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5ybWFjX2FkZHJfY21kX21lbSk7CisKKwkJCS8qIFdhaXQgZm9yIGNvbW1hbmQgY29tcGxldGVzICovCisJCQlpZiAod2FpdF9mb3JfY21kX2NvbXBsZXRlKHNwKSkgeworCQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IEFkZGluZyAiLAorCQkJCQkgIGRldi0+bmFtZSk7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICJNdWx0aWNhc3RzIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJLyogQ3JlYXRlIHRoZSBuZXcgUnggZmlsdGVyIGxpc3QgYW5kIHVwZGF0ZSB0aGUgc2FtZSBpbiBIL1cuICovCisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgaSA8IGRldi0+bWNfY291bnQ7CisJCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCW1lbWNweShzcC0+dXNyX2FkZHJzW2ldLmFkZHIsIG1jbGlzdC0+ZG1pX2FkZHIsCisJCQkgICAgICAgRVRIX0FMRU4pOworCQkJZm9yIChqID0gMDsgaiA8IEVUSF9BTEVOOyBqKyspIHsKKwkJCQltYWNfYWRkciB8PSBtY2xpc3QtPmRtaV9hZGRyW2pdOworCQkJCW1hY19hZGRyIDw8PSA4OworCQkJfQorCQkJbWFjX2FkZHIgPj49IDg7CisJCQl3cml0ZXEoUk1BQ19BRERSX0RBVEEwX01FTV9BRERSKG1hY19hZGRyKSwKKwkJCSAgICAgICAmYmFyMC0+cm1hY19hZGRyX2RhdGEwX21lbSk7CisJCQl3cml0ZXEoUk1BQ19BRERSX0RBVEExX01FTV9NQVNLKDBVTEwpLAorCQkgICAgICAgCQkmYmFyMC0+cm1hY19hZGRyX2RhdGExX21lbSk7CisKKwkJCXZhbDY0ID0gUk1BQ19BRERSX0NNRF9NRU1fV0UgfAorCQkJICAgIFJNQUNfQUREUl9DTURfTUVNX1NUUk9CRV9ORVdfQ01EIHwKKwkJCSAgICBSTUFDX0FERFJfQ01EX01FTV9PRkZTRVQKKwkJCSAgICAoaSArIE1BQ19NQ19BRERSX1NUQVJUX09GRlNFVCk7CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5ybWFjX2FkZHJfY21kX21lbSk7CisKKwkJCS8qIFdhaXQgZm9yIGNvbW1hbmQgY29tcGxldGVzICovCisJCQlpZiAod2FpdF9mb3JfY21kX2NvbXBsZXRlKHNwKSkgeworCQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IEFkZGluZyAiLAorCQkJCQkgIGRldi0+bmFtZSk7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICJNdWx0aWNhc3RzIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorfQorCisvKioKKyAqICBzMmlvX3NldF9tYWNfYWRkciAtIFByb2dyYW1zIHRoZSBYZnJhbWUgbWFjIGFkZHJlc3MgCisgKiAgQGRldiA6IHBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUuCisgKiAgQGFkZHI6IGEgdWNoYXIgcG9pbnRlciB0byB0aGUgbmV3IG1hYyBhZGRyZXNzIHdoaWNoIGlzIHRvIGJlIHNldC4KKyAqICBEZXNjcmlwdGlvbiA6IFRoaXMgcHJvY2VkdXJlIHdpbGwgcHJvZ3JhbSB0aGUgWGZyYW1lIHRvIHJlY2VpdmUgCisgKiAgZnJhbWVzIHdpdGggbmV3IE1hYyBBZGRyZXNzCisgKiAgUmV0dXJuIHZhbHVlOiBTVUNDRVNTIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlICgtKXZlIGludGVnZXIgCisgKiAgYXMgZGVmaW5lZCBpbiBlcnJuby5oIGZpbGUgb24gZmFpbHVyZS4KKyAqLworCitpbnQgczJpb19zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKiBhZGRyKQoreworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJcmVnaXN0ZXIgdTY0IHZhbDY0LCBtYWNfYWRkciA9IDA7CisJaW50IGk7CisKKwkvKiAKKwkgKiBTZXQgdGhlIG5ldyBNQUMgYWRkcmVzcyBhcyB0aGUgbmV3IHVuaWNhc3QgZmlsdGVyIGFuZCByZWZsZWN0IHRoaXMKKwkgKiBjaGFuZ2Ugb24gdGhlIGRldmljZSBhZGRyZXNzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgT1MuIEl0IHdpbGwgYmUKKwkgKiBhdCBvZmZzZXQgMC4gCisJICovCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKwkJbWFjX2FkZHIgPDw9IDg7CisJCW1hY19hZGRyIHw9IGFkZHJbaV07CisJfQorCisJd3JpdGVxKFJNQUNfQUREUl9EQVRBMF9NRU1fQUREUihtYWNfYWRkciksCisJICAgICAgICZiYXIwLT5ybWFjX2FkZHJfZGF0YTBfbWVtKTsKKworCXZhbDY0ID0KKwkgICAgUk1BQ19BRERSX0NNRF9NRU1fV0UgfCBSTUFDX0FERFJfQ01EX01FTV9TVFJPQkVfTkVXX0NNRCB8CisJICAgIFJNQUNfQUREUl9DTURfTUVNX09GRlNFVCgwKTsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5ybWFjX2FkZHJfY21kX21lbSk7CisJLyogV2FpdCB0aWxsIGNvbW1hbmQgY29tcGxldGVzICovCisJaWYgKHdhaXRfZm9yX2NtZF9jb21wbGV0ZShzcCkpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogc2V0X21hY19hZGRyIGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIEZBSUxVUkU7CisJfQorCisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICogczJpb19ldGh0b29sX3NzZXQgLSBTZXRzIGRpZmZlcmVudCBsaW5rIHBhcmFtZXRlcnMuIAorICogQHNwIDogcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGUgICogczJpb19uaWMgc3RydWN0dXJlLgorICogQGluZm86IHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSB3aXRoIHBhcmFtZXRlcnMgZ2l2ZW4gYnkgZXRodG9vbCB0byBzZXQKKyAqIGxpbmsgaW5mb3JtYXRpb24uCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoZSBmdW5jdGlvbiBzZXRzIGRpZmZlcmVudCBsaW5rIHBhcmFtZXRlcnMgcHJvdmlkZWQgYnkgdGhlIHVzZXIgb250byAKKyAqIHRoZSBOSUMuCisgKiBSZXR1cm4gdmFsdWU6CisgKiAwIG9uIHN1Y2Nlc3MuCisqLworCitzdGF0aWMgaW50IHMyaW9fZXRodG9vbF9zc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBldGh0b29sX2NtZCAqaW5mbykKK3sKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisJaWYgKChpbmZvLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB8fAorCSAgICAoaW5mby0+c3BlZWQgIT0gU1BFRURfMTAwMDApIHx8IChpbmZvLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlIHsKKwkJczJpb19jbG9zZShzcC0+ZGV2KTsKKwkJczJpb19vcGVuKHNwLT5kZXYpOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHMyaW9fZXRodG9sX2dzZXQgLSBSZXR1cm4gbGluayBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gCisgKiBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgcG9pbnRlciB0byB0aGUKKyAqICAgICAgczJpb19uaWMgc3RydWN0dXJlLgorICogQGluZm8gOiBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgd2l0aCBwYXJhbWV0ZXJzIGdpdmVuIGJ5IGV0aHRvb2wKKyAqIHRvIHJldHVybiBsaW5rIGluZm9ybWF0aW9uLgorICogRGVzY3JpcHRpb246CisgKiBSZXR1cm5zIGxpbmsgc3BlY2lmaWMgaW5mb3JtYXRpb24gbGlrZSBzcGVlZCwgZHVwbGV4IGV0Yy4uIHRvIGV0aHRvb2wuCisgKiBSZXR1cm4gdmFsdWUgOgorICogcmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworCitzdGF0aWMgaW50IHMyaW9fZXRodG9vbF9nc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqaW5mbykKK3sKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisJaW5mby0+c3VwcG9ydGVkID0gKFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfRklCUkUpOworCWluZm8tPmFkdmVydGlzaW5nID0gKFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfRklCUkUpOworCWluZm8tPnBvcnQgPSBQT1JUX0ZJQlJFOworCS8qIGluZm8tPnRyYW5zY2VpdmVyPz8gVE9ETyAqLworCisJaWYgKG5ldGlmX2NhcnJpZXJfb2soc3AtPmRldikpIHsKKwkJaW5mby0+c3BlZWQgPSAxMDAwMDsKKwkJaW5mby0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJfSBlbHNlIHsKKwkJaW5mby0+c3BlZWQgPSAtMTsKKwkJaW5mby0+ZHVwbGV4ID0gLTE7CisJfQorCisJaW5mby0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzMmlvX2V0aHRvb2xfZ2RydmluZm8gLSBSZXR1cm5zIGRyaXZlciBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gCisgKiBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZSAKKyAqIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqIEBpbmZvIDogcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIHdpdGggcGFyYW1ldGVycyBnaXZlbiBieSBldGh0b29sIHRvCisgKiByZXR1cm4gZHJpdmVyIGluZm9ybWF0aW9uLgorICogRGVzY3JpcHRpb246CisgKiBSZXR1cm5zIGRyaXZlciBzcGVjZWZpYyBpbmZvcm1hdGlvbiBsaWtlIG5hbWUsIHZlcnNpb24gZXRjLi4gdG8gZXRodG9vbC4KKyAqIFJldHVybiB2YWx1ZToKKyAqICB2b2lkCisgKi8KKworc3RhdGljIHZvaWQgczJpb19ldGh0b29sX2dkcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKworCXN0cm5jcHkoaW5mby0+ZHJpdmVyLCBzMmlvX2RyaXZlcl9uYW1lLCBzaXplb2YoczJpb19kcml2ZXJfbmFtZSkpOworCXN0cm5jcHkoaW5mby0+dmVyc2lvbiwgczJpb19kcml2ZXJfdmVyc2lvbiwKKwkJc2l6ZW9mKHMyaW9fZHJpdmVyX3ZlcnNpb24pKTsKKwlzdHJuY3B5KGluZm8tPmZ3X3ZlcnNpb24sICIiLCAzMik7CisJc3RybmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoc3AtPnBkZXYpLCAzMik7CisJaW5mby0+cmVnZHVtcF9sZW4gPSBYRU5BX1JFR19TUEFDRTsKKwlpbmZvLT5lZWR1bXBfbGVuID0gWEVOQV9FRVBST01fU1BBQ0U7CisJaW5mby0+dGVzdGluZm9fbGVuID0gUzJJT19URVNUX0xFTjsKKwlpbmZvLT5uX3N0YXRzID0gUzJJT19TVEFUX0xFTjsKK30KKworLyoqCisgKiAgczJpb19ldGh0b29sX2dyZWdzIC0gZHVtcHMgdGhlIGVudGlyZSBzcGFjZSBvZiBYZmFtZSBpbnRvIHRoZSBidWZmZXIuCisgKiAgQHNwOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZSAKKyAqICBzMmlvX25pYyBzdHJ1Y3R1cmUuCisgKiAgQHJlZ3MgOiBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgd2l0aCBwYXJhbWV0ZXJzIGdpdmVuIGJ5IGV0aHRvb2wgZm9yIAorICogIGR1bXBpbmcgdGhlIHJlZ2lzdGVycy4KKyAqICBAcmVnX3NwYWNlOiBUaGUgaW5wdXQgYXJndW1uZXQgaW50byB3aGljaCBhbGwgdGhlIHJlZ2lzdGVycyBhcmUgZHVtcGVkLgorICogIERlc2NyaXB0aW9uOgorICogIER1bXBzIHRoZSBlbnRpcmUgcmVnaXN0ZXIgc3BhY2Ugb2YgeEZyYW1lIE5JQyBpbnRvIHRoZSB1c2VyIGdpdmVuCisgKiAgYnVmZmVyIGFyZWEuCisgKiBSZXR1cm4gdmFsdWUgOgorICogdm9pZCAuCisqLworCitzdGF0aWMgdm9pZCBzMmlvX2V0aHRvb2xfZ3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLCB2b2lkICpzcGFjZSkKK3sKKwlpbnQgaTsKKwl1NjQgcmVnOworCXU4ICpyZWdfc3BhY2UgPSAodTggKikgc3BhY2U7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCisJcmVncy0+bGVuID0gWEVOQV9SRUdfU1BBQ0U7CisJcmVncy0+dmVyc2lvbiA9IHNwLT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlOworCisJZm9yIChpID0gMDsgaSA8IHJlZ3MtPmxlbjsgaSArPSA4KSB7CisJCXJlZyA9IHJlYWRxKHNwLT5iYXIwICsgaSk7CisJCW1lbWNweSgocmVnX3NwYWNlICsgaSksICZyZWcsIDgpOworCX0KK30KKworLyoqCisgKiAgczJpb19waHlfaWQgIC0gdGltZXIgZnVuY3Rpb24gdGhhdCBhbHRlcm5hdGVzIGFkYXB0ZXIgTEVELgorICogIEBkYXRhIDogYWRkcmVzcyBvZiB0aGUgcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIAorICogIGlzIGEgcG9pbnRlciB0byB0aGUgczJpb19uaWMgc3RydWN0dXJlLCBwcm92aWRlZCBhcyBhbiB1MzIuCisgKiBEZXNjcmlwdGlvbjogVGhpcyBpcyBhY3R1YWxseSB0aGUgdGltZXIgZnVuY3Rpb24gdGhhdCBhbHRlcm5hdGVzIHRoZSAKKyAqIGFkYXB0ZXIgTEVEIGJpdCBvZiB0aGUgYWRhcHRlciBjb250cm9sIGJpdCB0byBzZXQvcmVzZXQgZXZlcnkgdGltZSBvbiAKKyAqIGludm9jYXRpb24uIFRoZSB0aW1lciBpcyBzZXQgZm9yIDEvMiBhIHNlY29uZCwgaGVuY2UgdGhhIE5JQyBibGlua3MgCisgKiAgb25jZSBldmVyeSBzZWNvbmQuCisqLworc3RhdGljIHZvaWQgczJpb19waHlfaWQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCW5pY190ICpzcCA9IChuaWNfdCAqKSBkYXRhOworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKwl1NjQgdmFsNjQgPSAwOworCXUxNiBzdWJpZDsKKworCXN1YmlkID0gc3AtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisJaWYgKChzdWJpZCAmIDB4RkYpID49IDB4MDcpIHsKKwkJdmFsNjQgPSByZWFkcSgmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwkJdmFsNjQgXj0gR1BJT19DVFJMX0dQSU9fMDsKKwkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwl9IGVsc2UgeworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCQl2YWw2NCBePSBBREFQVEVSX0xFRF9PTjsKKwkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+YWRhcHRlcl9jb250cm9sKTsKKwl9CisKKwltb2RfdGltZXIoJnNwLT5pZF90aW1lciwgamlmZmllcyArIEhaIC8gMik7Cit9CisKKy8qKgorICogczJpb19ldGh0b29sX2lkbmljIC0gVG8gcGh5c2ljYWxseSBpZGVudGlmeSB0aGUgbmljIG9uIHRoZSBzeXN0ZW0uCisgKiBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZQorICogczJpb19uaWMgc3RydWN0dXJlLgorICogQGlkIDogcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIHdpdGggaWRlbnRpZmljYXRpb24gcGFyYW1ldGVycyBnaXZlbiBieSAKKyAqIGV0aHRvb2wuCisgKiBEZXNjcmlwdGlvbjogVXNlZCB0byBwaHlzaWNhbGx5IGlkZW50aWZ5IHRoZSBOSUMgb24gdGhlIHN5c3RlbS4KKyAqIFRoZSBMaW5rIExFRCB3aWxsIGJsaW5rIGZvciBhIHRpbWUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIGZvciAKKyAqIGlkZW50aWZpY2F0aW9uLgorICogTk9URTogVGhlIExpbmsgaGFzIHRvIGJlIFVwIHRvIGJlIGFibGUgdG8gYmxpbmsgdGhlIExFRC4gSGVuY2UgCisgKiBpZGVudGlmaWNhdGlvbiBpcyBwb3NzaWJsZSBvbmx5IGlmIGl0J3MgbGluayBpcyB1cC4KKyAqIFJldHVybiB2YWx1ZToKKyAqIGludCAsIHJldHVybnMgMCBvbiBzdWNjZXNzCisgKi8KKworc3RhdGljIGludCBzMmlvX2V0aHRvb2xfaWRuaWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCit7CisJdTY0IHZhbDY0ID0gMCwgbGFzdF9ncGlvX2N0cmxfdmFsOworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJdTE2IHN1YmlkOworCisJc3ViaWQgPSBzcC0+cGRldi0+c3Vic3lzdGVtX2RldmljZTsKKwlsYXN0X2dwaW9fY3RybF92YWwgPSByZWFkcSgmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwlpZiAoKHN1YmlkICYgMHhGRikgPCAweDA3KSB7CisJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfY29udHJvbCk7CisJCWlmICghKHZhbDY0ICYgQURBUFRFUl9DTlRMX0VOKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIkFkYXB0ZXIgTGluayBkb3duLCBjYW5ub3QgYmxpbmsgTEVEXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCWlmIChzcC0+aWRfdGltZXIuZnVuY3Rpb24gPT0gTlVMTCkgeworCQlpbml0X3RpbWVyKCZzcC0+aWRfdGltZXIpOworCQlzcC0+aWRfdGltZXIuZnVuY3Rpb24gPSBzMmlvX3BoeV9pZDsKKwkJc3AtPmlkX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgc3A7CisJfQorCW1vZF90aW1lcigmc3AtPmlkX3RpbWVyLCBqaWZmaWVzKTsKKwlpZiAoZGF0YSkKKwkJbXNsZWVwKGRhdGEgKiAxMDAwKTsKKwllbHNlCisJCW1zbGVlcCgweEZGRkZGRkZGKTsKKwlkZWxfdGltZXJfc3luYygmc3AtPmlkX3RpbWVyKTsKKworCWlmIChDQVJEU19XSVRIX0ZBVUxUWV9MSU5LX0lORElDQVRPUlMoc3ViaWQpKSB7CisJCXdyaXRlcShsYXN0X2dwaW9fY3RybF92YWwsICZiYXIwLT5ncGlvX2NvbnRyb2wpOworCQlsYXN0X2dwaW9fY3RybF92YWwgPSByZWFkcSgmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzMmlvX2V0aHRvb2xfZ2V0cGF1c2VfZGF0YSAtUGF1c2UgZnJhbWUgZnJhbWUgZ2VuZXJhdGlvbiBhbmQgcmVjZXB0aW9uLgorICogQHNwIDogcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGUgICogczJpb19uaWMgc3RydWN0dXJlLgorICogQGVwIDogcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIHdpdGggcGF1c2UgcGFyYW1ldGVycyBnaXZlbiBieSBldGh0b29sLgorICogRGVzY3JpcHRpb246CisgKiBSZXR1cm5zIHRoZSBQYXVzZSBmcmFtZSBnZW5lcmF0aW9uIGFuZCByZWNlcHRpb24gY2FwYWJpbGl0eSBvZiB0aGUgTklDLgorICogUmV0dXJuIHZhbHVlOgorICogIHZvaWQKKyAqLworc3RhdGljIHZvaWQgczJpb19ldGh0b29sX2dldHBhdXNlX2RhdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZXApCit7CisJdTY0IHZhbDY0OworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ybWFjX3BhdXNlX2NmZyk7CisJaWYgKHZhbDY0ICYgUk1BQ19QQVVTRV9HRU5fRU5BQkxFKQorCQllcC0+dHhfcGF1c2UgPSBUUlVFOworCWlmICh2YWw2NCAmIFJNQUNfUEFVU0VfUlhfRU5BQkxFKQorCQllcC0+cnhfcGF1c2UgPSBUUlVFOworCWVwLT5hdXRvbmVnID0gRkFMU0U7Cit9CisKKy8qKgorICogczJpb19ldGh0b29sX3NldHBhdXNlX2RhdGEgLSAgc2V0L3Jlc2V0IHBhdXNlIGZyYW1lIGdlbmVyYXRpb24uCisgKiBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZSAKKyAqICAgICAgczJpb19uaWMgc3RydWN0dXJlLgorICogQGVwIDogcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIHdpdGggcGF1c2UgcGFyYW1ldGVycyBnaXZlbiBieSBldGh0b29sLgorICogRGVzY3JpcHRpb246CisgKiBJdCBjYW4gYmUgdXNlZCB0byBzZXQgb3IgcmVzZXQgUGF1c2UgZnJhbWUgZ2VuZXJhdGlvbiBvciByZWNlcHRpb24KKyAqIHN1cHBvcnQgb2YgdGhlIE5JQy4KKyAqIFJldHVybiB2YWx1ZToKKyAqIGludCwgcmV0dXJucyAwIG9uIFN1Y2Nlc3MKKyAqLworCitzdGF0aWMgaW50IHMyaW9fZXRodG9vbF9zZXRwYXVzZV9kYXRhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZXApCit7CisJdTY0IHZhbDY0OworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ybWFjX3BhdXNlX2NmZyk7CisJaWYgKGVwLT50eF9wYXVzZSkKKwkJdmFsNjQgfD0gUk1BQ19QQVVTRV9HRU5fRU5BQkxFOworCWVsc2UKKwkJdmFsNjQgJj0gflJNQUNfUEFVU0VfR0VOX0VOQUJMRTsKKwlpZiAoZXAtPnJ4X3BhdXNlKQorCQl2YWw2NCB8PSBSTUFDX1BBVVNFX1JYX0VOQUJMRTsKKwllbHNlCisJCXZhbDY0ICY9IH5STUFDX1BBVVNFX1JYX0VOQUJMRTsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5ybWFjX3BhdXNlX2NmZyk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcmVhZF9lZXByb20gLSByZWFkcyA0IGJ5dGVzIG9mIGRhdGEgZnJvbSB1c2VyIGdpdmVuIG9mZnNldC4KKyAqIEBzcCA6IHByaXZhdGUgbWVtYmVyIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLCB3aGljaCBpcyBhIHBvaW50ZXIgdG8gdGhlIAorICogICAgICBzMmlvX25pYyBzdHJ1Y3R1cmUuCisgKiBAb2ZmIDogb2Zmc2V0IGF0IHdoaWNoIHRoZSBkYXRhIG11c3QgYmUgd3JpdHRlbgorICogQGRhdGEgOiBJdHMgYW4gb3V0cHV0IHBhcmFtZXRlciB3aGVyZSB0aGUgZGF0YSByZWFkIGF0IHRoZSBnaXZlbgorICogCW9mZnNldCBpcyBzdG9yZWQuCisgKiBEZXNjcmlwdGlvbjoKKyAqIFdpbGwgcmVhZCA0IGJ5dGVzIG9mIGRhdGEgZnJvbSB0aGUgdXNlciBnaXZlbiBvZmZzZXQgYW5kIHJldHVybiB0aGUgCisgKiByZWFkIGRhdGEuCisgKiBOT1RFOiBXaWxsIGFsbG93IHRvIHJlYWQgb25seSBwYXJ0IG9mIHRoZSBFRVBST00gdmlzaWJsZSB0aHJvdWdoIHRoZQorICogICBJMkMgYnVzLgorICogUmV0dXJuIHZhbHVlOgorICogIC0xIG9uIGZhaWx1cmUgYW5kIDAgb24gc3VjY2Vzcy4KKyAqLworCisjZGVmaW5lIFMySU9fREVWX0lECQk1CitzdGF0aWMgaW50IHJlYWRfZWVwcm9tKG5pY190ICogc3AsIGludCBvZmYsIHUzMiAqIGRhdGEpCit7CisJaW50IHJldCA9IC0xOworCXUzMiBleGl0X2NudCA9IDA7CisJdTY0IHZhbDY0OworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKworCXZhbDY0ID0gSTJDX0NPTlRST0xfREVWX0lEKFMySU9fREVWX0lEKSB8IEkyQ19DT05UUk9MX0FERFIob2ZmKSB8CisJICAgIEkyQ19DT05UUk9MX0JZVEVfQ05UKDB4MykgfCBJMkNfQ09OVFJPTF9SRUFEIHwKKwkgICAgSTJDX0NPTlRST0xfQ05UTF9TVEFSVDsKKwlTUEVDSUFMX1JFR19XUklURSh2YWw2NCwgJmJhcjAtPmkyY19jb250cm9sLCBMRik7CisKKwl3aGlsZSAoZXhpdF9jbnQgPCA1KSB7CisJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmkyY19jb250cm9sKTsKKwkJaWYgKEkyQ19DT05UUk9MX0NOVExfRU5EKHZhbDY0KSkgeworCQkJKmRhdGEgPSBJMkNfQ09OVFJPTF9HRVRfREFUQSh2YWw2NCk7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJbXNsZWVwKDUwKTsKKwkJZXhpdF9jbnQrKzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqICB3cml0ZV9lZXByb20gLSBhY3R1YWxseSB3cml0ZXMgdGhlIHJlbGV2YW50IHBhcnQgb2YgdGhlIGRhdGEgdmFsdWUuCisgKiAgQHNwIDogcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGUKKyAqICAgICAgIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqICBAb2ZmIDogb2Zmc2V0IGF0IHdoaWNoIHRoZSBkYXRhIG11c3QgYmUgd3JpdHRlbgorICogIEBkYXRhIDogVGhlIGRhdGEgdGhhdCBpcyB0byBiZSB3cml0dGVuCisgKiAgQGNudCA6IE51bWJlciBvZiBieXRlcyBvZiB0aGUgZGF0YSB0aGF0IGFyZSBhY3R1YWxseSB0byBiZSB3cml0dGVuIGludG8gCisgKiAgdGhlIEVlcHJvbS4gKG1heCBvZiAzKQorICogRGVzY3JpcHRpb246CisgKiAgQWN0dWFsbHkgd3JpdGVzIHRoZSByZWxldmFudCBwYXJ0IG9mIHRoZSBkYXRhIHZhbHVlIGludG8gdGhlIEVlcHJvbQorICogIHRocm91Z2ggdGhlIEkyQyBidXMuCisgKiBSZXR1cm4gdmFsdWU6CisgKiAgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgd3JpdGVfZWVwcm9tKG5pY190ICogc3AsIGludCBvZmYsIHUzMiBkYXRhLCBpbnQgY250KQoreworCWludCBleGl0X2NudCA9IDAsIHJldCA9IC0xOworCXU2NCB2YWw2NDsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisKKwl2YWw2NCA9IEkyQ19DT05UUk9MX0RFVl9JRChTMklPX0RFVl9JRCkgfCBJMkNfQ09OVFJPTF9BRERSKG9mZikgfAorCSAgICBJMkNfQ09OVFJPTF9CWVRFX0NOVChjbnQpIHwgSTJDX0NPTlRST0xfU0VUX0RBVEEoZGF0YSkgfAorCSAgICBJMkNfQ09OVFJPTF9DTlRMX1NUQVJUOworCVNQRUNJQUxfUkVHX1dSSVRFKHZhbDY0LCAmYmFyMC0+aTJjX2NvbnRyb2wsIExGKTsKKworCXdoaWxlIChleGl0X2NudCA8IDUpIHsKKwkJdmFsNjQgPSByZWFkcSgmYmFyMC0+aTJjX2NvbnRyb2wpOworCQlpZiAoSTJDX0NPTlRST0xfQ05UTF9FTkQodmFsNjQpKSB7CisJCQlpZiAoISh2YWw2NCAmIEkyQ19DT05UUk9MX05BQ0spKQorCQkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCQltc2xlZXAoNTApOworCQlleGl0X2NudCsrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogIHMyaW9fZXRodG9vbF9nZWVwcm9tICAtIHJlYWRzIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIEVlcHJvbS4KKyAqICBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZSAqICAgICAgIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqICBAZWVwcm9tIDogcG9pbnRlciB0byB0aGUgdXNlciBsZXZlbCBzdHJ1Y3R1cmUgcHJvdmlkZWQgYnkgZXRodG9vbCwgCisgKiAgY29udGFpbmluZyBhbGwgcmVsZXZhbnQgaW5mb3JtYXRpb24uCisgKiAgQGRhdGFfYnVmIDogdXNlciBkZWZpbmVkIHZhbHVlIHRvIGJlIHdyaXR0ZW4gaW50byBFZXByb20uCisgKiAgRGVzY3JpcHRpb246IFJlYWRzIHRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSBFZXByb20gYXQgZ2l2ZW4gb2Zmc2V0CisgKiAgZm9yIGEgZ2l2ZW4gbGVuZ3RoLiBTdG9yZXMgdGhlc2UgdmFsdWVzIGludCB0aGUgaW5wdXQgYXJndW1lbnQgZGF0YQorICogIGJ1ZmZlciAnZGF0YV9idWYnIGFuZCByZXR1cm5zIHRoZXNlIHRvIHRoZSBjYWxsZXIgKGV0aHRvb2wuKQorICogIFJldHVybiB2YWx1ZToKKyAqICBpbnQgIDAgb24gc3VjY2VzcworICovCisKK3N0YXRpYyBpbnQgczJpb19ldGh0b29sX2dlZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKiBkYXRhX2J1ZikKK3sKKwl1MzIgZGF0YSwgaSwgdmFsaWQ7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCisJZWVwcm9tLT5tYWdpYyA9IHNwLT5wZGV2LT52ZW5kb3IgfCAoc3AtPnBkZXYtPmRldmljZSA8PCAxNik7CisKKwlpZiAoKGVlcHJvbS0+b2Zmc2V0ICsgZWVwcm9tLT5sZW4pID4gKFhFTkFfRUVQUk9NX1NQQUNFKSkKKwkJZWVwcm9tLT5sZW4gPSBYRU5BX0VFUFJPTV9TUEFDRSAtIGVlcHJvbS0+b2Zmc2V0OworCisJZm9yIChpID0gMDsgaSA8IGVlcHJvbS0+bGVuOyBpICs9IDQpIHsKKwkJaWYgKHJlYWRfZWVwcm9tKHNwLCAoZWVwcm9tLT5vZmZzZXQgKyBpKSwgJmRhdGEpKSB7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywgIlJlYWQgb2YgRUVQUk9NIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQl2YWxpZCA9IElOVihkYXRhKTsKKwkJbWVtY3B5KChkYXRhX2J1ZiArIGkpLCAmdmFsaWQsIDQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgczJpb19ldGh0b29sX3NlZXByb20gLSB0cmllcyB0byB3cml0ZSB0aGUgdXNlciBwcm92aWRlZCB2YWx1ZSBpbiBFZXByb20KKyAqICBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZQorICogIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqICBAZWVwcm9tIDogcG9pbnRlciB0byB0aGUgdXNlciBsZXZlbCBzdHJ1Y3R1cmUgcHJvdmlkZWQgYnkgZXRodG9vbCwgCisgKiAgY29udGFpbmluZyBhbGwgcmVsZXZhbnQgaW5mb3JtYXRpb24uCisgKiAgQGRhdGFfYnVmIDsgdXNlciBkZWZpbmVkIHZhbHVlIHRvIGJlIHdyaXR0ZW4gaW50byBFZXByb20uCisgKiAgRGVzY3JpcHRpb246CisgKiAgVHJpZXMgdG8gd3JpdGUgdGhlIHVzZXIgcHJvdmlkZWQgdmFsdWUgaW4gdGhlIEVlcHJvbSwgYXQgdGhlIG9mZnNldAorICogIGdpdmVuIGJ5IHRoZSB1c2VyLgorICogIFJldHVybiB2YWx1ZToKKyAqICAwIG9uIHN1Y2Nlc3MsIC1FRkFVTFQgb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IHMyaW9fZXRodG9vbF9zZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sCisJCQkJdTggKiBkYXRhX2J1ZikKK3sKKwlpbnQgbGVuID0gZWVwcm9tLT5sZW4sIGNudCA9IDA7CisJdTMyIHZhbGlkID0gMCwgZGF0YTsKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisKKwlpZiAoZWVwcm9tLT5tYWdpYyAhPSAoc3AtPnBkZXYtPnZlbmRvciB8IChzcC0+cGRldi0+ZGV2aWNlIDw8IDE2KSkpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsCisJCQkgICJFVEhUT09MX1dSSVRFX0VFUFJPTSBFcnI6IE1hZ2ljIHZhbHVlICIpOworCQlEQkdfUFJJTlQoRVJSX0RCRywgImlzIHdyb25nLCBJdHMgbm90IDB4JXhcbiIsCisJCQkgIGVlcHJvbS0+bWFnaWMpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwl3aGlsZSAobGVuKSB7CisJCWRhdGEgPSAodTMyKSBkYXRhX2J1ZltjbnRdICYgMHgwMDAwMDBGRjsKKwkJaWYgKGRhdGEpIHsKKwkJCXZhbGlkID0gKHUzMikgKGRhdGEgPDwgMjQpOworCQl9IGVsc2UKKwkJCXZhbGlkID0gZGF0YTsKKworCQlpZiAod3JpdGVfZWVwcm9tKHNwLCAoZWVwcm9tLT5vZmZzZXQgKyBjbnQpLCB2YWxpZCwgMCkpIHsKKwkJCURCR19QUklOVChFUlJfREJHLAorCQkJCSAgIkVUSFRPT0xfV1JJVEVfRUVQUk9NIEVycjogQ2Fubm90ICIpOworCQkJREJHX1BSSU5UKEVSUl9EQkcsCisJCQkJICAid3JpdGUgaW50byB0aGUgc3BlY2lmaWVkIG9mZnNldFxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQljbnQrKzsKKwkJbGVuLS07CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogczJpb19yZWdpc3Rlcl90ZXN0IC0gcmVhZHMgYW5kIHdyaXRlcyBpbnRvIGFsbCBjbG9jayBkb21haW5zLiAKKyAqIEBzcCA6IHByaXZhdGUgbWVtYmVyIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLCB3aGljaCBpcyBhIHBvaW50ZXIgdG8gdGhlIAorICogczJpb19uaWMgc3RydWN0dXJlLgorICogQGRhdGEgOiB2YXJpYWJsZSB0aGF0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBlYWNoIG9mIHRoZSB0ZXN0IGNvbmR1Y3RlZCBiCisgKiBieSB0aGUgZHJpdmVyLgorICogRGVzY3JpcHRpb246CisgKiBSZWFkIGFuZCB3cml0ZSBpbnRvIGFsbCBjbG9jayBkb21haW5zLiBUaGUgTklDIGhhcyAzIGNsb2NrIGRvbWFpbnMsCisgKiBzZWUgdGhhdCByZWdpc3RlcnMgaW4gYWxsIHRoZSB0aHJlZSByZWdpb25zIGFyZSBhY2Nlc3NpYmxlLgorICogUmV0dXJuIHZhbHVlOgorICogMCBvbiBzdWNjZXNzLgorICovCisKK3N0YXRpYyBpbnQgczJpb19yZWdpc3Rlcl90ZXN0KG5pY190ICogc3AsIHVpbnQ2NF90ICogZGF0YSkKK3sKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJdTY0IHZhbDY0ID0gMDsKKwlpbnQgZmFpbCA9IDA7CisKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5wY2NfZW5hYmxlKTsKKwlpZiAodmFsNjQgIT0gMHhmZjAwMDAwMDAwMDAwMDAwVUxMKSB7CisJCWZhaWwgPSAxOworCQlEQkdfUFJJTlQoSU5GT19EQkcsICJSZWFkIFRlc3QgbGV2ZWwgMSBmYWlsc1xuIik7CisJfQorCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+cm1hY19wYXVzZV9jZmcpOworCWlmICh2YWw2NCAhPSAweGMwMDBmZmZmMDAwMDAwMDBVTEwpIHsKKwkJZmFpbCA9IDE7CisJCURCR19QUklOVChJTkZPX0RCRywgIlJlYWQgVGVzdCBsZXZlbCAyIGZhaWxzXG4iKTsKKwl9CisKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5yeF9xdWV1ZV9jZmcpOworCWlmICh2YWw2NCAhPSAweDA4MDgwODA4MDgwODA4MDhVTEwpIHsKKwkJZmFpbCA9IDE7CisJCURCR19QUklOVChJTkZPX0RCRywgIlJlYWQgVGVzdCBsZXZlbCAzIGZhaWxzXG4iKTsKKwl9CisKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT54Z3hzX2VmaWZvX2NmZyk7CisJaWYgKHZhbDY0ICE9IDB4MDAwMDAwMDAxOTIzMTQxRVVMTCkgeworCQlmYWlsID0gMTsKKwkJREJHX1BSSU5UKElORk9fREJHLCAiUmVhZCBUZXN0IGxldmVsIDQgZmFpbHNcbiIpOworCX0KKworCXZhbDY0ID0gMHg1QTVBNUE1QTVBNUE1QTVBVUxMOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnhtc2lfZGF0YSk7CisJdmFsNjQgPSByZWFkcSgmYmFyMC0+eG1zaV9kYXRhKTsKKwlpZiAodmFsNjQgIT0gMHg1QTVBNUE1QTVBNUE1QTVBVUxMKSB7CisJCWZhaWwgPSAxOworCQlEQkdfUFJJTlQoRVJSX0RCRywgIldyaXRlIFRlc3QgbGV2ZWwgMSBmYWlsc1xuIik7CisJfQorCisJdmFsNjQgPSAweEE1QTVBNUE1QTVBNUE1QTVVTEw7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+eG1zaV9kYXRhKTsKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT54bXNpX2RhdGEpOworCWlmICh2YWw2NCAhPSAweEE1QTVBNUE1QTVBNUE1QTVVTEwpIHsKKwkJZmFpbCA9IDE7CisJCURCR19QUklOVChFUlJfREJHLCAiV3JpdGUgVGVzdCBsZXZlbCAyIGZhaWxzXG4iKTsKKwl9CisKKwkqZGF0YSA9IGZhaWw7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogczJpb19lZXByb21fdGVzdCAtIHRvIHZlcmlmeSB0aGF0IEVFcHJvbSBpbiB0aGUgeGVuYSBjYW4gYmUgcHJvZ3JhbW1lZC4gCisgKiBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZQorICogczJpb19uaWMgc3RydWN0dXJlLgorICogQGRhdGE6dmFyaWFibGUgdGhhdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgZWFjaCBvZiB0aGUgdGVzdCBjb25kdWN0ZWQgYnkKKyAqIHRoZSBkcml2ZXIuCisgKiBEZXNjcmlwdGlvbjoKKyAqIFZlcmlmeSB0aGF0IEVFUFJPTSBpbiB0aGUgeGVuYSBjYW4gYmUgcHJvZ3JhbW1lZCB1c2luZyBJMkNfQ09OVFJPTCAKKyAqIHJlZ2lzdGVyLgorICogUmV0dXJuIHZhbHVlOgorICogMCBvbiBzdWNjZXNzLgorICovCisKK3N0YXRpYyBpbnQgczJpb19lZXByb21fdGVzdChuaWNfdCAqIHNwLCB1aW50NjRfdCAqIGRhdGEpCit7CisJaW50IGZhaWwgPSAwOworCXUzMiByZXRfZGF0YTsKKworCS8qIFRlc3QgV3JpdGUgRXJyb3IgYXQgb2Zmc2V0IDAgKi8KKwlpZiAoIXdyaXRlX2VlcHJvbShzcCwgMCwgMCwgMykpCisJCWZhaWwgPSAxOworCisJLyogVGVzdCBXcml0ZSBhdCBvZmZzZXQgNGYwICovCisJaWYgKHdyaXRlX2VlcHJvbShzcCwgMHg0RjAsIDB4MDEyMzQ1NjcsIDMpKQorCQlmYWlsID0gMTsKKwlpZiAocmVhZF9lZXByb20oc3AsIDB4NEYwLCAmcmV0X2RhdGEpKQorCQlmYWlsID0gMTsKKworCWlmIChyZXRfZGF0YSAhPSAweDAxMjM0NTY3KQorCQlmYWlsID0gMTsKKworCS8qIFJlc2V0IHRoZSBFRVBST00gZGF0YSBnbyBGRkZGICovCisJd3JpdGVfZWVwcm9tKHNwLCAweDRGMCwgMHhGRkZGRkZGRiwgMyk7CisKKwkvKiBUZXN0IFdyaXRlIFJlcXVlc3QgRXJyb3IgYXQgb2Zmc2V0IDB4N2MgKi8KKwlpZiAoIXdyaXRlX2VlcHJvbShzcCwgMHgwN0MsIDAsIDMpKQorCQlmYWlsID0gMTsKKworCS8qIFRlc3QgV3JpdGUgUmVxdWVzdCBhdCBvZmZzZXQgMHg3ZmMgKi8KKwlpZiAod3JpdGVfZWVwcm9tKHNwLCAweDdGQywgMHgwMTIzNDU2NywgMykpCisJCWZhaWwgPSAxOworCWlmIChyZWFkX2VlcHJvbShzcCwgMHg3RkMsICZyZXRfZGF0YSkpCisJCWZhaWwgPSAxOworCisJaWYgKHJldF9kYXRhICE9IDB4MDEyMzQ1NjcpCisJCWZhaWwgPSAxOworCisJLyogUmVzZXQgdGhlIEVFUFJPTSBkYXRhIGdvIEZGRkYgKi8KKwl3cml0ZV9lZXByb20oc3AsIDB4N0ZDLCAweEZGRkZGRkZGLCAzKTsKKworCS8qIFRlc3QgV3JpdGUgRXJyb3IgYXQgb2Zmc2V0IDB4ODAgKi8KKwlpZiAoIXdyaXRlX2VlcHJvbShzcCwgMHgwODAsIDAsIDMpKQorCQlmYWlsID0gMTsKKworCS8qIFRlc3QgV3JpdGUgRXJyb3IgYXQgb2Zmc2V0IDB4ZmMgKi8KKwlpZiAoIXdyaXRlX2VlcHJvbShzcCwgMHgwRkMsIDAsIDMpKQorCQlmYWlsID0gMTsKKworCS8qIFRlc3QgV3JpdGUgRXJyb3IgYXQgb2Zmc2V0IDB4MTAwICovCisJaWYgKCF3cml0ZV9lZXByb20oc3AsIDB4MTAwLCAwLCAzKSkKKwkJZmFpbCA9IDE7CisKKwkvKiBUZXN0IFdyaXRlIEVycm9yIGF0IG9mZnNldCA0ZWMgKi8KKwlpZiAoIXdyaXRlX2VlcHJvbShzcCwgMHg0RUMsIDAsIDMpKQorCQlmYWlsID0gMTsKKworCSpkYXRhID0gZmFpbDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzMmlvX2Jpc3RfdGVzdCAtIGludm9rZXMgdGhlIE1lbUJpc3QgdGVzdCBvZiB0aGUgY2FyZCAuCisgKiBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZSAKKyAqIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqIEBkYXRhOnZhcmlhYmxlIHRoYXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGVhY2ggb2YgdGhlIHRlc3QgY29uZHVjdGVkIGJ5IAorICogdGhlIGRyaXZlci4KKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBpbnZva2VzIHRoZSBNZW1CaXN0IHRlc3Qgb2YgdGhlIGNhcmQuIFdlIGdpdmUgYXJvdW5kCisgKiAyIHNlY3MgdGltZSBmb3IgdGhlIFRlc3QgdG8gY29tcGxldGUuIElmIGl0J3Mgc3RpbGwgbm90IGNvbXBsZXRlCisgKiB3aXRoaW4gdGhpcyBwZWlvZCwgd2UgY29uc2lkZXIgdGhhdCB0aGUgdGVzdCBmYWlsZWQuIAorICogUmV0dXJuIHZhbHVlOgorICogMCBvbiBzdWNjZXNzIGFuZCAtMSBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgczJpb19iaXN0X3Rlc3QobmljX3QgKiBzcCwgdWludDY0X3QgKiBkYXRhKQoreworCXU4IGJpc3QgPSAwOworCWludCBjbnQgPSAwLCByZXQgPSAtMTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHNwLT5wZGV2LCBQQ0lfQklTVCwgJmJpc3QpOworCWJpc3QgfD0gUENJX0JJU1RfU1RBUlQ7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNwLT5wZGV2LCBQQ0lfQklTVCwgYmlzdCk7CisKKwl3aGlsZSAoY250IDwgMjApIHsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoc3AtPnBkZXYsIFBDSV9CSVNULCAmYmlzdCk7CisJCWlmICghKGJpc3QgJiBQQ0lfQklTVF9TVEFSVCkpIHsKKwkJCSpkYXRhID0gKGJpc3QgJiBQQ0lfQklTVF9DT0RFX01BU0spOworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJCW1zbGVlcCgxMDApOworCQljbnQrKzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHMyaW8tbGlua190ZXN0IC0gdmVyaWZpZXMgdGhlIGxpbmsgc3RhdGUgb2YgdGhlIG5pYyAgCisgKiBAc3AgOyBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZSAKKyAqIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqIEBkYXRhOiB2YXJpYWJsZSB0aGF0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBlYWNoIG9mIHRoZSB0ZXN0IGNvbmR1Y3RlZCBieQorICogdGhlIGRyaXZlci4KKyAqIERlc2NyaXB0aW9uOgorICogVGhlIGZ1bmN0aW9uIHZlcmlmaWVzIHRoZSBsaW5rIHN0YXRlIG9mIHRoZSBOSUMgYW5kIHVwZGF0ZXMgdGhlIGlucHV0IAorICogYXJndW1lbnQgJ2RhdGEnIGFwcHJvcHJpYXRlbHkuCisgKiBSZXR1cm4gdmFsdWU6CisgKiAwIG9uIHN1Y2Nlc3MuCisgKi8KKworc3RhdGljIGludCBzMmlvX2xpbmtfdGVzdChuaWNfdCAqIHNwLCB1aW50NjRfdCAqIGRhdGEpCit7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCXU2NCB2YWw2NDsKKworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfc3RhdHVzKTsKKwlpZiAodmFsNjQgJiBBREFQVEVSX1NUQVRVU19STUFDX0xPQ0FMX0ZBVUxUKQorCQkqZGF0YSA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzMmlvX3JsZHJhbV90ZXN0IC0gb2ZmbGluZSB0ZXN0IGZvciBhY2Nlc3MgdG8gdGhlIFJsZFJhbSBjaGlwIG9uIHRoZSBOSUMgCisgKiBAc3AgLSBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZSAgCisgKiBzMmlvX25pYyBzdHJ1Y3R1cmUuCisgKiBAZGF0YSAtIHZhcmlhYmxlIHRoYXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGVhY2ggb2YgdGhlIHRlc3QgCisgKiBjb25kdWN0ZWQgYnkgdGhlIGRyaXZlci4KKyAqIERlc2NyaXB0aW9uOgorICogIFRoaXMgaXMgb25lIG9mIHRoZSBvZmZsaW5lIHRlc3QgdGhhdCB0ZXN0cyB0aGUgcmVhZCBhbmQgd3JpdGUgCisgKiAgYWNjZXNzIHRvIHRoZSBSbGRSYW0gY2hpcCBvbiB0aGUgTklDLgorICogUmV0dXJuIHZhbHVlOgorICogIDAgb24gc3VjY2Vzcy4KKyAqLworCitzdGF0aWMgaW50IHMyaW9fcmxkcmFtX3Rlc3QobmljX3QgKiBzcCwgdWludDY0X3QgKiBkYXRhKQoreworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKwl1NjQgdmFsNjQ7CisJaW50IGNudCwgaXRlcmF0aW9uID0gMCwgdGVzdF9wYXNzID0gMDsKKworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfY29udHJvbCk7CisJdmFsNjQgJj0gfkFEQVBURVJfRUNDX0VOOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmFkYXB0ZXJfY29udHJvbCk7CisKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tY19ybGRyYW1fdGVzdF9jdHJsKTsKKwl2YWw2NCB8PSBNQ19STERSQU1fVEVTVF9NT0RFOworCXdyaXRlcSh2YWw2NCwgJmJhcjAtPm1jX3JsZHJhbV90ZXN0X2N0cmwpOworCisJdmFsNjQgPSByZWFkcSgmYmFyMC0+bWNfcmxkcmFtX21ycyk7CisJdmFsNjQgfD0gTUNfUkxEUkFNX1FVRVVFX1NJWkVfRU5BQkxFOworCVNQRUNJQUxfUkVHX1dSSVRFKHZhbDY0LCAmYmFyMC0+bWNfcmxkcmFtX21ycywgVUYpOworCisJdmFsNjQgfD0gTUNfUkxEUkFNX01SU19FTkFCTEU7CisJU1BFQ0lBTF9SRUdfV1JJVEUodmFsNjQsICZiYXIwLT5tY19ybGRyYW1fbXJzLCBVRik7CisKKwl3aGlsZSAoaXRlcmF0aW9uIDwgMikgeworCQl2YWw2NCA9IDB4NTU1NTU1NTVhYWFhMDAwMFVMTDsKKwkJaWYgKGl0ZXJhdGlvbiA9PSAxKSB7CisJCQl2YWw2NCBePSAweEZGRkZGRkZGRkZGRjAwMDBVTEw7CisJCX0KKwkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+bWNfcmxkcmFtX3Rlc3RfZDApOworCisJCXZhbDY0ID0gMHhhYWFhNWE1NTU1NTUwMDAwVUxMOworCQlpZiAoaXRlcmF0aW9uID09IDEpIHsKKwkJCXZhbDY0IF49IDB4RkZGRkZGRkZGRkZGMDAwMFVMTDsKKwkJfQorCQl3cml0ZXEodmFsNjQsICZiYXIwLT5tY19ybGRyYW1fdGVzdF9kMSk7CisKKwkJdmFsNjQgPSAweDU1YWFhYWFhYWE1YTAwMDBVTEw7CisJCWlmIChpdGVyYXRpb24gPT0gMSkgeworCQkJdmFsNjQgXj0gMHhGRkZGRkZGRkZGRkYwMDAwVUxMOworCQl9CisJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPm1jX3JsZHJhbV90ZXN0X2QyKTsKKworCQl2YWw2NCA9ICh1NjQpICgweDAwMDAwMDNmZmZmZjAwMDBVTEwpOworCQl3cml0ZXEodmFsNjQsICZiYXIwLT5tY19ybGRyYW1fdGVzdF9hZGQpOworCisKKwkJdmFsNjQgPSBNQ19STERSQU1fVEVTVF9NT0RFOworCQl3cml0ZXEodmFsNjQsICZiYXIwLT5tY19ybGRyYW1fdGVzdF9jdHJsKTsKKworCQl2YWw2NCB8PQorCQkgICAgTUNfUkxEUkFNX1RFU1RfTU9ERSB8IE1DX1JMRFJBTV9URVNUX1dSSVRFIHwKKwkJICAgIE1DX1JMRFJBTV9URVNUX0dPOworCQl3cml0ZXEodmFsNjQsICZiYXIwLT5tY19ybGRyYW1fdGVzdF9jdHJsKTsKKworCQlmb3IgKGNudCA9IDA7IGNudCA8IDU7IGNudCsrKSB7CisJCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tY19ybGRyYW1fdGVzdF9jdHJsKTsKKwkJCWlmICh2YWw2NCAmIE1DX1JMRFJBTV9URVNUX0RPTkUpCisJCQkJYnJlYWs7CisJCQltc2xlZXAoMjAwKTsKKwkJfQorCisJCWlmIChjbnQgPT0gNSkKKwkJCWJyZWFrOworCisJCXZhbDY0ID0gTUNfUkxEUkFNX1RFU1RfTU9ERTsKKwkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+bWNfcmxkcmFtX3Rlc3RfY3RybCk7CisKKwkJdmFsNjQgfD0gTUNfUkxEUkFNX1RFU1RfTU9ERSB8IE1DX1JMRFJBTV9URVNUX0dPOworCQl3cml0ZXEodmFsNjQsICZiYXIwLT5tY19ybGRyYW1fdGVzdF9jdHJsKTsKKworCQlmb3IgKGNudCA9IDA7IGNudCA8IDU7IGNudCsrKSB7CisJCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5tY19ybGRyYW1fdGVzdF9jdHJsKTsKKwkJCWlmICh2YWw2NCAmIE1DX1JMRFJBTV9URVNUX0RPTkUpCisJCQkJYnJlYWs7CisJCQltc2xlZXAoNTAwKTsKKwkJfQorCisJCWlmIChjbnQgPT0gNSkKKwkJCWJyZWFrOworCisJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPm1jX3JsZHJhbV90ZXN0X2N0cmwpOworCQlpZiAodmFsNjQgJiBNQ19STERSQU1fVEVTVF9QQVNTKQorCQkJdGVzdF9wYXNzID0gMTsKKworCQlpdGVyYXRpb24rKzsKKwl9CisKKwlpZiAoIXRlc3RfcGFzcykKKwkJKmRhdGEgPSAxOworCWVsc2UKKwkJKmRhdGEgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIHMyaW9fZXRodG9vbF90ZXN0IC0gY29uZHVjdHMgNiB0c2V0cyB0byBkZXRlcm1pbmUgdGhlIGhlYWx0aCBvZiBjYXJkLgorICogIEBzcCA6IHByaXZhdGUgbWVtYmVyIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLCB3aGljaCBpcyBhIHBvaW50ZXIgdG8gdGhlCisgKiAgczJpb19uaWMgc3RydWN0dXJlLgorICogIEBldGh0ZXN0IDogcG9pbnRlciB0byBhIGV0aHRvb2wgY29tbWFuZCBzcGVjaWZpYyBzdHJ1Y3R1cmUgdGhhdCB3aWxsIGJlCisgKiAgcmV0dXJuZWQgdG8gdGhlIHVzZXIuCisgKiAgQGRhdGEgOiB2YXJpYWJsZSB0aGF0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBlYWNoIG9mIHRoZSB0ZXN0IAorICogY29uZHVjdGVkIGJ5IHRoZSBkcml2ZXIuCisgKiBEZXNjcmlwdGlvbjoKKyAqICBUaGlzIGZ1bmN0aW9uIGNvbmR1Y3RzIDYgdGVzdHMgKCA0IG9mZmxpbmUgYW5kIDIgb25saW5lKSB0byBkZXRlcm1pbmUKKyAqICB0aGUgaGVhbHRoIG9mIHRoZSBjYXJkLgorICogUmV0dXJuIHZhbHVlOgorICogIHZvaWQKKyAqLworCitzdGF0aWMgdm9pZCBzMmlvX2V0aHRvb2xfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGV0aHRvb2xfdGVzdCAqZXRodGVzdCwKKwkJCSAgICAgIHVpbnQ2NF90ICogZGF0YSkKK3sKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisJaW50IG9yaWdfc3RhdGUgPSBuZXRpZl9ydW5uaW5nKHNwLT5kZXYpOworCisJaWYgKGV0aHRlc3QtPmZsYWdzID09IEVUSF9URVNUX0ZMX09GRkxJTkUpIHsKKwkJLyogT2ZmbGluZSBUZXN0cy4gKi8KKwkJaWYgKG9yaWdfc3RhdGUpIHsKKwkJCXMyaW9fY2xvc2Uoc3AtPmRldik7CisJCQlzMmlvX3NldF9zd2FwcGVyKHNwKTsKKwkJfSBlbHNlCisJCQlzMmlvX3NldF9zd2FwcGVyKHNwKTsKKworCQlpZiAoczJpb19yZWdpc3Rlcl90ZXN0KHNwLCAmZGF0YVswXSkpCisJCQlldGh0ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CisKKwkJczJpb19yZXNldChzcCk7CisJCXMyaW9fc2V0X3N3YXBwZXIoc3ApOworCisJCWlmIChzMmlvX3JsZHJhbV90ZXN0KHNwLCAmZGF0YVszXSkpCisJCQlldGh0ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CisKKwkJczJpb19yZXNldChzcCk7CisJCXMyaW9fc2V0X3N3YXBwZXIoc3ApOworCisJCWlmIChzMmlvX2VlcHJvbV90ZXN0KHNwLCAmZGF0YVsxXSkpCisJCQlldGh0ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CisKKwkJaWYgKHMyaW9fYmlzdF90ZXN0KHNwLCAmZGF0YVs0XSkpCisJCQlldGh0ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CisKKwkJaWYgKG9yaWdfc3RhdGUpCisJCQlzMmlvX29wZW4oc3AtPmRldik7CisKKwkJZGF0YVsyXSA9IDA7CisJfSBlbHNlIHsKKwkJLyogT25saW5lIFRlc3RzLiAqLworCQlpZiAoIW9yaWdfc3RhdGUpIHsKKwkJCURCR19QUklOVChFUlJfREJHLAorCQkJCSAgIiVzOiBpcyBub3QgdXAsIGNhbm5vdCBydW4gdGVzdFxuIiwKKwkJCQkgIGRldi0+bmFtZSk7CisJCQlkYXRhWzBdID0gLTE7CisJCQlkYXRhWzFdID0gLTE7CisJCQlkYXRhWzJdID0gLTE7CisJCQlkYXRhWzNdID0gLTE7CisJCQlkYXRhWzRdID0gLTE7CisJCX0KKworCQlpZiAoczJpb19saW5rX3Rlc3Qoc3AsICZkYXRhWzJdKSkKKwkJCWV0aHRlc3QtPmZsYWdzIHw9IEVUSF9URVNUX0ZMX0ZBSUxFRDsKKworCQlkYXRhWzBdID0gMDsKKwkJZGF0YVsxXSA9IDA7CisJCWRhdGFbM10gPSAwOworCQlkYXRhWzRdID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHMyaW9fZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqZXN0YXRzLAorCQkJCSAgIHU2NCAqIHRtcF9zdGF0cykKK3sKKwlpbnQgaSA9IDA7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCVN0YXRJbmZvX3QgKnN0YXRfaW5mbyA9IHNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvOworCisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnRtYWNfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnRtYWNfZGF0YV9vY3RldHMpOworCXRtcF9zdGF0c1tpKytdID0gbGU2NF90b19jcHUoc3RhdF9pbmZvLT50bWFjX2Ryb3BfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnRtYWNfbWNzdF9mcm1zKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+dG1hY19iY3N0X2ZybXMpOworCXRtcF9zdGF0c1tpKytdID0gbGU2NF90b19jcHUoc3RhdF9pbmZvLT50bWFjX3BhdXNlX2N0cmxfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnRtYWNfYW55X2Vycl9mcm1zKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlNjRfdG9fY3B1KHN0YXRfaW5mby0+dG1hY192bGRfaXBfb2N0ZXRzKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+dG1hY192bGRfaXApOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT50bWFjX2Ryb3BfaXApOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT50bWFjX2ljbXApOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT50bWFjX3JzdF90Y3ApOworCXRtcF9zdGF0c1tpKytdID0gbGU2NF90b19jcHUoc3RhdF9pbmZvLT50bWFjX3RjcCk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnRtYWNfdWRwKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+cm1hY192bGRfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfZGF0YV9vY3RldHMpOworCXRtcF9zdGF0c1tpKytdID0gbGU2NF90b19jcHUoc3RhdF9pbmZvLT5ybWFjX2Zjc19lcnJfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTY0X3RvX2NwdShzdGF0X2luZm8tPnJtYWNfZHJvcF9mcm1zKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+cm1hY192bGRfbWNzdF9mcm1zKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+cm1hY192bGRfYmNzdF9mcm1zKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+cm1hY19pbl9ybmdfbGVuX2Vycl9mcm1zKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlNjRfdG9fY3B1KHN0YXRfaW5mby0+cm1hY19sb25nX2ZybXMpOworCXRtcF9zdGF0c1tpKytdID0gbGU2NF90b19jcHUoc3RhdF9pbmZvLT5ybWFjX3BhdXNlX2N0cmxfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfZGlzY2FyZGVkX2ZybXMpOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT5ybWFjX3VzaXplZF9mcm1zKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+cm1hY19vc2l6ZWRfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfZnJhZ19mcm1zKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+cm1hY19qYWJiZXJfZnJtcyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfaXApOworCXRtcF9zdGF0c1tpKytdID0gbGU2NF90b19jcHUoc3RhdF9pbmZvLT5ybWFjX2lwX29jdGV0cyk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfaGRyX2Vycl9pcCk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfZHJvcF9pcCk7CisJdG1wX3N0YXRzW2krK10gPSBsZTMyX3RvX2NwdShzdGF0X2luZm8tPnJtYWNfaWNtcCk7CisJdG1wX3N0YXRzW2krK10gPSBsZTY0X3RvX2NwdShzdGF0X2luZm8tPnJtYWNfdGNwKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+cm1hY191ZHApOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT5ybWFjX2Vycl9kcnBfdWRwKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+cm1hY19wYXVzZV9jbnQpOworCXRtcF9zdGF0c1tpKytdID0gbGUzMl90b19jcHUoc3RhdF9pbmZvLT5ybWFjX2FjY2VwdGVkX2lwKTsKKwl0bXBfc3RhdHNbaSsrXSA9IGxlMzJfdG9fY3B1KHN0YXRfaW5mby0+cm1hY19lcnJfdGNwKTsKK30KKworc3RhdGljIGludCBzMmlvX2V0aHRvb2xfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIChYRU5BX1JFR19TUEFDRSk7Cit9CisKKworc3RhdGljIHUzMiBzMmlvX2V0aHRvb2xfZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCisJcmV0dXJuIChzcC0+cnhfY3N1bSk7Cit9CisKK3N0YXRpYyBpbnQgczJpb19ldGh0b29sX3NldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQoreworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKworCWlmIChkYXRhKQorCQlzcC0+cnhfY3N1bSA9IDE7CisJZWxzZQorCQlzcC0+cnhfY3N1bSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzMmlvX2dldF9lZXByb21fbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIChYRU5BX0VFUFJPTV9TUEFDRSk7Cit9CisKK3N0YXRpYyBpbnQgczJpb19ldGh0b29sX3NlbGZfdGVzdF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiAoUzJJT19URVNUX0xFTik7Cit9CisKK3N0YXRpYyB2b2lkIHMyaW9fZXRodG9vbF9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgdTMyIHN0cmluZ3NldCwgdTggKiBkYXRhKQoreworCXN3aXRjaCAoc3RyaW5nc2V0KSB7CisJY2FzZSBFVEhfU1NfVEVTVDoKKwkJbWVtY3B5KGRhdGEsIHMyaW9fZ3N0cmluZ3MsIFMySU9fU1RSSU5HU19MRU4pOworCQlicmVhazsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJbWVtY3B5KGRhdGEsICZldGh0b29sX3N0YXRzX2tleXMsCisJCSAgICAgICBzaXplb2YoZXRodG9vbF9zdGF0c19rZXlzKSk7CisJfQorfQorCitzdGF0aWMgaW50IHMyaW9fZXRodG9vbF9nZXRfc3RhdHNfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKFMySU9fU1RBVF9MRU4pOworfQorCitzdGF0aWMgaW50IHMyaW9fZXRodG9vbF9vcF9zZXRfdHhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKK3sKKwlpZiAoZGF0YSkKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0lQX0NTVU07CisJZWxzZQorCQlkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX0lQX0NTVU07CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzID0gczJpb19ldGh0b29sX2dzZXQsCisJLnNldF9zZXR0aW5ncyA9IHMyaW9fZXRodG9vbF9zc2V0LAorCS5nZXRfZHJ2aW5mbyA9IHMyaW9fZXRodG9vbF9nZHJ2aW5mbywKKwkuZ2V0X3JlZ3NfbGVuID0gczJpb19ldGh0b29sX2dldF9yZWdzX2xlbiwKKwkuZ2V0X3JlZ3MgPSBzMmlvX2V0aHRvb2xfZ3JlZ3MsCisJLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X2VlcHJvbV9sZW4gPSBzMmlvX2dldF9lZXByb21fbGVuLAorCS5nZXRfZWVwcm9tID0gczJpb19ldGh0b29sX2dlZXByb20sCisJLnNldF9lZXByb20gPSBzMmlvX2V0aHRvb2xfc2VlcHJvbSwKKwkuZ2V0X3BhdXNlcGFyYW0gPSBzMmlvX2V0aHRvb2xfZ2V0cGF1c2VfZGF0YSwKKwkuc2V0X3BhdXNlcGFyYW0gPSBzMmlvX2V0aHRvb2xfc2V0cGF1c2VfZGF0YSwKKwkuZ2V0X3J4X2NzdW0gPSBzMmlvX2V0aHRvb2xfZ2V0X3J4X2NzdW0sCisJLnNldF9yeF9jc3VtID0gczJpb19ldGh0b29sX3NldF9yeF9jc3VtLAorCS5nZXRfdHhfY3N1bSA9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCisJLnNldF90eF9jc3VtID0gczJpb19ldGh0b29sX29wX3NldF90eF9jc3VtLAorCS5nZXRfc2cgPSBldGh0b29sX29wX2dldF9zZywKKwkuc2V0X3NnID0gZXRodG9vbF9vcF9zZXRfc2csCisjaWZkZWYgTkVUSUZfRl9UU08KKwkuZ2V0X3RzbyA9IGV0aHRvb2xfb3BfZ2V0X3RzbywKKwkuc2V0X3RzbyA9IGV0aHRvb2xfb3Bfc2V0X3RzbywKKyNlbmRpZgorCS5zZWxmX3Rlc3RfY291bnQgPSBzMmlvX2V0aHRvb2xfc2VsZl90ZXN0X2NvdW50LAorCS5zZWxmX3Rlc3QgPSBzMmlvX2V0aHRvb2xfdGVzdCwKKwkuZ2V0X3N0cmluZ3MgPSBzMmlvX2V0aHRvb2xfZ2V0X3N0cmluZ3MsCisJLnBoeXNfaWQgPSBzMmlvX2V0aHRvb2xfaWRuaWMsCisJLmdldF9zdGF0c19jb3VudCA9IHMyaW9fZXRodG9vbF9nZXRfc3RhdHNfY291bnQsCisJLmdldF9ldGh0b29sX3N0YXRzID0gczJpb19nZXRfZXRodG9vbF9zdGF0cworfTsKKworLyoqCisgKiAgczJpb19pb2N0bCAtIEVudHJ5IHBvaW50IGZvciB0aGUgSW9jdGwgCisgKiAgQGRldiA6ICBEZXZpY2UgcG9pbnRlci4KKyAqICBAaWZyIDogIEFuIElPQ1RMIHNwZWNlZmljIHN0cnVjdHVyZSwgdGhhdCBjYW4gY29udGFpbiBhIHBvaW50ZXIgdG8KKyAqICBhIHByb3ByaWV0YXJ5IHN0cnVjdHVyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8gdGhlIGRyaXZlci4KKyAqICBAY21kIDogIFRoaXMgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgY29tbWFuZHMgdGhhdAorICogIGNhbiBiZSBwYXNzZWQgdG8gdGhlIElPQ1RMIGZ1bmN0aW9ucy4KKyAqICBEZXNjcmlwdGlvbjoKKyAqICBUaGlzIGZ1bmN0aW9uIGhhcyBzdXBwb3J0IGZvciBldGh0b29sLCBhZGRpbmcgbXVsdGlwbGUgTUFDIGFkZHJlc3NlcyBvbiAKKyAqICB0aGUgTklDIGFuZCBzb21lIERCRyBjb21tYW5kcyBmb3IgdGhlIHV0aWwgdG9vbC4KKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgQ3VycmVudGx5IHRoZSBJT0NUTCBzdXBwb3J0cyBubyBvcGVyYXRpb25zLCBoZW5jZSBieSBkZWZhdWx0IHRoaXMKKyAqICBmdW5jdGlvbiByZXR1cm5zIE9QIE5PVCBTVVBQT1JURUQgdmFsdWUuCisgKi8KKworc3RhdGljIGludCBzMmlvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCisvKioKKyAqICBzMmlvX2NoYW5nZV9tdHUgLSBlbnRyeSBwb2ludCB0byBjaGFuZ2UgTVRVIHNpemUgZm9yIHRoZSBkZXZpY2UuCisgKiAgIEBkZXYgOiBkZXZpY2UgcG9pbnRlci4KKyAqICAgQG5ld19tdHUgOiB0aGUgbmV3IE1UVSBzaXplIGZvciB0aGUgZGV2aWNlLgorICogICBEZXNjcmlwdGlvbjogQSBkcml2ZXIgZW50cnkgcG9pbnQgdG8gY2hhbmdlIE1UVSBzaXplIGZvciB0aGUgZGV2aWNlLgorICogICBCZWZvcmUgY2hhbmdpbmcgdGhlIE1UVSB0aGUgZGV2aWNlIG11c3QgYmUgc3RvcHBlZC4KKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgIDAgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgKC0pdmUgaW50ZWdlciBhcyBkZWZpbmVkIGluIGVycm5vLmgKKyAqICAgZmlsZSBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgczJpb19jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJcmVnaXN0ZXIgdTY0IHZhbDY0OworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBNdXN0IGJlIHN0b3BwZWQgdG8gIiwgZGV2LT5uYW1lKTsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICJjaGFuZ2UgaXRzIE1UVSBcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICgobmV3X210dSA8IE1JTl9NVFUpIHx8IChuZXdfbXR1ID4gUzJJT19KVU1CT19TSVpFKSkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBNVFUgc2l6ZSBpcyBpbnZhbGlkLlxuIiwKKwkJCSAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwkvKiBTZXQgdGhlIG5ldyBNVFUgaW50byB0aGUgUFlMRCByZWdpc3RlciBvZiB0aGUgTklDICovCisJdmFsNjQgPSBuZXdfbXR1OworCXdyaXRlcSh2QklUKHZhbDY0LCAyLCAxNCksICZiYXIwLT5ybWFjX21heF9weWxkX2xlbik7CisKKwlkZXYtPm10dSA9IG5ld19tdHU7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgczJpb190YXNrbGV0IC0gQm90dG9tIGhhbGYgb2YgdGhlIElTUi4KKyAqICBAZGV2X2FkciA6IGFkZHJlc3Mgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUgaW4gZG1hX2FkZHJfdCBmb3JtYXQuCisgKiAgRGVzY3JpcHRpb246CisgKiAgVGhpcyBpcyB0aGUgdGFza2xldCBvciB0aGUgYm90dG9tIGhhbGYgb2YgdGhlIElTUi4gVGhpcyBpcworICogIGFuIGV4dGVuc2lvbiBvZiB0aGUgSVNSIHdoaWNoIGlzIHNjaGVkdWxlZCBieSB0aGUgc2NoZWR1bGVyIHRvIGJlIHJ1biAKKyAqICB3aGVuIHRoZSBsb2FkIG9uIHRoZSBDUFUgaXMgbG93LiBBbGwgbG93IHByaW9yaXR5IHRhc2tzIG9mIHRoZSBJU1IgY2FuCisgKiAgYmUgcHVzaGVkIGludG8gdGhlIHRhc2tsZXQuIEZvciBub3cgdGhlIHRhc2tsZXQgaXMgdXNlZCBvbmx5IHRvIAorICogIHJlcGxlbmlzaCB0aGUgUnggYnVmZmVycyBpbiB0aGUgUnggYnVmZmVyIGRlc2NyaXB0b3JzLgorICogIFJldHVybiB2YWx1ZToKKyAqICB2b2lkLgorICovCisKK3N0YXRpYyB2b2lkIHMyaW9fdGFza2xldCh1bnNpZ25lZCBsb25nIGRldl9hZGRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2FkZHI7CisJbmljX3QgKnNwID0gZGV2LT5wcml2OworCWludCBpLCByZXQ7CisJbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOworCisJbWFjX2NvbnRyb2wgPSAmc3AtPm1hY19jb250cm9sOworCWNvbmZpZyA9ICZzcC0+Y29uZmlnOworCisJaWYgKCFUQVNLTEVUX0lOX1VTRSkgeworCQlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CisJCQlyZXQgPSBmaWxsX3J4X2J1ZmZlcnMoc3AsIGkpOworCQkJaWYgKHJldCA9PSAtRU5PTUVNKSB7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogT3V0IG9mICIsCisJCQkJCSAgZGV2LT5uYW1lKTsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIm1lbW9yeSBpbiB0YXNrbGV0XG4iKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAocmV0ID09IC1FRklMTCkgeworCQkJCURCR19QUklOVChFUlJfREJHLAorCQkJCQkgICIlczogUnggUmluZyAlZCBpcyBmdWxsXG4iLAorCQkJCQkgIGRldi0+bmFtZSwgaSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJY2xlYXJfYml0KDAsICgmc3AtPnRhc2tsZXRfc3RhdHVzKSk7CisJfQorfQorCisvKioKKyAqIHMyaW9fc2V0X2xpbmsgLSBTZXQgdGhlIExJbmsgc3RhdHVzCisgKiBAZGF0YTogbG9uZyBwb2ludGVyIHRvIGRldmljZSBwcml2YXRlIHN0cnVjdHVlCisgKiBEZXNjcmlwdGlvbjogU2V0cyB0aGUgbGluayBzdGF0dXMgZm9yIHRoZSBhZGFwdGVyCisgKi8KKworc3RhdGljIHZvaWQgczJpb19zZXRfbGluayh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJbmljX3QgKm5pYyA9IChuaWNfdCAqKSBkYXRhOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuaWMtPmRldjsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gbmljLT5iYXIwOworCXJlZ2lzdGVyIHU2NCB2YWw2NDsKKwl1MTYgc3ViaWQ7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmKG5pYy0+bGlua19zdGF0ZSkpKSB7CisJCS8qIFRoZSBjYXJkIGlzIGJlaW5nIHJlc2V0LCBubyBwb2ludCBkb2luZyBhbnl0aGluZyAqLworCQlyZXR1cm47CisJfQorCisJc3ViaWQgPSBuaWMtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisJLyogCisJICogQWxsb3cgYSBzbWFsbCBkZWxheSBmb3IgdGhlIE5JQ3Mgc2VsZiBpbml0aWF0ZWQgCisJICogY2xlYW51cCB0byBjb21wbGV0ZS4KKwkgKi8KKwltc2xlZXAoMTAwKTsKKworCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfc3RhdHVzKTsKKwlpZiAodmVyaWZ5X3hlbmFfcXVpZXNjZW5jZSh2YWw2NCwgbmljLT5kZXZpY2VfZW5hYmxlZF9vbmNlKSkgeworCQlpZiAoTElOS19JU19VUCh2YWw2NCkpIHsKKwkJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfY29udHJvbCk7CisJCQl2YWw2NCB8PSBBREFQVEVSX0NOVExfRU47CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCQkJaWYgKENBUkRTX1dJVEhfRkFVTFRZX0xJTktfSU5ESUNBVE9SUyhzdWJpZCkpIHsKKwkJCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ncGlvX2NvbnRyb2wpOworCQkJCXZhbDY0IHw9IEdQSU9fQ1RSTF9HUElPXzA7CisJCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwkJCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ncGlvX2NvbnRyb2wpOworCQkJfSBlbHNlIHsKKwkJCQl2YWw2NCB8PSBBREFQVEVSX0xFRF9PTjsKKwkJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCQkJfQorCQkJdmFsNjQgPSByZWFkcSgmYmFyMC0+YWRhcHRlcl9zdGF0dXMpOworCQkJaWYgKCFMSU5LX0lTX1VQKHZhbDY0KSkgeworCQkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IiwgZGV2LT5uYW1lKTsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiBMaW5rIGRvd24iKTsKKwkJCQlEQkdfUFJJTlQoRVJSX0RCRywgImFmdGVyICIpOworCQkJCURCR19QUklOVChFUlJfREJHLCAiZW5hYmxpbmcgIik7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICJkZXZpY2UgXG4iKTsKKwkJCX0KKwkJCWlmIChuaWMtPmRldmljZV9lbmFibGVkX29uY2UgPT0gRkFMU0UpIHsKKwkJCQluaWMtPmRldmljZV9lbmFibGVkX29uY2UgPSBUUlVFOworCQkJfQorCQkJczJpb19saW5rKG5pYywgTElOS19VUCk7CisJCX0gZWxzZSB7CisJCQlpZiAoQ0FSRFNfV0lUSF9GQVVMVFlfTElOS19JTkRJQ0FUT1JTKHN1YmlkKSkgeworCQkJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmdwaW9fY29udHJvbCk7CisJCQkJdmFsNjQgJj0gfkdQSU9fQ1RSTF9HUElPXzA7CisJCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwkJCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ncGlvX2NvbnRyb2wpOworCQkJfQorCQkJczJpb19saW5rKG5pYywgTElOS19ET1dOKTsKKwkJfQorCX0gZWxzZSB7CQkvKiBOSUMgaXMgbm90IFF1aWVzY2VudC4gKi8KKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogRXJyb3I6ICIsIGRldi0+bmFtZSk7CisJCURCR19QUklOVChFUlJfREJHLCAiZGV2aWNlIGlzIG5vdCBRdWllc2NlbnRcbiIpOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJfQorCWNsZWFyX2JpdCgwLCAmKG5pYy0+bGlua19zdGF0ZSkpOworfQorCitzdGF0aWMgdm9pZCBzMmlvX2NhcmRfZG93bihuaWNfdCAqIHNwKQoreworCWludCBjbnQgPSAwOworCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXJlZ2lzdGVyIHU2NCB2YWw2NCA9IDA7CisKKwkvKiBJZiBzMmlvX3NldF9saW5rIHRhc2sgaXMgZXhlY3V0aW5nLCB3YWl0IHRpbGwgaXQgY29tcGxldGVzLiAqLworCXdoaWxlICh0ZXN0X2FuZF9zZXRfYml0KDAsICYoc3AtPmxpbmtfc3RhdGUpKSkKKwkJbXNsZWVwKDUwKTsKKwlhdG9taWNfc2V0KCZzcC0+Y2FyZF9zdGF0ZSwgQ0FSRF9ET1dOKTsKKworCS8qIGRpc2FibGUgVHggYW5kIFJ4IHRyYWZmaWMgb24gdGhlIE5JQyAqLworCXN0b3BfbmljKHNwKTsKKworCS8qIEtpbGwgdGFza2xldC4gKi8KKwl0YXNrbGV0X2tpbGwoJnNwLT50YXNrKTsKKworCS8qIENoZWNrIGlmIHRoZSBkZXZpY2UgaXMgUXVpZXNjZW50IGFuZCB0aGVuIFJlc2V0IHRoZSBOSUMgKi8KKwlkbyB7CisJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfc3RhdHVzKTsKKwkJaWYgKHZlcmlmeV94ZW5hX3F1aWVzY2VuY2UodmFsNjQsIHNwLT5kZXZpY2VfZW5hYmxlZF9vbmNlKSkgeworCQkJYnJlYWs7CisJCX0KKworCQltc2xlZXAoNTApOworCQljbnQrKzsKKwkJaWYgKGNudCA9PSAxMCkgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsCisJCQkJICAiczJpb19jbG9zZTpEZXZpY2Ugbm90IFF1aWVzY2VudCAiKTsKKwkJCURCR19QUklOVChFUlJfREJHLCAiYWRhcGVyIHN0YXR1cyByZWFkcyAweCVsbHhcbiIsCisJCQkJICAodW5zaWduZWQgbG9uZyBsb25nKSB2YWw2NCk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKDEpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzcC0+dHhfbG9jaywgZmxhZ3MpOworCXMyaW9fcmVzZXQoc3ApOworCisJLyogRnJlZSBhbGwgdW51c2VkIFR4IGFuZCBSeCBidWZmZXJzICovCisJZnJlZV90eF9idWZmZXJzKHNwKTsKKwlmcmVlX3J4X2J1ZmZlcnMoc3ApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPnR4X2xvY2ssIGZsYWdzKTsKKwljbGVhcl9iaXQoMCwgJihzcC0+bGlua19zdGF0ZSkpOworfQorCitzdGF0aWMgaW50IHMyaW9fY2FyZF91cChuaWNfdCAqIHNwKQoreworCWludCBpLCByZXQ7CisJbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgc3AtPmRldjsKKworCS8qIEluaXRpYWxpemUgdGhlIEgvVyBJL08gcmVnaXN0ZXJzICovCisJaWYgKGluaXRfbmljKHNwKSAhPSAwKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiJXM6IEgvVyBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIsCisJCQkgIGRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIAorCSAqIEluaXRpYWxpemluZyB0aGUgUnggYnVmZmVycy4gRm9yIG5vdyB3ZSBhcmUgY29uc2lkZXJpbmcgb25seSAxIAorCSAqIFJ4IHJpbmcgYW5kIGluaXRpYWxpemluZyBidWZmZXJzIGludG8gMzAgUnggYmxvY2tzCisJICovCisJbWFjX2NvbnRyb2wgPSAmc3AtPm1hY19jb250cm9sOworCWNvbmZpZyA9ICZzcC0+Y29uZmlnOworCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgeworCQlpZiAoKHJldCA9IGZpbGxfcnhfYnVmZmVycyhzcCwgaSkpKSB7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBPdXQgb2YgbWVtb3J5IGluIE9wZW5cbiIsCisJCQkJICBkZXYtPm5hbWUpOworCQkJczJpb19yZXNldChzcCk7CisJCQlmcmVlX3J4X2J1ZmZlcnMoc3ApOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJREJHX1BSSU5UKElORk9fREJHLCAiQnVmIGluIHJpbmc6JWQgaXMgJWQ6XG4iLCBpLAorCQkJICBhdG9taWNfcmVhZCgmc3AtPnJ4X2J1ZnNfbGVmdFtpXSkpOworCX0KKworCS8qIFNldHRpbmcgaXRzIHJlY2VpdmUgbW9kZSAqLworCXMyaW9fc2V0X211bHRpY2FzdChkZXYpOworCisJLyogRW5hYmxlIHRhc2tsZXQgZm9yIHRoZSBkZXZpY2UgKi8KKwl0YXNrbGV0X2luaXQoJnNwLT50YXNrLCBzMmlvX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKSBkZXYpOworCisJLyogRW5hYmxlIFJ4IFRyYWZmaWMgYW5kIGludGVycnVwdHMgb24gdGhlIE5JQyAqLworCWlmIChzdGFydF9uaWMoc3ApKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiJXM6IFN0YXJ0aW5nIE5JQyBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCXRhc2tsZXRfa2lsbCgmc3AtPnRhc2spOworCQlzMmlvX3Jlc2V0KHNwKTsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCWZyZWVfcnhfYnVmZmVycyhzcCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWF0b21pY19zZXQoJnNwLT5jYXJkX3N0YXRlLCBDQVJEX1VQKTsKKwlyZXR1cm4gMDsKK30KKworLyoqIAorICogczJpb19yZXN0YXJ0X25pYyAtIFJlc2V0cyB0aGUgTklDLgorICogQGRhdGEgOiBsb25nIHBvaW50ZXIgdG8gdGhlIGRldmljZSBwcml2YXRlIHN0cnVjdHVyZQorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGlzIHNjaGVkdWxlZCB0byBiZSBydW4gYnkgdGhlIHMyaW9fdHhfd2F0Y2hkb2cKKyAqIGZ1bmN0aW9uIGFmdGVyIDAuNSBzZWNzIHRvIHJlc2V0IHRoZSBOSUMuIFRoZSBpZGVhIGlzIHRvIHJlZHVjZSAKKyAqIHRoZSBydW4gdGltZSBvZiB0aGUgd2F0Y2ggZG9nIHJvdXRpbmUgd2hpY2ggaXMgcnVuIGhvbGRpbmcgYQorICogc3BpbiBsb2NrLgorICovCisKK3N0YXRpYyB2b2lkIHMyaW9fcmVzdGFydF9uaWModW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisKKwlzMmlvX2NhcmRfZG93bihzcCk7CisJaWYgKHMyaW9fY2FyZF91cChzcCkpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogRGV2aWNlIGJyaW5nIHVwIGZhaWxlZFxuIiwKKwkJCSAgZGV2LT5uYW1lKTsKKwl9CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCURCR19QUklOVChFUlJfREJHLCAiJXM6IHdhcyByZXNldCBieSBUeCB3YXRjaGRvZyB0aW1lclxuIiwKKwkJICBkZXYtPm5hbWUpOworfQorCisvKiogCisgKiAgczJpb190eF93YXRjaGRvZyAtIFdhdGNoZG9nIGZvciB0cmFuc21pdCBzaWRlLiAKKyAqICBAZGV2IDogUG9pbnRlciB0byBuZXQgZGV2aWNlIHN0cnVjdHVyZQorICogIERlc2NyaXB0aW9uOgorICogIFRoaXMgZnVuY3Rpb24gaXMgdHJpZ2dlcmVkIGlmIHRoZSBUeCBRdWV1ZSBpcyBzdG9wcGVkCisgKiAgZm9yIGEgcHJlLWRlZmluZWQgYW1vdW50IG9mIHRpbWUgd2hlbiB0aGUgSW50ZXJmYWNlIGlzIHN0aWxsIHVwLgorICogIElmIHRoZSBJbnRlcmZhY2UgaXMgamFtbWVkIGluIHN1Y2ggYSBzaXR1YXRpb24sIHRoZSBoYXJkd2FyZSBpcworICogIHJlc2V0IChieSBzMmlvX2Nsb3NlKSBhbmQgcmVzdGFydGVkIGFnYWluIChieSBzMmlvX29wZW4pIHRvCisgKiAgb3ZlcmNvbWUgYW55IHByb2JsZW0gdGhhdCBtaWdodCBoYXZlIGJlZW4gY2F1c2VkIGluIHRoZSBoYXJkd2FyZS4KKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgdm9pZAorICovCisKK3N0YXRpYyB2b2lkIHMyaW9fdHhfd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisKKwlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJCXNjaGVkdWxlX3dvcmsoJnNwLT5yc3RfdGltZXJfdGFzayk7CisJfQorfQorCisvKioKKyAqICAgcnhfb3NtX2hhbmRsZXIgLSBUbyBwZXJmb3JtIHNvbWUgT1MgcmVsYXRlZCBvcGVyYXRpb25zIG9uIFNLQi4KKyAqICAgQHNwOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSxwb2ludGVyIHRvIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqICAgQHNrYiA6IHRoZSBzb2NrZXQgYnVmZmVyIHBvaW50ZXIuCisgKiAgIEBsZW4gOiBsZW5ndGggb2YgdGhlIHBhY2tldAorICogICBAY2tzdW0gOiBGQ1MgY2hlY2tzdW0gb2YgdGhlIGZyYW1lLgorICogICBAcmluZ19ubyA6IHRoZSByaW5nIGZyb20gd2hpY2ggdGhpcyBSeEQgd2FzIGV4dHJhY3RlZC4KKyAqICAgRGVzY3JpcHRpb246IAorICogICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgVHggaW50ZXJydXB0IHNlcml2Y2Ugcm91dGluZSB0byBwZXJmb3JtCisgKiAgIHNvbWUgT1MgcmVsYXRlZCBvcGVyYXRpb25zIG9uIHRoZSBTS0IgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIHVwcGVyCisgKiAgIGxheWVycy4gSXQgbWFpbmx5IGNoZWNrcyBpZiB0aGUgY2hlY2tzdW0gaXMgT0ssIGlmIHNvIGFkZHMgaXQgdG8gdGhlCisgKiAgIFNLQnMgY2tzdW0gdmFyaWFibGUsIGluY3JlbWVudHMgdGhlIFJ4IHBhY2tldCBjb3VudCBhbmQgcGFzc2VzIHRoZSBTS0IKKyAqICAgdG8gdGhlIHVwcGVyIGxheWVyLiBJZiB0aGUgY2hlY2tzdW0gaXMgd3JvbmcsIGl0IGluY3JlbWVudHMgdGhlIFJ4CisgKiAgIHBhY2tldCBlcnJvciBjb3VudCwgZnJlZXMgdGhlIFNLQiBhbmQgcmV0dXJucyBlcnJvci4KKyAqICAgUmV0dXJuIHZhbHVlOgorICogICBTVUNDRVNTIG9uIHN1Y2Nlc3MgYW5kIC0xIG9uIGZhaWx1cmUuCisgKi8KKyNpZm5kZWYgQ09ORklHXzJCVUZGX01PREUKK3N0YXRpYyBpbnQgcnhfb3NtX2hhbmRsZXIobmljX3QgKiBzcCwgdTE2IGxlbiwgUnhEX3QgKiByeGRwLCBpbnQgcmluZ19ubykKKyNlbHNlCitzdGF0aWMgaW50IHJ4X29zbV9oYW5kbGVyKG5pY190ICogc3AsIFJ4RF90ICogcnhkcCwgaW50IHJpbmdfbm8sCisJCQkgIGJ1ZmZBZGRfdCAqIGJhKQorI2VuZGlmCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBzcC0+ZGV2OworCXN0cnVjdCBza19idWZmICpza2IgPQorCSAgICAoc3RydWN0IHNrX2J1ZmYgKikgKCh1bnNpZ25lZCBsb25nKSByeGRwLT5Ib3N0X0NvbnRyb2wpOworCXUxNiBsM19jc3VtLCBsNF9jc3VtOworI2lmZGVmIENPTkZJR18yQlVGRl9NT0RFCisJaW50IGJ1ZjBfbGVuLCBidWYyX2xlbjsKKwl1bnNpZ25lZCBjaGFyICpidWZmOworI2VuZGlmCisKKwlsM19jc3VtID0gUlhEX0dFVF9MM19DS1NVTShyeGRwLT5Db250cm9sXzEpOworCWlmICgocnhkcC0+Q29udHJvbF8xICYgVENQX09SX1VEUF9GUkFNRSkgJiYgKHNwLT5yeF9jc3VtKSkgeworCQlsNF9jc3VtID0gUlhEX0dFVF9MNF9DS1NVTShyeGRwLT5Db250cm9sXzEpOworCQlpZiAoKGwzX2NzdW0gPT0gTDNfQ0tTVU1fT0spICYmIChsNF9jc3VtID09IEw0X0NLU1VNX09LKSkgeworCQkJLyogCisJCQkgKiBOSUMgdmVyaWZpZXMgaWYgdGhlIENoZWNrc3VtIG9mIHRoZSByZWNlaXZlZAorCQkJICogZnJhbWUgaXMgT2sgb3Igbm90IGFuZCBhY2NvcmRpbmdseSByZXR1cm5zCisJCQkgKiBhIGZsYWcgaW4gdGhlIFJ4RC4KKwkJCSAqLworCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJfSBlbHNlIHsKKwkJCS8qIAorCQkJICogUGFja2V0IHdpdGggZXJyb25lb3VzIGNoZWNrc3VtLCBsZXQgdGhlIAorCQkJICogdXBwZXIgbGF5ZXJzIGRlYWwgd2l0aCBpdC4KKwkJCSAqLworCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQl9CisJfSBlbHNlIHsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCX0KKworCWlmIChyeGRwLT5Db250cm9sXzEgJiBSWERfVF9DT0RFKSB7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBlcnIgPSByeGRwLT5Db250cm9sXzEgJiBSWERfVF9DT0RFOworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBSeCBlcnJvciBWYWx1ZTogMHglbGx4XG4iLAorCQkJICBkZXYtPm5hbWUsIGVycik7CisJfQorI2lmZGVmIENPTkZJR18yQlVGRl9NT0RFCisJYnVmMF9sZW4gPSBSWERfR0VUX0JVRkZFUjBfU0laRShyeGRwLT5Db250cm9sXzIpOworCWJ1ZjJfbGVuID0gUlhEX0dFVF9CVUZGRVIyX1NJWkUocnhkcC0+Q29udHJvbF8yKTsKKyNlbmRpZgorCisJc2tiLT5kZXYgPSBkZXY7CisjaWZuZGVmIENPTkZJR18yQlVGRl9NT0RFCisJc2tiX3B1dChza2IsIGxlbik7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKyNlbHNlCisJYnVmZiA9IHNrYl9wdXNoKHNrYiwgYnVmMF9sZW4pOworCW1lbWNweShidWZmLCBiYS0+YmFfMCwgYnVmMF9sZW4pOworCXNrYl9wdXQoc2tiLCBidWYyX2xlbik7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1MySU9fTkFQSQorCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisjZWxzZQorCW5ldGlmX3J4KHNrYik7CisjZW5kaWYKKworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJc3AtPnJ4X3BrdF9jb3VudCsrOworCXNwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisjaWZuZGVmIENPTkZJR18yQlVGRl9NT0RFCisJc3AtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKyNlbHNlCisJc3AtPnN0YXRzLnJ4X2J5dGVzICs9IGJ1ZjBfbGVuICsgYnVmMl9sZW47CisjZW5kaWYKKworCWF0b21pY19kZWMoJnNwLT5yeF9idWZzX2xlZnRbcmluZ19ub10pOworCXJ4ZHAtPkhvc3RfQ29udHJvbCA9IDA7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKKy8qKgorICogIHMyaW9fbGluayAtIHN0b3BzL3N0YXJ0cyB0aGUgVHggcXVldWUuCisgKiAgQHNwIDogcHJpdmF0ZSBtZW1iZXIgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUsIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGUKKyAqICBzMmlvX25pYyBzdHJ1Y3R1cmUuCisgKiAgQGxpbmsgOiBpbmlkaWNhdGVzIHdoZXRoZXIgbGluayBpcyBVUC9ET1dOLgorICogIERlc2NyaXB0aW9uOgorICogIFRoaXMgZnVuY3Rpb24gc3RvcHMvc3RhcnRzIHRoZSBUeCBxdWV1ZSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbGluaworICogIHN0YXR1cyBvZiB0aGUgTklDIGlzIGlzIGRvd24gb3IgdXAuIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBBbGFybSAKKyAqICBpbnRlcnJ1cHQgaGFuZGxlciB3aGVuZXZlciBhIGxpbmsgY2hhbmdlIGludGVycnVwdCBjb21lcyB1cC4gCisgKiAgUmV0dXJuIHZhbHVlOgorICogIHZvaWQuCisgKi8KKworc3RhdGljIHZvaWQgczJpb19saW5rKG5pY190ICogc3AsIGludCBsaW5rKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgc3AtPmRldjsKKworCWlmIChsaW5rICE9IHNwLT5sYXN0X2xpbmtfc3RhdGUpIHsKKwkJaWYgKGxpbmsgPT0gTElOS19ET1dOKSB7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBMaW5rIGRvd25cbiIsIGRldi0+bmFtZSk7CisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQl9IGVsc2UgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogTGluayBVcFxuIiwgZGV2LT5uYW1lKTsKKwkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwkJfQorCX0KKwlzcC0+bGFzdF9saW5rX3N0YXRlID0gbGluazsKK30KKworLyoqCisgKiAgczJpb19pbml0X3BjaSAtSW5pdGlhbGl6YXRpb24gb2YgUENJIGFuZCBQQ0ktWCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAuIAorICogIEBzcCA6IHByaXZhdGUgbWVtYmVyIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLCB3aGljaCBpcyBhIHBvaW50ZXIgdG8gdGhlIAorICogIHMyaW9fbmljIHN0cnVjdHVyZS4KKyAqICBEZXNjcmlwdGlvbjoKKyAqICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIGEgZmV3IG9mIHRoZSBQQ0kgYW5kIFBDSS1YIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCisgKiAgd2l0aCByZWNvbW1lbmRlZCB2YWx1ZXMuCisgKiAgUmV0dXJuIHZhbHVlOgorICogIHZvaWQKKyAqLworCitzdGF0aWMgdm9pZCBzMmlvX2luaXRfcGNpKG5pY190ICogc3ApCit7CisJdTE2IHBjaV9jbWQgPSAwOworCisJLyogRW5hYmxlIERhdGEgUGFyaXR5IEVycm9yIFJlY292ZXJ5IGluIFBDSS1YIGNvbW1hbmQgcmVnaXN0ZXIuICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoc3AtPnBkZXYsIFBDSVhfQ09NTUFORF9SRUdJU1RFUiwKKwkJCSAgICAgJihzcC0+cGNpeF9jbWQpKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoc3AtPnBkZXYsIFBDSVhfQ09NTUFORF9SRUdJU1RFUiwKKwkJCSAgICAgIChzcC0+cGNpeF9jbWQgfCAxKSk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoc3AtPnBkZXYsIFBDSVhfQ09NTUFORF9SRUdJU1RFUiwKKwkJCSAgICAgJihzcC0+cGNpeF9jbWQpKTsKKworCS8qIFNldCB0aGUgUEVyciBSZXNwb25zZSBiaXQgaW4gUENJIGNvbW1hbmQgcmVnaXN0ZXIuICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoc3AtPnBkZXYsIFBDSV9DT01NQU5ELCAmcGNpX2NtZCk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNwLT5wZGV2LCBQQ0lfQ09NTUFORCwKKwkJCSAgICAgIChwY2lfY21kIHwgUENJX0NPTU1BTkRfUEFSSVRZKSk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoc3AtPnBkZXYsIFBDSV9DT01NQU5ELCAmcGNpX2NtZCk7CisKKwkvKiBTZXQgTU1SQiBjb3VudCB0byAxMDI0IGluIFBDSS1YIENvbW1hbmQgcmVnaXN0ZXIuICovCisJc3AtPnBjaXhfY21kICY9IDB4RkZGMzsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoc3AtPnBkZXYsIFBDSVhfQ09NTUFORF9SRUdJU1RFUiwgKHNwLT5wY2l4X2NtZCB8ICgweDEgPDwgMikpKTsJLyogTU1SQkMgMUsgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChzcC0+cGRldiwgUENJWF9DT01NQU5EX1JFR0lTVEVSLAorCQkJICAgICAmKHNwLT5wY2l4X2NtZCkpOworCisJLyogIFNldHRpbmcgTWF4aW11bSBvdXRzdGFuZGluZyBzcGxpdHMgYmFzZWQgb24gc3lzdGVtIHR5cGUuICovCisJc3AtPnBjaXhfY21kICY9IDB4RkY4RjsKKworCXNwLT5wY2l4X2NtZCB8PSBYRU5BX01BWF9PVVRTVEFORElOR19TUExJVFMoMHgxKTsJLyogMiBzcGxpdHMuICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNwLT5wZGV2LCBQQ0lYX0NPTU1BTkRfUkVHSVNURVIsCisJCQkgICAgICBzcC0+cGNpeF9jbWQpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHNwLT5wZGV2LCBQQ0lYX0NPTU1BTkRfUkVHSVNURVIsCisJCQkgICAgICYoc3AtPnBjaXhfY21kKSk7CisJLyogRm9yY2libHkgZGlzYWJsaW5nIHJlbGF4ZWQgb3JkZXJpbmcgY2FwYWJpbGl0eSBvZiB0aGUgY2FyZC4gKi8KKwlzcC0+cGNpeF9jbWQgJj0gMHhmZmZkOworCXBjaV93cml0ZV9jb25maWdfd29yZChzcC0+cGRldiwgUENJWF9DT01NQU5EX1JFR0lTVEVSLAorCQkJICAgICAgc3AtPnBjaXhfY21kKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChzcC0+cGRldiwgUENJWF9DT01NQU5EX1JFR0lTVEVSLAorCQkJICAgICAmKHNwLT5wY2l4X2NtZCkpOworfQorCitNT0RVTEVfQVVUSE9SKCJSYWdoYXZlbmRyYSBLb3VzaGlrIDxyYWdoYXZlbmRyYS5rb3VzaGlrQG5ldGVyaW9uLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9wYXJhbSh0eF9maWZvX251bSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheSh0eF9maWZvX2xlbiwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbShyeF9yaW5nX251bSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShyeF9yaW5nX3N6LCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKFN0YXRzX3JlZnJlc2hfdGltZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShybWFjX3BhdXNlX3RpbWUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obWNfcGF1c2VfdGhyZXNob2xkX3EwcTMsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obWNfcGF1c2VfdGhyZXNob2xkX3E0cTcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oc2hhcmVkX3NwbGl0cywgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh0bWFjX3V0aWxfcGVyaW9kLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJtYWNfdXRpbF9wZXJpb2QsIGludCwgMCk7CisjaWZuZGVmIENPTkZJR19TMklPX05BUEkKK21vZHVsZV9wYXJhbShpbmRpY2F0ZV9tYXhfcGt0cywgaW50LCAwKTsKKyNlbmRpZgorLyoqCisgKiAgczJpb19pbml0X25pYyAtIEluaXRpYWxpemF0aW9uIG9mIHRoZSBhZGFwdGVyIC4gCisgKiAgQHBkZXYgOiBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgUENJIHJlbGF0ZWQgaW5mb3JtYXRpb24gb2YgdGhlIGRldmljZS4KKyAqICBAcHJlOiBMaXN0IG9mIFBDSSBkZXZpY2VzIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyIGxpc3RlZCBpbiBzMmlvX3RibC4KKyAqICBEZXNjcmlwdGlvbjoKKyAqICBUaGUgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgYW4gYWRhcHRlciBpZGVudGlmaWVkIGJ5IHRoZSBwY2lfZGVjIHN0cnVjdHVyZS4KKyAqICBBbGwgT1MgcmVsYXRlZCBpbml0aWFsaXphdGlvbiBpbmNsdWRpbmcgbWVtb3J5IGFuZCBkZXZpY2Ugc3RydWN0dXJlIGFuZCAKKyAqICBpbml0bGFpemF0aW9uIG9mIHRoZSBkZXZpY2UgcHJpdmF0ZSB2YXJpYWJsZSBpcyBkb25lLiBBbHNvIHRoZSBzd2FwcGVyIAorICogIGNvbnRyb2wgcmVnaXN0ZXIgaXMgaW5pdGlhbGl6ZWQgdG8gZW5hYmxlIHJlYWQgYW5kIHdyaXRlIGludG8gdGhlIEkvTyAKKyAqICByZWdpc3RlcnMgb2YgdGhlIGRldmljZS4KKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgcmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIG9uIGZhaWx1cmUuCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQKK3MyaW9faW5pdF9uaWMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwcmUpCit7CisJbmljX3QgKnNwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJY2hhciAqZGV2X25hbWUgPSAiUzJJTyAxMEdFIE5JQyI7CisJaW50IGksIGosIHJldDsKKwlpbnQgZG1hX2ZsYWcgPSBGQUxTRTsKKwl1MzIgbWFjX3VwLCBtYWNfZG93bjsKKwl1NjQgdmFsNjQgPSAwLCB0bXA2NCA9IDA7CisJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IE5VTEw7CisJdTE2IHN1YmlkOworCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKKworCisJREJHX1BSSU5UKEVSUl9EQkcsICJMb2FkaW5nIFMySU8gZHJpdmVyIHdpdGggJXNcbiIsCisJCXMyaW9fZHJpdmVyX3ZlcnNpb24pOworCisJaWYgKChyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsCisJCQkgICJzMmlvX2luaXRfbmljOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmZmZmZmZmZmZVTEwpKSB7CisJCURCR19QUklOVChJTklUX0RCRywgInMyaW9faW5pdF9uaWM6IFVzaW5nIDY0Yml0IERNQVxuIik7CisJCWRtYV9mbGFnID0gVFJVRTsKKworCQlpZiAocGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrCisJCSAgICAocGRldiwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSkgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsCisJCQkJICAiVW5hYmxlIHRvIG9idGFpbiA2NGJpdCBETUEgZm9yIFwKKwkJCQkJY29uc2lzdGVudCBhbGxvY2F0aW9uc1xuIik7CisJCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0gZWxzZSBpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZlVMKSkgeworCQlEQkdfUFJJTlQoSU5JVF9EQkcsICJzMmlvX2luaXRfbmljOiBVc2luZyAzMmJpdCBETUFcbiIpOworCX0gZWxzZSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgczJpb19kcml2ZXJfbmFtZSkpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICJSZXF1ZXN0IFJlZ2lvbnMgZmFpbGVkXG4iKSwKKwkJICAgIHBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKG5pY190KSk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCS8qICBQcml2YXRlIG1lbWJlciB2YXJpYWJsZSBpbml0aWFsaXplZCB0byBzMmlvIE5JQyBzdHJ1Y3R1cmUgKi8KKwlzcCA9IGRldi0+cHJpdjsKKwltZW1zZXQoc3AsIDAsIHNpemVvZihuaWNfdCkpOworCXNwLT5kZXYgPSBkZXY7CisJc3AtPnBkZXYgPSBwZGV2OworCXNwLT52ZW5kb3JfaWQgPSBwZGV2LT52ZW5kb3I7CisJc3AtPmRldmljZV9pZCA9IHBkZXYtPmRldmljZTsKKwlzcC0+aGlnaF9kbWFfZmxhZyA9IGRtYV9mbGFnOworCXNwLT5pcnEgPSBwZGV2LT5pcnE7CisJc3AtPmRldmljZV9lbmFibGVkX29uY2UgPSBGQUxTRTsKKwlzdHJjcHkoc3AtPm5hbWUsIGRldl9uYW1lKTsKKworCS8qIEluaXRpYWxpemUgc29tZSBQQ0kvUENJLVggZmllbGRzIG9mIHRoZSBOSUMuICovCisJczJpb19pbml0X3BjaShzcCk7CisKKwkvKiAKKwkgKiBTZXR0aW5nIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgorCSAqIE1vc3Qgb2YgdGhlc2UgcGFyYW1ldGVycyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIGR1cmluZyAKKwkgKiBtb2R1bGUgaW5zZXJ0aW9uIGFzIHRoZXkgYXJlIG1vZHVsZSBsb2FkYWJsZSBwYXJhbWV0ZXJzLiBJZiAKKwkgKiB0aGVzZSBwYXJhbWV0ZXJzIGFyZSBub3Qgbm90IHNwZWNpZmllZCBkdXJpbmcgbG9hZCB0aW1lLCB0aGV5IAorCSAqIGFyZSBpbml0aWFsaXplZCB3aXRoIGRlZmF1bHQgdmFsdWVzLgorCSAqLworCW1hY19jb250cm9sID0gJnNwLT5tYWNfY29udHJvbDsKKwljb25maWcgPSAmc3AtPmNvbmZpZzsKKworCS8qIFR4IHNpZGUgcGFyYW1ldGVycy4gKi8KKwl0eF9maWZvX2xlblswXSA9IERFRkFVTFRfRklGT19MRU47CS8qIERlZmF1bHQgdmFsdWUuICovCisJY29uZmlnLT50eF9maWZvX251bSA9IHR4X2ZpZm9fbnVtOworCWZvciAoaSA9IDA7IGkgPCBNQVhfVFhfRklGT1M7IGkrKykgeworCQljb25maWctPnR4X2NmZ1tpXS5maWZvX2xlbiA9IHR4X2ZpZm9fbGVuW2ldOworCQljb25maWctPnR4X2NmZ1tpXS5maWZvX3ByaW9yaXR5ID0gaTsKKwl9CisKKwljb25maWctPnR4X2ludHJfdHlwZSA9IFRYRF9JTlRfVFlQRV9VVElMWjsKKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT50eF9maWZvX251bTsgaSsrKSB7CisJCWNvbmZpZy0+dHhfY2ZnW2ldLmZfbm9fc25vb3AgPQorCQkgICAgKE5PX1NOT09QX1RYRCB8IE5PX1NOT09QX1RYRF9CVUZGRVIpOworCQlpZiAoY29uZmlnLT50eF9jZmdbaV0uZmlmb19sZW4gPCA2NSkgeworCQkJY29uZmlnLT50eF9pbnRyX3R5cGUgPSBUWERfSU5UX1RZUEVfUEVSX0xJU1Q7CisJCQlicmVhazsKKwkJfQorCX0KKwljb25maWctPm1heF90eGRzID0gTUFYX1NLQl9GUkFHUzsKKworCS8qIFJ4IHNpZGUgcGFyYW1ldGVycy4gKi8KKwlyeF9yaW5nX3N6WzBdID0gU01BTExfQkxLX0NOVDsJLyogRGVmYXVsdCB2YWx1ZS4gKi8KKwljb25maWctPnJ4X3JpbmdfbnVtID0gcnhfcmluZ19udW07CisJZm9yIChpID0gMDsgaSA8IE1BWF9SWF9SSU5HUzsgaSsrKSB7CisJCWNvbmZpZy0+cnhfY2ZnW2ldLm51bV9yeGQgPSByeF9yaW5nX3N6W2ldICoKKwkJICAgIChNQVhfUlhEU19QRVJfQkxPQ0sgKyAxKTsKKwkJY29uZmlnLT5yeF9jZmdbaV0ucmluZ19wcmlvcml0eSA9IGk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHJ4X3JpbmdfbnVtOyBpKyspIHsKKwkJY29uZmlnLT5yeF9jZmdbaV0ucmluZ19vcmcgPSBSSU5HX09SR19CVUZGMTsKKwkJY29uZmlnLT5yeF9jZmdbaV0uZl9ub19zbm9vcCA9CisJCSAgICAoTk9fU05PT1BfUlhEIHwgTk9fU05PT1BfUlhEX0JVRkZFUik7CisJfQorCisJLyogIFNldHRpbmcgTWFjIENvbnRyb2wgcGFyYW1ldGVycyAqLworCW1hY19jb250cm9sLT5ybWFjX3BhdXNlX3RpbWUgPSBybWFjX3BhdXNlX3RpbWU7CisJbWFjX2NvbnRyb2wtPm1jX3BhdXNlX3RocmVzaG9sZF9xMHEzID0gbWNfcGF1c2VfdGhyZXNob2xkX3EwcTM7CisJbWFjX2NvbnRyb2wtPm1jX3BhdXNlX3RocmVzaG9sZF9xNHE3ID0gbWNfcGF1c2VfdGhyZXNob2xkX3E0cTc7CisKKworCS8qIEluaXRpYWxpemUgUmluZyBidWZmZXIgcGFyYW1ldGVycy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKQorCQlhdG9taWNfc2V0KCZzcC0+cnhfYnVmc19sZWZ0W2ldLCAwKTsKKworCS8qICBpbml0aWFsaXplIHRoZSBzaGFyZWQgbWVtb3J5IHVzZWQgYnkgdGhlIE5JQyBhbmQgdGhlIGhvc3QgKi8KKwlpZiAoaW5pdF9zaGFyZWRfbWVtKHNwKSkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIsCisJCQkgIGRldi0+bmFtZSk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gbWVtX2FsbG9jX2ZhaWxlZDsKKwl9CisKKwlzcC0+YmFyMCA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAorCQkJCSAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7CisJaWYgKCFzcC0+YmFyMCkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBTMklPOiBjYW5ub3QgcmVtYXAgaW8gbWVtMVxuIiwKKwkJCSAgZGV2LT5uYW1lKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBiYXIwX3JlbWFwX2ZhaWxlZDsKKwl9CisKKwlzcC0+YmFyMSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpLAorCQkJCSAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAyKSk7CisJaWYgKCFzcC0+YmFyMSkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBTMklPOiBjYW5ub3QgcmVtYXAgaW8gbWVtMlxuIiwKKwkJCSAgZGV2LT5uYW1lKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBiYXIxX3JlbWFwX2ZhaWxlZDsKKwl9CisKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKSBzcC0+YmFyMDsKKworCS8qIEluaXRpYWxpemluZyB0aGUgQkFSMSBhZGRyZXNzIGFzIHRoZSBzdGFydCBvZiB0aGUgRklGTyBwb2ludGVyLiAqLworCWZvciAoaiA9IDA7IGogPCBNQVhfVFhfRklGT1M7IGorKykgeworCQltYWNfY29udHJvbC0+dHhfRklGT19zdGFydFtqXSA9IChUeEZJRk9fZWxlbWVudF90IF9faW9tZW0gKikKKwkJICAgIChzcC0+YmFyMSArIChqICogMHgwMDAyMDAwMCkpOworCX0KKworCS8qICBEcml2ZXIgZW50cnkgcG9pbnRzICovCisJZGV2LT5vcGVuID0gJnMyaW9fb3BlbjsKKwlkZXYtPnN0b3AgPSAmczJpb19jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZzMmlvX3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgPSAmczJpb19nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmczJpb19zZXRfbXVsdGljYXN0OworCWRldi0+ZG9faW9jdGwgPSAmczJpb19pb2N0bDsKKwlkZXYtPmNoYW5nZV9tdHUgPSAmczJpb19jaGFuZ2VfbXR1OworCVNFVF9FVEhUT09MX09QUyhkZXYsICZuZXRkZXZfZXRodG9vbF9vcHMpOworCS8qCisJICogd2lsbCB1c2UgZXRoX21hY19hZGRyKCkgZm9yICBkZXYtPnNldF9tYWNfYWRkcmVzcworCSAqIG1hYyBhZGRyZXNzIHdpbGwgYmUgc2V0IGV2ZXJ5IHRpbWUgZGV2LT5vcGVuKCkgaXMgY2FsbGVkCisJICovCisjaWZkZWYgQ09ORklHX1MySU9fTkFQSQorCWRldi0+cG9sbCA9IHMyaW9fcG9sbDsKKwlkZXYtPndlaWdodCA9IDkwOworI2VuZGlmCisKKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0lQX0NTVU07CisJaWYgKHNwLT5oaWdoX2RtYV9mbGFnID09IFRSVUUpCisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOworI2lmZGVmIE5FVElGX0ZfVFNPCisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsKKyNlbmRpZgorCisJZGV2LT50eF90aW1lb3V0ID0gJnMyaW9fdHhfd2F0Y2hkb2c7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFdBVENIX0RPR19USU1FT1VUOworCUlOSVRfV09SSygmc3AtPnJzdF90aW1lcl90YXNrLAorCQkgICh2b2lkICgqKSh2b2lkICopKSBzMmlvX3Jlc3RhcnRfbmljLCBkZXYpOworCUlOSVRfV09SSygmc3AtPnNldF9saW5rX3Rhc2ssCisJCSAgKHZvaWQgKCopKHZvaWQgKikpIHMyaW9fc2V0X2xpbmssIHNwKTsKKworCXBjaV9zYXZlX3N0YXRlKHNwLT5wZGV2KTsKKworCS8qIFNldHRpbmcgc3dhcHBlciBjb250cm9sIG9uIHRoZSBOSUMsIGZvciBwcm9wZXIgcmVzZXQgb3BlcmF0aW9uICovCisJaWYgKHMyaW9fc2V0X3N3YXBwZXIoc3ApKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiJXM6c3dhcHBlciBzZXR0aW5ncyBhcmUgd3JvbmdcbiIsCisJCQkgIGRldi0+bmFtZSk7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gc2V0X3N3YXBfZmFpbGVkOworCX0KKworCS8qIEZpeCBmb3IgYWxsICJGRnMiIE1BQyBhZGRyZXNzIHByb2JsZW1zIG9ic2VydmVkIG9uIEFscGhhIHBsYXRmb3JtcyAqLworCWZpeF9tYWNfYWRkcmVzcyhzcCk7CisJczJpb19yZXNldChzcCk7CisKKwkvKgorCSAqIFNldHRpbmcgc3dhcHBlciBjb250cm9sIG9uIHRoZSBOSUMsIHNvIHRoZSBNQUMgYWRkcmVzcyBjYW4gYmUgcmVhZC4KKwkgKi8KKwlpZiAoczJpb19zZXRfc3dhcHBlcihzcCkpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsCisJCQkgICIlczogUzJJTzogc3dhcHBlciBzZXR0aW5ncyBhcmUgd3JvbmdcbiIsCisJCQkgIGRldi0+bmFtZSk7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gc2V0X3N3YXBfZmFpbGVkOworCX0KKworCS8qICAKKwkgKiBNQUMgYWRkcmVzcyBpbml0aWFsaXphdGlvbi4KKwkgKiBGb3Igbm93IG9ubHkgb25lIG1hYyBhZGRyZXNzIHdpbGwgYmUgcmVhZCBhbmQgdXNlZC4KKwkgKi8KKwliYXIwID0gc3AtPmJhcjA7CisJdmFsNjQgPSBSTUFDX0FERFJfQ01EX01FTV9SRCB8IFJNQUNfQUREUl9DTURfTUVNX1NUUk9CRV9ORVdfQ01EIHwKKwkgICAgUk1BQ19BRERSX0NNRF9NRU1fT0ZGU0VUKDAgKyBNQUNfTUFDX0FERFJfU1RBUlRfT0ZGU0VUKTsKKwl3cml0ZXEodmFsNjQsICZiYXIwLT5ybWFjX2FkZHJfY21kX21lbSk7CisJd2FpdF9mb3JfY21kX2NvbXBsZXRlKHNwKTsKKworCXRtcDY0ID0gcmVhZHEoJmJhcjAtPnJtYWNfYWRkcl9kYXRhMF9tZW0pOworCW1hY19kb3duID0gKHUzMikgdG1wNjQ7CisJbWFjX3VwID0gKHUzMikgKHRtcDY0ID4+IDMyKTsKKworCW1lbXNldChzcC0+ZGVmX21hY19hZGRyWzBdLm1hY19hZGRyLCAwLCBzaXplb2YoRVRIX0FMRU4pKTsKKworCXNwLT5kZWZfbWFjX2FkZHJbMF0ubWFjX2FkZHJbM10gPSAodTgpIChtYWNfdXApOworCXNwLT5kZWZfbWFjX2FkZHJbMF0ubWFjX2FkZHJbMl0gPSAodTgpIChtYWNfdXAgPj4gOCk7CisJc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkclsxXSA9ICh1OCkgKG1hY191cCA+PiAxNik7CisJc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkclswXSA9ICh1OCkgKG1hY191cCA+PiAyNCk7CisJc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkcls1XSA9ICh1OCkgKG1hY19kb3duID4+IDE2KTsKKwlzcC0+ZGVmX21hY19hZGRyWzBdLm1hY19hZGRyWzRdID0gKHU4KSAobWFjX2Rvd24gPj4gMjQpOworCisJREJHX1BSSU5UKElOSVRfREJHLAorCQkgICJERUZBVUxUIE1BQyBBRERSOjB4JTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMnhcbiIsCisJCSAgc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkclswXSwKKwkJICBzcC0+ZGVmX21hY19hZGRyWzBdLm1hY19hZGRyWzFdLAorCQkgIHNwLT5kZWZfbWFjX2FkZHJbMF0ubWFjX2FkZHJbMl0sCisJCSAgc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkclszXSwKKwkJICBzcC0+ZGVmX21hY19hZGRyWzBdLm1hY19hZGRyWzRdLAorCQkgIHNwLT5kZWZfbWFjX2FkZHJbMF0ubWFjX2FkZHJbNV0pOworCisJLyogIFNldCB0aGUgZmFjdG9yeSBkZWZpbmVkIE1BQyBhZGRyZXNzIGluaXRpYWxseSAgICovCisJZGV2LT5hZGRyX2xlbiA9IEVUSF9BTEVOOworCW1lbWNweShkZXYtPmRldl9hZGRyLCBzcC0+ZGVmX21hY19hZGRyLCBFVEhfQUxFTik7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIHRhc2tsZXQgc3RhdHVzIGFuZCBsaW5rIHN0YXRlIGZsYWdzIAorCSAqIGFuZCB0aGUgY2FyZCBzdGF0dGUgcGFyYW1ldGVyCisJICovCisJYXRvbWljX3NldCgmKHNwLT5jYXJkX3N0YXRlKSwgMCk7CisJc3AtPnRhc2tsZXRfc3RhdHVzID0gMDsKKwlzcC0+bGlua19zdGF0ZSA9IDA7CisKKworCS8qIEluaXRpYWxpemUgc3BpbmxvY2tzICovCisJc3Bpbl9sb2NrX2luaXQoJnNwLT50eF9sb2NrKTsKKyNpZm5kZWYgQ09ORklHX1MySU9fTkFQSQorCXNwaW5fbG9ja19pbml0KCZzcC0+cHV0X2xvY2spOworI2VuZGlmCisKKwkvKiAKKwkgKiBTWEUtMDAyOiBDb25maWd1cmUgbGluayBhbmQgYWN0aXZpdHkgTEVEIHRvIGluaXQgc3RhdGUgCisJICogb24gZHJpdmVyIGxvYWQuIAorCSAqLworCXN1YmlkID0gc3AtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisJaWYgKChzdWJpZCAmIDB4RkYpID49IDB4MDcpIHsKKwkJdmFsNjQgPSByZWFkcSgmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwkJdmFsNjQgfD0gMHgwMDAwODAwMDAwMDAwMDAwVUxMOworCQl3cml0ZXEodmFsNjQsICZiYXIwLT5ncGlvX2NvbnRyb2wpOworCQl2YWw2NCA9IDB4MDQxMTA0MDQwMDAwMDAwMFVMTDsKKwkJd3JpdGVxKHZhbDY0LCAodm9pZCBfX2lvbWVtICopIGJhcjAgKyAweDI3MDApOworCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ncGlvX2NvbnRyb2wpOworCX0KKworCXNwLT5yeF9jc3VtID0gMTsJLyogUnggY2hrc3VtIHZlcmlmeSBlbmFibGVkIGJ5IGRlZmF1bHQgKi8KKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIkRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byByZWdpc3Rlcl9mYWlsZWQ7CisJfQorCisJLyogCisJICogTWFrZSBMaW5rIHN0YXRlIGFzIG9mZiBhdCB0aGlzIHBvaW50LCB3aGVuIHRoZSBMaW5rIGNoYW5nZSAKKwkgKiBpbnRlcnJ1cHQgY29tZXMgdGhlIHN0YXRlIHdpbGwgYmUgYXV0b21hdGljYWxseSBjaGFuZ2VkIHRvIAorCSAqIHRoZSByaWdodCBzdGF0ZS4KKwkgKi8KKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCXNwLT5sYXN0X2xpbmtfc3RhdGUgPSBMSU5LX0RPV047CisKKwlyZXR1cm4gMDsKKworICAgICAgcmVnaXN0ZXJfZmFpbGVkOgorICAgICAgc2V0X3N3YXBfZmFpbGVkOgorCWlvdW5tYXAoc3AtPmJhcjEpOworICAgICAgYmFyMV9yZW1hcF9mYWlsZWQ6CisJaW91bm1hcChzcC0+YmFyMCk7CisgICAgICBiYXIwX3JlbWFwX2ZhaWxlZDoKKyAgICAgIG1lbV9hbGxvY19mYWlsZWQ6CisJZnJlZV9zaGFyZWRfbWVtKHNwKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJZnJlZV9uZXRkZXYoZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogczJpb19yZW1fbmljIC0gRnJlZSB0aGUgUENJIGRldmljZSAKKyAqIEBwZGV2OiBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgUENJIHJlbGF0ZWQgaW5mb3JtYXRpb24gb2YgdGhlIGRldmljZS4KKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgUGNpIHN1YnN5c3RlbSB0byByZWxlYXNlIGEgCisgKiBQQ0kgZGV2aWNlIGFuZCBmcmVlIHVwIGFsbCByZXNvdXJjZSBoZWxkIHVwIGJ5IHRoZSBkZXZpY2UuIFRoaXMgY291bGQKKyAqIGJlIGluIHJlc3BvbnNlIHRvIGEgSG90IHBsdWcgZXZlbnQgb3Igd2hlbiB0aGUgZHJpdmVyIGlzIHRvIGJlIHJlbW92ZWQgCisgKiBmcm9tIG1lbW9yeS4KKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgczJpb19yZW1fbmljKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPQorCSAgICAoc3RydWN0IG5ldF9kZXZpY2UgKikgcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCW5pY190ICpzcDsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIkRyaXZlciBEYXRhIGlzIE5VTEwhIVxuIik7CisJCXJldHVybjsKKwl9CisKKwlzcCA9IGRldi0+cHJpdjsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJZnJlZV9zaGFyZWRfbWVtKHNwKTsKKwlpb3VubWFwKHNwLT5iYXIwKTsKKwlpb3VubWFwKHNwLT5iYXIxKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlmcmVlX25ldGRldihkZXYpOworfQorCisvKioKKyAqIHMyaW9fc3RhcnRlciAtIEVudHJ5IHBvaW50IGZvciB0aGUgZHJpdmVyCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBkcml2ZXIuIEl0IHZlcmlmaWVzCisgKiB0aGUgbW9kdWxlIGxvYWRhYmxlIHBhcmFtZXRlcnMgYW5kIGluaXRpYWxpemVzIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlLgorICovCisKK2ludCBfX2luaXQgczJpb19zdGFydGVyKHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmczJpb19kcml2ZXIpOworfQorCisvKioKKyAqIHMyaW9fY2xvc2VyIC0gQ2xlYW51cCByb3V0aW5lIGZvciB0aGUgZHJpdmVyIAorICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgdGhlIGNsZWFudXAgcm91dGluZSBmb3IgdGhlIGRyaXZlci4gSXQgdW5yZWdpc3QgKiBlcnMgdGhlIGRyaXZlci4KKyAqLworCitzdGF0aWMgdm9pZCBzMmlvX2Nsb3Nlcih2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmczJpb19kcml2ZXIpOworCURCR19QUklOVChJTklUX0RCRywgImNsZWFudXAgZG9uZVxuIik7Cit9CisKK21vZHVsZV9pbml0KHMyaW9fc3RhcnRlcik7Cittb2R1bGVfZXhpdChzMmlvX2Nsb3Nlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zMmlvLmggYi9kcml2ZXJzL25ldC9zMmlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxMWM4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3MyaW8uaApAQCAtMCwwICsxLDc2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogczJpby5oOiBBIExpbnV4IFBDSS1YIEV0aGVybmV0IGRyaXZlciBmb3IgUzJJTyAxMEdiRSBTZXJ2ZXIgTklDCisgKiBDb3B5cmlnaHQoYykgMjAwMi0yMDA1IE5ldGVyaW9uIEluYy4KKworICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqIERyaXZlcnMgYmFzZWQgb24gb3IgZGVyaXZlZCBmcm9tIHRoaXMgY29kZSBmYWxsIHVuZGVyIHRoZSBHUEwgYW5kIG11c3QKKyAqIHJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZS4gIFRoaXMgZmlsZSBpcyBub3QKKyAqIGEgY29tcGxldGUgcHJvZ3JhbSBhbmQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nCisgKiBzeXN0ZW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4KKyAqIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoaXMgZGlzdHJpYnV0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX1MySU9fSAorI2RlZmluZSBfUzJJT19ICisKKyNkZWZpbmUgVEJEIDAKKyNkZWZpbmUgQklUKGxvYykJCSgweDgwMDAwMDAwMDAwMDAwMDBVTEwgPj4gKGxvYykpCisjZGVmaW5lIHZCSVQodmFsLCBsb2MsIHN6KQkoKCh1NjQpdmFsKSA8PCAoNjQtbG9jLXN6KSkKKyNkZWZpbmUgSU5WKGQpICAoKGQmMHhmZik8PDI0KSB8ICgoKGQ+PjgpJjB4ZmYpPDwxNikgfCAoKChkPj4xNikmMHhmZik8PDgpfCAoKGQ+PjI0KSYweGZmKQorCisjaWZuZGVmIEJPT0wKKyNkZWZpbmUgQk9PTCAgICBpbnQKKyNlbmRpZgorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAgICAxCisjZGVmaW5lIEZBTFNFICAgMAorI2VuZGlmCisKKyN1bmRlZiBTVUNDRVNTCisjZGVmaW5lIFNVQ0NFU1MgMAorI2RlZmluZSBGQUlMVVJFIC0xCisKKy8qIE1heGltdW0gb3V0c3RhbmRpbmcgc3BsaXRzIHRvIGJlIGNvbmZpZ3VyZWQgaW50byB4ZW5hLiAqLwordHlwZWRlZiBlbnVtIHhlbmFfbWF4X291dHN0YW5kaW5nX3NwbGl0cyB7CisJWEVOQV9PTkVfU1BMSVRfVFJBTlNBQ1RJT04gPSAwLAorCVhFTkFfVFdPX1NQTElUX1RSQU5TQUNUSU9OID0gMSwKKwlYRU5BX1RIUkVFX1NQTElUX1RSQU5TQUNUSU9OID0gMiwKKwlYRU5BX0ZPVVJfU1BMSVRfVFJBTlNBQ1RJT04gPSAzLAorCVhFTkFfRUlHSFRfU1BMSVRfVFJBTlNBQ1RJT04gPSA0LAorCVhFTkFfVFdFTFZFX1NQTElUX1RSQU5TQUNUSU9OID0gNSwKKwlYRU5BX1NJWFRFRU5fU1BMSVRfVFJBTlNBQ1RJT04gPSA2LAorCVhFTkFfVEhJUlRZVFdPX1NQTElUX1RSQU5TQUNUSU9OID0gNworfSB4ZW5hX21heF9vdXRzdGFuZGluZ19zcGxpdHM7CisjZGVmaW5lIFhFTkFfTUFYX09VVFNUQU5ESU5HX1NQTElUUyhuKSAobiA8PCA0KQorCisvKiAgT1MgY29uY2VybmVkIHZhcmlhYmxlcyBhbmQgY29uc3RhbnRzICovCisjZGVmaW5lIFdBVENIX0RPR19USU1FT1VUICAgCTUqSFoKKyNkZWZpbmUgRUZJTEwgICAgICAgCQkJMHgxMjM0CisjZGVmaW5lIEFMSUdOX1NJWkUgIAkJCTEyNworI2RlZmluZQlQQ0lYX0NPTU1BTkRfUkVHSVNURVIJMHg2MgorCisvKgorICogRGVidWcgcmVsYXRlZCB2YXJpYWJsZXMuCisgKi8KKy8qIGRpZmZlcmVudCBkZWJ1ZyBsZXZlbHMuICovCisjZGVmaW5lCUVSUl9EQkcJCTAKKyNkZWZpbmUJSU5JVF9EQkcJMQorI2RlZmluZQlJTkZPX0RCRwkyCisjZGVmaW5lCVRYX0RCRwkJMworI2RlZmluZQlJTlRSX0RCRwk0CisKKy8qIEdsb2JhbCB2YXJpYWJsZSB0aGF0IGRlZmluZXMgdGhlIHByZXNlbnQgZGVidWcgbGV2ZWwgb2YgdGhlIGRyaXZlci4gKi8KK3N0YXRpYyBpbnQgZGVidWdfbGV2ZWwgPSBFUlJfREJHOwkvKiBEZWZhdWx0IGxldmVsLiAqLworCisvKiBERUJVRyBtZXNzYWdlIHByaW50LiAqLworI2RlZmluZSBEQkdfUFJJTlQoZGJnX2xldmVsLCBhcmdzLi4uKSAgaWYoIShkZWJ1Z19sZXZlbDxkYmdfbGV2ZWwpKSBwcmludGsoYXJncykKKworLyogUHJvdG9jb2wgYXNzaXN0IGZlYXR1cmVzIG9mIHRoZSBOSUMgKi8KKyNkZWZpbmUgTDNfQ0tTVU1fT0sgMHhGRkZGCisjZGVmaW5lIEw0X0NLU1VNX09LIDB4RkZGRgorI2RlZmluZSBTMklPX0pVTUJPX1NJWkUgOTYwMAorCisvKiBUaGUgc3RhdGlzdGljcyBibG9jayBvZiBYZW5hICovCit0eXBlZGVmIHN0cnVjdCBzdGF0X2Jsb2NrIHsKKy8qIFR4IE1BQyBzdGF0aXN0aWNzIGNvdW50ZXJzLiAqLworCXUzMiB0bWFjX2RhdGFfb2N0ZXRzOworCXUzMiB0bWFjX2ZybXM7CisJdTY0IHRtYWNfZHJvcF9mcm1zOworCXUzMiB0bWFjX2Jjc3RfZnJtczsKKwl1MzIgdG1hY19tY3N0X2ZybXM7CisJdTY0IHRtYWNfcGF1c2VfY3RybF9mcm1zOworCXUzMiB0bWFjX3Vjc3RfZnJtczsKKwl1MzIgdG1hY190dGxfb2N0ZXRzOworCXUzMiB0bWFjX2FueV9lcnJfZnJtczsKKwl1MzIgdG1hY19udWNzdF9mcm1zOworCXU2NCB0bWFjX3R0bF9sZXNzX2ZiX29jdGV0czsKKwl1NjQgdG1hY192bGRfaXBfb2N0ZXRzOworCXUzMiB0bWFjX2Ryb3BfaXA7CisJdTMyIHRtYWNfdmxkX2lwOworCXUzMiB0bWFjX3JzdF90Y3A7CisJdTMyIHRtYWNfaWNtcDsKKwl1NjQgdG1hY190Y3A7CisJdTMyIHJlc2VydmVkXzA7CisJdTMyIHRtYWNfdWRwOworCisvKiBSeCBNQUMgU3RhdGlzdGljcyBjb3VudGVycy4gKi8KKwl1MzIgcm1hY19kYXRhX29jdGV0czsKKwl1MzIgcm1hY192bGRfZnJtczsKKwl1NjQgcm1hY19mY3NfZXJyX2ZybXM7CisJdTY0IHJtYWNfZHJvcF9mcm1zOworCXUzMiBybWFjX3ZsZF9iY3N0X2ZybXM7CisJdTMyIHJtYWNfdmxkX21jc3RfZnJtczsKKwl1MzIgcm1hY19vdXRfcm5nX2xlbl9lcnJfZnJtczsKKwl1MzIgcm1hY19pbl9ybmdfbGVuX2Vycl9mcm1zOworCXU2NCBybWFjX2xvbmdfZnJtczsKKwl1NjQgcm1hY19wYXVzZV9jdHJsX2ZybXM7CisJdTY0IHJtYWNfdW5zdXBfY3RybF9mcm1zOworCXUzMiBybWFjX2FjY2VwdGVkX3Vjc3RfZnJtczsKKwl1MzIgcm1hY190dGxfb2N0ZXRzOworCXUzMiBybWFjX2Rpc2NhcmRlZF9mcm1zOworCXUzMiBybWFjX2FjY2VwdGVkX251Y3N0X2ZybXM7CisJdTMyIHJlc2VydmVkXzE7CisJdTMyIHJtYWNfZHJvcF9ldmVudHM7CisJdTY0IHJtYWNfdHRsX2xlc3NfZmJfb2N0ZXRzOworCXU2NCBybWFjX3R0bF9mcm1zOworCXU2NCByZXNlcnZlZF8yOworCXUzMiBybWFjX3VzaXplZF9mcm1zOworCXUzMiByZXNlcnZlZF8zOworCXUzMiBybWFjX2ZyYWdfZnJtczsKKwl1MzIgcm1hY19vc2l6ZWRfZnJtczsKKwl1MzIgcmVzZXJ2ZWRfNDsKKwl1MzIgcm1hY19qYWJiZXJfZnJtczsKKwl1NjQgcm1hY190dGxfNjRfZnJtczsKKwl1NjQgcm1hY190dGxfNjVfMTI3X2ZybXM7CisJdTY0IHJlc2VydmVkXzU7CisJdTY0IHJtYWNfdHRsXzEyOF8yNTVfZnJtczsKKwl1NjQgcm1hY190dGxfMjU2XzUxMV9mcm1zOworCXU2NCByZXNlcnZlZF82OworCXU2NCBybWFjX3R0bF81MTJfMTAyM19mcm1zOworCXU2NCBybWFjX3R0bF8xMDI0XzE1MThfZnJtczsKKwl1MzIgcm1hY19pcDsKKwl1MzIgcmVzZXJ2ZWRfNzsKKwl1NjQgcm1hY19pcF9vY3RldHM7CisJdTMyIHJtYWNfZHJvcF9pcDsKKwl1MzIgcm1hY19oZHJfZXJyX2lwOworCXUzMiByZXNlcnZlZF84OworCXUzMiBybWFjX2ljbXA7CisJdTY0IHJtYWNfdGNwOworCXUzMiBybWFjX2Vycl9kcnBfdWRwOworCXUzMiBybWFjX3VkcDsKKwl1NjQgcm1hY194Z21paV9lcnJfc3ltOworCXU2NCBybWFjX2ZybXNfcTA7CisJdTY0IHJtYWNfZnJtc19xMTsKKwl1NjQgcm1hY19mcm1zX3EyOworCXU2NCBybWFjX2ZybXNfcTM7CisJdTY0IHJtYWNfZnJtc19xNDsKKwl1NjQgcm1hY19mcm1zX3E1OworCXU2NCBybWFjX2ZybXNfcTY7CisJdTY0IHJtYWNfZnJtc19xNzsKKwl1MTYgcm1hY19mdWxsX3EzOworCXUxNiBybWFjX2Z1bGxfcTI7CisJdTE2IHJtYWNfZnVsbF9xMTsKKwl1MTYgcm1hY19mdWxsX3EwOworCXUxNiBybWFjX2Z1bGxfcTc7CisJdTE2IHJtYWNfZnVsbF9xNjsKKwl1MTYgcm1hY19mdWxsX3E1OworCXUxNiBybWFjX2Z1bGxfcTQ7CisJdTMyIHJlc2VydmVkXzk7CisJdTMyIHJtYWNfcGF1c2VfY250OworCXU2NCBybWFjX3hnbWlpX2RhdGFfZXJyX2NudDsKKwl1NjQgcm1hY194Z21paV9jdHJsX2Vycl9jbnQ7CisJdTMyIHJtYWNfZXJyX3RjcDsKKwl1MzIgcm1hY19hY2NlcHRlZF9pcDsKKworLyogUENJL1BDSS1YIFJlYWQgdHJhbnNhY3Rpb24gc3RhdGlzdGljcy4gKi8KKwl1MzIgbmV3X3JkX3JlcV9jbnQ7CisJdTMyIHJkX3JlcV9jbnQ7CisJdTMyIHJkX3J0cnlfY250OworCXUzMiBuZXdfcmRfcmVxX3J0cnlfY250OworCisvKiBQQ0kvUENJLVggV3JpdGUvUmVhZCB0cmFuc2FjdGlvbiBzdGF0aXN0aWNzLiAqLworCXUzMiB3cl9yZXFfY250OworCXUzMiB3cl9ydHJ5X3JkX2Fja19jbnQ7CisJdTMyIG5ld193cl9yZXFfcnRyeV9jbnQ7CisJdTMyIG5ld193cl9yZXFfY250OworCXUzMiB3cl9kaXNjX2NudDsKKwl1MzIgd3JfcnRyeV9jbnQ7CisKKy8qCVBDSS9QQ0ktWCBXcml0ZSAvIERNQSBUcmFuc2FjdGlvbiBzdGF0aXN0aWNzLiAqLworCXUzMiB0eHBfd3JfY250OworCXUzMiByZF9ydHJ5X3dyX2Fja19jbnQ7CisJdTMyIHR4ZF93cl9jbnQ7CisJdTMyIHR4ZF9yZF9jbnQ7CisJdTMyIHJ4ZF93cl9jbnQ7CisJdTMyIHJ4ZF9yZF9jbnQ7CisJdTMyIHJ4Zl93cl9jbnQ7CisJdTMyIHR4Zl9yZF9jbnQ7Cit9IFN0YXRJbmZvX3Q7CisKKy8qIFN0cnVjdHVyZXMgcmVwcmVzZW50aW5nIGRpZmZlcmVudCBpbml0IHRpbWUgY29uZmlndXJhdGlvbgorICogcGFyYW1ldGVycyBvZiB0aGUgTklDLgorICovCisKKy8qIE1haW50YWlucyBQZXIgRklGTyByZWxhdGVkIGluZm9ybWF0aW9uLiAqLwordHlwZWRlZiBzdHJ1Y3QgdHhfZmlmb19jb25maWcgeworI2RlZmluZQlNQVhfQVZBSUxBQkxFX1RYRFMJODE5MgorCXUzMiBmaWZvX2xlbjsJCS8qIHNwZWNpZmllcyBsZW4gb2YgRklGTyB1cHRvIDgxOTIsIGllIG5vIG9mIFR4RExzICovCisvKiBQcmlvcml0eSBkZWZpbml0aW9uICovCisjZGVmaW5lIFRYX0ZJRk9fUFJJXzAgICAgICAgICAgICAgICAwCS8qSGlnaGVzdCAqLworI2RlZmluZSBUWF9GSUZPX1BSSV8xICAgICAgICAgICAgICAgMQorI2RlZmluZSBUWF9GSUZPX1BSSV8yICAgICAgICAgICAgICAgMgorI2RlZmluZSBUWF9GSUZPX1BSSV8zICAgICAgICAgICAgICAgMworI2RlZmluZSBUWF9GSUZPX1BSSV80ICAgICAgICAgICAgICAgNAorI2RlZmluZSBUWF9GSUZPX1BSSV81ICAgICAgICAgICAgICAgNQorI2RlZmluZSBUWF9GSUZPX1BSSV82ICAgICAgICAgICAgICAgNgorI2RlZmluZSBUWF9GSUZPX1BSSV83ICAgICAgICAgICAgICAgNwkvKmxvd2VzdCAqLworCXU4IGZpZm9fcHJpb3JpdHk7CS8qIHNwZWNpZmllcyBwb2ludGVyIGxldmVsIGZvciBGSUZPICovCisJLyogdXNlciBzaG91bGQgbm90IHNldCB0d29zIGZpZm9zIHdpdGggc2FtZSBwcmkgKi8KKwl1OCBmX25vX3Nub29wOworI2RlZmluZSBOT19TTk9PUF9UWEQgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBOT19TTk9PUF9UWERfQlVGRkVSICAgICAgICAgIDB4MDIKK30gdHhfZmlmb19jb25maWdfdDsKKworCisvKiBNYWludGFpbnMgcGVyIFJpbmcgcmVsYXRlZCBpbmZvcm1hdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgcnhfcmluZ19jb25maWcgeworCXUzMiBudW1fcnhkOwkJLypObyBvZiBSeERzIHBlciBSeCBSaW5nICovCisjZGVmaW5lIFJYX1JJTkdfUFJJXzAgICAgICAgICAgICAgICAwCS8qIGhpZ2hlc3QgKi8KKyNkZWZpbmUgUlhfUklOR19QUklfMSAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUlhfUklOR19QUklfMiAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUlhfUklOR19QUklfMyAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUlhfUklOR19QUklfNCAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgUlhfUklOR19QUklfNSAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgUlhfUklOR19QUklfNiAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgUlhfUklOR19QUklfNyAgICAgICAgICAgICAgIDcJLyogbG93ZXN0ICovCisKKwl1OCByaW5nX3ByaW9yaXR5OwkvKlNwZWNpZmllcyBzZXJ2aWNlIHByaW9yaXR5IG9mIHJpbmcgKi8KKwkvKiBPU00gc2hvdWxkIG5vdCBzZXQgYW55IHR3byByaW5ncyB3aXRoIHNhbWUgcHJpb3JpdHkgKi8KKwl1OCByaW5nX29yZzsJCS8qT3JnYW5pemF0aW9uIG9mIHJpbmcgKi8KKyNkZWZpbmUgUklOR19PUkdfQlVGRjEJCTB4MDEKKyNkZWZpbmUgUlhfUklOR19PUkdfQlVGRjMJMHgwMworI2RlZmluZSBSWF9SSU5HX09SR19CVUZGNQkweDA1CisKKwl1OCBmX25vX3Nub29wOworI2RlZmluZSBOT19TTk9PUF9SWEQgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBOT19TTk9PUF9SWERfQlVGRkVSICAgICAgICAgMHgwMgorfSByeF9yaW5nX2NvbmZpZ190OworCisvKiBUaGlzIHN0cnVjdHVyZSBwcm92aWRlcyBjb250YWlucyB2YWx1ZXMgb2YgdGhlIHR1bmFibGUgcGFyYW1ldGVycyAKKyAqIG9mIHRoZSBIL1cgCisgKi8KK3N0cnVjdCBjb25maWdfcGFyYW0geworLyogVHggU2lkZSAqLworCXUzMiB0eF9maWZvX251bTsJLypOdW1iZXIgb2YgVHggRklGT3MgKi8KKyNkZWZpbmUgTUFYX1RYX0ZJRk9TIDgKKworCXR4X2ZpZm9fY29uZmlnX3QgdHhfY2ZnW01BWF9UWF9GSUZPU107CS8qUGVyLVR4IEZJRk8gY29uZmlnICovCisJdTMyIG1heF90eGRzOwkJLypNYXggbm8uIG9mIFR4IGJ1ZmZlciBkZXNjcmlwdG9yIHBlciBUeERMICovCisJdTY0IHR4X2ludHJfdHlwZTsKKwkvKiBTcGVjaWZpZXMgaWYgVHggSW50ciBpcyBVVElMWiBvciBQRVJfTElTVCB0eXBlLiAqLworCisvKiBSeCBTaWRlICovCisJdTMyIHJ4X3JpbmdfbnVtOwkvKk51bWJlciBvZiByZWNlaXZlIHJpbmdzICovCisjZGVmaW5lIE1BWF9SWF9SSU5HUyA4CisjZGVmaW5lIE1BWF9SWF9CTE9DS1NfUEVSX1JJTkcgIDE1MAorCisJcnhfcmluZ19jb25maWdfdCByeF9jZmdbTUFYX1JYX1JJTkdTXTsJLypQZXItUnggUmluZyBjb25maWcgKi8KKworI2RlZmluZSBIRUFERVJfRVRIRVJORVRfSUlfODAyXzNfU0laRSAxNAorI2RlZmluZSBIRUFERVJfODAyXzJfU0laRSAgICAgICAgICAgICAgMworI2RlZmluZSBIRUFERVJfU05BUF9TSVpFICAgICAgICAgICAgICAgNQorI2RlZmluZSBIRUFERVJfVkxBTl9TSVpFICAgICAgICAgICAgICAgNAorCisjZGVmaW5lIE1JTl9NVFUgICAgICAgICAgICAgICAgICAgICAgIDQ2CisjZGVmaW5lIE1BWF9QWUxEICAgICAgICAgICAgICAgICAgICAxNTAwCisjZGVmaW5lIE1BWF9NVFUgICAgICAgICAgICAgICAgICAgICAoTUFYX1BZTEQrMTgpCisjZGVmaW5lIE1BWF9NVFVfVkxBTiAgICAgICAgICAgICAgICAoTUFYX1BZTEQrMjIpCisjZGVmaW5lIE1BWF9QWUxEX0pVTUJPICAgICAgICAgICAgICA5NjAwCisjZGVmaW5lIE1BWF9NVFVfSlVNQk8gICAgICAgICAgICAgICAoTUFYX1BZTERfSlVNQk8rMTgpCisjZGVmaW5lIE1BWF9NVFVfSlVNQk9fVkxBTiAgICAgICAgICAoTUFYX1BZTERfSlVNQk8rMjIpCit9OworCisvKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIE1BQyBBZGRycyAqLwordHlwZWRlZiBzdHJ1Y3QgbWFjX2FkZHIgeworCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsKK30gbWFjYWRkcl90OworCisvKiBTdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnQgZXZlcnkgRklGTyBlbGVtZW50IGluIHRoZSBCQVIxCisgKiBBZGRyZXNzIGxvY2F0aW9uLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX1R4RklGT19lbGVtZW50IHsKKwl1NjQgVHhETF9Qb2ludGVyOworCisJdTY0IExpc3RfQ29udHJvbDsKKyNkZWZpbmUgVFhfRklGT19MQVNUX1RYRF9OVU0oIHZhbCkgICAgIHZCSVQodmFsLDAsOCkKKyNkZWZpbmUgVFhfRklGT19GSVJTVF9MSVNUICAgICAgICAgICAgIEJJVCgxNCkKKyNkZWZpbmUgVFhfRklGT19MQVNUX0xJU1QgICAgICAgICAgICAgIEJJVCgxNSkKKyNkZWZpbmUgVFhfRklGT19GSVJTVE5MQVNUX0xJU1QgICAgICAgIHZCSVQoMywxNCwyKQorI2RlZmluZSBUWF9GSUZPX1NQRUNJQUxfRlVOQyAgICAgICAgICAgQklUKDIzKQorI2RlZmluZSBUWF9GSUZPX0RTX05PX1NOT09QICAgICAgICAgICAgQklUKDMxKQorI2RlZmluZSBUWF9GSUZPX0JVRkZfTk9fU05PT1AgICAgICAgICAgQklUKDMwKQorfSBUeEZJRk9fZWxlbWVudF90OworCisvKiBUeCBkZXNjcmlwdG9yIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgX1R4RCB7CisJdTY0IENvbnRyb2xfMTsKKy8qIGJpdCBtYXNrICovCisjZGVmaW5lIFRYRF9MSVNUX09XTl9YRU5BICAgICAgIEJJVCg3KQorI2RlZmluZSBUWERfVF9DT0RFICAgICAgICAgICAgICAoQklUKDEyKXxCSVQoMTMpfEJJVCgxNCl8QklUKDE1KSkKKyNkZWZpbmUgVFhEX1RfQ09ERV9PSyh2YWwpICAgICAgKHwodmFsICYgVFhEX1RfQ09ERSkpCisjZGVmaW5lIEdFVF9UWERfVF9DT0RFKHZhbCkgICAgICgodmFsICYgVFhEX1RfQ09ERSk8PDEyKQorI2RlZmluZSBUWERfR0FUSEVSX0NPREUgICAgICAgICAoQklUKDIyKSB8IEJJVCgyMykpCisjZGVmaW5lIFRYRF9HQVRIRVJfQ09ERV9GSVJTVCAgIEJJVCgyMikKKyNkZWZpbmUgVFhEX0dBVEhFUl9DT0RFX0xBU1QgICAgQklUKDIzKQorI2RlZmluZSBUWERfVENQX0xTT19FTiAgICAgICAgICBCSVQoMzApCisjZGVmaW5lIFRYRF9VRFBfQ09GX0VOICAgICAgICAgIEJJVCgzMSkKKyNkZWZpbmUgVFhEX1RDUF9MU09fTVNTKHZhbCkgICAgdkJJVCh2YWwsMzQsMTQpCisjZGVmaW5lIFRYRF9CVUZGRVIwX1NJWkUodmFsKSAgIHZCSVQodmFsLDQ4LDE2KQorCisJdTY0IENvbnRyb2xfMjsKKyNkZWZpbmUgVFhEX1RYX0NLT19DT05UUk9MICAgICAgKEJJVCg1KXxCSVQoNil8QklUKDcpKQorI2RlZmluZSBUWERfVFhfQ0tPX0lQVjRfRU4gICAgICBCSVQoNSkKKyNkZWZpbmUgVFhEX1RYX0NLT19UQ1BfRU4gICAgICAgQklUKDYpCisjZGVmaW5lIFRYRF9UWF9DS09fVURQX0VOICAgICAgIEJJVCg3KQorI2RlZmluZSBUWERfVkxBTl9FTkFCTEUgICAgICAgICBCSVQoMTUpCisjZGVmaW5lIFRYRF9WTEFOX1RBRyh2YWwpICAgICAgIHZCSVQodmFsLDE2LDE2KQorI2RlZmluZSBUWERfSU5UX05VTUJFUih2YWwpICAgICB2QklUKHZhbCwzNCw2KQorI2RlZmluZSBUWERfSU5UX1RZUEVfUEVSX0xJU1QgICBCSVQoNDcpCisjZGVmaW5lIFRYRF9JTlRfVFlQRV9VVElMWiAgICAgIEJJVCg0NikKKyNkZWZpbmUgVFhEX1NFVF9NQVJLRVIgICAgICAgICB2QklUKDB4NiwwLDQpCisKKwl1NjQgQnVmZmVyX1BvaW50ZXI7CisJdTY0IEhvc3RfQ29udHJvbDsJLyogcmVzZXJ2ZWQgZm9yIGhvc3QgKi8KK30gVHhEX3Q7CisKKy8qIFN0cnVjdHVyZSB0byBob2xkIHRoZSBwaHkgYW5kIHZpcnQgYWRkciBvZiBldmVyeSBUeERMLiAqLwordHlwZWRlZiBzdHJ1Y3QgbGlzdF9pbmZvX2hvbGQgeworCWRtYV9hZGRyX3QgbGlzdF9waHlfYWRkcjsKKwl2b2lkICpsaXN0X3ZpcnRfYWRkcjsKK30gbGlzdF9pbmZvX2hvbGRfdDsKKworLyogUnggZGVzY3JpcHRvciBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IF9SeERfdCB7CisJdTY0IEhvc3RfQ29udHJvbDsJLyogcmVzZXJ2ZWQgZm9yIGhvc3QgKi8KKwl1NjQgQ29udHJvbF8xOworI2RlZmluZSBSWERfT1dOX1hFTkEgICAgICAgICAgICBCSVQoNykKKyNkZWZpbmUgUlhEX1RfQ09ERSAgICAgICAgICAgICAgKEJJVCgxMil8QklUKDEzKXxCSVQoMTQpfEJJVCgxNSkpCisjZGVmaW5lIFJYRF9GUkFNRV9QUk9UTyAgICAgICAgIHZCSVQoMHhGRkZGLDI0LDgpCisjZGVmaW5lIFJYRF9GUkFNRV9QUk9UT19JUFY0ICAgIEJJVCgyNykKKyNkZWZpbmUgUlhEX0ZSQU1FX1BST1RPX0lQVjYgICAgQklUKDI4KQorI2RlZmluZSBSWERfRlJBTUVfUFJPVE9fVENQICAgICBCSVQoMzApCisjZGVmaW5lIFJYRF9GUkFNRV9QUk9UT19VRFAgICAgIEJJVCgzMSkKKyNkZWZpbmUgVENQX09SX1VEUF9GUkFNRSAgICAgICAgKFJYRF9GUkFNRV9QUk9UT19UQ1AgfCBSWERfRlJBTUVfUFJPVE9fVURQKQorI2RlZmluZSBSWERfR0VUX0wzX0NLU1VNKHZhbCkgICAoKHUxNikodmFsPj4gMTYpICYgMHhGRkZGKQorI2RlZmluZSBSWERfR0VUX0w0X0NLU1VNKHZhbCkgICAoKHUxNikodmFsKSAmIDB4RkZGRikKKworCXU2NCBDb250cm9sXzI7CisjaWZuZGVmIENPTkZJR18yQlVGRl9NT0RFCisjZGVmaW5lIE1BU0tfQlVGRkVSMF9TSVpFICAgICAgIHZCSVQoMHhGRkZGLDAsMTYpCisjZGVmaW5lIFNFVF9CVUZGRVIwX1NJWkUodmFsKSAgIHZCSVQodmFsLDAsMTYpCisjZWxzZQorI2RlZmluZSBNQVNLX0JVRkZFUjBfU0laRSAgICAgICB2QklUKDB4RkYsMCwxNikKKyNkZWZpbmUgTUFTS19CVUZGRVIxX1NJWkUgICAgICAgdkJJVCgweEZGRkYsMTYsMTYpCisjZGVmaW5lIE1BU0tfQlVGRkVSMl9TSVpFICAgICAgIHZCSVQoMHhGRkZGLDMyLDE2KQorI2RlZmluZSBTRVRfQlVGRkVSMF9TSVpFKHZhbCkgICB2QklUKHZhbCw4LDgpCisjZGVmaW5lIFNFVF9CVUZGRVIxX1NJWkUodmFsKSAgIHZCSVQodmFsLDE2LDE2KQorI2RlZmluZSBTRVRfQlVGRkVSMl9TSVpFKHZhbCkgICB2QklUKHZhbCwzMiwxNikKKyNlbmRpZgorCisjZGVmaW5lIE1BU0tfVkxBTl9UQUcgICAgICAgICAgIHZCSVQoMHhGRkZGLDQ4LDE2KQorI2RlZmluZSBTRVRfVkxBTl9UQUcodmFsKSAgICAgICB2QklUKHZhbCw0OCwxNikKKyNkZWZpbmUgU0VUX05VTV9UQUcodmFsKSAgICAgICB2QklUKHZhbCwxNiwzMikKKworI2lmbmRlZiBDT05GSUdfMkJVRkZfTU9ERQorI2RlZmluZSBSWERfR0VUX0JVRkZFUjBfU0laRShDb250cm9sXzIpICh1NjQpKChDb250cm9sXzIgJiB2QklUKDB4RkZGRiwwLDE2KSkpCisjZWxzZQorI2RlZmluZSBSWERfR0VUX0JVRkZFUjBfU0laRShDb250cm9sXzIpICh1OCkoKENvbnRyb2xfMiAmIE1BU0tfQlVGRkVSMF9TSVpFKSBcCisJCQkJCQkJPj4gNDgpCisjZGVmaW5lIFJYRF9HRVRfQlVGRkVSMV9TSVpFKENvbnRyb2xfMikgKHUxNikoKENvbnRyb2xfMiAmIE1BU0tfQlVGRkVSMV9TSVpFKSBcCisJCQkJCQkJPj4gMzIpCisjZGVmaW5lIFJYRF9HRVRfQlVGRkVSMl9TSVpFKENvbnRyb2xfMikgKHUxNikoKENvbnRyb2xfMiAmIE1BU0tfQlVGRkVSMl9TSVpFKSBcCisJCQkJCQkJPj4gMTYpCisjZGVmaW5lIEJVRjBfTEVOCTQwCisjZGVmaW5lIEJVRjFfTEVOCTEKKyNlbmRpZgorCisJdTY0IEJ1ZmZlcjBfcHRyOworI2lmZGVmIENPTkZJR18yQlVGRl9NT0RFCisJdTY0IEJ1ZmZlcjFfcHRyOworCXU2NCBCdWZmZXIyX3B0cjsKKyNlbmRpZgorfSBSeERfdDsKKworLyogU3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyB0aGUgUnggZGVzY3JpcHRvciBibG9jayB3aGljaCBjb250YWlucyAKKyAqIDEyOCBSeCBkZXNjcmlwdG9ycy4KKyAqLworI2lmbmRlZiBDT05GSUdfMkJVRkZfTU9ERQordHlwZWRlZiBzdHJ1Y3QgX1J4RF9ibG9jayB7CisjZGVmaW5lIE1BWF9SWERTX1BFUl9CTE9DSyAgICAgICAgICAgICAxMjcKKwlSeERfdCByeGRbTUFYX1JYRFNfUEVSX0JMT0NLXTsKKworCXU2NCByZXNlcnZlZF8wOworI2RlZmluZSBFTkRfT0ZfQkxPQ0sgICAgMHhGRUZGRkZGRkZGRkZGRkZGVUxMCisJdTY0IHJlc2VydmVkXzE7CQkvKiAweEZFRkZGRkZGRkZGRkZGRkYgdG8gbWFyayBsYXN0IAorCQkJCSAqIFJ4ZCBpbiB0aGlzIGJsayAqLworCXU2NCByZXNlcnZlZF8yX3BOZXh0X1J4RF9ibG9jazsJLyogTG9naWNhbCBwdHIgdG8gbmV4dCAqLworCXU2NCBwTmV4dF9SeERfQmxrX3BoeXNpY2FsOwkvKiBCdWZmMF9wdHIuSW4gYSAzMiBiaXQgYXJjaAorCQkJCQkgKiB0aGUgdXBwZXIgMzIgYml0cyBzaG91bGQgCisJCQkJCSAqIGJlIDAgKi8KK30gUnhEX2Jsb2NrX3Q7CisjZWxzZQordHlwZWRlZiBzdHJ1Y3QgX1J4RF9ibG9jayB7CisjZGVmaW5lIE1BWF9SWERTX1BFUl9CTE9DSyAgICAgICAgICAgICA4NQorCVJ4RF90IHJ4ZFtNQVhfUlhEU19QRVJfQkxPQ0tdOworCisjZGVmaW5lIEVORF9PRl9CTE9DSyAgICAweEZFRkZGRkZGRkZGRkZGRkZVTEwKKwl1NjQgcmVzZXJ2ZWRfMTsJCS8qIDB4RkVGRkZGRkZGRkZGRkZGRiB0byBtYXJrIGxhc3QgUnhkIAorCQkJCSAqIGluIHRoaXMgYmxrICovCisJdTY0IHBOZXh0X1J4RF9CbGtfcGh5c2ljYWw7CS8qIFBoeSBwb250ZXIgdG8gbmV4dCBibGsuICovCit9IFJ4RF9ibG9ja190OworI2RlZmluZSBTSVpFX09GX0JMT0NLCTQwOTYKKworLyogU3RydWN0dXJlIHRvIGhvbGQgdmlydHVhbCBhZGRyZXNzZXMgb2YgQnVmMCBhbmQgQnVmMSBpbiAKKyAqIDJidWYgbW9kZS4gKi8KK3R5cGVkZWYgc3RydWN0IGJ1ZkFkZCB7CisJdm9pZCAqYmFfMF9vcmc7CisJdm9pZCAqYmFfMV9vcmc7CisJdm9pZCAqYmFfMDsKKwl2b2lkICpiYV8xOworfSBidWZmQWRkX3Q7CisjZW5kaWYKKworLyogU3RydWN0dXJlIHdoaWNoIHN0b3JlcyBhbGwgdGhlIE1BQyBjb250cm9sIHBhcmFtZXRlcnMgKi8KKworLyogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBvZmZzZXQgb2YgdGhlIFJ4RCBpbiB0aGUgcmluZyAKKyAqIGZyb20gd2hpY2ggdGhlIFJ4IEludGVycnVwdCBwcm9jZXNzb3IgY2FuIHN0YXJ0IHBpY2tpbmcgCisgKiB1cCB0aGUgUnhEcyBmb3IgcHJvY2Vzc2luZy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3J4X2N1cnJfZ2V0X2luZm9fdCB7CisJdTMyIGJsb2NrX2luZGV4OworCXUzMiBvZmZzZXQ7CisJdTMyIHJpbmdfbGVuOworfSByeF9jdXJyX2dldF9pbmZvX3Q7CisKK3R5cGVkZWYgcnhfY3Vycl9nZXRfaW5mb190IHJ4X2N1cnJfcHV0X2luZm9fdDsKKworLyogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIHRoZSBvZmZzZXQgb2YgdGhlIFR4RGwgaW4gdGhlIEZJRk8KKyAqIGZyb20gd2hpY2ggdGhlIFR4IEludGVycnVwdCBwcm9jZXNzb3IgY2FuIHN0YXJ0IHBpY2tpbmcgCisgKiB1cCB0aGUgVHhETHMgZm9yIHNlbmQgY29tcGxldGUgaW50ZXJydXB0IHByb2Nlc3NpbmcuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgb2Zmc2V0OworCXUzMiBmaWZvX2xlbjsKK30gdHhfY3Vycl9nZXRfaW5mb190OworCit0eXBlZGVmIHR4X2N1cnJfZ2V0X2luZm9fdCB0eF9jdXJyX3B1dF9pbmZvX3Q7CisKKy8qIEluZm9tYXRpb24gcmVsYXRlZCB0byB0aGUgVHggYW5kIFJ4IEZJRk9zIGFuZCBSaW5ncyBvZiBYZW5hCisgKiBpcyBtYWludGFpbmVkIGluIHRoaXMgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtYWNfaW5mbyB7CisvKiByeCBzaWRlIHN0dWZmICovCisJLyogUHV0IHBvaW50ZXIgaW5mbyB3aGljaCBpbmRpY3RlcyB3aGljaCBSeEQgaGFzIHRvIGJlIHJlcGxlbmlzaGVkIAorCSAqIHdpdGggYSBuZXcgYnVmZmVyLgorCSAqLworCXJ4X2N1cnJfcHV0X2luZm9fdCByeF9jdXJyX3B1dF9pbmZvW01BWF9SWF9SSU5HU107CisKKwkvKiBHZXQgcG9pbnRlciBpbmZvIHdoaWNoIGluZGljdGVzIHdoaWNoIGlzIHRoZSBsYXN0IFJ4RCB0aGF0IHdhcyAKKwkgKiBwcm9jZXNzZWQgYnkgdGhlIGRyaXZlci4KKwkgKi8KKwlyeF9jdXJyX2dldF9pbmZvX3QgcnhfY3Vycl9nZXRfaW5mb1tNQVhfUlhfUklOR1NdOworCisJdTE2IHJtYWNfcGF1c2VfdGltZTsKKwl1MTYgbWNfcGF1c2VfdGhyZXNob2xkX3EwcTM7CisJdTE2IG1jX3BhdXNlX3RocmVzaG9sZF9xNHE3OworCisvKiB0eCBzaWRlIHN0dWZmICovCisJLyogbG9naWNhbCBwb2ludGVyIG9mIHN0YXJ0IG9mIGVhY2ggVHggRklGTyAqLworCVR4RklGT19lbGVtZW50X3QgX19pb21lbSAqdHhfRklGT19zdGFydFtNQVhfVFhfRklGT1NdOworCisvKiBDdXJyZW50IG9mZnNldCB3aXRoaW4gdHhfRklGT19zdGFydCwgd2hlcmUgZHJpdmVyIHdvdWxkIHdyaXRlIG5ldyBUeCBmcmFtZSovCisJdHhfY3Vycl9wdXRfaW5mb190IHR4X2N1cnJfcHV0X2luZm9bTUFYX1RYX0ZJRk9TXTsKKwl0eF9jdXJyX2dldF9pbmZvX3QgdHhfY3Vycl9nZXRfaW5mb1tNQVhfVFhfRklGT1NdOworCisJdm9pZCAqc3RhdHNfbWVtOwkvKiBvcmlnbmFsIHBvaW50ZXIgdG8gYWxsb2NhdGVkIG1lbSAqLworCWRtYV9hZGRyX3Qgc3RhdHNfbWVtX3BoeTsJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgc3RhdCBibG9jayAqLworCXUzMiBzdGF0c19tZW1fc3o7CisJU3RhdEluZm9fdCAqc3RhdHNfaW5mbzsJLyogTG9naWNhbCBhZGRyZXNzIG9mIHRoZSBzdGF0IGJsb2NrICovCit9IG1hY19pbmZvX3Q7CisKKy8qIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIHVzZXIgZGVmaW5lZCBNQUMgYWRkcmVzc2VzICovCit0eXBlZGVmIHN0cnVjdCB7CisJY2hhciBhZGRyW0VUSF9BTEVOXTsKKwlpbnQgdXNhZ2VfY250OworfSB1c3JfYWRkcl90OworCisvKiBTdHJ1Y3R1cmUgdGhhdCBob2xkcyB0aGUgUGh5IGFuZCB2aXJ0IGFkZHJlc3NlcyBvZiB0aGUgQmxvY2tzICovCit0eXBlZGVmIHN0cnVjdCByeF9ibG9ja19pbmZvIHsKKwlSeERfdCAqYmxvY2tfdmlydF9hZGRyOworCWRtYV9hZGRyX3QgYmxvY2tfZG1hX2FkZHI7Cit9IHJ4X2Jsb2NrX2luZm9fdDsKKworLyogRGVmYXVsdCBUdW5hYmxlIHBhcmFtZXRlcnMgb2YgdGhlIE5JQy4gKi8KKyNkZWZpbmUgREVGQVVMVF9GSUZPX0xFTiA0MDk2CisjZGVmaW5lIFNNQUxMX1JYRF9DTlQJMzAgKiAoTUFYX1JYRFNfUEVSX0JMT0NLKzEpCisjZGVmaW5lIExBUkdFX1JYRF9DTlQJMTAwICogKE1BWF9SWERTX1BFUl9CTE9DSysxKQorI2RlZmluZSBTTUFMTF9CTEtfQ05UCTMwCisjZGVmaW5lIExBUkdFX0JMS19DTlQJMTAwCisKKy8qIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgb25lIGluc3RhbmNlIG9mIHRoZSBOSUMgKi8KK3R5cGVkZWYgc3RydWN0IHMyaW9fbmljIHsKKyNkZWZpbmUgTUFYX01BQ19TVVBQT1JURUQgICAxNgorI2RlZmluZSBNQVhfU1VQUE9SVEVEX01VTFRJQ0FTVFMgTUFYX01BQ19TVVBQT1JURUQKKworCW1hY2FkZHJfdCBkZWZfbWFjX2FkZHJbTUFYX01BQ19TVVBQT1JURURdOworCW1hY2FkZHJfdCBwcmVfbWFjX2FkZHJbTUFYX01BQ19TVVBQT1JURURdOworCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJdm9pZCBfX2lvbWVtICpiYXIwOworCXZvaWQgX19pb21lbSAqYmFyMTsKKwlzdHJ1Y3QgY29uZmlnX3BhcmFtIGNvbmZpZzsKKwltYWNfaW5mb190IG1hY19jb250cm9sOworCWludCBoaWdoX2RtYV9mbGFnOworCWludCBkZXZpY2VfY2xvc2VfZmxhZzsKKwlpbnQgZGV2aWNlX2VuYWJsZWRfb25jZTsKKworCWNoYXIgbmFtZVszMl07CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHRhc2s7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB0YXNrbGV0X3N0YXR1czsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJdTE2IHZlbmRvcl9pZDsKKwl1MTYgZGV2aWNlX2lkOworCXUxNiBjY21kOworCXUzMiBjYmFyMF8xOworCXUzMiBjYmFyMF8yOworCXUzMiBjYmFyMV8xOworCXUzMiBjYmFyMV8yOworCXUzMiBjaXJxOworCXU4IGNhY2hlX2xpbmU7CisJdTMyIHJvbV9leHBhbnNpb247CisJdTE2IHBjaXhfY21kOworCXUzMiBpcnE7CisJYXRvbWljX3QgcnhfYnVmc19sZWZ0W01BWF9SWF9SSU5HU107CisKKwlzcGlubG9ja190IHR4X2xvY2s7CisjaWZuZGVmIENPTkZJR19TMklPX05BUEkKKwlzcGlubG9ja190IHB1dF9sb2NrOworI2VuZGlmCisKKyNkZWZpbmUgUFJPTUlTQyAgICAgMQorI2RlZmluZSBBTExfTVVMVEkgICAyCisKKyNkZWZpbmUgTUFYX0FERFJTX1NVUFBPUlRFRCA2NAorCXUxNiB1c3JfYWRkcl9jb3VudDsKKwl1MTYgbWNfYWRkcl9jb3VudDsKKwl1c3JfYWRkcl90IHVzcl9hZGRyc1tNQVhfQUREUlNfU1VQUE9SVEVEXTsKKworCXUxNiBtX2Nhc3RfZmxnOworCXUxNiBhbGxfbXVsdGlfcG9zOworCXUxNiBwcm9taXNjX2ZsZzsKKworCXUxNiB0eF9wa3RfY291bnQ7CisJdTE2IHJ4X3BrdF9jb3VudDsKKwl1MTYgdHhfZXJyX2NvdW50OworCXUxNiByeF9lcnJfY291bnQ7CisKKyNpZm5kZWYgQ09ORklHX1MySU9fTkFQSQorCS8qIEluZGV4IHRvIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgcHV0IHBvaW50ZXIgb2YgUnggcmluZy4gKi8KKwlpbnQgcHV0X3Bvc1tNQVhfUlhfUklOR1NdOworI2VuZGlmCisKKwkvKgorCSAqICBQbGFjZSBob2xkZXJzIGZvciB0aGUgdmlydHVhbCBhbmQgcGh5c2ljYWwgYWRkcmVzc2VzIG9mIAorCSAqICBhbGwgdGhlIFJ4IEJsb2NrcworCSAqLworCXJ4X2Jsb2NrX2luZm9fdCByeF9ibG9ja3NbTUFYX1JYX1JJTkdTXVtNQVhfUlhfQkxPQ0tTX1BFUl9SSU5HXTsKKwlpbnQgYmxvY2tfY291bnRbTUFYX1JYX1JJTkdTXTsKKwlpbnQgcGt0X2NudFtNQVhfUlhfUklOR1NdOworCisJLyogUGxhY2UgaG9sZGVyIG9mIGFsbCB0aGUgVFggTGlzdCdzIFBoeSBhbmQgVmlydCBhZGRyZXNzZXMuICovCisJbGlzdF9pbmZvX2hvbGRfdCAqbGlzdF9pbmZvW01BWF9UWF9GSUZPU107CisKKwkvKiAgSWQgdGltZXIsIHVzZWQgdG8gYmxpbmsgTklDIHRvIHBoeXNpY2FsbHkgaWRlbnRpZnkgTklDLiAqLworCXN0cnVjdCB0aW1lcl9saXN0IGlkX3RpbWVyOworCisJLyogIFJlc3RhcnQgdGltZXIsIHVzZWQgdG8gcmVzdGFydCBOSUMgaWYgdGhlIGRldmljZSBpcyBzdHVjayBhbmQKKwkgKiAgYSBzY2hlZHVsZSB0YXNrIHRoYXQgd2lsbCBzZXQgdGhlIGNvcnJlY3QgTGluayBzdGF0ZSBvbmNlIHRoZSAKKwkgKiAgTklDJ3MgUEhZIGhhcyBzdGFiaWxpemVkIGFmdGVyIGEgc3RhdGUgY2hhbmdlLgorCSAqLworI2lmZGVmIElOSVRfVFFVRVVFCisJc3RydWN0IHRxX3N0cnVjdCByc3RfdGltZXJfdGFzazsKKwlzdHJ1Y3QgdHFfc3RydWN0IHNldF9saW5rX3Rhc2s7CisjZWxzZQorCXN0cnVjdCB3b3JrX3N0cnVjdCByc3RfdGltZXJfdGFzazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2V0X2xpbmtfdGFzazsKKyNlbmRpZgorCisJLyogRmxhZyB0aGF0IGNhbiBiZSB1c2VkIHRvIHR1cm4gb24gb3IgdHVybiBvZmYgdGhlIFJ4IGNoZWNrc3VtIAorCSAqIG9mZmxvYWQgZmVhdHVyZS4KKwkgKi8KKwlpbnQgcnhfY3N1bTsKKworCS8qICBhZnRlciBibGluaywgdGhlIGFkYXB0ZXIgbXVzdCBiZSByZXN0b3JlZCB3aXRoIG9yaWdpbmFsIAorCSAqICB2YWx1ZXMuCisJICovCisJdTY0IGFkYXB0X2N0cmxfb3JnOworCisJLyogTGFzdCBrbm93biBsaW5rIHN0YXRlLiAqLworCXUxNiBsYXN0X2xpbmtfc3RhdGU7CisjZGVmaW5lCUxJTktfRE9XTgkxCisjZGVmaW5lCUxJTktfVVAJCTIKKworI2lmZGVmIENPTkZJR18yQlVGRl9NT0RFCisJLyogQnVmZmVyIEFkZHJlc3Mgc3RvcmUuICovCisJYnVmZkFkZF90ICoqYmFbTUFYX1JYX1JJTkdTXTsKKyNlbmRpZgorCWludCB0YXNrX2ZsYWc7CisjZGVmaW5lIENBUkRfRE9XTiAxCisjZGVmaW5lIENBUkRfVVAgMgorCWF0b21pY190IGNhcmRfc3RhdGU7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsaW5rX3N0YXRlOworfSBuaWNfdDsKKworI2RlZmluZSBSRVNFVF9FUlJPUiAxOworI2RlZmluZSBDTURfRVJST1IgICAyOworCisvKiAgT1MgcmVsYXRlZCBzeXN0ZW0gY2FsbHMgKi8KKyNpZm5kZWYgcmVhZHEKK3N0YXRpYyBpbmxpbmUgdTY0IHJlYWRxKHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl1NjQgcmV0ID0gcmVhZGwoYWRkciArIDQpOworCXJldCA8PD0gMzI7CisJcmV0IHw9IHJlYWRsKGFkZHIpOworCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisjaWZuZGVmIHdyaXRlcQorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlcSh1NjQgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJd3JpdGVsKCh1MzIpICh2YWwpLCBhZGRyKTsKKwl3cml0ZWwoKHUzMikgKHZhbCA+PiAzMiksIChhZGRyICsgNCkpOworfQorCisvKiBJbiAzMiBiaXQgbW9kZXMsIHNvbWUgcmVnaXN0ZXJzIGhhdmUgdG8gYmUgd3JpdHRlbiBpbiBhIAorICogcGFydGljdWxhciBvcmRlciB0byBleHBlY3QgY29ycmVjdCBoYXJkd2FyZSBvcGVyYXRpb24uIFRoZQorICogbWFjcm8gU1BFQ0lBTF9SRUdfV1JJVEUgaXMgdXNlZCB0byBwZXJmb3JtIHN1Y2ggb3JkZXJlZCAKKyAqIHdyaXRlcy4gRGVmaW5lcyBVRiAoVXBwZXIgRmlyc3QpIGFuZCBMRiAoTG93ZXIgRmlyc3QpIHdpbGwgCisgKiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlcXVpcmVkIHdyaXRlIG9yZGVyLgorICovCisjZGVmaW5lIFVGCTEKKyNkZWZpbmUgTEYJMgorc3RhdGljIGlubGluZSB2b2lkIFNQRUNJQUxfUkVHX1dSSVRFKHU2NCB2YWwsIHZvaWQgX19pb21lbSAqYWRkciwgaW50IG9yZGVyKQoreworCWlmIChvcmRlciA9PSBMRikgeworCQl3cml0ZWwoKHUzMikgKHZhbCksIGFkZHIpOworCQl3cml0ZWwoKHUzMikgKHZhbCA+PiAzMiksIChhZGRyICsgNCkpOworCX0gZWxzZSB7CisJCXdyaXRlbCgodTMyKSAodmFsID4+IDMyKSwgKGFkZHIgKyA0KSk7CisJCXdyaXRlbCgodTMyKSAodmFsKSwgYWRkcik7CisJfQorfQorI2Vsc2UKKyNkZWZpbmUgU1BFQ0lBTF9SRUdfV1JJVEUodmFsLCBhZGRyLCBkdW1teSkgd3JpdGVxKHZhbCwgYWRkcikKKyNlbmRpZgorCisvKiAgSW50ZXJydXB0IHJlbGF0ZWQgdmFsdWVzIG9mIFhlbmEgKi8KKworI2RlZmluZSBFTkFCTEVfSU5UUlMgICAgMQorI2RlZmluZSBESVNBQkxFX0lOVFJTICAgMgorCisvKiAgSGlnaGVzdCBsZXZlbCBpbnRlcnJ1cHQgYmxvY2tzICovCisjZGVmaW5lIFRYX1BJQ19JTlRSICAgICAoMHgwMDAxPDwwKQorI2RlZmluZSBUWF9ETUFfSU5UUiAgICAgKDB4MDAwMTw8MSkKKyNkZWZpbmUgVFhfTUFDX0lOVFIgICAgICgweDAwMDE8PDIpCisjZGVmaW5lIFRYX1hHWFNfSU5UUiAgICAoMHgwMDAxPDwzKQorI2RlZmluZSBUWF9UUkFGRklDX0lOVFIgKDB4MDAwMTw8NCkKKyNkZWZpbmUgUlhfUElDX0lOVFIgICAgICgweDAwMDE8PDUpCisjZGVmaW5lIFJYX0RNQV9JTlRSICAgICAoMHgwMDAxPDw2KQorI2RlZmluZSBSWF9NQUNfSU5UUiAgICAgKDB4MDAwMTw8NykKKyNkZWZpbmUgUlhfWEdYU19JTlRSICAgICgweDAwMDE8PDgpCisjZGVmaW5lIFJYX1RSQUZGSUNfSU5UUiAoMHgwMDAxPDw5KQorI2RlZmluZSBNQ19JTlRSICAgICAgICAgKDB4MDAwMTw8MTApCisjZGVmaW5lIEVOQV9BTExfSU5UUlMgICAgKCAgIFRYX1BJQ19JTlRSICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWF9ETUFfSU5UUiAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFhfTUFDX0lOVFIgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRYX1hHWFNfSU5UUiAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWF9UUkFGRklDX0lOVFIgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlhfUElDX0lOVFIgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJYX0RNQV9JTlRSICAgICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSWF9NQUNfSU5UUiAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlhfWEdYU19JTlRSICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJYX1RSQUZGSUNfSU5UUiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ19JTlRSICkKKworLyogIEludGVycnVwdCBtYXNrcyBmb3IgdGhlIGdlbmVyYWwgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRElTQUJMRV9BTExfSU5UUlMgICAweEZGRkZGRkZGRkZGRkZGRkZVTEwKKworI2RlZmluZSBUWFBJQ19JTlRfTSAgICAgICAgIEJJVCgwKQorI2RlZmluZSBUWERNQV9JTlRfTSAgICAgICAgIEJJVCgxKQorI2RlZmluZSBUWE1BQ19JTlRfTSAgICAgICAgIEJJVCgyKQorI2RlZmluZSBUWFhHWFNfSU5UX00gICAgICAgIEJJVCgzKQorI2RlZmluZSBUWFRSQUZGSUNfSU5UX00gICAgIEJJVCg4KQorI2RlZmluZSBQSUNfUlhfSU5UX00gICAgICAgIEJJVCgzMikKKyNkZWZpbmUgUlhETUFfSU5UX00gICAgICAgICBCSVQoMzMpCisjZGVmaW5lIFJYTUFDX0lOVF9NICAgICAgICAgQklUKDM0KQorI2RlZmluZSBNQ19JTlRfTSAgICAgICAgICAgIEJJVCgzNSkKKyNkZWZpbmUgUlhYR1hTX0lOVF9NICAgICAgICBCSVQoMzYpCisjZGVmaW5lIFJYVFJBRkZJQ19JTlRfTSAgICAgQklUKDQwKQorCisvKiAgUElDIGxldmVsIEludGVycnVwdHMgVE9ETyovCisKKy8qICBETUEgbGV2ZWwgSW5yZXNzdXB0cyAqLworI2RlZmluZSBUWERNQV9QRkNfSU5UX00gICAgIEJJVCgwKQorI2RlZmluZSBUWERNQV9QQ0NfSU5UX00gICAgIEJJVCgyKQorCisvKiAgUEZDIGJsb2NrIGludGVycnVwdHMgKi8KKyNkZWZpbmUgUEZDX01JU0NfRVJSXzEgICAgICBCSVQoMCkJLyogSW50ZXJydXB0IHRvIGluZGljYXRlIEZJRk8gZnVsbCAqLworCisvKiBQQ0MgYmxvY2sgaW50ZXJydXB0cy4gKi8KKyNkZWZpbmUJUENDX0ZCX0VDQ19FUlIJICAgdkJJVCgweGZmLCAxNiwgOCkJLyogSW50ZXJydXB0IHRvIGluZGljYXRlCisJCQkJCQkgICBQQ0NfRkJfRUNDIEVycm9yLiAqLworCisvKgorICogUHJvdG90eXBlIGRlY2xhcmF0aW9uLgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzMmlvX2luaXRfbmljKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwcmUpOworc3RhdGljIHZvaWQgX19kZXZleGl0IHMyaW9fcmVtX25pYyhzdHJ1Y3QgcGNpX2RldiAqcGRldik7CitzdGF0aWMgaW50IGluaXRfc2hhcmVkX21lbShzdHJ1Y3QgczJpb19uaWMgKnNwKTsKK3N0YXRpYyB2b2lkIGZyZWVfc2hhcmVkX21lbShzdHJ1Y3QgczJpb19uaWMgKnNwKTsKK3N0YXRpYyBpbnQgaW5pdF9uaWMoc3RydWN0IHMyaW9fbmljICpuaWMpOworI2lmbmRlZiBDT05GSUdfUzJJT19OQVBJCitzdGF0aWMgdm9pZCByeF9pbnRyX2hhbmRsZXIoc3RydWN0IHMyaW9fbmljICpzcCk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHR4X2ludHJfaGFuZGxlcihzdHJ1Y3QgczJpb19uaWMgKnNwKTsKK3N0YXRpYyB2b2lkIGFsYXJtX2ludHJfaGFuZGxlcihzdHJ1Y3QgczJpb19uaWMgKnNwKTsKKworc3RhdGljIGludCBzMmlvX3N0YXJ0ZXIodm9pZCk7CitzdGF0aWMgdm9pZCBzMmlvX2Nsb3Nlcih2b2lkKTsKK3N0YXRpYyB2b2lkIHMyaW9fdHhfd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzMmlvX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkZXZfYWRkcik7CitzdGF0aWMgdm9pZCBzMmlvX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjaWZuZGVmIENPTkZJR18yQlVGRl9NT0RFCitzdGF0aWMgaW50IHJ4X29zbV9oYW5kbGVyKG5pY190ICogc3AsIHUxNiBsZW4sIFJ4RF90ICogcnhkcCwgaW50IHJpbmdfbm8pOworI2Vsc2UKK3N0YXRpYyBpbnQgcnhfb3NtX2hhbmRsZXIobmljX3QgKiBzcCwgUnhEX3QgKiByeGRwLCBpbnQgcmluZ19ubywKKwkJCSAgYnVmZkFkZF90ICogYmEpOworI2VuZGlmCitzdGF0aWMgdm9pZCBzMmlvX2xpbmsobmljX3QgKiBzcCwgaW50IGxpbmspOworc3RhdGljIHZvaWQgczJpb19yZXNldChuaWNfdCAqIHNwKTsKKyNpZmRlZiBDT05GSUdfUzJJT19OQVBJCitzdGF0aWMgaW50IHMyaW9fcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIHMyaW9faW5pdF9wY2kobmljX3QgKiBzcCk7CitzdGF0aWMgaW50IHMyaW9fc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICogYWRkcik7CitzdGF0aWMgaXJxcmV0dXJuX3QgczJpb19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IHZlcmlmeV94ZW5hX3F1aWVzY2VuY2UodTY0IHZhbDY0LCBpbnQgZmxhZyk7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wczsKK3N0YXRpYyB2b2lkIHMyaW9fc2V0X2xpbmsodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyBpbnQgczJpb19zZXRfc3dhcHBlcihuaWNfdCAqIHNwKTsKK3N0YXRpYyB2b2lkIHMyaW9fY2FyZF9kb3duKG5pY190ICogbmljKTsKK3N0YXRpYyBpbnQgczJpb19jYXJkX3VwKG5pY190ICogbmljKTsKKworI2VuZGlmCQkJCS8qIF9TMklPX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NhYTk3MzAuYyBiL2RyaXZlcnMvbmV0L3NhYTk3MzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDAxNjcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2FhOTczMC5jCkBAIC0wLDAgKzEsMTE4NCBAQAorLyoKKyAqIENhcnN0ZW4gTGFuZ2dhYXJkLCBjYXJzdGVubEBtaXBzLmNvbQorICogQ29weXJpZ2h0IChDKSAyMDAwIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChWZXJzaW9uIDIpIGFzCisgKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICoKKyAqIFNBQTk3MzAgZXRoZXJuZXQgZHJpdmVyLgorICoKKyAqIENoYW5nZXM6CisgKiBBbmdlbG8gRGVsbCdBZXJhIDxidWZmZXJAYW50aWZvcmsub3JnPiA6IENvbnZlcnNpb24gdG8gdGhlIG5ldyBQQ0kgQVBJIChwY2lfZHJpdmVyKS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvbiB0byBzcGlubG9ja3MuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yIGhhbmRsaW5nIGZpeGVzLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KKyNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvcHJvbS5oPgorCisjaW5jbHVkZSAic2FhOTczMC5oIgorCisjaWZkZWYgTEFOX1NBQTk3MzBfREVCVUcKK2ludCBsYW5fc2FhOTczMF9kZWJ1ZyA9IExBTl9TQUE5NzMwX0RFQlVHOworI2Vsc2UKK2ludCBsYW5fc2FhOTczMF9kZWJ1ZzsKKyNlbmRpZgorCisjZGVmaW5lIERSVl9NT0RVTEVfTkFNRSAic2FhOTczMCIKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNhYTk3MzBfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9QSElMSVBTLCBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBOTM3MCwKKyAgICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzYWE5NzMwX3BjaV90YmwpOworCisvKiBOb24temVybyBvbmx5IGlmIHRoZSBjdXJyZW50IGNhcmQgaXMgYSBQQ0kgd2l0aCBCSU9TLXNldCBJUlEuICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBjaV9pcnFfbGluZTsKKworI2RlZmluZSBJTkwoYSkgICAgIGlubCgodW5zaWduZWQgbG9uZylhKQorI2RlZmluZSBPVVRMKHgsYSkgIG91dGwoeCwodW5zaWduZWQgbG9uZylhKQorCitzdGF0aWMgdm9pZCBldm1fc2FhOTczMF9lbmFibGVfbGFuX2ludChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHApCit7CisJT1VUTChJTkwoJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRCbG9jazEpIHwgRVZNX0xBTl9JTlQsCisJICAgICAmbHAtPmV2bV9zYWE5NzMwX3JlZ3MtPkludGVycnVwdEJsb2NrMSk7CisJT1VUTChJTkwoJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRTdGF0dXMxKSB8IEVWTV9MQU5fSU5ULAorCSAgICAgJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRTdGF0dXMxKTsKKwlPVVRMKElOTCgmbHAtPmV2bV9zYWE5NzMwX3JlZ3MtPkludGVycnVwdEVuYWJsZTEpIHwgRVZNX0xBTl9JTlQgfAorCSAgICAgRVZNX01BU1RFUl9FTiwgJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRFbmFibGUxKTsKK30KK3N0YXRpYyB2b2lkIGV2bV9zYWE5NzMwX2Rpc2FibGVfbGFuX2ludChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHApCit7CisJT1VUTChJTkwoJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRCbG9jazEpICYgfkVWTV9MQU5fSU5ULAorCSAgICAgJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRCbG9jazEpOworCU9VVEwoSU5MKCZscC0+ZXZtX3NhYTk3MzBfcmVncy0+SW50ZXJydXB0RW5hYmxlMSkgJiB+RVZNX0xBTl9JTlQsCisJICAgICAmbHAtPmV2bV9zYWE5NzMwX3JlZ3MtPkludGVycnVwdEVuYWJsZTEpOworfQorCitzdGF0aWMgdm9pZCBldm1fc2FhOTczMF9jbGVhcl9sYW5faW50KHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCkKK3sKKwlPVVRMKEVWTV9MQU5fSU5ULCAmbHAtPmV2bV9zYWE5NzMwX3JlZ3MtPkludGVycnVwdFN0YXR1czEpOworfQorCitzdGF0aWMgdm9pZCBldm1fc2FhOTczMF9ibG9ja19sYW5faW50KHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCkKK3sKKwlPVVRMKElOTCgmbHAtPmV2bV9zYWE5NzMwX3JlZ3MtPkludGVycnVwdEJsb2NrMSkgJiB+RVZNX0xBTl9JTlQsCisJICAgICAmbHAtPmV2bV9zYWE5NzMwX3JlZ3MtPkludGVycnVwdEJsb2NrMSk7Cit9CisKK3N0YXRpYyB2b2lkIGV2bV9zYWE5NzMwX3VuYmxvY2tfbGFuX2ludChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHApCit7CisJT1VUTChJTkwoJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRCbG9jazEpIHwgRVZNX0xBTl9JTlQsCisJICAgICAmbHAtPmV2bV9zYWE5NzMwX3JlZ3MtPkludGVycnVwdEJsb2NrMSk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfc2FhOTczMF9yZWdzKHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCkKK3sKKwlpbnQgaSwgajsKKwlwcmludGsoIlR4bUJ1ZmZlckEgPSAleFxuIiwgbHAtPlR4bUJ1ZmZlclswXVswXSk7CisJcHJpbnRrKCJUeG1CdWZmZXJCID0gJXhcbiIsIGxwLT5UeG1CdWZmZXJbMV1bMF0pOworCXByaW50aygiUmN2QnVmZmVyQSA9ICV4XG4iLCBscC0+UmN2QnVmZmVyWzBdWzBdKTsKKwlwcmludGsoIlJjdkJ1ZmZlckIgPSAleFxuIiwgbHAtPlJjdkJ1ZmZlclsxXVswXSk7CisJZm9yIChpID0gMDsgaSA8IExBTl9TQUE5NzMwX0JVRkZFUlM7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgTEFOX1NBQTk3MzBfVFhNX1FfU0laRTsgaisrKSB7CisJCQlwcmludGsoIlR4bUJ1ZmZlclslZF1bJWRdID0gJXhcbiIsIGksIGosCisJCQkgICAgICAgbGUzMl90b19jcHUoKih1bnNpZ25lZCBpbnQgKikKKwkJCQkJICAgbHAtPlR4bUJ1ZmZlcltpXVtqXSkpOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBMQU5fU0FBOTczMF9CVUZGRVJTOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IExBTl9TQUE5NzMwX1JDVl9RX1NJWkU7IGorKykgeworCQkJcHJpbnRrKCJSY3ZCdWZmZXJbJWRdWyVkXSA9ICV4XG4iLCBpLCBqLAorCQkJICAgICAgIGxlMzJfdG9fY3B1KCoodW5zaWduZWQgaW50ICopCisJCQkJCSAgIGxwLT5SY3ZCdWZmZXJbaV1bal0pKTsKKwkJfQorCX0KKwlwcmludGsoImxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRCbG9jazEgPSAleFxuIiwKKwkgICAgICAgSU5MKCZscC0+ZXZtX3NhYTk3MzBfcmVncy0+SW50ZXJydXB0QmxvY2sxKSk7CisJcHJpbnRrKCJscC0+ZXZtX3NhYTk3MzBfcmVncy0+SW50ZXJydXB0U3RhdHVzMSA9ICV4XG4iLAorCSAgICAgICBJTkwoJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRTdGF0dXMxKSk7CisJcHJpbnRrKCJscC0+ZXZtX3NhYTk3MzBfcmVncy0+SW50ZXJydXB0RW5hYmxlMSA9ICV4XG4iLAorCSAgICAgICBJTkwoJmxwLT5ldm1fc2FhOTczMF9yZWdzLT5JbnRlcnJ1cHRFbmFibGUxKSk7CisJcHJpbnRrKCJscC0+bGFuX3NhYTk3MzBfcmVncy0+T2syVXNlID0gJXhcbiIsCisJICAgICAgIElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPk9rMlVzZSkpOworCXByaW50aygibHAtPk5leHRUeG1CdWZmZXJJbmRleCA9ICV4XG4iLCBscC0+TmV4dFR4bUJ1ZmZlckluZGV4KTsKKwlwcmludGsoImxwLT5OZXh0VHhtUGFja2V0SW5kZXggPSAleFxuIiwgbHAtPk5leHRUeG1QYWNrZXRJbmRleCk7CisJcHJpbnRrKCJscC0+UGVuZGluZ1R4bUJ1ZmZlckluZGV4ID0gJXhcbiIsCisJICAgICAgIGxwLT5QZW5kaW5nVHhtQnVmZmVySW5kZXgpOworCXByaW50aygibHAtPlBlbmRpbmdUeG1QYWNrZXRJbmRleCA9ICV4XG4iLAorCSAgICAgICBscC0+UGVuZGluZ1R4bVBhY2tldEluZGV4KTsKKwlwcmludGsoImxwLT5sYW5fc2FhOTczMF9yZWdzLT5MYW5EbWFDdGwgPSAleFxuIiwKKwkgICAgICAgSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+TGFuRG1hQ3RsKSk7CisJcHJpbnRrKCJscC0+bGFuX3NhYTk3MzBfcmVncy0+RG1hU3RhdHVzID0gJXhcbiIsCisJICAgICAgIElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkRtYVN0YXR1cykpOworCXByaW50aygibHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkNhbUN0bCA9ICV4XG4iLAorCSAgICAgICBJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5DYW1DdGwpKTsKKwlwcmludGsoImxwLT5sYW5fc2FhOTczMF9yZWdzLT5UeEN0bCA9ICV4XG4iLAorCSAgICAgICBJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5UeEN0bCkpOworCXByaW50aygibHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlR4U3RhdHVzID0gJXhcbiIsCisJICAgICAgIElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlR4U3RhdHVzKSk7CisJcHJpbnRrKCJscC0+bGFuX3NhYTk3MzBfcmVncy0+UnhDdGwgPSAleFxuIiwKKwkgICAgICAgSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+UnhDdGwpKTsKKwlwcmludGsoImxwLT5sYW5fc2FhOTczMF9yZWdzLT5SeFN0YXR1cyA9ICV4XG4iLAorCSAgICAgICBJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5SeFN0YXR1cykpOworCWZvciAoaSA9IDA7IGkgPCBMQU5fU0FBOTczMF9DQU1fRFdPUkRTOyBpKyspIHsKKwkJT1VUTChpLCAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkNhbUFkZHJlc3MpOworCQlwcmludGsoImxwLT5sYW5fc2FhOTczMF9yZWdzLT5DYW1EYXRhID0gJXhcbiIsCisJCSAgICAgICBJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5DYW1EYXRhKSk7CisJfQorCXByaW50aygibHAtPnN0YXRzLnR4X3BhY2tldHMgPSAlbHhcbiIsIGxwLT5zdGF0cy50eF9wYWNrZXRzKTsKKwlwcmludGsoImxwLT5zdGF0cy50eF9lcnJvcnMgPSAlbHhcbiIsIGxwLT5zdGF0cy50eF9lcnJvcnMpOworCXByaW50aygibHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzID0gJWx4XG4iLAorCSAgICAgICBscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMpOworCXByaW50aygibHAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMgPSAlbHhcbiIsCisJICAgICAgIGxwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKTsKKwlwcmludGsoImxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyA9ICVseFxuIiwKKwkgICAgICAgbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKTsKKwlwcmludGsoImxwLT5zdGF0cy50eF9maWZvX2Vycm9ycyA9ICVseFxuIiwKKwkgICAgICAgbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKTsKKwlwcmludGsoImxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzID0gJWx4XG4iLAorCSAgICAgICBscC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycyk7CisJcHJpbnRrKCJscC0+c3RhdHMuY29sbGlzaW9ucyA9ICVseFxuIiwgbHAtPnN0YXRzLmNvbGxpc2lvbnMpOworCisJcHJpbnRrKCJscC0+c3RhdHMucnhfcGFja2V0cyA9ICVseFxuIiwgbHAtPnN0YXRzLnJ4X3BhY2tldHMpOworCXByaW50aygibHAtPnN0YXRzLnJ4X2Vycm9ycyA9ICVseFxuIiwgbHAtPnN0YXRzLnJ4X2Vycm9ycyk7CisJcHJpbnRrKCJscC0+c3RhdHMucnhfZHJvcHBlZCA9ICVseFxuIiwgbHAtPnN0YXRzLnJ4X2Ryb3BwZWQpOworCXByaW50aygibHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMgPSAlbHhcbiIsIGxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKTsKKwlwcmludGsoImxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgPSAlbHhcbiIsCisJICAgICAgIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMpOworCXByaW50aygibHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzID0gJWx4XG4iLAorCSAgICAgICBscC0+c3RhdHMucnhfZmlmb19lcnJvcnMpOworCXByaW50aygibHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgPSAlbHhcbiIsCisJICAgICAgIGxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKTsKKworCXByaW50aygibHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkRlYnVnUENJTWFzdGVyQWRkciA9ICV4XG4iLAorCSAgICAgICBJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5EZWJ1Z1BDSU1hc3RlckFkZHIpKTsKKwlwcmludGsoImxwLT5sYW5fc2FhOTczMF9yZWdzLT5EZWJ1Z0xhblR4U3RhdGVNYWNoaW5lID0gJXhcbiIsCisJICAgICAgIElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkRlYnVnTGFuVHhTdGF0ZU1hY2hpbmUpKTsKKwlwcmludGsoImxwLT5sYW5fc2FhOTczMF9yZWdzLT5EZWJ1Z0xhblJ4U3RhdGVNYWNoaW5lID0gJXhcbiIsCisJICAgICAgIElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkRlYnVnTGFuUnhTdGF0ZU1hY2hpbmUpKTsKKwlwcmludGsoImxwLT5sYW5fc2FhOTczMF9yZWdzLT5EZWJ1Z0xhblR4Rmlmb1BvaW50ZXJzID0gJXhcbiIsCisJICAgICAgIElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkRlYnVnTGFuVHhGaWZvUG9pbnRlcnMpKTsKKwlwcmludGsoImxwLT5sYW5fc2FhOTczMF9yZWdzLT5EZWJ1Z0xhblJ4Rmlmb1BvaW50ZXJzID0gJXhcbiIsCisJICAgICAgIElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkRlYnVnTGFuUnhGaWZvUG9pbnRlcnMpKTsKKwlwcmludGsoImxwLT5sYW5fc2FhOTczMF9yZWdzLT5EZWJ1Z0xhbkN0bFN0YXRlTWFjaGluZSA9ICV4XG4iLAorCSAgICAgICBJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5EZWJ1Z0xhbkN0bFN0YXRlTWFjaGluZSkpOworfQorCitzdGF0aWMgdm9pZCBsYW5fc2FhOTczMF9idWZmZXJfaW5pdChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHApCit7CisJaW50IGksIGo7CisKKwkvKiBJbml0IFJYIGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTEFOX1NBQTk3MzBfQlVGRkVSUzsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBMQU5fU0FBOTczMF9SQ1ZfUV9TSVpFOyBqKyspIHsKKwkJCSoodW5zaWduZWQgaW50ICopIGxwLT5SY3ZCdWZmZXJbaV1bal0gPQorCQkJICAgIGNwdV90b19sZTMyKFJYU0ZfUkVBRFkgPDwKKwkJCQkJUlhfU1RBVF9DVExfT1dORVJfU0hGKTsKKwkJfQorCX0KKworCS8qIEluaXQgVFggYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBMQU5fU0FBOTczMF9CVUZGRVJTOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IExBTl9TQUE5NzMwX1RYTV9RX1NJWkU7IGorKykgeworCQkJKih1bnNpZ25lZCBpbnQgKikgbHAtPlR4bUJ1ZmZlcltpXVtqXSA9CisJCQkgICAgY3B1X3RvX2xlMzIoVFhTRl9FTVBUWSA8PAorCQkJCQlUWF9TVEFUX0NUTF9PV05FUl9TSEYpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGxhbl9zYWE5NzMwX2FsbG9jYXRlX2J1ZmZlcnMoc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwKQoreworCXVuc2lnbmVkIGludCBtZW1fc2l6ZTsKKwl2b2lkICpQYTsKKwl1bnNpZ25lZCBpbnQgaSwgaiwgUmN2QnVmZmVyU2l6ZSwgVHhtQnVmZmVyU2l6ZTsKKwl1bnNpZ25lZCBpbnQgYnVmZmVyX3N0YXJ0OworCisJLyogCisJICogQWxsb2NhdGUgYWxsIFJYIGFuZCBUWCBwYWNrZXRzIGluIG9uZSBjaHVuay4gCisJICogVGhlIFJ4IGFuZCBUeCBwYWNrZXRzIG11c3QgYmUgUEFDS0VUX1NJWkUgYWxpZ25lZC4KKwkgKi8KKwltZW1fc2l6ZSA9ICgoTEFOX1NBQTk3MzBfUkNWX1FfU0laRSArIExBTl9TQUE5NzMwX1RYTV9RX1NJWkUpICoKKwkJICAgIExBTl9TQUE5NzMwX1BBQ0tFVF9TSVpFICogTEFOX1NBQTk3MzBfQlVGRkVSUykgKworCSAgICBMQU5fU0FBOTczMF9QQUNLRVRfU0laRTsKKwlidWZmZXJfc3RhcnQgPQorCSAgICAodW5zaWduZWQgaW50KSBrbWFsbG9jKG1lbV9zaXplLCBHRlBfRE1BIHwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWJ1ZmZlcl9zdGFydCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiAKKwkgKiBTZXQgRE1BIGJ1ZmZlciB0byBrc2VnMSAodW5jYWNoZWQpLgorCSAqIE1ha2Ugc3VyZSB0byBmbHVzaCBiZWZvcmUgdXNpbmcgaXQgdW5jYWNoZWQuCisJICovCisJUGEgPSAodm9pZCAqKSBLU0VHMUFERFIoKGJ1ZmZlcl9zdGFydCArIExBTl9TQUE5NzMwX1BBQ0tFVF9TSVpFKSAmCisJCQkJfihMQU5fU0FBOTczMF9QQUNLRVRfU0laRSAtIDEpKTsKKwlkbWFfY2FjaGVfd2JhY2tfaW52KCh1bnNpZ25lZCBsb25nKSBQYSwgbWVtX3NpemUpOworCisJLyogSW5pdGlhbGl6ZSBidWZmZXIgc3BhY2UgKi8KKwlSY3ZCdWZmZXJTaXplID0gTEFOX1NBQTk3MzBfUEFDS0VUX1NJWkU7CisJVHhtQnVmZmVyU2l6ZSA9IExBTl9TQUE5NzMwX1BBQ0tFVF9TSVpFOworCWxwLT5EbWFSY3ZQYWNrZXRzID0gTEFOX1NBQTk3MzBfUkNWX1FfU0laRTsKKwlscC0+RG1hVHhtUGFja2V0cyA9IExBTl9TQUE5NzMwX1RYTV9RX1NJWkU7CisKKwkvKiBJbml0IFJYIGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTEFOX1NBQTk3MzBfQlVGRkVSUzsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBMQU5fU0FBOTczMF9SQ1ZfUV9TSVpFOyBqKyspIHsKKwkJCSoodW5zaWduZWQgaW50ICopIFBhID0KKwkJCSAgICBjcHVfdG9fbGUzMihSWFNGX1JFQURZIDw8CisJCQkJCVJYX1NUQVRfQ1RMX09XTkVSX1NIRik7CisJCQlscC0+UmN2QnVmZmVyW2ldW2pdID0gKHVuc2lnbmVkIGludCkgUGE7CisJCQlQYSArPSBSY3ZCdWZmZXJTaXplOworCQl9CisJfQorCisJLyogSW5pdCBUWCBidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8IExBTl9TQUE5NzMwX0JVRkZFUlM7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgTEFOX1NBQTk3MzBfVFhNX1FfU0laRTsgaisrKSB7CisJCQkqKHVuc2lnbmVkIGludCAqKSBQYSA9CisJCQkgICAgY3B1X3RvX2xlMzIoVFhTRl9FTVBUWSA8PAorCQkJCQlUWF9TVEFUX0NUTF9PV05FUl9TSEYpOworCQkJbHAtPlR4bUJ1ZmZlcltpXVtqXSA9ICh1bnNpZ25lZCBpbnQpIFBhOworCQkJUGEgKz0gVHhtQnVmZmVyU2l6ZTsKKwkJfQorCX0KKworCS8qIAorCSAqIFNldCByeCBidWZmZXIgQSBhbmQgcnggYnVmZmVyIEIgdG8gcG9pbnQgdG8gdGhlIGZpcnN0IHR3byBidWZmZXIgCisJICogc3BhY2VzLgorCSAqLworCU9VVEwoUEhZU0FERFIobHAtPlJjdkJ1ZmZlclswXVswXSksCisJICAgICAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlJ4QnVmZkEpOworCU9VVEwoUEhZU0FERFIobHAtPlJjdkJ1ZmZlclsxXVswXSksCisJICAgICAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlJ4QnVmZkIpOworCisJLyogSW5pdGlhbGl6ZSBCdWZmZXIgSW5kZXggKi8KKwlscC0+TmV4dFJjdlBhY2tldEluZGV4ID0gMDsKKwlscC0+TmV4dFJjdlRvVXNlSXNBID0gMTsKKworCS8qIFNldCBjdXJyZW50IGJ1ZmZlciBpbmRleCAmIG5leHQgYXZhaWxibGUgcGFja2V0IGluZGV4ICovCisJbHAtPk5leHRUeG1QYWNrZXRJbmRleCA9IDA7CisJbHAtPk5leHRUeG1CdWZmZXJJbmRleCA9IDA7CisJbHAtPlBlbmRpbmdUeG1QYWNrZXRJbmRleCA9IDA7CisJbHAtPlBlbmRpbmdUeG1CdWZmZXJJbmRleCA9IDA7CisKKwkvKiAKKwkgKiBTZXQgdHhtX2J1Zl9hIGFuZCB0eG1fYnVmX2IgdG8gcG9pbnQgdG8gdGhlIGZpcnN0IHR3byBidWZmZXIKKwkgKiBzcGFjZSAKKwkgKi8KKwlPVVRMKFBIWVNBRERSKGxwLT5UeG1CdWZmZXJbMF1bMF0pLAorCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5UeEJ1ZmZBKTsKKwlPVVRMKFBIWVNBRERSKGxwLT5UeG1CdWZmZXJbMV1bMF0pLAorCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5UeEJ1ZmZCKTsKKworCS8qIFNldCBwYWNrZXQgbnVtYmVyICovCisJT1VUTCgobHAtPkRtYVJjdlBhY2tldHMgPDwgUEtfQ09VTlRfUlhfQV9TSEYpIHwKKwkgICAgIChscC0+RG1hUmN2UGFja2V0cyA8PCBQS19DT1VOVF9SWF9CX1NIRikgfAorCSAgICAgKGxwLT5EbWFUeG1QYWNrZXRzIDw8IFBLX0NPVU5UX1RYX0FfU0hGKSB8CisJICAgICAobHAtPkRtYVR4bVBhY2tldHMgPDwgUEtfQ09VTlRfVFhfQl9TSEYpLAorCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5QYWNrZXRDb3VudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsYW5fc2FhOTczMF9jYW1fbG9hZChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHApCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgY2hhciAqTmV0d29ya0FkZHJlc3M7CisKKwlOZXR3b3JrQWRkcmVzcyA9ICh1bnNpZ25lZCBjaGFyICopICZscC0+UGh5c2ljYWxBZGRyZXNzWzBdWzBdOworCisJZm9yIChpID0gMDsgaSA8IExBTl9TQUE5NzMwX0NBTV9EV09SRFM7IGkrKykgeworCQkvKiBGaXJzdCBzZXQgYWRkcmVzcyB0byB3aGVyZSBkYXRhIGlzIHdyaXR0ZW4gKi8KKwkJT1VUTChpLCAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkNhbUFkZHJlc3MpOworCQlPVVRMKChOZXR3b3JrQWRkcmVzc1swXSA8PCAyNCkgfCAoTmV0d29ya0FkZHJlc3NbMV0gPDwgMTYpCisJCSAgICAgfCAoTmV0d29ya0FkZHJlc3NbMl0gPDwgOCkgfCBOZXR3b3JrQWRkcmVzc1szXSwKKwkJICAgICAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkNhbURhdGEpOworCQlOZXR3b3JrQWRkcmVzcyArPSA0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsYW5fc2FhOTczMF9jYW1faW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCA9CisJICAgIChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBDb3B5IE1BQy1hZGRyZXNzIGludG8gYWxsIGVudHJpZXMuICovCisJZm9yIChpID0gMDsgaSA8IExBTl9TQUE5NzMwX0NBTV9FTlRSSUVTOyBpKyspIHsKKwkJbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopIGxwLT5QaHlzaWNhbEFkZHJlc3NbaV0sCisJCSAgICAgICAodW5zaWduZWQgY2hhciAqKSBkZXYtPmRldl9hZGRyLCA2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsYW5fc2FhOTczMF9taWlfaW5pdChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHApCit7CisJaW50IGksIGw7CisKKwkvKiBDaGVjayBsaW5rIHN0YXR1cywgc3BpbiBoZXJlIHRpbGwgc3RhdGlvbiBpcyBub3QgYnVzeS4gKi8KKwlpID0gMDsKKwl3aGlsZSAoSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+U3RhdGlvbk1nbXRDdGwpICYgTURfQ0FfQlVTWSkgeworCQlpKys7CisJCWlmIChpID4gMTAwKSB7CisJCQlwcmludGsoIkVycm9yOiBsYW5fc2FhOTczMF9taWlfaW5pdDogdGltZW91dFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbWRlbGF5KDEpOwkvKiB3YWl0IDEgbXMuICovCisJfQorCisJLyogTm93IHNldCB0aGUgY29udHJvbCBhbmQgYWRkcmVzcyByZWdpc3Rlci4gKi8KKwlPVVRMKE1EX0NBX0JVU1kgfCBQSFlfU1RBVFVTIHwgUEhZX0FERFJFU1MgPDwgTURfQ0FfUEhZX1NIRiwKKwkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+U3RhdGlvbk1nbXRDdGwpOworCisJLyogY2hlY2sgbGluayBzdGF0dXMsIHNwaW4gaGVyZSB0aWxsIHN0YXRpb24gaXMgbm90IGJ1c3kgKi8KKwlpID0gMDsKKwl3aGlsZSAoSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+U3RhdGlvbk1nbXRDdGwpICYgTURfQ0FfQlVTWSkgeworCQlpKys7CisJCWlmIChpID4gMTAwKSB7CisJCQlwcmludGsoIkVycm9yOiBsYW5fc2FhOTczMF9taWlfaW5pdDogdGltZW91dFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbWRlbGF5KDEpOwkvKiB3YWl0IDEgbXMuICovCisJfQorCisJLyogV2FpdCBmb3IgMSBtcy4gKi8KKwltZGVsYXkoMSk7CisKKwkvKiBDaGVjayB0aGUgbGluayBzdGF0dXMuICovCisJaWYgKElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlN0YXRpb25NZ210RGF0YSkgJgorCSAgICBQSFlfU1RBVFVTX0xJTktfVVApIHsKKwkJLyogTGluayBpcyB1cC4gKi8KKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogTGluayBpcyBkb3duLCByZXNldCB0aGUgUEhZIGZpcnN0LiAqLworCisJCS8qIHNldCBQSFkgYWRkcmVzcyA9ICdDT05UUk9MJyAqLworCQlPVVRMKFBIWV9BRERSRVNTIDw8IE1EX0NBX1BIWV9TSEYgfCBNRF9DQV9XUiB8IFBIWV9DT05UUk9MLAorCQkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+U3RhdGlvbk1nbXRDdGwpOworCisJCS8qIFdhaXQgZm9yIDEgbXMuICovCisJCW1kZWxheSgxKTsKKworCQkvKiBzZXQgJ0NPTlRST0wnID0gZm9yY2UgcmVzZXQgYW5kIHJlbmVnb3RpYXRlICovCisJCU9VVEwoUEhZX0NPTlRST0xfUkVTRVQgfCBQSFlfQ09OVFJPTF9BVVRPX05FRyB8CisJCSAgICAgUEhZX0NPTlRST0xfUkVTVEFSVF9BVVRPX05FRywKKwkJICAgICAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlN0YXRpb25NZ210RGF0YSk7CisKKwkJLyogV2FpdCBmb3IgNTAgbXMuICovCisJCW1kZWxheSg1MCk7CisKKwkJLyogc2V0ICdCVVNZJyB0byBzdGFydCBvcGVyYXRpb24gKi8KKwkJT1VUTChNRF9DQV9CVVNZIHwgUEhZX0FERFJFU1MgPDwgTURfQ0FfUEhZX1NIRiB8IE1EX0NBX1dSIHwKKwkJICAgICBQSFlfQ09OVFJPTCwgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5TdGF0aW9uTWdtdEN0bCk7CisKKwkJLyogYXdhaXQgY29tcGxldGlvbiAqLworCQlpID0gMDsKKwkJd2hpbGUgKElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlN0YXRpb25NZ210Q3RsKSAmCisJCSAgICAgICBNRF9DQV9CVVNZKSB7CisJCQlpKys7CisJCQlpZiAoaSA+IDEwMCkgeworCQkJCXByaW50aworCQkJCSAgICAoIkVycm9yOiBsYW5fc2FhOTczMF9taWlfaW5pdDogdGltZW91dFxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJbWRlbGF5KDEpOwkvKiB3YWl0IDEgbXMuICovCisJCX0KKworCQkvKiBXYWl0IGZvciAxIG1zLiAqLworCQltZGVsYXkoMSk7CisKKwkJZm9yIChsID0gMDsgbCA8IDI7IGwrKykgeworCQkJLyogc2V0IFBIWSBhZGRyZXNzID0gJ1NUQVRVUycgKi8KKwkJCU9VVEwoTURfQ0FfQlVTWSB8IFBIWV9BRERSRVNTIDw8IE1EX0NBX1BIWV9TSEYgfAorCQkJICAgICBQSFlfU1RBVFVTLAorCQkJICAgICAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlN0YXRpb25NZ210Q3RsKTsKKworCQkJLyogYXdhaXQgY29tcGxldGlvbiAqLworCQkJaSA9IDA7CisJCQl3aGlsZSAoSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+U3RhdGlvbk1nbXRDdGwpICYKKwkJCSAgICAgICBNRF9DQV9CVVNZKSB7CisJCQkJaSsrOworCQkJCWlmIChpID4gMTAwKSB7CisJCQkJCXByaW50aworCQkJCQkgICAgKCJFcnJvcjogbGFuX3NhYTk3MzBfbWlpX2luaXQ6IHRpbWVvdXRcbiIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCW1kZWxheSgxKTsJLyogd2FpdCAxIG1zLiAqLworCQkJfQorCisJCQkvKiB3YWl0IGZvciAzIHNlYy4gKi8KKwkJCW1kZWxheSgzMDAwKTsKKworCQkJLyogY2hlY2sgdGhlIGxpbmsgc3RhdHVzICovCisJCQlpZiAoSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+U3RhdGlvbk1nbXREYXRhKSAmCisJCQkgICAgUEhZX1NUQVRVU19MSU5LX1VQKSB7CisJCQkJLyogbGluayBpcyB1cCAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFuX3NhYTk3MzBfY29udHJvbF9pbml0KHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCkKK3sKKwkvKiBJbml0aWFsaXplIERNQSBjb250cm9sIHJlZ2lzdGVyLiAqLworCU9VVEwoKExBTk1CX0FOWSA8PCBETUFfQ1RMX01BWF9YRkVSX1NIRikgfAorCSAgICAgKExBTkVORF9MSVRUTEUgPDwgRE1BX0NUTF9FTkRJQU5fU0hGKSB8CisJICAgICAoTEFOX1NBQTk3MzBfUkNWX1FfSU5UX1RIUkVTSE9MRCA8PCBETUFfQ1RMX1JYX0lOVF9DT1VOVF9TSEYpCisJICAgICB8IERNQV9DVExfUlhfSU5UX1RPX0VOIHwgRE1BX0NUTF9SWF9JTlRfRU4gfAorCSAgICAgRE1BX0NUTF9NQUNfUlhfSU5UX0VOIHwgRE1BX0NUTF9NQUNfVFhfSU5UX0VOLAorCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5MYW5EbWFDdGwpOworCisJLyogSW5pdGlhbCBNQUMgY29udHJvbCByZWdpc3Rlci4gKi8KKwlPVVRMKChNQUNDTV9NSUkgPDwgTUFDX0NPTlRST0xfQ09OTl9TSEYpIHwgTUFDX0NPTlRST0xfRlVMTF9EVVAsCisJICAgICAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPk1hY0N0bCk7CisKKwkvKiBJbml0aWFsaXplIENBTSBjb250cm9sIHJlZ2lzdGVyLiAqLworCU9VVEwoQ0FNX0NPTlRST0xfQ09NUF9FTiB8IENBTV9DT05UUk9MX0JST0FEX0FDQywKKwkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+Q2FtQ3RsKTsKKworCS8qIAorCSAqIEluaXRpYWxpemUgQ0FNIGVuYWJsZSByZWdpc3Rlciwgb25seSB0dXJuIG9uIGZpcnN0IGVudHJ5LCBzaG91bGQKKwkgKiBjb250YWluIG93biBhZGRyLiAKKwkgKi8KKwlPVVRMKDB4MDAwMSwgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5DYW1FbmFibGUpOworCisJLyogSW5pdGlhbGl6ZSBUeCBjb250cm9sIHJlZ2lzdGVyICovCisJT1VUTChUWF9DVExfRU5fQ09NUCwgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5UeEN0bCk7CisKKwkvKiBJbml0aWFsaXplIFJjdiBjb250cm9sIHJlZ2lzdGVyICovCisJT1VUTChSWF9DVExfU1RSSVBfQ1JDLCAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlJ4Q3RsKTsKKworCS8qIFJlc2V0IERNQSBlbmdpbmUgKi8KKwlPVVRMKERNQV9URVNUX1NXX1JFU0VULCAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkRtYVRlc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFuX3NhYTk3MzBfc3RvcChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHApCit7CisJaW50IGk7CisKKwkvKiBTdG9wIERNQSBmaXJzdCAqLworCU9VVEwoSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+TGFuRG1hQ3RsKSAmCisJICAgICB+KERNQV9DVExfRU5fVFhfRE1BIHwgRE1BX0NUTF9FTl9SWF9ETUEpLAorCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5MYW5EbWFDdGwpOworCisJLyogU2V0IHRoZSBTVyBSZXNldCBiaXRzIGluIERNQSBhbmQgTUFDIGNvbnRyb2wgcmVnaXN0ZXJzICovCisJT1VUTChETUFfVEVTVF9TV19SRVNFVCwgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5EbWFUZXN0KTsKKwlPVVRMKElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPk1hY0N0bCkgfCBNQUNfQ09OVFJPTF9SRVNFVCwKKwkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+TWFjQ3RsKTsKKworCS8qIAorCSAqIFdhaXQgZm9yIE1BQyByZXNldCB0byBoYXZlIGZpbmlzaGVkLiBUaGUgcmVzZXQgYml0IGlzIGF1dG8gY2xlYXJlZAorCSAqIHdoZW4gdGhlIHJlc2V0IGlzIGRvbmUuCisJICovCisJaSA9IDA7CisJd2hpbGUgKElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPk1hY0N0bCkgJiBNQUNfQ09OVFJPTF9SRVNFVCkgeworCQlpKys7CisJCWlmIChpID4gMTAwKSB7CisJCQlwcmludGsKKwkJCSAgICAoIkVycm9yOiBsYW5fc2E5NzMwX3N0b3A6IE1BQyByZXNldCB0aW1lb3V0XG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQltZGVsYXkoMSk7CS8qIHdhaXQgMSBtcy4gKi8KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsYW5fc2FhOTczMF9kbWFfaW5pdChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHApCit7CisJLyogU3RvcCBsYW4gY29udHJvbGxlci4gKi8KKwlsYW5fc2FhOTczMF9zdG9wKGxwKTsKKworCU9VVEwoTEFOX1NBQTk3MzBfREVGQVVMVF9USU1FX09VVF9DTlQsCisJICAgICAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlRpbWVvdXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFuX3NhYTk3MzBfc3RhcnQoc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwKQoreworCWxhbl9zYWE5NzMwX2J1ZmZlcl9pbml0KGxwKTsKKworCS8qIEluaXRpYWxpemUgUnggQnVmZmVyIEluZGV4ICovCisJbHAtPk5leHRSY3ZQYWNrZXRJbmRleCA9IDA7CisJbHAtPk5leHRSY3ZUb1VzZUlzQSA9IDE7CisKKwkvKiBTZXQgY3VycmVudCBidWZmZXIgaW5kZXggJiBuZXh0IGF2YWlsYmxlIHBhY2tldCBpbmRleCAqLworCWxwLT5OZXh0VHhtUGFja2V0SW5kZXggPSAwOworCWxwLT5OZXh0VHhtQnVmZmVySW5kZXggPSAwOworCWxwLT5QZW5kaW5nVHhtUGFja2V0SW5kZXggPSAwOworCWxwLT5QZW5kaW5nVHhtQnVmZmVySW5kZXggPSAwOworCisJT1VUTChJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5MYW5EbWFDdGwpIHwgRE1BX0NUTF9FTl9UWF9ETUEgfAorCSAgICAgRE1BX0NUTF9FTl9SWF9ETUEsICZscC0+bGFuX3NhYTk3MzBfcmVncy0+TGFuRG1hQ3RsKTsKKworCS8qIEZvciBUeCwgdHVybiBvbiBNQUMgdGhlbiBETUEgKi8KKwlPVVRMKElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPlR4Q3RsKSB8IFRYX0NUTF9UWF9FTiwKKwkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+VHhDdGwpOworCisJLyogRm9yIFJ4LCB0dXJuIG9uIERNQSB0aGVuIE1BQyAqLworCU9VVEwoSU5MKCZscC0+bGFuX3NhYTk3MzBfcmVncy0+UnhDdGwpIHwgUlhfQ1RMX1JYX0VOLAorCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5SeEN0bCk7CisKKwkvKiBTZXQgT2syVXNlIHRvIGxldCBoYXJkd2FyZSBvd25zIHRoZSBidWZmZXJzICovCisJT1VUTChPSzJVU0VfUlhfQSB8IE9LMlVTRV9SWF9CIHwgT0syVVNFX1RYX0EgfCBPSzJVU0VfVFhfQiwKKwkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+T2syVXNlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhbl9zYWE5NzMwX3Jlc3RhcnQoc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwKQoreworCWxhbl9zYWE5NzMwX3N0b3AobHApOworCWxhbl9zYWE5NzMwX3N0YXJ0KGxwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhbl9zYWE5NzMwX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwID0KKwkgICAgKHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBpbnQgKnBQYWNrZXQ7CisJdW5zaWduZWQgaW50IHR4X3N0YXR1czsKKworCWlmIChsYW5fc2FhOTczMF9kZWJ1ZyA+IDUpCisJCXByaW50aygibGFuX3NhYTk3MzBfdHggaW50ZXJydXB0XG4iKTsKKworCS8qIENsZWFyIGludGVycnVwdC4gKi8KKwlPVVRMKERNQV9TVEFUVVNfTUFDX1RYX0lOVCwgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5EbWFTdGF0dXMpOworCisJd2hpbGUgKDEpIHsKKwkJcFBhY2tldCA9CisJCSAgICAodW5zaWduZWQgaW50ICopIGxwLT5UeG1CdWZmZXJbbHAtPgorCQkJCQkJICAgUGVuZGluZ1R4bUJ1ZmZlckluZGV4XQorCQkgICAgW2xwLT5QZW5kaW5nVHhtUGFja2V0SW5kZXhdOworCisJCS8qIEdldCBzdGF0dXMgb2YgZmlyc3QgcGFja2V0IHRyYW5zbWl0dGVkLiAqLworCQl0eF9zdGF0dXMgPSBsZTMyX3RvX2NwdSgqcFBhY2tldCk7CisKKwkJLyogQ2hlY2sgb3duZXJzaGlwLiAqLworCQlpZiAoKHR4X3N0YXR1cyAmIFRYX1NUQVRfQ1RMX09XTkVSX01TSykgIT0KKwkJICAgIChUWFNGX0hXRE9ORSA8PCBUWF9TVEFUX0NUTF9PV05FUl9TSEYpKSBicmVhazsKKworCQkvKiBDaGVjayBmb3IgZXJyb3IuICovCisJCWlmICh0eF9zdGF0dXMgJiBUWF9TVEFUX0NUTF9FUlJPUl9NU0spIHsKKwkJCWlmIChsYW5fc2FhOTczMF9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKCJsYW5fc2FhOTczMF90eDogdHggZXJyb3IgPSAleFxuIiwKKwkJCQkgICAgICAgdHhfc3RhdHVzKTsKKworCQkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJaWYgKHR4X3N0YXR1cyAmCisJCQkgICAgKFRYX1NUQVRVU19FWF9DT0xMIDw8IFRYX1NUQVRfQ1RMX1NUQVRVU19TSEYpKQorCQkJCSAgICBscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWlmICh0eF9zdGF0dXMgJgorCQkJICAgIChUWF9TVEFUVVNfTEFURV9DT0xMIDw8CisJCQkgICAgIFRYX1NUQVRfQ1RMX1NUQVRVU19TSEYpKSBscC0+c3RhdHMuCisJICAgICB0eF93aW5kb3dfZXJyb3JzKys7CisJCQlpZiAodHhfc3RhdHVzICYKKwkJCSAgICAoVFhfU1RBVFVTX0xfQ0FSUiA8PCBUWF9TVEFUX0NUTF9TVEFUVVNfU0hGKSkKKwkJCQkgICAgbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQlpZiAodHhfc3RhdHVzICYKKwkJCSAgICAoVFhfU1RBVFVTX1VOREVSIDw8IFRYX1NUQVRfQ1RMX1NUQVRVU19TSEYpKQorCQkJCSAgICBscC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCWlmICh0eF9zdGF0dXMgJgorCQkJICAgIChUWF9TVEFUVVNfU1FfRVJSIDw8IFRYX1NUQVRfQ1RMX1NUQVRVU19TSEYpKQorCQkJCSAgICBscC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycysrOworCisJCQlscC0+c3RhdHMuY29sbGlzaW9ucyArPQorCQkJICAgIHR4X3N0YXR1cyAmIFRYX1NUQVRVU19UWF9DT0xMX01TSzsKKwkJfQorCisJCS8qIEZyZWUgYnVmZmVyLiAqLworCQkqcFBhY2tldCA9CisJCSAgICBjcHVfdG9fbGUzMihUWFNGX0VNUFRZIDw8IFRYX1NUQVRfQ1RMX09XTkVSX1NIRik7CisKKwkJLyogVXBkYXRlIHBlbmRpbmcgaW5kZXggcG9pbnRlci4gKi8KKwkJbHAtPlBlbmRpbmdUeG1QYWNrZXRJbmRleCsrOworCQlpZiAobHAtPlBlbmRpbmdUeG1QYWNrZXRJbmRleCA+PSBMQU5fU0FBOTczMF9UWE1fUV9TSVpFKSB7CisJCQlscC0+UGVuZGluZ1R4bVBhY2tldEluZGV4ID0gMDsKKwkJCWxwLT5QZW5kaW5nVHhtQnVmZmVySW5kZXggXj0gMTsKKwkJfQorCX0KKworCS8qIE1ha2Ugc3VyZSBBIGFuZCBCIGFyZSBhdmFpbGFibGUgdG8gaGFyZHdhcmUuICovCisJT1VUTChPSzJVU0VfVFhfQSB8IE9LMlVTRV9UWF9CLCAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPk9rMlVzZSk7CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7CisJCS8qIFRoZSB0eCBidWZmZXIgaXMgbm8gbG9uZ2VyIGZ1bGwuICovCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsYW5fc2FhOTczMF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCA9CisJICAgIChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJaW50IGxlbiA9IDA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IDA7CisJdW5zaWduZWQgaW50IHJ4X3N0YXR1czsKKwlpbnQgQnVmZmVySW5kZXg7CisJaW50IFBhY2tldEluZGV4OworCXVuc2lnbmVkIGludCAqcFBhY2tldDsKKwl1bnNpZ25lZCBjaGFyICpwRGF0YTsKKworCWlmIChsYW5fc2FhOTczMF9kZWJ1ZyA+IDUpCisJCXByaW50aygibGFuX3NhYTk3MzBfcnggaW50ZXJydXB0XG4iKTsKKworCS8qIENsZWFyIHJlY2VpdmUgaW50ZXJydXB0cy4gKi8KKwlPVVRMKERNQV9TVEFUVVNfTUFDX1JYX0lOVCB8IERNQV9TVEFUVVNfUlhfSU5UIHwKKwkgICAgIERNQV9TVEFUVVNfUlhfVE9fSU5ULCAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkRtYVN0YXR1cyk7CisKKwkvKiBBZGRyZXNzIG5leHQgcGFja2V0ICovCisJaWYgKGxwLT5OZXh0UmN2VG9Vc2VJc0EpCisJCUJ1ZmZlckluZGV4ID0gMDsKKwllbHNlCisJCUJ1ZmZlckluZGV4ID0gMTsKKwlQYWNrZXRJbmRleCA9IGxwLT5OZXh0UmN2UGFja2V0SW5kZXg7CisJcFBhY2tldCA9ICh1bnNpZ25lZCBpbnQgKikgbHAtPlJjdkJ1ZmZlcltCdWZmZXJJbmRleF1bUGFja2V0SW5kZXhdOworCXJ4X3N0YXR1cyA9IGxlMzJfdG9fY3B1KCpwUGFja2V0KTsKKworCS8qIFByb2Nlc3MgZWFjaCBwYWNrZXQuICovCisJd2hpbGUgKChyeF9zdGF0dXMgJiBSWF9TVEFUX0NUTF9PV05FUl9NU0spID09CisJICAgICAgIChSWFNGX0hXRE9ORSA8PCBSWF9TVEFUX0NUTF9PV05FUl9TSEYpKSB7CisJCS8qIENoZWNrIHRoZSByeCBzdGF0dXMuICovCisJCWlmIChyeF9zdGF0dXMgJiAoUlhfU1RBVFVTX0dPT0QgPDwgUlhfU1RBVF9DVExfU1RBVFVTX1NIRikpIHsKKwkJCS8qIFJlY2VpdmVkIHBhY2tldCBpcyBnb29kLiAqLworCQkJbGVuID0gKHJ4X3N0YXR1cyAmIFJYX1NUQVRfQ1RMX0xFTkdUSF9NU0spID4+CisJCQkgICAgUlhfU1RBVF9DVExfTEVOR1RIX1NIRjsKKworCQkJcERhdGEgPSAodW5zaWduZWQgY2hhciAqKSBwUGFja2V0OworCQkJcERhdGEgKz0gNDsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgMik7CisJCQlpZiAoc2tiID09IDApIHsKKwkJCQlwcmludGsKKwkJCQkgICAgKCIlczogTWVtb3J5IHNxdWVlemUsIGRlZmVycmluZyBwYWNrZXQuXG4iLAorCQkJCSAgICAgZGV2LT5uYW1lKTsKKwkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJfSBlbHNlIHsKKwkJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiAqLworCQkJCXNrYl9wdXQoc2tiLCBsZW4pOwkvKiBtYWtlIHJvb20gKi8KKwkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwKKwkJCQkJCSAodW5zaWduZWQgY2hhciAqKSBwRGF0YSwKKwkJCQkJCSBsZW4sIDApOworCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogV2UgZ290IGFuIGVycm9yIHBhY2tldC4gKi8KKwkJCWlmIChsYW5fc2FhOTczMF9kZWJ1ZyA+IDIpCisJCQkJcHJpbnRrCisJCQkJICAgICgibGFuX3NhYTk3MzBfcng6IFdlIGdvdCBhbiBlcnJvciBwYWNrZXQgPSAleFxuIiwKKwkJCQkgICAgIHJ4X3N0YXR1cyk7CisKKwkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChyeF9zdGF0dXMgJgorCQkJICAgIChSWF9TVEFUVVNfQ1JDX0VSUiA8PCBSWF9TVEFUX0NUTF9TVEFUVVNfU0hGKSkKKwkJCQkgICAgbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChyeF9zdGF0dXMgJgorCQkJICAgIChSWF9TVEFUVVNfQUxJR05fRVJSIDw8CisJCQkgICAgIFJYX1NUQVRfQ1RMX1NUQVRVU19TSEYpKSBscC0+c3RhdHMuCisJICAgICByeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChyeF9zdGF0dXMgJgorCQkJICAgIChSWF9TVEFUVVNfT1ZFUkZMT1cgPDwgUlhfU1RBVF9DVExfU1RBVFVTX1NIRikpCisJCQkJICAgIGxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJaWYgKHJ4X3N0YXR1cyAmCisJCQkgICAgKFJYX1NUQVRVU19MT05HX0VSUiA8PCBSWF9TVEFUX0NUTF9TVEFUVVNfU0hGKSkKKwkJCQkgICAgbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJfQorCisJCS8qIEluZGljYXRlIHdlIGhhdmUgcHJvY2Vzc2VkIHRoZSBidWZmZXIuICovCisJCSpwUGFja2V0ID0KKwkJICAgIGNwdV90b19sZTMyKFJYU0ZfUkVBRFkgPDwgUlhfU1RBVF9DVExfT1dORVJfU0hGKTsKKworCQkvKiBHbyB0byBuZXh0IHBhY2tldCBpbiBzZXF1ZW5jZS4gKi8KKwkJbHAtPk5leHRSY3ZQYWNrZXRJbmRleCsrOworCQlpZiAobHAtPk5leHRSY3ZQYWNrZXRJbmRleCA+PSBMQU5fU0FBOTczMF9SQ1ZfUV9TSVpFKSB7CisJCQlscC0+TmV4dFJjdlBhY2tldEluZGV4ID0gMDsKKwkJCWlmIChCdWZmZXJJbmRleCkgeworCQkJCWxwLT5OZXh0UmN2VG9Vc2VJc0EgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlscC0+TmV4dFJjdlRvVXNlSXNBID0gMDsKKwkJCX0KKwkJfQorCQlPVVRMKE9LMlVTRV9SWF9BIHwgT0syVVNFX1JYX0IsCisJCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5PazJVc2UpOworCisJCS8qIEFkZHJlc3MgbmV4dCBwYWNrZXQgKi8KKwkJaWYgKGxwLT5OZXh0UmN2VG9Vc2VJc0EpCisJCQlCdWZmZXJJbmRleCA9IDA7CisJCWVsc2UKKwkJCUJ1ZmZlckluZGV4ID0gMTsKKwkJUGFja2V0SW5kZXggPSBscC0+TmV4dFJjdlBhY2tldEluZGV4OworCQlwUGFja2V0ID0KKwkJICAgICh1bnNpZ25lZCBpbnQgKikgbHAtPgorCQkgICAgUmN2QnVmZmVyW0J1ZmZlckluZGV4XVtQYWNrZXRJbmRleF07CisJCXJ4X3N0YXR1cyA9IGxlMzJfdG9fY3B1KCpwUGFja2V0KTsKKwl9CisKKwkvKiBNYWtlIHN1cmUgQSBhbmQgQiBhcmUgYXZhaWxhYmxlIHRvIGhhcmR3YXJlLiAqLworCU9VVEwoT0syVVNFX1JYX0EgfCBPSzJVU0VfUlhfQiwgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5PazJVc2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBsYW5fc2FhOTczMF9pbnRlcnJ1cHQoY29uc3QgaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCSAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwID0KKwkgICAgKHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICopIGRldi0+cHJpdjsKKworCWlmIChsYW5fc2FhOTczMF9kZWJ1ZyA+IDUpCisJCXByaW50aygibGFuX3NhYTk3MzBfaW50ZXJydXB0XG4iKTsKKworCS8qIERpc2FibGUgdGhlIEVWTSBMQU4gaW50ZXJydXB0LiAqLworCWV2bV9zYWE5NzMwX2Jsb2NrX2xhbl9pbnQobHApOworCisJLyogQ2xlYXIgdGhlIEVWTSBMQU4gaW50ZXJydXB0LiAqLworCWV2bV9zYWE5NzMwX2NsZWFyX2xhbl9pbnQobHApOworCisJLyogU2VydmljZSBwZW5kaW5nIHRyYW5zbWl0IGludGVycnVwdHMuICovCisJaWYgKElOTCgmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPkRtYVN0YXR1cykgJiBETUFfU1RBVFVTX01BQ19UWF9JTlQpCisJCWxhbl9zYWE5NzMwX3R4KGRldik7CisKKwkvKiBTZXJ2aWNlIHBlbmRpbmcgcmVjZWl2ZSBpbnRlcnJ1cHRzLiAqLworCWlmIChJTkwoJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5EbWFTdGF0dXMpICYKKwkgICAgKERNQV9TVEFUVVNfTUFDX1JYX0lOVCB8IERNQV9TVEFUVVNfUlhfSU5UIHwKKwkgICAgIERNQV9TVEFUVVNfUlhfVE9fSU5UKSkgbGFuX3NhYTk3MzBfcngoZGV2KTsKKworCS8qIEVuYWJsZSB0aGUgRVZNIExBTiBpbnRlcnJ1cHQuICovCisJZXZtX3NhYTk3MzBfdW5ibG9ja19sYW5faW50KGxwKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBsYW5fc2FhOTczMF9vcGVuX2ZhaWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBsYW5fc2FhOTczMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwID0KKwkgICAgKHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICopIGRldi0+cHJpdjsKKworCS8qIEFzc29jaWF0ZSBJUlEgd2l0aCBsYW5fc2FhOTczMF9pbnRlcnJ1cHQgKi8KKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICZsYW5fc2FhOTczMF9pbnRlcnJ1cHQsIDAsICJTQUE5NzMwIEV0aCIsCisJCQlkZXYpKSB7CisJCXByaW50aygibGFuX3NhYTk3MzBfb3BlbjogQ2FuJ3QgZ2V0IGlycSAlZFxuIiwgZGV2LT5pcnEpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwkvKiBFbmFibGUgdGhlIExhbiBpbnRlcnJ1cHQgaW4gdGhlIGV2ZW50IG1hbmFnZXIuICovCisJZXZtX3NhYTk3MzBfZW5hYmxlX2xhbl9pbnQobHApOworCisJLyogU3RhcnQgdGhlIExBTiBjb250cm9sbGVyICovCisJaWYgKGxhbl9zYWE5NzMwX3N0YXJ0KGxwKSkKKwkJcmV0dXJuIC0xOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhbl9zYWE5NzMwX3dyaXRlKHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCwKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHNrYmxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpwYkRhdGEgPSBza2ItPmRhdGE7CisJdW5zaWduZWQgaW50IGxlbiA9IHNrYmxlbjsKKwl1bnNpZ25lZCBjaGFyICpwYlBhY2tldERhdGE7CisJdW5zaWduZWQgaW50IHR4X3N0YXR1czsKKwlpbnQgQnVmZmVySW5kZXg7CisJaW50IFBhY2tldEluZGV4OworCisJaWYgKGxhbl9zYWE5NzMwX2RlYnVnID4gNSkKKwkJcHJpbnRrKCJsYW5fc2FhOTczMF93cml0ZTogc2tiPSUwOHhcbiIsCisJCSAgICAgICAodW5zaWduZWQgaW50KSBza2IpOworCisJQnVmZmVySW5kZXggPSBscC0+TmV4dFR4bUJ1ZmZlckluZGV4OworCVBhY2tldEluZGV4ID0gbHAtPk5leHRUeG1QYWNrZXRJbmRleDsKKworCXR4X3N0YXR1cyA9CisJICAgIGxlMzJfdG9fY3B1KCoodW5zaWduZWQgaW50ICopIGxwLT4KKwkJCVR4bUJ1ZmZlcltCdWZmZXJJbmRleF1bUGFja2V0SW5kZXhdKTsKKwlpZiAoKHR4X3N0YXR1cyAmIFRYX1NUQVRfQ1RMX09XTkVSX01TSykgIT0KKwkgICAgKFRYU0ZfRU1QVFkgPDwgVFhfU1RBVF9DVExfT1dORVJfU0hGKSkgeworCQlpZiAobGFuX3NhYTk3MzBfZGVidWcgPiA0KQorCQkJcHJpbnRrCisJCQkgICAgKCJsYW5fc2FhOTczMF93cml0ZTogVHggYnVmZmVyIG5vdCBhdmFpbGFibGU6IHR4X3N0YXR1cyA9ICV4XG4iLAorCQkJICAgICB0eF9zdGF0dXMpOworCQlyZXR1cm4gLTE7CisJfQorCisJbHAtPk5leHRUeG1QYWNrZXRJbmRleCsrOworCWlmIChscC0+TmV4dFR4bVBhY2tldEluZGV4ID49IExBTl9TQUE5NzMwX1RYTV9RX1NJWkUpIHsKKwkJbHAtPk5leHRUeG1QYWNrZXRJbmRleCA9IDA7CisJCWxwLT5OZXh0VHhtQnVmZmVySW5kZXggXj0gMTsKKwl9CisKKwlwYlBhY2tldERhdGEgPQorCSAgICAodW5zaWduZWQgY2hhciAqKSBscC0+VHhtQnVmZmVyW0J1ZmZlckluZGV4XVtQYWNrZXRJbmRleF07CisJcGJQYWNrZXREYXRhICs9IDQ7CisKKwkvKiBjb3B5IHRoZSBiaXRzICovCisJbWVtY3B5KHBiUGFja2V0RGF0YSwgcGJEYXRhLCBsZW4pOworCisJLyogU2V0IHRyYW5zbWl0IHN0YXR1cyBmb3IgaGFyZHdhcmUgKi8KKwkqKHVuc2lnbmVkIGludCAqKSBscC0+VHhtQnVmZmVyW0J1ZmZlckluZGV4XVtQYWNrZXRJbmRleF0gPQorCSAgICBjcHVfdG9fbGUzMigoVFhTRl9SRUFEWSA8PCBUWF9TVEFUX0NUTF9PV05FUl9TSEYpIHwKKwkJCShUWF9TVEFUX0NUTF9JTlRfQUZURVJfVFggPDwgVFhfU1RBVF9DVExfRlJBTUVfU0hGKQorCQkJfCAobGVuIDw8IFRYX1NUQVRfQ1RMX0xFTkdUSF9TSEYpKTsKKworCS8qIFNldCBoYXJkd2FyZSB0eCBidWZmZXIuICovCisJT1VUTChPSzJVU0VfVFhfQSB8IE9LMlVTRV9UWF9CLCAmbHAtPmxhbl9zYWE5NzMwX3JlZ3MtPk9rMlVzZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbGFuX3NhYTk3MzBfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscCA9CisJICAgIChzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisKKwkvKiBUcmFuc21pdHRlciB0aW1lb3V0LCBzZXJpb3VzIHByb2JsZW1zICovCisJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCXByaW50aygiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgcmVzZXRcbiIsIGRldi0+bmFtZSk7CisJLypzaG93X3NhYTk3MzBfcmVncyhscCk7ICovCisJbGFuX3NhYTk3MzBfcmVzdGFydChscCk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IGxhbl9zYWE5NzMwX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwID0KKwkgICAgKHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBza2JsZW47CisJaW50IGxlbjsKKworCWlmIChsYW5fc2FhOTczMF9kZWJ1ZyA+IDQpCisJCXByaW50aygiU2VuZCBwYWNrZXQ6IHNrYj0lMDh4XG4iLCAodW5zaWduZWQgaW50KSBza2IpOworCisJc2tibGVuID0gc2tiLT5sZW47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCWxlbiA9IChza2JsZW4gPD0gRVRIX1pMRU4pID8gRVRIX1pMRU4gOiBza2JsZW47CisKKwlpZiAobGFuX3NhYTk3MzBfd3JpdGUobHAsIHNrYiwgc2tibGVuKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCQlwcmludGsoIkVycm9yIHdoZW4gd3JpdGluZyBwYWNrZXQgdG8gY29udHJvbGxlcjogc2tiPSUwOHhcbiIsCisJCSAgICAgKHVuc2lnbmVkIGludCkgc2tiKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlyZXR1cm4gLTE7CisJfQorCisJbHAtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKwlscC0+c3RhdHMudHhfcGFja2V0cysrOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGFuX3NhYTk3MzBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuX3NhYTk3MzBfcHJpdmF0ZSAqbHAgPQorCSAgICAoc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKikgZGV2LT5wcml2OworCisJaWYgKGxhbl9zYWE5NzMwX2RlYnVnID4gMSkKKwkJcHJpbnRrKCJsYW5fc2FhOTczMF9jbG9zZTpcbiIpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogRGlzYWJsZSB0aGUgTGFuIGludGVycnVwdCBpbiB0aGUgZXZlbnQgbWFuYWdlci4gKi8KKwlldm1fc2FhOTczMF9kaXNhYmxlX2xhbl9pbnQobHApOworCisJLyogU3RvcCB0aGUgY29udHJvbGxlciAqLworCWlmIChsYW5fc2FhOTczMF9zdG9wKGxwKSkKKwkJcmV0dXJuIC0xOworCisJZnJlZV9pcnEoZGV2LT5pcnEsICh2b2lkICopIGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpsYW5fc2FhOTczMF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UKKwkJCQkJCSAgICAgICpkZXYpCit7CisJc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwID0KKwkgICAgKHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICopIGRldi0+cHJpdjsKKworCXJldHVybiAmbHAtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCBsYW5fc2FhOTczMF9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgKmxwID0KKwkgICAgKHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICopIGRldi0+cHJpdjsKKworCS8qIFN0b3AgdGhlIGNvbnRyb2xsZXIgKi8KKwlsYW5fc2FhOTczMF9zdG9wKGxwKTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJLyogYWNjZXB0IGFsbCBwYWNrZXRzICovCisJCU9VVEwoQ0FNX0NPTlRST0xfQ09NUF9FTiB8IENBTV9DT05UUk9MX1NUQVRJT05fQUNDIHwKKwkJICAgICBDQU1fQ09OVFJPTF9HUk9VUF9BQ0MgfCBDQU1fQ09OVFJPTF9CUk9BRF9BQ0MsCisJCSAgICAgJmxwLT5sYW5fc2FhOTczMF9yZWdzLT5DYW1DdGwpOworCX0gZWxzZSB7CisJCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCQkvKiBhY2NlcHQgYWxsIG11bHRpY2FzdCBwYWNrZXRzICovCisJCQlPVVRMKENBTV9DT05UUk9MX0NPTVBfRU4gfCBDQU1fQ09OVFJPTF9HUk9VUF9BQ0MgfAorCQkJICAgICBDQU1fQ09OVFJPTF9CUk9BRF9BQ0MsCisJCQkgICAgICZscC0+bGFuX3NhYTk3MzBfcmVncy0+Q2FtQ3RsKTsKKwkJfSBlbHNlIHsKKwkJCS8qIAorCQkJICogV2lsbCBoYW5kbGUgdGhlIG11bHRpY2FzdCBzdHVmZiBsYXRlci4gLWNhcnN0ZW5sCisJCQkgKi8KKwkJfQorCX0KKworCWxhbl9zYWE5NzMwX3Jlc3RhcnQobHApOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzYWE5NzMwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKyAgICAgICAgaWYgKGRldikgeworICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwkJaWYgKGRldi0+cHJpdikKKwkJCWtmcmVlKGRldi0+cHJpdik7CisKKyAgICAgICAgICAgICAgICBmcmVlX25ldGRldihkZXYpOworICAgICAgICAgICAgICAgIHBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisgICAgICAgICAgICAgICAgcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworICAgICAgICAgICAgICAgIHBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKyAgICAgICAgfQorfQorCisKK3N0YXRpYyBpbnQgbGFuX3NhYTk3MzBfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyLCBpbnQgaXJxKQoreworCXN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICpscDsKKwl1bnNpZ25lZCBjaGFyIGV0aGVybmV0X2FkZHJbNl07CisJaW50IHJldCA9IDA7CisKKwlkZXYtPm9wZW4gPSBsYW5fc2FhOTczMF9vcGVuX2ZhaWw7CisKKwlpZiAoZ2V0X2V0aGVybmV0X2FkZHIoZXRoZXJuZXRfYWRkcikpCisJCXJldHVybiAtRU5PREVWOworCQorCW1lbWNweShkZXYtPmRldl9hZGRyLCBldGhlcm5ldF9hZGRyLCA2KTsKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwlkZXYtPmlycSA9IGlycTsKKwkKKwkvKiAKKwkgKiBNYWtlIGNlcnRhaW4gdGhlIGRhdGEgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBjb250cm9sbGVyIGFyZSBhbGlnbmVkIAorCSAqIGFuZCBETUFibGUuIAorCSAqLworCS8qCisJICogIFhYWDogdGhhdCBpcyBvYnZpb3VzbHkgYnJva2VuIC0ga2ZyZWUoKSB3b24ndCBiZSBoYXBweSB3aXRoIHVzLgorCSAqLworCWxwID0gKHN0cnVjdCBsYW5fc2FhOTczMF9wcml2YXRlICopICgoKHVuc2lnbmVkIGxvbmcpCisJCQkJCSAgICAgIGttYWxsb2Moc2l6ZW9mKCpscCkgKyA3LAorCQkJCQkJICAgICAgR0ZQX0RNQSB8IEdGUF9LRVJORUwpCisJCQkJCSAgICAgICsgNykgJiB+Nyk7CisKKwlpZiAoIWxwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldi0+cHJpdiA9IGxwOworCW1lbXNldChscCwgMCwgc2l6ZW9mKCpscCkpOworCisJLyogU2V0IFNBQTk3MzAgTEFOIGJhc2UgYWRkcmVzcy4gKi8KKwlscC0+bGFuX3NhYTk3MzBfcmVncyA9ICh0X2xhbl9zYWE5NzMwX3JlZ21hcCAqKSAoaW9hZGRyICsKKwkJCQkJCQkgU0FBOTczMF9MQU5fUkVHU19BRERSKTsKKworCS8qIFNldCBTQUE5NzMwIEVWTSBiYXNlIGFkZHJlc3MuICovCisJbHAtPmV2bV9zYWE5NzMwX3JlZ3MgPSAodF9ldm1fc2FhOTczMF9yZWdtYXAgKikgKGlvYWRkciArCisJCQkJCQkJIFNBQTk3MzBfRVZNX1JFR1NfQUREUik7CisKKwkvKiBBbGxvY2F0ZSBMQU4gUlgvVFggZnJhbWUgYnVmZmVyIHNwYWNlLiAqLworCS8qIEZJWE1FOiBhIGxlYWsgKi8KKwlpZiAoKHJldCA9IGxhbl9zYWE5NzMwX2FsbG9jYXRlX2J1ZmZlcnMobHApKSkKKwkJZ290byBvdXQ7CisKKwkvKiBTdG9wIExBTiBjb250cm9sbGVyLiAqLworCWlmICgocmV0ID0gbGFuX3NhYTk3MzBfc3RvcChscCkpKSAKKwkJZ290byBvdXQ7CisJCisJLyogSW5pdGlhbGl6ZSBDQU0gcmVnaXN0ZXJzLiAqLworCWlmICgocmV0ID0gbGFuX3NhYTk3MzBfY2FtX2luaXQoZGV2KSkpCisJCWdvdG8gb3V0OworCisJLyogSW5pdGlhbGl6ZSBNSUkgcmVnaXN0ZXJzLiAqLworCWlmICgocmV0ID0gbGFuX3NhYTk3MzBfbWlpX2luaXQobHApKSkKKwkJZ290byBvdXQ7CisKKwkvKiBJbml0aWFsaXplIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworCWlmICgocmV0ID0gbGFuX3NhYTk3MzBfY29udHJvbF9pbml0KGxwKSkpIAorCQlnb3RvIG91dDsKKyAgICAgICAgCisJLyogTG9hZCBDQU0gcmVnaXN0ZXJzLiAqLworCWlmICgocmV0ID0gbGFuX3NhYTk3MzBfY2FtX2xvYWQobHApKSkgCisJCWdvdG8gb3V0OworCQorCS8qIEluaXRpYWxpemUgRE1BIGNvbnRleHQgcmVnaXN0ZXJzLiAqLworCWlmICgocmV0ID0gbGFuX3NhYTk3MzBfZG1hX2luaXQobHApKSkKKwkJZ290byBvdXQ7CisJCisJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKwkJCisJZGV2LT5vcGVuID0gbGFuX3NhYTk3MzBfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGxhbl9zYWE5NzMwX3N0YXJ0X3htaXQ7CisJZGV2LT5zdG9wID0gbGFuX3NhYTk3MzBfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSBsYW5fc2FhOTczMF9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBsYW5fc2FhOTczMF9zZXRfbXVsdGljYXN0OworCWRldi0+dHhfdGltZW91dCA9IGxhbl9zYWE5NzMwX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IChIWiA+PiAxKTsKKwlkZXYtPmRtYSA9IDA7CisJCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisJcmV0dXJuIDA7CisKKyBvdXQ6CisJaWYgKGRldi0+cHJpdikKKwkJa2ZyZWUoZGV2LT5wcml2KTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNhYTk3MzBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBpbnQgcGNpX2lvYWRkcjsKKwlpbnQgZXJyOworCisJaWYgKGxhbl9zYWE5NzMwX2RlYnVnID4gMSkKKwkJcHJpbnRrKCJzYWE5NzMwLmM6IFBDSSBiaW9zIGlzIHByZXNlbnQsIGNoZWNraW5nIGZvciBkZXZpY2VzLi4uXG4iKTsKKworCWVyciA9IC1FTk9NRU07CisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoMCk7CisJaWYgKCFkZXYpCisJCWdvdG8gb3V0OworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkNhbm5vdCBlbmFibGUgUENJIGRldmljZSwgYWJvcnRpbmcuXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDE7CisgICAgICAgIH0KKworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX01PRFVMRV9OQU1FKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2Fubm90IG9idGFpbiBQQ0kgcmVzb3VyY2VzLCBhYm9ydGluZy5cbiIpOworCQlnb3RvIG91dDI7CisJfQorCisJcGNpX2lycV9saW5lID0gcGRldi0+aXJxOworCS8qIExBTiBiYXNlIGFkZHJlc3MgaW4gbG9jYXRlZCBhdCBCQVIgMS4gKi8KKworCXBjaV9pb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlwcmludGsoIkZvdW5kIFNBQTk3MzAgKFBDSSkgYXQgJSN4LCBpcnEgJWQuXG4iLAorCSAgICAgICBwY2lfaW9hZGRyLCBwY2lfaXJxX2xpbmUpOworCisJZXJyID0gbGFuX3NhYTk3MzBfaW5pdChkZXYsIHBjaV9pb2FkZHIsIHBjaV9pcnFfbGluZSk7CisJaWYgKGVycikgeworCQlwcmludGsoIkxhbiBpbml0IGZhaWxlZCIpOworCQlnb3RvIG91dDI7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKwlyZXR1cm4gMDsKKwkKK291dDI6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworb3V0MToKKwlmcmVlX25ldGRldihkZXYpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNhYTk3MzBfZHJpdmVyID0geworCS5uYW1lICAgICAgICAgICA9IERSVl9NT0RVTEVfTkFNRSwKKwkuaWRfdGFibGUgICAgICAgPSBzYWE5NzMwX3BjaV90YmwsCisJLnByb2JlICAgICAgICAgID0gc2FhOTczMF9pbml0X29uZSwKKwkucmVtb3ZlICAgICAgICAgPSBfX2RldmV4aXRfcChzYWE5NzMwX3JlbW92ZV9vbmUpLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBzYWE5NzMwX2luaXQodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmc2FhOTczMF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2FhOTczMF9jbGVhbnVwKHZvaWQpCit7CisgICAgICAgIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc2FhOTczMF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzYWE5NzMwX2luaXQpOworbW9kdWxlX2V4aXQoc2FhOTczMF9jbGVhbnVwKTsKKworCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NhYTk3MzAuaCBiL2RyaXZlcnMvbmV0L3NhYTk3MzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTlkYTZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2FhOTczMC5oCkBAIC0wLDAgKzEsMzcxIEBACisvKgorICogQ2Fyc3RlbiBMYW5nZ2FhcmQsIGNhcnN0ZW5sQG1pcHMuY29tCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIGRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKFZlcnNpb24gMikgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgKgorICogU0FBOTczMCBldGhlcm5ldCBkcml2ZXIgZGVzY3JpcHRpb24uCisgKgorICovCisjaWZuZGVmIF9TQUE5NzMwX0gKKyNkZWZpbmUgX1NBQTk3MzBfSAorCisKKy8qIE51bWJlciBvZiA2LWJ5dGUgZW50cmllcyBpbiB0aGUgQ0FNLiAqLworI2RlZmluZSBMQU5fU0FBOTczMF9DQU1fRU5UUklFUyAgICAgICAgICAgICAgMTAKKyNkZWZpbmUJTEFOX1NBQTk3MzBfQ0FNX0RXT1JEUyAgICAgICAgICAgICAgICgoTEFOX1NBQTk3MzBfQ0FNX0VOVFJJRVMqNikvNCkKKworLyogVFggYW5kIFJYIHBhY2tldCBzaXplOiBmaXhlZCB0byAyMDQ4IGJ5dGVzLCBhY2NvcmRpbmcgdG8gSFcgcmVxdWlyZW1lbnRzLiAqLworI2RlZmluZSBMQU5fU0FBOTczMF9QQUNLRVRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgMjA0OAorCisvKiAKKyAqIE51bWJlciBvZiBUWCBidWZmZXJzID0gbnVtYmVyIG9mIFJYIGJ1ZmZlcnMgPSAyLCB3aGljaCBpcyBmaXhlZCBhY2NvcmRpbmcgCisgKiB0byBIVyByZXF1aXJlbWVudHMuIAorICovCisjZGVmaW5lIExBTl9TQUE5NzMwX0JVRkZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisKKy8qIE51bWJlciBvZiBSWCBwYWNrZXRzIHBlciBSWCBidWZmZXIuICovCisjZGVmaW5lIExBTl9TQUE5NzMwX1JDVl9RX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBOdW1iZXIgb2YgVFggcGFja2V0cyBwZXIgVFggYnVmZmVyLiAqLworI2RlZmluZSBMQU5fU0FBOTczMF9UWE1fUV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyoKKyAqIFdlIGdldCBhbiBpbnRlcnJ1cHQgZm9yIGVhY2ggTEFOX1NBQTk3MzBfREVGQVVMVF9SQ1ZfUV9JTlRfVEhSRVNIT0xEIAorICogcGFja2V0cyByZWNlaXZlZC4gCisgKiBJZiBob3dldmVyIHdlIHJlY2VpdmUgbGVzcyB0aGFuICBMQU5fU0FBOTczMF9ERUZBVUxUX1JDVl9RX0lOVF9USFJFU0hPTEQKKyAqIHBhY2tldHMsIHRoZSBoYXJkd2FyZSBjYW4gdGltZW91dCBhZnRlciBhIGNlcnRhaW4gdGltZSBhbmQgc3RpbGwgdGVsbCAKKyAqIHVzIHBhY2tldHMgaGF2ZSBhcnJpdmVkLgorICogVGhlIHRpbWVvdXQgdmFsdWUgaW4gdW5pdCBvZiAzMiBQQ0kgY2xvY2tzICgzM01oeikuCisgKiBUaGUgdmFsdWUgMjAwIGFwcHJveGltYXRlcyAwLjAwMDIgc2Vjb25kcy4KKyAqLworI2RlZmluZSBMQU5fU0FBOTczMF9SQ1ZfUV9JTlRfVEhSRVNIT0xEICAgICAgICAgICAgICAgMQorI2RlZmluZSBMQU5fU0FBOTczMF9ERUZBVUxUX1RJTUVfT1VUX0NOVCAgICAgICAgICAgICAgMTAKKworI2RlZmluZSBSWFNGX05ESVMgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUlhTRl9SRUFEWSAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFJYU0ZfSFdET05FICAgICAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIFRYU0ZfRU1QVFkgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBUWFNGX1JFQURZICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgVFhTRl9IV0RPTkUgICAgICAgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgTEFORU5EX0xJVFRMRSAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIExBTkVORF9CSUdfMjE0MyAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBMQU5FTkRfQklHXzQzMjEgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBMQU5NQl9BTlkgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTEFOTUJfOCAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIExBTk1CXzMyICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBMQU5NQl82NCAgICAgICAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBNQUNDTV9BVVRPTUFUSUMgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUFDQ01fMTBNQiAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1BQ0NNX01JSSAgICAgICAgICAgICAgICAgICAgICAgMgorCisvKiAKKyAqIFBIWSBkZWZpbml0aW9ucyBmb3IgQmFzaWMgcmVnaXN0ZXJzIG9mIFFTNjYxMiAodXNlZCBvbiBNSVBTIEFUTEFTIGJvYXJkKSAKKyAqLworI2RlZmluZSBQSFlfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBQSFlfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBQSFlfU1RBVFVTX0xJTktfVVAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBQSFlfQ09OVFJPTF9SRVNFVCAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBQSFlfQ09OVFJPTF9BVVRPX05FRyAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBQSFlfQ09OVFJPTF9SRVNUQVJUX0FVVE9fTkVHICAgIDB4MDIwMAorI2RlZmluZSBQSFlfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgIDB4MAorCisvKiBQS19DT1VOVCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgUEtfQ09VTlRfVFhfQV9TSEYgICAgICAgICAgICAgICAyNAorI2RlZmluZSBQS19DT1VOVF9UWF9BX01TSyAgICAgICAgICAgICAgICgweGZmIDw8IFBLX0NPVU5UX1RYX0FfU0hGKQorI2RlZmluZSBQS19DT1VOVF9UWF9CX1NIRiAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFBLX0NPVU5UX1RYX0JfTVNLICAgICAgICAgICAgICAgKDB4ZmYgPDwgUEtfQ09VTlRfVFhfQl9TSEYpCisjZGVmaW5lIFBLX0NPVU5UX1JYX0FfU0hGICAgICAgICAgICAgICAgOAorI2RlZmluZSBQS19DT1VOVF9SWF9BX01TSyAgICAgICAgICAgICAgICgweGZmIDw8IFBLX0NPVU5UX1JYX0FfU0hGKQorI2RlZmluZSBQS19DT1VOVF9SWF9CX1NIRiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEtfQ09VTlRfUlhfQl9NU0sgICAgICAgICAgICAgICAoMHhmZiA8PCBQS19DT1VOVF9SWF9CX1NIRikKKworLyogT0syVVNFIHJlZ2lzdGVyLiAqLworI2RlZmluZSBPSzJVU0VfVFhfQSAgICAgICAgICAgICAgICAgICAgIDB4OAorI2RlZmluZSBPSzJVU0VfVFhfQiAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSBPSzJVU0VfUlhfQSAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBPSzJVU0VfUlhfQiAgICAgICAgICAgICAgICAgICAgIDB4MQorCisvKiBMQU4gRE1BIENPTlRST0wgcmVnaXN0ZXIuICovCisjZGVmaW5lIERNQV9DVExfQkxLX0lOVCAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBETUFfQ1RMX01BWF9YRkVSX1NIRiAgICAgICAgICAgIDE4CisjZGVmaW5lIERNQV9DVExfTUFYX1hGRVJfTVNLICAgICAgICAgICAgKDB4MyA8PCBMQU5fRE1BX0NUTF9NQVhfWEZFUl9TSEYpCisjZGVmaW5lIERNQV9DVExfRU5ESUFOX1NIRiAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgRE1BX0NUTF9FTkRJQU5fTVNLICAgICAgICAgICAgICAoMHgzIDw8IExBTl9ETUFfQ1RMX0VORElBTl9TSEYpCisjZGVmaW5lIERNQV9DVExfUlhfSU5UX0NPVU5UX1NIRiAgICAgICAgOAorI2RlZmluZSBETUFfQ1RMX1JYX0lOVF9DT1VOVF9NU0sgICAgICAgICgweGZmIDw8IExBTl9ETUFfQ1RMX1JYX0lOVF9DT1VOVF9TSEYpCisjZGVmaW5lIERNQV9DVExfRU5fVFhfRE1BICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBETUFfQ1RMX0VOX1JYX0RNQSAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRE1BX0NUTF9SWF9JTlRfQlVGRlVMX0VOICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIERNQV9DVExfUlhfSU5UX1RPX0VOICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBETUFfQ1RMX1JYX0lOVF9FTiAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRE1BX0NUTF9UWF9JTlRfRU4gICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIERNQV9DVExfTUFDX1RYX0lOVF9FTiAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBETUFfQ1RMX01BQ19SWF9JTlRfRU4gICAgICAgICAgIDB4MDAwMDAwMDEKKworLyogRE1BIFNUQVRVUyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgRE1BX1NUQVRVU19CQURfQUREUl9TSEYgICAgICAgICAxNgorI2RlZmluZSBETUFfU1RBVFVTX0JBRF9BRERSX01TSyAgICAgICAgICgweGYgPDwgRE1BX1NUQVRVU19CQURfQUREUl9TSEYpCisjZGVmaW5lIERNQV9TVEFUVVNfUlhfUEtUU19SRUNFSVZFRF9TSEYgOAorI2RlZmluZSBETUFfU1RBVFVTX1JYX1BLVFNfUkVDRUlWRURfTVNLICgweGZmIDw8IERNQV9TVEFUVVNfUlhfUEtUU19SRUNFSVZFRF9TSEYpCisjZGVmaW5lIERNQV9TVEFUVVNfVFhfRU5fU1lOQyAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBETUFfU1RBVFVTX1JYX0JVRl9BX0ZVTCAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRE1BX1NUQVRVU19SWF9CVUZfQl9GVUwgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIERNQV9TVEFUVVNfUlhfVE9fSU5UICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBETUFfU1RBVFVTX1JYX0lOVCAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRE1BX1NUQVRVU19UWF9JTlQgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIERNQV9TVEFUVVNfTUFDX1RYX0lOVCAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBETUFfU1RBVFVTX01BQ19SWF9JTlQgICAgICAgICAgIDB4MDAwMDAwMDEKKworLyogRE1BIFRFU1QvUEFOSUMgU1dJVEhFUyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgRE1BX1RFU1RfTE9PUEJBQ0sgICAgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIERNQV9URVNUX1NXX1JFU0VUICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorCisvKiBNQUMgQ09OVFJPTCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUFDX0NPTlRST0xfRU5fTUlTU19ST0xMICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIE1BQ19DT05UUk9MX01JU1NfUk9MTCAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBNQUNfQ09OVFJPTF9MT09QMTAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgTUFDX0NPTlRST0xfQ09OTl9TSEYgICAgICAgICAgICA1CisjZGVmaW5lIE1BQ19DT05UUk9MX0NPTk5fTVNLICAgICAgICAgICAgKDB4MyA8PCBNQUNfQ09OVFJPTF9DT05OX1NIRikKKyNkZWZpbmUgTUFDX0NPTlRST0xfTUFDX0xPT1AgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIE1BQ19DT05UUk9MX0ZVTExfRFVQICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBNQUNfQ09OVFJPTF9SRVNFVCAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgTUFDX0NPTlRST0xfSEFMVF9JTU0gICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIE1BQ19DT05UUk9MX0hBTFRfUkVRICAgICAgICAgICAgMHgwMDAwMDAwMQorCisvKiBDQU0gQ09OVFJPTCByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQ0FNX0NPTlRST0xfQ09NUF9FTiAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIENBTV9DT05UUk9MX05FR19DQU0gICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBDQU1fQ09OVFJPTF9CUk9BRF9BQ0MgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQ0FNX0NPTlRST0xfR1JPVVBfQUNDICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIENBTV9DT05UUk9MX1NUQVRJT05fQUNDICAgICAgICAgMHgwMDAwMDAwMQorCisvKiBUUkFOU01JVCBDT05UUk9MIHJlZ2lzdGVyLiAqLworI2RlZmluZSBUWF9DVExfRU5fQ09NUCAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgVFhfQ1RMX0VOX1RYX1BBUiAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIFRYX0NUTF9FTl9MQVRFX0NPTEwgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBUWF9DVExfRU5fRVhfQ09MTCAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgVFhfQ1RMX0VOX0xfQ0FSUiAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFRYX0NUTF9FTl9FWF9ERUZFUiAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBUWF9DVExfRU5fVU5ERVIgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgVFhfQ1RMX01JSTEwICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIFRYX0NUTF9TRF9QQVVTRSAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBUWF9DVExfTk9fRVhfREVGMCAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgVFhfQ1RMX0ZfQkFDSyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIFRYX0NUTF9OT19DUkMgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBUWF9DVExfTk9fUEFEICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgVFhfQ1RMX1RYX0hBTFQgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFRYX0NUTF9UWF9FTiAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorCisvKiBUUkFOU01JVCBTVEFUVVMgcmVnaXN0ZXIuICovCisjZGVmaW5lIFRYX1NUQVRVU19TUV9FUlIgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBUWF9TVEFUVVNfVFhfSEFMVEVEICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgVFhfU1RBVFVTX0NPTVAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIFRYX1NUQVRVU19UWF9QQVIgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBUWF9TVEFUVVNfTEFURV9DT0xMICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgVFhfU1RBVFVTX1RYMTBfU1RBVCAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIFRYX1NUQVRVU19MX0NBUlIgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBUWF9TVEFUVVNfRVhfREVGRVIgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgVFhfU1RBVFVTX1VOREVSICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIFRYX1NUQVRVU19JTl9UWCAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBUWF9TVEFUVVNfUEFVU0VEICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgVFhfU1RBVFVTX1RYX0RFRkVSUkVEICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFRYX1NUQVRVU19FWF9DT0xMICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBUWF9TVEFUVVNfVFhfQ09MTF9TSEYgICAgICAgICAgIDAKKyNkZWZpbmUgVFhfU1RBVFVTX1RYX0NPTExfTVNLICAgICAgICAgICAoMHhmIDw8IFRYX1NUQVRVU19UWF9DT0xMX1NIRikKKworLyogUkVDRUlWRSBDT05UUk9MIHJlZ2lzdGVyLiAqLworI2RlZmluZSBSWF9DVExfRU5fR09PRCAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgUlhfQ1RMX0VOX1JYX1BBUiAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIFJYX0NUTF9FTl9MT05HX0VSUiAgICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBSWF9DVExfRU5fT1ZFUiAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgUlhfQ1RMX0VOX0NSQ19FUlIgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFJYX0NUTF9FTl9BTElHTiAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBSWF9DVExfSUdOT1JFX0NSQyAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgUlhfQ1RMX1BBU1NfQ1RMICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFJYX0NUTF9TVFJJUF9DUkMgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBSWF9DVExfU0hPUlRfRU4gICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgUlhfQ1RMX0xPTkdfRU4gICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFJYX0NUTF9SWF9IQUxUICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBSWF9DVExfUlhfRU4gICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKworLyogUkVDRUlWRSBTVEFUVVMgcmVnaXN0ZXIuICovCisjZGVmaW5lIFJYX1NUQVRVU19SWF9IQUxURUQgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBSWF9TVEFUVVNfR09PRCAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgUlhfU1RBVFVTX1JYX1BBUiAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIFJYX1NUQVRVU19MT05HX0VSUiAgICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBSWF9TVEFUVVNfT1ZFUkZMT1cgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgUlhfU1RBVFVTX0NSQ19FUlIgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFJYX1NUQVRVU19BTElHTl9FUlIgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBSWF9TVEFUVVNfUlgxMF9TVEFUICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgUlhfU1RBVFVTX0lOVF9SWCAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFJYX1NUQVRVU19DVExfUkVDRCAgICAgICAgICAgICAgMHgwMDAwMDAyMAorCisvKiBNRF9DQSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTURfQ0FfUFJFX1NVUCAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIE1EX0NBX0JVU1kgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBNRF9DQV9XUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgTURfQ0FfUEhZX1NIRiAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIE1EX0NBX1BIWV9NU0sgICAgICAgICAgICAgICAgICAgKDB4MWYgPDwgTURfQ0FfUEhZX1NIRikKKyNkZWZpbmUgTURfQ0FfQUREUl9TSEYgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1EX0NBX0FERFJfTVNLICAgICAgICAgICAgICAgICAgKDB4MWYgPDwgTURfQ0FfQUREUl9TSEYpCisKKy8qIFR4IFN0YXR1cy9Db250cm9sLiAqLworI2RlZmluZSBUWF9TVEFUX0NUTF9PV05FUl9TSEYgICAgICAgICAgIDMwCisjZGVmaW5lIFRYX1NUQVRfQ1RMX09XTkVSX01TSyAgICAgICAgICAgKDB4MyA8PCBUWF9TVEFUX0NUTF9PV05FUl9TSEYpCisjZGVmaW5lIFRYX1NUQVRfQ1RMX0ZSQU1FX1NIRiAgICAgICAgICAgMjcKKyNkZWZpbmUgVFhfU1RBVF9DVExfRlJBTUVfTVNLICAgICAgICAgICAoMHg3IDw8IFRYX1NUQVRfQ1RMX0ZSQU1FX1NIRikKKyNkZWZpbmUgVFhfU1RBVF9DVExfU1RBVFVTX1NIRiAgICAgICAgICAxMQorI2RlZmluZSBUWF9TVEFUX0NUTF9TVEFUVVNfTVNLICAgICAgICAgICgweDFmZmZmIDw8IFRYX1NUQVRfQ1RMX1NUQVRVU19TSEYpCisjZGVmaW5lIFRYX1NUQVRfQ1RMX0xFTkdUSF9TSEYgICAgICAgICAgMAorI2RlZmluZSBUWF9TVEFUX0NUTF9MRU5HVEhfTVNLICAgICAgICAgICgweDdmZiA8PCBUWF9TVEFUX0NUTF9MRU5HVEhfU0hGKQorCisjZGVmaW5lIFRYX1NUQVRfQ1RMX0VSUk9SX01TSyAgICAgICAgICAgKChUWF9TVEFUVVNfU1FfRVJSICAgICAgfCAgICAgXAorCQkJCQkgIFRYX1NUQVRVU19UWF9IQUxURUQgICB8ICAgICBcCisJCQkJCSAgVFhfU1RBVFVTX1RYX1BBUiAgICAgIHwgICAgIFwKKwkJCQkJICBUWF9TVEFUVVNfTEFURV9DT0xMICAgfCAgICAgXAorCQkJCQkgIFRYX1NUQVRVU19MX0NBUlIgICAgICB8ICAgICBcCisJCQkJCSAgVFhfU1RBVFVTX0VYX0RFRkVSICAgIHwgICAgIFwKKwkJCQkJICBUWF9TVEFUVVNfVU5ERVIgICAgICAgfCAgICAgXAorCQkJCQkgIFRYX1NUQVRVU19QQVVTRUQgICAgICB8ICAgICBcCisJCQkJCSAgVFhfU1RBVFVTX1RYX0RFRkVSUkVEIHwgICAgIFwKKwkJCQkJICBUWF9TVEFUVVNfRVhfQ09MTCAgICAgfCAgICAgXAorCQkJCQkgIFRYX1NUQVRVU19UWF9DT0xMX01TSykgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgVFhfU1RBVF9DVExfU1RBVFVTX1NIRikKKyNkZWZpbmUgVFhfU1RBVF9DVExfSU5UX0FGVEVSX1RYICAgICAgICAweDQKKworLyogUnggU3RhdHVzL0NvbnRyb2wuICovCisjZGVmaW5lIFJYX1NUQVRfQ1RMX09XTkVSX1NIRiAgICAgICAgICAgMzAKKyNkZWZpbmUgUlhfU1RBVF9DVExfT1dORVJfTVNLICAgICAgICAgICAoMHgzIDw8IFJYX1NUQVRfQ1RMX09XTkVSX1NIRikKKyNkZWZpbmUgUlhfU1RBVF9DVExfU1RBVFVTX1NIRiAgICAgICAgICAxMQorI2RlZmluZSBSWF9TVEFUX0NUTF9TVEFUVVNfTVNLICAgICAgICAgICgweGZmZmYgPDwgUlhfU1RBVF9DVExfU1RBVFVTX1NIRikKKyNkZWZpbmUgUlhfU1RBVF9DVExfTEVOR1RIX1NIRiAgICAgICAgICAwCisjZGVmaW5lIFJYX1NUQVRfQ1RMX0xFTkdUSF9NU0sgICAgICAgICAgKDB4N2ZmIDw8IFJYX1NUQVRfQ1RMX0xFTkdUSF9TSEYpCisKKworCisvKiBUaGUgU0FBOTczMCAoTEFOKSBjb250cm9sbGVyIHJlZ2lzdGVyIG1hcCwgYXMgc2VlbiB2aWEgdGhlIFBDSS1idXMuICovCisjZGVmaW5lIFNBQTk3MzBfTEFOX1JFR1NfQUREUiAgIDB4MjA0MDAKKworc3RydWN0IGxhbl9zYWE5NzMwX3JlZ21hcCB7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IFR4QnVmZkE7CQkJLyogMHgyMDQwMCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBUeEJ1ZmZCOwkJCS8qIDB4MjA0MDQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgUnhCdWZmQTsJCQkvKiAweDIwNDA4ICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IFJ4QnVmZkI7CQkJLyogMHgyMDQwYyAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBQYWNrZXRDb3VudDsJCS8qIDB4MjA0MTAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgT2syVXNlOwkJCS8qIDB4MjA0MTQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgTGFuRG1hQ3RsOwkJLyogMHgyMDQxOCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBUaW1lb3V0OwkJCS8qIDB4MjA0MWMgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgRG1hU3RhdHVzOwkJLyogMHgyMDQyMCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBEbWFUZXN0OwkJCS8qIDB4MjA0MjQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGZpbGxlcjIwNDI4WzB4MjA0MzAgLSAweDIwNDI4XTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgUGF1c2VDb3VudDsJCS8qIDB4MjA0MzAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgUmVtb3RlUGF1c2VDb3VudDsJCS8qIDB4MjA0MzQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIGZpbGxlcjIwNDM4WzB4MjA0NDAgLSAweDIwNDM4XTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgTWFjQ3RsOwkJCS8qIDB4MjA0NDAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgQ2FtQ3RsOwkJCS8qIDB4MjA0NDQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgVHhDdGw7CQkJLyogMHgyMDQ0OCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBUeFN0YXR1czsJCQkvKiAweDIwNDRjICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IFJ4Q3RsOwkJCS8qIDB4MjA0NTAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgUnhTdGF0dXM7CQkJLyogMHgyMDQ1NCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBTdGF0aW9uTWdtdERhdGE7CQkvKiAweDIwNDU4ICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IFN0YXRpb25NZ210Q3RsOwkJLyogMHgyMDQ1YyAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBDYW1BZGRyZXNzOwkJLyogMHgyMDQ2MCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBDYW1EYXRhOwkJCS8qIDB4MjA0NjQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgQ2FtRW5hYmxlOwkJLyogMHgyMDQ2OCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZmlsbGVyMjA0NmNbMHgyMDUwMCAtIDB4MjA0NmNdOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBEZWJ1Z1BDSU1hc3RlckFkZHI7CS8qIDB4MjA1MDAgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgRGVidWdMYW5UeFN0YXRlTWFjaGluZTsJLyogMHgyMDUwNCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBEZWJ1Z0xhblJ4U3RhdGVNYWNoaW5lOwkvKiAweDIwNTA4ICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IERlYnVnTGFuVHhGaWZvUG9pbnRlcnM7CS8qIDB4MjA1MGMgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgRGVidWdMYW5SeEZpZm9Qb2ludGVyczsJLyogMHgyMDUxMCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBEZWJ1Z0xhbkN0bFN0YXRlTWFjaGluZTsJLyogMHgyMDUxNCAqLworfTsKK3R5cGVkZWYgdm9sYXRpbGUgc3RydWN0IGxhbl9zYWE5NzMwX3JlZ21hcCB0X2xhbl9zYWE5NzMwX3JlZ21hcDsKKworCisvKiBFVk0gaW50ZXJydXB0IGNvbnRyb2wgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBFVk1fTEFOX0lOVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgRVZNX01BU1RFUl9FTiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisKKy8qIFRoZSBTQUE5NzMwIChFVk0pIGNvbnRyb2xsZXIgcmVnaXN0ZXIgbWFwLCBhcyBzZWVuIHZpYSB0aGUgUENJLWJ1cy4gKi8KKyNkZWZpbmUgU0FBOTczMF9FVk1fUkVHU19BRERSICAgMHgwMjAwMAorCitzdHJ1Y3QgZXZtX3NhYTk3MzBfcmVnbWFwIHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgSW50ZXJydXB0U3RhdHVzMTsJCS8qIDB4MjAwMCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBJbnRlcnJ1cHRFbmFibGUxOwkJLyogMHgyMDA0ICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IEludGVycnVwdE1vbml0b3IxOwkvKiAweDIwMDggKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgQ291bnRlcjsJCQkvKiAweDIwMGMgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgQ291bnRlclRocmVzaG9sZDsJCS8qIDB4MjAxMCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBDb3VudGVyQ29udHJvbDsJCS8qIDB4MjAxNCAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBHcGlvQ29udHJvbDE7CQkvKiAweDIwMTggKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgSW50ZXJydXB0U3RhdHVzMjsJCS8qIDB4MjAxYyAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBJbnRlcnJ1cHRFbmFibGUyOwkJLyogMHgyMDIwICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IEludGVycnVwdE1vbml0b3IyOwkvKiAweDIwMjQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgR3Bpb0NvbnRyb2wyOwkJLyogMHgyMDI4ICovCisJdm9sYXRpbGUgdW5zaWduZWQgaW50IEludGVycnVwdEJsb2NrMTsJCS8qIDB4MjAyYyAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBJbnRlcnJ1cHRCbG9jazI7CQkvKiAweDIwMzAgKi8KK307Cit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCBldm1fc2FhOTczMF9yZWdtYXAgdF9ldm1fc2FhOTczMF9yZWdtYXA7CisKKworc3RydWN0IGxhbl9zYWE5NzMwX3ByaXZhdGUgeworCS8qIFBvaW50ZXIgZm9yIHRoZSBTQUE5NzMwIExBTiBjb250cm9sbGVyIHJlZ2lzdGVyIHNldC4gKi8KKwl0X2xhbl9zYWE5NzMwX3JlZ21hcCAqbGFuX3NhYTk3MzBfcmVnczsKKworCS8qIFBvaW50ZXIgdG8gdGhlIFNBQTk3MzAgRVZNIHJlZ2lzdGVyLiAqLworCXRfZXZtX3NhYTk3MzBfcmVnbWFwICpldm1fc2FhOTczMF9yZWdzOworCisJLyogVFJVRSBpZiB0aGUgbmV4dCBidWZmZXIgdG8gd3JpdGUgaXMgUnhCdWZmQSwgIEZBTFNFIGlmIFJ4QnVmZkIuICovCisJdW5zaWduZWQgY2hhciBOZXh0UmN2VG9Vc2VJc0E7CisJLyogUmN2IGJ1ZmZlciBJbmRleC4gKi8KKwl1bnNpZ25lZCBjaGFyIE5leHRSY3ZQYWNrZXRJbmRleDsKKworCS8qIEluZGV4IG9mIG5leHQgcGFja2V0IHRvIHVzZSBpbiB0aGF0IGJ1ZmZlci4gKi8KKwl1bnNpZ25lZCBjaGFyIE5leHRUeG1QYWNrZXRJbmRleDsKKwkvKiBOZXh0IGJ1ZmZlciBpbmRleC4gKi8KKwl1bnNpZ25lZCBjaGFyIE5leHRUeG1CdWZmZXJJbmRleDsKKworCS8qIEluZGV4IG9mIGZpcnN0IHBlbmRpbmcgcGFja2V0IHJlYWR5IHRvIHNlbmQuICovCisJdW5zaWduZWQgY2hhciBQZW5kaW5nVHhtUGFja2V0SW5kZXg7CisJLyogUGVuZGluZyBidWZmZXIgaW5kZXguICovCisJdW5zaWduZWQgY2hhciBQZW5kaW5nVHhtQnVmZmVySW5kZXg7CisKKwl1bnNpZ25lZCBjaGFyIERtYVJjdlBhY2tldHM7CisJdW5zaWduZWQgY2hhciBEbWFUeG1QYWNrZXRzOworCisJdW5zaWduZWQgY2hhciBSY3ZBSW5kZXg7CS8qIGluZGV4IGludG8gUmN2QnVmZmVyU3BhY2VbXSBmb3IgQmxrIEEgKi8KKwl1bnNpZ25lZCBjaGFyIFJjdkJJbmRleDsJLyogaW5kZXggaW50byBSY3ZCdWZmZXJTcGFjZVtdIGZvciBCbGsgQiAqLworCisJdW5zaWduZWQgaW50CisJICAgIFR4bUJ1ZmZlcltMQU5fU0FBOTczMF9CVUZGRVJTXVtMQU5fU0FBOTczMF9UWE1fUV9TSVpFXTsKKwl1bnNpZ25lZCBpbnQKKwkgICAgUmN2QnVmZmVyW0xBTl9TQUE5NzMwX0JVRkZFUlNdW0xBTl9TQUE5NzMwX1JDVl9RX1NJWkVdOworCXVuc2lnbmVkIGludCBUeEJ1ZmZlckZyZWVbTEFOX1NBQTk3MzBfQlVGRkVSU107CisKKwl1bnNpZ25lZCBjaGFyIFBoeXNpY2FsQWRkcmVzc1tMQU5fU0FBOTczMF9DQU1fRU5UUklFU11bNl07CisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCisjZW5kaWYgLyogX1NBQTk3MzBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2IxMDAwLmMgYi9kcml2ZXJzL25ldC9zYjEwMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTUzNjljCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2IxMDAwLmMKQEAgLTAsMCArMSwxMjAyIEBACisvKiBzYjEwMDAuYzogQSBHZW5lcmFsIEluc3RydW1lbnRzIFNCMTAwMCBkcml2ZXIgZm9yIGxpbnV4LiAqLworLyoKKwlXcml0dGVuIDE5OTggYnkgRnJhbmNvIFZlbnR1cmkuCisKKwlDb3B5cmlnaHQgMTk5OCBieSBGcmFuY28gVmVudHVyaS4KKwlDb3B5cmlnaHQgMTk5NCwxOTk1IGJ5IERvbmFsZCBCZWNrZXIuCisJQ29weXJpZ2h0IDE5OTMgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorCURpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCisKKwlUaGlzIGRyaXZlciBpcyBmb3IgdGhlIEdlbmVyYWwgSW5zdHJ1bWVudHMgU0IxMDAwIChpbnRlcm5hbCBTVVJGYm9hcmQpCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGZ2ZW50dXJpQG1lZGlhb25lLm5ldAorCisJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0CisJYW5kL29yICBtb2RpZnkgaXQgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsCisJUHVibGljICBMaWNlbnNlIGFzICBwdWJsaXNoZWQgIGJ5ICB0aGUgIEZyZWUgIFNvZnR3YXJlCisJRm91bmRhdGlvbjsgIGVpdGhlciAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgKGF0CisJeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisJQ2hhbmdlczoKKworCTk4MTExNSBTdGV2ZW4gSGlyc2NoIDxzaGlyc2NoQGFkZWxwaGlhLm5ldD4KKworCUxpbnVzIGNoYW5nZWQgdGhlIHRpbWVyIGludGVyZmFjZS4gIFNob3VsZCB3b3JrIG9uIGFsbCByZWNlbnQKKwlkZXZlbG9wbWVudCBrZXJuZWxzLgorCisJOTgwNjA4IFN0ZXZlbiBIaXJzY2ggPHNoaXJzY2hAYWRlbHBoaWEubmV0PgorCisJU21hbGwgY2hhbmdlcyB0byBtYWtlIGl0IHdvcmsgd2l0aCAyLjEueCBrZXJuZWxzLiBIb3BlZnVsbHksCisJbm90aGluZyBtYWpvciB3aWxsIGNoYW5nZSBiZWZvcmUgb2ZmaWNpYWwgcmVsZWFzZSBvZiBMaW51eCAyLjIuCisJCisJTWVyZ2VkIHdpdGggMi4yIC0gQWxhbiBDb3gKKyovCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSA9ICJzYjEwMDAuYzp2MS4xLjIgNi8wMS85OCAoZnZlbnR1cmlAbWVkaWFvbmUubmV0KVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfY2FibGVtb2RlbS5oPiAvKiBmb3IgU0lPR0NNL1NJT1NDTSBzdHVmZiAqLworI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIGZvciB1ZGVsYXkoKSAqLworI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG5wLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpZmRlZiBTQjEwMDBfREVCVUcKK3N0YXRpYyBpbnQgc2IxMDAwX2RlYnVnID0gU0IxMDAwX0RFQlVHOworI2Vsc2UKK3N0YXRpYyBpbnQgc2IxMDAwX2RlYnVnID0gMTsKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgaW50IFNCMTAwMF9JT19FWFRFTlQgPSA4OworLyogU0IxMDAwIE1heGltdW0gUmVjZWl2ZSBVbml0ICovCitzdGF0aWMgY29uc3QgaW50IFNCMTAwMF9NUlUgPSAxNTAwOyAvKiBvY3RlY3RzICovCisKKyNkZWZpbmUgTlBJRFMgNAorc3RydWN0IHNiMTAwMF9wcml2YXRlIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiW05QSURTXTsKKwlzaG9ydCByeF9kbGVuW05QSURTXTsKKwl1bnNpZ25lZCBpbnQgcnhfZnJhbWVzOworCXNob3J0IHJ4X2Vycm9yX2NvdW50OworCXNob3J0IHJ4X2Vycm9yX2RwY19jb3VudDsKKwl1bnNpZ25lZCBjaGFyIHJ4X3Nlc3Npb25faWRbTlBJRFNdOworCXVuc2lnbmVkIGNoYXIgcnhfZnJhbWVfaWRbTlBJRFNdOworCXVuc2lnbmVkIGNoYXIgcnhfcGt0X3R5cGVbTlBJRFNdOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworfTsKKworLyogcHJvdG90eXBlcyBmb3IgTGludXggaW50ZXJmYWNlICovCitleHRlcm4gaW50IHNiMTAwMF9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc2IxMDAwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNiMTAwMF9kZXZfaW9jdGwgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgc2IxMDAwX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3Qgc2IxMDAwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2IxMDAwX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzYjEwMDBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworLyogU0IxMDAwIGhhcmR3YXJlIHJvdXRpbmVzIHRvIGJlIHVzZWQgZHVyaW5nIG9wZW4vY29uZmlndXJhdGlvbiBwaGFzZXMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBuaWNlZGVsYXkodW5zaWduZWQgbG9uZyB1c2Vjcyk7CitzdGF0aWMgaW5saW5lIGludCBjYXJkX3dhaXRfZm9yX2J1c3lfY2xlYXIoY29uc3QgaW50IGlvYWRkcltdLAorCWNvbnN0IGNoYXIqIG5hbWUpOworc3RhdGljIGlubGluZSBpbnQgY2FyZF93YWl0X2Zvcl9yZWFkeShjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsCisJdW5zaWduZWQgY2hhciBpbltdKTsKK3N0YXRpYyBpbmxpbmUgaW50IGNhcmRfc2VuZF9jb21tYW5kKGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSwKKwljb25zdCB1bnNpZ25lZCBjaGFyIG91dFtdLCB1bnNpZ25lZCBjaGFyIGluW10pOworCisvKiBTQjEwMDAgaGFyZHdhcmUgcm91dGluZXMgdG8gYmUgdXNlZCBkdXJpbmcgZnJhbWUgcnggaW50ZXJydXB0ICovCitzdGF0aWMgaW5saW5lIGludCBzYjEwMDBfd2FpdF9mb3JfcmVhZHkoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lKTsKK3N0YXRpYyBpbmxpbmUgaW50IHNiMTAwMF93YWl0X2Zvcl9yZWFkeV9jbGVhcihjb25zdCBpbnQgaW9hZGRyW10sCisJY29uc3QgY2hhciogbmFtZSk7CitzdGF0aWMgaW5saW5lIHZvaWQgc2IxMDAwX3NlbmRfY29tbWFuZChjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsCisJY29uc3QgdW5zaWduZWQgY2hhciBvdXRbXSk7CitzdGF0aWMgaW5saW5lIHZvaWQgc2IxMDAwX3JlYWRfc3RhdHVzKGNvbnN0IGludCBpb2FkZHJbXSwgdW5zaWduZWQgY2hhciBpbltdKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYjEwMDBfaXNzdWVfcmVhZF9jb21tYW5kKGNvbnN0IGludCBpb2FkZHJbXSwKKwljb25zdCBjaGFyKiBuYW1lKTsKKworLyogU0IxMDAwIGNvbW1hbmRzIGZvciBvcGVuL2NvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNiMTAwMF9yZXNldChjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUpOworc3RhdGljIGlubGluZSBpbnQgc2IxMDAwX2NoZWNrX0NSQyhjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUpOworc3RhdGljIGlubGluZSBpbnQgc2IxMDAwX3N0YXJ0X2dldF9zZXRfY29tbWFuZChjb25zdCBpbnQgaW9hZGRyW10sCisJY29uc3QgY2hhciogbmFtZSk7CitzdGF0aWMgaW5saW5lIGludCBzYjEwMDBfZW5kX2dldF9zZXRfY29tbWFuZChjb25zdCBpbnQgaW9hZGRyW10sCisJY29uc3QgY2hhciogbmFtZSk7CitzdGF0aWMgaW5saW5lIGludCBzYjEwMDBfYWN0aXZhdGUoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lKTsKK3N0YXRpYyBpbnQgc2IxMDAwX2dldF9maXJtd2FyZV92ZXJzaW9uKGNvbnN0IGludCBpb2FkZHJbXSwKKwljb25zdCBjaGFyKiBuYW1lLCB1bnNpZ25lZCBjaGFyIHZlcnNpb25bXSwgaW50IGRvX2VuZCk7CitzdGF0aWMgaW50IHNiMTAwMF9nZXRfZnJlcXVlbmN5KGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSwKKwlpbnQqIGZyZXF1ZW5jeSk7CitzdGF0aWMgaW50IHNiMTAwMF9zZXRfZnJlcXVlbmN5KGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSwKKwlpbnQgZnJlcXVlbmN5KTsKK3N0YXRpYyBpbnQgc2IxMDAwX2dldF9QSURzKGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSwKKwlzaG9ydCBQSURbXSk7CitzdGF0aWMgaW50IHNiMTAwMF9zZXRfUElEcyhjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsCisJY29uc3Qgc2hvcnQgUElEW10pOworCisvKiBTQjEwMDAgY29tbWFuZHMgZm9yIGZyYW1lIHJ4IGludGVycnVwdCAqLworc3RhdGljIGlubGluZSBpbnQgc2IxMDAwX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlubGluZSB2b2lkIHNiMTAwMF9lcnJvcl9kcGMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG5wX2RldmljZV9pZCBzYjEwMDBfcG5wX2lkc1tdID0geworCXsgIkdJQzEwMDAiLCAwIH0sCisJeyAiIiwgMCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwbnAsIHNiMTAwMF9wbnBfaWRzKTsKKworc3RhdGljIGludAorc2IxMDAwX3Byb2JlX29uZShzdHJ1Y3QgcG5wX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgc2hvcnQgaW9hZGRyWzJdLCBpcnE7CisJdW5zaWduZWQgaW50IHNlcmlhbF9udW1iZXI7CisJaW50IGVycm9yID0gLUVOT0RFVjsKKwkKKwlpZiAocG5wX2RldmljZV9hdHRhY2gocGRldikgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAocG5wX2FjdGl2YXRlX2RldihwZGV2KSA8IDApCisJCWdvdG8gb3V0X2RldGFjaDsKKworCWlmICghcG5wX3BvcnRfdmFsaWQocGRldiwgMCkgfHwgIXBucF9wb3J0X3ZhbGlkKHBkZXYsIDEpKQorCQlnb3RvIG91dF9kaXNhYmxlOworCWlmICghcG5wX2lycV92YWxpZChwZGV2LCAwKSkKKwkJZ290byBvdXRfZGlzYWJsZTsKKwkJCisJc2VyaWFsX251bWJlciA9IHBkZXYtPmNhcmQtPnNlcmlhbDsKKwkJCisJaW9hZGRyWzBdID0gcG5wX3BvcnRfc3RhcnQocGRldiwgMCk7CisJaW9hZGRyWzFdID0gcG5wX3BvcnRfc3RhcnQocGRldiwgMCk7CisJCQorCWlycSA9IHBucF9pcnEocGRldiwgMCk7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkclswXSwgMTYsICJzYjEwMDAiKSkKKwkJZ290byBvdXRfZGlzYWJsZTsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkclsxXSwgMTYsICJzYjEwMDAiKSkKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb24wOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBzYjEwMDBfcHJpdmF0ZSkpOworCWlmICghZGV2KSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb25zOworCX0KKworCQkgCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHJbMF07CisJLyogbWVtX3N0YXJ0IGhvbGRzIHRoZSBzZWNvbmQgSS9PIGFkZHJlc3MgKi8KKwlkZXYtPm1lbV9zdGFydCA9IGlvYWRkclsxXTsKKwlkZXYtPmlycSA9IGlycTsKKworCWlmIChzYjEwMDBfZGVidWcgPiAwKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBzYjEwMDAgYXQgKCUjMy4zbHgsJSMzLjNseCksICIKKwkJCSJTL04gJSM4Ljh4LCBJUlEgJWQuXG4iLCBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLAorCQkJZGV2LT5tZW1fc3RhcnQsIHNlcmlhbF9udW1iZXIsIGRldi0+aXJxKTsKKworCS8qCisJICogVGhlIFNCMTAwMCBpcyBhbiByeC1vbmx5IGNhYmxlIG1vZGVtIGRldmljZS4gIFRoZSB1cGxpbmsgaXMgYSBtb2RlbQorCSAqIGFuZCB3ZSBkbyBub3Qgd2FudCB0byBhcnAgb24gaXQuCisJICovCisJZGV2LT5mbGFncyA9IElGRl9QT0lOVE9QT0lOVHxJRkZfTk9BUlA7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWlmIChzYjEwMDBfZGVidWcgPiAwKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIiwgdmVyc2lvbik7CisKKwkvKiBUaGUgU0IxMDAwLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5vcGVuCQk9IHNiMTAwMF9vcGVuOworCWRldi0+ZG9faW9jdGwJCT0gc2IxMDAwX2Rldl9pb2N0bDsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHNiMTAwMF9zdGFydF94bWl0OworCWRldi0+c3RvcAkJPSBzYjEwMDBfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMJCT0gc2IxMDAwX3N0YXRzOworCisJLyogaGFyZHdhcmUgYWRkcmVzcyBpcyAwOjA6c2VyaWFsX251bWJlciAqLworCWRldi0+ZGV2X2FkZHJbMl0JPSBzZXJpYWxfbnVtYmVyID4+IDI0ICYgMHhmZjsKKwlkZXYtPmRldl9hZGRyWzNdCT0gc2VyaWFsX251bWJlciA+PiAxNiAmIDB4ZmY7CisJZGV2LT5kZXZfYWRkcls0XQk9IHNlcmlhbF9udW1iZXIgPj4gIDggJiAweGZmOworCWRldi0+ZGV2X2FkZHJbNV0JPSBzZXJpYWxfbnVtYmVyID4+ICAwICYgMHhmZjsKKworCXBucF9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJZXJyb3IgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2ZyZWVfbmV0ZGV2OworCXJldHVybiAwOworCisgb3V0X2ZyZWVfbmV0ZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7Cisgb3V0X3JlbGVhc2VfcmVnaW9uczoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHJbMV0sIDE2KTsKKyBvdXRfcmVsZWFzZV9yZWdpb24wOgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkclswXSwgMTYpOworIG91dF9kaXNhYmxlOgorCXBucF9kaXNhYmxlX2RldihwZGV2KTsKKyBvdXRfZGV0YWNoOgorCXBucF9kZXZpY2VfZGV0YWNoKHBkZXYpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQKK3NiMTAwMF9yZW1vdmVfb25lKHN0cnVjdCBwbnBfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwbnBfZ2V0X2RydmRhdGEocGRldik7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCAxNik7CisJcmVsZWFzZV9yZWdpb24oZGV2LT5tZW1fc3RhcnQsIDE2KTsKKwlmcmVlX25ldGRldihkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBucF9kcml2ZXIgc2IxMDAwX2RyaXZlciA9IHsKKwkubmFtZQkJPSAic2IxMDAwIiwKKwkuaWRfdGFibGUJPSBzYjEwMDBfcG5wX2lkcywKKwkucHJvYmUJCT0gc2IxMDAwX3Byb2JlX29uZSwKKwkucmVtb3ZlCQk9IHNiMTAwMF9yZW1vdmVfb25lLAorfTsKKworDAorLyoKKyAqIFNCMTAwMCBoYXJkd2FyZSByb3V0aW5lcyB0byBiZSB1c2VkIGR1cmluZyBvcGVuL2NvbmZpZ3VyYXRpb24gcGhhc2VzCisgKi8KKworc3RhdGljIGNvbnN0IGludCBUaW1lT3V0SmlmZmllcyA9ICg4NzUgKiBIWikgLyAxMDA7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuaWNlZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykKK3sKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwlzY2hlZHVsZV90aW1lb3V0KEhaKTsKKwlyZXR1cm47Cit9CisKKy8qIENhcmQgV2FpdCBGb3IgQnVzeSBDbGVhciAoY2Fubm90IGJlIHVzZWQgZHVyaW5nIGFuIGludGVycnVwdCkgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitjYXJkX3dhaXRfZm9yX2J1c3lfY2xlYXIoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lKQoreworCXVuc2lnbmVkIGNoYXIgYTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlhID0gaW5iKGlvYWRkclswXSArIDcpOworCXRpbWVvdXQgPSBqaWZmaWVzICsgVGltZU91dEppZmZpZXM7CisJd2hpbGUgKGEgJiAweDgwIHx8IGEgJiAweDQwKSB7CisJCS8qIGEgbGl0dGxlIHNsZWVwICovCisJCXlpZWxkKCk7CisKKwkJYSA9IGluYihpb2FkZHJbMF0gKyA3KTsKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdGltZW91dCkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjYXJkX3dhaXRfZm9yX2J1c3lfY2xlYXIgdGltZW91dFxuIiwKKwkJCQluYW1lKTsKKwkJCXJldHVybiAtRVRJTUU7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FyZCBXYWl0IEZvciBSZWFkeSAoY2Fubm90IGJlIHVzZWQgZHVyaW5nIGFuIGludGVycnVwdCkgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitjYXJkX3dhaXRfZm9yX3JlYWR5KGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSwgdW5zaWduZWQgY2hhciBpbltdKQoreworCXVuc2lnbmVkIGNoYXIgYTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlhID0gaW5iKGlvYWRkclsxXSArIDYpOworCXRpbWVvdXQgPSBqaWZmaWVzICsgVGltZU91dEppZmZpZXM7CisJd2hpbGUgKGEgJiAweDgwIHx8ICEoYSAmIDB4NDApKSB7CisJCS8qIGEgbGl0dGxlIHNsZWVwICovCisJCXlpZWxkKCk7CisKKwkJYSA9IGluYihpb2FkZHJbMV0gKyA2KTsKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdGltZW91dCkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjYXJkX3dhaXRfZm9yX3JlYWR5IHRpbWVvdXRcbiIsCisJCQkJbmFtZSk7CisJCQlyZXR1cm4gLUVUSU1FOworCQl9CisJfQorCisJaW5bMV0gPSBpbmIoaW9hZGRyWzBdICsgMSk7CisJaW5bMl0gPSBpbmIoaW9hZGRyWzBdICsgMik7CisJaW5bM10gPSBpbmIoaW9hZGRyWzBdICsgMyk7CisJaW5bNF0gPSBpbmIoaW9hZGRyWzBdICsgNCk7CisJaW5bMF0gPSBpbmIoaW9hZGRyWzBdICsgNSk7CisJaW5bNl0gPSBpbmIoaW9hZGRyWzBdICsgNik7CisJaW5bNV0gPSBpbmIoaW9hZGRyWzFdICsgNik7CisJcmV0dXJuIDA7Cit9CisKKy8qIENhcmQgU2VuZCBDb21tYW5kIChjYW5ub3QgYmUgdXNlZCBkdXJpbmcgYW4gaW50ZXJydXB0KSAqLworc3RhdGljIGlubGluZSBpbnQKK2NhcmRfc2VuZF9jb21tYW5kKGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSwKKwljb25zdCB1bnNpZ25lZCBjaGFyIG91dFtdLCB1bnNpZ25lZCBjaGFyIGluW10pCit7CisJaW50IHN0YXR1cywgeDsKKworCWlmICgoc3RhdHVzID0gY2FyZF93YWl0X2Zvcl9idXN5X2NsZWFyKGlvYWRkciwgbmFtZSkpKQorCQlyZXR1cm4gc3RhdHVzOworCW91dGIoMHhhMCwgaW9hZGRyWzBdICsgNik7CisJb3V0YihvdXRbMl0sIGlvYWRkclswXSArIDEpOworCW91dGIob3V0WzNdLCBpb2FkZHJbMF0gKyAyKTsKKwlvdXRiKG91dFs0XSwgaW9hZGRyWzBdICsgMyk7CisJb3V0YihvdXRbNV0sIGlvYWRkclswXSArIDQpOworCW91dGIob3V0WzFdLCBpb2FkZHJbMF0gKyA1KTsKKwlvdXRiKDB4YTAsIGlvYWRkclswXSArIDYpOworCW91dGIob3V0WzBdLCBpb2FkZHJbMF0gKyA3KTsKKwlpZiAob3V0WzBdICE9IDB4MjAgJiYgb3V0WzBdICE9IDB4MzApIHsKKwkJaWYgKChzdGF0dXMgPSBjYXJkX3dhaXRfZm9yX3JlYWR5KGlvYWRkciwgbmFtZSwgaW4pKSkKKwkJCXJldHVybiBzdGF0dXM7CisJCWluYihpb2FkZHJbMF0gKyA3KTsKKwkJaWYgKHNiMTAwMF9kZWJ1ZyA+IDMpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNhcmRfc2VuZF9jb21tYW5kICIKKwkJCQkib3V0OiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggICIKKwkJCQkiaW46ICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsIG5hbWUsCisJCQkJb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdLCBvdXRbNF0sIG91dFs1XSwKKwkJCQlpblswXSwgaW5bMV0sIGluWzJdLCBpblszXSwgaW5bNF0sIGluWzVdLCBpbls2XSk7CisJfSBlbHNlIHsKKwkJaWYgKHNiMTAwMF9kZWJ1ZyA+IDMpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNhcmRfc2VuZF9jb21tYW5kICIKKwkJCQkib3V0OiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsIG5hbWUsCisJCQkJb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdLCBvdXRbNF0sIG91dFs1XSk7CisJfQorCisJaWYgKG91dFsxXSA9PSAweDFiKSB7CisJCXggPSAob3V0WzJdID09IDB4MDIpOworCX0gZWxzZSB7CisJCWlmIChvdXRbMF0gPj0gMHg4MCAmJiBpblswXSAhPSAob3V0WzFdIHwgMHg4MCkpCisJCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKwwKKy8qCisgKiBTQjEwMDAgaGFyZHdhcmUgcm91dGluZXMgdG8gYmUgdXNlZCBkdXJpbmcgZnJhbWUgcnggaW50ZXJydXB0CisgKi8KK3N0YXRpYyBjb25zdCBpbnQgU2IxMDAwVGltZU91dEppZmZpZXMgPSA3ICogSFo7CisKKy8qIENhcmQgV2FpdCBGb3IgUmVhZHkgKHRvIGJlIHVzZWQgZHVyaW5nIGZyYW1lIHJ4KSAqLworc3RhdGljIGlubGluZSBpbnQKK3NiMTAwMF93YWl0X2Zvcl9yZWFkeShjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJdGltZW91dCA9IGppZmZpZXMgKyBTYjEwMDBUaW1lT3V0SmlmZmllczsKKwl3aGlsZSAoaW5iKGlvYWRkclsxXSArIDYpICYgMHg4MCkgeworCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNiMTAwMF93YWl0X2Zvcl9yZWFkeSB0aW1lb3V0XG4iLAorCQkJCW5hbWUpOworCQkJcmV0dXJuIC1FVElNRTsKKwkJfQorCX0KKwl0aW1lb3V0ID0gamlmZmllcyArIFNiMTAwMFRpbWVPdXRKaWZmaWVzOworCXdoaWxlICghKGluYihpb2FkZHJbMV0gKyA2KSAmIDB4NDApKSB7CisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc2IxMDAwX3dhaXRfZm9yX3JlYWR5IHRpbWVvdXRcbiIsCisJCQkJbmFtZSk7CisJCQlyZXR1cm4gLUVUSU1FOworCQl9CisJfQorCWluYihpb2FkZHJbMF0gKyA3KTsKKwlyZXR1cm4gMDsKK30KKworLyogQ2FyZCBXYWl0IEZvciBSZWFkeSBDbGVhciAodG8gYmUgdXNlZCBkdXJpbmcgZnJhbWUgcngpICovCitzdGF0aWMgaW5saW5lIGludAorc2IxMDAwX3dhaXRfZm9yX3JlYWR5X2NsZWFyKGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIFNiMTAwMFRpbWVPdXRKaWZmaWVzOworCXdoaWxlIChpbmIoaW9hZGRyWzFdICsgNikgJiAweDgwKSB7CisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc2IxMDAwX3dhaXRfZm9yX3JlYWR5X2NsZWFyIHRpbWVvdXRcbiIsCisJCQkJbmFtZSk7CisJCQlyZXR1cm4gLUVUSU1FOworCQl9CisJfQorCXRpbWVvdXQgPSBqaWZmaWVzICsgU2IxMDAwVGltZU91dEppZmZpZXM7CisJd2hpbGUgKGluYihpb2FkZHJbMV0gKyA2KSAmIDB4NDApIHsKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdGltZW91dCkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBzYjEwMDBfd2FpdF9mb3JfcmVhZHlfY2xlYXIgdGltZW91dFxuIiwKKwkJCQluYW1lKTsKKwkJCXJldHVybiAtRVRJTUU7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIENhcmQgU2VuZCBDb21tYW5kICh0byBiZSB1c2VkIGR1cmluZyBmcmFtZSByeCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc2IxMDAwX3NlbmRfY29tbWFuZChjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsCisJY29uc3QgdW5zaWduZWQgY2hhciBvdXRbXSkKK3sKKwlvdXRiKG91dFsyXSwgaW9hZGRyWzBdICsgMSk7CisJb3V0YihvdXRbM10sIGlvYWRkclswXSArIDIpOworCW91dGIob3V0WzRdLCBpb2FkZHJbMF0gKyAzKTsKKwlvdXRiKG91dFs1XSwgaW9hZGRyWzBdICsgNCk7CisJb3V0YihvdXRbMV0sIGlvYWRkclswXSArIDUpOworCW91dGIob3V0WzBdLCBpb2FkZHJbMF0gKyA3KTsKKwlpZiAoc2IxMDAwX2RlYnVnID4gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzYjEwMDBfc2VuZF9jb21tYW5kIG91dDogJTAyeCUwMnglMDJ4JTAyeCIKKwkJCSIlMDJ4JTAyeFxuIiwgbmFtZSwgb3V0WzBdLCBvdXRbMV0sIG91dFsyXSwgb3V0WzNdLCBvdXRbNF0sIG91dFs1XSk7CisJcmV0dXJuOworfQorCisvKiBDYXJkIFJlYWQgU3RhdHVzICh0byBiZSB1c2VkIGR1cmluZyBmcmFtZSByeCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc2IxMDAwX3JlYWRfc3RhdHVzKGNvbnN0IGludCBpb2FkZHJbXSwgdW5zaWduZWQgY2hhciBpbltdKQoreworCWluWzFdID0gaW5iKGlvYWRkclswXSArIDEpOworCWluWzJdID0gaW5iKGlvYWRkclswXSArIDIpOworCWluWzNdID0gaW5iKGlvYWRkclswXSArIDMpOworCWluWzRdID0gaW5iKGlvYWRkclswXSArIDQpOworCWluWzBdID0gaW5iKGlvYWRkclswXSArIDUpOworCXJldHVybjsKK30KKworLyogSXNzdWUgUmVhZCBDb21tYW5kICh0byBiZSB1c2VkIGR1cmluZyBmcmFtZSByeCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc2IxMDAwX2lzc3VlX3JlYWRfY29tbWFuZChjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciBDb21tYW5kMFs2XSA9IHsweDIwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwfTsKKworCXNiMTAwMF93YWl0X2Zvcl9yZWFkeV9jbGVhcihpb2FkZHIsIG5hbWUpOworCW91dGIoMHhhMCwgaW9hZGRyWzBdICsgNik7CisJc2IxMDAwX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQwKTsKKwlyZXR1cm47Cit9CisKKwwKKy8qCisgKiBTQjEwMDAgY29tbWFuZHMgZm9yIG9wZW4vY29uZmlndXJhdGlvbgorICovCisvKiByZXNldCBTQjEwMDAgY2FyZCAqLworc3RhdGljIGlubGluZSBpbnQKK3NiMTAwMF9yZXNldChjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUpCit7CisJdW5zaWduZWQgY2hhciBzdFs3XTsKKwlpbnQgcG9ydCwgc3RhdHVzOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDBbNl0gPSB7MHg4MCwgMHgxNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisKKwlwb3J0ID0gaW9hZGRyWzFdICsgNjsKKwlvdXRiKDB4NCwgcG9ydCk7CisJaW5iKHBvcnQpOworCXVkZWxheSgxMDAwKTsKKwlvdXRiKDB4MCwgcG9ydCk7CisJaW5iKHBvcnQpOworCW5pY2VkZWxheSg2MDAwMCk7CisJb3V0YigweDQsIHBvcnQpOworCWluYihwb3J0KTsKKwl1ZGVsYXkoMTAwMCk7CisJb3V0YigweDAsIHBvcnQpOworCWluYihwb3J0KTsKKwl1ZGVsYXkoMCk7CisKKwlpZiAoKHN0YXR1cyA9IGNhcmRfc2VuZF9jb21tYW5kKGlvYWRkciwgbmFtZSwgQ29tbWFuZDAsIHN0KSkpCisJCXJldHVybiBzdGF0dXM7CisJaWYgKHN0WzNdICE9IDB4ZjApCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCisvKiBjaGVjayBTQjEwMDAgZmlybXdhcmUgQ1JDICovCitzdGF0aWMgaW5saW5lIGludAorc2IxMDAwX2NoZWNrX0NSQyhjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUpCit7CisJdW5zaWduZWQgY2hhciBzdFs3XTsKKwlpbnQgY3JjLCBzdGF0dXM7CisJY29uc3QgdW5zaWduZWQgY2hhciBDb21tYW5kMFs2XSA9IHsweDgwLCAweDFmLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKworCS8qIGNoZWNrIENSQyAqLworCWlmICgoc3RhdHVzID0gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMCwgc3QpKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAoc3RbMV0gIT0gc3RbM10gfHwgc3RbMl0gIT0gc3RbNF0pCisJCXJldHVybiAtRUlPOworCWNyYyA9IHN0WzFdIDw8IDggfCBzdFsyXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3NiMTAwMF9zdGFydF9nZXRfc2V0X2NvbW1hbmQoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lKQoreworCXVuc2lnbmVkIGNoYXIgc3RbN107CisJY29uc3QgdW5zaWduZWQgY2hhciBDb21tYW5kMFs2XSA9IHsweDgwLCAweDFiLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKworCXJldHVybiBjYXJkX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQwLCBzdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitzYjEwMDBfZW5kX2dldF9zZXRfY29tbWFuZChjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUpCit7CisJdW5zaWduZWQgY2hhciBzdFs3XTsKKwlpbnQgc3RhdHVzOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDBbNl0gPSB7MHg4MCwgMHgxYiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMH07CisJY29uc3QgdW5zaWduZWQgY2hhciBDb21tYW5kMVs2XSA9IHsweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKworCWlmICgoc3RhdHVzID0gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMCwgc3QpKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMSwgc3QpOworfQorCitzdGF0aWMgaW5saW5lIGludAorc2IxMDAwX2FjdGl2YXRlKGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0WzddOworCWludCBzdGF0dXM7CisJY29uc3QgdW5zaWduZWQgY2hhciBDb21tYW5kMFs2XSA9IHsweDgwLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKwljb25zdCB1bnNpZ25lZCBjaGFyIENvbW1hbmQxWzZdID0gezB4ODAsIDB4MTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCisJbmljZWRlbGF5KDUwMDAwKTsKKwlpZiAoKHN0YXR1cyA9IGNhcmRfc2VuZF9jb21tYW5kKGlvYWRkciwgbmFtZSwgQ29tbWFuZDAsIHN0KSkpCisJCXJldHVybiBzdGF0dXM7CisJaWYgKChzdGF0dXMgPSBjYXJkX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQxLCBzdCkpKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChzdFszXSAhPSAweGYxKSB7CisgICAgCWlmICgoc3RhdHVzID0gc2IxMDAwX3N0YXJ0X2dldF9zZXRfY29tbWFuZChpb2FkZHIsIG5hbWUpKSkKKwkJCXJldHVybiBzdGF0dXM7CisJCXJldHVybiAtRUlPOworCX0KKwl1ZGVsYXkoMTAwMCk7CisgICAgcmV0dXJuIHNiMTAwMF9zdGFydF9nZXRfc2V0X2NvbW1hbmQoaW9hZGRyLCBuYW1lKTsKK30KKworLyogZ2V0IFNCMTAwMCBmaXJtd2FyZSB2ZXJzaW9uICovCitzdGF0aWMgaW50CitzYjEwMDBfZ2V0X2Zpcm13YXJlX3ZlcnNpb24oY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lLAorCXVuc2lnbmVkIGNoYXIgdmVyc2lvbltdLCBpbnQgZG9fZW5kKQoreworCXVuc2lnbmVkIGNoYXIgc3RbN107CisJaW50IHN0YXR1czsKKwljb25zdCB1bnNpZ25lZCBjaGFyIENvbW1hbmQwWzZdID0gezB4ODAsIDB4MjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCisJaWYgKChzdGF0dXMgPSBzYjEwMDBfc3RhcnRfZ2V0X3NldF9jb21tYW5kKGlvYWRkciwgbmFtZSkpKQorCQlyZXR1cm4gc3RhdHVzOworCWlmICgoc3RhdHVzID0gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMCwgc3QpKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAoc3RbMF0gIT0gMHhhMykKKwkJcmV0dXJuIC1FSU87CisJdmVyc2lvblswXSA9IHN0WzFdOworCXZlcnNpb25bMV0gPSBzdFsyXTsKKwlpZiAoZG9fZW5kKQorCQlyZXR1cm4gc2IxMDAwX2VuZF9nZXRfc2V0X2NvbW1hbmQoaW9hZGRyLCBuYW1lKTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKiBnZXQgU0IxMDAwIGZyZXF1ZW5jeSAqLworc3RhdGljIGludAorc2IxMDAwX2dldF9mcmVxdWVuY3koY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lLCBpbnQqIGZyZXF1ZW5jeSkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0WzddOworCWludCBzdGF0dXM7CisJY29uc3QgdW5zaWduZWQgY2hhciBDb21tYW5kMFs2XSA9IHsweDgwLCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKworCXVkZWxheSgxMDAwKTsKKwlpZiAoKHN0YXR1cyA9IHNiMTAwMF9zdGFydF9nZXRfc2V0X2NvbW1hbmQoaW9hZGRyLCBuYW1lKSkpCisJCXJldHVybiBzdGF0dXM7CisJaWYgKChzdGF0dXMgPSBjYXJkX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQwLCBzdCkpKQorCQlyZXR1cm4gc3RhdHVzOworCSpmcmVxdWVuY3kgPSAoKHN0WzFdIDw8IDggfCBzdFsyXSkgPDwgOCB8IHN0WzNdKSA8PCA4IHwgc3RbNF07CisJcmV0dXJuIHNiMTAwMF9lbmRfZ2V0X3NldF9jb21tYW5kKGlvYWRkciwgbmFtZSk7Cit9CisKKy8qIHNldCBTQjEwMDAgZnJlcXVlbmN5ICovCitzdGF0aWMgaW50CitzYjEwMDBfc2V0X2ZyZXF1ZW5jeShjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsIGludCBmcmVxdWVuY3kpCit7CisJdW5zaWduZWQgY2hhciBzdFs3XTsKKwlpbnQgc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgQ29tbWFuZDBbNl0gPSB7MHg4MCwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisKKwljb25zdCBpbnQgRnJlcXVlbmN5TG93ZXJMaW1pdCA9IDU3MDAwOworCWNvbnN0IGludCBGcmVxdWVuY3lVcHBlckxpbWl0ID0gODA0MDAwOworCisJaWYgKGZyZXF1ZW5jeSA8IEZyZXF1ZW5jeUxvd2VyTGltaXQgfHwgZnJlcXVlbmN5ID4gRnJlcXVlbmN5VXBwZXJMaW1pdCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmcmVxdWVuY3kgY2hvc2VuICglZCBrSHopIGlzIG5vdCBpbiB0aGUgcmFuZ2UgIgorCQkJIlslZCwlZF0ga0h6XG4iLCBuYW1lLCBmcmVxdWVuY3ksIEZyZXF1ZW5jeUxvd2VyTGltaXQsCisJCQlGcmVxdWVuY3lVcHBlckxpbWl0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXVkZWxheSgxMDAwKTsKKwlpZiAoKHN0YXR1cyA9IHNiMTAwMF9zdGFydF9nZXRfc2V0X2NvbW1hbmQoaW9hZGRyLCBuYW1lKSkpCisJCXJldHVybiBzdGF0dXM7CisJQ29tbWFuZDBbNV0gPSBmcmVxdWVuY3kgJiAweGZmOworCWZyZXF1ZW5jeSA+Pj0gODsKKwlDb21tYW5kMFs0XSA9IGZyZXF1ZW5jeSAmIDB4ZmY7CisJZnJlcXVlbmN5ID4+PSA4OworCUNvbW1hbmQwWzNdID0gZnJlcXVlbmN5ICYgMHhmZjsKKwlmcmVxdWVuY3kgPj49IDg7CisJQ29tbWFuZDBbMl0gPSBmcmVxdWVuY3kgJiAweGZmOworCXJldHVybiBjYXJkX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQwLCBzdCk7Cit9CisKKy8qIGdldCBTQjEwMDAgUElEcyAqLworc3RhdGljIGludAorc2IxMDAwX2dldF9QSURzKGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSwgc2hvcnQgUElEW10pCit7CisJdW5zaWduZWQgY2hhciBzdFs3XTsKKwlpbnQgc3RhdHVzOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDBbNl0gPSB7MHg4MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisJY29uc3QgdW5zaWduZWQgY2hhciBDb21tYW5kMVs2XSA9IHsweDgwLCAweDQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKwljb25zdCB1bnNpZ25lZCBjaGFyIENvbW1hbmQyWzZdID0gezB4ODAsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDNbNl0gPSB7MHg4MCwgMHg0MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisKKwl1ZGVsYXkoMTAwMCk7CisJaWYgKChzdGF0dXMgPSBzYjEwMDBfc3RhcnRfZ2V0X3NldF9jb21tYW5kKGlvYWRkciwgbmFtZSkpKQorCQlyZXR1cm4gc3RhdHVzOworCisJaWYgKChzdGF0dXMgPSBjYXJkX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQwLCBzdCkpKQorCQlyZXR1cm4gc3RhdHVzOworCVBJRFswXSA9IHN0WzFdIDw8IDggfCBzdFsyXTsKKworCWlmICgoc3RhdHVzID0gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMSwgc3QpKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlQSURbMV0gPSBzdFsxXSA8PCA4IHwgc3RbMl07CisKKwlpZiAoKHN0YXR1cyA9IGNhcmRfc2VuZF9jb21tYW5kKGlvYWRkciwgbmFtZSwgQ29tbWFuZDIsIHN0KSkpCisJCXJldHVybiBzdGF0dXM7CisJUElEWzJdID0gc3RbMV0gPDwgOCB8IHN0WzJdOworCisJaWYgKChzdGF0dXMgPSBjYXJkX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQzLCBzdCkpKQorCQlyZXR1cm4gc3RhdHVzOworCVBJRFszXSA9IHN0WzFdIDw8IDggfCBzdFsyXTsKKworCXJldHVybiBzYjEwMDBfZW5kX2dldF9zZXRfY29tbWFuZChpb2FkZHIsIG5hbWUpOworfQorCisvKiBzZXQgU0IxMDAwIFBJRHMgKi8KK3N0YXRpYyBpbnQKK3NiMTAwMF9zZXRfUElEcyhjb25zdCBpbnQgaW9hZGRyW10sIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IHNob3J0IFBJRFtdKQoreworCXVuc2lnbmVkIGNoYXIgc3RbN107CisJc2hvcnQgcDsKKwlpbnQgc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgQ29tbWFuZDBbNl0gPSB7MHg4MCwgMHgzMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisJdW5zaWduZWQgY2hhciBDb21tYW5kMVs2XSA9IHsweDgwLCAweDMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKwl1bnNpZ25lZCBjaGFyIENvbW1hbmQyWzZdID0gezB4ODAsIDB4MzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCXVuc2lnbmVkIGNoYXIgQ29tbWFuZDNbNl0gPSB7MHg4MCwgMHgzNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisJY29uc3QgdW5zaWduZWQgY2hhciBDb21tYW5kNFs2XSA9IHsweDgwLCAweDJlLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKworCXVkZWxheSgxMDAwKTsKKwlpZiAoKHN0YXR1cyA9IHNiMTAwMF9zdGFydF9nZXRfc2V0X2NvbW1hbmQoaW9hZGRyLCBuYW1lKSkpCisJCXJldHVybiBzdGF0dXM7CisKKwlwID0gUElEWzBdOworCUNvbW1hbmQwWzNdID0gcCAmIDB4ZmY7CisJcCA+Pj0gODsKKwlDb21tYW5kMFsyXSA9IHAgJiAweGZmOworCWlmICgoc3RhdHVzID0gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMCwgc3QpKSkKKwkJcmV0dXJuIHN0YXR1czsKKworCXAgPSBQSURbMV07CisJQ29tbWFuZDFbM10gPSBwICYgMHhmZjsKKwlwID4+PSA4OworCUNvbW1hbmQxWzJdID0gcCAmIDB4ZmY7CisJaWYgKChzdGF0dXMgPSBjYXJkX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQxLCBzdCkpKQorCQlyZXR1cm4gc3RhdHVzOworCisJcCA9IFBJRFsyXTsKKwlDb21tYW5kMlszXSA9IHAgJiAweGZmOworCXAgPj49IDg7CisJQ29tbWFuZDJbMl0gPSBwICYgMHhmZjsKKwlpZiAoKHN0YXR1cyA9IGNhcmRfc2VuZF9jb21tYW5kKGlvYWRkciwgbmFtZSwgQ29tbWFuZDIsIHN0KSkpCisJCXJldHVybiBzdGF0dXM7CisKKwlwID0gUElEWzNdOworCUNvbW1hbmQzWzNdID0gcCAmIDB4ZmY7CisJcCA+Pj0gODsKKwlDb21tYW5kM1syXSA9IHAgJiAweGZmOworCWlmICgoc3RhdHVzID0gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMywgc3QpKSkKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmICgoc3RhdHVzID0gY2FyZF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kNCwgc3QpKSkKKwkJcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gc2IxMDAwX2VuZF9nZXRfc2V0X2NvbW1hbmQoaW9hZGRyLCBuYW1lKTsKK30KKworDAorc3RhdGljIGlubGluZSB2b2lkCitzYjEwMDBfcHJpbnRfc3RhdHVzX2J1ZmZlcihjb25zdCBjaGFyKiBuYW1lLCB1bnNpZ25lZCBjaGFyIHN0W10sCisJdW5zaWduZWQgY2hhciBidWZmZXJbXSwgaW50IHNpemUpCit7CisJaW50IGksIGosIGs7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHN0YXR1czogJTAyeCAlMDJ4XG4iLCBuYW1lLCBzdFswXSwgc3RbMV0pOworCWlmIChidWZmZXJbMjRdID09IDB4MDggJiYgYnVmZmVyWzI1XSA9PSAweDAwICYmIGJ1ZmZlclsyNl0gPT0gMHg0NSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGxlbmd0aDogJWQgcHJvdG9jb2w6ICVkIGZyb206ICVkLiVkLiVkLiVkOiVkICIKKwkJCSJ0byAlZC4lZC4lZC4lZDolZFxuIiwgbmFtZSwgYnVmZmVyWzI4XSA8PCA4IHwgYnVmZmVyWzI5XSwKKwkJCWJ1ZmZlclszNV0sIGJ1ZmZlclszOF0sIGJ1ZmZlclszOV0sIGJ1ZmZlcls0MF0sIGJ1ZmZlcls0MV0sCisgICAgICAgICAgICBidWZmZXJbNDZdIDw8IDggfCBidWZmZXJbNDddLAorCQkJYnVmZmVyWzQyXSwgYnVmZmVyWzQzXSwgYnVmZmVyWzQ0XSwgYnVmZmVyWzQ1XSwKKyAgICAgICAgICAgIGJ1ZmZlcls0OF0gPDwgOCB8IGJ1ZmZlcls0OV0pOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDAsIGsgPSAwOyBpIDwgKHNpemUgKyA3KSAvIDg7IGkrKykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcyIsIG5hbWUsIGkgPyAiICAgICAgICIgOiAiYnVmZmVyOiIpOworCQkJZm9yIChqID0gMDsgaiA8IDggJiYgayA8IHNpemU7IGorKywgaysrKQorCQkJCXByaW50aygiICUwMngiLCBidWZmZXJba10pOworCQkJcHJpbnRrKCJcbiIpOworCQl9CisJfQorCXJldHVybjsKK30KKworLyoKKyAqIFNCMTAwMCBjb21tYW5kcyBmb3IgZnJhbWUgcnggaW50ZXJydXB0CisgKi8KKy8qIHJlY2VpdmUgYSBzaW5nbGUgZnJhbWUgYW5kIGFzc2VtYmxlIGRhdGFncmFtCisgKiAodGhpcyBpcyB0aGUgaGVhcnQgb2YgdGhlIGludGVycnVwdCByb3V0aW5lKQorICovCitzdGF0aWMgaW5saW5lIGludAorc2IxMDAwX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKyNkZWZpbmUgRlJBTUVTSVpFIDE4NAorCXVuc2lnbmVkIGNoYXIgc3RbMl0sIGJ1ZmZlcltGUkFNRVNJWkVdLCBzZXNzaW9uX2lkLCBmcmFtZV9pZDsKKwlzaG9ydCBkbGVuOworCWludCBpb2FkZHIsIG5zOworCXVuc2lnbmVkIGludCBza2JzaXplOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHNiMTAwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmxwLT5zdGF0czsKKworCS8qIFNCMTAwMCBmcmFtZSBjb25zdGFudHMgKi8KKwljb25zdCBpbnQgRnJhbWVTaXplID0gRlJBTUVTSVpFOworCWNvbnN0IGludCBOZXdEYXRhZ3JhbUhlYWRlclNraXAgPSA4OworCWNvbnN0IGludCBOZXdEYXRhZ3JhbUhlYWRlclNpemUgPSBOZXdEYXRhZ3JhbUhlYWRlclNraXAgKyAxODsKKwljb25zdCBpbnQgTmV3RGF0YWdyYW1EYXRhU2l6ZSA9IEZyYW1lU2l6ZSAtIE5ld0RhdGFncmFtSGVhZGVyU2l6ZTsKKwljb25zdCBpbnQgQ29udERhdGFncmFtSGVhZGVyU2tpcCA9IDc7CisJY29uc3QgaW50IENvbnREYXRhZ3JhbUhlYWRlclNpemUgPSBDb250RGF0YWdyYW1IZWFkZXJTa2lwICsgMTsKKwljb25zdCBpbnQgQ29udERhdGFncmFtRGF0YVNpemUgPSBGcmFtZVNpemUgLSBDb250RGF0YWdyYW1IZWFkZXJTaXplOworCWNvbnN0IGludCBUcmFpbGVyU2l6ZSA9IDQ7CisKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWluc3coaW9hZGRyLCAodW5zaWduZWQgc2hvcnQqKSBzdCwgMSk7CisjaWZkZWYgWFhYREVCVUcKK3ByaW50aygiY20wOiByZWNlaXZlZDogJTAyeCAlMDJ4XG4iLCBzdFswXSwgc3RbMV0pOworI2VuZGlmIC8qIFhYWERFQlVHICovCisJbHAtPnJ4X2ZyYW1lcysrOworCisJLyogZGVjaWRlIGlmIGl0IGlzIGEgZ29vZCBvciBiYWQgZnJhbWUgKi8KKwlmb3IgKG5zID0gMDsgbnMgPCBOUElEUzsgbnMrKykgeworCQlzZXNzaW9uX2lkID0gbHAtPnJ4X3Nlc3Npb25faWRbbnNdOworCQlmcmFtZV9pZCA9IGxwLT5yeF9mcmFtZV9pZFtuc107CisJCWlmIChzdFswXSA9PSBzZXNzaW9uX2lkKSB7CisJCQlpZiAoc3RbMV0gPT0gZnJhbWVfaWQgfHwgKCFmcmFtZV9pZCAmJiAoc3RbMV0gJiAweGYwKSA9PSAweDMwKSkgeworCQkJCWdvdG8gZ29vZF9mcmFtZTsKKwkJCX0gZWxzZSBpZiAoKHN0WzFdICYgMHhmMCkgPT0gMHgzMCAmJiAoc3RbMF0gJiAweDQwKSkgeworCQkJCWdvdG8gc2tpcHBlZF9mcmFtZTsKKwkJCX0gZWxzZSB7CisJCQkJZ290byBiYWRfZnJhbWU7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RbMF0gPT0gKHNlc3Npb25faWQgfCAweDQwKSkgeworCQkJaWYgKChzdFsxXSAmIDB4ZjApID09IDB4MzApIHsKKwkJCQlnb3RvIHNraXBwZWRfZnJhbWU7CisJCQl9IGVsc2UgeworCQkJCWdvdG8gYmFkX2ZyYW1lOworCQkJfQorCQl9CisJfQorCWdvdG8gYmFkX2ZyYW1lOworCitza2lwcGVkX2ZyYW1lOgorCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMrKzsKKwlza2IgPSBscC0+cnhfc2tiW25zXTsKKwlpZiAoc2IxMDAwX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG1pc3NpbmcgZnJhbWUocyk6IGdvdCAlMDJ4ICUwMnggIgorCQkJImV4cGVjdGluZyAlMDJ4ICUwMnhcbiIsIGRldi0+bmFtZSwgc3RbMF0sIHN0WzFdLAorCQkJc2tiID8gc2Vzc2lvbl9pZCA6IHNlc3Npb25faWQgfCAweDQwLCBmcmFtZV9pZCk7CisJaWYgKHNrYikgeworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXNrYiA9IE5VTEw7CisJfQorCitnb29kX2ZyYW1lOgorCWxwLT5yeF9mcmFtZV9pZFtuc10gPSAweDMwIHwgKChzdFsxXSArIDEpICYgMHgwZik7CisJLyogbmV3IGRhdGFncmFtICovCisJaWYgKHN0WzBdICYgMHg0MCkgeworCQkvKiBnZXQgZGF0YSBsZW5ndGggKi8KKwkJaW5zdyhpb2FkZHIsIGJ1ZmZlciwgTmV3RGF0YWdyYW1IZWFkZXJTaXplIC8gMik7CisjaWZkZWYgWFhYREVCVUcKK3ByaW50aygiY20wOiBJUCBpZGVudGlmaWNhdGlvbjogJTAyeCUwMnggIGZyYWdtZW50IG9mZnNldDogJTAyeCUwMnhcbiIsIGJ1ZmZlclszMF0sIGJ1ZmZlclszMV0sIGJ1ZmZlclszMl0sIGJ1ZmZlclszM10pOworI2VuZGlmIC8qIFhYWERFQlVHICovCisJCWlmIChidWZmZXJbMF0gIT0gTmV3RGF0YWdyYW1IZWFkZXJTa2lwKSB7CisJCQlpZiAoc2IxMDAwX2RlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbmV3IGRhdGFncmFtIGhlYWRlciBza2lwIGVycm9yOiAiCisJCQkJCSJnb3QgJTAyeCBleHBlY3RpbmcgJTAyeFxuIiwgZGV2LT5uYW1lLCBidWZmZXJbMF0sCisJCQkJCU5ld0RhdGFncmFtSGVhZGVyU2tpcCk7CisJCQlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaW5zdyhpb2FkZHIsIGJ1ZmZlciwgTmV3RGF0YWdyYW1EYXRhU2l6ZSAvIDIpOworCQkJZ290byBiYWRfZnJhbWVfbmV4dDsKKwkJfQorCQlkbGVuID0gKChidWZmZXJbTmV3RGF0YWdyYW1IZWFkZXJTa2lwICsgM10gJiAweDBmKSA8PCA4IHwKKwkJCWJ1ZmZlcltOZXdEYXRhZ3JhbUhlYWRlclNraXAgKyA0XSkgLSAxNzsKKwkJaWYgKGRsZW4gPiBTQjEwMDBfTVJVKSB7CisJCQlpZiAoc2IxMDAwX2RlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZGF0YWdyYW0gbGVuZ3RoICglZCkgZ3JlYXRlciAiCisJCQkJCSJ0aGFuIE1SVSAoJWQpXG4iLCBkZXYtPm5hbWUsIGRsZW4sIFNCMTAwMF9NUlUpOworCQkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCWluc3coaW9hZGRyLCBidWZmZXIsIE5ld0RhdGFncmFtRGF0YVNpemUgLyAyKTsKKwkJCWdvdG8gYmFkX2ZyYW1lX25leHQ7CisJCX0KKwkJbHAtPnJ4X2RsZW5bbnNdID0gZGxlbjsKKwkJLyogY29tcHV0ZSBzaXplIHRvIGFsbG9jYXRlIGZvciBkYXRhZ3JhbSAqLworCQlza2JzaXplID0gZGxlbiArIEZyYW1lU2l6ZTsKKwkJaWYgKChza2IgPSBhbGxvY19za2Ioc2tic2l6ZSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJCWlmIChzYjEwMDBfZGVidWcgPiAxKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjYW4ndCBhbGxvY2F0ZSAlZCBieXRlcyBsb25nICIKKwkJCQkJInNrYnVmZlxuIiwgZGV2LT5uYW1lLCBza2JzaXplKTsKKwkJCXN0YXRzLT5yeF9kcm9wcGVkKys7CisJCQlpbnN3KGlvYWRkciwgYnVmZmVyLCBOZXdEYXRhZ3JhbURhdGFTaXplIC8gMik7CisJCQlnb3RvIGRyb3BwZWRfZnJhbWU7CisJCX0KKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiLT5wcm90b2NvbCA9ICh1bnNpZ25lZCBzaG9ydCkgYnVmZmVyW05ld0RhdGFncmFtSGVhZGVyU2tpcCArIDE2XTsKKwkJaW5zdyhpb2FkZHIsIHNrYl9wdXQoc2tiLCBOZXdEYXRhZ3JhbURhdGFTaXplKSwKKwkJCU5ld0RhdGFncmFtRGF0YVNpemUgLyAyKTsKKwkJbHAtPnJ4X3NrYltuc10gPSBza2I7CisJfSBlbHNlIHsKKwkJLyogY29udGludWF0aW9uIG9mIHByZXZpb3VzIGRhdGFncmFtICovCisJCWluc3coaW9hZGRyLCBidWZmZXIsIENvbnREYXRhZ3JhbUhlYWRlclNpemUgLyAyKTsKKwkJaWYgKGJ1ZmZlclswXSAhPSBDb250RGF0YWdyYW1IZWFkZXJTa2lwKSB7CisJCQlpZiAoc2IxMDAwX2RlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY29udCBkYXRhZ3JhbSBoZWFkZXIgc2tpcCBlcnJvcjogIgorCQkJCQkiZ290ICUwMnggZXhwZWN0aW5nICUwMnhcbiIsIGRldi0+bmFtZSwgYnVmZmVyWzBdLAorCQkJCQlDb250RGF0YWdyYW1IZWFkZXJTa2lwKTsKKwkJCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpbnN3KGlvYWRkciwgYnVmZmVyLCBDb250RGF0YWdyYW1EYXRhU2l6ZSAvIDIpOworCQkJZ290byBiYWRfZnJhbWVfbmV4dDsKKwkJfQorCQlza2IgPSBscC0+cnhfc2tiW25zXTsKKwkJaW5zdyhpb2FkZHIsIHNrYl9wdXQoc2tiLCBDb250RGF0YWdyYW1EYXRhU2l6ZSksCisJCQlDb250RGF0YWdyYW1EYXRhU2l6ZSAvIDIpOworCQlkbGVuID0gbHAtPnJ4X2RsZW5bbnNdOworCX0KKwlpZiAoc2tiLT5sZW4gPCBkbGVuICsgVHJhaWxlclNpemUpIHsKKwkJbHAtPnJ4X3Nlc3Npb25faWRbbnNdICY9IH4weDQwOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBkYXRhZ3JhbSBjb21wbGV0ZWQ6IHNlbmQgdG8gdXBwZXIgbGV2ZWwgKi8KKwlza2JfdHJpbShza2IsIGRsZW4pOworCW5ldGlmX3J4KHNrYik7CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlzdGF0cy0+cnhfYnl0ZXMrPWRsZW47CisJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlscC0+cnhfc2tiW25zXSA9IE5VTEw7CisJbHAtPnJ4X3Nlc3Npb25faWRbbnNdIHw9IDB4NDA7CisJcmV0dXJuIDA7CisKK2JhZF9mcmFtZToKKwlpbnN3KGlvYWRkciwgYnVmZmVyLCBGcmFtZVNpemUgLyAyKTsKKwlpZiAoc2IxMDAwX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZyYW1lIGVycm9yOiBnb3QgJTAyeCAlMDJ4XG4iLAorCQkJZGV2LT5uYW1lLCBzdFswXSwgc3RbMV0pOworCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMrKzsKK2JhZF9mcmFtZV9uZXh0OgorCWlmIChzYjEwMDBfZGVidWcgPiAyKQorCQlzYjEwMDBfcHJpbnRfc3RhdHVzX2J1ZmZlcihkZXYtPm5hbWUsIHN0LCBidWZmZXIsIEZyYW1lU2l6ZSk7Citkcm9wcGVkX2ZyYW1lOgorCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwlpZiAobnMgPCBOUElEUykgeworCQlpZiAoKHNrYiA9IGxwLT5yeF9za2JbbnNdKSkgeworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJbHAtPnJ4X3NrYltuc10gPSBOVUxMOworCQl9CisJCWxwLT5yeF9zZXNzaW9uX2lkW25zXSB8PSAweDQwOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2IxMDAwX2Vycm9yX2RwYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWNoYXIgKm5hbWU7CisJdW5zaWduZWQgY2hhciBzdFs1XTsKKwlpbnQgaW9hZGRyWzJdOworCXN0cnVjdCBzYjEwMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDBbNl0gPSB7MHg4MCwgMHgyNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisJY29uc3QgaW50IEVycm9yRHBjQ291bnRlckluaXRpYWxpemUgPSAyMDA7CisKKwlpb2FkZHJbMF0gPSBkZXYtPmJhc2VfYWRkcjsKKwkvKiBtZW1fc3RhcnQgaG9sZHMgdGhlIHNlY29uZCBJL08gYWRkcmVzcyAqLworCWlvYWRkclsxXSA9IGRldi0+bWVtX3N0YXJ0OworCW5hbWUgPSBkZXYtPm5hbWU7CisKKwlzYjEwMDBfd2FpdF9mb3JfcmVhZHlfY2xlYXIoaW9hZGRyLCBuYW1lKTsKKwlzYjEwMDBfc2VuZF9jb21tYW5kKGlvYWRkciwgbmFtZSwgQ29tbWFuZDApOworCXNiMTAwMF93YWl0X2Zvcl9yZWFkeShpb2FkZHIsIG5hbWUpOworCXNiMTAwMF9yZWFkX3N0YXR1cyhpb2FkZHIsIHN0KTsKKwlpZiAoc3RbMV0gJiAweDEwKQorCQlscC0+cnhfZXJyb3JfZHBjX2NvdW50ID0gRXJyb3JEcGNDb3VudGVySW5pdGlhbGl6ZTsKKwlyZXR1cm47Cit9CisKKwwKKy8qCisgKiBMaW51eCBpbnRlcmZhY2UgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyBpbnQKK3NiMTAwMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJY2hhciAqbmFtZTsKKwlpbnQgaW9hZGRyWzJdLCBzdGF0dXM7CisJc3RydWN0IHNiMTAwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJY29uc3QgdW5zaWduZWQgc2hvcnQgRmlybXdhcmVWZXJzaW9uW10gPSB7MHgwMSwgMHgwMX07CisKKwlpb2FkZHJbMF0gPSBkZXYtPmJhc2VfYWRkcjsKKwkvKiBtZW1fc3RhcnQgaG9sZHMgdGhlIHNlY29uZCBJL08gYWRkcmVzcyAqLworCWlvYWRkclsxXSA9IGRldi0+bWVtX3N0YXJ0OworCW5hbWUgPSBkZXYtPm5hbWU7CisKKwkvKiBpbml0aWFsaXplIHNiMTAwMCAqLworCWlmICgoc3RhdHVzID0gc2IxMDAwX3Jlc2V0KGlvYWRkciwgbmFtZSkpKQorCQlyZXR1cm4gc3RhdHVzOworCW5pY2VkZWxheSgyMDAwMDApOworCWlmICgoc3RhdHVzID0gc2IxMDAwX2NoZWNrX0NSQyhpb2FkZHIsIG5hbWUpKSkKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIGluaXRpYWxpemUgcHJpdmF0ZSBkYXRhIGJlZm9yZSBib2FyZCBjYW4gY2F0Y2ggaW50ZXJydXB0cyAqLworCWxwLT5yeF9za2JbMF0gPSBOVUxMOworCWxwLT5yeF9za2JbMV0gPSBOVUxMOworCWxwLT5yeF9za2JbMl0gPSBOVUxMOworCWxwLT5yeF9za2JbM10gPSBOVUxMOworCWxwLT5yeF9kbGVuWzBdID0gMDsKKwlscC0+cnhfZGxlblsxXSA9IDA7CisJbHAtPnJ4X2RsZW5bMl0gPSAwOworCWxwLT5yeF9kbGVuWzNdID0gMDsKKwlscC0+cnhfZnJhbWVzID0gMDsKKwlscC0+cnhfZXJyb3JfY291bnQgPSAwOworCWxwLT5yeF9lcnJvcl9kcGNfY291bnQgPSAwOworCWxwLT5yeF9zZXNzaW9uX2lkWzBdID0gMHg1MDsKKwlscC0+cnhfc2Vzc2lvbl9pZFswXSA9IDB4NDg7CisJbHAtPnJ4X3Nlc3Npb25faWRbMF0gPSAweDQ0OworCWxwLT5yeF9zZXNzaW9uX2lkWzBdID0gMHg0MjsKKwlscC0+cnhfZnJhbWVfaWRbMF0gPSAwOworCWxwLT5yeF9mcmFtZV9pZFsxXSA9IDA7CisJbHAtPnJ4X2ZyYW1lX2lkWzJdID0gMDsKKwlscC0+cnhfZnJhbWVfaWRbM10gPSAwOworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgJnNiMTAwMF9pbnRlcnJ1cHQsIDAsICJzYjEwMDAiLCBkZXYpKSB7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWlmIChzYjEwMDBfZGVidWcgPiAyKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE9wZW5pbmcsIElSUSAlZFxuIiwgbmFtZSwgZGV2LT5pcnEpOworCisJLyogQWN0aXZhdGUgYm9hcmQgYW5kIGNoZWNrIGZpcm13YXJlIHZlcnNpb24gKi8KKwl1ZGVsYXkoMTAwMCk7CisJaWYgKChzdGF0dXMgPSBzYjEwMDBfYWN0aXZhdGUoaW9hZGRyLCBuYW1lKSkpCisJCXJldHVybiBzdGF0dXM7CisJdWRlbGF5KDApOworCWlmICgoc3RhdHVzID0gc2IxMDAwX2dldF9maXJtd2FyZV92ZXJzaW9uKGlvYWRkciwgbmFtZSwgdmVyc2lvbiwgMCkpKQorCQlyZXR1cm4gc3RhdHVzOworCWlmICh2ZXJzaW9uWzBdICE9IEZpcm13YXJlVmVyc2lvblswXSB8fCB2ZXJzaW9uWzFdICE9IEZpcm13YXJlVmVyc2lvblsxXSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZvdW5kIGZpcm13YXJlIHZlcnNpb24gJXguJTAyeCAiCisJCQkiKHNob3VsZCBiZSAleC4lMDJ4KVxuIiwgbmFtZSwgdmVyc2lvblswXSwgdmVyc2lvblsxXSwKKwkJCUZpcm13YXJlVmVyc2lvblswXSwgRmlybXdhcmVWZXJzaW9uWzFdKTsKKworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsJCQkJCS8qIEFsd2F5cyBzdWNjZWVkICovCit9CisKK3N0YXRpYyBpbnQgc2IxMDAwX2Rldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwljaGFyKiBuYW1lOworCXVuc2lnbmVkIGNoYXIgdmVyc2lvblsyXTsKKwlzaG9ydCBQSURbNF07CisJaW50IGlvYWRkclsyXSwgc3RhdHVzLCBmcmVxdWVuY3k7CisJdW5zaWduZWQgaW50IHN0YXRzWzVdOworCXN0cnVjdCBzYjEwMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCEoZGV2ICYmIGRldi0+ZmxhZ3MgJiBJRkZfVVApKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlvYWRkclswXSA9IGRldi0+YmFzZV9hZGRyOworCS8qIG1lbV9zdGFydCBob2xkcyB0aGUgc2Vjb25kIEkvTyBhZGRyZXNzICovCisJaW9hZGRyWzFdID0gZGV2LT5tZW1fc3RhcnQ7CisJbmFtZSA9IGRldi0+bmFtZTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR0NNU1RBVFM6CQkvKiBnZXQgc3RhdGlzdGljcyAqLworCQlzdGF0c1swXSA9IGxwLT5zdGF0cy5yeF9ieXRlczsKKwkJc3RhdHNbMV0gPSBscC0+cnhfZnJhbWVzOworCQlzdGF0c1syXSA9IGxwLT5zdGF0cy5yeF9wYWNrZXRzOworCQlzdGF0c1szXSA9IGxwLT5zdGF0cy5yeF9lcnJvcnM7CisJCXN0YXRzWzRdID0gbHAtPnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCWlmKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCBzdGF0cywgc2l6ZW9mKHN0YXRzKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc3RhdHVzID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHQ01GSVJNV0FSRToJCS8qIGdldCBmaXJtd2FyZSB2ZXJzaW9uICovCisJCWlmICgoc3RhdHVzID0gc2IxMDAwX2dldF9maXJtd2FyZV92ZXJzaW9uKGlvYWRkciwgbmFtZSwgdmVyc2lvbiwgMSkpKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJaWYoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsIHZlcnNpb24sIHNpemVvZih2ZXJzaW9uKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHQ01GUkVRVUVOQ1k6CQkvKiBnZXQgZnJlcXVlbmN5ICovCisJCWlmICgoc3RhdHVzID0gc2IxMDAwX2dldF9mcmVxdWVuY3koaW9hZGRyLCBuYW1lLCAmZnJlcXVlbmN5KSkpCisJCQlyZXR1cm4gc3RhdHVzOworCQlpZihwdXRfdXNlcihmcmVxdWVuY3ksIChpbnQgX191c2VyICopIGlmci0+aWZyX2RhdGEpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0NNRlJFUVVFTkNZOgkJLyogc2V0IGZyZXF1ZW5jeSAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZihnZXRfdXNlcihmcmVxdWVuY3ksIChpbnQgX191c2VyICopIGlmci0+aWZyX2RhdGEpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICgoc3RhdHVzID0gc2IxMDAwX3NldF9mcmVxdWVuY3koaW9hZGRyLCBuYW1lLCBmcmVxdWVuY3kpKSkKKwkJCXJldHVybiBzdGF0dXM7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0NNUElEUzoJCQkvKiBnZXQgUElEcyAqLworCQlpZiAoKHN0YXR1cyA9IHNiMTAwMF9nZXRfUElEcyhpb2FkZHIsIG5hbWUsIFBJRCkpKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJaWYoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsIFBJRCwgc2l6ZW9mKFBJRCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0NNUElEUzoJCQkvKiBzZXQgUElEcyAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZihjb3B5X2Zyb21fdXNlcihQSUQsIGlmci0+aWZyX2RhdGEsIHNpemVvZihQSUQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoKHN0YXR1cyA9IHNiMTAwMF9zZXRfUElEcyhpb2FkZHIsIG5hbWUsIFBJRCkpKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJLyogc2V0IHNlc3Npb25faWQsIGZyYW1lX2lkIGFuZCBwa3RfdHlwZSB0b28gKi8KKwkJbHAtPnJ4X3Nlc3Npb25faWRbMF0gPSAweDUwIHwgKFBJRFswXSAmIDB4MGYpOworCQlscC0+cnhfc2Vzc2lvbl9pZFsxXSA9IDB4NDg7CisJCWxwLT5yeF9zZXNzaW9uX2lkWzJdID0gMHg0NDsKKwkJbHAtPnJ4X3Nlc3Npb25faWRbM10gPSAweDQyOworCQlscC0+cnhfZnJhbWVfaWRbMF0gPSAwOworCQlscC0+cnhfZnJhbWVfaWRbMV0gPSAwOworCQlscC0+cnhfZnJhbWVfaWRbMl0gPSAwOworCQlscC0+cnhfZnJhbWVfaWRbM10gPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiB0cmFuc21pdCBmdW5jdGlvbjogZG8gbm90aGluZyBzaW5jZSBTQjEwMDAgY2FuJ3Qgc2VuZCBhbnl0aGluZyBvdXQgKi8KK3N0YXRpYyBpbnQKK3NiMTAwMF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyeWluZyB0byB0cmFuc21pdCEhIVxuIiwgZGV2LT5uYW1lKTsKKwkvKiBzYjEwMDAgY2FuJ3QgeG1pdCBkYXRhZ3JhbXMgKi8KKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKKy8qIFNCMTAwMCBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzYjEwMDBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBjaGFyIHN0OworCWludCBpb2FkZHJbMl07CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IHNiMTAwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwljb25zdCB1bnNpZ25lZCBjaGFyIENvbW1hbmQwWzZdID0gezB4ODAsIDB4MmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDFbNl0gPSB7MHg4MCwgMHgyZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisJY29uc3QgaW50IE1heFJ4RXJyb3JDb3VudCA9IDY7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzYjEwMDBfaW50ZXJydXB0KCk6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLAorCQkJaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlvYWRkclswXSA9IGRldi0+YmFzZV9hZGRyOworCS8qIG1lbV9zdGFydCBob2xkcyB0aGUgc2Vjb25kIEkvTyBhZGRyZXNzICovCisJaW9hZGRyWzFdID0gZGV2LT5tZW1fc3RhcnQ7CisJbmFtZSA9IGRldi0+bmFtZTsKKworCS8qIGlzIGl0IGEgZ29vZCBpbnRlcnJ1cHQ/ICovCisJc3QgPSBpbmIoaW9hZGRyWzFdICsgNik7CisJaWYgKCEoc3QgJiAweDA4ICYmIHN0ICYgMHgyMCkpIHsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlmIChzYjEwMDBfZGVidWcgPiAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVudGVyaW5nIGludGVycnVwdFxuIiwgZGV2LT5uYW1lKTsKKworCXN0ID0gaW5iKGlvYWRkclswXSArIDcpOworCWlmIChzYjEwMDBfcngoZGV2KSkKKwkJbHAtPnJ4X2Vycm9yX2NvdW50Kys7CisjaWZkZWYgU0IxMDAwX0RFTEFZCisJdWRlbGF5KFNCMTAwMF9ERUxBWSk7CisjZW5kaWYgLyogU0IxMDAwX0RFTEFZICovCisJc2IxMDAwX2lzc3VlX3JlYWRfY29tbWFuZChpb2FkZHIsIG5hbWUpOworCWlmIChzdCAmIDB4MDEpIHsKKwkJc2IxMDAwX2Vycm9yX2RwYyhkZXYpOworCQlzYjEwMDBfaXNzdWVfcmVhZF9jb21tYW5kKGlvYWRkciwgbmFtZSk7CisJfQorCWlmIChscC0+cnhfZXJyb3JfZHBjX2NvdW50ICYmICEoLS1scC0+cnhfZXJyb3JfZHBjX2NvdW50KSkgeworCQlzYjEwMDBfd2FpdF9mb3JfcmVhZHlfY2xlYXIoaW9hZGRyLCBuYW1lKTsKKwkJc2IxMDAwX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQwKTsKKwkJc2IxMDAwX3dhaXRfZm9yX3JlYWR5KGlvYWRkciwgbmFtZSk7CisJCXNiMTAwMF9pc3N1ZV9yZWFkX2NvbW1hbmQoaW9hZGRyLCBuYW1lKTsKKwl9CisJaWYgKGxwLT5yeF9lcnJvcl9jb3VudCA+PSBNYXhSeEVycm9yQ291bnQpIHsKKwkJc2IxMDAwX3dhaXRfZm9yX3JlYWR5X2NsZWFyKGlvYWRkciwgbmFtZSk7CisJCXNiMTAwMF9zZW5kX2NvbW1hbmQoaW9hZGRyLCBuYW1lLCBDb21tYW5kMSk7CisJCXNiMTAwMF93YWl0X2Zvcl9yZWFkeShpb2FkZHIsIG5hbWUpOworCQlzYjEwMDBfaXNzdWVfcmVhZF9jb21tYW5kKGlvYWRkciwgbmFtZSk7CisJCWxwLT5yeF9lcnJvcl9jb3VudCA9IDA7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNiMTAwMF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzYjEwMDBfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiAmbHAtPnN0YXRzOworfQorCitzdGF0aWMgaW50IHNiMTAwMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCWludCBpb2FkZHJbMl07CisJc3RydWN0IHNiMTAwMF9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoc2IxMDAwX2RlYnVnID4gMikKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTaHV0dGluZyBkb3duIHNiMTAwMC5cbiIsIGRldi0+bmFtZSk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJaW9hZGRyWzBdID0gZGV2LT5iYXNlX2FkZHI7CisJLyogbWVtX3N0YXJ0IGhvbGRzIHRoZSBzZWNvbmQgSS9PIGFkZHJlc3MgKi8KKwlpb2FkZHJbMV0gPSBkZXYtPm1lbV9zdGFydDsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCS8qIElmIHdlIGRvbid0IGRvIHRoaXMsIHdlIGNhbid0IHJlLWluc21vZCBpdCBsYXRlci4gKi8KKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHJbMV0sIFNCMTAwMF9JT19FWFRFTlQpOworCXJlbGVhc2VfcmVnaW9uKGlvYWRkclswXSwgU0IxMDAwX0lPX0VYVEVOVCk7CisKKwkvKiBmcmVlIHJ4X3NrYidzIGlmIG5lZWRlZCAqLworCWZvciAoaT0wOyBpPDQ7IGkrKykgeworCQlpZiAobHAtPnJ4X3NrYltpXSkgeworCQkJZGV2X2tmcmVlX3NrYihscC0+cnhfc2tiW2ldKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FVVEhPUigiRnJhbmNvIFZlbnR1cmkgPGZ2ZW50dXJpQG1lZGlhb25lLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiR2VuZXJhbCBJbnN0cnVtZW50cyBTQjEwMDAgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgX19pbml0CitzYjEwMDBfaW5pdCh2b2lkKQoreworCXJldHVybiBwbnBfcmVnaXN0ZXJfZHJpdmVyKCZzYjEwMDBfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitzYjEwMDBfZXhpdCh2b2lkKQoreworCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmc2IxMDAwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNiMTAwMF9pbml0KTsKK21vZHVsZV9leGl0KHNiMTAwMF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NiMTI1MC1tYWMuYyBiL2RyaXZlcnMvbmV0L3NiMTI1MC1tYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDJlN2MzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2IxMjUwLW1hYy5jCkBAIC0wLDAgKzEsMjkyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMSwyMDAyLDIwMDMgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiAKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciB0aGUgQnJvYWRjb20gU2lCeXRlIFNPQyBidWlsdC1pbgorICogRXRoZXJuZXQgY29udHJvbGxlcnMuIFdyaXR0ZW4gYnkgTWl0Y2ggTGljaHRlbmJlcmcgYXQgQnJvYWRjb20gQ29ycC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgkJLyogUHJvY2Vzc29yIHR5cGUgZm9yIGNhY2hlIGFsaWdubWVudC4gKi8KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKworLyogVGhpcyBpcyBvbmx5IGhlcmUgdW50aWwgdGhlIGZpcm13YXJlIGlzIHJlYWR5LiAgSW4gdGhhdCBjYXNlLAorICAgdGhlIGZpcm13YXJlIGxlYXZlcyB0aGUgZXRoZXJuZXQgYWRkcmVzcyBpbiB0aGUgcmVnaXN0ZXIgZm9yIHVzLiAqLworI2lmZGVmIENPTkZJR19TSUJZVEVfU1RBTkRBTE9ORQorI2RlZmluZSBTQk1BQ19FVEgwX0hXQUREUiAiNDA6MDA6MDA6MDA6MDE6MDAiCisjZGVmaW5lIFNCTUFDX0VUSDFfSFdBRERSICI0MDowMDowMDowMDowMTowMSIKKyNkZWZpbmUgU0JNQUNfRVRIMl9IV0FERFIgIjQwOjAwOjAwOjAwOjAxOjAyIgorI2VuZGlmCisKKworLyogVGhlc2UgaWRlbnRpZnkgdGhlIGRyaXZlciBiYXNlIHZlcnNpb24gYW5kIG1heSBub3QgYmUgcmVtb3ZlZC4gKi8KKyNpZiAwCitzdGF0aWMgY2hhciB2ZXJzaW9uMVtdIF9fZGV2aW5pdGRhdGEgPQorInNiMTI1MC1tYWMuYzoxLjAwIDEvMTEvMjAwMSBXcml0dGVuIGJ5IE1pdGNoIExpY2h0ZW5iZXJnXG4iOworI2VuZGlmCisKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworCisjZGVmaW5lIENPTkZJR19TQk1BQ19DT0FMRVNDRQorCisjZGVmaW5lIE1BWF9VTklUUyAzCQkvKiBNb3JlIGFyZSBzdXBwb3J0ZWQsIGxpbWl0IG9ubHkgb24gb3B0aW9ucyAqLworCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQgICgyKkhaKQorCisKK01PRFVMRV9BVVRIT1IoIk1pdGNoIExpY2h0ZW5iZXJnIChCcm9hZGNvbSBDb3JwLikiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQnJvYWRjb20gU2lCeXRlIFNPQyBHQiBFdGhlcm5ldCBkcml2ZXIiKTsKKworLyogQSBmZXcgdXNlci1jb25maWd1cmFibGUgdmFsdWVzIHdoaWNoIG1heSBiZSBtb2RpZmllZCB3aGVuIGEgZHJpdmVyCisgICBtb2R1bGUgaXMgbG9hZGVkLiAqLworCisvKiAxIG5vcm1hbCBtZXNzYWdlcywgMCBxdWlldCAuLiA3IHZlcmJvc2UuICovCitzdGF0aWMgaW50IGRlYnVnID0gMTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBtZXNzYWdlcyIpOworCisvKiBtaWkgc3RhdHVzIG1zZ3MgKi8KK3N0YXRpYyBpbnQgbm9pc3lfbWlpID0gMTsKK21vZHVsZV9wYXJhbShub2lzeV9taWksIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKG5vaXN5X21paSwgIk1JSSBzdGF0dXMgbWVzc2FnZXMiKTsKKworLyogVXNlZCB0byBwYXNzIHRoZSBtZWRpYSB0eXBlLCBldGMuCisgICBCb3RoICdvcHRpb25zW10nIGFuZCAnZnVsbF9kdXBsZXhbXScgc2hvdWxkIGV4aXN0IGZvciBkcml2ZXIKKyAgIGludGVyb3BlcmFiaWxpdHkuCisgICBUaGUgbWVkaWEgdHlwZSBpcyB1c3VhbGx5IHBhc3NlZCBpbiAnb3B0aW9uc1tdJy4KKyovCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgaW50IG9wdGlvbnNbTUFYX1VOSVRTXSA9IHstMSwgLTEsIC0xfTsKK21vZHVsZV9wYXJhbV9hcnJheShvcHRpb25zLCBpbnQsIE5VTEwsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhvcHRpb25zLCAiMS0iIF9fTU9EVUxFX1NUUklORyhNQVhfVU5JVFMpKTsKKworc3RhdGljIGludCBmdWxsX2R1cGxleFtNQVhfVU5JVFNdID0gey0xLCAtMSwgLTF9OworbW9kdWxlX3BhcmFtX2FycmF5KGZ1bGxfZHVwbGV4LCBpbnQsIE5VTEwsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhmdWxsX2R1cGxleCwgIjEtIiBfX01PRFVMRV9TVFJJTkcoTUFYX1VOSVRTKSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TQk1BQ19DT0FMRVNDRQorc3RhdGljIGludCBpbnRfcGt0Y250ID0gMDsKK21vZHVsZV9wYXJhbShpbnRfcGt0Y250LCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhpbnRfcGt0Y250LCAiUGFja2V0IGNvdW50Iik7CisKK3N0YXRpYyBpbnQgaW50X3RpbWVvdXQgPSAwOworbW9kdWxlX3BhcmFtKGludF90aW1lb3V0LCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhpbnRfdGltZW91dCwgIlRpbWVvdXQgdmFsdWUiKTsKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTAuaD4KKyNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MF9kZWZzLmg+CisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfcmVncy5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwX21hYy5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwX2RtYS5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwX2ludC5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwX3NjZC5oPgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU2ltcGxlIHR5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHNibWFjX3BvcnRfdDsKKwordHlwZWRlZiBlbnVtIHsgc2JtYWNfc3BlZWRfYXV0bywgc2JtYWNfc3BlZWRfMTAsCisJICAgICAgIHNibWFjX3NwZWVkXzEwMCwgc2JtYWNfc3BlZWRfMTAwMCB9IHNibWFjX3NwZWVkX3Q7CisKK3R5cGVkZWYgZW51bSB7IHNibWFjX2R1cGxleF9hdXRvLCBzYm1hY19kdXBsZXhfaGFsZiwKKwkgICAgICAgc2JtYWNfZHVwbGV4X2Z1bGwgfSBzYm1hY19kdXBsZXhfdDsKKwordHlwZWRlZiBlbnVtIHsgc2JtYWNfZmNfYXV0bywgc2JtYWNfZmNfZGlzYWJsZWQsIHNibWFjX2ZjX2ZyYW1lLAorCSAgICAgICBzYm1hY19mY19jb2xsaXNpb24sIHNibWFjX2ZjX2NhcnJpZXIgfSBzYm1hY19mY190OworCit0eXBlZGVmIGVudW0geyBzYm1hY19zdGF0ZV91bmluaXQsIHNibWFjX3N0YXRlX29mZiwgc2JtYWNfc3RhdGVfb24sIAorCSAgICAgICBzYm1hY19zdGF0ZV9icm9rZW4gfSBzYm1hY19zdGF0ZV90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgTWFjcm9zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKworI2RlZmluZSBTQkRNQV9ORVhUQlVGKGQsZikgKCgoKGQpLT5mKzEpID09IChkKS0+c2JkbWFfZHNjcnRhYmxlX2VuZCkgPyBcCisJCQkgIChkKS0+c2JkbWFfZHNjcnRhYmxlIDogKGQpLT5mKzEpCisKKworI2RlZmluZSBOVU1DQUNIRUJMS1MoeCkgKCgoeCkrU01QX0NBQ0hFX0JZVEVTLTEpL1NNUF9DQUNIRV9CWVRFUykKKworI2RlZmluZSBTQk1BQ19SRUFEQ1NSKHQpCV9fcmF3X3JlYWRxKCh1bnNpZ25lZCBsb25nKXQpCisjZGVmaW5lIFNCTUFDX1dSSVRFQ1NSKHQsdikJX19yYXdfd3JpdGVxKHYsICh1bnNpZ25lZCBsb25nKXQpCisgCisKKyNkZWZpbmUgU0JNQUNfTUFYX1RYREVTQ1IJMzIKKyNkZWZpbmUgU0JNQUNfTUFYX1JYREVTQ1IJMzIKKworI2RlZmluZSBFVEhFUl9BTElHTgkyCisjZGVmaW5lIEVUSEVSX0FERFJfTEVOCTYKKyNkZWZpbmUgRU5FVF9QQUNLRVRfU0laRQkxNTE4IAorLyojZGVmaW5lIEVORVRfUEFDS0VUX1NJWkUJOTIxNiAqLyAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBETUEgRGVzY3JpcHRvciBzdHJ1Y3R1cmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc2JkbWFkc2NyX3MgeworCXVpbnQ2NF90ICBkc2NyX2E7CisJdWludDY0X3QgIGRzY3JfYjsKK30gc2JkbWFkc2NyX3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBwYWRkcl90OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIERNQSBDb250cm9sbGVyIHN0cnVjdHVyZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCit0eXBlZGVmIHN0cnVjdCBzYm1hY2RtYV9zIHsKKwkKKwkvKiAKKwkgKiBUaGlzIHN0dWZmIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGNoYW5uZWwgYW5kIHRoZSByZWdpc3RlcnMKKwkgKiBhc3NvY2lhdGVkIHdpdGggaXQuCisJICovCisJCisJc3RydWN0IHNibWFjX3NvZnRjICpzYmRtYV9ldGg7CSAgICAgICAgLyogYmFjayBwb2ludGVyIHRvIGFzc29jaWF0ZWQgTUFDICovCisJaW50ICAgICAgICAgICAgICBzYmRtYV9jaGFubmVsOwkvKiBjaGFubmVsIG51bWJlciAqLworCWludAkJIHNiZG1hX3R4ZGlyOyAgICAgICAvKiBkaXJlY3Rpb24gKDE9dHJhbnNtaXQpICovCisJaW50CQkgc2JkbWFfbWF4ZGVzY3I7CS8qIHRvdGFsICMgb2YgZGVzY3JpcHRvcnMgaW4gcmluZyAqLworI2lmZGVmIENPTkZJR19TQk1BQ19DT0FMRVNDRQorCWludAkJIHNiZG1hX2ludF9wa3RjbnQ7ICAvKiAjIGRlc2NyaXB0b3JzIHJ4L3R4IGJlZm9yZSBpbnRlcnJ1cHQqLworCWludAkJIHNiZG1hX2ludF90aW1lb3V0OyAvKiAjIHVzZWMgcngvdHggaW50ZXJydXB0ICovCisjZW5kaWYKKworCXNibWFjX3BvcnRfdCAgICAgc2JkbWFfY29uZmlnMDsJLyogRE1BIGNvbmZpZyByZWdpc3RlciAwICovCisJc2JtYWNfcG9ydF90ICAgICBzYmRtYV9jb25maWcxOwkvKiBETUEgY29uZmlnIHJlZ2lzdGVyIDEgKi8KKwlzYm1hY19wb3J0X3QgICAgIHNiZG1hX2RzY3JiYXNlOwkvKiBEZXNjcmlwdG9yIGJhc2UgYWRkcmVzcyAqLworCXNibWFjX3BvcnRfdCAgICAgc2JkbWFfZHNjcmNudDsgICAgIC8qIERlc2NyaXB0b3IgY291bnQgcmVnaXN0ZXIgKi8KKwlzYm1hY19wb3J0X3QgICAgIHNiZG1hX2N1cmRzY3I7CS8qIGN1cnJlbnQgZGVzY3JpcHRvciBhZGRyZXNzICovCisJCisJLyoKKwkgKiBUaGlzIHN0dWZmIGlzIGZvciBtYWludGVuYW5jZSBvZiB0aGUgcmluZworCSAqLworCQorCXNiZG1hZHNjcl90ICAgICAqc2JkbWFfZHNjcnRhYmxlOwkvKiBiYXNlIG9mIGRlc2NyaXB0b3IgdGFibGUgKi8KKwlzYmRtYWRzY3JfdCAgICAgKnNiZG1hX2RzY3J0YWJsZV9lbmQ7IC8qIGVuZCBvZiBkZXNjcmlwdG9yIHRhYmxlICovCisJCisJc3RydWN0IHNrX2J1ZmYgKipzYmRtYV9jdHh0YWJsZTsgICAgLyogY29udGV4dCB0YWJsZSwgb25lIHBlciBkZXNjciAqLworCQorCXBhZGRyX3QgICAgICAgICAgc2JkbWFfZHNjcnRhYmxlX3BoeXM7IC8qIGFuZCBhbHNvIHRoZSBwaHlzIGFkZHIgKi8KKwlzYmRtYWRzY3JfdCAgICAgKnNiZG1hX2FkZHB0cjsJLyogbmV4dCBkc2NyIGZvciBzdyB0byBhZGQgKi8KKwlzYmRtYWRzY3JfdCAgICAgKnNiZG1hX3JlbXB0cjsJLyogbmV4dCBkc2NyIGZvciBzdyB0byByZW1vdmUgKi8KK30gc2JtYWNkbWFfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEV0aGVybmV0IHNvZnRjIHN0cnVjdHVyZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdHJ1Y3Qgc2JtYWNfc29mdGMgeworCQorCS8qCisJICogTGludXgtc3BlY2lmaWMgdGhpbmdzCisJICovCisJCisJc3RydWN0IG5ldF9kZXZpY2UgKnNibV9kZXY7CQkvKiBwb2ludGVyIHRvIGxpbnV4IGRldmljZSAqLworCXNwaW5sb2NrX3Qgc2JtX2xvY2s7CQkvKiBzcGluIGxvY2sgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBzYm1fdGltZXI7ICAgICAJLyogZm9yIG1vbml0b3JpbmcgTUlJICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc2JtX3N0YXRzOyAKKwlpbnQgc2JtX2RldmZsYWdzOwkJCS8qIGN1cnJlbnQgZGV2aWNlIGZsYWdzICovCisKKwlpbnQJICAgICBzYm1fcGh5X29sZGJtc3I7CisJaW50CSAgICAgc2JtX3BoeV9vbGRhbmxwYXI7CisJaW50CSAgICAgc2JtX3BoeV9vbGRrMXN0c3I7CisJaW50CSAgICAgc2JtX3BoeV9vbGRsaW5rc3RhdDsKKwlpbnQgc2JtX2J1ZmZlcnNpemU7CisJCisJdW5zaWduZWQgY2hhciBzYm1fcGh5c1syXTsKKwkKKwkvKgorCSAqIENvbnRyb2xsZXItc3BlY2lmaWMgdGhpbmdzCisJICovCisJCisJdW5zaWduZWQgbG9uZwlzYm1fYmFzZTsgICAgICAgICAgLyogTUFDJ3MgYmFzZSBhZGRyZXNzICovCisJc2JtYWNfc3RhdGVfdCAgICBzYm1fc3RhdGU7ICAgICAgICAgLyogY3VycmVudCBzdGF0ZSAqLworCQorCXNibWFjX3BvcnRfdCAgICAgc2JtX21hY2VuYWJsZTsJLyogTUFDIEVuYWJsZSBSZWdpc3RlciAqLworCXNibWFjX3BvcnRfdCAgICAgc2JtX21hY2NmZzsJLyogTUFDIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKwlzYm1hY19wb3J0X3QgICAgIHNibV9maWZvY2ZnOwkvKiBGSUZPIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKwlzYm1hY19wb3J0X3QgICAgIHNibV9mcmFtZWNmZzsJLyogRnJhbWUgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworCXNibWFjX3BvcnRfdCAgICAgc2JtX3J4ZmlsdGVyOwkvKiByZWNlaXZlIGZpbHRlciByZWdpc3RlciAqLworCXNibWFjX3BvcnRfdCAgICAgc2JtX2lzcjsJCS8qIEludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKwlzYm1hY19wb3J0X3QgICAgIHNibV9pbXI7CQkvKiBJbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworCXNibWFjX3BvcnRfdCAgICAgc2JtX21kaW87CQkvKiBNRElPIHJlZ2lzdGVyICovCisJCisJc2JtYWNfc3BlZWRfdCAgICBzYm1fc3BlZWQ7CQkvKiBjdXJyZW50IHNwZWVkICovCisJc2JtYWNfZHVwbGV4X3QgICBzYm1fZHVwbGV4OwkvKiBjdXJyZW50IGR1cGxleCAqLworCXNibWFjX2ZjX3QgICAgICAgc2JtX2ZjOwkJLyogY3VycmVudCBmbG93IGNvbnRyb2wgc2V0dGluZyAqLworCQorCXVuc2lnbmVkIGNoYXIgICAgc2JtX2h3YWRkcltFVEhFUl9BRERSX0xFTl07CisJCisJc2JtYWNkbWFfdCAgICAgICBzYm1fdHhkbWE7CQkvKiBmb3Igbm93LCBvbmx5IHVzZSBjaGFubmVsIDAgKi8KKwlzYm1hY2RtYV90ICAgICAgIHNibV9yeGRtYTsKKwlpbnQgICAgICAgICAgICAgIHJ4X2h3X2NoZWNrc3VtOworCWludCAJCSBzYmVfaWR4OworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEV4dGVybnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBQcm90b3R5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB2b2lkIHNiZG1hX2luaXRjdHgoc2JtYWNkbWFfdCAqZCwKKwkJCSAgc3RydWN0IHNibWFjX3NvZnRjICpzLAorCQkJICBpbnQgY2hhbiwKKwkJCSAgaW50IHR4cngsCisJCQkgIGludCBtYXhkZXNjcik7CitzdGF0aWMgdm9pZCBzYmRtYV9jaGFubmVsX3N0YXJ0KHNibWFjZG1hX3QgKmQsIGludCByeHR4KTsKK3N0YXRpYyBpbnQgc2JkbWFfYWRkX3JjdmJ1ZmZlcihzYm1hY2RtYV90ICpkLHN0cnVjdCBza19idWZmICptKTsKK3N0YXRpYyBpbnQgc2JkbWFfYWRkX3R4YnVmZmVyKHNibWFjZG1hX3QgKmQsc3RydWN0IHNrX2J1ZmYgKm0pOworc3RhdGljIHZvaWQgc2JkbWFfZW1wdHlyaW5nKHNibWFjZG1hX3QgKmQpOworc3RhdGljIHZvaWQgc2JkbWFfZmlsbHJpbmcoc2JtYWNkbWFfdCAqZCk7CitzdGF0aWMgdm9pZCBzYmRtYV9yeF9wcm9jZXNzKHN0cnVjdCBzYm1hY19zb2Z0YyAqc2Msc2JtYWNkbWFfdCAqZCk7CitzdGF0aWMgdm9pZCBzYmRtYV90eF9wcm9jZXNzKHN0cnVjdCBzYm1hY19zb2Z0YyAqc2Msc2JtYWNkbWFfdCAqZCk7CitzdGF0aWMgaW50IHNibWFjX2luaXRjdHgoc3RydWN0IHNibWFjX3NvZnRjICpzKTsKK3N0YXRpYyB2b2lkIHNibWFjX2NoYW5uZWxfc3RhcnQoc3RydWN0IHNibWFjX3NvZnRjICpzKTsKK3N0YXRpYyB2b2lkIHNibWFjX2NoYW5uZWxfc3RvcChzdHJ1Y3Qgc2JtYWNfc29mdGMgKnMpOworc3RhdGljIHNibWFjX3N0YXRlX3Qgc2JtYWNfc2V0X2NoYW5uZWxfc3RhdGUoc3RydWN0IHNibWFjX3NvZnRjICosc2JtYWNfc3RhdGVfdCk7CitzdGF0aWMgdm9pZCBzYm1hY19wcm9taXNjdW91c19tb2RlKHN0cnVjdCBzYm1hY19zb2Z0YyAqc2MsaW50IG9ub2ZmKTsKK3N0YXRpYyB1aW50NjRfdCBzYm1hY19hZGRyMnJlZyh1bnNpZ25lZCBjaGFyICpwdHIpOworc3RhdGljIGlycXJldHVybl90IHNibWFjX2ludHIoaW50IGlycSx2b2lkICpkZXZfaW5zdGFuY2Usc3RydWN0IHB0X3JlZ3MgKnJncyk7CitzdGF0aWMgaW50IHNibWFjX3N0YXJ0X3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2JtYWNfc2V0bXVsdGkoc3RydWN0IHNibWFjX3NvZnRjICpzYyk7CitzdGF0aWMgaW50IHNibWFjX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlkeCk7CitzdGF0aWMgaW50IHNibWFjX3NldF9zcGVlZChzdHJ1Y3Qgc2JtYWNfc29mdGMgKnMsc2JtYWNfc3BlZWRfdCBzcGVlZCk7CitzdGF0aWMgaW50IHNibWFjX3NldF9kdXBsZXgoc3RydWN0IHNibWFjX3NvZnRjICpzLHNibWFjX2R1cGxleF90IGR1cGxleCxzYm1hY19mY190IGZjKTsKKworc3RhdGljIGludCBzYm1hY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2JtYWNfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHNibWFjX3R4X3RpbWVvdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzYm1hY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzYm1hY19zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc2JtYWNfbWlpX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworc3RhdGljIGludCBzYm1hY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc2JtYWNfbWlpX3BvbGwoc3RydWN0IHNibWFjX3NvZnRjICpzLGludCBub2lzeSk7CisKK3N0YXRpYyB2b2lkIHNibWFjX21paV9zeW5jKHN0cnVjdCBzYm1hY19zb2Z0YyAqcyk7CitzdGF0aWMgdm9pZCBzYm1hY19taWlfc2VuZGRhdGEoc3RydWN0IHNibWFjX3NvZnRjICpzLHVuc2lnbmVkIGludCBkYXRhLCBpbnQgYml0Y250KTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2JtYWNfbWlpX3JlYWQoc3RydWN0IHNibWFjX3NvZnRjICpzLGludCBwaHlhZGRyLGludCByZWdpZHgpOworc3RhdGljIHZvaWQgc2JtYWNfbWlpX3dyaXRlKHN0cnVjdCBzYm1hY19zb2Z0YyAqcyxpbnQgcGh5YWRkcixpbnQgcmVnaWR4LAorCQkJICAgIHVuc2lnbmVkIGludCByZWd2YWwpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgR2xvYmFscworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgdWludDY0X3Qgc2JtYWNfb3JpZ19od2FkZHJbTUFYX1VOSVRTXTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE1ESU8gY29uc3RhbnRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKyNkZWZpbmUJTUlJX0NPTU1BTkRfU1RBUlQJMHgwMQorI2RlZmluZQlNSUlfQ09NTUFORF9SRUFECTB4MDIKKyNkZWZpbmUJTUlJX0NPTU1BTkRfV1JJVEUJMHgwMQorI2RlZmluZQlNSUlfQ09NTUFORF9BQ0sJCTB4MDIKKworI2RlZmluZSBCTUNSX1JFU0VUICAgICAweDgwMDAKKyNkZWZpbmUgQk1DUl9MT09QQkFDSyAgMHg0MDAwCisjZGVmaW5lIEJNQ1JfU1BFRUQwICAgIDB4MjAwMAorI2RlZmluZSBCTUNSX0FORU5BQkxFICAweDEwMDAKKyNkZWZpbmUgQk1DUl9QT1dFUkRPV04gMHgwODAwCisjZGVmaW5lIEJNQ1JfSVNPTEFURSAgIDB4MDQwMAorI2RlZmluZSBCTUNSX1JFU1RBUlRBTiAweDAyMDAKKyNkZWZpbmUgQk1DUl9EVVBMRVggICAgMHgwMTAwCisjZGVmaW5lIEJNQ1JfQ09MVEVTVCAgIDB4MDA4MAorI2RlZmluZSBCTUNSX1NQRUVEMSAgICAweDAwNDAKKyNkZWZpbmUgQk1DUl9TUEVFRDEwMDAJQk1DUl9TUEVFRDEKKyNkZWZpbmUgQk1DUl9TUEVFRDEwMAlCTUNSX1NQRUVEMAorI2RlZmluZSBCTUNSX1NQRUVEMTAgCTAKKworI2RlZmluZSBCTVNSXzEwMEJUNAkweDgwMDAKKyNkZWZpbmUgQk1TUl8xMDBCVF9GRFgJMHg0MDAwCisjZGVmaW5lIEJNU1JfMTAwQlRfSERYICAweDIwMDAKKyNkZWZpbmUgQk1TUl8xMEJUX0ZEWCAgIDB4MTAwMAorI2RlZmluZSBCTVNSXzEwQlRfSERYICAgMHgwODAwCisjZGVmaW5lIEJNU1JfMTAwQlQyX0ZEWCAweDA0MDAKKyNkZWZpbmUgQk1TUl8xMDBCVDJfSERYIDB4MDIwMAorI2RlZmluZSBCTVNSXzEwMDBCVF9YU1IJMHgwMTAwCisjZGVmaW5lIEJNU1JfUFJFU1VQCTB4MDA0MAorI2RlZmluZSBCTVNSX0FOQ09NUExUCTB4MDAyMAorI2RlZmluZSBCTVNSX1JFTUZBVUxUCTB4MDAxMAorI2RlZmluZSBCTVNSX0FVVE9ORUcJMHgwMDA4CisjZGVmaW5lIEJNU1JfTElOS1NUQVQJMHgwMDA0CisjZGVmaW5lIEJNU1JfSkFCREVURUNUCTB4MDAwMgorI2RlZmluZSBCTVNSX0VYVENBUEFCCTB4MDAwMQorCisjZGVmaW5lIFBIWUlEUjEgCTB4MjAwMAorI2RlZmluZSBQSFlJRFIyCQkweDVDNjAKKworI2RlZmluZSBBTkFSX05QCQkweDgwMDAKKyNkZWZpbmUgQU5BUl9SRgkJMHgyMDAwCisjZGVmaW5lIEFOQVJfQVNZUEFVU0UJMHgwODAwCisjZGVmaW5lIEFOQVJfUEFVU0UJMHgwNDAwCisjZGVmaW5lIEFOQVJfVDQJCTB4MDIwMAorI2RlZmluZSBBTkFSX1RYRkQJMHgwMTAwCisjZGVmaW5lIEFOQVJfVFhIRAkweDAwODAKKyNkZWZpbmUgQU5BUl8xMEZECTB4MDA0MAorI2RlZmluZSBBTkFSXzEwSEQJMHgwMDIwCisjZGVmaW5lIEFOQVJfUFNCCTB4MDAwMQorCisjZGVmaW5lIEFOTFBBUl9OUAkweDgwMDAKKyNkZWZpbmUgQU5MUEFSX0FDSwkweDQwMDAKKyNkZWZpbmUgQU5MUEFSX1JGCTB4MjAwMAorI2RlZmluZSBBTkxQQVJfQVNZUEFVU0UJMHgwODAwCisjZGVmaW5lIEFOTFBBUl9QQVVTRQkweDA0MDAKKyNkZWZpbmUgQU5MUEFSX1Q0CTB4MDIwMAorI2RlZmluZSBBTkxQQVJfVFhGRAkweDAxMDAKKyNkZWZpbmUgQU5MUEFSX1RYSEQJMHgwMDgwCisjZGVmaW5lIEFOTFBBUl8xMEZECTB4MDA0MAorI2RlZmluZSBBTkxQQVJfMTBIRAkweDAwMjAKKyNkZWZpbmUgQU5MUEFSX1BTQgkweDAwMDEJLyogODAyLjMgKi8KKworI2RlZmluZSBBTkVSX1BERgkweDAwMTAKKyNkZWZpbmUgQU5FUl9MUE5QQUJMRQkweDAwMDgKKyNkZWZpbmUgQU5FUl9OUEFCTEUJMHgwMDA0CisjZGVmaW5lIEFORVJfUEFHRVJYCTB4MDAwMgorI2RlZmluZSBBTkVSX0xQQU5BQkxFCTB4MDAwMQorCisjZGVmaW5lIEFOTlBUUl9OUAkweDgwMDAKKyNkZWZpbmUgQU5OUFRSX01QCTB4MjAwMAorI2RlZmluZSBBTk5QVFJfQUNLMgkweDEwMDAKKyNkZWZpbmUgQU5OUFRSX1RPR1RYCTB4MDgwMAorI2RlZmluZSBBTk5QVFJfQ09ERQkweDAwMDgKKworI2RlZmluZSBBTk5QUlJfTlAJMHg4MDAwCisjZGVmaW5lIEFOTlBSUl9NUAkweDIwMDAKKyNkZWZpbmUgQU5OUFJSX0FDSzMJMHgxMDAwCisjZGVmaW5lIEFOTlBSUl9UT0dUWAkweDA4MDAKKyNkZWZpbmUgQU5OUFJSX0NPREUJMHgwMDA4CisKKyNkZWZpbmUgSzFUQ1JfVEVTVE1PREUJMHgwMDAwCisjZGVmaW5lIEsxVENSX01TTUNFCTB4MTAwMAorI2RlZmluZSBLMVRDUl9NU0NWCTB4MDgwMAorI2RlZmluZSBLMVRDUl9SUFRSCTB4MDQwMAorI2RlZmluZSBLMVRDUl8xMDAwQlRfRkRYIDB4MjAwCisjZGVmaW5lIEsxVENSXzEwMDBCVF9IRFggMHgxMDAKKworI2RlZmluZSBLMVNUU1JfTVNNQ0ZMVAkweDgwMDAKKyNkZWZpbmUgSzFTVFNSX01TQ0ZHUkVTCTB4NDAwMAorI2RlZmluZSBLMVNUU1JfTFJTVEFUCTB4MjAwMAorI2RlZmluZSBLMVNUU1JfUlJTVEFUCTB4MTAwMAorI2RlZmluZSBLMVNUU1JfTFAxS0ZECTB4MDgwMAorI2RlZmluZSBLMVNUU1JfTFAxS0hEICAgMHgwNDAwCisjZGVmaW5lIEsxU1RTUl9MUEFTTURJUgkweDAyMDAKKworI2RlZmluZSBLMVNDUl8xS1hfRkRYCTB4ODAwMAorI2RlZmluZSBLMVNDUl8xS1hfSERYCTB4NDAwMAorI2RlZmluZSBLMVNDUl8xS1RfRkRYCTB4MjAwMAorI2RlZmluZSBLMVNDUl8xS1RfSERYCTB4MTAwMAorCisjZGVmaW5lIFNUUkFQX1BIWTEJMHgwODAwCisjZGVmaW5lIFNUUkFQX05DTU9ERQkweDA0MDAKKyNkZWZpbmUgU1RSQVBfTUFOTVNDRkcJMHgwMjAwCisjZGVmaW5lIFNUUkFQX0FORU5BQkxFCTB4MDEwMAorI2RlZmluZSBTVFJBUF9NU1ZBTAkweDAwODAKKyNkZWZpbmUgU1RSQVBfMUtIRFhBRFYJMHgwMDEwCisjZGVmaW5lIFNUUkFQXzFLRkRYQURWCTB4MDAwOAorI2RlZmluZSBTVFJBUF8xMDBBRFYJMHgwMDA0CisjZGVmaW5lIFNUUkFQX1NQRUVEU0VMCTB4MDAwMAorI2RlZmluZSBTVFJBUF9TUEVFRDEwMAkweDAwMDEKKworI2RlZmluZSBQSFlTVVBfU1BFRUQxMDAwIDB4MTAKKyNkZWZpbmUgUEhZU1VQX1NQRUVEMTAwICAweDA4CisjZGVmaW5lIFBIWVNVUF9TUEVFRDEwICAgMHgwMAorI2RlZmluZSBQSFlTVVBfTElOS1VQCSAweDA0CisjZGVmaW5lIFBIWVNVUF9GRFggICAgICAgMHgwMgorCisjZGVmaW5lCU1JSV9CTUNSCTB4MDAgCS8qIEJhc2ljIG1vZGUgY29udHJvbCByZWdpc3RlciAocncpICovCisjZGVmaW5lCU1JSV9CTVNSCTB4MDEJLyogQmFzaWMgbW9kZSBzdGF0dXMgcmVnaXN0ZXIgKHJvKSAqLworI2RlZmluZSBNSUlfSzFTVFNSCTB4MEEJLyogMUsgU3RhdHVzIFJlZ2lzdGVyIChybykgKi8KKyNkZWZpbmUJTUlJX0FOTFBBUgkweDA1CS8qIEF1dG9uZWdvdGlhdGlvbiBsbmsgcGFydG5lciBhYmlsaXRpZXMgKHJ3KSAqLworCisKKyNkZWZpbmUgTV9NQUNfTURJT19ESVJfT1VUUFVUCTAJCS8qIGZvciBjbGFyaXR5ICovCisKKyNkZWZpbmUgRU5BQkxFIAkJMQorI2RlZmluZSBESVNBQkxFCQkwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU0JNQUNfTUlJX1NZTkMocykKKyAqICAKKyAqICBTeW5jaHJvbml6ZSB3aXRoIHRoZSBNSUkgLSBzZW5kIGEgcGF0dGVybiBvZiBiaXRzIHRvIHRoZSBNSUkKKyAqICB0aGF0IHdpbGwgZ3VhcmFudGVlIHRoYXQgaXQgaXMgcmVhZHkgdG8gYWNjZXB0IGEgY29tbWFuZC4KKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgcyAtIHNibWFjIHN0cnVjdHVyZQorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHZvaWQgc2JtYWNfbWlpX3N5bmMoc3RydWN0IHNibWFjX3NvZnRjICpzKQoreworCWludCBjbnQ7CisJdWludDY0X3QgYml0czsKKwlpbnQgbWFjX21kaW9fZ2VuYzsKKworCW1hY19tZGlvX2dlbmMgPSBTQk1BQ19SRUFEQ1NSKHMtPnNibV9tZGlvKSAmIE1fTUFDX0dFTkM7CisJCisJYml0cyA9IE1fTUFDX01ESU9fRElSX09VVFBVVCB8IE1fTUFDX01ESU9fT1VUOworCQorCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9tZGlvLGJpdHMgfCBtYWNfbWRpb19nZW5jKTsKKwkKKwlmb3IgKGNudCA9IDA7IGNudCA8IDMyOyBjbnQrKykgeworCQlTQk1BQ19XUklURUNTUihzLT5zYm1fbWRpbyxiaXRzIHwgTV9NQUNfTURDIHwgbWFjX21kaW9fZ2VuYyk7CisJCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9tZGlvLGJpdHMgfCBtYWNfbWRpb19nZW5jKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU0JNQUNfTUlJX1NFTkREQVRBKHMsZGF0YSxiaXRjbnQpCisgKiAgCisgKiAgU2VuZCBzb21lIGJpdHMgdG8gdGhlIE1JSS4gIFRoZSBiaXRzIHRvIGJlIHNlbnQgYXJlIHJpZ2h0LQorICogIGp1c3RpZmllZCBpbiB0aGUgJ2RhdGEnIHBhcmFtZXRlci4KKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgcyAtIHNibWFjIHN0cnVjdHVyZQorICogIAkgICBkYXRhIC0gZGF0YSB0byBzZW5kCisgKiAgCSAgIGJpdGNudCAtIG51bWJlciBvZiBiaXRzIHRvIHNlbmQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHZvaWQgc2JtYWNfbWlpX3NlbmRkYXRhKHN0cnVjdCBzYm1hY19zb2Z0YyAqcyx1bnNpZ25lZCBpbnQgZGF0YSwgaW50IGJpdGNudCkKK3sKKwlpbnQgaTsKKwl1aW50NjRfdCBiaXRzOworCXVuc2lnbmVkIGludCBjdXJtYXNrOworCWludCBtYWNfbWRpb19nZW5jOworCisJbWFjX21kaW9fZ2VuYyA9IFNCTUFDX1JFQURDU1Iocy0+c2JtX21kaW8pICYgTV9NQUNfR0VOQzsKKwkKKwliaXRzID0gTV9NQUNfTURJT19ESVJfT1VUUFVUOworCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9tZGlvLGJpdHMgfCBtYWNfbWRpb19nZW5jKTsKKwkKKwljdXJtYXNrID0gMSA8PCAoYml0Y250IC0gMSk7CisJCisJZm9yIChpID0gMDsgaSA8IGJpdGNudDsgaSsrKSB7CisJCWlmIChkYXRhICYgY3VybWFzaykKKwkJCWJpdHMgfD0gTV9NQUNfTURJT19PVVQ7CisJCWVsc2UgYml0cyAmPSB+TV9NQUNfTURJT19PVVQ7CisJCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9tZGlvLGJpdHMgfCBtYWNfbWRpb19nZW5jKTsKKwkJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX21kaW8sYml0cyB8IE1fTUFDX01EQyB8IG1hY19tZGlvX2dlbmMpOworCQlTQk1BQ19XUklURUNTUihzLT5zYm1fbWRpbyxiaXRzIHwgbWFjX21kaW9fZ2VuYyk7CisJCWN1cm1hc2sgPj49IDE7CisJfQorfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19NSUlfUkVBRChzLHBoeWFkZHIscmVnaWR4KQorICogIAorICogIFJlYWQgYSBQSFkgcmVnaXN0ZXIuCisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIHMgLSBzYm1hYyBzdHJ1Y3R1cmUKKyAqICAJICAgcGh5YWRkciAtIFBIWSdzIGFkZHJlc3MKKyAqICAJICAgcmVnaWR4ID0gaW5kZXggb2YgcmVnaXN0ZXIgdG8gcmVhZAorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIHZhbHVlIHJlYWQsIG9yIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2JtYWNfbWlpX3JlYWQoc3RydWN0IHNibWFjX3NvZnRjICpzLGludCBwaHlhZGRyLGludCByZWdpZHgpCit7CisJaW50IGlkeDsKKwlpbnQgZXJyb3I7CisJaW50IHJlZ3ZhbDsKKwlpbnQgbWFjX21kaW9fZ2VuYzsKKworCS8qCisJICogU3luY2hyb25pemUgb3Vyc2VsdmVzIHNvIHRoYXQgdGhlIFBIWSBrbm93cyB0aGUgbmV4dAorCSAqIHRoaW5nIGNvbWluZyBkb3duIGlzIGEgY29tbWFuZAorCSAqLworCQorCXNibWFjX21paV9zeW5jKHMpOworCQorCS8qCisJICogU2VuZCB0aGUgZGF0YSB0byB0aGUgUEhZLiAgVGhlIHNlcXVlbmNlIGlzCisJICogYSAic3RhcnQiIGNvbW1hbmQgKDIgYml0cykKKwkgKiBhICJyZWFkIiBjb21tYW5kICgyIGJpdHMpCisJICogdGhlIFBIWSBhZGRyICg1IGJpdHMpCisJICogdGhlIHJlZ2lzdGVyIGluZGV4ICg1IGJpdHMpCisJICovCisJCisJc2JtYWNfbWlpX3NlbmRkYXRhKHMsTUlJX0NPTU1BTkRfU1RBUlQsIDIpOworCXNibWFjX21paV9zZW5kZGF0YShzLE1JSV9DT01NQU5EX1JFQUQsIDIpOworCXNibWFjX21paV9zZW5kZGF0YShzLHBoeWFkZHIsIDUpOworCXNibWFjX21paV9zZW5kZGF0YShzLHJlZ2lkeCwgNSk7CisJCisJbWFjX21kaW9fZ2VuYyA9IFNCTUFDX1JFQURDU1Iocy0+c2JtX21kaW8pICYgTV9NQUNfR0VOQzsKKwkKKwkvKiAKKwkgKiBTd2l0Y2ggdGhlIHBvcnQgYXJvdW5kIHdpdGhvdXQgYSBjbG9jayB0cmFuc2l0aW9uLgorCSAqLworCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9tZGlvLE1fTUFDX01ESU9fRElSX0lOUFVUIHwgbWFjX21kaW9fZ2VuYyk7CisJCisJLyoKKwkgKiBTZW5kIG91dCBhIGNsb2NrIHB1bHNlIHRvIHNpZ25hbCB3ZSB3YW50IHRoZSBzdGF0dXMKKwkgKi8KKwkKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fbWRpbywKKwkJICAgICAgIE1fTUFDX01ESU9fRElSX0lOUFVUIHwgTV9NQUNfTURDIHwgbWFjX21kaW9fZ2VuYyk7CisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX21kaW8sTV9NQUNfTURJT19ESVJfSU5QVVQgfCBtYWNfbWRpb19nZW5jKTsKKwkKKwkvKiAKKwkgKiBJZiBhbiBlcnJvciBvY2N1cnJlZCwgdGhlIFBIWSB3aWxsIHNpZ25hbCAnMScgYmFjaworCSAqLworCWVycm9yID0gU0JNQUNfUkVBRENTUihzLT5zYm1fbWRpbykgJiBNX01BQ19NRElPX0lOOworCQorCS8qIAorCSAqIElzc3VlIGFuICdpZGxlJyBjbG9jayBwdWxzZSwgYnV0IGtlZXAgdGhlIGRpcmVjdGlvbgorCSAqIHRoZSBzYW1lLgorCSAqLworCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9tZGlvLAorCQkgICAgICAgTV9NQUNfTURJT19ESVJfSU5QVVQgfCBNX01BQ19NREMgfCBtYWNfbWRpb19nZW5jKTsKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fbWRpbyxNX01BQ19NRElPX0RJUl9JTlBVVCB8IG1hY19tZGlvX2dlbmMpOworCQorCXJlZ3ZhbCA9IDA7CisJCisJZm9yIChpZHggPSAwOyBpZHggPCAxNjsgaWR4KyspIHsKKwkJcmVndmFsIDw8PSAxOworCQkKKwkJaWYgKGVycm9yID09IDApIHsKKwkJCWlmIChTQk1BQ19SRUFEQ1NSKHMtPnNibV9tZGlvKSAmIE1fTUFDX01ESU9fSU4pCisJCQkJcmVndmFsIHw9IDE7CisJCX0KKwkJCisJCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9tZGlvLAorCQkJICAgICAgIE1fTUFDX01ESU9fRElSX0lOUFVUfE1fTUFDX01EQyB8IG1hY19tZGlvX2dlbmMpOworCQlTQk1BQ19XUklURUNTUihzLT5zYm1fbWRpbywKKwkJCSAgICAgICBNX01BQ19NRElPX0RJUl9JTlBVVCB8IG1hY19tZGlvX2dlbmMpOworCX0KKwkKKwkvKiBTd2l0Y2ggYmFjayB0byBvdXRwdXQgKi8KKwlTQk1BQ19XUklURUNTUihzLT5zYm1fbWRpbyxNX01BQ19NRElPX0RJUl9PVVRQVVQgfCBtYWNfbWRpb19nZW5jKTsKKwkKKwlpZiAoZXJyb3IgPT0gMCkKKwkJcmV0dXJuIHJlZ3ZhbDsKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCTUFDX01JSV9XUklURShzLHBoeWFkZHIscmVnaWR4LHJlZ3ZhbCkKKyAqICAKKyAqICBXcml0ZSBhIHZhbHVlIHRvIGEgUEhZIHJlZ2lzdGVyLgorICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBzIC0gc2JtYWMgc3RydWN0dXJlCisgKiAgCSAgIHBoeWFkZHIgLSBQSFkgdG8gdXNlCisgKiAgCSAgIHJlZ2lkeCAtIHJlZ2lzdGVyIHdpdGhpbiB0aGUgUEhZCisgKiAgCSAgIHJlZ3ZhbCAtIGRhdGEgdG8gd3JpdGUgdG8gcmVnaXN0ZXIKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICBub3RoaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB2b2lkIHNibWFjX21paV93cml0ZShzdHJ1Y3Qgc2JtYWNfc29mdGMgKnMsaW50IHBoeWFkZHIsaW50IHJlZ2lkeCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgcmVndmFsKQoreworCWludCBtYWNfbWRpb19nZW5jOworCisJc2JtYWNfbWlpX3N5bmMocyk7CisJCisJc2JtYWNfbWlpX3NlbmRkYXRhKHMsTUlJX0NPTU1BTkRfU1RBUlQsMik7CisJc2JtYWNfbWlpX3NlbmRkYXRhKHMsTUlJX0NPTU1BTkRfV1JJVEUsMik7CisJc2JtYWNfbWlpX3NlbmRkYXRhKHMscGh5YWRkciwgNSk7CisJc2JtYWNfbWlpX3NlbmRkYXRhKHMscmVnaWR4LCA1KTsKKwlzYm1hY19taWlfc2VuZGRhdGEocyxNSUlfQ09NTUFORF9BQ0ssMik7CisJc2JtYWNfbWlpX3NlbmRkYXRhKHMscmVndmFsLDE2KTsKKworCW1hY19tZGlvX2dlbmMgPSBTQk1BQ19SRUFEQ1NSKHMtPnNibV9tZGlvKSAmIE1fTUFDX0dFTkM7CisKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fbWRpbyxNX01BQ19NRElPX0RJUl9PVVRQVVQgfCBtYWNfbWRpb19nZW5jKTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU0JETUFfSU5JVENUWChkLHMsY2hhbix0eHJ4LG1heGRlc2NyKQorICogIAorICogIEluaXRpYWxpemUgYSBETUEgY2hhbm5lbCBjb250ZXh0LiAgU2luY2UgdGhlcmUgYXJlIHBvdGVudGlhbGx5CisgKiAgZWlnaHQgRE1BIGNoYW5uZWxzIHBlciBNQUMsIGl0J3MgbmljZSB0byBkbyB0aGlzIGluIGEgc3RhbmRhcmQKKyAqICB3YXkuICAKKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgZCAtIHNibWFjZG1hX3Qgc3RydWN0dXJlIChETUEgY2hhbm5lbCBjb250ZXh0KQorICogIAkgICBzIC0gc2JtYWNfc29mdGMgc3RydWN0dXJlIChwb2ludGVyIHRvIGEgTUFDKQorICogIAkgICBjaGFuIC0gY2hhbm5lbCBudW1iZXIgKDAuLjEgcmlnaHQgbm93KQorICogIAkgICB0eHJ4IC0gSWRlbnRpZmllcyBETUFfVFggb3IgRE1BX1JYIGZvciBjaGFubmVsIGRpcmVjdGlvbgorICogICAgICBtYXhkZXNjciAtIG51bWJlciBvZiBkZXNjcmlwdG9ycworICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHZvaWQgc2JkbWFfaW5pdGN0eChzYm1hY2RtYV90ICpkLAorCQkJICBzdHJ1Y3Qgc2JtYWNfc29mdGMgKnMsCisJCQkgIGludCBjaGFuLAorCQkJICBpbnQgdHhyeCwKKwkJCSAgaW50IG1heGRlc2NyKQoreworCS8qIAorCSAqIFNhdmUgYXdheSBpbnRlcmVzdGluZyBzdHVmZiBpbiB0aGUgc3RydWN0dXJlIAorCSAqLworCQorCWQtPnNiZG1hX2V0aCAgICAgICA9IHM7CisJZC0+c2JkbWFfY2hhbm5lbCAgID0gY2hhbjsKKwlkLT5zYmRtYV90eGRpciAgICAgPSB0eHJ4OworCQorI2lmIDAKKwkvKiBSTU9OIGNsZWFyaW5nICovCisJcy0+c2JlX2lkeCA9KHMtPnNibV9iYXNlIC0gQV9NQUNfQkFTRV8wKS9NQUNfU1BBQ0lORzsKKyNlbmRpZgorCisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fVFhfQllURVMpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fQ09MTElTSU9OUykpLCAwKTsKKwlTQk1BQ19XUklURUNTUihJT0FERFIoCisJQV9NQUNfUkVHSVNURVIocy0+c2JlX2lkeCwgUl9NQUNfUk1PTl9MQVRFX0NPTCkpLCAwKTsKKwlTQk1BQ19XUklURUNTUihJT0FERFIoCisJQV9NQUNfUkVHSVNURVIocy0+c2JlX2lkeCwgUl9NQUNfUk1PTl9FWF9DT0wpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fRkNTX0VSUk9SKSksIDApOworCVNCTUFDX1dSSVRFQ1NSKElPQUREUigKKwlBX01BQ19SRUdJU1RFUihzLT5zYmVfaWR4LCBSX01BQ19STU9OX1RYX0FCT1JUKSksIDApOworCVNCTUFDX1dSSVRFQ1NSKElPQUREUigKKwlBX01BQ19SRUdJU1RFUihzLT5zYmVfaWR4LCBSX01BQ19STU9OX1RYX0JBRCkpLCAwKTsKKwlTQk1BQ19XUklURUNTUihJT0FERFIoCisJQV9NQUNfUkVHSVNURVIocy0+c2JlX2lkeCwgUl9NQUNfUk1PTl9UWF9HT09EKSksIDApOworCVNCTUFDX1dSSVRFQ1NSKElPQUREUigKKwlBX01BQ19SRUdJU1RFUihzLT5zYmVfaWR4LCBSX01BQ19STU9OX1RYX1JVTlQpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fVFhfT1ZFUlNJWkUpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fUlhfQllURVMpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fUlhfTUNBU1QpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fUlhfQkNBU1QpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fUlhfQkFEKSksIDApOworCVNCTUFDX1dSSVRFQ1NSKElPQUREUigKKwlBX01BQ19SRUdJU1RFUihzLT5zYmVfaWR4LCBSX01BQ19STU9OX1JYX0dPT0QpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fUlhfUlVOVCkpLCAwKTsKKwlTQk1BQ19XUklURUNTUihJT0FERFIoCisJQV9NQUNfUkVHSVNURVIocy0+c2JlX2lkeCwgUl9NQUNfUk1PTl9SWF9PVkVSU0laRSkpLCAwKTsKKwlTQk1BQ19XUklURUNTUihJT0FERFIoCisJQV9NQUNfUkVHSVNURVIocy0+c2JlX2lkeCwgUl9NQUNfUk1PTl9SWF9GQ1NfRVJST1IpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fUlhfTEVOR1RIX0VSUk9SKSksIDApOworCVNCTUFDX1dSSVRFQ1NSKElPQUREUigKKwlBX01BQ19SRUdJU1RFUihzLT5zYmVfaWR4LCBSX01BQ19STU9OX1JYX0NPREVfRVJST1IpKSwgMCk7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKAorCUFfTUFDX1JFR0lTVEVSKHMtPnNiZV9pZHgsIFJfTUFDX1JNT05fUlhfQUxJR05fRVJST1IpKSwgMCk7CisKKwkvKiAKKwkgKiBpbml0aWFsaXplIHJlZ2lzdGVyIHBvaW50ZXJzIAorCSAqLworCQorCWQtPnNiZG1hX2NvbmZpZzAgPSAKKwkJcy0+c2JtX2Jhc2UgKyBSX01BQ19ETUFfUkVHSVNURVIodHhyeCxjaGFuLFJfTUFDX0RNQV9DT05GSUcwKTsKKwlkLT5zYmRtYV9jb25maWcxID0gCisJCXMtPnNibV9iYXNlICsgUl9NQUNfRE1BX1JFR0lTVEVSKHR4cngsY2hhbixSX01BQ19ETUFfQ09ORklHMSk7CisJZC0+c2JkbWFfZHNjcmJhc2UgPSAKKwkJcy0+c2JtX2Jhc2UgKyBSX01BQ19ETUFfUkVHSVNURVIodHhyeCxjaGFuLFJfTUFDX0RNQV9EU0NSX0JBU0UpOworCWQtPnNiZG1hX2RzY3JjbnQgPSAKKwkJcy0+c2JtX2Jhc2UgKyBSX01BQ19ETUFfUkVHSVNURVIodHhyeCxjaGFuLFJfTUFDX0RNQV9EU0NSX0NOVCk7CisJZC0+c2JkbWFfY3VyZHNjciA9IAkKKwkJcy0+c2JtX2Jhc2UgKyBSX01BQ19ETUFfUkVHSVNURVIodHhyeCxjaGFuLFJfTUFDX0RNQV9DVVJfRFNDUkFERFIpOworCQorCS8qCisJICogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcmluZworCSAqLworCQorCWQtPnNiZG1hX21heGRlc2NyID0gbWF4ZGVzY3I7CisJCisJZC0+c2JkbWFfZHNjcnRhYmxlID0gKHNiZG1hZHNjcl90ICopIAorCQlrbWFsbG9jKGQtPnNiZG1hX21heGRlc2NyKnNpemVvZihzYmRtYWRzY3JfdCksIEdGUF9LRVJORUwpOworCQorCW1lbXNldChkLT5zYmRtYV9kc2NydGFibGUsMCxkLT5zYmRtYV9tYXhkZXNjcipzaXplb2Yoc2JkbWFkc2NyX3QpKTsKKwkKKwlkLT5zYmRtYV9kc2NydGFibGVfZW5kID0gZC0+c2JkbWFfZHNjcnRhYmxlICsgZC0+c2JkbWFfbWF4ZGVzY3I7CisJCisJZC0+c2JkbWFfZHNjcnRhYmxlX3BoeXMgPSB2aXJ0X3RvX3BoeXMoZC0+c2JkbWFfZHNjcnRhYmxlKTsKKwkKKwkvKgorCSAqIEFuZCBjb250ZXh0IHRhYmxlCisJICovCisJCisJZC0+c2JkbWFfY3R4dGFibGUgPSAoc3RydWN0IHNrX2J1ZmYgKiopIAorCQlrbWFsbG9jKGQtPnNiZG1hX21heGRlc2NyKnNpemVvZihzdHJ1Y3Qgc2tfYnVmZiAqKSwgR0ZQX0tFUk5FTCk7CisJCisJbWVtc2V0KGQtPnNiZG1hX2N0eHRhYmxlLDAsZC0+c2JkbWFfbWF4ZGVzY3Iqc2l6ZW9mKHN0cnVjdCBza19idWZmICopKTsKKwkKKyNpZmRlZiBDT05GSUdfU0JNQUNfQ09BTEVTQ0UKKwkvKgorCSAqIFNldHVwIFJ4L1R4IERNQSBjb2FsZXNjaW5nIGRlZmF1bHRzCisJICovCisKKwlpZiAoIGludF9wa3RjbnQgKSB7CisJCWQtPnNiZG1hX2ludF9wa3RjbnQgPSBpbnRfcGt0Y250OworCX0gZWxzZSB7CisJCWQtPnNiZG1hX2ludF9wa3RjbnQgPSAxOworCX0KKwkKKwlpZiAoIGludF90aW1lb3V0ICkgeworCQlkLT5zYmRtYV9pbnRfdGltZW91dCA9IGludF90aW1lb3V0OworCX0gZWxzZSB7CisJCWQtPnNiZG1hX2ludF90aW1lb3V0ID0gMDsKKwl9CisjZW5kaWYKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCRE1BX0NIQU5ORUxfU1RBUlQoZCkKKyAqICAKKyAqICBJbml0aWFsaXplIHRoZSBoYXJkd2FyZSByZWdpc3RlcnMgZm9yIGEgRE1BIGNoYW5uZWwuCisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIGQgLSBETUEgY2hhbm5lbCB0byBpbml0IChjb250ZXh0IG11c3QgYmUgcHJldmlvdXNseSBpbml0J2QKKyAqICAgICAgICAgcnh0eCAtIERNQV9SWCBvciBETUFfVFggZGVwZW5kaW5nIG9uIHdoYXQgdHlwZSBvZiBjaGFubmVsCisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgbm90aGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgdm9pZCBzYmRtYV9jaGFubmVsX3N0YXJ0KHNibWFjZG1hX3QgKmQsIGludCByeHR4ICkKK3sKKwkvKgorCSAqIFR1cm4gb24gdGhlIERNQSBjaGFubmVsCisJICovCisJCisjaWZkZWYgQ09ORklHX1NCTUFDX0NPQUxFU0NFCisJU0JNQUNfV1JJVEVDU1IoZC0+c2JkbWFfY29uZmlnMSwKKwkJICAgICAgIFZfRE1BX0lOVF9USU1FT1VUKGQtPnNiZG1hX2ludF90aW1lb3V0KSB8CisJCSAgICAgICAwKTsKKwlTQk1BQ19XUklURUNTUihkLT5zYmRtYV9jb25maWcwLAorCQkgICAgICAgTV9ETUFfRU9QX0lOVF9FTiB8CisJCSAgICAgICBWX0RNQV9SSU5HU1ooZC0+c2JkbWFfbWF4ZGVzY3IpIHwKKwkJICAgICAgIFZfRE1BX0lOVF9QS1RDTlQoZC0+c2JkbWFfaW50X3BrdGNudCkgfAorCQkgICAgICAgMCk7CisjZWxzZQorCVNCTUFDX1dSSVRFQ1NSKGQtPnNiZG1hX2NvbmZpZzEsMCk7CisJU0JNQUNfV1JJVEVDU1IoZC0+c2JkbWFfY29uZmlnMCwKKwkJICAgICAgIFZfRE1BX1JJTkdTWihkLT5zYmRtYV9tYXhkZXNjcikgfAorCQkgICAgICAgMCk7CisjZW5kaWYKKworCVNCTUFDX1dSSVRFQ1NSKGQtPnNiZG1hX2RzY3JiYXNlLGQtPnNiZG1hX2RzY3J0YWJsZV9waHlzKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSByaW5nIHBvaW50ZXJzCisJICovCisKKwlkLT5zYmRtYV9hZGRwdHIgPSBkLT5zYmRtYV9kc2NydGFibGU7CisJZC0+c2JkbWFfcmVtcHRyID0gZC0+c2JkbWFfZHNjcnRhYmxlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCRE1BX0NIQU5ORUxfU1RPUChkKQorICogIAorICogIEluaXRpYWxpemUgdGhlIGhhcmR3YXJlIHJlZ2lzdGVycyBmb3IgYSBETUEgY2hhbm5lbC4KKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgZCAtIERNQSBjaGFubmVsIHRvIGluaXQgKGNvbnRleHQgbXVzdCBiZSBwcmV2aW91c2x5IGluaXQnZAorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHZvaWQgc2JkbWFfY2hhbm5lbF9zdG9wKHNibWFjZG1hX3QgKmQpCit7CisJLyoKKwkgKiBUdXJuIG9mZiB0aGUgRE1BIGNoYW5uZWwKKwkgKi8KKwkKKwlTQk1BQ19XUklURUNTUihkLT5zYmRtYV9jb25maWcxLDApOworCQorCVNCTUFDX1dSSVRFQ1NSKGQtPnNiZG1hX2RzY3JiYXNlLDApOworCQorCVNCTUFDX1dSSVRFQ1NSKGQtPnNiZG1hX2NvbmZpZzAsMCk7CisJCisJLyoKKwkgKiBaZXJvIHJpbmcgcG9pbnRlcnMKKwkgKi8KKwkKKwlkLT5zYmRtYV9hZGRwdHIgPSAwOworCWQtPnNiZG1hX3JlbXB0ciA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHNiZG1hX2FsaWduX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLGludCBwb3dlcjIsaW50IG9mZnNldCkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdW5zaWduZWQgbG9uZyBuZXdhZGRyOworCQorCWFkZHIgPSAodW5zaWduZWQgbG9uZykgc2tiLT5kYXRhOworCQorCW5ld2FkZHIgPSAoYWRkciArIHBvd2VyMiAtIDEpICYgfihwb3dlcjIgLSAxKTsKKwkKKwlza2JfcmVzZXJ2ZShza2IsbmV3YWRkci1hZGRyK29mZnNldCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQkRNQV9BRERfUkNWQlVGRkVSKGQsc2IpCisgKiAgCisgKiAgQWRkIGEgYnVmZmVyIHRvIHRoZSBzcGVjaWZpZWQgRE1BIGNoYW5uZWwuICAgRm9yIHJlY2VpdmUgY2hhbm5lbHMsCisgKiAgdGhpcyBxdWV1ZXMgYSBidWZmZXIgZm9yIGluYm91bmQgcGFja2V0cy4KKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgZCAtIERNQSBjaGFubmVsIGRlc2NyaXB0b3IKKyAqIAkgICBzYiAtIHNrX2J1ZmYgdG8gYWRkLCBvciBOVUxMIGlmIHdlIHNob3VsZCBhbGxvY2F0ZSBvbmUKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICAwIGlmIGJ1ZmZlciBjb3VsZCBub3QgYmUgYWRkZWQgKHJpbmcgaXMgZnVsbCkKKyAqICAJICAgMSBpZiBidWZmZXIgYWRkZWQgc3VjY2Vzc2Z1bGx5CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKKworc3RhdGljIGludCBzYmRtYV9hZGRfcmN2YnVmZmVyKHNibWFjZG1hX3QgKmQsc3RydWN0IHNrX2J1ZmYgKnNiKQoreworCXNiZG1hZHNjcl90ICpkc2M7CisJc2JkbWFkc2NyX3QgKm5leHRkc2M7CisJc3RydWN0IHNrX2J1ZmYgKnNiX25ldyA9IE5VTEw7CisJaW50IHBrdHNpemUgPSBFTkVUX1BBQ0tFVF9TSVpFOworCQorCS8qIGdldCBwb2ludGVyIHRvIG91ciBjdXJyZW50IHBsYWNlIGluIHRoZSByaW5nICovCisJCisJZHNjID0gZC0+c2JkbWFfYWRkcHRyOworCW5leHRkc2MgPSBTQkRNQV9ORVhUQlVGKGQsc2JkbWFfYWRkcHRyKTsKKwkKKwkvKgorCSAqIGZpZ3VyZSBvdXQgaWYgdGhlIHJpbmcgaXMgZnVsbCAtIGlmIHRoZSBuZXh0IGRlc2NyaXB0b3IKKwkgKiBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHRoYXQgd2UncmUgZ29pbmcgdG8gcmVtb3ZlIGZyb20KKwkgKiB0aGUgcmluZywgdGhlIHJpbmcgaXMgZnVsbAorCSAqLworCQorCWlmIChuZXh0ZHNjID09IGQtPnNiZG1hX3JlbXB0cikgeworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwkvKiAKKwkgKiBBbGxvY2F0ZSBhIHNrX2J1ZmYgaWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gIAorCSAqIElmIHdlIGRvIGhhdmUgYW4gc2tfYnVmZiwgcmVzZXQgaXQgc28gdGhhdCBpdCdzIGVtcHR5LgorCSAqCisJICogTm90ZTogc2tfYnVmZnMgZG9uJ3Qgc2VlbSB0byBiZSBndWFyYW50ZWVkIHRvIGhhdmUgYW55IHNvcnQKKwkgKiBvZiBhbGlnbm1lbnQgd2hlbiB0aGV5IGFyZSBhbGxvY2F0ZWQuICBUaGVyZWZvcmUsIGFsbG9jYXRlIGVub3VnaAorCSAqIGV4dHJhIHNwYWNlIHRvIG1ha2Ugc3VyZSB0aGF0OgorCSAqCisJICogICAgMS4gdGhlIGRhdGEgZG9lcyBub3Qgc3RhcnQgaW4gdGhlIG1pZGRsZSBvZiBhIGNhY2hlIGxpbmUuCisJICogICAgMi4gVGhlIGRhdGEgZG9lcyBub3QgZW5kIGluIHRoZSBtaWRkbGUgb2YgYSBjYWNoZSBsaW5lCisJICogICAgMy4gVGhlIGJ1ZmZlciBjYW4gYmUgYWxpZ25lZCBzdWNoIHRoYXQgdGhlIElQIGFkZHJlc3NlcyBhcmUgCisJICogICAgICAgbmF0dXJhbGx5IGFsaWduZWQuCisJICoKKwkgKiAgUmVtZW1iZXIsIHRoZSBTT0NzIE1BQyB3cml0ZXMgd2hvbGUgY2FjaGUgbGluZXMgYXQgYSB0aW1lLAorCSAqICB3aXRob3V0IHJlYWRpbmcgdGhlIG9sZCBjb250ZW50cyBmaXJzdC4gIFNvLCBpZiB0aGUgc2tfYnVmZidzCisJICogIGRhdGEgcG9ydGlvbiBzdGFydHMgaW4gdGhlIG1pZGRsZSBvZiBhIGNhY2hlIGxpbmUsIHRoZSBTT0MKKwkgKiAgRE1BIHdpbGwgdHJhc2ggdGhlIGJlZ2lubmluZyAoYW5kIGVuZGluZykgcG9ydGlvbnMuCisJICovCisJCisJaWYgKHNiID09IE5VTEwpIHsKKwkJc2JfbmV3ID0gZGV2X2FsbG9jX3NrYihFTkVUX1BBQ0tFVF9TSVpFICsgU01QX0NBQ0hFX0JZVEVTICogMiArIEVUSEVSX0FMSUdOKTsKKwkJaWYgKHNiX25ldyA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogc2tfYnVmZiBhbGxvY2F0aW9uIGZhaWxlZFxuIiwKKwkJCSAgICAgICBkLT5zYmRtYV9ldGgtPnNibV9kZXYtPm5hbWUpOworCQkJcmV0dXJuIC1FTk9CVUZTOworCQl9CisKKwkJc2JkbWFfYWxpZ25fc2tiKHNiX25ldywgU01QX0NBQ0hFX0JZVEVTLCBFVEhFUl9BTElHTik7CisKKwkJLyogbWFyayBza2J1ZmYgb3duZWQgYnkgb3VyIGRldmljZSAqLworCQlzYl9uZXctPmRldiA9IGQtPnNiZG1hX2V0aC0+c2JtX2RldjsKKwl9CisJZWxzZSB7CisJCXNiX25ldyA9IHNiOworCQkvKiAKKwkJICogbm90aGluZyBzcGVjaWFsIHRvIHJlaW5pdCBidWZmZXIsIGl0J3MgYWxyZWFkeSBhbGlnbmVkCisJCSAqIGFuZCBzYi0+ZGF0YSBhbHJlYWR5IHBvaW50cyB0byBhIGdvb2QgcGxhY2UuCisJCSAqLworCX0KKwkKKwkvKgorCSAqIGZpbGwgaW4gdGhlIGRlc2NyaXB0b3IgCisJICovCisJCisjaWZkZWYgQ09ORklHX1NCTUFDX0NPQUxFU0NFCisJLyoKKwkgKiBEbyBub3QgaW50ZXJydXB0IHBlciBETUEgdHJhbnNmZXIuCisJICovCisJZHNjLT5kc2NyX2EgPSB2aXJ0X3RvX3BoeXMoc2JfbmV3LT50YWlsKSB8CisJCVZfRE1BX0RTQ1JBX0FfU0laRShOVU1DQUNIRUJMS1MocGt0c2l6ZStFVEhFUl9BTElHTikpIHwKKwkJMDsKKyNlbHNlCisJZHNjLT5kc2NyX2EgPSB2aXJ0X3RvX3BoeXMoc2JfbmV3LT50YWlsKSB8CisJCVZfRE1BX0RTQ1JBX0FfU0laRShOVU1DQUNIRUJMS1MocGt0c2l6ZStFVEhFUl9BTElHTikpIHwKKwkJTV9ETUFfRFNDUkFfSU5URVJSVVBUOworI2VuZGlmCisKKwkvKiByZWNlaXZpbmc6IG5vIG9wdGlvbnMgKi8KKwlkc2MtPmRzY3JfYiA9IDA7CisJCisJLyoKKwkgKiBmaWxsIGluIHRoZSBjb250ZXh0IAorCSAqLworCQorCWQtPnNiZG1hX2N0eHRhYmxlW2RzYy1kLT5zYmRtYV9kc2NydGFibGVdID0gc2JfbmV3OworCQorCS8qIAorCSAqIHBvaW50IGF0IG5leHQgcGFja2V0IAorCSAqLworCQorCWQtPnNiZG1hX2FkZHB0ciA9IG5leHRkc2M7CisJCisJLyogCisJICogR2l2ZSB0aGUgYnVmZmVyIHRvIHRoZSBETUEgZW5naW5lLgorCSAqLworCQorCVNCTUFDX1dSSVRFQ1NSKGQtPnNiZG1hX2RzY3JjbnQsMSk7CisJCisJcmV0dXJuIDA7CQkJCQkvKiB3ZSBkaWQgaXQgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQkRNQV9BRERfVFhCVUZGRVIoZCxzYikKKyAqICAKKyAqICBBZGQgYSB0cmFuc21pdCBidWZmZXIgdG8gdGhlIHNwZWNpZmllZCBETUEgY2hhbm5lbCwgY2F1c2luZyBhCisgKiAgdHJhbnNtaXQgdG8gc3RhcnQuCisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIGQgLSBETUEgY2hhbm5lbCBkZXNjcmlwdG9yCisgKiAJICAgc2IgLSBza19idWZmIHRvIGFkZAorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIDAgdHJhbnNtaXQgcXVldWVkIHN1Y2Nlc3NmdWxseQorICogIAkgICBvdGhlcndpc2UgZXJyb3IgY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisKK3N0YXRpYyBpbnQgc2JkbWFfYWRkX3R4YnVmZmVyKHNibWFjZG1hX3QgKmQsc3RydWN0IHNrX2J1ZmYgKnNiKQoreworCXNiZG1hZHNjcl90ICpkc2M7CisJc2JkbWFkc2NyX3QgKm5leHRkc2M7CisJdWludDY0X3QgcGh5czsKKwl1aW50NjRfdCBuY2I7CisJaW50IGxlbmd0aDsKKwkKKwkvKiBnZXQgcG9pbnRlciB0byBvdXIgY3VycmVudCBwbGFjZSBpbiB0aGUgcmluZyAqLworCQorCWRzYyA9IGQtPnNiZG1hX2FkZHB0cjsKKwluZXh0ZHNjID0gU0JETUFfTkVYVEJVRihkLHNiZG1hX2FkZHB0cik7CisJCisJLyoKKwkgKiBmaWd1cmUgb3V0IGlmIHRoZSByaW5nIGlzIGZ1bGwgLSBpZiB0aGUgbmV4dCBkZXNjcmlwdG9yCisJICogaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB0aGF0IHdlJ3JlIGdvaW5nIHRvIHJlbW92ZSBmcm9tCisJICogdGhlIHJpbmcsIHRoZSByaW5nIGlzIGZ1bGwKKwkgKi8KKwkKKwlpZiAobmV4dGRzYyA9PSBkLT5zYmRtYV9yZW1wdHIpIHsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCQorCS8qCisJICogVW5kZXIgTGludXgsIGl0J3Mgbm90IG5lY2Vzc2FyeSB0byBjb3B5L2NvYWxlc2NlIGJ1ZmZlcnMKKwkgKiBsaWtlIGl0IGlzIG9uIE5ldEJTRC4gIFdlIHRoaW5rIHRoZXkncmUgYWxsIGNvbnRpZ3VvdXMsCisJICogYnV0IHRoYXQgbWF5IG5vdCBiZSB0cnVlIGZvciBHQkUuCisJICovCisJCisJbGVuZ3RoID0gc2ItPmxlbjsKKwkKKwkvKgorCSAqIGZpbGwgaW4gdGhlIGRlc2NyaXB0b3IuICBOb3RlIHRoYXQgdGhlIG51bWJlciBvZiBjYWNoZQorCSAqIGJsb2NrcyBpbiB0aGUgZGVzY3JpcHRvciBpcyB0aGUgbnVtYmVyIG9mIGJsb2NrcworCSAqICpzcGFubmVkKiwgc28gd2UgbmVlZCB0byBhZGQgaW4gdGhlIG9mZnNldCAoaWYgYW55KQorCSAqIHdoaWxlIGRvaW5nIHRoZSBjYWxjdWxhdGlvbi4KKwkgKi8KKwkKKwlwaHlzID0gdmlydF90b19waHlzKHNiLT5kYXRhKTsKKwluY2IgPSBOVU1DQUNIRUJMS1MobGVuZ3RoKyhwaHlzICYgKFNNUF9DQUNIRV9CWVRFUyAtIDEpKSk7CisKKwlkc2MtPmRzY3JfYSA9IHBoeXMgfCAKKwkJVl9ETUFfRFNDUkFfQV9TSVpFKG5jYikgfAorI2lmbmRlZiBDT05GSUdfU0JNQUNfQ09BTEVTQ0UKKwkJTV9ETUFfRFNDUkFfSU5URVJSVVBUIHwKKyNlbmRpZgorCQlNX0RNQV9FVEhUWF9TT1A7CisJCisJLyogdHJhbnNtaXR0aW5nOiBzZXQgb3V0Ym91bmQgb3B0aW9ucyBhbmQgbGVuZ3RoICovCisKKwlkc2MtPmRzY3JfYiA9IFZfRE1BX0RTQ1JCX09QVElPTlMoS19ETUFfRVRIVFhfQVBQRU5EQ1JDX0FQUEVORFBBRCkgfAorCQlWX0RNQV9EU0NSQl9QS1RfU0laRShsZW5ndGgpOworCQorCS8qCisJICogZmlsbCBpbiB0aGUgY29udGV4dCAKKwkgKi8KKwkKKwlkLT5zYmRtYV9jdHh0YWJsZVtkc2MtZC0+c2JkbWFfZHNjcnRhYmxlXSA9IHNiOworCQorCS8qIAorCSAqIHBvaW50IGF0IG5leHQgcGFja2V0IAorCSAqLworCQorCWQtPnNiZG1hX2FkZHB0ciA9IG5leHRkc2M7CisJCisJLyogCisJICogR2l2ZSB0aGUgYnVmZmVyIHRvIHRoZSBETUEgZW5naW5lLgorCSAqLworCQorCVNCTUFDX1dSSVRFQ1NSKGQtPnNiZG1hX2RzY3JjbnQsMSk7CisJCisJcmV0dXJuIDA7CQkJCQkvKiB3ZSBkaWQgaXQgKi8KK30KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQkRNQV9FTVBUWVJJTkcoZCkKKyAqICAKKyAqICBGcmVlIGFsbCBhbGxvY2F0ZWQgc2tfYnVmZnMgb24gdGhlIHNwZWNpZmllZCBETUEgY2hhbm5lbDsKKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgZCAgLSBETUEgY2hhbm5lbAorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHZvaWQgc2JkbWFfZW1wdHlyaW5nKHNibWFjZG1hX3QgKmQpCit7CisJaW50IGlkeDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2I7CisJCisJZm9yIChpZHggPSAwOyBpZHggPCBkLT5zYmRtYV9tYXhkZXNjcjsgaWR4KyspIHsKKwkJc2IgPSBkLT5zYmRtYV9jdHh0YWJsZVtpZHhdOworCQlpZiAoc2IpIHsKKwkJCWRldl9rZnJlZV9za2Ioc2IpOworCQkJZC0+c2JkbWFfY3R4dGFibGVbaWR4XSA9IE5VTEw7CisJCX0KKwl9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQkRNQV9GSUxMUklORyhkKQorICogIAorICogIEZpbGwgdGhlIHNwZWNpZmllZCBETUEgY2hhbm5lbCAobXVzdCBiZSByZWNlaXZlIGNoYW5uZWwpCisgKiAgd2l0aCBza19idWZmcworICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBkIC0gRE1BIGNoYW5uZWwKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICBub3RoaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB2b2lkIHNiZG1hX2ZpbGxyaW5nKHNibWFjZG1hX3QgKmQpCit7CisJaW50IGlkeDsKKwkKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IFNCTUFDX01BWF9SWERFU0NSLTE7IGlkeCsrKSB7CisJCWlmIChzYmRtYV9hZGRfcmN2YnVmZmVyKGQsTlVMTCkgIT0gMCkKKwkJCWJyZWFrOworCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCRE1BX1JYX1BST0NFU1Moc2MsZCkKKyAqICAKKyAqICBQcm9jZXNzICJjb21wbGV0ZWQiIHJlY2VpdmUgYnVmZmVycyBvbiB0aGUgc3BlY2lmaWVkIERNQSBjaGFubmVsLiAgCisgKiAgTm90ZSB0aGF0IHRoaXMgaXNuJ3QgcmVhbGx5IGlkZWFsIGZvciBwcmlvcml0eSBjaGFubmVscywgc2luY2UKKyAqICBpdCBwcm9jZXNzZXMgYWxsIG9mIHRoZSBwYWNrZXRzIG9uIGEgZ2l2ZW4gY2hhbm5lbCBiZWZvcmUgCisgKiAgcmV0dXJuaW5nLiAKKyAqCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKgkgICBzYyAtIHNvZnRjIHN0cnVjdHVyZQorICogIAkgICBkIC0gRE1BIGNoYW5uZWwgY29udGV4dAorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHZvaWQgc2JkbWFfcnhfcHJvY2VzcyhzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjLHNibWFjZG1hX3QgKmQpCit7CisJaW50IGN1cmlkeDsKKwlpbnQgaHdpZHg7CisJc2JkbWFkc2NyX3QgKmRzYzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2I7CisJaW50IGxlbjsKKwkKKwlmb3IgKDs7KSB7CisJCS8qIAorCQkgKiBmaWd1cmUgb3V0IHdoZXJlIHdlIGFyZSAoYXMgYW4gaW5kZXgpIGFuZCB3aGVyZQorCQkgKiB0aGUgaGFyZHdhcmUgaXMgKGFsc28gYXMgYW4gaW5kZXgpCisJCSAqCisJCSAqIFRoaXMgY291bGQgYmUgZG9uZSBmYXN0ZXIgaWYgKGZvciBleGFtcGxlKSB0aGUgCisJCSAqIGRlc2NyaXB0b3IgdGFibGUgd2FzIHBhZ2UtYWxpZ25lZCBhbmQgY29udGlndW91cyBpbgorCQkgKiBib3RoIHZpcnR1YWwgYW5kIHBoeXNpY2FsIG1lbW9yeSAtLSB5b3UgY291bGQgdGhlbgorCQkgKiBqdXN0IGNvbXBhcmUgdGhlIGxvdy1vcmRlciBiaXRzIG9mIHRoZSB2aXJ0dWFsIGFkZHJlc3MKKwkJICogKHNiZG1hX3JlbXB0cikgYW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIChzYmRtYV9jdXJkc2NyIENTUikKKwkJICovCisJCQorCQljdXJpZHggPSBkLT5zYmRtYV9yZW1wdHIgLSBkLT5zYmRtYV9kc2NydGFibGU7CisJCWh3aWR4ID0gKGludCkgKCgoU0JNQUNfUkVBRENTUihkLT5zYmRtYV9jdXJkc2NyKSAmIE1fRE1BX0NVUkRTQ1JfQUREUikgLQorCQkJCWQtPnNiZG1hX2RzY3J0YWJsZV9waHlzKSAvIHNpemVvZihzYmRtYWRzY3JfdCkpOworCQkKKwkJLyoKKwkJICogSWYgdGhleSdyZSB0aGUgc2FtZSwgdGhhdCBtZWFucyB3ZSd2ZSBwcm9jZXNzZWQgYWxsCisJCSAqIG9mIHRoZSBkZXNjcmlwdG9ycyB1cCB0byAoYnV0IG5vdCBpbmNsdWRpbmcpIHRoZSBvbmUgdGhhdAorCQkgKiB0aGUgaGFyZHdhcmUgaXMgd29ya2luZyBvbiByaWdodCBub3cuCisJCSAqLworCQkKKwkJaWYgKGN1cmlkeCA9PSBod2lkeCkKKwkJCWJyZWFrOworCQkKKwkJLyoKKwkJICogT3RoZXJ3aXNlLCBnZXQgdGhlIHBhY2tldCdzIHNrX2J1ZmYgcHRyIGJhY2sKKwkJICovCisJCQorCQlkc2MgPSAmKGQtPnNiZG1hX2RzY3J0YWJsZVtjdXJpZHhdKTsKKwkJc2IgPSBkLT5zYmRtYV9jdHh0YWJsZVtjdXJpZHhdOworCQlkLT5zYmRtYV9jdHh0YWJsZVtjdXJpZHhdID0gTlVMTDsKKwkJCisJCWxlbiA9IChpbnQpR19ETUFfRFNDUkJfUEtUX1NJWkUoZHNjLT5kc2NyX2IpIC0gNDsKKwkJCisJCS8qCisJCSAqIENoZWNrIHBhY2tldCBzdGF0dXMuICBJZiBnb29kLCBwcm9jZXNzIGl0LgorCQkgKiBJZiBub3QsIHNpbGVudGx5IGRyb3AgaXQgYW5kIHB1dCBpdCBiYWNrIG9uIHRoZQorCQkgKiByZWNlaXZlIHJpbmcuCisJCSAqLworCQkKKwkJaWYgKCEoZHNjLT5kc2NyX2EgJiBNX0RNQV9FVEhSWF9CQUQpKSB7CisJCQkKKwkJCS8qCisJCQkgKiBBZGQgYSBuZXcgYnVmZmVyIHRvIHJlcGxhY2UgdGhlIG9sZCBvbmUuICBJZiB3ZSBmYWlsCisJCQkgKiB0byBhbGxvY2F0ZSBhIGJ1ZmZlciwgd2UncmUgZ29pbmcgdG8gZHJvcCB0aGlzCisJCQkgKiBwYWNrZXQgYW5kIHB1dCBpdCByaWdodCBiYWNrIG9uIHRoZSByZWNlaXZlIHJpbmcuCisJCQkgKi8KKwkJCQorCQkJaWYgKHNiZG1hX2FkZF9yY3ZidWZmZXIoZCxOVUxMKSA9PSAtRU5PQlVGUykgeworCQkJCXNjLT5zYm1fc3RhdHMucnhfZHJvcHBlZCsrOworCQkJCXNiZG1hX2FkZF9yY3ZidWZmZXIoZCxzYik7IC8qIHJlLWFkZCBvbGQgYnVmZmVyICovCisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogU2V0IGxlbmd0aCBpbnRvIHRoZSBwYWNrZXQKKwkJCQkgKi8KKwkJCQlza2JfcHV0KHNiLGxlbik7CisJCQkJCisJCQkJLyoKKwkJCQkgKiBCdWZmZXIgaGFzIGJlZW4gcmVwbGFjZWQgb24gdGhlCisJCQkJICogcmVjZWl2ZSByaW5nLiAgUGFzcyB0aGUgYnVmZmVyIHRvCisJCQkJICogdGhlIGtlcm5lbAorCQkJCSAqLworCQkJCXNjLT5zYm1fc3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQkJCXNjLT5zYm1fc3RhdHMucnhfcGFja2V0cysrOworCQkJCXNiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNiLGQtPnNiZG1hX2V0aC0+c2JtX2Rldik7CisJCQkJLyogQ2hlY2sgaHcgSVB2NC9UQ1AgY2hlY2tzdW0gaWYgc3VwcG9ydGVkICovCisJCQkJaWYgKHNjLT5yeF9od19jaGVja3N1bSA9PSBFTkFCTEUpIHsKKwkJCQkJaWYgKCEoKGRzYy0+ZHNjcl9hKSAmIE1fRE1BX0VUSFJYX0JBRElQNENTKSAmJgorCQkJCQkgICAgISgoZHNjLT5kc2NyX2EpICYgTV9ETUFfRVRIUlhfQkFEVENQQ1MpKSB7CisJCQkJCQlzYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCQkJCQkvKiBkb24ndCBuZWVkIHRvIHNldCBzYi0+Y3N1bSAqLworCQkJCQl9IGVsc2UgeworCQkJCQkJc2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJbmV0aWZfcngoc2IpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFBhY2tldCB3YXMgbWFuZ2xlZCBzb21laG93LiAgSnVzdCBkcm9wIGl0IGFuZAorCQkJICogcHV0IGl0IGJhY2sgb24gdGhlIHJlY2VpdmUgcmluZy4KKwkJCSAqLworCQkJc2MtPnNibV9zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCXNiZG1hX2FkZF9yY3ZidWZmZXIoZCxzYik7CisJCX0KKwkJCisJCQorCQkvKiAKKwkJICogLi4gYW5kIGFkdmFuY2UgdG8gdGhlIG5leHQgYnVmZmVyLgorCQkgKi8KKwkJCisJCWQtPnNiZG1hX3JlbXB0ciA9IFNCRE1BX05FWFRCVUYoZCxzYmRtYV9yZW1wdHIpOworCQkKKwl9Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCRE1BX1RYX1BST0NFU1Moc2MsZCkKKyAqICAKKyAqICBQcm9jZXNzICJjb21wbGV0ZWQiIHRyYW5zbWl0IGJ1ZmZlcnMgb24gdGhlIHNwZWNpZmllZCBETUEgY2hhbm5lbC4gIAorICogIFRoaXMgaXMgbm9ybWFsbHkgY2FsbGVkIHdpdGhpbiB0aGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4KKyAqICBOb3RlIHRoYXQgdGhpcyBpc24ndCByZWFsbHkgaWRlYWwgZm9yIHByaW9yaXR5IGNoYW5uZWxzLCBzaW5jZQorICogIGl0IHByb2Nlc3NlcyBhbGwgb2YgdGhlIHBhY2tldHMgb24gYSBnaXZlbiBjaGFubmVsIGJlZm9yZSAKKyAqICByZXR1cm5pbmcuIAorICoKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAgICAgc2MgLSBzb2Z0YyBzdHJ1Y3R1cmUKKyAqICAJICAgZCAtIERNQSBjaGFubmVsIGNvbnRleHQKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICBub3RoaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB2b2lkIHNiZG1hX3R4X3Byb2Nlc3Moc3RydWN0IHNibWFjX3NvZnRjICpzYyxzYm1hY2RtYV90ICpkKQoreworCWludCBjdXJpZHg7CisJaW50IGh3aWR4OworCXNiZG1hZHNjcl90ICpkc2M7CisJc3RydWN0IHNrX2J1ZmYgKnNiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHNjLT5zYm1fbG9jayksIGZsYWdzKTsKKwkKKwlmb3IgKDs7KSB7CisJCS8qIAorCQkgKiBmaWd1cmUgb3V0IHdoZXJlIHdlIGFyZSAoYXMgYW4gaW5kZXgpIGFuZCB3aGVyZQorCQkgKiB0aGUgaGFyZHdhcmUgaXMgKGFsc28gYXMgYW4gaW5kZXgpCisJCSAqCisJCSAqIFRoaXMgY291bGQgYmUgZG9uZSBmYXN0ZXIgaWYgKGZvciBleGFtcGxlKSB0aGUgCisJCSAqIGRlc2NyaXB0b3IgdGFibGUgd2FzIHBhZ2UtYWxpZ25lZCBhbmQgY29udGlndW91cyBpbgorCQkgKiBib3RoIHZpcnR1YWwgYW5kIHBoeXNpY2FsIG1lbW9yeSAtLSB5b3UgY291bGQgdGhlbgorCQkgKiBqdXN0IGNvbXBhcmUgdGhlIGxvdy1vcmRlciBiaXRzIG9mIHRoZSB2aXJ0dWFsIGFkZHJlc3MKKwkJICogKHNiZG1hX3JlbXB0cikgYW5kIHRoZSBwaHlzaWNhbCBhZGRyZXNzIChzYmRtYV9jdXJkc2NyIENTUikKKwkJICovCisJCQorCQljdXJpZHggPSBkLT5zYmRtYV9yZW1wdHIgLSBkLT5zYmRtYV9kc2NydGFibGU7CisJCWh3aWR4ID0gKGludCkgKCgoU0JNQUNfUkVBRENTUihkLT5zYmRtYV9jdXJkc2NyKSAmIE1fRE1BX0NVUkRTQ1JfQUREUikgLQorCQkJCWQtPnNiZG1hX2RzY3J0YWJsZV9waHlzKSAvIHNpemVvZihzYmRtYWRzY3JfdCkpOworCisJCS8qCisJCSAqIElmIHRoZXkncmUgdGhlIHNhbWUsIHRoYXQgbWVhbnMgd2UndmUgcHJvY2Vzc2VkIGFsbAorCQkgKiBvZiB0aGUgZGVzY3JpcHRvcnMgdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSB0aGUgb25lIHRoYXQKKwkJICogdGhlIGhhcmR3YXJlIGlzIHdvcmtpbmcgb24gcmlnaHQgbm93LgorCQkgKi8KKwkJCisJCWlmIChjdXJpZHggPT0gaHdpZHgpCisJCQlicmVhazsKKwkJCisJCS8qCisJCSAqIE90aGVyd2lzZSwgZ2V0IHRoZSBwYWNrZXQncyBza19idWZmIHB0ciBiYWNrCisJCSAqLworCQkKKwkJZHNjID0gJihkLT5zYmRtYV9kc2NydGFibGVbY3VyaWR4XSk7CisJCXNiID0gZC0+c2JkbWFfY3R4dGFibGVbY3VyaWR4XTsKKwkJZC0+c2JkbWFfY3R4dGFibGVbY3VyaWR4XSA9IE5VTEw7CisJCQorCQkvKgorCQkgKiBTdGF0cworCQkgKi8KKwkJCisJCXNjLT5zYm1fc3RhdHMudHhfYnl0ZXMgKz0gc2ItPmxlbjsKKwkJc2MtPnNibV9zdGF0cy50eF9wYWNrZXRzKys7CisJCQorCQkvKgorCQkgKiBmb3IgdHJhbnNtaXRzLCB3ZSBqdXN0IGZyZWUgYnVmZmVycy4KKwkJICovCisJCQorCQlkZXZfa2ZyZWVfc2tiX2lycShzYik7CisJCQorCQkvKiAKKwkJICogLi4gYW5kIGFkdmFuY2UgdG8gdGhlIG5leHQgYnVmZmVyLgorCQkgKi8KKworCQlkLT5zYmRtYV9yZW1wdHIgPSBTQkRNQV9ORVhUQlVGKGQsc2JkbWFfcmVtcHRyKTsKKwkJCisJfQorCQorCS8qCisJICogRGVjaWRlIGlmIHdlIHNob3VsZCB3YWtlIHVwIHRoZSBwcm90b2NvbCBvciBub3QuCisJICogT3RoZXIgZHJpdmVycyBzZWVtIHRvIGRvIHRoaXMgd2hlbiB3ZSByZWFjaCBhIGxvdworCSAqIHdhdGVybWFyayBvbiB0aGUgdHJhbnNtaXQgcXVldWUuCisJICovCisJCisJbmV0aWZfd2FrZV9xdWV1ZShkLT5zYmRtYV9ldGgtPnNibV9kZXYpOworCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihzYy0+c2JtX2xvY2spLCBmbGFncyk7CisJCit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCTUFDX0lOSVRDVFgocykKKyAqICAKKyAqICBJbml0aWFsaXplIGFuIEV0aGVybmV0IGNvbnRleHQgc3RydWN0dXJlIC0gdGhpcyBpcyBjYWxsZWQKKyAqICBvbmNlIHBlciBNQUMgb24gdGhlIDEyNTAuICBNZW1vcnkgaXMgYWxsb2NhdGVkIGhlcmUsIHNvIGRvbid0CisgKiAgY2FsbCBpdCBhZ2FpbiBmcm9tIGluc2lkZSB0aGUgaW9jdGwgcm91dGluZXMgdGhhdCBicmluZyB0aGUKKyAqICBpbnRlcmZhY2UgdXAvZG93bgorICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBzIC0gc2JtYWMgY29udGV4dCBzdHJ1Y3R1cmUKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICAwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyBpbnQgc2JtYWNfaW5pdGN0eChzdHJ1Y3Qgc2JtYWNfc29mdGMgKnMpCit7CisJCisJLyogCisJICogZmlndXJlIG91dCB0aGUgYWRkcmVzc2VzIG9mIHNvbWUgcG9ydHMgCisJICovCisJCisJcy0+c2JtX21hY2VuYWJsZSA9IHMtPnNibV9iYXNlICsgUl9NQUNfRU5BQkxFOworCXMtPnNibV9tYWNjZmcgICAgPSBzLT5zYm1fYmFzZSArIFJfTUFDX0NGRzsKKwlzLT5zYm1fZmlmb2NmZyAgID0gcy0+c2JtX2Jhc2UgKyBSX01BQ19USFJTSF9DRkc7CisJcy0+c2JtX2ZyYW1lY2ZnICA9IHMtPnNibV9iYXNlICsgUl9NQUNfRlJBTUVDRkc7CisJcy0+c2JtX3J4ZmlsdGVyICA9IHMtPnNibV9iYXNlICsgUl9NQUNfQURGSUxURVJfQ0ZHOworCXMtPnNibV9pc3IgICAgICAgPSBzLT5zYm1fYmFzZSArIFJfTUFDX1NUQVRVUzsKKwlzLT5zYm1faW1yICAgICAgID0gcy0+c2JtX2Jhc2UgKyBSX01BQ19JTlRfTUFTSzsKKwlzLT5zYm1fbWRpbyAgICAgID0gcy0+c2JtX2Jhc2UgKyBSX01BQ19NRElPOworCisJcy0+c2JtX3BoeXNbMF0gICA9IDE7CisJcy0+c2JtX3BoeXNbMV0gICA9IDA7CisKKwlzLT5zYm1fcGh5X29sZGJtc3IgPSAwOworCXMtPnNibV9waHlfb2xkYW5scGFyID0gMDsKKwlzLT5zYm1fcGh5X29sZGsxc3RzciA9IDA7CisJcy0+c2JtX3BoeV9vbGRsaW5rc3RhdCA9IDA7CisJCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBETUEgY2hhbm5lbHMuICBSaWdodCBub3csIG9ubHkgb25lIHBlciBNQUMgaXMgdXNlZAorCSAqIE5vdGU6IE9ubHkgZG8gdGhpcyBfb25jZV8sIGFzIGl0IGFsbG9jYXRlcyBtZW1vcnkgZnJvbSB0aGUga2VybmVsIQorCSAqLworCQorCXNiZG1hX2luaXRjdHgoJihzLT5zYm1fdHhkbWEpLHMsMCxETUFfVFgsU0JNQUNfTUFYX1RYREVTQ1IpOworCXNiZG1hX2luaXRjdHgoJihzLT5zYm1fcnhkbWEpLHMsMCxETUFfUlgsU0JNQUNfTUFYX1JYREVTQ1IpOworCQorCS8qCisJICogaW5pdGlhbCBzdGF0ZSBpcyBPRkYKKwkgKi8KKwkKKwlzLT5zYm1fc3RhdGUgPSBzYm1hY19zdGF0ZV9vZmY7CisJCisJLyoKKwkgKiBJbml0aWFsIHNwZWVkIGlzIChYWFggVEVNUCkgMTBNQml0L3MgSERYIG5vIEZDCisJICovCisJCisJcy0+c2JtX3NwZWVkID0gc2JtYWNfc3BlZWRfMTA7CisJcy0+c2JtX2R1cGxleCA9IHNibWFjX2R1cGxleF9oYWxmOworCXMtPnNibV9mYyA9IHNibWFjX2ZjX2Rpc2FibGVkOworCQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHNiZG1hX3VuaW5pdGN0eChzdHJ1Y3Qgc2JtYWNkbWFfcyAqZCkKK3sKKwlpZiAoZC0+c2JkbWFfZHNjcnRhYmxlKSB7CisJCWtmcmVlKGQtPnNiZG1hX2RzY3J0YWJsZSk7CisJCWQtPnNiZG1hX2RzY3J0YWJsZSA9IE5VTEw7CisJfQorCQorCWlmIChkLT5zYmRtYV9jdHh0YWJsZSkgeworCQlrZnJlZShkLT5zYmRtYV9jdHh0YWJsZSk7CisJCWQtPnNiZG1hX2N0eHRhYmxlID0gTlVMTDsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgc2JtYWNfdW5pbml0Y3R4KHN0cnVjdCBzYm1hY19zb2Z0YyAqc2MpCit7CisJc2JkbWFfdW5pbml0Y3R4KCYoc2MtPnNibV90eGRtYSkpOworCXNiZG1hX3VuaW5pdGN0eCgmKHNjLT5zYm1fcnhkbWEpKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCTUFDX0NIQU5ORUxfU1RBUlQocykKKyAqICAKKyAqICBTdGFydCBwYWNrZXQgcHJvY2Vzc2luZyBvbiB0aGlzIE1BQy4KKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgcyAtIHNibWFjIHN0cnVjdHVyZQorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHZvaWQgc2JtYWNfY2hhbm5lbF9zdGFydChzdHJ1Y3Qgc2JtYWNfc29mdGMgKnMpCit7CisJdWludDY0X3QgcmVnOworCXNibWFjX3BvcnRfdCBwb3J0OworCXVpbnQ2NF90IGNmZyxmaWZvLGZyYW1lY2ZnOworCWludCBpZHgsIHRoX3ZhbHVlOworCQorCS8qCisJICogRG9uJ3QgZG8gdGhpcyBpZiBydW5uaW5nCisJICovCisKKwlpZiAocy0+c2JtX3N0YXRlID09IHNibWFjX3N0YXRlX29uKQorCQlyZXR1cm47CisJCisJLyoKKwkgKiBCcmluZyB0aGUgY29udHJvbGxlciBvdXQgb2YgcmVzZXQsIGJ1dCBsZWF2ZSBpdCBvZmYuCisJICovCisJCisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX21hY2VuYWJsZSwwKTsKKwkKKwkvKgorCSAqIElnbm9yZSBhbGwgcmVjZWl2ZWQgcGFja2V0cworCSAqLworCQorCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9yeGZpbHRlciwwKTsKKwkKKwkvKiAKKwkgKiBDYWxjdWxhdGUgdmFsdWVzIGZvciB2YXJpb3VzIGNvbnRyb2wgcmVnaXN0ZXJzLgorCSAqLworCQorCWNmZyA9IE1fTUFDX1JFVFJZX0VOIHwKKwkJTV9NQUNfVFhfSE9MRF9TT1BfRU4gfCAKKwkJVl9NQUNfVFhfUEFVU0VfQ05UXzE2SyB8CisJCU1fTUFDX0FQX1NUQVRfRU4gfAorCQlNX01BQ19GQVNUX1NZTkMgfAorCQlNX01BQ19TU19FTiB8CisJCTA7CisJCisJLyogCisJICogQmUgc3VyZSB0aGF0IFJEX1RIUlNIK1dSX1RIUlNIIDw9IDMyIGZvciBwYXNzMSBwYXJzCisJICogYW5kIG1ha2Ugc3VyZSB0aGF0IFJEX1RIUlNIICsgV1JfVEhSU0ggPD0xMjggZm9yIHBhc3MyIGFuZCBhYm92ZQorCSAqIFVzZSBhIGxhcmdlciBSRF9USFJTSCBmb3IgZ2lnYWJpdAorCSAqLworCWlmIChwZXJpcGhfcmV2ID49IDIpIAorCQl0aF92YWx1ZSA9IDY0OworCWVsc2UgCisJCXRoX3ZhbHVlID0gMjg7CisKKwlmaWZvID0gVl9NQUNfVFhfV1JfVEhSU0goNCkgfAkvKiBNdXN0IGJlICc0JyBvciAnOCcgKi8KKwkJKChzLT5zYm1fc3BlZWQgPT0gc2JtYWNfc3BlZWRfMTAwMCkKKwkJID8gVl9NQUNfVFhfUkRfVEhSU0godGhfdmFsdWUpIDogVl9NQUNfVFhfUkRfVEhSU0goNCkpIHwKKwkJVl9NQUNfVFhfUkxfVEhSU0goNCkgfAorCQlWX01BQ19SWF9QTF9USFJTSCg0KSB8CisJCVZfTUFDX1JYX1JEX1RIUlNIKDQpIHwJLyogTXVzdCBiZSAnNCcgKi8KKwkJVl9NQUNfUlhfUExfVEhSU0goNCkgfAorCQlWX01BQ19SWF9STF9USFJTSCg4KSB8CisJCTA7CisKKwlmcmFtZWNmZyA9IFZfTUFDX01JTl9GUkFNRVNaX0RFRkFVTFQgfAorCQlWX01BQ19NQVhfRlJBTUVTWl9ERUZBVUxUIHwKKwkJVl9NQUNfQkFDS09GRl9TRUwoMSk7CisKKwkvKgorCSAqIENsZWFyIG91dCB0aGUgaGFzaCBhZGRyZXNzIG1hcCAKKwkgKi8KKwkKKwlwb3J0ID0gcy0+c2JtX2Jhc2UgKyBSX01BQ19IQVNIX0JBU0U7CisJZm9yIChpZHggPSAwOyBpZHggPCBNQUNfSEFTSF9DT1VOVDsgaWR4KyspIHsKKwkJU0JNQUNfV1JJVEVDU1IocG9ydCwwKTsKKwkJcG9ydCArPSBzaXplb2YodWludDY0X3QpOworCX0KKwkKKwkvKgorCSAqIENsZWFyIG91dCB0aGUgZXhhY3QtbWF0Y2ggdGFibGUKKwkgKi8KKwkKKwlwb3J0ID0gcy0+c2JtX2Jhc2UgKyBSX01BQ19BRERSX0JBU0U7CisJZm9yIChpZHggPSAwOyBpZHggPCBNQUNfQUREUl9DT1VOVDsgaWR4KyspIHsKKwkJU0JNQUNfV1JJVEVDU1IocG9ydCwwKTsKKwkJcG9ydCArPSBzaXplb2YodWludDY0X3QpOworCX0KKwkKKwkvKgorCSAqIENsZWFyIG91dCB0aGUgRE1BIENoYW5uZWwgbWFwcGluZyB0YWJsZSByZWdpc3RlcnMKKwkgKi8KKwkKKwlwb3J0ID0gcy0+c2JtX2Jhc2UgKyBSX01BQ19DSFVQMF9CQVNFOworCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFDX0NITUFQX0NPVU5UOyBpZHgrKykgeworCQlTQk1BQ19XUklURUNTUihwb3J0LDApOworCQlwb3J0ICs9IHNpemVvZih1aW50NjRfdCk7CisJfQorCisKKwlwb3J0ID0gcy0+c2JtX2Jhc2UgKyBSX01BQ19DSExPMF9CQVNFOworCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFDX0NITUFQX0NPVU5UOyBpZHgrKykgeworCQlTQk1BQ19XUklURUNTUihwb3J0LDApOworCQlwb3J0ICs9IHNpemVvZih1aW50NjRfdCk7CisJfQorCQorCS8qCisJICogUHJvZ3JhbSB0aGUgaGFyZHdhcmUgYWRkcmVzcy4gIEl0IGdvZXMgaW50byB0aGUgaGFyZHdhcmUtYWRkcmVzcworCSAqIHJlZ2lzdGVyIGFzIHdlbGwgYXMgdGhlIGZpcnN0IGZpbHRlciByZWdpc3Rlci4KKwkgKi8KKwkKKwlyZWcgPSBzYm1hY19hZGRyMnJlZyhzLT5zYm1faHdhZGRyKTsKKwkKKwlwb3J0ID0gcy0+c2JtX2Jhc2UgKyBSX01BQ19BRERSX0JBU0U7CisJU0JNQUNfV1JJVEVDU1IocG9ydCxyZWcpOworCXBvcnQgPSBzLT5zYm1fYmFzZSArIFJfTUFDX0VUSEVSTkVUX0FERFI7CisKKyNpZmRlZiBDT05GSUdfU0IxX1BBU1NfMV9XT1JLQVJPVU5EUworCS8qCisJICogUGFzczEgU09DcyBkbyBub3QgcmVjZWl2ZSBwYWNrZXRzIGFkZHJlc3NlZCB0byB0aGUKKwkgKiBkZXN0aW5hdGlvbiBhZGRyZXNzIGluIHRoZSBSX01BQ19FVEhFUk5FVF9BRERSIHJlZ2lzdGVyLgorCSAqIFNldCB0aGUgdmFsdWUgdG8gemVyby4KKwkgKi8KKwlTQk1BQ19XUklURUNTUihwb3J0LDApOworI2Vsc2UKKwlTQk1BQ19XUklURUNTUihwb3J0LHJlZyk7CisjZW5kaWYKKwkKKwkvKgorCSAqIFNldCB0aGUgcmVjZWl2ZSBmaWx0ZXIgZm9yIG5vIHBhY2tldHMsIGFuZCB3cml0ZSB2YWx1ZXMKKwkgKiB0byB0aGUgdmFyaW91cyBjb25maWcgcmVnaXN0ZXJzCisJICovCisJCisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX3J4ZmlsdGVyLDApOworCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9pbXIsMCk7CisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX2ZyYW1lY2ZnLGZyYW1lY2ZnKTsKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fZmlmb2NmZyxmaWZvKTsKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fbWFjY2ZnLGNmZyk7CisJCisJLyoKKwkgKiBJbml0aWFsaXplIERNQSBjaGFubmVscyAocmluZ3Mgc2hvdWxkIGJlIG9rIG5vdykKKwkgKi8KKwkKKwlzYmRtYV9jaGFubmVsX3N0YXJ0KCYocy0+c2JtX3J4ZG1hKSwgRE1BX1JYKTsKKwlzYmRtYV9jaGFubmVsX3N0YXJ0KCYocy0+c2JtX3R4ZG1hKSwgRE1BX1RYKTsKKwkKKwkvKgorCSAqIENvbmZpZ3VyZSB0aGUgc3BlZWQsIGR1cGxleCwgYW5kIGZsb3cgY29udHJvbAorCSAqLworCisJc2JtYWNfc2V0X3NwZWVkKHMscy0+c2JtX3NwZWVkKTsKKwlzYm1hY19zZXRfZHVwbGV4KHMscy0+c2JtX2R1cGxleCxzLT5zYm1fZmMpOworCQorCS8qCisJICogRmlsbCB0aGUgcmVjZWl2ZSByaW5nCisJICovCisJCisJc2JkbWFfZmlsbHJpbmcoJihzLT5zYm1fcnhkbWEpKTsKKwkKKwkvKiAKKwkgKiBUdXJuIG9uIHRoZSByZXN0IG9mIHRoZSBiaXRzIGluIHRoZSBlbmFibGUgcmVnaXN0ZXIKKwkgKi8gICAgICAKKwkKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fbWFjZW5hYmxlLAorCQkgICAgICAgTV9NQUNfUlhETUFfRU4wIHwKKwkJICAgICAgIE1fTUFDX1RYRE1BX0VOMCB8CisJCSAgICAgICBNX01BQ19SWF9FTkFCTEUgfAorCQkgICAgICAgTV9NQUNfVFhfRU5BQkxFKTsKKwkKKwkKKworCisjaWZkZWYgQ09ORklHX1NCTUFDX0NPQUxFU0NFCisJLyoKKwkgKiBBY2NlcHQgYW55IFRYIGludGVycnVwdCBhbmQgRU9QIGNvdW50L3RpbWVyIFJYIGludGVycnVwdHMgb24gY2ggMAorCSAqLworCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9pbXIsCisJCSAgICAgICAoKE1fTUFDX0lOVF9FT1BfQ09VTlQgfCBNX01BQ19JTlRfRU9QX1RJTUVSKSA8PCBTX01BQ19UWF9DSDApIHwKKwkJICAgICAgICgoTV9NQUNfSU5UX0VPUF9DT1VOVCB8IE1fTUFDX0lOVF9FT1BfVElNRVIpIDw8IFNfTUFDX1JYX0NIMCkpOworI2Vsc2UKKwkvKgorCSAqIEFjY2VwdCBhbnkga2luZCBvZiBpbnRlcnJ1cHQgb24gVFggYW5kIFJYIERNQSBjaGFubmVsIDAKKwkgKi8KKwlTQk1BQ19XUklURUNTUihzLT5zYm1faW1yLAorCQkgICAgICAgKE1fTUFDX0lOVF9DSEFOTkVMIDw8IFNfTUFDX1RYX0NIMCkgfAorCQkgICAgICAgKE1fTUFDX0lOVF9DSEFOTkVMIDw8IFNfTUFDX1JYX0NIMCkpOworI2VuZGlmCisJCisJLyogCisJICogRW5hYmxlIHJlY2VpdmluZyB1bmljYXN0cyBhbmQgYnJvYWRjYXN0cyAKKwkgKi8KKwkKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fcnhmaWx0ZXIsTV9NQUNfVUNBU1RfRU4gfCBNX01BQ19CQ0FTVF9FTik7CisJCisJLyoKKwkgKiB3ZSdyZSBydW5uaW5nIG5vdy4gCisJICovCisJCisJcy0+c2JtX3N0YXRlID0gc2JtYWNfc3RhdGVfb247CisJCisJLyogCisJICogUHJvZ3JhbSBtdWx0aWNhc3QgYWRkcmVzc2VzIAorCSAqLworCQorCXNibWFjX3NldG11bHRpKHMpOworCQorCS8qIAorCSAqIElmIGNoYW5uZWwgd2FzIGluIHByb21pc2N1b3VzIG1vZGUgYmVmb3JlLCB0dXJuIHRoYXQgb24gCisJICovCisJCisJaWYgKHMtPnNibV9kZXZmbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCXNibWFjX3Byb21pc2N1b3VzX21vZGUocywxKTsKKwl9CisJCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19DSEFOTkVMX1NUT1AocykKKyAqICAKKyAqICBTdG9wIHBhY2tldCBwcm9jZXNzaW5nIG9uIHRoaXMgTUFDLgorICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBzIC0gc2JtYWMgc3RydWN0dXJlCisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgbm90aGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgdm9pZCBzYm1hY19jaGFubmVsX3N0b3Aoc3RydWN0IHNibWFjX3NvZnRjICpzKQoreworCS8qIGRvbid0IGRvIHRoaXMgaWYgYWxyZWFkeSBzdG9wcGVkICovCisJCisJaWYgKHMtPnNibV9zdGF0ZSA9PSBzYm1hY19zdGF0ZV9vZmYpCisJCXJldHVybjsKKwkKKwkvKiBkb24ndCBhY2NlcHQgYW55IHBhY2tldHMsIGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwkKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fcnhmaWx0ZXIsMCk7CisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX2ltciwwKTsKKwkKKwkvKiBUdXJuIG9mZiB0aWNrZXIgKi8KKwkKKwkvKiBYWFggKi8KKwkKKwkvKiB0dXJuIG9mZiByZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXIgKi8KKwkKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fbWFjZW5hYmxlLDApOworCQorCS8qIFdlJ3JlIHN0b3BwZWQgbm93LiAqLworCQorCXMtPnNibV9zdGF0ZSA9IHNibWFjX3N0YXRlX29mZjsKKwkKKwkvKgorCSAqIFN0b3AgRE1BIGNoYW5uZWxzIChyaW5ncyBzaG91bGQgYmUgb2sgbm93KQorCSAqLworCQorCXNiZG1hX2NoYW5uZWxfc3RvcCgmKHMtPnNibV9yeGRtYSkpOworCXNiZG1hX2NoYW5uZWxfc3RvcCgmKHMtPnNibV90eGRtYSkpOworCQorCS8qIEVtcHR5IHRoZSByZWNlaXZlIGFuZCB0cmFuc21pdCByaW5ncyAqLworCQorCXNiZG1hX2VtcHR5cmluZygmKHMtPnNibV9yeGRtYSkpOworCXNiZG1hX2VtcHR5cmluZygmKHMtPnNibV90eGRtYSkpOworCQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCTUFDX1NFVF9DSEFOTkVMX1NUQVRFKHN0YXRlKQorICogIAorICogIFNldCB0aGUgY2hhbm5lbCdzIHN0YXRlIE9OIG9yIE9GRgorICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBzdGF0ZSAtIG5ldyBzdGF0ZQorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG9sZCBzdGF0ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljIHNibWFjX3N0YXRlX3Qgc2JtYWNfc2V0X2NoYW5uZWxfc3RhdGUoc3RydWN0IHNibWFjX3NvZnRjICpzYywKKwkJCQkJICAgICBzYm1hY19zdGF0ZV90IHN0YXRlKQoreworCXNibWFjX3N0YXRlX3Qgb2xkc3RhdGUgPSBzYy0+c2JtX3N0YXRlOworCQorCS8qCisJICogSWYgc2FtZSBhcyBwcmV2aW91cyBzdGF0ZSwgcmV0dXJuCisJICovCisJCisJaWYgKHN0YXRlID09IG9sZHN0YXRlKSB7CisJCXJldHVybiBvbGRzdGF0ZTsKKwl9CisJCisJLyoKKwkgKiBJZiBuZXcgc3RhdGUgaXMgT04sIHR1cm4gY2hhbm5lbCBvbiAKKwkgKi8KKwkKKwlpZiAoc3RhdGUgPT0gc2JtYWNfc3RhdGVfb24pIHsKKwkJc2JtYWNfY2hhbm5lbF9zdGFydChzYyk7CisJfQorCWVsc2UgeworCQlzYm1hY19jaGFubmVsX3N0b3Aoc2MpOworCX0KKwkKKwkvKgorCSAqIFJldHVybiBwcmV2aW91cyBzdGF0ZQorCSAqLworCQorCXJldHVybiBvbGRzdGF0ZTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCTUFDX1BST01JU0NVT1VTX01PREUoc2Msb25vZmYpCisgKiAgCisgKiAgVHVybiBvbiBvciBvZmYgcHJvbWlzY3VvdXMgbW9kZQorICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBzYyAtIHNvZnRjCisgKiAgICAgIG9ub2ZmIC0gMSB0byB0dXJuIG9uLCAwIHRvIHR1cm4gb2ZmCisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgbm90aGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgdm9pZCBzYm1hY19wcm9taXNjdW91c19tb2RlKHN0cnVjdCBzYm1hY19zb2Z0YyAqc2MsaW50IG9ub2ZmKQoreworCXVpbnQ2NF90IHJlZzsKKwkKKwlpZiAoc2MtPnNibV9zdGF0ZSAhPSBzYm1hY19zdGF0ZV9vbikKKwkJcmV0dXJuOworCQorCWlmIChvbm9mZikgeworCQlyZWcgPSBTQk1BQ19SRUFEQ1NSKHNjLT5zYm1fcnhmaWx0ZXIpOworCQlyZWcgfD0gTV9NQUNfQUxMUEtUX0VOOworCQlTQk1BQ19XUklURUNTUihzYy0+c2JtX3J4ZmlsdGVyLHJlZyk7CisJfQkKKwllbHNlIHsKKwkJcmVnID0gU0JNQUNfUkVBRENTUihzYy0+c2JtX3J4ZmlsdGVyKTsKKwkJcmVnICY9IH5NX01BQ19BTExQS1RfRU47CisJCVNCTUFDX1dSSVRFQ1NSKHNjLT5zYm1fcnhmaWx0ZXIscmVnKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU0JNQUNfU0VUSVBIRFJfT0ZGU0VUKHNjLG9ub2ZmKQorICogIAorICogIFNldCB0aGUgaXBoZHIgb2Zmc2V0IGFzIDE1IGFzc3VtaW5nIGV0aGVybmV0IGVuY2Fwc3VsYXRpb24KKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgc2MgLSBzb2Z0YworICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIHZvaWQgc2JtYWNfc2V0X2lwaGRyX29mZnNldChzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjKQoreworCXVpbnQ2NF90IHJlZzsKKwkKKwkvKiBIYXJkIGNvZGUgdGhlIG9mZiBzZXQgdG8gMTUgZm9yIG5vdyAqLworCXJlZyA9IFNCTUFDX1JFQURDU1Ioc2MtPnNibV9yeGZpbHRlcik7CisJcmVnICY9IH5NX01BQ19JUEhEUl9PRkZTRVQgfCBWX01BQ19JUEhEUl9PRkZTRVQoMTUpOworCVNCTUFDX1dSSVRFQ1NSKHNjLT5zYm1fcnhmaWx0ZXIscmVnKTsKKwkKKwkvKiByZWFkIHN5c3RlbSBpZGVudGlmaWNhdGlvbiB0byBkZXRlcm1pbmUgcmV2aXNpb24gKi8KKwlpZiAocGVyaXBoX3JldiA+PSAyKSB7CisJCXNjLT5yeF9od19jaGVja3N1bSA9IEVOQUJMRTsKKwl9IGVsc2UgeworCQlzYy0+cnhfaHdfY2hlY2tzdW0gPSBESVNBQkxFOworCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCTUFDX0FERFIyUkVHKHB0cikKKyAqICAKKyAqICBDb252ZXJ0IHNpeCBieXRlcyBpbnRvIHRoZSA2NC1iaXQgcmVnaXN0ZXIgdmFsdWUgdGhhdAorICogIHdlIHR5cGljYWxseSB3cml0ZSBpbnRvIHRoZSBTQk1BQydzIGFkZHJlc3MvbWNhc3QgcmVnaXN0ZXJzCisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIHB0ciAtIHBvaW50ZXIgdG8gNiBieXRlcworICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIHJlZ2lzdGVyIHZhbHVlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyB1aW50NjRfdCBzYm1hY19hZGRyMnJlZyh1bnNpZ25lZCBjaGFyICpwdHIpCit7CisJdWludDY0X3QgcmVnID0gMDsKKwkKKwlwdHIgKz0gNjsKKwkKKwlyZWcgfD0gKHVpbnQ2NF90KSAqKC0tcHRyKTsgCisJcmVnIDw8PSA4OworCXJlZyB8PSAodWludDY0X3QpICooLS1wdHIpOyAKKwlyZWcgPDw9IDg7CisJcmVnIHw9ICh1aW50NjRfdCkgKigtLXB0cik7IAorCXJlZyA8PD0gODsKKwlyZWcgfD0gKHVpbnQ2NF90KSAqKC0tcHRyKTsgCisJcmVnIDw8PSA4OworCXJlZyB8PSAodWludDY0X3QpICooLS1wdHIpOyAKKwlyZWcgPDw9IDg7CisJcmVnIHw9ICh1aW50NjRfdCkgKigtLXB0cik7IAorCQorCXJldHVybiByZWc7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19TRVRfU1BFRUQocyxzcGVlZCkKKyAqICAKKyAqICBDb25maWd1cmUgTEFOIHNwZWVkIGZvciB0aGUgc3BlY2lmaWVkIE1BQy4KKyAqICBXYXJuaW5nOiBtdXN0IGJlIGNhbGxlZCB3aGVuIE1BQyBpcyBvZmYhCisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIHMgLSBzYm1hYyBzdHJ1Y3R1cmUKKyAqICAJICAgc3BlZWQgLSBzcGVlZCB0byBzZXQgTUFDIHRvIChzZWUgc2JtYWNfc3BlZWRfdCBlbnVtKQorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIDEgaWYgc3VjY2Vzc2Z1bAorICogICAgICAwIGluZGljYXRlcyBpbnZhbGlkIHBhcmFtZXRlcnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworc3RhdGljIGludCBzYm1hY19zZXRfc3BlZWQoc3RydWN0IHNibWFjX3NvZnRjICpzLHNibWFjX3NwZWVkX3Qgc3BlZWQpCit7CisJdWludDY0X3QgY2ZnOworCXVpbnQ2NF90IGZyYW1lY2ZnOworCisJLyoKKwkgKiBTYXZlIG5ldyBjdXJyZW50IHZhbHVlcworCSAqLworCQorCXMtPnNibV9zcGVlZCA9IHNwZWVkOworCQorCWlmIChzLT5zYm1fc3RhdGUgPT0gc2JtYWNfc3RhdGVfb24pCisJCXJldHVybiAwOwkvKiBzYXZlIGZvciBuZXh0IHJlc3RhcnQgKi8KKworCS8qCisJICogUmVhZCBjdXJyZW50IHJlZ2lzdGVyIHZhbHVlcyAKKwkgKi8KKwkKKwljZmcgPSBTQk1BQ19SRUFEQ1NSKHMtPnNibV9tYWNjZmcpOworCWZyYW1lY2ZnID0gU0JNQUNfUkVBRENTUihzLT5zYm1fZnJhbWVjZmcpOworCQorCS8qCisJICogTWFzayBvdXQgdGhlIHN0dWZmIHdlIHdhbnQgdG8gY2hhbmdlCisJICovCisJCisJY2ZnICY9IH4oTV9NQUNfQlVSU1RfRU4gfCBNX01BQ19TUEVFRF9TRUwpOworCWZyYW1lY2ZnICY9IH4oTV9NQUNfSUZHX1JYIHwgTV9NQUNfSUZHX1RYIHwgTV9NQUNfSUZHX1RIUlNIIHwKKwkJICAgICAgTV9NQUNfU0xPVF9TSVpFKTsKKwkKKwkvKgorCSAqIE5vdyBhZGQgaW4gdGhlIG5ldyBiaXRzCisJICovCisJCisJc3dpdGNoIChzcGVlZCkgeworCWNhc2Ugc2JtYWNfc3BlZWRfMTA6CisJCWZyYW1lY2ZnIHw9IFZfTUFDX0lGR19SWF8xMCB8CisJCQlWX01BQ19JRkdfVFhfMTAgfAorCQkJS19NQUNfSUZHX1RIUlNIXzEwIHwKKwkJCVZfTUFDX1NMT1RfU0laRV8xMDsKKwkJY2ZnIHw9IFZfTUFDX1NQRUVEX1NFTF8xME1CUFM7CisJCWJyZWFrOworCQkKKwljYXNlIHNibWFjX3NwZWVkXzEwMDoKKwkJZnJhbWVjZmcgfD0gVl9NQUNfSUZHX1JYXzEwMCB8CisJCQlWX01BQ19JRkdfVFhfMTAwIHwKKwkJCVZfTUFDX0lGR19USFJTSF8xMDAgfAorCQkJVl9NQUNfU0xPVF9TSVpFXzEwMDsKKwkJY2ZnIHw9IFZfTUFDX1NQRUVEX1NFTF8xMDBNQlBTIDsKKwkJYnJlYWs7CisJCQorCWNhc2Ugc2JtYWNfc3BlZWRfMTAwMDoKKwkJZnJhbWVjZmcgfD0gVl9NQUNfSUZHX1JYXzEwMDAgfAorCQkJVl9NQUNfSUZHX1RYXzEwMDAgfAorCQkJVl9NQUNfSUZHX1RIUlNIXzEwMDAgfAorCQkJVl9NQUNfU0xPVF9TSVpFXzEwMDA7CisJCWNmZyB8PSBWX01BQ19TUEVFRF9TRUxfMTAwME1CUFMgfCBNX01BQ19CVVJTVF9FTjsKKwkJYnJlYWs7CisJCQorCWNhc2Ugc2JtYWNfc3BlZWRfYXV0bzoJCS8qIFhYWCBub3QgaW1wbGVtZW50ZWQgKi8KKwkJLyogZmFsbCB0aHJvdWdoICovCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCQorCS8qCisJICogU2VuZCB0aGUgYml0cyBiYWNrIHRvIHRoZSBoYXJkd2FyZSAKKwkgKi8KKwkKKwlTQk1BQ19XUklURUNTUihzLT5zYm1fZnJhbWVjZmcsZnJhbWVjZmcpOworCVNCTUFDX1dSSVRFQ1NSKHMtPnNibV9tYWNjZmcsY2ZnKTsKKwkKKwlyZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19TRVRfRFVQTEVYKHMsZHVwbGV4LGZjKQorICogIAorICogIFNldCBFdGhlcm5ldCBkdXBsZXggYW5kIGZsb3cgY29udHJvbCBvcHRpb25zIGZvciB0aGlzIE1BQworICogIFdhcm5pbmc6IG11c3QgYmUgY2FsbGVkIHdoZW4gTUFDIGlzIG9mZiEKKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgcyAtIHNibWFjIHN0cnVjdHVyZQorICogIAkgICBkdXBsZXggLSBkdXBsZXggc2V0dGluZyAoc2VlIHNibWFjX2R1cGxleF90KQorICogIAkgICBmYyAtIGZsb3cgY29udHJvbCBzZXR0aW5nIChzZWUgc2JtYWNfZmNfdCkKKyAqICAJICAgCisgKiAgUmV0dXJuIHZhbHVlOgorICogIAkgICAxIGlmIG9rCisgKiAgCSAgIDAgaWYgYW4gaW52YWxpZCBwYXJhbWV0ZXIgY29tYmluYXRpb24gd2FzIHNwZWNpZmllZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgaW50IHNibWFjX3NldF9kdXBsZXgoc3RydWN0IHNibWFjX3NvZnRjICpzLHNibWFjX2R1cGxleF90IGR1cGxleCxzYm1hY19mY190IGZjKQoreworCXVpbnQ2NF90IGNmZzsKKwkKKwkvKgorCSAqIFNhdmUgbmV3IGN1cnJlbnQgdmFsdWVzCisJICovCisJCisJcy0+c2JtX2R1cGxleCA9IGR1cGxleDsKKwlzLT5zYm1fZmMgPSBmYzsKKwkKKwlpZiAocy0+c2JtX3N0YXRlID09IHNibWFjX3N0YXRlX29uKQorCQlyZXR1cm4gMDsJLyogc2F2ZSBmb3IgbmV4dCByZXN0YXJ0ICovCisJCisJLyoKKwkgKiBSZWFkIGN1cnJlbnQgcmVnaXN0ZXIgdmFsdWVzIAorCSAqLworCQorCWNmZyA9IFNCTUFDX1JFQURDU1Iocy0+c2JtX21hY2NmZyk7CisJCisJLyoKKwkgKiBNYXNrIG9mZiB0aGUgc3R1ZmYgd2UncmUgYWJvdXQgdG8gY2hhbmdlCisJICovCisJCisJY2ZnICY9IH4oTV9NQUNfRkNfU0VMIHwgTV9NQUNfRkNfQ01EIHwgTV9NQUNfSERYX0VOKTsKKwkKKwkKKwlzd2l0Y2ggKGR1cGxleCkgeworCWNhc2Ugc2JtYWNfZHVwbGV4X2hhbGY6CisJCXN3aXRjaCAoZmMpIHsKKwkJY2FzZSBzYm1hY19mY19kaXNhYmxlZDoKKwkJCWNmZyB8PSBNX01BQ19IRFhfRU4gfCBWX01BQ19GQ19DTURfRElTQUJMRUQ7CisJCQlicmVhazsKKwkJCQorCQljYXNlIHNibWFjX2ZjX2NvbGxpc2lvbjoKKwkJCWNmZyB8PSBNX01BQ19IRFhfRU4gfCBWX01BQ19GQ19DTURfRU5BQkxFRDsKKwkJCWJyZWFrOworCQkJCisJCWNhc2Ugc2JtYWNfZmNfY2FycmllcjoKKwkJCWNmZyB8PSBNX01BQ19IRFhfRU4gfCBWX01BQ19GQ19DTURfRU5BQl9GQUxTRUNBUlI7CisJCQlicmVhazsKKwkJCQorCQljYXNlIHNibWFjX2ZjX2F1dG86CQkvKiBYWFggbm90IGltcGxlbWVudGVkICovCisJCQkvKiBmYWxsIHRocm91Z2ggKi8JCQkJCSAgIAorCQljYXNlIHNibWFjX2ZjX2ZyYW1lOgkJLyogbm90IHZhbGlkIGluIGhhbGYgZHVwbGV4ICovCisJCWRlZmF1bHQ6CQkJLyogaW52YWxpZCBzZWxlY3Rpb24gKi8KKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCQkKKwljYXNlIHNibWFjX2R1cGxleF9mdWxsOgorCQlzd2l0Y2ggKGZjKSB7CisJCWNhc2Ugc2JtYWNfZmNfZGlzYWJsZWQ6CisJCQljZmcgfD0gVl9NQUNfRkNfQ01EX0RJU0FCTEVEOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBzYm1hY19mY19mcmFtZToKKwkJCWNmZyB8PSBWX01BQ19GQ19DTURfRU5BQkxFRDsKKwkJCWJyZWFrOworCQkJCisJCWNhc2Ugc2JtYWNfZmNfY29sbGlzaW9uOgkvKiBub3QgdmFsaWQgaW4gZnVsbCBkdXBsZXggKi8KKwkJY2FzZSBzYm1hY19mY19jYXJyaWVyOgkJLyogbm90IHZhbGlkIGluIGZ1bGwgZHVwbGV4ICovCisJCWNhc2Ugc2JtYWNfZmNfYXV0bzoJCS8qIFhYWCBub3QgaW1wbGVtZW50ZWQgKi8KKwkJCS8qIGZhbGwgdGhyb3VnaCAqLwkJCQkJICAgCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIHNibWFjX2R1cGxleF9hdXRvOgorCQkvKiBYWFggbm90IGltcGxlbWVudGVkICovCisJCWJyZWFrOworCX0KKwkKKwkvKgorCSAqIFNlbmQgdGhlIGJpdHMgYmFjayB0byB0aGUgaGFyZHdhcmUgCisJICovCisJCisJU0JNQUNfV1JJVEVDU1Iocy0+c2JtX21hY2NmZyxjZmcpOworCQorCXJldHVybiAxOworfQorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCTUFDX0lOVFIoKQorICogIAorICogIEludGVycnVwdCBoYW5kbGVyIGZvciBNQUMgaW50ZXJydXB0cworICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBNQUMgc3RydWN0dXJlCisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgbm90aGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljIGlycXJldHVybl90IHNibWFjX2ludHIoaW50IGlycSx2b2lkICpkZXZfaW5zdGFuY2Usc3RydWN0IHB0X3JlZ3MgKnJncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1aW50NjRfdCBpc3I7CisJaW50IGhhbmRsZWQgPSAwOworCisJZm9yICg7OykgeworCQkKKwkJLyoKKwkJICogUmVhZCB0aGUgSVNSICh0aGlzIGNsZWFycyB0aGUgYml0cyBpbiB0aGUgcmVhbAorCQkgKiByZWdpc3RlciwgZXhjZXB0IGZvciBjb3VudGVyIGFkZHIpCisJCSAqLworCQkKKwkJaXNyID0gU0JNQUNfUkVBRENTUihzYy0+c2JtX2lzcikgJiB+TV9NQUNfQ09VTlRFUl9BRERSOworCQkKKwkJaWYgKGlzciA9PSAwKQorCQkJYnJlYWs7CisKKwkJaGFuZGxlZCA9IDE7CisJCQorCQkvKgorCQkgKiBUcmFuc21pdHMgb24gY2hhbm5lbCAwCisJCSAqLworCQkKKwkJaWYgKGlzciAmIChNX01BQ19JTlRfQ0hBTk5FTCA8PCBTX01BQ19UWF9DSDApKSB7CisJCQlzYmRtYV90eF9wcm9jZXNzKHNjLCYoc2MtPnNibV90eGRtYSkpOworCQl9CisJCQorCQkvKgorCQkgKiBSZWNlaXZlcyBvbiBjaGFubmVsIDAKKwkJICovCisKKwkJLyoKKwkJICogSXQncyBpbXBvcnRhbnQgdG8gdGVzdCBhbGwgdGhlIGJpdHMgKG9yIGF0IGxlYXN0IHRoZQorCQkgKiBFT1BfU0VFTiBiaXQpIHdoZW4gZGVjaWRpbmcgdG8gZG8gdGhlIFJYIHByb2Nlc3MKKwkJICogcGFydGljdWxhcmx5IHdoZW4gY29hbGVzY2luZywgdG8gbWFrZSBzdXJlIHdlCisJCSAqIHRha2UgY2FyZSBvZiB0aGUgZm9sbG93aW5nOgorCQkgKgorCQkgKiBJZiB5b3UgaGF2ZSBzb21lIHBhY2tldHMgd2FpdGluZyAoaGF2ZSBiZWVuIHJlY2VpdmVkCisJCSAqIGJ1dCBubyBpbnRlcnJ1cHQpIGFuZCBnZXQgYSBUWCBpbnRlcnJ1cHQgYmVmb3JlCisJCSAqIHRoZSBSWCB0aW1lciBvciBjb3VudGVyIGV4cGlyZXMsIHJlYWRpbmcgdGhlIElTUgorCQkgKiBhYm92ZSB3aWxsIGNsZWFyIHRoZSB0aW1lciBhbmQgY291bnRlciwgYW5kIHlvdQorCQkgKiB3b24ndCBnZXQgYW5vdGhlciBpbnRlcnJ1cHQgdW50aWwgYSBwYWNrZXQgc2hvd3MKKwkJICogdXAgdG8gc3RhcnQgdGhlIHRpbWVyIGFnYWluLiAgVGVzdGluZworCQkgKiBFT1BfU0VFTiBoZXJlIHRha2VzIGNhcmUgb2YgdGhpcyBjYXNlLgorCQkgKiAoRU9QX1NFRU4gaXMgcGFydCBvZiBNX01BQ19JTlRfQ0hBTk5FTCA8PCBTX01BQ19SWF9DSDApCisJCSAqLworCQkgCisJCQorCQlpZiAoaXNyICYgKE1fTUFDX0lOVF9DSEFOTkVMIDw8IFNfTUFDX1JYX0NIMCkpIHsKKwkJCXNiZG1hX3J4X3Byb2Nlc3Moc2MsJihzYy0+c2JtX3J4ZG1hKSk7CisJCX0KKwl9CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19TVEFSVF9UWChza2IsZGV2KQorICogIAorICogIFN0YXJ0IG91dHB1dCBvbiB0aGUgc3BlY2lmaWVkIGludGVyZmFjZS4gIEJhc2ljYWxseSwgd2UgCisgKiAgcXVldWUgYXMgbWFueSBidWZmZXJzIGFzIHdlIGNhbiB1bnRpbCB0aGUgcmluZyBmaWxscyB1cCwgb3IKKyAqICB3ZSBydW4gb2ZmIHRoZSBlbmQgb2YgdGhlIHF1ZXVlLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuCisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIAorICogIAkgICAKKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgCSAgIG5vdGhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYyBpbnQgc2JtYWNfc3RhcnRfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwkvKiBsb2NrIGV0aCBpcnEgKi8KKwlzcGluX2xvY2tfaXJxICgmc2MtPnNibV9sb2NrKTsKKwkKKwkvKgorCSAqIFB1dCB0aGUgYnVmZmVyIG9uIHRoZSB0cmFuc21pdCByaW5nLiAgSWYgd2UgCisJICogZG9uJ3QgaGF2ZSByb29tLCBzdG9wIHRoZSBxdWV1ZS4KKwkgKi8KKwkKKwlpZiAoc2JkbWFfYWRkX3R4YnVmZmVyKCYoc2MtPnNibV90eGRtYSksc2tiKSkgeworCQkvKiBYWFggc2F2ZSBza2IgdGhhdCB3ZSBjb3VsZCBub3Qgc2VuZCAqLworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXNwaW5fdW5sb2NrX2lycSgmc2MtPnNibV9sb2NrKTsKKworCQlyZXR1cm4gMTsKKwl9CisJCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCisJc3Bpbl91bmxvY2tfaXJxICgmc2MtPnNibV9sb2NrKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19TRVRNVUxUSShzYykKKyAqICAKKyAqICBSZXByb2dyYW0gdGhlIG11bHRpY2FzdCB0YWJsZSBpbnRvIHRoZSBoYXJkd2FyZSwgZ2l2ZW4KKyAqICB0aGUgbGlzdCBvZiBtdWx0aWNhc3RzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW50ZXJmYWNlCisgKiAgc3RydWN0dXJlLgorICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBzYyAtIHNvZnRjCisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgbm90aGluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgdm9pZCBzYm1hY19zZXRtdWx0aShzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjKQoreworCXVpbnQ2NF90IHJlZzsKKwlzYm1hY19wb3J0X3QgcG9ydDsKKwlpbnQgaWR4OworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzYy0+c2JtX2RldjsKKwkKKwkvKiAKKwkgKiBDbGVhciBvdXQgZW50aXJlIG11bHRpY2FzdCB0YWJsZS4gIFdlIGRvIHRoaXMgYnkgbnVraW5nCisJICogdGhlIGVudGlyZSBoYXNoIHRhYmxlIGFuZCBhbGwgdGhlIGRpcmVjdCBtYXRjaGVzIGV4Y2VwdAorCSAqIHRoZSBmaXJzdCBvbmUsIHdoaWNoIGlzIHVzZWQgZm9yIG91ciBzdGF0aW9uIGFkZHJlc3MgCisJICovCisJCisJZm9yIChpZHggPSAxOyBpZHggPCBNQUNfQUREUl9DT1VOVDsgaWR4KyspIHsKKwkJcG9ydCA9IHNjLT5zYm1fYmFzZSArIFJfTUFDX0FERFJfQkFTRSsoaWR4KnNpemVvZih1aW50NjRfdCkpOworCQlTQk1BQ19XUklURUNTUihwb3J0LDApOwkKKwl9CisJCisJZm9yIChpZHggPSAwOyBpZHggPCBNQUNfSEFTSF9DT1VOVDsgaWR4KyspIHsKKwkJcG9ydCA9IHNjLT5zYm1fYmFzZSArIFJfTUFDX0hBU0hfQkFTRSsoaWR4KnNpemVvZih1aW50NjRfdCkpOworCQlTQk1BQ19XUklURUNTUihwb3J0LDApOwkKKwl9CisJCisJLyoKKwkgKiBDbGVhciB0aGUgZmlsdGVyIHRvIHNheSB3ZSBkb24ndCB3YW50IGFueSBtdWx0aWNhc3RzLgorCSAqLworCQorCXJlZyA9IFNCTUFDX1JFQURDU1Ioc2MtPnNibV9yeGZpbHRlcik7CisJcmVnICY9IH4oTV9NQUNfTUNBU1RfSU5WIHwgTV9NQUNfTUNBU1RfRU4pOworCVNCTUFDX1dSSVRFQ1NSKHNjLT5zYm1fcnhmaWx0ZXIscmVnKTsKKwkKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQkvKiAKKwkJICogRW5hYmxlIEFMTCBtdWx0aWNhc3RzLiAgRG8gdGhpcyBieSBpbnZlcnRpbmcgdGhlIAorCQkgKiBtdWx0aWNhc3QgZW5hYmxlIGJpdC4gCisJCSAqLworCQlyZWcgPSBTQk1BQ19SRUFEQ1NSKHNjLT5zYm1fcnhmaWx0ZXIpOworCQlyZWcgfD0gKE1fTUFDX01DQVNUX0lOViB8IE1fTUFDX01DQVNUX0VOKTsKKwkJU0JNQUNfV1JJVEVDU1Ioc2MtPnNibV9yeGZpbHRlcixyZWcpOworCQlyZXR1cm47CisJfQorCQorCisJLyogCisJICogUHJvZ2FtIG5ldyBtdWx0aWNhc3QgZW50cmllcy4gIEZvciBub3csIG9ubHkgdXNlIHRoZQorCSAqIHBlcmZlY3QgZmlsdGVyLiAgSW4gdGhlIGZ1dHVyZSB3ZSdsbCBuZWVkIHRvIHVzZSB0aGUKKwkgKiBoYXNoIGZpbHRlciBpZiB0aGUgcGVyZmVjdCBmaWx0ZXIgb3ZlcmZsb3dzCisJICovCisJCisJLyogWFhYIG9ubHkgdXNpbmcgcGVyZmVjdCBmaWx0ZXIgZm9yIG5vdywgbmVlZCB0byB1c2UgaGFzaAorCSAqIFhYWCBpZiB0aGUgdGFibGUgb3ZlcmZsb3dzICovCisJCisJaWR4ID0gMTsJCS8qIHNraXAgc3RhdGlvbiBhZGRyZXNzICovCisJbWNsaXN0ID0gZGV2LT5tY19saXN0OworCXdoaWxlIChtY2xpc3QgJiYgKGlkeCA8IE1BQ19BRERSX0NPVU5UKSkgeworCQlyZWcgPSBzYm1hY19hZGRyMnJlZyhtY2xpc3QtPmRtaV9hZGRyKTsKKwkJcG9ydCA9IHNjLT5zYm1fYmFzZSArIFJfTUFDX0FERFJfQkFTRSsoaWR4ICogc2l6ZW9mKHVpbnQ2NF90KSk7CisJCVNCTUFDX1dSSVRFQ1NSKHBvcnQscmVnKTsKKwkJaWR4Kys7CisJCW1jbGlzdCA9IG1jbGlzdC0+bmV4dDsKKwl9CisJCisJLyoJCisJICogRW5hYmxlIHRoZSAiYWNjZXB0IG11bHRpY2FzdCBiaXRzIiBpZiB3ZSBwcm9ncmFtbWVkIGF0IGxlYXN0IG9uZQorCSAqIG11bHRpY2FzdC4gCisJICovCisJCisJaWYgKGlkeCA+IDEpIHsKKwkJcmVnID0gU0JNQUNfUkVBRENTUihzYy0+c2JtX3J4ZmlsdGVyKTsKKwkJcmVnIHw9IE1fTUFDX01DQVNUX0VOOworCQlTQk1BQ19XUklURUNTUihzYy0+c2JtX3J4ZmlsdGVyLHJlZyk7CisJfQorfQorCisKKworI2lmIGRlZmluZWQoU0JNQUNfRVRIMF9IV0FERFIpIHx8IGRlZmluZWQoU0JNQUNfRVRIMV9IV0FERFIpIHx8IGRlZmluZWQoU0JNQUNfRVRIMl9IV0FERFIpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNCTUFDX1BBUlNFX1hESUdJVChzdHIpCisgKiAgCisgKiAgUGFyc2UgYSBoZXggZGlnaXQsIHJldHVybmluZyBpdHMgdmFsdWUKKyAqICAKKyAqICBJbnB1dCBwYXJhbWV0ZXJzOiAKKyAqICAJICAgc3RyIC0gY2hhcmFjdGVyCisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgaGV4IHZhbHVlLCBvciAtMSBpZiBpbnZhbGlkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyBpbnQgc2JtYWNfcGFyc2VfeGRpZ2l0KGNoYXIgc3RyKQoreworCWludCBkaWdpdDsKKwkKKwlpZiAoKHN0ciA+PSAnMCcpICYmIChzdHIgPD0gJzknKSkKKwkJZGlnaXQgPSBzdHIgLSAnMCc7CisJZWxzZSBpZiAoKHN0ciA+PSAnYScpICYmIChzdHIgPD0gJ2YnKSkKKwkJZGlnaXQgPSBzdHIgLSAnYScgKyAxMDsKKwllbHNlIGlmICgoc3RyID49ICdBJykgJiYgKHN0ciA8PSAnRicpKQorCQlkaWdpdCA9IHN0ciAtICdBJyArIDEwOworCWVsc2UKKwkJcmV0dXJuIC0xOworCQorCXJldHVybiBkaWdpdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTQk1BQ19QQVJTRV9IV0FERFIoc3RyLGh3YWRkcikKKyAqICAKKyAqICBDb252ZXJ0IGEgc3RyaW5nIGluIHRoZSBmb3JtIHh4Onh4Onh4Onh4Onh4Onh4IGludG8gYSA2LWJ5dGUKKyAqICBFdGhlcm5ldCBhZGRyZXNzLgorICogIAorICogIElucHV0IHBhcmFtZXRlcnM6IAorICogIAkgICBzdHIgLSBzdHJpbmcKKyAqICAJICAgaHdhZGRyIC0gcG9pbnRlciB0byBoYXJkd2FyZSBhZGRyZXNzCisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgMCBpZiBvaywgZWxzZSAtMQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCitzdGF0aWMgaW50IHNibWFjX3BhcnNlX2h3YWRkcihjaGFyICpzdHIsIHVuc2lnbmVkIGNoYXIgKmh3YWRkcikKK3sKKwlpbnQgZGlnaXQxLGRpZ2l0MjsKKwlpbnQgaWR4ID0gNjsKKwkKKwl3aGlsZSAoKnN0ciAmJiAoaWR4ID4gMCkpIHsKKwkJZGlnaXQxID0gc2JtYWNfcGFyc2VfeGRpZ2l0KCpzdHIpOworCQlpZiAoZGlnaXQxIDwgMCkKKwkJCXJldHVybiAtMTsKKwkJc3RyKys7CisJCWlmICghKnN0cikKKwkJCXJldHVybiAtMTsKKwkJCisJCWlmICgoKnN0ciA9PSAnOicpIHx8ICgqc3RyID09ICctJykpIHsKKwkJCWRpZ2l0MiA9IGRpZ2l0MTsKKwkJCWRpZ2l0MSA9IDA7CisJCX0KKwkJZWxzZSB7CisJCQlkaWdpdDIgPSBzYm1hY19wYXJzZV94ZGlnaXQoKnN0cik7CisJCQlpZiAoZGlnaXQyIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCQlzdHIrKzsKKwkJfQorCQkKKwkJKmh3YWRkcisrID0gKGRpZ2l0MSA8PCA0KSB8IGRpZ2l0MjsKKwkJaWR4LS07CisJCQorCQlpZiAoKnN0ciA9PSAnLScpCisJCQlzdHIrKzsKKwkJaWYgKCpzdHIgPT0gJzonKQorCQkJc3RyKys7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgc2IxMjUwX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKl9kZXYsIGludCBuZXdfbXR1KQoreworCWlmIChuZXdfbXR1ID4gIEVORVRfUEFDS0VUX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCV9kZXYtPm10dSA9IG5ld19tdHU7CisJcHJpbnRrKEtFUk5fSU5GTyAiY2hhbmdpbmcgdGhlIG10dSB0byAlZFxuIiwgbmV3X210dSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgU0JNQUNfSU5JVChkZXYpCisgKiAgCisgKiAgQXR0YWNoIHJvdXRpbmUgLSBpbml0IGhhcmR3YXJlIGFuZCBob29rIG91cnNlbHZlcyBpbnRvIGxpbnV4CisgKiAgCisgKiAgSW5wdXQgcGFyYW1ldGVyczogCisgKiAgCSAgIGRldiAtIG5ldF9kZXZpY2Ugc3RydWN0dXJlCisgKiAgCSAgIAorICogIFJldHVybiB2YWx1ZToKKyAqICAJICAgc3RhdHVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyBpbnQgc2JtYWNfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaWR4KQoreworCXN0cnVjdCBzYm1hY19zb2Z0YyAqc2M7CisJdW5zaWduZWQgY2hhciAqZWFkZHI7CisJdWludDY0X3QgZWFfcmVnOworCWludCBpOworCWludCBlcnI7CisJCisJc2MgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCS8qIERldGVybWluZSBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLworCQorCXNjLT5zYm1fYmFzZSA9IElPQUREUihkZXYtPmJhc2VfYWRkcik7CisJc2MtPnNibV9kZXYgPSBkZXY7CisJc2MtPnNiZV9pZHggPSBpZHg7CisJCisJZWFkZHIgPSBzYy0+c2JtX2h3YWRkcjsKKwkKKwkvKiAKKwkgKiBSZWFkIHRoZSBldGhlcm5ldCBhZGRyZXNzLiAgVGhlIGZpcndtYXJlIGxlZnQgdGhpcyBwcm9ncmFtbWVkCisJICogZm9yIHVzIGluIHRoZSBldGhlcm5ldCBhZGRyZXNzIHJlZ2lzdGVyIGZvciBlYWNoIG1hYy4KKwkgKi8KKwkKKwllYV9yZWcgPSBTQk1BQ19SRUFEQ1NSKHNjLT5zYm1fYmFzZSArIFJfTUFDX0VUSEVSTkVUX0FERFIpOworCVNCTUFDX1dSSVRFQ1NSKHNjLT5zYm1fYmFzZSArIFJfTUFDX0VUSEVSTkVUX0FERFIsIDApOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJZWFkZHJbaV0gPSAodWludDhfdCkgKGVhX3JlZyAmIDB4RkYpOworCQllYV9yZWcgPj49IDg7CisJfQorCQorCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJZGV2LT5kZXZfYWRkcltpXSA9IGVhZGRyW2ldOworCX0KKwkKKwkKKwkvKgorCSAqIEluaXQgcGFja2V0IHNpemUgCisJICovCisJCisJc2MtPnNibV9idWZmZXJzaXplID0gRU5FVF9QQUNLRVRfU0laRSArIFNNUF9DQUNIRV9CWVRFUyAqIDIgKyBFVEhFUl9BTElHTjsKKworCS8qIAorCSAqIEluaXRpYWxpemUgY29udGV4dCAoZ2V0IHBvaW50ZXJzIHRvIHJlZ2lzdGVycyBhbmQgc3R1ZmYpLCB0aGVuCisJICogYWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgdGhlIGRlc2NyaXB0b3IgdGFibGVzLgorCSAqLworCQorCXNibWFjX2luaXRjdHgoc2MpOworCQorCS8qCisJICogU2V0IHVwIExpbnV4IGRldmljZSBjYWxsaW5zCisJICovCisJCisJc3Bpbl9sb2NrX2luaXQoJihzYy0+c2JtX2xvY2spKTsKKwkKKwlkZXYtPm9wZW4gICAgICAgICAgICAgICA9IHNibWFjX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgICAgPSBzYm1hY19zdGFydF90eDsKKwlkZXYtPnN0b3AgICAgICAgICAgICAgICA9IHNibWFjX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzICAgICAgICAgID0gc2JtYWNfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gc2JtYWNfc2V0X3J4X21vZGU7CisJZGV2LT5kb19pb2N0bCAgICAgICAgICAgPSBzYm1hY19taWlfaW9jdGw7CisJZGV2LT50eF90aW1lb3V0ICAgICAgICAgPSBzYm1hY190eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gICAgID0gVFhfVElNRU9VVDsKKworCWRldi0+Y2hhbmdlX210dSAgICAgICAgID0gc2IxMjUwX2NoYW5nZV9tdHU7CisKKwkvKiBUaGlzIGlzIG5lZWRlZCBmb3IgUEFTUzIgZm9yIFJ4IEgvVyBjaGVja3N1bSBmZWF0dXJlICovCisJc2JtYWNfc2V0X2lwaGRyX29mZnNldChzYyk7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bmluaXQ7CisKKwlpZiAocGVyaXBoX3JldiA+PSAyKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBlbmFibGluZyBUQ1AgcmN2IGNoZWNrc3VtXG4iLAorCQkJc2MtPnNibV9kZXYtPm5hbWUpOworCX0KKworCS8qCisJICogRGlzcGxheSBFdGhlcm5ldCBhZGRyZXNzICh0aGlzIGlzIGNhbGxlZCBkdXJpbmcgdGhlIGNvbmZpZworCSAqIHByb2Nlc3Mgc28gd2UgbmVlZCB0byBmaW5pc2ggb2ZmIHRoZSBjb25maWcgbWVzc2FnZSB0aGF0CisJICogd2FzIGJlaW5nIGRpc3BsYXllZCkKKwkgKi8KKwlwcmludGsoS0VSTl9JTkZPCisJICAgICAgICIlczogU2lCeXRlIEV0aGVybmV0IGF0IDB4JTA4bFgsIGFkZHJlc3M6ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLCAKKwkgICAgICAgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwKKwkgICAgICAgZWFkZHJbMF0sZWFkZHJbMV0sZWFkZHJbMl0sZWFkZHJbM10sZWFkZHJbNF0sZWFkZHJbNV0pOworCQorCisJcmV0dXJuIDA7CisKK291dF91bmluaXQ6CisJc2JtYWNfdW5pbml0Y3R4KHNjKTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCBzYm1hY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNibWFjX3NvZnRjICpzYyA9IG5ldGRldl9wcml2KGRldik7CisJCisJaWYgKGRlYnVnID4gMSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNibWFjX29wZW4oKSBpcnEgJWQuXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwl9CisJCisJLyogCisJICogbWFwL3JvdXRlIGludGVycnVwdCAoY2xlYXIgc3RhdHVzIGZpcnN0LCBpbiBjYXNlIHNvbWV0aGluZworCSAqIHdlaXJkIGlzIHBlbmRpbmc7IHdlIGhhdmVuJ3QgaW5pdGlhbGl6ZWQgdGhlIG1hYyByZWdpc3RlcnMKKwkgKiB5ZXQpCisJICovCisKKwlTQk1BQ19SRUFEQ1NSKHNjLT5zYm1faXNyKTsKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICZzYm1hY19pbnRyLCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyoKKwkgKiBDb25maWd1cmUgZGVmYXVsdCBzcGVlZCAKKwkgKi8KKworCXNibWFjX21paV9wb2xsKHNjLG5vaXN5X21paSk7CisJCisJLyoKKwkgKiBUdXJuIG9uIHRoZSBjaGFubmVsCisJICovCisKKwlzYm1hY19zZXRfY2hhbm5lbF9zdGF0ZShzYyxzYm1hY19zdGF0ZV9vbik7CisJCisJLyoKKwkgKiBYWFggU3RhdGlvbiBhZGRyZXNzIGlzIGluIGRldi0+ZGV2X2FkZHIKKwkgKi8KKwkKKwlpZiAoZGV2LT5pZl9wb3J0ID09IDApCisJCWRldi0+aWZfcG9ydCA9IDA7IAorCQorCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCisJc2JtYWNfc2V0X3J4X21vZGUoZGV2KTsKKwkKKwkvKiBTZXQgdGhlIHRpbWVyIHRvIGNoZWNrIGZvciBsaW5rIGJlYXQuICovCisJaW5pdF90aW1lcigmc2MtPnNibV90aW1lcik7CisJc2MtPnNibV90aW1lci5leHBpcmVzID0gamlmZmllcyArIDIgKiBIWi8xMDA7CisJc2MtPnNibV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCXNjLT5zYm1fdGltZXIuZnVuY3Rpb24gPSAmc2JtYWNfdGltZXI7CisJYWRkX3RpbWVyKCZzYy0+c2JtX3RpbWVyKTsKKwkKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgc2JtYWNfbWlpX3BvbGwoc3RydWN0IHNibWFjX3NvZnRjICpzLGludCBub2lzeSkKK3sKKyAgICBpbnQgYm1zcixibWNyLGsxc3RzcixhbmxwYXI7CisgICAgaW50IGNoZzsKKyAgICBjaGFyIGJ1ZmZlclsxMDBdOworICAgIGNoYXIgKnAgPSBidWZmZXI7CisKKyAgICAvKiBSZWFkIHRoZSBtb2RlIHN0YXR1cyBhbmQgbW9kZSBjb250cm9sIHJlZ2lzdGVycy4gKi8KKyAgICBibXNyID0gc2JtYWNfbWlpX3JlYWQocyxzLT5zYm1fcGh5c1swXSxNSUlfQk1TUik7CisgICAgYm1jciA9IHNibWFjX21paV9yZWFkKHMscy0+c2JtX3BoeXNbMF0sTUlJX0JNQ1IpOworCisgICAgLyogZ2V0IHRoZSBsaW5rIHBhcnRuZXIgc3RhdHVzICovCisgICAgYW5scGFyID0gc2JtYWNfbWlpX3JlYWQocyxzLT5zYm1fcGh5c1swXSxNSUlfQU5MUEFSKTsKKworICAgIC8qIGlmIHN1cHBvcnRlZCwgcmVhZCB0aGUgMTAwMGJhc2VUIHJlZ2lzdGVyICovCisgICAgaWYgKGJtc3IgJiBCTVNSXzEwMDBCVF9YU1IpIHsKKwlrMXN0c3IgPSBzYm1hY19taWlfcmVhZChzLHMtPnNibV9waHlzWzBdLE1JSV9LMVNUU1IpOworCX0KKyAgICBlbHNlIHsKKwlrMXN0c3IgPSAwOworCX0KKworICAgIGNoZyA9IDA7CisKKyAgICBpZiAoKGJtc3IgJiBCTVNSX0xJTktTVEFUKSA9PSAwKSB7CisJLyoKKwkgKiBJZiBsaW5rIHN0YXR1cyBpcyBkb3duLCBjbGVhciBvdXQgb2xkIGluZm8gc28gdGhhdCB3aGVuCisJICogaXQgY29tZXMgYmFjayB1cCBpdCB3aWxsIGZvcmNlIHVzIHRvIHJlY29uZmlndXJlIHNwZWVkCisJICovCisJcy0+c2JtX3BoeV9vbGRibXNyID0gMDsKKwlzLT5zYm1fcGh5X29sZGFubHBhciA9IDA7CisJcy0+c2JtX3BoeV9vbGRrMXN0c3IgPSAwOworCXJldHVybiAwOworCX0KKworICAgIGlmICgocy0+c2JtX3BoeV9vbGRibXNyICE9IGJtc3IpIHx8CisJKHMtPnNibV9waHlfb2xkYW5scGFyICE9IGFubHBhcikgfHwKKwkocy0+c2JtX3BoeV9vbGRrMXN0c3IgIT0gazFzdHNyKSkgeworCWlmIChkZWJ1ZyA+IDEpIHsKKwkgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBibXNyOiV4LyV4IGFubHBhcjoleC8leCAgazFzdHNyOiV4LyV4XG4iLAorCSAgICAgICBzLT5zYm1fZGV2LT5uYW1lLAorCSAgICAgICBzLT5zYm1fcGh5X29sZGJtc3IsYm1zciwKKwkgICAgICAgcy0+c2JtX3BoeV9vbGRhbmxwYXIsYW5scGFyLAorCSAgICAgICBzLT5zYm1fcGh5X29sZGsxc3RzcixrMXN0c3IpOworCSAgICB9CisJcy0+c2JtX3BoeV9vbGRibXNyID0gYm1zcjsKKwlzLT5zYm1fcGh5X29sZGFubHBhciA9IGFubHBhcjsKKwlzLT5zYm1fcGh5X29sZGsxc3RzciA9IGsxc3RzcjsKKwljaGcgPSAxOworCX0KKworICAgIGlmIChjaGcgPT0gMCkKKwkgICAgcmV0dXJuIDA7CisKKyAgICBwICs9IHNwcmludGYocCwiTGluayBzcGVlZDogIik7CisKKyAgICBpZiAoazFzdHNyICYgSzFTVFNSX0xQMUtGRCkgeworCXMtPnNibV9zcGVlZCA9IHNibWFjX3NwZWVkXzEwMDA7CisJcy0+c2JtX2R1cGxleCA9IHNibWFjX2R1cGxleF9mdWxsOworCXMtPnNibV9mYyA9IHNibWFjX2ZjX2ZyYW1lOworCXAgKz0gc3ByaW50ZihwLCIxMDAwQmFzZVQgRkRYIik7CisJfQorICAgIGVsc2UgaWYgKGsxc3RzciAmIEsxU1RTUl9MUDFLSEQpIHsKKwlzLT5zYm1fc3BlZWQgPSBzYm1hY19zcGVlZF8xMDAwOworCXMtPnNibV9kdXBsZXggPSBzYm1hY19kdXBsZXhfaGFsZjsKKwlzLT5zYm1fZmMgPSBzYm1hY19mY19kaXNhYmxlZDsKKwlwICs9IHNwcmludGYocCwiMTAwMEJhc2VUIEhEWCIpOworCX0KKyAgICBlbHNlIGlmIChhbmxwYXIgJiBBTkxQQVJfVFhGRCkgeworCXMtPnNibV9zcGVlZCA9IHNibWFjX3NwZWVkXzEwMDsKKwlzLT5zYm1fZHVwbGV4ID0gc2JtYWNfZHVwbGV4X2Z1bGw7CisJcy0+c2JtX2ZjID0gKGFubHBhciAmIEFOTFBBUl9QQVVTRSkgPyBzYm1hY19mY19mcmFtZSA6IHNibWFjX2ZjX2Rpc2FibGVkOworCXAgKz0gc3ByaW50ZihwLCIxMDBCYXNlVCBGRFgiKTsKKwl9CisgICAgZWxzZSBpZiAoYW5scGFyICYgQU5MUEFSX1RYSEQpIHsKKwlzLT5zYm1fc3BlZWQgPSBzYm1hY19zcGVlZF8xMDA7CisJcy0+c2JtX2R1cGxleCA9IHNibWFjX2R1cGxleF9oYWxmOworCXMtPnNibV9mYyA9IHNibWFjX2ZjX2Rpc2FibGVkOworCXAgKz0gc3ByaW50ZihwLCIxMDBCYXNlVCBIRFgiKTsKKwl9CisgICAgZWxzZSBpZiAoYW5scGFyICYgQU5MUEFSXzEwRkQpIHsKKwlzLT5zYm1fc3BlZWQgPSBzYm1hY19zcGVlZF8xMDsKKwlzLT5zYm1fZHVwbGV4ID0gc2JtYWNfZHVwbGV4X2Z1bGw7CisJcy0+c2JtX2ZjID0gc2JtYWNfZmNfZnJhbWU7CisJcCArPSBzcHJpbnRmKHAsIjEwQmFzZVQgRkRYIik7CisJfQorICAgIGVsc2UgaWYgKGFubHBhciAmIEFOTFBBUl8xMEhEKSB7CisJcy0+c2JtX3NwZWVkID0gc2JtYWNfc3BlZWRfMTA7CisJcy0+c2JtX2R1cGxleCA9IHNibWFjX2R1cGxleF9oYWxmOworCXMtPnNibV9mYyA9IHNibWFjX2ZjX2NvbGxpc2lvbjsKKwlwICs9IHNwcmludGYocCwiMTBCYXNlVCBIRFgiKTsKKwl9CisgICAgZWxzZSB7CisJcCArPSBzcHJpbnRmKHAsIlVua25vd24iKTsKKwl9CisKKyAgICBpZiAobm9pc3kpIHsKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzXG4iLHMtPnNibV9kZXYtPm5hbWUsYnVmZmVyKTsKKwkgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHZvaWQgc2JtYWNfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBzYm1hY19zb2Z0YyAqc2MgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBuZXh0X3RpY2sgPSBIWjsKKwlpbnQgbWlpX3N0YXR1czsKKworCXNwaW5fbG9ja19pcnEgKCZzYy0+c2JtX2xvY2spOworCQorCS8qIG1ha2UgSUZGX1JVTk5JTkcgZm9sbG93IHRoZSBNSUkgc3RhdHVzIGJpdCAiTGluayBlc3RhYmxpc2hlZCIgKi8KKwltaWlfc3RhdHVzID0gc2JtYWNfbWlpX3JlYWQoc2MsIHNjLT5zYm1fcGh5c1swXSwgTUlJX0JNU1IpOworCQorCWlmICggKG1paV9zdGF0dXMgJiBCTVNSX0xJTktTVEFUKSAhPSAoc2MtPnNibV9waHlfb2xkbGlua3N0YXQpICkgeworICAgIAkgICAgICAgIHNjLT5zYm1fcGh5X29sZGxpbmtzdGF0ID0gbWlpX3N0YXR1cyAmIEJNU1JfTElOS1NUQVQ7CisJCWlmIChtaWlfc3RhdHVzICYgQk1TUl9MSU5LU1RBVCkgeworCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQl9CisJCWVsc2UgeworCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsJCisJCX0KKwl9CisJCisJLyoKKwkgKiBQb2xsIHRoZSBQSFkgdG8gc2VlIHdoYXQgc3BlZWQgd2Ugc2hvdWxkIGJlIHJ1bm5pbmcgYXQKKwkgKi8KKworCWlmIChzYm1hY19taWlfcG9sbChzYyxub2lzeV9taWkpKSB7CisJCWlmIChzYy0+c2JtX3N0YXRlICE9IHNibWFjX3N0YXRlX29mZikgeworCQkJLyoKKwkJCSAqIHNvbWV0aGluZyBjaGFuZ2VkLCByZXN0YXJ0IHRoZSBjaGFubmVsCisJCQkgKi8KKwkJCWlmIChkZWJ1ZyA+IDEpIHsKKwkJCQlwcmludGsoIiVzOiByZXN0YXJ0aW5nIGNoYW5uZWwgYmVjYXVzZSBzcGVlZCBjaGFuZ2VkXG4iLAorCQkJCSAgICAgICBzYy0+c2JtX2Rldi0+bmFtZSk7CisJCQl9CisJCQlzYm1hY19jaGFubmVsX3N0b3Aoc2MpOworCQkJc2JtYWNfY2hhbm5lbF9zdGFydChzYyk7CisJCX0KKwl9CisJCisJc3Bpbl91bmxvY2tfaXJxICgmc2MtPnNibV9sb2NrKTsKKwkKKwlzYy0+c2JtX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbmV4dF90aWNrOworCWFkZF90aW1lcigmc2MtPnNibV90aW1lcik7Cit9CisKKworc3RhdGljIHZvaWQgc2JtYWNfdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwlzcGluX2xvY2tfaXJxICgmc2MtPnNibV9sb2NrKTsKKwkKKwkKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlzYy0+c2JtX3N0YXRzLnR4X2Vycm9ycysrOworCQorCXNwaW5fdW5sb2NrX2lycSAoJnNjLT5zYm1fbG9jayk7CisKKwlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IFRyYW5zbWl0IHRpbWVkIG91dFxuIixkZXYtPm5hbWUpOworfQorCisKKworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNibWFjX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzYm1hY19zb2Z0YyAqc2MgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjLT5zYm1fbG9jaywgZmxhZ3MpOworCQorCS8qIFhYWCB1cGRhdGUgb3RoZXIgc3RhdHMgaGVyZSAqLworCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjLT5zYm1fbG9jaywgZmxhZ3MpOworCQorCXJldHVybiAmc2MtPnNibV9zdGF0czsKK30KKworCisKK3N0YXRpYyB2b2lkIHNibWFjX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbXNnX2ZsYWcgPSAwOworCXN0cnVjdCBzYm1hY19zb2Z0YyAqc2MgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjLT5zYm1fbG9jaywgZmxhZ3MpOworCWlmICgoZGV2LT5mbGFncyBeIHNjLT5zYm1fZGV2ZmxhZ3MpICYgSUZGX1BST01JU0MpIHsKKwkJLyoKKwkJICogUHJvbWlzY3VvdXMgY2hhbmdlZC4KKwkJICovCisJCQorCQlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CQorCQkJLyogVW5jb25kaXRpb25hbGx5IGxvZyBuZXQgdGFwcy4gKi8KKwkJCW1zZ19mbGFnID0gMTsKKwkJCXNibWFjX3Byb21pc2N1b3VzX21vZGUoc2MsMSk7CisJCX0KKwkJZWxzZSB7CisJCQltc2dfZmxhZyA9IDI7CisJCQlzYm1hY19wcm9taXNjdW91c19tb2RlKHNjLDApOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjLT5zYm1fbG9jaywgZmxhZ3MpOworCQorCWlmIChtc2dfZmxhZykgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBQcm9taXNjdW91cyBtb2RlICVzYWJsZWQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLChtc2dfZmxhZz09MSk/ImVuIjoiZGlzIik7CisJfQorCQorCS8qCisJICogUHJvZ3JhbSB0aGUgbXVsdGljYXN0cy4gIERvIHRoaXMgZXZlcnkgdGltZS4KKwkgKi8KKwkKKwlzYm1hY19zZXRtdWx0aShzYyk7CisJCit9CisKK3N0YXRpYyBpbnQgc2JtYWNfbWlpX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IHNibWFjX3NvZnRjICpzYyA9IG5ldGRldl9wcml2KGRldik7CisJdTE2ICpkYXRhID0gKHUxNiAqKSZycS0+aWZyX2lmcnU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZzYy0+c2JtX2xvY2ssIGZsYWdzKTsKKwlyZXR2YWwgPSAwOworCQorCXN3aXRjaChjbWQpIHsKKwljYXNlIFNJT0NERVZQUklWQVRFOgkJLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBQSFkgaW4gdXNlLiAqLworCQlkYXRhWzBdID0gc2MtPnNibV9waHlzWzBdICYgMHgxZjsKKwkJLyogRmFsbCBUaHJvdWdoICovCisJY2FzZSBTSU9DREVWUFJJVkFURSsxOgkJLyogUmVhZCB0aGUgc3BlY2lmaWVkIE1JSSByZWdpc3Rlci4gKi8KKwkJZGF0YVszXSA9IHNibWFjX21paV9yZWFkKHNjLCBkYXRhWzBdICYgMHgxZiwgZGF0YVsxXSAmIDB4MWYpOworCQlicmVhazsKKwljYXNlIFNJT0NERVZQUklWQVRFKzI6CQkvKiBXcml0ZSB0aGUgc3BlY2lmaWVkIE1JSSByZWdpc3RlciAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCXJldHZhbCA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChkZWJ1ZyA+IDEpIHsKKwkJICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc2JtYWNfbWlpX2lvY3RsOiB3cml0ZSAlMDJYICUwMlggJTAyWFxuIixkZXYtPm5hbWUsCisJCSAgICAgICBkYXRhWzBdLGRhdGFbMV0sZGF0YVsyXSk7CisJCSAgICB9CisJCXNibWFjX21paV93cml0ZShzYywgZGF0YVswXSAmIDB4MWYsIGRhdGFbMV0gJiAweDFmLCBkYXRhWzJdKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dmFsID0gLUVPUE5PVFNVUFA7CisJfQorCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjLT5zYm1fbG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgc2JtYWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpcnE7CisKKwlzYm1hY19zZXRfY2hhbm5lbF9zdGF0ZShzYyxzYm1hY19zdGF0ZV9vZmYpOworCisJZGVsX3RpbWVyX3N5bmMoJnNjLT5zYm1fdGltZXIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNjLT5zYm1fbG9jaywgZmxhZ3MpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKGRlYnVnID4gMSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkXG4iLGRldi0+bmFtZSk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2MtPnNibV9sb2NrLCBmbGFncyk7CisKKwlpcnEgPSBkZXYtPmlycTsKKwlzeW5jaHJvbml6ZV9pcnEoaXJxKTsKKwlmcmVlX2lycShpcnEsIGRldik7CisKKwlzYmRtYV9lbXB0eXJpbmcoJihzYy0+c2JtX3R4ZG1hKSk7CisJc2JkbWFfZW1wdHlyaW5nKCYoc2MtPnNibV9yeGRtYSkpOworCQorCXJldHVybiAwOworfQorCisKKworI2lmIGRlZmluZWQoU0JNQUNfRVRIMF9IV0FERFIpIHx8IGRlZmluZWQoU0JNQUNfRVRIMV9IV0FERFIpIHx8IGRlZmluZWQoU0JNQUNfRVRIMl9IV0FERFIpCitzdGF0aWMgdm9pZAorc2JtYWNfc2V0dXBfaHdhZGRyKGludCBjaGFuLGNoYXIgKmFkZHIpCit7CisJdWludDhfdCBlYWRkcls2XTsKKwl1aW50NjRfdCB2YWw7CisJc2JtYWNfcG9ydF90IHBvcnQ7CisKKwlwb3J0ID0gQV9NQUNfQ0hBTk5FTF9CQVNFKGNoYW4pOworCXNibWFjX3BhcnNlX2h3YWRkcihhZGRyLGVhZGRyKTsKKwl2YWwgPSBzYm1hY19hZGRyMnJlZyhlYWRkcik7CisJU0JNQUNfV1JJVEVDU1IoSU9BRERSKHBvcnQrUl9NQUNfRVRIRVJORVRfQUREUiksdmFsKTsKKwl2YWwgPSBTQk1BQ19SRUFEQ1NSKElPQUREUihwb3J0K1JfTUFDX0VUSEVSTkVUX0FERFIpKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9zYm1hY1tNQVhfVU5JVFNdOworCitzdGF0aWMgaW50IF9faW5pdAorc2JtYWNfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgaWR4OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc2JtYWNfcG9ydF90IHBvcnQ7CisJaW50IGNoaXBfbWF4X3VuaXRzOworCQorCS8qCisJICogRm9yIGJyaW5ndXAgd2hlbiBub3QgdXNpbmcgdGhlIGZpcm13YXJlLCB3ZSBjYW4gcHJlLWZpbGwKKwkgKiB0aGUgTUFDIGFkZHJlc3NlcyB1c2luZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzCisJICogc3BlY2lmaWVkIGluIHRoaXMgZmlsZSAob3IgbWF5YmUgZnJvbSB0aGUgY29uZmlnIGZpbGU/KQorCSAqLworI2lmZGVmIFNCTUFDX0VUSDBfSFdBRERSCisJc2JtYWNfc2V0dXBfaHdhZGRyKDAsU0JNQUNfRVRIMF9IV0FERFIpOworI2VuZGlmCisjaWZkZWYgU0JNQUNfRVRIMV9IV0FERFIKKwlzYm1hY19zZXR1cF9od2FkZHIoMSxTQk1BQ19FVEgxX0hXQUREUik7CisjZW5kaWYKKyNpZmRlZiBTQk1BQ19FVEgyX0hXQUREUgorCXNibWFjX3NldHVwX2h3YWRkcigyLFNCTUFDX0VUSDJfSFdBRERSKTsKKyNlbmRpZgorCisJLyoKKwkgKiBXYWxrIHRocm91Z2ggdGhlIEV0aGVybmV0IGNvbnRyb2xsZXJzIGFuZCBmaW5kCisJICogdGhvc2Ugd2hvIGhhdmUgdGhlaXIgTUFDIGFkZHJlc3NlcyBzZXQuCisJICovCisJc3dpdGNoIChzb2NfdHlwZSkgeworCWNhc2UgS19TWVNfU09DX1RZUEVfQkNNMTI1MDoKKwljYXNlIEtfU1lTX1NPQ19UWVBFX0JDTTEyNTBfQUxUOgorCQljaGlwX21heF91bml0cyA9IDM7CisJCWJyZWFrOworCWNhc2UgS19TWVNfU09DX1RZUEVfQkNNMTEyMDoKKwljYXNlIEtfU1lTX1NPQ19UWVBFX0JDTTExMjU6CisJY2FzZSBLX1NZU19TT0NfVFlQRV9CQ00xMTI1SDoKKwljYXNlIEtfU1lTX1NPQ19UWVBFX0JDTTEyNTBfQUxUMjogLyogSHlicmlkICovCisJCWNoaXBfbWF4X3VuaXRzID0gMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2hpcF9tYXhfdW5pdHMgPSAwOworCQlicmVhazsKKwl9CisJaWYgKGNoaXBfbWF4X3VuaXRzID4gTUFYX1VOSVRTKQorCQljaGlwX21heF91bml0cyA9IE1BWF9VTklUUzsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgY2hpcF9tYXhfdW5pdHM7IGlkeCsrKSB7CisKKwkgICAgICAgIC8qCisJICAgICAgICAgKiBUaGlzIGlzIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIE1BQy4KKwkJICovCisKKwkgICAgICAgIHBvcnQgPSBBX01BQ19DSEFOTkVMX0JBU0UoaWR4KTsKKworCQkvKgkKKwkJICogVGhlIFJfTUFDX0VUSEVSTkVUX0FERFIgcmVnaXN0ZXIgd2lsbCBiZSBzZXQgdG8gc29tZSBub256ZXJvCisJCSAqIHZhbHVlIGZvciB1cyBieSB0aGUgZmlybXdhcmUgaWYgd2UncmUgZ29pbmcgdG8gdXNlIHRoaXMgTUFDLgorCQkgKiBJZiB3ZSBmaW5kIGEgemVybywgc2tpcCB0aGlzIE1BQy4KKwkJICovCisKKwkJc2JtYWNfb3JpZ19od2FkZHJbaWR4XSA9IFNCTUFDX1JFQURDU1IoSU9BRERSKHBvcnQrUl9NQUNfRVRIRVJORVRfQUREUikpOworCQlpZiAoc2JtYWNfb3JpZ19od2FkZHJbaWR4XSA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAic2JtYWM6IG5vdCBjb25maWd1cmluZyBNQUMgYXQgIgorCQkJICAgICAgICIlbHhcbiIsIHBvcnQpOworCQkgICAgY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBPa2F5LCBjb29sLiAgSW5pdGlhbGl6ZSB0aGlzIE1BQy4KKwkJICovCisKKwkJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBzYm1hY19zb2Z0YykpOworCQlpZiAoIWRldikgCisJCQlyZXR1cm4gLUVOT01FTTsJLyogcmV0dXJuIEVOT01FTSAqLworCisJCXByaW50ayhLRVJOX0RFQlVHICJzYm1hYzogY29uZmlndXJpbmcgTUFDIGF0ICVseFxuIiwgcG9ydCk7CisKKwkJZGV2LT5pcnEgPSBLX0lOVF9NQUNfMCArIGlkeDsKKwkJZGV2LT5iYXNlX2FkZHIgPSBwb3J0OworCQlkZXYtPm1lbV9lbmQgPSAwOworCQlpZiAoc2JtYWNfaW5pdChkZXYsIGlkeCkpIHsKKwkJCXBvcnQgPSBBX01BQ19DSEFOTkVMX0JBU0UoaWR4KTsKKwkJCVNCTUFDX1dSSVRFQ1NSKElPQUREUihwb3J0K1JfTUFDX0VUSEVSTkVUX0FERFIpLAorCQkJCSAgICAgICBzYm1hY19vcmlnX2h3YWRkcltpZHhdKTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQljb250aW51ZTsKKwkJfQorCQlkZXZfc2JtYWNbaWR4XSA9IGRldjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0CitzYm1hY19jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGlkeDsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX1VOSVRTOyBpZHgrKykgeworCQlzdHJ1Y3Qgc2JtYWNfc29mdGMgKnNjOworCQlkZXYgPSBkZXZfc2JtYWNbaWR4XTsKKwkJaWYgKCFkZXYpCisJCQljb250aW51ZTsKKworCQlzYyA9IG5ldGRldl9wcml2KGRldik7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCXNibWFjX3VuaW5pdGN0eChzYyk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJfQorfQorCittb2R1bGVfaW5pdChzYm1hY19pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChzYm1hY19jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZWVxODAwNS5jIGIvZHJpdmVycy9uZXQvc2VlcTgwMDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWRjYTM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2VlcTgwMDUuYwpAQCAtMCwwICsxLDc2OSBAQAorLyogc2VlcTgwMDUuYzogQSBuZXR3b3JrIGRyaXZlciBmb3IgbGludXguICovCisvKgorCUJhc2VkIG9uIHNrZWxldG9uLmMsCisJV3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisJU2VlIHRoZSBza2VsZXRvbi5jIGZpbGUgZm9yIGZ1cnRoZXIgY29weXJpZ2h0IGluZm9ybWF0aW9uLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGhhbWlzaEB6b3QuYXBhbmEub3JnLmF1CisKKwlUaGlzIGZpbGUgaXMgYSBuZXR3b3JrIGRldmljZSBkcml2ZXIgZm9yIHRoZSBTRUVRIDgwMDUgY2hpcHNldCBhbmQKKwl0aGUgTGludXggb3BlcmF0aW5nIHN5c3RlbS4KKworKi8KKworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0KKwkic2VlcTgwMDUuYzp2MS4wMCA4LzA3Lzk1IEhhbWlzaCBDb2xlbWFuIChoYW1pc2hAem90LmFwYW5hLm9yZy5hdSlcbiI7CisKKy8qCisgIFNvdXJjZXM6CisgIAlTRUVRIDgwMDUgZGF0YWJvb2sKKyAgCQorICBWZXJzaW9uIGhpc3Rvcnk6CisgIAkxLjAwCVB1YmxpYyByZWxlYXNlLiBjb3NtZXRpYyBjaGFuZ2VzIChubyB3YXJuaW5ncyBub3cpCisgIAkwLjY4CVR1cm5pbmcgcGVyLSBwYWNrZXQsaW50ZXJydXB0IGRlYnVnIG1lc3NhZ2VzIG9mZiAtIHRlc3RpbmcgZm9yIHJlbGVhc2UuCisgIAkwLjY3CXRpbWluZyBwcm9ibGVtcy9iYWQgYnVmZmVyIHJlYWRzIHNlZW0gdG8gYmUgZml4ZWQgbm93CisgIAkwLjYzCSohQCQgcHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMgLS0gbm93IHBhY2tldHMgZmxvdworICAJMC41NglTZW5kIHdvcmtpbmcKKyAgCTAuNDgJUmVjZWl2ZSB3b3JraW5nCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNpbmNsdWRlICJzZWVxODAwNS5oIgorCisvKiBGaXJzdCwgYSBmZXcgZGVmaW5pdGlvbnMgdGhhdCB0aGUgYnJhdmUgbWlnaHQgY2hhbmdlLiAqLworLyogQSB6ZXJvLXRlcm1pbmF0ZWQgbGlzdCBvZiBJL08gYWRkcmVzc2VzIHRvIGJlIHByb2JlZC4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2VlcTgwMDVfcG9ydGxpc3RbXSBfX2luaXRkYXRhID0KKyAgIHsgMHgzMDAsIDB4MzIwLCAweDM0MCwgMHgzNjAsIDB9OworCisvKiB1c2UgMCBmb3IgcHJvZHVjdGlvbiwgMSBmb3IgdmVyaWZpY2F0aW9uLCA+MiBmb3IgZGVidWcgKi8KKyNpZm5kZWYgTkVUX0RFQlVHCisjZGVmaW5lIE5FVF9ERUJVRyAxCisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmV0X2RlYnVnID0gTkVUX0RFQlVHOworCisvKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4gKi8KK3N0cnVjdCBuZXRfbG9jYWwgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXVuc2lnbmVkIHNob3J0IHJlY2VpdmVfcHRyOwkJLyogV2hhdCBhZGRyZXNzIGluIHBhY2tldCBtZW1vcnkgZG8gd2UgZXhwZWN0IGEgcmVjdl9wa3RfaGVhZGVyPyAqLworCWxvbmcgb3Blbl90aW1lOwkJCQkvKiBVc2VsZXNzIGV4YW1wbGUgbG9jYWwgaW5mby4gKi8KK307CisKKy8qIFRoZSBzdGF0aW9uIChldGhlcm5ldCkgYWRkcmVzcyBwcmVmaXgsIHVzZWQgZm9yIElEaW5nIHRoZSBib2FyZC4gKi8KKyNkZWZpbmUgU0FfQUREUjAgMHgwMAorI2RlZmluZSBTQV9BRERSMSAweDgwCisjZGVmaW5lIFNBX0FERFIyIDB4NGIKKworLyogSW5kZXggdG8gZnVuY3Rpb25zLCBhcyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLworCitzdGF0aWMgaW50IHNlZXE4MDA1X3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKTsKK3N0YXRpYyBpbnQgc2VlcTgwMDVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNlZXE4MDA1X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNlZXE4MDA1X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IHNlZXE4MDA1X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIHNlZXE4MDA1X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzZWVxODAwNV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2VlcTgwMDVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBFeGFtcGxlIHJvdXRpbmVzIHlvdSBtdXN0IHdyaXRlIDstPi4gKi8KKyNkZWZpbmUgdHhfZG9uZShkZXYpCShpbncoU0VFUV9TVEFUVVMpICYgU0VFUVNUQVRfVFhfT04pCitzdGF0aWMgdm9pZCBoYXJkd2FyZV9zZW5kX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBsZW5ndGgpOworZXh0ZXJuIHZvaWQgc2VlcTgwMDVfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhcnRwKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCB3YWl0X2Zvcl9idWZmZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwwKKy8qIENoZWNrIGZvciBhIG5ldHdvcmsgYWRhcHRvciBvZiB0aGlzIHR5cGUsIGFuZCByZXR1cm4gJzAnIGlmZiBvbmUgZXhpc3RzLgorICAgSWYgZGV2LT5iYXNlX2FkZHIgPT0gMCwgcHJvYmUgYWxsIGxpa2VseSBsb2NhdGlvbnMuCisgICBJZiBkZXYtPmJhc2VfYWRkciA9PSAxLCBhbHdheXMgcmV0dXJuIGZhaWx1cmUuCisgICAqLworCitzdGF0aWMgaW50IGlvID0gMHgzMjA7CitzdGF0aWMgaW50IGlycSA9IDEwOworCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBzZWVxODAwNV9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwl1bnNpZ25lZCAqcG9ydDsKKwlpbnQgZXJyID0gMDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCQlpbyA9IGRldi0+YmFzZV9hZGRyOworCQlpcnEgPSBkZXYtPmlycTsKKwl9CisKKwlpZiAoaW8gPiAweDFmZikgewkvKiBDaGVjayBhIHNpbmdsZSBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCWVyciA9IHNlZXE4MDA1X3Byb2JlMShkZXYsIGlvKTsKKwl9IGVsc2UgaWYgKGlvICE9IDApIHsJLyogRG9uJ3QgcHJvYmUgYXQgYWxsLiAqLworCQllcnIgPSAtRU5YSU87CisJfSBlbHNlIHsKKwkJZm9yIChwb3J0ID0gc2VlcTgwMDVfcG9ydGxpc3Q7ICpwb3J0OyBwb3J0KyspIHsKKwkJCWlmIChzZWVxODAwNV9wcm9iZTEoZGV2LCAqcG9ydCkgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoISpwb3J0KQorCQkJZXJyID0gLUVOT0RFVjsKKwl9CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBTRUVRODAwNV9JT19FWFRFTlQpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyogVGhpcyBpcyB0aGUgcmVhbCBwcm9iZSByb3V0aW5lLiAgTGludXggaGFzIGEgaGlzdG9yeSBvZiBmcmllbmRseSBkZXZpY2UKKyAgIHByb2JlcyBvbiB0aGUgSVNBIGJ1cy4gIEEgZ29vZCBkZXZpY2UgcHJvYmVzIGF2b2lkcyBkb2luZyB3cml0ZXMsIGFuZAorICAgdmVyaWZpZXMgdGhhdCB0aGUgY29ycmVjdCBkZXZpY2UgZXhpc3RzIGFuZCBmdW5jdGlvbnMuICAqLworCitzdGF0aWMgaW50IF9faW5pdCBzZWVxODAwNV9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCWludCBpLGo7CisJdW5zaWduZWQgY2hhciBTQV9wcm9tWzMyXTsKKwlpbnQgb2xkX2NmZzE7CisJaW50IG9sZF9jZmcyOworCWludCBvbGRfc3RhdDsKKwlpbnQgb2xkX2RtYWFyOworCWludCBvbGRfcmVhcjsKKwlpbnQgcmV0dmFsOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIFNFRVE4MDA1X0lPX0VYVEVOVCwgInNlZXE4MDA1IikpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKG5ldF9kZWJ1Zz4xKQorCQlwcmludGsoInNlZXE4MDA1OiBwcm9iaW5nIGF0IDB4JXhcbiIsaW9hZGRyKTsKKworCW9sZF9zdGF0ID0gaW53KFNFRVFfU1RBVFVTKTsJCQkJCS8qIHJlYWQgc3RhdHVzIHJlZ2lzdGVyICovCisJaWYgKG9sZF9zdGF0ID09IDB4ZmZmZikgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIG91dDsJCQkJCQkvKiBhc3N1bWUgdGhhdCAweGZmZmYgPT0gbm8gZGV2aWNlICovCisJfQorCWlmICggKG9sZF9zdGF0ICYgMHgxODAwKSAhPSAweDE4MDAgKSB7CQkJCS8qIGFzc3VtZSB0aGF0IHVudXNlZCBiaXRzIGFyZSAxLCBhcyBteSBtYW51YWwgc2F5cyAqLworCQlpZiAobmV0X2RlYnVnPjEpIHsKKwkJCXByaW50aygic2VlcTgwMDU6IHJlc2VydmVkIHN0YXQgYml0cyAhPSAweDE4MDBcbiIpOworCQkJcHJpbnRrKCIgICAgICAgICAgPT0gMHglMDR4XG4iLG9sZF9zdGF0KTsKKwkJfQorCSAJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJb2xkX3JlYXIgPSBpbncoU0VFUV9SRUEpOworCWlmIChvbGRfcmVhciA9PSAweGZmZmYpIHsKKwkJb3V0dygwLFNFRVFfUkVBKTsKKwkJaWYgKGludyhTRUVRX1JFQSkgPT0gMHhmZmZmKSB7CQkJCS8qIGFzc3VtZSB0aGF0IDB4ZmZmZiA9PSBubyBkZXZpY2UgKi8KKwkJCXJldHZhbCA9IC1FTk9ERVY7CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZSBpZiAoKG9sZF9yZWFyICYgMHhmZjAwKSAhPSAweGZmMDApIHsJCQkvKiBhc3N1bWUgdGhhdCB1bnVzZWQgYml0cyBhcmUgMSAqLworCQlpZiAobmV0X2RlYnVnPjEpIHsKKwkJCXByaW50aygic2VlcTgwMDU6IHVudXNlZCByZWFyIGJpdHMgIT0gMHhmZjAwXG4iKTsKKwkJCXByaW50aygiICAgICAgICAgID09IDB4JTA0eFxuIixvbGRfcmVhcik7CisJCX0KKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCQorCW9sZF9jZmcyID0gaW53KFNFRVFfQ0ZHMik7CQkJCQkvKiByZWFkIENGRzIgcmVnaXN0ZXIgKi8KKwlvbGRfY2ZnMSA9IGludyhTRUVRX0NGRzEpOworCW9sZF9kbWFhciA9IGludyhTRUVRX0RNQUFSKTsKKwkKKwlpZiAobmV0X2RlYnVnPjQpIHsKKwkJcHJpbnRrKCJzZWVxODAwNTogc3RhdCA9IDB4JTA0eFxuIixvbGRfc3RhdCk7CisJCXByaW50aygic2VlcTgwMDU6IGNmZzEgPSAweCUwNHhcbiIsb2xkX2NmZzEpOworCQlwcmludGsoInNlZXE4MDA1OiBjZmcyID0gMHglMDR4XG4iLG9sZF9jZmcyKTsKKwkJcHJpbnRrKCJzZWVxODAwNTogcmFlciA9IDB4JTA0eFxuIixvbGRfcmVhcik7CisJCXByaW50aygic2VlcTgwMDU6IGRtYWFyPSAweCUwNHhcbiIsb2xkX2RtYWFyKTsKKwl9CisJCisJb3V0dyggU0VFUUNNRF9GSUZPX1dSSVRFIHwgU0VFUUNNRF9TRVRfQUxMX09GRiwgU0VFUV9DTUQpOwkvKiBzZXR1cCBmb3IgcmVhZGluZyBQUk9NICovCisJb3V0dyggMCwgU0VFUV9ETUFBUik7CQkJCQkJLyogc2V0IHN0YXJ0aW5nIFBST00gYWRkcmVzcyAqLworCW91dHcoIFNFRVFDRkcxX0JVRkZFUl9QUk9NLCBTRUVRX0NGRzEpOwkJCQkvKiBzZXQgYnVmZmVyIHRvIGxvb2sgYXQgUFJPTSAqLworCisKKwlqPTA7CisJZm9yKGk9MDsgaSA8MzI7IGkrKykgeworCQlqKz0gU0FfcHJvbVtpXSA9IGludyhTRUVRX0JVRkZFUikgJiAweGZmOworCX0KKworI2lmIDAKKwkvKiB1bnRlc3RlZCBiZWNhdXNlIEkgb25seSBoYXZlIHRoZSBvbmUgY2FyZCAqLworCWlmICggKGomMHhmZikgIT0gMCApIHsJCQkJCQkvKiBjaGVja3N1bSBhcHBlYXJzIHRvIGJlIDhiaXQgPSAwICovCisJCWlmIChuZXRfZGVidWc+MSkgewkJCQkJLyogY2hlY2sgdGhpcyBiZWZvcmUgZGVjaWRpbmcgdGhhdCB3ZSBoYXZlIGEgY2FyZCAqLworCQkJcHJpbnRrKCJzZWVxODAwNTogcHJvbSBzdW0gZXJyb3JcbiIpOworCQl9CisJCW91dHcoIG9sZF9zdGF0LCBTRUVRX1NUQVRVUyk7CisJCW91dHcoIG9sZF9kbWFhciwgU0VFUV9ETUFBUik7CisJCW91dHcoIG9sZF9jZmcxLCBTRUVRX0NGRzEpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisjZW5kaWYKKworCW91dHcoIFNFRVFDRkcyX1JFU0VULCBTRUVRX0NGRzIpOwkJCQkvKiByZXNldCB0aGUgY2FyZCAqLworCXVkZWxheSg1KTsKKwlvdXR3KCBTRUVRQ01EX1NFVF9BTExfT0ZGLCBTRUVRX0NNRCk7CisJCisJaWYgKG5ldF9kZWJ1ZykgeworCQlwcmludGsoInNlZXE4MDA1OiBwcm9tIHN1bSA9IDB4JTA4eFxuIixqKTsKKwkJZm9yKGo9MDsgajwzMjsgais9MTYpIHsKKwkJCXByaW50aygic2VlcTgwMDU6IHByb20gJTAyeDogIixqKTsKKwkJCWZvcihpPTA7aTwxNjtpKyspIHsKKwkJCQlwcmludGsoIiUwMnggIixTQV9wcm9tW2p8aV0pOworCQkJfQorCQkJcHJpbnRrKCIgIik7CisJCQlmb3IoaT0wO2k8MTY7aSsrKSB7CisJCQkJaWYgKChTQV9wcm9tW2p8aV0+MzEpJiYoU0FfcHJvbVtqfGldPDEyNykpIHsKKwkJCQkJcHJpbnRrKCIlYyIsIFNBX3Byb21banxpXSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRrKCIgIik7CisJCQkJfQorCQkJfQorCQkJcHJpbnRrKCJcbiIpOworCQl9CisJfQorCisjaWYgMAkKKwkvKiAKKwkgKiB0ZXN0aW5nIHRoZSBwYWNrZXQgYnVmZmVyIG1lbW9yeSBkb2Vzbid0IHdvcmsgeWV0CisJICogYnV0IGFsbCBvdGhlciBidWZmZXIgYWNjZXNzZXMgZG8gCisJICoJCQktIGZpeGluZyBpcyBub3QgYSBwcmlvcml0eQorCSAqLworCWlmIChuZXRfZGVidWc+MSkgewkJCQkJLyogdGVzdCBwYWNrZXQgYnVmZmVyIG1lbW9yeSAqLworCQlwcmludGsoInNlZXE4MDA1OiB0ZXN0aW5nIHBhY2tldCBidWZmZXIgLi4uICIpOworCQlvdXR3KCBTRUVRQ0ZHMV9CVUZGRVJfQlVGRkVSLCBTRUVRX0NGRzEpOworCQlvdXR3KCBTRUVRQ01EX0ZJRk9fV1JJVEUgfCBTRUVRQ01EX1NFVF9BTExfT0ZGLCBTRUVRX0NNRCk7CisJCW91dHcoIDAgLCBTRUVRX0RNQUFSKTsKKwkJZm9yKGk9MDtpPDMyNzY4O2krKykgeworCQkJb3V0dygweDVhNWEsIFNFRVFfQlVGRkVSKTsKKwkJfQorCQlqPWppZmZpZXMrSFo7CisJCXdoaWxlICggKChpbncoU0VFUV9TVEFUVVMpICYgU0VFUVNUQVRfRklGT19FTVBUWSkgIT0gU0VFUVNUQVRfRklGT19FTVBUWSkgJiYgdGltZV9iZWZvcmUoamlmZmllcywgaikgKQorCQkJbWIoKTsKKwkJb3V0dyggMCAsIFNFRVFfRE1BQVIpOworCQl3aGlsZSAoICgoaW53KFNFRVFfU1RBVFVTKSAmIFNFRVFTVEFUX1dJTkRPV19JTlQpICE9IFNFRVFTVEFUX1dJTkRPV19JTlQpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIGorSFopKQorCQkJbWIoKTsKKwkJaWYgKCAoaW53KFNFRVFfU1RBVFVTKSAmIFNFRVFTVEFUX1dJTkRPV19JTlQpID09IFNFRVFTVEFUX1dJTkRPV19JTlQpCisJCQlvdXR3KCBTRUVRQ01EX1dJTkRPV19JTlRfQUNLIHwgKGludyhTRUVRX1NUQVRVUykmIFNFRVFDTURfSU5UX01BU0spLCBTRUVRX0NNRCk7CisJCW91dHcoIFNFRVFDTURfRklGT19SRUFEIHwgU0VFUUNNRF9TRVRfQUxMX09GRiwgU0VFUV9DTUQpOworCQlqPTA7CisJCWZvcihpPTA7aTwzMjc2ODtpKyspIHsKKwkJCWlmIChpbncoU0VFUV9CVUZGRVIpICE9IDB4NWE1YSkKKwkJCQlqKys7CisJCX0KKwkJaWYgKGopIHsKKwkJCXByaW50aygiJWlcbiIsaik7CisJCX0gZWxzZSB7CisJCQlwcmludGsoIm9rLlxuIik7CisJCX0KKwl9CisjZW5kaWYKKworCWlmIChuZXRfZGVidWcgICYmICB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsodmVyc2lvbik7CisKKwlwcmludGsoIiVzOiAlcyBmb3VuZCBhdCAlIzN4LCAiLCBkZXYtPm5hbWUsICJzZWVxODAwNSIsIGlvYWRkcik7CisKKwkvKiBGaWxsIGluIHRoZSAnZGV2JyBmaWVsZHMuICovCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJZGV2LT5pcnEgPSBpcnE7CisKKwkvKiBSZXRyaWV2ZSBhbmQgcHJpbnQgdGhlIGV0aGVybmV0IGFkZHJlc3MuICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIgJTIuMngiLCBkZXYtPmRldl9hZGRyW2ldID0gU0FfcHJvbVtpKzZdKTsKKworCWlmIChkZXYtPmlycSA9PSAweGZmKQorCQk7CQkJLyogRG8gbm90aGluZzogYSB1c2VyLWxldmVsIHByb2dyYW0gd2lsbCBzZXQgaXQuICovCisJZWxzZSBpZiAoZGV2LT5pcnEgPCAyKSB7CS8qICJBdXRvLUlSUSIgKi8KKwkJdW5zaWduZWQgbG9uZyBjb29raWUgPSBwcm9iZV9pcnFfb24oKTsKKwkJCisJCW91dHcoIFNFRVFDTURfUlhfSU5UX0VOIHwgU0VFUUNNRF9TRVRfUlhfT04gfCBTRUVRQ01EX1NFVF9SWF9PRkYsIFNFRVFfQ01EICk7CisKKwkJZGV2LT5pcnEgPSBwcm9iZV9pcnFfb2ZmKGNvb2tpZSk7CisJCQorCQlpZiAobmV0X2RlYnVnID49IDIpCisJCQlwcmludGsoIiBhdXRvaXJxIGlzICVkXG4iLCBkZXYtPmlycSk7CisJfSBlbHNlIGlmIChkZXYtPmlycSA9PSAyKQorCSAgLyogRml4dXAgZm9yIHVzZXJzIHRoYXQgZG9uJ3Qga25vdyB0aGF0IElSUSAyIGlzIHJlYWxseSBJUlEgOSwKKwkgICAqIG9yIGRvbid0IGtub3cgd2hpY2ggb25lIHRvIHNldC4gCisJICAgKi8KKwkgIGRldi0+aXJxID0gOTsKKworI2lmIDAKKwl7CisJCSBpbnQgaXJxdmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZzZWVxODAwNV9pbnRlcnJ1cHQsIDAsICJzZWVxODAwNSIsIGRldik7CisJCSBpZiAoaXJxdmFsKSB7CisJCQkgcHJpbnRrICgiJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkIChpcnF2YWw9JWQpLlxuIiwgZGV2LT5uYW1lLAorCQkJCQkgZGV2LT5pcnEsIGlycXZhbCk7CisJCQkgcmV0dmFsID0gLUVBR0FJTjsKKwkJCSBnb3RvIG91dDsKKwkJIH0KKwl9CisjZW5kaWYKKwlkZXYtPm9wZW4JCT0gc2VlcTgwMDVfb3BlbjsKKwlkZXYtPnN0b3AJCT0gc2VlcTgwMDVfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgCT0gc2VlcTgwMDVfc2VuZF9wYWNrZXQ7CisJZGV2LT50eF90aW1lb3V0CQk9IHNlZXE4MDA1X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwk9IEhaLzIwOworCWRldi0+Z2V0X3N0YXRzCQk9IHNlZXE4MDA1X2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHNldF9tdWx0aWNhc3RfbGlzdDsKKwlkZXYtPmZsYWdzICY9IH5JRkZfTVVMVElDQVNUOworCisJcmV0dXJuIDA7CitvdXQ6CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBTRUVRODAwNV9JT19FWFRFTlQpOworCXJldHVybiByZXR2YWw7Cit9CisKKwwKKy8qIE9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuICBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQorICAgc29tZXRpbWUgYWZ0ZXIgYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgorCisgICBUaGlzIHJvdXRpbmUgc2hvdWxkIHNldCBldmVyeXRoaW5nIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuCisgICByZWdpc3RlcnMgdGhhdCAic2hvdWxkIiBvbmx5IG5lZWQgdG8gYmUgc2V0IG9uY2UgYXQgYm9vdCwgc28gdGhhdAorICAgdGhlcmUgaXMgbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAgICovCitzdGF0aWMgaW50IHNlZXE4MDA1X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwl7CisJCSBpbnQgaXJxdmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZzZWVxODAwNV9pbnRlcnJ1cHQsIDAsICJzZWVxODAwNSIsIGRldik7CisJCSBpZiAoaXJxdmFsKSB7CisJCQkgcHJpbnRrICgiJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkIChpcnF2YWw9JWQpLlxuIiwgZGV2LT5uYW1lLAorCQkJCQkgZGV2LT5pcnEsIGlycXZhbCk7CisJCQkgcmV0dXJuIC1FQUdBSU47CisJCSB9CisJfQorCisJLyogUmVzZXQgdGhlIGhhcmR3YXJlIGhlcmUuICBEb24ndCBmb3JnZXQgdG8gc2V0IHRoZSBzdGF0aW9uIGFkZHJlc3MuICovCisJc2VlcTgwMDVfaW5pdChkZXYsIDEpOworCisJbHAtPm9wZW5fdGltZSA9IGppZmZpZXM7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZWVxODAwNV90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsICVzP1xuIiwgZGV2LT5uYW1lLAorCQkgICB0eF9kb25lKGRldikgPyAiSVJRIGNvbmZsaWN0IiA6ICJuZXR3b3JrIGNhYmxlIHByb2JsZW0iKTsKKwkvKiBUcnkgdG8gcmVzdGFydCB0aGUgYWRhcHRvci4gKi8KKwlzZWVxODAwNV9pbml0KGRldiwgMSk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IHNlZXE4MDA1X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNob3J0IGxlbmd0aCA9IHNrYi0+bGVuOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKworCWlmIChsZW5ndGggPCBFVEhfWkxFTikgeworCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQlsZW5ndGggPSBFVEhfWkxFTjsKKwl9CisJYnVmID0gc2tiLT5kYXRhOworCisJLyogQmxvY2sgYSB0aW1lci1iYXNlZCB0cmFuc21pdCBmcm9tIG92ZXJsYXBwaW5nICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCWhhcmR3YXJlX3NlbmRfcGFja2V0KGRldiwgYnVmLCBsZW5ndGgpOyAKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlscC0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuZ3RoOworCWRldl9rZnJlZV9za2IgKHNrYik7CisJLyogWW91IG1pZ2h0IG5lZWQgdG8gY2xlYW4gdXAgYW5kIHJlY29yZCBUeCBzdGF0aXN0aWNzIGhlcmUuICovCisKKwlyZXR1cm4gMDsKK30KKwwKKy8qCisgKiB3YWl0X2Zvcl9idWZmZXIKKyAqCisgKiBUaGlzIHJvdXRpbmUgd2FpdHMgZm9yIHRoZSBTRUVRIGNoaXAgdG8gYXNzZXJ0IHRoYXQgdGhlIEZJRk8gaXMgcmVhZHkKKyAqIGJ5IGNoZWNraW5nIGZvciBhIHdpbmRvdyBpbnRlcnJ1cHQsIGFuZCB0aGVuIGNsZWFyaW5nIGl0LiBUaGlzIGhhcyB0bworICogb2NjdXIgaW4gdGhlIGludGVycnVwdCBoYW5kbGVyIQorICovCitpbmxpbmUgdm9pZCB3YWl0X2Zvcl9idWZmZXIoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgdG1wOworCWludCBzdGF0dXM7CisJCisJdG1wID0gamlmZmllcyArIEhaOworCXdoaWxlICggKCAoKHN0YXR1cz1pbncoU0VFUV9TVEFUVVMpKSAmIFNFRVFTVEFUX1dJTkRPV19JTlQpICE9IFNFRVFTVEFUX1dJTkRPV19JTlQpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRtcCkpCisJCWNwdV9yZWxheCgpOworCQkKKwlpZiAoIChzdGF0dXMgJiBTRUVRU1RBVF9XSU5ET1dfSU5UKSA9PSBTRUVRU1RBVF9XSU5ET1dfSU5UKQorCQlvdXR3KCBTRUVRQ01EX1dJTkRPV19JTlRfQUNLIHwgKHN0YXR1cyAmIFNFRVFDTURfSU5UX01BU0spLCBTRUVRX0NNRCk7Cit9CisMCisvKiBUaGUgdHlwaWNhbCB3b3JrbG9hZCBvZiB0aGUgZHJpdmVyOgorICAgSGFuZGxlIHRoZSBuZXR3b3JrIGludGVyZmFjZSBpbnRlcnJ1cHRzLiAqLworc3RhdGljIGlycXJldHVybl90IHNlZXE4MDA1X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBuZXRfbG9jYWwgKmxwOworCWludCBpb2FkZHIsIHN0YXR1cywgYm9ndXNjb3VudCA9IDA7CisJaW50IGhhbmRsZWQgPSAwOworCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RhdHVzID0gaW53KFNFRVFfU1RBVFVTKTsKKwlkbyB7CisJCWlmIChuZXRfZGVidWcgPjIpIHsKKwkJCXByaW50aygiJXM6IGludCwgc3RhdHVzPTB4JTA0eFxuIixkZXYtPm5hbWUsc3RhdHVzKTsKKwkJfQorCQkKKwkJaWYgKHN0YXR1cyAmIFNFRVFTVEFUX1dJTkRPV19JTlQpIHsKKwkJCWhhbmRsZWQgPSAxOworCQkJb3V0dyggU0VFUUNNRF9XSU5ET1dfSU5UX0FDSyB8IChzdGF0dXMgJiBTRUVRQ01EX0lOVF9NQVNLKSwgU0VFUV9DTUQpOworCQkJaWYgKG5ldF9kZWJ1ZykgeworCQkJCXByaW50aygiJXM6IHdpbmRvdyBpbnQhXG4iLGRldi0+bmFtZSk7CisJCQl9CisJCX0KKwkJaWYgKHN0YXR1cyAmIFNFRVFTVEFUX1RYX0lOVCkgeworCQkJaGFuZGxlZCA9IDE7CisJCQlvdXR3KCBTRUVRQ01EX1RYX0lOVF9BQ0sgfCAoc3RhdHVzICYgU0VFUUNNRF9JTlRfTUFTSyksIFNFRVFfQ01EKTsKKwkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CS8qIEluZm9ybSB1cHBlciBsYXllcnMuICovCisJCX0KKwkJaWYgKHN0YXR1cyAmIFNFRVFTVEFUX1JYX0lOVCkgeworCQkJaGFuZGxlZCA9IDE7CisJCQkvKiBHb3QgYSBwYWNrZXQocykuICovCisJCQlzZWVxODAwNV9yeChkZXYpOworCQl9CisJCXN0YXR1cyA9IGludyhTRUVRX1NUQVRVUyk7CisJfSB3aGlsZSAoICgrK2JvZ3VzY291bnQgPCAxMCkgJiYgKHN0YXR1cyAmIFNFRVFTVEFUX0FOWV9JTlQpKSA7CisKKwlpZihuZXRfZGVidWc+MikgeworCQlwcmludGsoIiVzOiBlb2lcbiIsZGV2LT5uYW1lKTsKKwl9CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qIFdlIGhhdmUgYSBnb29kIHBhY2tldChzKSwgZ2V0IGl0L3RoZW0gb3V0IG9mIHRoZSBidWZmZXJzLiAqLworc3RhdGljIHZvaWQgc2VlcTgwMDVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGJvZ3VzY291bnQgPSAxMDsKKwlpbnQgcGt0X2hkcjsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlkbyB7CisJCWludCBuZXh0X3BhY2tldDsKKwkJaW50IHBrdF9sZW47CisJCWludCBpOworCQlpbnQgc3RhdHVzOworCisJCXN0YXR1cyA9IGludyhTRUVRX1NUQVRVUyk7CisJICAJb3V0dyggbHAtPnJlY2VpdmVfcHRyLCBTRUVRX0RNQUFSKTsKKwkJb3V0dyhTRUVRQ01EX0ZJRk9fUkVBRCB8IFNFRVFDTURfUlhfSU5UX0FDSyB8IChzdGF0dXMgJiBTRUVRQ01EX0lOVF9NQVNLKSwgU0VFUV9DTUQpOworCSAgCXdhaXRfZm9yX2J1ZmZlcihkZXYpOworCSAgCW5leHRfcGFja2V0ID0gbnRvaHMoaW53KFNFRVFfQlVGRkVSKSk7CisJICAJcGt0X2hkciA9IGludyhTRUVRX0JVRkZFUik7CisJICAJCisJCWlmIChuZXRfZGVidWc+MikgeworCQkJcHJpbnRrKCIlczogMHglMDR4IHJlY3YgbmV4dD0weCUwNHgsIGhkcj0weCUwNHhcbiIsZGV2LT5uYW1lLGxwLT5yZWNlaXZlX3B0cixuZXh0X3BhY2tldCxwa3RfaGRyKTsKKwkJfQorCQkJCisJCWlmICgobmV4dF9wYWNrZXQgPT0gMCkgfHwgKChwa3RfaGRyICYgU0VFUVBLVEhfQ0hBSU4pPT0wKSkgewkvKiBSZWFkIGFsbCB0aGUgZnJhbWVzPyAqLworCQkJcmV0dXJuOwkJCQkJCQkvKiBEb25lIGZvciBub3cgKi8KKwkJfQorCQkJCisJCWlmICgocGt0X2hkciAmIFNFRVFQS1RTX0RPTkUpPT0wKQorCQkJYnJlYWs7CisJCQkKKwkJaWYgKG5leHRfcGFja2V0IDwgbHAtPnJlY2VpdmVfcHRyKSB7CisJCQlwa3RfbGVuID0gKG5leHRfcGFja2V0ICsgMHgxMDAwMCAtICgoREVGQVVMVF9URUErMSk8PDgpKSAtIGxwLT5yZWNlaXZlX3B0ciAtIDQ7CisJCX0gZWxzZSB7CisJCQlwa3RfbGVuID0gbmV4dF9wYWNrZXQgLSBscC0+cmVjZWl2ZV9wdHIgLSA0OworCQl9CisJCQorCQlpZiAobmV4dF9wYWNrZXQgPCAoKERFRkFVTFRfVEVBKzEpPDw4KSkgewkJCS8qIGlzIHRoZSBuZXh0X3BhY2tldCBhZGRyZXNzIHNhbmU/ICovCisJCQlwcmludGsoIiVzOiByZWN2IHBhY2tldCByaW5nIGNvcnJ1cHQsIHJlc2V0dGluZyBib2FyZFxuIixkZXYtPm5hbWUpOworCQkJc2VlcTgwMDVfaW5pdChkZXYsMSk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWxwLT5yZWNlaXZlX3B0ciA9IG5leHRfcGFja2V0OworCQkKKwkJaWYgKG5ldF9kZWJ1Zz4yKSB7CisJCQlwcmludGsoIiVzOiByZWN2IGxlbj0weCUwNHhcbiIsZGV2LT5uYW1lLHBrdF9sZW4pOworCQl9CisKKwkJaWYgKHBrdF9oZHIgJiBTRUVRUEtUU19BTllfRVJST1IpIHsJCQkJLyogVGhlcmUgd2FzIGFuIGVycm9yLiAqLworCQkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKHBrdF9oZHIgJiBTRUVRUEtUU19TSE9SVCkgbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKHBrdF9oZHIgJiBTRUVRUEtUU19EUklCKSBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAocGt0X2hkciAmIFNFRVFQS1RTX09WRVJTSVpFKSBscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCWlmIChwa3RfaGRyICYgU0VFUVBLVFNfQ1JDX0VSUikgbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCS8qIHNraXAgb3ZlciB0aGlzIHBhY2tldCAqLworCQkJb3V0dyggU0VFUUNNRF9GSUZPX1dSSVRFIHwgU0VFUUNNRF9ETUFfSU5UX0FDSyB8IChzdGF0dXMgJiBTRUVRQ01EX0lOVF9NQVNLKSwgU0VFUV9DTUQpOworCQkJb3V0dyggKGxwLT5yZWNlaXZlX3B0ciAmIDB4ZmYwMCk+PjgsIFNFRVFfUkVBKTsKKwkJfSBlbHNlIHsKKwkJCS8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLiAqLworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCXByaW50aygiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlza2ItPmRldiA9IGRldjsKKwkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIGFsaWduIGRhdGEgb24gMTYgYnl0ZSAqLworCQkJYnVmID0gc2tiX3B1dChza2IscGt0X2xlbik7CisJCQkKKwkJCWluc3coU0VFUV9CVUZGRVIsIGJ1ZiwgKHBrdF9sZW4gKyAxKSA+PiAxKTsKKwkJCQorCQkJaWYgKG5ldF9kZWJ1Zz4yKSB7CisJCQkJY2hhciAqIHAgPSBidWY7CisJCQkJcHJpbnRrKCIlczogcmVjdiAiLGRldi0+bmFtZSk7CisJCQkJZm9yKGk9MDtpPDE0O2krKykgeworCQkJCQlwcmludGsoIiUwMnggIiwqKHArKykmMHhmZik7CisJCQkJfQorCQkJCXByaW50aygiXG4iKTsKKwkJCX0KKworCQkJc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQl9CisJfSB3aGlsZSAoKC0tYm9ndXNjb3VudCkgJiYgKHBrdF9oZHIgJiBTRUVRUEtUSF9DSEFJTikpOworCisJLyogSWYgYW55IHdvcnRoLXdoaWxlIHBhY2tldHMgaGF2ZSBiZWVuIHJlY2VpdmVkLCBuZXRpZl9yeCgpCisJICAgaGFzIGRvbmUgYSBtYXJrX2JoKE5FVF9CSCkgZm9yIHVzIGFuZCB3aWxsIHdvcmsgb24gdGhlbQorCSAgIHdoZW4gd2UgZ2V0IHRvIHRoZSBib3R0b20taGFsZiByb3V0aW5lLiAqLworCXJldHVybjsKK30KKworLyogVGhlIGludmVyc2Ugcm91dGluZSB0byBuZXRfb3BlbigpLiAqLworc3RhdGljIGludCBzZWVxODAwNV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlscC0+b3Blbl90aW1lID0gMDsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwkvKiBGbHVzaCB0aGUgVHggYW5kIGRpc2FibGUgUnggaGVyZS4gKi8KKwlvdXR3KCBTRUVRQ01EX1NFVF9BTExfT0ZGLCBTRUVRX0NNRCk7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCS8qIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyBoZXJlLiAqLworCisJcmV0dXJuIDA7CisKK30KKworLyogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCVRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IKKyAgIGNsb3NlZC4gKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2VlcTgwMDVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICAgbnVtX2FkZHJzID09IC0xCVByb21pc2N1b3VzIG1vZGUsIHJlY2VpdmUgYWxsIHBhY2tldHMKKyAgIG51bV9hZGRycyA9PSAwCU5vcm1hbCBtb2RlLCBjbGVhciBtdWx0aWNhc3QgbGlzdAorICAgbnVtX2FkZHJzID4gMAlNdWx0aWNhc3QgbW9kZSwgcmVjZWl2ZSBub3JtYWwgYW5kIE1DIHBhY2tldHMsIGFuZCBkbworCQkJYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgorICovCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKy8qCisgKiBJIF9jb3VsZF8gZG8gdXAgdG8gNiBhZGRyZXNzZXMgaGVyZSwgYnV0IHdvbid0ICh5ZXQ/KQorICovCisKKyNpZiAwCisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworLyoKKyAqIGhtbSwgbm90IGV2ZW4gc3VyZSBpZiBteSBtYXRjaGluZyB3b3JrcyBfYW55d2F5XyAtIHNlZW0gdG8gYmUgcmVjZWl2aW5nCisgKiBfZXZlcnl0aGluZ18gLiAuIC4KKyAqLworIAorCWlmIChudW1fYWRkcnMpIHsJCQkvKiBFbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworCQlvdXR3KCAoaW53KFNFRVFfQ0ZHMSkgJiB+U0VFUUNGRzFfTUFUQ0hfTUFTSyl8IFNFRVFDRkcxX01BVENIX0FMTCwgIFNFRVFfQ0ZHMSk7CisJCWRldi0+ZmxhZ3N8PUlGRl9QUk9NSVNDOworCX0gZWxzZSB7CQkJCS8qIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSwgdXNlIG5vcm1hbCBtb2RlICovCisJCW91dHcoIChpbncoU0VFUV9DRkcxKSAmIH5TRUVRQ0ZHMV9NQVRDSF9NQVNLKXwgU0VFUUNGRzFfTUFUQ0hfQlJPQUQsIFNFRVFfQ0ZHMSk7CisJfQorI2VuZGlmCit9CisKK3ZvaWQgc2VlcTgwMDVfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhcnRwKQoreworCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGk7CisJCisJb3V0dyhTRUVRQ0ZHMl9SRVNFVCwgU0VFUV9DRkcyKTsJLyogcmVzZXQgZGV2aWNlICovCisJdWRlbGF5KDUpOworCQorCW91dHcoIFNFRVFDTURfRklGT19XUklURSB8IFNFRVFDTURfU0VUX0FMTF9PRkYsIFNFRVFfQ01EKTsKKwlvdXR3KCAwLCBTRUVRX0RNQUFSKTsJCQkvKiBsb2FkIHN0YXJ0IGFkZHJlc3MgaW50byBib3RoIGxvdyBhbmQgaGlnaCBieXRlICovCisvKgl3YWl0X2Zvcl9idWZmZXIoZGV2KTsgKi8JCS8qIEkgdGhpbmsgdGhhdCB5b3Ugb25seSBuZWVkIGEgd2FpdCBmb3IgbWVtb3J5IGJ1ZmZlciAqLworCW91dHcoIFNFRVFDRkcxX0JVRkZFUl9NQUMwLCBTRUVRX0NGRzEpOworCQorCWZvcihpPTA7aTw2O2krKykgewkJCS8qIHNldCBTdGF0aW9uIGFkZHJlc3MgKi8KKwkJb3V0YihkZXYtPmRldl9hZGRyW2ldLCBTRUVRX0JVRkZFUik7CisJCXVkZWxheSgyKTsKKwl9CisJCisJb3V0dyggU0VFUUNGRzFfQlVGRkVSX1RFQSwgU0VFUV9DRkcxKTsJLyogc2V0IHhtaXQgZW5kIGFyZWEgcG9pbnRlciB0byAxNksgKi8KKwlvdXRiKCBERUZBVUxUX1RFQSwgU0VFUV9CVUZGRVIpOwkvKiB0aGlzIGdpdmVzIHVzIDE2SyBvZiBzZW5kIGJ1ZmZlciBhbmQgNDhLIG9mIHJlY3YgYnVmZmVyICovCisJCisJbHAtPnJlY2VpdmVfcHRyID0gKERFRkFVTFRfVEVBKzEpPDw4OwkvKiBzbyB3ZSBjYW4gZmluZCBvdXIgcGFja2V0X2hlYWRlciAqLworCW91dHcoIGxwLT5yZWNlaXZlX3B0ciwgU0VFUV9SUFIpOwkvKiBSZWNlaXZlIFBvaW50ZXIgUmVnaXN0ZXIgaXMgc2V0IHRvIHJlY3YgYnVmZmVyIG1lbW9yeSAqLworCQorCW91dHcoIDB4MDBmZiwgU0VFUV9SRUEpOwkJLyogUmVjZWl2ZSBBcmVhIEVuZCAqLworCisJaWYgKG5ldF9kZWJ1Zz40KSB7CisJCXByaW50aygiJXM6IFNBMCA9ICIsZGV2LT5uYW1lKTsKKworCQlvdXR3KCBTRUVRQ01EX0ZJRk9fUkVBRCB8IFNFRVFDTURfU0VUX0FMTF9PRkYsIFNFRVFfQ01EKTsKKwkJb3V0dyggMCwgU0VFUV9ETUFBUik7CisJCW91dHcoIFNFRVFDRkcxX0JVRkZFUl9NQUMwLCBTRUVRX0NGRzEpOworCQkKKwkJZm9yKGk9MDtpPDY7aSsrKSB7CisJCQlwcmludGsoIiUwMnggIixpbmIoU0VFUV9CVUZGRVIpKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisJfQorCQorCW91dHcoIFNFRVFDRkcxX01BQzBfRU4gfCBTRUVRQ0ZHMV9NQVRDSF9CUk9BRCB8IFNFRVFDRkcxX0JVRkZFUl9CVUZGRVIsIFNFRVFfQ0ZHMSk7CisJb3V0dyggU0VFUUNGRzJfQVVUT19SRUEgfCBTRUVRQ0ZHMl9DVFJMTywgU0VFUV9DRkcyKTsKKwlvdXR3KCBTRUVRQ01EX1NFVF9SWF9PTiB8IFNFRVFDTURfVFhfSU5UX0VOIHwgU0VFUUNNRF9SWF9JTlRfRU4sIFNFRVFfQ01EKTsKKworCWlmIChuZXRfZGVidWc+NCkgeworCQlpbnQgb2xkX2NmZzE7CisJCW9sZF9jZmcxID0gaW53KFNFRVFfQ0ZHMSk7CisJCXByaW50aygiJXM6IHN0YXQgPSAweCUwNHhcbiIsZGV2LT5uYW1lLGludyhTRUVRX1NUQVRVUykpOworCQlwcmludGsoIiVzOiBjZmcxID0gMHglMDR4XG4iLGRldi0+bmFtZSxvbGRfY2ZnMSk7CisJCXByaW50aygiJXM6IGNmZzIgPSAweCUwNHhcbiIsZGV2LT5uYW1lLGludyhTRUVRX0NGRzIpKTsKKwkJcHJpbnRrKCIlczogcmFlciA9IDB4JTA0eFxuIixkZXYtPm5hbWUsaW53KFNFRVFfUkVBKSk7CisJCXByaW50aygiJXM6IGRtYWFyPSAweCUwNHhcbiIsZGV2LT5uYW1lLGludyhTRUVRX0RNQUFSKSk7CisJCQorCX0KK30JCisKKworc3RhdGljIHZvaWQgaGFyZHdhcmVfc2VuZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IHN0YXR1cyA9IGludyhTRUVRX1NUQVRVUyk7CisJaW50IHRyYW5zbWl0X3B0ciA9IDA7CisJaW50IHRtcDsKKworCWlmIChuZXRfZGVidWc+NCkgeworCQlwcmludGsoIiVzOiBzZW5kIDB4JTA0eFxuIixkZXYtPm5hbWUsbGVuZ3RoKTsKKwl9CisJCisJLyogU2V0IEZJRk8gdG8gd3JpdGVtb2RlIGFuZCBzZXQgcGFja2V0LWJ1ZmZlciBhZGRyZXNzICovCisJb3V0dyggU0VFUUNNRF9GSUZPX1dSSVRFIHwgKHN0YXR1cyAmIFNFRVFDTURfSU5UX01BU0spLCBTRUVRX0NNRCk7CisJb3V0dyggdHJhbnNtaXRfcHRyLCBTRUVRX0RNQUFSKTsKKwkKKwkvKiBvdXRwdXQgU0VFUSBQYWNrZXQgaGVhZGVyIGJhcmZhZ2UgKi8KKwlvdXR3KCBodG9ucyhsZW5ndGggKyA0KSwgU0VFUV9CVUZGRVIpOworCW91dHcoIFNFRVFQS1RIX1hNSVQgfCBTRUVRUEtUSF9EQVRBX0ZPTExPV1MgfCBTRUVRUEtUSF9YTUlUX0lOVF9FTiwgU0VFUV9CVUZGRVIgKTsKKwkKKwkvKiBibGF0IHRoZSBidWZmZXIgKi8KKwlvdXRzdyggU0VFUV9CVUZGRVIsIGJ1ZiwgKGxlbmd0aCArMSkgPj4gMSk7CisJLyogcGFyYW5vaWEgISEgKi8KKwlvdXR3KCAwLCBTRUVRX0JVRkZFUik7CisJb3V0dyggMCwgU0VFUV9CVUZGRVIpOworCQorCS8qIHNldCBhZGRyZXNzIG9mIHN0YXJ0IG9mIHRyYW5zbWl0IGNoYWluICovCisJb3V0dyggdHJhbnNtaXRfcHRyLCBTRUVRX1RQUik7CisJCisJLyogZHJhaW4gRklGTyAqLworCXRtcCA9IGppZmZpZXM7CisJd2hpbGUgKCAoKChzdGF0dXM9aW53KFNFRVFfU1RBVFVTKSkgJiBTRUVRU1RBVF9GSUZPX0VNUFRZKSA9PSAwKSAmJiAoamlmZmllcyAtIHRtcCA8IEhaKSkKKwkJbWIoKTsKKwkKKwkvKiBkb2l0ICEgKi8KKwlvdXR3KCBTRUVRQ01EX1dJTkRPV19JTlRfQUNLIHwgU0VFUUNNRF9TRVRfVFhfT04gfCAoc3RhdHVzICYgU0VFUUNNRF9JTlRfTUFTSyksIFNFRVFfQ01EKTsKKwkKK30KKworCisjaWZkZWYgTU9EVUxFCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X3NlZXE7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIlNFRVEgODAwNSBJL08gYmFzZSBhZGRyZXNzIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIlNFRVEgODAwNSBJUlEgbnVtYmVyIik7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWRldl9zZWVxID0gc2VlcTgwMDVfcHJvYmUoLTEpOworCWlmIChJU19FUlIoZGV2X3NlZXEpKQorCQlyZXR1cm4gUFRSX0VSUihkZXZfc2VlcSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihkZXZfc2VlcSk7CisJcmVsZWFzZV9yZWdpb24oZGV2X3NlZXEtPmJhc2VfYWRkciwgU0VFUTgwMDVfSU9fRVhURU5UKTsKKwlmcmVlX25ldGRldihkZXZfc2VlcSk7Cit9CisKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1EX19LRVJORUxfXyAtSS91c3Ivc3JjL2xpbnV4L25ldC9pbmV0IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1tNDg2IC1jIHNrZWxldG9uLmMiCisgKiAgdmVyc2lvbi1jb250cm9sOiB0CisgKiAga2VwdC1uZXctdmVyc2lvbnM6IDUKKyAqICB0YWItd2lkdGg6IDQKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2VlcTgwMDUuaCBiL2RyaXZlcnMvbmV0L3NlZXE4MDA1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5YmE2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NlZXE4MDA1LmgKQEAgLTAsMCArMSwxNTYgQEAKKy8qIAorICogZGVmaW5lcywgZXRjIGZvciB0aGUgc2VlcTgwMDUKKyAqLworIAorLyoKKyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciBHUEwuCisgKgorICogVGhpcyBzdHlsZSBhbmQgbGF5b3V0IG9mIHRoaXMgZmlsZSBpcyBhbHNvIGNvcGllZAorICogZnJvbSBtYW55IG9mIHRoZSBvdGhlciBsaW51eCBuZXR3b3JrIGRldmljZSBkcml2ZXJzLgorICovCisKKy8qIFRoZSBudW1iZXIgb2YgbG93IEkvTyBwb3J0cyB1c2VkIGJ5IHRoZSBldGhlcmNhcmQuICovCisjZGVmaW5lIFNFRVE4MDA1X0lPX0VYVEVOVAkxNgorCisjZGVmaW5lIFNFRVFfQgkJKGlvYWRkcikKKworI2RlZmluZQlTRUVRX0NNRAkoU0VFUV9CKQkJLyogV3JpdGUgb25seSAqLworI2RlZmluZQlTRUVRX1NUQVRVUwkoU0VFUV9CKQkJLyogUmVhZCBvbmx5ICovCisjZGVmaW5lIFNFRVFfQ0ZHMQkoU0VFUV9CICsgMikKKyNkZWZpbmUgU0VFUV9DRkcyCShTRUVRX0IgKyA0KQorI2RlZmluZQlTRUVRX1JFQQkoU0VFUV9CICsgNikJCS8qIFJlY2VpdmUgRW5kIEFyZWEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0VFUV9SUFIJKFNFRVFfQiArIDEwKQkJLyogUmVjZWl2ZSBQb2ludGVyIFJlZ2lzdGVyICovCisjZGVmaW5lCVNFRVFfVFBSCShTRUVRX0IgKyAxMikJCS8qIFRyYW5zbWl0IFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJU0VFUV9ETUFBUgkoU0VFUV9CICsgMTQpCQkvKiBETUEgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZSBTRUVRX0JVRkZFUgkoU0VFUV9CICsgOCkJCS8qIEJ1ZmZlciBXaW5kb3cgUmVnaXN0ZXIgKi8KKworI2RlZmluZQlERUZBVUxUX1RFQQkoMHgzZikKKworI2RlZmluZSBTRUVRQ01EX0RNQV9JTlRfRU4JKDB4MDAwMSkJLyogRE1BIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgU0VFUUNNRF9SWF9JTlRfRU4JKDB4MDAwMikJLyogUmVjZWl2ZSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFNFRVFDTURfVFhfSU5UX0VOCSgweDAwMDQpCS8qIFRyYW5zbWl0IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgU0VFUUNNRF9XSU5ET1dfSU5UX0VOCSgweDAwMDgpCS8qIFdoYXQgdGhlIGhlbGwgaXMgdGhpcyBmb3I/PyAqLworI2RlZmluZSBTRUVRQ01EX0lOVF9NQVNLCSgweDAwMGYpCisKKyNkZWZpbmUgU0VFUUNNRF9ETUFfSU5UX0FDSwkoMHgwMDEwKQkvKiBETUEgYWNrICovCisjZGVmaW5lIFNFRVFDTURfUlhfSU5UX0FDSwkoMHgwMDIwKQorI2RlZmluZSBTRUVRQ01EX1RYX0lOVF9BQ0sJKDB4MDA0MCkKKyNkZWZpbmUJU0VFUUNNRF9XSU5ET1dfSU5UX0FDSwkoMHgwMDgwKQorI2RlZmluZSBTRUVRQ01EX0FDS19BTEwJCSgweDAwZjApCisKKyNkZWZpbmUgU0VFUUNNRF9TRVRfRE1BX09OCSgweDAxMDApCS8qIEVuYWJsZXMgRE1BIFJlcXVlc3QgbG9naWMgKi8KKyNkZWZpbmUgU0VFUUNNRF9TRVRfUlhfT04JKDB4MDIwMCkJLyogRW5hYmxlcyBQYWNrZXQgUlggKi8KKyNkZWZpbmUgU0VFUUNNRF9TRVRfVFhfT04JKDB4MDQwMCkJLyogU3RhcnRzIFRYIHJ1biAqLworI2RlZmluZSBTRUVRQ01EX1NFVF9ETUFfT0ZGCSgweDA4MDApCisjZGVmaW5lIFNFRVFDTURfU0VUX1JYX09GRgkoMHgxMDAwKQorI2RlZmluZSBTRUVRQ01EX1NFVF9UWF9PRkYJKDB4MjAwMCkKKyNkZWZpbmUgU0VFUUNNRF9TRVRfQUxMX09GRgkoMHgzODAwKQkvKiBzZXQgYWxsIGxvZ2ljIG9mZiAqLworCisjZGVmaW5lIFNFRVFDTURfRklGT19SRUFECSgweDQwMDApCS8qIFNldCBGSUZPIHRvIHJlYWQgbW9kZSAocmVhZCBmcm9tIEJ1ZmZlcikgKi8KKyNkZWZpbmUgU0VFUUNNRF9GSUZPX1dSSVRFCSgweDgwMDApCS8qIFNldCBGSUZPIHRvIHdyaXRlIG1vZGUgKi8KKworI2RlZmluZSBTRUVRU1RBVF9ETUFfSU5UX0VOCSgweDAwMDEpCS8qIFN0YXR1cyBvZiBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIFNFRVFTVEFUX1JYX0lOVF9FTgkoMHgwMDAyKQorI2RlZmluZSBTRUVRU1RBVF9UWF9JTlRfRU4JKDB4MDAwNCkKKyNkZWZpbmUgU0VFUVNUQVRfV0lORE9XX0lOVF9FTgkoMHgwMDA4KQorCisjZGVmaW5lCVNFRVFTVEFUX0RNQV9JTlQJKDB4MDAxMCkJLyogSW50ZXJydXB0IGZsYWdnZWQgKi8KKyNkZWZpbmUgU0VFUVNUQVRfUlhfSU5UCQkoMHgwMDIwKQorI2RlZmluZSBTRUVRU1RBVF9UWF9JTlQJCSgweDAwNDApCisjZGVmaW5lCVNFRVFTVEFUX1dJTkRPV19JTlQJKDB4MDA4MCkKKyNkZWZpbmUgU0VFUVNUQVRfQU5ZX0lOVAkoMHgwMGYwKQorCisjZGVmaW5lIFNFRVFTVEFUX0RNQV9PTgkJKDB4MDEwMCkJLyogRE1BIGxvZ2ljIG9uICovCisjZGVmaW5lIFNFRVFTVEFUX1JYX09OCQkoMHgwMjAwKQkvKiBQYWNrZXQgUlggb24gKi8KKyNkZWZpbmUgU0VFUVNUQVRfVFhfT04JCSgweDA0MDApCS8qIFRYIHJ1bm5pbmcgKi8KKworI2RlZmluZSBTRUVRU1RBVF9GSUZPX0ZVTEwJKDB4MjAwMCkKKyNkZWZpbmUgU0VFUVNUQVRfRklGT19FTVBUWQkoMHg0MDAwKQorI2RlZmluZSBTRUVRU1RBVF9GSUZPX0RJUgkoMHg4MDAwKQkvKiAxPXJlYWQsIDA9d3JpdGUgKi8KKworI2RlZmluZSBTRUVRQ0ZHMV9CVUZGRVJfTUFTSwkoMHgwMDBmKQkvKiBkZWZpbmUgd2hhdCBtYXBzIGludG8gdGhlIEJVRkZFUiByZWdpc3RlciAqLworI2RlZmluZSBTRUVRQ0ZHMV9CVUZGRVJfTUFDMAkoMHgwMDAwKQkvKiBNQUMgc3RhdGlvbiBhZGRyZXNzZXMgMC01ICovCisjZGVmaW5lIFNFRVFDRkcxX0JVRkZFUl9NQUMxCSgweDAwMDEpCisjZGVmaW5lIFNFRVFDRkcxX0JVRkZFUl9NQUMyCSgweDAwMDIpCisjZGVmaW5lIFNFRVFDRkcxX0JVRkZFUl9NQUMzCSgweDAwMDMpCisjZGVmaW5lIFNFRVFDRkcxX0JVRkZFUl9NQUM0CSgweDAwMDQpCisjZGVmaW5lIFNFRVFDRkcxX0JVRkZFUl9NQUM1CSgweDAwMDUpCisjZGVmaW5lIFNFRVFDRkcxX0JVRkZFUl9QUk9NCSgweDAwMDYpCS8qIFRoZSBBZGRyZXNzL0NGRyBQUk9NICovCisjZGVmaW5lIFNFRVFDRkcxX0JVRkZFUl9URUEJKDB4MDAwNykJLyogVHJhbnNtaXQgZW5kIGFyZWEgKi8KKyNkZWZpbmUgU0VFUUNGRzFfQlVGRkVSX0JVRkZFUgkoMHgwMDA4KQkvKiBQYWNrZXQgYnVmZmVyIG1lbW9yeSAqLworI2RlZmluZSBTRUVRQ0ZHMV9CVUZGRVJfSU5UX1ZFQwkoMHgwMDA5KQkvKiBJbnRlcnJ1cHQgVmVjdG9yICovCisKKyNkZWZpbmUgU0VFUUNGRzFfRE1BX0lOVFZMX01BU0sJKDB4MDAzMCkKKyNkZWZpbmUgU0VFUUNGRzFfRE1BX0NPTlQJKDB4MDAwMCkKKyNkZWZpbmUgU0VFUUNGRzFfRE1BXzgwMG5zCSgweDAwMTApCisjZGVmaW5lIFNFRVFDRkcxX0RNQV8xNjAwbnMJKDB4MDAyMCkKKyNkZWZpbmUgU0VFUUNGRzFfRE1BXzMyMDBucwkoMHgwMDMwKQorCisjZGVmaW5lIFNFRVFDRkcxX0RNQV9MRU5fTUFTSwkoMHgwMGMwKQorI2RlZmluZSBTRUVRQ0ZHMV9ETUFfTEVOMQkoMHgwMDAwKQorI2RlZmluZSBTRUVRQ0ZHMV9ETUFfTEVOMgkoMHgwMDQwKQorI2RlZmluZSBTRUVRQ0ZHMV9ETUFfTEVONAkoMHgwMDgwKQorI2RlZmluZSBTRUVRQ0ZHMV9ETUFfTEVOOAkoMHgwMGMwKQorCisjZGVmaW5lIFNFRVFDRkcxX01BQ19NQVNLCSgweDNmMDApCS8qIERpcy9lbmFibGUgYml0cyBmb3IgTUFDIGFkZHJlc3NlcyAqLworI2RlZmluZSBTRUVRQ0ZHMV9NQUMwX0VOCSgweDAxMDApCisjZGVmaW5lIFNFRVFDRkcxX01BQzFfRU4JKDB4MDIwMCkKKyNkZWZpbmUgU0VFUUNGRzFfTUFDMl9FTgkoMHgwNDAwKQorI2RlZmluZSBTRUVRQ0ZHMV9NQUMzX0VOCSgweDA4MDApCisjZGVmaW5lCVNFRVFDRkcxX01BQzRfRU4JKDB4MTAwMCkKKyNkZWZpbmUgU0VFUUNGRzFfTUFDNV9FTgkoMHgyMDAwKQorCisjZGVmaW5lCVNFRVFDRkcxX01BVENIX01BU0sJKDB4YzAwMCkJLyogUGFja2V0IG1hdGNoaW5nIGxvZ2ljIGNmZyBiaXRzICovCisjZGVmaW5lIFNFRVFDRkcxX01BVENIX1NQRUNJRklDCSgweDAwMDApCS8qIG9ubHkgbWF0Y2hpbmcgTUFDIGFkZHJlc3NlcyAqLworI2RlZmluZSBTRUVRQ0ZHMV9NQVRDSF9CUk9BRAkoMHg0MDAwKQkvKiBtYXRjaGluZyBhbmQgYnJvYWRjYXN0IGFkZHJlc3NlcyAqLworI2RlZmluZSBTRUVRQ0ZHMV9NQVRDSF9NVUxUSQkoMHg4MDAwKQkvKiBtYXRjaGluZywgYnJvYWRjYXN0IGFuZCBtdWx0aWNhc3QgKi8KKyNkZWZpbmUgU0VFUUNGRzFfTUFUQ0hfQUxMCSgweGMwMDApCS8qIFByb21pc2N1b3VzIG1vZGUgKi8KKworI2RlZmluZSBTRUVRQ0ZHMV9ERUZBVUxUCShTRUVRQ0ZHMV9CVUZGRVJfQlVGRkVSIHwgU0VFUUNGRzFfTUFDMF9FTiB8IFNFRVFDRkcxX01BVENIX0JST0FEKQorCisjZGVmaW5lIFNFRVFDRkcyX0JZVEVfU1dBUAkoMHgwMDAxKQkvKiAwPUludGVsIGJ5dGUtb3JkZXIgKi8KKyNkZWZpbmUgU0VFUUNGRzJfQVVUT19SRUEJKDB4MDAwMikJLyogaWYgc2V0LCBSZWNlaXZlIEVuZCBBcmVhIHdpbGwgYmUgdXBkYXRlZCB3aGVuIHJlYWRpbmcgZnJvbSBCdWZmZXIgKi8KKworI2RlZmluZSBTRUVRQ0ZHMl9DUkNfRVJSX0VOCSgweDAwMDgpCS8qIGVuYWJsZXMgcmVjZWl2aW5nIG9mIHBhY2tldHMgd2l0aCBDUkMgZXJyb3JzICovCisjZGVmaW5lIFNFRVFDRkcyX0RSSUJCTEVfRU4JKDB4MDAxMCkJLyogZW5hYmxlcyByZWNlaXZpbmcgb2Ygbm9uLWFsaWduZWQgcGFja2V0cyAqLworI2RlZmluZSBTRUVRQ0ZHMl9TSE9SVF9FTgkoMHgwMDIwKQkvKiBlbmFibGVzIHJlY2VpdmluZyBvZiBzaG9ydCBwYWNrZXRzICovCisKKyNkZWZpbmUJU0VFUUNGRzJfU0xPVFNFTAkoMHgwMDQwKQkvKiAwPSBzdGFuZGFyZCBJRUVFODAyLjMsIDE9IHNtYWxsZXIsZmFzdGVyLCBub24tc3RhbmRhcmQgKi8KKyNkZWZpbmUgU0VFUUNGRzJfTk9fUFJFQU0JKDB4MDA4MCkJLyogMT0gdXNlciBzdXBwbGllcyBYbWl0IHByZWFtYmxlIGJ5dGVzICovCisjZGVmaW5lIFNFRVFDRkcyX0FERFJfTEVOCSgweDAxMDApCS8qIDE9IDJieXRlIGFkZHJlc3NlcyAqLworI2RlZmluZSBTRUVRQ0ZHMl9SRUNfQ1JDCSgweDAyMDApCS8qIDA9IHJlY2VpdmVkIHBhY2tldHMgd2lsbCBoYXZlIENSQyBzdHJpcHBlZCBmcm9tIHRoZW0gKi8KKyNkZWZpbmUgU0VFUUNGRzJfWE1JVF9OT19DUkMJKDB4MDQwMCkJLyogZG9uJ3QgeG1pdCBDUkMgd2l0aCBlYWNoIHBhY2tldCAodXNlciBzdXBwbGllcyBpdCkgKi8KKyNkZWZpbmUgU0VFUUNGRzJfTE9PUEJBQ0sJKDB4MDgwMCkKKyNkZWZpbmUgU0VFUUNGRzJfQ1RSTE8JCSgweDEwMDApCisjZGVmaW5lIFNFRVFDRkcyX1JFU0VUCQkoMHg4MDAwKQkvKiBzb2Z0d2FyZSBIYXJkLXJlc2V0IGJpdCAqLworCitzdHJ1Y3Qgc2VlcV9wa3RfaGRyIHsKKwl1bnNpZ25lZCBzaG9ydAluZXh0OwkJCS8qIGFkZHJlc3Mgb2YgbmV4dCBwYWNrZXQgaGVhZGVyICovCisJdW5zaWduZWQgY2hhcgliYWJibGVfaW50OjEsCQkvKiBlbmFibGUgaW50IG9uID4xNTE0IGJ5dGUgcGFja2V0ICovCisJCQljb2xsX2ludDoxLAkJLyogZW5hYmxlIGludCBvbiBjb2xsaXNpb24gKi8KKwkJCWNvbGxfMTZfaW50OjEsCQkvKiBlbmFibGUgaW50IG9uID4xNSBjb2xsaXNpb24gKi8KKwkJCXhtaXRfaW50OjEsCQkvKiBlbmFibGUgaW50IG9uIHN1Y2Nlc3MgKG9yIHhtaXQgd2l0aCA8MTUgY29sbGlzaW9uKSAqLworCQkJdW51c2VkOjEsCisJCQlkYXRhX2ZvbGxvd3M6MSwJCS8qIGlmIG5vdCBzZXQsIHByb2Nlc3MgdGhpcyBhcyBhIGhlYWRlciBhbmQgcG9pbnRlciBvbmx5ICovCisJCQljaGFpbl9jb250OjEsCQkvKiBpZiBzZXQsIG1vcmUgaGVhZGVycyBpbiBjaGFpbiAJCW9ubHkgY21kIGJpdCB2YWxpZCBpbiByZWN2IGhlYWRlciAqLworCQkJeG1pdF9yZWN2OjE7CQkvKiBpZiBzZXQsIGEgeG1pdCBwYWNrZXQsIGVsc2UgYSByZWNlaXZlIHBhY2tldC4qLworCXVuc2lnbmVkIGNoYXIJc3RhdHVzOworfTsKKworI2RlZmluZSBTRUVRUEtUSF9CQUJfSU5UX0VOCSgweDAxKQkJLyogeG1pdCBvbmx5ICovCisjZGVmaW5lIFNFRVFQS1RIX0NPTF9JTlRfRU4JKDB4MDIpCQkvKiB4bWl0IG9ubHkgKi8KKyNkZWZpbmUgU0VFUVBLVEhfQ09MMTZfSU5UX0VOCSgweDA0KQkJLyogeG1pdCBvbmx5ICovCisjZGVmaW5lIFNFRVFQS1RIX1hNSVRfSU5UX0VOCSgweDA4KQkJLyogeG1pdCBvbmx5ICovCisjZGVmaW5lIFNFRVFQS1RIX0RBVEFfRk9MTE9XUwkoMHgyMCkJCS8qIHN1cHBvc2VkbHkgaW4geG1pdCBvbmx5ICovCisjZGVmaW5lIFNFRVFQS1RIX0NIQUlOCQkoMHg0MCkJCS8qIG1vcmUgaGVhZGVycyBmb2xsb3cgKi8KKyNkZWZpbmUgU0VFUVBLVEhfWE1JVAkJKDB4ODApCisKKyNkZWZpbmUgU0VFUVBLVFNfQkFCQkxFCQkoMHgwMTAwKQkvKiB4bWl0IG9ubHkgKi8KKyNkZWZpbmUgU0VFUVBLVFNfT1ZFUlNJWkUJKDB4MDEwMCkJLyogcmVjdiBvbmx5ICovCisjZGVmaW5lIFNFRVFQS1RTX0NPTExJU0lPTgkoMHgwMjAwKQkvKiB4bWl0IG9ubHkgKi8KKyNkZWZpbmUgU0VFUVBLVFNfQ1JDX0VSUgkoMHgwMjAwKQkvKiByZWN2IG9ubHkgKi8KKyNkZWZpbmUgU0VFUVBLVFNfQ09MTDE2CQkoMHgwNDAwKQkvKiB4bWl0IG9ubHkgKi8KKyNkZWZpbmUgU0VFUVBLVFNfRFJJQgkJKDB4MDQwMCkJLyogcmVjdiBvbmx5ICovCisjZGVmaW5lIFNFRVFQS1RTX1NIT1JUCQkoMHgwODAwKQkvKiByZWN2IG9ubHkgKi8KKyNkZWZpbmUgU0VFUVBLVFNfRE9ORQkJKDB4ODAwMCkKKyNkZWZpbmUgU0VFUVBLVFNfQU5ZX0VSUk9SCSgweDBmMDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zZ2lzZWVxLmMgYi9kcml2ZXJzL25ldC9zZ2lzZWVxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJjM2IxYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NnaXNlZXEuYwpAQCAtMCwwICsxLDc3MyBAQAorLyoKKyAqIHNnaXNlZXEuYzogU2VlcTgwMDMgZXRoZXJuZXQgZHJpdmVyIGZvciBTR0kgbWFjaGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2IERhdmlkIFMuIE1pbGxlciAoZG1AZW5nci5zZ2kuY29tKQorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3JvdXRlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9zZ2kvaHBjMy5oPgorI2luY2x1ZGUgPGFzbS9zZ2kvaXAyMi5oPgorI2luY2x1ZGUgPGFzbS9zZ2lhbGliLmg+CisKKyNpbmNsdWRlICJzZ2lzZWVxLmgiCisKK3N0YXRpYyBjaGFyICp2ZXJzaW9uID0gInNnaXNlZXEuYzogRGF2aWQgUy4gTWlsbGVyIChkbUBlbmdyLnNnaS5jb20pXG4iOworCitzdGF0aWMgY2hhciAqc2dpc2VlcXN0ciA9ICJTR0kgU2VlcTgwMDMiOworCisvKgorICogSWYgeW91IHdhbnQgc3BlZWQsIHlvdSBkbyBzb21ldGhpbmcgc2lsbHksIGl0IGFsd2F5cyBoYXMgd29ya2VkIGZvciBtZS4gIFNvLAorICogd2l0aCB0aGF0IGluIG1pbmQsIEkndmUgZGVjaWRlZCB0byBtYWtlIHRoaXMgZHJpdmVyIGxvb2sgY29tcGxldGVseSBsaWtlIGEKKyAqIHN0dXBpZCBMYW5jZSBmcm9tIGEgZHJpdmVyIGFyY2hpdGVjdHVyZSBwZXJzcGVjdGl2ZS4gIE9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0CisgKiBoZXJlIG91ciAicmluZyBidWZmZXIiIGxvb2tzIGFuZCBhY3RzIGxpa2UgYSByZWFsIExhbmNlIG9uZSBkb2VzIGJ1dCBpcworICogbGF5ZWQgb3V0IGxpa2UgaG93IHRoZSBIUEMgRE1BIGFuZCB0aGUgU2VlcSB3YW50IGl0IHRvLiAgWW91J2QgYmUgc3VycHJpc2VkCisgKiBob3cgYSBzdHVwaWQgaWRlYSBsaWtlIHRoaXMgY2FuIHBheSBvZmYgaW4gcGVyZm9ybWFuY2UsIG5vdCB0byBtZW50aW9uCisgKiBtYWtpbmcgdGhpcyBkcml2ZXIgMiwwMDAgdGltZXMgZWFzaWVyIHRvIHdyaXRlLiA7LSkKKyAqLworCisvKiBUdW5lIHRoZXNlIGlmIHdlIHRlbmQgdG8gcnVuIG91dCBvZnRlbiBldGMuICovCisjZGVmaW5lIFNFRVFfUlhfQlVGRkVSUyAgMTYKKyNkZWZpbmUgU0VFUV9UWF9CVUZGRVJTICAxNgorCisjZGVmaW5lIFBLVF9CVUZfU1ogICAgICAgMTU4NAorCisjZGVmaW5lIE5FWFRfUlgoaSkgICgoKGkpICsgMSkgJiAoU0VFUV9SWF9CVUZGRVJTIC0gMSkpCisjZGVmaW5lIE5FWFRfVFgoaSkgICgoKGkpICsgMSkgJiAoU0VFUV9UWF9CVUZGRVJTIC0gMSkpCisjZGVmaW5lIFBSRVZfUlgoaSkgICgoKGkpIC0gMSkgJiAoU0VFUV9SWF9CVUZGRVJTIC0gMSkpCisjZGVmaW5lIFBSRVZfVFgoaSkgICgoKGkpIC0gMSkgJiAoU0VFUV9UWF9CVUZGRVJTIC0gMSkpCisKKyNkZWZpbmUgVFhfQlVGRlNfQVZBSUwoc3ApICgoc3AtPnR4X29sZCA8PSBzcC0+dHhfbmV3KSA/IFwKKwkJCSAgICBzcC0+dHhfb2xkICsgKFNFRVFfVFhfQlVGRkVSUyAtIDEpIC0gc3AtPnR4X25ldyA6IFwKKwkJCSAgICBzcC0+dHhfb2xkIC0gc3AtPnR4X25ldyAtIDEpCisKKyNkZWZpbmUgREVCVUcKKworc3RydWN0IHNnaXNlZXFfcnhfZGVzYyB7CisJdm9sYXRpbGUgc3RydWN0IGhwY19kbWFfZGVzYyByZG1hOworCXZvbGF0aWxlIHNpZ25lZCBpbnQgYnVmX3ZhZGRyOworfTsKKworc3RydWN0IHNnaXNlZXFfdHhfZGVzYyB7CisJdm9sYXRpbGUgc3RydWN0IGhwY19kbWFfZGVzYyB0ZG1hOworCXZvbGF0aWxlIHNpZ25lZCBpbnQgYnVmX3ZhZGRyOworfTsKKworLyoKKyAqIFdhcm5pbmc6IFRoaXMgc3RydWN0dXJlIGlzIGxheWVkIG91dCBpbiBhIGNlcnRhaW4gd2F5IGJlY2F1c2UgSFBDIGRtYQorICogICAgICAgICAgZGVzY3JpcHRvcnMgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gIFNvIGRvbid0IHRvdWNoIHRoaXMgd2l0aG91dAorICogICAgICAgICAgc29tZSBjYXJlLgorICovCitzdHJ1Y3Qgc2dpc2VlcV9pbml0X2Jsb2NrIHsgLyogTm90ZSB0aGUgbmFtZSA7LSkgKi8KKwlzdHJ1Y3Qgc2dpc2VlcV9yeF9kZXNjIHJ4dmVjdG9yW1NFRVFfUlhfQlVGRkVSU107CisJc3RydWN0IHNnaXNlZXFfdHhfZGVzYyB0eHZlY3RvcltTRUVRX1RYX0JVRkZFUlNdOworfTsKKworc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSB7CisJc3RydWN0IHNnaXNlZXFfaW5pdF9ibG9jayAqc3JpbmdzOworCisJLyogUHRycyB0byB0aGUgZGVzY3JpcHRvcnMgaW4gdW5jYWNoZWQgc3BhY2UuICovCisJc3RydWN0IHNnaXNlZXFfcnhfZGVzYyAqcnhfZGVzYzsKKwlzdHJ1Y3Qgc2dpc2VlcV90eF9kZXNjICp0eF9kZXNjOworCisJY2hhciAqbmFtZTsKKwlzdHJ1Y3QgaHBjM19ldGhyZWdzICpocmVnczsKKwlzdHJ1Y3Qgc2dpc2VlcV9yZWdzICpzcmVnczsKKworCS8qIFJpbmcgZW50cnkgY291bnRlcnMuICovCisJdW5zaWduZWQgaW50IHJ4X25ldywgdHhfbmV3OworCXVuc2lnbmVkIGludCByeF9vbGQsIHR4X29sZDsKKworCWludCBpc19lZGxjOworCXVuc2lnbmVkIGNoYXIgY29udHJvbDsKKwl1bnNpZ25lZCBjaGFyIG1vZGU7CisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXh0X21vZHVsZTsKKwlzcGlubG9ja190IHR4X2xvY2s7Cit9OworCisvKiBBIGxpc3Qgb2YgYWxsIGluc3RhbGxlZCBzZWVxIGRldmljZXMsIGZvciByZW1vdmluZyB0aGUgZHJpdmVyIG1vZHVsZS4gKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqcm9vdF9zZ2lzZWVxX2RldjsKKworc3RhdGljIGlubGluZSB2b2lkIGhwYzNfZXRoX3Jlc2V0KHN0cnVjdCBocGMzX2V0aHJlZ3MgKmhyZWdzKQoreworCWhyZWdzLT5yeF9yZXNldCA9IEhQQzNfRVJYUlNUX0NSRVNFVCB8IEhQQzNfRVJYUlNUX0NMUklSUTsKKwl1ZGVsYXkoMjApOworCWhyZWdzLT5yeF9yZXNldCA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXNldF9ocGMzX2FuZF9zZWVxKHN0cnVjdCBocGMzX2V0aHJlZ3MgKmhyZWdzLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2dpc2VlcV9yZWdzICpzcmVncykKK3sKKwlocmVncy0+cnhfY3RybCA9IGhyZWdzLT50eF9jdHJsID0gMDsKKwlocGMzX2V0aF9yZXNldChocmVncyk7Cit9CisKKyNkZWZpbmUgUlNUQVRfR09fQklUUyAoU0VFUV9SQ01EX0lHT09EIHwgU0VFUV9SQ01EX0lFT0YgfCBTRUVRX1JDTURfSVNIT1JUIHwgXAorCQkgICAgICAgU0VFUV9SQ01EX0lEUklCIHwgU0VFUV9SQ01EX0lDUkMpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZWVxX2dvKHN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwLAorCQkJICAgc3RydWN0IGhwYzNfZXRocmVncyAqaHJlZ3MsCisJCQkgICBzdHJ1Y3Qgc2dpc2VlcV9yZWdzICpzcmVncykKK3sKKwlzcmVncy0+cnN0YXQgPSBzcC0+bW9kZSB8IFJTVEFUX0dPX0JJVFM7CisJaHJlZ3MtPnJ4X2N0cmwgPSBIUEMzX0VSWENUUkxfQUNUSVZFOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19zZ2lzZWVxX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2dpc2VlcV9yZWdzICpzcmVncyA9IHNwLT5zcmVnczsKKwlpbnQgaTsKKworCXNyZWdzLT50c3RhdCA9IFNFRVFfVENNRF9SQjA7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJc3JlZ3MtPnJ3LmV0aF9hZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKK30KKworc3RhdGljIGludCBzZ2lzZWVxX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gYWRkcjsKKworCW1lbWNweShkZXYtPmRldl9hZGRyLCBzYS0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisKKwlzcGluX2xvY2tfaXJxKCZzcC0+dHhfbG9jayk7CisJX19zZ2lzZWVxX3NldF9tYWNfYWRkcmVzcyhkZXYpOworCXNwaW5fdW5sb2NrX2lycSgmc3AtPnR4X2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgVENOVElORk9fSU5JVCAoSFBDRE1BX0VPWCB8IEhQQ0RNQV9FVFhEKQorI2RlZmluZSBSQ05UQ0ZHX0lOSVQgIChIUENETUFfT1dOIHwgSFBDRE1BX0VPUlAgfCBIUENETUFfWElFKQorI2RlZmluZSBSQ05USU5GT19JTklUIChSQ05UQ0ZHX0lOSVQgfCAoUEtUX0JVRl9TWiAmIEhQQ0RNQV9CQ05UKSkKKworc3RhdGljIGludCBzZWVxX2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlzcC0+cnhfbmV3ID0gc3AtPnR4X25ldyA9IDA7CisJc3AtPnJ4X29sZCA9IHNwLT50eF9vbGQgPSAwOworCisJX19zZ2lzZWVxX3NldF9tYWNfYWRkcmVzcyhkZXYpOworCisJLyogU2V0dXAgdHggcmluZy4gKi8KKwlmb3IoaSA9IDA7IGkgPCBTRUVRX1RYX0JVRkZFUlM7IGkrKykgeworCQlpZiAoIXNwLT50eF9kZXNjW2ldLnRkbWEucGJ1ZikgeworCQkJdW5zaWduZWQgbG9uZyBidWZmZXI7CisKKwkJCWJ1ZmZlciA9ICh1bnNpZ25lZCBsb25nKSBrbWFsbG9jKFBLVF9CVUZfU1osIEdGUF9LRVJORUwpOworCQkJaWYgKCFidWZmZXIpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlzcC0+dHhfZGVzY1tpXS5idWZfdmFkZHIgPSBDS1NFRzFBRERSKGJ1ZmZlcik7CisJCQlzcC0+dHhfZGVzY1tpXS50ZG1hLnBidWYgPSBDUEhZU0FERFIoYnVmZmVyKTsKKwkJfQorCQlzcC0+dHhfZGVzY1tpXS50ZG1hLmNudGluZm8gPSBUQ05USU5GT19JTklUOworCX0KKworCS8qIEFuZCBub3cgdGhlIHJ4IHJpbmcuICovCisJZm9yIChpID0gMDsgaSA8IFNFRVFfUlhfQlVGRkVSUzsgaSsrKSB7CisJCWlmICghc3AtPnJ4X2Rlc2NbaV0ucmRtYS5wYnVmKSB7CisJCQl1bnNpZ25lZCBsb25nIGJ1ZmZlcjsKKworCQkJYnVmZmVyID0gKHVuc2lnbmVkIGxvbmcpIGttYWxsb2MoUEtUX0JVRl9TWiwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWJ1ZmZlcikKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCXNwLT5yeF9kZXNjW2ldLmJ1Zl92YWRkciA9IENLU0VHMUFERFIoYnVmZmVyKTsKKwkJCXNwLT5yeF9kZXNjW2ldLnJkbWEucGJ1ZiA9IENQSFlTQUREUihidWZmZXIpOworCQl9CisJCXNwLT5yeF9kZXNjW2ldLnJkbWEuY250aW5mbyA9IFJDTlRJTkZPX0lOSVQ7CisJfQorCXNwLT5yeF9kZXNjW2kgLSAxXS5yZG1hLmNudGluZm8gfD0gSFBDRE1BX0VPUjsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIERFQlVHCitzdGF0aWMgc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSAqZ3ByaXY7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmdkZXY7CisKK3ZvaWQgc2dpc2VlcV9kdW1wX3JpbmdzKHZvaWQpCit7CisJc3RhdGljIGludCBvbmNlOworCXN0cnVjdCBzZ2lzZWVxX3J4X2Rlc2MgKnIgPSBncHJpdi0+cnhfZGVzYzsKKwlzdHJ1Y3Qgc2dpc2VlcV90eF9kZXNjICp0ID0gZ3ByaXYtPnR4X2Rlc2M7CisJc3RydWN0IGhwYzNfZXRocmVncyAqaHJlZ3MgPSBncHJpdi0+aHJlZ3M7CisJaW50IGk7CisKKwlpZiAob25jZSkKKwkJcmV0dXJuOworCW9uY2UrKzsKKwlwcmludGsoIlJJTkcgRFVNUDpcbiIpOworCWZvciAoaSA9IDA7IGkgPCBTRUVRX1JYX0JVRkZFUlM7IGkrKykgeworCQlwcmludGsoIlJYIFslZF06IEAoJXApIFslMDh4LCUwOHgsJTA4eF0gIiwKKwkJICAgICAgIGksICgmcltpXSksIHJbaV0ucmRtYS5wYnVmLCByW2ldLnJkbWEuY250aW5mbywKKwkJICAgICAgIHJbaV0ucmRtYS5wbmV4dCk7CisJCWkgKz0gMTsKKwkJcHJpbnRrKCItLSBbJWRdOiBAKCVwKSBbJTA4eCwlMDh4LCUwOHhdXG4iLAorCQkgICAgICAgaSwgKCZyW2ldKSwgcltpXS5yZG1hLnBidWYsIHJbaV0ucmRtYS5jbnRpbmZvLAorCQkgICAgICAgcltpXS5yZG1hLnBuZXh0KTsKKwl9CisJZm9yIChpID0gMDsgaSA8IFNFRVFfVFhfQlVGRkVSUzsgaSsrKSB7CisJCXByaW50aygiVFggWyVkXTogQCglcCkgWyUwOHgsJTA4eCwlMDh4XSAiLAorCQkgICAgICAgaSwgKCZ0W2ldKSwgdFtpXS50ZG1hLnBidWYsIHRbaV0udGRtYS5jbnRpbmZvLAorCQkgICAgICAgdFtpXS50ZG1hLnBuZXh0KTsKKwkJaSArPSAxOworCQlwcmludGsoIi0tIFslZF06IEAoJXApIFslMDh4LCUwOHgsJTA4eF1cbiIsCisJCSAgICAgICBpLCAoJnRbaV0pLCB0W2ldLnRkbWEucGJ1ZiwgdFtpXS50ZG1hLmNudGluZm8sCisJCSAgICAgICB0W2ldLnRkbWEucG5leHQpOworCX0KKwlwcmludGsoIklORk86IFtyeF9uZXcgPSAlZCByeF9vbGQ9JWRdIFt0eF9uZXcgPSAlZCB0eF9vbGQgPSAlZF1cbiIsCisJICAgICAgIGdwcml2LT5yeF9uZXcsIGdwcml2LT5yeF9vbGQsIGdwcml2LT50eF9uZXcsIGdwcml2LT50eF9vbGQpOworCXByaW50aygiUlJFR1M6IHJ4X2NicHRyWyUwOHhdIHJ4X25kcHRyWyUwOHhdIHJ4X2N0cmxbJTA4eF1cbiIsCisJICAgICAgIGhyZWdzLT5yeF9jYnB0ciwgaHJlZ3MtPnJ4X25kcHRyLCBocmVncy0+cnhfY3RybCk7CisJcHJpbnRrKCJUUkVHUzogdHhfY2JwdHJbJTA4eF0gdHhfbmRwdHJbJTA4eF0gdHhfY3RybFslMDh4XVxuIiwKKwkgICAgICAgaHJlZ3MtPnR4X2NicHRyLCBocmVncy0+dHhfbmRwdHIsIGhyZWdzLT50eF9jdHJsKTsKK30KKyNlbmRpZgorCisjZGVmaW5lIFRTVEFUX0lOSVRfU0VFUSAoU0VFUV9UQ01EX0lQVHxTRUVRX1RDTURfSTE2fFNFRVFfVENNRF9JQ3xTRUVRX1RDTURfSVVGKQorI2RlZmluZSBUU1RBVF9JTklUX0VETEMgKChUU1RBVF9JTklUX1NFRVEpIHwgU0VFUV9UQ01EX1JCMikKKyNkZWZpbmUgUkRNQUNGR19JTklUICAgIChIUEMzX0VSWERDRkdfRlJYREMgfCBIUEMzX0VSWERDRkdfRkVPUCB8IEhQQzNfRVJYRENGR19GSVJRKQorCitzdGF0aWMgaW50IGluaXRfc2VlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCwKKwkJICAgICBzdHJ1Y3Qgc2dpc2VlcV9yZWdzICpzcmVncykKK3sKKwlzdHJ1Y3QgaHBjM19ldGhyZWdzICpocmVncyA9IHNwLT5ocmVnczsKKwlpbnQgZXJyOworCisJcmVzZXRfaHBjM19hbmRfc2VlcShocmVncywgc3JlZ3MpOworCWVyciA9IHNlZXFfaW5pdF9yaW5nKGRldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIFNldHVwIHRvIGZpZWxkIHRoZSBwcm9wZXIgaW50ZXJydXB0IHR5cGVzLiAqLworCWlmIChzcC0+aXNfZWRsYykgeworCQlzcmVncy0+dHN0YXQgPSBUU1RBVF9JTklUX0VETEM7CisJCXNyZWdzLT5ydy53cmVncy5jb250cm9sID0gc3AtPmNvbnRyb2w7CisJCXNyZWdzLT5ydy53cmVncy5mcmFtZV9nYXAgPSAwOworCX0gZWxzZSB7CisJCXNyZWdzLT50c3RhdCA9IFRTVEFUX0lOSVRfU0VFUTsKKwl9CisKKwlocmVncy0+cnhfZGNvbmZpZyB8PSBSRE1BQ0ZHX0lOSVQ7CisKKwlocmVncy0+cnhfbmRwdHIgPSBDUEhZU0FERFIoc3AtPnJ4X2Rlc2MpOworCWhyZWdzLT50eF9uZHB0ciA9IENQSFlTQUREUihzcC0+dHhfZGVzYyk7CisKKwlzZWVxX2dvKHNwLCBocmVncywgc3JlZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVjb3JkX3J4X2Vycm9ycyhzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCwKKwkJCQkgICAgdW5zaWduZWQgY2hhciBzdGF0dXMpCit7CisJaWYgKHN0YXR1cyAmIFNFRVFfUlNUQVRfT1ZFUkYgfHwKKwkgICAgc3RhdHVzICYgU0VFUV9SU1RBVF9TRlJBTUUpCisJCXNwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCWlmIChzdGF0dXMgJiBTRUVRX1JTVEFUX0NFUlJPUikKKwkJc3AtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgU0VFUV9SU1RBVF9ERVJST1IpCisJCXNwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwlpZiAoc3RhdHVzICYgU0VFUV9SU1RBVF9SRU9GKQorCQlzcC0+c3RhdHMucnhfZXJyb3JzKys7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByeF9tYXliZV9yZXN0YXJ0KHN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwLAorCQkJCSAgICBzdHJ1Y3QgaHBjM19ldGhyZWdzICpocmVncywKKwkJCQkgICAgc3RydWN0IHNnaXNlZXFfcmVncyAqc3JlZ3MpCit7CisJaWYgKCEoaHJlZ3MtPnJ4X2N0cmwgJiBIUEMzX0VSWENUUkxfQUNUSVZFKSkgeworCQlocmVncy0+cnhfbmRwdHIgPSBDUEhZU0FERFIoc3AtPnJ4X2Rlc2MgKyBzcC0+cnhfbmV3KTsKKwkJc2VlcV9nbyhzcCwgaHJlZ3MsIHNyZWdzKTsKKwl9Cit9CisKKyNkZWZpbmUgZm9yX2VhY2hfcngocmQsIHNwKSBmb3IoKHJkKSA9ICYoc3ApLT5yeF9kZXNjWyhzcCktPnJ4X25ld107IFwKKwkJCQkhKChyZCktPnJkbWEuY250aW5mbyAmIEhQQ0RNQV9PV04pOyBcCisJCQkJKHJkKSA9ICYoc3ApLT5yeF9kZXNjWyhzcCktPnJ4X25ld10pCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZ2lzZWVxX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwLAorCQkJICAgICAgc3RydWN0IGhwYzNfZXRocmVncyAqaHJlZ3MsCisJCQkgICAgICBzdHJ1Y3Qgc2dpc2VlcV9yZWdzICpzcmVncykKK3sKKwlzdHJ1Y3Qgc2dpc2VlcV9yeF9kZXNjICpyZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gMDsKKwl1bnNpZ25lZCBjaGFyIHBrdF9zdGF0dXM7CisJdW5zaWduZWQgY2hhciAqcGt0X3BvaW50ZXIgPSAwOworCWludCBsZW4gPSAwOworCXVuc2lnbmVkIGludCBvcmlnX2VuZCA9IFBSRVZfUlgoc3AtPnJ4X25ldyk7CisKKwkvKiBTZXJ2aWNlIGV2ZXJ5IHJlY2VpdmVkIHBhY2tldC4gKi8KKwlmb3JfZWFjaF9yeChyZCwgc3ApIHsKKwkJbGVuID0gUEtUX0JVRl9TWiAtIChyZC0+cmRtYS5jbnRpbmZvICYgSFBDRE1BX0JDTlQpIC0gMzsKKwkJcGt0X3BvaW50ZXIgPSAodW5zaWduZWQgY2hhciAqKShsb25nKXJkLT5idWZfdmFkZHI7CisJCXBrdF9zdGF0dXMgPSBwa3RfcG9pbnRlcltsZW4gKyAyXTsKKworCQlpZiAocGt0X3N0YXR1cyAmIFNFRVFfUlNUQVRfRklHKSB7CisJCQkvKiBQYWNrZXQgaXMgT0suICovCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDIpOworCisJCQlpZiAoc2tiKSB7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkJCQlza2JfcHV0KHNrYiwgbGVuKTsKKworCQkJCS8qIENvcHkgb3V0IG9mIGtzZWcxIHRvIGF2b2lkIHNpbGx5IGNhY2hlIGZsdXNoLiAqLworCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBwa3RfcG9pbnRlciArIDIsIGxlbiwgMCk7CisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworCQkJCS8qIFdlIGRvbid0IHdhbnQgdG8gcmVjZWl2ZSBvdXIgb3duIHBhY2tldHMgKi8KKwkJCQlpZiAobWVtY21wKGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSkgeworCQkJCQluZXRpZl9yeChza2IpOworCQkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCQlzcC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJCQlzcC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIFNpbGVudGx5IGRyb3AgbXkgb3duIHBhY2tldHMgKi8KKwkJCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXByaW50ayAoS0VSTl9OT1RJQ0UgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZGVmZXJyaW5nIHBhY2tldC5cbiIsCisJCQkJCWRldi0+bmFtZSk7CisJCQkJc3AtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJlY29yZF9yeF9lcnJvcnMoc3AsIHBrdF9zdGF0dXMpOworCQl9CisKKwkJLyogUmV0dXJuIHRoZSBlbnRyeSB0byB0aGUgcmluZyBwb29sLiAqLworCQlyZC0+cmRtYS5jbnRpbmZvID0gUkNOVElORk9fSU5JVDsKKwkJc3AtPnJ4X25ldyA9IE5FWFRfUlgoc3AtPnJ4X25ldyk7CisJfQorCXNwLT5yeF9kZXNjW29yaWdfZW5kXS5yZG1hLmNudGluZm8gJj0gfihIUENETUFfRU9SKTsKKwlzcC0+cnhfZGVzY1tQUkVWX1JYKHNwLT5yeF9uZXcpXS5yZG1hLmNudGluZm8gfD0gSFBDRE1BX0VPUjsKKwlyeF9tYXliZV9yZXN0YXJ0KHNwLCBocmVncywgc3JlZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHhfbWF5YmVfcmVzZXRfY29sbGlzaW9ucyhzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCwKKwkJCQkJICAgICBzdHJ1Y3Qgc2dpc2VlcV9yZWdzICpzcmVncykKK3sKKwlpZiAoc3AtPmlzX2VkbGMpIHsKKwkJc3JlZ3MtPnJ3LndyZWdzLmNvbnRyb2wgPSBzcC0+Y29udHJvbCAmIH4oU0VFUV9DVFJMX1hDTlQpOworCQlzcmVncy0+cncud3JlZ3MuY29udHJvbCA9IHNwLT5jb250cm9sOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGtpY2tfdHgoc3RydWN0IHNnaXNlZXFfdHhfZGVzYyAqdGQsCisJCQkgICBzdHJ1Y3QgaHBjM19ldGhyZWdzICpocmVncykKK3sKKwkvKiBJZiB0aGUgSFBDIGFpbnQgZG9pbiBub3RoaW4sIGFuZCB0aGVyZSBhcmUgbW9yZSBwYWNrZXRzCisJICogd2l0aCBFVFhEIGNsZWFyZWQgYW5kIFhJVSBzZXQgd2UgbXVzdCBtYWtlIHZlcnkgY2VydGFpbgorCSAqIHRoYXQgd2UgcmVzdGFydCB0aGUgSFBDIGVsc2Ugd2UgcmlzayBsb2NraW5nIHVwIHRoZQorCSAqIGFkYXB0ZXIuICBUaGUgZm9sbG93aW5nIGNvZGUgaXMgb25seSBzYWZlIGlmZiB0aGUgSFBDRE1BCisJICogaXMgbm90IGFjdGl2ZSEKKwkgKi8KKwl3aGlsZSAoKHRkLT50ZG1hLmNudGluZm8gJiAoSFBDRE1BX1hJVSB8IEhQQ0RNQV9FVFhEKSkgPT0KKwkgICAgICAoSFBDRE1BX1hJVSB8IEhQQ0RNQV9FVFhEKSkKKwkJdGQgPSAoc3RydWN0IHNnaXNlZXFfdHhfZGVzYyAqKShsb25nKSBDS1NFRzFBRERSKHRkLT50ZG1hLnBuZXh0KTsKKwlpZiAodGQtPnRkbWEuY250aW5mbyAmIEhQQ0RNQV9YSVUpIHsKKwkJaHJlZ3MtPnR4X25kcHRyID0gQ1BIWVNBRERSKHRkKTsKKwkJaHJlZ3MtPnR4X2N0cmwgPSBIUEMzX0VUWENUUkxfQUNUSVZFOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHNnaXNlZXFfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSAqc3AsCisJCQkgICAgICBzdHJ1Y3QgaHBjM19ldGhyZWdzICpocmVncywKKwkJCSAgICAgIHN0cnVjdCBzZ2lzZWVxX3JlZ3MgKnNyZWdzKQoreworCXN0cnVjdCBzZ2lzZWVxX3R4X2Rlc2MgKnRkOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzID0gaHJlZ3MtPnR4X2N0cmw7CisJaW50IGo7CisKKwl0eF9tYXliZV9yZXNldF9jb2xsaXNpb25zKHNwLCBzcmVncyk7CisKKwlpZiAoIShzdGF0dXMgJiAoSFBDM19FVFhDVFJMX0FDVElWRSB8IFNFRVFfVFNUQVRfUFRSQU5TKSkpIHsKKwkJLyogT29wcywgSFBDIGRldGVjdGVkIHNvbWUgc29ydCBvZiBlcnJvci4gKi8KKwkJaWYgKHN0YXR1cyAmIFNFRVFfVFNUQVRfUjE2KQorCQkJc3AtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBTRUVRX1RTVEFUX1VGTE9XKQorCQkJc3AtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBTRUVRX1RTVEFUX0xDTFMpCisJCQlzcC0+c3RhdHMuY29sbGlzaW9ucysrOworCX0KKworCS8qIEFjayAnZW0uLi4gKi8KKwlmb3IgKGogPSBzcC0+dHhfb2xkOyBqICE9IHNwLT50eF9uZXc7IGogPSBORVhUX1RYKGopKSB7CisJCXRkID0gJnNwLT50eF9kZXNjW2pdOworCisJCWlmICghKHRkLT50ZG1hLmNudGluZm8gJiAoSFBDRE1BX1hJVSkpKQorCQkJYnJlYWs7CisJCWlmICghKHRkLT50ZG1hLmNudGluZm8gJiAoSFBDRE1BX0VUWEQpKSkgeworCQkJaWYgKCEoc3RhdHVzICYgSFBDM19FVFhDVFJMX0FDVElWRSkpIHsKKwkJCQlocmVncy0+dHhfbmRwdHIgPSBDUEhZU0FERFIodGQpOworCQkJCWhyZWdzLT50eF9jdHJsID0gSFBDM19FVFhDVFJMX0FDVElWRTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCXNwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXNwLT50eF9vbGQgPSBORVhUX1RYKHNwLT50eF9vbGQpOworCQl0ZC0+dGRtYS5jbnRpbmZvICY9IH4oSFBDRE1BX1hJVSB8IEhQQ0RNQV9YSUUpOworCQl0ZC0+dGRtYS5jbnRpbmZvIHw9IEhQQ0RNQV9FT1g7CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2dpc2VlcV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGhwYzNfZXRocmVncyAqaHJlZ3MgPSBzcC0+aHJlZ3M7CisJc3RydWN0IHNnaXNlZXFfcmVncyAqc3JlZ3MgPSBzcC0+c3JlZ3M7CisKKwlzcGluX2xvY2soJnNwLT50eF9sb2NrKTsKKworCS8qIEFjayB0aGUgSVJRIGFuZCBzZXQgc29mdHdhcmUgc3RhdGUuICovCisJaHJlZ3MtPnJ4X3Jlc2V0ID0gSFBDM19FUlhSU1RfQ0xSSVJROworCisJLyogQWx3YXlzIGNoZWNrIGZvciByZWNlaXZlZCBwYWNrZXRzLiAqLworCXNnaXNlZXFfcngoZGV2LCBzcCwgaHJlZ3MsIHNyZWdzKTsKKworCS8qIE9ubHkgY2hlY2sgZm9yIHR4IGFja3MgaWYgd2UgaGF2ZSBzb21ldGhpbmcgcXVldWVkLiAqLworCWlmIChzcC0+dHhfb2xkICE9IHNwLT50eF9uZXcpCisJCXNnaXNlZXFfdHgoZGV2LCBzcCwgaHJlZ3MsIHNyZWdzKTsKKworCWlmICgoVFhfQlVGRlNfQVZBSUwoc3ApID4gMCkgJiYgbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisJc3Bpbl91bmxvY2soJnNwLT50eF9sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBzZ2lzZWVxX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNnaXNlZXFfcmVncyAqc3JlZ3MgPSBzcC0+c3JlZ3M7CisJdW5zaWduZWQgaW50IGlycSA9IGRldi0+aXJxOworCWludCBlcnI7CisKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBzZ2lzZWVxX2ludGVycnVwdCwgMCwgc2dpc2VlcXN0ciwgZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNlZXE4MDAzOiBDYW4ndCBnZXQgaXJxICVkXG4iLCBkZXYtPmlycSk7CisJCWVyciA9IC1FQUdBSU47CisJfQorCisJZXJyID0gaW5pdF9zZWVxKGRldiwgc3AsIHNyZWdzKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlX2lycTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVfaXJxOgorCWZyZWVfaXJxKGlycSwgZGV2KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2dpc2VlcV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2dpc2VlcV9yZWdzICpzcmVncyA9IHNwLT5zcmVnczsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIFNodXRkb3duIHRoZSBTZWVxLiAqLworCXJlc2V0X2hwYzNfYW5kX3NlZXEoc3AtPmhyZWdzLCBzcmVncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2dpc2VlcV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc2dpc2VlcV9yZWdzICpzcmVncyA9IHNwLT5zcmVnczsKKwlpbnQgZXJyOworCisJZXJyID0gaW5pdF9zZWVxKGRldiwgc3AsIHNyZWdzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2dpc2VlcV9teV9yZXNldCh2b2lkKQoreworCXByaW50aygiUkVTRVQhXG4iKTsKKwlzZ2lzZWVxX3Jlc2V0KGdkZXYpOworfQorCitzdGF0aWMgaW50IHNnaXNlZXFfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKnNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaHBjM19ldGhyZWdzICpocmVncyA9IHNwLT5ocmVnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzZ2lzZWVxX3R4X2Rlc2MgKnRkOworCWludCBza2JsZW4sIGxlbiwgZW50cnk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3AtPnR4X2xvY2ssIGZsYWdzKTsKKworCS8qIFNldHVwLi4uICovCisJc2tibGVuID0gc2tiLT5sZW47CisJbGVuID0gKHNrYmxlbiA8PSBFVEhfWkxFTikgPyBFVEhfWkxFTiA6IHNrYmxlbjsKKwlzcC0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuOworCWVudHJ5ID0gc3AtPnR4X25ldzsKKwl0ZCA9ICZzcC0+dHhfZGVzY1tlbnRyeV07CisKKwkvKiBDcmVhdGUgZW50cnkuICBUaGVyZSBhcmUgc28gbWFueSByYWNlcyB3aXRoIGFkZGluZyBhIG5ldworCSAqIGRlc2NyaXB0b3IgdG8gdGhlIGNoYWluOgorCSAqIDEpIEFzc3VtZSB0aGF0IHRoZSBIUEMgaXMgb2ZmIHByb2Nlc3NpbmcgYSBETUEgY2hhaW4gd2hpbGUKKwkgKiAgICB3ZSBhcmUgY2hhbmdpbmcgYWxsIG9mIHRoZSBmb2xsb3dpbmcuCisJICogMikgRG8gbm8gYWxsb3cgdGhlIEhQQyB0byBsb29rIGF0IGEgbmV3IGRlc2NyaXB0b3IgdW50aWwKKwkgKiAgICB3ZSBoYXZlIGNvbXBsZXRlbHkgc2V0IHVwIGl0J3Mgc3RhdGUuICBUaGlzIG1lYW5zLCBkbworCSAqICAgIG5vdCBjbGVhciBIUENETUFfRU9YIGluIHRoZSBjdXJyZW50IGxhc3QgZGVzY3JpdHB0b3IKKwkgKiAgICB1bnRpbCB0aGUgb25lIHdlIGFyZSBhZGRpbmcgbG9va3MgY29uc2lzdGVudCBhbmQgY291bGQKKwkgKiAgICBiZSBwcm9jZXNzZXMgcmlnaHQgbm93LgorCSAqIDMpIFRoZSB0eCBpbnRlcnJ1cHQgY29kZSBtdXN0IG5vdGljZSB3aGVuIHdlJ3ZlIGFkZGVkIGEgbmV3CisJICogICAgZW50cnkgYW5kIHRoZSBIUEMgZ290IHRvIHRoZSBlbmQgb2YgdGhlIGNoYWluIGJlZm9yZSB3ZQorCSAqICAgIGFkZGVkIHRoaXMgbmV3IGVudHJ5IGFuZCByZXN0YXJ0ZWQgaXQuCisJICovCisJbWVtY3B5KChjaGFyICopKGxvbmcpdGQtPmJ1Zl92YWRkciwgc2tiLT5kYXRhLCBza2JsZW4pOworCWlmIChsZW4gIT0gc2tibGVuKQorCQltZW1zZXQoKGNoYXIgKikobG9uZyl0ZC0+YnVmX3ZhZGRyICsgc2tiLT5sZW4sIDAsIGxlbi1za2JsZW4pOworCXRkLT50ZG1hLmNudGluZm8gPSAobGVuICYgSFBDRE1BX0JDTlQpIHwKKwkgICAgICAgICAgICAgICAgICAgSFBDRE1BX1hJVSB8IEhQQ0RNQV9FT1hQIHwgSFBDRE1BX1hJRSB8IEhQQ0RNQV9FT1g7CisJaWYgKHNwLT50eF9vbGQgIT0gc3AtPnR4X25ldykgeworCQlzdHJ1Y3Qgc2dpc2VlcV90eF9kZXNjICpiYWNrZW5kOworCisJCWJhY2tlbmQgPSAmc3AtPnR4X2Rlc2NbUFJFVl9UWChzcC0+dHhfbmV3KV07CisJCWJhY2tlbmQtPnRkbWEuY250aW5mbyAmPSB+SFBDRE1BX0VPWDsKKwl9CisJc3AtPnR4X25ldyA9IE5FWFRfVFgoc3AtPnR4X25ldyk7IC8qIEFkdmFuY2UuICovCisKKwkvKiBNYXliZSBraWNrIHRoZSBIUEMgYmFjayBpbnRvIG1vdGlvbi4gKi8KKwlpZiAoIShocmVncy0+dHhfY3RybCAmIEhQQzNfRVRYQ1RSTF9BQ1RJVkUpKQorCQlraWNrX3R4KCZzcC0+dHhfZGVzY1tzcC0+dHhfb2xkXSwgaHJlZ3MpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJZGV2X2tmcmVlX3NrYihza2IpOworCisJaWYgKCFUWF9CVUZGU19BVkFJTChzcCkpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcC0+dHhfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHJlc2V0dGluZ1xuIiwgZGV2LT5uYW1lKTsKKwlzZ2lzZWVxX3Jlc2V0KGRldik7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2dpc2VlcV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gJnNwLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgc2dpc2VlcV9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSAqc3AgPSAoc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgY2hhciBvbGRtb2RlID0gc3AtPm1vZGU7CisKKwlpZihkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCXNwLT5tb2RlID0gU0VFUV9SQ01EX1JBTlk7CisJZWxzZSBpZiAoKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHx8IGRldi0+bWNfY291bnQpCisJCXNwLT5tb2RlID0gU0VFUV9SQ01EX1JCTUNBU1Q7CisJZWxzZQorCQlzcC0+bW9kZSA9IFNFRVFfUkNNRF9SQkNBU1Q7CisKKwkvKiBYWFggSSBrbm93IHRoaXMgc3Vja3MsIGJ1dCBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gcmVwcm9ncmFtCisJICogWFhYIHRoZSByZWNlaXZlcj8gQXQgbGVhc3QsIHRoaXMgc2hvdWxkbid0IGhhcHBlbiB0b28gb2Z0ZW4uCisJICovCisKKwlpZiAob2xkbW9kZSAhPSBzcC0+bW9kZSkKKwkJc2dpc2VlcV9yZXNldChkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfdHhfcmluZyhzdHJ1Y3Qgc2dpc2VlcV90eF9kZXNjICpidWYsIGludCBuYnVmcykKK3sKKwlpbnQgaSA9IDA7CisKKwl3aGlsZSAoaSA8IChuYnVmcyAtIDEpKSB7CisJCWJ1ZltpXS50ZG1hLnBuZXh0ID0gQ1BIWVNBRERSKGJ1ZiArIGkgKyAxKTsKKwkJYnVmW2ldLnRkbWEucGJ1ZiA9IDA7CisJCWkrKzsKKwl9CisJYnVmW2ldLnRkbWEucG5leHQgPSBDUEhZU0FERFIoYnVmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldHVwX3J4X3Jpbmcoc3RydWN0IHNnaXNlZXFfcnhfZGVzYyAqYnVmLCBpbnQgbmJ1ZnMpCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKGkgPCAobmJ1ZnMgLSAxKSkgeworCQlidWZbaV0ucmRtYS5wbmV4dCA9IENQSFlTQUREUihidWYgKyBpICsgMSk7CisJCWJ1ZltpXS5yZG1hLnBidWYgPSAwOworCQlpKys7CisJfQorCWJ1ZltpXS5yZG1hLnBidWYgPSAwOworCWJ1ZltpXS5yZG1hLnBuZXh0ID0gQ1BIWVNBRERSKGJ1Zik7Cit9CisKKyNkZWZpbmUgQUxJR05FRCh4KSAgKCgoKHVuc2lnbmVkIGxvbmcpKHgpKSArIDB4ZikgJiB+KDB4ZikpCisKK3N0YXRpYyBpbnQgc2dpc2VlcV9pbml0KHN0cnVjdCBocGMzX3JlZ3MqIHJlZ3MsIGludCBpcnEpCit7CisJc3RydWN0IHNnaXNlZXFfaW5pdF9ibG9jayAqc3I7CisJc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSAqc3A7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgZXJyLCBpOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mIChzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlKSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTZ2lzZWVxOiBFdGhlcmRldiBhbGxvYyBmYWlsZWQsIGFib3J0aW5nLlxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJc3AgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogTWFrZSBwcml2YXRlIGRhdGEgcGFnZSBhbGlnbmVkICovCisJc3IgPSAoc3RydWN0IHNnaXNlZXFfaW5pdF9ibG9jayAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFzcikgeworCQlwcmludGsoS0VSTl9FUlIgIlNnaXNlZXE6IFBhZ2UgYWxsb2MgZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfZnJlZV9kZXY7CisJfQorCXNwLT5zcmluZ3MgPSBzcjsKKworI2RlZmluZSBFQUREUl9OVk9GUyAgICAgMjUwCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQl1bnNpZ25lZCBzaG9ydCB0bXAgPSBpcDIyX252cmFtX3JlYWQoRUFERFJfTlZPRlMgLyAyICsgaSk7CisKKwkJZGV2LT5kZXZfYWRkclsyICogaV0gICAgID0gdG1wID4+IDg7CisJCWRldi0+ZGV2X2FkZHJbMiAqIGkgKyAxXSA9IHRtcCAmIDB4ZmY7CisJfQorCisjaWZkZWYgREVCVUcKKwlncHJpdiA9IHNwOworCWdkZXYgPSBkZXY7CisjZW5kaWYKKwlzcC0+c3JlZ3MgPSAoc3RydWN0IHNnaXNlZXFfcmVncyAqKSAmaHBjM2MwLT5ldGhfZXh0WzBdOworCXNwLT5ocmVncyA9ICZocGMzYzAtPmV0aHJlZ3M7CisJc3AtPm5hbWUgPSBzZ2lzZWVxc3RyOworCXNwLT5tb2RlID0gU0VFUV9SQ01EX1JCQ0FTVDsKKworCXNwLT5yeF9kZXNjID0gKHN0cnVjdCBzZ2lzZWVxX3J4X2Rlc2MgKikKKwkgICAgICAgICAgICAgIENLU0VHMUFERFIoQUxJR05FRCgmc3AtPnNyaW5ncy0+cnh2ZWN0b3JbMF0pKTsKKwlkbWFfY2FjaGVfd2JhY2tfaW52KCh1bnNpZ25lZCBsb25nKSZzcC0+c3JpbmdzLT5yeHZlY3RvciwKKwkgICAgICAgICAgICAgICAgICAgIHNpemVvZihzcC0+c3JpbmdzLT5yeHZlY3RvcikpOworCXNwLT50eF9kZXNjID0gKHN0cnVjdCBzZ2lzZWVxX3R4X2Rlc2MgKikKKwkgICAgICAgICAgICAgIENLU0VHMUFERFIoQUxJR05FRCgmc3AtPnNyaW5ncy0+dHh2ZWN0b3JbMF0pKTsKKwlkbWFfY2FjaGVfd2JhY2tfaW52KCh1bnNpZ25lZCBsb25nKSZzcC0+c3JpbmdzLT50eHZlY3RvciwKKwkgICAgICAgICAgICAgICAgICAgIHNpemVvZihzcC0+c3JpbmdzLT50eHZlY3RvcikpOworCisJLyogQSBjb3VwbGUgY2FsY3VsYXRpb25zIG5vdywgc2F2ZXMgbWFueSBjeWNsZXMgbGF0ZXIuICovCisJc2V0dXBfcnhfcmluZyhzcC0+cnhfZGVzYywgU0VFUV9SWF9CVUZGRVJTKTsKKwlzZXR1cF90eF9yaW5nKHNwLT50eF9kZXNjLCBTRUVRX1RYX0JVRkZFUlMpOworCisJLyogUmVzZXQgdGhlIGNoaXAuICovCisJaHBjM19ldGhfcmVzZXQoc3AtPmhyZWdzKTsKKworCXNwLT5pc19lZGxjID0gIShzcC0+c3JlZ3MtPnJ3LnJyZWdzLmNvbGxpc2lvbl90eFswXSAmIDB4ZmYpOworCWlmIChzcC0+aXNfZWRsYykKKwkJc3AtPmNvbnRyb2wgPSBTRUVRX0NUUkxfWENOVCB8IFNFRVFfQ1RSTF9BQ0NOVCB8CisJCQkgICAgICBTRUVRX0NUUkxfU0ZMQUcgfCBTRUVRX0NUUkxfRVNIT1JUIHwKKwkJCSAgICAgIFNFRVFfQ1RSTF9FTkNBUlI7CisKKwlkZXYtPm9wZW4JCT0gc2dpc2VlcV9vcGVuOworCWRldi0+c3RvcAkJPSBzZ2lzZWVxX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gc2dpc2VlcV9zdGFydF94bWl0OworCWRldi0+dHhfdGltZW91dAkJPSB0aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSAoMjAwICogSFopIC8gMTAwMDsKKwlkZXYtPmdldF9zdGF0cwkJPSBzZ2lzZWVxX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdAk9IHNnaXNlZXFfc2V0X211bHRpY2FzdDsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcwk9IHNnaXNlZXFfc2V0X21hY19hZGRyZXNzOworCWRldi0+aXJxCQk9IGlycTsKKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNnaXNlZXE6IENhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2ZyZWVfcGFnZTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogU0dJIFNlZXE4MDAzICIsIGRldi0+bmFtZSk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlMi4yeCVjIiwgZGV2LT5kZXZfYWRkcltpXSwgaSA9PSA1ID8gJ1xuJyA6ICc6Jyk7CisKKwlzcC0+bmV4dF9tb2R1bGUgPSByb290X3NnaXNlZXFfZGV2OworCXJvb3Rfc2dpc2VlcV9kZXYgPSBkZXY7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9mcmVlX3BhZ2U6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBzcCk7CitlcnJfb3V0X2ZyZWVfZGV2OgorCWtmcmVlKGRldik7CisKK2Vycl9vdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2luaXQgc2dpc2VlcV9wcm9iZSh2b2lkKQoreworCXByaW50ayh2ZXJzaW9uKTsKKworCS8qIE9uIGJvYXJkIGFkYXB0ZXIgb24gMXN0IEhQQyBpcyBhbHdheXMgcHJlc2VudCAqLworCXJldHVybiBzZ2lzZWVxX2luaXQoaHBjM2MwLCBTR0lfRU5FVF9JUlEpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2dpc2VlcV9leGl0KHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5leHQsICpkZXY7CisJc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSAqc3A7CisJaW50IGlycTsKKworCWZvciAoZGV2ID0gcm9vdF9zZ2lzZWVxX2RldjsgZGV2OyBkZXYgPSBuZXh0KSB7CisJCXNwID0gKHN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwkJbmV4dCA9IHNwLT5uZXh0X21vZHVsZTsKKwkJaXJxID0gZGV2LT5pcnE7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCWZyZWVfaXJxKGlycSwgZGV2KTsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBzcCk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJfQorfQorCittb2R1bGVfaW5pdChzZ2lzZWVxX3Byb2JlKTsKK21vZHVsZV9leGl0KHNnaXNlZXFfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NnaXNlZXEuaCBiL2RyaXZlcnMvbmV0L3NnaXNlZXEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmNjYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2dpc2VlcS5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogc2dpc2VlcS5oOiBEZWZpbmVzIGZvciB0aGUgU2VlcTgwMDMgZXRoZXJuZXQgY29udHJvbGxlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYgRGF2aWQgUy4gTWlsbGVyIChkbUBlbmdyLnNnaS5jb20pCisgKi8KKyNpZm5kZWYgX1NHSVNFRVFfSAorI2RlZmluZSBfU0dJU0VFUV9ICisKK3N0cnVjdCBzZ2lzZWVxX3dyZWdzIHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbXVsdGljYXNlX2hpZ2hbMl07CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IGZyYW1lX2dhcDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgY29udHJvbDsKK307CisKK3N0cnVjdCBzZ2lzZWVxX3JyZWdzIHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgY29sbGlzaW9uX3R4WzJdOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBjb2xsaXNpb25fYWxsWzJdOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCBfdW51c2VkMDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgcmZsYWdzOyAKK307CisKK3N0cnVjdCBzZ2lzZWVxX3JlZ3MgeworCXVuaW9uIHsKKwkJdm9sYXRpbGUgdW5zaWduZWQgaW50IGV0aF9hZGRyWzZdOworCQl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbXVsdGljYXN0X2xvd1s2XTsKKwkJc3RydWN0IHNnaXNlZXFfd3JlZ3Mgd3JlZ3M7CisJCXN0cnVjdCBzZ2lzZWVxX3JyZWdzIHJyZWdzOworCX0gcnc7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IHJzdGF0OworCXZvbGF0aWxlIHVuc2lnbmVkIGludCB0c3RhdDsKK307CisKKy8qIFNlZXE4MDAzIHJlY2VpdmUgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIFNFRVFfUlNUQVRfT1ZFUkYgICAweDAwMSAvKiBPdmVyZmxvdyAqLworI2RlZmluZSBTRUVRX1JTVEFUX0NFUlJPUiAgMHgwMDIgLyogQ1JDIGVycm9yICovCisjZGVmaW5lIFNFRVFfUlNUQVRfREVSUk9SICAweDAwNCAvKiBEcmliYmxlIGVycm9yICovCisjZGVmaW5lIFNFRVFfUlNUQVRfU0ZSQU1FICAweDAwOCAvKiBTaG9ydCBmcmFtZSAqLworI2RlZmluZSBTRUVRX1JTVEFUX1JFT0YgICAgMHgwMTAgLyogUmVjZWl2ZWQgZW5kIG9mIGZyYW1lICovCisjZGVmaW5lIFNFRVFfUlNUQVRfRklHICAgICAweDAyMCAvKiBGcmFtZSBpcyBnb29kICovCisjZGVmaW5lIFNFRVFfUlNUQVRfVElNRU8gICAweDA0MCAvKiBUaW1lb3V0LCBvciBsYXRlIHJlY2VpdmUgKi8KKyNkZWZpbmUgU0VFUV9SU1RBVF9XSElDSCAgIDB4MDgwIC8qIFdoaWNoIHN0YXR1cywgMT1vbGQgMD1uZXcgKi8KKyNkZWZpbmUgU0VFUV9SU1RBVF9MSVRUTEUgIDB4MTAwIC8qIERNQSBpcyBkb25lIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0ICovCisjZGVmaW5lIFNFRVFfUlNUQVRfU0RNQSAgICAweDIwMCAvKiBETUEgaGFzIHN0YXJ0ZWQgKi8KKyNkZWZpbmUgU0VFUV9SU1RBVF9BRE1BICAgIDB4NDAwIC8qIERNQSBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgU0VFUV9SU1RBVF9ST1ZFUkYgIDB4ODAwIC8qIFJlY2VpdmUgYnVmZmVyIG92ZXJmbG93ICovCisKKy8qIFNlZXE4MDAzIHJlY2VpdmUgY29tbWFuZCByZWdpc3RlciAqLworI2RlZmluZSBTRUVRX1JDTURfUkRJU0FCICAgMHgwMDAgLyogRGlzYWJsZSByZWNlaXZlciBvbiB0aGUgU2VlcTgwMDMgKi8KKyNkZWZpbmUgU0VFUV9SQ01EX0lPVkVSRiAgIDB4MDAxIC8qIElSUSBvbiBidWZmZXIgb3ZlcmZsb3dzICovCisjZGVmaW5lIFNFRVFfUkNNRF9JQ1JDICAgICAweDAwMiAvKiBJUlEgb24gQ1JDIGVycm9ycyAqLworI2RlZmluZSBTRUVRX1JDTURfSURSSUIgICAgMHgwMDQgLyogSVJRIG9uIGRyaWJibGUgZXJyb3JzICovCisjZGVmaW5lIFNFRVFfUkNNRF9JU0hPUlQgICAweDAwOCAvKiBJUlEgb24gc2hvcnQgZnJhbWVzICovCisjZGVmaW5lIFNFRVFfUkNNRF9JRU9GICAgICAweDAxMCAvKiBJUlEgb24gZW5kIG9mIGZyYW1lICovCisjZGVmaW5lIFNFRVFfUkNNRF9JR09PRCAgICAweDAyMCAvKiBJUlEgb24gZ29vZCBmcmFtZXMgKi8KKyNkZWZpbmUgU0VFUV9SQ01EX1JBTlkgICAgIDB4MDQwIC8qIFJlY2VpdmUgYW55IGZyYW1lICovCisjZGVmaW5lIFNFRVFfUkNNRF9SQkNBU1QgICAweDA4MCAvKiBSZWNlaXZlIGJyb2FkY2FzdHMgKi8KKyNkZWZpbmUgU0VFUV9SQ01EX1JCTUNBU1QgIDB4MGMwIC8qIFJlY2VpdmUgYnJvYWRjYXN0cy9tdWx0aWNhc3RzICovCisKKy8qIFNlZXE4MDAzIHRyYW5zbWl0IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBTRUVRX1RTVEFUX1VGTE9XICAgMHgwMDEgLyogVHJhbnNtaXQgYnVmZmVyIHVuZGVyZmxvdyAqLworI2RlZmluZSBTRUVRX1RTVEFUX0NMUyAgICAgMHgwMDIgLyogQ29sbGlzaW9uIGRldGVjdGVkICovCisjZGVmaW5lIFNFRVFfVFNUQVRfUjE2ICAgICAweDAwNCAvKiBEaWQgMTYgcmV0cmllcyB0byB0eCBhIGZyYW1lICovCisjZGVmaW5lIFNFRVFfVFNUQVRfUFRSQU5TICAweDAwOCAvKiBQYWNrZXQgd2FzIHRyYW5zbWl0dGVkIG9rICovCisjZGVmaW5lIFNFRVFfVFNUQVRfTENMUyAgICAweDAxMCAvKiBMYXRlIGNvbGxpc2lvbiBvY2N1cnJlZCAqLworI2RlZmluZSBTRUVRX1RTVEFUX1dISUNIICAgMHgwODAgLyogV2hpY2ggc3RhdHVzLCAxPW9sZCAwPW5ldyAqLworI2RlZmluZSBTRUVRX1RTVEFUX1RMRSAgICAgMHgxMDAgLyogRE1BIGlzIGRvbmUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQgKi8KKyNkZWZpbmUgU0VFUV9UU1RBVF9TRE1BICAgIDB4MjAwIC8qIERNQSBoYXMgc3RhcnRlZCAqLworI2RlZmluZSBTRUVRX1RTVEFUX0FETUEgICAgMHg0MDAgLyogRE1BIGlzIGFjdGl2ZSAqLworCisvKiBTZWVxODAwMyB0cmFuc21pdCBjb21tYW5kIHJlZ2lzdGVyICovCisjZGVmaW5lIFNFRVFfVENNRF9SQjAgICAgICAweDAwIC8qIFJlZ2lzdGVyIGJhbmsgemVybyB3L3N0YXRpb24gYWRkciAqLworI2RlZmluZSBTRUVRX1RDTURfSVVGICAgICAgMHgwMSAvKiBJUlEgb24gdHggdW5kZXJmbG93ICovCisjZGVmaW5lIFNFRVFfVENNRF9JQyAgICAgICAweDAyIC8qIElSUSBvbiBjb2xsaXNpb25zICovCisjZGVmaW5lIFNFRVFfVENNRF9JMTYgICAgICAweDA0IC8qIElSUSBhZnRlciAxNiBmYWlsZWQgYXR0ZW1wdHMgdG8gdHggZnJhbWUgKi8KKyNkZWZpbmUgU0VFUV9UQ01EX0lQVCAgICAgIDB4MDggLyogSVJRIHdoZW4gcGFja2V0IHN1Y2Nlc3NmdWxseSB0cmFuc21pdHRlZCAqLworI2RlZmluZSBTRUVRX1RDTURfUkIxICAgICAgMHgyMCAvKiBSZWdpc3RlciBiYW5rIG9uZSB3L211bHRpLWNhc3QgbG93IGJ5dGUgKi8gCisjZGVmaW5lIFNFRVFfVENNRF9SQjIgICAgICAweDQwIC8qIFJlZ2lzdGVyIGJhbmsgdHdvIHcvbXVsdGktY2FzdCBoaWdoIGJ5dGUgKi8KKworLyogU2VlcTgwMDMgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBTRUVRX0NUUkxfWENOVCAgICAgMHgwMQorI2RlZmluZSBTRUVRX0NUUkxfQUNDTlQgICAgMHgwMgorI2RlZmluZSBTRUVRX0NUUkxfU0ZMQUcgICAgMHgwNAorI2RlZmluZSBTRUVRX0NUUkxfRU1VTFRJICAgMHgwOAorI2RlZmluZSBTRUVRX0NUUkxfRVNIT1JUICAgMHgxMAorI2RlZmluZSBTRUVRX0NUUkxfRU5DQVJSICAgMHgyMAorCisvKiBTZWVxODAwMyBjb250cm9sIHJlZ2lzdGVycyBvbiB0aGUgU0dJIEhvbGx5d29vZCBIUEMuICovCisjZGVmaW5lIFNFRVFfSFBJT19QMUJJVFMgIDB4MDAwMDAwMDEgLyogY3ljbGVzIHRvIHN0YXkgaW4gUDEgcGhhc2UgZm9yIFBJTyAqLworI2RlZmluZSBTRUVRX0hQSU9fUDJCSVRTICAweDAwMDAwMDYwIC8qIGN5Y2xlcyB0byBzdGF5IGluIFAyIHBoYXNlIGZvciBQSU8gKi8KKyNkZWZpbmUgU0VFUV9IUElPX1AzQklUUyAgMHgwMDAwMDEwMCAvKiBjeWNsZXMgdG8gc3RheSBpbiBQMyBwaGFzZSBmb3IgUElPICovCisjZGVmaW5lIFNFRVFfSERNQV9EMUJJVFMgIDB4MDAwMDAwMDYgLyogY3ljbGVzIHRvIHN0YXkgaW4gRDEgcGhhc2UgZm9yIERNQSAqLworI2RlZmluZSBTRUVRX0hETUFfRDJCSVRTICAweDAwMDAwMDIwIC8qIGN5Y2xlcyB0byBzdGF5IGluIEQyIHBoYXNlIGZvciBETUEgKi8KKyNkZWZpbmUgU0VFUV9IRE1BX0QzQklUUyAgMHgwMDAwMDAwMCAvKiBjeWNsZXMgdG8gc3RheSBpbiBEMyBwaGFzZSBmb3IgRE1BICovCisjZGVmaW5lIFNFRVFfSERNQV9USU1FTyAgIDB4MDAwMzAwMDAgLyogY3ljbGVzIGZvciBETUEgdGltZW91dCAqLworI2RlZmluZSBTRUVRX0hDVExfTk9STSAgICAweDAwMDAwMDAwIC8qIE5vcm1hbCBvcGVyYXRpb24gbW9kZSAqLworI2RlZmluZSBTRUVRX0hDVExfUkVTRVQgICAweDAwMDAwMDAxIC8qIFJlc2V0IFNlZXE4MDAzIGFuZCBIUEMgaW50ZXJmYWNlICovCisjZGVmaW5lIFNFRVFfSENUTF9JUEVORCAgIDB4MDAwMDAwMDIgLyogSVJRIGlzIHBlbmRpbmcgZm9yIHRoZSBjaGlwICovCisjZGVmaW5lIFNFRVFfSENUTF9JUEcgICAgIDB4MDAwMDEwMDAgLyogSW50ZXItcGFja2V0IGdhcCAqLworI2RlZmluZSBTRUVRX0hDVExfUkZJWCAgICAweDAwMDAyMDAwIC8qIEF0IHJ4ZGMsIGNsZWFyIGVuZC1vZi1wYWNrZXQgKi8KKyNkZWZpbmUgU0VFUV9IQ1RMX0VGSVggICAgMHgwMDAwNDAwMCAvKiBmaXhlcyBpbnRyIHN0YXR1cyBiaXQgc2V0dGluZ3MgKi8KKyNkZWZpbmUgU0VFUV9IQ1RMX0lGSVggICAgMHgwMDAwODAwMCAvKiBlbmFibGUgc3RhcnR1cCB0aW1lb3V0cyAqLworCisjZW5kaWYgLyogIShfU0dJU0VFUV9IKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2hhcGVyLmMgYi9kcml2ZXJzL25ldC9zaGFwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjhjZjVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2hhcGVyLmMKQEAgLTAsMCArMSw3NTUgQEAKKy8qCisgKgkJCVNpbXBsZSB0cmFmZmljIHNoYXBlciBmb3IgTGludXggTkVUMy4KKyAqCisgKgkoYykgQ29weXJpZ2h0IDE5OTYgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgkJCQlodHRwOi8vd3d3LnJlZGhhdC5jb20KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoJCisgKglOZWl0aGVyIEFsYW4gQ294IG5vciBDeW1ydU5ldCBMdGQuIGFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZSAKKyAqCXdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAKKyAqCSJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4JCisgKgorICoJCisgKglBbGdvcml0aG06CisgKgorICoJUXVldWUgRnJhbWU6CisgKgkJQ29tcHV0ZSB0aW1lIGxlbmd0aCBvZiBmcmFtZSBhdCByZWd1bGF0ZWQgc3BlZWQKKyAqCQlBZGQgZnJhbWUgdG8gcXVldWUgYXQgYXBwcm9wcmlhdGUgcG9pbnQKKyAqCQlBZGp1c3QgdGltZSBsZW5ndGggY29tcHV0YXRpb24gZm9yIGZvbGxvd3VwIGZyYW1lcworICoJCUFueSBmcmFtZSB0aGF0IGZhbGxzIG91dHNpZGUgb2YgaXRzIGJvdW5kYXJpZXMgaXMgZnJlZWQKKyAqCisgKglXZSB3b3JrIHRvIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzCisgKgorICoJCVNIQVBFUl9RTEVOCU1heGltdW0gcXVldWVkIGZyYW1lcworICoJCVNIQVBFUl9MQVRFTkNZCUJvdW5kaW5nIGxhdGVuY3kgb24gYSBmcmFtZS4gTGVhdmluZyB0aGlzIGxhdGVuY3kKKyAqCQkJCXdpbmRvdyBkcm9wcyB0aGUgZnJhbWUuIFRoaXMgc3RvcHMgdXMgcXVldWVpbmcgCisgKgkJCQlmcmFtZXMgZm9yIGEgbG9uZyB0aW1lIGFuZCBjb25mdXNpbmcgYSByZW1vdGUKKyAqCQkJCWhvc3QuCisgKgkJU0hBUEVSX01BWFNMSVAJTWF4aW11bSB0aW1lIGEgcHJpb3JpdHkgZnJhbWUgbWF5IGp1bXAgZm9yd2FyZC4KKyAqCQkJCVRoYXQgYm91bmRzIHRoZSBwZW5hbHR5IHdlIHdpbGwgaW5mbGljdCBvbiBsb3cKKyAqCQkJCXByaW9yaXR5IHRyYWZmaWMuCisgKgkJU0hBUEVSX0JVUlNUCVRpbWUgcmFuZ2Ugd2UgY2FsbCAibm93IiBpbiBvcmRlciB0byByZWR1Y2UKKyAqCQkJCXN5c3RlbSBsb2FkLiBUaGUgbW9yZSB3ZSBtYWtlIHRoaXMgdGhlIGJ1cnN0aWVyCisgKgkJCQl0aGUgYmVoYXZpb3VyLCB0aGUgYmV0dGVyIGxvY2FsIHBlcmZvcm1hbmNlIHlvdQorICoJCQkJZ2V0IHRocm91Z2ggcGFja2V0IGNsdXN0ZXJpbmcgb24gcm91dGVycyBhbmQgdGhlCisgKgkJCQl3b3JzZSB0aGUgcmVtb3RlIGVuZCBnZXRzIHRvIGp1ZGdlIHJ0dHMuCisgKgorICoJVGhpcyBpcyBkZXNpZ25lZCB0byBoYW5kbGUgbG93ZXIgc3BlZWQgbGlua3MgKCA8IDIwMEsvc2Vjb25kIG9yIHNvKS4gV2UKKyAqCXJ1biBvZmYgYSAxMDAtMTUwSHogYmFzZSBjbG9jayB0eXBpY2FsbHkuIFRoaXMgZ2l2ZXMgdXMgYSByZXNvbHV0aW9uIGF0CisgKgkyMDBLYml0L3NlY29uZCBvZiBhYm91dCAyS2JpdCBvciAyNTYgYnl0ZXMuIEFib3ZlIHRoYXQgb3VyIHRpbWVyCisgKglyZXNvbHV0aW9uIG1heSBzdGFydCB0byBjYXVzZSBtdWNoIG1vcmUgYnVyc3RpbmVzcyBpbiB0aGUgdHJhZmZpYy4gV2UKKyAqCWNvdWxkIGF2b2lkIGEgbG90IG9mIHRoYXQgYnkgY2FsbGluZyBraWNrX3NoYXBlcigpIGF0IHRoZSBlbmQgb2YgdGhlIAorICoJdGllZCBkZXZpY2UgdHJhbnNtaXNzaW9ucy4gSWYgeW91IHJ1biBhYm92ZSBhYm91dCAxMDBLIHNlY29uZCB5b3UgCisgKgltYXkgbmVlZCB0byB0dW5lIHRoZSBzdXBwb3NlZCBzcGVlZCByYXRlIGZvciB0aGUgcmlnaHQgdmFsdWVzLgorICoKKyAqCUJVR1M6CisgKgkJRG93bmluZyB0aGUgaW50ZXJmYWNlIHVuZGVyIHRoZSBzaGFwZXIgYmVmb3JlIHRoZSBzaGFwZXIKKyAqCQl3aWxsIHJlbmRlciB5b3VyIG1hY2hpbmUgZGVmdW5jdC4gRG9uJ3QgZm9yIG5vdyBzaGFwZSBvdmVyCisgKgkJUFBQIG9yIFNMSVAgdGhlcmVmb3JlIQorICoJCVRoaXMgd2lsbCBiZSBmaXhlZCBpbiBCRVRBNAorICoKKyAqIFVwZGF0ZSBIaXN0b3J5IDoKKyAqCisgKiAgICAgICAgICAgICAgYmhfYXRvbWljKCkgU01QIHJhY2VzIGZpeGVzIGFuZCByZXdyaXR0ZW4gdGhlIGxvY2tpbmcgY29kZSB0bworICogICAgICAgICAgICAgIGJlIFNNUCBzYWZlIGFuZCBpcnEtbWFzayBmcmllbmRseS4KKyAqICAgICAgICAgICAgICBOT1RFOiB3ZSBjYW4ndCB1c2Ugc3RhcnRfYmhfYXRvbWljKCkgaW4ga2lja19zaGFwZXIoKQorICogICAgICAgICAgICAgIGJlY2F1c2UgaXQncyBnb2luZyB0byBiZSByZWNhbGxlZCBmcm9tIGFuIGlycSBoYW5kbGVyLAorICogICAgICAgICAgICAgIGFuZCBzeW5jaHJvbml6ZV9iaCgpIGlzIGEgbm9ubyBpZiBjYWxsZWQgZnJvbSBpcnEgY29udGV4dC4KKyAqCQkJCQkJMTk5OSAgQW5kcmVhIEFyY2FuZ2VsaQorICoKKyAqICAgICAgICAgICAgICBEZXZpY2Ugc3RhdGlzdGljcyAodHhfcGFrZXRzLCB0eF9ieXRlcywKKyAqICAgICAgICAgICAgICB0eF9kcm9wczogcXVldWVfb3Zlcl90aW1lIGFuZCBjb2xsaXNpb25zOiBtYXhfcXVldWVfZXhjZWRlZCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5OTkvMDYvMTggSm9yZGkgTXVyZ28gPHNhdmFnZUBhcG9zdG9scy5vcmc+CisgKgorICoJCVVzZSBza2ItPmNiIGZvciBwcml2YXRlIGRhdGEuCisgKgkJCQkgMjAwMC8wMyBBbmRpIEtsZWVuCisgKi8KKyAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfc2hhcGVyLmg+CisKKyNpbmNsdWRlIDxuZXQvZHN0Lmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorCitzdHJ1Y3Qgc2hhcGVyX2NiIHsgCisJdW5zaWduZWQgbG9uZwlzaGFwZWNsb2NrOwkJLyogVGltZSBpdCBzaG91bGQgZ28gb3V0ICovCisJdW5zaWduZWQgbG9uZwlzaGFwZXN0YW1wOwkJLyogU3RhbXAgZm9yIHNoYXBlciAgICAqLworCV9fdTMyCQlzaGFwZWxhdGVuY3k7CQkvKiBMYXRlbmN5IG9uIGZyYW1lICovCisJX191MzIJCXNoYXBlbGVuOwkJLyogRnJhbWUgbGVuZ3RoIGluIGNsb2NrcyAqLworCV9fdTE2CQlzaGFwZXBlbmQ7CQkvKiBQZW5kaW5nICovCit9OyAKKyNkZWZpbmUgU0hBUEVSQ0Ioc2tiKSAoKHN0cnVjdCBzaGFwZXJfY2IgKikgKChza2IpLT5jYikpCisKK3N0YXRpYyBpbnQgc2hfZGVidWc7CQkvKiBEZWJ1ZyBmbGFnICovCisKKyNkZWZpbmUgU0hBUEVSX0JBTk5FUgkiQ3ltcnVOZXQgVHJhZmZpYyBTaGFwZXIgQkVUQSAwLjA0IGZvciBMaW51eCAyLjFcbiIKKworLyoKKyAqCUxvY2tpbmcKKyAqLworIAorc3RhdGljIGludCBzaGFwZXJfbG9jayhzdHJ1Y3Qgc2hhcGVyICpzaCkKK3sKKwkvKgorCSAqCUxvY2sgaW4gYW4gaW50ZXJydXB0IG11c3QgZmFpbAorCSAqLworCXdoaWxlICh0ZXN0X2FuZF9zZXRfYml0KDAsICZzaC0+bG9ja2VkKSkKKwl7CisJCWlmICghaW5faW50ZXJydXB0KCkpCisJCQlzbGVlcF9vbigmc2gtPndhaXRfcXVldWUpOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwkJCQorCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgc2hhcGVyX2tpY2soc3RydWN0IHNoYXBlciAqc2gpOworCitzdGF0aWMgdm9pZCBzaGFwZXJfdW5sb2NrKHN0cnVjdCBzaGFwZXIgKnNoKQoreworCWNsZWFyX2JpdCgwLCAmc2gtPmxvY2tlZCk7CisJd2FrZV91cCgmc2gtPndhaXRfcXVldWUpOworCXNoYXBlcl9raWNrKHNoKTsKK30KKworLyoKKyAqCUNvbXB1dGUgY2xvY2tzIG9uIGEgYnVmZmVyCisgKi8KKyAgCitzdGF0aWMgaW50IHNoYXBlcl9jbG9ja3Moc3RydWN0IHNoYXBlciAqc2hhcGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworIAlpbnQgdD1za2ItPmxlbi9zaGFwZXItPmJ5dGVzcGVydGljazsKKyAJcmV0dXJuIHQ7Cit9CisKKy8qCisgKglTZXQgdGhlIHNwZWVkIG9mIGEgc2hhcGVyLiBXZSBjb21wdXRlIHRoaXMgaW4gYnl0ZXMgcGVyIHRpY2sgc2luY2UKKyAqCXRoYXRzIGhvdyB0aGUgbWFjaGluZSB3YW50cyB0byBydW4uIFF1b3RlZCBpbnB1dCBpcyBpbiBiaXRzIHBlciBzZWNvbmQKKyAqCWFzIGlzIHRyYWRpdGlvbmFsIChub3RlIG5vdCBCQVVEKS4gV2UgYXNzdW1lIDggYml0IGJ5dGVzLiAKKyAqLworICAKK3N0YXRpYyB2b2lkIHNoYXBlcl9zZXRzcGVlZChzdHJ1Y3Qgc2hhcGVyICpzaGFwZXIsIGludCBiaXRzcGVyc2VjKQoreworCXNoYXBlci0+Yml0c3BlcnNlYz1iaXRzcGVyc2VjOworCXNoYXBlci0+Ynl0ZXNwZXJ0aWNrPShiaXRzcGVyc2VjL0haKS84OworCWlmKCFzaGFwZXItPmJ5dGVzcGVydGljaykKKwkJc2hhcGVyLT5ieXRlc3BlcnRpY2srKzsKK30KKworLyoKKyAqCVRocm93IGEgZnJhbWUgYXQgYSBzaGFwZXIuCisgKi8KKyAgCitzdGF0aWMgaW50IHNoYXBlcl9xZnJhbWUoc3RydWN0IHNoYXBlciAqc2hhcGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworIAlzdHJ1Y3Qgc2tfYnVmZiAqcHRyOworICAgCisgCS8qCisgCSAqCUdldCByZWFkeSB0byB3b3JrIG9uIHRoaXMgc2hhcGVyLiBMb2NrIG1heSBmYWlsIGlmIGl0cworIAkgKglhbiBpbnRlcnJ1cHQgYW5kIGxvY2tlZC4KKyAJICovCisgCSAKKyAJaWYoIXNoYXBlcl9sb2NrKHNoYXBlcikpCisgCQlyZXR1cm4gLTE7CisgCXB0cj1zaGFwZXItPnNlbmRxLnByZXY7CisgCQorIAkvKgorIAkgKglTZXQgdXAgb3VyIHBhY2tldCBkZXRhaWxzCisgCSAqLworIAkgCisgCVNIQVBFUkNCKHNrYiktPnNoYXBlbGF0ZW5jeT0wOworIAlTSEFQRVJDQihza2IpLT5zaGFwZWNsb2NrPXNoYXBlci0+cmVjb3Zlcnk7CisgCWlmKHRpbWVfYmVmb3JlKFNIQVBFUkNCKHNrYiktPnNoYXBlY2xvY2ssIGppZmZpZXMpKQorIAkJU0hBUEVSQ0Ioc2tiKS0+c2hhcGVjbG9jaz1qaWZmaWVzOworIAlza2ItPnByaW9yaXR5PTA7CS8qIHNob3J0IHRlcm0gYnVnIGZpeCAqLworIAlTSEFQRVJDQihza2IpLT5zaGFwZXN0YW1wPWppZmZpZXM7CisgCQorIAkvKgorIAkgKglUaW1lIHNsb3RzIGZvciB0aGlzIHBhY2tldC4KKyAJICovCisgCSAKKyAJU0hBUEVSQ0Ioc2tiKS0+c2hhcGVsZW49IHNoYXBlcl9jbG9ja3Moc2hhcGVyLHNrYik7CisgCQorI2lmZGVmIFNIQVBFUl9DT01QTEVYIC8qIGFuZCBicm9rZW4uLiAqLworCisgCXdoaWxlKHB0ciAmJiBwdHIhPShzdHJ1Y3Qgc2tfYnVmZiAqKSZzaGFwZXItPnNlbmRxKQorIAl7CisgCQlpZihwdHItPnByaTxza2ItPnByaSAKKyAJCQkmJiBqaWZmaWVzIC0gU0hBUEVSQ0IocHRyKS0+c2hhcGVjbG9jayA8IFNIQVBFUl9NQVhTTElQKQorIAkJeworIAkJCXN0cnVjdCBza19idWZmICp0bXA9cHRyLT5wcmV2OworCisgCQkJLyoKKyAJCQkgKglJdCBnb2VzIGJlZm9yZSB1cyB0aGVyZWZvcmUgd2Ugc2xpcCB0aGUgbGVuZ3RoCisgCQkJICoJb2YgdGhlIG5ldyBmcmFtZS4KKyAJCQkgKi8KKworIAkJCVNIQVBFUkNCKHB0ciktPnNoYXBlY2xvY2srPVNIQVBFUkNCKHNrYiktPnNoYXBlbGVuOworIAkJCVNIQVBFUkNCKHB0ciktPnNoYXBlbGF0ZW5jeSs9U0hBUEVSQ0Ioc2tiKS0+c2hhcGVsZW47CisKKyAJCQkvKgorIAkJCSAqCVRoZSBwYWNrZXQgbWF5IGhhdmUgc2xpcHBlZCBzbyBmYXIgYmFjayBpdAorIAkJCSAqCWZlbGwgb2ZmLgorIAkJCSAqLworIAkJCWlmKFNIQVBFUkNCKHB0ciktPnNoYXBlbGF0ZW5jeSA+IFNIQVBFUl9MQVRFTkNZKQorIAkJCXsKKyAJCQkJc2tiX3VubGluayhwdHIpOworIAkJCQlkZXZfa2ZyZWVfc2tiKHB0cik7CisgCQkJfQorIAkJCXB0cj10bXA7CisgCQl9CisgCQllbHNlCisgCQkJYnJlYWs7CisgCX0KKyAJaWYocHRyPT1OVUxMIHx8IHB0cj09KHN0cnVjdCBza19idWZmICopJnNoYXBlci0+c2VuZHEpCisgCQlza2JfcXVldWVfaGVhZCgmc2hhcGVyLT5zZW5kcSxza2IpOworIAllbHNlCisgCXsKKyAJCXN0cnVjdCBza19idWZmICp0bXA7CisgCQkvKgorIAkJICoJU2V0IHRoZSBwYWNrZXQgY2xvY2sgb3V0IHRpbWUgYWNjb3JkaW5nIHRvIHRoZQorIAkJICoJZnJhbWVzIGFoZWFkLiBJbSBzdXJlIGEgYml0IG9mIHRob3VnaHQgY291bGQgZHJvcAorIAkJICoJdGhpcyBsb29wLgorIAkJICovCisgCQlmb3IodG1wPXNrYl9wZWVrKCZzaGFwZXItPnNlbmRxKTsgdG1wIT1OVUxMICYmIHRtcCE9cHRyOyB0bXA9dG1wLT5uZXh0KQorIAkJCVNIQVBFUkNCKHNrYiktPnNoYXBlY2xvY2srPXRtcC0+c2hhcGVsZW47CisgCQlza2JfYXBwZW5kKHB0cixza2IpOworIAl9CisjZWxzZQorCXsKKwkJc3RydWN0IHNrX2J1ZmYgKnRtcDsKKwkJLyoKKwkJICoJVXAgb3VyIHNoYXBlIGNsb2NrIGJ5IHRoZSB0aW1lIHBlbmRpbmcgb24gdGhlIHF1ZXVlCisJCSAqCShTaG91bGQga2VlcCB0aGlzIGluIHRoZSBzaGFwZXIgYXMgYSB2YXJpYWJsZS4uKQorCQkgKi8KKwkJZm9yKHRtcD1za2JfcGVlaygmc2hhcGVyLT5zZW5kcSk7IHRtcCE9TlVMTCAmJiAKKwkJCXRtcCE9KHN0cnVjdCBza19idWZmICopJnNoYXBlci0+c2VuZHE7IHRtcD10bXAtPm5leHQpCisJCQlTSEFQRVJDQihza2IpLT5zaGFwZWNsb2NrKz1TSEFQRVJDQih0bXApLT5zaGFwZWxlbjsKKwkJLyoKKwkJICoJUXVldWUgb3ZlciB0aW1lLiBTcGlsbCBwYWNrZXQuCisJCSAqLworCQlpZihTSEFQRVJDQihza2IpLT5zaGFwZWNsb2NrLWppZmZpZXMgPiBTSEFQRVJfTEFURU5DWSkgeworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJc2hhcGVyLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCX0gZWxzZQorCQkJc2tiX3F1ZXVlX3RhaWwoJnNoYXBlci0+c2VuZHEsIHNrYik7CisJfQorI2VuZGlmIAkKKwlpZihzaF9kZWJ1ZykKKyAJCXByaW50aygiRnJhbWUgcXVldWVkLlxuIik7CisgCWlmKHNrYl9xdWV1ZV9sZW4oJnNoYXBlci0+c2VuZHEpPlNIQVBFUl9RTEVOKQorIAl7CisgCQlwdHI9c2tiX2RlcXVldWUoJnNoYXBlci0+c2VuZHEpOworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2IocHRyKTsKKyAgICAgICAgICAgICAgICBzaGFwZXItPnN0YXRzLmNvbGxpc2lvbnMrKzsKKyAJfQorIAlzaGFwZXJfdW5sb2NrKHNoYXBlcik7CisgCXJldHVybiAwOworfQorCisvKgorICoJVHJhbnNtaXQgZnJvbSBhIHNoYXBlcgorICovCisgCitzdGF0aWMgdm9pZCBzaGFwZXJfcXVldWVfeG1pdChzdHJ1Y3Qgc2hhcGVyICpzaGFwZXIsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKm5ld3NrYj1za2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwlpZihzaF9kZWJ1ZykKKwkJcHJpbnRrKCJLaWNrIGZyYW1lIG9uICVwXG4iLG5ld3NrYik7CisJaWYobmV3c2tiKQorCXsKKwkJbmV3c2tiLT5kZXY9c2hhcGVyLT5kZXY7CisJCW5ld3NrYi0+cHJpb3JpdHk9MjsKKwkJaWYoc2hfZGVidWcpCisJCQlwcmludGsoIktpY2sgbmV3IGZyYW1lIHRvICVzLCAlZFxuIiwKKwkJCQlzaGFwZXItPmRldi0+bmFtZSxuZXdza2ItPnByaW9yaXR5KTsKKwkJZGV2X3F1ZXVlX3htaXQobmV3c2tiKTsKKworICAgICAgICAgICAgICAgIHNoYXBlci0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCXNoYXBlci0+c3RhdHMudHhfcGFja2V0cysrOworCisgICAgICAgICAgICAgICAgaWYoc2hfZGVidWcpCisJCQlwcmludGsoIktpY2tlZCBuZXcgZnJhbWUgb3V0LlxuIik7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9Cit9CisKKy8qCisgKglUaW1lciBoYW5kbGVyIGZvciBzaGFwaW5nIGNsb2NrCisgKi8KKyAKK3N0YXRpYyB2b2lkIHNoYXBlcl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHNoYXBlciAqc2g9KHN0cnVjdCBzaGFwZXIgKilkYXRhOworCXNoYXBlcl9raWNrKHNoKTsKK30KKworLyoKKyAqCUtpY2sgYSBzaGFwZXIgcXVldWUgYW5kIHRyeSBhbmQgZG8gc29tZXRoaW5nIHNlbnNpYmxlIHdpdGggdGhlIAorICoJcXVldWUuIAorICovCisKK3N0YXRpYyB2b2lkIHNoYXBlcl9raWNrKHN0cnVjdCBzaGFwZXIgKnNoYXBlcikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQorCS8qCisJICoJU2hhcGVyIHVubG9jayB3aWxsIGtpY2sKKwkgKi8KKwkgCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJnNoYXBlci0+bG9ja2VkKSkKKwl7CisJCWlmKHNoX2RlYnVnKQorCQkJcHJpbnRrKCJTaGFwZXIgbG9ja2VkLlxuIik7CisJCW1vZF90aW1lcigmc2hhcGVyLT50aW1lciwgamlmZmllcyk7CisJCXJldHVybjsKKwl9CisKKwkJCisJLyoKKwkgKglXYWxrIHRoZSBsaXN0IChtYXkgYmUgZW1wdHkpCisJICovCisJIAorCXdoaWxlKChza2I9c2tiX3BlZWsoJnNoYXBlci0+c2VuZHEpKSE9TlVMTCkKKwl7CisJCS8qCisJCSAqCUVhY2ggcGFja2V0IGR1ZSB0byBnbyBvdXQgYnkgbm93ICh3aXRoaW4gYW4gZXJyb3IKKwkJICoJb2YgU0hBUEVSX0JVUlNUKSBnZXRzIGtpY2tlZCBvbnRvIHRoZSBsaW5rIAorCQkgKi8KKwkJIAorCQlpZihzaF9kZWJ1ZykKKwkJCXByaW50aygiQ2xvY2sgPSAlbGQsIGppZmZpZXMgPSAlbGRcbiIsIFNIQVBFUkNCKHNrYiktPnNoYXBlY2xvY2ssIGppZmZpZXMpOworCQlpZih0aW1lX2JlZm9yZV9lcShTSEFQRVJDQihza2IpLT5zaGFwZWNsb2NrLCBqaWZmaWVzICsgU0hBUEVSX0JVUlNUKSkKKwkJeworCQkJLyoKKwkJCSAqCVB1bGwgdGhlIGZyYW1lIGFuZCBnZXQgaW50ZXJydXB0cyBiYWNrIG9uLgorCQkJICovCisJCQkgCisJCQlza2JfdW5saW5rKHNrYik7CisJCQlpZiAoc2hhcGVyLT5yZWNvdmVyeSA8IAorCQkJICAgIFNIQVBFUkNCKHNrYiktPnNoYXBlY2xvY2sgKyBTSEFQRVJDQihza2IpLT5zaGFwZWxlbikKKwkJCQlzaGFwZXItPnJlY292ZXJ5ID0gU0hBUEVSQ0Ioc2tiKS0+c2hhcGVjbG9jayArIFNIQVBFUkNCKHNrYiktPnNoYXBlbGVuOworCQkJLyoKKwkJCSAqCVBhc3Mgb24gdG8gdGhlIHBoeXNpY2FsIHRhcmdldCBkZXZpY2UgdmlhCisJCQkgKglvdXIgbG93IGxldmVsIHBhY2tldCB0aHJvd2VyLgorCQkJICovCisJCQkKKwkJCVNIQVBFUkNCKHNrYiktPnNoYXBlcGVuZD0wOworCQkJc2hhcGVyX3F1ZXVlX3htaXQoc2hhcGVyLCBza2IpOwkvKiBGaXJlICovCisJCX0KKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCisJLyoKKwkgKglOZXh0IGtpY2suCisJICovCisJIAorCWlmKHNrYiE9TlVMTCkKKwkJbW9kX3RpbWVyKCZzaGFwZXItPnRpbWVyLCBTSEFQRVJDQihza2IpLT5zaGFwZWNsb2NrKTsKKworCWNsZWFyX2JpdCgwLCAmc2hhcGVyLT5sb2NrZWQpOworfQorCisKKy8qCisgKglGbHVzaCB0aGUgc2hhcGVyIHF1ZXVlcyBvbiBhIGNsb3NlZG93bgorICovCisgCitzdGF0aWMgdm9pZCBzaGFwZXJfZmx1c2goc3RydWN0IHNoYXBlciAqc2hhcGVyKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisgCWlmKCFzaGFwZXJfbG9jayhzaGFwZXIpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJzaGFwZXI6IHNoYXBlcl9mbHVzaCgpIGNhbGxlZCBieSBhbiBpcnEhXG4iKTsKKyAJCXJldHVybjsKKwl9CisJd2hpbGUoKHNrYj1za2JfZGVxdWV1ZSgmc2hhcGVyLT5zZW5kcSkpIT1OVUxMKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJc2hhcGVyX3VubG9jayhzaGFwZXIpOworfQorCisvKgorICoJQnJpbmcgdGhlIGludGVyZmFjZSB1cC4gV2UganVzdCBkaXNhbGxvdyB0aGlzIHVudGlsIGEgCisgKgliaW5kLgorICovCisKK3N0YXRpYyBpbnQgc2hhcGVyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2hhcGVyICpzaGFwZXI9ZGV2LT5wcml2OworCQorCS8qCisJICoJQ2FuJ3Qgb3BlbiB1bnRpbCBhdHRhY2hlZC4KKwkgKglBbHNvIGNhbid0IG9wZW4gdW50aWwgc3BlZWQgaXMgc2V0LCBvciB3ZSdsbCBnZXQKKwkgKglhIGRpdmlzaW9uIGJ5IHplcm8uCisJICovCisJIAorCWlmKHNoYXBlci0+ZGV2PT1OVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZihzaGFwZXItPmJpdHNwZXJzZWM9PTApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCisvKgorICoJQ2xvc2luZyBhIHNoYXBlciBmbHVzaGVzIHRoZSBxdWV1ZXMuCisgKi8KKyAKK3N0YXRpYyBpbnQgc2hhcGVyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNoYXBlciAqc2hhcGVyPWRldi0+cHJpdjsKKwlzaGFwZXJfZmx1c2goc2hhcGVyKTsKKwlkZWxfdGltZXJfc3luYygmc2hhcGVyLT50aW1lcik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglSZXZlY3RvcmVkIGNhbGxzLiBXZSBhbHRlciB0aGUgcGFyYW1ldGVycyBhbmQgY2FsbCB0aGUgZnVuY3Rpb25zCisgKglmb3Igb3VyIGF0dGFjaGVkIGRldmljZS4gVGhpcyBlbmFibGVzIHVzIHRvIGJhbmR3aWR0aCBhbGxvY2F0ZSBhZnRlcgorICoJQVJQIGFuZCBvdGhlciByZXNvbHV0aW9ucyBhbmQgbm90IGJlZm9yZS4KKyAqLworCisKK3N0YXRpYyBpbnQgc2hhcGVyX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2hhcGVyICpzaD1kZXYtPnByaXY7CisJcmV0dXJuIHNoYXBlcl9xZnJhbWUoc2gsIHNrYik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2hhcGVyX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAJc3RydWN0IHNoYXBlciAqc2g9ZGV2LT5wcml2OworCXJldHVybiAmc2gtPnN0YXRzOworfQorCitzdGF0aWMgaW50IHNoYXBlcl9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCisJdW5zaWduZWQgc2hvcnQgdHlwZSwgdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pCit7CisJc3RydWN0IHNoYXBlciAqc2g9ZGV2LT5wcml2OworCWludCB2OworCWlmKHNoX2RlYnVnKQorCQlwcmludGsoIlNoYXBlciBoZWFkZXJcbiIpOworCXNrYi0+ZGV2PXNoLT5kZXY7CisJdj1zaC0+aGFyZF9oZWFkZXIoc2tiLHNoLT5kZXYsdHlwZSxkYWRkcixzYWRkcixsZW4pOworCXNrYi0+ZGV2PWRldjsKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIGludCBzaGFwZXJfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc2hhcGVyICpzaD1za2ItPmRldi0+cHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2PXNrYi0+ZGV2OworCWludCB2OworCWlmKHNoX2RlYnVnKQorCQlwcmludGsoIlNoYXBlciByZWJ1aWxkIGhlYWRlclxuIik7CisJc2tiLT5kZXY9c2gtPmRldjsKKwl2PXNoLT5yZWJ1aWxkX2hlYWRlcihza2IpOworCXNrYi0+ZGV2PWRldjsKKwlyZXR1cm4gdjsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgc2hhcGVyX2NhY2hlKHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3QgaGhfY2FjaGUgKmhoKQoreworCXN0cnVjdCBzaGFwZXIgKnNoPW5laWdoLT5kZXYtPnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKnRtcDsKKwlpbnQgcmV0OworCWlmKHNoX2RlYnVnKQorCQlwcmludGsoIlNoYXBlciBoZWFkZXIgY2FjaGUgYmluZFxuIik7CisJdG1wPW5laWdoLT5kZXY7CisJbmVpZ2gtPmRldj1zaC0+ZGV2OworCXJldD1zaC0+aGFyZF9oZWFkZXJfY2FjaGUobmVpZ2gsaGgpOworCW5laWdoLT5kZXY9dG1wOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNoYXBlcl9jYWNoZV91cGRhdGUoc3RydWN0IGhoX2NhY2hlICpoaCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1bnNpZ25lZCBjaGFyICpoYWRkcikKK3sKKwlzdHJ1Y3Qgc2hhcGVyICpzaD1kZXYtPnByaXY7CisJaWYoc2hfZGVidWcpCisJCXByaW50aygiU2hhcGVyIGNhY2hlIHVwZGF0ZVxuIik7CisJc2gtPmhlYWRlcl9jYWNoZV91cGRhdGUoaGgsIHNoLT5kZXYsIGhhZGRyKTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0lORVQKKworc3RhdGljIGludCBzaGFwZXJfbmVpZ2hfc2V0dXAoc3RydWN0IG5laWdoYm91ciAqbikKK3sKKyNpZmRlZiBDT05GSUdfSU5FVAorCWlmIChuLT5udWRfc3RhdGUgPT0gTlVEX05PTkUpIHsKKwkJbi0+b3BzID0gJmFycF9icm9rZW5fb3BzOworCQluLT5vdXRwdXQgPSBuLT5vcHMtPm91dHB1dDsKKwl9CisjZW5kaWYJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hhcGVyX25laWdoX3NldHVwX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmVpZ2hfcGFybXMgKnApCit7CisjaWZkZWYgQ09ORklHX0lORVQKKwlpZiAocC0+dGJsLT5mYW1pbHkgPT0gQUZfSU5FVCkgeworCQlwLT5uZWlnaF9zZXR1cCA9IHNoYXBlcl9uZWlnaF9zZXR1cDsKKwkJcC0+dWNhc3RfcHJvYmVzID0gMDsKKwkJcC0+bWNhc3RfcHJvYmVzID0gMDsKKwl9CisjZW5kaWYJCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlIC8qICEoQ09ORklHX0lORVQpICovCisKK3N0YXRpYyBpbnQgc2hhcGVyX25laWdoX3NldHVwX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmVpZ2hfcGFybXMgKnApCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgaW50IHNoYXBlcl9hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKnNoZGV2LCBzdHJ1Y3Qgc2hhcGVyICpzaCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzaC0+ZGV2ID0gZGV2OworCXNoLT5oYXJkX3N0YXJ0X3htaXQ9ZGV2LT5oYXJkX3N0YXJ0X3htaXQ7CisJc2gtPmdldF9zdGF0cz1kZXYtPmdldF9zdGF0czsKKwlpZihkZXYtPmhhcmRfaGVhZGVyKQorCXsKKwkJc2gtPmhhcmRfaGVhZGVyPWRldi0+aGFyZF9oZWFkZXI7CisJCXNoZGV2LT5oYXJkX2hlYWRlciA9IHNoYXBlcl9oZWFkZXI7CisJfQorCWVsc2UKKwkJc2hkZXYtPmhhcmRfaGVhZGVyID0gTlVMTDsKKwkJCisJaWYoZGV2LT5yZWJ1aWxkX2hlYWRlcikKKwl7CisJCXNoLT5yZWJ1aWxkX2hlYWRlcgk9IGRldi0+cmVidWlsZF9oZWFkZXI7CisJCXNoZGV2LT5yZWJ1aWxkX2hlYWRlcgk9IHNoYXBlcl9yZWJ1aWxkX2hlYWRlcjsKKwl9CisJZWxzZQorCQlzaGRldi0+cmVidWlsZF9oZWFkZXIJPSBOVUxMOworCQorI2lmIDAKKwlpZihkZXYtPmhhcmRfaGVhZGVyX2NhY2hlKQorCXsKKwkJc2gtPmhhcmRfaGVhZGVyX2NhY2hlCT0gZGV2LT5oYXJkX2hlYWRlcl9jYWNoZTsKKwkJc2hkZXYtPmhhcmRfaGVhZGVyX2NhY2hlPSBzaGFwZXJfY2FjaGU7CisJfQorCWVsc2UKKwl7CisJCXNoZGV2LT5oYXJkX2hlYWRlcl9jYWNoZT0gTlVMTDsKKwl9CisJCQkKKwlpZihkZXYtPmhlYWRlcl9jYWNoZV91cGRhdGUpCisJeworCQlzaC0+aGVhZGVyX2NhY2hlX3VwZGF0ZQk9IGRldi0+aGVhZGVyX2NhY2hlX3VwZGF0ZTsKKwkJc2hkZXYtPmhlYWRlcl9jYWNoZV91cGRhdGUgPSBzaGFwZXJfY2FjaGVfdXBkYXRlOworCX0KKwllbHNlCisJCXNoZGV2LT5oZWFkZXJfY2FjaGVfdXBkYXRlPSBOVUxMOworI2Vsc2UKKwlzaGRldi0+aGVhZGVyX2NhY2hlX3VwZGF0ZSA9IE5VTEw7CisJc2hkZXYtPmhhcmRfaGVhZGVyX2NhY2hlID0gTlVMTDsKKyNlbmRpZgorCXNoZGV2LT5uZWlnaF9zZXR1cCA9IHNoYXBlcl9uZWlnaF9zZXR1cF9kZXY7CisJCisJc2hkZXYtPmhhcmRfaGVhZGVyX2xlbj1kZXYtPmhhcmRfaGVhZGVyX2xlbjsKKwlzaGRldi0+dHlwZT1kZXYtPnR5cGU7CisJc2hkZXYtPmFkZHJfbGVuPWRldi0+YWRkcl9sZW47CisJc2hkZXYtPm10dT1kZXYtPm10dTsKKwlzaC0+Yml0c3BlcnNlYz0wOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNoYXBlcl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCAgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IHNoYXBlcmNvbmYgKnNzPSAoc3RydWN0IHNoYXBlcmNvbmYgKikmaWZyLT5pZnJfaWZydTsKKwlzdHJ1Y3Qgc2hhcGVyICpzaD1kZXYtPnByaXY7CisJCisJaWYoc3MtPnNzX2NtZCA9PSBTSEFQRVJfU0VUX0RFViB8fCBzcy0+c3NfY21kID09IFNIQVBFUl9TRVRfU1BFRUQpCisJeworCQlpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJfQorCQorCXN3aXRjaChzcy0+c3NfY21kKQorCXsKKwkJY2FzZSBTSEFQRVJfU0VUX0RFVjoKKwkJeworCQkJc3RydWN0IG5ldF9kZXZpY2UgKnRoZW09X19kZXZfZ2V0X2J5X25hbWUoc3MtPnNzX25hbWUpOworCQkJaWYodGhlbT09TlVMTCkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCWlmKHNoLT5kZXYpCisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCXJldHVybiBzaGFwZXJfYXR0YWNoKGRldixkZXYtPnByaXYsIHRoZW0pOworCQl9CisJCWNhc2UgU0hBUEVSX0dFVF9ERVY6CisJCQlpZihzaC0+ZGV2PT1OVUxMKQorCQkJCXJldHVybiAtRU5PREVWOworCQkJc3RyY3B5KHNzLT5zc19uYW1lLCBzaC0+ZGV2LT5uYW1lKTsKKwkJCXJldHVybiAwOworCQljYXNlIFNIQVBFUl9TRVRfU1BFRUQ6CisJCQlzaGFwZXJfc2V0c3BlZWQoc2gsc3MtPnNzX3NwZWVkKTsKKwkJCXJldHVybiAwOworCQljYXNlIFNIQVBFUl9HRVRfU1BFRUQ6CisJCQlzcy0+c3Nfc3BlZWQ9c2gtPmJpdHNwZXJzZWM7CisJCQlyZXR1cm4gMDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIHZvaWQgc2hhcGVyX2luaXRfcHJpdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzaGFwZXIgKnNoID0gZGV2LT5wcml2OworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2gtPnNlbmRxKTsKKwlpbml0X3RpbWVyKCZzaC0+dGltZXIpOworCXNoLT50aW1lci5mdW5jdGlvbj1zaGFwZXJfdGltZXI7CisJc2gtPnRpbWVyLmRhdGE9KHVuc2lnbmVkIGxvbmcpc2g7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmc2gtPndhaXRfcXVldWUpOworfQorCisvKgorICoJQWRkIGEgc2hhcGVyIGRldmljZSB0byB0aGUgc3lzdGVtCisgKi8KKyAKK3N0YXRpYyB2b2lkIF9faW5pdCBzaGFwZXJfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKgorCSAqCVNldCB1cCB0aGUgc2hhcGVyLgorCSAqLworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJc2hhcGVyX2luaXRfcHJpdihkZXYpOworCisJZGV2LT5vcGVuCQk9IHNoYXBlcl9vcGVuOworCWRldi0+c3RvcAkJPSBzaGFwZXJfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgCT0gc2hhcGVyX3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgCQk9IHNoYXBlcl9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBOVUxMOworCQorCS8qCisJICoJSW50aWFsaXNlIHRoZSBwYWNrZXQgcXVldWVzCisJICovCisJIAorCS8qCisJICoJSGFuZGxlcnMgZm9yIHdoZW4gd2UgYXR0YWNoIHRvIGEgZGV2aWNlLgorCSAqLworCisJZGV2LT5oYXJkX2hlYWRlciAJPSBzaGFwZXJfaGVhZGVyOworCWRldi0+cmVidWlsZF9oZWFkZXIgCT0gc2hhcGVyX3JlYnVpbGRfaGVhZGVyOworI2lmIDAKKwlkZXYtPmhhcmRfaGVhZGVyX2NhY2hlCT0gc2hhcGVyX2NhY2hlOworCWRldi0+aGVhZGVyX2NhY2hlX3VwZGF0ZT0gc2hhcGVyX2NhY2hlX3VwZGF0ZTsKKyNlbmRpZgorCWRldi0+bmVpZ2hfc2V0dXAJPSBzaGFwZXJfbmVpZ2hfc2V0dXBfZGV2OworCWRldi0+ZG9faW9jdGwJCT0gc2hhcGVyX2lvY3RsOworCWRldi0+aGFyZF9oZWFkZXJfbGVuCT0gMDsKKwlkZXYtPnR5cGUJCT0gQVJQSFJEX0VUSEVSOwkvKiBpbml0aWFsbHkgKi8KKwlkZXYtPnNldF9tYWNfYWRkcmVzcwk9IE5VTEw7CisJZGV2LT5tdHUJCT0gMTUwMDsKKwlkZXYtPmFkZHJfbGVuCQk9IDA7CisJZGV2LT50eF9xdWV1ZV9sZW4JPSAxMDsKKwlkZXYtPmZsYWdzCQk9IDA7Cit9CisgCitzdGF0aWMgaW50IHNoYXBlcnMgPSAxOworI2lmZGVmIE1PRFVMRQorCittb2R1bGVfcGFyYW0oc2hhcGVycywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc2hhcGVycywgIlRyYWZmaWMgc2hhcGVyOiBtYXhpbXVtIG51bWJlciBvZiBzaGFwZXJzIik7CisKKyNlbHNlIC8qIE1PRFVMRSAqLworCitzdGF0aWMgaW50IF9faW5pdCBzZXRfbnVtX3NoYXBlcnMoY2hhciAqc3RyKQoreworCXNoYXBlcnMgPSBzaW1wbGVfc3RydG9sKHN0ciwgTlVMTCwgMCk7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoInNoYXBlcnM9Iiwgc2V0X251bV9zaGFwZXJzKTsKKworI2VuZGlmIC8qIE1PRFVMRSAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKipkZXZzOworCitzdGF0aWMgdW5zaWduZWQgaW50IHNoYXBlcnNfcmVnaXN0ZXJlZCA9IDA7CisKK3N0YXRpYyBpbnQgX19pbml0IHNoYXBlcl9pbml0KHZvaWQpCit7CisJaW50IGk7CisJc2l6ZV90IGFsbG9jX3NpemU7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwljaGFyIG5hbWVbSUZOQU1TSVpdOworCisJaWYgKHNoYXBlcnMgPCAxKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWFsbG9jX3NpemUgPSBzaXplb2YoKmRldikgKiBzaGFwZXJzOworCWRldnMgPSBrbWFsbG9jKGFsbG9jX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghZGV2cykKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGRldnMsIDAsIGFsbG9jX3NpemUpOworCisJZm9yIChpID0gMDsgaSA8IHNoYXBlcnM7IGkrKykgeworCisJCXNucHJpbnRmKG5hbWUsIElGTkFNU0laLCAic2hhcGVyJWQiLCBpKTsKKwkJZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3Qgc2hhcGVyKSwgbmFtZSwKKwkJCQkgICBzaGFwZXJfc2V0dXApOworCQlpZiAoIWRldikgCisJCQlicmVhazsKKworCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpIHsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQlicmVhazsKKwkJfQorCisJCWRldnNbaV0gPSBkZXY7CisJCXNoYXBlcnNfcmVnaXN0ZXJlZCsrOworCX0KKworCWlmICghc2hhcGVyc19yZWdpc3RlcmVkKSB7CisJCWtmcmVlKGRldnMpOworCQlkZXZzID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gKHNoYXBlcnNfcmVnaXN0ZXJlZCA/IDAgOiAtRU5PREVWKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNoYXBlcl9leGl0ICh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNoYXBlcnNfcmVnaXN0ZXJlZDsgaSsrKSB7CisJCWlmIChkZXZzW2ldKSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldihkZXZzW2ldKTsKKwkJCWZyZWVfbmV0ZGV2KGRldnNbaV0pOworCQl9CisJfQorCisJa2ZyZWUoZGV2cyk7CisJZGV2cyA9IE5VTEw7Cit9CisKK21vZHVsZV9pbml0KHNoYXBlcl9pbml0KTsKK21vZHVsZV9leGl0KHNoYXBlcl9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2lzOTAwLmMgYi9kcml2ZXJzL25ldC9zaXM5MDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTlkOWFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2lzOTAwLmMKQEAgLTAsMCArMSwyMzcwIEBACisvKiBzaXM5MDAuYzogQSBTaVMgOTAwLzcwMTYgUENJIEZhc3QgRXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KKyAgIENvcHlyaWdodCAxOTk5IFNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW0gQ29ycG9yYXRpb24gCisgICBSZXZpc2lvbjoJMS4wOC4wOCBKYW4uIDIyIDIwMDUKKyAgIAorICAgTW9kaWZpZWQgZnJvbSB0aGUgZHJpdmVyIHdoaWNoIGlzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBEb25hbGQgQmVja2VyLgorICAgCisgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICAgRHJpdmVycyBiYXNlZCBvbiB0aGlzIHNrZWxldG9uIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdCByZXRhaW4KKyAgIHRoZSBhdXRob3JzaGlwIChpbXBsaWNpdCBjb3B5cmlnaHQpIG5vdGljZS4KKyAgIAorICAgUmVmZXJlbmNlczoKKyAgIFNpUyA3MDE2IEZhc3QgRXRoZXJuZXQgUENJIEJ1cyAxMC8xMDAgTWJwcyBMQU4gQ29udHJvbGxlciB3aXRoIE9uTm93IFN1cHBvcnQsCisgICBwcmVsaW1pbmFyeSBSZXYuIDEuMCBKYW4uIDE0LCAxOTk4CisgICBTaVMgOTAwIEZhc3QgRXRoZXJuZXQgUENJIEJ1cyAxMC8xMDAgTWJwcyBMQU4gU2luZ2xlIENoaXAgd2l0aCBPbk5vdyBTdXBwb3J0LAorICAgcHJlbGltaW5hcnkgUmV2LiAxLjAgTm92LiAxMCwgMTk5OAorICAgU2lTIDcwMTQgU2luZ2xlIENoaXAgMTAwQkFTRS1UWC8xMEJBU0UtVCBQaHlzaWNhbCBMYXllciBTb2x1dGlvbiwKKyAgIHByZWxpbWluYXJ5IFJldi4gMS4wIEphbi4gMTgsIDE5OTgKKworICAgUmV2IDEuMDguMDggSmFuLiAyMiAyMDA1IERhbmllbGUgVmVuemFubyB1c2UgbmV0aWZfbXNnIGZvciBkZWJ1Z2dpbmcgbWVzc2FnZXMKKyAgIFJldiAxLjA4LjA3IE5vdi4gIDIgMjAwMyBEYW5pZWxlIFZlbnphbm8gPHdlYnZlbnphQGxpYmVyby5pdD4gYWRkIHN1c3BlbmQvcmVzdW1lIHN1cHBvcnQKKyAgIFJldiAxLjA4LjA2IFNlcC4gMjQgMjAwMiBNdWZhc2EgWWFuZyBidWcgZml4IGZvciBUeCB0aW1lb3V0ICYgYWRkIFNpUzk2MyBzdXBwb3J0CisgICBSZXYgMS4wOC4wNSBKdW4uICA2IDIwMDIgTXVmYXNhIFlhbmcgYnVnIGZpeCBmb3IgcmVhZF9lZXByb20gJiBUeCBkZXNjcmlwdG9yIG92ZXItYm91bmRhcnkKKyAgIFJldiAxLjA4LjA0IEFwci4gMjUgMjAwMiBNdWZhc2EgWWFuZyA8bXVmYXNhQHNpcy5jb20udHc+IGFkZGVkIFNpUzk2MiBzdXBwb3J0CisgICBSZXYgMS4wOC4wMyBGZWIuICAxIDIwMDIgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPiB1cGRhdGUgdG8gdXNlIGxpYnJhcnkgY3JjMzIgZnVuY3Rpb24KKyAgIFJldiAxLjA4LjAyIE5vdi4gMzAgMjAwMSBIdWktRmVuIEhzdSB3b3JrYXJvdW5kIGZvciBFREIgJiBidWcgZml4IGZvciBkaGNwIHByb2JsZW0KKyAgIFJldiAxLjA4LjAxIEF1Zy4gMjUgMjAwMSBIdWktRmVuIEhzdSB1cGRhdGUgZm9yIDYzMEVUICYgd29ya2Fyb3VuZCBmb3IgSUNTMTg5MyBQSFkKKyAgIFJldiAxLjA4LjAwIEp1bi4gMTEgMjAwMSBIdWktRmVuIEhzdSB3b3JrYXJvdW5kIGZvciBSVEw4MjAxIFBIWSBhbmQgc29tZSBidWcgZml4CisgICBSZXYgMS4wNy4xMSBBcHIuICAyIDIwMDEgSHVpLUZlbiBIc3UgdXBkYXRlcyBQQ0kgZHJpdmVycyB0byB1c2UgdGhlIG5ldyBwY2lfc2V0X2RtYV9tYXNrIGZvciBrZXJuZWwgMi40LjMKKyAgIFJldiAxLjA3LjEwIE1hci4gIDEgMjAwMSBIdWktRmVuIEhzdSA8aGZoc3VAc2lzLmNvbS50dz4gc29tZSBidWcgZml4ICYgNjM1TS9CIHN1cHBvcnQgCisgICBSZXYgMS4wNy4wOSBGZWIuICA5IDIwMDEgRGF2ZSBKb25lcyA8ZGF2ZWpAc3VzZS5kZT4gUENJIGVuYWJsZSBjbGVhbnVwCisgICBSZXYgMS4wNy4wOCBKYW4uICA4IDIwMDEgTGVpLUNodW4gQ2hhbmcgYWRkZWQgUlRMODIwMSBQSFkgc3VwcG9ydAorICAgUmV2IDEuMDcuMDcgTm92LiAyOSAyMDAwIExlaS1DaHVuIENoYW5nIGFkZGVkIGtlcm5lbC1kb2MgZXh0cmFjdGFibGUgZG9jdW1lbnRhdGlvbiBhbmQgNjMwIHdvcmthcm91bmQgZml4CisgICBSZXYgMS4wNy4wNiBOb3YuICA3IDIwMDAgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPiBzb21lIGJ1ZyBmaXggYW5kIGNsZWFuaW5nCisgICBSZXYgMS4wNy4wNSBOb3YuICA2IDIwMDAgbWV0YXBpcmF0PG1ldGFwaXJhdEBnbXguZGU+IGNvbnRyaWJ1dGUgbWVkaWEgdHlwZSBzZWxlY3QgYnkgaWZjb25maWcKKyAgIFJldiAxLjA3LjA0IFNlcC4gIDYgMjAwMCBMZWktQ2h1biBDaGFuZyBhZGRlZCBJQ1MxODkzIFBIWSBzdXBwb3J0CisgICBSZXYgMS4wNy4wMyBBdWcuIDI0IDIwMDAgTGVpLUNodW4gQ2hhbmcgKGxjY2hhbmdAc2lzLmNvbS50dykgbW9kaWZpZWQgNjMwRSBlcWF1bGl6ZXIgd29ya2Fyb3VuZCBydWxlCisgICBSZXYgMS4wNy4wMSBBdWcuIDA4IDIwMDAgT2xsaWUgTGhvIG1pbm9yIHVwZGF0ZSBmb3IgU2lTIDYzMEUgYW5kIFNpUyA2MzBFIEExCisgICBSZXYgMS4wNyAgICBNYXIuIDA3IDIwMDAgT2xsaWUgTGhvIGJ1ZyBmaXggaW4gUnggYnVmZmVyIHJpbmcKKyAgIFJldiAxLjA2LjA0IEZlYi4gMTEgMjAwMCBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+IHNvZnRuZXQgYW5kIGluaXQgZm9yIGtlcm5lbCAyLjQKKyAgIFJldiAxLjA2LjAzIERlYy4gMjMgMTk5OSBPbGxpZSBMaG8gVGhpcmQgcmVsZWFzZQorICAgUmV2IDEuMDYuMDIgTm92LiAyMyAxOTk5IE9sbGllIExobyBidWcgaW4gbWFjIHByb2JpbmcgZml4ZWQKKyAgIFJldiAxLjA2LjAxIE5vdi4gMTYgMTk5OSBPbGxpZSBMaG8gQ1JDIGNhbGN1bGF0aW9uIHByb3ZpZGUgYnkgSm9zZXBoIFpiaWNpYWsgKGltMTR1MmNAcHJpbWVuZXQuY29tKQorICAgUmV2IDEuMDYgTm92LiA0IDE5OTkgT2xsaWUgTGhvIChvbGxpZUBzaXMuY29tLnR3KSBTZWNvbmQgcmVsZWFzZQorICAgUmV2IDEuMDUuMDUgT2N0LiAyOSAxOTk5IE9sbGllIExobyAob2xsaWVAc2lzLmNvbS50dykgU2luZ2xlIGJ1ZmZlciBUeC9SeAorICAgQ2hpbi1TaGFuIExpIChsY3NAc2lzLmNvbS50dykgQWRkZWQgQU1EIEFtNzljOTAxIEhvbWVQTkEgUEhZIHN1cHBvcnQKKyAgIFJldiAxLjA1IEF1Zy4gNyAxOTk5IEppbSBIdWFuZyAoY21odWFuZ0BzaXMuY29tLnR3KSBJbml0aWFsIHJlbGVhc2UKKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4gICAgICAvKiBQcm9jZXNzb3IgdHlwZSBmb3IgY2FjaGUgYWxpZ25tZW50LiAqLworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgkvKiBVc2VyIHNwYWNlIG1lbW9yeSBhY2Nlc3MgZnVuY3Rpb25zICovCisKKyNpbmNsdWRlICJzaXM5MDAuaCIKKworI2RlZmluZSBTSVM5MDBfTU9EVUxFX05BTUUgInNpczkwMCIKKyNkZWZpbmUgU0lTOTAwX0RSVl9WRVJTSU9OICJ2MS4wOC4wOCBKYW4uIDIyIDIwMDUiCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KK0tFUk5fSU5GTyAic2lzOTAwLmM6ICIgU0lTOTAwX0RSVl9WRVJTSU9OICJcbiI7CisKK3N0YXRpYyBpbnQgbWF4X2ludGVycnVwdF93b3JrID0gNDA7CitzdGF0aWMgaW50IG11bHRpY2FzdF9maWx0ZXJfbGltaXQgPSAxMjg7CisKK3N0YXRpYyBpbnQgc2lzOTAwX2RlYnVnID0gLTE7IC8qIFVzZSBTSVM5MDBfREVGX01TRyBhcyB2YWx1ZSAqLworCisjZGVmaW5lIFNJUzkwMF9ERUZfTVNHIFwKKwkoTkVUSUZfTVNHX0RSVgkJfCBcCisJIE5FVElGX01TR19MSU5LCQl8IFwKKwkgTkVUSUZfTVNHX1JYX0VSUgl8IFwKKwkgTkVUSUZfTVNHX1RYX0VSUikKKworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAoNCpIWikKKy8qIFNpUyA5MDAgaXMgY2FwYWJsZSBvZiAzMiBiaXRzIEJNIERNQSAqLworI2RlZmluZSBTSVM5MDBfRE1BX01BU0sgMHhmZmZmZmZmZgorCitlbnVtIHsKKwlTSVNfOTAwID0gMCwKKwlTSVNfNzAxNgorfTsKK3N0YXRpYyBjaGFyICogY2FyZF9uYW1lc1tdID0geworCSJTaVMgOTAwIFBDSSBGYXN0IEV0aGVybmV0IiwKKwkiU2lTIDcwMTYgUENJIEZhc3QgRXRoZXJuZXQiCit9Oworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNpczkwMF9wY2lfdGJsIFtdID0geworCXtQQ0lfVkVORE9SX0lEX1NJLCBQQ0lfREVWSUNFX0lEX1NJXzkwMCwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgU0lTXzkwMH0sCisJe1BDSV9WRU5ET1JfSURfU0ksIFBDSV9ERVZJQ0VfSURfU0lfNzAxNiwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgU0lTXzcwMTZ9LAorCXswLH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFIChwY2ksIHNpczkwMF9wY2lfdGJsKTsKKworc3RhdGljIHZvaWQgc2lzOTAwX3JlYWRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgpOworCitzdGF0aWMgc3RydWN0IG1paV9jaGlwX2luZm8geworCWNvbnN0IGNoYXIgKiBuYW1lOworCXUxNiBwaHlfaWQwOworCXUxNiBwaHlfaWQxOworCXU4ICBwaHlfdHlwZXM7CisjZGVmaW5lCUhPTUUgCTB4MDAwMQorI2RlZmluZSBMQU4JMHgwMDAyCisjZGVmaW5lIE1JWAkweDAwMDMKKyNkZWZpbmUgVU5LTk9XTgkweDAKK30gbWlpX2NoaXBfdGFibGVbXSA9IHsKKwl7ICJTaVMgOTAwIEludGVybmFsIE1JSSBQSFkiLCAJCTB4MDAxZCwgMHg4MDAwLCBMQU4gfSwKKwl7ICJTaVMgNzAxNCBQaHlzaWNhbCBMYXllciBTb2x1dGlvbiIsIAkweDAwMTYsIDB4ZjgzMCwgTEFOIH0sCisJeyAiQWx0aW1hdGEgQUMxMDFMRiBQSFkiLCAgICAgICAgICAgICAgIDB4MDAyMiwgMHg1NTIwLCBMQU4gfSwKKwl7ICJBTUQgNzlDOTAxIDEwQkFTRS1UIFBIWSIsICAJCTB4MDAwMCwgMHg2QjcwLCBMQU4gfSwKKwl7ICJBTUQgNzlDOTAxIEhvbWVQTkEgUEhZIiwJCTB4MDAwMCwgMHg2QjkwLCBIT01FfSwKKwl7ICJJQ1MgTEFOIFBIWSIsCQkJMHgwMDE1LCAweEY0NDAsIExBTiB9LAorCXsgIk5TIDgzODUxIFBIWSIsCQkJMHgyMDAwLCAweDVDMjAsIE1JWCB9LAorCXsgIk5TIDgzODQ3IFBIWSIsICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAsIDB4NUMzMCwgTUlYIH0sCisJeyAiUmVhbHRlayBSVEw4MjAxIFBIWSIsCQkweDAwMDAsIDB4ODIwMCwgTEFOIH0sCisJeyAiVklBIDYxMDMgUEhZIiwJCQkweDAxMDEsIDB4OGYyMCwgTEFOIH0sCisJe05VTEwsfSwKK307CisKK3N0cnVjdCBtaWlfcGh5IHsKKwlzdHJ1Y3QgbWlpX3BoeSAqIG5leHQ7CisJaW50IHBoeV9hZGRyOworCXUxNiBwaHlfaWQwOworCXUxNiBwaHlfaWQxOworCXUxNiBzdGF0dXM7CisJdTggIHBoeV90eXBlczsKK307CisKK3R5cGVkZWYgc3RydWN0IF9CdWZmZXJEZXNjIHsKKwl1MzIgbGluazsKKwl1MzIgY21kc3RzOworCXUzMiBidWZwdHI7Cit9IEJ1ZmZlckRlc2M7CisKK3N0cnVjdCBzaXM5MDBfcHJpdmF0ZSB7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IHBjaV9kZXYgKiBwY2lfZGV2OworCisJc3BpbmxvY2tfdCBsb2NrOworCisJc3RydWN0IG1paV9waHkgKiBtaWk7CisJc3RydWN0IG1paV9waHkgKiBmaXJzdF9taWk7IC8qIHJlY29yZCB0aGUgZmlyc3QgbWlpIHN0cnVjdHVyZSAqLworCXVuc2lnbmVkIGludCBjdXJfcGh5OworCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7IC8qIExpbmsgc3RhdHVzIGRldGVjdGlvbiB0aW1lci4gKi8KKwl1OCBhdXRvbmdfY29tcGxldGU7IC8qIDE6IGF1dG8tbmVnb3RpYXRlIGNvbXBsZXRlICAqLworCisJdTMyIG1zZ19lbmFibGU7CisKKwl1bnNpZ25lZCBpbnQgY3VyX3J4LCBkaXJ0eV9yeDsgLyogcHJvZHVjZXIvY29tc3VtZXIgcG9pbnRlcnMgZm9yIFR4L1J4IHJpbmcgKi8KKwl1bnNpZ25lZCBpbnQgY3VyX3R4LCBkaXJ0eV90eDsKKworCS8qIFRoZSBzYXZlZCBhZGRyZXNzIG9mIGEgc2VudC9yZWNlaXZlLWluLXBsYWNlIHBhY2tldCBidWZmZXIgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tidWZmW05VTV9UWF9ERVNDXTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tidWZmW05VTV9SWF9ERVNDXTsKKwlCdWZmZXJEZXNjICp0eF9yaW5nOworCUJ1ZmZlckRlc2MgKnJ4X3Jpbmc7CisKKwlkbWFfYWRkcl90IHR4X3JpbmdfZG1hOworCWRtYV9hZGRyX3QgcnhfcmluZ19kbWE7CisKKwl1bnNpZ25lZCBpbnQgdHhfZnVsbDsgLyogVGhlIFR4IHF1ZXVlIGlzIGZ1bGwuICovCisJdTggaG9zdF9icmlkZ2VfcmV2OworCXU4IGNoaXBzZXRfcmV2OworfTsKKworTU9EVUxFX0FVVEhPUigiSmltIEh1YW5nIDxjbWh1YW5nQHNpcy5jb20udHc+LCBPbGxpZSBMaG8gPG9sbGllQHNpcy5jb20udHc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNpUyA5MDAgUENJIEZhc3QgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShtdWx0aWNhc3RfZmlsdGVyX2xpbWl0LCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShzaXM5MDBfZGVidWcsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG11bHRpY2FzdF9maWx0ZXJfbGltaXQsICJTaVMgOTAwLzcwMTYgbWF4aW11bSBudW1iZXIgb2YgZmlsdGVyZWQgbXVsdGljYXN0IGFkZHJlc3NlcyIpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfaW50ZXJydXB0X3dvcmssICJTaVMgOTAwLzcwMTYgbWF4aW11bSBldmVudHMgaGFuZGxlZCBwZXIgaW50ZXJydXB0Iik7CitNT0RVTEVfUEFSTV9ERVNDKHNpczkwMF9kZWJ1ZywgIlNpUyA5MDAvNzAxNiBiaXRtYXBwZWQgZGVidWdnaW5nIG1lc3NhZ2UgbGV2ZWwiKTsKKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBzaXM5MDBfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorc3RhdGljIGludCBzaXM5MDBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CitzdGF0aWMgaW50IHNpczkwMF9taWlfcHJvYmUgKHN0cnVjdCBuZXRfZGV2aWNlICogbmV0X2Rldik7CitzdGF0aWMgdm9pZCBzaXM5MDBfaW5pdF9yeGZpbHRlciAoc3RydWN0IG5ldF9kZXZpY2UgKiBuZXRfZGV2KTsKK3N0YXRpYyB1MTYgcmVhZF9lZXByb20obG9uZyBpb2FkZHIsIGludCBsb2NhdGlvbik7CitzdGF0aWMgdTE2IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbCk7CitzdGF0aWMgdm9pZCBzaXM5MDBfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHNpczkwMF9jaGVja19tb2RlIChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldiwgc3RydWN0IG1paV9waHkgKm1paV9waHkpOworc3RhdGljIHZvaWQgc2lzOTAwX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworc3RhdGljIHZvaWQgc2lzOTAwX2luaXRfdHhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CitzdGF0aWMgdm9pZCBzaXM5MDBfaW5pdF9yeF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKK3N0YXRpYyBpbnQgc2lzOTAwX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworc3RhdGljIGludCBzaXM5MDBfcngoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworc3RhdGljIHZvaWQgc2lzOTAwX2ZpbmlzaF94bWl0IChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CitzdGF0aWMgaXJxcmV0dXJuX3Qgc2lzOTAwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgc2lzOTAwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKK3N0YXRpYyBpbnQgbWlpX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2lzOTAwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CitzdGF0aWMgdTE2IHNpczkwMF9tY2FzdF9iaXRucih1OCAqYWRkciwgdTggcmV2aXNpb24pOworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpOworc3RhdGljIHZvaWQgc2lzOTAwX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKK3N0YXRpYyB2b2lkIHNpczYzMF9zZXRfZXEoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIHU4IHJldmlzaW9uKTsKK3N0YXRpYyBpbnQgc2lzOTAwX3NldF9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApOworc3RhdGljIHUxNiBzaXM5MDBfZGVmYXVsdF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKiBuZXRfZGV2KTsKK3N0YXRpYyB2b2lkIHNpczkwMF9zZXRfY2FwYWJpbGl0eSggc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgLHN0cnVjdCBtaWlfcGh5ICpwaHkpOworc3RhdGljIHUxNiBzaXM5MDBfcmVzZXRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBpbnQgcGh5X2FkZHIpOworc3RhdGljIHZvaWQgc2lzOTAwX2F1dG9fbmVnb3RpYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBpbnQgcGh5X2FkZHIpOworc3RhdGljIHZvaWQgc2lzOTAwX3NldF9tb2RlIChsb25nIGlvYWRkciwgaW50IHNwZWVkLCBpbnQgZHVwbGV4KTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgc2lzOTAwX2V0aHRvb2xfb3BzOworCisvKioKKyAqCXNpczkwMF9nZXRfbWFjX2FkZHIgLSBHZXQgTUFDIGFkZHJlc3MgZm9yIHN0YW5kIGFsb25lIFNpUzkwMCBtb2RlbAorICoJQHBjaV9kZXY6IHRoZSBzaXM5MDAgcGNpIGRldmljZQorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIGdldCBhZGRyZXNzIGZvciAKKyAqCisgKglPbGRlciBTaVM5MDAgYW5kIGZyaWVuZHMsIHVzZSBFRVBST00gdG8gc3RvcmUgTUFDIGFkZHJlc3MuCisgKglNQUMgYWRkcmVzcyBpcyByZWFkIGZyb20gcmVhZF9lZXByb20oKSBpbnRvIEBuZXRfZGV2LT5kZXZfYWRkci4KKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzaXM5MDBfZ2V0X21hY19hZGRyKHN0cnVjdCBwY2lfZGV2ICogcGNpX2Rldiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJbG9uZyBpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCk7CisJdTE2IHNpZ25hdHVyZTsKKwlpbnQgaTsKKworCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIHNhbmUgRUVQUk9NICovCisJc2lnbmF0dXJlID0gKHUxNikgcmVhZF9lZXByb20oaW9hZGRyLCBFRVBST01TaWduYXR1cmUpOyAgICAKKwlpZiAoc2lnbmF0dXJlID09IDB4ZmZmZiB8fCBzaWduYXR1cmUgPT0gMHgwMDAwKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogRXJyb3IgRUVSUE9NIHJlYWQgJXhcbiIsIAorCQkJcGNpX25hbWUocGNpX2RldiksIHNpZ25hdHVyZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIGdldCBNQUMgYWRkcmVzcyBmcm9tIEVFUFJPTSAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJICAgICAgICAoKHUxNiAqKShuZXRfZGV2LT5kZXZfYWRkcikpW2ldID0gcmVhZF9lZXByb20oaW9hZGRyLCBpK0VFUFJPTU1BQ0FkZHIpOworCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICoJc2lzNjMwZV9nZXRfbWFjX2FkZHIgLSBHZXQgTUFDIGFkZHJlc3MgZm9yIFNpUzYzMEUgbW9kZWwKKyAqCUBwY2lfZGV2OiB0aGUgc2lzOTAwIHBjaSBkZXZpY2UKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBnZXQgYWRkcmVzcyBmb3IgCisgKgorICoJU2lTNjMwRSBtb2RlbCwgdXNlIEFQQyBDTU9TIFJBTSB0byBzdG9yZSBNQUMgYWRkcmVzcy4KKyAqCUFQQyBDTU9TIFJBTSBpcyBhY2Nlc3NlZCB0aHJvdWdoIElTQSBicmlkZ2UuCisgKglNQUMgYWRkcmVzcyBpcyByZWFkIGludG8gQG5ldF9kZXYtPmRldl9hZGRyLgorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNpczYzMGVfZ2V0X21hY19hZGRyKHN0cnVjdCBwY2lfZGV2ICogcGNpX2RldiwKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKmlzYV9icmlkZ2UgPSBOVUxMOworCXU4IHJlZzsKKwlpbnQgaTsKKworCWlzYV9icmlkZ2UgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1NJLCAweDAwMDgsIGlzYV9icmlkZ2UpOworCWlmICghaXNhX2JyaWRnZSkKKwkJaXNhX2JyaWRnZSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfU0ksIDB4MDAxOCwgaXNhX2JyaWRnZSk7CisJaWYgKCFpc2FfYnJpZGdlKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW4gbm90IGZpbmQgSVNBIGJyaWRnZVxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBjaV9kZXYpKTsKKwkJcmV0dXJuIDA7CisJfQorCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGlzYV9icmlkZ2UsIDB4NDgsICZyZWcpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShpc2FfYnJpZGdlLCAweDQ4LCByZWcgfCAweDQwKTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJb3V0YigweDA5ICsgaSwgMHg3MCk7CisJCSgodTggKikobmV0X2Rldi0+ZGV2X2FkZHIpKVtpXSA9IGluYigweDcxKTsgCisJfQorCXBjaV93cml0ZV9jb25maWdfYnl0ZShpc2FfYnJpZGdlLCAweDQ4LCByZWcgJiB+MHg0MCk7CisJcGNpX2Rldl9wdXQoaXNhX2JyaWRnZSk7CisKKwlyZXR1cm4gMTsKK30KKworCisvKioKKyAqCXNpczYzNV9nZXRfbWFjX2FkZHIgLSBHZXQgTUFDIGFkZHJlc3MgZm9yIFNJUzYzNSBtb2RlbAorICoJQHBjaV9kZXY6IHRoZSBzaXM5MDAgcGNpIGRldmljZQorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIGdldCBhZGRyZXNzIGZvciAKKyAqCisgKglTaVM2MzUgbW9kZWwsIHNldCBNQUMgUmVsb2FkIEJpdCB0byBsb2FkIE1hYyBhZGRyZXNzIGZyb20gQVBDCisgKgl0byByZmRyLiByZmRyIGlzIGFjY2Vzc2VkIHRocm91Z2ggcmZjci4gTUFDIGFkZHJlc3MgaXMgcmVhZCBpbnRvIAorICoJQG5ldF9kZXYtPmRldl9hZGRyLgorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNpczYzNV9nZXRfbWFjX2FkZHIoc3RydWN0IHBjaV9kZXYgKiBwY2lfZGV2LAorCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlsb25nIGlvYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsKKwl1MzIgcmZjclNhdmU7CisJdTMyIGk7CisKKwlyZmNyU2F2ZSA9IGlubChyZmNyICsgaW9hZGRyKTsKKworCW91dGwocmZjclNhdmUgfCBSRUxPQUQsIGlvYWRkciArIGNyKTsKKwlvdXRsKDAsIGlvYWRkciArIGNyKTsKKworCS8qIGRpc2FibGUgcGFja2V0IGZpbHRlcmluZyBiZWZvcmUgc2V0dGluZyBmaWx0ZXIgKi8KKwlvdXRsKHJmY3JTYXZlICYgflJGRU4sIHJmY3IgKyBpb2FkZHIpOworCisJLyogbG9hZCBNQUMgYWRkciB0byBmaWx0ZXIgZGF0YSByZWdpc3RlciAqLworCWZvciAoaSA9IDAgOyBpIDwgMyA7IGkrKykgeworCQlvdXRsKChpIDw8IFJGQUREUl9zaGlmdCksIGlvYWRkciArIHJmY3IpOworCQkqKCAoKHUxNiAqKW5ldF9kZXYtPmRldl9hZGRyKSArIGkpID0gaW53KGlvYWRkciArIHJmZHIpOworCX0KKworCS8qIGVuYWJsZSBwYWNrZXQgZmlsdGVyaW5nICovCisJb3V0bChyZmNyU2F2ZSB8IFJGRU4sIHJmY3IgKyBpb2FkZHIpOworCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICoJc2lzOTZ4X2dldF9tYWNfYWRkciAtIEdldCBNQUMgYWRkcmVzcyBmb3IgU2lTOTYyIG9yIFNpUzk2MyBtb2RlbAorICoJQHBjaV9kZXY6IHRoZSBzaXM5MDAgcGNpIGRldmljZQorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIGdldCBhZGRyZXNzIGZvciAKKyAqCisgKglTaVM5NjIgb3IgU2lTOTYzIG1vZGVsLCB1c2UgRUVQUk9NIHRvIHN0b3JlIE1BQyBhZGRyZXNzLiBBbmQgRUVQUk9NIAorICoJaXMgc2hhcmVkIGJ5CisgKglMQU4gYW5kIDEzOTQuIFdoZW4gYWNjZXNzIEVFUFJPTSwgc2VuZCBFRVJFUSBzaWduYWwgdG8gaGFyZHdhcmUgZmlyc3QgCisgKglhbmQgd2FpdCBmb3IgRUVHTlQuIElmIEVFR05UIGlzIE9OLCBFRVBST00gaXMgcGVybWl0dGVkIHRvIGJlIGFjY2VzcyAKKyAqCWJ5IExBTiwgb3RoZXJ3aXNlIGlzIG5vdC4gQWZ0ZXIgTUFDIGFkZHJlc3MgaXMgcmVhZCBmcm9tIEVFUFJPTSwgc2VuZAorICoJRUVET05FIHNpZ25hbCB0byByZWZ1c2UgRUVQUk9NIGFjY2VzcyBieSBMQU4uIAorICoJVGhlIEVFUFJPTSBtYXAgb2YgU2lTOTYyIG9yIFNpUzk2MyBpcyBkaWZmZXJlbnQgdG8gU2lTOTAwLiAKKyAqCVRoZSBzaWduYXR1cmUgZmllbGQgaW4gU2lTOTYyIG9yIFNpUzk2MyBzcGVjIGlzIG1lYW5pbmdsZXNzLiAKKyAqCU1BQyBhZGRyZXNzIGlzIHJlYWQgaW50byBAbmV0X2Rldi0+ZGV2X2FkZHIuCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgc2lzOTZ4X2dldF9tYWNfYWRkcihzdHJ1Y3QgcGNpX2RldiAqIHBjaV9kZXYsCisJCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCWxvbmcgaW9hZGRyID0gbmV0X2Rldi0+YmFzZV9hZGRyOworCWxvbmcgZWVfYWRkciA9IGlvYWRkciArIG1lYXI7CisJdTMyIHdhaXR0aW1lID0gMDsKKwlpbnQgaTsKKwkKKwlvdXRsKEVFUkVRLCBlZV9hZGRyKTsKKwl3aGlsZSh3YWl0dGltZSA8IDIwMDApIHsKKwkJaWYoaW5sKGVlX2FkZHIpICYgRUVHTlQpIHsKKworCQkJLyogZ2V0IE1BQyBhZGRyZXNzIGZyb20gRUVQUk9NICovCisJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQkJICAgICAgICAoKHUxNiAqKShuZXRfZGV2LT5kZXZfYWRkcikpW2ldID0gcmVhZF9lZXByb20oaW9hZGRyLCBpK0VFUFJPTU1BQ0FkZHIpOworCisJCQlvdXRsKEVFRE9ORSwgZWVfYWRkcik7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIHsKKwkJCXVkZWxheSgxKTsJCisJCQl3YWl0dGltZSArKzsKKwkJfQorCX0KKwlvdXRsKEVFRE9ORSwgZWVfYWRkcik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2lzOTAwX3Byb2JlIC0gUHJvYmUgZm9yIHNpczkwMCBkZXZpY2UKKyAqCUBwY2lfZGV2OiB0aGUgc2lzOTAwIHBjaSBkZXZpY2UKKyAqCUBwY2lfaWQ6IHRoZSBwY2kgZGV2aWNlIElECisgKgorICoJQ2hlY2sgYW5kIHByb2JlIHNpczkwMCBuZXQgZGV2aWNlIGZvciBAcGNpX2Rldi4KKyAqCUdldCBtYWMgYWRkcmVzcyBhY2NvcmRpbmcgdG8gdGhlIGNoaXAgcmV2aXNpb24sIAorICoJYW5kIGFzc2lnbiBTaVM5MDAtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KKyAqCWllOiBzaXM5MDBfb3BlbigpLCBzaXM5MDBfc3RhcnRfeG1pdCgpLCBzaXM5MDBfY2xvc2UoKSwgZXRjLgorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNpczkwMF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKKwkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlkbWFfYWRkcl90IHJpbmdfZG1hOworCXZvaWQgKnJpbmdfc3BhY2U7CisJbG9uZyBpb2FkZHI7CisJaW50IGksIHJldDsKKwljaGFyICpjYXJkX25hbWUgPSBjYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdOworCWNvbnN0IGNoYXIgKmRldl9uYW1lID0gcGNpX25hbWUocGNpX2Rldik7CisKKy8qIHdoZW4gYnVpbHQgaW50byB0aGUga2VybmVsLCB3ZSBvbmx5IHByaW50IHZlcnNpb24gaWYgZGV2aWNlIGlzIGZvdW5kICovCisjaWZuZGVmIE1PRFVMRQorCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorCisJLyogc2V0dXAgdmFyaW91cyBiaXRzIGluIFBDSSBjb21tYW5kIHJlZ2lzdGVyICovCisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpX2Rldik7CisJaWYocmV0KSByZXR1cm4gcmV0OworCQorCWkgPSBwY2lfc2V0X2RtYV9tYXNrKHBjaV9kZXYsIFNJUzkwMF9ETUFfTUFTSyk7CisJaWYoaSl7CisJCXByaW50ayhLRVJOX0VSUiAic2lzOTAwLmM6IGFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IgorCQkJIjMyYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJcmV0dXJuIGk7CisJfQorCQorCXBjaV9zZXRfbWFzdGVyKHBjaV9kZXYpOworCQorCW5ldF9kZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHNpczkwMF9wcml2YXRlKSk7CisJaWYgKCFuZXRfZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlTRVRfTU9EVUxFX09XTkVSKG5ldF9kZXYpOworCVNFVF9ORVRERVZfREVWKG5ldF9kZXYsICZwY2lfZGV2LT5kZXYpOworCisJLyogV2UgZG8gYSByZXF1ZXN0X3JlZ2lvbigpIHRvIHJlZ2lzdGVyIC9wcm9jL2lvcG9ydHMgaW5mby4gKi8KKwlpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCk7CQorCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGNpX2RldiwgInNpczkwMCIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX291dDsKKworCXNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwluZXRfZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisJbmV0X2Rldi0+aXJxID0gcGNpX2Rldi0+aXJxOworCXNpc19wcml2LT5wY2lfZGV2ID0gcGNpX2RldjsKKwlzcGluX2xvY2tfaW5pdCgmc2lzX3ByaXYtPmxvY2spOworCisJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIG5ldF9kZXYpOworCisJcmluZ19zcGFjZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBjaV9kZXYsIFRYX1RPVEFMX1NJWkUsICZyaW5nX2RtYSk7CisJaWYgKCFyaW5nX3NwYWNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9jbGVhcmRldjsKKwl9CisJc2lzX3ByaXYtPnR4X3JpbmcgPSAoQnVmZmVyRGVzYyAqKXJpbmdfc3BhY2U7CisJc2lzX3ByaXYtPnR4X3JpbmdfZG1hID0gcmluZ19kbWE7CisKKwlyaW5nX3NwYWNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpX2RldiwgUlhfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKKwlpZiAoIXJpbmdfc3BhY2UpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfdW5tYXBfdHg7CisJfQorCXNpc19wcml2LT5yeF9yaW5nID0gKEJ1ZmZlckRlc2MgKilyaW5nX3NwYWNlOworCXNpc19wcml2LT5yeF9yaW5nX2RtYSA9IHJpbmdfZG1hOworCQkKKwkvKiBUaGUgU2lTOTAwLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJbmV0X2Rldi0+b3BlbiA9ICZzaXM5MDBfb3BlbjsKKwluZXRfZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmc2lzOTAwX3N0YXJ0X3htaXQ7CisJbmV0X2Rldi0+c3RvcCA9ICZzaXM5MDBfY2xvc2U7CisJbmV0X2Rldi0+Z2V0X3N0YXRzID0gJnNpczkwMF9nZXRfc3RhdHM7CisJbmV0X2Rldi0+c2V0X2NvbmZpZyA9ICZzaXM5MDBfc2V0X2NvbmZpZzsKKwluZXRfZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGU7CisJbmV0X2Rldi0+ZG9faW9jdGwgPSAmbWlpX2lvY3RsOworCW5ldF9kZXYtPnR4X3RpbWVvdXQgPSBzaXM5MDBfdHhfdGltZW91dDsKKwluZXRfZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisJbmV0X2Rldi0+ZXRodG9vbF9vcHMgPSAmc2lzOTAwX2V0aHRvb2xfb3BzOworCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKyAgICAgICAgbmV0X2Rldi0+cG9sbF9jb250cm9sbGVyID0gJnNpczkwMF9wb2xsOworI2VuZGlmCisKKwlpZiAoc2lzOTAwX2RlYnVnID4gMCkKKwkJc2lzX3ByaXYtPm1zZ19lbmFibGUgPSBzaXM5MDBfZGVidWc7CisJZWxzZQorCQlzaXNfcHJpdi0+bXNnX2VuYWJsZSA9IFNJUzkwMF9ERUZfTVNHOworCQkKKwkvKiBHZXQgTWFjIGFkZHJlc3MgYWNjb3JkaW5nIHRvIHRoZSBjaGlwIHJldmlzaW9uICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmKHNpc19wcml2LT5jaGlwc2V0X3JldikpOworCWlmKG5ldGlmX21zZ19wcm9iZShzaXNfcHJpdikpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZGV0ZWN0ZWQgcmV2aXNpb24gJTIuMngsICIKKwkJCQkidHJ5aW5nIHRvIGdldCBNQUMgYWRkcmVzcy4uLlxuIiwKKwkJCQlkZXZfbmFtZSwgc2lzX3ByaXYtPmNoaXBzZXRfcmV2KTsKKwkKKwlyZXQgPSAwOworCWlmIChzaXNfcHJpdi0+Y2hpcHNldF9yZXYgPT0gU0lTNjMwRV85MDBfUkVWKQorCQlyZXQgPSBzaXM2MzBlX2dldF9tYWNfYWRkcihwY2lfZGV2LCBuZXRfZGV2KTsKKwllbHNlIGlmICgoc2lzX3ByaXYtPmNoaXBzZXRfcmV2ID4gMHg4MSkgJiYgKHNpc19wcml2LT5jaGlwc2V0X3JldiA8PSAweDkwKSApCisJCXJldCA9IHNpczYzNV9nZXRfbWFjX2FkZHIocGNpX2RldiwgbmV0X2Rldik7CisJZWxzZSBpZiAoc2lzX3ByaXYtPmNoaXBzZXRfcmV2ID09IFNJUzk2eF85MDBfUkVWKQorCQlyZXQgPSBzaXM5NnhfZ2V0X21hY19hZGRyKHBjaV9kZXYsIG5ldF9kZXYpOworCWVsc2UKKwkJcmV0ID0gc2lzOTAwX2dldF9tYWNfYWRkcihwY2lfZGV2LCBuZXRfZGV2KTsKKworCWlmIChyZXQgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2Fubm90IHJlYWQgTUFDIGFkZHJlc3MuXG4iLCBkZXZfbmFtZSk7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3VubWFwX3J4OworCX0KKwkKKwkvKiA2MzBFVCA6IHNldCB0aGUgbWlpIGFjY2VzcyBtb2RlIGFzIHNvZnR3YXJlLW1vZGUgKi8KKwlpZiAoc2lzX3ByaXYtPmNoaXBzZXRfcmV2ID09IFNJUzYzMEVUXzkwMF9SRVYpCisJCW91dGwoQUNDRVNTTU9ERSB8IGlubChpb2FkZHIgKyBjciksIGlvYWRkciArIGNyKTsKKworCS8qIHByb2JlIGZvciBtaWkgdHJhbnNjZWl2ZXIgKi8KKwlpZiAoc2lzOTAwX21paV9wcm9iZShuZXRfZGV2KSA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBFcnJvciBwcm9iaW5nIE1JSSBkZXZpY2UuXG4iLAorCQkgICAgICAgZGV2X25hbWUpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl91bm1hcF9yeDsKKwl9CisKKwkvKiBzYXZlIG91ciBob3N0IGJyaWRnZSByZXZpc2lvbiAqLworCWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfU0ksIFBDSV9ERVZJQ0VfSURfU0lfNjMwLCBOVUxMKTsKKwlpZiAoZGV2KSB7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmc2lzX3ByaXYtPmhvc3RfYnJpZGdlX3Jldik7CisJCXBjaV9kZXZfcHV0KGRldik7CisJfQorCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldF9kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3VubWFwX3J4OworCisJLyogcHJpbnQgc29tZSBpbmZvcm1hdGlvbiBhYm91dCBvdXIgTklDICovCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGF0ICUjbHgsIElSUSAlZCwgIiwgbmV0X2Rldi0+bmFtZSwKKwkgICAgICAgY2FyZF9uYW1lLCBpb2FkZHIsIG5ldF9kZXYtPmlycSk7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJcHJpbnRrKCIlMi4yeDoiLCAodTgpbmV0X2Rldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiJTIuMnguXG4iLCBuZXRfZGV2LT5kZXZfYWRkcltpXSk7CisKKwlyZXR1cm4gMDsKKworIGVycl91bm1hcF9yeDoKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBjaV9kZXYsIFJYX1RPVEFMX1NJWkUsIHNpc19wcml2LT5yeF9yaW5nLAorCQlzaXNfcHJpdi0+cnhfcmluZ19kbWEpOworIGVycl91bm1hcF90eDoKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBjaV9kZXYsIFRYX1RPVEFMX1NJWkUsIHNpc19wcml2LT50eF9yaW5nLAorCQlzaXNfcHJpdi0+dHhfcmluZ19kbWEpOworIGVycl9vdXRfY2xlYXJkZXY6CisgCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBOVUxMKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBjaV9kZXYpOworIGVycl9vdXQ6CisJZnJlZV9uZXRkZXYobmV0X2Rldik7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKglzaXM5MDBfbWlpX3Byb2JlIC0gUHJvYmUgTUlJIFBIWSBmb3Igc2lzOTAwCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gcHJvYmUgZm9yCisgKgkKKyAqCVNlYXJjaCBmb3IgdG90YWwgb2YgMzIgcG9zc2libGUgbWlpIHBoeSBhZGRyZXNzZXMuCisgKglJZGVudGlmeSBhbmQgc2V0IGN1cnJlbnQgcGh5IGlmIGZvdW5kIG9uZSwKKyAqCXJldHVybiBlcnJvciBpZiBpdCBmYWlsZWQgdG8gZm91bmQuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgc2lzOTAwX21paV9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqIG5ldF9kZXYpCit7CisJc3RydWN0IHNpczkwMF9wcml2YXRlICogc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCWNvbnN0IGNoYXIgKmRldl9uYW1lID0gcGNpX25hbWUoc2lzX3ByaXYtPnBjaV9kZXYpOworCXUxNiBwb2xsX2JpdCA9IE1JSV9TVEFUX0xJTkssIHN0YXR1cyA9IDA7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIDUgKiBIWjsKKwlpbnQgcGh5X2FkZHI7CisKKwlzaXNfcHJpdi0+bWlpID0gTlVMTDsKKworCS8qIHNlYXJjaCBmb3IgdG90YWwgb2YgMzIgcG9zc2libGUgbWlpIHBoeSBhZGRyZXNzZXMgKi8KKwlmb3IgKHBoeV9hZGRyID0gMDsgcGh5X2FkZHIgPCAzMjsgcGh5X2FkZHIrKykgewkKKwkJc3RydWN0IG1paV9waHkgKiBtaWlfcGh5ID0gTlVMTDsKKwkJdTE2IG1paV9zdGF0dXM7CisJCWludCBpOworCisJCW1paV9waHkgPSBOVUxMOworCQlmb3IoaSA9IDA7IGkgPCAyOyBpKyspCisJCQltaWlfc3RhdHVzID0gbWRpb19yZWFkKG5ldF9kZXYsIHBoeV9hZGRyLCBNSUlfU1RBVFVTKTsKKworCQlpZiAobWlpX3N0YXR1cyA9PSAweGZmZmYgfHwgbWlpX3N0YXR1cyA9PSAweDAwMDApIHsKKwkJCWlmIChuZXRpZl9tc2dfcHJvYmUoc2lzX3ByaXYpKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTUlJIGF0IGFkZHJlc3MgJWQiCisJCQkJCQkiIG5vdCBhY2Nlc3NpYmxlXG4iLAorCQkJCQkJZGV2X25hbWUsIHBoeV9hZGRyKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCQorCQlpZiAoKG1paV9waHkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWlpX3BoeSksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW5ub3QgYWxsb2NhdGUgbWVtIGZvciBzdHJ1Y3QgbWlpX3BoeVxuIik7CisJCQltaWlfcGh5ID0gc2lzX3ByaXYtPmZpcnN0X21paTsKKwkJCXdoaWxlIChtaWlfcGh5KSB7CisJCQkJc3RydWN0IG1paV9waHkgKnBoeTsKKwkJCQlwaHkgPSBtaWlfcGh5OworCQkJCW1paV9waHkgPSBtaWlfcGh5LT5uZXh0OworCQkJCWtmcmVlKHBoeSk7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwkJbWlpX3BoeS0+cGh5X2lkMCA9IG1kaW9fcmVhZChuZXRfZGV2LCBwaHlfYWRkciwgTUlJX1BIWV9JRDApOworCQltaWlfcGh5LT5waHlfaWQxID0gbWRpb19yZWFkKG5ldF9kZXYsIHBoeV9hZGRyLCBNSUlfUEhZX0lEMSk7CQkKKwkJbWlpX3BoeS0+cGh5X2FkZHIgPSBwaHlfYWRkcjsKKwkJbWlpX3BoeS0+c3RhdHVzID0gbWlpX3N0YXR1czsKKwkJbWlpX3BoeS0+bmV4dCA9IHNpc19wcml2LT5taWk7CisJCXNpc19wcml2LT5taWkgPSBtaWlfcGh5OworCQlzaXNfcHJpdi0+Zmlyc3RfbWlpID0gbWlpX3BoeTsKKworCQlmb3IgKGkgPSAwOyBtaWlfY2hpcF90YWJsZVtpXS5waHlfaWQxOyBpKyspCisJCQlpZiAoKG1paV9waHktPnBoeV9pZDAgPT0gbWlpX2NoaXBfdGFibGVbaV0ucGh5X2lkMCApICYmCisJCQkgICAgKChtaWlfcGh5LT5waHlfaWQxICYgMHhGRkYwKSA9PSBtaWlfY2hpcF90YWJsZVtpXS5waHlfaWQxKSl7CisJCQkJbWlpX3BoeS0+cGh5X3R5cGVzID0gbWlpX2NoaXBfdGFibGVbaV0ucGh5X3R5cGVzOworCQkJCWlmIChtaWlfY2hpcF90YWJsZVtpXS5waHlfdHlwZXMgPT0gTUlYKQorCQkJCQltaWlfcGh5LT5waHlfdHlwZXMgPQorCQkJCQkgICAgKG1paV9zdGF0dXMgJiAoTUlJX1NUQVRfQ0FOX1RYX0ZEWCB8IE1JSV9TVEFUX0NBTl9UWCkpID8gTEFOIDogSE9NRTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgdHJhbnNjZWl2ZXIgZm91bmQgIgorCQkJCQkJCSJhdCBhZGRyZXNzICVkLlxuIiwKKwkJCQkJCQlkZXZfbmFtZSwKKwkJCQkJCQltaWlfY2hpcF90YWJsZVtpXS5uYW1lLAorCQkJCQkJCXBoeV9hZGRyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQlpZiggIW1paV9jaGlwX3RhYmxlW2ldLnBoeV9pZDEgKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5rbm93biBQSFkgdHJhbnNjZWl2ZXIgZm91bmQgYXQgYWRkcmVzcyAlZC5cbiIsCisJCQkgICAgICAgZGV2X25hbWUsIHBoeV9hZGRyKTsKKwkJCW1paV9waHktPnBoeV90eXBlcyA9IFVOS05PV047CisJCX0KKwl9CisJCisJaWYgKHNpc19wcml2LT5taWkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogTm8gTUlJIHRyYW5zY2VpdmVycyBmb3VuZCFcbiIsIGRldl9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogc2VsZWN0IGRlZmF1bHQgUEhZIGZvciBtYWMgKi8KKwlzaXNfcHJpdi0+bWlpID0gTlVMTDsKKwlzaXM5MDBfZGVmYXVsdF9waHkoIG5ldF9kZXYgKTsKKworCS8qIFJlc2V0IHBoeSBpZiBkZWZhdWx0IHBoeSBpcyBpbnRlcm5hbCBzaXM5MDAgKi8KKyAgICAgICAgaWYgKChzaXNfcHJpdi0+bWlpLT5waHlfaWQwID09IDB4MDAxRCkgJiYKKwkgICAgKChzaXNfcHJpdi0+bWlpLT5waHlfaWQxJjB4RkZGMCkgPT0gMHg4MDAwKSkKKyAgICAgICAgCXN0YXR1cyA9IHNpczkwMF9yZXNldF9waHkobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHkpOworICAgICAgICAKKyAgICAgICAgLyogd29ya2Fyb3VuZCBmb3IgSUNTMTg5MyBQSFkgKi8KKyAgICAgICAgaWYgKChzaXNfcHJpdi0+bWlpLT5waHlfaWQwID09IDB4MDAxNSkgJiYKKyAgICAgICAgICAgICgoc2lzX3ByaXYtPm1paS0+cGh5X2lkMSYweEZGRjApID09IDB4RjQ0MCkpCisgICAgICAgICAgICAJbWRpb193cml0ZShuZXRfZGV2LCBzaXNfcHJpdi0+Y3VyX3BoeSwgMHgwMDE4LCAweEQyMDApOworCisJaWYoc3RhdHVzICYgTUlJX1NUQVRfTElOSyl7CisJCXdoaWxlIChwb2xsX2JpdCkgeworCQkJeWllbGQoKTsKKworCQkJcG9sbF9iaXQgXj0gKG1kaW9fcmVhZChuZXRfZGV2LCBzaXNfcHJpdi0+Y3VyX3BoeSwgTUlJX1NUQVRVUykgJiBwb2xsX2JpdCk7CisJCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByZXNldCBwaHkgYW5kIGxpbmsgZG93biBub3dcbiIsCisJCQkJICAgICAgIGRldl9uYW1lKTsKKwkJCQlyZXR1cm4gLUVUSU1FOworCQkJfQorCQl9CisJfQorCisJaWYgKHNpc19wcml2LT5jaGlwc2V0X3JldiA9PSBTSVM2MzBFXzkwMF9SRVYpIHsKKwkJLyogU2lTIDYzMEUgaGFzIHNvbWUgYnVncyBvbiBkZWZhdWx0IHZhbHVlIG9mIFBIWSByZWdpc3RlcnMgKi8KKwkJbWRpb193cml0ZShuZXRfZGV2LCBzaXNfcHJpdi0+Y3VyX3BoeSwgTUlJX0FOQURWLCAweDA1ZTEpOworCQltZGlvX3dyaXRlKG5ldF9kZXYsIHNpc19wcml2LT5jdXJfcGh5LCBNSUlfQ09ORklHMSwgMHgyMik7CisJCW1kaW9fd3JpdGUobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIE1JSV9DT05GSUcyLCAweGZmMDApOworCQltZGlvX3dyaXRlKG5ldF9kZXYsIHNpc19wcml2LT5jdXJfcGh5LCBNSUlfTUFTSywgMHhmZmMwKTsKKwkJLy9tZGlvX3dyaXRlKG5ldF9kZXYsIHNpc19wcml2LT5jdXJfcGh5LCBNSUlfQ09OVFJPTCwgMHgxMDAwKTsJCisJfQorCisJaWYgKHNpc19wcml2LT5taWktPnN0YXR1cyAmIE1JSV9TVEFUX0xJTkspCisJCW5ldGlmX2NhcnJpZXJfb24obmV0X2Rldik7CisJZWxzZQorCQluZXRpZl9jYXJyaWVyX29mZihuZXRfZGV2KTsKKworCXJldHVybiAxOworfQorCisvKioKKyAqCXNpczkwMF9kZWZhdWx0X3BoeSAtIFNlbGVjdCBkZWZhdWx0IFBIWSBmb3Igc2lzOTAwIG1hYy4KKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBwcm9iZSBmb3IKKyAqCisgKglTZWxlY3QgZmlyc3QgZGV0ZWN0ZWQgUEhZIHdpdGggbGluayBhcyBkZWZhdWx0LgorICoJSWYgbm8gb25lIGlzIGxpbmsgb24sIHNlbGVjdCBQSFkgd2hvc2UgdHlwZXMgaXMgSE9NRSBhcyBkZWZhdWx0LgorICoJSWYgSE9NRSBkb2Vzbid0IGV4aXN0LCBzZWxlY3QgTEFOLgorICovCisKK3N0YXRpYyB1MTYgc2lzOTAwX2RlZmF1bHRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICogbmV0X2RldikKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKiBzaXNfcHJpdiA9IG5ldF9kZXYtPnByaXY7CisgCXN0cnVjdCBtaWlfcGh5ICpwaHkgPSBOVUxMLCAqcGh5X2hvbWUgPSBOVUxMLCAKKwkJKmRlZmF1bHRfcGh5ID0gTlVMTCwgKnBoeV9sYW4gPSBOVUxMOworCXUxNiBzdGF0dXM7CisKKyAgICAgICAgZm9yIChwaHk9c2lzX3ByaXYtPmZpcnN0X21paTsgcGh5OyBwaHk9cGh5LT5uZXh0KSB7CisJCXN0YXR1cyA9IG1kaW9fcmVhZChuZXRfZGV2LCBwaHktPnBoeV9hZGRyLCBNSUlfU1RBVFVTKTsKKwkJc3RhdHVzID0gbWRpb19yZWFkKG5ldF9kZXYsIHBoeS0+cGh5X2FkZHIsIE1JSV9TVEFUVVMpOworCisJCS8qIExpbmsgT04gJiBOb3Qgc2VsZWN0IGRlZmF1bHQgUEhZICYgbm90IGdob3N0IFBIWSAqLworCQkgaWYgKChzdGF0dXMgJiBNSUlfU1RBVF9MSU5LKSAmJiAhZGVmYXVsdF9waHkgJiYKKwkJCQkJKHBoeS0+cGh5X3R5cGVzICE9IFVOS05PV04pKQorCQkgCWRlZmF1bHRfcGh5ID0gcGh5OworCQkgZWxzZSB7CisJCQlzdGF0dXMgPSBtZGlvX3JlYWQobmV0X2RldiwgcGh5LT5waHlfYWRkciwgTUlJX0NPTlRST0wpOworCQkJbWRpb193cml0ZShuZXRfZGV2LCBwaHktPnBoeV9hZGRyLCBNSUlfQ09OVFJPTCwKKwkJCQlzdGF0dXMgfCBNSUlfQ05UTF9BVVRPIHwgTUlJX0NOVExfSVNPTEFURSk7CisJCQlpZiAocGh5LT5waHlfdHlwZXMgPT0gSE9NRSkKKwkJCQlwaHlfaG9tZSA9IHBoeTsKKwkJCWVsc2UgaWYocGh5LT5waHlfdHlwZXMgPT0gTEFOKQorCQkJCXBoeV9sYW4gPSBwaHk7CisJCSB9CisJfQorCisJaWYgKCFkZWZhdWx0X3BoeSAmJiBwaHlfaG9tZSkKKwkJZGVmYXVsdF9waHkgPSBwaHlfaG9tZTsKKwllbHNlIGlmICghZGVmYXVsdF9waHkgJiYgcGh5X2xhbikKKwkJZGVmYXVsdF9waHkgPSBwaHlfbGFuOworCWVsc2UgaWYgKCFkZWZhdWx0X3BoeSkKKwkJZGVmYXVsdF9waHkgPSBzaXNfcHJpdi0+Zmlyc3RfbWlpOworCisJaWYgKHNpc19wcml2LT5taWkgIT0gZGVmYXVsdF9waHkpIHsKKwkJc2lzX3ByaXYtPm1paSA9IGRlZmF1bHRfcGh5OworCQlzaXNfcHJpdi0+Y3VyX3BoeSA9IGRlZmF1bHRfcGh5LT5waHlfYWRkcjsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVzaW5nIHRyYW5zY2VpdmVyIGZvdW5kIGF0IGFkZHJlc3MgJWQgYXMgZGVmYXVsdFxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHNpc19wcml2LT5wY2lfZGV2KSwgc2lzX3ByaXYtPmN1cl9waHkpOworCX0KKwkKKwlzdGF0dXMgPSBtZGlvX3JlYWQobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIE1JSV9DT05UUk9MKTsKKwlzdGF0dXMgJj0gKH5NSUlfQ05UTF9JU09MQVRFKTsKKworCW1kaW9fd3JpdGUobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIE1JSV9DT05UUk9MLCBzdGF0dXMpOwkKKwlzdGF0dXMgPSBtZGlvX3JlYWQobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIE1JSV9TVEFUVVMpOworCXN0YXR1cyA9IG1kaW9fcmVhZChuZXRfZGV2LCBzaXNfcHJpdi0+Y3VyX3BoeSwgTUlJX1NUQVRVUyk7CisKKwlyZXR1cm4gc3RhdHVzOwkKK30KKworCisvKioKKyAqIAlzaXM5MDBfc2V0X2NhcGFiaWxpdHkgLSBzZXQgdGhlIG1lZGlhIGNhcGFiaWxpdHkgb2YgbmV0d29yayBhZGFwdGVyLgorICoJQG5ldF9kZXYgOiB0aGUgbmV0IGRldmljZSB0byBwcm9iZSBmb3IKKyAqCUBwaHkgOiBkZWZhdWx0IFBIWQorICoKKyAqCVNldCB0aGUgbWVkaWEgY2FwYWJpbGl0eSBvZiBuZXR3b3JrIGFkYXB0ZXIgYWNjb3JkaW5nIHRvCisgKgltaWkgc3RhdHVzIHJlZ2lzdGVyLiBJdCdzIG5lY2Vzc2FyeSBiZWZvcmUgYXV0by1uZWdvdGlhdGUuCisgKi8KKyAKK3N0YXRpYyB2b2lkIHNpczkwMF9zZXRfY2FwYWJpbGl0eShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldiwgc3RydWN0IG1paV9waHkgKnBoeSkKK3sKKwl1MTYgY2FwOworCXUxNiBzdGF0dXM7CisJCisJc3RhdHVzID0gbWRpb19yZWFkKG5ldF9kZXYsIHBoeS0+cGh5X2FkZHIsIE1JSV9TVEFUVVMpOworCXN0YXR1cyA9IG1kaW9fcmVhZChuZXRfZGV2LCBwaHktPnBoeV9hZGRyLCBNSUlfU1RBVFVTKTsKKwkKKwljYXAgPSBNSUlfTldBWV9DU01BX0NEIHwKKwkJKChwaHktPnN0YXR1cyAmIE1JSV9TVEFUX0NBTl9UWF9GRFgpPyBNSUlfTldBWV9UWF9GRFg6MCkgfAorCQkoKHBoeS0+c3RhdHVzICYgTUlJX1NUQVRfQ0FOX1RYKSAgICA/IE1JSV9OV0FZX1RYOjApIHwKKwkJKChwaHktPnN0YXR1cyAmIE1JSV9TVEFUX0NBTl9UX0ZEWCkgPyBNSUlfTldBWV9UX0ZEWDowKXwKKwkJKChwaHktPnN0YXR1cyAmIE1JSV9TVEFUX0NBTl9UKSAgICAgPyBNSUlfTldBWV9UOjApOworCisJbWRpb193cml0ZShuZXRfZGV2LCBwaHktPnBoeV9hZGRyLCBNSUlfQU5BRFYsIGNhcCk7Cit9CisKKworLyogRGVsYXkgYmV0d2VlbiBFRVBST00gY2xvY2sgdHJhbnNpdGlvbnMuICovCisjZGVmaW5lIGVlcHJvbV9kZWxheSgpICBpbmwoZWVfYWRkcikKKworLyoqCisgKglyZWFkX2VlcHJvbSAtIFJlYWQgU2VyaWFsIEVFUFJPTQorICoJQGlvYWRkcjogYmFzZSBpL28gYWRkcmVzcworICoJQGxvY2F0aW9uOiB0aGUgRUVQUk9NIGxvY2F0aW9uIHRvIHJlYWQKKyAqCisgKglSZWFkIFNlcmlhbCBFRVBST00gdGhyb3VnaCBFRVBST00gQWNjZXNzIFJlZ2lzdGVyLgorICoJTm90ZSB0aGF0IGxvY2F0aW9uIGlzIGluIHdvcmQgKDE2IGJpdHMpIHVuaXQKKyAqLworCitzdGF0aWMgdTE2IF9fZGV2aW5pdCByZWFkX2VlcHJvbShsb25nIGlvYWRkciwgaW50IGxvY2F0aW9uKQoreworCWludCBpOworCXUxNiByZXR2YWwgPSAwOworCWxvbmcgZWVfYWRkciA9IGlvYWRkciArIG1lYXI7CisJdTMyIHJlYWRfY21kID0gbG9jYXRpb24gfCBFRXJlYWQ7CisKKwlvdXRsKDAsIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheSgpOworCW91dGwoRUVDUywgZWVfYWRkcik7CisJZWVwcm9tX2RlbGF5KCk7CisKKwkvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kICg5KSBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSA4OyBpID49IDA7IGktLSkgeworCQl1MzIgZGF0YXZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IEVFREkgfCBFRUNTIDogRUVDUzsKKwkJb3V0bChkYXRhdmFsLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJCW91dGwoZGF0YXZhbCB8IEVFQ0xLLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJfQorCW91dGwoRUVDUywgZWVfYWRkcik7CisJZWVwcm9tX2RlbGF5KCk7CisKKwkvKiByZWFkIHRoZSAxNi1iaXRzIGRhdGEgaW4gKi8KKwlmb3IgKGkgPSAxNjsgaSA+IDA7IGktLSkgeworCQlvdXRsKEVFQ1MsIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkoKTsKKwkJb3V0bChFRUNTIHwgRUVDTEssIGVlX2FkZHIpOworCQllZXByb21fZGVsYXkoKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW5sKGVlX2FkZHIpICYgRUVETykgPyAxIDogMCk7CisJCWVlcHJvbV9kZWxheSgpOworCX0KKworCS8qIFRlcm1pbmF0ZSB0aGUgRUVQUk9NIGFjY2Vzcy4gKi8KKwlvdXRsKDAsIGVlX2FkZHIpOworCWVlcHJvbV9kZWxheSgpOworCisJcmV0dXJuIChyZXR2YWwpOworfQorCisvKiBSZWFkIGFuZCB3cml0ZSB0aGUgTUlJIG1hbmFnZW1lbnQgcmVnaXN0ZXJzIHVzaW5nIHNvZnR3YXJlLWdlbmVyYXRlZAorICAgc2VyaWFsIE1ESU8gcHJvdG9jb2wuIE5vdGUgdGhhdCB0aGUgY29tbWFuZCBiaXRzIGFuZCBkYXRhIGJpdHMgYXJlCisgICBzZW5kIG91dCBzZXBhcmF0ZWx5ICovCisjZGVmaW5lIG1kaW9fZGVsYXkoKSAgICBpbmwobWRpb19hZGRyKQorCitzdGF0aWMgdm9pZCBtZGlvX2lkbGUobG9uZyBtZGlvX2FkZHIpCit7CisJb3V0bChNRElPIHwgTURESVIsIG1kaW9fYWRkcik7CisJbWRpb19kZWxheSgpOworCW91dGwoTURJTyB8IE1ERElSIHwgTURDLCBtZGlvX2FkZHIpOworfQorCisvKiBTeW5jcm9uaXplIHRoZSBNSUkgbWFuYWdlbWVudCBpbnRlcmZhY2UgYnkgc2hpZnRpbmcgMzIgb25lIGJpdHMgb3V0LiAqLworc3RhdGljIHZvaWQgbWRpb19yZXNldChsb25nIG1kaW9fYWRkcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDMxOyBpID49IDA7IGktLSkgeworCQlvdXRsKE1ERElSIHwgTURJTywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlvdXRsKE1ERElSIHwgTURJTyB8IE1EQywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwlyZXR1cm47Cit9CisKKy8qKgorICoJbWRpb19yZWFkIC0gcmVhZCBNSUkgUEhZIHJlZ2lzdGVyCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gcmVhZAorICoJQHBoeV9pZDogdGhlIHBoeSBhZGRyZXNzIHRvIHJlYWQKKyAqCUBsb2NhdGlvbjogdGhlIHBoeSByZWdpZXN0ZXIgaWQgdG8gcmVhZAorICoKKyAqCVJlYWQgTUlJIHJlZ2lzdGVycyB0aHJvdWdoIE1ESU8gYW5kIE1EQworICoJdXNpbmcgTURJTyBtYW5hZ2VtZW50IGZyYW1lIHN0cnVjdHVyZSBhbmQgcHJvdG9jb2woZGVmaW5lZCBieSBJU08vSUVDKS4KKyAqCVBsZWFzZSBzZWUgU2lTNzAxNCBvciBJQ1Mgc3BlYworICovCisKK3N0YXRpYyB1MTYgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pCit7CisJbG9uZyBtZGlvX2FkZHIgPSBuZXRfZGV2LT5iYXNlX2FkZHIgKyBtZWFyOworCWludCBtaWlfY21kID0gTUlJcmVhZHwocGh5X2lkPDxNSUlwbWRTaGlmdCl8KGxvY2F0aW9uPDxNSUlyZWdTaGlmdCk7CisJdTE2IHJldHZhbCA9IDA7CisJaW50IGk7CisKKwltZGlvX3Jlc2V0KG1kaW9fYWRkcik7CisJbWRpb19pZGxlKG1kaW9fYWRkcik7CisKKwlmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGRhdGF2YWwgPSAobWlpX2NtZCAmICgxIDw8IGkpKSA/IE1ERElSIHwgTURJTyA6IE1ERElSOworCQlvdXRsKGRhdGF2YWwsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJb3V0bChkYXRhdmFsIHwgTURDLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJfQorCisJLyogUmVhZCB0aGUgMTYgZGF0YSBiaXRzLiAqLworCWZvciAoaSA9IDE2OyBpID4gMDsgaS0tKSB7CisJCW91dGwoMCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpbmwobWRpb19hZGRyKSAmIE1ESU8pID8gMSA6IDApOworCQlvdXRsKE1EQywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwlvdXRsKDB4MDAsIG1kaW9fYWRkcik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCW1kaW9fd3JpdGUgLSB3cml0ZSBNSUkgUEhZIHJlZ2lzdGVyCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gd3JpdGUKKyAqCUBwaHlfaWQ6IHRoZSBwaHkgYWRkcmVzcyB0byB3cml0ZQorICoJQGxvY2F0aW9uOiB0aGUgcGh5IHJlZ2llc3RlciBpZCB0byB3cml0ZQorICoJQHZhbHVlOiB0aGUgcmVnaXN0ZXIgdmFsdWUgdG8gd3JpdGUgd2l0aAorICoKKyAqCVdyaXRlIE1JSSByZWdpc3RlcnMgd2l0aCBAdmFsdWUgdGhyb3VnaCBNRElPIGFuZCBNREMKKyAqCXVzaW5nIE1ESU8gbWFuYWdlbWVudCBmcmFtZSBzdHJ1Y3R1cmUgYW5kIHByb3RvY29sKGRlZmluZWQgYnkgSVNPL0lFQykKKyAqCXBsZWFzZSBzZWUgU2lTNzAxNCBvciBJQ1Mgc3BlYworICovCisKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwKKwkJCWludCB2YWx1ZSkKK3sKKwlsb25nIG1kaW9fYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkciArIG1lYXI7CisJaW50IG1paV9jbWQgPSBNSUl3cml0ZXwocGh5X2lkPDxNSUlwbWRTaGlmdCl8KGxvY2F0aW9uPDxNSUlyZWdTaGlmdCk7CisJaW50IGk7CisKKwltZGlvX3Jlc2V0KG1kaW9fYWRkcik7CisJbWRpb19pZGxlKG1kaW9fYWRkcik7CisKKwkvKiBTaGlmdCB0aGUgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGRhdGF2YWwgPSAobWlpX2NtZCAmICgxIDw8IGkpKSA/IE1ERElSIHwgTURJTyA6IE1ERElSOworCQlvdXRiKGRhdGF2YWwsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJb3V0YihkYXRhdmFsIHwgTURDLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJfQorCW1kaW9fZGVsYXkoKTsKKworCS8qIFNoaWZ0IHRoZSB2YWx1ZSBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGRhdGF2YWwgPSAodmFsdWUgJiAoMSA8PCBpKSkgPyBNRERJUiB8IE1ESU8gOiBNRERJUjsKKwkJb3V0bChkYXRhdmFsLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJCW91dGwoZGF0YXZhbCB8IE1EQywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwltZGlvX2RlbGF5KCk7CisKKwkvKiBDbGVhciBvdXQgZXh0cmEgYml0cy4gKi8KKwlmb3IgKGkgPSAyOyBpID4gMDsgaS0tKSB7CisJCW91dGIoMCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlvdXRiKE1EQywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwlvdXRsKDB4MDAsIG1kaW9fYWRkcik7CisKKwlyZXR1cm47Cit9CisKKworLyoqCisgKglzaXM5MDBfcmVzZXRfcGh5IC0gcmVzZXQgc2lzOTAwIG1paSBwaHkuCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gd3JpdGUKKyAqCUBwaHlfYWRkcjogZGVmYXVsdCBwaHkgYWRkcmVzcworICoKKyAqCVNvbWUgc3BlY2lmaWMgcGh5IGNhbid0IHdvcmsgcHJvcGVybHkgd2l0aG91dCByZXNldC4KKyAqCVRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uIGFuZAorICoJbGluayBzdGF0dXMgY2hhbmdlIGZyb20gT04gdG8gRE9XTi4KKyAqLworCitzdGF0aWMgdTE2IHNpczkwMF9yZXNldF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGludCBwaHlfYWRkcikKK3sKKwlpbnQgaSA9IDA7CisJdTE2IHN0YXR1czsKKworCXdoaWxlIChpKysgPCAyKQorCQlzdGF0dXMgPSBtZGlvX3JlYWQobmV0X2RldiwgcGh5X2FkZHIsIE1JSV9TVEFUVVMpOworCisJbWRpb193cml0ZSggbmV0X2RldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MLCBNSUlfQ05UTF9SRVNFVCApOworCQorCXJldHVybiBzdGF0dXM7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorLyoKKyAqIFBvbGxpbmcgJ2ludGVycnVwdCcgLSB1c2VkIGJ5IHRoaW5ncyBsaWtlIG5ldGNvbnNvbGUgdG8gc2VuZCBza2JzCisgKiB3aXRob3V0IGhhdmluZyB0byByZS1lbmFibGUgaW50ZXJydXB0cy4gSXQncyBub3QgY2FsbGVkIHdoaWxlCisgKiB0aGUgaW50ZXJydXB0IHJvdXRpbmUgaXMgZXhlY3V0aW5nLgorKi8KK3N0YXRpYyB2b2lkIHNpczkwMF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCXNpczkwMF9pbnRlcnJ1cHQoZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7Cit9CisjZW5kaWYKKworLyoqCisgKglzaXM5MDBfb3BlbiAtIG9wZW4gc2lzOTAwIGRldmljZQorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIG9wZW4KKyAqCisgKglEbyBzb21lIGluaXRpYWxpemF0aW9uIGFuZCBzdGFydCBuZXQgaW50ZXJmYWNlLgorICoJZW5hYmxlIGludGVycnVwdHMgYW5kIHNldCBzaXM5MDAgdGltZXIuCisgKi8KKworc3RhdGljIGludAorc2lzOTAwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJc3RydWN0IHNpczkwMF9wcml2YXRlICpzaXNfcHJpdiA9IG5ldF9kZXYtPnByaXY7CisJbG9uZyBpb2FkZHIgPSBuZXRfZGV2LT5iYXNlX2FkZHI7CisJaW50IHJldDsKKworCS8qIFNvZnQgcmVzZXQgdGhlIGNoaXAuICovCisJc2lzOTAwX3Jlc2V0KG5ldF9kZXYpOworCisJLyogRXF1YWxpemVyIHdvcmthcm91bmQgUnVsZSAqLworCXNpczYzMF9zZXRfZXEobmV0X2Rldiwgc2lzX3ByaXYtPmNoaXBzZXRfcmV2KTsKKworCXJldCA9IHJlcXVlc3RfaXJxKG5ldF9kZXYtPmlycSwgJnNpczkwMF9pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJCQkJbmV0X2Rldi0+bmFtZSwgbmV0X2Rldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXNpczkwMF9pbml0X3J4ZmlsdGVyKG5ldF9kZXYpOworCisJc2lzOTAwX2luaXRfdHhfcmluZyhuZXRfZGV2KTsKKwlzaXM5MDBfaW5pdF9yeF9yaW5nKG5ldF9kZXYpOworCisJc2V0X3J4X21vZGUobmV0X2Rldik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShuZXRfZGV2KTsKKworCS8qIFdvcmthcm91bmQgZm9yIEVEQiAqLworCXNpczkwMF9zZXRfbW9kZShpb2FkZHIsIEhXX1NQRUVEXzEwX01CUFMsIEZEWF9DQVBBQkxFX0hBTEZfU0VMRUNURUQpOworCisJLyogRW5hYmxlIGFsbCBrbm93biBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCW91dGwoKFJ4U09WUnxSeE9STnxSeEVSUnxSeE9LfFR4VVJOfFR4RVJSfFR4SURMRSksIGlvYWRkciArIGltcik7CisJb3V0bChSeEVOQSB8IGlubChpb2FkZHIgKyBjciksIGlvYWRkciArIGNyKTsKKwlvdXRsKElFLCBpb2FkZHIgKyBpZXIpOworCisJc2lzOTAwX2NoZWNrX21vZGUobmV0X2Rldiwgc2lzX3ByaXYtPm1paSk7CisKKwkvKiBTZXQgdGhlIHRpbWVyIHRvIHN3aXRjaCB0byBjaGVjayBmb3IgbGluayBiZWF0IGFuZCBwZXJoYXBzIHN3aXRjaAorCSAgIHRvIGFuIGFsdGVybmF0ZSBtZWRpYSB0eXBlLiAqLworCWluaXRfdGltZXIoJnNpc19wcml2LT50aW1lcik7CisJc2lzX3ByaXYtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CisJc2lzX3ByaXYtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyluZXRfZGV2OworCXNpc19wcml2LT50aW1lci5mdW5jdGlvbiA9ICZzaXM5MDBfdGltZXI7CisJYWRkX3RpbWVyKCZzaXNfcHJpdi0+dGltZXIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2lzOTAwX2luaXRfcnhmaWx0ZXIgLSBJbml0aWFsaXplIHRoZSBSeCBmaWx0ZXIKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBpbml0aWFsaXplIGZvcgorICoKKyAqCVNldCByZWNlaXZlIGZpbHRlciBhZGRyZXNzIHRvIG91ciBNQUMgYWRkcmVzcworICoJYW5kIGVuYWJsZSBwYWNrZXQgZmlsdGVyaW5nLgorICovCisKK3N0YXRpYyB2b2lkCitzaXM5MDBfaW5pdF9yeGZpbHRlciAoc3RydWN0IG5ldF9kZXZpY2UgKiBuZXRfZGV2KQoreworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCWxvbmcgaW9hZGRyID0gbmV0X2Rldi0+YmFzZV9hZGRyOworCXUzMiByZmNyU2F2ZTsKKwl1MzIgaTsKKworCXJmY3JTYXZlID0gaW5sKHJmY3IgKyBpb2FkZHIpOworCisJLyogZGlzYWJsZSBwYWNrZXQgZmlsdGVyaW5nIGJlZm9yZSBzZXR0aW5nIGZpbHRlciAqLworCW91dGwocmZjclNhdmUgJiB+UkZFTiwgcmZjciArIGlvYWRkcik7CisKKwkvKiBsb2FkIE1BQyBhZGRyIHRvIGZpbHRlciBkYXRhIHJlZ2lzdGVyICovCisJZm9yIChpID0gMCA7IGkgPCAzIDsgaSsrKSB7CisJCXUzMiB3OworCisJCXcgPSAodTMyKSAqKCh1MTYgKikobmV0X2Rldi0+ZGV2X2FkZHIpK2kpOworCQlvdXRsKChpIDw8IFJGQUREUl9zaGlmdCksIGlvYWRkciArIHJmY3IpOworCQlvdXRsKHcsIGlvYWRkciArIHJmZHIpOworCisJCWlmIChuZXRpZl9tc2dfaHcoc2lzX3ByaXYpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlY2VpdmUgRmlsdGVyIEFkZHJzc1slZF09JXhcbiIsCisJCQkgICAgICAgbmV0X2Rldi0+bmFtZSwgaSwgaW5sKGlvYWRkciArIHJmZHIpKTsKKwkJfQorCX0KKworCS8qIGVuYWJsZSBwYWNrZXQgZmlsdGVyaW5nICovCisJb3V0bChyZmNyU2F2ZSB8IFJGRU4sIHJmY3IgKyBpb2FkZHIpOworfQorCisvKioKKyAqCXNpczkwMF9pbml0X3R4X3JpbmcgLSBJbml0aWFsaXplIHRoZSBUeCBkZXNjcmlwdG9yIHJpbmcKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBpbml0aWFsaXplIGZvcgorICoKKyAqCUluaXRpYWxpemUgdGhlIFR4IGRlc2NyaXB0b3IgcmluZywgCisgKi8KKworc3RhdGljIHZvaWQKK3NpczkwMF9pbml0X3R4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJc3RydWN0IHNpczkwMF9wcml2YXRlICpzaXNfcHJpdiA9IG5ldF9kZXYtPnByaXY7CisJbG9uZyBpb2FkZHIgPSBuZXRfZGV2LT5iYXNlX2FkZHI7CisJaW50IGk7CisKKwlzaXNfcHJpdi0+dHhfZnVsbCA9IDA7CisJc2lzX3ByaXYtPmRpcnR5X3R4ID0gc2lzX3ByaXYtPmN1cl90eCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKykgeworCQlzaXNfcHJpdi0+dHhfc2tidWZmW2ldID0gTlVMTDsKKworCQlzaXNfcHJpdi0+dHhfcmluZ1tpXS5saW5rID0gc2lzX3ByaXYtPnR4X3JpbmdfZG1hICsKKwkJCSgoaSsxKSVOVU1fVFhfREVTQykqc2l6ZW9mKEJ1ZmZlckRlc2MpOworCQlzaXNfcHJpdi0+dHhfcmluZ1tpXS5jbWRzdHMgPSAwOworCQlzaXNfcHJpdi0+dHhfcmluZ1tpXS5idWZwdHIgPSAwOworCX0KKworCS8qIGxvYWQgVHJhbnNtaXQgRGVzY3JpcHRvciBSZWdpc3RlciAqLworCW91dGwoc2lzX3ByaXYtPnR4X3JpbmdfZG1hLCBpb2FkZHIgKyB0eGRwKTsKKwlpZiAobmV0aWZfbXNnX2h3KHNpc19wcml2KSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUWCBkZXNjcmlwdG9yIHJlZ2lzdGVyIGxvYWRlZCB3aXRoOiAlOC44eFxuIiwKKwkJICAgICAgIG5ldF9kZXYtPm5hbWUsIGlubChpb2FkZHIgKyB0eGRwKSk7Cit9CisKKy8qKgorICoJc2lzOTAwX2luaXRfcnhfcmluZyAtIEluaXRpYWxpemUgdGhlIFJ4IGRlc2NyaXB0b3IgcmluZworICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIGluaXRpYWxpemUgZm9yCisgKgorICoJSW5pdGlhbGl6ZSB0aGUgUnggZGVzY3JpcHRvciByaW5nLCAKKyAqCWFuZCBwcmUtYWxsb2NhdGUgcmVjZXZpZSBidWZmZXJzIChzb2NrZXQgYnVmZmVyKQorICovCisKK3N0YXRpYyB2b2lkIAorc2lzOTAwX2luaXRfcnhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwlsb25nIGlvYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsKKwlpbnQgaTsKKworCXNpc19wcml2LT5jdXJfcnggPSAwOworCXNpc19wcml2LT5kaXJ0eV9yeCA9IDA7CisKKwkvKiBpbml0IFJYIGRlc2NyaXB0b3IgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0RFU0M7IGkrKykgeworCQlzaXNfcHJpdi0+cnhfc2tidWZmW2ldID0gTlVMTDsKKworCQlzaXNfcHJpdi0+cnhfcmluZ1tpXS5saW5rID0gc2lzX3ByaXYtPnJ4X3JpbmdfZG1hICsKKwkJCSgoaSsxKSVOVU1fUlhfREVTQykqc2l6ZW9mKEJ1ZmZlckRlc2MpOworCQlzaXNfcHJpdi0+cnhfcmluZ1tpXS5jbWRzdHMgPSAwOworCQlzaXNfcHJpdi0+cnhfcmluZ1tpXS5idWZwdHIgPSAwOworCX0KKworCS8qIGFsbG9jYXRlIHNvY2sgYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfREVTQzsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKFJYX0JVRl9TSVpFKSkgPT0gTlVMTCkgeworCQkJLyogbm90IGVub3VnaCBtZW1vcnkgZm9yIHNrYnVmZiwgdGhpcyBtYWtlcyBhICJob2xlIgorCQkJICAgb24gdGhlIGJ1ZmZlciByaW5nLCBpdCBpcyBub3QgY2xlYXIgaG93IHRoZQorCQkJICAgaGFyZHdhcmUgd2lsbCByZWFjdCB0byB0aGlzIGtpbmQgb2YgZGVnZW5lcmF0ZWQKKwkJCSAgIGJ1ZmZlciAqLworCQkJYnJlYWs7CisJCX0KKwkJc2tiLT5kZXYgPSBuZXRfZGV2OworCQlzaXNfcHJpdi0+cnhfc2tidWZmW2ldID0gc2tiOworCQlzaXNfcHJpdi0+cnhfcmluZ1tpXS5jbWRzdHMgPSBSWF9CVUZfU0laRTsKKyAgICAgICAgICAgICAgICBzaXNfcHJpdi0+cnhfcmluZ1tpXS5idWZwdHIgPSBwY2lfbWFwX3NpbmdsZShzaXNfcHJpdi0+cGNpX2RldiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+dGFpbCwgUlhfQlVGX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJfQorCXNpc19wcml2LT5kaXJ0eV9yeCA9ICh1bnNpZ25lZCBpbnQpIChpIC0gTlVNX1JYX0RFU0MpOworCisJLyogbG9hZCBSZWNlaXZlIERlc2NyaXB0b3IgUmVnaXN0ZXIgKi8KKwlvdXRsKHNpc19wcml2LT5yeF9yaW5nX2RtYSwgaW9hZGRyICsgcnhkcCk7CisJaWYgKG5ldGlmX21zZ19odyhzaXNfcHJpdikpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUlggZGVzY3JpcHRvciByZWdpc3RlciBsb2FkZWQgd2l0aDogJTguOHhcbiIsCisJCSAgICAgICBuZXRfZGV2LT5uYW1lLCBpbmwoaW9hZGRyICsgcnhkcCkpOworfQorCisvKioKKyAqCXNpczYzMF9zZXRfZXEgLSBzZXQgcGh5IGVxdWFsaXplciB2YWx1ZSBmb3IgNjMwIExBTgorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIHNldCBlcXVhbGl6ZXIgdmFsdWUKKyAqCUByZXZpc2lvbjogNjMwIExBTiByZXZpc2lvbiBudW1iZXIKKyAqCisgKgk2MzBFIGVxdWFsaXplciB3b3JrYXJvdW5kIHJ1bGUoQ3lydXMgSHVhbmcgMDgvMTUpCisgKglQSFkgcmVnaXN0ZXIgMTRoKFRlc3QpCisgKglCaXQgMTQ6IDAgLS0gQXV0b21hdGljYWxseSBkZWN0ZWN0IChkZWZhdWx0KQorICoJCTEgLS0gTWFudWFsbHkgc2V0IEVxdWFsaXplciBmaWx0ZXIKKyAqCUJpdCAxMzogMCAtLSAoRGVmYXVsdCkKKyAqCQkxIC0tIFNwZWVkIHVwIGNvbnZlcmdlbmNlIG9mIGVxdWFsaXplciBzZXR0aW5nCisgKglCaXQgOSA6IDAgLS0gKERlZmF1bHQpCisgKgkJMSAtLSBEaXNhYmxlIEJhc2VsaW5lIFdhbmRlcgorICoJQml0IDN+NyAgIC0tIEVxdWFsaXplciBmaWx0ZXIgc2V0dGluZworICoJTGluayBPTjogU2V0IEJpdCA5LCAxMyB0byAxLCBCaXQgMTQgdG8gMAorICoJVGhlbiBjYWxjdWxhdGUgZXF1YWxpemVyIHZhbHVlCisgKglUaGVuIHNldCBlcXVhbGl6ZXIgdmFsdWUsIGFuZCBzZXQgQml0IDE0IHRvIDEsIEJpdCA5IHRvIDAKKyAqCUxpbmsgT2ZmOlNldCBCaXQgMTMgdG8gMSwgQml0IDE0IHRvIDAKKyAqCUNhbGN1bGF0ZSBFcXVhbGl6ZXIgdmFsdWU6CisgKglXaGVuIExpbmsgaXMgT04gYW5kIEJpdCAxNCBpcyAwLCBTSVM5MDBQSFkgd2lsbCBhdXRvLWRlY3RlY3QgcHJvcGVyIGVxdWFsaXplciB2YWx1ZS4KKyAqCVdoZW4gdGhlIGVxdWFsaXplciBpcyBzdGFibGUsIHRoaXMgdmFsdWUgaXMgbm90IGEgZml4ZWQgdmFsdWUuIEl0IHdpbGwgYmUgd2l0aGluCisgKglhIHNtYWxsIHJhbmdlKGVnLiA3fjkpLiBUaGVuIHdlIGdldCBhIG1pbmltdW0gYW5kIGEgbWF4aW11bSB2YWx1ZShlZy4gbWluPTcsIG1heD05KQorICoJMCA8PSBtYXggPD0gNCAgLS0+IHNldCBlcXVhbGl6ZXIgdG8gbWF4CisgKgk1IDw9IG1heCA8PSAxNCAtLT4gc2V0IGVxdWFsaXplciB0byBtYXgrMSBvciBzZXQgZXF1YWxpemVyIHRvIG1heCsyIGlmIG1heCA9PSBtaW4KKyAqCW1heCA+PSAxNSAgICAgIC0tPiBzZXQgZXF1YWxpemVyIHRvIG1heCs1IG9yIHNldCBlcXVhbGl6ZXIgdG8gbWF4KzYgaWYgbWF4ID09IG1pbgorICovCisKK3N0YXRpYyB2b2lkIHNpczYzMF9zZXRfZXEoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIHU4IHJldmlzaW9uKQoreworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCXUxNiByZWcxNGgsIGVxX3ZhbHVlPTAsIG1heF92YWx1ZT0wLCBtaW5fdmFsdWU9MDsKKwlpbnQgaSwgbWF4Y291bnQ9MTA7CisKKwlpZiAoICEocmV2aXNpb24gPT0gU0lTNjMwRV85MDBfUkVWIHx8IHJldmlzaW9uID09IFNJUzYzMEVBMV85MDBfUkVWIHx8CisJICAgICAgIHJldmlzaW9uID09IFNJUzYzMEFfOTAwX1JFViB8fCByZXZpc2lvbiA9PSAgU0lTNjMwRVRfOTAwX1JFVikgKQorCQlyZXR1cm47CisKKwlpZiAobmV0aWZfY2Fycmllcl9vayhuZXRfZGV2KSkgeworCQlyZWcxNGggPSBtZGlvX3JlYWQobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIE1JSV9SRVNWKTsKKwkJbWRpb193cml0ZShuZXRfZGV2LCBzaXNfcHJpdi0+Y3VyX3BoeSwgTUlJX1JFU1YsCisJCQkJCSgweDIyMDAgfCByZWcxNGgpICYgMHhCRkZGKTsKKwkJZm9yIChpPTA7IGkgPCBtYXhjb3VudDsgaSsrKSB7CisJCQllcV92YWx1ZSA9ICgweDAwRjggJiBtZGlvX3JlYWQobmV0X2RldiwKKwkJCQkJc2lzX3ByaXYtPmN1cl9waHksIE1JSV9SRVNWKSkgPj4gMzsKKwkJCWlmIChpID09IDApCisJCQkJbWF4X3ZhbHVlPW1pbl92YWx1ZT1lcV92YWx1ZTsKKwkJCW1heF92YWx1ZSA9IChlcV92YWx1ZSA+IG1heF92YWx1ZSkgPworCQkJCQkJZXFfdmFsdWUgOiBtYXhfdmFsdWU7CisJCQltaW5fdmFsdWUgPSAoZXFfdmFsdWUgPCBtaW5fdmFsdWUpID8KKwkJCQkJCWVxX3ZhbHVlIDogbWluX3ZhbHVlOworCQl9CisJCS8qIDYzMEUgcnVsZSB0byBkZXRlcm1pbmUgdGhlIGVxdWFsaXplciB2YWx1ZSAqLworCQlpZiAocmV2aXNpb24gPT0gU0lTNjMwRV85MDBfUkVWIHx8IHJldmlzaW9uID09IFNJUzYzMEVBMV85MDBfUkVWIHx8CisJCSAgICByZXZpc2lvbiA9PSBTSVM2MzBFVF85MDBfUkVWKSB7CisJCQlpZiAobWF4X3ZhbHVlIDwgNSkKKwkJCQllcV92YWx1ZSA9IG1heF92YWx1ZTsKKwkJCWVsc2UgaWYgKG1heF92YWx1ZSA+PSA1ICYmIG1heF92YWx1ZSA8IDE1KQorCQkJCWVxX3ZhbHVlID0gKG1heF92YWx1ZSA9PSBtaW5fdmFsdWUpID8KKwkJCQkJCW1heF92YWx1ZSsyIDogbWF4X3ZhbHVlKzE7CisJCQllbHNlIGlmIChtYXhfdmFsdWUgPj0gMTUpCisJCQkJZXFfdmFsdWU9KG1heF92YWx1ZSA9PSBtaW5fdmFsdWUpID8KKwkJCQkJCW1heF92YWx1ZSs2IDogbWF4X3ZhbHVlKzU7CisJCX0KKwkJLyogNjMwQjAmQjEgcnVsZSB0byBkZXRlcm1pbmUgdGhlIGVxdWFsaXplciB2YWx1ZSAqLworCQlpZiAocmV2aXNpb24gPT0gU0lTNjMwQV85MDBfUkVWICYmIAorCQkgICAgKHNpc19wcml2LT5ob3N0X2JyaWRnZV9yZXYgPT0gU0lTNjMwQjAgfHwgCisJCSAgICAgc2lzX3ByaXYtPmhvc3RfYnJpZGdlX3JldiA9PSBTSVM2MzBCMSkpIHsKKwkJCWlmIChtYXhfdmFsdWUgPT0gMCkKKwkJCQllcV92YWx1ZSA9IDM7CisJCQllbHNlCisJCQkJZXFfdmFsdWUgPSAobWF4X3ZhbHVlICsgbWluX3ZhbHVlICsgMSkvMjsKKwkJfQorCQkvKiB3cml0ZSBlcXVhbGl6ZXIgdmFsdWUgYW5kIHNldHRpbmcgKi8KKwkJcmVnMTRoID0gbWRpb19yZWFkKG5ldF9kZXYsIHNpc19wcml2LT5jdXJfcGh5LCBNSUlfUkVTVik7CisJCXJlZzE0aCA9IChyZWcxNGggJiAweEZGMDcpIHwgKChlcV92YWx1ZSA8PCAzKSAmIDB4MDBGOCk7CisJCXJlZzE0aCA9IChyZWcxNGggfCAweDYwMDApICYgMHhGREZGOworCQltZGlvX3dyaXRlKG5ldF9kZXYsIHNpc19wcml2LT5jdXJfcGh5LCBNSUlfUkVTViwgcmVnMTRoKTsKKwl9IGVsc2UgeworCQlyZWcxNGggPSBtZGlvX3JlYWQobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIE1JSV9SRVNWKTsKKwkJaWYgKHJldmlzaW9uID09IFNJUzYzMEFfOTAwX1JFViAmJiAKKwkJICAgIChzaXNfcHJpdi0+aG9zdF9icmlkZ2VfcmV2ID09IFNJUzYzMEIwIHx8IAorCQkgICAgIHNpc19wcml2LT5ob3N0X2JyaWRnZV9yZXYgPT0gU0lTNjMwQjEpKSAKKwkJCW1kaW9fd3JpdGUobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIE1JSV9SRVNWLAorCQkJCQkJKHJlZzE0aCB8IDB4MjIwMCkgJiAweEJGRkYpOworCQllbHNlCisJCQltZGlvX3dyaXRlKG5ldF9kZXYsIHNpc19wcml2LT5jdXJfcGh5LCBNSUlfUkVTViwKKwkJCQkJCShyZWcxNGggfCAweDIwMDApICYgMHhCRkZGKTsKKwl9CisJcmV0dXJuOworfQorCisvKioKKyAqCXNpczkwMF90aW1lciAtIHNpczkwMCB0aW1lciByb3V0aW5lCisgKglAZGF0YTogcG9pbnRlciB0byBzaXM5MDAgbmV0IGRldmljZQorICoKKyAqCU9uIGVhY2ggdGltZXIgdGlja3Mgd2UgY2hlY2sgdHdvIHRoaW5ncywgCisgKglsaW5rIHN0YXR1cyAoT04vT0ZGKSBhbmQgbGluayBtb2RlICgxMC8xMDAvRnVsbC9IYWxmKQorICovCisKK3N0YXRpYyB2b2lkIHNpczkwMF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCXN0cnVjdCBtaWlfcGh5ICptaWlfcGh5ID0gc2lzX3ByaXYtPm1paTsKKwlzdGF0aWMgaW50IG5leHRfdGljayA9IDUqSFo7CisJdTE2IHN0YXR1czsKKworCWlmICghc2lzX3ByaXYtPmF1dG9uZ19jb21wbGV0ZSl7CisJCWludCBzcGVlZCwgZHVwbGV4ID0gMDsKKworCQlzaXM5MDBfcmVhZF9tb2RlKG5ldF9kZXYsICZzcGVlZCwgJmR1cGxleCk7CisJCWlmIChkdXBsZXgpeworCQkJc2lzOTAwX3NldF9tb2RlKG5ldF9kZXYtPmJhc2VfYWRkciwgc3BlZWQsIGR1cGxleCk7CisJCQlzaXM2MzBfc2V0X2VxKG5ldF9kZXYsIHNpc19wcml2LT5jaGlwc2V0X3Jldik7CisJCQluZXRpZl9zdGFydF9xdWV1ZShuZXRfZGV2KTsKKwkJfQorCisJCXNpc19wcml2LT50aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaOworCQlhZGRfdGltZXIoJnNpc19wcml2LT50aW1lcik7CisJCXJldHVybjsKKwl9CisKKwlzdGF0dXMgPSBtZGlvX3JlYWQobmV0X2Rldiwgc2lzX3ByaXYtPmN1cl9waHksIE1JSV9TVEFUVVMpOworCXN0YXR1cyA9IG1kaW9fcmVhZChuZXRfZGV2LCBzaXNfcHJpdi0+Y3VyX3BoeSwgTUlJX1NUQVRVUyk7CisKKwkvKiBMaW5rIE9GRiAtPiBPTiAqLworCWlmICghbmV0aWZfY2Fycmllcl9vayhuZXRfZGV2KSkgeworCUxvb2tGb3JMaW5rOgorCQkvKiBTZWFyY2ggZm9yIG5ldyBQSFkgKi8KKwkJc3RhdHVzID0gc2lzOTAwX2RlZmF1bHRfcGh5KG5ldF9kZXYpOworCQltaWlfcGh5ID0gc2lzX3ByaXYtPm1paTsKKworCQlpZiAoc3RhdHVzICYgTUlJX1NUQVRfTElOSyl7CisJCQlzaXM5MDBfY2hlY2tfbW9kZShuZXRfZGV2LCBtaWlfcGh5KTsKKwkJCW5ldGlmX2NhcnJpZXJfb24obmV0X2Rldik7CisJCX0KKwl9IGVsc2UgeworCS8qIExpbmsgT04gLT4gT0ZGICovCisgICAgICAgICAgICAgICAgaWYgKCEoc3RhdHVzICYgTUlJX1NUQVRfTElOSykpeworICAgICAgICAgICAgICAgIAluZXRpZl9jYXJyaWVyX29mZihuZXRfZGV2KTsKKwkJCWlmKG5ldGlmX21zZ19saW5rKHNpc19wcml2KSkKKyAgICAgICAgICAgICAgICAJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNZWRpYSBMaW5rIE9mZlxuIiwgbmV0X2Rldi0+bmFtZSk7CisKKyAgICAgICAgICAgICAgICAJLyogQ2hhbmdlIG1vZGUgaXNzdWUgKi8KKyAgICAgICAgICAgICAgICAJaWYgKChtaWlfcGh5LT5waHlfaWQwID09IDB4MDAxRCkgJiYgCisJCQkgICAgKChtaWlfcGh5LT5waHlfaWQxICYgMHhGRkYwKSA9PSAweDgwMDApKQorICAgICAgICAgICAgICAgCQkJc2lzOTAwX3Jlc2V0X3BoeShuZXRfZGV2LCAgc2lzX3ByaXYtPmN1cl9waHkpOworICAKKwkJCXNpczYzMF9zZXRfZXEobmV0X2Rldiwgc2lzX3ByaXYtPmNoaXBzZXRfcmV2KTsKKyAgCisgICAgICAgICAgICAgICAgCWdvdG8gTG9va0Zvckxpbms7CisgICAgICAgICAgICAgICAgfQorCX0KKworCXNpc19wcml2LT50aW1lci5leHBpcmVzID0gamlmZmllcyArIG5leHRfdGljazsKKwlhZGRfdGltZXIoJnNpc19wcml2LT50aW1lcik7Cit9CisKKy8qKgorICoJc2lzOTAwX2NoZWNrX21vZGUgLSBjaGVjayB0aGUgbWVkaWEgbW9kZSBmb3Igc2lzOTAwCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gYmUgY2hlY2tlZAorICoJQG1paV9waHk6IHRoZSBtaWkgcGh5CisgKgorICoJT2xkZXIgZHJpdmVyIGdldHMgdGhlIG1lZGlhIG1vZGUgZnJvbSBtaWkgc3RhdHVzIG91dHB1dAorICoJcmVnaXN0ZXIuIE5vdyB3ZSBzZXQgb3VyIG1lZGlhIGNhcGFiaWxpdHkgYW5kIGF1dG8tbmVnb3RpYXRlCisgKgl0byBnZXQgdGhlIHVwcGVyIGJvdW5kIG9mIHNwZWVkIGFuZCBkdXBsZXggYmV0d2VlbiB0d28gZW5kcy4KKyAqCUlmIHRoZSB0eXBlcyBvZiBtaWkgcGh5IGlzIEhPTUUsIGl0IGRvZXNuJ3QgbmVlZCB0byBhdXRvLW5lZ290aWF0ZQorICoJYW5kIGF1dG9uZ19jb21wbGV0ZSBzaG91bGQgYmUgc2V0IHRvIDEuCisgKi8KKworc3RhdGljIHZvaWQgc2lzOTAwX2NoZWNrX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIHN0cnVjdCBtaWlfcGh5ICptaWlfcGh5KQoreworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCWxvbmcgaW9hZGRyID0gbmV0X2Rldi0+YmFzZV9hZGRyOworCWludCBzcGVlZCwgZHVwbGV4OworCisJaWYgKG1paV9waHktPnBoeV90eXBlcyA9PSBMQU4pIHsKKwkJb3V0bCh+RVhEICYgaW5sKGlvYWRkciArIGNmZyksIGlvYWRkciArIGNmZyk7CisJCXNpczkwMF9zZXRfY2FwYWJpbGl0eShuZXRfZGV2ICwgbWlpX3BoeSk7CisJCXNpczkwMF9hdXRvX25lZ290aWF0ZShuZXRfZGV2LCBzaXNfcHJpdi0+Y3VyX3BoeSk7CisJfSBlbHNlIHsKKwkJb3V0bChFWEQgfCBpbmwoaW9hZGRyICsgY2ZnKSwgaW9hZGRyICsgY2ZnKTsKKwkJc3BlZWQgPSBIV19TUEVFRF9IT01FOworCQlkdXBsZXggPSBGRFhfQ0FQQUJMRV9IQUxGX1NFTEVDVEVEOworCQlzaXM5MDBfc2V0X21vZGUoaW9hZGRyLCBzcGVlZCwgZHVwbGV4KTsKKwkJc2lzX3ByaXYtPmF1dG9uZ19jb21wbGV0ZSA9IDE7CisJfQorfQorCisvKioKKyAqCXNpczkwMF9zZXRfbW9kZSAtIFNldCB0aGUgbWVkaWEgbW9kZSBvZiBtYWMgcmVnaXN0ZXIuCisgKglAaW9hZGRyOiB0aGUgYWRkcmVzcyBvZiB0aGUgZGV2aWNlCisgKglAc3BlZWQgOiB0aGUgdHJhbnNtaXQgc3BlZWQgdG8gYmUgZGV0ZXJtaW5lZAorICoJQGR1cGxleDogdGhlIGR1cGxleCBtb2RlIHRvIGJlIGRldGVybWluZWQKKyAqCisgKglTZXQgdGhlIG1lZGlhIG1vZGUgb2YgbWFjIHJlZ2lzdGVyIHR4Y2ZnL3J4Y2ZnIGFjY29yZGluZyB0bworICoJc3BlZWQgYW5kIGR1cGxleCBvZiBwaHkuIEJpdCBFREJfTUFTVEVSX0VOIGluZGljYXRlcyB0aGUgRURCCisgKglidXMgaXMgdXNlZCBpbnN0ZWFkIG9mIFBDSSBidXMuIFdoZW4gdGhpcyBiaXQgaXMgc2V0IDEsIHRoZQorICoJTWF4IERNQSBCdXJzdCBTaXplIGZvciBUWC9SWCBETUEgc2hvdWxkIGJlIG5vIGxhcmdlciB0aGFuIDE2CisgKglkb3VibGUgd29yZHMuCisgKi8KKworc3RhdGljIHZvaWQgc2lzOTAwX3NldF9tb2RlIChsb25nIGlvYWRkciwgaW50IHNwZWVkLCBpbnQgZHVwbGV4KQoreworCXUzMiB0eF9mbGFncyA9IDAsIHJ4X2ZsYWdzID0gMDsKKworCWlmIChpbmwoaW9hZGRyICsgY2ZnKSAmIEVEQl9NQVNURVJfRU4pIHsKKwkJdHhfZmxhZ3MgPSBUeEFUUCB8IChETUFfQlVSU1RfNjQgPDwgVHhNWERNQV9zaGlmdCkgfAorCQkJCQkoVFhfRklMTF9USFJFU0ggPDwgVHhGSUxMVF9zaGlmdCk7CisJCXJ4X2ZsYWdzID0gRE1BX0JVUlNUXzY0IDw8IFJ4TVhETUFfc2hpZnQ7CisJfSBlbHNlIHsKKwkJdHhfZmxhZ3MgPSBUeEFUUCB8IChETUFfQlVSU1RfNTEyIDw8IFR4TVhETUFfc2hpZnQpIHwKKwkJCQkJKFRYX0ZJTExfVEhSRVNIIDw8IFR4RklMTFRfc2hpZnQpOworCQlyeF9mbGFncyA9IERNQV9CVVJTVF81MTIgPDwgUnhNWERNQV9zaGlmdDsKKwl9CisKKwlpZiAoc3BlZWQgPT0gSFdfU1BFRURfSE9NRSB8fCBzcGVlZCA9PSBIV19TUEVFRF8xMF9NQlBTKSB7CisJCXJ4X2ZsYWdzIHw9IChSeERSTlRfMTAgPDwgUnhEUk5UX3NoaWZ0KTsKKwkJdHhfZmxhZ3MgfD0gKFR4RFJOVF8xMCA8PCBUeERSTlRfc2hpZnQpOworCX0gZWxzZSB7CisJCXJ4X2ZsYWdzIHw9IChSeERSTlRfMTAwIDw8IFJ4RFJOVF9zaGlmdCk7CisJCXR4X2ZsYWdzIHw9IChUeERSTlRfMTAwIDw8IFR4RFJOVF9zaGlmdCk7CisJfQorCisJaWYgKGR1cGxleCA9PSBGRFhfQ0FQQUJMRV9GVUxMX1NFTEVDVEVEKSB7CisJCXR4X2ZsYWdzIHw9IChUeENTSSB8IFR4SEJJKTsKKwkJcnhfZmxhZ3MgfD0gUnhBVFg7CisJfQorCisJb3V0bCAodHhfZmxhZ3MsIGlvYWRkciArIHR4Y2ZnKTsKKwlvdXRsIChyeF9mbGFncywgaW9hZGRyICsgcnhjZmcpOworfQorCisvKioKKyAqCXNpczkwMF9hdXRvX25lZ290aWF0ZSAtIFNldCB0aGUgQXV0by1OZWdvdGlhdGlvbiBFbmFibGUvUmVzZXQgYml0LgorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIHJlYWQgbW9kZSBmb3IKKyAqCUBwaHlfYWRkcjogbWlpIHBoeSBhZGRyZXNzCisgKgorICoJSWYgdGhlIGFkYXB0ZXIgaXMgbGluay1vbiwgc2V0IHRoZSBhdXRvLW5lZ290aWF0ZSBlbmFibGUvcmVzZXQgYml0LgorICoJYXV0b25nX2NvbXBsZXRlIHNob3VsZCBiZSBzZXQgdG8gMCB3aGVuIHN0YXJ0aW5nIGF1dG8tbmVnb3RpYXRpb24uCisgKglhdXRvbmdfY29tcGxldGUgc2hvdWxkIGJlIHNldCB0byAxIGlmIHdlIGRpZG4ndCBzdGFydCBhdXRvLW5lZ290aWF0aW9uLgorICoJc2lzOTAwX3RpbWVyIHdpbGwgd2FpdCBmb3IgbGluayBvbiBhZ2FpbiBpZiBhdXRvbmdfY29tcGxldGUgPSAwLgorICovCisKK3N0YXRpYyB2b2lkIHNpczkwMF9hdXRvX25lZ290aWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgaW50IHBoeV9hZGRyKQoreworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCWludCBpID0gMDsKKwl1MzIgc3RhdHVzOworCQorCXdoaWxlIChpKysgPCAyKQorCQlzdGF0dXMgPSBtZGlvX3JlYWQobmV0X2RldiwgcGh5X2FkZHIsIE1JSV9TVEFUVVMpOworCisJaWYgKCEoc3RhdHVzICYgTUlJX1NUQVRfTElOSykpeworCQlpZihuZXRpZl9tc2dfbGluayhzaXNfcHJpdikpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogTWVkaWEgTGluayBPZmZcbiIsIG5ldF9kZXYtPm5hbWUpOworCQlzaXNfcHJpdi0+YXV0b25nX2NvbXBsZXRlID0gMTsKKwkJbmV0aWZfY2Fycmllcl9vZmYobmV0X2Rldik7CisJCXJldHVybjsKKwl9CisKKwkvKiAoUmUpc3RhcnQgQXV0b05lZ290aWF0ZSAqLworCW1kaW9fd3JpdGUobmV0X2RldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MLAorCQkgICBNSUlfQ05UTF9BVVRPIHwgTUlJX0NOVExfUlNUX0FVVE8pOworCXNpc19wcml2LT5hdXRvbmdfY29tcGxldGUgPSAwOworfQorCisKKy8qKgorICoJc2lzOTAwX3JlYWRfbW9kZSAtIHJlYWQgbWVkaWEgbW9kZSBmb3Igc2lzOTAwIGludGVybmFsIHBoeQorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIHJlYWQgbW9kZSBmb3IKKyAqCUBzcGVlZCAgOiB0aGUgdHJhbnNtaXQgc3BlZWQgdG8gYmUgZGV0ZXJtaW5lZAorICoJQGR1cGxleCA6IHRoZSBkdXBsZXggbW9kZSB0byBiZSBkZXRlcm1pbmVkCisgKgorICoJVGhlIGNhcGFiaWxpdHkgb2YgcmVtb3RlIGVuZCB3aWxsIGJlIHB1dCBpbiBtaWkgcmVnaXN0ZXIgYXV0b3JlYworICoJYWZ0ZXIgYXV0by1uZWdvdGlhdGlvbi4gVXNlIEFORCBvcGVyYXRpb24gdG8gZ2V0IHRoZSB1cHBlciBib3VuZAorICoJb2Ygc3BlZWQgYW5kIGR1cGxleCBiZXR3ZWVuIHR3byBlbmRzLgorICovCisKK3N0YXRpYyB2b2lkIHNpczkwMF9yZWFkX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGludCAqc3BlZWQsIGludCAqZHVwbGV4KQoreworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCXN0cnVjdCBtaWlfcGh5ICpwaHkgPSBzaXNfcHJpdi0+bWlpOworCWludCBwaHlfYWRkciA9IHNpc19wcml2LT5jdXJfcGh5OworCXUzMiBzdGF0dXM7CisJdTE2IGF1dG9hZHYsIGF1dG9yZWM7CisJaW50IGkgPSAwOworCisJd2hpbGUgKGkrKyA8IDIpCisJCXN0YXR1cyA9IG1kaW9fcmVhZChuZXRfZGV2LCBwaHlfYWRkciwgTUlJX1NUQVRVUyk7CisKKwlpZiAoIShzdGF0dXMgJiBNSUlfU1RBVF9MSU5LKSkKKwkJcmV0dXJuOworCisJLyogQXV0b05lZ290aWF0ZSBjb21wbGV0ZWQgKi8KKwlhdXRvYWR2ID0gbWRpb19yZWFkKG5ldF9kZXYsIHBoeV9hZGRyLCBNSUlfQU5BRFYpOworCWF1dG9yZWMgPSBtZGlvX3JlYWQobmV0X2RldiwgcGh5X2FkZHIsIE1JSV9BTkxQQVIpOworCXN0YXR1cyA9IGF1dG9hZHYgJiBhdXRvcmVjOworCQorCSpzcGVlZCA9IEhXX1NQRUVEXzEwX01CUFM7CisJKmR1cGxleCA9IEZEWF9DQVBBQkxFX0hBTEZfU0VMRUNURUQ7CisKKwlpZiAoc3RhdHVzICYgKE1JSV9OV0FZX1RYIHwgTUlJX05XQVlfVFhfRkRYKSkKKwkJKnNwZWVkID0gSFdfU1BFRURfMTAwX01CUFM7CisJaWYgKHN0YXR1cyAmICggTUlJX05XQVlfVFhfRkRYIHwgTUlJX05XQVlfVF9GRFgpKQorCQkqZHVwbGV4ID0gRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRDsKKwkKKwlzaXNfcHJpdi0+YXV0b25nX2NvbXBsZXRlID0gMTsKKworCS8qIFdvcmthcm91bmQgZm9yIFJlYWx0ZWsgUlRMODIwMSBQSFkgaXNzdWUgKi8KKwlpZiAoKHBoeS0+cGh5X2lkMCA9PSAweDAwMDApICYmICgocGh5LT5waHlfaWQxICYgMHhGRkYwKSA9PSAweDgyMDApKSB7CisJCWlmIChtZGlvX3JlYWQobmV0X2RldiwgcGh5X2FkZHIsIE1JSV9DT05UUk9MKSAmIE1JSV9DTlRMX0ZEWCkKKwkJCSpkdXBsZXggPSBGRFhfQ0FQQUJMRV9GVUxMX1NFTEVDVEVEOworCQlpZiAobWRpb19yZWFkKG5ldF9kZXYsIHBoeV9hZGRyLCAweDAwMTkpICYgMHgwMSkKKwkJCSpzcGVlZCA9IEhXX1NQRUVEXzEwMF9NQlBTOworCX0KKworCWlmKG5ldGlmX21zZ19saW5rKHNpc19wcml2KSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1lZGlhIExpbmsgT24gJXMgJXMtZHVwbGV4IFxuIiwKKwkgICAgICAgCQkJCW5ldF9kZXYtPm5hbWUsCisJICAgICAgIAkJCQkqc3BlZWQgPT0gSFdfU1BFRURfMTAwX01CUFMgPworCSAgICAgICAJCQkJCSIxMDBtYnBzIiA6ICIxMG1icHMiLAorCSAgICAgICAJCQkJKmR1cGxleCA9PSBGRFhfQ0FQQUJMRV9GVUxMX1NFTEVDVEVEID8KKwkgICAgICAgCQkJCQkiZnVsbCIgOiAiaGFsZiIpOworfQorCisvKioKKyAqCXNpczkwMF90eF90aW1lb3V0IC0gc2lzOTAwIHRyYW5zbWl0IHRpbWVvdXQgcm91dGluZQorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIHRyYW5zbWl0CisgKgorICoJcHJpbnQgdHJhbnNtaXQgdGltZW91dCBzdGF0dXMKKyAqCWRpc2FibGUgaW50ZXJydXB0cyBhbmQgZG8gc29tZSB0YXNrcworICovCisKK3N0YXRpYyB2b2lkIHNpczkwMF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCWxvbmcgaW9hZGRyID0gbmV0X2Rldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlpZihuZXRpZl9tc2dfdHhfZXJyKHNpc19wcml2KSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRyYW5zbWl0IHRpbWVvdXQsIHN0YXR1cyAlOC44eCAlOC44eCBcbiIsCisJICAgICAgIAkJbmV0X2Rldi0+bmFtZSwgaW5sKGlvYWRkciArIGNyKSwgaW5sKGlvYWRkciArIGlzcikpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGJ5IGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlvdXRsKDB4MDAwMCwgaW9hZGRyICsgaW1yKTsKKworCS8qIHVzZSBzcGlubG9jayB0byBwcmV2ZW50IGludGVycnVwdCBoYW5kbGVyIGFjY2Vzc2luZyBidWZmZXIgcmluZyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzaXNfcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogZGlzY2FyZCB1bnNlbnQgcGFja2V0cyAqLworCXNpc19wcml2LT5kaXJ0eV90eCA9IHNpc19wcml2LT5jdXJfdHggPSAwOworCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfREVTQzsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBzaXNfcHJpdi0+dHhfc2tidWZmW2ldOworCisJCWlmIChza2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoc2lzX3ByaXYtPnBjaV9kZXYsIAorCQkJCXNpc19wcml2LT50eF9yaW5nW2ldLmJ1ZnB0ciwgc2tiLT5sZW4sCisJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQkJc2lzX3ByaXYtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCQlzaXNfcHJpdi0+dHhfcmluZ1tpXS5jbWRzdHMgPSAwOworCQkJc2lzX3ByaXYtPnR4X3JpbmdbaV0uYnVmcHRyID0gMDsKKwkJCXNpc19wcml2LT5zdGF0cy50eF9kcm9wcGVkKys7CisJCX0KKwl9CisJc2lzX3ByaXYtPnR4X2Z1bGwgPSAwOworCW5ldGlmX3dha2VfcXVldWUobmV0X2Rldik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzaXNfcHJpdi0+bG9jaywgZmxhZ3MpOworCisJbmV0X2Rldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJLyogbG9hZCBUcmFuc21pdCBEZXNjcmlwdG9yIFJlZ2lzdGVyICovCisJb3V0bChzaXNfcHJpdi0+dHhfcmluZ19kbWEsIGlvYWRkciArIHR4ZHApOworCisJLyogRW5hYmxlIGFsbCBrbm93biBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCW91dGwoKFJ4U09WUnxSeE9STnxSeEVSUnxSeE9LfFR4VVJOfFR4RVJSfFR4SURMRSksIGlvYWRkciArIGltcik7CisJcmV0dXJuOworfQorCisvKioKKyAqCXNpczkwMF9zdGFydF94bWl0IC0gc2lzOTAwIHN0YXJ0IHRyYW5zbWl0IHJvdXRpbmUKKyAqCUBza2I6IHNvY2tldCBidWZmZXIgcG9pbnRlciB0byBwdXQgdGhlIGRhdGEgYmVpbmcgdHJhbnNtaXR0ZWQKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byB0cmFuc21pdCB3aXRoCisgKgorICoJU2V0IHRoZSB0cmFuc21pdCBidWZmZXIgZGVzY3JpcHRvciwgCisgKglhbmQgd3JpdGUgVHhFTkEgdG8gZW5hYmxlIHRyYW5zbWl0IHN0YXRlIG1hY2hpbmUuCisgKgl0ZWxsIHVwcGVyIGxheWVyIGlmIHRoZSBidWZmZXIgaXMgZnVsbAorICovCisKK3N0YXRpYyBpbnQKK3NpczkwMF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KQoreworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCWxvbmcgaW9hZGRyID0gbmV0X2Rldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGludCAgZW50cnk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgIGluZGV4X2N1cl90eCwgaW5kZXhfZGlydHlfdHg7CisJdW5zaWduZWQgaW50ICBjb3VudF9kaXJ0eV90eDsKKworCS8qIERvbid0IHRyYW5zbWl0IGRhdGEgYmVmb3JlIHRoZSBjb21wbGV0ZSBvZiBhdXRvLW5lZ290aWF0aW9uICovCisJaWYoIXNpc19wcml2LT5hdXRvbmdfY29tcGxldGUpeworCQluZXRpZl9zdG9wX3F1ZXVlKG5ldF9kZXYpOworCQlyZXR1cm4gMTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2lzX3ByaXYtPmxvY2ssIGZsYWdzKTsKKworCS8qIENhbGN1bGF0ZSB0aGUgbmV4dCBUeCBkZXNjcmlwdG9yIGVudHJ5LiAqLworCWVudHJ5ID0gc2lzX3ByaXYtPmN1cl90eCAlIE5VTV9UWF9ERVNDOworCXNpc19wcml2LT50eF9za2J1ZmZbZW50cnldID0gc2tiOworCisJLyogc2V0IHRoZSB0cmFuc21pdCBidWZmZXIgZGVzY3JpcHRvciBhbmQgZW5hYmxlIFRyYW5zbWl0IFN0YXRlIE1hY2hpbmUgKi8KKwlzaXNfcHJpdi0+dHhfcmluZ1tlbnRyeV0uYnVmcHRyID0gcGNpX21hcF9zaW5nbGUoc2lzX3ByaXYtPnBjaV9kZXYsCisJCXNrYi0+ZGF0YSwgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCXNpc19wcml2LT50eF9yaW5nW2VudHJ5XS5jbWRzdHMgPSAoT1dOIHwgc2tiLT5sZW4pOworCW91dGwoVHhFTkEgfCBpbmwoaW9hZGRyICsgY3IpLCBpb2FkZHIgKyBjcik7CisKKwlzaXNfcHJpdi0+Y3VyX3R4ICsrOworCWluZGV4X2N1cl90eCA9IHNpc19wcml2LT5jdXJfdHg7CisJaW5kZXhfZGlydHlfdHggPSBzaXNfcHJpdi0+ZGlydHlfdHg7CisKKwlmb3IgKGNvdW50X2RpcnR5X3R4ID0gMDsgaW5kZXhfY3VyX3R4ICE9IGluZGV4X2RpcnR5X3R4OyBpbmRleF9kaXJ0eV90eCsrKQorCQljb3VudF9kaXJ0eV90eCArKzsKKworCWlmIChpbmRleF9jdXJfdHggPT0gaW5kZXhfZGlydHlfdHgpIHsKKwkJLyogZGlydHlfdHggaXMgbWV0IGluIHRoZSBjeWNsZSBvZiBjdXJfdHgsIGJ1ZmZlciBmdWxsICovCisJCXNpc19wcml2LT50eF9mdWxsID0gMTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKKwl9IGVsc2UgaWYgKGNvdW50X2RpcnR5X3R4IDwgTlVNX1RYX0RFU0MpIHsgCisJCS8qIFR5cGljYWwgcGF0aCwgdGVsbCB1cHBlciBsYXllciB0aGF0IG1vcmUgdHJhbnNtaXNzaW9uIGlzIHBvc3NpYmxlICovCisJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOworCX0gZWxzZSB7CisJCS8qIGJ1ZmZlciBmdWxsLCB0ZWxsIHVwcGVyIGxheWVyIG5vIG1vcmUgdHJhbnNtaXNzaW9uICovCisJCXNpc19wcml2LT50eF9mdWxsID0gMTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzaXNfcHJpdi0+bG9jaywgZmxhZ3MpOworCisJbmV0X2Rldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJaWYgKG5ldGlmX21zZ190eF9xdWV1ZWQoc2lzX3ByaXYpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFF1ZXVlZCBUeCBwYWNrZXQgYXQgJXAgc2l6ZSAlZCAiCisJCSAgICAgICAidG8gc2xvdCAlZC5cbiIsCisJCSAgICAgICBuZXRfZGV2LT5uYW1lLCBza2ItPmRhdGEsIChpbnQpc2tiLT5sZW4sIGVudHJ5KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCXNpczkwMF9pbnRlcnJ1cHQgLSBzaXM5MDAgaW50ZXJydXB0IGhhbmRsZXIKKyAqCUBpcnE6IHRoZSBpcnEgbnVtYmVyCisgKglAZGV2X2luc3RhbmNlOiB0aGUgY2xpZW50IGRhdGEgb2JqZWN0CisgKglAcmVnczogc25hcHNob3Qgb2YgcHJvY2Vzc29yIGNvbnRleHQKKyAqCisgKglUaGUgaW50ZXJydXB0IGhhbmRsZXIgZG9lcyBhbGwgb2YgdGhlIFJ4IHRocmVhZCB3b3JrLCAKKyAqCWFuZCBjbGVhbnMgdXAgYWZ0ZXIgdGhlIFR4IHRocmVhZAorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzaXM5MDBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IHNpczkwMF9wcml2YXRlICpzaXNfcHJpdiA9IG5ldF9kZXYtPnByaXY7CisJaW50IGJvZ3VzY250ID0gbWF4X2ludGVycnVwdF93b3JrOworCWxvbmcgaW9hZGRyID0gbmV0X2Rldi0+YmFzZV9hZGRyOworCXUzMiBzdGF0dXM7CisJdW5zaWduZWQgaW50IGhhbmRsZWQgPSAwOworCisJc3Bpbl9sb2NrICgmc2lzX3ByaXYtPmxvY2spOworCisJZG8geworCQlzdGF0dXMgPSBpbmwoaW9hZGRyICsgaXNyKTsKKworCQlpZiAoKHN0YXR1cyAmIChISUJFUlJ8VHhVUk58VHhFUlJ8VHhJRExFfFJ4T1JOfFJ4RVJSfFJ4T0spKSA9PSAwKQorCQkJLyogbm90aGluZyBpbnRyZXN0aW5nIGhhcHBlbmVkICovCisJCQlicmVhazsKKwkJaGFuZGxlZCA9IDE7CisKKwkJLyogd2h5IGRvdyd0IHdlIGJyZWFrIGFmdGVyIFR4L1J4IGNhc2UgPz8ga2V5d29yZDogZnVsbC1kdXBsZXggKi8KKwkJaWYgKHN0YXR1cyAmIChSeE9STiB8IFJ4RVJSIHwgUnhPSykpCisJCQkvKiBSeCBpbnRlcnJ1cHQgKi8KKwkJCXNpczkwMF9yeChuZXRfZGV2KTsKKworCQlpZiAoc3RhdHVzICYgKFR4VVJOIHwgVHhFUlIgfCBUeElETEUpKQorCQkJLyogVHggaW50ZXJydXB0ICovCisJCQlzaXM5MDBfZmluaXNoX3htaXQobmV0X2Rldik7CisKKwkJLyogc29tZXRoaW5nIHN0cmFuZ2UgaGFwcGVuZWQgISEhICovCisJCWlmIChzdGF0dXMgJiBISUJFUlIpIHsKKwkJCWlmKG5ldGlmX21zZ19pbnRyKHNpc19wcml2KSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQWJub3JtYWwgaW50ZXJydXB0LCIKKwkJCQkJInN0YXR1cyAlIzguOHguXG4iLCBuZXRfZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKC0tYm9ndXNjbnQgPCAwKSB7CisJCQlpZihuZXRpZl9tc2dfaW50cihzaXNfcHJpdikpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRvbyBtdWNoIHdvcmsgYXQgaW50ZXJydXB0LCAiCisJCQkJCSJpbnRlcnJ1cHQgc3RhdHVzID0gJSM4Ljh4LlxuIiwKKwkJCQkJbmV0X2Rldi0+bmFtZSwgc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwlpZihuZXRpZl9tc2dfaW50cihzaXNfcHJpdikpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBpbnRlcnJ1cHQsICIKKwkJICAgICAgICJpbnRlcnJ1cHQgc3RhdHVzID0gMHglIzguOHguXG4iLAorCQkgICAgICAgbmV0X2Rldi0+bmFtZSwgaW5sKGlvYWRkciArIGlzcikpOworCQorCXNwaW5fdW5sb2NrICgmc2lzX3ByaXYtPmxvY2spOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKioKKyAqCXNpczkwMF9yeCAtIHNpczkwMCByZWNlaXZlIHJvdXRpbmUKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB3aGljaCByZWNlaXZlcyBkYXRhCisgKgorICoJUHJvY2VzcyByZWNlaXZlIGludGVycnVwdCBldmVudHMsIAorICoJcHV0IGJ1ZmZlciB0byBoaWdoZXIgbGF5ZXIgYW5kIHJlZmlsbCBidWZmZXIgcG9vbAorICoJTm90ZTogVGhpcyBmdWNudGlvbiBpcyBjYWxsZWQgYnkgaW50ZXJydXB0IGhhbmRsZXIsIAorICoJZG9uJ3QgZG8gInRvbyBtdWNoIiB3b3JrIGhlcmUKKyAqLworCitzdGF0aWMgaW50IHNpczkwMF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwlsb25nIGlvYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBpbnQgZW50cnkgPSBzaXNfcHJpdi0+Y3VyX3J4ICUgTlVNX1JYX0RFU0M7CisJdTMyIHJ4X3N0YXR1cyA9IHNpc19wcml2LT5yeF9yaW5nW2VudHJ5XS5jbWRzdHM7CisKKwlpZiAobmV0aWZfbXNnX3J4X3N0YXR1cyhzaXNfcHJpdikpCisJCXByaW50ayhLRVJOX0RFQlVHICJzaXM5MDBfcngsIGN1cl9yeDolNC40ZCwgZGlydHlfcng6JTQuNGQgIgorCQkgICAgICAgInN0YXR1czoweCU4Ljh4XG4iLAorCQkgICAgICAgc2lzX3ByaXYtPmN1cl9yeCwgc2lzX3ByaXYtPmRpcnR5X3J4LCByeF9zdGF0dXMpOworCisJd2hpbGUgKHJ4X3N0YXR1cyAmIE9XTikgeworCQl1bnNpZ25lZCBpbnQgcnhfc2l6ZTsKKworCQlyeF9zaXplID0gKHJ4X3N0YXR1cyAmIERTSVpFKSAtIENSQ19TSVpFOworCisJCWlmIChyeF9zdGF0dXMgJiAoQUJPUlR8T1ZFUlJVTnxUT09MT05HfFJVTlR8UlhJU0VSUnxDUkNFUlJ8RkFFUlIpKSB7CisJCQkvKiBjb3JydXB0ZWQgcGFja2V0IHJlY2VpdmVkICovCisJCQlpZiAobmV0aWZfbXNnX3J4X2VycihzaXNfcHJpdikpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDb3JydXB0ZWQgcGFja2V0ICIKKwkJCQkgICAgICAgInJlY2VpdmVkLCBidWZmZXIgc3RhdHVzID0gMHglOC44eC5cbiIsCisJCQkJICAgICAgIG5ldF9kZXYtPm5hbWUsIHJ4X3N0YXR1cyk7CisJCQlzaXNfcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAocnhfc3RhdHVzICYgT1ZFUlJVTikKKwkJCQlzaXNfcHJpdi0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCWlmIChyeF9zdGF0dXMgJiAoVE9PTE9OR3xSVU5UKSkKKwkJCQlzaXNfcHJpdi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaWYgKHJ4X3N0YXR1cyAmIChSWElTRVJSIHwgRkFFUlIpKQorCQkJCXNpc19wcml2LT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChyeF9zdGF0dXMgJiBDUkNFUlIpIAorCQkJCXNpc19wcml2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkvKiByZXNldCBidWZmZXIgZGVzY3JpcHRvciBzdGF0ZSAqLworCQkJc2lzX3ByaXYtPnJ4X3JpbmdbZW50cnldLmNtZHN0cyA9IFJYX0JVRl9TSVpFOworCQl9IGVsc2UgeworCQkJc3RydWN0IHNrX2J1ZmYgKiBza2I7CisKKwkJCS8qIFRoaXMgc2l0dWF0aW9uIHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCBkdWUgdG8KKwkJCSAgIHNvbWUgdW5rbm93IGJ1Z3MsIGl0IGlzIHBvc3NpYmxlIHRoYXQKKwkJCSAgIHdlIGFyZSB3b3JraW5nIG9uIE5VTEwgc2tfYnVmZiA6LSggKi8KKwkJCWlmIChzaXNfcHJpdi0+cnhfc2tidWZmW2VudHJ5XSA9PSBOVUxMKSB7CisJCQkJaWYgKG5ldGlmX21zZ19yeF9lcnIoc2lzX3ByaXYpKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTlVMTCBwb2ludGVyICIgCisJCQkJCQkiZW5jb3VudGVyZWQgaW4gUnggcmluZywgc2tpcHBpbmdcbiIsCisJCQkJCQluZXRfZGV2LT5uYW1lKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcGNpX3VubWFwX3NpbmdsZShzaXNfcHJpdi0+cGNpX2RldiwgCisJCQkJc2lzX3ByaXYtPnJ4X3JpbmdbZW50cnldLmJ1ZnB0ciwgUlhfQlVGX1NJWkUsIAorCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkvKiBnaXZlIHRoZSBzb2NrZXQgYnVmZmVyIHRvIHVwcGVyIGxheWVycyAqLworCQkJc2tiID0gc2lzX3ByaXYtPnJ4X3NrYnVmZltlbnRyeV07CisJCQlza2JfcHV0KHNrYiwgcnhfc2l6ZSk7CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBuZXRfZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisKKwkJCS8qIHNvbWUgbmV0d29yayBzdGF0aXN0aWNzICovCisJCQlpZiAoKHJ4X3N0YXR1cyAmIEJDQVNUKSA9PSBNQ0FTVCkKKwkJCQlzaXNfcHJpdi0+c3RhdHMubXVsdGljYXN0Kys7CisJCQluZXRfZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCXNpc19wcml2LT5zdGF0cy5yeF9ieXRlcyArPSByeF9zaXplOworCQkJc2lzX3ByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKworCQkJLyogcmVmaWxsIHRoZSBSeCBidWZmZXIsIHdoYXQgaWYgdGhlcmUgaXMgbm90IGVub3VnaHQKKwkJCSAqIG1lbW9yeSBmb3IgbmV3IHNvY2tldCBidWZmZXIgPz8gKi8KKwkJCWlmICgoc2tiID0gZGV2X2FsbG9jX3NrYihSWF9CVUZfU0laRSkpID09IE5VTEwpIHsKKwkJCQkvKiBub3QgZW5vdWdoIG1lbW9yeSBmb3Igc2tidWZmLCB0aGlzIG1ha2VzIGEKKwkJCQkgKiAiaG9sZSIgb24gdGhlIGJ1ZmZlciByaW5nLCBpdCBpcyBub3QgY2xlYXIKKwkJCQkgKiBob3cgdGhlIGhhcmR3YXJlIHdpbGwgcmVhY3QgdG8gdGhpcyBraW5kCisJCQkJICogb2YgZGVnZW5lcmF0ZWQgYnVmZmVyICovCisJCQkJaWYgKG5ldGlmX21zZ19yeF9zdGF0dXMoc2lzX3ByaXYpKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTWVtb3J5IHNxdWVlemUsIgorCQkJCQkJImRlZmVycmluZyBwYWNrZXQuXG4iLAorCQkJCQkJbmV0X2Rldi0+bmFtZSk7CisJCQkJc2lzX3ByaXYtPnJ4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJCS8qIHJlc2V0IGJ1ZmZlciBkZXNjcmlwdG9yIHN0YXRlICovCisJCQkJc2lzX3ByaXYtPnJ4X3JpbmdbZW50cnldLmNtZHN0cyA9IDA7CisJCQkJc2lzX3ByaXYtPnJ4X3JpbmdbZW50cnldLmJ1ZnB0ciA9IDA7CisJCQkJc2lzX3ByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNrYi0+ZGV2ID0gbmV0X2RldjsKKwkJCXNpc19wcml2LT5yeF9za2J1ZmZbZW50cnldID0gc2tiOworCQkJc2lzX3ByaXYtPnJ4X3JpbmdbZW50cnldLmNtZHN0cyA9IFJYX0JVRl9TSVpFOworICAgICAgICAgICAgICAgIAlzaXNfcHJpdi0+cnhfcmluZ1tlbnRyeV0uYnVmcHRyID0gCisJCQkJcGNpX21hcF9zaW5nbGUoc2lzX3ByaXYtPnBjaV9kZXYsIHNrYi0+dGFpbCwgCisJCQkJCVJYX0JVRl9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJc2lzX3ByaXYtPmRpcnR5X3J4Kys7CisJCX0KKwkJc2lzX3ByaXYtPmN1cl9yeCsrOworCQllbnRyeSA9IHNpc19wcml2LT5jdXJfcnggJSBOVU1fUlhfREVTQzsKKwkJcnhfc3RhdHVzID0gc2lzX3ByaXYtPnJ4X3JpbmdbZW50cnldLmNtZHN0czsKKwl9IC8vIHdoaWxlCisKKwkvKiByZWZpbGwgdGhlIFJ4IGJ1ZmZlciwgd2hhdCBpZiB0aGUgcmF0ZSBvZiByZWZpbGxpbmcgaXMgc2xvd2VyCisJICogdGhhbiBjb25zdW1pbmcgPz8gKi8KKwlmb3IgKDtzaXNfcHJpdi0+Y3VyX3J4IC0gc2lzX3ByaXYtPmRpcnR5X3J4ID4gMDsgc2lzX3ByaXYtPmRpcnR5X3J4KyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQllbnRyeSA9IHNpc19wcml2LT5kaXJ0eV9yeCAlIE5VTV9SWF9ERVNDOworCisJCWlmIChzaXNfcHJpdi0+cnhfc2tidWZmW2VudHJ5XSA9PSBOVUxMKSB7CisJCQlpZiAoKHNrYiA9IGRldl9hbGxvY19za2IoUlhfQlVGX1NJWkUpKSA9PSBOVUxMKSB7CisJCQkJLyogbm90IGVub3VnaCBtZW1vcnkgZm9yIHNrYnVmZiwgdGhpcyBtYWtlcyBhCisJCQkJICogImhvbGUiIG9uIHRoZSBidWZmZXIgcmluZywgaXQgaXMgbm90IGNsZWFyCisJCQkJICogaG93IHRoZSBoYXJkd2FyZSB3aWxsIHJlYWN0IHRvIHRoaXMga2luZAorCQkJCSAqIG9mIGRlZ2VuZXJhdGVkIGJ1ZmZlciAqLworCQkJCWlmIChuZXRpZl9tc2dfcnhfZXJyKHNpc19wcml2KSkKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1lbW9yeSBzcXVlZXplLCIKKwkJCQkJCSJkZWZlcnJpbmcgcGFja2V0LlxuIiwKKwkJCQkJCW5ldF9kZXYtPm5hbWUpOworCQkJCXNpc19wcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlza2ItPmRldiA9IG5ldF9kZXY7CisJCQlzaXNfcHJpdi0+cnhfc2tidWZmW2VudHJ5XSA9IHNrYjsKKwkJCXNpc19wcml2LT5yeF9yaW5nW2VudHJ5XS5jbWRzdHMgPSBSWF9CVUZfU0laRTsKKyAgICAgICAgICAgICAgICAJc2lzX3ByaXYtPnJ4X3JpbmdbZW50cnldLmJ1ZnB0ciA9CisJCQkJcGNpX21hcF9zaW5nbGUoc2lzX3ByaXYtPnBjaV9kZXYsIHNrYi0+dGFpbCwKKwkJCQkJUlhfQlVGX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCX0KKwl9CisJLyogcmUtZW5hYmxlIHRoZSBwb3RlbnRpYWxseSBpZGxlIHJlY2VpdmUgc3RhdGUgbWF0Y2hpbmUgKi8KKwlvdXRsKFJ4RU5BIHwgaW5sKGlvYWRkciArIGNyKSwgaW9hZGRyICsgY3IgKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCXNpczkwMF9maW5pc2hfeG1pdCAtIGZpbmlzaCB1cCB0cmFuc21pc3Npb24gb2YgcGFja2V0cworICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIGJlIHRyYW5zbWl0dGVkIG9uCisgKgorICoJQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbiBhbmQgZnJlZSBzb2NrZXQgYnVmZmVyIGV0YyAKKyAqCXNjaGVkdWxlIGZvciBtb3JlIHRyYW5zbWlzc2lvbiBhcyBuZWVkZWQKKyAqCU5vdGU6IFRoaXMgZnVjbnRpb24gaXMgY2FsbGVkIGJ5IGludGVycnVwdCBoYW5kbGVyLCAKKyAqCWRvbid0IGRvICJ0b28gbXVjaCIgd29yayBoZXJlCisgKi8KKworc3RhdGljIHZvaWQgc2lzOTAwX2ZpbmlzaF94bWl0IChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKworCWZvciAoOyBzaXNfcHJpdi0+ZGlydHlfdHggIT0gc2lzX3ByaXYtPmN1cl90eDsgc2lzX3ByaXYtPmRpcnR5X3R4KyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdW5zaWduZWQgaW50IGVudHJ5OworCQl1MzIgdHhfc3RhdHVzOworCisJCWVudHJ5ID0gc2lzX3ByaXYtPmRpcnR5X3R4ICUgTlVNX1RYX0RFU0M7CisJCXR4X3N0YXR1cyA9IHNpc19wcml2LT50eF9yaW5nW2VudHJ5XS5jbWRzdHM7CisKKwkJaWYgKHR4X3N0YXR1cyAmIE9XTikgeworCQkJLyogVGhlIHBhY2tldCBpcyBub3QgdHJhbnNtaXR0ZWQgeWV0IChvd25lZCBieSBoYXJkd2FyZSkgIQorCQkJICogTm90ZTogdGhlIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgb25seSB3aGVuIFR4IE1hY2hpbmUKKwkJCSAqIGlzIGlkbGUsIHNvIHRoaXMgaXMgYW4gYWxtb3N0IGltcG9zc2libGUgY2FzZSAqLworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodHhfc3RhdHVzICYgKEFCT1JUIHwgVU5ERVJSVU4gfCBPV0NPTEwpKSB7CisJCQkvKiBwYWNrZXQgdW5zdWNjZXNzZnVsbHkgdHJhbnNtaXR0ZWQgKi8KKwkJCWlmIChuZXRpZl9tc2dfdHhfZXJyKHNpc19wcml2KSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRyYW5zbWl0ICIKKwkJCQkgICAgICAgImVycm9yLCBUeCBzdGF0dXMgJTguOHguXG4iLAorCQkJCSAgICAgICBuZXRfZGV2LT5uYW1lLCB0eF9zdGF0dXMpOworCQkJc2lzX3ByaXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJaWYgKHR4X3N0YXR1cyAmIFVOREVSUlVOKQorCQkJCXNpc19wcml2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJaWYgKHR4X3N0YXR1cyAmIEFCT1JUKQorCQkJCXNpc19wcml2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJaWYgKHR4X3N0YXR1cyAmIE5PQ0FSUklFUikKKwkJCQlzaXNfcHJpdi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCWlmICh0eF9zdGF0dXMgJiBPV0NPTEwpCisJCQkJc2lzX3ByaXYtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJfSBlbHNlIHsKKwkJCS8qIHBhY2tldCBzdWNjZXNzZnVsbHkgdHJhbnNtaXR0ZWQgKi8KKwkJCXNpc19wcml2LT5zdGF0cy5jb2xsaXNpb25zICs9ICh0eF9zdGF0dXMgJiBDT0xDTlQpID4+IDE2OworCQkJc2lzX3ByaXYtPnN0YXRzLnR4X2J5dGVzICs9IHR4X3N0YXR1cyAmIERTSVpFOworCQkJc2lzX3ByaXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJfQorCQkvKiBGcmVlIHRoZSBvcmlnaW5hbCBza2IuICovCisJCXNrYiA9IHNpc19wcml2LT50eF9za2J1ZmZbZW50cnldOworCQlwY2lfdW5tYXBfc2luZ2xlKHNpc19wcml2LT5wY2lfZGV2LCAKKwkJCXNpc19wcml2LT50eF9yaW5nW2VudHJ5XS5idWZwdHIsIHNrYi0+bGVuLAorCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCXNpc19wcml2LT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJc2lzX3ByaXYtPnR4X3JpbmdbZW50cnldLmJ1ZnB0ciA9IDA7CisJCXNpc19wcml2LT50eF9yaW5nW2VudHJ5XS5jbWRzdHMgPSAwOworCX0KKworCWlmIChzaXNfcHJpdi0+dHhfZnVsbCAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKG5ldF9kZXYpICYmCisJICAgIHNpc19wcml2LT5jdXJfdHggLSBzaXNfcHJpdi0+ZGlydHlfdHggPCBOVU1fVFhfREVTQyAtIDQpIHsKKwkJLyogVGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwsIGNsZWFyIHR4X2Z1bGwgYW5kIHNjaGVkdWxlCisJCSAqIG1vcmUgdHJhbnNtaXNzaW9uIGJ5IG5ldGlmX3dha2VfcXVldWUobmV0X2RldikgKi8KKwkJc2lzX3ByaXYtPnR4X2Z1bGwgPSAwOworCQluZXRpZl93YWtlX3F1ZXVlIChuZXRfZGV2KTsKKwl9Cit9CisKKy8qKgorICoJc2lzOTAwX2Nsb3NlIC0gY2xvc2Ugc2lzOTAwIGRldmljZSAKKyAqCUBuZXRfZGV2OiB0aGUgbmV0IGRldmljZSB0byBiZSBjbG9zZWQKKyAqCisgKglEaXNhYmxlIGludGVycnVwdHMsIHN0b3AgdGhlIFR4IGFuZCBSeCBTdGF0dXMgTWFjaGluZSAKKyAqCWZyZWUgVHggYW5kIFJYIHNvY2tldCBidWZmZXIKKyAqLworCitzdGF0aWMgaW50IHNpczkwMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlsb25nIGlvYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBpOworCisJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBieSBjbGVhcmluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJb3V0bCgweDAwMDAsIGlvYWRkciArIGltcik7CisJb3V0bCgweDAwMDAsIGlvYWRkciArIGllcik7CisKKwkvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IFN0YXR1cyBNYWNoaW5lICovCisJb3V0bChSeERJUyB8IFR4RElTIHwgaW5sKGlvYWRkciArIGNyKSwgaW9hZGRyICsgY3IpOworCisJZGVsX3RpbWVyKCZzaXNfcHJpdi0+dGltZXIpOworCisJZnJlZV9pcnEobmV0X2Rldi0+aXJxLCBuZXRfZGV2KTsKKworCS8qIEZyZWUgVHggYW5kIFJYIHNrYnVmZiAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfREVTQzsgaSsrKSB7CisJCXNrYiA9IHNpc19wcml2LT5yeF9za2J1ZmZbaV07CisJCWlmIChza2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoc2lzX3ByaXYtPnBjaV9kZXYsIAorCQkJCXNpc19wcml2LT5yeF9yaW5nW2ldLmJ1ZnB0ciwKKwkJCQlSWF9CVUZfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXNpc19wcml2LT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfREVTQzsgaSsrKSB7CisJCXNrYiA9IHNpc19wcml2LT50eF9za2J1ZmZbaV07CisJCWlmIChza2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoc2lzX3ByaXYtPnBjaV9kZXYsIAorCQkJCXNpc19wcml2LT50eF9yaW5nW2ldLmJ1ZnB0ciwgc2tiLT5sZW4sCisJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlzaXNfcHJpdi0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJfQorCX0KKworCS8qIEdyZWVuISBQdXQgdGhlIGNoaXAgaW4gbG93LXBvd2VyIG1vZGUuICovCisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglzaXM5MDBfZ2V0X2RydmluZm8gLSBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgZHJpdmVyCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gcHJvYmUKKyAqCUBpbmZvOiBjb250YWluZXIgZm9yIGluZm8gcmV0dXJuZWQKKyAqCisgKglQcm9jZXNzIGV0aHRvb2wgY29tbWFuZCBzdWNoIGFzICJlaHRvb2wgLWkiIHRvIHNob3cgaW5mb3JtYXRpb24KKyAqLworIAorc3RhdGljIHZvaWQgc2lzOTAwX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisgCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCisJc3RyY3B5IChpbmZvLT5kcml2ZXIsIFNJUzkwMF9NT0RVTEVfTkFNRSk7CisJc3RyY3B5IChpbmZvLT52ZXJzaW9uLCBTSVM5MDBfRFJWX1ZFUlNJT04pOworCXN0cmNweSAoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHNpc19wcml2LT5wY2lfZGV2KSk7Cit9CisKK3N0YXRpYyB1MzIgc2lzOTAwX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwlyZXR1cm4gc2lzX3ByaXYtPm1zZ19lbmFibGU7Cit9CisgIAorc3RhdGljIHZvaWQgc2lzOTAwX3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgdTMyIHZhbHVlKQoreworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCXNpc19wcml2LT5tc2dfZW5hYmxlID0gdmFsdWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgc2lzOTAwX2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbyAJPSBzaXM5MDBfZ2V0X2RydmluZm8sCisJLmdldF9tc2dsZXZlbAk9IHNpczkwMF9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAk9IHNpczkwMF9zZXRfbXNnbGV2ZWwsCit9OworCisvKioKKyAqCW1paV9pb2N0bCAtIHByb2Nlc3MgTUlJIGkvbyBjb250cm9sIGNvbW1hbmQgCisgKglAbmV0X2RldjogdGhlIG5ldCBkZXZpY2UgdG8gY29tbWFuZCBmb3IKKyAqCUBycTogcGFyYW1ldGVyIGZvciBjb21tYW5kCisgKglAY21kOiB0aGUgaS9vIGNvbW1hbmQKKyAqCisgKglQcm9jZXNzIE1JSSBjb21tYW5kIGxpa2UgcmVhZC93cml0ZSBNSUkgcmVnaXN0ZXIKKyAqLworCitzdGF0aWMgaW50IG1paV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkocnEpOworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgU0lPQ0dNSUlQSFk6CQkvKiBHZXQgYWRkcmVzcyBvZiBNSUkgUEhZIGluIHVzZS4gKi8KKwkJZGF0YS0+cGh5X2lkID0gc2lzX3ByaXYtPm1paS0+cGh5X2FkZHI7CisJCS8qIEZhbGwgVGhyb3VnaCAqLworCisJY2FzZSBTSU9DR01JSVJFRzoJCS8qIFJlYWQgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwkJZGF0YS0+dmFsX291dCA9IG1kaW9fcmVhZChuZXRfZGV2LCBkYXRhLT5waHlfaWQgJiAweDFmLCBkYXRhLT5yZWdfbnVtICYgMHgxZik7CisJCXJldHVybiAwOworCisJY2FzZSBTSU9DU01JSVJFRzoJCS8qIFdyaXRlIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCW1kaW9fd3JpdGUobmV0X2RldiwgZGF0YS0+cGh5X2lkICYgMHgxZiwgZGF0YS0+cmVnX251bSAmIDB4MWYsIGRhdGEtPnZhbF9pbik7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9Cit9CisKKy8qKgorICoJc2lzOTAwX2dldF9zdGF0cyAtIEdldCBzaXM5MDAgcmVhZC93cml0ZSBzdGF0aXN0aWNzIAorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIGdldCBzdGF0aXN0aWNzIGZvcgorICoKKyAqCWdldCB0eC9yeCBzdGF0aXN0aWNzIGZvciBzaXM5MDAKKyAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgorc2lzOTAwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKworCXJldHVybiAmc2lzX3ByaXYtPnN0YXRzOworfQorCisvKioKKyAqCXNpczkwMF9zZXRfY29uZmlnIC0gU2V0IG1lZGlhIHR5cGUgYnkgbmV0X2RldmljZS5zZXRfY29uZmlnIAorICoJQGRldjogdGhlIG5ldCBkZXZpY2UgZm9yIG1lZGlhIHR5cGUgY2hhbmdlCisgKglAbWFwOiBpZm1hcCBwYXNzZWQgYnkgaWZjb25maWcKKyAqCisgKglTZXQgbWVkaWEgdHlwZSB0byAxMGJhc2VULCAxMDBiYXNlVCBvciAwKGZvciBhdXRvKSBieSBpZmNvbmZpZworICoJd2Ugc3VwcG9ydCBvbmx5IHBvcnQgY2hhbmdlcy4gQWxsIG90aGVyIHJ1bnRpbWUgY29uZmlndXJhdGlvbgorICoJY2hhbmdlcyB3aWxsIGJlIGlnbm9yZWQKKyAqLworCitzdGF0aWMgaW50IHNpczkwMF9zZXRfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKQoreyAgICAKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKnNpc19wcml2ID0gZGV2LT5wcml2OworCXN0cnVjdCBtaWlfcGh5ICptaWlfcGh5ID0gc2lzX3ByaXYtPm1paTsKKyAgICAgICAgCisJdTE2IHN0YXR1czsKKworCWlmICgobWFwLT5wb3J0ICE9ICh1X2NoYXIpKC0xKSkgJiYgKG1hcC0+cG9ydCAhPSBkZXYtPmlmX3BvcnQpKSB7CisJCS8qIHdlIHN3aXRjaCBvbiB0aGUgaWZtYXAtPnBvcnQgZmllbGQuIEkgY291bGRuJ3QgZmluZCBhbnl0aGluZworCQkgKiBsaWtlIGEgZGVmaW5pdGlvbiBvciBzdGFuZGFyZCBmb3IgdGhlIHZhbHVlcyBvZiB0aGF0IGZpZWxkLgorCQkgKiBJIHRoaW5rIHRoZSBtZWFuaW5nIG9mIHRob3NlIHZhbHVlcyBpcyBkZXZpY2Ugc3BlY2lmaWMuIEJ1dAorCQkgKiBzaW5jZSBJIHdvdWxkIGxpa2UgdG8gY2hhbmdlIHRoZSBtZWRpYSB0eXBlIHZpYSB0aGUgaWZjb25maWcKKwkJICogY29tbWFuZCBJIHVzZSB0aGUgZGVmaW5pdGlvbiBmcm9tIGxpbnV4L25ldGRldmljZS5oIAorCQkgKiAod2hpY2ggc2VlbXMgdG8gYmUgZGlmZmVyZW50IGZyb20gdGhlIGlmcG9ydChwY21jaWEpIGRlZmluaXRpb24pICovCisJCXN3aXRjaChtYXAtPnBvcnQpeworCQljYXNlIElGX1BPUlRfVU5LTk9XTjogLyogdXNlIGF1dG8gaGVyZSAqLyAgIAorCQkJZGV2LT5pZl9wb3J0ID0gbWFwLT5wb3J0OworCQkJLyogd2UgYXJlIGdvaW5nIHRvIGNoYW5nZSB0aGUgbWVkaWEgdHlwZSwgc28gdGhlIExpbmsKKwkJCSAqIHdpbGwgYmUgdGVtcG9yYXJ5IGRvd24gYW5kIHdlIG5lZWQgdG8gcmVmbGVjdCB0aGF0CisJCQkgKiBoZXJlLiBXaGVuIHRoZSBMaW5rIGNvbWVzIHVwIGFnYWluLCBpdCB3aWxsIGJlCisJCQkgKiBzZW5zZWQgYnkgdGhlIHNpc190aW1lciBwcm9jZWR1cmUsIHdoaWNoIGFsc28gZG9lcworCQkJICogYWxsIHRoZSByZXN0IGZvciB1cyAqLworCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKyAgICAgICAgICAgICAgICAKKwkJCS8qIHJlYWQgY3VycmVudCBzdGF0ZSAqLworCQkJc3RhdHVzID0gbWRpb19yZWFkKGRldiwgbWlpX3BoeS0+cGh5X2FkZHIsIE1JSV9DT05UUk9MKTsKKyAgICAgICAgICAgICAgICAKKwkJCS8qIGVuYWJsZSBhdXRvIG5lZ290aWF0aW9uIGFuZCByZXNldCB0aGUgbmVnb3Rpb2F0aW9uCisJCQkgKiAoSSBkb24ndCByZWFsbHkga25vdyB3aGF0IHRoZSBhdXRvIG5lZ2F0aW90aWF0aW9uCisJCQkgKiByZXNldCByZWFsbHkgbWVhbnMsIGJ1dCBpdCBzb3VuZHMgZm9yIG1lIHJpZ2h0IHRvCisJCQkgKiBkbyBvbmUgaGVyZSkgKi8KKwkJCW1kaW9fd3JpdGUoZGV2LCBtaWlfcGh5LT5waHlfYWRkciwKKwkJCQkgICBNSUlfQ09OVFJPTCwgc3RhdHVzIHwgTUlJX0NOVExfQVVUTyB8IE1JSV9DTlRMX1JTVF9BVVRPKTsKKworCQkJYnJlYWs7CisgICAgICAgICAgICAKKwkJY2FzZSBJRl9QT1JUXzEwQkFTRVQ6IC8qIDEwQmFzZVQgKi8gICAgICAgICAKKwkJCWRldi0+aWZfcG9ydCA9IG1hcC0+cG9ydDsKKyAgICAgICAgICAgICAgICAKKwkJCS8qIHdlIGFyZSBnb2luZyB0byBjaGFuZ2UgdGhlIG1lZGlhIHR5cGUsIHNvIHRoZSBMaW5rCisJCQkgKiB3aWxsIGJlIHRlbXBvcmFyeSBkb3duIGFuZCB3ZSBuZWVkIHRvIHJlZmxlY3QgdGhhdAorCQkJICogaGVyZS4gV2hlbiB0aGUgTGluayBjb21lcyB1cCBhZ2FpbiwgaXQgd2lsbCBiZQorCQkJICogc2Vuc2VkIGJ5IHRoZSBzaXNfdGltZXIgcHJvY2VkdXJlLCB3aGljaCBhbHNvIGRvZXMKKwkJCSAqIGFsbCB0aGUgcmVzdCBmb3IgdXMgKi8KKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisgICAgICAgIAorCQkJLyogc2V0IFNwZWVkIHRvIDEwTWJwcyAqLworCQkJLyogcmVhZCBjdXJyZW50IHN0YXRlICovCisJCQlzdGF0dXMgPSBtZGlvX3JlYWQoZGV2LCBtaWlfcGh5LT5waHlfYWRkciwgTUlJX0NPTlRST0wpOworICAgICAgICAgICAgICAgIAorCQkJLyogZGlzYWJsZSBhdXRvIG5lZ290aWF0aW9uIGFuZCBmb3JjZSAxME1CaXQgbW9kZSovCisJCQltZGlvX3dyaXRlKGRldiwgbWlpX3BoeS0+cGh5X2FkZHIsCisJCQkJICAgTUlJX0NPTlRST0wsIHN0YXR1cyAmIH4oTUlJX0NOVExfU1BFRUQgfAorCQkJCQlNSUlfQ05UTF9BVVRPKSk7CisJCQlicmVhazsKKyAgICAgICAgICAgIAorCQljYXNlIElGX1BPUlRfMTAwQkFTRVQ6IC8qIDEwMEJhc2VUICovCisJCWNhc2UgSUZfUE9SVF8xMDBCQVNFVFg6IC8qIDEwMEJhc2VUeCAqLyAKKwkJCWRldi0+aWZfcG9ydCA9IG1hcC0+cG9ydDsKKyAgICAgICAgICAgICAgICAKKwkJCS8qIHdlIGFyZSBnb2luZyB0byBjaGFuZ2UgdGhlIG1lZGlhIHR5cGUsIHNvIHRoZSBMaW5rCisJCQkgKiB3aWxsIGJlIHRlbXBvcmFyeSBkb3duIGFuZCB3ZSBuZWVkIHRvIHJlZmxlY3QgdGhhdAorCQkJICogaGVyZS4gV2hlbiB0aGUgTGluayBjb21lcyB1cCBhZ2FpbiwgaXQgd2lsbCBiZQorCQkJICogc2Vuc2VkIGJ5IHRoZSBzaXNfdGltZXIgcHJvY2VkdXJlLCB3aGljaCBhbHNvIGRvZXMKKwkJCSAqIGFsbCB0aGUgcmVzdCBmb3IgdXMgKi8KKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisgICAgICAgICAgICAgICAgCisJCQkvKiBzZXQgU3BlZWQgdG8gMTAwTWJwcyAqLworCQkJLyogZGlzYWJsZSBhdXRvIG5lZ290aWF0aW9uIGFuZCBlbmFibGUgMTAwTUJpdCBNb2RlICovCisJCQlzdGF0dXMgPSBtZGlvX3JlYWQoZGV2LCBtaWlfcGh5LT5waHlfYWRkciwgTUlJX0NPTlRST0wpOworCQkJbWRpb193cml0ZShkZXYsIG1paV9waHktPnBoeV9hZGRyLAorCQkJCSAgIE1JSV9DT05UUk9MLCAoc3RhdHVzICYgfk1JSV9DTlRMX1NQRUVEKSB8CisJCQkJICAgTUlJX0NOVExfU1BFRUQpOworICAgICAgICAgICAgICAgIAorCQkJYnJlYWs7CisgICAgICAgICAgICAKKwkJY2FzZSBJRl9QT1JUXzEwQkFTRTI6IC8qIDEwQmFzZTIgKi8KKwkJY2FzZSBJRl9QT1JUX0FVSTogLyogQVVJICovCisJCWNhc2UgSUZfUE9SVF8xMDBCQVNFRlg6IC8qIDEwMEJhc2VGeCAqLworICAgICAgICAgICAgICAgIAkvKiBUaGVzZSBNb2RlcyBhcmUgbm90IHN1cHBvcnRlZCAoYXJlIHRoZXk/KSovCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKyAgICAgICAgICAgIAorCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2lzOTAwX21jYXN0X2JpdG5yIC0gY29tcHV0ZSBoYXNodGFibGUgaW5kZXggCisgKglAYWRkcjogbXVsdGljYXN0IGFkZHJlc3MKKyAqCUByZXZpc2lvbjogcmV2aXNpb24gaWQgb2YgY2hpcAorICoKKyAqCVNpUyA5MDAgdXNlcyB0aGUgbW9zdCBzaWdpZmljYW50IDcgYml0cyB0byBpbmRleCBhIDEyOCBiaXRzIG11bHRpY2FzdAorICoJaGFzaCB0YWJsZSwgd2hpY2ggbWFrZXMgdGhpcyBmdW5jdGlvbiBhIGxpdHRsZSBiaXQgZGlmZmVyZW50IGZyb20gb3RoZXIgZHJpdmVycworICoJU2lTIDkwMCBCMCAmIDYzNSBNL0IgdXNlcyB0aGUgbW9zdCBzaWduaWZpY2F0IDggYml0cyB0byBpbmRleCAyNTYgYml0cworICogICAJbXVsdGljYXN0IGhhc2ggdGFibGUuIAorICovCisKK3N0YXRpYyBpbmxpbmUgdTE2IHNpczkwMF9tY2FzdF9iaXRucih1OCAqYWRkciwgdTggcmV2aXNpb24pCit7CisKKwl1MzIgY3JjID0gZXRoZXJfY3JjKDYsIGFkZHIpOworCisJLyogbGVhdmUgOCBvciA3IG1vc3Qgc2lnaW5pZmFudCBiaXRzICovCisJaWYgKChyZXZpc2lvbiA+PSBTSVM2MzVBXzkwMF9SRVYpIHx8IChyZXZpc2lvbiA9PSBTSVM5MDBCXzkwMF9SRVYpKQorCQlyZXR1cm4gKChpbnQpKGNyYyA+PiAyNCkpOworCWVsc2UKKwkJcmV0dXJuICgoaW50KShjcmMgPj4gMjUpKTsKK30KKworLyoqCisgKglzZXRfcnhfbW9kZSAtIFNldCBTaVM5MDAgcmVjZWl2ZSBtb2RlIAorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIGJlIHNldAorICoKKyAqCVNldCBTaVM5MDAgcmVjZWl2ZSBtb2RlIGZvciBwcm9taXNjdW91cywgbXVsdGljYXN0LCBvciBicm9hZGNhc3QgbW9kZS4KKyAqCUFuZCBzZXQgdGhlIGFwcHJvcHJpYXRlIG11bHRpY2FzdCBmaWx0ZXIuCisgKglNdWx0aWNhc3QgaGFzaCB0YWJsZSBjaGFuZ2VzIGZyb20gMTI4IHRvIDI1NiBiaXRzIGZvciA2MzVNL0IgJiA5MDBCMC4KKyAqLworCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlsb25nIGlvYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKiBzaXNfcHJpdiA9IG5ldF9kZXYtPnByaXY7CisJdTE2IG1jX2ZpbHRlclsxNl0gPSB7MH07CS8qIDI1Ni8xMjggYml0cyBtdWx0aWNhc3QgaGFzaCB0YWJsZSAqLworCWludCBpLCB0YWJsZV9lbnRyaWVzOworCXUzMiByeF9tb2RlOworCisJLyogNjM1IEhhc2ggVGFibGUgZW50aXJlcyA9IDI1NigyXjE2KSAqLworCWlmKChzaXNfcHJpdi0+Y2hpcHNldF9yZXYgPj0gU0lTNjM1QV85MDBfUkVWKSB8fAorCQkJKHNpc19wcml2LT5jaGlwc2V0X3JldiA9PSBTSVM5MDBCXzkwMF9SRVYpKQorCQl0YWJsZV9lbnRyaWVzID0gMTY7CisJZWxzZQorCQl0YWJsZV9lbnRyaWVzID0gODsKKworCWlmIChuZXRfZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCS8qIEFjY2VwdCBhbnkga2luZHMgb2YgcGFja2V0cyAqLworCQlyeF9tb2RlID0gUkZQcm9taXNjdW91czsKKwkJZm9yIChpID0gMDsgaSA8IHRhYmxlX2VudHJpZXM7IGkrKykKKwkJCW1jX2ZpbHRlcltpXSA9IDB4ZmZmZjsKKwl9IGVsc2UgaWYgKChuZXRfZGV2LT5tY19jb3VudCA+IG11bHRpY2FzdF9maWx0ZXJfbGltaXQpIHx8CisJCSAgIChuZXRfZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKKwkJLyogdG9vIG1hbnkgbXVsdGljYXN0IGFkZHJlc3NlcyBvciBhY2NlcHQgYWxsIG11bHRpY2FzdCBwYWNrZXQgKi8KKwkJcnhfbW9kZSA9IFJGQUFCIHwgUkZBQU07CisJCWZvciAoaSA9IDA7IGkgPCB0YWJsZV9lbnRyaWVzOyBpKyspCisJCQltY19maWx0ZXJbaV0gPSAweGZmZmY7CisJfSBlbHNlIHsKKwkJLyogQWNjZXB0IEJyb2FkY2FzdCBwYWNrZXQsIGRlc3RpbmF0aW9uIGFkZHJlc3MgbWF0Y2hzIG91cgorCQkgKiBNQUMgYWRkcmVzcywgdXNlIFJlY2VpdmUgRmlsdGVyIHRvIHJlamVjdCB1bndhbnRlZCBNQ0FTVAorCQkgKiBwYWNrZXRzICovCisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCQlyeF9tb2RlID0gUkZBQUI7CisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IG5ldF9kZXYtPm1jX2xpc3Q7CisJCQltY2xpc3QgJiYgaSA8IG5ldF9kZXYtPm1jX2NvdW50OworCQkJaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCXVuc2lnbmVkIGludCBiaXRfbnIgPQorCQkJCXNpczkwMF9tY2FzdF9iaXRucihtY2xpc3QtPmRtaV9hZGRyLCBzaXNfcHJpdi0+Y2hpcHNldF9yZXYpOworCQkJbWNfZmlsdGVyW2JpdF9uciA+PiA0XSB8PSAoMSA8PCAoYml0X25yICYgMHhmKSk7CisJCX0KKwl9CisKKwkvKiB1cGRhdGUgTXVsdGljYXN0IEhhc2ggVGFibGUgaW4gUmVjZWl2ZSBGaWx0ZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdGFibGVfZW50cmllczsgaSsrKSB7CisgICAgICAgICAgICAgICAgLyogd2h5IHBsdXMgMHgwNCA/PywgVGhhdCBtYWtlcyB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgaGFzaCB0YWJsZS4gKi8KKwkJb3V0bCgodTMyKSgweDAwMDAwMDA0K2kpIDw8IFJGQUREUl9zaGlmdCwgaW9hZGRyICsgcmZjcik7CisJCW91dGwobWNfZmlsdGVyW2ldLCBpb2FkZHIgKyByZmRyKTsKKwl9CisKKwlvdXRsKFJGRU4gfCByeF9tb2RlLCBpb2FkZHIgKyByZmNyKTsKKworCS8qIHNpczkwMCBpcyBjYXBhYmxlIG9mIGxvb3BpbmcgYmFjayBwYWNrZXRzIGF0IE1BQyBsZXZlbCBmb3IKKwkgKiBkZWJ1Z2dpbmcgcHVycG9zZSAqLworCWlmIChuZXRfZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykgeworCQl1MzIgY3Jfc2F2ZWQ7CisJCS8qIFdlIG11c3QgZGlzYWJsZSBUeC9SeCBiZWZvcmUgc2V0dGluZyBsb29wYmFjayBtb2RlICovCisJCWNyX3NhdmVkID0gaW5sKGlvYWRkciArIGNyKTsKKwkJb3V0bChjcl9zYXZlZCB8IFR4RElTIHwgUnhESVMsIGlvYWRkciArIGNyKTsKKwkJLyogZW5hYmxlIGxvb3BiYWNrICovCisJCW91dGwoaW5sKGlvYWRkciArIHR4Y2ZnKSB8IFR4TUxCLCBpb2FkZHIgKyB0eGNmZyk7CisJCW91dGwoaW5sKGlvYWRkciArIHJ4Y2ZnKSB8IFJ4QVRYLCBpb2FkZHIgKyByeGNmZyk7CisJCS8qIHJlc3RvcmUgY3IgKi8KKwkJb3V0bChjcl9zYXZlZCwgaW9hZGRyICsgY3IpOworCX0KKworCXJldHVybjsKK30KKworLyoqCisgKglzaXM5MDBfcmVzZXQgLSBSZXNldCBzaXM5MDAgTUFDIAorICoJQG5ldF9kZXY6IHRoZSBuZXQgZGV2aWNlIHRvIHJlc2V0CisgKgorICoJcmVzZXQgc2lzOTAwIE1BQyBhbmQgd2FpdCB1bnRpbCBmaW5pc2hlZAorICoJcmVzZXQgdGhyb3VnaCBjb21tYW5kIHJlZ2lzdGVyCisgKgljaGFuZ2UgYmFja29mZiBhbGdvcml0aG0gZm9yIDkwMEIwICYgNjM1IE0vQgorICovCisKK3N0YXRpYyB2b2lkIHNpczkwMF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKK3sKKwlzdHJ1Y3Qgc2lzOTAwX3ByaXZhdGUgKiBzaXNfcHJpdiA9IG5ldF9kZXYtPnByaXY7CisJbG9uZyBpb2FkZHIgPSBuZXRfZGV2LT5iYXNlX2FkZHI7CisJaW50IGkgPSAwOworCXUzMiBzdGF0dXMgPSBUeFJDTVAgfCBSeFJDTVA7CisKKwlvdXRsKDAsIGlvYWRkciArIGllcik7CisJb3V0bCgwLCBpb2FkZHIgKyBpbXIpOworCW91dGwoMCwgaW9hZGRyICsgcmZjcik7CisKKwlvdXRsKFJ4UkVTRVQgfCBUeFJFU0VUIHwgUkVTRVQgfCBpbmwoaW9hZGRyICsgY3IpLCBpb2FkZHIgKyBjcik7CisJCisJLyogQ2hlY2sgdGhhdCB0aGUgY2hpcCBoYXMgZmluaXNoZWQgdGhlIHJlc2V0LiAqLworCXdoaWxlIChzdGF0dXMgJiYgKGkrKyA8IDEwMDApKSB7CisJCXN0YXR1cyBePSAoaW5sKGlzciArIGlvYWRkcikgJiBzdGF0dXMpOworCX0KKworCWlmKCAoc2lzX3ByaXYtPmNoaXBzZXRfcmV2ID49IFNJUzYzNUFfOTAwX1JFVikgfHwKKwkJCShzaXNfcHJpdi0+Y2hpcHNldF9yZXYgPT0gU0lTOTAwQl85MDBfUkVWKSApCisJCW91dGwoUEVTRUwgfCBSTkRfQ05ULCBpb2FkZHIgKyBjZmcpOworCWVsc2UKKwkJb3V0bChQRVNFTCwgaW9hZGRyICsgY2ZnKTsKK30KKworLyoqCisgKglzaXM5MDBfcmVtb3ZlIC0gUmVtb3ZlIHNpczkwMCBkZXZpY2UgCisgKglAcGNpX2RldjogdGhlIHBjaSBkZXZpY2UgdG8gYmUgcmVtb3ZlZAorICoKKyAqCXJlbW92ZSBhbmQgcmVsZWFzZSBTaVM5MDAgbmV0IGRldmljZQorICovCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzaXM5MDBfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqIHNpc19wcml2ID0gbmV0X2Rldi0+cHJpdjsKKwlzdHJ1Y3QgbWlpX3BoeSAqcGh5ID0gTlVMTDsKKworCXdoaWxlIChzaXNfcHJpdi0+Zmlyc3RfbWlpKSB7CisJCXBoeSA9IHNpc19wcml2LT5maXJzdF9taWk7CisJCXNpc19wcml2LT5maXJzdF9taWkgPSBwaHktPm5leHQ7CisJCWtmcmVlKHBoeSk7CisJfQorCisJcGNpX2ZyZWVfY29uc2lzdGVudChwY2lfZGV2LCBSWF9UT1RBTF9TSVpFLCBzaXNfcHJpdi0+cnhfcmluZywKKwkJc2lzX3ByaXYtPnJ4X3JpbmdfZG1hKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBjaV9kZXYsIFRYX1RPVEFMX1NJWkUsIHNpc19wcml2LT50eF9yaW5nLAorCQlzaXNfcHJpdi0+dHhfcmluZ19kbWEpOworCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldF9kZXYpOworCWZyZWVfbmV0ZGV2KG5ldF9kZXYpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGNpX2Rldik7CisJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIE5VTEwpOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgc2lzOTAwX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKwlsb25nIGlvYWRkciA9IG5ldF9kZXYtPmJhc2VfYWRkcjsKKworCWlmKCFuZXRpZl9ydW5uaW5nKG5ldF9kZXYpKQorCQlyZXR1cm4gMDsKKworCW5ldGlmX3N0b3BfcXVldWUobmV0X2Rldik7CisJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRfZGV2KTsKKworCS8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggU3RhdHVzIE1hY2hpbmUgKi8KKwlvdXRsKFJ4RElTIHwgVHhESVMgfCBpbmwoaW9hZGRyICsgY3IpLCBpb2FkZHIgKyBjcik7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIFBDSV9EM2hvdCk7CisJcGNpX3NhdmVfc3RhdGUocGNpX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaXM5MDBfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRfZGV2LT5wcml2OworCWxvbmcgaW9hZGRyID0gbmV0X2Rldi0+YmFzZV9hZGRyOworCisJaWYoIW5ldGlmX3J1bm5pbmcobmV0X2RldikpCisJCXJldHVybiAwOworCXBjaV9yZXN0b3JlX3N0YXRlKHBjaV9kZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKKworCXNpczkwMF9pbml0X3J4ZmlsdGVyKG5ldF9kZXYpOworCisJc2lzOTAwX2luaXRfdHhfcmluZyhuZXRfZGV2KTsKKwlzaXM5MDBfaW5pdF9yeF9yaW5nKG5ldF9kZXYpOworCisJc2V0X3J4X21vZGUobmV0X2Rldik7CisKKwluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldF9kZXYpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldF9kZXYpOworCisJLyogV29ya2Fyb3VuZCBmb3IgRURCICovCisJc2lzOTAwX3NldF9tb2RlKGlvYWRkciwgSFdfU1BFRURfMTBfTUJQUywgRkRYX0NBUEFCTEVfSEFMRl9TRUxFQ1RFRCk7CisKKwkvKiBFbmFibGUgYWxsIGtub3duIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJb3V0bCgoUnhTT1ZSfFJ4T1JOfFJ4RVJSfFJ4T0t8VHhVUk58VHhFUlJ8VHhJRExFKSwgaW9hZGRyICsgaW1yKTsKKwlvdXRsKFJ4RU5BIHwgaW5sKGlvYWRkciArIGNyKSwgaW9hZGRyICsgY3IpOworCW91dGwoSUUsIGlvYWRkciArIGllcik7CisKKwlzaXM5MDBfY2hlY2tfbW9kZShuZXRfZGV2LCBzaXNfcHJpdi0+bWlpKTsKKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc2lzOTAwX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gU0lTOTAwX01PRFVMRV9OQU1FLAorCS5pZF90YWJsZQk9IHNpczkwMF9wY2lfdGJsLAorCS5wcm9iZQkJPSBzaXM5MDBfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzaXM5MDBfcmVtb3ZlKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IHNpczkwMF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc2lzOTAwX3Jlc3VtZSwKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNpczkwMF9pbml0X21vZHVsZSh2b2lkKQoreworLyogd2hlbiBhIG1vZHVsZSwgdGhpcyBpcyBwcmludGVkIHdoZXRoZXIgb3Igbm90IGRldmljZXMgYXJlIGZvdW5kIGluIHByb2JlICovCisjaWZkZWYgTU9EVUxFCisJcHJpbnRrKHZlcnNpb24pOworI2VuZGlmCisKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZzaXM5MDBfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzaXM5MDBfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnNpczkwMF9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc2lzOTAwX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHNpczkwMF9jbGVhbnVwX21vZHVsZSk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NpczkwMC5oIGIvZHJpdmVycy9uZXQvc2lzOTAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUzYzA2NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NpczkwMC5oCkBAIC0wLDAgKzEsMjc5IEBACisvKiBzaXM5MDAuaCBEZWZpbml0aW9ucyBmb3IgU2lTIGV0aGVybmV0IGNvbnRyb2xsZXJzIGluY2x1ZGluZyA3MDE0LzcwMTYgYW5kIDkwMCAKKyAqIENvcHlyaWdodCAxOTk5IFNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW0gQ29ycG9yYXRpb24KKyAqIFJlZmVyZW5jZXM6CisgKiAgIFNpUyA3MDE2IEZhc3QgRXRoZXJuZXQgUENJIEJ1cyAxMC8xMDAgTWJwcyBMQU4gQ29udHJvbGxlciB3aXRoIE9uTm93IFN1cHBvcnQsCisgKglwcmVsaW1pbmFyeSBSZXYuIDEuMCBKYW4uIDE0LCAxOTk4CisgKiAgIFNpUyA5MDAgRmFzdCBFdGhlcm5ldCBQQ0kgQnVzIDEwLzEwMCBNYnBzIExBTiBTaW5nbGUgQ2hpcCB3aXRoIE9uTm93IFN1cHBvcnQsCisgKglwcmVsaW1pbmFyeSBSZXYuIDEuMCBOb3YuIDEwLCAxOTk4CisgKiAgIFNpUyA3MDE0IFNpbmdsZSBDaGlwIDEwMEJBU0UtVFgvMTBCQVNFLVQgUGh5c2ljYWwgTGF5ZXIgU29sdXRpb24sCisgKglwcmVsaW1pbmFyeSBSZXYuIDEuMCBKYW4uIDE4LCAxOTk4CisgKiAgIGh0dHA6Ly93d3cuc2lzLmNvbS50dy9zdXBwb3J0L2RhdGFib29rLmh0bQorICovCisKKy8qCisgKiBTaVMgNzAxNiBhbmQgU2lTIDkwMCBldGhlcm5ldCBjb250cm9sbGVyIHJlZ2lzdGVycworICovCisKKy8qIFRoZSBJL08gZXh0ZW50LCBTaVMgOTAwIG5lZWRzIDI1NiBieXRlcyBvZiBpbyBhZGRyZXNzICovCisjZGVmaW5lIFNJUzkwMF9UT1RBTF9TSVpFIDB4MTAwCisKKy8qIFN5bWJvbGljIG9mZnNldHMgdG8gcmVnaXN0ZXJzLiAqLworZW51bSBzaXM5MDBfcmVnaXN0ZXJzIHsKKwljcj0weDAsICAgICAgICAgICAgICAgICAvL0NvbW1hbmQgUmVnaXN0ZXIKKwljZmc9MHg0LCAgICAgICAgICAgICAgICAvL0NvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKwltZWFyPTB4OCwgICAgICAgICAgICAgICAvL0VFUFJPTSBBY2Nlc3MgUmVnaXN0ZXIKKwlwdHNjcj0weGMsICAgICAgICAgICAgICAvL1BDSSBUZXN0IENvbnRyb2wgUmVnaXN0ZXIKKwlpc3I9MHgxMCwgICAgICAgICAgICAgICAvL0ludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIKKwlpbXI9MHgxNCwgICAgICAgICAgICAgICAvL0ludGVycnVwdCBNYXNrIFJlZ2lzdGVyCisJaWVyPTB4MTgsICAgICAgICAgICAgICAgLy9JbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyCisJZXBhcj0weDE4LCAgICAgICAgICAgICAgLy9FbmhhbmNlZCBQSFkgQWNjZXNzIFJlZ2lzdGVyCisJdHhkcD0weDIwLCAgICAgICAgICAgICAgLy9UcmFuc21pdCBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIKKyAgICAgICAgdHhjZmc9MHgyNCwgICAgICAgICAgICAgLy9UcmFuc21pdCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisgICAgICAgIHJ4ZHA9MHgzMCwgICAgICAgICAgICAgIC8vUmVjZWl2ZSBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIKKyAgICAgICAgcnhjZmc9MHgzNCwgICAgICAgICAgICAgLy9SZWNlaXZlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKyAgICAgICAgZmxjdHJsPTB4MzgsICAgICAgICAgICAgLy9GbG93IENvbnRyb2wgUmVnaXN0ZXIKKyAgICAgICAgcnhsZW49MHgzYywgICAgICAgICAgICAgLy9SZWNlaXZlIFBhY2tldCBMZW5ndGggUmVnaXN0ZXIKKyAgICAgICAgcmZjcj0weDQ4LCAgICAgICAgICAgICAgLy9SZWNlaXZlIEZpbHRlciBDb250cm9sIFJlZ2lzdGVyCisgICAgICAgIHJmZHI9MHg0QywgICAgICAgICAgICAgIC8vUmVjZWl2ZSBGaWx0ZXIgRGF0YSBSZWdpc3RlcgorICAgICAgICBwbWN0cmw9MHhCMCwgICAgICAgICAgICAvL1Bvd2VyIE1hbmFnZW1lbnQgQ29udHJvbCBSZWdpc3RlcgorICAgICAgICBwbWVyPTB4QjQgICAgICAgICAgICAgICAvL1Bvd2VyIE1hbmFnZW1lbnQgV2FrZS11cCBFdmVudCBSZWdpc3RlcgorfTsKKworLyogU3ltYm9saWMgbmFtZXMgZm9yIGJpdHMgaW4gdmFyaW91cyByZWdpc3RlcnMgKi8KK2VudW0gc2lzOTAwX2NvbW1hbmRfcmVnaXN0ZXJfYml0cyB7CisJUkVMT0FEICA9IDB4MDAwMDA0MDAsIEFDQ0VTU01PREUgPSAweDAwMDAwMjAwLC8qIEVUICovCisJUkVTRVQgICA9IDB4MDAwMDAxMDAsIFNXSSA9IDB4MDAwMDAwODAsIFJ4UkVTRVQgPSAweDAwMDAwMDIwLAorCVR4UkVTRVQgPSAweDAwMDAwMDEwLCBSeERJUyA9IDB4MDAwMDAwMDgsIFJ4RU5BID0gMHgwMDAwMDAwNCwKKwlUeERJUyAgID0gMHgwMDAwMDAwMiwgVHhFTkEgPSAweDAwMDAwMDAxCit9OworCitlbnVtIHNpczkwMF9jb25maWd1cmF0aW9uX3JlZ2lzdGVyX2JpdHMgeworCURFU0NSRk1UID0gMHgwMDAwMDEwMCAvKiA3MDE2IHNwZWNpZmljICovLCBSRVFBTEcgPSAweDAwMDAwMDgwLAorCVNCICAgID0gMHgwMDAwMDA0MCwgUE9XID0gMHgwMDAwMDAyMCwgRVhEID0gMHgwMDAwMDAxMCwgCisJUEVTRUwgPSAweDAwMDAwMDA4LCBMUE0gPSAweDAwMDAwMDA0LCBCRU0gPSAweDAwMDAwMDAxLAorCS8qIDYzNSAmIDkwMEIgU3BlY2lmaWMgKi8KKwlSTkRfQ05UID0gMHgwMDAwMDQwMCwgRkFJUl9CQUNLT0ZGID0gMHgwMDAwMDIwMCwKKwlFREJfTUFTVEVSX0VOID0gMHgwMDAwMjAwMAorfTsKKworZW51bSBzaXM5MDBfZWVwcm9tX2FjY2Vzc19yZWlnc3Rlcl9iaXRzIHsKKwlNREMgID0gMHgwMDAwMDA0MCwgTURESVIgPSAweDAwMDAwMDIwLCBNRElPID0gMHgwMDAwMDAxMCwgLyogNzAxNiBzcGVjaWZpYyAqLyAKKwlFRUNTID0gMHgwMDAwMDAwOCwgRUVDTEsgPSAweDAwMDAwMDA0LCBFRURPID0gMHgwMDAwMDAwMiwKKwlFRURJID0gMHgwMDAwMDAwMQorfTsKKworZW51bSBzaXM5MDBfaW50ZXJydXB0X3JlZ2lzdGVyX2JpdHMgeworCVdLRVZUICA9IDB4MTAwMDAwMDAsIFR4UEFVU0VFTkQgPSAweDA4MDAwMDAwLCBUeFBBVVNFID0gMHgwNDAwMDAwMCwKKwlUeFJDTVAgPSAweDAyMDAwMDAwLCBSeFJDTVAgPSAweDAxMDAwMDAwLCBEUEVSUiA9IDB4MDA4MDAwMDAsCisJU1NFUlIgID0gMHgwMDQwMDAwMCwgUk1BQlQgID0gMHgwMDIwMDAwMCwgUlRBQlQgPSAweDAwMTAwMDAwLAorCVJ4U09WUiA9IDB4MDAwMTAwMDAsIEhJQkVSUiA9IDB4MDAwMDgwMDAsIFNXSU5UID0gMHgwMDAwMTAwMCwKKwlNSUJJTlQgPSAweDAwMDAwODAwLCBUeFVSTiAgPSAweDAwMDAwNDAwLCBUeElETEUgID0gMHgwMDAwMDIwMCwKKwlUeEVSUiAgPSAweDAwMDAwMTAwLCBUeERFU0MgPSAweDAwMDAwMDgwLCBUeE9LICA9IDB4MDAwMDAwNDAsCisJUnhPUk4gID0gMHgwMDAwMDAyMCwgUnhJRExFID0gMHgwMDAwMDAxMCwgUnhFQVJMWSA9IDB4MDAwMDAwMDgsCisJUnhFUlIgID0gMHgwMDAwMDAwNCwgUnhERVNDID0gMHgwMDAwMDAwMiwgUnhPSyAgPSAweDAwMDAwMDAxCit9OworCitlbnVtIHNpczkwMF9pbnRlcnJ1cHRfZW5hYmxlX3JlaWdzdGVyX2JpdHMgeworCUlFID0gMHgwMDAwMDAwMQorfTsKKworLyogbWF4aW11bSBkbWEgYnVyc3QgZm9yIHRyYW5zbWlzc2lvbiBhbmQgcmVjZWl2ZSAqLworI2RlZmluZSBNQVhfRE1BX1JBTkdFCTcJLyogYWN0dWFsbHkgMCBtZWFucyBNQVhJTVVNICEhICovCisjZGVmaW5lIFR4TVhETUFfc2hpZnQgICAJMjAKKyNkZWZpbmUgUnhNWERNQV9zaGlmdCAgICAyMAorCitlbnVtIHNpczkwMF90eF9yeF9kbWF7CisJRE1BX0JVUlNUXzUxMiA9IDAsCURNQV9CVVJTVF82NCA9IDUKK307CisKKy8qIHRyYW5zbWl0IEZJRk8gdGhyZXNob2xkcyAqLworI2RlZmluZSBUWF9GSUxMX1RIUkVTSCAgIDE2CS8qIDEvNCBGSUZPIHNpemUgKi8KKyNkZWZpbmUgVHhGSUxMVF9zaGlmdCAgIAk4CisjZGVmaW5lIFR4RFJOVF9zaGlmdCAgICAJMAorI2RlZmluZSBUeERSTlRfMTAwICAgICAgCTQ4CS8qIDMvNCBGSUZPIHNpemUgKi8KKyNkZWZpbmUgVHhEUk5UXzEwCQkxNiAJLyogMS8yIEZJRk8gc2l6ZSAqLworCitlbnVtIHNpczkwMF90cmFuc21pdF9jb25maWdfcmVnaXN0ZXJfYml0cyB7CisJVHhDU0kgPSAweDgwMDAwMDAwLCBUeEhCSSA9IDB4NDAwMDAwMDAsIFR4TUxCID0gMHgyMDAwMDAwMCwKKwlUeEFUUCA9IDB4MTAwMDAwMDAsIFR4SUZHID0gMHgwQzAwMDAwMCwgVHhGSUxMVCA9IDB4MDAwMDNGMDAsCisJVHhEUk5UID0gMHgwMDAwMDAzRgorfTsKKworLyogcmVjZXZpZSBGSUZPIHRocmVzaG9sZHMgKi8KKyNkZWZpbmUgUnhEUk5UX3NoaWZ0ICAgICAxCisjZGVmaW5lIFJ4RFJOVF8xMDAJMTYJLyogMS8yIEZJRk8gc2l6ZSAqLworI2RlZmluZSBSeERSTlRfMTAJCTI0IAkvKiAzLzQgRklGTyBzaXplICovCisKK2VudW0gc2lzOTAwX3JldmVpdmVfY29uZmlnX3JlZ2lzdGVyX2JpdHMgeworCVJ4QUVQICA9IDB4ODAwMDAwMDAsIFJ4QVJQID0gMHg0MDAwMDAwMCwgUnhBVFggPSAweDEwMDAwMDAwLAorCVJ4QUpBQiA9IDB4MDgwMDAwMDAsIFJ4RFJOVCA9IDB4MDAwMDAwN0YKK307CisKKyNkZWZpbmUgUkZBQV9zaGlmdCAgICAgIDI4CisjZGVmaW5lIFJGQUREUl9zaGlmdCAgICAxNgorCitlbnVtIHNpczkwMF9yZWNlaXZlX2ZpbHRlcl9jb250cm9sX3JlZ2lzdGVyX2JpdHMgeworCVJGRU4gID0gMHg4MDAwMDAwMCwgUkZBQUIgPSAweDQwMDAwMDAwLCBSRkFBTSA9IDB4MjAwMDAwMDAsCisJUkZBQVAgPSAweDEwMDAwMDAwLCBSRlByb21pc2N1b3VzID0gKFJGQUFCfFJGQUFNfFJGQUFQKQorfTsKKworZW51bSBzaXM5MDBfcmV2ZWl2ZV9maWx0ZXJfZGF0YV9tYXNrIHsKKwlSRkRBVCA9ICAweDAwMDBGRkZGCit9OworCisvKiBFRVBST00gQWRkcmVzc2VzICovCitlbnVtIHNpczkwMF9lZXByb21fYWRkcmVzcyB7CisJRUVQUk9NU2lnbmF0dXJlID0gMHgwMCwgRUVQUk9NVmVuZG9ySUQgPSAweDAyLCBFRVBST01EZXZpY2VJRCA9IDB4MDMsCisJRUVQUk9NTUFDQWRkciAgID0gMHgwOCwgRUVQUk9NQ2hlY2tzdW0gPSAweDBiCit9OworCisvKiBUaGUgRUVQUk9NIGNvbW1hbmRzIGluY2x1ZGUgdGhlIGFsd2F5LXNldCBsZWFkaW5nIGJpdC4gUmVmZXIgdG8gTk05M0N4eCBkYXRhc2hlZXQgKi8KK2VudW0gc2lzOTAwX2VlcHJvbV9jb21tYW5kIHsKKwlFRXJlYWQgICAgID0gMHgwMTgwLCBFRXdyaXRlICAgID0gMHgwMTQwLCBFRWVyYXNlID0gMHgwMUMwLCAKKwlFRXdyaXRlRW5hYmxlID0gMHgwMTMwLCBFRXdyaXRlRGlzYWJsZSA9IDB4MDEwMCwKKwlFRWVyYXNlQWxsID0gMHgwMTIwLCBFRXdyaXRlQWxsID0gMHgwMTEwLCAKKwlFRWFkZHJNYXNrID0gMHgwMTNGLCBFRWNtZFNoaWZ0ID0gMTYKK307CisKKy8qIEZvciBTaVM5NjIgb3IgU2lTOTYzLCByZXF1ZXN0IHRoZSBlZXByb20gc29mdHdhcmUgYWNjZXNzICovCitlbnVtIHNpczk2eF9lZXByb21fY29tbWFuZCB7CisJRUVSRVEgPSAweDAwMDAwNDAwLCBFRURPTkUgPSAweDAwMDAwMjAwLCBFRUdOVCA9IDB4MDAwMDAxMDAKK307CisKKy8qIE1hbmFnZW1lbnQgRGF0YSBJL08gKG1kaW8pIGZyYW1lICovCisjZGVmaW5lIE1JSXJlYWQgICAgICAgICAweDYwMDAKKyNkZWZpbmUgTUlJd3JpdGUgICAgICAgIDB4NTAwMgorI2RlZmluZSBNSUlwbWRTaGlmdCAgICAgNworI2RlZmluZSBNSUlyZWdTaGlmdCAgICAgMgorI2RlZmluZSBNSUljbWRMZW4gICAgICAgMTYKKyNkZWZpbmUgTUlJY21kU2hpZnQgICAgIDE2CisKKy8qIEJ1ZmZlciBEZXNjcmlwdG9yIFN0YXR1cyovCitlbnVtIHNpczkwMF9idWZmZXJfc3RhdHVzIHsKKwlPV04gICAgPSAweDgwMDAwMDAwLCBNT1JFICAgPSAweDQwMDAwMDAwLCBJTlRSID0gMHgyMDAwMDAwMCwKKwlTVVBDUkMgPSAweDEwMDAwMDAwLCBJTkNDUkMgPSAweDEwMDAwMDAwLAorCU9LICAgICA9IDB4MDgwMDAwMDAsIERTSVpFICA9IDB4MDAwMDBGRkYKK307CisvKiBTdGF0dXMgZm9yIFRYIEJ1ZmZlcnMgKi8KK2VudW0gc2lzOTAwX3R4X2J1ZmZlcl9zdGF0dXMgeworCUFCT1JUICAgPSAweDA0MDAwMDAwLCBVTkRFUlJVTiA9IDB4MDIwMDAwMDAsIE5PQ0FSUklFUiA9IDB4MDEwMDAwMDAsCisJREVGRVJEICA9IDB4MDA4MDAwMDAsIEVYQ0RFRkVSID0gMHgwMDQwMDAwMCwgT1dDT0xMICAgID0gMHgwMDIwMDAwMCwKKwlFWENDT0xMID0gMHgwMDEwMDAwMCwgQ09MQ05UICAgPSAweDAwMEYwMDAwCit9OworCitlbnVtIHNpczkwMF9yeF9idWZlcl9zdGF0dXMgeworCU9WRVJSVU4gPSAweDAyMDAwMDAwLCBERVNUID0gMHgwMDgwMDAwMCwgICAgIEJDQVNUID0gMHgwMTgwMDAwMCwKKwlNQ0FTVCAgID0gMHgwMTAwMDAwMCwgVU5JTUFUQ0ggPSAweDAwODAwMDAwLCBUT09MT05HID0gMHgwMDQwMDAwMCwKKwlSVU5UICAgID0gMHgwMDIwMDAwMCwgUlhJU0VSUiAgPSAweDAwMTAwMDAwLCBDUkNFUlIgID0gMHgwMDA4MDAwMCwKKwlGQUVSUiAgID0gMHgwMDA0MDAwMCwgTE9PUEJLICAgPSAweDAwMDIwMDAwLCBSWENPTCAgID0gMHgwMDAxMDAwMAorfTsKKworLyogTUlJIHJlZ2lzdGVyIG9mZnNldHMgKi8KK2VudW0gbWlpX3JlZ2lzdGVycyB7CisJTUlJX0NPTlRST0wgPSAweDAwMDAsIE1JSV9TVEFUVVMgPSAweDAwMDEsIE1JSV9QSFlfSUQwID0gMHgwMDAyLAorCU1JSV9QSFlfSUQxID0gMHgwMDAzLCBNSUlfQU5BRFYgID0gMHgwMDA0LCBNSUlfQU5MUEFSICA9IDB4MDAwNSwKKwlNSUlfQU5FWFQgICA9IDB4MDAwNgorfTsKKworLyogbWlpIHJlZ2lzdGVycyBzcGVjaWZpYyB0byBTaVMgOTAwICovCitlbnVtIHNpc19taWlfcmVnaXN0ZXJzIHsKKwlNSUlfQ09ORklHMSA9IDB4MDAxMCwgTUlJX0NPTkZJRzIgPSAweDAwMTEsIE1JSV9TVFNPVVQgPSAweDAwMTIsCisJTUlJX01BU0sgICAgPSAweDAwMTMsIE1JSV9SRVNWICAgID0gMHgwMDE0Cit9OworCisvKiBtaWkgcmVnaXN0ZXJzIHNwZWNpZmljIHRvIElDUyAxODkzICovCitlbnVtIGljc19taWlfcmVnaXN0ZXJzIHsKKwlNSUlfRVhUQ1RSTCAgPSAweDAwMTAsIE1JSV9RUERTVFMgPSAweDAwMTEsIE1JSV8xMEJUT1AgPSAweDAwMTIsCisJTUlJX0VYVENUUkwyID0gMHgwMDEzCit9OworCisvKiBtaWkgcmVnaXN0ZXJzIHNwZWNpZmljIHRvIEFNRCA3OUM5MDEgKi8KK2VudW0gYW1kX21paV9yZWdpc3RlcnMgeworCU1JSV9TVEFUVVNfU1VNTUFSWSA9IDB4MDAxOAorfTsKKworLyogTUlJIENvbnRyb2wgcmVnaXN0ZXIgYml0IGRlZmluaXRpb25zLiAqLworZW51bSBtaWlfY29udHJvbF9yZWdpc3Rlcl9iaXRzIHsKKwlNSUlfQ05UTF9GRFggICAgID0gMHgwMTAwLCBNSUlfQ05UTF9SU1RfQVVUTyA9IDB4MDIwMCwgCisJTUlJX0NOVExfSVNPTEFURSA9IDB4MDQwMCwgTUlJX0NOVExfUFdSRFdOICAgPSAweDA4MDAsCisJTUlJX0NOVExfQVVUTyAgICA9IDB4MTAwMCwgTUlJX0NOVExfU1BFRUQgICAgPSAweDIwMDAsCisJTUlJX0NOVExfTFBCSyAgICA9IDB4NDAwMCwgTUlJX0NOVExfUkVTRVQgICAgPSAweDgwMDAKK307CisKKy8qIE1JSSBTdGF0dXMgcmVnaXN0ZXIgYml0ICAqLworZW51bSBtaWlfc3RhdHVzX3JlZ2lzdGVyX2JpdHMgeworCU1JSV9TVEFUX0VYVCAgICA9IDB4MDAwMSwgTUlJX1NUQVRfSkFCICAgICAgICA9IDB4MDAwMiwgCisJTUlJX1NUQVRfTElOSyAgID0gMHgwMDA0LCBNSUlfU1RBVF9DQU5fQVVUTyAgID0gMHgwMDA4LCAKKwlNSUlfU1RBVF9GQVVMVCAgPSAweDAwMTAsIE1JSV9TVEFUX0FVVE9fRE9ORSAgPSAweDAwMjAsCisJTUlJX1NUQVRfQ0FOX1QgID0gMHgwODAwLCBNSUlfU1RBVF9DQU5fVF9GRFggID0gMHgxMDAwLAorCU1JSV9TVEFUX0NBTl9UWCA9IDB4MjAwMCwgTUlJX1NUQVRfQ0FOX1RYX0ZEWCA9IDB4NDAwMCwKKwlNSUlfU1RBVF9DQU5fVDQgPSAweDgwMDAKK307CisKKyNkZWZpbmUJCU1JSV9JRDFfT1VJX0xPCQkweEZDMDAJLyogbG93IGJpdHMgb2YgT1VJIG1hc2sgKi8KKyNkZWZpbmUJCU1JSV9JRDFfTU9ERUwJCTB4MDNGMAkvKiBtb2RlbCBudW1iZXIgKi8KKyNkZWZpbmUJCU1JSV9JRDFfUkVWCQkweDAwMEYJLyogbW9kZWwgbnVtYmVyICovCisKKy8qIE1JSSBOV0FZIFJlZ2lzdGVyIEJpdHMgLi4uCisgICB2YWxpZCBmb3IgdGhlIEFOQVIgKEF1dG8tTmVnb3RpYXRpb24gQWR2ZXJ0aXNlbWVudCkgYW5kCisgICBBTkxQQVIgKEF1dG8tTmVnb3RpYXRpb24gTGluayBQYXJ0bmVyKSByZWdpc3RlcnMgKi8KK2VudW0gbWlpX253YXlfcmVnaXN0ZXJfYml0cyB7CisJTUlJX05XQVlfTk9ERV9TRUwgPSAweDAwMWYsIE1JSV9OV0FZX0NTTUFfQ0QgPSAweDAwMDEsCisJTUlJX05XQVlfVAkgID0gMHgwMDIwLCBNSUlfTldBWV9UX0ZEWCAgID0gMHgwMDQwLAorCU1JSV9OV0FZX1RYICAgICAgID0gMHgwMDgwLCBNSUlfTldBWV9UWF9GRFggID0gMHgwMTAwLAorCU1JSV9OV0FZX1Q0ICAgICAgID0gMHgwMjAwLCBNSUlfTldBWV9QQVVTRSAgID0gMHgwNDAwLAorCU1JSV9OV0FZX1JGICAgICAgID0gMHgyMDAwLCBNSUlfTldBWV9BQ0sgICAgID0gMHg0MDAwLAorCU1JSV9OV0FZX05QICAgICAgID0gMHg4MDAwCit9OworCitlbnVtIG1paV9zdHNvdXRfcmVnaXN0ZXJfYml0cyB7CisJTUlJX1NUU09VVF9MSU5LX0ZBSUwgPSAweDQwMDAsCisJTUlJX1NUU09VVF9TUEQgICAgICAgPSAweDAwODAsIE1JSV9TVFNPVVRfRFBMWCA9IDB4MDA0MAorfTsKKworZW51bSBtaWlfc3RzaWNzX3JlZ2lzdGVyX2JpdHMgeworCU1JSV9TVFNJQ1NfU1BEICA9IDB4ODAwMCwgTUlJX1NUU0lDU19EUExYID0gMHg0MDAwLAorCU1JSV9TVFNJQ1NfTElOS1NUUyA9IDB4MDAwMQorfTsKKworZW51bSBtaWlfc3Rzc3VtX3JlZ2lzdGVyX2JpdHMgeworCU1JSV9TVFNTVU1fTElOSyA9IDB4MDAwOCwgTUlJX1NUU1NVTV9EUExYID0gMHgwMDA0LAorCU1JSV9TVFNTVU1fQVVUTyA9IDB4MDAwMiwgTUlJX1NUU1NVTV9TUEQgID0gMHgwMDAxCit9OworCitlbnVtIHNpczkwMF9yZXZpc2lvbl9pZCB7CisJU0lTNjMwQV85MDBfUkVWID0gMHg4MCwJCVNJUzYzMEVfOTAwX1JFViA9IDB4ODEsCisJU0lTNjMwU185MDBfUkVWID0gMHg4MiwJCVNJUzYzMEVBMV85MDBfUkVWID0gMHg4MywKKwlTSVM2MzBFVF85MDBfUkVWID0gMHg4NCwJU0lTNjM1QV85MDBfUkVWID0gMHg5MCwKKwlTSVM5NnhfOTAwX1JFViA9IDBYOTEsCQlTSVM5MDBCXzkwMF9SRVYgPSAweDAzCit9OworCitlbnVtIHNpczYzMF9yZXZpc2lvbl9pZCB7CisJU0lTNjMwQTAgICAgPSAweDAwLCBTSVM2MzBBMSAgICAgID0gMHgwMSwKKwlTSVM2MzBCMCAgICA9IDB4MTAsIFNJUzYzMEIxICAgICAgPSAweDExCit9OworCisjZGVmaW5lIEZEWF9DQVBBQkxFX0RVUExFWF9VTktOT1dOICAgICAgMAorI2RlZmluZSBGRFhfQ0FQQUJMRV9IQUxGX1NFTEVDVEVEICAgICAgIDEKKyNkZWZpbmUgRkRYX0NBUEFCTEVfRlVMTF9TRUxFQ1RFRCAgICAgICAyCisKKyNkZWZpbmUgSFdfU1BFRURfVU5DT05GSUcJCTAKKyNkZWZpbmUgSFdfU1BFRURfSE9NRQkJMQorI2RlZmluZSBIV19TUEVFRF8xMF9NQlBTICAgICAgICAJMTAKKyNkZWZpbmUgSFdfU1BFRURfMTAwX01CUFMgICAgICAgCTEwMAorI2RlZmluZSBIV19TUEVFRF9ERUZBVUxUICAgICAgICAJKEhXX1NQRUVEXzEwMF9NQlBTKQorCisjZGVmaW5lIENSQ19TSVpFICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTUFDX0hFQURFUl9TSVpFICAgICAgICAgMTQKKworI2RlZmluZSBUWF9CVUZfU0laRSAgICAgMTUzNgorI2RlZmluZSBSWF9CVUZfU0laRSAgICAgMTUzNgorCisjZGVmaW5lIE5VTV9UWF9ERVNDICAgICAxNiAgICAgIAkvKiBOdW1iZXIgb2YgVHggZGVzY3JpcHRvciByZWdpc3RlcnMuICovCisjZGVmaW5lIE5VTV9SWF9ERVNDICAgICAxNiAgICAgICAJLyogTnVtYmVyIG9mIFJ4IGRlc2NyaXB0b3IgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBUWF9UT1RBTF9TSVpFCU5VTV9UWF9ERVNDKnNpemVvZihCdWZmZXJEZXNjKQorI2RlZmluZSBSWF9UT1RBTF9TSVpFCU5VTV9SWF9ERVNDKnNpemVvZihCdWZmZXJEZXNjKQorCisvKiBQQ0kgc3R1ZmYsIHNob3VsZCBiZSBtb3ZlIHRvIHBjaS5oICovCisjZGVmaW5lIFNJUzYzMF9WRU5ET1JfSUQgICAgICAgIDB4MTAzOQorI2RlZmluZSBTSVM2MzBfREVWSUNFX0lEICAgICAgICAweDA2MzAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9zazk4bGluL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ODMwMzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL01ha2VmaWxlCkBAIC0wLDAgKzEsODkgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBTeXNLb25uZWN0IFNLLTk4eHggZGV2aWNlIGRyaXZlci4KKyMKKworCisjCisjIFN0YW5kYWxvbmUgZHJpdmVyIHBhcmFtcworIyBTS1BBUkFNICs9IC1EU0tfS0VSTkVMXzI0CisjIFNLUEFSQU0gKz0gLURTS19LRVJORUxfMjRfMjYKKyMgU0tQQVJBTSArPSAtRFNLX0tFUk5FTF8yNgorIyBTS1BBUkFNICs9IC1EU0tfS0VSTkVMXzIyXzI0CisKK29iai0kKENPTkZJR19TSzk4TElOKSArPSBzazk4bGluLm8KK3NrOThsaW4tb2JqcyAgICA6PQlcCisJCXNrZ2UubwkJXAorCQlza2V0aHRvb2wubwlcCisJCXNrZGltLm8JCVwKKwkJc2thZGRyLm8JXAorCQlza2dlaHd0Lm8JXAorCQlza2dlaW5pdC5vCVwKKwkJc2tnZXBubWkubwlcCisJCXNrZ2VzaXJxLm8JXAorCQlza2kyYy5vCQlcCisJCXNrbG04MC5vCVwKKwkJc2txdWV1ZS5vCVwKKwkJc2tybG10Lm8JXAorCQlza3RpbWVyLm8JXAorCQlza3ZwZC5vCQlcCisJCXNreG1hYzIubwlcCisJCXNrcHJvYy5vCVwKKwkJc2tjc3VtLm8KKworIyBEQkdERUYgPSAgXAorIyAtRERFQlVHCisKK2lmZGVmIERFQlVHCitEQkdERUYgKz0gIFwKKy1EU0tfREVCVUdfQ0hLTU9EPTB4MDAwMDAwMDBMIFwKKy1EU0tfREVCVUdfQ0hLQ0FUPTB4MDAwMDAwMDBMCitlbmRpZgorCisKKyMgKioqKiBwb3NzaWJsZSBkZWJ1ZyBtb2R1bGVzIGZvciBTS19ERUJVR19DSEtNT0QgKioqKioqKioqKioqKioqKioKKyMgU0tfREJHTU9EX01FUlIgICAgICAgIDB4MDAwMDAwMDFMICAgICAvKiBnZW5lcmFsIG1vZHVsZSBlcnJvciBpbmRpY2F0aW9uICovCisjIFNLX0RCR01PRF9IV00gICAgICAgICAweDAwMDAwMDAyTCAgICAgLyogSGFyZHdhcmUgaW5pdCBtb2R1bGUgKi8KKyMgU0tfREJHTU9EX1JMTVQgICAgICAgIDB4MDAwMDAwMDRMICAgICAvKiBSTE1UIG1vZHVsZSAqLworIyBTS19EQkdNT0RfVlBEICAgICAgICAgMHgwMDAwMDAwOEwgICAgIC8qIFZQRCBtb2R1bGUgKi8KKyMgU0tfREJHTU9EX0kyQyAgICAgICAgIDB4MDAwMDAwMTBMICAgICAvKiBJMkMgbW9kdWxlICovCisjIFNLX0RCR01PRF9QTk1JICAgICAgICAweDAwMDAwMDIwTCAgICAgLyogUE5NSSBtb2R1bGUgKi8KKyMgU0tfREJHTU9EX0NTVU0gICAgICAgIDB4MDAwMDAwNDBMICAgICAvKiBDU1VNIG1vZHVsZSAqLworIyBTS19EQkdNT0RfQUREUiAgICAgICAgMHgwMDAwMDA4MEwgICAgIC8qIEFERFIgbW9kdWxlICovCisjIFNLX0RCR01PRF9EUlYgICAgICAgICAweDAwMDEwMDAwTCAgICAgLyogRFJWIG1vZHVsZSAqLworCisjICoqKiogcG9zc2libGUgZGVidWcgY2F0ZWdvcmllcyBmb3IgU0tfREVCVUdfQ0hLQ0FUICoqKioqKioqKioqKioqCisjICoqKiBjb21tb24gbW9kdWxlcyAqKioKKyMgU0tfREJHQ0FUX0lOSVQgICAgICAgIDB4MDAwMDAwMDFMICAgICBtb2R1bGUvZHJpdmVyIGluaXRpYWxpemF0aW9uCisjIFNLX0RCR0NBVF9DVFJMICAgICAgICAweDAwMDAwMDAyTCAgICAgY29udHJvbGxpbmc6IGFkZC9ybXYgTUNBL01BQyBhbmQgb3RoZXIgY29udHJvbHMgKElPQ1RMKQorIyBTS19EQkdDQVRfRVJSICAgICAgICAgMHgwMDAwMDAwNEwgICAgIGVycm9yIGhhbmRsaW5nIHBhdGhzCisjIFNLX0RCR0NBVF9UWCAgICAgICAgICAweDAwMDAwMDA4TCAgICAgdHJhbnNtaXQgcGF0aAorIyBTS19EQkdDQVRfUlggICAgICAgICAgMHgwMDAwMDAxMEwgICAgIHJlY2VpdmUgcGF0aAorIyBTS19EQkdDQVRfSVJRICAgICAgICAgMHgwMDAwMDAyMEwgICAgIGdlbmVyYWwgSVJRIGhhbmRsaW5nCisjIFNLX0RCR0NBVF9RVUVVRSAgICAgICAweDAwMDAwMDQwTCAgICAgYW55IHF1ZXVlIG1hbmFnZW1lbnQKKyMgU0tfREJHQ0FUX0RVTVAgICAgICAgIDB4MDAwMDAwODBMICAgICBsYXJnZSBkYXRhIG91dHB1dCBlLmcuIGhleCBkdW1wCisjIFNLX0RCR0NBVF9GQVRBTCAgICAgICAweDAwMDAwMTAwTCAgICAgbGFyZ2UgZGF0YSBvdXRwdXQgZS5nLiBoZXggZHVtcAorCisjICoqKiBkcml2ZXIgKGZpbGUgc2tnZS5jKSAqKioKKyMgU0tfREJHQ0FUX0RSVl9FTlRSWSAgICAgICAgICAgMHgwMDAxMDAwMCAgICAgIGVudHJ5IHBvaW50cworIyBTS19EQkdDQVRfRFJWXz8/PyAgICAgICAgICAgICAweDAwMDIwMDAwICAgICAgbm90IHVzZWQKKyMgU0tfREJHQ0FUX0RSVl9NQ0EgICAgICAgICAgICAgMHgwMDA0MDAwMCAgICAgIG11bHRpY2FzdAorIyBTS19EQkdDQVRfRFJWX1RYX1BST0dSRVNTICAgICAweDAwMDgwMDAwICAgICAgdHggcGF0aAorIyBTS19EQkdDQVRfRFJWX1JYX1BST0dSRVNTICAgICAweDAwMTAwMDAwICAgICAgcnggcGF0aAorIyBTS19EQkdDQVRfRFJWX1BST0dSRVNTICAgICAgICAweDAwMjAwMDAwICAgICAgZ2VuZXJhbCBydW50aW1lCisjIFNLX0RCR0NBVF9EUlZfPz8/ICAgICAgICAgICAgIDB4MDA0MDAwMDAgICAgICBub3QgdXNlZAorIyBTS19EQkdDQVRfRFJWX1BST00gICAgICAgICAgICAweDAwODAwMDAwICAgICAgcHJvbWlzY3VvdXMgbW9kZQorIyBTS19EQkdDQVRfRFJWX1RYX0ZSQU1FICAgICAgICAweDAxMDAwMDAwICAgICAgZGlzcGxheSB0eCBmcmFtZXMKKyMgU0tfREJHQ0FUX0RSVl9FUlJPUiAgICAgICAgICAgMHgwMjAwMDAwMCAgICAgIGVycm9yIGNvbmRpdGlvbnMKKyMgU0tfREJHQ0FUX0RSVl9JTlRfU1JDICAgICAgICAgMHgwNDAwMDAwMCAgICAgIGludGVycnVwdHMgc291cmNlcworIyBTS19EQkdDQVRfRFJWX0VWRU5UICAgICAgICAgICAweDA4MDAwMDAwICAgICAgZHJpdmVyIGV2ZW50cworCitFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL25ldC9zazk4bGluIC1EU0tfRElBR19TVVBQT1JUIC1EU0tfVVNFX0NTVU0gLURHRU5FU0lTIC1EWVVLT04gJChEQkdERUYpICQoU0tQQVJBTSkKKworY2xlYW46CisJcm0gLWYgY29yZSAqLm8gKi5hICoucworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL2xtODAuaCBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9sbTgwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyZGJiZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9sbTgwLmgKQEAgLTAsMCArMSwxNzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglsbTgwLmgJCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBDb21tb24gTW9kdWxlcworICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjYgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDUvMTMgMTc6MjY6NTIgJAorICogUHVycG9zZToJQ29udGFpbnMgYWxsIGRlZmluZXMgZm9yIHRoZSBMTTgwIENoaXAKKyAqCQkoTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcikuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19JTkNfTE04MF9ICisjZGVmaW5lIF9fSU5DX0xNODBfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCS8qIF9fY3BsdXNwbHVzICovCisKKy8qIGRlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBMTTgwIHJlZ2lzdGVyIGRlZmluaXRpb24KKyAqCisgKiBBbGwgcmVnaXN0ZXJzIGFyZSA4IGJpdCB3aWRlCisgKi8KKyNkZWZpbmUgTE04MF9DRkcJCQkweDAwCS8qIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTE04MF9JU1JDXzEJCQkweDAxCS8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBMTTgwX0lTUkNfMgkJCTB4MDIJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAyICovCisjZGVmaW5lIExNODBfSU1TS18xCQkJMHgwMwkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAxICovCisjZGVmaW5lIExNODBfSU1TS18yCQkJMHgwNAkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAyICovCisjZGVmaW5lIExNODBfRkFOX0NUUkwJCTB4MDUJLyogRmFuIERldmlzb3IvUlNUIy9PUyMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTE04MF9URU1QX0NUUkwJCTB4MDYJLyogT1MjIENvbmZpZywgVGVtcCBSZXMuIFJlZyAqLworCS8qIDB4MDcgLSAweDFmIHJlc2VydmVkCSovCisJLyogY3VycmVudCB2YWx1ZXMgKi8KKyNkZWZpbmUgTE04MF9WVDBfSU4JCQkweDIwCS8qIGN1cnJlbnQgVm9sdGFnZSAwIHZhbHVlICovCisjZGVmaW5lIExNODBfVlQxX0lOCQkJMHgyMQkvKiBjdXJyZW50IFZvbHRhZ2UgMSB2YWx1ZSAqLworI2RlZmluZSBMTTgwX1ZUMl9JTgkJCTB4MjIJLyogY3VycmVudCBWb2x0YWdlIDIgdmFsdWUgKi8KKyNkZWZpbmUgTE04MF9WVDNfSU4JCQkweDIzCS8qIGN1cnJlbnQgVm9sdGFnZSAzIHZhbHVlICovCisjZGVmaW5lIExNODBfVlQ0X0lOCQkJMHgyNAkvKiBjdXJyZW50IFZvbHRhZ2UgNCB2YWx1ZSAqLworI2RlZmluZSBMTTgwX1ZUNV9JTgkJCTB4MjUJLyogY3VycmVudCBWb2x0YWdlIDUgdmFsdWUgKi8KKyNkZWZpbmUgTE04MF9WVDZfSU4JCQkweDI2CS8qIGN1cnJlbnQgVm9sdGFnZSA2IHZhbHVlICovCisjZGVmaW5lIExNODBfVEVNUF9JTgkJMHgyNwkvKiBjdXJyZW50IFRlbXBlcmF0dXJlIHZhbHVlICovCisjZGVmaW5lIExNODBfRkFOMV9JTgkJMHgyOAkvKiBjdXJyZW50IEZhbiAxIGNvdW50ICovCisjZGVmaW5lIExNODBfRkFOMl9JTgkJMHgyOQkvKiBjdXJyZW50IEZhbiAyIGNvdW50ICovCisJLyogbGltaXQgdmFsdWVzICovCisjZGVmaW5lIExNODBfVlQwX0hJR0hfTElNCTB4MmEJLyogaGlnaCBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgMCAqLworI2RlZmluZSBMTTgwX1ZUMF9MT1dfTElNCTB4MmIJLyogbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSAwICovCisjZGVmaW5lIExNODBfVlQxX0hJR0hfTElNCTB4MmMJLyogaGlnaCBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgMSAqLworI2RlZmluZSBMTTgwX1ZUMV9MT1dfTElNCTB4MmQJLyogbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSAxICovCisjZGVmaW5lIExNODBfVlQyX0hJR0hfTElNCTB4MmUJLyogaGlnaCBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgMiAqLworI2RlZmluZSBMTTgwX1ZUMl9MT1dfTElNCTB4MmYJLyogbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSAyICovCisjZGVmaW5lIExNODBfVlQzX0hJR0hfTElNCTB4MzAJLyogaGlnaCBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgMyAqLworI2RlZmluZSBMTTgwX1ZUM19MT1dfTElNCTB4MzEJLyogbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSAzICovCisjZGVmaW5lIExNODBfVlQ0X0hJR0hfTElNCTB4MzIJLyogaGlnaCBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgNCAqLworI2RlZmluZSBMTTgwX1ZUNF9MT1dfTElNCTB4MzMJLyogbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSA0ICovCisjZGVmaW5lIExNODBfVlQ1X0hJR0hfTElNCTB4MzQJLyogaGlnaCBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgNSAqLworI2RlZmluZSBMTTgwX1ZUNV9MT1dfTElNCTB4MzUJLyogbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSA1ICovCisjZGVmaW5lIExNODBfVlQ2X0hJR0hfTElNCTB4MzYJLyogaGlnaCBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgNiAqLworI2RlZmluZSBMTTgwX1ZUNl9MT1dfTElNCTB4MzcJLyogbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSA2ICovCisjZGVmaW5lIExNODBfVEhPVF9MSU1fVVAJMHgzOAkvKiBob3QgdGVtcGVyYXR1cmUgbGltaXQgKGhpZ2gpICovCisjZGVmaW5lIExNODBfVEhPVF9MSU1fTE8JMHgzOQkvKiBob3QgdGVtcGVyYXR1cmUgbGltaXQgKGxvdykgKi8KKyNkZWZpbmUgTE04MF9UT1NfTElNX1VQCQkweDNhCS8qIE9TIHRlbXBlcmF0dXJlIGxpbWl0IChoaWdoKSAqLworI2RlZmluZSBMTTgwX1RPU19MSU1fTE8JCTB4M2IJLyogT1MgdGVtcGVyYXR1cmUgbGltaXQgKGxvdykgKi8KKyNkZWZpbmUgTE04MF9GQU4xX0NPVU5UX0xJTQkweDNjCS8qIEZhbiAxIGNvdW50IGxpbWl0IChoaWdoKSAqLworI2RlZmluZSBMTTgwX0ZBTjJfQ09VTlRfTElNCTB4M2QJLyogRmFuIDIgY291bnQgbGltaXQgKGxvdykgKi8KKwkvKiAweDNlIC0gMHgzZiByZXNlcnZlZAkqLworCisvKgorICogTE04MCBiaXQgZGVmaW5pdGlvbnMKKyAqLworCisvKglMTTgwX0NGRwkJQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBMTTgwX0NGR19TVEFSVAkJKDE8PDApCS8qIHN0YXJ0IG1vbml0b3Jpbmcgb3BlcmF0aW9uICovCisjZGVmaW5lIExNODBfQ0ZHX0lOVF9FTkEJKDE8PDEpCS8qIGVuYWJsZXMgdGhlIElOVCMgSW50ZXJydXB0IG91dHB1dCAqLworI2RlZmluZSBMTTgwX0NGR19JTlRfUE9MCSgxPDwyKQkvKiBJTlQjIHBvbDogMCBhY3QgbG93LCAxIGFjdCBoaWdoICovCisjZGVmaW5lIExNODBfQ0ZHX0lOVF9DTFIJKDE8PDMpCS8qIGRpc2FibGVzIElOVCMvUlNUX09VVCMvT1MjIG91dHB1dHMgKi8KKyNkZWZpbmUgTE04MF9DRkdfUkVTRVQJCSgxPDw0KQkvKiBzaWduYWxzIGEgcmVzZXQgKi8KKyNkZWZpbmUgTE04MF9DRkdfQ0hBU1NfQ0xSCSgxPDw1KQkvKiBjbGVhcnMgQ2hhc3NpcyBJbnRydXNpb24gKENJKSBwaW4gKi8KKyNkZWZpbmUgTE04MF9DRkdfR1BPCQkoMTw8NikJLyogZHJpdmVzIHRoZSBHUE8jIHBpbiAqLworI2RlZmluZSBMTTgwX0NGR19JTklUCQkoMTw8NykJLyogcmVzdG9yZSBwb3dlciBvbiBkZWZhdWx0cyAqLworCisvKglMTTgwX0lTUkNfMQkJSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAxICovCisvKglMTTgwX0lNU0tfMQkJSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBMTTgwX0lTX1ZUMAkJCSgxPDwwKQkvKiBsaW1pdCBleGNlZWRlZCBmb3IgVm9sdGFnZSAwICovCisjZGVmaW5lIExNODBfSVNfVlQxCQkJKDE8PDEpCS8qIGxpbWl0IGV4Y2VlZGVkIGZvciBWb2x0YWdlIDEgKi8KKyNkZWZpbmUgTE04MF9JU19WVDIJCQkoMTw8MikJLyogbGltaXQgZXhjZWVkZWQgZm9yIFZvbHRhZ2UgMiAqLworI2RlZmluZSBMTTgwX0lTX1ZUMwkJCSgxPDwzKQkvKiBsaW1pdCBleGNlZWRlZCBmb3IgVm9sdGFnZSAzICovCisjZGVmaW5lIExNODBfSVNfVlQ0CQkJKDE8PDQpCS8qIGxpbWl0IGV4Y2VlZGVkIGZvciBWb2x0YWdlIDQgKi8KKyNkZWZpbmUgTE04MF9JU19WVDUJCQkoMTw8NSkJLyogbGltaXQgZXhjZWVkZWQgZm9yIFZvbHRhZ2UgNSAqLworI2RlZmluZSBMTTgwX0lTX1ZUNgkJCSgxPDw2KQkvKiBsaW1pdCBleGNlZWRlZCBmb3IgVm9sdGFnZSA2ICovCisjZGVmaW5lIExNODBfSVNfSU5UX0lOCQkoMTw8NykJLyogc3RhdGUgb2YgSU5UX0lOIyAqLworCisvKglMTTgwX0lTUkNfMgkJSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAyICovCisvKglMTTgwX0lNU0tfMgkJSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgMiAqLworI2RlZmluZSBMTTgwX0lTX1RFTVAJCSgxPDwwKQkvKiBIT1QgdGVtcGVyYXR1cmUgbGltaXQgZXhjZWVkZWQgKi8KKyNkZWZpbmUgTE04MF9JU19CVEkJCQkoMTw8MSkJLyogc3RhdGUgb2YgQlRJIyBwaW4gKi8KKyNkZWZpbmUgTE04MF9JU19GQU4xCQkoMTw8MikJLyogY291bnQgbGltaXQgZXhjZWVkZWQgZm9yIEZhbiAxICovCisjZGVmaW5lIExNODBfSVNfRkFOMgkJKDE8PDMpCS8qIGNvdW50IGxpbWl0IGV4Y2VlZGVkIGZvciBGYW4gMiAqLworI2RlZmluZSBMTTgwX0lTX0NJCQkJKDE8PDQpCS8qIENoYXNzaXMgSW50cnVzaW9uIG9jY3VyZWQgKi8KKyNkZWZpbmUgTE04MF9JU19PUwkJCSgxPDw1KQkvKiBPUyB0ZW1wZXJhdHVyZSBsaW1pdCBleGNlZWRlZCAqLworCS8qIGJpdCA2IGFuZCA3IGFyZSByZXNlcnZlZCBpbiBMTTgwX0lTUkNfMiAqLworI2RlZmluZSBMTTgwX0lTX0hUX0lSUV9NRAkoMTw8NikJLyogSG90IHRlbXBlcmF0dXJlIGludGVycnVwdCBtb2RlICovCisjZGVmaW5lIExNODBfSVNfT1RfSVJRX01ECSgxPDw3KQkvKiBPUyB0ZW1wZXJhdHVyZSBpbnRlcnJ1cHQgbW9kZSAqLworCisvKglMTTgwX0ZBTl9DVFJMCQlGYW4gRGV2aXNvci9SU1QjL09TIyBSZWdpc3RlciAqLworI2RlZmluZSBMTTgwX0ZBTjFfTURfU0VMCSgxPDwwKQkvKiBGYW4gMSBtb2RlIHNlbGVjdCAqLworI2RlZmluZSBMTTgwX0ZBTjJfTURfU0VMCSgxPDwxKQkvKiBGYW4gMiBtb2RlIHNlbGVjdCAqLworI2RlZmluZSBMTTgwX0ZBTjFfUFJNX0NUTAkoMzw8MikJLyogRmFuIDEgc3BlZWQgY29udHJvbCAqLworI2RlZmluZSBMTTgwX0ZBTjJfUFJNX0NUTAkoMzw8NCkJLyogRmFuIDIgc3BlZWQgY29udHJvbCAqLworI2RlZmluZSBMTTgwX0ZBTl9PU19FTkEJCSgxPDw2KQkvKiBlbmFibGUgT1MgbW9kZSBvbiBSU1RfT1VUIy9PUyMgcGlucyovCisjZGVmaW5lIExNODBfRkFOX1JTVF9FTkEJKDE8PDcpCS8qIHNldHMgUlNUX09VVCMvT1MjIHBpbnMgaW4gUlNUIG1vZGUgKi8KKworLyoJTE04MF9URU1QX0NUUkwJCU9TIyBDb25maWcsIFRlbXAgUmVzLiBSZWcgKi8KKyNkZWZpbmUgTE04MF9URU1QX09TX1NUQVQJKDE8PDApCS8qIG1pcnJvcnMgdGhlIHN0YXRlIG9mIFJTVF9PVVQjL09TIyAqLworI2RlZmluZSBMTTgwX1RFTVBfT1NfUE9MCSgxPDwxKQkvKiBzZWxlY3QgT1MjIHBvbGFyaXR5ICovCisjZGVmaW5lIExNODBfVEVNUF9PU19NT0RFCSgxPDwyKQkvKiBzZWxlY3RzIEludGVycnVwdCBtb2RlICovCisjZGVmaW5lIExNODBfVEVNUF9SRVMJCSgxPDwzKQkvKiBzZWxlY3RzIDkgb3IgMTEgYml0IHRlbXAgcmVzdWx1dGlvbiovCisjZGVmaW5lIExNODBfVEVNUF9MU0IJCSgweGY8PDQpLyogNCBMU0JzIG9mIDExIGJpdCB0ZW1wIGRhdGEgKi8KKyNkZWZpbmUgTE04MF9URU1QX0xTQl85CQkoMTw8NykJLyogTFNCIG9mIDkgYml0IHRlbXBlcmF0dXJlIGRhdGEgKi8KKworCS8qIDB4MDcgLSAweDFmIHJlc2VydmVkCSovCisvKglMTTgwX1ZUMF9JTgkJY3VycmVudCBWb2x0YWdlIDAgdmFsdWUgKi8KKy8qCUxNODBfVlQxX0lOCQljdXJyZW50IFZvbHRhZ2UgMSB2YWx1ZSAqLworLyoJTE04MF9WVDJfSU4JCWN1cnJlbnQgVm9sdGFnZSAyIHZhbHVlICovCisvKglMTTgwX1ZUM19JTgkJY3VycmVudCBWb2x0YWdlIDMgdmFsdWUgKi8KKy8qCUxNODBfVlQ0X0lOCQljdXJyZW50IFZvbHRhZ2UgNCB2YWx1ZSAqLworLyoJTE04MF9WVDVfSU4JCWN1cnJlbnQgVm9sdGFnZSA1IHZhbHVlICovCisvKglMTTgwX1ZUNl9JTgkJY3VycmVudCBWb2x0YWdlIDYgdmFsdWUgKi8KKy8qCUxNODBfVEVNUF9JTgkJY3VycmVudCB0ZW1wZXJhdHVyZSB2YWx1ZSAqLworLyoJTE04MF9GQU4xX0lOCQljdXJyZW50IEZhbiAxIGNvdW50ICovCisvKglMTTgwX0ZBTjJfSU4JCWN1cnJlbnQgRmFuIDIgY291bnQgKi8KKy8qCUxNODBfVlQwX0hJR0hfTElNCWhpZ2ggbGltaXQgdmFsIGZvciBWb2x0YWdlIDAgKi8KKy8qCUxNODBfVlQwX0xPV19MSU0JbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSAwICovCisvKglMTTgwX1ZUMV9ISUdIX0xJTQloaWdoIGxpbWl0IHZhbCBmb3IgVm9sdGFnZSAxICovCisvKglMTTgwX1ZUMV9MT1dfTElNCWxvdyBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgMSAqLworLyoJTE04MF9WVDJfSElHSF9MSU0JaGlnaCBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgMiAqLworLyoJTE04MF9WVDJfTE9XX0xJTQlsb3cgbGltaXQgdmFsIGZvciBWb2x0YWdlIDIgKi8KKy8qCUxNODBfVlQzX0hJR0hfTElNCWhpZ2ggbGltaXQgdmFsIGZvciBWb2x0YWdlIDMgKi8KKy8qCUxNODBfVlQzX0xPV19MSU0JbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSAzICovCisvKglMTTgwX1ZUNF9ISUdIX0xJTQloaWdoIGxpbWl0IHZhbCBmb3IgVm9sdGFnZSA0ICovCisvKglMTTgwX1ZUNF9MT1dfTElNCWxvdyBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgNCAqLworLyoJTE04MF9WVDVfSElHSF9MSU0JaGlnaCBsaW1pdCB2YWwgZm9yIFZvbHRhZ2UgNSAqLworLyoJTE04MF9WVDVfTE9XX0xJTQlsb3cgbGltaXQgdmFsIGZvciBWb2x0YWdlIDUgKi8KKy8qCUxNODBfVlQ2X0hJR0hfTElNCWhpZ2ggbGltaXQgdmFsIGZvciBWb2x0YWdlIDYgKi8KKy8qCUxNODBfVlQ2X0xPV19MSU0JbG93IGxpbWl0IHZhbCBmb3IgVm9sdGFnZSA2ICovCisvKglMTTgwX1RIT1RfTElNX1VQCWhvdCB0ZW1wZXJhdHVyZSBsaW1pdCAoaGlnaCkgKi8KKy8qCUxNODBfVEhPVF9MSU1fTE8JaG90IHRlbXBlcmF0dXJlIGxpbWl0IChsb3cpICovCisvKglMTTgwX1RPU19MSU1fVVAJCU9TIHRlbXBlcmF0dXJlIGxpbWl0IChoaWdoKSAqLworLyoJTE04MF9UT1NfTElNX0xPCQlPUyB0ZW1wZXJhdHVyZSBsaW1pdCAobG93KSAqLworLyoJTE04MF9GQU4xX0NPVU5UX0xJTQlGYW4gMSBjb3VudCBsaW1pdCAoaGlnaCkgKi8KKy8qCUxNODBfRkFOMl9DT1VOVF9MSU0JRmFuIDIgY291bnQgbGltaXQgKGxvdykgKi8KKwkvKiAweDNlIC0gMHgzZiByZXNlcnZlZAkqLworCisjZGVmaW5lIExNODBfQUREUgkJMHgyOAkvKiBMTTgwIGRlZmF1bHQgYWRkciAqLworCisvKiB0eXBlZGVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCS8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZgkvKiBfX0lOQ19MTTgwX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2FkZHIuaCBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2FkZHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTJlYTRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrYWRkci5oCkBAIC0wLDAgKzEsMzMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2thZGRyLmgKKyAqIFByb2plY3Q6CUdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcnMsIEFERFItTW9kdWwKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4yOSAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wNS8xMyAxNjo1NzoyNCAkCisgKiBQdXJwb3NlOglIZWFkZXIgZmlsZSBmb3IgQWRkcmVzcyBNYW5hZ2VtZW50IChNQywgVUMsIFByb20pLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBUaGlzIG1vZHVsZSBpcyBpbnRlbmRlZCB0byBtYW5hZ2UgbXVsdGljYXN0IGFkZHJlc3NlcyBhbmQgcHJvbWlzY3VvdXMgbW9kZQorICogb24gR0VuZXNpcyBhZGFwdGVycy4KKyAqCisgKiBJbmNsdWRlIEZpbGUgSGllcmFyY2h5OgorICoKKyAqCSJza2RydjFzdC5oIgorICoJLi4uCisgKgkic2t0eXBlcy5oIgorICoJInNrcXVldWUuaCIKKyAqCSJza2FkZHIuaCIKKyAqCS4uLgorICoJInNrZHJ2Mm5kLmgiCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0lOQ19TS0FERFJfSAorI2RlZmluZSBfX0lOQ19TS0FERFJfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCS8qIGNwbHVzcGx1cyAqLworCisvKiBkZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFNLX01BQ19BRERSX0xFTgkJCQk2CS8qIExlbmd0aCBvZiBNQUMgYWRkcmVzcy4gKi8KKyNkZWZpbmUJU0tfTUFYX0FERFJTCQkJCTE0CS8qICNBZGRycyBmb3IgZXhhY3QgbWF0Y2guICovCisKKy8qIC0tLS0tIENvbW1vbiByZXR1cm4gdmFsdWVzIC0tLS0tICovCisKKyNkZWZpbmUgU0tfQUREUl9TVUNDRVNTCQkJCTAJLyogRnVuY3Rpb24gcmV0dXJuZWQgc3VjY2Vzc2Z1bGx5LiAqLworI2RlZmluZSBTS19BRERSX0lMTEVHQUxfUE9SVAkJCTEwMAkvKiBQb3J0IG51bWJlciB0b28gaGlnaC4gKi8KKyNkZWZpbmUgU0tfQUREUl9UT09fRUFSTFkJCQkxMDEJLyogRnVuY3Rpb24gY2FsbGVkIHRvbyBlYXJseS4gKi8KKworLyogLS0tLS0gQ2xlYXIvQWRkIGZsYWcgYml0cyAtLS0tLSAqLworCisjZGVmaW5lIFNLX0FERFJfUEVSTUFORU5UCQkJMQkvKiBSTE1UIEFkZHJlc3MgKi8KKworLyogLS0tLS0gQWRkaXRpb25hbCBDbGVhciBmbGFnIGJpdHMgLS0tLS0gKi8KKworI2RlZmluZSBTS19NQ19TV19PTkxZCQkJCTIJLyogRG8gbm90IHVwZGF0ZSBIVyB3aGVuIGNsZWFyaW5nLiAqLworCisvKiAtLS0tLSBPdmVycmlkZSBmbGFnIGJpdHMgLS0tLS0gKi8KKworI2RlZmluZSBTS19BRERSX0xPR0lDQUxfQUREUkVTUwkJMAorI2RlZmluZSBTS19BRERSX1ZJUlRVQUxfQUREUkVTUwkJKFNLX0FERFJfTE9HSUNBTF9BRERSRVNTKQkvKiBvbGQgKi8KKyNkZWZpbmUgU0tfQUREUl9QSFlTSUNBTF9BRERSRVNTCTEKKyNkZWZpbmUgU0tfQUREUl9DTEVBUl9MT0dJQ0FMCQkyCisjZGVmaW5lIFNLX0FERFJfU0VUX0xPR0lDQUwJCQk0CisKKy8qIC0tLS0tIE92ZXJyaWRlIHJldHVybiB2YWx1ZXMgLS0tLS0gKi8KKworI2RlZmluZSBTS19BRERSX09WRVJSSURFX1NVQ0NFU1MJKFNLX0FERFJfU1VDQ0VTUykKKyNkZWZpbmUgU0tfQUREUl9EVVBMSUNBVEVfQUREUkVTUwkxCisjZGVmaW5lIFNLX0FERFJfTVVMVElDQVNUX0FERFJFU1MJMgorCisvKiAtLS0tLSBQYXJ0aXRpb25pbmcgb2YgZXhjYWN0IG1hdGNoIHRhYmxlIC0tLS0tICovCisKKyNkZWZpbmUgU0tfQUREUl9FWEFDVF9NQVRDSEVTCQkxNgkvKiAjRXhhY3QgbWF0Y2ggZW50cmllcy4gKi8KKworI2RlZmluZSBTS19BRERSX0ZJUlNUX01BVENIX1JMTVQJMQorI2RlZmluZSBTS19BRERSX0xBU1RfTUFUQ0hfUkxNVAkJMgorI2RlZmluZSBTS19BRERSX0ZJUlNUX01BVENIX0RSVgkJMworI2RlZmluZSBTS19BRERSX0xBU1RfTUFUQ0hfRFJWCQkoU0tfQUREUl9FWEFDVF9NQVRDSEVTIC0gMSkKKworLyogLS0tLS0gU2tBZGRyTWNBZGQvU2tBZGRyTWNVcGRhdGUgcmV0dXJuIHZhbHVlcyAtLS0tLSAqLworCisjZGVmaW5lIFNLX01DX0ZJTFRFUklOR19FWEFDVAkJMAkvKiBFeGFjdCBmaWx0ZXJpbmcuICovCisjZGVmaW5lIFNLX01DX0ZJTFRFUklOR19JTkVYQUNUCQkxCS8qIEluZXhhY3QgZmlsdGVyaW5nLiAqLworCisvKiAtLS0tLSBBZGRpdGlvbmFsIFNrQWRkck1jQWRkIHJldHVybiB2YWx1ZXMgLS0tLS0gKi8KKworI2RlZmluZSBTS19NQ19JTExFR0FMX0FERFJFU1MJCTIJLyogSWxsZWdhbCBhZGRyZXNzLiAqLworI2RlZmluZSBTS19NQ19JTExFR0FMX1BPUlQJCQkzCS8qIElsbGVnYWwgcG9ydCAobm90IHRoZSBhY3RpdmUgb25lKS4gKi8KKyNkZWZpbmUgU0tfTUNfUkxNVF9PVkVSRkxPVwkJCTQJLyogVG9vIG1hbnkgUkxNVCBtYyBhZGRyZXNzZXMuICovCisKKy8qIFByb21pc2N1b3VzIG1vZGUgYml0cyAtLS0tLSAqLworCisjZGVmaW5lIFNLX1BST01fTU9ERV9OT05FCQkJMAkvKiBOb3JtYWwgcmVjZWl2ZS4gKi8KKyNkZWZpbmUgU0tfUFJPTV9NT0RFX0xMQwkJCTEJLyogUmVjZWl2ZSBhbGwgTExDIGZyYW1lcy4gKi8KKyNkZWZpbmUgU0tfUFJPTV9NT0RFX0FMTF9NQwkJCTIJLyogUmVjZWl2ZSBhbGwgbXVsdGljYXN0IGZyYW1lcy4gKi8KKy8qICNkZWZpbmUgU0tfUFJPTV9NT0RFX05PTl9MTEMJCTQgKi8JLyogUmVjZWl2ZSBhbGwgbm9uLUxMQyBmcmFtZXMuICovCisKKy8qIE1hY3JvcyAqLworCisjaWZkZWYgT0xEX1NUVUZGCisjaWZuZGVmIFNLX0FERFJfRVFVQUwKKy8qCisgKiAiJiIgaW5zdGVhZCBvZiAiJiYiIGFsbG93cyBiZXR0ZXIgb3B0aW1pemF0aW9uIG9uIElBLTY0LgorICogVGhlIHJlcGxhY2VtZW50IGlzIHNhZmUgaGVyZSwgYXMgYWxsIGJ5dGVzIGV4aXN0LgorICovCisjaWZuZGVmIFNLX0FERFJfRFdPUkRfQ09NUEFSRQorI2RlZmluZSBTS19BRERSX0VRVUFMKEExLEEyKQkoIFwKKwkoKChTS19VOCAqKShBMSkpWzVdID09ICgoU0tfVTggKikoQTIpKVs1XSkgJiBcCisJKCgoU0tfVTggKikoQTEpKVs0XSA9PSAoKFNLX1U4ICopKEEyKSlbNF0pICYgXAorCSgoKFNLX1U4ICopKEExKSlbM10gPT0gKChTS19VOCAqKShBMikpWzNdKSAmIFwKKwkoKChTS19VOCAqKShBMSkpWzJdID09ICgoU0tfVTggKikoQTIpKVsyXSkgJiBcCisJKCgoU0tfVTggKikoQTEpKVsxXSA9PSAoKFNLX1U4ICopKEEyKSlbMV0pICYgXAorCSgoKFNLX1U4ICopKEExKSlbMF0gPT0gKChTS19VOCAqKShBMikpWzBdKSkKKyNlbHNlCS8qIFNLX0FERFJfRFdPUkRfQ09NUEFSRSAqLworI2RlZmluZSBTS19BRERSX0VRVUFMKEExLEEyKQkoIFwKKwkoKihTS19VMzIgKikmKCgoU0tfVTggKikoQTEpKVsyXSkgPT0gKihTS19VMzIgKikmKCgoU0tfVTggKikoQTIpKVsyXSkpICYgXAorCSgqKFNLX1UzMiAqKSYoKChTS19VOCAqKShBMSkpWzBdKSA9PSAqKFNLX1UzMiAqKSYoKChTS19VOCAqKShBMikpWzBdKSkpCisjZW5kaWYJLyogU0tfQUREUl9EV09SRF9DT01QQVJFICovCisjZW5kaWYJLyogU0tfQUREUl9FUVVBTCAqLworI2VuZGlmIC8qIDAgKi8KKworI2lmbmRlZiBTS19BRERSX0VRVUFMCisjaWZuZGVmIFNLX0FERFJfRFdPUkRfQ09NUEFSRQorI2RlZmluZSBTS19BRERSX0VRVUFMKEExLEEyKQkoIFwKKwkoKChTS19VOCBTS19GQVIgKikoQTEpKVs1XSA9PSAoKFNLX1U4IFNLX0ZBUiAqKShBMikpWzVdKSAmIFwKKwkoKChTS19VOCBTS19GQVIgKikoQTEpKVs0XSA9PSAoKFNLX1U4IFNLX0ZBUiAqKShBMikpWzRdKSAmIFwKKwkoKChTS19VOCBTS19GQVIgKikoQTEpKVszXSA9PSAoKFNLX1U4IFNLX0ZBUiAqKShBMikpWzNdKSAmIFwKKwkoKChTS19VOCBTS19GQVIgKikoQTEpKVsyXSA9PSAoKFNLX1U4IFNLX0ZBUiAqKShBMikpWzJdKSAmIFwKKwkoKChTS19VOCBTS19GQVIgKikoQTEpKVsxXSA9PSAoKFNLX1U4IFNLX0ZBUiAqKShBMikpWzFdKSAmIFwKKwkoKChTS19VOCBTS19GQVIgKikoQTEpKVswXSA9PSAoKFNLX1U4IFNLX0ZBUiAqKShBMikpWzBdKSkKKyNlbHNlCS8qIFNLX0FERFJfRFdPUkRfQ09NUEFSRSAqLworI2RlZmluZSBTS19BRERSX0VRVUFMKEExLEEyKQkoIFwKKwkoKihTS19VMTYgU0tfRkFSICopJigoKFNLX1U4IFNLX0ZBUiAqKShBMSkpWzRdKSA9PSBcCisJKihTS19VMTYgU0tfRkFSICopJigoKFNLX1U4IFNLX0ZBUiAqKShBMikpWzRdKSkgJiYgXAorCSgqKFNLX1UzMiBTS19GQVIgKikmKCgoU0tfVTggU0tfRkFSICopKEExKSlbMF0pID09IFwKKwkqKFNLX1UzMiBTS19GQVIgKikmKCgoU0tfVTggU0tfRkFSICopKEEyKSlbMF0pKSkKKyNlbmRpZgkvKiBTS19BRERSX0RXT1JEX0NPTVBBUkUgKi8KKyNlbmRpZgkvKiBTS19BRERSX0VRVUFMICovCisKKy8qIHR5cGVkZWZzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHNfTWFjQWRkciB7CisJU0tfVTgJYVtTS19NQUNfQUREUl9MRU5dOworfSBTS19NQUNfQUREUjsKKworCisvKiBTS19GSUxURVIgaXMgdXNlZCB0byBlbnN1cmUgYWxpZ25tZW50IG9mIHRoZSBmaWx0ZXIuICovCit0eXBlZGVmIHVuaW9uIHNfSW5leGFjdEZpbHRlciB7CisJU0tfVTgJQnl0ZXNbOF07CisJU0tfVTY0CVZhbDsJLyogRHVtbXkgZW50cnkgZm9yIGFsaWdubWVudCBvbmx5LiAqLworfSBTS19GSUxURVI2NDsKKworCit0eXBlZGVmIHN0cnVjdCBzX0FkZHJOZXQgU0tfQUREUl9ORVQ7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19BZGRyUG9ydCB7CisKKy8qIC0tLS0tIFB1YmxpYyBwYXJ0IChyZWFkLW9ubHkpIC0tLS0tICovCisKKwlTS19NQUNfQUREUglDdXJyZW50TWFjQWRkcmVzczsJLyogQ3VycmVudCBwaHlzaWNhbCBNQUMgQWRkcmVzcy4gKi8KKwlTS19NQUNfQUREUglQZXJtYW5lbnRNYWNBZGRyZXNzOwkvKiBQZXJtYW5lbnQgcGh5c2ljYWwgTUFDIEFkZHJlc3MuICovCisJaW50CQlQcm9tTW9kZTsJCS8qIFByb21pc2N1b3VzIE1vZGUuICovCisKKy8qIC0tLS0tIFByaXZhdGUgcGFydCAtLS0tLSAqLworCisJU0tfTUFDX0FERFIJUHJldmlvdXNNYWNBZGRyZXNzOwkvKiBQcmV2LiBwaHlzLiBNQUMgQWRkcmVzcy4gKi8KKwlTS19CT09MCQlDdXJyZW50TWFjQWRkcmVzc1NldDsJLyogQ3VycmVudE1hY0FkZHJlc3MgaXMgc2V0LiAqLworCVNLX1U4CQlBbGlnbjAxOworCisJU0tfVTMyCQlGaXJzdEV4YWN0TWF0Y2hSbG10OworCVNLX1UzMgkJTmV4dEV4YWN0TWF0Y2hSbG10OworCVNLX1UzMgkJRmlyc3RFeGFjdE1hdGNoRHJ2OworCVNLX1UzMgkJTmV4dEV4YWN0TWF0Y2hEcnY7CisJU0tfTUFDX0FERFIJRXhhY3RbU0tfQUREUl9FWEFDVF9NQVRDSEVTXTsKKwlTS19GSUxURVI2NAlJbmV4YWN0RmlsdGVyOwkJCS8qIEZvciA2NC1iaXQgaGFzaCByZWdpc3Rlci4gKi8KKwlTS19GSUxURVI2NAlJbmV4YWN0UmxtdEZpbHRlcjsJCS8qIEZvciA2NC1iaXQgaGFzaCByZWdpc3Rlci4gKi8KKwlTS19GSUxURVI2NAlJbmV4YWN0RHJ2RmlsdGVyOwkJLyogRm9yIDY0LWJpdCBoYXNoIHJlZ2lzdGVyLiAqLworfSBTS19BRERSX1BPUlQ7CisKKworc3RydWN0IHNfQWRkck5ldCB7CisvKiAtLS0tLSBQdWJsaWMgcGFydCAocmVhZC1vbmx5KSAtLS0tLSAqLworCisJU0tfTUFDX0FERFIJCUN1cnJlbnRNYWNBZGRyZXNzOwkvKiBMb2dpY2FsIE1BQyBBZGRyZXNzLiAqLworCVNLX01BQ19BRERSCQlQZXJtYW5lbnRNYWNBZGRyZXNzOwkvKiBMb2dpY2FsIE1BQyBBZGRyZXNzLiAqLworCisvKiAtLS0tLSBQcml2YXRlIHBhcnQgLS0tLS0gKi8KKworCVNLX1UzMgkJCUFjdGl2ZVBvcnQ7CQkvKiBWaWV3IG9mIG1vZHVsZSBBRERSLiAqLworCVNLX0JPT0wJCQlDdXJyZW50TWFjQWRkcmVzc1NldDsJLyogQ3VycmVudE1hY0FkZHJlc3MgaXMgc2V0LiAqLworCVNLX1U4CQkJQWxpZ24wMTsKKwlTS19VMTYJCQlBbGlnbjAyOworfTsKKworCit0eXBlZGVmIHN0cnVjdCBzX0FkZHIgeworCisvKiAtLS0tLSBQdWJsaWMgcGFydCAocmVhZC1vbmx5KSAtLS0tLSAqLworCisJU0tfQUREUl9ORVQJCU5ldFtTS19NQVhfTkVUU107CisJU0tfQUREUl9QT1JUCVBvcnRbU0tfTUFYX01BQ1NdOworCisvKiAtLS0tLSBQcml2YXRlIHBhcnQgLS0tLS0gKi8KK30gU0tfQUREUjsKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBTS19LUl9QUk9UTworCisvKiBGdW5jdGlvbnMgcHJvdmlkZWQgYnkgU2tBZGRyICovCisKKy8qIEFOU0kvQysrIGNvbXBsaWFudCBmdW5jdGlvbiBwcm90b3R5cGVzICovCisKK2V4dGVybglpbnQJU2tBZGRySW5pdCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CUxldmVsKTsKKworZXh0ZXJuCWludAlTa0FkZHJNY0NsZWFyKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlTS19VMzIJUG9ydE51bWJlciwKKwlpbnQJRmxhZ3MpOworCitleHRlcm4JaW50CVNrQWRkclhtYWNNY0NsZWFyKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlTS19VMzIJUG9ydE51bWJlciwKKwlpbnQJRmxhZ3MpOworCitleHRlcm4JaW50CVNrQWRkckdtYWNNY0NsZWFyKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlTS19VMzIJUG9ydE51bWJlciwKKwlpbnQJRmxhZ3MpOworCitleHRlcm4JaW50CVNrQWRkck1jQWRkKAorCVNLX0FDCQkqcEFDLAorCVNLX0lPQwkJSW9DLAorCVNLX1UzMgkJUG9ydE51bWJlciwKKwlTS19NQUNfQUREUgkqcE1jLAorCWludAkJRmxhZ3MpOworCitleHRlcm4JaW50CVNrQWRkclhtYWNNY0FkZCgKKwlTS19BQwkJKnBBQywKKwlTS19JT0MJCUlvQywKKwlTS19VMzIJCVBvcnROdW1iZXIsCisJU0tfTUFDX0FERFIJKnBNYywKKwlpbnQJCUZsYWdzKTsKKworZXh0ZXJuCWludAlTa0FkZHJHbWFjTWNBZGQoCisJU0tfQUMJCSpwQUMsCisJU0tfSU9DCQlJb0MsCisJU0tfVTMyCQlQb3J0TnVtYmVyLAorCVNLX01BQ19BRERSCSpwTWMsCisJaW50CQlGbGFncyk7CisKK2V4dGVybglpbnQJU2tBZGRyTWNVcGRhdGUoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCVNLX1UzMglQb3J0TnVtYmVyKTsKKworZXh0ZXJuCWludAlTa0FkZHJYbWFjTWNVcGRhdGUoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCVNLX1UzMglQb3J0TnVtYmVyKTsKKworZXh0ZXJuCWludAlTa0FkZHJHbWFjTWNVcGRhdGUoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCVNLX1UzMglQb3J0TnVtYmVyKTsKKworZXh0ZXJuCWludAlTa0FkZHJPdmVycmlkZSgKKwlTS19BQwkJKnBBQywKKwlTS19JT0MJCUlvQywKKwlTS19VMzIJCVBvcnROdW1iZXIsCisJU0tfTUFDX0FERFIJU0tfRkFSICpwTmV3QWRkciwKKwlpbnQJCUZsYWdzKTsKKworZXh0ZXJuCWludAlTa0FkZHJQcm9taXNjdW91c0NoYW5nZSgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJU0tfVTMyCVBvcnROdW1iZXIsCisJaW50CU5ld1Byb21Nb2RlKTsKKworZXh0ZXJuCWludAlTa0FkZHJYbWFjUHJvbWlzY3VvdXNDaGFuZ2UoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCVNLX1UzMglQb3J0TnVtYmVyLAorCWludAlOZXdQcm9tTW9kZSk7CisKK2V4dGVybglpbnQJU2tBZGRyR21hY1Byb21pc2N1b3VzQ2hhbmdlKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlTS19VMzIJUG9ydE51bWJlciwKKwlpbnQJTmV3UHJvbU1vZGUpOwkKKworI2lmbmRlZiBTS19TTElNCitleHRlcm4JaW50CVNrQWRkclN3YXAoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCVNLX1UzMglGcm9tUG9ydE51bWJlciwKKwlTS19VMzIJVG9Qb3J0TnVtYmVyKTsKKyNlbmRpZgorCisjZWxzZQkvKiBkZWZpbmVkKFNLX0tSX1BST1RPKSkgKi8KKworLyogTm9uLUFOU0kvQysrIGNvbXBsaWFudCBmdW5jdGlvbiBwcm90b3R5cGVzICovCisKKyNlcnJvciBLUi1zdHlsZSBwcm90b3R5cGVzIGFyZSBub3QgeWV0IHByb3ZpZGVkLgorCisjZW5kaWYJLyogZGVmaW5lZChTS19LUl9QUk9UTykpICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYJLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCS8qIF9fSU5DX1NLQUREUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tjc3VtLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tjc3VtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI5NGFkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2NzdW0uaApAQCAtMCwwICsxLDIxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrY3N1bS5oCisgKiBQcm9qZWN0OglHRW5lc2lzIC0gU3lzS29ubmVjdCBTSy1ORVQgR2lnYWJpdCBFdGhlcm5ldCAoU0stOTh4eCkKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4xMCAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wOC8yMCAxMzo1OTo1NyAkCisgKiBQdXJwb3NlOglTdG9yZS92ZXJpZnkgSW50ZXJuZXQgY2hlY2tzdW0gaW4gc2VuZC9yZWNlaXZlIHBhY2tldHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDEgU3lzS29ubmVjdCBHbWJILgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFB1YmxpYyBoZWFkZXIgZmlsZSBmb3IgdGhlICJHRW5lc2lzIiBjb21tb24gbW9kdWxlICJDU1VNIi4KKyAqCisgKiAiR0VuZXNpcyIgaXMgYW4gYWJicmV2aWF0aW9uIG9mICJHaWdhYml0IEV0aGVybmV0IE5ldHdvcmsgU3lzdGVtIGluIFNpbGljb24iCisgKiBhbmQgaXMgdGhlIGNvZGUgbmFtZSBvZiB0aGlzIFN5c0tvbm5lY3QgcHJvamVjdC4KKyAqCisgKiBDb21waWxhdGlvbiBPcHRpb25zOgorICoKKyAqCVNLX1VTRV9DU1VNIC0gRGVmaW5lIGlmIENTVU0gaXMgdG8gYmUgdXNlZC4gT3RoZXJ3aXNlLCBDU1VNIHdpbGwgYmUgYW4KKyAqCWVtcHR5IG1vZHVsZS4KKyAqCisgKglTS0NTX09WRVJXUklURV9QUk9UTyAtIERlZmluZSB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHQgcHJvdG9jb2wgaWQKKyAqCWRlZmluaXRpb25zLiBJbiB0aGlzIGNhc2UsIGFsbCBTS0NTX1BST1RPX3h4eCBkZWZpbml0aW9ucyBtdXN0IGJlIG1hZGUKKyAqCWV4dGVybmFsLgorICoKKyAqCVNLQ1NfT1ZFUldSSVRFX1NUQVRVUyAtIERlZmluZSB0byBvdmVyd3JpdGUgdGhlIGRlZmF1bHQgcmV0dXJuIHN0YXR1cworICoJZGVmaW5pdGlvbnMuIEluIHRoaXMgY2FzZSwgYWxsIFNLQ1NfU1RBVFVTX3h4eCBkZWZpbml0aW9ucyBtdXN0IGJlIG1hZGUKKyAqCWV4dGVybmFsLgorICoKKyAqIEluY2x1ZGUgRmlsZSBIaWVyYXJjaHk6CisgKgorICoJImgvc2tjc3VtLmgiCisgKgkgImgvc2t0eXBlcy5oIgorICoJICJoL3NrcXVldWUuaCIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fSU5DX1NLQ1NVTV9ICisjZGVmaW5lIF9fSU5DX1NLQ1NVTV9ICisKKyNpbmNsdWRlICJoL3NrdHlwZXMuaCIKKyNpbmNsdWRlICJoL3NrcXVldWUuaCIKKworLyogZGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIERlZmluZSB0aGUgZGVmYXVsdCBiaXQgZmxhZ3MgZm9yICdTS0NTX1BBQ0tFVF9JTkZPLlByb3RvY29sRmxhZ3MnICBpZiBubyB1c2VyCisgKiBvdmVyd3JpdGUuCisgKi8KKyNpZm5kZWYgU0tDU19PVkVSV1JJVEVfUFJPVE8JLyogVXNlciBvdmVyd3JpdGU/ICovCisjZGVmaW5lIFNLQ1NfUFJPVE9fSVAJMHgxCS8qIElQIChJbnRlcm5ldCBQcm90b2NvbCB2ZXJzaW9uIDQpICovCisjZGVmaW5lIFNLQ1NfUFJPVE9fVENQCTB4MgkvKiBUQ1AgKFRyYW5zbWlzc2lvbiBDb250cm9sIFByb3RvY29sKSAqLworI2RlZmluZSBTS0NTX1BST1RPX1VEUAkweDQJLyogVURQIChVc2VyIERhdGFncmFtIFByb3RvY29sKSAqLworCisvKiBJbmRpY2VzIGZvciBwcm90b2NvbCBzdGF0aXN0aWNzLiAqLworI2RlZmluZSBTS0NTX1BST1RPX1NUQVRTX0lQCTAKKyNkZWZpbmUgU0tDU19QUk9UT19TVEFUU19VRFAJMQorI2RlZmluZSBTS0NTX1BST1RPX1NUQVRTX1RDUAkyCisjZGVmaW5lIFNLQ1NfTlVNX1BST1RPQ09MUwkzCS8qIE51bWJlciBvZiBzdXBwb3J0ZWQgcHJvdG9jb2xzLiAqLworI2VuZGlmCS8qICFTS0NTX09WRVJXUklURV9QUk9UTyAqLworCisvKgorICogRGVmaW5lIHRoZSBkZWZhdWx0IFNLQ1NfU1RBVFVTIHR5cGUgYW5kIHZhbHVlcyBpZiBubyB1c2VyIG92ZXJ3cml0ZS4KKyAqCisgKglTS0NTX1NUQVRVU19VTktOT1dOX0lQX1ZFUlNJT04gLSBOb3QgYW4gSVAgdjQgZnJhbWUuCisgKglTS0NTX1NUQVRVU19JUF9DU1VNX0VSUk9SIC0gSVAgY2hlY2tzdW0gZXJyb3IuCisgKglTS0NTX1NUQVRVU19JUF9DU1VNX0VSUk9SX1RDUCAtIElQIGNoZWNrc3VtIGVycm9yIGluIFRDUCBmcmFtZS4KKyAqCVNLQ1NfU1RBVFVTX0lQX0NTVU1fRVJST1JfVURQIC0gSVAgY2hlY2tzdW0gZXJyb3IgaW4gVURQIGZyYW1lCisgKglTS0NTX1NUQVRVU19JUF9GUkFHTUVOVCAtIElQIGZyYWdtZW50IChJUCBjaGVja3N1bSBvaykuCisgKglTS0NTX1NUQVRVU19JUF9DU1VNX09LIC0gSVAgY2hlY2tzdW0gb2sgKG5vdCBhIFRDUCBvciBVRFAgZnJhbWUpLgorICoJU0tDU19TVEFUVVNfVENQX0NTVU1fRVJST1IgLSBUQ1AgY2hlY2tzdW0gZXJyb3IgKElQIGNoZWNrc3VtIG9rKS4KKyAqCVNLQ1NfU1RBVFVTX1VEUF9DU1VNX0VSUk9SIC0gVURQIGNoZWNrc3VtIGVycm9yIChJUCBjaGVja3N1bSBvaykuCisgKglTS0NTX1NUQVRVU19UQ1BfQ1NVTV9PSyAtIElQIGFuZCBUQ1AgY2hlY2tzdW0gb2suCisgKglTS0NTX1NUQVRVU19VRFBfQ1NVTV9PSyAtIElQIGFuZCBVRFAgY2hlY2tzdW0gb2suCisgKglTS0NTX1NUQVRVU19JUF9DU1VNX09LX05PX1VEUCAtIElQIGNoZWNrc3VtIE9LIGFuZCBubyBVRFAgY2hlY2tzdW0uIAorICovCisjaWZuZGVmIFNLQ1NfT1ZFUldSSVRFX1NUQVRVUwkvKiBVc2VyIG92ZXJ3cml0ZT8gKi8KKyNkZWZpbmUgU0tDU19TVEFUVVMJaW50CS8qIERlZmluZSBzdGF0dXMgdHlwZS4gKi8KKworI2RlZmluZSBTS0NTX1NUQVRVU19VTktOT1dOX0lQX1ZFUlNJT04JMQorI2RlZmluZSBTS0NTX1NUQVRVU19JUF9DU1VNX0VSUk9SCQkyCisjZGVmaW5lIFNLQ1NfU1RBVFVTX0lQX0ZSQUdNRU5UCQkJMworI2RlZmluZSBTS0NTX1NUQVRVU19JUF9DU1VNX09LCQkJNAorI2RlZmluZSBTS0NTX1NUQVRVU19UQ1BfQ1NVTV9FUlJPUgkJNQorI2RlZmluZSBTS0NTX1NUQVRVU19VRFBfQ1NVTV9FUlJPUgkJNgorI2RlZmluZSBTS0NTX1NUQVRVU19UQ1BfQ1NVTV9PSwkJCTcKKyNkZWZpbmUgU0tDU19TVEFUVVNfVURQX0NTVU1fT0sJCQk4CisvKiBuZWVkZWQgZm9yIE1pY3Jvc29mdCAqLworI2RlZmluZSBTS0NTX1NUQVRVU19JUF9DU1VNX0VSUk9SX1VEUAk5CisjZGVmaW5lIFNLQ1NfU1RBVFVTX0lQX0NTVU1fRVJST1JfVENQCTEwCisvKiBVRFAgY2hlY2tzdW0gbWF5IGJlIG9taXR0ZWQgKi8KKyNkZWZpbmUgU0tDU19TVEFUVVNfSVBfQ1NVTV9PS19OT19VRFAJMTEKKyNlbmRpZgkvKiAhU0tDU19PVkVSV1JJVEVfU1RBVFVTICovCisKKy8qIENsZWFyIHByb3RvY29sIHN0YXRpc3RpY3MgZXZlbnQuICovCisjZGVmaW5lIFNLX0NTVU1fRVZFTlRfQ0xFQVJfUFJPVE9fU1RBVFMJMQorCisvKgorICogQWRkIHR3byB2YWx1ZXMgaW4gb25lJ3MgY29tcGxlbWVudC4KKyAqCisgKiBOb3RlOiBPbmUgb2YgdGhlIHR3byBpbnB1dCB2YWx1ZXMgbWF5IGJlICJsb25nZXIiIHRoYW4gMTYtYml0LCBidXQgdGhlbiB0aGUKKyAqIHJlc3VsdGluZyBzdW0gbWF5IGJlIDE3IGJpdHMgbG9uZy4gSW4gdGhpcyBjYXNlLCBhZGQgemVybyB0byB0aGUgcmVzdWx0IHVzaW5nCisgKiBTS0NTX09DX0FERCgpIGFnYWluLgorICoKKyAqCVJlc3VsdCA9IFZhbHVlMSArIFZhbHVlMgorICovCisjZGVmaW5lIFNLQ1NfT0NfQUREKFJlc3VsdCwgVmFsdWUxLCBWYWx1ZTIpIHsJCQkJXAorCXVuc2lnbmVkIGxvbmcgU3VtOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwlTdW0gPSAodW5zaWduZWQgbG9uZykgKFZhbHVlMSkgKyAodW5zaWduZWQgbG9uZykgKFZhbHVlMik7CVwKKwkvKiBBZGQtaW4gYW55IGNhcnJ5LiAqLwkJCQkJCVwKKwkoUmVzdWx0KSA9IChTdW0gJiAweGZmZmYpICsgKFN1bSA+PiAxNik7CQkJXAorfQorCisvKgorICogU3VidHJhY3QgdHdvIHZhbHVlcyBpbiBvbmUncyBjb21wbGVtZW50LgorICoKKyAqCVJlc3VsdCA9IFZhbHVlMSAtIFZhbHVlMgorICovCisjZGVmaW5lIFNLQ1NfT0NfU1VCKFJlc3VsdCwgVmFsdWUxLCBWYWx1ZTIpCVwKKwlTS0NTX09DX0FERCgoUmVzdWx0KSwgKFZhbHVlMSksIH4oVmFsdWUyKSAmIDB4ZmZmZikKKworLyogdHlwZWRlZnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFNLQ1NfUFJPVE9fU1RBVFMgLSBUaGUgQ1NVTSBwcm90b2NvbCBzdGF0aXN0aWNzIHN0cnVjdHVyZS4KKyAqCisgKiBUaGVyZSBpcyBvbmUgaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3R1cmUgZm9yIGVhY2ggcHJvdG9jb2wgc3VwcG9ydGVkLgorICovCit0eXBlZGVmIHN0cnVjdCBzX0NzUHJvdG9jb2xTdGF0aXN0aWNzIHsKKwlTS19VNjQgUnhPa0N0czsJCS8qIFJlY2VpdmUgY2hlY2tzdW0gb2suICovCisJU0tfVTY0IFJ4VW5hYmxlQ3RzOwkvKiBVbmFibGUgdG8gdmVyaWZ5IHJlY2VpdmUgY2hlY2tzdW0uICovCisJU0tfVTY0IFJ4RXJyQ3RzOwkvKiBSZWNlaXZlIGNoZWNrc3VtIGVycm9yLiAqLworCVNLX1U2NCBUeE9rQ3RzOwkJLyogVHJhbnNtaXQgY2hlY2tzdW0gb2suICovCisJU0tfVTY0IFR4VW5hYmxlQ3RzOwkvKiBVbmFibGUgdG8gY2FsY3VsYXRlIGNoZWNrc3VtIGluIGh3LiAqLworfSBTS0NTX1BST1RPX1NUQVRTOworCisvKgorICogc19Dc3VtIC0gVGhlIENTVU0gbW9kdWxlIGNvbnRleHQgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBzX0NzdW0geworCS8qIEVuYWJsZWQgcmVjZWl2ZSBTS19QUk9UT19YWFggYml0IGZsYWdzLiAqLworCXVuc2lnbmVkIFJlY2VpdmVGbGFnc1tTS19NQVhfTkVUU107CisjaWZkZWYgVFhfQ1NVTQorCXVuc2lnbmVkIFRyYW5zbWl0RmxhZ3NbU0tfTUFYX05FVFNdOworI2VuZGlmIC8qIFRYX0NTVU0gKi8KKworCS8qIFRoZSBwcm90b2NvbCBzdGF0aXN0aWNzIHN0cnVjdHVyZTsgb25lIHBlciBzdXBwb3J0ZWQgcHJvdG9jb2wuICovCisJU0tDU19QUk9UT19TVEFUUyBQcm90b1N0YXRzW1NLX01BWF9ORVRTXVtTS0NTX05VTV9QUk9UT0NPTFNdOworfSBTS19DU1VNOworCisvKgorICogU0tDU19QQUNLRVRfSU5GTyAtIFRoZSBwYWNrZXQgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBzX0NzUGFja2V0SW5mbyB7CisJLyogQml0IGZpZWxkIHNwZWNpZml5aW5nIHRoZSBkZXNpcmVkL2ZvdW5kIHByb3RvY29scy4gKi8KKwl1bnNpZ25lZCBQcm90b2NvbEZsYWdzOworCisJLyogTGVuZ3RoIG9mIGNvbXBsZXRlIElQIGhlYWRlciwgaW5jbHVkaW5nIGFueSBvcHRpb24gZmllbGRzLiAqLworCXVuc2lnbmVkIElwSGVhZGVyTGVuZ3RoOworCisJLyogSVAgaGVhZGVyIGNoZWNrc3VtLiAqLworCXVuc2lnbmVkIElwSGVhZGVyQ2hlY2tzdW07CisKKwkvKiBUQ1AvVURQIHBzZXVkbyBoZWFkZXIgY2hlY2tzdW0uICovCisJdW5zaWduZWQgUHNldWRvSGVhZGVyQ2hlY2tzdW07Cit9IFNLQ1NfUEFDS0VUX0lORk87CisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgU0tfQ1NfQ0FMQ1VMQVRFX0NIRUNLU1VNCitleHRlcm4gdW5zaWduZWQgU2tDc0NhbGN1bGF0ZUNoZWNrc3VtKAorCXZvaWQJCSpwRGF0YSwKKwl1bnNpZ25lZAlMZW5ndGgpOworI2VuZGlmIC8qIFNLX0NTX0NBTENVTEFURV9DSEVDS1NVTSAqLworCitleHRlcm4gaW50IFNrQ3NFdmVudCgKKwlTS19BQwkJKnBBYywKKwlTS19JT0MJCUlvYywKKwlTS19VMzIJCUV2ZW50LAorCVNLX0VWUEFSQQlQYXJhbSk7CisKK2V4dGVybiBTS0NTX1NUQVRVUyBTa0NzR2V0UmVjZWl2ZUluZm8oCisJU0tfQUMJCSpwQWMsCisJdm9pZAkJKnBJcEhlYWRlciwKKwl1bnNpZ25lZAlDaGVja3N1bTEsCisJdW5zaWduZWQJQ2hlY2tzdW0yLAorCWludAkJCU5ldE51bWJlcik7CisKK2V4dGVybiB2b2lkIFNrQ3NHZXRTZW5kSW5mbygKKwlTS19BQwkJCQkqcEFjLAorCXZvaWQJCQkJKnBJcEhlYWRlciwKKwlTS0NTX1BBQ0tFVF9JTkZPCSpwUGFja2V0SW5mbywKKwlpbnQJCQkJCU5ldE51bWJlcik7CisKK2V4dGVybiB2b2lkIFNrQ3NTZXRSZWNlaXZlRmxhZ3MoCisJU0tfQUMJCSpwQWMsCisJdW5zaWduZWQJUmVjZWl2ZUZsYWdzLAorCXVuc2lnbmVkCSpwQ2hlY2tzdW0xT2Zmc2V0LAorCXVuc2lnbmVkCSpwQ2hlY2tzdW0yT2Zmc2V0LAorCWludAkJCU5ldE51bWJlcik7CisKKyNlbmRpZgkvKiBfX0lOQ19TS0NTVU1fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZGVidWcuaCBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NiYTE3MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2RlYnVnLmgKQEAgLTAsMCArMSw3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrZGVidWcuaAorICogUHJvamVjdDoJR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVycywgQ29tbW9uIE1vZHVsZXMKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4xNCAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wNS8xMyAxNzoyNjowMCAkCisgKiBQdXJwb3NlOglTSyBzcGVjaWZpYyBERUJVRyBzdXBwb3J0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19JTkNfU0tERUJVR19ICisjZGVmaW5lIF9fSU5DX1NLREVCVUdfSAorCisjaWZkZWYJREVCVUcKKyNpZm5kZWYgU0tfREJHX01TRworI2RlZmluZSBTS19EQkdfTVNHKHBBQyxjb21wLGNhdCxhcmcpIFwKKwkJaWYgKCAoKGNvbXApICYgU0tfREJHX0NIS01PRChwQUMpKSAmJiAJXAorCQkgICAgICAoKGNhdCkgJiBTS19EQkdfQ0hLQ0FUKHBBQykpICkgeyAJXAorCQkJU0tfREJHX1BSSU5URiBhcmcgOwkJXAorCQl9CisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIFNLX0RCR19NU0cocEFDLGNvbXAsbGV2LGFyZykKKyNlbmRpZgorCisvKiBQTFMgTk9URToKKyAqID09PT09PT09PQorICogRHVlIHRvIGFueSByZXN0cmljdGlvbnMgb2Yga2VybmVsIHByaW50ZiByb3V0aW5lcyBkbyBub3QgdXNlIG90aGVyCisgKiBmb3JtYXQgaWRlbnRpZmllcnMgYXM6ICV4ICVkICVjICVzIC4KKyAqIE5ldmVyIHVzZSBhbnkgY29tYmluZWQgZm9ybWF0IGlkZW50aWZpZXJzIHN1Y2ggYXM6ICVseCAlbGQgaW4geW91cgorICogcHJpbnRmIC0gYXJndW1lbnQgKGFyZykgYmVjYXVzZSBzb21lIE9TIHNwZWNpZmljIGtlcm5lbCBwcmludGZzIG1heQorICogb25seSBzdXBwb3J0IHNvbWUgYmFzaWMgaWRlbnRpZmllcnMuCisgKi8KKworLyogRGVidWcgbW9kdWxlcyAqLworCisjZGVmaW5lIFNLX0RCR01PRF9NRVJSCTB4MDAwMDAwMDFMCS8qIGdlbmVyYWwgbW9kdWxlIGVycm9yIGluZGljYXRpb24gKi8KKyNkZWZpbmUgU0tfREJHTU9EX0hXTQkweDAwMDAwMDAyTAkvKiBIYXJkd2FyZSBpbml0IG1vZHVsZSAqLworI2RlZmluZSBTS19EQkdNT0RfUkxNVAkweDAwMDAwMDA0TAkvKiBSTE1UIG1vZHVsZSAqLworI2RlZmluZSBTS19EQkdNT0RfVlBECTB4MDAwMDAwMDhMCS8qIFZQRCBtb2R1bGUgKi8KKyNkZWZpbmUgU0tfREJHTU9EX0kyQwkweDAwMDAwMDEwTAkvKiBJMkMgbW9kdWxlICovCisjZGVmaW5lIFNLX0RCR01PRF9QTk1JCTB4MDAwMDAwMjBMCS8qIFBOTUkgbW9kdWxlICovCisjZGVmaW5lIFNLX0RCR01PRF9DU1VNCTB4MDAwMDAwNDBMCS8qIENTVU0gbW9kdWxlICovCisjZGVmaW5lIFNLX0RCR01PRF9BRERSCTB4MDAwMDAwODBMCS8qIEFERFIgbW9kdWxlICovCisjZGVmaW5lIFNLX0RCR01PRF9QRUNQCTB4MDAwMDAxMDBMCS8qIFBFQ1AgbW9kdWxlICovCisjZGVmaW5lIFNLX0RCR01PRF9QT1dNCTB4MDAwMDAyMDBMCS8qIFBvd2VyIE1hbmFnZW1lbnQgbW9kdWxlICovCisKKy8qIERlYnVnIGV2ZW50cyAqLworCisjZGVmaW5lIFNLX0RCR0NBVF9JTklUCTB4MDAwMDAwMDFMCS8qIG1vZHVsZS9kcml2ZXIgaW5pdGlhbGl6YXRpb24gKi8KKyNkZWZpbmUgU0tfREJHQ0FUX0NUUkwJMHgwMDAwMDAwMkwJLyogY29udHJvbGxpbmcgZGV2aWNlcyAqLworI2RlZmluZSBTS19EQkdDQVRfRVJSCTB4MDAwMDAwMDRMCS8qIGVycm9yIGhhbmRsaW5nIHBhdGhzICovCisjZGVmaW5lIFNLX0RCR0NBVF9UWAkweDAwMDAwMDA4TAkvKiB0cmFuc21pdCBwYXRoICovCisjZGVmaW5lIFNLX0RCR0NBVF9SWAkweDAwMDAwMDEwTAkvKiByZWNlaXZlIHBhdGggKi8KKyNkZWZpbmUgU0tfREJHQ0FUX0lSUQkweDAwMDAwMDIwTAkvKiBnZW5lcmFsIElSUSBoYW5kbGluZyAqLworI2RlZmluZSBTS19EQkdDQVRfUVVFVUUJMHgwMDAwMDA0MEwJLyogYW55IHF1ZXVlIG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgU0tfREJHQ0FUX0RVTVAJMHgwMDAwMDA4MEwJLyogbGFyZ2UgZGF0YSBvdXRwdXQgZS5nLiBoZXggZHVtcCAqLworI2RlZmluZSBTS19EQkdDQVRfRkFUQUwJMHgwMDAwMDEwMEwJLyogZmF0YWwgZXJyb3IgKi8KKworI2VuZGlmCS8qIF9fSU5DX1NLREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZHJ2MXN0LmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tkcnYxc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDg0NDBiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZHJ2MXN0LmgKQEAgLTAsMCArMSwxOTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2RydjFzdC5oCisgKiBQcm9qZWN0OglHRW5lc2lzLCBQQ0kgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuNCAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8xMS8xMiAxNDoyODoxNCAkCisgKiBQdXJwb3NlOglGaXJzdCBoZWFkZXIgZmlsZSBmb3IgZHJpdmVyIGFuZCBhbGwgb3RoZXIgbW9kdWxlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBUaGlzIGlzIHRoZSBmaXJzdCBpbmNsdWRlIGZpbGUgb2YgdGhlIGRyaXZlciwgd2hpY2ggaW5jbHVkZXMgYWxsCisgKiBuZWNjZXNzYXJ5IHN5c3RlbSBoZWFkZXIgZmlsZXMgYW5kIHNvbWUgb2YgdGhlIEdFbmVzaXMgaGVhZGVyIGZpbGVzLgorICogSXQgYWxzbyBkZWZpbmVzIHNvbWUgYmFzaWMgaXRlbXMuCisgKgorICogSW5jbHVkZSBGaWxlIEhpZXJhcmNoeToKKyAqCisgKglzZWUgc2tnZS5jCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0lOQ19TS0RSVjFTVF9ICisjZGVmaW5lIF9fSU5DX1NLRFJWMVNUX0gKKworLyogQ2hlY2sga2VybmVsIHZlcnNpb24gKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKK3R5cGVkZWYgc3RydWN0IHNfQUMJU0tfQUM7CisKKy8qIFNldCBjYXJkIHZlcnNpb25zICovCisjZGVmaW5lIFNLX0ZBUgorCisvKiBvdmVycmlkZSBzb21lIGRlZmF1bHQgZnVuY3Rpb25zIHdpdGggb3B0aW1pemVkIGxpbnV4IGZ1bmN0aW9ucyAqLworCisjZGVmaW5lIFNLX1BOTUlfU1RPUkVfVTE2KHAsdikJCW1lbWNweSgoY2hhciopKHApLChjaGFyKikmKHYpLDIpCisjZGVmaW5lIFNLX1BOTUlfU1RPUkVfVTMyKHAsdikJCW1lbWNweSgoY2hhciopKHApLChjaGFyKikmKHYpLDQpCisjZGVmaW5lIFNLX1BOTUlfU1RPUkVfVTY0KHAsdikJCW1lbWNweSgoY2hhciopKHApLChjaGFyKikmKHYpLDgpCisjZGVmaW5lIFNLX1BOTUlfUkVBRF9VMTYocCx2KQkJbWVtY3B5KChjaGFyKikmKHYpLChjaGFyKikocCksMikKKyNkZWZpbmUgU0tfUE5NSV9SRUFEX1UzMihwLHYpCQltZW1jcHkoKGNoYXIqKSYodiksKGNoYXIqKShwKSw0KQorI2RlZmluZSBTS19QTk1JX1JFQURfVTY0KHAsdikJCW1lbWNweSgoY2hhciopJih2KSwoY2hhciopKHApLDgpCisKKyNkZWZpbmUgU0tfQUREUl9FUVVBTChhMSxhMikJCSghbWVtY21wKGExLGEyLDYpKQorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKworI2RlZmluZSBTS19DU19DQUxDVUxBVEVfQ0hFQ0tTVU0KKyNpZm5kZWYgQ09ORklHX1g4Nl82NAorI2RlZmluZSBTa0NzQ2FsY3VsYXRlQ2hlY2tzdW0ocCxsKQkoKH5pcF9jb21wdXRlX2NzdW0ocCwgbCkpICYgMHhmZmZmKQorI2Vsc2UKKyNkZWZpbmUgU2tDc0NhbGN1bGF0ZUNoZWNrc3VtKHAsbCkJKCh+aXBfZmFzdF9jc3VtKHAsIGwpKSAmIDB4ZmZmZikKKyNlbmRpZgorCisjaW5jbHVkZQkiaC9za3R5cGVzLmgiCisjaW5jbHVkZQkiaC9za2Vycm9yLmgiCisjaW5jbHVkZQkiaC9za2RlYnVnLmgiCisjaW5jbHVkZQkiaC9sbTgwLmgiCisjaW5jbHVkZQkiaC94bWFjX2lpLmgiCisKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgU0tfTElUVExFX0VORElBTgorI2Vsc2UKKyNkZWZpbmUgU0tfQklHX0VORElBTgorI2VuZGlmCisKKyNkZWZpbmUgU0tfTkVUX0RFVklDRQluZXRfZGV2aWNlCisKKworLyogd2UgdXNlIGdldGhydGltZSgpLCByZXR1cm4gdW5pdDogbmFub3NlY29uZHMgKi8KKyNkZWZpbmUgU0tfVElDS1NfUEVSX1NFQwkxMDAKKworI2RlZmluZQlTS19NRU1fTUFQUEVEX0lPCisKKy8vICNkZWZpbmUgU0tfUkxNVF9TTE9XX0xPT0tBSEVBRAorCisjZGVmaW5lIFNLX01BWF9NQUNTCQkyCisjZGVmaW5lIFNLX01BWF9ORVRTCQkyCisKKyNkZWZpbmUgU0tfSU9DCQkJY2hhciBfX2lvbWVtICoKKwordHlwZWRlZiBzdHJ1Y3Qgc19EcnZSbG10TWJ1ZiBTS19NQlVGOworCisjZGVmaW5lCVNLX0NPTlNUNjQJSU5UNjRfQworI2RlZmluZQlTS19DT05TVFU2NAlVSU5UNjRfQworCisjZGVmaW5lIFNLX01FTUNQWShkZXN0LHNyYyxzaXplKQltZW1jcHkoZGVzdCxzcmMsc2l6ZSkKKyNkZWZpbmUgU0tfTUVNQ01QKHMxLHMyLHNpemUpCQltZW1jbXAoczEsczIsc2l6ZSkKKyNkZWZpbmUgU0tfTUVNU0VUKGRlc3QsdmFsLHNpemUpCW1lbXNldChkZXN0LHZhbCxzaXplKQorI2RlZmluZSBTS19TVFJMRU4ocFN0cikJCQlzdHJsZW4oKGNoYXIqKShwU3RyKSkKKyNkZWZpbmUgU0tfU1RSTkNQWShwRGVzdCxwU3JjLHNpemUpCXN0cm5jcHkoKGNoYXIqKShwRGVzdCksKGNoYXIqKShwU3JjKSxzaXplKQorI2RlZmluZSBTS19TVFJDTVAocFN0cjEscFN0cjIpCQlzdHJjbXAoKGNoYXIqKShwU3RyMSksKGNoYXIqKShwU3RyMikpCisKKy8qIG1hY3JvcyB0byBhY2Nlc3MgdGhlIGFkYXB0ZXIgKi8KKyNkZWZpbmUgU0tfT1VUOChiLGEsdikJCXdyaXRlYigodiksICgoYikrKGEpKSkJCisjZGVmaW5lIFNLX09VVDE2KGIsYSx2KQkJd3JpdGV3KCh2KSwgKChiKSsoYSkpKQkKKyNkZWZpbmUgU0tfT1VUMzIoYixhLHYpCQl3cml0ZWwoKHYpLCAoKGIpKyhhKSkpCQorI2RlZmluZSBTS19JTjgoYixhLHB2KQkJKCoocHYpID0gcmVhZGIoKGIpKyhhKSkpCisjZGVmaW5lIFNLX0lOMTYoYixhLHB2KQkJKCoocHYpID0gcmVhZHcoKGIpKyhhKSkpCisjZGVmaW5lIFNLX0lOMzIoYixhLHB2KQkJKCoocHYpID0gcmVhZGwoKGIpKyhhKSkpCisKKyNkZWZpbmUgaW50OF90CQljaGFyCisjZGVmaW5lIGludDE2X3QJCXNob3J0CisjZGVmaW5lIGludDMyX3QJCWxvbmcKKyNkZWZpbmUgaW50NjRfdAkJbG9uZyBsb25nCisjZGVmaW5lIHVpbnQ4X3QJCXVfY2hhcgorI2RlZmluZSB1aW50MTZfdAl1X3Nob3J0CisjZGVmaW5lIHVpbnQzMl90CXVfbG9uZworI2RlZmluZSB1aW50NjRfdAl1bnNpZ25lZCBsb25nIGxvbmcKKyNkZWZpbmUgdF9zY2FsYXJfdAlpbnQKKyNkZWZpbmUgdF91c2NhbGFyX3QJdW5zaWduZWQgaW50CisjZGVmaW5lIHVpbnRwdHJfdAl1bnNpZ25lZCBsb25nCisKKyNkZWZpbmUgX19DT05DQVRfXyhBLEIpIEEjI0IKKworI2RlZmluZSBJTlQzMl9DKGEpCQlfX0NPTkNBVF9fKGEsTCkKKyNkZWZpbmUgSU5UNjRfQyhhKQkJX19DT05DQVRfXyhhLExMKQorI2RlZmluZSBVSU5UMzJfQyhhKQkJX19DT05DQVRfXyhhLFVMKQorI2RlZmluZSBVSU5UNjRfQyhhKQkJX19DT05DQVRfXyhhLFVMTCkKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIFNLX0RCR19QUklOVEYJCXByaW50aworI2lmbmRlZiBTS19ERUJVR19DSEtNT0QKKyNkZWZpbmUgU0tfREVCVUdfQ0hLTU9ECQkwCisjZW5kaWYKKyNpZm5kZWYgU0tfREVCVUdfQ0hLQ0FUCisjZGVmaW5lIFNLX0RFQlVHX0NIS0NBVAkJMAorI2VuZGlmCisvKiB0aG9zZSBjb21lIGZyb20gdGhlIG1ha2VmaWxlICovCisjZGVmaW5lIFNLX0RCR19DSEtNT0QocEFDKQkoU0tfREVCVUdfQ0hLTU9EKQorI2RlZmluZSBTS19EQkdfQ0hLQ0FUKHBBQykJKFNLX0RFQlVHX0NIS0NBVCkKKworZXh0ZXJuIHZvaWQgU2tEYmdQcmludGYoY29uc3QgY2hhciAqZm9ybWF0LC4uLik7CisKKyNkZWZpbmUgU0tfREJHTU9EX0RSVgkJCTB4MDAwMTAwMDAKKworLyoqKiogcG9zc2libGUgZHJpdmVyIGRlYnVnIGNhdGVnb3JpZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFNLX0RCR0NBVF9EUlZfRU5UUlkJCTB4MDAwMTAwMDAKKyNkZWZpbmUgU0tfREJHQ0FUX0RSVl9TQVAJCTB4MDAwMjAwMDAKKyNkZWZpbmUgU0tfREJHQ0FUX0RSVl9NQ0EJCTB4MDAwNDAwMDAKKyNkZWZpbmUgU0tfREJHQ0FUX0RSVl9UWF9QUk9HUkVTUwkweDAwMDgwMDAwCisjZGVmaW5lIFNLX0RCR0NBVF9EUlZfUlhfUFJPR1JFU1MJMHgwMDEwMDAwMAorI2RlZmluZSBTS19EQkdDQVRfRFJWX1BST0dSRVNTCQkweDAwMjAwMDAwCisjZGVmaW5lIFNLX0RCR0NBVF9EUlZfTVNHCQkweDAwNDAwMDAwCisjZGVmaW5lIFNLX0RCR0NBVF9EUlZfUFJPTQkJMHgwMDgwMDAwMAorI2RlZmluZSBTS19EQkdDQVRfRFJWX1RYX0ZSQU1FCQkweDAxMDAwMDAwCisjZGVmaW5lIFNLX0RCR0NBVF9EUlZfRVJST1IJCTB4MDIwMDAwMDAKKyNkZWZpbmUgU0tfREJHQ0FUX0RSVl9JTlRfU1JDCQkweDA0MDAwMDAwCisjZGVmaW5lIFNLX0RCR0NBVF9EUlZfRVZFTlQJCTB4MDgwMDAwMDAKKworI2VuZGlmCisKKyNkZWZpbmUgU0tfRVJSX0xPRwkJU2tFcnJvckxvZworCitleHRlcm4gdm9pZCBTa0Vycm9yTG9nKFNLX0FDKiwgaW50LCBpbnQsIGNoYXIqKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2RydjJuZC5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZHJ2Mm5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQyY2VjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2RydjJuZC5oCkBAIC0wLDAgKzEsNDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tkcnYybmQuaAorICogUHJvamVjdDoJR0VuZXNpcywgUENJIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjEwICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzEyLzExIDE2OjA0OjQ1ICQKKyAqIFB1cnBvc2U6CVNlY29uZCBoZWFkZXIgZmlsZSBmb3IgZHJpdmVyIGFuZCBhbGwgb3RoZXIgbW9kdWxlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBUaGlzIGlzIHRoZSBzZWNvbmQgaW5jbHVkZSBmaWxlIG9mIHRoZSBkcml2ZXIsIHdoaWNoIGluY2x1ZGVzIGFsbCBvdGhlcgorICogbmVjY2Vzc2FyeSBmaWxlcyBhbmQgZGVmaW5lcyBhbGwgc3RydWN0dXJlcyBhbmQgY29uc3RhbnRzIHVzZWQgYnkgdGhlCisgKiBkcml2ZXIgYW5kIHRoZSBjb21tb24gbW9kdWxlcy4KKyAqCisgKiBJbmNsdWRlIEZpbGUgSGllcmFyY2h5OgorICoKKyAqCXNlZSBza2dlLmMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fSU5DX1NLRFJWMk5EX0gKKyNkZWZpbmUgX19JTkNfU0tEUlYyTkRfSAorCisjaW5jbHVkZSAiaC9za3F1ZXVlLmgiCisjaW5jbHVkZSAiaC9za2dlaHd0LmgiCisjaW5jbHVkZSAiaC9za3RpbWVyLmgiCisjaW5jbHVkZSAiaC9za2kyYy5oIgorI2luY2x1ZGUgImgvc2tnZXBubWkuaCIKKyNpbmNsdWRlICJoL3NrdnBkLmgiCisjaW5jbHVkZSAiaC9za2dlaHcuaCIKKyNpbmNsdWRlICJoL3NrZ2Vpbml0LmgiCisjaW5jbHVkZSAiaC9za2FkZHIuaCIKKyNpbmNsdWRlICJoL3NrZ2VzaXJxLmgiCisjaW5jbHVkZSAiaC9za2NzdW0uaCIKKyNpbmNsdWRlICJoL3NrcmxtdC5oIgorI2luY2x1ZGUgImgvc2tnZWRydi5oIgorCisKK2V4dGVybiBTS19NQlVGCQkqU2tEcnZBbGxvY1JsbXRNYnVmKFNLX0FDKiwgU0tfSU9DLCB1bnNpZ25lZCk7CitleHRlcm4gdm9pZAkJU2tEcnZGcmVlUmxtdE1idWYoU0tfQUMqLCBTS19JT0MsIFNLX01CVUYqKTsKK2V4dGVybiBTS19VNjQJCVNrT3NHZXRUaW1lKFNLX0FDKik7CitleHRlcm4gaW50CQlTa1BjaVJlYWRDZmdEV29yZChTS19BQyosIGludCwgU0tfVTMyKik7CitleHRlcm4gaW50CQlTa1BjaVJlYWRDZmdXb3JkKFNLX0FDKiwgaW50LCBTS19VMTYqKTsKK2V4dGVybiBpbnQJCVNrUGNpUmVhZENmZ0J5dGUoU0tfQUMqLCBpbnQsIFNLX1U4Kik7CitleHRlcm4gaW50CQlTa1BjaVdyaXRlQ2ZnRFdvcmQoU0tfQUMqLCBpbnQsIFNLX1UzMik7CitleHRlcm4gaW50CQlTa1BjaVdyaXRlQ2ZnV29yZChTS19BQyosIGludCwgU0tfVTE2KTsKK2V4dGVybiBpbnQJCVNrUGNpV3JpdGVDZmdCeXRlKFNLX0FDKiwgaW50LCBTS19VOCk7CitleHRlcm4gaW50CQlTa0RydkV2ZW50KFNLX0FDKiwgU0tfSU9DIElvQywgU0tfVTMyLCBTS19FVlBBUkEpOworCisjaWZkZWYgU0tfRElBR19TVVBQT1JUCitleHRlcm4gaW50CQlTa0RydkVudGVyRGlhZ01vZGUoU0tfQUMgKnBBYyk7CitleHRlcm4gaW50CQlTa0RydkxlYXZlRGlhZ01vZGUoU0tfQUMgKnBBYyk7CisjZW5kaWYKKworc3RydWN0IHNfRHJ2UmxtdE1idWYgeworCVNLX01CVUYJCSpwTmV4dDsJCS8qIFBvaW50ZXIgdG8gbmV4dCBSTE1UIE1idWYuICovCisJU0tfVTgJCSpwRGF0YTsJCS8qIERhdGEgYnVmZmVyICh2aXJ0dWFsbHkgY29udGlnLikuICovCisJdW5zaWduZWQJU2l6ZTsJCS8qIERhdGEgYnVmZmVyIHNpemUuICovCisJdW5zaWduZWQJTGVuZ3RoOwkJLyogTGVuZ3RoIG9mIHBhY2tldCAoPD0gU2l6ZSkuICovCisJU0tfVTMyCQlQb3J0SWR4OwkvKiBSZWNlaXZpbmcvdHJhbnNtaXR0aW5nIHBvcnQuICovCisjaWZkZWYgU0tfUkxNVF9NQlVGX1BSSVZBVEUKKwlTS19STE1UX01CVUYJUmxtdDsJCS8qIFByaXZhdGUgcGFydCBmb3IgUkxNVC4gKi8KKyNlbmRpZiAgLyogU0tfUkxNVF9NQlVGX1BSSVZBVEUgKi8KKwlzdHJ1Y3Qgc2tfYnVmZgkqcE9zOwkJLyogUG9pbnRlciB0byBtZXNzYWdlIGJsb2NrICovCit9OworCisKKy8qCisgKiBUaW1lIG1hY3JvcworICovCisjaWYgU0tfVElDS1NfUEVSX1NFQyA9PSAxMDAKKyNkZWZpbmUgU0tfUE5NSV9IVU5EUkVEU19TRUModCkJKHQpCisjZWxzZQorI2RlZmluZSBTS19QTk1JX0hVTkRSRURTX1NFQyh0KQkoKCgodW5zaWduZWQgbG9uZyl0KSAqIDEwMCkgLyBcCisJCQkJCQkJCQkJKFNLX1RJQ0tTX1BFUl9TRUMpKQorI2VuZGlmCisKKy8qCisgKiBOZXcgU2tPc0dldFRpbWUKKyAqLworI2RlZmluZSBTa09zR2V0VGltZUN1cnJlbnQocEFDLCBwVXNlYykge1wKKwlzdHJ1Y3QgdGltZXZhbCB0O1wKKwlkb19nZXR0aW1lb2ZkYXkoJnQpO1wKKwkqcFVzZWMgPSAoKCgodC50dl9zZWMpICogMTAwMDAwMEwpK3QudHZfdXNlYykvMTAwMDApO1wKK30KKworCisvKgorICogaW9jdGwgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZQkJU0tfSU9DVExfQkFTRQkJKFNJT0NERVZQUklWQVRFKQorI2RlZmluZQkJU0tfSU9DVExfR0VUTUlCCQkoU0tfSU9DVExfQkFTRSArIDApCisjZGVmaW5lCQlTS19JT0NUTF9TRVRNSUIJCShTS19JT0NUTF9CQVNFICsgMSkKKyNkZWZpbmUJCVNLX0lPQ1RMX1BSRVNFVE1JQgkoU0tfSU9DVExfQkFTRSArIDIpCisjZGVmaW5lCQlTS19JT0NUTF9HRU4JCShTS19JT0NUTF9CQVNFICsgMykKKyNkZWZpbmUJCVNLX0lPQ1RMX0RJQUcJCShTS19JT0NUTF9CQVNFICsgNCkKKwordHlwZWRlZiBzdHJ1Y3Qgc19JT0NUTAlTS19HRV9JT0NUTDsKKworc3RydWN0IHNfSU9DVEwgeworCWNoYXIgX191c2VyICoJcERhdGE7CisJdW5zaWduZWQgaW50CUxlbjsKK307CisKKworLyoKKyAqIGRlZmluZSBzaXplcyBvZiBkZXNjcmlwdG9yIHJpbmdzIGluIGJ5dGVzCisgKi8KKworI2RlZmluZQkJVFhfUklOR19TSVpFCSg4KjEwMjQpCisjZGVmaW5lCQlSWF9SSU5HX1NJWkUJKDI0KjEwMjQpCisKKy8qCisgKiBCdWZmZXIgc2l6ZSBmb3IgZXRoZXJuZXQgcGFja2V0cworICovCisjZGVmaW5lCUVUSF9CVUZfU0laRQkxNTQwCisjZGVmaW5lCUVUSF9NQVhfTVRVCTE1MTQKKyNkZWZpbmUgRVRIX01JTl9NVFUJNjAKKyNkZWZpbmUgRVRIX01VTFRJQ0FTVF9CSVQJMHgwMQorI2RlZmluZSBTS19KVU1CT19NVFUJOTAwMAorCisvKgorICogdHJhbnNtaXQgcHJpb3JpdHkgc2VsZWN0cyB0aGUgcXVldWU6IExPVz1hc3luY2hyb24sIEhJR0g9c3luY2hyb24KKyAqLworI2RlZmluZSBUWF9QUklPX0xPVwkwCisjZGVmaW5lIFRYX1BSSU9fSElHSAkxCisKKy8qCisgKiBhbGlnbm1lbnQgb2YgcngvdHggZGVzY3JpcHRvcnMKKyAqLworI2RlZmluZSBERVNDUl9BTElHTgk2NAorCisvKgorICogZGVmaW5pdGlvbnMgZm9yIHBubWkuIFRPRE8KKyAqLworI2RlZmluZSBTS19EUklWRVJfUkVTRVQocEFDLCBJb0MpCTAKKyNkZWZpbmUgU0tfRFJJVkVSX1NFTkRFVkVOVChwQUMsIElvQykJMAorI2RlZmluZSBTS19EUklWRVJfU0VMRlRFU1QocEFDLCBJb0MpCTAKKy8qIEZvciBnZXQgbXR1IHlvdSBtdXN0IGFkZCBhbiBvd24gZnVuY3Rpb24gKi8KKyNkZWZpbmUgU0tfRFJJVkVSX0dFVF9NVFUocEFjLElvQyxpKQkwCisjZGVmaW5lIFNLX0RSSVZFUl9TRVRfTVRVKHBBYyxJb0MsaSx2KQkwCisjZGVmaW5lIFNLX0RSSVZFUl9QUkVTRVRfTVRVKHBBYyxJb0MsaSx2KQkwCisKKy8qCisqKiBJbnRlcmltIGRlZmluaXRpb24gb2YgU0tfRFJWX1RJTUVSIHBsYWNlZCBpbiB0aGlzIGZpbGUgdW50aWwgCisqKiBjb21tb24gbW9kdWxlcyBoYXZlIGJvb24gZmluYWxsaXplZAorKi8KKyNkZWZpbmUgU0tfRFJWX1RJTUVSCQkJMTEgCisjZGVmaW5lCVNLX0RSVl9NT0RFUkFUSU9OX1RJTUVSCQkxCisjZGVmaW5lIFNLX0RSVl9NT0RFUkFUSU9OX1RJTUVSX0xFTkdUSCAgMTAwMDAwMCAgLyogMSBzZWNvbmQgKi8KKyNkZWZpbmUgU0tfRFJWX1JYX0NMRUFOVVBfVElNRVIJCTIKKyNkZWZpbmUgU0tfRFJWX1JYX0NMRUFOVVBfVElNRVJfTEVOR1RICTEwMDAwMDAJIC8qIDEwMCBtaWxsaXNlY3MgKi8KKworLyoKKyoqIERlZmluaXRpb25zIHJlZ2FyZGluZyB0cmFuc21pdHRpbmcgZnJhbWVzIAorKiogYW55IGNhbGN1bGF0aW5nIGFueSBjaGVja3N1bS4KKyovCisjZGVmaW5lIENfTEVOX0VUSEVSTUFDX0hFQURFUl9ERVNUX0FERFIgNgorI2RlZmluZSBDX0xFTl9FVEhFUk1BQ19IRUFERVJfU1JDX0FERFIgIDYKKyNkZWZpbmUgQ19MRU5fRVRIRVJNQUNfSEVBREVSX0xFTlRZUEUgICAyCisjZGVmaW5lIENfTEVOX0VUSEVSTUFDX0hFQURFUiAgICAgICAgICAgKCAoQ19MRU5fRVRIRVJNQUNfSEVBREVSX0RFU1RfQUREUikgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ19MRU5fRVRIRVJNQUNfSEVBREVSX1NSQ19BRERSKSAgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ19MRU5fRVRIRVJNQUNfSEVBREVSX0xFTlRZUEUpICkKKworI2RlZmluZSBDX0xFTl9FVEhFUk1UVV9NSU5TSVpFICAgICAgICAgIDQ2CisjZGVmaW5lIENfTEVOX0VUSEVSTVRVX01BWFNJWkVfU1REICAgICAgMTUwMAorI2RlZmluZSBDX0xFTl9FVEhFUk1UVV9NQVhTSVpFX0pVTUJPICAgIDkwMDAKKworI2RlZmluZSBDX0xFTl9FVEhFUk5FVF9NSU5TSVpFICAgICAgICAgICggKENfTEVOX0VUSEVSTUFDX0hFQURFUikgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ19MRU5fRVRIRVJNVFVfTUlOU0laRSkgKQorCisjZGVmaW5lIENfT0ZGU0VUX0lQSEVBREVSICAgICAgICAgICAgICAgQ19MRU5fRVRIRVJNQUNfSEVBREVSCisjZGVmaW5lIENfT0ZGU0VUX0lQSEVBREVSX0lQUFJPVE8gICAgICAgOQorI2RlZmluZSBDX09GRlNFVF9UQ1BIRUFERVJfVENQQ1MgICAgICAgIDE2CisjZGVmaW5lIENfT0ZGU0VUX1VEUEhFQURFUl9VRFBDUyAgICAgICAgNgorCisjZGVmaW5lIENfT0ZGU0VUX0lQUFJPVE8gICAgICAgICAgICAgICAgKCAoQ19MRU5fRVRIRVJNQUNfSEVBREVSKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDX09GRlNFVF9JUEhFQURFUl9JUFBST1RPKSApCisKKyNkZWZpbmUgQ19QUk9UT19JRF9VRFAgICAgICAgICAgICAgICAgICAxNyAgICAgICAvKiByZWZlciB0byBSRkMgNzkwIG9yIFN0ZXZlbnMnICAgKi8KKyNkZWZpbmUgQ19QUk9UT19JRF9UQ1AgICAgICAgICAgICAgICAgICA2ICAgICAgICAvKiBUQ1AvSVAgaWxsdXN0cmF0ZWQgZm9yIGRldGFpbHMgKi8KKworLyogVFggYW5kIFJYIGRlc2NyaXB0b3JzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBzX1J4RCBSWEQ7IC8qIHRoZSByZWNlaXZlIGRlc2NyaXB0b3IgKi8KKworc3RydWN0IHNfUnhEIHsKKwl2b2xhdGlsZSBTS19VMzIJUkJDb250cm9sOwkvKiBSZWNlaXZlIEJ1ZmZlciBDb250cm9sICovCisJU0tfVTMyCQlWTmV4dFJ4ZDsJLyogTmV4dCByZWNlaXZlIGRlc2NyaXB0b3IsbG93IGR3b3JkICovCisJU0tfVTMyCQlWRGF0YUxvdzsJLyogUmVjZWl2ZSBidWZmZXIgQWRkciwgbG93IGR3b3JkICovCisJU0tfVTMyCQlWRGF0YUhpZ2g7CS8qIFJlY2VpdmUgYnVmZmVyIEFkZHIsIGhpZ2ggZHdvcmQgKi8KKwlTS19VMzIJCUZyYW1lU3RhdDsJLyogUmVjZWl2ZSBGcmFtZSBTdGF0dXMgd29yZCAqLworCVNLX1UzMgkJVGltZVN0YW1wOwkvKiBUaW1lIHN0YW1wIGZyb20gWE1BQyAqLworCVNLX1UzMgkJVGNwU3VtczsJLyogVENQIFN1bSAyIC8gVENQIFN1bSAxICovCisJU0tfVTMyCQlUY3BTdW1TdGFydHM7CS8qIFRDUCBTdW0gU3RhcnQgMiAvIFRDUCBTdW0gU3RhcnQgMSAqLworCVJYRAkJKnBOZXh0UnhkOwkvKiBQb2ludGVyIHRvIG5leHQgUnhkICovCisJc3RydWN0IHNrX2J1ZmYJKnBNQnVmOwkJLyogUG9pbnRlciB0byBMaW51eCcgc29ja2V0IGJ1ZmZlciAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3Qgc19UeEQgVFhEOyAvKiB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvciAqLworCitzdHJ1Y3Qgc19UeEQgeworCXZvbGF0aWxlIFNLX1UzMglUQkNvbnRyb2w7CS8qIFRyYW5zbWl0IEJ1ZmZlciBDb250cm9sICovCisJU0tfVTMyCQlWTmV4dFR4ZDsJLyogTmV4dCB0cmFuc21pdCBkZXNjcmlwdG9yLGxvdyBkd29yZCAqLworCVNLX1UzMgkJVkRhdGFMb3c7CS8qIFRyYW5zbWl0IEJ1ZmZlciBBZGRyLCBsb3cgZHdvcmQgKi8KKwlTS19VMzIJCVZEYXRhSGlnaDsJLyogVHJhbnNtaXQgQnVmZmVyIEFkZHIsIGhpZ2ggZHdvcmQgKi8KKwlTS19VMzIJCUZyYW1lU3RhdDsJLyogVHJhbnNtaXQgRnJhbWUgU3RhdHVzIFdvcmQgKi8KKwlTS19VMzIJCVRjcFN1bU9mczsJLyogUmVzZXJ2ZWQgLyBUQ1AgU3VtIE9mZnNldCAqLworCVNLX1UxNgkJVGNwU3VtU3Q7CS8qIFRDUCBTdW0gU3RhcnQgKi8KKwlTS19VMTYJCVRjcFN1bVdyOwkvKiBUQ1AgU3VtIFdyaXRlICovCisJU0tfVTMyCQlUY3BSZXNlcnZlZDsJLyogbm90IHVzZWQgKi8KKwlUWEQJCSpwTmV4dFR4ZDsJLyogUG9pbnRlciB0byBuZXh0IFR4ZCAqLworCXN0cnVjdCBza19idWZmCSpwTUJ1ZjsJCS8qIFBvaW50ZXIgdG8gTGludXgnIHNvY2tldCBidWZmZXIgKi8KK307CisKKy8qIFVzZWQgaW50ZXJydXB0IGJpdHMgaW4gdGhlIGludGVycnVwdHMgc291cmNlIHJlZ2lzdGVyICoqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBEUklWRVJfSVJRUwkoKElTX0lSUV9TVykgICB8IFwKKwkJCShJU19SMV9GKSAgICAgIHwoSVNfUjJfRikgIHwgXAorCQkJKElTX1hTMV9GKSAgICAgfChJU19YQTFfRikgfCBcCisJCQkoSVNfWFMyX0YpICAgICB8KElTX1hBMl9GKSkKKworI2RlZmluZSBTUEVDSUFMX0lSUVMJKChJU19IV19FUlIpICAgfChJU19JMkNfUkVBRFkpICB8IFwKKwkJCShJU19FWFRfUkVHKSAgIHwoSVNfVElNSU5UKSAgICAgfCBcCisJCQkoSVNfUEFfVE9fUlgxKSB8KElTX1BBX1RPX1JYMikgIHwgXAorCQkJKElTX1BBX1RPX1RYMSkgfChJU19QQV9UT19UWDIpICB8IFwKKwkJCShJU19NQUMxKSAgICAgIHwoSVNfTE5LX1NZTkNfTTEpfCBcCisJCQkoSVNfTUFDMikgICAgICB8KElTX0xOS19TWU5DX00yKXwgXAorCQkJKElTX1IxX0MpICAgICAgfChJU19SMl9DKSAgICAgICB8IFwKKwkJCShJU19YUzFfQykgICAgIHwoSVNfWEExX0MpICAgICAgfCBcCisJCQkoSVNfWFMyX0MpICAgICB8KElTX1hBMl9DKSkKKworI2RlZmluZSBJUlFfTUFTSwkoKElTX0lSUV9TVykgICB8IFwKKwkJCShJU19SMV9CKSAgICAgIHwoSVNfUjFfRikgICAgIHwoSVNfUjJfQikgfChJU19SMl9GKSB8IFwKKwkJCShJU19YUzFfQikgICAgIHwoSVNfWFMxX0YpICAgIHwoSVNfWEExX0IpfChJU19YQTFfRil8IFwKKwkJCShJU19YUzJfQikgICAgIHwoSVNfWFMyX0YpICAgIHwoSVNfWEEyX0IpfChJU19YQTJfRil8IFwKKwkJCShJU19IV19FUlIpICAgIHwoSVNfSTJDX1JFQURZKXwgXAorCQkJKElTX0VYVF9SRUcpICAgfChJU19USU1JTlQpICAgfCBcCisJCQkoSVNfUEFfVE9fUlgxKSB8KElTX1BBX1RPX1JYMil8IFwKKwkJCShJU19QQV9UT19UWDEpIHwoSVNfUEFfVE9fVFgyKXwgXAorCQkJKElTX01BQzEpICAgICAgfChJU19NQUMyKSAgICAgfCBcCisJCQkoSVNfUjFfQykgICAgICB8KElTX1IyX0MpICAgICB8IFwKKwkJCShJU19YUzFfQykgICAgIHwoSVNfWEExX0MpICAgIHwgXAorCQkJKElTX1hTMl9DKSAgICAgfChJU19YQTJfQykpCisKKyNkZWZpbmUgSVJRX0hXRV9NQVNLCShJU19FUlJfTVNLKSAvKiBlbmFibGUgYWxsIEhXIGlycXMgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc19EZXZOZXQgREVWX05FVDsKKworc3RydWN0IHNfRGV2TmV0IHsKKwlpbnQgICAgICAgICAgICAgUG9ydE5yOworCWludCAgICAgICAgICAgICBOZXROcjsKKwlpbnQgICAgICAgICAgICAgTXR1OworCWludCAgICAgICAgICAgICBVcDsKKwlTS19BQyAgICpwQUM7Cit9OyAgCisKK3R5cGVkZWYgc3RydWN0IHNfVHhQb3J0CQlUWF9QT1JUOworCitzdHJ1Y3Qgc19UeFBvcnQgeworCS8qIHRoZSB0cmFuc21pdCBkZXNjcmlwdG9yIHJpbmdzICovCisJY2FkZHJfdAkJcFR4RGVzY3JSaW5nOwkvKiBkZXNjcmlwdG9yIGFyZWEgbWVtb3J5ICovCisJU0tfVTY0CQlWVHhEZXNjclJpbmc7CS8qIGRlc2NyLiBhcmVhIGJ1cyB2aXJ0LiBhZGRyLiAqLworCVRYRAkJKnBUeGRSaW5nSGVhZDsJLyogSGVhZCBvZiBUeCByaW5ncyAqLworCVRYRAkJKnBUeGRSaW5nVGFpbDsJLyogVGFpbCBvZiBUeCByaW5ncyAqLworCVRYRAkJKnBUeGRSaW5nUHJldjsJLyogZGVzY3JpcHRvciBzZW50IHByZXZpb3VzbHkgKi8KKwlpbnQJCVR4ZFJpbmdGcmVlOwkvKiAjIG9mIGZyZWUgZW50cnlzICovCisJc3BpbmxvY2tfdAlUeERlc1JpbmdMb2NrOwkvKiBzZXJpYWxpemUgZGVzY3JpcHRvciBhY2Nlc3NlcyAqLworCVNLX0lPQwkJSHdBZGRyOwkJLyogYm11IHJlZ2lzdGVycyBhZGRyZXNzICovCisJaW50CQlQb3J0SW5kZXg7CS8qIGluZGV4IG51bWJlciBvZiBwb3J0ICgwIG9yIDEpICovCit9OworCit0eXBlZGVmIHN0cnVjdCBzX1J4UG9ydAkJUlhfUE9SVDsKKworc3RydWN0IHNfUnhQb3J0IHsKKwkvKiB0aGUgcmVjZWl2ZSBkZXNjcmlwdG9yIHJpbmdzICovCisJY2FkZHJfdAkJcFJ4RGVzY3JSaW5nOwkvKiBkZXNjcmlwdG9yIGFyZWEgbWVtb3J5ICovCisJU0tfVTY0CQlWUnhEZXNjclJpbmc7ICAgLyogZGVzY3IuIGFyZWEgYnVzIHZpcnQuIGFkZHIuICovCisJUlhECQkqcFJ4ZFJpbmdIZWFkOwkvKiBIZWFkIG9mIFJ4IHJpbmdzICovCisJUlhECQkqcFJ4ZFJpbmdUYWlsOwkvKiBUYWlsIG9mIFJ4IHJpbmdzICovCisJUlhECQkqcFJ4ZFJpbmdQcmV2OwkvKiBkZXNjcmlwdG9yIGdpdmVuIHRvIEJNVSBwcmV2aW91c2x5ICovCisJaW50CQlSeGRSaW5nRnJlZTsJLyogIyBvZiBmcmVlIGVudHJ5cyAqLworCXNwaW5sb2NrX3QJUnhEZXNSaW5nTG9jazsJLyogc2VyaWFsaXplIGRlc2NyaXB0b3IgYWNjZXNzZXMgKi8KKwlpbnQJCVJ4RmlsbExpbWl0OwkvKiBsaW1pdCBmb3IgYnVmZmVycyBpbiByaW5nICovCisJU0tfSU9DCQlId0FkZHI7CQkvKiBibXUgcmVnaXN0ZXJzIGFkZHJlc3MgKi8KKwlpbnQJCVBvcnRJbmRleDsJLyogaW5kZXggbnVtYmVyIG9mIHBvcnQgKDAgb3IgMSkgKi8KK307CisKKy8qIERlZmluaXRpb25zIG5lZWRlZCBmb3IgaW50ZXJydXB0IG1vZGVyYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJUlFfRU9GX0FTX1RYICAgICAoKElTX1hBMV9GKSAgICAgfCAoSVNfWEEyX0YpKQorI2RlZmluZSBJUlFfRU9GX1NZX1RYICAgICAoKElTX1hTMV9GKSAgICAgfCAoSVNfWFMyX0YpKQorI2RlZmluZSBJUlFfTUFTS19UWF9PTkxZICAoKElSUV9FT0ZfQVNfVFgpfCAoSVJRX0VPRl9TWV9UWCkpCisjZGVmaW5lIElSUV9NQVNLX1JYX09OTFkgICgoSVNfUjFfRikgICAgICB8IChJU19SMl9GKSkKKyNkZWZpbmUgSVJRX01BU0tfU1BfT05MWSAgKFNQRUNJQUxfSVJRUykKKyNkZWZpbmUgSVJRX01BU0tfVFhfUlggICAgKChJUlFfTUFTS19UWF9PTkxZKXwgKElSUV9NQVNLX1JYX09OTFkpKQorI2RlZmluZSBJUlFfTUFTS19TUF9SWCAgICAoKFNQRUNJQUxfSVJRUykgICAgfCAoSVJRX01BU0tfUlhfT05MWSkpCisjZGVmaW5lIElSUV9NQVNLX1NQX1RYICAgICgoU1BFQ0lBTF9JUlFTKSAgICB8IChJUlFfTUFTS19UWF9PTkxZKSkKKyNkZWZpbmUgSVJRX01BU0tfUlhfVFhfU1AgKChTUEVDSUFMX0lSUVMpICAgIHwgKElSUV9NQVNLX1RYX1JYKSkKKworI2RlZmluZSBDX0lOVF9NT0RfTk9ORSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDX0lOVF9NT0RfU1RBVElDICAgICAgICAgICAgICAgMgorI2RlZmluZSBDX0lOVF9NT0RfRFlOQU1JQyAgICAgICAgICAgICAgNAorCisjZGVmaW5lIENfQ0xLX0ZSRVFfR0VORVNJUyAgICAgIDUzMjE1MDAwIC8qIHNob3J0ZXI6IDUzLjEyNSBNSHogICovCisjZGVmaW5lIENfQ0xLX0ZSRVFfWVVLT04gICAgICAgIDc4MjE1MDAwIC8qIHNob3J0ZXI6IDc4LjEyNSBNSHogICovCisKKyNkZWZpbmUgQ19JTlRTX1BFUl9TRUNfREVGQVVMVCAgICAgIDIwMDAgCisjZGVmaW5lIENfSU5UX01PRF9FTkFCTEVfUEVSQ0VOVEFHRSAgIDUwIC8qIGlmIGhpZ2hlciA1MCUgZW5hYmxlICovCisjZGVmaW5lIENfSU5UX01PRF9ESVNBQkxFX1BFUkNFTlRBR0UgIDUwIC8qIGlmIGxvd2VyIDUwJSBkaXNhYmxlICovCisjZGVmaW5lIENfSU5UX01PRF9JUFNfTE9XRVJfUkFOR0UgICAgIDMwCisjZGVmaW5lIENfSU5UX01PRF9JUFNfVVBQRVJfUkFOR0UgICAgIDQwMDAwCisKKwordHlwZWRlZiBzdHJ1Y3Qgc19EeW5JcnFNb2RJbmZvICBESU1fSU5GTzsKK3N0cnVjdCBzX0R5bklycU1vZEluZm8geworCXVuc2lnbmVkIGxvbmcgICBQcmV2VGltZVZhbDsKKwl1bnNpZ25lZCBpbnQgICAgUHJldlN5c0xvYWQ7CisJdW5zaWduZWQgaW50ICAgIFByZXZVc2VkVGltZTsKKwl1bnNpZ25lZCBpbnQgICAgUHJldlRvdGFsVGltZTsKKwlpbnQgICAgICAgICAgICAgUHJldlVzZWREZXNjclJhdGlvOworCWludCAgICAgICAgICAgICBOYnJQcm9jZXNzZWREZXNjcjsKKyAgICAgICAgU0tfVTY0ICAgICAgICAgIFByZXZQb3J0MFJ4SW50ckN0czsKKyAgICAgICAgU0tfVTY0ICAgICAgICAgIFByZXZQb3J0MVJ4SW50ckN0czsKKyAgICAgICAgU0tfVTY0ICAgICAgICAgIFByZXZQb3J0MFR4SW50ckN0czsKKyAgICAgICAgU0tfVTY0ICAgICAgICAgIFByZXZQb3J0MVR4SW50ckN0czsKKwlTS19CT09MICAgICAgICAgTW9kSnVzdEVuYWJsZWQ7ICAgICAvKiBNb2RlcmF0aW9uIGp1c3QgZW5hYmxlZCB5ZXMvbm8gKi8KKworCWludCAgICAgICAgICAgICBNYXhNb2RJbnRzUGVyU2VjOyAgICAgICAgICAgIC8qIE1vZGVyYXRpb24gVGhyZXNob2xkICovCisJaW50ICAgICAgICAgICAgIE1heE1vZEludHNQZXJTZWNVcHBlckxpbWl0OyAgLyogVXBwZXIgbGltaXQgZm9yIERJTSAgKi8KKwlpbnQgICAgICAgICAgICAgTWF4TW9kSW50c1BlclNlY0xvd2VyTGltaXQ7ICAvKiBMb3dlciBsaW1pdCBmb3IgRElNICAqLworCisJbG9uZyAgICAgICAgICAgIE1hc2tJcnFNb2RlcmF0aW9uOyAgIC8qIE1vZElycVR5cGUgKGVnLiAnVHhSeCcpICAgICAgKi8KKwlTS19CT09MICAgICAgICAgRGlzcGxheVN0YXRzOyAgICAgICAgLyogU3RhdHMgeWVzL25vICAgICAgICAgICAgICAgICAqLworCVNLX0JPT0wgICAgICAgICBBdXRvU2l6aW5nOyAgICAgICAgICAvKiBSZXNpemUgRElNLXRpbWVyIG9uL29mZiAgICAgICovCisJaW50ICAgICAgICAgICAgIEludE1vZFR5cGVTZWxlY3Q7ICAgIC8qIEVuYWJsZUludE1vZCAoZWcuICdkeW5hbWljJykgKi8KKworCVNLX1RJTUVSICAgICAgICBNb2RUaW1lcjsgLyoganVzdCBzb21lIHRpbWVyICovCit9OworCit0eXBlZGVmIHN0cnVjdCBzX1BlclN0cm0JUEVSX1NUUk07CisKKyNkZWZpbmUgU0tfQUxMT0NfSVJRCTB4MDAwMDAwMDEKKworI2lmZGVmIFNLX0RJQUdfU1VQUE9SVAorI2RlZmluZQlESUFHX0FDVElWRQkJMQorI2RlZmluZQlESUFHX05PVEFDVElWRQkJMAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQZXIgYm9hcmQgc3RydWN0dXJlIC8gQWRhcHRlciBDb250ZXh0IHN0cnVjdHVyZToKKyAqCUFsbG9jYXRlZCB3aXRoaW4gYXR0YWNoKDllKSBhbmQgZnJlZWQgd2l0aGluIGRldGFjaCg5ZSkuCisgKglDb250YWlucyBhbGwgJ3BlciBkZXZpY2UnIG5lY2Vzc2FyeSBoYW5kbGVzLCBmbGFncywgbG9ja3MgZXRjLjoKKyAqLworc3RydWN0IHNfQUMgIHsKKwlTS19HRUlOSVQJR0luaTsJCS8qIEdFIGluaXQgc3RydWN0ICovCisJU0tfUE5NSQkJUG5taTsJCS8qIFBOTUkgZGF0YSBzdHJ1Y3QgKi8KKwlTS19WUEQJCXZwZDsJCS8qIHZwZCBkYXRhIHN0cnVjdCAqLworCVNLX1FVRVVFCUV2ZW50OwkJLyogRXZlbnQgcXVldWUgKi8KKwlTS19IV1QJCUh3dDsJCS8qIEhhcmR3YXJlIFRpbWVyIGNvbnRyb2wgc3RydWN0ICovCisJU0tfVElNQ1RSTAlUaW07CQkvKiBTb2Z0d2FyZSBUaW1lciBjb250cm9sIHN0cnVjdCAqLworCVNLX0kyQwkJSTJjOwkJLyogSTJDIHJlbGV2YW50IGRhdGEgc3RydWN0dXJlICovCisJU0tfQUREUgkJQWRkcjsJCS8qIGZvciBBZGRyZXNzIG1vZHVsZSAqLworCVNLX0NTVU0JCUNzdW07CQkvKiBmb3IgY2hlY2tzdW0gbW9kdWxlICovCisJU0tfUkxNVAkJUmxtdDsJCS8qIGZvciBybG10IG1vZHVsZSAqLworCXNwaW5sb2NrX3QJU2xvd1BhdGhMb2NrOwkvKiBOb3JtYWwgSVJRIGxvY2sgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBCbGlua1RpbWVyOwkvKiBmb3IgTEVEIGJsaW5raW5nICovCisJaW50CQlMZWRzT247CisJU0tfUE5NSV9TVFJVQ1RfREFUQSBQbm1pU3RydWN0OwkvKiBzdHJ1Y3R1cmUgdG8gZ2V0IGFsbCBQbm1pLURhdGEgKi8KKwlpbnQJCQlSbG10TW9kZTsJLyogbGluayBjaGVjayBtb2RlIHRvIHNldCAqLworCWludAkJCVJsbXROZXRzOwkvKiBOdW1iZXIgb2YgbmV0cyAqLworCQorCVNLX0lPQwkJSW9CYXNlOwkJLyogcmVnaXN0ZXIgc2V0IG9mIGFkYXB0ZXIgKi8KKwlpbnQJCUJvYXJkTGV2ZWw7CS8qIGxldmVsIG9mIGFjdGl2ZSBodyBpbml0ICgwLTIpICovCisJY2hhcgkJRGV2aWNlU3RyWzgwXTsJLyogYWRhcHRlciBzdHJpbmcgZnJvbSB2cGQgKi8KKwlTS19VMzIJCUFsbG9jRmxhZzsJLyogZmxhZyBhbGxvY2F0aW9uIG9mIHJlc291cmNlcyAqLworCXN0cnVjdCBwY2lfZGV2CSpQY2lEZXY7CS8qIGZvciBhY2Nlc3MgdG8gcGNpIGNvbmZpZyBzcGFjZSAqLworCVNLX1UzMgkJUGNpRGV2SWQ7CS8qIHBjaSBkZXZpY2UgaWQgKi8KKwlzdHJ1Y3QgU0tfTkVUX0RFVklDRQkqZGV2WzJdOwkvKiBwb2ludGVyIHRvIGRldmljZSBzdHJ1Y3QgKi8KKwljaGFyCQlOYW1lWzMwXTsJLyogZHJpdmVyIG5hbWUgKi8KKworCWludAkJUnhCdWZTaXplOwkvKiBsZW5ndGggb2YgcmVjZWl2ZSBidWZmZXJzICovCisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwkvKiBsaW51eCAnbmV0c3RhdCAtaScgc3RhdGlzdGljcyAqLworCWludAkJSW5kZXg7CQkvKiBpbnRlcm5hbCBib2FyZCBpbmRleCBudW1iZXIgKi8KKworCS8qIGFkYXB0ZXIgUkFNIHNpemVzIGZvciBxdWV1ZXMgb2YgYWN0aXZlIHBvcnQgKi8KKwlpbnQJCVJ4UXVldWVTaXplOwkvKiBtZW1vcnkgdXNlZCBmb3IgcmVjZWl2ZSBxdWV1ZSAqLworCWludAkJVHhTUXVldWVTaXplOwkvKiBtZW1vcnkgdXNlZCBmb3Igc3luYy4gdHggcXVldWUgKi8KKwlpbnQJCVR4QVF1ZXVlU2l6ZTsJLyogbWVtb3J5IHVzZWQgZm9yIGFzeW5jLiB0eCBxdWV1ZSAqLworCisJaW50CQlQcm9taXNjQ291bnQ7CS8qIHByb21pc2N1b3VzIG1vZGUgY291bnRlciAgKi8KKwlpbnQJCUFsbE11bHRpQ291bnQ7ICAvKiBhbGxtdWx0aWNhc3QgbW9kZSBjb3VudGVyICovCisJaW50CQlNdWx0aWNDb3VudDsJLyogbnVtYmVyIG9mIGRpZmZlcmVudCBNQyAgICAqLworCQkJCQkvKiAgYWRkcmVzc2VzIGZvciB0aGlzIGJvYXJkICovCisJCQkJCS8qICAobWF5IGJlIG1vcmUgdGhhbiBIVyBjYW4pKi8KKworCWludAkJSFdSZXZpc2lvbjsJLyogSGFyZHdhcmUgcmV2aXNpb24gKi8KKwlpbnQJCUFjdGl2ZVBvcnQ7CS8qIHRoZSBhY3RpdmUgWE1BQyBwb3J0ICovCisJaW50CQlNYXhQb3J0czsJCS8qIG51bWJlciBvZiBhY3RpdmF0ZWQgcG9ydHMgKi8KKwlpbnQJCVR4RGVzY3JQZXJSaW5nOwkvKiAjIG9mIGRlc2NyaXB0b3JzIHBlciB0eCByaW5nICovCisJaW50CQlSeERlc2NyUGVyUmluZzsJLyogIyBvZiBkZXNjcmlwdG9ycyBwZXIgcnggcmluZyAqLworCisJY2FkZHJfdAkJcERlc2NyTWVtOwkvKiBQb2ludGVyIHRvIHRoZSBkZXNjcmlwdG9yIGFyZWEgKi8KKwlkbWFfYWRkcl90CXBEZXNjck1lbURNQTsJLyogUENJIERNQSBhZGRyZXNzIG9mIGFyZWEgKi8KKworCS8qIHRoZSBwb3J0IHN0cnVjdHVyZXMgd2l0aCBkZXNjcmlwdG9yIHJpbmdzICovCisJVFhfUE9SVAkJVHhQb3J0W1NLX01BWF9NQUNTXVsyXTsKKwlSWF9QT1JUCQlSeFBvcnRbU0tfTUFYX01BQ1NdOworCisJdW5zaWduZWQgaW50CUNzT2ZzMTsJCS8qIGZvciBjaGVja3N1bSBjYWxjdWxhdGlvbiAqLworCXVuc2lnbmVkIGludAlDc09mczI7CQkvKiBmb3IgY2hlY2tzdW0gY2FsY3VsYXRpb24gKi8KKwlTS19VMzIJCUNzT2ZzOwkJLyogZm9yIGNoZWNrc3VtIGNhbGN1bGF0aW9uICovCisKKwlTS19CT09MCQlDaGVja1F1ZXVlOwkvKiBjaGVjayBldmVudCBxdWV1ZSBzb29uICovCisJU0tfVElNRVIgICAgICAgIERydkNsZWFudXBUaW1lcjsvKiB0byBjaGVjayBmb3IgcGVuZGluZyBkZXNjcmlwdG9ycyAqLworCURJTV9JTkZPICAgICAgICBEeW5JcnFNb2RJbmZvOyAgLyogYWxsIGRhdGEgcmVsYXRlZCB0byBESU0gKi8KKworCS8qIE9ubHkgZm9yIHRlc3RzICovCisJaW50CQlQb3J0VXA7CisJaW50CQlQb3J0RG93bjsKKwlpbnQJCUNoaXBzZXRUeXBlOwkvKiAgQ2hpcHNldCBmYW1pbHkgdHlwZSAKKwkJCQkJICogIDAgPT0gR2VuZXNpcyBmYW1pbHkgc3VwcG9ydAorCQkJCQkgKiAgMSA9PSBZdWtvbiBmYW1pbHkgc3VwcG9ydAorCQkJCQkgKi8KKyNpZmRlZiBTS19ESUFHX1NVUFBPUlQKKwlTS19VMzIJCURpYWdNb2RlQWN0aXZlOwkJLyogaXMgZGlhZyBhY3RpdmU/CSovCisJU0tfQk9PTAkJRGlhZ0Zsb3dDdHJsOwkJLyogZm9yIGNvbnRyb2wgcHVycG9zZXMJKi8KKwlTS19QTk1JX1NUUlVDVF9EQVRBIFBubWlCYWNrdXA7CQkvKiBiYWNrdXAgc3RydWN0dXJlIGZvciBhbGwgUG5taS1EYXRhICovCisJU0tfQk9PTCAgICAgICAgIFdhc0lmVXBbU0tfTUFYX01BQ1NdOyAgIC8qIGZvciBPcGVuQ2xvc2Ugd2hpbGUgCisJCQkJCQkgKiBESUFHIGlzIGJ1c3kgd2l0aCBOSUMgCisJCQkJCQkgKi8KKyNlbmRpZgorCit9OworCisKKyNlbmRpZiAvKiBfX0lOQ19TS0RSVjJORF9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2Vycm9yLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tlcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMDYyZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tlcnJvci5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2Vycm9yLmgKKyAqIFByb2plY3Q6CUdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcnMsIENvbW1vbiBNb2R1bGVzCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuNyAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wNS8xMyAxNzoyNToxMyAkCisgKiBQdXJwb3NlOglTSyBzcGVjaWZpYyBFcnJvciBsb2cgc3VwcG9ydAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QuCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9JTkNfU0tFUlJPUl9IXworI2RlZmluZSBfSU5DX1NLRVJST1JfSF8KKworLyoKKyAqIERlZmluZSBFcnJvciBDbGFzc2VzCisgKi8KKyNkZWZpbmUJU0tfRVJSQ0xfT1RIRVIJCSgwKQkJLyogT3RoZXIgZXJyb3IgKi8KKyNkZWZpbmUJU0tfRVJSQ0xfQ09ORklHCQkoMUw8PDApCS8qIENvbmZpZ3VyYXRpb24gZXJyb3IgKi8KKyNkZWZpbmUJU0tfRVJSQ0xfSU5JVAkJKDFMPDwxKQkvKiBJbml0aWFsaXphdGlvbiBlcnJvciAqLworI2RlZmluZQlTS19FUlJDTF9OT1JFUwkJKDFMPDwyKQkvKiBPdXQgb2YgUmVzb3VyY2VzIGVycm9yICovCisjZGVmaW5lCVNLX0VSUkNMX1NXCQkJKDFMPDwzKQkvKiBJbnRlcm5hbCBTb2Z0d2FyZSBlcnJvciAqLworI2RlZmluZQlTS19FUlJDTF9IVwkJCSgxTDw8NCkJLyogSGFyZHdhcmUgRmFpbHVyZSAqLworI2RlZmluZQlTS19FUlJDTF9DT01NCQkoMUw8PDUpCS8qIENvbW11bmljYXRpb24gZXJyb3IgKi8KKworCisvKgorICogRGVmaW5lIEVycm9yIENvZGUgQmFzZXMKKyAqLworI2RlZmluZQlTS19FUlJCQVNFX1JMTVQJCSAxMDAJLyogQmFzZSBFcnJvciBudW1iZXIgZm9yIFJMTVQgKi8KKyNkZWZpbmUJU0tfRVJSQkFTRV9IV0lOSVQJIDIwMAkvKiBCYXNlIEVycm9yIG51bWJlciBmb3IgSFdJbml0ICovCisjZGVmaW5lCVNLX0VSUkJBU0VfVlBECQkgMzAwCS8qIEJhc2UgRXJyb3IgbnVtYmVyIGZvciBWUEQgKi8KKyNkZWZpbmUJU0tfRVJSQkFTRV9QTk1JCQkgNDAwCS8qIEJhc2UgRXJyb3IgbnVtYmVyIGZvciBQTk1JICovCisjZGVmaW5lCVNLX0VSUkJBU0VfQ1NVTQkJIDUwMAkvKiBCYXNlIEVycm9yIG51bWJlciBmb3IgQ2hlY2tzdW0gKi8KKyNkZWZpbmUJU0tfRVJSQkFTRV9TSVJRCQkgNjAwCS8qIEJhc2UgRXJyb3IgbnVtYmVyIGZvciBTcGVjaWFsIElSUSAqLworI2RlZmluZQlTS19FUlJCQVNFX0kyQwkJIDcwMAkvKiBCYXNlIEVycm9yIG51bWJlciBmb3IgSTJDIG1vZHVsZSAqLworI2RlZmluZQlTS19FUlJCQVNFX1FVRVVFCSA4MDAJLyogQmFzZSBFcnJvciBudW1iZXIgZm9yIFNjaGVkdWxlciAqLworI2RlZmluZQlTS19FUlJCQVNFX0FERFIJCSA5MDAJLyogQmFzZSBFcnJvciBudW1iZXIgZm9yIEFkZHJlc3MgbW9kdWxlICovCisjZGVmaW5lIFNLX0VSUkJBU0VfUEVDUAkJMTAwMCAgICAvKiBCYXNlIEVycm9yIG51bWJlciBmb3IgUEVDUCAqLworI2RlZmluZQlTS19FUlJCQVNFX0RSVgkJMTEwMAkvKiBCYXNlIEVycm9yIG51bWJlciBmb3IgRHJpdmVyICovCisKKyNlbmRpZgkvKiBfSU5DX1NLRVJST1JfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlZHJ2LmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZWRydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZmQ0YzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZWRydi5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2dlZHJ2LmgKKyAqIFByb2plY3Q6CUdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcnMsIENvbW1vbiBNb2R1bGVzCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMTAgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDcvMDQgMTI6MjU6MDEgJAorICogUHVycG9zZToJSW50ZXJmYWNlIHdpdGggdGhlIGRyaXZlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QuCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fSU5DX1NLR0VEUlZfSF8KKyNkZWZpbmUgX19JTkNfU0tHRURSVl9IXworCisvKiBkZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRGVmaW5lIHRoZSBkcml2ZXIgZXZlbnRzLgorICogVXN1YWxseSB0aGUgZXZlbnRzIGFyZSBkZWZpbmVkIGJ5IHRoZSBkZXN0aW5hdGlvbiBtb2R1bGUuCisgKiBJbiBjYXNlIG9mIHRoZSBkcml2ZXIgd2UgcHV0IHRoZSBkZWZpbml0aW9uIG9mIHRoZSBldmVudHMgaGVyZS4KKyAqLworI2RlZmluZSBTS19EUlZfUE9SVF9SRVNFVAkJIDEJLyogVGhlIHBvcnQgbmVlZHMgdG8gYmUgcmVzZXQgKi8KKyNkZWZpbmUgU0tfRFJWX05FVF9VUCAgIAkJIDIJLyogVGhlIG5ldCBpcyBvcGVyYXRpb25hbCAqLworI2RlZmluZSBTS19EUlZfTkVUX0RPV04JCQkgMwkvKiBUaGUgbmV0IGlzIGRvd24gKi8KKyNkZWZpbmUgU0tfRFJWX1NXSVRDSF9TT0ZUCQkgNAkvKiBQb3J0cyBzd2l0Y2ggd2l0aCBib3RoIGxpbmtzIGNvbm5lY3RlZCAqLworI2RlZmluZSBTS19EUlZfU1dJVENIX0hBUkQJCSA1CS8qIFBvcnQgc3dpdGNoIGR1ZSB0byBsaW5rIGZhaWx1cmUgKi8KKyNkZWZpbmUgU0tfRFJWX1JMTVRfU0VORAkJIDYJLyogU2VuZCBhIFJMTVQgcGFja2V0ICovCisjZGVmaW5lIFNLX0RSVl9BREFQX0ZBSUwJCSA3CS8qIFRoZSB3aG9sZSBhZGFwdGVyIGZhaWxzICovCisjZGVmaW5lIFNLX0RSVl9QT1JUX0ZBSUwJCSA4CS8qIE9uZSBwb3J0IGZhaWxzICovCisjZGVmaW5lIFNLX0RSVl9TV0lUQ0hfSU5URVJOCSA5CS8qIFBvcnQgc3dpdGNoIGJ5IHRoZSBkcml2ZXIgaXRzZWxmICovCisjZGVmaW5lIFNLX0RSVl9QT1dFUl9ET1dOCQkxMAkvKiBQb3dlciBkb3duIG1vZGUgKi8KKyNkZWZpbmUgU0tfRFJWX1RJTUVSCQkJMTEJLyogVGltZXIgZm9yIGZyZWUgdXNlICovCisjaWZkZWYgU0tfTk9fUkxNVAorI2RlZmluZSBTS19EUlZfTElOS19VUCAgCQkxMgkvKiBMaW5rIFVwIGV2ZW50IGZvciBkcml2ZXIgKi8KKyNkZWZpbmUgU0tfRFJWX0xJTktfRE9XTgkJMTMJLyogTGluayBEb3duIGV2ZW50IGZvciBkcml2ZXIgKi8KKyNlbmRpZgorI2RlZmluZSBTS19EUlZfRE9XTlNISUZUX0RFVAkxNAkvKiBEb3duc2hpZnQgNC1QYWlyIC8gMi1QYWlyIChZVUtPTiBvbmx5KSAqLworI2VuZGlmIC8qIF9fSU5DX1NLR0VEUlZfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlaHcuaCBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlaHcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjI4MmI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2Vody5oCkBAIC0wLDAgKzEsMjEyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrZ2Vody5oCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBDb21tb24gTW9kdWxlcworICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjU2ICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzA5LzIzIDA5OjAxOjAwICQKKyAqIFB1cnBvc2U6CURlZmluZXMgYW5kIE1hY3JvcyBmb3IgdGhlIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlciBQcm9kdWN0IEZhbWlseQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QuCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fSU5DX1NLR0VIV19ICisjZGVmaW5lIF9fSU5DX1NLR0VIV19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYJLyogX19jcGx1c3BsdXMgKi8KKworLyogZGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBCSVRfMzEJCSgxVUwgPDwgMzEpCisjZGVmaW5lIEJJVF8zMAkJKDFMIDw8IDMwKQorI2RlZmluZSBCSVRfMjkJCSgxTCA8PCAyOSkKKyNkZWZpbmUgQklUXzI4CQkoMUwgPDwgMjgpCisjZGVmaW5lIEJJVF8yNwkJKDFMIDw8IDI3KQorI2RlZmluZSBCSVRfMjYJCSgxTCA8PCAyNikKKyNkZWZpbmUgQklUXzI1CQkoMUwgPDwgMjUpCisjZGVmaW5lIEJJVF8yNAkJKDFMIDw8IDI0KQorI2RlZmluZSBCSVRfMjMJCSgxTCA8PCAyMykKKyNkZWZpbmUgQklUXzIyCQkoMUwgPDwgMjIpCisjZGVmaW5lIEJJVF8yMQkJKDFMIDw8IDIxKQorI2RlZmluZSBCSVRfMjAJCSgxTCA8PCAyMCkKKyNkZWZpbmUgQklUXzE5CQkoMUwgPDwgMTkpCisjZGVmaW5lIEJJVF8xOAkJKDFMIDw8IDE4KQorI2RlZmluZSBCSVRfMTcJCSgxTCA8PCAxNykKKyNkZWZpbmUgQklUXzE2CQkoMUwgPDwgMTYpCisjZGVmaW5lIEJJVF8xNQkJKDFMIDw8IDE1KQorI2RlZmluZSBCSVRfMTQJCSgxTCA8PCAxNCkKKyNkZWZpbmUgQklUXzEzCQkoMUwgPDwgMTMpCisjZGVmaW5lIEJJVF8xMgkJKDFMIDw8IDEyKQorI2RlZmluZSBCSVRfMTEJCSgxTCA8PCAxMSkKKyNkZWZpbmUgQklUXzEwCQkoMUwgPDwgMTApCisjZGVmaW5lIEJJVF85CQkoMUwgPDwgOSkKKyNkZWZpbmUgQklUXzgJCSgxTCA8PCA4KQorI2RlZmluZSBCSVRfNwkJKDFMIDw8IDcpCisjZGVmaW5lIEJJVF82CQkoMUwgPDwgNikKKyNkZWZpbmUgQklUXzUJCSgxTCA8PCA1KQorI2RlZmluZSBCSVRfNAkJKDFMIDw8IDQpCisjZGVmaW5lIEJJVF8zCQkoMUwgPDwgMykKKyNkZWZpbmUgQklUXzIJCSgxTCA8PCAyKQorI2RlZmluZSBCSVRfMQkJKDFMIDw8IDEpCisjZGVmaW5lIEJJVF8wCQkxTAorCisjZGVmaW5lIEJJVF8xNVMJCSgxVSA8PCAxNSkKKyNkZWZpbmUgQklUXzE0UwkJKDEgPDwgMTQpCisjZGVmaW5lIEJJVF8xM1MJCSgxIDw8IDEzKQorI2RlZmluZSBCSVRfMTJTCQkoMSA8PCAxMikKKyNkZWZpbmUgQklUXzExUwkJKDEgPDwgMTEpCisjZGVmaW5lIEJJVF8xMFMJCSgxIDw8IDEwKQorI2RlZmluZSBCSVRfOVMJCSgxIDw8IDkpCisjZGVmaW5lIEJJVF84UwkJKDEgPDwgOCkKKyNkZWZpbmUgQklUXzdTIAkJKDEgPDwgNykKKyNkZWZpbmUgQklUXzZTCQkoMSA8PCA2KQorI2RlZmluZSBCSVRfNVMJCSgxIDw8IDUpCisjZGVmaW5lIEJJVF80UwkJKDEgPDwgNCkKKyNkZWZpbmUgQklUXzNTCQkoMSA8PCAzKQorI2RlZmluZSBCSVRfMlMJCSgxIDw8IDIpCisjZGVmaW5lIEJJVF8xUwkJKDEgPDwgMSkKKyNkZWZpbmUgQklUXzBTCQkxCisKKyNkZWZpbmUgU0hJRlQzMSh4KQkoKHgpIDw8IDMxKQorI2RlZmluZSBTSElGVDMwKHgpCSgoeCkgPDwgMzApCisjZGVmaW5lIFNISUZUMjkoeCkJKCh4KSA8PCAyOSkKKyNkZWZpbmUgU0hJRlQyOCh4KQkoKHgpIDw8IDI4KQorI2RlZmluZSBTSElGVDI3KHgpCSgoeCkgPDwgMjcpCisjZGVmaW5lIFNISUZUMjYoeCkJKCh4KSA8PCAyNikKKyNkZWZpbmUgU0hJRlQyNSh4KQkoKHgpIDw8IDI1KQorI2RlZmluZSBTSElGVDI0KHgpCSgoeCkgPDwgMjQpCisjZGVmaW5lIFNISUZUMjMoeCkJKCh4KSA8PCAyMykKKyNkZWZpbmUgU0hJRlQyMih4KQkoKHgpIDw8IDIyKQorI2RlZmluZSBTSElGVDIxKHgpCSgoeCkgPDwgMjEpCisjZGVmaW5lIFNISUZUMjAoeCkJKCh4KSA8PCAyMCkKKyNkZWZpbmUgU0hJRlQxOSh4KQkoKHgpIDw8IDE5KQorI2RlZmluZSBTSElGVDE4KHgpCSgoeCkgPDwgMTgpCisjZGVmaW5lIFNISUZUMTcoeCkJKCh4KSA8PCAxNykKKyNkZWZpbmUgU0hJRlQxNih4KQkoKHgpIDw8IDE2KQorI2RlZmluZSBTSElGVDE1KHgpCSgoeCkgPDwgMTUpCisjZGVmaW5lIFNISUZUMTQoeCkJKCh4KSA8PCAxNCkKKyNkZWZpbmUgU0hJRlQxMyh4KQkoKHgpIDw8IDEzKQorI2RlZmluZSBTSElGVDEyKHgpCSgoeCkgPDwgMTIpCisjZGVmaW5lIFNISUZUMTEoeCkJKCh4KSA8PCAxMSkKKyNkZWZpbmUgU0hJRlQxMCh4KQkoKHgpIDw8IDEwKQorI2RlZmluZSBTSElGVDkoeCkJKCh4KSA8PCA5KQorI2RlZmluZSBTSElGVDgoeCkJKCh4KSA8PCA4KQorI2RlZmluZSBTSElGVDcoeCkJKCh4KSA8PCA3KQorI2RlZmluZSBTSElGVDYoeCkJKCh4KSA8PCA2KQorI2RlZmluZSBTSElGVDUoeCkJKCh4KSA8PCA1KQorI2RlZmluZSBTSElGVDQoeCkJKCh4KSA8PCA0KQorI2RlZmluZSBTSElGVDMoeCkJKCh4KSA8PCAzKQorI2RlZmluZSBTSElGVDIoeCkJKCh4KSA8PCAyKQorI2RlZmluZSBTSElGVDEoeCkJKCh4KSA8PCAxKQorI2RlZmluZSBTSElGVDAoeCkJKCh4KSA8PCAwKQorCisvKgorICogQ29uZmlndXJhdGlvbiBTcGFjZSBoZWFkZXIKKyAqIFNpbmNlIHRoaXMgbW9kdWxlIGlzIHVzZWQgZm9yIGRpZmZlcmVudCBPUycsIHRob3NlIG1heSBiZQorICogZHVwbGljYXRlIG9uIHNvbWUgb2YgdGhlbSAoZS5nLiBMaW51eCkuIEJ1dCB0byBrZWVwIHRoZQorICogY29tbW9uIHNvdXJjZSwgd2UgaGF2ZSB0byBsaXZlIHdpdGggdGhpcy4uLgorICovCisjZGVmaW5lIFBDSV9WRU5ET1JfSUQJMHgwMAkvKiAxNiBiaXQJVmVuZG9yIElEICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSUQJMHgwMgkvKiAxNiBiaXQJRGV2aWNlIElEICovCisjZGVmaW5lIFBDSV9DT01NQU5ECQkweDA0CS8qIDE2IGJpdAlDb21tYW5kICovCisjZGVmaW5lIFBDSV9TVEFUVVMJCTB4MDYJLyogMTYgYml0CVN0YXR1cyAqLworI2RlZmluZSBQQ0lfUkVWX0lECQkweDA4CS8qICA4IGJpdAlSZXZpc2lvbiBJRCAqLworI2RlZmluZSBQQ0lfQ0xBU1NfQ09ERQkweDA5CS8qIDI0IGJpdAlDbGFzcyBDb2RlICovCisjZGVmaW5lIFBDSV9DQUNIRV9MU1oJMHgwYwkvKiAgOCBiaXQJQ2FjaGUgTGluZSBTaXplICovCisjZGVmaW5lIFBDSV9MQVRfVElNCQkweDBkCS8qICA4IGJpdAlMYXRlbmN5IFRpbWVyICovCisjZGVmaW5lIFBDSV9IRUFERVJfVAkweDBlCS8qICA4IGJpdAlIZWFkZXIgVHlwZSAqLworI2RlZmluZSBQQ0lfQklTVAkJMHgwZgkvKiAgOCBiaXQJQnVpbHQtaW4gc2VsZnRlc3QgKi8KKyNkZWZpbmUgUENJX0JBU0VfMVNUCTB4MTAJLyogMzIgYml0CTFzdCBCYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUENJX0JBU0VfMk5ECTB4MTQJLyogMzIgYml0CTJuZCBCYXNlIGFkZHJlc3MgKi8KKwkvKiBCeXRlIDB4MTguLjB4MmI6CXJlc2VydmVkICovCisjZGVmaW5lIFBDSV9TVUJfVklECQkweDJjCS8qIDE2IGJpdAlTdWJzeXN0ZW0gVmVuZG9yIElEICovCisjZGVmaW5lIFBDSV9TVUJfSUQJCTB4MmUJLyogMTYgYml0CVN1YnN5c3RlbSBJRCAqLworI2RlZmluZSBQQ0lfQkFTRV9ST00JMHgzMAkvKiAzMiBiaXQJRXhwYW5zaW9uIFJPTSBCYXNlIEFkZHJlc3MgKi8KKyNkZWZpbmUgUENJX0NBUF9QVFIJCTB4MzQJLyogIDggYml0IAlDYXBhYmlsaXRpZXMgUHRyICovCisJLyogQnl0ZSAweDM1Li4weDNiOglyZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfSVJRX0xJTkUJMHgzYwkvKiAgOCBiaXQJSW50ZXJydXB0IExpbmUgKi8KKyNkZWZpbmUgUENJX0lSUV9QSU4JCTB4M2QJLyogIDggYml0CUludGVycnVwdCBQaW4gKi8KKyNkZWZpbmUgUENJX01JTl9HTlQJCTB4M2UJLyogIDggYml0CU1pbl9HbnQgKi8KKyNkZWZpbmUgUENJX01BWF9MQVQJCTB4M2YJLyogIDggYml0CU1heF9MYXQgKi8KKwkvKiBEZXZpY2UgRGVwZW5kZW50IFJlZ2lvbiAqLworI2RlZmluZSBQQ0lfT1VSX1JFR18xCTB4NDAJLyogMzIgYml0IAlPdXIgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBQQ0lfT1VSX1JFR18yCTB4NDQJLyogMzIgYml0IAlPdXIgUmVnaXN0ZXIgMiAqLworCS8qIFBvd2VyIE1hbmFnZW1lbnQgUmVnaW9uICovCisjZGVmaW5lIFBDSV9QTV9DQVBfSUQJMHg0OAkvKiAgOCBiaXQgCVBvd2VyIE1hbmFnZW1lbnQgQ2FwLiBJRCAqLworI2RlZmluZSBQQ0lfUE1fTklURU0JMHg0OQkvKiAgOCBiaXQgCU5leHQgSXRlbSBQdHIgKi8KKyNkZWZpbmUgUENJX1BNX0NBUF9SRUcJMHg0YQkvKiAxNiBiaXQgCVBvd2VyIE1hbmFnZW1lbnQgQ2FwYWJpbGl0aWVzICovCisjZGVmaW5lIFBDSV9QTV9DVExfU1RTCTB4NGMJLyogMTYgYml0IAlQb3dlciBNYW5hZy4gQ29udHJvbC9TdGF0dXMgKi8KKwkvKiBCeXRlIDB4NGU6CXJlc2VydmVkICovCisjZGVmaW5lIFBDSV9QTV9EQVRfUkVHCTB4NGYJLyogIDggYml0IAlQb3dlciBNYW5hZy4gRGF0YSBSZWdpc3RlciAqLworCS8qIFZQRCBSZWdpb24gKi8KKyNkZWZpbmUgUENJX1ZQRF9DQVBfSUQJMHg1MAkvKiAgOCBiaXQgCVZQRCBDYXAuIElEICovCisjZGVmaW5lIFBDSV9WUERfTklURU0JMHg1MQkvKiAgOCBiaXQgCU5leHQgSXRlbSBQdHIgKi8KKyNkZWZpbmUgUENJX1ZQRF9BRFJfUkVHCTB4NTIJLyogMTYgYml0IAlWUEQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZSBQQ0lfVlBEX0RBVF9SRUcJMHg1NAkvKiAzMiBiaXQgCVZQRCBEYXRhIFJlZ2lzdGVyICovCisJLyogQnl0ZSAweDU4Li4weDU5OglyZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfU0VSX0xEX0NUUkwJMHg1YQkvKiAxNiBiaXQgCVNFRVBST00gTG9hZGVyIEN0cmwgKFlVS09OIG9ubHkpICovCisJLyogQnl0ZSAweDVjLi4weGZmOglyZXNlcnZlZCAqLworCisvKgorICogSTJDIEFkZHJlc3MgKFBDSSBDb25maWcpCisgKgorICogTm90ZTogVGhlIHRlbXBlcmF0dXJlIGFuZCB2b2x0YWdlIHNlbnNvcnMgYXJlIHJlbG9jYXRlZCBvbiBhIGRpZmZlcmVudAorICoJIEkyQyBidXMuCisgKi8KKyNkZWZpbmUgSTJDX0FERFJfVlBECTB4YTAJLyogSTJDIGFkZHJlc3MgZm9yIHRoZSBWUEQgRUVQUk9NICovCisKKy8qCisgKiBEZWZpbmUgQml0cyBhbmQgVmFsdWVzIG9mIHRoZSByZWdpc3RlcnMKKyAqLworLyoJUENJX0NPTU1BTkQJMTYgYml0CUNvbW1hbmQgKi8KKwkJCQkJCQkJLyogQml0IDE1Li4xMToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0lOVF9ESVMJCUJJVF8xMFMJCS8qIEludGVycnVwdCBJTlR4IyBkaXNhYmxlIChQQ0kgMi4zKSAqLworI2RlZmluZSBQQ0lfRkJURU4JCUJJVF85UwkJLyogRmFzdCBCYWNrLVRvLUJhY2sgZW5hYmxlICovCisjZGVmaW5lIFBDSV9TRVJSRU4JCUJJVF84UwkJLyogU0VSUiBlbmFibGUgKi8KKyNkZWZpbmUgUENJX0FEU1RFUAkJQklUXzdTCQkvKiBBZGRyZXNzIFN0ZXBwaW5nICovCisjZGVmaW5lIFBDSV9QRVJSRU4JCUJJVF82UwkJLyogUGFyaXR5IFJlcG9ydCBSZXNwb25zZSBlbmFibGUgKi8KKyNkZWZpbmUgUENJX1ZHQV9TTk9PUAlCSVRfNVMJCS8qIFZHQSBwYWxldHRlIHNub29wICovCisjZGVmaW5lIFBDSV9NV0lFTgkJQklUXzRTCQkvKiBNZW1vcnkgd3JpdGUgYW4gaW52IGN5Y2wgZW5hICovCisjZGVmaW5lIFBDSV9TQ1lDRU4JCUJJVF8zUwkJLyogU3BlY2lhbCBDeWNsZSBlbmFibGUgKi8KKyNkZWZpbmUgUENJX0JNRU4JCUJJVF8yUwkJLyogQnVzIE1hc3RlciBlbmFibGUgKi8KKyNkZWZpbmUgUENJX01FTUVOCQlCSVRfMVMJCS8qIE1lbW9yeSBTcGFjZSBBY2Nlc3MgZW5hYmxlICovCisjZGVmaW5lIFBDSV9JT0VOCQlCSVRfMFMJCS8qIEkvTyBTcGFjZSBBY2Nlc3MgZW5hYmxlICovCisKKyNkZWZpbmUgUENJX0NPTU1BTkRfVkFMCShQQ0lfRkJURU4gfCBQQ0lfU0VSUkVOIHwgUENJX1BFUlJFTiB8IFBDSV9NV0lFTiB8XAorCQkJCQkJIFBDSV9CTUVOIHwgUENJX01FTUVOIHwgUENJX0lPRU4pCisKKy8qCVBDSV9TVEFUVVMJMTYgYml0CVN0YXR1cyAqLworI2RlZmluZSBQQ0lfUEVSUgkJQklUXzE1UwkJLyogUGFyaXR5IEVycm9yICovCisjZGVmaW5lIFBDSV9TRVJSCQlCSVRfMTRTCQkvKiBTaWduYWxlZCBTRVJSICovCisjZGVmaW5lIFBDSV9STUFCT1JUCQlCSVRfMTNTCQkvKiBSZWNlaXZlZCBNYXN0ZXIgQWJvcnQgKi8KKyNkZWZpbmUgUENJX1JUQUJPUlQJCUJJVF8xMlMJCS8qIFJlY2VpdmVkIFRhcmdldCBBYm9ydCAqLworCQkJCQkJCQkvKiBCaXQgMTE6CXJlc2VydmVkICovCisjZGVmaW5lIFBDSV9ERVZTRUwJCSgzPDw5KQkJLyogQml0IDEwLi4gOToJREVWU0VMIFRpbWluZyAqLworI2RlZmluZSBQQ0lfREVWX0ZBU1QJKDA8PDkpCQkvKgkJZmFzdCAqLworI2RlZmluZSBQQ0lfREVWX01FRElVTQkoMTw8OSkJCS8qCQltZWRpdW0gKi8KKyNkZWZpbmUgUENJX0RFVl9TTE9XCSgyPDw5KQkJLyoJCXNsb3cgKi8KKyNkZWZpbmUgUENJX0RBVEFQRVJSCUJJVF84UwkJLyogREFUQSBQYXJpdHkgZXJyb3IgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgUENJX0ZCMkJDQVAJCUJJVF83UwkJLyogRmFzdCBCYWNrLXRvLUJhY2sgQ2FwYWJpbGl0eSAqLworI2RlZmluZSBQQ0lfVURGCQkJQklUXzZTCQkvKiBVc2VyIERlZmluZWQgRmVhdHVyZXMgKi8KKyNkZWZpbmUgUENJXzY2TUhaQ0FQCUJJVF81UwkJLyogNjYgTUh6IFBDSSBidXMgY2xvY2sgY2FwYWJsZSAqLworI2RlZmluZSBQQ0lfTkVXQ0FQCQlCSVRfNFMJCS8qIE5ldyBjYXAuIGxpc3QgaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUgUENJX0lOVF9TVEFUCUJJVF8zUwkJLyogSW50ZXJydXB0IElOVHgjIFN0YXR1cyAoUENJIDIuMykgKi8KKwkJCQkJCQkJLyogQml0ICAyLi4gMDoJcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBQQ0lfRVJSQklUUwkoUENJX1BFUlIgfCBQQ0lfU0VSUiB8IFBDSV9STUFCT1JUIHwgUENJX1JUQUJPUlQgfFwKKwkJCVBDSV9EQVRBUEVSUikKKworLyoJUENJX0NMQVNTX0NPREUJMjQgYml0CUNsYXNzIENvZGUgKi8KKy8qCUJ5dGUgMjoJCUJhc2UgQ2xhc3MJCSgwMikgKi8KKy8qCUJ5dGUgMToJCVN1YkNsYXNzCQkoMDApICovCisvKglCeXRlIDA6CQlQcm9ncmFtbWluZyBJbnRlcmZhY2UJKDAwKSAqLworCisvKglQQ0lfQ0FDSEVfTFNaCTggYml0CUNhY2hlIExpbmUgU2l6ZSAqLworLyoJUG9zc2libGUgdmFsdWVzOiAwLDIsNCw4LDE2LDMyLDY0LDEyOAkqLworCisvKglQQ0lfSEVBREVSX1QJOCBiaXQJSGVhZGVyIFR5cGUgKi8KKyNkZWZpbmUgUENJX0hEX01GX0RFVglCSVRfN1MJLyogMD0gc2luZ2xlLCAxPSBtdWx0aS1mdW5jIGRldiAqLworI2RlZmluZSBQQ0lfSERfVFlQRQkJMHg3ZgkvKiBCaXQgNi4uMDoJSGVhZGVyIExheW91dCAwPSBub3JtYWwgKi8KKworLyoJUENJX0JJU1QJOCBiaXQJQnVpbHQtaW4gc2VsZnRlc3QgKi8KKy8qCUJ1aWx0LWluIFNlbGYgdGVzdCBub3Qgc3VwcG9ydGVkIChvcHRpb25hbCkgKi8KKworLyoJUENJX0JBU0VfMVNUCTMyIGJpdAkxc3QgQmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFBDSV9NRU1TSVpFCQkweDQwMDBMCQkvKiB1c2UgMTYga0IgTWVtb3J5IEJhc2UgKi8KKyNkZWZpbmUgUENJX01FTUJBU0VfTVNLIDB4ZmZmZmMwMDBMCS8qIEJpdCAzMS4uMTQ6CU1lbW9yeSBCYXNlIEFkZHJlc3MgKi8KKyNkZWZpbmUgUENJX01FTVNJWkVfTVNLIDB4MDAwMDNmZjBMCS8qIEJpdCAxMy4uIDQ6CU1lbW9yeSBTaXplIFJlcS4gKi8KKyNkZWZpbmUgUENJX1BSRUZFTgkJQklUXzMJCS8qIFByZWZldGNoYWJsZSAqLworI2RlZmluZSBQQ0lfTUVNX1RZUAkJKDNMPDwyKQkJLyogQml0CTIuLiAxOglNZW1vcnkgVHlwZSAqLworI2RlZmluZSBQQ0lfTUVNMzJCSVQJKDBMPDwxKQkJLyogQmFzZSBhZGRyIGFueXdoZXJlIGluIDMyIEJpdCByYW5nZSAqLworI2RlZmluZSBQQ0lfTUVNMU0JCSgxTDw8MSkJCS8qIEJhc2UgYWRkciBiZWxvdyAxIE1lZ2FCeXRlICovCisjZGVmaW5lIFBDSV9NRU02NEJJVAkoMkw8PDEpCQkvKiBCYXNlIGFkZHIgYW55d2hlcmUgaW4gNjQgQml0IHJhbmdlICovCisjZGVmaW5lIFBDSV9NRU1TUEFDRQlCSVRfMAkJLyogTWVtb3J5IFNwYWNlIEluZGljYXRvciAqLworCisvKglQQ0lfQkFTRV8yTkQJMzIgYml0CTJuZCBCYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUENJX0lPQkFTRQkJMHhmZmZmZmYwMEwJLyogQml0IDMxLi4gODoJSS9PIEJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBQQ0lfSU9TSVpFCQkweDAwMDAwMGZjTAkvKiBCaXQJNy4uIDI6CUkvTyBTaXplIFJlcXVpcmVtZW50cyAqLworCQkJCQkJCQkJLyogQml0CTE6CXJlc2VydmVkICovCisjZGVmaW5lIFBDSV9JT1NQQUNFCQlCSVRfMAkJLyogSS9PIFNwYWNlIEluZGljYXRvciAqLworCisvKglQQ0lfQkFTRV9ST00JMzIgYml0CUV4cGFuc2lvbiBST00gQmFzZSBBZGRyZXNzICovCisjZGVmaW5lIFBDSV9ST01CQVNFX01TSwkweGZmZmUwMDAwTAkvKiBCaXQgMzEuLjE3OglST00gQmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFBDSV9ST01CQVNFX1NJWgkoMHgxY0w8PDE0KQkvKiBCaXQgMTYuLjE0OglUcmVhdCBhcyBCYXNlIG9yIFNpemUgKi8KKyNkZWZpbmUgUENJX1JPTVNJWkUJCSgweDM4TDw8MTEpCS8qIEJpdCAxMy4uMTE6CVJPTSBTaXplIFJlcXVpcmVtZW50cyAqLworCQkJCQkJCQkJLyogQml0IDEwLi4gMToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX1JPTUVOCQlCSVRfMAkJLyogQWRkcmVzcyBEZWNvZGUgZW5hYmxlICovCisKKy8qIERldmljZSBEZXBlbmRlbnQgUmVnaW9uICovCisvKglQQ0lfT1VSX1JFR18xCQkzMiBiaXQJT3VyIFJlZ2lzdGVyIDEgKi8KKwkJCQkJCQkJCS8qIEJpdCAzMS4uMjk6CXJlc2VydmVkICovCisjZGVmaW5lIFBDSV9QSFlfQ09NQQlCSVRfMjgJCS8qIFNldCBQSFkgdG8gQ29tYSBNb2RlIChZVUtPTiBvbmx5KSAqLworI2RlZmluZSBQQ0lfVEVTVF9DQUwJQklUXzI3CQkvKiBUZXN0IFBDSSBidWZmZXIgY2FsaWIuIChZVUtPTiBvbmx5KSAqLworI2RlZmluZSBQQ0lfRU5fQ0FMCQlCSVRfMjYJCS8qIEVuYWJsZSBQQ0kgYnVmZmVyIGNhbGliLiAoWVVLT04gb25seSkgKi8KKyNkZWZpbmUgUENJX1ZJTwkJCUJJVF8yNQkJLyogUENJIEkvTyBWb2x0YWdlLCAwID0gMy4zViwgMSA9IDVWICovCisjZGVmaW5lIFBDSV9ESVNfQk9PVAlCSVRfMjQJCS8qIERpc2FibGUgQk9PVCB2aWEgUk9NICovCisjZGVmaW5lIFBDSV9FTl9JTwkJQklUXzIzCQkvKiBNYXBwaW5nIHRvIEkvTyBzcGFjZSAqLworI2RlZmluZSBQQ0lfRU5fRlBST00JQklUXzIyCQkvKiBFbmFibGUgRkxBU0ggbWFwcGluZyB0byBtZW1vcnkgKi8KKwkJCQkJCQkJCS8qCQkxID0gTWFwIEZsYXNoIHRvIG1lbW9yeSAqLworCQkJCQkJCQkJLyoJCTAgPSBEaXNhYmxlIGFkZHIuIGRlYyAqLworI2RlZmluZSBQQ0lfUEFHRVNJWkUJKDNMPDwyMCkJLyogQml0IDIxLi4yMDoJRkxBU0ggUGFnZSBTaXplCSovCisjZGVmaW5lIFBDSV9QQUdFXzE2CQkoMEw8PDIwKQkvKgkJMTYgayBwYWdlcwkqLworI2RlZmluZSBQQ0lfUEFHRV8zMksJKDFMPDwyMCkJLyoJCTMyIGsgcGFnZXMJKi8KKyNkZWZpbmUgUENJX1BBR0VfNjRLCSgyTDw8MjApCS8qCQk2NCBrIHBhZ2VzCSovCisjZGVmaW5lIFBDSV9QQUdFXzEyOEsJKDNMPDwyMCkJLyoJCTEyOCBrIHBhZ2VzCSovCisJCQkJCQkJCQkvKiBCaXQgMTk6CXJlc2VydmVkCSovCisjZGVmaW5lIFBDSV9QQUdFUkVHCQkoN0w8PDE2KQkvKiBCaXQgMTguLjE2OglQYWdlIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBDSV9OT1RBUgkJQklUXzE1CQkvKiBObyB0dXJuYXJvdW5kIGN5Y2xlICovCisjZGVmaW5lIFBDSV9GT1JDRV9CRQlCSVRfMTQJCS8qIEFzc2VydCBhbGwgQkVzIG9uIE1SICovCisjZGVmaW5lIFBDSV9ESVNfTVJMCQlCSVRfMTMJCS8qIERpc2FibGUgTWVtIFJlYWQgTGluZSAqLworI2RlZmluZSBQQ0lfRElTX01STQkJQklUXzEyCQkvKiBEaXNhYmxlIE1lbSBSZWFkIE11bHRpcGxlICovCisjZGVmaW5lIFBDSV9ESVNfTVdJCQlCSVRfMTEJCS8qIERpc2FibGUgTWVtIFdyaXRlICYgSW52YWxpZGF0ZSAqLworI2RlZmluZSBQQ0lfRElTQ19DTFMJQklUXzEwCQkvKiBEaXNjOiBjYWNoZUxzeiBib3VuZCAqLworI2RlZmluZSBQQ0lfQlVSU1RfRElTCUJJVF85CQkvKiBCdXJzdCBEaXNhYmxlICovCisjZGVmaW5lIFBDSV9ESVNfUENJX0NMSwlCSVRfOAkJLyogRGlzYWJsZSBQQ0kgY2xvY2sgZHJpdmluZyAqLworI2RlZmluZSBQQ0lfU0tFV19EQVMJKDB4Zkw8PDQpCS8qIEJpdAk3Li4gNDoJU2tldyBDdHJsLCBEQVMgRXh0ICovCisjZGVmaW5lIFBDSV9TS0VXX0JBU0UJMHhmTAkJLyogQml0CTMuLiAwOglTa2V3IEN0cmwsIEJhc2UJKi8KKworCisvKglQQ0lfT1VSX1JFR18yCQkzMiBiaXQJT3VyIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgUENJX1ZQRF9XUl9USFIJKDB4ZmZMPDwyNCkJLyogQml0IDMxLi4yNDoJVlBEIFdyaXRlIFRocmVzaG9sZCAqLworI2RlZmluZSBQQ0lfREVWX1NFTAkJKDB4N2ZMPDwxNykJLyogQml0IDIzLi4xNzoJRUVQUk9NIERldmljZSBTZWxlY3QgKi8KKyNkZWZpbmUgUENJX1ZQRF9ST01fU1oJKDdMPDwxNCkJLyogQml0IDE2Li4xNDoJVlBEIFJPTSBTaXplCSovCisJCQkJCQkJCQkvKiBCaXQgMTMuLjEyOglyZXNlcnZlZAkqLworI2RlZmluZSBQQ0lfUEFUQ0hfRElSCSgweGZMPDw4KQkvKiBCaXQgMTEuLiA4OglFeHQgUGF0Y2hlcyBkaXIgMy4uMCAqLworI2RlZmluZSBQQ0lfUEFUQ0hfRElSXzMJQklUXzExCisjZGVmaW5lIFBDSV9QQVRDSF9ESVJfMglCSVRfMTAKKyNkZWZpbmUgUENJX1BBVENIX0RJUl8xCUJJVF85CisjZGVmaW5lIFBDSV9QQVRDSF9ESVJfMAlCSVRfOAorI2RlZmluZSBQQ0lfRVhUX1BBVENIUwkoMHhmTDw8NCkJLyogQml0CTcuLiA0OglFeHRlbmRlZCBQYXRjaGVzIDMuLjAgKi8KKyNkZWZpbmUgUENJX0VYVF9QQVRDSF8zCUJJVF83CisjZGVmaW5lIFBDSV9FWFRfUEFUQ0hfMglCSVRfNgorI2RlZmluZSBQQ0lfRVhUX1BBVENIXzEJQklUXzUKKyNkZWZpbmUgUENJX0VYVF9QQVRDSF8wCUJJVF80CisjZGVmaW5lIFBDSV9FTl9EVU1NWV9SRAlCSVRfMwkJLyogRW5hYmxlIER1bW15IFJlYWQgKi8KKyNkZWZpbmUgUENJX1JFVl9ERVNDCUJJVF8yCQkvKiBSZXZlcnNlIERlc2MuIEJ5dGVzICovCisJCQkJCQkJCQkvKiBCaXQJMToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX1VTRURBVEE2NAlCSVRfMAkJLyogVXNlIDY0Qml0IERhdGEgYnVzIGV4dCAqLworCisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgUmVnaW9uICovCisvKglQQ0lfUE1fQ0FQX1JFRwkJMTYgYml0CVBvd2VyIE1hbmFnZW1lbnQgQ2FwYWJpbGl0aWVzICovCisjZGVmaW5lIFBDSV9QTUVfU1VQX01TSwkoMHgxZjw8MTEpCS8qIEJpdCAxNS4uMTE6CVBNIEV2ZW50IFN1cHBvcnQgTWFzayAqLworI2RlZmluZSBQQ0lfUE1FX0QzQ19TVVAJQklUXzE1UwkJLyogUE1FIGZyb20gRDNjb2xkIFN1cHBvcnQgKGlmIFZhdXgpICovCisjZGVmaW5lIFBDSV9QTUVfRDNIX1NVUAlCSVRfMTRTCQkvKiBQTUUgZnJvbSBEM2hvdCBTdXBwb3J0ICovCisjZGVmaW5lIFBDSV9QTUVfRDJfU1VQCUJJVF8xM1MJCS8qIFBNRSBmcm9tIEQyIFN1cHBvcnQgKi8KKyNkZWZpbmUgUENJX1BNRV9EMV9TVVAJQklUXzEyUwkJLyogUE1FIGZyb20gRDEgU3VwcG9ydCAqLworI2RlZmluZSBQQ0lfUE1FX0QwX1NVUAlCSVRfMTFTCQkvKiBQTUUgZnJvbSBEMCBTdXBwb3J0ICovCisjZGVmaW5lIFBDSV9QTV9EMl9TVVAJQklUXzEwUwkJLyogRDIgU3VwcG9ydCBpbiAzMyBNSHogbW9kZSAqLworI2RlZmluZSBQQ0lfUE1fRDFfU1VQCUJJVF85UwkJLyogRDEgU3VwcG9ydCAqLworCQkJCQkJCQkJLyogQml0CTguLiA2OglyZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfUE1fRFNJCQlCSVRfNVMJCS8qIERldmljZSBTcGVjaWZpYyBJbml0aWFsaXphdGlvbiAqLworI2RlZmluZSBQQ0lfUE1fQVBTCQlCSVRfNFMJCS8qIEF1eGlhbGlhcnkgUG93ZXIgU291cmNlICovCisjZGVmaW5lIFBDSV9QTUVfQ0xPQ0sJQklUXzNTCQkvKiBQTSBFdmVudCBDbG9jayAqLworI2RlZmluZSBQQ0lfUE1fVkVSX01TSwkJNwkJLyogQml0CTIuLiAwOglQTSBQQ0kgU3BlYy4gdmVyc2lvbiAqLworCisvKglQQ0lfUE1fQ1RMX1NUUwkJMTYgYml0CVBvd2VyIE1hbmFnZW1lbnQgQ29udHJvbC9TdGF0dXMgKi8KKyNkZWZpbmUgUENJX1BNRV9TVEFUVVMJQklUXzE1UwkJLyogUE1FIFN0YXR1cyAoWVVLT04gb25seSkgKi8KKyNkZWZpbmUgUENJX1BNX0RBVF9TQ0wJKDM8PDEzKQkJLyogQml0IDE0Li4xMzoJRGF0YSBSZWcuIHNjYWxpbmcgZmFjdG9yICovCisjZGVmaW5lIFBDSV9QTV9EQVRfU0VMCSgweGY8PDkpCS8qIEJpdCAxMi4uIDk6CVBNIGRhdGEgc2VsZWN0b3IgZmllbGQgKi8KKyNkZWZpbmUgUENJX1BNRV9FTgkJQklUXzhTCQkvKiBFbmFibGUgUE1FIyBnZW5lcmF0aW9uIChZVUtPTiBvbmx5KSAqLworCQkJCQkJCQkJLyogQml0CTcuLiAyOglyZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfUE1fU1RBVEVfTVNLCTMJCS8qIEJpdAkxLi4gMDoJUG93ZXIgTWFuYWdlbWVudCBTdGF0ZSAqLworCisjZGVmaW5lIFBDSV9QTV9TVEFURV9EMAkJMAkJLyogRDA6CU9wZXJhdGlvbmFsIChkZWZhdWx0KSAqLworI2RlZmluZSBQQ0lfUE1fU1RBVEVfRDEJCTEJCS8qIEQxOgkoWVVLT04gb25seSkgKi8KKyNkZWZpbmUgUENJX1BNX1NUQVRFX0QyCQkyCQkvKiBEMjoJKFlVS09OIG9ubHkpICovCisjZGVmaW5lIFBDSV9QTV9TVEFURV9EMyAJMwkJLyogRDM6CUhPVCwgUG93ZXIgRG93biBhbmQgUmVzZXQgKi8KKworLyogVlBEIFJlZ2lvbiAqLworLyoJUENJX1ZQRF9BRFJfUkVHCQkxNiBiaXQJVlBEIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX1ZQRF9GTEFHCUJJVF8xNVMJCS8qIHN0YXJ0cyBWUEQgcmQvd3IgY3ljbGUgKi8KKyNkZWZpbmUgUENJX1ZQRF9BRFJfTVNLCTB4N2ZmZkwJCS8qIEJpdCAxNC4uIDA6CVZQRCBhZGRyZXNzIG1hc2sgKi8KKworLyoJQ29udHJvbCBSZWdpc3RlciBGaWxlIChBZGRyZXNzIE1hcCkgKi8KKworLyoKKyAqCUJhbmsgMAorICovCisjZGVmaW5lIEIwX1JBUAkJCTB4MDAwMAkvKiAgOCBiaXQJUmVnaXN0ZXIgQWRkcmVzcyBQb3J0ICovCisJLyogMHgwMDAxIC0gMHgwMDAzOglyZXNlcnZlZCAqLworI2RlZmluZSBCMF9DVFNUCQkJMHgwMDA0CS8qIDE2IGJpdAlDb250cm9sL1N0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBCMF9MRUQJCQkweDAwMDYJLyogIDggQml0CUxFRCByZWdpc3RlciAqLworI2RlZmluZSBCMF9QT1dFUl9DVFJMCTB4MDAwNwkvKiAgOCBCaXQJUG93ZXIgQ29udHJvbCByZWcgKFlVS09OIG9ubHkpICovCisjZGVmaW5lIEIwX0lTUkMJCQkweDAwMDgJLyogMzIgYml0CUludGVycnVwdCBTb3VyY2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQjBfSU1TSwkJCTB4MDAwYwkvKiAzMiBiaXQJSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQjBfSFdFX0lTUkMJCTB4MDAxMAkvKiAzMiBiaXQJSFcgRXJyb3IgSW50ZXJydXB0IFNyYyBSZWcgKi8KKyNkZWZpbmUgQjBfSFdFX0lNU0sJCTB4MDAxNAkvKiAzMiBiaXQJSFcgRXJyb3IgSW50ZXJydXB0IE1hc2sgUmVnICovCisjZGVmaW5lIEIwX1NQX0lTUkMJCTB4MDAxOAkvKiAzMiBiaXQJU3BlY2lhbCBJbnRlcnJ1cHQgU291cmNlIFJlZyAqLworCS8qIDB4MDAxYzoJCXJlc2VydmVkICovCisKKy8qIEIwIFhNQUMgMSByZWdpc3RlcnMgKEdFTkVTSVMgb25seSkgKi8KKyNkZWZpbmUgQjBfWE0xX0lNU0sJCTB4MDAyMAkvKiAxNiBiaXQgci93CVhNQUMgMSBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciovCisJLyogMHgwMDIyIC0gMHgwMDI3OglyZXNlcnZlZCAqLworI2RlZmluZSBCMF9YTTFfSVNSQwkJMHgwMDI4CS8qIDE2IGJpdCBybwlYTUFDIDEgSW50ZXJydXB0IFN0YXR1cyBSZWcgKi8KKwkvKiAweDAwMmEgLSAweDAwMmY6CXJlc2VydmVkICovCisjZGVmaW5lIEIwX1hNMV9QSFlfQUREUiAweDAwMzAJLyogMTYgYml0IHIvdwlYTUFDIDEgUEhZIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwkvKiAweDAwMzIgLSAweDAwMzM6CXJlc2VydmVkICovCisjZGVmaW5lIEIwX1hNMV9QSFlfREFUQSAweDAwMzQJLyogMTYgYml0IHIvdwlYTUFDIDEgUEhZIERhdGEgUmVnaXN0ZXIgKi8KKwkvKiAweDAwMzYgLSAweDAwM2Y6CXJlc2VydmVkICovCisKKy8qIEIwIFhNQUMgMiByZWdpc3RlcnMgKEdFTkVTSVMgb25seSkgKi8KKyNkZWZpbmUgQjBfWE0yX0lNU0sJCTB4MDA0MAkvKiAxNiBiaXQgci93CVhNQUMgMiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciovCisJLyogMHgwMDQyIC0gMHgwMDQ3OglyZXNlcnZlZCAqLworI2RlZmluZSBCMF9YTTJfSVNSQwkJMHgwMDQ4CS8qIDE2IGJpdCBybwlYTUFDIDIgSW50ZXJydXB0IFN0YXR1cyBSZWcgKi8KKwkvKiAweDAwNGEgLSAweDAwNGY6CXJlc2VydmVkICovCisjZGVmaW5lIEIwX1hNMl9QSFlfQUREUiAweDAwNTAJLyogMTYgYml0IHIvdwlYTUFDIDIgUEhZIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwkvKiAweDAwNTIgLSAweDAwNTM6CXJlc2VydmVkICovCisjZGVmaW5lIEIwX1hNMl9QSFlfREFUQSAweDAwNTQJLyogMTYgYml0IHIvdwlYTUFDIDIgUEhZIERhdGEgUmVnaXN0ZXIgKi8KKwkvKiAweDAwNTYgLSAweDAwNWY6CXJlc2VydmVkICovCisKKy8qIEJNVSBDb250cm9sIFN0YXR1cyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQjBfUjFfQ1NSCQkweDAwNjAJLyogMzIgYml0CUJNVSBDdHJsL1N0YXQgUnggUXVldWUgMSAqLworI2RlZmluZSBCMF9SMl9DU1IJCTB4MDA2NAkvKiAzMiBiaXQJQk1VIEN0cmwvU3RhdCBSeCBRdWV1ZSAyICovCisjZGVmaW5lIEIwX1hTMV9DU1IJCTB4MDA2OAkvKiAzMiBiaXQJQk1VIEN0cmwvU3RhdCBTeW5jIFR4IFF1ZXVlIDEgKi8KKyNkZWZpbmUgQjBfWEExX0NTUgkJMHgwMDZjCS8qIDMyIGJpdAlCTVUgQ3RybC9TdGF0IEFzeW5jIFR4IFF1ZXVlIDEqLworI2RlZmluZSBCMF9YUzJfQ1NSCQkweDAwNzAJLyogMzIgYml0CUJNVSBDdHJsL1N0YXQgU3luYyBUeCBRdWV1ZSAyICovCisjZGVmaW5lIEIwX1hBMl9DU1IJCTB4MDA3NAkvKiAzMiBiaXQJQk1VIEN0cmwvU3RhdCBBc3luYyBUeCBRdWV1ZSAyKi8KKwkvKiAweDAwNzggLSAweDAwN2Y6CXJlc2VydmVkICovCisKKy8qCisgKglCYW5rIDEKKyAqCS0gY29tcGxldGVseSBlbXB0eSAodGhpcyBpcyB0aGUgUkFQIEJsb2NrIHdpbmRvdykKKyAqCU5vdGU6IGlmIFJBUCA9IDEgdGhpcyBwYWdlIGlzIHJlc2VydmVkCisgKi8KKworLyoKKyAqCUJhbmsgMgorICovCisvKiBOQSByZWcgPSA0OCBiaXQgTmV0d29yayBBZGRyZXNzIFJlZ2lzdGVyLCAzeDE2IG9yIDh4OCBiaXQgcmVhZGFibGUgKi8KKyNkZWZpbmUgQjJfTUFDXzEJCTB4MDEwMAkvKiBOQSByZWcJIE1BQyBBZGRyZXNzIDEgKi8KKwkvKiAweDAxMDYgLSAweDAxMDc6CXJlc2VydmVkICovCisjZGVmaW5lIEIyX01BQ18yCQkweDAxMDgJLyogTkEgcmVnCSBNQUMgQWRkcmVzcyAyICovCisJLyogMHgwMTBlIC0gMHgwMTBmOglyZXNlcnZlZCAqLworI2RlZmluZSBCMl9NQUNfMwkJMHgwMTEwCS8qIE5BIHJlZwkgTUFDIEFkZHJlc3MgMyAqLworCS8qIDB4MDExNiAtIDB4MDExNzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQjJfQ09OTl9UWVAJCTB4MDExOAkvKiAgOCBiaXQJQ29ubmVjdG9yIHR5cGUgKi8KKyNkZWZpbmUgQjJfUE1EX1RZUAkJMHgwMTE5CS8qICA4IGJpdAlQTUQgdHlwZSAqLworI2RlZmluZSBCMl9NQUNfQ0ZHCQkweDAxMWEJLyogIDggYml0CU1BQyBDb25maWd1cmF0aW9uIC8gQ2hpcCBSZXZpc2lvbiAqLworI2RlZmluZSBCMl9DSElQX0lECQkweDAxMWIJLyogIDggYml0IAlDaGlwIElkZW50aWZpY2F0aW9uIE51bWJlciAqLworCS8qIEVwcm9tIHJlZ2lzdGVycyBhcmUgY3VycmVudGx5IG9mIG5vIHVzZSAqLworI2RlZmluZSBCMl9FXzAJCQkweDAxMWMJLyogIDggYml0CUVQUk9NIEJ5dGUgMCAoZXh0LiBTUkFNIHNpemUgKi8KKyNkZWZpbmUgQjJfRV8xCQkJMHgwMTFkCS8qICA4IGJpdAlFUFJPTSBCeXRlIDEgKFBIWSB0eXBlKSAqLworI2RlZmluZSBCMl9FXzIJCQkweDAxMWUJLyogIDggYml0CUVQUk9NIEJ5dGUgMiAqLworI2RlZmluZSBCMl9FXzMJCQkweDAxMWYJLyogIDggYml0CUVQUk9NIEJ5dGUgMyAqLworI2RlZmluZSBCMl9GQVIJCQkweDAxMjAJLyogMzIgYml0CUZsYXNoLVByb20gQWRkciBSZWcvQ250ICovCisjZGVmaW5lIEIyX0ZEUAkJCTB4MDEyNAkvKiAgOCBiaXQJRmxhc2gtUHJvbSBEYXRhIFBvcnQgKi8KKwkvKiAweDAxMjUgLSAweDAxMjc6CXJlc2VydmVkICovCisjZGVmaW5lIEIyX0xEX0NUUkwJCTB4MDEyOAkvKiAgOCBiaXQJRVBST00gbG9hZGVyIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQjJfTERfVEVTVAkJMHgwMTI5CS8qICA4IGJpdAlFUFJPTSBsb2FkZXIgdGVzdCByZWdpc3RlciAqLworCS8qIDB4MDEyYSAtIDB4MDEyZjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQjJfVElfSU5JCQkweDAxMzAJLyogMzIgYml0CVRpbWVyIEluaXQgVmFsdWUgKi8KKyNkZWZpbmUgQjJfVElfVkFMCQkweDAxMzQJLyogMzIgYml0CVRpbWVyIFZhbHVlICovCisjZGVmaW5lIEIyX1RJX0NUUkwJCTB4MDEzOAkvKiAgOCBiaXQJVGltZXIgQ29udHJvbCAqLworI2RlZmluZSBCMl9USV9URVNUCQkweDAxMzkJLyogIDggQml0CVRpbWVyIFRlc3QgKi8KKwkvKiAweDAxM2EgLSAweDAxM2Y6CXJlc2VydmVkICovCisjZGVmaW5lIEIyX0lSUU1fSU5JCQkweDAxNDAJLyogMzIgYml0CUlSUSBNb2RlcmF0aW9uIFRpbWVyIEluaXQgUmVnLiovCisjZGVmaW5lIEIyX0lSUU1fVkFMCQkweDAxNDQJLyogMzIgYml0CUlSUSBNb2RlcmF0aW9uIFRpbWVyIFZhbHVlICovCisjZGVmaW5lIEIyX0lSUU1fQ1RSTAkweDAxNDgJLyogIDggYml0CUlSUSBNb2RlcmF0aW9uIFRpbWVyIENvbnRyb2wgKi8KKyNkZWZpbmUgQjJfSVJRTV9URVNUCTB4MDE0OQkvKiAgOCBiaXQJSVJRIE1vZGVyYXRpb24gVGltZXIgVGVzdCAqLworI2RlZmluZSBCMl9JUlFNX01TSyAJMHgwMTRjCS8qIDMyIGJpdAlJUlEgTW9kZXJhdGlvbiBNYXNrICovCisjZGVmaW5lIEIyX0lSUU1fSFdFX01TSyAweDAxNTAJLyogMzIgYml0CUlSUSBNb2RlcmF0aW9uIEhXIEVycm9yIE1hc2sgKi8KKwkvKiAweDAxNTQgLSAweDAxNTc6CXJlc2VydmVkICovCisjZGVmaW5lIEIyX1RTVF9DVFJMMQkweDAxNTgJLyogIDggYml0CVRlc3QgQ29udHJvbCBSZWdpc3RlciAxICovCisjZGVmaW5lIEIyX1RTVF9DVFJMMgkweDAxNTkJLyogIDggYml0CVRlc3QgQ29udHJvbCBSZWdpc3RlciAyICovCisJLyogMHgwMTVhIC0gMHgwMTViOglyZXNlcnZlZCAqLworI2RlZmluZSBCMl9HUF9JTwkJMHgwMTVjCS8qIDMyIGJpdAlHZW5lcmFsIFB1cnBvc2UgSS9PIFJlZ2lzdGVyICovCisjZGVmaW5lIEIyX0kyQ19DVFJMCQkweDAxNjAJLyogMzIgYml0CUkyQyBIVyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEIyX0kyQ19EQVRBCQkweDAxNjQJLyogMzIgYml0CUkyQyBIVyBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lIEIyX0kyQ19JUlEJCTB4MDE2OAkvKiAzMiBiaXQJSTJDIEhXIElSUSBSZWdpc3RlciAqLworI2RlZmluZSBCMl9JMkNfU1cJCTB4MDE2YwkvKiAzMiBiaXQJSTJDIFNXIFBvcnQgUmVnaXN0ZXIgKi8KKworLyogQmxpbmsgU291cmNlIENvdW50ZXIgKEdFTkVTSVMgb25seSkgKi8KKyNkZWZpbmUgQjJfQlNDX0lOSQkJMHgwMTcwCS8qIDMyIGJpdAlCbGluayBTb3VyY2UgQ291bnRlciBJbml0IFZhbCAqLworI2RlZmluZSBCMl9CU0NfVkFMCQkweDAxNzQJLyogMzIgYml0CUJsaW5rIFNvdXJjZSBDb3VudGVyIFZhbHVlICovCisjZGVmaW5lIEIyX0JTQ19DVFJMCQkweDAxNzgJLyogIDggYml0CUJsaW5rIFNvdXJjZSBDb3VudGVyIENvbnRyb2wgKi8KKyNkZWZpbmUgQjJfQlNDX1NUQVQJCTB4MDE3OQkvKiAgOCBiaXQJQmxpbmsgU291cmNlIENvdW50ZXIgU3RhdHVzICovCisjZGVmaW5lIEIyX0JTQ19UU1QJCTB4MDE3YQkvKiAxNiBiaXQJQmxpbmsgU291cmNlIENvdW50ZXIgVGVzdCBSZWcgKi8KKwkvKiAweDAxN2MgLSAweDAxN2Y6CXJlc2VydmVkICovCisKKy8qCisgKglCYW5rIDMKKyAqLworLyogUkFNIFJhbmRvbSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQjNfUkFNX0FERFIJCTB4MDE4MAkvKiAzMiBiaXQJUkFNIEFkZHJlc3MsIHRvIHJlYWQgb3Igd3JpdGUgKi8KKyNkZWZpbmUgQjNfUkFNX0RBVEFfTE8JMHgwMTg0CS8qIDMyIGJpdAlSQU0gRGF0YSBXb3JkIChsb3cgZFdvcmQpICovCisjZGVmaW5lIEIzX1JBTV9EQVRBX0hJCTB4MDE4OAkvKiAzMiBiaXQJUkFNIERhdGEgV29yZCAoaGlnaCBkV29yZCkgKi8KKwkvKiAweDAxOGMgLSAweDAxOGY6CXJlc2VydmVkICovCisKKy8qIFJBTSBJbnRlcmZhY2UgUmVnaXN0ZXJzICovCisvKgorICogVGhlIEhXLVNwZWMuIGNhbGxzIHRoaXMgcmVnaXN0ZXJzIFRpbWVvdXQgVmFsdWUgMC4uMTEuIEJ1dCB0aGlzIG5hbWVzIGFyZQorICogbm90IHVzYWJsZSBpbiBTVy4gUGxlYXNlIG5vdGljZSB0aGVzZSBhcmUgTk9UIHJlYWwgdGltZW91dHMsIHRoZXNlIGFyZQorICogdGhlIG51bWJlciBvZiBxV29yZHMgdHJhbnNmZXJyZWQgY29udGludW91c2x5LgorICovCisjZGVmaW5lIEIzX1JJX1dUT19SMQkweDAxOTAJLyogIDggYml0CVdSIFRpbWVvdXQgUXVldWUgUjEJCShUTzApICovCisjZGVmaW5lIEIzX1JJX1dUT19YQTEJMHgwMTkxCS8qICA4IGJpdAlXUiBUaW1lb3V0IFF1ZXVlIFhBMQkoVE8xKSAqLworI2RlZmluZSBCM19SSV9XVE9fWFMxCTB4MDE5MgkvKiAgOCBiaXQJV1IgVGltZW91dCBRdWV1ZSBYUzEJKFRPMikgKi8KKyNkZWZpbmUgQjNfUklfUlRPX1IxCTB4MDE5MwkvKiAgOCBiaXQJUkQgVGltZW91dCBRdWV1ZSBSMQkJKFRPMykgKi8KKyNkZWZpbmUgQjNfUklfUlRPX1hBMQkweDAxOTQJLyogIDggYml0CVJEIFRpbWVvdXQgUXVldWUgWEExCShUTzQpICovCisjZGVmaW5lIEIzX1JJX1JUT19YUzEJMHgwMTk1CS8qICA4IGJpdAlSRCBUaW1lb3V0IFF1ZXVlIFhTMQkoVE81KSAqLworI2RlZmluZSBCM19SSV9XVE9fUjIJMHgwMTk2CS8qICA4IGJpdAlXUiBUaW1lb3V0IFF1ZXVlIFIyCQkoVE82KSAqLworI2RlZmluZSBCM19SSV9XVE9fWEEyCTB4MDE5NwkvKiAgOCBiaXQJV1IgVGltZW91dCBRdWV1ZSBYQTIJKFRPNykgKi8KKyNkZWZpbmUgQjNfUklfV1RPX1hTMgkweDAxOTgJLyogIDggYml0CVdSIFRpbWVvdXQgUXVldWUgWFMyCShUTzgpICovCisjZGVmaW5lIEIzX1JJX1JUT19SMgkweDAxOTkJLyogIDggYml0CVJEIFRpbWVvdXQgUXVldWUgUjIJCShUTzkpICovCisjZGVmaW5lIEIzX1JJX1JUT19YQTIJMHgwMTlhCS8qICA4IGJpdAlSRCBUaW1lb3V0IFF1ZXVlIFhBMgkoVE8xMCkqLworI2RlZmluZSBCM19SSV9SVE9fWFMyCTB4MDE5YgkvKiAgOCBiaXQJUkQgVGltZW91dCBRdWV1ZSBYUzIJKFRPMTEpKi8KKyNkZWZpbmUgQjNfUklfVE9fVkFMCTB4MDE5YwkvKiAgOCBiaXQJQ3VycmVudCBUaW1lb3V0IENvdW50IFZhbCAqLworCS8qIDB4MDE5ZCAtIDB4MDE5ZjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQjNfUklfQ1RSTAkJMHgwMWEwCS8qIDE2IGJpdAlSQU0gSW50ZXJmYWNlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQjNfUklfVEVTVAkJMHgwMWEyCS8qICA4IGJpdAlSQU0gSW50ZXJmYWNlIFRlc3QgUmVnaXN0ZXIgKi8KKwkvKiAweDAxYTMgLSAweDAxYWY6CXJlc2VydmVkICovCisKKy8qIE1BQyBBcmJpdGVyIFJlZ2lzdGVycyAoR0VORVNJUyBvbmx5KSAqLworLyogdGhlc2UgYXJlIHRoZSBuby4gb2YgcVdvcmQgdHJhbnNmZXJyZWQgY29udGludW91c2x5IGFuZCBOT1QgcmVhbCB0aW1lb3V0cyAqLworI2RlZmluZSBCM19NQV9UT0lOSV9SWDEJMHgwMWIwCS8qICA4IGJpdAlUaW1lb3V0IEluaXQgVmFsIFJ4IFBhdGggTUFDIDEgKi8KKyNkZWZpbmUgQjNfTUFfVE9JTklfUlgyCTB4MDFiMQkvKiAgOCBiaXQJVGltZW91dCBJbml0IFZhbCBSeCBQYXRoIE1BQyAyICovCisjZGVmaW5lIEIzX01BX1RPSU5JX1RYMQkweDAxYjIJLyogIDggYml0CVRpbWVvdXQgSW5pdCBWYWwgVHggUGF0aCBNQUMgMSAqLworI2RlZmluZSBCM19NQV9UT0lOSV9UWDIJMHgwMWIzCS8qICA4IGJpdAlUaW1lb3V0IEluaXQgVmFsIFR4IFBhdGggTUFDIDIgKi8KKyNkZWZpbmUgQjNfTUFfVE9WQUxfUlgxCTB4MDFiNAkvKiAgOCBiaXQJVGltZW91dCBWYWx1ZSBSeCBQYXRoIE1BQyAxICovCisjZGVmaW5lIEIzX01BX1RPVkFMX1JYMgkweDAxYjUJLyogIDggYml0CVRpbWVvdXQgVmFsdWUgUnggUGF0aCBNQUMgMSAqLworI2RlZmluZSBCM19NQV9UT1ZBTF9UWDEJMHgwMWI2CS8qICA4IGJpdAlUaW1lb3V0IFZhbHVlIFR4IFBhdGggTUFDIDIgKi8KKyNkZWZpbmUgQjNfTUFfVE9WQUxfVFgyCTB4MDFiNwkvKiAgOCBiaXQJVGltZW91dCBWYWx1ZSBUeCBQYXRoIE1BQyAyICovCisjZGVmaW5lIEIzX01BX1RPX0NUUkwJMHgwMWI4CS8qIDE2IGJpdAlNQUMgQXJiaXRlciBUaW1lb3V0IEN0cmwgUmVnICovCisjZGVmaW5lIEIzX01BX1RPX1RFU1QJMHgwMWJhCS8qIDE2IGJpdAlNQUMgQXJiaXRlciBUaW1lb3V0IFRlc3QgUmVnICovCisJLyogMHgwMWJjIC0gMHgwMWJmOglyZXNlcnZlZCAqLworI2RlZmluZSBCM19NQV9SQ0lOSV9SWDEJMHgwMWMwCS8qICA4IGJpdAlSZWNvdmVyeSBJbml0IFZhbCBSeCBQYXRoIE1BQyAxICovCisjZGVmaW5lIEIzX01BX1JDSU5JX1JYMgkweDAxYzEJLyogIDggYml0CVJlY292ZXJ5IEluaXQgVmFsIFJ4IFBhdGggTUFDIDIgKi8KKyNkZWZpbmUgQjNfTUFfUkNJTklfVFgxCTB4MDFjMgkvKiAgOCBiaXQJUmVjb3ZlcnkgSW5pdCBWYWwgVHggUGF0aCBNQUMgMSAqLworI2RlZmluZSBCM19NQV9SQ0lOSV9UWDIJMHgwMWMzCS8qICA4IGJpdAlSZWNvdmVyeSBJbml0IFZhbCBUeCBQYXRoIE1BQyAyICovCisjZGVmaW5lIEIzX01BX1JDVkFMX1JYMQkweDAxYzQJLyogIDggYml0CVJlY292ZXJ5IFZhbHVlIFJ4IFBhdGggTUFDIDEgKi8KKyNkZWZpbmUgQjNfTUFfUkNWQUxfUlgyCTB4MDFjNQkvKiAgOCBiaXQJUmVjb3ZlcnkgVmFsdWUgUnggUGF0aCBNQUMgMSAqLworI2RlZmluZSBCM19NQV9SQ1ZBTF9UWDEJMHgwMWM2CS8qICA4IGJpdAlSZWNvdmVyeSBWYWx1ZSBUeCBQYXRoIE1BQyAyICovCisjZGVmaW5lIEIzX01BX1JDVkFMX1RYMgkweDAxYzcJLyogIDggYml0CVJlY292ZXJ5IFZhbHVlIFR4IFBhdGggTUFDIDIgKi8KKyNkZWZpbmUgQjNfTUFfUkNfQ1RSTAkweDAxYzgJLyogMTYgYml0CU1BQyBBcmJpdGVyIFJlY292ZXJ5IEN0cmwgUmVnICovCisjZGVmaW5lIEIzX01BX1JDX1RFU1QJMHgwMWNhCS8qIDE2IGJpdAlNQUMgQXJiaXRlciBSZWNvdmVyeSBUZXN0IFJlZyAqLworCS8qIDB4MDFjYyAtIDB4MDFjZjoJcmVzZXJ2ZWQgKi8KKworLyogUGFja2V0IEFyYml0ZXIgUmVnaXN0ZXJzIChHRU5FU0lTIG9ubHkpICovCisvKiB0aGVzZSBhcmUgcmVhbCB0aW1lb3V0cyAqLworI2RlZmluZSBCM19QQV9UT0lOSV9SWDEJMHgwMWQwCS8qIDE2IGJpdAlUaW1lb3V0IEluaXQgVmFsIFJ4IFBhdGggTUFDIDEgKi8KKwkvKiAweDAxZDIgLSAweDAxZDM6CXJlc2VydmVkICovCisjZGVmaW5lIEIzX1BBX1RPSU5JX1JYMgkweDAxZDQJLyogMTYgYml0CVRpbWVvdXQgSW5pdCBWYWwgUnggUGF0aCBNQUMgMiAqLworCS8qIDB4MDFkNiAtIDB4MDFkNzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQjNfUEFfVE9JTklfVFgxCTB4MDFkOAkvKiAxNiBiaXQJVGltZW91dCBJbml0IFZhbCBUeCBQYXRoIE1BQyAxICovCisJLyogMHgwMWRhIC0gMHgwMWRiOglyZXNlcnZlZCAqLworI2RlZmluZSBCM19QQV9UT0lOSV9UWDIJMHgwMWRjCS8qIDE2IGJpdAlUaW1lb3V0IEluaXQgVmFsIFR4IFBhdGggTUFDIDIgKi8KKwkvKiAweDAxZGUgLSAweDAxZGY6CXJlc2VydmVkICovCisjZGVmaW5lIEIzX1BBX1RPVkFMX1JYMQkweDAxZTAJLyogMTYgYml0CVRpbWVvdXQgVmFsIFJ4IFBhdGggTUFDIDEgKi8KKwkvKiAweDAxZTIgLSAweDAxZTM6CXJlc2VydmVkICovCisjZGVmaW5lIEIzX1BBX1RPVkFMX1JYMgkweDAxZTQJLyogMTYgYml0CVRpbWVvdXQgVmFsIFJ4IFBhdGggTUFDIDIgKi8KKwkvKiAweDAxZTYgLSAweDAxZTc6CXJlc2VydmVkICovCisjZGVmaW5lIEIzX1BBX1RPVkFMX1RYMQkweDAxZTgJLyogMTYgYml0CVRpbWVvdXQgVmFsIFR4IFBhdGggTUFDIDEgKi8KKwkvKiAweDAxZWEgLSAweDAxZWI6CXJlc2VydmVkICovCisjZGVmaW5lIEIzX1BBX1RPVkFMX1RYMgkweDAxZWMJLyogMTYgYml0CVRpbWVvdXQgVmFsIFR4IFBhdGggTUFDIDIgKi8KKwkvKiAweDAxZWUgLSAweDAxZWY6CXJlc2VydmVkICovCisjZGVmaW5lIEIzX1BBX0NUUkwJMHgwMWYwCS8qIDE2IGJpdAlQYWNrZXQgQXJiaXRlciBDdHJsIFJlZ2lzdGVyICovCisjZGVmaW5lIEIzX1BBX1RFU1QJMHgwMWYyCS8qIDE2IGJpdAlQYWNrZXQgQXJiaXRlciBUZXN0IFJlZ2lzdGVyICovCisJLyogMHgwMWY0IC0gMHgwMWZmOglyZXNlcnZlZCAqLworCisvKgorICoJQmFuayA0IC0gNQorICovCisvKiBUcmFuc21pdCBBcmJpdGVyIFJlZ2lzdGVycyBNQUMgMSBhbmQgMiwgdXNlIE1SX0FERFIoKSB0byBhY2Nlc3MgKi8KKyNkZWZpbmUgVFhBX0lUSV9JTkkJCTB4MDIwMAkvKiAzMiBiaXQJVHggQXJiIEludGVydmFsIFRpbWVyIEluaXQgVmFsKi8KKyNkZWZpbmUgVFhBX0lUSV9WQUwJCTB4MDIwNAkvKiAzMiBiaXQJVHggQXJiIEludGVydmFsIFRpbWVyIFZhbHVlICovCisjZGVmaW5lIFRYQV9MSU1fSU5JCQkweDAyMDgJLyogMzIgYml0CVR4IEFyYiBMaW1pdCBDb3VudGVyIEluaXQgVmFsICovCisjZGVmaW5lIFRYQV9MSU1fVkFMCQkweDAyMGMJLyogMzIgYml0CVR4IEFyYiBMaW1pdCBDb3VudGVyIFZhbHVlICovCisjZGVmaW5lIFRYQV9DVFJMCQkweDAyMTAJLyogIDggYml0CVR4IEFyYml0ZXIgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBUWEFfVEVTVAkJMHgwMjExCS8qICA4IGJpdAlUeCBBcmJpdGVyIFRlc3QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVFhBX1NUQVQJCTB4MDIxMgkvKiAgOCBiaXQJVHggQXJiaXRlciBTdGF0dXMgUmVnaXN0ZXIgKi8KKwkvKiAweDAyMTMgLSAweDAyN2Y6CXJlc2VydmVkICovCisJLyogMHgwMjgwIC0gMHgwMjkyOglNQUMgMiAqLworCS8qIDB4MDIxMyAtIDB4MDI3ZjoJcmVzZXJ2ZWQgKi8KKworLyoKKyAqCUJhbmsgNgorICovCisvKiBFeHRlcm5hbCByZWdpc3RlcnMgKEdFTkVTSVMgb25seSkgKi8KKyNkZWZpbmUgQjZfRVhUX1JFRwkJMHgwMzAwCisKKy8qCisgKglCYW5rIDcKKyAqLworLyogVGhpcyBpcyBhIGNvcHkgb2YgdGhlIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgZmlsZSAobG93ZXIgaGFsZikgKi8KKyNkZWZpbmUgQjdfQ0ZHX1NQQwkJMHgwMzgwCisKKy8qCisgKglCYW5rIDggLSAxNQorICovCisvKiBSZWNlaXZlIGFuZCBUcmFuc21pdCBRdWV1ZSBSZWdpc3RlcnMsIHVzZSBRX0FERFIoKSB0byBhY2Nlc3MgKi8KKyNkZWZpbmUgQjhfUV9SRUdTCQkweDA0MDAKKworLyogUXVldWUgUmVnaXN0ZXIgT2Zmc2V0cywgdXNlIFFfQUREUigpIHRvIGFjY2VzcyAqLworI2RlZmluZSBRX0QJCTB4MDAJLyogOCozMgliaXQJQ3VycmVudCBEZXNjcmlwdG9yICovCisjZGVmaW5lIFFfREFfTAkweDIwCS8qIDMyIGJpdAlDdXJyZW50IERlc2NyaXB0b3IgQWRkcmVzcyBMb3cgZFdvcmQgKi8KKyNkZWZpbmUgUV9EQV9ICTB4MjQJLyogMzIgYml0CUN1cnJlbnQgRGVzY3JpcHRvciBBZGRyZXNzIEhpZ2ggZFdvcmQgKi8KKyNkZWZpbmUgUV9BQ19MCTB4MjgJLyogMzIgYml0CUN1cnJlbnQgQWRkcmVzcyBDb3VudGVyIExvdyBkV29yZCAqLworI2RlZmluZSBRX0FDX0gJMHgyYwkvKiAzMiBiaXQJQ3VycmVudCBBZGRyZXNzIENvdW50ZXIgSGlnaCBkV29yZCAqLworI2RlZmluZSBRX0JDCTB4MzAJLyogMzIgYml0CUN1cnJlbnQgQnl0ZSBDb3VudGVyICovCisjZGVmaW5lIFFfQ1NSCTB4MzQJLyogMzIgYml0CUJNVSBDb250cm9sL1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBRX0YJCTB4MzgJLyogMzIgYml0CUZsYWcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUV9UMQkweDNjCS8qIDMyIGJpdAlUZXN0IFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgUV9UMV9UUgkweDNjCS8qICA4IGJpdAlUZXN0IFJlZ2lzdGVyIDEgVHJhbnNmZXIgU00gKi8KKyNkZWZpbmUgUV9UMV9XUgkweDNkCS8qICA4IGJpdAlUZXN0IFJlZ2lzdGVyIDEgV3JpdGUgRGVzY3JpcHRvciBTTSAqLworI2RlZmluZSBRX1QxX1JECTB4M2UJLyogIDggYml0CVRlc3QgUmVnaXN0ZXIgMSBSZWFkIERlc2NyaXB0b3IgU00gKi8KKyNkZWZpbmUgUV9UMV9TVgkweDNmCS8qICA4IGJpdAlUZXN0IFJlZ2lzdGVyIDEgU3VwZXJ2aXNvciBTTSAqLworI2RlZmluZSBRX1QyCTB4NDAJLyogMzIgYml0CVRlc3QgUmVnaXN0ZXIgMgkqLworI2RlZmluZSBRX1QzCTB4NDQJLyogMzIgYml0CVRlc3QgUmVnaXN0ZXIgMwkqLworCS8qIDB4NDggLSAweDdmOglyZXNlcnZlZCAqLworCisvKgorICoJQmFuayAxNiAtIDIzCisgKi8KKy8qIFJBTSBCdWZmZXIgUmVnaXN0ZXJzICovCisjZGVmaW5lIEIxNl9SQU1fUkVHUwkweDA4MDAKKworLyogUkFNIEJ1ZmZlciBSZWdpc3RlciBPZmZzZXRzLCB1c2UgUkJfQUREUigpIHRvIGFjY2VzcyAqLworI2RlZmluZSBSQl9TVEFSVAkJMHgwMAkvKiAzMiBiaXQJUkFNIEJ1ZmZlciBTdGFydCBBZGRyZXNzICovCisjZGVmaW5lIFJCX0VORAkJCTB4MDQJLyogMzIgYml0CVJBTSBCdWZmZXIgRW5kIEFkZHJlc3MgKi8KKyNkZWZpbmUgUkJfV1AJCQkweDA4CS8qIDMyIGJpdAlSQU0gQnVmZmVyIFdyaXRlIFBvaW50ZXIgKi8KKyNkZWZpbmUgUkJfUlAJCQkweDBjCS8qIDMyIGJpdAlSQU0gQnVmZmVyIFJlYWQgUG9pbnRlciAqLworI2RlZmluZSBSQl9SWF9VVFBQCQkweDEwCS8qIDMyIGJpdAlSeCBVcHBlciBUaHJlc2hvbGQsIFBhdXNlIFBhY2sgKi8KKyNkZWZpbmUgUkJfUlhfTFRQUAkJMHgxNAkvKiAzMiBiaXQJUnggTG93ZXIgVGhyZXNob2xkLCBQYXVzZSBQYWNrICovCisjZGVmaW5lIFJCX1JYX1VUSFAJCTB4MTgJLyogMzIgYml0CVJ4IFVwcGVyIFRocmVzaG9sZCwgSGlnaCBQcmlvICovCisjZGVmaW5lIFJCX1JYX0xUSFAJCTB4MWMJLyogMzIgYml0CVJ4IExvd2VyIFRocmVzaG9sZCwgSGlnaCBQcmlvICovCisJLyogMHgxMCAtIDB4MWY6CXJlc2VydmVkIGF0IFR4IFJBTSBCdWZmZXIgUmVnaXN0ZXJzICovCisjZGVmaW5lIFJCX1BDCQkJMHgyMAkvKiAzMiBiaXQJUkFNIEJ1ZmZlciBQYWNrZXQgQ291bnRlciAqLworI2RlZmluZSBSQl9MRVYJCQkweDI0CS8qIDMyIGJpdAlSQU0gQnVmZmVyIExldmVsIFJlZ2lzdGVyICovCisjZGVmaW5lIFJCX0NUUkwJCQkweDI4CS8qICA4IGJpdAlSQU0gQnVmZmVyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkJfVFNUMQkJCTB4MjkJLyogIDggYml0CVJBTSBCdWZmZXIgVGVzdCBSZWdpc3RlciAxICovCisjZGVmaW5lIFJCX1RTVDIJCQkweDJBCS8qICA4IGJpdAlSQU0gQnVmZmVyIFRlc3QgUmVnaXN0ZXIgMiAqLworCS8qIDB4MmMgLSAweDdmOglyZXNlcnZlZCAqLworCisvKgorICoJQmFuayAyNAorICovCisvKgorICogUmVjZWl2ZSBNQUMgRklGTywgUmVjZWl2ZSBMRUQsIGFuZCBMaW5rX1N5bmMgcmVncyAoR0VORVNJUyBvbmx5KQorICogdXNlIE1SX0FERFIoKSB0byBhY2Nlc3MKKyAqLworI2RlZmluZSBSWF9NRkZfRUEJCTB4MGMwMAkvKiAzMiBiaXQJUmVjZWl2ZSBNQUMgRklGTyBFbmQgQWRkcmVzcyAqLworI2RlZmluZSBSWF9NRkZfV1AJCTB4MGMwNAkvKiAzMiBiaXQgCVJlY2VpdmUgTUFDIEZJRk8gV3JpdGUgUG9pbnRlciAqLworCS8qIDB4MGMwOCAtIDB4MGMwYjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUlhfTUZGX1JQCQkweDBjMGMJLyogMzIgYml0CVJlY2VpdmUgTUFDIEZJRk8gUmVhZCBQb2ludGVyICovCisjZGVmaW5lIFJYX01GRl9QQwkJMHgwYzEwCS8qIDMyIGJpdAlSZWNlaXZlIE1BQyBGSUZPIFBhY2tldCBDbnQgKi8KKyNkZWZpbmUgUlhfTUZGX0xFVgkJMHgwYzE0CS8qIDMyIGJpdAlSZWNlaXZlIE1BQyBGSUZPIExldmVsICovCisjZGVmaW5lIFJYX01GRl9DVFJMMQkweDBjMTgJLyogMTYgYml0CVJlY2VpdmUgTUFDIEZJRk8gQ29udHJvbCBSZWcgMSovCisjZGVmaW5lIFJYX01GRl9TVEFUX1RPCTB4MGMxYQkvKiAgOCBiaXQJUmVjZWl2ZSBNQUMgU3RhdHVzIFRpbWVvdXQgKi8KKyNkZWZpbmUgUlhfTUZGX1RJU1RfVE8JMHgwYzFiCS8qICA4IGJpdAlSZWNlaXZlIE1BQyBUaW1lIFN0YW1wIFRpbWVvdXQgKi8KKyNkZWZpbmUgUlhfTUZGX0NUUkwyCTB4MGMxYwkvKiAgOCBiaXQJUmVjZWl2ZSBNQUMgRklGTyBDb250cm9sIFJlZyAyKi8KKyNkZWZpbmUgUlhfTUZGX1RTVDEJCTB4MGMxZAkvKiAgOCBiaXQJUmVjZWl2ZSBNQUMgRklGTyBUZXN0IFJlZyAxICovCisjZGVmaW5lIFJYX01GRl9UU1QyCQkweDBjMWUJLyogIDggYml0CVJlY2VpdmUgTUFDIEZJRk8gVGVzdCBSZWcgMiAqLworCS8qIDB4MGMxZjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUlhfTEVEX0lOSQkJMHgwYzIwCS8qIDMyIGJpdAlSZWNlaXZlIExFRCBDbnQgSW5pdCBWYWx1ZSAqLworI2RlZmluZSBSWF9MRURfVkFMCQkweDBjMjQJLyogMzIgYml0CVJlY2VpdmUgTEVEIENudCBDdXJyZW50IFZhbHVlICovCisjZGVmaW5lIFJYX0xFRF9DVFJMCQkweDBjMjgJLyogIDggYml0CVJlY2VpdmUgTEVEIENudCBDb250cm9sIFJlZyAqLworI2RlZmluZSBSWF9MRURfVFNUCQkweDBjMjkJLyogIDggYml0CVJlY2VpdmUgTEVEIENudCBUZXN0IFJlZ2lzdGVyICovCisJLyogMHgwYzJhIC0gMHgwYzJmOglyZXNlcnZlZCAqLworI2RlZmluZSBMTktfU1lOQ19JTkkJMHgwYzMwCS8qIDMyIGJpdAlMaW5rIFN5bmMgQ250IEluaXQgVmFsdWUgKi8KKyNkZWZpbmUgTE5LX1NZTkNfVkFMCTB4MGMzNAkvKiAzMiBiaXQJTGluayBTeW5jIENudCBDdXJyZW50IFZhbHVlICovCisjZGVmaW5lIExOS19TWU5DX0NUUkwJMHgwYzM4CS8qICA4IGJpdAlMaW5rIFN5bmMgQ250IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTE5LX1NZTkNfVFNUCTB4MGMzOQkvKiAgOCBiaXQJTGluayBTeW5jIENudCBUZXN0IFJlZ2lzdGVyICovCisJLyogMHgwYzNhIC0gMHgwYzNiOglyZXNlcnZlZCAqLworI2RlZmluZSBMTktfTEVEX1JFRwkJMHgwYzNjCS8qICA4IGJpdAlMaW5rIExFRCBSZWdpc3RlciAqLworCS8qIDB4MGMzZCAtIDB4MGMzZjoJcmVzZXJ2ZWQgKi8KKworLyogUmVjZWl2ZSBHTUFDIEZJRk8gKFlVS09OIG9ubHkpLCB1c2UgTVJfQUREUigpIHRvIGFjY2VzcyAqLworI2RlZmluZSBSWF9HTUZfRUEJCTB4MGM0MAkvKiAzMiBiaXQJUnggR01BQyBGSUZPIEVuZCBBZGRyZXNzICovCisjZGVmaW5lIFJYX0dNRl9BRl9USFIJMHgwYzQ0CS8qIDMyIGJpdAlSeCBHTUFDIEZJRk8gQWxtb3N0IEZ1bGwgVGhyZXNoLiAqLworI2RlZmluZSBSWF9HTUZfQ1RSTF9UCTB4MGM0OAkvKiAzMiBiaXQJUnggR01BQyBGSUZPIENvbnRyb2wvVGVzdCAqLworI2RlZmluZSBSWF9HTUZfRkxfTVNLCTB4MGM0YwkvKiAzMiBiaXQJUnggR01BQyBGSUZPIEZsdXNoIE1hc2sgKi8KKyNkZWZpbmUgUlhfR01GX0ZMX1RIUgkweDBjNTAJLyogMzIgYml0CVJ4IEdNQUMgRklGTyBGbHVzaCBUaHJlc2hvbGQgKi8KKwkvKiAweDBjNTQgLSAweDBjNWY6CXJlc2VydmVkICovCisjZGVmaW5lIFJYX0dNRl9XUAkJMHgwYzYwCS8qIDMyIGJpdCAJUnggR01BQyBGSUZPIFdyaXRlIFBvaW50ZXIgKi8KKwkvKiAweDBjNjQgLSAweDBjNjc6CXJlc2VydmVkICovCisjZGVmaW5lIFJYX0dNRl9XTEVWCQkweDBjNjgJLyogMzIgYml0IAlSeCBHTUFDIEZJRk8gV3JpdGUgTGV2ZWwgKi8KKwkvKiAweDBjNmMgLSAweDBjNmY6CXJlc2VydmVkICovCisjZGVmaW5lIFJYX0dNRl9SUAkJMHgwYzcwCS8qIDMyIGJpdCAJUnggR01BQyBGSUZPIFJlYWQgUG9pbnRlciAqLworCS8qIDB4MGM3NCAtIDB4MGM3NzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUlhfR01GX1JMRVYJCTB4MGM3OAkvKiAzMiBiaXQgCVJ4IEdNQUMgRklGTyBSZWFkIExldmVsICovCisJLyogMHgwYzdjIC0gMHgwYzdmOglyZXNlcnZlZCAqLworCisvKgorICoJQmFuayAyNQorICovCisJLyogMHgwYzgwIC0gMHgwY2JmOglNQUMgMiAqLworCS8qIDB4MGNjMCAtIDB4MGNmZjoJcmVzZXJ2ZWQgKi8KKworLyoKKyAqCUJhbmsgMjYKKyAqLworLyoKKyAqIFRyYW5zbWl0IE1BQyBGSUZPIGFuZCBUcmFuc21pdCBMRUQgUmVnaXN0ZXJzIChHRU5FU0lTIG9ubHkpLAorICogdXNlIE1SX0FERFIoKSB0byBhY2Nlc3MKKyAqLworI2RlZmluZSBUWF9NRkZfRUEJCTB4MGQwMAkvKiAzMiBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gRW5kIEFkZHJlc3MgKi8KKyNkZWZpbmUgVFhfTUZGX1dQCQkweDBkMDQJLyogMzIgYml0IAlUcmFuc21pdCBNQUMgRklGTyBXUiBQb2ludGVyICovCisjZGVmaW5lIFRYX01GRl9XU1AJCTB4MGQwOAkvKiAzMiBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gV1IgU2hhZG93IFB0ciAqLworI2RlZmluZSBUWF9NRkZfUlAJCTB4MGQwYwkvKiAzMiBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gUkQgUG9pbnRlciAqLworI2RlZmluZSBUWF9NRkZfUEMJCTB4MGQxMAkvKiAzMiBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gUGFja2V0IENudCAqLworI2RlZmluZSBUWF9NRkZfTEVWCQkweDBkMTQJLyogMzIgYml0CVRyYW5zbWl0IE1BQyBGSUZPIExldmVsICovCisjZGVmaW5lIFRYX01GRl9DVFJMMQkweDBkMTgJLyogMTYgYml0CVRyYW5zbWl0IE1BQyBGSUZPIEN0cmwgUmVnIDEgKi8KKyNkZWZpbmUgVFhfTUZGX1dBRgkJMHgwZDFhCS8qICA4IGJpdAlUcmFuc21pdCBNQUMgV2FpdCBhZnRlciBmbHVzaCAqLworCS8qIDB4MGMxYjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgVFhfTUZGX0NUUkwyCTB4MGQxYwkvKiAgOCBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gQ3RybCBSZWcgMiAqLworI2RlZmluZSBUWF9NRkZfVFNUMQkJMHgwZDFkCS8qICA4IGJpdAlUcmFuc21pdCBNQUMgRklGTyBUZXN0IFJlZyAxICovCisjZGVmaW5lIFRYX01GRl9UU1QyCQkweDBkMWUJLyogIDggYml0CVRyYW5zbWl0IE1BQyBGSUZPIFRlc3QgUmVnIDIgKi8KKwkvKiAweDBkMWY6CXJlc2VydmVkICovCisjZGVmaW5lIFRYX0xFRF9JTkkJCTB4MGQyMAkvKiAzMiBiaXQJVHJhbnNtaXQgTEVEIENudCBJbml0IFZhbHVlICovCisjZGVmaW5lIFRYX0xFRF9WQUwJCTB4MGQyNAkvKiAzMiBiaXQJVHJhbnNtaXQgTEVEIENudCBDdXJyZW50IFZhbCAqLworI2RlZmluZSBUWF9MRURfQ1RSTAkJMHgwZDI4CS8qICA4IGJpdAlUcmFuc21pdCBMRUQgQ250IENvbnRyb2wgUmVnICovCisjZGVmaW5lIFRYX0xFRF9UU1QJCTB4MGQyOQkvKiAgOCBiaXQJVHJhbnNtaXQgTEVEIENudCBUZXN0IFJlZyAqLworCS8qIDB4MGQyYSAtIDB4MGQzZjoJcmVzZXJ2ZWQgKi8KKworLyogVHJhbnNtaXQgR01BQyBGSUZPIChZVUtPTiBvbmx5KSwgdXNlIE1SX0FERFIoKSB0byBhY2Nlc3MgKi8KKyNkZWZpbmUgVFhfR01GX0VBCQkweDBkNDAJLyogMzIgYml0CVR4IEdNQUMgRklGTyBFbmQgQWRkcmVzcyAqLworI2RlZmluZSBUWF9HTUZfQUVfVEhSCTB4MGQ0NAkvKiAzMiBiaXQJVHggR01BQyBGSUZPIEFsbW9zdCBFbXB0eSBUaHJlc2guKi8KKyNkZWZpbmUgVFhfR01GX0NUUkxfVAkweDBkNDgJLyogMzIgYml0CVR4IEdNQUMgRklGTyBDb250cm9sL1Rlc3QgKi8KKwkvKiAweDBkNGMgLSAweDBkNWY6CXJlc2VydmVkICovCisjZGVmaW5lIFRYX0dNRl9XUAkJMHgwZDYwCS8qIDMyIGJpdCAJVHggR01BQyBGSUZPIFdyaXRlIFBvaW50ZXIgKi8KKyNkZWZpbmUgVFhfR01GX1dTUAkJMHgwZDY0CS8qIDMyIGJpdCAJVHggR01BQyBGSUZPIFdyaXRlIFNoYWRvdyBQdHIuICovCisjZGVmaW5lIFRYX0dNRl9XTEVWCQkweDBkNjgJLyogMzIgYml0IAlUeCBHTUFDIEZJRk8gV3JpdGUgTGV2ZWwgKi8KKwkvKiAweDBkNmMgLSAweDBkNmY6CXJlc2VydmVkICovCisjZGVmaW5lIFRYX0dNRl9SUAkJMHgwZDcwCS8qIDMyIGJpdCAJVHggR01BQyBGSUZPIFJlYWQgUG9pbnRlciAqLworI2RlZmluZSBUWF9HTUZfUlNUUAkJMHgwZDc0CS8qIDMyIGJpdCAJVHggR01BQyBGSUZPIFJlc3RhcnQgUG9pbnRlciAqLworI2RlZmluZSBUWF9HTUZfUkxFVgkJMHgwZDc4CS8qIDMyIGJpdCAJVHggR01BQyBGSUZPIFJlYWQgTGV2ZWwgKi8KKwkvKiAweDBkN2MgLSAweDBkN2Y6CXJlc2VydmVkICovCisKKy8qCisgKglCYW5rIDI3CisgKi8KKwkvKiAweDBkODAgLSAweDBkYmY6CU1BQyAyICovCisJLyogMHgwZGFhIC0gMHgwZGZmOglyZXNlcnZlZCAqLworCisvKgorICoJQmFuayAyOAorICovCisvKiBEZXNjcmlwdG9yIFBvbGwgVGltZXIgUmVnaXN0ZXJzICovCisjZGVmaW5lIEIyOF9EUFRfSU5JCQkweDBlMDAJLyogMjQgYml0CURlc2NyaXB0b3IgUG9sbCBUaW1lciBJbml0IFZhbCAqLworI2RlZmluZSBCMjhfRFBUX1ZBTAkJMHgwZTA0CS8qIDI0IGJpdAlEZXNjcmlwdG9yIFBvbGwgVGltZXIgQ3VyciBWYWwgKi8KKyNkZWZpbmUgQjI4X0RQVF9DVFJMCTB4MGUwOAkvKiAgOCBiaXQJRGVzY3JpcHRvciBQb2xsIFRpbWVyIEN0cmwgUmVnICovCisJLyogMHgwZTA5OglyZXNlcnZlZCAqLworI2RlZmluZSBCMjhfRFBUX1RTVAkJMHgwZTBhCS8qICA4IGJpdAlEZXNjcmlwdG9yIFBvbGwgVGltZXIgVGVzdCBSZWcgKi8KKwkvKiAweDBlMGI6CXJlc2VydmVkICovCisKKy8qIFRpbWUgU3RhbXAgVGltZXIgUmVnaXN0ZXJzIChZVUtPTiBvbmx5KSAqLworCS8qIDB4MGUxMDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgR01BQ19USV9TVF9WQUwJMHgwZTE0CS8qIDMyIGJpdAlUaW1lIFN0YW1wIFRpbWVyIEN1cnIgVmFsICovCisjZGVmaW5lIEdNQUNfVElfU1RfQ1RSTAkweDBlMTgJLyogIDggYml0CVRpbWUgU3RhbXAgVGltZXIgQ3RybCBSZWcgKi8KKwkvKiAweDBlMTk6CXJlc2VydmVkICovCisjZGVmaW5lIEdNQUNfVElfU1RfVFNUCTB4MGUxYQkvKiAgOCBiaXQJVGltZSBTdGFtcCBUaW1lciBUZXN0IFJlZyAqLworCS8qIDB4MGUxYiAtIDB4MGU3ZjoJcmVzZXJ2ZWQgKi8KKworLyoKKyAqCUJhbmsgMjkKKyAqLworCS8qIDB4MGU4MCAtIDB4MGVmYzoJcmVzZXJ2ZWQgKi8KKworLyoKKyAqCUJhbmsgMzAKKyAqLworLyogR01BQyBhbmQgR1BIWSBDb250cm9sIFJlZ2lzdGVycyAoWVVLT04gb25seSkgKi8KKyNkZWZpbmUgR01BQ19DVFJMCQkweDBmMDAJLyogMzIgYml0CUdNQUMgQ29udHJvbCBSZWcgKi8KKyNkZWZpbmUgR1BIWV9DVFJMCQkweDBmMDQJLyogMzIgYml0CUdQSFkgQ29udHJvbCBSZWcgKi8KKyNkZWZpbmUgR01BQ19JUlFfU1JDCTB4MGYwOAkvKiAgOCBiaXQJR01BQyBJbnRlcnJ1cHQgU291cmNlIFJlZyAqLworCS8qIDB4MGYwOSAtIDB4MGYwYjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgR01BQ19JUlFfTVNLCTB4MGYwYwkvKiAgOCBiaXQJR01BQyBJbnRlcnJ1cHQgTWFzayBSZWcgKi8KKwkvKiAweDBmMGQgLSAweDBmMGY6CXJlc2VydmVkICovCisjZGVmaW5lIEdNQUNfTElOS19DVFJMCTB4MGYxMAkvKiAxNiBiaXQJTGluayBDb250cm9sIFJlZyAqLworCS8qIDB4MGYxNCAtIDB4MGYxZjoJcmVzZXJ2ZWQgKi8KKworLyogV2FrZS11cCBGcmFtZSBQYXR0ZXJuIE1hdGNoIENvbnRyb2wgUmVnaXN0ZXJzIChZVUtPTiBvbmx5KSAqLworCisjZGVmaW5lIFdPTF9SRUdfT0ZGUwkweDIwCS8qIEhXLUJ1ZzogQWRkcmVzcyBpcyArIDB4MjAgYWdhaW5zdCBzcGVjLiAqLworCisjZGVmaW5lIFdPTF9DVFJMX1NUQVQJMHgwZjIwCS8qIDE2IGJpdAlXT0wgQ29udHJvbC9TdGF0dXMgUmVnICovCisjZGVmaW5lIFdPTF9NQVRDSF9DVEwJMHgwZjIyCS8qICA4IGJpdAlXT0wgTWF0Y2ggQ29udHJvbCBSZWcgKi8KKyNkZWZpbmUgV09MX01BVENIX1JFUwkweDBmMjMJLyogIDggYml0CVdPTCBNYXRjaCBSZXN1bHQgUmVnICovCisjZGVmaW5lIFdPTF9NQUNfQUREUl9MTwkweDBmMjQJLyogMzIgYml0CVdPTCBNQUMgQWRkcmVzcyBMb3cgKi8KKyNkZWZpbmUgV09MX01BQ19BRERSX0hJCTB4MGYyOAkvKiAxNiBiaXQJV09MIE1BQyBBZGRyZXNzIEhpZ2ggKi8KKyNkZWZpbmUgV09MX1BBVFRfUlBUUgkweDBmMmMJLyogIDggYml0CVdPTCBQYXR0ZXJuIFJlYWQgUHRyICovCisKKy8qIHVzZSB0aGlzIG1hY3JvIHRvIGFjY2VzcyBhYm92ZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgV09MX1JFRyhSZWcpCSgoUmVnKSArIChwQUMtPkdJbmkuR0lXb2xPZmZzKSkKKworCisvKiBXT0wgUGF0dGVybiBMZW5ndGggUmVnaXN0ZXJzIChZVUtPTiBvbmx5KSAqLworCisjZGVmaW5lIFdPTF9QQVRUX0xFTl9MTwkweDBmMzAJCS8qIDMyIGJpdAlXT0wgUGF0dGVybiBMZW5ndGggMy4uMCAqLworI2RlZmluZSBXT0xfUEFUVF9MRU5fSEkJMHgwZjM0CQkvKiAyNCBiaXQJV09MIFBhdHRlcm4gTGVuZ3RoIDYuLjQgKi8KKworLyogV09MIFBhdHRlcm4gQ291bnRlciBSZWdpc3RlcnMgKFlVS09OIG9ubHkpICovCisKKyNkZWZpbmUgV09MX1BBVFRfQ05UXzAJMHgwZjM4CQkvKiAzMiBiaXQJV09MIFBhdHRlcm4gQ291bnRlciAzLi4wICovCisjZGVmaW5lIFdPTF9QQVRUX0NOVF80CTB4MGYzYwkJLyogMjQgYml0CVdPTCBQYXR0ZXJuIENvdW50ZXIgNi4uNCAqLworCS8qIDB4MGY0MCAtIDB4MGY3ZjoJcmVzZXJ2ZWQgKi8KKworLyoKKyAqCUJhbmsgMzEKKyAqLworLyogMHgwZjgwIC0gMHgwZmZmOglyZXNlcnZlZCAqLworCisvKgorICoJQmFuayAzMgktIDMzCisgKi8KKyNkZWZpbmUgV09MX1BBVFRfUkFNXzEJMHgxMDAwCS8qICBXT0wgUGF0dGVybiBSQU0gTGluayAxICovCisKKy8qCisgKglCYW5rIDB4MjIgLSAweDNmCisgKi8KKy8qIDB4MTEwMCAtIDB4MWZmZjoJcmVzZXJ2ZWQgKi8KKworLyoKKyAqCUJhbmsgMHg0MCAtIDB4NGYKKyAqLworI2RlZmluZSBCQVNFX1hNQUNfMQkJMHgyMDAwCS8qIFhNQUMgMSByZWdpc3RlcnMgKi8KKworLyoKKyAqCUJhbmsgMHg1MCAtIDB4NWYKKyAqLworCisjZGVmaW5lIEJBU0VfR01BQ18xCQkweDI4MDAJLyogR01BQyAxIHJlZ2lzdGVycyAqLworCisvKgorICoJQmFuayAweDYwIC0gMHg2ZgorICovCisjZGVmaW5lIEJBU0VfWE1BQ18yCQkweDMwMDAJLyogWE1BQyAyIHJlZ2lzdGVycyAqLworCisvKgorICoJQmFuayAweDcwIC0gMHg3ZgorICovCisjZGVmaW5lIEJBU0VfR01BQ18yCQkweDM4MDAJLyogR01BQyAyIHJlZ2lzdGVycyAqLworCisvKgorICoJQ29udHJvbCBSZWdpc3RlciBCaXQgRGVmaW5pdGlvbnM6CisgKi8KKy8qCUIwX1JBUAkJOCBiaXQJUmVnaXN0ZXIgQWRkcmVzcyBQb3J0ICovCisJCQkJCQkJCS8qIEJpdCA3OglyZXNlcnZlZCAqLworI2RlZmluZSBSQVBfUkFQCQkJMHgzZgkvKiBCaXQgNi4uMDoJMCA9IGJsb2NrIDAsLi4sNmYgPSBibG9jayA2ZiAqLworCisvKglCMF9DVFNUCQkJMTYgYml0CUNvbnRyb2wvU3RhdHVzIHJlZ2lzdGVyICovCisJCQkJCQkJCS8qIEJpdCAxNS4uMTQ6CXJlc2VydmVkICovCisjZGVmaW5lIENTX0NMS19SVU5fSE9UCUJJVF8xM1MJCS8qIENMS19SVU4gaG90IG0uIChZVUtPTi1MaXRlIG9ubHkpICovCisjZGVmaW5lIENTX0NMS19SVU5fUlNUCUJJVF8xMlMJCS8qIENMS19SVU4gcmVzZXQgIChZVUtPTi1MaXRlIG9ubHkpICovCisjZGVmaW5lIENTX0NMS19SVU5fRU5BCUJJVF8xMVMJCS8qIENMS19SVU4gZW5hYmxlIChZVUtPTi1MaXRlIG9ubHkpICovCisjZGVmaW5lIENTX1ZBVVhfQVZBSUwJQklUXzEwUwkJLyogVkFVWCBhdmFpbGFibGUgKFlVS09OIG9ubHkpICovCisjZGVmaW5lIENTX0JVU19DTE9DSwlCSVRfOVMJCS8qIEJ1cyBDbG9jayAwLzEgPSAzMy82NiBNSHogKi8KKyNkZWZpbmUgQ1NfQlVTX1NMT1RfU1oJQklUXzhTCQkvKiBTbG90IFNpemUgMC8xID0gMzIvNjQgYml0IHNsb3QgKi8KKyNkZWZpbmUgQ1NfU1RfU1dfSVJRCUJJVF83UwkJLyogU2V0IElSUSBTVyBSZXF1ZXN0ICovCisjZGVmaW5lIENTX0NMX1NXX0lSUQlCSVRfNlMJCS8qIENsZWFyIElSUSBTVyBSZXF1ZXN0ICovCisjZGVmaW5lIENTX1NUT1BfRE9ORQlCSVRfNVMJCS8qIFN0b3AgTWFzdGVyIGlzIGZpbmlzaGVkICovCisjZGVmaW5lIENTX1NUT1BfTUFTVAlCSVRfNFMJCS8qIENvbW1hbmQgQml0IHRvIHN0b3AgdGhlIG1hc3RlciAqLworI2RlZmluZSBDU19NUlNUX0NMUgkJQklUXzNTCQkvKiBDbGVhciBNYXN0ZXIgcmVzZXQJKi8KKyNkZWZpbmUgQ1NfTVJTVF9TRVQJCUJJVF8yUwkJLyogU2V0IE1hc3RlciByZXNldAkqLworI2RlZmluZSBDU19SU1RfQ0xSCQlCSVRfMVMJCS8qIENsZWFyIFNvZnR3YXJlIHJlc2V0CSovCisjZGVmaW5lIENTX1JTVF9TRVQJCUJJVF8wUwkJLyogU2V0ICAgU29mdHdhcmUgcmVzZXQJKi8KKworLyoJQjBfTEVECQkJIDggQml0CUxFRCByZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgIDcuLiAyOglyZXNlcnZlZCAqLworI2RlZmluZSBMRURfU1RBVF9PTgkJQklUXzFTCQkvKiBTdGF0dXMgTEVEIG9uCSovCisjZGVmaW5lIExFRF9TVEFUX09GRglCSVRfMFMJCS8qIFN0YXR1cyBMRUQgb2ZmCSovCisKKy8qCUIwX1BPV0VSX0NUUkwJIDggQml0CVBvd2VyIENvbnRyb2wgcmVnIChZVUtPTiBvbmx5KSAqLworI2RlZmluZSBQQ19WQVVYX0VOQQkJQklUXzcJCS8qIFN3aXRjaCBWQVVYIEVuYWJsZSAgKi8KKyNkZWZpbmUgUENfVkFVWF9ESVMJCUJJVF82ICAgICAgIC8qIFN3aXRjaCBWQVVYIERpc2FibGUgKi8KKyNkZWZpbmUgUENfVkNDX0VOQQkJQklUXzUgICAgICAgLyogU3dpdGNoIFZDQyBFbmFibGUgICovCisjZGVmaW5lIFBDX1ZDQ19ESVMJCUJJVF80ICAgICAgIC8qIFN3aXRjaCBWQ0MgRGlzYWJsZSAqLworI2RlZmluZSBQQ19WQVVYX09OCQlCSVRfMyAgICAgICAvKiBTd2l0Y2ggVkFVWCBPbiAgKi8KKyNkZWZpbmUgUENfVkFVWF9PRkYJCUJJVF8yICAgICAgIC8qIFN3aXRjaCBWQVVYIE9mZiAqLworI2RlZmluZSBQQ19WQ0NfT04JCUJJVF8xICAgICAgIC8qIFN3aXRjaCBWQ0MgT24gICovCisjZGVmaW5lIFBDX1ZDQ19PRkYJCUJJVF8wICAgICAgIC8qIFN3aXRjaCBWQ0MgT2ZmICovCisKKy8qCUIwX0lTUkMJCQkzMiBiaXQJSW50ZXJydXB0IFNvdXJjZSBSZWdpc3RlciAqLworLyoJQjBfSU1TSwkJCTMyIGJpdAlJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworLyoJQjBfU1BfSVNSQwkJMzIgYml0CVNwZWNpYWwgSW50ZXJydXB0IFNvdXJjZSBSZWcgKi8KKy8qCUIyX0lSUU1fTVNLIAkzMiBiaXQJSVJRIE1vZGVyYXRpb24gTWFzayAqLworI2RlZmluZSBJU19BTExfTVNLCQkweGJmZmZmZmZmVUwJLyogQWxsIEludGVycnVwdCBiaXRzICovCisjZGVmaW5lIElTX0hXX0VSUgkJQklUXzMxCQkvKiBJbnRlcnJ1cHQgSFcgRXJyb3IgKi8KKwkJCQkJCQkJLyogQml0IDMwOglyZXNlcnZlZCAqLworI2RlZmluZSBJU19QQV9UT19SWDEJQklUXzI5CQkvKiBQYWNrZXQgQXJiIFRpbWVvdXQgUngxICovCisjZGVmaW5lIElTX1BBX1RPX1JYMglCSVRfMjgJCS8qIFBhY2tldCBBcmIgVGltZW91dCBSeDIgKi8KKyNkZWZpbmUgSVNfUEFfVE9fVFgxCUJJVF8yNwkJLyogUGFja2V0IEFyYiBUaW1lb3V0IFR4MSAqLworI2RlZmluZSBJU19QQV9UT19UWDIJQklUXzI2CQkvKiBQYWNrZXQgQXJiIFRpbWVvdXQgVHgyICovCisjZGVmaW5lIElTX0kyQ19SRUFEWQlCSVRfMjUJCS8qIElSUSBvbiBlbmQgb2YgSTJDIFR4ICovCisjZGVmaW5lIElTX0lSUV9TVwkJQklUXzI0CQkvKiBTVyBmb3JjZWQgSVJRCSovCisjZGVmaW5lIElTX0VYVF9SRUcJCUJJVF8yMwkJLyogSVJRIGZyb20gTE04MCBvciBQSFkgKEdFTkVTSVMgb25seSkgKi8KKwkJCQkJCQkJCS8qIElSUSBmcm9tIFBIWSAoWVVLT04gb25seSkgKi8KKyNkZWZpbmUgSVNfVElNSU5UCQlCSVRfMjIJCS8qIElSUSBmcm9tIFRpbWVyCSovCisjZGVmaW5lIElTX01BQzEJCQlCSVRfMjEJCS8qIElSUSBmcm9tIE1BQyAxCSovCisjZGVmaW5lIElTX0xOS19TWU5DX00xCUJJVF8yMAkJLyogTGluayBTeW5jIENudCB3cmFwIE1BQyAxICovCisjZGVmaW5lIElTX01BQzIJCQlCSVRfMTkJCS8qIElSUSBmcm9tIE1BQyAyCSovCisjZGVmaW5lIElTX0xOS19TWU5DX00yCUJJVF8xOAkJLyogTGluayBTeW5jIENudCB3cmFwIE1BQyAyICovCisvKiBSZWNlaXZlIFF1ZXVlIDEgKi8KKyNkZWZpbmUgSVNfUjFfQgkJCUJJVF8xNwkJLyogUV9SMSBFbmQgb2YgQnVmZmVyICovCisjZGVmaW5lIElTX1IxX0YJCQlCSVRfMTYJCS8qIFFfUjEgRW5kIG9mIEZyYW1lICovCisjZGVmaW5lIElTX1IxX0MJCQlCSVRfMTUJCS8qIFFfUjEgRW5jb2RpbmcgRXJyb3IgKi8KKy8qIFJlY2VpdmUgUXVldWUgMiAqLworI2RlZmluZSBJU19SMl9CCQkJQklUXzE0CQkvKiBRX1IyIEVuZCBvZiBCdWZmZXIgKi8KKyNkZWZpbmUgSVNfUjJfRgkJCUJJVF8xMwkJLyogUV9SMiBFbmQgb2YgRnJhbWUgKi8KKyNkZWZpbmUgSVNfUjJfQwkJCUJJVF8xMgkJLyogUV9SMiBFbmNvZGluZyBFcnJvciAqLworLyogU3luY2hyb25vdXMgVHJhbnNtaXQgUXVldWUgMSAqLworI2RlZmluZSBJU19YUzFfQgkJQklUXzExCQkvKiBRX1hTMSBFbmQgb2YgQnVmZmVyICovCisjZGVmaW5lIElTX1hTMV9GCQlCSVRfMTAJCS8qIFFfWFMxIEVuZCBvZiBGcmFtZSAqLworI2RlZmluZSBJU19YUzFfQwkJQklUXzkJCS8qIFFfWFMxIEVuY29kaW5nIEVycm9yICovCisvKiBBc3luY2hyb25vdXMgVHJhbnNtaXQgUXVldWUgMSAqLworI2RlZmluZSBJU19YQTFfQgkJQklUXzgJCS8qIFFfWEExIEVuZCBvZiBCdWZmZXIgKi8KKyNkZWZpbmUgSVNfWEExX0YJCUJJVF83CQkvKiBRX1hBMSBFbmQgb2YgRnJhbWUgKi8KKyNkZWZpbmUgSVNfWEExX0MJCUJJVF82CQkvKiBRX1hBMSBFbmNvZGluZyBFcnJvciAqLworLyogU3luY2hyb25vdXMgVHJhbnNtaXQgUXVldWUgMiAqLworI2RlZmluZSBJU19YUzJfQgkJQklUXzUJCS8qIFFfWFMyIEVuZCBvZiBCdWZmZXIgKi8KKyNkZWZpbmUgSVNfWFMyX0YJCUJJVF80CQkvKiBRX1hTMiBFbmQgb2YgRnJhbWUgKi8KKyNkZWZpbmUgSVNfWFMyX0MJCUJJVF8zCQkvKiBRX1hTMiBFbmNvZGluZyBFcnJvciAqLworLyogQXN5bmNocm9ub3VzIFRyYW5zbWl0IFF1ZXVlIDIgKi8KKyNkZWZpbmUgSVNfWEEyX0IJCUJJVF8yCQkvKiBRX1hBMiBFbmQgb2YgQnVmZmVyICovCisjZGVmaW5lIElTX1hBMl9GCQlCSVRfMQkJLyogUV9YQTIgRW5kIG9mIEZyYW1lICovCisjZGVmaW5lIElTX1hBMl9DCQlCSVRfMAkJLyogUV9YQTIgRW5jb2RpbmcgRXJyb3IgKi8KKworCisvKglCMF9IV0VfSVNSQwkJMzIgYml0CUhXIEVycm9yIEludGVycnVwdCBTcmMgUmVnICovCisvKglCMF9IV0VfSU1TSwkJMzIgYml0CUhXIEVycm9yIEludGVycnVwdCBNYXNrIFJlZyAqLworLyoJQjJfSVJRTV9IV0VfTVNLCTMyIGJpdAlJUlEgTW9kZXJhdGlvbiBIVyBFcnJvciBNYXNrICovCisjZGVmaW5lIElTX0VSUl9NU0sJCTB4MDAwMDBmZmZMCS8qIAkJQWxsIEVycm9yIGJpdHMgKi8KKwkJCQkJCQkJLyogQml0IDMxLi4xNDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgSVNfSVJRX1RJU1RfT1YJQklUXzEzCS8qIFRpbWUgU3RhbXAgVGltZXIgT3ZlcmZsb3cgKFlVS09OIG9ubHkpICovCisjZGVmaW5lIElTX0lSUV9TRU5TT1IJQklUXzEyCS8qIElSUSBmcm9tIFNlbnNvciAoWVVLT04gb25seSkgKi8KKyNkZWZpbmUgSVNfSVJRX01TVF9FUlIJQklUXzExCS8qIElSUSBtYXN0ZXIgZXJyb3IgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgSVNfSVJRX1NUQVQJCUJJVF8xMAkvKiBJUlEgc3RhdHVzIGV4Y2VwdGlvbiAqLworI2RlZmluZSBJU19OT19TVEFUX00xCUJJVF85CS8qIE5vIFJ4IFN0YXR1cyBmcm9tIE1BQyAxICovCisjZGVmaW5lIElTX05PX1NUQVRfTTIJQklUXzgJLyogTm8gUnggU3RhdHVzIGZyb20gTUFDIDIgKi8KKyNkZWZpbmUgSVNfTk9fVElTVF9NMQlCSVRfNwkvKiBObyBUaW1lIFN0YW1wIGZyb20gTUFDIDEgKi8KKyNkZWZpbmUgSVNfTk9fVElTVF9NMglCSVRfNgkvKiBObyBUaW1lIFN0YW1wIGZyb20gTUFDIDIgKi8KKyNkZWZpbmUgSVNfUkFNX1JEX1BBUglCSVRfNQkvKiBSQU0gUmVhZCAgUGFyaXR5IEVycm9yICovCisjZGVmaW5lIElTX1JBTV9XUl9QQVIJQklUXzQJLyogUkFNIFdyaXRlIFBhcml0eSBFcnJvciAqLworI2RlZmluZSBJU19NMV9QQVJfRVJSCUJJVF8zCS8qIE1BQyAxIFBhcml0eSBFcnJvciAqLworI2RlZmluZSBJU19NMl9QQVJfRVJSCUJJVF8yCS8qIE1BQyAyIFBhcml0eSBFcnJvciAqLworI2RlZmluZSBJU19SMV9QQVJfRVJSCUJJVF8xCS8qIFF1ZXVlIFIxIFBhcml0eSBFcnJvciAqLworI2RlZmluZSBJU19SMl9QQVJfRVJSCUJJVF8wCS8qIFF1ZXVlIFIyIFBhcml0eSBFcnJvciAqLworCisvKglCMl9DT05OX1RZUAkJIDggYml0CUNvbm5lY3RvciB0eXBlICovCisvKglCMl9QTURfVFlQCQkgOCBiaXQJUE1EIHR5cGUgKi8KKy8qCVZhbHVlcyBvZiBjb25uZWN0b3IgYW5kIFBNRCB0eXBlIGNvbXBseSB0byBTeXNLb25uZWN0IGludGVybmFsIHN0ZCAqLworCisvKglCMl9NQUNfQ0ZHCQkgOCBiaXQJTUFDIENvbmZpZ3VyYXRpb24gLyBDaGlwIFJldmlzaW9uICovCisjZGVmaW5lIENGR19DSElQX1JfTVNLCSgweGY8PDQpCS8qIEJpdCA3Li4gNDogQ2hpcCBSZXZpc2lvbiAqLworCQkJCQkJCQkJLyogQml0IDMuLiAyOglyZXNlcnZlZCAqLworI2RlZmluZSBDRkdfRElTX00yX0NMSwlCSVRfMVMJCS8qIERpc2FibGUgQ2xvY2sgZm9yIDJuZCBNQUMgKi8KKyNkZWZpbmUgQ0ZHX1NOR19NQUMJCUJJVF8wUwkJLyogTUFDIENvbmZpZzogMD0yIE1BQ3MgLyAxPTEgTUFDKi8KKworLyoJQjJfQ0hJUF9JRAkJIDggYml0IAlDaGlwIElkZW50aWZpY2F0aW9uIE51bWJlciAqLworI2RlZmluZSBDSElQX0lEX0dFTkVTSVMJCTB4MGEJLyogQ2hpcCBJRCBmb3IgR0VORVNJUyAqLworI2RlZmluZSBDSElQX0lEX1lVS09OCQkweGIwCS8qIENoaXAgSUQgZm9yIFlVS09OICovCisjZGVmaW5lIENISVBfSURfWVVLT05fTElURQkweGIxCS8qIENoaXAgSUQgZm9yIFlVS09OLUxpdGUgKFJldi4gQTEtQTMpICovCisjZGVmaW5lIENISVBfSURfWVVLT05fTFAJMHhiMgkvKiBDaGlwIElEIGZvciBZVUtPTi1MUCAqLworCisjZGVmaW5lIENISVBfUkVWX1lVX0xJVEVfQTEJMwkJLyogQ2hpcCBSZXYuIGZvciBZVUtPTi1MaXRlIEExLEEyICovCisjZGVmaW5lIENISVBfUkVWX1lVX0xJVEVfQTMJNwkJLyogQ2hpcCBSZXYuIGZvciBZVUtPTi1MaXRlIEEzICovCisKKy8qCUIyX0ZBUgkJCTMyIGJpdAlGbGFzaC1Qcm9tIEFkZHIgUmVnL0NudCAqLworI2RlZmluZSBGQVJfQUREUgkJMHgxZmZmZkwJLyogQml0IDE2Li4gMDoJRlBST00gQWRkcmVzcyBtYXNrICovCisKKy8qCUIyX0xEX0NUUkwJCSA4IGJpdAlFUFJPTSBsb2FkZXIgY29udHJvbCByZWdpc3RlciAqLworLyoJQml0cyBhcmUgY3VycmVudGx5IHJlc2VydmVkICovCisKKy8qCUIyX0xEX1RFU1QJCSA4IGJpdAlFUFJPTSBsb2FkZXIgdGVzdCByZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgNy4uIDQ6CXJlc2VydmVkICovCisjZGVmaW5lIExEX1RfT04JCQlCSVRfM1MJLyogTG9hZGVyIFRlc3QgbW9kZSBvbiAqLworI2RlZmluZSBMRF9UX09GRgkJQklUXzJTCS8qIExvYWRlciBUZXN0IG1vZGUgb2ZmICovCisjZGVmaW5lIExEX1RfU1RFUAkJQklUXzFTCS8qIERlY3JlbWVudCBGUFJPTSBhZGRyLiBDb3VudGVyICovCisjZGVmaW5lIExEX1NUQVJUCQlCSVRfMFMJLyogU3RhcnQgbG9hZGluZyBGUFJPTSAqLworCisvKgorICoJVGltZXIgU2VjdGlvbgorICovCisvKglCMl9USV9DVFJMCQkgOCBiaXQJVGltZXIgY29udHJvbCAqLworLyoJQjJfSVJRTV9DVFJMCSA4IGJpdAlJUlEgTW9kZXJhdGlvbiBUaW1lciBDb250cm9sICovCisJCQkJCQkJCS8qIEJpdCA3Li4gMzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgVElNX1NUQVJUCQlCSVRfMlMJLyogU3RhcnQgVGltZXIgKi8KKyNkZWZpbmUgVElNX1NUT1AJCUJJVF8xUwkvKiBTdG9wICBUaW1lciAqLworI2RlZmluZSBUSU1fQ0xSX0lSUQkJQklUXzBTCS8qIENsZWFyIFRpbWVyIElSUSAoIUlSUU0pICovCisKKy8qCUIyX1RJX1RFU1QJCSA4IEJpdAlUaW1lciBUZXN0ICovCisvKglCMl9JUlFNX1RFU1QJIDggYml0CUlSUSBNb2RlcmF0aW9uIFRpbWVyIFRlc3QgKi8KKy8qCUIyOF9EUFRfVFNUCQkgOCBiaXQJRGVzY3JpcHRvciBQb2xsIFRpbWVyIFRlc3QgUmVnICovCisJCQkJCQkJCS8qIEJpdCA3Li4gMzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgVElNX1RfT04JCUJJVF8yUwkvKiBUZXN0IG1vZGUgb24gKi8KKyNkZWZpbmUgVElNX1RfT0ZGCQlCSVRfMVMJLyogVGVzdCBtb2RlIG9mZiAqLworI2RlZmluZSBUSU1fVF9TVEVQCQlCSVRfMFMJLyogVGVzdCBzdGVwICovCisKKy8qCUIyOF9EUFRfSU5JCTMyIGJpdAlEZXNjcmlwdG9yIFBvbGwgVGltZXIgSW5pdCBWYWwgKi8KKy8qCUIyOF9EUFRfVkFMCTMyIGJpdAlEZXNjcmlwdG9yIFBvbGwgVGltZXIgQ3VyciBWYWwgKi8KKwkJCQkJCQkJLyogQml0IDMxLi4yNDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRFBUX01TSwkJMHgwMGZmZmZmZkwJLyogQml0IDIzLi4gMDoJRGVzYyBQb2xsIFRpbWVyIEJpdHMgKi8KKworLyoJQjI4X0RQVF9DVFJMCSA4IGJpdAlEZXNjcmlwdG9yIFBvbGwgVGltZXIgQ3RybCBSZWcgKi8KKwkJCQkJCQkJLyogQml0ICA3Li4gMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRFBUX1NUQVJUCQlCSVRfMVMJLyogU3RhcnQgRGVzY3JpcHRvciBQb2xsIFRpbWVyICovCisjZGVmaW5lIERQVF9TVE9QCQlCSVRfMFMJLyogU3RvcCAgRGVzY3JpcHRvciBQb2xsIFRpbWVyICovCisKKy8qCUIyX0VfMwkJCSA4IGJpdCAJbG93ZXIgNCBiaXRzIHVzZWQgZm9yIEhXIHNlbGYgdGVzdCByZXN1bHQgKi8KKyNkZWZpbmUgQjJfRTNfUkVTX01BU0sJMHgwZgorCisvKglCMl9UU1RfQ1RSTDEJIDggYml0CVRlc3QgQ29udHJvbCBSZWdpc3RlciAxICovCisjZGVmaW5lIFRTVF9GUkNfRFBFUlJfTVIJQklUXzdTCS8qIGZvcmNlIERBVEFQRVJSIG9uIE1TVCBSRCAqLworI2RlZmluZSBUU1RfRlJDX0RQRVJSX01XCUJJVF82UwkvKiBmb3JjZSBEQVRBUEVSUiBvbiBNU1QgV1IgKi8KKyNkZWZpbmUgVFNUX0ZSQ19EUEVSUl9UUglCSVRfNVMJLyogZm9yY2UgREFUQVBFUlIgb24gVFJHIFJEICovCisjZGVmaW5lIFRTVF9GUkNfRFBFUlJfVFcJQklUXzRTCS8qIGZvcmNlIERBVEFQRVJSIG9uIFRSRyBXUiAqLworI2RlZmluZSBUU1RfRlJDX0FQRVJSX00JCUJJVF8zUwkvKiBmb3JjZSBBRERSUEVSUiBvbiBNU1QgKi8KKyNkZWZpbmUgVFNUX0ZSQ19BUEVSUl9UCQlCSVRfMlMJLyogZm9yY2UgQUREUlBFUlIgb24gVFJHICovCisjZGVmaW5lIFRTVF9DRkdfV1JJVEVfT04JQklUXzFTCS8qIEVuYWJsZSAgQ29uZmlnIFJlZyBXUiAqLworI2RlZmluZSBUU1RfQ0ZHX1dSSVRFX09GRglCSVRfMFMJLyogRGlzYWJsZSBDb25maWcgUmVnIFdSICovCisKKy8qCUIyX1RTVF9DVFJMMgkgOCBiaXQJVGVzdCBDb250cm9sIFJlZ2lzdGVyIDIgKi8KKwkJCQkJCQkJCS8qIEJpdCA3Li4gNDoJcmVzZXJ2ZWQgKi8KKwkJCS8qIGZvcmNlIHRoZSBmb2xsb3dpbmcgZXJyb3Igb24gdGhlIG5leHQgbWFzdGVyIHJlYWQvd3JpdGUJKi8KKyNkZWZpbmUgVFNUX0ZSQ19EUEVSUl9NUjY0CUJJVF8zUwkvKiBEYXRhUEVSUiBSRCA2NAkqLworI2RlZmluZSBUU1RfRlJDX0RQRVJSX01XNjQJQklUXzJTCS8qIERhdGFQRVJSIFdSIDY0CSovCisjZGVmaW5lIFRTVF9GUkNfQVBFUlJfMU02NAlCSVRfMVMJLyogQWRkclBFUlIgb24gMS4gcGhhc2UgKi8KKyNkZWZpbmUgVFNUX0ZSQ19BUEVSUl8yTTY0CUJJVF8wUwkvKiBBZGRyUEVSUiBvbiAyLiBwaGFzZSAqLworCisvKglCMl9HUF9JTwkJMzIgYml0CUdlbmVyYWwgUHVycG9zZSBJL08gUmVnaXN0ZXIgKi8KKwkJCQkJCQkvKiBCaXQgMzEuLjI2OglyZXNlcnZlZCAqLworI2RlZmluZSBHUF9ESVJfOQlCSVRfMjUJLyogSU9fOSBkaXJlY3QsIDA9SW4vMT1PdXQgKi8KKyNkZWZpbmUgR1BfRElSXzgJQklUXzI0CS8qIElPXzggZGlyZWN0LCAwPUluLzE9T3V0ICovCisjZGVmaW5lIEdQX0RJUl83CUJJVF8yMwkvKiBJT183IGRpcmVjdCwgMD1Jbi8xPU91dCAqLworI2RlZmluZSBHUF9ESVJfNglCSVRfMjIJLyogSU9fNiBkaXJlY3QsIDA9SW4vMT1PdXQgKi8KKyNkZWZpbmUgR1BfRElSXzUJQklUXzIxCS8qIElPXzUgZGlyZWN0LCAwPUluLzE9T3V0ICovCisjZGVmaW5lIEdQX0RJUl80CUJJVF8yMAkvKiBJT180IGRpcmVjdCwgMD1Jbi8xPU91dCAqLworI2RlZmluZSBHUF9ESVJfMwlCSVRfMTkJLyogSU9fMyBkaXJlY3QsIDA9SW4vMT1PdXQgKi8KKyNkZWZpbmUgR1BfRElSXzIJQklUXzE4CS8qIElPXzIgZGlyZWN0LCAwPUluLzE9T3V0ICovCisjZGVmaW5lIEdQX0RJUl8xCUJJVF8xNwkvKiBJT18xIGRpcmVjdCwgMD1Jbi8xPU91dCAqLworI2RlZmluZSBHUF9ESVJfMAlCSVRfMTYJLyogSU9fMCBkaXJlY3QsIDA9SW4vMT1PdXQgKi8KKwkJCQkJCS8qIEJpdCAxNS4uMTA6CXJlc2VydmVkICovCisjZGVmaW5lIEdQX0lPXzkJCUJJVF85CS8qIElPXzkgcGluICovCisjZGVmaW5lIEdQX0lPXzgJCUJJVF84CS8qIElPXzggcGluICovCisjZGVmaW5lIEdQX0lPXzcJCUJJVF83CS8qIElPXzcgcGluICovCisjZGVmaW5lIEdQX0lPXzYJCUJJVF82CS8qIElPXzYgcGluICovCisjZGVmaW5lIEdQX0lPXzUJCUJJVF81CS8qIElPXzUgcGluICovCisjZGVmaW5lIEdQX0lPXzQJCUJJVF80CS8qIElPXzQgcGluICovCisjZGVmaW5lIEdQX0lPXzMJCUJJVF8zCS8qIElPXzMgcGluICovCisjZGVmaW5lIEdQX0lPXzIJCUJJVF8yCS8qIElPXzIgcGluICovCisjZGVmaW5lIEdQX0lPXzEJCUJJVF8xCS8qIElPXzEgcGluICovCisjZGVmaW5lIEdQX0lPXzAJCUJJVF8wCS8qIElPXzAgcGluICovCisKKy8qCUIyX0kyQ19DVFJMCQkzMiBiaXQJSTJDIEhXIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSTJDX0ZMQUcJCUJJVF8zMQkJLyogU3RhcnQgcmVhZC93cml0ZSBpZiBXUiAqLworI2RlZmluZSBJMkNfQUREUgkJKDB4N2ZmZkw8PDE2KQkvKiBCaXQgMzAuLjE2OglBZGRyIHRvIGJlIFJEL1dSICovCisjZGVmaW5lIEkyQ19ERVZfU0VMCQkoMHg3Zkw8PDkpCQkvKiBCaXQgMTUuLiA5OglJMkMgRGV2aWNlIFNlbGVjdCAqLworCQkJCQkJCQkvKiBCaXQJOC4uIDU6CXJlc2VydmVkCSovCisjZGVmaW5lIEkyQ19CVVJTVF9MRU4JQklUXzQJCS8qIEJ1cnN0IExlbiwgMS80IGJ5dGVzICovCisjZGVmaW5lIEkyQ19ERVZfU0laRQkoNzw8MSkJCS8qIEJpdAkzLi4gMToJSTJDIERldmljZSBTaXplCSovCisjZGVmaW5lIEkyQ18wMjVLX0RFVgkoMDw8MSkJCS8qCQkwOiAyNTYgQnl0ZXMgb3Igc21hbC4gKi8KKyNkZWZpbmUgSTJDXzA1S19ERVYJCSgxPDwxKQkJLyogCQkxOiA1MTIJQnl0ZXMJKi8KKyNkZWZpbmUgSTJDXzFLX0RFVgkJKDI8PDEpCQkvKgkJMjogMTAyNCBCeXRlcwkqLworI2RlZmluZSBJMkNfMktfREVWCQkoMzw8MSkJCS8qCQkzOiAyMDQ4CUJ5dGVzCSovCisjZGVmaW5lIEkyQ180S19ERVYJCSg0PDwxKQkJLyoJCTQ6IDQwOTYgQnl0ZXMJKi8KKyNkZWZpbmUgSTJDXzhLX0RFVgkJKDU8PDEpCQkvKgkJNTogODE5MiBCeXRlcwkqLworI2RlZmluZSBJMkNfMTZLX0RFVgkJKDY8PDEpCQkvKgkJNjogMTYzODQgQnl0ZXMJKi8KKyNkZWZpbmUgSTJDXzMyS19ERVYJCSg3PDwxKQkJLyoJCTc6IDMyNzY4IEJ5dGVzCSovCisjZGVmaW5lIEkyQ19TVE9QCQlCSVRfMAkJLyogSW50ZXJydXB0IEkyQyB0cmFuc2ZlciAqLworCisvKglCMl9JMkNfSVJRCQkzMiBiaXQJSTJDIEhXIElSUSBSZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgMzEuLiAxCXJlc2VydmVkICovCisjZGVmaW5lIEkyQ19DTFJfSVJRCQlCSVRfMAkvKiBDbGVhciBJMkMgSVJRICovCisKKy8qCUIyX0kyQ19TVwkJMzIgYml0ICg4IGJpdCBhY2Nlc3MpCUkyQyBIVyBTVyBQb3J0IFJlZ2lzdGVyICovCisJCQkJCQkJCS8qIEJpdCAgNy4uIDM6CXJlc2VydmVkICovCisjZGVmaW5lIEkyQ19EQVRBX0RJUglCSVRfMlMJCS8qIGRpcmVjdGlvbiBvZiBJMkNfREFUQSAqLworI2RlZmluZSBJMkNfREFUQQkJQklUXzFTCQkvKiBJMkMgRGF0YSBQb3J0CSovCisjZGVmaW5lIEkyQ19DTEsJCQlCSVRfMFMJCS8qIEkyQyBDbG9jayBQb3J0CSovCisKKy8qCisgKiBJMkMgQWRkcmVzcworICovCisjZGVmaW5lIEkyQ19TRU5TX0FERFIJTE04MF9BRERSCS8qIEkyQyBTZW5zb3IgQWRkcmVzcywgKFZvbHQgYW5kIFRlbXApKi8KKworCisvKglCMl9CU0NfQ1RSTAkJIDggYml0CUJsaW5rIFNvdXJjZSBDb3VudGVyIENvbnRyb2wgKi8KKwkJCQkJCQkvKiBCaXQgIDcuLiAyOglyZXNlcnZlZCAqLworI2RlZmluZSBCU0NfU1RBUlQJQklUXzFTCQkvKiBTdGFydCBCbGluayBTb3VyY2UgQ291bnRlciAqLworI2RlZmluZSBCU0NfU1RPUAlCSVRfMFMJCS8qIFN0b3AgIEJsaW5rIFNvdXJjZSBDb3VudGVyICovCisKKy8qCUIyX0JTQ19TVEFUCQkgOCBiaXQJQmxpbmsgU291cmNlIENvdW50ZXIgU3RhdHVzICovCisJCQkJCQkJLyogQml0ICA3Li4gMToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQlNDX1NSQwkJQklUXzBTCQkvKiBCbGluayBTb3VyY2UsIDA9T2ZmIC8gMT1PbiAqLworCisvKglCMl9CU0NfVFNUCQkxNiBiaXQJQmxpbmsgU291cmNlIENvdW50ZXIgVGVzdCBSZWcgKi8KKyNkZWZpbmUgQlNDX1RfT04JQklUXzJTCQkvKiBUZXN0IG1vZGUgb24gKi8KKyNkZWZpbmUgQlNDX1RfT0ZGCUJJVF8xUwkJLyogVGVzdCBtb2RlIG9mZiAqLworI2RlZmluZSBCU0NfVF9TVEVQCUJJVF8wUwkJLyogVGVzdCBzdGVwICovCisKKworLyoJQjNfUkFNX0FERFIJCTMyIGJpdAlSQU0gQWRkcmVzcywgdG8gcmVhZCBvciB3cml0ZSAqLworCQkJCQkvKiBCaXQgMzEuLjE5OglyZXNlcnZlZCAqLworI2RlZmluZSBSQU1fQURSX1JBTgkweDAwMDdmZmZmTAkvKiBCaXQgMTguLiAwOglSQU0gQWRkcmVzcyBSYW5nZSAqLworCisvKiBSQU0gSW50ZXJmYWNlIFJlZ2lzdGVycyAqLworLyoJQjNfUklfQ1RSTAkJMTYgYml0CVJBTSBJZmFjZSBDb250cm9sIFJlZ2lzdGVyICovCisJCQkJCQkJCS8qIEJpdCAxNS4uMTA6CXJlc2VydmVkICovCisjZGVmaW5lIFJJX0NMUl9SRF9QRVJSCUJJVF85UwkvKiBDbGVhciBJUlEgUkFNIFJlYWQgUGFyaXR5IEVyciAqLworI2RlZmluZSBSSV9DTFJfV1JfUEVSUglCSVRfOFMJLyogQ2xlYXIgSVJRIFJBTSBXcml0ZSBQYXJpdHkgRXJyKi8KKwkJCQkJCQkJLyogQml0CTcuLiAyOglyZXNlcnZlZCAqLworI2RlZmluZSBSSV9SU1RfQ0xSCQlCSVRfMVMJLyogQ2xlYXIgUkFNIEludGVyZmFjZSBSZXNldCAqLworI2RlZmluZSBSSV9SU1RfU0VUCQlCSVRfMFMJLyogU2V0ICAgUkFNIEludGVyZmFjZSBSZXNldCAqLworCisvKglCM19SSV9URVNUCQkgOCBiaXQJUkFNIElmYWNlIFRlc3QgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDE1Li4gNDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUklfVF9FVgkJCUJJVF8zUwkvKiBUaW1lb3V0IEV2ZW50IG9jY3VyZWQgKi8KKyNkZWZpbmUgUklfVF9PTgkJCUJJVF8yUwkvKiBUaW1lb3V0IFRpbWVyIFRlc3QgT24gKi8KKyNkZWZpbmUgUklfVF9PRkYJCUJJVF8xUwkvKiBUaW1lb3V0IFRpbWVyIFRlc3QgT2ZmICovCisjZGVmaW5lIFJJX1RfU1RFUAkJQklUXzBTCS8qIFRpbWVvdXQgVGltZXIgU3RlcCAqLworCisvKiBNQUMgQXJiaXRlciBSZWdpc3RlcnMgKi8KKy8qCUIzX01BX1RPX0NUUkwJMTYgYml0CU1BQyBBcmJpdGVyIFRpbWVvdXQgQ3RybCBSZWcgKi8KKwkJCQkJCQkJLyogQml0IDE1Li4gNDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUFfRk9FX09OCQlCSVRfM1MJLyogWE1BQyBGYXN0IE91dHB1dCBFbmFibGUgT04gKi8KKyNkZWZpbmUgTUFfRk9FX09GRgkJQklUXzJTCS8qIFhNQUMgRmFzdCBPdXRwdXQgRW5hYmxlIE9GRiAqLworI2RlZmluZSBNQV9SU1RfQ0xSCQlCSVRfMVMJLyogQ2xlYXIgTUFDIEFyYml0ZXIgUmVzZXQgKi8KKyNkZWZpbmUgTUFfUlNUX1NFVAkJQklUXzBTCS8qIFNldCAgIE1BQyBBcmJpdGVyIFJlc2V0ICovCisKKy8qCUIzX01BX1JDX0NUUkwJMTYgYml0CU1BQyBBcmJpdGVyIFJlY292ZXJ5IEN0cmwgUmVnICovCisJCQkJCQkJCS8qIEJpdCAxNS4uIDg6CXJlc2VydmVkICovCisjZGVmaW5lIE1BX0VOQV9SRUNfVFgyCUJJVF83UwkvKiBFbmFibGUgIFJlY292ZXJ5IFRpbWVyIFRYMiAqLworI2RlZmluZSBNQV9ESVNfUkVDX1RYMglCSVRfNlMJLyogRGlzYWJsZSBSZWNvdmVyeSBUaW1lciBUWDIgKi8KKyNkZWZpbmUgTUFfRU5BX1JFQ19UWDEJQklUXzVTCS8qIEVuYWJsZSAgUmVjb3ZlcnkgVGltZXIgVFgxICovCisjZGVmaW5lIE1BX0RJU19SRUNfVFgxCUJJVF80UwkvKiBEaXNhYmxlIFJlY292ZXJ5IFRpbWVyIFRYMSAqLworI2RlZmluZSBNQV9FTkFfUkVDX1JYMglCSVRfM1MJLyogRW5hYmxlICBSZWNvdmVyeSBUaW1lciBSWDIgKi8KKyNkZWZpbmUgTUFfRElTX1JFQ19SWDIJQklUXzJTCS8qIERpc2FibGUgUmVjb3ZlcnkgVGltZXIgUlgyICovCisjZGVmaW5lIE1BX0VOQV9SRUNfUlgxCUJJVF8xUwkvKiBFbmFibGUgIFJlY292ZXJ5IFRpbWVyIFJYMSAqLworI2RlZmluZSBNQV9ESVNfUkVDX1JYMQlCSVRfMFMJLyogRGlzYWJsZSBSZWNvdmVyeSBUaW1lciBSWDEgKi8KKworLyogUGFja2V0IEFyYml0ZXIgUmVnaXN0ZXJzICovCisvKglCM19QQV9DVFJMCQkxNiBiaXQJUGFja2V0IEFyYml0ZXIgQ3RybCBSZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgMTUuLjE0OglyZXNlcnZlZCAqLworI2RlZmluZSBQQV9DTFJfVE9fVFgyCUJJVF8xM1MJLyogQ2xlYXIgSVJRIFBhY2tldCBUaW1lb3V0IFRYMiAqLworI2RlZmluZSBQQV9DTFJfVE9fVFgxCUJJVF8xMlMJLyogQ2xlYXIgSVJRIFBhY2tldCBUaW1lb3V0IFRYMSAqLworI2RlZmluZSBQQV9DTFJfVE9fUlgyCUJJVF8xMVMJLyogQ2xlYXIgSVJRIFBhY2tldCBUaW1lb3V0IFJYMiAqLworI2RlZmluZSBQQV9DTFJfVE9fUlgxCUJJVF8xMFMJLyogQ2xlYXIgSVJRIFBhY2tldCBUaW1lb3V0IFJYMSAqLworI2RlZmluZSBQQV9FTkFfVE9fVFgyCUJJVF85UwkvKiBFbmFibGUgIFRpbWVvdXQgVGltZXIgVFgyICovCisjZGVmaW5lIFBBX0RJU19UT19UWDIJQklUXzhTCS8qIERpc2FibGUgVGltZW91dCBUaW1lciBUWDIgKi8KKyNkZWZpbmUgUEFfRU5BX1RPX1RYMQlCSVRfN1MJLyogRW5hYmxlICBUaW1lb3V0IFRpbWVyIFRYMSAqLworI2RlZmluZSBQQV9ESVNfVE9fVFgxCUJJVF82UwkvKiBEaXNhYmxlIFRpbWVvdXQgVGltZXIgVFgxICovCisjZGVmaW5lIFBBX0VOQV9UT19SWDIJQklUXzVTCS8qIEVuYWJsZSAgVGltZW91dCBUaW1lciBSWDIgKi8KKyNkZWZpbmUgUEFfRElTX1RPX1JYMglCSVRfNFMJLyogRGlzYWJsZSBUaW1lb3V0IFRpbWVyIFJYMiAqLworI2RlZmluZSBQQV9FTkFfVE9fUlgxCUJJVF8zUwkvKiBFbmFibGUgIFRpbWVvdXQgVGltZXIgUlgxICovCisjZGVmaW5lIFBBX0RJU19UT19SWDEJQklUXzJTCS8qIERpc2FibGUgVGltZW91dCBUaW1lciBSWDEgKi8KKyNkZWZpbmUgUEFfUlNUX0NMUgkJQklUXzFTCS8qIENsZWFyIE1BQyBBcmJpdGVyIFJlc2V0ICovCisjZGVmaW5lIFBBX1JTVF9TRVQJCUJJVF8wUwkvKiBTZXQgICBNQUMgQXJiaXRlciBSZXNldCAqLworCisjZGVmaW5lIFBBX0VOQV9UT19BTEwJKFBBX0VOQV9UT19SWDEgfCBQQV9FTkFfVE9fUlgyIHxcCisJCQkJCQlQQV9FTkFfVE9fVFgxIHwgUEFfRU5BX1RPX1RYMikKKworLyogUngvVHggUGF0aCByZWxhdGVkIEFyYml0ZXIgVGVzdCBSZWdpc3RlcnMgKi8KKy8qCUIzX01BX1RPX1RFU1QJMTYgYml0CU1BQyBBcmJpdGVyIFRpbWVvdXQgVGVzdCBSZWcgKi8KKy8qCUIzX01BX1JDX1RFU1QJMTYgYml0CU1BQyBBcmJpdGVyIFJlY292ZXJ5IFRlc3QgUmVnICovCisvKglCM19QQV9URVNUCQkxNiBiaXQJUGFja2V0IEFyYml0ZXIgVGVzdCBSZWdpc3RlciAqLworLyoJCQlCaXQgMTUsIDExLCA3LCBhbmQgMyBhcmUgcmVzZXJ2ZWQgaW4gQjNfUEFfVEVTVCAqLworI2RlZmluZSBUWDJfVF9FVglCSVRfMTVTCQkvKiBUWDIgVGltZW91dC9SZWN2IEV2ZW50IG9jY3VyZWQgKi8KKyNkZWZpbmUgVFgyX1RfT04JQklUXzE0UwkJLyogVFgyIFRpbWVvdXQvUmVjdiBUaW1lciBUZXN0IE9uICovCisjZGVmaW5lIFRYMl9UX09GRglCSVRfMTNTCQkvKiBUWDIgVGltZW91dC9SZWN2IFRpbWVyIFRzdCBPZmYgKi8KKyNkZWZpbmUgVFgyX1RfU1RFUAlCSVRfMTJTCQkvKiBUWDIgVGltZW91dC9SZWN2IFRpbWVyIFN0ZXAgKi8KKyNkZWZpbmUgVFgxX1RfRVYJQklUXzExUwkJLyogVFgxIFRpbWVvdXQvUmVjdiBFdmVudCBvY2N1cmVkICovCisjZGVmaW5lIFRYMV9UX09OCUJJVF8xMFMJCS8qIFRYMSBUaW1lb3V0L1JlY3YgVGltZXIgVGVzdCBPbiAqLworI2RlZmluZSBUWDFfVF9PRkYJQklUXzlTCQkvKiBUWDEgVGltZW91dC9SZWN2IFRpbWVyIFRzdCBPZmYgKi8KKyNkZWZpbmUgVFgxX1RfU1RFUAlCSVRfOFMJCS8qIFRYMSBUaW1lb3V0L1JlY3YgVGltZXIgU3RlcCAqLworI2RlZmluZSBSWDJfVF9FVglCSVRfN1MJCS8qIFJYMiBUaW1lb3V0L1JlY3YgRXZlbnQgb2NjdXJlZCAqLworI2RlZmluZSBSWDJfVF9PTglCSVRfNlMJCS8qIFJYMiBUaW1lb3V0L1JlY3YgVGltZXIgVGVzdCBPbiAqLworI2RlZmluZSBSWDJfVF9PRkYJQklUXzVTCQkvKiBSWDIgVGltZW91dC9SZWN2IFRpbWVyIFRzdCBPZmYgKi8KKyNkZWZpbmUgUlgyX1RfU1RFUAlCSVRfNFMJCS8qIFJYMiBUaW1lb3V0L1JlY3YgVGltZXIgU3RlcCAqLworI2RlZmluZSBSWDFfVF9FVglCSVRfM1MJCS8qIFJYMSBUaW1lb3V0L1JlY3YgRXZlbnQgb2NjdXJlZCAqLworI2RlZmluZSBSWDFfVF9PTglCSVRfMlMJCS8qIFJYMSBUaW1lb3V0L1JlY3YgVGltZXIgVGVzdCBPbiAqLworI2RlZmluZSBSWDFfVF9PRkYJQklUXzFTCQkvKiBSWDEgVGltZW91dC9SZWN2IFRpbWVyIFRzdCBPZmYgKi8KKyNkZWZpbmUgUlgxX1RfU1RFUAlCSVRfMFMJCS8qIFJYMSBUaW1lb3V0L1JlY3YgVGltZXIgU3RlcCAqLworCisKKy8qIFRyYW5zbWl0IEFyYml0ZXIgUmVnaXN0ZXJzIE1BQyAxIGFuZCAyLCB1c2UgTVJfQUREUigpIHRvIGFjY2VzcyAqLworLyoJVFhBX0lUSV9JTkkJCTMyIGJpdAlUeCBBcmIgSW50ZXJ2YWwgVGltZXIgSW5pdCBWYWwgKi8KKy8qCVRYQV9JVElfVkFMCQkzMiBiaXQJVHggQXJiIEludGVydmFsIFRpbWVyIFZhbHVlICovCisvKglUWEFfTElNX0lOSQkJMzIgYml0CVR4IEFyYiBMaW1pdCBDb3VudGVyIEluaXQgVmFsICovCisvKglUWEFfTElNX1ZBTAkJMzIgYml0CVR4IEFyYiBMaW1pdCBDb3VudGVyIFZhbHVlICovCisJCQkJCQkJCS8qIEJpdCAzMS4uMjQ6CXJlc2VydmVkICovCisjZGVmaW5lIFRYQV9NQVhfVkFMCTB4MDBmZmZmZmZVTC8qIEJpdCAyMy4uIDA6CU1heCBUWEEgVGltZXIvQ250IFZhbCAqLworCisvKglUWEFfQ1RSTAkJIDggYml0CVR4IEFyYml0ZXIgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBUWEFfRU5BX0ZTWU5DCUJJVF83UwkvKiBFbmFibGUgIGZvcmNlIG9mIHN5bmMgVHggcXVldWUgKi8KKyNkZWZpbmUgVFhBX0RJU19GU1lOQwlCSVRfNlMJLyogRGlzYWJsZSBmb3JjZSBvZiBzeW5jIFR4IHF1ZXVlICovCisjZGVmaW5lIFRYQV9FTkFfQUxMT0MJQklUXzVTCS8qIEVuYWJsZSAgYWxsb2Mgb2YgZnJlZSBiYW5kd2lkdGggKi8KKyNkZWZpbmUgVFhBX0RJU19BTExPQwlCSVRfNFMJLyogRGlzYWJsZSBhbGxvYyBvZiBmcmVlIGJhbmR3aWR0aCAqLworI2RlZmluZSBUWEFfU1RBUlRfUkMJQklUXzNTCS8qIFN0YXJ0IHN5bmMgUmF0ZSBDb250cm9sICovCisjZGVmaW5lIFRYQV9TVE9QX1JDCQlCSVRfMlMJLyogU3RvcCAgc3luYyBSYXRlIENvbnRyb2wgKi8KKyNkZWZpbmUgVFhBX0VOQV9BUkIJCUJJVF8xUwkvKiBFbmFibGUgIFR4IEFyYml0ZXIgKi8KKyNkZWZpbmUgVFhBX0RJU19BUkIJCUJJVF8wUwkvKiBEaXNhYmxlIFR4IEFyYml0ZXIgKi8KKworLyoJVFhBX1RFU1QJCSA4IGJpdAlUeCBBcmJpdGVyIFRlc3QgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDcuLiA2OglyZXNlcnZlZCAqLworI2RlZmluZSBUWEFfSU5UX1RfT04JQklUXzVTCS8qIFR4IEFyYiBJbnRlcnZhbCBUaW1lciBUZXN0IE9uICovCisjZGVmaW5lIFRYQV9JTlRfVF9PRkYJQklUXzRTCS8qIFR4IEFyYiBJbnRlcnZhbCBUaW1lciBUZXN0IE9mZiAqLworI2RlZmluZSBUWEFfSU5UX1RfU1RFUAlCSVRfM1MJLyogVHggQXJiIEludGVydmFsIFRpbWVyIFN0ZXAgKi8KKyNkZWZpbmUgVFhBX0xJTV9UX09OCUJJVF8yUwkvKiBUeCBBcmIgTGltaXQgVGltZXIgVGVzdCBPbiAqLworI2RlZmluZSBUWEFfTElNX1RfT0ZGCUJJVF8xUwkvKiBUeCBBcmIgTGltaXQgVGltZXIgVGVzdCBPZmYgKi8KKyNkZWZpbmUgVFhBX0xJTV9UX1NURVAJQklUXzBTCS8qIFR4IEFyYiBMaW1pdCBUaW1lciBTdGVwICovCisKKy8qCVRYQV9TVEFUCQkgOCBiaXQJVHggQXJiaXRlciBTdGF0dXMgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDcuLiAxOglyZXNlcnZlZCAqLworI2RlZmluZSBUWEFfUFJJT19YUwkJQklUXzBTCS8qIHN5bmMgcXVldWUgaGFzIHByaW8gdG8gc2VuZCAqLworCisvKglRX0JDCQkJMzIgYml0CUN1cnJlbnQgQnl0ZSBDb3VudGVyICovCisJCQkJCQkJCS8qIEJpdCAzMS4uMTY6CXJlc2VydmVkICovCisjZGVmaW5lIEJDX01BWAkJCTB4ZmZmZgkvKiBCaXQgMTUuLiAwOglCeXRlIGNvdW50ZXIgKi8KKworLyogQk1VIENvbnRyb2wgU3RhdHVzIFJlZ2lzdGVycyAqLworLyoJQjBfUjFfQ1NSCQkzMiBiaXQJQk1VIEN0cmwvU3RhdCBSeCBRdWV1ZSAxICovCisvKglCMF9SMl9DU1IJCTMyIGJpdAlCTVUgQ3RybC9TdGF0IFJ4IFF1ZXVlIDIgKi8KKy8qCUIwX1hBMV9DU1IJCTMyIGJpdAlCTVUgQ3RybC9TdGF0IFN5bmMgVHggUXVldWUgMSAqLworLyoJQjBfWFMxX0NTUgkJMzIgYml0CUJNVSBDdHJsL1N0YXQgQXN5bmMgVHggUXVldWUgMSAqLworLyoJQjBfWEEyX0NTUgkJMzIgYml0CUJNVSBDdHJsL1N0YXQgU3luYyBUeCBRdWV1ZSAyICovCisvKglCMF9YUzJfQ1NSCQkzMiBiaXQJQk1VIEN0cmwvU3RhdCBBc3luYyBUeCBRdWV1ZSAyICovCisvKglRX0NTUgkJCTMyIGJpdAlCTVUgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDMxLi4yNToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQ1NSX1NWX0lETEUJCUJJVF8yNAkJLyogQk1VIFNNIElkbGUgKi8KKwkJCQkJCQkJLyogQml0IDIzLi4yMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQ1NSX0RFU0NfQ0xSCUJJVF8yMQkJLyogQ2xlYXIgUmVzZXQgZm9yIERlc2NyICovCisjZGVmaW5lIENTUl9ERVNDX1NFVAlCSVRfMjAJCS8qIFNldCAgIFJlc2V0IGZvciBEZXNjciAqLworI2RlZmluZSBDU1JfRklGT19DTFIJQklUXzE5CQkvKiBDbGVhciBSZXNldCBmb3IgRklGTyAqLworI2RlZmluZSBDU1JfRklGT19TRVQJQklUXzE4CQkvKiBTZXQgICBSZXNldCBmb3IgRklGTyAqLworI2RlZmluZSBDU1JfSFBJX1JVTgkJQklUXzE3CQkvKiBSZWxlYXNlIEhQSSBTTSAqLworI2RlZmluZSBDU1JfSFBJX1JTVAkJQklUXzE2CQkvKiBSZXNldCAgIEhQSSBTTSB0byBJZGxlICovCisjZGVmaW5lIENTUl9TVl9SVU4JCUJJVF8xNQkJLyogUmVsZWFzZSBTdXBlcnZpc29yIFNNICovCisjZGVmaW5lIENTUl9TVl9SU1QJCUJJVF8xNAkJLyogUmVzZXQgICBTdXBlcnZpc29yIFNNICovCisjZGVmaW5lIENTUl9EUkVBRF9SVU4JQklUXzEzCQkvKiBSZWxlYXNlIERlc2NyIFJlYWQgU00gKi8KKyNkZWZpbmUgQ1NSX0RSRUFEX1JTVAlCSVRfMTIJCS8qIFJlc2V0ICAgRGVzY3IgUmVhZCBTTSAqLworI2RlZmluZSBDU1JfRFdSSVRFX1JVTglCSVRfMTEJCS8qIFJlbGVhc2UgRGVzY3IgV3JpdGUgU00gKi8KKyNkZWZpbmUgQ1NSX0RXUklURV9SU1QJQklUXzEwCQkvKiBSZXNldCAgIERlc2NyIFdyaXRlIFNNICovCisjZGVmaW5lIENTUl9UUkFOU19SVU4JQklUXzkJCS8qIFJlbGVhc2UgVHJhbnNmZXIgU00gKi8KKyNkZWZpbmUgQ1NSX1RSQU5TX1JTVAlCSVRfOAkJLyogUmVzZXQgICBUcmFuc2ZlciBTTSAqLworI2RlZmluZSBDU1JfRU5BX1BPTAkJQklUXzcJCS8qIEVuYWJsZSAgRGVzY3IgUG9sbGluZyAqLworI2RlZmluZSBDU1JfRElTX1BPTAkJQklUXzYJCS8qIERpc2FibGUgRGVzY3IgUG9sbGluZyAqLworI2RlZmluZSBDU1JfU1RPUAkJQklUXzUJCS8qIFN0b3AgIFJ4L1R4IFF1ZXVlICovCisjZGVmaW5lIENTUl9TVEFSVAkJQklUXzQJCS8qIFN0YXJ0IFJ4L1R4IFF1ZXVlICovCisjZGVmaW5lIENTUl9JUlFfQ0xfUAlCSVRfMwkJLyogKFJ4KQlDbGVhciBQYXJpdHkgSVJRICovCisjZGVmaW5lIENTUl9JUlFfQ0xfQglCSVRfMgkJLyogQ2xlYXIgRU9CIElSUSAqLworI2RlZmluZSBDU1JfSVJRX0NMX0YJQklUXzEJCS8qIENsZWFyIEVPRiBJUlEgKi8KKyNkZWZpbmUgQ1NSX0lSUV9DTF9DCUJJVF8wCQkvKiBDbGVhciBFUlIgSVJRICovCisKKyNkZWZpbmUgQ1NSX1NFVF9SRVNFVAkoQ1NSX0RFU0NfU0VUIHwgQ1NSX0ZJRk9fU0VUIHwgQ1NSX0hQSV9SU1QgfFwKKwkJCQkJCUNTUl9TVl9SU1QgfCBDU1JfRFJFQURfUlNUIHwgQ1NSX0RXUklURV9SU1QgfFwKKwkJCQkJCUNTUl9UUkFOU19SU1QpCisjZGVmaW5lIENTUl9DTFJfUkVTRVQJKENTUl9ERVNDX0NMUiB8IENTUl9GSUZPX0NMUiB8IENTUl9IUElfUlVOIHxcCisJCQkJCQlDU1JfU1ZfUlVOIHwgQ1NSX0RSRUFEX1JVTiB8IENTUl9EV1JJVEVfUlVOIHxcCisJCQkJCQlDU1JfVFJBTlNfUlVOKQorCisvKglRX0YJCQkJMzIgYml0CUZsYWcgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJCS8qIEJpdCAzMS4uMjg6CXJlc2VydmVkICovCisjZGVmaW5lIEZfQUxNX0ZVTEwJCUJJVF8yNwkJLyogUnggRklGTzogYWxtb3N0IGZ1bGwgKi8KKyNkZWZpbmUgRl9FTVBUWQkJCUJJVF8yNwkJLyogVHggRklGTzogZW1wdHkgZmxhZyAqLworI2RlZmluZSBGX0ZJRk9fRU9GCQlCSVRfMjYJCS8qIFRhZyAoRU9GIEZsYWcpIGJpdCBpbiBGSUZPICovCisjZGVmaW5lIEZfV01fUkVBQ0hFRAlCSVRfMjUJCS8qIFdhdGVybWFyayByZWFjaGVkICovCisJCQkJCQkJCQkvKiByZXNlcnZlZCAqLworI2RlZmluZSBGX0ZJRk9fTEVWRUwJKDB4MWZMPDwxNikJLyogQml0IDIzLi4xNjoJIyBvZiBRd29yZHMgaW4gRklGTyAqLworCQkJCQkJCQkJLyogQml0IDE1Li4xMTogCXJlc2VydmVkICovCisjZGVmaW5lIEZfV0FURVJfTUFSSwkweDAwMDdmZkwJLyogQml0IDEwLi4gMDoJV2F0ZXJtYXJrICovCisKKy8qCVFfVDEJCQkzMiBiaXQJVGVzdCBSZWdpc3RlciAxICovCisvKgkJSG9sZHMgZm91ciBTdGF0ZSBNYWNoaW5lIGNvbnRyb2wgQnl0ZXMgKi8KKyNkZWZpbmUgU01fQ1RSTF9TVl9NU0sJKDB4ZmZMPDwyNCkJLyogQml0IDMxLi4yNDoJQ29udHJvbCBTdXBlcnZpc29yIFNNICovCisjZGVmaW5lIFNNX0NUUkxfUkRfTVNLCSgweGZmTDw8MTYpCS8qIEJpdCAyMy4uMTY6CUNvbnRyb2wgUmVhZCBEZXNjIFNNICovCisjZGVmaW5lIFNNX0NUUkxfV1JfTVNLCSgweGZmTDw8OCkJLyogQml0IDE1Li4gODoJQ29udHJvbCBXcml0ZSBEZXNjIFNNICovCisjZGVmaW5lIFNNX0NUUkxfVFJfTVNLCTB4ZmZMCQkvKiBCaXQJNy4uIDA6CUNvbnRyb2wgVHJhbnNmZXIgU00gKi8KKworLyoJUV9UMV9UUgkJCSA4IGJpdAlUZXN0IFJlZ2lzdGVyIDEgVHJhbnNmZXIgU00gKi8KKy8qCVFfVDFfV1IJCQkgOCBiaXQJVGVzdCBSZWdpc3RlciAxIFdyaXRlIERlc2NyaXB0b3IgU00gKi8KKy8qCVFfVDFfUkQJCQkgOCBiaXQJVGVzdCBSZWdpc3RlciAxIFJlYWQgRGVzY3JpcHRvciBTTSAqLworLyoJUV9UMV9TVgkJCSA4IGJpdAlUZXN0IFJlZ2lzdGVyIDEgU3VwZXJ2aXNvciBTTSAqLworCisvKiBUaGUgY29udHJvbCBzdGF0dXMgYnl0ZSBvZiBlYWNoIG1hY2hpbmUgbG9va3MgbGlrZSAuLi4gKi8KKyNkZWZpbmUgU01fU1RBVEUJCTB4ZjAJLyogQml0IDcuLiA0OglTdGF0ZSB3aGljaCBzaGFsbCBiZSBsb2FkZWQgKi8KKyNkZWZpbmUgU01fTE9BRAkJCUJJVF8zUwkvKiBMb2FkIHRoZSBTTSB3aXRoIFNNX1NUQVRFICovCisjZGVmaW5lIFNNX1RFU1RfT04JCUJJVF8yUwkvKiBTd2l0Y2ggb24gU00gVGVzdCBNb2RlICovCisjZGVmaW5lIFNNX1RFU1RfT0ZGCQlCSVRfMVMJLyogR28gb2ZmIHRoZSBUZXN0IE1vZGUgKi8KKyNkZWZpbmUgU01fU1RFUAkJCUJJVF8wUwkvKiBTdGVwIHRoZSBTdGF0ZSBNYWNoaW5lICovCisvKiBUaGUgZW5jb2Rpbmcgb2YgdGhlIHN0YXRlcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBEaWFnbm9zdGljcyBUb29sICovCisKKy8qCVFfVDIJCQkzMiBiaXQJVGVzdCBSZWdpc3RlciAyCSovCisJCQkJCQkJCS8qIEJpdCAzMS4uIDg6CXJlc2VydmVkICovCisjZGVmaW5lIFQyX0FDX1RfT04JCUJJVF83CS8qIEFkZHJlc3MgQ291bnRlciBUZXN0IE1vZGUgb24gKi8KKyNkZWZpbmUgVDJfQUNfVF9PRkYJCUJJVF82CS8qIEFkZHJlc3MgQ291bnRlciBUZXN0IE1vZGUgb2ZmICovCisjZGVmaW5lIFQyX0JDX1RfT04JCUJJVF81CS8qIEJ5dGUgQ291bnRlciBUZXN0IE1vZGUgb24gKi8KKyNkZWZpbmUgVDJfQkNfVF9PRkYJCUJJVF80CS8qIEJ5dGUgQ291bnRlciBUZXN0IE1vZGUgb2ZmICovCisjZGVmaW5lIFQyX1NURVAwNAkJQklUXzMJLyogSW5jIEFDL0RlYyBCQyBieSA0ICovCisjZGVmaW5lIFQyX1NURVAwMwkJQklUXzIJLyogSW5jIEFDL0RlYyBCQyBieSAzICovCisjZGVmaW5lIFQyX1NURVAwMgkJQklUXzEJLyogSW5jIEFDL0RlYyBCQyBieSAyICovCisjZGVmaW5lIFQyX1NURVAwMQkJQklUXzAJLyogSW5jIEFDL0RlYyBCQyBieSAxICovCisKKy8qCVFfVDMJCQkzMiBiaXQJVGVzdCBSZWdpc3RlciAzCSovCisJCQkJCQkJCS8qIEJpdCAzMS4uIDc6CXJlc2VydmVkICovCisjZGVmaW5lIFQzX01VWF9NU0sJCSg3PDw0KQkvKiBCaXQgIDYuLiA0OglNdXggUG9zaXRpb24gKi8KKwkJCQkJCQkJLyogQml0ICAzOglyZXNlcnZlZCAqLworI2RlZmluZSBUM19WUkFNX01TSwkJNwkJLyogQml0ICAyLi4gMDoJVmlydHVhbCBSQU0gQnVmZmVyIEFkZHJlc3MgKi8KKworLyogUkFNIEJ1ZmZlciBSZWdpc3RlciBPZmZzZXRzLCB1c2UgUkJfQUREUihRdWV1ZSwgT2ZmcykgdG8gYWNjZXNzICovCisvKglSQl9TVEFSVAkJMzIgYml0CVJBTSBCdWZmZXIgU3RhcnQgQWRkcmVzcyAqLworLyoJUkJfRU5ECQkJMzIgYml0CVJBTSBCdWZmZXIgRW5kIEFkZHJlc3MgKi8KKy8qCVJCX1dQCQkJMzIgYml0CVJBTSBCdWZmZXIgV3JpdGUgUG9pbnRlciAqLworLyoJUkJfUlAJCQkzMiBiaXQJUkFNIEJ1ZmZlciBSZWFkIFBvaW50ZXIgKi8KKy8qCVJCX1JYX1VUUFAJCTMyIGJpdAlSeCBVcHBlciBUaHJlc2hvbGQsIFBhdXNlIFBhY2sgKi8KKy8qCVJCX1JYX0xUUFAJCTMyIGJpdAlSeCBMb3dlciBUaHJlc2hvbGQsIFBhdXNlIFBhY2sgKi8KKy8qCVJCX1JYX1VUSFAJCTMyIGJpdAlSeCBVcHBlciBUaHJlc2hvbGQsIEhpZ2ggUHJpbyAqLworLyoJUkJfUlhfTFRIUAkJMzIgYml0CVJ4IExvd2VyIFRocmVzaG9sZCwgSGlnaCBQcmlvICovCisvKglSQl9QQwkJCTMyIGJpdAlSQU0gQnVmZmVyIFBhY2tldCBDb3VudGVyICovCisvKglSQl9MRVYJCQkzMiBiaXQJUkFNIEJ1ZmZlciBMZXZlbCBSZWdpc3RlciAqLworCQkJCS8qIEJpdCAzMS4uMTk6CXJlc2VydmVkICovCisjZGVmaW5lIFJCX01TSwkweDAwMDdmZmZmCS8qIEJpdCAxOC4uIDA6CVJBTSBCdWZmZXIgUG9pbnRlciBCaXRzICovCisKKy8qCVJCX1RTVDIJCQkgOCBiaXQJUkFNIEJ1ZmZlciBUZXN0IFJlZ2lzdGVyIDIgKi8KKwkJCQkJCQkJLyogQml0IDcuLiA0OglyZXNlcnZlZCAqLworI2RlZmluZSBSQl9QQ19ERUMJCUJJVF8zUwkvKiBQYWNrZXQgQ291bnRlciBEZWNyZW0gKi8KKyNkZWZpbmUgUkJfUENfVF9PTgkJQklUXzJTCS8qIFBhY2tldCBDb3VudGVyIFRlc3QgT24gKi8KKyNkZWZpbmUgUkJfUENfVF9PRkYJCUJJVF8xUwkvKiBQYWNrZXQgQ291bnRlciBUc3QgT2ZmICovCisjZGVmaW5lIFJCX1BDX0lOQwkJQklUXzBTCS8qIFBhY2tldCBDb3VudGVyIEluY3JlbSAqLworCisvKglSQl9UU1QxCQkJIDggYml0CVJBTSBCdWZmZXIgVGVzdCBSZWdpc3RlciAxICovCisJCQkJCQkJLyogQml0IDc6CXJlc2VydmVkICovCisjZGVmaW5lIFJCX1dQX1RfT04JCUJJVF82UwkvKiBXcml0ZSBQb2ludGVyIFRlc3QgT24gKi8KKyNkZWZpbmUgUkJfV1BfVF9PRkYJCUJJVF81UwkvKiBXcml0ZSBQb2ludGVyIFRlc3QgT2ZmICovCisjZGVmaW5lIFJCX1dQX0lOQwkJQklUXzRTCS8qIFdyaXRlIFBvaW50ZXIgSW5jcmVtICovCisJCQkJCQkJCS8qIEJpdCAzOglyZXNlcnZlZCAqLworI2RlZmluZSBSQl9SUF9UX09OCQlCSVRfMlMJLyogUmVhZCBQb2ludGVyIFRlc3QgT24gKi8KKyNkZWZpbmUgUkJfUlBfVF9PRkYJCUJJVF8xUwkvKiBSZWFkIFBvaW50ZXIgVGVzdCBPZmYgKi8KKyNkZWZpbmUgUkJfUlBfREVDCQlCSVRfMFMJLyogUmVhZCBQb2ludGVyIERlY3JlbWVudCAqLworCisvKglSQl9DVFJMCQkJIDggYml0CVJBTSBCdWZmZXIgQ29udHJvbCBSZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgNy4uIDY6CXJlc2VydmVkICovCisjZGVmaW5lIFJCX0VOQV9TVEZXRAlCSVRfNVMJLyogRW5hYmxlICBTdG9yZSAmIEZvcndhcmQgKi8KKyNkZWZpbmUgUkJfRElTX1NURldECUJJVF80UwkvKiBEaXNhYmxlIFN0b3JlICYgRm9yd2FyZCAqLworI2RlZmluZSBSQl9FTkFfT1BfTUQJQklUXzNTCS8qIEVuYWJsZSAgT3BlcmF0aW9uIE1vZGUgKi8KKyNkZWZpbmUgUkJfRElTX09QX01ECUJJVF8yUwkvKiBEaXNhYmxlIE9wZXJhdGlvbiBNb2RlICovCisjZGVmaW5lIFJCX1JTVF9DTFIJCUJJVF8xUwkvKiBDbGVhciBSQU0gQnVmIFNUTSBSZXNldCAqLworI2RlZmluZSBSQl9SU1RfU0VUCQlCSVRfMFMJLyogU2V0ICAgUkFNIEJ1ZiBTVE0gUmVzZXQgKi8KKworCisvKiBSZWNlaXZlIGFuZCBUcmFuc21pdCBNQUMgRklGTyBSZWdpc3RlcnMgKEdFTkVTSVMgb25seSkgKi8KKworLyoJUlhfTUZGX0VBCQkzMiBiaXQJUmVjZWl2ZSBNQUMgRklGTyBFbmQgQWRkcmVzcyAqLworLyoJUlhfTUZGX1dQCQkzMiBiaXQgCVJlY2VpdmUgTUFDIEZJRk8gV3JpdGUgUG9pbnRlciAqLworLyoJUlhfTUZGX1JQCQkzMiBiaXQJUmVjZWl2ZSBNQUMgRklGTyBSZWFkIFBvaW50ZXIgKi8KKy8qCVJYX01GRl9QQwkJMzIgYml0CVJlY2VpdmUgTUFDIEZJRk8gUGFja2V0IENvdW50ZXIgKi8KKy8qCVJYX01GRl9MRVYJCTMyIGJpdAlSZWNlaXZlIE1BQyBGSUZPIExldmVsICovCisvKglUWF9NRkZfRUEJCTMyIGJpdAlUcmFuc21pdCBNQUMgRklGTyBFbmQgQWRkcmVzcyAqLworLyoJVFhfTUZGX1dQCQkzMiBiaXQgCVRyYW5zbWl0IE1BQyBGSUZPIFdyaXRlIFBvaW50ZXIgKi8KKy8qCVRYX01GRl9XU1AJCTMyIGJpdAlUcmFuc21pdCBNQUMgRklGTyBXUiBTaGFkb3cgUG9pbnRlciAqLworLyoJVFhfTUZGX1JQCQkzMiBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gUmVhZCBQb2ludGVyICovCisvKglUWF9NRkZfUEMJCTMyIGJpdAlUcmFuc21pdCBNQUMgRklGTyBQYWNrZXQgQ250ICovCisvKglUWF9NRkZfTEVWCQkzMiBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gTGV2ZWwgKi8KKwkJCQkJCQkJLyogQml0IDMxLi4gNjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUZGX01TSwkJCTB4MDA3ZkwJLyogQml0CTUuLiAwOglNQUMgRklGTyBBZGRyZXNzL1B0ciBCaXRzICovCisKKy8qCVJYX01GRl9DVFJMMQkxNiBiaXQJUmVjZWl2ZSBNQUMgRklGTyBDb250cm9sIFJlZyAxICovCisJCQkJCQkJCS8qIEJpdCAxNS4uMTQ6CXJlc2VydmVkICovCisjZGVmaW5lIE1GRl9FTkFfUkRZX1BBVAlCSVRfMTNTCQkvKiBFbmFibGUgIFJlYWR5IFBhdGNoICovCisjZGVmaW5lIE1GRl9ESVNfUkRZX1BBVAlCSVRfMTJTCQkvKiBEaXNhYmxlIFJlYWR5IFBhdGNoICovCisjZGVmaW5lIE1GRl9FTkFfVElNX1BBVAlCSVRfMTFTCQkvKiBFbmFibGUgIFRpbWluZyBQYXRjaCAqLworI2RlZmluZSBNRkZfRElTX1RJTV9QQVQJQklUXzEwUwkJLyogRGlzYWJsZSBUaW1pbmcgUGF0Y2ggKi8KKyNkZWZpbmUgTUZGX0VOQV9BTE1fRlVMCUJJVF85UwkJLyogRW5hYmxlICBBbG1vc3RGdWxsIFNpZ24gKi8KKyNkZWZpbmUgTUZGX0RJU19BTE1fRlVMCUJJVF84UwkJLyogRGlzYWJsZSBBbG1vc3RGdWxsIFNpZ24gKi8KKyNkZWZpbmUgTUZGX0VOQV9QQVVTRQlCSVRfN1MJCS8qIEVuYWJsZSAgUGF1c2UgU2lnbmFsaW5nICovCisjZGVmaW5lIE1GRl9ESVNfUEFVU0UJQklUXzZTCQkvKiBEaXNhYmxlIFBhdXNlIFNpZ25hbGluZyAqLworI2RlZmluZSBNRkZfRU5BX0ZMVVNICUJJVF81UwkJLyogRW5hYmxlICBGcmFtZSBGbHVzaGluZyAqLworI2RlZmluZSBNRkZfRElTX0ZMVVNICUJJVF80UwkJLyogRGlzYWJsZSBGcmFtZSBGbHVzaGluZyAqLworI2RlZmluZSBNRkZfRU5BX1RJU1QJQklUXzNTCQkvKiBFbmFibGUgIFRpbWUgU3RhbXAgR2VuZXIgKi8KKyNkZWZpbmUgTUZGX0RJU19USVNUCUJJVF8yUwkJLyogRGlzYWJsZSBUaW1lIFN0YW1wIEdlbmVyICovCisjZGVmaW5lIE1GRl9DTFJfSU5USVNUCUJJVF8xUwkJLyogQ2xlYXIgSVJRIE5vIFRpbWUgU3RhbXAgKi8KKyNkZWZpbmUgTUZGX0NMUl9JTlNUQVQJQklUXzBTCQkvKiBDbGVhciBJUlEgTm8gU3RhdHVzICovCisKKyNkZWZpbmUgTUZGX1JYX0NUUkxfREVGIE1GRl9FTkFfVElNX1BBVAorCisvKglUWF9NRkZfQ1RSTDEJMTYgYml0CVRyYW5zbWl0IE1BQyBGSUZPIENvbnRyb2wgUmVnIDEgKi8KKyNkZWZpbmUgTUZGX0NMUl9QRVJSCUJJVF8xNVMJCS8qIENsZWFyIFBhcml0eSBFcnJvciBJUlEgKi8KKwkJCQkJCQkJLyogQml0IDE0OglyZXNlcnZlZCAqLworI2RlZmluZSBNRkZfRU5BX1BLVF9SRUMJQklUXzEzUwkJLyogRW5hYmxlICBQYWNrZXQgUmVjb3ZlcnkgKi8KKyNkZWZpbmUgTUZGX0RJU19QS1RfUkVDIEJJVF8xMlMJCS8qIERpc2FibGUgUGFja2V0IFJlY292ZXJ5ICovCisvKglNRkZfRU5BX1RJTV9QQVQJIChzZWUgUlhfTUZGX0NUUkwxKSBCaXQgMTE6CUVuYWJsZSAgVGltaW5nIFBhdGNoICovCisvKglNRkZfRElTX1RJTV9QQVQJIChzZWUgUlhfTUZGX0NUUkwxKSBCaXQgMTA6CURpc2FibGUgVGltaW5nIFBhdGNoICovCisvKglNRkZfRU5BX0FMTV9GVUwJIChzZWUgUlhfTUZGX0NUUkwxKSBCaXQJIDk6CUVuYWJsZSAgQWxtb3N0IEZ1bGwgU2lnbiAqLworLyoJTUZGX0RJU19BTE1fRlVMCSAoc2VlIFJYX01GRl9DVFJMMSkgQml0CSA4OglEaXNhYmxlIEFsbW9zdCBGdWxsIFNpZ24gKi8KKyNkZWZpbmUgTUZGX0VOQV9XNEUJCUJJVF83UwkJLyogRW5hYmxlICBXYWl0IGZvciBFbXB0eSAqLworI2RlZmluZSBNRkZfRElTX1c0RQkJQklUXzZTCQkvKiBEaXNhYmxlIFdhaXQgZm9yIEVtcHR5ICovCisvKglNRkZfRU5BX0ZMVVNICSAoc2VlIFJYX01GRl9DVFJMMSkgQml0CSA1OglFbmFibGUgIEZyYW1lIEZsdXNoaW5nICovCisvKglNRkZfRElTX0ZMVVNICSAoc2VlIFJYX01GRl9DVFJMMSkgQml0CSA0OglEaXNhYmxlIEZyYW1lIEZsdXNoaW5nICovCisjZGVmaW5lIE1GRl9FTkFfTE9PUEIJQklUXzNTCQkvKiBFbmFibGUgIExvb3BiYWNrICovCisjZGVmaW5lIE1GRl9ESVNfTE9PUEIJQklUXzJTCQkvKiBEaXNhYmxlIExvb3BiYWNrICovCisjZGVmaW5lIE1GRl9DTFJfTUFDX1JTVAlCSVRfMVMJCS8qIENsZWFyIFhNQUMgUmVzZXQgKi8KKyNkZWZpbmUgTUZGX1NFVF9NQUNfUlNUCUJJVF8wUwkJLyogU2V0ICAgWE1BQyBSZXNldCAqLworCisjZGVmaW5lIE1GRl9UWF9DVFJMX0RFRgkoTUZGX0VOQV9QS1RfUkVDIHwgTUZGX0VOQV9USU1fUEFUIHwgTUZGX0VOQV9GTFVTSCkKKworLyoJUlhfTUZGX1RTVDIJIAkgOCBiaXQJUmVjZWl2ZSBNQUMgRklGTyBUZXN0IFJlZ2lzdGVyIDIgKi8KKy8qCVRYX01GRl9UU1QyCSAJIDggYml0CVRyYW5zbWl0IE1BQyBGSUZPIFRlc3QgUmVnaXN0ZXIgMiAqLworCQkJCQkJCQkvKiBCaXQgNzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUZGX1dTUF9UX09OCUJJVF82UwkvKiBUeDogV3JpdGUgU2hhZG93IFB0ciBUZXN0T24gKi8KKyNkZWZpbmUgTUZGX1dTUF9UX09GRglCSVRfNVMJLyogVHg6IFdyaXRlIFNoYWRvdyBQdHIgVHN0T2ZmICovCisjZGVmaW5lIE1GRl9XU1BfSU5DCQlCSVRfNFMJLyogVHg6IFdyaXRlIFNoYWRvdyBQdHIgSW5jcmVtZW50ICovCisjZGVmaW5lIE1GRl9QQ19ERUMJCUJJVF8zUwkvKiBQYWNrZXQgQ291bnRlciBEZWNyZW1lbnQgKi8KKyNkZWZpbmUgTUZGX1BDX1RfT04JCUJJVF8yUwkvKiBQYWNrZXQgQ291bnRlciBUZXN0IE9uICovCisjZGVmaW5lIE1GRl9QQ19UX09GRglCSVRfMVMJLyogUGFja2V0IENvdW50ZXIgVGVzdCBPZmYgKi8KKyNkZWZpbmUgTUZGX1BDX0lOQwkJQklUXzBTCS8qIFBhY2tldCBDb3VudGVyIEluY3JlbWVudCAqLworCisvKglSWF9NRkZfVFNUMQkgCSA4IGJpdAlSZWNlaXZlIE1BQyBGSUZPIFRlc3QgUmVnaXN0ZXIgMSAqLworLyoJVFhfTUZGX1RTVDEJIAkgOCBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gVGVzdCBSZWdpc3RlciAxICovCisJCQkJCS8qIEJpdCA3OglyZXNlcnZlZCAqLworI2RlZmluZSBNRkZfV1BfVF9PTgkJQklUXzZTCS8qIFdyaXRlIFBvaW50ZXIgVGVzdCBPbiAqLworI2RlZmluZSBNRkZfV1BfVF9PRkYJQklUXzVTCS8qIFdyaXRlIFBvaW50ZXIgVGVzdCBPZmYgKi8KKyNkZWZpbmUgTUZGX1dQX0lOQwkJQklUXzRTCS8qIFdyaXRlIFBvaW50ZXIgSW5jcmVtICovCisJCQkJCQkJLyogQml0IDM6CXJlc2VydmVkICovCisjZGVmaW5lIE1GRl9SUF9UX09OCQlCSVRfMlMJLyogUmVhZCBQb2ludGVyIFRlc3QgT24gKi8KKyNkZWZpbmUgTUZGX1JQX1RfT0ZGCUJJVF8xUwkvKiBSZWFkIFBvaW50ZXIgVGVzdCBPZmYgKi8KKyNkZWZpbmUgTUZGX1JQX0RFQwkJQklUXzBTCS8qIFJlYWQgUG9pbnRlciBEZWNyZW1lbnQgKi8KKworLyoJUlhfTUZGX0NUUkwyCSA4IGJpdAlSZWNlaXZlIE1BQyBGSUZPIENvbnRyb2wgUmVnIDIgKi8KKy8qCVRYX01GRl9DVFJMMgkgOCBiaXQJVHJhbnNtaXQgTUFDIEZJRk8gQ29udHJvbCBSZWcgMiAqLworCQkJCQkJCQkvKiBCaXQgNy4uNDoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUZGX0VOQV9PUF9NRAlCSVRfM1MJLyogRW5hYmxlICBPcGVyYXRpb24gTW9kZSAqLworI2RlZmluZSBNRkZfRElTX09QX01ECUJJVF8yUwkvKiBEaXNhYmxlIE9wZXJhdGlvbiBNb2RlICovCisjZGVmaW5lIE1GRl9SU1RfQ0xSCQlCSVRfMVMJLyogQ2xlYXIgTUFDIEZJRk8gUmVzZXQgKi8KKyNkZWZpbmUgTUZGX1JTVF9TRVQJCUJJVF8wUwkvKiBTZXQgICBNQUMgRklGTyBSZXNldCAqLworCisKKy8qCUxpbmsgTEVEIENvdW50ZXIgUmVnaXN0ZXJzIChHRU5FU0lTIG9ubHkpICovCisKKy8qCVJYX0xFRF9DVFJMCQkgOCBiaXQJUmVjZWl2ZSBMRUQgQ250IENvbnRyb2wgUmVnICovCisvKglUWF9MRURfQ1RSTAkJIDggYml0CVRyYW5zbWl0IExFRCBDbnQgQ29udHJvbCBSZWcgKi8KKy8qCUxOS19TWU5DX0NUUkwJIDggYml0CUxpbmsgU3luYyBDbnQgQ29udHJvbCBSZWdpc3RlciAqLworCQkJCQkJCS8qIEJpdCA3Li4gMzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTEVEX1NUQVJUCQlCSVRfMlMJLyogU3RhcnQgVGltZXIgKi8KKyNkZWZpbmUgTEVEX1NUT1AJCUJJVF8xUwkvKiBTdG9wIFRpbWVyICovCisjZGVmaW5lIExFRF9TVEFURQkJQklUXzBTCS8qIFJ4L1R4OiBMRUQgU3RhdGUsIDE9TEVEIG9uICovCisjZGVmaW5lIExFRF9DTFJfSVJRCQlCSVRfMFMJLyogTG5rOiAJQ2xlYXIgTGluayBJUlEgKi8KKworLyoJUlhfTEVEX1RTVAkJIDggYml0CVJlY2VpdmUgTEVEIENudCBUZXN0IFJlZ2lzdGVyICovCisvKglUWF9MRURfVFNUCQkgOCBiaXQJVHJhbnNtaXQgTEVEIENudCBUZXN0IFJlZ2lzdGVyICovCisvKglMTktfU1lOQ19UU1QJIDggYml0CUxpbmsgU3luYyBDbnQgVGVzdCBSZWdpc3RlciAqLworCQkJCQkJCS8qIEJpdCA3Li4gMzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTEVEX1RfT04JCUJJVF8yUwkvKiBMRUQgQ291bnRlciBUZXN0IG1vZGUgT24gKi8KKyNkZWZpbmUgTEVEX1RfT0ZGCQlCSVRfMVMJLyogTEVEIENvdW50ZXIgVGVzdCBtb2RlIE9mZiAqLworI2RlZmluZSBMRURfVF9TVEVQCQlCSVRfMFMJLyogTEVEIENvdW50ZXIgU3RlcCAqLworCisvKglMTktfTEVEX1JFRwkgCSA4IGJpdAlMaW5rIExFRCBSZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgNy4uIDY6CXJlc2VydmVkICovCisjZGVmaW5lIExFRF9CTEtfT04JCUJJVF81UwkvKiBMaW5rIExFRCBCbGlua2luZyBPbiAqLworI2RlZmluZSBMRURfQkxLX09GRgkJQklUXzRTCS8qIExpbmsgTEVEIEJsaW5raW5nIE9mZiAqLworI2RlZmluZSBMRURfU1lOQ19PTgkJQklUXzNTCS8qIFVzZSBTeW5jIFdpcmUgdG8gc3dpdGNoIExFRCAqLworI2RlZmluZSBMRURfU1lOQ19PRkYJQklUXzJTCS8qIERpc2FibGUgU3luYyBXaXJlIElucHV0ICovCisjZGVmaW5lIExFRF9PTgkJCUJJVF8xUwkvKiBzd2l0Y2ggTEVEIG9uICovCisjZGVmaW5lIExFRF9PRkYJCQlCSVRfMFMJLyogc3dpdGNoIExFRCBvZmYgKi8KKworLyoJUmVjZWl2ZSBhbmQgVHJhbnNtaXQgR01BQyBGSUZPIFJlZ2lzdGVycyAoWVVLT04gb25seSkgKi8KKworLyoJUlhfR01GX0VBCQkzMiBiaXQJUnggR01BQyBGSUZPIEVuZCBBZGRyZXNzICovCisvKglSWF9HTUZfQUZfVEhSCTMyIGJpdAlSeCBHTUFDIEZJRk8gQWxtb3N0IEZ1bGwgVGhyZXNoLiAqLworLyoJUlhfR01GX1dQCQkzMiBiaXQgCVJ4IEdNQUMgRklGTyBXcml0ZSBQb2ludGVyICovCisvKglSWF9HTUZfV0xFVgkJMzIgYml0IAlSeCBHTUFDIEZJRk8gV3JpdGUgTGV2ZWwgKi8KKy8qCVJYX0dNRl9SUAkJMzIgYml0IAlSeCBHTUFDIEZJRk8gUmVhZCBQb2ludGVyICovCisvKglSWF9HTUZfUkxFVgkJMzIgYml0IAlSeCBHTUFDIEZJRk8gUmVhZCBMZXZlbCAqLworLyoJVFhfR01GX0VBCQkzMiBiaXQJVHggR01BQyBGSUZPIEVuZCBBZGRyZXNzICovCisvKglUWF9HTUZfQUVfVEhSCTMyIGJpdAlUeCBHTUFDIEZJRk8gQWxtb3N0IEVtcHR5IFRocmVzaC4qLworLyoJVFhfR01GX1dQCQkzMiBiaXQgCVR4IEdNQUMgRklGTyBXcml0ZSBQb2ludGVyICovCisvKglUWF9HTUZfV1NQCQkzMiBiaXQgCVR4IEdNQUMgRklGTyBXcml0ZSBTaGFkb3cgUHRyLiAqLworLyoJVFhfR01GX1dMRVYJCTMyIGJpdCAJVHggR01BQyBGSUZPIFdyaXRlIExldmVsICovCisvKglUWF9HTUZfUlAJCTMyIGJpdCAJVHggR01BQyBGSUZPIFJlYWQgUG9pbnRlciAqLworLyoJVFhfR01GX1JTVFAJCTMyIGJpdCAJVHggR01BQyBGSUZPIFJlc3RhcnQgUG9pbnRlciAqLworLyoJVFhfR01GX1JMRVYJCTMyIGJpdCAJVHggR01BQyBGSUZPIFJlYWQgTGV2ZWwgKi8KKworLyoJUlhfR01GX0NUUkxfVAkzMiBiaXQJUnggR01BQyBGSUZPIENvbnRyb2wvVGVzdCAqLworCQkJCQkJLyogQml0cyAzMS4uMTU6CXJlc2VydmVkICovCisjZGVmaW5lIEdNRl9XUF9UU1RfT04JQklUXzE0CQkvKiBXcml0ZSBQb2ludGVyIFRlc3QgT24gKi8KKyNkZWZpbmUgR01GX1dQX1RTVF9PRkYJQklUXzEzCQkvKiBXcml0ZSBQb2ludGVyIFRlc3QgT2ZmICovCisjZGVmaW5lIEdNRl9XUF9TVEVQCQlCSVRfMTIJCS8qIFdyaXRlIFBvaW50ZXIgU3RlcC9JbmNyZW1lbnQgKi8KKwkJCQkJCS8qIEJpdCAxMToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgR01GX1JQX1RTVF9PTglCSVRfMTAJCS8qIFJlYWQgUG9pbnRlciBUZXN0IE9uICovCisjZGVmaW5lIEdNRl9SUF9UU1RfT0ZGCUJJVF85CQkvKiBSZWFkIFBvaW50ZXIgVGVzdCBPZmYgKi8KKyNkZWZpbmUgR01GX1JQX1NURVAJCUJJVF84CQkvKiBSZWFkIFBvaW50ZXIgU3RlcC9JbmNyZW1lbnQgKi8KKyNkZWZpbmUgR01GX1JYX0ZfRkxfT04JQklUXzcJCS8qIFJ4IEZJRk8gRmx1c2ggTW9kZSBPbiAqLworI2RlZmluZSBHTUZfUlhfRl9GTF9PRkYJQklUXzYJCS8qIFJ4IEZJRk8gRmx1c2ggTW9kZSBPZmYgKi8KKyNkZWZpbmUgR01GX0NMSV9SWF9GTwlCSVRfNQkJLyogQ2xlYXIgSVJRIFJ4IEZJRk8gT3ZlcnJ1biAqLworI2RlZmluZSBHTUZfQ0xJX1JYX0ZDCUJJVF80CQkvKiBDbGVhciBJUlEgUnggRnJhbWUgQ29tcGxldGUgKi8KKyNkZWZpbmUgR01GX09QRVJfT04JCUJJVF8zCQkvKiBPcGVyYXRpb25hbCBNb2RlIE9uICovCisjZGVmaW5lIEdNRl9PUEVSX09GRglCSVRfMgkJLyogT3BlcmF0aW9uYWwgTW9kZSBPZmYgKi8KKyNkZWZpbmUgR01GX1JTVF9DTFIJCUJJVF8xCQkvKiBDbGVhciBHTUFDIEZJRk8gUmVzZXQgKi8KKyNkZWZpbmUgR01GX1JTVF9TRVQJCUJJVF8wCQkvKiBTZXQgICBHTUFDIEZJRk8gUmVzZXQgKi8KKworLyoJVFhfR01GX0NUUkxfVAkzMiBiaXQJVHggR01BQyBGSUZPIENvbnRyb2wvVGVzdCAqLworCQkJCQkJLyogQml0cyAzMS4uMTk6CXJlc2VydmVkICovCisjZGVmaW5lIEdNRl9XU1BfVFNUX09OCUJJVF8xOAkJLyogV3JpdGUgU2hhZG93IFBvaW50ZXIgVGVzdCBPbiAqLworI2RlZmluZSBHTUZfV1NQX1RTVF9PRkYJQklUXzE3CQkvKiBXcml0ZSBTaGFkb3cgUG9pbnRlciBUZXN0IE9mZiAqLworI2RlZmluZSBHTUZfV1NQX1NURVAJQklUXzE2CQkvKiBXcml0ZSBTaGFkb3cgUG9pbnRlciBTdGVwL0luY3JlbWVudCAqLworCQkJCQkJLyogQml0cyAxNS4uNzogc2FtZSBhcyBmb3IgUlhfR01GX0NUUkxfVCAqLworI2RlZmluZSBHTUZfQ0xJX1RYX0ZVCUJJVF82CQkvKiBDbGVhciBJUlEgVHggRklGTyBVbmRlcnJ1biAqLworI2RlZmluZSBHTUZfQ0xJX1RYX0ZDCUJJVF81CQkvKiBDbGVhciBJUlEgVHggRnJhbWUgQ29tcGxldGUgKi8KKyNkZWZpbmUgR01GX0NMSV9UWF9QRQlCSVRfNAkJLyogQ2xlYXIgSVJRIFR4IFBhcml0eSBFcnJvciAqLworCQkJCQkJLyogQml0cyAzLi4wOiBzYW1lIGFzIGZvciBSWF9HTUZfQ1RSTF9UICovCisKKyNkZWZpbmUgR01GX1JYX0NUUkxfREVGCQkoR01GX09QRVJfT04gfCBHTUZfUlhfRl9GTF9PTikKKyNkZWZpbmUgR01GX1RYX0NUUkxfREVGCQlHTUZfT1BFUl9PTgorCisjZGVmaW5lIFJYX0dNRl9GTF9USFJfREVGCTB4MGEJLyogUnggR01BQyBGSUZPIEZsdXNoIFRocmVzaG9sZCBkZWZhdWx0ICovCisKKy8qCUdNQUNfVElfU1RfQ1RSTAkgOCBiaXQJVGltZSBTdGFtcCBUaW1lciBDdHJsIFJlZyAoWVVLT04gb25seSkgKi8KKwkJCQkJCQkJLyogQml0IDcuLiAzOglyZXNlcnZlZCAqLworI2RlZmluZSBHTVRfU1RfU1RBUlQJQklUXzJTCQkvKiBTdGFydCBUaW1lIFN0YW1wIFRpbWVyICovCisjZGVmaW5lIEdNVF9TVF9TVE9QCQlCSVRfMVMJCS8qIFN0b3AgIFRpbWUgU3RhbXAgVGltZXIgKi8KKyNkZWZpbmUgR01UX1NUX0NMUl9JUlEJQklUXzBTCQkvKiBDbGVhciBUaW1lIFN0YW1wIFRpbWVyIElSUSAqLworCisvKglHTUFDX0NUUkwJCTMyIGJpdAlHTUFDIENvbnRyb2wgUmVnIChZVUtPTiBvbmx5KSAqLworCQkJCQkJLyogQml0cyAzMS4uIDg6CXJlc2VydmVkICovCisjZGVmaW5lIEdNQ19IX0JVUlNUX09OCUJJVF83CQkvKiBIYWxmIER1cGxleCBCdXJzdCBNb2RlIE9uICovCisjZGVmaW5lIEdNQ19IX0JVUlNUX09GRglCSVRfNgkJLyogSGFsZiBEdXBsZXggQnVyc3QgTW9kZSBPZmYgKi8KKyNkZWZpbmUgR01DX0ZfTE9PUEJfT04JQklUXzUJCS8qIEZJRk8gTG9vcGJhY2sgT24gKi8KKyNkZWZpbmUgR01DX0ZfTE9PUEJfT0ZGCUJJVF80CQkvKiBGSUZPIExvb3BiYWNrIE9mZiAqLworI2RlZmluZSBHTUNfUEFVU0VfT04JQklUXzMJCS8qIFBhdXNlIE9uICovCisjZGVmaW5lIEdNQ19QQVVTRV9PRkYJQklUXzIJCS8qIFBhdXNlIE9mZiAqLworI2RlZmluZSBHTUNfUlNUX0NMUgkJQklUXzEJCS8qIENsZWFyIEdNQUMgUmVzZXQgKi8KKyNkZWZpbmUgR01DX1JTVF9TRVQJCUJJVF8wCQkvKiBTZXQgICBHTUFDIFJlc2V0ICovCisKKy8qCUdQSFlfQ1RSTAkJMzIgYml0CUdQSFkgQ29udHJvbCBSZWcgKFlVS09OIG9ubHkpICovCisJCQkJCQkvKiBCaXRzIDMxLi4yOToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgR1BDX1NFTF9CRFQJCUJJVF8yOAkvKiBTZWxlY3QgQmktRGlyLiBUcmFuc2ZlciBmb3IgTURDL01ESU8gKi8KKyNkZWZpbmUgR1BDX0lOVF9QT0xfSEkJQklUXzI3CS8qIElSUSBQb2xhcml0eSBpcyBBY3RpdmUgSElHSCAqLworI2RlZmluZSBHUENfNzVfT0hNCQlCSVRfMjYJLyogVXNlIDc1IE9obSBUZXJtaW5hdGlvbiBpbnN0ZWFkIG9mIDUwICovCisjZGVmaW5lIEdQQ19ESVNfRkMJCUJJVF8yNQkvKiBEaXNhYmxlIEF1dG9tYXRpYyBGaWJlci9Db3BwZXIgRGV0ZWN0aW9uICovCisjZGVmaW5lIEdQQ19ESVNfU0xFRVAJQklUXzI0CS8qIERpc2FibGUgRW5lcmd5IERldGVjdCAqLworI2RlZmluZSBHUENfSFdDRkdfTV8zCUJJVF8yMwkvKiBIV0NGR19NT0RFWzNdICovCisjZGVmaW5lIEdQQ19IV0NGR19NXzIJQklUXzIyCS8qIEhXQ0ZHX01PREVbMl0gKi8KKyNkZWZpbmUgR1BDX0hXQ0ZHX01fMQlCSVRfMjEJLyogSFdDRkdfTU9ERVsxXSAqLworI2RlZmluZSBHUENfSFdDRkdfTV8wCUJJVF8yMAkvKiBIV0NGR19NT0RFWzBdICovCisjZGVmaW5lIEdQQ19BTkVHXzAJCUJJVF8xOQkvKiBBTkVHWzBdICovCisjZGVmaW5lIEdQQ19FTkFfWEMJCUJJVF8xOAkvKiBFbmFibGUgTURJIGNyb3Nzb3ZlciAqLworI2RlZmluZSBHUENfRElTXzEyNQkJQklUXzE3CS8qIERpc2FibGUgMTI1IE1IeiBjbG9jayAqLworI2RlZmluZSBHUENfQU5FR18zCQlCSVRfMTYJLyogQU5FR1szXSAqLworI2RlZmluZSBHUENfQU5FR18yCQlCSVRfMTUJLyogQU5FR1syXSAqLworI2RlZmluZSBHUENfQU5FR18xCQlCSVRfMTQJLyogQU5FR1sxXSAqLworI2RlZmluZSBHUENfRU5BX1BBVVNFCUJJVF8xMwkvKiBFbmFibGUgUGF1c2UgKFNZTV9PUl9SRU0pICovCisjZGVmaW5lIEdQQ19QSFlBRERSXzQJQklUXzEyCS8qIEJpdCA0IG9mIFBoeSBBZGRyICovCisjZGVmaW5lIEdQQ19QSFlBRERSXzMJQklUXzExCS8qIEJpdCAzIG9mIFBoeSBBZGRyICovCisjZGVmaW5lIEdQQ19QSFlBRERSXzIJQklUXzEwCS8qIEJpdCAyIG9mIFBoeSBBZGRyICovCisjZGVmaW5lIEdQQ19QSFlBRERSXzEJQklUXzkJLyogQml0IDEgb2YgUGh5IEFkZHIgKi8KKyNkZWZpbmUgR1BDX1BIWUFERFJfMAlCSVRfOAkvKiBCaXQgMCBvZiBQaHkgQWRkciAqLworCQkJCQkJLyogQml0cyAgNy4uMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgR1BDX1JTVF9DTFIJCUJJVF8xCS8qIENsZWFyIEdQSFkgUmVzZXQgKi8KKyNkZWZpbmUgR1BDX1JTVF9TRVQJCUJJVF8wCS8qIFNldCAgIEdQSFkgUmVzZXQgKi8KKworI2RlZmluZSBHUENfSFdDRkdfR01JSV9DT1AJKEdQQ19IV0NGR19NXzMgfCBHUENfSFdDRkdfTV8yIHwgXAorCQkJCQkJCSBHUENfSFdDRkdfTV8xIHwgR1BDX0hXQ0ZHX01fMCkKKworI2RlZmluZSBHUENfSFdDRkdfR01JSV9GSUIJKAkJCQkgR1BDX0hXQ0ZHX01fMiB8IFwKKwkJCQkJCQkgR1BDX0hXQ0ZHX01fMSB8IEdQQ19IV0NGR19NXzApCisKKyNkZWZpbmUgR1BDX0FORUdfQURWX0FMTF9NCShHUENfQU5FR18zIHwgR1BDX0FORUdfMiB8IFwKKwkJCQkJCQkgR1BDX0FORUdfMSB8IEdQQ19BTkVHXzApCisKKy8qIGZvcmNlZCBzcGVlZCBhbmQgZHVwbGV4IG1vZGUgKGRvbid0IG1peCB3aXRoIG90aGVyIEFORUcgYml0cykgKi8KKyNkZWZpbmUgR1BDX0ZSQzEwTUJJVF9IQUxGCTAKKyNkZWZpbmUgR1BDX0ZSQzEwTUJJVF9GVUxMCUdQQ19BTkVHXzAKKyNkZWZpbmUgR1BDX0ZSQzEwME1CSVRfSEFMRglHUENfQU5FR18xCisjZGVmaW5lIEdQQ19GUkMxMDBNQklUX0ZVTEwJKEdQQ19BTkVHXzAgfCBHUENfQU5FR18xKQorCisvKiBhdXRvLW5lZ290aWF0aW9uIHdpdGggbGltaXRlZCBhZHZlcnRpc2VkIHNwZWVkcyAqLworLyogbWl4IG9ubHkgd2l0aCBtYXN0ZXIvc2xhdmUgc2V0dGluZ3MgKGZvciBjb3BwZXIpICovCisjZGVmaW5lIEdQQ19BRFZfMTAwMF9IQUxGCUdQQ19BTkVHXzIKKyNkZWZpbmUgR1BDX0FEVl8xMDAwX0ZVTEwJR1BDX0FORUdfMworI2RlZmluZSBHUENfQURWX0FMTAkJCShHUENfQU5FR18yIHwgR1BDX0FORUdfMykKKworLyogbWFzdGVyL3NsYXZlIHNldHRpbmdzICovCisvKiBvbmx5IGZvciBjb3BwZXIgd2l0aCAxMDAwIE1icHMgKi8KKyNkZWZpbmUgR1BDX0ZPUkNFX01BU1RFUgkwCisjZGVmaW5lIEdQQ19GT1JDRV9TTEFWRQkJR1BDX0FORUdfMAorI2RlZmluZSBHUENfUFJFRl9NQVNURVIJCUdQQ19BTkVHXzEKKyNkZWZpbmUgR1BDX1BSRUZfU0xBVkUJCShHUENfQU5FR18xIHwgR1BDX0FORUdfMCkKKworLyoJR01BQ19JUlFfU1JDCSA4IGJpdAlHTUFDIEludGVycnVwdCBTb3VyY2UgUmVnIChZVUtPTiBvbmx5KSAqLworLyoJR01BQ19JUlFfTVNLCSA4IGJpdAlHTUFDIEludGVycnVwdCBNYXNrICAgUmVnIChZVUtPTiBvbmx5KSAqLworI2RlZmluZSBHTV9JU19UWF9DT19PVglCSVRfNQkJLyogVHJhbnNtaXQgQ291bnRlciBPdmVyZmxvdyBJUlEgKi8KKyNkZWZpbmUgR01fSVNfUlhfQ09fT1YJQklUXzQJCS8qIFJlY2VpdmUgQ291bnRlciBPdmVyZmxvdyBJUlEgKi8KKyNkZWZpbmUgR01fSVNfVFhfRkZfVVIJQklUXzMJCS8qIFRyYW5zbWl0IEZJRk8gVW5kZXJydW4gKi8KKyNkZWZpbmUgR01fSVNfVFhfQ09NUEwJQklUXzIJCS8qIEZyYW1lIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSAqLworI2RlZmluZSBHTV9JU19SWF9GRl9PUglCSVRfMQkJLyogUmVjZWl2ZSBGSUZPIE92ZXJydW4gKi8KKyNkZWZpbmUgR01fSVNfUlhfQ09NUEwJQklUXzAJCS8qIEZyYW1lIFJlY2VwdGlvbiBDb21wbGV0ZSAqLworCisjZGVmaW5lIEdNQUNfREVGX01TSwkoR01fSVNfVFhfQ09fT1YgfCBHTV9JU19SWF9DT19PViB8IFwKKwkJCQkJCUdNX0lTX1RYX0ZGX1VSKQorCisvKglHTUFDX0xJTktfQ1RSTAkxNiBiaXQJR01BQyBMaW5rIENvbnRyb2wgUmVnIChZVUtPTiBvbmx5KSAqLworCQkJCQkJLyogQml0cyAxNS4uIDI6CXJlc2VydmVkICovCisjZGVmaW5lIEdNTENfUlNUX0NMUglCSVRfMVMJCS8qIENsZWFyIEdNQUMgTGluayBSZXNldCAqLworI2RlZmluZSBHTUxDX1JTVF9TRVQJQklUXzBTCQkvKiBTZXQgICBHTUFDIExpbmsgUmVzZXQgKi8KKworCisvKglXT0xfQ1RSTF9TVEFUCTE2IGJpdAlXT0wgQ29udHJvbC9TdGF0dXMgUmVnICovCisjZGVmaW5lIFdPTF9DVExfTElOS19DSEdfT0NDCQkJQklUXzE1UworI2RlZmluZSBXT0xfQ1RMX01BR0lDX1BLVF9PQ0MJCQlCSVRfMTRTCisjZGVmaW5lIFdPTF9DVExfUEFUVEVSTl9PQ0MJCQkJQklUXzEzUworCisjZGVmaW5lIFdPTF9DVExfQ0xFQVJfUkVTVUxUCQkJQklUXzEyUworCisjZGVmaW5lIFdPTF9DVExfRU5BX1BNRV9PTl9MSU5LX0NIRwkJQklUXzExUworI2RlZmluZSBXT0xfQ1RMX0RJU19QTUVfT05fTElOS19DSEcJCUJJVF8xMFMKKyNkZWZpbmUgV09MX0NUTF9FTkFfUE1FX09OX01BR0lDX1BLVAlCSVRfOVMKKyNkZWZpbmUgV09MX0NUTF9ESVNfUE1FX09OX01BR0lDX1BLVAlCSVRfOFMKKyNkZWZpbmUgV09MX0NUTF9FTkFfUE1FX09OX1BBVFRFUk4JCUJJVF83UworI2RlZmluZSBXT0xfQ1RMX0RJU19QTUVfT05fUEFUVEVSTgkJQklUXzZTCisKKyNkZWZpbmUgV09MX0NUTF9FTkFfTElOS19DSEdfVU5JVAkJQklUXzVTCisjZGVmaW5lIFdPTF9DVExfRElTX0xJTktfQ0hHX1VOSVQJCUJJVF80UworI2RlZmluZSBXT0xfQ1RMX0VOQV9NQUdJQ19QS1RfVU5JVAkJQklUXzNTCisjZGVmaW5lIFdPTF9DVExfRElTX01BR0lDX1BLVF9VTklUCQlCSVRfMlMKKyNkZWZpbmUgV09MX0NUTF9FTkFfUEFUVEVSTl9VTklUCQlCSVRfMVMKKyNkZWZpbmUgV09MX0NUTF9ESVNfUEFUVEVSTl9VTklUCQlCSVRfMFMKKworI2RlZmluZSBXT0xfQ1RMX0RFRkFVTFQJCQkJXAorCShXT0xfQ1RMX0RJU19QTUVfT05fTElOS19DSEcgfAlcCisJV09MX0NUTF9ESVNfUE1FX09OX1BBVFRFUk4gfAlcCisJV09MX0NUTF9ESVNfUE1FX09OX01BR0lDX1BLVCB8CVwKKwlXT0xfQ1RMX0RJU19MSU5LX0NIR19VTklUIHwJCVwKKwlXT0xfQ1RMX0RJU19QQVRURVJOX1VOSVQgfAkJXAorCVdPTF9DVExfRElTX01BR0lDX1BLVF9VTklUKQorCisvKglXT0xfTUFUQ0hfQ1RMCSA4IGJpdAlXT0wgTWF0Y2ggQ29udHJvbCBSZWcgKi8KKyNkZWZpbmUgV09MX0NUTF9QQVRUX0VOQSh4KQkJCQkoQklUXzAgPDwgKHgpKQorCisjZGVmaW5lIFNLX05VTV9XT0xfUEFUVEVSTgkJNworI2RlZmluZSBTS19QQVRURVJOX1BFUl9XT1JECQk0CisjZGVmaW5lIFNLX0JJVE1BU0tfUEFUVEVSTgkJNworI2RlZmluZSBTS19QT1dfUEFUVEVSTl9MRU5HVEgJMTI4CisKKyNkZWZpbmUgV09MX0xFTkdUSF9NU0sJCTB4N2YKKyNkZWZpbmUgV09MX0xFTkdUSF9TSElGVAk4CisKKworLyogUmVjZWl2ZSBhbmQgVHJhbnNtaXQgRGVzY3JpcHRvcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUcmFuc21pdCBEZXNjcmlwdG9yIHN0cnVjdCAqLwordHlwZWRlZglzdHJ1Y3Qgc19Id1R4ZCB7CisJU0tfVTMyIHZvbGF0aWxlCVR4Q3RybDsJLyogVHJhbnNtaXQgQnVmZmVyIENvbnRyb2wgRmllbGQgKi8KKwlTS19VMzIJVHhOZXh0OwkJCS8qIFBoeXNpY2FsIEFkZHJlc3MgUG9pbnRlciB0byB0aGUgbmV4dCBUeEQgKi8KKwlTS19VMzIJVHhBZHJMbzsJCS8qIFBoeXNpY2FsIFR4IEJ1ZmZlciBBZGRyZXNzIGxvd2VyIGR3b3JkICovCisJU0tfVTMyCVR4QWRySGk7CQkvKiBQaHlzaWNhbCBUeCBCdWZmZXIgQWRkcmVzcyB1cHBlciBkd29yZCAqLworCVNLX1UzMglUeFN0YXQ7CQkJLyogVHJhbnNtaXQgRnJhbWUgU3RhdHVzIFdvcmQgKi8KKyNpZm5kZWYJU0tfVVNFX1JFVl9ERVNDCisJU0tfVTE2CVR4VGNwT2ZmczsJCS8qIFRDUCBDaGVja3N1bSBDYWxjdWxhdGlvbiBTdGFydCBWYWx1ZSAqLworCVNLX1UxNglUeFJlczE7CQkJLyogMTYgYml0IHJlc2VydmVkIGZpZWxkICovCisJU0tfVTE2CVR4VGNwV3A7CQkvKiBUQ1AgQ2hlY2tzdW0gV3JpdGUgUG9zaXRpb24gKi8KKwlTS19VMTYJVHhUY3BTcDsJCS8qIFRDUCBDaGVja3N1bSBDYWxjdWxhdGlvbiBTdGFydCBQb3NpdGlvbiAqLworI2Vsc2UJLyogU0tfVVNFX1JFVl9ERVNDICovCisJU0tfVTE2CVR4UmVzMTsJCQkvKiAxNiBiaXQgcmVzZXJ2ZWQgZmllbGQgKi8KKwlTS19VMTYJVHhUY3BPZmZzOwkJLyogVENQIENoZWNrc3VtIENhbGN1bGF0aW9uIFN0YXJ0IFZhbHVlICovCisJU0tfVTE2CVR4VGNwU3A7CQkvKiBUQ1AgQ2hlY2tzdW0gQ2FsY3VsYXRpb24gU3RhcnQgUG9zaXRpb24gKi8KKwlTS19VMTYJVHhUY3BXcDsJCS8qIFRDUCBDaGVja3N1bSBXcml0ZSBQb3NpdGlvbiAqLworI2VuZGlmCS8qIFNLX1VTRV9SRVZfREVTQyAqLworCVNLX1UzMiAgVHhSZXMyOwkJCS8qIDMyIGJpdCByZXNlcnZlZCBmaWVsZCAqLworfSBTS19IV1RYRDsKKworLyogUmVjZWl2ZSBEZXNjcmlwdG9yIHN0cnVjdCAqLwordHlwZWRlZglzdHJ1Y3Qgc19Id1J4ZCB7CisJU0tfVTMyIHZvbGF0aWxlIFJ4Q3RybDsJLyogUmVjZWl2ZSBCdWZmZXIgQ29udHJvbCBGaWVsZCAqLworCVNLX1UzMglSeE5leHQ7CQkJLyogUGh5c2ljYWwgQWRkcmVzcyBQb2ludGVyIHRvIHRoZSBuZXh0IFJ4RCAqLworCVNLX1UzMglSeEFkckxvOwkJLyogUGh5c2ljYWwgUnggQnVmZmVyIEFkZHJlc3MgbG93ZXIgZHdvcmQgKi8KKwlTS19VMzIJUnhBZHJIaTsJCS8qIFBoeXNpY2FsIFJ4IEJ1ZmZlciBBZGRyZXNzIHVwcGVyIGR3b3JkICovCisJU0tfVTMyCVJ4U3RhdDsJCQkvKiBSZWNlaXZlIEZyYW1lIFN0YXR1cyBXb3JkICovCisJU0tfVTMyCVJ4VGlTdDsJCQkvKiBSZWNlaXZlIFRpbWUgU3RhbXAgKGZyb20gWE1BQyBvbiBHRU5FU0lTKSAqLworI2lmbmRlZglTS19VU0VfUkVWX0RFU0MKKwlTS19VMTYJUnhUY3BTdW0xOwkJLyogVENQIENoZWNrc3VtIDEgKi8KKwlTS19VMTYJUnhUY3BTdW0yOwkJLyogVENQIENoZWNrc3VtIDIgKi8KKwlTS19VMTYJUnhUY3BTcDE7CQkvKiBUQ1AgQ2hlY2tzdW0gQ2FsY3VsYXRpb24gU3RhcnQgUG9zaXRpb24gMSAqLworCVNLX1UxNglSeFRjcFNwMjsJCS8qIFRDUCBDaGVja3N1bSBDYWxjdWxhdGlvbiBTdGFydCBQb3NpdGlvbiAyICovCisjZWxzZQkvKiBTS19VU0VfUkVWX0RFU0MgKi8KKwlTS19VMTYJUnhUY3BTdW0yOwkJLyogVENQIENoZWNrc3VtIDIgKi8KKwlTS19VMTYJUnhUY3BTdW0xOwkJLyogVENQIENoZWNrc3VtIDEgKi8KKwlTS19VMTYJUnhUY3BTcDI7CQkvKiBUQ1AgQ2hlY2tzdW0gQ2FsY3VsYXRpb24gU3RhcnQgUG9zaXRpb24gMiAqLworCVNLX1UxNglSeFRjcFNwMTsJCS8qIFRDUCBDaGVja3N1bSBDYWxjdWxhdGlvbiBTdGFydCBQb3NpdGlvbiAxICovCisjZW5kaWYJLyogU0tfVVNFX1JFVl9ERVNDICovCit9IFNLX0hXUlhEOworCisvKgorICogRHJpdmVycyB3aGljaCB1c2UgdGhlIHJldmVyc2UgZGVzY3JpcHRvciBmZWF0dXJlIChQQ0lfT1VSX1JFR18yKQorICogc2hvdWxkIHNldCB0aGUgZGVmaW5lIFNLX1VTRV9SRVZfREVTQy4KKyAqIFN0cnVjdHVyZXMgYXJlICdub3JtYWx5JyBub3QgZW5kaWFuZXNzIGRlcGVuZGVudC4gQnV0IGluCisgKiB0aGlzIGNhc2UgdGhlIFNLX1UxNiBmaWVsZHMgYXJlIGJvdW5kIHRvIGJpdCBwb3NpdGlvbnMgaW5zaWRlIHRoZQorICogZGVzY3JpcHRvci4gUnhUY3BTdW0xIGUuZy4gbXVzdCBzdGFydCBhdCBiaXQgMCB3aXRoaW4gdGhlIDYudGggRFdvcmQuCisgKiBUaGUgYml0IHBvc2l0aW9ucyBpbnNpZGUgYSBEV29yZCBhcmUgb2YgY291cnNlIGVuZGlhbmVzcyBkZXBlbmRlbnQgYW5kCisgKiBzd2FwcyBpZiB0aGUgRFdvcmQgaXMgc3dhcHBlZCBieSB0aGUgaGFyZHdhcmUuCisgKi8KKworCisvKiBEZXNjcmlwdG9yIEJpdCBEZWZpbml0aW9uICovCisvKglUeEN0cmwJCVRyYW5zbWl0IEJ1ZmZlciBDb250cm9sIEZpZWxkICovCisvKglSeEN0cmwJCVJlY2VpdmUgIEJ1ZmZlciBDb250cm9sIEZpZWxkICovCisjZGVmaW5lIEJNVV9PV04JCQlCSVRfMzEJLyogT1dOIGJpdDogMD1ob3N0LzE9Qk1VICovCisjZGVmaW5lIEJNVV9TVEYJCQlCSVRfMzAJLyogU3RhcnQgb2YgRnJhbWUgKi8KKyNkZWZpbmUgQk1VX0VPRgkJCUJJVF8yOQkvKiBFbmQgb2YgRnJhbWUgKi8KKyNkZWZpbmUgQk1VX0lSUV9FT0IJCUJJVF8yOAkvKiBSZXEgIkVuZCBvZiBCdWZmZXIiIElSUSAqLworI2RlZmluZSBCTVVfSVJRX0VPRgkJQklUXzI3CS8qIFJlcSAiRW5kIG9mIEZyYW1lIiBJUlEgKi8KKy8qIFR4Q3RybCBzcGVjaWZpYyBiaXRzICovCisjZGVmaW5lIEJNVV9TVEZXRAkJQklUXzI2CS8qIChUeCkJU3RvcmUgJiBGb3J3YXJkIEZyYW1lICovCisjZGVmaW5lIEJNVV9OT19GQ1MJCUJJVF8yNQkvKiAoVHgpIERpc2FibGUgTUFDIEZDUyAoQ1JDKSBnZW5lcmF0aW9uICovCisjZGVmaW5lIEJNVV9TVwkJCUJJVF8yNAkvKiAoVHgpCTEgYml0IHJlcy4gZm9yIFNXIHVzZSAqLworLyogUnhDdHJsIHNwZWNpZmljIGJpdHMgKi8KKyNkZWZpbmUgQk1VX0RFVl8wCQlCSVRfMjYJLyogKFJ4KQlUcmFuc2ZlciBkYXRhIHRvIERldjAgKi8KKyNkZWZpbmUgQk1VX1NUQVRfVkFMCUJJVF8yNQkvKiAoUngpCVJ4IFN0YXR1cyBWYWxpZCAqLworI2RlZmluZSBCTVVfVElTVF9WQUwJQklUXzI0CS8qIChSeCkJUnggVGltZVN0YW1wIFZhbGlkICovCisJCQkJCQkJCS8qIEJpdCAyMy4uMTY6CUJNVSBDaGVjayBPcGNvZGVzICovCisjZGVmaW5lIEJNVV9DSEVDSwkJKDB4NTVMPDwxNikJLyogRGVmYXVsdCBCTVUgY2hlY2sgKi8KKyNkZWZpbmUgQk1VX1RDUF9DSEVDSwkoMHg1Nkw8PDE2KQkvKiBEZXNjciB3aXRoIFRDUCBleHQgKi8KKyNkZWZpbmUgQk1VX1VEUF9DSEVDSwkoMHg1N0w8PDE2KQkvKiBEZXNjciB3aXRoIFVEUCBleHQgKFlVS09OIG9ubHkpICovCisjZGVmaW5lIEJNVV9CQkMJCQkweGZmZmZMCS8qIEJpdCAxNS4uIDA6CUJ1ZmZlciBCeXRlIENvdW50ZXIgKi8KKworLyoJVHhTdGF0CQlUcmFuc21pdCBGcmFtZSBTdGF0dXMgV29yZCAqLworLyoJUnhTdGF0CQlSZWNlaXZlIEZyYW1lIFN0YXR1cyBXb3JkICovCisvKgorICpOb3RlOiBUeFN0YXQgaXMgcmVzZXJ2ZWQgZm9yIEFTSUMgbG9vcGJhY2sgbW9kZSBvbmx5CisgKgorICoJVGhlIEJpdHMgb2YgdGhlIFN0YXR1cyB3b3JkcyBhcmUgZGVmaW5lZCBpbiB4bWFjX2lpLmgKKyAqCShzZWUgWE1SX0ZTIGJpdHMpCisgKi8KKworLyogbWFjcm9zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSZWNlaXZlIGFuZCBUcmFuc21pdCBRdWV1ZXMgKi8KKyNkZWZpbmUgUV9SMQkweDAwMDAJCS8qIFJlY2VpdmUgUXVldWUgMSAqLworI2RlZmluZSBRX1IyCTB4MDA4MAkJLyogUmVjZWl2ZSBRdWV1ZSAyICovCisjZGVmaW5lIFFfWFMxCTB4MDIwMAkJLyogU3luY2hyb25vdXMgVHJhbnNtaXQgUXVldWUgMSAqLworI2RlZmluZSBRX1hBMQkweDAyODAJCS8qIEFzeW5jaHJvbm91cyBUcmFuc21pdCBRdWV1ZSAxICovCisjZGVmaW5lIFFfWFMyCTB4MDMwMAkJLyogU3luY2hyb25vdXMgVHJhbnNtaXQgUXVldWUgMiAqLworI2RlZmluZSBRX1hBMgkweDAzODAJCS8qIEFzeW5jaHJvbm91cyBUcmFuc21pdCBRdWV1ZSAyICovCisKKy8qCisgKglNYWNybyBRX0FERFIoKQorICoKKyAqCVVzZSB0aGlzIG1hY3JvIHRvIGFjY2VzcyB0aGUgUmVjZWl2ZSBhbmQgVHJhbnNtaXQgUXVldWUgUmVnaXN0ZXJzLgorICoKKyAqIHBhcmE6CisgKglRdWV1ZQlRdWV1ZSB0byBhY2Nlc3MuCisgKgkJCQlWYWx1ZXM6IFFfUjEsIFFfUjIsIFFfWFMxLCBRX1hBMSwgUV9YUzIsIGFuZCBRX1hBMgorICoJT2ZmcwlRdWV1ZSByZWdpc3RlciBvZmZzZXQuCisgKgkJCQlWYWx1ZXM6IFFfRCwgUV9EQV9MIC4uLiBRX1QyLCBRX1QzCisgKgorICogdXNhZ2UJU0tfSU4zMihwQUMsIFFfQUREUihRX1IyLCBRX0JDKSwgcFZhbCkKKyAqLworI2RlZmluZSBRX0FERFIoUXVldWUsIE9mZnMpCShCOF9RX1JFR1MgKyAoUXVldWUpICsgKE9mZnMpKQorCisvKgorICoJTWFjcm8gUkJfQUREUigpCisgKgorICoJVXNlIHRoaXMgbWFjcm8gdG8gYWNjZXNzIHRoZSBSQU0gQnVmZmVyIFJlZ2lzdGVycy4KKyAqCisgKiBwYXJhOgorICoJUXVldWUJUXVldWUgdG8gYWNjZXNzLgorICoJCQkJVmFsdWVzOiBRX1IxLCBRX1IyLCBRX1hTMSwgUV9YQTEsIFFfWFMyLCBhbmQgUV9YQTIKKyAqCU9mZnMJUXVldWUgcmVnaXN0ZXIgb2Zmc2V0LgorICoJCQkJVmFsdWVzOiBSQl9TVEFSVCwgUkJfRU5EIC4uLiBSQl9MRVYsIFJCX0NUUkwKKyAqCisgKiB1c2FnZQlTS19JTjMyKHBBQywgUkJfQUREUihRX1IyLCBSQl9SUCksIHBWYWwpCisgKi8KKyNkZWZpbmUgUkJfQUREUihRdWV1ZSwgT2ZmcykJKEIxNl9SQU1fUkVHUyArIChRdWV1ZSkgKyAoT2ZmcykpCisKKworLyogTUFDIFJlbGF0ZWQgUmVnaXN0ZXJzICovCisjZGVmaW5lIE1BQ18xCQkwCS8qIGJlbG9uZ3MgdG8gdGhlIHBvcnQgbmVhciB0aGUgc2xvdCAqLworI2RlZmluZSBNQUNfMgkJMQkvKiBiZWxvbmdzIHRvIHRoZSBwb3J0IGZhciBhd2F5IGZyb20gdGhlIHNsb3QgKi8KKworLyoKKyAqCU1hY3JvIE1SX0FERFIoKQorICoKKyAqCVVzZSB0aGlzIG1hY3JvIHRvIGFjY2VzcyBhIE1BQyBSZWxhdGVkIFJlZ2lzdGVycyBpbnNpZGUgdGhlIEFTSUMuCisgKgorICogcGFyYToKKyAqCU1hYwkJTUFDIHRvIGFjY2Vzcy4KKyAqCQkJCVZhbHVlczogTUFDXzEsIE1BQ18yCisgKglPZmZzCU1BQyByZWdpc3RlciBvZmZzZXQuCisgKgkJCQlWYWx1ZXM6IFJYX01GRl9FQSwgUlhfTUZGX1dQIC4uLiBMTktfTEVEX1JFRywKKyAqCQkJCQkJVFhfTUZGX0VBLCBUWF9NRkZfV1AgLi4uIFRYX0xFRF9UU1QKKyAqCisgKiB1c2FnZQlTS19JTjMyKHBBQywgTVJfQUREUihNQUNfMSwgVFhfTUZGX0VBKSwgcFZhbCkKKyAqLworI2RlZmluZSBNUl9BRERSKE1hYywgT2ZmcykJKCgoTWFjKSA8PCA3KSArIChPZmZzKSkKKworI2lmZGVmCVNLX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgWE1fV09SRF9MTwkwCisjZGVmaW5lIFhNX1dPUkRfSEkJMQorI2Vsc2UJLyogIVNLX0xJVFRMRV9FTkRJQU4gKi8KKyNkZWZpbmUgWE1fV09SRF9MTwkxCisjZGVmaW5lIFhNX1dPUkRfSEkJMAorI2VuZGlmCS8qICFTS19MSVRUTEVfRU5ESUFOICovCisKKworLyoKKyAqIG1hY3JvcyB0byBhY2Nlc3MgdGhlIFhNQUMgKEdFTkVTSVMgb25seSkKKyAqCisgKiBYTV9JTjE2KCksCQl0byByZWFkIGEgMTYgYml0IHJlZ2lzdGVyIChlLmcuIFhNX01NVV9DTUQpCisgKiBYTV9PVVQxNigpLAkJdG8gd3JpdGUgYSAxNiBiaXQgcmVnaXN0ZXIgKGUuZy4gWE1fTU1VX0NNRCkKKyAqIFhNX0lOMzIoKSwJCXRvIHJlYWQgYSAzMiBiaXQgcmVnaXN0ZXIgKGUuZy4gWE1fVFhfRVZfQ05UKQorICogWE1fT1VUMzIoKSwJCXRvIHdyaXRlIGEgMzIgYml0IHJlZ2lzdGVyIChlLmcuIFhNX1RYX0VWX0NOVCkKKyAqIFhNX0lOQUREUigpLAkJdG8gcmVhZCBhIG5ldHdvcmsgYWRkcmVzcyByZWdpc3RlciAoZS5nLiBYTV9TUkNfQ0hLKQorICogWE1fT1VUQUREUigpLAl0byB3cml0ZSBhIG5ldHdvcmsgYWRkcmVzcyByZWdpc3RlciAoZS5nLiBYTV9TUkNfQ0hLKQorICogWE1fSU5IQVNIKCksCQl0byByZWFkIHRoZSBYTV9IU01fQ0hLIHJlZ2lzdGVyCisgKiBYTV9PVVRIQVNIKCkJCXRvIHdyaXRlIHRoZSBYTV9IU01fQ0hLIHJlZ2lzdGVyCisgKgorICogcGFyYToKKyAqCU1hYwkJWE1BQyB0byBhY2Nlc3MJCXZhbHVlczogTUFDXzEgb3IgTUFDXzIKKyAqCUlvQwkJSS9PIGNvbnRleHQgbmVlZGVkIGZvciBTSyBJL08gbWFjcm9zCisgKglSZWcJCVhNQUMgUmVnaXN0ZXIgdG8gcmVhZCBvciB3cml0ZQorICoJKHApVmFsCVZhbHVlIG9yIHBvaW50ZXIgdG8gdGhlIHZhbHVlIHdoaWNoIHNob3VsZCBiZSByZWFkIG9yIHdyaXR0ZW4KKyAqCisgKiB1c2FnZToJWE1fT1VUMTYoSW9DLCBNQUNfMSwgWE1fTU1VX0NNRCwgVmFsdWUpOworICovCisKKyNkZWZpbmUgWE1BKE1hYywgUmVnKQkJCQkJCQkJCVwKKwkoKEJBU0VfWE1BQ18xICsgKE1hYykgKiAoQkFTRV9YTUFDXzIgLSBCQVNFX1hNQUNfMSkpIHwgKChSZWcpIDw8IDEpKQorCisjZGVmaW5lIFhNX0lOMTYoSW9DLCBNYWMsIFJlZywgcFZhbCkJCQkJCVwKKwlTS19JTjE2KChJb0MpLCBYTUEoKE1hYyksIChSZWcpKSwgKHBWYWwpKQorCisjZGVmaW5lIFhNX09VVDE2KElvQywgTWFjLCBSZWcsIFZhbCkJCQkJCVwKKwlTS19PVVQxNigoSW9DKSwgWE1BKChNYWMpLCAoUmVnKSksIChWYWwpKQorCisjZGVmaW5lIFhNX0lOMzIoSW9DLCBNYWMsIFJlZywgcFZhbCkgewkJCQkJXAorCVNLX0lOMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZykpLAkJCQkJXAorCQkoU0tfVTE2IFNLX0ZBUiopJigoU0tfVTE2IFNLX0ZBUiopKHBWYWwpKVtYTV9XT1JEX0xPXSk7CQlcCisJU0tfSU4xNigoSW9DKSwgWE1BKChNYWMpLCAoUmVnKzIpKSwJCQkJCVwKKwkJKFNLX1UxNiBTS19GQVIqKSYoKFNLX1UxNiBTS19GQVIqKShwVmFsKSlbWE1fV09SRF9ISV0pOwkJXAorfQorCisjZGVmaW5lIFhNX09VVDMyKElvQywgTWFjLCBSZWcsIFZhbCkgewkJCQkJCQkJCQlcCisJU0tfT1VUMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZykpLCAoU0tfVTE2KSgoVmFsKSAmIDB4ZmZmZkwpKTsJCQlcCisJU0tfT1VUMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZysyKSksIChTS19VMTYpKCgoVmFsKSA+PiAxNikgJiAweGZmZmZMKSk7XAorfQorCisvKiBSZW1lbWJlcjogd2UgYXJlIGFsd2F5cyB3cml0aW5nIHRvIC8gcmVhZGluZyBmcm9tIExJVFRMRSBFTkRJQU4gbWVtb3J5ICovCisKKyNkZWZpbmUgWE1fSU5BRERSKElvQywgTWFjLCBSZWcsIHBWYWwpIHsJCQkJXAorCVNLX1UxNglXb3JkOwkJCQkJCQkJCQlcCisJU0tfVTgJKnBCeXRlOwkJCQkJCQkJCQlcCisJcEJ5dGUgPSAoU0tfVTggKikmKChTS19VOCAqKShwVmFsKSlbMF07CQkJCVwKKwlTS19JTjE2KChJb0MpLCBYTUEoKE1hYyksIChSZWcpKSwgJldvcmQpOwkJCVwKKwlwQnl0ZVswXSA9IChTS19VOCkoV29yZCAgJiAweDAwZmYpOwkJCQkJXAorCXBCeXRlWzFdID0gKFNLX1U4KSgoV29yZCA+PiA4KSAmIDB4MDBmZik7CQkJXAorCVNLX0lOMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZysyKSksICZXb3JkKTsJCQlcCisJcEJ5dGVbMl0gPSAoU0tfVTgpKFdvcmQgICYgMHgwMGZmKTsJCQkJCVwKKwlwQnl0ZVszXSA9IChTS19VOCkoKFdvcmQgPj4gOCkgJiAweDAwZmYpOwkJCVwKKwlTS19JTjE2KChJb0MpLCBYTUEoKE1hYyksIChSZWcrNCkpLCAmV29yZCk7CQkJXAorCXBCeXRlWzRdID0gKFNLX1U4KShXb3JkICAmIDB4MDBmZik7CQkJCQlcCisJcEJ5dGVbNV0gPSAoU0tfVTgpKChXb3JkID4+IDgpICYgMHgwMGZmKTsJCQlcCit9CisKKyNkZWZpbmUgWE1fT1VUQUREUihJb0MsIE1hYywgUmVnLCBwVmFsKSB7CQkJCVwKKwlTS19VOAlTS19GQVIgKnBCeXRlOwkJCQkJCQkJXAorCXBCeXRlID0gKFNLX1U4IFNLX0ZBUiAqKSYoKFNLX1U4IFNLX0ZBUiAqKShwVmFsKSlbMF07CVwKKwlTS19PVVQxNigoSW9DKSwgWE1BKChNYWMpLCAoUmVnKSksIChTS19VMTYpCQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzBdKSAmIDB4MDBmZikgfAkJCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbMV0pIDw8IDgpICYgMHhmZjAwKSkpOwkJCVwKKwlTS19PVVQxNigoSW9DKSwgWE1BKChNYWMpLCAoUmVnKzIpKSwgKFNLX1UxNikJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVsyXSkgJiAweDAwZmYpIHwJCQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzNdKSA8PCA4KSAmIDB4ZmYwMCkpKTsJCQlcCisJU0tfT1VUMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZys0KSksIChTS19VMTYpCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbNF0pICYgMHgwMGZmKSB8CQkJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVs1XSkgPDwgOCkgJiAweGZmMDApKSk7CQkJXAorfQorCisjZGVmaW5lIFhNX0lOSEFTSChJb0MsIE1hYywgUmVnLCBwVmFsKSB7CQkJCVwKKwlTS19VMTYJV29yZDsJCQkJCQkJCQkJXAorCVNLX1U4CVNLX0ZBUiAqcEJ5dGU7CQkJCQkJCQlcCisJcEJ5dGUgPSAoU0tfVTggU0tfRkFSICopJigoU0tfVTggU0tfRkFSICopKHBWYWwpKVswXTsJXAorCVNLX0lOMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZykpLCAmV29yZCk7CQkJXAorCXBCeXRlWzBdID0gKFNLX1U4KShXb3JkICAmIDB4MDBmZik7CQkJCQlcCisJcEJ5dGVbMV0gPSAoU0tfVTgpKChXb3JkID4+IDgpICYgMHgwMGZmKTsJCQlcCisJU0tfSU4xNigoSW9DKSwgWE1BKChNYWMpLCAoUmVnKzIpKSwgJldvcmQpOwkJCVwKKwlwQnl0ZVsyXSA9IChTS19VOCkoV29yZCAgJiAweDAwZmYpOwkJCQkJXAorCXBCeXRlWzNdID0gKFNLX1U4KSgoV29yZCA+PiA4KSAmIDB4MDBmZik7CQkJXAorCVNLX0lOMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZys0KSksICZXb3JkKTsJCQlcCisJcEJ5dGVbNF0gPSAoU0tfVTgpKFdvcmQgICYgMHgwMGZmKTsJCQkJCVwKKwlwQnl0ZVs1XSA9IChTS19VOCkoKFdvcmQgPj4gOCkgJiAweDAwZmYpOwkJCVwKKwlTS19JTjE2KChJb0MpLCBYTUEoKE1hYyksIChSZWcrNikpLCAmV29yZCk7CQkJXAorCXBCeXRlWzZdID0gKFNLX1U4KShXb3JkICAmIDB4MDBmZik7CQkJCQlcCisJcEJ5dGVbN10gPSAoU0tfVTgpKChXb3JkID4+IDgpICYgMHgwMGZmKTsJCQlcCit9CisKKyNkZWZpbmUgWE1fT1VUSEFTSChJb0MsIE1hYywgUmVnLCBwVmFsKSB7CQkJCVwKKwlTS19VOAlTS19GQVIgKnBCeXRlOwkJCQkJCQkJXAorCXBCeXRlID0gKFNLX1U4IFNLX0ZBUiAqKSYoKFNLX1U4IFNLX0ZBUiAqKShwVmFsKSlbMF07CVwKKwlTS19PVVQxNigoSW9DKSwgWE1BKChNYWMpLCAoUmVnKSksIChTS19VMTYpCQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzBdKSAmIDB4MDBmZil8CQkJCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbMV0pIDw8IDgpICYgMHhmZjAwKSkpOwkJCVwKKwlTS19PVVQxNigoSW9DKSwgWE1BKChNYWMpLCAoUmVnKzIpKSwgKFNLX1UxNikJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVsyXSkgJiAweDAwZmYpfAkJCQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzNdKSA8PCA4KSAmIDB4ZmYwMCkpKTsJCQlcCisJU0tfT1VUMTYoKElvQyksIFhNQSgoTWFjKSwgKFJlZys0KSksIChTS19VMTYpCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbNF0pICYgMHgwMGZmKXwJCQkJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVs1XSkgPDwgOCkgJiAweGZmMDApKSk7CQkJXAorCVNLX09VVDE2KChJb0MpLCBYTUEoKE1hYyksIChSZWcrNikpLCAoU0tfVTE2KQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzZdKSAmIDB4MDBmZil8CQkJCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbN10pIDw8IDgpICYgMHhmZjAwKSkpOwkJCVwKK30KKworLyoKKyAqIG1hY3JvcyB0byBhY2Nlc3MgdGhlIEdNQUMgKFlVS09OIG9ubHkpCisgKgorICogR01fSU4xNigpLAkJdG8gcmVhZCAgYSAxNiBiaXQgcmVnaXN0ZXIgKGUuZy4gR01fR1BfU1RBVCkKKyAqIEdNX09VVDE2KCksCQl0byB3cml0ZSBhIDE2IGJpdCByZWdpc3RlciAoZS5nLiBHTV9HUF9DVFJMKQorICogR01fSU4zMigpLAkJdG8gcmVhZCAgYSAzMiBiaXQgcmVnaXN0ZXIgKGUuZy4gR01fKQorICogR01fT1VUMzIoKSwJCXRvIHdyaXRlIGEgMzIgYml0IHJlZ2lzdGVyIChlLmcuIEdNXykKKyAqIEdNX0lOQUREUigpLAkJdG8gcmVhZCAgYSBuZXR3b3JrIGFkZHJlc3MgcmVnaXN0ZXIgKGUuZy4gR01fU1JDX0FERFJfMUwpCisgKiBHTV9PVVRBRERSKCksCXRvIHdyaXRlIGEgbmV0d29yayBhZGRyZXNzIHJlZ2lzdGVyIChlLmcuIEdNX1NSQ19BRERSXzJMKQorICogR01fSU5IQVNIKCksCQl0byByZWFkICB0aGUgR01fTUNfQUREUl9IMSByZWdpc3RlcgorICogR01fT1VUSEFTSCgpCQl0byB3cml0ZSB0aGUgR01fTUNfQUREUl9IMSByZWdpc3RlcgorICoKKyAqIHBhcmE6CisgKglNYWMJCUdNQUMgdG8gYWNjZXNzCQl2YWx1ZXM6IE1BQ18xIG9yIE1BQ18yCisgKglJb0MJCUkvTyBjb250ZXh0IG5lZWRlZCBmb3IgU0sgSS9PIG1hY3JvcworICoJUmVnCQlHTUFDIFJlZ2lzdGVyIHRvIHJlYWQgb3Igd3JpdGUKKyAqCShwKVZhbAlWYWx1ZSBvciBwb2ludGVyIHRvIHRoZSB2YWx1ZSB3aGljaCBzaG91bGQgYmUgcmVhZCBvciB3cml0dGVuCisgKgorICogdXNhZ2U6CUdNX09VVDE2KElvQywgTUFDXzEsIEdNX0dQX0NUUkwsIFZhbHVlKTsKKyAqLworCisjZGVmaW5lIEdNQShNYWMsIFJlZykJCQkJCQkJCQlcCisJKChCQVNFX0dNQUNfMSArIChNYWMpICogKEJBU0VfR01BQ18yIC0gQkFTRV9HTUFDXzEpKSB8IChSZWcpKQorCisjZGVmaW5lIEdNX0lOMTYoSW9DLCBNYWMsIFJlZywgcFZhbCkJCQkJCVwKKwlTS19JTjE2KChJb0MpLCBHTUEoKE1hYyksIChSZWcpKSwgKHBWYWwpKQorCisjZGVmaW5lIEdNX09VVDE2KElvQywgTWFjLCBSZWcsIFZhbCkJCQkJCVwKKwlTS19PVVQxNigoSW9DKSwgR01BKChNYWMpLCAoUmVnKSksIChWYWwpKQorCisjZGVmaW5lIEdNX0lOMzIoSW9DLCBNYWMsIFJlZywgcFZhbCkgewkJCQkJXAorCVNLX0lOMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZykpLAkJCQkJXAorCQkoU0tfVTE2IFNLX0ZBUiopJigoU0tfVTE2IFNLX0ZBUiopKHBWYWwpKVtYTV9XT1JEX0xPXSk7CQlcCisJU0tfSU4xNigoSW9DKSwgR01BKChNYWMpLCAoUmVnKzQpKSwJCQkJCVwKKwkJKFNLX1UxNiBTS19GQVIqKSYoKFNLX1UxNiBTS19GQVIqKShwVmFsKSlbWE1fV09SRF9ISV0pOwkJXAorfQorCisjZGVmaW5lIEdNX09VVDMyKElvQywgTWFjLCBSZWcsIFZhbCkgewkJCQkJCQkJCQlcCisJU0tfT1VUMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZykpLCAoU0tfVTE2KSgoVmFsKSAmIDB4ZmZmZkwpKTsJCQlcCisJU0tfT1VUMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZys0KSksIChTS19VMTYpKCgoVmFsKSA+PiAxNikgJiAweGZmZmZMKSk7XAorfQorCisjZGVmaW5lIEdNX0lOQUREUihJb0MsIE1hYywgUmVnLCBwVmFsKSB7CQkJCVwKKwlTS19VMTYJV29yZDsJCQkJCQkJCQkJXAorCVNLX1U4CSpwQnl0ZTsJCQkJCQkJCQkJXAorCXBCeXRlID0gKFNLX1U4ICopJigoU0tfVTggKikocFZhbCkpWzBdOwkJCQlcCisJU0tfSU4xNigoSW9DKSwgR01BKChNYWMpLCAoUmVnKSksICZXb3JkKTsJCQlcCisJcEJ5dGVbMF0gPSAoU0tfVTgpKFdvcmQgICYgMHgwMGZmKTsJCQkJCVwKKwlwQnl0ZVsxXSA9IChTS19VOCkoKFdvcmQgPj4gOCkgJiAweDAwZmYpOwkJCVwKKwlTS19JTjE2KChJb0MpLCBHTUEoKE1hYyksIChSZWcrNCkpLCAmV29yZCk7CQkJXAorCXBCeXRlWzJdID0gKFNLX1U4KShXb3JkICAmIDB4MDBmZik7CQkJCQlcCisJcEJ5dGVbM10gPSAoU0tfVTgpKChXb3JkID4+IDgpICYgMHgwMGZmKTsJCQlcCisJU0tfSU4xNigoSW9DKSwgR01BKChNYWMpLCAoUmVnKzgpKSwgJldvcmQpOwkJCVwKKwlwQnl0ZVs0XSA9IChTS19VOCkoV29yZCAgJiAweDAwZmYpOwkJCQkJXAorCXBCeXRlWzVdID0gKFNLX1U4KSgoV29yZCA+PiA4KSAmIDB4MDBmZik7CQkJXAorfQorCisjZGVmaW5lIEdNX09VVEFERFIoSW9DLCBNYWMsIFJlZywgcFZhbCkgewkJCQlcCisJU0tfVTgJU0tfRkFSICpwQnl0ZTsJCQkJCQkJCVwKKwlwQnl0ZSA9IChTS19VOCBTS19GQVIgKikmKChTS19VOCBTS19GQVIgKikocFZhbCkpWzBdOwlcCisJU0tfT1VUMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZykpLCAoU0tfVTE2KQkJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVswXSkgJiAweDAwZmYpIHwJCQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzFdKSA8PCA4KSAmIDB4ZmYwMCkpKTsJCQlcCisJU0tfT1VUMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZys0KSksIChTS19VMTYpCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbMl0pICYgMHgwMGZmKSB8CQkJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVszXSkgPDwgOCkgJiAweGZmMDApKSk7CQkJXAorCVNLX09VVDE2KChJb0MpLCBHTUEoKE1hYyksIChSZWcrOCkpLCAoU0tfVTE2KQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzRdKSAmIDB4MDBmZikgfAkJCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbNV0pIDw8IDgpICYgMHhmZjAwKSkpOwkJCVwKK30KKworI2RlZmluZSBHTV9JTkhBU0goSW9DLCBNYWMsIFJlZywgcFZhbCkgewkJCQlcCisJU0tfVTE2CVdvcmQ7CQkJCQkJCQkJCVwKKwlTS19VOAkqcEJ5dGU7CQkJCQkJCQkJCVwKKwlwQnl0ZSA9IChTS19VOCAqKSYoKFNLX1U4ICopKHBWYWwpKVswXTsJCQkJXAorCVNLX0lOMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZykpLCAmV29yZCk7CQkJXAorCXBCeXRlWzBdID0gKFNLX1U4KShXb3JkICAmIDB4MDBmZik7CQkJCQlcCisJcEJ5dGVbMV0gPSAoU0tfVTgpKChXb3JkID4+IDgpICYgMHgwMGZmKTsJCQlcCisJU0tfSU4xNigoSW9DKSwgR01BKChNYWMpLCAoUmVnKzQpKSwgJldvcmQpOwkJCVwKKwlwQnl0ZVsyXSA9IChTS19VOCkoV29yZCAgJiAweDAwZmYpOwkJCQkJXAorCXBCeXRlWzNdID0gKFNLX1U4KSgoV29yZCA+PiA4KSAmIDB4MDBmZik7CQkJXAorCVNLX0lOMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZys4KSksICZXb3JkKTsJCQlcCisJcEJ5dGVbNF0gPSAoU0tfVTgpKFdvcmQgICYgMHgwMGZmKTsJCQkJCVwKKwlwQnl0ZVs1XSA9IChTS19VOCkoKFdvcmQgPj4gOCkgJiAweDAwZmYpOwkJCVwKKwlTS19JTjE2KChJb0MpLCBHTUEoKE1hYyksIChSZWcrMTIpKSwgJldvcmQpOwkJXAorCXBCeXRlWzZdID0gKFNLX1U4KShXb3JkICAmIDB4MDBmZik7CQkJCQlcCisJcEJ5dGVbN10gPSAoU0tfVTgpKChXb3JkID4+IDgpICYgMHgwMGZmKTsJCQlcCit9CisKKyNkZWZpbmUgR01fT1VUSEFTSChJb0MsIE1hYywgUmVnLCBwVmFsKSB7CQkJCVwKKwlTS19VOAkqcEJ5dGU7CQkJCQkJCQkJCVwKKwlwQnl0ZSA9IChTS19VOCAqKSYoKFNLX1U4ICopKHBWYWwpKVswXTsJCQkJXAorCVNLX09VVDE2KChJb0MpLCBHTUEoKE1hYyksIChSZWcpKSwgKFNLX1UxNikJCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbMF0pICYgMHgwMGZmKXwJCQkJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVsxXSkgPDwgOCkgJiAweGZmMDApKSk7CQkJXAorCVNLX09VVDE2KChJb0MpLCBHTUEoKE1hYyksIChSZWcrNCkpLCAoU0tfVTE2KQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzJdKSAmIDB4MDBmZil8CQkJCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbM10pIDw8IDgpICYgMHhmZjAwKSkpOwkJCVwKKwlTS19PVVQxNigoSW9DKSwgR01BKChNYWMpLCAoUmVnKzgpKSwgKFNLX1UxNikJCVwKKwkJKCgoU0tfVTE2KShwQnl0ZVs0XSkgJiAweDAwZmYpfAkJCQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzVdKSA8PCA4KSAmIDB4ZmYwMCkpKTsJCQlcCisJU0tfT1VUMTYoKElvQyksIEdNQSgoTWFjKSwgKFJlZysxMikpLCAoU0tfVTE2KQkJXAorCQkoKChTS19VMTYpKHBCeXRlWzZdKSAmIDB4MDBmZil8CQkJCQlcCisJCSgoKFNLX1UxNikocEJ5dGVbN10pIDw8IDgpICYgMHhmZjAwKSkpOwkJCVwKK30KKworLyoKKyAqIERpZmZlcmVudCBNQUMgVHlwZXMKKyAqLworI2RlZmluZSBTS19NQUNfWE1BQwkJMAkvKiBYYXF0aSBYTUFDIElJICovCisjZGVmaW5lIFNLX01BQ19HTUFDCQkxCS8qIE1hcnZlbGwgR01BQyAqLworCisvKgorICogRGlmZmVyZW50IFBIWSBUeXBlcworICovCisjZGVmaW5lIFNLX1BIWV9YTUFDCQkJMAkvKiBpbnRlZ3JhdGVkIGluIFhNQUMgSUkgKi8KKyNkZWZpbmUgU0tfUEhZX0JDT00JCQkxCS8qIEJyb2FkY29tIEJDTTU0MDAgKi8KKyNkZWZpbmUgU0tfUEhZX0xPTkUJCQkyCS8qIExldmVsIE9uZSBMWFQxMDAwICovCisjZGVmaW5lIFNLX1BIWV9OQVQJCQkzCS8qIE5hdGlvbmFsIERQODM4OTEgKi8KKyNkZWZpbmUgU0tfUEhZX01BUlZfQ09QUEVSCTQJLyogTWFydmVsbCA4OEUxMDExUyAqLworI2RlZmluZSBTS19QSFlfTUFSVl9GSUJFUgk1CS8qIE1hcnZlbGwgODhFMTAxMVMgd29ya2luZyBvbiBmaWJlciAqLworCisvKgorICogUEhZIGFkZHJlc3NlcyAoYml0cyAxMi4uOCBvZiBQSFkgYWRkcmVzcyByZWcpCisgKi8KKyNkZWZpbmUgUEhZX0FERFJfWE1BQwkoMDw8OCkKKyNkZWZpbmUgUEhZX0FERFJfQkNPTQkoMTw8OCkKKyNkZWZpbmUgUEhZX0FERFJfTE9ORQkoMzw8OCkKKyNkZWZpbmUgUEhZX0FERFJfTkFUCSgwPDw4KQorCisvKiBHUEhZIGFkZHJlc3MgKGJpdHMgMTUuLjExIG9mIFNNSSBjb250cm9sIHJlZykgKi8KKyNkZWZpbmUgUEhZX0FERFJfTUFSVgkwCisKKy8qCisgKiBtYWNyb3MgdG8gYWNjZXNzIHRoZSBQSFkKKyAqCisgKiBQSFlfUkVBRCgpCQlyZWFkIGEgMTYgYml0IHZhbHVlIGZyb20gdGhlIFBIWQorICogUEhZX1dSSVRFKCkJCXdyaXRlIGEgMTYgYml0IHZhbHVlIHRvIHRoZSBQSFkKKyAqCisgKiBwYXJhOgorICogCUlvQwkJSS9PIGNvbnRleHQgbmVlZGVkIGZvciBTSyBJL08gbWFjcm9zCisgKiAJcFBvcnQJUG9pbnRlciB0byBwb3J0IHN0cnVjdCBmb3IgUGh5QWRkcgorICogCU1hYwkJWE1BQyB0byBhY2Nlc3MJCXZhbHVlczogTUFDXzEgb3IgTUFDXzIKKyAqIAlQaHlSZWcJUEhZIFJlZ2lzdGVyIHRvIHJlYWQgb3Igd3JpdGUKKyAqIAkocClWYWwJVmFsdWUgb3IgcG9pbnRlciB0byB0aGUgdmFsdWUgd2hpY2ggc2hvdWxkIGJlIHJlYWQgb3IKKyAqCQkJd3JpdHRlbi4KKyAqCisgKiB1c2FnZToJUEhZX1JFQUQoSW9DLCBwUG9ydCwgTUFDXzEsIFBIWV9DVFJMLCBWYWx1ZSk7CisgKiBXYXJuaW5nOiBhIFBIWV9SRUFEIG9uIGFuIHVuaW5pdGlhbGl6ZWQgUEhZIChQSFkgc3RpbGwgaW4gcmVzZXQpIG5ldmVyCisgKiAgICAgICAgICBjb21lcyBiYWNrLiBUaGlzIGlzIGNoZWNrZWQgaW4gREVCVUcgbW9kZS4KKyAqLworI2lmbmRlZiBERUJVRworI2RlZmluZSBQSFlfUkVBRChJb0MsIHBQb3J0LCBNYWMsIFBoeVJlZywgcFZhbCkgewkJCQkJCVwKKwlTS19VMTYgTW11OyAgCQkJCQkJCQkJCQkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCQlcCisJWE1fT1VUMTYoKElvQyksIChNYWMpLCBYTV9QSFlfQUREUiwgKFBoeVJlZykgfCAocFBvcnQpLT5QaHlBZGRyKTsJXAorCVhNX0lOMTYoKElvQyksIChNYWMpLCBYTV9QSFlfREFUQSwgKHBWYWwpKTsJCQkJCQkJXAorCWlmICgocFBvcnQpLT5QaHlUeXBlICE9IFNLX1BIWV9YTUFDKSB7CQkJCQkJCQlcCisJCWRvIHsgIAkJCQkJCQkJCQkJCQkJCVwKKwkJCVhNX0lOMTYoKElvQyksIChNYWMpLCBYTV9NTVVfQ01ELCAmTW11KTsJCQkJCVwKKwkJfSB3aGlsZSAoKE1tdSAmIFhNX01NVV9QSFlfUkRZKSA9PSAwKTsJCQkJCQkJXAorCQlYTV9JTjE2KChJb0MpLCAoTWFjKSwgWE1fUEhZX0RBVEEsIChwVmFsKSk7CQkJCQkJXAorCX0gIAkJCQkJCQkJCQkJCQkJCQkJXAorfQorI2Vsc2UKKyNkZWZpbmUgUEhZX1JFQUQoSW9DLCBwUG9ydCwgTWFjLCBQaHlSZWcsIHBWYWwpIHsJCQkJCQlcCisJU0tfVTE2IE1tdTsgIAkJCQkJCQkJCQkJCQkJXAorCWludCBfX2kgPSAwOwkJCQkJCQkJCQkJCQkJXAorCQkJCQkJCQkJCQkJCQkJCQkJXAorCVhNX09VVDE2KChJb0MpLCAoTWFjKSwgWE1fUEhZX0FERFIsIChQaHlSZWcpIHwgKHBQb3J0KS0+UGh5QWRkcik7CVwKKwlYTV9JTjE2KChJb0MpLCAoTWFjKSwgWE1fUEhZX0RBVEEsIChwVmFsKSk7CQkJCQkJCVwKKwlpZiAoKHBQb3J0KS0+UGh5VHlwZSAhPSBTS19QSFlfWE1BQykgewkJCQkJCQkJXAorCQlkbyB7ICAJCQkJCQkJCQkJCQkJCQlcCisJCQlYTV9JTjE2KChJb0MpLCAoTWFjKSwgWE1fTU1VX0NNRCwgJk1tdSk7CQkJCQlcCisJCQlfX2krKzsJCQkJCQkJCQkJCQkJCVwKKwkJCWlmIChfX2kgPiAxMDAwMDApIHsJCQkJCQkJCQkJCVwKKwkJCQlTS19EQkdfUFJJTlRGKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CQlcCisJCQkJU0tfREJHX1BSSU5URigiUEhZX1JFQUQgb24gdW5pbml0aWFsaXplZCBQSFlcbiIpOwkJXAorCQkJCVNLX0RCR19QUklOVEYoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsJCVwKKwkJCQlicmVhazsJCQkJCQkJCQkJCQkJXAorCQkJfQkJCQkJCQkJCQkJCQkJCVwKKwkJfSB3aGlsZSAoKE1tdSAmIFhNX01NVV9QSFlfUkRZKSA9PSAwKTsJCQkJCQkJXAorCQlYTV9JTjE2KChJb0MpLCAoTWFjKSwgWE1fUEhZX0RBVEEsIChwVmFsKSk7CQkJCQkJXAorCX0gIAkJCQkJCQkJCQkJCQkJCQkJXAorfQorI2VuZGlmIC8qIERFQlVHICovCisKKyNkZWZpbmUgUEhZX1dSSVRFKElvQywgcFBvcnQsIE1hYywgUGh5UmVnLCBWYWwpIHsJCQkJCQlcCisJU0tfVTE2IE1tdTsJCQkJCQkJCQkJCQkJCQlcCisJCQkJCQkJCQkJCQkJCQkJCQlcCisJaWYgKChwUG9ydCktPlBoeVR5cGUgIT0gU0tfUEhZX1hNQUMpIHsJCQkJCQkJCVwKKwkJZG8geyAgCQkJCQkJCQkJCQkJCQkJXAorCQkJWE1fSU4xNigoSW9DKSwgKE1hYyksIFhNX01NVV9DTUQsICZNbXUpOwkJCQkJXAorCQl9IHdoaWxlICgoTW11ICYgWE1fTU1VX1BIWV9CVVNZKSAhPSAwKTsJCQkJCQkJXAorCX0gIAkJCQkJCQkJCQkJCQkJCQkJXAorCVhNX09VVDE2KChJb0MpLCAoTWFjKSwgWE1fUEhZX0FERFIsIChQaHlSZWcpIHwgKHBQb3J0KS0+UGh5QWRkcik7CVwKKwlYTV9PVVQxNigoSW9DKSwgKE1hYyksIFhNX1BIWV9EQVRBLCAoVmFsKSk7CQkJCQkJCVwKKwlpZiAoKHBQb3J0KS0+UGh5VHlwZSAhPSBTS19QSFlfWE1BQykgewkJCQkJCQkJXAorCQlkbyB7ICAJCQkJCQkJCQkJCQkJCQlcCisJCQlYTV9JTjE2KChJb0MpLCAoTWFjKSwgWE1fTU1VX0NNRCwgJk1tdSk7CQkJCQlcCisJCX0gd2hpbGUgKChNbXUgJiBYTV9NTVVfUEhZX0JVU1kpICE9IDApOwkJCQkJCQlcCisJfSAgCQkJCQkJCQkJCQkJCQkJCQlcCit9CisKKy8qCisgKglNYWNybyBQQ0lfQygpCisgKgorICoJVXNlIHRoaXMgbWFjcm8gdG8gYWNjZXNzIFBDSSBjb25maWcgcmVnaXN0ZXIgZnJvbSB0aGUgSS9PIHNwYWNlLgorICoKKyAqIHBhcmE6CisgKglBZGRyCVBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHRvIGFjY2Vzcy4KKyAqCQkJVmFsdWVzOglQQ0lfVkVORE9SX0lEIC4uLiBQQ0lfVlBEX0FEUl9SRUcsCisgKgorICogdXNhZ2UJU0tfSU4xNihwQUMsIFBDSV9DKFBDSV9WRU5ET1JfSUQpLCBwVmFsKTsKKyAqLworI2RlZmluZSBQQ0lfQyhBZGRyKQkoQjdfQ0ZHX1NQQyArIChBZGRyKSkJLyogUENJIENvbmZpZyBTcGFjZSAqLworCisvKgorICoJTWFjcm8gU0tfSFdfQUREUihCYXNlLCBBZGRyKQorICoKKyAqCUNhbGN1bGF0ZXMgdGhlIGVmZmVjdGl2ZSBIVyBhZGRyZXNzCisgKgorICogcGFyYToKKyAqCUJhc2UJSS9PIG9yIG1lbW9yeSBiYXNlIGFkZHJlc3MKKyAqCUFkZHIJQWRkcmVzcyBvZmZzZXQKKyAqCisgKiB1c2FnZToJTWF5IGJlIHVzZWQgaW4gU0tfSU54eCBhbmQgU0tfT1VUeHggbWFjcm9zCisgKgkJI2RlZmluZSBTS19JTjgocEFDLCBBZGRyLCBwVmFsKSAuLi5cCisgKgkJCSpwVmFsID0gKFNLX1U4KWlucChTS19IV19BRERSKHBBQy0+SHcuSW9wLCBBZGRyKSkpCisgKi8KKyNpZmRlZiBTS19NRU1fTUFQUEVEX0lPCisjZGVmaW5lIFNLX0hXX0FERFIoQmFzZSwgQWRkcikJKChCYXNlKSArIChBZGRyKSkKKyNlbHNlICAvKiBTS19NRU1fTUFQUEVEX0lPICovCisjZGVmaW5lIFNLX0hXX0FERFIoQmFzZSwgQWRkcikJXAorCQkJKChCYXNlKSArICgoKEFkZHIpICYgMHg3ZikgfCAoKChBZGRyKSA+PiA3ID4gMCkgPyAweDgwIDogMCkpKQorI2VuZGlmIC8qIFNLX01FTV9NQVBQRURfSU8gKi8KKworI2RlZmluZSBTWl9MT05HCShzaXplb2YoU0tfVTMyKSkKKworLyoKKyAqCU1hY3JvIFNLX0hXQUNfTElOS19MRUQoKQorICoKKyAqCVVzZSB0aGlzIG1hY3JvIHRvIHNldCB0aGUgbGluayBMRUQgbW9kZS4KKyAqIHBhcmE6CisgKglwQUMJCVBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0IHN0cnVjdAorICoJSW9DCQlJL08gY29udGV4dCBuZWVkZWQgZm9yIFNLIEkvTyBtYWNyb3MKKyAqICBQb3J0CVBvcnQgbnVtYmVyCisgKglNb2RlCU1vZGUgdG8gc2V0IGZvciB0aGlzIExFRAorICovCisjZGVmaW5lIFNLX0hXQUNfTElOS19MRUQocEFDLCBJb0MsIFBvcnQsIE1vZGUpIFwKKwlTS19PVVQ4KElvQywgTVJfQUREUihQb3J0LCBMTktfTEVEX1JFRyksIE1vZGUpOworCisKKy8qIHR5cGVkZWZzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYJLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCS8qIF9fSU5DX1NLR0VIV19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZWh3dC5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2Vod3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmIwMDE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2Vod3QuaApAQCAtMCwwICsxLDQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tod3QuaAorICogUHJvamVjdDoJR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVycywgRXZlbnQgU2NoZWR1bGVyIE1vZHVsZQorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjcgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDkvMTYgMTI6NTU6MDggJAorICogUHVycG9zZToJRGVmaW5lcyBmb3IgdGhlIGhhcmR3YXJlIHRpbWVyIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBTS0dFSFdULkgJY29udGFpbnMgYWxsIGRlZmluZXMgYW5kIHR5cGVzIGZvciB0aGUgdGltZXIgZnVuY3Rpb25zCisgKi8KKworI2lmbmRlZglfU0tHRUhXVF9IXworI2RlZmluZSBfU0tHRUhXVF9IXworCisvKgorICogU0sgSGFyZHdhcmUgVGltZXIKKyAqIC0gbmVlZGVkIHdoZXJldmVyIHRoZSBIV1QgbW9kdWxlIGlzIHVzZWQKKyAqIC0gdXNlIGluIEFkYXB0ZXJzIGNvbnRleHQgbmFtZSBwQUMtPkh3dAorICovCit0eXBlZGVmCXN0cnVjdCBzX0h3dCB7CisJU0tfVTMyCQlUU3RhcnQ7CS8qIEhXVCBzdGFydCAqLworCVNLX1UzMgkJVFN0b3A7CS8qIEhXVCBzdG9wICovCisJaW50CQlUQWN0aXZlOwkvKiBIV1Q6IGZsYWcgOiBhY3RpdmUvaW5hY3RpdmUgKi8KK30gU0tfSFdUOworCitleHRlcm4gdm9pZCBTa0h3dEluaXQoU0tfQUMgKnBBQywgU0tfSU9DIElvYyk7CitleHRlcm4gdm9pZCBTa0h3dFN0YXJ0KFNLX0FDICpwQUMsIFNLX0lPQyBJb2MsIFNLX1UzMiBUaW1lKTsKK2V4dGVybiB2b2lkIFNrSHd0U3RvcChTS19BQyAqcEFDLCBTS19JT0MgSW9jKTsKK2V4dGVybiBTS19VMzIgU2tId3RSZWFkKFNLX0FDICpwQUMsIFNLX0lPQyBJb2MpOworZXh0ZXJuIHZvaWQgU2tId3RJc3IoU0tfQUMgKnBBQywgU0tfSU9DIElvYyk7CisjZW5kaWYJLyogX1NLR0VIV1RfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlaTJjLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZWkyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YjZmNmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZWkyYy5oCkBAIC0wLDAgKzEsMjEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tnZWkyYy5oCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBUV1NJLU1vZHVsZQorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjI1ICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzEwLzIwIDA5OjA2OjA1ICQKKyAqIFB1cnBvc2U6CVNwZWNpYWwgZGVmaW5lcyBmb3IgVFdTSQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QuCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogU0tHRUkyQy5ICWNvbnRhaW5zIGFsbCBTSy05OHh4IHNwZWNpZmljIGRlZmluZXMgZm9yIHRoZSBUV1NJIGhhbmRsaW5nCisgKi8KKworI2lmbmRlZiBfSU5DX1NLR0VJMkNfSF8KKyNkZWZpbmUgX0lOQ19TS0dFSTJDX0hfCisKKy8qCisgKiBNYWNyb3MgdG8gYWNjZXNzIHRoZSBCMl9JMkNfQ1RSTAorICovCisjZGVmaW5lIFNLX0kyQ19DVEwoSW9DLCBmbGFnLCBkZXYsIGRldl9zaXplLCByZWcsIGJ1cnN0KSBcCisJU0tfT1VUMzIoSW9DLCBCMl9JMkNfQ1RSTCxcCisJCShmbGFnID8gMHg4MDAwMDAwMFVMIDogMHgwTCkgfCBcCisJCSgoKFNLX1UzMilyZWcgPDwgMTYpICYgSTJDX0FERFIpIHwgXAorCQkoKChTS19VMzIpZGV2IDw8IDkpICYgSTJDX0RFVl9TRUwpIHwgXAorCQkoZGV2X3NpemUgJiBJMkNfREVWX1NJWkUpIHwgXAorCQkoKGJ1cnN0IDw8IDQpICYgSTJDX0JVUlNUX0xFTikpCisKKyNkZWZpbmUgU0tfSTJDX1NUT1AoSW9DKSB7CQkJCVwKKwlTS19VMzIJSTJjQ3RybDsJCQkJXAorCVNLX0lOMzIoSW9DLCBCMl9JMkNfQ1RSTCwgJkkyY0N0cmwpOwkJXAorCVNLX09VVDMyKElvQywgQjJfSTJDX0NUUkwsIEkyY0N0cmwgfCBJMkNfU1RPUCk7CVwKK30KKworI2RlZmluZSBTS19JMkNfR0VUX0NUTChJb0MsIHBJMmNDdHJsKQlTS19JTjMyKElvQywgQjJfSTJDX0NUUkwsIHBJMmNDdHJsKQorCisvKgorICogTWFjcm9zIHRvIGFjY2VzcyB0aGUgVFdTSSBTVyBSZWdpc3RlcnMKKyAqLworI2RlZmluZSBTS19JMkNfU0VUX0JJVChJb0MsIFNldEJpdHMpIHsJCQlcCisJU0tfVTgJT3JnQml0czsJCQkJXAorCVNLX0lOOChJb0MsIEIyX0kyQ19TVywgJk9yZ0JpdHMpOwkJXAorCVNLX09VVDgoSW9DLCBCMl9JMkNfU1csIE9yZ0JpdHMgfCAoU0tfVTgpKFNldEJpdHMpKTsJXAorfQorCisjZGVmaW5lIFNLX0kyQ19DTFJfQklUKElvQywgQ2xyQml0cykgewkJCVwKKwlTS19VOAlPcmdCaXRzOwkJCQlcCisJU0tfSU44KElvQywgQjJfSTJDX1NXLCAmT3JnQml0cyk7CQlcCisJU0tfT1VUOChJb0MsIEIyX0kyQ19TVywgT3JnQml0cyAmIH4oKFNLX1U4KShDbHJCaXRzKSkpOwlcCit9CisKKyNkZWZpbmUgU0tfSTJDX0dFVF9TVyhJb0MsIHBJMmNTdykJU0tfSU44KElvQywgQjJfSTJDX1NXLCBwSTJjU3cpCisKKy8qCisgKiBkZWZpbmUgdGhlIHBvc3NpYmxlIHNlbnNvciBzdGF0ZXMKKyAqLworI2RlZmluZQlTS19TRU5fSURMRQkJMAkvKiBJZGxlOiBzZW5zb3Igbm90IHJlYWQgKi8KKyNkZWZpbmUJU0tfU0VOX1ZBTFVFCTEJLyogVmFsdWUgUmVhZCBjeWNsZSAqLworI2RlZmluZQlTS19TRU5fVkFMRVhUCTIJLyogRXh0ZW5kZWQgVmFsdWUgUmVhZCBjeWNsZSAqLworCisvKgorICogQ29udmVyc2lvbiBmYWN0b3IgdG8gY29udmVydCByZWFkIFZvbHRhZ2Ugc2Vuc29yIHRvIG1pbGxpIFZvbHQKKyAqIENvbnZlcnNpb24gZmFjdG9yIHRvIGNvbnZlcnQgcmVhZCBUZW1wZXJhdHVyZSBzZW5zb3IgdG8gMTB0aCBkZWdyZWUgQ2Vsc2l1cworICovCisjZGVmaW5lCVNLX0xNODBfVlRfTFNCCQkyMgkvKiAyMm1WIExTQiByZXNvbHV0aW9uICovCisjZGVmaW5lCVNLX0xNODBfVEVNUF9MU0IJMTAJLyogMSBkZWdyZWUgTFNCIHJlc29sdXRpb24gKi8KKyNkZWZpbmUJU0tfTE04MF9URU1QRVhUX0xTQgkgNQkvKiAwLjUgZGVncmVlIExTQiByZXNvbHV0aW9uIGZvciBleHQuIHZhbC4gKi8KKworLyoKKyAqIGZvcm11bGE6IGNvdW50ZXIgPSAoMjI1MDAqNjApLyhycG0gKiBkaXZpc29yICogcHVsc2VzLzIpCisgKiBhc3N1bWluZzogNjUwMHJwbSwgNCBwdWxzZXMsIGRpdmlzb3IgMQorICovCisjZGVmaW5lIFNLX0xNODBfRkFOX0ZBS1RPUgkoKDIyNTAwTCo2MCkvKDEqMikpCisKKy8qCisgKiBEZWZpbmUgc2Vuc29yIG1hbmFnZW1lbnQgZGF0YQorICogTWF4aW11bSBpcyByZWFjaGVkIG9uIEdlbmVzaXMgY29wcGVyIGR1YWwgcG9ydCBhbmQgWXVrb24tNjQKKyAqIEJvYXJkIHNwZWNpZmljIG1heGltdW0gaXMgaW4gcEFDLT5JMmMuTWF4U2VucworICovCisjZGVmaW5lCVNLX01BWF9TRU5TT1JTCTgJLyogbWF4aW1hbCBuby4gb2YgaW5zdGFsbGVkIHNlbnNvcnMgKi8KKyNkZWZpbmUJU0tfTUlOX1NFTlNPUlMJNQkvKiBtaW5pbWFsIG5vLiBvZiBpbnN0YWxsZWQgc2Vuc29ycyAqLworCisvKgorICogVG8gd2F0Y2ggdGhlIHN0YXRlIG1hY2hpbmUgKFNNKSB1c2UgdGhlIHRpbWVyIGluIHR3byB3YXlzCisgKiBpbnN0ZWFkIG9mIG9uZSBhcyBoaXRoZXJ0bworICovCisjZGVmaW5lCVNLX1RJTUVSX1dBVENIX1NNCQkwCS8qIFdhdGNoIHRoZSBTTSB0byBmaW5pc2ggaW4gYSBzcGVjLiB0aW1lICovCisjZGVmaW5lCVNLX1RJTUVSX05FV19HQVVHSU5HCTEJLyogU3RhcnQgYSBuZXcgZ2F1Z2luZyB3aGVuIHRpbWVyIGV4cGlyZXMgKi8KKworLyoKKyAqIERlZmluZXMgZm9yIHRoZSBpbmRpdmlkdWFsIHRocmVzaG9sZHMKKyAqLworCisvKiBUZW1wZXJhdHVyZSBzZW5zb3IgKi8KKyNkZWZpbmUJU0tfU0VOX1RFTVBfSElHSF9FUlIJODAwCS8qIFRlbXBlcmF0dXJlIEhpZ2ggRXJyICBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX1RFTVBfSElHSF9XQVJOCTcwMAkvKiBUZW1wZXJhdHVyZSBIaWdoIFdhcm4gVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9URU1QX0xPV19XQVJOCTEwMAkvKiBUZW1wZXJhdHVyZSBMb3cgIFdhcm4gVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9URU1QX0xPV19FUlIJCSAgMAkvKiBUZW1wZXJhdHVyZSBMb3cgIEVyciAgVGhyZXNob2xkICovCisKKy8qIFZDQyB3aGljaCBzaG91bGQgYmUgNSBWICovCisjZGVmaW5lCVNLX1NFTl9QQ0lfNVZfSElHSF9FUlIJCTU1ODgJLyogVm9sdGFnZSBQQ0kgSGlnaCBFcnIgIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fUENJXzVWX0hJR0hfV0FSTgkJNTM0NgkvKiBWb2x0YWdlIFBDSSBIaWdoIFdhcm4gVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9QQ0lfNVZfTE9XX1dBUk4JCTQ2NjQJLyogVm9sdGFnZSBQQ0kgTG93ICBXYXJuIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fUENJXzVWX0xPV19FUlIJCTQ0MjIJLyogVm9sdGFnZSBQQ0kgTG93ICBFcnIgIFRocmVzaG9sZCAqLworCisvKgorICogVklPIG1heSBiZSA1IFYgb3IgMy4zIFYuIEluaXRpYWxpemF0aW9uIHRha2VzIHR3byBwYXJ0czoKKyAqIDEuIEluaXRpYWxpemUgbG93ZXN0IGxvd2VyIGxpbWl0IGFuZCBoaWdoZXN0IGhpZ2hlciBsaW1pdC4KKyAqIDIuIEFmdGVyIHRoZSBmaXJzdCB2YWx1ZSBpcyByZWFkIGNvcnJlY3QgdGhlIHVwcGVyIG9yIHRoZSBsb3dlciBsaW1pdCB0bworICogICAgdGhlIGFwcHJvcHJpYXRlIEMgY29uc3RhbnQuCisgKgorICogV2FybmluZyBsaW1pdHMgYXJlICstNSUgb2YgdGhlIGV4ZXBlY3RlZCB2b2x0YWdlLgorICogRXJyb3IgbGltaXRzIGFyZSArLTEwJSBvZiB0aGUgZXhwZWN0ZWQgdm9sdGFnZS4KKyAqLworCisvKiBCdWcgZml4IEFGOiAxNi5BdWcuMjAwMTogQ29ycmVjdCB0aGUgaW5pdCBiYXNlIG9mIExNODAgc2Vuc29yICovCisKKyNkZWZpbmUJU0tfU0VOX1BDSV9JT181Vl9ISUdIX0VSUgk1NTY2CS8qICsgMTAlIFYgUENJLUlPIEhpZ2ggRXJyIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fUENJX0lPXzVWX0hJR0hfV0FSTgk1MzI0CS8qICsgIDUlIFYgUENJLUlPIEhpZ2ggV2FybiBUaHJlc2hvbGQgKi8KKwkJCQkJLyoJCTUwMDAJbVZvbHQgKi8KKyNkZWZpbmUJU0tfU0VOX1BDSV9JT181Vl9MT1dfV0FSTgk0Njg2CS8qIC0gIDUlIFYgUENJLUlPIExvdyBXYXJuIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fUENJX0lPXzVWX0xPV19FUlIJNDQ0NAkvKiAtIDEwJSBWIFBDSS1JTyBMb3cgRXJyIFRocmVzaG9sZCAqLworCisjZGVmaW5lCVNLX1NFTl9QQ0lfSU9fUkFOR0VfTElNSVRFUgk0MDAwCS8qIDQwMDAgbVYgcmFuZ2UgZGVsaW1pdGVyICovCisKKy8qIGNvcnJlY3Rpb24gdmFsdWVzIGZvciB0aGUgc2Vjb25kIHBhc3MgKi8KKyNkZWZpbmUJU0tfU0VOX1BDSV9JT18zVjNfSElHSF9FUlIJMzg1MAkvKiArIDE1JSBWIFBDSS1JTyBIaWdoIEVyciBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX1BDSV9JT18zVjNfSElHSF9XQVJOCTM2NzQJLyogKyAxMCUgViBQQ0ktSU8gSGlnaCBXYXJuIFRocmVzaG9sZCAqLworCQkJCQkvKgkJMzMwMAltVm9sdCAqLworI2RlZmluZQlTS19TRU5fUENJX0lPXzNWM19MT1dfV0FSTgkyOTI2CS8qIC0gMTAlIFYgUENJLUlPIExvdyBXYXJuIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fUENJX0lPXzNWM19MT1dfRVJSCTI3NzIJLyogLSAxNSUgViBQQ0ktSU8gTG93IEVyciAgVGhyZXNob2xkICovCisKKy8qCisgKiBWREQgdm9sdGFnZQorICovCisjZGVmaW5lCVNLX1NFTl9WRERfSElHSF9FUlIJCTM2MzAJLyogVm9sdGFnZSBBU0lDIEhpZ2ggRXJyICBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX1ZERF9ISUdIX1dBUk4JMzQ3NgkvKiBWb2x0YWdlIEFTSUMgSGlnaCBXYXJuIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fVkREX0xPV19XQVJOCQkzMTQ2CS8qIFZvbHRhZ2UgQVNJQyBMb3cgIFdhcm4gVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9WRERfTE9XX0VSUgkJMjk3MAkvKiBWb2x0YWdlIEFTSUMgTG93ICBFcnIgIFRocmVzaG9sZCAqLworCisvKgorICogUEhZIFBMTCAzVjMgdm9sdGFnZQorICovCisjZGVmaW5lCVNLX1NFTl9QTExfM1YzX0hJR0hfRVJSCQkzNjMwCS8qIFZvbHRhZ2UgUE1BIEhpZ2ggRXJyICBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX1BMTF8zVjNfSElHSF9XQVJOCTM0NzYJLyogVm9sdGFnZSBQTUEgSGlnaCBXYXJuIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fUExMXzNWM19MT1dfV0FSTgkJMzE0NgkvKiBWb2x0YWdlIFBNQSBMb3cgIFdhcm4gVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9QTExfM1YzX0xPV19FUlIJCTI5NzAJLyogVm9sdGFnZSBQTUEgTG93ICBFcnIgIFRocmVzaG9sZCAqLworCisvKgorICogVkFVWCAoWVVLT04gb25seSkKKyAqLworI2RlZmluZQlTS19TRU5fVkFVWF8zVjNfSElHSF9FUlIJMzYzMAkvKiBWb2x0YWdlIFZBVVggSGlnaCBFcnIgVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9WQVVYXzNWM19ISUdIX1dBUk4JMzQ3NgkvKiBWb2x0YWdlIFZBVVggSGlnaCBXYXJuIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fVkFVWF8zVjNfTE9XX1dBUk4JMzE0NgkvKiBWb2x0YWdlIFZBVVggTG93IFdhcm4gVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9WQVVYXzNWM19MT1dfRVJSCQkyOTcwCS8qIFZvbHRhZ2UgVkFVWCBMb3cgRXJyIFRocmVzaG9sZCAqLworI2RlZmluZQlTS19TRU5fVkFVWF8wVl9XQVJOX0VSUgkJICAgMAkvKiBpZiBWQVVYIG5vdCBwcmVzZW50ICovCisjZGVmaW5lCVNLX1NFTl9WQVVYX1JBTkdFX0xJTUlURVIJMTAwMAkvKiAxMDAwIG1WIHJhbmdlIGRlbGltaXRlciAqLworCisvKgorICogUEhZIDJWNSB2b2x0YWdlCisgKi8KKyNkZWZpbmUJU0tfU0VOX1BIWV8yVjVfSElHSF9FUlIJCTI3NTAJLyogVm9sdGFnZSBQSFkgSGlnaCBFcnIgVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9QSFlfMlY1X0hJR0hfV0FSTgkyNjQwCS8qIFZvbHRhZ2UgUEhZIEhpZ2ggV2FybiBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX1BIWV8yVjVfTE9XX1dBUk4JCTIzNzYJLyogVm9sdGFnZSBQSFkgTG93IFdhcm4gVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9QSFlfMlY1X0xPV19FUlIJCTIyMjIJLyogVm9sdGFnZSBQSFkgTG93IEVyciBUaHJlc2hvbGQgKi8KKworLyoKKyAqIEFTSUMgQ29yZSAxVjUgdm9sdGFnZSAoWVVLT04gb25seSkKKyAqLworI2RlZmluZQlTS19TRU5fQ09SRV8xVjVfSElHSF9FUlIJMTY1MAkvKiBWb2x0YWdlIEFTSUMgQ29yZSBIaWdoIEVyciBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX0NPUkVfMVY1X0hJR0hfV0FSTgkxNTc1CS8qIFZvbHRhZ2UgQVNJQyBDb3JlIEhpZ2ggV2FybiBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX0NPUkVfMVY1X0xPV19XQVJOCTE0MjUJLyogVm9sdGFnZSBBU0lDIENvcmUgTG93IFdhcm4gVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9DT1JFXzFWNV9MT1dfRVJSIAkxMzUwCS8qIFZvbHRhZ2UgQVNJQyBDb3JlIExvdyBFcnIgVGhyZXNob2xkICovCisKKy8qCisgKiBGQU4gMSBzcGVlZAorICovCisvKiBhc3N1bWluZzogNjUwMHJwbSArLTE1JSwgNCBwdWxzZXMsCisgKiB3YXJuaW5nIGF0Ogk4MCAlCisgKiBlcnJvciBhdDoJNzAgJQorICogbm8gdXBwZXIgbGltaXQKKyAqLworI2RlZmluZQlTS19TRU5fRkFOX0hJR0hfRVJSCQkyMDAwMAkvKiBGQU4gU3BlZWQgSGlnaCBFcnIgVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9GQU5fSElHSF9XQVJOCTIwMDAwCS8qIEZBTiBTcGVlZCBIaWdoIFdhcm4gVGhyZXNob2xkICovCisjZGVmaW5lCVNLX1NFTl9GQU5fTE9XX1dBUk4JCSA1MjAwCS8qIEZBTiBTcGVlZCBMb3cgV2FybiBUaHJlc2hvbGQgKi8KKyNkZWZpbmUJU0tfU0VOX0ZBTl9MT1dfRVJSCQkgNDU1MAkvKiBGQU4gU3BlZWQgTG93IEVyciBUaHJlc2hvbGQgKi8KKworLyoKKyAqIFNvbWUgVm9sdGFnZXMgbmVlZCBkeW5hbWljIHRocmVzaG9sZHMKKyAqLworI2RlZmluZQlTS19TRU5fRFlOX0lOSVRfTk9ORQkJIDAgIC8qIE5vIGR5bmFtaWMgaW5pdCBvZiB0aHJlc2hvbGRzICovCisjZGVmaW5lCVNLX1NFTl9EWU5fSU5JVF9QQ0lfSU8JCTEwICAvKiBJbml0IFBDSS1JTyB3aXRoIG5ldyB0aHJlc2hvbGRzICovCisjZGVmaW5lCVNLX1NFTl9EWU5fSU5JVF9WQVVYCQkxMSAgLyogSW5pdCBWQVVYIHdpdGggbmV3IHRocmVzaG9sZHMgKi8KKworZXh0ZXJuCWludCBTa0xtODBSZWFkU2Vuc29yKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1NFTlNPUiAqcFNlbik7CisjZW5kaWYJLyogbl9JTkNfU0tHRUkyQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZWluaXQuaCBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlaW5pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NGY0N2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZWluaXQuaApAQCAtMCwwICsxLDg1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrZ2Vpbml0LmgKKyAqIFByb2plY3Q6CUdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcnMsIENvbW1vbiBNb2R1bGVzCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuODMgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDkvMTYgMTQ6MDc6MzcgJAorICogUHVycG9zZToJU3RydWN0dXJlcyBhbmQgcHJvdG90eXBlcyBmb3IgdGhlIEdFIEluaXQgTW9kdWxlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19JTkNfU0tHRUlOSVRfSF8KKyNkZWZpbmUgX19JTkNfU0tHRUlOSVRfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgkvKiBfX2NwbHVzcGx1cyAqLworCisvKiBkZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFNLX1RFU1RfVkFMCQkweDExMzM1NTc3VUwKKworLyogbW9kaWZ5aW5nIExpbmsgTEVEIGJlaGF2aW91ciAodXNlZCB3aXRoIFNrR2VMaW5rTEVEKCkpICovCisjZGVmaW5lIFNLX0xOS19PRkYJCUxFRF9PRkYKKyNkZWZpbmUgU0tfTE5LX09OCQkoTEVEX09OIHwgTEVEX0JMS19PRkYgfCBMRURfU1lOQ19PRkYpCisjZGVmaW5lIFNLX0xOS19CTElOSwkoTEVEX09OIHwgTEVEX0JMS19PTiAgfCBMRURfU1lOQ19PTikKKyNkZWZpbmUgU0tfTE5LX1BFUk0JCShMRURfT04gfCBMRURfQkxLX09GRiB8IExFRF9TWU5DX09OKQorI2RlZmluZSBTS19MTktfVFNUCQkoTEVEX09OIHwgTEVEX0JMS19PTiAgfCBMRURfU1lOQ19PRkYpCisKKy8qIHBhcmFtZXRlciAnTW9kZScgd2hlbiBjYWxsaW5nIFNLX0hXQUNfTElOS19MRUQoKSAqLworI2RlZmluZSBTS19MRURfT0ZGCQlMRURfT0ZGCisjZGVmaW5lIFNLX0xFRF9BQ1RJVkUJKExFRF9PTiB8IExFRF9CTEtfT0ZGIHwgTEVEX1NZTkNfT0ZGKQorI2RlZmluZSBTS19MRURfU1RBTkRCWQkoTEVEX09OIHwgTEVEX0JMS19PTiAgfCBMRURfU1lOQ19PRkYpCisKKy8qIGFkZHJlc3NpbmcgTEVEIFJlZ2lzdGVycyBpbiBTa0dlWG1pdExFRCgpICovCisjZGVmaW5lIFhNSVRfTEVEX0lOSQkwCisjZGVmaW5lIFhNSVRfTEVEX0NOVAkoUlhfTEVEX1ZBTCAtIFJYX0xFRF9JTkkpCisjZGVmaW5lIFhNSVRfTEVEX0NUUkwJKFJYX0xFRF9DVFJMLSBSWF9MRURfSU5JKQorI2RlZmluZSBYTUlUX0xFRF9UU1QJKFJYX0xFRF9UU1QgLSBSWF9MRURfSU5JKQorCisvKiBwYXJhbWV0ZXIgJ01vZGUnIHdoZW4gY2FsbGluZyBTa0dlWG1pdExFRCgpICovCisjZGVmaW5lIFNLX0xFRF9ESVMJMAorI2RlZmluZSBTS19MRURfRU5BCTEKKyNkZWZpbmUgU0tfTEVEX1RTVAkyCisKKy8qIENvdW50ZXIgYW5kIFRpbWVyIGNvbnN0YW50cywgZm9yIGEgaG9zdCBjbG9jayBvZiA2Mi41IE1IeiAqLworI2RlZmluZSBTS19YTUlUX0RVUgkJMHgwMDJmYWYwOFVMCS8qICA1MCBtcyAqLworI2RlZmluZSBTS19CTEtfRFVSCQkweDAxZGNkNjUwVUwJLyogNTAwIG1zICovCisKKyNkZWZpbmUgU0tfRFBPTExfREVGCTB4MDBlZTZiMjhVTAkvKiAyNTAgbXMgYXQgNjIuNSBNSHogKi8KKworI2RlZmluZSBTS19EUE9MTF9NQVgJMHgwMGZmZmZmZlVMCS8qIDI2OCBtcyBhdCA2Mi41IE1IeiAqLworCQkJCQkJCQkJCS8qIDIxNSBtcyBhdCA3OC4xMiBNSHogKi8KKworI2RlZmluZSBTS19GQUNUXzYyCQkxMDAJCQkvKiBpcyBnaXZlbiBpbiBwZXJjZW50ICovCisjZGVmaW5lIFNLX0ZBQ1RfNTMJCSA4NSAgICAgICAgIC8qIG9uIEdFTkVTSVM6CTUzLjEyIE1IeiAqLworI2RlZmluZSBTS19GQUNUXzc4CQkxMjUJCQkvKiBvbiBZVUtPTjoJNzguMTIgTUh6ICovCisKKy8qIFRpbWVvdXQgdmFsdWVzICovCisjZGVmaW5lIFNLX01BQ19UT181Mwk3MgkJCS8qIE1BQyBhcmJpdGVyIHRpbWVvdXQgKi8KKyNkZWZpbmUgU0tfUEtUX1RPXzUzCTB4MjAwMAkJLyogUGFja2V0IGFyYml0ZXIgdGltZW91dCAqLworI2RlZmluZSBTS19QS1RfVE9fTUFYCTB4ZmZmZgkJLyogTWF4aW11bSB2YWx1ZSAqLworI2RlZmluZSBTS19SSV9UT181MwkJMzYJCQkvKiBSQU0gaW50ZXJmYWNlIHRpbWVvdXQgKi8KKworI2RlZmluZSBTS19QSFlfQUNDX1RPCTYwMDAwMAkJLyogUEhZIGFjY2VzcyB0aW1lb3V0ICovCisKKy8qIFJBTSBCdWZmZXIgSGlnaCBQYXVzZSBUaHJlc2hvbGQgdmFsdWVzICovCisjZGVmaW5lIFNLX1JCX1VMUFAJCSggOCAqIDEwMjQpCS8qIFVwcGVyIExldmVsIGluIGtCLzggKi8KKyNkZWZpbmUgU0tfUkJfTExQUF9TCSgxMCAqIDEwMjQpCS8qIExvd2VyIExldmVsIGZvciBzbWFsbCBRdWV1ZXMgKi8KKyNkZWZpbmUgU0tfUkJfTExQUF9CCSgxNiAqIDEwMjQpCS8qIExvd2VyIExldmVsIGZvciBiaWcgUXVldWVzICovCisKKyNpZm5kZWYgU0tfQk1VX1JYX1dNCisjZGVmaW5lIFNLX0JNVV9SWF9XTQkweDYwMAkJLyogQk1VIFJ4IFdhdGVybWFyayAqLworI2VuZGlmCisjaWZuZGVmIFNLX0JNVV9UWF9XTQorI2RlZmluZSBTS19CTVVfVFhfV00JMHg2MDAJCS8qIEJNVSBUeCBXYXRlcm1hcmsgKi8KKyNlbmRpZgorCisvKiBYTUFDIElJIFJ4IEhpZ2ggV2F0ZXJtYXJrICovCisjZGVmaW5lIFNLX1hNX1JYX0hJX1dNCTB4MDVhYQkJLyogMTQ1MCAqLworCisvKiBYTUFDIElJIFR4IFRocmVzaG9sZCAqLworI2RlZmluZSBTS19YTV9USFJfUkVETAkweDAxZmIJCS8qIC4uIGZvciByZWR1bmRhbnQgbGluayB1c2FnZSAqLworI2RlZmluZSBTS19YTV9USFJfU0wJMHgwMWZiCQkvKiAuLiBmb3Igc2luZ2xlIGxpbmsgYWRhcHRlcnMgKi8KKyNkZWZpbmUgU0tfWE1fVEhSX01VTEwJMHgwMWZiCQkvKiAuLiBmb3IgbXVsdGlwbGUgbGluayB1c2FnZSAqLworI2RlZmluZSBTS19YTV9USFJfSlVNQk8JMHgwM2ZjCQkvKiAuLiBmb3IganVtYm8gZnJhbWUgdXNhZ2UgKi8KKworLyogdmFsdWVzIGZvciBHSVBvcnRVc2FnZSAqLworI2RlZmluZSBTS19SRURfTElOSwkJMQkJLyogcmVkdW5kYW50IGxpbmsgdXNhZ2UgKi8KKyNkZWZpbmUgU0tfTVVMX0xJTksJCTIJCS8qIG11bHRpcGxlIGxpbmsgdXNhZ2UgKi8KKyNkZWZpbmUgU0tfSlVNQk9fTElOSwkzCQkvKiBkcml2ZXIgdXNlcyBqdW1ibyBmcmFtZXMgKi8KKworLyogTWluaW11bSBSQU0gQnVmZmVyIFJ4IFF1ZXVlIFNpemUgKi8KKyNkZWZpbmUgU0tfTUlOX1JYUV9TSVpFCTE2CQkvKiAxNiBrQiAqLworCisvKiBNaW5pbXVtIFJBTSBCdWZmZXIgVHggUXVldWUgU2l6ZSAqLworI2RlZmluZSBTS19NSU5fVFhRX1NJWkUJMTYJCS8qIDE2IGtCICovCisKKy8qIFF1ZXVlIFNpemUgdW5pdHMgKi8KKyNkZWZpbmUgUVpfVU5JVFMJCTB4NworI2RlZmluZSBRWl9TVEVQCQkJOAorCisvKiBQZXJjZW50YWdlIG9mIHF1ZXVlIHNpemUgZnJvbSB3aG9sZSBtZW1vcnkgKi8KKy8qIDgwICUgZm9yIHJlY2VpdmUgKi8KKyNkZWZpbmUgUkFNX1FVT1RBX1JYCTgwTAorLyogMCUgZm9yIHN5bmMgdHJhbnNmZXIgKi8KKyNkZWZpbmUJUkFNX1FVT1RBX1NZTkMJMEwKKy8qIHRoZSByZXN0ICgyMCUpIGlzIHRha2VuIGZvciBhc3luYyB0cmFuc2ZlciAqLworCisvKiBHZXQgdGhlIHJvdW5kZWQgcXVldWUgc2l6ZSBpbiBCeXRlcyBpbiA4ayBzdGVwcyAqLworI2RlZmluZSBST1VORF9RVUVVRV9TSVpFKFNpemVJbkJ5dGVzKQkJCQkJXAorCSgoKCh1bnNpZ25lZCBsb25nKSAoU2l6ZUluQnl0ZXMpICsgKFFaX1NURVAqMTAyNEwpLTEpIC8gMTAyNCkgJglcCisJfihRWl9TVEVQLTEpKQorCisvKiBHZXQgdGhlIHJvdW5kZWQgcXVldWUgc2l6ZSBpbiBLQnl0ZXMgaW4gOGsgc3RlcHMgKi8KKyNkZWZpbmUgUk9VTkRfUVVFVUVfU0laRV9LQihLaWxvYnl0ZXMpIFwKKwlST1VORF9RVUVVRV9TSVpFKChLaWxvYnl0ZXMpICogMTAyNEwpCisKKy8qIFR5cGVzIG9mIFJBTSBCdWZmZXIgUXVldWVzICovCisjZGVmaW5lIFNLX1JYX1NSQU1fUQkxCS8qIHNtYWxsIHJlY2VpdmUgcXVldWUgKi8KKyNkZWZpbmUgU0tfUlhfQlJBTV9RCTIJLyogYmlnIHJlY2VpdmUgcXVldWUgKi8KKyNkZWZpbmUgU0tfVFhfUkFNX1EJCTMJLyogc21hbGwgb3IgYmlnIHRyYW5zbWl0IHF1ZXVlICovCisKKy8qIHBhcmFtZXRlciAnRGlyJyB3aGVuIGNhbGxpbmcgU2tHZVN0b3BQb3J0KCkgKi8KKyNkZWZpbmUgU0tfU1RPUF9UWAkxCS8qIFN0b3BzIHRoZSB0cmFuc21pdCBwYXRoLCByZXNldHMgdGhlIFhNQUMgKi8KKyNkZWZpbmUgU0tfU1RPUF9SWAkyCS8qIFN0b3BzIHRoZSByZWNlaXZlIHBhdGggKi8KKyNkZWZpbmUgU0tfU1RPUF9BTEwJMwkvKiBTdG9wcyBSeCBhbmQgVHggcGF0aCwgcmVzZXRzIHRoZSBYTUFDICovCisKKy8qIHBhcmFtZXRlciAnUnN0TW9kZScgd2hlbiBjYWxsaW5nIFNrR2VTdG9wUG9ydCgpICovCisjZGVmaW5lIFNLX1NPRlRfUlNUCTEJLyogcGVyZm9ybSBhIHNvZnR3YXJlIHJlc2V0ICovCisjZGVmaW5lIFNLX0hBUkRfUlNUCTIJLyogcGVyZm9ybSBhIGhhcmR3YXJlIHJlc2V0ICovCisKKy8qIEluaXQgTGV2ZWxzICovCisjZGVmaW5lIFNLX0lOSVRfREFUQQkwCS8qIEluaXQgbGV2ZWwgMDogaW5pdCBkYXRhIHN0cnVjdHVyZXMgKi8KKyNkZWZpbmUgU0tfSU5JVF9JTwkJMQkvKiBJbml0IGxldmVsIDE6IGluaXQgd2l0aCBJT3MgKi8KKyNkZWZpbmUgU0tfSU5JVF9SVU4JCTIJLyogSW5pdCBsZXZlbCAyOiBpbml0IGZvciBydW4gdGltZSAqLworCisvKiBMaW5rIE1vZGUgUGFyYW1ldGVyICovCisjZGVmaW5lIFNLX0xNT0RFX0hBTEYJCTEJLyogSGFsZiBEdXBsZXggTW9kZSAqLworI2RlZmluZSBTS19MTU9ERV9GVUxMCQkyCS8qIEZ1bGwgRHVwbGV4IE1vZGUgKi8KKyNkZWZpbmUgU0tfTE1PREVfQVVUT0hBTEYJMwkvKiBBdXRvSGFsZiBEdXBsZXggTW9kZSAqLworI2RlZmluZSBTS19MTU9ERV9BVVRPRlVMTAk0CS8qIEF1dG9GdWxsIER1cGxleCBNb2RlICovCisjZGVmaW5lIFNLX0xNT0RFX0FVVE9CT1RICTUJLyogQXV0b0JvdGggRHVwbGV4IE1vZGUgKi8KKyNkZWZpbmUgU0tfTE1PREVfQVVUT1NFTlNFCTYJLyogY29uZmlndXJlZCBtb2RlIGF1dG8gc2Vuc2luZyAqLworI2RlZmluZSBTS19MTU9ERV9JTkRFVEVSTUlOQVRFRAk3CS8qIGluZGV0ZXJtaW5hdGVkICovCisKKy8qIEF1dG8tbmVnb3RpYXRpb24gdGltZW91dCBpbiAxMDBtcyBncmFudWxhcml0eSAqLworI2RlZmluZSBTS19BTkRfTUFYX1RPCQk2CS8qIFdhaXQgNjAwIG1zZWMgYmVmb3JlIGxpbmsgY29tZXMgdXAgKi8KKworLyogQXV0by1uZWdvdGlhdGlvbiBlcnJvciBjb2RlcyAqLworI2RlZmluZSBTS19BTkRfT0sJCQkwCS8qIG5vIGVycm9yICovCisjZGVmaW5lIFNLX0FORF9PVEhFUgkJMQkvKiBvdGhlciBlcnJvciB0aGFuIGJlbG93ICovCisjZGVmaW5lIFNLX0FORF9EVVBfQ0FQCQkyCS8qIER1cGxleCBjYXBhYmlsaXRpZXMgZXJyb3IgKi8KKworCisvKiBMaW5rIFNwZWVkIENhcGFiaWxpdGllcyAqLworI2RlZmluZSBTS19MU1BFRURfQ0FQX0FVVE8JCQkoMTw8MCkJLyogQXV0b21hdGljIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgU0tfTFNQRUVEX0NBUF8xME1CUFMJCSgxPDwxKQkvKiAxMCBNYnBzICovCisjZGVmaW5lIFNLX0xTUEVFRF9DQVBfMTAwTUJQUwkJKDE8PDIpCS8qIDEwMCBNYnBzICovCisjZGVmaW5lIFNLX0xTUEVFRF9DQVBfMTAwME1CUFMJCSgxPDwzKQkvKiAxMDAwIE1icHMgKi8KKyNkZWZpbmUgU0tfTFNQRUVEX0NBUF9JTkRFVEVSTUlOQVRFRCAoMTw8NCkgLyogaW5kZXRlcm1pbmF0ZWQgKi8KKworLyogTGluayBTcGVlZCBQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgU0tfTFNQRUVEX0FVVE8JCQkJMQkvKiBBdXRvbWF0aWMgcmVzb2x1dGlvbiAqLworI2RlZmluZSBTS19MU1BFRURfMTBNQlBTCQkJMgkvKiAxMCBNYnBzICovCisjZGVmaW5lIFNLX0xTUEVFRF8xMDBNQlBTCQkJMwkvKiAxMDAgTWJwcyAqLworI2RlZmluZSBTS19MU1BFRURfMTAwME1CUFMJCQk0CS8qIDEwMDAgTWJwcyAqLworI2RlZmluZSBTS19MU1BFRURfSU5ERVRFUk1JTkFURUQJNQkvKiBpbmRldGVybWluYXRlZCAqLworCisvKiBMaW5rIFNwZWVkIEN1cnJlbnQgU3RhdGUgKi8KKyNkZWZpbmUgU0tfTFNQRUVEX1NUQVRfVU5LTk9XTgkJMQorI2RlZmluZSBTS19MU1BFRURfU1RBVF8xME1CUFMJCTIKKyNkZWZpbmUgU0tfTFNQRUVEX1NUQVRfMTAwTUJQUyAJCTMKKyNkZWZpbmUgU0tfTFNQRUVEX1NUQVRfMTAwME1CUFMJCTQKKyNkZWZpbmUgU0tfTFNQRUVEX1NUQVRfSU5ERVRFUk1JTkFURUQgNQorCisKKy8qIExpbmsgQ2FwYWJpbGl0eSBQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgU0tfTE1PREVfQ0FQX0hBTEYJCSgxPDwwKQkvKiBIYWxmIER1cGxleCBNb2RlICovCisjZGVmaW5lIFNLX0xNT0RFX0NBUF9GVUxMCQkoMTw8MSkJLyogRnVsbCBEdXBsZXggTW9kZSAqLworI2RlZmluZSBTS19MTU9ERV9DQVBfQVVUT0hBTEYJKDE8PDIpCS8qIEF1dG9IYWxmIER1cGxleCBNb2RlICovCisjZGVmaW5lIFNLX0xNT0RFX0NBUF9BVVRPRlVMTAkoMTw8MykJLyogQXV0b0Z1bGwgRHVwbGV4IE1vZGUgKi8KKyNkZWZpbmUgU0tfTE1PREVfQ0FQX0lOREVURVJNSU5BVEVEICgxPDw0KSAvKiBpbmRldGVybWluYXRlZCAqLworCisvKiBMaW5rIE1vZGUgQ3VycmVudCBTdGF0ZSAqLworI2RlZmluZSBTS19MTU9ERV9TVEFUX1VOS05PV04JMQkvKiBVbmtub3duIER1cGxleCBNb2RlICovCisjZGVmaW5lIFNLX0xNT0RFX1NUQVRfSEFMRgkJMgkvKiBIYWxmIER1cGxleCBNb2RlICovCisjZGVmaW5lIFNLX0xNT0RFX1NUQVRfRlVMTAkJMwkvKiBGdWxsIER1cGxleCBNb2RlICovCisjZGVmaW5lIFNLX0xNT0RFX1NUQVRfQVVUT0hBTEYJNAkvKiBIYWxmIER1cGxleCBNb2RlIG9idGFpbmVkIGJ5IEF1dG8tTmVnICovCisjZGVmaW5lIFNLX0xNT0RFX1NUQVRfQVVUT0ZVTEwJNQkvKiBGdWxsIER1cGxleCBNb2RlIG9idGFpbmVkIGJ5IEF1dG8tTmVnICovCisjZGVmaW5lIFNLX0xNT0RFX1NUQVRfSU5ERVRFUk1JTkFURUQgNgkvKiBpbmRldGVybWluYXRlZCAqLworCisvKiBGbG93IENvbnRyb2wgTW9kZSBQYXJhbWV0ZXIgKGFuZCBjYXBhYmlsaXRpZXMpICovCisjZGVmaW5lIFNLX0ZMT1dfTU9ERV9OT05FCQkxCS8qIE5vIEZsb3ctQ29udHJvbCAqLworI2RlZmluZSBTS19GTE9XX01PREVfTE9DX1NFTkQJMgkvKiBMb2NhbCBzdGF0aW9uIHNlbmRzIFBBVVNFICovCisjZGVmaW5lIFNLX0ZMT1dfTU9ERV9TWU1NRVRSSUMJMwkvKiBCb3RoIHN0YXRpb25zIG1heSBzZW5kIFBBVVNFICovCisjZGVmaW5lIFNLX0ZMT1dfTU9ERV9TWU1fT1JfUkVNCTQJLyogQm90aCBzdGF0aW9ucyBtYXkgc2VuZCBQQVVTRSBvcgorCQkJCQkgKiBqdXN0IHRoZSByZW1vdGUgc3RhdGlvbiBtYXkgc2VuZCBQQVVTRQorCQkJCQkgKi8KKyNkZWZpbmUgU0tfRkxPV19NT0RFX0lOREVURVJNSU5BVEVEIDUJLyogaW5kZXRlcm1pbmF0ZWQgKi8KKworLyogRmxvdyBDb250cm9sIFN0YXR1cyBQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgU0tfRkxPV19TVEFUX05PTkUJCTEJLyogTm8gRmxvdyBDb250cm9sICovCisjZGVmaW5lIFNLX0ZMT1dfU1RBVF9SRU1fU0VORAkyCS8qIFJlbW90ZSBTdGF0aW9uIHNlbmRzIFBBVVNFICovCisjZGVmaW5lIFNLX0ZMT1dfU1RBVF9MT0NfU0VORAkzCS8qIExvY2FsIHN0YXRpb24gc2VuZHMgUEFVU0UgKi8KKyNkZWZpbmUgU0tfRkxPV19TVEFUX1NZTU1FVFJJQwk0CS8qIEJvdGggc3RhdGlvbiBtYXkgc2VuZCBQQVVTRSAqLworI2RlZmluZSBTS19GTE9XX1NUQVRfSU5ERVRFUk1JTkFURUQgNQkvKiBpbmRldGVybWluYXRlZCAqLworCisvKiBNYXN0ZXIvU2xhdmUgTW9kZSBDYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgU0tfTVNfQ0FQX0FVVE8JCSgxPDwwKQkvKiBBdXRvbWF0aWMgcmVzb2x1dGlvbiAqLworI2RlZmluZSBTS19NU19DQVBfTUFTVEVSCSgxPDwxKQkvKiBUaGlzIHN0YXRpb24gaXMgbWFzdGVyICovCisjZGVmaW5lIFNLX01TX0NBUF9TTEFWRQkJKDE8PDIpCS8qIFRoaXMgc3RhdGlvbiBpcyBzbGF2ZSAqLworI2RlZmluZSBTS19NU19DQVBfSU5ERVRFUk1JTkFURUQgKDE8PDMpCS8qIGluZGV0ZXJtaW5hdGVkICovCisKKy8qIFNldCBNYXN0ZXIvU2xhdmUgTW9kZSBQYXJhbWV0ZXIgKGFuZCBjYXBhYmlsaXRpZXMpICovCisjZGVmaW5lIFNLX01TX01PREVfQVVUTwkJMQkvKiBBdXRvbWF0aWMgcmVzb2x1dGlvbiAqLworI2RlZmluZSBTS19NU19NT0RFX01BU1RFUgkyCS8qIFRoaXMgc3RhdGlvbiBpcyBtYXN0ZXIgKi8KKyNkZWZpbmUgU0tfTVNfTU9ERV9TTEFWRQkzCS8qIFRoaXMgc3RhdGlvbiBpcyBzbGF2ZSAqLworI2RlZmluZSBTS19NU19NT0RFX0lOREVURVJNSU5BVEVEIDQJLyogaW5kZXRlcm1pbmF0ZWQgKi8KKworLyogTWFzdGVyL1NsYXZlIFN0YXR1cyBQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgU0tfTVNfU1RBVF9VTlNFVAkxCS8qIFRoZSBNL1Mgc3RhdHVzIGlzIG5vdCBzZXQgKi8KKyNkZWZpbmUgU0tfTVNfU1RBVF9NQVNURVIJMgkvKiBUaGlzIHN0YXRpb24gaXMgbWFzdGVyICovCisjZGVmaW5lIFNLX01TX1NUQVRfU0xBVkUJMwkvKiBUaGlzIHN0YXRpb24gaXMgc2xhdmUgKi8KKyNkZWZpbmUgU0tfTVNfU1RBVF9GQVVMVAk0CS8qIE0vUyByZXNvbHV0aW9uIGZhaWxlZCAqLworI2RlZmluZSBTS19NU19TVEFUX0lOREVURVJNSU5BVEVEIDUJLyogaW5kZXRlcm1pbmF0ZWQgKi8KKworLyogcGFyYW1ldGVyICdNb2RlJyB3aGVuIGNhbGxpbmcgU2tYbVNldFJ4Q21kKCkgKi8KKyNkZWZpbmUgU0tfU1RSSVBfRkNTX09OCQkoMTw8MCkJLyogRW5hYmxlICBGQ1Mgc3RyaXBwaW5nIG9mIFJ4IGZyYW1lcyAqLworI2RlZmluZSBTS19TVFJJUF9GQ1NfT0ZGCSgxPDwxKQkvKiBEaXNhYmxlIEZDUyBzdHJpcHBpbmcgb2YgUnggZnJhbWVzICovCisjZGVmaW5lIFNLX1NUUklQX1BBRF9PTgkJKDE8PDIpCS8qIEVuYWJsZSAgcGFkIGJ5dGUgc3RyaXBwaW5nIG9mIFJ4IGZyICovCisjZGVmaW5lIFNLX1NUUklQX1BBRF9PRkYJKDE8PDMpCS8qIERpc2FibGUgcGFkIGJ5dGUgc3RyaXBwaW5nIG9mIFJ4IGZyICovCisjZGVmaW5lIFNLX0xFTkVSUl9PS19PTgkJKDE8PDQpCS8qIERvbid0IGNoayBmciBmb3IgaW4gcmFuZ2UgbGVuIGVycm9yICovCisjZGVmaW5lIFNLX0xFTkVSUl9PS19PRkYJKDE8PDUpCS8qIENoZWNrIGZyYW1lcyBmb3IgaW4gcmFuZ2UgbGVuIGVycm9yICovCisjZGVmaW5lIFNLX0JJR19QS19PS19PTgkJKDE8PDYpCS8qIERvbid0IHNldCBSeCBFcnJvciBiaXQgZm9yIGJpZyBmcmFtZXMgKi8KKyNkZWZpbmUgU0tfQklHX1BLX09LX09GRgkoMTw8NykJLyogU2V0IFJ4IEVycm9yIGJpdCBmb3IgYmlnIGZyYW1lcyAqLworI2RlZmluZSBTS19TRUxGX1JYX09OCQkoMTw8OCkJLyogRW5hYmxlICBSeCBvZiBvd24gcGFja2V0cyAqLworI2RlZmluZSBTS19TRUxGX1JYX09GRgkJKDE8PDkpCS8qIERpc2FibGUgUnggb2Ygb3duIHBhY2tldHMgKi8KKworLyogcGFyYW1ldGVyICdQYXJhJyB3aGVuIGNhbGxpbmcgU2tNYWNTZXRSeFR4RW4oKSAqLworI2RlZmluZSBTS19NQUNfTE9PUEJfT04JCSgxPDwwKQkvKiBFbmFibGUgIE1BQyBMb29wYmFjayBNb2RlICovCisjZGVmaW5lIFNLX01BQ19MT09QQl9PRkYJKDE8PDEpCS8qIERpc2FibGUgTUFDIExvb3BiYWNrIE1vZGUgKi8KKyNkZWZpbmUgU0tfUEhZX0xPT1BCX09OCQkoMTw8MikJLyogRW5hYmxlICBQSFkgTG9vcGJhY2sgTW9kZSAqLworI2RlZmluZSBTS19QSFlfTE9PUEJfT0ZGCSgxPDwzKQkvKiBEaXNhYmxlIFBIWSBMb29wYmFjayBNb2RlICovCisjZGVmaW5lIFNLX1BIWV9GVUxMRF9PTgkJKDE8PDQpCS8qIEVuYWJsZSAgR01JSSBGdWxsIER1cGxleCAqLworI2RlZmluZSBTS19QSFlfRlVMTERfT0ZGCSgxPDw1KQkvKiBEaXNhYmxlIEdNSUkgRnVsbCBEdXBsZXggKi8KKworLyogU3RhdGVzIG9mIFBTdGF0ZSAqLworI2RlZmluZSBTS19QUlRfUkVTRVQJMAkvKiB0aGUgcG9ydCBpcyByZXNldCAqLworI2RlZmluZSBTS19QUlRfU1RPUAkJMQkvKiB0aGUgcG9ydCBpcyBzdG9wcGVkIChzaW1pbGFyIHRvIFNXIHJlc2V0KSAqLworI2RlZmluZSBTS19QUlRfSU5JVAkJMgkvKiB0aGUgcG9ydCBpcyBpbml0aWFsaXplZCAqLworI2RlZmluZSBTS19QUlRfUlVOCQkzCS8qIHRoZSBwb3J0IGhhcyBhbiBhY3RpdmUgbGluayAqLworCisvKiBQSFkgcG93ZXIgZG93biBtb2RlcyAqLworI2RlZmluZSBQSFlfUE1fT1BFUkFUSU9OQUxfTU9ERQkJMAkvKiBQSFkgb3BlcmF0aW9uYWwgbW9kZSAqLworI2RlZmluZSBQSFlfUE1fREVFUF9TTEVFUAkJCTEJLyogY29tYSBtb2RlIC0tPiBtaW5pbWFsIHBvd2VyICovCisjZGVmaW5lIFBIWV9QTV9JRUVFX1BPV0VSX0RPV04JCTIJLyogSUVFRSAyMi4yLjQuMS41IGNvbXBsLiBwb3dlciBkb3duICovCisjZGVmaW5lIFBIWV9QTV9FTkVSR1lfREVURUNUCQkzCS8qIGVuZXJneSBkZXRlY3QgKi8KKyNkZWZpbmUgUEhZX1BNX0VORVJHWV9ERVRFQ1RfUExVUwk0CS8qIGVuZXJneSBkZXRlY3QgcGx1cyAqLworCisvKiBEZWZhdWx0IHJlY2VpdmUgZnJhbWUgbGltaXQgZm9yIFdvcmthcm91bmQgb2YgWE1BQyBFcnJhdGEgKi8KKyNkZWZpbmUgU0tfREVGX1JYX1dBX0xJTQlTS19DT05TVFU2NCgxMDApCisKKy8qIHZhbHVlcyBmb3IgR0lMZWRCbGlua0N0cmwgKExFRCBCbGluayBDb250cm9sKSAqLworI2RlZmluZSBTS19BQ1RfTEVEX0JMSU5LCSgxPDwwKQkvKiBBY3RpdmUgTEVEIGJsaW5raW5nICovCisjZGVmaW5lIFNLX0RVUF9MRURfTk9STUFMCSgxPDwxKQkvKiBEdXBsZXggTEVEIG5vcm1hbCAqLworI2RlZmluZSBTS19MRURfTElOSzEwMF9PTgkoMTw8MikJLyogTGluayAxMDBNIExFRCBvbiAqLworCisvKiBMaW5rIFBhcnRuZXIgU3RhdHVzICovCisjZGVmaW5lIFNLX0xJUEFfVU5LTk9XTgkwCS8qIExpbmsgcGFydG5lciBpcyBpbiB1bmtub3duIHN0YXRlICovCisjZGVmaW5lIFNLX0xJUEFfTUFOVUFMCTEJLyogTGluayBwYXJ0bmVyIGlzIGluIGRldGVjdGVkIG1hbnVhbCBzdGF0ZSAqLworI2RlZmluZSBTS19MSVBBX0FVVE8JMgkvKiBMaW5rIHBhcnRuZXIgaXMgaW4gYXV0by1uZWdvdGlhdGlvbiBzdGF0ZSAqLworCisvKiBNYXhpbXVtIFJlc3RhcnRzIGJlZm9yZSByZXN0YXJ0IGlzIGlnbm9yZWQgKDNDb20gV0EpICovCisjZGVmaW5lIFNLX01BWF9MUkVTVEFSVAkzCS8qIE1heC4gMyB0aW1lcyB0aGUgbGluayBpcyByZXN0YXJ0ZWQgKi8KKworLyogTWF4LiBBdXRvLW5lZy4gdGltZW91dHMgYmVmb3JlIGxpbmsgZGV0ZWN0aW9uIGluIHNlbnNlIG1vZGUgaXMgcmVzZXQgKi8KKyNkZWZpbmUgU0tfTUFYX0FORUdfVE8JMTAJLyogTWF4LiAxMCB0aW1lcyB0aGUgc2Vuc2UgbW9kZSBpcyByZXNldCAqLworCisvKiBzdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogTUFDIHNwZWNpZmljIGZ1bmN0aW9ucworICovCit0eXBlZGVmIHN0cnVjdCBzX0dlTWFjRnVuYyB7CisJaW50ICAoKnBGbk1hY1VwZGF0ZVN0YXRzKShTS19BQyAqcEFDLCBTS19JT0MgSW9DLCB1bnNpZ25lZCBpbnQgUG9ydCk7CisJaW50ICAoKnBGbk1hY1N0YXRpc3RpYykoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgdW5zaWduZWQgaW50IFBvcnQsCisJCQkJCQkJU0tfVTE2IFN0YXRBZGRyLCBTS19VMzIgU0tfRkFSICpwVmFsKTsKKwlpbnQgICgqcEZuTWFjUmVzZXRDb3VudGVyKShTS19BQyAqcEFDLCBTS19JT0MgSW9DLCB1bnNpZ25lZCBpbnQgUG9ydCk7CisJaW50ICAoKnBGbk1hY092ZXJmbG93KShTS19BQyAqcEFDLCBTS19JT0MgSW9DLCB1bnNpZ25lZCBpbnQgUG9ydCwKKwkJCQkJCSAgIFNLX1UxNiBJU3RhdHVzLCBTS19VNjQgU0tfRkFSICpwVmFsKTsKK30gU0tfR0VNQUNGVU5DOworCisvKgorICogUG9ydCBTdHJ1Y3R1cmUKKyAqLwordHlwZWRlZglzdHJ1Y3Qgc19HZVBvcnQgeworI2lmbmRlZiBTS19ESUFHCisJU0tfVElNRVIJUFdhVGltZXI7CS8qIFdvcmthcm91bmQgVGltZXIgKi8KKwlTS19USU1FUglIYWxmRHVwQ2hrVGltZXI7CisjZW5kaWYgLyogU0tfRElBRyAqLworCVNLX1UzMglQUHJldlNob3J0czsJLyogUHJldmlvdXMgU2hvcnQgQ291bnRlciBjaGVja2luZyAqLworCVNLX1UzMglQUHJldkZjczsJCS8qIFByZXZpb3VzIEZDUyBFcnJvciBDb3VudGVyIGNoZWNraW5nICovCisJU0tfVTY0CVBQcmV2Ung7CQkvKiBQcmV2aW91cyBSeE9rIENvdW50ZXIgY2hlY2tpbmcgKi8KKwlTS19VNjQJUFJ4TGltOwkJCS8qIFByZXZpb3VzIFJ4T2sgQ291bnRlciBjaGVja2luZyAqLworCVNLX1U2NAlMYXN0T2N0ZXRzOwkJLyogRm9yIGhhbGYgZHVwbGV4IGhhbmcgY2hlY2sgKi8KKwlpbnQJCVBMaW5rUmVzQ3Q7CQkvKiBMaW5rIFJlc3RhcnQgQ291bnRlciAqLworCWludAkJUEF1dG9OZWdUaW1lT3V0Oy8qIEF1dG8tbmVnb3RpYXRpb24gdGltZW91dCBjdXJyZW50IHZhbHVlICovCisJaW50CQlQQXV0b05lZ1RPQ3Q7CS8qIEF1dG8tbmVnb3RpYXRpb24gVGltZW91dCBDb3VudGVyICovCisJaW50CQlQUnhRU2l6ZTsJCS8qIFBvcnQgUnggUXVldWUgU2l6ZSBpbiBrQiAqLworCWludAkJUFhTUVNpemU7CQkvKiBQb3J0IFN5bmNocm9ub3VzICBUcmFuc21pdCBRdWV1ZSBTaXplIGluIGtCICovCisJaW50CQlQWEFRU2l6ZTsJCS8qIFBvcnQgQXN5bmNocm9ub3VzIFRyYW5zbWl0IFF1ZXVlIFNpemUgaW4ga0IgKi8KKwlTS19VMzIJUFJ4UVJhbVN0YXJ0OwkvKiBSZWNlaXZlIFF1ZXVlIFJBTSBCdWZmZXIgU3RhcnQgQWRkcmVzcyAqLworCVNLX1UzMglQUnhRUmFtRW5kOwkJLyogUmVjZWl2ZSBRdWV1ZSBSQU0gQnVmZmVyIEVuZCBBZGRyZXNzICovCisJU0tfVTMyCVBYc1FSYW1TdGFydDsJLyogU3luYyBUeCBRdWV1ZSBSQU0gQnVmZmVyIFN0YXJ0IEFkZHJlc3MgKi8KKwlTS19VMzIJUFhzUVJhbUVuZDsJCS8qIFN5bmMgVHggUXVldWUgUkFNIEJ1ZmZlciBFbmQgQWRkcmVzcyAqLworCVNLX1UzMglQWGFRUmFtU3RhcnQ7CS8qIEFzeW5jIFR4IFF1ZXVlIFJBTSBCdWZmZXIgU3RhcnQgQWRkcmVzcyAqLworCVNLX1UzMglQWGFRUmFtRW5kOwkJLyogQXN5bmMgVHggUXVldWUgUkFNIEJ1ZmZlciBFbmQgQWRkcmVzcyAqLworCVNLX1UzMglQUnhPdmVyQ250OwkJLyogUmVjZWl2ZSBPdmVyZmxvdyBDb3VudGVyICovCisJaW50CQlQUnhRT2ZmOwkJLyogUnggUXVldWUgQWRkcmVzcyBPZmZzZXQgKi8KKwlpbnQJCVBYc1FPZmY7CQkvKiBTeW5jaHJvbm91cyBUeCBRdWV1ZSBBZGRyZXNzIE9mZnNldCAqLworCWludAkJUFhhUU9mZjsJCS8qIEFzeW5jaHJvbm91cyBUeCBRdWV1ZSBBZGRyZXNzIE9mZnNldCAqLworCWludAkJUGh5VHlwZTsJCS8qIFBIWSB1c2VkIG9uIHRoaXMgcG9ydCAqLworCWludAkJUFN0YXRlOwkJCS8qIFBvcnQgc3RhdHVzIChyZXNldCwgc3RvcCwgaW5pdCwgcnVuKSAqLworCVNLX1UxNglQaHlJZDE7CQkJLyogUEhZIElkMSBvbiB0aGlzIHBvcnQgKi8KKwlTS19VMTYJUGh5QWRkcjsJCS8qIE1ESU8vTURDIFBIWSBhZGRyZXNzICovCisJU0tfVTE2CVBJc2F2ZTsJCQkvKiBTYXZlZCBJbnRlcnJ1cHQgc3RhdHVzIHdvcmQgKi8KKwlTS19VMTYJUFNzYXZlOwkJCS8qIFNhdmVkIFBIWSBzdGF0dXMgd29yZCAqLworCVNLX1UxNglQR21BTmVnQWR2OwkJLyogU2F2ZWQgR1BoeSBBdXRvTmVnQWR2ZXJ0aXNtZW50IHJlZ2lzdGVyICovCisJU0tfQk9PTAlQSFdMaW5rVXA7CQkvKiBUaGUgaGFyZHdhcmUgTGluayBpcyB1cCAod2lyaW5nKSAqLworCVNLX0JPT0wJUExpbmtCcm9rZW47CS8qIElzIExpbmsgYnJva2VuID8gKi8KKwlTS19CT09MCVBDaGVja1BhcjsJCS8qIERvIHdlIGNoZWNrIGZvciBwYXJpdHkgZXJyb3JzID8gKi8KKwlTS19CT09MCUhhbGZEdXBUaW1lckFjdGl2ZTsKKwlTS19VOAlQTGlua0NhcDsJCS8qIExpbmsgQ2FwYWJpbGl0aWVzICovCisJU0tfVTgJUExpbmtNb2RlQ29uZjsJLyogTGluayBNb2RlIGNvbmZpZ3VyZWQgKi8KKwlTS19VOAlQTGlua01vZGU7CQkvKiBMaW5rIE1vZGUgY3VycmVudGx5IHVzZWQgKi8KKwlTS19VOAlQTGlua01vZGVTdGF0dXM7LyogTGluayBNb2RlIFN0YXR1cyAqLworCVNLX1U4CVBMaW5rU3BlZWRDYXA7CS8qIExpbmsgU3BlZWQgQ2FwYWJpbGl0aWVzKDEwLzEwMC8xMDAwIE1icHMpICovCisJU0tfVTgJUExpbmtTcGVlZDsJCS8qIGNvbmZpZ3VyZWQgTGluayBTcGVlZCAoMTAvMTAwLzEwMDAgTWJwcykgKi8KKwlTS19VOAlQTGlua1NwZWVkVXNlZDsJLyogY3VycmVudCBMaW5rIFNwZWVkICgxMC8xMDAvMTAwMCBNYnBzKSAqLworCVNLX1U4CVBGbG93Q3RybENhcDsJLyogRmxvdyBDb250cm9sIENhcGFiaWxpdGllcyAqLworCVNLX1U4CVBGbG93Q3RybE1vZGU7CS8qIEZsb3cgQ29udHJvbCBNb2RlICovCisJU0tfVTgJUEZsb3dDdHJsU3RhdHVzOy8qIEZsb3cgQ29udHJvbCBTdGF0dXMgKi8KKwlTS19VOAlQTVNDYXA7CQkJLyogTWFzdGVyL1NsYXZlIENhcGFiaWxpdGllcyAqLworCVNLX1U4CVBNU01vZGU7CQkvKiBNYXN0ZXIvU2xhdmUgTW9kZSAqLworCVNLX1U4CVBNU1N0YXR1czsJCS8qIE1hc3Rlci9TbGF2ZSBTdGF0dXMgKi8KKwlTS19CT09MCVBBdXRvTmVnRmFpbDsJLyogQXV0by1uZWdvdGlhdGlvbiBmYWlsIGZsYWcgKi8KKwlTS19VOAlQTGlwYUF1dG9OZWc7CS8qIEF1dG8tbmVnb3RpYXRpb24gcG9zc2libGUgd2l0aCBMaW5rIFBhcnRuZXIgKi8KKwlTS19VOAlQQ2FibGVMZW47CQkvKiBDYWJsZSBMZW5ndGggKi8KKwlTS19VOAlQTWRpUGFpckxlbls0XTsJLyogTURJWzAuLjNdIFBhaXIgTGVuZ3RoICovCisJU0tfVTgJUE1kaVBhaXJTdHNbNF07CS8qIE1ESVswLi4zXSBQYWlyIERpYWdub3N0aWMgU3RhdHVzICovCisJU0tfVTgJUFBoeVBvd2VyU3RhdGU7CS8qIFBIWSBjdXJyZW50IHBvd2VyIHN0YXRlICovCisJaW50CQlQTWFjQ29sVGhyZXM7CS8qIE1BQyBDb2xsaXNpb24gVGhyZXNob2xkICovCisJaW50CQlQTWFjSmFtTGVuOwkJLyogTUFDIEphbSBsZW5ndGggKi8KKwlpbnQJCVBNYWNKYW1JcGdWYWw7CS8qIE1BQyBKYW0gSVBHICovCisJaW50CQlQTWFjSmFtSXBnRGF0YTsJLyogTUFDIElQRyBKYW0gdG8gRGF0YSAqLworCWludAkJUE1hY0lwZ0RhdGE7CS8qIE1BQyBEYXRhIElQRyAqLworCVNLX0JPT0wgUE1hY0xpbWl0NDsJCS8qIHJlc2V0IGNvbGxpc2lvbiBjb3VudGVyIGFuZCBiYWNrb2ZmIGFsZ29yaXRobSAqLworfSBTS19HRVBPUlQ7CisKKy8qCisgKiBHaWdhYml0IEV0aGVybmV0IEluaXRpYWxpemF0aW9uIFN0cnVjdAorICogKGhhcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgYWRhcHRlciBjb250ZXh0KQorICovCit0eXBlZGVmCXN0cnVjdCBzX0dlSW5pdCB7CisJaW50CQkJR0lDaGlwSWQ7CQkvKiBDaGlwIElkZW50aWZpY2F0aW9uIE51bWJlciAqLworCWludAkJCUdJQ2hpcFJldjsJCS8qIENoaXAgUmV2aXNpb24gTnVtYmVyICovCisJU0tfVTgJCUdJUGNpSHdSZXY7CQkvKiBQQ0kgSFcgUmV2aXNpb24gTnVtYmVyICovCisJU0tfQk9PTAkJR0lHZW5lc2lzOwkJLyogR2VuZXNpcyBhZGFwdGVyID8gKi8KKwlTS19CT09MCQlHSVl1a29uOwkJLyogWVVLT04tQTEvQnggY2hpcCAqLworCVNLX0JPT0wJCUdJWXVrb25MaXRlOwkvKiBZVUtPTi1MaXRlIGNoaXAgKi8KKwlTS19CT09MCQlHSUNvcHBlclR5cGU7CS8qIENvcHBlciBUeXBlIGFkYXB0ZXIgPyAqLworCVNLX0JPT0wJCUdJUGNpU2xvdDY0OwkvKiA2NC1iaXQgUENJIFNsb3QgKi8KKwlTS19CT09MCQlHSVBjaUNsb2NrNjY7CS8qIDY2IE1IeiBQQ0kgQ2xvY2sgKi8KKwlTS19CT09MCQlHSVZhdXhBdmFpbDsJLyogVkFVWCBhdmFpbGFibGUgKFlVS09OKSAqLworCVNLX0JPT0wJCUdJWXVrb24zMkJpdDsJLyogMzItQml0IFlVS09OIGFkYXB0ZXIgKi8KKwlTS19VMTYJCUdJTGVkQmxpbmtDdHJsOwkvKiBMRUQgQmxpbmsgQ29udHJvbCAqLworCWludAkJCUdJTWFjc0ZvdW5kOwkvKiBOdW1iZXIgb2YgTUFDcyBmb3VuZCBvbiB0aGlzIGFkYXB0ZXIgKi8KKwlpbnQJCQlHSU1hY1R5cGU7CQkvKiBNQUMgVHlwZSB1c2VkIG9uIHRoaXMgYWRhcHRlciAqLworCWludAkJCUdJSHN0Q2xrRmFjdDsJLyogSG9zdCBDbG9jayBGYWN0b3IgKDYyLjUgLyBIc3RDbGsgKiAxMDApICovCisJaW50CQkJR0lQb3J0VXNhZ2U7CS8qIERyaXZlciBQb3J0IFVzYWdlICovCisJaW50CQkJR0lMZXZlbDsJCS8qIEluaXRpYWxpemF0aW9uIExldmVsIGNvbXBsZXRlZCAqLworCWludAkJCUdJUmFtU2l6ZTsJCS8qIFRoZSBSQU0gc2l6ZSBvZiB0aGUgYWRhcHRlciBpbiBrQiAqLworCWludAkJCUdJV29sT2ZmczsJCS8qIFdPTCBSZWdpc3RlciBPZmZzZXQgKEhXLUJ1ZyBpbiBSZXYuIEEpICovCisJU0tfVTMyCQlHSVJhbU9mZnM7CQkvKiBSQU0gQWRkcmVzcyBPZmZzZXQgZm9yIGFkZHIgY2FsY3VsYXRpb24gKi8KKwlTS19VMzIJCUdJUG9sbFRpbWVyVmFsOwkvKiBEZXNjci4gUG9sbCBUaW1lciBJbml0IFZhbCAoSHN0Q2xrIHRpY2tzKSAqLworCVNLX1UzMgkJR0lWYWxJcnFNYXNrOwkvKiBWYWx1ZSBmb3IgSW50ZXJydXB0IE1hc2sgKi8KKwlTS19VMzIJCUdJVGltZVN0YW1wQ250OwkvKiBUaW1lIFN0YW1wIEhpZ2ggQ291bnRlciAoWVVLT04gb25seSkgKi8KKwlTS19HRVBPUlQJR1BbU0tfTUFYX01BQ1NdOy8qIFBvcnQgRGVwZW5kZW50IEluZm9ybWF0aW9uICovCisJU0tfR0VNQUNGVU5DIEdJRnVuYzsJCS8qIE1BQyBkZXBlZGVudCBmdW5jdGlvbnMgKi8KK30gU0tfR0VJTklUOworCisvKgorICogRXJyb3IgbnVtYmVycyBhbmQgbWVzc2FnZXMgZm9yIHNreG1hYzIuYyBhbmQgc2tnZWluaXQuYworICovCisjZGVmaW5lIFNLRVJSX0hXSV9FMDAxCQkoU0tfRVJSQkFTRV9IV0lOSVQpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDAxTVNHCSJTa1htQ2xyRXhhY3RBZGRyKCkgaGFzIGdvdCBpbGxlZ2FsIHBhcmFtZXRlcnMiCisjZGVmaW5lIFNLRVJSX0hXSV9FMDAyCQkoU0tFUlJfSFdJX0UwMDErMSkKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMDJNU0cJIlNrR2VJbml0KCk6IExldmVsIDEgY2FsbCBtaXNzaW5nIgorI2RlZmluZSBTS0VSUl9IV0lfRTAwMwkJKFNLRVJSX0hXSV9FMDAyKzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDAzTVNHCSJTa0dlSW5pdCgpIGNhbGxlZCB3aXRoIGlsbGVnYWwgaW5pdCBMZXZlbCIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMDQJCShTS0VSUl9IV0lfRTAwMysxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAwNE1TRwkiU2tHZUluaXRQb3J0KCk6IFF1ZXVlIFNpemUgaWxsZWdhbCBjb25maWd1cmVkIgorI2RlZmluZSBTS0VSUl9IV0lfRTAwNQkJKFNLRVJSX0hXSV9FMDA0KzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDA1TVNHCSJTa0dlSW5pdFBvcnQoKTogY2Fubm90IGluaXQgcnVubmluZyBwb3J0cyIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMDYJCShTS0VSUl9IV0lfRTAwNSsxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAwNk1TRwkiU2tHZU1hY0luaXQoKTogUFN0YXRlIGRvZXMgbm90IG1hdGNoIEhXIHN0YXRlIgorI2RlZmluZSBTS0VSUl9IV0lfRTAwNwkJKFNLRVJSX0hXSV9FMDA2KzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDA3TVNHCSJTa1htSW5pdER1cE1kKCkgY2FsbGVkIHdpdGggaW52YWxpZCBEdXAgTW9kZSIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMDgJCShTS0VSUl9IV0lfRTAwNysxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAwOE1TRwkiU2tYbVNldFJ4Q21kKCkgY2FsbGVkIHdpdGggaW52YWxpZCBNb2RlIgorI2RlZmluZSBTS0VSUl9IV0lfRTAwOQkJKFNLRVJSX0hXSV9FMDA4KzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDA5TVNHCSJTa0dlQ2ZnU3luYygpIGNhbGxlZCBhbHRob3VnaCBQWFNRU2l6ZSB6ZXJvIgorI2RlZmluZSBTS0VSUl9IV0lfRTAxMAkJKFNLRVJSX0hXSV9FMDA5KzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDEwTVNHCSJTa0dlQ2ZnU3luYygpIGNhbGxlZCB3aXRoIGludmFsaWQgcGFyYW1ldGVycyIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMTEJCShTS0VSUl9IV0lfRTAxMCsxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAxMU1TRwkiU2tHZUluaXRQb3J0KCk6IFJlY2VpdmUgUXVldWUgU2l6ZSB0b28gc21hbGwiCisjZGVmaW5lIFNLRVJSX0hXSV9FMDEyCQkoU0tFUlJfSFdJX0UwMTErMSkKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMTJNU0cJIlNrR2VJbml0UG9ydCgpOiBpbnZhbGlkIFF1ZXVlIFNpemUgc3BlY2lmaWVkIgorI2RlZmluZSBTS0VSUl9IV0lfRTAxMwkJKFNLRVJSX0hXSV9FMDEyKzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDEzTVNHCSJTa0dlSW5pdFBvcnQoKTogY2ZnIGNoYW5nZWQgZm9yIHJ1bm5pbmcgcXVldWUiCisjZGVmaW5lIFNLRVJSX0hXSV9FMDE0CQkoU0tFUlJfSFdJX0UwMTMrMSkKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMTRNU0cJIlNrR2VJbml0UG9ydCgpOiB1bmtub3duIEdJUG9ydFVzYWdlIHNwZWNpZmllZCIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMTUJCShTS0VSUl9IV0lfRTAxNCsxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAxNU1TRwkiSWxsZWdhbCBMaW5rIG1vZGUgcGFyYW1ldGVyIgorI2RlZmluZSBTS0VSUl9IV0lfRTAxNgkJKFNLRVJSX0hXSV9FMDE1KzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDE2TVNHCSJJbGxlZ2FsIEZsb3cgY29udHJvbCBtb2RlIHBhcmFtZXRlciIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMTcJCShTS0VSUl9IV0lfRTAxNisxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAxN01TRwkiSWxsZWdhbCB2YWx1ZSBzcGVjaWZpZWQgZm9yIEdJUG9sbFRpbWVyVmFsIgorI2RlZmluZSBTS0VSUl9IV0lfRTAxOAkJKFNLRVJSX0hXSV9FMDE3KzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDE4TVNHCSJGQVRBTDogU2tHZVN0b3BQb3J0KCkgZG9lcyBub3QgdGVybWluYXRlIChUeCkiCisjZGVmaW5lIFNLRVJSX0hXSV9FMDE5CQkoU0tFUlJfSFdJX0UwMTgrMSkKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMTlNU0cJIklsbGVnYWwgU3BlZWQgcGFyYW1ldGVyIgorI2RlZmluZSBTS0VSUl9IV0lfRTAyMAkJKFNLRVJSX0hXSV9FMDE5KzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDIwTVNHCSJJbGxlZ2FsIE1hc3Rlci9TbGF2ZSBwYXJhbWV0ZXIiCisjZGVmaW5lIFNLRVJSX0hXSV9FMDIxCQkoU0tFUlJfSFdJX0UwMjArMSkKKyNkZWZpbmUJU0tFUlJfSFdJX0UwMjFNU0cJIk1hY1VwZGF0ZVN0YXRzKCk6IGNhbm5vdCB1cGRhdGUgc3RhdGlzdGljIGNvdW50ZXIiCisjZGVmaW5lCVNLRVJSX0hXSV9FMDIyCQkoU0tFUlJfSFdJX0UwMjErMSkKKyNkZWZpbmUJU0tFUlJfSFdJX0UwMjJNU0cJIk1hY1N0YXRpc3RpYygpOiBpbGxlZ2FsIHN0YXRpc3RpYyBiYXNlIGFkZHJlc3MiCisjZGVmaW5lIFNLRVJSX0hXSV9FMDIzCQkoU0tFUlJfSFdJX0UwMjIrMSkKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMjNNU0cJIlNrR2VJbml0UG9ydCgpOiBUcmFuc21pdCBRdWV1ZSBTaXplIHRvbyBzbWFsbCIKKyNkZWZpbmUgU0tFUlJfSFdJX0UwMjQJCShTS0VSUl9IV0lfRTAyMysxKQorI2RlZmluZSBTS0VSUl9IV0lfRTAyNE1TRwkiRkFUQUw6IFNrR2VTdG9wUG9ydCgpIGRvZXMgbm90IHRlcm1pbmF0ZSAoUngpIgorI2RlZmluZSBTS0VSUl9IV0lfRTAyNQkJKFNLRVJSX0hXSV9FMDI0KzEpCisjZGVmaW5lIFNLRVJSX0hXSV9FMDI1TVNHCSIiCisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYJU0tfS1JfUFJPVE8KKworLyoKKyAqIHB1YmxpYyBmdW5jdGlvbnMgaW4gc2tnZWluaXQuYworICovCitleHRlcm4gdm9pZAlTa0dlUG9sbFJ4RCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0LAorCVNLX0JPT0wJUG9sbFJ4RCk7CisKK2V4dGVybiB2b2lkCVNrR2VQb2xsVHhEKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJU0tfQk9PTCBQb2xsVHhEKTsKKworZXh0ZXJuIHZvaWQJU2tHZVllbGxvd0xFRCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlTdGF0ZSk7CisKK2V4dGVybiBpbnQJU2tHZUNmZ1N5bmMoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlTS19VMzIJSW50VGltZSwKKwlTS19VMzIJTGltQ291bnQsCisJaW50CQlTeW5jTW9kZSk7CisKK2V4dGVybiB2b2lkCVNrR2VMb2FkTG5rU3luY0NudCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0LAorCVNLX1UzMglDbnRWYWwpOworCitleHRlcm4gdm9pZAlTa0dlU3RvcFBvcnQoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlpbnQJCURpciwKKwlpbnQJCVJzdE1vZGUpOworCitleHRlcm4gaW50CVNrR2VJbml0KAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCUxldmVsKTsKKworZXh0ZXJuIHZvaWQJU2tHZURlSW5pdCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MpOworCitleHRlcm4gaW50CVNrR2VJbml0UG9ydCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0KTsKKworZXh0ZXJuIHZvaWQJU2tHZVhtaXRMRUQoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJTGVkLAorCWludAkJTW9kZSk7CisKK2V4dGVybiB2b2lkCVNrR2VJbml0UmFtSWZhY2UoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DKTsKKworZXh0ZXJuIGludAlTa0dlSW5pdEFzc2lnblJhbVRvUXVldWVzKAorCVNLX0FDCSpwQUMsCisJaW50CQlBY3RpdmVQb3J0LAorCVNLX0JPT0wJRHVhbE5ldCk7CisKKy8qCisgKiBwdWJsaWMgZnVuY3Rpb25zIGluIHNreG1hYzIuYworICovCitleHRlcm4gdm9pZCBTa01hY1J4VHhEaXNhYmxlKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQpOworCitleHRlcm4gdm9pZAlTa01hY1NvZnRSc3QoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCk7CisKK2V4dGVybiB2b2lkCVNrTWFjSGFyZFJzdCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0KTsKKworZXh0ZXJuIHZvaWQJU2tNYWNDbGVhclJzdCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0KTsKKworZXh0ZXJuIHZvaWQJU2tYbUluaXRNYWMoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCk7CisKK2V4dGVybiB2b2lkCVNrR21Jbml0TWFjKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQpOworCitleHRlcm4gdm9pZCBTa01hY0luaXRQaHkoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlTS19CT09MCURvTG9vcCk7CisKK2V4dGVybiB2b2lkIFNrTWFjSXJxRGlzYWJsZSgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0KTsKKworZXh0ZXJuIHZvaWQJU2tNYWNGbHVzaFR4RmlmbygKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0KTsKKworZXh0ZXJuIHZvaWQJU2tNYWNGbHVzaFJ4RmlmbygKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0KTsKKworZXh0ZXJuIHZvaWQJU2tNYWNJcnEoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCk7CisKK2V4dGVybiBpbnQJU2tNYWNBdXRvTmVnRG9uZSgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0KTsKKworZXh0ZXJuIHZvaWQJU2tNYWNBdXRvTmVnTGlwYVBoeSgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0LAorCVNLX1UxNglJU3RhdHVzKTsKKworZXh0ZXJuIHZvaWQgIFNrTWFjU2V0UnhUeEVuKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJaW50CQlQYXJhKTsKKworZXh0ZXJuIGludCAgU2tNYWNSeFR4RW5hYmxlKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQpOworCitleHRlcm4gdm9pZAlTa01hY1Byb21pc2NNb2RlKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJU0tfQk9PTAlFbmFibGUpOworCitleHRlcm4gdm9pZAlTa01hY0hhc2hpbmcoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlTS19CT09MCUVuYWJsZSk7CisKK2V4dGVybiB2b2lkCVNrWG1QaHlSZWFkKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJaW50CQlBZGRyLAorCVNLX1UxNglTS19GQVIgKnBWYWwpOworCitleHRlcm4gdm9pZAlTa1htUGh5V3JpdGUoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlpbnQJCUFkZHIsCisJU0tfVTE2CVZhbCk7CisKK2V4dGVybiB2b2lkCVNrR21QaHlSZWFkKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJaW50CQlBZGRyLAorCVNLX1UxNglTS19GQVIgKnBWYWwpOworCitleHRlcm4gdm9pZAlTa0dtUGh5V3JpdGUoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlpbnQJCUFkZHIsCisJU0tfVTE2CVZhbCk7CisKK2V4dGVybiB2b2lkCVNrWG1DbHJFeGFjdEFkZHIoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlpbnQJCVN0YXJ0TnVtLAorCWludAkJU3RvcE51bSk7CisKK2V4dGVybiB2b2lkCVNrWG1Jbml0RHVwTWQoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCk7CisKK2V4dGVybiB2b2lkCVNrWG1Jbml0UGF1c2VNZCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0KTsKKworZXh0ZXJuIHZvaWQJU2tYbUF1dG9OZWdMaXBhWG1hYygKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0LAorCVNLX1UxNglJU3RhdHVzKTsKKworZXh0ZXJuIGludCBTa1htVXBkYXRlU3RhdHMoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCXVuc2lnbmVkIGludCBQb3J0KTsKKworZXh0ZXJuIGludCBTa0dtVXBkYXRlU3RhdHMoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCXVuc2lnbmVkIGludCBQb3J0KTsKKworZXh0ZXJuIGludCBTa1htTWFjU3RhdGlzdGljKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwl1bnNpZ25lZCBpbnQgUG9ydCwKKwlTS19VMTYJU3RhdEFkZHIsCisJU0tfVTMyCVNLX0ZBUiAqcFZhbCk7CisKK2V4dGVybiBpbnQgU2tHbU1hY1N0YXRpc3RpYygKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJdW5zaWduZWQgaW50IFBvcnQsCisJU0tfVTE2CVN0YXRBZGRyLAorCVNLX1UzMglTS19GQVIgKnBWYWwpOworCitleHRlcm4gaW50IFNrWG1SZXNldENvdW50ZXIoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCXVuc2lnbmVkIGludCBQb3J0KTsKKworZXh0ZXJuIGludCBTa0dtUmVzZXRDb3VudGVyKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwl1bnNpZ25lZCBpbnQgUG9ydCk7CisKK2V4dGVybiBpbnQgU2tYbU92ZXJmbG93U3RhdHVzKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwl1bnNpZ25lZCBpbnQgUG9ydCwKKwlTS19VMTYgIElTdGF0dXMsCisJU0tfVTY0CVNLX0ZBUiAqcFN0YXR1cyk7CisKK2V4dGVybiBpbnQgU2tHbU92ZXJmbG93U3RhdHVzKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwl1bnNpZ25lZCBpbnQgUG9ydCwKKwlTS19VMTYJTWFjU3RhdHVzLAorCVNLX1U2NAlTS19GQVIgKnBTdGF0dXMpOworCitleHRlcm4gaW50IFNrR21DYWJsZURpYWdTdGF0dXMoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlTS19CT09MCVN0YXJ0VGVzdCk7CisKK2V4dGVybiBpbnQgU2tHbUVudGVyTG93UG93ZXJNb2RlKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJU0tfVTgJTW9kZSk7CisKK2V4dGVybiBpbnQgU2tHbUxlYXZlTG93UG93ZXJNb2RlKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQpOworCisjaWZkZWYgU0tfRElBRworZXh0ZXJuIHZvaWQJU2tHZVBoeVJlYWQoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlpbnQJCUFkZHIsCisJU0tfVTE2CSpwVmFsKTsKKworZXh0ZXJuIHZvaWQJU2tHZVBoeVdyaXRlKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJaW50CQlBZGRyLAorCVNLX1UxNglWYWwpOworCitleHRlcm4gdm9pZAlTa01hY1NldFJ4Q21kKAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCVBvcnQsCisJaW50CQlNb2RlKTsKK2V4dGVybiB2b2lkCVNrTWFjQ3JjR2VuZXIoCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCWludAkJUG9ydCwKKwlTS19CT09MCUVuYWJsZSk7CitleHRlcm4gdm9pZAlTa01hY1RpbWVTdGFtcCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0LAorCVNLX0JPT0wJRW5hYmxlKTsKK2V4dGVybiB2b2lkCVNrWG1TZW5kQ29udCgKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJaW50CQlQb3J0LAorCVNLX0JPT0wJRW5hYmxlKTsKKyNlbmRpZiAvKiBTS19ESUFHICovCisKKyNlbHNlCS8qIFNLX0tSX1BST1RPICovCisKKy8qCisgKiBwdWJsaWMgZnVuY3Rpb25zIGluIHNrZ2Vpbml0LmMKKyAqLworZXh0ZXJuIHZvaWQJU2tHZVBvbGxSeEQoKTsKK2V4dGVybiB2b2lkCVNrR2VQb2xsVHhEKCk7CitleHRlcm4gdm9pZAlTa0dlWWVsbG93TEVEKCk7CitleHRlcm4gaW50CVNrR2VDZmdTeW5jKCk7CitleHRlcm4gdm9pZAlTa0dlTG9hZExua1N5bmNDbnQoKTsKK2V4dGVybiB2b2lkCVNrR2VTdG9wUG9ydCgpOworZXh0ZXJuIGludAlTa0dlSW5pdCgpOworZXh0ZXJuIHZvaWQJU2tHZURlSW5pdCgpOworZXh0ZXJuIGludAlTa0dlSW5pdFBvcnQoKTsKK2V4dGVybiB2b2lkCVNrR2VYbWl0TEVEKCk7CitleHRlcm4gdm9pZAlTa0dlSW5pdFJhbUlmYWNlKCk7CitleHRlcm4gaW50CVNrR2VJbml0QXNzaWduUmFtVG9RdWV1ZXMoKTsKKworLyoKKyAqIHB1YmxpYyBmdW5jdGlvbnMgaW4gc2t4bWFjMi5jCisgKi8KK2V4dGVybiB2b2lkIFNrTWFjUnhUeERpc2FibGUoKTsKK2V4dGVybiB2b2lkCVNrTWFjU29mdFJzdCgpOworZXh0ZXJuIHZvaWQJU2tNYWNIYXJkUnN0KCk7CitleHRlcm4gdm9pZAlTa01hY0NsZWFyUnN0KCk7CitleHRlcm4gdm9pZCBTa01hY0luaXRQaHkoKTsKK2V4dGVybiBpbnQgIFNrTWFjUnhUeEVuYWJsZSgpOworZXh0ZXJuIHZvaWQgU2tNYWNQcm9taXNjTW9kZSgpOworZXh0ZXJuIHZvaWQgU2tNYWNIYXNoaW5nKCk7CitleHRlcm4gdm9pZCBTa01hY0lycURpc2FibGUoKTsKK2V4dGVybiB2b2lkCVNrTWFjRmx1c2hUeEZpZm8oKTsKK2V4dGVybiB2b2lkCVNrTWFjRmx1c2hSeEZpZm8oKTsKK2V4dGVybiB2b2lkCVNrTWFjSXJxKCk7CitleHRlcm4gaW50CVNrTWFjQXV0b05lZ0RvbmUoKTsKK2V4dGVybiB2b2lkCVNrTWFjQXV0b05lZ0xpcGFQaHkoKTsKK2V4dGVybiB2b2lkIFNrTWFjU2V0UnhUeEVuKCk7CitleHRlcm4gdm9pZAlTa1htSW5pdE1hYygpOworZXh0ZXJuIHZvaWQJU2tYbVBoeVJlYWQoKTsKK2V4dGVybiB2b2lkCVNrWG1QaHlXcml0ZSgpOworZXh0ZXJuIHZvaWQJU2tHbUluaXRNYWMoKTsKK2V4dGVybiB2b2lkCVNrR21QaHlSZWFkKCk7CitleHRlcm4gdm9pZAlTa0dtUGh5V3JpdGUoKTsKK2V4dGVybiB2b2lkCVNrWG1DbHJFeGFjdEFkZHIoKTsKK2V4dGVybiB2b2lkCVNrWG1Jbml0RHVwTWQoKTsKK2V4dGVybiB2b2lkCVNrWG1Jbml0UGF1c2VNZCgpOworZXh0ZXJuIHZvaWQJU2tYbUF1dG9OZWdMaXBhWG1hYygpOworZXh0ZXJuIGludAlTa1htVXBkYXRlU3RhdHMoKTsKK2V4dGVybiBpbnQJU2tHbVVwZGF0ZVN0YXRzKCk7CitleHRlcm4gaW50CVNrWG1NYWNTdGF0aXN0aWMoKTsKK2V4dGVybiBpbnQJU2tHbU1hY1N0YXRpc3RpYygpOworZXh0ZXJuIGludAlTa1htUmVzZXRDb3VudGVyKCk7CitleHRlcm4gaW50CVNrR21SZXNldENvdW50ZXIoKTsKK2V4dGVybiBpbnQJU2tYbU92ZXJmbG93U3RhdHVzKCk7CitleHRlcm4gaW50CVNrR21PdmVyZmxvd1N0YXR1cygpOworZXh0ZXJuIGludAlTa0dtQ2FibGVEaWFnU3RhdHVzKCk7CitleHRlcm4gaW50CVNrR21FbnRlckxvd1Bvd2VyTW9kZSgpOworZXh0ZXJuIGludAlTa0dtTGVhdmVMb3dQb3dlck1vZGUoKTsKKworI2lmZGVmIFNLX0RJQUcKK2V4dGVybiB2b2lkCVNrR2VQaHlSZWFkKCk7CitleHRlcm4gdm9pZAlTa0dlUGh5V3JpdGUoKTsKK2V4dGVybiB2b2lkCVNrTWFjU2V0UnhDbWQoKTsKK2V4dGVybiB2b2lkCVNrTWFjQ3JjR2VuZXIoKTsKK2V4dGVybiB2b2lkCVNrTWFjVGltZVN0YW1wKCk7CitleHRlcm4gdm9pZAlTa1htU2VuZENvbnQoKTsKKyNlbmRpZiAvKiBTS19ESUFHICovCisKKyNlbmRpZgkvKiBTS19LUl9QUk9UTyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgkvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYJLyogX19JTkNfU0tHRUlOSVRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlcG5tMi5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2Vwbm0yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRkMzA0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2dlcG5tMi5oCkBAIC0wLDAgKzEsMzM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2dlcG5tMi5oCisgKiBQcm9qZWN0OglHRW5lc2lzLCBQQ0kgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMzYgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDUvMjMgMTI6NDU6MTMgJAorICogUHVycG9zZToJRGVmaW5lcyBmb3IgUHJpdmF0ZSBOZXR3b3JrIE1hbmFnZW1lbnQgSW50ZXJmYWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1NLR0VQTk0yX0hfCisjZGVmaW5lIF9TS0dFUE5NMl9IXworCisvKgorICogR2VuZXJhbCBkZWZpbml0aW9ucworICovCisjZGVmaW5lIFNLX1BOTUlfQ0hJUFNFVF9YTUFDCTEJLyogWE1BQzExODAwRlAgKi8KKyNkZWZpbmUgU0tfUE5NSV9DSElQU0VUX1lVS09OCTIJLyogWVVLT04gKi8KKworI2RlZmluZQlTS19QTk1JX0JVU19QQ0kJCTEJLyogUENJIGJ1cyovCisKKy8qCisgKiBBY3Rpb25zCisgKi8KKyNkZWZpbmUgU0tfUE5NSV9BQ1RfSURMRQkJMQorI2RlZmluZSBTS19QTk1JX0FDVF9SRVNFVAkJMgorI2RlZmluZSBTS19QTk1JX0FDVF9TRUxGVEVTVAkzCisjZGVmaW5lIFNLX1BOTUlfQUNUX1JFU0VUQ05UCTQKKworLyoKKyAqIFZQRCByZWxlYXRlZCBkZWZpbmVzCisgKi8KKworI2RlZmluZSBTS19QTk1JX1ZQRF9SVwkJMQorI2RlZmluZSBTS19QTk1JX1ZQRF9STwkJMgorCisjZGVmaW5lIFNLX1BOTUlfVlBEX09LCQkJMAorI2RlZmluZSBTS19QTk1JX1ZQRF9OT1RGT1VORAkxCisjZGVmaW5lIFNLX1BOTUlfVlBEX0NVVAkJCTIKKyNkZWZpbmUgU0tfUE5NSV9WUERfVElNRU9VVAkJMworI2RlZmluZSBTS19QTk1JX1ZQRF9GVUxMCQk0CisjZGVmaW5lIFNLX1BOTUlfVlBEX05PV1JJVEUJCTUKKyNkZWZpbmUgU0tfUE5NSV9WUERfRkFUQUwJCTYKKworI2RlZmluZSBTS19QTk1JX1ZQRF9JR05PUkUJMAorI2RlZmluZSBTS19QTk1JX1ZQRF9DUkVBVEUJMQorI2RlZmluZSBTS19QTk1JX1ZQRF9ERUxFVEUJMgorCisKKy8qCisgKiBSTE1UIHJlbGF0ZWQgZGVmaW5lcworICovCisjZGVmaW5lIFNLX1BOTUlfREVGX1JMTVRfQ0hHX1RIUkVTCTI0MAkvKiA0IGNoYW5nZXMgcGVyIG1pbnV0ZSAqLworCisKKy8qCisgKiBWQ1QgaW50ZXJuYWwgc3RhdHVzIHZhbHVlcworICovCisjZGVmaW5lIFNLX1BOTUlfVkNUX1BFTkRJTkcJMzIKKyNkZWZpbmUgU0tfUE5NSV9WQ1RfVEVTVF9ET05FCTY0CisjZGVmaW5lIFNLX1BOTUlfVkNUX0xJTksJMTI4CisKKy8qCisgKiBJbnRlcm5hbCB0YWJsZSBkZWZpbml0aW9ucworICovCisjZGVmaW5lIFNLX1BOTUlfR0VUCQkwCisjZGVmaW5lIFNLX1BOTUlfUFJFU0VUCTEKKyNkZWZpbmUgU0tfUE5NSV9TRVQJCTIKKworI2RlZmluZSBTS19QTk1JX1JPCQkwCisjZGVmaW5lIFNLX1BOTUlfUlcJCTEKKyNkZWZpbmUgU0tfUE5NSV9XTwkJMgorCit0eXBlZGVmIHN0cnVjdCBzX09pZFRhYkVudHJ5IHsKKwlTS19VMzIJCQlJZDsKKwlTS19VMzIJCQlJbnN0YW5jZU5vOworCXVuc2lnbmVkIGludAlTdHJ1Y3RTaXplOworCXVuc2lnbmVkIGludAlPZmZzZXQ7CisJaW50CQkJCUFjY2VzczsKKwlpbnQJCQkJKCogRnVuYykoU0tfQUMgKnBBYywgU0tfSU9DIHBJbywgaW50IGFjdGlvbiwKKwkJCQkJCQkgU0tfVTMyIElkLCBjaGFyKiBwQnVmLCB1bnNpZ25lZCBpbnQqIHBMZW4sCisJCQkJCQkJIFNLX1UzMiBJbnN0YW5jZSwgdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsCisJCQkJCQkJIFNLX1UzMiBOZXROdW1iZXIpOworCVNLX1UxNgkJCVBhcmFtOworfSBTS19QTk1JX1RBQl9FTlRSWTsKKworCisvKgorICogVHJhcCBsZW5ndGhzCisgKi8KKyNkZWZpbmUgU0tfUE5NSV9UUkFQX1NJTVBMRV9MRU4JCQkxNworI2RlZmluZSBTS19QTk1JX1RSQVBfU0VOU09SX0xFTl9CQVNFCTQ2CisjZGVmaW5lIFNLX1BOTUlfVFJBUF9STE1UX0NIQU5HRV9MRU4JMjMKKyNkZWZpbmUgU0tfUE5NSV9UUkFQX1JMTVRfUE9SVF9MRU4JCTIzCisKKy8qCisgKiBOdW1iZXIgb2YgTUFDIHR5cGVzIHN1cHBvcnRlZAorICovCisjZGVmaW5lIFNLX1BOTUlfTUFDX1RZUEVTCShTS19NQUNfR01BQyArIDEpCisKKy8qCisgKiBNQUMgc3RhdGlzdGljIGRhdGEgbGlzdCAob3ZlcmFsbCBzZXQgZm9yIE1BQyB0eXBlcyB1c2VkKQorICovCitlbnVtIFNLX01BQ1NUQVRTIHsKKwlTS19QTk1JX0hUWAkJCQk9IDAsCisJU0tfUE5NSV9IVFhfT0NURVQsCisJU0tfUE5NSV9IVFhfT0NURVRISUdIIAk9IFNLX1BOTUlfSFRYX09DVEVULAorCVNLX1BOTUlfSFRYX09DVEVUTE9XLAorCVNLX1BOTUlfSFRYX0JST0FEQ0FTVCwKKwlTS19QTk1JX0hUWF9NVUxUSUNBU1QsCisJU0tfUE5NSV9IVFhfVU5JQ0FTVCwKKwlTS19QTk1JX0hUWF9CVVJTVCwKKwlTS19QTk1JX0hUWF9QTUFDQywKKwlTS19QTk1JX0hUWF9NQUNDLAorCVNLX1BOTUlfSFRYX0NPTCwKKwlTS19QTk1JX0hUWF9TSU5HTEVfQ09MLAorCVNLX1BOTUlfSFRYX01VTFRJX0NPTCwKKwlTS19QTk1JX0hUWF9FWENFU1NfQ09MLAorCVNLX1BOTUlfSFRYX0xBVEVfQ09MLAorCVNLX1BOTUlfSFRYX0RFRkZFUkFMLAorCVNLX1BOTUlfSFRYX0VYQ0VTU19ERUYsCisJU0tfUE5NSV9IVFhfVU5ERVJSVU4sCisJU0tfUE5NSV9IVFhfQ0FSUklFUiwKKwlTS19QTk1JX0hUWF9VVElMVU5ERVIsCisJU0tfUE5NSV9IVFhfVVRJTE9WRVIsCisJU0tfUE5NSV9IVFhfNjQsCisJU0tfUE5NSV9IVFhfMTI3LAorCVNLX1BOTUlfSFRYXzI1NSwKKwlTS19QTk1JX0hUWF81MTEsCisJU0tfUE5NSV9IVFhfMTAyMywKKwlTS19QTk1JX0hUWF9NQVgsCisJU0tfUE5NSV9IVFhfTE9OR0ZSQU1FUywKKwlTS19QTk1JX0hUWF9TWU5DLAorCVNLX1BOTUlfSFRYX1NZTkNfT0NURVQsCisJU0tfUE5NSV9IVFhfUkVTRVJWRUQsCisJCisJU0tfUE5NSV9IUlgsCisJU0tfUE5NSV9IUlhfT0NURVQsCisJU0tfUE5NSV9IUlhfT0NURVRISUdICT0gU0tfUE5NSV9IUlhfT0NURVQsCisJU0tfUE5NSV9IUlhfT0NURVRMT1csCisJU0tfUE5NSV9IUlhfQkFET0NURVQsCisJU0tfUE5NSV9IUlhfQkFET0NURVRISUdIID0gU0tfUE5NSV9IUlhfQkFET0NURVQsCisJU0tfUE5NSV9IUlhfQkFET0NURVRMT1csCisJU0tfUE5NSV9IUlhfQlJPQURDQVNULAorCVNLX1BOTUlfSFJYX01VTFRJQ0FTVCwKKwlTS19QTk1JX0hSWF9VTklDQVNULAorCVNLX1BOTUlfSFJYX1BNQUNDLAorCVNLX1BOTUlfSFJYX01BQ0MsCisJU0tfUE5NSV9IUlhfUE1BQ0NfRVJSLAorCVNLX1BOTUlfSFJYX01BQ0NfVU5LV04sCisJU0tfUE5NSV9IUlhfQlVSU1QsCisJU0tfUE5NSV9IUlhfTUlTU0VELAorCVNLX1BOTUlfSFJYX0ZSQU1JTkcsCisJU0tfUE5NSV9IUlhfVU5ERVJTSVpFLAorCVNLX1BOTUlfSFJYX09WRVJGTE9XLAorCVNLX1BOTUlfSFJYX0pBQkJFUiwKKwlTS19QTk1JX0hSWF9DQVJSSUVSLAorCVNLX1BOTUlfSFJYX0lSTEVOR1RILAorCVNLX1BOTUlfSFJYX1NZTUJPTCwKKwlTS19QTk1JX0hSWF9TSE9SVFMsCisJU0tfUE5NSV9IUlhfUlVOVCwKKwlTS19QTk1JX0hSWF9UT09fTE9ORywKKwlTS19QTk1JX0hSWF9GQ1MsCisJU0tfUE5NSV9IUlhfQ0VYVCwKKwlTS19QTk1JX0hSWF9VVElMVU5ERVIsCisJU0tfUE5NSV9IUlhfVVRJTE9WRVIsCisJU0tfUE5NSV9IUlhfNjQsCisJU0tfUE5NSV9IUlhfMTI3LAorCVNLX1BOTUlfSFJYXzI1NSwKKwlTS19QTk1JX0hSWF81MTEsCisJU0tfUE5NSV9IUlhfMTAyMywKKwlTS19QTk1JX0hSWF9NQVgsCisJU0tfUE5NSV9IUlhfTE9OR0ZSQU1FUywKKwkKKwlTS19QTk1JX0hSWF9SRVNFUlZFRCwKKwkKKwlTS19QTk1JX01BWF9JRFgJCS8qIE5PVEU6IEVuc3VyZSBTS19QTk1JX0NOVF9OTyBpcyBzZXQgdG8gdGhpcyB2YWx1ZSAqLworfTsKKworLyoKKyAqIE1BQyBzcGVjaWZpYyBkYXRhCisgKi8KK3R5cGVkZWYgc3RydWN0IHNfUG5taVN0YXRBZGRyIHsKKwlTS19VMTYJCVJlZzsJCS8qIE1BQyByZWdpc3RlciBjb250YWluaW5nIHRoZSB2YWx1ZSAqLworCVNLX0JPT0wJCUdldE9mZnNldDsJLyogVFJVRTogT2Zmc2V0IG1hbmFnZWQgYnkgUE5NSSAoY2FsbCBHZXRTdGF0VmFsKCkpKi8KK30gU0tfUE5NSV9TVEFUQUREUjsKKworCisvKgorICogU0tfUE5NSV9TVFJVQ1RfREFUQSBjb3B5IG9mZnNldCBldmFsdWF0aW9uIG1hY3JvcworICovCisjZGVmaW5lIFNLX1BOTUlfT0ZGKGUpCQkoKFNLX1UzMikoU0tfVVBUUikmKCgoU0tfUE5NSV9TVFJVQ1RfREFUQSAqKTApLT5lKSkKKyNkZWZpbmUgU0tfUE5NSV9NQUlfT0ZGKGUpCSgoU0tfVTMyKShTS19VUFRSKSYoKChTS19QTk1JX1NUUlVDVF9EQVRBICopMCktPmUpKQorI2RlZmluZSBTS19QTk1JX1ZQRF9PRkYoZSkJKChTS19VMzIpKFNLX1VQVFIpJigoKFNLX1BOTUlfVlBEICopMCktPmUpKQorI2RlZmluZSBTS19QTk1JX1NFTl9PRkYoZSkJKChTS19VMzIpKFNLX1VQVFIpJigoKFNLX1BOTUlfU0VOU09SICopMCktPmUpKQorI2RlZmluZSBTS19QTk1JX0NIS19PRkYoZSkJKChTS19VMzIpKFNLX1VQVFIpJigoKFNLX1BOTUlfQ0hFQ0tTVU0gKikwKS0+ZSkpCisjZGVmaW5lIFNLX1BOTUlfU1RBX09GRihlKQkoKFNLX1UzMikoU0tfVVBUUikmKCgoU0tfUE5NSV9TVEFUICopMCktPmUpKQorI2RlZmluZSBTS19QTk1JX0NORl9PRkYoZSkJKChTS19VMzIpKFNLX1VQVFIpJigoKFNLX1BOTUlfQ09ORiAqKTApLT5lKSkKKyNkZWZpbmUgU0tfUE5NSV9STE1fT0ZGKGUpCSgoU0tfVTMyKShTS19VUFRSKSYoKChTS19QTk1JX1JMTVQgKikwKS0+ZSkpCisjZGVmaW5lIFNLX1BOTUlfTU9OX09GRihlKQkoKFNLX1UzMikoU0tfVVBUUikmKCgoU0tfUE5NSV9STE1UX01PTklUT1IgKikwKS0+ZSkpCisjZGVmaW5lIFNLX1BOTUlfVFJQX09GRihlKQkoKFNLX1UzMikoU0tfVVBUUikmKCgoU0tfUE5NSV9UUkFQICopMCktPmUpKQorCisjZGVmaW5lIFNLX1BOTUlfU0VUX1NUQVQoYixzLG8pCXtTS19VMzIJVmFsMzI7IGNoYXIgKnBWYWw7IFwKKwkJCQkJVmFsMzIgPSAocyk7IFwKKwkJCQkJcFZhbCA9IChjaGFyICopKGIpICsgKChTS19VMzIpKFNLX1VQVFIpIFwKKwkJCQkJCSYoKChTS19QTk1JX1NUUlVDVF9EQVRBICopMCktPiBcCisJCQkJCQlSZXR1cm5TdGF0dXMuRXJyb3JTdGF0dXMpKTsgXAorCQkJCQlTS19QTk1JX1NUT1JFX1UzMihwVmFsLCBWYWwzMik7IFwKKwkJCQkJVmFsMzIgPSAobyk7IFwKKwkJCQkJcFZhbCA9IChjaGFyICopKGIpICsgKChTS19VMzIpKFNLX1VQVFIpIFwKKwkJCQkJCSYoKChTS19QTk1JX1NUUlVDVF9EQVRBICopMCktPiBcCisJCQkJCQlSZXR1cm5TdGF0dXMuRXJyb3JPZmZzZXQpKTsgXAorCQkJCQlTS19QTk1JX1NUT1JFX1UzMihwVmFsLCBWYWwzMik7fQorCisvKgorICogVGltZSBtYWNyb3MKKyAqLworI2lmbmRlZiBTS19QTk1JX0hVTkRSRURTX1NFQworI2lmIFNLX1RJQ0tTX1BFUl9TRUMgPT0gMTAwCisjZGVmaW5lIFNLX1BOTUlfSFVORFJFRFNfU0VDKHQpCSh0KQorI2Vsc2UKKyNkZWZpbmUgU0tfUE5NSV9IVU5EUkVEU19TRUModCkJKCgodCkgKiAxMDApIC8gKFNLX1RJQ0tTX1BFUl9TRUMpKQorI2VuZGlmIC8qICFTS19USUNLU19QRVJfU0VDICovCisjZW5kaWYgLyogIVNLX1BOTUlfSFVORFJFRFNfU0VDICovCisKKy8qCisgKiBNYWNyb3MgdG8gd29yayBhcm91bmQgYWxpZ25tZW50IHByb2JsZW1zCisgKi8KKyNpZm5kZWYgU0tfUE5NSV9TVE9SRV9VMTYKKyNkZWZpbmUgU0tfUE5NSV9TVE9SRV9VMTYocCx2KQl7KihjaGFyICopKHApID0gKigoY2hhciAqKSYodikpOyBcCisJCQkJCSooKGNoYXIgKikocCkgKyAxKSA9IFwKKwkJCQkJCSooKChjaGFyICopJih2KSkgKyAxKTt9CisjZW5kaWYKKworI2lmbmRlZiBTS19QTk1JX1NUT1JFX1UzMgorI2RlZmluZSBTS19QTk1JX1NUT1JFX1UzMihwLHYpCXsqKGNoYXIgKikocCkgPSAqKChjaGFyICopJih2KSk7IFwKKwkJCQkJKigoY2hhciAqKShwKSArIDEpID0gXAorCQkJCQkJKigoKGNoYXIgKikmKHYpKSArIDEpOyBcCisJCQkJCSooKGNoYXIgKikocCkgKyAyKSA9IFwKKwkJCQkJCSooKChjaGFyICopJih2KSkgKyAyKTsgXAorCQkJCQkqKChjaGFyICopKHApICsgMykgPSBcCisJCQkJCQkqKCgoY2hhciAqKSYodikpICsgMyk7fQorI2VuZGlmCisKKyNpZm5kZWYgU0tfUE5NSV9TVE9SRV9VNjQKKyNkZWZpbmUgU0tfUE5NSV9TVE9SRV9VNjQocCx2KQl7KihjaGFyICopKHApID0gKigoY2hhciAqKSYodikpOyBcCisJCQkJCSooKGNoYXIgKikocCkgKyAxKSA9IFwKKwkJCQkJCSooKChjaGFyICopJih2KSkgKyAxKTsgXAorCQkJCQkqKChjaGFyICopKHApICsgMikgPSBcCisJCQkJCQkqKCgoY2hhciAqKSYodikpICsgMik7IFwKKwkJCQkJKigoY2hhciAqKShwKSArIDMpID0gXAorCQkJCQkJKigoKGNoYXIgKikmKHYpKSArIDMpOyBcCisJCQkJCSooKGNoYXIgKikocCkgKyA0KSA9IFwKKwkJCQkJCSooKChjaGFyICopJih2KSkgKyA0KTsgXAorCQkJCQkqKChjaGFyICopKHApICsgNSkgPSBcCisJCQkJCQkqKCgoY2hhciAqKSYodikpICsgNSk7IFwKKwkJCQkJKigoY2hhciAqKShwKSArIDYpID0gXAorCQkJCQkJKigoKGNoYXIgKikmKHYpKSArIDYpOyBcCisJCQkJCSooKGNoYXIgKikocCkgKyA3KSA9IFwKKwkJCQkJCSooKChjaGFyICopJih2KSkgKyA3KTt9CisjZW5kaWYKKworI2lmbmRlZiBTS19QTk1JX1JFQURfVTE2CisjZGVmaW5lIFNLX1BOTUlfUkVBRF9VMTYocCx2KQl7KigoY2hhciAqKSYodikpID0gKihjaGFyICopKHApOyBcCisJCQkJCSooKChjaGFyICopJih2KSkgKyAxKSA9IFwKKwkJCQkJCSooKGNoYXIgKikocCkgKyAxKTt9CisjZW5kaWYKKworI2lmbmRlZiBTS19QTk1JX1JFQURfVTMyCisjZGVmaW5lIFNLX1BOTUlfUkVBRF9VMzIocCx2KQl7KigoY2hhciAqKSYodikpID0gKihjaGFyICopKHApOyBcCisJCQkJCSooKChjaGFyICopJih2KSkgKyAxKSA9IFwKKwkJCQkJCSooKGNoYXIgKikocCkgKyAxKTsgXAorCQkJCQkqKCgoY2hhciAqKSYodikpICsgMikgPSBcCisJCQkJCQkqKChjaGFyICopKHApICsgMik7IFwKKwkJCQkJKigoKGNoYXIgKikmKHYpKSArIDMpID0gXAorCQkJCQkJKigoY2hhciAqKShwKSArIDMpO30KKyNlbmRpZgorCisjaWZuZGVmIFNLX1BOTUlfUkVBRF9VNjQKKyNkZWZpbmUgU0tfUE5NSV9SRUFEX1U2NChwLHYpCXsqKChjaGFyICopJih2KSkgPSAqKGNoYXIgKikocCk7IFwKKwkJCQkJKigoKGNoYXIgKikmKHYpKSArIDEpID0gXAorCQkJCQkJKigoY2hhciAqKShwKSArIDEpOyBcCisJCQkJCSooKChjaGFyICopJih2KSkgKyAyKSA9IFwKKwkJCQkJCSooKGNoYXIgKikocCkgKyAyKTsgXAorCQkJCQkqKCgoY2hhciAqKSYodikpICsgMykgPSBcCisJCQkJCQkqKChjaGFyICopKHApICsgMyk7IFwKKwkJCQkJKigoKGNoYXIgKikmKHYpKSArIDQpID0gXAorCQkJCQkJKigoY2hhciAqKShwKSArIDQpOyBcCisJCQkJCSooKChjaGFyICopJih2KSkgKyA1KSA9IFwKKwkJCQkJCSooKGNoYXIgKikocCkgKyA1KTsgXAorCQkJCQkqKCgoY2hhciAqKSYodikpICsgNikgPSBcCisJCQkJCQkqKChjaGFyICopKHApICsgNik7IFwKKwkJCQkJKigoKGNoYXIgKikmKHYpKSArIDcpID0gXAorCQkJCQkJKigoY2hhciAqKShwKSArIDcpO30KKyNlbmRpZgorCisvKgorICogTWFjcm9zIGZvciBEZWJ1ZworICovCisjaWZkZWYgREVCVUcKKworI2RlZmluZSBTS19QTk1JX0NIRUNLRkxBR1ModlN0KQl7aWYgKHBBQy0+UG5taS5NYWNVcGRhdGVkRmxhZyA+IDAgfHwgXAorCQkJCQlwQUMtPlBubWkuUmxtdFVwZGF0ZWRGbGFnID4gMCB8fCBcCisJCQkJCXBBQy0+UG5taS5TaXJxVXBkYXRlZEZsYWcgPiAwKSB7IFwKKwkJCQkJCVNLX0RCR19NU0cocEFDLCBcCisJCQkJCQlTS19EQkdNT0RfUE5NSSwgXAorCQkJCQkJU0tfREJHQ0FUX0NUUkwsCVwKKwkJCQkJCSgiUE5NSTogRVJSOiAlcyBNYWNVRmxhZz0lZCwgUmxtdFVGbGFnPSVkLCBTaXJxVUZsYWc9JWRcbiIsIFwKKwkJCQkJCXZTdCwgXAorCQkJCQkJcEFDLT5Qbm1pLk1hY1VwZGF0ZWRGbGFnLCBcCisJCQkJCQlwQUMtPlBubWkuUmxtdFVwZGF0ZWRGbGFnLCBcCisJCQkJCQlwQUMtPlBubWkuU2lycVVwZGF0ZWRGbGFnKSl9fQorCisjZWxzZQkvKiAhREVCVUcgKi8KKworI2RlZmluZSBTS19QTk1JX0NIRUNLRkxBR1ModlN0KQkvKiBOb3RoaW5nICovCisKKyNlbmRpZgkvKiAhREVCVUcgKi8KKworI2VuZGlmCS8qIF9TS0dFUE5NMl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2Vwbm1pLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZXBubWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjI3NzNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2Vwbm1pLmgKQEAgLTAsMCArMSw5NjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrZ2Vwbm1pLmgKKyAqIFByb2plY3Q6CUdFbmVzaXMsIFBDSSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS42MiAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wOC8xNSAxMjozMTo1MiAkCisgKiBQdXJwb3NlOglEZWZpbmVzIGZvciBQcml2YXRlIE5ldHdvcmsgTWFuYWdlbWVudCBJbnRlcmZhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdCBHbWJILgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfU0tHRVBOTUlfSF8KKyNkZWZpbmUgX1NLR0VQTk1JX0hfCisKKy8qCisgKiBJbmNsdWRlIGRlcGVuZGVuY2llcworICovCisjaW5jbHVkZSAiaC9za3R5cGVzLmgiCisjaW5jbHVkZSAiaC9za2Vycm9yLmgiCisjaW5jbHVkZSAiaC9za3RpbWVyLmgiCisjaW5jbHVkZSAiaC9za2kyYy5oIgorI2luY2x1ZGUgImgvc2thZGRyLmgiCisjaW5jbHVkZSAiaC9za3JsbXQuaCIKKyNpbmNsdWRlICJoL3NrdnBkLmgiCisKKy8qCisgKiBNYW5hZ2VtZW50IERhdGFiYXNlIFZlcnNpb24KKyAqLworI2RlZmluZSBTS19QTk1JX01EQl9WRVJTSU9OCQkweDAwMDMwMDAxCS8qIDMuMSAqLworCisKKy8qCisgKiBFdmVudCBkZWZpbml0aW9ucworICovCisjZGVmaW5lIFNLX1BOTUlfRVZUX1NJUlFfT1ZFUkZMT1cJCTEJLyogQ291bnRlciBvdmVyZmxvdyAqLworI2RlZmluZSBTS19QTk1JX0VWVF9TRU5fV0FSX0xPVwkJCTIJLyogTG93ZXIgd2FyIHRocmVzIGV4Y2VlZGVkICovCisjZGVmaW5lIFNLX1BOTUlfRVZUX1NFTl9XQVJfVVBQCQkJMwkvKiBVcHBlciB3YXIgdGhyZXMgZXhjZWVkZWQgKi8KKyNkZWZpbmUgU0tfUE5NSV9FVlRfU0VOX0VSUl9MT1cJCQk0CS8qIExvd2VyIGVyciB0aHJlcyBleGNlZWRlZCAqLworI2RlZmluZSBTS19QTk1JX0VWVF9TRU5fRVJSX1VQUAkJCTUJLyogVXBwZXIgZXJyIHRocmVzIGV4Y2VlZGVkICovCisjZGVmaW5lIFNLX1BOTUlfRVZUX0NIR19FU1RfVElNRVIJCTYJLyogVGltZXIgZXZlbnQgZm9yIFJMTVQgQ2hnICovCisjZGVmaW5lIFNLX1BOTUlfRVZUX1VUSUxJWkFUSU9OX1RJTUVSCTcJLyogVGltZXIgZXZlbnQgZm9yIFV0aWxpemEuICovCisjZGVmaW5lIFNLX1BOTUlfRVZUX0NMRUFSX0NPVU5URVIJCTgJLyogQ2xlYXIgc3RhdGlzdGljIGNvdW50ZXJzICovCisjZGVmaW5lIFNLX1BOTUlfRVZUX1hNQUNfUkVTRVQJCQk5CS8qIFhNQUMgd2lsbCBiZSByZXNldCAqLworCisjZGVmaW5lIFNLX1BOTUlfRVZUX1JMTVRfUE9SVF9VUAkJMTAJLyogUG9ydCBjYW1lIGxvZ2ljYWxseSB1cCAqLworI2RlZmluZSBTS19QTk1JX0VWVF9STE1UX1BPUlRfRE9XTgkJMTEJLyogUG9ydCB3ZW50IGxvZ2ljYWxseSBkb3duICovCisjZGVmaW5lIFNLX1BOTUlfRVZUX1JMTVRfU0VHTUVOVEFUSU9OCTEzCS8qIFR3byBTUCByb290IGJyaWRnZXMgZm91bmQgKi8KKyNkZWZpbmUgU0tfUE5NSV9FVlRfUkxNVF9BQ1RJVkVfRE9XTgkxNAkvKiBQb3J0IHdlbnQgbG9naWNhbGx5IGRvd24gKi8KKyNkZWZpbmUgU0tfUE5NSV9FVlRfUkxNVF9BQ1RJVkVfVVAJCTE1CS8qIFBvcnQgY2FtZSBsb2dpY2FsbHkgdXAgKi8KKyNkZWZpbmUgU0tfUE5NSV9FVlRfUkxNVF9TRVRfTkVUUwkJMTYJLyogMS4gUGFyYW1ldGVyIGlzIG51bWJlciBvZiBuZXRzCisJCQkJCQkJCQkJCQkxID0gc2luZ2xlIG5ldDsgMiA9IGR1YWwgbmV0ICovCisjZGVmaW5lIFNLX1BOTUlfRVZUX1ZDVF9SRVNFVAkJMTcJLyogVkNUIHBvcnQgcmVzZXQgdGltZXIgZXZlbnQgc3RhcnRlZCB3aXRoIFNFVC4gKi8KKworCisvKgorICogUmV0dXJuIHZhbHVlcworICovCisjZGVmaW5lIFNLX1BOTUlfRVJSX09LCQkJCTAKKyNkZWZpbmUgU0tfUE5NSV9FUlJfR0VORVJBTAkJCTEKKyNkZWZpbmUgU0tfUE5NSV9FUlJfVE9PX1NIT1JUCQkyCisjZGVmaW5lIFNLX1BOTUlfRVJSX0JBRF9WQUxVRQkJMworI2RlZmluZSBTS19QTk1JX0VSUl9SRUFEX09OTFkJCTQKKyNkZWZpbmUgU0tfUE5NSV9FUlJfVU5LTk9XTl9PSUQJCTUKKyNkZWZpbmUgU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUCTYKKyNkZWZpbmUgU0tfUE5NSV9FUlJfVU5LTk9XTl9ORVQgCTcKKyNkZWZpbmUgU0tfUE5NSV9FUlJfTk9UX1NVUFBPUlRFRAkxMAorCisKKy8qCisgKiBSZXR1cm4gdmFsdWVzIG9mIGRyaXZlciByZXNldCBmdW5jdGlvbiBTS19EUklWRVJfUkVTRVQoKSBhbmQKKyAqIGRyaXZlciBldmVudCBmdW5jdGlvbiBTS19EUklWRVJfRVZFTlQoKQorICovCisjZGVmaW5lIFNLX1BOTUlfRVJSX09LCQkJMAorI2RlZmluZSBTS19QTk1JX0VSUl9GQUlMCQkxCisKKworLyoKKyAqIFJldHVybiB2YWx1ZXMgb2YgZHJpdmVyIHRlc3QgZnVuY3Rpb24gU0tfRFJJVkVSX1NFTEZURVNUKCkKKyAqLworI2RlZmluZSBTS19QTk1JX1RTVF9VTktOT1dOCQkoMSA8PCAwKQorI2RlZmluZSBTS19QTk1JX1RTVF9UUkFOQ0VJVkVSCQkoMSA8PCAxKQorI2RlZmluZSBTS19QTk1JX1RTVF9BU0lDCQkoMSA8PCAyKQorI2RlZmluZSBTS19QTk1JX1RTVF9TRU5TT1IJCSgxIDw8IDMpCisjZGVmaW5lIFNLX1BOTUlfVFNUX1BPV0VSTUdNVAkJKDEgPDwgNCkKKyNkZWZpbmUgU0tfUE5NSV9UU1RfUENJCQkJKDEgPDwgNSkKKyNkZWZpbmUgU0tfUE5NSV9UU1RfTUFDCQkJKDEgPDwgNikKKworCisvKgorICogUkxNVCBzcGVjaWZpYyBkZWZpbml0aW9ucworICovCisjZGVmaW5lIFNLX1BOTUlfUkxNVF9TVEFUVVNfU1RBTkRCWQkxCisjZGVmaW5lIFNLX1BOTUlfUkxNVF9TVEFUVVNfQUNUSVZFCTIKKyNkZWZpbmUgU0tfUE5NSV9STE1UX1NUQVRVU19FUlJPUgkzCisKKyNkZWZpbmUgU0tfUE5NSV9STE1UX0xTVEFUX1BIWV9ET1dOCTEKKyNkZWZpbmUgU0tfUE5NSV9STE1UX0xTVEFUX0FVVE9ORUcJMgorI2RlZmluZSBTS19QTk1JX1JMTVRfTFNUQVRfTE9HX0RPV04JMworI2RlZmluZSBTS19QTk1JX1JMTVRfTFNUQVRfTE9HX1VQCTQKKyNkZWZpbmUgU0tfUE5NSV9STE1UX0xTVEFUX0lOREVURVJNSU5BVEVEIDUKKworI2RlZmluZSBTS19QTk1JX1JMTVRfTU9ERV9DSEtfTElOSwkoU0tfUkxNVF9DSEVDS19MSU5LKQorI2RlZmluZSBTS19QTk1JX1JMTVRfTU9ERV9DSEtfUlgJKFNLX1JMTVRfQ0hFQ0tfTE9DX0xJTkspCisjZGVmaW5lIFNLX1BOTUlfUkxNVF9NT0RFX0NIS19TUFQJKFNLX1JMTVRfQ0hFQ0tfU0VHKQorLyogI2RlZmluZSBTS19QTk1JX1JMTVRfTU9ERV9DSEtfRVggKi8KKworLyoKKyAqIE9JRCBkZWZpbml0aW9uCisgKi8KKyNpZm5kZWYgX05ESVNfCS8qIENoZWNrLCB3aGV0aGVyIE5ESVMgYWxyZWFkeSBpbmNsdWRlZCBPSURzICovCisKKyNkZWZpbmUgT0lEX0dFTl9YTUlUX09LCQkJCQkweDAwMDIwMTAxCisjZGVmaW5lIE9JRF9HRU5fUkNWX09LCQkJCQkweDAwMDIwMTAyCisjZGVmaW5lIE9JRF9HRU5fWE1JVF9FUlJPUgkJCQkweDAwMDIwMTAzCisjZGVmaW5lIE9JRF9HRU5fUkNWX0VSUk9SCQkJCTB4MDAwMjAxMDQKKyNkZWZpbmUgT0lEX0dFTl9SQ1ZfTk9fQlVGRkVSCQkJMHgwMDAyMDEwNQorCisvKiAjZGVmaW5lIE9JRF9HRU5fRElSRUNURURfQllURVNfWE1JVAkweDAwMDIwMjAxICovCisjZGVmaW5lIE9JRF9HRU5fRElSRUNURURfRlJBTUVTX1hNSVQJMHgwMDAyMDIwMgorLyogI2RlZmluZSBPSURfR0VOX01VTFRJQ0FTVF9CWVRFU19YTUlUCTB4MDAwMjAyMDMgKi8KKyNkZWZpbmUgT0lEX0dFTl9NVUxUSUNBU1RfRlJBTUVTX1hNSVQJMHgwMDAyMDIwNAorLyogI2RlZmluZSBPSURfR0VOX0JST0FEQ0FTVF9CWVRFU19YTUlUCTB4MDAwMjAyMDUgKi8KKyNkZWZpbmUgT0lEX0dFTl9CUk9BRENBU1RfRlJBTUVTX1hNSVQJMHgwMDAyMDIwNgorLyogI2RlZmluZSBPSURfR0VOX0RJUkVDVEVEX0JZVEVTX1JDVgkweDAwMDIwMjA3ICovCisjZGVmaW5lIE9JRF9HRU5fRElSRUNURURfRlJBTUVTX1JDVgkJMHgwMDAyMDIwOAorLyogI2RlZmluZSBPSURfR0VOX01VTFRJQ0FTVF9CWVRFU19SQ1YJMHgwMDAyMDIwOSAqLworI2RlZmluZSBPSURfR0VOX01VTFRJQ0FTVF9GUkFNRVNfUkNWCTB4MDAwMjAyMEEKKy8qICNkZWZpbmUgT0lEX0dFTl9CUk9BRENBU1RfQllURVNfUkNWCTB4MDAwMjAyMEIgKi8KKyNkZWZpbmUgT0lEX0dFTl9CUk9BRENBU1RfRlJBTUVTX1JDVgkweDAwMDIwMjBDCisjZGVmaW5lIE9JRF9HRU5fUkNWX0NSQ19FUlJPUgkJCTB4MDAwMjAyMEQKKyNkZWZpbmUgT0lEX0dFTl9UUkFOU01JVF9RVUVVRV9MRU5HVEgJMHgwMDAyMDIwRQorCisjZGVmaW5lIE9JRF84MDJfM19QRVJNQU5FTlRfQUREUkVTUwkJMHgwMTAxMDEwMQorI2RlZmluZSBPSURfODAyXzNfQ1VSUkVOVF9BRERSRVNTCQkweDAxMDEwMTAyCisvKiAjZGVmaW5lIE9JRF84MDJfM19NVUxUSUNBU1RfTElTVAkJMHgwMTAxMDEwMyAqLworLyogI2RlZmluZSBPSURfODAyXzNfTUFYSU1VTV9MSVNUX1NJWkUJMHgwMTAxMDEwNCAqLworLyogI2RlZmluZSBPSURfODAyXzNfTUFDX09QVElPTlMJCTB4MDEwMTAxMDUgKi8KKwkJCQorI2RlZmluZSBPSURfODAyXzNfUkNWX0VSUk9SX0FMSUdOTUVOVAkweDAxMDIwMTAxCisjZGVmaW5lIE9JRF84MDJfM19YTUlUX09ORV9DT0xMSVNJT04JMHgwMTAyMDEwMgorI2RlZmluZSBPSURfODAyXzNfWE1JVF9NT1JFX0NPTExJU0lPTlMJMHgwMTAyMDEwMworI2RlZmluZSBPSURfODAyXzNfWE1JVF9ERUZFUlJFRAkJCTB4MDEwMjAyMDEKKyNkZWZpbmUgT0lEXzgwMl8zX1hNSVRfTUFYX0NPTExJU0lPTlMJMHgwMTAyMDIwMgorI2RlZmluZSBPSURfODAyXzNfUkNWX09WRVJSVU4JCQkweDAxMDIwMjAzCisjZGVmaW5lIE9JRF84MDJfM19YTUlUX1VOREVSUlVOCQkJMHgwMTAyMDIwNAorI2RlZmluZSBPSURfODAyXzNfWE1JVF9USU1FU19DUlNfTE9TVAkweDAxMDIwMjA2CisjZGVmaW5lIE9JRF84MDJfM19YTUlUX0xBVEVfQ09MTElTSU9OUwkweDAxMDIwMjA3CisKKy8qCisgKiBQblAgYW5kIFBNIE9JRHMKKyAqLworI2lmZGVmIFNLX1BPV0VSX01HTVQKKyNkZWZpbmUgT0lEX1BOUF9DQVBBQklMSVRJRVMJCQkweEZEMDEwMTAwCisjZGVmaW5lIE9JRF9QTlBfU0VUX1BPV0VSCQkJCTB4RkQwMTAxMDEKKyNkZWZpbmUgT0lEX1BOUF9RVUVSWV9QT1dFUgkJCQkweEZEMDEwMTAyCisjZGVmaW5lIE9JRF9QTlBfQUREX1dBS0VfVVBfUEFUVEVSTgkJMHhGRDAxMDEwMworI2RlZmluZSBPSURfUE5QX1JFTU9WRV9XQUtFX1VQX1BBVFRFUk4JMHhGRDAxMDEwNAorI2RlZmluZSBPSURfUE5QX0VOQUJMRV9XQUtFX1VQCQkJMHhGRDAxMDEwNgorI2VuZGlmIC8qIFNLX1BPV0VSX01HTVQgKi8KKworI2VuZGlmIC8qIF9ORElTXyAqLworCisjZGVmaW5lIE9JRF9TS0dFX01EQl9WRVJTSU9OCQkJMHhGRjAxMDEwMAorI2RlZmluZSBPSURfU0tHRV9TVVBQT1JURURfTElTVAkJCTB4RkYwMTAxMDEKKyNkZWZpbmUgT0lEX1NLR0VfVlBEX0ZSRUVfQllURVMJCQkweEZGMDEwMTAyCisjZGVmaW5lIE9JRF9TS0dFX1ZQRF9FTlRSSUVTX0xJU1QJCTB4RkYwMTAxMDMKKyNkZWZpbmUgT0lEX1NLR0VfVlBEX0VOVFJJRVNfTlVNQkVSCQkweEZGMDEwMTA0CisjZGVmaW5lIE9JRF9TS0dFX1ZQRF9LRVkJCQkJMHhGRjAxMDEwNQorI2RlZmluZSBPSURfU0tHRV9WUERfVkFMVUUJCQkJMHhGRjAxMDEwNgorI2RlZmluZSBPSURfU0tHRV9WUERfQUNDRVNTCQkJCTB4RkYwMTAxMDcKKyNkZWZpbmUgT0lEX1NLR0VfVlBEX0FDVElPTgkJCQkweEZGMDEwMTA4CisJCQkKKyNkZWZpbmUgT0lEX1NLR0VfUE9SVF9OVU1CRVIJCQkweEZGMDEwMTEwCisjZGVmaW5lIE9JRF9TS0dFX0RFVklDRV9UWVBFCQkJMHhGRjAxMDExMQorI2RlZmluZSBPSURfU0tHRV9EUklWRVJfREVTQ1IJCQkweEZGMDEwMTEyCisjZGVmaW5lIE9JRF9TS0dFX0RSSVZFUl9WRVJTSU9OCQkJMHhGRjAxMDExMworI2RlZmluZSBPSURfU0tHRV9IV19ERVNDUgkJCQkweEZGMDEwMTE0CisjZGVmaW5lIE9JRF9TS0dFX0hXX1ZFUlNJT04JCQkJMHhGRjAxMDExNQorI2RlZmluZSBPSURfU0tHRV9DSElQU0VUCQkJCTB4RkYwMTAxMTYKKyNkZWZpbmUgT0lEX1NLR0VfQUNUSU9OCQkJCQkweEZGMDEwMTE3CisjZGVmaW5lIE9JRF9TS0dFX1JFU1VMVAkJCQkJMHhGRjAxMDExOAorI2RlZmluZSBPSURfU0tHRV9CVVNfVFlQRQkJCQkweEZGMDEwMTE5CisjZGVmaW5lIE9JRF9TS0dFX0JVU19TUEVFRAkJCQkweEZGMDEwMTFBCisjZGVmaW5lIE9JRF9TS0dFX0JVU19XSURUSAkJCQkweEZGMDEwMTFCCisvKiAweEZGMDEwMTFDIHVudXNlZCAqLworI2RlZmluZSBPSURfU0tHRV9ESUFHX0FDVElPTgkJCTB4RkYwMTAxMUQKKyNkZWZpbmUgT0lEX1NLR0VfRElBR19SRVNVTFQJCQkweEZGMDEwMTFFCisjZGVmaW5lIE9JRF9TS0dFX01UVQkJCQkJMHhGRjAxMDExRgorI2RlZmluZSBPSURfU0tHRV9QSFlTX0NVUl9BRERSCQkJMHhGRjAxMDEyMAorI2RlZmluZSBPSURfU0tHRV9QSFlTX0ZBQ19BRERSCQkJMHhGRjAxMDEyMQorI2RlZmluZSBPSURfU0tHRV9QTUQJCQkJCTB4RkYwMTAxMjIKKyNkZWZpbmUgT0lEX1NLR0VfQ09OTkVDVE9SCQkJCTB4RkYwMTAxMjMKKyNkZWZpbmUgT0lEX1NLR0VfTElOS19DQVAJCQkJMHhGRjAxMDEyNAorI2RlZmluZSBPSURfU0tHRV9MSU5LX01PREUJCQkJMHhGRjAxMDEyNQorI2RlZmluZSBPSURfU0tHRV9MSU5LX01PREVfU1RBVFVTCQkweEZGMDEwMTI2CisjZGVmaW5lIE9JRF9TS0dFX0xJTktfU1RBVFVTCQkJMHhGRjAxMDEyNworI2RlZmluZSBPSURfU0tHRV9GTE9XQ1RSTF9DQVAJCQkweEZGMDEwMTI4CisjZGVmaW5lIE9JRF9TS0dFX0ZMT1dDVFJMX01PREUJCQkweEZGMDEwMTI5CisjZGVmaW5lIE9JRF9TS0dFX0ZMT1dDVFJMX1NUQVRVUwkJMHhGRjAxMDEyQQorI2RlZmluZSBPSURfU0tHRV9QSFlfT1BFUkFUSU9OX0NBUAkJMHhGRjAxMDEyQgorI2RlZmluZSBPSURfU0tHRV9QSFlfT1BFUkFUSU9OX01PREUJCTB4RkYwMTAxMkMKKyNkZWZpbmUgT0lEX1NLR0VfUEhZX09QRVJBVElPTl9TVEFUVVMJMHhGRjAxMDEyRAorI2RlZmluZSBPSURfU0tHRV9NVUxUSUNBU1RfTElTVAkJCTB4RkYwMTAxMkUKKyNkZWZpbmUgT0lEX1NLR0VfQ1VSUkVOVF9QQUNLRVRfRklMVEVSCTB4RkYwMTAxMkYKKworI2RlZmluZSBPSURfU0tHRV9UUkFQCQkJCQkweEZGMDEwMTMwCisjZGVmaW5lIE9JRF9TS0dFX1RSQVBfTlVNQkVSCQkJMHhGRjAxMDEzMQorCisjZGVmaW5lIE9JRF9TS0dFX1JMTVRfTU9ERQkJCQkweEZGMDEwMTQwCisjZGVmaW5lIE9JRF9TS0dFX1JMTVRfUE9SVF9OVU1CRVIJCTB4RkYwMTAxNDEKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9QT1JUX0FDVElWRQkJMHhGRjAxMDE0MgorI2RlZmluZSBPSURfU0tHRV9STE1UX1BPUlRfUFJFRkVSUkVECTB4RkYwMTAxNDMKKyNkZWZpbmUgT0lEX1NLR0VfSU5URVJNRURJQVRFX1NVUFBPUlQJMHhGRjAxMDE2MAorCisjZGVmaW5lIE9JRF9TS0dFX1NQRUVEX0NBUAkJCQkweEZGMDEwMTcwCisjZGVmaW5lIE9JRF9TS0dFX1NQRUVEX01PREUJCQkJMHhGRjAxMDE3MQorI2RlZmluZSBPSURfU0tHRV9TUEVFRF9TVEFUVVMJCQkweEZGMDEwMTcyCisKKyNkZWZpbmUgT0lEX1NLR0VfQk9BUkRMRVZFTAkJCQkweEZGMDEwMTgwCisKKyNkZWZpbmUgT0lEX1NLR0VfU0VOU09SX05VTUJFUgkJCTB4RkYwMjAxMDAJCQkKKyNkZWZpbmUgT0lEX1NLR0VfU0VOU09SX0lOREVYCQkJMHhGRjAyMDEwMQorI2RlZmluZSBPSURfU0tHRV9TRU5TT1JfREVTQ1IJCQkweEZGMDIwMTAyCisjZGVmaW5lIE9JRF9TS0dFX1NFTlNPUl9UWVBFCQkJMHhGRjAyMDEwMworI2RlZmluZSBPSURfU0tHRV9TRU5TT1JfVkFMVUUJCQkweEZGMDIwMTA0CisjZGVmaW5lIE9JRF9TS0dFX1NFTlNPUl9XQVJfVEhSRVNfTE9XCTB4RkYwMjAxMDUKKyNkZWZpbmUgT0lEX1NLR0VfU0VOU09SX1dBUl9USFJFU19VUFAJMHhGRjAyMDEwNgorI2RlZmluZSBPSURfU0tHRV9TRU5TT1JfRVJSX1RIUkVTX0xPVwkweEZGMDIwMTA3CisjZGVmaW5lIE9JRF9TS0dFX1NFTlNPUl9FUlJfVEhSRVNfVVBQCTB4RkYwMjAxMDgKKyNkZWZpbmUgT0lEX1NLR0VfU0VOU09SX1NUQVRVUwkJCTB4RkYwMjAxMDkKKyNkZWZpbmUgT0lEX1NLR0VfU0VOU09SX1dBUl9DVFMJCQkweEZGMDIwMTBBCisjZGVmaW5lIE9JRF9TS0dFX1NFTlNPUl9FUlJfQ1RTCQkJMHhGRjAyMDEwQgorI2RlZmluZSBPSURfU0tHRV9TRU5TT1JfV0FSX1RJTUUJCTB4RkYwMjAxMEMKKyNkZWZpbmUgT0lEX1NLR0VfU0VOU09SX0VSUl9USU1FCQkweEZGMDIwMTBECisKKyNkZWZpbmUgT0lEX1NLR0VfQ0hLU01fTlVNQkVSCQkJMHhGRjAyMDExMAorI2RlZmluZSBPSURfU0tHRV9DSEtTTV9SWF9PS19DVFMJCTB4RkYwMjAxMTEKKyNkZWZpbmUgT0lEX1NLR0VfQ0hLU01fUlhfVU5BQkxFX0NUUwkweEZGMDIwMTEyCisjZGVmaW5lIE9JRF9TS0dFX0NIS1NNX1JYX0VSUl9DVFMJCTB4RkYwMjAxMTMKKyNkZWZpbmUgT0lEX1NLR0VfQ0hLU01fVFhfT0tfQ1RTCQkweEZGMDIwMTE0CisjZGVmaW5lIE9JRF9TS0dFX0NIS1NNX1RYX1VOQUJMRV9DVFMJMHhGRjAyMDExNQorCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFgJCQkJMHhGRjAyMDEyMAorI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYX09DVEVUUwkJCTB4RkYwMjAxMjEKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9CUk9BRENBU1QJCTB4RkYwMjAxMjIKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9NVUxUSUNBU1QJCTB4RkYwMjAxMjMKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9VTklDQVNUCQkweEZGMDIwMTI0CisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfTE9OR0ZSQU1FUwkJMHhGRjAyMDEyNQorI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYX0JVUlNUCQkJMHhGRjAyMDEyNgorI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYX1BGTE9XQwkJCTB4RkYwMjAxMjcKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9GTE9XQwkJCTB4RkYwMjAxMjgKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9TSU5HTEVfQ09MCQkweEZGMDIwMTI5CisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfTVVMVElfQ09MCQkweEZGMDIwMTJBCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfRVhDRVNTX0NPTAkJMHhGRjAyMDEyQgorI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYX0xBVEVfQ09MCQkweEZGMDIwMTJDCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfREVGRkVSQUwJCTB4RkYwMjAxMkQKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9FWENFU1NfREVGCQkweEZGMDIwMTJFCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfVU5ERVJSVU4JCTB4RkYwMjAxMkYKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9DQVJSSUVSCQkweEZGMDIwMTMwCisvKiAjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfVVRJTAkJMHhGRjAyMDEzMSAqLworI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYXzY0CQkJCTB4RkYwMjAxMzIKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF8xMjcJCQkweEZGMDIwMTMzCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfVFhfMjU1CQkJMHhGRjAyMDEzNAorI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYXzUxMQkJCTB4RkYwMjAxMzUKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF8xMDIzCQkJMHhGRjAyMDEzNgorI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYX01BWAkJCTB4RkYwMjAxMzcKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9UWF9TWU5DCQkJMHhGRjAyMDEzOAorI2RlZmluZSBPSURfU0tHRV9TVEFUX1RYX1NZTkNfT0NURVRTCTB4RkYwMjAxMzkKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWAkJCQkweEZGMDIwMTNBCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfT0NURVRTCQkJMHhGRjAyMDEzQgorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX0JST0FEQ0FTVAkJMHhGRjAyMDEzQworI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX01VTFRJQ0FTVAkJMHhGRjAyMDEzRAorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX1VOSUNBU1QJCTB4RkYwMjAxM0UKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9QRkxPV0MJCQkweEZGMDIwMTNGCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfRkxPV0MJCQkweEZGMDIwMTQwCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfUEZMT1dDX0VSUgkJMHhGRjAyMDE0MQorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX0ZMT1dDX1VOS1dOCTB4RkYwMjAxNDIKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9CVVJTVAkJCTB4RkYwMjAxNDMKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9NSVNTRUQJCQkweEZGMDIwMTQ0CisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfRlJBTUlORwkJMHhGRjAyMDE0NQorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX09WRVJGTE9XCQkweEZGMDIwMTQ2CisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfSkFCQkVSCQkJMHhGRjAyMDE0NworI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX0NBUlJJRVIJCTB4RkYwMjAxNDgKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9JUl9MRU5HVEgJCTB4RkYwMjAxNDkKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9TWU1CT0wJCQkweEZGMDIwMTRBCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfU0hPUlRTCQkJMHhGRjAyMDE0QgorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX1JVTlQJCQkweEZGMDIwMTRDCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfQ0VYVAkJCTB4RkYwMjAxNEQKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9UT09fTE9ORwkJMHhGRjAyMDE0RQorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX0ZDUwkJCTB4RkYwMjAxNEYKKy8qICNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF9VVElMCQkweEZGMDIwMTUwICovCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfNjQJCQkJMHhGRjAyMDE1MQorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYXzEyNwkJCTB4RkYwMjAxNTIKKyNkZWZpbmUgT0lEX1NLR0VfU1RBVF9SWF8yNTUJCQkweEZGMDIwMTUzCisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfNTExCQkJMHhGRjAyMDE1NAorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYXzEwMjMJCQkweEZGMDIwMTU1CisjZGVmaW5lIE9JRF9TS0dFX1NUQVRfUlhfTUFYCQkJMHhGRjAyMDE1NgorI2RlZmluZSBPSURfU0tHRV9TVEFUX1JYX0xPTkdGUkFNRVMJCTB4RkYwMjAxNTcKKworI2RlZmluZSBPSURfU0tHRV9STE1UX0NIQU5HRV9DVFMJCTB4RkYwMjAxNjAKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9DSEFOR0VfVElNRQkJMHhGRjAyMDE2MQorI2RlZmluZSBPSURfU0tHRV9STE1UX0NIQU5HRV9FU1RJTQkJMHhGRjAyMDE2MgorI2RlZmluZSBPSURfU0tHRV9STE1UX0NIQU5HRV9USFJFUwkJMHhGRjAyMDE2MworCisjZGVmaW5lIE9JRF9TS0dFX1JMTVRfUE9SVF9JTkRFWAkJMHhGRjAyMDE2NAorI2RlZmluZSBPSURfU0tHRV9STE1UX1NUQVRVUwkJCTB4RkYwMjAxNjUKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9UWF9IRUxMT19DVFMJCTB4RkYwMjAxNjYKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9SWF9IRUxMT19DVFMJCTB4RkYwMjAxNjcKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9UWF9TUF9SRVFfQ1RTCQkweEZGMDIwMTY4CisjZGVmaW5lIE9JRF9TS0dFX1JMTVRfUlhfU1BfQ1RTCQkJMHhGRjAyMDE2OQorCisjZGVmaW5lIE9JRF9TS0dFX1JMTVRfTU9OSVRPUl9OVU1CRVIJMHhGRjAxMDE1MAorI2RlZmluZSBPSURfU0tHRV9STE1UX01PTklUT1JfSU5ERVgJCTB4RkYwMTAxNTEKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9NT05JVE9SX0FERFIJCTB4RkYwMTAxNTIKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9NT05JVE9SX0VSUlMJCTB4RkYwMTAxNTMKKyNkZWZpbmUgT0lEX1NLR0VfUkxNVF9NT05JVE9SX1RJTUVTVEFNUAkweEZGMDEwMTU0CisjZGVmaW5lIE9JRF9TS0dFX1JMTVRfTU9OSVRPUl9BRE1JTgkJMHhGRjAxMDE1NQorCisjZGVmaW5lIE9JRF9TS0dFX1RYX1NXX1FVRVVFX0xFTgkJMHhGRjAyMDE3MAorI2RlZmluZSBPSURfU0tHRV9UWF9TV19RVUVVRV9NQVgJCTB4RkYwMjAxNzEKKyNkZWZpbmUgT0lEX1NLR0VfVFhfUkVUUlkJCQkJMHhGRjAyMDE3MgorI2RlZmluZSBPSURfU0tHRV9SWF9JTlRSX0NUUwkJCTB4RkYwMjAxNzMKKyNkZWZpbmUgT0lEX1NLR0VfVFhfSU5UUl9DVFMJCQkweEZGMDIwMTc0CisjZGVmaW5lIE9JRF9TS0dFX1JYX05PX0JVRl9DVFMJCQkweEZGMDIwMTc1CisjZGVmaW5lIE9JRF9TS0dFX1RYX05PX0JVRl9DVFMJCQkweEZGMDIwMTc2CisjZGVmaW5lIE9JRF9TS0dFX1RYX1VTRURfREVTQ1JfTk8JCTB4RkYwMjAxNzcKKyNkZWZpbmUgT0lEX1NLR0VfUlhfREVMSVZFUkVEX0NUUwkJMHhGRjAyMDE3OAorI2RlZmluZSBPSURfU0tHRV9SWF9PQ1RFVFNfREVMSVZfQ1RTCTB4RkYwMjAxNzkKKyNkZWZpbmUgT0lEX1NLR0VfUlhfSFdfRVJST1JfQ1RTCQkweEZGMDIwMTdBCisjZGVmaW5lIE9JRF9TS0dFX1RYX0hXX0VSUk9SX0NUUwkJMHhGRjAyMDE3QgorI2RlZmluZSBPSURfU0tHRV9JTl9FUlJPUlNfQ1RTCQkJMHhGRjAyMDE3QworI2RlZmluZSBPSURfU0tHRV9PVVRfRVJST1JfQ1RTCQkJMHhGRjAyMDE3RAorI2RlZmluZSBPSURfU0tHRV9FUlJfUkVDT1ZFUllfQ1RTCQkweEZGMDIwMTdFCisjZGVmaW5lIE9JRF9TS0dFX1NZU1VQVElNRQkJCQkweEZGMDIwMTdGCisKKyNkZWZpbmUgT0lEX1NLR0VfQUxMX0RBVEEJCQkJMHhGRjAyMDE5MAorCisvKiBEZWZpbmVzIGZvciBWQ1QuICovCisjZGVmaW5lIE9JRF9TS0dFX1ZDVF9HRVQJCQkJMHhGRjAyMDIwMAorI2RlZmluZSBPSURfU0tHRV9WQ1RfU0VUCQkJCTB4RkYwMjAyMDEKKyNkZWZpbmUgT0lEX1NLR0VfVkNUX1NUQVRVUwkJCQkweEZGMDIwMjAyCisKKyNpZmRlZiBTS19ESUFHX1NVUFBPUlQKKy8qIERlZmluZXMgZm9yIGRyaXZlciBESUFHIG1vZGUuICovCisjZGVmaW5lIE9JRF9TS0dFX0RJQUdfTU9ERQkJCQkweEZGMDIwMjA0CisjZW5kaWYgLyogU0tfRElBR19TVVBQT1JUICovCisKKy8qIE5ldyBPSURzICovCisjZGVmaW5lIE9JRF9TS0dFX0RSSVZFUl9SRUxEQVRFCQkJMHhGRjAyMDIxMAorI2RlZmluZSBPSURfU0tHRV9EUklWRVJfRklMRU5BTUUJCTB4RkYwMjAyMTEKKyNkZWZpbmUgT0lEX1NLR0VfQ0hJUElECQkJCQkweEZGMDIwMjEyCisjZGVmaW5lIE9JRF9TS0dFX1JBTVNJWkUJCQkJMHhGRjAyMDIxMworI2RlZmluZSBPSURfU0tHRV9WQVVYQVZBSUwJCQkJMHhGRjAyMDIxNAorI2RlZmluZSBPSURfU0tHRV9QSFlfVFlQRQkJCQkweEZGMDIwMjE1CisjZGVmaW5lIE9JRF9TS0dFX1BIWV9MUF9NT0RFCQkJMHhGRjAyMDIxNgorCisvKiBWQ1Qgc3RydWN0IHRvIHN0b3JlIGEgYmFja3VwIGNvcHkgb2YgVkNUIGRhdGEgYWZ0ZXIgYSBwb3J0IHJlc2V0LiAqLwordHlwZWRlZiBzdHJ1Y3Qgc19Qbm1pVmN0IHsKKwlTS19VOAkJCVZjdFN0YXR1czsKKwlTS19VOAkJCVBDYWJsZUxlbjsKKwlTS19VMzIJCQlQTWRpUGFpckxlbls0XTsKKwlTS19VOAkJCVBNZGlQYWlyU3RzWzRdOworfSBTS19QTk1JX1ZDVDsKKworCisvKiBWQ1Qgc3RhdHVzIHZhbHVlcyAodG8gYmUgZ2l2ZW4gdG8gQ1BBIHZpYSBPSURfU0tHRV9WQ1RfU1RBVFVTKS4gKi8KKyNkZWZpbmUgU0tfUE5NSV9WQ1RfTk9ORQkJMAorI2RlZmluZSBTS19QTk1JX1ZDVF9PTERfVkNUX0RBVEEJMQorI2RlZmluZSBTS19QTk1JX1ZDVF9ORVdfVkNUX0RBVEEJMgorI2RlZmluZSBTS19QTk1JX1ZDVF9PTERfRFNQX0RBVEEJNAorI2RlZmluZSBTS19QTk1JX1ZDVF9ORVdfRFNQX0RBVEEJOAorI2RlZmluZSBTS19QTk1JX1ZDVF9SVU5OSU5HCQkxNgorCisKKy8qIFZDVCBjYWJsZSB0ZXN0IHN0YXR1cy4gKi8KKyNkZWZpbmUgU0tfUE5NSV9WQ1RfTk9STUFMX0NBQkxFCQkwCisjZGVmaW5lIFNLX1BOTUlfVkNUX1NIT1JUX0NBQkxFCQkJMQorI2RlZmluZSBTS19QTk1JX1ZDVF9PUEVOX0NBQkxFCQkJMgorI2RlZmluZSBTS19QTk1JX1ZDVF9URVNUX0ZBSUwJCQkzCisjZGVmaW5lIFNLX1BOTUlfVkNUX0lNUEVEQU5DRV9NSVNNQVRDSAkJNAorCisjZGVmaW5lCU9JRF9TS0dFX1RSQVBfU0VOX1dBUl9MT1cJCTUwMAorI2RlZmluZSBPSURfU0tHRV9UUkFQX1NFTl9XQVJfVVBQCQk1MDEKKyNkZWZpbmUJT0lEX1NLR0VfVFJBUF9TRU5fRVJSX0xPVwkJNTAyCisjZGVmaW5lIE9JRF9TS0dFX1RSQVBfU0VOX0VSUl9VUFAJCTUwMworI2RlZmluZSBPSURfU0tHRV9UUkFQX1JMTVRfQ0hBTkdFX1RIUkVTCTUyMAorI2RlZmluZSBPSURfU0tHRV9UUkFQX1JMTVRfQ0hBTkdFX1BPUlQJNTIxCisjZGVmaW5lIE9JRF9TS0dFX1RSQVBfUkxNVF9QT1JUX0RPV04JNTIyCisjZGVmaW5lIE9JRF9TS0dFX1RSQVBfUkxNVF9QT1JUX1VQCQk1MjMKKyNkZWZpbmUgT0lEX1NLR0VfVFJBUF9STE1UX1NFR01FTlRBVElPTgk1MjQKKworI2lmZGVmIFNLX0RJQUdfU1VQUE9SVAorLyogRGVmaW5lcyBmb3IgZHJpdmVyIERJQUcgbW9kZS4gKi8KKyNkZWZpbmUgU0tfRElBR19BVFRBQ0hFRAkyCisjZGVmaW5lIFNLX0RJQUdfUlVOTklORwkJMQorI2RlZmluZSBTS19ESUFHX0lETEUJCTAKKyNlbmRpZiAvKiBTS19ESUFHX1NVUFBPUlQgKi8KKworLyoKKyAqIEdlbmVyaWMgUE5NSSBJT0NUTCBzdWJjb21tYW5kIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lCVNLX0dFVF9TSU5HTEVfVkFSCQkxCisjZGVmaW5lCVNLX1NFVF9TSU5HTEVfVkFSCQkyCisjZGVmaW5lCVNLX1BSRVNFVF9TSU5HTEVfVkFSCTMKKyNkZWZpbmUJU0tfR0VUX0ZVTExfTUlCCQkJNAorI2RlZmluZQlTS19TRVRfRlVMTF9NSUIJCQk1CisjZGVmaW5lCVNLX1BSRVNFVF9GVUxMX01JQgkJNgorCisKKy8qCisgKiBEZWZpbmUgZXJyb3IgbnVtYmVycyBhbmQgbWVzc2FnZXMgZm9yIHN5c2xvZworICovCisjZGVmaW5lIFNLX1BOTUlfRVJSMDAxCQkoU0tfRVJSQkFTRV9QTk1JICsgMSkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMDFNU0cJIlNrUG5taUdldFN0cnVjdDogVW5rbm93biBPSUQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDAyCQkoU0tfRVJSQkFTRV9QTk1JICsgMikKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMDJNU0cJIlNrUG5taUdldFN0cnVjdDogQ2Fubm90IHJlYWQgVlBEIGtleXMiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDAzCQkoU0tfRVJSQkFTRV9QTk1JICsgMykKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMDNNU0cJIk9pZFN0cnVjdDogQ2FsbGVkIHdpdGggd3JvbmcgT0lEIgorI2RlZmluZSBTS19QTk1JX0VSUjAwNAkJKFNLX0VSUkJBU0VfUE5NSSArIDQpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDA0TVNHCSJPaWRTdHJ1Y3Q6IENhbGxlZCB3aXRoIHdyb25nIGFjdGlvbiIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMDUJCShTS19FUlJCQVNFX1BOTUkgKyA1KQorI2RlZmluZSBTS19QTk1JX0VSUjAwNU1TRwkiUGVyZm9ybTogQ2Fubm90IHJlc2V0IGRyaXZlciIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMDYJCShTS19FUlJCQVNFX1BOTUkgKyA2KQorI2RlZmluZSBTS19QTk1JX0VSUjAwNk1TRwkiUGVyZm9ybTogVW5rbm93biBPSUQgYWN0aW9uIGNvbW1hbmQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDA3CQkoU0tfRVJSQkFTRV9QTk1JICsgNykKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMDdNU0cJIkdlbmVyYWw6IERyaXZlciBkZXNjcmlwdGlvbiBub3QgaW5pdGlhbGl6ZWQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDA4CQkoU0tfRVJSQkFTRV9QTk1JICsgOCkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMDhNU0cJIkFkZHI6IFRyaWVkIHRvIGdldCB1bmtub3duIE9JRCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMDkJCShTS19FUlJCQVNFX1BOTUkgKyA5KQorI2RlZmluZSBTS19QTk1JX0VSUjAwOU1TRwkiQWRkcjogVW5rbm93biBPSUQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDEwCQkoU0tfRVJSQkFTRV9QTk1JICsgMTApCisjZGVmaW5lIFNLX1BOTUlfRVJSMDEwTVNHCSJDc3VtU3RhdDogVW5rbm93biBPSUQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDExCQkoU0tfRVJSQkFTRV9QTk1JICsgMTEpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDExTVNHCSJTZW5zb3JTdGF0OiBTZW5zb3IgZGVzY3Igc3RyaW5nIHRvbyBsb25nIgorI2RlZmluZSBTS19QTk1JX0VSUjAxMgkJKFNLX0VSUkJBU0VfUE5NSSArIDEyKQorI2RlZmluZSBTS19QTk1JX0VSUjAxMk1TRwkiU2Vuc29yU3RhdDogVW5rbm93biBPSUQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDEzCQkoU0tfRVJSQkFTRV9QTk1JICsgMTMpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDEzTVNHCSIiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDE0CQkoU0tfRVJSQkFTRV9QTk1JICsgMTQpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDE0TVNHCSJWcGQ6IENhbm5vdCByZWFkIFZQRCBrZXlzIgorI2RlZmluZSBTS19QTk1JX0VSUjAxNQkJKFNLX0VSUkJBU0VfUE5NSSArIDE1KQorI2RlZmluZSBTS19QTk1JX0VSUjAxNU1TRwkiVnBkOiBJbnRlcm5hbCBhcnJheSBmb3IgVlBEIGtleXMgdG8gc21hbGwiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDE2CQkoU0tfRVJSQkFTRV9QTk1JICsgMTYpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDE2TVNHCSJWcGQ6IEtleSBzdHJpbmcgdG9vIGxvbmciCisjZGVmaW5lIFNLX1BOTUlfRVJSMDE3CQkoU0tfRVJSQkFTRV9QTk1JICsgMTcpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDE3TVNHCSJWcGQ6IEludmFsaWQgVlBEIHN0YXR1cyBwb2ludGVyIgorI2RlZmluZSBTS19QTk1JX0VSUjAxOAkJKFNLX0VSUkJBU0VfUE5NSSArIDE4KQorI2RlZmluZSBTS19QTk1JX0VSUjAxOE1TRwkiVnBkOiBWUEQgZGF0YSBub3QgdmFsaWQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDE5CQkoU0tfRVJSQkFTRV9QTk1JICsgMTkpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDE5TVNHCSJWcGQ6IFZQRCBlbnRyaWVzIGxpc3Qgc3RyaW5nIHRvbyBsb25nIgorI2RlZmluZSBTS19QTk1JX0VSUjAyMQkJKFNLX0VSUkJBU0VfUE5NSSArIDIxKQorI2RlZmluZSBTS19QTk1JX0VSUjAyMU1TRwkiVnBkOiBWUEQgZGF0YSBzdHJpbmcgdG9vIGxvbmciCisjZGVmaW5lIFNLX1BOTUlfRVJSMDIyCQkoU0tfRVJSQkFTRV9QTk1JICsgMjIpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDIyTVNHCSJWcGQ6IFZQRCBkYXRhIHN0cmluZyB0b28gbG9uZyBzaG91bGQgYmUgZXJyb3JlZCBiZWZvcmUiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDIzCQkoU0tfRVJSQkFTRV9QTk1JICsgMjMpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDIzTVNHCSJWcGQ6IFVua25vd24gT0lEIGluIGdldCBhY3Rpb24iCisjZGVmaW5lIFNLX1BOTUlfRVJSMDI0CQkoU0tfRVJSQkFTRV9QTk1JICsgMjQpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDI0TVNHCSJWcGQ6IFVua25vd24gT0lEIGluIHByZXNldC9zZXQgYWN0aW9uIgorI2RlZmluZSBTS19QTk1JX0VSUjAyNQkJKFNLX0VSUkJBU0VfUE5NSSArIDI1KQorI2RlZmluZSBTS19QTk1JX0VSUjAyNU1TRwkiVnBkOiBDYW5ub3Qgd3JpdGUgVlBEIGFmdGVyIG1vZGlmeSBlbnRyeSIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMjYJCShTS19FUlJCQVNFX1BOTUkgKyAyNikKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMjZNU0cJIlZwZDogQ2Fubm90IHVwZGF0ZSBWUEQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDI3CQkoU0tfRVJSQkFTRV9QTk1JICsgMjcpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDI3TVNHCSJWcGQ6IENhbm5vdCBkZWxldGUgVlBEIGVudHJ5IgorI2RlZmluZSBTS19QTk1JX0VSUjAyOAkJKFNLX0VSUkJBU0VfUE5NSSArIDI4KQorI2RlZmluZSBTS19QTk1JX0VSUjAyOE1TRwkiVnBkOiBDYW5ub3QgdXBkYXRlIFZQRCBhZnRlciBkZWxldGUgZW50cnkiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDI5CQkoU0tfRVJSQkFTRV9QTk1JICsgMjkpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDI5TVNHCSJHZW5lcmFsOiBEcml2ZXIgZGVzY3JpcHRpb24gc3RyaW5nIHRvbyBsb25nIgorI2RlZmluZSBTS19QTk1JX0VSUjAzMAkJKFNLX0VSUkJBU0VfUE5NSSArIDMwKQorI2RlZmluZSBTS19QTk1JX0VSUjAzME1TRwkiR2VuZXJhbDogRHJpdmVyIHZlcnNpb24gbm90IGluaXRpYWxpemVkIgorI2RlZmluZSBTS19QTk1JX0VSUjAzMQkJKFNLX0VSUkJBU0VfUE5NSSArIDMxKQorI2RlZmluZSBTS19QTk1JX0VSUjAzMU1TRwkiR2VuZXJhbDogRHJpdmVyIHZlcnNpb24gc3RyaW5nIHRvbyBsb25nIgorI2RlZmluZSBTS19QTk1JX0VSUjAzMgkJKFNLX0VSUkJBU0VfUE5NSSArIDMyKQorI2RlZmluZSBTS19QTk1JX0VSUjAzMk1TRwkiR2VuZXJhbDogQ2Fubm90IHJlYWQgVlBEIE5hbWUgZm9yIEhXIGRlc2NyIgorI2RlZmluZSBTS19QTk1JX0VSUjAzMwkJKFNLX0VSUkJBU0VfUE5NSSArIDMzKQorI2RlZmluZSBTS19QTk1JX0VSUjAzM01TRwkiR2VuZXJhbDogSFcgZGVzY3JpcHRpb24gc3RyaW5nIHRvbyBsb25nIgorI2RlZmluZSBTS19QTk1JX0VSUjAzNAkJKFNLX0VSUkJBU0VfUE5NSSArIDM0KQorI2RlZmluZSBTS19QTk1JX0VSUjAzNE1TRwkiR2VuZXJhbDogVW5rbm93biBPSUQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDM1CQkoU0tfRVJSQkFTRV9QTk1JICsgMzUpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDM1TVNHCSJSbG10OiBVbmtub3duIE9JRCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzYJCShTS19FUlJCQVNFX1BOTUkgKyAzNikKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzZNU0cJIiIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzcJCShTS19FUlJCQVNFX1BOTUkgKyAzNykKKyNkZWZpbmUgU0tfUE5NSV9FUlIwMzdNU0cJIlJsbXQ6IFNLX1JMTVRfTU9ERV9DSEFOR0UgZXZlbnQgcmV0dXJuIG5vdCAwIgorI2RlZmluZSBTS19QTk1JX0VSUjAzOAkJKFNLX0VSUkJBU0VfUE5NSSArIDM4KQorI2RlZmluZSBTS19QTk1JX0VSUjAzOE1TRwkiUmxtdDogU0tfUkxNVF9QUkVGUE9SVF9DSEFOR0UgZXZlbnQgcmV0dXJuIG5vdCAwIgorI2RlZmluZSBTS19QTk1JX0VSUjAzOQkJKFNLX0VSUkJBU0VfUE5NSSArIDM5KQorI2RlZmluZSBTS19QTk1JX0VSUjAzOU1TRwkiUmxtdFN0YXQ6IFVua25vd24gT0lEIgorI2RlZmluZSBTS19QTk1JX0VSUjA0MAkJKFNLX0VSUkJBU0VfUE5NSSArIDQwKQorI2RlZmluZSBTS19QTk1JX0VSUjA0ME1TRwkiUG93ZXJNYW5hZ2VtZW50OiBVbmtub3duIE9JRCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDEJCShTS19FUlJCQVNFX1BOTUkgKyA0MSkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDFNU0cJIk1hY1ByaXZhdGVDb25mOiBVbmtub3duIE9JRCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDIJCShTS19FUlJCQVNFX1BOTUkgKyA0MikKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDJNU0cJIk1hY1ByaXZhdGVDb25mOiBTS19IV0VWX1NFVF9ST0xFIHJldHVybmVkIG5vdCAwIgorI2RlZmluZSBTS19QTk1JX0VSUjA0MwkJKFNLX0VSUkJBU0VfUE5NSSArIDQzKQorI2RlZmluZSBTS19QTk1JX0VSUjA0M01TRwkiTWFjUHJpdmF0ZUNvbmY6IFNLX0hXRVZfU0VUX0xNT0RFIHJldHVybmVkIG5vdCAwIgorI2RlZmluZSBTS19QTk1JX0VSUjA0NAkJKFNLX0VSUkJBU0VfUE5NSSArIDQ0KQorI2RlZmluZSBTS19QTk1JX0VSUjA0NE1TRwkiTWFjUHJpdmF0ZUNvbmY6IFNLX0hXRVZfU0VUX0ZMT1dNT0RFIHJldHVybmVkIG5vdCAwIgorI2RlZmluZSBTS19QTk1JX0VSUjA0NQkJKFNLX0VSUkJBU0VfUE5NSSArIDQ1KQorI2RlZmluZSBTS19QTk1JX0VSUjA0NU1TRwkiTWFjUHJpdmF0ZUNvbmY6IFNLX0hXRVZfU0VUX1NQRUVEIHJldHVybmVkIG5vdCAwIgorI2RlZmluZSBTS19QTk1JX0VSUjA0NgkJKFNLX0VSUkJBU0VfUE5NSSArIDQ2KQorI2RlZmluZSBTS19QTk1JX0VSUjA0Nk1TRwkiTW9uaXRvcjogVW5rbm93biBPSUQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDQ3CQkoU0tfRVJSQkFTRV9QTk1JICsgNDcpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDQ3TVNHCSJTaXJxVXBkYXRlOiBFdmVudCBmdW5jdGlvbiByZXR1cm5zIG5vdCAwIgorI2RlZmluZSBTS19QTk1JX0VSUjA0OAkJKFNLX0VSUkJBU0VfUE5NSSArIDQ4KQorI2RlZmluZSBTS19QTk1JX0VSUjA0OE1TRwkiUmxtdFVwZGF0ZTogRXZlbnQgZnVuY3Rpb24gcmV0dXJucyBub3QgMCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDkJCShTS19FUlJCQVNFX1BOTUkgKyA0OSkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNDlNU0cJIlNrUG5taUluaXQ6IEludmFsaWQgc2l6ZSBvZiAnQ291bnRlck9mZnNldCcgc3RydWN0ISEiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDUwCQkoU0tfRVJSQkFTRV9QTk1JICsgNTApCisjZGVmaW5lIFNLX1BOTUlfRVJSMDUwTVNHCSJTa1BubWlJbml0OiBJbnZhbGlkIHNpemUgb2YgJ1N0YXRBZGRyJyB0YWJsZSEhIgorI2RlZmluZSBTS19QTk1JX0VSUjA1MQkJKFNLX0VSUkJBU0VfUE5NSSArIDUxKQorI2RlZmluZSBTS19QTk1JX0VSUjA1MU1TRwkiU2tQbm1pRXZlbnQ6IFBvcnQgc3dpdGNoIHN1c3BpY2lvdXMiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDUyCQkoU0tfRVJSQkFTRV9QTk1JICsgNTIpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDUyTVNHCSIiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDUzCQkoU0tfRVJSQkFTRV9QTk1JICsgNTMpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDUzTVNHCSJHZW5lcmFsOiBEcml2ZXIgcmVsZWFzZSBkYXRlIG5vdCBpbml0aWFsaXplZCIKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNTQJCShTS19FUlJCQVNFX1BOTUkgKyA1NCkKKyNkZWZpbmUgU0tfUE5NSV9FUlIwNTRNU0cJIkdlbmVyYWw6IERyaXZlciByZWxlYXNlIGRhdGUgc3RyaW5nIHRvbyBsb25nIgorI2RlZmluZSBTS19QTk1JX0VSUjA1NQkJKFNLX0VSUkJBU0VfUE5NSSArIDU1KQorI2RlZmluZSBTS19QTk1JX0VSUjA1NU1TRwkiR2VuZXJhbDogRHJpdmVyIGZpbGUgbmFtZSBub3QgaW5pdGlhbGl6ZWQiCisjZGVmaW5lIFNLX1BOTUlfRVJSMDU2CQkoU0tfRVJSQkFTRV9QTk1JICsgNTYpCisjZGVmaW5lIFNLX1BOTUlfRVJSMDU2TVNHCSJHZW5lcmFsOiBEcml2ZXIgZmlsZSBuYW1lIHN0cmluZyB0b28gbG9uZyIKKworLyoKKyAqIE1hbmFnZW1lbnQgY291bnRlciBtYWNyb3MgY2FsbGVkIGJ5IHRoZSBkcml2ZXIKKyAqLworI2RlZmluZSBTS19QTk1JX1NFVF9EUklWRVJfREVTQ1IocEFDLHYpCSgocEFDKS0+UG5taS5wRHJpdmVyRGVzY3JpcHRpb24gPSBcCisJKGNoYXIgKikodikpCisKKyNkZWZpbmUgU0tfUE5NSV9TRVRfRFJJVkVSX1ZFUihwQUMsdikJKChwQUMpLT5Qbm1pLnBEcml2ZXJWZXJzaW9uID0gXAorCShjaGFyICopKHYpKQorCisjZGVmaW5lIFNLX1BOTUlfU0VUX0RSSVZFUl9SRUxEQVRFKHBBQyx2KQkoKHBBQyktPlBubWkucERyaXZlclJlbGVhc2VEYXRlID0gXAorCShjaGFyICopKHYpKQorCisjZGVmaW5lIFNLX1BOTUlfU0VUX0RSSVZFUl9GSUxFTkFNRShwQUMsdikJKChwQUMpLT5Qbm1pLnBEcml2ZXJGaWxlTmFtZSA9IFwKKwkoY2hhciAqKSh2KSkKKworI2RlZmluZSBTS19QTk1JX0NOVF9UWF9RVUVVRV9MRU4ocEFDLHYscCkgXAorCXsgXAorCQkocEFDKS0+UG5taS5Qb3J0W3BdLlR4U3dRdWV1ZUxlbiA9IChTS19VNjQpKHYpOyBcCisJCWlmICgocEFDKS0+UG5taS5Qb3J0W3BdLlR4U3dRdWV1ZUxlbiA+IChwQUMpLT5Qbm1pLlBvcnRbcF0uVHhTd1F1ZXVlTWF4KSB7IFwKKwkJCShwQUMpLT5Qbm1pLlBvcnRbcF0uVHhTd1F1ZXVlTWF4ID0gKHBBQyktPlBubWkuUG9ydFtwXS5UeFN3UXVldWVMZW47IFwKKwkJfSBcCisJfQorI2RlZmluZSBTS19QTk1JX0NOVF9UWF9SRVRSWShwQUMscCkJKCgocEFDKS0+UG5taS5Qb3J0W3BdLlR4UmV0cnlDdHMpKyspCisjZGVmaW5lIFNLX1BOTUlfQ05UX1JYX0lOVFIocEFDLHApCSgoKHBBQyktPlBubWkuUG9ydFtwXS5SeEludHJDdHMpKyspCisjZGVmaW5lIFNLX1BOTUlfQ05UX1RYX0lOVFIocEFDLHApCSgoKHBBQyktPlBubWkuUG9ydFtwXS5UeEludHJDdHMpKyspCisjZGVmaW5lIFNLX1BOTUlfQ05UX05PX1JYX0JVRihwQUMscCkJKCgocEFDKS0+UG5taS5Qb3J0W3BdLlJ4Tm9CdWZDdHMpKyspCisjZGVmaW5lIFNLX1BOTUlfQ05UX05PX1RYX0JVRihwQUMscCkJKCgocEFDKS0+UG5taS5Qb3J0W3BdLlR4Tm9CdWZDdHMpKyspCisjZGVmaW5lIFNLX1BOTUlfQ05UX1VTRURfVFhfREVTQ1IocEFDLHYscCkgXAorCSgocEFDKS0+UG5taS5Qb3J0W3BdLlR4VXNlZERlc2NyTm89KFNLX1U2NCkodikpOworI2RlZmluZSBTS19QTk1JX0NOVF9SWF9PQ1RFVFNfREVMSVZFUkVEKHBBQyx2LHApIFwKKwl7IFwKKwkJKChwQUMpLT5Qbm1pLlBvcnRbcF0uUnhEZWxpdmVyZWRDdHMpKys7IFwKKwkJKHBBQyktPlBubWkuUG9ydFtwXS5SeE9jdGV0c0RlbGl2ZXJlZEN0cyArPSAoU0tfVTY0KSh2KTsgXAorCX0KKyNkZWZpbmUgU0tfUE5NSV9DTlRfRVJSX1JFQ09WRVJZKHBBQyxwKQkoKChwQUMpLT5Qbm1pLlBvcnRbcF0uRXJyUmVjb3ZlcnlDdHMpKyspOworCisjZGVmaW5lIFNLX1BOTUlfQ05UX1NZTkNfT0NURVRTKHBBQyxwLHYpIFwKKwl7IFwKKwkJaWYgKChwKSA8IFNLX01BWF9NQUNTKSB7IFwKKwkJCSgocEFDKS0+UG5taS5Qb3J0W3BdLlN0YXRTeW5jQ3RzKSsrOyBcCisJCQkocEFDKS0+UG5taS5Qb3J0W3BdLlN0YXRTeW5jT2N0ZXRzQ3RzICs9IChTS19VNjQpKHYpOyBcCisJCX0gXAorCX0KKworI2RlZmluZSBTS19QTk1JX0NOVF9SWF9MT05HRlJBTUVTKHBBQyxwKSBcCisJeyBcCisJCWlmICgocCkgPCBTS19NQVhfTUFDUykgeyBcCisJCQkoKHBBQyktPlBubWkuUG9ydFtwXS5TdGF0UnhMb25nRnJhbWVDdHMrKyk7IFwKKwkJfSBcCisJfQorCisjZGVmaW5lIFNLX1BOTUlfQ05UX1JYX0ZSQU1FVE9PTE9ORyhwQUMscCkgXAorCXsgXAorCQlpZiAoKHApIDwgU0tfTUFYX01BQ1MpIHsgXAorCQkJKChwQUMpLT5Qbm1pLlBvcnRbcF0uU3RhdFJ4RnJhbWVUb29Mb25nQ3RzKyspOyBcCisJCX0gXAorCX0KKworI2RlZmluZSBTS19QTk1JX0NOVF9SWF9QTUFDQ19FUlIocEFDLHApIFwKKwl7IFwKKwkJaWYgKChwKSA8IFNLX01BWF9NQUNTKSB7IFwKKwkJCSgocEFDKS0+UG5taS5Qb3J0W3BdLlN0YXRSeFBNYWNjRXJyKyspOyBcCisJCX0gXAorCX0KKworLyoKKyAqIENvbnZlcnNpb24gTWFjcm9zCisgKi8KKyNkZWZpbmUgU0tfUE5NSV9QT1JUX0lOU1QyTE9HKGkpCSgodW5zaWduZWQgaW50KShpKSAtIDEpCisjZGVmaW5lIFNLX1BOTUlfUE9SVF9MT0cySU5TVChsKQkoKHVuc2lnbmVkIGludCkobCkgKyAxKQorI2RlZmluZSBTS19QTk1JX1BPUlRfUEhZUzJMT0cocCkJKCh1bnNpZ25lZCBpbnQpKHApICsgMSkKKyNkZWZpbmUgU0tfUE5NSV9QT1JUX0xPRzJQSFlTKHBBQyxsKQkoKHVuc2lnbmVkIGludCkobCkgLSAxKQorI2RlZmluZSBTS19QTk1JX1BPUlRfUEhZUzJJTlNUKHBBQyxwKQlcCisJKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA/IDIgOiAoKHVuc2lnbmVkIGludCkocCkgKyAyKSkKKyNkZWZpbmUgU0tfUE5NSV9QT1JUX0lOU1QyUEhZUyhwQUMsaSkJKCh1bnNpZ25lZCBpbnQpKGkpIC0gMikKKworLyoKKyAqIFN0cnVjdHVyZSBkZWZpbml0aW9uIGZvciBTa1BubWlHZXRTdHJ1Y3QgYW5kIFNrUG5taVNldFN0cnVjdAorICovCisjZGVmaW5lIFNLX1BOTUlfVlBEX0tFWV9TSVpFCTUKKyNkZWZpbmUgU0tfUE5NSV9WUERfQlVGU0laRQkJKFZQRF9TSVpFKQorI2RlZmluZSBTS19QTk1JX1ZQRF9FTlRSSUVTCQkoVlBEX1NJWkUgLyA0KQorI2RlZmluZSBTS19QTk1JX1ZQRF9EQVRBTEVOCQkxMjggLyogIE51bWJlciBvZiBkYXRhIGJ5dGVzICovCisKKyNkZWZpbmUgU0tfUE5NSV9NVUxUSUNBU1RfTElTVExFTgk2NAorI2RlZmluZSBTS19QTk1JX1NFTlNPUl9FTlRSSUVTCQkoU0tfTUFYX1NFTlNPUlMpCisjZGVmaW5lIFNLX1BOTUlfQ0hFQ0tTVU1fRU5UUklFUwkzCisjZGVmaW5lIFNLX1BOTUlfTUFDX0VOVFJJRVMJCQkoU0tfTUFYX01BQ1MgKyAxKQorI2RlZmluZSBTS19QTk1JX01PTklUT1JfRU5UUklFUwkJMjAKKyNkZWZpbmUgU0tfUE5NSV9UUkFQX0VOVFJJRVMJCTEwCisjZGVmaW5lIFNLX1BOTUlfVFJBUExFTgkJCQkxMjgKKyNkZWZpbmUgU0tfUE5NSV9TVFJJTkdMRU4xCQkJODAKKyNkZWZpbmUgU0tfUE5NSV9TVFJJTkdMRU4yCQkJMjUKKyNkZWZpbmUgU0tfUE5NSV9UUkFQX1FVRVVFX0xFTgkJNTEyCisKK3R5cGVkZWYgc3RydWN0IHNfUG5taVZwZCB7CisJY2hhcgkJCVZwZEtleVtTS19QTk1JX1ZQRF9LRVlfU0laRV07CisJY2hhcgkJCVZwZFZhbHVlW1NLX1BOTUlfVlBEX0RBVEFMRU5dOworCVNLX1U4CQkJVnBkQWNjZXNzOworCVNLX1U4CQkJVnBkQWN0aW9uOworfSBTS19QTk1JX1ZQRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc19Qbm1pU2Vuc29yIHsKKwlTS19VOAkJCVNlbnNvckluZGV4OworCWNoYXIJCQlTZW5zb3JEZXNjcltTS19QTk1JX1NUUklOR0xFTjJdOworCVNLX1U4CQkJU2Vuc29yVHlwZTsKKwlTS19VMzIJCQlTZW5zb3JWYWx1ZTsKKwlTS19VMzIJCQlTZW5zb3JXYXJuaW5nVGhyZXNob2xkTG93OworCVNLX1UzMgkJCVNlbnNvcldhcm5pbmdUaHJlc2hvbGRIaWdoOworCVNLX1UzMgkJCVNlbnNvckVycm9yVGhyZXNob2xkTG93OworCVNLX1UzMgkJCVNlbnNvckVycm9yVGhyZXNob2xkSGlnaDsKKwlTS19VOAkJCVNlbnNvclN0YXR1czsKKwlTS19VNjQJCQlTZW5zb3JXYXJuaW5nQ3RzOworCVNLX1U2NAkJCVNlbnNvckVycm9yQ3RzOworCVNLX1U2NAkJCVNlbnNvcldhcm5pbmdUaW1lc3RhbXA7CisJU0tfVTY0CQkJU2Vuc29yRXJyb3JUaW1lc3RhbXA7Cit9IFNLX1BOTUlfU0VOU09SOworCit0eXBlZGVmIHN0cnVjdCBzX1BubWlDaGVja3N1bSB7CisJU0tfVTY0CQkJQ2hlY2tzdW1SeE9rQ3RzOworCVNLX1U2NAkJCUNoZWNrc3VtUnhVbmFibGVDdHM7CisJU0tfVTY0CQkJQ2hlY2tzdW1SeEVyckN0czsKKwlTS19VNjQJCQlDaGVja3N1bVR4T2tDdHM7CisJU0tfVTY0CQkJQ2hlY2tzdW1UeFVuYWJsZUN0czsKK30gU0tfUE5NSV9DSEVDS1NVTTsKKwordHlwZWRlZiBzdHJ1Y3Qgc19Qbm1pU3RhdCB7CisJU0tfVTY0CQkJU3RhdFR4T2tDdHM7CisJU0tfVTY0CQkJU3RhdFR4T2N0ZXRzT2tDdHM7CisJU0tfVTY0CQkJU3RhdFR4QnJvYWRjYXN0T2tDdHM7CisJU0tfVTY0CQkJU3RhdFR4TXVsdGljYXN0T2tDdHM7CisJU0tfVTY0CQkJU3RhdFR4VW5pY2FzdE9rQ3RzOworCVNLX1U2NAkJCVN0YXRUeExvbmdGcmFtZXNDdHM7CisJU0tfVTY0CQkJU3RhdFR4QnVyc3RDdHM7CisJU0tfVTY0CQkJU3RhdFR4UGF1c2VNYWNDdHJsQ3RzOworCVNLX1U2NAkJCVN0YXRUeE1hY0N0cmxDdHM7CisJU0tfVTY0CQkJU3RhdFR4U2luZ2xlQ29sbGlzaW9uQ3RzOworCVNLX1U2NAkJCVN0YXRUeE11bHRpcGxlQ29sbGlzaW9uQ3RzOworCVNLX1U2NAkJCVN0YXRUeEV4Y2Vzc2l2ZUNvbGxpc2lvbkN0czsKKwlTS19VNjQJCQlTdGF0VHhMYXRlQ29sbGlzaW9uQ3RzOworCVNLX1U2NAkJCVN0YXRUeERlZmVycmFsQ3RzOworCVNLX1U2NAkJCVN0YXRUeEV4Y2Vzc2l2ZURlZmVycmFsQ3RzOworCVNLX1U2NAkJCVN0YXRUeEZpZm9VbmRlcnJ1bkN0czsKKwlTS19VNjQJCQlTdGF0VHhDYXJyaWVyQ3RzOworCVNLX1U2NAkJCUR1bW15MTsgLyogU3RhdFR4VXRpbGl6YXRpb24gKi8KKwlTS19VNjQJCQlTdGF0VHg2NEN0czsKKwlTS19VNjQJCQlTdGF0VHgxMjdDdHM7CisJU0tfVTY0CQkJU3RhdFR4MjU1Q3RzOworCVNLX1U2NAkJCVN0YXRUeDUxMUN0czsKKwlTS19VNjQJCQlTdGF0VHgxMDIzQ3RzOworCVNLX1U2NAkJCVN0YXRUeE1heEN0czsKKwlTS19VNjQJCQlTdGF0VHhTeW5jQ3RzOworCVNLX1U2NAkJCVN0YXRUeFN5bmNPY3RldHNDdHM7CisJU0tfVTY0CQkJU3RhdFJ4T2tDdHM7CisJU0tfVTY0CQkJU3RhdFJ4T2N0ZXRzT2tDdHM7CisJU0tfVTY0CQkJU3RhdFJ4QnJvYWRjYXN0T2tDdHM7CisJU0tfVTY0CQkJU3RhdFJ4TXVsdGljYXN0T2tDdHM7CisJU0tfVTY0CQkJU3RhdFJ4VW5pY2FzdE9rQ3RzOworCVNLX1U2NAkJCVN0YXRSeExvbmdGcmFtZXNDdHM7CisJU0tfVTY0CQkJU3RhdFJ4UGF1c2VNYWNDdHJsQ3RzOworCVNLX1U2NAkJCVN0YXRSeE1hY0N0cmxDdHM7CisJU0tfVTY0CQkJU3RhdFJ4UGF1c2VNYWNDdHJsRXJyb3JDdHM7CisJU0tfVTY0CQkJU3RhdFJ4TWFjQ3RybFVua25vd25DdHM7CisJU0tfVTY0CQkJU3RhdFJ4QnVyc3RDdHM7CisJU0tfVTY0CQkJU3RhdFJ4TWlzc2VkQ3RzOworCVNLX1U2NAkJCVN0YXRSeEZyYW1pbmdDdHM7CisJU0tfVTY0CQkJU3RhdFJ4Rmlmb092ZXJmbG93Q3RzOworCVNLX1U2NAkJCVN0YXRSeEphYmJlckN0czsKKwlTS19VNjQJCQlTdGF0UnhDYXJyaWVyQ3RzOworCVNLX1U2NAkJCVN0YXRSeElSTGVuZ3RoQ3RzOworCVNLX1U2NAkJCVN0YXRSeFN5bWJvbEN0czsKKwlTS19VNjQJCQlTdGF0UnhTaG9ydHNDdHM7CisJU0tfVTY0CQkJU3RhdFJ4UnVudEN0czsKKwlTS19VNjQJCQlTdGF0UnhDZXh0Q3RzOworCVNLX1U2NAkJCVN0YXRSeFRvb0xvbmdDdHM7CisJU0tfVTY0CQkJU3RhdFJ4RmNzQ3RzOworCVNLX1U2NAkJCUR1bW15MjsgLyogU3RhdFJ4VXRpbGl6YXRpb24gKi8KKwlTS19VNjQJCQlTdGF0Ung2NEN0czsKKwlTS19VNjQJCQlTdGF0UngxMjdDdHM7CisJU0tfVTY0CQkJU3RhdFJ4MjU1Q3RzOworCVNLX1U2NAkJCVN0YXRSeDUxMUN0czsKKwlTS19VNjQJCQlTdGF0UngxMDIzQ3RzOworCVNLX1U2NAkJCVN0YXRSeE1heEN0czsKK30gU0tfUE5NSV9TVEFUOworCit0eXBlZGVmIHN0cnVjdCBzX1BubWlDb25mIHsKKwljaGFyCQkJQ29uZk1hY0N1cnJlbnRBZGRyWzZdOworCWNoYXIJCQlDb25mTWFjRmFjdG9yeUFkZHJbNl07CisJU0tfVTgJCQlDb25mUE1EOworCVNLX1U4CQkJQ29uZkNvbm5lY3RvcjsKKwlTS19VMzIJCQlDb25mUGh5VHlwZTsKKwlTS19VMzIJCQlDb25mUGh5TW9kZTsKKwlTS19VOAkJCUNvbmZMaW5rQ2FwYWJpbGl0eTsKKwlTS19VOAkJCUNvbmZMaW5rTW9kZTsKKwlTS19VOAkJCUNvbmZMaW5rTW9kZVN0YXR1czsKKwlTS19VOAkJCUNvbmZMaW5rU3RhdHVzOworCVNLX1U4CQkJQ29uZkZsb3dDdHJsQ2FwYWJpbGl0eTsKKwlTS19VOAkJCUNvbmZGbG93Q3RybE1vZGU7CisJU0tfVTgJCQlDb25mRmxvd0N0cmxTdGF0dXM7CisJU0tfVTgJCQlDb25mUGh5T3BlcmF0aW9uQ2FwYWJpbGl0eTsKKwlTS19VOAkJCUNvbmZQaHlPcGVyYXRpb25Nb2RlOworCVNLX1U4CQkJQ29uZlBoeU9wZXJhdGlvblN0YXR1czsKKwlTS19VOAkJCUNvbmZTcGVlZENhcGFiaWxpdHk7CisJU0tfVTgJCQlDb25mU3BlZWRNb2RlOworCVNLX1U4CQkJQ29uZlNwZWVkU3RhdHVzOworfSBTS19QTk1JX0NPTkY7CisKK3R5cGVkZWYgc3RydWN0IHNfUG5taVJsbXQgeworCVNLX1UzMgkJCVJsbXRJbmRleDsKKwlTS19VMzIJCQlSbG10U3RhdHVzOworCVNLX1U2NAkJCVJsbXRUeEhlbGxvQ3RzOworCVNLX1U2NAkJCVJsbXRSeEhlbGxvQ3RzOworCVNLX1U2NAkJCVJsbXRUeFNwSGVsbG9SZXFDdHM7CisJU0tfVTY0CQkJUmxtdFJ4U3BIZWxsb0N0czsKK30gU0tfUE5NSV9STE1UOworCit0eXBlZGVmIHN0cnVjdCBzX1BubWlSbG10TW9uaXRvciB7CisJU0tfVTMyCQkJUmxtdE1vbml0b3JJbmRleDsKKwljaGFyCQkJUmxtdE1vbml0b3JBZGRyWzZdOworCVNLX1U2NAkJCVJsbXRNb25pdG9yRXJyb3JDdHM7CisJU0tfVTY0CQkJUmxtdE1vbml0b3JUaW1lc3RhbXA7CisJU0tfVTgJCQlSbG10TW9uaXRvckFkbWluOworfSBTS19QTk1JX1JMTVRfTU9OSVRPUjsKKwordHlwZWRlZiBzdHJ1Y3Qgc19Qbm1pUmVxdWVzdFN0YXR1cyB7CisJU0tfVTMyCQkJRXJyb3JTdGF0dXM7CisJU0tfVTMyCQkJRXJyb3JPZmZzZXQ7Cit9IFNLX1BOTUlfUkVRVUVTVF9TVEFUVVM7CisKK3R5cGVkZWYgc3RydWN0IHNfUG5taVN0cnVjRGF0YSB7CisJU0tfVTMyCQkJTWdtdERCVmVyc2lvbjsKKwlTS19QTk1JX1JFUVVFU1RfU1RBVFVTCVJldHVyblN0YXR1czsKKwlTS19VMzIJCQlWcGRGcmVlQnl0ZXM7CisJY2hhcgkJCVZwZEVudHJpZXNMaXN0W1NLX1BOTUlfVlBEX0VOVFJJRVMgKiBTS19QTk1JX1ZQRF9LRVlfU0laRV07CisJU0tfVTMyCQkJVnBkRW50cmllc051bWJlcjsKKwlTS19QTk1JX1ZQRAkJVnBkW1NLX1BOTUlfVlBEX0VOVFJJRVNdOworCVNLX1UzMgkJCVBvcnROdW1iZXI7CisJU0tfVTMyCQkJRGV2aWNlVHlwZTsKKwljaGFyCQkJRHJpdmVyRGVzY3JbU0tfUE5NSV9TVFJJTkdMRU4xXTsKKwljaGFyCQkJRHJpdmVyVmVyc2lvbltTS19QTk1JX1NUUklOR0xFTjJdOworCWNoYXIJCQlEcml2ZXJSZWxlYXNlRGF0ZVtTS19QTk1JX1NUUklOR0xFTjFdOworCWNoYXIJCQlEcml2ZXJGaWxlTmFtZVtTS19QTk1JX1NUUklOR0xFTjFdOworCWNoYXIJCQlId0Rlc2NyW1NLX1BOTUlfU1RSSU5HTEVOMV07CisJY2hhcgkJCUh3VmVyc2lvbltTS19QTk1JX1NUUklOR0xFTjJdOworCVNLX1UxNgkJCUNoaXBzZXQ7CisJU0tfVTMyCQkJQ2hpcElkOworCVNLX1U4CQkJVmF1eEF2YWlsOworCVNLX1UzMgkJCVJhbVNpemU7CisJU0tfVTMyCQkJTXR1U2l6ZTsKKwlTS19VMzIJCQlBY3Rpb247CisJU0tfVTMyCQkJVGVzdFJlc3VsdDsKKwlTS19VOAkJCUJ1c1R5cGU7CisJU0tfVTgJCQlCdXNTcGVlZDsKKwlTS19VOAkJCUJ1c1dpZHRoOworCVNLX1U4CQkJU2Vuc29yTnVtYmVyOworCVNLX1BOTUlfU0VOU09SCVNlbnNvcltTS19QTk1JX1NFTlNPUl9FTlRSSUVTXTsKKwlTS19VOAkJCUNoZWNrc3VtTnVtYmVyOworCVNLX1BOTUlfQ0hFQ0tTVU0JQ2hlY2tzdW1bU0tfUE5NSV9DSEVDS1NVTV9FTlRSSUVTXTsKKwlTS19QTk1JX1NUQVQJU3RhdFtTS19QTk1JX01BQ19FTlRSSUVTXTsKKwlTS19QTk1JX0NPTkYJQ29uZltTS19QTk1JX01BQ19FTlRSSUVTXTsKKwlTS19VOAkJCVJsbXRNb2RlOworCVNLX1UzMgkJCVJsbXRQb3J0TnVtYmVyOworCVNLX1U4CQkJUmxtdFBvcnRBY3RpdmU7CisJU0tfVTgJCQlSbG10UG9ydFByZWZlcnJlZDsKKwlTS19VNjQJCQlSbG10Q2hhbmdlQ3RzOworCVNLX1U2NAkJCVJsbXRDaGFuZ2VUaW1lOworCVNLX1U2NAkJCVJsbXRDaGFuZ2VFc3RpbWF0ZTsKKwlTS19VNjQJCQlSbG10Q2hhbmdlVGhyZXNob2xkOworCVNLX1BOTUlfUkxNVAlSbG10W1NLX01BWF9NQUNTXTsKKwlTS19VMzIJCQlSbG10TW9uaXRvck51bWJlcjsKKwlTS19QTk1JX1JMTVRfTU9OSVRPUglSbG10TW9uaXRvcltTS19QTk1JX01PTklUT1JfRU5UUklFU107CisJU0tfVTMyCQkJVHJhcE51bWJlcjsKKwlTS19VOAkJCVRyYXBbU0tfUE5NSV9UUkFQX1FVRVVFX0xFTl07CisJU0tfVTY0CQkJVHhTd1F1ZXVlTGVuOworCVNLX1U2NAkJCVR4U3dRdWV1ZU1heDsKKwlTS19VNjQJCQlUeFJldHJ5Q3RzOworCVNLX1U2NAkJCVJ4SW50ckN0czsKKwlTS19VNjQJCQlUeEludHJDdHM7CisJU0tfVTY0CQkJUnhOb0J1ZkN0czsKKwlTS19VNjQJCQlUeE5vQnVmQ3RzOworCVNLX1U2NAkJCVR4VXNlZERlc2NyTm87CisJU0tfVTY0CQkJUnhEZWxpdmVyZWRDdHM7CisJU0tfVTY0CQkJUnhPY3RldHNEZWxpdmVyZWRDdHM7CisJU0tfVTY0CQkJUnhId0Vycm9yc0N0czsKKwlTS19VNjQJCQlUeEh3RXJyb3JzQ3RzOworCVNLX1U2NAkJCUluRXJyb3JzQ3RzOworCVNLX1U2NAkJCU91dEVycm9yc0N0czsKKwlTS19VNjQJCQlFcnJSZWNvdmVyeUN0czsKKwlTS19VNjQJCQlTeXNVcFRpbWU7Cit9IFNLX1BOTUlfU1RSVUNUX0RBVEE7CisKKyNkZWZpbmUgU0tfUE5NSV9TVFJVQ1RfU0laRQkoc2l6ZW9mKFNLX1BOTUlfU1RSVUNUX0RBVEEpKQorI2RlZmluZSBTS19QTk1JX01JTl9TVFJVQ1RfU0laRQkoKHVuc2lnbmVkIGludCkoU0tfVVBUUilcCisJCQkJICYoKChTS19QTk1JX1NUUlVDVF9EQVRBICopMCktPlZwZEZyZWVCeXRlcykpCisJCQkJCQkJCQkJCQkJCS8qCisJCQkJCQkJCQkJCQkJCSAqIFJldHVyblN0YXR1cyBmaWVsZAorCQkJCQkJCQkJCQkJCQkgKiBtdXN0IGJlIGxvY2F0ZWQKKwkJCQkJCQkJCQkJCQkJICogYmVmb3JlIFZwZEZyZWVCeXRlcworCQkJCQkJCQkJCQkJCQkgKi8KKworLyoKKyAqIFZhcmlvdXMgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBTS19QTk1JX01BWF9QUk9UT1MJCTMKKworI2RlZmluZSBTS19QTk1JX0NOVF9OTwkJCTY2CS8qIE11c3QgaGF2ZSB0aGUgdmFsdWUgb2YgdGhlIGVudW0KKwkJCQkJCQkJCSAqIFNLX1BOTUlfTUFYX0lEWC4gRGVmaW5lIFNLX1BOTUlfQ0hFQ0sKKwkJCQkJCQkJCSAqIGZvciBjaGVjayB3aGlsZSBpbml0IHBoYXNlIDEKKwkJCQkJCQkJCSAqLworCisvKgorICogRXN0aW1hdGUgZGF0YSBzdHJ1Y3R1cmUKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc19Qbm1pRXN0aW1hdGUgeworCXVuc2lnbmVkIGludAlFc3RWYWx1ZUluZGV4OworCVNLX1U2NAkJCUVzdFZhbHVlWzddOworCVNLX1U2NAkJCUVzdGltYXRlOworCVNLX1RJTUVSCQlFc3RUaW1lcjsKK30gU0tfUE5NSV9FU1RJTUFURTsKKworCisvKgorICogVkNUIHRpbWVyIGRhdGEgc3RydWN0dXJlCisgKi8KK3R5cGVkZWYgc3RydWN0IHNfVmN0VGltZXIgeworCVNLX1RJTUVSCQlWY3RUaW1lcjsKK30gU0tfUE5NSV9WQ1RfVElNRVI7CisKKworLyoKKyAqIFBOTUkgc3BlY2lmaWMgYWRhcHRlciBjb250ZXh0IHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdCBzX1BubWlQb3J0IHsKKwlTS19VNjQJCQlTdGF0U3luY0N0czsKKwlTS19VNjQJCQlTdGF0U3luY09jdGV0c0N0czsKKwlTS19VNjQJCQlTdGF0UnhMb25nRnJhbWVDdHM7CisJU0tfVTY0CQkJU3RhdFJ4RnJhbWVUb29Mb25nQ3RzOworCVNLX1U2NAkJCVN0YXRSeFBNYWNjRXJyOworCVNLX1U2NAkJCVR4U3dRdWV1ZUxlbjsKKwlTS19VNjQJCQlUeFN3UXVldWVNYXg7CisJU0tfVTY0CQkJVHhSZXRyeUN0czsKKwlTS19VNjQJCQlSeEludHJDdHM7CisJU0tfVTY0CQkJVHhJbnRyQ3RzOworCVNLX1U2NAkJCVJ4Tm9CdWZDdHM7CisJU0tfVTY0CQkJVHhOb0J1ZkN0czsKKwlTS19VNjQJCQlUeFVzZWREZXNjck5vOworCVNLX1U2NAkJCVJ4RGVsaXZlcmVkQ3RzOworCVNLX1U2NAkJCVJ4T2N0ZXRzRGVsaXZlcmVkQ3RzOworCVNLX1U2NAkJCVJ4SHdFcnJvcnNDdHM7CisJU0tfVTY0CQkJVHhId0Vycm9yc0N0czsKKwlTS19VNjQJCQlJbkVycm9yc0N0czsKKwlTS19VNjQJCQlPdXRFcnJvcnNDdHM7CisJU0tfVTY0CQkJRXJyUmVjb3ZlcnlDdHM7CisJU0tfVTY0CQkJUnhTaG9ydFplcm9NYXJrOworCVNLX1U2NAkJCUNvdW50ZXJPZmZzZXRbU0tfUE5NSV9DTlRfTk9dOworCVNLX1UzMgkJCUNvdW50ZXJIaWdoW1NLX1BOTUlfQ05UX05PXTsKKwlTS19CT09MCQkJQWN0aXZlRmxhZzsKKwlTS19VOAkJCUFsaWduWzNdOworfSBTS19QTk1JX1BPUlQ7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19Qbm1pRGF0YSB7CisJU0tfUE5NSV9QT1JUCVBvcnQJW1NLX01BWF9NQUNTXTsKKwlTS19QTk1JX1BPUlQJQnVmUG9ydAlbU0tfTUFYX01BQ1NdOyAvKiAyMDAyLTA5LTEzIHB3ZWJlciAgKi8KKwlTS19VNjQJCQlWaXJ0dWFsQ291bnRlck9mZnNldFtTS19QTk1JX0NOVF9OT107CisJU0tfVTMyCQkJVGVzdFJlc3VsdDsKKwljaGFyCQkJSHdWZXJzaW9uWzEwXTsKKwlTS19VMTYJCQlBbGlnbjAxOworCisJY2hhcgkJCSpwRHJpdmVyRGVzY3JpcHRpb247CisJY2hhcgkJCSpwRHJpdmVyVmVyc2lvbjsKKwljaGFyCQkJKnBEcml2ZXJSZWxlYXNlRGF0ZTsKKwljaGFyCQkJKnBEcml2ZXJGaWxlTmFtZTsKKworCWludAkJCQlNYWNVcGRhdGVkRmxhZzsKKwlpbnQJCQkJUmxtdFVwZGF0ZWRGbGFnOworCWludAkJCQlTaXJxVXBkYXRlZEZsYWc7CisKKwlTS19VNjQJCQlSbG10Q2hhbmdlQ3RzOworCVNLX1U2NAkJCVJsbXRDaGFuZ2VUaW1lOworCVNLX1BOTUlfRVNUSU1BVEUJUmxtdENoYW5nZUVzdGltYXRlOworCVNLX1U2NAkJCVJsbXRDaGFuZ2VUaHJlc2hvbGQ7CisKKwlTS19VNjQJCQlTdGFydFVwVGltZTsKKwlTS19VMzIJCQlEZXZpY2VUeXBlOworCWNoYXIJCQlQY2lCdXNTcGVlZDsKKwljaGFyCQkJUGNpQnVzV2lkdGg7CisJY2hhcgkJCUNoaXBzZXQ7CisJY2hhcgkJCVBNRDsKKwljaGFyCQkJQ29ubmVjdG9yOworCVNLX0JPT0wJCQlEdWFsTmV0QWN0aXZlRmxhZzsKKwlTS19VMTYJCQlBbGlnbjAyOworCisJY2hhcgkJCVRyYXBCdWZbU0tfUE5NSV9UUkFQX1FVRVVFX0xFTl07CisJdW5zaWduZWQgaW50CVRyYXBCdWZGcmVlOworCXVuc2lnbmVkIGludAlUcmFwUXVldWVCZWc7CisJdW5zaWduZWQgaW50CVRyYXBRdWV1ZUVuZDsKKwl1bnNpZ25lZCBpbnQJVHJhcEJ1ZlBhZDsKKwl1bnNpZ25lZCBpbnQJVHJhcFVuaXF1ZTsKKwlTS19VOAkJVmN0U3RhdHVzW1NLX01BWF9NQUNTXTsKKwlTS19QTk1JX1ZDVAlWY3RCYWNrdXBbU0tfTUFYX01BQ1NdOworCVNLX1BOTUlfVkNUX1RJTUVSIFZjdFRpbWVvdXRbU0tfTUFYX01BQ1NdOworI2lmZGVmIFNLX0RJQUdfU1VQUE9SVAorCVNLX1UzMgkJCURpYWdBdHRhY2hlZDsKKyNlbmRpZiAvKiBTS19ESUFHX1NVUFBPUlQgKi8KK30gU0tfUE5NSTsKKworCisvKgorICogRnVuY3Rpb24gcHJvdG90eXBlcworICovCitleHRlcm4gaW50IFNrUG5taUluaXQoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IExldmVsKTsKK2V4dGVybiBpbnQgU2tQbm1pR2V0VmFyKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1UzMiBJZCwgdm9pZCogcEJ1ZiwKKwl1bnNpZ25lZCBpbnQqIHBMZW4sIFNLX1UzMiBJbnN0YW5jZSwgU0tfVTMyIE5ldEluZGV4KTsKK2V4dGVybiBpbnQgU2tQbm1pUHJlU2V0VmFyKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1UzMiBJZCwKKwl2b2lkKiBwQnVmLCB1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwgU0tfVTMyIE5ldEluZGV4KTsKK2V4dGVybiBpbnQgU2tQbm1pU2V0VmFyKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1UzMiBJZCwgdm9pZCogcEJ1ZiwKKwl1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwgU0tfVTMyIE5ldEluZGV4KTsKK2V4dGVybiBpbnQgU2tQbm1pR2V0U3RydWN0KFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIHZvaWQqIHBCdWYsCisJdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgTmV0SW5kZXgpOworZXh0ZXJuIGludCBTa1BubWlQcmVTZXRTdHJ1Y3QoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgdm9pZCogcEJ1ZiwKKwl1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBOZXRJbmRleCk7CitleHRlcm4gaW50IFNrUG5taVNldFN0cnVjdChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCB2b2lkKiBwQnVmLAorCXVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIE5ldEluZGV4KTsKK2V4dGVybiBpbnQgU2tQbm1pRXZlbnQoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgU0tfVTMyIEV2ZW50LAorCVNLX0VWUEFSQSBQYXJhbSk7CitleHRlcm4gaW50IFNrUG5taUdlbklvY3RsKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIHZvaWQgKiBwQnVmLAorCXVuc2lnbmVkIGludCAqIHBMZW4sIFNLX1UzMiBOZXRJbmRleCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2VzaXJxLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tnZXNpcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDg2YmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrZ2VzaXJxLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2dlc2lycS5oCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBDb21tb24gTW9kdWxlcworICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjMwICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzA3LzA0IDEyOjM0OjEzICQKKyAqIFB1cnBvc2U6CVNLIHNwZWNpZmljIEdpZ2FiaXQgRXRoZXJuZXQgc3BlY2lhbCBJUlEgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0lOQ19TS0dFU0lSUV9IXworI2RlZmluZSBfSU5DX1NLR0VTSVJRX0hfCisKKy8qIERlZmluZSByZXR1cm4gY29kZXMgb2YgU2tHZVBvcnRDaGVja1VwIGFuZCBDaGVja1Nob3J0ICovCisjZGVmaW5lCVNLX0hXX1BTX05PTkUJCTAJLyogTm8gYWN0aW9uIG5lZWRlZCAqLworI2RlZmluZQlTS19IV19QU19SRVNUQVJUCTEJLyogUmVzdGFydCBuZWVkZWQgKi8KKyNkZWZpbmUJU0tfSFdfUFNfTElOSwkJMgkvKiBMaW5rIFVwIGFjdGlvbnMgbmVlZGVkICovCisKKy8qCisgKiBEZWZpbmUgdGhlIEV2ZW50IHRoZSBzcGVjaWFsIElSUS9JTkkgbW9kdWxlIGNhbiBoYW5kbGUKKyAqLworI2RlZmluZSBTS19IV0VWX1dBVElNCQkJMQkvKiBUaW1lb3V0IGZvciBXQSBFcnJhdGEgIzIgWE1BQyAqLworI2RlZmluZSBTS19IV0VWX1BPUlRfU1RBUlQJCTIJLyogUG9ydCBTdGFydCBFdmVudCBieSBSTE1UICovCisjZGVmaW5lIFNLX0hXRVZfUE9SVF9TVE9QCQkzCS8qIFBvcnQgU3RvcCBFdmVudCBieSBSTE1UICovCisjZGVmaW5lIFNLX0hXRVZfQ0xFQVJfU1RBVAkJNAkvKiBDbGVhciBTdGF0aXN0aWNzIGJ5IFBOTUkgKi8KKyNkZWZpbmUgU0tfSFdFVl9VUERBVEVfU1RBVAkJNQkvKiBVcGRhdGUgU3RhdGlzdGljcyBieSBQTk1JICovCisjZGVmaW5lIFNLX0hXRVZfU0VUX0xNT0RFCQk2CS8qIFNldCBMaW5rIE1vZGUgYnkgUE5NSSAqLworI2RlZmluZSBTS19IV0VWX1NFVF9GTE9XTU9ERQk3CS8qIFNldCBGbG93IENvbnRyb2wgTW9kZSBieSBQTk1JICovCisjZGVmaW5lIFNLX0hXRVZfU0VUX1JPTEUJCTgJLyogU2V0IE1hc3Rlci9TbGF2ZSAoUm9sZSkgYnkgUE5NSSAqLworI2RlZmluZSBTS19IV0VWX1NFVF9TUEVFRAkJOQkvKiBTZXQgTGluayBTcGVlZCBieSBQTk1JICovCisjZGVmaW5lIFNLX0hXRVZfSEFMRkRVUF9DSEsJCTEwCS8qIEhhbGYgRHVwbGV4IEhhbmd1cCBXb3JrYXJvdW5kICovCisKKyNkZWZpbmUgU0tfV0FfQUNUX1RJTUUJCSg1MDAwMDAwVUwpCS8qIDUgc2VjICovCisjZGVmaW5lIFNLX1dBX0lOQV9USU1FCQkoMTAwMDAwVUwpCS8qIDEwMCBtc2VjICovCisKKyNkZWZpbmUgU0tfSEFMRkRVUF9DSEtfVElNRQkoMTAwMDBVTCkJLyogMTAgbXNlYyAqLworCisvKgorICogRGVmaW5lIHRoZSBlcnJvciBudW1iZXJzIGFuZCBtZXNzYWdlcworICovCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAwMQkJKFNLX0VSUkJBU0VfU0lSUSswKQorI2RlZmluZSBTS0VSUl9TSVJRX0UwMDFNU0cJIlVua25vd24gZXZlbnQiCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAwMgkJKFNLRVJSX1NJUlFfRTAwMSsxKQorI2RlZmluZSBTS0VSUl9TSVJRX0UwMDJNU0cJIlBhY2tldCB0aW1lb3V0IFJYMSIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDAzCQkoU0tFUlJfU0lSUV9FMDAyKzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAwM01TRwkiUGFja2V0IHRpbWVvdXQgUlgyIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMDQJCShTS0VSUl9TSVJRX0UwMDMrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDA0TVNHCSJNQUMgMSBub3QgY29ycmVjdGx5IGluaXRpYWxpemVkIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMDUJCShTS0VSUl9TSVJRX0UwMDQrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDA1TVNHCSJNQUMgMiBub3QgY29ycmVjdGx5IGluaXRpYWxpemVkIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMDYJCShTS0VSUl9TSVJRX0UwMDUrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDA2TVNHCSJDSEVDSyBmYWlsdXJlIFIxIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMDcJCShTS0VSUl9TSVJRX0UwMDYrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDA3TVNHCSJDSEVDSyBmYWlsdXJlIFIyIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMDgJCShTS0VSUl9TSVJRX0UwMDcrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDA4TVNHCSJDSEVDSyBmYWlsdXJlIFhTMSIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDA5CQkoU0tFUlJfU0lSUV9FMDA4KzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAwOU1TRwkiQ0hFQ0sgZmFpbHVyZSBYQTEiCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAxMAkJKFNLRVJSX1NJUlFfRTAwOSsxKQorI2RlZmluZSBTS0VSUl9TSVJRX0UwMTBNU0cJIkNIRUNLIGZhaWx1cmUgWFMyIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMTEJCShTS0VSUl9TSVJRX0UwMTArMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDExTVNHCSJDSEVDSyBmYWlsdXJlIFhBMiIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDEyCQkoU0tFUlJfU0lSUV9FMDExKzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAxMk1TRwkidW5leHBlY3RlZCBJUlEgTWFzdGVyIGVycm9yIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMTMJCShTS0VSUl9TSVJRX0UwMTIrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDEzTVNHCSJ1bmV4cGVjdGVkIElSUSBTdGF0dXMgZXJyb3IiCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAxNAkJKFNLRVJSX1NJUlFfRTAxMysxKQorI2RlZmluZSBTS0VSUl9TSVJRX0UwMTRNU0cJIlBhcml0eSBlcnJvciBvbiBSQU0gKHJlYWQpIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMTUJCShTS0VSUl9TSVJRX0UwMTQrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDE1TVNHCSJQYXJpdHkgZXJyb3Igb24gUkFNICh3cml0ZSkiCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAxNgkJKFNLRVJSX1NJUlFfRTAxNSsxKQorI2RlZmluZSBTS0VSUl9TSVJRX0UwMTZNU0cJIlBhcml0eSBlcnJvciBNQUMgMSIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDE3CQkoU0tFUlJfU0lSUV9FMDE2KzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAxN01TRwkiUGFyaXR5IGVycm9yIE1BQyAyIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMTgJCShTS0VSUl9TSVJRX0UwMTcrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDE4TVNHCSJQYXJpdHkgZXJyb3IgUlggMSIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDE5CQkoU0tFUlJfU0lSUV9FMDE4KzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAxOU1TRwkiUGFyaXR5IGVycm9yIFJYIDIiCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAyMAkJKFNLRVJSX1NJUlFfRTAxOSsxKQorI2RlZmluZSBTS0VSUl9TSVJRX0UwMjBNU0cJIk1BQyB0cmFuc21pdCBGSUZPIHVuZGVycnVuIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMjEJCShTS0VSUl9TSVJRX0UwMjArMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDIxTVNHCSJTcHVyaW91cyBUV1NJIGludGVycnVwdCIKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDIyCQkoU0tFUlJfU0lSUV9FMDIxKzEpCisjZGVmaW5lIFNLRVJSX1NJUlFfRTAyMk1TRwkiQ2FibGUgcGFpciBzd2FwIGVycm9yIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMjMJCShTS0VSUl9TSVJRX0UwMjIrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDIzTVNHCSJBdXRvLW5lZ290aWF0aW9uIGVycm9yIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMjQJCShTS0VSUl9TSVJRX0UwMjMrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDI0TVNHCSJGSUZPIG92ZXJmbG93IGVycm9yIgorI2RlZmluZSBTS0VSUl9TSVJRX0UwMjUJCShTS0VSUl9TSVJRX0UwMjQrMSkKKyNkZWZpbmUgU0tFUlJfU0lSUV9FMDI1TVNHCSIyIFBhaXIgRG93bnNoaWZ0IGRldGVjdGVkIgorCitleHRlcm4gdm9pZCBTa0dlU2lycUlzcihTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBTS19VMzIgSXN0YXR1cyk7CitleHRlcm4gaW50ICBTa0dlU2lycUV2ZW50KFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1UzMiBFdmVudCwgU0tfRVZQQVJBIFBhcmEpOworZXh0ZXJuIHZvaWQgU2tIV0xpbmtVcChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgUG9ydCk7CitleHRlcm4gdm9pZCBTa0hXTGlua0Rvd24oU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IFBvcnQpOworCisjZW5kaWYJLyogX0lOQ19TS0dFU0lSUV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NraTJjLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2tpMmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OThiYjQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NraTJjLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2kyYy5oCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBUV1NJLU1vZHVsZQorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjM1ICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzEwLzIwIDA5OjA2OjMwICQKKyAqIFB1cnBvc2U6CURlZmluZXMgdG8gYWNjZXNzIFZvbHRhZ2UgYW5kIFRlbXBlcmF0dXJlIFNlbnNvcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QuCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogU0tJMkMuSAljb250YWlucyBhbGwgSTJDIHNwZWNpZmljIGRlZmluZXMKKyAqLworCisjaWZuZGVmIF9TS0kyQ19IXworI2RlZmluZSBfU0tJMkNfSF8KKwordHlwZWRlZiBzdHJ1Y3QgIHNfU2Vuc29yIFNLX1NFTlNPUjsKKworI2luY2x1ZGUgImgvc2tnZWkyYy5oIgorCisvKgorICogRGVmaW5lIHRoZSBJMkMgZXZlbnRzLgorICovCisjZGVmaW5lIFNLX0kyQ0VWX0lSUQkxCS8qIElSUSBoYXBwZW5lZCBFdmVudCAqLworI2RlZmluZSBTS19JMkNFVl9USU0JMgkvKiBUaW1lb3V0IGV2ZW50ICovCisjZGVmaW5lIFNLX0kyQ0VWX0NMRUFSCTMJLyogQ2xlYXIgTUlCIFZhbHVlcyAqLworCisvKgorICogRGVmaW5lIFJFQUQgYW5kIFdSSVRFIENvbnN0YW50cy4KKyAqLworI2RlZmluZSBJMkNfUkVBRAkwCisjZGVmaW5lIEkyQ19XUklURQkxCisjZGVmaW5lIEkyQ19CVVJTVAkxCisjZGVmaW5lIEkyQ19TSU5HTEUJMAorCisjZGVmaW5lIFNLRVJSX0kyQ19FMDAxCQkoU0tfRVJSQkFTRV9JMkMrMCkKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMDFNU0cJIlNlbnNvciBpbmRleCB1bmtub3duIgorI2RlZmluZSBTS0VSUl9JMkNfRTAwMgkJKFNLRVJSX0kyQ19FMDAxKzEpCisjZGVmaW5lIFNLRVJSX0kyQ19FMDAyTVNHCSJUV1NJOiB0cmFuc2ZlciBkb2VzIG5vdCBjb21wbGV0ZSIKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMDMJCShTS0VSUl9JMkNfRTAwMisxKQorI2RlZmluZSBTS0VSUl9JMkNfRTAwM01TRwkiTE04MDogTkFLIG9uIGRldmljZSBzZW5kIgorI2RlZmluZSBTS0VSUl9JMkNfRTAwNAkJKFNLRVJSX0kyQ19FMDAzKzEpCisjZGVmaW5lIFNLRVJSX0kyQ19FMDA0TVNHCSJMTTgwOiBOQUsgb24gcmVnaXN0ZXIgc2VuZCIKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMDUJCShTS0VSUl9JMkNfRTAwNCsxKQorI2RlZmluZSBTS0VSUl9JMkNfRTAwNU1TRwkiTE04MDogTkFLIG9uIGRldmljZSAoMikgc2VuZCIKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMDYJCShTS0VSUl9JMkNfRTAwNSsxKQorI2RlZmluZSBTS0VSUl9JMkNfRTAwNk1TRwkiVW5rbm93biBldmVudCIKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMDcJCShTS0VSUl9JMkNfRTAwNisxKQorI2RlZmluZSBTS0VSUl9JMkNfRTAwN01TRwkiTE04MCByZWFkIG91dCBvZiBzdGF0ZSIKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMDgJCShTS0VSUl9JMkNfRTAwNysxKQorI2RlZmluZSBTS0VSUl9JMkNfRTAwOE1TRwkiVW5leHBlY3RlZCBzZW5zb3IgcmVhZCBjb21wbGV0ZWQiCisjZGVmaW5lIFNLRVJSX0kyQ19FMDA5CQkoU0tFUlJfSTJDX0UwMDgrMSkKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMDlNU0cJIldBUk5JTkc6IHRlbXBlcmF0dXJlIHNlbnNvciBvdXQgb2YgcmFuZ2UiCisjZGVmaW5lIFNLRVJSX0kyQ19FMDEwCQkoU0tFUlJfSTJDX0UwMDkrMSkKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMTBNU0cJIldBUk5JTkc6IHZvbHRhZ2Ugc2Vuc29yIG91dCBvZiByYW5nZSIKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMTEJCShTS0VSUl9JMkNfRTAxMCsxKQorI2RlZmluZSBTS0VSUl9JMkNfRTAxMU1TRwkiRVJST1I6IHRlbXBlcmF0dXJlIHNlbnNvciBvdXQgb2YgcmFuZ2UiCisjZGVmaW5lIFNLRVJSX0kyQ19FMDEyCQkoU0tFUlJfSTJDX0UwMTErMSkKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMTJNU0cJIkVSUk9SOiB2b2x0YWdlIHNlbnNvciBvdXQgb2YgcmFuZ2UiCisjZGVmaW5lIFNLRVJSX0kyQ19FMDEzCQkoU0tFUlJfSTJDX0UwMTIrMSkKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMTNNU0cJIkVSUk9SOiBjb3VsZG4ndCBpbml0IHNlbnNvciIKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMTQJCShTS0VSUl9JMkNfRTAxMysxKQorI2RlZmluZSBTS0VSUl9JMkNfRTAxNE1TRwkiV0FSTklORzogZmFuIHNlbnNvciBvdXQgb2YgcmFuZ2UiCisjZGVmaW5lIFNLRVJSX0kyQ19FMDE1CQkoU0tFUlJfSTJDX0UwMTQrMSkKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMTVNU0cJIkVSUk9SOiBmYW4gc2Vuc29yIG91dCBvZiByYW5nZSIKKyNkZWZpbmUgU0tFUlJfSTJDX0UwMTYJCShTS0VSUl9JMkNfRTAxNSsxKQorI2RlZmluZSBTS0VSUl9JMkNfRTAxNk1TRwkiVFdTSTogYWN0aXZlIHRyYW5zZmVyIGRvZXMgbm90IGNvbXBsZXRlIgorCisvKgorICogRGVmaW5lIFRpbWVvdXQgdmFsdWVzCisgKi8KKyNkZWZpbmUgU0tfSTJDX1RJTV9MT05HCQkyMDAwMDAwTAkvKiAyIHNlY29uZHMgKi8KKyNkZWZpbmUgU0tfSTJDX1RJTV9TSE9SVAkgMTAwMDAwTAkvKiAxMDAgbWlsbGlzZWNvbmRzICovCisjZGVmaW5lIFNLX0kyQ19USU1fV0FUQ0gJMTAwMDAwMEwJLyogMSBzZWNvbmQgKi8KKworLyoKKyAqIERlZmluZSB0cmFwIGFuZCBlcnJvciBsb2cgaG9sZCB0aW1lcworICovCisjaWZuZGVmCVNLX1NFTl9FUlJfVFJfSE9MRAorI2RlZmluZSBTS19TRU5fRVJSX1RSX0hPTEQJCSg0KlNLX1RJQ0tTX1BFUl9TRUMpCisjZW5kaWYKKyNpZm5kZWYJU0tfU0VOX0VSUl9MT0dfSE9MRAorI2RlZmluZSBTS19TRU5fRVJSX0xPR19IT0xECQkoNjAqU0tfVElDS1NfUEVSX1NFQykKKyNlbmRpZgorI2lmbmRlZglTS19TRU5fV0FSTl9UUl9IT0xECisjZGVmaW5lIFNLX1NFTl9XQVJOX1RSX0hPTEQJCSgxNSpTS19USUNLU19QRVJfU0VDKQorI2VuZGlmCisjaWZuZGVmCVNLX1NFTl9XQVJOX0xPR19IT0xECisjZGVmaW5lIFNLX1NFTl9XQVJOX0xPR19IT0xECSgxNSo2MCpTS19USUNLU19QRVJfU0VDKQorI2VuZGlmCisKKy8qCisgKiBEZWZpbmVzIGZvciBTZW5UeXBlCisgKi8KKyNkZWZpbmUgU0tfU0VOX1VOS05PV04JMAorI2RlZmluZSBTS19TRU5fVEVNUAkJMQorI2RlZmluZSBTS19TRU5fVk9MVAkJMgorI2RlZmluZSBTS19TRU5fRkFOCQkzCisKKy8qCisgKiBEZWZpbmUgZm9yIHRoZSBTZW5FcnJvckZsYWcKKyAqLworI2RlZmluZSBTS19TRU5fRVJSX05PVF9QUkVTRU5UCTAJLyogRXJyb3IgRmxhZzogU2Vuc29yIG5vdCBwcmVzZW50ICovCisjZGVmaW5lIFNLX1NFTl9FUlJfT0sJCQkxCS8qIEVycm9yIEZsYWc6IE8uSy4gKi8KKyNkZWZpbmUgU0tfU0VOX0VSUl9XQVJOCQkJMgkvKiBFcnJvciBGbGFnOiBXYXJuaW5nICovCisjZGVmaW5lIFNLX1NFTl9FUlJfRVJSCQkJMwkvKiBFcnJvciBGbGFnOiBFcnJvciAqLworI2RlZmluZSBTS19TRU5fRVJSX0ZBVUxUWQkJNAkvKiBFcnJvciBGbGFnOiBGYXVsdHkgKi8KKworLyoKKyAqIERlZmluZSB0aGUgU2Vuc29yIHN0cnVjdAorICovCitzdHJ1Y3QJc19TZW5zb3IgeworCWNoYXIJKlNlbkRlc2M7CQkJLyogRGVzY3JpcHRpb24gKi8KKwlpbnQJCVNlblR5cGU7CQkJLyogVm9sdGFnZSBvciBUZW1wZXJhdHVyZSAqLworCVNLX0kzMglTZW5WYWx1ZTsJCQkvKiBDdXJyZW50IHZhbHVlIG9mIHRoZSBzZW5zb3IgKi8KKwlTS19JMzIJU2VuVGhyZUVyckhpZ2g7CQkvKiBIaWdoIGVycm9yIFRocmVzaGhvbGQgb2YgdGhpcyBzZW5zb3IgKi8KKwlTS19JMzIJU2VuVGhyZVdhcm5IaWdoOwkvKiBIaWdoIHdhcm5pbmcgVGhyZXNoaG9sZCBvZiB0aGlzIHNlbnNvciAqLworCVNLX0kzMglTZW5UaHJlRXJyTG93OwkJLyogTG93ZXIgZXJyb3IgVGhyZXNob2xkIG9mIHRoZSBzZW5zb3IgKi8KKwlTS19JMzIJU2VuVGhyZVdhcm5Mb3c7CQkvKiBMb3dlciB3YXJuaW5nIFRocmVzaG9sZCBvZiB0aGUgc2Vuc29yICovCisJaW50CQlTZW5FcnJGbGFnOwkJCS8qIFNlbnNvciBpbmRpY2F0ZWQgYW4gZXJyb3IgKi8KKwlTS19CT09MCVNlbkluaXQ7CQkJLyogSXMgc2Vuc29yIGluaXRpYWxpemVkID8gKi8KKwlTS19VNjQJU2VuRXJyQ3RzOwkJCS8qIEVycm9yIHRyYXAgY291bnRlciAqLworCVNLX1U2NAlTZW5XYXJuQ3RzOwkJCS8qIFdhcm5pbmcgdHJhcCBjb3VudGVyICovCisJU0tfVTY0CVNlbkJlZ0VyclRTOwkJLyogQmVnaW4gZXJyb3IgdGltZXN0YW1wICovCisJU0tfVTY0CVNlbkJlZ1dhcm5UUzsJCS8qIEJlZ2luIHdhcm5pbmcgdGltZXN0YW1wICovCisJU0tfVTY0CVNlbkxhc3RFcnJUcmFwVFM7CS8qIExhc3QgZXJyb3IgdHJhcCB0aW1lc3RhbXAgKi8KKwlTS19VNjQJU2VuTGFzdEVyckxvZ1RTOwkvKiBMYXN0IGVycm9yIGxvZyB0aW1lc3RhbXAgKi8KKwlTS19VNjQJU2VuTGFzdFdhcm5UcmFwVFM7CS8qIExhc3Qgd2FybmluZyB0cmFwIHRpbWVzdGFtcCAqLworCVNLX1U2NAlTZW5MYXN0V2FybkxvZ1RTOwkvKiBMYXN0IHdhcm5pbmcgbG9nIHRpbWVzdGFtcCAqLworCWludAkJU2VuU3RhdGU7CQkJLyogU2Vuc29yIFN0YXRlIChzZWUgSFcgc3BlY2lmaWMgaW5jbHVkZSkgKi8KKwlpbnQJCSgqU2VuUmVhZCkoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgc3RydWN0IHNfU2Vuc29yICpwU2VuKTsKKwkJCQkJCQkJLyogU2Vuc29ycyByZWFkIGZ1bmN0aW9uICovCisJU0tfVTE2CVNlblJlZzsJCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyBmb3IgdGhpcyBzZW5zb3IgKi8KKwlTS19VOAlTZW5EZXY7CQkJCS8qIERldmljZSBTZWxlY3Rpb24gZm9yIHRoaXMgc2Vuc29yICovCit9OworCit0eXBlZGVmCXN0cnVjdAlzX0kyYyB7CisJU0tfU0VOU09SCVNlblRhYmxlW1NLX01BWF9TRU5TT1JTXTsJLyogU2Vuc29yIFRhYmxlICovCisJaW50CQkJQ3VyclNlbnM7CS8qIFdoaWNoIHNlbnNvciBpcyBjdXJyZW50bHkgcXVlcmllZCAqLworCWludAkJCU1heFNlbnM7CS8qIE1heC4gbnVtYmVyIG9mIHNlbnNvcnMgKi8KKwlpbnQJCQlUaW1lck1vZGU7CS8qIFVzZSB0aGUgdGltZXIgYWxzbyB0byB3YXRjaCB0aGUgc3RhdGUgbWFjaGluZSAqLworCWludAkJCUluaXRMZXZlbDsJLyogSW5pdGlhbGl6ZWQgTGV2ZWwgKi8KKyNpZm5kZWYgU0tfRElBRworCWludAkJCUR1bW15UmVhZHM7CS8qIE51bWJlciBvZiBub24tY2hlY2tlZCBkdW1teSByZWFkcyAqLworCVNLX1RJTUVSCVNlblRpbWVyOwkvKiBTZW5zb3JzIHRpbWVyICovCisjZW5kaWYgLyogIVNLX0RJQUcgKi8KK30gU0tfSTJDOworCitleHRlcm4gaW50IFNrSTJjSW5pdChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgTGV2ZWwpOworZXh0ZXJuIGludCBTa0kyY1dyaXRlKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1UzMiBEYXRhLCBpbnQgRGV2LCBpbnQgU2l6ZSwKKwkJCQkJICAgaW50IFJlZywgaW50IEJ1cnN0KTsKK2V4dGVybiBpbnQgU2tJMmNSZWFkU2Vuc29yKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1NFTlNPUiAqcFNlbik7CisjaWZkZWYgU0tfRElBRworZXh0ZXJuCVNLX1UzMiBTa0kyY1JlYWQoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IERldiwgaW50IFNpemUsIGludCBSZWcsCisJCQkJCQkgaW50IEJ1cnN0KTsKKyNlbHNlIC8qICFTS19ESUFHICovCitleHRlcm4gaW50IFNrSTJjRXZlbnQoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgU0tfVTMyIEV2ZW50LCBTS19FVlBBUkEgUGFyYSk7CitleHRlcm4gdm9pZCBTa0kyY1dhaXRJcnEoU0tfQUMgKnBBQywgU0tfSU9DIElvQyk7CitleHRlcm4gdm9pZCBTa0kyY0lzcihTS19BQyAqcEFDLCBTS19JT0MgSW9DKTsKKyNlbmRpZiAvKiAhU0tfRElBRyAqLworI2VuZGlmIC8qIG5fU0tJMkNfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2txdWV1ZS5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrcXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWM0MGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrcXVldWUuaApAQCAtMCwwICsxLDk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2txdWV1ZS5oCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBFdmVudCBTY2hlZHVsZXIgTW9kdWxlCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMTYgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDkvMTYgMTI6NTA6MzIgJAorICogUHVycG9zZToJRGVmaW5lcyBmb3IgdGhlIEV2ZW50IHF1ZXVlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdCBHbWJILgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFNLUVVFVUUuSAljb250YWlucyBhbGwgZGVmaW5lcyBhbmQgdHlwZXMgZm9yIHRoZSBldmVudCBxdWV1ZQorICovCisKKyNpZm5kZWYgX1NLUVVFVUVfSF8KKyNkZWZpbmUgX1NLUVVFVUVfSF8KKworCisvKgorICogZGVmaW5lIHRoZSBldmVudCBjbGFzc2VzIHRvIGJlIHNlcnZlZAorICovCisjZGVmaW5lCVNLR0VfRFJWCTEJLyogRHJpdmVyIEV2ZW50IENsYXNzICovCisjZGVmaW5lCVNLR0VfUkxNVAkyCS8qIFJMTVQgRXZlbnQgQ2xhc3MgKi8KKyNkZWZpbmUJU0tHRV9JMkMJMwkvKiBJMkMgRXZlbnQgQ2xhc3MgKi8KKyNkZWZpbmUJU0tHRV9QTk1JCTQJLyogUE5NSSBFdmVudCBDbGFzcyAqLworI2RlZmluZQlTS0dFX0NTVU0JNQkvKiBDaGVja3N1bSBFdmVudCBDbGFzcyAqLworI2RlZmluZQlTS0dFX0hXQUMJNgkvKiBIYXJkd2FyZSBBY2Nlc3MgRXZlbnQgQ2xhc3MgKi8KKworI2RlZmluZQlTS0dFX1NXVAk5CS8qIFNvZnR3YXJlIFRpbWVyIEV2ZW50IENsYXNzICovCisjZGVmaW5lCVNLR0VfTEFDUAkxMAkvKiBMQUNQIEFnZ3JlZ2F0aW9uIEV2ZW50IENsYXNzICovCisjZGVmaW5lCVNLR0VfUlNGCTExCS8qIFJTRiBBZ2dyZWdhdGlvbiBFdmVudCBDbGFzcyAqLworI2RlZmluZQlTS0dFX01BUktFUgkxMgkvKiBNQVJLRVIgQWdncmVnYXRpb24gRXZlbnQgQ2xhc3MgKi8KKyNkZWZpbmUJU0tHRV9GRAkJMTMJLyogRkQgRGlzdHJpYnV0b3IgRXZlbnQgQ2xhc3MgKi8KKworLyoKKyAqIGRlZmluZSBldmVudCBxdWV1ZSBhcyBjaXJjdWxhciBidWZmZXIKKyAqLworI2RlZmluZSBTS19NQVhfRVZFTlQJNjQKKworLyoKKyAqIFBhcmFtZXRlciB1bmlvbiBmb3IgdGhlIFBhcmEgc3R1ZmYKKyAqLwordHlwZWRlZgl1bmlvbiB1X0V2UGFyYSB7CisJdm9pZAkqcFBhcmFQdHI7CS8qIFBhcmFtZXRlciBQb2ludGVyICovCisJU0tfVTY0CVBhcmE2NDsJCS8qIFBhcmFtZXRlciA2NGJpdCB2ZXJzaW9uICovCisJU0tfVTMyCVBhcmEzMlsyXTsJLyogUGFyYW1ldGVyIEFycmF5IG9mIDMyYml0IHBhcmFtZXRlcnMgKi8KK30gU0tfRVZQQVJBOworCisvKgorICogRXZlbnQgUXVldWUKKyAqCXNrcXVldWUuYworICogZXZlbnRzIGFyZSBjbGFzcy92YWx1ZSBwYWlycworICoJY2xhc3MJaXMgYWRkcmVzc2VlLCBlLmcuIFJMTVQsIFBOTUkgZXRjLgorICoJdmFsdWUJaXMgY29tbWFuZCwgZS5nLiBsaW5lIHN0YXRlIGNoYW5nZSwgcmluZyBvcCBjaGFuZ2UgZXRjLgorICovCit0eXBlZGVmCXN0cnVjdCBzX0V2ZW50RWxlbSB7CisJU0tfVTMyCQlDbGFzczsJCQkvKiBFdmVudCBjbGFzcyAqLworCVNLX1UzMgkJRXZlbnQ7CQkJLyogRXZlbnQgdmFsdWUgKi8KKwlTS19FVlBBUkEJUGFyYTsJCQkvKiBFdmVudCBwYXJhbWV0ZXIgKi8KK30gU0tfRVZFTlRFTEVNOworCit0eXBlZGVmCXN0cnVjdCBzX1F1ZXVlIHsKKwlTS19FVkVOVEVMRU0JRXZRdWV1ZVtTS19NQVhfRVZFTlRdOworCVNLX0VWRU5URUxFTQkqRXZQdXQ7CisJU0tfRVZFTlRFTEVNCSpFdkdldDsKK30gU0tfUVVFVUU7CisKK2V4dGVybgl2b2lkIFNrRXZlbnRJbml0KFNLX0FDICpwQUMsIFNLX0lPQyBJb2MsIGludCBMZXZlbCk7CitleHRlcm4Jdm9pZCBTa0V2ZW50UXVldWUoU0tfQUMgKnBBQywgU0tfVTMyIENsYXNzLCBTS19VMzIgRXZlbnQsCisJU0tfRVZQQVJBIFBhcmEpOworZXh0ZXJuCWludCBTa0V2ZW50RGlzcGF0Y2hlcihTS19BQyAqcEFDLCBTS19JT0MgSW9jKTsKKworCisvKiBEZWZpbmUgRXJyb3IgTnVtYmVycyBhbmQgbWVzc2FnZXMgKi8KKyNkZWZpbmUJU0tFUlJfUV9FMDAxCShTS19FUlJCQVNFX1FVRVVFKzApCisjZGVmaW5lCVNLRVJSX1FfRTAwMU1TRwkiRXZlbnQgcXVldWUgb3ZlcmZsb3ciCisjZGVmaW5lCVNLRVJSX1FfRTAwMgkoU0tFUlJfUV9FMDAxKzEpCisjZGVmaW5lCVNLRVJSX1FfRTAwMk1TRwkiVW5kZWZpbmVkIGV2ZW50IGNsYXNzIgorI2VuZGlmCS8qIF9TS1FVRVVFX0hfICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za3JsbXQuaCBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za3JsbXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTc1ZGZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrcmxtdC5oCkBAIC0wLDAgKzEsNDM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tybG10LmgKKyAqIFByb2plY3Q6CUdFbmVzaXMsIFBDSSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4zNyAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wNC8xNSAwOTo0Mzo0MyAkCisgKiBQdXJwb3NlOglIZWFkZXIgZmlsZSBmb3IgUmVkdW5kYW50IExpbmsgTWFuYWdlbWVuVC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogVGhpcyBpcyB0aGUgaGVhZGVyIGZpbGUgZm9yIFJlZHVuZGFudCBMaW5rIE1hbmFnZW1lblQuCisgKgorICogSW5jbHVkZSBGaWxlIEhpZXJhcmNoeToKKyAqCisgKgkic2tkcnYxc3QuaCIKKyAqCS4uLgorICoJInNrdHlwZXMuaCIKKyAqCSJza3F1ZXVlLmgiCisgKgkic2thZGRyLmgiCisgKgkic2tybG10LmgiCisgKgkuLi4KKyAqCSJza2RydjJuZC5oIgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19JTkNfU0tSTE1UX0gKKyNkZWZpbmUgX19JTkNfU0tSTE1UX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgkvKiBjcGx1c3BsdXMgKi8KKworLyogZGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZQlTS19STE1UX05FVF9ET1dOX1RFTVAJMQkvKiBORVRfRE9XTiBkdWUgdG8gbGFzdCBwb3J0IGRvd24uICovCisjZGVmaW5lCVNLX1JMTVRfTkVUX0RPV05fRklOQUwJMgkvKiBORVRfRE9XTiBkdWUgdG8gUkxNVF9TVE9QLiAqLworCisvKiAtLS0tLSBEZWZhdWx0IHF1ZXVlIHNpemVzIC0gbXVzdCBiZSBtdWx0aXBsZXMgb2YgOCBLQiAtLS0tLSAqLworCisvKiBMZXNzIHRoYW4gOCBLQiBmcmVlIGluIFJYIHF1ZXVlID0+IHBhdXNlIGZyYW1lcy4gKi8KKyNkZWZpbmUgU0tfUkxNVF9TVEFOREJZX1FSWFNJWkUJMTI4CS8qIFNpemUgb2Ygcnggc3RhbmRieSBxdWV1ZSBpbiBLQi4gKi8KKyNkZWZpbmUgU0tfUkxNVF9TVEFOREJZX1FYQVNJWkUJMzIJLyogU2l6ZSBvZiBhc3luYyBzdGFuZGJ5IHF1ZXVlIGluIEtCLiAqLworI2RlZmluZSBTS19STE1UX1NUQU5EQllfUVhTU0laRQkwCS8qIFNpemUgb2Ygc3luYyBzdGFuZGJ5IHF1ZXVlIGluIEtCLiAqLworCisjZGVmaW5lIFNLX1JMTVRfTUFYX1RYX0JVRl9TSVpFCTYwCS8qIE1heGltdW0gUkxNVCB0cmFuc21pdCBzaXplLiAqLworCisvKiAtLS0tLSBQT1JUIHN0YXRlcyAtLS0tLSAqLworCisjZGVmaW5lIFNLX1JMTVRfUFNfSU5JVAkJCTAJLyogUG9ydCBzdGF0ZTogSW5pdC4gKi8KKyNkZWZpbmUgU0tfUkxNVF9QU19MSU5LX0RPV04JMQkvKiBQb3J0IHN0YXRlOiBMaW5rIGRvd24uICovCisjZGVmaW5lIFNLX1JMTVRfUFNfRE9XTgkJCTIJLyogUG9ydCBzdGF0ZTogUG9ydCBkb3duLiAqLworI2RlZmluZSBTS19STE1UX1BTX0dPSU5HX1VQCQkzCS8qIFBvcnQgc3RhdGU6IEdvaW5nIHVwLiAqLworI2RlZmluZSBTS19STE1UX1BTX1VQCQkJNAkvKiBQb3J0IHN0YXRlOiBVcC4gKi8KKworLyogLS0tLS0gUkxNVCBzdGF0ZXMgLS0tLS0gKi8KKworI2RlZmluZSBTS19STE1UX1JTX0lOSVQJCQkwCS8qIFJMTVQgc3RhdGU6IEluaXQuICovCisjZGVmaW5lIFNLX1JMTVRfUlNfTkVUX0RPV04JCTEJLyogUkxNVCBzdGF0ZTogTmV0IGRvd24uICovCisjZGVmaW5lIFNLX1JMTVRfUlNfTkVUX1VQCQkyCS8qIFJMTVQgc3RhdGU6IE5ldCB1cC4gKi8KKworLyogLS0tLS0gUE9SVCBldmVudHMgLS0tLS0gKi8KKworI2RlZmluZSBTS19STE1UX0xJTktfVVAJCQkxMDAxCS8qIExpbmsgY2FtZSB1cC4gKi8KKyNkZWZpbmUgU0tfUkxNVF9MSU5LX0RPV04JCTEwMDIJLyogTGluayB3ZW50IGRvd24uICovCisjZGVmaW5lIFNLX1JMTVRfUE9SVF9BRERSCQkxMDAzCS8qIFBvcnQgYWRkcmVzcyBjaGFuZ2VkLiAqLworCisvKiAtLS0tLSBSTE1UIGV2ZW50cyAtLS0tLSAqLworCisjZGVmaW5lIFNLX1JMTVRfU1RBUlQJCQkyMDAxCS8qIFN0YXJ0IFJMTVQuICovCisjZGVmaW5lIFNLX1JMTVRfU1RPUAkJCTIwMDIJLyogU3RvcCBSTE1ULiAqLworI2RlZmluZSBTS19STE1UX1BBQ0tFVF9SRUNFSVZFRAkyMDAzCS8qIFBhY2tldCB3YXMgcmVjZWl2ZWQgZm9yIFJMTVQuICovCisjZGVmaW5lIFNLX1JMTVRfU1RBVFNfQ0xFQVIJCTIwMDQJLyogQ2xlYXIgc3RhdGlzdGljcy4gKi8KKyNkZWZpbmUgU0tfUkxNVF9TVEFUU19VUERBVEUJMjAwNQkvKiBVcGRhdGUgc3RhdGlzdGljcy4gKi8KKyNkZWZpbmUgU0tfUkxNVF9QUkVGUE9SVF9DSEFOR0UJMjAwNgkvKiBDaGFuZ2UgcHJlZmVycmVkIHBvcnQuICovCisjZGVmaW5lIFNLX1JMTVRfTU9ERV9DSEFOR0UJCTIwMDcJLyogTmV3IFJsbXRNb2RlLiAqLworI2RlZmluZSBTS19STE1UX1NFVF9ORVRTCQkyMDA4CS8qIE51bWJlciBvZiBOZXRzICgxIG9yIDIpLiAqLworCisvKiAtLS0tLSBSTE1UIG1vZGUgYml0cyAtLS0tLSAqLworCisvKgorICogQ0FVVElPTjoJVGhlc2UgZGVmaW5lcyBhcmUgcHJpdmF0ZSB0byBSTE1ULgorICoJCQlQbGVhc2UgdXNlIHRoZSBSTE1UIG1vZGUgZGVmaW5lcyBiZWxvdy4KKyAqLworCisjZGVmaW5lIFNLX1JMTVRfQ0hFQ0tfTElOSwkJICAxCQkvKiBDaGVjayBMaW5rLiAqLworI2RlZmluZSBTS19STE1UX0NIRUNLX0xPQ19MSU5LCSAgMgkJLyogQ2hlY2sgb3RoZXIgbGluayBvbiBzYW1lIGFkYXB0ZXIuICovCisjZGVmaW5lIFNLX1JMTVRfQ0hFQ0tfU0VHCQkgIDQJCS8qIENoZWNrIHNlZ21lbnRhdGlvbi4gKi8KKworI2lmbmRlZiBSTE1UX0NIRUNLX1JFTU9URQorI2RlZmluZSBTS19STE1UX0NIRUNLX09USEVSUwlTS19STE1UX0NIRUNLX0xPQ19MSU5LCisjZWxzZQkvKiBSTE1UX0NIRUNLX1JFTU9URSAqLworI2RlZmluZSBTS19STE1UX0NIRUNLX1JFTV9MSU5LCSAgOAkJLyogQ2hlY2sgbGluayhzKSBvbiBvdGhlciBhZGFwdGVyKHMpLiAqLworI2RlZmluZSBTS19STE1UX01BWF9SRU1PVEVfUE9SVFNfQ0hFQ0tFRAkzCisjZGVmaW5lIFNLX1JMTVRfQ0hFQ0tfT1RIRVJTCVwKKwkJKFNLX1JMTVRfQ0hFQ0tfTE9DX0xJTksgfCBTS19STE1UX0NIRUNLX1JFTV9MSU5LKQorI2VuZGlmCS8qIFJMTVRfQ0hFQ0tfUkVNT1RFICovCisKKyNpZm5kZWYgU0tfUkxNVF9FTkFCTEVfVFJBTlNQQVJFTlQKKyNkZWZpbmUgU0tfUkxNVF9UUkFOU1BBUkVOVAkJICAwCQkvKiBSTE1UIHRyYW5zcGFyZW50IC0gaW5hY3RpdmUuICovCisjZWxzZQkvKiBTS19STE1UX0VOQUJMRV9UUkFOU1BBUkVOVCAqLworI2RlZmluZSBTS19STE1UX1RSQU5TUEFSRU5UCQkxMjgJCS8qIFJMTVQgdHJhbnNwYXJlbnQuICovCisjZW5kaWYJLyogU0tfUkxNVF9FTkFCTEVfVFJBTlNQQVJFTlQgKi8KKworLyogLS0tLS0gUkxNVCBtb2RlcyAtLS0tLSAqLworCisvKiBDaGVjayBMaW5rIFN0YXRlLiAqLworI2RlZmluZSBTS19STE1UX01PREVfQ0xTCShTS19STE1UX0NIRUNLX0xJTkspCisKKy8qIENoZWNrIExvY2FsIFBvcnRzOiBjaGVjayBvdGhlciBsaW5rcyBvbiB0aGUgc2FtZSBhZGFwdGVyLiAqLworI2RlZmluZSBTS19STE1UX01PREVfQ0xQCShTS19STE1UX0NIRUNLX0xJTksgfCBTS19STE1UX0NIRUNLX0xPQ19MSU5LKQorCisvKiBDaGVjayBMb2NhbCBQb3J0cyBhbmQgU2VnbWVudGF0aW9uIFN0YXR1cy4gKi8KKyNkZWZpbmUgU0tfUkxNVF9NT0RFX0NMUFNTCVwKKwkJKFNLX1JMTVRfQ0hFQ0tfTElOSyB8IFNLX1JMTVRfQ0hFQ0tfTE9DX0xJTksgfCBTS19STE1UX0NIRUNLX1NFRykKKworI2lmZGVmIFJMTVRfQ0hFQ0tfUkVNT1RFCisvKiBDaGVjayBMb2NhbCBhbmQgUmVtb3RlIFBvcnRzOiBjaGVjayBsaW5rcyAobG9jYWwgb3IgcmVtb3RlKS4gKi8KKwlOYW1lIG9mIGRlZmluZSBUQkQhCisjZGVmaW5lIFNLX1JMTVRfTU9ERV9DUlAJXAorCQkoU0tfUkxNVF9DSEVDS19MSU5LIHwgU0tfUkxNVF9DSEVDS19MT0NfTElOSyB8IFNLX1JMTVRfQ0hFQ0tfUkVNX0xJTkspCisKKy8qIENoZWNrIExvY2FsIGFuZCBSZW1vdGUgUG9ydHMgYW5kIFNlZ21lbnRhdGlvbiBTdGF0dXMuICovCisJTmFtZSBvZiBkZWZpbmUgVEJEIQorI2RlZmluZSBTS19STE1UX01PREVfQ1JQU1MJXAorCQkoU0tfUkxNVF9DSEVDS19MSU5LIHwgU0tfUkxNVF9DSEVDS19MT0NfTElOSyB8IFwKKwkJU0tfUkxNVF9DSEVDS19SRU1fTElOSyB8IFNLX1JMTVRfQ0hFQ0tfU0VHKQorI2VuZGlmCS8qIFJMTVRfQ0hFQ0tfUkVNT1RFICovCisKKy8qIC0tLS0tIFJMTVQgbG9va2FoZWFkIHJlc3VsdCBiaXRzIC0tLS0tICovCisKKyNkZWZpbmUgU0tfUkxNVF9SWF9STE1UCQkJMQkvKiBHaXZlIHBhY2tldCB0byBSTE1ULiAqLworI2RlZmluZSBTS19STE1UX1JYX1BST1RPQ09MCQkyCS8qIEdpdmUgcGFja2V0IHRvIHByb3RvY29sLiAqLworCisvKiBNYWNyb3MgKi8KKworI2lmIDAKK1NLX0FDCQkqcEFDCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX1UzMgkJUG9ydE51bQkJLyogcmVjZWl2aW5nIHBvcnQgKi8KK3Vuc2lnbmVkCVBrdExlbgkJLyogcmVjZWl2ZWQgcGFja2V0J3MgbGVuZ3RoICovCitTS19CT09MCQlJc0JjCQkvKiBGbGFnOiBwYWNrZXQgaXMgYnJvYWRjYXN0ICovCit1bnNpZ25lZAkqcE9mZnNldAkvKiBvZmZzLiBvZiBieXRlcyB0byBwcmVzZW50IHRvIFNLX1JMTVRfTE9PS0FIRUFEICovCit1bnNpZ25lZAkqcE51bUJ5dGVzCS8qICNCeXRlcyB0byBwcmVzZW50IHRvIFNLX1JMTVRfTE9PS0FIRUFEICovCisjZW5kaWYJLyogMCAqLworCisjZGVmaW5lIFNLX1JMTVRfUFJFX0xPT0tBSEVBRChwQUMsUG9ydE51bSxQa3RMZW4sSXNCYyxwT2Zmc2V0LHBOdW1CeXRlcykgeyBcCisJU0tfQUMJKl9wQUM7IFwKKwlTS19VMzIJX1BvcnROdW07IFwKKwlfcEFDID0gKHBBQyk7IFwKKwlfUG9ydE51bSA9IChTS19VMzIpKFBvcnROdW0pOyBcCisJLyogX3BBQy0+UmxtdC5Qb3J0W19Qb3J0TnVtXS5QYWNrZXRzUngrKzsgKi8gXAorCV9wQUMtPlJsbXQuUG9ydFtfUG9ydE51bV0uUGFja2V0c1BlclRpbWVTbG90Kys7IFwKKyAgICBpZiAoX3BBQy0+UmxtdC5SbG10T2ZmKSB7IFwKKwkJKihwTnVtQnl0ZXMpID0gMDsgXAorICAgIH0gXAorICAgIGVsc2Uge1wKKyAgICAgICAgaWYgKChfcEFDLT5SbG10LlBvcnRbX1BvcnROdW1dLk5ldC0+UmxtdE1vZGUgJiBTS19STE1UX1RSQU5TUEFSRU5UKSAhPSAwKSB7IFwKKyAgICAJCSoocE51bUJ5dGVzKSA9IDA7IFwKKyAgICAJfSBcCisgICAgCWVsc2UgaWYgKElzQmMpIHsgXAorICAgIAkJaWYgKF9wQUMtPlJsbXQuUG9ydFtfUG9ydE51bV0uTmV0LT5SbG10TW9kZSAhPSBTS19STE1UX01PREVfQ0xTKSB7IFwKKyAgICAJCQkqKHBOdW1CeXRlcykgPSA2OyBcCisgICAgCQkJKihwT2Zmc2V0KSA9IDY7IFwKKyAgICAJCX0gXAorICAgIAkJZWxzZSB7IFwKKyAgICAJCQkqKHBOdW1CeXRlcykgPSAwOyBcCisgICAgCQl9IFwKKyAgICAJfSBcCisgICAgCWVsc2UgeyBcCisgICAgCQlpZiAoKFBrdExlbikgPiBTS19STE1UX01BWF9UWF9CVUZfU0laRSkgeyBcCisgICAgCQkJLyogX3BBQy0+UmxtdC5Qb3J0W19Qb3J0TnVtXS5EYXRhUGFja2V0c1BlclRpbWVTbG90Kys7ICovIFwKKyAgICAJCQkqKHBOdW1CeXRlcykgPSAwOyBcCisgICAgCQl9IFwKKyAgICAJCWVsc2UgeyBcCisgICAgCQkJKihwTnVtQnl0ZXMpID0gNjsgXAorICAgIAkJCSoocE9mZnNldCkgPSAwOyBcCisgICAgCQl9IFwKKyAgICAJfSBcCisgICAgfSBcCit9CisKKyNpZiAwCitTS19BQwkJKnBBQwkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19VMzIJCVBvcnROdW0JCS8qIHJlY2VpdmluZyBwb3J0ICovCitTS19VOAkJKnBMYVBhY2tldCwJLyogcmVjZWl2ZWQgcGFja2V0J3MgZGF0YSAocG9pbnRzIHRvIHBPZmZzZXQpICovCitTS19CT09MCQlJc0JjCQkvKiBGbGFnOiBwYWNrZXQgaXMgYnJvYWRjYXN0ICovCitTS19CT09MCQlJc01jCQkvKiBGbGFnOiBwYWNrZXQgaXMgbXVsdGljYXN0ICovCit1bnNpZ25lZAkqcEZvclJsbXQJLyogUmVzdWx0OiBiaXRzIFNLX1JMTVRfUlhfUkxNVCwgU0tfUkxNVF9SWF9QUk9UT0NPTCAqLworU0tfUkxNVF9MT09LQUhFQUQoKSBleHBlY3RzICpwTnVtQnl0ZXMgZnJvbQorcGFja2V0IG9mZnNldCAqcE9mZnNldCAocy5hLikgYXQgKnBMYVBhY2tldC4KKworSWYgeW91IHVzZSBTS19STE1UX0xPT0tBSEVBRCBpbiBhIHBhdGggd2hlcmUgeW91IGFscmVhZHkga25vdyBpZiB0aGUgcGFja2V0IGlzCitCQywgTUMsIG9yIFVDLCB5b3Ugc2hvdWxkIHVzZSBjb25zdGFudHMgZm9yIElzQmMgYW5kIElzTWMsIHNvIHRoYXQgeW91ciBjb21waWxlcgorY2FuIHRyYXNoIHVubmVlZGVkIHBhcnRzIG9mIHRoZSBpZiBjb25zdHJ1Y3Rpb24uCisjZW5kaWYJLyogMCAqLworCisjZGVmaW5lIFNLX1JMTVRfTE9PS0FIRUFEKHBBQyxQb3J0TnVtLHBMYVBhY2tldCxJc0JjLElzTWMscEZvclJsbXQpIHsgXAorCVNLX0FDCSpfcEFDOyBcCisJU0tfVTMyCV9Qb3J0TnVtOyBcCisJU0tfVTgJKl9wTGFQYWNrZXQ7IFwKKwlfcEFDID0gKHBBQyk7IFwKKwlfUG9ydE51bSA9IChTS19VMzIpKFBvcnROdW0pOyBcCisJX3BMYVBhY2tldCA9IChTS19VOCAqKShwTGFQYWNrZXQpOyBcCisJaWYgKElzQmMpIHtcCisJCWlmICghU0tfQUREUl9FUVVBTChfcExhUGFja2V0LCBfcEFDLT5BZGRyLk5ldFtfcEFDLT5SbG10LlBvcnRbIFwKKwkJCV9Qb3J0TnVtXS5OZXQtPk5ldE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MuYSkpIHsgXAorCQkJX3BBQy0+UmxtdC5Qb3J0W19Qb3J0TnVtXS5CY1RpbWVTdGFtcCA9IFNrT3NHZXRUaW1lKF9wQUMpOyBcCisJCQlfcEFDLT5SbG10LkNoZWNrU3dpdGNoID0gU0tfVFJVRTsgXAorCQl9IFwKKwkJLyogX3BBQy0+UmxtdC5Qb3J0W19Qb3J0TnVtXS5EYXRhUGFja2V0c1BlclRpbWVTbG90Kys7ICovIFwKKwkJKihwRm9yUmxtdCkgPSBTS19STE1UX1JYX1BST1RPQ09MOyBcCisJfSBcCisJZWxzZSBpZiAoSXNNYykgeyBcCisJCWlmIChTS19BRERSX0VRVUFMKF9wTGFQYWNrZXQsIEJyaWRnZU1jQWRkci5hKSkgeyBcCisJCQlfcEFDLT5SbG10LlBvcnRbX1BvcnROdW1dLkJwZHVQYWNrZXRzUGVyVGltZVNsb3QrKzsgXAorCQkJaWYgKF9wQUMtPlJsbXQuUG9ydFtfUG9ydE51bV0uTmV0LT5SbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfU0VHKSB7IFwKKwkJCQkqKHBGb3JSbG10KSA9IFNLX1JMTVRfUlhfUkxNVCB8IFNLX1JMTVRfUlhfUFJPVE9DT0w7IFwKKwkJCX0gXAorCQkJZWxzZSB7IFwKKwkJCQkqKHBGb3JSbG10KSA9IFNLX1JMTVRfUlhfUFJPVE9DT0w7IFwKKwkJCX0gXAorCQl9IFwKKwkJZWxzZSBpZiAoU0tfQUREUl9FUVVBTChfcExhUGFja2V0LCBTa1JsbXRNY0FkZHIuYSkpIHsgXAorCQkJKihwRm9yUmxtdCkgPSBTS19STE1UX1JYX1JMTVQ7IFwKKwkJfSBcCisJCWVsc2UgeyBcCisJCQkvKiBfcEFDLT5SbG10LlBvcnRbX1BvcnROdW1dLkRhdGFQYWNrZXRzUGVyVGltZVNsb3QrKzsgKi8gXAorCQkJKihwRm9yUmxtdCkgPSBTS19STE1UX1JYX1BST1RPQ09MOyBcCisJCX0gXAorCX0gXAorCWVsc2UgeyBcCisJCWlmIChTS19BRERSX0VRVUFMKCBcCisJCQlfcExhUGFja2V0LCBcCisJCQlfcEFDLT5BZGRyLlBvcnRbX1BvcnROdW1dLkN1cnJlbnRNYWNBZGRyZXNzLmEpKSB7IFwKKwkJCSoocEZvclJsbXQpID0gU0tfUkxNVF9SWF9STE1UOyBcCisJCX0gXAorCQllbHNlIHsgXAorCQkJLyogX3BBQy0+UmxtdC5Qb3J0W19Qb3J0TnVtXS5EYXRhUGFja2V0c1BlclRpbWVTbG90Kys7ICovIFwKKwkJCSoocEZvclJsbXQpID0gU0tfUkxNVF9SWF9QUk9UT0NPTDsgXAorCQl9IFwKKwl9IFwKK30KKworI2lmZGVmIFNLX1JMTVRfRkFTVF9MT09LQUhFQUQKK0Vycm9yOiBTS19STE1UX0ZBU1RfTE9PS0FIRUFEIG5vIGxvbmdlciB1c2VkLiBVc2UgbmV3IG1hY3JvcyBmb3IgbG9va2FoZWFkLgorI2VuZGlmCS8qIFNLX1JMTVRfRkFTVF9MT09LQUhFQUQgKi8KKyNpZmRlZiBTS19STE1UX1NMT1dfTE9PS0FIRUFECitFcnJvcjogU0tfUkxNVF9TTE9XX0xPT0tBSEVBRCBubyBsb25nZXIgdXNlZC4gVXNlIG5ldyBtYWNyb3MgZm9yIGxvb2thaGVhZC4KKyNlbmRpZgkvKiBTS19STE1UX1NMT1dfTE9PS0FIRUFEICovCisKKy8qIHR5cGVkZWZzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBTS19STE1UX01CVUZfUFJJVkFURQordHlwZWRlZiBzdHJ1Y3Qgc19SbG10TWJ1ZiB7CisJc29tZSBjb250ZW50Cit9IFNLX1JMTVRfTUJVRjsKKyNlbmRpZgkvKiBTS19STE1UX01CVUZfUFJJVkFURSAqLworCisKKyNpZmRlZiBTS19MQV9JTkZPCit0eXBlZGVmIHN0cnVjdCBzX1JsbXRfUGFja2V0SW5mbyB7CisJdW5zaWduZWQJUGFja2V0TGVuZ3RoOwkJCS8qIExlbmd0aCBvZiBwYWNrZXQuICovCisJdW5zaWduZWQJUGFja2V0VHlwZTsJCQkJLyogRGlyZWN0ZWQvTXVsdGljYXN0L0Jyb2FkY2FzdC4gKi8KK30gU0tfUkxNVF9QSU5GTzsKKyNlbmRpZgkvKiBTS19MQV9JTkZPICovCisKKwordHlwZWRlZiBzdHJ1Y3Qgc19Sb290SWQgeworCVNLX1U4CQlJZFs4XTsJCQkJCS8qIFJvb3QgQnJpZGdlIElkLiAqLworfSBTS19STE1UX1JPT1RfSUQ7CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19wb3J0IHsKKwlTS19NQUNfQUREUglDaGVja0FkZHI7CisJU0tfQk9PTAkJU3VzcGVjdFR4OworfSBTS19QT1JUX0NIRUNLOworCisKK3R5cGVkZWYgc3RydWN0IHNfUmxtdE5ldCBTS19STE1UX05FVDsKKworCit0eXBlZGVmIHN0cnVjdCBzX1JsbXRQb3J0IHsKKworLyogLS0tLS0gUHVibGljIHBhcnQgKHJlYWQtb25seSkgLS0tLS0gKi8KKworCVNLX1U4CQkJUG9ydFN0YXRlOwkJCQkvKiBDdXJyZW50IHN0YXRlIG9mIHRoaXMgcG9ydC4gKi8KKworCS8qIEZvciBQTk1JICovCisJU0tfQk9PTAkJCUxpbmtEb3duOworCVNLX0JPT0wJCQlQb3J0RG93bjsKKwlTS19VOAkJCUFsaWduMDE7CisKKwlTS19VMzIJCQlQb3J0TnVtYmVyOwkJCQkvKiBOdW1iZXIgb2YgcG9ydCBvbiBhZGFwdGVyLiAqLworCVNLX1JMTVRfTkVUICoJTmV0OwkJCQkJLyogTmV0IHBvcnQgYmVsb25ncyB0by4gKi8KKworCVNLX1U2NAkJCVR4SGVsbG9DdHM7CisJU0tfVTY0CQkJUnhIZWxsb0N0czsKKwlTS19VNjQJCQlUeFNwSGVsbG9SZXFDdHM7CisJU0tfVTY0CQkJUnhTcEhlbGxvQ3RzOworCisvKiAtLS0tLSBQcml2YXRlIHBhcnQgLS0tLS0gKi8KKworLyoJU0tfVTY0CQkJUGFja2V0c1J4OyAqLwkJCQkvKiBUb3RhbCBwYWNrZXRzIHJlY2VpdmVkLiAqLworCVNLX1UzMgkJCVBhY2tldHNQZXJUaW1lU2xvdDsJCS8qIFBhY2tldHMgcnhlZCBiZXR3ZWVuIFRPcy4gKi8KKy8qCVNLX1UzMgkJCURhdGFQYWNrZXRzUGVyVGltZVNsb3Q7ICovCS8qIERhdGEgcGFja2V0cyAuLi4gKi8KKwlTS19VMzIJCQlCcGR1UGFja2V0c1BlclRpbWVTbG90OwkvKiBCUERVIHBhY2tldHMgcnhlZCBpbiBUUy4gKi8KKwlTS19VNjQJCQlCY1RpbWVTdGFtcDsJCQkvKiBUaW1lIG9mIGxhc3QgQkMgcmVjZWl2ZS4gKi8KKwlTS19VNjQJCQlHdVRpbWVTdGFtcDsJCQkvKiBUaW1lIG9mIGVudGVyaW5nIEdPSU5HX1VQLiAqLworCisJU0tfVElNRVIJCVVwVGltZXI7CQkJCS8qIFRpbWVyIHN0cnVjdCBMaW5rL1BvcnQgdXAuICovCisJU0tfVElNRVIJCURvd25SeFRpbWVyOwkJCS8qIFRpbWVyIHN0cnVjdCBkb3duIHJ4LiAqLworCVNLX1RJTUVSCQlEb3duVHhUaW1lcjsJCQkvKiBUaW1lciBzdHJ1Y3QgZG93biB0eC4gKi8KKworCVNLX1UzMgkJCUNoZWNraW5nU3RhdGU7CQkJLyogQ2hlY2tpbmcgU3RhdGUuICovCisKKwlTS19BRERSX1BPUlQgKglBZGRyUG9ydDsKKworCVNLX1U4CQkJUmFuZG9tWzRdOwkJCQkvKiBSYW5kb20gdmFsdWUuICovCisJdW5zaWduZWQJCVBvcnRzQ2hlY2tlZDsJCQkvKiAjcG9ydHMgY2hlY2tlZC4gKi8KKwl1bnNpZ25lZAkJUG9ydHNTdXNwZWN0OwkJCS8qICNwb3J0cyBjaGVja2VkIHRoYXQgYXJlIHMuICovCisJU0tfUE9SVF9DSEVDSwlQb3J0Q2hlY2tbMV07CisvKglTS19QT1JUX0NIRUNLCVBvcnRDaGVja1tTS19NQVhfTUFDUyAtIDFdOyAqLworCisJU0tfQk9PTAkJCVBvcnRTdGFydGVkOwkJCS8qIFBvcnQgaXMgc3RhcnRlZC4gKi8KKwlTS19CT09MCQkJUG9ydE5vUng7CQkJCS8qIE5vUnggZm9yID49IDEgdGltZSBzbG90LiAqLworCVNLX0JPT0wJCQlSb290SWRTZXQ7CisJU0tfUkxNVF9ST09UX0lECVJvb3Q7CQkJCQkvKiBSb290IEJyaWRnZSBJZC4gKi8KK30gU0tfUkxNVF9QT1JUOworCisKK3N0cnVjdCBzX1JsbXROZXQgeworCisvKiAtLS0tLSBQdWJsaWMgcGFydCAocmVhZC1vbmx5KSAtLS0tLSAqLworCisJU0tfVTMyCQkJTmV0TnVtYmVyOwkJCS8qIE51bWJlciBvZiBuZXQuICovCisKKwlTS19STE1UX1BPUlQgKglQb3J0W1NLX01BWF9NQUNTXTsJLyogUG9ydHMgdGhhdCBiZWxvbmcgdG8gdGhpcyBuZXQuICovCisJU0tfVTMyCQkJTnVtUG9ydHM7CQkJLyogTnVtYmVyIG9mIHBvcnRzLiAqLworCVNLX1UzMgkJCVByZWZQb3J0OwkJCS8qIFByZWZlcnJlZCBwb3J0LiAqLworCisJLyogRm9yIFBOTUkgKi8KKworCVNLX1UzMgkJCUNoZ0JjUHJpbzsJCQkvKiBDaGFuZ2UgUHJpb3JpdHkgb2YgbGFzdCBicm9hZGNhc3QgcmVjZWl2ZWQgKi8KKwlTS19VMzIJCQlSbG10TW9kZTsJCQkvKiBDaGVjayAuLi4gKi8KKwlTS19VMzIJCQlBY3RpdmVQb3J0OwkJCS8qIEFjdGl2ZSBwb3J0LiAqLworCVNLX1UzMgkJCVByZWZlcmVuY2U7CQkvKiAweEZGRkZGRkZGOiBBdXRvbWF0aWMuICovCisKKwlTS19VOAkJCVJsbXRTdGF0ZTsJCQkvKiBDdXJyZW50IFJMTVQgc3RhdGUuICovCisKKy8qIC0tLS0tIFByaXZhdGUgcGFydCAtLS0tLSAqLworCVNLX0JPT0wJCQlSb290SWRTZXQ7CisJU0tfVTE2CQkJQWxpZ24wMTsKKworCWludAkJCQlMaW5rc1VwOwkJCS8qICNMaW5rcyB1cC4gKi8KKwlpbnQJCQkJUG9ydHNVcDsJCQkvKiAjUG9ydHMgdXAuICovCisJU0tfVTMyCQkJVGltZW91dFZhbHVlOwkJLyogUkxNVCB0aW1lb3V0IHZhbHVlLiAqLworCisJU0tfVTMyCQkJQ2hlY2tpbmdTdGF0ZTsJCS8qIENoZWNraW5nIFN0YXRlLiAqLworCVNLX1JMTVRfUk9PVF9JRAlSb290OwkJCQkvKiBSb290IEJyaWRnZSBJZC4gKi8KKworCVNLX1RJTUVSCQlMb2NUaW1lcjsJCQkvKiBUaW1lciBzdHJ1Y3QuICovCisJU0tfVElNRVIJCVNlZ1RpbWVyOwkJCS8qIFRpbWVyIHN0cnVjdC4gKi8KK307CisKKwordHlwZWRlZiBzdHJ1Y3Qgc19SbG10IHsKKworLyogLS0tLS0gUHVibGljIHBhcnQgKHJlYWQtb25seSkgLS0tLS0gKi8KKworCVNLX1UzMgkJCU51bU5ldHM7CQkJLyogTnVtYmVyIG9mIG5ldHMuICovCisJU0tfVTMyCQkJTmV0c1N0YXJ0ZWQ7CQkvKiBOdW1iZXIgb2YgbmV0cyBzdGFydGVkLiAqLworCVNLX1JMTVRfTkVUCQlOZXRbU0tfTUFYX05FVFNdOwkvKiBBcnJheSBvZiBhdmFpbGFibGUgbmV0cy4gKi8KKwlTS19STE1UX1BPUlQJUG9ydFtTS19NQVhfTUFDU107CS8qIEFycmF5IG9mIGF2YWlsYWJsZSBwb3J0cy4gKi8KKworLyogLS0tLS0gUHJpdmF0ZSBwYXJ0IC0tLS0tICovCisJU0tfQk9PTAkJCUNoZWNrU3dpdGNoOworCVNLX0JPT0wJCQlSbG10T2ZmOyAgICAgICAgICAgIC8qIHNldCB0byB6ZXJvIGlmIHRoZSBNYWMgYWRkcmVzc2VzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBlcXVhbCBvciB0aGUgc2Vjb25kIG9uZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB6ZXJvICovCisJU0tfVTE2CQkJQWxpZ24wMTsKKworfSBTS19STE1UOworCisKK2V4dGVybglTS19NQUNfQUREUglCcmlkZ2VNY0FkZHI7CitleHRlcm4JU0tfTUFDX0FERFIJU2tSbG10TWNBZGRyOworCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgU0tfS1JfUFJPVE8KKworLyogRnVuY3Rpb25zIHByb3ZpZGVkIGJ5IFNrUmxtdCAqLworCisvKiBBTlNJL0MrKyBjb21wbGlhbnQgZnVuY3Rpb24gcHJvdG90eXBlcyAqLworCitleHRlcm4Jdm9pZAlTa1JsbXRJbml0KAorCVNLX0FDCSpwQUMsCisJU0tfSU9DCUlvQywKKwlpbnQJCUxldmVsKTsKKworZXh0ZXJuCWludAlTa1JsbXRFdmVudCgKKwlTS19BQwkJKnBBQywKKwlTS19JT0MJCUlvQywKKwlTS19VMzIJCUV2ZW50LAorCVNLX0VWUEFSQQlQYXJhKTsKKworI2Vsc2UJLyogZGVmaW5lZChTS19LUl9QUk9UTykgKi8KKworLyogTm9uLUFOU0kvQysrIGNvbXBsaWFudCBmdW5jdGlvbiBwcm90b3R5cGVzICovCisKKyNlcnJvciBLUi1zdHlsZSBmdW5jdGlvbiBwcm90b3R5cGVzIGFyZSBub3QgeWV0IHByb3ZpZGVkLgorCisjZW5kaWYJLyogZGVmaW5lZChTS19LUl9QUk9UTykpICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYJLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCS8qIF9fSU5DX1NLUkxNVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2t0aW1lci5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGU2ZDdjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrdGltZXIuaApAQCAtMCwwICsxLDYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2t0aW1lci5oCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBFdmVudCBTY2hlZHVsZXIgTW9kdWxlCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMTEgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDkvMTYgMTI6NTg6MTggJAorICogUHVycG9zZToJRGVmaW5lcyBmb3IgdGhlIHRpbWVyIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBTS1RJTUVSLkgJY29udGFpbnMgYWxsIGRlZmluZXMgYW5kIHR5cGVzIGZvciB0aGUgdGltZXIgZnVuY3Rpb25zCisgKi8KKworI2lmbmRlZglfU0tUSU1FUl9IXworI2RlZmluZSBfU0tUSU1FUl9IXworCisjaW5jbHVkZSAiaC9za3F1ZXVlLmgiCisKKy8qCisgKiBTSyB0aW1lcgorICogLSBuZWVkZWQgd2hlcmV2ZXIgYSB0aW1lciBpcyB1c2VkLiBQdXQgdGhpcyBpbiB5b3VyIGRhdGEgc3RydWN0dXJlCisgKiAgIHdoZXJldmVyIHlvdSB3YW50LgorICovCit0eXBlZGVmCXN0cnVjdCBzX1RpbWVyIFNLX1RJTUVSOworCitzdHJ1Y3Qgc19UaW1lciB7CisJU0tfVElNRVIJKlRtTmV4dDsJLyogbGlua2VkIGxpc3QgKi8KKwlTS19VMzIJCVRtQ2xhc3M7CS8qIFRpbWVyIEV2ZW50IGNsYXNzICovCisJU0tfVTMyCQlUbUV2ZW50OwkvKiBUaW1lciBFdmVudCB2YWx1ZSAqLworCVNLX0VWUEFSQQlUbVBhcmE7CQkvKiBUaW1lciBFdmVudCBwYXJhbWV0ZXIgKi8KKwlTS19VMzIJCVRtRGVsdGE7CS8qIGRlbHRhIHRpbWUgKi8KKwlpbnQJCQlUbUFjdGl2ZTsJLyogZmxhZzogYWN0aXZlL2luYWN0aXZlICovCit9OworCisvKgorICogVGltZXIgY29udHJvbCBzdHJ1Y3QuCisgKiAtIHVzZSBpbiBBZGFwdGVycyBjb250ZXh0IG5hbWUgcEFDLT5UaW0KKyAqLwordHlwZWRlZglzdHJ1Y3Qgc19UaW1DdHJsIHsKKwlTS19USU1FUgkqU3RRdWV1ZTsJLyogSGVhZCBvZiBUaW1lciBxdWV1ZSAqLworfSBTS19USU1DVFJMOworCitleHRlcm4gdm9pZCBTa1RpbWVySW5pdChTS19BQyAqcEFDLCBTS19JT0MgSW9jLCBpbnQgTGV2ZWwpOworZXh0ZXJuIHZvaWQgU2tUaW1lclN0b3AoU0tfQUMgKnBBQywgU0tfSU9DIElvYywgU0tfVElNRVIgKnBUaW1lcik7CitleHRlcm4gdm9pZCBTa1RpbWVyU3RhcnQoU0tfQUMgKnBBQywgU0tfSU9DIElvYywgU0tfVElNRVIgKnBUaW1lciwKKwlTS19VMzIgVGltZSwgU0tfVTMyIENsYXNzLCBTS19VMzIgRXZlbnQsIFNLX0VWUEFSQSBQYXJhKTsKK2V4dGVybiB2b2lkIFNrVGltZXJEb25lKFNLX0FDICpwQUMsIFNLX0lPQyBJb2MpOworI2VuZGlmCS8qIF9TS1RJTUVSX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2t0eXBlcy5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGVkYzk2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrdHlwZXMuaApAQCAtMCwwICsxLDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2t0eXBlcy5oCisgKiBQcm9qZWN0OglHRW5lc2lzLCBQQ0kgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMiAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8xMC8wNyAwODoxNjo1MSAkCisgKiBQdXJwb3NlOglEZWZpbmUgZGF0YSB0eXBlcyBmb3IgTGludXgKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIEluIHRoaXMgZmlsZSwgYWxsIGRhdGEgdHlwZXMgdGhhdCBhcmUgbmVlZGVkIGJ5IHRoZSBjb21tb24gbW9kdWxlcworICogYXJlIG1hcHBlZCB0byBMaW51eCBkYXRhIHR5cGVzLgorICogCisgKgorICogSW5jbHVkZSBGaWxlIEhpZXJhcmNoeToKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0lOQ19TS1RZUEVTX0gKKyNkZWZpbmUgX19JTkNfU0tUWVBFU19ICisKKworLyogZGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogRGF0YSB0eXBlcyB3aXRoIGEgc3BlY2lmaWMgc2l6ZS4gJ0knID0gc2lnbmVkLCAnVScgPSB1bnNpZ25lZC4KKyAqLworI2RlZmluZSBTS19JOAlzOAorI2RlZmluZSBTS19VOAl1OAorI2RlZmluZSBTS19JMTYJczE2CisjZGVmaW5lIFNLX1UxNgl1MTYKKyNkZWZpbmUgU0tfSTMyCXMzMgorI2RlZmluZSBTS19VMzIJdTMyCisjZGVmaW5lIFNLX0k2NAlzNjQKKyNkZWZpbmUgU0tfVTY0CXU2NAorCisjZGVmaW5lIFNLX1VQVFIJdWxvbmcJCS8qIGNhc3RpbmcgcG9pbnRlciA8LT4gaW50ZWdyYWwgKi8KKworLyoKKyogQm9vbGVhbiB0eXBlLgorKi8KKyNkZWZpbmUgU0tfQk9PTAkJU0tfVTgKKyNkZWZpbmUgU0tfRkFMU0UJMAorI2RlZmluZSBTS19UUlVFCQkoIVNLX0ZBTFNFKQorCisvKiB0eXBlZGVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYJLyogX19JTkNfU0tUWVBFU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL2gvc2t2ZXJzaW9uLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2t2ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhNzI5NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za3ZlcnNpb24uaApAQCAtMCwwICsxLDM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJdmVyc2lvbi5oCisgKiBQcm9qZWN0OglHRW5lc2lzLCBQQ0kgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuNSAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8xMC8wNyAwODoxNjo1MSAkCisgKiBQdXJwb3NlOglTSyBzcGVjaWZpYyBFcnJvciBsb2cgc3VwcG9ydAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZglsaW50CitzdGF0aWMgY29uc3QgY2hhciBTeXNLb25uZWN0RmlsZUlkW10gPSAiQCgjKSAoQykgU3lzS29ubmVjdCBHbWJILiI7CitzdGF0aWMgY29uc3QgY2hhciBTeXNLb25uZWN0QnVpbGROdW1iZXJbXSA9CisJIkAoIylTSy1CVUlMRDogNi4yMyBQTDogMDEiOyAKKyNlbmRpZgkvKiAhZGVmaW5lZChsaW50KSAqLworCisjZGVmaW5lIEJPT1RfU1RSSU5HCSJzazk4bGluOiBOZXR3b3JrIERldmljZSBEcml2ZXIgdjYuMjNcbiIgXAorCQkJIihDKUNvcHlyaWdodCAxOTk5LTIwMDQgTWFydmVsbChSKS4iCisKKyNkZWZpbmUgVkVSX1NUUklORwkiNi4yMyIKKyNkZWZpbmUgRFJJVkVSX0ZJTEVfTkFNRQkic2s5OGxpbiIKKyNkZWZpbmUgRFJJVkVSX1JFTF9EQVRFCQkiRmViLTEzLTIwMDQiCisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrdnBkLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2t2cGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGMxYTVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrdnBkLmgKQEAgLTAsMCArMSwyNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza3ZwZC5oCisgKiBQcm9qZWN0OglHRW5lc2lzLCBQQ0kgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMTUgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDEvMTMgMTA6Mzk6MzggJAorICogUHVycG9zZToJRGVmaW5lcyBhbmQgTWFjcm9zIGZvciBWUEQgaGFuZGxpbmcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMyBTeXNLb25uZWN0IEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogc2t2cGQuaAljb250YWlucyBEaWFnbm9zdGljIHNwZWNpZmljIGRlZmluZXMgZm9yIFZQRCBoYW5kbGluZworICovCisKKyNpZm5kZWYgX19JTkNfU0tWUERfSF8KKyNkZWZpbmUgX19JTkNfU0tWUERfSF8KKworLyoKKyAqIERlZmluZSBSZXNvdXJjZSBUeXBlIElkZW50aWZpZXJzIGFuZCBWUEQga2V5d29yZHMKKyAqLworI2RlZmluZQlSRVNfSUQJCTB4ODIJLyogUmVzb3VyY2UgVHlwZSBJRCBTdHJpbmcgKFByb2R1Y3QgTmFtZSkgKi8KKyNkZWZpbmUgUkVTX1ZQRF9SCTB4OTAJLyogc3RhcnQgb2YgVlBEIHJlYWQgb25seSBhcmVhICovCisjZGVmaW5lIFJFU19WUERfVwkweDkxCS8qIHN0YXJ0IG9mIFZQRCByZWFkL3dyaXRlIGFyZWEgKi8KKyNkZWZpbmUgUkVTX0VORAkJMHg3OAkvKiBSZXNvdXJjZSBUeXBlIEVuZCBUYWcgKi8KKworI2lmbmRlZiBWUERfTkFNRQorI2RlZmluZSBWUERfTkFNRQkiTmFtZSIJLyogUHJvZHVjdCBOYW1lLCBWUEQgbmFtZSBvZiBSRVNfSUQgKi8KKyNlbmRpZgkvKiBWUERfTkFNRSAqLworI2RlZmluZSBWUERfUE4JCSJQTiIJLyogQWRhcHRlciBQYXJ0IE51bWJlciAqLworI2RlZmluZQlWUERfRUMJCSJFQyIJLyogQWRhcHRlciBFbmdpbmVlcmluZyBMZXZlbCAqLworI2RlZmluZSBWUERfTU4JCSJNTiIJLyogTWFudWZhY3R1cmUgSUQgKi8KKyNkZWZpbmUgVlBEX1NOCQkiU04iCS8qIFNlcmlhbCBOdW1iZXIgKi8KKyNkZWZpbmUgVlBEX0NQCQkiQ1AiCS8qIEV4dGVuZGVkIENhcGFiaWxpdHkgKi8KKyNkZWZpbmUgVlBEX1JWCQkiUlYiCS8qIENoZWNrc3VtIGFuZCBSZXNlcnZlZCAqLworI2RlZmluZQlWUERfWUEJCSJZQSIJLyogQXNzZXQgVGFnIElkZW50aWZpZXIgKi8KKyNkZWZpbmUgVlBEX1ZMCQkiVkwiCS8qIEZpcnN0IEVycm9yIExvZyBNZXNzYWdlIChTSyBzcGVjaWZpYykgKi8KKyNkZWZpbmUgVlBEX1ZGCQkiVkYiCS8qIFNlY29uZCBFcnJvciBMb2cgTWVzc2FnZSAoU0sgc3BlY2lmaWMpICovCisjZGVmaW5lIFZQRF9SVwkJIlJXIgkvKiBSZW1haW5pbmcgUmVhZCAvIFdyaXRlIEFyZWEgKi8KKworLyogJ3R5cGUnIHZhbHVlcyBmb3IgdnBkX3NldHVwX3BhcmEoKSAqLworI2RlZmluZSBWUERfUk9fS0VZCTEJLyogUk8ga2V5cyBhcmUgIlBOIiwgIkVDIiwgIk1OIiwgIlNOIiwgIlJWIiAqLworI2RlZmluZSBWUERfUldfS0VZCTIJLyogUlcga2V5cyBhcmUgIll4IiwgIlZ4IiwgYW5kICJSVyIgKi8KKworLyogJ29wJyB2YWx1ZXMgZm9yIHZwZF9zZXR1cF9wYXJhKCkgKi8KKyNkZWZpbmUJQUREX0tFWQkJMQkvKiBhZGQgdGhlIGtleSBhdCB0aGUgcG9zICJSViIgb3IgIlJXIiAqLworI2RlZmluZSBPV1JfS0VZCQkyCS8qIG92ZXJ3cml0ZSBrZXkgaWYgYWxyZWFkeSBleGlzdHMgKi8KKworLyoKKyAqIERlZmluZSBSRUFEIGFuZCBXUklURSBDb25zdGFudHMuCisgKi8KKworI2RlZmluZSBWUERfREVWX0lEX0dFTkVTSVMgCTB4NDMwMAorCisjZGVmaW5lCVZQRF9TSVpFX1lVS09OCQkyNTYKKyNkZWZpbmUJVlBEX1NJWkVfR0VORVNJUwk1MTIKKyNkZWZpbmUJVlBEX1NJWkUJCQk1MTIKKyNkZWZpbmUgVlBEX1JFQUQJMHgwMDAwCisjZGVmaW5lIFZQRF9XUklURQkweDgwMDAKKworI2RlZmluZSBWUERfU1RPUChwQUMsSW9DKQlWUERfT1VUMTYocEFDLElvQyxQQ0lfVlBEX0FEUl9SRUcsVlBEX1dSSVRFKQorCisjZGVmaW5lIFZQRF9HRVRfUkVTX0xFTihwKQkoKHVuc2lnbmVkIGludCkgXAorCQkJCQkoKiAoU0tfVTggKikmKHApWzFdKSB8XAorCQkJCQkoKCogKFNLX1U4ICopJihwKVsyXSkgPDwgOCkpCisjZGVmaW5lIFZQRF9HRVRfVlBEX0xFTihwKQkoKHVuc2lnbmVkIGludCkoKiAoU0tfVTggKikmKHApWzJdKSkKKyNkZWZpbmUgVlBEX0dFVF9WQUwocCkJCSgoY2hhciAqKSYocClbM10pCisKKyNkZWZpbmUgVlBEX01BWF9MRU4JNTAKKworLyogVlBEIHN0YXR1cyAqLworCS8qIGJpdCA3Li4xIHJlc2VydmVkICovCisjZGVmaW5lIFZQRF9WQUxJRAkoMTw8MCkJLyogVlBEIGRhdGEgYnVmZmVyLCB2cGRfZnJlZV9ybywgKi8KKwkJCQkJCQkvKiBhbmQgdnBkX2ZyZWVfcncgdmFsaWQJICovCisKKy8qCisgKiBWUEQgc3RydWN0cworICovCit0eXBlZGVmCXN0cnVjdCBzX3ZwZF9zdGF0dXMgeworCXVuc2lnbmVkIHNob3J0CUFsaWduMDE7CQkJLyogQWxpZ25tZW50ICovCisJdW5zaWduZWQgc2hvcnQJdnBkX3N0YXR1czsJCQkvKiBWUEQgc3RhdHVzLCBkZXNjcmlwdGlvbiBzZWUgYWJvdmUgKi8KKwlpbnQJCQkJdnBkX2ZyZWVfcm87CQkvKiB1bnVzZWQgYnl0ZXMgaW4gcmVhZCBvbmx5IGFyZWEgKi8KKwlpbnQJCQkJdnBkX2ZyZWVfcnc7CQkvKiBieXRlcyBhdmFpbGFibGUgaW4gcmVhZC93cml0ZSBhcmVhICovCit9IFNLX1ZQRF9TVEFUVVM7CisKK3R5cGVkZWYJc3RydWN0IHNfdnBkIHsKKwlTS19WUERfU1RBVFVTCXY7CQkJCQkvKiBWUEQgc3RhdHVzIHN0cnVjdHVyZSAqLworCWNoYXIJCQl2cGRfYnVmW1ZQRF9TSVpFXTsJLyogVlBEIGJ1ZmZlciAqLworCWludAkJCQlyb21fc2l6ZTsJCQkvKiBWUEQgUk9NIFNpemUgZnJvbSBQQ0lfT1VSX1JFR18yICovCisJaW50CQkJCXZwZF9zaXplOwkJCS8qIHNhdmVkIFZQRC1zaXplICovCit9IFNLX1ZQRDsKKwordHlwZWRlZglzdHJ1Y3Qgc192cGRfcGFyYSB7CisJdW5zaWduZWQgaW50CXBfbGVuOwkvKiBwYXJhbWV0ZXIgbGVuZ3RoICovCisJY2hhcgkJCSpwX3ZhbDsJLyogcG9pbnRzIHRvIHRoZSB2YWx1ZSAqLworfSBTS19WUERfUEFSQTsKKworLyoKKyAqIHN0cnVjdHVyZSBvZiBMYXJnZSBSZXNvdXJjZSBUeXBlIElkZW50aWZpZXJzCisgKi8KKworLyogd2FzIHJlbW92ZWQgYmVjYXVzZSBvZiBhbGlnbm1lbnQgcHJvYmxlbXMgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBvZiBWUEQga2V5d29yZHMKKyAqLwordHlwZWRlZglzdHJ1Y3Qgc192cGRfa2V5IHsKKwljaGFyCQkJcF9rZXlbMl07CS8qIDIgYnl0ZXMgSUQgc3RyaW5nICovCisJdW5zaWduZWQgY2hhcglwX2xlbjsJCS8qIDEgYnl0ZSBsZW5ndGggKi8KKwljaGFyCQkJcF92YWw7CQkvKiBzdGFydCBvZiB0aGUgdmFsdWUgc3RyaW5nICovCit9IFNLX1ZQRF9LRVk7CisKKworLyoKKyAqIFN5c3RlbSBzcGVjaWZpYyBWUEQgbWFjcm9zCisgKi8KKyNpZm5kZWYgU0tESUFHCisjaWZuZGVmIFZQRF9ET19JTworI2RlZmluZSBWUERfT1VUOChwQUMsSW9DLEFkZHIsVmFsKQkodm9pZClTa1BjaVdyaXRlQ2ZnQnl0ZShwQUMsQWRkcixWYWwpCisjZGVmaW5lIFZQRF9PVVQxNihwQUMsSW9DLEFkZHIsVmFsKQkodm9pZClTa1BjaVdyaXRlQ2ZnV29yZChwQUMsQWRkcixWYWwpCisjZGVmaW5lIFZQRF9PVVQzMihwQUMsSW9DLEFkZHIsVmFsKQkodm9pZClTa1BjaVdyaXRlQ2ZnRFdvcmQocEFDLEFkZHIsVmFsKQorI2RlZmluZSBWUERfSU44KHBBQyxJb0MsQWRkcixwVmFsKQkodm9pZClTa1BjaVJlYWRDZmdCeXRlKHBBQyxBZGRyLHBWYWwpCisjZGVmaW5lIFZQRF9JTjE2KHBBQyxJb0MsQWRkcixwVmFsKQkodm9pZClTa1BjaVJlYWRDZmdXb3JkKHBBQyxBZGRyLHBWYWwpCisjZGVmaW5lIFZQRF9JTjMyKHBBQyxJb0MsQWRkcixwVmFsKQkodm9pZClTa1BjaVJlYWRDZmdEV29yZChwQUMsQWRkcixwVmFsKQorI2Vsc2UJLyogVlBEX0RPX0lPICovCisjZGVmaW5lIFZQRF9PVVQ4KHBBQyxJb0MsQWRkcixWYWwpCVNLX09VVDgoSW9DLFBDSV9DKEFkZHIpLFZhbCkKKyNkZWZpbmUgVlBEX09VVDE2KHBBQyxJb0MsQWRkcixWYWwpCVNLX09VVDE2KElvQyxQQ0lfQyhBZGRyKSxWYWwpCisjZGVmaW5lIFZQRF9PVVQzMihwQUMsSW9DLEFkZHIsVmFsKQlTS19PVVQzMihJb0MsUENJX0MoQWRkciksVmFsKQorI2RlZmluZSBWUERfSU44KHBBQyxJb0MsQWRkcixwVmFsKQlTS19JTjgoSW9DLFBDSV9DKEFkZHIpLHBWYWwpCisjZGVmaW5lIFZQRF9JTjE2KHBBQyxJb0MsQWRkcixwVmFsKQlTS19JTjE2KElvQyxQQ0lfQyhBZGRyKSxwVmFsKQorI2RlZmluZSBWUERfSU4zMihwQUMsSW9DLEFkZHIscFZhbCkJU0tfSU4zMihJb0MsUENJX0MoQWRkcikscFZhbCkKKyNlbmRpZgkvKiBWUERfRE9fSU8gKi8KKyNlbHNlCS8qIFNLRElBRyAqLworI2RlZmluZSBWUERfT1VUOChwQUMsSW9jLEFkZHIsVmFsKSB7CQkJXAorCQlpZiAoKHBBQyktPkRnVC5EZ1VzZUNmZ0N5Y2xlKQkJCVwKKwkJCVNrUGNpV3JpdGVDZmdCeXRlKHBBQyxBZGRyLFZhbCk7CVwKKwkJZWxzZQkJCQkJCQkJCVwKKwkJCVNLX09VVDgocEFDLFBDSV9DKEFkZHIpLFZhbCk7CQlcCisJCX0KKyNkZWZpbmUgVlBEX09VVDE2KHBBQyxJb2MsQWRkcixWYWwpIHsJCQlcCisJCWlmICgocEFDKS0+RGdULkRnVXNlQ2ZnQ3ljbGUpCQkJXAorCQkJU2tQY2lXcml0ZUNmZ1dvcmQocEFDLEFkZHIsVmFsKTsJXAorCQllbHNlCQkJCQkJXAorCQkJU0tfT1VUMTYocEFDLFBDSV9DKEFkZHIpLFZhbCk7CQlcCisJCX0KKyNkZWZpbmUgVlBEX09VVDMyKHBBQyxJb2MsQWRkcixWYWwpIHsJCQlcCisJCWlmICgocEFDKS0+RGdULkRnVXNlQ2ZnQ3ljbGUpCQkJXAorCQkJU2tQY2lXcml0ZUNmZ0RXb3JkKHBBQyxBZGRyLFZhbCk7CVwKKwkJZWxzZQkJCQkJCVwKKwkJCVNLX09VVDMyKHBBQyxQQ0lfQyhBZGRyKSxWYWwpOyAJCVwKKwkJfQorI2RlZmluZSBWUERfSU44KHBBQyxJb2MsQWRkcixwVmFsKSB7CQkJXAorCQlpZiAoKHBBQyktPkRnVC5EZ1VzZUNmZ0N5Y2xlKSAJCQlcCisJCQlTa1BjaVJlYWRDZmdCeXRlKHBBQyxBZGRyLHBWYWwpOwlcCisJCWVsc2UJCQkJCQlcCisJCQlTS19JTjgocEFDLFBDSV9DKEFkZHIpLHBWYWwpOyAJCVwKKwkJfQorI2RlZmluZSBWUERfSU4xNihwQUMsSW9jLEFkZHIscFZhbCkgewkJCVwKKwkJaWYgKChwQUMpLT5EZ1QuRGdVc2VDZmdDeWNsZSkgCQkJXAorCQkJU2tQY2lSZWFkQ2ZnV29yZChwQUMsQWRkcixwVmFsKTsJXAorCQllbHNlCQkJCQkJXAorCQkJU0tfSU4xNihwQUMsUENJX0MoQWRkcikscFZhbCk7IAkJXAorCQl9CisjZGVmaW5lIFZQRF9JTjMyKHBBQyxJb2MsQWRkcixwVmFsKSB7CQkJXAorCQlpZiAoKHBBQyktPkRnVC5EZ1VzZUNmZ0N5Y2xlKQkJCVwKKwkJCVNrUGNpUmVhZENmZ0RXb3JkKHBBQyxBZGRyLHBWYWwpOwlcCisJCWVsc2UJCQkJCQlcCisJCQlTS19JTjMyKHBBQyxQQ0lfQyhBZGRyKSxwVmFsKTsJCVwKKwkJfQorI2VuZGlmCS8qIG5TS0RJQUcgKi8KKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZglTS19LUl9QUk9UTworI2lmZGVmIFNLRElBRworZXh0ZXJuIFNLX1UzMglWcGRSZWFkRFdvcmQoCisJU0tfQUMJCSpwQUMsCisJU0tfSU9DCQlJb0MsCisJaW50CQkJYWRkcik7CisjZW5kaWYJLyogU0tESUFHICovCisKK2V4dGVybiBpbnQJVnBkU2V0dXBQYXJhKAorCVNLX0FDCQkqcEFDLAorCWNvbnN0IGNoYXIJKmtleSwKKwljb25zdCBjaGFyCSpidWYsCisJaW50CQkJbGVuLAorCWludAkJCXR5cGUsCisJaW50CQkJb3ApOworCitleHRlcm4gU0tfVlBEX1NUQVRVUwkqVnBkU3RhdCgKKwlTS19BQwkJKnBBQywKKwlTS19JT0MJCUlvQyk7CisKK2V4dGVybiBpbnQJVnBkS2V5cygKKwlTS19BQwkJKnBBQywKKwlTS19JT0MJCUlvQywKKwljaGFyCQkqYnVmLAorCWludAkJCSpsZW4sCisJaW50CQkJKmVsZW1lbnRzKTsKKworZXh0ZXJuIGludAlWcGRSZWFkKAorCVNLX0FDCQkqcEFDLAorCVNLX0lPQwkJSW9DLAorCWNvbnN0IGNoYXIJKmtleSwKKwljaGFyCQkqYnVmLAorCWludAkJCSpsZW4pOworCitleHRlcm4gU0tfQk9PTAlWcGRNYXlXcml0ZSgKKwljaGFyCQkqa2V5KTsKKworZXh0ZXJuIGludAlWcGRXcml0ZSgKKwlTS19BQwkJKnBBQywKKwlTS19JT0MJCUlvQywKKwljb25zdCBjaGFyCSprZXksCisJY29uc3QgY2hhcgkqYnVmKTsKKworZXh0ZXJuIGludAlWcGREZWxldGUoCisJU0tfQUMJCSpwQUMsCisJU0tfSU9DCQlJb0MsCisJY2hhcgkJKmtleSk7CisKK2V4dGVybiBpbnQJVnBkVXBkYXRlKAorCVNLX0FDCQkqcEFDLAorCVNLX0lPQwkJSW9DKTsKKworZXh0ZXJuIHZvaWQJVnBkRXJyTG9nKAorCVNLX0FDCQkqcEFDLAorCVNLX0lPQwkJSW9DLAorCWNoYXIJCSptc2cpOworCisjaWZkZWYJU0tESUFHCitleHRlcm4gaW50CVZwZFJlYWRCbG9jaygKKwlTS19BQwkJKnBBQywKKwlTS19JT0MJCUlvQywKKwljaGFyCQkqYnVmLAorCWludAkJCWFkZHIsCisJaW50CQkJbGVuKTsKKworZXh0ZXJuIGludAlWcGRXcml0ZUJsb2NrKAorCVNLX0FDCQkqcEFDLAorCVNLX0lPQwkJSW9DLAorCWNoYXIJCSpidWYsCisJaW50CQkJYWRkciwKKwlpbnQJCQlsZW4pOworI2VuZGlmCS8qIFNLRElBRyAqLworI2Vsc2UJLyogU0tfS1JfUFJPVE8gKi8KK2V4dGVybiBTS19VMzIJVnBkUmVhZERXb3JkKCk7CitleHRlcm4gaW50CVZwZFNldHVwUGFyYSgpOworZXh0ZXJuIFNLX1ZQRF9TVEFUVVMJKlZwZFN0YXQoKTsKK2V4dGVybiBpbnQJVnBkS2V5cygpOworZXh0ZXJuIGludAlWcGRSZWFkKCk7CitleHRlcm4gU0tfQk9PTAlWcGRNYXlXcml0ZSgpOworZXh0ZXJuIGludAlWcGRXcml0ZSgpOworZXh0ZXJuIGludAlWcGREZWxldGUoKTsKK2V4dGVybiBpbnQJVnBkVXBkYXRlKCk7CitleHRlcm4gdm9pZAlWcGRFcnJMb2coKTsKKyNlbmRpZgkvKiBTS19LUl9QUk9UTyAqLworCisjZW5kaWYJLyogX19JTkNfU0tWUERfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC94bWFjX2lpLmggYi9kcml2ZXJzL25ldC9zazk4bGluL2gveG1hY19paS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMTlmOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL2gveG1hY19paS5oCkBAIC0wLDAgKzEsMTU3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXhtYWNfaWkuaAorICogUHJvamVjdDoJR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVycywgQ29tbW9uIE1vZHVsZXMKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS41MiAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8xMC8wMiAxNjozNTo1MCAkCisgKiBQdXJwb3NlOglEZWZpbmVzIGFuZCBNYWNyb3MgZm9yIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QuCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fSU5DX1hNQUNfSAorI2RlZmluZSBfX0lOQ19YTUFDX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgkvKiBfX2NwbHVzcGx1cyAqLworCisvKiBkZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogWE1BQyBJSSByZWdpc3RlcnMKKyAqCisgKiBUaGUgWE1BQyByZWdpc3RlcnMgYXJlIDE2IG9yIDMyIGJpdHMgd2lkZS4KKyAqIFRoZSBYTUFDcyBob3N0IHByb2Nlc3NvciBpbnRlcmZhY2UgaXMgc2V0IHRvIDE2IGJpdCBtb2RlLAorICogdGhlcmVmb3JlIEFMTCByZWdpc3RlcnMgd2lsbCBiZSBhZGRyZXNzZWQgd2l0aCAxNiBiaXQgYWNjZXNzZXMuCisgKgorICogVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIHByb3ZpZGVkIHRvIGFjY2VzcyB0aGUgWE1BQyByZWdpc3RlcnMKKyAqIFhNX0lOMTYoKSwgWE1fT1VUMTYsIFhNX0lOMzIoKSwgWE1fT1VUMzIoKSwgWE1fSU5BRFIoKSwgWE1fT1VUQURSKCksCisgKiBYTV9JTkhBU0goKSwgYW5kIFhNX09VVEhBU0goKS4KKyAqIFRoZSBtYWNyb3MgYXJlIGRlZmluZWQgaW4gU2tHZUh3LmguCisgKgorICogTm90ZToJTkEgcmVnCT0gTmV0d29yayBBZGRyZXNzIGUuZyBEQSwgU0EgZXRjLgorICoKKyAqLworI2RlZmluZSBYTV9NTVVfQ01ECQkweDAwMDAJLyogMTYgYml0IHIvdwlNTVUgQ29tbWFuZCBSZWdpc3RlciAqLworCS8qIDB4MDAwNDoJCXJlc2VydmVkICovCisjZGVmaW5lIFhNX1BPRkYJCQkweDAwMDgJLyogMzIgYml0IHIvdwlQYWNrZXQgT2Zmc2V0IFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX0JVUlNUCQkweDAwMGMJLyogMzIgYml0IHIvdwlCdXJzdCBSZWdpc3RlciBmb3IgaGFsZiBkdXBsZXgqLworI2RlZmluZSBYTV8xTF9WTEFOX1RBRwkweDAwMTAJLyogMTYgYml0IHIvdwlPbmUgTGV2ZWwgVkxBTiBUYWcgSUQgKi8KKyNkZWZpbmUgWE1fMkxfVkxBTl9UQUcJMHgwMDE0CS8qIDE2IGJpdCByL3cJVHdvIExldmVsIFZMQU4gVGFnIElEICovCisJLyogMHgwMDE4IC0gMHgwMDFlOglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9UWF9DTUQJCTB4MDAyMAkvKiAxNiBiaXQgci93CVRyYW5zbWl0IENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1fVFhfUlRfTElNCTB4MDAyNAkvKiAxNiBiaXQgci93CVRyYW5zbWl0IFJldHJ5IExpbWl0IFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX1RYX1NUSU1FCQkweDAwMjgJLyogMTYgYml0IHIvdwlUcmFuc21pdCBTbG90dGltZSBSZWdpc3RlciAqLworI2RlZmluZSBYTV9UWF9JUEcJCTB4MDAyYwkvKiAxNiBiaXQgci93CVRyYW5zbWl0IEludGVyIFBhY2tldCBHYXAgKi8KKyNkZWZpbmUgWE1fUlhfQ01ECQkweDAwMzAJLyogMTYgYml0IHIvdwlSZWNlaXZlIENvbW1hbmQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1fUEhZX0FERFIJCTB4MDAzNAkvKiAxNiBiaXQgci93CVBIWSBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX1BIWV9EQVRBCQkweDAwMzgJLyogMTYgYml0IHIvdwlQSFkgRGF0YSBSZWdpc3RlciAqLworCS8qIDB4MDAzYzogCQlyZXNlcnZlZCAqLworI2RlZmluZSBYTV9HUF9QT1JUCQkweDAwNDAJLyogMzIgYml0IHIvdwlHZW5lcmFsIFB1cnBvc2UgUG9ydCBSZWdpc3RlciAqLworI2RlZmluZSBYTV9JTVNLCQkJMHgwMDQ0CS8qIDE2IGJpdCByL3cJSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1fSVNSQwkJCTB4MDA0OAkvKiAxNiBiaXQgci9vCUludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1fSFdfQ0ZHCQkweDAwNGMJLyogMTYgYml0IHIvdwlIYXJkd2FyZSBDb25maWcgUmVnaXN0ZXIgKi8KKwkvKiAweDAwNTAgLSAweDAwNWU6CXJlc2VydmVkICovCisjZGVmaW5lIFhNX1RYX0xPX1dNCQkweDAwNjAJLyogMTYgYml0IHIvdwlUeCBGSUZPIExvdyBXYXRlciBNYXJrICovCisjZGVmaW5lIFhNX1RYX0hJX1dNCQkweDAwNjIJLyogMTYgYml0IHIvdwlUeCBGSUZPIEhpZ2ggV2F0ZXIgTWFyayAqLworI2RlZmluZSBYTV9UWF9USFIJCTB4MDA2NAkvKiAxNiBiaXQgci93CVR4IFJlcXVlc3QgVGhyZXNob2xkICovCisjZGVmaW5lIFhNX0hUX1RIUgkJMHgwMDY2CS8qIDE2IGJpdCByL3cJSG9zdCBSZXF1ZXN0IFRocmVzaG9sZCAqLworI2RlZmluZSBYTV9QQVVTRV9EQQkJMHgwMDY4CS8qIE5BIHJlZyByL3cJUGF1c2UgRGVzdGluYXRpb24gQWRkcmVzcyAqLworCS8qIDB4MDA2ZTogCQlyZXNlcnZlZCAqLworI2RlZmluZSBYTV9DVExfUEFSQQkJMHgwMDcwCS8qIDMyIGJpdCByL3cJQ29udHJvbCBQYXJhbWV0ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1fTUFDX09QQ09ERQkweDAwNzQJLyogMTYgYml0IHIvdwlPcGNvZGUgZm9yIE1BQyBjb250cm9sIGZyYW1lcyAqLworI2RlZmluZSBYTV9NQUNfUFRJTUUJMHgwMDc2CS8qIDE2IGJpdCByL3cJUGF1c2UgdGltZSBmb3IgTUFDIGN0cmwgZnJhbWVzKi8KKyNkZWZpbmUgWE1fVFhfU1RBVAkJMHgwMDc4CS8qIDMyIGJpdCByL28JVHggU3RhdHVzIExJRk8gUmVnaXN0ZXIgKi8KKworCS8qIDB4MDA4MCAtIDB4MDBmYzoJMTYgTkEgcmVnIHIvdwlFeGFjdCBNYXRjaCBBZGRyZXNzIFJlZ2lzdGVycyAqLworCS8qIAkJCQl1c2UgdGhlIFhNX0VYTSgpIG1hY3JvIHRvIGFkZHJlc3MgKi8KKyNkZWZpbmUgWE1fRVhNX1NUQVJUCTB4MDA4MAkvKiByL3cJU3RhcnQgQWRkcmVzcyBvZiB0aGUgRVhNIFJlZ3MgKi8KKworCS8qCisJICogWE1fRVhNKFJlZykKKwkgKgorCSAqIHJldHVybnMgdGhlIFhNQUMgYWRkcmVzcyBvZmZzZXQgb2Ygc3BlY2lmaWVkIEV4YWN0IE1hdGNoIEFkZHIgUmVnCisJICoKKwkgKiBwYXJhOglSZWcJRVhNIHJlZ2lzdGVyIHRvIGFkZHIJKDAgLi4gMTUpCisJICoKKwkgKiB1c2FnZToJWE1fSU5BRERSKElvQywgTUFDXzEsIFhNX0VYTShpKSwgJnZhbFtpXSk7CisJICovCisjZGVmaW5lIFhNX0VYTShSZWcpCShYTV9FWE1fU1RBUlQgKyAoKFJlZykgPDwgMykpCisKKyNkZWZpbmUgWE1fU1JDX0NISwkJMHgwMTAwCS8qIE5BIHJlZyByL3cJU291cmNlIENoZWNrIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1fU0EJCQkweDAxMDgJLyogTkEgcmVnIHIvdwlTdGF0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWE1fSFNNCQkJMHgwMTEwCS8qIDY0IGJpdCByL3cJSGFzaCBNYXRjaCBBZGRyZXNzIFJlZ2lzdGVycyAqLworI2RlZmluZSBYTV9SWF9MT19XTQkJMHgwMTE4CS8qIDE2IGJpdCByL3cJUmVjZWl2ZSBMb3cgV2F0ZXIgTWFyayAqLworI2RlZmluZSBYTV9SWF9ISV9XTQkJMHgwMTFhCS8qIDE2IGJpdCByL3cJUmVjZWl2ZSBIaWdoIFdhdGVyIE1hcmsgKi8KKyNkZWZpbmUgWE1fUlhfVEhSCQkweDAxMWMJLyogMzIgYml0IHIvdwlSZWNlaXZlIFJlcXVlc3QgVGhyZXNob2xkICovCisjZGVmaW5lIFhNX0RFVl9JRAkJMHgwMTIwCS8qIDMyIGJpdCByL28JRGV2aWNlIElEIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX01PREUJCQkweDAxMjQJLyogMzIgYml0IHIvdwlNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX0xTQQkJCTB4MDEyOAkvKiBOQSByZWcgci9vCUxhc3QgU291cmNlIFJlZ2lzdGVyICovCisJLyogMHgwMTJlOgkJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fVFNfUkVBRAkJMHgwMTMwCS8qIDMyIGJpdCByL28JVGltZSBTdGFtcCBSZWFkIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX1RTX0xPQUQJCTB4MDEzNAkvKiAzMiBiaXQgci9vCVRpbWUgU3RhbXAgTG9hZCBWYWx1ZSAqLworCS8qIDB4MDEzOCAtIDB4MDFmZToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fU1RBVF9DTUQJMHgwMjAwCS8qIDE2IGJpdCByL3cJU3RhdGlzdGljcyBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX1JYX0NOVF9FVgkweDAyMDQJLyogMzIgYml0IHIvbwlSeCBDb3VudGVyIEV2ZW50IFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX1RYX0NOVF9FVgkweDAyMDgJLyogMzIgYml0IHIvbwlUeCBDb3VudGVyIEV2ZW50IFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX1JYX0VWX01TSwkweDAyMGMJLyogMzIgYml0IHIvdwlSeCBDb3VudGVyIEV2ZW50IE1hc2sgKi8KKyNkZWZpbmUgWE1fVFhfRVZfTVNLCTB4MDIxMAkvKiAzMiBiaXQgci93CVR4IENvdW50ZXIgRXZlbnQgTWFzayAqLworCS8qIDB4MDIwNCAtIDB4MDI3ZToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fVFhGX09LCQkweDAyODAJLyogMzIgYml0IHIvbwlGcmFtZXMgVHJhbnNtaXR0ZWQgT0sgQ29udXRlciAqLworI2RlZmluZSBYTV9UWE9fT0tfSEkJMHgwMjg0CS8qIDMyIGJpdCByL28JT2N0ZXRzIFRyYW5zbWl0dGVkIE9LIEhpZ2ggQ250Ki8KKyNkZWZpbmUgWE1fVFhPX09LX0xPCTB4MDI4OAkvKiAzMiBiaXQgci9vCU9jdGV0cyBUcmFuc21pdHRlZCBPSyBMb3cgQ250ICovCisjZGVmaW5lIFhNX1RYRl9CQ19PSwkweDAyOGMJLyogMzIgYml0IHIvbwlCcm9hZGNhc3QgRnJhbWVzIFhtaXR0ZWQgT0sgKi8KKyNkZWZpbmUgWE1fVFhGX01DX09LCTB4MDI5MAkvKiAzMiBiaXQgci9vCU11bHRpY2FzdCBGcmFtZXMgWG1pdHRlZCBPSyAqLworI2RlZmluZSBYTV9UWEZfVUNfT0sJMHgwMjk0CS8qIDMyIGJpdCByL28JVW5pY2FzdCBGcmFtZXMgWG1pdHRlZCBPSyAqLworI2RlZmluZSBYTV9UWEZfTE9ORwkJMHgwMjk4CS8qIDMyIGJpdCByL28JVHggTG9uZyBGcmFtZSBDb3VudGVyICovCisjZGVmaW5lIFhNX1RYRV9CVVJTVAkweDAyOWMJLyogMzIgYml0IHIvbwlUeCBCdXJzdCBFdmVudCBDb3VudGVyICovCisjZGVmaW5lIFhNX1RYRl9NUEFVU0UJMHgwMmEwCS8qIDMyIGJpdCByL28JVHggUGF1c2UgTUFDIEN0cmwgRnJhbWUgQ250ICovCisjZGVmaW5lIFhNX1RYRl9NQ1RSTAkweDAyYTQJLyogMzIgYml0IHIvbwlUeCBNQUMgQ3RybCBGcmFtZSBDb3VudGVyICovCisjZGVmaW5lIFhNX1RYRl9TTkdfQ09MCTB4MDJhOAkvKiAzMiBiaXQgci9vCVR4IFNpbmdsZSBDb2xsaXNpb24gQ291bnRlciAqLworI2RlZmluZSBYTV9UWEZfTVVMX0NPTAkweDAyYWMJLyogMzIgYml0IHIvbwlUeCBNdWx0aXBsZSBDb2xsaXNpb24gQ291bnRlciAqLworI2RlZmluZSBYTV9UWEZfQUJPX0NPTAkweDAyYjAJLyogMzIgYml0IHIvbwlUeCBhYm9ydGVkIGR1ZSB0byBFeGNlcy4gQ29sLiAqLworI2RlZmluZSBYTV9UWEZfTEFUX0NPTAkweDAyYjQJLyogMzIgYml0IHIvbwlUeCBMYXRlIENvbGxpc2lvbiBDb3VudGVyICovCisjZGVmaW5lIFhNX1RYRl9ERUYJCTB4MDJiOAkvKiAzMiBiaXQgci9vCVR4IERlZmVycmVkIEZyYW1lIENvdW50ZXIgKi8KKyNkZWZpbmUgWE1fVFhGX0VYX0RFRgkweDAyYmMJLyogMzIgYml0IHIvbwlUeCBFeGNlc3NpdmUgRGVmZXJhbGwgQ291bnRlciAqLworI2RlZmluZSBYTV9UWEVfRklGT19VUgkweDAyYzAJLyogMzIgYml0IHIvbwlUeCBGSUZPIFVuZGVycnVuIEV2ZW50IENudCAqLworI2RlZmluZSBYTV9UWEVfQ1NfRVJSCTB4MDJjNAkvKiAzMiBiaXQgci9vCVR4IENhcnJpZXIgU2Vuc2UgRXJyb3IgQ250ICovCisjZGVmaW5lIFhNX1RYUF9VVElMCQkweDAyYzgJLyogMzIgYml0IHIvbwlUeCBVdGlsaXphdGlvbiBpbiAlICovCisJLyogMHgwMmNjIC0gMHgwMmNlOglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9UWEZfNjRCCQkweDAyZDAJLyogMzIgYml0IHIvbwk2NCBCeXRlIFR4IEZyYW1lIENvdW50ZXIgKi8KKyNkZWZpbmUgWE1fVFhGXzEyN0IJCTB4MDJkNAkvKiAzMiBiaXQgci9vCTY1LTEyNyBCeXRlIFR4IEZyYW1lIENvdW50ZXIgKi8KKyNkZWZpbmUgWE1fVFhGXzI1NUIJCTB4MDJkOAkvKiAzMiBiaXQgci9vCTEyOC0yNTUgQnl0ZSBUeCBGcmFtZSBDb3VudGVyICovCisjZGVmaW5lIFhNX1RYRl81MTFCCQkweDAyZGMJLyogMzIgYml0IHIvbwkyNTYtNTExIEJ5dGUgVHggRnJhbWUgQ291bnRlciAqLworI2RlZmluZSBYTV9UWEZfMTAyM0IJMHgwMmUwCS8qIDMyIGJpdCByL28JNTEyLTEwMjMgQnl0ZSBUeCBGcmFtZSBDb3VudGVyKi8KKyNkZWZpbmUgWE1fVFhGX01BWF9TWgkweDAyZTQJLyogMzIgYml0IHIvbwkxMDI0LU1heFNpemUgQnl0ZSBUeCBGcmFtZSBDbnQqLworCS8qIDB4MDJlOCAtIDB4MDJmZToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fUlhGX09LCQkweDAzMDAJLyogMzIgYml0IHIvbwlGcmFtZXMgUmVjZWl2ZWQgT0sgKi8KKyNkZWZpbmUgWE1fUlhPX09LX0hJCTB4MDMwNAkvKiAzMiBiaXQgci9vCU9jdGV0cyBSZWNlaXZlZCBPSyBIaWdoIENudCAqLworI2RlZmluZSBYTV9SWE9fT0tfTE8JMHgwMzA4CS8qIDMyIGJpdCByL28JT2N0ZXRzIFJlY2VpdmVkIE9LIExvdyBDb3VudGVyKi8KKyNkZWZpbmUgWE1fUlhGX0JDX09LCTB4MDMwYwkvKiAzMiBiaXQgci9vCUJyb2FkY2FzdCBGcmFtZXMgUmVjZWl2ZWQgT0sgKi8KKyNkZWZpbmUgWE1fUlhGX01DX09LCTB4MDMxMAkvKiAzMiBiaXQgci9vCU11bHRpY2FzdCBGcmFtZXMgUmVjZWl2ZWQgT0sgKi8KKyNkZWZpbmUgWE1fUlhGX1VDX09LCTB4MDMxNAkvKiAzMiBiaXQgci9vCVVuaWNhc3QgRnJhbWVzIFJlY2VpdmVkIE9LICovCisjZGVmaW5lIFhNX1JYRl9NUEFVU0UJMHgwMzE4CS8qIDMyIGJpdCByL28JUnggUGF1c2UgTUFDIEN0cmwgRnJhbWUgQ250ICovCisjZGVmaW5lIFhNX1JYRl9NQ1RSTAkweDAzMWMJLyogMzIgYml0IHIvbwlSeCBNQUMgQ3RybCBGcmFtZSBDb3VudGVyICovCisjZGVmaW5lIFhNX1JYRl9JTlZfTVAJMHgwMzIwCS8qIDMyIGJpdCByL28JUnggaW52YWxpZCBQYXVzZSBGcmFtZSBDbnQgKi8KKyNkZWZpbmUgWE1fUlhGX0lOVl9NT0MJMHgwMzI0CS8qIDMyIGJpdCByL28JUnggRnJhbWVzIHdpdGggaW52LiBNQUMgT3Bjb2RlKi8KKyNkZWZpbmUgWE1fUlhFX0JVUlNUCTB4MDMyOAkvKiAzMiBiaXQgci9vCVJ4IEJ1cnN0IEV2ZW50IENvdW50ZXIgKi8KKyNkZWZpbmUgWE1fUlhFX0ZNSVNTCTB4MDMyYwkvKiAzMiBiaXQgci9vCVJ4IE1pc3NlZCBGcmFtZXMgRXZlbnQgQ250ICovCisjZGVmaW5lIFhNX1JYRl9GUkFfRVJSCTB4MDMzMAkvKiAzMiBiaXQgci9vCVJ4IEZyYW1pbmcgRXJyb3IgQ291bnRlciAqLworI2RlZmluZSBYTV9SWEVfRklGT19PVgkweDAzMzQJLyogMzIgYml0IHIvbwlSeCBGSUZPIG92ZXJmbG93IEV2ZW50IENudCAqLworI2RlZmluZSBYTV9SWEZfSkFCX1BLVAkweDAzMzgJLyogMzIgYml0IHIvbwlSeCBKYWJiZXIgUGFja2V0IEZyYW1lIENudCAqLworI2RlZmluZSBYTV9SWEVfQ0FSX0VSUgkweDAzM2MJLyogMzIgYml0IHIvbwlSeCBDYXJyaWVyIEV2ZW50IEVycm9yIENudCAqLworI2RlZmluZSBYTV9SWEZfTEVOX0VSUgkweDAzNDAJLyogMzIgYml0IHIvbwlSeCBpbiBSYW5nZSBMZW5ndGggRXJyb3IgKi8KKyNkZWZpbmUgWE1fUlhFX1NZTV9FUlIJMHgwMzQ0CS8qIDMyIGJpdCByL28JUnggU3ltYm9sIEVycm9yIENvdW50ZXIgKi8KKyNkZWZpbmUgWE1fUlhFX1NIVF9FUlIJMHgwMzQ4CS8qIDMyIGJpdCByL28JUnggU2hvcnQgRXZlbnQgRXJyb3IgQ250ICovCisjZGVmaW5lIFhNX1JYRV9SVU5UCQkweDAzNGMJLyogMzIgYml0IHIvbwlSeCBSdW50IEV2ZW50IENvdW50ZXIgKi8KKyNkZWZpbmUgWE1fUlhGX0xOR19FUlIJMHgwMzUwCS8qIDMyIGJpdCByL28JUnggRnJhbWUgdG9vIExvbmcgRXJyb3IgQ250ICovCisjZGVmaW5lIFhNX1JYRl9GQ1NfRVJSCTB4MDM1NAkvKiAzMiBiaXQgci9vCVJ4IEZyYW1lIENoZWNrIFNlcS4gRXJyb3IgQ250ICovCisJLyogMHgwMzU4IC0gMHgwMzVhOglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9SWEZfQ0VYX0VSUgkweDAzNWMJLyogMzIgYml0IHIvbwlSeCBDYXJyaWVyIEV4dCBFcnJvciBGcmFtZSBDbnQqLworI2RlZmluZSBYTV9SWFBfVVRJTAkJMHgwMzYwCS8qIDMyIGJpdCByL28JUnggVXRpbGl6YXRpb24gaW4gJSAqLworCS8qIDB4MDM2NCAtIDB4MDM2NjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fUlhGXzY0QgkJMHgwMzY4CS8qIDMyIGJpdCByL28JNjQgQnl0ZSBSeCBGcmFtZSBDb3VudGVyICovCisjZGVmaW5lIFhNX1JYRl8xMjdCCQkweDAzNmMJLyogMzIgYml0IHIvbwk2NS0xMjcgQnl0ZSBSeCBGcmFtZSBDb3VudGVyICovCisjZGVmaW5lIFhNX1JYRl8yNTVCCQkweDAzNzAJLyogMzIgYml0IHIvbwkxMjgtMjU1IEJ5dGUgUnggRnJhbWUgQ291bnRlciAqLworI2RlZmluZSBYTV9SWEZfNTExQgkJMHgwMzc0CS8qIDMyIGJpdCByL28JMjU2LTUxMSBCeXRlIFJ4IEZyYW1lIENvdW50ZXIgKi8KKyNkZWZpbmUgWE1fUlhGXzEwMjNCCTB4MDM3OAkvKiAzMiBiaXQgci9vCTUxMi0xMDIzIEJ5dGUgUnggRnJhbWUgQ291bnRlciovCisjZGVmaW5lIFhNX1JYRl9NQVhfU1oJMHgwMzdjCS8qIDMyIGJpdCByL28JMTAyNC1NYXhTaXplIEJ5dGUgUnggRnJhbWUgQ250Ki8KKwkvKiAweDAyZTggLSAweDAyZmU6CXJlc2VydmVkICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBYTUFDIEJpdCBEZWZpbml0aW9ucworICoKKyAqIElmIHRoZSBiaXQgYWNjZXNzIGJlaGF2aW91ciBkaWZmZXJzIGZyb20gdGhlIHJlZ2lzdGVyIGFjY2VzcyBiZWhhdmlvdXIKKyAqIChyL3csIHIvbykgdGhpcyBpcyBkb2N1bWVudGVkIGFmdGVyIHRoZSBiaXQgbnVtYmVyLgorICogVGhlIGZvbGxvd2luZyBiaXQgYWNjZXNzIGJlaGF2aW91cnMgYXJlIHVzZWQ6CisgKgkoc2MpCXNlbGYgY2xlYXJpbmcKKyAqCShybykJcmVhZCBvbmx5CisgKi8KKworLyoJWE1fTU1VX0NNRAkxNiBiaXQgci93CU1NVSBDb21tYW5kIFJlZ2lzdGVyICovCisJCQkJCQkJCS8qIEJpdCAxNS4uMTM6CXJlc2VydmVkICovCisjZGVmaW5lIFhNX01NVV9QSFlfUkRZCSgxPDwxMikJLyogQml0IDEyOglQSFkgUmVhZCBSZWFkeSAqLworI2RlZmluZSBYTV9NTVVfUEhZX0JVU1kJKDE8PDExKQkvKiBCaXQgMTE6CVBIWSBCdXN5ICovCisjZGVmaW5lIFhNX01NVV9JR05fUEYJKDE8PDEwKQkvKiBCaXQgMTA6CUlnbm9yZSBQYXVzZSBGcmFtZSAqLworI2RlZmluZSBYTV9NTVVfTUFDX0xCCSgxPDw5KQkvKiBCaXQgIDk6CUVuYWJsZSBNQUMgTG9vcGJhY2sgKi8KKwkJCQkJCQkJLyogQml0ICA4OglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9NTVVfRlJDX0NPTAkoMTw8NykJLyogQml0ICA3OglGb3JjZSBDb2xsaXNpb24gKi8KKyNkZWZpbmUgWE1fTU1VX1NJTV9DT0wJKDE8PDYpCS8qIEJpdCAgNjoJU2ltdWxhdGUgQ29sbGlzaW9uICovCisjZGVmaW5lIFhNX01NVV9OT19QUkUJKDE8PDUpCS8qIEJpdCAgNToJTm8gTURJTyBQcmVhbWJsZSAqLworI2RlZmluZSBYTV9NTVVfR01JSV9GRAkoMTw8NCkJLyogQml0ICA0OglHTUlJIHVzZXMgRnVsbCBEdXBsZXggKi8KKyNkZWZpbmUgWE1fTU1VX1JBVF9DVFJMCSgxPDwzKQkvKiBCaXQgIDM6CUVuYWJsZSBSYXRlIENvbnRyb2wgKi8KKyNkZWZpbmUgWE1fTU1VX0dNSUlfTE9PUCAoMTw8MikJLyogQml0ICAyOglQSFkgaXMgaW4gTG9vcGJhY2sgTW9kZSAqLworI2RlZmluZSBYTV9NTVVfRU5BX1JYCSgxPDwxKQkvKiBCaXQgIDE6CUVuYWJsZSBSZWNlaXZlciAqLworI2RlZmluZSBYTV9NTVVfRU5BX1RYCSgxPDwwKQkvKiBCaXQgIDA6CUVuYWJsZSBUcmFuc21pdHRlciAqLworCisKKy8qCVhNX1RYX0NNRAkxNiBiaXQgci93CVRyYW5zbWl0IENvbW1hbmQgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDE1Li43OglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9UWF9CSzJCSwkJKDE8PDYpCS8qIEJpdCAgNjoJSWdub3IgQ2FycmllciBTZW5zZSAoVHggQmsyQmspKi8KKyNkZWZpbmUgWE1fVFhfRU5DX0JZUAkoMTw8NSkJLyogQml0ICA1OglTZXQgRW5jb2RlciBpbiBCeXBhc3MgTW9kZSAqLworI2RlZmluZSBYTV9UWF9TQU1fTElORQkoMTw8NCkJLyogQml0ICA0OiAoc2MpCVN0YXJ0IHV0aWxpemF0aW9uIGNhbGN1bGF0aW9uICovCisjZGVmaW5lIFhNX1RYX05PX0dJR19NRAkoMTw8MykJLyogQml0ICAzOglEaXNhYmxlIENhcnJpZXIgRXh0ZW5zaW9uICovCisjZGVmaW5lIFhNX1RYX05PX1BSRQkoMTw8MikJLyogQml0ICAyOglEaXNhYmxlIFByZWFtYmxlIEdlbmVyYXRpb24gKi8KKyNkZWZpbmUgWE1fVFhfTk9fQ1JDCSgxPDwxKQkvKiBCaXQgIDE6CURpc2FibGUgQ1JDIEdlbmVyYXRpb24gKi8KKyNkZWZpbmUgWE1fVFhfQVVUT19QQUQJKDE8PDApCS8qIEJpdCAgMDoJRW5hYmxlIEF1dG9tYXRpYyBQYWRkaW5nICovCisKKworLyoJWE1fVFhfUlRfTElNCTE2IGJpdCByL3cJVHJhbnNtaXQgUmV0cnkgTGltaXQgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDE1Li41OglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9SVF9MSU1fTVNLCTB4MWYJLyogQml0ICA0Li4wOglUeCBSZXRyeSBMaW1pdCAqLworCisKKy8qCVhNX1RYX1NUSU1FCTE2IGJpdCByL3cJVHJhbnNtaXQgU2xvdHRpbWUgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDE1Li43OglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9TVElNRV9NU0sJMHg3ZgkvKiBCaXQgIDYuLjA6CVR4IFNsb3R0aW1lIGJpdHMgKi8KKworCisvKglYTV9UWF9JUEcJMTYgYml0IHIvdwlUcmFuc21pdCBJbnRlciBQYWNrZXQgR2FwICovCisJCQkJCQkJCS8qIEJpdCAxNS4uODoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fSVBHX01TSwkJMHhmZgkvKiBCaXQgIDcuLjA6CUlQRyB2YWx1ZSBiaXRzICovCisKKworLyoJWE1fUlhfQ01ECTE2IGJpdCByL3cJUmVjZWl2ZSBDb21tYW5kIFJlZ2lzdGVyICovCisJCQkJCQkJCS8qIEJpdCAxNS4uOToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fUlhfTEVORVJSX09LICgxPDw4KQkvKiBCaXQgIDgJZG9uJ3Qgc2V0IFJ4IEVyciBiaXQgZm9yICovCisJCQkJCQkJCS8qCQlpbnJhbmdlIGVycm9yIHBhY2tldHMgKi8KKyNkZWZpbmUgWE1fUlhfQklHX1BLX09LCSgxPDw3KQkvKiBCaXQgIDcJZG9uJ3Qgc2V0IFJ4IEVyciBiaXQgZm9yICovCisJCQkJCQkJCS8qCQlqdW1ibyBwYWNrZXRzICovCisjZGVmaW5lIFhNX1JYX0lQR19DQVAJKDE8PDYpCS8qIEJpdCAgNglyZXBsLiB0eXBlIGZpZWxkIHdpdGggSVBHICovCisjZGVmaW5lIFhNX1JYX1RQX01ECQkoMTw8NSkJLyogQml0ICA1OglFbmFibGUgdHJhbnNwYXJlbnQgTW9kZSAqLworI2RlZmluZSBYTV9SWF9TVFJJUF9GQ1MJKDE8PDQpCS8qIEJpdCAgNDoJRW5hYmxlIEZDUyBTdHJpcHBpbmcgKi8KKyNkZWZpbmUgWE1fUlhfU0VMRl9SWAkoMTw8MykJLyogQml0ICAzOiAJRW5hYmxlIFJ4IG9mIG93biBwYWNrZXRzICovCisjZGVmaW5lIFhNX1JYX1NBTV9MSU5FCSgxPDwyKQkvKiBCaXQgIDI6IChzYykJU3RhcnQgdXRpbGl6YXRpb24gY2FsY3VsYXRpb24gKi8KKyNkZWZpbmUgWE1fUlhfU1RSSVBfUEFECSgxPDwxKQkvKiBCaXQgIDE6CVN0cmlwIHBhZCBieXRlcyBvZiBSeCBmcmFtZXMgKi8KKyNkZWZpbmUgWE1fUlhfRElTX0NFWFQJKDE8PDApCS8qIEJpdCAgMDoJRGlzYWJsZSBjYXJyaWVyIGV4dC4gY2hlY2sgKi8KKworCisvKglYTV9QSFlfQUREUgkxNiBiaXQgci93CVBIWSBBZGRyZXNzIFJlZ2lzdGVyICovCisJCQkJCQkJCS8qIEJpdCAxNS4uNToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fUEhZX0FERFJfU1oJMHgxZgkvKiBCaXQgIDQuLjA6CVBIWSBBZGRyZXNzIGJpdHMgKi8KKworCisvKglYTV9HUF9QT1JUCTMyIGJpdCByL3cJR2VuZXJhbCBQdXJwb3NlIFBvcnQgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDMxLi43OglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9HUF9BTklQCQkoMUw8PDYpCS8qIEJpdCAgNjogKHJvKQlBdXRvLU5lZy4gaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgWE1fR1BfRlJDX0lOVAkoMUw8PDUpCS8qIEJpdCAgNTogKHNjKQlGb3JjZSBJbnRlcnJ1cHQgKi8KKwkJCQkJCQkJLyogQml0ICA0OglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9HUF9SRVNfTUFDCSgxTDw8MykJLyogQml0ICAzOiAoc2MpCVJlc2V0IE1BQyBhbmQgRklGT3MgKi8KKyNkZWZpbmUgWE1fR1BfUkVTX1NUQVQJKDFMPDwyKQkvKiBCaXQgIDI6IChzYykJUmVzZXQgdGhlIHN0YXRpc3RpY3MgbW9kdWxlICovCisJCQkJCQkJCS8qIEJpdCAgMToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fR1BfSU5QX0FTUwkoMUw8PDApCS8qIEJpdCAgMDogKHJvKSBHUCBJbnB1dCBQaW4gYXNzZXJ0ZWQgKi8KKworCisvKglYTV9JTVNLCQkxNiBiaXQgci93CUludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisvKglYTV9JU1JDCQkxNiBiaXQgci9vCUludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKwkJCQkJCQkJLyogQml0IDE1OglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9JU19MTktfQUUJKDE8PDE0KSAvKiBCaXQgMTQ6CUxpbmsgQXN5bmNocm9ub3VzIEV2ZW50ICovCisjZGVmaW5lIFhNX0lTX1RYX0FCT1JUCSgxPDwxMykgLyogQml0IDEzOglUcmFuc21pdCBBYm9ydCwgbGF0ZSBDb2wuIGV0YyAqLworI2RlZmluZSBYTV9JU19GUkNfSU5UCSgxPDwxMikgLyogQml0IDEyOglGb3JjZSBJTlQgYml0IHNldCBpbiBHUCAqLworI2RlZmluZSBYTV9JU19JTlBfQVNTCSgxPDwxMSkJLyogQml0IDExOglJbnB1dCBBc3NlcnRlZCwgR1AgYml0IDAgc2V0ICovCisjZGVmaW5lIFhNX0lTX0xJUEFfUkMJKDE8PDEwKQkvKiBCaXQgMTA6CUxpbmsgUGFydG5lciByZXF1ZXN0cyBjb25maWcgKi8KKyNkZWZpbmUgWE1fSVNfUlhfUEFHRQkoMTw8OSkJLyogQml0ICA5OglQYWdlIFJlY2VpdmVkICovCisjZGVmaW5lIFhNX0lTX1RYX1BBR0UJKDE8PDgpCS8qIEJpdCAgODoJTmV4dCBQYWdlIExvYWRlZCBmb3IgVHJhbnNtaXQgKi8KKyNkZWZpbmUgWE1fSVNfQU5ECQkoMTw8NykJLyogQml0ICA3OglBdXRvLU5lZ290aWF0aW9uIERvbmUgKi8KKyNkZWZpbmUgWE1fSVNfVFNDX09WCSgxPDw2KQkvKiBCaXQgIDY6CVRpbWUgU3RhbXAgQ291bnRlciBPdmVyZmxvdyAqLworI2RlZmluZSBYTV9JU19SWENfT1YJKDE8PDUpCS8qIEJpdCAgNToJUnggQ291bnRlciBFdmVudCBPdmVyZmxvdyAqLworI2RlZmluZSBYTV9JU19UWENfT1YJKDE8PDQpCS8qIEJpdCAgNDoJVHggQ291bnRlciBFdmVudCBPdmVyZmxvdyAqLworI2RlZmluZSBYTV9JU19SWEZfT1YJKDE8PDMpCS8qIEJpdCAgMzoJUmVjZWl2ZSBGSUZPIE92ZXJmbG93ICovCisjZGVmaW5lIFhNX0lTX1RYRl9VUgkoMTw8MikJLyogQml0ICAyOglUcmFuc21pdCBGSUZPIFVuZGVycnVuICovCisjZGVmaW5lIFhNX0lTX1RYX0NPTVAJKDE8PDEpCS8qIEJpdCAgMToJRnJhbWUgVHggQ29tcGxldGUgKi8KKyNkZWZpbmUgWE1fSVNfUlhfQ09NUAkoMTw8MCkJLyogQml0ICAwOglGcmFtZSBSeCBDb21wbGV0ZSAqLworCisjZGVmaW5lIFhNX0RFRl9NU0sJKH4oWE1fSVNfSU5QX0FTUyB8IFhNX0lTX0xJUEFfUkMgfCBYTV9JU19SWF9QQUdFIHxcCisJCQlYTV9JU19BTkQgfCBYTV9JU19SWENfT1YgfCBYTV9JU19UWENfT1YgfCBYTV9JU19UWEZfVVIpKQorCisKKy8qCVhNX0hXX0NGRwkxNiBiaXQgci93CUhhcmR3YXJlIENvbmZpZyBSZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgMTUuLiA0OglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9IV19HRU5fRU9QCSgxPDwzKQkvKiBCaXQgIDM6CWdlbmVyYXRlIEVuZCBvZiBQYWNrZXQgcHVsc2UgKi8KKyNkZWZpbmUgWE1fSFdfQ09NNFNJRwkoMTw8MikJLyogQml0ICAyOgl1c2UgQ29tbWEgRGV0ZWN0IGZvciBTaWcuIERldC4qLworCQkJCQkJCQkvKiBCaXQgIDE6CXJlc2VydmVkICovCisjZGVmaW5lIFhNX0hXX0dNSUlfTUQJKDE8PDApCS8qIEJpdCAgMDoJR01JSSBJbnRlcmZhY2Ugc2VsZWN0ZWQgKi8KKworCisvKglYTV9UWF9MT19XTQkxNiBiaXQgci93CVR4IEZJRk8gTG93IFdhdGVyIE1hcmsgKi8KKy8qCVhNX1RYX0hJX1dNCTE2IGJpdCByL3cJVHggRklGTyBIaWdoIFdhdGVyIE1hcmsgKi8KKwkJCQkJCQkJLyogQml0IDE1Li4xMAlyZXNlcnZlZCAqLworI2RlZmluZSBYTV9UWF9XTV9NU0sJMHgwMWZmCS8qIEJpdCAgOS4uIDAJVHggRklGTyBXYXRlcm1hcmsgYml0cyAqLworCisvKglYTV9UWF9USFIJMTYgYml0IHIvdwlUeCBSZXF1ZXN0IFRocmVzaG9sZCAqLworLyoJWE1fSFRfVEhSCTE2IGJpdCByL3cJSG9zdCBSZXF1ZXN0IFRocmVzaG9sZCAqLworLyoJWE1fUlhfVEhSCTE2IGJpdCByL3cJUnggUmVxdWVzdCBUaHJlc2hvbGQgKi8KKwkJCQkJCQkJLyogQml0IDE1Li4xMQlyZXNlcnZlZCAqLworI2RlZmluZSBYTV9USFJfTVNLCQkweDAzZmYJLyogQml0IDEwLi4gMAlSeC9UeCBSZXF1ZXN0IFRocmVzaG9sZCBiaXRzICovCisKKworLyoJWE1fVFhfU1RBVAkzMiBiaXQgci9vCVR4IFN0YXR1cyBMSUZPIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX1NUX1ZBTElECQkoMVVMPDwzMSkJLyogQml0IDMxOglTdGF0dXMgVmFsaWQgKi8KKyNkZWZpbmUgWE1fU1RfQllURV9DTlQJKDB4M2ZmZkw8PDE3KQkvKiBCaXQgMzAuLjE3OglUeCBmcmFtZSBMZW5ndGggKi8KKyNkZWZpbmUgWE1fU1RfUkVUUllfQ05UCSgweDFmTDw8MTIpCS8qIEJpdCAxNi4uMTI6CVJldHJ5IENvdW50ICovCisjZGVmaW5lIFhNX1NUX0VYX0NPTAkoMUw8PDExKQkvKiBCaXQgMTE6CUV4Y2Vzc2l2ZSBDb2xsaXNpb25zICovCisjZGVmaW5lIFhNX1NUX0VYX0RFRgkoMUw8PDEwKQkvKiBCaXQgMTA6CUV4Y2Vzc2l2ZSBEZWZlcnJhbCAqLworI2RlZmluZSBYTV9TVF9CVVJTVAkJKDFMPDw5KQkJLyogQml0ICA5OglwLiB4bWl0dGVkIGluIGJ1cnN0IG1kKi8KKyNkZWZpbmUgWE1fU1RfREVGRVIJCSgxTDw8OCkJCS8qIEJpdCAgODoJcGFja2V0IHdhcyBkZWZlcmVkICovCisjZGVmaW5lIFhNX1NUX0JDCQkoMUw8PDcpCQkvKiBCaXQgIDc6CUJyb2FkY2FzdCBwYWNrZXQgKi8KKyNkZWZpbmUgWE1fU1RfTUMJCSgxTDw8NikJCS8qIEJpdCAgNjoJTXVsdGljYXN0IHBhY2tldCAqLworI2RlZmluZSBYTV9TVF9VQwkJKDFMPDw1KQkJLyogQml0ICA1OglVbmljYXN0IHBhY2tldCAqLworI2RlZmluZSBYTV9TVF9UWF9VUgkJKDFMPDw0KQkJLyogQml0ICA0OglGSUZPIFVuZGVycnVuIG9jY3VyZWQgKi8KKyNkZWZpbmUgWE1fU1RfQ1NfRVJSCSgxTDw8MykJCS8qIEJpdCAgMzoJQ2FycmllciBTZW5zZSBFcnJvciAqLworI2RlZmluZSBYTV9TVF9MQVRfQ09MCSgxTDw8MikJCS8qIEJpdCAgMjoJTGF0ZSBDb2xsaXNpb24gRXJyb3IgKi8KKyNkZWZpbmUgWE1fU1RfTVVMX0NPTAkoMUw8PDEpCQkvKiBCaXQgIDE6CU11bHRpcGxlIENvbGxpc2lvbnMgKi8KKyNkZWZpbmUgWE1fU1RfU0dOX0NPTAkoMUw8PDApCQkvKiBCaXQgIDA6CVNpbmdsZSBDb2xsaXNpb24gKi8KKworLyoJWE1fUlhfTE9fV00JMTYgYml0IHIvdwlSZWNlaXZlIExvdyBXYXRlciBNYXJrICovCisvKglYTV9SWF9ISV9XTQkxNiBiaXQgci93CVJlY2VpdmUgSGlnaCBXYXRlciBNYXJrICovCisJCQkJCQkJCQkvKiBCaXQgMTUuLjExOglyZXNlcnZlZCAqLworI2RlZmluZSBYTV9SWF9XTV9NU0sJMHgwM2ZmCQkvKiBCaXQgMTEuLiAwOglSeCBGSUZPIFdhdGVybWFyayBiaXRzICovCisKKworLyoJWE1fREVWX0lECTMyIGJpdCByL28JRGV2aWNlIElEIFJlZ2lzdGVyICovCisjZGVmaW5lIFhNX0RFVl9PVUkJKDB4MDBmZmZmZmZVTDw8OCkJLyogQml0IDMxLi44OglEZXZpY2UgT1VJICovCisjZGVmaW5lIFhNX0RFVl9SRVYJKDB4MDdMIDw8IDUpCQkvKiBCaXQgIDcuLjU6CUNoaXAgUmV2IE51bSAqLworCisKKy8qCVhNX01PREUJCTMyIGJpdCByL3cJTW9kZSBSZWdpc3RlciAqLworCQkJCQkJCQkJLyogQml0IDMxLi4yNzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1fTURfRU5BX1JFSgkoMUw8PDI2KQkvKiBCaXQgMjY6CUVuYWJsZSBGcmFtZSBSZWplY3QgKi8KKyNkZWZpbmUgWE1fTURfU1BPRV9FCSgxTDw8MjUpCS8qIEJpdCAyNToJU2VuZCBQYXVzZSBvbiBFZGdlICovCisJCQkJCQkJCQkvKiAJCWV4dGVybiBnZW5lcmF0ZWQgKi8KKyNkZWZpbmUgWE1fTURfVFhfUkVQCSgxTDw8MjQpCS8qIEJpdCAyNDoJVHJhbnNtaXQgUmVwZWF0ZXIgTW9kZSAqLworI2RlZmluZSBYTV9NRF9TUE9GRl9JCSgxTDw8MjMpCS8qIEJpdCAyMzoJU2VuZCBQYXVzZSBvbiBGSUZPIGZ1bGwgKi8KKwkJCQkJCQkJCS8qCQlpbnRlcm4gZ2VuZXJhdGVkICovCisjZGVmaW5lIFhNX01EX0xFX1NUVwkoMUw8PDIyKQkvKiBCaXQgMjI6CVJ4IFN0YXQgV29yZCBpbiBMaXR0bGUgRW5kaWFuICovCisjZGVmaW5lIFhNX01EX1RYX0NPTlQJKDFMPDwyMSkJLyogQml0IDIxOglTZW5kIENvbnRpbnVvdXMgKi8KKyNkZWZpbmUgWE1fTURfVFhfUEFVU0UJKDFMPDwyMCkJLyogQml0IDIwOiAoc2MpCVNlbmQgUGF1c2UgRnJhbWUgKi8KKyNkZWZpbmUgWE1fTURfQVRTCQkoMUw8PDE5KQkvKiBCaXQgMTk6CUFwcGVuZCBUaW1lIFN0YW1wICovCisjZGVmaW5lIFhNX01EX1NQT0xfSQkoMUw8PDE4KQkvKiBCaXQgMTg6CVNlbmQgUGF1c2Ugb24gTG93ICovCisJCQkJCQkJCQkvKgkJaW50ZXJuIGdlbmVyYXRlZCAqLworI2RlZmluZSBYTV9NRF9TUE9IX0kJKDFMPDwxNykJLyogQml0IDE3OglTZW5kIFBhdXNlIG9uIEhpZ2ggKi8KKwkJCQkJCQkJCS8qCQlpbnRlcm4gZ2VuZXJhdGVkICovCisjZGVmaW5lIFhNX01EX0NBUAkJKDFMPDwxNikJLyogQml0IDE2OglDaGVjayBBZGRyZXNzIFBhaXIgKi8KKyNkZWZpbmUgWE1fTURfRU5BX0hBU0gJKDFMPDwxNSkJLyogQml0IDE1OglFbmFibGUgSGFzaGluZyAqLworI2RlZmluZSBYTV9NRF9DU0EJCSgxTDw8MTQpCS8qIEJpdCAxNDoJQ2hlY2sgU3RhdGlvbiBBZGRyZXNzICovCisjZGVmaW5lIFhNX01EX0NBQQkJKDFMPDwxMykJLyogQml0IDEzOglDaGVjayBBZGRyZXNzIEFycmF5ICovCisjZGVmaW5lIFhNX01EX1JYX01DVFJMCSgxTDw8MTIpCS8qIEJpdCAxMjoJUnggTUFDIENvbnRyb2wgRnJhbWUgKi8KKyNkZWZpbmUgWE1fTURfUlhfUlVOVAkoMUw8PDExKQkvKiBCaXQgMTE6CVJ4IFJ1bnQgRnJhbWVzICovCisjZGVmaW5lIFhNX01EX1JYX0lSTEUJKDFMPDwxMCkJLyogQml0IDEwOglSeCBpbiBSYW5nZSBMZW4gRXJyIEZyYW1lICovCisjZGVmaW5lIFhNX01EX1JYX0xPTkcJKDFMPDw5KQkJLyogQml0ICA5OglSeCBMb25nIEZyYW1lICovCisjZGVmaW5lIFhNX01EX1JYX0NSQ0UJKDFMPDw4KQkJLyogQml0ICA4OglSeCBDUkMgRXJyb3IgRnJhbWUgKi8KKyNkZWZpbmUgWE1fTURfUlhfRVJSCSgxTDw8NykJCS8qIEJpdCAgNzoJUnggRXJyb3IgRnJhbWUgKi8KKyNkZWZpbmUgWE1fTURfRElTX1VDCSgxTDw8NikJCS8qIEJpdCAgNjoJRGlzYWJsZSBSeCBVbmljYXN0ICovCisjZGVmaW5lIFhNX01EX0RJU19NQwkoMUw8PDUpCQkvKiBCaXQgIDU6CURpc2FibGUgUnggTXVsdGljYXN0ICovCisjZGVmaW5lIFhNX01EX0RJU19CQwkoMUw8PDQpCQkvKiBCaXQgIDQ6CURpc2FibGUgUnggQnJvYWRjYXN0ICovCisjZGVmaW5lIFhNX01EX0VOQV9QUk9NCSgxTDw8MykJCS8qIEJpdCAgMzoJRW5hYmxlIFByb21pc2N1b3VzICovCisjZGVmaW5lIFhNX01EX0VOQV9CRQkoMUw8PDIpCQkvKiBCaXQgIDI6CUVuYWJsZSBCaWcgRW5kaWFuICovCisjZGVmaW5lIFhNX01EX0ZURgkJKDFMPDwxKQkJLyogQml0ICAxOiAoc2MpCUZsdXNoIFR4IEZJRk8gKi8KKyNkZWZpbmUgWE1fTURfRlJGCQkoMUw8PDApCQkvKiBCaXQgIDA6IChzYykJRmx1c2ggUnggRklGTyAqLworCisjZGVmaW5lIFhNX1BBVVNFX01PREUJKFhNX01EX1NQT0VfRSB8IFhNX01EX1NQT0xfSSB8IFhNX01EX1NQT0hfSSkKKyNkZWZpbmUgWE1fREVGX01PREUJCShYTV9NRF9SWF9SVU5UIHwgWE1fTURfUlhfSVJMRSB8IFhNX01EX1JYX0xPTkcgfFwKKwkJCQlYTV9NRF9SWF9DUkNFIHwgWE1fTURfUlhfRVJSIHwgWE1fTURfQ1NBIHwgWE1fTURfQ0FBKQorCisvKglYTV9TVEFUX0NNRAkxNiBiaXQgci93CVN0YXRpc3RpY3MgQ29tbWFuZCBSZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgMTYuLjY6CXJlc2VydmVkICovCisjZGVmaW5lIFhNX1NDX1NOUF9SWEMJKDE8PDUpCS8qIEJpdCAgNTogKHNjKQlTbmFwIFJ4IENvdW50ZXJzICovCisjZGVmaW5lIFhNX1NDX1NOUF9UWEMJKDE8PDQpCS8qIEJpdCAgNDogKHNjKQlTbmFwIFR4IENvdW50ZXJzICovCisjZGVmaW5lIFhNX1NDX0NQX1JYQwkoMTw8MykJLyogQml0ICAzOiAJQ29weSBSeCBDb3VudGVycyBDb250aW51b3VzbHkgKi8KKyNkZWZpbmUgWE1fU0NfQ1BfVFhDCSgxPDwyKQkvKiBCaXQgIDI6CUNvcHkgVHggQ291bnRlcnMgQ29udGludW91c2x5ICovCisjZGVmaW5lIFhNX1NDX0NMUl9SWEMJKDE8PDEpCS8qIEJpdCAgMTogKHNjKQlDbGVhciBSeCBDb3VudGVycyAqLworI2RlZmluZSBYTV9TQ19DTFJfVFhDCSgxPDwwKQkvKiBCaXQgIDA6IChzYykgQ2xlYXIgVHggQ291bnRlcnMgKi8KKworCisvKglYTV9SWF9DTlRfRVYJMzIgYml0IHIvbwlSeCBDb3VudGVyIEV2ZW50IFJlZ2lzdGVyICovCisvKglYTV9SWF9FVl9NU0sJMzIgYml0IHIvdwlSeCBDb3VudGVyIEV2ZW50IE1hc2sgKi8KKyNkZWZpbmUgWE1SX01BWF9TWl9PVgkoMVVMPDwzMSkJLyogQml0IDMxOgkxMDI0LU1heFNpemUgUnggQ250IE92Ki8KKyNkZWZpbmUgWE1SXzEwMjNCX09WCSgxTDw8MzApCS8qIEJpdCAzMDoJNTEyLTEwMjNCeXRlIFJ4IENudCBPdiovCisjZGVmaW5lIFhNUl81MTFCX09WCQkoMUw8PDI5KQkvKiBCaXQgMjk6CTI1Ni01MTEgQnl0ZSBSeCBDbnQgT3YqLworI2RlZmluZSBYTVJfMjU1Ql9PVgkJKDFMPDwyOCkJLyogQml0IDI4OgkxMjgtMjU1IEJ5dGUgUnggQ250IE92Ki8KKyNkZWZpbmUgWE1SXzEyN0JfT1YJCSgxTDw8MjcpCS8qIEJpdCAyNzoJNjUtMTI3IEJ5dGUgUnggQ250IE92ICovCisjZGVmaW5lIFhNUl82NEJfT1YJCSgxTDw8MjYpCS8qIEJpdCAyNjoJNjQgQnl0ZSBSeCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1SX1VUSUxfT1YJCSgxTDw8MjUpCS8qIEJpdCAyNToJUnggVXRpbCBDbnQgT3ZlcmZsb3cgKi8KKyNkZWZpbmUgWE1SX1VUSUxfVVIJCSgxTDw8MjQpCS8qIEJpdCAyNDoJUnggVXRpbCBDbnQgVW5kZXJydW4gKi8KKyNkZWZpbmUgWE1SX0NFWF9FUlJfT1YJKDFMPDwyMykJLyogQml0IDIzOglDRVhUIEVyciBDbnQgT3YgKi8KKwkJCQkJCQkJCS8qIEJpdCAyMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1SX0ZDU19FUlJfT1YJKDFMPDwyMSkJLyogQml0IDIxOglSeCBGQ1MgRXJyb3IgQ250IE92ICovCisjZGVmaW5lIFhNUl9MTkdfRVJSX09WCSgxTDw8MjApCS8qIEJpdCAyMDoJUnggdG9vIExvbmcgRXJyIENudCBPdiovCisjZGVmaW5lIFhNUl9SVU5UX09WCQkoMUw8PDE5KQkvKiBCaXQgMTk6CVJ1bnQgRXZlbnQgQ250IE92ICovCisjZGVmaW5lIFhNUl9TSFRfRVJSX09WCSgxTDw8MTgpCS8qIEJpdCAxODoJUnggU2hvcnQgRXYgRXJyIENudCBPdiovCisjZGVmaW5lIFhNUl9TWU1fRVJSX09WCSgxTDw8MTcpCS8qIEJpdCAxNzoJUnggU3ltIEVyciBDbnQgT3YgKi8KKwkJCQkJCQkJCS8qIEJpdCAxNjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1SX0NBUl9FUlJfT1YJKDFMPDwxNSkJLyogQml0IDE1OglSeCBDYXJyIEV2IEVyciBDbnQgT3YgKi8KKyNkZWZpbmUgWE1SX0pBQl9QS1RfT1YJKDFMPDwxNCkJLyogQml0IDE0OglSeCBKYWJiIFBhY2tldCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1SX0ZJRk9fT1YJCSgxTDw8MTMpCS8qIEJpdCAxMzoJUnggRklGTyBPdiBFdiBDbnQgT3YgKi8KKyNkZWZpbmUgWE1SX0ZSQV9FUlJfT1YJKDFMPDwxMikJLyogQml0IDEyOglSeCBGcmFtaW5nIEVyciBDbnQgT3YgKi8KKyNkZWZpbmUgWE1SX0ZNSVNTX09WCSgxTDw8MTEpCS8qIEJpdCAxMToJUnggTWlzc2VkIEV2IENudCBPdiAqLworI2RlZmluZSBYTVJfQlVSU1QJCSgxTDw8MTApCS8qIEJpdCAxMDoJUnggQnVyc3QgRXZlbnQgQ250IE92ICovCisjZGVmaW5lIFhNUl9JTlZfTU9DCQkoMUw8PDkpCQkvKiBCaXQgIDk6CVJ4IHdpdGggaW52LiBNQUMgT0MgT3YqLworI2RlZmluZSBYTVJfSU5WX01QCQkoMUw8PDgpCQkvKiBCaXQgIDg6CVJ4IGludiBQYXVzZSBGcmFtZSBPdiAqLworI2RlZmluZSBYTVJfTUNUUkxfT1YJKDFMPDw3KQkJLyogQml0ICA3OglSeCBNQUMgQ3RybC1GIENudCBPdiAqLworI2RlZmluZSBYTVJfTVBBVVNFX09WCSgxTDw8NikJCS8qIEJpdCAgNjoJUnggUGF1c2UgTUFDIEN0cmwtRiBPdiovCisjZGVmaW5lIFhNUl9VQ19PS19PVgkoMUw8PDUpCQkvKiBCaXQgIDU6CVJ4IFVuaWNhc3QgRnJhbWUgQ250T3YqLworI2RlZmluZSBYTVJfTUNfT0tfT1YJKDFMPDw0KQkJLyogQml0ICA0OglSeCBNdWx0aWNhc3QgQ250IE92ICovCisjZGVmaW5lIFhNUl9CQ19PS19PVgkoMUw8PDMpCQkvKiBCaXQgIDM6CVJ4IEJyb2FkY2FzdCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1SX09LX0xPX09WCSgxTDw8MikJCS8qIEJpdCAgMjoJT2N0ZXRzIFJ4IE9LIExvdyBDbnRPdiovCisjZGVmaW5lIFhNUl9PS19ISV9PVgkoMUw8PDEpCQkvKiBCaXQgIDE6CU9jdGV0cyBSeCBPSyBIaSBDbnQgT3YqLworI2RlZmluZSBYTVJfT0tfT1YJCSgxTDw8MCkJCS8qIEJpdCAgMDoJRnJhbWVzIFJlY2VpdmVkIE9rIE92ICovCisKKyNkZWZpbmUgWE1SX0RFRl9NU0sJCShYTVJfT0tfTE9fT1YgfCBYTVJfT0tfSElfT1YpCisKKy8qCVhNX1RYX0NOVF9FVgkzMiBiaXQgci9vCVR4IENvdW50ZXIgRXZlbnQgUmVnaXN0ZXIgKi8KKy8qCVhNX1RYX0VWX01TSwkzMiBiaXQgci93CVR4IENvdW50ZXIgRXZlbnQgTWFzayAqLworCQkJCQkJCQkJLyogQml0IDMxLi4yNjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1UX01BWF9TWl9PVgkoMUw8PDI1KQkvKiBCaXQgMjU6CTEwMjQtTWF4U2l6ZSBUeCBDbnQgT3YqLworI2RlZmluZSBYTVRfMTAyM0JfT1YJKDFMPDwyNCkJLyogQml0IDI0Ogk1MTItMTAyM0J5dGUgVHggQ250IE92Ki8KKyNkZWZpbmUgWE1UXzUxMUJfT1YJCSgxTDw8MjMpCS8qIEJpdCAyMzoJMjU2LTUxMSBCeXRlIFR4IENudCBPdiovCisjZGVmaW5lIFhNVF8yNTVCX09WCQkoMUw8PDIyKQkvKiBCaXQgMjI6CTEyOC0yNTUgQnl0ZSBUeCBDbnQgT3YqLworI2RlZmluZSBYTVRfMTI3Ql9PVgkJKDFMPDwyMSkJLyogQml0IDIxOgk2NS0xMjcgQnl0ZSBUeCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1UXzY0Ql9PVgkJKDFMPDwyMCkJLyogQml0IDIwOgk2NCBCeXRlIFR4IENudCBPdiAqLworI2RlZmluZSBYTVRfVVRJTF9PVgkJKDFMPDwxOSkJLyogQml0IDE5OglUeCBVdGlsIENudCBPdmVyZmxvdyAqLworI2RlZmluZSBYTVRfVVRJTF9VUgkJKDFMPDwxOCkJLyogQml0IDE4OglUeCBVdGlsIENudCBVbmRlcnJ1biAqLworI2RlZmluZSBYTVRfQ1NfRVJSX09WCSgxTDw8MTcpCS8qIEJpdCAxNzoJVHggQ2FyciBTZW4gRXJyIENudCBPdiovCisjZGVmaW5lIFhNVF9GSUZPX1VSX09WCSgxTDw8MTYpCS8qIEJpdCAxNjoJVHggRklGTyBVciBFdiBDbnQgT3YgKi8KKyNkZWZpbmUgWE1UX0VYX0RFRl9PVgkoMUw8PDE1KQkvKiBCaXQgMTU6CVR4IEV4IERlZmVyYWxsIENudCBPdiAqLworI2RlZmluZSBYTVRfREVGCQkJKDFMPDwxNCkJLyogQml0IDE0OglUeCBEZWZlcnJlZCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1UX0xBVF9DT0xfT1YJKDFMPDwxMykJLyogQml0IDEzOglUeCBMYXRlIENvbCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1UX0FCT19DT0xfT1YJKDFMPDwxMikJLyogQml0IDEyOglUeCBhYm8gZHVldG8gRXggQ29sIE92Ki8KKyNkZWZpbmUgWE1UX01VTF9DT0xfT1YJKDFMPDwxMSkJLyogQml0IDExOglUeCBNdWx0IENvbCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1UX1NOR19DT0wJCSgxTDw8MTApCS8qIEJpdCAxMDoJVHggU2luZ2xlIENvbCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1UX01DVFJMX09WCSgxTDw8OSkJCS8qIEJpdCAgOToJVHggTUFDIEN0cmwgQ291bnRlciBPdiovCisjZGVmaW5lIFhNVF9NUEFVU0UJCSgxTDw8OCkJCS8qIEJpdCAgODoJVHggUGF1c2UgTUFDIEN0cmwtRiBPdiovCisjZGVmaW5lIFhNVF9CVVJTVAkJKDFMPDw3KQkJLyogQml0ICA3OglUeCBCdXJzdCBFdmVudCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1UX0xPTkcJCSgxTDw8NikJCS8qIEJpdCAgNjoJVHggTG9uZyBGcmFtZSBDbnQgT3YgKi8KKyNkZWZpbmUgWE1UX1VDX09LX09WCSgxTDw8NSkJCS8qIEJpdCAgNToJVHggVW5pY2FzdCBDbnQgT3YgKi8KKyNkZWZpbmUgWE1UX01DX09LX09WCSgxTDw8NCkJCS8qIEJpdCAgNDoJVHggTXVsdGljYXN0IENudCBPdiAqLworI2RlZmluZSBYTVRfQkNfT0tfT1YJKDFMPDwzKQkJLyogQml0ICAzOglUeCBCcm9hZGNhc3QgQ250IE92ICovCisjZGVmaW5lIFhNVF9PS19MT19PVgkoMUw8PDIpCQkvKiBCaXQgIDI6CU9jdGV0cyBUeCBPSyBMb3cgQ250T3YqLworI2RlZmluZSBYTVRfT0tfSElfT1YJKDFMPDwxKQkJLyogQml0ICAxOglPY3RldHMgVHggT0sgSGkgQ250IE92Ki8KKyNkZWZpbmUgWE1UX09LX09WCQkoMUw8PDApCQkvKiBCaXQgIDA6CUZyYW1lcyBUeCBPayBPdiAqLworCisjZGVmaW5lIFhNVF9ERUZfTVNLCQkoWE1UX09LX0xPX09WIHwgWE1UX09LX0hJX09WKQorCisvKgorICogUmVjZWl2ZSBGcmFtZSBTdGF0dXMgRW5jb2RpbmcKKyAqLworI2RlZmluZSBYTVJfRlNfTEVOCSgweDNmZmZVTDw8MTgpCS8qIEJpdCAzMS4uMTg6CVJ4IEZyYW1lIExlbmd0aCAqLworI2RlZmluZSBYTVJfRlNfMkxfVkxBTgkoMUw8PDE3KQkvKiBCaXQgMTc6CXRhZ2dlZCB3aCAyTGV2IFZMQU4gSUQqLworI2RlZmluZSBYTVJfRlNfMUxfVkxBTgkoMUw8PDE2KQkvKiBCaXQgMTY6CXRhZ2dlZCB3aCAxTGV2IFZMQU4gSUQqLworI2RlZmluZSBYTVJfRlNfQkMJCSgxTDw8MTUpCS8qIEJpdCAxNToJQnJvYWRjYXN0IEZyYW1lICovCisjZGVmaW5lIFhNUl9GU19NQwkJKDFMPDwxNCkJLyogQml0IDE0OglNdWx0aWNhc3QgRnJhbWUgKi8KKyNkZWZpbmUgWE1SX0ZTX1VDCQkoMUw8PDEzKQkvKiBCaXQgMTM6CVVuaWNhc3QgRnJhbWUgKi8KKwkJCQkJCQkJCS8qIEJpdCAxMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgWE1SX0ZTX0JVUlNUCSgxTDw8MTEpCS8qIEJpdCAxMToJQnVyc3QgTW9kZSAqLworI2RlZmluZSBYTVJfRlNfQ0VYX0VSUgkoMUw8PDEwKQkvKiBCaXQgMTA6CUNhcnJpZXIgRXh0LiBFcnJvciAqLworI2RlZmluZSBYTVJfRlNfODAyXzMJKDFMPDw5KQkJLyogQml0ICA5Ogk4MDIuMyBGcmFtZSAqLworI2RlZmluZSBYTVJfRlNfQ09MX0VSUgkoMUw8PDgpCQkvKiBCaXQgIDg6CUNvbGxpc2lvbiBFcnJvciAqLworI2RlZmluZSBYTVJfRlNfQ0FSX0VSUgkoMUw8PDcpCQkvKiBCaXQgIDc6CUNhcnJpZXIgRXZlbnQgRXJyb3IgKi8KKyNkZWZpbmUgWE1SX0ZTX0xFTl9FUlIJKDFMPDw2KQkJLyogQml0ICA2OglJbi1SYW5nZSBMZW5ndGggRXJyb3IgKi8KKyNkZWZpbmUgWE1SX0ZTX0ZSQV9FUlIJKDFMPDw1KQkJLyogQml0ICA1OglGcmFtaW5nIEVycm9yICovCisjZGVmaW5lIFhNUl9GU19SVU5UCQkoMUw8PDQpCQkvKiBCaXQgIDQ6CVJ1bnQgRnJhbWUgKi8KKyNkZWZpbmUgWE1SX0ZTX0xOR19FUlIJKDFMPDwzKQkJLyogQml0ICAzOglHaWFudCAoSnVtYm8pIEZyYW1lICovCisjZGVmaW5lIFhNUl9GU19GQ1NfRVJSCSgxTDw8MikJCS8qIEJpdCAgMjoJRnJhbWUgQ2hlY2sgU2VxdSBFcnIgKi8KKyNkZWZpbmUgWE1SX0ZTX0VSUgkJKDFMPDwxKQkJLyogQml0ICAxOglGcmFtZSBFcnJvciAqLworI2RlZmluZSBYTVJfRlNfTUNUUkwJKDFMPDwwKQkJLyogQml0ICAwOglNQUMgQ29udHJvbCBQYWNrZXQgKi8KKworLyoKKyAqIFhNUl9GU19FUlIgd2lsbCBiZSBzZXQgaWYKKyAqCVhNUl9GU19GQ1NfRVJSLCBYTVJfRlNfTE5HX0VSUiwgWE1SX0ZTX1JVTlQsCisgKglYTVJfRlNfRlJBX0VSUiwgWE1SX0ZTX0xFTl9FUlIsIG9yIFhNUl9GU19DRVhfRVJSCisgKiBpcyBzZXQuIFhNUl9GU19MTkdfRVJSIGFuZCBYTVJfRlNfTEVOX0VSUiB3aWxsIGlzc3VlCisgKiBYTVJfRlNfRVJSIHVubGVzcyB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIFJlY2VpdmUgQ29tbWFuZAorICogUmVnaXN0ZXIgaXMgc2V0LgorICovCisjZGVmaW5lIFhNUl9GU19BTllfRVJSCVhNUl9GU19FUlIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBYTUFDLVBIWSBSZWdpc3RlcnMsIGluZGlyZWN0IGFkZHJlc3NlZCBvdmVyIHRoZSBYTUFDCisgKi8KKyNkZWZpbmUgUEhZX1hNQUNfQ1RSTAkJMHgwMAkvKiAxNiBiaXQgci93CVBIWSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9YTUFDX1NUQVQJCTB4MDEJLyogMTYgYml0IHIvdwlQSFkgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9YTUFDX0lEMAkJMHgwMgkvKiAxNiBiaXQgci9vCVBIWSBJRDAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX1hNQUNfSUQxCQkweDAzCS8qIDE2IGJpdCByL28JUEhZIElEMSBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfWE1BQ19BVU5FX0FEVgkweDA0CS8qIDE2IGJpdCByL3cJQXV0by1OZWcuIEFkdmVydGlzZW1lbnQgKi8KKyNkZWZpbmUgUEhZX1hNQUNfQVVORV9MUAkweDA1CS8qIDE2IGJpdCByL28JTGluayBQYXJ0bmVyIEFiaSBSZWcgKi8KKyNkZWZpbmUgUEhZX1hNQUNfQVVORV9FWFAJMHgwNgkvKiAxNiBiaXQgci9vCUF1dG8tTmVnLiBFeHBhbnNpb24gUmVnICovCisjZGVmaW5lIFBIWV9YTUFDX05FUEcJCTB4MDcJLyogMTYgYml0IHIvdwlOZXh0IFBhZ2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX1hNQUNfTkVQR19MUAkweDA4CS8qIDE2IGJpdCByL28JTmV4dCBQYWdlIExpbmsgUGFydG5lciAqLworCS8qIDB4MDkgLSAweDBlOgkJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX1hNQUNfRVhUX1NUQVQJMHgwZgkvKiAxNiBiaXQgci9vCUV4dCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX1hNQUNfUkVTX0FCSQkweDEwCS8qIDE2IGJpdCByL28JUEhZIFJlc29sdmVkIEFiaWxpdHkgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBCcm9hZGNvbS1QSFkgUmVnaXN0ZXJzLCBpbmRpcmVjdCBhZGRyZXNzZWQgb3ZlciBYTUFDCisgKi8KKyNkZWZpbmUgUEhZX0JDT01fQ1RSTAkJMHgwMAkvKiAxNiBiaXQgci93CVBIWSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9CQ09NX1NUQVQJCTB4MDEJLyogMTYgYml0IHIvbwlQSFkgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9CQ09NX0lEMAkJMHgwMgkvKiAxNiBiaXQgci9vCVBIWSBJRDAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX0JDT01fSUQxCQkweDAzCS8qIDE2IGJpdCByL28JUEhZIElEMSBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfQkNPTV9BVU5FX0FEVgkweDA0CS8qIDE2IGJpdCByL3cJQXV0by1OZWcuIEFkdmVydGlzZW1lbnQgKi8KKyNkZWZpbmUgUEhZX0JDT01fQVVORV9MUAkweDA1CS8qIDE2IGJpdCByL28JTGluayBQYXJ0IEFiaWxpdHkgUmVnICovCisjZGVmaW5lIFBIWV9CQ09NX0FVTkVfRVhQCTB4MDYJLyogMTYgYml0IHIvbwlBdXRvLU5lZy4gRXhwYW5zaW9uIFJlZyAqLworI2RlZmluZSBQSFlfQkNPTV9ORVBHCQkweDA3CS8qIDE2IGJpdCByL3cJTmV4dCBQYWdlIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9CQ09NX05FUEdfTFAJMHgwOAkvKiAxNiBiaXQgci9vCU5leHQgUGFnZSBMaW5rIFBhcnRuZXIgKi8KKwkvKiBCcm9hZGNvbS1zcGVjaWZpYyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUEhZX0JDT01fMTAwMFRfQ1RSTAkweDA5CS8qIDE2IGJpdCByL3cJMTAwMEJhc2UtVCBDdHJsIFJlZyAqLworI2RlZmluZSBQSFlfQkNPTV8xMDAwVF9TVEFUCTB4MGEJLyogMTYgYml0IHIvbwkxMDAwQmFzZS1UIFN0YXR1cyBSZWcgKi8KKwkvKiAweDBiIC0gMHgwZToJCXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9CQ09NX0VYVF9TVEFUCTB4MGYJLyogMTYgYml0IHIvbwlFeHRlbmRlZCBTdGF0dXMgUmVnICovCisjZGVmaW5lIFBIWV9CQ09NX1BfRVhUX0NUUkwJMHgxMAkvKiAxNiBiaXQgci93CVBIWSBFeHRlbmRlZCBDdHJsIFJlZyAqLworI2RlZmluZSBQSFlfQkNPTV9QX0VYVF9TVEFUCTB4MTEJLyogMTYgYml0IHIvbwlQSFkgRXh0ZW5kZWQgU3RhdCBSZWcgKi8KKyNkZWZpbmUgUEhZX0JDT01fUkVfQ1RSCQkweDEyCS8qIDE2IGJpdCByL3cJUmVjZWl2ZSBFcnJvciBDb3VudGVyICovCisjZGVmaW5lIFBIWV9CQ09NX0ZDX0NUUgkJMHgxMwkvKiAxNiBiaXQgci93CUZhbHNlIENhcnJpZXIgU2Vuc2UgQ250ICovCisjZGVmaW5lIFBIWV9CQ09NX1JOT19DVFIJMHgxNAkvKiAxNiBiaXQgci93CVJlY2VpdmVyIE5PVF9PSyBDbnQgKi8KKwkvKiAweDE1IC0gMHgxNzoJCXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9CQ09NX0FVWF9DVFJMCTB4MTgJLyogMTYgYml0IHIvdwlBdXhpbGlhcnkgQ29udHJvbCBSZWcgKi8KKyNkZWZpbmUgUEhZX0JDT01fQVVYX1NUQVQJMHgxOQkvKiAxNiBiaXQgci9vCUF1eGlsaWFyeSBTdGF0IFN1bW1hcnkgKi8KKyNkZWZpbmUgUEhZX0JDT01fSU5UX1NUQVQJMHgxYQkvKiAxNiBiaXQgci9vCUludGVycnVwdCBTdGF0dXMgUmVnICovCisjZGVmaW5lIFBIWV9CQ09NX0lOVF9NQVNLCTB4MWIJLyogMTYgYml0IHIvdwlJbnRlcnJ1cHQgTWFzayBSZWcgKi8KKwkvKiAweDFjOgkJcmVzZXJ2ZWQgKi8KKwkvKiAweDFkIC0gMHgxZjoJCXRlc3QgcmVnaXN0ZXJzICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogTWFydmVsLVBIWSBSZWdpc3RlcnMsIGluZGlyZWN0IGFkZHJlc3NlZCBvdmVyIEdNQUMKKyAqLworI2RlZmluZSBQSFlfTUFSVl9DVFJMCQkweDAwCS8qIDE2IGJpdCByL3cJUEhZIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX01BUlZfU1RBVAkJMHgwMQkvKiAxNiBiaXQgci9vCVBIWSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX01BUlZfSUQwCQkweDAyCS8qIDE2IGJpdCByL28JUEhZIElEMCBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfTUFSVl9JRDEJCTB4MDMJLyogMTYgYml0IHIvbwlQSFkgSUQxIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9NQVJWX0FVTkVfQURWCTB4MDQJLyogMTYgYml0IHIvdwlBdXRvLU5lZy4gQWR2ZXJ0aXNlbWVudCAqLworI2RlZmluZSBQSFlfTUFSVl9BVU5FX0xQCTB4MDUJLyogMTYgYml0IHIvbwlMaW5rIFBhcnQgQWJpbGl0eSBSZWcgKi8KKyNkZWZpbmUgUEhZX01BUlZfQVVORV9FWFAJMHgwNgkvKiAxNiBiaXQgci9vCUF1dG8tTmVnLiBFeHBhbnNpb24gUmVnICovCisjZGVmaW5lIFBIWV9NQVJWX05FUEcJCTB4MDcJLyogMTYgYml0IHIvdwlOZXh0IFBhZ2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX01BUlZfTkVQR19MUAkweDA4CS8qIDE2IGJpdCByL28JTmV4dCBQYWdlIExpbmsgUGFydG5lciAqLworCS8qIE1hcnZlbC1zcGVjaWZpYyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUEhZX01BUlZfMTAwMFRfQ1RSTAkweDA5CS8qIDE2IGJpdCByL3cJMTAwMEJhc2UtVCBDdHJsIFJlZyAqLworI2RlZmluZSBQSFlfTUFSVl8xMDAwVF9TVEFUCTB4MGEJLyogMTYgYml0IHIvbwkxMDAwQmFzZS1UIFN0YXR1cyBSZWcgKi8KKwkvKiAweDBiIC0gMHgwZToJCXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9NQVJWX0VYVF9TVEFUCTB4MGYJLyogMTYgYml0IHIvbwlFeHRlbmRlZCBTdGF0dXMgUmVnICovCisjZGVmaW5lIFBIWV9NQVJWX1BIWV9DVFJMCTB4MTAJLyogMTYgYml0IHIvdwlQSFkgU3BlY2lmaWMgQ3RybCBSZWcgKi8KKyNkZWZpbmUgUEhZX01BUlZfUEhZX1NUQVQJMHgxMQkvKiAxNiBiaXQgci9vCVBIWSBTcGVjaWZpYyBTdGF0IFJlZyAqLworI2RlZmluZSBQSFlfTUFSVl9JTlRfTUFTSwkweDEyCS8qIDE2IGJpdCByL3cJSW50ZXJydXB0IE1hc2sgUmVnICovCisjZGVmaW5lIFBIWV9NQVJWX0lOVF9TVEFUCTB4MTMJLyogMTYgYml0IHIvbwlJbnRlcnJ1cHQgU3RhdHVzIFJlZyAqLworI2RlZmluZSBQSFlfTUFSVl9FWFRfQ1RSTAkweDE0CS8qIDE2IGJpdCByL3cJRXh0LiBQSFkgU3BlY2lmaWMgQ3RybCAqLworI2RlZmluZSBQSFlfTUFSVl9SWEVfQ05UCTB4MTUJLyogMTYgYml0IHIvdwlSZWNlaXZlIEVycm9yIENvdW50ZXIgKi8KKyNkZWZpbmUgUEhZX01BUlZfRVhUX0FEUgkweDE2CS8qIDE2IGJpdCByL3cJRXh0LiBBZC4gZm9yIENhYmxlIERpYWcuICovCisJLyogMHgxNzoJCXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9NQVJWX0xFRF9DVFJMCTB4MTgJLyogMTYgYml0IHIvdwlMRUQgQ29udHJvbCBSZWcgKi8KKyNkZWZpbmUgUEhZX01BUlZfTEVEX09WRVIJMHgxOQkvKiAxNiBiaXQgci93CU1hbnVhbCBMRUQgT3ZlcnJpZGUgUmVnICovCisjZGVmaW5lIFBIWV9NQVJWX0VYVF9DVFJMXzIJMHgxYQkvKiAxNiBiaXQgci93CUV4dC4gUEhZIFNwZWNpZmljIEN0cmwgMiAqLworI2RlZmluZSBQSFlfTUFSVl9FWFRfUF9TVEFUCTB4MWIJLyogMTYgYml0IHIvdwlFeHQuIFBIWSBTcGVjLiBTdGF0IFJlZyAqLworI2RlZmluZSBQSFlfTUFSVl9DQUJMRV9ESUFHCTB4MWMJLyogMTYgYml0IHIvbwlDYWJsZSBEaWFnbm9zdGljIFJlZyAqLworCS8qIDB4MWQgLSAweDFmOgkJcmVzZXJ2ZWQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBMZXZlbCBPbmUtUEhZIFJlZ2lzdGVycywgaW5kaXJlY3QgYWRkcmVzc2VkIG92ZXIgWE1BQworICovCisjZGVmaW5lIFBIWV9MT05FX0NUUkwJCTB4MDAJLyogMTYgYml0IHIvdwlQSFkgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfTE9ORV9TVEFUCQkweDAxCS8qIDE2IGJpdCByL28JUEhZIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfTE9ORV9JRDAJCTB4MDIJLyogMTYgYml0IHIvbwlQSFkgSUQwIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9MT05FX0lEMQkJMHgwMwkvKiAxNiBiaXQgci9vCVBIWSBJRDEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX0xPTkVfQVVORV9BRFYJMHgwNAkvKiAxNiBiaXQgci93CUF1dG8tTmVnLiBBZHZlcnRpc2VtZW50ICovCisjZGVmaW5lIFBIWV9MT05FX0FVTkVfTFAJMHgwNQkvKiAxNiBiaXQgci9vCUxpbmsgUGFydCBBYmlsaXR5IFJlZyAqLworI2RlZmluZSBQSFlfTE9ORV9BVU5FX0VYUAkweDA2CS8qIDE2IGJpdCByL28JQXV0by1OZWcuIEV4cGFuc2lvbiBSZWcgKi8KKyNkZWZpbmUgUEhZX0xPTkVfTkVQRwkJMHgwNwkvKiAxNiBiaXQgci93CU5leHQgUGFnZSBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfTE9ORV9ORVBHX0xQCTB4MDgJLyogMTYgYml0IHIvbwlOZXh0IFBhZ2UgTGluayBQYXJ0bmVyICovCisJLyogTGV2ZWwgT25lLXNwZWNpZmljIHJlZ2lzdGVycyAqLworI2RlZmluZSBQSFlfTE9ORV8xMDAwVF9DVFJMCTB4MDkJLyogMTYgYml0IHIvdwkxMDAwQmFzZS1UIENvbnRyb2wgUmVnKi8KKyNkZWZpbmUgUEhZX0xPTkVfMTAwMFRfU1RBVAkweDBhCS8qIDE2IGJpdCByL28JMTAwMEJhc2UtVCBTdGF0dXMgUmVnICovCisJLyogMHgwYiAtMHgwZToJCXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9MT05FX0VYVF9TVEFUCTB4MGYJLyogMTYgYml0IHIvbwlFeHRlbmRlZCBTdGF0dXMgUmVnICovCisjZGVmaW5lIFBIWV9MT05FX1BPUlRfQ0ZHCTB4MTAJLyogMTYgYml0IHIvdwlQb3J0IENvbmZpZ3VyYXRpb24gUmVnKi8KKyNkZWZpbmUgUEhZX0xPTkVfUV9TVEFUCQkweDExCS8qIDE2IGJpdCByL28JUXVpY2sgU3RhdHVzIFJlZyAqLworI2RlZmluZSBQSFlfTE9ORV9JTlRfRU5BQgkweDEyCS8qIDE2IGJpdCByL3cJSW50ZXJydXB0IEVuYWJsZSBSZWcgKi8KKyNkZWZpbmUgUEhZX0xPTkVfSU5UX1NUQVQJMHgxMwkvKiAxNiBiaXQgci9vCUludGVycnVwdCBTdGF0dXMgUmVnICovCisjZGVmaW5lIFBIWV9MT05FX0xFRF9DRkcJMHgxNAkvKiAxNiBiaXQgci93CUxFRCBDb25maWd1cmF0aW9uIFJlZyAqLworI2RlZmluZSBQSFlfTE9ORV9QT1JUX0NUUkwJMHgxNQkvKiAxNiBiaXQgci93CVBvcnQgQ29udHJvbCBSZWcgKi8KKyNkZWZpbmUgUEhZX0xPTkVfQ0lNCQkweDE2CS8qIDE2IGJpdCByL28JQ0lNIFJlZyAqLworCS8qIDB4MTcgLTB4MWM6CQlyZXNlcnZlZCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIE5hdGlvbmFsLVBIWSBSZWdpc3RlcnMsIGluZGlyZWN0IGFkZHJlc3NlZCBvdmVyIFhNQUMKKyAqLworI2RlZmluZSBQSFlfTkFUX0NUUkwJCTB4MDAJLyogMTYgYml0IHIvdwlQSFkgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfTkFUX1NUQVQJCTB4MDEJLyogMTYgYml0IHIvdwlQSFkgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9OQVRfSUQwCQkJMHgwMgkvKiAxNiBiaXQgci9vCVBIWSBJRDAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX05BVF9JRDEJCQkweDAzCS8qIDE2IGJpdCByL28JUEhZIElEMSBSZWdpc3RlciAqLworI2RlZmluZSBQSFlfTkFUX0FVTkVfQURWCTB4MDQJLyogMTYgYml0IHIvdwlBdXRvLU5lZy4gQWR2ZXJ0aXNlbWVudCAqLworI2RlZmluZSBQSFlfTkFUX0FVTkVfTFAJCTB4MDUJLyogMTYgYml0IHIvbwlMaW5rIFBhcnRuZXIgQWJpbGl0eSBSZWcgKi8KKyNkZWZpbmUgUEhZX05BVF9BVU5FX0VYUAkweDA2CS8qIDE2IGJpdCByL28JQXV0by1OZWcuIEV4cGFuc2lvbiBSZWcgKi8KKyNkZWZpbmUgUEhZX05BVF9ORVBHCQkweDA3CS8qIDE2IGJpdCByL3cJTmV4dCBQYWdlIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9OQVRfTkVQR19MUAkJMHgwOAkvKiAxNiBiaXQgci9vCU5leHQgUGFnZSBMaW5rIFBhcnRuZXIgUmVnICovCisJLyogTmF0aW9uYWwtc3BlY2lmaWMgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBIWV9OQVRfMTAwMFRfQ1RSTAkweDA5CS8qIDE2IGJpdCByL3cJMTAwMEJhc2UtVCBDb250cm9sIFJlZyAqLworI2RlZmluZSBQSFlfTkFUXzEwMDBUX1NUQVQJMHgwYQkvKiAxNiBiaXQgci9vCTEwMDBCYXNlLVQgU3RhdHVzIFJlZyAqLworCS8qIDB4MGIgLTB4MGU6CQlyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfTkFUX0VYVF9TVEFUCTB4MGYJLyogMTYgYml0IHIvbwlFeHRlbmRlZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEhZX05BVF9FWFRfQ1RSTDEJMHgxMAkvKiAxNiBiaXQgci9vCUV4dGVuZGVkIENvbnRyb2wgUmVnMSAqLworI2RlZmluZSBQSFlfTkFUX1FfU1RBVDEJCTB4MTEJLyogMTYgYml0IHIvbwlRdWljayBTdGF0dXMgUmVnMSAqLworI2RlZmluZSBQSFlfTkFUXzEwQl9PUAkJMHgxMgkvKiAxNiBiaXQgci9vCTEwQmFzZS1UIE9wZXJhdGlvbnMgUmVnICovCisjZGVmaW5lIFBIWV9OQVRfRVhUX0NUUkwyCTB4MTMJLyogMTYgYml0IHIvbwlFeHRlbmRlZCBDb250cm9sIFJlZzEgKi8KKyNkZWZpbmUgUEhZX05BVF9RX1NUQVQyCQkweDE0CS8qIDE2IGJpdCByL28JUXVpY2sgU3RhdHVzIFJlZzIgKi8KKwkvKiAweDE1IC0weDE4OgkJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX05BVF9QSFlfQUREUgkweDE5CS8qIDE2IGJpdCByL28JUEhZIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogUEhZIGJpdCBkZWZpbml0aW9ucworICogQml0cyBkZWZpbmVkIGFzIFBIWV9YXy4uLiwgUEhZX0JfLi4uLCBQSFlfTF8uLi4gb3IgUEhZX05fLi4uIGFyZQorICogWE1BQy9Ccm9hZGNvbS9MZXZlbE9uZS9OYXRpb25hbC9NYXJ2ZWxsLXNwZWNpZmljLgorICogQWxsIG90aGVyIGFyZSBnZW5lcmFsLgorICovCisKKy8qKioqKiAgUEhZX1hNQUNfQ1RSTAkxNiBiaXQgci93CVBIWSBDb250cm9sIFJlZ2lzdGVyICoqKioqLworLyoqKioqICBQSFlfQkNPTV9DVFJMCTE2IGJpdCByL3cJUEhZIENvbnRyb2wgUmVnaXN0ZXIgKioqKiovCisvKioqKiogIFBIWV9NQVJWX0NUUkwJMTYgYml0IHIvdwlQSFkgU3RhdHVzIFJlZ2lzdGVyICoqKioqLworLyoqKioqICBQSFlfTE9ORV9DVFJMCTE2IGJpdCByL3cJUEhZIENvbnRyb2wgUmVnaXN0ZXIgKioqKiovCisjZGVmaW5lIFBIWV9DVF9SRVNFVAkoMTw8MTUpCS8qIEJpdCAxNTogKHNjKQljbGVhciBhbGwgUEhZIHJlbGF0ZWQgcmVncyAqLworI2RlZmluZSBQSFlfQ1RfTE9PUAkJKDE8PDE0KQkvKiBCaXQgMTQ6CWVuYWJsZSBMb29wYmFjayBvdmVyIFBIWSAqLworI2RlZmluZSBQSFlfQ1RfU1BTX0xTQgkoMTw8MTMpIC8qIEJpdCAxMzogKEJDLEwxKSBTcGVlZCBzZWxlY3QsIGxvd2VyIGJpdCAqLworI2RlZmluZSBQSFlfQ1RfQU5FCQkoMTw8MTIpCS8qIEJpdCAxMjoJQXV0by1OZWdvdGlhdGlvbiBFbmFibGVkICovCisjZGVmaW5lIFBIWV9DVF9QRE9XTgkoMTw8MTEpCS8qIEJpdCAxMTogKEJDLEwxKSBQb3dlciBEb3duIE1vZGUgKi8KKyNkZWZpbmUgUEhZX0NUX0lTT0wJCSgxPDwxMCkJLyogQml0IDEwOiAoQkMsTDEpIElzb2xhdGUgTW9kZSAqLworI2RlZmluZSBQSFlfQ1RfUkVfQ0ZHCSgxPDw5KQkvKiBCaXQgIDk6IChzYykgUmVzdGFydCBBdXRvLU5lZ290aWF0aW9uICovCisjZGVmaW5lIFBIWV9DVF9EVVBfTUQJKDE8PDgpCS8qIEJpdCAgODoJRHVwbGV4IE1vZGUgKi8KKyNkZWZpbmUgUEhZX0NUX0NPTF9UU1QJKDE8PDcpCS8qIEJpdCAgNzogKEJDLEwxKSBDb2xsaXNpb24gVGVzdCBlbmFibGVkICovCisjZGVmaW5lIFBIWV9DVF9TUFNfTVNCCSgxPDw2KQkvKiBCaXQgIDY6IChCQyxMMSkgU3BlZWQgc2VsZWN0LCB1cHBlciBiaXQgKi8KKwkJCQkJCQkJLyogQml0ICA1Li4wOglyZXNlcnZlZCAqLworCisjZGVmaW5lIFBIWV9DVF9TUDEwMDAJUEhZX0NUX1NQU19NU0IJLyogZW5hYmxlIHNwZWVkIG9mIDEwMDAgTWJwcyAqLworI2RlZmluZSBQSFlfQ1RfU1AxMDAJUEhZX0NUX1NQU19MU0IJLyogZW5hYmxlIHNwZWVkIG9mICAxMDAgTWJwcyAqLworI2RlZmluZSBQSFlfQ1RfU1AxMAkJKDApCQkJCS8qIGVuYWJsZSBzcGVlZCBvZiAgIDEwIE1icHMgKi8KKworCisvKioqKiogIFBIWV9YTUFDX1NUQVQJMTYgYml0IHIvdwlQSFkgU3RhdHVzIFJlZ2lzdGVyICoqKioqLworLyoqKioqICBQSFlfQkNPTV9TVEFUCTE2IGJpdCByL3cJUEhZIFN0YXR1cyBSZWdpc3RlciAqKioqKi8KKy8qKioqKiAgUEhZX01BUlZfU1RBVAkxNiBiaXQgci93CVBIWSBTdGF0dXMgUmVnaXN0ZXIgKioqKiovCisvKioqKiogIFBIWV9MT05FX1NUQVQJMTYgYml0IHIvdwlQSFkgU3RhdHVzIFJlZ2lzdGVyICoqKioqLworCQkJCQkJCQkvKiBCaXQgMTUuLjk6CXJlc2VydmVkICovCisJCQkJLyoJKEJDL0wxKSAxMDAvMTAgTWJwcyBjYXAgYml0cyBpZ25vcmVkKi8KKyNkZWZpbmUgUEhZX1NUX0VYVF9TVAkoMTw8OCkJLyogQml0ICA4OglFeHRlbmRlZCBTdGF0dXMgUHJlc2VudCAqLworCQkJCQkJCQkvKiBCaXQgIDc6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9TVF9QUkVfU1VQCSgxPDw2KQkvKiBCaXQgIDY6IChCQy9MMSkgcHJlYW1ibGUgc3VwcHJlc3Npb24gKi8KKyNkZWZpbmUgUEhZX1NUX0FOX09WRVIJKDE8PDUpCS8qIEJpdCAgNToJQXV0by1OZWdvdGlhdGlvbiBPdmVyICovCisjZGVmaW5lIFBIWV9TVF9SRU1fRkxUCSgxPDw0KQkvKiBCaXQgIDQ6CVJlbW90ZSBGYXVsdCBDb25kaXRpb24gT2NjdXJlZCAqLworI2RlZmluZSBQSFlfU1RfQU5fQ0FQCSgxPDwzKQkvKiBCaXQgIDM6CUF1dG8tTmVnb3RpYXRpb24gQ2FwYWJpbGl0eSAqLworI2RlZmluZSBQSFlfU1RfTFNZTkMJKDE8PDIpCS8qIEJpdCAgMjoJTGluayBTeW5jaHJvbml6ZWQgKi8KKyNkZWZpbmUgUEhZX1NUX0pBQl9ERVQJKDE8PDEpCS8qIEJpdCAgMTogKEJDL0wxKSBKYWJiZXIgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgUEhZX1NUX0VYVF9SRUcJKDE8PDApCS8qIEJpdCAgMDoJRXh0ZW5kZWQgUmVnaXN0ZXIgYXZhaWxhYmxlICovCisKKworLyoqKioqCVBIWV9YTUFDX0lEMQkJMTYgYml0IHIvbwlQSFkgSUQxIFJlZ2lzdGVyICovCisvKioqKioJUEhZX0JDT01fSUQxCQkxNiBiaXQgci9vCVBIWSBJRDEgUmVnaXN0ZXIgKi8KKy8qKioqKglQSFlfTUFSVl9JRDEJCTE2IGJpdCByL28JUEhZIElEMSBSZWdpc3RlciAqLworLyoqKioqCVBIWV9MT05FX0lEMQkJMTYgYml0IHIvbwlQSFkgSUQxIFJlZ2lzdGVyICovCisjZGVmaW5lIFBIWV9JMV9PVUlfTVNLCSgweDNmPDwxMCkJLyogQml0IDE1Li4xMDoJT3JnYW5pemF0aW9uIFVuaXF1ZSBJRCAqLworI2RlZmluZSBQSFlfSTFfTU9EX05VTQkoMHgzZjw8NCkJLyogQml0ICA5Li4gNDoJTW9kZWwgTnVtYmVyICovCisjZGVmaW5lIFBIWV9JMV9SRVZfTVNLCTB4MGYJCS8qIEJpdCAgMy4uIDA6CVJldmlzaW9uIE51bWJlciAqLworCisvKiBkaWZmZXJlbnQgQnJvYWRjb20gUEhZIElkcyAqLworI2RlZmluZSBQSFlfQkNPTV9JRDFfQTEJCTB4NjA0MQorI2RlZmluZSBQSFlfQkNPTV9JRDFfQjIJCTB4NjA0MworI2RlZmluZSBQSFlfQkNPTV9JRDFfQzAJCTB4NjA0NAorI2RlZmluZSBQSFlfQkNPTV9JRDFfQzUJCTB4NjA0NworCisKKy8qKioqKiAgUEhZX1hNQUNfQVVORV9BRFYJMTYgYml0IHIvdwlBdXRvLU5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgKioqKiovCisvKioqKiogIFBIWV9YTUFDX0FVTkVfTFAJMTYgYml0IHIvbwlMaW5rIFBhcnRuZXIgQWJpbGl0eSBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9BTl9OWFRfUEcJKDE8PDE1KQkvKiBCaXQgMTU6CVJlcXVlc3QgTmV4dCBQYWdlICovCisjZGVmaW5lIFBIWV9YX0FOX0FDSwkoMTw8MTQpCS8qIEJpdCAxNDogKHJvKQlBY2tub3dsZWRnZSBSZWNlaXZlZCAqLworI2RlZmluZSBQSFlfWF9BTl9SRkIJKDM8PDEyKQkvKiBCaXQgMTMuLjEyOglSZW1vdGUgRmF1bHQgQml0cyAqLworCQkJCQkJCQkvKiBCaXQgMTEuLiA5OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfWF9BTl9QQVVTRQkoMzw8NykJLyogQml0ICA4Li4gNzoJUGF1c2UgQml0cyAqLworI2RlZmluZSBQSFlfWF9BTl9IRAkJKDE8PDYpCS8qIEJpdCAgNjoJSGFsZiBEdXBsZXggKi8KKyNkZWZpbmUgUEhZX1hfQU5fRkQJCSgxPDw1KQkvKiBCaXQgIDU6CUZ1bGwgRHVwbGV4ICovCisJCQkJCQkJCS8qIEJpdCAgNC4uIDA6CXJlc2VydmVkICovCisKKy8qKioqKiAgUEhZX0JDT01fQVVORV9BRFYJMTYgYml0IHIvdwlBdXRvLU5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgKioqKiovCisvKioqKiogIFBIWV9CQ09NX0FVTkVfTFAJMTYgYml0IHIvbwlMaW5rIFBhcnRuZXIgQWJpbGl0eSBSZWcgKioqKiovCisvKglQSFlfQU5fTlhUX1BHCQkoc2VlIFhNQUMpIEJpdCAxNToJUmVxdWVzdCBOZXh0IFBhZ2UgKi8KKwkJCQkJCQkJLyogQml0IDE0OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfQl9BTl9SRgkJKDE8PDEzKQkvKiBCaXQgMTM6CVJlbW90ZSBGYXVsdCAqLworCQkJCQkJCQkvKiBCaXQgMTI6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9CX0FOX0FTUAkoMTw8MTEpCS8qIEJpdCAxMToJQXN5bW1ldHJpYyBQYXVzZSAqLworI2RlZmluZSBQSFlfQl9BTl9QQwkJKDE8PDEwKQkvKiBCaXQgMTA6CVBhdXNlIENhcGFibGUgKi8KKwkJCQkJCQkJLyogQml0ICA5Li41OgkxMDAvMTAgQlQgY2FwIGJpdHMgaW5nbm9yZWQgKi8KKyNkZWZpbmUgUEhZX0JfQU5fU0VMCTB4MWYJLyogQml0IDQuLjA6CVNlbGVjdG9yIEZpZWxkLCAwMDAwMT1FdGhlcm5ldCovCisKKy8qKioqKiAgUEhZX0xPTkVfQVVORV9BRFYJMTYgYml0IHIvdwlBdXRvLU5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgKioqKiovCisvKioqKiogIFBIWV9MT05FX0FVTkVfTFAJMTYgYml0IHIvbwlMaW5rIFBhcnRuZXIgQWJpbGl0eSBSZWcgKioqKiovCisvKglQSFlfQU5fTlhUX1BHCQkoc2VlIFhNQUMpIEJpdCAxNToJUmVxdWVzdCBOZXh0IFBhZ2UgKi8KKwkJCQkJCQkJLyogQml0IDE0OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfTF9BTl9SRgkJKDE8PDEzKQkvKiBCaXQgMTM6CVJlbW90ZSBGYXVsdCAqLworCQkJCQkJCQkvKiBCaXQgMTI6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9MX0FOX0FTUAkoMTw8MTEpCS8qIEJpdCAxMToJQXN5bW1ldHJpYyBQYXVzZSAqLworI2RlZmluZSBQSFlfTF9BTl9QQwkJKDE8PDEwKQkvKiBCaXQgMTA6CVBhdXNlIENhcGFibGUgKi8KKwkJCQkJCQkJLyogQml0ICA5Li41OgkxMDAvMTAgQlQgY2FwIGJpdHMgaW5nbm9yZWQgKi8KKyNkZWZpbmUgUEhZX0xfQU5fU0VMCTB4MWYJLyogQml0IDQuLjA6CVNlbGVjdG9yIEZpZWxkLCAwMDAwMT1FdGhlcm5ldCovCisKKy8qKioqKiAgUEhZX05BVF9BVU5FX0FEVgkxNiBiaXQgci93CUF1dG8tTmVnb3RpYXRpb24gQWR2ZXJ0aXNlbWVudCAqKioqKi8KKy8qKioqKiAgUEhZX05BVF9BVU5FX0xQCQkxNiBiaXQgci9vCUxpbmsgUGFydG5lciBBYmlsaXR5IFJlZyAqKioqKi8KKy8qCVBIWV9BTl9OWFRfUEcJCShzZWUgWE1BQykgQml0IDE1OglSZXF1ZXN0IE5leHQgUGFnZSAqLworCQkJCQkJCQkvKiBCaXQgMTQ6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9OX0FOX1JGCQkoMTw8MTMpCS8qIEJpdCAxMzoJUmVtb3RlIEZhdWx0ICovCisJCQkJCQkJCS8qIEJpdCAxMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX05fQU5fMTAwRgkoMTw8MTEpCS8qIEJpdCAxMToJMTAwQmFzZS1UMiBGRCBTdXBwb3J0ICovCisjZGVmaW5lIFBIWV9OX0FOXzEwMEgJKDE8PDEwKQkvKiBCaXQgMTA6CTEwMEJhc2UtVDIgSEQgU3VwcG9ydCAqLworCQkJCQkJCQkvKiBCaXQgIDkuLjU6CTEwMC8xMCBCVCBjYXAgYml0cyBpbmdub3JlZCAqLworI2RlZmluZSBQSFlfTl9BTl9TRUwJMHgxZgkvKiBCaXQgNC4uMDoJU2VsZWN0b3IgRmllbGQsIDAwMDAxPUV0aGVybmV0Ki8KKworLyogZmllbGQgdHlwZSBkZWZpbml0aW9uIGZvciBQSFlfeF9BTl9TRUwgKi8KKyNkZWZpbmUgUEhZX1NFTF9UWVBFCTB4MDEJLyogMDAwMDEgPSBFdGhlcm5ldCAqLworCisvKioqKiogIFBIWV9YTUFDX0FVTkVfRVhQCTE2IGJpdCByL28JQXV0by1OZWdvdGlhdGlvbiBFeHBhbnNpb24gUmVnICoqKioqLworCQkJCQkJCQkvKiBCaXQgMTUuLjQ6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9BTkVfTFBfTlAJKDE8PDMpCS8qIEJpdCAgMzoJTGluayBQYXJ0bmVyIGNhbiBOZXh0IFBhZ2UgKi8KKyNkZWZpbmUgUEhZX0FORV9MT0NfTlAJKDE8PDIpCS8qIEJpdCAgMjoJTG9jYWwgUEhZIGNhbiBOZXh0IFBhZ2UgKi8KKyNkZWZpbmUgUEhZX0FORV9SWF9QRwkoMTw8MSkJLyogQml0ICAxOglQYWdlIFJlY2VpdmVkICovCisJCQkJCQkJCS8qIEJpdCAgMDoJcmVzZXJ2ZWQgKi8KKworLyoqKioqICBQSFlfQkNPTV9BVU5FX0VYUAkxNiBiaXQgci9vCUF1dG8tTmVnb3RpYXRpb24gRXhwYW5zaW9uIFJlZyAqKioqKi8KKy8qKioqKiAgUEhZX0xPTkVfQVVORV9FWFAJMTYgYml0IHIvbwlBdXRvLU5lZ290aWF0aW9uIEV4cGFuc2lvbiBSZWcgKioqKiovCisvKioqKiogIFBIWV9NQVJWX0FVTkVfRVhQCTE2IGJpdCByL28JQXV0by1OZWdvdGlhdGlvbiBFeHBhbnNpb24gUmVnICoqKioqLworCQkJCQkJCQkvKiBCaXQgMTUuLjU6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9BTkVfUEFSX0RGCSgxPDw0KQkvKiBCaXQgIDQ6CVBhcmFsbGVsIERldGVjdGlvbiBGYXVsdCAqLworLyoJUEhZX0FORV9MUF9OUAkJKHNlZSBYTUFDKSBCaXQgIDM6CUxpbmsgUGFydG5lciBjYW4gTmV4dCBQYWdlICovCisvKglQSFlfQU5FX0xPQ19OUAkJKHNlZSBYTUFDKSBCaXQgIDI6CUxvY2FsIFBIWSBjYW4gTmV4dCBQYWdlICovCisvKglQSFlfQU5FX1JYX1BHCQkoc2VlIFhNQUMpIEJpdCAgMToJUGFnZSBSZWNlaXZlZCAqLworI2RlZmluZSBQSFlfQU5FX0xQX0NBUAkoMTw8MCkJLyogQml0ICAwOglMaW5rIFBhcnRuZXIgQXV0by1OZWcuIENhcC4gKi8gCQorCisvKioqKiogIFBIWV9YTUFDX05FUEcJCTE2IGJpdCByL3cJTmV4dCBQYWdlIFJlZ2lzdGVyICoqKioqLworLyoqKioqICBQSFlfQkNPTV9ORVBHCQkxNiBiaXQgci93CU5leHQgUGFnZSBSZWdpc3RlciAqKioqKi8KKy8qKioqKiAgUEhZX0xPTkVfTkVQRwkJMTYgYml0IHIvdwlOZXh0IFBhZ2UgUmVnaXN0ZXIgKioqKiovCisvKioqKiogIFBIWV9YTUFDX05FUEdfTFAJMTYgYml0IHIvbwlOZXh0IFBhZ2UgTGluayBQYXJ0bmVyICoqKioqLworLyoqKioqICBQSFlfQkNPTV9ORVBHX0xQCTE2IGJpdCByL28JTmV4dCBQYWdlIExpbmsgUGFydG5lciAqKioqKi8KKy8qKioqKiAgUEhZX0xPTkVfTkVQR19MUAkxNiBiaXQgci9vCU5leHQgUGFnZSBMaW5rIFBhcnRuZXIgKioqKiovCisjZGVmaW5lIFBIWV9OUF9NT1JFCQkoMTw8MTUpCS8qIEJpdCAxNToJTW9yZSwgTmV4dCBQYWdlcyB0byBmb2xsb3cgKi8KKyNkZWZpbmUgUEhZX05QX0FDSzEJCSgxPDwxNCkJLyogQml0IDE0OiAocm8pCUFjazEsIGZvciByZWNlaXZpbmcgYSBtZXNzYWdlICovCisjZGVmaW5lIFBIWV9OUF9NU0dfVkFMCSgxPDwxMykJLyogQml0IDEzOglNZXNzYWdlIFBhZ2UgdmFsaWQgKi8KKyNkZWZpbmUgUEhZX05QX0FDSzIJCSgxPDwxMikJLyogQml0IDEyOglBY2syLCBjb21wbHkgd2l0aCBtc2cgY29udGVudCAqLworI2RlZmluZSBQSFlfTlBfVE9HCQkoMTw8MTEpCS8qIEJpdCAxMToJVG9nZ2xlIEJpdCwgZW5zdXJlIHN5bmMgKi8KKyNkZWZpbmUgUEhZX05QX01TRwkJMHgwN2ZmCS8qIEJpdCAxMC4uMDoJTWVzc2FnZSBmcm9tL3RvIExpbmsgUGFydG5lciAqLworCisvKgorICogWE1BQy1TcGVjaWZpYworICovCisvKioqKiogIFBIWV9YTUFDX0VYVF9TVEFUCTE2IGJpdCByL3cJRXh0ZW5kZWQgU3RhdHVzIFJlZ2lzdGVyICoqKioqLworI2RlZmluZSBQSFlfWF9FWF9GRAkJKDE8PDE1KQkvKiBCaXQgMTU6CURldmljZSBTdXBwb3J0cyBGdWxsIER1cGxleCAqLworI2RlZmluZSBQSFlfWF9FWF9IRAkJKDE8PDE0KQkvKiBCaXQgMTQ6CURldmljZSBTdXBwb3J0cyBIYWxmIER1cGxleCAqLworCQkJCQkJCQkvKiBCaXQgMTMuLjA6CXJlc2VydmVkICovCisKKy8qKioqKiAgUEhZX1hNQUNfUkVTX0FCSQkxNiBiaXQgci9vCVBIWSBSZXNvbHZlZCBBYmlsaXR5ICoqKioqLworCQkJCQkJCQkvKiBCaXQgMTUuLjk6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9YX1JTX1BBVVNFCSgzPDw3KQkvKiBCaXQgIDguLjc6CXNlbGVjdGVkIFBhdXNlIE1vZGUgKi8KKyNkZWZpbmUgUEhZX1hfUlNfSEQJCSgxPDw2KQkvKiBCaXQgIDY6CUhhbGYgRHVwbGV4IE1vZGUgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgUEhZX1hfUlNfRkQJCSgxPDw1KQkvKiBCaXQgIDU6CUZ1bGwgRHVwbGV4IE1vZGUgc2VsZWN0ZWQgKi8KKyNkZWZpbmUgUEhZX1hfUlNfQUJMTUlTICgxPDw0KQkvKiBCaXQgIDQ6CWR1cGxleCBvciBwYXVzZSBjYXAgbWlzbWF0Y2ggKi8KKyNkZWZpbmUgUEhZX1hfUlNfUEFVTUlTICgxPDwzKQkvKiBCaXQgIDM6CXBhdXNlIGNhcGFiaWxpdHkgbWlzbWF0Y2ggKi8KKwkJCQkJCQkJLyogQml0ICAyLi4wOglyZXNlcnZlZCAqLworLyoKKyAqIFJlbW90ZSBGYXVsdCBCaXRzIChQSFlfWF9BTl9SRkIpIGVuY29kaW5nCisgKi8KKyNkZWZpbmUgWF9SRkJfT0sJCSgwPDwxMikJLyogQml0IDEzLi4xMglObyBlcnJvcnMsIExpbmsgT0sgKi8KKyNkZWZpbmUgWF9SRkJfTEYJCSgxPDwxMikJLyogQml0IDEzLi4xMglMaW5rIEZhaWx1cmUgKi8KKyNkZWZpbmUgWF9SRkJfT0ZGCQkoMjw8MTIpCS8qIEJpdCAxMy4uMTIJT2ZmbGluZSAqLworI2RlZmluZSBYX1JGQl9BTl9FUlIJKDM8PDEyKQkvKiBCaXQgMTMuLjEyCUF1dG8tTmVnb3RpYXRpb24gRXJyb3IgKi8KKworLyoKKyAqIFBhdXNlIEJpdHMgKFBIWV9YX0FOX1BBVVNFIGFuZCBQSFlfWF9SU19QQVVTRSkgZW5jb2RpbmcKKyAqLworI2RlZmluZSBQSFlfWF9QX05PX1BBVVNFCSgwPDw3KQkvKiBCaXQgIDguLjc6CW5vIFBhdXNlIE1vZGUgKi8KKyNkZWZpbmUgUEhZX1hfUF9TWU1fTUQJCSgxPDw3KQkvKiBCaXQgIDguLjc6CXN5bW1ldHJpYyBQYXVzZSBNb2RlICovCisjZGVmaW5lIFBIWV9YX1BfQVNZTV9NRAkJKDI8PDcpCS8qIEJpdCAgOC4uNzoJYXN5bW1ldHJpYyBQYXVzZSBNb2RlICovCisjZGVmaW5lIFBIWV9YX1BfQk9USF9NRAkJKDM8PDcpCS8qIEJpdCAgOC4uNzoJYm90aCBQYXVzZSBNb2RlICovCisKKworLyoKKyAqIEJyb2FkY29tLVNwZWNpZmljCisgKi8KKy8qKioqKiAgUEhZX0JDT01fMTAwMFRfQ1RSTAkxNiBiaXQgci93CTEwMDBCYXNlLVQgQ29udHJvbCBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9CXzEwMDBDX1RFU1QJKDc8PDEzKQkvKiBCaXQgMTUuLjEzOglUZXN0IE1vZGVzICovCisjZGVmaW5lIFBIWV9CXzEwMDBDX01TRQkJKDE8PDEyKQkvKiBCaXQgMTI6CU1hc3Rlci9TbGF2ZSBFbmFibGUgKi8KKyNkZWZpbmUgUEhZX0JfMTAwMENfTVNDCQkoMTw8MTEpCS8qIEJpdCAxMToJTS9TIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgUEhZX0JfMTAwMENfUkQJCSgxPDwxMCkJLyogQml0IDEwOglSZXBlYXRlci9EVEUgKi8KKyNkZWZpbmUgUEhZX0JfMTAwMENfQUZECQkoMTw8OSkJLyogQml0ICA5OglBZHZlcnRpc2UgRnVsbCBEdXBsZXggKi8KKyNkZWZpbmUgUEhZX0JfMTAwMENfQUhECQkoMTw8OCkJLyogQml0ICA4OglBZHZlcnRpc2UgSGFsZiBEdXBsZXggKi8KKwkJCQkJCQkJCS8qIEJpdCAgNy4uMDoJcmVzZXJ2ZWQgKi8KKworLyoqKioqICBQSFlfQkNPTV8xMDAwVF9TVEFUCTE2IGJpdCByL28JMTAwMEJhc2UtVCBTdGF0dXMgUmVnICoqKioqLworLyoqKioqICBQSFlfTUFSVl8xMDAwVF9TVEFUCTE2IGJpdCByL28JMTAwMEJhc2UtVCBTdGF0dXMgUmVnICoqKioqLworI2RlZmluZSBQSFlfQl8xMDAwU19NU0YJCSgxPDwxNSkJLyogQml0IDE1OglNYXN0ZXIvU2xhdmUgRmF1bHQgKi8KKyNkZWZpbmUgUEhZX0JfMTAwMFNfTVNSCQkoMTw8MTQpCS8qIEJpdCAxNDoJTWFzdGVyL1NsYXZlIFJlc3VsdCAqLworI2RlZmluZSBQSFlfQl8xMDAwU19MUlMJCSgxPDwxMykJLyogQml0IDEzOglMb2NhbCBSZWNlaXZlciBTdGF0dXMgKi8KKyNkZWZpbmUgUEhZX0JfMTAwMFNfUlJTCQkoMTw8MTIpCS8qIEJpdCAxMjoJUmVtb3RlIFJlY2VpdmVyIFN0YXR1cyAqLworI2RlZmluZSBQSFlfQl8xMDAwU19MUF9GRAkoMTw8MTEpCS8qIEJpdCAxMToJTGluayBQYXJ0bmVyIGNhbiBGRCAqLworI2RlZmluZSBQSFlfQl8xMDAwU19MUF9IRAkoMTw8MTApCS8qIEJpdCAxMDoJTGluayBQYXJ0bmVyIGNhbiBIRCAqLworCQkJCQkJCQkJLyogQml0ICA5Li44OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfQl8xMDAwU19JRUMJCTB4ZmYJLyogQml0ICA3Li4wOglJZGxlIEVycm9yIENvdW50ICovCisKKy8qKioqKiAgUEhZX0JDT01fRVhUX1NUQVQJMTYgYml0IHIvbwlFeHRlbmRlZCBTdGF0dXMgUmVnaXN0ZXIgKioqKiovCisjZGVmaW5lIFBIWV9CX0VTX1hfRkRfQ0FQCSgxPDwxNSkJLyogQml0IDE1OgkxMDAwQmFzZS1YIEZEIGNhcGFibGUgKi8KKyNkZWZpbmUgUEhZX0JfRVNfWF9IRF9DQVAJKDE8PDE0KQkvKiBCaXQgMTQ6CTEwMDBCYXNlLVggSEQgY2FwYWJsZSAqLworI2RlZmluZSBQSFlfQl9FU19UX0ZEX0NBUAkoMTw8MTMpCS8qIEJpdCAxMzoJMTAwMEJhc2UtVCBGRCBjYXBhYmxlICovCisjZGVmaW5lIFBIWV9CX0VTX1RfSERfQ0FQCSgxPDwxMikJLyogQml0IDEyOgkxMDAwQmFzZS1UIEhEIGNhcGFibGUgKi8KKwkJCQkJCQkJCS8qIEJpdCAxMS4uMDoJcmVzZXJ2ZWQgKi8KKworLyoqKioqICBQSFlfQkNPTV9QX0VYVF9DVFJMCTE2IGJpdCByL3cJUEhZIEV4dGVuZGVkIENvbnRyb2wgUmVnICoqKioqLworI2RlZmluZSBQSFlfQl9QRUNfTUFDX1BIWQkoMTw8MTUpCS8qIEJpdCAxNToJMTBCSVQvR01JLUludGVyZmFjZSAqLworI2RlZmluZSBQSFlfQl9QRUNfRElTX0NST1NTCSgxPDwxNCkJLyogQml0IDE0OglEaXNhYmxlIE1ESSBDcm9zc292ZXIgKi8KKyNkZWZpbmUgUEhZX0JfUEVDX1RYX0RJUwkoMTw8MTMpCS8qIEJpdCAxMzoJVHggb3V0cHV0IERpc2FibGVkICovCisjZGVmaW5lIFBIWV9CX1BFQ19JTlRfRElTCSgxPDwxMikJLyogQml0IDEyOglJbnRlcnJ1cHRzIERpc2FibGVkICovCisjZGVmaW5lIFBIWV9CX1BFQ19GX0lOVAkJKDE8PDExKQkvKiBCaXQgMTE6CUZvcmNlIEludGVycnVwdCAqLworI2RlZmluZSBQSFlfQl9QRUNfQllfNDUJCSgxPDwxMCkJLyogQml0IDEwOglCeXBhc3MgNEI1Qi1EZWNvZGVyICovCisjZGVmaW5lIFBIWV9CX1BFQ19CWV9TQ1IJKDE8PDkpCS8qIEJpdCAgOToJQnlwYXNzIFNjcmFtYmxlciAqLworI2RlZmluZSBQSFlfQl9QRUNfQllfTUxUMwkoMTw8OCkJLyogQml0ICA4OglCeXBhc3MgTUxUMyBFbmNvZGVyICovCisjZGVmaW5lIFBIWV9CX1BFQ19CWV9SWEEJKDE8PDcpCS8qIEJpdCAgNzoJQnlwYXNzIFJ4IEFsaWdubS4gKi8KKyNkZWZpbmUgUEhZX0JfUEVDX1JFU19TQ1IJKDE8PDYpCS8qIEJpdCAgNjoJUmVzZXQgU2NyYW1ibGVyICovCisjZGVmaW5lIFBIWV9CX1BFQ19FTl9MVFIJKDE8PDUpCS8qIEJpdCAgNToJRW5hIExFRCBUcmFmZmljIE1vZGUgKi8KKyNkZWZpbmUgUEhZX0JfUEVDX0xFRF9PTgkoMTw8NCkJLyogQml0ICA0OglGb3JjZSBMRUQncyBvbiAqLworI2RlZmluZSBQSFlfQl9QRUNfTEVEX09GRgkoMTw8MykJLyogQml0ICAzOglGb3JjZSBMRUQncyBvZmYgKi8KKyNkZWZpbmUgUEhZX0JfUEVDX0VYX0lQRwkoMTw8MikJLyogQml0ICAyOglFeHRlbmQgVHggSVBHIE1vZGUgKi8KKyNkZWZpbmUgUEhZX0JfUEVDXzNfTEVECQkoMTw8MSkJLyogQml0ICAxOglUaHJlZSBMaW5rIExFRCBtb2RlICovCisjZGVmaW5lIFBIWV9CX1BFQ19ISUdIX0xBCSgxPDwwKQkvKiBCaXQgIDA6CUdNSUkgRklGTyBFbGFzdGljeSAqLworCisvKioqKiogIFBIWV9CQ09NX1BfRVhUX1NUQVQJMTYgYml0IHIvbwlQSFkgRXh0ZW5kZWQgU3RhdHVzIFJlZyAqKioqKi8KKwkJCQkJCQkJCS8qIEJpdCAxNS4uMTQ6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9CX1BFU19DUk9TU19TVEFUCSgxPDwxMykJLyogQml0IDEzOglNREkgQ3Jvc3NvdmVyIFN0YXR1cyAqLworI2RlZmluZSBQSFlfQl9QRVNfSU5UX1NUQVQJKDE8PDEyKQkvKiBCaXQgMTI6CUludGVycnVwdCBTdGF0dXMgKi8KKyNkZWZpbmUgUEhZX0JfUEVTX1JSUwkJKDE8PDExKQkvKiBCaXQgMTE6CVJlbW90ZSBSZWNlaXZlciBTdGF0LiAqLworI2RlZmluZSBQSFlfQl9QRVNfTFJTCQkoMTw8MTApCS8qIEJpdCAxMDoJTG9jYWwgUmVjZWl2ZXIgU3RhdC4gKi8KKyNkZWZpbmUgUEhZX0JfUEVTX0xPQ0tFRAkoMTw8OSkJLyogQml0ICA5OglMb2NrZWQgKi8KKyNkZWZpbmUgUEhZX0JfUEVTX0xTCQkoMTw8OCkJLyogQml0ICA4OglMaW5rIFN0YXR1cyAqLworI2RlZmluZSBQSFlfQl9QRVNfUkYJCSgxPDw3KQkvKiBCaXQgIDc6CVJlbW90ZSBGYXVsdCAqLworI2RlZmluZSBQSFlfQl9QRVNfQ0VfRVIJCSgxPDw2KQkvKiBCaXQgIDY6CUNhcnJpZXIgRXh0IEVycm9yICovCisjZGVmaW5lIFBIWV9CX1BFU19CQURfU1NECSgxPDw1KQkvKiBCaXQgIDU6CUJhZCBTU0QgKi8KKyNkZWZpbmUgUEhZX0JfUEVTX0JBRF9FU0QJKDE8PDQpCS8qIEJpdCAgNDoJQmFkIEVTRCAqLworI2RlZmluZSBQSFlfQl9QRVNfUlhfRVIJCSgxPDwzKQkvKiBCaXQgIDM6CVJlY2VpdmUgRXJyb3IgKi8KKyNkZWZpbmUgUEhZX0JfUEVTX1RYX0VSCQkoMTw8MikJLyogQml0ICAyOglUcmFuc21pdCBFcnJvciAqLworI2RlZmluZSBQSFlfQl9QRVNfTE9DS19FUgkoMTw8MSkJLyogQml0ICAxOglMb2NrIEVycm9yICovCisjZGVmaW5lIFBIWV9CX1BFU19NTFQzX0VSCSgxPDwwKQkvKiBCaXQgIDA6CU1MVDMgY29kZSBFcnJvciAqLworCisvKioqKiogIFBIWV9CQ09NX0ZDX0NUUgkJMTYgYml0IHIvdwlGYWxzZSBDYXJyaWVyIENvdW50ZXIgKioqKiovCisJCQkJCQkJCQkvKiBCaXQgMTUuLjg6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9CX0ZDX0NUUgkJMHhmZgkvKiBCaXQgIDcuLjA6CUZhbHNlIENhcnJpZXIgQ291bnRlciAqLworCisvKioqKiogIFBIWV9CQ09NX1JOT19DVFIJMTYgYml0IHIvdwlSZWNlaXZlIE5PVF9PSyBDb3VudGVyICoqKioqLworI2RlZmluZSBQSFlfQl9SQ19MT0NfTVNLCTB4ZmYwMAkvKiBCaXQgMTUuLjg6CUxvY2FsIFJ4IE5PVF9PSyBjbnQgKi8KKyNkZWZpbmUgUEhZX0JfUkNfUkVNX01TSwkweDAwZmYJLyogQml0ICA3Li4wOglSZW1vdGUgUnggTk9UX09LIGNudCAqLworCisvKioqKiogIFBIWV9CQ09NX0FVWF9DVFJMCTE2IGJpdCByL3cJQXV4aWxpYXJ5IENvbnRyb2wgUmVnICoqKioqLworI2RlZmluZSBQSFlfQl9BQ19MX1NRRQkJKDE8PDE1KQkvKiBCaXQgMTU6CUxvdyBTcXVlbGNoICovCisjZGVmaW5lIFBIWV9CX0FDX0xPTkdfUEFDSwkoMTw8MTQpCS8qIEJpdCAxNDoJUnggTG9uZyBQYWNrZXRzICovCisjZGVmaW5lIFBIWV9CX0FDX0VSX0NUUkwJKDM8PDEyKQkvKiBCaXQgMTMuLjEyOglFZGdlcmF0ZSBDb250cm9sICovCisJCQkJCQkJCQkvKiBCaXQgMTE6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9CX0FDX1RYX1RTVAkJKDE8PDEwKSAvKiBCaXQgMTA6CVR4IHRlc3QgYml0LCBhbHdheXMgMSAqLworCQkJCQkJCQkJLyogQml0ICA5Li4gODoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX0JfQUNfRElTX1BSRgkoMTw8NykJLyogQml0ICA3OglkaXMgcGFydCByZXNwIGZpbHRlciAqLworCQkJCQkJCQkJLyogQml0ICA2OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfQl9BQ19ESVNfUE0JCSgxPDw1KQkvKiBCaXQgIDU6CWRpcyBwb3dlciBtYW5hZ2VtZW50ICovCisJCQkJCQkJCQkvKiBCaXQgIDQ6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9CX0FDX0RJQUcJCSgxPDwzKQkvKiBCaXQgIDM6CURpYWdub3N0aWMgTW9kZSAqLworCQkJCQkJCQkJLyogQml0ICAyLi4gMDoJcmVzZXJ2ZWQgKi8KKworLyoqKioqICBQSFlfQkNPTV9BVVhfU1RBVAkxNiBiaXQgci9vCUF1eGlsaWFyeSBTdGF0dXMgUmVnICoqKioqLworI2RlZmluZSBQSFlfQl9BU19BTl9DCQkoMTw8MTUpCS8qIEJpdCAxNToJQXV0b05lZyBjb21wbGV0ZSAqLworI2RlZmluZSBQSFlfQl9BU19BTl9DQQkJKDE8PDE0KQkvKiBCaXQgMTQ6CUFOIENvbXBsZXRlIEFjayAqLworI2RlZmluZSBQSFlfQl9BU19BTkFDS19ECSgxPDwxMykJLyogQml0IDEzOglBTiBBY2sgRGV0ZWN0ICovCisjZGVmaW5lIFBIWV9CX0FTX0FOQUJfRAkJKDE8PDEyKQkvKiBCaXQgMTI6CUFOIEFiaWxpdHkgRGV0ZWN0ICovCisjZGVmaW5lIFBIWV9CX0FTX05QVwkJKDE8PDExKQkvKiBCaXQgMTE6CUFOIE5leHQgUGFnZSBXYWl0ICovCisjZGVmaW5lIFBIWV9CX0FTX0FOX1JFU19NU0sJKDc8PDgpCS8qIEJpdCAxMC4uODoJQU4gSERDICovCisjZGVmaW5lIFBIWV9CX0FTX1BERgkJKDE8PDcpCS8qIEJpdCAgNzoJUGFyYWxsZWwgRGV0ZWN0LiBGYXVsdCAqLworI2RlZmluZSBQSFlfQl9BU19SRgkJCSgxPDw2KQkvKiBCaXQgIDY6CVJlbW90ZSBGYXVsdCAqLworI2RlZmluZSBQSFlfQl9BU19BTlBfUgkJKDE8PDUpCS8qIEJpdCAgNToJQU4gUGFnZSBSZWNlaXZlZCAqLworI2RlZmluZSBQSFlfQl9BU19MUF9BTkFCCSgxPDw0KQkvKiBCaXQgIDQ6CUxQIEFOIEFiaWxpdHkgKi8KKyNkZWZpbmUgUEhZX0JfQVNfTFBfTlBBQgkoMTw8MykJLyogQml0ICAzOglMUCBOZXh0IFBhZ2UgQWJpbGl0eSAqLworI2RlZmluZSBQSFlfQl9BU19MUwkJCSgxPDwyKQkvKiBCaXQgIDI6CUxpbmsgU3RhdHVzICovCisjZGVmaW5lIFBIWV9CX0FTX1BSUgkJKDE8PDEpCS8qIEJpdCAgMToJUGF1c2UgUmVzb2x1dGlvbi1SeCAqLworI2RlZmluZSBQSFlfQl9BU19QUlQJCSgxPDwwKQkvKiBCaXQgIDA6CVBhdXNlIFJlc29sdXRpb24tVHggKi8KKworI2RlZmluZSBQSFlfQl9BU19QQVVTRV9NU0sJKFBIWV9CX0FTX1BSUiB8IFBIWV9CX0FTX1BSVCkKKworLyoqKioqICBQSFlfQkNPTV9JTlRfU1RBVAkxNiBiaXQgci9vCUludGVycnVwdCBTdGF0dXMgUmVnICoqKioqLworLyoqKioqICBQSFlfQkNPTV9JTlRfTUFTSwkxNiBiaXQgci93CUludGVycnVwdCBNYXNrIFJlZyAqKioqKi8KKwkJCQkJCQkJCS8qIEJpdCAxNToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX0JfSVNfUFNFCQkoMTw8MTQpCS8qIEJpdCAxNDoJUGFpciBTd2FwIEVycm9yICovCisjZGVmaW5lIFBIWV9CX0lTX01EWElfU0MJKDE8PDEzKQkvKiBCaXQgMTM6CU1ESVggU3RhdHVzIENoYW5nZSAqLworI2RlZmluZSBQSFlfQl9JU19IQ1QJCSgxPDwxMikJLyogQml0IDEyOgljb3VudGVyIGFib3ZlIDMyayAqLworI2RlZmluZSBQSFlfQl9JU19MQ1QJCSgxPDwxMSkJLyogQml0IDExOgljb3VudGVyIGFib3ZlIDEyOCAqLworI2RlZmluZSBQSFlfQl9JU19BTl9QUgkJKDE8PDEwKQkvKiBCaXQgMTA6CVBhZ2UgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgUEhZX0JfSVNfTk9fSERDTAkoMTw8OSkJLyogQml0ICA5OglObyBIQ0QgTGluayAqLworI2RlZmluZSBQSFlfQl9JU19OT19IREMJCSgxPDw4KQkvKiBCaXQgIDg6CU5vIEhDRCAqLworI2RlZmluZSBQSFlfQl9JU19ORUdfVVNIREMJKDE8PDcpCS8qIEJpdCAgNzoJTmVnb3RpYXRlZCBVbnN1cC4gSENEICovCisjZGVmaW5lIFBIWV9CX0lTX1NDUl9TX0VSCSgxPDw2KQkvKiBCaXQgIDY6CVNjcmFtYmxlciBTeW5jIEVycm9yICovCisjZGVmaW5lIFBIWV9CX0lTX1JSU19DSEFOR0UJKDE8PDUpCS8qIEJpdCAgNToJUmVtb3RlIFJ4IFN0YXQgQ2hhbmdlICovCisjZGVmaW5lIFBIWV9CX0lTX0xSU19DSEFOR0UJKDE8PDQpCS8qIEJpdCAgNDoJTG9jYWwgUnggU3RhdCBDaGFuZ2UgKi8KKyNkZWZpbmUgUEhZX0JfSVNfRFVQX0NIQU5HRQkoMTw8MykJLyogQml0ICAzOglEdXBsZXggTW9kZSBDaGFuZ2UgKi8KKyNkZWZpbmUgUEhZX0JfSVNfTFNQX0NIQU5HRQkoMTw8MikJLyogQml0ICAyOglMaW5rIFNwZWVkIENoYW5nZSAqLworI2RlZmluZSBQSFlfQl9JU19MU1RfQ0hBTkdFCSgxPDwxKQkvKiBCaXQgIDE6CUxpbmsgU3RhdHVzIENoYW5nZWQgKi8KKyNkZWZpbmUgUEhZX0JfSVNfQ1JDX0VSCQkoMTw8MCkJLyogQml0ICAwOglDUkMgRXJyb3IgKi8KKworI2RlZmluZSBQSFlfQl9ERUZfTVNLCSh+KFBIWV9CX0lTX0FOX1BSIHwgUEhZX0JfSVNfTFNUX0NIQU5HRSkpCisKKy8qIFBhdXNlIEJpdHMgKFBIWV9CX0FOX0FTUCBhbmQgUEhZX0JfQU5fUEMpIGVuY29kaW5nICovCisjZGVmaW5lIFBIWV9CX1BfTk9fUEFVU0UJKDA8PDEwKQkvKiBCaXQgMTEuLjEwOglubyBQYXVzZSBNb2RlICovCisjZGVmaW5lIFBIWV9CX1BfU1lNX01ECQkoMTw8MTApCS8qIEJpdCAxMS4uMTA6CXN5bW1ldHJpYyBQYXVzZSBNb2RlICovCisjZGVmaW5lIFBIWV9CX1BfQVNZTV9NRAkJKDI8PDEwKQkvKiBCaXQgMTEuLjEwOglhc3ltbWV0cmljIFBhdXNlIE1vZGUgKi8KKyNkZWZpbmUgUEhZX0JfUF9CT1RIX01ECQkoMzw8MTApCS8qIEJpdCAxMS4uMTA6CWJvdGggUGF1c2UgTW9kZSAqLworCisvKgorICogUmVzb2x2ZWQgRHVwbGV4IG1vZGUgYW5kIENhcGFiaWxpdGllcyAoQXV4IFN0YXR1cyBTdW1tYXJ5IFJlZykKKyAqLworI2RlZmluZSBQSFlfQl9SRVNfMTAwMEZECSg3PDw4KQkvKiBCaXQgMTAuLjg6CTEwMDBCYXNlLVQgRnVsbCBEdXAuICovCisjZGVmaW5lIFBIWV9CX1JFU18xMDAwSEQJKDY8PDgpCS8qIEJpdCAxMC4uODoJMTAwMEJhc2UtVCBIYWxmIER1cC4gKi8KKy8qIG90aGVyczogMTAwLzEwOiBpbnZhbGlkIGZvciB1cyAqLworCisvKgorICogTGV2ZWwgT25lLVNwZWNpZmljCisgKi8KKy8qKioqKiAgUEhZX0xPTkVfMTAwMFRfQ1RSTAkxNiBiaXQgci93CTEwMDBCYXNlLVQgQ29udHJvbCBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9MXzEwMDBDX1RFU1QJKDc8PDEzKQkvKiBCaXQgMTUuLjEzOglUZXN0IE1vZGVzICovCisjZGVmaW5lIFBIWV9MXzEwMDBDX01TRQkJKDE8PDEyKQkvKiBCaXQgMTI6CU1hc3Rlci9TbGF2ZSBFbmFibGUgKi8KKyNkZWZpbmUgUEhZX0xfMTAwMENfTVNDCQkoMTw8MTEpCS8qIEJpdCAxMToJTS9TIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgUEhZX0xfMTAwMENfUkQJCSgxPDwxMCkJLyogQml0IDEwOglSZXBlYXRlci9EVEUgKi8KKyNkZWZpbmUgUEhZX0xfMTAwMENfQUZECQkoMTw8OSkJLyogQml0ICA5OglBZHZlcnRpc2UgRnVsbCBEdXBsZXggKi8KKyNkZWZpbmUgUEhZX0xfMTAwMENfQUhECQkoMTw8OCkJLyogQml0ICA4OglBZHZlcnRpc2UgSGFsZiBEdXBsZXggKi8KKwkJCQkJCQkJCS8qIEJpdCAgNy4uMDoJcmVzZXJ2ZWQgKi8KKworLyoqKioqICBQSFlfTE9ORV8xMDAwVF9TVEFUCTE2IGJpdCByL28JMTAwMEJhc2UtVCBTdGF0dXMgUmVnICoqKioqLworI2RlZmluZSBQSFlfTF8xMDAwU19NU0YJCSgxPDwxNSkJLyogQml0IDE1OglNYXN0ZXIvU2xhdmUgRmF1bHQgKi8KKyNkZWZpbmUgUEhZX0xfMTAwMFNfTVNSCQkoMTw8MTQpCS8qIEJpdCAxNDoJTWFzdGVyL1NsYXZlIFJlc3VsdCAqLworI2RlZmluZSBQSFlfTF8xMDAwU19MUlMJCSgxPDwxMykJLyogQml0IDEzOglMb2NhbCBSZWNlaXZlciBTdGF0dXMgKi8KKyNkZWZpbmUgUEhZX0xfMTAwMFNfUlJTCQkoMTw8MTIpCS8qIEJpdCAxMjoJUmVtb3RlIFJlY2VpdmVyIFN0YXR1cyAqLworI2RlZmluZSBQSFlfTF8xMDAwU19MUF9GRAkoMTw8MTEpCS8qIEJpdCAxMToJTGluayBQYXJ0bmVyIGNhbiBGRCAqLworI2RlZmluZSBQSFlfTF8xMDAwU19MUF9IRAkoMTw8MTApCS8qIEJpdCAxMDoJTGluayBQYXJ0bmVyIGNhbiBIRCAqLworCQkJCQkJCQkJLyogQml0ICA5Li44OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfQl8xMDAwU19JRUMJCTB4ZmYJLyogQml0ICA3Li4wOglJZGxlIEVycm9yIENvdW50ICovCisKKy8qKioqKiAgUEhZX0xPTkVfRVhUX1NUQVQJMTYgYml0IHIvbwlFeHRlbmRlZCBTdGF0dXMgUmVnaXN0ZXIgKioqKiovCisjZGVmaW5lIFBIWV9MX0VTX1hfRkRfQ0FQCSgxPDwxNSkJLyogQml0IDE1OgkxMDAwQmFzZS1YIEZEIGNhcGFibGUgKi8KKyNkZWZpbmUgUEhZX0xfRVNfWF9IRF9DQVAJKDE8PDE0KQkvKiBCaXQgMTQ6CTEwMDBCYXNlLVggSEQgY2FwYWJsZSAqLworI2RlZmluZSBQSFlfTF9FU19UX0ZEX0NBUAkoMTw8MTMpCS8qIEJpdCAxMzoJMTAwMEJhc2UtVCBGRCBjYXBhYmxlICovCisjZGVmaW5lIFBIWV9MX0VTX1RfSERfQ0FQCSgxPDwxMikJLyogQml0IDEyOgkxMDAwQmFzZS1UIEhEIGNhcGFibGUgKi8KKwkJCQkJCQkJCS8qIEJpdCAxMS4uMDoJcmVzZXJ2ZWQgKi8KKworLyoqKioqICBQSFlfTE9ORV9QT1JUX0NGRwkxNiBiaXQgci93CVBvcnQgQ29uZmlndXJhdGlvbiBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9MX1BDX1JFUF9NT0RFCSgxPDwxNSkJLyogQml0IDE1OglSZXBlYXRlciBNb2RlICovCisJCQkJCQkJCQkvKiBCaXQgMTQ6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9MX1BDX1RYX0RJUwkJKDE8PDEzKQkvKiBCaXQgMTM6CVR4IG91dHB1dCBEaXNhYmxlZCAqLworI2RlZmluZSBQSFlfTF9QQ19CWV9TQ1IJCSgxPDwxMikJLyogQml0IDEyOglCeXBhc3MgU2NyYW1ibGVyICovCisjZGVmaW5lIFBIWV9MX1BDX0JZXzQ1CQkoMTw8MTEpCS8qIEJpdCAxMToJQnlwYXNzIDRCNUItRGVjb2RlciAqLworI2RlZmluZSBQSFlfTF9QQ19KQUJfRElTCSgxPDwxMCkJLyogQml0IDEwOglKYWJiZXIgRGlzYWJsZWQgKi8KKyNkZWZpbmUgUEhZX0xfUENfU1FFCQkoMTw8OSkJLyogQml0ICA5OglFbmFibGUgSGVhcnRiZWF0ICovCisjZGVmaW5lIFBIWV9MX1BDX1RQX0xPT1AJKDE8PDgpCS8qIEJpdCAgODoJVFAgTG9vcGJhY2sgKi8KKyNkZWZpbmUgUEhZX0xfUENfU1NTCQkoMTw8NykJLyogQml0ICA3OglTbWFydCBTcGVlZCBTZWxlY3Rpb24gKi8KKyNkZWZpbmUgUEhZX0xfUENfRklGT19TSVpFCSgxPDw2KQkvKiBCaXQgIDY6CUZJRk8gU2l6ZSAqLworI2RlZmluZSBQSFlfTF9QQ19QUkVfRU4JCSgxPDw1KQkvKiBCaXQgIDU6CVByZWFtYmxlIEVuYWJsZSAqLworI2RlZmluZSBQSFlfTF9QQ19DSU0JCSgxPDw0KQkvKiBCaXQgIDQ6CUNhcnJpZXIgSW50ZWdyaXR5IE1vbiAqLworI2RlZmluZSBQSFlfTF9QQ18xMF9TRVIJCSgxPDwzKQkvKiBCaXQgIDM6CVVzZSBTZXJpYWwgT3V0cHV0ICovCisjZGVmaW5lIFBIWV9MX1BDX0FOSVNPTAkJKDE8PDIpCS8qIEJpdCAgMjoJVW5pc29sYXRlIFBvcnQgKi8KKyNkZWZpbmUgUEhZX0xfUENfVEVOX0JJVAkoMTw8MSkJLyogQml0ICAxOgkxMGJpdCBpZmFjZSBtb2RlIG9uICovCisjZGVmaW5lIFBIWV9MX1BDX0FMVENMT0NLCSgxPDwwKQkvKiBCaXQgIDA6IChybykJQUxUQ0xPQ0sgTW9kZSBvbiAqLworCisvKioqKiogIFBIWV9MT05FX1FfU1RBVAkJMTYgYml0IHIvbwlRdWljayBTdGF0dXMgUmVnICoqKioqLworI2RlZmluZSBQSFlfTF9RU19EX1JBVEUJCSgzPDwxNCkJLyogQml0IDE1Li4xNDoJRGF0YSBSYXRlICovCisjZGVmaW5lIFBIWV9MX1FTX1RYX1NUQVQJKDE8PDEzKQkvKiBCaXQgMTM6CVRyYW5zbWl0dGluZyAqLworI2RlZmluZSBQSFlfTF9RU19SWF9TVEFUCSgxPDwxMikJLyogQml0IDEyOglSZWNlaXZpbmcgKi8KKyNkZWZpbmUgUEhZX0xfUVNfQ09MX1NUQVQJKDE8PDExKQkvKiBCaXQgMTE6CUNvbGxpc2lvbiAqLworI2RlZmluZSBQSFlfTF9RU19MX1NUQVQJCSgxPDwxMCkJLyogQml0IDEwOglMaW5rIGlzIHVwICovCisjZGVmaW5lIFBIWV9MX1FTX0RVUF9NT0QJKDE8PDkpCS8qIEJpdCAgOToJRnVsbC9IYWxmIER1cGxleCAqLworI2RlZmluZSBQSFlfTF9RU19BTgkJCSgxPDw4KQkvKiBCaXQgIDg6CUF1dG9OZWcgaXMgT24gKi8KKyNkZWZpbmUgUEhZX0xfUVNfQU5fQwkJKDE8PDcpCS8qIEJpdCAgNzoJQU4gaXMgQ29tcGxldGUgKi8KKyNkZWZpbmUgUEhZX0xfUVNfTExFCQkoNzw8NCkJLyogQml0ICA2OglMaW5lIExlbmd0aCBFc3RpbS4gKi8KKyNkZWZpbmUgUEhZX0xfUVNfUEFVU0UJCSgxPDwzKQkvKiBCaXQgIDM6CUxQIGFkdmVydGlzZWQgUGF1c2UgKi8KKyNkZWZpbmUgUEhZX0xfUVNfQVNfUEFVU0UJKDE8PDIpCS8qIEJpdCAgMjoJTFAgYWR2LiBhc3ltLiBQYXVzZSAqLworI2RlZmluZSBQSFlfTF9RU19JU09MQVRFCSgxPDwxKQkvKiBCaXQgIDE6CUNJTSBJc29sYXRlZCAqLworI2RlZmluZSBQSFlfTF9RU19FVkVOVAkJKDE8PDApCS8qIEJpdCAgMDoJRXZlbnQgaGFzIG9jY3VycmVkICovCisKKy8qKioqKiAgUEhZX0xPTkVfSU5UX0VOQUIJMTYgYml0IHIvdwlJbnRlcnJ1cHQgRW5hYmxlIFJlZyAqKioqKi8KKy8qKioqKiAgUEhZX0xPTkVfSU5UX1NUQVQJMTYgYml0IHIvbwlJbnRlcnJ1cHQgU3RhdHVzIFJlZyAqKioqKi8KKwkJCQkJCQkJCS8qIEJpdCAxNS4uMTQ6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9MX0lTX0FOX0YJCSgxPDwxMykJLyogQml0IDEzOglBdXRvLU5lZ290aWF0aW9uIGZhdWx0ICovCisJCQkJCQkJCQkvKiBCaXQgMTI6CW5vdCBkZXNjcmliZWQgKi8KKyNkZWZpbmUgUEhZX0xfSVNfQ1JPU1MJCSgxPDwxMSkJLyogQml0IDExOglDcm9zc292ZXIgdXNlZCAqLworI2RlZmluZSBQSFlfTF9JU19QT0wJCSgxPDwxMCkJLyogQml0IDEwOglQb2xhcml0eSBjb3JyZWN0LiB1c2VkICovCisjZGVmaW5lIFBIWV9MX0lTX1NTCQkJKDE8PDkpCS8qIEJpdCAgOToJU21hcnQgU3BlZWQgRG93bmdyYWRlICovCisjZGVmaW5lIFBIWV9MX0lTX0NGVUxMCQkoMTw8OCkJLyogQml0ICA4OglDb3VudGVyIEZ1bGwgKi8KKyNkZWZpbmUgUEhZX0xfSVNfQU5fQwkJKDE8PDcpCS8qIEJpdCAgNzoJQXV0b05lZyBDb21wbGV0ZSAqLworI2RlZmluZSBQSFlfTF9JU19TUEVFRAkJKDE8PDYpCS8qIEJpdCAgNjoJU3BlZWQgQ2hhbmdlZCAqLworI2RlZmluZSBQSFlfTF9JU19EVVAJCSgxPDw1KQkvKiBCaXQgIDU6CUR1cGxleCBDaGFuZ2VkICovCisjZGVmaW5lIFBIWV9MX0lTX0xTCQkJKDE8PDQpCS8qIEJpdCAgNDoJTGluayBTdGF0dXMgQ2hhbmdlZCAqLworI2RlZmluZSBQSFlfTF9JU19JU09MCQkoMTw8MykJLyogQml0ICAzOglJc29sYXRlIE9jY3VyZWQgKi8KKyNkZWZpbmUgUEhZX0xfSVNfTURJTlQJCSgxPDwyKQkvKiBCaXQgIDI6IChybykJU1RBVDogTUlJIEludCBQZW5kaW5nICovCisjZGVmaW5lIFBIWV9MX0lTX0lOVEVOCQkoMTw8MSkJLyogQml0ICAxOglFTkFCOiBFbmFibGUgSVJRcyAqLworI2RlZmluZSBQSFlfTF9JU19GT1JDRQkJKDE8PDApCS8qIEJpdCAgMDoJRU5BQjogRm9yY2UgSW50ZXJydXB0ICovCisKKy8qIGludC4gbWFzayAqLworI2RlZmluZSBQSFlfTF9ERUZfTVNLCQkoUEhZX0xfSVNfTFMgfCBQSFlfTF9JU19JU09MIHwgUEhZX0xfSVNfSU5URU4pCisKKy8qKioqKiAgUEhZX0xPTkVfTEVEX0NGRwkxNiBiaXQgci93CUxFRCBDb25maWd1cmF0aW9uIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX0xfTENfTEVEQwkJKDM8PDE0KQkvKiBCaXQgMTUuLjE0OglDb2wvQmxpbmsvT24vT2ZmICovCisjZGVmaW5lIFBIWV9MX0xDX0xFRFIJCSgzPDwxMikJLyogQml0IDEzLi4xMjoJUngvQmxpbmsvT24vT2ZmICovCisjZGVmaW5lIFBIWV9MX0xDX0xFRFQJCSgzPDwxMCkJLyogQml0IDExLi4xMDoJVHgvQmxpbmsvT24vT2ZmICovCisjZGVmaW5lIFBIWV9MX0xDX0xFREcJCSgzPDw4KQkvKiBCaXQgIDkuLjg6CUdpZ2EvQmxpbmsvT24vT2ZmICovCisjZGVmaW5lIFBIWV9MX0xDX0xFRFMJCSgzPDw2KQkvKiBCaXQgIDcuLjY6CTEwLTEwMC9CbGluay9Pbi9PZmYgKi8KKyNkZWZpbmUgUEhZX0xfTENfTEVETAkJKDM8PDQpCS8qIEJpdCAgNS4uNDoJTGluay9CbGluay9Pbi9PZmYgKi8KKyNkZWZpbmUgUEhZX0xfTENfTEVERgkJKDM8PDIpCS8qIEJpdCAgMy4uMjoJRHVwbGV4L0JsaW5rL09uL09mZiAqLworI2RlZmluZSBQSFlfTF9MQ19QU1RSRUNICSgxPDwxKQkvKiBCaXQgIDE6CVN0cmVjaCBMRUQgUHVsc2VzICovCisjZGVmaW5lIFBIWV9MX0xDX0ZSRVEJCSgxPDwwKQkvKiBCaXQgIDA6CTMwLzEwMCBtcyAqLworCisvKioqKiogIFBIWV9MT05FX1BPUlRfQ1RSTAkxNiBiaXQgci93CVBvcnQgQ29udHJvbCBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9MX1BDX1RYX1RDTEsJKDE8PDE1KQkvKiBCaXQgMTU6CUVuYWJsZSBUWF9UQ0xLICovCisJCQkJCQkJCQkvKiBCaXQgMTQ6CXJlc2VydmVkICovCisjZGVmaW5lIFBIWV9MX1BDX0FMVF9OUAkJKDE8PDEzKQkvKiBCaXQgMTQ6CUFsdGVybmF0ZSBOZXh0IFBhZ2UgKi8KKyNkZWZpbmUgUEhZX0xfUENfR01JSV9BTFQJKDE8PDEyKQkvKiBCaXQgMTM6CUFsdGVybmF0ZSBHTUlJIGRyaXZlciAqLworCQkJCQkJCQkJLyogQml0IDExOglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfTF9QQ19URU5fQ1JTCSgxPDwxMCkJLyogQml0IDEwOglFeHRlbmQgQ1JTKi8KKwkJCQkJCQkJCS8qIEJpdCAgOS4uMDoJbm90IGRlc2NyaWJlZCAqLworCisvKioqKiogIFBIWV9MT05FX0NJTQkJMTYgYml0IHIvbwlDSU0gUmVnICoqKioqLworI2RlZmluZSBQSFlfTF9DSU1fSVNPTAkJKDI1NTw8OCkvKiBCaXQgMTUuLjg6CUlzb2xhdGUgQ291bnQgKi8KKyNkZWZpbmUgUEhZX0xfQ0lNX0ZBTFNFX0NBUgkoMjU1PDwwKS8qIEJpdCAgNy4uMDoJRmFsc2UgQ2FycmllciBDb3VudCAqLworCisKKy8qCisgKiBQYXVzZSBCaXRzIChQSFlfTF9BTl9BU1AgYW5kIFBIWV9MX0FOX1BDKSBlbmNvZGluZworICovCisjZGVmaW5lIFBIWV9MX1BfTk9fUEFVU0UJKDA8PDEwKQkvKiBCaXQgMTEuLjEwOglubyBQYXVzZSBNb2RlICovCisjZGVmaW5lIFBIWV9MX1BfU1lNX01ECQkoMTw8MTApCS8qIEJpdCAxMS4uMTA6CXN5bW1ldHJpYyBQYXVzZSBNb2RlICovCisjZGVmaW5lIFBIWV9MX1BfQVNZTV9NRAkJKDI8PDEwKQkvKiBCaXQgMTEuLjEwOglhc3ltbWV0cmljIFBhdXNlIE1vZGUgKi8KKyNkZWZpbmUgUEhZX0xfUF9CT1RIX01ECQkoMzw8MTApCS8qIEJpdCAxMS4uMTA6CWJvdGggUGF1c2UgTW9kZSAqLworCisKKy8qCisgKiBOYXRpb25hbC1TcGVjaWZpYworICovCisvKioqKiogIFBIWV9OQVRfMTAwMFRfQ1RSTAkxNiBiaXQgci93CTEwMDBCYXNlLVQgQ29udHJvbCBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9OXzEwMDBDX1RFU1QJKDc8PDEzKQkvKiBCaXQgMTUuLjEzOglUZXN0IE1vZGVzICovCisjZGVmaW5lIFBIWV9OXzEwMDBDX01TRQkJKDE8PDEyKQkvKiBCaXQgMTI6CU1hc3Rlci9TbGF2ZSBFbmFibGUgKi8KKyNkZWZpbmUgUEhZX05fMTAwMENfTVNDCQkoMTw8MTEpCS8qIEJpdCAxMToJTS9TIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgUEhZX05fMTAwMENfUkQJCSgxPDwxMCkJLyogQml0IDEwOglSZXBlYXRlci9EVEUgKi8KKyNkZWZpbmUgUEhZX05fMTAwMENfQUZECQkoMTw8OSkJLyogQml0ICA5OglBZHZlcnRpc2UgRnVsbCBEdXBsZXggKi8KKyNkZWZpbmUgUEhZX05fMTAwMENfQUhECQkoMTw8OCkJLyogQml0ICA4OglBZHZlcnRpc2UgSGFsZiBEdXBsZXggKi8KKyNkZWZpbmUgUEhZX05fMTAwMENfQVBDCQkoMTw8NykJLyogQml0ICA3OglBc3ltbWV0cmljIFBhdXNlIENhcC4gKi8KKwkJCQkJCQkJCS8qIEJpdCAgNi4uMDoJcmVzZXJ2ZWQgKi8KKworLyoqKioqICBQSFlfTkFUXzEwMDBUX1NUQVQJMTYgYml0IHIvbwkxMDAwQmFzZS1UIFN0YXR1cyBSZWcgKioqKiovCisjZGVmaW5lIFBIWV9OXzEwMDBTX01TRgkJKDE8PDE1KQkvKiBCaXQgMTU6CU1hc3Rlci9TbGF2ZSBGYXVsdCAqLworI2RlZmluZSBQSFlfTl8xMDAwU19NU1IJCSgxPDwxNCkJLyogQml0IDE0OglNYXN0ZXIvU2xhdmUgUmVzdWx0ICovCisjZGVmaW5lIFBIWV9OXzEwMDBTX0xSUwkJKDE8PDEzKQkvKiBCaXQgMTM6CUxvY2FsIFJlY2VpdmVyIFN0YXR1cyAqLworI2RlZmluZSBQSFlfTl8xMDAwU19SUlMJCSgxPDwxMikJLyogQml0IDEyOglSZW1vdGUgUmVjZWl2ZXIgU3RhdHVzKi8KKyNkZWZpbmUgUEhZX05fMTAwMFNfTFBfRkQJKDE8PDExKQkvKiBCaXQgMTE6CUxpbmsgUGFydG5lciBjYW4gRkQgKi8KKyNkZWZpbmUgUEhZX05fMTAwMFNfTFBfSEQJKDE8PDEwKQkvKiBCaXQgMTA6CUxpbmsgUGFydG5lciBjYW4gSEQgKi8KKyNkZWZpbmUgUEhZX05fMTAwMENfTFBfQVBDCSgxPDw5KQkvKiBCaXQgIDk6CUxQIEFzeW0uIFBhdXNlIENhcC4gKi8KKwkJCQkJCQkJCS8qIEJpdCAgODoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX05fMTAwMFNfSUVDCQkweGZmCS8qIEJpdCAgNy4uMDoJSWRsZSBFcnJvciBDb3VudCAqLworCisvKioqKiogIFBIWV9OQVRfRVhUX1NUQVQJMTYgYml0IHIvbwlFeHRlbmRlZCBTdGF0dXMgUmVnaXN0ZXIgKioqKiovCisjZGVmaW5lIFBIWV9OX0VTX1hfRkRfQ0FQCSgxPDwxNSkJLyogQml0IDE1OgkxMDAwQmFzZS1YIEZEIGNhcGFibGUgKi8KKyNkZWZpbmUgUEhZX05fRVNfWF9IRF9DQVAJKDE8PDE0KQkvKiBCaXQgMTQ6CTEwMDBCYXNlLVggSEQgY2FwYWJsZSAqLworI2RlZmluZSBQSFlfTl9FU19UX0ZEX0NBUAkoMTw8MTMpCS8qIEJpdCAxMzoJMTAwMEJhc2UtVCBGRCBjYXBhYmxlICovCisjZGVmaW5lIFBIWV9OX0VTX1RfSERfQ0FQCSgxPDwxMikJLyogQml0IDEyOgkxMDAwQmFzZS1UIEhEIGNhcGFibGUgKi8KKwkJCQkJCQkJCS8qIEJpdCAxMS4uMDoJcmVzZXJ2ZWQgKi8KKworLyogdG9kbzogdGhvc2UgYXJlIHN0aWxsIG1pc3NpbmcgKi8KKy8qKioqKiAgUEhZX05BVF9FWFRfQ1RSTDEJMTYgYml0IHIvbwlFeHRlbmRlZCBDb250cm9sIFJlZzEgKioqKiovCisvKioqKiogIFBIWV9OQVRfUV9TVEFUMQkJMTYgYml0IHIvbwlRdWljayBTdGF0dXMgUmVnMSAqKioqKi8KKy8qKioqKiAgUEhZX05BVF8xMEJfT1AJCTE2IGJpdCByL28JMTBCYXNlLVQgT3BlcmF0aW9ucyBSZWcgKioqKiovCisvKioqKiogIFBIWV9OQVRfRVhUX0NUUkwyCTE2IGJpdCByL28JRXh0ZW5kZWQgQ29udHJvbCBSZWcxICoqKioqLworLyoqKioqICBQSFlfTkFUX1FfU1RBVDIJCTE2IGJpdCByL28JUXVpY2sgU3RhdHVzIFJlZzIgKioqKiovCisvKioqKiogIFBIWV9OQVRfUEhZX0FERFIJMTYgYml0IHIvbwlQSFkgQWRkcmVzcyBSZWdpc3RlciAqKioqKi8KKworLyoKKyAqIE1hcnZlbGwtU3BlY2lmaWMKKyAqLworLyoqKioqICBQSFlfTUFSVl9BVU5FX0FEVgkxNiBiaXQgci93CUF1dG8tTmVnb3RpYXRpb24gQWR2ZXJ0aXNlbWVudCAqKioqKi8KKy8qKioqKiAgUEhZX01BUlZfQVVORV9MUAkxNiBiaXQgci93CUxpbmsgUGFydCBBYmlsaXR5IFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX01fQU5fTlhUX1BHCQlCSVRfMTUJLyogUmVxdWVzdCBOZXh0IFBhZ2UgKi8KKyNkZWZpbmUgUEhZX01fQU5fQUNLCQlCSVRfMTQJLyogKHJvKQlBY2tub3dsZWRnZSBSZWNlaXZlZCAqLworI2RlZmluZSBQSFlfTV9BTl9SRgkJCUJJVF8xMwkvKiBSZW1vdGUgRmF1bHQgKi8KKwkJCQkJCQkJCS8qIEJpdCAxMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX01fQU5fQVNQCQlCSVRfMTEJLyogQXN5bW1ldHJpYyBQYXVzZSAqLworI2RlZmluZSBQSFlfTV9BTl9QQwkJCUJJVF8xMAkvKiBNQUMgUGF1c2UgaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUgUEhZX01fQU5fMTAwX0ZECQlCSVRfOAkvKiBBZHZlcnRpc2UgMTAwQmFzZS1UWCBGdWxsIER1cGxleCAqLworI2RlZmluZSBQSFlfTV9BTl8xMDBfSEQJCUJJVF83CS8qIEFkdmVydGlzZSAxMDBCYXNlLVRYIEhhbGYgRHVwbGV4ICovCisjZGVmaW5lIFBIWV9NX0FOXzEwX0ZECQlCSVRfNgkvKiBBZHZlcnRpc2UgMTBCYXNlLVRYIEZ1bGwgRHVwbGV4ICovCisjZGVmaW5lIFBIWV9NX0FOXzEwX0hECQlCSVRfNQkvKiBBZHZlcnRpc2UgMTBCYXNlLVRYIEhhbGYgRHVwbGV4ICovCisKKy8qIHNwZWNpYWwgZGVmaW5lcyBmb3IgRklCRVIgKDg4RTEwMTFTIG9ubHkpICovCisjZGVmaW5lIFBIWV9NX0FOX0FTUF9YCQlCSVRfOAkvKiBBc3ltbWV0cmljIFBhdXNlICovCisjZGVmaW5lIFBIWV9NX0FOX1BDX1gJCUJJVF83CS8qIE1BQyBQYXVzZSBpbXBsZW1lbnRlZCAqLworI2RlZmluZSBQSFlfTV9BTl8xMDAwWF9BSEQJQklUXzYJLyogQWR2ZXJ0aXNlIDEwMDAwQmFzZS1YIEhhbGYgRHVwbGV4ICovCisjZGVmaW5lIFBIWV9NX0FOXzEwMDBYX0FGRAlCSVRfNQkvKiBBZHZlcnRpc2UgMTAwMDBCYXNlLVggRnVsbCBEdXBsZXggKi8KKworLyogUGF1c2UgQml0cyAoUEhZX01fQU5fQVNQX1ggYW5kIFBIWV9NX0FOX1BDX1gpIGVuY29kaW5nICovCisjZGVmaW5lIFBIWV9NX1BfTk9fUEFVU0VfWAkoMDw8NykJLyogQml0ICA4Li4gNzoJbm8gUGF1c2UgTW9kZSAqLworI2RlZmluZSBQSFlfTV9QX1NZTV9NRF9YCSgxPDw3KQkvKiBCaXQgIDguLiA3OglzeW1tZXRyaWMgUGF1c2UgTW9kZSAqLworI2RlZmluZSBQSFlfTV9QX0FTWU1fTURfWAkoMjw8NykJLyogQml0ICA4Li4gNzoJYXN5bW1ldHJpYyBQYXVzZSBNb2RlICovCisjZGVmaW5lIFBIWV9NX1BfQk9USF9NRF9YCSgzPDw3KQkvKiBCaXQgIDguLiA3Oglib3RoIFBhdXNlIE1vZGUgKi8KKworLyoqKioqICBQSFlfTUFSVl8xMDAwVF9DVFJMCTE2IGJpdCByL3cJMTAwMEJhc2UtVCBDb250cm9sIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX01fMTAwMENfVEVTVAkoNzw8MTMpCS8qIEJpdCAxNS4uMTM6CVRlc3QgTW9kZXMgKi8KKyNkZWZpbmUgUEhZX01fMTAwMENfTVNFCQkoMTw8MTIpCS8qIEJpdCAxMjoJTWFudWFsIE1hc3Rlci9TbGF2ZSBFbmFibGUgKi8KKyNkZWZpbmUgUEhZX01fMTAwMENfTVNDCQkoMTw8MTEpCS8qIEJpdCAxMToJTS9TIENvbmZpZ3VyYXRpb24gKDE9TWFzdGVyKSAqLworI2RlZmluZSBQSFlfTV8xMDAwQ19NUEQJCSgxPDwxMCkJLyogQml0IDEwOglNdWx0aS1Qb3J0IERldmljZSAqLworI2RlZmluZSBQSFlfTV8xMDAwQ19BRkQJCSgxPDw5KQkvKiBCaXQgIDk6CUFkdmVydGlzZSBGdWxsIER1cGxleCAqLworI2RlZmluZSBQSFlfTV8xMDAwQ19BSEQJCSgxPDw4KQkvKiBCaXQgIDg6CUFkdmVydGlzZSBIYWxmIER1cGxleCAqLworCQkJCQkJCQkJLyogQml0ICA3Li4wOglyZXNlcnZlZCAqLworCisvKioqKiogIFBIWV9NQVJWX1BIWV9DVFJMCTE2IGJpdCByL3cJUEhZIFNwZWNpZmljIEN0cmwgUmVnICoqKioqLworI2RlZmluZSBQSFlfTV9QQ19UWF9GRkRfTVNLCSgzPDwxNCkJLyogQml0IDE1Li4xNDoJVHggRklGTyBEZXB0aCBNYXNrICovCisjZGVmaW5lIFBIWV9NX1BDX1JYX0ZGRF9NU0sJKDM8PDEyKQkvKiBCaXQgMTMuLjEyOglSeCBGSUZPIERlcHRoIE1hc2sgKi8KKyNkZWZpbmUgUEhZX01fUENfQVNTX0NSU19UWAkoMTw8MTEpCS8qIEJpdCAxMToJQXNzZXJ0IENSUyBvbiBUcmFuc21pdCAqLworI2RlZmluZSBQSFlfTV9QQ19GTF9HT09ECSgxPDwxMCkJLyogQml0IDEwOglGb3JjZSBMaW5rIEdvb2QgKi8KKyNkZWZpbmUgUEhZX01fUENfRU5fREVUX01TSwkoMzw8OCkJLyogQml0ICA5Li4gODoJRW5lcmd5IERldGVjdCBNYXNrICovCisjZGVmaW5lIFBIWV9NX1BDX0VOQV9FWFRfRAkoMTw8NykJLyogQml0ICA3OglFbmFibGUgRXh0LiBEaXN0YW5jZSAoMTBCVCkgKi8KKyNkZWZpbmUgUEhZX01fUENfTURJWF9NU0sJKDM8PDUpCS8qIEJpdCAgNi4uIDU6CU1ESS9NRElYIENvbmZpZy4gTWFzayAqLworI2RlZmluZSBQSFlfTV9QQ19ESVNfMTI1Q0xLCSgxPDw0KQkvKiBCaXQgIDQ6CURpc2FibGUgMTI1IENMSyAqLworI2RlZmluZSBQSFlfTV9QQ19NQUNfUE9XX1VQCSgxPDwzKQkvKiBCaXQgIDM6CU1BQyBQb3dlciB1cCAqLworI2RlZmluZSBQSFlfTV9QQ19TUUVfVF9FTkEJKDE8PDIpCS8qIEJpdCAgMjoJU1FFIFRlc3QgRW5hYmxlZCAqLworI2RlZmluZSBQSFlfTV9QQ19QT0xfUl9ESVMJKDE8PDEpCS8qIEJpdCAgMToJUG9sYXJpdHkgUmV2ZXJzYWwgRGlzYWJsZWQgKi8KKyNkZWZpbmUgUEhZX01fUENfRElTX0pBQkJFUgkoMTw8MCkJLyogQml0ICAwOglEaXNhYmxlIEphYmJlciAqLworCisjZGVmaW5lIFBIWV9NX1BDX0VOX0RFVAkJCVNISUZUOCgyKQkvKiBFbmVyZ3kgRGV0ZWN0IChNb2RlIDEpICovCisjZGVmaW5lIFBIWV9NX1BDX0VOX0RFVF9QTFVTCVNISUZUOCgzKQkvKiBFbmVyZ3kgRGV0ZWN0IFBsdXMgKE1vZGUgMikgKi8KKworI2RlZmluZSBQSFlfTV9QQ19NRElfWE1PREUoeCkJU0hJRlQ1KHgpCQorI2RlZmluZSBQSFlfTV9QQ19NQU5fTURJCTAgICAgCS8qIDAwID0gTWFudWFsIE1ESSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIFBIWV9NX1BDX01BTl9NRElYCTEJCS8qIDAxID0gTWFudWFsIE1ESVggY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBQSFlfTV9QQ19FTkFfQVVUTwkzCQkvKiAxMSA9IEVuYWJsZSBBdXRvbWF0aWMgQ3Jvc3NvdmVyICovCisKKy8qKioqKiAgUEhZX01BUlZfUEhZX1NUQVQJMTYgYml0IHIvbwlQSFkgU3BlY2lmaWMgU3RhdHVzIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX01fUFNfU1BFRURfTVNLCSgzPDwxNCkJLyogQml0IDE1Li4xNDoJU3BlZWQgTWFzayAqLworI2RlZmluZSBQSFlfTV9QU19TUEVFRF8xMDAwCSgxPDwxNSkJLyogICAgICAgMTAgPSAxMDAwIE1icHMgKi8KKyNkZWZpbmUgUEhZX01fUFNfU1BFRURfMTAwCSgxPDwxNCkJLyogICAgICAgMDEgPSAgMTAwIE1icHMgKi8KKyNkZWZpbmUgUEhZX01fUFNfU1BFRURfMTAJMAkJLyogICAgICAgMDAgPSAgIDEwIE1icHMgKi8KKyNkZWZpbmUgUEhZX01fUFNfRlVMTF9EVVAJKDE8PDEzKQkvKiBCaXQgMTM6CUZ1bGwgRHVwbGV4ICovCisjZGVmaW5lIFBIWV9NX1BTX1BBR0VfUkVDCSgxPDwxMikJLyogQml0IDEyOglQYWdlIFJlY2VpdmVkICovCisjZGVmaW5lIFBIWV9NX1BTX1NQRFVQX1JFUwkoMTw8MTEpCS8qIEJpdCAxMToJU3BlZWQgJiBEdXBsZXggUmVzb2x2ZWQgKi8KKyNkZWZpbmUgUEhZX01fUFNfTElOS19VUAkoMTw8MTApCS8qIEJpdCAxMDoJTGluayBVcCAqLworI2RlZmluZSBQSFlfTV9QU19DQUJMRV9NU0sJKDM8PDcpCS8qIEJpdCAgOS4uIDc6CUNhYmxlIExlbmd0aCBNYXNrICovCisjZGVmaW5lIFBIWV9NX1BTX01ESV9YX1NUQVQJKDE8PDYpCS8qIEJpdCAgNjoJTURJIENyb3Nzb3ZlciBTdGF0ICgxPU1ESVgpICovCisjZGVmaW5lIFBIWV9NX1BTX0RPV05TX1NUQVQJKDE8PDUpCS8qIEJpdCAgNToJRG93bnNoaWZ0IFN0YXR1cyAoMT1kb3duc2guKSAqLworI2RlZmluZSBQSFlfTV9QU19FTkRFVF9TVEFUCSgxPDw0KQkvKiBCaXQgIDQ6CUVuZXJneSBEZXRlY3QgU3RhdHVzICgxPWFjdCkgKi8KKyNkZWZpbmUgUEhZX01fUFNfVFhfUF9FTgkoMTw8MykJLyogQml0ICAzOglUeCBQYXVzZSBFbmFibGVkICovCisjZGVmaW5lIFBIWV9NX1BTX1JYX1BfRU4JKDE8PDIpCS8qIEJpdCAgMjoJUnggUGF1c2UgRW5hYmxlZCAqLworI2RlZmluZSBQSFlfTV9QU19QT0xfUkVWCSgxPDwxKQkvKiBCaXQgIDE6CVBvbGFyaXR5IFJldmVyc2VkICovCisjZGVmaW5lIFBIWV9NX1BDX0pBQkJFUgkJKDE8PDApCS8qIEJpdCAgMDoJSmFiYmVyICovCisKKyNkZWZpbmUgUEhZX01fUFNfUEFVU0VfTVNLCShQSFlfTV9QU19UWF9QX0VOIHwgUEhZX01fUFNfUlhfUF9FTikKKworLyoqKioqICBQSFlfTUFSVl9JTlRfTUFTSwkxNiBiaXQgci93CUludGVycnVwdCBNYXNrIFJlZyAqKioqKi8KKy8qKioqKiAgUEhZX01BUlZfSU5UX1NUQVQJMTYgYml0IHIvbwlJbnRlcnJ1cHQgU3RhdHVzIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX01fSVNfQU5fRVJST1IJKDE8PDE1KQkvKiBCaXQgMTU6CUF1dG8tTmVnb3RpYXRpb24gRXJyb3IgKi8KKyNkZWZpbmUgUEhZX01fSVNfTFNQX0NIQU5HRQkoMTw8MTQpCS8qIEJpdCAxNDoJTGluayBTcGVlZCBDaGFuZ2VkICovCisjZGVmaW5lIFBIWV9NX0lTX0RVUF9DSEFOR0UJKDE8PDEzKQkvKiBCaXQgMTM6CUR1cGxleCBNb2RlIENoYW5nZWQgKi8KKyNkZWZpbmUgUEhZX01fSVNfQU5fUFIJCSgxPDwxMikJLyogQml0IDEyOglQYWdlIFJlY2VpdmVkICovCisjZGVmaW5lIFBIWV9NX0lTX0FOX0NPTVBMCSgxPDwxMSkJLyogQml0IDExOglBdXRvLU5lZ290aWF0aW9uIENvbXBsZXRlZCAqLworI2RlZmluZSBQSFlfTV9JU19MU1RfQ0hBTkdFCSgxPDwxMCkJLyogQml0IDEwOglMaW5rIFN0YXR1cyBDaGFuZ2VkICovCisjZGVmaW5lIFBIWV9NX0lTX1NZTUJfRVJST1IJKDE8PDkpCS8qIEJpdCAgOToJU3ltYm9sIEVycm9yICovCisjZGVmaW5lIFBIWV9NX0lTX0ZBTFNFX0NBUlIJKDE8PDgpCS8qIEJpdCAgODoJRmFsc2UgQ2FycmllciAqLworI2RlZmluZSBQSFlfTV9JU19GSUZPX0VSUk9SCSgxPDw3KQkvKiBCaXQgIDc6CUZJRk8gT3ZlcmZsb3cvVW5kZXJydW4gRXJyb3IgKi8KKyNkZWZpbmUgUEhZX01fSVNfTURJX0NIQU5HRQkoMTw8NikJLyogQml0ICA2OglNREkgQ3Jvc3NvdmVyIENoYW5nZWQgKi8KKyNkZWZpbmUgUEhZX01fSVNfRE9XTlNIX0RFVAkoMTw8NSkJLyogQml0ICA1OglEb3duc2hpZnQgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgUEhZX01fSVNfRU5EX0NIQU5HRQkoMTw8NCkJLyogQml0ICA0OglFbmVyZ3kgRGV0ZWN0IENoYW5nZWQgKi8KKwkJCQkJCQkJCS8qIEJpdCAgMy4uMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX01fSVNfUE9MX0NIQU5HRQkoMTw8MSkJLyogQml0ICAxOglQb2xhcml0eSBDaGFuZ2VkICovCisjZGVmaW5lIFBIWV9NX0lTX0pBQkJFUgkJKDE8PDApCS8qIEJpdCAgMDoJSmFiYmVyICovCisKKyNkZWZpbmUgUEhZX01fREVGX01TSwkJKFBIWV9NX0lTX0FOX0VSUk9SIHwgUEhZX01fSVNfQU5fUFIgfCBcCisJCQkJCQkJUEhZX01fSVNfTFNUX0NIQU5HRSB8IFBIWV9NX0lTX0ZJRk9fRVJST1IpCisKKy8qKioqKiAgUEhZX01BUlZfRVhUX0NUUkwJMTYgYml0IHIvdwlFeHQuIFBIWSBTcGVjaWZpYyBDdHJsICoqKioqLworI2RlZmluZSBQSFlfTV9FQ19NX0RTQ19NU0sJKDM8PDEwKQkvKiBCaXQgMTEuLjEwOglNYXN0ZXIgZG93bnNoaWZ0IGNvdW50ZXIgKi8KKyNkZWZpbmUgUEhZX01fRUNfU19EU0NfTVNLCSgzPDw4KQkvKiBCaXQgIDkuLiA4OglTbGF2ZSAgZG93bnNoaWZ0IGNvdW50ZXIgKi8KKyNkZWZpbmUgUEhZX01fRUNfTUFDX1NfTVNLCSg3PDw0KQkvKiBCaXQgIDYuLiA0OglEZWYuIE1BQyBpbnRlcmZhY2Ugc3BlZWQgKi8KKyNkZWZpbmUgUEhZX01fRUNfRklCX0FOX0VOQQkoMTw8MykJLyogQml0ICAzOglGaWJlciBBdXRvLU5lZy4gRW5hYmxlICovCisKKyNkZWZpbmUgUEhZX01fRUNfTV9EU0MoeCkJCVNISUZUMTAoeCkJLyogMDA9MXg7IDAxPTJ4OyAxMD0zeDsgMTE9NHggKi8KKyNkZWZpbmUgUEhZX01fRUNfU19EU0MoeCkJCVNISUZUOCh4KQkvKiAwMD1kaXM7IDAxPTF4OyAxMD0yeDsgMTE9M3ggKi8KKyNkZWZpbmUgUEhZX01fRUNfTUFDX1MoeCkJCVNISUZUNCh4KQkvKiAwMVg9MDsgMTEwPTIuNTsgMTExPTI1IChNSHopICovCisKKyNkZWZpbmUgTUFDX1RYX0NMS18wX01IWgkyCisjZGVmaW5lIE1BQ19UWF9DTEtfMl81X01IWgk2CisjZGVmaW5lIE1BQ19UWF9DTEtfMjVfTUhaCTcKKworLyoqKioqICBQSFlfTUFSVl9MRURfQ1RSTAkxNiBiaXQgci93CUxFRCBDb250cm9sIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX01fTEVEQ19ESVNfTEVECSgxPDwxNSkJLyogQml0IDE1OglEaXNhYmxlIExFRCAqLworI2RlZmluZSBQSFlfTV9MRURDX1BVTFNfTVNLCSg3PDwxMikJLyogQml0IDE0Li4xMjogIFB1bHNlIFN0cmV0Y2ggTWFzayAqLworI2RlZmluZSBQSFlfTV9MRURDX0ZfSU5UCSgxPDwxMSkJLyogQml0IDExOglGb3JjZSBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgUEhZX01fTEVEQ19CTF9SX01TSwkoNzw8OCkJLyogQml0IDEwLi4gODogIEJsaW5rIFJhdGUgTWFzayAqLworCQkJCQkJCQkJLyogQml0ICA3Li4gNToJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX01fTEVEQ19MSU5LX01TSwkoMzw8MykJLyogQml0ICA0Li4gMzoJTGluayBDb250cm9sIE1hc2sgKi8KKyNkZWZpbmUgUEhZX01fTEVEQ19EUF9DVFJMCSgxPDwyKQkvKiBCaXQgIDI6CUR1cGxleCBDb250cm9sICovCisjZGVmaW5lIFBIWV9NX0xFRENfUlhfQ1RSTAkoMTw8MSkJLyogQml0ICAxOglSeCBhY3Rpdml0eSAvIExpbmsgKi8KKyNkZWZpbmUgUEhZX01fTEVEQ19UWF9DVFJMCSgxPDwwKQkvKiBCaXQgIDA6CVR4IGFjdGl2aXR5IC8gTGluayAqLworCisjZGVmaW5lIFBIWV9NX0xFRF9QVUxTX0RVUih4KQlTSElGVDEyKHgpCS8qIFB1bHNlIFN0cmV0Y2ggRHVyYXRpb24gKi8KKworI2RlZmluZQlQVUxTX05PX1NUUgkJMAkJLyogbm8gcHVsc2Ugc3RyZXRjaGluZyAqLworI2RlZmluZQlQVUxTXzIxTVMJCTEJCS8qIDIxIG1zIHRvIDQyIG1zICovCisjZGVmaW5lIFBVTFNfNDJNUwkJMgkJLyogNDIgbXMgdG8gODQgbXMgKi8KKyNkZWZpbmUgUFVMU184NE1TCQkzCQkvKiA4NCBtcyB0byAxNzAgbXMgKi8KKyNkZWZpbmUgUFVMU18xNzBNUwkJNAkJLyogMTcwIG1zIHRvIDM0MCBtcyAqLworI2RlZmluZSBQVUxTXzM0ME1TCQk1CQkvKiAzNDAgbXMgdG8gNjcwIG1zICovCisjZGVmaW5lIFBVTFNfNjcwTVMJCTYJCS8qIDY3MCBtcyB0byAxLjMgcyAqLworI2RlZmluZSBQVUxTXzEzMDBNUwkJNwkJLyogMS4zIHMgdG8gMi43IHMgKi8KKworI2RlZmluZSBQSFlfTV9MRURfQkxJTktfUlQoeCkJU0hJRlQ4KHgpCS8qIEJsaW5rIFJhdGUgKi8KKworI2RlZmluZSBCTElOS180Mk1TCQkwCQkvKiA0MiBtcyAqLworI2RlZmluZSBCTElOS184NE1TCQkxCQkvKiA4NCBtcyAqLworI2RlZmluZSBCTElOS18xNzBNUwkJMgkJLyogMTcwIG1zICovCisjZGVmaW5lIEJMSU5LXzM0ME1TCQkzCQkvKiAzNDAgbXMgKi8KKyNkZWZpbmUgQkxJTktfNjcwTVMJCTQJCS8qIDY3MCBtcyAqLworCQkJCQkJCQkvKiB2YWx1ZXMgNSAtIDc6IHJlc2VydmVkICovCisKKy8qKioqKiAgUEhZX01BUlZfTEVEX09WRVIJMTYgYml0IHIvdwlNYW51YWwgTEVEIE92ZXJyaWRlIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX01fTEVEX01PX0RVUCh4KQkJU0hJRlQxMCh4KQkvKiBCaXQgMTEuLjEwOiAgRHVwbGV4ICovCisjZGVmaW5lIFBIWV9NX0xFRF9NT18xMCh4KQkJU0hJRlQ4KHgpCS8qIEJpdCAgOS4uIDg6ICBMaW5rIDEwICovCisjZGVmaW5lIFBIWV9NX0xFRF9NT18xMDAoeCkJCVNISUZUNih4KQkvKiBCaXQgIDcuLiA2OiAgTGluayAxMDAgKi8KKyNkZWZpbmUgUEhZX01fTEVEX01PXzEwMDAoeCkJU0hJRlQ0KHgpCS8qIEJpdCAgNS4uIDQ6ICBMaW5rIDEwMDAgKi8KKyNkZWZpbmUgUEhZX01fTEVEX01PX1JYKHgpCQlTSElGVDIoeCkJLyogQml0ICAzLi4gMjogIFJ4ICovCisjZGVmaW5lIFBIWV9NX0xFRF9NT19UWCh4KQkJU0hJRlQwKHgpCS8qIEJpdCAgMS4uIDA6ICBUeCAqLworCisjZGVmaW5lIE1PX0xFRF9OT1JNCQkJMAorI2RlZmluZSBNT19MRURfQkxJTksJCTEKKyNkZWZpbmUgTU9fTEVEX09GRgkJCTIKKyNkZWZpbmUgTU9fTEVEX09OCQkJMworCisvKioqKiogIFBIWV9NQVJWX0VYVF9DVFJMXzIJMTYgYml0IHIvdwlFeHQuIFBIWSBTcGVjaWZpYyBDdHJsIDIgKioqKiovCisJCQkJCQkJCQkvKiBCaXQgMTUuLiA3OglyZXNlcnZlZCAqLworI2RlZmluZSBQSFlfTV9FQzJfRklfSU1QRUQJKDE8PDYpCS8qIEJpdCAgNjoJRmliZXIgSW5wdXQgIEltcGVkYW5jZSAqLworI2RlZmluZSBQSFlfTV9FQzJfRk9fSU1QRUQJKDE8PDUpCS8qIEJpdCAgNToJRmliZXIgT3V0cHV0IEltcGVkYW5jZSAqLworI2RlZmluZSBQSFlfTV9FQzJfRk9fTV9DTEsJKDE8PDQpCS8qIEJpdCAgNDoJRmliZXIgTW9kZSBDbG9jayBFbmFibGUgKi8KKyNkZWZpbmUgUEhZX01fRUMyX0ZPX0JPT1NUCSgxPDwzKQkvKiBCaXQgIDM6CUZpYmVyIE91dHB1dCBCb29zdCAqLworI2RlZmluZSBQSFlfTV9FQzJfRk9fQU1fTVNLCTcJCS8qIEJpdCAgMi4uIDA6CUZpYmVyIE91dHB1dCBBbXBsaXR1ZGUgKi8KKworLyoqKioqCVBIWV9NQVJWX0VYVF9QX1NUQVQgMTYgYml0IHIvdwlFeHQuIFBIWSBTcGVjaWZpYyBTdGF0dXMgKioqKiovCisjZGVmaW5lIFBIWV9NX0ZDX0FVVE9fU0VMCSgxPDwxNSkJLyogQml0IDE1OglGaWJlci9Db3BwZXIgQXV0byBTZWwuIGRpcy4gKi8KKyNkZWZpbmUgUEhZX01fRkNfQU5fUkVHX0FDQyAoMTw8MTQpIC8qIEJpdCAxNDoJRmliZXIvQ29wcGVyIEF1dG9uZWcuIHJlZyBhY2MgKi8KKyNkZWZpbmUgUEhZX01fRkNfUkVTVUxVVElPTiAoMTw8MTMpCS8qIEJpdCAxMzoJRmliZXIvQ29wcGVyIFJlc3VsdXRpb24gKi8KKyNkZWZpbmUgUEhZX01fU0VSX0lGX0FOX0JQICAoMTw8MTIpIC8qIEJpdCAxMjoJU2VyIElGIGF1dG9uZWcuIGJ5cGFzcyBlbmFibGUgKi8KKyNkZWZpbmUgUEhZX01fU0VSX0lGX0JQX1NUCSgxPDwxMSkgLyogQml0IDExOglTZXIgSUYgYXV0b25lZy4gYnlwYXNzIHN0YXR1cyAqLworI2RlZmluZSBQSFlfTV9JUlFfUE9MQVJJVFkJKDE8PDEwKSAvKiBCaXQgMTA6CUlSUSBwb2xhcml0eSAqLworCQkJCQkJCQkJLyogQml0IDkuLjQ6IHJlc2VydmVkICovCisjZGVmaW5lIFBIWV9NX1VORE9DMQkJKDE8PCA3KSAvKiB1bmRvY3VtZW50ZWQgYml0ICEhICovCisjZGVmaW5lIFBIWV9NX01PREVfTUFTSwkJKDB4Zjw8MCkvKiBCaXQgMy4uMDogY29weSBvZiBIV0NGRyBNT0RFWzM6MF0gKi8KKworCisvKioqKiogIFBIWV9NQVJWX0NBQkxFX0RJQUcJMTYgYml0IHIvbwlDYWJsZSBEaWFnbm9zdGljIFJlZyAqKioqKi8KKyNkZWZpbmUgUEhZX01fQ0FCRF9FTkFfVEVTVAkoMTw8MTUpCS8qIEJpdCAxNToJRW5hYmxlIFRlc3QgKi8KKyNkZWZpbmUgUEhZX01fQ0FCRF9TVEFUX01TSwkoMzw8MTMpCS8qIEJpdCAxNC4uMTM6CVN0YXR1cyAqLworCQkJCQkJCQkJLyogQml0IDEyLi4gODoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUEhZX01fQ0FCRF9ESVNUX01TSwkweGZmCS8qIEJpdCAgNy4uIDA6CURpc3RhbmNlICovCisKKy8qIHZhbHVlcyBmb3IgQ2FibGUgRGlhZ25vc3RpYyBTdGF0dXMgKDExPWZhaWw7IDAwPU9LOyAxMD1vcGVuOyAwMT1zaG9ydCkgKi8KKyNkZWZpbmUgQ0FCRF9TVEFUX05PUk1BTAkwCisjZGVmaW5lIENBQkRfU1RBVF9TSE9SVAkJMQorI2RlZmluZSBDQUJEX1NUQVRfT1BFTgkJMgorI2RlZmluZSBDQUJEX1NUQVRfRkFJTAkJMworCisKKy8qCisgKiBHTUFDIHJlZ2lzdGVycworICoKKyAqIFRoZSBHTUFDIHJlZ2lzdGVycyBhcmUgMTYgb3IgMzIgYml0cyB3aWRlLgorICogVGhlIEdNQUNzIGhvc3QgcHJvY2Vzc29yIGludGVyZmFjZSBpcyAxNiBiaXRzIHdpZGUsCisgKiB0aGVyZWZvcmUgQUxMIHJlZ2lzdGVycyB3aWxsIGJlIGFkZHJlc3NlZCB3aXRoIDE2IGJpdCBhY2Nlc3Nlcy4KKyAqCisgKiBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgcHJvdmlkZWQgdG8gYWNjZXNzIHRoZSBHTUFDIHJlZ2lzdGVycworICogR01fSU4xNigpLCBHTV9PVVQxNiwgR01fSU4zMigpLCBHTV9PVVQzMigpLCBHTV9JTkFEUigpLCBHTV9PVVRBRFIoKSwKKyAqIEdNX0lOSEFTSCgpLCBhbmQgR01fT1VUSEFTSCgpLgorICogVGhlIG1hY3JvcyBhcmUgZGVmaW5lZCBpbiBTa0dlSHcuaC4KKyAqCisgKiBOb3RlOglOQSByZWcJPSBOZXR3b3JrIEFkZHJlc3MgZS5nIERBLCBTQSBldGMuCisgKgorICovCisKKy8qIFBvcnQgUmVnaXN0ZXJzICovCisjZGVmaW5lIEdNX0dQX1NUQVQJCTB4MDAwMAkJLyogMTYgYml0IHIvbwlHZW5lcmFsIFB1cnBvc2UgU3RhdHVzICovCisjZGVmaW5lIEdNX0dQX0NUUkwJCTB4MDAwNAkJLyogMTYgYml0IHIvdwlHZW5lcmFsIFB1cnBvc2UgQ29udHJvbCAqLworI2RlZmluZSBHTV9UWF9DVFJMCQkweDAwMDgJCS8qIDE2IGJpdCByL3cJVHJhbnNtaXQgQ29udHJvbCBSZWcuICovCisjZGVmaW5lIEdNX1JYX0NUUkwJCTB4MDAwYwkJLyogMTYgYml0IHIvdwlSZWNlaXZlIENvbnRyb2wgUmVnLiAqLworI2RlZmluZSBHTV9UWF9GTE9XX0NUUkwJMHgwMDEwCQkvKiAxNiBiaXQgci93CVRyYW5zbWl0IEZsb3ctQ29udHJvbCAqLworI2RlZmluZSBHTV9UWF9QQVJBTQkJMHgwMDE0CQkvKiAxNiBiaXQgci93CVRyYW5zbWl0IFBhcmFtZXRlciBSZWcuICovCisjZGVmaW5lIEdNX1NFUklBTF9NT0RFCTB4MDAxOAkJLyogMTYgYml0IHIvdwlTZXJpYWwgTW9kZSBSZWdpc3RlciAqLworCisvKiBTb3VyY2UgQWRkcmVzcyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgR01fU1JDX0FERFJfMUwJMHgwMDFjCQkvKiAxNiBiaXQgci93CVNvdXJjZSBBZGRyZXNzIDEgKGxvdykgKi8KKyNkZWZpbmUgR01fU1JDX0FERFJfMU0JMHgwMDIwCQkvKiAxNiBiaXQgci93CVNvdXJjZSBBZGRyZXNzIDEgKG1pZGRsZSkgKi8KKyNkZWZpbmUgR01fU1JDX0FERFJfMUgJMHgwMDI0CQkvKiAxNiBiaXQgci93CVNvdXJjZSBBZGRyZXNzIDEgKGhpZ2gpICovCisjZGVmaW5lIEdNX1NSQ19BRERSXzJMCTB4MDAyOAkJLyogMTYgYml0IHIvdwlTb3VyY2UgQWRkcmVzcyAyIChsb3cpICovCisjZGVmaW5lIEdNX1NSQ19BRERSXzJNCTB4MDAyYwkJLyogMTYgYml0IHIvdwlTb3VyY2UgQWRkcmVzcyAyIChtaWRkbGUpICovCisjZGVmaW5lIEdNX1NSQ19BRERSXzJICTB4MDAzMAkJLyogMTYgYml0IHIvdwlTb3VyY2UgQWRkcmVzcyAyIChoaWdoKSAqLworCisvKiBNdWx0aWNhc3QgQWRkcmVzcyBIYXNoIFJlZ2lzdGVycyAqLworI2RlZmluZSBHTV9NQ19BRERSX0gxCTB4MDAzNAkJLyogMTYgYml0IHIvdwlNdWx0aWNhc3QgQWRkcmVzcyBIYXNoIDEgKi8KKyNkZWZpbmUgR01fTUNfQUREUl9IMgkweDAwMzgJCS8qIDE2IGJpdCByL3cJTXVsdGljYXN0IEFkZHJlc3MgSGFzaCAyICovCisjZGVmaW5lIEdNX01DX0FERFJfSDMJMHgwMDNjCQkvKiAxNiBiaXQgci93CU11bHRpY2FzdCBBZGRyZXNzIEhhc2ggMyAqLworI2RlZmluZSBHTV9NQ19BRERSX0g0CTB4MDA0MAkJLyogMTYgYml0IHIvdwlNdWx0aWNhc3QgQWRkcmVzcyBIYXNoIDQgKi8KKworLyogSW50ZXJydXB0IFNvdXJjZSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgR01fVFhfSVJRX1NSQwkweDAwNDQJCS8qIDE2IGJpdCByL28JVHggT3ZlcmZsb3cgSVJRIFNvdXJjZSAqLworI2RlZmluZSBHTV9SWF9JUlFfU1JDCTB4MDA0OAkJLyogMTYgYml0IHIvbwlSeCBPdmVyZmxvdyBJUlEgU291cmNlICovCisjZGVmaW5lIEdNX1RSX0lSUV9TUkMJMHgwMDRjCQkvKiAxNiBiaXQgci9vCVR4L1J4IE92ZXIuIElSUSBTb3VyY2UgKi8KKworLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXJzICovCisjZGVmaW5lIEdNX1RYX0lSUV9NU0sJMHgwMDUwCQkvKiAxNiBiaXQgci93CVR4IE92ZXJmbG93IElSUSBNYXNrICovCisjZGVmaW5lIEdNX1JYX0lSUV9NU0sJMHgwMDU0CQkvKiAxNiBiaXQgci93CVJ4IE92ZXJmbG93IElSUSBNYXNrICovCisjZGVmaW5lIEdNX1RSX0lSUV9NU0sJMHgwMDU4CQkvKiAxNiBiaXQgci93CVR4L1J4IE92ZXIuIElSUSBNYXNrICovCisKKy8qIFNlcmlhbCBNYW5hZ2VtZW50IEludGVyZmFjZSAoU01JKSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgR01fU01JX0NUUkwJCTB4MDA4MAkJLyogMTYgYml0IHIvdwlTTUkgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBHTV9TTUlfREFUQQkJMHgwMDg0CQkvKiAxNiBiaXQgci93CVNNSSBEYXRhIFJlZ2lzdGVyICovCisjZGVmaW5lIEdNX1BIWV9BRERSCQkweDAwODgJCS8qIDE2IGJpdCByL3cJR1BIWSBBZGRyZXNzIFJlZ2lzdGVyICovCisKKy8qIE1JQiBDb3VudGVycyAqLworI2RlZmluZSBHTV9NSUJfQ05UX0JBU0UJMHgwMTAwCQkvKiBCYXNlIEFkZHJlc3Mgb2YgTUlCIENvdW50ZXJzICovCisjZGVmaW5lIEdNX01JQl9DTlRfU0laRQk0NAkJCS8qIE51bWJlciBvZiBNSUIgQ291bnRlcnMgKi8KKworLyoKKyAqIE1JQiBDb3VudGVycyBiYXNlIGFkZHJlc3MgZGVmaW5pdGlvbnMgKGxvdyB3b3JkKSAtCisgKiB1c2Ugb2Zmc2V0IDQgZm9yIGFjY2VzcyB0byBoaWdoIHdvcmQJKDMyIGJpdCByL28pCisgKi8KKyNkZWZpbmUgR01fUlhGX1VDX09LIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAwKQkvKiBVbmljYXN0IEZyYW1lcyBSZWNlaXZlZCBPSyAqLworI2RlZmluZSBHTV9SWEZfQkNfT0sgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDgpCS8qIEJyb2FkY2FzdCBGcmFtZXMgUmVjZWl2ZWQgT0sgKi8KKyNkZWZpbmUgR01fUlhGX01QQVVTRSBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMTYpCS8qIFBhdXNlIE1BQyBDdHJsIEZyYW1lcyBSZWNlaXZlZCAqLworI2RlZmluZSBHTV9SWEZfTUNfT0sgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDI0KQkvKiBNdWx0aWNhc3QgRnJhbWVzIFJlY2VpdmVkIE9LICovCisjZGVmaW5lIEdNX1JYRl9GQ1NfRVJSIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAzMikJLyogUnggRnJhbWUgQ2hlY2sgU2VxLiBFcnJvciAqLworCS8qIEdNX01JQl9DTlRfQkFTRSArIDQwOglyZXNlcnZlZCAqLworI2RlZmluZSBHTV9SWE9fT0tfTE8gXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDQ4KQkvKiBPY3RldHMgUmVjZWl2ZWQgT0sgTG93ICovCisjZGVmaW5lIEdNX1JYT19PS19ISSBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgNTYpCS8qIE9jdGV0cyBSZWNlaXZlZCBPSyBIaWdoICovCisjZGVmaW5lIEdNX1JYT19FUlJfTE8gXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDY0KQkvKiBPY3RldHMgUmVjZWl2ZWQgSW52YWxpZCBMb3cgKi8KKyNkZWZpbmUgR01fUlhPX0VSUl9ISSBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgNzIpCS8qIE9jdGV0cyBSZWNlaXZlZCBJbnZhbGlkIEhpZ2ggKi8KKyNkZWZpbmUgR01fUlhGX1NIVCBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgODApCS8qIEZyYW1lcyA8NjQgQnl0ZSBSZWNlaXZlZCBPSyAqLworI2RlZmluZSBHTV9SWEVfRlJBRyBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgODgpCS8qIEZyYW1lcyA8NjQgQnl0ZSBSZWNlaXZlZCB3aXRoIEZDUyBFcnIgKi8KKyNkZWZpbmUgR01fUlhGXzY0QiBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgOTYpCS8qIDY0IEJ5dGUgUnggRnJhbWUgKi8KKyNkZWZpbmUgR01fUlhGXzEyN0IgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDEwNCkJLyogNjUtMTI3IEJ5dGUgUnggRnJhbWUgKi8KKyNkZWZpbmUgR01fUlhGXzI1NUIgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDExMikJLyogMTI4LTI1NSBCeXRlIFJ4IEZyYW1lICovCisjZGVmaW5lIEdNX1JYRl81MTFCIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAxMjApCS8qIDI1Ni01MTEgQnl0ZSBSeCBGcmFtZSAqLworI2RlZmluZSBHTV9SWEZfMTAyM0IgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDEyOCkJLyogNTEyLTEwMjMgQnl0ZSBSeCBGcmFtZSAqLworI2RlZmluZSBHTV9SWEZfMTUxOEIgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDEzNikJLyogMTAyNC0xNTE4IEJ5dGUgUnggRnJhbWUgKi8KKyNkZWZpbmUgR01fUlhGX01BWF9TWiBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMTQ0KQkvKiAxNTE5LU1heFNpemUgQnl0ZSBSeCBGcmFtZSAqLworI2RlZmluZSBHTV9SWEZfTE5HX0VSUiBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMTUyKQkvKiBSeCBGcmFtZSB0b28gTG9uZyBFcnJvciAqLworI2RlZmluZSBHTV9SWEZfSkFCX1BLVCBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMTYwKQkvKiBSeCBKYWJiZXIgUGFja2V0IEZyYW1lICovCisJLyogR01fTUlCX0NOVF9CQVNFICsgMTY4OglyZXNlcnZlZCAqLworI2RlZmluZSBHTV9SWEVfRklGT19PViBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMTc2KQkvKiBSeCBGSUZPIG92ZXJmbG93IEV2ZW50ICovCisJLyogR01fTUlCX0NOVF9CQVNFICsgMTg0OglyZXNlcnZlZCAqLworI2RlZmluZSBHTV9UWEZfVUNfT0sgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDE5MikJLyogVW5pY2FzdCBGcmFtZXMgWG1pdHRlZCBPSyAqLworI2RlZmluZSBHTV9UWEZfQkNfT0sgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDIwMCkJLyogQnJvYWRjYXN0IEZyYW1lcyBYbWl0dGVkIE9LICovCisjZGVmaW5lIEdNX1RYRl9NUEFVU0UgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDIwOCkJLyogUGF1c2UgTUFDIEN0cmwgRnJhbWVzIFhtaXR0ZWQgKi8KKyNkZWZpbmUgR01fVFhGX01DX09LIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAyMTYpCS8qIE11bHRpY2FzdCBGcmFtZXMgWG1pdHRlZCBPSyAqLworI2RlZmluZSBHTV9UWE9fT0tfTE8gXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDIyNCkJLyogT2N0ZXRzIFRyYW5zbWl0dGVkIE9LIExvdyAqLworI2RlZmluZSBHTV9UWE9fT0tfSEkgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDIzMikJLyogT2N0ZXRzIFRyYW5zbWl0dGVkIE9LIEhpZ2ggKi8KKyNkZWZpbmUgR01fVFhGXzY0QiBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMjQwKQkvKiA2NCBCeXRlIFR4IEZyYW1lICovCisjZGVmaW5lIEdNX1RYRl8xMjdCIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAyNDgpCS8qIDY1LTEyNyBCeXRlIFR4IEZyYW1lICovCisjZGVmaW5lIEdNX1RYRl8yNTVCIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAyNTYpCS8qIDEyOC0yNTUgQnl0ZSBUeCBGcmFtZSAqLworI2RlZmluZSBHTV9UWEZfNTExQiBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMjY0KQkvKiAyNTYtNTExIEJ5dGUgVHggRnJhbWUgKi8KKyNkZWZpbmUgR01fVFhGXzEwMjNCIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAyNzIpCS8qIDUxMi0xMDIzIEJ5dGUgVHggRnJhbWUgKi8KKyNkZWZpbmUgR01fVFhGXzE1MThCIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAyODApCS8qIDEwMjQtMTUxOCBCeXRlIFR4IEZyYW1lICovCisjZGVmaW5lIEdNX1RYRl9NQVhfU1ogXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDI4OCkJLyogMTUxOS1NYXhTaXplIEJ5dGUgVHggRnJhbWUgKi8KKwkvKiBHTV9NSUJfQ05UX0JBU0UgKyAyOTY6CXJlc2VydmVkICovCisjZGVmaW5lIEdNX1RYRl9DT0wgXAorCQkJKEdNX01JQl9DTlRfQkFTRSArIDMwNCkJLyogVHggQ29sbGlzaW9uICovCisjZGVmaW5lIEdNX1RYRl9MQVRfQ09MIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAzMTIpCS8qIFR4IExhdGUgQ29sbGlzaW9uICovCisjZGVmaW5lIEdNX1RYRl9BQk9fQ09MIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAzMjApCS8qIFR4IGFib3J0ZWQgZHVlIHRvIEV4Y2VzLiBDb2wuICovCisjZGVmaW5lIEdNX1RYRl9NVUxfQ09MIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAzMjgpCS8qIFR4IE11bHRpcGxlIENvbGxpc2lvbiAqLworI2RlZmluZSBHTV9UWEZfU05HX0NPTCBcCisJCQkoR01fTUlCX0NOVF9CQVNFICsgMzM2KQkvKiBUeCBTaW5nbGUgQ29sbGlzaW9uICovCisjZGVmaW5lIEdNX1RYRV9GSUZPX1VSIFwKKwkJCShHTV9NSUJfQ05UX0JBU0UgKyAzNDQpCS8qIFR4IEZJRk8gVW5kZXJydW4gRXZlbnQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBHTUFDIEJpdCBEZWZpbml0aW9ucworICoKKyAqIElmIHRoZSBiaXQgYWNjZXNzIGJlaGF2aW91ciBkaWZmZXJzIGZyb20gdGhlIHJlZ2lzdGVyIGFjY2VzcyBiZWhhdmlvdXIKKyAqIChyL3csIHIvbykgdGhpcyBpcyBkb2N1bWVudGVkIGFmdGVyIHRoZSBiaXQgbnVtYmVyLgorICogVGhlIGZvbGxvd2luZyBiaXQgYWNjZXNzIGJlaGF2aW91cnMgYXJlIHVzZWQ6CisgKgkoc2MpCXNlbGYgY2xlYXJpbmcKKyAqCShyL28pCXJlYWQgb25seQorICovCisKKy8qCUdNX0dQX1NUQVQJMTYgYml0IHIvbwlHZW5lcmFsIFB1cnBvc2UgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIEdNX0dQU1JfU1BFRUQJCSgxPDwxNSkgLyogQml0IDE1OglQb3J0IFNwZWVkICgxID0gMTAwIE1icHMpICovCisjZGVmaW5lIEdNX0dQU1JfRFVQTEVYCQkoMTw8MTQpIC8qIEJpdCAxNDoJRHVwbGV4IE1vZGUgKDEgPSBGdWxsKSAqLworI2RlZmluZSBHTV9HUFNSX0ZDX1RYX0RJUwkoMTw8MTMpIC8qIEJpdCAxMzoJVHggRmxvdy1Db250cm9sIE1vZGUgRGlzYWJsZWQgKi8KKyNkZWZpbmUgR01fR1BTUl9MSU5LX1VQCQkoMTw8MTIpCS8qIEJpdCAxMjoJTGluayBVcCBTdGF0dXMgKi8KKyNkZWZpbmUgR01fR1BTUl9QQVVTRQkJKDE8PDExKQkvKiBCaXQgMTE6CVBhdXNlIFN0YXRlICovCisjZGVmaW5lIEdNX0dQU1JfVFhfQUNUSVZFCSgxPDwxMCkJLyogQml0IDEwOglUeCBpbiBQcm9ncmVzcyAqLworI2RlZmluZSBHTV9HUFNSX0VYQ19DT0wJCSgxPDw5KQkvKiBCaXQgIDk6CUV4Y2Vzc2l2ZSBDb2xsaXNpb25zIE9jY3VyZWQgKi8KKyNkZWZpbmUgR01fR1BTUl9MQVRfQ09MCQkoMTw8OCkJLyogQml0ICA4OglMYXRlIENvbGxpc2lvbnMgT2NjdXJlZCAqLworCQkJCQkJCQkvKiBCaXQgIDcuLjY6CXJlc2VydmVkICovCisjZGVmaW5lIEdNX0dQU1JfUEhZX1NUX0NICSgxPDw1KQkvKiBCaXQgIDU6CVBIWSBTdGF0dXMgQ2hhbmdlICovCisjZGVmaW5lIEdNX0dQU1JfR0lHX1NQRUVECSgxPDw0KQkvKiBCaXQgIDQ6CUdpZ2FiaXQgU3BlZWQgKDEgPSAxMDAwIE1icHMpICovCisjZGVmaW5lIEdNX0dQU1JfUEFSVF9NT0RFCSgxPDwzKQkvKiBCaXQgIDM6CVBhcnRpdGlvbiBtb2RlICovCisjZGVmaW5lIEdNX0dQU1JfRkNfUlhfRElTCSgxPDwyKQkvKiBCaXQgIDI6CVJ4IEZsb3ctQ29udHJvbCBNb2RlIERpc2FibGVkICovCisjZGVmaW5lIEdNX0dQU1JfUFJPTV9FTgkJKDE8PDEpCS8qIEJpdCAgMToJUHJvbWlzY3VvdXMgTW9kZSBFbmFibGVkICovCisJCQkJCQkJCS8qIEJpdCAgMDoJcmVzZXJ2ZWQgKi8KKwkKKy8qCUdNX0dQX0NUUkwJMTYgYml0IHIvdwlHZW5lcmFsIFB1cnBvc2UgQ29udHJvbCBSZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgMTU6CXJlc2VydmVkICovCisjZGVmaW5lIEdNX0dQQ1JfUFJPTV9FTkEJKDE8PDE0KQkvKiBCaXQgMTQ6CUVuYWJsZSBQcm9taXNjdW91cyBNb2RlICovCisjZGVmaW5lIEdNX0dQQ1JfRkNfVFhfRElTCSgxPDwxMykgLyogQml0IDEzOglEaXNhYmxlIFR4IEZsb3ctQ29udHJvbCBNb2RlICovCisjZGVmaW5lIEdNX0dQQ1JfVFhfRU5BCQkoMTw8MTIpIC8qIEJpdCAxMjoJRW5hYmxlIFRyYW5zbWl0ICovCisjZGVmaW5lIEdNX0dQQ1JfUlhfRU5BCQkoMTw8MTEpIC8qIEJpdCAxMToJRW5hYmxlIFJlY2VpdmUgKi8KKyNkZWZpbmUgR01fR1BDUl9CVVJTVF9FTkEJKDE8PDEwKQkvKiBCaXQgMTA6CUVuYWJsZSBCdXJzdCBNb2RlICovCisjZGVmaW5lIEdNX0dQQ1JfTE9PUF9FTkEJKDE8PDkpCS8qIEJpdCAgOToJRW5hYmxlIE1BQyBMb29wYmFjayBNb2RlICovCisjZGVmaW5lIEdNX0dQQ1JfUEFSVF9FTkEJKDE8PDgpCS8qIEJpdCAgODoJRW5hYmxlIFBhcnRpdGlvbiBNb2RlICovCisjZGVmaW5lIEdNX0dQQ1JfR0lHU19FTkEJKDE8PDcpCS8qIEJpdCAgNzoJR2lnYWJpdCBTcGVlZCAoMTAwMCBNYnBzKSAqLworI2RlZmluZSBHTV9HUENSX0ZMX1BBU1MJCSgxPDw2KQkvKiBCaXQgIDY6CUZvcmNlIExpbmsgUGFzcyAqLworI2RlZmluZSBHTV9HUENSX0RVUF9GVUxMCSgxPDw1KQkvKiBCaXQgIDU6CUZ1bGwgRHVwbGV4IE1vZGUgKi8KKyNkZWZpbmUgR01fR1BDUl9GQ19SWF9ESVMJKDE8PDQpCS8qIEJpdCAgNDoJRGlzYWJsZSBSeCBGbG93LUNvbnRyb2wgTW9kZSAqLworI2RlZmluZSBHTV9HUENSX1NQRUVEXzEwMAkoMTw8MykgIC8qIEJpdCAgMzoJUG9ydCBTcGVlZCAxMDAgTWJwcyAqLworI2RlZmluZSBHTV9HUENSX0FVX0RVUF9ESVMJKDE8PDIpCS8qIEJpdCAgMjoJRGlzYWJsZSBBdXRvLVVwZGF0ZSBEdXBsZXggKi8KKyNkZWZpbmUgR01fR1BDUl9BVV9GQ1RfRElTCSgxPDwxKQkvKiBCaXQgIDE6CURpc2FibGUgQXV0by1VcGRhdGUgRmxvdy1DLiAqLworI2RlZmluZSBHTV9HUENSX0FVX1NQRF9ESVMJKDE8PDApCS8qIEJpdCAgMDoJRGlzYWJsZSBBdXRvLVVwZGF0ZSBTcGVlZCAqLworCisjZGVmaW5lIEdNX0dQQ1JfU1BFRURfMTAwMAkoR01fR1BDUl9HSUdTX0VOQSB8IEdNX0dQQ1JfU1BFRURfMTAwKQorI2RlZmluZSBHTV9HUENSX0FVX0FMTF9ESVMJKEdNX0dQQ1JfQVVfRFVQX0RJUyB8IEdNX0dQQ1JfQVVfRkNUX0RJUyB8XAorCQkJCQkJCSBHTV9HUENSX0FVX1NQRF9ESVMpCisJCisvKglHTV9UWF9DVFJMCQkJCTE2IGJpdCByL3cJVHJhbnNtaXQgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBHTV9UWENSX0ZPUkNFX0pBTQkoMTw8MTUpCS8qIEJpdCAxNToJRm9yY2UgSmFtIC8gRmxvdy1Db250cm9sICovCisjZGVmaW5lIEdNX1RYQ1JfQ1JDX0RJUwkJKDE8PDE0KQkvKiBCaXQgMTQ6CURpc2FibGUgaW5zZXJ0aW9uIG9mIENSQyAqLworI2RlZmluZSBHTV9UWENSX1BBRF9ESVMJCSgxPDwxMykJLyogQml0IDEzOglEaXNhYmxlIHBhZGRpbmcgb2YgcGFja2V0cyAqLworI2RlZmluZSBHTV9UWENSX0NPTF9USFJfTVNLCSgxPDwxMCkJLyogQml0IDEyLi4xMDoJQ29sbGlzaW9uIFRocmVzaG9sZCAqLworCisjZGVmaW5lIFRYX0NPTF9USFIoeCkJCShTSElGVDEwKHgpICYgR01fVFhDUl9DT0xfVEhSX01TSykKKworI2RlZmluZSBUWF9DT0xfREVGCQkJMHgwNAorCQorLyoJR01fUlhfQ1RSTAkJCQkxNiBiaXQgci93CVJlY2VpdmUgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBHTV9SWENSX1VDRl9FTkEJCSgxPDwxNSkJLyogQml0IDE1OglFbmFibGUgVW5pY2FzdCBmaWx0ZXJpbmcgKi8KKyNkZWZpbmUgR01fUlhDUl9NQ0ZfRU5BCQkoMTw8MTQpCS8qIEJpdCAxNDoJRW5hYmxlIE11bHRpY2FzdCBmaWx0ZXJpbmcgKi8KKyNkZWZpbmUgR01fUlhDUl9DUkNfRElTCQkoMTw8MTMpCS8qIEJpdCAxMzoJUmVtb3ZlIDQtYnl0ZSBDUkMgKi8KKyNkZWZpbmUgR01fUlhDUl9QQVNTX0ZDCQkoMTw8MTIpCS8qIEJpdCAxMjoJUGFzcyBGQyBwYWNrZXRzIHRvIEZJRk8gKi8KKwkKKy8qCUdNX1RYX1BBUkFNCQkJCTE2IGJpdCByL3cJVHJhbnNtaXQgUGFyYW1ldGVyIFJlZ2lzdGVyICovCisjZGVmaW5lIEdNX1RYUEFfSkFNTEVOX01TSwkoMHgwMzw8MTQpCS8qIEJpdCAxNS4uMTQ6CUphbSBMZW5ndGggKi8KKyNkZWZpbmUgR01fVFhQQV9KQU1JUEdfTVNLCSgweDFmPDw5KQkvKiBCaXQgMTMuLjk6CUphbSBJUEcgKi8KKyNkZWZpbmUgR01fVFhQQV9KQU1EQVRfTVNLCSgweDFmPDw0KQkvKiBCaXQgIDguLjQ6CUlQRyBKYW0gdG8gRGF0YSAqLworCQkJCQkJCQkvKiBCaXQgIDMuLjA6CXJlc2VydmVkICovCisKKyNkZWZpbmUgVFhfSkFNX0xFTl9WQUwoeCkJKFNISUZUMTQoeCkgJiBHTV9UWFBBX0pBTUxFTl9NU0spCisjZGVmaW5lIFRYX0pBTV9JUEdfVkFMKHgpCShTSElGVDkoeCkgJiBHTV9UWFBBX0pBTUlQR19NU0spCisjZGVmaW5lIFRYX0lQR19KQU1fREFUQSh4KQkoU0hJRlQ0KHgpICYgR01fVFhQQV9KQU1EQVRfTVNLKQorCisjZGVmaW5lIFRYX0pBTV9MRU5fREVGCQkweDAzCisjZGVmaW5lIFRYX0pBTV9JUEdfREVGCQkweDBiCisjZGVmaW5lIFRYX0lQR19KQU1fREVGCQkweDFjCisKKy8qCUdNX1NFUklBTF9NT0RFCQkJMTYgYml0IHIvdwlTZXJpYWwgTW9kZSBSZWdpc3RlciAqLworI2RlZmluZSBHTV9TTU9EX0RBVEFCTF9NU0sJKDB4MWY8PDExKQkvKiBCaXQgMTUuLjExOglEYXRhIEJsaW5kZXIgKHIvbykgKi8KKyNkZWZpbmUgR01fU01PRF9MSU1JVF80CQkoMTw8MTApCS8qIEJpdCAxMDoJNCBjb25zZWN1dGl2ZSBUeCB0cmlhbHMgKi8KKyNkZWZpbmUgR01fU01PRF9WTEFOX0VOQQkoMTw8OSkJLyogQml0ICA5OglFbmFibGUgVkxBTiAgKE1heC4gRnJhbWUgTGVuKSAqLworI2RlZmluZSBHTV9TTU9EX0pVTUJPX0VOQQkoMTw8OCkJLyogQml0ICA4OglFbmFibGUgSnVtYm8gKE1heC4gRnJhbWUgTGVuKSAqLworCQkJCQkJCQkvKiBCaXQgIDcuLjU6CXJlc2VydmVkICovCisjZGVmaW5lIEdNX1NNT0RfSVBHX01TSwkJMHgxZgkvKiBCaXQgNC4uMDoJSW50ZXItUGFja2V0IEdhcCAoSVBHKSAqLworCQorI2RlZmluZSBEQVRBX0JMSU5EX1ZBTCh4KQkoU0hJRlQxMSh4KSAmIEdNX1NNT0RfREFUQUJMX01TSykKKyNkZWZpbmUgREFUQV9CTElORF9ERUYJCTB4MDQKKworI2RlZmluZSBJUEdfREFUQV9WQUwoeCkJCSh4ICYgR01fU01PRF9JUEdfTVNLKQorI2RlZmluZSBJUEdfREFUQV9ERUYJCTB4MWUKKworLyoJR01fU01JX0NUUkwJCQkJMTYgYml0IHIvdwlTTUkgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBHTV9TTUlfQ1RfUEhZX0FfTVNLCSgweDFmPDwxMSkJLyogQml0IDE1Li4xMToJUEhZIERldmljZSBBZGRyZXNzICovCisjZGVmaW5lIEdNX1NNSV9DVF9SRUdfQV9NU0sJKDB4MWY8PDYpCS8qIEJpdCAxMC4uIDY6CVBIWSBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lIEdNX1NNSV9DVF9PUF9SRAkJKDE8PDUpCS8qIEJpdCAgNToJT3BDb2RlIFJlYWQgKDA9V3JpdGUpKi8KKyNkZWZpbmUgR01fU01JX0NUX1JEX1ZBTAkoMTw8NCkJLyogQml0ICA0OglSZWFkIFZhbGlkIChSZWFkIGNvbXBsZXRlZCkgKi8KKyNkZWZpbmUgR01fU01JX0NUX0JVU1kJCSgxPDwzKQkvKiBCaXQgIDM6CUJ1c3kgKE9wZXJhdGlvbiBpbiBwcm9ncmVzcykgKi8KKwkJCQkJCQkJLyogQml0ICAgMi4uMDoJcmVzZXJ2ZWQgKi8KKwkKKyNkZWZpbmUgR01fU01JX0NUX1BIWV9BRCh4KQkoU0hJRlQxMSh4KSAmIEdNX1NNSV9DVF9QSFlfQV9NU0spCisjZGVmaW5lIEdNX1NNSV9DVF9SRUdfQUQoeCkJKFNISUZUNih4KSAmIEdNX1NNSV9DVF9SRUdfQV9NU0spCisKKwkvKglHTV9QSFlfQUREUgkJCQkxNiBiaXQgci93CUdQSFkgQWRkcmVzcyBSZWdpc3RlciAqLworCQkJCQkJCQkvKiBCaXQgIDE1Li42OglyZXNlcnZlZCAqLworI2RlZmluZSBHTV9QQVJfTUlCX0NMUgkJKDE8PDUpCS8qIEJpdCAgNToJU2V0IE1JQiBDbGVhciBDb3VudGVyIE1vZGUgKi8KKyNkZWZpbmUgR01fUEFSX01JQl9UU1QJCSgxPDw0KQkvKiBCaXQgIDQ6CU1JQiBMb2FkIENvdW50ZXIgKFRlc3QgTW9kZSkgKi8KKwkJCQkJCQkJLyogQml0ICAgMy4uMDoJcmVzZXJ2ZWQgKi8KKwkKKy8qIFJlY2VpdmUgRnJhbWUgU3RhdHVzIEVuY29kaW5nICovCisjZGVmaW5lIEdNUl9GU19MRU4JKDB4ZmZmZlVMPDwxNikJLyogQml0IDMxLi4xNjoJUnggRnJhbWUgTGVuZ3RoICovCisJCQkJCQkJCS8qIEJpdCAgMTUuLjE0OglyZXNlcnZlZCAqLworI2RlZmluZSBHTVJfRlNfVkxBTgkJKDFMPDwxMykJLyogQml0IDEzOglWTEFOIFBhY2tldCAqLworI2RlZmluZSBHTVJfRlNfSkFCQkVSCSgxTDw8MTIpCS8qIEJpdCAxMjoJSmFiYmVyIFBhY2tldCAqLworI2RlZmluZSBHTVJfRlNfVU5fU0laRQkoMUw8PDExKQkvKiBCaXQgMTE6CVVuZGVyc2l6ZSBQYWNrZXQgKi8KKyNkZWZpbmUgR01SX0ZTX01DCQkoMUw8PDEwKQkvKiBCaXQgMTA6CU11bHRpY2FzdCBQYWNrZXQgKi8KKyNkZWZpbmUgR01SX0ZTX0JDCQkoMUw8PDkpCQkvKiBCaXQgIDk6CUJyb2FkY2FzdCBQYWNrZXQgKi8KKyNkZWZpbmUgR01SX0ZTX1JYX09LCSgxTDw8OCkJCS8qIEJpdCAgODoJUmVjZWl2ZSBPSyAoR29vZCBQYWNrZXQpICovCisjZGVmaW5lIEdNUl9GU19HT09EX0ZDCSgxTDw8NykJCS8qIEJpdCAgNzoJR29vZCBGbG93LUNvbnRyb2wgUGFja2V0ICovCisjZGVmaW5lIEdNUl9GU19CQURfRkMJKDFMPDw2KQkJLyogQml0ICA2OglCYWQgIEZsb3ctQ29udHJvbCBQYWNrZXQgKi8KKyNkZWZpbmUgR01SX0ZTX01JSV9FUlIJKDFMPDw1KQkJLyogQml0ICA1OglNSUkgRXJyb3IgKi8KKyNkZWZpbmUgR01SX0ZTX0xPTkdfRVJSCSgxTDw8NCkJCS8qIEJpdCAgNDoJVG9vIExvbmcgUGFja2V0ICovCisjZGVmaW5lIEdNUl9GU19GUkFHTUVOVAkoMUw8PDMpCQkvKiBCaXQgIDM6CUZyYWdtZW50ICovCisJCQkJCQkJCS8qIEJpdCAgMjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgR01SX0ZTX0NSQ19FUlIJKDFMPDwxKQkJLyogQml0ICAxOglDUkMgRXJyb3IgKi8KKyNkZWZpbmUgR01SX0ZTX1JYX0ZGX09WCSgxTDw8MCkJCS8qIEJpdCAgMDoJUnggRklGTyBPdmVyZmxvdyAqLworCisvKgorICogR01SX0ZTX0FOWV9FUlIgKGFuYWxvZ291cyB0byBYTVJfRlNfQU5ZX0VSUikKKyAqLworI2RlZmluZSBHTVJfRlNfQU5ZX0VSUgkoR01SX0ZTX0NSQ19FUlIgfCBcCisJCQlHTVJfRlNfTE9OR19FUlIgfCBcCisJCQlHTVJfRlNfTUlJX0VSUiB8IFwKKwkJCUdNUl9GU19CQURfRkMgfCBcCisJCQlHTVJfRlNfR09PRF9GQyB8IFwKKwkJCUdNUl9GU19KQUJCRVIpCisKKy8qIFJ4IEdNQUMgRklGTyBGbHVzaCBNYXNrIChkZWZhdWx0KSAqLworI2RlZmluZSBSWF9GRl9GTF9ERUZfTVNLCShHTVJfRlNfQ1JDX0VSUiB8IFwKKwkJCUdNUl9GU19SWF9GRl9PViB8IFwKKwkJCUdNUl9GU19NSUlfRVJSIHwgXAorCQkJR01SX0ZTX0JBRF9GQyB8IFwKKwkJCUdNUl9GU19HT09EX0ZDIHwgXAorCQkJR01SX0ZTX1VOX1NJWkUgfCBcCisJCQlHTVJfRlNfSkFCQkVSKQorCisvKiB0eXBlZGVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCS8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZgkvKiBfX0lOQ19YTUFDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2thZGRyLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrYWRkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZTI1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrYWRkci5jCkBAIC0wLDAgKzEsMTc3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrYWRkci5jCisgKiBQcm9qZWN0OglHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXJzLCBBRERSLU1vZHVsZQorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjUyICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzA2LzAyIDEzOjQ2OjE1ICQKKyAqIFB1cnBvc2U6CU1hbmFnZSBBZGRyZXNzZXMgKE11bHRpY2FzdCBhbmQgVW5pY2FzdCkgYW5kIFByb21pc2N1b3VzIE1vZGUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdCBHbWJILgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFRoaXMgbW9kdWxlIGlzIGludGVuZGVkIHRvIG1hbmFnZSBtdWx0aWNhc3QgYWRkcmVzc2VzLCBhZGRyZXNzIG92ZXJyaWRlLAorICogYW5kIHByb21pc2N1b3VzIG1vZGUgb24gR0VuZXNpcyBhbmQgWXVrb24gYWRhcHRlcnMuCisgKgorICogQWRkcmVzcyBMYXlvdXQ6CisgKglwb3J0IGFkZHJlc3M6CQlwaHlzaWNhbCBNQUMgYWRkcmVzcworICoJMXN0IGV4YWN0IG1hdGNoOglsb2dpY2FsIE1BQyBhZGRyZXNzIChHRW5lc2lzIG9ubHkpCisgKgkybmQgZXhhY3QgbWF0Y2g6CVJMTVQgbXVsdGljYXN0IChHRW5lc2lzIG9ubHkpCisgKglleGFjdCBtYXRjaCAzLTEzOglPUy1zcGVjaWZpYyBtdWx0aWNhc3RzIChHRW5lc2lzIG9ubHkpCisgKgorICogSW5jbHVkZSBGaWxlIEhpZXJhcmNoeToKKyAqCisgKgkic2tkcnYxc3QuaCIKKyAqCSJza2RydjJuZC5oIgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAoZGVmaW5lZChERUJVRykgfHwgKCghZGVmaW5lZChMSU5UKSkgJiYgKCFkZWZpbmVkKFNLX1NMSU0pKSkpCitzdGF0aWMgY29uc3QgY2hhciBTeXNLb25uZWN0RmlsZUlkW10gPQorCSJAKCMpICRJZDogc2thZGRyLmMsdiAxLjUyIDIwMDMvMDYvMDIgMTM6NDY6MTUgdHNjaGlsbGkgRXhwICQgKEMpIE1hcnZlbGwuIjsKKyNlbmRpZiAvKiBERUJVRyB8fCFMSU5UIHx8ICFTS19TTElNICovCisKKyNkZWZpbmUgX19TS0FERFJfQworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCS8qIGNwbHVzcGx1cyAqLworCisjaW5jbHVkZSAiaC9za2RydjFzdC5oIgorI2luY2x1ZGUgImgvc2tkcnYybmQuaCIKKworLyogZGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjZGVmaW5lIFhNQUNfUE9MWQkweEVEQjg4MzIwVUwJLyogQ1JDMzItUG9seSAtIFhNQUM6IExpdHRsZSBFbmRpYW4gKi8KKyNkZWZpbmUgR01BQ19QT0xZCTB4MDRDMTFEQjdMCS8qIENSQzE2LVBvbHkgLSBHTUFDOiBMaXR0bGUgRW5kaWFuICovCisjZGVmaW5lIEhBU0hfQklUUwk2CQkJCS8qICNiaXRzIGluIGhhc2ggKi8KKyNkZWZpbmUJU0tfTUNfQklUCTB4MDEKKworLyogRXJyb3IgbnVtYmVycyBhbmQgbWVzc2FnZXMuICovCisKKyNkZWZpbmUgU0tFUlJfQUREUl9FMDAxCQkoU0tfRVJSQkFTRV9BRERSICsgMCkKKyNkZWZpbmUgU0tFUlJfQUREUl9FMDAxTVNHCSJCYWQgRmxhZ3MuIgorI2RlZmluZSBTS0VSUl9BRERSX0UwMDIJCShTS0VSUl9BRERSX0UwMDEgKyAxKQorI2RlZmluZSBTS0VSUl9BRERSX0UwMDJNU0cJIk5ldyBFcnJvci4iCisKKy8qIHR5cGVkZWZzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE5vbmUuICovCisKKy8qIGdsb2JhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIDY0LWJpdCBoYXNoIHZhbHVlcyB3aXRoIGFsbCBiaXRzIHNldC4gKi8KKworc3RhdGljIGNvbnN0IFNLX1UxNglPbmVzSGFzaFs0XSA9IHsweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkZ9OworCisvKiBsb2NhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgREVCVUcKK3N0YXRpYyBpbnQJTmV4dDBbU0tfTUFYX01BQ1NdID0gezB9OworI2VuZGlmCS8qIERFQlVHICovCisKKy8qIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0FkZHJJbml0IC0gaW5pdGlhbGl6ZSBkYXRhLCBzZXQgc3RhdGUgdG8gaW5pdAorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqCVNLX0lOSVRfREFUQQorICoJPT09PT09PT09PT09CisgKgorICoJVGhpcyByb3V0aW5lIGNsZWFycyB0aGUgbXVsdGljYXN0IHRhYmxlcyBhbmQgcmVzZXRzIHByb21pc2N1b3VzIG1vZGUuCisgKglTb21lIGVudHJpZXMgYXJlIHJlc2VydmVkIGZvciB0aGUgImxvZ2ljYWwgTUFDIGFkZHJlc3MiLCB0aGUKKyAqCVNLLVJMTVQgbXVsdGljYXN0IGFkZHJlc3MsIGFuZCB0aGUgQlBEVSBtdWx0aWNhc3QgYWRkcmVzcy4KKyAqCisgKgorICoJU0tfSU5JVF9JTworICoJPT09PT09PT09PQorICoKKyAqCUFsbCBwZXJtYW5lbnQgTUFDIGFkZHJlc3NlcyBhcmUgcmVhZCBmcm9tIEVQUk9NLgorICoJSWYgdGhlIGN1cnJlbnQgTUFDIGFkZHJlc3NlcyBhcmUgbm90IGFscmVhZHkgc2V0IGluIHNvZnR3YXJlLAorICoJdGhleSBhcmUgc2V0IHRvIHRoZSB2YWx1ZXMgb2YgdGhlIHBlcm1hbmVudCBhZGRyZXNzZXMuCisgKglUaGUgY3VycmVudCBhZGRyZXNzZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIGNvcnJlc3BvbmRpbmcgTUFDLgorICoKKyAqCisgKglTS19JTklUX1JVTgorICoJPT09PT09PT09PT0KKyAqCisgKglOb3RoaW5nLgorICoKKyAqIENvbnRleHQ6CisgKglpbml0LCBwYWdlYWJsZQorICoKKyAqIFJldHVybnM6CisgKglTS19BRERSX1NVQ0NFU1MKKyAqLworaW50CVNrQWRkckluaXQoCitTS19BQwkqcEFDLAkvKiB0aGUgYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJL08gY29udGV4dCAqLworaW50CQlMZXZlbCkJLyogaW5pdGlhbGl6YXRpb24gbGV2ZWwgKi8KK3sKKwlpbnQJCQlqOworCVNLX1UzMgkJaTsKKwlTS19VOAkJKkluQWRkcjsKKwlTS19VMTYJCSpPdXRBZGRyOworCVNLX0FERFJfUE9SVAkqcEFQb3J0OworCisJc3dpdGNoIChMZXZlbCkgeworCWNhc2UgU0tfSU5JVF9EQVRBOgorCQlTS19NRU1TRVQoKGNoYXIgKikgJnBBQy0+QWRkciwgKFNLX1U4KSAwLAorICAgICAgICAgICAgKFNLX1UxNikgc2l6ZW9mKFNLX0FERFIpKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgU0tfTUFYX01BQ1M7IGkrKykgeworCQkJcEFQb3J0ID0gJnBBQy0+QWRkci5Qb3J0W2ldOworCQkJcEFQb3J0LT5Qcm9tTW9kZSA9IFNLX1BST01fTU9ERV9OT05FOworCQkJCisJCQlwQVBvcnQtPkZpcnN0RXhhY3RNYXRjaFJsbXQgPSBTS19BRERSX0ZJUlNUX01BVENIX1JMTVQ7CisJCQlwQVBvcnQtPkZpcnN0RXhhY3RNYXRjaERydiA9IFNLX0FERFJfRklSU1RfTUFUQ0hfRFJWOworCQkJcEFQb3J0LT5OZXh0RXhhY3RNYXRjaFJsbXQgPSBTS19BRERSX0ZJUlNUX01BVENIX1JMTVQ7CisJCQlwQVBvcnQtPk5leHRFeGFjdE1hdGNoRHJ2ID0gU0tfQUREUl9GSVJTVF9NQVRDSF9EUlY7CisJCX0KKyNpZmRlZiB4REVCVUcKKwkJZm9yIChpID0gMDsgaSA8IFNLX01BWF9NQUNTOyBpKyspIHsKKwkJCWlmIChwQUMtPkFkZHIuUG9ydFtpXS5OZXh0RXhhY3RNYXRjaFJsbXQgPAorCQkJCVNLX0FERFJfRklSU1RfTUFUQ0hfUkxNVCkgeworCQkJCU5leHQwW2ldIHw9IDQ7CisJCQl9CisJCX0KKyNlbmRpZgkvKiBERUJVRyAqLworCQkvKiBwQUMtPkFkZHIuSW5pdERvbmUgPSBTS19JTklUX0RBVEE7ICovCisJCWJyZWFrOworCisgICAgY2FzZSBTS19JTklUX0lPOgorI2lmbmRlZiBTS19OT19STE1UCisJCWZvciAoaSA9IDA7IGkgPCBTS19NQVhfTkVUUzsgaSsrKSB7CisJCQlwQUMtPkFkZHIuTmV0W2ldLkFjdGl2ZVBvcnQgPSBwQUMtPlJsbXQuTmV0W2ldLkFjdGl2ZVBvcnQ7CisJCX0KKyNlbmRpZiAvKiAhU0tfTk9fUkxNVCAqLworI2lmZGVmIHhERUJVRworCQlmb3IgKGkgPSAwOyBpIDwgU0tfTUFYX01BQ1M7IGkrKykgeworCQkJaWYgKHBBQy0+QWRkci5Qb3J0W2ldLk5leHRFeGFjdE1hdGNoUmxtdCA8CisJCQkJU0tfQUREUl9GSVJTVF9NQVRDSF9STE1UKSB7CisJCQkJTmV4dDBbaV0gfD0gODsKKwkJCX0KKwkJfQorI2VuZGlmCS8qIERFQlVHICovCisJCQorCQkvKiBSZWFkIHBlcm1hbmVudCBsb2dpY2FsIE1BQyBhZGRyZXNzIGZyb20gQ29udHJvbCBSZWdpc3RlciBGaWxlLiAqLworCQlmb3IgKGogPSAwOyBqIDwgU0tfTUFDX0FERFJfTEVOOyBqKyspIHsKKwkJCUluQWRkciA9IChTS19VOCAqKSAmcEFDLT5BZGRyLk5ldFswXS5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbal07CisJCQlTS19JTjgoSW9DLCBCMl9NQUNfMSArIGosIEluQWRkcik7CisJCX0KKworCQlpZiAoIXBBQy0+QWRkci5OZXRbMF0uQ3VycmVudE1hY0FkZHJlc3NTZXQpIHsKKwkJCS8qIFNldCB0aGUgY3VycmVudCBsb2dpY2FsIE1BQyBhZGRyZXNzIHRvIHRoZSBwZXJtYW5lbnQgb25lLiAqLworCQkJcEFDLT5BZGRyLk5ldFswXS5DdXJyZW50TWFjQWRkcmVzcyA9CisJCQkJcEFDLT5BZGRyLk5ldFswXS5QZXJtYW5lbnRNYWNBZGRyZXNzOworCQkJcEFDLT5BZGRyLk5ldFswXS5DdXJyZW50TWFjQWRkcmVzc1NldCA9IFNLX1RSVUU7CisJCX0KKworCQkvKiBTZXQgdGhlIGN1cnJlbnQgbG9naWNhbCBNQUMgYWRkcmVzcy4gKi8KKwkJcEFDLT5BZGRyLlBvcnRbcEFDLT5BZGRyLk5ldFswXS5BY3RpdmVQb3J0XS5FeGFjdFswXSA9CisJCQlwQUMtPkFkZHIuTmV0WzBdLkN1cnJlbnRNYWNBZGRyZXNzOworI2lmIFNLX01BWF9ORVRTID4gMQorCQkvKiBTZXQgbG9naWNhbCBNQUMgYWRkcmVzcyBmb3IgbmV0IDIgdG8gKGxvZyB8IDMpLiAqLworCQlpZiAoIXBBQy0+QWRkci5OZXRbMV0uQ3VycmVudE1hY0FkZHJlc3NTZXQpIHsKKwkJCXBBQy0+QWRkci5OZXRbMV0uUGVybWFuZW50TWFjQWRkcmVzcyA9CisJCQkJcEFDLT5BZGRyLk5ldFswXS5QZXJtYW5lbnRNYWNBZGRyZXNzOworCQkJcEFDLT5BZGRyLk5ldFsxXS5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbNV0gfD0gMzsKKwkJCS8qIFNldCB0aGUgY3VycmVudCBsb2dpY2FsIE1BQyBhZGRyZXNzIHRvIHRoZSBwZXJtYW5lbnQgb25lLiAqLworCQkJcEFDLT5BZGRyLk5ldFsxXS5DdXJyZW50TWFjQWRkcmVzcyA9CisJCQkJcEFDLT5BZGRyLk5ldFsxXS5QZXJtYW5lbnRNYWNBZGRyZXNzOworCQkJcEFDLT5BZGRyLk5ldFsxXS5DdXJyZW50TWFjQWRkcmVzc1NldCA9IFNLX1RSVUU7CisJCX0KKyNlbmRpZgkvKiBTS19NQVhfTkVUUyA+IDEgKi8KKworI2lmZGVmIERFQlVHCisJCWZvciAoaSA9IDA7IGkgPCAoU0tfVTMyKSBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BRERSLCBTS19EQkdDQVRfSU5JVCwKKwkJCQkoIlBlcm1hbmVudCBNQUMgQWRkcmVzcyAoTmV0JWQpOiAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkJCQkJaSwKKwkJCQkJcEFDLT5BZGRyLk5ldFtpXS5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbMF0sCisJCQkJCXBBQy0+QWRkci5OZXRbaV0uUGVybWFuZW50TWFjQWRkcmVzcy5hWzFdLAorCQkJCQlwQUMtPkFkZHIuTmV0W2ldLlBlcm1hbmVudE1hY0FkZHJlc3MuYVsyXSwKKwkJCQkJcEFDLT5BZGRyLk5ldFtpXS5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbM10sCisJCQkJCXBBQy0+QWRkci5OZXRbaV0uUGVybWFuZW50TWFjQWRkcmVzcy5hWzRdLAorCQkJCQlwQUMtPkFkZHIuTmV0W2ldLlBlcm1hbmVudE1hY0FkZHJlc3MuYVs1XSkpCisJCQkKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0lOSVQsCisJCQkJKCJMb2dpY2FsIE1BQyBBZGRyZXNzIChOZXQlZCk6ICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYXG4iLAorCQkJCQlpLAorCQkJCQlwQUMtPkFkZHIuTmV0W2ldLkN1cnJlbnRNYWNBZGRyZXNzLmFbMF0sCisJCQkJCXBBQy0+QWRkci5OZXRbaV0uQ3VycmVudE1hY0FkZHJlc3MuYVsxXSwKKwkJCQkJcEFDLT5BZGRyLk5ldFtpXS5DdXJyZW50TWFjQWRkcmVzcy5hWzJdLAorCQkJCQlwQUMtPkFkZHIuTmV0W2ldLkN1cnJlbnRNYWNBZGRyZXNzLmFbM10sCisJCQkJCXBBQy0+QWRkci5OZXRbaV0uQ3VycmVudE1hY0FkZHJlc3MuYVs0XSwKKwkJCQkJcEFDLT5BZGRyLk5ldFtpXS5DdXJyZW50TWFjQWRkcmVzcy5hWzVdKSkKKwkJfQorI2VuZGlmCS8qIERFQlVHICovCisKKwkJZm9yIChpID0gMDsgaSA8IChTS19VMzIpIHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCQlwQVBvcnQgPSAmcEFDLT5BZGRyLlBvcnRbaV07CisKKwkJCS8qIFJlYWQgcGVybWFuZW50IHBvcnQgYWRkcmVzc2VzIGZyb20gQ29udHJvbCBSZWdpc3RlciBGaWxlLiAqLworCQkJZm9yIChqID0gMDsgaiA8IFNLX01BQ19BRERSX0xFTjsgaisrKSB7CisJCQkJSW5BZGRyID0gKFNLX1U4ICopICZwQVBvcnQtPlBlcm1hbmVudE1hY0FkZHJlc3MuYVtqXTsKKwkJCQlTS19JTjgoSW9DLCBCMl9NQUNfMiArIDggKiBpICsgaiwgSW5BZGRyKTsKKwkJCX0KKworCQkJaWYgKCFwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzU2V0KSB7CisJCQkJLyoKKwkJCQkgKiBTZXQgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHBoeXNpY2FsIE1BQyBhZGRyZXNzCisJCQkJICogb2YgdGhpcyBwb3J0IHRvIGl0cyBwZXJtYW5lbnQgTUFDIGFkZHJlc3MuCisJCQkJICovCisJCQkJcEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzcyA9IHBBUG9ydC0+UGVybWFuZW50TWFjQWRkcmVzczsKKwkJCQlwQVBvcnQtPlByZXZpb3VzTWFjQWRkcmVzcyA9IHBBUG9ydC0+UGVybWFuZW50TWFjQWRkcmVzczsKKwkJCQlwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzU2V0ID0gU0tfVFJVRTsKKwkJCX0KKworCQkJLyogU2V0IHBvcnQncyBjdXJyZW50IHBoeXNpY2FsIE1BQyBhZGRyZXNzLiAqLworCQkJT3V0QWRkciA9IChTS19VMTYgKikgJnBBUG9ydC0+Q3VycmVudE1hY0FkZHJlc3MuYVswXTsKKyNpZmRlZiBHRU5FU0lTCisJCQlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkJCVhNX09VVEFERFIoSW9DLCBpLCBYTV9TQSwgT3V0QWRkcik7CisJCQl9CisjZW5kaWYgLyogR0VORVNJUyAqLworI2lmZGVmIFlVS09OCisJCQlpZiAoIXBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCQlHTV9PVVRBRERSKElvQywgaSwgR01fU1JDX0FERFJfMUwsIE91dEFkZHIpOworCQkJfQorI2VuZGlmIC8qIFlVS09OICovCisjaWZkZWYgREVCVUcKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0lOSVQsCisJCQkJKCJTa0FkZHJJbml0OiBQZXJtYW5lbnQgUGh5c2ljYWwgTUFDIEFkZHJlc3M6ICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYXG4iLAorCQkJCQlwQVBvcnQtPlBlcm1hbmVudE1hY0FkZHJlc3MuYVswXSwKKwkJCQkJcEFQb3J0LT5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbMV0sCisJCQkJCXBBUG9ydC0+UGVybWFuZW50TWFjQWRkcmVzcy5hWzJdLAorCQkJCQlwQVBvcnQtPlBlcm1hbmVudE1hY0FkZHJlc3MuYVszXSwKKwkJCQkJcEFQb3J0LT5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbNF0sCisJCQkJCXBBUG9ydC0+UGVybWFuZW50TWFjQWRkcmVzcy5hWzVdKSkKKwkJCQorCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BRERSLCBTS19EQkdDQVRfSU5JVCwKKwkJCQkoIlNrQWRkckluaXQ6IFBoeXNpY2FsIE1BQyBBZGRyZXNzOiAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkJCQkJcEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzcy5hWzBdLAorCQkJCQlwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmFbMV0sCisJCQkJCXBBUG9ydC0+Q3VycmVudE1hY0FkZHJlc3MuYVsyXSwKKwkJCQkJcEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzcy5hWzNdLAorCQkJCQlwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmFbNF0sCisJCQkJCXBBUG9ydC0+Q3VycmVudE1hY0FkZHJlc3MuYVs1XSkpCisjZW5kaWYgLyogREVCVUcgKi8KKwkJfQorCQkvKiBwQUMtPkFkZHIuSW5pdERvbmUgPSBTS19JTklUX0lPOyAqLworCQlicmVhazsKKworCWNhc2UgU0tfSU5JVF9SVU46CisjaWZkZWYgeERFQlVHCisJCWZvciAoaSA9IDA7IGkgPCBTS19NQVhfTUFDUzsgaSsrKSB7CisJCQlpZiAocEFDLT5BZGRyLlBvcnRbaV0uTmV4dEV4YWN0TWF0Y2hSbG10IDwKKwkJCQlTS19BRERSX0ZJUlNUX01BVENIX1JMTVQpIHsKKwkJCQlOZXh0MFtpXSB8PSAxNjsKKwkJCX0KKwkJfQorI2VuZGlmCS8qIERFQlVHICovCisKKwkJLyogcEFDLT5BZGRyLkluaXREb25lID0gU0tfSU5JVF9SVU47ICovCisJCWJyZWFrOworCisJZGVmYXVsdDoJLyogZXJyb3IgKi8KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIChTS19BRERSX1NVQ0NFU1MpOworCQorfQkvKiBTa0FkZHJJbml0ICovCisKKyNpZm5kZWYgU0tfU0xJTQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tBZGRyTWNDbGVhciAtIGNsZWFyIHRoZSBtdWx0aWNhc3QgdGFibGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBjbGVhcnMgdGhlIG11bHRpY2FzdCB0YWJsZS4KKyAqCisgKglJZiBub3Qgc3VwcHJlc3NlZCBieSBGbGFnIFNLX01DX1NXX09OTFksIHRoZSBoYXJkd2FyZSBpcyB1cGRhdGVkCisgKglpbW1lZGlhdGVseS4KKyAqCisgKglJdCBjYWxscyBlaXRoZXIgU2tBZGRyWG1hY01jQ2xlYXIgb3IgU2tBZGRyR21hY01jQ2xlYXIsIGFjY29yZGluZworICoJdG8gdGhlIGFkYXB0ZXIgaW4gdXNlLiBUaGUgcmVhbCB3b3JrIGlzIGRvbmUgdGhlcmUuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlCisgKgltYXkgYmUgY2FsbGVkIHN0YXJ0aW5nIHdpdGggU0tfSU5JVF9EQVRBIHdpdGggZmxhZyBTS19NQ19TV19PTkxZCisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8gd2l0aG91dCBsaW1pdGF0aW9uCisgKgorICogUmV0dXJuczoKKyAqCVNLX0FERFJfU1VDQ0VTUworICoJU0tfQUREUl9JTExFR0FMX1BPUlQKKyAqLworaW50CVNrQWRkck1jQ2xlYXIoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSS9PIGNvbnRleHQgKi8KK1NLX1UzMglQb3J0TnVtYmVyLAkvKiBJbmRleCBvZiBhZmZlY3RlZCBwb3J0ICovCitpbnQJCUZsYWdzKQkJLyogcGVybWFuZW50L25vbi1wZXJtLCBzdy1vbmx5ICovCit7CisJaW50IFJldHVybkNvZGU7CisJCisJaWYgKFBvcnROdW1iZXIgPj0gKFNLX1UzMikgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kKSB7CisJCXJldHVybiAoU0tfQUREUl9JTExFR0FMX1BPUlQpOworCX0KKwkKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQlSZXR1cm5Db2RlID0gU2tBZGRyWG1hY01jQ2xlYXIocEFDLCBJb0MsIFBvcnROdW1iZXIsIEZsYWdzKTsKKwl9CisJZWxzZSB7CisJCVJldHVybkNvZGUgPSBTa0FkZHJHbWFjTWNDbGVhcihwQUMsIElvQywgUG9ydE51bWJlciwgRmxhZ3MpOworCX0KKworCXJldHVybiAoUmV0dXJuQ29kZSk7CisKK30JLyogU2tBZGRyTWNDbGVhciAqLworCisjZW5kaWYgLyogIVNLX1NMSU0gKi8KKworI2lmbmRlZiBTS19TTElNCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0FkZHJYbWFjTWNDbGVhciAtIGNsZWFyIHRoZSBtdWx0aWNhc3QgdGFibGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBjbGVhcnMgdGhlIG11bHRpY2FzdCB0YWJsZQorICoJKGVpdGhlciBlbnRyeSAyIG9yIGVudHJpZXMgMy0xNiBhbmQgSW5leGFjdEZpbHRlcikgb2YgdGhlIGdpdmVuIHBvcnQuCisgKglJZiBub3Qgc3VwcHJlc3NlZCBieSBGbGFnIFNLX01DX1NXX09OTFksIHRoZSBoYXJkd2FyZSBpcyB1cGRhdGVkCisgKglpbW1lZGlhdGVseS4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGUKKyAqCW1heSBiZSBjYWxsZWQgc3RhcnRpbmcgd2l0aCBTS19JTklUX0RBVEEgd2l0aCBmbGFnIFNLX01DX1NXX09OTFkKKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTyB3aXRob3V0IGxpbWl0YXRpb24KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfQUREUl9TVUNDRVNTCisgKglTS19BRERSX0lMTEVHQUxfUE9SVAorICovCitpbnQJU2tBZGRyWG1hY01jQ2xlYXIoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSS9PIGNvbnRleHQgKi8KK1NLX1UzMglQb3J0TnVtYmVyLAkvKiBJbmRleCBvZiBhZmZlY3RlZCBwb3J0ICovCitpbnQJCUZsYWdzKQkJLyogcGVybWFuZW50L25vbi1wZXJtLCBzdy1vbmx5ICovCit7CisJaW50IGk7CisKKwlpZiAoRmxhZ3MgJiBTS19BRERSX1BFUk1BTkVOVCkgewkvKiBwZXJtYW5lbnQgPT4gUkxNVCAqLworCisJCS8qIENsZWFyIFJMTVQgbXVsdGljYXN0IGFkZHJlc3Nlcy4gKi8KKwkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uTmV4dEV4YWN0TWF0Y2hSbG10ID0gU0tfQUREUl9GSVJTVF9NQVRDSF9STE1UOworCX0KKwllbHNlIHsJLyogbm90IHBlcm1hbmVudCA9PiBEUlYgKi8KKworCQkvKiBDbGVhciBJbmV4YWN0RmlsdGVyICovCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV0gPSAwOworCQl9CisKKwkJLyogQ2xlYXIgRFJWIG11bHRpY2FzdCBhZGRyZXNzZXMuICovCisKKwkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uTmV4dEV4YWN0TWF0Y2hEcnYgPSBTS19BRERSX0ZJUlNUX01BVENIX0RSVjsKKwl9CisKKwlpZiAoIShGbGFncyAmIFNLX01DX1NXX09OTFkpKSB7CisJCSh2b2lkKSBTa0FkZHJYbWFjTWNVcGRhdGUocEFDLCBJb0MsIFBvcnROdW1iZXIpOworCX0KKworCXJldHVybiAoU0tfQUREUl9TVUNDRVNTKTsKKwkKK30JLyogU2tBZGRyWG1hY01jQ2xlYXIgKi8KKworI2VuZGlmIC8qICFTS19TTElNICovCisKKyNpZm5kZWYgU0tfU0xJTQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tBZGRyR21hY01jQ2xlYXIgLSBjbGVhciB0aGUgbXVsdGljYXN0IHRhYmxlCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgY2xlYXJzIHRoZSBtdWx0aWNhc3QgaGFzaGluZyB0YWJsZSAoSW5leGFjdEZpbHRlcikKKyAqCShlaXRoZXIgdGhlIFJMTVQgb3IgdGhlIGRyaXZlciBiaXRzKSBvZiB0aGUgZ2l2ZW4gcG9ydC4KKyAqCisgKglJZiBub3Qgc3VwcHJlc3NlZCBieSBGbGFnIFNLX01DX1NXX09OTFksIHRoZSBoYXJkd2FyZSBpcyB1cGRhdGVkCisgKglpbW1lZGlhdGVseS4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGUKKyAqCW1heSBiZSBjYWxsZWQgc3RhcnRpbmcgd2l0aCBTS19JTklUX0RBVEEgd2l0aCBmbGFnIFNLX01DX1NXX09OTFkKKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTyB3aXRob3V0IGxpbWl0YXRpb24KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfQUREUl9TVUNDRVNTCisgKglTS19BRERSX0lMTEVHQUxfUE9SVAorICovCitpbnQJU2tBZGRyR21hY01jQ2xlYXIoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSS9PIGNvbnRleHQgKi8KK1NLX1UzMglQb3J0TnVtYmVyLAkvKiBJbmRleCBvZiBhZmZlY3RlZCBwb3J0ICovCitpbnQJCUZsYWdzKQkJLyogcGVybWFuZW50L25vbi1wZXJtLCBzdy1vbmx5ICovCit7CisJaW50IGk7CisKKyNpZmRlZiBERUJVRworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0NUUkwsCisJCSgiR01BQyBJbmV4YWN0RmlsdGVyIChub3QgY2xlYXJlZCk6ICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbMF0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzWzFdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1syXSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbM10sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzWzRdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1s1XSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbNl0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzWzddKSkKKyNlbmRpZgkvKiBERUJVRyAqLworCisJLyogQ2xlYXIgSW5leGFjdEZpbHRlciAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1tpXSA9IDA7CisJfQorCQorCWlmIChGbGFncyAmIFNLX0FERFJfUEVSTUFORU5UKSB7CS8qIHBlcm1hbmVudCA9PiBSTE1UICovCisJCQorCQkvKiBDb3B5IERSViBiaXRzIHRvIEluZXhhY3RGaWx0ZXIuICovCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV0gfD0KKwkJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RHJ2RmlsdGVyLkJ5dGVzW2ldOworCQkJCisJCQkvKiBDbGVhciBJbmV4YWN0UmxtdEZpbHRlci4gKi8KKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RSbG10RmlsdGVyLkJ5dGVzW2ldID0gMDsKKworCQl9CQkKKwl9CisJZWxzZSB7CS8qIG5vdCBwZXJtYW5lbnQgPT4gRFJWICovCisJCQorCQkvKiBDb3B5IFJMTVQgYml0cyB0byBJbmV4YWN0RmlsdGVyLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzW2ldIHw9CisJCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdFJsbXRGaWx0ZXIuQnl0ZXNbaV07CisJCQkKKwkJCS8qIENsZWFyIEluZXhhY3REcnZGaWx0ZXIuICovCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RHJ2RmlsdGVyLkJ5dGVzW2ldID0gMDsKKwkJfQorCX0KKwkKKyNpZmRlZiBERUJVRworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0NUUkwsCisJCSgiR01BQyBJbmV4YWN0RmlsdGVyIChjbGVhcmVkKTogJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYXG4iLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1swXSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbMV0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzWzJdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1szXSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbNF0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzWzVdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1s2XSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbN10pKQorI2VuZGlmCS8qIERFQlVHICovCisJCisJaWYgKCEoRmxhZ3MgJiBTS19NQ19TV19PTkxZKSkgeworCQkodm9pZCkgU2tBZGRyR21hY01jVXBkYXRlKHBBQywgSW9DLCBQb3J0TnVtYmVyKTsKKwl9CisJCisJcmV0dXJuIChTS19BRERSX1NVQ0NFU1MpOworCit9CS8qIFNrQWRkckdtYWNNY0NsZWFyICovCisKKyNpZm5kZWYgU0tfQUREUl9DSEVBVAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tYbWFjTWNIYXNoIC0gaGFzaCBtdWx0aWNhc3QgYWRkcmVzcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSBoYXNoIHZhbHVlIGZvciBhIG11bHRpY2FzdCBhZGRyZXNzLgorICoJQSBDUkMzMiBhbGdvcml0aG0gaXMgdXNlZC4KKyAqCisgKiBOb3RlczoKKyAqCVRoZSBjb2RlIHdhcyBhZGFwdGVkIGZyb20gdGhlIFhhUXRpIGRhdGEgc2hlZXQuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlCisgKgorICogUmV0dXJuczoKKyAqCUhhc2ggdmFsdWUgb2YgbXVsdGljYXN0IGFkZHJlc3MuCisgKi8KK1NLX1UzMiBTa1htYWNNY0hhc2goCit1bnNpZ25lZCBjaGFyICpwTWMpCS8qIE11bHRpY2FzdCBhZGRyZXNzICovCit7CisJU0tfVTMyIElkeDsKKwlTS19VMzIgQml0OworCVNLX1UzMiBEYXRhOworCVNLX1UzMiBDcmM7CisKKwlDcmMgPSAweEZGRkZGRkZGVUw7CisJZm9yIChJZHggPSAwOyBJZHggPCBTS19NQUNfQUREUl9MRU47IElkeCsrKSB7CisJCURhdGEgPSAqcE1jKys7CisJCWZvciAoQml0ID0gMDsgQml0IDwgODsgQml0KyssIERhdGEgPj49IDEpIHsKKwkJCUNyYyA9IChDcmMgPj4gMSkgXiAoKChDcmMgXiBEYXRhKSAmIDEpID8gWE1BQ19QT0xZIDogMCk7CisJCX0KKwl9CisKKwlyZXR1cm4gKENyYyAmICgoMSA8PCBIQVNIX0JJVFMpIC0gMSkpOworCit9CS8qIFNrWG1hY01jSGFzaCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dtYWNNY0hhc2ggLSBoYXNoIG11bHRpY2FzdCBhZGRyZXNzCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIGhhc2ggdmFsdWUgZm9yIGEgbXVsdGljYXN0IGFkZHJlc3MuCisgKglBIENSQzE2IGFsZ29yaXRobSBpcyB1c2VkLgorICoKKyAqIE5vdGVzOgorICoKKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGUKKyAqCisgKiBSZXR1cm5zOgorICoJSGFzaCB2YWx1ZSBvZiBtdWx0aWNhc3QgYWRkcmVzcy4KKyAqLworU0tfVTMyIFNrR21hY01jSGFzaCgKK3Vuc2lnbmVkIGNoYXIgKnBNYykJLyogTXVsdGljYXN0IGFkZHJlc3MgKi8KK3sKKwlTS19VMzIgRGF0YTsKKwlTS19VMzIgVG1wRGF0YTsKKwlTS19VMzIgQ3JjOworCWludCBCeXRlOworCWludCBCaXQ7CisKKwlDcmMgPSAweEZGRkZGRkZGVUw7CisJZm9yIChCeXRlID0gMDsgQnl0ZSA8IDY7IEJ5dGUrKykgeworCQkvKiBHZXQgbmV4dCBieXRlLiAqLworCQlEYXRhID0gKFNLX1UzMikgcE1jW0J5dGVdOworCQkKKwkJLyogQ2hhbmdlIGJpdCBvcmRlciBpbiBieXRlLiAqLworCQlUbXBEYXRhID0gRGF0YTsKKwkJZm9yIChCaXQgPSAwOyBCaXQgPCA4OyBCaXQrKykgeworCQkJaWYgKFRtcERhdGEgJiAxTCkgeworCQkJCURhdGEgfD0gIDFMIDw8ICg3IC0gQml0KTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCURhdGEgJj0gfigxTCA8PCAoNyAtIEJpdCkpOworCQkJfQorCQkJVG1wRGF0YSA+Pj0gMTsKKwkJfQorCQkKKwkJQ3JjIF49IChEYXRhIDw8IDI0KTsKKwkJZm9yIChCaXQgPSAwOyBCaXQgPCA4OyBCaXQrKykgeworCQkJaWYgKENyYyAmIDB4ODAwMDAwMDApIHsKKwkJCQlDcmMgPSAoQ3JjIDw8IDEpIF4gR01BQ19QT0xZOworCQkJfQorCQkJZWxzZSB7CisJCQkJQ3JjIDw8PSAxOworCQkJfQorCQl9CisJfQorCQorCXJldHVybiAoQ3JjICYgKCgxIDw8IEhBU0hfQklUUykgLSAxKSk7CisKK30JLyogU2tHbWFjTWNIYXNoICovCisKKyNlbmRpZgkvKiAhU0tfQUREUl9DSEVBVCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tBZGRyTWNBZGQgLSBhZGQgYSBtdWx0aWNhc3QgYWRkcmVzcyB0byBhIHBvcnQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBlbmFibGVzIHJlY2VwdGlvbiBmb3IgYSBnaXZlbiBhZGRyZXNzIG9uIHRoZSBnaXZlbiBwb3J0LgorICoKKyAqCUl0IGNhbGxzIGVpdGhlciBTa0FkZHJYbWFjTWNBZGQgb3IgU2tBZGRyR21hY01jQWRkLCBhY2NvcmRpbmcgdG8gdGhlCisgKglhZGFwdGVyIGluIHVzZS4gVGhlIHJlYWwgd29yayBpcyBkb25lIHRoZXJlLgorICoKKyAqIE5vdGVzOgorICoJVGhlIHJldHVybiBjb2RlIGlzIG9ubHkgdmFsaWQgZm9yIFNLX1BST01fTU9ERV9OT05FLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZQorICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0RBVEEKKyAqCisgKiBSZXR1cm5zOgorICoJU0tfTUNfRklMVEVSSU5HX0VYQUNUCisgKglTS19NQ19GSUxURVJJTkdfSU5FWEFDVAorICoJU0tfTUNfSUxMRUdBTF9BRERSRVNTCisgKglTS19NQ19JTExFR0FMX1BPUlQKKyAqCVNLX01DX1JMTVRfT1ZFUkZMT1cKKyAqLworaW50CVNrQWRkck1jQWRkKAorU0tfQUMJCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkJLyogSS9PIGNvbnRleHQgKi8KK1NLX1UzMgkJUG9ydE51bWJlciwJLyogUG9ydCBOdW1iZXIgKi8KK1NLX01BQ19BRERSCSpwTWMsCQkvKiBtdWx0aWNhc3QgYWRkcmVzcyB0byBiZSBhZGRlZCAqLworaW50CQkJRmxhZ3MpCQkvKiBwZXJtYW5lbnQvbm9uLXBlcm1hbmVudCAqLworeworCWludCBSZXR1cm5Db2RlOworCQorCWlmIChQb3J0TnVtYmVyID49IChTS19VMzIpIHBBQy0+R0luaS5HSU1hY3NGb3VuZCkgeworCQlyZXR1cm4gKFNLX0FERFJfSUxMRUdBTF9QT1JUKTsKKwl9CisJCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJUmV0dXJuQ29kZSA9IFNrQWRkclhtYWNNY0FkZChwQUMsIElvQywgUG9ydE51bWJlciwgcE1jLCBGbGFncyk7CisJfQorCWVsc2UgeworCQlSZXR1cm5Db2RlID0gU2tBZGRyR21hY01jQWRkKHBBQywgSW9DLCBQb3J0TnVtYmVyLCBwTWMsIEZsYWdzKTsKKwl9CisKKwlyZXR1cm4gKFJldHVybkNvZGUpOworCit9CS8qIFNrQWRkck1jQWRkICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrQWRkclhtYWNNY0FkZCAtIGFkZCBhIG11bHRpY2FzdCBhZGRyZXNzIHRvIGEgcG9ydAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGVuYWJsZXMgcmVjZXB0aW9uIGZvciBhIGdpdmVuIGFkZHJlc3Mgb24gdGhlIGdpdmVuIHBvcnQuCisgKgorICogTm90ZXM6CisgKglUaGUgcmV0dXJuIGNvZGUgaXMgb25seSB2YWxpZCBmb3IgU0tfUFJPTV9NT0RFX05PTkUuCisgKgorICoJVGhlIG11bHRpY2FzdCBiaXQgaXMgb25seSBjaGVja2VkIGlmIHRoZXJlIGFyZSBubyBmcmVlIGV4YWN0IG1hdGNoCisgKgllbnRyaWVzLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZQorICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0RBVEEKKyAqCisgKiBSZXR1cm5zOgorICoJU0tfTUNfRklMVEVSSU5HX0VYQUNUCisgKglTS19NQ19GSUxURVJJTkdfSU5FWEFDVAorICoJU0tfTUNfSUxMRUdBTF9BRERSRVNTCisgKglTS19NQ19STE1UX09WRVJGTE9XCisgKi8KK2ludAlTa0FkZHJYbWFjTWNBZGQoCitTS19BQwkJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCQlJb0MsCQkvKiBJL08gY29udGV4dCAqLworU0tfVTMyCQlQb3J0TnVtYmVyLAkvKiBQb3J0IE51bWJlciAqLworU0tfTUFDX0FERFIJKnBNYywJCS8qIG11bHRpY2FzdCBhZGRyZXNzIHRvIGJlIGFkZGVkICovCitpbnQJCUZsYWdzKQkJLyogcGVybWFuZW50L25vbi1wZXJtYW5lbnQgKi8KK3sKKwlpbnQJaTsKKwlTS19VOAlJbmV4YWN0OworI2lmbmRlZiBTS19BRERSX0NIRUFUCisJU0tfVTMyIEhhc2hCaXQ7CisjZW5kaWYJLyogIWRlZmluZWQoU0tfQUREUl9DSEVBVCkgKi8KKworCWlmIChGbGFncyAmIFNLX0FERFJfUEVSTUFORU5UKSB7CS8qIHBlcm1hbmVudCA9PiBSTE1UICovCisjaWZkZWYgeERFQlVHCisJCWlmIChwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5OZXh0RXhhY3RNYXRjaFJsbXQgPAorCQkJU0tfQUREUl9GSVJTVF9NQVRDSF9STE1UKSB7CisJCQlOZXh0MFtQb3J0TnVtYmVyXSB8PSAxOworCQkJcmV0dXJuIChTS19NQ19STE1UX09WRVJGTE9XKTsKKwkJfQorI2VuZGlmCS8qIERFQlVHICovCisJCQorCQlpZiAocEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uTmV4dEV4YWN0TWF0Y2hSbG10ID4KKwkJCVNLX0FERFJfTEFTVF9NQVRDSF9STE1UKSB7CisJCQlyZXR1cm4gKFNLX01DX1JMTVRfT1ZFUkZMT1cpOworCQl9CisKKwkJLyogU2V0IGEgUkxNVCBtdWx0aWNhc3QgYWRkcmVzcy4gKi8KKworCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5FeGFjdFsKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLk5leHRFeGFjdE1hdGNoUmxtdCsrXSA9ICpwTWM7CisKKwkJcmV0dXJuIChTS19NQ19GSUxURVJJTkdfRVhBQ1QpOworCX0KKworI2lmZGVmIHhERUJVRworCWlmIChwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5OZXh0RXhhY3RNYXRjaERydiA8CisJCVNLX0FERFJfRklSU1RfTUFUQ0hfRFJWKSB7CisJCQlOZXh0MFtQb3J0TnVtYmVyXSB8PSAyOworCQlyZXR1cm4gKFNLX01DX1JMTVRfT1ZFUkZMT1cpOworCX0KKyNlbmRpZgkvKiBERUJVRyAqLworCQorCWlmIChwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5OZXh0RXhhY3RNYXRjaERydiA8PSBTS19BRERSX0xBU1RfTUFUQ0hfRFJWKSB7CisKKwkJLyogU2V0IGV4YWN0IG1hdGNoIGVudHJ5LiAqLworCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5FeGFjdFsKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLk5leHRFeGFjdE1hdGNoRHJ2KytdID0gKnBNYzsKKworCQkvKiBDbGVhciBJbmV4YWN0RmlsdGVyICovCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV0gPSAwOworCQl9CisJfQorCWVsc2UgeworCQlpZiAoIShwTWMtPmFbMF0gJiBTS19NQ19CSVQpKSB7CisJCQkvKiBIYXNoaW5nIG9ubHkgcG9zc2libGUgd2l0aCBtdWx0aWNhc3QgYWRkcmVzc2VzICovCisJCQlyZXR1cm4gKFNLX01DX0lMTEVHQUxfQUREUkVTUyk7CisJCX0KKyNpZm5kZWYgU0tfQUREUl9DSEVBVAorCQkvKiBDb21wdXRlIGhhc2ggdmFsdWUgb2YgYWRkcmVzcy4gKi8KKwkJSGFzaEJpdCA9IDYzIC0gU2tYbWFjTWNIYXNoKCZwTWMtPmFbMF0pOworCisJCS8qIEFkZCBiaXQgdG8gSW5leGFjdEZpbHRlci4gKi8KKwkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1tIYXNoQml0IC8gOF0gfD0KKwkJCTEgPDwgKEhhc2hCaXQgJSA4KTsKKyNlbHNlCS8qIFNLX0FERFJfQ0hFQVQgKi8KKwkJLyogU2V0IGFsbCBiaXRzIGluIEluZXhhY3RGaWx0ZXIuICovCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV0gPSAweEZGOworCQl9CisjZW5kaWYJLyogU0tfQUREUl9DSEVBVCAqLworCX0KKworCWZvciAoSW5leGFjdCA9IDAsIGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCUluZXhhY3QgfD0gcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1tpXTsKKwl9CisKKwlpZiAoSW5leGFjdCA9PSAwICYmIHBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLlByb21Nb2RlID09IDApIHsKKwkJcmV0dXJuIChTS19NQ19GSUxURVJJTkdfRVhBQ1QpOworCX0KKwllbHNlIHsKKwkJcmV0dXJuIChTS19NQ19GSUxURVJJTkdfSU5FWEFDVCk7CisJfQorCit9CS8qIFNrQWRkclhtYWNNY0FkZCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0FkZHJHbWFjTWNBZGQgLSBhZGQgYSBtdWx0aWNhc3QgYWRkcmVzcyB0byBhIHBvcnQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBlbmFibGVzIHJlY2VwdGlvbiBmb3IgYSBnaXZlbiBhZGRyZXNzIG9uIHRoZSBnaXZlbiBwb3J0LgorICoKKyAqIE5vdGVzOgorICoJVGhlIHJldHVybiBjb2RlIGlzIG9ubHkgdmFsaWQgZm9yIFNLX1BST01fTU9ERV9OT05FLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZQorICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0RBVEEKKyAqCisgKiBSZXR1cm5zOgorICoJU0tfTUNfRklMVEVSSU5HX0lORVhBQ1QKKyAqCVNLX01DX0lMTEVHQUxfQUREUkVTUworICovCitpbnQJU2tBZGRyR21hY01jQWRkKAorU0tfQUMJCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkJLyogSS9PIGNvbnRleHQgKi8KK1NLX1UzMgkJUG9ydE51bWJlciwJLyogUG9ydCBOdW1iZXIgKi8KK1NLX01BQ19BRERSCSpwTWMsCQkvKiBtdWx0aWNhc3QgYWRkcmVzcyB0byBiZSBhZGRlZCAqLworaW50CQlGbGFncykJCS8qIHBlcm1hbmVudC9ub24tcGVybWFuZW50ICovCit7CisJaW50CWk7CisjaWZuZGVmIFNLX0FERFJfQ0hFQVQKKwlTS19VMzIgSGFzaEJpdDsKKyNlbmRpZgkvKiAhZGVmaW5lZChTS19BRERSX0NIRUFUKSAqLworCQkKKwlpZiAoIShwTWMtPmFbMF0gJiBTS19NQ19CSVQpKSB7CisJCS8qIEhhc2hpbmcgb25seSBwb3NzaWJsZSB3aXRoIG11bHRpY2FzdCBhZGRyZXNzZXMgKi8KKwkJcmV0dXJuIChTS19NQ19JTExFR0FMX0FERFJFU1MpOworCX0KKwkKKyNpZm5kZWYgU0tfQUREUl9DSEVBVAorCQorCS8qIENvbXB1dGUgaGFzaCB2YWx1ZSBvZiBhZGRyZXNzLiAqLworCUhhc2hCaXQgPSBTa0dtYWNNY0hhc2goJnBNYy0+YVswXSk7CisJCisJaWYgKEZsYWdzICYgU0tfQUREUl9QRVJNQU5FTlQpIHsJLyogcGVybWFuZW50ID0+IFJMTVQgKi8KKwkJCisJCS8qIEFkZCBiaXQgdG8gSW5leGFjdFJsbXRGaWx0ZXIuICovCisJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RSbG10RmlsdGVyLkJ5dGVzW0hhc2hCaXQgLyA4XSB8PQorCQkJMSA8PCAoSGFzaEJpdCAlIDgpOworCQkKKwkJLyogQ29weSBiaXQgdG8gSW5leGFjdEZpbHRlci4gKi8KKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1tpXSB8PQorCQkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RSbG10RmlsdGVyLkJ5dGVzW2ldOworCQl9CisjaWZkZWYgREVCVUcKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BRERSLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJHTUFDIEluZXhhY3RSbG10RmlsdGVyOiAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0UmxtdEZpbHRlci5CeXRlc1swXSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RSbG10RmlsdGVyLkJ5dGVzWzFdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdFJsbXRGaWx0ZXIuQnl0ZXNbMl0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0UmxtdEZpbHRlci5CeXRlc1szXSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RSbG10RmlsdGVyLkJ5dGVzWzRdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdFJsbXRGaWx0ZXIuQnl0ZXNbNV0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0UmxtdEZpbHRlci5CeXRlc1s2XSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RSbG10RmlsdGVyLkJ5dGVzWzddKSkKKyNlbmRpZgkvKiBERUJVRyAqLworCX0KKwllbHNlIHsJLyogbm90IHBlcm1hbmVudCA9PiBEUlYgKi8KKwkJCisJCS8qIEFkZCBiaXQgdG8gSW5leGFjdERydkZpbHRlci4gKi8KKwkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdERydkZpbHRlci5CeXRlc1tIYXNoQml0IC8gOF0gfD0KKwkJCTEgPDwgKEhhc2hCaXQgJSA4KTsKKwkJCisJCS8qIENvcHkgYml0IHRvIEluZXhhY3RGaWx0ZXIuICovCisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV0gfD0KKwkJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RHJ2RmlsdGVyLkJ5dGVzW2ldOworCQl9CisjaWZkZWYgREVCVUcKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BRERSLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJHTUFDIEluZXhhY3REcnZGaWx0ZXI6ICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3REcnZGaWx0ZXIuQnl0ZXNbMF0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RHJ2RmlsdGVyLkJ5dGVzWzFdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdERydkZpbHRlci5CeXRlc1syXSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3REcnZGaWx0ZXIuQnl0ZXNbM10sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RHJ2RmlsdGVyLkJ5dGVzWzRdLAorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdERydkZpbHRlci5CeXRlc1s1XSwKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3REcnZGaWx0ZXIuQnl0ZXNbNl0sCisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5JbmV4YWN0RHJ2RmlsdGVyLkJ5dGVzWzddKSkKKyNlbmRpZgkvKiBERUJVRyAqLworCX0KKwkKKyNlbHNlCS8qIFNLX0FERFJfQ0hFQVQgKi8KKwkKKwkvKiBTZXQgYWxsIGJpdHMgaW4gSW5leGFjdEZpbHRlci4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV0gPSAweEZGOworCX0KKyNlbmRpZgkvKiBTS19BRERSX0NIRUFUICovCisJCQorCXJldHVybiAoU0tfTUNfRklMVEVSSU5HX0lORVhBQ1QpOworCQorfQkvKiBTa0FkZHJHbWFjTWNBZGQgKi8KKworI2VuZGlmIC8qICFTS19TTElNICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0FkZHJNY1VwZGF0ZSAtIHVwZGF0ZSB0aGUgSFcgTUMgYWRkcmVzcyB0YWJsZSBhbmQgc2V0IHRoZSBNQUMgYWRkcmVzcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGVuYWJsZXMgcmVjZXB0aW9uIG9mIHRoZSBhZGRyZXNzZXMgY29udGFpbmVkIGluIGEgbG9jYWwKKyAqCXRhYmxlIGZvciBhIGdpdmVuIHBvcnQuCisgKglJdCBhbHNvIHByb2dyYW1zIHRoZSBwb3J0J3MgY3VycmVudCBwaHlzaWNhbCBNQUMgYWRkcmVzcy4KKyAqCisgKglJdCBjYWxscyBlaXRoZXIgU2tBZGRyWG1hY01jVXBkYXRlIG9yIFNrQWRkckdtYWNNY1VwZGF0ZSwgYWNjb3JkaW5nCisgKgl0byB0aGUgYWRhcHRlciBpbiB1c2UuIFRoZSByZWFsIHdvcmsgaXMgZG9uZSB0aGVyZS4KKyAqCisgKiBOb3RlczoKKyAqCVRoZSByZXR1cm4gY29kZSBpcyBvbmx5IHZhbGlkIGZvciBTS19QUk9NX01PREVfTk9ORS4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGUKKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglTS19NQ19GSUxURVJJTkdfRVhBQ1QKKyAqCVNLX01DX0ZJTFRFUklOR19JTkVYQUNUCisgKglTS19BRERSX0lMTEVHQUxfUE9SVAorICovCitpbnQJU2tBZGRyTWNVcGRhdGUoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSS9PIGNvbnRleHQgKi8KK1NLX1UzMglQb3J0TnVtYmVyKQkvKiBQb3J0IE51bWJlciAqLworeworCWludCBSZXR1cm5Db2RlID0gMDsKKyNpZiAoIWRlZmluZWQoU0tfU0xJTSkgfHwgZGVmaW5lZChERUJVRykpCisJaWYgKFBvcnROdW1iZXIgPj0gKFNLX1UzMikgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kKSB7CisJCXJldHVybiAoU0tfQUREUl9JTExFR0FMX1BPUlQpOworCX0KKyNlbmRpZiAvKiAhU0tfU0xJTSB8fCBERUJVRyAqLworCisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCVJldHVybkNvZGUgPSBTa0FkZHJYbWFjTWNVcGRhdGUocEFDLCBJb0MsIFBvcnROdW1iZXIpOworCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisjaWZkZWYgWVVLT04KKwlpZiAoIXBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJUmV0dXJuQ29kZSA9IFNrQWRkckdtYWNNY1VwZGF0ZShwQUMsIElvQywgUG9ydE51bWJlcik7CisJfQorI2VuZGlmIC8qIFlVS09OICovCisJcmV0dXJuIChSZXR1cm5Db2RlKTsKKworfQkvKiBTa0FkZHJNY1VwZGF0ZSAqLworCisKKyNpZmRlZiBHRU5FU0lTCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0FkZHJYbWFjTWNVcGRhdGUgLSB1cGRhdGUgdGhlIEhXIE1DIGFkZHJlc3MgdGFibGUgYW5kIHNldCB0aGUgTUFDIGFkZHJlc3MKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBlbmFibGVzIHJlY2VwdGlvbiBvZiB0aGUgYWRkcmVzc2VzIGNvbnRhaW5lZCBpbiBhIGxvY2FsCisgKgl0YWJsZSBmb3IgYSBnaXZlbiBwb3J0LgorICoJSXQgYWxzbyBwcm9ncmFtcyB0aGUgcG9ydCdzIGN1cnJlbnQgcGh5c2ljYWwgTUFDIGFkZHJlc3MuCisgKgorICogTm90ZXM6CisgKglUaGUgcmV0dXJuIGNvZGUgaXMgb25seSB2YWxpZCBmb3IgU0tfUFJPTV9NT0RFX05PTkUuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlCisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfTUNfRklMVEVSSU5HX0VYQUNUCisgKglTS19NQ19GSUxURVJJTkdfSU5FWEFDVAorICoJU0tfQUREUl9JTExFR0FMX1BPUlQKKyAqLworaW50CVNrQWRkclhtYWNNY1VwZGF0ZSgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJL08gY29udGV4dCAqLworU0tfVTMyCVBvcnROdW1iZXIpCS8qIFBvcnQgTnVtYmVyICovCit7CisJU0tfVTMyCQlpOworCVNLX1U4CQlJbmV4YWN0OworCVNLX1UxNgkJKk91dEFkZHI7CisJU0tfQUREUl9QT1JUCSpwQVBvcnQ7CisKKwlTS19EQkdfTVNHKHBBQyxTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU2tBZGRyWG1hY01jVXBkYXRlIG9uIFBvcnQgJXUuXG4iLCBQb3J0TnVtYmVyKSkKKwkKKwlwQVBvcnQgPSAmcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl07CisKKyNpZmRlZiBERUJVRworCVNLX0RCR19NU0cocEFDLFNLX0RCR01PRF9BRERSLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJOZXh0MCBvbiBQb3J0ICVkOiAlZFxuIiwgUG9ydE51bWJlciwgTmV4dDBbUG9ydE51bWJlcl0pKQorI2VuZGlmIC8qIERFQlVHICovCisKKwkvKiBTdGFydCB3aXRoIDAgdG8gYWxzbyBwcm9ncmFtIHRoZSBsb2dpY2FsIE1BQyBhZGRyZXNzLiAqLworCWZvciAoaSA9IDA7IGkgPCBwQVBvcnQtPk5leHRFeGFjdE1hdGNoUmxtdDsgaSsrKSB7CisJCS8qIFNldCBleGFjdCBtYXRjaCBhZGRyZXNzIGkgb24gWE1BQyAqLworCQlPdXRBZGRyID0gKFNLX1UxNiAqKSAmcEFQb3J0LT5FeGFjdFtpXS5hWzBdOworCQlYTV9PVVRBRERSKElvQywgUG9ydE51bWJlciwgWE1fRVhNKGkpLCBPdXRBZGRyKTsKKwl9CisKKwkvKiBDbGVhciBvdGhlciBwZXJtYW5lbnQgZXhhY3QgbWF0Y2ggYWRkcmVzc2VzIG9uIFhNQUMgKi8KKwlpZiAocEFQb3J0LT5OZXh0RXhhY3RNYXRjaFJsbXQgPD0gU0tfQUREUl9MQVNUX01BVENIX1JMTVQpIHsKKwkJCisJCVNrWG1DbHJFeGFjdEFkZHIocEFDLCBJb0MsIFBvcnROdW1iZXIsIHBBUG9ydC0+TmV4dEV4YWN0TWF0Y2hSbG10LAorCQkJU0tfQUREUl9MQVNUX01BVENIX1JMTVQpOworCX0KKworCWZvciAoaSA9IHBBUG9ydC0+Rmlyc3RFeGFjdE1hdGNoRHJ2OyBpIDwgcEFQb3J0LT5OZXh0RXhhY3RNYXRjaERydjsgaSsrKSB7CisJCU91dEFkZHIgPSAoU0tfVTE2ICopICZwQVBvcnQtPkV4YWN0W2ldLmFbMF07CisJCVhNX09VVEFERFIoSW9DLCBQb3J0TnVtYmVyLCBYTV9FWE0oaSksIE91dEFkZHIpOworCX0KKworCS8qIENsZWFyIG90aGVyIG5vbi1wZXJtYW5lbnQgZXhhY3QgbWF0Y2ggYWRkcmVzc2VzIG9uIFhNQUMgKi8KKwlpZiAocEFQb3J0LT5OZXh0RXhhY3RNYXRjaERydiA8PSBTS19BRERSX0xBU1RfTUFUQ0hfRFJWKSB7CisJCQorCQlTa1htQ2xyRXhhY3RBZGRyKHBBQywgSW9DLCBQb3J0TnVtYmVyLCBwQVBvcnQtPk5leHRFeGFjdE1hdGNoRHJ2LAorCQkJU0tfQUREUl9MQVNUX01BVENIX0RSVik7CisJfQorCisJZm9yIChJbmV4YWN0ID0gMCwgaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJSW5leGFjdCB8PSBwQVBvcnQtPkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV07CisJfQorCisJaWYgKHBBUG9ydC0+UHJvbU1vZGUgJiBTS19QUk9NX01PREVfQUxMX01DKSB7CisJCQorCQkvKiBTZXQgYWxsIGJpdHMgaW4gNjQtYml0IGhhc2ggcmVnaXN0ZXIuICovCisJCVhNX09VVEhBU0goSW9DLCBQb3J0TnVtYmVyLCBYTV9IU00sICZPbmVzSGFzaCk7CisJCQorCQkvKiBFbmFibGUgSGFzaGluZyAqLworCQlTa01hY0hhc2hpbmcocEFDLCBJb0MsIChpbnQpIFBvcnROdW1iZXIsIFNLX1RSVUUpOworCX0KKwllbHNlIGlmIChJbmV4YWN0ICE9IDApIHsKKwkJCisJCS8qIFNldCA2NC1iaXQgaGFzaCByZWdpc3RlciB0byBJbmV4YWN0RmlsdGVyLiAqLworCQlYTV9PVVRIQVNIKElvQywgUG9ydE51bWJlciwgWE1fSFNNLCAmcEFQb3J0LT5JbmV4YWN0RmlsdGVyLkJ5dGVzWzBdKTsKKwkJCisJCS8qIEVuYWJsZSBIYXNoaW5nICovCisJCVNrTWFjSGFzaGluZyhwQUMsIElvQywgKGludCkgUG9ydE51bWJlciwgU0tfVFJVRSk7CisJfQorCWVsc2UgeworCQkvKiBEaXNhYmxlIEhhc2hpbmcgKi8KKwkJU2tNYWNIYXNoaW5nKHBBQywgSW9DLCAoaW50KSBQb3J0TnVtYmVyLCBTS19GQUxTRSk7CisJfQorCisJaWYgKHBBUG9ydC0+UHJvbU1vZGUgIT0gU0tfUFJPTV9NT0RFX05PTkUpIHsKKwkJKHZvaWQpIFNrQWRkclhtYWNQcm9taXNjdW91c0NoYW5nZShwQUMsIElvQywgUG9ydE51bWJlciwgcEFQb3J0LT5Qcm9tTW9kZSk7CisJfQorCisJLyogU2V0IHBvcnQncyBjdXJyZW50IHBoeXNpY2FsIE1BQyBhZGRyZXNzLiAqLworCU91dEFkZHIgPSAoU0tfVTE2ICopICZwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmFbMF07CisJCisJWE1fT1VUQUREUihJb0MsIFBvcnROdW1iZXIsIFhNX1NBLCBPdXRBZGRyKTsKKworI2lmZGVmIHhERUJVRworCWZvciAoaSA9IDA7IGkgPCBwQVBvcnQtPk5leHRFeGFjdE1hdGNoUmxtdDsgaSsrKSB7CisJCVNLX1U4CQlJbkFkZHI4WzZdOworCQlTS19VMTYJCSpJbkFkZHI7CisKKwkJLyogR2V0IGV4YWN0IG1hdGNoIGFkZHJlc3MgaSBmcm9tIHBvcnQgUG9ydE51bWJlci4gKi8KKwkJSW5BZGRyID0gKFNLX1UxNiAqKSAmSW5BZGRyOFswXTsKKwkJCisJCVhNX0lOQUREUihJb0MsIFBvcnROdW1iZXIsIFhNX0VYTShpKSwgSW5BZGRyKTsKKwkJCisJCVNLX0RCR19NU0cocEFDLFNLX0RCR01PRF9BRERSLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU2tBZGRyWG1hY01jVXBkYXRlOiBNQyBhZGRyZXNzICVkIG9uIFBvcnQgJXU6ICIsCisJCQkgIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IC0tICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJCWksCisJCQkJUG9ydE51bWJlciwKKwkJCQlJbkFkZHI4WzBdLAorCQkJCUluQWRkcjhbMV0sCisJCQkJSW5BZGRyOFsyXSwKKwkJCQlJbkFkZHI4WzNdLAorCQkJCUluQWRkcjhbNF0sCisJCQkJSW5BZGRyOFs1XSwKKwkJCQlwQVBvcnQtPkV4YWN0W2ldLmFbMF0sCisJCQkJcEFQb3J0LT5FeGFjdFtpXS5hWzFdLAorCQkJCXBBUG9ydC0+RXhhY3RbaV0uYVsyXSwKKwkJCQlwQVBvcnQtPkV4YWN0W2ldLmFbM10sCisJCQkJcEFQb3J0LT5FeGFjdFtpXS5hWzRdLAorCQkJCXBBUG9ydC0+RXhhY3RbaV0uYVs1XSkpCisJfQorI2VuZGlmIC8qIERFQlVHICovCisKKwkvKiBEZXRlcm1pbmUgcmV0dXJuIHZhbHVlLiAqLworCWlmIChJbmV4YWN0ID09IDAgJiYgcEFQb3J0LT5Qcm9tTW9kZSA9PSAwKSB7CisJCXJldHVybiAoU0tfTUNfRklMVEVSSU5HX0VYQUNUKTsKKwl9CisJZWxzZSB7CisJCXJldHVybiAoU0tfTUNfRklMVEVSSU5HX0lORVhBQ1QpOworCX0KKwkKK30JLyogU2tBZGRyWG1hY01jVXBkYXRlICovCisKKyNlbmRpZiAgLyogR0VORVNJUyAqLworCisjaWZkZWYgWVVLT04KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrQWRkckdtYWNNY1VwZGF0ZSAtIHVwZGF0ZSB0aGUgSFcgTUMgYWRkcmVzcyB0YWJsZSBhbmQgc2V0IHRoZSBNQUMgYWRkcmVzcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGVuYWJsZXMgcmVjZXB0aW9uIG9mIHRoZSBhZGRyZXNzZXMgY29udGFpbmVkIGluIGEgbG9jYWwKKyAqCXRhYmxlIGZvciBhIGdpdmVuIHBvcnQuCisgKglJdCBhbHNvIHByb2dyYW1zIHRoZSBwb3J0J3MgY3VycmVudCBwaHlzaWNhbCBNQUMgYWRkcmVzcy4KKyAqCisgKiBOb3RlczoKKyAqCVRoZSByZXR1cm4gY29kZSBpcyBvbmx5IHZhbGlkIGZvciBTS19QUk9NX01PREVfTk9ORS4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGUKKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglTS19NQ19GSUxURVJJTkdfRVhBQ1QKKyAqCVNLX01DX0ZJTFRFUklOR19JTkVYQUNUCisgKglTS19BRERSX0lMTEVHQUxfUE9SVAorICovCitpbnQJU2tBZGRyR21hY01jVXBkYXRlKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIEkvTyBjb250ZXh0ICovCitTS19VMzIJUG9ydE51bWJlcikJLyogUG9ydCBOdW1iZXIgKi8KK3sKKyNpZm5kZWYgU0tfU0xJTQorCVNLX1UzMgkJaTsKKwlTS19VOAkJSW5leGFjdDsKKyNlbmRpZgkvKiBub3QgU0tfU0xJTSAqLworCVNLX1UxNgkJKk91dEFkZHI7CisJU0tfQUREUl9QT1JUCSpwQVBvcnQ7CisKKwlTS19EQkdfTVNHKHBBQyxTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU2tBZGRyR21hY01jVXBkYXRlIG9uIFBvcnQgJXUuXG4iLCBQb3J0TnVtYmVyKSkKKwkKKwlwQVBvcnQgPSAmcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl07CisKKyNpZmRlZiBERUJVRworCVNLX0RCR19NU0cocEFDLFNLX0RCR01PRF9BRERSLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJOZXh0MCBvbiBQb3J0ICVkOiAlZFxuIiwgUG9ydE51bWJlciwgTmV4dDBbUG9ydE51bWJlcl0pKQorI2VuZGlmIC8qIERFQlVHICovCisJCisjaWZuZGVmIFNLX1NMSU0KKwlmb3IgKEluZXhhY3QgPSAwLCBpID0gMDsgaSA8IDg7IGkrKykgeworCQlJbmV4YWN0IHw9IHBBUG9ydC0+SW5leGFjdEZpbHRlci5CeXRlc1tpXTsKKwl9CisJCisJLyogU2V0IDY0LWJpdCBoYXNoIHJlZ2lzdGVyIHRvIEluZXhhY3RGaWx0ZXIuICovCisJR01fT1VUSEFTSChJb0MsIFBvcnROdW1iZXIsIEdNX01DX0FERFJfSDEsCisJCSZwQVBvcnQtPkluZXhhY3RGaWx0ZXIuQnl0ZXNbMF0pOworCQorCWlmIChwQVBvcnQtPlByb21Nb2RlICYgU0tfUFJPTV9NT0RFX0FMTF9NQykgewkJCQkKKwkJCisJCS8qIFNldCBhbGwgYml0cyBpbiA2NC1iaXQgaGFzaCByZWdpc3Rlci4gKi8KKwkJR01fT1VUSEFTSChJb0MsIFBvcnROdW1iZXIsIEdNX01DX0FERFJfSDEsICZPbmVzSGFzaCk7CisJCQorCQkvKiBFbmFibGUgSGFzaGluZyAqLworCQlTa01hY0hhc2hpbmcocEFDLCBJb0MsIChpbnQpIFBvcnROdW1iZXIsIFNLX1RSVUUpOworCX0KKwllbHNlIHsJCisJCS8qIEVuYWJsZSBIYXNoaW5nLiAqLworCQlTa01hY0hhc2hpbmcocEFDLCBJb0MsIChpbnQpIFBvcnROdW1iZXIsIFNLX1RSVUUpOworCX0KKwkKKwlpZiAocEFQb3J0LT5Qcm9tTW9kZSAhPSBTS19QUk9NX01PREVfTk9ORSkgeworCQkodm9pZCkgU2tBZGRyR21hY1Byb21pc2N1b3VzQ2hhbmdlKHBBQywgSW9DLCBQb3J0TnVtYmVyLCBwQVBvcnQtPlByb21Nb2RlKTsKKwl9CisjZWxzZSAvKiBTS19TTElNICovCisKKwkvKiBTZXQgYWxsIGJpdHMgaW4gNjQtYml0IGhhc2ggcmVnaXN0ZXIuICovCisJR01fT1VUSEFTSChJb0MsIFBvcnROdW1iZXIsIEdNX01DX0FERFJfSDEsICZPbmVzSGFzaCk7CisKKwkvKiBFbmFibGUgSGFzaGluZyAqLworCVNrTWFjSGFzaGluZyhwQUMsIElvQywgKGludCkgUG9ydE51bWJlciwgU0tfVFJVRSk7CisJCisJKHZvaWQpIFNrQWRkckdtYWNQcm9taXNjdW91c0NoYW5nZShwQUMsIElvQywgUG9ydE51bWJlciwgcEFQb3J0LT5Qcm9tTW9kZSk7CisJCisjZW5kaWYgLyogU0tfU0xJTSAqLworCQorCS8qIFNldCBwb3J0J3MgY3VycmVudCBwaHlzaWNhbCBNQUMgYWRkcmVzcy4gKi8KKwlPdXRBZGRyID0gKFNLX1UxNiAqKSAmcEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzcy5hWzBdOworCUdNX09VVEFERFIoSW9DLCBQb3J0TnVtYmVyLCBHTV9TUkNfQUREUl8xTCwgT3V0QWRkcik7CisJCisJLyogU2V0IHBvcnQncyBjdXJyZW50IGxvZ2ljYWwgTUFDIGFkZHJlc3MuICovCisJT3V0QWRkciA9IChTS19VMTYgKikgJnBBUG9ydC0+RXhhY3RbMF0uYVswXTsKKwlHTV9PVVRBRERSKElvQywgUG9ydE51bWJlciwgR01fU1JDX0FERFJfMkwsIE91dEFkZHIpOworCQorI2lmZGVmIERFQlVHCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9BRERSLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTa0FkZHJHbWFjTWNVcGRhdGU6IFBlcm1hbmVudCBQaHlzaWNhbCBNQUMgQWRkcmVzczogJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCisJCQlwQVBvcnQtPkV4YWN0WzBdLmFbMF0sCisJCQlwQVBvcnQtPkV4YWN0WzBdLmFbMV0sCisJCQlwQVBvcnQtPkV4YWN0WzBdLmFbMl0sCisJCQlwQVBvcnQtPkV4YWN0WzBdLmFbM10sCisJCQlwQVBvcnQtPkV4YWN0WzBdLmFbNF0sCisJCQlwQVBvcnQtPkV4YWN0WzBdLmFbNV0pKQorCQorCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU2tBZGRyR21hY01jVXBkYXRlOiBQaHlzaWNhbCBNQUMgQWRkcmVzczogJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCisJCQlwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmFbMF0sCisJCQlwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmFbMV0sCisJCQlwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmFbMl0sCisJCQlwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmFbM10sCisJCQlwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmFbNF0sCisJCQlwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmFbNV0pKQorI2VuZGlmIC8qIERFQlVHICovCisJCisjaWZuZGVmIFNLX1NMSU0KKwkvKiBEZXRlcm1pbmUgcmV0dXJuIHZhbHVlLiAqLworCWlmIChJbmV4YWN0ID09IDAgJiYgcEFQb3J0LT5Qcm9tTW9kZSA9PSAwKSB7CisJCXJldHVybiAoU0tfTUNfRklMVEVSSU5HX0VYQUNUKTsKKwl9CisJZWxzZSB7CisJCXJldHVybiAoU0tfTUNfRklMVEVSSU5HX0lORVhBQ1QpOworCX0KKyNlbHNlIC8qIFNLX1NMSU0gKi8KKwlyZXR1cm4gKFNLX01DX0ZJTFRFUklOR19JTkVYQUNUKTsKKyNlbmRpZiAvKiBTS19TTElNICovCisJCit9CS8qIFNrQWRkckdtYWNNY1VwZGF0ZSAqLworCisjZW5kaWYgLyogWVVLT04gKi8KKworI2lmbmRlZiBTS19OT19NQU8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrQWRkck92ZXJyaWRlIC0gb3ZlcnJpZGUgYSBwb3J0J3MgTUFDIGFkZHJlc3MKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBvdmVycmlkZXMgdGhlIE1BQyBhZGRyZXNzIG9mIG9uZSBwb3J0LgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZQorICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCVNLX0FERFJfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsLgorICoJU0tfQUREUl9EVVBMSUNBVEVfQUREUkVTUyBpZiBkdXBsaWNhdGUgTUFDIGFkZHJlc3MuCisgKglTS19BRERSX01VTFRJQ0FTVF9BRERSRVNTIGlmIG11bHRpY2FzdCBvciBicm9hZGNhc3QgYWRkcmVzcy4KKyAqCVNLX0FERFJfVE9PX0VBUkxZIGlmIFNLX0lOSVRfSU8gd2FzIG5vdCBleGVjdXRlZCBiZWZvcmUuCisgKi8KK2ludAlTa0FkZHJPdmVycmlkZSgKK1NLX0FDCQkqcEFDLAkJCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkJCQkvKiBJL08gY29udGV4dCAqLworU0tfVTMyCQlQb3J0TnVtYmVyLAkJCS8qIFBvcnQgTnVtYmVyICovCitTS19NQUNfQUREUglTS19GQVIgKnBOZXdBZGRyLAkvKiBuZXcgTUFDIGFkZHJlc3MgKi8KK2ludAkJCUZsYWdzKQkJCQkvKiBsb2dpY2FsL3BoeXNpY2FsIE1BQyBhZGRyZXNzICovCit7CisjaWZuZGVmIFNLX05PX1JMTVQKKwlTS19FVlBBUkEJUGFyYTsKKyNlbmRpZiAvKiAhU0tfTk9fUkxNVCAqLworCVNLX1UzMgkJTmV0TnVtYmVyOworCVNLX1UzMgkJaTsKKwlTS19VMTYJCVNLX0ZBUiAqT3V0QWRkcjsKKworI2lmbmRlZiBTS19OT19STE1UCisJTmV0TnVtYmVyID0gcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uTmV0LT5OZXROdW1iZXI7CisjZWxzZQorCU5ldE51bWJlciA9IDA7CisjZW5kaWYgLyogU0tfTk9fUkxNVCAqLworI2lmICghZGVmaW5lZChTS19TTElNKSB8fCBkZWZpbmVkKERFQlVHKSkKKwlpZiAoUG9ydE51bWJlciA+PSAoU0tfVTMyKSBwQUMtPkdJbmkuR0lNYWNzRm91bmQpIHsKKwkJcmV0dXJuIChTS19BRERSX0lMTEVHQUxfUE9SVCk7CisJfQorI2VuZGlmIC8qICFTS19TTElNIHx8IERFQlVHICovCisJaWYgKHBOZXdBZGRyICE9IE5VTEwgJiYgKHBOZXdBZGRyLT5hWzBdICYgU0tfTUNfQklUKSAhPSAwKSB7CisJCXJldHVybiAoU0tfQUREUl9NVUxUSUNBU1RfQUREUkVTUyk7CisJfQorCisJaWYgKCFwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3NTZXQpIHsKKwkJcmV0dXJuIChTS19BRERSX1RPT19FQVJMWSk7CisJfQorCisJaWYgKEZsYWdzICYgU0tfQUREUl9TRVRfTE9HSUNBTCkgewkvKiBBY3RpdmF0ZSBsb2dpY2FsIE1BQyBhZGRyZXNzLiAqLworCQkvKiBQYXJhbWV0ZXIgKnBOZXdBZGRyIGlzIGlnbm9yZWQuICovCisJCWZvciAoaSA9IDA7IGkgPCAoU0tfVTMyKSBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQkJaWYgKCFwQUMtPkFkZHIuUG9ydFtpXS5DdXJyZW50TWFjQWRkcmVzc1NldCkgeworCQkJCXJldHVybiAoU0tfQUREUl9UT09fRUFSTFkpOworCQkJfQorCQl9CisjaWZuZGVmIFNLX05PX1JMTVQKKwkJLyogU2V0IFBvcnROdW1iZXIgdG8gbnVtYmVyIG9mIG5ldCdzIGFjdGl2ZSBwb3J0LiAqLworCQlQb3J0TnVtYmVyID0gcEFDLT5SbG10Lk5ldFtOZXROdW1iZXJdLgorCQkJUG9ydFtwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uQWN0aXZlUG9ydF0tPlBvcnROdW1iZXI7CisjZW5kaWYgLyogIVNLX05PX1JMTVQgKi8KKwkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uRXhhY3RbMF0gPQorCQkJcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzOworCisJCS8qIFdyaXRlIGFkZHJlc3MgdG8gZmlyc3QgZXhhY3QgbWF0Y2ggZW50cnkgb2YgYWN0aXZlIHBvcnQuICovCisJCSh2b2lkKSBTa0FkZHJNY1VwZGF0ZShwQUMsIElvQywgUG9ydE51bWJlcik7CisJfQorCWVsc2UgaWYgKEZsYWdzICYgU0tfQUREUl9DTEVBUl9MT0dJQ0FMKSB7CisJCS8qIERlYWN0aXZhdGUgbG9naWNhbCBNQUMgYWRkcmVzcy4gKi8KKwkJLyogUGFyYW1ldGVyICpwTmV3QWRkciBpcyBpZ25vcmVkLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgKFNLX1UzMikgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJCWlmICghcEFDLT5BZGRyLlBvcnRbaV0uQ3VycmVudE1hY0FkZHJlc3NTZXQpIHsKKwkJCQlyZXR1cm4gKFNLX0FERFJfVE9PX0VBUkxZKTsKKwkJCX0KKwkJfQorI2lmbmRlZiBTS19OT19STE1UCisJCS8qIFNldCBQb3J0TnVtYmVyIHRvIG51bWJlciBvZiBuZXQncyBhY3RpdmUgcG9ydC4gKi8KKwkJUG9ydE51bWJlciA9IHBBQy0+UmxtdC5OZXRbTmV0TnVtYmVyXS4KKwkJCVBvcnRbcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLkFjdGl2ZVBvcnRdLT5Qb3J0TnVtYmVyOworI2VuZGlmIC8qICFTS19OT19STE1UICovCisJCWZvciAoaSA9IDA7IGkgPCBTS19NQUNfQUREUl9MRU47IGkrKyApIHsKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkV4YWN0WzBdLmFbaV0gPSAwOworCQl9CisKKwkJLyogV3JpdGUgYWRkcmVzcyB0byBmaXJzdCBleGFjdCBtYXRjaCBlbnRyeSBvZiBhY3RpdmUgcG9ydC4gKi8KKwkJKHZvaWQpIFNrQWRkck1jVXBkYXRlKHBBQywgSW9DLCBQb3J0TnVtYmVyKTsKKwl9CisJZWxzZSBpZiAoRmxhZ3MgJiBTS19BRERSX1BIWVNJQ0FMX0FERFJFU1MpIHsJLyogUGh5c2ljYWwgTUFDIGFkZHJlc3MuICovCisJCWlmIChTS19BRERSX0VRVUFMKHBOZXdBZGRyLT5hLAorCQkJcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzLmEpKSB7CisJCQlyZXR1cm4gKFNLX0FERFJfRFVQTElDQVRFX0FERFJFU1MpOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IChTS19VMzIpIHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCQlpZiAoIXBBQy0+QWRkci5Qb3J0W2ldLkN1cnJlbnRNYWNBZGRyZXNzU2V0KSB7CisJCQkJcmV0dXJuIChTS19BRERSX1RPT19FQVJMWSk7CisJCQl9CisKKwkJCWlmIChTS19BRERSX0VRVUFMKHBOZXdBZGRyLT5hLAorCQkJCXBBQy0+QWRkci5Qb3J0W2ldLkN1cnJlbnRNYWNBZGRyZXNzLmEpKSB7CisJCQkJaWYgKGkgPT0gUG9ydE51bWJlcikgeworCQkJCQlyZXR1cm4gKFNLX0FERFJfU1VDQ0VTUyk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlyZXR1cm4gKFNLX0FERFJfRFVQTElDQVRFX0FERFJFU1MpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLlByZXZpb3VzTWFjQWRkcmVzcyA9CisJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5DdXJyZW50TWFjQWRkcmVzczsKKwkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MgPSAqcE5ld0FkZHI7CisKKwkJLyogQ2hhbmdlIHBvcnQncyBwaHlzaWNhbCBNQUMgYWRkcmVzcy4gKi8KKwkJT3V0QWRkciA9IChTS19VMTYgU0tfRkFSICopIHBOZXdBZGRyOworI2lmZGVmIEdFTkVTSVMKKwkJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCVhNX09VVEFERFIoSW9DLCBQb3J0TnVtYmVyLCBYTV9TQSwgT3V0QWRkcik7CisJCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisjaWZkZWYgWVVLT04KKwkJaWYgKCFwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQlHTV9PVVRBRERSKElvQywgUG9ydE51bWJlciwgR01fU1JDX0FERFJfMUwsIE91dEFkZHIpOworCQl9CisjZW5kaWYgLyogWVVLT04gKi8KKworI2lmbmRlZiBTS19OT19STE1UCisJCS8qIFJlcG9ydCBhZGRyZXNzIGNoYW5nZSB0byBSTE1ULiAqLworCQlQYXJhLlBhcmEzMlswXSA9IFBvcnROdW1iZXI7CisJCVBhcmEuUGFyYTMyWzBdID0gLTE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9QT1JUX0FERFIsIFBhcmEpOworI2VuZGlmIC8qICFTS19OT19STE1UICovCisJfQorCWVsc2UgewkvKiBMb2dpY2FsIE1BQyBhZGRyZXNzLiAqLworCQlpZiAoU0tfQUREUl9FUVVBTChwTmV3QWRkci0+YSwKKwkJCXBBQy0+QWRkci5OZXRbTmV0TnVtYmVyXS5DdXJyZW50TWFjQWRkcmVzcy5hKSkgeworCQkJcmV0dXJuIChTS19BRERSX1NVQ0NFU1MpOworCQl9CisJCQorCQlmb3IgKGkgPSAwOyBpIDwgKFNLX1UzMikgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJCWlmICghcEFDLT5BZGRyLlBvcnRbaV0uQ3VycmVudE1hY0FkZHJlc3NTZXQpIHsKKwkJCQlyZXR1cm4gKFNLX0FERFJfVE9PX0VBUkxZKTsKKwkJCX0KKworCQkJaWYgKFNLX0FERFJfRVFVQUwocE5ld0FkZHItPmEsCisJCQkJcEFDLT5BZGRyLlBvcnRbaV0uQ3VycmVudE1hY0FkZHJlc3MuYSkpIHsKKwkJCQlyZXR1cm4gKFNLX0FERFJfRFVQTElDQVRFX0FERFJFU1MpOworCQkJfQorCQl9CisJCQorCQkvKgorCQkgKiBJbiBjYXNlIHRoYXQgdGhlIHBoeXNpY2FsIGFuZCB0aGUgbG9naWNhbCBNQUMgYWRkcmVzc2VzIGFyZSBlcXVhbAorCQkgKiB3ZSBtdXN0IGFsc28gY2hhbmdlIHRoZSBwaHlzaWNhbCBNQUMgYWRkcmVzcyBoZXJlLgorCQkgKiBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSBhbiBhZGFwdGVyIHdoaWNoIGluaXRpYWxseSB3YXMgcHJvZ3JhbW1lZCB3aXRoCisJCSAqIHR3byBpZGVudGljYWwgTUFDIGFkZHJlc3Nlcy4KKwkJICovCisJCWlmIChTS19BRERSX0VRVUFMKHBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzLmEsCisJCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uRXhhY3RbMF0uYSkpIHsKKwkJCQorCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uUHJldmlvdXNNYWNBZGRyZXNzID0KKwkJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5DdXJyZW50TWFjQWRkcmVzczsKKwkJCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzID0gKnBOZXdBZGRyOworCQkJCisjaWZuZGVmIFNLX05PX1JMTVQKKwkJCS8qIFJlcG9ydCBhZGRyZXNzIGNoYW5nZSB0byBSTE1ULiAqLworCQkJUGFyYS5QYXJhMzJbMF0gPSBQb3J0TnVtYmVyOworCQkJUGFyYS5QYXJhMzJbMF0gPSAtMTsKKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9QT1JUX0FERFIsIFBhcmEpOworI2VuZGlmIC8qICFTS19OT19STE1UICovCisJCX0KKwkJCisjaWZuZGVmIFNLX05PX1JMTVQKKwkJLyogU2V0IFBvcnROdW1iZXIgdG8gbnVtYmVyIG9mIG5ldCdzIGFjdGl2ZSBwb3J0LiAqLworCQlQb3J0TnVtYmVyID0gcEFDLT5SbG10Lk5ldFtOZXROdW1iZXJdLgorCQkJUG9ydFtwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uQWN0aXZlUG9ydF0tPlBvcnROdW1iZXI7CisjZW5kaWYgLyogIVNLX05PX1JMTVQgKi8KKwkJcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzID0gKnBOZXdBZGRyOworCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5FeGFjdFswXSA9ICpwTmV3QWRkcjsKKyNpZmRlZiBERUJVRworCQlTS19EQkdfTVNHKHBBQyxTS19EQkdNT0RfQUREUiwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNrQWRkck92ZXJyaWRlOiBQZXJtYW5lbnQgTUFDIEFkZHJlc3M6ICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYXG4iLAorCQkJCXBBQy0+QWRkci5OZXRbTmV0TnVtYmVyXS5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbMF0sCisJCQkJcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLlBlcm1hbmVudE1hY0FkZHJlc3MuYVsxXSwKKwkJCQlwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uUGVybWFuZW50TWFjQWRkcmVzcy5hWzJdLAorCQkJCXBBQy0+QWRkci5OZXRbTmV0TnVtYmVyXS5QZXJtYW5lbnRNYWNBZGRyZXNzLmFbM10sCisJCQkJcEFDLT5BZGRyLk5ldFtOZXROdW1iZXJdLlBlcm1hbmVudE1hY0FkZHJlc3MuYVs0XSwKKwkJCQlwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uUGVybWFuZW50TWFjQWRkcmVzcy5hWzVdKSkKKwkJCisJCVNLX0RCR19NU0cocEFDLFNLX0RCR01PRF9BRERSLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU2tBZGRyT3ZlcnJpZGU6IE5ldyBsb2dpY2FsIE1BQyBBZGRyZXNzOiAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkJCQlwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MuYVswXSwKKwkJCQlwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MuYVsxXSwKKwkJCQlwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MuYVsyXSwKKwkJCQlwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MuYVszXSwKKwkJCQlwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MuYVs0XSwKKwkJCQlwQUMtPkFkZHIuTmV0W05ldE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MuYVs1XSkpCisjZW5kaWYgLyogREVCVUcgKi8KKworICAgICAgICAvKiBXcml0ZSBhZGRyZXNzIHRvIGZpcnN0IGV4YWN0IG1hdGNoIGVudHJ5IG9mIGFjdGl2ZSBwb3J0LiAqLworCQkodm9pZCkgU2tBZGRyTWNVcGRhdGUocEFDLCBJb0MsIFBvcnROdW1iZXIpOworCX0KKworCXJldHVybiAoU0tfQUREUl9TVUNDRVNTKTsKKwkKK30JLyogU2tBZGRyT3ZlcnJpZGUgKi8KKworCisjZW5kaWYgLyogU0tfTk9fTUFPICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0FkZHJQcm9taXNjdW91c0NoYW5nZSAtIHNldCBwcm9taXNjdW91cyBtb2RlIGZvciBnaXZlbiBwb3J0CisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgbWFuYWdlcyBwcm9taXNjdW91cyBtb2RlOgorICoJLSBub25lCisgKgktIGFsbCBMTEMgZnJhbWVzCisgKgktIGFsbCBNQyBmcmFtZXMKKyAqCisgKglJdCBjYWxscyBlaXRoZXIgU2tBZGRyWG1hY1Byb21pc2N1b3VzQ2hhbmdlIG9yCisgKglTa0FkZHJHbWFjUHJvbWlzY3VvdXNDaGFuZ2UsIGFjY29yZGluZyB0byB0aGUgYWRhcHRlciBpbiB1c2UuCisgKglUaGUgcmVhbCB3b3JrIGlzIGRvbmUgdGhlcmUuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlCisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfQUREUl9TVUNDRVNTCisgKglTS19BRERSX0lMTEVHQUxfUE9SVAorICovCitpbnQJU2tBZGRyUHJvbWlzY3VvdXNDaGFuZ2UoCitTS19BQwkqcEFDLAkJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCQkvKiBJL08gY29udGV4dCAqLworU0tfVTMyCVBvcnROdW1iZXIsCQkvKiBwb3J0IHdob3NlIHByb21pc2N1b3VzIG1vZGUgY2hhbmdlcyAqLworaW50CQlOZXdQcm9tTW9kZSkJLyogbmV3IHByb21pc2N1b3VzIG1vZGUgKi8KK3sKKwlpbnQgUmV0dXJuQ29kZSA9IDA7CisjaWYgKCFkZWZpbmVkKFNLX1NMSU0pIHx8IGRlZmluZWQoREVCVUcpKQorCWlmIChQb3J0TnVtYmVyID49IChTS19VMzIpIHBBQy0+R0luaS5HSU1hY3NGb3VuZCkgeworCQlyZXR1cm4gKFNLX0FERFJfSUxMRUdBTF9QT1JUKTsKKwl9CisjZW5kaWYgLyogIVNLX1NMSU0gfHwgREVCVUcgKi8KKworI2lmZGVmIEdFTkVTSVMKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQlSZXR1cm5Db2RlID0KKwkJCVNrQWRkclhtYWNQcm9taXNjdW91c0NoYW5nZShwQUMsIElvQywgUG9ydE51bWJlciwgTmV3UHJvbU1vZGUpOworCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisjaWZkZWYgWVVLT04KKwlpZiAoIXBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJUmV0dXJuQ29kZSA9CisJCQlTa0FkZHJHbWFjUHJvbWlzY3VvdXNDaGFuZ2UocEFDLCBJb0MsIFBvcnROdW1iZXIsIE5ld1Byb21Nb2RlKTsKKwl9CisjZW5kaWYgLyogWVVLT04gKi8KKworCXJldHVybiAoUmV0dXJuQ29kZSk7CisKK30JLyogU2tBZGRyUHJvbWlzY3VvdXNDaGFuZ2UgKi8KKworI2lmZGVmIEdFTkVTSVMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrQWRkclhtYWNQcm9taXNjdW91c0NoYW5nZSAtIHNldCBwcm9taXNjdW91cyBtb2RlIGZvciBnaXZlbiBwb3J0CisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgbWFuYWdlcyBwcm9taXNjdW91cyBtb2RlOgorICoJLSBub25lCisgKgktIGFsbCBMTEMgZnJhbWVzCisgKgktIGFsbCBNQyBmcmFtZXMKKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGUKKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglTS19BRERSX1NVQ0NFU1MKKyAqCVNLX0FERFJfSUxMRUdBTF9QT1JUCisgKi8KK2ludAlTa0FkZHJYbWFjUHJvbWlzY3VvdXNDaGFuZ2UoCitTS19BQwkqcEFDLAkJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCQkvKiBJL08gY29udGV4dCAqLworU0tfVTMyCVBvcnROdW1iZXIsCQkvKiBwb3J0IHdob3NlIHByb21pc2N1b3VzIG1vZGUgY2hhbmdlcyAqLworaW50CQlOZXdQcm9tTW9kZSkJLyogbmV3IHByb21pc2N1b3VzIG1vZGUgKi8KK3sKKwlpbnQJCQlpOworCVNLX0JPT0wJCUluZXhhY3RNb2RlQml0OworCVNLX1U4CQlJbmV4YWN0OworCVNLX1U4CQlId0luZXhhY3Q7CisJU0tfRklMVEVSNjQJSHdJbmV4YWN0RmlsdGVyOworCVNLX1UxNgkJTG9Nb2RlOwkJLyogTG93ZXIgMTYgYml0cyBvZiBYTUFDIE1vZGUgUmVnaXN0ZXIuICovCisJaW50CQkJQ3VyUHJvbU1vZGUgPSBTS19QUk9NX01PREVfTk9ORTsKKworCS8qIFJlYWQgQ3VyUHJvbU1vZGUgZnJvbSBIYXJkd2FyZS4gKi8KKwlYTV9JTjE2KElvQywgUG9ydE51bWJlciwgWE1fTU9ERSwgJkxvTW9kZSk7CisKKwlpZiAoKExvTW9kZSAmIFhNX01EX0VOQV9QUk9NKSAhPSAwKSB7CisJCS8qIFByb21pc2N1b3VzIG1vZGUhICovCisJCUN1clByb21Nb2RlIHw9IFNLX1BST01fTU9ERV9MTEM7CisJfQorCQorCWZvciAoSW5leGFjdCA9IDB4RkYsIGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCUluZXhhY3QgJj0gcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1tpXTsKKwl9CisJaWYgKEluZXhhY3QgPT0gMHhGRikgeworCQlDdXJQcm9tTW9kZSB8PSAocEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uUHJvbU1vZGUgJiBTS19QUk9NX01PREVfQUxMX01DKTsKKwl9CisJZWxzZSB7CisJCS8qIEdldCBJbmV4YWN0TW9kZUJpdCAoYml0IFhNX01EX0VOQV9IQVNIIGluIG1vZGUgcmVnaXN0ZXIpICovCisJCVhNX0lOMTYoSW9DLCBQb3J0TnVtYmVyLCBYTV9NT0RFLCAmTG9Nb2RlKTsKKwkJCisJCUluZXhhY3RNb2RlQml0ID0gKExvTW9kZSAmIFhNX01EX0VOQV9IQVNIKSAhPSAwOworCisJCS8qIFJlYWQgNjQtYml0IGhhc2ggcmVnaXN0ZXIgZnJvbSBYTUFDICovCisJCVhNX0lOSEFTSChJb0MsIFBvcnROdW1iZXIsIFhNX0hTTSwgJkh3SW5leGFjdEZpbHRlci5CeXRlc1swXSk7CisKKwkJZm9yIChId0luZXhhY3QgPSAweEZGLCBpID0gMDsgaSA8IDg7IGkrKykgeworCQkJSHdJbmV4YWN0ICY9IEh3SW5leGFjdEZpbHRlci5CeXRlc1tpXTsKKwkJfQorCisJCWlmIChJbmV4YWN0TW9kZUJpdCAmJiAoSHdJbmV4YWN0ID09IDB4RkYpKSB7CisJCQlDdXJQcm9tTW9kZSB8PSBTS19QUk9NX01PREVfQUxMX01DOworCQl9CisJfQorCisJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uUHJvbU1vZGUgPSBOZXdQcm9tTW9kZTsKKworCWlmIChOZXdQcm9tTW9kZSA9PSBDdXJQcm9tTW9kZSkgeworCQlyZXR1cm4gKFNLX0FERFJfU1VDQ0VTUyk7CisJfQorCisJaWYgKChOZXdQcm9tTW9kZSAmIFNLX1BST01fTU9ERV9BTExfTUMpICYmCisJCSEoQ3VyUHJvbU1vZGUgJiBTS19QUk9NX01PREVfQUxMX01DKSkgewkvKiBBbGwgTUMuICovCisJCQorCQkvKiBTZXQgYWxsIGJpdHMgaW4gNjQtYml0IGhhc2ggcmVnaXN0ZXIuICovCisJCVhNX09VVEhBU0goSW9DLCBQb3J0TnVtYmVyLCBYTV9IU00sICZPbmVzSGFzaCk7CisKKwkJLyogRW5hYmxlIEhhc2hpbmcgKi8KKwkJU2tNYWNIYXNoaW5nKHBBQywgSW9DLCAoaW50KSBQb3J0TnVtYmVyLCBTS19UUlVFKTsKKwl9CisJZWxzZSBpZiAoKEN1clByb21Nb2RlICYgU0tfUFJPTV9NT0RFX0FMTF9NQykgJiYKKwkJIShOZXdQcm9tTW9kZSAmIFNLX1BST01fTU9ERV9BTExfTUMpKSB7CS8qIE5vcm0gTUMuICovCisJCWZvciAoSW5leGFjdCA9IDAsIGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlJbmV4YWN0IHw9IHBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV07CisJCX0KKwkJaWYgKEluZXhhY3QgPT0gMCkgeworCQkJLyogRGlzYWJsZSBIYXNoaW5nICovCisJCQlTa01hY0hhc2hpbmcocEFDLCBJb0MsIChpbnQpIFBvcnROdW1iZXIsIFNLX0ZBTFNFKTsKKwkJfQorCQllbHNlIHsKKwkJCS8qIFNldCA2NC1iaXQgaGFzaCByZWdpc3RlciB0byBJbmV4YWN0RmlsdGVyLiAqLworCQkJWE1fT1VUSEFTSChJb0MsIFBvcnROdW1iZXIsIFhNX0hTTSwKKwkJCQkmcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1swXSk7CisKKwkJCS8qIEVuYWJsZSBIYXNoaW5nICovCisJCQlTa01hY0hhc2hpbmcocEFDLCBJb0MsIChpbnQpIFBvcnROdW1iZXIsIFNLX1RSVUUpOworCQl9CisJfQorCisJaWYgKChOZXdQcm9tTW9kZSAmIFNLX1BST01fTU9ERV9MTEMpICYmCisJCSEoQ3VyUHJvbU1vZGUgJiBTS19QUk9NX01PREVfTExDKSkgewkvKiBQcm9tLiBMTEMgKi8KKwkJLyogU2V0IHRoZSBNQUMgaW4gUHJvbWlzY3VvdXMgTW9kZSAqLworCQlTa01hY1Byb21pc2NNb2RlKHBBQywgSW9DLCAoaW50KSBQb3J0TnVtYmVyLCBTS19UUlVFKTsKKwl9CisJZWxzZSBpZiAoKEN1clByb21Nb2RlICYgU0tfUFJPTV9NT0RFX0xMQykgJiYKKwkJIShOZXdQcm9tTW9kZSAmIFNLX1BST01fTU9ERV9MTEMpKSB7CS8qIE5vcm0uIExMQy4gKi8KKwkJLyogQ2xlYXIgUHJvbWlzY3VvdXMgTW9kZSAqLworCQlTa01hY1Byb21pc2NNb2RlKHBBQywgSW9DLCAoaW50KSBQb3J0TnVtYmVyLCBTS19GQUxTRSk7CisJfQorCQorCXJldHVybiAoU0tfQUREUl9TVUNDRVNTKTsKKwkKK30JLyogU2tBZGRyWG1hY1Byb21pc2N1b3VzQ2hhbmdlICovCisKKyNlbmRpZiAvKiBHRU5FU0lTICovCisKKyNpZmRlZiBZVUtPTgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tBZGRyR21hY1Byb21pc2N1b3VzQ2hhbmdlIC0gc2V0IHByb21pc2N1b3VzIG1vZGUgZm9yIGdpdmVuIHBvcnQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBtYW5hZ2VzIHByb21pc2N1b3VzIG1vZGU6CisgKgktIG5vbmUKKyAqCS0gYWxsIExMQyBmcmFtZXMKKyAqCS0gYWxsIE1DIGZyYW1lcworICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZQorICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCVNLX0FERFJfU1VDQ0VTUworICoJU0tfQUREUl9JTExFR0FMX1BPUlQKKyAqLworaW50CVNrQWRkckdtYWNQcm9taXNjdW91c0NoYW5nZSgKK1NLX0FDCSpwQUMsCQkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJCS8qIEkvTyBjb250ZXh0ICovCitTS19VMzIJUG9ydE51bWJlciwJCS8qIHBvcnQgd2hvc2UgcHJvbWlzY3VvdXMgbW9kZSBjaGFuZ2VzICovCitpbnQJCU5ld1Byb21Nb2RlKQkvKiBuZXcgcHJvbWlzY3VvdXMgbW9kZSAqLworeworCVNLX1UxNgkJUmVjZWl2ZUNvbnRyb2w7CS8qIEdNQUMgUmVjZWl2ZSBDb250cm9sIFJlZ2lzdGVyICovCisJaW50CQlDdXJQcm9tTW9kZSA9IFNLX1BST01fTU9ERV9OT05FOworCisJLyogUmVhZCBDdXJQcm9tTW9kZSBmcm9tIEhhcmR3YXJlLiAqLworCUdNX0lOMTYoSW9DLCBQb3J0TnVtYmVyLCBHTV9SWF9DVFJMLCAmUmVjZWl2ZUNvbnRyb2wpOworCisJaWYgKChSZWNlaXZlQ29udHJvbCAmIChHTV9SWENSX1VDRl9FTkEgfCBHTV9SWENSX01DRl9FTkEpKSA9PSAwKSB7CisJCS8qIFByb21pc2N1b3VzIG1vZGUhICovCisJCUN1clByb21Nb2RlIHw9IFNLX1BST01fTU9ERV9MTEM7CisJfQorCisJaWYgKChSZWNlaXZlQ29udHJvbCAmIEdNX1JYQ1JfTUNGX0VOQSkgPT0gMCkgeworCQkvKiBBbGwgTXVsdGljYXN0IG1vZGUhICovCisJCUN1clByb21Nb2RlIHw9IChwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5Qcm9tTW9kZSAmIFNLX1BST01fTU9ERV9BTExfTUMpOworCX0KKworCXBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLlByb21Nb2RlID0gTmV3UHJvbU1vZGU7CisKKwlpZiAoTmV3UHJvbU1vZGUgPT0gQ3VyUHJvbU1vZGUpIHsKKwkJcmV0dXJuIChTS19BRERSX1NVQ0NFU1MpOworCX0KKwkKKwlpZiAoKE5ld1Byb21Nb2RlICYgU0tfUFJPTV9NT0RFX0FMTF9NQykgJiYKKwkJIShDdXJQcm9tTW9kZSAmIFNLX1BST01fTU9ERV9BTExfTUMpKSB7CS8qIEFsbCBNQyAqLworCQkKKwkJLyogU2V0IGFsbCBiaXRzIGluIDY0LWJpdCBoYXNoIHJlZ2lzdGVyLiAqLworCQlHTV9PVVRIQVNIKElvQywgUG9ydE51bWJlciwgR01fTUNfQUREUl9IMSwgJk9uZXNIYXNoKTsKKwkJCisJCS8qIEVuYWJsZSBIYXNoaW5nICovCisJCVNrTWFjSGFzaGluZyhwQUMsIElvQywgKGludCkgUG9ydE51bWJlciwgU0tfVFJVRSk7CisJfQorCQorCWlmICgoQ3VyUHJvbU1vZGUgJiBTS19QUk9NX01PREVfQUxMX01DKSAmJgorCQkhKE5ld1Byb21Nb2RlICYgU0tfUFJPTV9NT0RFX0FMTF9NQykpIHsJLyogTm9ybS4gTUMgKi8KKworCQkvKiBTZXQgNjQtYml0IGhhc2ggcmVnaXN0ZXIgdG8gSW5leGFjdEZpbHRlci4gKi8KKwkJR01fT1VUSEFTSChJb0MsIFBvcnROdW1iZXIsIEdNX01DX0FERFJfSDEsCisJCQkmcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1swXSk7CisKKwkJLyogRW5hYmxlIEhhc2hpbmcuICovCisJCVNrTWFjSGFzaGluZyhwQUMsIElvQywgKGludCkgUG9ydE51bWJlciwgU0tfVFJVRSk7CisJfQorCisJaWYgKChOZXdQcm9tTW9kZSAmIFNLX1BST01fTU9ERV9MTEMpICYmCisJCSEoQ3VyUHJvbU1vZGUgJiBTS19QUk9NX01PREVfTExDKSkgewkvKiBQcm9tLiBMTEMgKi8KKwkJCisJCS8qIFNldCB0aGUgTUFDIHRvIFByb21pc2N1b3VzIE1vZGUuICovCisJCVNrTWFjUHJvbWlzY01vZGUocEFDLCBJb0MsIChpbnQpIFBvcnROdW1iZXIsIFNLX1RSVUUpOworCX0KKwllbHNlIGlmICgoQ3VyUHJvbU1vZGUgJiBTS19QUk9NX01PREVfTExDKSAmJgorCQkhKE5ld1Byb21Nb2RlICYgU0tfUFJPTV9NT0RFX0xMQykpIHsJLyogTm9ybS4gTExDICovCisJCQorCQkvKiBDbGVhciBQcm9taXNjdW91cyBNb2RlLiAqLworCQlTa01hY1Byb21pc2NNb2RlKHBBQywgSW9DLCAoaW50KSBQb3J0TnVtYmVyLCBTS19GQUxTRSk7CisJfQorCisJcmV0dXJuIChTS19BRERSX1NVQ0NFU1MpOworCQorfQkvKiBTa0FkZHJHbWFjUHJvbWlzY3VvdXNDaGFuZ2UgKi8KKworI2VuZGlmIC8qIFlVS09OICovCisKKyNpZm5kZWYgU0tfU0xJTQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tBZGRyU3dhcCAtIHN3YXAgYWRkcmVzcyBpbmZvCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgc3dhcHMgYWRkcmVzcyBpbmZvIG9mIHR3byBwb3J0cy4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGUKKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglTS19BRERSX1NVQ0NFU1MKKyAqCVNLX0FERFJfSUxMRUdBTF9QT1JUCisgKi8KK2ludAlTa0FkZHJTd2FwKAorU0tfQUMJKnBBQywJCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkJLyogSS9PIGNvbnRleHQgKi8KK1NLX1UzMglGcm9tUG9ydE51bWJlciwJCS8qIFBvcnQxIEluZGV4ICovCitTS19VMzIJVG9Qb3J0TnVtYmVyKQkJLyogUG9ydDIgSW5kZXggKi8KK3sKKwlpbnQJCQlpOworCVNLX1U4CQlCeXRlOworCVNLX01BQ19BRERSCU1hY0FkZHI7CisJU0tfVTMyCQlEV29yZDsKKworCWlmIChGcm9tUG9ydE51bWJlciA+PSAoU0tfVTMyKSBwQUMtPkdJbmkuR0lNYWNzRm91bmQpIHsKKwkJcmV0dXJuIChTS19BRERSX0lMTEVHQUxfUE9SVCk7CisJfQorCisJaWYgKFRvUG9ydE51bWJlciA+PSAoU0tfVTMyKSBwQUMtPkdJbmkuR0lNYWNzRm91bmQpIHsKKwkJcmV0dXJuIChTS19BRERSX0lMTEVHQUxfUE9SVCk7CisJfQorCisJaWYgKHBBQy0+UmxtdC5Qb3J0W0Zyb21Qb3J0TnVtYmVyXS5OZXQgIT0gcEFDLT5SbG10LlBvcnRbVG9Qb3J0TnVtYmVyXS5OZXQpIHsKKwkJcmV0dXJuIChTS19BRERSX0lMTEVHQUxfUE9SVCk7CisJfQorCisJLyoKKwkgKiBTd2FwOgorCSAqIC0gRXhhY3QgTWF0Y2ggRW50cmllcyAoR0VuZXNpcyBhbmQgWXVrb24pCisJICogICBZdWtvbiB1c2VzIGZpcnN0IGVudHJ5IGZvciB0aGUgbG9naWNhbCBNQUMKKwkgKiAgIGFkZHJlc3MgKHN0b3JlZCBpbiB0aGUgc2Vjb25kIEdNQUMgcmVnaXN0ZXIpLgorCSAqIC0gRmlyc3RFeGFjdE1hdGNoUmxtdCAoR0VuZXNpcyBvbmx5KQorCSAqIC0gTmV4dEV4YWN0TWF0Y2hSbG10IChHRW5lc2lzIG9ubHkpCisJICogLSBGaXJzdEV4YWN0TWF0Y2hEcnYgKEdFbmVzaXMgb25seSkKKwkgKiAtIE5leHRFeGFjdE1hdGNoRHJ2IChHRW5lc2lzIG9ubHkpCisJICogLSA2NC1iaXQgZmlsdGVyIChJbmV4YWN0RmlsdGVyKQorCSAqIC0gUHJvbWlzY3VvdXMgTW9kZQorCSAqIG9mIHBvcnRzLgorCSAqLworCisJZm9yIChpID0gMDsgaSA8IFNLX0FERFJfRVhBQ1RfTUFUQ0hFUzsgaSsrKSB7CisJCU1hY0FkZHIgPSBwQUMtPkFkZHIuUG9ydFtGcm9tUG9ydE51bWJlcl0uRXhhY3RbaV07CisJCXBBQy0+QWRkci5Qb3J0W0Zyb21Qb3J0TnVtYmVyXS5FeGFjdFtpXSA9CisJCQlwQUMtPkFkZHIuUG9ydFtUb1BvcnROdW1iZXJdLkV4YWN0W2ldOworCQlwQUMtPkFkZHIuUG9ydFtUb1BvcnROdW1iZXJdLkV4YWN0W2ldID0gTWFjQWRkcjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCUJ5dGUgPSBwQUMtPkFkZHIuUG9ydFtGcm9tUG9ydE51bWJlcl0uSW5leGFjdEZpbHRlci5CeXRlc1tpXTsKKwkJcEFDLT5BZGRyLlBvcnRbRnJvbVBvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV0gPQorCQkJcEFDLT5BZGRyLlBvcnRbVG9Qb3J0TnVtYmVyXS5JbmV4YWN0RmlsdGVyLkJ5dGVzW2ldOworCQlwQUMtPkFkZHIuUG9ydFtUb1BvcnROdW1iZXJdLkluZXhhY3RGaWx0ZXIuQnl0ZXNbaV0gPSBCeXRlOworCX0KKwkKKwlpID0gcEFDLT5BZGRyLlBvcnRbRnJvbVBvcnROdW1iZXJdLlByb21Nb2RlOworCXBBQy0+QWRkci5Qb3J0W0Zyb21Qb3J0TnVtYmVyXS5Qcm9tTW9kZSA9IHBBQy0+QWRkci5Qb3J0W1RvUG9ydE51bWJlcl0uUHJvbU1vZGU7CisJcEFDLT5BZGRyLlBvcnRbVG9Qb3J0TnVtYmVyXS5Qcm9tTW9kZSA9IGk7CisJCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJRFdvcmQgPSBwQUMtPkFkZHIuUG9ydFtGcm9tUG9ydE51bWJlcl0uRmlyc3RFeGFjdE1hdGNoUmxtdDsKKwkJcEFDLT5BZGRyLlBvcnRbRnJvbVBvcnROdW1iZXJdLkZpcnN0RXhhY3RNYXRjaFJsbXQgPQorCQkJcEFDLT5BZGRyLlBvcnRbVG9Qb3J0TnVtYmVyXS5GaXJzdEV4YWN0TWF0Y2hSbG10OworCQlwQUMtPkFkZHIuUG9ydFtUb1BvcnROdW1iZXJdLkZpcnN0RXhhY3RNYXRjaFJsbXQgPSBEV29yZDsKKwkJCisJCURXb3JkID0gcEFDLT5BZGRyLlBvcnRbRnJvbVBvcnROdW1iZXJdLk5leHRFeGFjdE1hdGNoUmxtdDsKKwkJcEFDLT5BZGRyLlBvcnRbRnJvbVBvcnROdW1iZXJdLk5leHRFeGFjdE1hdGNoUmxtdCA9CisJCQlwQUMtPkFkZHIuUG9ydFtUb1BvcnROdW1iZXJdLk5leHRFeGFjdE1hdGNoUmxtdDsKKwkJcEFDLT5BZGRyLlBvcnRbVG9Qb3J0TnVtYmVyXS5OZXh0RXhhY3RNYXRjaFJsbXQgPSBEV29yZDsKKwkJCisJCURXb3JkID0gcEFDLT5BZGRyLlBvcnRbRnJvbVBvcnROdW1iZXJdLkZpcnN0RXhhY3RNYXRjaERydjsKKwkJcEFDLT5BZGRyLlBvcnRbRnJvbVBvcnROdW1iZXJdLkZpcnN0RXhhY3RNYXRjaERydiA9CisJCQlwQUMtPkFkZHIuUG9ydFtUb1BvcnROdW1iZXJdLkZpcnN0RXhhY3RNYXRjaERydjsKKwkJcEFDLT5BZGRyLlBvcnRbVG9Qb3J0TnVtYmVyXS5GaXJzdEV4YWN0TWF0Y2hEcnYgPSBEV29yZDsKKwkJCisJCURXb3JkID0gcEFDLT5BZGRyLlBvcnRbRnJvbVBvcnROdW1iZXJdLk5leHRFeGFjdE1hdGNoRHJ2OworCQlwQUMtPkFkZHIuUG9ydFtGcm9tUG9ydE51bWJlcl0uTmV4dEV4YWN0TWF0Y2hEcnYgPQorCQkJcEFDLT5BZGRyLlBvcnRbVG9Qb3J0TnVtYmVyXS5OZXh0RXhhY3RNYXRjaERydjsKKwkJcEFDLT5BZGRyLlBvcnRbVG9Qb3J0TnVtYmVyXS5OZXh0RXhhY3RNYXRjaERydiA9IERXb3JkOworCX0KKwkKKwkvKiBDQVVUSU9OOiBTb2x1dGlvbiB3b3JrcyBpZiBvbmx5IHBvcnRzIG9mIG9uZSBhZGFwdGVyIGFyZSBpbiB1c2UuICovCisJZm9yIChpID0gMDsgKFNLX1UzMikgaSA8IHBBQy0+UmxtdC5OZXRbcEFDLT5SbG10LlBvcnRbVG9Qb3J0TnVtYmVyXS4KKwkJTmV0LT5OZXROdW1iZXJdLk51bVBvcnRzOyBpKyspIHsKKwkJaWYgKHBBQy0+UmxtdC5OZXRbcEFDLT5SbG10LlBvcnRbVG9Qb3J0TnVtYmVyXS5OZXQtPk5ldE51bWJlcl0uCisJCQlQb3J0W2ldLT5Qb3J0TnVtYmVyID09IFRvUG9ydE51bWJlcikgeworCQkJcEFDLT5BZGRyLk5ldFtwQUMtPlJsbXQuUG9ydFtUb1BvcnROdW1iZXJdLk5ldC0+TmV0TnVtYmVyXS4KKwkJCQlBY3RpdmVQb3J0ID0gaTsKKwkJCS8qIDIwMDAxMjA3IFJBOiBXYXMgIlRvUG9ydE51bWJlcjsiLiAqLworCQl9CisJfQorCQorCSh2b2lkKSBTa0FkZHJNY1VwZGF0ZShwQUMsIElvQywgRnJvbVBvcnROdW1iZXIpOworCSh2b2lkKSBTa0FkZHJNY1VwZGF0ZShwQUMsIElvQywgVG9Qb3J0TnVtYmVyKTsKKworCXJldHVybiAoU0tfQUREUl9TVUNDRVNTKTsKKwkKK30JLyogU2tBZGRyU3dhcCAqLworCisjZW5kaWYgLyogIVNLX1NMSU0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYJLyogX19jcGx1c3BsdXMgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2NzdW0uYyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tjc3VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhNmU3YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tjc3VtLmMKQEAgLTAsMCArMSw4NzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2NzdW0uYworICogUHJvamVjdDoJR0VuZXNpcywgUENJIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjEyICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzA4LzIwIDEzOjU1OjUzICQKKyAqIFB1cnBvc2U6CVN0b3JlL3ZlcmlmeSBJbnRlcm5ldCBjaGVja3N1bSBpbiBzZW5kL3JlY2VpdmUgcGFja2V0cy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMyBTeXNLb25uZWN0IEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgU0tfVVNFX0NTVU0JLyogQ2hlY2sgaWYgQ1NVTSBpcyB0byBiZSB1c2VkLiAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIFN5c0tvbm5lY3RGaWxlSWRbXSA9CisJIkAoIykgJElkOiBza2NzdW0uYyx2IDEuMTIgMjAwMy8wOC8yMCAxMzo1NTo1MyBtc2NobWlkIEV4cCAkIChDKSBTeXNLb25uZWN0LiI7CisjZW5kaWYJLyogIWxpbnQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFRoaXMgaXMgdGhlICJHRW5lc2lzIiBjb21tb24gbW9kdWxlICJDU1VNIi4KKyAqCisgKiBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgY29kZSBuZWNlc3NhcnkgdG8gY2FsY3VsYXRlLCBzdG9yZSwgYW5kIHZlcmlmeSB0aGUKKyAqIEludGVybmV0IENoZWNrc3VtIG9mIElQLCBUQ1AsIGFuZCBVRFAgZnJhbWVzLgorICoKKyAqICJHRW5lc2lzIiBpcyBhbiBhYmJyZXZpYXRpb24gb2YgIkdpZ2FiaXQgRXRoZXJuZXQgTmV0d29yayBTeXN0ZW0gaW4gU2lsaWNvbiIKKyAqIGFuZCBpcyB0aGUgY29kZSBuYW1lIG9mIHRoaXMgU3lzS29ubmVjdCBwcm9qZWN0LgorICoKKyAqIENvbXBpbGF0aW9uIE9wdGlvbnM6CisgKgorICoJU0tfVVNFX0NTVU0gLSBEZWZpbmUgaWYgQ1NVTSBpcyB0byBiZSB1c2VkLiBPdGhlcndpc2UsIENTVU0gd2lsbCBiZSBhbgorICoJZW1wdHkgbW9kdWxlLgorICoKKyAqCVNLQ1NfT1ZFUldSSVRFX1BST1RPIC0gRGVmaW5lIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCBwcm90b2NvbCBpZAorICoJZGVmaW5pdGlvbnMuIEluIHRoaXMgY2FzZSwgYWxsIFNLQ1NfUFJPVE9feHh4IGRlZmluaXRpb25zIG11c3QgYmUgbWFkZQorICoJZXh0ZXJuYWwuCisgKgorICoJU0tDU19PVkVSV1JJVEVfU1RBVFVTIC0gRGVmaW5lIHRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCByZXR1cm4gc3RhdHVzCisgKglkZWZpbml0aW9ucy4gSW4gdGhpcyBjYXNlLCBhbGwgU0tDU19TVEFUVVNfeHh4IGRlZmluaXRpb25zIG11c3QgYmUgbWFkZQorICoJZXh0ZXJuYWwuCisgKgorICogSW5jbHVkZSBGaWxlIEhpZXJhcmNoeToKKyAqCisgKgkiaC9za2RydjFzdC5oIgorICoJImgvc2tjc3VtLmgiCisgKgkiaC9za3R5cGVzLmgiCisgKgkiaC9za3F1ZXVlLmgiCisgKgkiaC9za2RydjJuZC5oIgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJoL3NrZHJ2MXN0LmgiCisjaW5jbHVkZSAiaC9za2NzdW0uaCIKKyNpbmNsdWRlICJoL3NrZHJ2Mm5kLmgiCisKKy8qIGRlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBzaXplIG9mIGFuIEV0aGVybmV0IE1BQyBoZWFkZXIuICovCisjZGVmaW5lIFNLQ1NfRVRIRVJORVRfTUFDX0hFQURFUl9TSVpFCQkJKDYrNisyKQorCisvKiBUaGUgc2l6ZSBvZiB0aGUgdXNlZCB0b3BvbG9neSdzIE1BQyBoZWFkZXIuICovCisjZGVmaW5lCVNLQ1NfTUFDX0hFQURFUl9TSVpFCVNLQ1NfRVRIRVJORVRfTUFDX0hFQURFUl9TSVpFCisKKy8qIFRoZSBzaXplIG9mIHRoZSBJUCBoZWFkZXIgd2l0aG91dCBhbnkgb3B0aW9uIGZpZWxkcy4gKi8KKyNkZWZpbmUgU0tDU19JUF9IRUFERVJfU0laRQkJCQkJCTIwCisKKy8qCisgKiBGaWVsZCBvZmZzZXRzIHdpdGhpbiB0aGUgSVAgaGVhZGVyLgorICovCisKKy8qICJJbnRlcm5ldCBIZWFkZXIgVmVyc2lvbiIgYW5kICJMZW5ndGgiLiAqLworI2RlZmluZSBTS0NTX09GU19JUF9IRUFERVJfVkVSU0lPTl9BTkRfTEVOR1RICTAKKworLyogIlRvdGFsIExlbmd0aCIuICovCisjZGVmaW5lIFNLQ1NfT0ZTX0lQX1RPVEFMX0xFTkdUSAkJCQkyCisKKy8qICJGbGFncyIgIkZyYWdtZW50IE9mZnNldCIuICovCisjZGVmaW5lIFNLQ1NfT0ZTX0lQX0ZMQUdTX0FORF9GUkFHTUVOVF9PRkZTRVQJNgorCisvKiAiTmV4dCBMZXZlbCBQcm90b2NvbCIgaWRlbnRpZmllci4gKi8KKyNkZWZpbmUgU0tDU19PRlNfSVBfTkVYVF9MRVZFTF9QUk9UT0NPTAkJCTkKKworLyogU291cmNlIElQIGFkZHJlc3MuICovCisjZGVmaW5lIFNLQ1NfT0ZTX0lQX1NPVVJDRV9BRERSRVNTCQkJCTEyCisKKy8qIERlc3RpbmF0aW9uIElQIGFkZHJlc3MuICovCisjZGVmaW5lIFNLQ1NfT0ZTX0lQX0RFU1RJTkFUSU9OX0FERFJFU1MJCQkxNgorCisKKy8qCisgKiBGaWVsZCBvZmZzZXRzIHdpdGhpbiB0aGUgVURQIGhlYWRlci4KKyAqLworCisvKiBVRFAgY2hlY2tzdW0uICovCisjZGVmaW5lIFNLQ1NfT0ZTX1VEUF9DSEVDS1NVTQkJCQkJNgorCisvKiBJUCAiTmV4dCBMZXZlbCBQcm90b2NvbCIgaWRlbnRpZmllcnMgKHNlZSBSRkMgNzkwKS4gKi8KKyNkZWZpbmUgU0tDU19QUk9UT19JRF9UQ1AJCTYJLyogVHJhbnNwb3J0IENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgU0tDU19QUk9UT19JRF9VRFAJCTE3CS8qIFVzZXIgRGF0YWdyYW0gUHJvdG9jb2wgKi8KKworLyogSVAgIkRvbid0IEZyYWdtZW50IiBiaXQuICovCisjZGVmaW5lIFNLQ1NfSVBfRE9OVF9GUkFHTUVOVAlTS0NTX0hUT04xNigweDQwMDApCisKKy8qIEFkZCBhIGJ5dGUgb2Zmc2V0IHRvIGEgcG9pbnRlci4gKi8KKyNkZWZpbmUgU0tDU19JRFgocFB0ciwgT2ZzKQkoKHZvaWQgKikgKChjaGFyICopIChwUHRyKSArIChPZnMpKSkKKworLyoKKyAqIE1hY3JvcyB0aGF0IGNvbnZlcnQgaG9zdCB0byBuZXR3b3JrIHJlcHJlc2VudGF0aW9uIGFuZCB2aWNlIHZlcnNhLCBpLmUuCisgKiBsaXR0bGUvYmlnIGVuZGlhbiBjb252ZXJzaW9uIG9uIGxpdHRsZSBlbmRpYW4gbWFjaGluZXMgb25seS4KKyAqLworI2lmZGVmIFNLX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgU0tDU19IVE9OMTYoVmFsMTYpCSgoKHVuc2lnbmVkKSAoVmFsMTYpID4+IDgpIHwgKCgoVmFsMTYpICYgMHhmZikgPDwgOCkpCisjZW5kaWYJLyogU0tfTElUVExFX0VORElBTiAqLworI2lmZGVmIFNLX0JJR19FTkRJQU4KKyNkZWZpbmUgU0tDU19IVE9OMTYoVmFsMTYpCShWYWwxNikKKyNlbmRpZgkvKiBTS19CSUdfRU5ESUFOICovCisjZGVmaW5lIFNLQ1NfTlRPSDE2KFZhbDE2KQlTS0NTX0hUT04xNihWYWwxNikKKworLyogdHlwZWRlZnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrQ3NHZXRTZW5kSW5mbyAtIGdldCBjaGVja3N1bSBpbmZvcm1hdGlvbiBmb3IgYSBzZW5kIHBhY2tldAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJR2V0IGFsbCBjaGVja3N1bSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gc2VuZCBhIFRDUCBvciBVRFAgcGFja2V0LiBUaGUKKyAqCWZ1bmN0aW9uIGNoZWNrcyB0aGUgSVAgaGVhZGVyIHBhc3NlZCB0byBpdC4gSWYgdGhlIGhpZ2gtbGV2ZWwgcHJvdG9jb2wKKyAqCWlzIGVpdGhlciBUQ1Agb3IgVURQIHRoZSBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtIGlzIGNhbGN1bGF0ZWQgYW5kCisgKglyZXR1cm5lZC4KKyAqCisgKglUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBJUCBoZWFkZXIgKGluY2x1ZGluZyBhbnkKKyAqCUlQIG9wdGlvbiBmaWVsZHMpLCB3aGljaCBpcyB0aGUgc2FtZSBhcyB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBJUCBkYXRhCisgKgl3aGljaCBpbiB0dXJuIGlzIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIFRDUCBvciBVRFAgaGVhZGVyLgorICoKKyAqCVRoZSBmdW5jdGlvbiBhbHNvIHJldHVybnMgdGhlIFRDUCBvciBVRFAgcHNldWRvIGhlYWRlciBjaGVja3N1bSwgd2hpY2gKKyAqCXNob3VsZCBiZSB1c2VkIGFzIHRoZSBzdGFydCB2YWx1ZSBmb3IgdGhlIGhhcmR3YXJlIGNoZWNrc3VtIGNhbGN1bGF0aW9uLgorICoJKE5vdGUgdGhhdCBhbnkgYWN0dWFsIHBzZXVkbyBoZWFkZXIgY2hlY2tzdW0gY2FuIG5ldmVyIGNhbGN1bGF0ZSB0bworICoJemVyby4pCisgKgorICogTm90ZToKKyAqCVRoZXJlIGlzIGEgYnVnIGluIHRoZSBHRU5FU0lTIEFTSUMgd2hpY2ggbWF5IGxlYWQgdG8gd3JvbmcgY2hlY2tzdW1zLgorICoKKyAqIEFyZ3VtZW50czoKKyAqCXBBYyAtIEEgcG9pbnRlciB0byB0aGUgYWRhcHRlciBjb250ZXh0IHN0cnVjdC4KKyAqCisgKglwSXBIZWFkZXIgLSBQb2ludGVyIHRvIElQIGhlYWRlci4gTXVzdCBiZSBhdCBsZWFzdCB0aGUgSVAgaGVhZGVyICpub3QqCisgKglpbmNsdWRpbmcgYW55IG9wdGlvbiBmaWVsZHMsIGkuZS4gYXQgbGVhc3QgMjAgYnl0ZXMuCisgKgorICoJTm90ZTogVGhpcyBwb2ludGVyIHdpbGwgYmUgdXNlZCB0byBhZGRyZXNzIDgtLCAxNi0sIGFuZCAzMi1iaXQKKyAqCXZhcmlhYmxlcyB3aXRoIHRoZSByZXNwZWN0aXZlIGFsaWdubWVudCBvZmZzZXRzIHJlbGF0aXZlIHRvIHRoZSBwb2ludGVyLgorICoJVGh1cywgdGhlIHBvaW50ZXIgc2hvdWxkIHBvaW50IHRvIGEgMzItYml0IGFsaWduZWQgYWRkcmVzcy4gSWYgdGhlCisgKgl0YXJnZXQgc3lzdGVtIGNhbm5vdCBhZGRyZXNzIDMyLWJpdCB2YXJpYWJsZXMgb24gbm9uIDMyLWJpdCBhbGlnbmVkCisgKglhZGRyZXNzZXMsIHRoZW4gdGhlIHBvaW50ZXIgKm11c3QqIHBvaW50IHRvIGEgMzItYml0IGFsaWduZWQgYWRkcmVzcy4KKyAqCisgKglwUGFja2V0SW5mbyAtIEEgcG9pbnRlciB0byB0aGUgcGFja2V0IGluZm9ybWF0aW9uIHN0cnVjdHVyZSBmb3IgdGhpcworICoJcGFja2V0LiBCZWZvcmUgY2FsbGluZyB0aGlzIFNrQ3NHZXRTZW5kSW5mbygpLCB0aGUgZm9sbG93aW5nIGZpZWxkIG11c3QKKyAqCWJlIGluaXRpYWxpemVkOgorICoKKyAqCQlQcm90b2NvbEZsYWdzIC0gSW5pdGlhbGl6ZSB3aXRoIGFueSBjb21iaW5hdGlvbiBvZgorICoJCVNLQ1NfUFJPVE9fWFhYIGJpdCBmbGFncy4gU2tDc0dldFNlbmRJbmZvKCkgd2lsbCBvbmx5IHdvcmsgb24KKyAqCQl0aGUgcHJvdG9jb2xzIHNwZWNpZmllZCBoZXJlLiBBbnkgcHJvdG9jb2wocykgbm90IHNwZWNpZmllZAorICoJCWhlcmUgd2lsbCBiZSBpZ25vcmVkLgorICoKKyAqCQlOb3RlOiBPbmx5IG9uZSBjaGVja3N1bSBjYW4gYmUgY2FsY3VsYXRlZCBpbiBoYXJkd2FyZS4gVGh1cywgaWYKKyAqCQlTS0NTX1BST1RPX0lQIGlzIHNwZWNpZmllZCBpbiB0aGUgJ1Byb3RvY29sRmxhZ3MnLAorICoJCVNrQ3NHZXRTZW5kSW5mbygpIG11c3QgY2FsY3VsYXRlIHRoZSBJUCBoZWFkZXIgY2hlY2tzdW0gaW4KKyAqCQlzb2Z0d2FyZS4gSXQgbWlnaHQgYmUgYSBiZXR0ZXIgaWRlYSB0byBoYXZlIHRoZSBjYWxsaW5nCisgKgkJcHJvdG9jb2wgc3RhY2sgY2FsY3VsYXRlIHRoZSBJUCBoZWFkZXIgY2hlY2tzdW0uCisgKgorICogUmV0dXJuczogTi9BCisgKglPbiByZXR1cm4sIHRoZSBmb2xsb3dpbmcgZmllbGRzIGluICdwUGFja2V0SW5mbycgbWF5IG9yIG1heSBub3QgaGF2ZQorICoJYmVlbiBmaWxsZWQgd2l0aCBpbmZvcm1hdGlvbiwgZGVwZW5kaW5nIG9uIHRoZSBwcm90b2NvbChzKSBmb3VuZCBpbiB0aGUKKyAqCXBhY2tldDoKKyAqCisgKglQcm90b2NvbEZsYWdzIC0gUmV0dXJucyB0aGUgU0tDU19QUk9UT19YWFggYml0IGZsYWdzIG9mIHRoZSBwcm90b2NvbChzKQorICoJdGhhdCB3ZXJlIGJvdGggcmVxdWVzdGVkIGJ5IHRoZSBjYWxsZXIgYW5kIGFjdHVhbGx5IGZvdW5kIGluIHRoZSBwYWNrZXQuCisgKglQcm90b2NvbChzKSBub3Qgc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIgYW5kL29yIG5vdCBmb3VuZCBpbiB0aGUgcGFja2V0CisgKgl3aWxsIGhhdmUgdGhlaXIgcmVzcGVjdGl2ZSBTS0NTX1BST1RPX1hYWCBiaXQgZmxhZ3MgcmVzZXQuCisgKgorICoJTm90ZTogRm9yIElQIGZyYWdtZW50cywgVENQIGFuZCBVRFAgcGFja2V0IGluZm9ybWF0aW9uIGlzIGlnbm9yZWQuCisgKgorICoJSXBIZWFkZXJMZW5ndGggLSBUaGUgdG90YWwgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBjb21wbGV0ZSBJUCBoZWFkZXIKKyAqCWluY2x1ZGluZyBhbnkgb3B0aW9uIGZpZWxkcyBpcyByZXR1cm5lZCBoZXJlLiBUaGlzIGlzIHRoZSBzdGFydCBvZmZzZXQKKyAqCW9mIHRoZSBJUCBkYXRhLCBpLmUuIHRoZSBUQ1Agb3IgVURQIGhlYWRlciBpZiBwcmVzZW50LgorICoKKyAqCUlwSGVhZGVyQ2hlY2tzdW0gLSBJZiBJUCBoYXMgYmVlbiBzcGVjaWZpZWQgaW4gdGhlICdQcm90b2NvbEZsYWdzJywgdGhlCisgKgkxNi1iaXQgSW50ZXJuZXQgQ2hlY2tzdW0gb2YgdGhlIElQIGhlYWRlciBpcyByZXR1cm5lZCBoZXJlLiBUaGlzIHZhbHVlCisgKglpcyB0byBiZSBzdG9yZWQgaW50byB0aGUgcGFja2V0J3MgJ0lQIEhlYWRlciBDaGVja3N1bScgZmllbGQuCisgKgorICoJUHNldWRvSGVhZGVyQ2hlY2tzdW0gLSBJZiB0aGlzIGlzIGEgVENQIG9yIFVEUCBwYWNrZXQgYW5kIGlmIFRDUCBvciBVRFAKKyAqCWhhcyBiZWVuIHNwZWNpZmllZCBpbiB0aGUgJ1Byb3RvY29sRmxhZ3MnLCB0aGUgMTYtYml0IEludGVybmV0IENoZWNrc3VtCisgKglvZiB0aGUgVENQIG9yIFVEUCBwc2V1ZG8gaGVhZGVyIGlzIHJldHVybmVkIGhlcmUuCisgKi8KK3ZvaWQgU2tDc0dldFNlbmRJbmZvKAorU0tfQUMJCQkJKnBBYywJCQkvKiBBZGFwdGVyIGNvbnRleHQgc3RydWN0LiAqLwordm9pZAkJCQkqcElwSGVhZGVyLAkJLyogSVAgaGVhZGVyLiAqLworU0tDU19QQUNLRVRfSU5GTwkqcFBhY2tldEluZm8sCS8qIFBhY2tldCBpbmZvcm1hdGlvbiBzdHJ1Y3QuICovCitpbnQJCQkJCU5ldE51bWJlcikJCS8qIE5ldCBudW1iZXIgKi8KK3sKKwkvKiBJbnRlcm5ldCBIZWFkZXIgVmVyc2lvbiBmb3VuZCBpbiBJUCBoZWFkZXIuICovCisJdW5zaWduZWQgSW50ZXJuZXRIZWFkZXJWZXJzaW9uOworCisJLyogTGVuZ3RoIG9mIHRoZSBJUCBoZWFkZXIgYXMgZm91bmQgaW4gSVAgaGVhZGVyLiAqLworCXVuc2lnbmVkIElwSGVhZGVyTGVuZ3RoOworCisJLyogQml0IGZpZWxkIHNwZWNpZml5aW5nIHRoZSBkZXNpcmVkL2ZvdW5kIHByb3RvY29scy4gKi8KKwl1bnNpZ25lZCBQcm90b2NvbEZsYWdzOworCisJLyogTmV4dCBsZXZlbCBwcm90b2NvbCBpZGVudGlmaWVyIGZvdW5kIGluIElQIGhlYWRlci4gKi8KKwl1bnNpZ25lZCBOZXh0TGV2ZWxQcm90b2NvbDsKKworCS8qIExlbmd0aCBvZiBJUCBkYXRhIHBvcnRpb24uICovCisJdW5zaWduZWQgSXBEYXRhTGVuZ3RoOworCisJLyogVENQL1VEUCBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtLiAqLworCXVuc2lnbmVkIGxvbmcgUHNldWRvSGVhZGVyQ2hlY2tzdW07CisKKwkvKiBQb2ludGVyIHRvIG5leHQgbGV2ZWwgcHJvdG9jb2wgc3RhdGlzdGljcyBzdHJ1Y3R1cmUuICovCisJU0tDU19QUk9UT19TVEFUUyAqTmV4dExldmVsUHJvdG9TdGF0czsKKworCS8qIFRlbXBvcmFyeSB2YXJpYWJsZS4gKi8KKwl1bnNpZ25lZCBUbXA7CisKKwlUbXAgPSAqKFNLX1U4ICopCisJCVNLQ1NfSURYKHBJcEhlYWRlciwgU0tDU19PRlNfSVBfSEVBREVSX1ZFUlNJT05fQU5EX0xFTkdUSCk7CisKKwkvKiBHZXQgdGhlIEludGVybmV0IEhlYWRlciBWZXJzaW9uIChJSFYpLiAqLworCS8qIE5vdGU6IFRoZSBJSFYgaXMgc3RvcmVkIGluIHRoZSB1cHBlciBmb3VyIGJpdHMuICovCisKKwlJbnRlcm5ldEhlYWRlclZlcnNpb24gPSBUbXAgPj4gNDsKKworCS8qIENoZWNrIHRoZSBJbnRlcm5ldCBIZWFkZXIgVmVyc2lvbi4gKi8KKwkvKiBOb3RlOiBXZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IElQIHZlcnNpb24gNC4gKi8KKworCWlmIChJbnRlcm5ldEhlYWRlclZlcnNpb24gIT0gNCkgewkvKiBJUHY0PyAqLworCQlTS19EQkdfTVNHKHBBYywgU0tfREJHTU9EX0NTVU0sIFNLX0RCR0NBVF9FUlIgfCBTS19EQkdDQVRfVFgsCisJCQkoIlR4OiBVbmtub3duIEludGVybmV0IEhlYWRlciBWZXJzaW9uICV1LlxuIiwKKwkJCUludGVybmV0SGVhZGVyVmVyc2lvbikpOworCQlwUGFja2V0SW5mby0+UHJvdG9jb2xGbGFncyA9IDA7CisJCXBBYy0+Q3N1bS5Qcm90b1N0YXRzW05ldE51bWJlcl1bU0tDU19QUk9UT19TVEFUU19JUF0uVHhVbmFibGVDdHMrKzsKKwkJcmV0dXJuOworCX0KKworCS8qIEdldCB0aGUgSVAgaGVhZGVyIGxlbmd0aCAoSUhMKS4gKi8KKwkvKgorCSAqIE5vdGU6IFRoZSBJSEwgaXMgc3RvcmVkIGluIHRoZSBsb3dlciBmb3VyIGJpdHMgYXMgdGhlIG51bWJlciBvZgorCSAqIDQtYnl0ZSB3b3Jkcy4KKwkgKi8KKworCUlwSGVhZGVyTGVuZ3RoID0gKFRtcCAmIDB4ZikgKiA0OworCXBQYWNrZXRJbmZvLT5JcEhlYWRlckxlbmd0aCA9IElwSGVhZGVyTGVuZ3RoOworCisJLyogQ2hlY2sgdGhlIElQIGhlYWRlciBsZW5ndGguICovCisKKwkvKiAwNC1BdWctMTk5OCBzdyAtIFJlYWxseSBjaGVjayB0aGUgSUhMPyBOZWNlc3Nhcnk/ICovCisKKwlpZiAoSXBIZWFkZXJMZW5ndGggPCA1KjQpIHsKKwkJU0tfREJHX01TRyhwQWMsIFNLX0RCR01PRF9DU1VNLCBTS19EQkdDQVRfRVJSIHwgU0tfREJHQ0FUX1RYLAorCQkJKCJUeDogSW52YWxpZCBJUCBIZWFkZXIgTGVuZ3RoICV1LlxuIiwgSXBIZWFkZXJMZW5ndGgpKTsKKwkJcFBhY2tldEluZm8tPlByb3RvY29sRmxhZ3MgPSAwOworCQlwQWMtPkNzdW0uUHJvdG9TdGF0c1tOZXROdW1iZXJdW1NLQ1NfUFJPVE9fU1RBVFNfSVBdLlR4VW5hYmxlQ3RzKys7CisJCXJldHVybjsKKwl9CisKKwkvKiBUaGlzIGlzIGFuIElQdjQgZnJhbWUgd2l0aCBhIGhlYWRlciBvZiB2YWxpZCBsZW5ndGguICovCisKKwlwQWMtPkNzdW0uUHJvdG9TdGF0c1tOZXROdW1iZXJdW1NLQ1NfUFJPVE9fU1RBVFNfSVBdLlR4T2tDdHMrKzsKKworCS8qIENoZWNrIGlmIHdlIHNob3VsZCBjYWxjdWxhdGUgdGhlIElQIGhlYWRlciBjaGVja3N1bS4gKi8KKworCVByb3RvY29sRmxhZ3MgPSBwUGFja2V0SW5mby0+UHJvdG9jb2xGbGFnczsKKworCWlmIChQcm90b2NvbEZsYWdzICYgU0tDU19QUk9UT19JUCkgeworCQlwUGFja2V0SW5mby0+SXBIZWFkZXJDaGVja3N1bSA9CisJCQlTa0NzQ2FsY3VsYXRlQ2hlY2tzdW0ocElwSGVhZGVyLCBJcEhlYWRlckxlbmd0aCk7CisJfQorCisJLyogR2V0IHRoZSBuZXh0IGxldmVsIHByb3RvY29sIGlkZW50aWZpZXIuICovCisKKwlOZXh0TGV2ZWxQcm90b2NvbCA9CisJCSooU0tfVTggKikgU0tDU19JRFgocElwSGVhZGVyLCBTS0NTX09GU19JUF9ORVhUX0xFVkVMX1BST1RPQ09MKTsKKworCS8qCisJICogQ2hlY2sgaWYgdGhpcyBpcyBhIFRDUCBvciBVRFAgZnJhbWUgYW5kIGlmIHdlIHNob3VsZCBjYWxjdWxhdGUgdGhlCisJICogVENQL1VEUCBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtLgorCSAqCisJICogQWxzbyBjbGVhciBhbGwgcHJvdG9jb2wgYml0IGZsYWdzIG9mIHByb3RvY29scyBub3QgcHJlc2VudCBpbiB0aGUKKwkgKiBmcmFtZS4KKwkgKi8KKworCWlmICgoUHJvdG9jb2xGbGFncyAmIFNLQ1NfUFJPVE9fVENQKSAhPSAwICYmCisJCU5leHRMZXZlbFByb3RvY29sID09IFNLQ1NfUFJPVE9fSURfVENQKSB7CisJCS8qIFRDUC9JUCBmcmFtZS4gKi8KKwkJUHJvdG9jb2xGbGFncyAmPSBTS0NTX1BST1RPX1RDUCB8IFNLQ1NfUFJPVE9fSVA7CisJCU5leHRMZXZlbFByb3RvU3RhdHMgPQorCQkJJnBBYy0+Q3N1bS5Qcm90b1N0YXRzW05ldE51bWJlcl1bU0tDU19QUk9UT19TVEFUU19UQ1BdOworCX0KKwllbHNlIGlmICgoUHJvdG9jb2xGbGFncyAmIFNLQ1NfUFJPVE9fVURQKSAhPSAwICYmCisJCU5leHRMZXZlbFByb3RvY29sID09IFNLQ1NfUFJPVE9fSURfVURQKSB7CisJCS8qIFVEUC9JUCBmcmFtZS4gKi8KKwkJUHJvdG9jb2xGbGFncyAmPSBTS0NTX1BST1RPX1VEUCB8IFNLQ1NfUFJPVE9fSVA7CisJCU5leHRMZXZlbFByb3RvU3RhdHMgPQorCQkJJnBBYy0+Q3N1bS5Qcm90b1N0YXRzW05ldE51bWJlcl1bU0tDU19QUk9UT19TVEFUU19VRFBdOworCX0KKwllbHNlIHsKKwkJLyoKKwkJICogRWl0aGVyIG5vdCBhIFRDUCBvciBVRFAgZnJhbWUgYW5kL29yIFRDUC9VRFAgcHJvY2Vzc2luZyBub3QKKwkJICogc3BlY2lmaWVkLgorCQkgKi8KKwkJcFBhY2tldEluZm8tPlByb3RvY29sRmxhZ3MgPSBQcm90b2NvbEZsYWdzICYgU0tDU19QUk9UT19JUDsKKwkJcmV0dXJuOworCX0KKworCS8qIENoZWNrIGlmIHRoaXMgaXMgYW4gSVAgZnJhZ21lbnQuICovCisKKwkvKgorCSAqIE5vdGU6IEFuIElQIGZyYWdtZW50IGhhcyBhIG5vbi16ZXJvICJGcmFnbWVudCBPZmZzZXQiIGZpZWxkIGFuZC9vcgorCSAqIHRoZSAiTW9yZSBGcmFnbWVudHMiIGJpdCBzZXQuIFRodXMsIGlmIGJvdGggdGhlICJGcmFnbWVudCBPZmZzZXQiCisJICogYW5kIHRoZSAiTW9yZSBGcmFnbWVudHMiIGFyZSB6ZXJvLCBpdCBpcyAqbm90KiBhIGZyYWdtZW50LiBXZSBjYW4KKwkgKiBlYXNpbHkgY2hlY2sgYm90aCBhdCB0aGUgc2FtZSB0aW1lIHNpbmNlIHRoZXkgYXJlIGluIHRoZSBzYW1lIDE2LWJpdAorCSAqIHdvcmQuCisJICovCisKKwlpZiAoKCooU0tfVTE2ICopCisJCVNLQ1NfSURYKHBJcEhlYWRlciwgU0tDU19PRlNfSVBfRkxBR1NfQU5EX0ZSQUdNRU5UX09GRlNFVCkgJgorCQl+U0tDU19JUF9ET05UX0ZSQUdNRU5UKSAhPSAwKSB7CisJCS8qIElQIGZyYWdtZW50OyBpZ25vcmUgYWxsIG90aGVyIHByb3RvY29scy4gKi8KKwkJcFBhY2tldEluZm8tPlByb3RvY29sRmxhZ3MgPSBQcm90b2NvbEZsYWdzICYgU0tDU19QUk9UT19JUDsKKwkJTmV4dExldmVsUHJvdG9TdGF0cy0+VHhVbmFibGVDdHMrKzsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBUQ1AvVURQIHBzZXVkbyBoZWFkZXIgY2hlY2tzdW0uCisJICovCisKKwkvKiBHZXQgdG90YWwgbGVuZ3RoIG9mIElQIGhlYWRlciBhbmQgZGF0YS4gKi8KKworCUlwRGF0YUxlbmd0aCA9CisJCSooU0tfVTE2ICopIFNLQ1NfSURYKHBJcEhlYWRlciwgU0tDU19PRlNfSVBfVE9UQUxfTEVOR1RIKTsKKworCS8qIEdldCBsZW5ndGggb2YgSVAgZGF0YSBwb3J0aW9uLiAqLworCisJSXBEYXRhTGVuZ3RoID0gU0tDU19OVE9IMTYoSXBEYXRhTGVuZ3RoKSAtIElwSGVhZGVyTGVuZ3RoOworCisJLyogQ2FsY3VsYXRlIHRoZSBzdW0gb2YgYWxsIHBzZXVkbyBoZWFkZXIgZmllbGRzICgxNi1iaXQpLiAqLworCisJUHNldWRvSGVhZGVyQ2hlY2tzdW0gPQorCQkodW5zaWduZWQgbG9uZykgKihTS19VMTYgKikgU0tDU19JRFgocElwSGVhZGVyLAorCQkJU0tDU19PRlNfSVBfU09VUkNFX0FERFJFU1MgKyAwKSArCisJCSh1bnNpZ25lZCBsb25nKSAqKFNLX1UxNiAqKSBTS0NTX0lEWChwSXBIZWFkZXIsCisJCQlTS0NTX09GU19JUF9TT1VSQ0VfQUREUkVTUyArIDIpICsKKwkJKHVuc2lnbmVkIGxvbmcpICooU0tfVTE2ICopIFNLQ1NfSURYKHBJcEhlYWRlciwKKwkJCVNLQ1NfT0ZTX0lQX0RFU1RJTkFUSU9OX0FERFJFU1MgKyAwKSArCisJCSh1bnNpZ25lZCBsb25nKSAqKFNLX1UxNiAqKSBTS0NTX0lEWChwSXBIZWFkZXIsCisJCQlTS0NTX09GU19JUF9ERVNUSU5BVElPTl9BRERSRVNTICsgMikgKworCQkodW5zaWduZWQgbG9uZykgU0tDU19IVE9OMTYoTmV4dExldmVsUHJvdG9jb2wpICsKKwkJKHVuc2lnbmVkIGxvbmcpIFNLQ1NfSFRPTjE2KElwRGF0YUxlbmd0aCk7CisJCisJLyogQWRkLWluIGFueSBjYXJyaWVzLiAqLworCisJU0tDU19PQ19BREQoUHNldWRvSGVhZGVyQ2hlY2tzdW0sIFBzZXVkb0hlYWRlckNoZWNrc3VtLCAwKTsKKworCS8qIEFkZC1pbiBhbnkgbmV3IGNhcnJ5LiAqLworCisJU0tDU19PQ19BREQocFBhY2tldEluZm8tPlBzZXVkb0hlYWRlckNoZWNrc3VtLCBQc2V1ZG9IZWFkZXJDaGVja3N1bSwgMCk7CisKKwlwUGFja2V0SW5mby0+UHJvdG9jb2xGbGFncyA9IFByb3RvY29sRmxhZ3M7CisJTmV4dExldmVsUHJvdG9TdGF0cy0+VHhPa0N0cysrOwkvKiBTdWNjZXNzLiAqLworfQkvKiBTa0NzR2V0U2VuZEluZm8gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tDc0dldFJlY2VpdmVJbmZvIC0gdmVyaWZ5IGNoZWNrc3VtIGluZm9ybWF0aW9uIGZvciBhIHJlY2VpdmVkIHBhY2tldAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVmVyaWZ5IGEgcmVjZWl2ZWQgZnJhbWUncyBjaGVja3N1bS4gVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBzdGF0dXMgY29kZQorICoJcmVmbGVjdGluZyB0aGUgcmVzdWx0IG9mIHRoZSB2ZXJpZmljYXRpb24uCisgKgorICogTm90ZToKKyAqCUJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24geW91IGhhdmUgdG8gdmVyaWZ5IHRoYXQgdGhlIGZyYW1lIGlzCisgKglub3QgcGFkZGVkIGFuZCBDaGVja3N1bTEgYW5kIENoZWNrc3VtMiBhcmUgYmlnZ2VyIHRoYW4gMS4KKyAqCisgKiBBcmd1bWVudHM6CisgKglwQWMgLSBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCBzdHJ1Y3QuCisgKgorICoJcElwSGVhZGVyIC0gUG9pbnRlciB0byBJUCBoZWFkZXIuIE11c3QgYmUgYXQgbGVhc3QgdGhlIGxlbmd0aCBpbiBieXRlcworICoJb2YgdGhlIHJlY2VpdmVkIElQIGhlYWRlciBpbmNsdWRpbmcgYW55IG9wdGlvbiBmaWVsZHMuIEZvciBVRFAgcGFja2V0cywKKyAqCTggYWRkaXRpb25hbCBieXRlcyBhcmUgbmVlZGVkIHRvIGFjY2VzcyB0aGUgVURQIGNoZWNrc3VtLgorICoKKyAqCU5vdGU6IFRoZSBhY3R1YWwgbGVuZ3RoIG9mIHRoZSBJUCBoZWFkZXIgaXMgc3RvcmVkIGluIHRoZSBsb3dlciBmb3VyCisgKgliaXRzIG9mIHRoZSBmaXJzdCBvY3RldCBvZiB0aGUgSVAgaGVhZGVyIGFzIHRoZSBudW1iZXIgb2YgNC1ieXRlIHdvcmRzLAorICoJc28gaXQgbXVzdCBiZSBtdWx0aXBsaWVkIGJ5IGZvdXIgdG8gZ2V0IHRoZSBsZW5ndGggaW4gYnl0ZXMuIFRodXMsIHRoZQorICoJbWF4aW11bSBJUCBoZWFkZXIgbGVuZ3RoIGlzIDE1ICogNCA9IDYwIGJ5dGVzLgorICoKKyAqCUNoZWNrc3VtMSAtIFRoZSBmaXJzdCAxNi1iaXQgSW50ZXJuZXQgQ2hlY2tzdW0gY2FsY3VsYXRlZCBieSB0aGUKKyAqCWhhcmR3YXJlIHN0YXJ0aW5nIGF0IHRoZSBvZmZzZXQgcmV0dXJuZWQgYnkgU2tDc1NldFJlY2VpdmVGbGFncygpLgorICoKKyAqCUNoZWNrc3VtMiAtIFRoZSBzZWNvbmQgMTYtYml0IEludGVybmV0IENoZWNrc3VtIGNhbGN1bGF0ZWQgYnkgdGhlCisgKgloYXJkd2FyZSBzdGFydGluZyBhdCB0aGUgb2Zmc2V0IHJldHVybmVkIGJ5IFNrQ3NTZXRSZWNlaXZlRmxhZ3MoKS4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tDU19TVEFUVVNfVU5LTk9XTl9JUF9WRVJTSU9OIC0gTm90IGFuIElQIHY0IGZyYW1lLgorICoJU0tDU19TVEFUVVNfSVBfQ1NVTV9FUlJPUiAtIElQIGNoZWNrc3VtIGVycm9yLgorICoJU0tDU19TVEFUVVNfSVBfQ1NVTV9FUlJPUl9UQ1AgLSBJUCBjaGVja3N1bSBlcnJvciBpbiBUQ1AgZnJhbWUuCisgKglTS0NTX1NUQVRVU19JUF9DU1VNX0VSUk9SX1VEUCAtIElQIGNoZWNrc3VtIGVycm9yIGluIFVEUCBmcmFtZQorICoJU0tDU19TVEFUVVNfSVBfRlJBR01FTlQgLSBJUCBmcmFnbWVudCAoSVAgY2hlY2tzdW0gb2spLgorICoJU0tDU19TVEFUVVNfSVBfQ1NVTV9PSyAtIElQIGNoZWNrc3VtIG9rIChub3QgYSBUQ1Agb3IgVURQIGZyYW1lKS4KKyAqCVNLQ1NfU1RBVFVTX1RDUF9DU1VNX0VSUk9SIC0gVENQIGNoZWNrc3VtIGVycm9yIChJUCBjaGVja3N1bSBvaykuCisgKglTS0NTX1NUQVRVU19VRFBfQ1NVTV9FUlJPUiAtIFVEUCBjaGVja3N1bSBlcnJvciAoSVAgY2hlY2tzdW0gb2spLgorICoJU0tDU19TVEFUVVNfVENQX0NTVU1fT0sgLSBJUCBhbmQgVENQIGNoZWNrc3VtIG9rLgorICoJU0tDU19TVEFUVVNfVURQX0NTVU1fT0sgLSBJUCBhbmQgVURQIGNoZWNrc3VtIG9rLgorICoJU0tDU19TVEFUVVNfSVBfQ1NVTV9PS19OT19VRFAgLSBJUCBjaGVja3N1bSBPSyBhbmQgbm8gVURQIGNoZWNrc3VtLgorICoKKyAqCU5vdGU6IElmIFNLQ1NfT1ZFUldSSVRFX1NUQVRVUyBpcyBkZWZpbmVkLCB0aGUgU0tDU19TVEFUVVNfWFhYIHZhbHVlcworICoJcmV0dXJuZWQgaGVyZSBjYW4gYmUgZGVmaW5lZCBpbiBzb21lIGhlYWRlciBmaWxlIGJ5IHRoZSBtb2R1bGUgdXNpbmcgQ1NVTS4KKyAqCUluIHRoaXMgd2F5LCB0aGUgY2FsbGluZyBtb2R1bGUgY2FuIGFzc2lnbiByZXR1cm4gdmFsdWVzIGZvciBpdHMgb3duIG5lZWRzLAorICoJZS5nLiBieSBhc3NpZ25pbmcgYml0IGZsYWdzIHRvIHRoZSBpbmRpdmlkdWFsIHByb3RvY29scy4KKyAqLworU0tDU19TVEFUVVMgU2tDc0dldFJlY2VpdmVJbmZvKAorU0tfQUMJCSpwQWMsCQkvKiBBZGFwdGVyIGNvbnRleHQgc3RydWN0LiAqLwordm9pZAkJKnBJcEhlYWRlciwJLyogSVAgaGVhZGVyLiAqLwordW5zaWduZWQJQ2hlY2tzdW0xLAkvKiBIYXJkd2FyZSBjaGVja3N1bSAxLiAqLwordW5zaWduZWQJQ2hlY2tzdW0yLAkvKiBIYXJkd2FyZSBjaGVja3N1bSAyLiAqLworaW50CQkJTmV0TnVtYmVyKQkvKiBOZXQgbnVtYmVyICovCit7CisJLyogSW50ZXJuZXQgSGVhZGVyIFZlcnNpb24gZm91bmQgaW4gSVAgaGVhZGVyLiAqLworCXVuc2lnbmVkIEludGVybmV0SGVhZGVyVmVyc2lvbjsKKworCS8qIExlbmd0aCBvZiB0aGUgSVAgaGVhZGVyIGFzIGZvdW5kIGluIElQIGhlYWRlci4gKi8KKwl1bnNpZ25lZCBJcEhlYWRlckxlbmd0aDsKKworCS8qIExlbmd0aCBvZiBJUCBkYXRhIHBvcnRpb24uICovCisJdW5zaWduZWQgSXBEYXRhTGVuZ3RoOworCisJLyogSVAgaGVhZGVyIGNoZWNrc3VtLiAqLworCXVuc2lnbmVkIElwSGVhZGVyQ2hlY2tzdW07CisKKwkvKiBJUCBoZWFkZXIgb3B0aW9ucyBjaGVja3N1bSwgaWYgYW55LiAqLworCXVuc2lnbmVkIElwT3B0aW9uc0NoZWNrc3VtOworCisJLyogSVAgZGF0YSBjaGVja3N1bSwgaS5lLiBUQ1AvVURQIGNoZWNrc3VtLiAqLworCXVuc2lnbmVkIElwRGF0YUNoZWNrc3VtOworCisJLyogTmV4dCBsZXZlbCBwcm90b2NvbCBpZGVudGlmaWVyIGZvdW5kIGluIElQIGhlYWRlci4gKi8KKwl1bnNpZ25lZCBOZXh0TGV2ZWxQcm90b2NvbDsKKworCS8qIFRoZSBjaGVja3N1bSBvZiB0aGUgIm5leHQgbGV2ZWwgcHJvdG9jb2wiLCBpLmUuIFRDUCBvciBVRFAuICovCisJdW5zaWduZWQgbG9uZyBOZXh0TGV2ZWxQcm90b2NvbENoZWNrc3VtOworCisJLyogUG9pbnRlciB0byBuZXh0IGxldmVsIHByb3RvY29sIHN0YXRpc3RpY3Mgc3RydWN0dXJlLiAqLworCVNLQ1NfUFJPVE9fU1RBVFMgKk5leHRMZXZlbFByb3RvU3RhdHM7CisKKwkvKiBUZW1wb3JhcnkgdmFyaWFibGUuICovCisJdW5zaWduZWQgVG1wOworCisJVG1wID0gKihTS19VOCAqKQorCQlTS0NTX0lEWChwSXBIZWFkZXIsIFNLQ1NfT0ZTX0lQX0hFQURFUl9WRVJTSU9OX0FORF9MRU5HVEgpOworCisJLyogR2V0IHRoZSBJbnRlcm5ldCBIZWFkZXIgVmVyc2lvbiAoSUhWKS4gKi8KKwkvKiBOb3RlOiBUaGUgSUhWIGlzIHN0b3JlZCBpbiB0aGUgdXBwZXIgZm91ciBiaXRzLiAqLworCisJSW50ZXJuZXRIZWFkZXJWZXJzaW9uID0gVG1wID4+IDQ7CisKKwkvKiBDaGVjayB0aGUgSW50ZXJuZXQgSGVhZGVyIFZlcnNpb24uICovCisJLyogTm90ZTogV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBJUCB2ZXJzaW9uIDQuICovCisKKwlpZiAoSW50ZXJuZXRIZWFkZXJWZXJzaW9uICE9IDQpIHsJLyogSVB2ND8gKi8KKwkJU0tfREJHX01TRyhwQWMsIFNLX0RCR01PRF9DU1VNLCBTS19EQkdDQVRfRVJSIHwgU0tfREJHQ0FUX1JYLAorCQkJKCJSeDogVW5rbm93biBJbnRlcm5ldCBIZWFkZXIgVmVyc2lvbiAldS5cbiIsCisJCQlJbnRlcm5ldEhlYWRlclZlcnNpb24pKTsKKwkJcEFjLT5Dc3VtLlByb3RvU3RhdHNbTmV0TnVtYmVyXVtTS0NTX1BST1RPX1NUQVRTX0lQXS5SeFVuYWJsZUN0cysrOworCQlyZXR1cm4gKFNLQ1NfU1RBVFVTX1VOS05PV05fSVBfVkVSU0lPTik7CisJfQorCisJLyogR2V0IHRoZSBJUCBoZWFkZXIgbGVuZ3RoIChJSEwpLiAqLworCS8qCisJICogTm90ZTogVGhlIElITCBpcyBzdG9yZWQgaW4gdGhlIGxvd2VyIGZvdXIgYml0cyBhcyB0aGUgbnVtYmVyIG9mCisJICogNC1ieXRlIHdvcmRzLgorCSAqLworCisJSXBIZWFkZXJMZW5ndGggPSAoVG1wICYgMHhmKSAqIDQ7CisKKwkvKiBDaGVjayB0aGUgSVAgaGVhZGVyIGxlbmd0aC4gKi8KKworCS8qIDA0LUF1Zy0xOTk4IHN3IC0gUmVhbGx5IGNoZWNrIHRoZSBJSEw/IE5lY2Vzc2FyeT8gKi8KKworCWlmIChJcEhlYWRlckxlbmd0aCA8IDUqNCkgeworCQlTS19EQkdfTVNHKHBBYywgU0tfREJHTU9EX0NTVU0sIFNLX0RCR0NBVF9FUlIgfCBTS19EQkdDQVRfUlgsCisJCQkoIlJ4OiBJbnZhbGlkIElQIEhlYWRlciBMZW5ndGggJXUuXG4iLCBJcEhlYWRlckxlbmd0aCkpOworCQlwQWMtPkNzdW0uUHJvdG9TdGF0c1tOZXROdW1iZXJdW1NLQ1NfUFJPVE9fU1RBVFNfSVBdLlJ4RXJyQ3RzKys7CisJCXJldHVybiAoU0tDU19TVEFUVVNfSVBfQ1NVTV9FUlJPUik7CisJfQorCisJLyogVGhpcyBpcyBhbiBJUHY0IGZyYW1lIHdpdGggYSBoZWFkZXIgb2YgdmFsaWQgbGVuZ3RoLiAqLworCisJLyogR2V0IHRoZSBJUCBoZWFkZXIgYW5kIGRhdGEgY2hlY2tzdW0uICovCisKKwlJcERhdGFDaGVja3N1bSA9IENoZWNrc3VtMjsKKworCS8qCisJICogVGhlIElQIGhlYWRlciBjaGVja3N1bSBpcyBjYWxjdWxhdGVkIGFzIGZvbGxvd3M6CisJICoKKwkgKglJcEhlYWRlckNoZWNrc3VtID0gQ2hlY2tzdW0xIC0gQ2hlY2tzdW0yCisJICovCisKKwlTS0NTX09DX1NVQihJcEhlYWRlckNoZWNrc3VtLCBDaGVja3N1bTEsIENoZWNrc3VtMik7CisKKwkvKiBDaGVjayBpZiBhbnkgSVAgaGVhZGVyIG9wdGlvbnMuICovCisKKwlpZiAoSXBIZWFkZXJMZW5ndGggPiBTS0NTX0lQX0hFQURFUl9TSVpFKSB7CisKKwkJLyogR2V0IHRoZSBJUCBvcHRpb25zIGNoZWNrc3VtLiAqLworCisJCUlwT3B0aW9uc0NoZWNrc3VtID0gU2tDc0NhbGN1bGF0ZUNoZWNrc3VtKAorCQkJU0tDU19JRFgocElwSGVhZGVyLCBTS0NTX0lQX0hFQURFUl9TSVpFKSwKKwkJCUlwSGVhZGVyTGVuZ3RoIC0gU0tDU19JUF9IRUFERVJfU0laRSk7CisKKwkJLyogQWRqdXN0IHRoZSBJUCBoZWFkZXIgYW5kIElQIGRhdGEgY2hlY2tzdW1zLiAqLworCisJCVNLQ1NfT0NfQUREKElwSGVhZGVyQ2hlY2tzdW0sIElwSGVhZGVyQ2hlY2tzdW0sIElwT3B0aW9uc0NoZWNrc3VtKTsKKworCQlTS0NTX09DX1NVQihJcERhdGFDaGVja3N1bSwgSXBEYXRhQ2hlY2tzdW0sIElwT3B0aW9uc0NoZWNrc3VtKTsKKwl9CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBJUCBoZWFkZXIgY2hlY2tzdW0gaXMgb2suCisJICoKKwkgKiBOT1RFOiBXZSBtdXN0IGNoZWNrIHRoZSBJUCBoZWFkZXIgY2hlY2tzdW0gZXZlbiBpZiB0aGUgY2FsbGVyIGp1c3Qgd2FudHMKKwkgKiB1cyB0byBjaGVjayB1cHBlci1sYXllciBjaGVja3N1bXMsIGJlY2F1c2Ugd2UgY2Fubm90IGRvIGFueSBmdXJ0aGVyCisJICogcHJvY2Vzc2luZyBvZiB0aGUgcGFja2V0IHdpdGhvdXQgYSB2YWxpZCBJUCBjaGVja3N1bS4KKwkgKi8KKwkKKwkvKiBHZXQgdGhlIG5leHQgbGV2ZWwgcHJvdG9jb2wgaWRlbnRpZmllci4gKi8KKwkKKwlOZXh0TGV2ZWxQcm90b2NvbCA9ICooU0tfVTggKikKKwkJU0tDU19JRFgocElwSGVhZGVyLCBTS0NTX09GU19JUF9ORVhUX0xFVkVMX1BST1RPQ09MKTsKKworCWlmIChJcEhlYWRlckNoZWNrc3VtICE9IDB4ZmZmZikgeworCQlwQWMtPkNzdW0uUHJvdG9TdGF0c1tOZXROdW1iZXJdW1NLQ1NfUFJPVE9fU1RBVFNfSVBdLlJ4RXJyQ3RzKys7CisJCS8qIHRoZSBORElTIHRlc3RlciB3YW50cyB0byBrbm93IHRoZSB1cHBlciBsZXZlbCBwcm90b2NvbCB0b28gKi8KKwkJaWYgKE5leHRMZXZlbFByb3RvY29sID09IFNLQ1NfUFJPVE9fSURfVENQKSB7CisJCQlyZXR1cm4oU0tDU19TVEFUVVNfSVBfQ1NVTV9FUlJPUl9UQ1ApOworCQl9CisJCWVsc2UgaWYgKE5leHRMZXZlbFByb3RvY29sID09IFNLQ1NfUFJPVE9fSURfVURQKSB7CisJCQlyZXR1cm4oU0tDU19TVEFUVVNfSVBfQ1NVTV9FUlJPUl9VRFApOworCQl9CisJCXJldHVybiAoU0tDU19TVEFUVVNfSVBfQ1NVTV9FUlJPUik7CisJfQorCisJLyoKKwkgKiBDaGVjayBpZiB0aGlzIGlzIGEgVENQIG9yIFVEUCBmcmFtZSBhbmQgaWYgd2Ugc2hvdWxkIGNhbGN1bGF0ZSB0aGUKKwkgKiBUQ1AvVURQIHBzZXVkbyBoZWFkZXIgY2hlY2tzdW0uCisJICoKKwkgKiBBbHNvIGNsZWFyIGFsbCBwcm90b2NvbCBiaXQgZmxhZ3Mgb2YgcHJvdG9jb2xzIG5vdCBwcmVzZW50IGluIHRoZQorCSAqIGZyYW1lLgorCSAqLworCisJaWYgKChwQWMtPkNzdW0uUmVjZWl2ZUZsYWdzW05ldE51bWJlcl0gJiBTS0NTX1BST1RPX1RDUCkgIT0gMCAmJgorCQlOZXh0TGV2ZWxQcm90b2NvbCA9PSBTS0NTX1BST1RPX0lEX1RDUCkgeworCQkvKiBUQ1AvSVAgZnJhbWUuICovCisJCU5leHRMZXZlbFByb3RvU3RhdHMgPQorCQkJJnBBYy0+Q3N1bS5Qcm90b1N0YXRzW05ldE51bWJlcl1bU0tDU19QUk9UT19TVEFUU19UQ1BdOworCX0KKwllbHNlIGlmICgocEFjLT5Dc3VtLlJlY2VpdmVGbGFnc1tOZXROdW1iZXJdICYgU0tDU19QUk9UT19VRFApICE9IDAgJiYKKwkJTmV4dExldmVsUHJvdG9jb2wgPT0gU0tDU19QUk9UT19JRF9VRFApIHsKKwkJLyogVURQL0lQIGZyYW1lLiAqLworCQlOZXh0TGV2ZWxQcm90b1N0YXRzID0KKwkJCSZwQWMtPkNzdW0uUHJvdG9TdGF0c1tOZXROdW1iZXJdW1NLQ1NfUFJPVE9fU1RBVFNfVURQXTsKKwl9CisJZWxzZSB7CisJCS8qCisJCSAqIEVpdGhlciBub3QgYSBUQ1Agb3IgVURQIGZyYW1lIGFuZC9vciBUQ1AvVURQIHByb2Nlc3Npbmcgbm90CisJCSAqIHNwZWNpZmllZC4KKwkJICovCisJCXJldHVybiAoU0tDU19TVEFUVVNfSVBfQ1NVTV9PSyk7CisJfQorCisJLyogQ2hlY2sgaWYgdGhpcyBpcyBhbiBJUCBmcmFnbWVudC4gKi8KKworCS8qCisJICogTm90ZTogQW4gSVAgZnJhZ21lbnQgaGFzIGEgbm9uLXplcm8gIkZyYWdtZW50IE9mZnNldCIgZmllbGQgYW5kL29yCisJICogdGhlICJNb3JlIEZyYWdtZW50cyIgYml0IHNldC4gVGh1cywgaWYgYm90aCB0aGUgIkZyYWdtZW50IE9mZnNldCIKKwkgKiBhbmQgdGhlICJNb3JlIEZyYWdtZW50cyIgYXJlIHplcm8sIGl0IGlzICpub3QqIGEgZnJhZ21lbnQuIFdlIGNhbgorCSAqIGVhc2lseSBjaGVjayBib3RoIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgdGhleSBhcmUgaW4gdGhlIHNhbWUgMTYtYml0CisJICogd29yZC4KKwkgKi8KKworCWlmICgoKihTS19VMTYgKikKKwkJU0tDU19JRFgocElwSGVhZGVyLCBTS0NTX09GU19JUF9GTEFHU19BTkRfRlJBR01FTlRfT0ZGU0VUKSAmCisJCX5TS0NTX0lQX0RPTlRfRlJBR01FTlQpICE9IDApIHsKKwkJLyogSVAgZnJhZ21lbnQ7IGlnbm9yZSBhbGwgb3RoZXIgcHJvdG9jb2xzLiAqLworCQlOZXh0TGV2ZWxQcm90b1N0YXRzLT5SeFVuYWJsZUN0cysrOworCQlyZXR1cm4gKFNLQ1NfU1RBVFVTX0lQX0ZSQUdNRU5UKTsKKwl9CisKKwkvKgorCSAqIDA4LU1heS0yMDAwIHJhCisJICoKKwkgKiBGcm9tIFJGQyA3NjggKFVEUCkKKwkgKiBJZiB0aGUgY29tcHV0ZWQgY2hlY2tzdW0gaXMgemVybywgaXQgaXMgdHJhbnNtaXR0ZWQgYXMgYWxsIG9uZXMgKHRoZQorCSAqIGVxdWl2YWxlbnQgaW4gb25lJ3MgY29tcGxlbWVudCBhcml0aG1ldGljKS4gIEFuIGFsbCB6ZXJvIHRyYW5zbWl0dGVkCisJICogY2hlY2tzdW0gdmFsdWUgbWVhbnMgdGhhdCB0aGUgdHJhbnNtaXR0ZXIgZ2VuZXJhdGVkIG5vIGNoZWNrc3VtIChmb3IKKwkgKiBkZWJ1Z2dpbmcgb3IgZm9yIGhpZ2hlciBsZXZlbCBwcm90b2NvbHMgdGhhdCBkb24ndCBjYXJlKS4KKwkgKi8KKworCWlmIChOZXh0TGV2ZWxQcm90b2NvbCA9PSBTS0NTX1BST1RPX0lEX1VEUCAmJgorCQkqKFNLX1UxNiopU0tDU19JRFgocElwSGVhZGVyLCBJcEhlYWRlckxlbmd0aCArIDYpID09IDB4MDAwMCkgeworCisJCU5leHRMZXZlbFByb3RvU3RhdHMtPlJ4T2tDdHMrKzsKKwkJCisJCXJldHVybiAoU0tDU19TVEFUVVNfSVBfQ1NVTV9PS19OT19VRFApOworCX0KKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBUQ1AvVURQIGNoZWNrc3VtLgorCSAqLworCisJLyogR2V0IHRvdGFsIGxlbmd0aCBvZiBJUCBoZWFkZXIgYW5kIGRhdGEuICovCisKKwlJcERhdGFMZW5ndGggPQorCQkqKFNLX1UxNiAqKSBTS0NTX0lEWChwSXBIZWFkZXIsIFNLQ1NfT0ZTX0lQX1RPVEFMX0xFTkdUSCk7CisKKwkvKiBHZXQgbGVuZ3RoIG9mIElQIGRhdGEgcG9ydGlvbi4gKi8KKworCUlwRGF0YUxlbmd0aCA9IFNLQ1NfTlRPSDE2KElwRGF0YUxlbmd0aCkgLSBJcEhlYWRlckxlbmd0aDsKKworCU5leHRMZXZlbFByb3RvY29sQ2hlY2tzdW0gPQorCisJCS8qIENhbGN1bGF0ZSB0aGUgcHNldWRvIGhlYWRlciBjaGVja3N1bS4gKi8KKworCQkodW5zaWduZWQgbG9uZykgKihTS19VMTYgKikgU0tDU19JRFgocElwSGVhZGVyLAorCQkJU0tDU19PRlNfSVBfU09VUkNFX0FERFJFU1MgKyAwKSArCisJCSh1bnNpZ25lZCBsb25nKSAqKFNLX1UxNiAqKSBTS0NTX0lEWChwSXBIZWFkZXIsCisJCQlTS0NTX09GU19JUF9TT1VSQ0VfQUREUkVTUyArIDIpICsKKwkJKHVuc2lnbmVkIGxvbmcpICooU0tfVTE2ICopIFNLQ1NfSURYKHBJcEhlYWRlciwKKwkJCVNLQ1NfT0ZTX0lQX0RFU1RJTkFUSU9OX0FERFJFU1MgKyAwKSArCisJCSh1bnNpZ25lZCBsb25nKSAqKFNLX1UxNiAqKSBTS0NTX0lEWChwSXBIZWFkZXIsCisJCQlTS0NTX09GU19JUF9ERVNUSU5BVElPTl9BRERSRVNTICsgMikgKworCQkodW5zaWduZWQgbG9uZykgU0tDU19IVE9OMTYoTmV4dExldmVsUHJvdG9jb2wpICsKKwkJKHVuc2lnbmVkIGxvbmcpIFNLQ1NfSFRPTjE2KElwRGF0YUxlbmd0aCkgKworCisJCS8qIEFkZCB0aGUgVENQL1VEUCBoZWFkZXIgY2hlY2tzdW0uICovCisKKwkJKHVuc2lnbmVkIGxvbmcpIElwRGF0YUNoZWNrc3VtOworCisJLyogQWRkLWluIGFueSBjYXJyaWVzLiAqLworCisJU0tDU19PQ19BREQoTmV4dExldmVsUHJvdG9jb2xDaGVja3N1bSwgTmV4dExldmVsUHJvdG9jb2xDaGVja3N1bSwgMCk7CisKKwkvKiBBZGQtaW4gYW55IG5ldyBjYXJyeS4gKi8KKworCVNLQ1NfT0NfQUREKE5leHRMZXZlbFByb3RvY29sQ2hlY2tzdW0sIE5leHRMZXZlbFByb3RvY29sQ2hlY2tzdW0sIDApOworCisJLyogQ2hlY2sgaWYgdGhlIFRDUC9VRFAgY2hlY2tzdW0gaXMgb2suICovCisKKwlpZiAoKHVuc2lnbmVkKSBOZXh0TGV2ZWxQcm90b2NvbENoZWNrc3VtID09IDB4ZmZmZikgeworCisJCS8qIFRDUC9VRFAgY2hlY2tzdW0gb2suICovCisKKwkJTmV4dExldmVsUHJvdG9TdGF0cy0+UnhPa0N0cysrOworCisJCXJldHVybiAoTmV4dExldmVsUHJvdG9jb2wgPT0gU0tDU19QUk9UT19JRF9UQ1AgPworCQkJU0tDU19TVEFUVVNfVENQX0NTVU1fT0sgOiBTS0NTX1NUQVRVU19VRFBfQ1NVTV9PSyk7CisJfQorCQorCS8qIFRDUC9VRFAgY2hlY2tzdW0gZXJyb3IuICovCisKKwlOZXh0TGV2ZWxQcm90b1N0YXRzLT5SeEVyckN0cysrOworCisJcmV0dXJuIChOZXh0TGV2ZWxQcm90b2NvbCA9PSBTS0NTX1BST1RPX0lEX1RDUCA/CisJCVNLQ1NfU1RBVFVTX1RDUF9DU1VNX0VSUk9SIDogU0tDU19TVEFUVVNfVURQX0NTVU1fRVJST1IpOworfQkvKiBTa0NzR2V0UmVjZWl2ZUluZm8gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tDc1NldFJlY2VpdmVGbGFncyAtIHNldCBjaGVja3N1bSByZWNlaXZlIGZsYWdzCisgKgorICogRGVzY3JpcHRpb246CisgKglVc2UgdGhpcyBmdW5jdGlvbiB0byBzZXQgdGhlIHZhcmlvdXMgcmVjZWl2ZSBmbGFncy4gQWNjb3JkaW5nIHRvIHRoZQorICoJcHJvdG9jb2wgZmxhZ3Mgc2V0IGJ5IHRoZSBjYWxsZXIsIHRoZSBzdGFydCBvZmZzZXRzIHdpdGhpbiByZWNlaXZlZAorICoJcGFja2V0cyBvZiB0aGUgdHdvIGhhcmR3YXJlIGNoZWNrc3VtcyBhcmUgcmV0dXJuZWQuIFRoZXNlIG9mZnNldHMgbXVzdAorICoJYmUgc3RvcmVkIGluIGFsbCByZWNlaXZlIGRlc2NyaXB0b3JzLgorICoKKyAqIEFyZ3VtZW50czoKKyAqCXBBYyAtIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0IHN0cnVjdC4KKyAqCisgKglSZWNlaXZlRmxhZ3MgLSBBbnkgY29tYmluYXRpb24gb2YgU0tfUFJPVE9fWFhYIGZsYWdzIG9mIHRoZSBwcm90b2NvbHMKKyAqCWZvciB3aGljaCB0aGUgY2FsbGVyIHdhbnRzIGNoZWNrc3VtIGluZm9ybWF0aW9uIG9uIHJlY2VpdmVkIGZyYW1lcy4KKyAqCisgKglwQ2hlY2tzdW0xT2Zmc2V0IC0gVGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgZmlyc3QgcmVjZWl2ZSBkZXNjcmlwdG9yCisgKgloYXJkd2FyZSBjaGVja3N1bSB0byBiZSBjYWxjdWxhdGVkIGZvciByZWNlaXZlZCBmcmFtZXMgaXMgcmV0dXJuZWQKKyAqCWhlcmUuCisgKgorICoJcENoZWNrc3VtMk9mZnNldCAtIFRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIHNlY29uZCByZWNlaXZlIGRlc2NyaXB0b3IKKyAqCWhhcmR3YXJlIGNoZWNrc3VtIHRvIGJlIGNhbGN1bGF0ZWQgZm9yIHJlY2VpdmVkIGZyYW1lcyBpcyByZXR1cm5lZAorICoJaGVyZS4KKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqCVJldHVybnMgdGhlIHR3byBoYXJkd2FyZSBjaGVja3N1bSBzdGFydCBvZmZzZXRzLgorICovCit2b2lkIFNrQ3NTZXRSZWNlaXZlRmxhZ3MoCitTS19BQwkJKnBBYywJCQkJLyogQWRhcHRlciBjb250ZXh0IHN0cnVjdC4gKi8KK3Vuc2lnbmVkCVJlY2VpdmVGbGFncywJCS8qIE5ldyByZWNlaXZlIGZsYWdzLiAqLwordW5zaWduZWQJKnBDaGVja3N1bTFPZmZzZXQsCS8qIE9mZnNldCBmb3IgaGFyZHdhcmUgY2hlY2tzdW0gMS4gKi8KK3Vuc2lnbmVkCSpwQ2hlY2tzdW0yT2Zmc2V0LAkvKiBPZmZzZXQgZm9yIGhhcmR3YXJlIGNoZWNrc3VtIDIuICovCitpbnQJCQlOZXROdW1iZXIpCit7CisJLyogU2F2ZSB0aGUgcmVjZWl2ZSBmbGFncy4gKi8KKworCXBBYy0+Q3N1bS5SZWNlaXZlRmxhZ3NbTmV0TnVtYmVyXSA9IFJlY2VpdmVGbGFnczsKKworCS8qIEZpcnN0IGNoZWNrc3VtIHN0YXJ0IG9mZnNldCBpcyB0aGUgSVAgaGVhZGVyLiAqLworCSpwQ2hlY2tzdW0xT2Zmc2V0ID0gU0tDU19NQUNfSEVBREVSX1NJWkU7CisKKwkvKgorCSAqIFNlY29uZCBjaGVja3N1bSBzdGFydCBvZmZzZXQgaXMgdGhlIElQIGRhdGEuIE5vdGUgdGhhdCB0aGlzIG1heSB2YXJ5CisJICogaWYgdGhlcmUgYXJlIGFueSBJUCBoZWFkZXIgb3B0aW9ucyBpbiB0aGUgYWN0dWFsIHBhY2tldC4KKwkgKi8KKwkqcENoZWNrc3VtMk9mZnNldCA9IFNLQ1NfTUFDX0hFQURFUl9TSVpFICsgU0tDU19JUF9IRUFERVJfU0laRTsKK30JLyogU2tDc1NldFJlY2VpdmVGbGFncyAqLworCisjaWZuZGVmIFNLX0NTX0NBTENVTEFURV9DSEVDS1NVTQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tDc0NhbGN1bGF0ZUNoZWNrc3VtIC0gY2FsY3VsYXRlIGNoZWNrc3VtIGZvciBzcGVjaWZpZWQgZGF0YQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJQ2FsY3VsYXRlIGFuZCByZXR1cm4gdGhlIDE2LWJpdCBJbnRlcm5ldCBDaGVja3N1bSBmb3IgdGhlIHNwZWNpZmllZAorICoJZGF0YS4KKyAqCisgKiBBcmd1bWVudHM6CisgKglwRGF0YSAtIFBvaW50ZXIgdG8gZGF0YSBmb3Igd2hpY2ggdGhlIGNoZWNrc3VtIHNoYWxsIGJlIGNhbGN1bGF0ZWQuCisgKglOb3RlOiBUaGUgcG9pbnRlciBzaG91bGQgYmUgYWxpZ25lZCBvbiBhIDE2LWJpdCBib3VuZGFyeS4KKyAqCisgKglMZW5ndGggLSBMZW5ndGggaW4gYnl0ZXMgb2YgZGF0YSB0byBjaGVja3N1bS4KKyAqCisgKiBSZXR1cm5zOgorICoJVGhlIDE2LWJpdCBJbnRlcm5ldCBDaGVja3N1bSBmb3IgdGhlIHNwZWNpZmllZCBkYXRhLgorICoKKyAqCU5vdGU6IFRoZSBjaGVja3N1bSBpcyBjYWxjdWxhdGVkIGluIHRoZSBtYWNoaW5lJ3MgbmF0dXJhbCBieXRlIG9yZGVyLAorICoJaS5lLiBsaXR0bGUgdnMuIGJpZyBlbmRpYW4uIFRodXMsIHRoZSByZXN1bHRpbmcgY2hlY2tzdW0gaXMgZGlmZmVyZW50CisgKglmb3IgdGhlIHNhbWUgaW5wdXQgZGF0YSBvbiBsaXR0bGUgYW5kIGJpZyBlbmRpYW4gbWFjaGluZXMuCisgKgorICoJSG93ZXZlciwgd2hlbiB3cml0dGVuIGJhY2sgdG8gdGhlIG5ldHdvcmsgcGFja2V0LCB0aGUgYnl0ZSBvcmRlciBpcworICoJYWx3YXlzIGluIGNvcnJlY3QgbmV0d29yayBvcmRlci4KKyAqLwordW5zaWduZWQgU2tDc0NhbGN1bGF0ZUNoZWNrc3VtKAordm9pZAkJKnBEYXRhLAkJLyogRGF0YSB0byBjaGVja3N1bS4gKi8KK3Vuc2lnbmVkCUxlbmd0aCkJCS8qIExlbmd0aCBvZiBkYXRhLiAqLworeworCVNLX1UxNiAqcFUxNjsJCS8qIFBvaW50ZXIgdG8gdGhlIGRhdGEgYXMgMTYtYml0IHdvcmRzLiAqLworCXVuc2lnbmVkIGxvbmcgQ2hlY2tzdW07CS8qIENoZWNrc3VtOyBtdXN0IGJlIGF0IGxlYXN0IDMyIGJpdHMuICovCisKKwkvKiBTdW0gdXAgYWxsIDE2LWJpdCB3b3Jkcy4gKi8KKworCXBVMTYgPSAoU0tfVTE2ICopIHBEYXRhOworCWZvciAoQ2hlY2tzdW0gPSAwOyBMZW5ndGggPiAxOyBMZW5ndGggLT0gMikgeworCQlDaGVja3N1bSArPSAqcFUxNisrOworCX0KKworCS8qIElmIHRoaXMgaXMgYW4gb2RkIG51bWJlciBvZiBieXRlcywgYWRkLWluIHRoZSBsYXN0IGJ5dGUuICovCisKKwlpZiAoTGVuZ3RoID4gMCkgeworI2lmZGVmIFNLX0JJR19FTkRJQU4KKwkJLyogQWRkIHRoZSBsYXN0IGJ5dGUgYXMgdGhlIGhpZ2ggYnl0ZS4gKi8KKwkJQ2hlY2tzdW0gKz0gKCh1bnNpZ25lZCkgKihTS19VOCAqKSBwVTE2KSA8PCA4OworI2Vsc2UJLyogIVNLX0JJR19FTkRJQU4gKi8KKwkJLyogQWRkIHRoZSBsYXN0IGJ5dGUgYXMgdGhlIGxvdyBieXRlLiAqLworCQlDaGVja3N1bSArPSAqKFNLX1U4ICopIHBVMTY7CisjZW5kaWYJLyogIVNLX0JJR19FTkRJQU4gKi8KKwl9CisKKwkvKiBBZGQtaW4gYW55IGNhcnJpZXMuICovCisKKwlTS0NTX09DX0FERChDaGVja3N1bSwgQ2hlY2tzdW0sIDApOworCisJLyogQWRkLWluIGFueSBuZXcgY2FycnkuICovCisKKwlTS0NTX09DX0FERChDaGVja3N1bSwgQ2hlY2tzdW0sIDApOworCisJLyogTm90ZTogQWxsIGJpdHMgYmV5b25kIHRoZSAxNi1iaXQgbGltaXQgYXJlIG5vdyB6ZXJvLiAqLworCisJcmV0dXJuICgodW5zaWduZWQpIENoZWNrc3VtKTsKK30JLyogU2tDc0NhbGN1bGF0ZUNoZWNrc3VtICovCisKKyNlbmRpZiAvKiBTS19DU19DQUxDVUxBVEVfQ0hFQ0tTVU0gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrQ3NFdmVudCAtIHRoZSBDU1VNIGV2ZW50IGRpc3BhdGNoZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgaXMgdGhlIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBDU1VNIG1vZHVsZS4KKyAqCisgKiBBcmd1bWVudHM6CisgKglwQWMgLSBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dC4KKyAqCisgKglJb2MgLSBJL08gY29udGV4dC4KKyAqCisgKglFdmVudCAtCSBFdmVudCBpZC4KKyAqCisgKglQYXJhbSAtIEV2ZW50IGRlcGVuZGVudCBwYXJhbWV0ZXIuCisgKgorICogUmV0dXJuczoKKyAqCVRoZSAxNi1iaXQgSW50ZXJuZXQgQ2hlY2tzdW0gZm9yIHRoZSBzcGVjaWZpZWQgZGF0YS4KKyAqCisgKglOb3RlOiBUaGUgY2hlY2tzdW0gaXMgY2FsY3VsYXRlZCBpbiB0aGUgbWFjaGluZSdzIG5hdHVyYWwgYnl0ZSBvcmRlciwKKyAqCWkuZS4gbGl0dGxlIHZzLiBiaWcgZW5kaWFuLiBUaHVzLCB0aGUgcmVzdWx0aW5nIGNoZWNrc3VtIGlzIGRpZmZlcmVudAorICoJZm9yIHRoZSBzYW1lIGlucHV0IGRhdGEgb24gbGl0dGxlIGFuZCBiaWcgZW5kaWFuIG1hY2hpbmVzLgorICoKKyAqCUhvd2V2ZXIsIHdoZW4gd3JpdHRlbiBiYWNrIHRvIHRoZSBuZXR3b3JrIHBhY2tldCwgdGhlIGJ5dGUgb3JkZXIgaXMKKyAqCWFsd2F5cyBpbiBjb3JyZWN0IG5ldHdvcmsgb3JkZXIuCisgKi8KK2ludCBTa0NzRXZlbnQoCitTS19BQwkJKnBBYywJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQuICovCitTS19JT0MJCUlvYywJLyogSS9PIGNvbnRleHQuICovCitTS19VMzIJCUV2ZW50LAkvKiBFdmVudCBpZC4gKi8KK1NLX0VWUEFSQQlQYXJhbSkJLyogRXZlbnQgZGVwZW5kZW50IHBhcmFtZXRlci4gKi8KK3sKKwlpbnQgUHJvdG9JbmRleDsKKwlpbnQJTmV0TnVtYmVyOworCisJc3dpdGNoIChFdmVudCkgeworCS8qCisJICogQ2xlYXIgcHJvdG9jb2wgc3RhdGlzdGljcy4KKwkgKgorCSAqIFBhcmFtIC0gUHJvdG9jb2wgaW5kZXgsIG9yIC0xIGZvciBhbGwgcHJvdG9jb2xzLgorCSAqCQkgLSBOZXQgbnVtYmVyLgorCSAqLworCWNhc2UgU0tfQ1NVTV9FVkVOVF9DTEVBUl9QUk9UT19TVEFUUzoKKworCQlQcm90b0luZGV4ID0gKGludClQYXJhbS5QYXJhMzJbMV07CisJCU5ldE51bWJlciA9IChpbnQpUGFyYW0uUGFyYTMyWzBdOworCQlpZiAoUHJvdG9JbmRleCA8IDApIHsJLyogQ2xlYXIgZm9yIGFsbCBwcm90b2NvbHMuICovCisJCQlpZiAoTmV0TnVtYmVyID49IDApIHsKKwkJCQlTS19NRU1TRVQoJnBBYy0+Q3N1bS5Qcm90b1N0YXRzW05ldE51bWJlcl1bMF0sIDAsCisJCQkJCXNpemVvZihwQWMtPkNzdW0uUHJvdG9TdGF0c1tOZXROdW1iZXJdKSk7CisJCQl9CisJCX0KKwkJZWxzZSB7CQkJCQkvKiBDbGVhciBmb3IgaW5kaXZpZHVhbCBwcm90b2NvbC4gKi8KKwkJCVNLX01FTVNFVCgmcEFjLT5Dc3VtLlByb3RvU3RhdHNbTmV0TnVtYmVyXVtQcm90b0luZGV4XSwgMCwKKwkJCQlzaXplb2YocEFjLT5Dc3VtLlByb3RvU3RhdHNbTmV0TnVtYmVyXVtQcm90b0luZGV4XSkpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gKDApOwkvKiBTdWNjZXNzLiAqLworfQkvKiBTa0NzRXZlbnQgKi8KKworI2VuZGlmCS8qIFNLX1VTRV9DU1VNICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL3NrZGltLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZGltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkZGY2MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tkaW0uYwpAQCAtMCwwICsxLDc0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrZGltLmMKKyAqIFByb2plY3Q6CUdFbmVzaXMsIFBDSSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS41ICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzExLzI4IDEyOjU1OjQwICQKKyAqIFB1cnBvc2U6CUFsbCBmdW5jdGlvbnMgdG8gbWFpbnRhaW4gaW50ZXJydXB0IG1vZGVyYXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogVGhpcyBtb2R1bGUgaXMgaW50ZW5kZWQgdG8gbWFuYWdlIHRoZSBkeW5hbWljIGludGVycnVwdCBtb2RlcmF0aW9uIG9uIGJvdGggICAKKyAqIEdFbmVzaXMgYW5kIFl1a29uIGFkYXB0ZXJzLgorICoKKyAqIEluY2x1ZGUgRmlsZSBIaWVyYXJjaHk6CisgKgorICoJInNrZHJ2MXN0LmgiCisgKgkic2tkcnYybmQuaCIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCWxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIFN5c0tvbm5lY3RGaWxlSWRbXSA9CisJIkAoIykgJElkOiBza2RpbS5jLHYgMS41IDIwMDMvMTEvMjggMTI6NTU6NDAgcnJvZXNsZXIgRXhwICQgKEMpIFN5c0tvbm5lY3QuIjsKKyNlbmRpZgorCisjZGVmaW5lIF9fU0tBRERSX0MKKworI2lmZGVmIF9fY3BsdXNwbHVzCisjZXJyb3IgQysrIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLgorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBJbmNsdWRlcworKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19JTkNfU0tEUlYxU1RfSAorI2luY2x1ZGUgImgvc2tkcnYxc3QuaCIKKyNlbmRpZgorCisjaWZuZGVmIF9fSU5DX1NLRFJWMk5EX0gKKyNpbmNsdWRlICJoL3NrZHJ2Mm5kLmgiCisjZW5kaWYKKworI2luY2x1ZGUJPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogRGVmaW5lcworKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogVHlwZWRlZnMKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMgCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBHZXRDdXJyZW50U3lzdGVtTG9hZChTS19BQyAqcEFDKTsKK3N0YXRpYyBTS19VNjQgICAgICAgR2V0SXNyQ2FsbHMoU0tfQUMgKnBBQyk7CitzdGF0aWMgU0tfQk9PTCAgICAgIElzSW50TW9kRW5hYmxlZChTS19BQyAqcEFDKTsKK3N0YXRpYyB2b2lkICAgICAgICAgU2V0Q3VyckludEN0cihTS19BQyAqcEFDKTsKK3N0YXRpYyB2b2lkICAgICAgICAgRW5hYmxlSW50TW9kKFNLX0FDICpwQUMpOyAKK3N0YXRpYyB2b2lkICAgICAgICAgRGlzYWJsZUludE1vZChTS19BQyAqcEFDKTsKK3N0YXRpYyB2b2lkICAgICAgICAgUmVzaXplRGltVGltZXJEdXJhdGlvbihTS19BQyAqcEFDKTsKK3N0YXRpYyB2b2lkICAgICAgICAgRGlzcGxheVNlbGVjdGVkTW9kZXJhdGlvblR5cGUoU0tfQUMgKnBBQyk7CitzdGF0aWMgdm9pZCAgICAgICAgIERpc3BsYXlTZWxlY3RlZE1vZGVyYXRpb25NYXNrKFNLX0FDICpwQUMpOworc3RhdGljIHZvaWQgICAgICAgICBEaXNwbGF5RGVzY3JSYXRpbyhTS19BQyAqcEFDKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBHbG9iYWwgdmFyaWFibGVzCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiBMb2NhbCB2YXJpYWJsZXMKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEdsb2JhbCBmdW5jdGlvbnMgCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEZ1bmN0aW9uICAgICA6IFNrRGltTW9kZXJhdGUKKyoqIERlc2NyaXB0aW9uICA6IENhbGxlZCBpbiBldmVyeSBJU1IgdG8gY2hlY2sgaWYgbW9kZXJhdGlvbiBpcyB0byBiZSBhcHBsaWVkCisqKiAgICAgICAgICAgICAgICBvciBub3QgZm9yIHRoZSBjdXJyZW50IG51bWJlciBvZiBpbnRlcnJ1cHRzCisqKiBQcm9ncmFtbWVyICAgOiBSYWxwaCBSb2VzbGVyCisqKiBMYXN0IE1vZGlmaWVkOiAyMi1tYXItMDMKKyoqIFJldHVybnMgICAgICA6IHZvaWQgKCEpCisqKiBOb3RlcyAgICAgICAgOiAtCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIAorU2tEaW1Nb2RlcmF0ZShTS19BQyAqcEFDKSB7CisgICAgdW5zaWduZWQgaW50IEN1cnJTeXNMb2FkICAgID0gMDsgIC8qIGV4cHJlc3NlZCBpbiBwZXJjZW50ICovCisgICAgdW5zaWduZWQgaW50IExvYWRJbmNyZWFzZSAgID0gMDsgIC8qIGV4cHJlc3NlZCBpbiBwZXJjZW50ICovCisgICAgU0tfVTY0ICAgICAgIFRocmVzaG9sZEludHMgID0gMDsKKyAgICBTS19VNjQgICAgICAgSXNyQ2FsbHNQZXJTZWMgPSAwOworCisjZGVmaW5lIE1fRElNSU5GTyBwQUMtPkR5bklycU1vZEluZm8KKworICAgIGlmICghSXNJbnRNb2RFbmFibGVkKHBBQykpIHsKKyAgICAgICAgaWYgKE1fRElNSU5GTy5JbnRNb2RUeXBlU2VsZWN0ID09IENfSU5UX01PRF9EWU5BTUlDKSB7CisgICAgICAgICAgICBDdXJyU3lzTG9hZCA9IEdldEN1cnJlbnRTeXN0ZW1Mb2FkKHBBQyk7CisgICAgICAgICAgICBpZiAoQ3VyclN5c0xvYWQgPiA3NSkgeworICAgICAgICAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgICAgICAgKiogTW9yZSB0aGFuIDc1JSB0b3RhbCBzeXN0ZW0gbG9hZCEgRW5hYmxlIHRoZSBtb2RlcmF0aW9uIAorICAgICAgICAgICAgICAgICAgICAqKiB0byBzaGllbGQgdGhlIHN5c3RlbSBhZ2FpbnN0IHRvbyBtYW55IGludGVycnVwdHMuCisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIEVuYWJsZUludE1vZChwQUMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChDdXJyU3lzTG9hZCA+IE1fRElNSU5GTy5QcmV2U3lzTG9hZCkgeworICAgICAgICAgICAgICAgIExvYWRJbmNyZWFzZSA9IChDdXJyU3lzTG9hZCAtIE1fRElNSU5GTy5QcmV2U3lzTG9hZCk7CisgICAgICAgICAgICAgICAgaWYgKExvYWRJbmNyZWFzZSA+ICgoTV9ESU1JTkZPLlByZXZTeXNMb2FkICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ19JTlRfTU9EX0VOQUJMRV9QRVJDRU5UQUdFKSAvIDEwMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEN1cnJTeXNMb2FkID4gMTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIAorICAgICAgICAgICAgICAgICAgICAgICAgKiogTW9yZSB0aGFuIDUwJSBpbmNyZWFzZSB3aXRoIHJlc3BlY3QgdG8gdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgKiogcHJldmlvdXMgbG9hZCBvZiB0aGUgc3lzdGVtLiBNb3N0IGxpa2VseSB0aGlzIAorICAgICAgICAgICAgICAgICAgICAgICAgKiogaXMgZHVlIHRvIG91ciBJU1ItcHJvYy4uLgorICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIEVuYWJsZUludE1vZChwQUMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICoqIE5laXRoZXIgdG9vIG11Y2ggc3lzdGVtIGxvYWQgYXQgYWxsIG5vciB0b28gbXVjaCBpbmNyZWFzZQorICAgICAgICAgICAgICAgICoqIHdpdGggcmVzcGVjdCB0byB0aGUgcHJldmlvdXMgc3lzdGVtIGxvYWQuIEhlbmNlLCB3ZSBjYW4gbGVhdmUKKyAgICAgICAgICAgICAgICAqKiB0aGUgSVNSLWhhbmRsaW5nIGxpa2UgaXQgaXMgd2l0aG91dCBlbmFibGluZyBtb2RlcmF0aW9uLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBNX0RJTUlORk8uUHJldlN5c0xvYWQgPSBDdXJyU3lzTG9hZDsKKyAgICAgICAgfSAgIAorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChNX0RJTUlORk8uSW50TW9kVHlwZVNlbGVjdCA9PSBDX0lOVF9NT0RfRFlOQU1JQykgeworICAgICAgICAgICAgVGhyZXNob2xkSW50cyAgPSAoKE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ19JTlRfTU9EX0RJU0FCTEVfUEVSQ0VOVEFHRSkgLyAxMDApOworICAgICAgICAgICAgSXNyQ2FsbHNQZXJTZWMgPSBHZXRJc3JDYWxscyhwQUMpOworICAgICAgICAgICAgaWYgKElzckNhbGxzUGVyU2VjIDw9IFRocmVzaG9sZEludHMpIHsKKyAgICAgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAgICAqKiBUaGUgbnVtYmVyIG9mIGludGVycnVwdHMgd2l0aGluIHRoZSBsYXN0IHNlY29uZCBpcyAKKyAgICAgICAgICAgICAgICAqKiBsb3dlciB0aGFuIHRoZSBkaXNhYmxlX3BlcmNlbnRhZ2Ugb2YgdGhlIGRlc3JpZWQgCisgICAgICAgICAgICAgICAgKiogbWF4cmF0ZS4gVGhlcmVmb3JlIHdlIGNhbiBkaXNhYmxlIHRoZSBtb2RlcmF0aW9uLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgRGlzYWJsZUludE1vZChwQUMpOworICAgICAgICAgICAgICAgIE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjID0gCisgICAgICAgICAgICAgICAgICAgKE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjVXBwZXJMaW1pdCArCisgICAgICAgICAgICAgICAgICAgIE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjTG93ZXJMaW1pdCkgLyAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICoqIFRoZSBudW1iZXIgb2YgaW50ZXJydXB0cyBwZXIgc2VjIGlzIHRoZSBzYW1lIGFzIGV4cGVjdGVkLgorICAgICAgICAgICAgICAgICoqIEV2YWx1bGF0ZSB0aGUgZGVzY3JpcHRvci1yYXRpby4gSWYgaXQgaGFzIGNoYW5nZWQsIGEgcmVzaXplIAorICAgICAgICAgICAgICAgICoqIGluIHRoZSBtb2RlcmF0aW9uIHRpbWVyIG1pZ2h0IGJlIHVzZWZ1bGwKKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChNX0RJTUlORk8uQXV0b1NpemluZykgeworICAgICAgICAgICAgICAgICAgICBSZXNpemVEaW1UaW1lckR1cmF0aW9uKHBBQyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAqKiBTb21lIGluZm9ybWF0aW9uIHRvIHRoZSBsb2cuLi4KKyAgICAqLworICAgIGlmIChNX0RJTUlORk8uRGlzcGxheVN0YXRzKSB7CisgICAgICAgIERpc3BsYXlTZWxlY3RlZE1vZGVyYXRpb25UeXBlKHBBQyk7CisgICAgICAgIERpc3BsYXlTZWxlY3RlZE1vZGVyYXRpb25NYXNrKHBBQyk7CisgICAgICAgIERpc3BsYXlEZXNjclJhdGlvKHBBQyk7CisgICAgfQorCisgICAgTV9ESU1JTkZPLk5iclByb2Nlc3NlZERlc2NyID0gMDsgCisgICAgU2V0Q3VyckludEN0cihwQUMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogU2tEaW1TdGFydE1vZGVyYXRpb25UaW1lcgorKiogRGVzY3JpcHRpb24gIDogU3RhcnRzIHRoZSBhdWRpdC10aW1lciBmb3IgdGhlIGR5bmFtaWMgaW50ZXJydXB0IG1vZGVyYXRpb24KKyoqIFByb2dyYW1tZXIgICA6IFJhbHBoIFJvZXNsZXIKKyoqIExhc3QgTW9kaWZpZWQ6IDIyLW1hci0wMworKiogUmV0dXJucyAgICAgIDogdm9pZCAoISkKKyoqIE5vdGVzICAgICAgICA6IC0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgCitTa0RpbVN0YXJ0TW9kZXJhdGlvblRpbWVyKFNLX0FDICpwQUMpIHsKKyAgICBTS19FVlBBUkEgICAgRXZlbnRQYXJhbTsgICAvKiBFdmVudCBzdHJ1Y3QgZm9yIHRpbWVyIGV2ZW50ICovCisgCisgICAgU0tfTUVNU0VUKChjaGFyICopICZFdmVudFBhcmFtLCAwLCBzaXplb2YoRXZlbnRQYXJhbSkpOworICAgIEV2ZW50UGFyYW0uUGFyYTMyWzBdID0gU0tfRFJWX01PREVSQVRJT05fVElNRVI7CisgICAgU2tUaW1lclN0YXJ0KHBBQywgcEFDLT5Jb0Jhc2UsICZwQUMtPkR5bklycU1vZEluZm8uTW9kVGltZXIsCisgICAgICAgICAgICAgICAgIFNLX0RSVl9NT0RFUkFUSU9OX1RJTUVSX0xFTkdUSCwKKyAgICAgICAgICAgICAgICAgU0tHRV9EUlYsIFNLX0RSVl9USU1FUiwgRXZlbnRQYXJhbSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBGdW5jdGlvbiAgICAgOiBTa0RpbUVuYWJsZU1vZGVyYXRpb25JZk5lZWRlZAorKiogRGVzY3JpcHRpb24gIDogRWl0aGVyIGVuYWJsZXMgb3IgZGlzYWJsZXMgbW9kZXJhdGlvbgorKiogUHJvZ3JhbW1lciAgIDogUmFscGggUm9lc2xlcgorKiogTGFzdCBNb2RpZmllZDogMjItbWFyLTAzCisqKiBSZXR1cm5zICAgICAgOiB2b2lkICghKQorKiogTm90ZXMgICAgICAgIDogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIHBhcnRpY3VsYXIgYWRhcHRlciBpcyBvcGVuZWQKKyoqICAgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIERpc2FibGUgZnVuY3Rpb24sIGJlY2F1c2Ugd2hlbiBhbGwgaW50ZXJydXB0cyAKKyoqICAgICAgICAgICAgICAgIG1pZ2h0IGJlIGRpc2FibGUsIHRoZSBtb2RlcmF0aW9uIHRpbWVyIGhhcyBubyBtZWFuaW5nIGF0IGFsbAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCitTa0RpbUVuYWJsZU1vZGVyYXRpb25JZk5lZWRlZChTS19BQyAqcEFDKSB7CisKKyAgICBpZiAoTV9ESU1JTkZPLkludE1vZFR5cGVTZWxlY3QgPT0gQ19JTlRfTU9EX1NUQVRJQykgeworICAgICAgICBFbmFibGVJbnRNb2QocEFDKTsgICAvKiBub3RpZmljYXRpb24gcHJpbnQgaW4gdGhpcyBmdW5jdGlvbiAqLworICAgIH0gZWxzZSBpZiAoTV9ESU1JTkZPLkludE1vZFR5cGVTZWxlY3QgPT0gQ19JTlRfTU9EX0RZTkFNSUMpIHsKKyAgICAgICAgU2tEaW1TdGFydE1vZGVyYXRpb25UaW1lcihwQUMpOworICAgICAgICBpZiAoTV9ESU1JTkZPLkRpc3BsYXlTdGF0cykgeworICAgICAgICAgICAgcHJpbnRrKCJEeW5hbWljIG1vZGVyYXRpb24gaGFzIGJlZW4gZW5hYmxlZFxuIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoTV9ESU1JTkZPLkRpc3BsYXlTdGF0cykgeworICAgICAgICAgICAgcHJpbnRrKCJObyBtb2RlcmF0aW9uIGhhcyBiZWVuIGVuYWJsZWRcbiIpOworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogU2tEaW1EaXNwbGF5TW9kZXJhdGlvblNldHRpbmdzCisqKiBEZXNjcmlwdGlvbiAgOiBEaXNwbGF5cyB0aGUgY3VycmVudCBzZXR0aW5ncyByZWdhcmluZyBpbnRlcnJ1cHQgbW9kZXJhdGlvbgorKiogUHJvZ3JhbW1lciAgIDogUmFscGggUm9lc2xlcgorKiogTGFzdCBNb2RpZmllZDogMjItbWFyLTAzCisqKiBSZXR1cm5zICAgICAgOiB2b2lkICghKQorKiogTm90ZXMgICAgICAgIDogLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAKK1NrRGltRGlzcGxheU1vZGVyYXRpb25TZXR0aW5ncyhTS19BQyAqcEFDKSB7CisgICAgRGlzcGxheVNlbGVjdGVkTW9kZXJhdGlvblR5cGUocEFDKTsKKyAgICBEaXNwbGF5U2VsZWN0ZWRNb2RlcmF0aW9uTWFzayhwQUMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIExvY2FsIGZ1bmN0aW9ucyAKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogR2V0Q3VycmVudFN5c3RlbUxvYWQKKyoqIERlc2NyaXB0aW9uICA6IFJldHJpZXZlcyB0aGUgY3VycmVudCBzeXN0ZW0gbG9hZCBvZiB0aGUgc3lzdGVtLiBUaGlzIGxvYWQKKyoqICAgICAgICAgICAgICAgIGlzIGV2YWx1YXRlZCBmb3IgYWxsIHByb2Nlc3NvcnMgd2l0aGluIHRoZSBzeXN0ZW0uCisqKiBQcm9ncmFtbWVyICAgOiBSYWxwaCBSb2VzbGVyCisqKiBMYXN0IE1vZGlmaWVkOiAyMi1tYXItMDMKKyoqIFJldHVybnMgICAgICA6IHVuc2lnbmVkIGludDogbG9hZCBleHByZXNzZWQgaW4gcGVyY2VudGFnZQorKiogTm90ZXMgICAgICAgIDogVGhlIHBvc3NpYmxlIHJhbmdlIGJlaW5nIHJldHVybmVkIGlzIGZyb20gMCB1cCB0byAxMDAuCisqKiAgICAgICAgICAgICAgICBXaGVyZWFzIDAgbWVhbnMgJ25vIGxvYWQgYXQgYWxsJyBhbmQgMTAwICdzeXN0ZW0gZnVsbHkgbG9hZGVkJworKiogICAgICAgICAgICAgICAgSXQgaXMgaW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgd2hhdCBhY3R1YWxseSBjYXVzZXMgdGhlIHN5c3RlbQorKiogICAgICAgICAgICAgICAgdG8gYmUgaW4gMTAwJSwgYnV0IG1heWJlIHRoYXQgaXMgZHVlIHRvIHRvbyBtdWNoIGludGVycnVwdHMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdW5zaWduZWQgaW50CitHZXRDdXJyZW50U3lzdGVtTG9hZChTS19BQyAqcEFDKSB7CisJdW5zaWduZWQgbG9uZyBqaWYgICAgICAgICA9IGppZmZpZXM7CisJdW5zaWduZWQgaW50ICBVc2VyVGltZSAgICA9IDA7CisJdW5zaWduZWQgaW50ICBTeXN0ZW1UaW1lICA9IDA7CisJdW5zaWduZWQgaW50ICBOaWNlVGltZSAgICA9IDA7CisJdW5zaWduZWQgaW50ICBJZGxlVGltZSAgICA9IDA7CisJdW5zaWduZWQgaW50ICBUb3RhbFRpbWUgICA9IDA7CisJdW5zaWduZWQgaW50ICBVc2VkVGltZSAgICA9IDA7CisJdW5zaWduZWQgaW50ICBTeXN0ZW1Mb2FkICA9IDA7CisKKwkvKiB1bnNpZ25lZCBpbnQgIE5ickNwdSAgICAgID0gMDsgKi8KKworCS8qCisJKiogVGhlIGZvbGxvd2luZyBsaW5lcyBoYXZlIGJlZW4gY29tbWVudGVkIG91dCwgYmVjYXVzZQorCSoqIGZyb20ga2VybmVsIDIuNS40NCBvbndhcmRzLCB0aGUga2VybmVsLW93bmVkIHN0cnVjdHVyZQorCSoqCisJKiogICAgICBzdHJ1Y3Qga2VybmVsX3N0YXQga3N0YXQKKwkqKgorCSoqIGlzIG5vdCBtYXJrZWQgYXMgYW4gZXhwb3J0ZWQgc3ltYm9sIGluIHRoZSBmaWxlCisJKioKKwkqKiAgICAgIGtlcm5lbC9rc3ltcy5jIAorCSoqCisJKiogQXMgYSBjb25zZXF1ZW5jZSwgdXNpbmcgdGhpcyBkcml2ZXIgYXMgS0xNIGlzIG5vdCBwb3NzaWJsZQorCSoqIGFuZCBhbnkgYWNjZXNzIG9mIHRoZSBzdHJ1Y3R1cmUga2VybmVsX3N0YXQgdmlhIHRoZSAKKwkqKiBkZWRpY2F0ZWQgbWFjcm9zIGtzdGF0X2NwdShpKS5jcHVzdGF0Lnh4eCBpcyB0byBiZSBhdm9pZGVkLgorCSoqCisJKiogVGhlIGtzdGF0LWluZm9ybWF0aW9uIG1pZ2h0IGJlIGFkZGVkIGFnYWluIGluIGZ1dHVyZSAKKwkqKiB2ZXJzaW9ucyBvZiB0aGUgMi41Lnh4IGtlcm5lbCwgYnV0IGZvciB0aGUgdGltZSBiZWluZywgCisJKiogbnVtYmVyIG9mIGludGVycnVwdHMgd2lsbCBzZXJ2ZSBhcyBpbmRpY2F0aW9uIGhvdyBtdWNoIAorCSoqIGxvYWQgd2UgY3VycmVudGx5IGhhdmUuLi4gCisJKioKKwkqKiBmb3IgKE5ickNwdSA9IDA7IE5ickNwdSA8IG51bV9vbmxpbmVfY3B1cygpOyBOYnJDcHUrKykgeworCSoqCVVzZXJUaW1lICAgPSBVc2VyVGltZSAgICsga3N0YXRfY3B1KE5ickNwdSkuY3B1c3RhdC51c2VyOworCSoqCU5pY2VUaW1lICAgPSBOaWNlVGltZSAgICsga3N0YXRfY3B1KE5ickNwdSkuY3B1c3RhdC5uaWNlOworCSoqCVN5c3RlbVRpbWUgPSBTeXN0ZW1UaW1lICsga3N0YXRfY3B1KE5ickNwdSkuY3B1c3RhdC5zeXN0ZW07CisJKiogfQorCSovCisJU0tfVTY0IFRocmVzaG9sZEludHMgID0gMDsKKwlTS19VNjQgSXNyQ2FsbHNQZXJTZWMgPSAwOworCisJVGhyZXNob2xkSW50cyAgPSAoKE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjICoKKwkJCSAgIENfSU5UX01PRF9FTkFCTEVfUEVSQ0VOVEFHRSkgKyAxMDApOworCUlzckNhbGxzUGVyU2VjID0gR2V0SXNyQ2FsbHMocEFDKTsKKwlpZiAoSXNyQ2FsbHNQZXJTZWMgPj0gVGhyZXNob2xkSW50cykgeworCSAgICAvKgorCSAgICAqKiBXZSBkbyBub3Qga25vdyBob3cgbXVjaCB0aGUgcmVhbCBDUFUtbG9hZCBpcyEKKwkgICAgKiogUmV0dXJuIDgwJSBhcyBhIGRlZmF1bHQgaW4gb3JkZXIgdG8gYWN0aXZhdGUgRElNCisJICAgICovCisJICAgIFN5c3RlbUxvYWQgPSA4MDsKKwkgICAgcmV0dXJuIChTeXN0ZW1Mb2FkKTsgIAorCX0gCisKKwlVc2VkVGltZSAgPSBVc2VyVGltZSArIE5pY2VUaW1lICsgU3lzdGVtVGltZTsKKworCUlkbGVUaW1lICA9IGppZiAqIG51bV9vbmxpbmVfY3B1cygpIC0gVXNlZFRpbWU7CisJVG90YWxUaW1lID0gVXNlZFRpbWUgKyBJZGxlVGltZTsKKworCVN5c3RlbUxvYWQgPSAoIDEwMCAqIChVc2VkVGltZSAgLSBNX0RJTUlORk8uUHJldlVzZWRUaW1lKSApIC8KKwkJCQkJCShUb3RhbFRpbWUgLSBNX0RJTUlORk8uUHJldlRvdGFsVGltZSk7CisKKwlpZiAoTV9ESU1JTkZPLkRpc3BsYXlTdGF0cykgeworCQlwcmludGsoIkN1cnJlbnQgc3lzdGVtIGxvYWQgaXM6ICV1XG4iLCBTeXN0ZW1Mb2FkKTsKKwl9CisKKwlNX0RJTUlORk8uUHJldlRvdGFsVGltZSA9IFRvdGFsVGltZTsKKwlNX0RJTUlORk8uUHJldlVzZWRUaW1lICA9IFVzZWRUaW1lOworCisJcmV0dXJuIChTeXN0ZW1Mb2FkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEZ1bmN0aW9uICAgICA6IEdldElzckNhbGxzCisqKiBEZXNjcmlwdGlvbiAgOiBEZXBlbmRpbmcgb24gdGhlIHNlbGVjdGVkIG1vZGVyYXRpb24gbWFzaywgdGhpcyBmdW5jdGlvbiB3aWxsCisqKiAgICAgICAgICAgICAgICByZXR1cm4gdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzIGhhbmRsZWQgaW4gdGhlIHByZXZpb3VzIHRpbWUtCisqKiAgICAgICAgICAgICAgICBmcmFtZS4gVGhpcyBldmFsdWF0ZWQgbnVtYmVyIGlzIGJhc2VkIG9uIHRoZSBjdXJyZW50IG51bWJlciAKKyoqICAgICAgICAgICAgICAgIG9mIGludGVycnVwdHMgc3RvcmVkIGluIFBOTUktY29udGV4dCBhbmQgdGhlIHByZXZpb3VzIHN0b3JlZCAKKyoqICAgICAgICAgICAgICAgIGludGVycnVwdHMuCisqKiBQcm9ncmFtbWVyICAgOiBSYWxwaCBSb2VzbGVyCisqKiBMYXN0IE1vZGlmaWVkOiAyMy1tYXItMDMKKyoqIFJldHVybnMgICAgICA6IGludDogICB0aGUgbnVtYmVyIG9mIGludGVycnVwdHMgYmVpbmcgZXhlY3V0ZWQgaW4gdGhlIGxhc3QKKyoqICAgICAgICAgICAgICAgICAgICAgICB0aW1lZnJhbWUKKyoqIE5vdGVzICAgICAgICA6IEl0IG1ha2VzIG9ubHkgc2Vuc2UgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLCB3aGVuIGR5bmFtaWMgCisqKiAgICAgICAgICAgICAgICBpbnRlcnJ1cHQgbW9kZXJhdGlvbiBpcyBhcHBsaWVkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgU0tfVTY0CitHZXRJc3JDYWxscyhTS19BQyAqcEFDKSB7CisgICAgU0tfVTY0ICAgUnhQb3J0MEludERpZmYgPSAwOworICAgIFNLX1U2NCAgIFJ4UG9ydDFJbnREaWZmID0gMDsKKyAgICBTS19VNjQgICBUeFBvcnQwSW50RGlmZiA9IDA7CisgICAgU0tfVTY0ICAgVHhQb3J0MUludERpZmYgPSAwOworCisgICAgaWYgKHBBQy0+RHluSXJxTW9kSW5mby5NYXNrSXJxTW9kZXJhdGlvbiA9PSBJUlFfTUFTS19UWF9PTkxZKSB7CisgICAgICAgIGlmIChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPT0gMikgeworICAgICAgICAgICAgVHhQb3J0MUludERpZmYgPSBwQUMtPlBubWkuUG9ydFsxXS5UeEludHJDdHMgLSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5EeW5JcnFNb2RJbmZvLlByZXZQb3J0MVR4SW50ckN0czsKKyAgICAgICAgfQorICAgICAgICBUeFBvcnQwSW50RGlmZiA9IHBBQy0+UG5taS5Qb3J0WzBdLlR4SW50ckN0cyAtIAorICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+RHluSXJxTW9kSW5mby5QcmV2UG9ydDBUeEludHJDdHM7CisgICAgfSBlbHNlIGlmIChwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPT0gSVJRX01BU0tfUlhfT05MWSkgeworICAgICAgICBpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDIpIHsKKyAgICAgICAgICAgIFJ4UG9ydDFJbnREaWZmID0gcEFDLT5Qbm1pLlBvcnRbMV0uUnhJbnRyQ3RzIC0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+RHluSXJxTW9kSW5mby5QcmV2UG9ydDFSeEludHJDdHM7CisgICAgICAgIH0KKyAgICAgICAgUnhQb3J0MEludERpZmYgPSBwQUMtPlBubWkuUG9ydFswXS5SeEludHJDdHMgLSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkR5bklycU1vZEluZm8uUHJldlBvcnQwUnhJbnRyQ3RzOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPT0gMikgeworICAgICAgICAgICAgUnhQb3J0MUludERpZmYgPSBwQUMtPlBubWkuUG9ydFsxXS5SeEludHJDdHMgLSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5EeW5JcnFNb2RJbmZvLlByZXZQb3J0MVJ4SW50ckN0czsKKyAgICAgICAgICAgIFR4UG9ydDFJbnREaWZmID0gcEFDLT5Qbm1pLlBvcnRbMV0uVHhJbnRyQ3RzIC0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBQy0+RHluSXJxTW9kSW5mby5QcmV2UG9ydDFUeEludHJDdHM7CisgICAgICAgIH0gCisgICAgICAgIFJ4UG9ydDBJbnREaWZmID0gcEFDLT5Qbm1pLlBvcnRbMF0uUnhJbnRyQ3RzIC0gCisgICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5EeW5JcnFNb2RJbmZvLlByZXZQb3J0MFJ4SW50ckN0czsKKyAgICAgICAgVHhQb3J0MEludERpZmYgPSBwQUMtPlBubWkuUG9ydFswXS5UeEludHJDdHMgLSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkR5bklycU1vZEluZm8uUHJldlBvcnQwVHhJbnRyQ3RzOworICAgIH0KKworICAgIHJldHVybiAoUnhQb3J0MEludERpZmYgKyBSeFBvcnQxSW50RGlmZiArIFR4UG9ydDBJbnREaWZmICsgVHhQb3J0MUludERpZmYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogR2V0UnhDYWxscworKiogRGVzY3JpcHRpb24gIDogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgcmVjZWl2ZSBpbnRlci0KKyoqICAgICAgICAgICAgICAgIHJ1cHQgd2FzIHByb2Nlc3NlZC4gVGhpcyBpcyBuZWVkZWQgdG8gZXZhbHVhdGUgYW55IHJlc2l6aW5nIAorKiogICAgICAgICAgICAgICAgZmFjdG9yLgorKiogUHJvZ3JhbW1lciAgIDogUmFscGggUm9lc2xlcgorKiogTGFzdCBNb2RpZmllZDogMjMtbWFyLTAzCisqKiBSZXR1cm5zICAgICAgOiBTS19VNjQ6IHRoZSBudW1iZXIgb2YgUlgtaW50cyBiZWluZyBwcm9jZXNzZWQKKyoqIE5vdGVzICAgICAgICA6IEl0IG1ha2VzIG9ubHkgc2Vuc2UgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLCB3aGVuIGR5bmFtaWMgCisqKiAgICAgICAgICAgICAgICBpbnRlcnJ1cHQgbW9kZXJhdGlvbiBpcyBhcHBsaWVkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgU0tfVTY0CitHZXRSeENhbGxzKFNLX0FDICpwQUMpIHsKKyAgICBTS19VNjQgICBSeFBvcnQwSW50RGlmZiA9IDA7CisgICAgU0tfVTY0ICAgUnhQb3J0MUludERpZmYgPSAwOworCisgICAgaWYgKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA9PSAyKSB7CisgICAgICAgIFJ4UG9ydDFJbnREaWZmID0gcEFDLT5Qbm1pLlBvcnRbMV0uUnhJbnRyQ3RzIC0gCisgICAgICAgICAgICAgICAgICAgICAgICAgcEFDLT5EeW5JcnFNb2RJbmZvLlByZXZQb3J0MVJ4SW50ckN0czsKKyAgICB9CisgICAgUnhQb3J0MEludERpZmYgPSBwQUMtPlBubWkuUG9ydFswXS5SeEludHJDdHMgLSAKKyAgICAgICAgICAgICAgICAgICAgIHBBQy0+RHluSXJxTW9kSW5mby5QcmV2UG9ydDBSeEludHJDdHM7CisKKyAgICByZXR1cm4gKFJ4UG9ydDBJbnREaWZmICsgUnhQb3J0MUludERpZmYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogU2V0Q3VyckludEN0cgorKiogRGVzY3JpcHRpb24gIDogV2lsbCBzdG9yZSB0aGUgY3VycmVudCBudW1iZXIgb3JmIG9jY3VyZWQgaW50ZXJydXB0cyBpbiB0aGUgCisqKiAgICAgICAgICAgICAgICBhZGFwdGVyIGNvbnRleHQuIFRoaXMgaXMgbmVlZGVkIHRvIGV2YWx1YXRlZCB0aGUgbnVtYmVyIG9mIAorKiogICAgICAgICAgICAgICAgaW50ZXJydXB0cyB3aXRoaW4gYSBjdXJyZW50IHRpbWVmcmFtZS4KKyoqIFByb2dyYW1tZXIgICA6IFJhbHBoIFJvZXNsZXIKKyoqIExhc3QgTW9kaWZpZWQ6IDIzLW1hci0wMworKiogUmV0dXJucyAgICAgIDogdm9pZCAoISkKKyoqIE5vdGVzICAgICAgICA6IC0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitTZXRDdXJySW50Q3RyKFNLX0FDICpwQUMpIHsKKyAgICBpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDIpIHsKKyAgICAgICAgcEFDLT5EeW5JcnFNb2RJbmZvLlByZXZQb3J0MVJ4SW50ckN0cyA9IHBBQy0+UG5taS5Qb3J0WzFdLlJ4SW50ckN0czsKKyAgICAgICAgcEFDLT5EeW5JcnFNb2RJbmZvLlByZXZQb3J0MVR4SW50ckN0cyA9IHBBQy0+UG5taS5Qb3J0WzFdLlR4SW50ckN0czsKKyAgICB9IAorICAgIHBBQy0+RHluSXJxTW9kSW5mby5QcmV2UG9ydDBSeEludHJDdHMgPSBwQUMtPlBubWkuUG9ydFswXS5SeEludHJDdHM7CisgICAgcEFDLT5EeW5JcnFNb2RJbmZvLlByZXZQb3J0MFR4SW50ckN0cyA9IHBBQy0+UG5taS5Qb3J0WzBdLlR4SW50ckN0czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIEZ1bmN0aW9uICAgICA6IElzSW50TW9kRW5hYmxlZCgpCisqKiBEZXNjcmlwdGlvbiAgOiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGludGVycnVwdHMgbW9kZXJhdGlvbgorKiogICAgICAgICAgICAgICAgY29tbWFuZCByZWdpc3Rlci4gSXRzIGNvbnRlbnQgZGV0ZXJtaW5lcyB3aGV0aGVyIGFueSAKKyoqICAgICAgICAgICAgICAgIG1vZGVyYXRpb24gaXMgcnVubmluZyBvciBub3QuCisqKiBQcm9ncmFtbWVyICAgOiBSYWxwaCBSb2VzbGVyCisqKiBMYXN0IE1vZGlmaWVkOiAyMy1tYXItMDMKKyoqIFJldHVybnMgICAgICA6IFNLX1RSVUUgIDogaWYgbW9kIHRpbWVyIHJ1bm5pbmcKKyoqICAgICAgICAgICAgICAgIFNLX0ZBTFNFIDogaWYgbm8gbW9kZXJhdGlvbiBpcyBiZWluZyBwZXJmb3JtZWQKKyoqIE5vdGVzICAgICAgICA6IC0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBTS19CT09MCitJc0ludE1vZEVuYWJsZWQoU0tfQUMgKnBBQykgeworICAgIHVuc2lnbmVkIGxvbmcgQ3RyQ21kOworCisgICAgU0tfSU4zMihwQUMtPklvQmFzZSwgQjJfSVJRTV9DVFJMLCAmQ3RyQ21kKTsKKyAgICBpZiAoKEN0ckNtZCAmIFRJTV9TVEFSVCkgPT0gVElNX1NUQVJUKSB7CisgICAgICAgcmV0dXJuIFNLX1RSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgICByZXR1cm4gU0tfRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogRW5hYmxlSW50TW9kKCkKKyoqIERlc2NyaXB0aW9uICA6IEVuYWJsZXMgdGhlIGludGVycnVwdCBtb2RlcmF0aW9uIHVzaW5nIHRoZSB2YWx1ZXMgc3RvcmVkIGluCisqKiAgICAgICAgICAgICAgICBpbiB0aGUgcEFDLT5EeW5JbnRNb2QgZGF0YSBzdHJ1Y3R1cmUKKyoqIFByb2dyYW1tZXIgICA6IFJhbHBoIFJvZXNsZXIKKyoqIExhc3QgTW9kaWZpZWQ6IDIyLW1hci0wMworKiogUmV0dXJucyAgICAgIDogLQorKiogTm90ZXMgICAgICAgIDogLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK0VuYWJsZUludE1vZChTS19BQyAqcEFDKSB7CisgICAgdW5zaWduZWQgbG9uZyBNb2RCYXNlOworCisgICAgaWYgKHBBQy0+R0luaS5HSUNoaXBJZCA9PSBDSElQX0lEX0dFTkVTSVMpIHsKKyAgICAgICBNb2RCYXNlID0gQ19DTEtfRlJFUV9HRU5FU0lTIC8gcEFDLT5EeW5JcnFNb2RJbmZvLk1heE1vZEludHNQZXJTZWM7CisgICAgfSBlbHNlIHsKKyAgICAgICBNb2RCYXNlID0gQ19DTEtfRlJFUV9ZVUtPTiAvIHBBQy0+RHluSXJxTW9kSW5mby5NYXhNb2RJbnRzUGVyU2VjOworICAgIH0KKworICAgIFNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMl9JUlFNX0lOSSwgIE1vZEJhc2UpOworICAgIFNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMl9JUlFNX01TSywgIHBBQy0+RHluSXJxTW9kSW5mby5NYXNrSXJxTW9kZXJhdGlvbik7CisgICAgU0tfT1VUMzIocEFDLT5Jb0Jhc2UsIEIyX0lSUU1fQ1RSTCwgVElNX1NUQVJUKTsKKyAgICBpZiAoTV9ESU1JTkZPLkRpc3BsYXlTdGF0cykgeworICAgICAgICBwcmludGsoIkVuYWJsZWQgaW50ZXJydXB0IG1vZGVyYXRpb24gKCVpIGludHMvc2VjKVxuIiwKKyAgICAgICAgICAgICAgIE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBGdW5jdGlvbiAgICAgOiBEaXNhYmxlSW50TW9kKCkKKyoqIERlc2NyaXB0aW9uICA6IERpc2JsZXMgdGhlIGludGVycnVwdCBtb2RlcmF0aW9uIGluZGVwZW5kZW50IG9mIHdoYXQgaW50ZXItCisqKiAgICAgICAgICAgICAgICBydXB0cyBhcmUgcnVubmluZyBvciBub3QKKyoqIFByb2dyYW1tZXIgICA6IFJhbHBoIFJvZXNsZXIKKyoqIExhc3QgTW9kaWZpZWQ6IDIzLW1hci0wMworKiogUmV0dXJucyAgICAgIDogLQorKiogTm90ZXMgICAgICAgIDogLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgCitEaXNhYmxlSW50TW9kKFNLX0FDICpwQUMpIHsKKworICAgIFNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMl9JUlFNX0NUUkwsIFRJTV9TVE9QKTsKKyAgICBpZiAoTV9ESU1JTkZPLkRpc3BsYXlTdGF0cykgeworICAgICAgICBwcmludGsoIkRpc2FibGVkIGludGVycnVwdCBtb2RlcmF0aW9uXG4iKTsKKyAgICB9Cit9IAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogUmVzaXplRGltVGltZXJEdXJhdGlvbigpOworKiogRGVzY3JpcHRpb24gIDogQ2hlY2tzIHRoZSBjdXJyZW50IHVzZWQgZGVzY3JpcHRvciByYXRpbyBhbmQgcmVzaXplcyB0aGUgCisqKiAgICAgICAgICAgICAgICBkdXJhdGlvbiB0aW1lciAobG9uZ2VyL3NtYWxsZXIpIGlmIHBvc3NpYmxlLiAKKyoqIFByb2dyYW1tZXIgICA6IFJhbHBoIFJvZXNsZXIKKyoqIExhc3QgTW9kaWZpZWQ6IDIzLW1hci0wMworKiogUmV0dXJucyAgICAgIDogLQorKiogTm90ZXMgICAgICAgIDogVGhlcmUgYXJlIGJvdGggbWF4aW11bSBhbmQgbWluaW11bSB0aW1lciBkdXJhdGlvbiB2YWx1ZS4gCisqKiAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBpbnRlcnJ1cHQgbW9kZXJhdGlvbiBpcyBhbHJlYWR5CisqKiAgICAgICAgICAgICAgICBlbmFibGVkIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgCitSZXNpemVEaW1UaW1lckR1cmF0aW9uKFNLX0FDICpwQUMpIHsKKyAgICBTS19CT09MIEluY3JlYXNlVGltZXJEdXJhdGlvbjsKKyAgICBpbnQgICAgIFRvdGFsTWF4TmJyRGVzY3I7CisgICAgaW50ICAgICBVc2VkRGVzY3JSYXRpbzsKKyAgICBpbnQgICAgIFJhdGlvRGlmZkFiczsKKyAgICBpbnQgICAgIFJhdGlvRGlmZlJlbDsKKyAgICBpbnQgICAgIE5ld01heE1vZEludHNQZXJTZWM7CisgICAgaW50ICAgICBNb2RBZGpWYWx1ZTsKKyAgICBsb25nICAgIE1vZEJhc2U7CisKKyAgICAvKgorICAgICoqIENoZWNrIGZpcnN0IGlmIHdlIGFyZSBhbGxvd2VkIHRvIHBlcmZvcm0gYW55IG1vZGlmaWNhdGlvbgorICAgICovCisgICAgaWYgKElzSW50TW9kRW5hYmxlZChwQUMpKSB7IAorICAgICAgICBpZiAoTV9ESU1JTkZPLkludE1vZFR5cGVTZWxlY3QgIT0gQ19JTlRfTU9EX0RZTkFNSUMpIHsKKyAgICAgICAgICAgIHJldHVybjsgCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoTV9ESU1JTkZPLk1vZEp1c3RFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgTV9ESU1JTkZPLk1vZEp1c3RFbmFibGVkID0gU0tfRkFMU0U7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAqKiBJZiB3ZSBnb3QgdW50aWwgaGVyZSwgd2UgaGF2ZSB0byBldmFsdWF0ZSB0aGUgYW1vdW50IG9mIHRoZQorICAgICoqIGRlc2NyaXB0b3IgcmF0aW8gY2hhbmdlLi4uCisgICAgKi8KKyAgICBUb3RhbE1heE5ickRlc2NyID0gcEFDLT5SeERlc2NyUGVyUmluZyAqIEdldFJ4Q2FsbHMocEFDKTsKKyAgICBVc2VkRGVzY3JSYXRpbyAgID0gKE1fRElNSU5GTy5OYnJQcm9jZXNzZWREZXNjciAqIDEwMCkgLyBUb3RhbE1heE5ickRlc2NyOworCisgICAgaWYgKFVzZWREZXNjclJhdGlvID4gTV9ESU1JTkZPLlByZXZVc2VkRGVzY3JSYXRpbykgeworICAgICAgICBSYXRpb0RpZmZBYnMgPSAoVXNlZERlc2NyUmF0aW8gLSBNX0RJTUlORk8uUHJldlVzZWREZXNjclJhdGlvKTsKKyAgICAgICAgUmF0aW9EaWZmUmVsID0gKFJhdGlvRGlmZkFicyAqIDEwMCkgLyBVc2VkRGVzY3JSYXRpbzsKKyAgICAgICAgTV9ESU1JTkZPLlByZXZVc2VkRGVzY3JSYXRpbyA9IFVzZWREZXNjclJhdGlvOworICAgICAgICBJbmNyZWFzZVRpbWVyRHVyYXRpb24gPSBTS19GQUxTRTsgIC8qIGluIG90aGVyIHdvcmRzOiBERUNSRUFTRSAqLworICAgIH0gZWxzZSBpZiAoVXNlZERlc2NyUmF0aW8gPCBNX0RJTUlORk8uUHJldlVzZWREZXNjclJhdGlvKSB7CisgICAgICAgIFJhdGlvRGlmZkFicyA9IChNX0RJTUlORk8uUHJldlVzZWREZXNjclJhdGlvIC0gVXNlZERlc2NyUmF0aW8pOworICAgICAgICBSYXRpb0RpZmZSZWwgPSAoUmF0aW9EaWZmQWJzICogMTAwKSAvIE1fRElNSU5GTy5QcmV2VXNlZERlc2NyUmF0aW87CisgICAgICAgIE1fRElNSU5GTy5QcmV2VXNlZERlc2NyUmF0aW8gPSBVc2VkRGVzY3JSYXRpbzsKKyAgICAgICAgSW5jcmVhc2VUaW1lckR1cmF0aW9uID0gU0tfVFJVRTsgICAvKiBpbiBvdGhlciB3b3JkczogSU5DUkVBU0UgKi8KKyAgICB9IGVsc2UgeworICAgICAgICBSYXRpb0RpZmZBYnMgPSAoTV9ESU1JTkZPLlByZXZVc2VkRGVzY3JSYXRpbyAtIFVzZWREZXNjclJhdGlvKTsKKyAgICAgICAgUmF0aW9EaWZmUmVsID0gKFJhdGlvRGlmZkFicyAqIDEwMCkgLyBNX0RJTUlORk8uUHJldlVzZWREZXNjclJhdGlvOworICAgICAgICBNX0RJTUlORk8uUHJldlVzZWREZXNjclJhdGlvID0gVXNlZERlc2NyUmF0aW87CisgICAgICAgIEluY3JlYXNlVGltZXJEdXJhdGlvbiA9IFNLX1RSVUU7ICAgLyogaW4gb3RoZXIgd29yZHM6IElOQ1JFQVNFICovCisgICAgfQorCisgICAgLyoKKyAgICAqKiBOb3cgd2UgY2FuIGRldGVybWluZSB0aGUgY2hhbmdlIGluIHBlcmNlbnQKKyAgICAqLworICAgIGlmICgoUmF0aW9EaWZmUmVsID49IDApICYmIChSYXRpb0RpZmZSZWwgPD0gNSkgKSB7CisgICAgICAgTW9kQWRqVmFsdWUgPSAxOyAgLyogIDElIGNoYW5nZSAtIG1heWJlIHNvbWUgb3RoZXIgdmFsdWUgaW4gZnV0dXJlICovCisgICAgfSBlbHNlIGlmICgoUmF0aW9EaWZmUmVsID4gNSkgJiYgKFJhdGlvRGlmZlJlbCA8PSAxMCkgKSB7CisgICAgICAgTW9kQWRqVmFsdWUgPSAxOyAgLyogIDElIGNoYW5nZSAtIG1heWJlIHNvbWUgb3RoZXIgdmFsdWUgaW4gZnV0dXJlICovCisgICAgfSBlbHNlIGlmICgoUmF0aW9EaWZmUmVsID4gMTApICYmIChSYXRpb0RpZmZSZWwgPD0gMTUpICkgeworICAgICAgIE1vZEFkalZhbHVlID0gMTsgIC8qICAxJSBjaGFuZ2UgLSBtYXliZSBzb21lIG90aGVyIHZhbHVlIGluIGZ1dHVyZSAqLworICAgIH0gZWxzZSB7CisgICAgICAgTW9kQWRqVmFsdWUgPSAxOyAgLyogIDElIGNoYW5nZSAtIG1heWJlIHNvbWUgb3RoZXIgdmFsdWUgaW4gZnV0dXJlICovCisgICAgfQorCisgICAgaWYgKEluY3JlYXNlVGltZXJEdXJhdGlvbikgeworICAgICAgIE5ld01heE1vZEludHNQZXJTZWMgPSAgTV9ESU1JTkZPLk1heE1vZEludHNQZXJTZWMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTV9ESU1JTkZPLk1heE1vZEludHNQZXJTZWMgKiBNb2RBZGpWYWx1ZSkgLyAxMDA7CisgICAgfSBlbHNlIHsKKyAgICAgICBOZXdNYXhNb2RJbnRzUGVyU2VjID0gIE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjICogTW9kQWRqVmFsdWUpIC8gMTAwOworICAgIH0KKworICAgIC8qIAorICAgICoqIENoZWNrIGlmIHdlIGV4Y2VlZCBib3VuZGFyaWVzLi4uCisgICAgKi8KKyAgICBpZiAoIChOZXdNYXhNb2RJbnRzUGVyU2VjID4gTV9ESU1JTkZPLk1heE1vZEludHNQZXJTZWNVcHBlckxpbWl0KSB8fAorICAgICAgICAgKE5ld01heE1vZEludHNQZXJTZWMgPCBNX0RJTUlORk8uTWF4TW9kSW50c1BlclNlY0xvd2VyTGltaXQpKSB7CisgICAgICAgIGlmIChNX0RJTUlORk8uRGlzcGxheVN0YXRzKSB7CisgICAgICAgICAgICBwcmludGsoIkNhbm5vdCBjaGFuZ2UgTW9kVGltIGZyb20gJWkgdG8gJWkgaW50cy9zZWNcbiIsCisgICAgICAgICAgICAgICAgICAgTV9ESU1JTkZPLk1heE1vZEludHNQZXJTZWMsIE5ld01heE1vZEludHNQZXJTZWMpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoTV9ESU1JTkZPLkRpc3BsYXlTdGF0cykgeworICAgICAgICAgICAgcHJpbnRrKCJSZXNpemVkIE1vZFRpbSBmcm9tICVpIHRvICVpIGludHMvc2VjXG4iLAorICAgICAgICAgICAgICAgICAgIE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjLCBOZXdNYXhNb2RJbnRzUGVyU2VjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE1fRElNSU5GTy5NYXhNb2RJbnRzUGVyU2VjID0gTmV3TWF4TW9kSW50c1BlclNlYzsKKworICAgIGlmIChwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9HRU5FU0lTKSB7CisgICAgICAgIE1vZEJhc2UgPSBDX0NMS19GUkVRX0dFTkVTSVMgLyBwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYzsKKyAgICB9IGVsc2UgeworICAgICAgICBNb2RCYXNlID0gQ19DTEtfRlJFUV9ZVUtPTiAvIHBBQy0+RHluSXJxTW9kSW5mby5NYXhNb2RJbnRzUGVyU2VjOworICAgIH0KKworICAgIC8qIAorICAgICoqIFdlIGRvIG5vdCBuZWVkIHRvIHRvdWNoIGFueSBvdGhlciByZWdpc3RlcnMKKyAgICAqLworICAgIFNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMl9JUlFNX0lOSSwgTW9kQmFzZSk7Cit9IAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogRGlzcGxheVNlbGVjdGVkTW9kZXJhdGlvblR5cGUoKQorKiogRGVzY3JpcHRpb24gIDogRGlzcGxheXMgd2hhdCB0eXBlIG9mIG1vZGVyYXRpb24gd2UgaGF2ZQorKiogUHJvZ3JhbW1lciAgIDogUmFscGggUm9lc2xlcgorKiogTGFzdCBNb2RpZmllZDogMjMtbWFyLTAzCisqKiBSZXR1cm5zICAgICAgOiB2b2lkIQorKiogTm90ZXMgICAgICAgIDogLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK0Rpc3BsYXlTZWxlY3RlZE1vZGVyYXRpb25UeXBlKFNLX0FDICpwQUMpIHsKKworICAgIGlmIChwQUMtPkR5bklycU1vZEluZm8uRGlzcGxheVN0YXRzKSB7CisgICAgICAgIGlmIChwQUMtPkR5bklycU1vZEluZm8uSW50TW9kVHlwZVNlbGVjdCA9PSBDX0lOVF9NT0RfU1RBVElDKSB7CisgICAgICAgICAgICAgcHJpbnRrKCJTdGF0aWMgaW50IG1vZGVyYXRpb24gcnVucyB3aXRoICVpIElOVFMvc2VjXG4iLAorICAgICAgICAgICAgICAgICAgICBwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYyk7CisgICAgICAgIH0gZWxzZSBpZiAocEFDLT5EeW5JcnFNb2RJbmZvLkludE1vZFR5cGVTZWxlY3QgPT0gQ19JTlRfTU9EX0RZTkFNSUMpIHsKKyAgICAgICAgICAgICBpZiAoSXNJbnRNb2RFbmFibGVkKHBBQykpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIkR5bmFtaWMgaW50IG1vZGVyYXRpb24gcnVucyB3aXRoICVpIElOVFMvc2VjXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYyk7CisgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIkR5bmFtaWMgaW50IG1vZGVyYXRpb24gY3VycmVudGx5IG5vdCBhcHBsaWVkXG4iKTsKKyAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgcHJpbnRrKCJObyBpbnRlcnJ1cHQgbW9kZXJhdGlvbiBzZWxlY3RlZCFcbiIpOworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogRGlzcGxheVNlbGVjdGVkTW9kZXJhdGlvbk1hc2soKQorKiogRGVzY3JpcHRpb24gIDogRGlzcGxheXMgd2hhdCBpbnRlcnJ1cHRzIGFyZSBtb2RlcmF0ZWQKKyoqIFByb2dyYW1tZXIgICA6IFJhbHBoIFJvZXNsZXIKKyoqIExhc3QgTW9kaWZpZWQ6IDIzLW1hci0wMworKiogUmV0dXJucyAgICAgIDogdm9pZCEKKyoqIE5vdGVzICAgICAgICA6IC0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitEaXNwbGF5U2VsZWN0ZWRNb2RlcmF0aW9uTWFzayhTS19BQyAqcEFDKSB7CisKKyAgICBpZiAocEFDLT5EeW5JcnFNb2RJbmZvLkRpc3BsYXlTdGF0cykgeworICAgICAgICBpZiAocEFDLT5EeW5JcnFNb2RJbmZvLkludE1vZFR5cGVTZWxlY3QgIT0gQ19JTlRfTU9EX05PTkUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAocEFDLT5EeW5JcnFNb2RJbmZvLk1hc2tJcnFNb2RlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSBJUlFfTUFTS19UWF9PTkxZOiAKKyAgICAgICAgICAgICAgICAgICBwcmludGsoIk9ubHkgVHgtaW50ZXJydXB0cyBhcmUgbW9kZXJhdGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElSUV9NQVNLX1JYX09OTFk6IAorICAgICAgICAgICAgICAgICAgIHByaW50aygiT25seSBSeC1pbnRlcnJ1cHRzIGFyZSBtb2RlcmF0ZWRcbiIpOworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSVJRX01BU0tfU1BfT05MWTogCisgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJPbmx5IHNwZWNpYWwtaW50ZXJydXB0cyBhcmUgbW9kZXJhdGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElSUV9NQVNLX1RYX1JYOiAKKyAgICAgICAgICAgICAgICAgICBwcmludGsoIlR4LSBhbmQgUngtaW50ZXJydXB0cyBhcmUgbW9kZXJhdGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElSUV9NQVNLX1NQX1JYOiAKKyAgICAgICAgICAgICAgICAgICBwcmludGsoIlNwZWNpYWwtIGFuZCBSeC1pbnRlcnJ1cHRzIGFyZSBtb2RlcmF0ZWRcbiIpOworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSVJRX01BU0tfU1BfVFg6IAorICAgICAgICAgICAgICAgICAgIHByaW50aygiU3BlY2lhbC0gYW5kIFR4LWludGVycnVwdHMgYXJlIG1vZGVyYXRlZFxuIik7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJUlFfTUFTS19SWF9UWF9TUDoKKyAgICAgICAgICAgICAgICAgICBwcmludGsoIkFsbCBSeC0sIFR4IGFuZCBzcGVjaWFsLWludGVycnVwdHMgYXJlIG1vZGVyYXRlZFxuIik7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICBwcmludGsoIkRvbid0IGtub3cgd2hhdCBpcyBtb2RlcmF0ZWRcbiIpOworICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRrKCJObyBzcGVjaWZpYyBpbnRlcnJ1cHRzIG1hc2tlZCBmb3IgbW9kZXJhdGlvblxuIik7CisgICAgICAgIH0KKyAgICB9IAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRnVuY3Rpb24gICAgIDogRGlzcGxheURlc2NyUmF0aW8KKyoqIERlc2NyaXB0aW9uICA6IExpa2UgdGhlIG5hbWUgc3RhdGVzLi4uCisqKiBQcm9ncmFtbWVyICAgOiBSYWxwaCBSb2VzbGVyCisqKiBMYXN0IE1vZGlmaWVkOiAyMy1tYXItMDMKKyoqIFJldHVybnMgICAgICA6IHZvaWQhCisqKiBOb3RlcyAgICAgICAgOiAtCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorRGlzcGxheURlc2NyUmF0aW8oU0tfQUMgKnBBQykgeworICAgIGludCBUb3RhbE1heE5ickRlc2NyID0gMDsKKworICAgIGlmIChwQUMtPkR5bklycU1vZEluZm8uRGlzcGxheVN0YXRzKSB7CisgICAgICAgIFRvdGFsTWF4TmJyRGVzY3IgPSBwQUMtPlJ4RGVzY3JQZXJSaW5nICogR2V0UnhDYWxscyhwQUMpOworICAgICAgICBwcmludGsoIlJhdGlvIGRlc2NyaXB0b3JzOiAlaS8laVxuIiwKKyAgICAgICAgICAgICAgIE1fRElNSU5GTy5OYnJQcm9jZXNzZWREZXNjciwgVG90YWxNYXhOYnJEZXNjcik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIEVuZCBvZiBmaWxlCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tldGh0b29sLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZXRodG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNjM5OTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZXRodG9vbC5jCkBAIC0wLDAgKzEsNTUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZTogICAgICAgIHNrZXRodG9vbC5jCisgKiBQcm9qZWN0OiAgICAgR0VuZXNpcywgUENJIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgorICogVmVyc2lvbjogICAgICRSZXZpc2lvbjogMS43ICQKKyAqIERhdGU6ICAgICAgICAkRGF0ZTogMjAwNC8wOS8yOSAxMzozMjowNyAkCisgKiBQdXJwb3NlOiAgICAgQWxsIGZ1bmN0aW9ucyByZWdhcmRpbmcgZXRodG9vbCBoYW5kbGluZworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDQgTWFydmVsbC4KKyAqCisgKglEcml2ZXIgZm9yIE1hcnZlbGwgWXVrb24vMiBjaGlwc2V0IGFuZCBTeXNLb25uZWN0IEdpZ2FiaXQgRXRoZXJuZXQgCisgKiAgICAgIFNlcnZlciBBZGFwdGVycy4KKyAqCisgKglBdXRob3I6IFJhbHBoIFJvZXNsZXIgKHJyb2VzbGVyQHN5c2tvbm5lY3QuZGUpCisgKgkgICAgICAgIE1pcmtvIExpbmRuZXIgKG1saW5kbmVyQHN5c2tvbm5lY3QuZGUpCisgKgorICoJQWRkcmVzcyBhbGwgcXVlc3Rpb24gdG86IGxpbnV4QHN5c2tvbm5lY3QuZGUKKyAqCisgKglUaGUgdGVjaG5pY2FsIG1hbnVhbCBmb3IgdGhlIGFkYXB0ZXJzIGlzIGF2YWlsYWJsZSBmcm9tIFN5c0tvbm5lY3QncworICoJd2ViIHBhZ2VzOiB3d3cuc3lza29ubmVjdC5jb20KKyAqCQorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJoL3NrZHJ2MXN0LmgiCisjaW5jbHVkZSAiaC9za2RydjJuZC5oIgorI2luY2x1ZGUgImgvc2t2ZXJzaW9uLmgiCisKKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGVmaW5lcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTVVBQX0NPUFBFUl9BTEwgKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGZ8IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIFNVUFBPUlRFRF9UUCkKKworI2RlZmluZSBBRFZfQ09QUEVSX0FMTCAgKEFEVkVSVElTRURfMTBiYXNlVF9IYWxmICB8IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZnwgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEFEVkVSVElTRURfVFApCisKKyNkZWZpbmUgU1VQUF9GSUJSRV9BTEwgIChTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgU1VQUE9SVEVEX0ZJQlJFICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIFNVUFBPUlRFRF9BdXRvbmVnKQorCisjZGVmaW5lIEFEVl9GSUJSRV9BTEwgICAoQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRFZFUlRJU0VEX0ZJQlJFICAgICAgICAgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEFEVkVSVElTRURfQXV0b25lZykKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTG9jYWwgRnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJZ2V0U2V0dGluZ3MgLSByZXRyaWV2ZXMgdGhlIGN1cnJlbnQgc2V0dGluZ3Mgb2YgdGhlIHNlbGVjdGVkIGFkYXB0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb2YgdGhlIHNlbGVjdGVkIGFkYXB0ZXIgaXMgcmV0dXJuZWQuCisgKglUaGlzIGNvbmZpZ3VyYXRpb24gaW52b2x2ZXMgYSlzcGVlZCwgYilkdXBsZXggYW5kIGMpYXV0b25lZyBwbHVzCisgKglhIG51bWJlciBvZiBvdGhlciB2YXJpYWJsZXMuCisgKgorICogUmV0dXJuczogICAgYWx3YXlzIDAKKyAqCisgKi8KK3N0YXRpYyBpbnQgZ2V0U2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCWNvbnN0IERFVl9ORVQgKnBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBwb3J0ID0gcE5ldC0+UG9ydE5yOworCWNvbnN0IFNLX0FDICpwQUMgPSBwTmV0LT5wQUM7CisJY29uc3QgU0tfR0VQT1JUICpwUG9ydCA9ICZwQUMtPkdJbmkuR1BbcG9ydF07CisKKwlzdGF0aWMgaW50IER1cGxleEF1dG9OZWdDb25mTWFwWzldWzNdPSB7CisJCXsgLTEgICAgICAgICAgICAgICAgICAgICAsIC0xICAgICAgICAgLCAtMSAgICAgICAgICAgICAgfSwKKwkJeyAwICAgICAgICAgICAgICAgICAgICAgICwgLTEgICAgICAgICAsIC0xICAgICAgICAgICAgICB9LAorCQl7IFNLX0xNT0RFX0hBTEYgICAgICAgICAgLCBEVVBMRVhfSEFMRiwgQVVUT05FR19ESVNBQkxFIH0sCisJCXsgU0tfTE1PREVfRlVMTCAgICAgICAgICAsIERVUExFWF9GVUxMLCBBVVRPTkVHX0RJU0FCTEUgfSwKKwkJeyBTS19MTU9ERV9BVVRPSEFMRiAgICAgICwgRFVQTEVYX0hBTEYsIEFVVE9ORUdfRU5BQkxFICB9LAorCQl7IFNLX0xNT0RFX0FVVE9GVUxMICAgICAgLCBEVVBMRVhfRlVMTCwgQVVUT05FR19FTkFCTEUgIH0sCisJCXsgU0tfTE1PREVfQVVUT0JPVEggICAgICAsIERVUExFWF9GVUxMLCBBVVRPTkVHX0VOQUJMRSAgfSwKKwkJeyBTS19MTU9ERV9BVVRPU0VOU0UgICAgICwgLTEgICAgICAgICAsIC0xICAgICAgICAgICAgICB9LAorCQl7IFNLX0xNT0RFX0lOREVURVJNSU5BVEVELCAtMSAgICAgICAgICwgLTEgICAgICAgICAgICAgIH0KKwl9OworCXN0YXRpYyBpbnQgU3BlZWRDb25mTWFwWzZdWzJdID0geworCQl7IDAgICAgICAgICAgICAgICAgICAgICAgICwgLTEgICAgICAgICB9LAorCQl7IFNLX0xTUEVFRF9BVVRPICAgICAgICAgICwgLTEgICAgICAgICB9LAorCQl7IFNLX0xTUEVFRF8xME1CUFMgICAgICAgICwgU1BFRURfMTAgICB9LAorCQl7IFNLX0xTUEVFRF8xMDBNQlBTICAgICAgICwgU1BFRURfMTAwICB9LAorCQl7IFNLX0xTUEVFRF8xMDAwTUJQUyAgICAgICwgU1BFRURfMTAwMCB9LAorCQl7IFNLX0xTUEVFRF9JTkRFVEVSTUlOQVRFRCwgLTEgICAgICAgICB9CisJfTsKKwlzdGF0aWMgaW50IEFkdlNwZWVkTWFwWzZdWzJdID0geworCQl7IDAgICAgICAgICAgICAgICAgICAgICAgICwgLTEgICAgICAgICB9LAorCQl7IFNLX0xTUEVFRF9BVVRPICAgICAgICAgICwgLTEgICAgICAgICB9LAorCQl7IFNLX0xTUEVFRF8xME1CUFMgICAgICAgICwgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgICB8IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsIH0sCisJCXsgU0tfTFNQRUVEXzEwME1CUFMgICAgICAgLCBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgIHwgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsIH0sCisJCXsgU0tfTFNQRUVEXzEwMDBNQlBTICAgICAgLCBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbH0sCisJCXsgU0tfTFNQRUVEX0lOREVURVJNSU5BVEVELCAtMSAgICAgICAgIH0KKwl9OworCisJZWNtZC0+cGh5X2FkZHJlc3MgPSBwb3J0OworCWVjbWQtPnNwZWVkICAgICAgID0gU3BlZWRDb25mTWFwW3BQb3J0LT5QTGlua1NwZWVkVXNlZF1bMV07CisJZWNtZC0+ZHVwbGV4ICAgICAgPSBEdXBsZXhBdXRvTmVnQ29uZk1hcFtwUG9ydC0+UExpbmtNb2RlU3RhdHVzXVsxXTsKKwllY21kLT5hdXRvbmVnICAgICA9IER1cGxleEF1dG9OZWdDb25mTWFwW3BQb3J0LT5QTGlua01vZGVTdGF0dXNdWzJdOworCWVjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsKKworCWlmIChwQUMtPkdJbmkuR0lDb3BwZXJUeXBlKSB7CisJCWVjbWQtPnBvcnQgICAgICAgID0gUE9SVF9UUDsKKwkJZWNtZC0+c3VwcG9ydGVkICAgPSAoU1VQUF9DT1BQRVJfQUxMfFNVUFBPUlRFRF9BdXRvbmVnKTsKKwkJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCWVjbWQtPnN1cHBvcnRlZCAmPSB+KFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYpOworCQkJZWNtZC0+c3VwcG9ydGVkICY9IH4oU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCk7CisJCQllY21kLT5zdXBwb3J0ZWQgJj0gfihTVVBQT1JURURfMTAwYmFzZVRfSGFsZik7CisJCQllY21kLT5zdXBwb3J0ZWQgJj0gfihTVVBQT1JURURfMTAwYmFzZVRfRnVsbCk7CisJCX0gZWxzZSB7CisJCQlpZiAocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfWVVLT04pIHsKKwkJCQllY21kLT5zdXBwb3J0ZWQgJj0gfihTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYpOworCQkJfSAKKyNpZmRlZiBDSElQX0lEX1lVS09OX0ZFCisJCQlpZiAocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfWVVLT05fRkUpIHsKKwkJCQllY21kLT5zdXBwb3J0ZWQgJj0gfihTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYpOworCQkJCWVjbWQtPnN1cHBvcnRlZCAmPSB+KFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCk7CisJCQl9CisjZW5kaWYKKwkJfQorCQlpZiAocEFDLT5HSW5pLkdQWzBdLlBMaW5rU3BlZWQgIT0gU0tfTFNQRUVEX0FVVE8pIHsKKwkJCWVjbWQtPmFkdmVydGlzaW5nID0gQWR2U3BlZWRNYXBbcFBvcnQtPlBMaW5rU3BlZWRdWzFdOworCQkJaWYgKHBBQy0+R0luaS5HSUNoaXBJZCA9PSBDSElQX0lEX1lVS09OKSB7CisJCQkJZWNtZC0+YWR2ZXJ0aXNpbmcgJj0gfihTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYpOworCQkJfSAKKwkJfSBlbHNlIHsKKwkJCWVjbWQtPmFkdmVydGlzaW5nID0gZWNtZC0+c3VwcG9ydGVkOworCQl9CisKKwkJaWYgKGVjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIAorCQkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9BdXRvbmVnOworCX0gZWxzZSB7CisJCWVjbWQtPnBvcnQgICAgICAgID0gUE9SVF9GSUJSRTsKKwkJZWNtZC0+c3VwcG9ydGVkICAgPSBTVVBQX0ZJQlJFX0FMTDsKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgPSBBRFZfRklCUkVfQUxMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE1JQiBpbmZyYXN0cnVjdHVyZSB1c2VzIGluc3RhbmNlIHZhbHVlIHN0YXJ0aW5nIGF0IDEKKyAqIGJhc2VkIG9uIGJvYXJkIGFuZCBwb3J0LgorICovCitzdGF0aWMgaW5saW5lIHUzMiBwbm1pSW5zdGFuY2UoY29uc3QgREVWX05FVCAqcE5ldCkKK3sKKwlyZXR1cm4gMSArIChwTmV0LT5wQUMtPlJsbXROZXRzID09IDIpICsgcE5ldC0+UG9ydE5yOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglzZXRTZXR0aW5ncyAtIGNvbmZpZ3VyZXMgdGhlIHNldHRpbmdzIG9mIGEgc2VsZWN0ZWQgYWRhcHRlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJUG9zc2libGUgc2V0dGluZ3MgdGhhdCBtYXkgYmUgYWx0ZXJlZCBhcmUgYSlzcGVlZCwgYilkdXBsZXggb3IgCisgKgljKWF1dG9uZWdvdGlhdGlvbi4KKyAqCisgKiBSZXR1cm5zOgorICoJMDoJZXZlcnl0aGluZyBmaW5lLCBubyBlcnJvcgorICoJPDA6CXRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGVycm9yIGNvZGUgb2YgdGhlIGZhaWx1cmUgCisgKi8KK3N0YXRpYyBpbnQgc2V0U2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCURFVl9ORVQgKnBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCVNLX0FDICpwQUMgPSBwTmV0LT5wQUM7CisJdTMyIGluc3RhbmNlOworCWNoYXIgYnVmWzRdOworCWludCBsZW4gPSAxOworCisJaWYgKGVjbWQtPnNwZWVkICE9IFNQRUVEXzEwICYmIGVjbWQtPnNwZWVkICE9IFNQRUVEXzEwMCAKKwkgICAgJiYgZWNtZC0+c3BlZWQgIT0gU1BFRURfMTAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZWNtZC0+ZHVwbGV4ICE9IERVUExFWF9IQUxGICYmIGVjbWQtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZWNtZC0+YXV0b25lZyAhPSBBVVRPTkVHX0RJU0FCTEUgJiYgZWNtZC0+YXV0b25lZyAhPSBBVVRPTkVHX0VOQUJMRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZWNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUpCisJCSpidWYgPSAoZWNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKSAKKwkJCT8gU0tfTE1PREVfRlVMTCA6IFNLX0xNT0RFX0hBTEY7CisJZWxzZQorCQkqYnVmID0gKGVjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkgCisJCQk/IFNLX0xNT0RFX0FVVE9GVUxMIDogU0tfTE1PREVfQVVUT0hBTEY7CisJCisJaW5zdGFuY2UgPSBwbm1pSW5zdGFuY2UocE5ldCk7CisJaWYgKFNrUG5taVNldFZhcihwQUMsIHBBQy0+SW9CYXNlLCBPSURfU0tHRV9MSU5LX01PREUsIAorCQkJICAgJmJ1ZiwgJmxlbiwgaW5zdGFuY2UsIHBOZXQtPk5ldE5yKSAhPSBTS19QTk1JX0VSUl9PSykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2goZWNtZC0+c3BlZWQpIHsKKwljYXNlIFNQRUVEXzEwMDA6CisJCSpidWYgPSBTS19MU1BFRURfMTAwME1CUFM7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwOgorCQkqYnVmID0gU0tfTFNQRUVEXzEwME1CUFM7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTA6CisJCSpidWYgPSBTS19MU1BFRURfMTBNQlBTOworCX0KKworCWlmIChTa1BubWlTZXRWYXIocEFDLCBwQUMtPklvQmFzZSwgT0lEX1NLR0VfU1BFRURfTU9ERSwgCisJCQkgJmJ1ZiwgJmxlbiwgaW5zdGFuY2UsIHBOZXQtPk5ldE5yKSAhPSBTS19QTk1JX0VSUl9PSykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCWdldERyaXZlckluZm8gLSByZXR1cm5zIGdlbmVyaWMgZHJpdmVyIGFuZCBhZGFwdGVyIGluZm9ybWF0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKglHZW5lcmljIGRyaXZlciBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCB2aWEgdGhpcyBmdW5jdGlvbiwgc3VjaCBhcworICoJdGhlIG5hbWUgb2YgdGhlIGRyaXZlciwgaXRzIHZlcnNpb24gYW5kIGFuZCBmaXJtd2FyZSB2ZXJzaW9uLgorICoJSW4gYWRkaXRpb24gdG8gdGhpcywgdGhlIGxvY2F0aW9uIG9mIHRoZSBzZWxlY3RlZCBhZGFwdGVyIGlzIAorICoJcmV0dXJuZWQgYXMgYSBidXMgaW5mbyBzdHJpbmcgKGUuZy4gJzAxOjA1LjAnKS4KKyAqCQorICogUmV0dXJuczoJTi9BCisgKgorICovCitzdGF0aWMgdm9pZCBnZXREcml2ZXJJbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJY29uc3QgREVWX05FVAkqcE5ldCA9IG5ldGRldl9wcml2KGRldik7CisJY29uc3QgU0tfQUMgKnBBQyA9IHBOZXQtPnBBQzsKKwljaGFyIHZlcnNbMzJdOworCisJc25wcmludGYodmVycywgc2l6ZW9mKHZlcnMpLTEsIFZFUl9TVFJJTkcgIih2JWQuJWQpIiwKKwkJKHBBQy0+R0luaS5HSVBjaUh3UmV2ID4+IDQpICYgMHhmLCBwQUMtPkdJbmkuR0lQY2lId1JldiAmIDB4Zik7CisKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJJVkVSX0ZJTEVfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCB2ZXJzKTsKKwlzdHJjcHkoaW5mby0+ZndfdmVyc2lvbiwgIk4vQSIpOworCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHBBQy0+UGNpRGV2KSwgRVRIVE9PTF9CVVNJTkZPX0xFTik7Cit9CisKKy8qCisgKiBFdGh0b29sIHN0YXRpc3RpY3Mgc3VwcG9ydC4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgU3RyaW5nc1N0YXRzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKKwkicnhfcGFja2V0cyIsCSJ0eF9wYWNrZXRzIiwKKwkicnhfYnl0ZXMiLAkidHhfYnl0ZXMiLAorCSJyeF9lcnJvcnMiLAkidHhfZXJyb3JzIiwJCisJInJ4X2Ryb3BwZWQiLAkidHhfZHJvcHBlZCIsCisJIm11bHRpY2FzdHMiLAkiY29sbGlzaW9ucyIsCQorCSJyeF9sZW5ndGhfZXJyb3JzIiwJCSJyeF9idWZmZXJfb3ZlcmZsb3dfZXJyb3JzIiwKKwkicnhfY3JjX2Vycm9ycyIsCQkicnhfZnJhbWVfZXJyb3JzIiwKKwkicnhfdG9vX3Nob3J0X2Vycm9ycyIsCQkicnhfdG9vX2xvbmdfZXJyb3JzIiwKKwkicnhfY2Fycmllcl9leHRlbnNpb25fZXJyb3JzIiwJInJ4X3N5bWJvbF9lcnJvcnMiLAorCSJyeF9sbGNfbWFjX3NpemVfZXJyb3JzIiwJInJ4X2NhcnJpZXJfZXJyb3JzIiwJCisJInJ4X2phYmJlcl9lcnJvcnMiLAkJInJ4X21pc3NlZF9lcnJvcnMiLAorCSJ0eF9hYm9ydF9jb2xsaXNpb25fZXJyb3JzIiwJInR4X2NhcnJpZXJfZXJyb3JzIiwKKwkidHhfYnVmZmVyX3VuZGVycnVuX2Vycm9ycyIsCSJ0eF9oZWFydGJlYXRfZXJyb3JzIiwKKwkidHhfd2luZG93X2Vycm9ycyIsCit9OworCitzdGF0aWMgaW50IGdldFN0YXRzQ291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gQVJSQVlfU0laRShTdHJpbmdzU3RhdHMpOworfQorCitzdGF0aWMgdm9pZCBnZXRTdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpkYXRhKQoreworCXN3aXRjaChzdHJpbmdzZXQpIHsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJbWVtY3B5KGRhdGEsICpTdHJpbmdzU3RhdHMsIHNpemVvZihTdHJpbmdzU3RhdHMpKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBnZXRFdGh0b29sU3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHU2NCAqZGF0YSkKK3sKKwljb25zdCBERVZfTkVUCSpwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljb25zdCBTS19BQyAqcEFDID0gcE5ldC0+cEFDOworCWNvbnN0IFNLX1BOTUlfU1RSVUNUX0RBVEEgKnBQbm1pU3RydWN0ID0gJnBBQy0+UG5taVN0cnVjdDsKKworCSpkYXRhKysgPSBwUG5taVN0cnVjdC0+U3RhdFswXS5TdGF0UnhPa0N0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFR4T2tDdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRSeE9jdGV0c09rQ3RzOworCSpkYXRhKysgPSBwUG5taVN0cnVjdC0+U3RhdFswXS5TdGF0VHhPY3RldHNPa0N0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPkluRXJyb3JzQ3RzOworCSpkYXRhKysgPSBwUG5taVN0cnVjdC0+U3RhdFswXS5TdGF0VHhTaW5nbGVDb2xsaXNpb25DdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5SeE5vQnVmQ3RzOworCSpkYXRhKysgPSBwUG5taVN0cnVjdC0+VHhOb0J1ZkN0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFJ4TXVsdGljYXN0T2tDdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRUeFNpbmdsZUNvbGxpc2lvbkN0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFJ4UnVudEN0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFJ4Rmlmb092ZXJmbG93Q3RzOworCSpkYXRhKysgPSBwUG5taVN0cnVjdC0+U3RhdFswXS5TdGF0UnhGY3NDdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRSeEZyYW1pbmdDdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRSeFNob3J0c0N0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFJ4VG9vTG9uZ0N0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFJ4Q2V4dEN0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFJ4U3ltYm9sQ3RzOworCSpkYXRhKysgPSBwUG5taVN0cnVjdC0+U3RhdFswXS5TdGF0UnhJUkxlbmd0aEN0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFJ4Q2FycmllckN0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFJ4SmFiYmVyQ3RzOworCSpkYXRhKysgPSBwUG5taVN0cnVjdC0+U3RhdFswXS5TdGF0UnhNaXNzZWRDdHM7CisJKmRhdGErKyA9IHBBQy0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRUeENhcnJpZXJDdHM7CisJKmRhdGErKyA9IHBQbm1pU3RydWN0LT5TdGF0WzBdLlN0YXRUeEZpZm9VbmRlcnJ1bkN0czsKKwkqZGF0YSsrID0gcFBubWlTdHJ1Y3QtPlN0YXRbMF0uU3RhdFR4Q2FycmllckN0czsKKwkqZGF0YSsrID0gcEFDLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAl0b2dnbGVMZWRzIC0gQ2hhbmdlcyB0aGUgTEVEIHN0YXRlIG9mIGFuIGFkYXB0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbGwgTEVEcyBvZiBhbiBhZGFwdGVyIHNvCisgKgl0aGF0IGl0IGNhbiBiZSBsb2NhdGVkIGJ5IGEgdXNlci4gCisgKgorICogUmV0dXJuczoJTi9BCisgKgorICovCitzdGF0aWMgdm9pZCB0b2dnbGVMZWRzKERFVl9ORVQgKnBOZXQsIGludCBvbikKK3sKKwlTS19BQyAqcEFDID0gcE5ldC0+cEFDOworCWludCBwb3J0ID0gcE5ldC0+UG9ydE5yOworCXZvaWQgX19pb21lbSAqaW8gPSBwQUMtPklvQmFzZTsKKworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCVNLX09VVDgoaW8sIE1SX0FERFIocG9ydCxMTktfTEVEX1JFRyksIAorCQkJb24gPyBTS19MTktfT04gOiBTS19MTktfT0ZGKTsKKwkJU2tHZVllbGxvd0xFRChwQUMsIGlvLCAKKwkJCSAgICAgIG9uID8gKExFRF9PTiA+PiAxKSA6IChMRURfT0ZGID4+IDEpKTsKKwkJU2tHZVhtaXRMRUQocEFDLCBpbywgTVJfQUREUihwb3J0LFJYX0xFRF9JTkkpLAorCQkJICAgIG9uID8gU0tfTEVEX1RTVCA6IFNLX0xFRF9ESVMpOworCisJCWlmIChwQUMtPkdJbmkuR1BbcG9ydF0uUGh5VHlwZSA9PSBTS19QSFlfQkNPTSkKKwkJCVNrWG1QaHlXcml0ZShwQUMsIGlvLCBwb3J0LCBQSFlfQkNPTV9QX0VYVF9DVFJMLCAKKwkJCQkgICAgIG9uID8gUEhZX0JfUEVDX0xFRF9PTiA6IFBIWV9CX1BFQ19MRURfT0ZGKTsKKwkJZWxzZSBpZiAocEFDLT5HSW5pLkdQW3BvcnRdLlBoeVR5cGUgPT0gU0tfUEhZX0xPTkUpCisJCQlTa1htUGh5V3JpdGUocEFDLCBpbywgcG9ydCwgUEhZX0xPTkVfTEVEX0NGRywKKwkJCQkgICAgIG9uID8gMHgwODAwIDogUEhZX0xfTENfTEVEVCk7CisJCWVsc2UKKwkJCVNrR2VYbWl0TEVEKHBBQywgaW8sIE1SX0FERFIocG9ydCxUWF9MRURfSU5JKSwKKwkJCQkgICAgb24gPyBTS19MRURfVFNUIDogU0tfTEVEX0RJUyk7CisJfSBlbHNlIHsKKwkJY29uc3QgdTE2IFl1a0xlZE9uID0gKFBIWV9NX0xFRF9NT19EVVAoTU9fTEVEX09OKSAgfAorCQkJCSAgICAgIFBIWV9NX0xFRF9NT18xMChNT19MRURfT04pICAgfAorCQkJCSAgICAgIFBIWV9NX0xFRF9NT18xMDAoTU9fTEVEX09OKSAgfAorCQkJCSAgICAgIFBIWV9NX0xFRF9NT18xMDAwKE1PX0xFRF9PTikgfCAKKwkJCQkgICAgICBQSFlfTV9MRURfTU9fUlgoTU9fTEVEX09OKSk7CisJCWNvbnN0IHUxNiAgWXVrTGVkT2ZmID0gKFBIWV9NX0xFRF9NT19EVVAoTU9fTEVEX09GRikgIHwKKwkJCQkJUEhZX01fTEVEX01PXzEwKE1PX0xFRF9PRkYpICAgfAorCQkJCQlQSFlfTV9MRURfTU9fMTAwKE1PX0xFRF9PRkYpICB8CisJCQkJCVBIWV9NX0xFRF9NT18xMDAwKE1PX0xFRF9PRkYpIHwgCisJCQkJCVBIWV9NX0xFRF9NT19SWChNT19MRURfT0ZGKSk7CisJCisKKwkJU2tHbVBoeVdyaXRlKHBBQyxpbyxwb3J0LFBIWV9NQVJWX0xFRF9DVFJMLDApOworCQlTa0dtUGh5V3JpdGUocEFDLGlvLHBvcnQsUEhZX01BUlZfTEVEX09WRVIsIAorCQkJICAgICBvbiA/IFl1a0xlZE9uIDogWXVrTGVkT2ZmKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlza0dlQmxpbmtUaW1lciAtIENoYW5nZXMgdGhlIExFRCBzdGF0ZSBvZiBhbiBhZGFwdGVyCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYWxsIExFRHMgb2YgYW4gYWRhcHRlciBzbworICoJdGhhdCBpdCBjYW4gYmUgbG9jYXRlZCBieSBhIHVzZXIuIElmIHRoZSByZXF1ZXN0ZWQgdGltZSBpbnRlcnZhbCBmb3IKKyAqCXRoaXMgdGVzdCBoYXMgZWxhcHNlZCwgdGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgZXZlcnl0aGluZyB0aGF0IHdhcyAKKyAqCXRlbXBvcmFyaWx5IHNldHVwIGR1cmluZyB0aGUgbG9jYXRlIE5JQyB0ZXN0LiBUaGlzIGludm9sdmVzIG9mIGNvdXJzZQorICoJYWxzbyBjbG9zaW5nIG9yIG9wZW5pbmcgYW55IGFkYXB0ZXIgc28gdGhhdCB0aGUgaW5pdGlhbCBib2FyZCBzdGF0ZSAKKyAqCWlzIHJlY292ZXJlZC4KKyAqCisgKiBSZXR1cm5zOglOL0EKKyAqCisgKi8KK3ZvaWQgU2tHZUJsaW5rVGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKKwlERVZfTkVUICpwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlTS19BQyAqcEFDID0gcE5ldC0+cEFDOworCisJdG9nZ2xlTGVkcyhwTmV0LCBwQUMtPkxlZHNPbik7CisKKwlwQUMtPkxlZHNPbiA9ICFwQUMtPkxlZHNPbjsKKwltb2RfdGltZXIoJnBBQy0+QmxpbmtUaW1lciwgamlmZmllcyArIEhaLzQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJbG9jYXRlRGV2aWNlIC0gc3RhcnQgdGhlIGxvY2F0ZSBOSUMgZmVhdHVyZSBvZiB0aGUgZWxlY3RlZCBhZGFwdGVyIAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGlmIHRoZSB1c2VyIHdhbnQgdG8gbG9jYXRlIGEgcGFydGljdWxhciBOSUMuCisgKglBbGwgTEVEcyBhcmUgcmVndWxhcmx5IHN3aXRjaGVkIG9uIGFuZCBvZmYsIHNvIHRoZSBOSUMgY2FuIGVhc2lseQorICoJYmUgaWRlbnRpZmllZC4KKyAqCisgKiBSZXR1cm5zOgkKKyAqCT09MDoJZXZlcnl0aGluZyBmaW5lLCBubyBlcnJvciwgbG9jYXRlTklDIHRlc3Qgd2FzIHN0YXJ0ZWQKKyAqCSE9MDoJb25lIGxvY2F0ZU5JQyB0ZXN0IHJ1bnMgYWxyZWFkeQorICoKKyAqLworc3RhdGljIGludCBsb2NhdGVEZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCit7CisJREVWX05FVCAqcE5ldCA9IG5ldGRldl9wcml2KGRldik7CisJU0tfQUMgKnBBQyA9IHBOZXQtPnBBQzsKKworCWlmKCFkYXRhIHx8IGRhdGEgPiAodTMyKShNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKSkKKwkJZGF0YSA9ICh1MzIpKE1BWF9TQ0hFRFVMRV9USU1FT1VUIC8gSFopOworCisJLyogc3RhcnQgYmxpbmtpbmcgKi8KKwlwQUMtPkxlZHNPbiA9IDA7CisJbW9kX3RpbWVyKCZwQUMtPkJsaW5rVGltZXIsIGppZmZpZXMpOworCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGRhdGEgKiAxMDAwKTsKKwlkZWxfdGltZXJfc3luYygmcEFDLT5CbGlua1RpbWVyKTsKKwl0b2dnbGVMZWRzKHBOZXQsIDApOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlnZXRQYXVzZVBhcmFtcyAtIHJldHJpZXZlcyB0aGUgcGF1c2UgcGFyYW1ldGVycworICoKKyAqIERlc2NyaXB0aW9uOgorICoJQWxsIGN1cnJlbnQgcGF1c2UgcGFyYW1ldGVycyBvZiBhIHNlbGVjdGVkIGFkYXB0ZXIgYXJlIHBsYWNlZCAKKyAqCWluIHRoZSBwYXNzZWQgZXRodG9vbF9wYXVzZXBhcmFtIHN0cnVjdHVyZSBhbmQgYXJlIHJldHVybmVkLgorICoKKyAqIFJldHVybnM6CU4vQQorICoKKyAqLworc3RhdGljIHZvaWQgZ2V0UGF1c2VQYXJhbXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZXBhdXNlKSAKK3sKKwlERVZfTkVUCSpwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlTS19BQyAqcEFDID0gcE5ldC0+cEFDOworCVNLX0dFUE9SVCAqcFBvcnQgPSAmcEFDLT5HSW5pLkdQW3BOZXQtPlBvcnROcl07CisKKwllcGF1c2UtPnJ4X3BhdXNlID0gKHBQb3J0LT5QRmxvd0N0cmxNb2RlID09IFNLX0ZMT1dfTU9ERV9TWU1NRVRSSUMpIHx8CisJCSAgKHBQb3J0LT5QRmxvd0N0cmxNb2RlID09IFNLX0ZMT1dfTU9ERV9TWU1fT1JfUkVNKTsKKworCWVwYXVzZS0+dHhfcGF1c2UgPSBlcGF1c2UtPnJ4X3BhdXNlIHx8IChwUG9ydC0+UEZsb3dDdHJsTW9kZSA9PSBTS19GTE9XX01PREVfTE9DX1NFTkQpOworCWVwYXVzZS0+YXV0b25lZyA9IGVwYXVzZS0+cnhfcGF1c2UgfHwgZXBhdXNlLT50eF9wYXVzZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJc2V0UGF1c2VQYXJhbXMgLSBjb25maWd1cmVzIHRoZSBwYXVzZSBwYXJhbWV0ZXJzIG9mIGFuIGFkYXB0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgUnggb3IgVHggcGF1c2UgcGFyYW1ldGVycyAKKyAqCisgKiBSZXR1cm5zOgorICoJPT0wOglldmVyeXRoaW5nIGZpbmUsIG5vIGVycm9yCisgKgkhPTA6CXRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGVycm9yIGNvZGUgb2YgdGhlIGZhaWx1cmUgCisgKi8KK3N0YXRpYyBpbnQgc2V0UGF1c2VQYXJhbXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiAsIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKmVwYXVzZSkKK3sKKwlERVZfTkVUCSpwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlTS19BQyAqcEFDID0gcE5ldC0+cEFDOworCVNLX0dFUE9SVCAqcFBvcnQgPSAmcEFDLT5HSW5pLkdQW3BOZXQtPlBvcnROcl07CisJdTMyCWluc3RhbmNlID0gcG5taUluc3RhbmNlKHBOZXQpOworCXN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gb2xkOworCXU4CW9sZHNwZWVkID0gcFBvcnQtPlBMaW5rU3BlZWRVc2VkOworCWNoYXIJYnVmWzRdOworCWludAlsZW4gPSAxOworCWludCByZXQ7CisKKwkvKgorCSoqIHdlIGhhdmUgdG8gZGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNldHRpbmdzIHRvIHNlZSBpZiAKKwkqKiB0aGUgb3BlcmF0b3IgcmVxdWVzdGVkIGFueSBtb2RpZmljYXRpb24gb2YgdGhlIGZsb3cgCisJKiogY29udHJvbCBwYXJhbWV0ZXJzLi4uCisJKi8KKwlnZXRQYXVzZVBhcmFtcyhkZXYsICZvbGQpOworCisJLyoKKwkqKiBwZXJmb3JtIG1vZGlmaWNhdGlvbnMgcmVnYXJkaW5nIHRoZSBjaGFuZ2VzIAorCSoqIHJlcXVlc3RlZCBieSB0aGUgb3BlcmF0b3IKKwkqLworCWlmIChlcGF1c2UtPmF1dG9uZWcgIT0gb2xkLmF1dG9uZWcpIAorCQkqYnVmID0gZXBhdXNlLT5hdXRvbmVnID8gU0tfRkxPV19NT0RFX05PTkUgOiBTS19GTE9XX01PREVfU1lNTUVUUklDOworCWVsc2UgeworCQlpZiAoZXBhdXNlLT5yeF9wYXVzZSAmJiBlcGF1c2UtPnR4X3BhdXNlKSAKKwkJCSpidWYgPSBTS19GTE9XX01PREVfU1lNTUVUUklDOworCQllbHNlIGlmIChlcGF1c2UtPnJ4X3BhdXNlICYmICFlcGF1c2UtPnR4X3BhdXNlKQorCQkJKmJ1ZiA9ICBTS19GTE9XX01PREVfU1lNX09SX1JFTTsKKwkJZWxzZSBpZiAoIWVwYXVzZS0+cnhfcGF1c2UgJiYgZXBhdXNlLT50eF9wYXVzZSkKKwkJCSpidWYgPSAgU0tfRkxPV19NT0RFX0xPQ19TRU5EOworCQllbHNlCisJCQkqYnVmID0gU0tfRkxPV19NT0RFX05PTkU7CisJfQorCisJcmV0ID0gU2tQbm1pU2V0VmFyKHBBQywgcEFDLT5Jb0Jhc2UsIE9JRF9TS0dFX0ZMT1dDVFJMX01PREUsCisJCQkgJmJ1ZiwgJmxlbiwgaW5zdGFuY2UsIHBOZXQtPk5ldE5yKTsKKworCWlmIChyZXQgIT0gU0tfUE5NSV9FUlJfT0spIHsKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSAgICgiZXRodG9vbCAoc2s5OGxpbik6IGVycm9yIGNoYW5naW5nIHJ4L3R4IHBhdXNlICglaSlcbiIsIHJldCkpOworCQlnb3RvIGVycjsKKwl9CisKKwkvKgorCSoqIEl0IG1heSBiZSB0aGF0IGF1dG9uZWcgaGFzIGJlZW4gZGlzYWJsZWQhIFRoZXJlZm9yZQorCSoqIHNldCB0aGUgc3BlZWQgdG8gdGhlIHByZXZpb3VzbHkgdXNlZCB2YWx1ZS4uLgorCSovCisJaWYgKCFlcGF1c2UtPmF1dG9uZWcpIHsKKwkJbGVuID0gMTsKKwkJcmV0ID0gU2tQbm1pU2V0VmFyKHBBQywgcEFDLT5Jb0Jhc2UsIE9JRF9TS0dFX1NQRUVEX01PREUsIAorCQkJCSAgICZvbGRzcGVlZCwgJmxlbiwgaW5zdGFuY2UsIHBOZXQtPk5ldE5yKTsKKwkJaWYgKHJldCAhPSBTS19QTk1JX0VSUl9PSykgCisJCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9DVFJMLAorCQkJCSAgICgiZXRodG9vbCAoc2s5OGxpbik6IGVycm9yIHNldHRpbmcgc3BlZWQgKCVpKVxuIiwgcmV0KSk7CisJfQorIGVycjoKKyAgICAgICAgcmV0dXJuIHJldCA/IC1FSU8gOiAwOworfQorCitzdHJ1Y3QgZXRodG9vbF9vcHMgU2tHZUV0aHRvb2xPcHMgPSB7CisJLmdldF9zZXR0aW5ncwkJPSBnZXRTZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCQk9IHNldFNldHRpbmdzLAorCS5nZXRfZHJ2aW5mbwkJPSBnZXREcml2ZXJJbmZvLAorCS5nZXRfc3RyaW5ncwkJPSBnZXRTdHJpbmdzLAorCS5nZXRfc3RhdHNfY291bnQJPSBnZXRTdGF0c0NvdW50LAorCS5nZXRfZXRodG9vbF9zdGF0cwk9IGdldEV0aHRvb2xTdGF0cywKKwkucGh5c19pZAkJPSBsb2NhdGVEZXZpY2UsCisJLmdldF9wYXVzZXBhcmFtCQk9IGdldFBhdXNlUGFyYW1zLAorCS5zZXRfcGF1c2VwYXJhbQkJPSBzZXRQYXVzZVBhcmFtcywKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2UuYyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YjgyN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2UuYwpAQCAtMCwwICsxLDUxODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2dlLmMKKyAqIFByb2plY3Q6CUdFbmVzaXMsIFBDSSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS40NSAkCisgKiBEYXRlOiAgICAgICAJJERhdGU6IDIwMDQvMDIvMTIgMTQ6NDE6MDIgJAorICogUHVycG9zZToJVGhlIG1haW4gZHJpdmVyIHNvdXJjZSBtb2R1bGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJRHJpdmVyIGZvciBNYXJ2ZWxsIFl1a29uIGNoaXBzZXQgYW5kIFN5c0tvbm5lY3QgR2lnYWJpdCBFdGhlcm5ldCAKKyAqICAgICAgU2VydmVyIEFkYXB0ZXJzLgorICoKKyAqCUNyZWF0ZWQgMTAtRmViLTE5OTksIGJhc2VkIG9uIExpbnV4JyBhY2VuaWMuYywgM2M1OXguYyBhbmQKKyAqCVN5c0tvbm5lY3RzIEdFbmVzaXMgU29sYXJpcyBkcml2ZXIKKyAqCUF1dGhvcjogQ2hyaXN0b3BoIEdvb3MgKGNnb29zQHN5c2tvbm5lY3QuZGUpCisgKgkgICAgICAgIE1pcmtvIExpbmRuZXIgKG1saW5kbmVyQHN5c2tvbm5lY3QuZGUpCisgKgorICoJQWRkcmVzcyBhbGwgcXVlc3Rpb24gdG86IGxpbnV4QHN5c2tvbm5lY3QuZGUKKyAqCisgKglUaGUgdGVjaG5pY2FsIG1hbnVhbCBmb3IgdGhlIGFkYXB0ZXJzIGlzIGF2YWlsYWJsZSBmcm9tIFN5c0tvbm5lY3QncworICoJd2ViIHBhZ2VzOiB3d3cuc3lza29ubmVjdC5jb20KKyAqCUdvdG8gIlN1cHBvcnQiIGFuZCBzZWFyY2ggS25vd2xlZGdlIEJhc2UgZm9yICJtYW51YWwiLgorICoJCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBQb3NzaWJsZSBjb21waWxlciBvcHRpb25zICgjZGVmaW5lIHh4eCAvIC1EeHh4KToKKyAqCisgKglkZWJ1Z2dpbmcgY2FuIGJlIGVuYWJsZSBieSBjaGFuZ2luZyBTS19ERUJVR19DSEtNT0QgYW5kCisgKglTS19ERUJVR19DSEtDQVQgaW4gbWFrZWZpbGUgKGRlc2NyaWJlZCB0aGVyZSkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqCVRoaXMgaXMgdGhlIG1haW4gbW9kdWxlIG9mIHRoZSBMaW51eCBHRSBkcml2ZXIuCisgKgkKKyAqCUFsbCBzb3VyY2UgZmlsZXMgZXhjZXB0IHNrZ2UuYywgc2tkcnYxc3QuaCwgc2tkcnYybmQuaCBhbmQgc2t0eXBlcy5oCisgKglhcmUgcGFydCBvZiBTeXNLb25uZWN0J3MgQ09NTU9OIE1PRFVMRVMgZm9yIHRoZSBTSy05OHh4IGFkYXB0ZXJzLgorICoJVGhvc2UgYXJlIHVzZWQgZm9yIGRyaXZlcnMgb24gbXVsdGlwbGUgT1MnLCBzbyBzb21lIHRoaW5nIG1heSBzZWVtCisgKgl1bm5lY2Vzc2FyeSBjb21wbGljYXRlZCBvbiBMaW51eC4gUGxlYXNlIGRvIG5vdCB0cnkgdG8gJ2NsZWFuIHVwJworICoJdGhlbSB3aXRob3V0IFZFUlkgZ29vZCByZWFzb25zLCBiZWNhdXNlIHRoaXMgd2lsbCBtYWtlIGl0IG1vcmUKKyAqCWRpZmZpY3VsdCB0byBrZWVwIHRoZSBMaW51eCBkcml2ZXIgaW4gc3luY2hyb25pc2F0aW9uIHdpdGggdGhlCisgKglvdGhlciB2ZXJzaW9ucy4KKyAqCisgKiBJbmNsdWRlIGZpbGUgaGllcmFyY2h5OgorICoKKyAqCTxsaW51eC9tb2R1bGUuaD4KKyAqCisgKgkiaC9za2RydjFzdC5oIgorICoJCTxsaW51eC90eXBlcy5oPgorICoJCTxsaW51eC9rZXJuZWwuaD4KKyAqCQk8bGludXgvc3RyaW5nLmg+CisgKgkJPGxpbnV4L2Vycm5vLmg+CisgKgkJPGxpbnV4L2lvcG9ydC5oPgorICoJCTxsaW51eC9zbGFiLmg+CisgKgkJPGxpbnV4L2ludGVycnVwdC5oPgorICoJCTxsaW51eC9wY2kuaD4KKyAqCQk8bGludXgvYml0b3BzLmg+CisgKgkJPGFzbS9ieXRlb3JkZXIuaD4KKyAqCQk8YXNtL2lvLmg+CisgKgkJPGxpbnV4L25ldGRldmljZS5oPgorICoJCTxsaW51eC9ldGhlcmRldmljZS5oPgorICoJCTxsaW51eC9za2J1ZmYuaD4KKyAqCSAgICB0aG9zZSB0aHJlZSBkZXBlbmRpbmcgb24ga2VybmVsIHZlcnNpb24gdXNlZDoKKyAqCQk8bGludXgvYmlvczMyLmg+CisgKgkJPGxpbnV4L2luaXQuaD4KKyAqCQk8YXNtL3VhY2Nlc3MuaD4KKyAqCQk8bmV0L2NoZWNrc3VtLmg+CisgKgorICoJCSJoL3NrZXJyb3IuaCIKKyAqCQkiaC9za2RlYnVnLmgiCisgKgkJImgvc2t0eXBlcy5oIgorICoJCSJoL2xtODAuaCIKKyAqCQkiaC94bWFjX2lpLmgiCisgKgorICogICAgICAiaC9za2RydjJuZC5oIgorICoJCSJoL3NrcXVldWUuaCIKKyAqCQkiaC9za2dlaHd0LmgiCisgKgkJImgvc2t0aW1lci5oIgorICoJCSJoL3NraTJjLmgiCisgKgkJImgvc2tnZXBubWkuaCIKKyAqCQkiaC9za3ZwZC5oIgorICoJCSJoL3NrZ2Vody5oIgorICoJCSJoL3NrZ2Vpbml0LmgiCisgKgkJImgvc2thZGRyLmgiCisgKgkJImgvc2tnZXNpcnEuaCIKKyAqCQkiaC9za2NzdW0uaCIKKyAqCQkiaC9za3JsbXQuaCIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZQkiaC9za3ZlcnNpb24uaCIKKworI2luY2x1ZGUJPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUJPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZQk8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgCTxsaW51eC9wcm9jX2ZzLmg+CisKKyNpbmNsdWRlCSJoL3NrZHJ2MXN0LmgiCisjaW5jbHVkZQkiaC9za2RydjJuZC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERlZmluZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBmb3IgZGVidWdpbmcgb24geDg2IG9ubHkgKi8KKy8qICNkZWZpbmUgQlJFQUtQT0lOVCgpIGFzbSgiIGludCAkMyIpOyAqLworCisvKiB1c2UgdGhlIHRyYW5zbWl0IGh3IGNoZWNrc3VtIGRyaXZlciBmdW5jdGlvbmFsaXR5ICovCisjZGVmaW5lIFVTRV9TS19UWF9DSEVDS1NVTQorCisvKiB1c2UgdGhlIHJlY2VpdmUgaHcgY2hlY2tzdW0gZHJpdmVyIGZ1bmN0aW9uYWxpdHkgKi8KKyNkZWZpbmUgVVNFX1NLX1JYX0NIRUNLU1VNCisKKy8qIHVzZSB0aGUgc2NhdHRlci1nYXRoZXIgZnVuY3Rpb25hbGl0eSB3aXRoIHNlbmRmaWxlKCkgKi8KKyNkZWZpbmUgU0tfWkVST0NPUFkKKworLyogdXNlIG9mIGEgdHJhbnNtaXQgY29tcGxldGUgaW50ZXJydXB0ICovCisjZGVmaW5lIFVTRV9UWF9DT01QTEVURQorCisvKgorICogdGhyZXNob2xkIGZvciBjb3B5aW5nIHNtYWxsIHJlY2VpdmUgZnJhbWVzCisgKiBzZXQgdG8gMCB0byBhdm9pZCBjb3B5aW5nLCBzZXQgdG8gOTAwMSB0byBjb3B5IGFsbCBmcmFtZXMKKyAqLworI2RlZmluZSBTS19DT1BZX1RIUkVTSE9MRAk1MAorCisvKiBudW1iZXIgb2YgYWRhcHRlcnMgdGhhdCBjYW4gYmUgY29uZmlndXJlZCB2aWEgY29tbWFuZCBsaW5lIHBhcmFtcyAqLworI2RlZmluZSBTS19NQVhfQ0FSRF9QQVJBTQkxNgorCisKKworLyoKKyAqIHVzZSB0aG9zZSBkZWZpbmVzIGZvciBhIGNvbXBpbGUtaW4gdmVyc2lvbiBvZiB0aGUgZHJpdmVyIGluc3RlYWQKKyAqIG9mIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzCisgKi8KKy8vICNkZWZpbmUgTElOS19TUEVFRF9BCXsiQXV0byIsIH0KKy8vICNkZWZpbmUgTElOS19TUEVFRF9CCXsiQXV0byIsIH0KKy8vICNkZWZpbmUgQVVUT19ORUdfQQl7IlNlbnNlIiwgfQorLy8gI2RlZmluZSBBVVRPX05FR19CCXsiU2Vuc2UiLCB9CisvLyAjZGVmaW5lIERVUF9DQVBfQQl7IkJvdGgiLCB9CisvLyAjZGVmaW5lIERVUF9DQVBfQgl7IkJvdGgiLCB9CisvLyAjZGVmaW5lIEZMT1dfQ1RSTF9BCXsiU3ltT3JSZW0iLCB9CisvLyAjZGVmaW5lIEZMT1dfQ1RSTF9CCXsiU3ltT3JSZW0iLCB9CisvLyAjZGVmaW5lIFJPTEVfQQl7IkF1dG8iLCB9CisvLyAjZGVmaW5lIFJPTEVfQgl7IkF1dG8iLCB9CisvLyAjZGVmaW5lIFBSRUZfUE9SVAl7IkEiLCB9CisvLyAjZGVmaW5lIENPTl9UWVBFIAl7IkF1dG8iLCB9CisvLyAjZGVmaW5lIFJMTVRfTU9ERQl7IkNoZWNrTGlua1N0YXRlIiwgfQorCisjZGVmaW5lIERFVl9LRlJFRV9TS0Ioc2tiKSBkZXZfa2ZyZWVfc2tiKHNrYikKKyNkZWZpbmUgREVWX0tGUkVFX1NLQl9JUlEoc2tiKSBkZXZfa2ZyZWVfc2tiX2lycShza2IpCisjZGVmaW5lIERFVl9LRlJFRV9TS0JfQU5ZKHNrYikgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKQorCisKKy8qIFNldCBibGluayBtb2RlKi8KKyNkZWZpbmUgT0VNX0NPTkZJR19WQUxVRSAoCVNLX0FDVF9MRURfQkxJTksgfCBcCisJCQkJU0tfRFVQX0xFRF9OT1JNQUwgfCBcCisJCQkJU0tfTEVEX0xJTksxMDBfT04pCisKKworLyogSXNyIHJldHVybiB2YWx1ZSAqLworI2RlZmluZSBTa0lzclJldFZhcglpcnFyZXR1cm5fdAorI2RlZmluZSBTa0lzclJldE5vbmUJSVJRX05PTkUKKyNkZWZpbmUgU2tJc3JSZXRIYW5kbGVkCUlSUV9IQU5ETEVECisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBMb2NhbCBGdW5jdGlvbiBQcm90b3R5cGVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQJRnJlZVJlc291cmNlcyhzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2KTsKK3N0YXRpYyBpbnQJU2tHZUJvYXJkSW5pdChzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2LCBTS19BQyAqcEFDKTsKK3N0YXRpYyBTS19CT09MCUJvYXJkQWxsb2NNZW0oU0tfQUMgKnBBQyk7CitzdGF0aWMgdm9pZAlCb2FyZEZyZWVNZW0oU0tfQUMgKnBBQyk7CitzdGF0aWMgdm9pZAlCb2FyZEluaXRNZW0oU0tfQUMgKnBBQyk7CitzdGF0aWMgdm9pZAlTZXR1cFJpbmcoU0tfQUMqLCB2b2lkKiwgdWludHB0cl90LCBSWEQqKiwgUlhEKiosIFJYRCoqLCBpbnQqLCBTS19CT09MKTsKK3N0YXRpYyBTa0lzclJldFZhcglTa0dlSXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnB0cmVncyk7CitzdGF0aWMgU2tJc3JSZXRWYXIJU2tHZUlzck9uZVBvcnQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcHRyZWdzKTsKK3N0YXRpYyBpbnQJU2tHZU9wZW4oc3RydWN0IFNLX05FVF9ERVZJQ0UgKmRldik7CitzdGF0aWMgaW50CVNrR2VDbG9zZShzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2KTsKK3N0YXRpYyBpbnQJU2tHZVhtaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFNLX05FVF9ERVZJQ0UgKmRldik7CitzdGF0aWMgaW50CVNrR2VTZXRNYWNBZGRyKHN0cnVjdCBTS19ORVRfREVWSUNFICpkZXYsIHZvaWQgKnApOworc3RhdGljIHZvaWQJU2tHZVNldFJ4TW9kZShzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QJbmV0X2RldmljZV9zdGF0cyAqU2tHZVN0YXRzKHN0cnVjdCBTS19ORVRfREVWSUNFICpkZXYpOworc3RhdGljIGludAlTa0dlSW9jdGwoc3RydWN0IFNLX05FVF9ERVZJQ0UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgdm9pZAlHZXRDb25maWd1cmF0aW9uKFNLX0FDKik7CitzdGF0aWMgdm9pZAlQcm9kdWN0U3RyKFNLX0FDKik7CitzdGF0aWMgaW50CVhtaXRGcmFtZShTS19BQyosIFRYX1BPUlQqLCBzdHJ1Y3Qgc2tfYnVmZiopOworc3RhdGljIHZvaWQJRnJlZVR4RGVzY3JpcHRvcnMoU0tfQUMqcEFDLCBUWF9QT1JUKik7CitzdGF0aWMgdm9pZAlGaWxsUnhSaW5nKFNLX0FDKiwgUlhfUE9SVCopOworc3RhdGljIFNLX0JPT0wJRmlsbFJ4RGVzY3JpcHRvcihTS19BQyosIFJYX1BPUlQqKTsKK3N0YXRpYyB2b2lkCVJlY2VpdmVJcnEoU0tfQUMqLCBSWF9QT1JUKiwgU0tfQk9PTCk7CitzdGF0aWMgdm9pZAlDbGVhckFuZFN0YXJ0UngoU0tfQUMqLCBpbnQpOworc3RhdGljIHZvaWQJQ2xlYXJUeElycShTS19BQyosIGludCwgaW50KTsKK3N0YXRpYyB2b2lkCUNsZWFyUnhSaW5nKFNLX0FDKiwgUlhfUE9SVCopOworc3RhdGljIHZvaWQJQ2xlYXJUeFJpbmcoU0tfQUMqLCBUWF9QT1JUKik7CitzdGF0aWMgaW50CVNrR2VDaGFuZ2VNdHUoc3RydWN0IFNLX05FVF9ERVZJQ0UgKmRldiwgaW50IG5ld19tdHUpOworc3RhdGljIHZvaWQJUG9ydFJlSW5pdEJtdShTS19BQyosIGludCk7CitzdGF0aWMgaW50CVNrR2VJb2NNaWIoREVWX05FVCosIHVuc2lnbmVkIGludCwgaW50KTsKK3N0YXRpYyBpbnQJU2tHZUluaXRQQ0koU0tfQUMgKnBBQyk7CitzdGF0aWMgdm9pZAlTdGFydERydkNsZWFudXBUaW1lcihTS19BQyAqcEFDKTsKK3N0YXRpYyB2b2lkCVN0b3BEcnZDbGVhbnVwVGltZXIoU0tfQUMgKnBBQyk7CitzdGF0aWMgaW50CVhtaXRGcmFtZVNHKFNLX0FDKiwgVFhfUE9SVCosIHN0cnVjdCBza19idWZmKik7CisKKyNpZmRlZiBTS19ESUFHX1NVUFBPUlQKK3N0YXRpYyBTS19VMzIgICBQYXJzZURldmljZU5ickZyb21TbG90TmFtZShjb25zdCBjaGFyICpTbG90TmFtZSk7CitzdGF0aWMgaW50ICAgICAgU2tEcnZJbml0QWRhcHRlcihTS19BQyAqcEFDLCBpbnQgZGV2TmJyKTsKK3N0YXRpYyBpbnQgICAgICBTa0RydkRlSW5pdEFkYXB0ZXIoU0tfQUMgKnBBQywgaW50IGRldk5icik7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBFeHRlcm4gRnVuY3Rpb24gUHJvdG90eXBlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgY29uc3QgY2hhciAJU0tSb290TmFtZVtdID0gInNrOThsaW4iOworc3RhdGljIHN0cnVjdAkJcHJvY19kaXJfZW50cnkgKnBTa1Jvb3REaXI7CitleHRlcm4gc3RydWN0CWZpbGVfb3BlcmF0aW9ucyBza19wcm9jX2ZvcHM7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBTa0dlUHJvY0NyZWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGU7CisKKwlpZiAocFNrUm9vdERpciAmJiAKKwkgICAgKHBlID0gY3JlYXRlX3Byb2NfZW50cnkoZGV2LT5uYW1lLCBTX0lSVUdPLCBwU2tSb290RGlyKSkpIHsKKwkJcGUtPnByb2NfZm9wcyA9ICZza19wcm9jX2ZvcHM7CisJCXBlLT5kYXRhID0gZGV2OworCQlwZS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwl9Cit9CisgCitzdGF0aWMgaW5saW5lIHZvaWQgU2tHZVByb2NSZW1vdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAocFNrUm9vdERpcikKKwkJcmVtb3ZlX3Byb2NfZW50cnkoZGV2LT5uYW1lLCBwU2tSb290RGlyKTsKK30KKworZXh0ZXJuIHZvaWQgU2tEaW1FbmFibGVNb2RlcmF0aW9uSWZOZWVkZWQoU0tfQUMgKnBBQyk7CQorZXh0ZXJuIHZvaWQgU2tEaW1EaXNwbGF5TW9kZXJhdGlvblNldHRpbmdzKFNLX0FDICpwQUMpOworZXh0ZXJuIHZvaWQgU2tEaW1TdGFydE1vZGVyYXRpb25UaW1lcihTS19BQyAqcEFDKTsKK2V4dGVybiB2b2lkIFNrRGltTW9kZXJhdGUoU0tfQUMgKnBBQyk7CitleHRlcm4gdm9pZCBTa0dlQmxpbmtUaW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOworCisjaWZkZWYgREVCVUcKK3N0YXRpYyB2b2lkCUR1bXBNc2coc3RydWN0IHNrX2J1ZmYqLCBjaGFyKik7CitzdGF0aWMgdm9pZAlEdW1wRGF0YShjaGFyKiwgaW50KTsKK3N0YXRpYyB2b2lkCUR1bXBMb25nKGNoYXIqLCBpbnQpOworI2VuZGlmCisKKy8qIGdsb2JhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFNLX0JPT0wgRG9QcmludEludGVyZmFjZUNoYW5nZSA9IFNLX1RSVUU7CitleHRlcm4gIHN0cnVjdCBldGh0b29sX29wcyBTa0dlRXRodG9vbE9wczsKKworLyogbG9jYWwgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdWludHB0cl90IFR4UXVldWVBZGRyW1NLX01BWF9NQUNTXVsyXSA9IHt7MHg2ODAsIDB4NjAwfSx7MHg3ODAsIDB4NzAwfX07CitzdGF0aWMgdWludHB0cl90IFJ4UXVldWVBZGRyW1NLX01BWF9NQUNTXSA9IHsweDQwMCwgMHg0ODB9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJU2tHZUluaXRQQ0kgLSBJbml0IHRoZSBQQ0kgcmVzb3VyY2VzCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgdGhlIFBDSSByZXNvdXJjZXMgYW5kIElPCisgKgorICogUmV0dXJuczogTi9BCisgKgkKKyAqLworaW50IFNrR2VJbml0UENJKFNLX0FDICpwQUMpCit7CisJc3RydWN0IFNLX05FVF9ERVZJQ0UgKmRldiA9IHBBQy0+ZGV2WzBdOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcEFDLT5QY2lEZXY7CisJaW50IHJldHZhbDsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSAhPSAwKSB7CisJCXJldHVybiAxOworCX0KKworCWRldi0+bWVtX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAwKTsKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIHBBQy0+TmFtZSkgIT0gMCkgeworCQlyZXR2YWwgPSAyOworCQlnb3RvIG91dF9kaXNhYmxlOworCX0KKworI2lmZGVmIFNLX0JJR19FTkRJQU4KKwkvKgorCSAqIE9uIGJpZyBlbmRpYW4gbWFjaGluZXMsIHdlIHVzZSB0aGUgYWRhcHRlcidzIGFpYmlsaXR5IG9mCisJICogcmVhZGluZyB0aGUgZGVzY3JpcHRvcnMgYXMgYmlnIGVuZGlhbi4KKwkgKi8KKwl7CisJCVNLX1UzMgkJb3VyMjsKKwkJU2tQY2lSZWFkQ2ZnRFdvcmQocEFDLCBQQ0lfT1VSX1JFR18yLCAmb3VyMik7CisJCW91cjIgfD0gUENJX1JFVl9ERVNDOworCQlTa1BjaVdyaXRlQ2ZnRFdvcmQocEFDLCBQQ0lfT1VSX1JFR18yLCBvdXIyKTsKKwl9CisjZW5kaWYKKworCS8qCisJICogUmVtYXAgdGhlIHJlZ3MgaW50byBrZXJuZWwgc3BhY2UuCisJICovCisJcEFDLT5Jb0Jhc2UgPSBpb3JlbWFwX25vY2FjaGUoZGV2LT5tZW1fc3RhcnQsIDB4NDAwMCk7CisKKwlpZiAoIXBBQy0+SW9CYXNlKXsKKwkJcmV0dmFsID0gMzsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisKKwlyZXR1cm4gMDsKKworIG91dF9yZWxlYXNlOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Cisgb3V0X2Rpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiByZXR2YWw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCUZyZWVSZXNvdXJjZXMgLSByZWxlYXNlIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIGFkYXB0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgdGhlIElSUSwgdW5tYXBzIHRoZSBJTyBhbmQKKyAqCWZyZWVzIHRoZSBkZXNyaXB0b3IgcmluZy4KKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqCQorICovCitzdGF0aWMgdm9pZCBGcmVlUmVzb3VyY2VzKHN0cnVjdCBTS19ORVRfREVWSUNFICpkZXYpCit7CitTS19VMzIgQWxsb2NGbGFnOworREVWX05FVAkJKnBOZXQ7CitTS19BQwkJKnBBQzsKKworCXBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCXBBQyA9IHBOZXQtPnBBQzsKKwlBbGxvY0ZsYWcgPSBwQUMtPkFsbG9jRmxhZzsKKwlpZiAocEFDLT5QY2lEZXYpIHsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwQUMtPlBjaURldik7CisJfQorCWlmIChBbGxvY0ZsYWcgJiBTS19BTExPQ19JUlEpIHsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJfQorCWlmIChwQUMtPklvQmFzZSkgeworCQlpb3VubWFwKHBBQy0+SW9CYXNlKTsKKwl9CisJaWYgKHBBQy0+cERlc2NyTWVtKSB7CisJCUJvYXJkRnJlZU1lbShwQUMpOworCX0KKwkKK30gLyogRnJlZVJlc291cmNlcyAqLworCitNT0RVTEVfQVVUSE9SKCJNaXJrbyBMaW5kbmVyIDxtbGluZG5lckBzeXNrb25uZWN0LmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTeXNLb25uZWN0IFNLLU5FVCBHaWdhYml0IEV0aGVybmV0IFNLLTk4eHggZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpZmRlZiBMSU5LX1NQRUVEX0EKK3N0YXRpYyBjaGFyICpTcGVlZF9BW1NLX01BWF9DQVJEX1BBUkFNXSA9IExJTktfU1BFRUQ7CisjZWxzZQorc3RhdGljIGNoYXIgKlNwZWVkX0FbU0tfTUFYX0NBUkRfUEFSQU1dID0geyIiLCB9OworI2VuZGlmCisKKyNpZmRlZiBMSU5LX1NQRUVEX0IKK3N0YXRpYyBjaGFyICpTcGVlZF9CW1NLX01BWF9DQVJEX1BBUkFNXSA9IExJTktfU1BFRUQ7CisjZWxzZQorc3RhdGljIGNoYXIgKlNwZWVkX0JbU0tfTUFYX0NBUkRfUEFSQU1dID0geyIiLCB9OworI2VuZGlmCisKKyNpZmRlZiBBVVRPX05FR19BCitzdGF0aWMgY2hhciAqQXV0b05lZ19BW1NLX01BWF9DQVJEX1BBUkFNXSA9IEFVVE9fTkVHX0E7CisjZWxzZQorc3RhdGljIGNoYXIgKkF1dG9OZWdfQVtTS19NQVhfQ0FSRF9QQVJBTV0gPSB7IiIsIH07CisjZW5kaWYKKworI2lmZGVmIERVUF9DQVBfQQorc3RhdGljIGNoYXIgKkR1cENhcF9BW1NLX01BWF9DQVJEX1BBUkFNXSA9IERVUF9DQVBfQTsKKyNlbHNlCitzdGF0aWMgY2hhciAqRHVwQ2FwX0FbU0tfTUFYX0NBUkRfUEFSQU1dID0geyIiLCB9OworI2VuZGlmCisKKyNpZmRlZiBGTE9XX0NUUkxfQQorc3RhdGljIGNoYXIgKkZsb3dDdHJsX0FbU0tfTUFYX0NBUkRfUEFSQU1dID0gRkxPV19DVFJMX0E7CisjZWxzZQorc3RhdGljIGNoYXIgKkZsb3dDdHJsX0FbU0tfTUFYX0NBUkRfUEFSQU1dID0geyIiLCB9OworI2VuZGlmCisKKyNpZmRlZiBST0xFX0EKK3N0YXRpYyBjaGFyICpSb2xlX0FbU0tfTUFYX0NBUkRfUEFSQU1dID0gUk9MRV9BOworI2Vsc2UKK3N0YXRpYyBjaGFyICpSb2xlX0FbU0tfTUFYX0NBUkRfUEFSQU1dID0geyIiLCB9OworI2VuZGlmCisKKyNpZmRlZiBBVVRPX05FR19CCitzdGF0aWMgY2hhciAqQXV0b05lZ19CW1NLX01BWF9DQVJEX1BBUkFNXSA9IEFVVE9fTkVHX0I7CisjZWxzZQorc3RhdGljIGNoYXIgKkF1dG9OZWdfQltTS19NQVhfQ0FSRF9QQVJBTV0gPSB7IiIsIH07CisjZW5kaWYKKworI2lmZGVmIERVUF9DQVBfQgorc3RhdGljIGNoYXIgKkR1cENhcF9CW1NLX01BWF9DQVJEX1BBUkFNXSA9IERVUF9DQVBfQjsKKyNlbHNlCitzdGF0aWMgY2hhciAqRHVwQ2FwX0JbU0tfTUFYX0NBUkRfUEFSQU1dID0geyIiLCB9OworI2VuZGlmCisKKyNpZmRlZiBGTE9XX0NUUkxfQgorc3RhdGljIGNoYXIgKkZsb3dDdHJsX0JbU0tfTUFYX0NBUkRfUEFSQU1dID0gRkxPV19DVFJMX0I7CisjZWxzZQorc3RhdGljIGNoYXIgKkZsb3dDdHJsX0JbU0tfTUFYX0NBUkRfUEFSQU1dID0geyIiLCB9OworI2VuZGlmCisKKyNpZmRlZiBST0xFX0IKK3N0YXRpYyBjaGFyICpSb2xlX0JbU0tfTUFYX0NBUkRfUEFSQU1dID0gUk9MRV9COworI2Vsc2UKK3N0YXRpYyBjaGFyICpSb2xlX0JbU0tfTUFYX0NBUkRfUEFSQU1dID0geyIiLCB9OworI2VuZGlmCisKKyNpZmRlZiBDT05fVFlQRQorc3RhdGljIGNoYXIgKkNvblR5cGVbU0tfTUFYX0NBUkRfUEFSQU1dID0gQ09OX1RZUEU7CisjZWxzZQorc3RhdGljIGNoYXIgKkNvblR5cGVbU0tfTUFYX0NBUkRfUEFSQU1dID0geyIiLCB9OworI2VuZGlmCisKKyNpZmRlZiBQUkVGX1BPUlQKK3N0YXRpYyBjaGFyICpQcmVmUG9ydFtTS19NQVhfQ0FSRF9QQVJBTV0gPSBQUkVGX1BPUlQ7CisjZWxzZQorc3RhdGljIGNoYXIgKlByZWZQb3J0W1NLX01BWF9DQVJEX1BBUkFNXSA9IHsiIiwgfTsKKyNlbmRpZgorCisjaWZkZWYgUkxNVF9NT0RFCitzdGF0aWMgY2hhciAqUmxtdE1vZGVbU0tfTUFYX0NBUkRfUEFSQU1dID0gUkxNVF9NT0RFOworI2Vsc2UKK3N0YXRpYyBjaGFyICpSbG10TW9kZVtTS19NQVhfQ0FSRF9QQVJBTV0gPSB7IiIsIH07CisjZW5kaWYKKworc3RhdGljIGludCAgIEludHNQZXJTZWNbU0tfTUFYX0NBUkRfUEFSQU1dOworc3RhdGljIGNoYXIgKk1vZGVyYXRpb25bU0tfTUFYX0NBUkRfUEFSQU1dOworc3RhdGljIGNoYXIgKk1vZGVyYXRpb25NYXNrW1NLX01BWF9DQVJEX1BBUkFNXTsKK3N0YXRpYyBjaGFyICpBdXRvU2l6aW5nW1NLX01BWF9DQVJEX1BBUkFNXTsKK3N0YXRpYyBjaGFyICpTdGF0c1tTS19NQVhfQ0FSRF9QQVJBTV07CisKK21vZHVsZV9wYXJhbV9hcnJheShTcGVlZF9BLCBjaGFycCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoU3BlZWRfQiwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KEF1dG9OZWdfQSwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KEF1dG9OZWdfQiwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KER1cENhcF9BLCBjaGFycCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoRHVwQ2FwX0IsIGNoYXJwLCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShGbG93Q3RybF9BLCBjaGFycCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoRmxvd0N0cmxfQiwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KFJvbGVfQSwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KFJvbGVfQiwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KENvblR5cGUsIGNoYXJwLCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShQcmVmUG9ydCwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KFJsbXRNb2RlLCBjaGFycCwgTlVMTCwgMCk7CisvKiB1c2VkIGZvciBpbnRlcnJ1cHQgbW9kZXJhdGlvbiAqLworbW9kdWxlX3BhcmFtX2FycmF5KEludHNQZXJTZWMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoTW9kZXJhdGlvbiwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KFN0YXRzLCBjaGFycCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoTW9kZXJhdGlvbk1hc2ssIGNoYXJwLCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShBdXRvU2l6aW5nLCBjaGFycCwgTlVMTCwgMCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlTa0dlQm9hcmRJbml0IC0gZG8gbGV2ZWwgMCBhbmQgMSBpbml0aWFsaXphdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBwcmVwYXJlcyB0aGUgYm9hcmQgaGFyZHdhcmUgZm9yIHJ1bm5pbmcuIFRoZSBkZXNyaXB0b3IKKyAqCXJpbmcgaXMgc2V0IHVwLCB0aGUgSVJRIGlzIGFsbG9jYXRlZCBhbmQgdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MKKyAqCWFyZSBleGFtaW5lZC4KKyAqCisgKiBSZXR1cm5zOgorICoJMCwgaWYgZXZlcnl0aGluZyBpcyBvaworICoJIT0wLCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IF9faW5pdCBTa0dlQm9hcmRJbml0KHN0cnVjdCBTS19ORVRfREVWSUNFICpkZXYsIFNLX0FDICpwQUMpCit7CitzaG9ydAlpOwordW5zaWduZWQgbG9uZyBGbGFnczsKK2NoYXIJKkRlc2NyU3RyaW5nID0gInNrOThsaW46IERyaXZlciBmb3IgTGludXgiOyAvKiB0aGlzIGlzIGdpdmVuIHRvIFBOTUkgKi8KK2NoYXIJKlZlclN0cgk9IFZFUl9TVFJJTkc7CitpbnQJUmV0OwkJCS8qIHJldHVybiBjb2RlIG9mIHJlcXVlc3RfaXJxICovCitTS19CT09MCUR1YWxOZXQ7CisKKwlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRU5UUlksCisJCSgiSW9CYXNlOiAlMDhsWFxuIiwgKHVuc2lnbmVkIGxvbmcpcEFDLT5Jb0Jhc2UpKTsKKwlmb3IgKGk9MDsgaTxTS19NQVhfTUFDUzsgaSsrKSB7CisJCXBBQy0+VHhQb3J0W2ldWzBdLkh3QWRkciA9IHBBQy0+SW9CYXNlICsgVHhRdWV1ZUFkZHJbaV1bMF07CisJCXBBQy0+VHhQb3J0W2ldWzBdLlBvcnRJbmRleCA9IGk7CisJCXBBQy0+UnhQb3J0W2ldLkh3QWRkciA9IHBBQy0+SW9CYXNlICsgUnhRdWV1ZUFkZHJbaV07CisJCXBBQy0+UnhQb3J0W2ldLlBvcnRJbmRleCA9IGk7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgbXV0ZXhlcyAqLworCWZvciAoaT0wOyBpPFNLX01BWF9NQUNTOyBpKyspIHsKKwkJc3Bpbl9sb2NrX2luaXQoJnBBQy0+VHhQb3J0W2ldWzBdLlR4RGVzUmluZ0xvY2spOworCQlzcGluX2xvY2tfaW5pdCgmcEFDLT5SeFBvcnRbaV0uUnhEZXNSaW5nTG9jayk7CisJfQorCXNwaW5fbG9ja19pbml0KCZwQUMtPlNsb3dQYXRoTG9jayk7CisKKwkvKiBzZXR1cCBwaHlfaWQgYmxpbmsgdGltZXIgKi8KKwlwQUMtPkJsaW5rVGltZXIuZnVuY3Rpb24gPSBTa0dlQmxpbmtUaW1lcjsKKwlwQUMtPkJsaW5rVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisJaW5pdF90aW1lcigmcEFDLT5CbGlua1RpbWVyKTsKKworCS8qIGxldmVsIDAgaW5pdCBjb21tb24gbW9kdWxlcyBoZXJlICovCisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJLyogRG9lcyBhIFJFU0VUIG9uIGJvYXJkIC4uLiovCisJaWYgKFNrR2VJbml0KHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfREFUQSkgIT0gMCkgeworCQlwcmludGsoIkhXSW5pdCAoMCkgZmFpbGVkLlxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJCXJldHVybigtRUFHQUlOKTsKKwl9CisJU2tJMmNJbml0KCAgcEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9EQVRBKTsKKwlTa0V2ZW50SW5pdChwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0RBVEEpOworCVNrUG5taUluaXQoIHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfREFUQSk7CisJU2tBZGRySW5pdCggcEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9EQVRBKTsKKwlTa1JsbXRJbml0KCBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0RBVEEpOworCVNrVGltZXJJbml0KHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfREFUQSk7CisKKwlwQUMtPkJvYXJkTGV2ZWwgPSBTS19JTklUX0RBVEE7CisJcEFDLT5SeEJ1ZlNpemUgID0gRVRIX0JVRl9TSVpFOworCisJU0tfUE5NSV9TRVRfRFJJVkVSX0RFU0NSKHBBQywgRGVzY3JTdHJpbmcpOworCVNLX1BOTUlfU0VUX0RSSVZFUl9WRVIocEFDLCBWZXJTdHIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKworCS8qIGxldmVsIDEgaW5pdCBjb21tb24gbW9kdWxlcyBoZXJlIChIVyBpbml0KSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworCWlmIChTa0dlSW5pdChwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKSAhPSAwKSB7CisJCXByaW50aygic2s5OGxpbjogSFdJbml0ICgxKSBmYWlsZWQuXG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwkJcmV0dXJuKC1FQUdBSU4pOworCX0KKwlTa0kyY0luaXQoICBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa0V2ZW50SW5pdChwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa1BubWlJbml0KCBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa0FkZHJJbml0KCBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa1JsbXRJbml0KCBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa1RpbWVySW5pdChwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKworCS8qIFNldCBjaGlwc2V0IHR5cGUgc3VwcG9ydCAqLworCXBBQy0+Q2hpcHNldFR5cGUgPSAwOworCWlmICgocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfWVVLT04pIHx8CisJCShwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9ZVUtPTl9MSVRFKSkgeworCQlwQUMtPkNoaXBzZXRUeXBlID0gMTsKKwl9CisKKwlHZXRDb25maWd1cmF0aW9uKHBBQyk7CisJaWYgKHBBQy0+UmxtdE5ldHMgPT0gMikgeworCQlwQUMtPkdJbmkuR0lQb3J0VXNhZ2UgPSBTS19NVUxfTElOSzsKKwl9CisKKwlwQUMtPkJvYXJkTGV2ZWwgPSBTS19JTklUX0lPOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisKKwlpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDIpIHsKKwkJIFJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBTa0dlSXNyLCBTQV9TSElSUSwgcEFDLT5OYW1lLCBkZXYpOworCX0gZWxzZSBpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDEpIHsKKwkJUmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIFNrR2VJc3JPbmVQb3J0LCBTQV9TSElSUSwKKwkJCXBBQy0+TmFtZSwgZGV2KTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzazk4bGluOiBJbGxlZ2FsIG51bWJlciBvZiBwb3J0czogJWRcbiIsCisJCSAgICAgICBwQUMtPkdJbmkuR0lNYWNzRm91bmQpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlpZiAoUmV0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNrOThsaW46IFJlcXVlc3RlZCBJUlEgJWQgaXMgYnVzeS5cbiIsCisJCSAgICAgICBkZXYtPmlycSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlwQUMtPkFsbG9jRmxhZyB8PSBTS19BTExPQ19JUlE7CisKKwkvKiBBbGxvYyBtZW1vcnkgZm9yIHRoaXMgYm9hcmQgKE1lbSBmb3IgUnhEL1R4RCkgOiAqLworCWlmKCFCb2FyZEFsbG9jTWVtKHBBQykpIHsKKwkJcHJpbnRrKCJObyBtZW1vcnkgZm9yIGRlc2NyaXB0b3IgcmluZ3MuXG4iKTsKKyAgICAgICAJCXJldHVybigtRUFHQUlOKTsKKwl9CisKKwlTa0NzU2V0UmVjZWl2ZUZsYWdzKHBBQywKKwkJU0tDU19QUk9UT19JUCB8IFNLQ1NfUFJPVE9fVENQIHwgU0tDU19QUk9UT19VRFAsCisJCSZwQUMtPkNzT2ZzMSwgJnBBQy0+Q3NPZnMyLCAwKTsKKwlwQUMtPkNzT2ZzID0gKHBBQy0+Q3NPZnMyIDw8IDE2KSB8IHBBQy0+Q3NPZnMxOworCisJQm9hcmRJbml0TWVtKHBBQyk7CisJLyogdHNjaGlsbGluZzogTmV3IGNvbW1vbiBmdW5jdGlvbiB3aXRoIG1pbmltdW0gc2l6ZSBjaGVjay4gKi8KKwlEdWFsTmV0ID0gU0tfRkFMU0U7CisJaWYgKHBBQy0+UmxtdE5ldHMgPT0gMikgeworCQlEdWFsTmV0ID0gU0tfVFJVRTsKKwl9CisJCisJaWYgKFNrR2VJbml0QXNzaWduUmFtVG9RdWV1ZXMoCisJCXBBQywKKwkJcEFDLT5BY3RpdmVQb3J0LAorCQlEdWFsTmV0KSkgeworCQlCb2FyZEZyZWVNZW0ocEFDKTsKKwkJcHJpbnRrKCJzazk4bGluOiBTa0dlSW5pdEFzc2lnblJhbVRvUXVldWVzIGZhaWxlZC5cbiIpOworCQlyZXR1cm4oLUVBR0FJTik7CisJfQorCisJcmV0dXJuICgwKTsKK30gLyogU2tHZUJvYXJkSW5pdCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlCb2FyZEFsbG9jTWVtIC0gYWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgdGhlIGRlc2NyaXB0b3IgcmluZ3MKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIHRoZSBtZW1vcnkgZm9yIGFsbCBkZXNjcmlwdG9yIHJpbmdzLgorICoJRWFjaCByaW5nIGlzIGFsaWduZWQgZm9yIHRoZSBkZXNyaXB0b3IgYWxpZ25tZW50IGFuZCBubyByaW5nCisgKgloYXMgYSA0IEdCeXRlIGJvdW5kYXJ5IGluIGl0IChiZWNhdXNlIHRoZSB1cHBlciAzMiBiaXQgbXVzdAorICoJYmUgY29uc3RhbnQgZm9yIGFsbCBkZXNjcmlwdGlvcnMgaW4gb25lIHJpbmdzKS4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfVFJVRSwgaWYgYWxsIG1lbW9yeSBjb3VsZCBiZSBhbGxvY2F0ZWQKKyAqCVNLX0ZBTFNFLCBpZiBub3QKKyAqLworc3RhdGljIFNLX0JPT0wgQm9hcmRBbGxvY01lbSgKK1NLX0FDCSpwQUMpCit7CitjYWRkcl90CQlwRGVzY3JNZW07CS8qIHBvaW50ZXIgdG8gZGVzY3JpcHRvciBtZW1vcnkgYXJlYSAqLworc2l6ZV90CQlBbGxvY0xlbmd0aDsJLyogbGVuZ3RoIG9mIGNvbXBsZXRlIGRlc2NyaXB0b3IgYXJlYSAqLworaW50CQlpOwkJLyogbG9vcCBjb3VudGVyICovCit1bnNpZ25lZCBsb25nCUJ1c0FkZHI7CisKKwkKKwkvKiByaW5ncyBwbHVzIG9uZSBmb3IgYWxpZ25tZW50IChkbyBub3QgY3Jvc3MgNCBHQiBib3VuZGFyeSkgKi8KKwkvKiBSWF9SSU5HX1NJWkUgaXMgYXNzdW1lZCBiaWdnZXIgdGhhbiBUWF9SSU5HX1NJWkUgKi8KKyNpZiAoQklUU19QRVJfTE9ORyA9PSAzMikKKwlBbGxvY0xlbmd0aCA9IChSWF9SSU5HX1NJWkUgKyBUWF9SSU5HX1NJWkUpICogcEFDLT5HSW5pLkdJTWFjc0ZvdW5kICsgODsKKyNlbHNlCisJQWxsb2NMZW5ndGggPSAoUlhfUklOR19TSVpFICsgVFhfUklOR19TSVpFKSAqIHBBQy0+R0luaS5HSU1hY3NGb3VuZAorCQkrIFJYX1JJTkdfU0laRSArIDg7CisjZW5kaWYKKworCXBEZXNjck1lbSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBBQy0+UGNpRGV2LCBBbGxvY0xlbmd0aCwKKwkJCQkJICZwQUMtPnBEZXNjck1lbURNQSk7CisKKwlpZiAocERlc2NyTWVtID09IE5VTEwpIHsKKwkJcmV0dXJuIChTS19GQUxTRSk7CisJfQorCXBBQy0+cERlc2NyTWVtID0gcERlc2NyTWVtOworCUJ1c0FkZHIgPSAodW5zaWduZWQgbG9uZykgcEFDLT5wRGVzY3JNZW1ETUE7CisKKwkvKiBEZXNjcmlwdG9ycyBuZWVkIDggYnl0ZSBhbGlnbm1lbnQsIGFuZCB0aGlzIGlzIGVuc3VyZWQKKwkgKiBieSBwY2lfYWxsb2NfY29uc2lzdGVudC4KKwkgKi8KKwlmb3IgKGk9MDsgaTxwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfVFhfUFJPR1JFU1MsCisJCQkoIlRYJWQvQTogcERlc2NyTWVtOiAlbFgsICAgUGh5c0Rlc2NyTWVtOiAlbFhcbiIsCisJCQlpLCAodW5zaWduZWQgbG9uZykgcERlc2NyTWVtLAorCQkJQnVzQWRkcikpOworCQlwQUMtPlR4UG9ydFtpXVswXS5wVHhEZXNjclJpbmcgPSBwRGVzY3JNZW07CisJCXBBQy0+VHhQb3J0W2ldWzBdLlZUeERlc2NyUmluZyA9IEJ1c0FkZHI7CisJCXBEZXNjck1lbSArPSBUWF9SSU5HX1NJWkU7CisJCUJ1c0FkZHIgKz0gVFhfUklOR19TSVpFOworCQorCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfVFhfUFJPR1JFU1MsCisJCQkoIlJYJWQ6IHBEZXNjck1lbTogJWxYLCAgIFBoeXNEZXNjck1lbTogJWxYXG4iLAorCQkJaSwgKHVuc2lnbmVkIGxvbmcpIHBEZXNjck1lbSwKKwkJCSh1bnNpZ25lZCBsb25nKUJ1c0FkZHIpKTsKKwkJcEFDLT5SeFBvcnRbaV0ucFJ4RGVzY3JSaW5nID0gcERlc2NyTWVtOworCQlwQUMtPlJ4UG9ydFtpXS5WUnhEZXNjclJpbmcgPSBCdXNBZGRyOworCQlwRGVzY3JNZW0gKz0gUlhfUklOR19TSVpFOworCQlCdXNBZGRyICs9IFJYX1JJTkdfU0laRTsKKwl9IC8qIGZvciAqLworCQorCXJldHVybiAoU0tfVFJVRSk7Cit9IC8qIEJvYXJkQWxsb2NNZW0gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCUJvYXJkRnJlZU1lbSAtIHJldmVyc2Ugb2YgQm9hcmRBbGxvY01lbQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJRnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCBpbiBCb2FyZEFsbG9jTWVtOiBhZGFwdGVyIGNvbnRleHQsCisgKglkZXNjcmlwdG9yIHJpbmdzLCBsb2Nrcy4KKyAqCisgKiBSZXR1cm5zOglOL0EKKyAqLworc3RhdGljIHZvaWQgQm9hcmRGcmVlTWVtKAorU0tfQUMJCSpwQUMpCit7CitzaXplX3QJCUFsbG9jTGVuZ3RoOwkvKiBsZW5ndGggb2YgY29tcGxldGUgZGVzY3JpcHRvciBhcmVhICovCisKKwlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRU5UUlksCisJCSgiQm9hcmRGcmVlTWVtXG4iKSk7CisjaWYgKEJJVFNfUEVSX0xPTkcgPT0gMzIpCisJQWxsb2NMZW5ndGggPSAoUlhfUklOR19TSVpFICsgVFhfUklOR19TSVpFKSAqIHBBQy0+R0luaS5HSU1hY3NGb3VuZCArIDg7CisjZWxzZQorCUFsbG9jTGVuZ3RoID0gKFJYX1JJTkdfU0laRSArIFRYX1JJTkdfU0laRSkgKiBwQUMtPkdJbmkuR0lNYWNzRm91bmQKKwkJKyBSWF9SSU5HX1NJWkUgKyA4OworI2VuZGlmCisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBBQy0+UGNpRGV2LCBBbGxvY0xlbmd0aCwKKwkJCSAgICBwQUMtPnBEZXNjck1lbSwgcEFDLT5wRGVzY3JNZW1ETUEpOworCXBBQy0+cERlc2NyTWVtID0gTlVMTDsKK30gLyogQm9hcmRGcmVlTWVtICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCUJvYXJkSW5pdE1lbSAtIGluaXRpYXRlIHRoZSBkZXNjcmlwdG9yIHJpbmdzCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGRlc2NyaXB0b3IgcmluZ3MgdXAgaW4gbWVtb3J5LgorICoJVGhlIGFkYXB0ZXIgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZGVzY3JpcHRvciBzdGFydCBhZGRyZXNzZXMuCisgKgorICogUmV0dXJuczoJTi9BCisgKi8KK3N0YXRpYyB2b2lkIEJvYXJkSW5pdE1lbSgKK1NLX0FDCSpwQUMpCS8qIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCit7CitpbnQJaTsJCS8qIGxvb3AgY291bnRlciAqLworaW50CVJ4RGVzY3JTaXplOwkvKiB0aGUgc2l6ZSBvZiBhIHJ4IGRlc2NyaXB0b3Igcm91bmRlZCB1cCB0byBhbGlnbm1lbnQqLworaW50CVR4RGVzY3JTaXplOwkvKiB0aGUgc2l6ZSBvZiBhIHR4IGRlc2NyaXB0b3Igcm91bmRlZCB1cCB0byBhbGlnbm1lbnQqLworCisJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VOVFJZLAorCQkoIkJvYXJkSW5pdE1lbVxuIikpOworCisJUnhEZXNjclNpemUgPSAoKChzaXplb2YoUlhEKSAtIDEpIC8gREVTQ1JfQUxJR04pICsgMSkgKiBERVNDUl9BTElHTjsKKwlwQUMtPlJ4RGVzY3JQZXJSaW5nID0gUlhfUklOR19TSVpFIC8gUnhEZXNjclNpemU7CisJVHhEZXNjclNpemUgPSAoKChzaXplb2YoVFhEKSAtIDEpIC8gREVTQ1JfQUxJR04pICsgMSkgKiBERVNDUl9BTElHTjsKKwlwQUMtPlR4RGVzY3JQZXJSaW5nID0gVFhfUklOR19TSVpFIC8gUnhEZXNjclNpemU7CisJCisJZm9yIChpPTA7IGk8cEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJU2V0dXBSaW5nKAorCQkJcEFDLAorCQkJcEFDLT5UeFBvcnRbaV1bMF0ucFR4RGVzY3JSaW5nLAorCQkJcEFDLT5UeFBvcnRbaV1bMF0uVlR4RGVzY3JSaW5nLAorCQkJKFJYRCoqKSZwQUMtPlR4UG9ydFtpXVswXS5wVHhkUmluZ0hlYWQsCisJCQkoUlhEKiopJnBBQy0+VHhQb3J0W2ldWzBdLnBUeGRSaW5nVGFpbCwKKwkJCShSWEQqKikmcEFDLT5UeFBvcnRbaV1bMF0ucFR4ZFJpbmdQcmV2LAorCQkJJnBBQy0+VHhQb3J0W2ldWzBdLlR4ZFJpbmdGcmVlLAorCQkJU0tfVFJVRSk7CisJCVNldHVwUmluZygKKwkJCXBBQywKKwkJCXBBQy0+UnhQb3J0W2ldLnBSeERlc2NyUmluZywKKwkJCXBBQy0+UnhQb3J0W2ldLlZSeERlc2NyUmluZywKKwkJCSZwQUMtPlJ4UG9ydFtpXS5wUnhkUmluZ0hlYWQsCisJCQkmcEFDLT5SeFBvcnRbaV0ucFJ4ZFJpbmdUYWlsLAorCQkJJnBBQy0+UnhQb3J0W2ldLnBSeGRSaW5nUHJldiwKKwkJCSZwQUMtPlJ4UG9ydFtpXS5SeGRSaW5nRnJlZSwKKwkJCVNLX0ZBTFNFKTsKKwl9Cit9IC8qIEJvYXJkSW5pdE1lbSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlTZXR1cFJpbmcgLSBjcmVhdGUgb25lIGRlc2NyaXB0b3IgcmluZworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBjcmVhdGVzIG9uZSBkZXNjcmlwdG9yIHJpbmcgaW4gdGhlIGdpdmVuIG1lbW9yeSBhcmVhLgorICoJVGhlIGhlYWQsIHRhaWwgYW5kIG51bWJlciBvZiBmcmVlIGRlc2NyaXB0b3JzIGluIHRoZSByaW5nIGFyZSBzZXQuCisgKgorICogUmV0dXJuczoKKyAqCW5vbmUKKyAqLworc3RhdGljIHZvaWQgU2V0dXBSaW5nKAorU0tfQUMJCSpwQUMsCit2b2lkCQkqcE1lbUFyZWEsCS8qIGEgcG9pbnRlciB0byB0aGUgbWVtb3J5IGFyZWEgZm9yIHRoZSByaW5nICovCit1aW50cHRyX3QJVk1lbUFyZWEsCS8qIHRoZSB2aXJ0dWFsIGJ1cyBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgYXJlYSAqLworUlhECQkqKnBwUmluZ0hlYWQsCS8qIGFkZHJlc3Mgd2hlcmUgdGhlIGhlYWQgc2hvdWxkIGJlIHdyaXR0ZW4gKi8KK1JYRAkJKipwcFJpbmdUYWlsLAkvKiBhZGRyZXNzIHdoZXJlIHRoZSB0YWlsIHNob3VsZCBiZSB3cml0dGVuICovCitSWEQJCSoqcHBSaW5nUHJldiwJLyogYWRkcmVzcyB3aGVyZSB0aGUgdGFpbCBzaG91bGQgYmUgd3JpdHRlbiAqLworaW50CQkqcFJpbmdGcmVlLAkvKiBhZGRyZXNzIHdoZXJlIHRoZSAjIG9mIGZyZWUgZGVzY3IuIGdvZXMgKi8KK1NLX0JPT0wJCUlzVHgpCQkvKiBmbGFnOiBpcyB0aGlzIGEgdHggcmluZyAqLworeworaW50CWk7CQkvKiBsb29wIGNvdW50ZXIgKi8KK2ludAlEZXNjclNpemU7CS8qIHRoZSBzaXplIG9mIGEgZGVzY3JpcHRvciByb3VuZGVkIHVwIHRvIGFsaWdubWVudCovCitpbnQJRGVzY3JOdW07CS8qIG51bWJlciBvZiBkZXNjcmlwdG9ycyBwZXIgcmluZyAqLworUlhECSpwRGVzY3I7CS8qIHBvaW50ZXIgdG8gYSBkZXNjcmlwdG9yIChyZWNlaXZlIG9yIHRyYW5zbWl0KSAqLworUlhECSpwTmV4dERlc2NyOwkvKiBwb2ludGVyIHRvIHRoZSBuZXh0IGRlc2NyaXB0b3IgKi8KK1JYRAkqcFByZXZEZXNjcjsJLyogcG9pbnRlciB0byB0aGUgcHJldmlvdXMgZGVzY3JpcHRvciAqLwordWludHB0cl90IFZOZXh0RGVzY3I7CS8qIHRoZSB2aXJ0dWFsIGJ1cyBhZGRyZXNzIG9mIHRoZSBuZXh0IGRlc2NyaXB0b3IgKi8KKworCWlmIChJc1R4ID09IFNLX1RSVUUpIHsKKwkJRGVzY3JTaXplID0gKCgoc2l6ZW9mKFRYRCkgLSAxKSAvIERFU0NSX0FMSUdOKSArIDEpICoKKwkJCURFU0NSX0FMSUdOOworCQlEZXNjck51bSA9IFRYX1JJTkdfU0laRSAvIERlc2NyU2l6ZTsKKwl9IGVsc2UgeworCQlEZXNjclNpemUgPSAoKChzaXplb2YoUlhEKSAtIDEpIC8gREVTQ1JfQUxJR04pICsgMSkgKgorCQkJREVTQ1JfQUxJR047CisJCURlc2NyTnVtID0gUlhfUklOR19TSVpFIC8gRGVzY3JTaXplOworCX0KKwkKKwlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfVFhfUFJPR1JFU1MsCisJCSgiRGVzY3JpcHRvciBzaXplOiAlZCAgIERlc2NyaXB0b3IgTnVtYmVyOiAlZFxuIiwKKwkJRGVzY3JTaXplLERlc2NyTnVtKSk7CisJCisJcERlc2NyID0gKFJYRCopIHBNZW1BcmVhOworCXBQcmV2RGVzY3IgPSBOVUxMOworCXBOZXh0RGVzY3IgPSAoUlhEKikgKCgoY2hhciopcERlc2NyKSArIERlc2NyU2l6ZSk7CisJVk5leHREZXNjciA9IFZNZW1BcmVhICsgRGVzY3JTaXplOworCWZvcihpPTA7IGk8RGVzY3JOdW07IGkrKykgeworCQkvKiBzZXQgdGhlIHBvaW50ZXJzIHJpZ2h0ICovCisJCXBEZXNjci0+Vk5leHRSeGQgPSBWTmV4dERlc2NyICYgMHhmZmZmZmZmZlVMTDsKKwkJcERlc2NyLT5wTmV4dFJ4ZCA9IHBOZXh0RGVzY3I7CisJCXBEZXNjci0+VGNwU3VtU3RhcnRzID0gcEFDLT5Dc09mczsKKworCQkvKiBhZHZhbmNlIG9uZSBzdGVwICovCisJCXBQcmV2RGVzY3IgPSBwRGVzY3I7CisJCXBEZXNjciA9IHBOZXh0RGVzY3I7CisJCXBOZXh0RGVzY3IgPSAoUlhEKikgKCgoY2hhciopcERlc2NyKSArIERlc2NyU2l6ZSk7CisJCVZOZXh0RGVzY3IgKz0gRGVzY3JTaXplOworCX0KKwlwUHJldkRlc2NyLT5wTmV4dFJ4ZCA9IChSWEQqKSBwTWVtQXJlYTsKKwlwUHJldkRlc2NyLT5WTmV4dFJ4ZCA9IFZNZW1BcmVhOworCXBEZXNjciA9IChSWEQqKSBwTWVtQXJlYTsKKwkqcHBSaW5nSGVhZCA9IChSWEQqKSBwTWVtQXJlYTsKKwkqcHBSaW5nVGFpbCA9ICpwcFJpbmdIZWFkOworCSpwcFJpbmdQcmV2ID0gcFByZXZEZXNjcjsKKwkqcFJpbmdGcmVlID0gRGVzY3JOdW07Cit9IC8qIFNldHVwUmluZyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlQb3J0UmVJbml0Qm11IC0gcmUtaW5pdGlhdGUgdGhlIGRlc2NyaXB0b3IgcmluZ3MgZm9yIG9uZSBwb3J0CisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHJlaW5pdGlhbGl6ZXMgdGhlIGRlc2NyaXB0b3IgcmluZ3Mgb2Ygb25lIHBvcnQKKyAqCWluIG1lbW9yeS4gVGhlIHBvcnQgbXVzdCBiZSBzdG9wcGVkIGJlZm9yZS4KKyAqCVRoZSBIVyBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBkZXNjcmlwdG9yIHN0YXJ0IGFkZHJlc3Nlcy4KKyAqCisgKiBSZXR1cm5zOgorICoJbm9uZQorICovCitzdGF0aWMgdm9pZCBQb3J0UmVJbml0Qm11KAorU0tfQUMJKnBBQywJCS8qIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitpbnQJUG9ydEluZGV4KQkvKiBpbmRleCBvZiB0aGUgcG9ydCBmb3Igd2hpY2ggdG8gcmUtaW5pdCAqLworeworCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJKCJQb3J0UmVJbml0Qm11ICIpKTsKKworCS8qIHNldCBhZGRyZXNzIG9mIGZpcnN0IGRlc2NyaXB0b3Igb2YgcmluZyBpbiBCTVUgKi8KKwlTS19PVVQzMihwQUMtPklvQmFzZSwgVHhRdWV1ZUFkZHJbUG9ydEluZGV4XVtUWF9QUklPX0xPV10rIFFfREFfTCwKKwkJKHVpbnQzMl90KSgoKGNhZGRyX3QpCisJCShwQUMtPlR4UG9ydFtQb3J0SW5kZXhdW1RYX1BSSU9fTE9XXS5wVHhkUmluZ0hlYWQpIC0KKwkJcEFDLT5UeFBvcnRbUG9ydEluZGV4XVtUWF9QUklPX0xPV10ucFR4RGVzY3JSaW5nICsKKwkJcEFDLT5UeFBvcnRbUG9ydEluZGV4XVtUWF9QUklPX0xPV10uVlR4RGVzY3JSaW5nKSAmCisJCTB4RkZGRkZGRkYpKTsKKwlTS19PVVQzMihwQUMtPklvQmFzZSwgVHhRdWV1ZUFkZHJbUG9ydEluZGV4XVtUWF9QUklPX0xPV10rIFFfREFfSCwKKwkJKHVpbnQzMl90KSgoKGNhZGRyX3QpCisJCShwQUMtPlR4UG9ydFtQb3J0SW5kZXhdW1RYX1BSSU9fTE9XXS5wVHhkUmluZ0hlYWQpIC0KKwkJcEFDLT5UeFBvcnRbUG9ydEluZGV4XVtUWF9QUklPX0xPV10ucFR4RGVzY3JSaW5nICsKKwkJcEFDLT5UeFBvcnRbUG9ydEluZGV4XVtUWF9QUklPX0xPV10uVlR4RGVzY3JSaW5nKSA+PiAzMikpOworCVNLX09VVDMyKHBBQy0+SW9CYXNlLCBSeFF1ZXVlQWRkcltQb3J0SW5kZXhdK1FfREFfTCwKKwkJKHVpbnQzMl90KSgoKGNhZGRyX3QpKHBBQy0+UnhQb3J0W1BvcnRJbmRleF0ucFJ4ZFJpbmdIZWFkKSAtCisJCXBBQy0+UnhQb3J0W1BvcnRJbmRleF0ucFJ4RGVzY3JSaW5nICsKKwkJcEFDLT5SeFBvcnRbUG9ydEluZGV4XS5WUnhEZXNjclJpbmcpICYgMHhGRkZGRkZGRikpOworCVNLX09VVDMyKHBBQy0+SW9CYXNlLCBSeFF1ZXVlQWRkcltQb3J0SW5kZXhdK1FfREFfSCwKKwkJKHVpbnQzMl90KSgoKGNhZGRyX3QpKHBBQy0+UnhQb3J0W1BvcnRJbmRleF0ucFJ4ZFJpbmdIZWFkKSAtCisJCXBBQy0+UnhQb3J0W1BvcnRJbmRleF0ucFJ4RGVzY3JSaW5nICsKKwkJcEFDLT5SeFBvcnRbUG9ydEluZGV4XS5WUnhEZXNjclJpbmcpID4+IDMyKSk7Cit9IC8qIFBvcnRSZUluaXRCbXUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VJc3IgLSBoYW5kbGUgYWRhcHRlciBpbnRlcnJ1cHRzCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGUgaW50ZXJydXB0IHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gdGhlIG5ldHdvcmsgYWRhcHRlcgorICoJZ2VuZXJhdGVzIGFuIGludGVycnVwdC4gSXQgbWF5IGFsc28gYmUgY2FsbGVkIGlmIGFub3RoZXIgZGV2aWNlCisgKglzaGFyZXMgdGhpcyBpbnRlcnJ1cHQgdmVjdG9yIHdpdGggdGhlIGRyaXZlci4KKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqCisgKi8KK3N0YXRpYyBTa0lzclJldFZhciBTa0dlSXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnB0cmVncykKK3sKK3N0cnVjdCBTS19ORVRfREVWSUNFICpkZXYgPSAoc3RydWN0IFNLX05FVF9ERVZJQ0UgKilkZXZfaWQ7CitERVZfTkVUCQkqcE5ldDsKK1NLX0FDCQkqcEFDOworU0tfVTMyCQlJbnRTcmM7CQkvKiBpbnRlcnJ1cHRzIHNvdXJjZSByZWdpc3RlciBjb250ZW50cyAqLwkKKworCXBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCXBBQyA9IHBOZXQtPnBBQzsKKwkKKwkvKgorCSAqIENoZWNrIGFuZCBwcm9jZXNzIGlmIGl0cyBvdXIgaW50ZXJydXB0CisJICovCisJU0tfSU4zMihwQUMtPklvQmFzZSwgQjBfU1BfSVNSQywgJkludFNyYyk7CisJaWYgKEludFNyYyA9PSAwKSB7CisJCXJldHVybiBTa0lzclJldE5vbmU7CisJfQorCisJd2hpbGUgKCgoSW50U3JjICYgSVJRX01BU0spICYgflNQRUNJQUxfSVJRUykgIT0gMCkgeworI2lmIDAgLyogc29mdHdhcmUgaXJxIGN1cnJlbnRseSBub3QgdXNlZCAqLworCQlpZiAoSW50U3JjICYgSVNfSVJRX1NXKSB7CisJCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsCisJCQkJU0tfREJHQ0FUX0RSVl9JTlRfU1JDLAorCQkJCSgiU29mdHdhcmUgSVJRXG4iKSk7CisJCX0KKyNlbmRpZgorCQlpZiAoSW50U3JjICYgSVNfUjFfRikgeworCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCVNLX0RCR0NBVF9EUlZfSU5UX1NSQywKKwkJCQkoIkVPRiBSWDEgSVJRXG4iKSk7CisJCQlSZWNlaXZlSXJxKHBBQywgJnBBQy0+UnhQb3J0WzBdLCBTS19UUlVFKTsKKwkJCVNLX1BOTUlfQ05UX1JYX0lOVFIocEFDLCAwKTsKKwkJfQorCQlpZiAoSW50U3JjICYgSVNfUjJfRikgeworCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCVNLX0RCR0NBVF9EUlZfSU5UX1NSQywKKwkJCQkoIkVPRiBSWDIgSVJRXG4iKSk7CisJCQlSZWNlaXZlSXJxKHBBQywgJnBBQy0+UnhQb3J0WzFdLCBTS19UUlVFKTsKKwkJCVNLX1BOTUlfQ05UX1JYX0lOVFIocEFDLCAxKTsKKwkJfQorI2lmZGVmIFVTRV9UWF9DT01QTEVURSAvKiBvbmx5IGlmIHR4IGNvbXBsZXRlIGludGVycnVwdCB1c2VkICovCisJCWlmIChJbnRTcmMgJiBJU19YQTFfRikgeworCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCVNLX0RCR0NBVF9EUlZfSU5UX1NSQywKKwkJCQkoIkVPRiBBUyBUWDEgSVJRXG4iKSk7CisJCQlTS19QTk1JX0NOVF9UWF9JTlRSKHBBQywgMCk7CisJCQlzcGluX2xvY2soJnBBQy0+VHhQb3J0WzBdW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrKTsKKwkJCUZyZWVUeERlc2NyaXB0b3JzKHBBQywgJnBBQy0+VHhQb3J0WzBdW1RYX1BSSU9fTE9XXSk7CisJCQlzcGluX3VubG9jaygmcEFDLT5UeFBvcnRbMF1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2spOworCQl9CisJCWlmIChJbnRTcmMgJiBJU19YQTJfRikgeworCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCVNLX0RCR0NBVF9EUlZfSU5UX1NSQywKKwkJCQkoIkVPRiBBUyBUWDIgSVJRXG4iKSk7CisJCQlTS19QTk1JX0NOVF9UWF9JTlRSKHBBQywgMSk7CisJCQlzcGluX2xvY2soJnBBQy0+VHhQb3J0WzFdW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrKTsKKwkJCUZyZWVUeERlc2NyaXB0b3JzKHBBQywgJnBBQy0+VHhQb3J0WzFdW1RYX1BSSU9fTE9XXSk7CisJCQlzcGluX3VubG9jaygmcEFDLT5UeFBvcnRbMV1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2spOworCQl9CisjaWYgMCAvKiBvbmx5IGlmIHN5bmMuIHF1ZXVlcyB1c2VkICovCisJCWlmIChJbnRTcmMgJiBJU19YUzFfRikgeworCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCVNLX0RCR0NBVF9EUlZfSU5UX1NSQywKKwkJCQkoIkVPRiBTWSBUWDEgSVJRXG4iKSk7CisJCQlTS19QTk1JX0NOVF9UWF9JTlRSKHBBQywgMSk7CisJCQlzcGluX2xvY2soJnBBQy0+VHhQb3J0WzBdW1RYX1BSSU9fSElHSF0uVHhEZXNSaW5nTG9jayk7CisJCQlGcmVlVHhEZXNjcmlwdG9ycyhwQUMsIDAsIFRYX1BSSU9fSElHSCk7CisJCQlzcGluX3VubG9jaygmcEFDLT5UeFBvcnRbMF1bVFhfUFJJT19ISUdIXS5UeERlc1JpbmdMb2NrKTsKKwkJCUNsZWFyVHhJcnEocEFDLCAwLCBUWF9QUklPX0hJR0gpOworCQl9CisJCWlmIChJbnRTcmMgJiBJU19YUzJfRikgeworCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCVNLX0RCR0NBVF9EUlZfSU5UX1NSQywKKwkJCQkoIkVPRiBTWSBUWDIgSVJRXG4iKSk7CisJCQlTS19QTk1JX0NOVF9UWF9JTlRSKHBBQywgMSk7CisJCQlzcGluX2xvY2soJnBBQy0+VHhQb3J0WzFdW1RYX1BSSU9fSElHSF0uVHhEZXNSaW5nTG9jayk7CisJCQlGcmVlVHhEZXNjcmlwdG9ycyhwQUMsIDEsIFRYX1BSSU9fSElHSCk7CisJCQlzcGluX3VubG9jaygmcEFDLT5UeFBvcnRbMV1bVFhfUFJJT19ISUdIXS5UeERlc1JpbmdMb2NrKTsKKwkJCUNsZWFyVHhJcnEocEFDLCAxLCBUWF9QUklPX0hJR0gpOworCQl9CisjZW5kaWYKKyNlbmRpZgorCisJCS8qIGRvIGFsbCBJTyBhdCBvbmNlICovCisJCWlmIChJbnRTcmMgJiBJU19SMV9GKQorCQkJQ2xlYXJBbmRTdGFydFJ4KHBBQywgMCk7CisJCWlmIChJbnRTcmMgJiBJU19SMl9GKQorCQkJQ2xlYXJBbmRTdGFydFJ4KHBBQywgMSk7CisjaWZkZWYgVVNFX1RYX0NPTVBMRVRFIC8qIG9ubHkgaWYgdHggY29tcGxldGUgaW50ZXJydXB0IHVzZWQgKi8KKwkJaWYgKEludFNyYyAmIElTX1hBMV9GKQorCQkJQ2xlYXJUeElycShwQUMsIDAsIFRYX1BSSU9fTE9XKTsKKwkJaWYgKEludFNyYyAmIElTX1hBMl9GKQorCQkJQ2xlYXJUeElycShwQUMsIDEsIFRYX1BSSU9fTE9XKTsKKyNlbmRpZgorCQlTS19JTjMyKHBBQy0+SW9CYXNlLCBCMF9JU1JDLCAmSW50U3JjKTsKKwl9IC8qIHdoaWxlIChJbnRTcmMgJiBJUlFfTUFTSyAhPSAwKSAqLworCisJSW50U3JjICY9IHBBQy0+R0luaS5HSVZhbElycU1hc2s7CisJaWYgKChJbnRTcmMgJiBTUEVDSUFMX0lSUVMpIHx8IHBBQy0+Q2hlY2tRdWV1ZSkgeworCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfSU5UX1NSQywKKwkJCSgiU1BFQ0lBTCBJUlEgRFAtQ2FyZHMgPT4gJXhcbiIsIEludFNyYykpOworCQlwQUMtPkNoZWNrUXVldWUgPSBTS19GQUxTRTsKKwkJc3Bpbl9sb2NrKCZwQUMtPlNsb3dQYXRoTG9jayk7CisJCWlmIChJbnRTcmMgJiBTUEVDSUFMX0lSUVMpCisJCQlTa0dlU2lycUlzcihwQUMsIHBBQy0+SW9CYXNlLCBJbnRTcmMpOworCisJCVNrRXZlbnREaXNwYXRjaGVyKHBBQywgcEFDLT5Jb0Jhc2UpOworCQlzcGluX3VubG9jaygmcEFDLT5TbG93UGF0aExvY2spOworCX0KKwkvKgorCSAqIGRvIGl0IGFsbCBhZ2FpbiBpcyBjYXNlIHdlIGNsZWFyZWQgYW4gaW50ZXJydXB0IHRoYXQKKwkgKiBjYW1lIGluIGFmdGVyIGhhbmRsaW5nIHRoZSByaW5nIChPVVRzIG1heSBiZSBkZWxheWVkCisJICogaW4gaGFyZHdhcmUgYnVmZmVycywgYnV0IGFyZSB0aHJvdWdoIGFmdGVyIElOKQorCSAqCisJICogcnJvZXNsZXI6IGhhcyBiZWVuIGNvbW1lbnRlZCBvdXQgYW5kIHNoaWZ0ZWQgdG8KKwkgKiAgICAgICAgICAgU2tHZURydkV2ZW50KCksIGJlY2F1c2UgaXQgaXMgdGltZXIKKwkgKiAgICAgICAgICAgZ3VhcmRlZCBub3cKKwkgKgorCVJlY2VpdmVJcnEocEFDLCAmcEFDLT5SeFBvcnRbMF0sIFNLX1RSVUUpOworCVJlY2VpdmVJcnEocEFDLCAmcEFDLT5SeFBvcnRbMV0sIFNLX1RSVUUpOworCSAqLworCisJaWYgKHBBQy0+Q2hlY2tRdWV1ZSkgeworCQlwQUMtPkNoZWNrUXVldWUgPSBTS19GQUxTRTsKKwkJc3Bpbl9sb2NrKCZwQUMtPlNsb3dQYXRoTG9jayk7CisJCVNrRXZlbnREaXNwYXRjaGVyKHBBQywgcEFDLT5Jb0Jhc2UpOworCQlzcGluX3VubG9jaygmcEFDLT5TbG93UGF0aExvY2spOworCX0KKworCS8qIElSUSBpcyBwcm9jZXNzZWQgLSBFbmFibGUgSVJRcyBhZ2FpbiovCisJU0tfT1VUMzIocEFDLT5Jb0Jhc2UsIEIwX0lNU0ssIHBBQy0+R0luaS5HSVZhbElycU1hc2spOworCisJCXJldHVybiBTa0lzclJldEhhbmRsZWQ7Cit9IC8qIFNrR2VJc3IgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VJc3JPbmVQb3J0IC0gaGFuZGxlIGFkYXB0ZXIgaW50ZXJydXB0cyBmb3Igc2luZ2xlIHBvcnQgYWRhcHRlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhlIGludGVycnVwdCByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBuZXR3b3JrIGFkYXB0ZXIKKyAqCWdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQuIEl0IG1heSBhbHNvIGJlIGNhbGxlZCBpZiBhbm90aGVyIGRldmljZQorICoJc2hhcmVzIHRoaXMgaW50ZXJydXB0IHZlY3RvciB3aXRoIHRoZSBkcml2ZXIuCisgKglUaGlzIGlzIHRoZSBzYW1lIGFzIGFib3ZlLCBidXQgaGFuZGxlcyBvbmx5IG9uZSBwb3J0LgorICoKKyAqIFJldHVybnM6IE4vQQorICoKKyAqLworc3RhdGljIFNrSXNyUmV0VmFyIFNrR2VJc3JPbmVQb3J0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnB0cmVncykKK3sKK3N0cnVjdCBTS19ORVRfREVWSUNFICpkZXYgPSAoc3RydWN0IFNLX05FVF9ERVZJQ0UgKilkZXZfaWQ7CitERVZfTkVUCQkqcE5ldDsKK1NLX0FDCQkqcEFDOworU0tfVTMyCQlJbnRTcmM7CQkvKiBpbnRlcnJ1cHRzIHNvdXJjZSByZWdpc3RlciBjb250ZW50cyAqLwkKKworCXBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCXBBQyA9IHBOZXQtPnBBQzsKKwkKKwkvKgorCSAqIENoZWNrIGFuZCBwcm9jZXNzIGlmIGl0cyBvdXIgaW50ZXJydXB0CisJICovCisJU0tfSU4zMihwQUMtPklvQmFzZSwgQjBfU1BfSVNSQywgJkludFNyYyk7CisJaWYgKEludFNyYyA9PSAwKSB7CisJCXJldHVybiBTa0lzclJldE5vbmU7CisJfQorCQorCXdoaWxlICgoKEludFNyYyAmIElSUV9NQVNLKSAmIH5TUEVDSUFMX0lSUVMpICE9IDApIHsKKyNpZiAwIC8qIHNvZnR3YXJlIGlycSBjdXJyZW50bHkgbm90IHVzZWQgKi8KKwkJaWYgKEludFNyYyAmIElTX0lSUV9TVykgeworCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCVNLX0RCR0NBVF9EUlZfSU5UX1NSQywKKwkJCQkoIlNvZnR3YXJlIElSUVxuIikpOworCQl9CisjZW5kaWYKKwkJaWYgKEludFNyYyAmIElTX1IxX0YpIHsKKwkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQlTS19EQkdDQVRfRFJWX0lOVF9TUkMsCisJCQkJKCJFT0YgUlgxIElSUVxuIikpOworCQkJUmVjZWl2ZUlycShwQUMsICZwQUMtPlJ4UG9ydFswXSwgU0tfVFJVRSk7CisJCQlTS19QTk1JX0NOVF9SWF9JTlRSKHBBQywgMCk7CisJCX0KKyNpZmRlZiBVU0VfVFhfQ09NUExFVEUgLyogb25seSBpZiB0eCBjb21wbGV0ZSBpbnRlcnJ1cHQgdXNlZCAqLworCQlpZiAoSW50U3JjICYgSVNfWEExX0YpIHsKKwkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQlTS19EQkdDQVRfRFJWX0lOVF9TUkMsCisJCQkJKCJFT0YgQVMgVFgxIElSUVxuIikpOworCQkJU0tfUE5NSV9DTlRfVFhfSU5UUihwQUMsIDApOworCQkJc3Bpbl9sb2NrKCZwQUMtPlR4UG9ydFswXVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jayk7CisJCQlGcmVlVHhEZXNjcmlwdG9ycyhwQUMsICZwQUMtPlR4UG9ydFswXVtUWF9QUklPX0xPV10pOworCQkJc3Bpbl91bmxvY2soJnBBQy0+VHhQb3J0WzBdW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrKTsKKwkJfQorI2lmIDAgLyogb25seSBpZiBzeW5jLiBxdWV1ZXMgdXNlZCAqLworCQlpZiAoSW50U3JjICYgSVNfWFMxX0YpIHsKKwkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQlTS19EQkdDQVRfRFJWX0lOVF9TUkMsCisJCQkJKCJFT0YgU1kgVFgxIElSUVxuIikpOworCQkJU0tfUE5NSV9DTlRfVFhfSU5UUihwQUMsIDApOworCQkJc3Bpbl9sb2NrKCZwQUMtPlR4UG9ydFswXVtUWF9QUklPX0hJR0hdLlR4RGVzUmluZ0xvY2spOworCQkJRnJlZVR4RGVzY3JpcHRvcnMocEFDLCAwLCBUWF9QUklPX0hJR0gpOworCQkJc3Bpbl91bmxvY2soJnBBQy0+VHhQb3J0WzBdW1RYX1BSSU9fSElHSF0uVHhEZXNSaW5nTG9jayk7CisJCQlDbGVhclR4SXJxKHBBQywgMCwgVFhfUFJJT19ISUdIKTsKKwkJfQorI2VuZGlmCisjZW5kaWYKKworCQkvKiBkbyBhbGwgSU8gYXQgb25jZSAqLworCQlpZiAoSW50U3JjICYgSVNfUjFfRikKKwkJCUNsZWFyQW5kU3RhcnRSeChwQUMsIDApOworI2lmZGVmIFVTRV9UWF9DT01QTEVURSAvKiBvbmx5IGlmIHR4IGNvbXBsZXRlIGludGVycnVwdCB1c2VkICovCisJCWlmIChJbnRTcmMgJiBJU19YQTFfRikKKwkJCUNsZWFyVHhJcnEocEFDLCAwLCBUWF9QUklPX0xPVyk7CisjZW5kaWYKKwkJU0tfSU4zMihwQUMtPklvQmFzZSwgQjBfSVNSQywgJkludFNyYyk7CisJfSAvKiB3aGlsZSAoSW50U3JjICYgSVJRX01BU0sgIT0gMCkgKi8KKwkKKwlJbnRTcmMgJj0gcEFDLT5HSW5pLkdJVmFsSXJxTWFzazsKKwlpZiAoKEludFNyYyAmIFNQRUNJQUxfSVJRUykgfHwgcEFDLT5DaGVja1F1ZXVlKSB7CisJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9JTlRfU1JDLAorCQkJKCJTUEVDSUFMIElSUSBTUC1DYXJkcyA9PiAleFxuIiwgSW50U3JjKSk7CisJCXBBQy0+Q2hlY2tRdWV1ZSA9IFNLX0ZBTFNFOworCQlzcGluX2xvY2soJnBBQy0+U2xvd1BhdGhMb2NrKTsKKwkJaWYgKEludFNyYyAmIFNQRUNJQUxfSVJRUykKKwkJCVNrR2VTaXJxSXNyKHBBQywgcEFDLT5Jb0Jhc2UsIEludFNyYyk7CisKKwkJU2tFdmVudERpc3BhdGNoZXIocEFDLCBwQUMtPklvQmFzZSk7CisJCXNwaW5fdW5sb2NrKCZwQUMtPlNsb3dQYXRoTG9jayk7CisJfQorCS8qCisJICogZG8gaXQgYWxsIGFnYWluIGlzIGNhc2Ugd2UgY2xlYXJlZCBhbiBpbnRlcnJ1cHQgdGhhdAorCSAqIGNhbWUgaW4gYWZ0ZXIgaGFuZGxpbmcgdGhlIHJpbmcgKE9VVHMgbWF5IGJlIGRlbGF5ZWQKKwkgKiBpbiBoYXJkd2FyZSBidWZmZXJzLCBidXQgYXJlIHRocm91Z2ggYWZ0ZXIgSU4pCisJICoKKwkgKiBycm9lc2xlcjogaGFzIGJlZW4gY29tbWVudGVkIG91dCBhbmQgc2hpZnRlZCB0bworCSAqICAgICAgICAgICBTa0dlRHJ2RXZlbnQoKSwgYmVjYXVzZSBpdCBpcyB0aW1lcgorCSAqICAgICAgICAgICBndWFyZGVkIG5vdworCSAqCisJUmVjZWl2ZUlycShwQUMsICZwQUMtPlJ4UG9ydFswXSwgU0tfVFJVRSk7CisJICovCisKKwkvKiBJUlEgaXMgcHJvY2Vzc2VkIC0gRW5hYmxlIElSUXMgYWdhaW4qLworCVNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMF9JTVNLLCBwQUMtPkdJbmkuR0lWYWxJcnFNYXNrKTsKKworCQlyZXR1cm4gU2tJc3JSZXRIYW5kbGVkOworfSAvKiBTa0dlSXNyT25lUG9ydCAqLworCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCVNrR2VQb2xsQ29udHJvbGxlciAtIHBvbGxpbmcgcmVjZWl2ZSwgZm9yIG5ldGNvbnNvbGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVBvbGxpbmcgcmVjZWl2ZSAtIHVzZWQgYnkgbmV0Y29uc29sZSBhbmQgb3RoZXIgZGlhZ25vc3RpYyB0b29scworICoJdG8gYWxsb3cgbmV0d29yayBpL28gd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICoKKyAqIFJldHVybnM6IE4vQQorICovCitzdGF0aWMgdm9pZCBTa0dlUG9sbENvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJU2tHZUlzcihkZXYtPmlycSwgZGV2LCBOVUxMKTsKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VPcGVuIC0gaGFuZGxlIHN0YXJ0IG9mIGluaXRpYWxpemVkIGFkYXB0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gc3RhcnRzIHRoZSBpbml0aWFsaXplZCBhZGFwdGVyLgorICoJVGhlIGJvYXJkIGxldmVsIHZhcmlhYmxlIGlzIHNldCBhbmQgdGhlIGFkYXB0ZXIgaXMKKyAqCWJyb3VnaHQgdG8gZnVsbCBmdW5jdGlvbmFsaXR5LgorICoJVGhlIGRldmljZSBmbGFncyBhcmUgc2V0IGZvciBvcGVyYXRpb24uCisgKglEbyBhbGwgbmVjZXNzYXJ5IGxldmVsIDIgaW5pdGlhbGl6YXRpb24sIGVuYWJsZSBpbnRlcnJ1cHRzIGFuZAorICoJZ2l2ZSBzdGFydCBjb21tYW5kIHRvIFJMTVQuCisgKgorICogUmV0dXJuczoKKyAqCTAgb24gc3VjY2VzcworICoJIT0gMCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IFNrR2VPcGVuKAorc3RydWN0IFNLX05FVF9ERVZJQ0UJKmRldikKK3sKKwlERVZfTkVUCQkJKnBOZXQ7CisJU0tfQUMJCQkqcEFDOworCXVuc2lnbmVkIGxvbmcJRmxhZ3M7CQkvKiBmb3Igc3BpbiBsb2NrICovCisJaW50CQkJCWk7CisJU0tfRVZQQVJBCQlFdlBhcmE7CQkvKiBhbiBldmVudCBwYXJhbWV0ZXIgdW5pb24gKi8KKworCXBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCXBBQyA9IHBOZXQtPnBBQzsKKwkKKwlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRU5UUlksCisJCSgiU2tHZU9wZW46IHBBQz0weCVsWDpcbiIsICh1bnNpZ25lZCBsb25nKXBBQykpOworCisjaWZkZWYgU0tfRElBR19TVVBQT1JUCisJaWYgKHBBQy0+RGlhZ01vZGVBY3RpdmUgPT0gRElBR19BQ1RJVkUpIHsKKwkJaWYgKHBBQy0+UG5taS5EaWFnQXR0YWNoZWQgPT0gU0tfRElBR19SVU5OSU5HKSB7CisJCQlyZXR1cm4gKC0xKTsgICAvKiBzdGlsbCBpbiB1c2UgYnkgZGlhZzsgZGVueSBhY3Rpb25zICovCisJCX0gCisJfQorI2VuZGlmCisKKwkvKiBTZXQgYmxpbmsgbW9kZSAqLworCWlmICgocEFDLT5QY2lEZXYtPnZlbmRvciA9PSAweDExODYpIHx8IChwQUMtPlBjaURldi0+dmVuZG9yID09IDB4MTFhYiApKQorCQlwQUMtPkdJbmkuR0lMZWRCbGlua0N0cmwgPSBPRU1fQ09ORklHX1ZBTFVFOworCisJaWYgKHBBQy0+Qm9hcmRMZXZlbCA9PSBTS19JTklUX0RBVEEpIHsKKwkJLyogbGV2ZWwgMSBpbml0IGNvbW1vbiBtb2R1bGVzIGhlcmUgKi8KKwkJaWYgKFNrR2VJbml0KHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfSU8pICE9IDApIHsKKwkJCXByaW50aygiJXM6IEhXSW5pdCAoMSkgZmFpbGVkLlxuIiwgcEFDLT5kZXZbcE5ldC0+UG9ydE5yXS0+bmFtZSk7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlTa0kyY0luaXQJKHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfSU8pOworCQlTa0V2ZW50SW5pdAkocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9JTyk7CisJCVNrUG5taUluaXQJKHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfSU8pOworCQlTa0FkZHJJbml0CShwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwkJU2tSbG10SW5pdAkocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9JTyk7CisJCVNrVGltZXJJbml0CShwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwkJcEFDLT5Cb2FyZExldmVsID0gU0tfSU5JVF9JTzsKKwl9CisKKwlpZiAocEFDLT5Cb2FyZExldmVsICE9IFNLX0lOSVRfUlVOKSB7CisJCS8qIHRzY2hpbGxpbmc6IExldmVsIDIgaW5pdCBtb2R1bGVzIGhlcmUsIGNoZWNrIHJldHVybiB2YWx1ZS4gKi8KKwkJaWYgKFNrR2VJbml0KHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfUlVOKSAhPSAwKSB7CisJCQlwcmludGsoIiVzOiBIV0luaXQgKDIpIGZhaWxlZC5cbiIsIHBBQy0+ZGV2W3BOZXQtPlBvcnROcl0tPm5hbWUpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJU2tJMmNJbml0CShwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX1JVTik7CisJCVNrRXZlbnRJbml0CShwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX1JVTik7CisJCVNrUG5taUluaXQJKHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfUlVOKTsKKwkJU2tBZGRySW5pdAkocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9SVU4pOworCQlTa1JsbXRJbml0CShwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX1JVTik7CisJCVNrVGltZXJJbml0CShwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX1JVTik7CisJCXBBQy0+Qm9hcmRMZXZlbCA9IFNLX0lOSVRfUlVOOworCX0KKworCWZvciAoaT0wOyBpPHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCS8qIEVuYWJsZSB0cmFuc21pdCBkZXNjcmlwdG9yIHBvbGxpbmcuICovCisJCVNrR2VQb2xsVHhEKHBBQywgcEFDLT5Jb0Jhc2UsIGksIFNLX1RSVUUpOworCQlGaWxsUnhSaW5nKHBBQywgJnBBQy0+UnhQb3J0W2ldKTsKKwl9CisJU2tHZVllbGxvd0xFRChwQUMsIHBBQy0+SW9CYXNlLCAxKTsKKworCVN0YXJ0RHJ2Q2xlYW51cFRpbWVyKHBBQyk7CisJU2tEaW1FbmFibGVNb2RlcmF0aW9uSWZOZWVkZWQocEFDKTsJCisJU2tEaW1EaXNwbGF5TW9kZXJhdGlvblNldHRpbmdzKHBBQyk7CisKKwlwQUMtPkdJbmkuR0lWYWxJcnFNYXNrICY9IElSUV9NQVNLOworCisJLyogZW5hYmxlIEludGVycnVwdHMgKi8KKwlTS19PVVQzMihwQUMtPklvQmFzZSwgQjBfSU1TSywgcEFDLT5HSW5pLkdJVmFsSXJxTWFzayk7CisJU0tfT1VUMzIocEFDLT5Jb0Jhc2UsIEIwX0hXRV9JTVNLLCBJUlFfSFdFX01BU0spOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisKKwlpZiAoKHBBQy0+UmxtdE1vZGUgIT0gMCkgJiYgKHBBQy0+TWF4UG9ydHMgPT0gMCkpIHsKKwkJRXZQYXJhLlBhcmEzMlswXSA9IHBBQy0+UmxtdE5ldHM7CisJCUV2UGFyYS5QYXJhMzJbMV0gPSAtMTsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX1NFVF9ORVRTLAorCQkJRXZQYXJhKTsKKwkJRXZQYXJhLlBhcmEzMlswXSA9IHBBQy0+UmxtdE1vZGU7CisJCUV2UGFyYS5QYXJhMzJbMV0gPSAwOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfTU9ERV9DSEFOR0UsCisJCQlFdlBhcmEpOworCX0KKworCUV2UGFyYS5QYXJhMzJbMF0gPSBwTmV0LT5OZXROcjsKKwlFdlBhcmEuUGFyYTMyWzFdID0gLTE7CisJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX1NUQVJULCBFdlBhcmEpOworCVNrRXZlbnREaXNwYXRjaGVyKHBBQywgcEFDLT5Jb0Jhc2UpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisKKwlwQUMtPk1heFBvcnRzKys7CisJcE5ldC0+VXAgPSAxOworCisKKwlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRU5UUlksCisJCSgiU2tHZU9wZW4gc3VjZWVkZWRcbiIpKTsKKworCXJldHVybiAoMCk7Cit9IC8qIFNrR2VPcGVuICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlQ2xvc2UgLSBTdG9wIGluaXRpYWxpemVkIGFkYXB0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUNsb3NlIGluaXRpYWxpemVkIGFkYXB0ZXIuCisgKgorICogUmV0dXJuczoKKyAqCTAgLSBvbiBzdWNjZXNzCisgKgllcnJvciBjb2RlIC0gb24gZXJyb3IKKyAqLworc3RhdGljIGludCBTa0dlQ2xvc2UoCitzdHJ1Y3QgU0tfTkVUX0RFVklDRQkqZGV2KQoreworCURFVl9ORVQJCSpwTmV0OworCURFVl9ORVQJCSpuZXdQdHJOZXQ7CisJU0tfQUMJCSpwQUM7CisKKwl1bnNpZ25lZCBsb25nCUZsYWdzOwkJLyogZm9yIHNwaW4gbG9jayAqLworCWludAkJaTsKKwlpbnQJCVBvcnRJZHg7CisJU0tfRVZQQVJBCUV2UGFyYTsKKworCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJKCJTa0dlQ2xvc2U6IHBBQz0weCVsWCAiLCAodW5zaWduZWQgbG9uZylwQUMpKTsKKworCXBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCXBBQyA9IHBOZXQtPnBBQzsKKworI2lmZGVmIFNLX0RJQUdfU1VQUE9SVAorCWlmIChwQUMtPkRpYWdNb2RlQWN0aXZlID09IERJQUdfQUNUSVZFKSB7CisJCWlmIChwQUMtPkRpYWdGbG93Q3RybCA9PSBTS19GQUxTRSkgeworCQkJLyogCisJCQkqKiBub3RpZnkgdGhhdCB0aGUgaW50ZXJmYWNlIHdoaWNoIGhhcyBiZWVuIGNsb3NlZAorCQkJKiogYnkgb3BlcmF0b3IgaW50ZXJhY3Rpb24gbXVzdCBub3QgYmUgc3RhcnRlZCB1cCAKKwkJCSoqIGFnYWluIHdoZW4gdGhlIERJQUcgaGFzIGZpbmlzaGVkLiAKKwkJCSovCisJCQluZXdQdHJOZXQgPSBuZXRkZXZfcHJpdihwQUMtPmRldlswXSk7CisJCQlpZiAobmV3UHRyTmV0ID09IHBOZXQpIHsKKwkJCQlwQUMtPldhc0lmVXBbMF0gPSBTS19GQUxTRTsKKwkJCX0gZWxzZSB7CisJCQkJcEFDLT5XYXNJZlVwWzFdID0gU0tfRkFMU0U7CisJCQl9CisJCQlyZXR1cm4gMDsgLyogcmV0dXJuIHRvIHN5c3RlbSBldmVyeXRoaW5nIGlzIGZpbmUuLi4gKi8KKwkJfSBlbHNlIHsKKwkJCXBBQy0+RGlhZ0Zsb3dDdHJsID0gU0tfRkFMU0U7CisJCX0KKwl9CisjZW5kaWYKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmIChwQUMtPlJsbXROZXRzID09IDEpCisJCVBvcnRJZHggPSBwQUMtPkFjdGl2ZVBvcnQ7CisJZWxzZQorCQlQb3J0SWR4ID0gcE5ldC0+TmV0TnI7CisKKyAgICAgICAgU3RvcERydkNsZWFudXBUaW1lcihwQUMpOworCisJLyoKKwkgKiBDbGVhciBtdWx0aWNhc3QgdGFibGUsIHByb21pc2N1b3VzIG1vZGUgLi4uLgorCSAqLworCVNrQWRkck1jQ2xlYXIocEFDLCBwQUMtPklvQmFzZSwgUG9ydElkeCwgMCk7CisJU2tBZGRyUHJvbWlzY3VvdXNDaGFuZ2UocEFDLCBwQUMtPklvQmFzZSwgUG9ydElkeCwKKwkJU0tfUFJPTV9NT0RFX05PTkUpOworCisJaWYgKHBBQy0+TWF4UG9ydHMgPT0gMSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJCVNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMF9JTVNLLCAwKTsKKwkJRXZQYXJhLlBhcmEzMlswXSA9IHBOZXQtPk5ldE5yOworCQlFdlBhcmEuUGFyYTMyWzFdID0gLTE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9TVE9QLCBFdlBhcmEpOworCQlTa0V2ZW50RGlzcGF0Y2hlcihwQUMsIHBBQy0+SW9CYXNlKTsKKwkJU0tfT1VUMzIocEFDLT5Jb0Jhc2UsIEIwX0lNU0ssIDApOworCQkvKiBzdG9wIHRoZSBoYXJkd2FyZSAqLworCQlTa0dlRGVJbml0KHBBQywgcEFDLT5Jb0Jhc2UpOworCQlwQUMtPkJvYXJkTGV2ZWwgPSBTS19JTklUX0RBVEE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJfSBlbHNlIHsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwkJRXZQYXJhLlBhcmEzMlswXSA9IHBOZXQtPk5ldE5yOworCQlFdlBhcmEuUGFyYTMyWzFdID0gLTE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9TVE9QLCBFdlBhcmEpOworCQlTa1BubWlFdmVudChwQUMsIHBBQy0+SW9CYXNlLCBTS19QTk1JX0VWVF9YTUFDX1JFU0VULCBFdlBhcmEpOworCQlTa0V2ZW50RGlzcGF0Y2hlcihwQUMsIHBBQy0+SW9CYXNlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwkJCisJCS8qIFN0b3AgcG9ydCAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcEFDLT5UeFBvcnRbcE5ldC0+UG9ydE5yXQorCQkJW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrLCBGbGFncyk7CisJCVNrR2VTdG9wUG9ydChwQUMsIHBBQy0+SW9CYXNlLCBwTmV0LT5Qb3J0TnIsCisJCQlTS19TVE9QX0FMTCwgU0tfSEFSRF9SU1QpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwQUMtPlR4UG9ydFtwTmV0LT5Qb3J0TnJdCisJCQlbVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2ssIEZsYWdzKTsKKwl9CisKKwlpZiAocEFDLT5SbG10TmV0cyA9PSAxKSB7CisJCS8qIGNsZWFyIGFsbCBkZXNjcmlwdG9yIHJpbmdzICovCisJCWZvciAoaT0wOyBpPHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCQlSZWNlaXZlSXJxKHBBQywgJnBBQy0+UnhQb3J0W2ldLCBTS19UUlVFKTsKKwkJCUNsZWFyUnhSaW5nKHBBQywgJnBBQy0+UnhQb3J0W2ldKTsKKwkJCUNsZWFyVHhSaW5nKHBBQywgJnBBQy0+VHhQb3J0W2ldW1RYX1BSSU9fTE9XXSk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBjbGVhciBwb3J0IGRlc2NyaXB0b3IgcmluZ3MgKi8KKwkJUmVjZWl2ZUlycShwQUMsICZwQUMtPlJ4UG9ydFtwTmV0LT5Qb3J0TnJdLCBTS19UUlVFKTsKKwkJQ2xlYXJSeFJpbmcocEFDLCAmcEFDLT5SeFBvcnRbcE5ldC0+UG9ydE5yXSk7CisJCUNsZWFyVHhSaW5nKHBBQywgJnBBQy0+VHhQb3J0W3BOZXQtPlBvcnROcl1bVFhfUFJJT19MT1ddKTsKKwl9CisKKwlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRU5UUlksCisJCSgiU2tHZUNsb3NlOiBkb25lICIpKTsKKworCVNLX01FTVNFVCgmKHBBQy0+UG5taUJhY2t1cCksIDAsIHNpemVvZihTS19QTk1JX1NUUlVDVF9EQVRBKSk7CisJU0tfTUVNQ1BZKCYocEFDLT5Qbm1pQmFja3VwKSwgJihwQUMtPlBubWlTdHJ1Y3QpLCAKKwkJCXNpemVvZihTS19QTk1JX1NUUlVDVF9EQVRBKSk7CisKKwlwQUMtPk1heFBvcnRzLS07CisJcE5ldC0+VXAgPSAwOworCisJcmV0dXJuICgwKTsKK30gLyogU2tHZUNsb3NlICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCVNrR2VYbWl0IC0gTGludXggZnJhbWUgdHJhbnNtaXQgZnVuY3Rpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoZSBzeXN0ZW0gY2FsbHMgdGhpcyBmdW5jdGlvbiB0byBzZW5kIGZyYW1lcyBvbnRvIHRoZSB3aXJlLgorICoJSXQgcHV0cyB0aGUgZnJhbWUgaW4gdGhlIHR4IGRlc2NyaXB0b3IgcmluZy4gSWYgdGhlIHJpbmcgaXMKKyAqCWZ1bGwgdGhlbiwgdGhlICd0YnVzeScgZmxhZyBpcyBzZXQuCisgKgorICogUmV0dXJuczoKKyAqCTAsIGlmIGV2ZXJ5dGhpbmcgaXMgb2sKKyAqCSE9MCwgb24gZXJyb3IKKyAqIFdBUk5JTkc6IHJldHVybmluZyAxIGluICd0YnVzeScgY2FzZSBjYXVzZWQgc3lzdGVtIGNyYXNoZXMgKGRvdWJsZQorICoJYWxsb2NhdGVkIHNrYidzKSAhISEKKyAqLworc3RhdGljIGludCBTa0dlWG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2KQoreworREVWX05FVAkJKnBOZXQ7CitTS19BQwkJKnBBQzsKK2ludAkJCVJjOwkvKiByZXR1cm4gY29kZSBvZiBYbWl0RnJhbWUgKi8KKworCXBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCXBBQyA9IHBOZXQtPnBBQzsKKworCWlmICgoIXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MpIHx8CisJCShwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9HRU5FU0lTKSkgeworCQkvKiBEb24ndCBhY3RpdmF0ZSBzY2F0dGVyLWdhdGhlciBhbmQgaGFyZHdhcmUgY2hlY2tzdW0gKi8KKworCQlpZiAocEFDLT5SbG10TmV0cyA9PSAyKQorCQkJUmMgPSBYbWl0RnJhbWUoCisJCQkJcEFDLAorCQkJCSZwQUMtPlR4UG9ydFtwTmV0LT5Qb3J0TnJdW1RYX1BSSU9fTE9XXSwKKwkJCQlza2IpOworCQllbHNlCisJCQlSYyA9IFhtaXRGcmFtZSgKKwkJCQlwQUMsCisJCQkJJnBBQy0+VHhQb3J0W3BBQy0+QWN0aXZlUG9ydF1bVFhfUFJJT19MT1ddLAorCQkJCXNrYik7CisJfSBlbHNlIHsKKwkJLyogc2NhdHRlci1nYXRoZXIgYW5kIGhhcmR3YXJlIFRDUCBjaGVja3N1bW1pbmcgYW5hYmxlZCovCisJCWlmIChwQUMtPlJsbXROZXRzID09IDIpCisJCQlSYyA9IFhtaXRGcmFtZVNHKAorCQkJCXBBQywKKwkJCQkmcEFDLT5UeFBvcnRbcE5ldC0+UG9ydE5yXVtUWF9QUklPX0xPV10sCisJCQkJc2tiKTsKKwkJZWxzZQorCQkJUmMgPSBYbWl0RnJhbWVTRygKKwkJCQlwQUMsCisJCQkJJnBBQy0+VHhQb3J0W3BBQy0+QWN0aXZlUG9ydF1bVFhfUFJJT19MT1ddLAorCQkJCXNrYik7CisJfQorCisJLyogVHJhbnNtaXR0ZXIgb3V0IG9mIHJlc291cmNlcz8gKi8KKwlpZiAoUmMgPD0gMCkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJfQorCisJLyogSWYgbm90IHRha2VuLCBnaXZlIGJ1ZmZlciBvd25lcnNoaXAgYmFjayB0byB0aGUKKwkgKiBxdWV1ZWluZyBsYXllci4KKwkgKi8KKwlpZiAoUmMgPCAwKQorCQlyZXR1cm4gKDEpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcmV0dXJuICgwKTsKK30gLyogU2tHZVhtaXQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJWG1pdEZyYW1lIC0gZmlsbCBvbmUgc29ja2V0IGJ1ZmZlciBpbnRvIHRoZSB0cmFuc21pdCByaW5nCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHB1dHMgYSBtZXNzYWdlIGludG8gdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZworICoJaWYgdGhlcmUgaXMgYSBkZXNjcmlwdG9ycyBsZWZ0LgorICoJTGludXggc2tiJ3MgY29uc2lzdCBvZiBvbmx5IG9uZSBjb250aW51b3VzIGJ1ZmZlci4KKyAqCVRoZSBmaXJzdCBzdGVwIGxvY2tzIHRoZSByaW5nLiBJdCBpcyBoZWxkIGxvY2tlZAorICoJYWxsIHRpbWUgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBTV0lUQ0hfLi4vUE9SVF9SRVNFVC4KKyAqCVRoZW4gdGhlIGRlc2NyaXB0b3JpcyBhbGxvY2F0ZWQuCisgKglUaGUgc2Vjb25kIHBhcnQgaXMgbGlua2luZyB0aGUgYnVmZmVyIHRvIHRoZSBkZXNjcmlwdG9yLgorICoJQXQgdGhlIHZlcnkgbGFzdCwgdGhlIENvbnRyb2wgZmllbGQgb2YgdGhlIGRlc2NyaXB0b3IKKyAqCWlzIG1hZGUgdmFsaWQgZm9yIHRoZSBCTVUgYW5kIGEgc3RhcnQgVFggY29tbWFuZCBpcyBnaXZlbgorICoJaWYgbmVjZXNzYXJ5LgorICoKKyAqIFJldHVybnM6CisgKgk+IDAgLSBvbiBzdWNjZXM6IHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIG1lc3NhZ2UKKyAqCT0gMCAtIG9uIHJlc291cmNlIHNob3J0YWdlOiB0aGlzIGZyYW1lIHNlbnQgb3IgZHJvcHBlZCwgbm93CisgKgkJdGhlIHJpbmcgaXMgZnVsbCAoIC0+IHNldCB0YnVzeSkKKyAqCTwgMCAtIG9uIGZhaWx1cmU6IG90aGVyIHByb2JsZW1zICggLT4gcmV0dXJuIGZhaWx1cmUgdG8gdXBwZXIgbGF5ZXJzKQorICovCitzdGF0aWMgaW50IFhtaXRGcmFtZSgKK1NLX0FDIAkJKnBBQywJCS8qIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICAgICAgICAgICAqLworVFhfUE9SVAkJKnBUeFBvcnQsCS8qIHBvaW50ZXIgdG8gc3RydWN0IG9mIHBvcnQgdG8gc2VuZCB0byAqLworc3RydWN0IHNrX2J1ZmYJKnBNZXNzYWdlKQkvKiBwb2ludGVyIHRvIHNlbmQtbWVzc2FnZSAgICAgICAgICAgICAgKi8KK3sKKwlUWEQJCSpwVHhkOwkJLyogdGhlIHJ4ZCB0byBmaWxsICovCisJVFhECQkqcE9sZFR4ZDsKKwl1bnNpZ25lZCBsb25nCSBGbGFnczsKKwlTS19VNjQJCSBQaHlzQWRkcjsKKwlpbnQJIAkgUHJvdG9jb2w7CisJaW50CQkgSXBIZWFkZXJMZW5ndGg7CisJaW50CQkgQnl0ZXNTZW5kID0gcE1lc3NhZ2UtPmxlbjsKKworCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9UWF9QUk9HUkVTUywgKCJYIikpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBUeFBvcnQtPlR4RGVzUmluZ0xvY2ssIEZsYWdzKTsKKyNpZm5kZWYgVVNFX1RYX0NPTVBMRVRFCisJRnJlZVR4RGVzY3JpcHRvcnMocEFDLCBwVHhQb3J0KTsKKyNlbmRpZgorCWlmIChwVHhQb3J0LT5UeGRSaW5nRnJlZSA9PSAwKSB7CisJCS8qIAorCQkqKiBubyBlbm91Z2ggZnJlZSBkZXNjcmlwdG9ycyBpbiByaW5nIGF0IHRoZSBtb21lbnQuCisJCSoqIE1heWJlIGZyZWUnaW5nIHNvbWUgb2xkIG9uZSBoZWxwPworCQkqLworCQlGcmVlVHhEZXNjcmlwdG9ycyhwQUMsIHBUeFBvcnQpOworCQlpZiAocFR4UG9ydC0+VHhkUmluZ0ZyZWUgPT0gMCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcFR4UG9ydC0+VHhEZXNSaW5nTG9jaywgRmxhZ3MpOworCQkJU0tfUE5NSV9DTlRfTk9fVFhfQlVGKHBBQywgcFR4UG9ydC0+UG9ydEluZGV4KTsKKwkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQlTS19EQkdDQVRfRFJWX1RYX1BST0dSRVNTLAorCQkJCSgiWG1pdEZyYW1lIGZhaWxlZFxuIikpOworCQkJLyogCisJCQkqKiB0aGUgZGVzaXJlZCBtZXNzYWdlIGNhbiBub3QgYmUgc2VudAorCQkJKiogQmVjYXVzZSB0YnVzeSBzZWVtcyB0byBiZSBzZXQsIHRoZSBtZXNzYWdlIAorCQkJKiogc2hvdWxkIG5vdCBiZSBmcmVlZCBoZXJlLiBJdCB3aWxsIGJlIHVzZWQgCisJCQkqKiBieSB0aGUgc2NoZWR1bGVyIG9mIHRoZSBldGhlcm5ldCBoYW5kbGVyIAorCQkJKi8KKwkJCXJldHVybiAoLTEpOworCQl9CisJfQorCisJLyoKKwkqKiBJZiB0aGUgcGFzc2VkIHNvY2tldCBidWZmZXIgaXMgb2Ygc21hbGxlciBNVFUtc2l6ZSB0aGFuIDYwLAorCSoqIGNvcHkgZXZlcnl0aGluZyBpbnRvIG5ldyBidWZmZXIgYW5kIGZpbGwgYWxsIGJ5dGVzIGJldHdlZW4KKwkqKiB0aGUgb3JpZ2luYWwgcGFja2V0IGVuZCBhbmQgdGhlIG5ldyBwYWNrZXQgZW5kIG9mIDYwIHdpdGggMHgwMC4KKwkqKiBUaGlzIGlzIHRvIHJlc29sdmUgZmF1bHR5IHBhZGRpbmcgYnkgdGhlIEhXIHdpdGggMHhhYSBieXRlcy4KKwkqLworCWlmIChCeXRlc1NlbmQgPCBDX0xFTl9FVEhFUk5FVF9NSU5TSVpFKSB7CisJCWlmICgocE1lc3NhZ2UgPSBza2JfcGFkdG8ocE1lc3NhZ2UsIENfTEVOX0VUSEVSTkVUX01JTlNJWkUpKSA9PSBOVUxMKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwVHhQb3J0LT5UeERlc1JpbmdMb2NrLCBGbGFncyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwTWVzc2FnZS0+bGVuID0gQ19MRU5fRVRIRVJORVRfTUlOU0laRTsKKwl9CisKKwkvKiAKKwkqKiBhZHZhbmNlIGhlYWQgY291bnRlciBiZWhpbmQgZGVzY3JpcHRvciBuZWVkZWQgZm9yIHRoaXMgZnJhbWUsIAorCSoqIHNvIHRoYXQgbmVlZGVkIGRlc2NyaXB0b3IgaXMgcmVzZXJ2ZWQgZnJvbSB0aGF0IG9uLiBUaGUgbmV4dAorCSoqIGFjdGlvbiB3aWxsIGJlIHRvIGFkZCB0aGUgcGFzc2VkIGJ1ZmZlciB0byB0aGUgVFgtZGVzY3JpcHRvcgorCSovCisJcFR4ZCA9IHBUeFBvcnQtPnBUeGRSaW5nSGVhZDsKKwlwVHhQb3J0LT5wVHhkUmluZ0hlYWQgPSBwVHhkLT5wTmV4dFR4ZDsKKwlwVHhQb3J0LT5UeGRSaW5nRnJlZS0tOworCisjaWZkZWYgU0tfRFVNUF9UWAorCUR1bXBNc2cocE1lc3NhZ2UsICJYbWl0RnJhbWUiKTsKKyNlbmRpZgorCisJLyogCisJKiogRmlyc3Qgc3RlcCBpcyB0byBtYXAgdGhlIGRhdGEgdG8gYmUgc2VudCB2aWEgdGhlIGFkYXB0ZXIgb250bworCSoqIHRoZSBETUEgbWVtb3J5LiBLZXJuZWwgMi4yIHVzZXMgdmlydF90b19idXMoKSwgYnV0IGtlcm5lbHMgMi40CisJKiogYW5kIDIuNiBuZWVkIHRvIHVzZSBwY2lfbWFwX3BhZ2UoKSBmb3IgdGhhdCBtYXBwaW5nLgorCSovCisJUGh5c0FkZHIgPSAoU0tfVTY0KSBwY2lfbWFwX3BhZ2UocEFDLT5QY2lEZXYsCisJCQkJCXZpcnRfdG9fcGFnZShwTWVzc2FnZS0+ZGF0YSksCisJCQkJCSgodW5zaWduZWQgbG9uZykgcE1lc3NhZ2UtPmRhdGEgJiB+UEFHRV9NQVNLKSwKKwkJCQkJcE1lc3NhZ2UtPmxlbiwKKwkJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJcFR4ZC0+VkRhdGFMb3cgID0gKFNLX1UzMikgKFBoeXNBZGRyICYgMHhmZmZmZmZmZik7CisJcFR4ZC0+VkRhdGFIaWdoID0gKFNLX1UzMikgKFBoeXNBZGRyID4+IDMyKTsKKwlwVHhkLT5wTUJ1ZiAgICAgPSBwTWVzc2FnZTsKKworCWlmIChwTWVzc2FnZS0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSB7CisJCVByb3RvY29sID0gKChTS19VOClwTWVzc2FnZS0+ZGF0YVtDX09GRlNFVF9JUFBST1RPXSAmIDB4ZmYpOworCQlpZiAoKFByb3RvY29sID09IENfUFJPVE9fSURfVURQKSAmJiAKKwkJCShwQUMtPkdJbmkuR0lDaGlwUmV2ID09IDApICYmCisJCQkocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfWVVLT04pKSB7CisJCQlwVHhkLT5UQkNvbnRyb2wgPSBCTVVfVENQX0NIRUNLOworCQl9IGVsc2UgeworCQkJcFR4ZC0+VEJDb250cm9sID0gQk1VX1VEUF9DSEVDSzsKKwkJfQorCisJCUlwSGVhZGVyTGVuZ3RoICA9IChTS19VOClwTWVzc2FnZS0+ZGF0YVtDX09GRlNFVF9JUEhFQURFUl07CisJCUlwSGVhZGVyTGVuZ3RoICA9IChJcEhlYWRlckxlbmd0aCAmIDB4ZikgKiA0OworCQlwVHhkLT5UY3BTdW1PZnMgPSAwOyAvKiBQSC1DaGVja3N1bSBhbHJlYWR5IGNhbGN1bGF0ZWQgKi8KKwkJcFR4ZC0+VGNwU3VtU3QgID0gQ19MRU5fRVRIRVJNQUNfSEVBREVSICsgSXBIZWFkZXJMZW5ndGggKyAKKwkJCQkJCQkoUHJvdG9jb2wgPT0gQ19QUk9UT19JRF9VRFAgPworCQkJCQkJCUNfT0ZGU0VUX1VEUEhFQURFUl9VRFBDUyA6IAorCQkJCQkJCUNfT0ZGU0VUX1RDUEhFQURFUl9UQ1BDUyk7CisJCXBUeGQtPlRjcFN1bVdyICA9IENfTEVOX0VUSEVSTUFDX0hFQURFUiArIElwSGVhZGVyTGVuZ3RoOworCisJCXBUeGQtPlRCQ29udHJvbCB8PSBCTVVfT1dOIHwgQk1VX1NURiB8IAorCQkJCSAgIEJNVV9TVyAgfCBCTVVfRU9GIHwKKyNpZmRlZiBVU0VfVFhfQ09NUExFVEUKKwkJCQkgICBCTVVfSVJRX0VPRiB8CisjZW5kaWYKKwkJCQkgICBwTWVzc2FnZS0+bGVuOworICAgICAgICB9IGVsc2UgeworCQlwVHhkLT5UQkNvbnRyb2wgPSBCTVVfT1dOIHwgQk1VX1NURiB8IEJNVV9DSEVDSyB8IAorCQkJCSAgQk1VX1NXICB8IEJNVV9FT0YgfAorI2lmZGVmIFVTRV9UWF9DT01QTEVURQorCQkJCSAgIEJNVV9JUlFfRU9GIHwKKyNlbmRpZgorCQkJcE1lc3NhZ2UtPmxlbjsKKwl9CisKKwkvKiAKKwkqKiBJZiBwcmV2aW91cyBkZXNjcmlwdG9yIGFscmVhZHkgZG9uZSwgZ2l2ZSBUWCBzdGFydCBjbWQgCisJKi8KKwlwT2xkVHhkID0geGNoZygmcFR4UG9ydC0+cFR4ZFJpbmdQcmV2LCBwVHhkKTsKKwlpZiAoKHBPbGRUeGQtPlRCQ29udHJvbCAmIEJNVV9PV04pID09IDApIHsKKwkJU0tfT1VUOChwVHhQb3J0LT5Id0FkZHIsIFFfQ1NSLCBDU1JfU1RBUlQpOworCX0JCisKKwkvKiAKKwkqKiBhZnRlciByZWxlYXNpbmcgdGhlIGxvY2ssIHRoZSBza2IgbWF5IGltbWVkaWF0ZWx5IGJlIGZyZWUnZCAKKwkqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBUeFBvcnQtPlR4RGVzUmluZ0xvY2ssIEZsYWdzKTsKKwlpZiAocFR4UG9ydC0+VHhkUmluZ0ZyZWUgIT0gMCkgeworCQlyZXR1cm4gKEJ5dGVzU2VuZCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuICgwKTsKKwl9CisKK30gLyogWG1pdEZyYW1lICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlYbWl0RnJhbWVTRyAtIGZpbGwgb25lIHNvY2tldCBidWZmZXIgaW50byB0aGUgdHJhbnNtaXQgcmluZworICogICAgICAgICAgICAgICAgKHVzZSBTRyBhbmQgVENQL1VEUCBoYXJkd2FyZSBjaGVja3N1bW1pbmcpCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHB1dHMgYSBtZXNzYWdlIGludG8gdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZworICoJaWYgdGhlcmUgaXMgYSBkZXNjcmlwdG9ycyBsZWZ0LgorICoKKyAqIFJldHVybnM6CisgKgk+IDAgLSBvbiBzdWNjZXM6IHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIG1lc3NhZ2UKKyAqCT0gMCAtIG9uIHJlc291cmNlIHNob3J0YWdlOiB0aGlzIGZyYW1lIHNlbnQgb3IgZHJvcHBlZCwgbm93CisgKgkJdGhlIHJpbmcgaXMgZnVsbCAoIC0+IHNldCB0YnVzeSkKKyAqCTwgMCAtIG9uIGZhaWx1cmU6IG90aGVyIHByb2JsZW1zICggLT4gcmV0dXJuIGZhaWx1cmUgdG8gdXBwZXIgbGF5ZXJzKQorICovCitzdGF0aWMgaW50IFhtaXRGcmFtZVNHKAorU0tfQUMgCQkqcEFDLAkJLyogcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgICAgICAgICAgICovCitUWF9QT1JUCQkqcFR4UG9ydCwJLyogcG9pbnRlciB0byBzdHJ1Y3Qgb2YgcG9ydCB0byBzZW5kIHRvICovCitzdHJ1Y3Qgc2tfYnVmZgkqcE1lc3NhZ2UpCS8qIHBvaW50ZXIgdG8gc2VuZC1tZXNzYWdlICAgICAgICAgICAgICAqLworeworCisJVFhECQkqcFR4ZDsKKwlUWEQJCSpwVHhkRnN0OworCVRYRAkJKnBUeGRMc3Q7CisJaW50IAkgCSBDdXJyRnJhZzsKKwlpbnQJCSBCeXRlc1NlbmQ7CisJaW50CQkgSXBIZWFkZXJMZW5ndGg7IAorCWludAkJIFByb3RvY29sOworCXNrYl9mcmFnX3QJKnNrX2ZyYWc7CisJU0tfVTY0CQkgUGh5c0FkZHI7CisJdW5zaWduZWQgbG9uZwkgRmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcFR4UG9ydC0+VHhEZXNSaW5nTG9jaywgRmxhZ3MpOworI2lmbmRlZiBVU0VfVFhfQ09NUExFVEUKKwlGcmVlVHhEZXNjcmlwdG9ycyhwQUMsIHBUeFBvcnQpOworI2VuZGlmCisJaWYgKChza2Jfc2hpbmZvKHBNZXNzYWdlKS0+bnJfZnJhZ3MgKzEpID4gcFR4UG9ydC0+VHhkUmluZ0ZyZWUpIHsKKwkJRnJlZVR4RGVzY3JpcHRvcnMocEFDLCBwVHhQb3J0KTsKKwkJaWYgKChza2Jfc2hpbmZvKHBNZXNzYWdlKS0+bnJfZnJhZ3MgKyAxKSA+IHBUeFBvcnQtPlR4ZFJpbmdGcmVlKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwVHhQb3J0LT5UeERlc1JpbmdMb2NrLCBGbGFncyk7CisJCQlTS19QTk1JX0NOVF9OT19UWF9CVUYocEFDLCBwVHhQb3J0LT5Qb3J0SW5kZXgpOworCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCVNLX0RCR0NBVF9EUlZfVFhfUFJPR1JFU1MsCisJCQkJKCJYbWl0RnJhbWVTRyBmYWlsZWQgLSBSaW5nIGZ1bGxcbiIpKTsKKwkJCQkvKiB0aGlzIG1lc3NhZ2UgY2FuIG5vdCBiZSBzZW50IG5vdyAqLworCQkJcmV0dXJuKC0xKTsKKwkJfQorCX0KKworCXBUeGQgICAgICA9IHBUeFBvcnQtPnBUeGRSaW5nSGVhZDsKKwlwVHhkRnN0ICAgPSBwVHhkOworCXBUeGRMc3QgICA9IHBUeGQ7CisJQnl0ZXNTZW5kID0gMDsKKwlQcm90b2NvbCAgPSAwOworCisJLyogCisJKiogTWFwIHRoZSBmaXJzdCBmcmFnbWVudCAoaGVhZGVyKSBpbnRvIHRoZSBETUEtc3BhY2UKKwkqLworCVBoeXNBZGRyID0gKFNLX1U2NCkgcGNpX21hcF9wYWdlKHBBQy0+UGNpRGV2LAorCQkJdmlydF90b19wYWdlKHBNZXNzYWdlLT5kYXRhKSwKKwkJCSgodW5zaWduZWQgbG9uZykgcE1lc3NhZ2UtPmRhdGEgJiB+UEFHRV9NQVNLKSwKKwkJCXNrYl9oZWFkbGVuKHBNZXNzYWdlKSwKKwkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCisJcFR4ZC0+VkRhdGFMb3cgID0gKFNLX1UzMikgKFBoeXNBZGRyICYgMHhmZmZmZmZmZik7CisJcFR4ZC0+VkRhdGFIaWdoID0gKFNLX1UzMikgKFBoeXNBZGRyID4+IDMyKTsKKworCS8qIAorCSoqIERvZXMgdGhlIEhXIG5lZWQgdG8gZXZhbHVhdGUgY2hlY2tzdW0gZm9yIFRDUCBvciBVRFAgcGFja2V0cz8gCisJKi8KKwlpZiAocE1lc3NhZ2UtPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQlwVHhkLT5UQkNvbnRyb2wgPSBCTVVfU1RGIHwgQk1VX1NURldEIHwgc2tiX2hlYWRsZW4ocE1lc3NhZ2UpOworCQkvKiAKKwkJKiogV2UgaGF2ZSB0byB1c2UgdGhlIG9wY29kZSBmb3IgdGNwIGhlcmUsICBiZWNhdXNlIHRoZQorCQkqKiBvcGNvZGUgZm9yIHVkcCBpcyBub3Qgd29ya2luZyBpbiB0aGUgaGFyZHdhcmUgeWV0IAorCQkqKiAoUmV2aXNpb24gMi4wKQorCQkqLworCQlQcm90b2NvbCA9ICgoU0tfVTgpcE1lc3NhZ2UtPmRhdGFbQ19PRkZTRVRfSVBQUk9UT10gJiAweGZmKTsKKwkJaWYgKChQcm90b2NvbCA9PSBDX1BST1RPX0lEX1VEUCkgJiYgCisJCQkocEFDLT5HSW5pLkdJQ2hpcFJldiA9PSAwKSAmJgorCQkJKHBBQy0+R0luaS5HSUNoaXBJZCA9PSBDSElQX0lEX1lVS09OKSkgeworCQkJcFR4ZC0+VEJDb250cm9sIHw9IEJNVV9UQ1BfQ0hFQ0s7CisJCX0gZWxzZSB7CisJCQlwVHhkLT5UQkNvbnRyb2wgfD0gQk1VX1VEUF9DSEVDSzsKKwkJfQorCisJCUlwSGVhZGVyTGVuZ3RoICA9ICgoU0tfVTgpcE1lc3NhZ2UtPmRhdGFbQ19PRkZTRVRfSVBIRUFERVJdICYgMHhmKSo0OworCQlwVHhkLT5UY3BTdW1PZnMgPSAwOyAvKiBQSC1DaGVja3N1bSBhbHJlYWR5IGNsYWN1bGF0ZWQgKi8KKwkJcFR4ZC0+VGNwU3VtU3QgID0gQ19MRU5fRVRIRVJNQUNfSEVBREVSICsgSXBIZWFkZXJMZW5ndGggKworCQkJCQkJKFByb3RvY29sID09IENfUFJPVE9fSURfVURQID8KKwkJCQkJCUNfT0ZGU0VUX1VEUEhFQURFUl9VRFBDUyA6CisJCQkJCQlDX09GRlNFVF9UQ1BIRUFERVJfVENQQ1MpOworCQlwVHhkLT5UY3BTdW1XciAgPSBDX0xFTl9FVEhFUk1BQ19IRUFERVIgKyBJcEhlYWRlckxlbmd0aDsKKwl9IGVsc2UgeworCQlwVHhkLT5UQkNvbnRyb2wgPSBCTVVfQ0hFQ0sgfCBCTVVfU1cgfCBCTVVfU1RGIHwKKwkJCQkJc2tiX2hlYWRsZW4ocE1lc3NhZ2UpOworCX0KKworCXBUeGQgPSBwVHhkLT5wTmV4dFR4ZDsKKwlwVHhQb3J0LT5UeGRSaW5nRnJlZS0tOworCUJ5dGVzU2VuZCArPSBza2JfaGVhZGxlbihwTWVzc2FnZSk7CisKKwkvKiAKKwkqKiBCcm93c2Ugb3ZlciBhbGwgU0cgZnJhZ21lbnRzIGFuZCBtYXAgZWFjaCBvZiB0aGVtIGludG8gdGhlIERNQSBzcGFjZQorCSovCisJZm9yIChDdXJyRnJhZyA9IDA7IEN1cnJGcmFnIDwgc2tiX3NoaW5mbyhwTWVzc2FnZSktPm5yX2ZyYWdzOyBDdXJyRnJhZysrKSB7CisJCXNrX2ZyYWcgPSAmc2tiX3NoaW5mbyhwTWVzc2FnZSktPmZyYWdzW0N1cnJGcmFnXTsKKwkJLyogCisJCSoqIHdlIGFscmVhZHkgaGF2ZSB0aGUgcHJvcGVyIHZhbHVlIGluIGVudHJ5CisJCSovCisJCVBoeXNBZGRyID0gKFNLX1U2NCkgcGNpX21hcF9wYWdlKHBBQy0+UGNpRGV2LAorCQkJCQkJIHNrX2ZyYWctPnBhZ2UsCisJCQkJCQkgc2tfZnJhZy0+cGFnZV9vZmZzZXQsCisJCQkJCQkgc2tfZnJhZy0+c2l6ZSwKKwkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKworCQlwVHhkLT5WRGF0YUxvdyAgPSAoU0tfVTMyKSAoUGh5c0FkZHIgJiAweGZmZmZmZmZmKTsKKwkJcFR4ZC0+VkRhdGFIaWdoID0gKFNLX1UzMikgKFBoeXNBZGRyID4+IDMyKTsKKwkJcFR4ZC0+cE1CdWYgICAgID0gcE1lc3NhZ2U7CisJCQorCQkvKiAKKwkJKiogRG9lcyB0aGUgSFcgbmVlZCB0byBldmFsdWF0ZSBjaGVja3N1bSBmb3IgVENQIG9yIFVEUCBwYWNrZXRzPyAKKwkJKi8KKwkJaWYgKHBNZXNzYWdlLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpIHsKKwkJCXBUeGQtPlRCQ29udHJvbCA9IEJNVV9PV04gfCBCTVVfU1cgfCBCTVVfU1RGV0Q7CisJCQkvKiAKKwkJCSoqIFdlIGhhdmUgdG8gdXNlIHRoZSBvcGNvZGUgZm9yIHRjcCBoZXJlIGJlY2F1c2UgdGhlIAorCQkJKiogb3Bjb2RlIGZvciB1ZHAgaXMgbm90IHdvcmtpbmcgaW4gdGhlIGhhcmR3YXJlIHlldCAKKwkJCSoqIChyZXZpc2lvbiAyLjApCisJCQkqLworCQkJaWYgKChQcm90b2NvbCA9PSBDX1BST1RPX0lEX1VEUCkgJiYgCisJCQkJKHBBQy0+R0luaS5HSUNoaXBSZXYgPT0gMCkgJiYKKwkJCQkocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfWVVLT04pKSB7CisJCQkJcFR4ZC0+VEJDb250cm9sIHw9IEJNVV9UQ1BfQ0hFQ0s7CisJCQl9IGVsc2UgeworCQkJCXBUeGQtPlRCQ29udHJvbCB8PSBCTVVfVURQX0NIRUNLOworCQkJfQorCQl9IGVsc2UgeworCQkJcFR4ZC0+VEJDb250cm9sID0gQk1VX0NIRUNLIHwgQk1VX1NXIHwgQk1VX09XTjsKKwkJfQorCisJCS8qIAorCQkqKiBEbyB3ZSBoYXZlIHRoZSBsYXN0IGZyYWdtZW50PyAKKwkJKi8KKwkJaWYoIChDdXJyRnJhZysxKSA9PSBza2Jfc2hpbmZvKHBNZXNzYWdlKS0+bnJfZnJhZ3MgKSAgeworI2lmZGVmIFVTRV9UWF9DT01QTEVURQorCQkJcFR4ZC0+VEJDb250cm9sIHw9IEJNVV9FT0YgfCBCTVVfSVJRX0VPRiB8IHNrX2ZyYWctPnNpemU7CisjZWxzZQorCQkJcFR4ZC0+VEJDb250cm9sIHw9IEJNVV9FT0YgfCBza19mcmFnLT5zaXplOworI2VuZGlmCisJCQlwVHhkRnN0LT5UQkNvbnRyb2wgfD0gQk1VX09XTiB8IEJNVV9TVzsKKworCQl9IGVsc2UgeworCQkJcFR4ZC0+VEJDb250cm9sIHw9IHNrX2ZyYWctPnNpemU7CisJCX0KKwkJcFR4ZExzdCA9IHBUeGQ7CisJCXBUeGQgICAgPSBwVHhkLT5wTmV4dFR4ZDsKKwkJcFR4UG9ydC0+VHhkUmluZ0ZyZWUtLTsKKwkJQnl0ZXNTZW5kICs9IHNrX2ZyYWctPnNpemU7CisJfQorCisJLyogCisJKiogSWYgcHJldmlvdXMgZGVzY3JpcHRvciBhbHJlYWR5IGRvbmUsIGdpdmUgVFggc3RhcnQgY21kIAorCSovCisJaWYgKChwVHhQb3J0LT5wVHhkUmluZ1ByZXYtPlRCQ29udHJvbCAmIEJNVV9PV04pID09IDApIHsKKwkJU0tfT1VUOChwVHhQb3J0LT5Id0FkZHIsIFFfQ1NSLCBDU1JfU1RBUlQpOworCX0KKworCXBUeFBvcnQtPnBUeGRSaW5nUHJldiA9IHBUeGRMc3Q7CisJcFR4UG9ydC0+cFR4ZFJpbmdIZWFkID0gcFR4ZDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBUeFBvcnQtPlR4RGVzUmluZ0xvY2ssIEZsYWdzKTsKKworCWlmIChwVHhQb3J0LT5UeGRSaW5nRnJlZSA+IDApIHsKKwkJcmV0dXJuIChCeXRlc1NlbmQpOworCX0gZWxzZSB7CisJCXJldHVybiAoMCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJRnJlZVR4RGVzY3JpcHRvcnMgLSByZWxlYXNlIGRlc2NyaXB0b3JzIGZyb20gdGhlIGRlc2NyaXB0b3IgcmluZworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiByZWxlYXNlcyBkZXNjcmlwdG9ycyBmcm9tIGEgdHJhbnNtaXQgcmluZyBpZiB0aGV5CisgKgloYXZlIGJlZW4gc2VudCBieSB0aGUgQk1VLgorICoJSWYgYSBkZXNjcmlwdG9ycyBpcyBzZW50LCBpdCBjYW4gYmUgZnJlZWQgYW5kIHRoZSBtZXNzYWdlIGNhbgorICoJYmUgZnJlZWQsIHRvby4KKyAqCVRoZSBTT0ZUV0FSRSBjb250cm9sbGFibGUgYml0IGlzIHVzZWQgdG8gcHJldmVudCBydW5uaW5nIGFyb3VuZCBhCisgKgljb21wbGV0ZWx5IGZyZWUgcmluZyBmb3IgZXZlci4gSWYgdGhpcyBiaXQgaXMgbm8gc2V0IGluIHRoZQorICoJZnJhbWUgKGJ5IFhtaXRGcmFtZSksIHRoaXMgZnJhbWUgaGFzIG5ldmVyIGJlZW4gc2VudCBvciBpcworICoJYWxyZWFkeSBmcmVlZC4KKyAqCVRoZSBUeCBkZXNjcmlwdG9yIHJpbmcgbG9jayBtdXN0IGJlIGhlbGQgd2hpbGUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uICEhIQorICoKKyAqIFJldHVybnM6CisgKglub25lCisgKi8KK3N0YXRpYyB2b2lkIEZyZWVUeERlc2NyaXB0b3JzKAorU0tfQUMJKnBBQywJCS8qIHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIgY29udGV4dCAqLworVFhfUE9SVAkqcFR4UG9ydCkJLyogcG9pbnRlciB0byBkZXN0aW5hdGlvbiBwb3J0IHN0cnVjdHVyZSAqLworeworVFhECSpwVHhkOwkJLyogcG9pbnRlciB0byB0aGUgY2hlY2tlZCBkZXNjcmlwdG9yICovCitUWEQJKnBOZXdUYWlsOwkvKiBwb2ludGVyIHRvICdlbmQnIG9mIHRoZSByaW5nICovCitTS19VMzIJQ29udHJvbDsJLyogVEJDb250cm9sIGZpZWxkIG9mIGRlc2NyaXB0b3IgKi8KK1NLX1U2NAlQaHlzQWRkcjsJLyogYWRkcmVzcyBvZiBETUEgbWFwcGluZyAqLworCisJcE5ld1RhaWwgPSBwVHhQb3J0LT5wVHhkUmluZ1RhaWw7CisJcFR4ZCAgICAgPSBwTmV3VGFpbDsKKwkvKgorCSoqIGxvb3AgZm9yZXZlcjsgZXhpdHMgaWYgQk1VX1NXIGJpdCBub3Qgc2V0IGluIHN0YXJ0IGZyYW1lCisJKiogb3IgQk1VX09XTiBiaXQgc2V0IGluIGFueSBmcmFtZQorCSovCisJd2hpbGUgKDEpIHsKKwkJQ29udHJvbCA9IHBUeGQtPlRCQ29udHJvbDsKKwkJaWYgKChDb250cm9sICYgQk1VX1NXKSA9PSAwKSB7CisJCQkvKgorCQkJKiogc29mdHdhcmUgY29udHJvbGxhYmxlIGJpdCBpcyBzZXQgaW4gZmlyc3QKKwkJCSoqIGZyYWdtZW50IHdoZW4gZ2l2ZW4gdG8gQk1VLiBOb3Qgc2V0IG1lYW5zIHRoYXQKKwkJCSoqIHRoaXMgZnJhZ21lbnQgd2FzIG5ldmVyIHNlbnQgb3IgaXMgYWxyZWFkeQorCQkJKiogZnJlZWQgKCAtPiByaW5nIGNvbXBsZXRlbHkgZnJlZSBub3cpLgorCQkJKi8KKwkJCXBUeFBvcnQtPnBUeGRSaW5nVGFpbCA9IHBUeGQ7CisJCQluZXRpZl93YWtlX3F1ZXVlKHBBQy0+ZGV2W3BUeFBvcnQtPlBvcnRJbmRleF0pOworCQkJcmV0dXJuOworCQl9CisJCWlmIChDb250cm9sICYgQk1VX09XTikgeworCQkJcFR4UG9ydC0+cFR4ZFJpbmdUYWlsID0gcFR4ZDsKKwkJCWlmIChwVHhQb3J0LT5UeGRSaW5nRnJlZSA+IDApIHsKKwkJCQluZXRpZl93YWtlX3F1ZXVlKHBBQy0+ZGV2W3BUeFBvcnQtPlBvcnRJbmRleF0pOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCQorCQkvKiAKKwkJKiogcmVsZWFzZSB0aGUgRE1BIG1hcHBpbmcsIGJlY2F1c2UgdW50aWwgbm90IHVubWFwcGVkCisJCSoqIHRoaXMgYnVmZmVyIGlzIGNvbnNpZGVyZWQgYmVpbmcgdW5kZXIgY29udHJvbCBvZiB0aGUKKwkJKiogYWRhcHRlciBjYXJkIQorCQkqLworCQlQaHlzQWRkciA9ICgoU0tfVTY0KSBwVHhkLT5WRGF0YUhpZ2gpIDw8IChTS19VNjQpIDMyOworCQlQaHlzQWRkciB8PSAoU0tfVTY0KSBwVHhkLT5WRGF0YUxvdzsKKwkJcGNpX3VubWFwX3BhZ2UocEFDLT5QY2lEZXYsIFBoeXNBZGRyLAorCQkJCSBwVHhkLT5wTUJ1Zi0+bGVuLAorCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKworCQlpZiAoQ29udHJvbCAmIEJNVV9FT0YpCisJCQlERVZfS0ZSRUVfU0tCX0FOWShwVHhkLT5wTUJ1Zik7CS8qIGZyZWUgbWVzc2FnZSAqLworCisJCXBUeFBvcnQtPlR4ZFJpbmdGcmVlKys7CisJCXBUeGQtPlRCQ29udHJvbCAmPSB+Qk1VX1NXOworCQlwVHhkID0gcFR4ZC0+cE5leHRUeGQ7IC8qIHBvaW50IGJlaGluZCBmcmFnbWVudCB3aXRoIEVPRiAqLworCX0gLyogd2hpbGUoZm9yZXZlcikgKi8KK30gLyogRnJlZVR4RGVzY3JpcHRvcnMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCUZpbGxSeFJpbmcgLSBmaWxsIHRoZSByZWNlaXZlIHJpbmcgd2l0aCB2YWxpZCBkZXNjcmlwdG9ycworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBmaWxscyB0aGUgcmVjZWl2ZSByaW5nIGRlc2NyaXB0b3JzIHdpdGggZGF0YQorICoJc2VnbWVudHMgYW5kIG1ha2VzIHRoZW0gdmFsaWQgZm9yIHRoZSBCTVUuCisgKglUaGUgYWN0aXZlIHJpbmcgaXMgZmlsbGVkIGNvbXBsZXRlbHksIGlmIHBvc3NpYmxlLgorICoJVGhlIG5vbi1hY3RpdmUgcmluZyBpcyBmaWxsZWQgb25seSBwYXJ0aWFsIHRvIHNhdmUgbWVtb3J5LgorICoKKyAqIERlc2NyaXB0aW9uIG9mIHJ4IHJpbmcgc3RydWN0dXJlOgorICoJaGVhZCAtIHBvaW50cyB0byB0aGUgZGVzY3JpcHRvciB3aGljaCB3aWxsIGJlIHVzZWQgbmV4dCBieSB0aGUgQk1VCisgKgl0YWlsIC0gcG9pbnRzIHRvIHRoZSBuZXh0IGRlc2NyaXB0b3IgdG8gZ2l2ZSB0byB0aGUgQk1VCisgKgkKKyAqIFJldHVybnM6CU4vQQorICovCitzdGF0aWMgdm9pZCBGaWxsUnhSaW5nKAorU0tfQUMJCSpwQUMsCQkvKiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIGNvbnRleHQgKi8KK1JYX1BPUlQJCSpwUnhQb3J0KQkvKiBwdHIgdG8gcG9ydCBzdHJ1Y3QgZm9yIHdoaWNoIHRoZSByaW5nCisJCQkJICAgc2hvdWxkIGJlIGZpbGxlZCAqLworewordW5zaWduZWQgbG9uZwlGbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwUnhQb3J0LT5SeERlc1JpbmdMb2NrLCBGbGFncyk7CisJd2hpbGUgKHBSeFBvcnQtPlJ4ZFJpbmdGcmVlID4gcFJ4UG9ydC0+UnhGaWxsTGltaXQpIHsKKwkJaWYoIUZpbGxSeERlc2NyaXB0b3IocEFDLCBwUnhQb3J0KSkKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwUnhQb3J0LT5SeERlc1JpbmdMb2NrLCBGbGFncyk7Cit9IC8qIEZpbGxSeFJpbmcgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJRmlsbFJ4RGVzY3JpcHRvciAtIGZpbGwgb25lIGJ1ZmZlciBpbnRvIHRoZSByZWNlaXZlIHJpbmcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoZSBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBuZXcgcmVjZWl2ZSBidWZmZXIgYW5kCisgKglwdXRzIGl0IGludG8gdGhlIG5leHQgZGVzY3JpcHRvci4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfVFJVRSAtIGEgYnVmZmVyIHdhcyBhZGRlZCB0byB0aGUgcmluZworICoJU0tfRkFMU0UgLSBhIGJ1ZmZlciBjb3VsZCBub3QgYmUgYWRkZWQKKyAqLworc3RhdGljIFNLX0JPT0wgRmlsbFJ4RGVzY3JpcHRvcigKK1NLX0FDCQkqcEFDLAkJLyogcG9pbnRlciB0byB0aGUgYWRhcHRlciBjb250ZXh0IHN0cnVjdCAqLworUlhfUE9SVAkJKnBSeFBvcnQpCS8qIHB0ciB0byBwb3J0IHN0cnVjdCBvZiByaW5nIHRvIGZpbGwgKi8KK3sKK3N0cnVjdCBza19idWZmCSpwTXNnQmxvY2s7CS8qIHBvaW50ZXIgdG8gYSBuZXcgbWVzc2FnZSBibG9jayAqLworUlhECQkqcFJ4ZDsJCS8qIHRoZSByeGQgdG8gZmlsbCAqLworU0tfVTE2CQlMZW5ndGg7CQkvKiBkYXRhIGZyYWdtZW50IGxlbmd0aCAqLworU0tfVTY0CQlQaHlzQWRkcjsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBhIHJ4IGJ1ZmZlciAqLworCisJcE1zZ0Jsb2NrID0gYWxsb2Nfc2tiKHBBQy0+UnhCdWZTaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAocE1zZ0Jsb2NrID09IE5VTEwpIHsKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJCSgiJXM6IEFsbG9jYXRpb24gb2YgcnggYnVmZmVyIGZhaWxlZCAhXG4iLAorCQkJcEFDLT5kZXZbcFJ4UG9ydC0+UG9ydEluZGV4XS0+bmFtZSkpOworCQlTS19QTk1JX0NOVF9OT19SWF9CVUYocEFDLCBwUnhQb3J0LT5Qb3J0SW5kZXgpOworCQlyZXR1cm4oU0tfRkFMU0UpOworCX0KKwlza2JfcmVzZXJ2ZShwTXNnQmxvY2ssIDIpOyAvKiB0byBhbGlnbiBJUCBmcmFtZXMgKi8KKwkvKiBza2IgYWxsb2NhdGVkIG9rLCBzbyBhZGQgYnVmZmVyICovCisJcFJ4ZCA9IHBSeFBvcnQtPnBSeGRSaW5nVGFpbDsKKwlwUnhQb3J0LT5wUnhkUmluZ1RhaWwgPSBwUnhkLT5wTmV4dFJ4ZDsKKwlwUnhQb3J0LT5SeGRSaW5nRnJlZS0tOworCUxlbmd0aCA9IHBBQy0+UnhCdWZTaXplOworCVBoeXNBZGRyID0gKFNLX1U2NCkgcGNpX21hcF9wYWdlKHBBQy0+UGNpRGV2LAorCQl2aXJ0X3RvX3BhZ2UocE1zZ0Jsb2NrLT5kYXRhKSwKKwkJKCh1bnNpZ25lZCBsb25nKSBwTXNnQmxvY2stPmRhdGEgJgorCQl+UEFHRV9NQVNLKSwKKwkJcEFDLT5SeEJ1ZlNpemUgLSAyLAorCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJcFJ4ZC0+VkRhdGFMb3cgID0gKFNLX1UzMikgKFBoeXNBZGRyICYgMHhmZmZmZmZmZik7CisJcFJ4ZC0+VkRhdGFIaWdoID0gKFNLX1UzMikgKFBoeXNBZGRyID4+IDMyKTsKKwlwUnhkLT5wTUJ1ZiAgICAgPSBwTXNnQmxvY2s7CisJcFJ4ZC0+UkJDb250cm9sID0gQk1VX09XTiAgICAgICB8IAorCQkJICBCTVVfU1RGICAgICAgIHwgCisJCQkgIEJNVV9JUlFfRU9GICAgfCAKKwkJCSAgQk1VX1RDUF9DSEVDSyB8IAorCQkJICBMZW5ndGg7CisJcmV0dXJuIChTS19UUlVFKTsKKworfSAvKiBGaWxsUnhEZXNjcmlwdG9yICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCVJlUXVldWVSeEJ1ZmZlciAtIGZpbGwgb25lIGJ1ZmZlciBiYWNrIGludG8gdGhlIHJlY2VpdmUgcmluZworICoKKyAqIERlc2NyaXB0aW9uOgorICoJRmlsbCBhIGdpdmVuIGJ1ZmZlciBiYWNrIGludG8gdGhlIHJ4IHJpbmcuIFRoZSBidWZmZXIKKyAqCWhhcyBiZWVuIHByZXZpb3VzbHkgYWxsb2NhdGVkIGFuZCBhbGlnbmVkLCBhbmQgaXRzIHBoeXMuCisgKglhZGRyZXNzIGNhbGN1bGF0ZWQsIHNvIHRoaXMgaXMgbm8gbW9yZSBuZWNlc3NhcnkuCisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3N0YXRpYyB2b2lkIFJlUXVldWVSeEJ1ZmZlcigKK1NLX0FDCQkqcEFDLAkJLyogcG9pbnRlciB0byB0aGUgYWRhcHRlciBjb250ZXh0IHN0cnVjdCAqLworUlhfUE9SVAkJKnBSeFBvcnQsCS8qIHB0ciB0byBwb3J0IHN0cnVjdCBvZiByaW5nIHRvIGZpbGwgKi8KK3N0cnVjdCBza19idWZmCSpwTXNnLAkJLyogcG9pbnRlciB0byB0aGUgYnVmZmVyICovCitTS19VMzIJCVBoeXNIaWdoLAkvKiBwaHlzIGFkZHJlc3MgaGlnaCBkd29yZCAqLworU0tfVTMyCQlQaHlzTG93KQkvKiBwaHlzIGFkZHJlc3MgbG93IGR3b3JkICovCit7CitSWEQJCSpwUnhkOwkJLyogdGhlIHJ4ZCB0byBmaWxsICovCitTS19VMTYJCUxlbmd0aDsJCS8qIGRhdGEgZnJhZ21lbnQgbGVuZ3RoICovCisKKwlwUnhkID0gcFJ4UG9ydC0+cFJ4ZFJpbmdUYWlsOworCXBSeFBvcnQtPnBSeGRSaW5nVGFpbCA9IHBSeGQtPnBOZXh0UnhkOworCXBSeFBvcnQtPlJ4ZFJpbmdGcmVlLS07CisJTGVuZ3RoID0gcEFDLT5SeEJ1ZlNpemU7CisKKwlwUnhkLT5WRGF0YUxvdyAgPSBQaHlzTG93OworCXBSeGQtPlZEYXRhSGlnaCA9IFBoeXNIaWdoOworCXBSeGQtPnBNQnVmICAgICA9IHBNc2c7CisJcFJ4ZC0+UkJDb250cm9sID0gQk1VX09XTiAgICAgICB8IAorCQkJICBCTVVfU1RGICAgICAgIHwKKwkJCSAgQk1VX0lSUV9FT0YgICB8IAorCQkJICBCTVVfVENQX0NIRUNLIHwgCisJCQkgIExlbmd0aDsKKwlyZXR1cm47Cit9IC8qIFJlUXVldWVSeEJ1ZmZlciAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJUmVjZWl2ZUlycSAtIGhhbmRsZSBhIHJlY2VpdmUgSVJRCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgcmVjZWl2ZSBJUlEgaXMgc2V0LgorICoJSXQgd2Fsa3MgdGhlIHJlY2VpdmUgZGVzY3JpcHRvciByaW5nIGFuZCBzZW5kcyB1cCBhbGwKKyAqCWZyYW1lcyB0aGF0IGFyZSBjb21wbGV0ZS4KKyAqCisgKiBSZXR1cm5zOglOL0EKKyAqLworc3RhdGljIHZvaWQgUmVjZWl2ZUlycSgKKwlTS19BQwkJKnBBQywJCQkvKiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworCVJYX1BPUlQJCSpwUnhQb3J0LAkJLyogcG9pbnRlciB0byByZWNlaXZlIHBvcnQgc3RydWN0ICovCisJU0tfQk9PTAkJU2xvd1BhdGhMb2NrKQkvKiBpbmRpY2F0ZXMgaWYgU2xvd1BhdGhMb2NrIGlzIG5lZWRlZCAqLworeworUlhECQkJCSpwUnhkOwkJCS8qIHBvaW50ZXIgdG8gcmVjZWl2ZSBkZXNjcmlwdG9ycyAqLworU0tfVTMyCQkJQ29udHJvbDsJCS8qIGNvbnRyb2wgZmllbGQgb2YgZGVzY3JpcHRvciAqLworc3RydWN0IHNrX2J1ZmYJKnBNc2c7CQkJLyogcG9pbnRlciB0byBtZXNzYWdlIGhvbGRpbmcgZnJhbWUgKi8KK3N0cnVjdCBza19idWZmCSpwTmV3TXNnOwkJLyogcG9pbnRlciB0byBhIG5ldyBtZXNzYWdlIGZvciBjb3B5aW5nIGZyYW1lICovCitpbnQJCQkJRnJhbWVMZW5ndGg7CS8qIHRvdGFsIGxlbmd0aCBvZiByZWNlaXZlZCBmcmFtZSAqLworaW50CQkJCUlwRnJhbWVMZW5ndGg7CitTS19NQlVGCQkJKnBSbG10TWJ1ZjsJCS8qIHB0ciB0byBhIGJ1ZmZlciBmb3IgZ2l2aW5nIGEgZnJhbWUgdG8gcmxtdCAqLworU0tfRVZQQVJBCQlFdlBhcmE7CQkJLyogYW4gZXZlbnQgcGFyYW1ldGVyIHVuaW9uICovCQordW5zaWduZWQgbG9uZwlGbGFnczsJCQkvKiBmb3Igc3BpbiBsb2NrICovCitpbnQJCQkJUG9ydEluZGV4ID0gcFJ4UG9ydC0+UG9ydEluZGV4OwordW5zaWduZWQgaW50CU9mZnNldDsKK3Vuc2lnbmVkIGludAlOdW1CeXRlczsKK3Vuc2lnbmVkIGludAlGb3JSbG10OworU0tfQk9PTAkJCUlzQmM7CitTS19CT09MCQkJSXNNYzsKK1NLX0JPT0wgIElzQmFkRnJhbWU7IAkJCS8qIEJhZCBmcmFtZSAqLworCitTS19VMzIJCQlGcmFtZVN0YXQ7Cit1bnNpZ25lZCBzaG9ydAlDc3VtMTsKK3Vuc2lnbmVkIHNob3J0CUNzdW0yOwordW5zaWduZWQgc2hvcnQJVHlwZTsKK2ludAkJCQlSZXN1bHQ7CitTS19VNjQJCQlQaHlzQWRkcjsKKworcnhfc3RhcnQ6CQorCS8qIGRvIGZvcmV2ZXI7IGV4aXQgaWYgQk1VX09XTiBmb3VuZCAqLworCWZvciAoIHBSeGQgPSBwUnhQb3J0LT5wUnhkUmluZ0hlYWQgOworCQkgIHBSeFBvcnQtPlJ4ZFJpbmdGcmVlIDwgcEFDLT5SeERlc2NyUGVyUmluZyA7CisJCSAgcFJ4ZCA9IHBSeGQtPnBOZXh0UnhkLAorCQkgIHBSeFBvcnQtPnBSeGRSaW5nSGVhZCA9IHBSeGQsCisJCSAgcFJ4UG9ydC0+UnhkUmluZ0ZyZWUgKyspIHsKKworCQkvKgorCQkgKiBGb3IgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiB0aGlzIGxvb3AKKwkJICogR28gdGhyb3VnaCBldmVyeSBkZXNjcmlwdG9yIGJlZ2lubmluZyBhdCB0aGUgaGVhZAorCQkgKiBQbGVhc2Ugbm90ZTogdGhlIHJpbmcgbWlnaHQgYmUgY29tcGxldGVseSByZWNlaXZlZCBzbyB0aGUgT1dOIGJpdAorCQkgKiBzZXQgaXMgbm90IGEgZ29vZCBjcmlydGVyaWEgdG8gbGVhdmUgdGhhdCBsb29wLgorCQkgKiBUaGVyZWZvcmUgdGhlIFJpbmdGcmVlIGNvdW50ZXIgaXMgdXNlZC4KKwkJICogT24gZW50cnkgb2YgdGhpcyBsb29wIHBSeGQgaXMgYSBwb2ludGVyIHRvIHRoZSBSeGQgdGhhdCBuZWVkcworCQkgKiB0byBiZSBjaGVja2VkIG5leHQuCisJCSAqLworCisJCUNvbnRyb2wgPSBwUnhkLT5SQkNvbnRyb2w7CisJCisJCS8qIGNoZWNrIGlmIHRoaXMgZGVzY3JpcHRvciBpcyByZWFkeSAqLworCQlpZiAoKENvbnRyb2wgJiBCTVVfT1dOKSAhPSAwKSB7CisJCQkvKiB0aGlzIGRlc2NyaXB0b3IgaXMgbm90IHlldCByZWFkeSAqLworCQkJLyogVGhpcyBpcyB0aGUgdXN1YWwgZW5kIG9mIHRoZSBsb29wICovCisJCQkvKiBXZSBkb24ndCBuZWVkIHRvIHN0YXJ0IHRoZSByaW5nIGFnYWluICovCisJCQlGaWxsUnhSaW5nKHBBQywgcFJ4UG9ydCk7CisJCQlyZXR1cm47CisJCX0KKyAgICAgICAgICAgICAgICBwQUMtPkR5bklycU1vZEluZm8uTmJyUHJvY2Vzc2VkRGVzY3IrKzsKKworCQkvKiBnZXQgbGVuZ3RoIG9mIGZyYW1lIGFuZCBjaGVjayBpdCAqLworCQlGcmFtZUxlbmd0aCA9IENvbnRyb2wgJiBCTVVfQkJDOworCQlpZiAoRnJhbWVMZW5ndGggPiBwQUMtPlJ4QnVmU2l6ZSkgeworCQkJZ290byByeF9mYWlsZWQ7CisJCX0KKworCQkvKiBjaGVjayBmb3IgU1RGIGFuZCBFT0YgKi8KKwkJaWYgKChDb250cm9sICYgKEJNVV9TVEYgfCBCTVVfRU9GKSkgIT0gKEJNVV9TVEYgfCBCTVVfRU9GKSkgeworCQkJZ290byByeF9mYWlsZWQ7CisJCX0KKworCQkvKiBoZXJlIHdlIGhhdmUgYSBjb21wbGV0ZSBmcmFtZSBpbiB0aGUgcmluZyAqLworCQlwTXNnID0gcFJ4ZC0+cE1CdWY7CisKKwkJRnJhbWVTdGF0ID0gcFJ4ZC0+RnJhbWVTdGF0OworCisJCS8qIGNoZWNrIGZvciBmcmFtZSBsZW5ndGggbWlzbWF0Y2ggKi8KKyNkZWZpbmUgWE1SX0ZTX0xFTl9TSElGVCAgICAgICAgMTgKKyNkZWZpbmUgR01SX0ZTX0xFTl9TSElGVCAgICAgICAgMTYKKwkJaWYgKHBBQy0+R0luaS5HSUNoaXBJZCA9PSBDSElQX0lEX0dFTkVTSVMpIHsKKwkJCWlmIChGcmFtZUxlbmd0aCAhPSAoU0tfVTMyKSAoRnJhbWVTdGF0ID4+IFhNUl9GU19MRU5fU0hJRlQpKSB7CisJCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCQlTS19EQkdDQVRfRFJWX1JYX1BST0dSRVNTLAorCQkJCQkoInNrZ2U6IEZyYW1lIGxlbmd0aCBtaXNtYXRjaCAoJXUvJXUpLlxuIiwKKwkJCQkJRnJhbWVMZW5ndGgsCisJCQkJCShTS19VMzIpIChGcmFtZVN0YXQgPj4gWE1SX0ZTX0xFTl9TSElGVCkpKTsKKwkJCQlnb3RvIHJ4X2ZhaWxlZDsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWlmIChGcmFtZUxlbmd0aCAhPSAoU0tfVTMyKSAoRnJhbWVTdGF0ID4+IEdNUl9GU19MRU5fU0hJRlQpKSB7CisJCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAorCQkJCQlTS19EQkdDQVRfRFJWX1JYX1BST0dSRVNTLAorCQkJCQkoInNrZ2U6IEZyYW1lIGxlbmd0aCBtaXNtYXRjaCAoJXUvJXUpLlxuIiwKKwkJCQkJRnJhbWVMZW5ndGgsCisJCQkJCShTS19VMzIpIChGcmFtZVN0YXQgPj4gWE1SX0ZTX0xFTl9TSElGVCkpKTsKKwkJCQlnb3RvIHJ4X2ZhaWxlZDsKKwkJCX0KKwkJfQorCisJCS8qIFNldCBSeCBTdGF0dXMgKi8KKwkJaWYgKHBBQy0+R0luaS5HSUNoaXBJZCA9PSBDSElQX0lEX0dFTkVTSVMpIHsKKwkJCUlzQmMgPSAoRnJhbWVTdGF0ICYgWE1SX0ZTX0JDKSAhPSAwOworCQkJSXNNYyA9IChGcmFtZVN0YXQgJiBYTVJfRlNfTUMpICE9IDA7CisJCQlJc0JhZEZyYW1lID0gKEZyYW1lU3RhdCAmCisJCQkJKFhNUl9GU19BTllfRVJSIHwgWE1SX0ZTXzJMX1ZMQU4pKSAhPSAwOworCQl9IGVsc2UgeworCQkJSXNCYyA9IChGcmFtZVN0YXQgJiBHTVJfRlNfQkMpICE9IDA7CisJCQlJc01jID0gKEZyYW1lU3RhdCAmIEdNUl9GU19NQykgIT0gMDsKKwkJCUlzQmFkRnJhbWUgPSAoKChGcmFtZVN0YXQgJiBHTVJfRlNfQU5ZX0VSUikgIT0gMCkgfHwKKwkJCQkJCQkoKEZyYW1lU3RhdCAmIEdNUl9GU19SWF9PSykgPT0gMCkpOworCQl9CisKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCAwLAorCQkJKCJSZWNlaXZlZCBmcmFtZSBvZiBsZW5ndGggJWQgb24gcG9ydCAlZFxuIiwKKwkJCUZyYW1lTGVuZ3RoLCBQb3J0SW5kZXgpKTsKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCAwLAorCQkJKCJOdW1iZXIgb2YgZnJlZSByeCBkZXNjcmlwdG9yczogJWRcbiIsCisJCQlwUnhQb3J0LT5SeGRSaW5nRnJlZSkpOworLyogRHVtcE1zZyhwTXNnLCAiUngiKTsJKi8KKworCQlpZiAoKENvbnRyb2wgJiBCTVVfU1RBVF9WQUwpICE9IEJNVV9TVEFUX1ZBTCB8fCAoSXNCYWRGcmFtZSkpIHsKKyNpZiAwCisJCQkoRnJhbWVTdGF0ICYgKFhNUl9GU19BTllfRVJSIHwgWE1SX0ZTXzJMX1ZMQU4pKSAhPSAwKSB7CisjZW5kaWYKKwkJCS8qIHRoZXJlIGlzIGEgcmVjZWl2ZSBlcnJvciBpbiB0aGlzIGZyYW1lICovCisJCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsCisJCQkJU0tfREJHQ0FUX0RSVl9SWF9QUk9HUkVTUywKKwkJCQkoInNrZ2U6IEVycm9yIGluIHJlY2VpdmVkIGZyYW1lLCBkcm9wcGVkIVxuIgorCQkJCSJDb250cm9sOiAleFxuUnhTdGF0OiAleFxuIiwKKwkJCQlDb250cm9sLCBGcmFtZVN0YXQpKTsKKworCQkJUmVRdWV1ZVJ4QnVmZmVyKHBBQywgcFJ4UG9ydCwgcE1zZywKKwkJCQlwUnhkLT5WRGF0YUhpZ2gsIHBSeGQtPlZEYXRhTG93KTsKKworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBpZiBzaG9ydCBmcmFtZSB0aGVuIGNvcHkgZGF0YSB0byByZWR1Y2UgbWVtb3J5IHdhc3RlCisJCSAqLworCQlpZiAoKEZyYW1lTGVuZ3RoIDwgU0tfQ09QWV9USFJFU0hPTEQpICYmCisJCQkoKHBOZXdNc2cgPSBhbGxvY19za2IoRnJhbWVMZW5ndGgrMiwgR0ZQX0FUT01JQykpICE9IE5VTEwpKSB7CisJCQkvKgorCQkJICogU2hvcnQgZnJhbWUgZGV0ZWN0ZWQgYW5kIGFsbG9jYXRpb24gc3VjY2Vzc2Z1bGwKKwkJCSAqLworCQkJLyogdXNlIG5ldyBza2IgYW5kIGNvcHkgZGF0YSAqLworCQkJc2tiX3Jlc2VydmUocE5ld01zZywgMik7CisJCQlza2JfcHV0KHBOZXdNc2csIEZyYW1lTGVuZ3RoKTsKKwkJCVBoeXNBZGRyID0gKChTS19VNjQpIHBSeGQtPlZEYXRhSGlnaCkgPDwgKFNLX1U2NCkzMjsKKwkJCVBoeXNBZGRyIHw9IChTS19VNjQpIHBSeGQtPlZEYXRhTG93OworCisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocEFDLT5QY2lEZXYsCisJCQkJCQkgICAgKGRtYV9hZGRyX3QpIFBoeXNBZGRyLAorCQkJCQkJICAgIEZyYW1lTGVuZ3RoLAorCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlldGhfY29weV9hbmRfc3VtKHBOZXdNc2csIHBNc2ctPmRhdGEsCisJCQkJRnJhbWVMZW5ndGgsIDApOworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHBBQy0+UGNpRGV2LAorCQkJCQkJICAgICAgIChkbWFfYWRkcl90KSBQaHlzQWRkciwKKwkJCQkJCSAgICAgICBGcmFtZUxlbmd0aCwKKwkJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJUmVRdWV1ZVJ4QnVmZmVyKHBBQywgcFJ4UG9ydCwgcE1zZywKKwkJCQlwUnhkLT5WRGF0YUhpZ2gsIHBSeGQtPlZEYXRhTG93KTsKKworCQkJcE1zZyA9IHBOZXdNc2c7CisKKwkJfQorCQllbHNlIHsKKwkJCS8qCisJCQkgKiBpZiBsYXJnZSBmcmFtZSwgb3IgU0tCIGFsbG9jYXRpb24gZmFpbGVkLCBwYXNzCisJCQkgKiB0aGUgU0tCIGRpcmVjdGx5IHRvIHRoZSBuZXR3b3JraW5nCisJCQkgKi8KKworCQkJUGh5c0FkZHIgPSAoKFNLX1U2NCkgcFJ4ZC0+VkRhdGFIaWdoKSA8PCAoU0tfVTY0KTMyOworCQkJUGh5c0FkZHIgfD0gKFNLX1U2NCkgcFJ4ZC0+VkRhdGFMb3c7CisKKwkJCS8qIHJlbGVhc2UgdGhlIERNQSBtYXBwaW5nICovCisJCQlwY2lfdW5tYXBfc2luZ2xlKHBBQy0+UGNpRGV2LAorCQkJCQkgUGh5c0FkZHIsCisJCQkJCSBwQUMtPlJ4QnVmU2l6ZSAtIDIsCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQkvKiBzZXQgbGVuZ3RoIGluIG1lc3NhZ2UgKi8KKwkJCXNrYl9wdXQocE1zZywgRnJhbWVMZW5ndGgpOworCQkJLyogaGFyZHdhcmUgY2hlY2tzdW0gKi8KKwkJCVR5cGUgPSBudG9ocygqKChzaG9ydCopJnBNc2ctPmRhdGFbMTJdKSk7CisKKyNpZmRlZiBVU0VfU0tfUlhfQ0hFQ0tTVU0KKwkJCWlmIChUeXBlID09IDB4ODAwKSB7CisJCQkJQ3N1bTE9bGUxNl90b19jcHUocFJ4ZC0+VGNwU3VtcyAmIDB4ZmZmZik7CisJCQkJQ3N1bTI9bGUxNl90b19jcHUoKHBSeGQtPlRjcFN1bXMgPj4gMTYpICYgMHhmZmZmKTsKKwkJCQlJcEZyYW1lTGVuZ3RoID0gKGludCkgbnRvaHMoKHVuc2lnbmVkIHNob3J0KQorCQkJCQkJCQkoKHVuc2lnbmVkIHNob3J0ICopIHBNc2ctPmRhdGEpWzhdKTsKKworCQkJCS8qCisJCQkJICogVGVzdDogSWYgZnJhbWUgaXMgcGFkZGVkLCBhIGNoZWNrIGlzIG5vdCBwb3NzaWJsZSEKKwkJCQkgKiBGcmFtZSBub3QgcGFkZGVkPyBMZW5ndGggZGlmZmVyZW5jZSBtdXN0IGJlIDE0ICgweGUpIQorCQkJCSAqLworCQkJCWlmICgoRnJhbWVMZW5ndGggLSBJcEZyYW1lTGVuZ3RoKSAhPSAweGUpIHsKKwkJCQkvKiBGcmFtZSBwYWRkZWQgPT4gVENQIG9mZmxvYWQgbm90IHBvc3NpYmxlISAqLworCQkJCQlwTXNnLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQkJCX0gZWxzZSB7CisJCQkJLyogRnJhbWUgbm90IHBhZGRlZCA9PiBUQ1Agb2ZmbG9hZCEgKi8KKwkJCQkJaWYgKCgoKENzdW0xICYgMHhmZmZlKSAmJiAoQ3N1bTIgJiAweGZmZmUpKSAmJgorCQkJCQkJKHBBQy0+R0luaS5HSUNoaXBJZCA9PSBDSElQX0lEX0dFTkVTSVMpKSB8fAorCQkJCQkJKHBBQy0+Q2hpcHNldFR5cGUpKSB7CisJCQkJCQlSZXN1bHQgPSBTa0NzR2V0UmVjZWl2ZUluZm8ocEFDLAorCQkJCQkJCSZwTXNnLT5kYXRhWzE0XSwKKwkJCQkJCQlDc3VtMSwgQ3N1bTIsIHBSeFBvcnQtPlBvcnRJbmRleCk7CisJCQkJCQlpZiAoUmVzdWx0ID09CisJCQkJCQkJU0tDU19TVEFUVVNfSVBfRlJBR01FTlQgfHwKKwkJCQkJCQlSZXN1bHQgPT0KKwkJCQkJCQlTS0NTX1NUQVRVU19JUF9DU1VNX09LIHx8CisJCQkJCQkJUmVzdWx0ID09CisJCQkJCQkJU0tDU19TVEFUVVNfVENQX0NTVU1fT0sgfHwKKwkJCQkJCQlSZXN1bHQgPT0KKwkJCQkJCQlTS0NTX1NUQVRVU19VRFBfQ1NVTV9PSykgeworCQkJCQkJCQlwTXNnLT5pcF9zdW1tZWQgPQorCQkJCQkJCQlDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKFJlc3VsdCA9PQorCQkJCQkJCVNLQ1NfU1RBVFVTX1RDUF9DU1VNX0VSUk9SIHx8CisJCQkJCQkJUmVzdWx0ID09CisJCQkJCQkJU0tDU19TVEFUVVNfVURQX0NTVU1fRVJST1IgfHwKKwkJCQkJCQlSZXN1bHQgPT0KKwkJCQkJCQlTS0NTX1NUQVRVU19JUF9DU1VNX0VSUk9SX1VEUCB8fAorCQkJCQkJCVJlc3VsdCA9PQorCQkJCQkJCVNLQ1NfU1RBVFVTX0lQX0NTVU1fRVJST1JfVENQIHx8CisJCQkJCQkJUmVzdWx0ID09CisJCQkJCQkJU0tDU19TVEFUVVNfSVBfQ1NVTV9FUlJPUiApIHsKKwkJCQkJCQkvKiBIVyBDaGVja3N1bSBlcnJvciAqLworCQkJCQkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQkJCQlTS19EQkdDQVRfRFJWX1JYX1BST0dSRVNTLAorCQkJCQkJCSgic2tnZTogQ1JDIGVycm9yLiBGcmFtZSBkcm9wcGVkIVxuIikpOworCQkJCQkJCWdvdG8gcnhfZmFpbGVkOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJcE1zZy0+aXBfc3VtbWVkID0KKwkJCQkJCQkJQ0hFQ0tTVU1fTk9ORTsKKwkJCQkJCX0KKwkJCQkJfS8qIGNoZWNrc3VtQ29udHJvbCBjYWxjdWxhdGlvbiB2YWxpZCAqLworCQkJCX0gLyogRnJhbWUgbGVuZ3RoIGNoZWNrICovCisJCQl9IC8qIElQIGZyYW1lICovCisjZWxzZQorCQkJcE1zZy0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsJCisjZW5kaWYKKwkJfSAvKiBmcmFtZSA+IFNLX0NPUFlfVFJFU0hPTEQgKi8KKwkJCisJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwJMSwoIlYiKSk7CisJCUZvclJsbXQgPSBTS19STE1UX1JYX1BST1RPQ09MOworI2lmIDAKKwkJSXNCYyA9IChGcmFtZVN0YXQgJiBYTVJfRlNfQkMpPT1YTVJfRlNfQkM7CisjZW5kaWYKKwkJU0tfUkxNVF9QUkVfTE9PS0FIRUFEKHBBQywgUG9ydEluZGV4LCBGcmFtZUxlbmd0aCwKKwkJCUlzQmMsICZPZmZzZXQsICZOdW1CeXRlcyk7CisJCWlmIChOdW1CeXRlcyAhPSAwKSB7CisjaWYgMAorCQkJSXNNYyA9IChGcmFtZVN0YXQgJiBYTVJfRlNfTUMpPT1YTVJfRlNfTUM7CisjZW5kaWYKKwkJCVNLX1JMTVRfTE9PS0FIRUFEKHBBQywgUG9ydEluZGV4LAorCQkJCSZwTXNnLT5kYXRhW09mZnNldF0sCisJCQkJSXNCYywgSXNNYywgJkZvclJsbXQpOworCQl9CisJCWlmIChGb3JSbG10ID09IFNLX1JMTVRfUlhfUFJPVE9DT0wpIHsKKwkJCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLAkxLCgiVyIpKTsKKwkJCS8qIHNlbmQgdXAgb25seSBmcmFtZXMgZnJvbSBhY3RpdmUgcG9ydCAqLworCQkJaWYgKChQb3J0SW5kZXggPT0gcEFDLT5BY3RpdmVQb3J0KSB8fAorCQkJCShwQUMtPlJsbXROZXRzID09IDIpKSB7CisJCQkJLyogZnJhbWUgZm9yIHVwcGVyIGxheWVyICovCisJCQkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCAxLCgiVSIpKTsKKyNpZmRlZiB4REVCVUcKKwkJCQlEdW1wTXNnKHBNc2csICJSeCIpOworI2VuZGlmCisJCQkJU0tfUE5NSV9DTlRfUlhfT0NURVRTX0RFTElWRVJFRChwQUMsCisJCQkJCUZyYW1lTGVuZ3RoLCBwUnhQb3J0LT5Qb3J0SW5kZXgpOworCisJCQkJcE1zZy0+ZGV2ID0gcEFDLT5kZXZbcFJ4UG9ydC0+UG9ydEluZGV4XTsKKwkJCQlwTXNnLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBNc2csCisJCQkJCXBBQy0+ZGV2W3BSeFBvcnQtPlBvcnRJbmRleF0pOworCQkJCW5ldGlmX3J4KHBNc2cpOworCQkJCXBBQy0+ZGV2W3BSeFBvcnQtPlBvcnRJbmRleF0tPmxhc3RfcnggPSBqaWZmaWVzOworCQkJfQorCQkJZWxzZSB7CisJCQkJLyogZHJvcCBmcmFtZSAqLworCQkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQkJU0tfREJHQ0FUX0RSVl9SWF9QUk9HUkVTUywKKwkJCQkJKCJEIikpOworCQkJCURFVl9LRlJFRV9TS0IocE1zZyk7CisJCQl9CisJCQkKKwkJfSAvKiBpZiBub3QgZm9yIHJsbXQgKi8KKwkJZWxzZSB7CisJCQkvKiBwYWNrZXQgZm9yIHJsbXQgKi8KKwkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQlTS19EQkdDQVRfRFJWX1JYX1BST0dSRVNTLCAoIlIiKSk7CisJCQlwUmxtdE1idWYgPSBTa0RydkFsbG9jUmxtdE1idWYocEFDLAorCQkJCXBBQy0+SW9CYXNlLCBGcmFtZUxlbmd0aCk7CisJCQlpZiAocFJsbXRNYnVmICE9IE5VTEwpIHsKKwkJCQlwUmxtdE1idWYtPnBOZXh0ID0gTlVMTDsKKwkJCQlwUmxtdE1idWYtPkxlbmd0aCA9IEZyYW1lTGVuZ3RoOworCQkJCXBSbG10TWJ1Zi0+UG9ydElkeCA9IFBvcnRJbmRleDsKKwkJCQlFdlBhcmEucFBhcmFQdHIgPSBwUmxtdE1idWY7CisJCQkJbWVtY3B5KChjaGFyKikocFJsbXRNYnVmLT5wRGF0YSksCisJCQkJCSAgIChjaGFyKikocE1zZy0+ZGF0YSksCisJCQkJCSAgIEZyYW1lTGVuZ3RoKTsKKworCQkJCS8qIFNsb3dQYXRoTG9jayBuZWVkZWQ/ICovCisJCQkJaWYgKFNsb3dQYXRoTG9jayA9PSBTS19UUlVFKSB7CisJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworCQkJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsCisJCQkJCQlTS19STE1UX1BBQ0tFVF9SRUNFSVZFRCwKKwkJCQkJCUV2UGFyYSk7CisJCQkJCXBBQy0+Q2hlY2tRdWV1ZSA9IFNLX1RSVUU7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULAorCQkJCQkJU0tfUkxNVF9QQUNLRVRfUkVDRUlWRUQsCisJCQkJCQlFdlBhcmEpOworCQkJCQlwQUMtPkNoZWNrUXVldWUgPSBTS19UUlVFOworCQkJCX0KKworCQkJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwKKwkJCQkJU0tfREJHQ0FUX0RSVl9SWF9QUk9HUkVTUywKKwkJCQkJKCJRIikpOworCQkJfQorCQkJaWYgKChwQUMtPmRldltwUnhQb3J0LT5Qb3J0SW5kZXhdLT5mbGFncyAmCisJCQkJKElGRl9QUk9NSVNDIHwgSUZGX0FMTE1VTFRJKSkgIT0gMCB8fAorCQkJCShGb3JSbG10ICYgU0tfUkxNVF9SWF9QUk9UT0NPTCkgPT0KKwkJCQlTS19STE1UX1JYX1BST1RPQ09MKSB7CisJCQkJcE1zZy0+ZGV2ID0gcEFDLT5kZXZbcFJ4UG9ydC0+UG9ydEluZGV4XTsKKwkJCQlwTXNnLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHBNc2csCisJCQkJCXBBQy0+ZGV2W3BSeFBvcnQtPlBvcnRJbmRleF0pOworCQkJCW5ldGlmX3J4KHBNc2cpOworCQkJCXBBQy0+ZGV2W3BSeFBvcnQtPlBvcnRJbmRleF0tPmxhc3RfcnggPSBqaWZmaWVzOworCQkJfQorCQkJZWxzZSB7CisJCQkJREVWX0tGUkVFX1NLQihwTXNnKTsKKwkJCX0KKworCQl9IC8qIGlmIHBhY2tldCBmb3IgcmxtdCAqLworCX0gLyogZm9yIC4uLiBzY2FubmluZyB0aGUgUlhEIHJpbmcgKi8KKworCS8qIFJYRCByaW5nIGlzIGVtcHR5IC0+IGZpbGwgYW5kIHJlc3RhcnQgKi8KKwlGaWxsUnhSaW5nKHBBQywgcFJ4UG9ydCk7CisJLyogZG8gbm90IHN0YXJ0IGlmIGNhbGxlZCBmcm9tIENsb3NlICovCisJaWYgKHBBQy0+Qm9hcmRMZXZlbCA+IFNLX0lOSVRfREFUQSkgeworCQlDbGVhckFuZFN0YXJ0UngocEFDLCBQb3J0SW5kZXgpOworCX0KKwlyZXR1cm47CisKK3J4X2ZhaWxlZDoKKwkvKiByZW1vdmUgZXJyb3IgZnJhbWUgKi8KKwlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRVJST1IsCisJCSgiU2Nocm90dGRlc2NyaXB0b3IsIGxlbmd0aDogMHgleFxuIiwgRnJhbWVMZW5ndGgpKTsKKworCS8qIHJlbGVhc2UgdGhlIERNQSBtYXBwaW5nICovCisKKwlQaHlzQWRkciA9ICgoU0tfVTY0KSBwUnhkLT5WRGF0YUhpZ2gpIDw8IChTS19VNjQpMzI7CisJUGh5c0FkZHIgfD0gKFNLX1U2NCkgcFJ4ZC0+VkRhdGFMb3c7CisJcGNpX3VubWFwX3BhZ2UocEFDLT5QY2lEZXYsCisJCQkgUGh5c0FkZHIsCisJCQkgcEFDLT5SeEJ1ZlNpemUgLSAyLAorCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJREVWX0tGUkVFX1NLQl9JUlEocFJ4ZC0+cE1CdWYpOworCXBSeGQtPnBNQnVmID0gTlVMTDsKKwlwUnhQb3J0LT5SeGRSaW5nRnJlZSsrOworCXBSeFBvcnQtPnBSeGRSaW5nSGVhZCA9IHBSeGQtPnBOZXh0UnhkOworCWdvdG8gcnhfc3RhcnQ7CisKK30gLyogUmVjZWl2ZUlycSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlDbGVhckFuZFN0YXJ0UnggLSBnaXZlIGEgc3RhcnQgcmVjZWl2ZSBjb21tYW5kIHRvIEJNVSwgY2xlYXIgSVJRCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgc3RhcnQgY29tbWFuZCBhbmQgYSBjbGVhciBpbnRlcnJ1cHQKKyAqCWNvbW1hbmQgZm9yIG9uZSByZWNlaXZlIHF1ZXVlIHRvIHRoZSBCTVUuCisgKgorICogUmV0dXJuczogTi9BCisgKglub25lCisgKi8KK3N0YXRpYyB2b2lkIENsZWFyQW5kU3RhcnRSeCgKK1NLX0FDCSpwQUMsCQkvKiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIGNvbnRleHQgKi8KK2ludAlQb3J0SW5kZXgpCS8qIGluZGV4IG9mIHRoZSByZWNlaXZlIHBvcnQgKFhNQUMpICovCit7CisJU0tfT1VUOChwQUMtPklvQmFzZSwKKwkJUnhRdWV1ZUFkZHJbUG9ydEluZGV4XStRX0NTUiwKKwkJQ1NSX1NUQVJUIHwgQ1NSX0lSUV9DTF9GKTsKK30gLyogQ2xlYXJBbmRTdGFydFJ4ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCUNsZWFyVHhJcnEgLSBnaXZlIGEgY2xlYXIgdHJhbnNtaXQgSVJRIGNvbW1hbmQgdG8gQk1VCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgY2xlYXIgdHggSVJRIGNvbW1hbmQgZm9yIG9uZQorICoJdHJhbnNtaXQgcXVldWUgdG8gdGhlIEJNVS4KKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqLworc3RhdGljIHZvaWQgQ2xlYXJUeElycSgKK1NLX0FDCSpwQUMsCQkvKiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIGNvbnRleHQgKi8KK2ludAlQb3J0SW5kZXgsCS8qIGluZGV4IG9mIHRoZSB0cmFuc21pdCBwb3J0IChYTUFDKSAqLworaW50CVByaW8pCQkvKiBwcmlvcml0eSBvciBub3JtYWwgcXVldWUgKi8KK3sKKwlTS19PVVQ4KHBBQy0+SW9CYXNlLCAKKwkJVHhRdWV1ZUFkZHJbUG9ydEluZGV4XVtQcmlvXStRX0NTUiwKKwkJQ1NSX0lSUV9DTF9GKTsKK30gLyogQ2xlYXJUeElycSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlDbGVhclJ4UmluZyAtIHJlbW92ZSBhbGwgYnVmZmVycyBmcm9tIHRoZSByZWNlaXZlIHJpbmcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBhbGwgcmVjZWl2ZSBidWZmZXJzIGZyb20gdGhlIHJpbmcuCisgKglUaGUgcmVjZWl2ZSBCTVUgbXVzdCBiZSBzdG9wcGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3N0YXRpYyB2b2lkIENsZWFyUnhSaW5nKAorU0tfQUMJKnBBQywJCS8qIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitSWF9QT1JUCSpwUnhQb3J0KQkvKiBwb2ludGVyIHRvIHJ4IHBvcnQgc3RydWN0ICovCit7CitSWEQJCSpwUnhkOwkvKiBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGRlc2NyaXB0b3IgKi8KK3Vuc2lnbmVkIGxvbmcJRmxhZ3M7CitTS19VNjQJCVBoeXNBZGRyOworCisJaWYgKHBSeFBvcnQtPlJ4ZFJpbmdGcmVlID09IHBBQy0+UnhEZXNjclBlclJpbmcpIHsKKwkJcmV0dXJuOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcFJ4UG9ydC0+UnhEZXNSaW5nTG9jaywgRmxhZ3MpOworCXBSeGQgPSBwUnhQb3J0LT5wUnhkUmluZ0hlYWQ7CisJZG8geworCQlpZiAocFJ4ZC0+cE1CdWYgIT0gTlVMTCkgeworCisJCQlQaHlzQWRkciA9ICgoU0tfVTY0KSBwUnhkLT5WRGF0YUhpZ2gpIDw8IChTS19VNjQpMzI7CisJCQlQaHlzQWRkciB8PSAoU0tfVTY0KSBwUnhkLT5WRGF0YUxvdzsKKwkJCXBjaV91bm1hcF9wYWdlKHBBQy0+UGNpRGV2LAorCQkJCQkgUGh5c0FkZHIsCisJCQkJCSBwQUMtPlJ4QnVmU2l6ZSAtIDIsCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJREVWX0tGUkVFX1NLQihwUnhkLT5wTUJ1Zik7CisJCQlwUnhkLT5wTUJ1ZiA9IE5VTEw7CisJCX0KKwkJcFJ4ZC0+UkJDb250cm9sICY9IEJNVV9PV047CisJCXBSeGQgPSBwUnhkLT5wTmV4dFJ4ZDsKKwkJcFJ4UG9ydC0+UnhkUmluZ0ZyZWUrKzsKKwl9IHdoaWxlIChwUnhkICE9IHBSeFBvcnQtPnBSeGRSaW5nVGFpbCk7CisJcFJ4UG9ydC0+cFJ4ZFJpbmdUYWlsID0gcFJ4UG9ydC0+cFJ4ZFJpbmdIZWFkOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBSeFBvcnQtPlJ4RGVzUmluZ0xvY2ssIEZsYWdzKTsKK30gLyogQ2xlYXJSeFJpbmcgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJQ2xlYXJUeFJpbmcgLSByZW1vdmUgYWxsIGJ1ZmZlcnMgZnJvbSB0aGUgdHJhbnNtaXQgcmluZworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiByZW1vdmVzIGFsbCB0cmFuc21pdCBidWZmZXJzIGZyb20gdGhlIHJpbmcuCisgKglUaGUgdHJhbnNtaXQgQk1VIG11c3QgYmUgc3RvcHBlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCisgKglhbmQgdHJhbnNtaXR0aW5nIGF0IHRoZSB1cHBlciBsZXZlbCBtdXN0IGJlIGRpc2FibGVkLgorICoJVGhlIEJNVSBvd24gYml0IG9mIGFsbCBkZXNjcmlwdG9ycyBpcyBjbGVhcmVkLCB0aGUgcmVzdCBpcworICoJZG9uZSBieSBjYWxsaW5nIEZyZWVUeERlc2NyaXB0b3JzLgorICoKKyAqIFJldHVybnM6IE4vQQorICovCitzdGF0aWMgdm9pZCBDbGVhclR4UmluZygKK1NLX0FDCSpwQUMsCQkvKiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworVFhfUE9SVAkqcFR4UG9ydCkJLyogcG9pbnRlciB0byB0eCBwcnQgc3RydWN0ICovCit7CitUWEQJCSpwVHhkOwkJLyogcG9pbnRlciB0byB0aGUgY3VycmVudCBkZXNjcmlwdG9yICovCitpbnQJCWk7Cit1bnNpZ25lZCBsb25nCUZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBUeFBvcnQtPlR4RGVzUmluZ0xvY2ssIEZsYWdzKTsKKwlwVHhkID0gcFR4UG9ydC0+cFR4ZFJpbmdIZWFkOworCWZvciAoaT0wOyBpPHBBQy0+VHhEZXNjclBlclJpbmc7IGkrKykgeworCQlwVHhkLT5UQkNvbnRyb2wgJj0gfkJNVV9PV047CisJCXBUeGQgPSBwVHhkLT5wTmV4dFR4ZDsKKwl9CisJRnJlZVR4RGVzY3JpcHRvcnMocEFDLCBwVHhQb3J0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwVHhQb3J0LT5UeERlc1JpbmdMb2NrLCBGbGFncyk7Cit9IC8qIENsZWFyVHhSaW5nICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlTa0dlU2V0TWFjQWRkciAtIFNldCB0aGUgaGFyZHdhcmUgTUFDIGFkZHJlc3MKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgTUFDIGFkZHJlc3MgdXNlZCBieSB0aGUgYWRhcHRlci4KKyAqCisgKiBSZXR1cm5zOgorICoJMCwgaWYgZXZlcnl0aGluZyBpcyBvaworICoJIT0wLCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IFNrR2VTZXRNYWNBZGRyKHN0cnVjdCBTS19ORVRfREVWSUNFICpkZXYsIHZvaWQgKnApCit7CisKK0RFVl9ORVQgKnBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworU0tfQUMJKnBBQyA9IHBOZXQtPnBBQzsKKworc3RydWN0IHNvY2thZGRyCSphZGRyID0gcDsKK3Vuc2lnbmVkIGxvbmcJRmxhZ3M7CisJCisJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VOVFJZLAorCQkoIlNrR2VTZXRNYWNBZGRyIHN0YXJ0cyBub3cuLi5cbiIpKTsKKwlpZihuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUJVU1k7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSxkZXYtPmFkZHJfbGVuKTsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKworCWlmIChwQUMtPlJsbXROZXRzID09IDIpCisJCVNrQWRkck92ZXJyaWRlKHBBQywgcEFDLT5Jb0Jhc2UsIHBOZXQtPk5ldE5yLAorCQkJKFNLX01BQ19BRERSKilkZXYtPmRldl9hZGRyLCBTS19BRERSX1ZJUlRVQUxfQUREUkVTUyk7CisJZWxzZQorCQlTa0FkZHJPdmVycmlkZShwQUMsIHBBQy0+SW9CYXNlLCBwQUMtPkFjdGl2ZVBvcnQsCisJCQkoU0tfTUFDX0FERFIqKWRldi0+ZGV2X2FkZHIsIFNLX0FERFJfVklSVFVBTF9BRERSRVNTKTsKKworCQorCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJcmV0dXJuIDA7Cit9IC8qIFNrR2VTZXRNYWNBZGRyICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCVNrR2VTZXRSeE1vZGUgLSBzZXQgcmVjZWl2ZSBtb2RlCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHJlY2VpdmUgbW9kZSBvZiBhbiBhZGFwdGVyLiBUaGUgYWRhcHRlcgorICoJc3VwcG9ydHMgcHJvbWlzY3VvdXMgbW9kZSwgYWxsbXVsdGljYXN0IG1vZGUgYW5kIGEgbnVtYmVyIG9mCisgKgltdWx0aWNhc3QgYWRkcmVzc2VzLiBJZiBtb3JlIG11bHRpY2FzdCBhZGRyZXNzZXMgdGhlIGF2YWlsYWJsZQorICoJYXJlIHNlbGVjdGVkLCBhIGhhc2ggZnVuY3Rpb24gaW4gdGhlIGhhcmR3YXJlIGlzIHVzZWQuCisgKgorICogUmV0dXJuczoKKyAqCTAsIGlmIGV2ZXJ5dGhpbmcgaXMgb2sKKyAqCSE9MCwgb24gZXJyb3IKKyAqLworc3RhdGljIHZvaWQgU2tHZVNldFJ4TW9kZShzdHJ1Y3QgU0tfTkVUX0RFVklDRSAqZGV2KQoreworCitERVZfTkVUCQkqcE5ldDsKK1NLX0FDCQkqcEFDOworCitzdHJ1Y3QgZGV2X21jX2xpc3QJKnBNY0xpc3Q7CitpbnQJCQlpOworaW50CQkJUG9ydElkeDsKK3Vuc2lnbmVkIGxvbmcJCUZsYWdzOworCisJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VOVFJZLAorCQkoIlNrR2VTZXRSeE1vZGUgc3RhcnRzIG5vdy4uLiAiKSk7CisKKwlwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwQUMgPSBwTmV0LT5wQUM7CisJaWYgKHBBQy0+UmxtdE5ldHMgPT0gMSkKKwkJUG9ydElkeCA9IHBBQy0+QWN0aXZlUG9ydDsKKwllbHNlCisJCVBvcnRJZHggPSBwTmV0LT5OZXROcjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VOVFJZLAorCQkJKCJQUk9NSVNDVU9VUyBtb2RlXG4iKSk7CisJCVNrQWRkclByb21pc2N1b3VzQ2hhbmdlKHBBQywgcEFDLT5Jb0Jhc2UsIFBvcnRJZHgsCisJCQlTS19QUk9NX01PREVfTExDKTsKKwl9IGVsc2UgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VOVFJZLAorCQkJKCJBTExNVUxUSSBtb2RlXG4iKSk7CisJCVNrQWRkclByb21pc2N1b3VzQ2hhbmdlKHBBQywgcEFDLT5Jb0Jhc2UsIFBvcnRJZHgsCisJCQlTS19QUk9NX01PREVfQUxMX01DKTsKKwl9IGVsc2UgeworCQlTa0FkZHJQcm9taXNjdW91c0NoYW5nZShwQUMsIHBBQy0+SW9CYXNlLCBQb3J0SWR4LAorCQkJU0tfUFJPTV9NT0RFX05PTkUpOworCQlTa0FkZHJNY0NsZWFyKHBBQywgcEFDLT5Jb0Jhc2UsIFBvcnRJZHgsIDApOworCisJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJCSgiTnVtYmVyIG9mIE1DIGVudHJpZXM6ICVkICIsIGRldi0+bWNfY291bnQpKTsKKwkJCisJCXBNY0xpc3QgPSBkZXYtPm1jX2xpc3Q7CisJCWZvciAoaT0wOyBpPGRldi0+bWNfY291bnQ7IGkrKywgcE1jTGlzdCA9IHBNY0xpc3QtPm5leHQpIHsKKwkJCVNrQWRkck1jQWRkKHBBQywgcEFDLT5Jb0Jhc2UsIFBvcnRJZHgsCisJCQkJKFNLX01BQ19BRERSKilwTWNMaXN0LT5kbWlfYWRkciwgMCk7CisJCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfTUNBLAorCQkJCSgiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkJcE1jTGlzdC0+ZG1pX2FkZHJbMF0sCisJCQkJcE1jTGlzdC0+ZG1pX2FkZHJbMV0sCisJCQkJcE1jTGlzdC0+ZG1pX2FkZHJbMl0sCisJCQkJcE1jTGlzdC0+ZG1pX2FkZHJbM10sCisJCQkJcE1jTGlzdC0+ZG1pX2FkZHJbNF0sCisJCQkJcE1jTGlzdC0+ZG1pX2FkZHJbNV0pKTsKKwkJfQorCQlTa0FkZHJNY1VwZGF0ZShwQUMsIHBBQy0+SW9CYXNlLCBQb3J0SWR4KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwkKKwlyZXR1cm47Cit9IC8qIFNrR2VTZXRSeE1vZGUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJU2tHZUNoYW5nZU10dSAtIHNldCB0aGUgTVRVIHRvIGFub3RoZXIgdmFsdWUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gc2V0cyBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIE1UVSBzaXplIGlzIGNoYW5nZWQKKyAqCShpZmNvbmZpZyBtdHUgeHh4IGRldiBldGhYKS4gSWYgdGhlIE1UVSBpcyBiaWdnZXIgdGhhbiBzdGFuZGFyZAorICoJZXRoZXJuZXQgTVRVIHNpemUsIGxvbmcgZnJhbWUgc3VwcG9ydCBpcyBhY3RpdmF0ZWQuCisgKgorICogUmV0dXJuczoKKyAqCTAsIGlmIGV2ZXJ5dGhpbmcgaXMgb2sKKyAqCSE9MCwgb24gZXJyb3IKKyAqLworc3RhdGljIGludCBTa0dlQ2hhbmdlTXR1KHN0cnVjdCBTS19ORVRfREVWSUNFICpkZXYsIGludCBOZXdNdHUpCit7CitERVZfTkVUCQkqcE5ldDsKK0RFVl9ORVQJCSpwT3RoZXJOZXQ7CitTS19BQwkJKnBBQzsKK3Vuc2lnbmVkIGxvbmcJRmxhZ3M7CitpbnQJCWk7CitTS19FVlBBUkEgCUV2UGFyYTsKKworCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJKCJTa0dlQ2hhbmdlTXR1IHN0YXJ0cyBub3cuLi5cbiIpKTsKKworCXBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCXBBQyAgPSBwTmV0LT5wQUM7CisKKwlpZiAoKE5ld010dSA8IDY4KSB8fCAoTmV3TXR1ID4gU0tfSlVNQk9fTVRVKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZihwQUMtPkJvYXJkTGV2ZWwgIT0gU0tfSU5JVF9SVU4pIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisjaWZkZWYgU0tfRElBR19TVVBQT1JUCisJaWYgKHBBQy0+RGlhZ01vZGVBY3RpdmUgPT0gRElBR19BQ1RJVkUpIHsKKwkJaWYgKHBBQy0+RGlhZ0Zsb3dDdHJsID09IFNLX0ZBTFNFKSB7CisJCQlyZXR1cm4gLTE7IC8qIHN0aWxsIGluIHVzZSwgZGVueSBhbnkgYWN0aW9ucyBvZiBNVFUgKi8KKwkJfSBlbHNlIHsKKwkJCXBBQy0+RGlhZ0Zsb3dDdHJsID0gU0tfRkFMU0U7CisJCX0KKwl9CisjZW5kaWYKKworCXBOZXQtPk10dSA9IE5ld010dTsKKwlwT3RoZXJOZXQgPSBuZXRkZXZfcHJpdihwQUMtPmRldlsxIC0gcE5ldC0+TmV0TnJdKTsKKwlpZiAoKHBPdGhlck5ldC0+TXR1PjE1MDApICYmIChOZXdNdHU8PTE1MDApICYmIChwT3RoZXJOZXQtPlVwPT0xKSkgeworCQlyZXR1cm4oMCk7CisJfQorCisJcEFDLT5SeEJ1ZlNpemUgPSBOZXdNdHUgKyAzMjsKKwlkZXYtPm10dSA9IE5ld010dTsKKworCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJKCJOZXcgTVRVOiAlZFxuIiwgTmV3TXR1KSk7CisKKwkvKiAKKwkqKiBQcmV2ZW50IGFueSByZWNvbmZpZ3VyYXRpb24gd2hpbGUgY2hhbmdpbmcgdGhlIE1UVSAKKwkqKiBieSBkaXNhYmxpbmcgYW55IGludGVycnVwdHMgCisJKi8KKwlTS19PVVQzMihwQUMtPklvQmFzZSwgQjBfSU1TSywgMCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisKKwkvKiAKKwkqKiBOb3RpZnkgUkxNVCB0aGF0IGFueSBwb3J0cyBhcmUgdG8gYmUgc3RvcHBlZAorCSovCisJRXZQYXJhLlBhcmEzMlswXSA9ICAwOworCUV2UGFyYS5QYXJhMzJbMV0gPSAtMTsKKwlpZiAoKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA9PSAyICkgJiYgKHBBQy0+UmxtdE5ldHMgPT0gMikpIHsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX1NUT1AsIEV2UGFyYSk7CisJCUV2UGFyYS5QYXJhMzJbMF0gPSAgMTsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX1NUT1AsIEV2UGFyYSk7CisJfSBlbHNlIHsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX1NUT1AsIEV2UGFyYSk7CisJfQorCisJLyoKKwkqKiBBZnRlciBjYWxsaW5nIHRoZSBTa0V2ZW50RGlzcGF0Y2hlcigpLCBSTE1UIGlzIGF3YXJlIGFib3V0CisJKiogdGhlIHN0b3BwZWQgcG9ydHMgLT4gY29uZmlndXJhdGlvbiBjYW4gdGFrZSBwbGFjZSEKKwkqLworCVNrRXZlbnREaXNwYXRjaGVyKHBBQywgcEFDLT5Jb0Jhc2UpOworCisJZm9yIChpPTA7IGk8cEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJc3Bpbl9sb2NrKCZwQUMtPlR4UG9ydFtpXVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jayk7CisJCW5ldGlmX3N0b3BfcXVldWUocEFDLT5kZXZbaV0pOworCisJfQorCisJLyoKKwkqKiBEZXBlbmRpbmcgb24gdGhlIGRlc2lyZWQgTVRVIHNpemUgY2hhbmdlLCBhIGRpZmZlcmVudCBudW1iZXIgb2YgCisJKiogUlggYnVmZmVycyBuZWVkIHRvIGJlIGFsbG9jYXRlZAorCSovCisJaWYgKE5ld010dSA+IDE1MDApIHsKKwkgICAgLyogCisJICAgICoqIFVzZSBsZXNzIHJ4IGJ1ZmZlcnMgCisJICAgICovCisJICAgIGZvciAoaT0wOyBpPHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCWlmICgocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDIgKSAmJiAocEFDLT5SbG10TmV0cyA9PSAyKSkgeworCQkgICAgcEFDLT5SeFBvcnRbaV0uUnhGaWxsTGltaXQgPSAgcEFDLT5SeERlc2NyUGVyUmluZyAtCisJCQkJCQkgKHBBQy0+UnhEZXNjclBlclJpbmcgLyA0KTsKKwkJfSBlbHNlIHsKKwkJICAgIGlmIChpID09IHBBQy0+QWN0aXZlUG9ydCkgeworCQkJcEFDLT5SeFBvcnRbaV0uUnhGaWxsTGltaXQgPSBwQUMtPlJ4RGVzY3JQZXJSaW5nIC0gCisJCQkJCQkgICAgKHBBQy0+UnhEZXNjclBlclJpbmcgLyA0KTsKKwkJICAgIH0gZWxzZSB7CisJCQlwQUMtPlJ4UG9ydFtpXS5SeEZpbGxMaW1pdCA9IHBBQy0+UnhEZXNjclBlclJpbmcgLSAKKwkJCQkJCSAgICAocEFDLT5SeERlc2NyUGVyUmluZyAvIDEwKTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfSBlbHNlIHsKKwkgICAgLyogCisJICAgICoqIFVzZSB0aGUgbm9ybWFsIGFtb3VudCBvZiByeCBidWZmZXJzIAorCSAgICAqLworCSAgICBmb3IgKGk9MDsgaTxwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQlpZiAoKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA9PSAyICkgJiYgKHBBQy0+UmxtdE5ldHMgPT0gMikpIHsKKwkJICAgIHBBQy0+UnhQb3J0W2ldLlJ4RmlsbExpbWl0ID0gMTsKKwkJfSBlbHNlIHsKKwkJICAgIGlmIChpID09IHBBQy0+QWN0aXZlUG9ydCkgeworCQkJcEFDLT5SeFBvcnRbaV0uUnhGaWxsTGltaXQgPSAxOworCQkgICAgfSBlbHNlIHsKKwkJCXBBQy0+UnhQb3J0W2ldLlJ4RmlsbExpbWl0ID0gcEFDLT5SeERlc2NyUGVyUmluZyAtCisJCQkJCQkgICAgKHBBQy0+UnhEZXNjclBlclJpbmcgLyA0KTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorCQorCVNrR2VEZUluaXQocEFDLCBwQUMtPklvQmFzZSk7CisKKwkvKgorCSoqIGVuYWJsZS9kaXNhYmxlIGhhcmR3YXJlIHN1cHBvcnQgZm9yIGxvbmcgZnJhbWVzCisJKi8KKwlpZiAoTmV3TXR1ID4gMTUwMCkgeworLy8gcEFDLT5KdW1ib0FjdGl2YXRlZCA9IFNLX1RSVUU7IC8qIGlzIG5ldmVyIHNldCBiYWNrICEhISAqLworCQlwQUMtPkdJbmkuR0lQb3J0VXNhZ2UgPSBTS19KVU1CT19MSU5LOworCX0gZWxzZSB7CisJICAgIGlmICgocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDIgKSAmJiAocEFDLT5SbG10TmV0cyA9PSAyKSkgeworCQlwQUMtPkdJbmkuR0lQb3J0VXNhZ2UgPSBTS19NVUxfTElOSzsKKwkgICAgfSBlbHNlIHsKKwkJcEFDLT5HSW5pLkdJUG9ydFVzYWdlID0gU0tfUkVEX0xJTks7CisJICAgIH0KKwl9CisKKwlTa0dlSW5pdCggICBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa0kyY0luaXQoICBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa0V2ZW50SW5pdChwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa1BubWlJbml0KCBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa0FkZHJJbml0KCBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa1JsbXRJbml0KCBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwlTa1RpbWVySW5pdChwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX0lPKTsKKwkKKwkvKgorCSoqIHRzY2hpbGxpbmc6CisJKiogU3BlZWQgYW5kIG90aGVycyBhcmUgc2V0IGJhY2sgdG8gZGVmYXVsdCBpbiBsZXZlbCAxIGluaXQhCisJKi8KKwlHZXRDb25maWd1cmF0aW9uKHBBQyk7CisJCisJU2tHZUluaXQoICAgcEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9SVU4pOworCVNrSTJjSW5pdCggIHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfUlVOKTsKKwlTa0V2ZW50SW5pdChwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX1JVTik7CisJU2tQbm1pSW5pdCggcEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9SVU4pOworCVNrQWRkckluaXQoIHBBQywgcEFDLT5Jb0Jhc2UsIFNLX0lOSVRfUlVOKTsKKwlTa1JsbXRJbml0KCBwQUMsIHBBQy0+SW9CYXNlLCBTS19JTklUX1JVTik7CisJU2tUaW1lckluaXQocEFDLCBwQUMtPklvQmFzZSwgU0tfSU5JVF9SVU4pOworCisJLyoKKwkqKiBjbGVhciBhbmQgcmVpbml0IHRoZSByeCByaW5ncyBoZXJlCisJKi8KKwlmb3IgKGk9MDsgaTxwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQlSZWNlaXZlSXJxKHBBQywgJnBBQy0+UnhQb3J0W2ldLCBTS19UUlVFKTsKKwkJQ2xlYXJSeFJpbmcocEFDLCAmcEFDLT5SeFBvcnRbaV0pOworCQlGaWxsUnhSaW5nKHBBQywgJnBBQy0+UnhQb3J0W2ldKTsKKworCQkvKiAKKwkJKiogRW5hYmxlIHRyYW5zbWl0IGRlc2NyaXB0b3IgcG9sbGluZworCQkqLworCQlTa0dlUG9sbFR4RChwQUMsIHBBQy0+SW9CYXNlLCBpLCBTS19UUlVFKTsKKwkJRmlsbFJ4UmluZyhwQUMsICZwQUMtPlJ4UG9ydFtpXSk7CisJfTsKKworCVNrR2VZZWxsb3dMRUQocEFDLCBwQUMtPklvQmFzZSwgMSk7CisJU2tEaW1FbmFibGVNb2RlcmF0aW9uSWZOZWVkZWQocEFDKTsJCisJU2tEaW1EaXNwbGF5TW9kZXJhdGlvblNldHRpbmdzKHBBQyk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShwQUMtPmRldltwTmV0LT5Qb3J0TnJdKTsKKwlmb3IgKGk9cEFDLT5HSW5pLkdJTWFjc0ZvdW5kLTE7IGk+PTA7IGktLSkgeworCQlzcGluX3VubG9jaygmcEFDLT5UeFBvcnRbaV1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2spOworCX0KKworCS8qIAorCSoqIEVuYWJsZSBJbnRlcnJ1cHRzIGFnYWluIAorCSovCisJU0tfT1VUMzIocEFDLT5Jb0Jhc2UsIEIwX0lNU0ssIHBBQy0+R0luaS5HSVZhbElycU1hc2spOworCVNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMF9IV0VfSU1TSywgSVJRX0hXRV9NQVNLKTsKKworCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9TVEFSVCwgRXZQYXJhKTsKKwlTa0V2ZW50RGlzcGF0Y2hlcihwQUMsIHBBQy0+SW9CYXNlKTsKKworCS8qIAorCSoqIE5vdGlmeSBSTE1UIGFib3V0IHRoZSBjaGFuZ2luZyBhbmQgcmVzdGFydGluZyBvbmUgKG9yIG1vcmUpIHBvcnRzCisJKi8KKwlpZiAoKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA9PSAyICkgJiYgKHBBQy0+UmxtdE5ldHMgPT0gMikpIHsKKwkJRXZQYXJhLlBhcmEzMlswXSA9IHBBQy0+UmxtdE5ldHM7CisJCUV2UGFyYS5QYXJhMzJbMV0gPSAtMTsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX1NFVF9ORVRTLCBFdlBhcmEpOworCQlFdlBhcmEuUGFyYTMyWzBdID0gcE5ldC0+UG9ydE5yOworCQlFdlBhcmEuUGFyYTMyWzFdID0gLTE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9TVEFSVCwgRXZQYXJhKTsKKwkJCQorCQlpZiAocE90aGVyTmV0LT5VcCkgeworCQkJRXZQYXJhLlBhcmEzMlswXSA9IHBPdGhlck5ldC0+UG9ydE5yOworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX1NUQVJULCBFdlBhcmEpOworCQl9CisJfSBlbHNlIHsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX1NUQVJULCBFdlBhcmEpOworCX0KKworCVNrRXZlbnREaXNwYXRjaGVyKHBBQywgcEFDLT5Jb0Jhc2UpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJCisJLyoKKwkqKiBXaGlsZSB0ZXN0aW5nIHRoaXMgZHJpdmVyIHdpdGggbGF0ZXN0IGtlcm5lbCAyLjUgKDIuNS43MCksIGl0IAorCSoqIHNlZW1zIGFzIGlmIHVwcGVyIGxheWVycyBoYXZlIGEgcHJvYmxlbSB0byBoYW5kbGUgYSBzdWNjZXNzZnVsCisJKiogcmV0dXJuIHZhbHVlIG9mICcwJy4gSWYgc3VjaCBhIHplcm8gaXMgcmV0dXJuZWQsIHRoZSBjb21wbGV0ZSAKKwkqKiBzeXN0ZW0gaGFuZ3MgZm9yIHNldmVyYWwgbWludXRlcyAoISksIHdoaWNoIGlzIGluIGFjY2VwdGFibGUuCisJKioKKwkqKiBDdXJyZW50bHkgaXQgaXMgbm90IGNsZWFyLCB3aGF0IHRoZSBleGFjdCByZWFzb24gZm9yIHRoaXMgcHJvYmxlbQorCSoqIGlzLiBUaGUgaW1wbGVtZW50ZWQgd29ya2Fyb3VuZCBmb3IgMi41IGlzIHRvIHJldHVybiB0aGUgZGVzaXJlZCAKKwkqKiBuZXcgTVRVIHNpemUgaWYgYWxsIG5lZWRlZCBjaGFuZ2VzIGZvciB0aGUgbmV3IE1UVSBzaXplIHdoZXJlIAorCSoqIHBlcmZvcm1lZC4gSW4ga2VybmVscyAyLjIgYW5kIDIuNCwgYSB6ZXJvIHZhbHVlIGlzIHJldHVybmVkLAorCSoqIHdoaWNoIGluZGljYXRlcyB0aGUgc3VjY2Vzc2Z1bCBjaGFuZ2Ugb2YgdGhlIG10dS1zaXplLgorCSovCisJcmV0dXJuIE5ld010dTsKKworfSAvKiBTa0dlQ2hhbmdlTXR1ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCVNrR2VTdGF0cyAtIHJldHVybiBldGhlcm5ldCBkZXZpY2Ugc3RhdGlzdGljcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiByZXR1cm4gc3RhdGlzdGljIGRhdGEgYWJvdXQgdGhlIGV0aGVybmV0IGRldmljZQorICoJdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0uCisgKgorICogUmV0dXJuczoKKyAqCXBvaW50ZXIgdG8gdGhlIHN0YXRpc3RpYyBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqU2tHZVN0YXRzKHN0cnVjdCBTS19ORVRfREVWSUNFICpkZXYpCit7CitERVZfTkVUICpwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKK1NLX0FDCSpwQUMgPSBwTmV0LT5wQUM7CitTS19QTk1JX1NUUlVDVF9EQVRBICpwUG5taVN0cnVjdDsgICAgICAgLyogc3RydWN0dXJlIGZvciBhbGwgUG5taS1EYXRhICovCitTS19QTk1JX1NUQVQgICAgKnBQbm1pU3RhdDsgICAgICAgICAgICAgLyogcG9pbnRlciB0byB2aXJ0dWFsIFhNQUMgc3RhdC4gZGF0YSAqLworU0tfUE5NSV9DT05GICAgICpwUG5taUNvbmY7ICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gdmlydHVhbCBsaW5rIGNvbmZpZy4gKi8KK3Vuc2lnbmVkIGludCAgICBTaXplOyAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIHBubWkgc3RydWN0ICovCit1bnNpZ25lZCBsb25nCUZsYWdzOwkJCS8qIGZvciBzcGluIGxvY2sgKi8KKworCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJKCJTa0dlU3RhdHMgc3RhcnRzIG5vdy4uLlxuIikpOworCXBQbm1pU3RydWN0ID0gJnBBQy0+UG5taVN0cnVjdDsKKworI2lmZGVmIFNLX0RJQUdfU1VQUE9SVAorICAgICAgICBpZiAoKHBBQy0+RGlhZ01vZGVBY3RpdmUgPT0gRElBR19OT1RBQ1RJVkUpICYmCisgICAgICAgICAgICAgICAgKHBBQy0+Qm9hcmRMZXZlbCA9PSBTS19JTklUX1JVTikpIHsKKyNlbmRpZgorICAgICAgICBTS19NRU1TRVQocFBubWlTdHJ1Y3QsIDAsIHNpemVvZihTS19QTk1JX1NUUlVDVF9EQVRBKSk7CisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworICAgICAgICBTaXplID0gU0tfUE5NSV9TVFJVQ1RfU0laRTsKKwkJU2tQbm1pR2V0U3RydWN0KHBBQywgcEFDLT5Jb0Jhc2UsIHBQbm1pU3RydWN0LCAmU2l6ZSwgcE5ldC0+TmV0TnIpOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworI2lmZGVmIFNLX0RJQUdfU1VQUE9SVAorCX0KKyNlbmRpZgorCisgICAgICAgIHBQbm1pU3RhdCA9ICZwUG5taVN0cnVjdC0+U3RhdFswXTsKKyAgICAgICAgcFBubWlDb25mID0gJnBQbm1pU3RydWN0LT5Db25mWzBdOworCisJcEFDLT5zdGF0cy5yeF9wYWNrZXRzID0gKFNLX1UzMikgcFBubWlTdHJ1Y3QtPlJ4RGVsaXZlcmVkQ3RzICYgMHhGRkZGRkZGRjsKKwlwQUMtPnN0YXRzLnR4X3BhY2tldHMgPSAoU0tfVTMyKSBwUG5taVN0YXQtPlN0YXRUeE9rQ3RzICYgMHhGRkZGRkZGRjsKKwlwQUMtPnN0YXRzLnJ4X2J5dGVzID0gKFNLX1UzMikgcFBubWlTdHJ1Y3QtPlJ4T2N0ZXRzRGVsaXZlcmVkQ3RzOworCXBBQy0+c3RhdHMudHhfYnl0ZXMgPSAoU0tfVTMyKSBwUG5taVN0YXQtPlN0YXRUeE9jdGV0c09rQ3RzOworCQorICAgICAgICBpZiAocE5ldC0+TXR1IDw9IDE1MDApIHsKKyAgICAgICAgICAgICAgICBwQUMtPnN0YXRzLnJ4X2Vycm9ycyA9IChTS19VMzIpIHBQbm1pU3RydWN0LT5JbkVycm9yc0N0cyAmIDB4RkZGRkZGRkY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcEFDLT5zdGF0cy5yeF9lcnJvcnMgPSAoU0tfVTMyKSAoKHBQbm1pU3RydWN0LT5JbkVycm9yc0N0cyAtCisgICAgICAgICAgICAgICAgICAgICAgICBwUG5taVN0YXQtPlN0YXRSeFRvb0xvbmdDdHMpICYgMHhGRkZGRkZGRik7CisJfQorCisKKwlpZiAocEFDLT5HSW5pLkdQWzBdLlBoeVR5cGUgPT0gU0tfUEhZX1hNQUMgJiYgcEFDLT5IV1JldmlzaW9uIDwgMTIpCisJCXBBQy0+c3RhdHMucnhfZXJyb3JzID0gcEFDLT5zdGF0cy5yeF9lcnJvcnMgLSBwUG5taVN0YXQtPlN0YXRSeFNob3J0c0N0czsKKworCXBBQy0+c3RhdHMudHhfZXJyb3JzID0gKFNLX1UzMikgcFBubWlTdGF0LT5TdGF0VHhTaW5nbGVDb2xsaXNpb25DdHMgJiAweEZGRkZGRkZGOworCXBBQy0+c3RhdHMucnhfZHJvcHBlZCA9IChTS19VMzIpIHBQbm1pU3RydWN0LT5SeE5vQnVmQ3RzICYgMHhGRkZGRkZGRjsKKwlwQUMtPnN0YXRzLnR4X2Ryb3BwZWQgPSAoU0tfVTMyKSBwUG5taVN0cnVjdC0+VHhOb0J1ZkN0cyAmIDB4RkZGRkZGRkY7CisJcEFDLT5zdGF0cy5tdWx0aWNhc3QgPSAoU0tfVTMyKSBwUG5taVN0YXQtPlN0YXRSeE11bHRpY2FzdE9rQ3RzICYgMHhGRkZGRkZGRjsKKwlwQUMtPnN0YXRzLmNvbGxpc2lvbnMgPSAoU0tfVTMyKSBwUG5taVN0YXQtPlN0YXRUeFNpbmdsZUNvbGxpc2lvbkN0cyAmIDB4RkZGRkZGRkY7CisKKwkvKiBkZXRhaWxlZCByeF9lcnJvcnM6ICovCisJcEFDLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gKFNLX1UzMikgcFBubWlTdGF0LT5TdGF0UnhSdW50Q3RzICYgMHhGRkZGRkZGRjsKKwlwQUMtPnN0YXRzLnJ4X292ZXJfZXJyb3JzID0gKFNLX1UzMikgcFBubWlTdGF0LT5TdGF0UnhGaWZvT3ZlcmZsb3dDdHMgJiAweEZGRkZGRkZGOworCXBBQy0+c3RhdHMucnhfY3JjX2Vycm9ycyA9IChTS19VMzIpIHBQbm1pU3RhdC0+U3RhdFJ4RmNzQ3RzICYgMHhGRkZGRkZGRjsKKwlwQUMtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IChTS19VMzIpIHBQbm1pU3RhdC0+U3RhdFJ4RnJhbWluZ0N0cyAmIDB4RkZGRkZGRkY7CisJcEFDLT5zdGF0cy5yeF9maWZvX2Vycm9ycyA9IChTS19VMzIpIHBQbm1pU3RhdC0+U3RhdFJ4Rmlmb092ZXJmbG93Q3RzICYgMHhGRkZGRkZGRjsKKwlwQUMtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSAoU0tfVTMyKSBwUG5taVN0YXQtPlN0YXRSeE1pc3NlZEN0cyAmIDB4RkZGRkZGRkY7CisKKwkvKiBkZXRhaWxlZCB0eF9lcnJvcnMgKi8KKwlwQUMtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzID0gKFNLX1UzMikgMDsKKwlwQUMtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzID0gKFNLX1UzMikgcFBubWlTdGF0LT5TdGF0VHhDYXJyaWVyQ3RzICYgMHhGRkZGRkZGRjsKKwlwQUMtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzID0gKFNLX1UzMikgcFBubWlTdGF0LT5TdGF0VHhGaWZvVW5kZXJydW5DdHMgJiAweEZGRkZGRkZGOworCXBBQy0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycyA9IChTS19VMzIpIHBQbm1pU3RhdC0+U3RhdFR4Q2FycmllckN0cyAmIDB4RkZGRkZGRkY7CisJcEFDLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzID0gKFNLX1UzMikgMDsKKworCXJldHVybigmcEFDLT5zdGF0cyk7Cit9IC8qIFNrR2VTdGF0cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIAlTa0dlSW9jdGwgLSBJTy1jb250cm9sIGZ1bmN0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpZiBhbiBpb2N0bCBpcyBpc3N1ZWQgb24gdGhlIGRldmljZS4KKyAqCVRoZXJlIGFyZSB0aHJlZSBzdWJmdW5jdGlvbiBmb3IgcmVhZGluZywgd3JpdGluZyBhbmQgdGVzdC13cml0aW5nCisgKgl0aGUgcHJpdmF0ZSBNSUIgZGF0YSBzdHJ1Y3R1cmUgKHVzZWZ1bGwgZm9yIFN5c0tvbm5lY3QtaW50ZXJuYWwgdG9vbHMpLgorICoKKyAqIFJldHVybnM6CisgKgkwLCBpZiBldmVyeXRoaW5nIGlzIG9rCisgKgkhPTAsIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgU2tHZUlvY3RsKHN0cnVjdCBTS19ORVRfREVWSUNFICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CitERVZfTkVUCQkqcE5ldDsKK1NLX0FDCQkqcEFDOwordm9pZAkJKnBNZW1CdWY7CitzdHJ1Y3QgcGNpX2RldiAgKnBkZXYgPSBOVUxMOworU0tfR0VfSU9DVEwJSW9jdGw7Cit1bnNpZ25lZCBpbnQJRXJyID0gMDsKK2ludAkJU2l6ZSA9IDA7CitpbnQgICAgICAgICAgICAgUmV0ID0gMDsKK3Vuc2lnbmVkIGludAlMZW5ndGggPSAwOworaW50CQlIZWFkZXJMZW5ndGggPSBzaXplb2YoU0tfVTMyKSArIHNpemVvZihTS19VMzIpOworCisJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VOVFJZLAorCQkoIlNrR2VJb2N0bCBzdGFydHMgbm93Li4uXG4iKSk7CisKKwlwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwQUMgPSBwTmV0LT5wQUM7CisJCisJaWYoY29weV9mcm9tX3VzZXIoJklvY3RsLCBycS0+aWZyX2RhdGEsIHNpemVvZihTS19HRV9JT0NUTCkpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXN3aXRjaChjbWQpIHsKKwljYXNlIFNLX0lPQ1RMX1NFVE1JQjoKKwljYXNlIFNLX0lPQ1RMX1BSRVNFVE1JQjoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSByZXR1cm4gLUVQRVJNOworIAljYXNlIFNLX0lPQ1RMX0dFVE1JQjoKKwkJaWYoY29weV9mcm9tX3VzZXIoJnBBQy0+UG5taVN0cnVjdCwgSW9jdGwucERhdGEsCisJCQlJb2N0bC5MZW48c2l6ZW9mKHBBQy0+UG5taVN0cnVjdCk/CisJCQlJb2N0bC5MZW4gOiBzaXplb2YocEFDLT5Qbm1pU3RydWN0KSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCVNpemUgPSBTa0dlSW9jTWliKHBOZXQsIElvY3RsLkxlbiwgY21kKTsKKwkJaWYoY29weV90b191c2VyKElvY3RsLnBEYXRhLCAmcEFDLT5Qbm1pU3RydWN0LAorCQkJSW9jdGwuTGVuPFNpemU/IElvY3RsLkxlbiA6IFNpemUpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlJb2N0bC5MZW4gPSBTaXplOworCQlpZihjb3B5X3RvX3VzZXIocnEtPmlmcl9kYXRhLCAmSW9jdGwsIHNpemVvZihTS19HRV9JT0NUTCkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNLX0lPQ1RMX0dFTjoKKwkJaWYgKElvY3RsLkxlbiA8IChzaXplb2YocEFDLT5Qbm1pU3RydWN0KSArIEhlYWRlckxlbmd0aCkpIHsKKwkJCUxlbmd0aCA9IElvY3RsLkxlbjsKKwkJfSBlbHNlIHsKKwkJCUxlbmd0aCA9IHNpemVvZihwQUMtPlBubWlTdHJ1Y3QpICsgSGVhZGVyTGVuZ3RoOworCQl9CisJCWlmIChOVUxMID09IChwTWVtQnVmID0ga21hbGxvYyhMZW5ndGgsIEdGUF9LRVJORUwpKSkgeworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJaWYoY29weV9mcm9tX3VzZXIocE1lbUJ1ZiwgSW9jdGwucERhdGEsIExlbmd0aCkpIHsKKwkJCUVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIGZhdWx0X2dlbjsKKwkJfQorCQlpZiAoKFJldCA9IFNrUG5taUdlbklvY3RsKHBBQywgcEFDLT5Jb0Jhc2UsIHBNZW1CdWYsICZMZW5ndGgsIDApKSA8IDApIHsKKwkJCUVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIGZhdWx0X2dlbjsKKwkJfQorCQlpZihjb3B5X3RvX3VzZXIoSW9jdGwucERhdGEsIHBNZW1CdWYsIExlbmd0aCkgKSB7CisJCQlFcnIgPSAtRUZBVUxUOworCQkJZ290byBmYXVsdF9nZW47CisJCX0KKwkJSW9jdGwuTGVuID0gTGVuZ3RoOworCQlpZihjb3B5X3RvX3VzZXIocnEtPmlmcl9kYXRhLCAmSW9jdGwsIHNpemVvZihTS19HRV9JT0NUTCkpKSB7CisJCQlFcnIgPSAtRUZBVUxUOworCQkJZ290byBmYXVsdF9nZW47CisJCX0KK2ZhdWx0X2dlbjoKKwkJa2ZyZWUocE1lbUJ1Zik7IC8qIGNsZWFudXAgZXZlcnl0aGluZyAqLworCQlicmVhazsKKyNpZmRlZiBTS19ESUFHX1NVUFBPUlQKKyAgICAgICBjYXNlIFNLX0lPQ1RMX0RJQUc6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgcmV0dXJuIC1FUEVSTTsKKwkJaWYgKElvY3RsLkxlbiA8IChzaXplb2YocEFDLT5Qbm1pU3RydWN0KSArIEhlYWRlckxlbmd0aCkpIHsKKwkJCUxlbmd0aCA9IElvY3RsLkxlbjsKKwkJfSBlbHNlIHsKKwkJCUxlbmd0aCA9IHNpemVvZihwQUMtPlBubWlTdHJ1Y3QpICsgSGVhZGVyTGVuZ3RoOworCQl9CisJCWlmIChOVUxMID09IChwTWVtQnVmID0ga21hbGxvYyhMZW5ndGgsIEdGUF9LRVJORUwpKSkgeworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJaWYoY29weV9mcm9tX3VzZXIocE1lbUJ1ZiwgSW9jdGwucERhdGEsIExlbmd0aCkpIHsKKwkJCUVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIGZhdWx0X2RpYWc7CisJCX0KKwkJcGRldiA9IHBBQy0+UGNpRGV2OworCQlMZW5ndGggPSAzICogc2l6ZW9mKFNLX1UzMik7ICAvKiBFcnJvciwgQnVzIGFuZCBEZXZpY2UgKi8KKwkJLyogCisJCSoqIFdoaWxlIGNvZGluZyB0aGlzIG5ldyBJT0NUTCBpbnRlcmZhY2UsIG9ubHkgYSBmZXcgbGluZXMgb2YgY29kZQorCQkqKiBhcmUgdG8gdG8gYmUgYWRkZWQuIFRoZXJlZm9yZSBubyBkZWRpY2F0ZWQgZnVuY3Rpb24gaGFzIGJlZW4gCisJCSoqIGFkZGVkLiBJZiBtb3JlIGZ1bmN0aW9uYWxpdHkgaXMgYWRkZWQsIGEgc2VwYXJhdGUgZnVuY3Rpb24gCisJCSoqIHNob3VsZCBiZSB1c2VkLi4uCisJCSovCisJCSogKChTS19VMzIgKilwTWVtQnVmKSA9IDA7CisJCSogKChTS19VMzIgKilwTWVtQnVmICsgMSkgPSBwZGV2LT5idXMtPm51bWJlcjsKKwkJKiAoKFNLX1UzMiAqKXBNZW1CdWYgKyAyKSA9IFBhcnNlRGV2aWNlTmJyRnJvbVNsb3ROYW1lKHBjaV9uYW1lKHBkZXYpKTsKKwkJaWYoY29weV90b191c2VyKElvY3RsLnBEYXRhLCBwTWVtQnVmLCBMZW5ndGgpICkgeworCQkJRXJyID0gLUVGQVVMVDsKKwkJCWdvdG8gZmF1bHRfZGlhZzsKKwkJfQorCQlJb2N0bC5MZW4gPSBMZW5ndGg7CisJCWlmKGNvcHlfdG9fdXNlcihycS0+aWZyX2RhdGEsICZJb2N0bCwgc2l6ZW9mKFNLX0dFX0lPQ1RMKSkpIHsKKwkJCUVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIGZhdWx0X2RpYWc7CisJCX0KK2ZhdWx0X2RpYWc6CisJCWtmcmVlKHBNZW1CdWYpOyAvKiBjbGVhbnVwIGV2ZXJ5dGhpbmcgKi8KKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlFcnIgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4oRXJyKTsKKworfSAvKiBTa0dlSW9jdGwgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJU2tHZUlvY01pYiAtIGhhbmRsZSBhIEdldE1pYiwgU2V0TWliLSBvciBQcmVzZXRNaWItaW9jdGwgbWVzc2FnZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiByZWFkcy93cml0ZXMgdGhlIE1JQiBkYXRhIHVzaW5nIFBOTUkgKFByaXZhdGUgTmV0d29yaworICoJTWFuYWdlbWVudCBJbnRlcmZhY2UpLgorICoJVGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgZGF0YSBtdXN0IGJlIHByb3ZpZGVkIHdpdGggdGhlCisgKglpb2N0bCBjYWxsIGFuZCBpcyBnaXZlbiB0byB0aGUgZHJpdmVyIGluIHRoZSBmb3JtIG9mCisgKglhIHVzZXIgc3BhY2UgYWRkcmVzcy4KKyAqCUNvcHlpbmcgZnJvbSB0aGUgdXNlci1wcm92aWRlZCBkYXRhIGFyZWEgaW50byBrZXJuZWwgbWVzc2FnZXMKKyAqCWFuZCBiYWNrIGlzIGRvbmUgYnkgY29weV9mcm9tX3VzZXIgYW5kIGNvcHlfdG9fdXNlciBjYWxscyBpbgorICoJU2tHZUlvY3RsLgorICoKKyAqIFJldHVybnM6CisgKglyZXR1cm5lZCBzaXplIGZyb20gUE5NSSBjYWxsCisgKi8KK3N0YXRpYyBpbnQgU2tHZUlvY01pYigKK0RFVl9ORVQJCSpwTmV0LAkvKiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIGNvbnRleHQgKi8KK3Vuc2lnbmVkIGludAlTaXplLAkvKiBsZW5ndGggb2YgaW9jdGwgZGF0YSAqLworaW50CQltb2RlKQkvKiBmbGFnIGZvciBzZXQvcHJlc2V0ICovCit7Cit1bnNpZ25lZCBsb25nCUZsYWdzOwkvKiBmb3Igc3BpbiBsb2NrICovCitTS19BQwkJKnBBQzsKKworCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FTlRSWSwKKwkJKCJTa0dlSW9jTWliIHN0YXJ0cyBub3cuLi5cbiIpKTsKKwlwQUMgPSBwTmV0LT5wQUM7CisJLyogYWNjZXNzIE1JQiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworCXN3aXRjaChtb2RlKSB7CisJY2FzZSBTS19JT0NUTF9HRVRNSUI6CisJCVNrUG5taUdldFN0cnVjdChwQUMsIHBBQy0+SW9CYXNlLCAmcEFDLT5Qbm1pU3RydWN0LCAmU2l6ZSwKKwkJCXBOZXQtPk5ldE5yKTsKKwkJYnJlYWs7CisJY2FzZSBTS19JT0NUTF9QUkVTRVRNSUI6CisJCVNrUG5taVByZVNldFN0cnVjdChwQUMsIHBBQy0+SW9CYXNlLCAmcEFDLT5Qbm1pU3RydWN0LCAmU2l6ZSwKKwkJCXBOZXQtPk5ldE5yKTsKKwkJYnJlYWs7CisJY2FzZSBTS19JT0NUTF9TRVRNSUI6CisJCVNrUG5taVNldFN0cnVjdChwQUMsIHBBQy0+SW9CYXNlLCAmcEFDLT5Qbm1pU3RydWN0LCAmU2l6ZSwKKwkJCXBOZXQtPk5ldE5yKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VOVFJZLAorCQkoIk1JQiBkYXRhIGFjY2VzcyBzdWNjZWVkZWRcbiIpKTsKKwlyZXR1cm4gKFNpemUpOworfSAvKiBTa0dlSW9jTWliICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogCUdldENvbmZpZ3VyYXRpb24gLSByZWFkIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gcmVhZHMgcGVyLWFkYXB0ZXIgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmcm9tCisgKgl0aGUgb3B0aW9ucyBwcm92aWRlZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICoKKyAqIFJldHVybnM6CisgKglub25lCisgKi8KK3N0YXRpYyB2b2lkIEdldENvbmZpZ3VyYXRpb24oCitTS19BQwkqcEFDKQkvKiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIGNvbnRleHQgc3RydWN0dXJlICovCit7CitTS19JMzIJUG9ydDsJCS8qIHByZWZlcnJlZCBwb3J0ICovCitTS19CT09MCUF1dG9TZXQ7CitTS19CT09MIER1cFNldDsKK2ludAlMaW5rU3BlZWQgICAgICAgICAgPSBTS19MU1BFRURfQVVUTzsJLyogTGluayBzcGVlZCAqLworaW50CUF1dG9OZWcgICAgICAgICAgICA9IDE7CQkJLyogYXV0b25lZyBvZmYgKDApIG9yIG9uICgxKSAqLworaW50CUR1cGxleENhcCAgICAgICAgICA9IDA7CQkJLyogMD1ib3RoLDE9ZnVsbCwyPWhhbGYgKi8KK2ludAlGbG93Q3RybCAgICAgICAgICAgPSBTS19GTE9XX01PREVfU1lNX09SX1JFTTsJLyogRmxvd0NvbnRyb2wgICovCitpbnQJTVNNb2RlICAgICAgICAgICAgID0gU0tfTVNfTU9ERV9BVVRPOwkvKiBtYXN0ZXIvc2xhdmUgbW9kZSAgICAqLworCitTS19CT09MIElzQ29uVHlwZURlZmluZWQgICA9IFNLX1RSVUU7CitTS19CT09MIElzTGlua1NwZWVkRGVmaW5lZCA9IFNLX1RSVUU7CitTS19CT09MIElzRmxvd0N0cmxEZWZpbmVkICA9IFNLX1RSVUU7CitTS19CT09MIElzUm9sZURlZmluZWQgICAgICA9IFNLX1RSVUU7CitTS19CT09MIElzTW9kZURlZmluZWQgICAgICA9IFNLX1RSVUU7CisvKgorICoJVGhlIHR3byBwYXJhbWV0ZXJzIEF1dG9OZWcuIGFuZCBEdXBsZXhDYXAuIG1hcCB0byBvbmUgY29uZmlndXJhdGlvbgorICoJcGFyYW1ldGVyLiBUaGUgbWFwcGluZyBpcyBkZXNjcmliZWQgYnkgdGhpcyB0YWJsZToKKyAqCUR1cGxleENhcCAtPgl8CWJvdGgJfAlmdWxsCXwJaGFsZgl8CisgKglBdXRvTmVnCQl8CQl8CQl8CQl8CisgKgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJT2ZmCQl8ICAgIGlsbGVnYWwJfAlGdWxsCXwJSGFsZgl8CisgKgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJT24JCXwgICBBdXRvQm90aAl8ICAgQXV0b0Z1bGwJfCAgIEF1dG9IYWxmCXwKKyAqCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKglTZW5zZQkJfCAgIEF1dG9TZW5zZQl8ICAgQXV0b1NlbnNlCXwgICBBdXRvU2Vuc2UJfAorICovCitpbnQJQ2FwYWJpbGl0aWVzWzNdWzNdID0KKwkJeyB7ICAgICAgICAgICAgICAgIC0xLCBTS19MTU9ERV9GVUxMICAgICAsIFNLX0xNT0RFX0hBTEYgICAgIH0sCisJCSAge1NLX0xNT0RFX0FVVE9CT1RIICwgU0tfTE1PREVfQVVUT0ZVTEwgLCBTS19MTU9ERV9BVVRPSEFMRiB9LAorCQkgIHtTS19MTU9ERV9BVVRPU0VOU0UsIFNLX0xNT0RFX0FVVE9TRU5TRSwgU0tfTE1PREVfQVVUT1NFTlNFfSB9OworCisjZGVmaW5lIERDX0JPVEgJMAorI2RlZmluZSBEQ19GVUxMIDEKKyNkZWZpbmUgRENfSEFMRiAyCisjZGVmaW5lIEFOX09GRgkwCisjZGVmaW5lIEFOX09OCTEKKyNkZWZpbmUgQU5fU0VOUwkyCisjZGVmaW5lIE1fQ3VyclBvcnQgcEFDLT5HSW5pLkdQW1BvcnRdCisKKworCS8qCisJKiogU2V0IHRoZSBkZWZhdWx0IHZhbHVlcyBmaXJzdCBmb3IgYm90aCBwb3J0cyEKKwkqLworCWZvciAoUG9ydCA9IDA7IFBvcnQgPCBTS19NQVhfTUFDUzsgUG9ydCsrKSB7CisJCU1fQ3VyclBvcnQuUExpbmtNb2RlQ29uZiA9IENhcGFiaWxpdGllc1tBTl9PTl1bRENfQk9USF07CisJCU1fQ3VyclBvcnQuUEZsb3dDdHJsTW9kZSA9IFNLX0ZMT1dfTU9ERV9TWU1fT1JfUkVNOworCQlNX0N1cnJQb3J0LlBNU01vZGUgICAgICAgPSBTS19NU19NT0RFX0FVVE87CisJCU1fQ3VyclBvcnQuUExpbmtTcGVlZCAgICA9IFNLX0xTUEVFRF9BVVRPOworCX0KKworCS8qCisJKiogQ2hlY2sgbWVyZ2VkIHBhcmFtZXRlciBDb25UeXBlLiBJZiBpdCBoYXMgbm90IGJlZW4gdXNlZCwKKwkqKiB2ZXJpZnkgYW55IG90aGVyIHBhcmFtZXRlciAoZS5nLiBBdXRvTmVnKSBhbmQgdXNlIGRlZmF1bHQgdmFsdWVzLiAKKwkqKgorCSoqIFN0YXRpbmcgYm90aCBDb25UeXBlIGFuZCBvdGhlciBsb3dsZXZlbCBsaW5rIHBhcmFtZXRlcnMgaXMgYWxzbworCSoqIHBvc3NpYmxlLiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGUgcGFzc2VkIENvblR5cGUtcGFyYW1ldGVyIGlzIAorCSoqIG92ZXJ3cml0dGVuIGJ5IHRoZSBsb3dsZXZlbCBsaW5rIHBhcmFtZXRlci4KKwkqKgorCSoqIFRoZSBmb2xsb3dpbmcgc2V0dGluZ3MgYXJlIHVzZWQgZm9yIGEgbWVyZ2VkIENvblR5cGUtcGFyYW1ldGVyOgorCSoqCisJKiogQ29uVHlwZSAgIER1cENhcCAgIEF1dG9OZWcgICBGbG93Q3RybCAgICAgIFJvbGUgICAgICBTcGVlZAorCSoqIC0tLS0tLS0gICAtLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLS0gICAtLS0tLS0tLS0tICAgLS0tLS0KKwkqKiAgQXV0byAgICAgIEJvdGggICAgICBPbiAgICAgIFN5bU9yUmVtICAgICAgQXV0byAgICAgICBBdXRvCisJKiogIDEwMEZEICAgICBGdWxsICAgICAgT2ZmICAgICAgIE5vbmUgICAgICA8aWdub3JlZD4gICAgMTAwCisJKiogIDEwMEhEICAgICBIYWxmICAgICAgT2ZmICAgICAgIE5vbmUgICAgICA8aWdub3JlZD4gICAgMTAwCisJKiogIDEwRkQgICAgICBGdWxsICAgICAgT2ZmICAgICAgIE5vbmUgICAgICA8aWdub3JlZD4gICAgMTAKKwkqKiAgMTBIRCAgICAgIEhhbGYgICAgICBPZmYgICAgICAgTm9uZSAgICAgIDxpZ25vcmVkPiAgICAxMAorCSoqIAorCSoqIFRoaXMgQ29uVHlwZSBwYXJhbWV0ZXIgaXMgdXNlZCBmb3IgYWxsIHBvcnRzIG9mIHRoZSBhZGFwdGVyIQorCSovCisgICAgICAgIGlmICggKENvblR5cGUgIT0gTlVMTCkgICAgICAgICAgICAgICAgJiYgCisJICAgICAocEFDLT5JbmRleCA8IFNLX01BWF9DQVJEX1BBUkFNKSAmJgorCSAgICAgKENvblR5cGVbcEFDLT5JbmRleF0gIT0gTlVMTCkgKSB7CisKKwkJCS8qIENoZWNrIGNoaXBzZXQgZmFtaWx5ICovCisJCQlpZiAoKCFwQUMtPkNoaXBzZXRUeXBlKSAmJiAKKwkJCQkoc3RyY21wKENvblR5cGVbcEFDLT5JbmRleF0sIkF1dG8iKSE9MCkgJiYKKwkJCQkoc3RyY21wKENvblR5cGVbcEFDLT5JbmRleF0sIiIpIT0wKSkgeworCQkJCS8qIFNldCB0aGUgc3BlZWQgcGFyYW1ldGVyIGJhY2sgKi8KKwkJCQkJcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIFwiJXNcIiAiIAorCQkJCQkJCSJmb3IgQ29uVHlwZS4iCisJCQkJCQkJIiBVc2luZyBBdXRvLlxuIiwgCisJCQkJCQkJQ29uVHlwZVtwQUMtPkluZGV4XSk7CisKKwkJCQkJc3ByaW50ZihDb25UeXBlW3BBQy0+SW5kZXhdLCAiQXV0byIpOwkKKwkJCX0KKworCQkJCWlmIChzdHJjbXAoQ29uVHlwZVtwQUMtPkluZGV4XSwiIik9PTApIHsKKwkJCUlzQ29uVHlwZURlZmluZWQgPSBTS19GQUxTRTsgLyogTm8gQ29uVHlwZSBkZWZpbmVkICovCisJCQkJfSBlbHNlIGlmIChzdHJjbXAoQ29uVHlwZVtwQUMtPkluZGV4XSwiQXV0byIpPT0wKSB7CisJCSAgICBmb3IgKFBvcnQgPSAwOyBQb3J0IDwgU0tfTUFYX01BQ1M7IFBvcnQrKykgeworCQkJTV9DdXJyUG9ydC5QTGlua01vZGVDb25mID0gQ2FwYWJpbGl0aWVzW0FOX09OXVtEQ19CT1RIXTsKKwkJCU1fQ3VyclBvcnQuUEZsb3dDdHJsTW9kZSA9IFNLX0ZMT1dfTU9ERV9TWU1fT1JfUkVNOworCQkJTV9DdXJyUG9ydC5QTVNNb2RlICAgICAgID0gU0tfTVNfTU9ERV9BVVRPOworCQkJTV9DdXJyUG9ydC5QTGlua1NwZWVkICAgID0gU0tfTFNQRUVEX0FVVE87CisJCSAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoQ29uVHlwZVtwQUMtPkluZGV4XSwiMTAwRkQiKT09MCkgeworCQkgICAgZm9yIChQb3J0ID0gMDsgUG9ydCA8IFNLX01BWF9NQUNTOyBQb3J0KyspIHsKKwkJCU1fQ3VyclBvcnQuUExpbmtNb2RlQ29uZiA9IENhcGFiaWxpdGllc1tBTl9PRkZdW0RDX0ZVTExdOworCQkJTV9DdXJyUG9ydC5QRmxvd0N0cmxNb2RlID0gU0tfRkxPV19NT0RFX05PTkU7CisJCQlNX0N1cnJQb3J0LlBNU01vZGUgICAgICAgPSBTS19NU19NT0RFX0FVVE87CisJCQlNX0N1cnJQb3J0LlBMaW5rU3BlZWQgICAgPSBTS19MU1BFRURfMTAwTUJQUzsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChDb25UeXBlW3BBQy0+SW5kZXhdLCIxMDBIRCIpPT0wKSB7CisJCSAgICBmb3IgKFBvcnQgPSAwOyBQb3J0IDwgU0tfTUFYX01BQ1M7IFBvcnQrKykgeworCQkJTV9DdXJyUG9ydC5QTGlua01vZGVDb25mID0gQ2FwYWJpbGl0aWVzW0FOX09GRl1bRENfSEFMRl07CisJCQlNX0N1cnJQb3J0LlBGbG93Q3RybE1vZGUgPSBTS19GTE9XX01PREVfTk9ORTsKKwkJCU1fQ3VyclBvcnQuUE1TTW9kZSAgICAgICA9IFNLX01TX01PREVfQVVUTzsKKwkJCU1fQ3VyclBvcnQuUExpbmtTcGVlZCAgICA9IFNLX0xTUEVFRF8xMDBNQlBTOworCQkgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKENvblR5cGVbcEFDLT5JbmRleF0sIjEwRkQiKT09MCkgeworCQkgICAgZm9yIChQb3J0ID0gMDsgUG9ydCA8IFNLX01BWF9NQUNTOyBQb3J0KyspIHsKKwkJCU1fQ3VyclBvcnQuUExpbmtNb2RlQ29uZiA9IENhcGFiaWxpdGllc1tBTl9PRkZdW0RDX0ZVTExdOworCQkJTV9DdXJyUG9ydC5QRmxvd0N0cmxNb2RlID0gU0tfRkxPV19NT0RFX05PTkU7CisJCQlNX0N1cnJQb3J0LlBNU01vZGUgICAgICAgPSBTS19NU19NT0RFX0FVVE87CisJCQlNX0N1cnJQb3J0LlBMaW5rU3BlZWQgICAgPSBTS19MU1BFRURfMTBNQlBTOworCQkgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKENvblR5cGVbcEFDLT5JbmRleF0sIjEwSEQiKT09MCkgeworCQkgICAgZm9yIChQb3J0ID0gMDsgUG9ydCA8IFNLX01BWF9NQUNTOyBQb3J0KyspIHsKKwkJCU1fQ3VyclBvcnQuUExpbmtNb2RlQ29uZiA9IENhcGFiaWxpdGllc1tBTl9PRkZdW0RDX0hBTEZdOworCQkJTV9DdXJyUG9ydC5QRmxvd0N0cmxNb2RlID0gU0tfRkxPV19NT0RFX05PTkU7CisJCQlNX0N1cnJQb3J0LlBNU01vZGUgICAgICAgPSBTS19NU19NT0RFX0FVVE87CisJCQlNX0N1cnJQb3J0LlBMaW5rU3BlZWQgICAgPSBTS19MU1BFRURfMTBNQlBTOworCQkgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7IAorCQkgICAgcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIFwiJXNcIiBmb3IgQ29uVHlwZVxuIiwgCisJCQlDb25UeXBlW3BBQy0+SW5kZXhdKTsKKwkJICAgIElzQ29uVHlwZURlZmluZWQgPSBTS19GQUxTRTsgLyogV3JvbmcgQ29uVHlwZSBkZWZpbmVkICovCisJCX0KKyAgICAgICAgfSBlbHNlIHsKKwkgICAgSXNDb25UeXBlRGVmaW5lZCA9IFNLX0ZBTFNFOyAvKiBObyBDb25UeXBlIGRlZmluZWQgKi8KKwl9CisKKwkvKgorCSoqIFBhcnNlIGFueSBwYXJhbWV0ZXIgc2V0dGluZ3MgZm9yIHBvcnQgQToKKwkqKiBhKSBhbnkgTGlua1NwZWVkIHN0YXRlZD8KKwkqLworCWlmIChTcGVlZF9BICE9IE5VTEwgJiYgcEFDLT5JbmRleDxTS19NQVhfQ0FSRF9QQVJBTSAmJgorCQlTcGVlZF9BW3BBQy0+SW5kZXhdICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcChTcGVlZF9BW3BBQy0+SW5kZXhdLCIiKT09MCkgeworCQkgICAgSXNMaW5rU3BlZWREZWZpbmVkID0gU0tfRkFMU0U7CisJCX0gZWxzZSBpZiAoc3RyY21wKFNwZWVkX0FbcEFDLT5JbmRleF0sIkF1dG8iKT09MCkgeworCQkgICAgTGlua1NwZWVkID0gU0tfTFNQRUVEX0FVVE87CisJCX0gZWxzZSBpZiAoc3RyY21wKFNwZWVkX0FbcEFDLT5JbmRleF0sIjEwIik9PTApIHsKKwkJICAgIExpbmtTcGVlZCA9IFNLX0xTUEVFRF8xME1CUFM7CisJCX0gZWxzZSBpZiAoc3RyY21wKFNwZWVkX0FbcEFDLT5JbmRleF0sIjEwMCIpPT0wKSB7CisJCSAgICBMaW5rU3BlZWQgPSBTS19MU1BFRURfMTAwTUJQUzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoU3BlZWRfQVtwQUMtPkluZGV4XSwiMTAwMCIpPT0wKSB7CisJCSAgICBMaW5rU3BlZWQgPSBTS19MU1BFRURfMTAwME1CUFM7CisJCX0gZWxzZSB7CisJCSAgICBwcmludGsoInNrOThsaW46IElsbGVnYWwgdmFsdWUgXCIlc1wiIGZvciBTcGVlZF9BXG4iLAorCQkJU3BlZWRfQVtwQUMtPkluZGV4XSk7CisJCSAgICBJc0xpbmtTcGVlZERlZmluZWQgPSBTS19GQUxTRTsKKwkJfQorCX0gZWxzZSB7CisJICAgIElzTGlua1NwZWVkRGVmaW5lZCA9IFNLX0ZBTFNFOworCX0KKworCS8qIAorCSoqIENoZWNrIHNwZWVkIHBhcmFtZXRlcjogCisJKiogICAgT25seSBjb3BwZXIgdHlwZSBhZGFwdGVyIGFuZCBHRSBWMiBjYXJkcyAKKwkqLworCWlmICgoKCFwQUMtPkNoaXBzZXRUeXBlKSB8fCAocEFDLT5HSW5pLkdJQ29wcGVyVHlwZSAhPSBTS19UUlVFKSkgJiYKKwkJKChMaW5rU3BlZWQgIT0gU0tfTFNQRUVEX0FVVE8pICYmCisJCShMaW5rU3BlZWQgIT0gU0tfTFNQRUVEXzEwMDBNQlBTKSkpIHsKKwkJcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIGZvciBTcGVlZF9BLiAiCisJCQkiTm90IGEgY29wcGVyIGNhcmQgb3IgR0UgVjIgY2FyZFxuICAgIFVzaW5nICIKKwkJCSJzcGVlZCAxMDAwXG4iKTsKKwkJTGlua1NwZWVkID0gU0tfTFNQRUVEXzEwMDBNQlBTOworCX0KKwkKKwkvKgkKKwkqKiBEZWNpZGUgd2hldGhlciB0byBzZXQgbmV3IGNvbmZpZyB2YWx1ZSBpZiBzb21ldGhpZyB2YWxpZCBoYXMKKwkqKiBiZWVuIHJlY2VpdmVkLgorCSovCisJaWYgKElzTGlua1NwZWVkRGVmaW5lZCkgeworCQlwQUMtPkdJbmkuR1BbMF0uUExpbmtTcGVlZCA9IExpbmtTcGVlZDsKKwl9IAorCisJLyogCisJKiogYikgQW55IEF1dG9uZWdvdGlhdGlvbiBhbmQgRHVwbGV4Q2FwYWJpbGl0aWVzIHNldD8KKwkqKiAgICBQbGVhc2Ugbm90ZSB0aGF0IGJvdGggYmVsb25nIHRvZ2V0aGVyLi4uCisJKi8KKwlBdXRvTmVnID0gQU5fT047IC8qIHRzY2hpbGxpbmc6IERlZmF1bHQ6IEF1dG9uZWdvdGlhdGlvbiBvbiEgKi8KKwlBdXRvU2V0ID0gU0tfRkFMU0U7CisJaWYgKEF1dG9OZWdfQSAhPSBOVUxMICYmIHBBQy0+SW5kZXg8U0tfTUFYX0NBUkRfUEFSQU0gJiYKKwkJQXV0b05lZ19BW3BBQy0+SW5kZXhdICE9IE5VTEwpIHsKKwkJQXV0b1NldCA9IFNLX1RSVUU7CisJCWlmIChzdHJjbXAoQXV0b05lZ19BW3BBQy0+SW5kZXhdLCIiKT09MCkgeworCQkgICAgQXV0b1NldCA9IFNLX0ZBTFNFOworCQl9IGVsc2UgaWYgKHN0cmNtcChBdXRvTmVnX0FbcEFDLT5JbmRleF0sIk9uIik9PTApIHsKKwkJICAgIEF1dG9OZWcgPSBBTl9PTjsKKwkJfSBlbHNlIGlmIChzdHJjbXAoQXV0b05lZ19BW3BBQy0+SW5kZXhdLCJPZmYiKT09MCkgeworCQkgICAgQXV0b05lZyA9IEFOX09GRjsKKwkJfSBlbHNlIGlmIChzdHJjbXAoQXV0b05lZ19BW3BBQy0+SW5kZXhdLCJTZW5zZSIpPT0wKSB7CisJCSAgICBBdXRvTmVnID0gQU5fU0VOUzsKKwkJfSBlbHNlIHsKKwkJICAgIHByaW50aygic2s5OGxpbjogSWxsZWdhbCB2YWx1ZSBcIiVzXCIgZm9yIEF1dG9OZWdfQVxuIiwKKwkJCUF1dG9OZWdfQVtwQUMtPkluZGV4XSk7CisJCX0KKwl9CisKKwlEdXBsZXhDYXAgPSBEQ19CT1RIOworCUR1cFNldCAgICA9IFNLX0ZBTFNFOworCWlmIChEdXBDYXBfQSAhPSBOVUxMICYmIHBBQy0+SW5kZXg8U0tfTUFYX0NBUkRfUEFSQU0gJiYKKwkJRHVwQ2FwX0FbcEFDLT5JbmRleF0gIT0gTlVMTCkgeworCQlEdXBTZXQgPSBTS19UUlVFOworCQlpZiAoc3RyY21wKER1cENhcF9BW3BBQy0+SW5kZXhdLCIiKT09MCkgeworCQkgICAgRHVwU2V0ID0gU0tfRkFMU0U7CisJCX0gZWxzZSBpZiAoc3RyY21wKER1cENhcF9BW3BBQy0+SW5kZXhdLCJCb3RoIik9PTApIHsKKwkJICAgIER1cGxleENhcCA9IERDX0JPVEg7CisJCX0gZWxzZSBpZiAoc3RyY21wKER1cENhcF9BW3BBQy0+SW5kZXhdLCJGdWxsIik9PTApIHsKKwkJICAgIER1cGxleENhcCA9IERDX0ZVTEw7CisJCX0gZWxzZSBpZiAoc3RyY21wKER1cENhcF9BW3BBQy0+SW5kZXhdLCJIYWxmIik9PTApIHsKKwkJICAgIER1cGxleENhcCA9IERDX0hBTEY7CisJCX0gZWxzZSB7CisJCSAgICBwcmludGsoInNrOThsaW46IElsbGVnYWwgdmFsdWUgXCIlc1wiIGZvciBEdXBDYXBfQVxuIiwKKwkJCUR1cENhcF9BW3BBQy0+SW5kZXhdKTsKKwkJfQorCX0KKworCS8qIAorCSoqIENoZWNrIGZvciBpbGxlZ2FsIGNvbWJpbmF0aW9ucyAKKwkqLworCWlmICgoTGlua1NwZWVkID09IFNLX0xTUEVFRF8xMDAwTUJQUykgJiYKKwkJKChEdXBsZXhDYXAgPT0gU0tfTE1PREVfU1RBVF9BVVRPSEFMRikgfHwKKwkJKER1cGxleENhcCA9PSBTS19MTU9ERV9TVEFUX0hBTEYpKSAmJgorCQkocEFDLT5DaGlwc2V0VHlwZSkpIHsKKwkJICAgIHByaW50aygic2s5OGxpbjogSGFsZiBEdXBsZXggbm90IHBvc3NpYmxlIHdpdGggR2lnYWJpdCBzcGVlZCFcbiIKKwkJCQkJIiAgICBVc2luZyBGdWxsIER1cGxleC5cbiIpOworCQkJCUR1cGxleENhcCA9IERDX0ZVTEw7CisJfQorCisJaWYgKCBBdXRvU2V0ICYmIEF1dG9OZWc9PUFOX1NFTlMgJiYgRHVwU2V0KSB7CisJCXByaW50aygic2s5OGxpbiwgUG9ydCBBOiBEdXBsZXhDYXBhYmlsaXRpZXMiCisJCQkiIGlnbm9yZWQgdXNpbmcgU2Vuc2UgbW9kZVxuIik7CisJfQorCisJaWYgKEF1dG9TZXQgJiYgQXV0b05lZz09QU5fT0ZGICYmIER1cFNldCAmJiBEdXBsZXhDYXA9PURDX0JPVEgpeworCQlwcmludGsoInNrOThsaW46IFBvcnQgQTogSWxsZWdhbCBjb21iaW5hdGlvbiIKKwkJCSIgb2YgdmFsdWVzIEF1dG9OZWcuIGFuZCBEdXBsZXhDYXAuXG4gICAgVXNpbmcgIgorCQkJIkZ1bGwgRHVwbGV4XG4iKTsKKwkJRHVwbGV4Q2FwID0gRENfRlVMTDsKKwl9CisKKwlpZiAoQXV0b1NldCAmJiBBdXRvTmVnPT1BTl9PRkYgJiYgIUR1cFNldCkgeworCQlEdXBsZXhDYXAgPSBEQ19GVUxMOworCX0KKwkKKwlpZiAoIUF1dG9TZXQgJiYgRHVwU2V0KSB7CisJCXByaW50aygic2s5OGxpbjogUG9ydCBBOiBEdXBsZXggc2V0dGluZyBub3QiCisJCQkiIHBvc3NpYmxlIGluXG4gICAgZGVmYXVsdCBBdXRvTmVnb3RpYXRpb24gbW9kZSIKKwkJCSIgKFNlbnNlKS5cbiAgICBVc2luZyBBdXRvTmVnb3RpYXRpb24gT25cbiIpOworCQlBdXRvTmVnID0gQU5fT047CisJfQorCQorCS8qIAorCSoqIHNldCB0aGUgZGVzaXJlZCBtb2RlIAorCSovCisJaWYgKEF1dG9TZXQgfHwgRHVwU2V0KSB7CisJICAgIHBBQy0+R0luaS5HUFswXS5QTGlua01vZGVDb25mID0gQ2FwYWJpbGl0aWVzW0F1dG9OZWddW0R1cGxleENhcF07CisJfQorCQorCS8qIAorCSoqIGMpIEFueSBGbG93Y29udHJvbC1wYXJhbWV0ZXIgc2V0PworCSovCisJaWYgKEZsb3dDdHJsX0EgIT0gTlVMTCAmJiBwQUMtPkluZGV4PFNLX01BWF9DQVJEX1BBUkFNICYmCisJCUZsb3dDdHJsX0FbcEFDLT5JbmRleF0gIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKEZsb3dDdHJsX0FbcEFDLT5JbmRleF0sIiIpID09IDApIHsKKwkJICAgIElzRmxvd0N0cmxEZWZpbmVkID0gU0tfRkFMU0U7CisJCX0gZWxzZSBpZiAoc3RyY21wKEZsb3dDdHJsX0FbcEFDLT5JbmRleF0sIlN5bU9yUmVtIikgPT0gMCkgeworCQkgICAgRmxvd0N0cmwgPSBTS19GTE9XX01PREVfU1lNX09SX1JFTTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoRmxvd0N0cmxfQVtwQUMtPkluZGV4XSwiU3ltIik9PTApIHsKKwkJICAgIEZsb3dDdHJsID0gU0tfRkxPV19NT0RFX1NZTU1FVFJJQzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoRmxvd0N0cmxfQVtwQUMtPkluZGV4XSwiTG9jU2VuZCIpPT0wKSB7CisJCSAgICBGbG93Q3RybCA9IFNLX0ZMT1dfTU9ERV9MT0NfU0VORDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoRmxvd0N0cmxfQVtwQUMtPkluZGV4XSwiTm9uZSIpPT0wKSB7CisJCSAgICBGbG93Q3RybCA9IFNLX0ZMT1dfTU9ERV9OT05FOworCQl9IGVsc2UgeworCQkgICAgcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIFwiJXNcIiBmb3IgRmxvd0N0cmxfQVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZsb3dDdHJsX0FbcEFDLT5JbmRleF0pOworCQkgICAgSXNGbG93Q3RybERlZmluZWQgPSBTS19GQUxTRTsKKwkJfQorCX0gZWxzZSB7CisJICAgSXNGbG93Q3RybERlZmluZWQgPSBTS19GQUxTRTsKKwl9CisKKwlpZiAoSXNGbG93Q3RybERlZmluZWQpIHsKKwkgICAgaWYgKChBdXRvTmVnID09IEFOX09GRikgJiYgKEZsb3dDdHJsICE9IFNLX0ZMT1dfTU9ERV9OT05FKSkgeworCQlwcmludGsoInNrOThsaW46IFBvcnQgQTogRmxvd0NvbnRyb2wiCisJCQkiIGltcG9zc2libGUgd2l0aG91dCBBdXRvTmVnb3RpYXRpb24sIgorCQkJIiBkaXNhYmxlZFxuIik7CisJCUZsb3dDdHJsID0gU0tfRkxPV19NT0RFX05PTkU7CisJICAgIH0KKwkgICAgcEFDLT5HSW5pLkdQWzBdLlBGbG93Q3RybE1vZGUgPSBGbG93Q3RybDsKKwl9CisKKwkvKgorCSoqIGQpIFdoYXQgaXMgd2l0aCB0aGUgUm9sZVBhcmFtZXRlcj8KKwkqLworCWlmIChSb2xlX0EgIT0gTlVMTCAmJiBwQUMtPkluZGV4PFNLX01BWF9DQVJEX1BBUkFNICYmCisJCVJvbGVfQVtwQUMtPkluZGV4XSAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAoUm9sZV9BW3BBQy0+SW5kZXhdLCIiKT09MCkgeworCQkgICBJc1JvbGVEZWZpbmVkID0gU0tfRkFMU0U7CisJCX0gZWxzZSBpZiAoc3RyY21wKFJvbGVfQVtwQUMtPkluZGV4XSwiQXV0byIpPT0wKSB7CisJCSAgICBNU01vZGUgPSBTS19NU19NT0RFX0FVVE87CisJCX0gZWxzZSBpZiAoc3RyY21wKFJvbGVfQVtwQUMtPkluZGV4XSwiTWFzdGVyIik9PTApIHsKKwkJICAgIE1TTW9kZSA9IFNLX01TX01PREVfTUFTVEVSOworCQl9IGVsc2UgaWYgKHN0cmNtcChSb2xlX0FbcEFDLT5JbmRleF0sIlNsYXZlIik9PTApIHsKKwkJICAgIE1TTW9kZSA9IFNLX01TX01PREVfU0xBVkU7CisJCX0gZWxzZSB7CisJCSAgICBwcmludGsoInNrOThsaW46IElsbGVnYWwgdmFsdWUgXCIlc1wiIGZvciBSb2xlX0FcbiIsCisJCQlSb2xlX0FbcEFDLT5JbmRleF0pOworCQkgICAgSXNSb2xlRGVmaW5lZCA9IFNLX0ZBTFNFOworCQl9CisJfSBlbHNlIHsKKwkgICBJc1JvbGVEZWZpbmVkID0gU0tfRkFMU0U7CisJfQorCisJaWYgKElzUm9sZURlZmluZWQgPT0gU0tfVFJVRSkgeworCSAgICBwQUMtPkdJbmkuR1BbMF0uUE1TTW9kZSA9IE1TTW9kZTsKKwl9CisJCisKKwkKKwkvKiAKKwkqKiBQYXJzZSBhbnkgcGFyYW1ldGVyIHNldHRpbmdzIGZvciBwb3J0IEI6CisJKiogYSkgYW55IExpbmtTcGVlZCBzdGF0ZWQ/CisJKi8KKwlJc0NvblR5cGVEZWZpbmVkICAgPSBTS19UUlVFOworCUlzTGlua1NwZWVkRGVmaW5lZCA9IFNLX1RSVUU7CisJSXNGbG93Q3RybERlZmluZWQgID0gU0tfVFJVRTsKKwlJc01vZGVEZWZpbmVkICAgICAgPSBTS19UUlVFOworCisJaWYgKFNwZWVkX0IgIT0gTlVMTCAmJiBwQUMtPkluZGV4PFNLX01BWF9DQVJEX1BBUkFNICYmCisJCVNwZWVkX0JbcEFDLT5JbmRleF0gIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKFNwZWVkX0JbcEFDLT5JbmRleF0sIiIpPT0wKSB7CisJCSAgICBJc0xpbmtTcGVlZERlZmluZWQgPSBTS19GQUxTRTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoU3BlZWRfQltwQUMtPkluZGV4XSwiQXV0byIpPT0wKSB7CisJCSAgICBMaW5rU3BlZWQgPSBTS19MU1BFRURfQVVUTzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoU3BlZWRfQltwQUMtPkluZGV4XSwiMTAiKT09MCkgeworCQkgICAgTGlua1NwZWVkID0gU0tfTFNQRUVEXzEwTUJQUzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoU3BlZWRfQltwQUMtPkluZGV4XSwiMTAwIik9PTApIHsKKwkJICAgIExpbmtTcGVlZCA9IFNLX0xTUEVFRF8xMDBNQlBTOworCQl9IGVsc2UgaWYgKHN0cmNtcChTcGVlZF9CW3BBQy0+SW5kZXhdLCIxMDAwIik9PTApIHsKKwkJICAgIExpbmtTcGVlZCA9IFNLX0xTUEVFRF8xMDAwTUJQUzsKKwkJfSBlbHNlIHsKKwkJICAgIHByaW50aygic2s5OGxpbjogSWxsZWdhbCB2YWx1ZSBcIiVzXCIgZm9yIFNwZWVkX0JcbiIsCisJCQlTcGVlZF9CW3BBQy0+SW5kZXhdKTsKKwkJICAgIElzTGlua1NwZWVkRGVmaW5lZCA9IFNLX0ZBTFNFOworCQl9CisJfSBlbHNlIHsKKwkgICAgSXNMaW5rU3BlZWREZWZpbmVkID0gU0tfRkFMU0U7CisJfQorCisJLyogCisJKiogQ2hlY2sgc3BlZWQgcGFyYW1ldGVyOgorCSoqICAgIE9ubHkgY29wcGVyIHR5cGUgYWRhcHRlciBhbmQgR0UgVjIgY2FyZHMgCisJKi8KKwlpZiAoKCghcEFDLT5DaGlwc2V0VHlwZSkgfHwgKHBBQy0+R0luaS5HSUNvcHBlclR5cGUgIT0gU0tfVFJVRSkpICYmCisJCSgoTGlua1NwZWVkICE9IFNLX0xTUEVFRF9BVVRPKSAmJgorCQkoTGlua1NwZWVkICE9IFNLX0xTUEVFRF8xMDAwTUJQUykpKSB7CisJCXByaW50aygic2s5OGxpbjogSWxsZWdhbCB2YWx1ZSBmb3IgU3BlZWRfQi4gIgorCQkJIk5vdCBhIGNvcHBlciBjYXJkIG9yIEdFIFYyIGNhcmRcbiAgICBVc2luZyAiCisJCQkic3BlZWQgMTAwMFxuIik7CisJCUxpbmtTcGVlZCA9IFNLX0xTUEVFRF8xMDAwTUJQUzsKKwl9CisKKwkvKiAgICAgIAorCSoqIERlY2lkZSB3aGV0aGVyIHRvIHNldCBuZXcgY29uZmlnIHZhbHVlIGlmIHNvbWV0aGlnIHZhbGlkIGhhcworCSoqIGJlZW4gcmVjZWl2ZWQuCisJKi8KKyAgICAgICAgaWYgKElzTGlua1NwZWVkRGVmaW5lZCkgeworCSAgICBwQUMtPkdJbmkuR1BbMV0uUExpbmtTcGVlZCA9IExpbmtTcGVlZDsKKwl9CisKKwkvKiAKKwkqKiBiKSBBbnkgQXV0b25lZ290aWF0aW9uIGFuZCBEdXBsZXhDYXBhYmlsaXRpZXMgc2V0PworCSoqICAgIFBsZWFzZSBub3RlIHRoYXQgYm90aCBiZWxvbmcgdG9nZXRoZXIuLi4KKwkqLworCUF1dG9OZWcgPSBBTl9TRU5TOyAvKiBkZWZhdWx0OiBkbyBhdXRvIFNlbnNlICovCisJQXV0b1NldCA9IFNLX0ZBTFNFOworCWlmIChBdXRvTmVnX0IgIT0gTlVMTCAmJiBwQUMtPkluZGV4PFNLX01BWF9DQVJEX1BBUkFNICYmCisJCUF1dG9OZWdfQltwQUMtPkluZGV4XSAhPSBOVUxMKSB7CisJCUF1dG9TZXQgPSBTS19UUlVFOworCQlpZiAoc3RyY21wKEF1dG9OZWdfQltwQUMtPkluZGV4XSwiIik9PTApIHsKKwkJICAgIEF1dG9TZXQgPSBTS19GQUxTRTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoQXV0b05lZ19CW3BBQy0+SW5kZXhdLCJPbiIpPT0wKSB7CisJCSAgICBBdXRvTmVnID0gQU5fT047CisJCX0gZWxzZSBpZiAoc3RyY21wKEF1dG9OZWdfQltwQUMtPkluZGV4XSwiT2ZmIik9PTApIHsKKwkJICAgIEF1dG9OZWcgPSBBTl9PRkY7CisJCX0gZWxzZSBpZiAoc3RyY21wKEF1dG9OZWdfQltwQUMtPkluZGV4XSwiU2Vuc2UiKT09MCkgeworCQkgICAgQXV0b05lZyA9IEFOX1NFTlM7CisJCX0gZWxzZSB7CisJCSAgICBwcmludGsoInNrOThsaW46IElsbGVnYWwgdmFsdWUgXCIlc1wiIGZvciBBdXRvTmVnX0JcbiIsCisJCQlBdXRvTmVnX0JbcEFDLT5JbmRleF0pOworCQl9CisJfQorCisJRHVwbGV4Q2FwID0gRENfQk9USDsKKwlEdXBTZXQgICAgPSBTS19GQUxTRTsKKwlpZiAoRHVwQ2FwX0IgIT0gTlVMTCAmJiBwQUMtPkluZGV4PFNLX01BWF9DQVJEX1BBUkFNICYmCisJCUR1cENhcF9CW3BBQy0+SW5kZXhdICE9IE5VTEwpIHsKKwkJRHVwU2V0ID0gU0tfVFJVRTsKKwkJaWYgKHN0cmNtcChEdXBDYXBfQltwQUMtPkluZGV4XSwiIik9PTApIHsKKwkJICAgIER1cFNldCA9IFNLX0ZBTFNFOworCQl9IGVsc2UgaWYgKHN0cmNtcChEdXBDYXBfQltwQUMtPkluZGV4XSwiQm90aCIpPT0wKSB7CisJCSAgICBEdXBsZXhDYXAgPSBEQ19CT1RIOworCQl9IGVsc2UgaWYgKHN0cmNtcChEdXBDYXBfQltwQUMtPkluZGV4XSwiRnVsbCIpPT0wKSB7CisJCSAgICBEdXBsZXhDYXAgPSBEQ19GVUxMOworCQl9IGVsc2UgaWYgKHN0cmNtcChEdXBDYXBfQltwQUMtPkluZGV4XSwiSGFsZiIpPT0wKSB7CisJCSAgICBEdXBsZXhDYXAgPSBEQ19IQUxGOworCQl9IGVsc2UgeworCQkgICAgcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIFwiJXNcIiBmb3IgRHVwQ2FwX0JcbiIsCisJCQlEdXBDYXBfQltwQUMtPkluZGV4XSk7CisJCX0KKwl9CisKKwkKKwkvKiAKKwkqKiBDaGVjayBmb3IgaWxsZWdhbCBjb21iaW5hdGlvbnMgCisJKi8KKwlpZiAoKExpbmtTcGVlZCA9PSBTS19MU1BFRURfMTAwME1CUFMpICYmCisJCSgoRHVwbGV4Q2FwID09IFNLX0xNT0RFX1NUQVRfQVVUT0hBTEYpIHx8CisJCShEdXBsZXhDYXAgPT0gU0tfTE1PREVfU1RBVF9IQUxGKSkgJiYKKwkJKHBBQy0+Q2hpcHNldFR5cGUpKSB7CisJCSAgICBwcmludGsoInNrOThsaW46IEhhbGYgRHVwbGV4IG5vdCBwb3NzaWJsZSB3aXRoIEdpZ2FiaXQgc3BlZWQhXG4iCisJCQkJCSIgICAgVXNpbmcgRnVsbCBEdXBsZXguXG4iKTsKKwkJCQlEdXBsZXhDYXAgPSBEQ19GVUxMOworCX0KKworCWlmIChBdXRvU2V0ICYmIEF1dG9OZWc9PUFOX1NFTlMgJiYgRHVwU2V0KSB7CisJCXByaW50aygic2s5OGxpbiwgUG9ydCBCOiBEdXBsZXhDYXBhYmlsaXRpZXMiCisJCQkiIGlnbm9yZWQgdXNpbmcgU2Vuc2UgbW9kZVxuIik7CisJfQorCisJaWYgKEF1dG9TZXQgJiYgQXV0b05lZz09QU5fT0ZGICYmIER1cFNldCAmJiBEdXBsZXhDYXA9PURDX0JPVEgpeworCQlwcmludGsoInNrOThsaW46IFBvcnQgQjogSWxsZWdhbCBjb21iaW5hdGlvbiIKKwkJCSIgb2YgdmFsdWVzIEF1dG9OZWcuIGFuZCBEdXBsZXhDYXAuXG4gICAgVXNpbmcgIgorCQkJIkZ1bGwgRHVwbGV4XG4iKTsKKwkJRHVwbGV4Q2FwID0gRENfRlVMTDsKKwl9CisKKwlpZiAoQXV0b1NldCAmJiBBdXRvTmVnPT1BTl9PRkYgJiYgIUR1cFNldCkgeworCQlEdXBsZXhDYXAgPSBEQ19GVUxMOworCX0KKwkKKwlpZiAoIUF1dG9TZXQgJiYgRHVwU2V0KSB7CisJCXByaW50aygic2s5OGxpbjogUG9ydCBCOiBEdXBsZXggc2V0dGluZyBub3QiCisJCQkiIHBvc3NpYmxlIGluXG4gICAgZGVmYXVsdCBBdXRvTmVnb3RpYXRpb24gbW9kZSIKKwkJCSIgKFNlbnNlKS5cbiAgICBVc2luZyBBdXRvTmVnb3RpYXRpb24gT25cbiIpOworCQlBdXRvTmVnID0gQU5fT047CisJfQorCisJLyogCisJKiogc2V0IHRoZSBkZXNpcmVkIG1vZGUgCisJKi8KKwlpZiAoQXV0b1NldCB8fCBEdXBTZXQpIHsKKwkgICAgcEFDLT5HSW5pLkdQWzFdLlBMaW5rTW9kZUNvbmYgPSBDYXBhYmlsaXRpZXNbQXV0b05lZ11bRHVwbGV4Q2FwXTsKKwl9CisKKwkvKgorCSoqIGMpIEFueSBGbG93Q3RybCBwYXJhbWV0ZXIgc2V0PworCSovCisJaWYgKEZsb3dDdHJsX0IgIT0gTlVMTCAmJiBwQUMtPkluZGV4PFNLX01BWF9DQVJEX1BBUkFNICYmCisJCUZsb3dDdHJsX0JbcEFDLT5JbmRleF0gIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKEZsb3dDdHJsX0JbcEFDLT5JbmRleF0sIiIpID09IDApIHsKKwkJICAgIElzRmxvd0N0cmxEZWZpbmVkID0gU0tfRkFMU0U7CisJCX0gZWxzZSBpZiAoc3RyY21wKEZsb3dDdHJsX0JbcEFDLT5JbmRleF0sIlN5bU9yUmVtIikgPT0gMCkgeworCQkgICAgRmxvd0N0cmwgPSBTS19GTE9XX01PREVfU1lNX09SX1JFTTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoRmxvd0N0cmxfQltwQUMtPkluZGV4XSwiU3ltIik9PTApIHsKKwkJICAgIEZsb3dDdHJsID0gU0tfRkxPV19NT0RFX1NZTU1FVFJJQzsKKwkJfSBlbHNlIGlmIChzdHJjbXAoRmxvd0N0cmxfQltwQUMtPkluZGV4XSwiTG9jU2VuZCIpPT0wKSB7CisJCSAgICBGbG93Q3RybCA9IFNLX0ZMT1dfTU9ERV9MT0NfU0VORDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoRmxvd0N0cmxfQltwQUMtPkluZGV4XSwiTm9uZSIpPT0wKSB7CisJCSAgICBGbG93Q3RybCA9IFNLX0ZMT1dfTU9ERV9OT05FOworCQl9IGVsc2UgeworCQkgICAgcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIFwiJXNcIiBmb3IgRmxvd0N0cmxfQlxuIiwKKwkJCUZsb3dDdHJsX0JbcEFDLT5JbmRleF0pOworCQkgICAgSXNGbG93Q3RybERlZmluZWQgPSBTS19GQUxTRTsKKwkJfQorCX0gZWxzZSB7CisJCUlzRmxvd0N0cmxEZWZpbmVkID0gU0tfRkFMU0U7CisJfQorCisJaWYgKElzRmxvd0N0cmxEZWZpbmVkKSB7CisJICAgIGlmICgoQXV0b05lZyA9PSBBTl9PRkYpICYmIChGbG93Q3RybCAhPSBTS19GTE9XX01PREVfTk9ORSkpIHsKKwkJcHJpbnRrKCJzazk4bGluOiBQb3J0IEI6IEZsb3dDb250cm9sIgorCQkJIiBpbXBvc3NpYmxlIHdpdGhvdXQgQXV0b05lZ290aWF0aW9uLCIKKwkJCSIgZGlzYWJsZWRcbiIpOworCQlGbG93Q3RybCA9IFNLX0ZMT1dfTU9ERV9OT05FOworCSAgICB9CisJICAgIHBBQy0+R0luaS5HUFsxXS5QRmxvd0N0cmxNb2RlID0gRmxvd0N0cmw7CisJfQorCisJLyoKKwkqKiBkKSBXaGF0IGlzIHRoZSBSb2xlUGFyYW1ldGVyPworCSovCisJaWYgKFJvbGVfQiAhPSBOVUxMICYmIHBBQy0+SW5kZXg8U0tfTUFYX0NBUkRfUEFSQU0gJiYKKwkJUm9sZV9CW3BBQy0+SW5kZXhdICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcChSb2xlX0JbcEFDLT5JbmRleF0sIiIpPT0wKSB7CisJCSAgICBJc1JvbGVEZWZpbmVkID0gU0tfRkFMU0U7CisJCX0gZWxzZSBpZiAoc3RyY21wKFJvbGVfQltwQUMtPkluZGV4XSwiQXV0byIpPT0wKSB7CisJCSAgICBNU01vZGUgPSBTS19NU19NT0RFX0FVVE87CisJCX0gZWxzZSBpZiAoc3RyY21wKFJvbGVfQltwQUMtPkluZGV4XSwiTWFzdGVyIik9PTApIHsKKwkJICAgIE1TTW9kZSA9IFNLX01TX01PREVfTUFTVEVSOworCQl9IGVsc2UgaWYgKHN0cmNtcChSb2xlX0JbcEFDLT5JbmRleF0sIlNsYXZlIik9PTApIHsKKwkJICAgIE1TTW9kZSA9IFNLX01TX01PREVfU0xBVkU7CisJCX0gZWxzZSB7CisJCSAgICBwcmludGsoInNrOThsaW46IElsbGVnYWwgdmFsdWUgXCIlc1wiIGZvciBSb2xlX0JcbiIsCisJCQlSb2xlX0JbcEFDLT5JbmRleF0pOworCQkgICAgSXNSb2xlRGVmaW5lZCA9IFNLX0ZBTFNFOworCQl9CisJfSBlbHNlIHsKKwkgICAgSXNSb2xlRGVmaW5lZCA9IFNLX0ZBTFNFOworCX0KKworCWlmIChJc1JvbGVEZWZpbmVkKSB7CisJICAgIHBBQy0+R0luaS5HUFsxXS5QTVNNb2RlID0gTVNNb2RlOworCX0KKwkKKwkvKgorCSoqIEV2YWx1YXRlIHNldHRpbmdzIGZvciBib3RoIHBvcnRzCisJKi8KKwlwQUMtPkFjdGl2ZVBvcnQgPSAwOworCWlmIChQcmVmUG9ydCAhPSBOVUxMICYmIHBBQy0+SW5kZXg8U0tfTUFYX0NBUkRfUEFSQU0gJiYKKwkJUHJlZlBvcnRbcEFDLT5JbmRleF0gIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKFByZWZQb3J0W3BBQy0+SW5kZXhdLCIiKSA9PSAwKSB7IC8qIEF1dG8gKi8KKwkJCXBBQy0+QWN0aXZlUG9ydCAgICAgICAgICAgICA9ICAwOworCQkJcEFDLT5SbG10Lk5ldFswXS5QcmVmZXJlbmNlID0gLTE7IC8qIGF1dG8gKi8KKwkJCXBBQy0+UmxtdC5OZXRbMF0uUHJlZlBvcnQgICA9ICAwOworCQl9IGVsc2UgaWYgKHN0cmNtcChQcmVmUG9ydFtwQUMtPkluZGV4XSwiQSIpID09IDApIHsKKwkJCS8qCisJCQkqKiBkbyBub3Qgc2V0IEFjdGl2ZVBvcnQgaGVyZSwgdGh1cyBhIHBvcnQKKwkJCSoqIHN3aXRjaCBpcyBpc3N1ZWQgYWZ0ZXIgbmV0IHVwLgorCQkJKi8KKwkJCVBvcnQgICAgICAgICAgICAgICAgICAgICAgICA9IDA7CisJCQlwQUMtPlJsbXQuTmV0WzBdLlByZWZlcmVuY2UgPSBQb3J0OworCQkJcEFDLT5SbG10Lk5ldFswXS5QcmVmUG9ydCAgID0gUG9ydDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoUHJlZlBvcnRbcEFDLT5JbmRleF0sIkIiKSA9PSAwKSB7CisJCQkvKgorCQkJKiogZG8gbm90IHNldCBBY3RpdmVQb3J0IGhlcmUsIHRodXMgYSBwb3J0CisJCQkqKiBzd2l0Y2ggaXMgaXNzdWVkIGFmdGVyIG5ldCB1cC4KKwkJCSovCisJCQlpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDEpIHsKKwkJCQlwcmludGsoInNrOThsaW46IElsbGVnYWwgdmFsdWUgXCJCXCIgZm9yIFByZWZQb3J0LlxuIgorCQkJCQkiICAgICAgUG9ydCBCIG5vdCBhdmFpbGFibGUgb24gc2luZ2xlIHBvcnQgYWRhcHRlcnMuXG4iKTsKKworCQkJCXBBQy0+QWN0aXZlUG9ydCAgICAgICAgICAgICA9ICAwOworCQkJCXBBQy0+UmxtdC5OZXRbMF0uUHJlZmVyZW5jZSA9IC0xOyAvKiBhdXRvICovCisJCQkJcEFDLT5SbG10Lk5ldFswXS5QcmVmUG9ydCAgID0gIDA7CisJCQl9IGVsc2UgeworCQkJCVBvcnQgICAgICAgICAgICAgICAgICAgICAgICA9IDE7CisJCQkJcEFDLT5SbG10Lk5ldFswXS5QcmVmZXJlbmNlID0gUG9ydDsKKwkJCQlwQUMtPlJsbXQuTmV0WzBdLlByZWZQb3J0ICAgPSBQb3J0OworCQkJfQorCQl9IGVsc2UgeworCQkgICAgcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIFwiJXNcIiBmb3IgUHJlZlBvcnRcbiIsCisJCQlQcmVmUG9ydFtwQUMtPkluZGV4XSk7CisJCX0KKwl9CisKKwlwQUMtPlJsbXROZXRzID0gMTsKKworCWlmIChSbG10TW9kZSAhPSBOVUxMICYmIHBBQy0+SW5kZXg8U0tfTUFYX0NBUkRfUEFSQU0gJiYKKwkJUmxtdE1vZGVbcEFDLT5JbmRleF0gIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKFJsbXRNb2RlW3BBQy0+SW5kZXhdLCAiIikgPT0gMCkgeworCQkJcEFDLT5SbG10TW9kZSA9IDA7CisJCX0gZWxzZSBpZiAoc3RyY21wKFJsbXRNb2RlW3BBQy0+SW5kZXhdLCAiQ2hlY2tMaW5rU3RhdGUiKSA9PSAwKSB7CisJCQlwQUMtPlJsbXRNb2RlID0gU0tfUkxNVF9DSEVDS19MSU5LOworCQl9IGVsc2UgaWYgKHN0cmNtcChSbG10TW9kZVtwQUMtPkluZGV4XSwgIkNoZWNrTG9jYWxQb3J0IikgPT0gMCkgeworCQkJcEFDLT5SbG10TW9kZSA9IFNLX1JMTVRfQ0hFQ0tfTElOSyB8CisJCQkJCVNLX1JMTVRfQ0hFQ0tfTE9DX0xJTks7CisJCX0gZWxzZSBpZiAoc3RyY21wKFJsbXRNb2RlW3BBQy0+SW5kZXhdLCAiQ2hlY2tTZWciKSA9PSAwKSB7CisJCQlwQUMtPlJsbXRNb2RlID0gU0tfUkxNVF9DSEVDS19MSU5LICAgICB8CisJCQkJCVNLX1JMTVRfQ0hFQ0tfTE9DX0xJTksgfAorCQkJCQlTS19STE1UX0NIRUNLX1NFRzsKKwkJfSBlbHNlIGlmICgoc3RyY21wKFJsbXRNb2RlW3BBQy0+SW5kZXhdLCAiRHVhbE5ldCIpID09IDApICYmCisJCQkocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDIpKSB7CisJCQlwQUMtPlJsbXRNb2RlID0gU0tfUkxNVF9DSEVDS19MSU5LOworCQkJcEFDLT5SbG10TmV0cyA9IDI7CisJCX0gZWxzZSB7CisJCSAgICBwcmludGsoInNrOThsaW46IElsbGVnYWwgdmFsdWUgXCIlc1wiIGZvciIKKwkJCSIgUmxtdE1vZGUsIHVzaW5nIGRlZmF1bHRcbiIsIAorCQkJUmxtdE1vZGVbcEFDLT5JbmRleF0pOworCQkJcEFDLT5SbG10TW9kZSA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlwQUMtPlJsbXRNb2RlID0gMDsKKwl9CisJCisJLyoKKwkqKiBDaGVjayB0aGUgaW50ZXJydXB0IG1vZGVyYXRpb24gcGFyYW1ldGVycworCSovCisJaWYgKE1vZGVyYXRpb25bcEFDLT5JbmRleF0gIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKE1vZGVyYXRpb25bcEFDLT5JbmRleF0sICIiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uSW50TW9kVHlwZVNlbGVjdCA9IENfSU5UX01PRF9OT05FOworCQl9IGVsc2UgaWYgKHN0cmNtcChNb2RlcmF0aW9uW3BBQy0+SW5kZXhdLCAiU3RhdGljIikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLkludE1vZFR5cGVTZWxlY3QgPSBDX0lOVF9NT0RfU1RBVElDOworCQl9IGVsc2UgaWYgKHN0cmNtcChNb2RlcmF0aW9uW3BBQy0+SW5kZXhdLCAiRHluYW1pYyIpID09IDApIHsKKwkJCXBBQy0+RHluSXJxTW9kSW5mby5JbnRNb2RUeXBlU2VsZWN0ID0gQ19JTlRfTU9EX0RZTkFNSUM7CisJCX0gZWxzZSBpZiAoc3RyY21wKE1vZGVyYXRpb25bcEFDLT5JbmRleF0sICJOb25lIikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLkludE1vZFR5cGVTZWxlY3QgPSBDX0lOVF9NT0RfTk9ORTsKKwkJfSBlbHNlIHsKKwkgICAJCXByaW50aygic2s5OGxpbjogSWxsZWdhbCB2YWx1ZSBcIiVzXCIgZm9yIE1vZGVyYXRpb24uXG4iCisJCQkJIiAgICAgIERpc2FibGUgaW50ZXJydXB0IG1vZGVyYXRpb24uXG4iLAorCQkJCU1vZGVyYXRpb25bcEFDLT5JbmRleF0pOworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLkludE1vZFR5cGVTZWxlY3QgPSBDX0lOVF9NT0RfTk9ORTsKKwkJfQorCX0gZWxzZSB7CisJCXBBQy0+RHluSXJxTW9kSW5mby5JbnRNb2RUeXBlU2VsZWN0ID0gQ19JTlRfTU9EX05PTkU7CisJfQorCisJaWYgKFN0YXRzW3BBQy0+SW5kZXhdICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcChTdGF0c1twQUMtPkluZGV4XSwgIlllcyIpID09IDApIHsKKwkJCXBBQy0+RHluSXJxTW9kSW5mby5EaXNwbGF5U3RhdHMgPSBTS19UUlVFOworCQl9IGVsc2UgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLkRpc3BsYXlTdGF0cyA9IFNLX0ZBTFNFOworCQl9CisJfSBlbHNlIHsKKwkJcEFDLT5EeW5JcnFNb2RJbmZvLkRpc3BsYXlTdGF0cyA9IFNLX0ZBTFNFOworCX0KKworCWlmIChNb2RlcmF0aW9uTWFza1twQUMtPkluZGV4XSAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0sICJSeCIpID09IDApIHsKKwkJCXBBQy0+RHluSXJxTW9kSW5mby5NYXNrSXJxTW9kZXJhdGlvbiA9IElSUV9NQVNLX1JYX09OTFk7CisJCX0gZWxzZSBpZiAoc3RyY21wKE1vZGVyYXRpb25NYXNrW3BBQy0+SW5kZXhdLCAiVHgiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19UWF9PTkxZOworCQl9IGVsc2UgaWYgKHN0cmNtcChNb2RlcmF0aW9uTWFza1twQUMtPkluZGV4XSwgIlNwIikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLk1hc2tJcnFNb2RlcmF0aW9uID0gSVJRX01BU0tfU1BfT05MWTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0sICJSeFNwIikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLk1hc2tJcnFNb2RlcmF0aW9uID0gSVJRX01BU0tfU1BfUlg7CisJCX0gZWxzZSBpZiAoc3RyY21wKE1vZGVyYXRpb25NYXNrW3BBQy0+SW5kZXhdLCAiU3BSeCIpID09IDApIHsKKwkJCXBBQy0+RHluSXJxTW9kSW5mby5NYXNrSXJxTW9kZXJhdGlvbiA9IElSUV9NQVNLX1NQX1JYOworCQl9IGVsc2UgaWYgKHN0cmNtcChNb2RlcmF0aW9uTWFza1twQUMtPkluZGV4XSwgIlJ4VHgiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19UWF9SWDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0sICJUeFJ4IikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLk1hc2tJcnFNb2RlcmF0aW9uID0gSVJRX01BU0tfVFhfUlg7CisJCX0gZWxzZSBpZiAoc3RyY21wKE1vZGVyYXRpb25NYXNrW3BBQy0+SW5kZXhdLCAiVHhTcCIpID09IDApIHsKKwkJCXBBQy0+RHluSXJxTW9kSW5mby5NYXNrSXJxTW9kZXJhdGlvbiA9IElSUV9NQVNLX1NQX1RYOworCQl9IGVsc2UgaWYgKHN0cmNtcChNb2RlcmF0aW9uTWFza1twQUMtPkluZGV4XSwgIlNwVHgiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19TUF9UWDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0sICJSeFR4U3AiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19SWF9UWF9TUDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0sICJSeFNwVHgiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19SWF9UWF9TUDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0sICJUeFJ4U3AiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19SWF9UWF9TUDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0sICJUeFNwUngiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19SWF9UWF9TUDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0sICJTcFR4UngiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19SWF9UWF9TUDsKKwkJfSBlbHNlIGlmIChzdHJjbXAoTW9kZXJhdGlvbk1hc2tbcEFDLT5JbmRleF0sICJTcFJ4VHgiKSA9PSAwKSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19SWF9UWF9TUDsKKwkJfSBlbHNlIHsgLyogc29tZSBydWJiaXNoICovCisJCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19SWF9PTkxZOworCQl9CisJfSBlbHNlIHsgIC8qIG9wZXJhdG9yIGhhcyBzdGF0ZWQgbm90aGluZyAqLworCQlwQUMtPkR5bklycU1vZEluZm8uTWFza0lycU1vZGVyYXRpb24gPSBJUlFfTUFTS19UWF9SWDsKKwl9CisKKwlpZiAoQXV0b1NpemluZ1twQUMtPkluZGV4XSAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAoQXV0b1NpemluZ1twQUMtPkluZGV4XSwgIk9uIikgPT0gMCkgeworCQkJcEFDLT5EeW5JcnFNb2RJbmZvLkF1dG9TaXppbmcgPSBTS19GQUxTRTsKKwkJfSBlbHNlIHsKKwkJCXBBQy0+RHluSXJxTW9kSW5mby5BdXRvU2l6aW5nID0gU0tfRkFMU0U7CisJCX0KKwl9IGVsc2UgeyAgLyogb3BlcmF0b3IgaGFzIHN0YXRlZCBub3RoaW5nICovCisJCXBBQy0+RHluSXJxTW9kSW5mby5BdXRvU2l6aW5nID0gU0tfRkFMU0U7CisJfQorCisJaWYgKEludHNQZXJTZWNbcEFDLT5JbmRleF0gIT0gMCkgeworCQlpZiAoKEludHNQZXJTZWNbcEFDLT5JbmRleF08IENfSU5UX01PRF9JUFNfTE9XRVJfUkFOR0UpIHx8IAorCQkJKEludHNQZXJTZWNbcEFDLT5JbmRleF0gPiBDX0lOVF9NT0RfSVBTX1VQUEVSX1JBTkdFKSkgeworCSAgIAkJcHJpbnRrKCJzazk4bGluOiBJbGxlZ2FsIHZhbHVlIFwiJWRcIiBmb3IgSW50c1BlclNlYy4gKFJhbmdlOiAlZCAtICVkKVxuIgorCQkJCSIgICAgICBVc2luZyBkZWZhdWx0IHZhbHVlIG9mICVpLlxuIiwgCisJCQkJSW50c1BlclNlY1twQUMtPkluZGV4XSwKKwkJCQlDX0lOVF9NT0RfSVBTX0xPV0VSX1JBTkdFLAorCQkJCUNfSU5UX01PRF9JUFNfVVBQRVJfUkFOR0UsCisJCQkJQ19JTlRTX1BFUl9TRUNfREVGQVVMVCk7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYyA9IENfSU5UU19QRVJfU0VDX0RFRkFVTFQ7CisJCX0gZWxzZSB7CisJCQlwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYyA9IEludHNQZXJTZWNbcEFDLT5JbmRleF07CisJCX0KKwl9IGVsc2UgeworCQlwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYyA9IENfSU5UU19QRVJfU0VDX0RFRkFVTFQ7CisJfQorCisJLyoKKwkqKiBFdmFsdWF0ZSB1cHBlciBhbmQgbG93ZXIgbW9kZXJhdGlvbiB0aHJlc2hvbGQKKwkqLworCXBBQy0+RHluSXJxTW9kSW5mby5NYXhNb2RJbnRzUGVyU2VjVXBwZXJMaW1pdCA9CisJCXBBQy0+RHluSXJxTW9kSW5mby5NYXhNb2RJbnRzUGVyU2VjICsKKwkJKHBBQy0+RHluSXJxTW9kSW5mby5NYXhNb2RJbnRzUGVyU2VjIC8gMik7CisKKwlwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlY0xvd2VyTGltaXQgPQorCQlwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYyAtCisJCShwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYyAvIDIpOworCisJcEFDLT5EeW5JcnFNb2RJbmZvLlByZXZUaW1lVmFsID0gamlmZmllczsgIC8qIGluaXRpYWwgdmFsdWUgKi8KKworCit9IC8qIEdldENvbmZpZ3VyYXRpb24gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAJUHJvZHVjdFN0ciAtIHJldHVybiBhIGFkYXB0ZXIgaWRlbnRpZmljYXRpb24gc3RyaW5nIGZyb20gdnBkCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBwcm9kdWN0IG5hbWUgc3RyaW5nIGZyb20gdGhlIHZwZCBhcmVhCisgKglhbmQgcHV0cyBpdCB0aGUgZmllbGQgcEFDLT5EZXZpY2VTdHJpbmcuCisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3N0YXRpYyB2b2lkIFByb2R1Y3RTdHIoCitTS19BQwkqcEFDCQkvKiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworKQoreworaW50CVN0ckxlbiA9IDgwOwkJLyogbGVuZ3RoIG9mIHRoZSBzdHJpbmcsIGRlZmluZWQgaW4gU0tfQUMgKi8KK2NoYXIJS2V5d29yZFtdID0gVlBEX05BTUU7CS8qIHZwZCBwcm9kdWN0bmFtZSBpZGVudGlmaWVyICovCitpbnQJUmV0dXJuQ29kZTsJCS8qIHJldHVybiBjb2RlIGZyb20gdnBkX3JlYWQgKi8KK3Vuc2lnbmVkIGxvbmcgRmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwlSZXR1cm5Db2RlID0gVnBkUmVhZChwQUMsIHBBQy0+SW9CYXNlLCBLZXl3b3JkLCBwQUMtPkRldmljZVN0ciwKKwkJJlN0ckxlbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwlpZiAoUmV0dXJuQ29kZSAhPSAwKSB7CisJCS8qIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIHRoZSB2cGQgZGF0YSAqLworCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRVJST1IsCisJCQkoIkVycm9yIHJlYWRpbmcgVlBEIGRhdGE6ICVkXG4iLCBSZXR1cm5Db2RlKSk7CisJCXBBQy0+RGV2aWNlU3RyWzBdID0gJ1wwJzsKKwl9Cit9IC8qIFByb2R1Y3RTdHIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICBTdGFydERydkNsZWFudXBUaW1lciAtIFN0YXJ0IHRpbWVyIHRvIGNoZWNrIGZvciBkZXNjcmlwdG9ycyB3aGljaAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pZ2h0IGJlIHBsYWNlZCBpbiBkZXNjcmlwdG9yIHJpbmcsIGJ1dAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVudCBiZWVuIGhhbmRsZWQgdXAgdG8gbm93CisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZnVuY3Rpb24gcmVxdWVzdHMgYSBIVy10aW1lciBmbyB0aGUgWXVrb24gY2FyZC4gVGhlIGFjdGlvbnMgdG8KKyAqICAgICAgcGVyZm9ybSB3aGVuIHRoaXMgdGltZXIgZXhwaXJlcywgYXJlIGxvY2F0ZWQgaW4gdGhlIFNrRHJ2RXZlbnQoKS4KKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqLworc3RhdGljIHZvaWQKK1N0YXJ0RHJ2Q2xlYW51cFRpbWVyKFNLX0FDICpwQUMpIHsKKyAgICBTS19FVlBBUkEgICAgRXZlbnRQYXJhbTsgICAvKiBFdmVudCBzdHJ1Y3QgZm9yIHRpbWVyIGV2ZW50ICovCisKKyAgICBTS19NRU1TRVQoKGNoYXIgKikgJkV2ZW50UGFyYW0sIDAsIHNpemVvZihFdmVudFBhcmFtKSk7CisgICAgRXZlbnRQYXJhbS5QYXJhMzJbMF0gPSBTS19EUlZfUlhfQ0xFQU5VUF9USU1FUjsKKyAgICBTa1RpbWVyU3RhcnQocEFDLCBwQUMtPklvQmFzZSwgJnBBQy0+RHJ2Q2xlYW51cFRpbWVyLAorICAgICAgICAgICAgICAgICBTS19EUlZfUlhfQ0xFQU5VUF9USU1FUl9MRU5HVEgsCisgICAgICAgICAgICAgICAgIFNLR0VfRFJWLCBTS19EUlZfVElNRVIsIEV2ZW50UGFyYW0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgIFN0b3BEcnZDbGVhbnVwVGltZXIgLSBTdG9wIHRpbWVyIHRvIGNoZWNrIGZvciBkZXNjcmlwdG9ycworICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZ1bmN0aW9uIHJlcXVlc3RzIGEgSFctdGltZXIgZm8gdGhlIFl1a29uIGNhcmQuIFRoZSBhY3Rpb25zIHRvCisgKiAgICAgIHBlcmZvcm0gd2hlbiB0aGlzIHRpbWVyIGV4cGlyZXMsIGFyZSBsb2NhdGVkIGluIHRoZSBTa0RydkV2ZW50KCkuCisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3N0YXRpYyB2b2lkCitTdG9wRHJ2Q2xlYW51cFRpbWVyKFNLX0FDICpwQUMpIHsKKyAgICBTa1RpbWVyU3RvcChwQUMsIHBBQy0+SW9CYXNlLCAmcEFDLT5EcnZDbGVhbnVwVGltZXIpOworICAgIFNLX01FTVNFVCgoY2hhciAqKSAmcEFDLT5EcnZDbGVhbnVwVGltZXIsIDAsIHNpemVvZihTS19USU1FUikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGZ1bmN0aW9ucyBmb3IgY29tbW9uIG1vZHVsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tEcnZBbGxvY1JsbXRNYnVmIC0gYWxsb2NhdGUgYW4gUkxNVCBtYnVmCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgcmV0dXJucyBhbiBSTE1UIG1idWYgb3IgTlVMTC4gVGhlIFJMTVQgTWJ1ZiBzdHJ1Y3R1cmUKKyAqCWlzIGVtYmVkZGVkIGludG8gYSBzb2NrZXQgYnVmZiBkYXRhIGFyZWEuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUKKyAqCisgKiBSZXR1cm5zOgorICoJTlVMTCBvciBwb2ludGVyIHRvIE1idWYuCisgKi8KK1NLX01CVUYgKlNrRHJ2QWxsb2NSbG10TWJ1ZigKK1NLX0FDCQkqcEFDLAkJLyogcG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkJLyogdGhlIElPLWNvbnRleHQgKi8KK3Vuc2lnbmVkCUJ1ZmZlclNpemUpCS8qIHNpemUgb2YgdGhlIHJlcXVlc3RlZCBidWZmZXIgKi8KK3sKK1NLX01CVUYJCSpwUmxtdE1idWY7CS8qIHBvaW50ZXIgdG8gYSBuZXcgcmxtdC1tYnVmIHN0cnVjdHVyZSAqLworc3RydWN0IHNrX2J1ZmYJKnBNc2dCbG9jazsJLyogcG9pbnRlciB0byBhIG5ldyBtZXNzYWdlIGJsb2NrICovCisKKwlwTXNnQmxvY2sgPSBhbGxvY19za2IoQnVmZmVyU2l6ZSArIHNpemVvZihTS19NQlVGKSwgR0ZQX0FUT01JQyk7CisJaWYgKHBNc2dCbG9jayA9PSBOVUxMKSB7CisJCXJldHVybiAoTlVMTCk7CisJfQorCXBSbG10TWJ1ZiA9IChTS19NQlVGKikgcE1zZ0Jsb2NrLT5kYXRhOworCXNrYl9yZXNlcnZlKHBNc2dCbG9jaywgc2l6ZW9mKFNLX01CVUYpKTsKKwlwUmxtdE1idWYtPnBOZXh0ID0gTlVMTDsKKwlwUmxtdE1idWYtPnBPcyA9IHBNc2dCbG9jazsKKwlwUmxtdE1idWYtPnBEYXRhID0gcE1zZ0Jsb2NrLT5kYXRhOwkvKiBEYXRhIGJ1ZmZlci4gKi8KKwlwUmxtdE1idWYtPlNpemUgPSBCdWZmZXJTaXplOwkJLyogRGF0YSBidWZmZXIgc2l6ZS4gKi8KKwlwUmxtdE1idWYtPkxlbmd0aCA9IDA7CQkvKiBMZW5ndGggb2YgcGFja2V0ICg8PSBTaXplKS4gKi8KKwlyZXR1cm4gKHBSbG10TWJ1Zik7CisKK30gLyogU2tEcnZBbGxvY1JsbXRNYnVmICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tEcnZGcmVlUmxtdE1idWYgLSBmcmVlIGFuIFJMTVQgbWJ1ZgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGZyZWVzIG9uZSBvciBtb3JlIFJMTVQgbWJ1ZihzKS4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZQorICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK3ZvaWQgIFNrRHJ2RnJlZVJsbXRNYnVmKAorU0tfQUMJCSpwQUMsCQkvKiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCQlJb0MsCQkvKiB0aGUgSU8tY29udGV4dCAqLworU0tfTUJVRgkJKnBNYnVmKQkJLyogc2l6ZSBvZiB0aGUgcmVxdWVzdGVkIGJ1ZmZlciAqLworeworU0tfTUJVRgkJKnBGcmVlTWJ1ZjsKK1NLX01CVUYJCSpwTmV4dE1idWY7CisKKwlwRnJlZU1idWYgPSBwTWJ1ZjsKKwlkbyB7CisJCXBOZXh0TWJ1ZiA9IHBGcmVlTWJ1Zi0+cE5leHQ7CisJCURFVl9LRlJFRV9TS0JfQU5ZKHBGcmVlTWJ1Zi0+cE9zKTsKKwkJcEZyZWVNYnVmID0gcE5leHRNYnVmOworCX0gd2hpbGUgKCBwRnJlZU1idWYgIT0gTlVMTCApOworfSAvKiBTa0RydkZyZWVSbG10TWJ1ZiAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrT3NHZXRUaW1lIC0gcHJvdmlkZSBhIHRpbWUgdmFsdWUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBwcm92aWRlcyBhIHRpbWUgdmFsdWUuIFRoZSB1bml0IGlzIDEvSFogKGRlZmluZWQgYnkgTGludXgpLgorICoJSXQgaXMgbm90IHVzZWQgZm9yIGFic29sdXRlIHRpbWUsIGJ1dCBvbmx5IGZvciB0aW1lIGRpZmZlcmVuY2VzLgorICoKKyAqCisgKiBSZXR1cm5zOgorICoJVGltZSB2YWx1ZQorICovCitTS19VNjQgU2tPc0dldFRpbWUoU0tfQUMgKnBBQykKK3sKKwlTS19VNjQJUHJpdmF0ZUppZmZpZXM7CisJU2tPc0dldFRpbWVDdXJyZW50KHBBQywgJlByaXZhdGVKaWZmaWVzKTsKKwlyZXR1cm4gUHJpdmF0ZUppZmZpZXM7Cit9IC8qIFNrT3NHZXRUaW1lICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tQY2lSZWFkQ2ZnRFdvcmQgLSByZWFkIGEgMzIgYml0IHZhbHVlIGZyb20gcGNpIGNvbmZpZyBzcGFjZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIHJlYWRzIGEgMzIgYml0IHZhbHVlIGZyb20gdGhlIHBjaSBjb25maWd1cmF0aW9uCisgKglzcGFjZS4KKyAqCisgKiBSZXR1cm5zOgorICoJMCAtIGluZGljYXRlIGV2ZXJ5dGhpbmcgd29ya2VkIG9rLgorICoJIT0gMCAtIGVycm9yIGluZGljYXRpb24KKyAqLworaW50IFNrUGNpUmVhZENmZ0RXb3JkKAorU0tfQUMgKnBBQywJCS8qIEFkYXB0ZXIgQ29udHJvbCBzdHJ1Y3R1cmUgcG9pbnRlciAqLworaW50IFBjaUFkZHIsCQkvKiBQQ0kgcmVnaXN0ZXIgYWRkcmVzcyAqLworU0tfVTMyICpwVmFsKQkJLyogcG9pbnRlciB0byBzdG9yZSB0aGUgcmVhZCB2YWx1ZSAqLworeworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwQUMtPlBjaURldiwgUGNpQWRkciwgcFZhbCk7CisJcmV0dXJuKDApOworfSAvKiBTa1BjaVJlYWRDZmdEV29yZCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUGNpUmVhZENmZ1dvcmQgLSByZWFkIGEgMTYgYml0IHZhbHVlIGZyb20gcGNpIGNvbmZpZyBzcGFjZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIHJlYWRzIGEgMTYgYml0IHZhbHVlIGZyb20gdGhlIHBjaSBjb25maWd1cmF0aW9uCisgKglzcGFjZS4KKyAqCisgKiBSZXR1cm5zOgorICoJMCAtIGluZGljYXRlIGV2ZXJ5dGhpbmcgd29ya2VkIG9rLgorICoJIT0gMCAtIGVycm9yIGluZGljYXRpb24KKyAqLworaW50IFNrUGNpUmVhZENmZ1dvcmQoCitTS19BQyAqcEFDLAkvKiBBZGFwdGVyIENvbnRyb2wgc3RydWN0dXJlIHBvaW50ZXIgKi8KK2ludCBQY2lBZGRyLAkJLyogUENJIHJlZ2lzdGVyIGFkZHJlc3MgKi8KK1NLX1UxNiAqcFZhbCkJCS8qIHBvaW50ZXIgdG8gc3RvcmUgdGhlIHJlYWQgdmFsdWUgKi8KK3sKKwlwY2lfcmVhZF9jb25maWdfd29yZChwQUMtPlBjaURldiwgUGNpQWRkciwgcFZhbCk7CisJcmV0dXJuKDApOworfSAvKiBTa1BjaVJlYWRDZmdXb3JkICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tQY2lSZWFkQ2ZnQnl0ZSAtIHJlYWQgYSA4IGJpdCB2YWx1ZSBmcm9tIHBjaSBjb25maWcgc3BhY2UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSByZWFkcyBhIDggYml0IHZhbHVlIGZyb20gdGhlIHBjaSBjb25maWd1cmF0aW9uCisgKglzcGFjZS4KKyAqCisgKiBSZXR1cm5zOgorICoJMCAtIGluZGljYXRlIGV2ZXJ5dGhpbmcgd29ya2VkIG9rLgorICoJIT0gMCAtIGVycm9yIGluZGljYXRpb24KKyAqLworaW50IFNrUGNpUmVhZENmZ0J5dGUoCitTS19BQyAqcEFDLAkvKiBBZGFwdGVyIENvbnRyb2wgc3RydWN0dXJlIHBvaW50ZXIgKi8KK2ludCBQY2lBZGRyLAkJLyogUENJIHJlZ2lzdGVyIGFkZHJlc3MgKi8KK1NLX1U4ICpwVmFsKQkJLyogcG9pbnRlciB0byBzdG9yZSB0aGUgcmVhZCB2YWx1ZSAqLworeworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBBQy0+UGNpRGV2LCBQY2lBZGRyLCBwVmFsKTsKKwlyZXR1cm4oMCk7Cit9IC8qIFNrUGNpUmVhZENmZ0J5dGUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1BjaVdyaXRlQ2ZnRFdvcmQgLSB3cml0ZSBhIDMyIGJpdCB2YWx1ZSB0byBwY2kgY29uZmlnIHNwYWNlCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgd3JpdGVzIGEgMzIgYml0IHZhbHVlIHRvIHRoZSBwY2kgY29uZmlndXJhdGlvbgorICoJc3BhY2UuCisgKgorICogUmV0dXJuczoKKyAqCTAgLSBpbmRpY2F0ZSBldmVyeXRoaW5nIHdvcmtlZCBvay4KKyAqCSE9IDAgLSBlcnJvciBpbmRpY2F0aW9uCisgKi8KK2ludCBTa1BjaVdyaXRlQ2ZnRFdvcmQoCitTS19BQyAqcEFDLAkvKiBBZGFwdGVyIENvbnRyb2wgc3RydWN0dXJlIHBvaW50ZXIgKi8KK2ludCBQY2lBZGRyLAkJLyogUENJIHJlZ2lzdGVyIGFkZHJlc3MgKi8KK1NLX1UzMiBWYWwpCQkvKiBwb2ludGVyIHRvIHN0b3JlIHRoZSByZWFkIHZhbHVlICovCit7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwQUMtPlBjaURldiwgUGNpQWRkciwgVmFsKTsKKwlyZXR1cm4oMCk7Cit9IC8qIFNrUGNpV3JpdGVDZmdEV29yZCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUGNpV3JpdGVDZmdXb3JkIC0gd3JpdGUgYSAxNiBiaXQgdmFsdWUgdG8gcGNpIGNvbmZpZyBzcGFjZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIHdyaXRlcyBhIDE2IGJpdCB2YWx1ZSB0byB0aGUgcGNpIGNvbmZpZ3VyYXRpb24KKyAqCXNwYWNlLiBUaGUgZmxhZyBQY2lDb25maWdVcCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY29uZmlnIHNwYWNlCisgKglpcyBhY2Nlc2libGUgb3IgbXVzdCBiZSBzZXQgdXAgZmlyc3QuCisgKgorICogUmV0dXJuczoKKyAqCTAgLSBpbmRpY2F0ZSBldmVyeXRoaW5nIHdvcmtlZCBvay4KKyAqCSE9IDAgLSBlcnJvciBpbmRpY2F0aW9uCisgKi8KK2ludCBTa1BjaVdyaXRlQ2ZnV29yZCgKK1NLX0FDICpwQUMsCS8qIEFkYXB0ZXIgQ29udHJvbCBzdHJ1Y3R1cmUgcG9pbnRlciAqLworaW50IFBjaUFkZHIsCQkvKiBQQ0kgcmVnaXN0ZXIgYWRkcmVzcyAqLworU0tfVTE2IFZhbCkJCS8qIHBvaW50ZXIgdG8gc3RvcmUgdGhlIHJlYWQgdmFsdWUgKi8KK3sKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQocEFDLT5QY2lEZXYsIFBjaUFkZHIsIFZhbCk7CisJcmV0dXJuKDApOworfSAvKiBTa1BjaVdyaXRlQ2ZnV29yZCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUGNpV3JpdGVDZmdXb3JkIC0gd3JpdGUgYSA4IGJpdCB2YWx1ZSB0byBwY2kgY29uZmlnIHNwYWNlCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgd3JpdGVzIGEgOCBiaXQgdmFsdWUgdG8gdGhlIHBjaSBjb25maWd1cmF0aW9uCisgKglzcGFjZS4gVGhlIGZsYWcgUGNpQ29uZmlnVXAgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbmZpZyBzcGFjZQorICoJaXMgYWNjZXNpYmxlIG9yIG11c3QgYmUgc2V0IHVwIGZpcnN0LgorICoKKyAqIFJldHVybnM6CisgKgkwIC0gaW5kaWNhdGUgZXZlcnl0aGluZyB3b3JrZWQgb2suCisgKgkhPSAwIC0gZXJyb3IgaW5kaWNhdGlvbgorICovCitpbnQgU2tQY2lXcml0ZUNmZ0J5dGUoCitTS19BQyAqcEFDLAkvKiBBZGFwdGVyIENvbnRyb2wgc3RydWN0dXJlIHBvaW50ZXIgKi8KK2ludCBQY2lBZGRyLAkJLyogUENJIHJlZ2lzdGVyIGFkZHJlc3MgKi8KK1NLX1U4IFZhbCkJCS8qIHBvaW50ZXIgdG8gc3RvcmUgdGhlIHJlYWQgdmFsdWUgKi8KK3sKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocEFDLT5QY2lEZXYsIFBjaUFkZHIsIFZhbCk7CisJcmV0dXJuKDApOworfSAvKiBTa1BjaVdyaXRlQ2ZnQnl0ZSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrRHJ2RXZlbnQgLSBoYW5kbGUgZHJpdmVyIGV2ZW50cworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGV2ZW50cyBmcm9tIGFsbCBtb2R1bGVzIGRpcmVjdGVkIHRvIHRoZSBkcml2ZXIKKyAqCisgKiBDb250ZXh0OgorICoJSXMgY2FsbGVkIHVuZGVyIHByb3RlY3Rpb24gb2Ygc2xvdyBwYXRoIGxvY2suCisgKgorICogUmV0dXJuczoKKyAqCTAgaWYgZXZlcnl0aGluZyBvaworICoJPCAwICBvbiBlcnJvcgorICoJCisgKi8KK2ludCBTa0RydkV2ZW50KAorU0tfQUMgKnBBQywJCS8qIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogaW8tY29udGV4dCAqLworU0tfVTMyIEV2ZW50LAkJLyogZXZlbnQtaWQgKi8KK1NLX0VWUEFSQSBQYXJhbSkJLyogZXZlbnQtcGFyYW1ldGVyICovCit7CitTS19NQlVGCQkqcFJsbXRNYnVmOwkvKiBwb2ludGVyIHRvIGEgcmxtdC1tYnVmIHN0cnVjdHVyZSAqLworc3RydWN0IHNrX2J1ZmYJKnBNc2c7CQkvKiBwb2ludGVyIHRvIGEgbWVzc2FnZSBibG9jayAqLworaW50CQlGcm9tUG9ydDsJLyogdGhlIHBvcnQgZnJvbSB3aGljaCB3ZSBzd2l0Y2ggYXdheSAqLworaW50CQlUb1BvcnQ7CQkvKiB0aGUgcG9ydCB3ZSBzd2l0Y2ggdG8gKi8KK1NLX0VWUEFSQQlOZXdQYXJhOwkvKiBwYXJhbWV0ZXIgZm9yIGZ1cnRoZXIgZXZlbnRzICovCitpbnQJCVN0YXQ7Cit1bnNpZ25lZCBsb25nCUZsYWdzOworU0tfQk9PTAkJRHVhbE5ldDsKKworCXN3aXRjaCAoRXZlbnQpIHsKKwljYXNlIFNLX0RSVl9BREFQX0ZBSUw6CisJCVNLX0RCR19NU0coTlVMTCwgU0tfREJHTU9EX0RSViwgU0tfREJHQ0FUX0RSVl9FVkVOVCwKKwkJCSgiQURBUFRFUiBGQUlMIEVWRU5UXG4iKSk7CisJCXByaW50aygiJXM6IEFkYXB0ZXIgZmFpbGVkLlxuIiwgcEFDLT5kZXZbMF0tPm5hbWUpOworCQkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwkJU0tfT1VUMzIocEFDLT5Jb0Jhc2UsIEIwX0lNU0ssIDApOworCQkvKiBjZ29vcyAqLworCQlicmVhazsKKwljYXNlIFNLX0RSVl9QT1JUX0ZBSUw6CisJCUZyb21Qb3J0ID0gUGFyYW0uUGFyYTMyWzBdOworCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRVZFTlQsCisJCQkoIlBPUlQgRkFJTCBFVkVOVCwgUG9ydDogJWRcbiIsIEZyb21Qb3J0KSk7CisJCWlmIChGcm9tUG9ydCA9PSAwKSB7CisJCQlwcmludGsoIiVzOiBQb3J0IEEgZmFpbGVkLlxuIiwgcEFDLT5kZXZbMF0tPm5hbWUpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCIlczogUG9ydCBCIGZhaWxlZC5cbiIsIHBBQy0+ZGV2WzFdLT5uYW1lKTsKKwkJfQorCQkvKiBjZ29vcyAqLworCQlicmVhazsKKwljYXNlIFNLX0RSVl9QT1JUX1JFU0VUOgkgLyogU0tfVTMyIFBvcnRJZHggKi8KKwkJLyogYWN0aW9uIGxpc3QgNCAqLworCQlGcm9tUG9ydCA9IFBhcmFtLlBhcmEzMlswXTsKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VWRU5ULAorCQkJKCJQT1JUIFJFU0VUIEVWRU5ULCBQb3J0OiAlZCAiLCBGcm9tUG9ydCkpOworCQlOZXdQYXJhLlBhcmE2NCA9IEZyb21Qb3J0OworCQlTa1BubWlFdmVudChwQUMsIElvQywgU0tfUE5NSV9FVlRfWE1BQ19SRVNFVCwgTmV3UGFyYSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKAorCQkJJnBBQy0+VHhQb3J0W0Zyb21Qb3J0XVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jaywKKwkJCUZsYWdzKTsKKworCQlTa0dlU3RvcFBvcnQocEFDLCBJb0MsIEZyb21Qb3J0LCBTS19TVE9QX0FMTCwgU0tfSEFSRF9SU1QpOworCQlwQUMtPmRldltQYXJhbS5QYXJhMzJbMF1dLT5mbGFncyAmPSB+SUZGX1JVTk5JTkc7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCisJCQkmcEFDLT5UeFBvcnRbRnJvbVBvcnRdW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrLAorCQkJRmxhZ3MpOworCQkKKwkJLyogY2xlYXIgcnggcmluZyBmcm9tIHJlY2VpdmVkIGZyYW1lcyAqLworCQlSZWNlaXZlSXJxKHBBQywgJnBBQy0+UnhQb3J0W0Zyb21Qb3J0XSwgU0tfRkFMU0UpOworCQkKKwkJQ2xlYXJUeFJpbmcocEFDLCAmcEFDLT5UeFBvcnRbRnJvbVBvcnRdW1RYX1BSSU9fTE9XXSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKAorCQkJJnBBQy0+VHhQb3J0W0Zyb21Qb3J0XVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jaywKKwkJCUZsYWdzKTsKKwkJCisJCS8qIHRzY2hpbGxpbmc6IEhhbmRsaW5nIG9mIHJldHVybiB2YWx1ZSBpbnNlcnRlZC4gKi8KKwkJaWYgKFNrR2VJbml0UG9ydChwQUMsIElvQywgRnJvbVBvcnQpKSB7CisJCQlpZiAoRnJvbVBvcnQgPT0gMCkgeworCQkJCXByaW50aygiJXM6IFNrR2VJbml0UG9ydCBBIGZhaWxlZC5cbiIsIHBBQy0+ZGV2WzBdLT5uYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKCIlczogU2tHZUluaXRQb3J0IEIgZmFpbGVkLlxuIiwgcEFDLT5kZXZbMV0tPm5hbWUpOworCQkJfQorCQl9CisJCVNrQWRkck1jVXBkYXRlKHBBQyxJb0MsIEZyb21Qb3J0KTsKKwkJUG9ydFJlSW5pdEJtdShwQUMsIEZyb21Qb3J0KTsKKwkJU2tHZVBvbGxUeEQocEFDLCBJb0MsIEZyb21Qb3J0LCBTS19UUlVFKTsKKwkJQ2xlYXJBbmRTdGFydFJ4KHBBQywgRnJvbVBvcnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAorCQkJJnBBQy0+VHhQb3J0W0Zyb21Qb3J0XVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jaywKKwkJCUZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBTS19EUlZfTkVUX1VQOgkgLyogU0tfVTMyIFBvcnRJZHggKi8KKwkJLyogYWN0aW9uIGxpc3QgNSAqLworCQlGcm9tUG9ydCA9IFBhcmFtLlBhcmEzMlswXTsKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VWRU5ULAorCQkJKCJORVQgVVAgRVZFTlQsIFBvcnQ6ICVkICIsIFBhcmFtLlBhcmEzMlswXSkpOworCQkvKiBNYWMgdXBkYXRlICovCisJCVNrQWRkck1jVXBkYXRlKHBBQyxJb0MsIEZyb21Qb3J0KTsKKworCQlpZiAoRG9QcmludEludGVyZmFjZUNoYW5nZSkgeworCQlwcmludGsoIiVzOiBuZXR3b3JrIGNvbm5lY3Rpb24gdXAgdXNpbmciCisJCQkiIHBvcnQgJWNcbiIsIHBBQy0+ZGV2W1BhcmFtLlBhcmEzMlswXV0tPm5hbWUsICdBJytQYXJhbS5QYXJhMzJbMF0pOworCisJCS8qIHRzY2hpbGxpbmc6IFZhbHVlcyBjaGFuZ2VkIGFjY29yZGluZyB0byBMaW5rU3BlZWRVc2VkLiAqLworCQlTdGF0ID0gcEFDLT5HSW5pLkdQW0Zyb21Qb3J0XS5QTGlua1NwZWVkVXNlZDsKKwkJaWYgKFN0YXQgPT0gU0tfTFNQRUVEX1NUQVRfMTBNQlBTKSB7CisJCQlwcmludGsoIiAgICBzcGVlZDogICAgICAgICAgIDEwXG4iKTsKKwkJfSBlbHNlIGlmIChTdGF0ID09IFNLX0xTUEVFRF9TVEFUXzEwME1CUFMpIHsKKwkJCXByaW50aygiICAgIHNwZWVkOiAgICAgICAgICAgMTAwXG4iKTsKKwkJfSBlbHNlIGlmIChTdGF0ID09IFNLX0xTUEVFRF9TVEFUXzEwMDBNQlBTKSB7CisJCQlwcmludGsoIiAgICBzcGVlZDogICAgICAgICAgIDEwMDBcbiIpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCIgICAgc3BlZWQ6ICAgICAgICAgICB1bmtub3duXG4iKTsKKwkJfQorCisKKwkJU3RhdCA9IHBBQy0+R0luaS5HUFtGcm9tUG9ydF0uUExpbmtNb2RlU3RhdHVzOworCQlpZiAoU3RhdCA9PSBTS19MTU9ERV9TVEFUX0FVVE9IQUxGIHx8CisJCQlTdGF0ID09IFNLX0xNT0RFX1NUQVRfQVVUT0ZVTEwpIHsKKwkJCXByaW50aygiICAgIGF1dG9uZWdvdGlhdGlvbjogeWVzXG4iKTsKKwkJfQorCQllbHNlIHsKKwkJCXByaW50aygiICAgIGF1dG9uZWdvdGlhdGlvbjogbm9cbiIpOworCQl9CisJCWlmIChTdGF0ID09IFNLX0xNT0RFX1NUQVRfQVVUT0hBTEYgfHwKKwkJCVN0YXQgPT0gU0tfTE1PREVfU1RBVF9IQUxGKSB7CisJCQlwcmludGsoIiAgICBkdXBsZXggbW9kZTogICAgIGhhbGZcbiIpOworCQl9CisJCWVsc2UgeworCQkJcHJpbnRrKCIgICAgZHVwbGV4IG1vZGU6ICAgICBmdWxsXG4iKTsKKwkJfQorCQlTdGF0ID0gcEFDLT5HSW5pLkdQW0Zyb21Qb3J0XS5QRmxvd0N0cmxTdGF0dXM7CisJCWlmIChTdGF0ID09IFNLX0ZMT1dfU1RBVF9SRU1fU0VORCApIHsKKwkJCXByaW50aygiICAgIGZsb3djdHJsOiAgICAgICAgcmVtb3RlIHNlbmRcbiIpOworCQl9CisJCWVsc2UgaWYgKFN0YXQgPT0gU0tfRkxPV19TVEFUX0xPQ19TRU5EICl7CisJCQlwcmludGsoIiAgICBmbG93Y3RybDogICAgICAgIGxvY2FsIHNlbmRcbiIpOworCQl9CisJCWVsc2UgaWYgKFN0YXQgPT0gU0tfRkxPV19TVEFUX1NZTU1FVFJJQyApeworCQkJcHJpbnRrKCIgICAgZmxvd2N0cmw6ICAgICAgICBzeW1tZXRyaWNcbiIpOworCQl9CisJCWVsc2UgeworCQkJcHJpbnRrKCIgICAgZmxvd2N0cmw6ICAgICAgICBub25lXG4iKTsKKwkJfQorCQkKKwkJLyogdHNjaGlsbGluZzogQ2hlY2sgYWdhaW5zdCBDb3BwZXJUeXBlIG5vdy4gKi8KKwkJaWYgKChwQUMtPkdJbmkuR0lDb3BwZXJUeXBlID09IFNLX1RSVUUpICYmCisJCQkocEFDLT5HSW5pLkdQW0Zyb21Qb3J0XS5QTGlua1NwZWVkVXNlZCA9PQorCQkJU0tfTFNQRUVEX1NUQVRfMTAwME1CUFMpKSB7CisJCQlTdGF0ID0gcEFDLT5HSW5pLkdQW0Zyb21Qb3J0XS5QTVNTdGF0dXM7CisJCQlpZiAoU3RhdCA9PSBTS19NU19TVEFUX01BU1RFUiApIHsKKwkJCQlwcmludGsoIiAgICByb2xlOiAgICAgICAgICAgIG1hc3RlclxuIik7CisJCQl9CisJCQllbHNlIGlmIChTdGF0ID09IFNLX01TX1NUQVRfU0xBVkUgKSB7CisJCQkJcHJpbnRrKCIgICAgcm9sZTogICAgICAgICAgICBzbGF2ZVxuIik7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwcmludGsoIiAgICByb2xlOiAgICAgICAgICAgID8/P1xuIik7CisJCQl9CisJCX0KKworCQkvKiAKKwkJICAgRGlzcGxheSBkaW0gKGR5bmFtaWMgaW50ZXJydXB0IG1vZGVyYXRpb24pIAorCQkgICBpbmZvcm1hdGlvbnMKKwkJICovCisJCWlmIChwQUMtPkR5bklycU1vZEluZm8uSW50TW9kVHlwZVNlbGVjdCA9PSBDX0lOVF9NT0RfU1RBVElDKQorCQkJcHJpbnRrKCIgICAgaXJxIG1vZGVyYXRpb246ICBzdGF0aWMgKCVkIGludHMvc2VjKVxuIiwKKwkJCQkJcEFDLT5EeW5JcnFNb2RJbmZvLk1heE1vZEludHNQZXJTZWMpOworCQllbHNlIGlmIChwQUMtPkR5bklycU1vZEluZm8uSW50TW9kVHlwZVNlbGVjdCA9PSBDX0lOVF9NT0RfRFlOQU1JQykKKwkJCXByaW50aygiICAgIGlycSBtb2RlcmF0aW9uOiAgZHluYW1pYyAoJWQgaW50cy9zZWMpXG4iLAorCQkJCQlwQUMtPkR5bklycU1vZEluZm8uTWF4TW9kSW50c1BlclNlYyk7CisJCWVsc2UKKwkJCXByaW50aygiICAgIGlycSBtb2RlcmF0aW9uOiAgZGlzYWJsZWRcbiIpOworCisKKyNpZmRlZiBTS19aRVJPQ09QWQorCQlpZiAocEFDLT5DaGlwc2V0VHlwZSkKKyNpZmRlZiBVU0VfU0tfVFhfQ0hFQ0tTVU0KKwkJCXByaW50aygiICAgIHNjYXR0ZXItZ2F0aGVyOiAgZW5hYmxlZFxuIik7CisjZWxzZQorCQkJcHJpbnRrKCIgICAgdHgtY2hlY2tzdW06ICAgICBkaXNhYmxlZFxuIik7CisjZW5kaWYKKwkJZWxzZQorCQkJcHJpbnRrKCIgICAgc2NhdHRlci1nYXRoZXI6ICBkaXNhYmxlZFxuIik7CisjZWxzZQorCQkJcHJpbnRrKCIgICAgc2NhdHRlci1nYXRoZXI6ICBkaXNhYmxlZFxuIik7CisjZW5kaWYKKworI2lmbmRlZiBVU0VfU0tfUlhfQ0hFQ0tTVU0KKwkJCXByaW50aygiICAgIHJ4LWNoZWNrc3VtOiAgICAgZGlzYWJsZWRcbiIpOworI2VuZGlmCisKKwkJfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERvUHJpbnRJbnRlcmZhY2VDaGFuZ2UgPSBTS19UUlVFOworICAgICAgICAgICAgICAgIH0KKwkKKwkJaWYgKChQYXJhbS5QYXJhMzJbMF0gIT0gcEFDLT5BY3RpdmVQb3J0KSAmJgorCQkJKHBBQy0+UmxtdE5ldHMgPT0gMSkpIHsKKwkJCU5ld1BhcmEuUGFyYTMyWzBdID0gcEFDLT5BY3RpdmVQb3J0OworCQkJTmV3UGFyYS5QYXJhMzJbMV0gPSBQYXJhbS5QYXJhMzJbMF07CisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1NXSVRDSF9JTlRFUk4sCisJCQkJTmV3UGFyYSk7CisJCX0KKworCQkvKiBJbmZvcm0gdGhlIHdvcmxkIHRoYXQgbGluayBwcm90b2NvbCBpcyB1cC4gKi8KKwkJcEFDLT5kZXZbUGFyYW0uUGFyYTMyWzBdXS0+ZmxhZ3MgfD0gSUZGX1JVTk5JTkc7CisKKwkJYnJlYWs7CisJY2FzZSBTS19EUlZfTkVUX0RPV046CSAvKiBTS19VMzIgUmVhc29uICovCisJCS8qIGFjdGlvbiBsaXN0IDcgKi8KKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VWRU5ULAorCQkJKCJORVQgRE9XTiBFVkVOVCAiKSk7CisJCWlmIChEb1ByaW50SW50ZXJmYWNlQ2hhbmdlKSB7CisJCQlwcmludGsoIiVzOiBuZXR3b3JrIGNvbm5lY3Rpb24gZG93blxuIiwgCisJCQkJcEFDLT5kZXZbUGFyYW0uUGFyYTMyWzFdXS0+bmFtZSk7CisJCX0gZWxzZSB7CisJCQlEb1ByaW50SW50ZXJmYWNlQ2hhbmdlID0gU0tfVFJVRTsKKwkJfQorCQlwQUMtPmRldltQYXJhbS5QYXJhMzJbMV1dLT5mbGFncyAmPSB+SUZGX1JVTk5JTkc7CisJCWJyZWFrOworCWNhc2UgU0tfRFJWX1NXSVRDSF9IQVJEOiAvKiBTS19VMzIgRnJvbVBvcnRJZHggU0tfVTMyIFRvUG9ydElkeCAqLworCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRVZFTlQsCisJCQkoIlBPUlQgU1dJVENIIEhBUkQgIikpOworCWNhc2UgU0tfRFJWX1NXSVRDSF9TT0ZUOiAvKiBTS19VMzIgRnJvbVBvcnRJZHggU0tfVTMyIFRvUG9ydElkeCAqLworCS8qIGFjdGlvbiBsaXN0IDYgKi8KKwkJcHJpbnRrKCIlczogc3dpdGNoaW5nIHRvIHBvcnQgJWNcbiIsIHBBQy0+ZGV2WzBdLT5uYW1lLAorCQkJJ0EnK1BhcmFtLlBhcmEzMlsxXSk7CisJY2FzZSBTS19EUlZfU1dJVENIX0lOVEVSTjogLyogU0tfVTMyIEZyb21Qb3J0SWR4IFNLX1UzMiBUb1BvcnRJZHggKi8KKwkJRnJvbVBvcnQgPSBQYXJhbS5QYXJhMzJbMF07CisJCVRvUG9ydCA9IFBhcmFtLlBhcmEzMlsxXTsKKwkJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VWRU5ULAorCQkJKCJQT1JUIFNXSVRDSCBFVkVOVCwgRnJvbTogJWQgIFRvOiAlZCAoUHJlZiAlZCkgIiwKKwkJCUZyb21Qb3J0LCBUb1BvcnQsIHBBQy0+UmxtdC5OZXRbMF0uUHJlZlBvcnQpKTsKKwkJTmV3UGFyYS5QYXJhNjQgPSBGcm9tUG9ydDsKKwkJU2tQbm1pRXZlbnQocEFDLCBJb0MsIFNLX1BOTUlfRVZUX1hNQUNfUkVTRVQsIE5ld1BhcmEpOworCQlOZXdQYXJhLlBhcmE2NCA9IFRvUG9ydDsKKwkJU2tQbm1pRXZlbnQocEFDLCBJb0MsIFNLX1BOTUlfRVZUX1hNQUNfUkVTRVQsIE5ld1BhcmEpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgKKwkJCSZwQUMtPlR4UG9ydFtGcm9tUG9ydF1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2ssCisJCQlGbGFncyk7CisJCXNwaW5fbG9jaygmcEFDLT5UeFBvcnRbVG9Qb3J0XVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jayk7CisJCVNrR2VTdG9wUG9ydChwQUMsIElvQywgRnJvbVBvcnQsIFNLX1NUT1BfQUxMLCBTS19TT0ZUX1JTVCk7CisJCVNrR2VTdG9wUG9ydChwQUMsIElvQywgVG9Qb3J0LCBTS19TVE9QX0FMTCwgU0tfU09GVF9SU1QpOworCQlzcGluX3VubG9jaygmcEFDLT5UeFBvcnRbVG9Qb3J0XVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCisJCQkmcEFDLT5UeFBvcnRbRnJvbVBvcnRdW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrLAorCQkJRmxhZ3MpOworCisJCVJlY2VpdmVJcnEocEFDLCAmcEFDLT5SeFBvcnRbRnJvbVBvcnRdLCBTS19GQUxTRSk7IC8qIGNsZWFycyByeCByaW5nICovCisJCVJlY2VpdmVJcnEocEFDLCAmcEFDLT5SeFBvcnRbVG9Qb3J0XSwgU0tfRkFMU0UpOyAvKiBjbGVhcnMgcnggcmluZyAqLworCQkKKwkJQ2xlYXJUeFJpbmcocEFDLCAmcEFDLT5UeFBvcnRbRnJvbVBvcnRdW1RYX1BSSU9fTE9XXSk7CisJCUNsZWFyVHhSaW5nKHBBQywgJnBBQy0+VHhQb3J0W1RvUG9ydF1bVFhfUFJJT19MT1ddKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoCisJCQkmcEFDLT5UeFBvcnRbRnJvbVBvcnRdW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrLAorCQkJRmxhZ3MpOworCQlzcGluX2xvY2soJnBBQy0+VHhQb3J0W1RvUG9ydF1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2spOworCQlwQUMtPkFjdGl2ZVBvcnQgPSBUb1BvcnQ7CisjaWYgMAorCQlTZXRRdWV1ZVNpemVzKHBBQyk7CisjZWxzZQorCQkvKiB0c2NoaWxsaW5nOiBOZXcgY29tbW9uIGZ1bmN0aW9uIHdpdGggbWluaW11bSBzaXplIGNoZWNrLiAqLworCQlEdWFsTmV0ID0gU0tfRkFMU0U7CisJCWlmIChwQUMtPlJsbXROZXRzID09IDIpIHsKKwkJCUR1YWxOZXQgPSBTS19UUlVFOworCQl9CisJCQorCQlpZiAoU2tHZUluaXRBc3NpZ25SYW1Ub1F1ZXVlcygKKwkJCXBBQywKKwkJCXBBQy0+QWN0aXZlUG9ydCwKKwkJCUR1YWxOZXQpKSB7CisJCQlzcGluX3VubG9jaygmcEFDLT5UeFBvcnRbVG9Qb3J0XVtUWF9QUklPX0xPV10uVHhEZXNSaW5nTG9jayk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAorCQkJCSZwQUMtPlR4UG9ydFtGcm9tUG9ydF1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2ssCisJCQkJRmxhZ3MpOworCQkJcHJpbnRrKCJTa0dlSW5pdEFzc2lnblJhbVRvUXVldWVzIGZhaWxlZC5cbiIpOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCQkvKiB0c2NoaWxsaW5nOiBIYW5kbGluZyBvZiByZXR1cm4gdmFsdWVzIGluc2VydGVkLiAqLworCQlpZiAoU2tHZUluaXRQb3J0KHBBQywgSW9DLCBGcm9tUG9ydCkgfHwKKwkJCVNrR2VJbml0UG9ydChwQUMsIElvQywgVG9Qb3J0KSkgeworCQkJcHJpbnRrKCIlczogU2tHZUluaXRQb3J0IGZhaWxlZC5cbiIsIHBBQy0+ZGV2WzBdLT5uYW1lKTsKKwkJfQorCQlpZiAoRXZlbnQgPT0gU0tfRFJWX1NXSVRDSF9TT0ZUKSB7CisJCQlTa01hY1J4VHhFbmFibGUocEFDLCBJb0MsIEZyb21Qb3J0KTsKKwkJfQorCQlTa01hY1J4VHhFbmFibGUocEFDLCBJb0MsIFRvUG9ydCk7CisJCVNrQWRkclN3YXAocEFDLCBJb0MsIEZyb21Qb3J0LCBUb1BvcnQpOworCQlTa0FkZHJNY1VwZGF0ZShwQUMsIElvQywgRnJvbVBvcnQpOworCQlTa0FkZHJNY1VwZGF0ZShwQUMsIElvQywgVG9Qb3J0KTsKKwkJUG9ydFJlSW5pdEJtdShwQUMsIEZyb21Qb3J0KTsKKwkJUG9ydFJlSW5pdEJtdShwQUMsIFRvUG9ydCk7CisJCVNrR2VQb2xsVHhEKHBBQywgSW9DLCBGcm9tUG9ydCwgU0tfVFJVRSk7CisJCVNrR2VQb2xsVHhEKHBBQywgSW9DLCBUb1BvcnQsIFNLX1RSVUUpOworCQlDbGVhckFuZFN0YXJ0UngocEFDLCBGcm9tUG9ydCk7CisJCUNsZWFyQW5kU3RhcnRSeChwQUMsIFRvUG9ydCk7CisJCXNwaW5fdW5sb2NrKCZwQUMtPlR4UG9ydFtUb1BvcnRdW1RYX1BSSU9fTE9XXS5UeERlc1JpbmdMb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKKwkJCSZwQUMtPlR4UG9ydFtGcm9tUG9ydF1bVFhfUFJJT19MT1ddLlR4RGVzUmluZ0xvY2ssCisJCQlGbGFncyk7CisJCWJyZWFrOworCWNhc2UgU0tfRFJWX1JMTVRfU0VORDoJIC8qIFNLX01CVUYgKnBNYiAqLworCQlTS19EQkdfTVNHKE5VTEwsIFNLX0RCR01PRF9EUlYsIFNLX0RCR0NBVF9EUlZfRVZFTlQsCisJCQkoIlJMUyAiKSk7CisJCXBSbG10TWJ1ZiA9IChTS19NQlVGKikgUGFyYW0ucFBhcmFQdHI7CisJCXBNc2cgPSAoc3RydWN0IHNrX2J1ZmYqKSBwUmxtdE1idWYtPnBPczsKKwkJc2tiX3B1dChwTXNnLCBwUmxtdE1idWYtPkxlbmd0aCk7CisJCWlmIChYbWl0RnJhbWUocEFDLCAmcEFDLT5UeFBvcnRbcFJsbXRNYnVmLT5Qb3J0SWR4XVtUWF9QUklPX0xPV10sCisJCQlwTXNnKSA8IDApCisKKwkJCURFVl9LRlJFRV9TS0JfQU5ZKHBNc2cpOworCQlicmVhazsKKwljYXNlIFNLX0RSVl9USU1FUjoKKwkJaWYgKFBhcmFtLlBhcmEzMlswXSA9PSBTS19EUlZfTU9ERVJBVElPTl9USU1FUikgeworCQkJLyoKKwkJCSoqIGV4cGlyYXRpb24gb2YgdGhlIG1vZGVyYXRpb24gdGltZXIgaW1wbGllcyB0aGF0CisJCQkqKiBkeW5hbWljIG1vZGVyYXRpb24gaXMgdG8gYmUgYXBwbGllZAorCQkJKi8KKwkJCVNrRGltU3RhcnRNb2RlcmF0aW9uVGltZXIocEFDKTsKKwkJCVNrRGltTW9kZXJhdGUocEFDKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQUMtPkR5bklycU1vZEluZm8uRGlzcGxheVN0YXRzKSB7CisJCQkgICAgU2tEaW1EaXNwbGF5TW9kZXJhdGlvblNldHRpbmdzKHBBQyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChQYXJhbS5QYXJhMzJbMF0gPT0gU0tfRFJWX1JYX0NMRUFOVVBfVElNRVIpIHsKKwkJCS8qCisJCQkqKiBjaGVjayBpZiB3ZSBuZWVkIHRvIGNoZWNrIGZvciBkZXNjcmlwdG9ycyB3aGljaAorCQkJKiogaGF2ZW4ndCBiZWVuIGhhbmRsZWQgdGhlIGxhc3QgbWlsbGlzZWNzCisJCQkqLworCQkJU3RhcnREcnZDbGVhbnVwVGltZXIocEFDKTsKKwkJCWlmIChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPT0gMikgeworCQkJCVJlY2VpdmVJcnEocEFDLCAmcEFDLT5SeFBvcnRbMV0sIFNLX0ZBTFNFKTsKKwkJCX0KKwkJCVJlY2VpdmVJcnEocEFDLCAmcEFDLT5SeFBvcnRbMF0sIFNLX0ZBTFNFKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50aygiRXhwaXJhdGlvbiBvZiB1bmtub3duIHRpbWVyXG4iKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJU0tfREJHX01TRyhOVUxMLCBTS19EQkdNT0RfRFJWLCBTS19EQkdDQVRfRFJWX0VWRU5ULAorCQkoIkVORCBFVkVOVCAiKSk7CisJCisJcmV0dXJuICgwKTsKK30gLyogU2tEcnZFdmVudCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrRXJyb3JMb2cgLSBsb2cgZXJyb3JzCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIGxvZ3MgZXJyb3JzIHRvIHRoZSBzeXN0ZW0gYnVmZmVyIGFuZCB0byB0aGUgY29uc29sZQorICoKKyAqIFJldHVybnM6CisgKgkwIGlmIGV2ZXJ5dGhpbmcgb2sKKyAqCTwgMCAgb24gZXJyb3IKKyAqCQorICovCit2b2lkIFNrRXJyb3JMb2coCitTS19BQwkqcEFDLAoraW50CUVyckNsYXNzLAoraW50CUVyck51bSwKK2NoYXIJKnBFcnJvck1zZykKK3sKK2NoYXIJQ2xhc3NTdHJbODBdOworCisJc3dpdGNoIChFcnJDbGFzcykgeworCWNhc2UgU0tfRVJSQ0xfT1RIRVI6CisJCXN0cmNweShDbGFzc1N0ciwgIk90aGVyIGVycm9yIik7CisJCWJyZWFrOworCWNhc2UgU0tfRVJSQ0xfQ09ORklHOgorCQlzdHJjcHkoQ2xhc3NTdHIsICJDb25maWd1cmF0aW9uIGVycm9yIik7CisJCWJyZWFrOworCWNhc2UgU0tfRVJSQ0xfSU5JVDoKKwkJc3RyY3B5KENsYXNzU3RyLCAiSW5pdGlhbGl6YXRpb24gZXJyb3IiKTsKKwkJYnJlYWs7CisJY2FzZSBTS19FUlJDTF9OT1JFUzoKKwkJc3RyY3B5KENsYXNzU3RyLCAiT3V0IG9mIHJlc291cmNlcyBlcnJvciIpOworCQlicmVhazsKKwljYXNlIFNLX0VSUkNMX1NXOgorCQlzdHJjcHkoQ2xhc3NTdHIsICJpbnRlcm5hbCBTb2Z0d2FyZSBlcnJvciIpOworCQlicmVhazsKKwljYXNlIFNLX0VSUkNMX0hXOgorCQlzdHJjcHkoQ2xhc3NTdHIsICJIYXJkd2FyZSBmYWlsdXJlIik7CisJCWJyZWFrOworCWNhc2UgU0tfRVJSQ0xfQ09NTToKKwkJc3RyY3B5KENsYXNzU3RyLCAiQ29tbXVuaWNhdGlvbiBlcnJvciIpOworCQlicmVhazsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IC0tIEVSUk9SIC0tXG4gICAgICAgIENsYXNzOiAgJXNcbiIKKwkJIiAgICAgICAgTnI6ICAweCV4XG4gICAgICAgIE1zZzogICVzXG4iLCBwQUMtPmRldlswXS0+bmFtZSwKKwkJQ2xhc3NTdHIsIEVyck51bSwgcEVycm9yTXNnKTsKKworfSAvKiBTa0Vycm9yTG9nICovCisKKyNpZmRlZiBTS19ESUFHX1NVUFBPUlQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tEcnZFbnRlckRpYWdNb2RlIC0gaGFuZGxlcyBESUFHIGF0dGFjaCByZXF1ZXN0CisgKgorICogRGVzY3JpcHRpb246CisgKglOb3RpZnkgdGhlIGtlcm5lbCB0byBOT1QgYWNjZXNzIHRoZSBjYXJkIGFueSBsb25nZXIgZHVlIHRvIERJQUcKKyAqCURlaW5pdGlhbGl6ZSB0aGUgQ2FyZAorICoKKyAqIFJldHVybnM6CisgKglpbnQKKyAqLworaW50IFNrRHJ2RW50ZXJEaWFnTW9kZSgKK1NLX0FDICAgKnBBYykgICAvKiBwb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworeworCURFVl9ORVQgKnBOZXQgPSBuZXRkZXZfcHJpdihwQWMtPmRldlswXSk7CisJU0tfQUMgICAqcEFDICA9IHBOZXQtPnBBQzsKKworCVNLX01FTUNQWSgmKHBBYy0+UG5taUJhY2t1cCksICYocEFjLT5Qbm1pU3RydWN0KSwgCisJCQlzaXplb2YoU0tfUE5NSV9TVFJVQ1RfREFUQSkpOworCisJcEFDLT5EaWFnTW9kZUFjdGl2ZSA9IERJQUdfQUNUSVZFOworCWlmIChwQUMtPkJvYXJkTGV2ZWwgPiBTS19JTklUX0RBVEEpIHsKKwkJaWYgKHBOZXQtPlVwKSB7CisJCQlwQUMtPldhc0lmVXBbMF0gPSBTS19UUlVFOworCQkJcEFDLT5EaWFnRmxvd0N0cmwgPSBTS19UUlVFOyAvKiBmb3IgU2tHZUNsb3NlICAgICAgKi8KKwkJCURvUHJpbnRJbnRlcmZhY2VDaGFuZ2UgPSBTS19GQUxTRTsKKwkJCVNrRHJ2RGVJbml0QWRhcHRlcihwQUMsIDApOyAgLyogcGVyZm9ybXMgU2tHZUNsb3NlICovCisJCX0gZWxzZSB7CisJCQlwQUMtPldhc0lmVXBbMF0gPSBTS19GQUxTRTsKKwkJfQorCQlpZiAocE5ldCAhPSBuZXRkZXZfcHJpdihwQUMtPmRldlsxXSkpIHsKKwkJCXBOZXQgPSBuZXRkZXZfcHJpdihwQUMtPmRldlsxXSk7CisJCQlpZiAocE5ldC0+VXApIHsKKwkJCQlwQUMtPldhc0lmVXBbMV0gPSBTS19UUlVFOworCQkJCXBBQy0+RGlhZ0Zsb3dDdHJsID0gU0tfVFJVRTsgLyogZm9yIFNrR2VDbG9zZSAqLworCQkJCURvUHJpbnRJbnRlcmZhY2VDaGFuZ2UgPSBTS19GQUxTRTsKKwkJCQlTa0RydkRlSW5pdEFkYXB0ZXIocEFDLCAxKTsgIC8qIGRvIFNrR2VDbG9zZSAgKi8KKwkJCX0gZWxzZSB7CisJCQkJcEFDLT5XYXNJZlVwWzFdID0gU0tfRkFMU0U7CisJCQl9CisJCX0KKwkJcEFDLT5Cb2FyZExldmVsID0gU0tfSU5JVF9EQVRBOworCX0KKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrRHJ2TGVhdmVEaWFnTW9kZSAtIGhhbmRsZXMgRElBRyBkZXRhY2ggcmVxdWVzdAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJTm90aWZ5IHRoZSBrZXJuZWwgdG8gbWF5IGFjY2VzcyB0aGUgY2FyZCBhZ2FpbiBhZnRlciB1c2UgYnkgRElBRworICoJSW5pdGlhbGl6ZSB0aGUgQ2FyZAorICoKKyAqIFJldHVybnM6CisgKiAJaW50CisgKi8KK2ludCBTa0RydkxlYXZlRGlhZ01vZGUoCitTS19BQyAgICpwQWMpICAgLyogcG9pbnRlciB0byBhZGFwdGVyIGNvbnRyb2wgY29udGV4dCAqLworeyAKKwlTS19NRU1DUFkoJihwQWMtPlBubWlTdHJ1Y3QpLCAmKHBBYy0+UG5taUJhY2t1cCksIAorCQkJc2l6ZW9mKFNLX1BOTUlfU1RSVUNUX0RBVEEpKTsKKwlwQWMtPkRpYWdNb2RlQWN0aXZlICAgID0gRElBR19OT1RBQ1RJVkU7CisJcEFjLT5Qbm1pLkRpYWdBdHRhY2hlZCA9IFNLX0RJQUdfSURMRTsKKyAgICAgICAgaWYgKHBBYy0+V2FzSWZVcFswXSA9PSBTS19UUlVFKSB7CisgICAgICAgICAgICAgICAgcEFjLT5EaWFnRmxvd0N0cmwgPSBTS19UUlVFOyAvKiBmb3IgU2tHZUNsb3NlICovCisJCURvUHJpbnRJbnRlcmZhY2VDaGFuZ2UgPSBTS19GQUxTRTsKKyAgICAgICAgICAgICAgICBTa0RydkluaXRBZGFwdGVyKHBBYywgMCk7ICAgIC8qIGZpcnN0IGRldmljZSAgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAocEFjLT5XYXNJZlVwWzFdID09IFNLX1RSVUUpIHsKKyAgICAgICAgICAgICAgICBwQWMtPkRpYWdGbG93Q3RybCA9IFNLX1RSVUU7IC8qIGZvciBTa0dlQ2xvc2UgKi8KKwkJRG9QcmludEludGVyZmFjZUNoYW5nZSA9IFNLX0ZBTFNFOworICAgICAgICAgICAgICAgIFNrRHJ2SW5pdEFkYXB0ZXIocEFjLCAxKTsgICAgLyogc2Vjb25kIGRldmljZSAqLworICAgICAgICB9CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglQYXJzZURldmljZU5ickZyb21TbG90TmFtZSAtIEV2YWx1YXRlIFBDSSBkZXZpY2UgbnVtYmVyCisgKgorICogRGVzY3JpcHRpb246CisgKiAJVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIFBDSSBzbG90IG5hbWUgaW5mb3JtYXRpb24gc3RyaW5nIGFuZCB3aWxsCisgKglyZXRyaWV2ZSB0aGUgZGV2Y2llIG51bWJlciBvdXQgb2YgaXQuIFRoZSBzbG90X25hbWUgbWFpbnRpYW5lZCBieQorICoJbGludXggaXMgaW4gdGhlIGZvcm0gb2YgJzAyOjBhLjAnLCB3aGVyZWFzIHRoZSBmaXJzdCB0d28gY2hhcmFjdGVycyAKKyAqCXJlcHJlc2VudCB0aGUgYnVzIG51bWJlciBpbiBoZXggKGluIHRoZSBzYW1wbGUgYWJvdmUgdGhpcyBpcyAKKyAqCXBjaSBidXMgMHgwMikgYW5kIHRoZSBuZXh0IHR3byBjaGFyYWN0ZXJzIHRoZSBkZXZpY2UgbnVtYmVyICgweDBhKS4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfVTMyOiBUaGUgZGV2aWNlIG51bWJlciBmcm9tIHRoZSBQQ0kgc2xvdCBuYW1lCisgKi8gCisKK3N0YXRpYyBTS19VMzIgUGFyc2VEZXZpY2VOYnJGcm9tU2xvdE5hbWUoCitjb25zdCBjaGFyICpTbG90TmFtZSkgICAvKiBwb2ludGVyIHRvIHBjaSBzbG90IG5hbWUgZWcuICcwMjowYS4wJyAqLworeworCWNoYXIJKkN1cnJDaGFyUG9zCT0gKGNoYXIgKikgU2xvdE5hbWU7CisJaW50CUZpcnN0TmliYmxlCT0gLTE7CisJaW50CVNlY29uZE5pYmJsZQk9IC0xOworCVNLX1UzMglSZXN1bHQJCT0gIDA7CisKKwl3aGlsZSAoKkN1cnJDaGFyUG9zICE9ICdcMCcpIHsKKwkJaWYgKCpDdXJyQ2hhclBvcyA9PSAnOicpIHsgCisJCQl3aGlsZSAoKkN1cnJDaGFyUG9zICE9ICcuJykgeworCQkJCUN1cnJDaGFyUG9zKys7ICAKKwkJCQlpZiAoCSgqQ3VyckNoYXJQb3MgPj0gJzAnKSAmJiAKKwkJCQkJKCpDdXJyQ2hhclBvcyA8PSAnOScpKSB7CisJCQkJCWlmIChGaXJzdE5pYmJsZSA9PSAtMSkgeworCQkJCQkJLyogZGVjLiB2YWx1ZSBmb3IgJzAnICovCisJCQkJCQlGaXJzdE5pYmJsZSA9ICpDdXJyQ2hhclBvcyAtIDQ4OworCQkJCQl9IGVsc2UgeworCQkJCQkJU2Vjb25kTmliYmxlID0gKkN1cnJDaGFyUG9zIC0gNDg7CisJCQkJCX0gIAorCQkJCX0gZWxzZSBpZiAoCSgqQ3VyckNoYXJQb3MgPj0gJ2EnKSAmJiAKKwkJCQkJCSgqQ3VyckNoYXJQb3MgPD0gJ2YnKSAgKSB7CisJCQkJCWlmIChGaXJzdE5pYmJsZSA9PSAtMSkgeworCQkJCQkJRmlyc3ROaWJibGUgPSAqQ3VyckNoYXJQb3MgLSA4NzsgCisJCQkJCX0gZWxzZSB7CisJCQkJCQlTZWNvbmROaWJibGUgPSAqQ3VyckNoYXJQb3MgLSA4NzsgCisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlSZXN1bHQgPSAwOworCQkJCX0KKwkJCX0KKworCQkJUmVzdWx0ID0gRmlyc3ROaWJibGU7CisJCQlSZXN1bHQgPSBSZXN1bHQgPDwgNDsgLyogZmlyc3QgbmliYmxlIGlzIGhpZ2hlciBvbmUgKi8KKwkJCVJlc3VsdCA9IFJlc3VsdCB8IFNlY29uZE5pYmJsZTsKKwkJfQorCQlDdXJyQ2hhclBvcysrOyAgIC8qIG5leHQgY2hhcmFjdGVyICovCisJfQorCXJldHVybiAoUmVzdWx0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0RydkRlSW5pdEFkYXB0ZXIgLSBkZWluaXRpYWxpemUgYWRhcHRlciAodGhpcyBmdW5jdGlvbiBpcyBvbmx5IAorICoJCQkJY2FsbGVkIGlmIERpYWcgYXR0YWNoZXMgdG8gdGhhdCBjYXJkKQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJQ2xvc2UgaW5pdGlhbGl6ZWQgYWRhcHRlci4KKyAqCisgKiBSZXR1cm5zOgorICoJMCAtIG9uIHN1Y2Nlc3MKKyAqCWVycm9yIGNvZGUgLSBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IFNrRHJ2RGVJbml0QWRhcHRlcigKK1NLX0FDICAgKnBBQywJCS8qIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICAgKi8KK2ludCAgICAgIGRldk5icikJLyogd2hhdCBkZXZpY2UgaXMgdG8gYmUgaGFuZGxlZCAqLworeworCXN0cnVjdCBTS19ORVRfREVWSUNFICpkZXY7CisKKwlkZXYgPSBwQUMtPmRldltkZXZOYnJdOworCisJLyogT24gTGludXggMi42IHRoZSBuZXR3b3JrIGRyaXZlciBkb2VzIE5PVCBtZXNzIHdpdGggcmVmZXJlbmNlCisJKiogY291bnRzLiAgVGhlIGRyaXZlciBNVVNUIGJlIGFibGUgdG8gYmUgdW5sb2FkZWQgYXQgYW55IHRpbWUKKwkqKiBkdWUgdG8gdGhlIHBvc3NpYmlsaXR5IG9mIGhvdHBsdWcuCisJKi8KKwlpZiAoU2tHZUNsb3NlKGRldikgIT0gMCkgeworCQlyZXR1cm4gKC0xKTsKKwl9CisJcmV0dXJuICgwKTsKKworfSAvKiBTa0RydkRlSW5pdEFkYXB0ZXIoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrRHJ2SW5pdEFkYXB0ZXIgLSBJbml0aWFsaXplIGFkYXB0ZXIgKHRoaXMgZnVuY3Rpb24gaXMgb25seSAKKyAqCQkJCWNhbGxlZCBpZiBEaWFnIGRlYXR0YWNoZXMgZnJvbSB0aGF0IGNhcmQpCisgKgorICogRGVzY3JpcHRpb246CisgKglDbG9zZSBpbml0aWFsaXplZCBhZGFwdGVyLgorICoKKyAqIFJldHVybnM6CisgKgkwIC0gb24gc3VjY2VzcworICoJZXJyb3IgY29kZSAtIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgU2tEcnZJbml0QWRhcHRlcigKK1NLX0FDICAgKnBBQywJCS8qIHBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICAgKi8KK2ludCAgICAgIGRldk5icikJLyogd2hhdCBkZXZpY2UgaXMgdG8gYmUgaGFuZGxlZCAqLworeworCXN0cnVjdCBTS19ORVRfREVWSUNFICpkZXY7CisKKwlkZXYgPSBwQUMtPmRldltkZXZOYnJdOworCisJaWYgKFNrR2VPcGVuKGRldikgIT0gMCkgeworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwkvKgorCSoqIFVzZSBjb3JyZWN0IE1UVSBzaXplIGFuZCBpbmRpY2F0ZSB0byBrZXJuZWwgVFggcXVldWUgY2FuIGJlIHN0YXJ0ZWQKKwkqLyAKKwlpZiAoU2tHZUNoYW5nZU10dShkZXYsIGRldi0+bXR1KSAhPSAwKSB7CisJCXJldHVybiAoLTEpOworCX0gCisJcmV0dXJuICgwKTsKKworfSAvKiBTa0RydkluaXRBZGFwdGVyICovCisKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogImRlYnVnIG9ubHkiIHNlY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglEdW1wTXNnIC0gcHJpbnQgYSBmcmFtZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBwcmludHMgZnJhbWVzIHRvIHRoZSBzeXN0ZW0gbG9nZmlsZS90byB0aGUgY29uc29sZS4KKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqCQorICovCitzdGF0aWMgdm9pZCBEdW1wTXNnKHN0cnVjdCBza19idWZmICpza2IsIGNoYXIgKnN0cikKK3sKKwlpbnQJbXNnbGVuOworCisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCXByaW50aygiRHVtcE1zZygpOiBOVUxMLU1lc3NhZ2VcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHNrYi0+ZGF0YSA9PSBOVUxMKSB7CisJCXByaW50aygiRHVtcE1zZygpOiBNZXNzYWdlIGVtcHR5XG4iKTsKKwkJcmV0dXJuOworCX0KKworCW1zZ2xlbiA9IHNrYi0+bGVuOworCWlmIChtc2dsZW4gPiA2NCkKKwkJbXNnbGVuID0gNjQ7CisKKwlwcmludGsoIi0tLSBCZWdpbiBvZiBtZXNzYWdlIGZyb20gJXMgLCBsZW4gJWQgKGZyb20gJWQpIC0tLS1cbiIsIHN0ciwgbXNnbGVuLCBza2ItPmxlbik7CisKKwlEdW1wRGF0YSgoY2hhciAqKXNrYi0+ZGF0YSwgbXNnbGVuKTsKKworCXByaW50aygiLS0tLS0tLSBFbmQgb2YgbWVzc2FnZSAtLS0tLS0tLS1cbiIpOworfSAvKiBEdW1wTXNnICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglEdW1wRGF0YSAtIHByaW50IGEgZGF0YSBhcmVhCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIHByaW50cyBhIGFyZWEgb2YgZGF0YSB0byB0aGUgc3lzdGVtIGxvZ2ZpbGUvdG8gdGhlCisgKgljb25zb2xlLgorICoKKyAqIFJldHVybnM6IE4vQQorICoJCisgKi8KK3N0YXRpYyB2b2lkIER1bXBEYXRhKGNoYXIgKnAsIGludCBzaXplKQoreworcmVnaXN0ZXIgaW50ICAgIGk7CitpbnQJaGFkZHIsIGFkZHI7CitjaGFyCWhleF9idWZmZXJbMTgwXTsKK2NoYXIJYXNjX2J1ZmZlclsxODBdOworY2hhcglIRVhDSEFSW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisKKwlhZGRyID0gMDsKKwloYWRkciA9IDA7CisJaGV4X2J1ZmZlclswXSA9IDA7CisJYXNjX2J1ZmZlclswXSA9IDA7CisJZm9yIChpPTA7IGkgPCBzaXplOyApIHsKKwkJaWYgKCpwID49ICcwJyAmJiAqcCA8PSd6JykKKwkJCWFzY19idWZmZXJbYWRkcl0gPSAqcDsKKwkJZWxzZQorCQkJYXNjX2J1ZmZlclthZGRyXSA9ICcuJzsKKwkJYWRkcisrOworCQlhc2NfYnVmZmVyW2FkZHJdID0gMDsKKwkJaGV4X2J1ZmZlcltoYWRkcl0gPSBIRVhDSEFSWygqcCAmIDB4ZjApID4+IDRdOworCQloYWRkcisrOworCQloZXhfYnVmZmVyW2hhZGRyXSA9IEhFWENIQVJbKnAgJiAweDBmXTsKKwkJaGFkZHIrKzsKKwkJaGV4X2J1ZmZlcltoYWRkcl0gPSAnICc7CisJCWhhZGRyKys7CisJCWhleF9idWZmZXJbaGFkZHJdID0gMDsKKwkJcCsrOworCQlpKys7CisJCWlmIChpJTE2ID09IDApIHsKKwkJCXByaW50aygiJXMgICVzXG4iLCBoZXhfYnVmZmVyLCBhc2NfYnVmZmVyKTsKKwkJCWFkZHIgPSAwOworCQkJaGFkZHIgPSAwOworCQl9CisJfQorfSAvKiBEdW1wRGF0YSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCUR1bXBMb25nIC0gcHJpbnQgYSBkYXRhIGFyZWEgYXMgbG9uZyB2YWx1ZXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gcHJpbnRzIGEgYXJlYSBvZiBkYXRhIHRvIHRoZSBzeXN0ZW0gbG9nZmlsZS90byB0aGUKKyAqCWNvbnNvbGUuCisgKgorICogUmV0dXJuczogTi9BCisgKgkKKyAqLworc3RhdGljIHZvaWQgRHVtcExvbmcoY2hhciAqcGMsIGludCBzaXplKQoreworcmVnaXN0ZXIgaW50ICAgIGk7CitpbnQJaGFkZHIsIGFkZHI7CitjaGFyCWhleF9idWZmZXJbMTgwXTsKK2NoYXIJYXNjX2J1ZmZlclsxODBdOworY2hhcglIRVhDSEFSW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7Citsb25nCSpwOworaW50CWw7CisKKwlhZGRyID0gMDsKKwloYWRkciA9IDA7CisJaGV4X2J1ZmZlclswXSA9IDA7CisJYXNjX2J1ZmZlclswXSA9IDA7CisJcCA9IChsb25nKikgcGM7CisJZm9yIChpPTA7IGkgPCBzaXplOyApIHsKKwkJbCA9IChsb25nKSAqcDsKKwkJaGV4X2J1ZmZlcltoYWRkcl0gPSBIRVhDSEFSWyhsID4+IDI4KSAmIDB4Zl07CisJCWhhZGRyKys7CisJCWhleF9idWZmZXJbaGFkZHJdID0gSEVYQ0hBUlsobCA+PiAyNCkgJiAweGZdOworCQloYWRkcisrOworCQloZXhfYnVmZmVyW2hhZGRyXSA9IEhFWENIQVJbKGwgPj4gMjApICYgMHhmXTsKKwkJaGFkZHIrKzsKKwkJaGV4X2J1ZmZlcltoYWRkcl0gPSBIRVhDSEFSWyhsID4+IDE2KSAmIDB4Zl07CisJCWhhZGRyKys7CisJCWhleF9idWZmZXJbaGFkZHJdID0gSEVYQ0hBUlsobCA+PiAxMikgJiAweGZdOworCQloYWRkcisrOworCQloZXhfYnVmZmVyW2hhZGRyXSA9IEhFWENIQVJbKGwgPj4gOCkgJiAweGZdOworCQloYWRkcisrOworCQloZXhfYnVmZmVyW2hhZGRyXSA9IEhFWENIQVJbKGwgPj4gNCkgJiAweGZdOworCQloYWRkcisrOworCQloZXhfYnVmZmVyW2hhZGRyXSA9IEhFWENIQVJbbCAmIDB4MGZdOworCQloYWRkcisrOworCQloZXhfYnVmZmVyW2hhZGRyXSA9ICcgJzsKKwkJaGFkZHIrKzsKKwkJaGV4X2J1ZmZlcltoYWRkcl0gPSAwOworCQlwKys7CisJCWkrKzsKKwkJaWYgKGklOCA9PSAwKSB7CisJCQlwcmludGsoIiU0eCAlc1xuIiwgKGktOCkqNCwgaGV4X2J1ZmZlcik7CisJCQloYWRkciA9IDA7CisJCX0KKwl9CisJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworfSAvKiBEdW1wTG9uZyAqLworCisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmluaXQgc2tnZV9wcm9iZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJU0tfQUMJCQkqcEFDOworCURFVl9ORVQJCQkqcE5ldCA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldiA9IE5VTEw7CisJc3RhdGljIGludCBib2FyZHNfZm91bmQgPSAwOworCWludCBlcnJvciA9IC1FTk9ERVY7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCWdvdG8gb3V0OworIAorCS8qIENvbmZpZ3VyZSBETUEgYXR0cmlidXRlcy4gKi8KKwlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCAodTY0KSAweGZmZmZmZmZmZmZmZmZmZmZVTEwpICYmCisJICAgIHBjaV9zZXRfZG1hX21hc2socGRldiwgKHU2NCkgMHhmZmZmZmZmZikpCisJCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOworCisKKwlpZiAoKGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihERVZfTkVUKSkpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgZXRoZXJkZXYgIgorCQkgICAgICAgInN0cnVjdHVyZSFcbiIpOworCQlnb3RvIG91dF9kaXNhYmxlX2RldmljZTsKKwl9CisKKwlwTmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwTmV0LT5wQUMgPSBrbWFsbG9jKHNpemVvZihTS19BQyksIEdGUF9LRVJORUwpOworCWlmICghcE5ldC0+cEFDKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGFsbG9jYXRlIGFkYXB0ZXIgIgorCQkgICAgICAgInN0cnVjdHVyZSFcbiIpOworCQlnb3RvIG91dF9mcmVlX25ldGRldjsKKwl9CisKKwltZW1zZXQocE5ldC0+cEFDLCAwLCBzaXplb2YoU0tfQUMpKTsKKwlwQUMgPSBwTmV0LT5wQUM7CisJcEFDLT5QY2lEZXYgPSBwZGV2OworCXBBQy0+UGNpRGV2SWQgPSBwZGV2LT5kZXZpY2U7CisJcEFDLT5kZXZbMF0gPSBkZXY7CisJcEFDLT5kZXZbMV0gPSBkZXY7CisJc3ByaW50ZihwQUMtPk5hbWUsICJTeXNLb25uZWN0IFNLLTk4eHgiKTsKKwlwQUMtPkNoZWNrUXVldWUgPSBTS19GQUxTRTsKKworCXBOZXQtPk10dSA9IDE1MDA7CisJcE5ldC0+VXAgPSAwOworCWRldi0+aXJxID0gcGRldi0+aXJxOworCWVycm9yID0gU2tHZUluaXRQQ0kocEFDKTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKCJTS0dFOiBQQ0kgc2V0dXAgZmFpbGVkOiAlaVxuIiwgZXJyb3IpOworCQlnb3RvIG91dF9mcmVlX25ldGRldjsKKwl9CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJZGV2LT5vcGVuID0JCSZTa0dlT3BlbjsKKwlkZXYtPnN0b3AgPQkJJlNrR2VDbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9CSZTa0dlWG1pdDsKKwlkZXYtPmdldF9zdGF0cyA9CSZTa0dlU3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmU2tHZVNldFJ4TW9kZTsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9CSZTa0dlU2V0TWFjQWRkcjsKKwlkZXYtPmRvX2lvY3RsID0JCSZTa0dlSW9jdGw7CisJZGV2LT5jaGFuZ2VfbXR1ID0JJlNrR2VDaGFuZ2VNdHU7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9CSZTa0dlUG9sbENvbnRyb2xsZXI7CisjZW5kaWYKKwlkZXYtPmZsYWdzICY9IAkJfklGRl9SVU5OSU5HOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisJU0VUX0VUSFRPT0xfT1BTKGRldiwgJlNrR2VFdGh0b29sT3BzKTsKKworI2lmZGVmIFNLX1pFUk9DT1BZCisjaWZkZWYgVVNFX1NLX1RYX0NIRUNLU1VNCisJaWYgKHBBQy0+Q2hpcHNldFR5cGUpIHsKKwkJLyogVXNlIG9ubHkgaWYgeXVrb24gaGFyZHdhcmUgKi8KKwkJLyogU0sgYW5kIFpFUk9DT1BZIC0gZmx5IGJhYnkuLi4gKi8KKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNOworCX0KKyNlbmRpZgorI2VuZGlmCisKKwlwQUMtPkluZGV4ID0gYm9hcmRzX2ZvdW5kKys7CisKKwlpZiAoU2tHZUJvYXJkSW5pdChkZXYsIHBBQykpCisJCWdvdG8gb3V0X2ZyZWVfbmV0ZGV2OworCisJLyogUmVnaXN0ZXIgbmV0IGRldmljZSAqLworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNLR0U6IENvdWxkIG5vdCByZWdpc3RlciBkZXZpY2UuXG4iKTsKKwkJZ290byBvdXRfZnJlZV9yZXNvdXJjZXM7CisJfQorCisJLyogUHJpbnQgYWRhcHRlciBzcGVjaWZpYyBzdHJpbmcgZnJvbSB2cGQgKi8KKwlQcm9kdWN0U3RyKHBBQyk7CisJcHJpbnRrKCIlczogJXNcbiIsIGRldi0+bmFtZSwgcEFDLT5EZXZpY2VTdHIpOworCisJLyogUHJpbnQgY29uZmlndXJhdGlvbiBzZXR0aW5ncyAqLworCXByaW50aygiICAgICAgUHJlZlBvcnQ6JWMgIFJsbXRNb2RlOiVzXG4iLAorCQknQScgKyBwQUMtPlJsbXQuTmV0WzBdLlBvcnRbcEFDLT5SbG10Lk5ldFswXS5QcmVmUG9ydF0tPlBvcnROdW1iZXIsCisJCShwQUMtPlJsbXRNb2RlPT0wKSAgPyAiQ2hlY2sgTGluayBTdGF0ZSIgOgorCQkoKHBBQy0+UmxtdE1vZGU9PTEpID8gIkNoZWNrIExpbmsgU3RhdGUiIDoKKwkJKChwQUMtPlJsbXRNb2RlPT0zKSA/ICJDaGVjayBMb2NhbCBQb3J0IiA6CisJCSgocEFDLT5SbG10TW9kZT09NykgPyAiQ2hlY2sgU2VnbWVudGF0aW9uIiA6CisJCSgocEFDLT5SbG10TW9kZT09MTcpID8gIkR1YWwgQ2hlY2sgTGluayBTdGF0ZSIgOiJFcnJvciIpKSkpKTsKKworCVNrR2VZZWxsb3dMRUQocEFDLCBwQUMtPklvQmFzZSwgMSk7CisKKworCW1lbWNweSgmZGV2LT5kZXZfYWRkciwgJnBBQy0+QWRkci5OZXRbMF0uQ3VycmVudE1hY0FkZHJlc3MsIDYpOworCisJU2tHZVByb2NDcmVhdGUoZGV2KTsKKworCXBOZXQtPlBvcnROciA9IDA7CisJcE5ldC0+TmV0TnIgID0gMDsKKworCWJvYXJkc19mb3VuZCsrOworCisJLyogTW9yZSB0aGVuIG9uZSBwb3J0IGZvdW5kICovCisJaWYgKChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPT0gMiApICYmIChwQUMtPlJsbXROZXRzID09IDIpKSB7CisJCWlmICgoZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKERFVl9ORVQpKSkgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgZXRoZXJkZXYgIgorCQkJCSJzdHJ1Y3R1cmUhXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcEFDLT5kZXZbMV0gICA9IGRldjsKKwkJcE5ldCAgICAgICAgICA9IG5ldGRldl9wcml2KGRldik7CisJCXBOZXQtPlBvcnROciAgPSAxOworCQlwTmV0LT5OZXROciAgID0gMTsKKwkJcE5ldC0+cEFDICAgICA9IHBBQzsKKwkJcE5ldC0+TXR1ICAgICA9IDE1MDA7CisJCXBOZXQtPlVwICAgICAgPSAwOworCisJCWRldi0+b3BlbiAgICAgICAgICAgICAgID0gJlNrR2VPcGVuOworCQlkZXYtPnN0b3AgICAgICAgICAgICAgICA9ICZTa0dlQ2xvc2U7CisJCWRldi0+aGFyZF9zdGFydF94bWl0ICAgID0gJlNrR2VYbWl0OworCQlkZXYtPmdldF9zdGF0cyAgICAgICAgICA9ICZTa0dlU3RhdHM7CisJCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJlNrR2VTZXRSeE1vZGU7CisJCWRldi0+c2V0X21hY19hZGRyZXNzICAgID0gJlNrR2VTZXRNYWNBZGRyOworCQlkZXYtPmRvX2lvY3RsICAgICAgICAgICA9ICZTa0dlSW9jdGw7CisJCWRldi0+Y2hhbmdlX210dSAgICAgICAgID0gJlNrR2VDaGFuZ2VNdHU7CisJCWRldi0+ZmxhZ3MgICAgICAgICAgICAgJj0gfklGRl9SVU5OSU5HOworCQlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCQlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmU2tHZUV0aHRvb2xPcHMpOworCisjaWZkZWYgU0tfWkVST0NPUFkKKyNpZmRlZiBVU0VfU0tfVFhfQ0hFQ0tTVU0KKwkJaWYgKHBBQy0+Q2hpcHNldFR5cGUpIHsKKwkJCS8qIFNHIGFuZCBaRVJPQ09QWSAtIGZseSBiYWJ5Li4uICovCisJCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0lQX0NTVU07CisJCX0KKyNlbmRpZgorI2VuZGlmCisKKwkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlNLR0U6IENvdWxkIG5vdCByZWdpc3RlciBkZXZpY2UuXG4iKTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQlwQUMtPmRldlsxXSA9IHBBQy0+ZGV2WzBdOworCQl9IGVsc2UgeworCQkJU2tHZVByb2NDcmVhdGUoZGV2KTsKKwkJCW1lbWNweSgmZGV2LT5kZXZfYWRkciwKKwkJCQkJJnBBQy0+QWRkci5OZXRbMV0uQ3VycmVudE1hY0FkZHJlc3MsIDYpOworCQorCQkJcHJpbnRrKCIlczogJXNcbiIsIGRldi0+bmFtZSwgcEFDLT5EZXZpY2VTdHIpOworCQkJcHJpbnRrKCIgICAgICBQcmVmUG9ydDpCICBSbG10TW9kZTpEdWFsIENoZWNrIExpbmsgU3RhdGVcbiIpOworCQl9CisJfQorCisJLyogU2F2ZSB0aGUgaGFyZHdhcmUgcmV2aXNpb24gKi8KKwlwQUMtPkhXUmV2aXNpb24gPSAoKChwQUMtPkdJbmkuR0lQY2lId1JldiA+PiA0KSAmIDB4MEYpKjEwKSArCisJCShwQUMtPkdJbmkuR0lQY2lId1JldiAmIDB4MEYpOworCisJLyogU2V0IGRyaXZlciBnbG9iYWxzICovCisJcEFDLT5Qbm1pLnBEcml2ZXJGaWxlTmFtZSAgICA9IERSSVZFUl9GSUxFX05BTUU7CisJcEFDLT5Qbm1pLnBEcml2ZXJSZWxlYXNlRGF0ZSA9IERSSVZFUl9SRUxfREFURTsKKworCW1lbXNldCgmcEFDLT5Qbm1pQmFja3VwLCAwLCBzaXplb2YoU0tfUE5NSV9TVFJVQ1RfREFUQSkpOworCW1lbWNweSgmcEFDLT5Qbm1pQmFja3VwLCAmcEFDLT5Qbm1pU3RydWN0LCBzaXplb2YoU0tfUE5NSV9TVFJVQ1RfREFUQSkpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJcmV0dXJuIDA7CisKKyBvdXRfZnJlZV9yZXNvdXJjZXM6CisJRnJlZVJlc291cmNlcyhkZXYpOworIG91dF9mcmVlX25ldGRldjoKKwlmcmVlX25ldGRldihkZXYpOworIG91dF9kaXNhYmxlX2RldmljZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cisgb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHNrZ2VfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCURFVl9ORVQgKnBOZXQgPSBuZXRkZXZfcHJpdihkZXYpOworCVNLX0FDICpwQUMgPSBwTmV0LT5wQUM7CisJc3RydWN0IG5ldF9kZXZpY2UgKm90aGVyZGV2ID0gcEFDLT5kZXZbMV07CisKKwlTa0dlUHJvY1JlbW92ZShkZXYpOworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKG90aGVyZGV2ICE9IGRldikKKwkJU2tHZVByb2NSZW1vdmUob3RoZXJkZXYpOworCisJU2tHZVllbGxvd0xFRChwQUMsIHBBQy0+SW9CYXNlLCAwKTsKKworCWlmIChwQUMtPkJvYXJkTGV2ZWwgPT0gU0tfSU5JVF9SVU4pIHsKKwkJU0tfRVZQQVJBIEV2UGFyYTsKKwkJdW5zaWduZWQgbG9uZyBGbGFnczsKKworCQkvKiBib2FyZCBpcyBzdGlsbCBhbGl2ZSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwkJRXZQYXJhLlBhcmEzMlswXSA9IDA7CisJCUV2UGFyYS5QYXJhMzJbMV0gPSAtMTsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX1NUT1AsIEV2UGFyYSk7CisJCUV2UGFyYS5QYXJhMzJbMF0gPSAxOworCQlFdlBhcmEuUGFyYTMyWzFdID0gLTE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9TVE9QLCBFdlBhcmEpOworCQlTa0V2ZW50RGlzcGF0Y2hlcihwQUMsIHBBQy0+SW9CYXNlKTsKKwkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJCVNLX09VVDMyKHBBQy0+SW9CYXNlLCBCMF9JTVNLLCAwKTsKKwkJU2tHZURlSW5pdChwQUMsIHBBQy0+SW9CYXNlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcEFDLT5TbG93UGF0aExvY2ssIEZsYWdzKTsKKwkJcEFDLT5Cb2FyZExldmVsID0gU0tfSU5JVF9EQVRBOworCQkvKiBXZSBkbyBOT1QgY2hlY2sgaGVyZSwgaWYgSVJRIHdhcyBwZW5kaW5nLCBvZiBjb3Vyc2UqLworCX0KKworCWlmIChwQUMtPkJvYXJkTGV2ZWwgPT0gU0tfSU5JVF9JTykgeworCQkvKiBib2FyZCBpcyBzdGlsbCBhbGl2ZSAqLworCQlTa0dlRGVJbml0KHBBQywgcEFDLT5Jb0Jhc2UpOworCQlwQUMtPkJvYXJkTGV2ZWwgPSBTS19JTklUX0RBVEE7CisJfQorCisJRnJlZVJlc291cmNlcyhkZXYpOworCWZyZWVfbmV0ZGV2KGRldik7CisJaWYgKG90aGVyZGV2ICE9IGRldikKKwkJZnJlZV9uZXRkZXYob3RoZXJkZXYpOworCWtmcmVlKHBBQyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBza2dlX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgMHgxNzAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIDB4ODBlYiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9TWVNLT05ORUNULCAweDQzMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfU1lTS09OTkVDVCwgMHg0MzIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0RMSU5LLCAweDRjMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisjaWYgMAkvKiBkb24ndCBoYW5kbGUgWXVrb24yIGNhcmRzIGF0IHRoZSBtb21lbnQgLS0gbWxpbmRuZXJAc3lza29ubmVjdC5kZSAqLworCXsgUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzNjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzYxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisjZW5kaWYKKwl7IFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg1MDA1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0NORVQsIDB4NDM0ZSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9MSU5LU1lTLCAweDEwMzIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfTElOS1NZUywgMHgxMDY0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc2tnZV9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNrZ2VfZHJpdmVyID0geworCS5uYW1lCQk9ICJzazk4bGluIiwKKwkuaWRfdGFibGUJPSBza2dlX3BjaV90YmwsCisJLnByb2JlCQk9IHNrZ2VfcHJvYmVfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2tnZV9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNrZ2VfaW5pdCh2b2lkKQoreworCWludCBlcnJvcjsKKworCXBTa1Jvb3REaXIgPSBwcm9jX21rZGlyKFNLUm9vdE5hbWUsIHByb2NfbmV0KTsKKwlpZiAocFNrUm9vdERpcikgCisJCXBTa1Jvb3REaXItPm93bmVyID0gVEhJU19NT0RVTEU7CisJCisJZXJyb3IgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZza2dlX2RyaXZlcik7CisJaWYgKGVycm9yKQorCQlwcm9jX25ldF9yZW1vdmUoU0tSb290TmFtZSk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2tnZV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZza2dlX2RyaXZlcik7CisJcHJvY19uZXRfcmVtb3ZlKFNLUm9vdE5hbWUpOworCit9CisKK21vZHVsZV9pbml0KHNrZ2VfaW5pdCk7Cittb2R1bGVfZXhpdChza2dlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlaHd0LmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2Vod3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjY3MDk5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlaHd0LmMKQEAgLTAsMCArMSwxNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2dlaHd0LmMKKyAqIFByb2plY3Q6CUdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcnMsIEV2ZW50IFNjaGVkdWxlciBNb2R1bGUKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4xNSAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wOS8xNiAxMzo0MToyMyAkCisgKiBQdXJwb3NlOglIYXJkd2FyZSBUaW1lcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglFdmVudCBxdWV1ZSBhbmQgZGlzcGF0Y2hlcgorICovCisjaWYgKGRlZmluZWQoREVCVUcpIHx8ICgoIWRlZmluZWQoTElOVCkpICYmICghZGVmaW5lZChTS19TTElNKSkpKQorc3RhdGljIGNvbnN0IGNoYXIgU3lzS29ubmVjdEZpbGVJZFtdID0KKwkiQCgjKSAkSWQ6IHNrZ2Vod3QuYyx2IDEuMTUgMjAwMy8wOS8xNiAxMzo0MToyMyByc2NobWlkdCBFeHAgJCAoQykgTWFydmVsbC4iOworI2VuZGlmCisKKyNpbmNsdWRlICJoL3NrZHJ2MXN0LmgiCQkvKiBEcml2ZXIgU3BlY2lmaWMgRGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJoL3NrZHJ2Mm5kLmgiCQkvKiBBZGFwdGVyIENvbnRyb2wtIGFuZCBEcml2ZXIgc3BlY2lmaWMgRGVmLiAqLworCisjaWZkZWYgX19DMk1BTl9fCisvKgorICogICBIYXJkd2FyZSBUaW1lciBmdW5jdGlvbiBxdWV1ZSBtYW5hZ2VtZW50LgorICovCitpbnRybygpCit7fQorI2VuZGlmCisKKy8qCisgKiBQcm90b3R5cGVzIG9mIGxvY2FsIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlTS19IV1RfTUFYCSg2NTAwMCkKKworLyogY29ycmVjdGlvbiBmYWN0b3IgKi8KKyNkZWZpbmUJU0tfSFdUX0ZBQwkoMTAwMCAqIChTS19VMzIpcEFDLT5HSW5pLkdJSHN0Q2xrRmFjdCAvIDEwMCkKKworLyoKKyAqIEluaXRpYWxpemUgaGFyZHdhcmUgdGltZXIuCisgKgorICogTXVzdCBiZSBjYWxsZWQgZHVyaW5nIGluaXQgbGV2ZWwgMS4KKyAqLwordm9pZAlTa0h3dEluaXQoCitTS19BQwkqcEFDLAkvKiBBZGFwdGVycyBjb250ZXh0ICovCitTS19JT0MJSW9jKQkvKiBJb0NvbnRleHQgKi8KK3sKKwlwQUMtPkh3dC5UU3RhcnQgPSAwIDsKKwlwQUMtPkh3dC5UU3RvcAk9IDAgOworCXBBQy0+SHd0LlRBY3RpdmUgPSBTS19GQUxTRTsKKworCVNrSHd0U3RvcChwQUMsIElvYyk7Cit9CisKKy8qCisgKgorICogU3RhcnQgaGFyZHdhcmUgdGltZXIgKGNsb2NrIHRpY2tzIGFyZSAxNnVzKS4KKyAqCisgKi8KK3ZvaWQJU2tId3RTdGFydCgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXJzIGNvbnRleHQgKi8KK1NLX0lPQwlJb2MsCS8qIElvQ29udGV4dCAqLworU0tfVTMyCVRpbWUpCS8qIFRpbWUgaW4gdW5pdHMgb2YgMTZ1cyB0byBsb2FkIHRoZSB0aW1lciB3aXRoLiAqLworeworCVNLX1UzMglDbnQ7CisKKwlpZiAoVGltZSA+IFNLX0hXVF9NQVgpCisJCVRpbWUgPSBTS19IV1RfTUFYOworCisJcEFDLT5Id3QuVFN0YXJ0ID0gVGltZTsKKwlwQUMtPkh3dC5UU3RvcCA9IDBMOworCisJQ250ID0gVGltZTsKKworCS8qCisJICogaWYgdGltZSA8IDE2IHVzCisJICoJdGltZSA9IDE2IHVzCisJICovCisJaWYgKCFDbnQpIHsKKwkJQ250Kys7CisJfQorCisJU0tfT1VUMzIoSW9jLCBCMl9USV9JTkksIENudCAqIFNLX0hXVF9GQUMpOworCQorCVNLX09VVDE2KElvYywgQjJfVElfQ1RSTCwgVElNX1NUQVJUKTsJLyogU3RhcnQgdGltZXIuICovCisKKwlwQUMtPkh3dC5UQWN0aXZlID0gU0tfVFJVRTsKK30KKworLyoKKyAqIFN0b3AgaGFyZHdhcmUgdGltZXIuCisgKiBhbmQgY2xlYXIgdGhlIHRpbWVyIElSUQorICovCit2b2lkCVNrSHd0U3RvcCgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXJzIGNvbnRleHQgKi8KK1NLX0lPQwlJb2MpCS8qIElvQ29udGV4dCAqLworeworCVNLX09VVDE2KElvYywgQjJfVElfQ1RSTCwgVElNX1NUT1ApOworCQorCVNLX09VVDE2KElvYywgQjJfVElfQ1RSTCwgVElNX0NMUl9JUlEpOworCisJcEFDLT5Id3QuVEFjdGl2ZSA9IFNLX0ZBTFNFOworfQorCisKKy8qCisgKglTdG9wIGhhcmR3YXJlIHRpbWVyIGFuZCByZWFkIHRpbWUgZWxhcHNlZCBzaW5jZSBsYXN0IHN0YXJ0LgorICoKKyAqIHJldHVybnMKKyAqCVRoZSBlbGFwc2VkIHRpbWUgc2luY2UgbGFzdCBzdGFydCBpbiB1bml0cyBvZiAxNnVzLgorICoKKyAqLworU0tfVTMyCVNrSHd0UmVhZCgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXJzIGNvbnRleHQgKi8KK1NLX0lPQwlJb2MpCS8qIElvQ29udGV4dCAqLworeworCVNLX1UzMglUUmVhZDsKKwlTS19VMzIJSVN0YXR1czsKKworCWlmIChwQUMtPkh3dC5UQWN0aXZlKSB7CisJCQorCQlTa0h3dFN0b3AocEFDLCBJb2MpOworCisJCVNLX0lOMzIoSW9jLCBCMl9USV9WQUwsICZUUmVhZCk7CisJCVRSZWFkIC89IFNLX0hXVF9GQUM7CisKKwkJU0tfSU4zMihJb2MsIEIwX0lTUkMsICZJU3RhdHVzKTsKKworCQkvKiBDaGVjayBpZiB0aW1lciBleHBpcmVkIChvciB3cmFwZWQgYXJvdW5kKSAqLworCQlpZiAoKFRSZWFkID4gcEFDLT5Id3QuVFN0YXJ0KSB8fCAoSVN0YXR1cyAmIElTX1RJTUlOVCkpIHsKKwkJCQorCQkJU2tId3RTdG9wKHBBQywgSW9jKTsKKwkJCQorCQkJcEFDLT5Id3QuVFN0b3AgPSBwQUMtPkh3dC5UU3RhcnQ7CisJCX0KKwkJZWxzZSB7CisJCQkKKwkJCXBBQy0+SHd0LlRTdG9wID0gcEFDLT5Id3QuVFN0YXJ0IC0gVFJlYWQ7CisJCX0KKwl9CisJcmV0dXJuKHBBQy0+SHd0LlRTdG9wKTsKK30KKworLyoKKyAqIGludGVycnVwdCBzb3VyY2U9IHRpbWVyCisgKi8KK3ZvaWQJU2tId3RJc3IoCitTS19BQwkqcEFDLAkvKiBBZGFwdGVycyBjb250ZXh0ICovCitTS19JT0MJSW9jKQkvKiBJb0NvbnRleHQgKi8KK3sKKwlTa0h3dFN0b3AocEFDLCBJb2MpOworCQorCXBBQy0+SHd0LlRTdG9wID0gcEFDLT5Id3QuVFN0YXJ0OworCQorCVNrVGltZXJEb25lKHBBQywgSW9jKTsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZWluaXQuYyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZWluaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjQ0ODM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlaW5pdC5jCkBAIC0wLDAgKzEsMjE1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrZ2Vpbml0LmMKKyAqIFByb2plY3Q6CUdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcnMsIENvbW1vbiBNb2R1bGVzCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuOTcgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMTAvMDIgMTY6NDU6MzEgJAorICogUHVycG9zZToJQ29udGFpbnMgZnVuY3Rpb25zIHRvIGluaXRpYWxpemUgdGhlIGFkYXB0ZXIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0LgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImgvc2tkcnYxc3QuaCIKKyNpbmNsdWRlICJoL3NrZHJ2Mm5kLmgiCisKKy8qIGdsb2JhbCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGxvY2FsIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAoZGVmaW5lZChERUJVRykgfHwgKCghZGVmaW5lZChMSU5UKSkgJiYgKCFkZWZpbmVkKFNLX1NMSU0pKSkpCitzdGF0aWMgY29uc3QgY2hhciBTeXNLb25uZWN0RmlsZUlkW10gPQorCSJAKCMpICRJZDogc2tnZWluaXQuYyx2IDEuOTcgMjAwMy8xMC8wMiAxNjo0NTozMSByc2NobWlkdCBFeHAgJCAoQykgTWFydmVsbC4iOworI2VuZGlmCisKK3N0cnVjdCBzX1FPZmZUYWIgeworCWludAlSeFFPZmY7CQkvKiBSZWNlaXZlIFF1ZXVlIEFkZHJlc3MgT2Zmc2V0ICovCisJaW50CVhzUU9mZjsJCS8qIFN5bmMgVHggUXVldWUgQWRkcmVzcyBPZmZzZXQgKi8KKwlpbnQJWGFRT2ZmOwkJLyogQXN5bmMgVHggUXVldWUgQWRkcmVzcyBPZmZzZXQgKi8KK307CitzdGF0aWMgc3RydWN0IHNfUU9mZlRhYiBRT2ZmVGFiW10gPSB7CisJe1FfUjEsIFFfWFMxLCBRX1hBMX0sIHtRX1IyLCBRX1hTMiwgUV9YQTJ9Cit9OworCitzdHJ1Y3Qgc19Db25maWcgeworCWNoYXIJU2NhblN0cmluZ1s4XTsKKwlTS19VMzIJVmFsdWU7Cit9OworCitzdGF0aWMgc3RydWN0IHNfQ29uZmlnIE9lbUNvbmZpZyA9IHsKKwl7J08nLCdFJywnTScsJ18nLCdDJywnbycsJ24nLCdmJ30sCisjaWZkZWYgU0tfT0VNX0NPTkZJRworCU9FTV9DT05GSUdfVkFMVUUsCisjZWxzZQorCTAsCisjZW5kaWYKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlUG9sbFJ4RCgpIC0gRW5hYmxlIC8gRGlzYWJsZSBEZXNjcmlwdG9yIFBvbGxpbmcgb2YgUnhEIFJpbmcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUVuYWJsZSBvciBkaXNhYmxlIHRoZSBkZXNjcmlwdG9yIHBvbGxpbmcgb2YgdGhlIHJlY2VpdmUgZGVzY3JpcHRvcgorICoJcmluZyAoUnhEKSBmb3IgcG9ydCAnUG9ydCcuCisgKglUaGUgbmV3IGNvbmZpZ3VyYXRpb24gaXMgKm5vdCogc2F2ZWQgb3ZlciBhbnkgU2tHZVN0b3BQb3J0KCkgYW5kCisgKglTa0dlSW5pdFBvcnQoKSBjYWxscy4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrR2VQb2xsUnhEKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK1NLX0JPT0wgUG9sbFJ4RCkJLyogU0tfVFJVRSAoZW5hYmxlIHBvbC4pLCBTS19GQUxTRSAoZGlzYWJsZSBwb2wuKSAqLworeworCVNLX0dFUE9SVCAqcFBydDsKKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJU0tfT1VUMzIoSW9DLCBRX0FERFIocFBydC0+UFJ4UU9mZiwgUV9DU1IpLCAoUG9sbFJ4RCkgPworCQlDU1JfRU5BX1BPTCA6IENTUl9ESVNfUE9MKTsKK30JLyogU2tHZVBvbGxSeEQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZVBvbGxUeEQoKSAtIEVuYWJsZSAvIERpc2FibGUgRGVzY3JpcHRvciBQb2xsaW5nIG9mIFR4RCBSaW5ncworICoKKyAqIERlc2NyaXB0aW9uOgorICoJRW5hYmxlIG9yIGRpc2FibGUgdGhlIGRlc2NyaXB0b3IgcG9sbGluZyBvZiB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvcgorICoJcmluZyhzKSAoVHhEKSBmb3IgcG9ydCAnUG9ydCcuCisgKglUaGUgbmV3IGNvbmZpZ3VyYXRpb24gaXMgKm5vdCogc2F2ZWQgb3ZlciBhbnkgU2tHZVN0b3BQb3J0KCkgYW5kCisgKglTa0dlSW5pdFBvcnQoKSBjYWxscy4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrR2VQb2xsVHhEKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK1NLX0JPT0wgUG9sbFR4RCkJLyogU0tfVFJVRSAoZW5hYmxlIHBvbC4pLCBTS19GQUxTRSAoZGlzYWJsZSBwb2wuKSAqLworeworCVNLX0dFUE9SVCAqcFBydDsKKwlTS19VMzIJRFdvcmQ7CisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCURXb3JkID0gKFNLX1UzMikoUG9sbFR4RCA/IENTUl9FTkFfUE9MIDogQ1NSX0RJU19QT0wpOworCisJaWYgKHBQcnQtPlBYU1FTaXplICE9IDApIHsKKwkJU0tfT1VUMzIoSW9DLCBRX0FERFIocFBydC0+UFhzUU9mZiwgUV9DU1IpLCBEV29yZCk7CisJfQorCQorCWlmIChwUHJ0LT5QWEFRU2l6ZSAhPSAwKSB7CisJCVNLX09VVDMyKElvQywgUV9BRERSKHBQcnQtPlBYYVFPZmYsIFFfQ1NSKSwgRFdvcmQpOworCX0KK30JLyogU2tHZVBvbGxUeEQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZVllbGxvd0xFRCgpIC0gU3dpdGNoIHRoZSB5ZWxsb3cgTEVEIG9uIG9yIG9mZi4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVN3aXRjaCB0aGUgeWVsbG93IExFRCBvbiBvciBvZmYuCisgKgorICogTm90ZToKKyAqCVRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhbnkgdGltZSBhZnRlciBTa0dlSW5pdChMZXZlbCAxKS4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrR2VZZWxsb3dMRUQoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlTdGF0ZSkJCS8qIHllbGxvdyBMRUQgc3RhdGUsIDAgPSBPRkYsIDAgIT0gT04gKi8KK3sKKwlpZiAoU3RhdGUgPT0gMCkgeworCQkvKiBTd2l0Y2ggeWVsbG93IExFRCBPRkYgKi8KKwkJU0tfT1VUOChJb0MsIEIwX0xFRCwgTEVEX1NUQVRfT0ZGKTsKKwl9CisJZWxzZSB7CisJCS8qIFN3aXRjaCB5ZWxsb3cgTEVEIE9OICovCisJCVNLX09VVDgoSW9DLCBCMF9MRUQsIExFRF9TVEFUX09OKTsKKwl9Cit9CS8qIFNrR2VZZWxsb3dMRUQgKi8KKworCisjaWYgKCFkZWZpbmVkKFNLX1NMSU0pIHx8IGRlZmluZWQoR0VORVNJUykpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZVhtaXRMRUQoKSAtIE1vZGlmeSB0aGUgT3BlcmF0aW9uYWwgTW9kZSBvZiBhIHRyYW5zbWlzc2lvbiBMRUQuCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGUgUnggb3IgVHggTEVEIHdoaWNoIGlzIHNwZWNpZmllZCBieSAnTGVkJyB3aWxsIGJlCisgKgllbmFibGVkLCBkaXNhYmxlZCBvciBzd2l0Y2hlZCBvbiBpbiB0ZXN0IG1vZGUuCisgKgorICogTm90ZToKKyAqCSdMZWQnIG11c3QgY29udGFpbiB0aGUgYWRkcmVzcyBvZmZzZXQgb2YgdGhlIExFRHMgSU5JIHJlZ2lzdGVyLgorICoKKyAqIFVzYWdlOgorICoJU2tHZVhtaXRMRUQocEFDLCBJb0MsIE1SX0FERFIoUG9ydCwgVFhfTEVEX0lOSSksIFNLX0xFRF9FTkEpOworICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3ZvaWQgU2tHZVhtaXRMRUQoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlMZWQsCQkvKiBvZmZzZXQgdG8gdGhlIExFRCBJbml0IFZhbHVlIHJlZ2lzdGVyICovCitpbnQJCU1vZGUpCQkvKiBNb2RlIG1heSBiZSBTS19MRURfRElTLCBTS19MRURfRU5BLCBTS19MRURfVFNUICovCit7CisJU0tfVTMyCUxlZEluaTsKKworCXN3aXRjaCAoTW9kZSkgeworCWNhc2UgU0tfTEVEX0VOQToKKwkJTGVkSW5pID0gU0tfWE1JVF9EVVIgKiAoU0tfVTMyKXBBQy0+R0luaS5HSUhzdENsa0ZhY3QgLyAxMDA7CisJCVNLX09VVDMyKElvQywgTGVkICsgWE1JVF9MRURfSU5JLCBMZWRJbmkpOworCQlTS19PVVQ4KElvQywgTGVkICsgWE1JVF9MRURfQ1RSTCwgTEVEX1NUQVJUKTsKKwkJYnJlYWs7CisJY2FzZSBTS19MRURfVFNUOgorCQlTS19PVVQ4KElvQywgTGVkICsgWE1JVF9MRURfVFNULCBMRURfVF9PTik7CisJCVNLX09VVDMyKElvQywgTGVkICsgWE1JVF9MRURfQ05ULCAxMDApOworCQlTS19PVVQ4KElvQywgTGVkICsgWE1JVF9MRURfQ1RSTCwgTEVEX1NUQVJUKTsKKwkJYnJlYWs7CisJY2FzZSBTS19MRURfRElTOgorCWRlZmF1bHQ6CisJCS8qCisJCSAqIERvIE5PVCBzdG9wIHRoZSBMRUQgVGltZXIgaGVyZS4gVGhlIExFRCBtaWdodCBiZQorCQkgKiBpbiBvbiBzdGF0ZS4gQnV0IGl0IG5lZWRzIHRvIGdvIG9mZi4KKwkJICovCisJCVNLX09VVDMyKElvQywgTGVkICsgWE1JVF9MRURfQ05ULCAwKTsKKwkJU0tfT1VUOChJb0MsIExlZCArIFhNSVRfTEVEX1RTVCwgTEVEX1RfT0ZGKTsKKwkJYnJlYWs7CisJfQorCQkJCisJLyoKKwkgKiAxMDAwQlQ6IFRoZSBUcmFuc21pdCBMRUQgaXMgZHJpdmVuIGJ5IHRoZSBQSFkuCisJICogQnV0IHRoZSBkZWZhdWx0IExFRCBjb25maWd1cmF0aW9uIGlzIHVzZWQgZm9yCisJICogTGV2ZWwgT25lIGFuZCBCcm9hZGNvbSBQSFlzLgorCSAqIChCcm9hZGNvbTogSXQgbWF5IGJlIHRoYXQgUEhZX0JfUEVDX0VOX0xUUiBoYXMgdG8gYmUgc2V0LikKKwkgKiAoSW4gdGhpcyBjYXNlIGl0IGhhcyB0byBiZSBhZGRlZCBoZXJlLiBCdXQgd2Ugd2lsbCBzZWUuIFhYWCkKKwkgKi8KK30JLyogU2tHZVhtaXRMRUQgKi8KKyNlbmRpZgkvKiAhU0tfU0xJTSB8fCBHRU5FU0lTICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCURvQ2FsY0FkZHIoKSAtIENhbGN1bGF0ZXMgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIGFkZHJlc3Mgb2YgYSBxdWV1ZS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgYWRkcmVzcyBvZiBhIHF1ZXVlLgorICogIEFmdGVyd2FyZHMgdGhlICdTdGFydFZhbCcgaXMgaW5jcmVtZW50ZWQgdG8gdGhlIG5leHQgc3RhcnQgcG9zaXRpb24uCisgKglJZiB0aGUgcG9ydCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHRoZSBjYWxjdWxhdGVkIHZhbHVlcworICoJd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgdGhlIGNvbmZpZ3VyZWQgdmFsdWVzIGFuZCBhbgorICoJZXJyb3Igd2lsbCBiZSByZXR1cm5lZCwgaWYgdGhleSBhcmUgbm90IGVxdWFsLgorICoJSWYgdGhlIHBvcnQgaXMgbm90IGluaXRpYWxpemVkIHRoZSB2YWx1ZXMgd2lsbCBiZSB3cml0dGVuIHRvCisgKgkqU3RhcnRBZHIgYW5kICpFbmRBZGRyLgorICoKKyAqIFJldHVybnM6CisgKgkwOglzdWNjZXNzCisgKgkxOgljb25maWd1cmF0aW9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgRG9DYWxjQWRkcigKK1NLX0FDCQkqcEFDLCAJCQkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19HRVBPUlQJU0tfRkFSICpwUHJ0LAkJLyogcG9ydCBpbmRleCAqLworaW50CQkJUXVTaXplLAkJCQkvKiBzaXplIG9mIHRoZSBxdWV1ZSB0byBjb25maWd1cmUgaW4ga0IgKi8KK1NLX1UzMgkJU0tfRkFSICpTdGFydFZhbCwJLyogc3RhcnQgdmFsdWUgZm9yIGFkZHJlc3MgY2FsY3VsYXRpb24gKi8KK1NLX1UzMgkJU0tfRkFSICpRdVN0YXJ0QWRkciwvKiBzdGFydCBhZGRyIHRvIGNhbGN1bGF0ZSAqLworU0tfVTMyCQlTS19GQVIgKlF1RW5kQWRkcikJLyogZW5kIGFkZHJlc3MgdG8gY2FsY3VsYXRlICovCit7CisJU0tfVTMyCUVuZFZhbDsKKwlTS19VMzIJTmV4dFN0YXJ0OworCWludAkJUnR2OworCisJUnR2ID0gMDsKKwlpZiAoUXVTaXplID09IDApIHsKKwkJRW5kVmFsID0gKlN0YXJ0VmFsOworCQlOZXh0U3RhcnQgPSBFbmRWYWw7CisJfQorCWVsc2UgeworCQlFbmRWYWwgPSAqU3RhcnRWYWwgKyAoKFNLX1UzMilRdVNpemUgKiAxMDI0KSAtIDE7CisJCU5leHRTdGFydCA9IEVuZFZhbCArIDE7CisJfQorCisJaWYgKHBQcnQtPlBTdGF0ZSA+PSBTS19QUlRfSU5JVCkgeworCQlpZiAoKlN0YXJ0VmFsICE9ICpRdVN0YXJ0QWRkciB8fCBFbmRWYWwgIT0gKlF1RW5kQWRkcikgeworCQkJUnR2ID0gMTsKKwkJfQorCX0KKwllbHNlIHsKKwkJKlF1U3RhcnRBZGRyID0gKlN0YXJ0VmFsOworCQkqUXVFbmRBZGRyID0gRW5kVmFsOworCX0KKworCSpTdGFydFZhbCA9IE5leHRTdGFydDsKKwlyZXR1cm4oUnR2KTsKK30JLyogRG9DYWxjQWRkciAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUluaXRBc3NpZ25SYW1Ub1F1ZXVlcygpIC0gYWxsb2NhdGUgZGVmYXVsdCBxdWV1ZSBzaXplcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBhc3NpZ25zIHRoZSBtZW1vcnkgdG8gdGhlIGRpZmZlcmVudCBxdWV1ZXMgYW5kIHBvcnRzLgorICoJV2hlbiBEdWFsTmV0IGlzIHNldCB0byBTS19UUlVFIGFsbCBwb3J0cyBnZXQgdGhlIHNhbWUgYW1vdW50IG9mIG1lbW9yeS4KKyAqICBPdGhlcndpc2UgdGhlIGZpcnN0IHBvcnQgZ2V0cyBtb3N0IG9mIHRoZSBtZW1vcnkgYW5kIGFsbCB0aGUKKyAqCW90aGVyIHBvcnRzIGp1c3QgdGhlIHJlcXVpcmVkIG1pbmltdW0uCisgKglUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIHBBQy0+R0luaS5HSVJhbVNpemUgYW5kCisgKglwQUMtPkdJbmkuR0lNYWNzRm91bmQgaGF2ZSBiZWVuIGluaXRpYWxpemVkLCB1c3VhbGx5IHRoaXMgaGFwcGVucworICoJYXQgaW5pdCBsZXZlbCAxCisgKgorICogUmV0dXJuczoKKyAqCTAgLSBvaworICoJMSAtIGludmFsaWQgaW5wdXQgdmFsdWVzCisgKgkyIC0gbm90IGVub3VnaCBtZW1vcnkKKyAqLworCitpbnQgU2tHZUluaXRBc3NpZ25SYW1Ub1F1ZXVlcygKK1NLX0FDCSpwQUMsCQkJLyogQWRhcHRlciBjb250ZXh0ICovCitpbnQJCUFjdGl2ZVBvcnQsCQkvKiBBY3RpdmUgUG9ydCBpbiBSTE1UIG1vZGUgKi8KK1NLX0JPT0wJRHVhbE5ldCkJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworeworCWludAlpOworCWludAlVc2VkS2lsb2J5dGVzOwkJCS8qIG1lbW9yeSBhbHJlYWR5IGFzc2lnbmVkICovCisJaW50CUFjdGl2ZVBvcnRLaWxvYnl0ZXM7CS8qIG1lbW9yeSBhdmFpbGFibGUgZm9yIGFjdGl2ZSBwb3J0ICovCisJU0tfR0VQT1JUICpwR2VQb3J0OworCisJVXNlZEtpbG9ieXRlcyA9IDA7CisKKwlpZiAoQWN0aXZlUG9ydCA+PSBwQUMtPkdJbmkuR0lNYWNzRm91bmQpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JTklULAorCQkJKCJTa0dlSW5pdEFzc2lnblJhbVRvUXVldWVzOiBBY3RpdmVQb3J0ICglZCkgaW52YWxpZFxuIiwKKwkJCUFjdGl2ZVBvcnQpKTsKKwkJcmV0dXJuKDEpOworCX0KKwlpZiAoKChwQUMtPkdJbmkuR0lNYWNzRm91bmQgKiAoU0tfTUlOX1JYUV9TSVpFICsgU0tfTUlOX1RYUV9TSVpFKSkgKworCQkoKFJBTV9RVU9UQV9TWU5DID09IDApID8gMCA6IFNLX01JTl9UWFFfU0laRSkpID4gcEFDLT5HSW5pLkdJUmFtU2l6ZSkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lOSVQsCisJCQkoIlNrR2VJbml0QXNzaWduUmFtVG9RdWV1ZXM6IE5vdCBlbm91Z2ggbWVtb3J5ICglZClcbiIsCisJCQkgcEFDLT5HSW5pLkdJUmFtU2l6ZSkpOworCQlyZXR1cm4oMik7CisJfQorCisJaWYgKER1YWxOZXQpIHsKKwkJLyogZXZlcnkgcG9ydCBnZXRzIHRoZSBzYW1lIGFtb3VudCBvZiBtZW1vcnkgKi8KKwkJQWN0aXZlUG9ydEtpbG9ieXRlcyA9IHBBQy0+R0luaS5HSVJhbVNpemUgLyBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7CisJCWZvciAoaSA9IDA7IGkgPCBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCisJCQlwR2VQb3J0ID0gJnBBQy0+R0luaS5HUFtpXTsKKwkJCQorCQkJLyogdGFrZSBhd2F5IHRoZSBtaW5pbXVtIG1lbW9yeSBmb3IgYWN0aXZlIHF1ZXVlcyAqLworCQkJQWN0aXZlUG9ydEtpbG9ieXRlcyAtPSAoU0tfTUlOX1JYUV9TSVpFICsgU0tfTUlOX1RYUV9TSVpFKTsKKworCQkJLyogcmVjZWl2ZSBxdWV1ZSBnZXRzIHRoZSBtaW5pbXVtICsgODAlIG9mIHRoZSByZXN0ICovCisJCQlwR2VQb3J0LT5QUnhRU2l6ZSA9IChpbnQpIChST1VORF9RVUVVRV9TSVpFX0tCKCgKKwkJCQlBY3RpdmVQb3J0S2lsb2J5dGVzICogKHVuc2lnbmVkIGxvbmcpIFJBTV9RVU9UQV9SWCkgLyAxMDApKQorCQkJCSsgU0tfTUlOX1JYUV9TSVpFOworCisJCQlBY3RpdmVQb3J0S2lsb2J5dGVzIC09IChwR2VQb3J0LT5QUnhRU2l6ZSAtIFNLX01JTl9SWFFfU0laRSk7CisKKwkJCS8qIHN5bmNocm9ub3VzIHRyYW5zbWl0IHF1ZXVlICovCisJCQlwR2VQb3J0LT5QWFNRU2l6ZSA9IDA7CisKKwkJCS8qIGFzeW5jaHJvbm91cyB0cmFuc21pdCBxdWV1ZSAqLworCQkJcEdlUG9ydC0+UFhBUVNpemUgPSAoaW50KSBST1VORF9RVUVVRV9TSVpFX0tCKEFjdGl2ZVBvcnRLaWxvYnl0ZXMgKworCQkJCVNLX01JTl9UWFFfU0laRSk7CisJCX0KKwl9CisJZWxzZSB7CQorCQkvKiBSbG10IE1vZGUgb3Igc2luZ2xlIGxpbmsgYWRhcHRlciAqLworCisJCS8qIFNldCBzdGFuZGJ5IHF1ZXVlIHNpemUgZGVmYXVsdHMgZm9yIGFsbCBzdGFuZGJ5IHBvcnRzICovCisJCWZvciAoaSA9IDA7IGkgPCBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCisJCQlpZiAoaSAhPSBBY3RpdmVQb3J0KSB7CisJCQkJcEdlUG9ydCA9ICZwQUMtPkdJbmkuR1BbaV07CisKKwkJCQlwR2VQb3J0LT5QUnhRU2l6ZSA9IFNLX01JTl9SWFFfU0laRTsKKwkJCQlwR2VQb3J0LT5QWEFRU2l6ZSA9IFNLX01JTl9UWFFfU0laRTsKKwkJCQlwR2VQb3J0LT5QWFNRU2l6ZSA9IDA7CisKKwkJCQkvKiBDb3VudCB1c2VkIFJBTSAqLworCQkJCVVzZWRLaWxvYnl0ZXMgKz0gcEdlUG9ydC0+UFJ4UVNpemUgKyBwR2VQb3J0LT5QWEFRU2l6ZTsKKwkJCX0KKwkJfQorCQkvKiB3aGF0J3MgbGVmdD8gKi8KKwkJQWN0aXZlUG9ydEtpbG9ieXRlcyA9IHBBQy0+R0luaS5HSVJhbVNpemUgLSBVc2VkS2lsb2J5dGVzOworCisJCS8qIGFzc2lnbiBpdCB0byB0aGUgYWN0aXZlIHBvcnQgKi8KKwkJLyogZmlyc3QgdGFrZSBhd2F5IHRoZSBtaW5pbXVtIG1lbW9yeSAqLworCQlBY3RpdmVQb3J0S2lsb2J5dGVzIC09IChTS19NSU5fUlhRX1NJWkUgKyBTS19NSU5fVFhRX1NJWkUpOworCQlwR2VQb3J0ID0gJnBBQy0+R0luaS5HUFtBY3RpdmVQb3J0XTsKKworCQkvKiByZWNlaXZlIHF1ZXVlIGdldCdzIHRoZSBtaW5pbXVtICsgODAlIG9mIHRoZSByZXN0ICovCisJCXBHZVBvcnQtPlBSeFFTaXplID0gKGludCkgKFJPVU5EX1FVRVVFX1NJWkVfS0IoKEFjdGl2ZVBvcnRLaWxvYnl0ZXMgKgorCQkJKHVuc2lnbmVkIGxvbmcpIFJBTV9RVU9UQV9SWCkgLyAxMDApKSArIFNLX01JTl9SWFFfU0laRTsKKworCQlBY3RpdmVQb3J0S2lsb2J5dGVzIC09IChwR2VQb3J0LT5QUnhRU2l6ZSAtIFNLX01JTl9SWFFfU0laRSk7CisKKwkJLyogc3luY2hyb25vdXMgdHJhbnNtaXQgcXVldWUgKi8KKwkJcEdlUG9ydC0+UFhTUVNpemUgPSAwOworCisJCS8qIGFzeW5jaHJvbm91cyB0cmFuc21pdCBxdWV1ZSAqLworCQlwR2VQb3J0LT5QWEFRU2l6ZSA9IChpbnQpIFJPVU5EX1FVRVVFX1NJWkVfS0IoQWN0aXZlUG9ydEtpbG9ieXRlcykgKworCQkJU0tfTUlOX1RYUV9TSVpFOworCX0KKyNpZmRlZiBWQ1BVCisJVkNQVXByaW50ZigwLCAiUFJ4UVNpemU9JXUsIFBYU1FTaXplPSV1LCBQWEFRU2l6ZT0ldVxuIiwKKwkJcEdlUG9ydC0+UFJ4UVNpemUsIHBHZVBvcnQtPlBYU1FTaXplLCBwR2VQb3J0LT5QWEFRU2l6ZSk7CisjZW5kaWYgLyogVkNQVSAqLworCisJcmV0dXJuKDApOworfQkvKiBTa0dlSW5pdEFzc2lnblJhbVRvUXVldWVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlQ2hlY2tRU2l6ZSgpIC0gQ2hlY2tzIHRoZSBBZGFwdGVycyBRdWV1ZSBTaXplIENvbmZpZ3VyYXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gdmVyaWZpZXMgdGhlIFF1ZXVlIFNpemUgQ29uZmlndXJhdGlvbiBzcGVjaWZpZWQKKyAqCWluIHRoZSB2YXJpYWJsZXMgUFJ4UVNpemUsIFBYU1FTaXplLCBhbmQgUFhBUVNpemUgb2YgYWxsCisgKgl1c2VkIHBvcnRzLgorICoJVGhpcyByZXF1aXJlbWVudHMgbXVzdCBiZSBmdWxsZmlsbGVkIHRvIGhhdmUgYSB2YWxpZCBjb25maWd1cmF0aW9uOgorICoJCS0gVGhlIHNpemUgb2YgYWxsIHF1ZXVlcyBtdXN0IG5vdCBleGNlZWQgR0lSYW1TaXplLgorICoJCS0gVGhlIHF1ZXVlIHNpemVzIG11c3QgYmUgc3BlY2lmaWVkIGluIHVuaXRzIG9mIDgga0IuCisgKgkJLSBUaGUgc2l6ZSBvZiBSeCBxdWV1ZXMgb2YgYXZhaWxhYmxlIHBvcnRzIG11c3Qgbm90IGJlCisgKgkJICBzbWFsbGVyIHRoYW4gMTYga0IuCisgKgkJLSBUaGUgc2l6ZSBvZiBhdCBsZWFzdCBvbmUgVHggcXVldWUgKHN5bmNoLiBvciBhc3luY2guKQorICogICAgICAgIG9mIGF2YWlsYWJsZSBwb3J0cyBtdXN0IG5vdCBiZSBzbWFsbGVyIHRoYW4gMTYga0IKKyAqICAgICAgICB3aGVuIEp1bWJvIEZyYW1lcyBhcmUgdXNlZC4KKyAqCQktIFRoZSBSQU0gc3RhcnQgYW5kIGVuZCBhZGRyZXNzZXMgbXVzdCBub3QgYmUgY2hhbmdlZAorICoJCSAgZm9yIHBvcnRzIHdoaWNoIGFyZSBhbHJlYWR5IGluaXRpYWxpemVkLgorICoJRnVydGhlcm1vcmUgU2tHZUNoZWNrUVNpemUoKSBkZWZpbmVzIHRoZSBTdGFydCBhbmQgRW5kIEFkZHJlc3NlcworICogIG9mIGFsbCBwb3J0cyBhbmQgc3RvcmVzIHRoZW0gaW50byB0aGUgSFdBQyBwb3J0CXN0cnVjdHVyZS4KKyAqCisgKiBSZXR1cm5zOgorICoJMDoJUXVldWUgU2l6ZSBDb25maWd1cmF0aW9uIHZhbGlkCisgKgkxOglRdWV1ZSBTaXplIENvbmZpZ3VyYXRpb24gaW52YWxpZAorICovCitzdGF0aWMgaW50IFNrR2VDaGVja1FTaXplKAorU0tfQUMJICpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK2ludAkJIFBvcnQpCQkvKiBwb3J0IGluZGV4ICovCit7CisJU0tfR0VQT1JUICpwUHJ0OworCWludAlpOworCWludAlSdHY7CisJaW50CVJ0djI7CisJU0tfVTMyCVN0YXJ0QWRkcjsKKyNpZm5kZWYgU0tfU0xJTQorCWludAlVc2VkTWVtOwkvKiB0b3RhbCBtZW1vcnkgdXNlZCAobWF4LiBmb3VuZCBwb3J0cykgKi8KKyNlbmRpZgkKKworCVJ0diA9IDA7CisJCisjaWZuZGVmIFNLX1NMSU0KKworCVVzZWRNZW0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQlwUHJ0ID0gJnBBQy0+R0luaS5HUFtpXTsKKworCQlpZiAoKHBQcnQtPlBSeFFTaXplICYgUVpfVU5JVFMpICE9IDAgfHwKKwkJCShwUHJ0LT5QWFNRU2l6ZSAmIFFaX1VOSVRTKSAhPSAwIHx8CisJCQkocFBydC0+UFhBUVNpemUgJiBRWl9VTklUUykgIT0gMCkgeworCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0hXSV9FMDEyLCBTS0VSUl9IV0lfRTAxMk1TRyk7CisJCQlyZXR1cm4oMSk7CisJCX0KKworCQlpZiAoaSA9PSBQb3J0ICYmIHBQcnQtPlBSeFFTaXplIDwgU0tfTUlOX1JYUV9TSVpFKSB7CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0hXSV9FMDExLCBTS0VSUl9IV0lfRTAxMU1TRyk7CisJCQlyZXR1cm4oMSk7CisJCX0KKwkJCisJCS8qCisJCSAqIHRoZSBzaXplIG9mIGF0IGxlYXN0IG9uZSBUeCBxdWV1ZSAoc3luY2guIG9yIGFzeW5jaC4pIGhhcyB0byBiZSA+IDAuCisJCSAqIGlmIEp1bWJvIEZyYW1lcyBhcmUgdXNlZCwgdGhpcyBzaXplIGhhcyB0byBiZSA+PSAxNiBrQi4KKwkJICovCisJCWlmICgoaSA9PSBQb3J0ICYmIHBQcnQtPlBYU1FTaXplID09IDAgJiYgcFBydC0+UFhBUVNpemUgPT0gMCkgfHwKKwkJCShwQUMtPkdJbmkuR0lQb3J0VXNhZ2UgPT0gU0tfSlVNQk9fTElOSyAmJgorICAgICAgICAgICAgKChwUHJ0LT5QWFNRU2l6ZSA+IDAgJiYgcFBydC0+UFhTUVNpemUgPCBTS19NSU5fVFhRX1NJWkUpIHx8CisJCQkgKHBQcnQtPlBYQVFTaXplID4gMCAmJiBwUHJ0LT5QWEFRU2l6ZSA8IFNLX01JTl9UWFFfU0laRSkpKSkgeworCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSFdJX0UwMjMsIFNLRVJSX0hXSV9FMDIzTVNHKTsKKwkJCQlyZXR1cm4oMSk7CisJCX0KKwkJCisJCVVzZWRNZW0gKz0gcFBydC0+UFJ4UVNpemUgKyBwUHJ0LT5QWFNRU2l6ZSArIHBQcnQtPlBYQVFTaXplOworCX0KKwkKKwlpZiAoVXNlZE1lbSA+IHBBQy0+R0luaS5HSVJhbVNpemUpIHsKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9IV0lfRTAxMiwgU0tFUlJfSFdJX0UwMTJNU0cpOworCQlyZXR1cm4oMSk7CisJfQorI2VuZGlmCS8qICFTS19TTElNICovCisKKwkvKiBOb3cgc3RhcnQgYWRkcmVzcyBjYWxjdWxhdGlvbiAqLworCVN0YXJ0QWRkciA9IHBBQy0+R0luaS5HSVJhbU9mZnM7CisJZm9yIChpID0gMDsgaSA8IHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCXBQcnQgPSAmcEFDLT5HSW5pLkdQW2ldOworCisJCS8qIENhbGN1bGF0ZS9DaGVjayB2YWx1ZXMgZm9yIHRoZSByZWNlaXZlIHF1ZXVlICovCisJCVJ0djIgPSBEb0NhbGNBZGRyKHBBQywgcFBydCwgcFBydC0+UFJ4UVNpemUsICZTdGFydEFkZHIsCisJCQkmcFBydC0+UFJ4UVJhbVN0YXJ0LCAmcFBydC0+UFJ4UVJhbUVuZCk7CisJCVJ0diB8PSBSdHYyOworCisJCS8qIENhbGN1bGF0ZS9DaGVjayB2YWx1ZXMgZm9yIHRoZSBzeW5jaHJvbm91cyBUeCBxdWV1ZSAqLworCQlSdHYyID0gRG9DYWxjQWRkcihwQUMsIHBQcnQsIHBQcnQtPlBYU1FTaXplLCAmU3RhcnRBZGRyLAorCQkJJnBQcnQtPlBYc1FSYW1TdGFydCwgJnBQcnQtPlBYc1FSYW1FbmQpOworCQlSdHYgfD0gUnR2MjsKKworCQkvKiBDYWxjdWxhdGUvQ2hlY2sgdmFsdWVzIGZvciB0aGUgYXN5bmNocm9ub3VzIFR4IHF1ZXVlICovCisJCVJ0djIgPSBEb0NhbGNBZGRyKHBBQywgcFBydCwgcFBydC0+UFhBUVNpemUsICZTdGFydEFkZHIsCisJCQkmcFBydC0+UFhhUVJhbVN0YXJ0LCAmcFBydC0+UFhhUVJhbUVuZCk7CisJCVJ0diB8PSBSdHYyOworCisJCWlmIChSdHYpIHsKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSFdJX0UwMTMsIFNLRVJSX0hXSV9FMDEzTVNHKTsKKwkJCXJldHVybigxKTsKKwkJfQorCX0KKworCXJldHVybigwKTsKK30JLyogU2tHZUNoZWNrUVNpemUgKi8KKworCisjaWZkZWYgR0VORVNJUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VJbml0TWFjQXJiKCkgLSBJbml0aWFsaXplIHRoZSBNQUMgQXJiaXRlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgTUFDIEFyYml0ZXIuCisgKglJdCBtdXN0IG5vdCBiZSBjYWxsZWQgaWYgdGhlcmUgaXMgc3RpbGwgYW4KKyAqCWluaXRpYWxpemVkIG9yIGFjdGl2ZSBwb3J0LgorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3N0YXRpYyB2b2lkIFNrR2VJbml0TWFjQXJiKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQykJCS8qIElPIGNvbnRleHQgKi8KK3sKKwkvKiByZWxlYXNlIGxvY2FsIHJlc2V0ICovCisJU0tfT1VUMTYoSW9DLCBCM19NQV9UT19DVFJMLCBNQV9SU1RfQ0xSKTsKKworCS8qIGNvbmZpZ3VyZSB0aW1lb3V0IHZhbHVlcyAqLworCVNLX09VVDgoSW9DLCBCM19NQV9UT0lOSV9SWDEsIFNLX01BQ19UT181Myk7CisJU0tfT1VUOChJb0MsIEIzX01BX1RPSU5JX1JYMiwgU0tfTUFDX1RPXzUzKTsKKwlTS19PVVQ4KElvQywgQjNfTUFfVE9JTklfVFgxLCBTS19NQUNfVE9fNTMpOworCVNLX09VVDgoSW9DLCBCM19NQV9UT0lOSV9UWDIsIFNLX01BQ19UT181Myk7CisKKwlTS19PVVQ4KElvQywgQjNfTUFfUkNJTklfUlgxLCAwKTsKKwlTS19PVVQ4KElvQywgQjNfTUFfUkNJTklfUlgyLCAwKTsKKwlTS19PVVQ4KElvQywgQjNfTUFfUkNJTklfVFgxLCAwKTsKKwlTS19PVVQ4KElvQywgQjNfTUFfUkNJTklfVFgyLCAwKTsKKworCS8qIHJlY292ZXJ5IHZhbHVlcyBhcmUgbmVlZGVkIGZvciBYTUFDIElJIFJldi4gQjIgb25seSAqLworCS8qIEZhc3QgT3V0cHV0IEVuYWJsZSBNb2RlIHdhcyBpbnRlbmRlZCB0byB1c2Ugd2l0aCBSZXYuIEIyLCBidXQgbm93PyAqLworCisJLyoKKwkgKiBUaGVyZSBpcyBubyBzdGFydCBvciBlbmFibGUgYnV0dG9uIHRvIHB1c2gsIHRoZXJlZm9yZQorCSAqIHRoZSBNQUMgYXJiaXRlciBpcyBjb25maWd1cmVkIGFuZCBlbmFibGVkIG5vdy4KKwkgKi8KK30JLyogU2tHZUluaXRNYWNBcmIgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUluaXRQa3RBcmIoKSAtIEluaXRpYWxpemUgdGhlIFBhY2tldCBBcmJpdGVyCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBQYWNrZXQgQXJiaXRlci4KKyAqCUl0IG11c3Qgbm90IGJlIGNhbGxlZCBpZiB0aGVyZSBpcyBzdGlsbCBhbgorICoJaW5pdGlhbGl6ZWQgb3IgYWN0aXZlIHBvcnQuCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLworc3RhdGljIHZvaWQgU2tHZUluaXRQa3RBcmIoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DKQkJLyogSU8gY29udGV4dCAqLworeworCS8qIHJlbGVhc2UgbG9jYWwgcmVzZXQgKi8KKwlTS19PVVQxNihJb0MsIEIzX1BBX0NUUkwsIFBBX1JTVF9DTFIpOworCisJLyogY29uZmlndXJlIHRpbWVvdXQgdmFsdWVzICovCisJU0tfT1VUMTYoSW9DLCBCM19QQV9UT0lOSV9SWDEsIFNLX1BLVF9UT19NQVgpOworCVNLX09VVDE2KElvQywgQjNfUEFfVE9JTklfUlgyLCBTS19QS1RfVE9fTUFYKTsKKwlTS19PVVQxNihJb0MsIEIzX1BBX1RPSU5JX1RYMSwgU0tfUEtUX1RPX01BWCk7CisJU0tfT1VUMTYoSW9DLCBCM19QQV9UT0lOSV9UWDIsIFNLX1BLVF9UT19NQVgpOworCisJLyoKKwkgKiBlbmFibGUgdGltZW91dCB0aW1lcnMgaWYganVtYm8gZnJhbWVzIG5vdCB1c2VkCisJICogTk9URTogdGhlIHBhY2tldCBhcmJpdGVyIHRpbWVvdXQgaW50ZXJydXB0IGlzIG5lZWRlZCBmb3IKKwkgKiBoYWxmIGR1cGxleCBoYW5ndXAgd29ya2Fyb3VuZAorCSAqLworCWlmIChwQUMtPkdJbmkuR0lQb3J0VXNhZ2UgIT0gU0tfSlVNQk9fTElOSykgeworCQlpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDEpIHsKKwkJCVNLX09VVDE2KElvQywgQjNfUEFfQ1RSTCwgUEFfRU5BX1RPX1RYMSk7CisJCX0KKwkJZWxzZSB7CisJCQlTS19PVVQxNihJb0MsIEIzX1BBX0NUUkwsIFBBX0VOQV9UT19UWDEgfCBQQV9FTkFfVE9fVFgyKTsKKwkJfQorCX0KK30JLyogU2tHZUluaXRQa3RBcmIgKi8KKyNlbmRpZiAvKiBHRU5FU0lTICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VJbml0TWFjRmlmbygpIC0gSW5pdGlhbGl6ZSB0aGUgTUFDIEZJRk9zCisgKgorICogRGVzY3JpcHRpb246CisgKglJbml0aWFsaXplIGFsbCBNQUMgRklGT3Mgb2YgdGhlIHNwZWNpZmllZCBwb3J0CisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLworc3RhdGljIHZvaWQgU2tHZUluaXRNYWNGaWZvKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19VMTYJV29yZDsKKyNpZmRlZiBWQ1BVCisJU0tfVTMyCURXb3JkOworI2VuZGlmIC8qIFZDUFUgKi8KKwkvKgorCSAqIEZvciBlYWNoIEZJRk86CisJICoJLSByZWxlYXNlIGxvY2FsIHJlc2V0CisJICoJLSB1c2UgZGVmYXVsdCB2YWx1ZSBmb3IgTUFDIEZJRk8gc2l6ZQorCSAqCS0gc2V0dXAgZGVmYXVsdHMgZm9yIHRoZSBjb250cm9sIHJlZ2lzdGVyCisJICoJLSBlbmFibGUgdGhlIEZJRk8KKwkgKi8KKwkKKyNpZmRlZiBHRU5FU0lTCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJLyogQ29uZmlndXJlIFJ4IE1BQyBGSUZPICovCisJCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIFJYX01GRl9DVFJMMiksIE1GRl9SU1RfQ0xSKTsKKwkJU0tfT1VUMTYoSW9DLCBNUl9BRERSKFBvcnQsIFJYX01GRl9DVFJMMSksIE1GRl9SWF9DVFJMX0RFRik7CisJCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIFJYX01GRl9DVFJMMiksIE1GRl9FTkFfT1BfTUQpOworCQorCQkvKiBDb25maWd1cmUgVHggTUFDIEZJRk8gKi8KKwkJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgVFhfTUZGX0NUUkwyKSwgTUZGX1JTVF9DTFIpOworCQlTS19PVVQxNihJb0MsIE1SX0FERFIoUG9ydCwgVFhfTUZGX0NUUkwxKSwgTUZGX1RYX0NUUkxfREVGKTsKKwkJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgVFhfTUZGX0NUUkwyKSwgTUZGX0VOQV9PUF9NRCk7CisJCisJCS8qIEVuYWJsZSBmcmFtZSBmbHVzaGluZyBpZiBqdW1ibyBmcmFtZXMgdXNlZCAqLworCQlpZiAocEFDLT5HSW5pLkdJUG9ydFVzYWdlID09IFNLX0pVTUJPX0xJTkspIHsKKwkJCVNLX09VVDE2KElvQywgTVJfQUREUihQb3J0LCBSWF9NRkZfQ1RSTDEpLCBNRkZfRU5BX0ZMVVNIKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisJCisjaWZkZWYgWVVLT04KKwlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJLyogc2V0IFJ4IEdNQUMgRklGTyBGbHVzaCBNYXNrICovCisJCVNLX09VVDE2KElvQywgTVJfQUREUihQb3J0LCBSWF9HTUZfRkxfTVNLKSwgKFNLX1UxNilSWF9GRl9GTF9ERUZfTVNLKTsKKwkJCisJCVdvcmQgPSAoU0tfVTE2KUdNRl9SWF9DVFJMX0RFRjsKKworCQkvKiBkaXNhYmxlIFJ4IEdNQUMgRklGTyBGbHVzaCBmb3IgWVVLT04tTGl0ZSBSZXYuIEEwIG9ubHkgKi8KKwkJaWYgKHBBQy0+R0luaS5HSVl1a29uTGl0ZSAmJiBwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9ZVUtPTikgeworCisJCQlXb3JkICY9IH5HTUZfUlhfRl9GTF9PTjsKKwkJfQorCQkKKwkJLyogQ29uZmlndXJlIFJ4IE1BQyBGSUZPICovCisJCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIFJYX0dNRl9DVFJMX1QpLCAoU0tfVTgpR01GX1JTVF9DTFIpOworCQlTS19PVVQxNihJb0MsIE1SX0FERFIoUG9ydCwgUlhfR01GX0NUUkxfVCksIFdvcmQpOworCQkKKwkJLyogc2V0IFJ4IEdNQUMgRklGTyBGbHVzaCBUaHJlc2hvbGQgKGRlZmF1bHQ6IDB4MGEgLT4gNTYgYnl0ZXMpICovCisJCVNLX09VVDE2KElvQywgTVJfQUREUihQb3J0LCBSWF9HTUZfRkxfVEhSKSwgUlhfR01GX0ZMX1RIUl9ERUYpOworCQkKKwkJLyogQ29uZmlndXJlIFR4IE1BQyBGSUZPICovCisJCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIFRYX0dNRl9DVFJMX1QpLCAoU0tfVTgpR01GX1JTVF9DTFIpOworCQlTS19PVVQxNihJb0MsIE1SX0FERFIoUG9ydCwgVFhfR01GX0NUUkxfVCksIChTS19VMTYpR01GX1RYX0NUUkxfREVGKTsKKwkJCisjaWZkZWYgVkNQVQorCQlTS19JTjMyKElvQywgTVJfQUREUihQb3J0LCBSWF9HTUZfQUZfVEhSKSwgJkRXb3JkKTsKKwkJU0tfSU4zMihJb0MsIE1SX0FERFIoUG9ydCwgVFhfR01GX0FFX1RIUiksICZEV29yZCk7CisjZW5kaWYgLyogVkNQVSAqLworCQkKKwkJLyogc2V0IFR4IEdNQUMgRklGTyBBbG1vc3QgRW1wdHkgVGhyZXNob2xkICovCisvKgkJU0tfT1VUMzIoSW9DLCBNUl9BRERSKFBvcnQsIFRYX0dNRl9BRV9USFIpLCAwKTsgKi8KKwl9CisjZW5kaWYgLyogWVVLT04gKi8KKworfQkvKiBTa0dlSW5pdE1hY0ZpZm8gKi8KKworI2lmZGVmCVNLX0xOS19TWU5DX0NOVAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VMb2FkTG5rU3luY0NudCgpIC0gTG9hZCB0aGUgTGluayBTeW5jIENvdW50ZXIgYW5kIHN0YXJ0cyBjb3VudGluZworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBzdGFydHMgdGhlIExpbmsgU3luYyBDb3VudGVyIG9mIHRoZSBzcGVjaWZpZWQKKyAqCXBvcnQgYW5kIGVuYWJsZXMgdGhlIGdlbmVyYXRpb24gb2YgYW4gTGluayBTeW5jIElSUS4KKyAqCVRoZSBMaW5rIFN5bmMgQ291bnRlciBtYXkgYmUgdXNlZCB0byBkZXRlY3QgYW4gYWN0aXZlIGxpbmssCisgKglpZiBhdXRvbmVnb3RpYXRpb24gaXMgbm90IHVzZWQuCisgKgorICogTm90ZToKKyAqCW8gVG8gZW5zdXJlIHJlY2VpdmluZyB0aGUgTGluayBTeW5jIEV2ZW50IHRoZSBMaW5rU3luY0NvdW50ZXIKKyAqCSAgc2hvdWxkIGJlIGluaXRpYWxpemVkIEJFRk9SRSBjbGVhcmluZyB0aGUgWE1BQydzIHJlc2V0IQorICoJbyBFbmFibGUgSVNfTE5LX1NZTkNfTTEgYW5kIElTX0xOS19TWU5DX00yIGFmdGVyIGNhbGxpbmcgdGhpcworICoJICBmdW5jdGlvbi4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrR2VMb2FkTG5rU3luY0NudCgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitTS19VMzIJQ250VmFsKQkJLyogQ291bnRlciB2YWx1ZSAqLworeworCVNLX1UzMglPcmdJTXNrOworCVNLX1UzMglOZXdJTXNrOworCVNLX1UzMglJU3JjOworCVNLX0JPT0wJSXJxUGVuZDsKKworCS8qIHN0b3AgY291bnRlciAqLworCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIExOS19TWU5DX0NUUkwpLCBMRURfU1RPUCk7CisKKwkvKgorCSAqIEFTSUMgcHJvYmxlbToKKwkgKiBFYWNoIHRpbWUgc3RhcnRpbmcgdGhlIExpbmsgU3luYyBDb3VudGVyIGFuIElSUSBpcyBnZW5lcmF0ZWQKKwkgKiBieSB0aGUgYWRhcHRlci4gU2VlIHByb2JsZW0gcmVwb3J0IGVudHJ5IGZyb20gMjEuMDcuOTgKKwkgKgorCSAqIFdvcmthcm91bmQ6CURpc2FibGUgTGluayBTeW5jIElSUSBhbmQgY2xlYXIgdGhlIHVuZXhwZWNlZCBJUlEKKwkgKgkJaWYgbm8gSVJRIGlzIGFscmVhZHkgcGVuZGluZy4KKwkgKi8KKwlJcnFQZW5kID0gU0tfRkFMU0U7CisJU0tfSU4zMihJb0MsIEIwX0lTUkMsICZJU3JjKTsKKwlTS19JTjMyKElvQywgQjBfSU1TSywgJk9yZ0lNc2spOworCWlmIChQb3J0ID09IE1BQ18xKSB7CisJCU5ld0lNc2sgPSBPcmdJTXNrICYgfklTX0xOS19TWU5DX00xOworCQlpZiAoKElTcmMgJiBJU19MTktfU1lOQ19NMSkgIT0gMCkgeworCQkJSXJxUGVuZCA9IFNLX1RSVUU7CisJCX0KKwl9CisJZWxzZSB7CisJCU5ld0lNc2sgPSBPcmdJTXNrICYgfklTX0xOS19TWU5DX00yOworCQlpZiAoKElTcmMgJiBJU19MTktfU1lOQ19NMikgIT0gMCkgeworCQkJSXJxUGVuZCA9IFNLX1RSVUU7CisJCX0KKwl9CisJaWYgKCFJcnFQZW5kKSB7CisJCVNLX09VVDMyKElvQywgQjBfSU1TSywgTmV3SU1zayk7CisJfQorCisJLyogbG9hZCBjb3VudGVyICovCisJU0tfT1VUMzIoSW9DLCBNUl9BRERSKFBvcnQsIExOS19TWU5DX0lOSSksIENudFZhbCk7CisKKwkvKiBzdGFydCBjb3VudGVyICovCisJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgTE5LX1NZTkNfQ1RSTCksIExFRF9TVEFSVCk7CisKKwlpZiAoIUlycVBlbmQpIHsKKwkJLyogY2xlYXIgdGhlIHVuZXhwZWN0ZWQgSVJRLCBhbmQgcmVzdG9yZSB0aGUgaW50ZXJydXB0IG1hc2sgKi8KKwkJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgTE5LX1NZTkNfQ1RSTCksIExFRF9DTFJfSVJRKTsKKwkJU0tfT1VUMzIoSW9DLCBCMF9JTVNLLCBPcmdJTXNrKTsKKwl9Cit9CS8qIFNrR2VMb2FkTG5rU3luY0NudCovCisjZW5kaWYJLyogU0tfTE5LX1NZTkNfQ05UICovCisKKyNpZiBkZWZpbmVkKFNLX0RJQUcpIHx8IGRlZmluZWQoU0tfQ0ZHX1NZTkMpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUNmZ1N5bmMoKSAtIENvbmZpZ3VyZSBzeW5jaHJvbm91cyBiYW5kd2lkdGggZm9yIHRoaXMgcG9ydC4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgdG8gY29uZmlndXJlIHN5bmNocm9ub3VzIGJhbmR3aWR0aAorICoJdG8gdGhlIHNwZWNpZmllZCBwb3J0LiBUaGlzIG1heSBiZSBkb25lIGFueSB0aW1lIGFmdGVyCisgKglpbml0aWFsaXppbmcgdGhlIHBvcnQuIFRoZSBjb25maWd1cmF0aW9uIHZhbHVlcyBhcmUgTk9UIHNhdmVkCisgKglpbiB0aGUgSFdBQyBwb3J0IHN0cnVjdHVyZSBhbmQgd2lsbCBiZSBvdmVyd3JpdHRlbiBhbnkKKyAqCXRpbWUgd2hlbiBzdG9wcGluZyBhbmQgc3RhcnRpbmcgdGhlIHBvcnQuCisgKglBbnkgdmFsdWVzIGZvciB0aGUgc3luY2hyb25vdXMgY29uZmlndXJhdGlvbiB3aWxsIGJlIGlnbm9yZWQKKyAqCWlmIHRoZSBzaXplIG9mIHRoZSBzeW5jaHJvbm91cyBxdWV1ZSBpcyB6ZXJvIQorICoKKyAqCVRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzeW5jaHJvbm91cyBzZXJ2aWNlIGlzCisgKglUWEFfRU5BX0ZTWU5DLiBUaGlzIG1lYW5zIGlmIHRoZSBzaXplIG9mCisgKgl0aGUgc3luY2hyb25vdXMgcXVldWUgaXMgdW5lcXVhbCB6ZXJvIGJ1dCBubyBzcGVjaWZpYworICoJc3luY2hyb25vdXMgYmFuZHdpZHRoIGlzIGNvbmZpZ3VyZWQsIHRoZSBzeW5jaHJvbm91cyBxdWV1ZQorICoJd2lsbCBhbHdheXMgaGF2ZSB0aGUgJ3VubGltaXRlZCcgdHJhbnNtaXQgcHJpb3JpdHkhCisgKgorICoJVGhpcyBtb2RlIHdpbGwgYmUgcmVzdG9yZWQgaWYgdGhlIHN5bmNocm9ub3VzIGJhbmR3aWR0aCBpcworICoJZGVhbGxvY2F0ZWQgKCdJbnRUaW1lJyA9IDAgYW5kICdMaW1Db3VudCcgPSAwKS4KKyAqCisgKiBSZXR1cm5zOgorICoJMDoJc3VjY2VzcworICoJMToJcGFyYW1ldGVyIGNvbmZpZ3VyYXRpb24gZXJyb3IKKyAqCTI6CXRyeSB0byBjb25maWd1cmUgcXVhbGl0eSBvZiBzZXJ2aWNlIGFsdGhvdWdoIG5vCisgKgkJc3luY2hyb25vdXMgcXVldWUgaXMgY29uZmlndXJlZAorICovCitpbnQgU2tHZUNmZ1N5bmMoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworU0tfVTMyCUludFRpbWUsCS8qIEludGVydmFsIFRpbWVyIFZhbHVlIGluIHVuaXRzIG9mIDhucyAqLworU0tfVTMyCUxpbUNvdW50LAkvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIgZHVyaW5nIEludFRpbWUgKi8KK2ludAkJU3luY01vZGUpCS8qIFN5bmMgTW9kZTogVFhBX0VOQV9BTExPQyB8IFRYQV9ESVNfQUxMT0MgfCAwICovCit7CisJaW50IFJ0djsKKworCVJ0diA9IDA7CisKKwkvKiBjaGVjayB0aGUgcGFyYW1ldGVycyAqLworCWlmIChMaW1Db3VudCA+IEludFRpbWUgfHwKKwkJKExpbUNvdW50ID09IDAgJiYgSW50VGltZSAhPSAwKSB8fAorCQkoTGltQ291bnQgIT0gMCAmJiBJbnRUaW1lID09IDApKSB7CisKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9IV0lfRTAxMCwgU0tFUlJfSFdJX0UwMTBNU0cpOworCQlyZXR1cm4oMSk7CisJfQorCQorCWlmIChwQUMtPkdJbmkuR1BbUG9ydF0uUFhTUVNpemUgPT0gMCkgeworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0hXSV9FMDA5LCBTS0VSUl9IV0lfRTAwOU1TRyk7CisJCXJldHVybigyKTsKKwl9CisJCisJLyogY2FsY3VsYXRlIHJlZ2lzdGVyIHZhbHVlcyAqLworCUludFRpbWUgPSAoSW50VGltZSAvIDIpICogcEFDLT5HSW5pLkdJSHN0Q2xrRmFjdCAvIDEwMDsKKwlMaW1Db3VudCA9IExpbUNvdW50IC8gODsKKwkKKwlpZiAoSW50VGltZSA+IFRYQV9NQVhfVkFMIHx8IExpbUNvdW50ID4gVFhBX01BWF9WQUwpIHsKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9IV0lfRTAxMCwgU0tFUlJfSFdJX0UwMTBNU0cpOworCQlyZXR1cm4oMSk7CisJfQorCisJLyoKKwkgKiAtIEVuYWJsZSAnRm9yY2UgU3luYycgdG8gZW5zdXJlIHRoZSBzeW5jaHJvbm91cyBxdWV1ZQorCSAqICAgaGFzIHRoZSBwcmlvcml0eSB3aGlsZSBjb25maWd1cmluZyB0aGUgbmV3IHZhbHVlcy4KKwkgKiAtIEFsc28gJ2Rpc2FibGUgYWxsb2MnIHRvIGVuc3VyZSB0aGUgc2V0dGluZ3MgY29tcGxpZXMKKwkgKiAgIHRvIHRoZSBTeW5jTW9kZSBwYXJhbWV0ZXIuCisJICogLSBEaXNhYmxlICdSYXRlIENvbnRyb2wnIHRvIGNvbmZpZ3VyZSB0aGUgbmV3IHZhbHVlcy4KKwkgKiAtIHdyaXRlIEludFRpbWUgYW5kIExpbUNvdW50CisJICogLSBzdGFydCAnUmF0ZSBDb250cm9sJyBhbmQgZGlzYWJsZSAnRm9yY2UgU3luYycKKwkgKiAgIGlmIEludGVydmFsIFRpbWVyIG9yIExpbWl0IENvdW50ZXIgbm90IHplcm8uCisJICovCisJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgVFhBX0NUUkwpLAorCQlUWEFfRU5BX0ZTWU5DIHwgVFhBX0RJU19BTExPQyB8IFRYQV9TVE9QX1JDKTsKKwkKKwlTS19PVVQzMihJb0MsIE1SX0FERFIoUG9ydCwgVFhBX0lUSV9JTkkpLCBJbnRUaW1lKTsKKwlTS19PVVQzMihJb0MsIE1SX0FERFIoUG9ydCwgVFhBX0xJTV9JTkkpLCBMaW1Db3VudCk7CisJCisJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgVFhBX0NUUkwpLAorCQkoU0tfVTgpKFN5bmNNb2RlICYgKFRYQV9FTkFfQUxMT0MgfCBUWEFfRElTX0FMTE9DKSkpOworCQorCWlmIChJbnRUaW1lICE9IDAgfHwgTGltQ291bnQgIT0gMCkgeworCQlTS19PVVQ4KElvQywgTVJfQUREUihQb3J0LCBUWEFfQ1RSTCksIFRYQV9ESVNfRlNZTkMgfCBUWEFfU1RBUlRfUkMpOworCX0KKworCXJldHVybigwKTsKK30JLyogU2tHZUNmZ1N5bmMgKi8KKyNlbmRpZiAvKiBTS19ESUFHIHx8IFNLX0NGR19TWU5DKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJRG9Jbml0UmFtUXVldWUoKSAtIEluaXRpYWxpemUgdGhlIFJBTSBCdWZmZXIgQWRkcmVzcyBvZiBhIHNpbmdsZSBRdWV1ZQorICoKKyAqIERlc2NjcmlwdGlvbjoKKyAqCUlmIHRoZSBxdWV1ZSBpcyB1c2VkLCBlbmFibGUgYW5kIGluaXRpYWxpemUgaXQuCisgKglNYWtlIHN1cmUgdGhlIHF1ZXVlIGlzIHN0aWxsIHJlc2V0LCBpZiBpdCBpcyBub3QgdXNlZC4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCitzdGF0aWMgdm9pZCBEb0luaXRSYW1RdWV1ZSgKK1NLX0FDCSpwQUMsCQkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUXVJb09mZnMsCQkvKiBRdWV1ZSBJTyBBZGRyZXNzIE9mZnNldCAqLworU0tfVTMyCVF1U3RhcnRBZGRyLAkvKiBRdWV1ZSBTdGFydCBBZGRyZXNzICovCitTS19VMzIJUXVFbmRBZGRyLAkJLyogUXVldWUgRW5kIEFkZHJlc3MgKi8KK2ludAkJUXVUeXBlKQkJCS8qIFF1ZXVlIFR5cGUgKFNLX1JYX1NSQU1fUXxTS19SWF9CUkFNX1F8U0tfVFhfUkFNX1EpICovCit7CisJU0tfVTMyCVJ4VXBUaHJlc1ZhbDsKKwlTS19VMzIJUnhMb1RocmVzVmFsOworCisJaWYgKFF1U3RhcnRBZGRyICE9IFF1RW5kQWRkcikgeworCQkvKiBjYWxjdWxhdGUgdGhyZXNob2xkcywgYXNzdW1lIHdlIGhhdmUgYSBiaWcgUnggcXVldWUgKi8KKwkJUnhVcFRocmVzVmFsID0gKFF1RW5kQWRkciArIDEgLSBRdVN0YXJ0QWRkciAtIFNLX1JCX1VMUFApIC8gODsKKwkJUnhMb1RocmVzVmFsID0gKFF1RW5kQWRkciArIDEgLSBRdVN0YXJ0QWRkciAtIFNLX1JCX0xMUFBfQikvODsKKworCQkvKiBidWlsZCBIVyBhZGRyZXNzIGZvcm1hdCAqLworCQlRdVN0YXJ0QWRkciA9IFF1U3RhcnRBZGRyIC8gODsKKwkJUXVFbmRBZGRyID0gUXVFbmRBZGRyIC8gODsKKworCQkvKiByZWxlYXNlIGxvY2FsIHJlc2V0ICovCisJCVNLX09VVDgoSW9DLCBSQl9BRERSKFF1SW9PZmZzLCBSQl9DVFJMKSwgUkJfUlNUX0NMUik7CisKKwkJLyogY29uZmlndXJlIGFkZHJlc3NlcyAqLworCQlTS19PVVQzMihJb0MsIFJCX0FERFIoUXVJb09mZnMsIFJCX1NUQVJUKSwgUXVTdGFydEFkZHIpOworCQlTS19PVVQzMihJb0MsIFJCX0FERFIoUXVJb09mZnMsIFJCX0VORCksIFF1RW5kQWRkcik7CisJCVNLX09VVDMyKElvQywgUkJfQUREUihRdUlvT2ZmcywgUkJfV1ApLCBRdVN0YXJ0QWRkcik7CisJCVNLX09VVDMyKElvQywgUkJfQUREUihRdUlvT2ZmcywgUkJfUlApLCBRdVN0YXJ0QWRkcik7CisKKwkJc3dpdGNoIChRdVR5cGUpIHsKKwkJY2FzZSBTS19SWF9TUkFNX1E6CisJCQkvKiBjb25maWd1cmUgdGhyZXNob2xkIGZvciBzbWFsbCBSeCBRdWV1ZSAqLworCQkJUnhMb1RocmVzVmFsICs9IChTS19SQl9MTFBQX0IgLSBTS19SQl9MTFBQX1MpIC8gODsKKworCQkJLyogY29udGludWUgd2l0aCBTS19SWF9CUkFNX1EgKi8KKwkJY2FzZSBTS19SWF9CUkFNX1E6CisJCQkvKiB3cml0ZSB0aHJlc2hvbGQgZm9yIFJ4IFF1ZXVlICovCisKKwkJCVNLX09VVDMyKElvQywgUkJfQUREUihRdUlvT2ZmcywgUkJfUlhfVVRQUCksIFJ4VXBUaHJlc1ZhbCk7CisJCQlTS19PVVQzMihJb0MsIFJCX0FERFIoUXVJb09mZnMsIFJCX1JYX0xUUFApLCBSeExvVGhyZXNWYWwpOworCisJCQkvKiB0aGUgaGlnaCBwcmlvcml0eSB0aHJlc2hvbGQgbm90IHVzZWQgKi8KKwkJCWJyZWFrOworCQljYXNlIFNLX1RYX1JBTV9ROgorCQkJLyoKKwkJCSAqIERvIE5PVCB1c2UgU3RvcmUgJiBGb3J3YXJkIHVuZGVyIG5vcm1hbCBvcGVyYXRpb24gZHVlIHRvCisJCQkgKiBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gKEdFTkVTSVMgb25seSkuCisJCQkgKiBCdXQgaWYgSnVtYm8gRnJhbWVzIGFyZSBjb25maWd1cmVkIChYTUFDIFR4IEZJRk8gaXMgb25seSA0IGtCKQorCQkJICogb3IgWVVLT04gaXMgdXNlZCAoKEdNQUMgVHggRklGTyBpcyBvbmx5IDEga0IpCisJCQkgKiB3ZSBORUVEIFN0b3JlICYgRm9yd2FyZCBvZiB0aGUgUkFNIGJ1ZmZlci4KKwkJCSAqLworCQkJaWYgKHBBQy0+R0luaS5HSVBvcnRVc2FnZSA9PSBTS19KVU1CT19MSU5LIHx8CisJCQkJcEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJCQkvKiBlbmFibGUgU3RvcmUgJiBGb3J3YXJkIE1vZGUgZm9yIHRoZSBUeCBTaWRlICovCisJCQkJU0tfT1VUOChJb0MsIFJCX0FERFIoUXVJb09mZnMsIFJCX0NUUkwpLCBSQl9FTkFfU1RGV0QpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvKiBzZXQgcXVldWUgb3BlcmF0aW9uYWwgKi8KKwkJU0tfT1VUOChJb0MsIFJCX0FERFIoUXVJb09mZnMsIFJCX0NUUkwpLCBSQl9FTkFfT1BfTUQpOworCX0KKwllbHNlIHsKKwkJLyogZW5zdXJlIHRoZSBxdWV1ZSBpcyBzdGlsbCBkaXNhYmxlZCAqLworCQlTS19PVVQ4KElvQywgUkJfQUREUihRdUlvT2ZmcywgUkJfQ1RSTCksIFJCX1JTVF9TRVQpOworCX0KK30JLyogRG9Jbml0UmFtUXVldWUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUluaXRSYW1CdWZzKCkgLSBJbml0aWFsaXplIHRoZSBSQU0gQnVmZmVyIFF1ZXVlcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJSW5pdGlhbGl6ZSBhbGwgUkFNIEJ1ZmZlciBRdWV1ZXMgb2YgdGhlIHNwZWNpZmllZCBwb3J0CisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLworc3RhdGljIHZvaWQgU2tHZUluaXRSYW1CdWZzKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19HRVBPUlQgKnBQcnQ7CisJaW50IFJ4UVR5cGU7CisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCWlmIChwUHJ0LT5QUnhRU2l6ZSA9PSBTS19NSU5fUlhRX1NJWkUpIHsKKwkJUnhRVHlwZSA9IFNLX1JYX1NSQU1fUTsgCS8qIHNtYWxsIFJ4IFF1ZXVlICovCisJfQorCWVsc2UgeworCQlSeFFUeXBlID0gU0tfUlhfQlJBTV9ROwkJLyogYmlnIFJ4IFF1ZXVlICovCisJfQorCisJRG9Jbml0UmFtUXVldWUocEFDLCBJb0MsIHBQcnQtPlBSeFFPZmYsIHBQcnQtPlBSeFFSYW1TdGFydCwKKwkJcFBydC0+UFJ4UVJhbUVuZCwgUnhRVHlwZSk7CisJCisJRG9Jbml0UmFtUXVldWUocEFDLCBJb0MsIHBQcnQtPlBYc1FPZmYsIHBQcnQtPlBYc1FSYW1TdGFydCwKKwkJcFBydC0+UFhzUVJhbUVuZCwgU0tfVFhfUkFNX1EpOworCQorCURvSW5pdFJhbVF1ZXVlKHBBQywgSW9DLCBwUHJ0LT5QWGFRT2ZmLCBwUHJ0LT5QWGFRUmFtU3RhcnQsCisJCXBQcnQtPlBYYVFSYW1FbmQsIFNLX1RYX1JBTV9RKTsKKworfQkvKiBTa0dlSW5pdFJhbUJ1ZnMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUluaXRSYW1JZmFjZSgpIC0gSW5pdGlhbGl6ZSB0aGUgUkFNIEludGVyZmFjZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgQWRhcHRlcnMgUkFNIEludGVyZmFjZS4KKyAqCisgKiBOb3RlOgorICoJVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIHRoZSBkaWFnbm9zdGljcy4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrR2VJbml0UmFtSWZhY2UoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DKQkJLyogSU8gY29udGV4dCAqLworeworCS8qIHJlbGVhc2UgbG9jYWwgcmVzZXQgKi8KKwlTS19PVVQxNihJb0MsIEIzX1JJX0NUUkwsIFJJX1JTVF9DTFIpOworCisJLyogY29uZmlndXJlIHRpbWVvdXQgdmFsdWVzICovCisJU0tfT1VUOChJb0MsIEIzX1JJX1dUT19SMSwgU0tfUklfVE9fNTMpOworCVNLX09VVDgoSW9DLCBCM19SSV9XVE9fWEExLCBTS19SSV9UT181Myk7CisJU0tfT1VUOChJb0MsIEIzX1JJX1dUT19YUzEsIFNLX1JJX1RPXzUzKTsKKwlTS19PVVQ4KElvQywgQjNfUklfUlRPX1IxLCBTS19SSV9UT181Myk7CisJU0tfT1VUOChJb0MsIEIzX1JJX1JUT19YQTEsIFNLX1JJX1RPXzUzKTsKKwlTS19PVVQ4KElvQywgQjNfUklfUlRPX1hTMSwgU0tfUklfVE9fNTMpOworCVNLX09VVDgoSW9DLCBCM19SSV9XVE9fUjIsIFNLX1JJX1RPXzUzKTsKKwlTS19PVVQ4KElvQywgQjNfUklfV1RPX1hBMiwgU0tfUklfVE9fNTMpOworCVNLX09VVDgoSW9DLCBCM19SSV9XVE9fWFMyLCBTS19SSV9UT181Myk7CisJU0tfT1VUOChJb0MsIEIzX1JJX1JUT19SMiwgU0tfUklfVE9fNTMpOworCVNLX09VVDgoSW9DLCBCM19SSV9SVE9fWEEyLCBTS19SSV9UT181Myk7CisJU0tfT1VUOChJb0MsIEIzX1JJX1JUT19YUzIsIFNLX1JJX1RPXzUzKTsKKworfQkvKiBTa0dlSW5pdFJhbUlmYWNlICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VJbml0Qm11KCkgLSBJbml0aWFsaXplIHRoZSBCTVUgc3RhdGUgbWFjaGluZXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUluaXRpYWxpemUgYWxsIEJNVSBzdGF0ZSBtYWNoaW5lcyBvZiB0aGUgc3BlY2lmaWVkIHBvcnQKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCitzdGF0aWMgdm9pZCBTa0dlSW5pdEJtdSgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OworCVNLX1UzMgkJUnhXbTsKKwlTS19VMzIJCVR4V207CisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCVJ4V20gPSBTS19CTVVfUlhfV007CisJVHhXbSA9IFNLX0JNVV9UWF9XTTsKKwkKKwlpZiAoIXBBQy0+R0luaS5HSVBjaVNsb3Q2NCAmJiAhcEFDLT5HSW5pLkdJUGNpQ2xvY2s2NikgeworCQkvKiBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlICovCisJCVJ4V20gLz0gMjsKKwkJVHhXbSAvPSAyOworCX0KKworCS8qIFJ4IFF1ZXVlOiBSZWxlYXNlIGFsbCBsb2NhbCByZXNldHMgYW5kIHNldCB0aGUgd2F0ZXJtYXJrICovCisJU0tfT1VUMzIoSW9DLCBRX0FERFIocFBydC0+UFJ4UU9mZiwgUV9DU1IpLCBDU1JfQ0xSX1JFU0VUKTsKKwlTS19PVVQzMihJb0MsIFFfQUREUihwUHJ0LT5QUnhRT2ZmLCBRX0YpLCBSeFdtKTsKKworCS8qCisJICogVHggUXVldWU6IFJlbGVhc2UgYWxsIGxvY2FsIHJlc2V0cyBpZiB0aGUgcXVldWUgaXMgdXNlZCAhCisJICogCQlzZXQgd2F0ZXJtYXJrCisJICovCisJaWYgKHBQcnQtPlBYU1FTaXplICE9IDApIHsKKwkJU0tfT1VUMzIoSW9DLCBRX0FERFIocFBydC0+UFhzUU9mZiwgUV9DU1IpLCBDU1JfQ0xSX1JFU0VUKTsKKwkJU0tfT1VUMzIoSW9DLCBRX0FERFIocFBydC0+UFhzUU9mZiwgUV9GKSwgVHhXbSk7CisJfQorCQorCWlmIChwUHJ0LT5QWEFRU2l6ZSAhPSAwKSB7CisJCVNLX09VVDMyKElvQywgUV9BRERSKHBQcnQtPlBYYVFPZmYsIFFfQ1NSKSwgQ1NSX0NMUl9SRVNFVCk7CisJCVNLX09VVDMyKElvQywgUV9BRERSKHBQcnQtPlBYYVFPZmYsIFFfRiksIFR4V20pOworCX0KKwkvKgorCSAqIERvIE5PVCBlbmFibGUgdGhlIGRlc2NyaXB0b3IgcG9sbCB0aW1lcnMgaGVyZSwgYmVjYXVzZQorCSAqIHRoZSBkZXNjcmlwdG9yIGFkZHJlc3NlcyBhcmUgbm90IHNwZWNpZmllZCB5ZXQuCisJICovCit9CS8qIFNrR2VJbml0Qm11ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVRlc3RTdG9wQml0KCkgLQlUZXN0IHRoZSBzdG9wIGJpdCBvZiB0aGUgcXVldWUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVN0b3BwaW5nIGEgcXVldWUgaXMgbm90IGFzIHNpbXBsZSBhcyBpdCBzZWVtcyB0byBiZS4KKyAqCUlmIGRlc2NyaXB0b3IgcG9sbGluZyBpcyBlbmFibGVkLCBpdCBtYXkgaGFwcGVuCisgKgl0aGF0IFJYL1RYIHN0b3AgaXMgZG9uZSBhbmQgU1YgaWRsZSBpcyBOT1Qgc2V0LgorICoJSW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gaXNzdWUgYW5vdGhlciBzdG9wIGNvbW1hbmQuCisgKgorICogUmV0dXJuczoKKyAqCVRoZSBxdWV1ZXMgY29udHJvbCBzdGF0dXMgcmVnaXN0ZXIKKyAqLworc3RhdGljIFNLX1UzMiBUZXN0U3RvcEJpdCgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBDb250ZXh0ICovCitpbnQJCVF1SW9PZmZzKQkvKiBRdWV1ZSBJTyBBZGRyZXNzIE9mZnNldCAqLworeworCVNLX1UzMglRdUNzcjsJLyogQ1NSIGNvbnRlbnRzICovCisKKwlTS19JTjMyKElvQywgUV9BRERSKFF1SW9PZmZzLCBRX0NTUiksICZRdUNzcik7CisJCisJaWYgKChRdUNzciAmIChDU1JfU1RPUCB8IENTUl9TVl9JRExFKSkgPT0gMCkgeworCQkvKiBTdG9wIERlc2NyaXB0b3Igb3ZlcnJpZGRlbiBieSBzdGFydCBjb21tYW5kICovCisJCVNLX09VVDMyKElvQywgUV9BRERSKFF1SW9PZmZzLCBRX0NTUiksIENTUl9TVE9QKTsKKworCQlTS19JTjMyKElvQywgUV9BRERSKFF1SW9PZmZzLCBRX0NTUiksICZRdUNzcik7CisJfQorCQorCXJldHVybihRdUNzcik7Cit9CS8qIFRlc3RTdG9wQml0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VTdG9wUG9ydCgpIC0gU3RvcCB0aGUgUngvVHggYWN0aXZpdHkgb2YgdGhlIHBvcnQgJ1BvcnQnLgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJQWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRoZSBkZXNjcmlwdG9yIHJpbmdzIGFuZCBSeCBhbmQgVHgKKyAqCXF1ZXVlcyBvZiB0aGlzIHBvcnQgbWF5IGJlIHJlY29uZmlndXJlZC4KKyAqCisgKglJdCBpcyBwb3NzaWJsZSB0byBzdG9wIHRoZSByZWNlaXZlIGFuZCB0cmFuc21pdCBwYXRoIHNlcGFyYXRlIG9yCisgKglib3RoIHRvZ2V0aGVyLgorICoKKyAqCURpciA9CVNLX1NUT1BfVFggCVN0b3BzIHRoZSB0cmFuc21pdCBwYXRoIG9ubHkgYW5kIHJlc2V0cyB0aGUgTUFDLgorICoJCQkJVGhlIHJlY2VpdmUgcXVldWUgaXMgc3RpbGwgYWN0aXZlIGFuZAorICoJCQkJdGhlIHBlbmRpbmcgUnggZnJhbWVzIG1heSBiZSBzdGlsbCB0cmFuc2ZlcnJlZAorICoJCQkJaW50byB0aGUgUnhELgorICoJCVNLX1NUT1BfUlgJU3RvcCB0aGUgcmVjZWl2ZSBwYXRoLiBUaGUgdGFuc21pdCBwYXRoCisgKgkJCQloYXMgdG8gYmUgc3RvcHBlZCBvbmNlIGJlZm9yZS4KKyAqCQlTS19TVE9QX0FMTAlTS19TVE9QX1RYICsgU0tfU1RPUF9SWAorICoKKyAqCVJzdE1vZGUgPSBTS19TT0ZUX1JTVAlSZXNldHMgdGhlIE1BQy4gVGhlIFBIWSBpcyBzdGlsbCBhbGl2ZS4KKyAqCQkJU0tfSEFSRF9SU1QJUmVzZXRzIHRoZSBNQUMgYW5kIHRoZSBQSFkuCisgKgorICogRXhhbXBsZToKKyAqCTEpIEEgTGluayBEb3duIGV2ZW50IHdhcyBzaWduYWxlZCBmb3IgYSBwb3J0LiBUaGVyZWZvcmUgdGhlIGFjdGl2aXR5CisgKglvZiB0aGlzIHBvcnQgc2hvdWxkIGJlIHN0b3BwZWQgYW5kIGEgaGFyZHdhcmUgcmVzZXQgc2hvdWxkIGJlIGlzc3VlZAorICoJdG8gZW5hYmxlIHRoZSB3b3JrYXJvdW5kIG9mIFhNQUMgRXJyYXRhICMyLiBCdXQgdGhlIHJlY2VpdmVkIGZyYW1lcworICoJc2hvdWxkIG5vdCBiZSBkaXNjYXJkZWQuCisgKgkJLi4uCisgKgkJU2tHZVN0b3BQb3J0KHBBQywgSW9DLCBQb3J0LCBTS19TVE9QX1RYLCBTS19IQVJEX1JTVCk7CisgKgkJKHRyYW5zZmVyIGFsbCBwZW5kaW5nIFJ4IGZyYW1lcykKKyAqCQlTa0dlU3RvcFBvcnQocEFDLCBJb0MsIFBvcnQsIFNLX1NUT1BfUlgsIFNLX0hBUkRfUlNUKTsKKyAqCQkuLi4KKyAqCisgKgkyKSBBbiBldmVudCB3YXMgaXNzdWVkIHdoaWNoIHJlcXVlc3QgdGhlIGRyaXZlciB0byBzd2l0Y2gKKyAqCXRoZSAndmlydHVhbCBhY3RpdmUnIGxpbmsgdG8gYW4gb3RoZXIgYWxyZWFkeSBhY3RpdmUgcG9ydAorICoJYXMgc29vbiBhcyBwb3NzaWJsZS4gVGhlIGZyYW1lcyBpbiB0aGUgcmVjZWl2ZSBxdWV1ZSBvZiB0aGlzCisgKglwb3J0IG1heSBiZSBsb3N0LiBCdXQgdGhlIFBIWSBtdXN0IG5vdCBiZSByZXNldCBkdXJpbmcgdGhpcworICoJZXZlbnQuCisgKgkJLi4uCisgKgkJU2tHZVN0b3BQb3J0KHBBQywgSW9DLCBQb3J0LCBTS19TVE9QX0FMTCwgU0tfU09GVF9SU1QpOworICoJCS4uLgorICoKKyAqIEV4dGVuZGVkIERlc2NyaXB0aW9uOgorICoJSWYgU0tfU1RPUF9UWCBpcyBzZXQsCisgKgkJbyBkaXNhYmxlIHRoZSBNQUMncyByZWNlaXZlIGFuZCB0cmFuc21pdHRlciB0byBwcmV2ZW50CisgKgkJICBmcm9tIHNlbmRpbmcgaW5jb21wbGV0ZSBmcmFtZXMKKyAqCQlvIHN0b3AgdGhlIHBvcnQncyB0cmFuc21pdCBxdWV1ZXMgYmVmb3JlIHRlcm1pbmF0aW5nIHRoZQorICoJCSAgQk1VcyB0byBwcmV2ZW50IGZyb20gcGVyZm9ybWluZyBpbmNvbXBsZXRlIFBDSSBjeWNsZXMKKyAqCQkgIG9uIHRoZSBQQ0kgYnVzCisgKgkJLSBUaGUgbmV0d29yayBSeCBhbmQgVHggYWN0aXZpdHkgYW5kIFBDSSBUeCB0cmFuc2ZlciBpcworICoJCSAgZGlzYWJsZWQgbm93LgorICoJCW8gcmVzZXQgdGhlIE1BQyBkZXBlbmRpbmcgb24gdGhlIFJzdE1vZGUKKyAqCQlvIFN0b3AgSW50ZXJ2YWwgVGltZXIgYW5kIExpbWl0IENvdW50ZXIgb2YgVHggQXJiaXRlciwKKyAqCQkgIGFsc28gZGlzYWJsZSBGb3JjZSBTeW5jIGJpdCBhbmQgRW5hYmxlIEFsbG9jIGJpdC4KKyAqCQlvIHBlcmZvcm0gYSBsb2NhbCByZXNldCBvZiB0aGUgcG9ydCdzIFR4IHBhdGgKKyAqCQkJLSByZXNldCB0aGUgUENJIEZJRk8gb2YgdGhlIGFzeW5jIFR4IHF1ZXVlCisgKgkJCS0gcmVzZXQgdGhlIFBDSSBGSUZPIG9mIHRoZSBzeW5jIFR4IHF1ZXVlCisgKgkJCS0gcmVzZXQgdGhlIFJBTSBCdWZmZXIgYXN5bmMgVHggcXVldWUKKyAqCQkJLSByZXNldCB0aGUgUkFNIEJ1ZmZlciBzeW5jIFR4IHF1ZXVlCisgKgkJCS0gcmVzZXQgdGhlIE1BQyBUeCBGSUZPCisgKgkJbyBzd2l0Y2ggTGluayBhbmQgVHggTEVEIG9mZiwgc3RvcCB0aGUgTEVEIGNvdW50ZXJzCisgKgorICoJSWYgU0tfU1RPUF9SWCBpcyBzZXQsCisgKgkJbyBzdG9wIHRoZSBwb3J0J3MgcmVjZWl2ZSBxdWV1ZQorICoJCS0gVGhlIHBhdGggZGF0YSB0cmFuc2ZlciBhY3Rpdml0eSBpcyBmdWxseSBzdG9wcGVkIG5vdy4KKyAqCQlvIHBlcmZvcm0gYSBsb2NhbCByZXNldCBvZiB0aGUgcG9ydCdzIFJ4IHBhdGgKKyAqCQkJLSByZXNldCB0aGUgUENJIEZJRk8gb2YgdGhlIFJ4IHF1ZXVlCisgKgkJCS0gcmVzZXQgdGhlIFJBTSBCdWZmZXIgcmVjZWl2ZSBxdWV1ZQorICoJCQktIHJlc2V0IHRoZSBNQUMgUnggRklGTworICoJCW8gc3dpdGNoIFJ4IExFRCBvZmYsIHN0b3AgdGhlIExFRCBjb3VudGVyCisgKgorICoJSWYgYWxsIHBvcnRzIGFyZSBzdG9wcGVkLAorICoJCW8gcmVzZXQgdGhlIFJBTSBJbnRlcmZhY2UuCisgKgorICogTm90ZXM6CisgKglvIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBkdXJpbmcgdGhlIGRyaXZlciBzdGF0ZXMgUkVTRVRfUE9SVCBhbmQKKyAqCSAgU1dJVENIX1BPUlQuCisgKi8KK3ZvaWQgU2tHZVN0b3BQb3J0KAorU0tfQUMJKnBBQywJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJL08gY29udGV4dCAqLworaW50CQlQb3J0LAkvKiBwb3J0IHRvIHN0b3AgKE1BQ18xICsgbikgKi8KK2ludAkJRGlyLAkvKiBEaXJlY3Rpb24gdG8gU3RvcCAoU0tfU1RPUF9SWCwgU0tfU1RPUF9UWCwgU0tfU1RPUF9BTEwpICovCitpbnQJCVJzdE1vZGUpLyogUmVzZXQgTW9kZSAoU0tfU09GVF9SU1QsIFNLX0hBUkRfUlNUKSAqLworeworI2lmbmRlZiBTS19ESUFHCisJU0tfRVZQQVJBIFBhcmE7CisjZW5kaWYgLyogIVNLX0RJQUcgKi8KKwlTS19HRVBPUlQgKnBQcnQ7CisJU0tfVTMyCURXb3JkOworCVNLX1UzMglYc0NzcjsKKwlTS19VMzIJWGFDc3I7CisJU0tfVTY0CVRvdXRTdGFydDsKKwlpbnQJCWk7CisJaW50CQlUb3V0Q250OworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlpZiAoKERpciAmIFNLX1NUT1BfVFgpICE9IDApIHsKKwkJLyogZGlzYWJsZSByZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXIgKi8KKwkJU2tNYWNSeFR4RGlzYWJsZShwQUMsIElvQywgUG9ydCk7CisJCQorCQkvKiBzdG9wIGJvdGggdHJhbnNtaXQgcXVldWVzICovCisJCS8qCisJCSAqIElmIHRoZSBCTVUgaXMgaW4gdGhlIHJlc2V0IHN0YXRlIENTUl9TVE9QIHdpbGwgdGVybWluYXRlCisJCSAqIGltbWVkaWF0ZWx5LgorCQkgKi8KKwkJU0tfT1VUMzIoSW9DLCBRX0FERFIocFBydC0+UFhzUU9mZiwgUV9DU1IpLCBDU1JfU1RPUCk7CisJCVNLX09VVDMyKElvQywgUV9BRERSKHBQcnQtPlBYYVFPZmYsIFFfQ1NSKSwgQ1NSX1NUT1ApOworCisJCVRvdXRTdGFydCA9IFNrT3NHZXRUaW1lKHBBQyk7CisJCVRvdXRDbnQgPSAwOworCQlkbyB7CisJCQkvKgorCQkJICogQ2xlYXIgcGFja2V0IGFyYml0ZXIgdGltZW91dCB0byBtYWtlIHN1cmUKKwkJCSAqIHRoaXMgbG9vcCB3aWxsIHRlcm1pbmF0ZS4KKwkJCSAqLworCQkJU0tfT1VUMTYoSW9DLCBCM19QQV9DVFJMLCAoU0tfVTE2KSgoUG9ydCA9PSBNQUNfMSkgPworCQkJCVBBX0NMUl9UT19UWDEgOiBQQV9DTFJfVE9fVFgyKSk7CisKKwkJCS8qCisJCQkgKiBJZiB0aGUgdHJhbnNmZXIgc3R1Y2tzIGF0IHRoZSBNQUMgdGhlIFNUT1AgY29tbWFuZCB3aWxsIG5vdAorCQkJICogdGVybWluYXRlIGlmIHdlIGRvbid0IGZsdXNoIHRoZSBYTUFDJ3MgdHJhbnNtaXQgRklGTyAhCisJCQkgKi8KKwkJCVNrTWFjRmx1c2hUeEZpZm8ocEFDLCBJb0MsIFBvcnQpOworCisJCQlYc0NzciA9IFRlc3RTdG9wQml0KHBBQywgSW9DLCBwUHJ0LT5QWHNRT2ZmKTsKKwkJCVhhQ3NyID0gVGVzdFN0b3BCaXQocEFDLCBJb0MsIHBQcnQtPlBYYVFPZmYpOworCisJCQlpZiAoU2tPc0dldFRpbWUocEFDKSAtIFRvdXRTdGFydCA+IChTS19USUNLU19QRVJfU0VDIC8gMTgpKSB7CisJCQkJLyoKKwkJCQkgKiBUaW1lb3V0IG9mIDEvMTggc2Vjb25kIHJlYWNoZWQuCisJCQkJICogVGhpcyBuZWVkcyB0byBiZSBjaGVja2VkIGF0IDEvMTggc2VjIG9ubHkuCisJCQkJICovCisJCQkJVG91dENudCsrOworCQkJCWlmIChUb3V0Q250ID4gMSkgeworCQkJCQkvKiBNaWdodCBiZSBhIHByb2JsZW0gd2hlbiB0aGUgZHJpdmVyIGV2ZW50IGhhbmRsZXIKKwkJCQkJICogY2FsbHMgU3RvcFBvcnQgYWdhaW4uIFhYWC4KKwkJCQkJICovCisKKwkJCQkJLyogRmF0YWwgRXJyb3IsIExvb3AgYWJvcnRlZCAqLworCQkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX0hXSV9FMDE4LAorCQkJCQkJU0tFUlJfSFdJX0UwMThNU0cpOworI2lmbmRlZiBTS19ESUFHCisJCQkJCVBhcmEuUGFyYTY0ID0gUG9ydDsKKwkJCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9QT1JUX0ZBSUwsIFBhcmEpOworI2VuZGlmIC8qICFTS19ESUFHICovCisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBDYWNoZSBpbmNvaGVyZW5jeSB3b3JrYXJvdW5kOiBBc3N1bWUgYSBzdGFydCBjb21tYW5kCisJCQkJICogaGFzIGJlZW4gbG9zdCB3aGlsZSBzZW5kaW5nIHRoZSBmcmFtZS4KKwkJCQkgKi8KKwkJCQlUb3V0U3RhcnQgPSBTa09zR2V0VGltZShwQUMpOworCisJCQkJaWYgKChYc0NzciAmIENTUl9TVE9QKSAhPSAwKSB7CisJCQkJCVNLX09VVDMyKElvQywgUV9BRERSKHBQcnQtPlBYc1FPZmYsIFFfQ1NSKSwgQ1NSX1NUQVJUKTsKKwkJCQl9CisJCQkJaWYgKChYYUNzciAmIENTUl9TVE9QKSAhPSAwKSB7CisJCQkJCVNLX09VVDMyKElvQywgUV9BRERSKHBQcnQtPlBYYVFPZmYsIFFfQ1NSKSwgQ1NSX1NUQVJUKTsKKwkJCQl9CisJCQl9CisKKwkJCS8qCisJCQkgKiBCZWNhdXNlIG9mIHRoZSBBU0lDIHByb2JsZW0gcmVwb3J0IGVudHJ5IGZyb20gMjEuMDguMTk5OCBpdCBpcworCQkJICogcmVxdWlyZWQgdG8gd2FpdCB1bnRpbCBDU1JfU1RPUCBpcyByZXNldCBhbmQgQ1NSX1NWX0lETEUgaXMgc2V0LgorCQkJICovCisJCX0gd2hpbGUgKChYc0NzciAmIChDU1JfU1RPUCB8IENTUl9TVl9JRExFKSkgIT0gQ1NSX1NWX0lETEUgfHwKKwkJCQkgKFhhQ3NyICYgKENTUl9TVE9QIHwgQ1NSX1NWX0lETEUpKSAhPSBDU1JfU1ZfSURMRSk7CisKKwkJLyogUmVzZXQgdGhlIE1BQyBkZXBlbmRpbmcgb24gdGhlIFJzdE1vZGUgKi8KKwkJaWYgKFJzdE1vZGUgPT0gU0tfU09GVF9SU1QpIHsKKwkJCVNrTWFjU29mdFJzdChwQUMsIElvQywgUG9ydCk7CisJCX0KKwkJZWxzZSB7CisJCQlTa01hY0hhcmRSc3QocEFDLCBJb0MsIFBvcnQpOworCQl9CisgCQkKKwkJLyogRGlzYWJsZSBGb3JjZSBTeW5jIGJpdCBhbmQgRW5hYmxlIEFsbG9jIGJpdCAqLworCQlTS19PVVQ4KElvQywgTVJfQUREUihQb3J0LCBUWEFfQ1RSTCksCisJCQlUWEFfRElTX0ZTWU5DIHwgVFhBX0RJU19BTExPQyB8IFRYQV9TVE9QX1JDKTsKKwkJCisJCS8qIFN0b3AgSW50ZXJ2YWwgVGltZXIgYW5kIExpbWl0IENvdW50ZXIgb2YgVHggQXJiaXRlciAqLworCQlTS19PVVQzMihJb0MsIE1SX0FERFIoUG9ydCwgVFhBX0lUSV9JTkkpLCAwTCk7CisJCVNLX09VVDMyKElvQywgTVJfQUREUihQb3J0LCBUWEFfTElNX0lOSSksIDBMKTsKKworCQkvKiBQZXJmb3JtIGEgbG9jYWwgcmVzZXQgb2YgdGhlIHBvcnQncyBUeCBwYXRoICovCisKKwkJLyogUmVzZXQgdGhlIFBDSSBGSUZPIG9mIHRoZSBhc3luYyBUeCBxdWV1ZSAqLworCQlTS19PVVQzMihJb0MsIFFfQUREUihwUHJ0LT5QWGFRT2ZmLCBRX0NTUiksIENTUl9TRVRfUkVTRVQpOworCQkvKiBSZXNldCB0aGUgUENJIEZJRk8gb2YgdGhlIHN5bmMgVHggcXVldWUgKi8KKwkJU0tfT1VUMzIoSW9DLCBRX0FERFIocFBydC0+UFhzUU9mZiwgUV9DU1IpLCBDU1JfU0VUX1JFU0VUKTsKKwkJLyogUmVzZXQgdGhlIFJBTSBCdWZmZXIgYXN5bmMgVHggcXVldWUgKi8KKwkJU0tfT1VUOChJb0MsIFJCX0FERFIocFBydC0+UFhhUU9mZiwgUkJfQ1RSTCksIFJCX1JTVF9TRVQpOworCQkvKiBSZXNldCB0aGUgUkFNIEJ1ZmZlciBzeW5jIFR4IHF1ZXVlICovCisJCVNLX09VVDgoSW9DLCBSQl9BRERSKHBQcnQtPlBYc1FPZmYsIFJCX0NUUkwpLCBSQl9SU1RfU0VUKTsKKwkJCisJCS8qIFJlc2V0IFR4IE1BQyBGSUZPICovCisjaWZkZWYgR0VORVNJUworCQlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkJLyogTm90ZTogTUZGX1JTVF9TRVQgZG9lcyBOT1QgcmVzZXQgdGhlIFhNQUMgISAqLworCQkJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgVFhfTUZGX0NUUkwyKSwgTUZGX1JTVF9TRVQpOworCisJCQkvKiBzd2l0Y2ggTGluayBhbmQgVHggTEVEIG9mZiwgc3RvcCB0aGUgTEVEIGNvdW50ZXJzICovCisJCQkvKiBMaW5rIExFRCBpcyBzd2l0Y2hlZCBvZmYgYnkgdGhlIFJMTVQgYW5kIHRoZSBEaWFnIGl0c2VsZiAqLworCQkJU2tHZVhtaXRMRUQocEFDLCBJb0MsIE1SX0FERFIoUG9ydCwgVFhfTEVEX0lOSSksIFNLX0xFRF9ESVMpOworCQl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJCWlmIChwQUMtPkdJbmkuR0lZdWtvbikgeworCQkJLyogUmVzZXQgVFggTUFDIEZJRk8gKi8KKwkJCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIFRYX0dNRl9DVFJMX1QpLCAoU0tfVTgpR01GX1JTVF9TRVQpOworCQl9CisjZW5kaWYgLyogWVVLT04gKi8KKwl9CisKKwlpZiAoKERpciAmIFNLX1NUT1BfUlgpICE9IDApIHsKKwkJLyoKKwkJICogVGhlIFJYIFN0b3AgQ29tbWFuZCB3aWxsIG5vdCB0ZXJtaW5hdGUgaWYgbm8gYnVmZmVycworCQkgKiBhcmUgcXVldWVkIGluIHRoZSBSeEQgcmluZy4gQnV0IGl0IHdpbGwgYWx3YXlzIHJlYWNoCisJCSAqIHRoZSBJZGxlIHN0YXRlLiBUaGVyZWZvcmUgd2UgY2FuIHVzZSB0aGlzIGZlYXR1cmUgdG8KKwkJICogc3RvcCB0aGUgdHJhbnNmZXIgb2YgcmVjZWl2ZWQgcGFja2V0cy4KKwkJICovCisJCS8qIHN0b3AgdGhlIHBvcnQncyByZWNlaXZlIHF1ZXVlICovCisJCVNLX09VVDMyKElvQywgUV9BRERSKHBQcnQtPlBSeFFPZmYsIFFfQ1NSKSwgQ1NSX1NUT1ApOworCQkKKwkJaSA9IDEwMDsKKwkJZG8geworCQkJLyoKKwkJCSAqIENsZWFyIHBhY2tldCBhcmJpdGVyIHRpbWVvdXQgdG8gbWFrZSBzdXJlCisJCQkgKiB0aGlzIGxvb3Agd2lsbCB0ZXJtaW5hdGUKKwkJCSAqLworCQkJU0tfT1VUMTYoSW9DLCBCM19QQV9DVFJMLCAoU0tfVTE2KSgoUG9ydCA9PSBNQUNfMSkgPworCQkJCVBBX0NMUl9UT19SWDEgOiBQQV9DTFJfVE9fUlgyKSk7CisKKwkJCURXb3JkID0gVGVzdFN0b3BCaXQocEFDLCBJb0MsIHBQcnQtPlBSeFFPZmYpOworCisJCQkvKiB0aW1lb3V0IGlmIGk9PTAgKGJ1ZyBmaXggZm9yICMxMDc0OCkgKi8KKwkJCWlmICgtLWkgPT0gMCkgeworCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVywgU0tFUlJfSFdJX0UwMjQsCisJCQkJCVNLRVJSX0hXSV9FMDI0TVNHKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qCisJCQkgKiBiZWNhdXNlIG9mIHRoZSBBU0lDIHByb2JsZW0gcmVwb3J0IGVudHJ5IGZyb20gMjEuMDguOTgKKwkJCSAqIGl0IGlzIHJlcXVpcmVkIHRvIHdhaXQgdW50aWwgQ1NSX1NUT1AgaXMgcmVzZXQgYW5kCisJCQkgKiBDU1JfU1ZfSURMRSBpcyBzZXQuCisJCQkgKi8KKwkJfSB3aGlsZSAoKERXb3JkICYgKENTUl9TVE9QIHwgQ1NSX1NWX0lETEUpKSAhPSBDU1JfU1ZfSURMRSk7CisKKwkJLyogVGhlIHBhdGggZGF0YSB0cmFuc2ZlciBhY3Rpdml0eSBpcyBmdWxseSBzdG9wcGVkIG5vdyAqLworCisJCS8qIFBlcmZvcm0gYSBsb2NhbCByZXNldCBvZiB0aGUgcG9ydCdzIFJ4IHBhdGggKi8KKworCQkgLyoJUmVzZXQgdGhlIFBDSSBGSUZPIG9mIHRoZSBSeCBxdWV1ZSAqLworCQlTS19PVVQzMihJb0MsIFFfQUREUihwUHJ0LT5QUnhRT2ZmLCBRX0NTUiksIENTUl9TRVRfUkVTRVQpOworCQkvKiBSZXNldCB0aGUgUkFNIEJ1ZmZlciByZWNlaXZlIHF1ZXVlICovCisJCVNLX09VVDgoSW9DLCBSQl9BRERSKHBQcnQtPlBSeFFPZmYsIFJCX0NUUkwpLCBSQl9SU1RfU0VUKTsKKworCQkvKiBSZXNldCBSeCBNQUMgRklGTyAqLworI2lmZGVmIEdFTkVTSVMKKwkJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCQorCQkJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgUlhfTUZGX0NUUkwyKSwgTUZGX1JTVF9TRVQpOworCisJCQkvKiBzd2l0Y2ggUnggTEVEIG9mZiwgc3RvcCB0aGUgTEVEIGNvdW50ZXIgKi8KKwkJCVNrR2VYbWl0TEVEKHBBQywgSW9DLCBNUl9BRERSKFBvcnQsIFJYX0xFRF9JTkkpLCBTS19MRURfRElTKTsKKwkJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCQlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJCS8qIFJlc2V0IFJ4IE1BQyBGSUZPICovCisJCQlTS19PVVQ4KElvQywgTVJfQUREUihQb3J0LCBSWF9HTUZfQ1RSTF9UKSwgKFNLX1U4KUdNRl9SU1RfU0VUKTsKKwkJfQorI2VuZGlmIC8qIFlVS09OICovCisJfQorfQkvKiBTa0dlU3RvcFBvcnQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUluaXQwKCkgLSBMZXZlbCAwIEluaXRpYWxpemF0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKgktIEluaXRpYWxpemUgdGhlIEJNVSBhZGRyZXNzIG9mZnNldHMKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCitzdGF0aWMgdm9pZCBTa0dlSW5pdDAoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DKQkJLyogSU8gY29udGV4dCAqLworeworCWludCBpOworCVNLX0dFUE9SVCAqcFBydDsKKworCWZvciAoaSA9IDA7IGkgPCBTS19NQVhfTUFDUzsgaSsrKSB7CisJCXBQcnQgPSAmcEFDLT5HSW5pLkdQW2ldOworCisJCXBQcnQtPlBTdGF0ZSA9IFNLX1BSVF9SRVNFVDsKKwkJcFBydC0+UFJ4UU9mZiA9IFFPZmZUYWJbaV0uUnhRT2ZmOworCQlwUHJ0LT5QWHNRT2ZmID0gUU9mZlRhYltpXS5Yc1FPZmY7CisJCXBQcnQtPlBYYVFPZmYgPSBRT2ZmVGFiW2ldLlhhUU9mZjsKKwkJcFBydC0+UENoZWNrUGFyID0gU0tfRkFMU0U7CisJCXBQcnQtPlBJc2F2ZSA9IDA7CisJCXBQcnQtPlBQcmV2U2hvcnRzID0gMDsKKwkJcFBydC0+UExpbmtSZXNDdCA9IDA7CisJCXBQcnQtPlBBdXRvTmVnVE9DdCA9IDA7CisJCXBQcnQtPlBQcmV2UnggPSAwOworCQlwUHJ0LT5QUHJldkZjcyA9IDA7CisJCXBQcnQtPlBSeExpbSA9IFNLX0RFRl9SWF9XQV9MSU07CisJCXBQcnQtPlBMaW5rTW9kZSA9IChTS19VOClTS19MTU9ERV9BVVRPRlVMTDsKKwkJcFBydC0+UExpbmtTcGVlZENhcCA9IChTS19VOClTS19MU1BFRURfQ0FQXzEwMDBNQlBTOworCQlwUHJ0LT5QTGlua1NwZWVkID0gKFNLX1U4KVNLX0xTUEVFRF8xMDAwTUJQUzsKKwkJcFBydC0+UExpbmtTcGVlZFVzZWQgPSAoU0tfVTgpU0tfTFNQRUVEX1NUQVRfVU5LTk9XTjsKKwkJcFBydC0+UExpbmtNb2RlQ29uZiA9IChTS19VOClTS19MTU9ERV9BVVRPU0VOU0U7CisJCXBQcnQtPlBGbG93Q3RybE1vZGUgPSAoU0tfVTgpU0tfRkxPV19NT0RFX1NZTV9PUl9SRU07CisJCXBQcnQtPlBMaW5rQ2FwID0gKFNLX1U4KShTS19MTU9ERV9DQVBfSEFMRiB8IFNLX0xNT0RFX0NBUF9GVUxMIHwKKwkJCVNLX0xNT0RFX0NBUF9BVVRPSEFMRiB8IFNLX0xNT0RFX0NBUF9BVVRPRlVMTCk7CisJCXBQcnQtPlBMaW5rTW9kZVN0YXR1cyA9IChTS19VOClTS19MTU9ERV9TVEFUX1VOS05PV047CisJCXBQcnQtPlBGbG93Q3RybENhcCA9IChTS19VOClTS19GTE9XX01PREVfU1lNX09SX1JFTTsKKwkJcFBydC0+UEZsb3dDdHJsU3RhdHVzID0gKFNLX1U4KVNLX0ZMT1dfU1RBVF9OT05FOworCQlwUHJ0LT5QTVNDYXAgPSAwOworCQlwUHJ0LT5QTVNNb2RlID0gKFNLX1U4KVNLX01TX01PREVfQVVUTzsKKwkJcFBydC0+UE1TU3RhdHVzID0gKFNLX1U4KVNLX01TX1NUQVRfVU5TRVQ7CisJCXBQcnQtPlBMaXBhQXV0b05lZyA9IChTS19VOClTS19MSVBBX1VOS05PV047CisJCXBQcnQtPlBBdXRvTmVnRmFpbCA9IFNLX0ZBTFNFOworCQlwUHJ0LT5QSFdMaW5rVXAgPSBTS19GQUxTRTsKKwkJcFBydC0+UExpbmtCcm9rZW4gPSBTS19UUlVFOyAvKiBTZWUgV0EgY29kZSAqLworCQlwUHJ0LT5QUGh5UG93ZXJTdGF0ZSA9IFBIWV9QTV9PUEVSQVRJT05BTF9NT0RFOworCQlwUHJ0LT5QTWFjQ29sVGhyZXMgPSBUWF9DT0xfREVGOworCQlwUHJ0LT5QTWFjSmFtTGVuID0gVFhfSkFNX0xFTl9ERUY7CisJCXBQcnQtPlBNYWNKYW1JcGdWYWwJPSBUWF9KQU1fSVBHX0RFRjsKKwkJcFBydC0+UE1hY0phbUlwZ0RhdGEgPSBUWF9JUEdfSkFNX0RFRjsKKwkJcFBydC0+UE1hY0lwZ0RhdGEgPSBJUEdfREFUQV9ERUY7CisJCXBQcnQtPlBNYWNMaW1pdDQgPSBTS19GQUxTRTsKKwl9CisKKwlwQUMtPkdJbmkuR0lQb3J0VXNhZ2UgPSBTS19SRURfTElOSzsKKwlwQUMtPkdJbmkuR0lMZWRCbGlua0N0cmwgPSAoU0tfVTE2KU9lbUNvbmZpZy5WYWx1ZTsKKwlwQUMtPkdJbmkuR0lWYWxJcnFNYXNrID0gSVNfQUxMX01TSzsKKworfQkvKiBTa0dlSW5pdDAqLworCisjaWZkZWYgU0tfUENJX1JFU0VUCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlUGNpUmVzZXQoKSAtIFJlc2V0IFBDSSBpbnRlcmZhY2UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCW8gUmVhZCBQQ0kgY29uZmlndXJhdGlvbi4KKyAqCW8gQ2hhbmdlIHBvd2VyIHN0YXRlIHRvIDMuCisgKglvIENoYW5nZSBwb3dlciBzdGF0ZSB0byAwLgorICoJbyBSZXN0b3JlIFBDSSBjb25maWd1cmF0aW9uLgorICoKKyAqIFJldHVybnM6CisgKgkwOglTdWNjZXNzLgorICoJMToJUG93ZXIgc3RhdGUgY291bGQgbm90IGJlIGNoYW5nZWQgdG8gMy4KKyAqLworc3RhdGljIGludCBTa0dlUGNpUmVzZXQoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DKQkJLyogSU8gY29udGV4dCAqLworeworCWludAkJaTsKKwlTS19VMTYJUG1DdGxTdHM7CisJU0tfVTMyCUJwMTsKKwlTS19VMzIJQnAyOworCVNLX1UxNglQY2lDbWQ7CisJU0tfVTgJQ2xzOworCVNLX1U4CUxhdDsKKwlTS19VOAlDb25maWdTcGFjZVtQQ0lfQ0ZHX1NJWkVdOworCisJLyoKKwkgKiBOb3RlOiBTd2l0Y2hpbmcgdG8gRDMgc3RhdGUgaXMgbGlrZSBhIHNvZnR3YXJlIHJlc2V0LgorCSAqCQkgU3dpdGNoaW5nIGZyb20gRDMgdG8gRDAgaXMgYSBoYXJkd2FyZSByZXNldC4KKwkgKgkJIFdlIGhhdmUgdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aGUgY29uZmlndXJhdGlvbiBzcGFjZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUENJX0NGR19TSVpFOyBpKyspIHsKKwkJU2tQY2lSZWFkQ2ZnRFdvcmQocEFDLCBpKjQsICZDb25maWdTcGFjZVtpXSk7CisJfQorCisJLyogV2Uga25vdyB0aGUgUkFNIEludGVyZmFjZSBBcmJpdGVyIGlzIGVuYWJsZWQuICovCisJU2tQY2lXcml0ZUNmZ1dvcmQocEFDLCBQQ0lfUE1fQ1RMX1NUUywgUENJX1BNX1NUQVRFX0QzKTsKKwlTa1BjaVJlYWRDZmdXb3JkKHBBQywgUENJX1BNX0NUTF9TVFMsICZQbUN0bFN0cyk7CisJCisJaWYgKChQbUN0bFN0cyAmIFBDSV9QTV9TVEFURV9NU0spICE9IFBDSV9QTV9TVEFURV9EMykgeworCQlyZXR1cm4oMSk7CisJfQorCisJLyogUmV0dXJuIHRvIEQwIHN0YXRlLiAqLworCVNrUGNpV3JpdGVDZmdXb3JkKHBBQywgUENJX1BNX0NUTF9TVFMsIFBDSV9QTV9TVEFURV9EMCk7CisKKwkvKiBDaGVjayBmb3IgRDAgc3RhdGUuICovCisJU2tQY2lSZWFkQ2ZnV29yZChwQUMsIFBDSV9QTV9DVExfU1RTLCAmUG1DdGxTdHMpOworCQorCWlmICgoUG1DdGxTdHMgJiBQQ0lfUE1fU1RBVEVfTVNLKSAhPSBQQ0lfUE1fU1RBVEVfRDApIHsKKwkJcmV0dXJuKDEpOworCX0KKworCS8qIENoZWNrIFBDSSBDb25maWcgUmVnaXN0ZXJzLiAqLworCVNrUGNpUmVhZENmZ1dvcmQocEFDLCBQQ0lfQ09NTUFORCwgJlBjaUNtZCk7CisJU2tQY2lSZWFkQ2ZnQnl0ZShwQUMsIFBDSV9DQUNIRV9MU1osICZDbHMpOworCVNrUGNpUmVhZENmZ0RXb3JkKHBBQywgUENJX0JBU0VfMVNULCAmQnAxKTsKKwlTa1BjaVJlYWRDZmdEV29yZChwQUMsIFBDSV9CQVNFXzJORCwgJkJwMik7CisJU2tQY2lSZWFkQ2ZnQnl0ZShwQUMsIFBDSV9MQVRfVElNLCAmTGF0KTsKKwkKKwlpZiAoUGNpQ21kICE9IDAgfHwgQ2xzICE9IChTS19VOCkwIHx8IExhdCAhPSAoU0tfVTgpMCB8fAorCQkoQnAxICYgMHhmZmZmZmZmMEwpICE9IDAgfHwgQnAyICE9IDEpIHsKKwkJcmV0dXJuKDEpOworCX0KKworCS8qIFJlc3RvcmUgUENJIENvbmZpZyBTcGFjZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUENJX0NGR19TSVpFOyBpKyspIHsKKwkJU2tQY2lXcml0ZUNmZ0RXb3JkKHBBQywgaSo0LCBDb25maWdTcGFjZVtpXSk7CisJfQorCisJcmV0dXJuKDApOworfQkvKiBTa0dlUGNpUmVzZXQgKi8KKworI2VuZGlmIC8qIFNLX1BDSV9SRVNFVCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUluaXQxKCkgLSBMZXZlbCAxIEluaXRpYWxpemF0aW9uCisgKgorICogRGVzY3JpcHRpb246CisgKglvIERvIGEgc29mdHdhcmUgcmVzZXQuCisgKglvIENsZWFyIGFsbCByZXNldCBiaXRzLgorICoJbyBWZXJpZnkgdGhhdCB0aGUgZGV0ZWN0ZWQgaGFyZHdhcmUgaXMgcHJlc2VudC4KKyAqCSAgUmV0dXJuIGFuIGVycm9yIGlmIG5vdC4KKyAqCW8gR2V0IHRoZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uCisgKgkJKyBSZWFkIHRoZSBudW1iZXIgb2YgTUFDcy9Qb3J0cy4KKyAqCQkrIFJlYWQgdGhlIFJBTSBzaXplLgorICoJCSsgUmVhZCB0aGUgUENJIFJldmlzaW9uIElkLgorICoJCSsgRmluZCBvdXQgdGhlIGFkYXB0ZXJzIGhvc3QgY2xvY2sgc3BlZWQKKyAqCQkrIFJlYWQgYW5kIGNoZWNrIHRoZSBQSFkgdHlwZQorICoKKyAqIFJldHVybnM6CisgKgkwOglzdWNjZXNzCisgKgk1OglVbmV4cGVjdGVkIFBIWSB0eXBlIGRldGVjdGVkCisgKgk2OglIVyBzZWxmIHRlc3QgZmFpbGVkCisgKi8KK3N0YXRpYyBpbnQgU2tHZUluaXQxKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQykJCS8qIElPIGNvbnRleHQgKi8KK3sKKwlTS19VOAlCeXRlOworCVNLX1UxNglXb3JkOworCVNLX1UxNglDdHJsU3RhdDsKKwlTS19VMzIJRFdvcmQ7CisJaW50CVJldFZhbDsKKwlpbnQJaTsKKworCVJldFZhbCA9IDA7CisKKwkvKiBzYXZlIENMS19SVU4gYml0cyAoWVVLT04tTGl0ZSkgKi8KKwlTS19JTjE2KElvQywgQjBfQ1RTVCwgJkN0cmxTdGF0KTsKKworI2lmZGVmIFNLX1BDSV9SRVNFVAorCSh2b2lkKVNrR2VQY2lSZXNldChwQUMsIElvQyk7CisjZW5kaWYgLyogU0tfUENJX1JFU0VUICovCisKKwkvKiBkbyB0aGUgU1ctcmVzZXQgKi8KKwlTS19PVVQ4KElvQywgQjBfQ1RTVCwgQ1NfUlNUX1NFVCk7CisKKwkvKiByZWxlYXNlIHRoZSBTVy1yZXNldCAqLworCVNLX09VVDgoSW9DLCBCMF9DVFNULCBDU19SU1RfQ0xSKTsKKworCS8qIHJlc2V0IGFsbCBlcnJvciBiaXRzIGluIHRoZSBQQ0kgU1RBVFVTIHJlZ2lzdGVyICovCisJLyoKKwkgKiBOb3RlOiBQQ0kgQ2ZnIGN5Y2xlcyBjYW5ub3QgYmUgdXNlZCwgYmVjYXVzZSB0aGV5IGFyZSBub3QKKwkgKgkJIGF2YWlsYWJsZSBvbiBzb21lIHBsYXRmb3JtcyBhZnRlciAnYm9vdCB0aW1lJy4KKwkgKi8KKwlTS19JTjE2KElvQywgUENJX0MoUENJX1NUQVRVUyksICZXb3JkKTsKKwkKKwlTS19PVVQ4KElvQywgQjJfVFNUX0NUUkwxLCBUU1RfQ0ZHX1dSSVRFX09OKTsKKwlTS19PVVQxNihJb0MsIFBDSV9DKFBDSV9TVEFUVVMpLCAoU0tfVTE2KShXb3JkIHwgUENJX0VSUkJJVFMpKTsKKwlTS19PVVQ4KElvQywgQjJfVFNUX0NUUkwxLCBUU1RfQ0ZHX1dSSVRFX09GRik7CisKKwkvKiByZWxlYXNlIE1hc3RlciBSZXNldCAqLworCVNLX09VVDgoSW9DLCBCMF9DVFNULCBDU19NUlNUX0NMUik7CisKKyNpZmRlZiBDTEtfUlVOCisJQ3RybFN0YXQgfD0gQ1NfQ0xLX1JVTl9FTkE7CisjZW5kaWYgLyogQ0xLX1JVTiAqLworCisJLyogcmVzdG9yZSBDTEtfUlVOIGJpdHMgKi8KKwlTS19PVVQxNihJb0MsIEIwX0NUU1QsIChTS19VMTYpKEN0cmxTdGF0ICYKKwkJKENTX0NMS19SVU5fSE9UIHwgQ1NfQ0xLX1JVTl9SU1QgfCBDU19DTEtfUlVOX0VOQSkpKTsKKworCS8qIHJlYWQgQ2hpcCBJZGVudGlmaWNhdGlvbiBOdW1iZXIgKi8KKwlTS19JTjgoSW9DLCBCMl9DSElQX0lELCAmQnl0ZSk7CisJcEFDLT5HSW5pLkdJQ2hpcElkID0gQnl0ZTsKKwkKKwkvKiByZWFkIG51bWJlciBvZiBNQUNzICovCisJU0tfSU44KElvQywgQjJfTUFDX0NGRywgJkJ5dGUpOworCXBBQy0+R0luaS5HSU1hY3NGb3VuZCA9IChCeXRlICYgQ0ZHX1NOR19NQUMpID8gMSA6IDI7CisJCisJLyogZ2V0IENoaXAgUmV2aXNpb24gTnVtYmVyICovCisJcEFDLT5HSW5pLkdJQ2hpcFJldiA9IChTS19VOCkoKEJ5dGUgJiBDRkdfQ0hJUF9SX01TSykgPj4gNCk7CisKKwkvKiBnZXQgZGlmZi4gUENJIHBhcmFtZXRlcnMgKi8KKwlTS19JTjE2KElvQywgQjBfQ1RTVCwgJkN0cmxTdGF0KTsKKwkKKwkvKiByZWFkIHRoZSBhZGFwdGVycyBSQU0gc2l6ZSAqLworCVNLX0lOOChJb0MsIEIyX0VfMCwgJkJ5dGUpOworCQorCXBBQy0+R0luaS5HSUdlbmVzaXMgPSBTS19GQUxTRTsKKwlwQUMtPkdJbmkuR0lZdWtvbiA9IFNLX0ZBTFNFOworCXBBQy0+R0luaS5HSVl1a29uTGl0ZSA9IFNLX0ZBTFNFOworCisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9HRU5FU0lTKSB7CisKKwkJcEFDLT5HSW5pLkdJR2VuZXNpcyA9IFNLX1RSVUU7CisKKwkJaWYgKEJ5dGUgPT0gKFNLX1U4KTMpIHsJCQkJCQkKKwkJCS8qIHNwZWNpYWwgY2FzZTogNCB4IDY0ayB4IDM2LCBvZmZzZXQgPSAweDgwMDAwICovCisJCQlwQUMtPkdJbmkuR0lSYW1TaXplID0gMTAyNDsKKwkJCXBBQy0+R0luaS5HSVJhbU9mZnMgPSAoU0tfVTMyKTUxMiAqIDEwMjQ7CisJCX0KKwkJZWxzZSB7CisJCQlwQUMtPkdJbmkuR0lSYW1TaXplID0gKGludClCeXRlICogNTEyOworCQkJcEFDLT5HSW5pLkdJUmFtT2ZmcyA9IDA7CisJCX0KKwkJLyogYWxsIEdFIGFkYXB0ZXJzIHdvcmsgd2l0aCA1My4xMjUgTUh6IGhvc3QgY2xvY2sgKi8KKwkJcEFDLT5HSW5pLkdJSHN0Q2xrRmFjdCA9IFNLX0ZBQ1RfNTM7CisJCQorCQkvKiBzZXQgRGVzY3IuIFBvbGwgVGltZXIgSW5pdCBWYWx1ZSB0byAyNTAgbXMgKi8KKwkJcEFDLT5HSW5pLkdJUG9sbFRpbWVyVmFsID0KKwkJCVNLX0RQT0xMX0RFRiAqIChTS19VMzIpcEFDLT5HSW5pLkdJSHN0Q2xrRmFjdCAvIDEwMDsKKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJaWYgKHBBQy0+R0luaS5HSUNoaXBJZCAhPSBDSElQX0lEX0dFTkVTSVMpIHsKKwkJCisJCXBBQy0+R0luaS5HSVl1a29uID0gU0tfVFJVRTsKKwkJCisJCXBBQy0+R0luaS5HSVJhbVNpemUgPSAoQnl0ZSA9PSAoU0tfVTgpMCkgPyAxMjggOiAoaW50KUJ5dGUgKiA0OworCQkKKwkJcEFDLT5HSW5pLkdJUmFtT2ZmcyA9IDA7CisJCQorCQkvKiBXQSBmb3IgY2hpcCBSZXYuIEEgKi8KKwkJcEFDLT5HSW5pLkdJV29sT2ZmcyA9IChwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9ZVUtPTiAmJgorCQkJcEFDLT5HSW5pLkdJQ2hpcFJldiA9PSAwKSA/IFdPTF9SRUdfT0ZGUyA6IDA7CisJCQorCQkvKiBnZXQgUE0gQ2FwYWJpbGl0aWVzIG9mIFBDSSBjb25maWcgc3BhY2UgKi8KKwkJU0tfSU4xNihJb0MsIFBDSV9DKFBDSV9QTV9DQVBfUkVHKSwgJldvcmQpOworCisJCS8qIGNoZWNrIGlmIFZBVVggaXMgYXZhaWxhYmxlICovCisJCWlmICgoKEN0cmxTdGF0ICYgQ1NfVkFVWF9BVkFJTCkgIT0gMCkgJiYKKwkJCS8qIGNoZWNrIGFsc28gaWYgUE1FIGZyb20gRDNjb2xkIGlzIHNldCAqLworCQkJKChXb3JkICYgUENJX1BNRV9EM0NfU1VQKSAhPSAwKSkgeworCQkJLyogc2V0IGVudHJ5IGluIEdFIGluaXQgc3RydWN0ICovCisJCQlwQUMtPkdJbmkuR0lWYXV4QXZhaWwgPSBTS19UUlVFOworCQl9CisJCQorCQlpZiAocEFDLT5HSW5pLkdJQ2hpcElkID09IENISVBfSURfWVVLT05fTElURSkgeworCQkJLyogdGhpcyBpcyBSZXYuIEExICovCisJCQlwQUMtPkdJbmkuR0lZdWtvbkxpdGUgPSBTS19UUlVFOworCQl9CisJCWVsc2UgeworCQkJLyogc2F2ZSBGbGFzaC1BZGRyZXNzIFJlZ2lzdGVyICovCisJCQlTS19JTjMyKElvQywgQjJfRkFSLCAmRFdvcmQpOworCisJCQkvKiB0ZXN0IEZsYXNoLUFkZHJlc3MgUmVnaXN0ZXIgKi8KKwkJCVNLX09VVDgoSW9DLCBCMl9GQVIgKyAzLCAweGZmKTsKKwkJCVNLX0lOOChJb0MsIEIyX0ZBUiArIDMsICZCeXRlKTsKKworCQkJaWYgKEJ5dGUgIT0gMCkgeworCQkJCS8qIHRoaXMgaXMgUmV2LiBBMCAqLworCQkJCXBBQy0+R0luaS5HSVl1a29uTGl0ZSA9IFNLX1RSVUU7CisKKwkJCQkvKiByZXN0b3JlIEZsYXNoLUFkZHJlc3MgUmVnaXN0ZXIgKi8KKwkJCQlTS19PVVQzMihJb0MsIEIyX0ZBUiwgRFdvcmQpOworCQkJfQorCQl9CisKKwkJLyogc3dpdGNoIHBvd2VyIHRvIFZDQyAoV0EgZm9yIFZBVVggcHJvYmxlbSkgKi8KKwkJU0tfT1VUOChJb0MsIEIwX1BPV0VSX0NUUkwsIChTS19VOCkoUENfVkFVWF9FTkEgfCBQQ19WQ0NfRU5BIHwKKwkJCVBDX1ZBVVhfT0ZGIHwgUENfVkNDX09OKSk7CisKKwkJLyogcmVhZCB0aGUgSW50ZXJydXB0IHNvdXJjZSAqLworCQlTS19JTjMyKElvQywgQjBfSVNSQywgJkRXb3JkKTsKKwkJCisJCWlmICgoRFdvcmQgJiBJU19IV19FUlIpICE9IDApIHsKKwkJCS8qIHJlYWQgdGhlIEhXIEVycm9yIEludGVycnVwdCBzb3VyY2UgKi8KKwkJCVNLX0lOMzIoSW9DLCBCMF9IV0VfSVNSQywgJkRXb3JkKTsKKwkJCQorCQkJaWYgKChEV29yZCAmIElTX0lSUV9TRU5TT1IpICE9IDApIHsKKwkJCQkvKiBkaXNhYmxlIEhXIEVycm9yIElSUSAqLworCQkJCXBBQy0+R0luaS5HSVZhbElycU1hc2sgJj0gfklTX0hXX0VSUjsKKwkJCX0KKwkJfQorCQkKKwkJZm9yIChpID0gMDsgaSA8IHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCQkvKiBzZXQgR01BQyBMaW5rIENvbnRyb2wgcmVzZXQgKi8KKwkJCVNLX09VVDE2KElvQywgTVJfQUREUihpLCBHTUFDX0xJTktfQ1RSTCksIEdNTENfUlNUX1NFVCk7CisKKwkJCS8qIGNsZWFyIEdNQUMgTGluayBDb250cm9sIHJlc2V0ICovCisJCQlTS19PVVQxNihJb0MsIE1SX0FERFIoaSwgR01BQ19MSU5LX0NUUkwpLCBHTUxDX1JTVF9DTFIpOworCQl9CisJCS8qIGFsbCBZVSBjaGlwcyB3b3JrIHdpdGggNzguMTI1IE1IeiBob3N0IGNsb2NrICovCisJCXBBQy0+R0luaS5HSUhzdENsa0ZhY3QgPSBTS19GQUNUXzc4OworCQkKKwkJcEFDLT5HSW5pLkdJUG9sbFRpbWVyVmFsID0gU0tfRFBPTExfTUFYOwkvKiAyMTUgbXMgKi8KKwl9CisjZW5kaWYgLyogWVVLT04gKi8KKworCS8qIGNoZWNrIGlmIDY0LWJpdCBQQ0kgU2xvdCBpcyBwcmVzZW50ICovCisJcEFDLT5HSW5pLkdJUGNpU2xvdDY0ID0gKFNLX0JPT0wpKChDdHJsU3RhdCAmIENTX0JVU19TTE9UX1NaKSAhPSAwKTsKKwkKKwkvKiBjaGVjayBpZiA2NiBNSHogUENJIENsb2NrIGlzIGFjdGl2ZSAqLworCXBBQy0+R0luaS5HSVBjaUNsb2NrNjYgPSAoU0tfQk9PTCkoKEN0cmxTdGF0ICYgQ1NfQlVTX0NMT0NLKSAhPSAwKTsKKworCS8qIHJlYWQgUENJIEhXIFJldmlzaW9uIElkLiAqLworCVNLX0lOOChJb0MsIFBDSV9DKFBDSV9SRVZfSUQpLCAmQnl0ZSk7CisJcEFDLT5HSW5pLkdJUGNpSHdSZXYgPSBCeXRlOworCisJLyogcmVhZCB0aGUgUE1EIHR5cGUgKi8KKwlTS19JTjgoSW9DLCBCMl9QTURfVFlQLCAmQnl0ZSk7CisJcEFDLT5HSW5pLkdJQ29wcGVyVHlwZSA9IChTS19VOCkoQnl0ZSA9PSAnVCcpOworCisJLyogcmVhZCB0aGUgUEhZIHR5cGUgKi8KKwlTS19JTjgoSW9DLCBCMl9FXzEsICZCeXRlKTsKKworCUJ5dGUgJj0gMHgwZjsJLyogdGhlIFBIWSB0eXBlIGlzIHN0b3JlZCBpbiB0aGUgbG93ZXIgbmliYmxlICovCisJZm9yIChpID0gMDsgaSA8IHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCQorI2lmZGVmIEdFTkVTSVMKKwkJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCXN3aXRjaCAoQnl0ZSkgeworCQkJY2FzZSBTS19QSFlfWE1BQzoKKwkJCQlwQUMtPkdJbmkuR1BbaV0uUGh5QWRkciA9IFBIWV9BRERSX1hNQUM7CisJCQkJYnJlYWs7CisJCQljYXNlIFNLX1BIWV9CQ09NOgorCQkJCXBBQy0+R0luaS5HUFtpXS5QaHlBZGRyID0gUEhZX0FERFJfQkNPTTsKKwkJCQlwQUMtPkdJbmkuR1BbaV0uUE1TQ2FwID0gKFNLX1U4KShTS19NU19DQVBfQVVUTyB8CisJCQkJCVNLX01TX0NBUF9NQVNURVIgfCBTS19NU19DQVBfU0xBVkUpOworCQkJCWJyZWFrOworI2lmZGVmIE9USEVSX1BIWQorCQkJY2FzZSBTS19QSFlfTE9ORToKKwkJCQlwQUMtPkdJbmkuR1BbaV0uUGh5QWRkciA9IFBIWV9BRERSX0xPTkU7CisJCQkJYnJlYWs7CisJCQljYXNlIFNLX1BIWV9OQVQ6CisJCQkJcEFDLT5HSW5pLkdQW2ldLlBoeUFkZHIgPSBQSFlfQUREUl9OQVQ7CisJCQkJYnJlYWs7CisjZW5kaWYgLyogT1RIRVJfUEhZICovCisJCQlkZWZhdWx0OgorCQkJCS8qIEVSUk9SOiB1bmV4cGVjdGVkIFBIWSB0eXBlIGRldGVjdGVkICovCisJCQkJUmV0VmFsID0gNTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCQlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJCQorCQkJaWYgKEJ5dGUgPCAoU0tfVTgpU0tfUEhZX01BUlZfQ09QUEVSKSB7CisJCQkJLyogaWYgdGhpcyBmaWVsZCBpcyBub3QgaW5pdGlhbGl6ZWQgKi8KKwkJCQlCeXRlID0gKFNLX1U4KVNLX1BIWV9NQVJWX0NPUFBFUjsKKwkJCQkKKwkJCQlwQUMtPkdJbmkuR0lDb3BwZXJUeXBlID0gU0tfVFJVRTsKKwkJCX0KKwkJCQorCQkJcEFDLT5HSW5pLkdQW2ldLlBoeUFkZHIgPSBQSFlfQUREUl9NQVJWOworCQkJCisJCQlpZiAocEFDLT5HSW5pLkdJQ29wcGVyVHlwZSkgeworCisJCQkJcEFDLT5HSW5pLkdQW2ldLlBMaW5rU3BlZWRDYXAgPSAoU0tfVTgpKFNLX0xTUEVFRF9DQVBfQVVUTyB8CisJCQkJCVNLX0xTUEVFRF9DQVBfMTBNQlBTIHwgU0tfTFNQRUVEX0NBUF8xMDBNQlBTIHwKKwkJCQkJU0tfTFNQRUVEX0NBUF8xMDAwTUJQUyk7CisJCQkJCisJCQkJcEFDLT5HSW5pLkdQW2ldLlBMaW5rU3BlZWQgPSAoU0tfVTgpU0tfTFNQRUVEX0FVVE87CisJCQkJCisJCQkJcEFDLT5HSW5pLkdQW2ldLlBNU0NhcCA9IChTS19VOCkoU0tfTVNfQ0FQX0FVVE8gfAorCQkJCQlTS19NU19DQVBfTUFTVEVSIHwgU0tfTVNfQ0FQX1NMQVZFKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCUJ5dGUgPSAoU0tfVTgpU0tfUEhZX01BUlZfRklCRVI7CisJCQl9CisJCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCQkKKwkJcEFDLT5HSW5pLkdQW2ldLlBoeVR5cGUgPSAoaW50KUJ5dGU7CisJCQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lOSVQsCisJCQkoIlBIWSB0eXBlOiAlZCAgUEhZIGFkZHI6ICUwNHhcbiIsIEJ5dGUsCisJCQlwQUMtPkdJbmkuR1BbaV0uUGh5QWRkcikpOworCX0KKwkKKwkvKiBnZXQgTUFDIFR5cGUgJiBzZXQgZnVuY3Rpb24gcG9pbnRlcnMgZGVwZW5kZW50IG9uICovCisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQorCQlwQUMtPkdJbmkuR0lNYWNUeXBlID0gU0tfTUFDX1hNQUM7CisKKwkJcEFDLT5HSW5pLkdJRnVuYy5wRm5NYWNVcGRhdGVTdGF0cwk9IFNrWG1VcGRhdGVTdGF0czsKKwkJcEFDLT5HSW5pLkdJRnVuYy5wRm5NYWNTdGF0aXN0aWMJPSBTa1htTWFjU3RhdGlzdGljOworCQlwQUMtPkdJbmkuR0lGdW5jLnBGbk1hY1Jlc2V0Q291bnRlcgk9IFNrWG1SZXNldENvdW50ZXI7CisJCXBBQy0+R0luaS5HSUZ1bmMucEZuTWFjT3ZlcmZsb3cJCT0gU2tYbU92ZXJmbG93U3RhdHVzOworCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisJCisjaWZkZWYgWVVLT04KKwlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJCisJCXBBQy0+R0luaS5HSU1hY1R5cGUgPSBTS19NQUNfR01BQzsKKworCQlwQUMtPkdJbmkuR0lGdW5jLnBGbk1hY1VwZGF0ZVN0YXRzCT0gU2tHbVVwZGF0ZVN0YXRzOworCQlwQUMtPkdJbmkuR0lGdW5jLnBGbk1hY1N0YXRpc3RpYwk9IFNrR21NYWNTdGF0aXN0aWM7CisJCXBBQy0+R0luaS5HSUZ1bmMucEZuTWFjUmVzZXRDb3VudGVyCT0gU2tHbVJlc2V0Q291bnRlcjsKKwkJcEFDLT5HSW5pLkdJRnVuYy5wRm5NYWNPdmVyZmxvdwkJPSBTa0dtT3ZlcmZsb3dTdGF0dXM7CisKKyNpZmRlZiBTUEVDSUFMX0hBTkRMSU5HCisJCWlmIChwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9ZVUtPTikgeworCQkJLyogY2hlY2sgSFcgc2VsZiB0ZXN0IHJlc3VsdCAqLworCQkJU0tfSU44KElvQywgQjJfRV8zLCAmQnl0ZSk7CisJCQlpZiAoQnl0ZSAmIEIyX0UzX1JFU19NQVNLKSB7CisJCQkJUmV0VmFsID0gNjsKKwkJCX0KKwkJfQorI2VuZGlmCisJfQorI2VuZGlmIC8qIFlVS09OICovCisJCisJcmV0dXJuKFJldFZhbCk7Cit9CS8qIFNrR2VJbml0MSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlSW5pdDIoKSAtIExldmVsIDIgSW5pdGlhbGl6YXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCS0gc3RhcnQgdGhlIEJsaW5rIFNvdXJjZSBDb3VudGVyCisgKgktIHN0YXJ0IHRoZSBEZXNjcmlwdG9yIFBvbGwgVGltZXIKKyAqCS0gY29uZmlndXJlIHRoZSBNQUMtQXJiaXRlcgorICoJLSBjb25maWd1cmUgdGhlIFBhY2tldC1BcmJpdGVyCisgKgktIGVuYWJsZSB0aGUgVHggQXJiaXRlcnMKKyAqCS0gZW5hYmxlIHRoZSBSQU0gSW50ZXJmYWNlIEFyYml0ZXIKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCitzdGF0aWMgdm9pZCBTa0dlSW5pdDIoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DKQkJLyogSU8gY29udGV4dCAqLworeworI2lmZGVmIEdFTkVTSVMKKwlTS19VMzIJRFdvcmQ7CisjZW5kaWYgLyogR0VORVNJUyAqLworCWludAkJaTsKKworCS8qIHN0YXJ0IHRoZSBEZXNjcmlwdG9yIFBvbGwgVGltZXIgKi8KKwlpZiAocEFDLT5HSW5pLkdJUG9sbFRpbWVyVmFsICE9IDApIHsKKwkJaWYgKHBBQy0+R0luaS5HSVBvbGxUaW1lclZhbCA+IFNLX0RQT0xMX01BWCkgeworCQkJcEFDLT5HSW5pLkdJUG9sbFRpbWVyVmFsID0gU0tfRFBPTExfTUFYOworCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0hXSV9FMDE3LCBTS0VSUl9IV0lfRTAxN01TRyk7CisJCX0KKwkJU0tfT1VUMzIoSW9DLCBCMjhfRFBUX0lOSSwgcEFDLT5HSW5pLkdJUG9sbFRpbWVyVmFsKTsKKwkJU0tfT1VUOChJb0MsIEIyOF9EUFRfQ1RSTCwgRFBUX1NUQVJUKTsKKwl9CisKKyNpZmRlZiBHRU5FU0lTCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJLyogc3RhcnQgdGhlIEJsaW5rIFNvdXJjZSBDb3VudGVyICovCisJCURXb3JkID0gU0tfQkxLX0RVUiAqIChTS19VMzIpcEFDLT5HSW5pLkdJSHN0Q2xrRmFjdCAvIDEwMDsKKworCQlTS19PVVQzMihJb0MsIEIyX0JTQ19JTkksIERXb3JkKTsKKwkJU0tfT1VUOChJb0MsIEIyX0JTQ19DVFJMLCBCU0NfU1RBUlQpOworCisJCS8qCisJCSAqIENvbmZpZ3VyZSB0aGUgTUFDIEFyYml0ZXIgYW5kIHRoZSBQYWNrZXQgQXJiaXRlci4KKwkJICogVGhleSB3aWxsIGJlIHN0YXJ0ZWQgb25jZSBhbmQgbmV2ZXIgYmUgc3RvcHBlZC4KKwkJICovCisJCVNrR2VJbml0TWFjQXJiKHBBQywgSW9DKTsKKworCQlTa0dlSW5pdFBrdEFyYihwQUMsIElvQyk7CisJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCWlmIChwQUMtPkdJbmkuR0lZdWtvbikgeworCQkvKiBzdGFydCBUaW1lIFN0YW1wIFRpbWVyICovCisJCVNLX09VVDgoSW9DLCBHTUFDX1RJX1NUX0NUUkwsIChTS19VOClHTVRfU1RfU1RBUlQpOworCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCisJLyogZW5hYmxlIHRoZSBUeCBBcmJpdGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQlTS19PVVQ4KElvQywgTVJfQUREUihpLCBUWEFfQ1RSTCksIFRYQV9FTkFfQVJCKTsKKwl9CisKKwkvKiBlbmFibGUgdGhlIFJBTSBJbnRlcmZhY2UgQXJiaXRlciAqLworCVNrR2VJbml0UmFtSWZhY2UocEFDLCBJb0MpOworCit9CS8qIFNrR2VJbml0MiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUluaXQoKSAtIEluaXRpYWxpemUgdGhlIEdFIEFkYXB0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGxldmVsLgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJTGV2ZWwJMDoJSW5pdGlhbGl6ZSB0aGUgTW9kdWxlIHN0cnVjdHVyZXMuCisgKglMZXZlbAkxOglHZW5lcmljIEhhcmR3YXJlIEluaXRpYWxpemF0aW9uLiBUaGUgSU9QL01lbUJhc2UgcG9pbnRlciBoYXMKKyAqCQkJCXRvIGJlIHNldCBiZWZvcmUgY2FsbGluZyB0aGlzIGxldmVsLgorICoKKyAqCQkJbyBEbyBhIHNvZnR3YXJlIHJlc2V0LgorICoJCQlvIENsZWFyIGFsbCByZXNldCBiaXRzLgorICoJCQlvIFZlcmlmeSB0aGF0IHRoZSBkZXRlY3RlZCBoYXJkd2FyZSBpcyBwcmVzZW50LgorICoJCQkgIFJldHVybiBhbiBlcnJvciBpZiBub3QuCisgKgkJCW8gR2V0IHRoZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uCisgKgkJCQkrIFNldCBHSU1hY3NGb3VuZCB3aXRoIHRoZSBudW1iZXIgb2YgTUFDcy4KKyAqCQkJCSsgU3RvcmUgdGhlIFJBTSBzaXplIGluIEdJUmFtU2l6ZS4KKyAqCQkJCSsgU2F2ZSB0aGUgUENJIFJldmlzaW9uIElEIGluIEdJUGNpSHdSZXYuCisgKgkJCW8gcmV0dXJuIGFuIGVycm9yCisgKgkJCQlpZiBOdW1iZXIgb2YgTUFDcyA+IFNLX01BWF9NQUNTCisgKgorICoJCQlBZnRlciByZXR1cm5pbmcgZnJvbSBMZXZlbCAwIHRoZSBhZGFwdGVyCisgKgkJCW1heSBiZSBhY2Nlc3NlZCB3aXRoIElPIG9wZXJhdGlvbnMuCisgKgorICoJTGV2ZWwJMjoJc3RhcnQgdGhlIEJsaW5rIFNvdXJjZSBDb3VudGVyCisgKgorICogUmV0dXJuczoKKyAqCTA6CXN1Y2Nlc3MKKyAqCTE6CU51bWJlciBvZiBNQUNzIGV4Y2VlZHMgU0tfTUFYX01BQ1MJKGFmdGVyIGxldmVsIDEpCisgKgkyOglBZGFwdGVyIG5vdCBwcmVzZW50IG9yIG5vdCBhY2Nlc3NpYmxlCisgKgkzOglJbGxlZ2FsIGluaXRpYWxpemF0aW9uIGxldmVsCisgKgk0OglJbml0aWFsaXphdGlvbiBMZXZlbCAxIENhbGwgbWlzc2luZworICoJNToJVW5leHBlY3RlZCBQSFkgdHlwZSBkZXRlY3RlZAorICoJNjoJSFcgc2VsZiB0ZXN0IGZhaWxlZAorICovCitpbnQJU2tHZUluaXQoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlMZXZlbCkJCS8qIGluaXRpYWxpemF0aW9uIGxldmVsICovCit7CisJaW50CQlSZXRWYWw7CQkvKiByZXR1cm4gdmFsdWUgKi8KKwlTS19VMzIJRFdvcmQ7CisKKwlSZXRWYWwgPSAwOworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSU5JVCwKKwkJKCJTa0dlSW5pdChMZXZlbCAlZClcbiIsIExldmVsKSk7CisKKwlzd2l0Y2ggKExldmVsKSB7CisJY2FzZSBTS19JTklUX0RBVEE6CisJCS8qIEluaXRpYWxpemF0aW9uIExldmVsIDAgKi8KKwkJU2tHZUluaXQwKHBBQywgSW9DKTsKKwkJcEFDLT5HSW5pLkdJTGV2ZWwgPSBTS19JTklUX0RBVEE7CisJCWJyZWFrOworCQorCWNhc2UgU0tfSU5JVF9JTzoKKwkJLyogSW5pdGlhbGl6YXRpb24gTGV2ZWwgMSAqLworCQlSZXRWYWwgPSBTa0dlSW5pdDEocEFDLCBJb0MpOworCQlpZiAoUmV0VmFsICE9IDApIHsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogY2hlY2sgaWYgdGhlIGFkYXB0ZXIgc2VlbXMgdG8gYmUgYWNjZXNzaWJsZSAqLworCQlTS19PVVQzMihJb0MsIEIyX0lSUU1fSU5JLCBTS19URVNUX1ZBTCk7CisJCVNLX0lOMzIoSW9DLCBCMl9JUlFNX0lOSSwgJkRXb3JkKTsKKwkJU0tfT1VUMzIoSW9DLCBCMl9JUlFNX0lOSSwgMEwpOworCQkKKwkJaWYgKERXb3JkICE9IFNLX1RFU1RfVkFMKSB7CisJCQlSZXRWYWwgPSAyOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBjaGVjayBpZiB0aGUgbnVtYmVyIG9mIEdJTWFjc0ZvdW5kIG1hdGNoZXMgU0tfTUFYX01BQ1MgKi8KKwkJaWYgKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA+IFNLX01BWF9NQUNTKSB7CisJCQlSZXRWYWwgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBMZXZlbCAxIHN1Y2Nlc3NmdWxseSBwYXNzZWQgKi8KKwkJcEFDLT5HSW5pLkdJTGV2ZWwgPSBTS19JTklUX0lPOworCQlicmVhazsKKwkKKwljYXNlIFNLX0lOSVRfUlVOOgorCQkvKiBJbml0aWFsaXphdGlvbiBMZXZlbCAyICovCisJCWlmIChwQUMtPkdJbmkuR0lMZXZlbCAhPSBTS19JTklUX0lPKSB7CisjaWZuZGVmIFNLX0RJQUcKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSFdJX0UwMDIsIFNLRVJSX0hXSV9FMDAyTVNHKTsKKyNlbmRpZiAvKiAhU0tfRElBRyAqLworCQkJUmV0VmFsID0gNDsKKwkJCWJyZWFrOworCQl9CisJCVNrR2VJbml0MihwQUMsIElvQyk7CisKKwkJLyogTGV2ZWwgMiBzdWNjZXNzZnVsbHkgcGFzc2VkICovCisJCXBBQy0+R0luaS5HSUxldmVsID0gU0tfSU5JVF9SVU47CisJCWJyZWFrOworCQorCWRlZmF1bHQ6CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSFdJX0UwMDMsIFNLRVJSX0hXSV9FMDAzTVNHKTsKKwkJUmV0VmFsID0gMzsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuKFJldFZhbCk7Cit9CS8qIFNrR2VJbml0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VEZUluaXQoKSAtIERlaW5pdGlhbGl6ZSB0aGUgYWRhcHRlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJQWxsIHBvcnRzIG9mIHRoZSBhZGFwdGVyIHdpbGwgYmUgc3RvcHBlZCBpZiBub3QgYWxyZWFkeSBkb25lLgorICoJRG8gYSBzb2Z0d2FyZSByZXNldCBhbmQgc3dpdGNoIG9mZiBhbGwgTEVEcy4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrR2VEZUluaXQoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DKQkJLyogSU8gY29udGV4dCAqLworeworCWludAlpOworCVNLX1UxNglXb3JkOworCisjaWZkZWYgU0tfUEhZX0xQX01PREUKKwlTS19VOAlCeXRlOworCVNLX1UxNglQbUN0bFN0czsKKyNlbmRpZiAvKiBTS19QSFlfTFBfTU9ERSAqLworCisjaWYgKCFkZWZpbmVkKFNLX1NMSU0pICYmICFkZWZpbmVkKFZDUFUpKQorCS8qIGVuc3VyZSBJMkMgaXMgcmVhZHkgKi8KKwlTa0kyY1dhaXRJcnEocEFDLCBJb0MpOworI2VuZGlmCQorCisJLyogc3RvcCBhbGwgY3VycmVudCB0cmFuc2ZlciBhY3Rpdml0eSAqLworCWZvciAoaSA9IDA7IGkgPCBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQlpZiAocEFDLT5HSW5pLkdQW2ldLlBTdGF0ZSAhPSBTS19QUlRfU1RPUCAmJgorCQkJcEFDLT5HSW5pLkdQW2ldLlBTdGF0ZSAhPSBTS19QUlRfUkVTRVQpIHsKKworCQkJU2tHZVN0b3BQb3J0KHBBQywgSW9DLCBpLCBTS19TVE9QX0FMTCwgU0tfSEFSRF9SU1QpOworCQl9CisJfQorCisjaWZkZWYgU0tfUEhZX0xQX01PREUKKyAgICAvKgorCSAqIGZvciBwb3dlciBzYXZpbmcgcHVycG9zZXMgd2l0aGluIG1vYmlsZSBlbnZpcm9ubWVudHMKKwkgKiB3ZSBzZXQgdGhlIFBIWSB0byBjb21hIG1vZGUgYW5kIHN3aXRjaCB0byBEMyBwb3dlciBzdGF0ZS4KKwkgKi8KKwlpZiAocEFDLT5HSW5pLkdJWXVrb25MaXRlICYmCisJCXBBQy0+R0luaS5HSUNoaXBSZXYgPT0gQ0hJUF9SRVZfWVVfTElURV9BMykgeworCisJCS8qIGZvciBhbGwgcG9ydHMgc3dpdGNoIFBIWSB0byBjb21hIG1vZGUgKi8KKwkJZm9yIChpID0gMDsgaSA8IHBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCQkKKwkJCVNrR21FbnRlckxvd1Bvd2VyTW9kZShwQUMsIElvQywgaSwgUEhZX1BNX0RFRVBfU0xFRVApOworCQl9CisKKwkJaWYgKHBBQy0+R0luaS5HSVZhdXhBdmFpbCkgeworCQkJLyogc3dpdGNoIHBvd2VyIHRvIFZBVVggKi8KKwkJCUJ5dGUgPSBQQ19WQVVYX0VOQSB8IFBDX1ZDQ19FTkEgfCBQQ19WQVVYX09OIHwgUENfVkNDX09GRjsKKworCQkJU0tfT1VUOChJb0MsIEIwX1BPV0VSX0NUUkwsIEJ5dGUpOworCQl9CisJCQorCQkvKiBzd2l0Y2ggdG8gRDMgc3RhdGUgKi8KKwkJU0tfSU4xNihJb0MsIFBDSV9DKFBDSV9QTV9DVExfU1RTKSwgJlBtQ3RsU3RzKTsKKworCQlQbUN0bFN0cyB8PSBQQ0lfUE1fU1RBVEVfRDM7CisKKwkJU0tfT1VUOChJb0MsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PTik7CisKKwkJU0tfT1VUMTYoSW9DLCBQQ0lfQyhQQ0lfUE1fQ1RMX1NUUyksIFBtQ3RsU3RzKTsKKwl9CisjZW5kaWYgLyogU0tfUEhZX0xQX01PREUgKi8KKworCS8qIFJlc2V0IGFsbCBiaXRzIGluIHRoZSBQQ0kgU1RBVFVTIHJlZ2lzdGVyICovCisJLyoKKwkgKiBOb3RlOiBQQ0kgQ2ZnIGN5Y2xlcyBjYW5ub3QgYmUgdXNlZCwgYmVjYXVzZSB0aGV5IGFyZSBub3QKKwkgKgkgYXZhaWxhYmxlIG9uIHNvbWUgcGxhdGZvcm1zIGFmdGVyICdib290IHRpbWUnLgorCSAqLworCVNLX0lOMTYoSW9DLCBQQ0lfQyhQQ0lfU1RBVFVTKSwgJldvcmQpOworCQorCVNLX09VVDgoSW9DLCBCMl9UU1RfQ1RSTDEsIFRTVF9DRkdfV1JJVEVfT04pOworCVNLX09VVDE2KElvQywgUENJX0MoUENJX1NUQVRVUyksIChTS19VMTYpKFdvcmQgfCBQQ0lfRVJSQklUUykpOworCVNLX09VVDgoSW9DLCBCMl9UU1RfQ1RSTDEsIFRTVF9DRkdfV1JJVEVfT0ZGKTsKKworCS8qIGRvIHRoZSByZXNldCwgYWxsIExFRHMgYXJlIHN3aXRjaGVkIG9mZiBub3cgKi8KKwlTS19PVVQ4KElvQywgQjBfQ1RTVCwgQ1NfUlNUX1NFVCk7CisJCisJcEFDLT5HSW5pLkdJTGV2ZWwgPSBTS19JTklUX0RBVEE7Cit9CS8qIFNrR2VEZUluaXQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZUluaXRQb3J0KCkJSW5pdGlhbGl6ZSB0aGUgc3BlY2lmaWVkIHBvcnQuCisgKgorICogRGVzY3JpcHRpb246CisgKglQUnhRU2l6ZSwgUFhTUVNpemUsIGFuZCBQWEFRU2l6ZSBoYXMgdG8gYmUKKyAqCWNvbmZpZ3VyZWQgZm9yIHRoZSBzcGVjaWZpZWQgcG9ydCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICogIFRoZSBkZXNjcmlwdG9yIHJpbmdzIGhhcyB0byBiZSBpbml0aWFsaXplZCB0b28uCisgKgorICoJbyAoUmUpY29uZmlndXJlIHF1ZXVlcyBvZiB0aGUgc3BlY2lmaWVkIHBvcnQuCisgKglvIGNvbmZpZ3VyZSB0aGUgTUFDIG9mIHRoZSBzcGVjaWZpZWQgcG9ydC4KKyAqCW8gcHV0IEFTSUMgYW5kIE1BQyhzKSBpbiBvcGVyYXRpb25hbCBtb2RlLgorICoJbyBpbml0aWFsaXplIFJ4L1R4IGFuZCBTeW5jIExFRAorICoJbyBpbml0aWFsaXplIFJBTSBCdWZmZXJzIGFuZCBNQUMgRklGT3MKKyAqCisgKglUaGUgcG9ydCBpcyByZWFkeSB0byBjb25uZWN0IHdoZW4gcmV0dXJuaW5nLgorICoKKyAqIE5vdGU6CisgKglUaGUgTUFDJ3MgUnggYW5kIFR4IHN0YXRlIG1hY2hpbmUgaXMgc3RpbGwgZGlzYWJsZWQgd2hlbiByZXR1cm5pbmcuCisgKgorICogUmV0dXJuczoKKyAqCTA6CXN1Y2Nlc3MKKyAqCTE6CVF1ZXVlIHNpemUgaW5pdGlhbGl6YXRpb24gZXJyb3IuIFRoZSBjb25maWd1cmVkIHZhbHVlcworICoJCWZvciBQUnhRU2l6ZSwgUFhTUVNpemUsIG9yIFBYQVFTaXplIGFyZSBpbnZhbGlkIGZvciBvbmUKKyAqCQlvciBtb3JlIHF1ZXVlcy4gVGhlIHNwZWNpZmllZCBwb3J0IHdhcyBOT1QgaW5pdGlhbGl6ZWQuCisgKgkJQW4gZXJyb3IgbG9nIGVudHJ5IHdhcyBnZW5lcmF0ZWQuCisgKgkyOglUaGUgcG9ydCBoYXMgdG8gYmUgc3RvcHBlZCBiZWZvcmUgaXQgY2FuIGJlIGluaXRpYWxpemVkIGFnYWluLgorICovCitpbnQgU2tHZUluaXRQb3J0KAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFBvcnQgdG8gY29uZmlndXJlICovCit7CisJU0tfR0VQT1JUICpwUHJ0OworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlpZiAoU2tHZUNoZWNrUVNpemUocEFDLCBQb3J0KSAhPSAwKSB7CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSFdJX0UwMDQsIFNLRVJSX0hXSV9FMDA0TVNHKTsKKwkJcmV0dXJuKDEpOworCX0KKwkKKwlpZiAocFBydC0+UFN0YXRlID09IFNLX1BSVF9JTklUIHx8IHBQcnQtPlBTdGF0ZSA9PSBTS19QUlRfUlVOKSB7CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSFdJX0UwMDUsIFNLRVJSX0hXSV9FMDA1TVNHKTsKKwkJcmV0dXJuKDIpOworCX0KKworCS8qIGNvbmZpZ3VyYXRpb24gb2ssIGluaXRpYWxpemUgdGhlIFBvcnQgbm93ICovCisKKyNpZmRlZiBHRU5FU0lTCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJLyogaW5pdGlhbGl6ZSBSeCwgVHggYW5kIExpbmsgTEVEICovCisJCS8qCisJCSAqIElmIDEwMDBCVCBQaHkgbmVlZHMgTEVEIGluaXRpYWxpemF0aW9uIHRoYW4gc3dhcAorCQkgKiBMRUQgYW5kIFhNQUMgaW5pdGlhbGl6YXRpb24gb3JkZXIKKwkJICovCisJCVNrR2VYbWl0TEVEKHBBQywgSW9DLCBNUl9BRERSKFBvcnQsIFRYX0xFRF9JTkkpLCBTS19MRURfRU5BKTsKKwkJU2tHZVhtaXRMRUQocEFDLCBJb0MsIE1SX0FERFIoUG9ydCwgUlhfTEVEX0lOSSksIFNLX0xFRF9FTkEpOworCQkvKiBUaGUgTGluayBMRUQgaXMgaW5pdGlhbGl6ZWQgYnkgUkxNVCBvciBEaWFnbm9zdGljcyBpdHNlbGYgKi8KKwkJCisJCVNrWG1Jbml0TWFjKHBBQywgSW9DLCBQb3J0KTsKKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJaWYgKHBBQy0+R0luaS5HSVl1a29uKSB7CisKKwkJU2tHbUluaXRNYWMocEFDLCBJb0MsIFBvcnQpOworCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCQorCS8qIGRvIE5PVCBpbml0aWFsaXplIHRoZSBMaW5rIFN5bmMgQ291bnRlciAqLworCisJU2tHZUluaXRNYWNGaWZvKHBBQywgSW9DLCBQb3J0KTsKKwkKKwlTa0dlSW5pdFJhbUJ1ZnMocEFDLCBJb0MsIFBvcnQpOworCQorCWlmIChwUHJ0LT5QWFNRU2l6ZSAhPSAwKSB7CisJCS8qIGVuYWJsZSBGb3JjZSBTeW5jIGJpdCBpZiBzeW5jaHJvbm91cyBxdWV1ZSBhdmFpbGFibGUgKi8KKwkJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgVFhBX0NUUkwpLCBUWEFfRU5BX0ZTWU5DKTsKKwl9CisJCisJU2tHZUluaXRCbXUocEFDLCBJb0MsIFBvcnQpOworCisJLyogbWFyayBwb3J0IGFzIGluaXRpYWxpemVkICovCisJcFBydC0+UFN0YXRlID0gU0tfUFJUX0lOSVQ7CisKKwlyZXR1cm4oMCk7Cit9CS8qIFNrR2VJbml0UG9ydCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlbWliLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2VtaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTkxYmM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlbWliLmMKQEAgLTAsMCArMSwxMDgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2dlbWliLmMKKyAqIFByb2plY3Q6CUdFbmVzaXMsIFBDSSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4xMSAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wOS8xNSAxMzozODoxMiAkCisgKiBQdXJwb3NlOglQcml2YXRlIE5ldHdvcmsgTWFuYWdlbWVudCBJbnRlcmZhY2UgTWFuYWdlbWVudCBEYXRhYmFzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogUFJJVkFURSBPSUQgaGFuZGxlciBmdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KK1BOTUlfU1RBVElDIGludCBBZGRyKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBhY3Rpb24sCisJU0tfVTMyIElkLCBjaGFyICpwQnVmLCB1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwKKwl1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgU0tfVTMyIE5ldEluZGV4KTsKK1BOTUlfU1RBVElDIGludCBDc3VtU3RhdChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgYWN0aW9uLCBTS19VMzIgSWQsCisJY2hhciAqcEJ1ZiwgdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsCisJdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBpbnQgR2VuZXJhbChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgYWN0aW9uLCBTS19VMzIgSWQsCisJY2hhciAqcEJ1ZiwgdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsCisJdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBpbnQgTWFjODAyM1N0YXQoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IGFjdGlvbiwgU0tfVTMyIElkLAorCWNoYXIgKnBCdWYsIHVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIEluc3RhbmNlLAorCXVuc2lnbmVkIGludCBUYWJsZUluZGV4LCBTS19VMzIgTmV0SW5kZXgpOworUE5NSV9TVEFUSUMgaW50IE1hY1ByaXZhdGVDb25mKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBhY3Rpb24sIFNLX1UzMiBJZCwKKwljaGFyICpwQnVmLCB1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwKKwl1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgU0tfVTMyIE5ldEluZGV4KTsKK1BOTUlfU1RBVElDIGludCBNYWNQcml2YXRlU3RhdChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgYWN0aW9uLCBTS19VMzIgSWQsCisJY2hhciAqcEJ1ZiwgdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsCisJdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBpbnQgTW9uaXRvcihTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgYWN0aW9uLAorCVNLX1UzMiBJZCwgY2hhciAqcEJ1ZiwgdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsCisJdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBpbnQgT2lkU3RydWN0KFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBhY3Rpb24sIFNLX1UzMiBJZCwKKwljaGFyICpwQnVmLCB1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwKKwl1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgU0tfVTMyIE5ldEluZGV4KTsKK1BOTUlfU1RBVElDIGludCBQZXJmb3JtKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBhY3Rpb24sIFNLX1UzMiBJZCwKKwljaGFyICpwQnVmLCB1bnNpZ25lZCBpbnQqIHBMZW4sIFNLX1UzMiBJbnN0YW5jZSwKKwl1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgU0tfVTMyIE5ldEluZGV4KTsKK1BOTUlfU1RBVElDIGludCBSbG10KFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBhY3Rpb24sIFNLX1UzMiBJZCwKKwljaGFyICpwQnVmLCB1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwKKwl1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgU0tfVTMyIE5ldEluZGV4KTsKK1BOTUlfU1RBVElDIGludCBSbG10U3RhdChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgYWN0aW9uLCBTS19VMzIgSWQsCisJY2hhciAqcEJ1ZiwgdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsCisJdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBpbnQgU2Vuc29yU3RhdChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgYWN0aW9uLCBTS19VMzIgSWQsCisJY2hhciAqcEJ1ZiwgdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsCisJdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBpbnQgVnBkKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBhY3Rpb24sIFNLX1UzMiBJZCwKKwljaGFyICpwQnVmLCB1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwKKwl1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgU0tfVTMyIE5ldEluZGV4KTsKK1BOTUlfU1RBVElDIGludCBWY3QoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IGFjdGlvbiwgU0tfVTMyIElkLAorCWNoYXIgKnBCdWYsIHVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIEluc3RhbmNlLAorCXVuc2lnbmVkIGludCBUYWJsZUluZGV4LCBTS19VMzIgTmV0SW5kZXgpOworCisjaWZkZWYgU0tfUE9XRVJfTUdNVAorUE5NSV9TVEFUSUMgaW50IFBvd2VyTWFuYWdlbWVudChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgYWN0aW9uLCBTS19VMzIgSWQsCisJY2hhciAqcEJ1ZiwgdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsCisJdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CisjZW5kaWYgLyogU0tfUE9XRVJfTUdNVCAqLworCisjaWZkZWYgU0tfRElBR19TVVBQT1JUCitQTk1JX1NUQVRJQyBpbnQgRGlhZ0FjdGlvbnMoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IGFjdGlvbiwgU0tfVTMyIElkLAorCWNoYXIgKnBCdWYsIHVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIEluc3RhbmNlLAorCXVuc2lnbmVkIGludCBUYWJsZUluZGV4LCBTS19VMzIgTmV0SW5kZXgpOworI2VuZGlmIC8qIFNLX0RJQUdfU1VQUE9SVCAqLworCisKKy8qIGRlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSURfVEFCTEVfU0laRSAoc2l6ZW9mKElkVGFibGUpL3NpemVvZihJZFRhYmxlWzBdKSkKKworCisvKiBnbG9iYWwgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUYWJsZSB0byBjb3JyZWxhdGUgT0lEIHdpdGggaGFuZGxlciBmdW5jdGlvbiBhbmQgaW5kZXggdG8KKyAqIGhhcmR3YXJlIHJlZ2lzdGVyIHN0b3JlZCBpbiBTdGF0QWRkcmVzcyBpZiBhcHBsaWNhYmxlLgorICovCitQTk1JX1NUQVRJQyBjb25zdCBTS19QTk1JX1RBQl9FTlRSWSBJZFRhYmxlW10gPSB7CisJe09JRF9HRU5fWE1JVF9PSywKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIFNLX1BOTUlfSFRYfSwKKwl7T0lEX0dFTl9SQ1ZfT0ssCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIE1hYzgwMjNTdGF0LCBTS19QTk1JX0hSWH0sCisJe09JRF9HRU5fWE1JVF9FUlJPUiwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9HRU5fUkNWX0VSUk9SLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX0dFTl9SQ1ZfTk9fQlVGRkVSLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX0dFTl9ESVJFQ1RFRF9GUkFNRVNfWE1JVCwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIFNLX1BOTUlfSFRYX1VOSUNBU1R9LAorCXtPSURfR0VOX01VTFRJQ0FTVF9GUkFNRVNfWE1JVCwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIFNLX1BOTUlfSFRYX01VTFRJQ0FTVH0sCisJe09JRF9HRU5fQlJPQURDQVNUX0ZSQU1FU19YTUlULAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBNYWM4MDIzU3RhdCwgU0tfUE5NSV9IVFhfQlJPQURDQVNUfSwKKwl7T0lEX0dFTl9ESVJFQ1RFRF9GUkFNRVNfUkNWLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBNYWM4MDIzU3RhdCwgU0tfUE5NSV9IUlhfVU5JQ0FTVH0sCisJe09JRF9HRU5fTVVMVElDQVNUX0ZSQU1FU19SQ1YsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIE1hYzgwMjNTdGF0LCBTS19QTk1JX0hSWF9NVUxUSUNBU1R9LAorCXtPSURfR0VOX0JST0FEQ0FTVF9GUkFNRVNfUkNWLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBNYWM4MDIzU3RhdCwgU0tfUE5NSV9IUlhfQlJPQURDQVNUfSwKKwl7T0lEX0dFTl9SQ1ZfQ1JDX0VSUk9SLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBNYWM4MDIzU3RhdCwgU0tfUE5NSV9IUlhfRkNTfSwKKwl7T0lEX0dFTl9UUkFOU01JVF9RVUVVRV9MRU5HVEgsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfODAyXzNfUEVSTUFORU5UX0FERFJFU1MsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIE1hYzgwMjNTdGF0LCAwfSwKKwl7T0lEXzgwMl8zX0NVUlJFTlRfQUREUkVTUywKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIDB9LAorCXtPSURfODAyXzNfUkNWX0VSUk9SX0FMSUdOTUVOVCwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIFNLX1BOTUlfSFJYX0ZSQU1JTkd9LAorCXtPSURfODAyXzNfWE1JVF9PTkVfQ09MTElTSU9OLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBNYWM4MDIzU3RhdCwgU0tfUE5NSV9IVFhfU0lOR0xFX0NPTH0sCisJe09JRF84MDJfM19YTUlUX01PUkVfQ09MTElTSU9OUywKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIFNLX1BOTUlfSFRYX01VTFRJX0NPTH0sCisJe09JRF84MDJfM19YTUlUX0RFRkVSUkVELAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBNYWM4MDIzU3RhdCwgU0tfUE5NSV9IVFhfREVGRkVSQUx9LAorCXtPSURfODAyXzNfWE1JVF9NQVhfQ09MTElTSU9OUywKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIFNLX1BOTUlfSFRYX0VYQ0VTU19DT0x9LAorCXtPSURfODAyXzNfUkNWX09WRVJSVU4sCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIE1hYzgwMjNTdGF0LCBTS19QTk1JX0hSWF9PVkVSRkxPV30sCisJe09JRF84MDJfM19YTUlUX1VOREVSUlVOLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBNYWM4MDIzU3RhdCwgU0tfUE5NSV9IVFhfVU5ERVJSVU59LAorCXtPSURfODAyXzNfWE1JVF9USU1FU19DUlNfTE9TVCwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgTWFjODAyM1N0YXQsIFNLX1BOTUlfSFRYX0NBUlJJRVJ9LAorCXtPSURfODAyXzNfWE1JVF9MQVRFX0NPTExJU0lPTlMsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIE1hYzgwMjNTdGF0LCBTS19QTk1JX0hUWF9MQVRFX0NPTH0sCisjaWZkZWYgU0tfUE9XRVJfTUdNVAorCXtPSURfUE5QX0NBUEFCSUxJVElFUywKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgUG93ZXJNYW5hZ2VtZW50LCAwfSwKKwl7T0lEX1BOUF9TRVRfUE9XRVIsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfV08sIFBvd2VyTWFuYWdlbWVudCwgMH0sCisJe09JRF9QTlBfUVVFUllfUE9XRVIsCisJCTAsCisJCTAsCisJCTAsCisJCVNLX1BOTUlfUk8sIFBvd2VyTWFuYWdlbWVudCwgMH0sCisJe09JRF9QTlBfQUREX1dBS0VfVVBfUEFUVEVSTiwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9XTywgUG93ZXJNYW5hZ2VtZW50LCAwfSwKKwl7T0lEX1BOUF9SRU1PVkVfV0FLRV9VUF9QQVRURVJOLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1dPLCBQb3dlck1hbmFnZW1lbnQsIDB9LAorCXtPSURfUE5QX0VOQUJMRV9XQUtFX1VQLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JXLCBQb3dlck1hbmFnZW1lbnQsIDB9LAorI2VuZGlmIC8qIFNLX1BPV0VSX01HTVQgKi8KKyNpZmRlZiBTS19ESUFHX1NVUFBPUlQKKwl7T0lEX1NLR0VfRElBR19NT0RFLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JXLCBEaWFnQWN0aW9ucywgMH0sCisjZW5kaWYgLyogU0tfRElBR19TVVBQT1JUICovCisJe09JRF9TS0dFX01EQl9WRVJTSU9OLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoTWdtdERCVmVyc2lvbiksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9TVVBQT1JURURfTElTVCwKKwkJMCwKKwkJMCwKKwkJMCwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX0FMTF9EQVRBLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JXLCBPaWRTdHJ1Y3QsIDB9LAorCXtPSURfU0tHRV9WUERfRlJFRV9CWVRFUywKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFZwZEZyZWVCeXRlcyksCisJCVNLX1BOTUlfUk8sIFZwZCwgMH0sCisJe09JRF9TS0dFX1ZQRF9FTlRSSUVTX0xJU1QsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihWcGRFbnRyaWVzTGlzdCksCisJCVNLX1BOTUlfUk8sIFZwZCwgMH0sCisJe09JRF9TS0dFX1ZQRF9FTlRSSUVTX05VTUJFUiwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFZwZEVudHJpZXNOdW1iZXIpLAorCQlTS19QTk1JX1JPLCBWcGQsIDB9LAorCXtPSURfU0tHRV9WUERfS0VZLAorCQlTS19QTk1JX1ZQRF9FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9WUEQpLAorCQlTS19QTk1JX09GRihWcGQpICsgU0tfUE5NSV9WUERfT0ZGKFZwZEtleSksCisJCVNLX1BOTUlfUk8sIFZwZCwgMH0sCisJe09JRF9TS0dFX1ZQRF9WQUxVRSwKKwkJU0tfUE5NSV9WUERfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfVlBEKSwKKwkJU0tfUE5NSV9PRkYoVnBkKSArIFNLX1BOTUlfVlBEX09GRihWcGRWYWx1ZSksCisJCVNLX1BOTUlfUk8sIFZwZCwgMH0sCisJe09JRF9TS0dFX1ZQRF9BQ0NFU1MsCisJCVNLX1BOTUlfVlBEX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1ZQRCksCisJCVNLX1BOTUlfT0ZGKFZwZCkgKyBTS19QTk1JX1ZQRF9PRkYoVnBkQWNjZXNzKSwKKwkJU0tfUE5NSV9STywgVnBkLCAwfSwKKwl7T0lEX1NLR0VfVlBEX0FDVElPTiwKKwkJU0tfUE5NSV9WUERfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfVlBEKSwKKwkJU0tfUE5NSV9PRkYoVnBkKSArIFNLX1BOTUlfVlBEX09GRihWcGRBY3Rpb24pLAorCQlTS19QTk1JX1JXLCBWcGQsIDB9LAorCXtPSURfU0tHRV9QT1JUX05VTUJFUiwJCQorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoUG9ydE51bWJlciksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9ERVZJQ0VfVFlQRSwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKERldmljZVR5cGUpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfRFJJVkVSX0RFU0NSLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoRHJpdmVyRGVzY3IpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfRFJJVkVSX1ZFUlNJT04sCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihEcml2ZXJWZXJzaW9uKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX0RSSVZFUl9SRUxEQVRFLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoRHJpdmVyUmVsZWFzZURhdGUpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfRFJJVkVSX0ZJTEVOQU1FLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoRHJpdmVyRmlsZU5hbWUpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfSFdfREVTQ1IsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihId0Rlc2NyKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX0hXX1ZFUlNJT04sCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihId1ZlcnNpb24pLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfQ0hJUFNFVCwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKENoaXBzZXQpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfQ0hJUElELAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoQ2hpcElkKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1JBTVNJWkUsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihSYW1TaXplKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1ZBVVhBVkFJTCwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFZhdXhBdmFpbCksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9BQ1RJT04sCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihBY3Rpb24pLAorCQlTS19QTk1JX1JXLCBQZXJmb3JtLCAwfSwKKwl7T0lEX1NLR0VfUkVTVUxULAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoVGVzdFJlc3VsdCksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9CVVNfVFlQRSwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKEJ1c1R5cGUpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfQlVTX1NQRUVELAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoQnVzU3BlZWQpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfQlVTX1dJRFRILAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoQnVzV2lkdGgpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfVFhfU1dfUVVFVUVfTEVOLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoVHhTd1F1ZXVlTGVuKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1RYX1NXX1FVRVVFX01BWCwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFR4U3dRdWV1ZU1heCksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9UWF9SRVRSWSwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFR4UmV0cnlDdHMpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfUlhfSU5UUl9DVFMsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihSeEludHJDdHMpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfVFhfSU5UUl9DVFMsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihUeEludHJDdHMpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfUlhfTk9fQlVGX0NUUywKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFJ4Tm9CdWZDdHMpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfVFhfTk9fQlVGX0NUUywKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFR4Tm9CdWZDdHMpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfVFhfVVNFRF9ERVNDUl9OTywKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFR4VXNlZERlc2NyTm8pLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfUlhfREVMSVZFUkVEX0NUUywKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFJ4RGVsaXZlcmVkQ3RzKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1JYX09DVEVUU19ERUxJVl9DVFMsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihSeE9jdGV0c0RlbGl2ZXJlZEN0cyksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9SWF9IV19FUlJPUl9DVFMsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihSeEh3RXJyb3JzQ3RzKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1RYX0hXX0VSUk9SX0NUUywKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFR4SHdFcnJvcnNDdHMpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfSU5fRVJST1JTX0NUUywKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKEluRXJyb3JzQ3RzKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX09VVF9FUlJPUl9DVFMsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihPdXRFcnJvcnNDdHMpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfRVJSX1JFQ09WRVJZX0NUUywKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKEVyclJlY292ZXJ5Q3RzKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1NZU1VQVElNRSwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFN5c1VwVGltZSksCisJCVNLX1BOTUlfUk8sIEdlbmVyYWwsIDB9LAorCXtPSURfU0tHRV9TRU5TT1JfTlVNQkVSLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoU2Vuc29yTnVtYmVyKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1NFTlNPUl9JTkRFWCwKKwkJU0tfUE5NSV9TRU5TT1JfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU0VOU09SKSwKKwkJU0tfUE5NSV9PRkYoU2Vuc29yKSArIFNLX1BOTUlfU0VOX09GRihTZW5zb3JJbmRleCksCisJCVNLX1BOTUlfUk8sIFNlbnNvclN0YXQsIDB9LAorCXtPSURfU0tHRV9TRU5TT1JfREVTQ1IsCisJCVNLX1BOTUlfU0VOU09SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NFTlNPUiksCisJCVNLX1BOTUlfT0ZGKFNlbnNvcikgKyBTS19QTk1JX1NFTl9PRkYoU2Vuc29yRGVzY3IpLAorCQlTS19QTk1JX1JPLCBTZW5zb3JTdGF0LCAwfSwKKwl7T0lEX1NLR0VfU0VOU09SX1RZUEUsCisJCVNLX1BOTUlfU0VOU09SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NFTlNPUiksCisJCVNLX1BOTUlfT0ZGKFNlbnNvcikgKyBTS19QTk1JX1NFTl9PRkYoU2Vuc29yVHlwZSksCisJCVNLX1BOTUlfUk8sIFNlbnNvclN0YXQsIDB9LAorCXtPSURfU0tHRV9TRU5TT1JfVkFMVUUsCisJCVNLX1BOTUlfU0VOU09SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NFTlNPUiksCisJCVNLX1BOTUlfT0ZGKFNlbnNvcikgKyBTS19QTk1JX1NFTl9PRkYoU2Vuc29yVmFsdWUpLAorCQlTS19QTk1JX1JPLCBTZW5zb3JTdGF0LCAwfSwKKwl7T0lEX1NLR0VfU0VOU09SX1dBUl9USFJFU19MT1csCisJCVNLX1BOTUlfU0VOU09SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NFTlNPUiksCisJCVNLX1BOTUlfT0ZGKFNlbnNvcikgKyBTS19QTk1JX1NFTl9PRkYoU2Vuc29yV2FybmluZ1RocmVzaG9sZExvdyksCisJCVNLX1BOTUlfUk8sIFNlbnNvclN0YXQsIDB9LAorCXtPSURfU0tHRV9TRU5TT1JfV0FSX1RIUkVTX1VQUCwKKwkJU0tfUE5NSV9TRU5TT1JfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU0VOU09SKSwKKwkJU0tfUE5NSV9PRkYoU2Vuc29yKSArIFNLX1BOTUlfU0VOX09GRihTZW5zb3JXYXJuaW5nVGhyZXNob2xkSGlnaCksCisJCVNLX1BOTUlfUk8sIFNlbnNvclN0YXQsIDB9LAorCXtPSURfU0tHRV9TRU5TT1JfRVJSX1RIUkVTX0xPVywKKwkJU0tfUE5NSV9TRU5TT1JfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU0VOU09SKSwKKwkJU0tfUE5NSV9PRkYoU2Vuc29yKSArIFNLX1BOTUlfU0VOX09GRihTZW5zb3JFcnJvclRocmVzaG9sZExvdyksCisJCVNLX1BOTUlfUk8sIFNlbnNvclN0YXQsIDB9LAorCXtPSURfU0tHRV9TRU5TT1JfRVJSX1RIUkVTX1VQUCwKKwkJU0tfUE5NSV9TRU5TT1JfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU0VOU09SKSwKKwkJU0tfUE5NSV9PRkYoU2Vuc29yKSArIFNLX1BOTUlfU0VOX09GRihTZW5zb3JFcnJvclRocmVzaG9sZEhpZ2gpLAorCQlTS19QTk1JX1JPLCBTZW5zb3JTdGF0LCAwfSwKKwl7T0lEX1NLR0VfU0VOU09SX1NUQVRVUywKKwkJU0tfUE5NSV9TRU5TT1JfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU0VOU09SKSwKKwkJU0tfUE5NSV9PRkYoU2Vuc29yKSArIFNLX1BOTUlfU0VOX09GRihTZW5zb3JTdGF0dXMpLAorCQlTS19QTk1JX1JPLCBTZW5zb3JTdGF0LCAwfSwKKwl7T0lEX1NLR0VfU0VOU09SX1dBUl9DVFMsCisJCVNLX1BOTUlfU0VOU09SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NFTlNPUiksCisJCVNLX1BOTUlfT0ZGKFNlbnNvcikgKyBTS19QTk1JX1NFTl9PRkYoU2Vuc29yV2FybmluZ0N0cyksCisJCVNLX1BOTUlfUk8sIFNlbnNvclN0YXQsIDB9LAorCXtPSURfU0tHRV9TRU5TT1JfRVJSX0NUUywKKwkJU0tfUE5NSV9TRU5TT1JfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU0VOU09SKSwKKwkJU0tfUE5NSV9PRkYoU2Vuc29yKSArIFNLX1BOTUlfU0VOX09GRihTZW5zb3JFcnJvckN0cyksCisJCVNLX1BOTUlfUk8sIFNlbnNvclN0YXQsIDB9LAorCXtPSURfU0tHRV9TRU5TT1JfV0FSX1RJTUUsCisJCVNLX1BOTUlfU0VOU09SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NFTlNPUiksCisJCVNLX1BOTUlfT0ZGKFNlbnNvcikgKyBTS19QTk1JX1NFTl9PRkYoU2Vuc29yV2FybmluZ1RpbWVzdGFtcCksCisJCVNLX1BOTUlfUk8sIFNlbnNvclN0YXQsIDB9LAorCXtPSURfU0tHRV9TRU5TT1JfRVJSX1RJTUUsCisJCVNLX1BOTUlfU0VOU09SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NFTlNPUiksCisJCVNLX1BOTUlfT0ZGKFNlbnNvcikgKyBTS19QTk1JX1NFTl9PRkYoU2Vuc29yRXJyb3JUaW1lc3RhbXApLAorCQlTS19QTk1JX1JPLCBTZW5zb3JTdGF0LCAwfSwKKwl7T0lEX1NLR0VfQ0hLU01fTlVNQkVSLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoQ2hlY2tzdW1OdW1iZXIpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfQ0hLU01fUlhfT0tfQ1RTLAorCQlTS0NTX05VTV9QUk9UT0NPTFMsCisJCXNpemVvZihTS19QTk1JX0NIRUNLU1VNKSwKKwkJU0tfUE5NSV9PRkYoQ2hlY2tzdW0pICsgU0tfUE5NSV9DSEtfT0ZGKENoZWNrc3VtUnhPa0N0cyksCisJCVNLX1BOTUlfUk8sIENzdW1TdGF0LCAwfSwKKwl7T0lEX1NLR0VfQ0hLU01fUlhfVU5BQkxFX0NUUywKKwkJU0tDU19OVU1fUFJPVE9DT0xTLAorCQlzaXplb2YoU0tfUE5NSV9DSEVDS1NVTSksCisJCVNLX1BOTUlfT0ZGKENoZWNrc3VtKSArIFNLX1BOTUlfQ0hLX09GRihDaGVja3N1bVJ4VW5hYmxlQ3RzKSwKKwkJU0tfUE5NSV9STywgQ3N1bVN0YXQsIDB9LAorCXtPSURfU0tHRV9DSEtTTV9SWF9FUlJfQ1RTLAorCQlTS0NTX05VTV9QUk9UT0NPTFMsCisJCXNpemVvZihTS19QTk1JX0NIRUNLU1VNKSwKKwkJU0tfUE5NSV9PRkYoQ2hlY2tzdW0pICsgU0tfUE5NSV9DSEtfT0ZGKENoZWNrc3VtUnhFcnJDdHMpLAorCQlTS19QTk1JX1JPLCBDc3VtU3RhdCwgMH0sCisJe09JRF9TS0dFX0NIS1NNX1RYX09LX0NUUywKKwkJU0tDU19OVU1fUFJPVE9DT0xTLAorCQlzaXplb2YoU0tfUE5NSV9DSEVDS1NVTSksCisJCVNLX1BOTUlfT0ZGKENoZWNrc3VtKSArIFNLX1BOTUlfQ0hLX09GRihDaGVja3N1bVR4T2tDdHMpLAorCQlTS19QTk1JX1JPLCBDc3VtU3RhdCwgMH0sCisJe09JRF9TS0dFX0NIS1NNX1RYX1VOQUJMRV9DVFMsCisJCVNLQ1NfTlVNX1BST1RPQ09MUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ0hFQ0tTVU0pLAorCQlTS19QTk1JX09GRihDaGVja3N1bSkgKyBTS19QTk1JX0NIS19PRkYoQ2hlY2tzdW1UeFVuYWJsZUN0cyksCisJCVNLX1BOTUlfUk8sIENzdW1TdGF0LCAwfSwKKwl7T0lEX1NLR0VfU1RBVF9UWCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeE9rQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYfSwKKwl7T0lEX1NLR0VfU1RBVF9UWF9PQ1RFVFMsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhPY3RldHNPa0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWF9PQ1RFVH0sCisJe09JRF9TS0dFX1NUQVRfVFhfQlJPQURDQVNULAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4QnJvYWRjYXN0T2tDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfQlJPQURDQVNUfSwKKwl7T0lEX1NLR0VfU1RBVF9UWF9NVUxUSUNBU1QsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhNdWx0aWNhc3RPa0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWF9NVUxUSUNBU1R9LAorCXtPSURfU0tHRV9TVEFUX1RYX1VOSUNBU1QsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhVbmljYXN0T2tDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfVU5JQ0FTVH0sCisJe09JRF9TS0dFX1NUQVRfVFhfTE9OR0ZSQU1FUywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeExvbmdGcmFtZXNDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfTE9OR0ZSQU1FU30sCisJe09JRF9TS0dFX1NUQVRfVFhfQlVSU1QsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhCdXJzdEN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWF9CVVJTVH0sCisJe09JRF9TS0dFX1NUQVRfVFhfUEZMT1dDLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4UGF1c2VNYWNDdHJsQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYX1BNQUNDfSwKKwl7T0lEX1NLR0VfU1RBVF9UWF9GTE9XQywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeE1hY0N0cmxDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfTUFDQ30sCisJe09JRF9TS0dFX1NUQVRfVFhfU0lOR0xFX0NPTCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeFNpbmdsZUNvbGxpc2lvbkN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWF9TSU5HTEVfQ09MfSwKKwl7T0lEX1NLR0VfU1RBVF9UWF9NVUxUSV9DT0wsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhNdWx0aXBsZUNvbGxpc2lvbkN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWF9NVUxUSV9DT0x9LAorCXtPSURfU0tHRV9TVEFUX1RYX0VYQ0VTU19DT0wsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhFeGNlc3NpdmVDb2xsaXNpb25DdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfRVhDRVNTX0NPTH0sCisJe09JRF9TS0dFX1NUQVRfVFhfTEFURV9DT0wsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhMYXRlQ29sbGlzaW9uQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYX0xBVEVfQ09MfSwKKwl7T0lEX1NLR0VfU1RBVF9UWF9ERUZGRVJBTCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeERlZmVycmFsQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYX0RFRkZFUkFMfSwKKwl7T0lEX1NLR0VfU1RBVF9UWF9FWENFU1NfREVGLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4RXhjZXNzaXZlRGVmZXJyYWxDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfRVhDRVNTX0RFRn0sCisJe09JRF9TS0dFX1NUQVRfVFhfVU5ERVJSVU4sCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhGaWZvVW5kZXJydW5DdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfVU5ERVJSVU59LAorCXtPSURfU0tHRV9TVEFUX1RYX0NBUlJJRVIsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhDYXJyaWVyQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYX0NBUlJJRVJ9LAorLyoJe09JRF9TS0dFX1NUQVRfVFhfVVRJTCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeFV0aWxpemF0aW9uKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIChTS19VMTYpKC0xKX0sICovCisJe09JRF9TS0dFX1NUQVRfVFhfNjQsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHg2NEN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hUWF82NH0sCisJe09JRF9TS0dFX1NUQVRfVFhfMTI3LAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4MTI3Q3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYXzEyN30sCisJe09JRF9TS0dFX1NUQVRfVFhfMjU1LAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4MjU1Q3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYXzI1NX0sCisJe09JRF9TS0dFX1NUQVRfVFhfNTExLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4NTExQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYXzUxMX0sCisJe09JRF9TS0dFX1NUQVRfVFhfMTAyMywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeDEwMjNDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfMTAyM30sCisJe09JRF9TS0dFX1NUQVRfVFhfTUFYLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFR4TWF4Q3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYX01BWH0sCisJe09JRF9TS0dFX1NUQVRfVFhfU1lOQywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRUeFN5bmNDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IVFhfU1lOQ30sCisJe09JRF9TS0dFX1NUQVRfVFhfU1lOQ19PQ1RFVFMsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0VHhTeW5jT2N0ZXRzQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFRYX1NZTkNfT0NURVR9LAorCXtPSURfU0tHRV9TVEFUX1JYLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4T2tDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlh9LAorCXtPSURfU0tHRV9TVEFUX1JYX09DVEVUUywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeE9jdGV0c09rQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX09DVEVUfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9CUk9BRENBU1QsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhCcm9hZGNhc3RPa0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9CUk9BRENBU1R9LAorCXtPSURfU0tHRV9TVEFUX1JYX01VTFRJQ0FTVCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeE11bHRpY2FzdE9rQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX01VTFRJQ0FTVH0sCisJe09JRF9TS0dFX1NUQVRfUlhfVU5JQ0FTVCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeFVuaWNhc3RPa0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9VTklDQVNUfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9MT05HRlJBTUVTLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4TG9uZ0ZyYW1lc0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9MT05HRlJBTUVTfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9QRkxPV0MsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhQYXVzZU1hY0N0cmxDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfUE1BQ0N9LAorCXtPSURfU0tHRV9TVEFUX1JYX0ZMT1dDLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4TWFjQ3RybEN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9NQUNDfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9QRkxPV0NfRVJSLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4UGF1c2VNYWNDdHJsRXJyb3JDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfUE1BQ0NfRVJSfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9GTE9XQ19VTktXTiwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeE1hY0N0cmxVbmtub3duQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX01BQ0NfVU5LV059LAorCXtPSURfU0tHRV9TVEFUX1JYX0JVUlNULAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4QnVyc3RDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfQlVSU1R9LAorCXtPSURfU0tHRV9TVEFUX1JYX01JU1NFRCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeE1pc3NlZEN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9NSVNTRUR9LAorCXtPSURfU0tHRV9TVEFUX1JYX0ZSQU1JTkcsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhGcmFtaW5nQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX0ZSQU1JTkd9LAorCXtPSURfU0tHRV9TVEFUX1JYX09WRVJGTE9XLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4Rmlmb092ZXJmbG93Q3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX09WRVJGTE9XfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9KQUJCRVIsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhKYWJiZXJDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfSkFCQkVSfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9DQVJSSUVSLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4Q2FycmllckN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9DQVJSSUVSfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9JUl9MRU5HVEgsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhJUkxlbmd0aEN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9JUkxFTkdUSH0sCisJe09JRF9TS0dFX1NUQVRfUlhfU1lNQk9MLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4U3ltYm9sQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX1NZTUJPTH0sCisJe09JRF9TS0dFX1NUQVRfUlhfU0hPUlRTLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4U2hvcnRzQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX1NIT1JUU30sCisJe09JRF9TS0dFX1NUQVRfUlhfUlVOVCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeFJ1bnRDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfUlVOVH0sCisJe09JRF9TS0dFX1NUQVRfUlhfQ0VYVCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeENleHRDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfQ0VYVH0sCisJe09JRF9TS0dFX1NUQVRfUlhfVE9PX0xPTkcsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhUb29Mb25nQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYX1RPT19MT05HfSwKKwl7T0lEX1NLR0VfU1RBVF9SWF9GQ1MsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhGY3NDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfRkNTfSwKKy8qCXtPSURfU0tHRV9TVEFUX1JYX1VUSUwsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UnhVdGlsaXphdGlvbiksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCAoU0tfVTE2KSgtMSl9LCAqLworCXtPSURfU0tHRV9TVEFUX1JYXzY0LAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9TVEFUKSwKKwkJU0tfUE5NSV9PRkYoU3RhdCkgKyBTS19QTk1JX1NUQV9PRkYoU3RhdFJ4NjRDdHMpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlU3RhdCwgU0tfUE5NSV9IUlhfNjR9LAorCXtPSURfU0tHRV9TVEFUX1JYXzEyNywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeDEyN0N0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF8xMjd9LAorCXtPSURfU0tHRV9TVEFUX1JYXzI1NSwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeDI1NUN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF8yNTV9LAorCXtPSURfU0tHRV9TVEFUX1JYXzUxMSwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeDUxMUN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF81MTF9LAorCXtPSURfU0tHRV9TVEFUX1JYXzEwMjMsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1NUQVQpLAorCQlTS19QTk1JX09GRihTdGF0KSArIFNLX1BOTUlfU1RBX09GRihTdGF0UngxMDIzQ3RzKSwKKwkJU0tfUE5NSV9STywgTWFjUHJpdmF0ZVN0YXQsIFNLX1BOTUlfSFJYXzEwMjN9LAorCXtPSURfU0tHRV9TVEFUX1JYX01BWCwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfU1RBVCksCisJCVNLX1BOTUlfT0ZGKFN0YXQpICsgU0tfUE5NSV9TVEFfT0ZGKFN0YXRSeE1heEN0cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVTdGF0LCBTS19QTk1JX0hSWF9NQVh9LAorCXtPSURfU0tHRV9QSFlTX0NVUl9BRERSLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9DT05GKSwKKwkJU0tfUE5NSV9PRkYoQ29uZikgKyBTS19QTk1JX0NORl9PRkYoQ29uZk1hY0N1cnJlbnRBZGRyKSwKKwkJU0tfUE5NSV9SVywgQWRkciwgMH0sCisJe09JRF9TS0dFX1BIWVNfRkFDX0FERFIsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX0NPTkYpLAorCQlTS19QTk1JX09GRihDb25mKSArIFNLX1BOTUlfQ05GX09GRihDb25mTWFjRmFjdG9yeUFkZHIpLAorCQlTS19QTk1JX1JPLCBBZGRyLCAwfSwKKwl7T0lEX1NLR0VfUE1ELAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9DT05GKSwKKwkJU0tfUE5NSV9PRkYoQ29uZikgKyBTS19QTk1JX0NORl9PRkYoQ29uZlBNRCksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfQ09OTkVDVE9SLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9DT05GKSwKKwkJU0tfUE5NSV9PRkYoQ29uZikgKyBTS19QTk1JX0NORl9PRkYoQ29uZkNvbm5lY3RvciksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfUEhZX1RZUEUsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX0NPTkYpLAorCQlTS19QTk1JX09GRihDb25mKSArIFNLX1BOTUlfQ05GX09GRihDb25mUGh5VHlwZSksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKyNpZmRlZiBTS19QSFlfTFBfTU9ERQorCQl7T0lEX1NLR0VfUEhZX0xQX01PREUsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX0NPTkYpLAorCQlTS19QTk1JX09GRihDb25mKSArIFNLX1BOTUlfQ05GX09GRihDb25mUGh5TW9kZSksCisJCVNLX1BOTUlfUlcsIE1hY1ByaXZhdGVDb25mLCAwfSwKKyNlbmRpZgkKKwl7T0lEX1NLR0VfTElOS19DQVAsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX0NPTkYpLAorCQlTS19QTk1JX09GRihDb25mKSArIFNLX1BOTUlfQ05GX09GRihDb25mTGlua0NhcGFiaWxpdHkpLAorCQlTS19QTk1JX1JPLCBNYWNQcml2YXRlQ29uZiwgMH0sCisJe09JRF9TS0dFX0xJTktfTU9ERSwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ09ORiksCisJCVNLX1BOTUlfT0ZGKENvbmYpICsgU0tfUE5NSV9DTkZfT0ZGKENvbmZMaW5rTW9kZSksCisJCVNLX1BOTUlfUlcsIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfTElOS19NT0RFX1NUQVRVUywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ09ORiksCisJCVNLX1BOTUlfT0ZGKENvbmYpICsgU0tfUE5NSV9DTkZfT0ZGKENvbmZMaW5rTW9kZVN0YXR1cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfTElOS19TVEFUVVMsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX0NPTkYpLAorCQlTS19QTk1JX09GRihDb25mKSArIFNLX1BOTUlfQ05GX09GRihDb25mTGlua1N0YXR1cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfRkxPV0NUUkxfQ0FQLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9DT05GKSwKKwkJU0tfUE5NSV9PRkYoQ29uZikgKyBTS19QTk1JX0NORl9PRkYoQ29uZkZsb3dDdHJsQ2FwYWJpbGl0eSksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfRkxPV0NUUkxfTU9ERSwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ09ORiksCisJCVNLX1BOTUlfT0ZGKENvbmYpICsgU0tfUE5NSV9DTkZfT0ZGKENvbmZGbG93Q3RybE1vZGUpLAorCQlTS19QTk1JX1JXLCBNYWNQcml2YXRlQ29uZiwgMH0sCisJe09JRF9TS0dFX0ZMT1dDVFJMX1NUQVRVUywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ09ORiksCisJCVNLX1BOTUlfT0ZGKENvbmYpICsgU0tfUE5NSV9DTkZfT0ZGKENvbmZGbG93Q3RybFN0YXR1cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfUEhZX09QRVJBVElPTl9DQVAsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX0NPTkYpLAorCQlTS19QTk1JX09GRihDb25mKSArIFNLX1BOTUlfQ05GX09GRihDb25mUGh5T3BlcmF0aW9uQ2FwYWJpbGl0eSksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfUEhZX09QRVJBVElPTl9NT0RFLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9DT05GKSwKKwkJU0tfUE5NSV9PRkYoQ29uZikgKyBTS19QTk1JX0NORl9PRkYoQ29uZlBoeU9wZXJhdGlvbk1vZGUpLAorCQlTS19QTk1JX1JXLCBNYWNQcml2YXRlQ29uZiwgMH0sCisJe09JRF9TS0dFX1BIWV9PUEVSQVRJT05fU1RBVFVTLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9DT05GKSwKKwkJU0tfUE5NSV9PRkYoQ29uZikgKyBTS19QTk1JX0NORl9PRkYoQ29uZlBoeU9wZXJhdGlvblN0YXR1cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfU1BFRURfQ0FQLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9DT05GKSwKKwkJU0tfUE5NSV9PRkYoQ29uZikgKyBTS19QTk1JX0NORl9PRkYoQ29uZlNwZWVkQ2FwYWJpbGl0eSksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfU1BFRURfTU9ERSwKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ09ORiksCisJCVNLX1BOTUlfT0ZGKENvbmYpICsgU0tfUE5NSV9DTkZfT0ZGKENvbmZTcGVlZE1vZGUpLAorCQlTS19QTk1JX1JXLCBNYWNQcml2YXRlQ29uZiwgMH0sCisJe09JRF9TS0dFX1NQRUVEX1NUQVRVUywKKwkJU0tfUE5NSV9NQUNfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfQ09ORiksCisJCVNLX1BOTUlfT0ZGKENvbmYpICsgU0tfUE5NSV9DTkZfT0ZGKENvbmZTcGVlZFN0YXR1cyksCisJCVNLX1BOTUlfUk8sIE1hY1ByaXZhdGVDb25mLCAwfSwKKwl7T0lEX1NLR0VfVFJBUCwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFRyYXApLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfVFJBUF9OVU1CRVIsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihUcmFwTnVtYmVyKSwKKwkJU0tfUE5NSV9STywgR2VuZXJhbCwgMH0sCisJe09JRF9TS0dFX1JMTVRfTU9ERSwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFJsbXRNb2RlKSwKKwkJU0tfUE5NSV9SVywgUmxtdCwgMH0sCisJe09JRF9TS0dFX1JMTVRfUE9SVF9OVU1CRVIsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihSbG10UG9ydE51bWJlciksCisJCVNLX1BOTUlfUk8sIFJsbXQsIDB9LAorCXtPSURfU0tHRV9STE1UX1BPUlRfQUNUSVZFLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoUmxtdFBvcnRBY3RpdmUpLAorCQlTS19QTk1JX1JPLCBSbG10LCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9QT1JUX1BSRUZFUlJFRCwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFJsbXRQb3J0UHJlZmVycmVkKSwKKwkJU0tfUE5NSV9SVywgUmxtdCwgMH0sCisJe09JRF9TS0dFX1JMTVRfQ0hBTkdFX0NUUywKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFJsbXRDaGFuZ2VDdHMpLAorCQlTS19QTk1JX1JPLCBSbG10LCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9DSEFOR0VfVElNRSwKKwkJMSwKKwkJMCwKKwkJU0tfUE5NSV9NQUlfT0ZGKFJsbXRDaGFuZ2VUaW1lKSwKKwkJU0tfUE5NSV9STywgUmxtdCwgMH0sCisJe09JRF9TS0dFX1JMTVRfQ0hBTkdFX0VTVElNLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoUmxtdENoYW5nZUVzdGltYXRlKSwKKwkJU0tfUE5NSV9STywgUmxtdCwgMH0sCisJe09JRF9TS0dFX1JMTVRfQ0hBTkdFX1RIUkVTLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoUmxtdENoYW5nZVRocmVzaG9sZCksCisJCVNLX1BOTUlfUlcsIFJsbXQsIDB9LAorCXtPSURfU0tHRV9STE1UX1BPUlRfSU5ERVgsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1JMTVQpLAorCQlTS19QTk1JX09GRihSbG10KSArIFNLX1BOTUlfUkxNX09GRihSbG10SW5kZXgpLAorCQlTS19QTk1JX1JPLCBSbG10U3RhdCwgMH0sCisJe09JRF9TS0dFX1JMTVRfU1RBVFVTLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9STE1UKSwKKwkJU0tfUE5NSV9PRkYoUmxtdCkgKyBTS19QTk1JX1JMTV9PRkYoUmxtdFN0YXR1cyksCisJCVNLX1BOTUlfUk8sIFJsbXRTdGF0LCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9UWF9IRUxMT19DVFMsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1JMTVQpLAorCQlTS19QTk1JX09GRihSbG10KSArIFNLX1BOTUlfUkxNX09GRihSbG10VHhIZWxsb0N0cyksCisJCVNLX1BOTUlfUk8sIFJsbXRTdGF0LCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9SWF9IRUxMT19DVFMsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1JMTVQpLAorCQlTS19QTk1JX09GRihSbG10KSArIFNLX1BOTUlfUkxNX09GRihSbG10UnhIZWxsb0N0cyksCisJCVNLX1BOTUlfUk8sIFJsbXRTdGF0LCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9UWF9TUF9SRVFfQ1RTLAorCQlTS19QTk1JX01BQ19FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9STE1UKSwKKwkJU0tfUE5NSV9PRkYoUmxtdCkgKyBTS19QTk1JX1JMTV9PRkYoUmxtdFR4U3BIZWxsb1JlcUN0cyksCisJCVNLX1BOTUlfUk8sIFJsbXRTdGF0LCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9SWF9TUF9DVFMsCisJCVNLX1BOTUlfTUFDX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1JMTVQpLAorCQlTS19QTk1JX09GRihSbG10KSArIFNLX1BOTUlfUkxNX09GRihSbG10UnhTcEhlbGxvQ3RzKSwKKwkJU0tfUE5NSV9STywgUmxtdFN0YXQsIDB9LAorCXtPSURfU0tHRV9STE1UX01PTklUT1JfTlVNQkVSLAorCQkxLAorCQkwLAorCQlTS19QTk1JX01BSV9PRkYoUmxtdE1vbml0b3JOdW1iZXIpLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9NT05JVE9SX0lOREVYLAorCQlTS19QTk1JX01PTklUT1JfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfUkxNVF9NT05JVE9SKSwKKwkJU0tfUE5NSV9PRkYoUmxtdE1vbml0b3IpICsgU0tfUE5NSV9NT05fT0ZGKFJsbXRNb25pdG9ySW5kZXgpLAorCQlTS19QTk1JX1JPLCBNb25pdG9yLCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9NT05JVE9SX0FERFIsCisJCVNLX1BOTUlfTU9OSVRPUl9FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9STE1UX01PTklUT1IpLAorCQlTS19QTk1JX09GRihSbG10TW9uaXRvcikgKyBTS19QTk1JX01PTl9PRkYoUmxtdE1vbml0b3JBZGRyKSwKKwkJU0tfUE5NSV9STywgTW9uaXRvciwgMH0sCisJe09JRF9TS0dFX1JMTVRfTU9OSVRPUl9FUlJTLAorCQlTS19QTk1JX01PTklUT1JfRU5UUklFUywKKwkJc2l6ZW9mKFNLX1BOTUlfUkxNVF9NT05JVE9SKSwKKwkJU0tfUE5NSV9PRkYoUmxtdE1vbml0b3IpICsgU0tfUE5NSV9NT05fT0ZGKFJsbXRNb25pdG9yRXJyb3JDdHMpLAorCQlTS19QTk1JX1JPLCBNb25pdG9yLCAwfSwKKwl7T0lEX1NLR0VfUkxNVF9NT05JVE9SX1RJTUVTVEFNUCwKKwkJU0tfUE5NSV9NT05JVE9SX0VOVFJJRVMsCisJCXNpemVvZihTS19QTk1JX1JMTVRfTU9OSVRPUiksCisJCVNLX1BOTUlfT0ZGKFJsbXRNb25pdG9yKSArIFNLX1BOTUlfTU9OX09GRihSbG10TW9uaXRvclRpbWVzdGFtcCksCisJCVNLX1BOTUlfUk8sIE1vbml0b3IsIDB9LAorCXtPSURfU0tHRV9STE1UX01PTklUT1JfQURNSU4sCisJCVNLX1BOTUlfTU9OSVRPUl9FTlRSSUVTLAorCQlzaXplb2YoU0tfUE5NSV9STE1UX01PTklUT1IpLAorCQlTS19QTk1JX09GRihSbG10TW9uaXRvcikgKyBTS19QTk1JX01PTl9PRkYoUmxtdE1vbml0b3JBZG1pbiksCisJCVNLX1BOTUlfUlcsIE1vbml0b3IsIDB9LAorCXtPSURfU0tHRV9NVFUsCisJCTEsCisJCTAsCisJCVNLX1BOTUlfTUFJX09GRihNdHVTaXplKSwKKwkJU0tfUE5NSV9SVywgTWFjUHJpdmF0ZUNvbmYsIDB9LAorCXtPSURfU0tHRV9WQ1RfR0VULAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBWY3QsIDB9LAorCXtPSURfU0tHRV9WQ1RfU0VULAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1dPLCBWY3QsIDB9LAorCXtPSURfU0tHRV9WQ1RfU1RBVFVTLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBWY3QsIDB9LAorCXtPSURfU0tHRV9CT0FSRExFVkVMLAorCQkwLAorCQkwLAorCQkwLAorCQlTS19QTk1JX1JPLCBHZW5lcmFsLCAwfSwKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZXBubWkuYyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZXBubWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGUxYTViZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZXBubWkuYwpAQCAtMCwwICsxLDgzNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrZ2Vwbm1pLmMKKyAqIFByb2plY3Q6CUdFbmVzaXMsIFBDSSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4xMTEgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDkvMTUgMTM6MzU6MzUgJAorICogUHVycG9zZToJUHJpdmF0ZSBOZXR3b3JrIE1hbmFnZW1lbnQgSW50ZXJmYWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfbGludAorc3RhdGljIGNvbnN0IGNoYXIgU3lzS29ubmVjdEZpbGVJZFtdID0KKwkiQCgjKSAkSWQ6IHNrZ2Vwbm1pLmMsdiAxLjExMSAyMDAzLzA5LzE1IDEzOjM1OjM1IHRzY2hpbGxpIEV4cCAkIChDKSBNYXJ2ZWxsLiI7CisjZW5kaWYgLyogIV9saW50ICovCisKKyNpbmNsdWRlICJoL3NrZHJ2MXN0LmgiCisjaW5jbHVkZSAiaC9za3R5cGVzLmgiCisjaW5jbHVkZSAiaC94bWFjX2lpLmgiCisjaW5jbHVkZSAiaC9za2RlYnVnLmgiCisjaW5jbHVkZSAiaC9za3F1ZXVlLmgiCisjaW5jbHVkZSAiaC9za2dlcG5taS5oIgorI2luY2x1ZGUgImgvc2tnZXNpcnEuaCIKKyNpbmNsdWRlICJoL3NrY3N1bS5oIgorI2luY2x1ZGUgImgvc2t2cGQuaCIKKyNpbmNsdWRlICJoL3NrZ2Vody5oIgorI2luY2x1ZGUgImgvc2tnZWluaXQuaCIKKyNpbmNsdWRlICJoL3NrZHJ2Mm5kLmgiCisjaW5jbHVkZSAiaC9za2dlcG5tMi5oIgorI2lmZGVmIFNLX1BPV0VSX01HTVQKKyNpbmNsdWRlICJoL3NrZ2VwbWd0LmgiCisjZW5kaWYKKy8qIGRlZmluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBERUJVRworI2RlZmluZSBQTk1JX1NUQVRJQwlzdGF0aWMKKyNlbHNlCS8qIERFQlVHICovCisjZGVmaW5lIFBOTUlfU1RBVElDCisjZW5kaWYgLyogREVCVUcgKi8KKworLyoKKyAqIFB1YmxpYyBGdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KK2ludCBTa1BubWlJbml0KFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBsZXZlbCk7CitpbnQgU2tQbm1pR2V0VmFyKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1UzMiBJZCwgdm9pZCAqcEJ1ZiwKKwl1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwgU0tfVTMyIE5ldEluZGV4KTsKK2ludCBTa1BubWlQcmVTZXRWYXIoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgU0tfVTMyIElkLCB2b2lkICpwQnVmLAorCXVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIEluc3RhbmNlLCBTS19VMzIgTmV0SW5kZXgpOworaW50IFNrUG5taVNldFZhcihTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBTS19VMzIgSWQsIHZvaWQgKnBCdWYsCisJdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsIFNLX1UzMiBOZXRJbmRleCk7CitpbnQgU2tQbm1pR2V0U3RydWN0KFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIHZvaWQgKnBCdWYsCisJdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgTmV0SW5kZXgpOworaW50IFNrUG5taVByZVNldFN0cnVjdChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCB2b2lkICpwQnVmLAorCXVuc2lnbmVkIGludCAqcExlbiwgU0tfVTMyIE5ldEluZGV4KTsKK2ludCBTa1BubWlTZXRTdHJ1Y3QoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgdm9pZCAqcEJ1ZiwKKwl1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBOZXRJbmRleCk7CitpbnQgU2tQbm1pRXZlbnQoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgU0tfVTMyIEV2ZW50LCBTS19FVlBBUkEgUGFyYW0pOworaW50IFNrUG5taUdlbklvY3RsKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIHZvaWQgKiBwQnVmLAorCXVuc2lnbmVkIGludCAqIHBMZW4sIFNLX1UzMiBOZXRJbmRleCk7CisKKworLyoKKyAqIFByaXZhdGUgRnVuY3Rpb24gcHJvdG90eXBlcworICovCisKK1BOTUlfU1RBVElDIFNLX1U4IENhbGN1bGF0ZUxpbmtNb2RlU3RhdHVzKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIHVuc2lnbmVkIGludAorCVBoeXNQb3J0SW5kZXgpOworUE5NSV9TVEFUSUMgU0tfVTggQ2FsY3VsYXRlTGlua1N0YXR1cyhTS19BQyAqcEFDLCBTS19JT0MgSW9DLCB1bnNpZ25lZCBpbnQKKwlQaHlzUG9ydEluZGV4KTsKK1BOTUlfU1RBVElDIHZvaWQgQ29weU1hYyhjaGFyICpwRHN0LCBTS19NQUNfQUREUiAqcE1hYyk7CitQTk1JX1NUQVRJQyB2b2lkIENvcHlUcmFwUXVldWUoU0tfQUMgKnBBQywgY2hhciAqcERzdEJ1Zik7CitQTk1JX1NUQVRJQyBTS19VNjQgR2V0UGh5c1N0YXRWYWwoU0tfQUMgKnBBQywgU0tfSU9DIElvQywKKwl1bnNpZ25lZCBpbnQgUGh5c1BvcnRJbmRleCwgdW5zaWduZWQgaW50IFN0YXRJbmRleCk7CitQTk1JX1NUQVRJQyBTS19VNjQgR2V0U3RhdFZhbChTS19BQyAqcEFDLCBTS19JT0MgSW9DLCB1bnNpZ25lZCBpbnQgTG9nUG9ydEluZGV4LAorCXVuc2lnbmVkIGludCBTdGF0SW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBjaGFyKiBHZXRUcmFwRW50cnkoU0tfQUMgKnBBQywgU0tfVTMyIFRyYXBJZCwgdW5zaWduZWQgaW50IFNpemUpOworUE5NSV9TVEFUSUMgdm9pZCBHZXRUcmFwUXVldWVMZW4oU0tfQUMgKnBBQywgdW5zaWduZWQgaW50ICpwTGVuLAorCXVuc2lnbmVkIGludCAqcEVudHJpZXMpOworUE5NSV9TVEFUSUMgaW50IEdldFZwZEtleUFycihTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBjaGFyICpwS2V5QXJyLAorCXVuc2lnbmVkIGludCBLZXlBcnJMZW4sIHVuc2lnbmVkIGludCAqcEtleU5vKTsKK1BOTUlfU1RBVElDIGludCBMb29rdXBJZChTS19VMzIgSWQpOworUE5NSV9TVEFUSUMgaW50IE1hY1VwZGF0ZShTS19BQyAqcEFDLCBTS19JT0MgSW9DLCB1bnNpZ25lZCBpbnQgRmlyc3RNYWMsCisJdW5zaWduZWQgaW50IExhc3RNYWMpOworUE5NSV9TVEFUSUMgaW50IFBubWlTdHJ1Y3QoU0tfQUMgKnBBQywgU0tfSU9DIElvQywgaW50IEFjdGlvbiwgY2hhciAqcEJ1ZiwKKwl1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBpbnQgUG5taVZhcihTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgQWN0aW9uLCBTS19VMzIgSWQsCisJY2hhciAqcEJ1ZiwgdW5zaWduZWQgaW50ICpwTGVuLCBTS19VMzIgSW5zdGFuY2UsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyB2b2lkIFF1ZXVlUmxtdE5ld01hY1RyYXAoU0tfQUMgKnBBQywgdW5zaWduZWQgaW50IEFjdGl2ZU1hYyk7CitQTk1JX1NUQVRJQyB2b2lkIFF1ZXVlUmxtdFBvcnRUcmFwKFNLX0FDICpwQUMsIFNLX1UzMiBUcmFwSWQsCisJdW5zaWduZWQgaW50IFBvcnRJbmRleCk7CitQTk1JX1NUQVRJQyB2b2lkIFF1ZXVlU2Vuc29yVHJhcChTS19BQyAqcEFDLCBTS19VMzIgVHJhcElkLAorCXVuc2lnbmVkIGludCBTZW5zb3JJbmRleCk7CitQTk1JX1NUQVRJQyB2b2lkIFF1ZXVlU2ltcGxlVHJhcChTS19BQyAqcEFDLCBTS19VMzIgVHJhcElkKTsKK1BOTUlfU1RBVElDIHZvaWQgUmVzZXRDb3VudGVyKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyBpbnQgUmxtdFVwZGF0ZShTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBTS19VMzIgTmV0SW5kZXgpOworUE5NSV9TVEFUSUMgaW50IFNpcnFVcGRhdGUoU0tfQUMgKnBBQywgU0tfSU9DIElvQyk7CitQTk1JX1NUQVRJQyB2b2lkIFZpcnR1YWxDb25mKFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIFNLX1UzMiBJZCwgY2hhciAqcEJ1Zik7CitQTk1JX1NUQVRJQyBpbnQgVmN0KFNLX0FDICpwQUMsIFNLX0lPQyBJb0MsIGludCBBY3Rpb24sIFNLX1UzMiBJZCwgY2hhciAqcEJ1ZiwKKwl1bnNpZ25lZCBpbnQgKnBMZW4sIFNLX1UzMiBJbnN0YW5jZSwgdW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIFNLX1UzMiBOZXRJbmRleCk7CitQTk1JX1NUQVRJQyB2b2lkIENoZWNrVmN0U3RhdHVzKFNLX0FDICosIFNLX0lPQywgY2hhciAqLCBTS19VMzIsIFNLX1UzMik7CisKKy8qCisgKiBUYWJsZSB0byBjb3JyZWxhdGUgT0lEIHdpdGggaGFuZGxlciBmdW5jdGlvbiBhbmQgaW5kZXggdG8KKyAqIGhhcmR3YXJlIHJlZ2lzdGVyIHN0b3JlZCBpbiBTdGF0QWRkcmVzcyBpZiBhcHBsaWNhYmxlLgorICovCisjaW5jbHVkZSAic2tnZW1pYi5jIgorCisvKiBnbG9iYWwgdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBPdmVyZmxvdyBzdGF0dXMgcmVnaXN0ZXIgYml0IHRhYmxlIGFuZCBjb3JyZXNwb25kaW5nIGNvdW50ZXIKKyAqIGRlcGVuZGVudCBvbiBNQUMgdHlwZSAtIHRoZSBudW1iZXIgcmVsYXRlcyB0byB0aGUgc2l6ZSBvZiBvdmVyZmxvdworICogbWFzayByZXR1cm5lZCBieSB0aGUgcEZuTWFjT3ZlcmZsb3cgZnVuY3Rpb24KKyAqLworUE5NSV9TVEFUSUMgY29uc3QgU0tfVTE2IFN0YXRPdnJmbHdCaXRbXVtTS19QTk1JX01BQ19UWVBFU10gPSB7CisvKiBCaXQwICAqLwl7IFNLX1BOTUlfSFRYLCAJCQkJU0tfUE5NSV9IVFhfVU5JQ0FTVH0sCisvKiBCaXQxICAqLwl7IFNLX1BOTUlfSFRYX09DVEVUSElHSCwgCVNLX1BOTUlfSFRYX0JST0FEQ0FTVH0sCisvKiBCaXQyICAqLwl7IFNLX1BOTUlfSFRYX09DVEVUTE9XLCAJU0tfUE5NSV9IVFhfUE1BQ0N9LAorLyogQml0MyAgKi8JeyBTS19QTk1JX0hUWF9CUk9BRENBU1QsIAlTS19QTk1JX0hUWF9NVUxUSUNBU1R9LAorLyogQml0NCAgKi8JeyBTS19QTk1JX0hUWF9NVUxUSUNBU1QsIAlTS19QTk1JX0hUWF9PQ1RFVExPV30sCisvKiBCaXQ1ICAqLwl7IFNLX1BOTUlfSFRYX1VOSUNBU1QsIAkJU0tfUE5NSV9IVFhfT0NURVRISUdIfSwKKy8qIEJpdDYgICovCXsgU0tfUE5NSV9IVFhfTE9OR0ZSQU1FUywgCVNLX1BOTUlfSFRYXzY0fSwKKy8qIEJpdDcgICovCXsgU0tfUE5NSV9IVFhfQlVSU1QsIAkJU0tfUE5NSV9IVFhfMTI3fSwKKy8qIEJpdDggICovCXsgU0tfUE5NSV9IVFhfUE1BQ0MsIAkJU0tfUE5NSV9IVFhfMjU1fSwKKy8qIEJpdDkgICovCXsgU0tfUE5NSV9IVFhfTUFDQywgCQlTS19QTk1JX0hUWF81MTF9LAorLyogQml0MTAgKi8JeyBTS19QTk1JX0hUWF9TSU5HTEVfQ09MLCAJU0tfUE5NSV9IVFhfMTAyM30sCisvKiBCaXQxMSAqLwl7IFNLX1BOTUlfSFRYX01VTFRJX0NPTCwgCVNLX1BOTUlfSFRYX01BWH0sCisvKiBCaXQxMiAqLwl7IFNLX1BOTUlfSFRYX0VYQ0VTU19DT0wsIAlTS19QTk1JX0hUWF9MT05HRlJBTUVTfSwKKy8qIEJpdDEzICovCXsgU0tfUE5NSV9IVFhfTEFURV9DT0wsIAlTS19QTk1JX0hUWF9SRVNFUlZFRH0sCisvKiBCaXQxNCAqLwl7IFNLX1BOTUlfSFRYX0RFRkZFUkFMLCAJU0tfUE5NSV9IVFhfQ09MfSwKKy8qIEJpdDE1ICovCXsgU0tfUE5NSV9IVFhfRVhDRVNTX0RFRiwgCVNLX1BOTUlfSFRYX0xBVEVfQ09MfSwKKy8qIEJpdDE2ICovCXsgU0tfUE5NSV9IVFhfVU5ERVJSVU4sIAlTS19QTk1JX0hUWF9FWENFU1NfQ09MfSwKKy8qIEJpdDE3ICovCXsgU0tfUE5NSV9IVFhfQ0FSUklFUiwgCQlTS19QTk1JX0hUWF9NVUxUSV9DT0x9LAorLyogQml0MTggKi8JeyBTS19QTk1JX0hUWF9VVElMVU5ERVIsIAlTS19QTk1JX0hUWF9TSU5HTEVfQ09MfSwKKy8qIEJpdDE5ICovCXsgU0tfUE5NSV9IVFhfVVRJTE9WRVIsIAlTS19QTk1JX0hUWF9VTkRFUlJVTn0sCisvKiBCaXQyMCAqLwl7IFNLX1BOTUlfSFRYXzY0LCAJCQlTS19QTk1JX0hUWF9SRVNFUlZFRH0sCisvKiBCaXQyMSAqLwl7IFNLX1BOTUlfSFRYXzEyNywgCQkJU0tfUE5NSV9IVFhfUkVTRVJWRUR9LAorLyogQml0MjIgKi8JeyBTS19QTk1JX0hUWF8yNTUsIAkJCVNLX1BOTUlfSFRYX1JFU0VSVkVEfSwKKy8qIEJpdDIzICovCXsgU0tfUE5NSV9IVFhfNTExLCAJCQlTS19QTk1JX0hUWF9SRVNFUlZFRH0sCisvKiBCaXQyNCAqLwl7IFNLX1BOTUlfSFRYXzEwMjMsIAkJU0tfUE5NSV9IVFhfUkVTRVJWRUR9LAorLyogQml0MjUgKi8JeyBTS19QTk1JX0hUWF9NQVgsIAkJCVNLX1BOTUlfSFRYX1JFU0VSVkVEfSwKKy8qIEJpdDI2ICovCXsgU0tfUE5NSV9IVFhfUkVTRVJWRUQsIAlTS19QTk1JX0hUWF9SRVNFUlZFRH0sCisvKiBCaXQyNyAqLwl7IFNLX1BOTUlfSFRYX1JFU0VSVkVELCAJU0tfUE5NSV9IVFhfUkVTRVJWRUR9LAorLyogQml0MjggKi8JeyBTS19QTk1JX0hUWF9SRVNFUlZFRCwgCVNLX1BOTUlfSFRYX1JFU0VSVkVEfSwKKy8qIEJpdDI5ICovCXsgU0tfUE5NSV9IVFhfUkVTRVJWRUQsIAlTS19QTk1JX0hUWF9SRVNFUlZFRH0sCisvKiBCaXQzMCAqLwl7IFNLX1BOTUlfSFRYX1JFU0VSVkVELCAJU0tfUE5NSV9IVFhfUkVTRVJWRUR9LAorLyogQml0MzEgKi8JeyBTS19QTk1JX0hUWF9SRVNFUlZFRCwgCVNLX1BOTUlfSFRYX1JFU0VSVkVEfSwKKy8qIEJpdDMyICovCXsgU0tfUE5NSV9IUlgsIAkJCQlTS19QTk1JX0hSWF9VTklDQVNUfSwKKy8qIEJpdDMzICovCXsgU0tfUE5NSV9IUlhfT0NURVRISUdILCAJU0tfUE5NSV9IUlhfQlJPQURDQVNUfSwKKy8qIEJpdDM0ICovCXsgU0tfUE5NSV9IUlhfT0NURVRMT1csIAlTS19QTk1JX0hSWF9QTUFDQ30sCisvKiBCaXQzNSAqLwl7IFNLX1BOTUlfSFJYX0JST0FEQ0FTVCwgCVNLX1BOTUlfSFJYX01VTFRJQ0FTVH0sCisvKiBCaXQzNiAqLwl7IFNLX1BOTUlfSFJYX01VTFRJQ0FTVCwgCVNLX1BOTUlfSFJYX0ZDU30sCisvKiBCaXQzNyAqLwl7IFNLX1BOTUlfSFJYX1VOSUNBU1QsIAkJU0tfUE5NSV9IUlhfUkVTRVJWRUR9LAorLyogQml0MzggKi8JeyBTS19QTk1JX0hSWF9QTUFDQywgCQlTS19QTk1JX0hSWF9PQ1RFVExPV30sCisvKiBCaXQzOSAqLwl7IFNLX1BOTUlfSFJYX01BQ0MsIAkJU0tfUE5NSV9IUlhfT0NURVRISUdIfSwKKy8qIEJpdDQwICovCXsgU0tfUE5NSV9IUlhfUE1BQ0NfRVJSLCAJU0tfUE5NSV9IUlhfQkFET0NURVRMT1d9LAorLyogQml0NDEgKi8JeyBTS19QTk1JX0hSWF9NQUNDX1VOS1dOLAlTS19QTk1JX0hSWF9CQURPQ1RFVEhJR0h9LAorLyogQml0NDIgKi8JeyBTS19QTk1JX0hSWF9CVVJTVCwgCQlTS19QTk1JX0hSWF9VTkRFUlNJWkV9LAorLyogQml0NDMgKi8JeyBTS19QTk1JX0hSWF9NSVNTRUQsIAkJU0tfUE5NSV9IUlhfUlVOVH0sCisvKiBCaXQ0NCAqLwl7IFNLX1BOTUlfSFJYX0ZSQU1JTkcsIAkJU0tfUE5NSV9IUlhfNjR9LAorLyogQml0NDUgKi8JeyBTS19QTk1JX0hSWF9PVkVSRkxPVywgCVNLX1BOTUlfSFJYXzEyN30sCisvKiBCaXQ0NiAqLwl7IFNLX1BOTUlfSFJYX0pBQkJFUiwgCQlTS19QTk1JX0hSWF8yNTV9LAorLyogQml0NDcgKi8JeyBTS19QTk1JX0hSWF9DQVJSSUVSLCAJCVNLX1BOTUlfSFJYXzUxMX0sCisvKiBCaXQ0OCAqLwl7IFNLX1BOTUlfSFJYX0lSTEVOR1RILCAJU0tfUE5NSV9IUlhfMTAyM30sCisvKiBCaXQ0OSAqLwl7IFNLX1BOTUlfSFJYX1NZTUJPTCwgCQlTS19QTk1JX0hSWF9NQVh9LAorLyogQml0NTAgKi8JeyBTS19QTk1JX0hSWF9TSE9SVFMsIAkJU0tfUE5NSV9IUlhfTE9OR0ZSQU1FU30sCisvKiBCaXQ1MSAqLwl7IFNLX1BOTUlfSFJYX1JVTlQsIAkJU0tfUE5NSV9IUlhfVE9PX0xPTkd9LAorLyogQml0NTIgKi8JeyBTS19QTk1JX0hSWF9UT09fTE9ORywgCVNLX1BOTUlfSFJYX0pBQkJFUn0sCisvKiBCaXQ1MyAqLwl7IFNLX1BOTUlfSFJYX0ZDUywgCQkJU0tfUE5NSV9IUlhfUkVTRVJWRUR9LAorLyogQml0NTQgKi8JeyBTS19QTk1JX0hSWF9SRVNFUlZFRCwgCVNLX1BOTUlfSFJYX09WRVJGTE9XfSwKKy8qIEJpdDU1ICovCXsgU0tfUE5NSV9IUlhfQ0VYVCwgCQlTS19QTk1JX0hSWF9SRVNFUlZFRH0sCisvKiBCaXQ1NiAqLwl7IFNLX1BOTUlfSFJYX1VUSUxVTkRFUiwgCVNLX1BOTUlfSFJYX1JFU0VSVkVEfSwKKy8qIEJpdDU3ICovCXsgU0tfUE5NSV9IUlhfVVRJTE9WRVIsIAlTS19QTk1JX0hSWF9SRVNFUlZFRH0sCisvKiBCaXQ1OCAqLwl7IFNLX1BOTUlfSFJYXzY0LCAJCQlTS19QTk1JX0hSWF9SRVNFUlZFRH0sCisvKiBCaXQ1OSAqLwl7IFNLX1BOTUlfSFJYXzEyNywgCQkJU0tfUE5NSV9IUlhfUkVTRVJWRUR9LAorLyogQml0NjAgKi8JeyBTS19QTk1JX0hSWF8yNTUsIAkJCVNLX1BOTUlfSFJYX1JFU0VSVkVEfSwKKy8qIEJpdDYxICovCXsgU0tfUE5NSV9IUlhfNTExLCAJCQlTS19QTk1JX0hSWF9SRVNFUlZFRH0sCisvKiBCaXQ2MiAqLwl7IFNLX1BOTUlfSFJYXzEwMjMsIAkJU0tfUE5NSV9IUlhfUkVTRVJWRUR9LAorLyogQml0NjMgKi8JeyBTS19QTk1JX0hSWF9NQVgsIAkJCVNLX1BOTUlfSFJYX1JFU0VSVkVEfQorfTsKKworLyoKKyAqIFRhYmxlIGZvciBoYXJkd2FyZSByZWdpc3RlciBzYXZpbmcgb24gcmVzZXRzIGFuZCBwb3J0IHN3aXRjaGVzCisgKi8KK1BOTUlfU1RBVElDIGNvbnN0IFNLX1BOTUlfU1RBVEFERFIgU3RhdEFkZHJbU0tfUE5NSV9NQVhfSURYXVtTS19QTk1JX01BQ19UWVBFU10gPSB7CisJLyogU0tfUE5NSV9IVFggKi8KKwl7e1hNX1RYRl9PSywgU0tfVFJVRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFRYX09DVEVUSElHSCAqLworCXt7WE1fVFhPX09LX0hJLCBTS19UUlVFfSwge0dNX1RYT19PS19ISSwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFRYX09DVEVUTE9XICovCisJe3tYTV9UWE9fT0tfTE8sIFNLX0ZBTFNFfSwge0dNX1RYT19PS19MTywgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hUWF9CUk9BRENBU1QgKi8KKwl7e1hNX1RYRl9CQ19PSywgU0tfVFJVRX0sIHtHTV9UWEZfQkNfT0ssIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hUWF9NVUxUSUNBU1QgKi8KKwl7e1hNX1RYRl9NQ19PSywgU0tfVFJVRX0sIHtHTV9UWEZfTUNfT0ssIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hUWF9VTklDQVNUICovCisJe3tYTV9UWEZfVUNfT0ssIFNLX1RSVUV9LCB7R01fVFhGX1VDX09LLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IVFhfQlVSU1QgKi8KKwl7e1hNX1RYRV9CVVJTVCwgU0tfVFJVRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFRYX1BNQUNDICovCisJe3tYTV9UWEZfTVBBVVNFLCBTS19UUlVFfSwge0dNX1RYRl9NUEFVU0UsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hUWF9NQUNDICovCisJe3tYTV9UWEZfTUNUUkwsIFNLX1RSVUV9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hUWF9DT0wgKi8KKwl7ezAsIFNLX0ZBTFNFfSwge0dNX1RYRl9DT0wsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hUWF9TSU5HTEVfQ09MICovCisJe3tYTV9UWEZfU05HX0NPTCwgU0tfVFJVRX0sIHtHTV9UWEZfU05HX0NPTCwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFRYX01VTFRJX0NPTCAqLworCXt7WE1fVFhGX01VTF9DT0wsIFNLX1RSVUV9LCB7R01fVFhGX01VTF9DT0wsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hUWF9FWENFU1NfQ09MICovCisJe3tYTV9UWEZfQUJPX0NPTCwgU0tfVFJVRX0sIHtHTV9UWEZfQUJPX0NPTCwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFRYX0xBVEVfQ09MICovCisJe3tYTV9UWEZfTEFUX0NPTCwgU0tfVFJVRX0sIHtHTV9UWEZfTEFUX0NPTCwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFRYX0RFRkZFUkFMICovCisJe3tYTV9UWEZfREVGLCBTS19UUlVFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IVFhfRVhDRVNTX0RFRiAqLworCXt7WE1fVFhGX0VYX0RFRiwgU0tfVFJVRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFRYX1VOREVSUlVOICovCisJe3tYTV9UWEVfRklGT19VUiwgU0tfVFJVRX0sIHtHTV9UWEVfRklGT19VUiwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFRYX0NBUlJJRVIgKi8KKwl7e1hNX1RYRV9DU19FUlIsIFNLX1RSVUV9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hUWF9VVElMVU5ERVIgKi8KKwl7ezAsIFNLX0ZBTFNFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IVFhfVVRJTE9WRVIgKi8KKwl7ezAsIFNLX0ZBTFNFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IVFhfNjQgKi8KKwl7e1hNX1RYRl82NEIsIFNLX1RSVUV9LCB7R01fVFhGXzY0QiwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFRYXzEyNyAqLworCXt7WE1fVFhGXzEyN0IsIFNLX1RSVUV9LCB7R01fVFhGXzEyN0IsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hUWF8yNTUgKi8KKwl7e1hNX1RYRl8yNTVCLCBTS19UUlVFfSwge0dNX1RYRl8yNTVCLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IVFhfNTExICovCisJe3tYTV9UWEZfNTExQiwgU0tfVFJVRX0sIHtHTV9UWEZfNTExQiwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFRYXzEwMjMgKi8KKwl7e1hNX1RYRl8xMDIzQiwgU0tfVFJVRX0sIHtHTV9UWEZfMTAyM0IsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hUWF9NQVggKi8KKwl7e1hNX1RYRl9NQVhfU1osIFNLX1RSVUV9LCB7R01fVFhGXzE1MThCLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IVFhfTE9OR0ZSQU1FUyAgKi8KKwl7e1hNX1RYRl9MT05HLCBTS19UUlVFfSwge0dNX1RYRl9NQVhfU1osIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hUWF9TWU5DICovCisJe3swLCBTS19GQUxTRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFRYX1NZTkNfT0NURVQgKi8KKwl7ezAsIFNLX0ZBTFNFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IVFhfUkVTRVJWRUQgKi8KKwl7ezAsIFNLX0ZBTFNFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IUlggKi8KKwl7e1hNX1JYRl9PSywgU0tfVFJVRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFJYX09DVEVUSElHSCAqLworCXt7WE1fUlhPX09LX0hJLCBTS19UUlVFfSwge0dNX1JYT19PS19ISSwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFJYX09DVEVUTE9XICovCisJe3tYTV9SWE9fT0tfTE8sIFNLX0ZBTFNFfSwge0dNX1JYT19PS19MTywgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hSWF9CQURPQ1RFVEhJR0ggKi8KKwl7ezAsIFNLX0ZBTFNFfSwge0dNX1JYT19FUlJfSEksIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hSWF9CQURPQ1RFVExPVyAqLworCXt7MCwgU0tfRkFMU0V9LCB7R01fUlhPX0VSUl9MTywgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFJYX0JST0FEQ0FTVCAqLworCXt7WE1fUlhGX0JDX09LLCBTS19UUlVFfSwge0dNX1JYRl9CQ19PSywgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFJYX01VTFRJQ0FTVCAqLworCXt7WE1fUlhGX01DX09LLCBTS19UUlVFfSwge0dNX1JYRl9NQ19PSywgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFJYX1VOSUNBU1QgKi8KKwl7e1hNX1JYRl9VQ19PSywgU0tfVFJVRX0sIHtHTV9SWEZfVUNfT0ssIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hSWF9QTUFDQyAqLworCXt7WE1fUlhGX01QQVVTRSwgU0tfVFJVRX0sIHtHTV9SWEZfTVBBVVNFLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IUlhfTUFDQyAqLworCXt7WE1fUlhGX01DVFJMLCBTS19UUlVFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IUlhfUE1BQ0NfRVJSICovCisJe3tYTV9SWEZfSU5WX01QLCBTS19UUlVFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IUlhfTUFDQ19VTktXTiAqLworCXt7WE1fUlhGX0lOVl9NT0MsIFNLX1RSVUV9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hSWF9CVVJTVCAqLworCXt7WE1fUlhFX0JVUlNULCBTS19UUlVFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IUlhfTUlTU0VEICovCisJe3tYTV9SWEVfRk1JU1MsIFNLX1RSVUV9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hSWF9GUkFNSU5HICovCisJe3tYTV9SWEZfRlJBX0VSUiwgU0tfVFJVRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFJYX1VOREVSU0laRSAqLworCXt7MCwgU0tfRkFMU0V9LCB7R01fUlhGX1NIVCwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFJYX09WRVJGTE9XICovCisJe3tYTV9SWEVfRklGT19PViwgU0tfVFJVRX0sIHtHTV9SWEVfRklGT19PViwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFJYX0pBQkJFUiAqLworCXt7WE1fUlhGX0pBQl9QS1QsIFNLX1RSVUV9LCB7R01fUlhGX0pBQl9QS1QsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hSWF9DQVJSSUVSICovCisJe3tYTV9SWEVfQ0FSX0VSUiwgU0tfVFJVRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFJYX0lSTEVOR1RIICovCisJe3tYTV9SWEZfTEVOX0VSUiwgU0tfVFJVRX0sIHswLCBTS19GQUxTRX19LAorCS8qIFNLX1BOTUlfSFJYX1NZTUJPTCAqLworCXt7WE1fUlhFX1NZTV9FUlIsIFNLX1RSVUV9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hSWF9TSE9SVFMgKi8KKwl7e1hNX1JYRV9TSFRfRVJSLCBTS19UUlVFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IUlhfUlVOVCAqLworCXt7WE1fUlhFX1JVTlQsIFNLX1RSVUV9LCB7R01fUlhFX0ZSQUcsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hSWF9UT09fTE9ORyAqLworCXt7WE1fUlhGX0xOR19FUlIsIFNLX1RSVUV9LCB7R01fUlhGX0xOR19FUlIsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hSWF9GQ1MgKi8KKwl7e1hNX1JYRl9GQ1NfRVJSLCBTS19UUlVFfSwge0dNX1JYRl9GQ1NfRVJSLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IUlhfQ0VYVCAqLworCXt7WE1fUlhGX0NFWF9FUlIsIFNLX1RSVUV9LCB7MCwgU0tfRkFMU0V9fSwKKwkvKiBTS19QTk1JX0hSWF9VVElMVU5ERVIgKi8KKwl7ezAsIFNLX0ZBTFNFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IUlhfVVRJTE9WRVIgKi8KKwl7ezAsIFNLX0ZBTFNFfSwgezAsIFNLX0ZBTFNFfX0sCisJLyogU0tfUE5NSV9IUlhfNjQgKi8KKwl7e1hNX1JYRl82NEIsIFNLX1RSVUV9LCB7R01fUlhGXzY0QiwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFJYXzEyNyAqLworCXt7WE1fUlhGXzEyN0IsIFNLX1RSVUV9LCB7R01fUlhGXzEyN0IsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hSWF8yNTUgKi8KKwl7e1hNX1JYRl8yNTVCLCBTS19UUlVFfSwge0dNX1JYRl8yNTVCLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IUlhfNTExICovCisJe3tYTV9SWEZfNTExQiwgU0tfVFJVRX0sIHtHTV9SWEZfNTExQiwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFJYXzEwMjMgKi8KKwl7e1hNX1JYRl8xMDIzQiwgU0tfVFJVRX0sIHtHTV9SWEZfMTAyM0IsIFNLX1RSVUV9fSwKKwkvKiBTS19QTk1JX0hSWF9NQVggKi8KKwl7e1hNX1JYRl9NQVhfU1osIFNLX1RSVUV9LCB7R01fUlhGXzE1MThCLCBTS19UUlVFfX0sCisJLyogU0tfUE5NSV9IUlhfTE9OR0ZSQU1FUyAqLworCXt7MCwgU0tfRkFMU0V9LCB7R01fUlhGX01BWF9TWiwgU0tfVFJVRX19LAorCS8qIFNLX1BOTUlfSFJYX1JFU0VSVkVEICovCisJe3swLCBTS19GQUxTRX0sIHswLCBTS19GQUxTRX19Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFB1YmxpYyBmdW5jdGlvbnMKKyAqCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2tQbm1pSW5pdCAtIEluaXQgZnVuY3Rpb24gb2YgUE5NSQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJU0tfSU5JVF9EQVRBOiBJbml0aWFsaXNlcyB0aGUgZGF0YSBzdHJ1Y3R1cmVzCisgKglTS19JTklUX0lPOiAgIFJlc2V0cyB0aGUgWE1BQyBzdGF0aXN0aWNzLCBkZXRlcm1pbmVzIHRoZSBkZXZpY2UgYW5kCisgKgkgICAgICAgICAgICAgIGNvbm5lY3RvciB0eXBlLgorICoJU0tfSU5JVF9SVU46ICBTdGFydHMgYSB0aW1lciBldmVudCBmb3IgcG9ydCBzd2l0Y2ggcGVyIGhvdXIKKyAqCSAgICAgICAgICAgICAgY2FsY3VsYXRpb24uCisgKgorICogUmV0dXJuczoKKyAqCUFsd2F5cyAwCisgKi8KK2ludCBTa1BubWlJbml0KAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK2ludCBMZXZlbCkJCS8qIEluaXRpYWxpemF0aW9uIGxldmVsICovCit7CisJdW5zaWduZWQgaW50CVBvcnRNYXg7CS8qIE51bWJlciBvZiBwb3J0cyAqLworCXVuc2lnbmVkIGludAlQb3J0SW5kZXg7CS8qIEN1cnJlbnQgcG9ydCBpbmRleCBpbiBsb29wICovCisJU0tfVTE2CQlWYWwxNjsJCS8qIE11bHRpcGxlIHB1cnBvc2UgMTYgYml0IHZhcmlhYmxlICovCisJU0tfVTgJCVZhbDg7CQkvKiBNdWxpdHBsZSBwdXJwb3NlIDggYml0IHZhcmlhYmxlICovCisJU0tfRVZQQVJBCUV2ZW50UGFyYW07CS8qIEV2ZW50IHN0cnVjdCBmb3IgdGltZXIgZXZlbnQgKi8KKwlTS19QTk1JX1ZDVAkqcFZjdEJhY2t1cERhdGE7CisKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiUE5NSTogU2tQbm1pSW5pdDogQ2FsbGVkLCBsZXZlbD0lZFxuIiwgTGV2ZWwpKTsKKworCXN3aXRjaCAoTGV2ZWwpIHsKKworCWNhc2UgU0tfSU5JVF9EQVRBOgorCQlTS19NRU1TRVQoKGNoYXIgKikmcEFDLT5Qbm1pLCAwLCBzaXplb2YocEFDLT5Qbm1pKSk7CisJCXBBQy0+UG5taS5UcmFwQnVmRnJlZSA9IFNLX1BOTUlfVFJBUF9RVUVVRV9MRU47CisJCXBBQy0+UG5taS5TdGFydFVwVGltZSA9IFNLX1BOTUlfSFVORFJFRFNfU0VDKFNrT3NHZXRUaW1lKHBBQykpOworCQlwQUMtPlBubWkuUmxtdENoYW5nZVRocmVzaG9sZCA9IFNLX1BOTUlfREVGX1JMTVRfQ0hHX1RIUkVTOworCQlmb3IgKFBvcnRJbmRleCA9IDA7IFBvcnRJbmRleCA8IFNLX01BWF9NQUNTOyBQb3J0SW5kZXggKyspIHsKKworCQkJcEFDLT5Qbm1pLlBvcnRbUG9ydEluZGV4XS5BY3RpdmVGbGFnID0gU0tfRkFMU0U7CisJCQlwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPSBTS19GQUxTRTsKKwkJfQorCisjaWZkZWYgU0tfUE5NSV9DSEVDSworCQlpZiAoU0tfUE5NSV9NQVhfSURYICE9IFNLX1BOTUlfQ05UX05PKSB7CisJCQkKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwNDksIFNLX1BOTUlfRVJSMDQ5TVNHKTsKKworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfSU5JVCB8IFNLX0RCR0NBVF9GQVRBTCwKKwkJCQkJICAgKCJDb3VudGVyT2Zmc2V0IHN0cnVjdCBzaXplICglZCkgZGlmZmVycyBmcm9tIgorCQkJCQkJIlNLX1BOTUlfTUFYX0lEWCAoJWQpXG4iLAorCQkJCQkJU0tfUE5NSV9DTlRfTk8sIFNLX1BOTUlfTUFYX0lEWCkpOworCQl9CisKKwkJaWYgKFNLX1BOTUlfTUFYX0lEWCAhPQorCQkJKHNpemVvZihTdGF0QWRkcikgLyAoc2l6ZW9mKFNLX1BOTUlfU1RBVEFERFIpICogU0tfUE5NSV9NQUNfVFlQRVMpKSkgeworCQkJCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDUwLCBTS19QTk1JX0VSUjA1ME1TRyk7CisKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0lOSVQgfCBTS19EQkdDQVRfRkFUQUwsCisJCQkJCSAgICgiU3RhdEFkZHIgdGFibGUgc2l6ZSAoJWQpIGRpZmZlcnMgZnJvbSAiCisJCQkJCQkiU0tfUE5NSV9NQVhfSURYICglZClcbiIsCisJCQkJCQkoc2l6ZW9mKFN0YXRBZGRyKSAvCisJCQkJCQkgKHNpemVvZihTS19QTk1JX1NUQVRBRERSKSAqIFNLX1BOTUlfTUFDX1RZUEVTKSksCisJCQkJCQkgU0tfUE5NSV9NQVhfSURYKSk7CisJCX0KKyNlbmRpZiAvKiBTS19QTk1JX0NIRUNLICovCisJCWJyZWFrOworCisJY2FzZSBTS19JTklUX0lPOgorCQkvKgorCQkgKiBSZXNldCBNQUMgY291bnRlcnMKKwkJICovCisJCVBvcnRNYXggPSBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7CisKKwkJZm9yIChQb3J0SW5kZXggPSAwOyBQb3J0SW5kZXggPCBQb3J0TWF4OyBQb3J0SW5kZXggKyspIHsKKworCQkJcEFDLT5HSW5pLkdJRnVuYy5wRm5NYWNSZXNldENvdW50ZXIocEFDLCBJb0MsIFBvcnRJbmRleCk7CisJCX0KKwkJCisJCS8qIEluaXRpYWxpemUgRFNQIHZhcmlhYmxlcyBmb3IgVmN0KCkgdG8gMHhmZiA9PiBOZXZlciB3cml0dGVuISAqLwkJCisJCWZvciAoUG9ydEluZGV4ID0gMDsgUG9ydEluZGV4IDwgUG9ydE1heDsgUG9ydEluZGV4ICsrKSB7CisJCQlwQUMtPkdJbmkuR1BbUG9ydEluZGV4XS5QQ2FibGVMZW4gPSAweGZmOworCQkJcFZjdEJhY2t1cERhdGEgPSAmcEFDLT5Qbm1pLlZjdEJhY2t1cFtQb3J0SW5kZXhdOworCQkJcFZjdEJhY2t1cERhdGEtPlBDYWJsZUxlbiA9IDB4ZmY7CisJCX0KKwkJCisJCS8qCisJCSAqIEdldCBwY2kgYnVzIHNwZWVkCisJCSAqLworCQlTS19JTjE2KElvQywgQjBfQ1RTVCwgJlZhbDE2KTsKKwkJaWYgKChWYWwxNiAmIENTX0JVU19DTE9DSykgPT0gMCkgeworCisJCQlwQUMtPlBubWkuUGNpQnVzU3BlZWQgPSAzMzsKKwkJfQorCQllbHNlIHsKKwkJCXBBQy0+UG5taS5QY2lCdXNTcGVlZCA9IDY2OworCQl9CisKKwkJLyoKKwkJICogR2V0IHBjaSBidXMgd2lkdGgKKwkJICovCisJCVNLX0lOMTYoSW9DLCBCMF9DVFNULCAmVmFsMTYpOworCQlpZiAoKFZhbDE2ICYgQ1NfQlVTX1NMT1RfU1opID09IDApIHsKKworCQkJcEFDLT5Qbm1pLlBjaUJ1c1dpZHRoID0gMzI7CisJCX0KKwkJZWxzZSB7CisJCQlwQUMtPlBubWkuUGNpQnVzV2lkdGggPSA2NDsKKwkJfQorCisJCS8qCisJCSAqIEdldCBjaGlwc2V0CisJCSAqLworCQlzd2l0Y2ggKHBBQy0+R0luaS5HSUNoaXBJZCkgeworCQljYXNlIENISVBfSURfR0VORVNJUzoKKwkJCXBBQy0+UG5taS5DaGlwc2V0ID0gU0tfUE5NSV9DSElQU0VUX1hNQUM7CisJCQlicmVhazsKKworCQljYXNlIENISVBfSURfWVVLT046CisJCQlwQUMtPlBubWkuQ2hpcHNldCA9IFNLX1BOTUlfQ0hJUFNFVF9ZVUtPTjsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIEdldCBQTUQgYW5kIERldmljZVR5cGUKKwkJICovCisJCVNLX0lOOChJb0MsIEIyX1BNRF9UWVAsICZWYWw4KTsKKwkJc3dpdGNoIChWYWw4KSB7CisJCWNhc2UgJ1MnOgorCQkJcEFDLT5Qbm1pLlBNRCA9IDM7CisJCQlpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID4gMSkgeworCisJCQkJcEFDLT5Qbm1pLkRldmljZVR5cGUgPSAweDAwMDIwMDAyOworCQkJfQorCQkJZWxzZSB7CisJCQkJcEFDLT5Qbm1pLkRldmljZVR5cGUgPSAweDAwMDIwMDAxOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAnTCc6CisJCQlwQUMtPlBubWkuUE1EID0gMjsKKwkJCWlmIChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPiAxKSB7CisKKwkJCQlwQUMtPlBubWkuRGV2aWNlVHlwZSA9IDB4MDAwMjAwMDQ7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwQUMtPlBubWkuRGV2aWNlVHlwZSA9IDB4MDAwMjAwMDM7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlICdDJzoKKwkJCXBBQy0+UG5taS5QTUQgPSA0OworCQkJaWYgKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA+IDEpIHsKKworCQkJCXBBQy0+UG5taS5EZXZpY2VUeXBlID0gMHgwMDAyMDAwNjsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXBBQy0+UG5taS5EZXZpY2VUeXBlID0gMHgwMDAyMDAwNTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgJ1QnOgorCQkJcEFDLT5Qbm1pLlBNRCA9IDU7CisJCQlpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID4gMSkgeworCisJCQkJcEFDLT5Qbm1pLkRldmljZVR5cGUgPSAweDAwMDIwMDA4OworCQkJfQorCQkJZWxzZSB7CisJCQkJcEFDLT5Qbm1pLkRldmljZVR5cGUgPSAweDAwMDIwMDA3OworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdCA6CisJCQlwQUMtPlBubWkuUE1EID0gMTsKKwkJCXBBQy0+UG5taS5EZXZpY2VUeXBlID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogR2V0IGNvbm5lY3RvcgorCQkgKi8KKwkJU0tfSU44KElvQywgQjJfQ09OTl9UWVAsICZWYWw4KTsKKwkJc3dpdGNoIChWYWw4KSB7CisJCWNhc2UgJ0MnOgorCQkJcEFDLT5Qbm1pLkNvbm5lY3RvciA9IDI7CisJCQlicmVhazsKKworCQljYXNlICdEJzoKKwkJCXBBQy0+UG5taS5Db25uZWN0b3IgPSAzOworCQkJYnJlYWs7CisKKwkJY2FzZSAnRic6CisJCQlwQUMtPlBubWkuQ29ubmVjdG9yID0gNDsKKwkJCWJyZWFrOworCisJCWNhc2UgJ0onOgorCQkJcEFDLT5Qbm1pLkNvbm5lY3RvciA9IDU7CisJCQlicmVhazsKKworCQljYXNlICdWJzoKKwkJCXBBQy0+UG5taS5Db25uZWN0b3IgPSA2OworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXBBQy0+UG5taS5Db25uZWN0b3IgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNLX0lOSVRfUlVOOgorCQkvKgorCQkgKiBTdGFydCB0aW1lciBmb3IgUkxNVCBjaGFuZ2UgY291bnRlcgorCQkgKi8KKwkJU0tfTUVNU0VUKChjaGFyICopJkV2ZW50UGFyYW0sIDAsIHNpemVvZihFdmVudFBhcmFtKSk7CisJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBBQy0+UG5taS5SbG10Q2hhbmdlRXN0aW1hdGUuRXN0VGltZXIsCisJCQkyODEyNTAwMCwgU0tHRV9QTk1JLCBTS19QTk1JX0VWVF9DSEdfRVNUX1RJTUVSLAorCQkJRXZlbnRQYXJhbSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7IC8qIE5vdGhpbmcgdG9kbyAqLworCX0KKworCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNrUG5taUdldFZhciAtIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgT0lECisgKgorICogRGVzY3JpcHRpb246CisgKglDYWxscyBhIGdlbmVyYWwgc3ViLWZ1bmN0aW9uIGZvciBhbGwgdGhpcyBzdHVmZi4gSWYgdGhlIGluc3RhbmNlCisgKgktMSBpcyBwYXNzZWQsIHRoZSB2YWx1ZXMgb2YgYWxsIGluc3RhbmNlcyBhcmUgcmV0dXJuZWQgaW4gYW4KKyAqCWFycmF5IG9mIHZhbHVlcy4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIHRha2UKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0YS4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fT0lEICBUaGUgcmVxdWVzdGVkIE9JRCBpcyB1bmtub3duCisgKglTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBvZiB0aGUgT0lEIGRvZXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgKGUuZy4gcG9ydCBpbnN0YW5jZSAzIG9uIGEgdHdvIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLgorICovCitpbnQgU2tQbm1pR2V0VmFyKAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK1NLX1UzMiBJZCwJCS8qIE9iamVjdCBJRCB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZCAqLwordm9pZCAqcEJ1ZiwJCS8qIEJ1ZmZlciB0byB3aGljaCB0aGUgbWFuYWdlbWVudCBkYXRhIHdpbGwgYmUgY29waWVkICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIE9uIGNhbGw6IGJ1ZmZlciBsZW5ndGguIE9uIHJldHVybjogdXNlZCBidWZmZXIgKi8KK1NLX1UzMiBJbnN0YW5jZSwJLyogSW5zdGFuY2UgKDEuLm4pIHRoYXQgaXMgdG8gYmUgcXVlcmllZCBvciAtMSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiUE5NSTogU2tQbm1pR2V0VmFyOiBDYWxsZWQsIElkPTB4JXgsIEJ1Zkxlbj0lZCwgSW5zdGFuY2U9JWQsIE5ldEluZGV4PSVkXG4iLAorCQkJSWQsICpwTGVuLCBJbnN0YW5jZSwgTmV0SW5kZXgpKTsKKworCXJldHVybiAoUG5taVZhcihwQUMsIElvQywgU0tfUE5NSV9HRVQsIElkLCAoY2hhciAqKXBCdWYsIHBMZW4sCisJCUluc3RhbmNlLCBOZXRJbmRleCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTa1BubWlQcmVTZXRWYXIgLSBQcmVzZXRzIHRoZSB2YWx1ZSBvZiBhIHNpbmdsZSBPSUQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUNhbGxzIGEgZ2VuZXJhbCBzdWItZnVuY3Rpb24gZm9yIGFsbCB0aGlzIHN0dWZmLiBUaGUgcHJlc2V0IGRvZXMKKyAqCXRoZSBzYW1lIGFzIGEgc2V0LCBidXQgcmV0dXJucyBqdXN0IGJlZm9yZSBmaW5hbGx5IHNldHRpbmcgdGhlCisgKgluZXcgdmFsdWUuIFRoaXMgaXMgdXNlZnVsbCB0byBjaGVjayBpZiBhIHNldCBtaWdodCBiZSBzdWNjZXNzZnVsbC4KKyAqCUlmIHRoZSBpbnN0YW5jZSAtMSBpcyBwYXNzZWQsIGFuIGFycmF5IG9mIHZhbHVlcyBpcyBzdXBwb3NlZCBhbmQKKyAqCWFsbCBpbnN0YW5jZXMgb2YgdGhlIE9JRCB3aWxsIGJlIHNldC4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4KKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IGRhdGEgKGUuZy4gYSAzMmJpdCB2YWx1ZSBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCwgYnV0IGEgMTYgYml0IHZhbHVlIHdhcyBwYXNzZWQpLgorICoJU0tfUE5NSV9FUlJfQkFEX1ZBTFVFICAgIFRoZSBwYXNzZWQgdmFsdWUgaXMgbm90IGluIHRoZSB2YWxpZAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHJhbmdlLgorICoJU0tfUE5NSV9FUlJfUkVBRF9PTkxZICAgIFRoZSBPSUQgaXMgcmVhZC1vbmx5IGFuZCBjYW5ub3QgYmUgc2V0LgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9PSUQgIFRoZSByZXF1ZXN0ZWQgT0lEIGlzIHVua25vd24uCisgKglTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBvZiB0aGUgT0lEIGRvZXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgKGUuZy4gcG9ydCBpbnN0YW5jZSAzIG9uIGEgdHdvIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLgorICovCitpbnQgU2tQbm1pUHJlU2V0VmFyKAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK1NLX1UzMiBJZCwJCS8qIE9iamVjdCBJRCB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZCAqLwordm9pZCAqcEJ1ZiwJCS8qIEJ1ZmZlciB0byB3aGljaCB0aGUgbWFuYWdlbWVudCBkYXRhIHdpbGwgYmUgY29waWVkICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIFRvdGFsIGxlbmd0aCBvZiBtYW5hZ2VtZW50IGRhdGEgKi8KK1NLX1UzMiBJbnN0YW5jZSwJLyogSW5zdGFuY2UgKDEuLm4pIHRoYXQgaXMgdG8gYmUgc2V0IG9yIC0xICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJQTk1JOiBTa1BubWlQcmVTZXRWYXI6IENhbGxlZCwgSWQ9MHgleCwgQnVmTGVuPSVkLCBJbnN0YW5jZT0lZCwgTmV0SW5kZXg9JWRcbiIsCisJCQlJZCwgKnBMZW4sIEluc3RhbmNlLCBOZXRJbmRleCkpOworCisKKwlyZXR1cm4gKFBubWlWYXIocEFDLCBJb0MsIFNLX1BOTUlfUFJFU0VULCBJZCwgKGNoYXIgKilwQnVmLCBwTGVuLAorCQlJbnN0YW5jZSwgTmV0SW5kZXgpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2tQbm1pU2V0VmFyIC0gU2V0cyB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgT0lECisgKgorICogRGVzY3JpcHRpb246CisgKglDYWxscyBhIGdlbmVyYWwgc3ViLWZ1bmN0aW9uIGZvciBhbGwgdGhpcyBzdHVmZi4gVGhlIHByZXNldCBkb2VzCisgKgl0aGUgc2FtZSBhcyBhIHNldCwgYnV0IHJldHVybnMganVzdCBiZWZvcmUgZmluYWxseSBzZXR0aW5nIHRoZQorICoJbmV3IHZhbHVlLiBUaGlzIGlzIHVzZWZ1bGwgdG8gY2hlY2sgaWYgYSBzZXQgbWlnaHQgYmUgc3VjY2Vzc2Z1bGwuCisgKglJZiB0aGUgaW5zdGFuY2UgLTEgaXMgcGFzc2VkLCBhbiBhcnJheSBvZiB2YWx1ZXMgaXMgc3VwcG9zZWQgYW5kCisgKglhbGwgaW5zdGFuY2VzIG9mIHRoZSBPSUQgd2lsbCBiZSBzZXQuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQuCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBkYXRhIChlLmcuIGEgMzJiaXQgdmFsdWUgaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIGJ1dCBhIDE2IGJpdCB2YWx1ZSB3YXMgcGFzc2VkKS4KKyAqCVNLX1BOTUlfRVJSX0JBRF9WQUxVRSAgICBUaGUgcGFzc2VkIHZhbHVlIGlzIG5vdCBpbiB0aGUgdmFsaWQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSByYW5nZS4KKyAqCVNLX1BOTUlfRVJSX1JFQURfT05MWSAgICBUaGUgT0lEIGlzIHJlYWQtb25seSBhbmQgY2Fubm90IGJlIHNldC4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fT0lEICBUaGUgcmVxdWVzdGVkIE9JRCBpcyB1bmtub3duLgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2Ugb2YgdGhlIE9JRCBkb2Vzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChlLmcuIHBvcnQgaW5zdGFuY2UgMyBvbiBhIHR3byBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci4KKyAqLworaW50IFNrUG5taVNldFZhcigKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitTS19VMzIgSWQsCQkvKiBPYmplY3QgSUQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQgKi8KK3ZvaWQgKnBCdWYsCQkvKiBCdWZmZXIgdG8gd2hpY2ggdGhlIG1hbmFnZW1lbnQgZGF0YSB3aWxsIGJlIGNvcGllZCAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBUb3RhbCBsZW5ndGggb2YgbWFuYWdlbWVudCBkYXRhICovCitTS19VMzIgSW5zdGFuY2UsCS8qIEluc3RhbmNlICgxLi5uKSB0aGF0IGlzIHRvIGJlIHNldCBvciAtMSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiUE5NSTogU2tQbm1pU2V0VmFyOiBDYWxsZWQsIElkPTB4JXgsIEJ1Zkxlbj0lZCwgSW5zdGFuY2U9JWQsIE5ldEluZGV4PSVkXG4iLAorCQkJSWQsICpwTGVuLCBJbnN0YW5jZSwgTmV0SW5kZXgpKTsKKworCXJldHVybiAoUG5taVZhcihwQUMsIElvQywgU0tfUE5NSV9TRVQsIElkLCAoY2hhciAqKXBCdWYsIHBMZW4sCisJCUluc3RhbmNlLCBOZXRJbmRleCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTa1BubWlHZXRTdHJ1Y3QgLSBSZXRyaWV2ZXMgdGhlIG1hbmFnZW1lbnQgZGF0YWJhc2UgaW4gU0tfUE5NSV9TVFJVQ1RfREFUQQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJUnVucyB0aHJvdWdoIHRoZSBJZFRhYmxlLCBxdWVyaWVzIHRoZSBzaW5nbGUgT0lEcyBhbmQgc3RvcmVzIHRoZQorICoJcmV0dXJuZWQgZGF0YSBpbnRvIHRoZSBtYW5hZ2VtZW50IGRhdGFiYXNlIHN0cnVjdHVyZQorICoJU0tfUE5NSV9TVFJVQ1RfREFUQS4gVGhlIG9mZnNldCBvZiB0aGUgT0lEIGluIHRoZSBzdHJ1Y3R1cmUKKyAqCWlzIHN0b3JlZCBpbiB0aGUgSWRUYWJsZS4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gd2lsbCBhbHNvCisgKgliZSBzdG9yZWQgaW4gU0tfUE5NSV9TVFJVQ1RfREFUQSBpZiB0aGUgcGFzc2VkIGJ1ZmZlciBoYXMgdGhlCisgKgltaW5pbXVtIHNpemUgb2YgU0tfUE5NSV9NSU5fU1RSVUNUX1NJWkUuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZAorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZAorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byB0YWtlCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRhdGEuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX05FVCAgVGhlIHJlcXVlc3RlZCBOZXRJbmRleCBkb2Vzbid0IGV4aXN0CisgKi8KK2ludCBTa1BubWlHZXRTdHJ1Y3QoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLwordm9pZCAqcEJ1ZiwJCS8qIEJ1ZmZlciB0byB3aGljaCB0aGUgbWFuYWdlbWVudCBkYXRhIHdpbGwgYmUgY29waWVkLiAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBMZW5ndGggb2YgYnVmZmVyICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJaW50CQlSZXQ7CisJdW5zaWduZWQgaW50CVRhYmxlSW5kZXg7CisJdW5zaWduZWQgaW50CURzdE9mZnNldDsKKwl1bnNpZ25lZCBpbnQJSW5zdGFuY2VObzsKKwl1bnNpZ25lZCBpbnQJSW5zdGFuY2VDbnQ7CisJU0tfVTMyCQlJbnN0YW5jZTsKKwl1bnNpZ25lZCBpbnQJVG1wTGVuOworCWNoYXIJCUtleUFycltTS19QTk1JX1ZQRF9FTlRSSUVTXVtTS19QTk1JX1ZQRF9LRVlfU0laRV07CisKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiUE5NSTogU2tQbm1pR2V0U3RydWN0OiBDYWxsZWQsIEJ1Zkxlbj0lZCwgTmV0SW5kZXg9JWRcbiIsCisJCQkqcExlbiwgTmV0SW5kZXgpKTsKKworCWlmICgqcExlbiA8IFNLX1BOTUlfU1RSVUNUX1NJWkUpIHsKKworCQlpZiAoKnBMZW4gPj0gU0tfUE5NSV9NSU5fU1RSVUNUX1NJWkUpIHsKKworCQkJU0tfUE5NSV9TRVRfU1RBVChwQnVmLCBTS19QTk1JX0VSUl9UT09fU0hPUlQsCisJCQkJKFNLX1UzMikoLTEpKTsKKwkJfQorCisJCSpwTGVuID0gU0tfUE5NSV9TVFJVQ1RfU0laRTsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCX0KKworICAgIC8qCisgICAgICogQ2hlY2sgTmV0SW5kZXgKKyAgICAgKi8KKwlpZiAoTmV0SW5kZXggPj0gcEFDLT5SbG10Lk51bU5ldHMpIHsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX05FVCk7CisJfQorCisJLyogVXBkYXRlIHN0YXRpc3RpYyAqLworCVNLX1BOTUlfQ0hFQ0tGTEFHUygiU2tQbm1pR2V0U3RydWN0OiBPbiBjYWxsIik7CisKKwlpZiAoKFJldCA9IE1hY1VwZGF0ZShwQUMsIElvQywgMCwgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kIC0gMSkpICE9CisJCVNLX1BOTUlfRVJSX09LKSB7CisKKwkJU0tfUE5NSV9TRVRfU1RBVChwQnVmLCBSZXQsIChTS19VMzIpKC0xKSk7CisJCSpwTGVuID0gU0tfUE5NSV9NSU5fU1RSVUNUX1NJWkU7CisJCXJldHVybiAoUmV0KTsKKwl9CisKKwlpZiAoKFJldCA9IFJsbXRVcGRhdGUocEFDLCBJb0MsIE5ldEluZGV4KSkgIT0gU0tfUE5NSV9FUlJfT0spIHsKKworCQlTS19QTk1JX1NFVF9TVEFUKHBCdWYsIFJldCwgKFNLX1UzMikoLTEpKTsKKwkJKnBMZW4gPSBTS19QTk1JX01JTl9TVFJVQ1RfU0laRTsKKwkJcmV0dXJuIChSZXQpOworCX0KKworCWlmICgoUmV0ID0gU2lycVVwZGF0ZShwQUMsIElvQykpICE9IFNLX1BOTUlfRVJSX09LKSB7CisKKwkJU0tfUE5NSV9TRVRfU1RBVChwQnVmLCBSZXQsIChTS19VMzIpKC0xKSk7CisJCSpwTGVuID0gU0tfUE5NSV9NSU5fU1RSVUNUX1NJWkU7CisJCXJldHVybiAoUmV0KTsKKwl9CisKKwkvKgorCSAqIEluY3JlbWVudCBzZW1hcGhvcmVzIHRvIGluZGljYXRlIHRoYXQgYW4gdXBkYXRlIHdhcworCSAqIGFscmVhZHkgZG9uZQorCSAqLworCXBBQy0+UG5taS5NYWNVcGRhdGVkRmxhZyArKzsKKwlwQUMtPlBubWkuUmxtdFVwZGF0ZWRGbGFnICsrOworCXBBQy0+UG5taS5TaXJxVXBkYXRlZEZsYWcgKys7CisKKwkvKiBHZXQgdnBkIGtleXMgZm9yIGluc3RhbmNlIGNhbGN1bGF0aW9uICovCisJUmV0ID0gR2V0VnBkS2V5QXJyKHBBQywgSW9DLCAmS2V5QXJyWzBdWzBdLCBzaXplb2YoS2V5QXJyKSwgJlRtcExlbik7CisJaWYgKFJldCAhPSBTS19QTk1JX0VSUl9PSykgeworCisJCXBBQy0+UG5taS5NYWNVcGRhdGVkRmxhZyAtLTsKKwkJcEFDLT5Qbm1pLlJsbXRVcGRhdGVkRmxhZyAtLTsKKwkJcEFDLT5Qbm1pLlNpcnFVcGRhdGVkRmxhZyAtLTsKKworCQlTS19QTk1JX0NIRUNLRkxBR1MoIlNrUG5taUdldFN0cnVjdDogT24gcmV0dXJuIik7CisJCVNLX1BOTUlfU0VUX1NUQVQocEJ1ZiwgUmV0LCAoU0tfVTMyKSgtMSkpOworCQkqcExlbiA9IFNLX1BOTUlfTUlOX1NUUlVDVF9TSVpFOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCX0KKworCS8qIFJldHJpZXZlIHZhbHVlcyAqLworCVNLX01FTVNFVCgoY2hhciAqKXBCdWYsIDAsIFNLX1BOTUlfU1RSVUNUX1NJWkUpOworCWZvciAoVGFibGVJbmRleCA9IDA7IFRhYmxlSW5kZXggPCBJRF9UQUJMRV9TSVpFOyBUYWJsZUluZGV4ICsrKSB7CisKKwkJSW5zdGFuY2VObyA9IElkVGFibGVbVGFibGVJbmRleF0uSW5zdGFuY2VObzsKKwkJZm9yIChJbnN0YW5jZUNudCA9IDE7IEluc3RhbmNlQ250IDw9IEluc3RhbmNlTm87CisJCQlJbnN0YW5jZUNudCArKykgeworCisJCQlEc3RPZmZzZXQgPSBJZFRhYmxlW1RhYmxlSW5kZXhdLk9mZnNldCArCisJCQkJKEluc3RhbmNlQ250IC0gMSkgKgorCQkJCUlkVGFibGVbVGFibGVJbmRleF0uU3RydWN0U2l6ZTsKKworCQkJLyoKKwkJCSAqIEZvciB0aGUgVlBEIHRoZSBpbnN0YW5jZSBpcyBub3QgYW4gaW5kZXggbnVtYmVyCisJCQkgKiBidXQgdGhlIGtleSBpdHNlbGYuIERldGVybWluIHdpdGggdGhlIGluc3RhbmNlCisJCQkgKiBjb3VudGVyIHRoZSBWUEQga2V5IHRvIGJlIHVzZWQuCisJCQkgKi8KKwkJCWlmIChJZFRhYmxlW1RhYmxlSW5kZXhdLklkID09IE9JRF9TS0dFX1ZQRF9LRVkgfHwKKwkJCQlJZFRhYmxlW1RhYmxlSW5kZXhdLklkID09IE9JRF9TS0dFX1ZQRF9WQUxVRSB8fAorCQkJCUlkVGFibGVbVGFibGVJbmRleF0uSWQgPT0gT0lEX1NLR0VfVlBEX0FDQ0VTUyB8fAorCQkJCUlkVGFibGVbVGFibGVJbmRleF0uSWQgPT0gT0lEX1NLR0VfVlBEX0FDVElPTikgeworCisJCQkJU0tfU1RSTkNQWSgoY2hhciAqKSZJbnN0YW5jZSwgS2V5QXJyW0luc3RhbmNlQ250IC0gMV0sIDQpOworCQkJfQorCQkJZWxzZSB7CisJCQkJSW5zdGFuY2UgPSAoU0tfVTMyKUluc3RhbmNlQ250OworCQkJfQorCisJCQlUbXBMZW4gPSAqcExlbiAtIERzdE9mZnNldDsKKwkJCVJldCA9IElkVGFibGVbVGFibGVJbmRleF0uRnVuYyhwQUMsIElvQywgU0tfUE5NSV9HRVQsCisJCQkJSWRUYWJsZVtUYWJsZUluZGV4XS5JZCwgKGNoYXIgKilwQnVmICsKKwkJCQlEc3RPZmZzZXQsICZUbXBMZW4sIEluc3RhbmNlLCBUYWJsZUluZGV4LCBOZXRJbmRleCk7CisKKwkJCS8qCisJCQkgKiBBbiB1bmtub3duIGluc3RhbmNlIGVycm9yIG1lYW5zIHRoYXQgd2UgcmVhY2hlZAorCQkJICogdGhlIGxhc3QgaW5zdGFuY2Ugb2YgdGhhdCB2YXJpYWJsZS4gUHJvY2VlZCB3aXRoCisJCQkgKiB0aGUgbmV4dCBPSUQgaW4gdGhlIHRhYmxlIGFuZCBpZ25vcmUgdGhlIHJldHVybgorCQkJICogY29kZS4KKwkJCSAqLworCQkJaWYgKFJldCA9PSBTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QpIHsKKworICAgICAgICAgICAgICAgIGJyZWFrOworCQkJfQorCisJCQlpZiAoUmV0ICE9IFNLX1BOTUlfRVJSX09LKSB7CisKKwkJCQlwQUMtPlBubWkuTWFjVXBkYXRlZEZsYWcgLS07CisJCQkJcEFDLT5Qbm1pLlJsbXRVcGRhdGVkRmxhZyAtLTsKKwkJCQlwQUMtPlBubWkuU2lycVVwZGF0ZWRGbGFnIC0tOworCisJCQkJU0tfUE5NSV9DSEVDS0ZMQUdTKCJTa1BubWlHZXRTdHJ1Y3Q6IE9uIHJldHVybiIpOworCQkJCVNLX1BOTUlfU0VUX1NUQVQocEJ1ZiwgUmV0LCBEc3RPZmZzZXQpOworCQkJCSpwTGVuID0gU0tfUE5NSV9NSU5fU1RSVUNUX1NJWkU7CisJCQkJcmV0dXJuIChSZXQpOworCQkJfQorCQl9CisJfQorCisJcEFDLT5Qbm1pLk1hY1VwZGF0ZWRGbGFnIC0tOworCXBBQy0+UG5taS5SbG10VXBkYXRlZEZsYWcgLS07CisJcEFDLT5Qbm1pLlNpcnFVcGRhdGVkRmxhZyAtLTsKKworCSpwTGVuID0gU0tfUE5NSV9TVFJVQ1RfU0laRTsKKwlTS19QTk1JX0NIRUNLRkxBR1MoIlNrUG5taUdldFN0cnVjdDogT24gcmV0dXJuIik7CisJU0tfUE5NSV9TRVRfU1RBVChwQnVmLCBTS19QTk1JX0VSUl9PSywgKFNLX1UzMikoLTEpKTsKKwlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2tQbm1pUHJlU2V0U3RydWN0IC0gUHJlc2V0cyB0aGUgbWFuYWdlbWVudCBkYXRhYmFzZSBpbiBTS19QTk1JX1NUUlVDVF9EQVRBCisgKgorICogRGVzY3JpcHRpb246CisgKglDYWxscyBhIGdlbmVyYWwgc3ViLWZ1bmN0aW9uIGZvciBhbGwgdGhpcyBzZXQgc3R1ZmYuIFRoZSBwcmVzZXQgZG9lcworICoJdGhlIHNhbWUgYXMgYSBzZXQsIGJ1dCByZXR1cm5zIGp1c3QgYmVmb3JlIGZpbmFsbHkgc2V0dGluZyB0aGUKKyAqCW5ldyB2YWx1ZS4gVGhpcyBpcyB1c2VmdWxsIHRvIGNoZWNrIGlmIGEgc2V0IG1pZ2h0IGJlIHN1Y2Nlc3NmdWxsLgorICoJVGhlIHN1Yi1mdW5jdGlvbiBydW5zIHRocm91Z2ggdGhlIElkVGFibGUsIGNoZWNrcyB3aGljaCBPSURzIGFyZSBhYmxlCisgKgl0byBzZXQsIGFuZCBjYWxscyB0aGUgaGFuZGxlciBmdW5jdGlvbiBvZiB0aGUgT0lEIHRvIHBlcmZvcm0gdGhlCisgKglwcmVzZXQuIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIHdpbGwgYWxzbyBiZSBzdG9yZWQgaW4KKyAqCVNLX1BOTUlfU1RSVUNUX0RBVEEgaWYgdGhlIHBhc3NlZCBidWZmZXIgaGFzIHRoZSBtaW5pbXVtIHNpemUgb2YKKyAqCVNLX1BOTUlfTUlOX1NUUlVDVF9TSVpFLgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3QgZGF0YSAoZS5nLiBhIDMyYml0IHZhbHVlIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkLCBidXQgYSAxNiBiaXQgdmFsdWUgd2FzIHBhc3NlZCkuCisgKglTS19QTk1JX0VSUl9CQURfVkFMVUUgICAgVGhlIHBhc3NlZCB2YWx1ZSBpcyBub3QgaW4gdGhlIHZhbGlkCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgcmFuZ2UuCisgKi8KK2ludCBTa1BubWlQcmVTZXRTdHJ1Y3QoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLwordm9pZCAqcEJ1ZiwJCS8qIEJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgZGF0YSB0byBiZSBzZXQgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogTGVuZ3RoIG9mIGJ1ZmZlciAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiUE5NSTogU2tQbm1pUHJlU2V0U3RydWN0OiBDYWxsZWQsIEJ1Zkxlbj0lZCwgTmV0SW5kZXg9JWRcbiIsCisJCQkqcExlbiwgTmV0SW5kZXgpKTsKKworCXJldHVybiAoUG5taVN0cnVjdChwQUMsIElvQywgU0tfUE5NSV9QUkVTRVQsIChjaGFyICopcEJ1ZiwKKyAgICAJCQkJCXBMZW4sIE5ldEluZGV4KSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNrUG5taVNldFN0cnVjdCAtIFNldHMgdGhlIG1hbmFnZW1lbnQgZGF0YWJhc2UgaW4gU0tfUE5NSV9TVFJVQ1RfREFUQQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJQ2FsbHMgYSBnZW5lcmFsIHN1Yi1mdW5jdGlvbiBmb3IgYWxsIHRoaXMgc2V0IHN0dWZmLiBUaGUgcmV0dXJuIHZhbHVlCisgKglvZiB0aGUgZnVuY3Rpb24gd2lsbCBhbHNvIGJlIHN0b3JlZCBpbiBTS19QTk1JX1NUUlVDVF9EQVRBIGlmIHRoZQorICoJcGFzc2VkIGJ1ZmZlciBoYXMgdGhlIG1pbmltdW0gc2l6ZSBvZiBTS19QTk1JX01JTl9TVFJVQ1RfU0laRS4KKyAqCVRoZSBzdWItZnVuY3Rpb24gcnVucyB0aHJvdWdoIHRoZSBJZFRhYmxlLCBjaGVja3Mgd2hpY2ggT0lEcyBhcmUgYWJsZQorICoJdG8gc2V0LCBhbmQgY2FsbHMgdGhlIGhhbmRsZXIgZnVuY3Rpb24gb2YgdGhlIE9JRCB0byBwZXJmb3JtIHRoZQorICoJc2V0LiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiB3aWxsIGFsc28gYmUgc3RvcmVkIGluCisgKglTS19QTk1JX1NUUlVDVF9EQVRBIGlmIHRoZSBwYXNzZWQgYnVmZmVyIGhhcyB0aGUgbWluaW11bSBzaXplIG9mCisgKglTS19QTk1JX01JTl9TVFJVQ1RfU0laRS4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4KKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IGRhdGEgKGUuZy4gYSAzMmJpdCB2YWx1ZSBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCwgYnV0IGEgMTYgYml0IHZhbHVlIHdhcyBwYXNzZWQpLgorICoJU0tfUE5NSV9FUlJfQkFEX1ZBTFVFICAgIFRoZSBwYXNzZWQgdmFsdWUgaXMgbm90IGluIHRoZSB2YWxpZAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHJhbmdlLgorICovCitpbnQgU2tQbm1pU2V0U3RydWN0KAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK3ZvaWQgKnBCdWYsCQkvKiBCdWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIGRhdGEgdG8gYmUgc2V0ICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIExlbmd0aCBvZiBidWZmZXIgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9DVFJMLAorCQkoIlBOTUk6IFNrUG5taVNldFN0cnVjdDogQ2FsbGVkLCBCdWZMZW49JWQsIE5ldEluZGV4PSVkXG4iLAorCQkJKnBMZW4sIE5ldEluZGV4KSk7CisKKwlyZXR1cm4gKFBubWlTdHJ1Y3QocEFDLCBJb0MsIFNLX1BOTUlfU0VULCAoY2hhciAqKXBCdWYsCisgICAgCQkJCQlwTGVuLCBOZXRJbmRleCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTa1BubWlFdmVudCAtIEV2ZW50IGhhbmRsZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUhhbmRsZXMgdGhlIGZvbGxvd2luZyBldmVudHM6CisgKglTS19QTk1JX0VWVF9TSVJRX09WRVJGTE9XICAgICBXaGVuIGEgaGFyZHdhcmUgY291bnRlciBvdmVyZmxvd3MgYW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdCB3aWxsIGJlIGdlbmVyYXRlZCB3aGljaCBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgaGFuZGxlZCBieSBTSVJRIHdoaWNoIGdlbmVyYXRlcyBhCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGV2ZW50LiBUaGUgZXZlbnQgaW5jcmVtZW50cyB0aGUKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyIDMyIGJpdCBvZiB0aGUgNjQgYml0IGNvdW50ZXIuCisgKglTS19QTk1JX0VWVF9TRU5fWFhYICAgICAgICAgICBUaGUgZXZlbnQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBJMkMgbW9kdWxlCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGEgc2Vuc29yIHJlcG9ydHMgYSB3YXJuaW5nIG9yCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci4gVGhlIGV2ZW50IHdpbGwgc3RvcmUgYSB0cmFwCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIGluIHRoZSB0cmFwIGJ1ZmZlci4KKyAqCVNLX1BOTUlfRVZUX0NIR19FU1RfVElNRVIgICAgIFRoZSB0aW1lciBldmVudCB3YXMgaW5pdGlhdGVkIGJ5IHRoaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSBhbmQgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0IHN3aXRjaGVzIHBlciBob3VyLgorICoJU0tfUE5NSV9FVlRfQ0xFQVJfQ09VTlRFUiAgICAgVGhlIGV2ZW50IGNsZWFycyBhbGwgY291bnRlcnMgYW5kCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBzLgorICoJU0tfUE5NSV9FVlRfWE1BQ19SRVNFVCAgICAgICAgVGhlIGV2ZW50IGlzIGdlbmVyYXRlZCBieSB0aGUgZHJpdmVyCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgYSBoYXJkIHJlc2V0IG9mIHRoZSBYTUFDIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQuIEFsbCBjb3VudGVycyB3aWxsIGJlIHNhdmVkCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWRkZWQgdG8gdGhlIGhhcmR3YXJlIGNvdW50ZXIKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBhZnRlciByZXNldCB0byBncmFudCBjb250aW51b3VzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyIHZhbHVlcy4KKyAqCVNLX1BOTUlfRVZUX1JMTVRfUE9SVF9VUCAgICAgIEdlbmVyYXRlZCBieSBSTE1UIHRvIG5vdGlmeSB0aGF0IGEgcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VudCBsb2dpY2FsbHkgdXAuIEEgdHJhcCBtZXNzYWdlIHdpbGwKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHN0b3JlZCB0byB0aGUgdHJhcCBidWZmZXIuCisgKglTS19QTk1JX0VWVF9STE1UX1BPUlRfRE9XTiAgICBHZW5lcmF0ZWQgYnkgUkxNVCB0byBub3RpZnkgdGhhdCBhIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlbnQgbG9naWNhbGx5IGRvd24uIEEgdHJhcCBtZXNzYWdlIHdpbGwKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHN0b3JlZCB0byB0aGUgdHJhcCBidWZmZXIuCisgKglTS19QTk1JX0VWVF9STE1UX1NFR01FTlRBVElPTiBHZW5lcmF0ZWQgYnkgUkxNVCB0byBub3RpZnkgdGhhdCB0d28KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5uaW5nIHRyZWUgcm9vdCBicmlkZ2VzIHdlcmUKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdGVkLiBBIHRyYXAgbWVzc2FnZSB3aWxsIGJlIHN0b3JlZAorICoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHRyYXAgYnVmZmVyLgorICoJU0tfUE5NSV9FVlRfUkxNVF9BQ1RJVkVfRE9XTiAgTm90aWZpZXMgUE5NSSB0aGF0IGFuIGFjdGl2ZSBwb3J0IHdlbnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd24uIFBOTUkgd2lsbCBub3QgZnVydGhlciBhZGQgdGhlCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aXN0aWMgdmFsdWVzIHRvIHRoZSB2aXJ0dWFsIHBvcnQuCisgKglTS19QTk1JX0VWVF9STE1UX0FDVElWRV9VUCAgICBOb3RpZmllcyBQTk1JIHRoYXQgYSBwb3J0IHdlbnQgdXAgYW5kCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3cgYW4gYWN0aXZlIHBvcnQuIFBOTUkgd2lsbCBub3cKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZCB0aGUgc3RhdGlzdGljIGRhdGEgb2YgdGhpcyBwb3J0IHRvCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmlydHVhbCBwb3J0LgorICoJU0tfUE5NSV9FVlRfUkxNVF9TRVRfTkVUUyAgICAgTm90aWZpZXMgUE5NSSBhYm91dCB0aGUgbmV0IG1vZGUuIFRoZSBmaXJzdCBwYXJhbWV0ZXIKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgbmV0cy4gMSBtZWFucyBzaW5nbGUgbmV0LCAyIG1lYW5zCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdWFsIG5ldC4gVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgLTEKKyAqCisgKiBSZXR1cm5zOgorICoJQWx3YXlzIDAKKyAqLworaW50IFNrUG5taUV2ZW50KAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK1NLX1UzMiBFdmVudCwJCS8qIEV2ZW50LUlkICovCitTS19FVlBBUkEgUGFyYW0pCS8qIEV2ZW50IGRlcGVuZGVudCBwYXJhbWV0ZXIgKi8KK3sKKwl1bnNpZ25lZCBpbnQJUGh5c1BvcnRJbmRleDsKKyAgICB1bnNpZ25lZCBpbnQJTWF4TmV0TnVtYmVyOworCWludAkJCUNvdW50ZXJJbmRleDsKKwlpbnQJCQlSZXQ7CisJU0tfVTE2CQlNYWNTdGF0dXM7CisJU0tfVTY0CQlPdmVyZmxvd1N0YXR1czsKKwlTS19VNjQJCU1hc2s7CisJaW50CQkJTWFjVHlwZTsKKwlTS19VNjQJCVZhbHVlOworCVNLX1UzMgkJVmFsMzI7CisJU0tfVTE2CQlSZWdpc3RlcjsKKwlTS19FVlBBUkEJRXZlbnRQYXJhbTsKKwlTS19VNjQJCU5ld2VzdFZhbHVlOworCVNLX1U2NAkJT2xkZXN0VmFsdWU7CisJU0tfVTY0CQlEZWx0YTsKKwlTS19QTk1JX0VTVElNQVRFICpwRXN0OworCVNLX1UzMgkJTmV0SW5kZXg7CisJU0tfR0VQT1JUCSpwUHJ0OworCVNLX1BOTUlfVkNUCSpwVmN0QmFja3VwRGF0YTsKKwlTS19VMzIJCVJldENvZGU7CisJaW50CQlpOworCVNLX1UzMgkJQ2FibGVMZW5ndGg7CisKKworI2lmZGVmIERFQlVHCisJaWYgKEV2ZW50ICE9IFNLX1BOTUlfRVZUX1hNQUNfUkVTRVQpIHsKKworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJQTk1JOiBTa1BubWlFdmVudDogQ2FsbGVkLCBFdmVudD0weCV4LCBQYXJhbT0weCV4XG4iLAorCQkJKHVuc2lnbmVkIGludClFdmVudCwgKHVuc2lnbmVkIGludClQYXJhbS5QYXJhNjQpKTsKKwl9CisjZW5kaWYgLyogREVCVUcgKi8KKwlTS19QTk1JX0NIRUNLRkxBR1MoIlNrUG5taUV2ZW50OiBPbiBjYWxsIik7CisKKwlNYWNUeXBlID0gcEFDLT5HSW5pLkdJTWFjVHlwZTsKKwkKKwlzd2l0Y2ggKEV2ZW50KSB7CisKKwljYXNlIFNLX1BOTUlfRVZUX1NJUlFfT1ZFUkZMT1c6CisJCVBoeXNQb3J0SW5kZXggPSAoaW50KVBhcmFtLlBhcmEzMlswXTsKKwkJTWFjU3RhdHVzID0gKFNLX1UxNilQYXJhbS5QYXJhMzJbMV07CisjaWZkZWYgREVCVUcKKwkJaWYgKFBoeXNQb3J0SW5kZXggPj0gU0tfTUFYX01BQ1MpIHsKKworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIlBOTUk6IEVSUjogU2tQbm1pRXZlbnQ6IFNLX1BOTUlfRVZUX1NJUlFfT1ZFUkZMT1cgcGFyYW1ldGVyIgorCQkJCSAiIHdyb25nLCBQaHlzUG9ydEluZGV4PTB4JXhcbiIsCisJCQkJUGh5c1BvcnRJbmRleCkpOworCQkJcmV0dXJuICgwKTsKKwkJfQorI2VuZGlmIC8qIERFQlVHICovCisJCU92ZXJmbG93U3RhdHVzID0gMDsKKworCQkvKgorCQkgKiBDaGVjayB3aGljaCBzb3VyY2UgY2F1c2VkIGFuIG92ZXJmbG93IGludGVycnVwdC4KKwkJICovCisJCWlmICgocEFDLT5HSW5pLkdJRnVuYy5wRm5NYWNPdmVyZmxvdyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQlNYWNTdGF0dXMsICZPdmVyZmxvd1N0YXR1cykgIT0gMCkgfHwKKwkJCShPdmVyZmxvd1N0YXR1cyA9PSAwKSkgeworCisJCQlTS19QTk1JX0NIRUNLRkxBR1MoIlNrUG5taUV2ZW50OiBPbiByZXR1cm4iKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKworCQkvKgorCQkgKiBDaGVjayB0aGUgb3ZlcmZsb3cgc3RhdHVzIHJlZ2lzdGVyIGFuZCBpbmNyZW1lbnQKKwkJICogdGhlIHVwcGVyIGR3b3JkIG9mIGNvcnJlc3BvbmRpbmcgY291bnRlci4KKwkJICovCisJCWZvciAoQ291bnRlckluZGV4ID0gMDsgQ291bnRlckluZGV4IDwgc2l6ZW9mKE1hc2spICogODsKKwkJCUNvdW50ZXJJbmRleCArKykgeworCisJCQlNYXNrID0gKFNLX1U2NCkxIDw8IENvdW50ZXJJbmRleDsKKwkJCWlmICgoT3ZlcmZsb3dTdGF0dXMgJiBNYXNrKSA9PSAwKSB7CisKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJc3dpdGNoIChTdGF0T3ZyZmx3Qml0W0NvdW50ZXJJbmRleF1bTWFjVHlwZV0pIHsKKworCQkJY2FzZSBTS19QTk1JX0hUWF9VVElMVU5ERVI6CisJCQljYXNlIFNLX1BOTUlfSFRYX1VUSUxPVkVSOgorCQkJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQkJCVhNX0lOMTYoSW9DLCBQaHlzUG9ydEluZGV4LCBYTV9UWF9DTUQsICZSZWdpc3Rlcik7CisJCQkJCVJlZ2lzdGVyIHw9IFhNX1RYX1NBTV9MSU5FOworCQkJCQlYTV9PVVQxNihJb0MsIFBoeXNQb3J0SW5kZXgsIFhNX1RYX0NNRCwgUmVnaXN0ZXIpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBTS19QTk1JX0hSWF9VVElMVU5ERVI6CisJCQljYXNlIFNLX1BOTUlfSFJYX1VUSUxPVkVSOgorCQkJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQkJCVhNX0lOMTYoSW9DLCBQaHlzUG9ydEluZGV4LCBYTV9SWF9DTUQsICZSZWdpc3Rlcik7CisJCQkJCVJlZ2lzdGVyIHw9IFhNX1JYX1NBTV9MSU5FOworCQkJCQlYTV9PVVQxNihJb0MsIFBoeXNQb3J0SW5kZXgsIFhNX1JYX0NNRCwgUmVnaXN0ZXIpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBTS19QTk1JX0hUWF9PQ1RFVEhJR0g6CisJCQljYXNlIFNLX1BOTUlfSFRYX09DVEVUTE9XOgorCQkJY2FzZSBTS19QTk1JX0hUWF9SRVNFUlZFRDoKKwkJCWNhc2UgU0tfUE5NSV9IUlhfT0NURVRISUdIOgorCQkJY2FzZSBTS19QTk1JX0hSWF9PQ1RFVExPVzoKKwkJCWNhc2UgU0tfUE5NSV9IUlhfSVJMRU5HVEg6CisJCQljYXNlIFNLX1BOTUlfSFJYX1JFU0VSVkVEOgorCQkJCisJCQkvKgorCQkJICogdGhlIGZvbGxvd2luZyBjb3VudGVycyBhcmVuJ3QgYmUgaGFuZGxlZCAoaWQgPiA2MykKKwkJCSAqLworCQkJY2FzZSBTS19QTk1JX0hUWF9TWU5DOgorCQkJY2FzZSBTS19QTk1JX0hUWF9TWU5DX09DVEVUOgorCQkJCWJyZWFrOworCisJCQljYXNlIFNLX1BOTUlfSFJYX0xPTkdGUkFNRVM6CisJCQkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX0dNQUMpIHsKKwkJCQkJcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uCisJCQkJCQlDb3VudGVySGlnaFtDb3VudGVySW5kZXhdICsrOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS4KKwkJCQkJQ291bnRlckhpZ2hbQ291bnRlckluZGV4XSArKzsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9FVlRfU0VOX1dBUl9MT1c6CisjaWZkZWYgREVCVUcKKwkJaWYgKCh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTY0ID49ICh1bnNpZ25lZCBpbnQpcEFDLT5JMmMuTWF4U2VucykgeworCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiUE5NSTogRVJSOiBTa1BubWlFdmVudDogU0tfUE5NSV9FVlRfU0VOX1dBUl9MT1cgcGFyYW1ldGVyIHdyb25nLCBTZW5zb3JJbmRleD0lZFxuIiwKKwkJCQkodW5zaWduZWQgaW50KVBhcmFtLlBhcmE2NCkpOworCQkJcmV0dXJuICgwKTsKKwkJfQorI2VuZGlmIC8qIERFQlVHICovCisKKwkJLyoKKwkJICogU3RvcmUgYSB0cmFwIG1lc3NhZ2UgaW4gdGhlIHRyYXAgYnVmZmVyIGFuZCBnZW5lcmF0ZQorCQkgKiBhbiBldmVudCBmb3IgdXNlciBzcGFjZSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKKwkJICogU0tfRFJJVkVSX1NFTkRFVkVOVCBtYWNyby4KKwkJICovCisJCVF1ZXVlU2Vuc29yVHJhcChwQUMsIE9JRF9TS0dFX1RSQVBfU0VOX1dBUl9MT1csCisJCQkodW5zaWduZWQgaW50KVBhcmFtLlBhcmE2NCk7CisJCSh2b2lkKVNLX0RSSVZFUl9TRU5ERVZFTlQocEFDLCBJb0MpOworCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9FVlRfU0VOX1dBUl9VUFA6CisjaWZkZWYgREVCVUcKKwkJaWYgKCh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTY0ID49ICh1bnNpZ25lZCBpbnQpcEFDLT5JMmMuTWF4U2VucykgeworCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiUE5NSTogRVJSOiBTa1BubWlFdmVudDogU0tfUE5NSV9FVlRfU0VOX1dBUl9VUFAgcGFyYW1ldGVyIHdyb25nLCBTZW5zb3JJbmRleD0lZFxuIiwKKwkJCQkodW5zaWduZWQgaW50KVBhcmFtLlBhcmE2NCkpOworCQkJcmV0dXJuICgwKTsKKwkJfQorI2VuZGlmIC8qIERFQlVHICovCisKKwkJLyoKKwkJICogU3RvcmUgYSB0cmFwIG1lc3NhZ2UgaW4gdGhlIHRyYXAgYnVmZmVyIGFuZCBnZW5lcmF0ZQorCQkgKiBhbiBldmVudCBmb3IgdXNlciBzcGFjZSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKKwkJICogU0tfRFJJVkVSX1NFTkRFVkVOVCBtYWNyby4KKwkJICovCisJCVF1ZXVlU2Vuc29yVHJhcChwQUMsIE9JRF9TS0dFX1RSQVBfU0VOX1dBUl9VUFAsCisJCQkodW5zaWduZWQgaW50KVBhcmFtLlBhcmE2NCk7CisJCSh2b2lkKVNLX0RSSVZFUl9TRU5ERVZFTlQocEFDLCBJb0MpOworCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9FVlRfU0VOX0VSUl9MT1c6CisjaWZkZWYgREVCVUcKKwkJaWYgKCh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTY0ID49ICh1bnNpZ25lZCBpbnQpcEFDLT5JMmMuTWF4U2VucykgeworCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiUE5NSTogRVJSOiBTa1BubWlFdmVudDogU0tfUE5NSV9FVlRfU0VOX0VSUl9MT1cgcGFyYW1ldGVyIHdyb25nLCBTZW5zb3JJbmRleD0lZFxuIiwKKwkJCQkodW5zaWduZWQgaW50KVBhcmFtLlBhcmE2NCkpOworCQkJcmV0dXJuICgwKTsKKwkJfQorI2VuZGlmIC8qIERFQlVHICovCisKKwkJLyoKKwkJICogU3RvcmUgYSB0cmFwIG1lc3NhZ2UgaW4gdGhlIHRyYXAgYnVmZmVyIGFuZCBnZW5lcmF0ZQorCQkgKiBhbiBldmVudCBmb3IgdXNlciBzcGFjZSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKKwkJICogU0tfRFJJVkVSX1NFTkRFVkVOVCBtYWNyby4KKwkJICovCisJCVF1ZXVlU2Vuc29yVHJhcChwQUMsIE9JRF9TS0dFX1RSQVBfU0VOX0VSUl9MT1csCisJCQkodW5zaWduZWQgaW50KVBhcmFtLlBhcmE2NCk7CisJCSh2b2lkKVNLX0RSSVZFUl9TRU5ERVZFTlQocEFDLCBJb0MpOworCQlicmVhazsKKwkKKwljYXNlIFNLX1BOTUlfRVZUX1NFTl9FUlJfVVBQOgorI2lmZGVmIERFQlVHCisJCWlmICgodW5zaWduZWQgaW50KVBhcmFtLlBhcmE2NCA+PSAodW5zaWduZWQgaW50KXBBQy0+STJjLk1heFNlbnMpIHsKKworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIlBOTUk6IEVSUjogU2tQbm1pRXZlbnQ6IFNLX1BOTUlfRVZUX1NFTl9FUlJfVVBQIHBhcmFtZXRlciB3cm9uZywgU2Vuc29ySW5kZXg9JWRcbiIsCisJCQkJKHVuc2lnbmVkIGludClQYXJhbS5QYXJhNjQpKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCisJCS8qCisJCSAqIFN0b3JlIGEgdHJhcCBtZXNzYWdlIGluIHRoZSB0cmFwIGJ1ZmZlciBhbmQgZ2VuZXJhdGUKKwkJICogYW4gZXZlbnQgZm9yIHVzZXIgc3BhY2UgYXBwbGljYXRpb25zIHdpdGggdGhlCisJCSAqIFNLX0RSSVZFUl9TRU5ERVZFTlQgbWFjcm8uCisJCSAqLworCQlRdWV1ZVNlbnNvclRyYXAocEFDLCBPSURfU0tHRV9UUkFQX1NFTl9FUlJfVVBQLAorCQkJKHVuc2lnbmVkIGludClQYXJhbS5QYXJhNjQpOworCQkodm9pZClTS19EUklWRVJfU0VOREVWRU5UKHBBQywgSW9DKTsKKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfRVZUX0NIR19FU1RfVElNRVI6CisJCS8qCisJCSAqIENhbGN1bGF0ZSBwb3J0IHN3aXRjaCBhdmVyYWdlIG9uIGEgcGVyIGhvdXIgYmFzaXMKKwkJICogICBUaW1lIGludGVydmFsIGZvciBjaGVjayAgICAgICA6IDI4MTI1IG1zCisJCSAqICAgTnVtYmVyIG9mIHZhbHVlcyBmb3IgYXZlcmFnZSAgOiA4CisJCSAqCisJCSAqIEJlIGNhcmVmdWwgaW4gY2hhbmdpbmcgdGhlc2UgdmFsdWVzLCBvbiBjaGFuZ2UgY2hlY2sKKwkJICogICAtIHR5cGVkZWYgb2YgU0tfUE5NSV9FU1RJTUFURSAoU2l6ZSBvZiBFc3RWYWx1ZQorCQkgKiAgICAgYXJyYXkgb25lIGxlc3MgdGhhbiB2YWx1ZSBudW1iZXIpCisJCSAqICAgLSBUaW1lciBpbml0aWFsaXphdGlvbiBTa1RpbWVyU3RhcnQoKSBpbiBTa1BubWlJbml0CisJCSAqICAgLSBEZWx0YSB2YWx1ZSBiZWxvdyBtdXN0IGJlIG11bHRpcGxpY2F0ZWQgd2l0aAorCQkgKiAgICAgcG93ZXIgb2YgMgorCQkgKgorCQkgKi8KKwkJcEVzdCA9ICZwQUMtPlBubWkuUmxtdENoYW5nZUVzdGltYXRlOworCQlDb3VudGVySW5kZXggPSBwRXN0LT5Fc3RWYWx1ZUluZGV4ICsgMTsKKwkJaWYgKENvdW50ZXJJbmRleCA9PSA3KSB7CisKKwkJCUNvdW50ZXJJbmRleCA9IDA7CisJCX0KKwkJcEVzdC0+RXN0VmFsdWVJbmRleCA9IENvdW50ZXJJbmRleDsKKworCQlOZXdlc3RWYWx1ZSA9IHBBQy0+UG5taS5SbG10Q2hhbmdlQ3RzOworCQlPbGRlc3RWYWx1ZSA9IHBFc3QtPkVzdFZhbHVlW0NvdW50ZXJJbmRleF07CisJCXBFc3QtPkVzdFZhbHVlW0NvdW50ZXJJbmRleF0gPSBOZXdlc3RWYWx1ZTsKKworCQkvKgorCQkgKiBDYWxjdWxhdGUgYXZlcmFnZS4gRGVsdGEgc3RvcmVzIHRoZSBudW1iZXIgb2YKKwkJICogcG9ydCBzd2l0Y2hlcyBwZXIgMjgxMjUgKiA4ID0gMjI1MDAwIG1zCisJCSAqLworCQlpZiAoTmV3ZXN0VmFsdWUgPj0gT2xkZXN0VmFsdWUpIHsKKworCQkJRGVsdGEgPSBOZXdlc3RWYWx1ZSAtIE9sZGVzdFZhbHVlOworCQl9CisJCWVsc2UgeworCQkJLyogT3ZlcmZsb3cgc2l0dWF0aW9uICovCisJCQlEZWx0YSA9IChTS19VNjQpKDAgLSBPbGRlc3RWYWx1ZSkgKyBOZXdlc3RWYWx1ZTsKKwkJfQorCisJCS8qCisJCSAqIEV4dHJhcG9sYXRlIGRlbHRhIHRvIHBvcnQgc3dpdGNoZXMgcGVyIGhvdXIuCisJCSAqICAgICBFc3RpbWF0ZSA9IERlbHRhICogKDM2MDAwMDAgLyAyMjUwMDApCisJCSAqICAgICAgICAgICAgICA9IERlbHRhICogMTYKKwkJICogICAgICAgICAgICAgID0gRGVsdGEgPDwgNAorCQkgKi8KKwkJcEFDLT5Qbm1pLlJsbXRDaGFuZ2VFc3RpbWF0ZS5Fc3RpbWF0ZSA9IERlbHRhIDw8IDQ7CisKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhyZXNob2xkIGlzIGV4Y2VlZGVkLiBJZiB0aGUgdGhyZXNob2xkIGlzCisJCSAqIHBlcm1hbmVudGx5IGV4Y2VlZGVkIGV2ZXJ5IDI4MTI1IG1zIGFuIGV2ZW50IHdpbGwgYmUKKwkJICogZ2VuZXJhdGVkIHRvIHJlbWluZCB0aGUgdXNlciBvZiB0aGlzIGNvbmRpdGlvbi4KKwkJICovCisJCWlmICgocEFDLT5Qbm1pLlJsbXRDaGFuZ2VUaHJlc2hvbGQgIT0gMCkgJiYKKwkJCShwQUMtPlBubWkuUmxtdENoYW5nZUVzdGltYXRlLkVzdGltYXRlID49CisJCQlwQUMtPlBubWkuUmxtdENoYW5nZVRocmVzaG9sZCkpIHsKKworCQkJUXVldWVTaW1wbGVUcmFwKHBBQywgT0lEX1NLR0VfVFJBUF9STE1UX0NIQU5HRV9USFJFUyk7CisJCQkodm9pZClTS19EUklWRVJfU0VOREVWRU5UKHBBQywgSW9DKTsKKwkJfQorCisJCVNLX01FTVNFVCgoY2hhciAqKSZFdmVudFBhcmFtLCAwLCBzaXplb2YoRXZlbnRQYXJhbSkpOworCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwQUMtPlBubWkuUmxtdENoYW5nZUVzdGltYXRlLkVzdFRpbWVyLAorCQkJMjgxMjUwMDAsIFNLR0VfUE5NSSwgU0tfUE5NSV9FVlRfQ0hHX0VTVF9USU1FUiwKKwkJCUV2ZW50UGFyYW0pOworCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9FVlRfQ0xFQVJfQ09VTlRFUjoKKwkJLyoKKwkJICogIFBhcmFtLlBhcmEzMlswXSBjb250YWlucyB0aGUgTmV0SW5kZXggKDAgLi4xKS4KKwkJICogIFBhcmFtLlBhcmEzMlsxXSBpcyByZXNlcnZlZCwgY29udGFpbnMgLTEuCisJCSAqLworCQlOZXRJbmRleCA9IChTS19VMzIpUGFyYW0uUGFyYTMyWzBdOworCisjaWZkZWYgREVCVUcKKwkJaWYgKE5ldEluZGV4ID49IHBBQy0+UmxtdC5OdW1OZXRzKSB7CisKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJQTk1JOiBFUlI6IFNrUG5taUV2ZW50OiBTS19QTk1JX0VWVF9DTEVBUl9DT1VOVEVSIHBhcmFtZXRlciB3cm9uZywgTmV0SW5kZXg9JWRcbiIsCisJCQkJTmV0SW5kZXgpKTsKKworCQkJcmV0dXJuICgwKTsKKwkJfQorI2VuZGlmIC8qIERFQlVHICovCisKKwkJLyoKKwkJICogU2V0IGFsbCBjb3VudGVycyBhbmQgdGltZXN0YW1wcyB0byB6ZXJvLgorCQkgKiBUaGUgYWNjb3JkaW5nIE5ldEluZGV4IGlzIHJlcXVpcmVkIGFzIGEKKwkJICogcGFyYW1ldGVyIG9mIHRoZSBldmVudC4KKwkJICovCisJCVJlc2V0Q291bnRlcihwQUMsIElvQywgTmV0SW5kZXgpOworCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9FVlRfWE1BQ19SRVNFVDoKKwkJLyoKKwkJICogVG8gZ3JhbnQgY29udGludW91cyBjb3VudGVyIHZhbHVlcyBzdG9yZSB0aGUgY3VycmVudAorCQkgKiBYTUFDIHN0YXRpc3RpYyB2YWx1ZXMgdG8gdGhlIGVudHJpZXMgMS4ubiBvZiB0aGUKKwkJICogQ291bnRlck9mZnNldCBhcnJheS4gWE1BQyBFcnJhdGEgIzIKKwkJICovCisjaWZkZWYgREVCVUcKKwkJaWYgKCh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTY0ID49IFNLX01BWF9NQUNTKSB7CisKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJQTk1JOiBFUlI6IFNrUG5taUV2ZW50OiBTS19QTk1JX0VWVF9YTUFDX1JFU0VUIHBhcmFtZXRlciB3cm9uZywgUGh5c1BvcnRJbmRleD0lZFxuIiwKKwkJCQkodW5zaWduZWQgaW50KVBhcmFtLlBhcmE2NCkpOworCQkJcmV0dXJuICgwKTsKKwkJfQorI2VuZGlmCisJCVBoeXNQb3J0SW5kZXggPSAodW5zaWduZWQgaW50KVBhcmFtLlBhcmE2NDsKKworCQkvKgorCQkgKiBVcGRhdGUgWE1BQyBzdGF0aXN0aWMgdG8gZ2V0IGZyZXNoIHZhbHVlcworCQkgKi8KKwkJUmV0ID0gTWFjVXBkYXRlKHBBQywgSW9DLCAwLCBwQUMtPkdJbmkuR0lNYWNzRm91bmQgLSAxKTsKKwkJaWYgKFJldCAhPSBTS19QTk1JX0VSUl9PSykgeworCisJCQlTS19QTk1JX0NIRUNLRkxBR1MoIlNrUG5taUV2ZW50OiBPbiByZXR1cm4iKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJLyoKKwkJICogSW5jcmVtZW50IHNlbWFwaG9yZSB0byBpbmRpY2F0ZSB0aGF0IGFuIHVwZGF0ZSB3YXMKKwkJICogYWxyZWFkeSBkb25lCisJCSAqLworCQlwQUMtPlBubWkuTWFjVXBkYXRlZEZsYWcgKys7CisKKwkJZm9yIChDb3VudGVySW5kZXggPSAwOyBDb3VudGVySW5kZXggPCBTS19QTk1JX01BWF9JRFg7CisJCQlDb3VudGVySW5kZXggKyspIHsKKworCQkJaWYgKCFTdGF0QWRkcltDb3VudGVySW5kZXhdW01hY1R5cGVdLkdldE9mZnNldCkgeworCisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLkNvdW50ZXJPZmZzZXRbQ291bnRlckluZGV4XSA9CisJCQkJR2V0UGh5c1N0YXRWYWwocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsIENvdW50ZXJJbmRleCk7CisJCQkKKwkJCXBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLkNvdW50ZXJIaWdoW0NvdW50ZXJJbmRleF0gPSAwOworCQl9CisKKwkJcEFDLT5Qbm1pLk1hY1VwZGF0ZWRGbGFnIC0tOworCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9FVlRfUkxNVF9QT1JUX1VQOgorCQlQaHlzUG9ydEluZGV4ID0gKHVuc2lnbmVkIGludClQYXJhbS5QYXJhMzJbMF07CisjaWZkZWYgREVCVUcKKwkJaWYgKFBoeXNQb3J0SW5kZXggPj0gU0tfTUFYX01BQ1MpIHsKKworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9QTk1JLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIlBOTUk6IEVSUjogU2tQbm1pRXZlbnQ6IFNLX1BOTUlfRVZUX1JMTVRfUE9SVF9VUCBwYXJhbWV0ZXIiCisgICAgICAgICAgICAgICAgICIgd3JvbmcsIFBoeXNQb3J0SW5kZXg9JWRcbiIsIFBoeXNQb3J0SW5kZXgpKTsKKworCQkJcmV0dXJuICgwKTsKKwkJfQorI2VuZGlmIC8qIERFQlVHICovCisKKwkJLyoKKwkJICogU3RvcmUgYSB0cmFwIG1lc3NhZ2UgaW4gdGhlIHRyYXAgYnVmZmVyIGFuZCBnZW5lcmF0ZSBhbiBldmVudCBmb3IKKwkJICogdXNlciBzcGFjZSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUgU0tfRFJJVkVSX1NFTkRFVkVOVCBtYWNyby4KKwkJICovCisJCVF1ZXVlUmxtdFBvcnRUcmFwKHBBQywgT0lEX1NLR0VfVFJBUF9STE1UX1BPUlRfVVAsIFBoeXNQb3J0SW5kZXgpOworCQkodm9pZClTS19EUklWRVJfU0VOREVWRU5UKHBBQywgSW9DKTsKKworCQkvKiBCdWdmaXggZm9yIFhNQUMgZXJyYXRhICgjMTA2MjApKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCS8qIEFkZCBpbmNyZW1lbnRhbCBkaWZmZXJlbmNlIHRvIG9mZnNldCAoIzEwNjIwKSovCisJCQkodm9pZClwQUMtPkdJbmkuR0lGdW5jLnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQlYTV9SWEVfU0hUX0VSUiwgJlZhbDMyKTsKKwkJCQorCQkJVmFsdWUgPSAoKChTS19VNjQpcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uCisJCQkJIENvdW50ZXJIaWdoW1NLX1BOTUlfSFJYX1NIT1JUU10gPDwgMzIpIHwgKFNLX1U2NClWYWwzMik7CisJCQlwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS5Db3VudGVyT2Zmc2V0W1NLX1BOTUlfSFJYX1NIT1JUU10gKz0KKwkJCQlWYWx1ZSAtIHBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLlJ4U2hvcnRaZXJvTWFyazsKKwkJfQorCQkKKwkJLyogVGVsbCBWY3RTdGF0dXMoKSB0aGF0IGEgbGluayB3YXMgdXAgbWVhbndoaWxlLiAqLworCQlwQUMtPlBubWkuVmN0U3RhdHVzW1BoeXNQb3J0SW5kZXhdIHw9IFNLX1BOTUlfVkNUX0xJTks7CQkKKwkJYnJlYWs7CisKKyAgICBjYXNlIFNLX1BOTUlfRVZUX1JMTVRfUE9SVF9ET1dOOgorCQlQaHlzUG9ydEluZGV4ID0gKHVuc2lnbmVkIGludClQYXJhbS5QYXJhMzJbMF07CisKKyNpZmRlZiBERUJVRworCQlpZiAoUGh5c1BvcnRJbmRleCA+PSBTS19NQVhfTUFDUykgeworCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiUE5NSTogRVJSOiBTa1BubWlFdmVudDogU0tfUE5NSV9FVlRfUkxNVF9QT1JUX0RPV04gcGFyYW1ldGVyIgorICAgICAgICAgICAgICAgICAiIHdyb25nLCBQaHlzUG9ydEluZGV4PSVkXG4iLCBQaHlzUG9ydEluZGV4KSk7CisKKwkJCXJldHVybiAoMCk7CisJCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCisJCS8qCisJCSAqIFN0b3JlIGEgdHJhcCBtZXNzYWdlIGluIHRoZSB0cmFwIGJ1ZmZlciBhbmQgZ2VuZXJhdGUgYW4gZXZlbnQgZm9yCisJCSAqIHVzZXIgc3BhY2UgYXBwbGljYXRpb25zIHdpdGggdGhlIFNLX0RSSVZFUl9TRU5ERVZFTlQgbWFjcm8uCisJCSAqLworCQlRdWV1ZVJsbXRQb3J0VHJhcChwQUMsIE9JRF9TS0dFX1RSQVBfUkxNVF9QT1JUX0RPV04sIFBoeXNQb3J0SW5kZXgpOworCQkodm9pZClTS19EUklWRVJfU0VOREVWRU5UKHBBQywgSW9DKTsKKworCQkvKiBCdWdmaXggIzEwNjIwIC0gZ2V0IHplcm8gbGV2ZWwgZm9yIGluY3JlbWVudGFsIGRpZmZlcmVuY2UgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKworCQkJKHZvaWQpcEFDLT5HSW5pLkdJRnVuYy5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJWE1fUlhFX1NIVF9FUlIsICZWYWwzMik7CisJCQkKKwkJCXBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLlJ4U2hvcnRaZXJvTWFyayA9CisJCQkJKCgoU0tfVTY0KXBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLgorCQkJCSBDb3VudGVySGlnaFtTS19QTk1JX0hSWF9TSE9SVFNdIDw8IDMyKSB8IChTS19VNjQpVmFsMzIpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0VWVF9STE1UX0FDVElWRV9ET1dOOgorCQlQaHlzUG9ydEluZGV4ID0gKHVuc2lnbmVkIGludClQYXJhbS5QYXJhMzJbMF07CisJCU5ldEluZGV4ID0gKFNLX1UzMilQYXJhbS5QYXJhMzJbMV07CisKKyNpZmRlZiBERUJVRworCQlpZiAoUGh5c1BvcnRJbmRleCA+PSBTS19NQVhfTUFDUykgeworCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiUE5NSTogRVJSOiBTa1BubWlFdmVudDogU0tfUE5NSV9FVlRfUkxNVF9BQ1RJVkVfRE9XTiBwYXJhbWV0ZXIgdG9vIGhpZ2gsIFBoeXNQb3J0PSVkXG4iLAorCQkJCVBoeXNQb3J0SW5kZXgpKTsKKwkJfQorCisJCWlmIChOZXRJbmRleCA+PSBwQUMtPlJsbXQuTnVtTmV0cykgeworCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiUE5NSTogRVJSOiBTa1BubWlFdmVudDogU0tfUE5NSV9FVlRfUkxNVF9BQ1RJVkVfRE9XTiBwYXJhbWV0ZXIgdG9vIGhpZ2gsIE5ldEluZGV4PSVkXG4iLAorCQkJCU5ldEluZGV4KSk7CisJCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCisJCS8qCisJCSAqIEZvciBub3csIGlnbm9yZSBldmVudCBpZiBOZXRJbmRleCAhPSAwLgorCQkgKi8KKwkJaWYgKFBhcmFtLlBhcmEzMlsxXSAhPSAwKSB7CisKKwkJCXJldHVybiAoMCk7CisJCX0KKworCQkvKgorCQkgKiBOb3RoaW5nIHRvIGRvIGlmIHBvcnQgaXMgYWxyZWFkeSBpbmFjdGl2ZQorCQkgKi8KKwkJaWYgKCFwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS5BY3RpdmVGbGFnKSB7CisKKwkJCXJldHVybiAoMCk7CisJCX0KKworCQkvKgorCQkgKiBVcGRhdGUgc3RhdGlzdGljIGNvdW50ZXJzIHRvIGNhbGN1bGF0ZSBuZXcgb2Zmc2V0IGZvciB0aGUgdmlydHVhbAorCQkgKiBwb3J0IGFuZCBpbmNyZW1lbnQgc2VtYXBob3JlIHRvIGluZGljYXRlIHRoYXQgYW4gdXBkYXRlIHdhcyBhbHJlYWR5CisJCSAqIGRvbmUuCisJCSAqLworCQlpZiAoTWFjVXBkYXRlKHBBQywgSW9DLCAwLCBwQUMtPkdJbmkuR0lNYWNzRm91bmQgLSAxKSAhPQorCQkJU0tfUE5NSV9FUlJfT0spIHsKKworCQkJU0tfUE5NSV9DSEVDS0ZMQUdTKCJTa1BubWlFdmVudDogT24gcmV0dXJuIik7CisJCQlyZXR1cm4gKDApOworCQl9CisJCXBBQy0+UG5taS5NYWNVcGRhdGVkRmxhZyArKzsKKworCQkvKgorCQkgKiBDYWxjdWxhdGUgbmV3IGNvdW50ZXIgb2Zmc2V0IGZvciB2aXJ0dWFsIHBvcnQgdG8gZ3JhbnQgY29udGlub3VzCisJCSAqIGNvdW50aW5nIG9uIHBvcnQgc3dpdGNoZXMuIFRoZSB2aXJ0dWFsIHBvcnQgY29uc2lzdHMgb2YgYWxsIGN1cnJlbnRseQorCQkgKiBhY3RpdmUgcG9ydHMuIFRoZSBwb3J0IGRvd24gZXZlbnQgaW5kaWNhdGVzIHRoYXQgYSBwb3J0IGlzIHJlbW92ZWQKKwkJICogZnJvbSB0aGUgdmlydHVhbCBwb3J0LiBUaGVyZWZvcmUgYWRkIHRoZSBjb3VudGVyIHZhbHVlIG9mIHRoZSByZW1vdmVkCisJCSAqIHBvcnQgdG8gdGhlIENvdW50ZXJPZmZzZXQgZm9yIHRoZSB2aXJ0dWFsIHBvcnQgdG8gZ3JhbnQgdGhlIHNhbWUKKwkJICogY291bnRlciB2YWx1ZS4KKwkJICovCisJCWZvciAoQ291bnRlckluZGV4ID0gMDsgQ291bnRlckluZGV4IDwgU0tfUE5NSV9NQVhfSURYOworCQkJQ291bnRlckluZGV4ICsrKSB7CisKKwkJCWlmICghU3RhdEFkZHJbQ291bnRlckluZGV4XVtNYWNUeXBlXS5HZXRPZmZzZXQpIHsKKworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlWYWx1ZSA9IEdldFBoeXNTdGF0VmFsKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LCBDb3VudGVySW5kZXgpOworCisJCQlwQUMtPlBubWkuVmlydHVhbENvdW50ZXJPZmZzZXRbQ291bnRlckluZGV4XSArPSBWYWx1ZTsKKwkJfQorCisJCS8qCisJCSAqIFNldCBwb3J0IHRvIGluYWN0aXZlCisJCSAqLworCQlwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS5BY3RpdmVGbGFnID0gU0tfRkFMU0U7CisKKwkJcEFDLT5Qbm1pLk1hY1VwZGF0ZWRGbGFnIC0tOworCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9FVlRfUkxNVF9BQ1RJVkVfVVA6CisJCVBoeXNQb3J0SW5kZXggPSAodW5zaWduZWQgaW50KVBhcmFtLlBhcmEzMlswXTsKKwkJTmV0SW5kZXggPSAoU0tfVTMyKVBhcmFtLlBhcmEzMlsxXTsKKworI2lmZGVmIERFQlVHCisJCWlmIChQaHlzUG9ydEluZGV4ID49IFNLX01BWF9NQUNTKSB7CisKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJQTk1JOiBFUlI6IFNrUG5taUV2ZW50OiBTS19QTk1JX0VWVF9STE1UX0FDVElWRV9VUCBwYXJhbWV0ZXIgdG9vIGhpZ2gsIFBoeXNQb3J0PSVkXG4iLAorCQkJCVBoeXNQb3J0SW5kZXgpKTsKKwkJfQorCisJCWlmIChOZXRJbmRleCA+PSBwQUMtPlJsbXQuTnVtTmV0cykgeworCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiUE5NSTogRVJSOiBTa1BubWlFdmVudDogU0tfUE5NSV9FVlRfUkxNVF9BQ1RJVkVfVVAgcGFyYW1ldGVyIHRvbyBoaWdoLCBOZXRJbmRleD0lZFxuIiwKKwkJCQlOZXRJbmRleCkpOworCQl9CisjZW5kaWYgLyogREVCVUcgKi8KKworCQkvKgorCQkgKiBGb3Igbm93LCBpZ25vcmUgZXZlbnQgaWYgTmV0SW5kZXggIT0gMC4KKwkJICovCisJCWlmIChQYXJhbS5QYXJhMzJbMV0gIT0gMCkgeworCisJCQlyZXR1cm4gKDApOworCQl9CisKKwkJLyoKKwkJICogTm90aGluZyB0byBkbyBpZiBwb3J0IGlzIGFscmVhZHkgYWN0aXZlCisJCSAqLworCQlpZiAocEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uQWN0aXZlRmxhZykgeworCisJCQlyZXR1cm4gKDApOworCQl9CisKKwkJLyoKKwkJICogU3RhdGlzdGljIG1haW50ZW5hbmNlCisJCSAqLworCQlwQUMtPlBubWkuUmxtdENoYW5nZUN0cyArKzsKKwkJcEFDLT5Qbm1pLlJsbXRDaGFuZ2VUaW1lID0gU0tfUE5NSV9IVU5EUkVEU19TRUMoU2tPc0dldFRpbWUocEFDKSk7CisKKwkJLyoKKwkJICogU3RvcmUgYSB0cmFwIG1lc3NhZ2UgaW4gdGhlIHRyYXAgYnVmZmVyIGFuZCBnZW5lcmF0ZSBhbiBldmVudCBmb3IKKwkJICogdXNlciBzcGFjZSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUgU0tfRFJJVkVSX1NFTkRFVkVOVCBtYWNyby4KKwkJICovCisJCVF1ZXVlUmxtdE5ld01hY1RyYXAocEFDLCBQaHlzUG9ydEluZGV4KTsKKwkJKHZvaWQpU0tfRFJJVkVSX1NFTkRFVkVOVChwQUMsIElvQyk7CisKKwkJLyoKKwkJICogVXBkYXRlIHN0YXRpc3RpYyBjb3VudGVycyB0byBjYWxjdWxhdGUgbmV3IG9mZnNldCBmb3IgdGhlIHZpcnR1YWwKKwkJICogcG9ydCBhbmQgaW5jcmVtZW50IHNlbWFwaG9yZSB0byBpbmRpY2F0ZSB0aGF0IGFuIHVwZGF0ZSB3YXMKKwkJICogYWxyZWFkeSBkb25lLgorCQkgKi8KKwkJaWYgKE1hY1VwZGF0ZShwQUMsIElvQywgMCwgcEFDLT5HSW5pLkdJTWFjc0ZvdW5kIC0gMSkgIT0KKwkJCVNLX1BOTUlfRVJSX09LKSB7CisKKwkJCVNLX1BOTUlfQ0hFQ0tGTEFHUygiU2tQbm1pRXZlbnQ6IE9uIHJldHVybiIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlwQUMtPlBubWkuTWFjVXBkYXRlZEZsYWcgKys7CisKKwkJLyoKKwkJICogQ2FsY3VsYXRlIG5ldyBjb3VudGVyIG9mZnNldCBmb3IgdmlydHVhbCBwb3J0IHRvIGdyYW50IGNvbnRpbm91cworCQkgKiBjb3VudGluZyBvbiBwb3J0IHN3aXRjaGVzLiBBIG5ldyBwb3J0IGlzIGFkZGVkIHRvIHRoZSB2aXJ0dWFsIHBvcnQuCisJCSAqIFRoZXJlZm9yZSBzdWJzdHJhY3QgdGhlIGNvdW50ZXIgdmFsdWUgb2YgdGhlIG5ldyBwb3J0IGZyb20gdGhlCisJCSAqIENvdW50ZXJPZmZzZXQgZm9yIHRoZSB2aXJ0dWFsIHBvcnQgdG8gZ3JhbnQgdGhlIHNhbWUgdmFsdWUuCisJCSAqLworCQlmb3IgKENvdW50ZXJJbmRleCA9IDA7IENvdW50ZXJJbmRleCA8IFNLX1BOTUlfTUFYX0lEWDsKKwkJCUNvdW50ZXJJbmRleCArKykgeworCisJCQlpZiAoIVN0YXRBZGRyW0NvdW50ZXJJbmRleF1bTWFjVHlwZV0uR2V0T2Zmc2V0KSB7CisKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJVmFsdWUgPSBHZXRQaHlzU3RhdFZhbChwQUMsIElvQywgUGh5c1BvcnRJbmRleCwgQ291bnRlckluZGV4KTsKKworCQkJcEFDLT5Qbm1pLlZpcnR1YWxDb3VudGVyT2Zmc2V0W0NvdW50ZXJJbmRleF0gLT0gVmFsdWU7CisJCX0KKworCQkvKiBTZXQgcG9ydCB0byBhY3RpdmUgKi8KKwkJcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uQWN0aXZlRmxhZyA9IFNLX1RSVUU7CisKKwkJcEFDLT5Qbm1pLk1hY1VwZGF0ZWRGbGFnIC0tOworCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9FVlRfUkxNVF9TRUdNRU5UQVRJT046CisJCS8qCisJCSAqIFBhcmEuUGFyYTMyWzBdIGNvbnRhaW5zIHRoZSBOZXRJbmRleC4KKwkJICovCisKKwkJLyoKKwkJICogU3RvcmUgYSB0cmFwIG1lc3NhZ2UgaW4gdGhlIHRyYXAgYnVmZmVyIGFuZCBnZW5lcmF0ZSBhbiBldmVudCBmb3IKKwkJICogdXNlciBzcGFjZSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUgU0tfRFJJVkVSX1NFTkRFVkVOVCBtYWNyby4KKwkJICovCisJCVF1ZXVlU2ltcGxlVHJhcChwQUMsIE9JRF9TS0dFX1RSQVBfUkxNVF9TRUdNRU5UQVRJT04pOworCQkodm9pZClTS19EUklWRVJfU0VOREVWRU5UKHBBQywgSW9DKTsKKwkJYnJlYWs7CisKKyAgICBjYXNlIFNLX1BOTUlfRVZUX1JMTVRfU0VUX05FVFM6CisJCS8qCisJCSAqICBQYXJhbS5QYXJhMzJbMF0gY29udGFpbnMgdGhlIG51bWJlciBvZiBOZXRzLgorCQkgKiAgUGFyYW0uUGFyYTMyWzFdIGlzIHJlc2VydmVkLCBjb250YWlucyAtMS4KKwkJICovCisJICAgIC8qCisgICAgCSAqIENoZWNrIG51bWJlciBvZiBuZXRzCisJCSAqLworCQlNYXhOZXROdW1iZXIgPSBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7CisJCWlmICgoKHVuc2lnbmVkIGludClQYXJhbS5QYXJhMzJbMF0gPCAxKQorCQkJfHwgKCh1bnNpZ25lZCBpbnQpUGFyYW0uUGFyYTMyWzBdID4gTWF4TmV0TnVtYmVyKSkgeworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX05FVCk7CisJCX0KKworICAgICAgICBpZiAoKHVuc2lnbmVkIGludClQYXJhbS5QYXJhMzJbMF0gPT0gMSkgeyAvKiBzaW5nbGUgbmV0IG1vZGUgKi8KKyAgICAgICAgCXBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9IFNLX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvKiBkdWFsIG5ldCBtb2RlICovCisgICAgICAgIAlwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPSBTS19UUlVFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBTS19QTk1JX0VWVF9WQ1RfUkVTRVQ6CisJCVBoeXNQb3J0SW5kZXggPSBQYXJhbS5QYXJhMzJbMF07CisJCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdOworCQlwVmN0QmFja3VwRGF0YSA9ICZwQUMtPlBubWkuVmN0QmFja3VwW1BoeXNQb3J0SW5kZXhdOworCQkKKwkJaWYgKHBBQy0+UG5taS5WY3RTdGF0dXNbUGh5c1BvcnRJbmRleF0gJiBTS19QTk1JX1ZDVF9QRU5ESU5HKSB7CisJCQlSZXRDb2RlID0gU2tHbUNhYmxlRGlhZ1N0YXR1cyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwgU0tfRkFMU0UpOworCQkJaWYgKFJldENvZGUgPT0gMikgeworCQkJCS8qCisJCQkJICogVkNUIHRlc3QgaXMgc3RpbGwgcnVubmluZy4KKwkJCQkgKiBTdGFydCBWQ1QgdGltZXIgY291bnRlciBhZ2Fpbi4KKwkJCQkgKi8KKwkJCQlTS19NRU1TRVQoKGNoYXIgKikgJlBhcmFtLCAwLCBzaXplb2YoUGFyYW0pKTsKKwkJCQlQYXJhbS5QYXJhMzJbMF0gPSBQaHlzUG9ydEluZGV4OworCQkJCVBhcmFtLlBhcmEzMlsxXSA9IC0xOworCQkJCVNrVGltZXJTdGFydChwQUMsIElvQywKKwkJCQkJJnBBQy0+UG5taS5WY3RUaW1lb3V0W1BoeXNQb3J0SW5kZXhdLlZjdFRpbWVyLAorCQkJCTQwMDAwMDAsIFNLR0VfUE5NSSwgU0tfUE5NSV9FVlRfVkNUX1JFU0VULCBQYXJhbSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwQUMtPlBubWkuVmN0U3RhdHVzW1BoeXNQb3J0SW5kZXhdICY9IH5TS19QTk1JX1ZDVF9QRU5ESU5HOworCQkJcEFDLT5Qbm1pLlZjdFN0YXR1c1tQaHlzUG9ydEluZGV4XSB8PQorCQkJCShTS19QTk1JX1ZDVF9ORVdfVkNUX0RBVEEgfCBTS19QTk1JX1ZDVF9URVNUX0RPTkUpOworCQkJCisJCQkvKiBDb3B5IHJlc3VsdHMgZm9yIGxhdGVyIHVzZSB0byBQTk1JIHN0cnVjdC4gKi8KKwkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspICB7CisJCQkJaWYgKHBQcnQtPlBNZGlQYWlyU3RzW2ldID09IFNLX1BOTUlfVkNUX05PUk1BTF9DQUJMRSkgeworCQkJCQlpZiAoKHBQcnQtPlBNZGlQYWlyTGVuW2ldID4gMzUpICYmCisJCQkJCQkocFBydC0+UE1kaVBhaXJMZW5baV0gPCAweGZmKSkgeworCQkJCQkJcFBydC0+UE1kaVBhaXJTdHNbaV0gPSBTS19QTk1JX1ZDVF9JTVBFREFOQ0VfTUlTTUFUQ0g7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKChwUHJ0LT5QTWRpUGFpckxlbltpXSA+IDM1KSAmJgorCQkJCQkocFBydC0+UE1kaVBhaXJMZW5baV0gIT0gMHhmZikpIHsKKwkJCQkJQ2FibGVMZW5ndGggPSAxMDAwICoKKwkJCQkJCSgoKDE3NSAqIHBQcnQtPlBNZGlQYWlyTGVuW2ldKSAvIDIxMCkgLSAyOCk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlDYWJsZUxlbmd0aCA9IDA7CisJCQkJfQorCQkJCXBWY3RCYWNrdXBEYXRhLT5QTWRpUGFpckxlbltpXSA9IENhYmxlTGVuZ3RoOworCQkJCXBWY3RCYWNrdXBEYXRhLT5QTWRpUGFpclN0c1tpXSA9IHBQcnQtPlBNZGlQYWlyU3RzW2ldOworCQkJfQorCQkJCisJCQlQYXJhbS5QYXJhMzJbMF0gPSBQaHlzUG9ydEluZGV4OworCQkJUGFyYW0uUGFyYTMyWzFdID0gLTE7CisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1BPUlRfUkVTRVQsIFBhcmFtKTsKKwkJCVNrRXZlbnREaXNwYXRjaGVyKHBBQywgSW9DKTsKKwkJfQorCQkKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlTS19QTk1JX0NIRUNLRkxBR1MoIlNrUG5taUV2ZW50OiBPbiByZXR1cm4iKTsKKwlyZXR1cm4gKDApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBQcml2YXRlIGZ1bmN0aW9ucworICoKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBQbm1pVmFyIC0gR2V0cywgcHJlc2V0cywgYW5kIHNldHMgc2luZ2xlIE9JRHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUxvb2tzIHVwIHRoZSByZXF1ZXN0ZWQgT0lELCBjYWxscyB0aGUgY29ycmVzcG9uZGluZyBoYW5kbGVyCisgKglmdW5jdGlvbiwgYW5kIHBhc3NlcyB0aGUgcGFyYW1ldGVycyB3aXRoIHRoZSBnZXQsIHByZXNldCwgb3IKKyAqCXNldCBjb21tYW5kLiBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IFNrR2VQbm1pR2V0VmFyLAorICoJU2tHZVBubWlQcmVTZXRWYXIsIG9yIFNrR2VQbm1pU2V0VmFyLgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9YWFguIEZvciBkZXRhaWxzIGhhdmUgYSBsb29rIGF0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUKKyAqCWNhbGxpbmcgZnVuY3Rpb25zLgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9ORVQgIFRoZSByZXF1ZXN0ZWQgTmV0SW5kZXggZG9lc24ndCBleGlzdAorICovCitQTk1JX1NUQVRJQyBpbnQgUG5taVZhcigKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitpbnQgQWN0aW9uLAkJLyogR0VUL1BSRVNFVC9TRVQgYWN0aW9uICovCitTS19VMzIgSWQsCQkvKiBPYmplY3QgSUQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQgKi8KK2NoYXIgKnBCdWYsCQkvKiBCdWZmZXIgdXNlZCBmb3IgdGhlIG1hbmFnZW1lbnQgZGF0YSB0cmFuc2ZlciAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBUb3RhbCBsZW5ndGggb2YgcEJ1ZiBtYW5hZ2VtZW50IGRhdGEgICovCitTS19VMzIgSW5zdGFuY2UsCS8qIEluc3RhbmNlICgxLi5uKSB0aGF0IGlzIHRvIGJlIHNldCBvciAtMSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCXVuc2lnbmVkIGludAlUYWJsZUluZGV4OworCWludAkJUmV0OworCisKKwlpZiAoKFRhYmxlSW5kZXggPSBMb29rdXBJZChJZCkpID09ICh1bnNpZ25lZCBpbnQpKC0xKSkgeworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX09JRCk7CisJfQorCQorICAgIC8qIENoZWNrIE5ldEluZGV4ICovCisJaWYgKE5ldEluZGV4ID49IHBBQy0+UmxtdC5OdW1OZXRzKSB7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9ORVQpOworCX0KKworCVNLX1BOTUlfQ0hFQ0tGTEFHUygiUG5taVZhcjogT24gY2FsbCIpOworCisJUmV0ID0gSWRUYWJsZVtUYWJsZUluZGV4XS5GdW5jKHBBQywgSW9DLCBBY3Rpb24sIElkLCBwQnVmLCBwTGVuLAorCQlJbnN0YW5jZSwgVGFibGVJbmRleCwgTmV0SW5kZXgpOworCisJU0tfUE5NSV9DSEVDS0ZMQUdTKCJQbm1pVmFyOiBPbiByZXR1cm4iKTsKKworCXJldHVybiAoUmV0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUG5taVN0cnVjdCAtIFByZXNldHMgYW5kIFNldHMgZGF0YSBpbiBzdHJ1Y3R1cmUgU0tfUE5NSV9TVFJVQ1RfREFUQQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gd2lsbCBhbHNvIGJlIHN0b3JlZCBpbgorICoJU0tfUE5NSV9TVFJVQ1RfREFUQSBpZiB0aGUgcGFzc2VkIGJ1ZmZlciBoYXMgdGhlIG1pbmltdW0gc2l6ZSBvZgorICoJU0tfUE5NSV9NSU5fU1RSVUNUX1NJWkUuIFRoZSBzdWItZnVuY3Rpb24gcnVucyB0aHJvdWdoIHRoZSBJZFRhYmxlLAorICoJY2hlY2tzIHdoaWNoIE9JRHMgYXJlIGFibGUgdG8gc2V0LCBhbmQgY2FsbHMgdGhlIGhhbmRsZXIgZnVuY3Rpb24gb2YKKyAqCXRoZSBPSUQgdG8gcGVyZm9ybSB0aGUgc2V0LiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiB3aWxsCisgKglhbHNvIGJlIHN0b3JlZCBpbiBTS19QTk1JX1NUUlVDVF9EQVRBIGlmIHRoZSBwYXNzZWQgYnVmZmVyIGhhcyB0aGUKKyAqCW1pbmltdW0gc2l6ZSBvZiBTS19QTk1JX01JTl9TVFJVQ1RfU0laRS4gVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZAorICoJYnkgU2tHZVBubWlQcmVTZXRTdHJ1Y3QgYW5kIFNrR2VQbm1pU2V0U3RydWN0LgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9YWFguIFRoZSBjb2RlcyBhcmUgZGVzY3JpYmVkIGluIHRoZSBjYWxsaW5nIGZ1bmN0aW9ucy4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fTkVUICBUaGUgcmVxdWVzdGVkIE5ldEluZGV4IGRvZXNuJ3QgZXhpc3QKKyAqLworUE5NSV9TVEFUSUMgaW50IFBubWlTdHJ1Y3QoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworaW50ICBBY3Rpb24sCS8qIFBSRVNFVC9TRVQgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZCAqLworY2hhciAqcEJ1ZiwJCS8qIEJ1ZmZlciB1c2VkIGZvciB0aGUgbWFuYWdlbWVudCBkYXRhIHRyYW5zZmVyICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIExlbmd0aCBvZiBwQnVmIG1hbmFnZW1lbnQgZGF0YSBidWZmZXIgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwlpbnQJCVJldDsKKwl1bnNpZ25lZCBpbnQJVGFibGVJbmRleDsKKwl1bnNpZ25lZCBpbnQJRHN0T2Zmc2V0OworCXVuc2lnbmVkIGludAlMZW47CisJdW5zaWduZWQgaW50CUluc3RhbmNlTm87CisJdW5zaWduZWQgaW50CUluc3RhbmNlQ250OworCVNLX1UzMgkJSW5zdGFuY2U7CisJU0tfVTMyCQlJZDsKKworCisJLyogQ2hlY2sgaWYgdGhlIHBhc3NlZCBidWZmZXIgaGFzIHRoZSByaWdodCBzaXplICovCisJaWYgKCpwTGVuIDwgU0tfUE5NSV9TVFJVQ1RfU0laRSkgeworCisJCS8qIENoZWNrIGlmIHdlIGNhbiByZXR1cm4gdGhlIGVycm9yIHdpdGhpbiB0aGUgYnVmZmVyICovCisJCWlmICgqcExlbiA+PSBTS19QTk1JX01JTl9TVFJVQ1RfU0laRSkgeworCisJCQlTS19QTk1JX1NFVF9TVEFUKHBCdWYsIFNLX1BOTUlfRVJSX1RPT19TSE9SVCwKKwkJCQkoU0tfVTMyKSgtMSkpOworCQl9CisKKwkJKnBMZW4gPSBTS19QTk1JX1NUUlVDVF9TSVpFOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJfQorCQorICAgIC8qIENoZWNrIE5ldEluZGV4ICovCisJaWYgKE5ldEluZGV4ID49IHBBQy0+UmxtdC5OdW1OZXRzKSB7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9ORVQpOworCX0KKwkKKwlTS19QTk1JX0NIRUNLRkxBR1MoIlBubWlTdHJ1Y3Q6IE9uIGNhbGwiKTsKKworCS8qCisJICogVXBkYXRlIHRoZSB2YWx1ZXMgb2YgUkxNVCBhbmQgU0lSUSBhbmQgaW5jcmVtZW50IHNlbWFwaG9yZXMgdG8KKwkgKiBpbmRpY2F0ZSB0aGF0IGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBkb25lLgorCSAqLworCWlmICgoUmV0ID0gUmxtdFVwZGF0ZShwQUMsIElvQywgTmV0SW5kZXgpKSAhPSBTS19QTk1JX0VSUl9PSykgeworCisJCVNLX1BOTUlfU0VUX1NUQVQocEJ1ZiwgUmV0LCAoU0tfVTMyKSgtMSkpOworCQkqcExlbiA9IFNLX1BOTUlfTUlOX1NUUlVDVF9TSVpFOworCQlyZXR1cm4gKFJldCk7CisJfQorCisJaWYgKChSZXQgPSBTaXJxVXBkYXRlKHBBQywgSW9DKSkgIT0gU0tfUE5NSV9FUlJfT0spIHsKKworCQlTS19QTk1JX1NFVF9TVEFUKHBCdWYsIFJldCwgKFNLX1UzMikoLTEpKTsKKwkJKnBMZW4gPSBTS19QTk1JX01JTl9TVFJVQ1RfU0laRTsKKwkJcmV0dXJuIChSZXQpOworCX0KKworCXBBQy0+UG5taS5SbG10VXBkYXRlZEZsYWcgKys7CisJcEFDLT5Qbm1pLlNpcnFVcGRhdGVkRmxhZyArKzsKKworCS8qIFByZXNldC9TZXQgdmFsdWVzICovCisJZm9yIChUYWJsZUluZGV4ID0gMDsgVGFibGVJbmRleCA8IElEX1RBQkxFX1NJWkU7IFRhYmxlSW5kZXggKyspIHsKKworCQlpZiAoKElkVGFibGVbVGFibGVJbmRleF0uQWNjZXNzICE9IFNLX1BOTUlfUlcpICYmCisJCQkoSWRUYWJsZVtUYWJsZUluZGV4XS5BY2Nlc3MgIT0gU0tfUE5NSV9XTykpIHsKKworCQkJY29udGludWU7CisJCX0KKworCQlJbnN0YW5jZU5vID0gSWRUYWJsZVtUYWJsZUluZGV4XS5JbnN0YW5jZU5vOworCQlJZCA9IElkVGFibGVbVGFibGVJbmRleF0uSWQ7CisKKwkJZm9yIChJbnN0YW5jZUNudCA9IDE7IEluc3RhbmNlQ250IDw9IEluc3RhbmNlTm87CisJCQlJbnN0YW5jZUNudCArKykgeworCisJCQlEc3RPZmZzZXQgPSBJZFRhYmxlW1RhYmxlSW5kZXhdLk9mZnNldCArCisJCQkJKEluc3RhbmNlQ250IC0gMSkgKgorCQkJCUlkVGFibGVbVGFibGVJbmRleF0uU3RydWN0U2l6ZTsKKworCQkJLyoKKwkJCSAqIEJlY2F1c2UgVlBEIG11bHRpcGxlIGluc3RhbmNlIHZhcmlhYmxlcyBhcmUKKwkJCSAqIG5vdCBzZXRhYmxlIHdlIGRvIG5vdCBuZWVkIHRvIGV2YWx1YXRlIFZQRAorCQkJICogaW5zdGFuY2VzLiBIYXZlIGEgbG9vayB0byBWUEQgaW5zdGFuY2UKKwkJCSAqIGNhbGN1bGF0aW9uIGluIFNrUG5taUdldFN0cnVjdCgpLgorCQkJICovCisJCQlJbnN0YW5jZSA9IChTS19VMzIpSW5zdGFuY2VDbnQ7CisKKwkJCS8qCisJCQkgKiBFdmFsdWF0ZSBuZWVkZWQgYnVmZmVyIGxlbmd0aAorCQkJICovCisJCQlMZW4gPSAwOworCQkJUmV0ID0gSWRUYWJsZVtUYWJsZUluZGV4XS5GdW5jKHBBQywgSW9DLAorCQkJCVNLX1BOTUlfR0VULCBJZFRhYmxlW1RhYmxlSW5kZXhdLklkLAorCQkJCU5VTEwsICZMZW4sIEluc3RhbmNlLCBUYWJsZUluZGV4LCBOZXRJbmRleCk7CisKKwkJCWlmIChSZXQgPT0gU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUKSB7CisKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChSZXQgIT0gU0tfUE5NSV9FUlJfVE9PX1NIT1JUKSB7CisKKwkJCQlwQUMtPlBubWkuUmxtdFVwZGF0ZWRGbGFnIC0tOworCQkJCXBBQy0+UG5taS5TaXJxVXBkYXRlZEZsYWcgLS07CisKKwkJCQlTS19QTk1JX0NIRUNLRkxBR1MoIlBubWlTdHJ1Y3Q6IE9uIHJldHVybiIpOworCQkJCVNLX1BOTUlfU0VUX1NUQVQocEJ1ZiwKKwkJCQkJU0tfUE5NSV9FUlJfR0VORVJBTCwgRHN0T2Zmc2V0KTsKKwkJCQkqcExlbiA9IFNLX1BOTUlfTUlOX1NUUlVDVF9TSVpFOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQl9CisJCQlpZiAoSWQgPT0gT0lEX1NLR0VfVlBEX0FDVElPTikgeworCisJCQkJc3dpdGNoICgqKHBCdWYgKyBEc3RPZmZzZXQpKSB7CisKKwkJCQljYXNlIFNLX1BOTUlfVlBEX0NSRUFURToKKwkJCQkJTGVuID0gMyArICoocEJ1ZiArIERzdE9mZnNldCArIDMpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgU0tfUE5NSV9WUERfREVMRVRFOgorCQkJCQlMZW4gPSAzOworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCUxlbiA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJLyogQ2FsbCB0aGUgT0lEIGhhbmRsZXIgZnVuY3Rpb24gKi8KKwkJCVJldCA9IElkVGFibGVbVGFibGVJbmRleF0uRnVuYyhwQUMsIElvQywgQWN0aW9uLAorCQkJCUlkVGFibGVbVGFibGVJbmRleF0uSWQsIHBCdWYgKyBEc3RPZmZzZXQsCisJCQkJJkxlbiwgSW5zdGFuY2UsIFRhYmxlSW5kZXgsIE5ldEluZGV4KTsKKworCQkJaWYgKFJldCAhPSBTS19QTk1JX0VSUl9PSykgeworCisJCQkJcEFDLT5Qbm1pLlJsbXRVcGRhdGVkRmxhZyAtLTsKKwkJCQlwQUMtPlBubWkuU2lycVVwZGF0ZWRGbGFnIC0tOworCisJCQkJU0tfUE5NSV9DSEVDS0ZMQUdTKCJQbm1pU3RydWN0OiBPbiByZXR1cm4iKTsKKwkJCQlTS19QTk1JX1NFVF9TVEFUKHBCdWYsIFNLX1BOTUlfRVJSX0JBRF9WQUxVRSwKKwkJCQkJRHN0T2Zmc2V0KTsKKwkJCQkqcExlbiA9IFNLX1BOTUlfTUlOX1NUUlVDVF9TSVpFOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwkJCX0KKwkJfQorCX0KKworCXBBQy0+UG5taS5SbG10VXBkYXRlZEZsYWcgLS07CisJcEFDLT5Qbm1pLlNpcnFVcGRhdGVkRmxhZyAtLTsKKworCVNLX1BOTUlfQ0hFQ0tGTEFHUygiUG5taVN0cnVjdDogT24gcmV0dXJuIik7CisJU0tfUE5NSV9TRVRfU1RBVChwQnVmLCBTS19QTk1JX0VSUl9PSywgKFNLX1UzMikoLTEpKTsKKwlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTG9va3VwSWQgLSBMb29rdXAgYW4gT0lEIGluIHRoZSBJZFRhYmxlCisgKgorICogRGVzY3JpcHRpb246CisgKglTY2FucyB0aGUgSWRUYWJsZSB0byBmaW5kIHRoZSB0YWJsZSBlbnRyeSBvZiBhbiBPSUQuCisgKgorICogUmV0dXJuczoKKyAqCVRoZSB0YWJsZSBpbmRleCBvciAtMSBpZiBub3QgZm91bmQuCisgKi8KK1BOTUlfU1RBVElDIGludCBMb29rdXBJZCgKK1NLX1UzMiBJZCkJCS8qIE9iamVjdCBpZGVudGlmaWVyIHRvIGJlIHNlYXJjaGVkICovCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSURfVEFCTEVfU0laRTsgaSsrKSB7CisKKwkJaWYgKElkVGFibGVbaV0uSWQgPT0gSWQpIHsKKworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisKKwlyZXR1cm4gKC0xKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogT2lkU3RydWN0IC0gSGFuZGxlciBvZiBPSURfU0tHRV9BTExfREFUQQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBPSUQgcGVyZm9ybXMgYSBHZXQvUHJlc2V0L1NldFN0cnVjdCBjYWxsIGFuZCByZXR1cm5zIGFsbCBkYXRhCisgKglpbiBhIFNLX1BOTUlfU1RSVUNUX0RBVEEgc3RydWN0dXJlLgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3QgZGF0YSAoZS5nLiBhIDMyYml0IHZhbHVlIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkLCBidXQgYSAxNiBiaXQgdmFsdWUgd2FzIHBhc3NlZCkuCisgKglTS19QTk1JX0VSUl9CQURfVkFMVUUgICAgVGhlIHBhc3NlZCB2YWx1ZSBpcyBub3QgaW4gdGhlIHZhbGlkCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgcmFuZ2UuCisgKglTS19QTk1JX0VSUl9SRUFEX09OTFkgICAgVGhlIE9JRCBpcyByZWFkLW9ubHkgYW5kIGNhbm5vdCBiZSBzZXQuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBvZiB0aGUgT0lEIGRvZXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgKGUuZy4gcG9ydCBpbnN0YW5jZSAzIG9uIGEgdHdvIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLgorICovCitQTk1JX1NUQVRJQyBpbnQgT2lkU3RydWN0KAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK2ludCBBY3Rpb24sCQkvKiBHRVQvUFJFU0VUL1NFVCBhY3Rpb24gKi8KK1NLX1UzMiBJZCwJCS8qIE9iamVjdCBJRCB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZCAqLworY2hhciAqcEJ1ZiwJCS8qIEJ1ZmZlciB1c2VkIGZvciB0aGUgbWFuYWdlbWVudCBkYXRhIHRyYW5zZmVyICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIE9uIGNhbGw6IHBCdWYgYnVmZmVyIGxlbmd0aC4gT24gcmV0dXJuOiB1c2VkIGJ1ZmZlciAqLworU0tfVTMyIEluc3RhbmNlLAkvKiBJbnN0YW5jZSAoMS4ubikgdGhhdCBpcyB0byBiZSBxdWVyaWVkIG9yIC0xICovCit1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgLyogSW5kZXggdG8gdGhlIElkIHRhYmxlICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJaWYgKElkICE9IE9JRF9TS0dFX0FMTF9EQVRBKSB7CisKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAwMywKKwkJCVNLX1BOTUlfRVJSMDAzTVNHKTsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJfQorCisJLyoKKwkgKiBDaGVjayBpbnN0YW5jZS4gV2Ugb25seSBoYW5kbGUgc2luZ2xlIGluc3RhbmNlIHZhcmlhYmxlcworCSAqLworCWlmIChJbnN0YW5jZSAhPSAoU0tfVTMyKSgtMSkgJiYgSW5zdGFuY2UgIT0gMSkgeworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QpOworCX0KKworCXN3aXRjaCAoQWN0aW9uKSB7CisKKwljYXNlIFNLX1BOTUlfR0VUOgorCQlyZXR1cm4gKFNrUG5taUdldFN0cnVjdChwQUMsIElvQywgcEJ1ZiwgcExlbiwgTmV0SW5kZXgpKTsKKworCWNhc2UgU0tfUE5NSV9QUkVTRVQ6CisJCXJldHVybiAoU2tQbm1pUHJlU2V0U3RydWN0KHBBQywgSW9DLCBwQnVmLCBwTGVuLCBOZXRJbmRleCkpOworCisJY2FzZSBTS19QTk1JX1NFVDoKKwkJcmV0dXJuIChTa1BubWlTZXRTdHJ1Y3QocEFDLCBJb0MsIHBCdWYsIHBMZW4sIE5ldEluZGV4KSk7CisJfQorCisJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAwNCwgU0tfUE5NSV9FUlIwMDRNU0cpOworCisJKnBMZW4gPSAwOworCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFBlcmZvcm0gLSBPSUQgaGFuZGxlciBvZiBPSURfU0tHRV9BQ1RJT04KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCU5vbmUuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQuCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBkYXRhIChlLmcuIGEgMzJiaXQgdmFsdWUgaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIGJ1dCBhIDE2IGJpdCB2YWx1ZSB3YXMgcGFzc2VkKS4KKyAqCVNLX1BOTUlfRVJSX0JBRF9WQUxVRSAgICBUaGUgcGFzc2VkIHZhbHVlIGlzIG5vdCBpbiB0aGUgdmFsaWQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSByYW5nZS4KKyAqCVNLX1BOTUlfRVJSX1JFQURfT05MWSAgICBUaGUgT0lEIGlzIHJlYWQtb25seSBhbmQgY2Fubm90IGJlIHNldC4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCBUaGUgcmVxdWVzdGVkIGluc3RhbmNlIG9mIHRoZSBPSUQgZG9lc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCAoZS5nLiBwb3J0IGluc3RhbmNlIDMgb24gYSB0d28gcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuCisgKi8KK1BOTUlfU1RBVElDIGludCBQZXJmb3JtKAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK2ludCBBY3Rpb24sCQkvKiBHRVQvUFJFU0VUL1NFVCBhY3Rpb24gKi8KK1NLX1UzMiBJZCwJCS8qIE9iamVjdCBJRCB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZCAqLworY2hhciAqcEJ1ZiwJCS8qIEJ1ZmZlciB1c2VkIGZvciB0aGUgbWFuYWdlbWVudCBkYXRhIHRyYW5zZmVyICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIE9uIGNhbGw6IHBCdWYgYnVmZmVyIGxlbmd0aC4gT24gcmV0dXJuOiB1c2VkIGJ1ZmZlciAqLworU0tfVTMyIEluc3RhbmNlLAkvKiBJbnN0YW5jZSAoMS4ubikgdGhhdCBpcyB0byBiZSBxdWVyaWVkIG9yIC0xICovCit1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgLyogSW5kZXggdG8gdGhlIElkIHRhYmxlICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJaW50CVJldDsKKwlTS19VMzIJQWN0aW9uT3A7CisKKworCS8qCisJICogQ2hlY2sgaW5zdGFuY2UuIFdlIG9ubHkgaGFuZGxlIHNpbmdsZSBpbnN0YW5jZSB2YXJpYWJsZXMKKwkgKi8KKwlpZiAoSW5zdGFuY2UgIT0gKFNLX1UzMikoLTEpICYmIEluc3RhbmNlICE9IDEpIHsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUKTsKKwl9CisKKwlpZiAoKnBMZW4gPCBzaXplb2YoU0tfVTMyKSkgeworCisJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwl9CisKKwkvKiBDaGVjayBpZiBhIGdldCBzaG91bGQgYmUgcGVyZm9ybWVkICovCisJaWYgKEFjdGlvbiA9PSBTS19QTk1JX0dFVCkgeworCisJCS8qIEEgZ2V0IGlzIGVhc3kuIFdlIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgdmFsdWUgKi8KKwkJQWN0aW9uT3AgPSAoU0tfVTMyKVNLX1BOTUlfQUNUX0lETEU7CisJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIEFjdGlvbk9wKTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKKwl9CisKKwkvKiBDb250aW51ZSB3aXRoIFBSRVNFVC9TRVQgYWN0aW9uICovCisJaWYgKCpwTGVuID4gc2l6ZW9mKFNLX1UzMikpIHsKKworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJfQorCisJLyogQ2hlY2sgaWYgdGhlIGNvbW1hbmQgaXMgYSBrbm93biBvbmUgKi8KKwlTS19QTk1JX1JFQURfVTMyKHBCdWYsIEFjdGlvbk9wKTsKKwlpZiAoKnBMZW4gPiBzaXplb2YoU0tfVTMyKSB8fAorCQkoQWN0aW9uT3AgIT0gU0tfUE5NSV9BQ1RfSURMRSAmJgorCQlBY3Rpb25PcCAhPSBTS19QTk1JX0FDVF9SRVNFVCAmJgorCQlBY3Rpb25PcCAhPSBTS19QTk1JX0FDVF9TRUxGVEVTVCAmJgorCQlBY3Rpb25PcCAhPSBTS19QTk1JX0FDVF9SRVNFVENOVCkpIHsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwl9CisKKwkvKiBBIHByZXNldCBlbmRzIGhlcmUgKi8KKwlpZiAoQWN0aW9uID09IFNLX1BOTUlfUFJFU0VUKSB7CisKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7CisJfQorCisJc3dpdGNoIChBY3Rpb25PcCkgeworCisJY2FzZSBTS19QTk1JX0FDVF9JRExFOgorCQkvKiBOb3RoaW5nIHRvIGRvICovCisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0FDVF9SRVNFVDoKKwkJLyoKKwkJICogUGVyZm9ybSBhIGRyaXZlciByZXNldCBvciBzb21ldGhpbmcgdGhhdCBjb21lcyBuZWFyCisJCSAqIHRvIHRoaXMuCisJCSAqLworCQlSZXQgPSBTS19EUklWRVJfUkVTRVQocEFDLCBJb0MpOworCQlpZiAoUmV0ICE9IDApIHsKKworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAwNSwKKwkJCQlTS19QTk1JX0VSUjAwNU1TRyk7CisKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfQUNUX1NFTEZURVNUOgorCQkvKgorCQkgKiBQZXJmb3JtIGEgZHJpdmVyIHNlbGZ0ZXN0IG9yIHNvbWV0aGluZyBzaW1pbGFyIHRvIHRoaXMuCisJCSAqIEN1cnJlbnRseSB0aGlzIGZlYXR1cmUgaXMgbm90IHVzZWQgYW5kIHdpbGwgcHJvYmFibHkKKwkJICogaW1wbGVtZW50ZWQgaW4gYW5vdGhlciB3YXkuCisJCSAqLworCQlSZXQgPSBTS19EUklWRVJfU0VMRlRFU1QocEFDLCBJb0MpOworCQlwQUMtPlBubWkuVGVzdFJlc3VsdCA9IFJldDsKKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfQUNUX1JFU0VUQ05UOgorCQkvKiBTZXQgYWxsIGNvdW50ZXJzIGFuZCB0aW1lc3RhbXBzIHRvIHplcm8gKi8KKwkJUmVzZXRDb3VudGVyKHBBQywgSW9DLCBOZXRJbmRleCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAwNiwKKwkJCVNLX1BOTUlfRVJSMDA2TVNHKTsKKworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCX0KKworCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNYWM4MDIzU3RhdCAtIE9JRCBoYW5kbGVyIG9mIE9JRF9HRU5fWFhYIGFuZCBPSURfODAyXzNfWFhYCisgKgorICogRGVzY3JpcHRpb246CisgKglSZXRyaWV2ZXMgdGhlIHN0YXRpc3RpYyB2YWx1ZXMgb2YgdGhlIHZpcnR1YWwgcG9ydCAobG9naWNhbAorICoJaW5kZXggMCkuIE9ubHkgc3BlY2lhbCBPSURzIG9mIE5ESVMgYXJlIGhhbmRsZWQgd2hpY2ggY29uc2lzdAorICoJb2YgYSAzMiBiaXQgaW5zdGVhZCBvZiBhIDY0IGJpdCB2YWx1ZS4gVGhlIE9JRHMgYXJlIHB1YmxpYworICoJYmVjYXVzZSBwZXJoYXBzIHNvbWUgb3RoZXIgcGxhdGZvcm0gY2FuIHVzZSB0aGVtIHRvby4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4KKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IGRhdGEgKGUuZy4gYSAzMmJpdCB2YWx1ZSBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCwgYnV0IGEgMTYgYml0IHZhbHVlIHdhcyBwYXNzZWQpLgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2Ugb2YgdGhlIE9JRCBkb2Vzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChlLmcuIHBvcnQgaW5zdGFuY2UgMyBvbiBhIHR3byBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci4KKyAqLworUE5NSV9TVEFUSUMgaW50IE1hYzgwMjNTdGF0KAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK2ludCBBY3Rpb24sCQkvKiBHRVQvUFJFU0VUL1NFVCBhY3Rpb24gKi8KK1NLX1UzMiBJZCwJCS8qIE9iamVjdCBJRCB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZCAqLworY2hhciAqcEJ1ZiwJCS8qIEJ1ZmZlciB1c2VkIGZvciB0aGUgbWFuYWdlbWVudCBkYXRhIHRyYW5zZmVyICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIE9uIGNhbGw6IHBCdWYgYnVmZmVyIGxlbmd0aC4gT24gcmV0dXJuOiB1c2VkIGJ1ZmZlciAqLworU0tfVTMyIEluc3RhbmNlLAkvKiBJbnN0YW5jZSAoMS4ubikgdGhhdCBpcyB0byBiZSBxdWVyaWVkIG9yIC0xICovCit1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwJLyogSW5kZXggdG8gdGhlIElkIHRhYmxlICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJaW50ICAgICBSZXQ7CisJU0tfVTY0ICBTdGF0VmFsOworCVNLX1UzMiAgU3RhdFZhbDMyOworCVNLX0JPT0wgSXM2NEJpdFJlcSA9IFNLX0ZBTFNFOworCisJLyoKKwkgKiBPbmx5IHRoZSBhY3RpdmUgTWFjIGlzIHJldHVybmVkCisJICovCisJaWYgKEluc3RhbmNlICE9IChTS19VMzIpKC0xKSAmJiBJbnN0YW5jZSAhPSAxKSB7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCk7CisJfQorCisJLyoKKwkgKiBDaGVjayBhY3Rpb24gdHlwZQorCSAqLworCWlmIChBY3Rpb24gIT0gU0tfUE5NSV9HRVQpIHsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfUkVBRF9PTkxZKTsKKwl9CisKKwkvKiBDaGVjayBsZW5ndGggKi8KKwlzd2l0Y2ggKElkKSB7CisKKwljYXNlIE9JRF84MDJfM19QRVJNQU5FTlRfQUREUkVTUzoKKwljYXNlIE9JRF84MDJfM19DVVJSRU5UX0FERFJFU1M6CisJCWlmICgqcExlbiA8IHNpemVvZihTS19NQUNfQUREUikpIHsKKworCQkJKnBMZW4gPSBzaXplb2YoU0tfTUFDX0FERFIpOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKyNpZm5kZWYgU0tfTkRJU182NEJJVF9DVFIKKwkJaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX1UzMikpIHsKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKworI2Vsc2UgLyogU0tfTkRJU182NEJJVF9DVFIgKi8KKworCQkvKiBmb3IgY29tcGF0aWJpbGl0eSwgYXQgbGVhc3QgMzJiaXQgYXJlIHJlcXVpcmVkIGZvciBPSUQgKi8KKwkJaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX1UzMikpIHsKKwkJCS8qCisJCQkqIGJ1dCBpbmRpY2F0ZSBoYW5kbGluZyBmb3IgNjRiaXQgdmFsdWVzLAorCQkJKiBpZiBpbnN1ZmZpY2llbnQgc3BhY2UgaXMgcHJvdmlkZWQKKwkJCSovCisJCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisKKwkJSXM2NEJpdFJlcSA9ICgqcExlbiA8IHNpemVvZihTS19VNjQpKSA/IFNLX0ZBTFNFIDogU0tfVFJVRTsKKyNlbmRpZiAvKiBTS19ORElTXzY0QklUX0NUUiAqLworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIFVwZGF0ZSBhbGwgc3RhdGlzdGljcywgYmVjYXVzZSB3ZSByZXRyaWV2ZSB2aXJ0dWFsIE1BQywgd2hpY2gKKwkgKiBjb25zaXN0cyBvZiBtdWx0aXBsZSBwaHlzaWNhbCBzdGF0aXN0aWNzIGFuZCBpbmNyZW1lbnQgc2VtYXBob3JlCisJICogdG8gaW5kaWNhdGUgdGhhdCBhbiB1cGRhdGUgd2FzIGFscmVhZHkgZG9uZS4KKwkgKi8KKwlSZXQgPSBNYWNVcGRhdGUocEFDLCBJb0MsIDAsIHBBQy0+R0luaS5HSU1hY3NGb3VuZCAtIDEpOworCWlmICggUmV0ICE9IFNLX1BOTUlfRVJSX09LKSB7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFJldCk7CisJfQorCXBBQy0+UG5taS5NYWNVcGRhdGVkRmxhZyArKzsKKworCS8qCisJICogR2V0IHZhbHVlIChNQUMgSW5kZXggMCBpZGVudGlmaWVzIHRoZSB2aXJ0dWFsIE1BQykKKwkgKi8KKwlzd2l0Y2ggKElkKSB7CisKKwljYXNlIE9JRF84MDJfM19QRVJNQU5FTlRfQUREUkVTUzoKKwkJQ29weU1hYyhwQnVmLCAmcEFDLT5BZGRyLk5ldFtOZXRJbmRleF0uUGVybWFuZW50TWFjQWRkcmVzcyk7CisJCSpwTGVuID0gc2l6ZW9mKFNLX01BQ19BRERSKTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF84MDJfM19DVVJSRU5UX0FERFJFU1M6CisJCUNvcHlNYWMocEJ1ZiwgJnBBQy0+QWRkci5OZXRbTmV0SW5kZXhdLkN1cnJlbnRNYWNBZGRyZXNzKTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfTUFDX0FERFIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVN0YXRWYWwgPSBHZXRTdGF0VmFsKHBBQywgSW9DLCAwLCBJZFRhYmxlW1RhYmxlSW5kZXhdLlBhcmFtLCBOZXRJbmRleCk7CisKKwkJLyogYnkgZGVmYXVsdCAzMmJpdCB2YWx1ZXMgYXJlIGV2YWx1YXRlZCAqLworCQlpZiAoIUlzNjRCaXRSZXEpIHsKKwkJCVN0YXRWYWwzMiA9IChTS19VMzIpU3RhdFZhbDsKKwkJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIFN0YXRWYWwzMik7CisJCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQl9CisJCWVsc2UgeworCQkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgU3RhdFZhbCk7CisJCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQl9CisJCWJyZWFrOworCX0KKworCXBBQy0+UG5taS5NYWNVcGRhdGVkRmxhZyAtLTsKKworCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNYWNQcml2YXRlU3RhdCAtIE9JRCBoYW5kbGVyIGZ1bmN0aW9uIG9mIE9JRF9TS0dFX1NUQVRfWFhYCisgKgorICogRGVzY3JpcHRpb246CisgKglSZXRyaWV2ZXMgdGhlIE1BQyBzdGF0aXN0aWMgZGF0YS4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4KKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IGRhdGEgKGUuZy4gYSAzMmJpdCB2YWx1ZSBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCwgYnV0IGEgMTYgYml0IHZhbHVlIHdhcyBwYXNzZWQpLgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2Ugb2YgdGhlIE9JRCBkb2Vzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChlLmcuIHBvcnQgaW5zdGFuY2UgMyBvbiBhIHR3byBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci4KKyAqLworUE5NSV9TVEFUSUMgaW50IE1hY1ByaXZhdGVTdGF0KAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK2ludCBBY3Rpb24sCQkvKiBHRVQvUFJFU0VUL1NFVCBhY3Rpb24gKi8KK1NLX1UzMiBJZCwJCS8qIE9iamVjdCBJRCB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZCAqLworY2hhciAqcEJ1ZiwJCS8qIEJ1ZmZlciB1c2VkIGZvciB0aGUgbWFuYWdlbWVudCBkYXRhIHRyYW5zZmVyICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIE9uIGNhbGw6IHBCdWYgYnVmZmVyIGxlbmd0aC4gT24gcmV0dXJuOiB1c2VkIGJ1ZmZlciAqLworU0tfVTMyIEluc3RhbmNlLAkvKiBJbnN0YW5jZSAoMS4ubikgdGhhdCBpcyB0byBiZSBxdWVyaWVkIG9yIC0xICovCit1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgLyogSW5kZXggdG8gdGhlIElkIHRhYmxlICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJdW5zaWduZWQgaW50CUxvZ1BvcnRNYXg7CisJdW5zaWduZWQgaW50CUxvZ1BvcnRJbmRleDsKKwl1bnNpZ25lZCBpbnQJUGh5c1BvcnRNYXg7CisJdW5zaWduZWQgaW50CUxpbWl0OworCXVuc2lnbmVkIGludAlPZmZzZXQ7CisJaW50CQkJCU1hY1R5cGU7CisJaW50CQkJCVJldDsKKwlTS19VNjQJCQlTdGF0VmFsOworCQorCQorCisJLyogQ2FsY3VsYXRlIGluc3RhbmNlIGlmIHdpc2hlZC4gTUFDIGluZGV4IDAgaXMgdGhlIHZpcnR1YWwgTUFDICovCisJUGh5c1BvcnRNYXggPSBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7CisJTG9nUG9ydE1heCA9IFNLX1BOTUlfUE9SVF9QSFlTMkxPRyhQaHlzUG9ydE1heCk7CisJCisJTWFjVHlwZSA9IHBBQy0+R0luaS5HSU1hY1R5cGU7CisKKwlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsgLyogRHVhbCBuZXQgbW9kZSAqLworCQlMb2dQb3J0TWF4LS07CisJfQorCisJaWYgKChJbnN0YW5jZSAhPSAoU0tfVTMyKSgtMSkpKSB7IC8qIE9ubHkgb25lIHNwZWNpZmljIGluc3RhbmNlIGlzIHF1ZXJpZWQgKi8KKwkJLyogQ2hlY2sgaW5zdGFuY2UgcmFuZ2UgKi8KKwkJaWYgKChJbnN0YW5jZSA8IDEpIHx8IChJbnN0YW5jZSA+IExvZ1BvcnRNYXgpKSB7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUKTsKKwkJfQorCQlMb2dQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfSU5TVDJMT0coSW5zdGFuY2UpOworCQlMaW1pdCA9IExvZ1BvcnRJbmRleCArIDE7CisJfQorCisJZWxzZSB7IC8qIEluc3RhbmNlID09IChTS19VMzIpKC0xKSwgZ2V0IGFsbCBJbnN0YW5jZXMgb2YgdGhhdCBPSUQgKi8KKworCQlMb2dQb3J0SW5kZXggPSAwOworCQlMaW1pdCA9IExvZ1BvcnRNYXg7CisJfQorCisJLyogQ2hlY2sgYWN0aW9uICovCisJaWYgKEFjdGlvbiAhPSBTS19QTk1JX0dFVCkgeworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9SRUFEX09OTFkpOworCX0KKworCS8qIENoZWNrIGxlbmd0aCAqLworCWlmICgqcExlbiA8IChMaW1pdCAtIExvZ1BvcnRJbmRleCkgKiBzaXplb2YoU0tfVTY0KSkgeworCisJCSpwTGVuID0gKExpbWl0IC0gTG9nUG9ydEluZGV4KSAqIHNpemVvZihTS19VNjQpOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJfQorCisJLyoKKwkgKiBVcGRhdGUgTUFDIHN0YXRpc3RpYyBhbmQgaW5jcmVtZW50IHNlbWFwaG9yZSB0byBpbmRpY2F0ZSB0aGF0CisJICogYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGRvbmUuCisJICovCisJUmV0ID0gTWFjVXBkYXRlKHBBQywgSW9DLCAwLCBwQUMtPkdJbmkuR0lNYWNzRm91bmQgLSAxKTsKKwlpZiAoUmV0ICE9IFNLX1BOTUlfRVJSX09LKSB7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFJldCk7CisJfQorCXBBQy0+UG5taS5NYWNVcGRhdGVkRmxhZyArKzsKKworCS8qIEdldCB2YWx1ZSAqLworCU9mZnNldCA9IDA7CisJZm9yICg7IExvZ1BvcnRJbmRleCA8IExpbWl0OyBMb2dQb3J0SW5kZXggKyspIHsKKworCQlzd2l0Y2ggKElkKSB7CisKKy8qIFhYWCBub3QgeWV0IGltcGxlbWVudGVkIGR1ZSB0byBYTUFDIHByb2JsZW1zCisJCWNhc2UgT0lEX1NLR0VfU1RBVF9UWF9VVElMOgorCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKyovCisvKiBYWFggbm90IHlldCBpbXBsZW1lbnRlZCBkdWUgdG8gWE1BQyBwcm9ibGVtcworCQljYXNlIE9JRF9TS0dFX1NUQVRfUlhfVVRJTDoKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisqLworCQljYXNlIE9JRF9TS0dFX1NUQVRfUlg6CisJCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfR01BQykgeworCQkJCVN0YXRWYWwgPQorCQkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCBMb2dQb3J0SW5kZXgsCisJCQkJCQkJICAgU0tfUE5NSV9IUlhfQlJPQURDQVNULCBOZXRJbmRleCkgKworCQkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCBMb2dQb3J0SW5kZXgsCisJCQkJCQkJICAgU0tfUE5NSV9IUlhfTVVMVElDQVNULCBOZXRJbmRleCkgKworCQkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCBMb2dQb3J0SW5kZXgsCisJCQkJCQkJICAgU0tfUE5NSV9IUlhfVU5JQ0FTVCwgTmV0SW5kZXgpICsKKwkJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgTG9nUG9ydEluZGV4LAorCQkJCQkJCSAgIFNLX1BOTUlfSFJYX1VOREVSU0laRSwgTmV0SW5kZXgpOworCQkJfQorCQkJZWxzZSB7CisJCQkJU3RhdFZhbCA9IEdldFN0YXRWYWwocEFDLCBJb0MsIExvZ1BvcnRJbmRleCwKKwkJCQkJSWRUYWJsZVtUYWJsZUluZGV4XS5QYXJhbSwgTmV0SW5kZXgpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9TVEFUX1RYOgorCQkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX0dNQUMpIHsKKwkJCQlTdGF0VmFsID0KKwkJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgTG9nUG9ydEluZGV4LAorCQkJCQkJCSAgIFNLX1BOTUlfSFRYX0JST0FEQ0FTVCwgTmV0SW5kZXgpICsKKwkJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgTG9nUG9ydEluZGV4LAorCQkJCQkJCSAgIFNLX1BOTUlfSFRYX01VTFRJQ0FTVCwgTmV0SW5kZXgpICsKKwkJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgTG9nUG9ydEluZGV4LAorCQkJCQkJCSAgIFNLX1BOTUlfSFRYX1VOSUNBU1QsIE5ldEluZGV4KTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCVN0YXRWYWwgPSBHZXRTdGF0VmFsKHBBQywgSW9DLCBMb2dQb3J0SW5kZXgsCisJCQkJCUlkVGFibGVbVGFibGVJbmRleF0uUGFyYW0sIE5ldEluZGV4KTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlTdGF0VmFsID0gR2V0U3RhdFZhbChwQUMsIElvQywgTG9nUG9ydEluZGV4LAorCQkJCUlkVGFibGVbVGFibGVJbmRleF0uUGFyYW0sIE5ldEluZGV4KTsKKwkJfQorCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmICsgT2Zmc2V0LCBTdGF0VmFsKTsKKworCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1U2NCk7CisJfQorCSpwTGVuID0gT2Zmc2V0OworCisJcEFDLT5Qbm1pLk1hY1VwZGF0ZWRGbGFnIC0tOworCisJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEFkZHIgLSBPSUQgaGFuZGxlciBmdW5jdGlvbiBvZiBPSURfU0tHRV9QSFlTX0NVUl9BRERSIGFuZCBfRkFDX0FERFIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUdldC9QcmVzZXRzL1NldHMgdGhlIGN1cnJlbnQgYW5kIGZhY3RvcnkgTUFDIGFkZHJlc3MuIFRoZSBNQUMKKyAqCWFkZHJlc3Mgb2YgdGhlIHZpcnR1YWwgcG9ydCwgd2hpY2ggaXMgcmVwb3J0ZWQgdG8gdGhlIE9TLCBtYXkKKyAqCW5vdCBiZSBjaGFuZ2VkLCBidXQgdGhlIHBoeXNpY2FsIG9uZXMuIEEgc2V0IHRvIHRoZSB2aXJ0dWFsIHBvcnQKKyAqCXdpbGwgYmUgaWdub3JlZC4gTm8gZXJyb3Igc2hvdWxkIGJlIHJlcG9ydGVkIGJlY2F1c2Ugb3RoZXJ3aXNlCisgKglhIG11bHRpcGxlIGluc3RhbmNlIHNldCAoLTEpIHdvdWxkIGFsd2F5cyBmYWlsLgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3QgZGF0YSAoZS5nLiBhIDMyYml0IHZhbHVlIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkLCBidXQgYSAxNiBiaXQgdmFsdWUgd2FzIHBhc3NlZCkuCisgKglTS19QTk1JX0VSUl9CQURfVkFMVUUgICAgVGhlIHBhc3NlZCB2YWx1ZSBpcyBub3QgaW4gdGhlIHZhbGlkCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgcmFuZ2UuCisgKglTS19QTk1JX0VSUl9SRUFEX09OTFkgICAgVGhlIE9JRCBpcyByZWFkLW9ubHkgYW5kIGNhbm5vdCBiZSBzZXQuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBvZiB0aGUgT0lEIGRvZXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgKGUuZy4gcG9ydCBpbnN0YW5jZSAzIG9uIGEgdHdvIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLgorICovCitQTk1JX1NUQVRJQyBpbnQgQWRkcigKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitpbnQgQWN0aW9uLAkJLyogR0VUL1BSRVNFVC9TRVQgYWN0aW9uICovCitTS19VMzIgSWQsCQkvKiBPYmplY3QgSUQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQgKi8KK2NoYXIgKnBCdWYsCQkvKiBCdWZmZXIgdXNlZCBmb3IgdGhlIG1hbmFnZW1lbnQgZGF0YSB0cmFuc2ZlciAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBPbiBjYWxsOiBwQnVmIGJ1ZmZlciBsZW5ndGguIE9uIHJldHVybjogdXNlZCBidWZmZXIgKi8KK1NLX1UzMiBJbnN0YW5jZSwJLyogSW5zdGFuY2UgKDEuLm4pIHRoYXQgaXMgdG8gYmUgcXVlcmllZCBvciAtMSAqLwordW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIC8qIEluZGV4IHRvIHRoZSBJZCB0YWJsZSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCWludAkJUmV0OworCXVuc2lnbmVkIGludAlMb2dQb3J0TWF4OworCXVuc2lnbmVkIGludAlQaHlzUG9ydE1heDsKKwl1bnNpZ25lZCBpbnQJTG9nUG9ydEluZGV4OworCXVuc2lnbmVkIGludAlQaHlzUG9ydEluZGV4OworCXVuc2lnbmVkIGludAlMaW1pdDsKKwl1bnNpZ25lZCBpbnQJT2Zmc2V0ID0gMDsKKworCS8qCisJICogQ2FsY3VsYXRlIGluc3RhbmNlIGlmIHdpc2hlZC4gTUFDIGluZGV4IDAgaXMgdGhlIHZpcnR1YWwKKwkgKiBNQUMuCisJICovCisJUGh5c1BvcnRNYXggPSBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7CisJTG9nUG9ydE1heCA9IFNLX1BOTUlfUE9SVF9QSFlTMkxPRyhQaHlzUG9ydE1heCk7CisKKwlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsgLyogRHVhbCBuZXQgbW9kZSAqLworCQlMb2dQb3J0TWF4LS07CisJfQorCisJaWYgKChJbnN0YW5jZSAhPSAoU0tfVTMyKSgtMSkpKSB7IC8qIE9ubHkgb25lIHNwZWNpZmljIGluc3RhbmNlIGlzIHF1ZXJpZWQgKi8KKwkJLyogQ2hlY2sgaW5zdGFuY2UgcmFuZ2UgKi8KKwkJaWYgKChJbnN0YW5jZSA8IDEpIHx8IChJbnN0YW5jZSA+IExvZ1BvcnRNYXgpKSB7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUKTsKKwkJfQorCQlMb2dQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfSU5TVDJMT0coSW5zdGFuY2UpOworCQlMaW1pdCA9IExvZ1BvcnRJbmRleCArIDE7CisJfQorCWVsc2UgeyAvKiBJbnN0YW5jZSA9PSAoU0tfVTMyKSgtMSksIGdldCBhbGwgSW5zdGFuY2VzIG9mIHRoYXQgT0lEICovCisKKwkJTG9nUG9ydEluZGV4ID0gMDsKKwkJTGltaXQgPSBMb2dQb3J0TWF4OworCX0KKworCS8qCisJICogUGVyZm9ybSBBY3Rpb24KKwkgKi8KKwlpZiAoQWN0aW9uID09IFNLX1BOTUlfR0VUKSB7CisKKwkJLyogQ2hlY2sgbGVuZ3RoICovCisJCWlmICgqcExlbiA8IChMaW1pdCAtIExvZ1BvcnRJbmRleCkgKiA2KSB7CisKKwkJCSpwTGVuID0gKExpbWl0IC0gTG9nUG9ydEluZGV4KSAqIDY7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKworCQkvKgorCQkgKiBHZXQgdmFsdWUKKwkJICovCisJCWZvciAoOyBMb2dQb3J0SW5kZXggPCBMaW1pdDsgTG9nUG9ydEluZGV4ICsrKSB7CisKKwkJCXN3aXRjaCAoSWQpIHsKKworCQkJY2FzZSBPSURfU0tHRV9QSFlTX0NVUl9BRERSOgorCQkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCQkJCQlDb3B5TWFjKHBCdWYgKyBPZmZzZXQsICZwQUMtPkFkZHIuTmV0W05ldEluZGV4XS5DdXJyZW50TWFjQWRkcmVzcyk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlQaHlzUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKHBBQywgTG9nUG9ydEluZGV4KTsKKworCQkJCQlDb3B5TWFjKHBCdWYgKyBPZmZzZXQsCisJCQkJCQkmcEFDLT5BZGRyLlBvcnRbUGh5c1BvcnRJbmRleF0uQ3VycmVudE1hY0FkZHJlc3MpOworCQkJCX0KKwkJCQlPZmZzZXQgKz0gNjsKKwkJCQlicmVhazsKKworCQkJY2FzZSBPSURfU0tHRV9QSFlTX0ZBQ19BRERSOgorCQkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCQkJCQlDb3B5TWFjKHBCdWYgKyBPZmZzZXQsCisJCQkJCQkmcEFDLT5BZGRyLk5ldFtOZXRJbmRleF0uUGVybWFuZW50TWFjQWRkcmVzcyk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlQaHlzUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKAorCQkJCQkJcEFDLCBMb2dQb3J0SW5kZXgpOworCisJCQkJCUNvcHlNYWMocEJ1ZiArIE9mZnNldCwKKwkJCQkJCSZwQUMtPkFkZHIuUG9ydFtQaHlzUG9ydEluZGV4XS5QZXJtYW5lbnRNYWNBZGRyZXNzKTsKKwkJCQl9CisJCQkJT2Zmc2V0ICs9IDY7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAwOCwKKwkJCQkJU0tfUE5NSV9FUlIwMDhNU0cpOworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQl9CisJCX0KKworCQkqcExlbiA9IE9mZnNldDsKKwl9CisJZWxzZSB7CisJCS8qCisJCSAqIFRoZSBsb2dpY2FsIE1BQyBhZGRyZXNzIG1heSBub3QgYmUgY2hhbmdlZCBvbmx5CisJCSAqIHRoZSBwaHlzaWNhbCBvbmVzCisJCSAqLworCQlpZiAoSWQgPT0gT0lEX1NLR0VfUEhZU19GQUNfQUREUikgeworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1JFQURfT05MWSk7CisJCX0KKworCQkvKgorCQkgKiBPbmx5IHRoZSBjdXJyZW50IGFkZHJlc3MgbWF5IGJlIGNoYW5nZWQKKwkJICovCisJCWlmIChJZCAhPSBPSURfU0tHRV9QSFlTX0NVUl9BRERSKSB7CisKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMDksCisJCQkJU0tfUE5NSV9FUlIwMDlNU0cpOworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisKKwkJLyogQ2hlY2sgbGVuZ3RoICovCisJCWlmICgqcExlbiA8IChMaW1pdCAtIExvZ1BvcnRJbmRleCkgKiA2KSB7CisKKwkJCSpwTGVuID0gKExpbWl0IC0gTG9nUG9ydEluZGV4KSAqIDY7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJaWYgKCpwTGVuID4gKExpbWl0IC0gTG9nUG9ydEluZGV4KSAqIDYpIHsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCQl9CisKKwkJLyoKKwkJICogQ2hlY2sgQWN0aW9uCisJCSAqLworCQlpZiAoQWN0aW9uID09IFNLX1BOTUlfUFJFU0VUKSB7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworCQl9CisKKwkJLyoKKwkJICogU2V0IE9JRF9TS0dFX01BQ19DVVJfQUREUgorCQkgKi8KKwkJZm9yICg7IExvZ1BvcnRJbmRleCA8IExpbWl0OyBMb2dQb3J0SW5kZXggKyssIE9mZnNldCArPSA2KSB7CisKKwkJCS8qCisJCQkgKiBBIHNldCB0byB2aXJ0dWFsIHBvcnQgYW5kIHNldCBvZiBicm9hZGNhc3QKKwkJCSAqIGFkZHJlc3Mgd2lsbCBiZSBpZ25vcmVkCisJCQkgKi8KKwkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCB8fCBTS19NRU1DTVAocEJ1ZiArIE9mZnNldCwKKwkJCQkiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIiwgNikgPT0gMCkgeworCisJCQkJY29udGludWU7CisJCQl9CisKKwkJCVBoeXNQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMocEFDLAorCQkJCUxvZ1BvcnRJbmRleCk7CisKKwkJCVJldCA9IFNrQWRkck92ZXJyaWRlKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCShTS19NQUNfQUREUiAqKShwQnVmICsgT2Zmc2V0KSwKKwkJCQkoTG9nUG9ydEluZGV4ID09IDAgPyBTS19BRERSX1ZJUlRVQUxfQUREUkVTUyA6CisJCQkJU0tfQUREUl9QSFlTSUNBTF9BRERSRVNTKSk7CisJCQlpZiAoUmV0ICE9IFNLX0FERFJfT1ZFUlJJREVfU1VDQ0VTUykgeworCisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCX0KKwkJfQorCQkqcExlbiA9IE9mZnNldDsKKwl9CisKKwlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ3N1bVN0YXQgLSBPSUQgaGFuZGxlciBmdW5jdGlvbiBvZiBPSURfU0tHRV9DSEtTTV9YWFgKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVJldHJpZXZlcyB0aGUgc3RhdGlzdGljIHZhbHVlcyBvZiB0aGUgQ1NVTSBtb2R1bGUuIFRoZSBDU1VNIGRhdGEKKyAqCXN0cnVjdHVyZSBtdXN0IGJlIGF2YWlsYWJsZSBpbiB0aGUgU0tfQUMgZXZlbiBpZiB0aGUgQ1NVTSBtb2R1bGUKKyAqCWlzIG5vdCBpbmNsdWRlZCwgYmVjYXVzZSBQTk1JIHJlYWRzIHRoZSBzdGF0aXN0aWMgZGF0YSBmcm9tIHRoZQorICoJQ1NVTSBwYXJ0IG9mIFNLX0FDIGRpcmVjdGx5LgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3QgZGF0YSAoZS5nLiBhIDMyYml0IHZhbHVlIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkLCBidXQgYSAxNiBiaXQgdmFsdWUgd2FzIHBhc3NlZCkuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBvZiB0aGUgT0lEIGRvZXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgKGUuZy4gcG9ydCBpbnN0YW5jZSAzIG9uIGEgdHdvIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLgorICovCitQTk1JX1NUQVRJQyBpbnQgQ3N1bVN0YXQoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworaW50IEFjdGlvbiwJCS8qIEdFVC9QUkVTRVQvU0VUIGFjdGlvbiAqLworU0tfVTMyIElkLAkJLyogT2JqZWN0IElEIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkICovCitjaGFyICpwQnVmLAkJLyogQnVmZmVyIHVzZWQgZm9yIHRoZSBtYW5hZ2VtZW50IGRhdGEgdHJhbnNmZXIgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogT24gY2FsbDogcEJ1ZiBidWZmZXIgbGVuZ3RoLiBPbiByZXR1cm46IHVzZWQgYnVmZmVyICovCitTS19VMzIgSW5zdGFuY2UsCS8qIEluc3RhbmNlICgxLi5uKSB0aGF0IGlzIHRvIGJlIHF1ZXJpZWQgb3IgLTEgKi8KK3Vuc2lnbmVkIGludCBUYWJsZUluZGV4LCAvKiBJbmRleCB0byB0aGUgSWQgdGFibGUgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwl1bnNpZ25lZCBpbnQJSW5kZXg7CisJdW5zaWduZWQgaW50CUxpbWl0OworCXVuc2lnbmVkIGludAlPZmZzZXQgPSAwOworCVNLX1U2NAkJU3RhdFZhbDsKKworCisJLyoKKwkgKiBDYWxjdWxhdGUgaW5zdGFuY2UgaWYgd2lzaGVkCisJICovCisJaWYgKEluc3RhbmNlICE9IChTS19VMzIpKC0xKSkgeworCisJCWlmICgoSW5zdGFuY2UgPCAxKSB8fCAoSW5zdGFuY2UgPiBTS0NTX05VTV9QUk9UT0NPTFMpKSB7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUKTsKKwkJfQorCQlJbmRleCA9ICh1bnNpZ25lZCBpbnQpSW5zdGFuY2UgLSAxOworCQlMaW1pdCA9IEluZGV4ICsgMTsKKwl9CisJZWxzZSB7CisJCUluZGV4ID0gMDsKKwkJTGltaXQgPSBTS0NTX05VTV9QUk9UT0NPTFM7CisJfQorCisJLyoKKwkgKiBDaGVjayBhY3Rpb24KKwkgKi8KKwlpZiAoQWN0aW9uICE9IFNLX1BOTUlfR0VUKSB7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1JFQURfT05MWSk7CisJfQorCisJLyogQ2hlY2sgbGVuZ3RoICovCisJaWYgKCpwTGVuIDwgKExpbWl0IC0gSW5kZXgpICogc2l6ZW9mKFNLX1U2NCkpIHsKKworCQkqcExlbiA9IChMaW1pdCAtIEluZGV4KSAqIHNpemVvZihTS19VNjQpOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJfQorCisJLyoKKwkgKiBHZXQgdmFsdWUKKwkgKi8KKwlmb3IgKDsgSW5kZXggPCBMaW1pdDsgSW5kZXggKyspIHsKKworCQlzd2l0Y2ggKElkKSB7CisKKwkJY2FzZSBPSURfU0tHRV9DSEtTTV9SWF9PS19DVFM6CisJCQlTdGF0VmFsID0gcEFDLT5Dc3VtLlByb3RvU3RhdHNbTmV0SW5kZXhdW0luZGV4XS5SeE9rQ3RzOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9DSEtTTV9SWF9VTkFCTEVfQ1RTOgorCQkJU3RhdFZhbCA9IHBBQy0+Q3N1bS5Qcm90b1N0YXRzW05ldEluZGV4XVtJbmRleF0uUnhVbmFibGVDdHM7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX0NIS1NNX1JYX0VSUl9DVFM6CisJCQlTdGF0VmFsID0gcEFDLT5Dc3VtLlByb3RvU3RhdHNbTmV0SW5kZXhdW0luZGV4XS5SeEVyckN0czsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfQ0hLU01fVFhfT0tfQ1RTOgorCQkJU3RhdFZhbCA9IHBBQy0+Q3N1bS5Qcm90b1N0YXRzW05ldEluZGV4XVtJbmRleF0uVHhPa0N0czsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfQ0hLU01fVFhfVU5BQkxFX0NUUzoKKwkJCVN0YXRWYWwgPSBwQUMtPkNzdW0uUHJvdG9TdGF0c1tOZXRJbmRleF1bSW5kZXhdLlR4VW5hYmxlQ3RzOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMTAsCisJCQkJU0tfUE5NSV9FUlIwMTBNU0cpOworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisKKwkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiArIE9mZnNldCwgU3RhdFZhbCk7CisJCU9mZnNldCArPSBzaXplb2YoU0tfVTY0KTsKKwl9CisKKwkvKgorCSAqIFN0b3JlIHVzZWQgYnVmZmVyIHNwYWNlCisJICovCisJKnBMZW4gPSBPZmZzZXQ7CisKKwlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2Vuc29yU3RhdCAtIE9JRCBoYW5kbGVyIGZ1bmN0aW9uIG9mIE9JRF9TS0dFX1NFTlNPUl9YWFgKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVJldHJpZXZlcyB0aGUgc3RhdGlzdGljIHZhbHVlcyBvZiB0aGUgSTJDIG1vZHVsZSwgd2hpY2ggaGFuZGxlcworICoJdGhlIHRlbXBlcmF0dXJlIGFuZCB2b2x0YWdlIHNlbnNvcnMuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQuCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBkYXRhIChlLmcuIGEgMzJiaXQgdmFsdWUgaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIGJ1dCBhIDE2IGJpdCB2YWx1ZSB3YXMgcGFzc2VkKS4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCBUaGUgcmVxdWVzdGVkIGluc3RhbmNlIG9mIHRoZSBPSUQgZG9lc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCAoZS5nLiBwb3J0IGluc3RhbmNlIDMgb24gYSB0d28gcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuCisgKi8KK1BOTUlfU1RBVElDIGludCBTZW5zb3JTdGF0KAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK2ludCBBY3Rpb24sCQkvKiBHRVQvUFJFU0VUL1NFVCBhY3Rpb24gKi8KK1NLX1UzMiBJZCwJCS8qIE9iamVjdCBJRCB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZCAqLworY2hhciAqcEJ1ZiwJCS8qIEJ1ZmZlciB1c2VkIGZvciB0aGUgbWFuYWdlbWVudCBkYXRhIHRyYW5zZmVyICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIE9uIGNhbGw6IHBCdWYgYnVmZmVyIGxlbmd0aC4gT24gcmV0dXJuOiB1c2VkIGJ1ZmZlciAqLworU0tfVTMyIEluc3RhbmNlLAkvKiBJbnN0YW5jZSAoMS4ubikgdGhhdCBpcyB0byBiZSBxdWVyaWVkIG9yIC0xICovCit1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgLyogSW5kZXggdG8gdGhlIElkIHRhYmxlICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJdW5zaWduZWQgaW50CWk7CisJdW5zaWduZWQgaW50CUluZGV4OworCXVuc2lnbmVkIGludAlMaW1pdDsKKwl1bnNpZ25lZCBpbnQJT2Zmc2V0OworCXVuc2lnbmVkIGludAlMZW47CisJU0tfVTMyCQlWYWwzMjsKKwlTS19VNjQJCVZhbDY0OworCisKKwkvKgorCSAqIENhbGN1bGF0ZSBpbnN0YW5jZSBpZiB3aXNoZWQKKwkgKi8KKwlpZiAoKEluc3RhbmNlICE9IChTS19VMzIpKC0xKSkpIHsKKworCQlpZiAoKEluc3RhbmNlIDwgMSkgfHwgKEluc3RhbmNlID4gKFNLX1UzMilwQUMtPkkyYy5NYXhTZW5zKSkgeworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCk7CisJCX0KKworCQlJbmRleCA9ICh1bnNpZ25lZCBpbnQpSW5zdGFuY2UgLTE7CisJCUxpbWl0ID0gKHVuc2lnbmVkIGludClJbnN0YW5jZTsKKwl9CisJZWxzZSB7CisJCUluZGV4ID0gMDsKKwkJTGltaXQgPSAodW5zaWduZWQgaW50KSBwQUMtPkkyYy5NYXhTZW5zOworCX0KKworCS8qCisJICogQ2hlY2sgYWN0aW9uCisJICovCisJaWYgKEFjdGlvbiAhPSBTS19QTk1JX0dFVCkgeworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9SRUFEX09OTFkpOworCX0KKworCS8qIENoZWNrIGxlbmd0aCAqLworCXN3aXRjaCAoSWQpIHsKKworCWNhc2UgT0lEX1NLR0VfU0VOU09SX1ZBTFVFOgorCWNhc2UgT0lEX1NLR0VfU0VOU09SX1dBUl9USFJFU19MT1c6CisJY2FzZSBPSURfU0tHRV9TRU5TT1JfV0FSX1RIUkVTX1VQUDoKKwljYXNlIE9JRF9TS0dFX1NFTlNPUl9FUlJfVEhSRVNfTE9XOgorCWNhc2UgT0lEX1NLR0VfU0VOU09SX0VSUl9USFJFU19VUFA6CisJCWlmICgqcExlbiA8IChMaW1pdCAtIEluZGV4KSAqIHNpemVvZihTS19VMzIpKSB7CisKKwkJCSpwTGVuID0gKExpbWl0IC0gSW5kZXgpICogc2l6ZW9mKFNLX1UzMik7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1NFTlNPUl9ERVNDUjoKKwkJZm9yIChPZmZzZXQgPSAwLCBpID0gSW5kZXg7IGkgPCBMaW1pdDsgaSArKykgeworCisJCQlMZW4gPSAodW5zaWduZWQgaW50KQorCQkJCVNLX1NUUkxFTihwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5EZXNjKSArIDE7CisJCQlpZiAoTGVuID49IFNLX1BOTUlfU1RSSU5HTEVOMikgeworCisJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAxMSwKKwkJCQkJU0tfUE5NSV9FUlIwMTFNU0cpOworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQl9CisJCQlPZmZzZXQgKz0gTGVuOworCQl9CisJCWlmICgqcExlbiA8IE9mZnNldCkgeworCisJCQkqcExlbiA9IE9mZnNldDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfU0VOU09SX0lOREVYOgorCWNhc2UgT0lEX1NLR0VfU0VOU09SX1RZUEU6CisJY2FzZSBPSURfU0tHRV9TRU5TT1JfU1RBVFVTOgorCQlpZiAoKnBMZW4gPCBMaW1pdCAtIEluZGV4KSB7CisKKwkJCSpwTGVuID0gTGltaXQgLSBJbmRleDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfU0VOU09SX1dBUl9DVFM6CisJY2FzZSBPSURfU0tHRV9TRU5TT1JfV0FSX1RJTUU6CisJY2FzZSBPSURfU0tHRV9TRU5TT1JfRVJSX0NUUzoKKwljYXNlIE9JRF9TS0dFX1NFTlNPUl9FUlJfVElNRToKKwkJaWYgKCpwTGVuIDwgKExpbWl0IC0gSW5kZXgpICogc2l6ZW9mKFNLX1U2NCkpIHsKKworCQkJKnBMZW4gPSAoTGltaXQgLSBJbmRleCkgKiBzaXplb2YoU0tfVTY0KTsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMTIsCisJCQlTS19QTk1JX0VSUjAxMk1TRyk7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCisJfQorCisJLyoKKwkgKiBHZXQgdmFsdWUKKwkgKi8KKwlmb3IgKE9mZnNldCA9IDA7IEluZGV4IDwgTGltaXQ7IEluZGV4ICsrKSB7CisKKwkJc3dpdGNoIChJZCkgeworCisJCWNhc2UgT0lEX1NLR0VfU0VOU09SX0lOREVYOgorCQkJKihwQnVmICsgT2Zmc2V0KSA9IChjaGFyKUluZGV4OworCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfU0VOU09SX0RFU0NSOgorCQkJTGVuID0gU0tfU1RSTEVOKHBBQy0+STJjLlNlblRhYmxlW0luZGV4XS5TZW5EZXNjKTsKKwkJCVNLX01FTUNQWShwQnVmICsgT2Zmc2V0ICsgMSwKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtJbmRleF0uU2VuRGVzYywgTGVuKTsKKwkJCSoocEJ1ZiArIE9mZnNldCkgPSAoY2hhcilMZW47CisJCQlPZmZzZXQgKz0gTGVuICsgMTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfU0VOU09SX1RZUEU6CisJCQkqKHBCdWYgKyBPZmZzZXQpID0KKwkJCQkoY2hhcilwQUMtPkkyYy5TZW5UYWJsZVtJbmRleF0uU2VuVHlwZTsKKwkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1NFTlNPUl9WQUxVRToKKwkJCVZhbDMyID0gKFNLX1UzMilwQUMtPkkyYy5TZW5UYWJsZVtJbmRleF0uU2VuVmFsdWU7CisJCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmICsgT2Zmc2V0LCBWYWwzMik7CisJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1UzMik7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1NFTlNPUl9XQVJfVEhSRVNfTE9XOgorCQkJVmFsMzIgPSAoU0tfVTMyKXBBQy0+STJjLlNlblRhYmxlW0luZGV4XS4KKwkJCQlTZW5UaHJlV2FybkxvdzsKKwkJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYgKyBPZmZzZXQsIFZhbDMyKTsKKwkJCU9mZnNldCArPSBzaXplb2YoU0tfVTMyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfU0VOU09SX1dBUl9USFJFU19VUFA6CisJCQlWYWwzMiA9IChTS19VMzIpcEFDLT5JMmMuU2VuVGFibGVbSW5kZXhdLgorCQkJCVNlblRocmVXYXJuSGlnaDsKKwkJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYgKyBPZmZzZXQsIFZhbDMyKTsKKwkJCU9mZnNldCArPSBzaXplb2YoU0tfVTMyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfU0VOU09SX0VSUl9USFJFU19MT1c6CisJCQlWYWwzMiA9IChTS19VMzIpcEFDLT5JMmMuU2VuVGFibGVbSW5kZXhdLgorCQkJCVNlblRocmVFcnJMb3c7CisJCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmICsgT2Zmc2V0LCBWYWwzMik7CisJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1UzMik7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1NFTlNPUl9FUlJfVEhSRVNfVVBQOgorCQkJVmFsMzIgPSBwQUMtPkkyYy5TZW5UYWJsZVtJbmRleF0uU2VuVGhyZUVyckhpZ2g7CisJCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmICsgT2Zmc2V0LCBWYWwzMik7CisJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1UzMik7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1NFTlNPUl9TVEFUVVM6CisJCQkqKHBCdWYgKyBPZmZzZXQpID0KKwkJCQkoY2hhcilwQUMtPkkyYy5TZW5UYWJsZVtJbmRleF0uU2VuRXJyRmxhZzsKKwkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1NFTlNPUl9XQVJfQ1RTOgorCQkJVmFsNjQgPSBwQUMtPkkyYy5TZW5UYWJsZVtJbmRleF0uU2VuV2FybkN0czsKKwkJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYgKyBPZmZzZXQsIFZhbDY0KTsKKwkJCU9mZnNldCArPSBzaXplb2YoU0tfVTY0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfU0VOU09SX0VSUl9DVFM6CisJCQlWYWw2NCA9IHBBQy0+STJjLlNlblRhYmxlW0luZGV4XS5TZW5FcnJDdHM7CisJCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmICsgT2Zmc2V0LCBWYWw2NCk7CisJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1U2NCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1NFTlNPUl9XQVJfVElNRToKKwkJCVZhbDY0ID0gU0tfUE5NSV9IVU5EUkVEU19TRUMocEFDLT5JMmMuU2VuVGFibGVbSW5kZXhdLgorCQkJCVNlbkJlZ1dhcm5UUyk7CisJCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmICsgT2Zmc2V0LCBWYWw2NCk7CisJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1U2NCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1NFTlNPUl9FUlJfVElNRToKKwkJCVZhbDY0ID0gU0tfUE5NSV9IVU5EUkVEU19TRUMocEFDLT5JMmMuU2VuVGFibGVbSW5kZXhdLgorCQkJCVNlbkJlZ0VyclRTKTsKKwkJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYgKyBPZmZzZXQsIFZhbDY0KTsKKwkJCU9mZnNldCArPSBzaXplb2YoU0tfVTY0KTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9FUlIsCisJCQkJKCJTZW5zb3JTdGF0OiBVbmtub3duIE9JRCBzaG91bGQgYmUgaGFuZGxlZCBiZWZvcmUiKSk7CisKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKwl9CisKKwkvKgorCSAqIFN0b3JlIHVzZWQgYnVmZmVyIHNwYWNlCisJICovCisJKnBMZW4gPSBPZmZzZXQ7CisKKwlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVnBkIC0gT0lEIGhhbmRsZXIgZnVuY3Rpb24gb2YgT0lEX1NLR0VfVlBEX1hYWAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJR2V0L3ByZXNldC9zZXQgb2YgVlBEIGRhdGEuIEFzIGluc3RhbmNlIHRoZSBuYW1lIG9mIGEgVlBEIGtleQorICoJY2FuIGJlIHBhc3NlZC4gVGhlIEluc3RhbmNlIHBhcmFtZXRlciBpcyBhIFNLX1UzMiBhbmQgY2FuIGJlCisgKgl1c2VkIGFzIGEgc3RyaW5nIGJ1ZmZlciBmb3IgdGhlIFZQRCBrZXksIGJlY2F1c2UgdGhlaXIgbWF4aW11bQorICoJbGVuZ3RoIGlzIDQgYnl0ZS4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4KKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IGRhdGEgKGUuZy4gYSAzMmJpdCB2YWx1ZSBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCwgYnV0IGEgMTYgYml0IHZhbHVlIHdhcyBwYXNzZWQpLgorICoJU0tfUE5NSV9FUlJfQkFEX1ZBTFVFICAgIFRoZSBwYXNzZWQgdmFsdWUgaXMgbm90IGluIHRoZSB2YWxpZAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHJhbmdlLgorICoJU0tfUE5NSV9FUlJfUkVBRF9PTkxZICAgIFRoZSBPSUQgaXMgcmVhZC1vbmx5IGFuZCBjYW5ub3QgYmUgc2V0LgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2Ugb2YgdGhlIE9JRCBkb2Vzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChlLmcuIHBvcnQgaW5zdGFuY2UgMyBvbiBhIHR3byBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci4KKyAqLworUE5NSV9TVEFUSUMgaW50IFZwZCgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitpbnQgQWN0aW9uLAkJLyogR0VUL1BSRVNFVC9TRVQgYWN0aW9uICovCitTS19VMzIgSWQsCQkvKiBPYmplY3QgSUQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQgKi8KK2NoYXIgKnBCdWYsCQkvKiBCdWZmZXIgdXNlZCBmb3IgdGhlIG1hbmFnZW1lbnQgZGF0YSB0cmFuc2ZlciAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBPbiBjYWxsOiBwQnVmIGJ1ZmZlciBsZW5ndGguIE9uIHJldHVybjogdXNlZCBidWZmZXIgKi8KK1NLX1UzMiBJbnN0YW5jZSwJLyogSW5zdGFuY2UgKDEuLm4pIHRoYXQgaXMgdG8gYmUgcXVlcmllZCBvciAtMSAqLwordW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIC8qIEluZGV4IHRvIHRoZSBJZCB0YWJsZSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCVNLX1ZQRF9TVEFUVVMJKnBWcGRTdGF0dXM7CisJdW5zaWduZWQgaW50CUJ1ZkxlbjsKKwljaGFyCQlCdWZbMjU2XTsKKwljaGFyCQlLZXlBcnJbU0tfUE5NSV9WUERfRU5UUklFU11bU0tfUE5NSV9WUERfS0VZX1NJWkVdOworCWNoYXIJCUtleVN0cltTS19QTk1JX1ZQRF9LRVlfU0laRV07CisJdW5zaWduZWQgaW50CUtleU5vOworCXVuc2lnbmVkIGludAlPZmZzZXQ7CisJdW5zaWduZWQgaW50CUluZGV4OworCXVuc2lnbmVkIGludAlGaXJzdEluZGV4OworCXVuc2lnbmVkIGludAlMYXN0SW5kZXg7CisJdW5zaWduZWQgaW50CUxlbjsKKwlpbnQJCVJldDsKKwlTS19VMzIJCVZhbDMyOworCisJLyoKKwkgKiBHZXQgYXJyYXkgb2YgYWxsIGN1cnJlbnRseSBzdG9yZWQgVlBEIGtleXMKKwkgKi8KKwlSZXQgPSBHZXRWcGRLZXlBcnIocEFDLCBJb0MsICZLZXlBcnJbMF1bMF0sIHNpemVvZihLZXlBcnIpLCAmS2V5Tm8pOworCWlmIChSZXQgIT0gU0tfUE5NSV9FUlJfT0spIHsKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFJldCk7CisJfQorCisJLyoKKwkgKiBJZiBpbnN0YW5jZSBpcyBub3QgLTEsIHRyeSB0byBmaW5kIHRoZSByZXF1ZXN0ZWQgVlBEIGtleSBmb3IKKwkgKiB0aGUgbXVsdGlwbGUgaW5zdGFuY2UgdmFyaWFibGVzLiBUaGUgb3RoZXIgT0lEcyBhcyBmb3IgZXhhbXBsZQorCSAqIE9JRCBWUERfQUNUSU9OIGFyZSBzaW5nbGUgaW5zdGFuY2UgdmFyaWFibGVzIGFuZCBtdXN0IGJlCisJICogaGFuZGxlZCBzZXBhcmF0bHkuCisJICovCisJRmlyc3RJbmRleCA9IDA7CisJTGFzdEluZGV4ID0gS2V5Tm87CisKKwlpZiAoKEluc3RhbmNlICE9IChTS19VMzIpKC0xKSkpIHsKKworCQlpZiAoSWQgPT0gT0lEX1NLR0VfVlBEX0tFWSB8fCBJZCA9PSBPSURfU0tHRV9WUERfVkFMVUUgfHwKKwkJCUlkID09IE9JRF9TS0dFX1ZQRF9BQ0NFU1MpIHsKKworCQkJU0tfU1RSTkNQWShLZXlTdHIsIChjaGFyICopJkluc3RhbmNlLCA0KTsKKwkJCUtleVN0cls0XSA9IDA7CisKKwkJCWZvciAoSW5kZXggPSAwOyBJbmRleCA8IEtleU5vOyBJbmRleCArKykgeworCisJCQkJaWYgKFNLX1NUUkNNUChLZXlTdHIsIEtleUFycltJbmRleF0pID09IDApIHsKKwkJCQkJRmlyc3RJbmRleCA9IEluZGV4OworCQkJCQlMYXN0SW5kZXggPSBJbmRleCsxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoSW5kZXggPT0gS2V5Tm8pIHsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoSW5zdGFuY2UgIT0gMSkgeworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCk7CisJCX0KKwl9CisKKwkvKgorCSAqIEdldCB2YWx1ZSwgaWYgYSBxdWVyeSBzaG91bGQgYmUgcGVyZm9ybWVkCisJICovCisJaWYgKEFjdGlvbiA9PSBTS19QTk1JX0dFVCkgeworCisJCXN3aXRjaCAoSWQpIHsKKworCQljYXNlIE9JRF9TS0dFX1ZQRF9GUkVFX0JZVEVTOgorCQkJLyogQ2hlY2sgbGVuZ3RoIG9mIGJ1ZmZlciAqLworCQkJaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX1UzMikpIHsKKworCQkJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQkJfQorCQkJLyogR2V0IG51bWJlciBvZiBmcmVlIGJ5dGVzICovCisJCQlwVnBkU3RhdHVzID0gVnBkU3RhdChwQUMsIElvQyk7CisJCQlpZiAocFZwZFN0YXR1cyA9PSBOVUxMKSB7CisKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDE3LAorCQkJCQlTS19QTk1JX0VSUjAxN01TRyk7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCX0KKwkJCWlmICgocFZwZFN0YXR1cy0+dnBkX3N0YXR1cyAmIFZQRF9WQUxJRCkgPT0gMCkgeworCisJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAxOCwKKwkJCQkJU0tfUE5NSV9FUlIwMThNU0cpOworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQl9CisJCQkKKwkJCVZhbDMyID0gKFNLX1UzMilwVnBkU3RhdHVzLT52cGRfZnJlZV9ydzsKKwkJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIFZhbDMyKTsKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1ZQRF9FTlRSSUVTX0xJU1Q6CisJCQkvKiBDaGVjayBsZW5ndGggKi8KKwkJCWZvciAoTGVuID0gMCwgSW5kZXggPSAwOyBJbmRleCA8IEtleU5vOyBJbmRleCArKykgeworCisJCQkJTGVuICs9IFNLX1NUUkxFTihLZXlBcnJbSW5kZXhdKSArIDE7CisJCQl9CisJCQlpZiAoKnBMZW4gPCBMZW4pIHsKKworCQkJCSpwTGVuID0gTGVuOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJCX0KKworCQkJLyogR2V0IHZhbHVlICovCisJCQkqKHBCdWYpID0gKGNoYXIpTGVuIC0gMTsKKwkJCWZvciAoT2Zmc2V0ID0gMSwgSW5kZXggPSAwOyBJbmRleCA8IEtleU5vOyBJbmRleCArKykgeworCisJCQkJTGVuID0gU0tfU1RSTEVOKEtleUFycltJbmRleF0pOworCQkJCVNLX01FTUNQWShwQnVmICsgT2Zmc2V0LCBLZXlBcnJbSW5kZXhdLCBMZW4pOworCisJCQkJT2Zmc2V0ICs9IExlbjsKKworCQkJCWlmIChJbmRleCA8IEtleU5vIC0gMSkgeworCisJCQkJCSoocEJ1ZiArIE9mZnNldCkgPSAnICc7CisJCQkJCU9mZnNldCArKzsKKwkJCQl9CisJCQl9CisJCQkqcExlbiA9IE9mZnNldDsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfVlBEX0VOVFJJRVNfTlVNQkVSOgorCQkJLyogQ2hlY2sgbGVuZ3RoICovCisJCQlpZiAoKnBMZW4gPCBzaXplb2YoU0tfVTMyKSkgeworCisJCQkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCQl9CisKKwkJCVZhbDMyID0gKFNLX1UzMilLZXlObzsKKwkJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIFZhbDMyKTsKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1ZQRF9LRVk6CisJCQkvKiBDaGVjayBidWZmZXIgbGVuZ3RoLCBpZiBpdCBpcyBsYXJnZSBlbm91Z2ggKi8KKwkJCWZvciAoTGVuID0gMCwgSW5kZXggPSBGaXJzdEluZGV4OworCQkJCUluZGV4IDwgTGFzdEluZGV4OyBJbmRleCArKykgeworCisJCQkJTGVuICs9IFNLX1NUUkxFTihLZXlBcnJbSW5kZXhdKSArIDE7CisJCQl9CisJCQlpZiAoKnBMZW4gPCBMZW4pIHsKKworCQkJCSpwTGVuID0gTGVuOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIEdldCB0aGUga2V5IHRvIGFuIGludGVybWVkaWF0ZSBidWZmZXIsIGJlY2F1c2UKKwkJCSAqIHdlIGhhdmUgdG8gcHJlcGVuZCBhIGxlbmd0aCBieXRlLgorCQkJICovCisJCQlmb3IgKE9mZnNldCA9IDAsIEluZGV4ID0gRmlyc3RJbmRleDsKKwkJCQlJbmRleCA8IExhc3RJbmRleDsgSW5kZXggKyspIHsKKworCQkJCUxlbiA9IFNLX1NUUkxFTihLZXlBcnJbSW5kZXhdKTsKKworCQkJCSoocEJ1ZiArIE9mZnNldCkgPSAoY2hhcilMZW47CisJCQkJU0tfTUVNQ1BZKHBCdWYgKyBPZmZzZXQgKyAxLCBLZXlBcnJbSW5kZXhdLAorCQkJCQlMZW4pOworCQkJCU9mZnNldCArPSBMZW4gKyAxOworCQkJfQorCQkJKnBMZW4gPSBPZmZzZXQ7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1ZQRF9WQUxVRToKKwkJCS8qIENoZWNrIHRoZSBidWZmZXIgbGVuZ3RoIGlmIGl0IGlzIGxhcmdlIGVub3VnaCAqLworCQkJZm9yIChPZmZzZXQgPSAwLCBJbmRleCA9IEZpcnN0SW5kZXg7CisJCQkJSW5kZXggPCBMYXN0SW5kZXg7IEluZGV4ICsrKSB7CisKKwkJCQlCdWZMZW4gPSAyNTY7CisJCQkJaWYgKFZwZFJlYWQocEFDLCBJb0MsIEtleUFycltJbmRleF0sIEJ1ZiwKKwkJCQkJKGludCAqKSZCdWZMZW4pID4gMCB8fAorCQkJCQlCdWZMZW4gPj0gU0tfUE5NSV9WUERfREFUQUxFTikgeworCisJCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywKKwkJCQkJCVNLX1BOTUlfRVJSMDIxLAorCQkJCQkJU0tfUE5NSV9FUlIwMjFNU0cpOworCisJCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQkJfQorCQkJCU9mZnNldCArPSBCdWZMZW4gKyAxOworCQkJfQorCQkJaWYgKCpwTGVuIDwgT2Zmc2V0KSB7CisKKwkJCQkqcExlbiA9IE9mZnNldDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBHZXQgdGhlIHZhbHVlIHRvIGFuIGludGVybWVkaWF0ZSBidWZmZXIsIGJlY2F1c2UKKwkJCSAqIHdlIGhhdmUgdG8gcHJlcGVuZCBhIGxlbmd0aCBieXRlLgorCQkJICovCisJCQlmb3IgKE9mZnNldCA9IDAsIEluZGV4ID0gRmlyc3RJbmRleDsKKwkJCQlJbmRleCA8IExhc3RJbmRleDsgSW5kZXggKyspIHsKKworCQkJCUJ1ZkxlbiA9IDI1NjsKKwkJCQlpZiAoVnBkUmVhZChwQUMsIElvQywgS2V5QXJyW0luZGV4XSwgQnVmLAorCQkJCQkoaW50ICopJkJ1ZkxlbikgPiAwIHx8CisJCQkJCUJ1ZkxlbiA+PSBTS19QTk1JX1ZQRF9EQVRBTEVOKSB7CisKKwkJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLAorCQkJCQkJU0tfUE5NSV9FUlIwMjIsCisJCQkJCQlTS19QTk1JX0VSUjAyMk1TRyk7CisKKwkJCQkJKnBMZW4gPSAwOworCQkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJCX0KKworCQkJCSoocEJ1ZiArIE9mZnNldCkgPSAoY2hhcilCdWZMZW47CisJCQkJU0tfTUVNQ1BZKHBCdWYgKyBPZmZzZXQgKyAxLCBCdWYsIEJ1Zkxlbik7CisJCQkJT2Zmc2V0ICs9IEJ1ZkxlbiArIDE7CisJCQl9CisJCQkqcExlbiA9IE9mZnNldDsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfVlBEX0FDQ0VTUzoKKwkJCWlmICgqcExlbiA8IExhc3RJbmRleCAtIEZpcnN0SW5kZXgpIHsKKworCQkJCSpwTGVuID0gTGFzdEluZGV4IC0gRmlyc3RJbmRleDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCQl9CisKKwkJCWZvciAoT2Zmc2V0ID0gMCwgSW5kZXggPSBGaXJzdEluZGV4OworCQkJCUluZGV4IDwgTGFzdEluZGV4OyBJbmRleCArKykgeworCisJCQkJaWYgKFZwZE1heVdyaXRlKEtleUFycltJbmRleF0pKSB7CisKKwkJCQkJKihwQnVmICsgT2Zmc2V0KSA9IFNLX1BOTUlfVlBEX1JXOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJKihwQnVmICsgT2Zmc2V0KSA9IFNLX1BOTUlfVlBEX1JPOworCQkJCX0KKwkJCQlPZmZzZXQgKys7CisJCQl9CisJCQkqcExlbiA9IE9mZnNldDsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfVlBEX0FDVElPTjoKKwkJCU9mZnNldCA9IExhc3RJbmRleCAtIEZpcnN0SW5kZXg7CisJCQlpZiAoKnBMZW4gPCBPZmZzZXQpIHsKKworCQkJCSpwTGVuID0gT2Zmc2V0OworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJCX0KKwkJCVNLX01FTVNFVChwQnVmLCAwLCBPZmZzZXQpOworCQkJKnBMZW4gPSBPZmZzZXQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAyMywKKwkJCQlTS19QTk1JX0VSUjAyM01TRyk7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKwl9CisJZWxzZSB7CisJCS8qIFRoZSBvbmx5IE9JRCB3aGljaCBjYW4gYmUgc2V0IGlzIFZQRF9BQ1RJT04gKi8KKwkJaWYgKElkICE9IE9JRF9TS0dFX1ZQRF9BQ1RJT04pIHsKKworCQkJaWYgKElkID09IE9JRF9TS0dFX1ZQRF9GUkVFX0JZVEVTIHx8CisJCQkJSWQgPT0gT0lEX1NLR0VfVlBEX0VOVFJJRVNfTElTVCB8fAorCQkJCUlkID09IE9JRF9TS0dFX1ZQRF9FTlRSSUVTX05VTUJFUiB8fAorCQkJCUlkID09IE9JRF9TS0dFX1ZQRF9LRVkgfHwKKwkJCQlJZCA9PSBPSURfU0tHRV9WUERfVkFMVUUgfHwKKwkJCQlJZCA9PSBPSURfU0tHRV9WUERfQUNDRVNTKSB7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9SRUFEX09OTFkpOworCQkJfQorCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDI0LAorCQkJCVNLX1BOTUlfRVJSMDI0TVNHKTsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCisJCS8qCisJCSAqIEZyb20gdGhpcyBwb2ludCB3ZSBoYW5kbGUgVlBEX0FDVElPTi4gQ2hlY2sgdGhlIGJ1ZmZlcgorCQkgKiBsZW5ndGguIEl0IHNob3VsZCBhdCBsZWFzdCBoYXZlIHRoZSBzaXplIG9mIG9uZSBieXRlLgorCQkgKi8KKwkJaWYgKCpwTGVuIDwgMSkgeworCisJCQkqcExlbiA9IDE7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKworCQkvKgorCQkgKiBUaGUgZmlyc3QgYnl0ZSBjb250YWlucyB0aGUgVlBEIGFjdGlvbiB0eXBlIHdlIHNob3VsZAorCQkgKiBwZXJmb3JtLgorCQkgKi8KKwkJc3dpdGNoICgqcEJ1ZikgeworCisJCWNhc2UgU0tfUE5NSV9WUERfSUdOT1JFOgorCQkJLyogTm90aGluZyB0byBkbyAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBTS19QTk1JX1ZQRF9DUkVBVEU6CisJCQkvKgorCQkJICogV2UgaGF2ZSB0byBjcmVhdGUgYSBuZXcgVlBEIGVudHJ5IG9yIHdlIG1vZGlmeQorCQkJICogYW4gZXhpc3Rpbmcgb25lLiBDaGVjayBmaXJzdCB0aGUgYnVmZmVyIGxlbmd0aC4KKwkJCSAqLworCQkJaWYgKCpwTGVuIDwgNCkgeworCisJCQkJKnBMZW4gPSA0OworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJCX0KKwkJCUtleVN0clswXSA9IHBCdWZbMV07CisJCQlLZXlTdHJbMV0gPSBwQnVmWzJdOworCQkJS2V5U3RyWzJdID0gMDsKKworCQkJLyoKKwkJCSAqIElzIHRoZSBlbnRyeSB3cml0YWJsZSBvciBkb2VzIGl0IGJlbG9uZyB0byB0aGUKKwkJCSAqIHJlYWQtb25seSBhcmVhPworCQkJICovCisJCQlpZiAoIVZwZE1heVdyaXRlKEtleVN0cikpIHsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJCQl9CisKKwkJCU9mZnNldCA9IChpbnQpcEJ1ZlszXSAmIDB4RkY7CisKKwkJCVNLX01FTUNQWShCdWYsIHBCdWYgKyA0LCBPZmZzZXQpOworCQkJQnVmW09mZnNldF0gPSAwOworCisJCQkvKiBBIHByZXNldCBlbmRzIGhlcmUgKi8KKwkJCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9QUkVTRVQpIHsKKworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworCQkJfQorCisJCQkvKiBXcml0ZSB0aGUgbmV3IGVudHJ5IG9yIG1vZGlmeSBhbiBleGlzdGluZyBvbmUgKi8KKwkJCVJldCA9IFZwZFdyaXRlKHBBQywgSW9DLCBLZXlTdHIsIEJ1Zik7CisJCQlpZiAoUmV0ID09IFNLX1BOTUlfVlBEX05PV1JJVEUgKSB7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCQkJfQorCQkJZWxzZSBpZiAoUmV0ICE9IFNLX1BOTUlfVlBEX09LKSB7CisKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDI1LAorCQkJCQlTS19QTk1JX0VSUjAyNU1TRyk7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFBlcmZvcm0gYW4gdXBkYXRlIG9mIHRoZSBWUEQgZGF0YS4gVGhpcyBpcworCQkJICogbm90IG1hbmRhbnRvcnksIGJ1dCBqdXN0IHRvIGJlIHN1cmUuCisJCQkgKi8KKwkJCVJldCA9IFZwZFVwZGF0ZShwQUMsIElvQyk7CisJCQlpZiAoUmV0ICE9IFNLX1BOTUlfVlBEX09LKSB7CisKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDI2LAorCQkJCQlTS19QTk1JX0VSUjAyNk1TRyk7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU0tfUE5NSV9WUERfREVMRVRFOgorCQkJLyogQ2hlY2sgaWYgdGhlIGJ1ZmZlciBzaXplIGlzIHBsYXVzaWJsZSAqLworCQkJaWYgKCpwTGVuIDwgMykgeworCisJCQkJKnBMZW4gPSAzOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJCX0KKwkJCWlmICgqcExlbiA+IDMpIHsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJCQl9CisJCQlLZXlTdHJbMF0gPSBwQnVmWzFdOworCQkJS2V5U3RyWzFdID0gcEJ1ZlsyXTsKKwkJCUtleVN0clsyXSA9IDA7CisKKwkJCS8qIEZpbmQgdGhlIHBhc3NlZCBrZXkgaW4gdGhlIGFycmF5ICovCisJCQlmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBLZXlObzsgSW5kZXggKyspIHsKKworCQkJCWlmIChTS19TVFJDTVAoS2V5U3RyLCBLZXlBcnJbSW5kZXhdKSA9PSAwKSB7CisKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJLyoKKwkJCSAqIElmIHdlIGNhbm5vdCBmaW5kIHRoZSBrZXkgaXQgaXMgd3JvbmcsIHNvIHdlCisJCQkgKiByZXR1cm4gYW4gYXBwcm9wcmlhdGUgZXJyb3IgdmFsdWUuCisJCQkgKi8KKwkJCWlmIChJbmRleCA9PSBLZXlObykgeworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwkJCX0KKworCQkJaWYgKEFjdGlvbiA9PSBTS19QTk1JX1BSRVNFVCkgeworCisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7CisJCQl9CisKKwkJCS8qIE9rLCB5b3Ugd2FudGVkIGl0IGFuZCB5b3Ugd2lsbCBnZXQgaXQgKi8KKwkJCVJldCA9IFZwZERlbGV0ZShwQUMsIElvQywgS2V5U3RyKTsKKwkJCWlmIChSZXQgIT0gU0tfUE5NSV9WUERfT0spIHsKKworCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMjcsCisJCQkJCVNLX1BOTUlfRVJSMDI3TVNHKTsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJfQorCisJCQkvKgorCQkJICogUGVyZm9ybSBhbiB1cGRhdGUgb2YgdGhlIFZQRCBkYXRhLiBUaGlzIGlzCisJCQkgKiBub3QgbWFuZGFudG9yeSwgYnV0IGp1c3QgdG8gYmUgc3VyZS4KKwkJCSAqLworCQkJUmV0ID0gVnBkVXBkYXRlKHBBQywgSW9DKTsKKwkJCWlmIChSZXQgIT0gU0tfUE5NSV9WUERfT0spIHsKKworCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMjgsCisJCQkJCVNLX1BOTUlfRVJSMDI4TVNHKTsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwkJfQorCX0KKworCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZW5lcmFsIC0gT0lEIGhhbmRsZXIgZnVuY3Rpb24gb2YgdmFyaW91cyBzaW5nbGUgaW5zdGFuY2UgT0lEcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhlIGNvZGUgaXMgc2ltcGxlLiBObyBkZXNjcmlwdGlvbiBuZWNlc3NhcnkuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQuCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBkYXRhIChlLmcuIGEgMzJiaXQgdmFsdWUgaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIGJ1dCBhIDE2IGJpdCB2YWx1ZSB3YXMgcGFzc2VkKS4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCBUaGUgcmVxdWVzdGVkIGluc3RhbmNlIG9mIHRoZSBPSUQgZG9lc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCAoZS5nLiBwb3J0IGluc3RhbmNlIDMgb24gYSB0d28gcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuCisgKi8KK1BOTUlfU1RBVElDIGludCBHZW5lcmFsKAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK2ludCBBY3Rpb24sCQkvKiBHRVQvUFJFU0VUL1NFVCBhY3Rpb24gKi8KK1NLX1UzMiBJZCwJCS8qIE9iamVjdCBJRCB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZCAqLworY2hhciAqcEJ1ZiwJCS8qIEJ1ZmZlciB1c2VkIGZvciB0aGUgbWFuYWdlbWVudCBkYXRhIHRyYW5zZmVyICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIE9uIGNhbGw6IGJ1ZmZlciBsZW5ndGguIE9uIHJldHVybjogdXNlZCBidWZmZXIgKi8KK1NLX1UzMiBJbnN0YW5jZSwJLyogSW5zdGFuY2UgKDEuLm4pIHRoYXQgaXMgdG8gYmUgcXVlcmllZCBvciAtMSAqLwordW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIC8qIEluZGV4IHRvIHRoZSBJZCB0YWJsZSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCWludAkJUmV0OworCXVuc2lnbmVkIGludAlJbmRleDsKKwl1bnNpZ25lZCBpbnQJTGVuOworCXVuc2lnbmVkIGludAlPZmZzZXQ7CisJdW5zaWduZWQgaW50CVZhbDsKKwlTS19VOAkJVmFsODsKKwlTS19VMTYJCVZhbDE2OworCVNLX1UzMgkJVmFsMzI7CisJU0tfVTY0CQlWYWw2NDsKKwlTS19VNjQJCVZhbDY0UnhId0VycnMgPSAwOworCVNLX1U2NAkJVmFsNjRUeEh3RXJycyA9IDA7CisJU0tfQk9PTAkJSXM2NEJpdFJlcSA9IFNLX0ZBTFNFOworCWNoYXIJCUJ1ZlsyNTZdOworCWludAkJCU1hY1R5cGU7CisKKwkvKgorCSAqIENoZWNrIGluc3RhbmNlLiBXZSBvbmx5IGhhbmRsZSBzaW5nbGUgaW5zdGFuY2UgdmFyaWFibGVzLgorCSAqLworCWlmIChJbnN0YW5jZSAhPSAoU0tfVTMyKSgtMSkgJiYgSW5zdGFuY2UgIT0gMSkgeworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QpOworCX0KKworCS8qCisJICogQ2hlY2sgYWN0aW9uLiBXZSBvbmx5IGFsbG93IGdldCByZXF1ZXN0cy4KKwkgKi8KKwlpZiAoQWN0aW9uICE9IFNLX1BOTUlfR0VUKSB7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1JFQURfT05MWSk7CisJfQorCQorCU1hY1R5cGUgPSBwQUMtPkdJbmkuR0lNYWNUeXBlOworCQorCS8qCisJICogQ2hlY2sgbGVuZ3RoIGZvciB0aGUgdmFyaW91cyBzdXBwb3J0ZWQgT0lEcworCSAqLworCXN3aXRjaCAoSWQpIHsKKworCWNhc2UgT0lEX0dFTl9YTUlUX0VSUk9SOgorCWNhc2UgT0lEX0dFTl9SQ1ZfRVJST1I6CisJY2FzZSBPSURfR0VOX1JDVl9OT19CVUZGRVI6CisjaWZuZGVmIFNLX05ESVNfNjRCSVRfQ1RSCisJCWlmICgqcExlbiA8IHNpemVvZihTS19VMzIpKSB7CisJCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisKKyNlbHNlIC8qIFNLX05ESVNfNjRCSVRfQ1RSICovCisKKwkJLyoKKwkJICogZm9yIGNvbXBhdGliaWxpdHksIGF0IGxlYXN0IDMyYml0IGFyZSByZXF1aXJlZCBmb3Igb2lkCisJCSAqLworCQlpZiAoKnBMZW4gPCBzaXplb2YoU0tfVTMyKSkgeworCQkJLyoKKwkJCSogYnV0IGluZGljYXRlIGhhbmRsaW5nIGZvciA2NGJpdCB2YWx1ZXMsCisJCQkqIGlmIGluc3VmZmljaWVudCBzcGFjZSBpcyBwcm92aWRlZAorCQkJKi8KKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKworCQlJczY0Qml0UmVxID0gKCpwTGVuIDwgc2l6ZW9mKFNLX1U2NCkpID8gU0tfRkFMU0UgOiBTS19UUlVFOworI2VuZGlmIC8qIFNLX05ESVNfNjRCSVRfQ1RSICovCisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9QT1JUX05VTUJFUjoKKwljYXNlIE9JRF9TS0dFX0RFVklDRV9UWVBFOgorCWNhc2UgT0lEX1NLR0VfUkVTVUxUOgorCWNhc2UgT0lEX1NLR0VfUkxNVF9NT05JVE9SX05VTUJFUjoKKwljYXNlIE9JRF9HRU5fVFJBTlNNSVRfUVVFVUVfTEVOR1RIOgorCWNhc2UgT0lEX1NLR0VfVFJBUF9OVU1CRVI6CisJY2FzZSBPSURfU0tHRV9NREJfVkVSU0lPTjoKKwljYXNlIE9JRF9TS0dFX0JPQVJETEVWRUw6CisJY2FzZSBPSURfU0tHRV9DSElQSUQ6CisJY2FzZSBPSURfU0tHRV9SQU1TSVpFOgorCQlpZiAoKnBMZW4gPCBzaXplb2YoU0tfVTMyKSkgeworCisJCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9DSElQU0VUOgorCQlpZiAoKnBMZW4gPCBzaXplb2YoU0tfVTE2KSkgeworCisJCQkqcExlbiA9IHNpemVvZihTS19VMTYpOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9CVVNfVFlQRToKKwljYXNlIE9JRF9TS0dFX0JVU19TUEVFRDoKKwljYXNlIE9JRF9TS0dFX0JVU19XSURUSDoKKwljYXNlIE9JRF9TS0dFX1NFTlNPUl9OVU1CRVI6CisJY2FzZSBPSURfU0tHRV9DSEtTTV9OVU1CRVI6CisJY2FzZSBPSURfU0tHRV9WQVVYQVZBSUw6CisJCWlmICgqcExlbiA8IHNpemVvZihTS19VOCkpIHsKKworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTgpOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9UWF9TV19RVUVVRV9MRU46CisJY2FzZSBPSURfU0tHRV9UWF9TV19RVUVVRV9NQVg6CisJY2FzZSBPSURfU0tHRV9UWF9SRVRSWToKKwljYXNlIE9JRF9TS0dFX1JYX0lOVFJfQ1RTOgorCWNhc2UgT0lEX1NLR0VfVFhfSU5UUl9DVFM6CisJY2FzZSBPSURfU0tHRV9SWF9OT19CVUZfQ1RTOgorCWNhc2UgT0lEX1NLR0VfVFhfTk9fQlVGX0NUUzoKKwljYXNlIE9JRF9TS0dFX1RYX1VTRURfREVTQ1JfTk86CisJY2FzZSBPSURfU0tHRV9SWF9ERUxJVkVSRURfQ1RTOgorCWNhc2UgT0lEX1NLR0VfUlhfT0NURVRTX0RFTElWX0NUUzoKKwljYXNlIE9JRF9TS0dFX1JYX0hXX0VSUk9SX0NUUzoKKwljYXNlIE9JRF9TS0dFX1RYX0hXX0VSUk9SX0NUUzoKKwljYXNlIE9JRF9TS0dFX0lOX0VSUk9SU19DVFM6CisJY2FzZSBPSURfU0tHRV9PVVRfRVJST1JfQ1RTOgorCWNhc2UgT0lEX1NLR0VfRVJSX1JFQ09WRVJZX0NUUzoKKwljYXNlIE9JRF9TS0dFX1NZU1VQVElNRToKKwkJaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX1U2NCkpIHsKKworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIENoZWNrZWQgbGF0ZXIgKi8KKwkJYnJlYWs7CisJfQorCisJLyogVXBkYXRlIHN0YXRpc3RpYyAqLworCWlmIChJZCA9PSBPSURfU0tHRV9SWF9IV19FUlJPUl9DVFMgfHwKKwkJSWQgPT0gT0lEX1NLR0VfVFhfSFdfRVJST1JfQ1RTIHx8CisJCUlkID09IE9JRF9TS0dFX0lOX0VSUk9SU19DVFMgfHwKKwkJSWQgPT0gT0lEX1NLR0VfT1VUX0VSUk9SX0NUUyB8fAorCQlJZCA9PSBPSURfR0VOX1hNSVRfRVJST1IgfHwKKwkJSWQgPT0gT0lEX0dFTl9SQ1ZfRVJST1IpIHsKKworCQkvKiBGb3JjZSB0aGUgWE1BQyB0byB1cGRhdGUgaXRzIHN0YXRpc3RpYyBjb3VudGVycyBhbmQKKwkJICogSW5jcmVtZW50IHNlbWFwaG9yZSB0byBpbmRpY2F0ZSB0aGF0IGFuIHVwZGF0ZSB3YXMKKwkJICogYWxyZWFkeSBkb25lLgorCQkgKi8KKwkJUmV0ID0gTWFjVXBkYXRlKHBBQywgSW9DLCAwLCBwQUMtPkdJbmkuR0lNYWNzRm91bmQgLSAxKTsKKwkJaWYgKFJldCAhPSBTS19QTk1JX0VSUl9PSykgeworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFJldCk7CisJCX0KKwkJcEFDLT5Qbm1pLk1hY1VwZGF0ZWRGbGFnICsrOworCisJCS8qCisJCSAqIFNvbWUgT0lEcyBjb25zaXN0IG9mIG11bHRpcGxlIGhhcmR3YXJlIGNvdW50ZXJzLiBUaG9zZQorCQkgKiB2YWx1ZXMgd2hpY2ggYXJlIGNvbnRhaW5lZCBpbiBhbGwgb2YgdGhlbSB3aWxsIGJlIGFkZGVkCisJCSAqIG5vdy4KKwkJICovCisJCXN3aXRjaCAoSWQpIHsKKworCQljYXNlIE9JRF9TS0dFX1JYX0hXX0VSUk9SX0NUUzoKKwkJY2FzZSBPSURfU0tHRV9JTl9FUlJPUlNfQ1RTOgorCQljYXNlIE9JRF9HRU5fUkNWX0VSUk9SOgorCQkJVmFsNjRSeEh3RXJycyA9CisJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgMCwgU0tfUE5NSV9IUlhfTUlTU0VELCBOZXRJbmRleCkgKworCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIDAsIFNLX1BOTUlfSFJYX0ZSQU1JTkcsIE5ldEluZGV4KSArCisJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgMCwgU0tfUE5NSV9IUlhfT1ZFUkZMT1csIE5ldEluZGV4KSArCisJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgMCwgU0tfUE5NSV9IUlhfSkFCQkVSLCBOZXRJbmRleCkgKworCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIDAsIFNLX1BOTUlfSFJYX0NBUlJJRVIsIE5ldEluZGV4KSArCisJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgMCwgU0tfUE5NSV9IUlhfSVJMRU5HVEgsIE5ldEluZGV4KSArCisJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgMCwgU0tfUE5NSV9IUlhfU1lNQk9MLCBOZXRJbmRleCkgKworCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIDAsIFNLX1BOTUlfSFJYX1NIT1JUUywgTmV0SW5kZXgpICsKKwkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCAwLCBTS19QTk1JX0hSWF9SVU5ULCBOZXRJbmRleCkgKworCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIDAsIFNLX1BOTUlfSFJYX1RPT19MT05HLCBOZXRJbmRleCkgKworCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIDAsIFNLX1BOTUlfSFJYX0ZDUywgTmV0SW5kZXgpICsKKwkJCQlHZXRTdGF0VmFsKHBBQywgSW9DLCAwLCBTS19QTk1JX0hSWF9DRVhULCBOZXRJbmRleCk7CisJICAgICAgICBicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1RYX0hXX0VSUk9SX0NUUzoKKwkJY2FzZSBPSURfU0tHRV9PVVRfRVJST1JfQ1RTOgorCQljYXNlIE9JRF9HRU5fWE1JVF9FUlJPUjoKKwkJCVZhbDY0VHhId0VycnMgPQorCQkJCUdldFN0YXRWYWwocEFDLCBJb0MsIDAsIFNLX1BOTUlfSFRYX0VYQ0VTU19DT0wsIE5ldEluZGV4KSArCisJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgMCwgU0tfUE5NSV9IVFhfTEFURV9DT0wsIE5ldEluZGV4KSArCisJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgMCwgU0tfUE5NSV9IVFhfVU5ERVJSVU4sIE5ldEluZGV4KSArCisJCQkJR2V0U3RhdFZhbChwQUMsIElvQywgMCwgU0tfUE5NSV9IVFhfQ0FSUklFUiwgTmV0SW5kZXgpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIFJldHJpZXZlIHZhbHVlCisJICovCisJc3dpdGNoIChJZCkgeworCisJY2FzZSBPSURfU0tHRV9TVVBQT1JURURfTElTVDoKKwkJTGVuID0gSURfVEFCTEVfU0laRSAqIHNpemVvZihTS19VMzIpOworCQlpZiAoKnBMZW4gPCBMZW4pIHsKKworCQkJKnBMZW4gPSBMZW47CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJZm9yIChPZmZzZXQgPSAwLCBJbmRleCA9IDA7IE9mZnNldCA8IExlbjsKKwkJCU9mZnNldCArPSBzaXplb2YoU0tfVTMyKSwgSW5kZXggKyspIHsKKworCQkJVmFsMzIgPSAoU0tfVTMyKUlkVGFibGVbSW5kZXhdLklkOworCQkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiArIE9mZnNldCwgVmFsMzIpOworCQl9CisJCSpwTGVuID0gTGVuOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfQk9BUkRMRVZFTDoKKwkJVmFsMzIgPSAoU0tfVTMyKXBBQy0+R0luaS5HSUxldmVsOworCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBWYWwzMik7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9QT1JUX05VTUJFUjoKKwkJVmFsMzIgPSAoU0tfVTMyKXBBQy0+R0luaS5HSU1hY3NGb3VuZDsKKwkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgVmFsMzIpOworCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfREVWSUNFX1RZUEU6CisJCVZhbDMyID0gKFNLX1UzMilwQUMtPlBubWkuRGV2aWNlVHlwZTsKKwkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgVmFsMzIpOworCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfRFJJVkVSX0RFU0NSOgorCQlpZiAocEFDLT5Qbm1pLnBEcml2ZXJEZXNjcmlwdGlvbiA9PSBOVUxMKSB7CisKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMDcsCisJCQkJU0tfUE5NSV9FUlIwMDdNU0cpOworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisKKwkJTGVuID0gU0tfU1RSTEVOKHBBQy0+UG5taS5wRHJpdmVyRGVzY3JpcHRpb24pICsgMTsKKwkJaWYgKExlbiA+IFNLX1BOTUlfU1RSSU5HTEVOMSkgeworCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDI5LAorCQkJCVNLX1BOTUlfRVJSMDI5TVNHKTsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCisJCWlmICgqcExlbiA8IExlbikgeworCisJCQkqcExlbiA9IExlbjsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQkqcEJ1ZiA9IChjaGFyKShMZW4gLSAxKTsKKwkJU0tfTUVNQ1BZKHBCdWYgKyAxLCBwQUMtPlBubWkucERyaXZlckRlc2NyaXB0aW9uLCBMZW4gLSAxKTsKKwkJKnBMZW4gPSBMZW47CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9EUklWRVJfVkVSU0lPTjoKKwkJaWYgKHBBQy0+UG5taS5wRHJpdmVyVmVyc2lvbiA9PSBOVUxMKSB7CisKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMzAsCisJCQkJU0tfUE5NSV9FUlIwMzBNU0cpOworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisKKwkJTGVuID0gU0tfU1RSTEVOKHBBQy0+UG5taS5wRHJpdmVyVmVyc2lvbikgKyAxOworCQlpZiAoTGVuID4gU0tfUE5NSV9TVFJJTkdMRU4xKSB7CisKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMzEsCisJCQkJU0tfUE5NSV9FUlIwMzFNU0cpOworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisKKwkJaWYgKCpwTGVuIDwgTGVuKSB7CisKKwkJCSpwTGVuID0gTGVuOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCSpwQnVmID0gKGNoYXIpKExlbiAtIDEpOworCQlTS19NRU1DUFkocEJ1ZiArIDEsIHBBQy0+UG5taS5wRHJpdmVyVmVyc2lvbiwgTGVuIC0gMSk7CisJCSpwTGVuID0gTGVuOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfRFJJVkVSX1JFTERBVEU6CisJCWlmIChwQUMtPlBubWkucERyaXZlclJlbGVhc2VEYXRlID09IE5VTEwpIHsKKworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAzMCwKKwkJCQlTS19QTk1JX0VSUjA1M01TRyk7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKworCQlMZW4gPSBTS19TVFJMRU4ocEFDLT5Qbm1pLnBEcml2ZXJSZWxlYXNlRGF0ZSkgKyAxOworCQlpZiAoTGVuID4gU0tfUE5NSV9TVFJJTkdMRU4xKSB7CisKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMzEsCisJCQkJU0tfUE5NSV9FUlIwNTRNU0cpOworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisKKwkJaWYgKCpwTGVuIDwgTGVuKSB7CisKKwkJCSpwTGVuID0gTGVuOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCSpwQnVmID0gKGNoYXIpKExlbiAtIDEpOworCQlTS19NRU1DUFkocEJ1ZiArIDEsIHBBQy0+UG5taS5wRHJpdmVyUmVsZWFzZURhdGUsIExlbiAtIDEpOworCQkqcExlbiA9IExlbjsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX0RSSVZFUl9GSUxFTkFNRToKKwkJaWYgKHBBQy0+UG5taS5wRHJpdmVyRmlsZU5hbWUgPT0gTlVMTCkgeworCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDMwLAorCQkJCVNLX1BOTUlfRVJSMDU1TVNHKTsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCisJCUxlbiA9IFNLX1NUUkxFTihwQUMtPlBubWkucERyaXZlckZpbGVOYW1lKSArIDE7CisJCWlmIChMZW4gPiBTS19QTk1JX1NUUklOR0xFTjEpIHsKKworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAzMSwKKwkJCQlTS19QTk1JX0VSUjA1Nk1TRyk7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKworCQlpZiAoKnBMZW4gPCBMZW4pIHsKKworCQkJKnBMZW4gPSBMZW47CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJKnBCdWYgPSAoY2hhcikoTGVuIC0gMSk7CisJCVNLX01FTUNQWShwQnVmICsgMSwgcEFDLT5Qbm1pLnBEcml2ZXJGaWxlTmFtZSwgTGVuIC0gMSk7CisJCSpwTGVuID0gTGVuOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfSFdfREVTQ1I6CisJCS8qCisJCSAqIFRoZSBoYXJkd2FyZSBkZXNjcmlwdGlvbiBpcyBsb2NhdGVkIGluIHRoZSBWUEQuIFRoaXMKKwkJICogcXVlcnkgbWF5IG1vdmUgdG8gdGhlIGluaXRpYWxpc2F0aW9uIHJvdXRpbmUuIEJ1dAorCQkgKiB0aGUgVlBEIGRhdGEgaXMgY2FjaGVkIGFuZCB0aGVyZWZvcmUgYSBjYWxsIGhlcmUKKwkJICogd2lsbCBub3QgbWFrZSBtdWNoIGRpZmZlcmVuY2UuCisJCSAqLworCQlMZW4gPSAyNTY7CisJCWlmIChWcGRSZWFkKHBBQywgSW9DLCBWUERfTkFNRSwgQnVmLCAoaW50ICopJkxlbikgPiAwKSB7CisKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMzIsCisJCQkJU0tfUE5NSV9FUlIwMzJNU0cpOworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisJCUxlbiArKzsKKwkJaWYgKExlbiA+IFNLX1BOTUlfU1RSSU5HTEVOMSkgeworCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDMzLAorCQkJCVNLX1BOTUlfRVJSMDMzTVNHKTsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCQlpZiAoKnBMZW4gPCBMZW4pIHsKKworCQkJKnBMZW4gPSBMZW47CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJKnBCdWYgPSAoY2hhcikoTGVuIC0gMSk7CisJCVNLX01FTUNQWShwQnVmICsgMSwgQnVmLCBMZW4gLSAxKTsKKwkJKnBMZW4gPSBMZW47CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9IV19WRVJTSU9OOgorCQkvKiBPaCwgSSBsb3ZlIHRvIGRvIHNvbWUgc3RyaW5nIG1hbmlwdWxhdGlvbiAqLworCQlpZiAoKnBMZW4gPCA1KSB7CisKKwkJCSpwTGVuID0gNTsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQlWYWw4ID0gKFNLX1U4KXBBQy0+R0luaS5HSVBjaUh3UmV2OworCQlwQnVmWzBdID0gNDsKKwkJcEJ1ZlsxXSA9ICd2JzsKKwkJcEJ1ZlsyXSA9IChjaGFyKSgweDMwIHwgKChWYWw4ID4+IDQpICYgMHgwRikpOworCQlwQnVmWzNdID0gJy4nOworCQlwQnVmWzRdID0gKGNoYXIpKDB4MzAgfCAoVmFsOCAmIDB4MEYpKTsKKwkJKnBMZW4gPSA1OworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfQ0hJUFNFVDoKKwkJVmFsMTYgPSBwQUMtPlBubWkuQ2hpcHNldDsKKwkJU0tfUE5NSV9TVE9SRV9VMTYocEJ1ZiwgVmFsMTYpOworCQkqcExlbiA9IHNpemVvZihTS19VMTYpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfQ0hJUElEOgorCQlWYWwzMiA9IHBBQy0+R0luaS5HSUNoaXBJZDsKKwkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgVmFsMzIpOworCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfUkFNU0laRToKKwkJVmFsMzIgPSBwQUMtPkdJbmkuR0lSYW1TaXplOworCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBWYWwzMik7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9WQVVYQVZBSUw6CisJCSpwQnVmID0gKGNoYXIpIHBBQy0+R0luaS5HSVZhdXhBdmFpbDsKKwkJKnBMZW4gPSBzaXplb2YoY2hhcik7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9CVVNfVFlQRToKKwkJKnBCdWYgPSAoY2hhcikgU0tfUE5NSV9CVVNfUENJOworCQkqcExlbiA9IHNpemVvZihjaGFyKTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX0JVU19TUEVFRDoKKwkJKnBCdWYgPSBwQUMtPlBubWkuUGNpQnVzU3BlZWQ7CisJCSpwTGVuID0gc2l6ZW9mKGNoYXIpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfQlVTX1dJRFRIOgorCQkqcEJ1ZiA9IHBBQy0+UG5taS5QY2lCdXNXaWR0aDsKKwkJKnBMZW4gPSBzaXplb2YoY2hhcik7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9SRVNVTFQ6CisJCVZhbDMyID0gcEFDLT5Qbm1pLlRlc3RSZXN1bHQ7CisJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIFZhbDMyKTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1NFTlNPUl9OVU1CRVI6CisJCSpwQnVmID0gKGNoYXIpcEFDLT5JMmMuTWF4U2VuczsKKwkJKnBMZW4gPSBzaXplb2YoY2hhcik7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9DSEtTTV9OVU1CRVI6CisJCSpwQnVmID0gU0tDU19OVU1fUFJPVE9DT0xTOworCQkqcExlbiA9IHNpemVvZihjaGFyKTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1RSQVBfTlVNQkVSOgorCQlHZXRUcmFwUXVldWVMZW4ocEFDLCAmTGVuLCAmVmFsKTsKKwkJVmFsMzIgPSAoU0tfVTMyKVZhbDsKKwkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgVmFsMzIpOworCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfVFJBUDoKKwkJR2V0VHJhcFF1ZXVlTGVuKHBBQywgJkxlbiwgJlZhbCk7CisJCWlmICgqcExlbiA8IExlbikgeworCisJCQkqcExlbiA9IExlbjsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQlDb3B5VHJhcFF1ZXVlKHBBQywgcEJ1Zik7CisJCSpwTGVuID0gTGVuOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfUkxNVF9NT05JVE9SX05VTUJFUjoKKy8qIFhYWCBOb3QgeWV0IGltcGxlbWVudGVkIGJ5IFJMTVQgdGhlcmVmb3JlIHdlIHJldHVybiB6ZXJvIGVsZW1lbnRzICovCisJCVZhbDMyID0gMDsKKwkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgVmFsMzIpOworCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfVFhfU1dfUVVFVUVfTEVOOgorCQkvKiAyMDAyLTA5LTE3IHB3ZWJlcjogRm9yIFhNQUMsIHVzZSB0aGUgZnJvemVuIFNXIGNvdW50ZXJzIChCdWZQb3J0KSAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFtOZXRJbmRleF0uVHhTd1F1ZXVlTGVuOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0WzBdLlR4U3dRdWV1ZUxlbiArCisJCQkJCXBBQy0+UG5taS5CdWZQb3J0WzFdLlR4U3dRdWV1ZUxlbjsKKwkJCX0JCQkKKwkJfQorCQllbHNlIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlR4U3dRdWV1ZUxlbjsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFswXS5UeFN3UXVldWVMZW4gKworCQkJCQlwQUMtPlBubWkuUG9ydFsxXS5UeFN3UXVldWVMZW47CisJCQl9CQkJCisJCX0KKwkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjQpOworCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQlicmVhazsKKworCisJY2FzZSBPSURfU0tHRV9UWF9TV19RVUVVRV9NQVg6CisJCS8qIDIwMDItMDktMTcgcHdlYmVyOiBGb3IgWE1BQywgdXNlIHRoZSBmcm96ZW4gU1cgY291bnRlcnMgKEJ1ZlBvcnQpICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0W05ldEluZGV4XS5UeFN3UXVldWVNYXg7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbMF0uVHhTd1F1ZXVlTWF4ICsKKwkJCQkJcEFDLT5Qbm1pLkJ1ZlBvcnRbMV0uVHhTd1F1ZXVlTWF4OworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uVHhTd1F1ZXVlTWF4OworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0WzBdLlR4U3dRdWV1ZU1heCArCisJCQkJCXBBQy0+UG5taS5Qb3J0WzFdLlR4U3dRdWV1ZU1heDsKKwkJCX0KKwkJfQorCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NCk7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9UWF9SRVRSWToKKwkJLyogMjAwMi0wOS0xNyBwd2ViZXI6IEZvciBYTUFDLCB1c2UgdGhlIGZyb3plbiBTVyBjb3VudGVycyAoQnVmUG9ydCkgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbTmV0SW5kZXhdLlR4UmV0cnlDdHM7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbMF0uVHhSZXRyeUN0cyArCisJCQkJCXBBQy0+UG5taS5CdWZQb3J0WzFdLlR4UmV0cnlDdHM7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5UeFJldHJ5Q3RzOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0WzBdLlR4UmV0cnlDdHMgKworCQkJCQlwQUMtPlBubWkuUG9ydFsxXS5UeFJldHJ5Q3RzOworCQkJfQorCQl9CisJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0KTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1JYX0lOVFJfQ1RTOgorCQkvKiAyMDAyLTA5LTE3IHB3ZWJlcjogRm9yIFhNQUMsIHVzZSB0aGUgZnJvemVuIFNXIGNvdW50ZXJzIChCdWZQb3J0KSAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFtOZXRJbmRleF0uUnhJbnRyQ3RzOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0WzBdLlJ4SW50ckN0cyArCisJCQkJCXBBQy0+UG5taS5CdWZQb3J0WzFdLlJ4SW50ckN0czsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlJ4SW50ckN0czsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFswXS5SeEludHJDdHMgKworCQkJCQlwQUMtPlBubWkuUG9ydFsxXS5SeEludHJDdHM7CisJCQl9CisJCX0KKwkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjQpOworCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfVFhfSU5UUl9DVFM6CisJCS8qIDIwMDItMDktMTcgcHdlYmVyOiBGb3IgWE1BQywgdXNlIHRoZSBmcm96ZW4gU1cgY291bnRlcnMgKEJ1ZlBvcnQpICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0W05ldEluZGV4XS5UeEludHJDdHM7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbMF0uVHhJbnRyQ3RzICsKKwkJCQkJcEFDLT5Qbm1pLkJ1ZlBvcnRbMV0uVHhJbnRyQ3RzOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uVHhJbnRyQ3RzOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0WzBdLlR4SW50ckN0cyArCisJCQkJCXBBQy0+UG5taS5Qb3J0WzFdLlR4SW50ckN0czsKKwkJCX0KKwkJfQorCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NCk7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9SWF9OT19CVUZfQ1RTOgorCQkvKiAyMDAyLTA5LTE3IHB3ZWJlcjogRm9yIFhNQUMsIHVzZSB0aGUgZnJvemVuIFNXIGNvdW50ZXJzIChCdWZQb3J0KSAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFtOZXRJbmRleF0uUnhOb0J1ZkN0czsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFswXS5SeE5vQnVmQ3RzICsKKwkJCQkJcEFDLT5Qbm1pLkJ1ZlBvcnRbMV0uUnhOb0J1ZkN0czsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlJ4Tm9CdWZDdHM7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbMF0uUnhOb0J1ZkN0cyArCisJCQkJCXBBQy0+UG5taS5Qb3J0WzFdLlJ4Tm9CdWZDdHM7CisJCQl9CisJCX0KKwkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjQpOworCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfVFhfTk9fQlVGX0NUUzoKKwkJLyogMjAwMi0wOS0xNyBwd2ViZXI6IEZvciBYTUFDLCB1c2UgdGhlIGZyb3plbiBTVyBjb3VudGVycyAoQnVmUG9ydCkgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbTmV0SW5kZXhdLlR4Tm9CdWZDdHM7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbMF0uVHhOb0J1ZkN0cyArCisJCQkJCXBBQy0+UG5taS5CdWZQb3J0WzFdLlR4Tm9CdWZDdHM7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5UeE5vQnVmQ3RzOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0WzBdLlR4Tm9CdWZDdHMgKworCQkJCQlwQUMtPlBubWkuUG9ydFsxXS5UeE5vQnVmQ3RzOworCQkJfQorCQl9CisJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0KTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1RYX1VTRURfREVTQ1JfTk86CisJCS8qIDIwMDItMDktMTcgcHdlYmVyOiBGb3IgWE1BQywgdXNlIHRoZSBmcm96ZW4gU1cgY291bnRlcnMgKEJ1ZlBvcnQpICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0W05ldEluZGV4XS5UeFVzZWREZXNjck5vOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0WzBdLlR4VXNlZERlc2NyTm8gKworCQkJCQlwQUMtPlBubWkuQnVmUG9ydFsxXS5UeFVzZWREZXNjck5vOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uVHhVc2VkRGVzY3JObzsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFswXS5UeFVzZWREZXNjck5vICsKKwkJCQkJcEFDLT5Qbm1pLlBvcnRbMV0uVHhVc2VkRGVzY3JObzsKKwkJCX0KKwkJfQorCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NCk7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9SWF9ERUxJVkVSRURfQ1RTOgorCQkvKiAyMDAyLTA5LTE3IHB3ZWJlcjogRm9yIFhNQUMsIHVzZSB0aGUgZnJvemVuIFNXIGNvdW50ZXJzIChCdWZQb3J0KSAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFtOZXRJbmRleF0uUnhEZWxpdmVyZWRDdHM7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbMF0uUnhEZWxpdmVyZWRDdHMgKworCQkJCQlwQUMtPlBubWkuQnVmUG9ydFsxXS5SeERlbGl2ZXJlZEN0czsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlJ4RGVsaXZlcmVkQ3RzOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0WzBdLlJ4RGVsaXZlcmVkQ3RzICsKKwkJCQkJcEFDLT5Qbm1pLlBvcnRbMV0uUnhEZWxpdmVyZWRDdHM7CisJCQl9CisJCX0KKwkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjQpOworCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfUlhfT0NURVRTX0RFTElWX0NUUzoKKwkJLyogMjAwMi0wOS0xNyBwd2ViZXI6IEZvciBYTUFDLCB1c2UgdGhlIGZyb3plbiBTVyBjb3VudGVycyAoQnVmUG9ydCkgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbTmV0SW5kZXhdLlJ4T2N0ZXRzRGVsaXZlcmVkQ3RzOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0WzBdLlJ4T2N0ZXRzRGVsaXZlcmVkQ3RzICsKKwkJCQkJcEFDLT5Qbm1pLkJ1ZlBvcnRbMV0uUnhPY3RldHNEZWxpdmVyZWRDdHM7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5SeE9jdGV0c0RlbGl2ZXJlZEN0czsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFswXS5SeE9jdGV0c0RlbGl2ZXJlZEN0cyArCisJCQkJCXBBQy0+UG5taS5Qb3J0WzFdLlJ4T2N0ZXRzRGVsaXZlcmVkQ3RzOworCQkJfQorCQl9CisJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0KTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1JYX0hXX0VSUk9SX0NUUzoKKwkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjRSeEh3RXJycyk7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9UWF9IV19FUlJPUl9DVFM6CisJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0VHhId0VycnMpOworCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfSU5fRVJST1JTX0NUUzoKKwkJLyogMjAwMi0wOS0xNyBwd2ViZXI6IEZvciBYTUFDLCB1c2UgdGhlIGZyb3plbiBTVyBjb3VudGVycyAoQnVmUG9ydCkgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gVmFsNjRSeEh3RXJycyArIHBBQy0+UG5taS5CdWZQb3J0W05ldEluZGV4XS5SeE5vQnVmQ3RzOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IFZhbDY0UnhId0VycnMgKworCQkJCQlwQUMtPlBubWkuQnVmUG9ydFswXS5SeE5vQnVmQ3RzICsKKwkJCQkJcEFDLT5Qbm1pLkJ1ZlBvcnRbMV0uUnhOb0J1ZkN0czsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCS8qIER1YWwgbmV0IG1vZGUgKi8KKwkJCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQkJCVZhbDY0ID0gVmFsNjRSeEh3RXJycyArIHBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5SeE5vQnVmQ3RzOworCQkJfQorCQkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCQllbHNlIHsKKwkJCQlWYWw2NCA9IFZhbDY0UnhId0VycnMgKworCQkJCQlwQUMtPlBubWkuUG9ydFswXS5SeE5vQnVmQ3RzICsKKwkJCQkJcEFDLT5Qbm1pLlBvcnRbMV0uUnhOb0J1ZkN0czsKKwkJCX0KKwkJfQorCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NCk7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9PVVRfRVJST1JfQ1RTOgorCQkvKiAyMDAyLTA5LTE3IHB3ZWJlcjogRm9yIFhNQUMsIHVzZSB0aGUgZnJvemVuIFNXIGNvdW50ZXJzIChCdWZQb3J0KSAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBWYWw2NFR4SHdFcnJzICsgcEFDLT5Qbm1pLkJ1ZlBvcnRbTmV0SW5kZXhdLlR4Tm9CdWZDdHM7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gVmFsNjRUeEh3RXJycyArCisJCQkJCXBBQy0+UG5taS5CdWZQb3J0WzBdLlR4Tm9CdWZDdHMgKworCQkJCQlwQUMtPlBubWkuQnVmUG9ydFsxXS5UeE5vQnVmQ3RzOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBWYWw2NFR4SHdFcnJzICsgcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlR4Tm9CdWZDdHM7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gVmFsNjRUeEh3RXJycyArCisJCQkJCXBBQy0+UG5taS5Qb3J0WzBdLlR4Tm9CdWZDdHMgKworCQkJCQlwQUMtPlBubWkuUG9ydFsxXS5UeE5vQnVmQ3RzOworCQkJfQorCQl9CisJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0KTsKKwkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX0VSUl9SRUNPVkVSWV9DVFM6CisJCS8qIDIwMDItMDktMTcgcHdlYmVyOiBGb3IgWE1BQywgdXNlIHRoZSBmcm96ZW4gU1cgY291bnRlcnMgKEJ1ZlBvcnQpICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQkvKiBEdWFsIG5ldCBtb2RlICovCisJCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCQlWYWw2NCA9IHBBQy0+UG5taS5CdWZQb3J0W05ldEluZGV4XS5FcnJSZWNvdmVyeUN0czsKKwkJCX0KKwkJCS8qIFNpbmdsZSBuZXQgbW9kZSAqLworCQkJZWxzZSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuQnVmUG9ydFswXS5FcnJSZWNvdmVyeUN0cyArCisJCQkJCXBBQy0+UG5taS5CdWZQb3J0WzFdLkVyclJlY292ZXJ5Q3RzOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLyogRHVhbCBuZXQgbW9kZSAqLworCQkJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CisJCQkJVmFsNjQgPSBwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uRXJyUmVjb3ZlcnlDdHM7CisJCQl9CisJCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJCWVsc2UgeworCQkJCVZhbDY0ID0gcEFDLT5Qbm1pLlBvcnRbMF0uRXJyUmVjb3ZlcnlDdHMgKworCQkJCQlwQUMtPlBubWkuUG9ydFsxXS5FcnJSZWNvdmVyeUN0czsKKwkJCX0KKwkJfQorCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmLCBWYWw2NCk7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCWJyZWFrOworCisJY2FzZSBPSURfU0tHRV9TWVNVUFRJTUU6CisJCVZhbDY0ID0gU0tfUE5NSV9IVU5EUkVEU19TRUMoU2tPc0dldFRpbWUocEFDKSk7CisJCVZhbDY0IC09IHBBQy0+UG5taS5TdGFydFVwVGltZTsKKwkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjQpOworCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQlicmVhazsKKworCWNhc2UgT0lEX1NLR0VfTURCX1ZFUlNJT046CisJCVZhbDMyID0gU0tfUE5NSV9NREJfVkVSU0lPTjsKKwkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgVmFsMzIpOworCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQlicmVhazsKKworCWNhc2UgT0lEX0dFTl9SQ1ZfRVJST1I6CisJCS8qIDIwMDItMDktMTcgcHdlYmVyOiBGb3IgWE1BQywgdXNlIHRoZSBmcm96ZW4gU1cgY291bnRlcnMgKEJ1ZlBvcnQpICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQlWYWw2NCA9IFZhbDY0UnhId0VycnMgKyBwQUMtPlBubWkuQnVmUG9ydFtOZXRJbmRleF0uUnhOb0J1ZkN0czsKKwkJfQorCQllbHNlIHsKKwkJCVZhbDY0ID0gVmFsNjRSeEh3RXJycyArIHBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5SeE5vQnVmQ3RzOworCQl9CisKKwkJLyoKKwkJICogYnkgZGVmYXVsdCAzMmJpdCB2YWx1ZXMgYXJlIGV2YWx1YXRlZAorCQkgKi8KKwkJaWYgKCFJczY0Qml0UmVxKSB7CisJCQlWYWwzMiA9IChTS19VMzIpVmFsNjQ7CisJCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBWYWwzMik7CisJCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQl9CisJCWVsc2UgeworCQkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjQpOworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgT0lEX0dFTl9YTUlUX0VSUk9SOgorCQkvKiAyMDAyLTA5LTE3IHB3ZWJlcjogRm9yIFhNQUMsIHVzZSB0aGUgZnJvemVuIFNXIGNvdW50ZXJzIChCdWZQb3J0KSAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQkJVmFsNjQgPSBWYWw2NFR4SHdFcnJzICsgcEFDLT5Qbm1pLkJ1ZlBvcnRbTmV0SW5kZXhdLlR4Tm9CdWZDdHM7CisJCX0KKwkJZWxzZSB7CisJCQlWYWw2NCA9IFZhbDY0VHhId0VycnMgKyBwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uVHhOb0J1ZkN0czsKKwkJfQorCisJCS8qCisJCSAqIGJ5IGRlZmF1bHQgMzJiaXQgdmFsdWVzIGFyZSBldmFsdWF0ZWQKKwkJICovCisJCWlmICghSXM2NEJpdFJlcSkgeworCQkJVmFsMzIgPSAoU0tfVTMyKVZhbDY0OworCQkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgVmFsMzIpOworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKwkJfQorCQllbHNlIHsKKwkJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0KTsKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE9JRF9HRU5fUkNWX05PX0JVRkZFUjoKKwkJLyogMjAwMi0wOS0xNyBwd2ViZXI6IEZvciBYTUFDLCB1c2UgdGhlIGZyb3plbiBTVyBjb3VudGVycyAoQnVmUG9ydCkgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCVZhbDY0ID0gcEFDLT5Qbm1pLkJ1ZlBvcnRbTmV0SW5kZXhdLlJ4Tm9CdWZDdHM7CisJCX0KKwkJZWxzZSB7CisJCQlWYWw2NCA9IHBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5SeE5vQnVmQ3RzOworCQl9CisKKwkJLyoKKwkJICogYnkgZGVmYXVsdCAzMmJpdCB2YWx1ZXMgYXJlIGV2YWx1YXRlZAorCQkgKi8KKwkJaWYgKCFJczY0Qml0UmVxKSB7CisJCQlWYWwzMiA9IChTS19VMzIpVmFsNjQ7CisJCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBWYWwzMik7CisJCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQl9CisJCWVsc2UgeworCQkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjQpOworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgT0lEX0dFTl9UUkFOU01JVF9RVUVVRV9MRU5HVEg6CisJCVZhbDMyID0gKFNLX1UzMilwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uVHhTd1F1ZXVlTGVuOworCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBWYWwzMik7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAzNCwKKwkJCVNLX1BOTUlfRVJSMDM0TVNHKTsKKworCQkqcExlbiA9IDA7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJfQorCisJaWYgKElkID09IE9JRF9TS0dFX1JYX0hXX0VSUk9SX0NUUyB8fAorCQlJZCA9PSBPSURfU0tHRV9UWF9IV19FUlJPUl9DVFMgfHwKKwkJSWQgPT0gT0lEX1NLR0VfSU5fRVJST1JTX0NUUyB8fAorCQlJZCA9PSBPSURfU0tHRV9PVVRfRVJST1JfQ1RTIHx8CisJCUlkID09IE9JRF9HRU5fWE1JVF9FUlJPUiB8fAorCQlJZCA9PSBPSURfR0VOX1JDVl9FUlJPUikgeworCisJCXBBQy0+UG5taS5NYWNVcGRhdGVkRmxhZyAtLTsKKwl9CisKKwlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmxtdCAtIE9JRCBoYW5kbGVyIGZ1bmN0aW9uIG9mIE9JRF9TS0dFX1JMTVRfWFhYIHNpbmdsZSBpbnN0YW5jZS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUdldC9QcmVzZXRzL1NldHMgdGhlIFJMTVQgT0lEcy4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4KKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IGRhdGEgKGUuZy4gYSAzMmJpdCB2YWx1ZSBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCwgYnV0IGEgMTYgYml0IHZhbHVlIHdhcyBwYXNzZWQpLgorICoJU0tfUE5NSV9FUlJfQkFEX1ZBTFVFICAgIFRoZSBwYXNzZWQgdmFsdWUgaXMgbm90IGluIHRoZSB2YWxpZAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHJhbmdlLgorICoJU0tfUE5NSV9FUlJfUkVBRF9PTkxZICAgIFRoZSBPSUQgaXMgcmVhZC1vbmx5IGFuZCBjYW5ub3QgYmUgc2V0LgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2Ugb2YgdGhlIE9JRCBkb2Vzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChlLmcuIHBvcnQgaW5zdGFuY2UgMyBvbiBhIHR3byBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci4KKyAqLworUE5NSV9TVEFUSUMgaW50IFJsbXQoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworaW50IEFjdGlvbiwJCS8qIEdFVC9QUkVTRVQvU0VUIGFjdGlvbiAqLworU0tfVTMyIElkLAkJLyogT2JqZWN0IElEIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkICovCitjaGFyICpwQnVmLAkJLyogQnVmZmVyIHVzZWQgZm9yIHRoZSBtYW5hZ2VtZW50IGRhdGEgdHJhbnNmZXIgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogT24gY2FsbDogcEJ1ZiBidWZmZXIgbGVuZ3RoLiBPbiByZXR1cm46IHVzZWQgYnVmZmVyICovCitTS19VMzIgSW5zdGFuY2UsCS8qIEluc3RhbmNlICgxLi5uKSB0aGF0IGlzIHRvIGJlIHF1ZXJpZWQgb3IgLTEgKi8KK3Vuc2lnbmVkIGludCBUYWJsZUluZGV4LCAvKiBJbmRleCB0byB0aGUgSWQgdGFibGUgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwlpbnQJCVJldDsKKwl1bnNpZ25lZCBpbnQJUGh5c1BvcnRJbmRleDsKKwl1bnNpZ25lZCBpbnQJUGh5c1BvcnRNYXg7CisJU0tfRVZQQVJBCUV2ZW50UGFyYW07CisJU0tfVTMyCQlWYWwzMjsKKwlTS19VNjQJCVZhbDY0OworCisKKwkvKgorCSAqIENoZWNrIGluc3RhbmNlLiBPbmx5IHNpbmdsZSBpbnN0YW5jZSBPSURzIGFyZSBhbGxvd2VkIGhlcmUuCisJICovCisJaWYgKEluc3RhbmNlICE9IChTS19VMzIpKC0xKSAmJiBJbnN0YW5jZSAhPSAxKSB7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCk7CisJfQorCisJLyoKKwkgKiBQZXJmb3JtIHRoZSByZXF1ZXN0ZWQgYWN0aW9uLgorCSAqLworCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9HRVQpIHsKKworCQkvKgorCQkgKiBDaGVjayBpZiB0aGUgYnVmZmVyIGxlbmd0aCBpcyBsYXJnZSBlbm91Z2guCisJCSAqLworCisJCXN3aXRjaCAoSWQpIHsKKworCQljYXNlIE9JRF9TS0dFX1JMTVRfTU9ERToKKwkJY2FzZSBPSURfU0tHRV9STE1UX1BPUlRfQUNUSVZFOgorCQljYXNlIE9JRF9TS0dFX1JMTVRfUE9SVF9QUkVGRVJSRUQ6CisJCQlpZiAoKnBMZW4gPCBzaXplb2YoU0tfVTgpKSB7CisKKwkJCQkqcExlbiA9IHNpemVvZihTS19VOCk7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9STE1UX1BPUlRfTlVNQkVSOgorCQkJaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX1UzMikpIHsKKworCQkJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9STE1UX0NIQU5HRV9DVFM6CisJCWNhc2UgT0lEX1NLR0VfUkxNVF9DSEFOR0VfVElNRToKKwkJY2FzZSBPSURfU0tHRV9STE1UX0NIQU5HRV9FU1RJTToKKwkJY2FzZSBPSURfU0tHRV9STE1UX0NIQU5HRV9USFJFUzoKKwkJCWlmICgqcExlbiA8IHNpemVvZihTS19VNjQpKSB7CisKKwkJCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDM1LAorCQkJCVNLX1BOTUlfRVJSMDM1TVNHKTsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQorCisJCS8qCisJCSAqIFVwZGF0ZSBSTE1UIHN0YXRpc3RpYyBhbmQgaW5jcmVtZW50IHNlbWFwaG9yZXMgdG8gaW5kaWNhdGUKKwkJICogdGhhdCBhbiB1cGRhdGUgd2FzIGFscmVhZHkgZG9uZS4gTWF5YmUgUkxNVCB3aWxsIGhvbGQgaXRzCisJCSAqIHN0YXRpc3RpYyBhbHdheXMgdXAgdG8gZGF0ZSBzb21lIHRpbWUuIFRoZW4gd2UgY2FuCisJCSAqIHJlbW92ZSB0aGlzIHR5cGUgb2YgY2FsbC4KKwkJICovCisJCWlmICgoUmV0ID0gUmxtdFVwZGF0ZShwQUMsIElvQywgTmV0SW5kZXgpKSAhPSBTS19QTk1JX0VSUl9PSykgeworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFJldCk7CisJCX0KKwkJcEFDLT5Qbm1pLlJsbXRVcGRhdGVkRmxhZyArKzsKKworCQkvKgorCQkgKiBSZXRyaWV2ZSBWYWx1ZQorCQkqLworCQlzd2l0Y2ggKElkKSB7CisKKwkJY2FzZSBPSURfU0tHRV9STE1UX01PREU6CisJCQkqcEJ1ZiA9IChjaGFyKXBBQy0+UmxtdC5OZXRbMF0uUmxtdE1vZGU7CisJCQkqcExlbiA9IHNpemVvZihjaGFyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfUkxNVF9QT1JUX05VTUJFUjoKKwkJCVZhbDMyID0gKFNLX1UzMilwQUMtPkdJbmkuR0lNYWNzRm91bmQ7CisJCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBWYWwzMik7CisJCQkqcExlbiA9IHNpemVvZihTS19VMzIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9STE1UX1BPUlRfQUNUSVZFOgorCQkJKnBCdWYgPSAwOworCQkJLyoKKwkJCSAqIElmIG11bHRpcGxlIHBvcnRzIG1heSBiZWNvbWUgYWN0aXZlIHRoaXMgT0lECisJCQkgKiBkb2Vzbid0IG1ha2Ugc2Vuc2UgYW55IG1vcmUuIEEgbmV3IHZhcmlhYmxlIGluCisJCQkgKiB0aGUgcG9ydCBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGNyZWF0ZWQuIEhvd2V2ZXIsCisJCQkgKiBmb3IgdGhpcyB2YXJpYWJsZSB0aGUgZmlyc3QgYWN0aXZlIHBvcnQgaXMKKwkJCSAqIHJldHVybmVkLgorCQkJICovCisJCQlQaHlzUG9ydE1heCA9IHBBQy0+R0luaS5HSU1hY3NGb3VuZDsKKworCQkJZm9yIChQaHlzUG9ydEluZGV4ID0gMDsgUGh5c1BvcnRJbmRleCA8IFBoeXNQb3J0TWF4OworCQkJCVBoeXNQb3J0SW5kZXggKyspIHsKKworCQkJCWlmIChwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS5BY3RpdmVGbGFnKSB7CisKKwkJCQkJKnBCdWYgPSAoY2hhcilTS19QTk1JX1BPUlRfUEhZUzJMT0coUGh5c1BvcnRJbmRleCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCSpwTGVuID0gc2l6ZW9mKGNoYXIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9STE1UX1BPUlRfUFJFRkVSUkVEOgorCQkJKnBCdWYgPSAoY2hhcilTS19QTk1JX1BPUlRfUEhZUzJMT0cocEFDLT5SbG10Lk5ldFtOZXRJbmRleF0uUHJlZmVyZW5jZSk7CisJCQkqcExlbiA9IHNpemVvZihjaGFyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfUkxNVF9DSEFOR0VfQ1RTOgorCQkJVmFsNjQgPSBwQUMtPlBubWkuUmxtdENoYW5nZUN0czsKKwkJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0KTsKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1JMTVRfQ0hBTkdFX1RJTUU6CisJCQlWYWw2NCA9IHBBQy0+UG5taS5SbG10Q2hhbmdlVGltZTsKKwkJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYsIFZhbDY0KTsKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1U2NCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1JMTVRfQ0hBTkdFX0VTVElNOgorCQkJVmFsNjQgPSBwQUMtPlBubWkuUmxtdENoYW5nZUVzdGltYXRlLkVzdGltYXRlOworCQkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjQpOworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfUkxNVF9DSEFOR0VfVEhSRVM6CisJCQlWYWw2NCA9IHBBQy0+UG5taS5SbG10Q2hhbmdlVGhyZXNob2xkOworCQkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiwgVmFsNjQpOworCQkJKnBMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9FUlIsCisJCQkJKCJSbG10OiBVbmtub3duIE9JRCBzaG91bGQgYmUgaGFuZGxlZCBiZWZvcmUiKSk7CisKKwkJCXBBQy0+UG5taS5SbG10VXBkYXRlZEZsYWcgLS07CisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisKKwkJcEFDLT5Qbm1pLlJsbXRVcGRhdGVkRmxhZyAtLTsKKwl9CisJZWxzZSB7CisJCS8qIFBlcmZvcm0gYSBwcmVzZXQgb3Igc2V0ICovCisJCXN3aXRjaCAoSWQpIHsKKworCQljYXNlIE9JRF9TS0dFX1JMTVRfTU9ERToKKwkJCS8qIENoZWNrIGlmIHRoZSBidWZmZXIgbGVuZ3RoIGlzIHBsYXVzaWJsZSAqLworCQkJaWYgKCpwTGVuIDwgc2l6ZW9mKGNoYXIpKSB7CisKKwkJCQkqcExlbiA9IHNpemVvZihjaGFyKTsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCQl9CisJCQkvKiBDaGVjayBpZiB0aGUgdmFsdWUgcmFuZ2UgaXMgY29ycmVjdCAqLworCQkJaWYgKCpwTGVuICE9IHNpemVvZihjaGFyKSB8fAorCQkJCSgqcEJ1ZiAmIFNLX1BOTUlfUkxNVF9NT0RFX0NIS19MSU5LKSA9PSAwIHx8CisJCQkJKihTS19VOCAqKXBCdWYgPiAxNSkgeworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwkJCX0KKwkJCS8qIFRoZSBwcmVzZXQgZW5kcyBoZXJlICovCisJCQlpZiAoQWN0aW9uID09IFNLX1BOTUlfUFJFU0VUKSB7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7CisJCQl9CisJCQkvKiBTZW5kIGFuIGV2ZW50IHRvIFJMTVQgdG8gY2hhbmdlIHRoZSBtb2RlICovCisJCQlTS19NRU1TRVQoKGNoYXIgKikmRXZlbnRQYXJhbSwgMCwgc2l6ZW9mKEV2ZW50UGFyYW0pKTsKKwkJCUV2ZW50UGFyYW0uUGFyYTMyWzBdIHw9IChTS19VMzIpKCpwQnVmKTsKKwkJCUV2ZW50UGFyYW0uUGFyYTMyWzFdID0gMDsKKwkJCWlmIChTa1JsbXRFdmVudChwQUMsIElvQywgU0tfUkxNVF9NT0RFX0NIQU5HRSwKKwkJCQlFdmVudFBhcmFtKSA+IDApIHsKKworCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwMzcsCisJCQkJCVNLX1BOTUlfRVJSMDM3TVNHKTsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9STE1UX1BPUlRfUFJFRkVSUkVEOgorCQkJLyogQ2hlY2sgaWYgdGhlIGJ1ZmZlciBsZW5ndGggaXMgcGxhdXNpYmxlICovCisJCQlpZiAoKnBMZW4gPCBzaXplb2YoY2hhcikpIHsKKworCQkJCSpwTGVuID0gc2l6ZW9mKGNoYXIpOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJCX0KKwkJCS8qIENoZWNrIGlmIHRoZSB2YWx1ZSByYW5nZSBpcyBjb3JyZWN0ICovCisJCQlpZiAoKnBMZW4gIT0gc2l6ZW9mKGNoYXIpIHx8ICooU0tfVTggKilwQnVmID4KKwkJCQkoU0tfVTgpcEFDLT5HSW5pLkdJTWFjc0ZvdW5kKSB7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCQkJfQorCQkJLyogVGhlIHByZXNldCBlbmRzIGhlcmUgKi8KKwkJCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9QUkVTRVQpIHsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFNlbmQgYW4gZXZlbnQgdG8gUkxNVCBjaGFuZ2UgdGhlIHByZWZlcnJlZCBwb3J0LgorCQkJICogQSBwYXJhbSBvZiAtMSBtZWFucyBhdXRvbWF0aWMgbW9kZS4gUkxNVCB3aWxsCisJCQkgKiBtYWtlIHRoZSBkZWNpc2lvbiB3aGljaCBpcyB0aGUgcHJlZmVycmVkIHBvcnQuCisJCQkgKi8KKwkJCVNLX01FTVNFVCgoY2hhciAqKSZFdmVudFBhcmFtLCAwLCBzaXplb2YoRXZlbnRQYXJhbSkpOworCQkJRXZlbnRQYXJhbS5QYXJhMzJbMF0gPSAoU0tfVTMyKSgqcEJ1ZikgLSAxOworCQkJRXZlbnRQYXJhbS5QYXJhMzJbMV0gPSBOZXRJbmRleDsKKwkJCWlmIChTa1JsbXRFdmVudChwQUMsIElvQywgU0tfUkxNVF9QUkVGUE9SVF9DSEFOR0UsCisJCQkJRXZlbnRQYXJhbSkgPiAwKSB7CisKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDM4LAorCQkJCQlTS19QTk1JX0VSUjAzOE1TRyk7CisKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfUkxNVF9DSEFOR0VfVEhSRVM6CisJCQkvKiBDaGVjayBpZiB0aGUgYnVmZmVyIGxlbmd0aCBpcyBwbGF1c2libGUgKi8KKwkJCWlmICgqcExlbiA8IHNpemVvZihTS19VNjQpKSB7CisKKwkJCQkqcExlbiA9IHNpemVvZihTS19VNjQpOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBUaGVyZSBhcmUgbm90IG1hbnkgcmVzdHJpY3Rpb25zIHRvIHRoZQorCQkJICogdmFsdWUgcmFuZ2UuCisJCQkgKi8KKwkJCWlmICgqcExlbiAhPSBzaXplb2YoU0tfVTY0KSkgeworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwkJCX0KKwkJCS8qIEEgcHJlc2V0IGVuZHMgaGVyZSAqLworCQkJaWYgKEFjdGlvbiA9PSBTS19QTk1JX1BSRVNFVCkgeworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworCQkJfQorCQkJLyoKKwkJCSAqIFN0b3JlIHRoZSBuZXcgdGhyZXNob2xkLCB3aGljaCB3aWxsIGJlIHRha2VuCisJCQkgKiBvbiB0aGUgbmV4dCB0aW1lciBldmVudC4KKwkJCSAqLworCQkJU0tfUE5NSV9SRUFEX1U2NChwQnVmLCBWYWw2NCk7CisJCQlwQUMtPlBubWkuUmxtdENoYW5nZVRocmVzaG9sZCA9IFZhbDY0OworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCS8qIFRoZSBvdGhlciBPSURzIGFyZSBub3QgYmUgYWJsZSBmb3Igc2V0ICovCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1JFQURfT05MWSk7CisJCX0KKwl9CisKKwlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmxtdFN0YXQgLSBPSUQgaGFuZGxlciBmdW5jdGlvbiBvZiBPSURfU0tHRV9STE1UX1hYWCBtdWx0aXBsZSBpbnN0YW5jZS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVBlcmZvcm1zIGdldCByZXF1ZXN0cyBvbiBtdWx0aXBsZSBpbnN0YW5jZSB2YXJpYWJsZXMuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LICAgICAgICAgICBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgICAgICBBIGdlbmVyYWwgc2V2ZXJlIGludGVybmFsIGVycm9yIG9jY3VyZWQuCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4KKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBkYXRhIChlLmcuIGEgMzJiaXQgdmFsdWUgaXMKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQsIGJ1dCBhIDE2IGJpdCB2YWx1ZSB3YXMgcGFzc2VkKS4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCBUaGUgcmVxdWVzdGVkIGluc3RhbmNlIG9mIHRoZSBPSUQgZG9lc24ndAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCAoZS5nLiBwb3J0IGluc3RhbmNlIDMgb24gYSB0d28gcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuCisgKi8KK1BOTUlfU1RBVElDIGludCBSbG10U3RhdCgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitpbnQgQWN0aW9uLAkJLyogR0VUL1BSRVNFVC9TRVQgYWN0aW9uICovCitTS19VMzIgSWQsCQkvKiBPYmplY3QgSUQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQgKi8KK2NoYXIgKnBCdWYsCQkvKiBCdWZmZXIgdXNlZCBmb3IgdGhlIG1hbmFnZW1lbnQgZGF0YSB0cmFuc2ZlciAqLwordW5zaWduZWQgaW50ICpwTGVuLAkvKiBPbiBjYWxsOiBwQnVmIGJ1ZmZlciBsZW5ndGguIE9uIHJldHVybjogdXNlZCBidWZmZXIgKi8KK1NLX1UzMiBJbnN0YW5jZSwJLyogSW5zdGFuY2UgKDEuLm4pIHRoYXQgaXMgdG8gYmUgcXVlcmllZCBvciAtMSAqLwordW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIC8qIEluZGV4IHRvIHRoZSBJZCB0YWJsZSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbHdheXMgemVybyAqLworeworCXVuc2lnbmVkIGludAlQaHlzUG9ydE1heDsKKwl1bnNpZ25lZCBpbnQJUGh5c1BvcnRJbmRleDsKKwl1bnNpZ25lZCBpbnQJTGltaXQ7CisJdW5zaWduZWQgaW50CU9mZnNldDsKKwlpbnQJCVJldDsKKwlTS19VMzIJCVZhbDMyOworCVNLX1U2NAkJVmFsNjQ7CisKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgcG9ydCBpbmRleGVzIGZyb20gdGhlIGluc3RhbmNlLgorCSAqLworCVBoeXNQb3J0TWF4ID0gcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOworCisJaWYgKChJbnN0YW5jZSAhPSAoU0tfVTMyKSgtMSkpKSB7CisJCS8qIENoZWNrIGluc3RhbmNlIHJhbmdlICovCisJCWlmICgoSW5zdGFuY2UgPCAxKSB8fCAoSW5zdGFuY2UgPiBQaHlzUG9ydE1heCkpIHsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QpOworCQl9CisKKwkJLyogU2luZ2xlIG5ldCBtb2RlICovCisJCVBoeXNQb3J0SW5kZXggPSBJbnN0YW5jZSAtIDE7CisKKwkJLyogRHVhbCBuZXQgbW9kZSAqLworCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCVBoeXNQb3J0SW5kZXggPSBOZXRJbmRleDsKKwkJfQorCisJCS8qIEJvdGggbmV0IG1vZGVzICovCisJCUxpbWl0ID0gUGh5c1BvcnRJbmRleCArIDE7CisJfQorCWVsc2UgeworCQkvKiBTaW5nbGUgbmV0IG1vZGUgKi8KKwkJUGh5c1BvcnRJbmRleCA9IDA7CisJCUxpbWl0ID0gUGh5c1BvcnRNYXg7CisKKwkJLyogRHVhbCBuZXQgbW9kZSAqLworCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCVBoeXNQb3J0SW5kZXggPSBOZXRJbmRleDsKKwkJCUxpbWl0ID0gUGh5c1BvcnRJbmRleCArIDE7CisJCX0KKwl9CisKKwkvKgorCSAqIEN1cnJlbnRseSBvbmx5IGdldCByZXF1ZXN0cyBhcmUgYWxsb3dlZC4KKwkgKi8KKwlpZiAoQWN0aW9uICE9IFNLX1BOTUlfR0VUKSB7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1JFQURfT05MWSk7CisJfQorCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgYnVmZmVyIGxlbmd0aCBpcyBsYXJnZSBlbm91Z2guCisJICovCisJc3dpdGNoIChJZCkgeworCisJY2FzZSBPSURfU0tHRV9STE1UX1BPUlRfSU5ERVg6CisJY2FzZSBPSURfU0tHRV9STE1UX1NUQVRVUzoKKwkJaWYgKCpwTGVuIDwgKExpbWl0IC0gUGh5c1BvcnRJbmRleCkgKiBzaXplb2YoU0tfVTMyKSkgeworCisJCQkqcExlbiA9IChMaW1pdCAtIFBoeXNQb3J0SW5kZXgpICogc2l6ZW9mKFNLX1UzMik7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE9JRF9TS0dFX1JMTVRfVFhfSEVMTE9fQ1RTOgorCWNhc2UgT0lEX1NLR0VfUkxNVF9SWF9IRUxMT19DVFM6CisJY2FzZSBPSURfU0tHRV9STE1UX1RYX1NQX1JFUV9DVFM6CisJY2FzZSBPSURfU0tHRV9STE1UX1JYX1NQX0NUUzoKKwkJaWYgKCpwTGVuIDwgKExpbWl0IC0gUGh5c1BvcnRJbmRleCkgKiBzaXplb2YoU0tfVTY0KSkgeworCisJCQkqcExlbiA9IChMaW1pdCAtIFBoeXNQb3J0SW5kZXgpICogc2l6ZW9mKFNLX1U2NCk7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDM5LAorCQkJU0tfUE5NSV9FUlIwMzlNU0cpOworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKworCX0KKworCS8qCisJICogVXBkYXRlIHN0YXRpc3RpYyBhbmQgaW5jcmVtZW50IHNlbWFwaG9yZXMgdG8gaW5kaWNhdGUgdGhhdAorCSAqIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBkb25lLgorCSAqLworCWlmICgoUmV0ID0gUmxtdFVwZGF0ZShwQUMsIElvQywgTmV0SW5kZXgpKSAhPSBTS19QTk1JX0VSUl9PSykgeworCisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChSZXQpOworCX0KKwlwQUMtPlBubWkuUmxtdFVwZGF0ZWRGbGFnICsrOworCisJLyoKKwkgKiBHZXQgdmFsdWUKKwkgKi8KKwlPZmZzZXQgPSAwOworCWZvciAoOyBQaHlzUG9ydEluZGV4IDwgTGltaXQ7IFBoeXNQb3J0SW5kZXggKyspIHsKKworCQlzd2l0Y2ggKElkKSB7CisKKwkJY2FzZSBPSURfU0tHRV9STE1UX1BPUlRfSU5ERVg6CisJCQlWYWwzMiA9IFBoeXNQb3J0SW5kZXg7CisJCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmICsgT2Zmc2V0LCBWYWwzMik7CisJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1UzMik7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1JMTVRfU1RBVFVTOgorCQkJaWYgKHBBQy0+UmxtdC5Qb3J0W1BoeXNQb3J0SW5kZXhdLlBvcnRTdGF0ZSA9PQorCQkJCVNLX1JMTVRfUFNfSU5JVCB8fAorCQkJCXBBQy0+UmxtdC5Qb3J0W1BoeXNQb3J0SW5kZXhdLlBvcnRTdGF0ZSA9PQorCQkJCVNLX1JMTVRfUFNfRE9XTikgeworCisJCQkJVmFsMzIgPSBTS19QTk1JX1JMTVRfU1RBVFVTX0VSUk9SOworCQkJfQorCQkJZWxzZSBpZiAocEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uQWN0aXZlRmxhZykgeworCisJCQkJVmFsMzIgPSBTS19QTk1JX1JMTVRfU1RBVFVTX0FDVElWRTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCVZhbDMyID0gU0tfUE5NSV9STE1UX1NUQVRVU19TVEFOREJZOworCQkJfQorCQkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiArIE9mZnNldCwgVmFsMzIpOworCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VMzIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9STE1UX1RYX0hFTExPX0NUUzoKKwkJCVZhbDY0ID0gcEFDLT5SbG10LlBvcnRbUGh5c1BvcnRJbmRleF0uVHhIZWxsb0N0czsKKwkJCVNLX1BOTUlfU1RPUkVfVTY0KHBCdWYgKyBPZmZzZXQsIFZhbDY0KTsKKwkJCU9mZnNldCArPSBzaXplb2YoU0tfVTY0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfUkxNVF9SWF9IRUxMT19DVFM6CisJCQlWYWw2NCA9IHBBQy0+UmxtdC5Qb3J0W1BoeXNQb3J0SW5kZXhdLlJ4SGVsbG9DdHM7CisJCQlTS19QTk1JX1NUT1JFX1U2NChwQnVmICsgT2Zmc2V0LCBWYWw2NCk7CisJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1U2NCk7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1JMTVRfVFhfU1BfUkVRX0NUUzoKKwkJCVZhbDY0ID0gcEFDLT5SbG10LlBvcnRbUGh5c1BvcnRJbmRleF0uVHhTcEhlbGxvUmVxQ3RzOworCQkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiArIE9mZnNldCwgVmFsNjQpOworCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VNjQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9STE1UX1JYX1NQX0NUUzoKKwkJCVZhbDY0ID0gcEFDLT5SbG10LlBvcnRbUGh5c1BvcnRJbmRleF0uUnhTcEhlbGxvQ3RzOworCQkJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiArIE9mZnNldCwgVmFsNjQpOworCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VNjQpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0VSUiwKKwkJCQkoIlJsbXRTdGF0OiBVbmtub3duIE9JRCBzaG91bGQgYmUgZXJyb3JlZCBiZWZvcmUiKSk7CisKKwkJCXBBQy0+UG5taS5SbG10VXBkYXRlZEZsYWcgLS07CisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisJfQorCSpwTGVuID0gT2Zmc2V0OworCisJcEFDLT5Qbm1pLlJsbXRVcGRhdGVkRmxhZyAtLTsKKworCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNYWNQcml2YXRlQ29uZiAtIE9JRCBoYW5kbGVyIGZ1bmN0aW9uIG9mIE9JRHMgY29uY2VybmluZyB0aGUgY29uZmlndXJhdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJR2V0L1ByZXNldHMvU2V0cyB0aGUgT0lEcyBjb25jZXJuaW5nIHRoZSBjb25maWd1cmF0aW9uLgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3QgZGF0YSAoZS5nLiBhIDMyYml0IHZhbHVlIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkLCBidXQgYSAxNiBiaXQgdmFsdWUgd2FzIHBhc3NlZCkuCisgKglTS19QTk1JX0VSUl9CQURfVkFMVUUgICAgVGhlIHBhc3NlZCB2YWx1ZSBpcyBub3QgaW4gdGhlIHZhbGlkCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgcmFuZ2UuCisgKglTS19QTk1JX0VSUl9SRUFEX09OTFkgICAgVGhlIE9JRCBpcyByZWFkLW9ubHkgYW5kIGNhbm5vdCBiZSBzZXQuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBvZiB0aGUgT0lEIGRvZXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgKGUuZy4gcG9ydCBpbnN0YW5jZSAzIG9uIGEgdHdvIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLgorICovCitQTk1JX1NUQVRJQyBpbnQgTWFjUHJpdmF0ZUNvbmYoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworaW50IEFjdGlvbiwJCS8qIEdFVC9QUkVTRVQvU0VUIGFjdGlvbiAqLworU0tfVTMyIElkLAkJLyogT2JqZWN0IElEIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkICovCitjaGFyICpwQnVmLAkJLyogQnVmZmVyIHVzZWQgZm9yIHRoZSBtYW5hZ2VtZW50IGRhdGEgdHJhbnNmZXIgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogT24gY2FsbDogcEJ1ZiBidWZmZXIgbGVuZ3RoLiBPbiByZXR1cm46IHVzZWQgYnVmZmVyICovCitTS19VMzIgSW5zdGFuY2UsCS8qIEluc3RhbmNlICgxLi5uKSB0aGF0IGlzIHRvIGJlIHF1ZXJpZWQgb3IgLTEgKi8KK3Vuc2lnbmVkIGludCBUYWJsZUluZGV4LCAvKiBJbmRleCB0byB0aGUgSWQgdGFibGUgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwl1bnNpZ25lZCBpbnQJUGh5c1BvcnRNYXg7CisJdW5zaWduZWQgaW50CVBoeXNQb3J0SW5kZXg7CisJdW5zaWduZWQgaW50CUxvZ1BvcnRNYXg7CisJdW5zaWduZWQgaW50CUxvZ1BvcnRJbmRleDsKKwl1bnNpZ25lZCBpbnQJTGltaXQ7CisJdW5zaWduZWQgaW50CU9mZnNldDsKKwljaGFyCQlWYWw4OworCWNoYXIgCQkqcEJ1ZlB0cjsKKwlpbnQJCQlSZXQ7CisJU0tfRVZQQVJBCUV2ZW50UGFyYW07CisJU0tfVTMyCQlWYWwzMjsKKworCS8qCisJICogQ2FsY3VsYXRlIGluc3RhbmNlIGlmIHdpc2hlZC4gTUFDIGluZGV4IDAgaXMgdGhlIHZpcnR1YWwgTUFDLgorCSAqLworCVBoeXNQb3J0TWF4ID0gcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOworCUxvZ1BvcnRNYXggPSBTS19QTk1JX1BPUlRfUEhZUzJMT0coUGh5c1BvcnRNYXgpOworCisJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7IC8qIER1YWwgbmV0IG1vZGUgKi8KKwkJTG9nUG9ydE1heC0tOworCX0KKworCWlmICgoSW5zdGFuY2UgIT0gKFNLX1UzMikoLTEpKSkgeyAvKiBPbmx5IG9uZSBzcGVjaWZpYyBpbnN0YW5jZSBpcyBxdWVyaWVkICovCisJCS8qIENoZWNrIGluc3RhbmNlIHJhbmdlICovCisJCWlmICgoSW5zdGFuY2UgPCAxKSB8fCAoSW5zdGFuY2UgPiBMb2dQb3J0TWF4KSkgeworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCk7CisJCX0KKwkJTG9nUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0lOU1QyTE9HKEluc3RhbmNlKTsKKwkJTGltaXQgPSBMb2dQb3J0SW5kZXggKyAxOworCX0KKworCWVsc2UgeyAvKiBJbnN0YW5jZSA9PSAoU0tfVTMyKSgtMSksIGdldCBhbGwgSW5zdGFuY2VzIG9mIHRoYXQgT0lEICovCisKKwkJTG9nUG9ydEluZGV4ID0gMDsKKwkJTGltaXQgPSBMb2dQb3J0TWF4OworCX0KKworCS8qCisJICogUGVyZm9ybSBhY3Rpb24KKwkgKi8KKwlpZiAoQWN0aW9uID09IFNLX1BOTUlfR0VUKSB7CisKKwkJLyogQ2hlY2sgbGVuZ3RoICovCisJCXN3aXRjaCAoSWQpIHsKKworCQljYXNlIE9JRF9TS0dFX1BNRDoKKwkJY2FzZSBPSURfU0tHRV9DT05ORUNUT1I6CisJCWNhc2UgT0lEX1NLR0VfTElOS19DQVA6CisJCWNhc2UgT0lEX1NLR0VfTElOS19NT0RFOgorCQljYXNlIE9JRF9TS0dFX0xJTktfTU9ERV9TVEFUVVM6CisJCWNhc2UgT0lEX1NLR0VfTElOS19TVEFUVVM6CisJCWNhc2UgT0lEX1NLR0VfRkxPV0NUUkxfQ0FQOgorCQljYXNlIE9JRF9TS0dFX0ZMT1dDVFJMX01PREU6CisJCWNhc2UgT0lEX1NLR0VfRkxPV0NUUkxfU1RBVFVTOgorCQljYXNlIE9JRF9TS0dFX1BIWV9PUEVSQVRJT05fQ0FQOgorCQljYXNlIE9JRF9TS0dFX1BIWV9PUEVSQVRJT05fTU9ERToKKwkJY2FzZSBPSURfU0tHRV9QSFlfT1BFUkFUSU9OX1NUQVRVUzoKKwkJY2FzZSBPSURfU0tHRV9TUEVFRF9DQVA6CisJCWNhc2UgT0lEX1NLR0VfU1BFRURfTU9ERToKKwkJY2FzZSBPSURfU0tHRV9TUEVFRF9TVEFUVVM6CisjaWZkZWYgU0tfUEhZX0xQX01PREUKKwkJY2FzZSBPSURfU0tHRV9QSFlfTFBfTU9ERToKKyNlbmRpZgorCQkJaWYgKCpwTGVuIDwgKExpbWl0IC0gTG9nUG9ydEluZGV4KSAqIHNpemVvZihTS19VOCkpIHsKKworCQkJCSpwTGVuID0gKExpbWl0IC0gTG9nUG9ydEluZGV4KSAqIHNpemVvZihTS19VOCk7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQkJfQorCQkJYnJlYWs7CisKKyAgICAgICAgY2FzZSBPSURfU0tHRV9NVFU6CisgICAgICAgIGNhc2UgT0lEX1NLR0VfUEhZX1RZUEU6CisJCQlpZiAoKnBMZW4gPCAoTGltaXQgLSBMb2dQb3J0SW5kZXgpICogc2l6ZW9mKFNLX1UzMikpIHsKKworCQkJCSpwTGVuID0gKExpbWl0IC0gTG9nUG9ydEluZGV4KSAqIHNpemVvZihTS19VMzIpOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDQxLAorCQkJCVNLX1BOTUlfRVJSMDQxTVNHKTsKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKworCQkvKgorCQkgKiBVcGRhdGUgc3RhdGlzdGljIGFuZCBpbmNyZW1lbnQgc2VtYXBob3JlIHRvIGluZGljYXRlCisJCSAqIHRoYXQgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGRvbmUuCisJCSAqLworCQlpZiAoKFJldCA9IFNpcnFVcGRhdGUocEFDLCBJb0MpKSAhPSBTS19QTk1JX0VSUl9PSykgeworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFJldCk7CisJCX0KKwkJcEFDLT5Qbm1pLlNpcnFVcGRhdGVkRmxhZyArKzsKKworCQkvKgorCQkgKiBHZXQgdmFsdWUKKwkJICovCisJCU9mZnNldCA9IDA7CisJCWZvciAoOyBMb2dQb3J0SW5kZXggPCBMaW1pdDsgTG9nUG9ydEluZGV4ICsrKSB7CisKKwkJCXBCdWZQdHIgPSBwQnVmICsgT2Zmc2V0OworCQkJCisJCQlzd2l0Y2ggKElkKSB7CisKKwkJCWNhc2UgT0lEX1NLR0VfUE1EOgorCQkJCSpwQnVmUHRyID0gcEFDLT5Qbm1pLlBNRDsKKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJCWJyZWFrOworCisJCQljYXNlIE9JRF9TS0dFX0NPTk5FQ1RPUjoKKwkJCQkqcEJ1ZlB0ciA9IHBBQy0+UG5taS5Db25uZWN0b3I7CisJCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBPSURfU0tHRV9QSFlfVFlQRToKKwkJCQlpZiAoIXBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZykgeyAvKiBTaW5nbGVOZXRNb2RlICovCisJCQkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHBoeXNpY2FsIHBvcnRzICovCisJCQkJCQlQaHlzUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKAorCQkJCQkJCXBBQywgTG9nUG9ydEluZGV4KTsKKwkJCQkJCVZhbDMyID0gcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBoeVR5cGU7CisJCQkJCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmUHRyLCBWYWwzMik7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7IC8qIER1YWxOZXRNb2RlICovCisJCQkJCQorCQkJCQlWYWwzMiA9IHBBQy0+R0luaS5HUFtOZXRJbmRleF0uUGh5VHlwZTsKKwkJCQkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZlB0ciwgVmFsMzIpOworCQkJCX0KKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1UzMik7CisJCQkJYnJlYWs7CisKKyNpZmRlZiBTS19QSFlfTFBfTU9ERQorCQkJY2FzZSBPSURfU0tHRV9QSFlfTFBfTU9ERToKKwkJCQlpZiAoIXBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZykgeyAvKiBTaW5nbGVOZXRNb2RlICovCisJCQkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHBoeXNpY2FsIHBvcnRzICovCisJCQkJCQlQaHlzUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKHBBQywgTG9nUG9ydEluZGV4KTsKKwkJCQkJCVZhbDggPSAoU0tfVTgpIHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QUGh5UG93ZXJTdGF0ZTsKKwkJCQkJCSpwQnVmUHRyID0gVmFsODsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsgLyogRHVhbE5ldE1vZGUgKi8KKwkJCQkJCisJCQkJCVZhbDggPSAoU0tfVTgpIHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QUGh5UG93ZXJTdGF0ZTsKKwkJCQkJKnBCdWZQdHIgPSBWYWw4OworCQkJCX0KKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1U4KTsKKwkJCQlicmVhazsKKyNlbmRpZgorCisJCQljYXNlIE9JRF9TS0dFX0xJTktfQ0FQOgorCQkJCWlmICghcEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnKSB7IC8qIFNpbmdsZU5ldE1vZGUgKi8KKwkJCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHZpcnR1YWwgcG9ydCAqLworCQkJCQkJVmlydHVhbENvbmYocEFDLCBJb0MsIElkLCBwQnVmUHRyKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgcGh5c2ljYWwgcG9ydHMgKi8KKwkJCQkJCVBoeXNQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMoCisJCQkJCQkJcEFDLCBMb2dQb3J0SW5kZXgpOworCisJCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QTGlua0NhcDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsgLyogRHVhbE5ldE1vZGUgKi8KKwkJCQkJCisJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW05ldEluZGV4XS5QTGlua0NhcDsKKwkJCQl9CisJCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBPSURfU0tHRV9MSU5LX01PREU6CisJCQkJaWYgKCFwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcpIHsgLyogU2luZ2xlTmV0TW9kZSAqLworCQkJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgdmlydHVhbCBwb3J0ICovCisJCQkJCQlWaXJ0dWFsQ29uZihwQUMsIElvQywgSWQsIHBCdWZQdHIpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciBwaHlzaWNhbCBwb3J0cyAqLworCQkJCQkJUGh5c1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUygKKwkJCQkJCQlwQUMsIExvZ1BvcnRJbmRleCk7CisKKwkJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBMaW5rTW9kZUNvbmY7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7IC8qIER1YWxOZXRNb2RlICovCisJCQkJCisJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW05ldEluZGV4XS5QTGlua01vZGVDb25mOworCQkJCX0KKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJCWJyZWFrOworCisJCQljYXNlIE9JRF9TS0dFX0xJTktfTU9ERV9TVEFUVVM6CisJCQkJaWYgKCFwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcpIHsgLyogU2luZ2xlTmV0TW9kZSAqLworCQkJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgdmlydHVhbCBwb3J0ICovCisJCQkJCQlWaXJ0dWFsQ29uZihwQUMsIElvQywgSWQsIHBCdWZQdHIpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciBwaHlzaWNhbCBwb3J0ICovCisJCQkJCQlQaHlzUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKAorCQkJCQkJCXBBQywgTG9nUG9ydEluZGV4KTsKKworCQkJCQkJKnBCdWZQdHIgPQorCQkJCQkJCUNhbGN1bGF0ZUxpbmtNb2RlU3RhdHVzKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4KTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsgLyogRHVhbE5ldE1vZGUgKi8KKwkJCQkJCisJCQkJCSpwQnVmUHRyID0gQ2FsY3VsYXRlTGlua01vZGVTdGF0dXMocEFDLCBJb0MsIE5ldEluZGV4KTsKKwkJCQl9CisJCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBPSURfU0tHRV9MSU5LX1NUQVRVUzoKKwkJCQlpZiAoIXBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZykgeyAvKiBTaW5nbGVOZXRNb2RlICovCisJCQkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciB2aXJ0dWFsIHBvcnQgKi8KKwkJCQkJCVZpcnR1YWxDb25mKHBBQywgSW9DLCBJZCwgcEJ1ZlB0cik7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHBoeXNpY2FsIHBvcnRzICovCisJCQkJCQlQaHlzUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKAorCQkJCQkJCXBBQywgTG9nUG9ydEluZGV4KTsKKwkKKwkJCQkJCSpwQnVmUHRyID0gQ2FsY3VsYXRlTGlua1N0YXR1cyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7IC8qIER1YWxOZXRNb2RlICovCisKKwkJCQkJKnBCdWZQdHIgPSBDYWxjdWxhdGVMaW5rU3RhdHVzKHBBQywgSW9DLCBOZXRJbmRleCk7CisJCQkJfQorCQkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgT0lEX1NLR0VfRkxPV0NUUkxfQ0FQOgorCQkJCWlmICghcEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnKSB7IC8qIFNpbmdsZU5ldE1vZGUgKi8KKwkJCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHZpcnR1YWwgcG9ydCAqLworCQkJCQkJVmlydHVhbENvbmYocEFDLCBJb0MsIElkLCBwQnVmUHRyKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgcGh5c2ljYWwgcG9ydHMgKi8KKwkJCQkJCVBoeXNQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMoCisJCQkJCQkJcEFDLCBMb2dQb3J0SW5kZXgpOworCQorCQkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUEZsb3dDdHJsQ2FwOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeyAvKiBEdWFsTmV0TW9kZSAqLworCQkJCQorCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtOZXRJbmRleF0uUEZsb3dDdHJsQ2FwOworCQkJCX0KKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJCWJyZWFrOworCisJCQljYXNlIE9JRF9TS0dFX0ZMT1dDVFJMX01PREU6CisJCQkJaWYgKCFwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcpIHsgLyogU2luZ2xlTmV0TW9kZSAqLworCQkJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgdmlydHVhbCBwb3J0ICovCisJCQkJCQlWaXJ0dWFsQ29uZihwQUMsIElvQywgSWQsIHBCdWZQdHIpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciBwaHlzaWNhbCBwb3J0ICovCisJCQkJCQlQaHlzUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKAorCQkJCQkJCXBBQywgTG9nUG9ydEluZGV4KTsKKwkKKwkJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBGbG93Q3RybE1vZGU7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7IC8qIER1YWxOZXRNb2RlICovCisKKwkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbTmV0SW5kZXhdLlBGbG93Q3RybE1vZGU7CisJCQkJfQorCQkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgT0lEX1NLR0VfRkxPV0NUUkxfU1RBVFVTOgorCQkJCWlmICghcEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnKSB7IC8qIFNpbmdsZU5ldE1vZGUgKi8KKwkJCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHZpcnR1YWwgcG9ydCAqLworCQkJCQkJVmlydHVhbENvbmYocEFDLCBJb0MsIElkLCBwQnVmUHRyKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgcGh5c2ljYWwgcG9ydCAqLworCQkJCQkJUGh5c1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUygKKwkJCQkJCQlwQUMsIExvZ1BvcnRJbmRleCk7CisJCisJCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QRmxvd0N0cmxTdGF0dXM7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7IC8qIER1YWxOZXRNb2RlICovCisKKwkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbTmV0SW5kZXhdLlBGbG93Q3RybFN0YXR1czsKKwkJCQl9CisJCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBPSURfU0tHRV9QSFlfT1BFUkFUSU9OX0NBUDoKKwkJCQlpZiAoIXBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZykgeyAvKiBTaW5nbGVOZXRNb2RlICovCisJCQkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciB2aXJ0dWFsIHBvcnQgKi8KKwkJCQkJCVZpcnR1YWxDb25mKHBBQywgSW9DLCBJZCwgcEJ1ZlB0cik7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHBoeXNpY2FsIHBvcnRzICovCisJCQkJCQlQaHlzUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKAorCQkJCQkJCXBBQywgTG9nUG9ydEluZGV4KTsKKwkKKwkJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBNU0NhcDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsgLyogRHVhbE5ldE1vZGUgKi8KKwkJCQkKKwkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbTmV0SW5kZXhdLlBNU0NhcDsKKwkJCQl9CisJCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBPSURfU0tHRV9QSFlfT1BFUkFUSU9OX01PREU6CisJCQkJaWYgKCFwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcpIHsgLyogU2luZ2xlTmV0TW9kZSAqLworCQkJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgdmlydHVhbCBwb3J0ICovCisJCQkJCQlWaXJ0dWFsQ29uZihwQUMsIElvQywgSWQsIHBCdWZQdHIpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciBwaHlzaWNhbCBwb3J0ICovCisJCQkJCQlQaHlzUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKAorCQkJCQkJCXBBQywgTG9nUG9ydEluZGV4KTsKKworCQkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUE1TTW9kZTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsgLyogRHVhbE5ldE1vZGUgKi8KKwkJCQkKKwkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbTmV0SW5kZXhdLlBNU01vZGU7CisJCQkJfQorCQkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgT0lEX1NLR0VfUEhZX09QRVJBVElPTl9TVEFUVVM6CisJCQkJaWYgKCFwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcpIHsgLyogU2luZ2xlTmV0TW9kZSAqLworCQkJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgdmlydHVhbCBwb3J0ICovCisJCQkJCQlWaXJ0dWFsQ29uZihwQUMsIElvQywgSWQsIHBCdWZQdHIpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciBwaHlzaWNhbCBwb3J0ICovCisJCQkJCQlQaHlzUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKAorCQkJCQkJCXBBQywgTG9nUG9ydEluZGV4KTsKKwkKKwkJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBNU1N0YXR1czsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkKKwkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbTmV0SW5kZXhdLlBNU1N0YXR1czsKKwkJCQl9CisJCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBPSURfU0tHRV9TUEVFRF9DQVA6CisJCQkJaWYgKCFwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcpIHsgLyogU2luZ2xlTmV0TW9kZSAqLworCQkJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgdmlydHVhbCBwb3J0ICovCisJCQkJCQlWaXJ0dWFsQ29uZihwQUMsIElvQywgSWQsIHBCdWZQdHIpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciBwaHlzaWNhbCBwb3J0cyAqLworCQkJCQkJUGh5c1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUygKKwkJCQkJCQlwQUMsIExvZ1BvcnRJbmRleCk7CisJCisJCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QTGlua1NwZWVkQ2FwOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeyAvKiBEdWFsTmV0TW9kZSAqLworCQkJCQorCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtOZXRJbmRleF0uUExpbmtTcGVlZENhcDsKKwkJCQl9CisJCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBPSURfU0tHRV9TUEVFRF9NT0RFOgorCQkJCWlmICghcEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnKSB7IC8qIFNpbmdsZU5ldE1vZGUgKi8KKwkJCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHZpcnR1YWwgcG9ydCAqLworCQkJCQkJVmlydHVhbENvbmYocEFDLCBJb0MsIElkLCBwQnVmUHRyKTsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCS8qIEdldCB2YWx1ZSBmb3IgcGh5c2ljYWwgcG9ydCAqLworCQkJCQkJUGh5c1BvcnRJbmRleCA9IFNLX1BOTUlfUE9SVF9MT0cyUEhZUygKKwkJCQkJCQlwQUMsIExvZ1BvcnRJbmRleCk7CisJCisJCQkJCQkqcEJ1ZlB0ciA9IHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QTGlua1NwZWVkOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgeyAvKiBEdWFsTmV0TW9kZSAqLworCisJCQkJCSpwQnVmUHRyID0gcEFDLT5HSW5pLkdQW05ldEluZGV4XS5QTGlua1NwZWVkOworCQkJCX0KKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJCWJyZWFrOworCisJCQljYXNlIE9JRF9TS0dFX1NQRUVEX1NUQVRVUzoKKwkJCQlpZiAoIXBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZykgeyAvKiBTaW5nbGVOZXRNb2RlICovCisJCQkJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCQkJCQkJLyogR2V0IHZhbHVlIGZvciB2aXJ0dWFsIHBvcnQgKi8KKwkJCQkJCVZpcnR1YWxDb25mKHBBQywgSW9DLCBJZCwgcEJ1ZlB0cik7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQkvKiBHZXQgdmFsdWUgZm9yIHBoeXNpY2FsIHBvcnQgKi8KKwkJCQkJCVBoeXNQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMoCisJCQkJCQkJcEFDLCBMb2dQb3J0SW5kZXgpOworCQorCQkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUExpbmtTcGVlZFVzZWQ7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7IC8qIER1YWxOZXRNb2RlICovCisKKwkJCQkJKnBCdWZQdHIgPSBwQUMtPkdJbmkuR1BbTmV0SW5kZXhdLlBMaW5rU3BlZWRVc2VkOworCQkJCX0KKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJCWJyZWFrOworCQkJCisJCQljYXNlIE9JRF9TS0dFX01UVToKKwkJCQlWYWwzMiA9IFNLX0RSSVZFUl9HRVRfTVRVKHBBQywgSW9DLCBOZXRJbmRleCk7CisJCQkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZlB0ciwgVmFsMzIpOworCQkJCU9mZnNldCArPSBzaXplb2YoU0tfVTMyKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1BOTUksIFNLX0RCR0NBVF9FUlIsCisJCQkJCSgiTWFjUHJpdmF0ZUNvbmY6IFVua25vd24gT0lEIHNob3VsZCBiZSBoYW5kbGVkIGJlZm9yZSIpKTsKKworCQkJCXBBQy0+UG5taS5TaXJxVXBkYXRlZEZsYWcgLS07CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCX0KKwkJfQorCQkqcExlbiA9IE9mZnNldDsKKwkJcEFDLT5Qbm1pLlNpcnFVcGRhdGVkRmxhZyAtLTsKKworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKKwl9CisKKwkvKgorCSAqIEZyb20gaGVyZSBTRVQgb3IgUFJFU0VUIGFjdGlvbi4gQ2hlY2sgaWYgdGhlIHBhc3NlZAorCSAqIGJ1ZmZlciBsZW5ndGggaXMgcGxhdXNpYmxlLgorCSAqLworCXN3aXRjaCAoSWQpIHsKKworCWNhc2UgT0lEX1NLR0VfTElOS19NT0RFOgorCWNhc2UgT0lEX1NLR0VfRkxPV0NUUkxfTU9ERToKKwljYXNlIE9JRF9TS0dFX1BIWV9PUEVSQVRJT05fTU9ERToKKwljYXNlIE9JRF9TS0dFX1NQRUVEX01PREU6CisJCWlmICgqcExlbiA8IExpbWl0IC0gTG9nUG9ydEluZGV4KSB7CisKKwkJCSpwTGVuID0gTGltaXQgLSBMb2dQb3J0SW5kZXg7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJaWYgKCpwTGVuICE9IExpbWl0IC0gTG9nUG9ydEluZGV4KSB7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwkJfQorCQlicmVhazsKKworI2lmZGVmIFNLX1BIWV9MUF9NT0RFCisJY2FzZSBPSURfU0tHRV9QSFlfTFBfTU9ERToKKwkJaWYgKCpwTGVuIDwgTGltaXQgLSBMb2dQb3J0SW5kZXgpIHsKKworCQkJKnBMZW4gPSBMaW1pdCAtIExvZ1BvcnRJbmRleDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorCisJY2FzZSBPSURfU0tHRV9NVFU6CisJCWlmICgqcExlbiA8IHNpemVvZihTS19VMzIpKSB7CisKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJaWYgKCpwTGVuICE9IHNpemVvZihTS19VMzIpKSB7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwkJfQorCQlicmVhazsKKworICAgIGRlZmF1bHQ6CisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9SRUFEX09OTFkpOworCX0KKworCS8qCisJICogUGVyZm9ybSBwcmVzZXQgb3Igc2V0CisJICovCisJT2Zmc2V0ID0gMDsKKwlmb3IgKDsgTG9nUG9ydEluZGV4IDwgTGltaXQ7IExvZ1BvcnRJbmRleCArKykgeworCisJCXN3aXRjaCAoSWQpIHsKKworCQljYXNlIE9JRF9TS0dFX0xJTktfTU9ERToKKwkJCS8qIENoZWNrIHRoZSB2YWx1ZSByYW5nZSAqLworCQkJVmFsOCA9ICoocEJ1ZiArIE9mZnNldCk7CisJCQlpZiAoVmFsOCA9PSAwKSB7CisKKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKFZhbDggPCBTS19MTU9ERV9IQUxGIHx8CisJCQkJKExvZ1BvcnRJbmRleCAhPSAwICYmIFZhbDggPiBTS19MTU9ERV9BVVRPU0VOU0UpIHx8CisJCQkJKExvZ1BvcnRJbmRleCA9PSAwICYmIFZhbDggPiBTS19MTU9ERV9JTkRFVEVSTUlOQVRFRCkpIHsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJCQl9CisKKwkJCS8qIFRoZSBwcmVzZXQgZW5kcyBoZXJlICovCisJCQlpZiAoQWN0aW9uID09IFNLX1BOTUlfUFJFU0VUKSB7CisKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKKwkJCX0KKworCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisKKwkJCQkvKgorCQkJCSAqIFRoZSB2aXJ0dWFsIHBvcnQgY29uc2lzdHMgb2YgYWxsIGN1cnJlbnRseQorCQkJCSAqIGFjdGl2ZSBwb3J0cy4gRmluZCB0aGVtIGFuZCBzZW5kIGFuIGV2ZW50CisJCQkJICogd2l0aCB0aGUgbmV3IGxpbmsgbW9kZSB0byBTSVJRLgorCQkJCSAqLworCQkJCWZvciAoUGh5c1BvcnRJbmRleCA9IDA7CisJCQkJCVBoeXNQb3J0SW5kZXggPCBQaHlzUG9ydE1heDsKKwkJCQkJUGh5c1BvcnRJbmRleCArKykgeworCisJCQkJCWlmICghcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uCisJCQkJCQlBY3RpdmVGbGFnKSB7CisKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisKKwkJCQkJRXZlbnRQYXJhbS5QYXJhMzJbMF0gPSBQaHlzUG9ydEluZGV4OworCQkJCQlFdmVudFBhcmFtLlBhcmEzMlsxXSA9IChTS19VMzIpVmFsODsKKwkJCQkJaWYgKFNrR2VTaXJxRXZlbnQocEFDLCBJb0MsCisJCQkJCQlTS19IV0VWX1NFVF9MTU9ERSwKKwkJCQkJCUV2ZW50UGFyYW0pID4gMCkgeworCisJCQkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csCisJCQkJCQkJU0tfUE5NSV9FUlIwNDMsCisJCQkJCQkJU0tfUE5NSV9FUlIwNDNNU0cpOworCisJCQkJCQkqcExlbiA9IDA7CisJCQkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBTZW5kIGFuIGV2ZW50IHdpdGggdGhlIG5ldyBsaW5rIG1vZGUgdG8KKwkJCQkgKiB0aGUgU0lSUSBtb2R1bGUuCisJCQkJICovCisJCQkJRXZlbnRQYXJhbS5QYXJhMzJbMF0gPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMoCisJCQkJCXBBQywgTG9nUG9ydEluZGV4KTsKKwkJCQlFdmVudFBhcmFtLlBhcmEzMlsxXSA9IChTS19VMzIpVmFsODsKKwkJCQlpZiAoU2tHZVNpcnFFdmVudChwQUMsIElvQywgU0tfSFdFVl9TRVRfTE1PREUsCisJCQkJCUV2ZW50UGFyYW0pID4gMCkgeworCisJCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywKKwkJCQkJCVNLX1BOTUlfRVJSMDQzLAorCQkJCQkJU0tfUE5NSV9FUlIwNDNNU0cpOworCisJCQkJCSpwTGVuID0gMDsKKwkJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCQl9CisJCQl9CisJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9GTE9XQ1RSTF9NT0RFOgorCQkJLyogQ2hlY2sgdGhlIHZhbHVlIHJhbmdlICovCisJCQlWYWw4ID0gKihwQnVmICsgT2Zmc2V0KTsKKwkJCWlmIChWYWw4ID09IDApIHsKKworCQkJCU9mZnNldCArPSBzaXplb2YoY2hhcik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoVmFsOCA8IFNLX0ZMT1dfTU9ERV9OT05FIHx8CisJCQkJKExvZ1BvcnRJbmRleCAhPSAwICYmIFZhbDggPiBTS19GTE9XX01PREVfU1lNX09SX1JFTSkgfHwKKwkJCQkoTG9nUG9ydEluZGV4ID09IDAgJiYgVmFsOCA+IFNLX0ZMT1dfTU9ERV9JTkRFVEVSTUlOQVRFRCkpIHsKKworCQkJCSpwTGVuID0gMDsKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJCQl9CisKKwkJCS8qIFRoZSBwcmVzZXQgZW5kcyBoZXJlICovCisJCQlpZiAoQWN0aW9uID09IFNLX1BOTUlfUFJFU0VUKSB7CisKKwkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKKwkJCX0KKworCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisKKwkJCQkvKgorCQkJCSAqIFRoZSB2aXJ0dWFsIHBvcnQgY29uc2lzdHMgb2YgYWxsIGN1cnJlbnRseQorCQkJCSAqIGFjdGl2ZSBwb3J0cy4gRmluZCB0aGVtIGFuZCBzZW5kIGFuIGV2ZW50CisJCQkJICogd2l0aCB0aGUgbmV3IGZsb3cgY29udHJvbCBtb2RlIHRvIFNJUlEuCisJCQkJICovCisJCQkJZm9yIChQaHlzUG9ydEluZGV4ID0gMDsKKwkJCQkJUGh5c1BvcnRJbmRleCA8IFBoeXNQb3J0TWF4OworCQkJCQlQaHlzUG9ydEluZGV4ICsrKSB7CisKKwkJCQkJaWYgKCFwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS4KKwkJCQkJCUFjdGl2ZUZsYWcpIHsKKworCQkJCQkJY29udGludWU7CisJCQkJCX0KKworCQkJCQlFdmVudFBhcmFtLlBhcmEzMlswXSA9IFBoeXNQb3J0SW5kZXg7CisJCQkJCUV2ZW50UGFyYW0uUGFyYTMyWzFdID0gKFNLX1UzMilWYWw4OworCQkJCQlpZiAoU2tHZVNpcnFFdmVudChwQUMsIElvQywKKwkJCQkJCVNLX0hXRVZfU0VUX0ZMT1dNT0RFLAorCQkJCQkJRXZlbnRQYXJhbSkgPiAwKSB7CisKKwkJCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywKKwkJCQkJCQlTS19QTk1JX0VSUjA0NCwKKwkJCQkJCQlTS19QTk1JX0VSUjA0NE1TRyk7CisKKwkJCQkJCSpwTGVuID0gMDsKKwkJCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQkvKgorCQkJCSAqIFNlbmQgYW4gZXZlbnQgd2l0aCB0aGUgbmV3IGZsb3cgY29udHJvbAorCQkJCSAqIG1vZGUgdG8gdGhlIFNJUlEgbW9kdWxlLgorCQkJCSAqLworCQkJCUV2ZW50UGFyYW0uUGFyYTMyWzBdID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKAorCQkJCQlwQUMsIExvZ1BvcnRJbmRleCk7CisJCQkJRXZlbnRQYXJhbS5QYXJhMzJbMV0gPSAoU0tfVTMyKVZhbDg7CisJCQkJaWYgKFNrR2VTaXJxRXZlbnQocEFDLCBJb0MsCisJCQkJCVNLX0hXRVZfU0VUX0ZMT1dNT0RFLCBFdmVudFBhcmFtKQorCQkJCQk+IDApIHsKKworCQkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csCisJCQkJCQlTS19QTk1JX0VSUjA0NCwKKwkJCQkJCVNLX1BOTUlfRVJSMDQ0TVNHKTsKKworCQkJCQkqcExlbiA9IDA7CisJCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQkJfQorCQkJfQorCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfUEhZX09QRVJBVElPTl9NT0RFIDoKKwkJCS8qIENoZWNrIHRoZSB2YWx1ZSByYW5nZSAqLworCQkJVmFsOCA9ICoocEJ1ZiArIE9mZnNldCk7CisJCQlpZiAoVmFsOCA9PSAwKSB7CisJCQkJLyogbW9kZSBvZiB0aGlzIHBvcnQgcmVtYWlucyB1bmNoYW5nZWQgKi8KKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKFZhbDggPCBTS19NU19NT0RFX0FVVE8gfHwKKwkJCQkoTG9nUG9ydEluZGV4ICE9IDAgJiYgVmFsOCA+IFNLX01TX01PREVfU0xBVkUpIHx8CisJCQkJKExvZ1BvcnRJbmRleCA9PSAwICYmIFZhbDggPiBTS19NU19NT0RFX0lOREVURVJNSU5BVEVEKSkgeworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwkJCX0KKworCQkJLyogVGhlIHByZXNldCBlbmRzIGhlcmUgKi8KKwkJCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9QUkVTRVQpIHsKKworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworCQkJfQorCisJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKworCQkJCS8qCisJCQkJICogVGhlIHZpcnR1YWwgcG9ydCBjb25zaXN0cyBvZiBhbGwgY3VycmVudGx5CisJCQkJICogYWN0aXZlIHBvcnRzLiBGaW5kIHRoZW0gYW5kIHNlbmQgYW4gZXZlbnQKKwkJCQkgKiB3aXRoIG5ldyBtYXN0ZXIvc2xhdmUgKHJvbGUpIG1vZGUgdG8gU0lSUS4KKwkJCQkgKi8KKwkJCQlmb3IgKFBoeXNQb3J0SW5kZXggPSAwOworCQkJCQlQaHlzUG9ydEluZGV4IDwgUGh5c1BvcnRNYXg7CisJCQkJCVBoeXNQb3J0SW5kZXggKyspIHsKKworCQkJCQlpZiAoIXBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLgorCQkJCQkJQWN0aXZlRmxhZykgeworCisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCisJCQkJCUV2ZW50UGFyYW0uUGFyYTMyWzBdID0gUGh5c1BvcnRJbmRleDsKKwkJCQkJRXZlbnRQYXJhbS5QYXJhMzJbMV0gPSAoU0tfVTMyKVZhbDg7CisJCQkJCWlmIChTa0dlU2lycUV2ZW50KHBBQywgSW9DLAorCQkJCQkJU0tfSFdFVl9TRVRfUk9MRSwKKwkJCQkJCUV2ZW50UGFyYW0pID4gMCkgeworCisJCQkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csCisJCQkJCQkJU0tfUE5NSV9FUlIwNDIsCisJCQkJCQkJU0tfUE5NSV9FUlIwNDJNU0cpOworCisJCQkJCQkqcExlbiA9IDA7CisJCQkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBTZW5kIGFuIGV2ZW50IHdpdGggdGhlIG5ldyBtYXN0ZXIvc2xhdmUKKwkJCQkgKiAocm9sZSkgbW9kZSB0byB0aGUgU0lSUSBtb2R1bGUuCisJCQkJICovCisJCQkJRXZlbnRQYXJhbS5QYXJhMzJbMF0gPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMoCisJCQkJCXBBQywgTG9nUG9ydEluZGV4KTsKKwkJCQlFdmVudFBhcmFtLlBhcmEzMlsxXSA9IChTS19VMzIpVmFsODsKKwkJCQlpZiAoU2tHZVNpcnFFdmVudChwQUMsIElvQywKKwkJCQkJU0tfSFdFVl9TRVRfUk9MRSwgRXZlbnRQYXJhbSkgPiAwKSB7CisKKwkJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLAorCQkJCQkJU0tfUE5NSV9FUlIwNDIsCisJCQkJCQlTS19QTk1JX0VSUjA0Mk1TRyk7CisKKwkJCQkJKnBMZW4gPSAwOworCQkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJCX0KKwkJCX0KKworCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfU1BFRURfTU9ERToKKwkJCS8qIENoZWNrIHRoZSB2YWx1ZSByYW5nZSAqLworCQkJVmFsOCA9ICoocEJ1ZiArIE9mZnNldCk7CisJCQlpZiAoVmFsOCA9PSAwKSB7CisKKwkJCQlPZmZzZXQgKz0gc2l6ZW9mKGNoYXIpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKFZhbDggPCAoU0tfTFNQRUVEX0FVVE8pIHx8CisJCQkJKExvZ1BvcnRJbmRleCAhPSAwICYmIFZhbDggPiAoU0tfTFNQRUVEXzEwMDBNQlBTKSkgfHwKKwkJCQkoTG9nUG9ydEluZGV4ID09IDAgJiYgVmFsOCA+IChTS19MU1BFRURfSU5ERVRFUk1JTkFURUQpKSkgeworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwkJCX0KKworCQkJLyogVGhlIHByZXNldCBlbmRzIGhlcmUgKi8KKwkJCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9QUkVTRVQpIHsKKworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworCQkJfQorCisJCQlpZiAoTG9nUG9ydEluZGV4ID09IDApIHsKKworCQkJCS8qCisJCQkJICogVGhlIHZpcnR1YWwgcG9ydCBjb25zaXN0cyBvZiBhbGwgY3VycmVudGx5CisJCQkJICogYWN0aXZlIHBvcnRzLiBGaW5kIHRoZW0gYW5kIHNlbmQgYW4gZXZlbnQKKwkJCQkgKiB3aXRoIHRoZSBuZXcgZmxvdyBjb250cm9sIG1vZGUgdG8gU0lSUS4KKwkJCQkgKi8KKwkJCQlmb3IgKFBoeXNQb3J0SW5kZXggPSAwOworCQkJCQlQaHlzUG9ydEluZGV4IDwgUGh5c1BvcnRNYXg7CisJCQkJCVBoeXNQb3J0SW5kZXggKyspIHsKKworCQkJCQlpZiAoIXBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLkFjdGl2ZUZsYWcpIHsKKworCQkJCQkJY29udGludWU7CisJCQkJCX0KKworCQkJCQlFdmVudFBhcmFtLlBhcmEzMlswXSA9IFBoeXNQb3J0SW5kZXg7CisJCQkJCUV2ZW50UGFyYW0uUGFyYTMyWzFdID0gKFNLX1UzMilWYWw4OworCQkJCQlpZiAoU2tHZVNpcnFFdmVudChwQUMsIElvQywKKwkJCQkJCVNLX0hXRVZfU0VUX1NQRUVELAorCQkJCQkJRXZlbnRQYXJhbSkgPiAwKSB7CisKKwkJCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywKKwkJCQkJCQlTS19QTk1JX0VSUjA0NSwKKwkJCQkJCQlTS19QTk1JX0VSUjA0NU1TRyk7CisKKwkJCQkJCSpwTGVuID0gMDsKKwkJCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQkvKgorCQkJCSAqIFNlbmQgYW4gZXZlbnQgd2l0aCB0aGUgbmV3IGZsb3cgY29udHJvbAorCQkJCSAqIG1vZGUgdG8gdGhlIFNJUlEgbW9kdWxlLgorCQkJCSAqLworCQkJCUV2ZW50UGFyYW0uUGFyYTMyWzBdID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKAorCQkJCQlwQUMsIExvZ1BvcnRJbmRleCk7CisJCQkJRXZlbnRQYXJhbS5QYXJhMzJbMV0gPSAoU0tfVTMyKVZhbDg7CisJCQkJaWYgKFNrR2VTaXJxRXZlbnQocEFDLCBJb0MsCisJCQkJCVNLX0hXRVZfU0VUX1NQRUVELAorCQkJCQlFdmVudFBhcmFtKSA+IDApIHsKKworCQkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csCisJCQkJCQlTS19QTk1JX0VSUjA0NSwKKwkJCQkJCVNLX1BOTUlfRVJSMDQ1TVNHKTsKKworCQkJCQkqcExlbiA9IDA7CisJCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQkJfQorCQkJfQorCQkJT2Zmc2V0ICs9IHNpemVvZihjaGFyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfTVRVIDoKKwkJCS8qIENoZWNrIHRoZSB2YWx1ZSByYW5nZSAqLworCQkJVmFsMzIgPSAqKFNLX1UzMiopKHBCdWYgKyBPZmZzZXQpOworCQkJaWYgKFZhbDMyID09IDApIHsKKwkJCQkvKiBtdHUgb2YgdGhpcyBwb3J0IHJlbWFpbnMgdW5jaGFuZ2VkICovCisJCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VMzIpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKFNLX0RSSVZFUl9QUkVTRVRfTVRVKHBBQywgSW9DLCBOZXRJbmRleCwgVmFsMzIpICE9IDApIHsKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9CQURfVkFMVUUpOworCQkJfQorCisJCQkvKiBUaGUgcHJlc2V0IGVuZHMgaGVyZSAqLworCQkJaWYgKEFjdGlvbiA9PSBTS19QTk1JX1BSRVNFVCkgeworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworCQkJfQorCisJCQlpZiAoU0tfRFJJVkVSX1NFVF9NVFUocEFDLCBJb0MsIE5ldEluZGV4LCBWYWwzMikgIT0gMCkgeworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQl9CisKKwkJCU9mZnNldCArPSBzaXplb2YoU0tfVTMyKTsKKwkJCWJyZWFrOworCQkKKyNpZmRlZiBTS19QSFlfTFBfTU9ERQorCQljYXNlIE9JRF9TS0dFX1BIWV9MUF9NT0RFOgorCQkJLyogVGhlIHByZXNldCBlbmRzIGhlcmUgKi8KKwkJCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9QUkVTRVQpIHsKKworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworCQkJfQorCisJCQlpZiAoIXBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZykgeyAvKiBTaW5nbGVOZXRNb2RlICovCisJCQkJaWYgKExvZ1BvcnRJbmRleCA9PSAwKSB7CisJCQkJCU9mZnNldCA9IDA7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJLyogU2V0IHZhbHVlIGZvciBwaHlzaWNhbCBwb3J0cyAqLworCQkJCQlQaHlzUG9ydEluZGV4ID0gU0tfUE5NSV9QT1JUX0xPRzJQSFlTKHBBQywgTG9nUG9ydEluZGV4KTsKKworCQkJCQlzd2l0Y2ggKCoocEJ1ZiArIE9mZnNldCkpIHsKKwkJCQkJCWNhc2UgMDoKKwkJCQkJCQkvKiBJZiBMb3dQb3dlck1vZGUgaXMgYWN0aXZlLCB3ZSBjYW4gbGVhdmUgaXQuICovCisJCQkJCQkJaWYgKHBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XS5QUGh5UG93ZXJTdGF0ZSkgeworCisJCQkJCQkJCVZhbDMyID0gU2tHbUxlYXZlTG93UG93ZXJNb2RlKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4KTsKKwkJCQkJCQkJCisJCQkJCQkJCWlmIChwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUFBoeVBvd2VyU3RhdGUgPCAzKQl7CisJCQkJCQkJCQkKKwkJCQkJCQkJCVNrRHJ2SW5pdEFkYXB0ZXIocEFDKTsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZSB7CisJCQkJCQkJCSpwTGVuID0gMDsKKwkJCQkJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCQkJCQl9CisJCQkJCQljYXNlIDE6CisJCQkJCQljYXNlIDI6CisJCQkJCQljYXNlIDM6CisJCQkJCQljYXNlIDQ6CisJCQkJCQkJLyogSWYgbm8gTG93UG93ZXJNb2RlIGlzIGFjdGl2ZSwgd2UgY2FuIGVudGVyIGl0LiAqLworCQkJCQkJCWlmICghcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBQaHlQb3dlclN0YXRlKSB7CisKKwkJCQkJCQkJaWYgKCgqKHBCdWYgKyBPZmZzZXQpKSA8IDMpCXsKKwkJCQkJCQkJCisJCQkJCQkJCQlTa0RydkRlSW5pdEFkYXB0ZXIocEFDKTsKKwkJCQkJCQkJfQorCisJCQkJCQkJCVZhbDMyID0gU2tHbUVudGVyTG93UG93ZXJNb2RlKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LCAqcEJ1Zik7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIHsKKwkJCQkJCQkJKnBMZW4gPSAwOworCQkJCQkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJCQkJCX0KKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJKnBMZW4gPSAwOworCQkJCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UgeyAvKiBEdWFsTmV0TW9kZSAqLworCQkJCQorCQkJCXN3aXRjaCAoKihwQnVmICsgT2Zmc2V0KSkgeworCQkJCQljYXNlIDA6CisJCQkJCQkvKiBJZiB3ZSBhcmUgaW4gYSBMb3dQb3dlck1vZGUsIHdlIGNhbiBsZWF2ZSBpdC4gKi8KKwkJCQkJCWlmIChwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUFBoeVBvd2VyU3RhdGUpIHsKKworCQkJCQkJCVZhbDMyID0gU2tHbUxlYXZlTG93UG93ZXJNb2RlKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4KTsKKwkJCQkJCQkKKwkJCQkJCQlpZiAocEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBQaHlQb3dlclN0YXRlIDwgMykJeworCisJCQkJCQkJCVNrRHJ2SW5pdEFkYXB0ZXIocEFDKTsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQllbHNlIHsKKwkJCQkJCQkqcExlbiA9IDA7CisJCQkJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCQkJCX0KKwkJCQkJCisJCQkJCWNhc2UgMToKKwkJCQkJY2FzZSAyOgorCQkJCQljYXNlIDM6CisJCQkJCWNhc2UgNDoKKwkJCQkJCS8qIElmIHdlIGFyZSBub3QgYWxyZWFkeSBpbiBMb3dQb3dlck1vZGUsIHdlIGNhbiBlbnRlciBpdC4gKi8KKwkJCQkJCWlmICghcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBQaHlQb3dlclN0YXRlKSB7CisKKwkJCQkJCQlpZiAoKCoocEJ1ZiArIE9mZnNldCkpIDwgMykJeworCisJCQkJCQkJCVNrRHJ2RGVJbml0QWRhcHRlcihwQUMpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIHsKKworCQkJCQkJCQlWYWwzMiA9IFNrR21FbnRlckxvd1Bvd2VyTW9kZShwQUMsIElvQywgUGh5c1BvcnRJbmRleCwgKnBCdWYpOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgeworCQkJCQkJCSpwTGVuID0gMDsKKwkJCQkJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQkJCQkJfQorCQkJCQkKKwkJCQkJZGVmYXVsdDoKKwkJCQkJCSpwTGVuID0gMDsKKwkJCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfQkFEX1ZBTFVFKTsKKwkJCQl9CisJCQl9CisJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1U4KTsKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJZGVmYXVsdDoKKyAgICAgICAgICAgIFNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUE5NSSwgU0tfREJHQ0FUX0VSUiwKKyAgICAgICAgICAgICAgICAoIk1hY1ByaXZhdGVDb25mOiBVbmtub3duIE9JRCBzaG91bGQgYmUgaGFuZGxlZCBiZWZvcmUgc2V0IikpOworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisJfQorCisJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vbml0b3IgLSBPSUQgaGFuZGxlciBmdW5jdGlvbiBmb3IgUkxNVF9NT05JVE9SX1hYWAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJQmVjYXVzZSBSTE1UIGN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBtb25pdG9yaW5nIG9mCisgKglyZW1vdGUgYWRhcHRlciBjYXJkcywgd2UgcmV0dXJuIGFsd2F5cyBhbiBlbXB0eSB0YWJsZS4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4KKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IGRhdGEgKGUuZy4gYSAzMmJpdCB2YWx1ZSBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCwgYnV0IGEgMTYgYml0IHZhbHVlIHdhcyBwYXNzZWQpLgorICoJU0tfUE5NSV9FUlJfQkFEX1ZBTFVFICAgIFRoZSBwYXNzZWQgdmFsdWUgaXMgbm90IGluIHRoZSB2YWxpZAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHJhbmdlLgorICoJU0tfUE5NSV9FUlJfUkVBRF9PTkxZICAgIFRoZSBPSUQgaXMgcmVhZC1vbmx5IGFuZCBjYW5ub3QgYmUgc2V0LgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2Ugb2YgdGhlIE9JRCBkb2Vzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChlLmcuIHBvcnQgaW5zdGFuY2UgMyBvbiBhIHR3byBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci4KKyAqLworUE5NSV9TVEFUSUMgaW50IE1vbml0b3IoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworaW50IEFjdGlvbiwJCS8qIEdFVC9QUkVTRVQvU0VUIGFjdGlvbiAqLworU0tfVTMyIElkLAkJLyogT2JqZWN0IElEIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkICovCitjaGFyICpwQnVmLAkJLyogQnVmZmVyIHVzZWQgZm9yIHRoZSBtYW5hZ2VtZW50IGRhdGEgdHJhbnNmZXIgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogT24gY2FsbDogcEJ1ZiBidWZmZXIgbGVuZ3RoLiBPbiByZXR1cm46IHVzZWQgYnVmZmVyICovCitTS19VMzIgSW5zdGFuY2UsCS8qIEluc3RhbmNlICgxLi5uKSB0aGF0IGlzIHRvIGJlIHF1ZXJpZWQgb3IgLTEgKi8KK3Vuc2lnbmVkIGludCBUYWJsZUluZGV4LCAvKiBJbmRleCB0byB0aGUgSWQgdGFibGUgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKwl1bnNpZ25lZCBpbnQJSW5kZXg7CisJdW5zaWduZWQgaW50CUxpbWl0OworCXVuc2lnbmVkIGludAlPZmZzZXQ7CisJdW5zaWduZWQgaW50CUVudHJpZXM7CisKKwkKKwkvKgorCSAqIENhbGN1bGF0ZSBpbnN0YW5jZSBpZiB3aXNoZWQuCisJICovCisJLyogWFhYIE5vdCB5ZXQgaW1wbGVtZW50ZWQuIFJldHVybiBhbHdheXMgYW4gZW1wdHkgdGFibGUuICovCisJRW50cmllcyA9IDA7CisKKwlpZiAoKEluc3RhbmNlICE9IChTS19VMzIpKC0xKSkpIHsKKworCQlpZiAoKEluc3RhbmNlIDwgMSkgfHwgKEluc3RhbmNlID4gRW50cmllcykpIHsKKworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QpOworCQl9CisKKwkJSW5kZXggPSAodW5zaWduZWQgaW50KUluc3RhbmNlIC0gMTsKKwkJTGltaXQgPSAodW5zaWduZWQgaW50KUluc3RhbmNlOworCX0KKwllbHNlIHsKKwkJSW5kZXggPSAwOworCQlMaW1pdCA9IEVudHJpZXM7CisJfQorCisJLyoKKwkgKiBHZXQvU2V0IHZhbHVlCisJKi8KKwlpZiAoQWN0aW9uID09IFNLX1BOTUlfR0VUKSB7CisKKwkJZm9yIChPZmZzZXQ9MDsgSW5kZXggPCBMaW1pdDsgSW5kZXggKyspIHsKKworCQkJc3dpdGNoIChJZCkgeworCisJCQljYXNlIE9JRF9TS0dFX1JMTVRfTU9OSVRPUl9JTkRFWDoKKwkJCWNhc2UgT0lEX1NLR0VfUkxNVF9NT05JVE9SX0FERFI6CisJCQljYXNlIE9JRF9TS0dFX1JMTVRfTU9OSVRPUl9FUlJTOgorCQkJY2FzZSBPSURfU0tHRV9STE1UX01PTklUT1JfVElNRVNUQU1QOgorCQkJY2FzZSBPSURfU0tHRV9STE1UX01PTklUT1JfQURNSU46CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjA0NiwKKwkJCQkJU0tfUE5NSV9FUlIwNDZNU0cpOworCisJCQkJKnBMZW4gPSAwOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCQl9CisJCX0KKwkJKnBMZW4gPSBPZmZzZXQ7CisJfQorCWVsc2UgeworCQkvKiBPbmx5IE1PTklUT1JfQURNSU4gY2FuIGJlIHNldCAqLworCQlpZiAoSWQgIT0gT0lEX1NLR0VfUkxNVF9NT05JVE9SX0FETUlOKSB7CisKKwkJCSpwTGVuID0gMDsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfUkVBRF9PTkxZKTsKKwkJfQorCisJCS8qIENoZWNrIGlmIHRoZSBsZW5ndGggaXMgcGxhdXNpYmxlICovCisJCWlmICgqcExlbiA8IChMaW1pdCAtIEluZGV4KSkgeworCisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJLyogT2theSwgd2UgaGF2ZSBhIHdpZGUgdmFsdWUgcmFuZ2UgKi8KKwkJaWYgKCpwTGVuICE9IChMaW1pdCAtIEluZGV4KSkgeworCisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJCX0KKy8qCisJCWZvciAoT2Zmc2V0PTA7IEluZGV4IDwgTGltaXQ7IEluZGV4ICsrKSB7CisJCX0KKyovCisvKgorICogWFhYIE5vdCB5ZXQgaW1wbGVtZW50ZWQuIFJldHVybiBhbHdheXMgQkFEX1ZBTFVFLCBiZWNhdXNlIHRoZSB0YWJsZQorICogaXMgZW1wdHkuCisgKi8KKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0JBRF9WQUxVRSk7CisJfQorCisJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFZpcnR1YWxDb25mIC0gQ2FsY3VsYXRlcyB0aGUgdmFsdWVzIG9mIGNvbmZpZ3VyYXRpb24gT0lEcyBmb3IgdmlydHVhbCBwb3J0CisgKgorICogRGVzY3JpcHRpb246CisgKglXZSBoYW5kbGUgaGVyZSB0aGUgZ2V0IG9mIHRoZSBjb25maWd1cmF0aW9uIGdyb3VwIE9JRHMsIHdoaWNoIGFyZQorICoJYSBsaXR0bGUgYml0IGNvbXBsaWNhdGVkLiBUaGUgdmlydHVhbCBwb3J0IGNvbnNpc3RzIG9mIGFsbCBjdXJyZW50bHkKKyAqCWFjdGl2ZSBwaHlzaWNhbCBwb3J0cy4gSWYgbXVsdGlwbGUgcG9ydHMgYXJlIGFjdGl2ZSBhbmQgY29uZmlndXJlZAorICoJZGlmZmVyZW50bHkgd2UgZ2V0IGluIHNvbWUgdHJvdWJsZSB0byByZXR1cm4gYSBzaW5nbGUgdmFsdWUuIFNvIHdlCisgKglnZXQgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBhY3RpdmUgcG9ydCBhbmQgY29tcGFyZSBpdCB3aXRoIHRoYXQgb2YKKyAqCXRoZSBvdGhlciBhY3RpdmUgcG9ydHMuIElmIHRoZXkgYXJlIG5vdCB0aGUgc2FtZSwgd2UgcmV0dXJuIGEgdmFsdWUKKyAqCXRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIHN0YXRlIGlzIGluZGV0ZXJtaW5hdGVkLgorICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1BOTUlfU1RBVElDIHZvaWQgVmlydHVhbENvbmYoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworU0tfVTMyIElkLAkJLyogT2JqZWN0IElEIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkICovCitjaGFyICpwQnVmKQkJLyogQnVmZmVyIHVzZWQgZm9yIHRoZSBtYW5hZ2VtZW50IGRhdGEgdHJhbnNmZXIgKi8KK3sKKwl1bnNpZ25lZCBpbnQJUGh5c1BvcnRNYXg7CisJdW5zaWduZWQgaW50CVBoeXNQb3J0SW5kZXg7CisJU0tfVTgJCVZhbDg7CisJU0tfVTMyCQlWYWwzMjsKKwlTS19CT09MCQlQb3J0QWN0aXZlRmxhZzsKKwlTS19HRVBPUlQJKnBQcnQ7CisKKwkqcEJ1ZiA9IDA7CisJUG9ydEFjdGl2ZUZsYWcgPSBTS19GQUxTRTsKKwlQaHlzUG9ydE1heCA9IHBBQy0+R0luaS5HSU1hY3NGb3VuZDsKKwkKKwlmb3IgKFBoeXNQb3J0SW5kZXggPSAwOyBQaHlzUG9ydEluZGV4IDwgUGh5c1BvcnRNYXg7CisJCVBoeXNQb3J0SW5kZXggKyspIHsKKworCQlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQaHlzUG9ydEluZGV4XTsKKworCQkvKiBDaGVjayBpZiB0aGUgcGh5c2ljYWwgcG9ydCBpcyBhY3RpdmUgKi8KKwkJaWYgKCFwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS5BY3RpdmVGbGFnKSB7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJUG9ydEFjdGl2ZUZsYWcgPSBTS19UUlVFOworCisJCXN3aXRjaCAoSWQpIHsKKworCQljYXNlIE9JRF9TS0dFX1BIWV9UWVBFOgorCQkJLyogQ2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGFjdGl2ZSBwb3J0ICovCisJCQlpZiAoKnBCdWYgPT0gMCkgeworCQkJCVZhbDMyID0gcFBydC0+UGh5VHlwZTsKKwkJCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBWYWwzMik7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJY2FzZSBPSURfU0tHRV9MSU5LX0NBUDoKKworCQkJLyoKKwkJCSAqIERpZmZlcmVudCBjYXBhYmlsaXRpZXMgc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dAorCQkJICogaW4gdGhlIGNhc2Ugb2YgdGhlIGNhc2VzIE9SIHRoZW0gYWxsIHRvZ2V0aGVyLgorCQkJICogRnJvbSBhIGN1cmlvdXMgcG9pbnQgb2YgdmlldyB0aGUgdmlydHVhbCBwb3J0CisJCQkgKiBpcyBjYXBhYmxlIG9mIGFsbCBmb3VuZCBjYXBhYmlsaXRpZXMuCisJCQkgKi8KKwkJCSpwQnVmIHw9IHBQcnQtPlBMaW5rQ2FwOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9MSU5LX01PREU6CisJCQkvKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgYWN0aXZlIHBvcnQgKi8KKwkJCWlmICgqcEJ1ZiA9PSAwKSB7CisKKwkJCQkqcEJ1ZiA9IHBQcnQtPlBMaW5rTW9kZUNvbmY7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJZiB3ZSBmaW5kIGFuIGFjdGl2ZSBwb3J0IHdpdGggYSBkaWZmZXJlbnQgbGluaworCQkJICogbW9kZSB0aGFuIHRoZSBmaXJzdCBvbmUgd2UgcmV0dXJuIGEgdmFsdWUgdGhhdAorCQkJICogaW5kaWNhdGVzIHRoYXQgdGhlIGxpbmsgbW9kZSBpcyBpbmRldGVybWluYXRlZC4KKwkJCSAqLworCQkJaWYgKCpwQnVmICE9IHBQcnQtPlBMaW5rTW9kZUNvbmYpIHsKKworCQkJCSpwQnVmID0gU0tfTE1PREVfSU5ERVRFUk1JTkFURUQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX0xJTktfTU9ERV9TVEFUVVM6CisJCQkvKiBHZXQgdGhlIGxpbmsgbW9kZSBvZiB0aGUgcGh5c2ljYWwgcG9ydCAqLworCQkJVmFsOCA9IENhbGN1bGF0ZUxpbmtNb2RlU3RhdHVzKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4KTsKKworCQkJLyogQ2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGFjdGl2ZSBwb3J0ICovCisJCQlpZiAoKnBCdWYgPT0gMCkgeworCisJCQkJKnBCdWYgPSBWYWw4OworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogSWYgd2UgZmluZCBhbiBhY3RpdmUgcG9ydCB3aXRoIGEgZGlmZmVyZW50IGxpbmsKKwkJCSAqIG1vZGUgc3RhdHVzIHRoYW4gdGhlIGZpcnN0IG9uZSB3ZSByZXR1cm4gYSB2YWx1ZQorCQkJICogdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgbGluayBtb2RlIHN0YXR1cyBpcworCQkJICogaW5kZXRlcm1pbmF0ZWQuCisJCQkgKi8KKwkJCWlmICgqcEJ1ZiAhPSBWYWw4KSB7CisKKwkJCQkqcEJ1ZiA9IFNLX0xNT0RFX1NUQVRfSU5ERVRFUk1JTkFURUQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX0xJTktfU1RBVFVTOgorCQkJLyogR2V0IHRoZSBsaW5rIHN0YXR1cyBvZiB0aGUgcGh5c2ljYWwgcG9ydCAqLworCQkJVmFsOCA9IENhbGN1bGF0ZUxpbmtTdGF0dXMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgpOworCisJCQkvKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgYWN0aXZlIHBvcnQgKi8KKwkJCWlmICgqcEJ1ZiA9PSAwKSB7CisKKwkJCQkqcEJ1ZiA9IFZhbDg7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJZiB3ZSBmaW5kIGFuIGFjdGl2ZSBwb3J0IHdpdGggYSBkaWZmZXJlbnQgbGluaworCQkJICogc3RhdHVzIHRoYW4gdGhlIGZpcnN0IG9uZSwgd2UgcmV0dXJuIGEgdmFsdWUKKwkJCSAqIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGxpbmsgc3RhdHVzIGlzCisJCQkgKiBpbmRldGVybWluYXRlZC4KKwkJCSAqLworCQkJaWYgKCpwQnVmICE9IFZhbDgpIHsKKworCQkJCSpwQnVmID0gU0tfUE5NSV9STE1UX0xTVEFUX0lOREVURVJNSU5BVEVEOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9GTE9XQ1RSTF9DQVA6CisJCQkvKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgYWN0aXZlIHBvcnQgKi8KKwkJCWlmICgqcEJ1ZiA9PSAwKSB7CisKKwkJCQkqcEJ1ZiA9IHBQcnQtPlBGbG93Q3RybENhcDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIEZyb20gYSBjdXJpb3VzIHBvaW50IG9mIHZpZXcgdGhlIHZpcnR1YWwgcG9ydAorCQkJICogaXMgY2FwYWJsZSBvZiBhbGwgZm91bmQgY2FwYWJpbGl0aWVzLgorCQkJICovCisJCQkqcEJ1ZiB8PSBwUHJ0LT5QRmxvd0N0cmxDYXA7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX0ZMT1dDVFJMX01PREU6CisJCQkvKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgYWN0aXZlIHBvcnQgKi8KKwkJCWlmICgqcEJ1ZiA9PSAwKSB7CisKKwkJCQkqcEJ1ZiA9IHBQcnQtPlBGbG93Q3RybE1vZGU7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJZiB3ZSBmaW5kIGFuIGFjdGl2ZSBwb3J0IHdpdGggYSBkaWZmZXJlbnQgZmxvdworCQkJICogY29udHJvbCBtb2RlIHRoYW4gdGhlIGZpcnN0IG9uZSwgd2UgcmV0dXJuIGEgdmFsdWUKKwkJCSAqIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIG1vZGUgaXMgaW5kZXRlcm1pbmF0ZWQuCisJCQkgKi8KKwkJCWlmICgqcEJ1ZiAhPSBwUHJ0LT5QRmxvd0N0cmxNb2RlKSB7CisKKwkJCQkqcEJ1ZiA9IFNLX0ZMT1dfTU9ERV9JTkRFVEVSTUlOQVRFRDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfRkxPV0NUUkxfU1RBVFVTOgorCQkJLyogQ2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGFjdGl2ZSBwb3J0ICovCisJCQlpZiAoKnBCdWYgPT0gMCkgeworCisJCQkJKnBCdWYgPSBwUHJ0LT5QRmxvd0N0cmxTdGF0dXM7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJZiB3ZSBmaW5kIGFuIGFjdGl2ZSBwb3J0IHdpdGggYSBkaWZmZXJlbnQgZmxvdworCQkJICogY29udHJvbCBzdGF0dXMgdGhhbiB0aGUgZmlyc3Qgb25lLCB3ZSByZXR1cm4gYQorCQkJICogdmFsdWUgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RhdHVzIGlzCisJCQkgKiBpbmRldGVybWluYXRlZC4KKwkJCSAqLworCQkJaWYgKCpwQnVmICE9IHBQcnQtPlBGbG93Q3RybFN0YXR1cykgeworCisJCQkJKnBCdWYgPSBTS19GTE9XX1NUQVRfSU5ERVRFUk1JTkFURUQ7CisJCQl9CisJCQlicmVhazsKKwkJCisJCWNhc2UgT0lEX1NLR0VfUEhZX09QRVJBVElPTl9DQVA6CisJCQkvKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgYWN0aXZlIHBvcnQgKi8KKwkJCWlmICgqcEJ1ZiA9PSAwKSB7CisKKwkJCQkqcEJ1ZiA9IHBQcnQtPlBNU0NhcDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIEZyb20gYSBjdXJpb3VzIHBvaW50IG9mIHZpZXcgdGhlIHZpcnR1YWwgcG9ydAorCQkJICogaXMgY2FwYWJsZSBvZiBhbGwgZm91bmQgY2FwYWJpbGl0aWVzLgorCQkJICovCisJCQkqcEJ1ZiB8PSBwUHJ0LT5QTVNDYXA7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1BIWV9PUEVSQVRJT05fTU9ERToKKwkJCS8qIENoZWNrIGlmIGl0IGlzIHRoZSBmaXJzdCBhY3RpdmUgcG9ydCAqLworCQkJaWYgKCpwQnVmID09IDApIHsKKworCQkJCSpwQnVmID0gcFBydC0+UE1TTW9kZTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIElmIHdlIGZpbmQgYW4gYWN0aXZlIHBvcnQgd2l0aCBhIGRpZmZlcmVudCBtYXN0ZXIvCisJCQkgKiBzbGF2ZSBtb2RlIHRoYW4gdGhlIGZpcnN0IG9uZSwgd2UgcmV0dXJuIGEgdmFsdWUKKwkJCSAqIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIG1vZGUgaXMgaW5kZXRlcm1pbmF0ZWQuCisJCQkgKi8KKwkJCWlmICgqcEJ1ZiAhPSBwUHJ0LT5QTVNNb2RlKSB7CisKKwkJCQkqcEJ1ZiA9IFNLX01TX01PREVfSU5ERVRFUk1JTkFURUQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE9JRF9TS0dFX1BIWV9PUEVSQVRJT05fU1RBVFVTOgorCQkJLyogQ2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGFjdGl2ZSBwb3J0ICovCisJCQlpZiAoKnBCdWYgPT0gMCkgeworCisJCQkJKnBCdWYgPSBwUHJ0LT5QTVNTdGF0dXM7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJZiB3ZSBmaW5kIGFuIGFjdGl2ZSBwb3J0IHdpdGggYSBkaWZmZXJlbnQgbWFzdGVyLworCQkJICogc2xhdmUgc3RhdHVzIHRoYW4gdGhlIGZpcnN0IG9uZSwgd2UgcmV0dXJuIGEKKwkJCSAqIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIHN0YXR1cyBpcworCQkJICogaW5kZXRlcm1pbmF0ZWQuCisJCQkgKi8KKwkJCWlmICgqcEJ1ZiAhPSBwUHJ0LT5QTVNTdGF0dXMpIHsKKworCQkJCSpwQnVmID0gU0tfTVNfU1RBVF9JTkRFVEVSTUlOQVRFRDsKKwkJCX0KKwkJCWJyZWFrOworCQkKKwkJY2FzZSBPSURfU0tHRV9TUEVFRF9NT0RFOgorCQkJLyogQ2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGFjdGl2ZSBwb3J0ICovCisJCQlpZiAoKnBCdWYgPT0gMCkgeworCisJCQkJKnBCdWYgPSBwUHJ0LT5QTGlua1NwZWVkOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogSWYgd2UgZmluZCBhbiBhY3RpdmUgcG9ydCB3aXRoIGEgZGlmZmVyZW50IGZsb3cKKwkJCSAqIGNvbnRyb2wgbW9kZSB0aGFuIHRoZSBmaXJzdCBvbmUsIHdlIHJldHVybiBhIHZhbHVlCisJCQkgKiB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBtb2RlIGlzIGluZGV0ZXJtaW5hdGVkLgorCQkJICovCisJCQlpZiAoKnBCdWYgIT0gcFBydC0+UExpbmtTcGVlZCkgeworCisJCQkJKnBCdWYgPSBTS19MU1BFRURfSU5ERVRFUk1JTkFURUQ7CisJCQl9CisJCQlicmVhazsKKwkJCisJCWNhc2UgT0lEX1NLR0VfU1BFRURfU1RBVFVTOgorCQkJLyogQ2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGFjdGl2ZSBwb3J0ICovCisJCQlpZiAoKnBCdWYgPT0gMCkgeworCisJCQkJKnBCdWYgPSBwUHJ0LT5QTGlua1NwZWVkVXNlZDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIElmIHdlIGZpbmQgYW4gYWN0aXZlIHBvcnQgd2l0aCBhIGRpZmZlcmVudCBmbG93CisJCQkgKiBjb250cm9sIHN0YXR1cyB0aGFuIHRoZSBmaXJzdCBvbmUsIHdlIHJldHVybiBhCisJCQkgKiB2YWx1ZSB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBzdGF0dXMgaXMKKwkJCSAqIGluZGV0ZXJtaW5hdGVkLgorCQkJICovCisJCQlpZiAoKnBCdWYgIT0gcFBydC0+UExpbmtTcGVlZFVzZWQpIHsKKworCQkJCSpwQnVmID0gU0tfTFNQRUVEX1NUQVRfSU5ERVRFUk1JTkFURUQ7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogSWYgbm8gcG9ydCBpcyBhY3RpdmUgcmV0dXJuIGFuIGluZGV0ZXJtaW5hdGVkIGFuc3dlcgorCSAqLworCWlmICghUG9ydEFjdGl2ZUZsYWcpIHsKKworCQlzd2l0Y2ggKElkKSB7CisKKwkJY2FzZSBPSURfU0tHRV9MSU5LX0NBUDoKKwkJCSpwQnVmID0gU0tfTE1PREVfQ0FQX0lOREVURVJNSU5BVEVEOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9MSU5LX01PREU6CisJCQkqcEJ1ZiA9IFNLX0xNT0RFX0lOREVURVJNSU5BVEVEOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9MSU5LX01PREVfU1RBVFVTOgorCQkJKnBCdWYgPSBTS19MTU9ERV9TVEFUX0lOREVURVJNSU5BVEVEOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9MSU5LX1NUQVRVUzoKKwkJCSpwQnVmID0gU0tfUE5NSV9STE1UX0xTVEFUX0lOREVURVJNSU5BVEVEOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9GTE9XQ1RSTF9DQVA6CisJCWNhc2UgT0lEX1NLR0VfRkxPV0NUUkxfTU9ERToKKwkJCSpwQnVmID0gU0tfRkxPV19NT0RFX0lOREVURVJNSU5BVEVEOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9GTE9XQ1RSTF9TVEFUVVM6CisJCQkqcEJ1ZiA9IFNLX0ZMT1dfU1RBVF9JTkRFVEVSTUlOQVRFRDsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgT0lEX1NLR0VfUEhZX09QRVJBVElPTl9DQVA6CisJCQkqcEJ1ZiA9IFNLX01TX0NBUF9JTkRFVEVSTUlOQVRFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfUEhZX09QRVJBVElPTl9NT0RFOgorCQkJKnBCdWYgPSBTS19NU19NT0RFX0lOREVURVJNSU5BVEVEOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9QSFlfT1BFUkFUSU9OX1NUQVRVUzoKKwkJCSpwQnVmID0gU0tfTVNfU1RBVF9JTkRFVEVSTUlOQVRFRDsKKwkJCWJyZWFrOworCQljYXNlIE9JRF9TS0dFX1NQRUVEX0NBUDoKKwkJCSpwQnVmID0gU0tfTFNQRUVEX0NBUF9JTkRFVEVSTUlOQVRFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgT0lEX1NLR0VfU1BFRURfTU9ERToKKwkJCSpwQnVmID0gU0tfTFNQRUVEX0lOREVURVJNSU5BVEVEOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfU0tHRV9TUEVFRF9TVEFUVVM6CisJCQkqcEJ1ZiA9IFNLX0xTUEVFRF9TVEFUX0lOREVURVJNSU5BVEVEOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENhbGN1bGF0ZUxpbmtTdGF0dXMgLSBEZXRlcm1pbnMgdGhlIGxpbmsgc3RhdHVzIG9mIGEgcGh5c2ljYWwgcG9ydAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJRGV0ZXJtaW5zIHRoZSBsaW5rIHN0YXR1cyB0aGUgZm9sbG93aW5nIHdheToKKyAqCSAgTFNUQVRfUEhZX0RPV046ICBMaW5rIGlzIGRvd24KKyAqCSAgTFNUQVRfQVVUT05FRzogICBBdXRvLW5lZ290aWF0aW9uIGZhaWxlZAorICoJICBMU1RBVF9MT0dfRE9XTjogIExpbmsgaXMgdXAgYnV0IFJMTVQgZGlkIG5vdCB5ZXQgcHV0IHRoZSBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgbG9naWNhbGx5IHVwLgorICoJICBMU1RBVF9MT0dfVVA6ICAgIFJMTVQgbWFya2VkIHRoZSBwb3J0IGFzIHVwCisgKgorICogUmV0dXJuczoKKyAqCUxpbmsgc3RhdHVzIG9mIHBoeXNpY2FsIHBvcnQKKyAqLworUE5NSV9TVEFUSUMgU0tfVTggQ2FsY3VsYXRlTGlua1N0YXR1cygKK1NLX0FDICpwQUMsCQkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK3Vuc2lnbmVkIGludCBQaHlzUG9ydEluZGV4KQkvKiBQaHlzaWNhbCBwb3J0IGluZGV4ICovCit7CisJU0tfVTgJUmVzdWx0OworCisJaWYgKCFwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUEhXTGlua1VwKSB7CisKKwkJUmVzdWx0ID0gU0tfUE5NSV9STE1UX0xTVEFUX1BIWV9ET1dOOworCX0KKwllbHNlIGlmIChwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUEF1dG9OZWdGYWlsID4gMCkgeworCisJCVJlc3VsdCA9IFNLX1BOTUlfUkxNVF9MU1RBVF9BVVRPTkVHOworCQkJCX0KKwllbHNlIGlmICghcEFDLT5SbG10LlBvcnRbUGh5c1BvcnRJbmRleF0uUG9ydERvd24pIHsKKworCQlSZXN1bHQgPSBTS19QTk1JX1JMTVRfTFNUQVRfTE9HX1VQOworCX0KKwllbHNlIHsKKwkJUmVzdWx0ID0gU0tfUE5NSV9STE1UX0xTVEFUX0xPR19ET1dOOworCX0KKworCXJldHVybiAoUmVzdWx0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ2FsY3VsYXRlTGlua01vZGVTdGF0dXMgLSBEZXRlcm1pbnMgdGhlIGxpbmsgbW9kZSBzdGF0dXMgb2YgYSBwaHlzLiBwb3J0CisgKgorICogRGVzY3JpcHRpb246CisgKglUaGUgQ09NTU9OIG1vZHVsZSBvbmx5IHRlbGxzIHVzIGlmIHRoZSBtb2RlIGlzIGhhbGYgb3IgZnVsbCBkdXBsZXguCisgKglCdXQgaW4gdGhlIGRlY2FkZSBvZiBhdXRvIHNlbnNpbmcgaXQgaXMgdXNlZnVsbCBmb3IgdGhlIHVzZXIgdG8KKyAqCWtub3cgaWYgdGhlIG1vZGUgd2FzIG5lZ290aWF0ZWQgb3IgZm9yY2VkLiBUaGVyZWZvcmUgd2UgaGF2ZSBhCisgKglsb29rIHRvIHRoZSBtb2RlLCB3aGljaCB3YXMgbGFzdCB1c2VkIGJ5IHRoZSBuZWdvdGlhdGlvbiBwcm9jZXNzLgorICoKKyAqIFJldHVybnM6CisgKglUaGUgbGluayBtb2RlIHN0YXR1cworICovCitQTk1JX1NUQVRJQyBTS19VOCBDYWxjdWxhdGVMaW5rTW9kZVN0YXR1cygKK1NLX0FDICpwQUMsCQkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK3Vuc2lnbmVkIGludCBQaHlzUG9ydEluZGV4KQkvKiBQaHlzaWNhbCBwb3J0IGluZGV4ICovCit7CisJU0tfVTgJUmVzdWx0OworCisJLyogR2V0IHRoZSBjdXJyZW50IG1vZGUsIHdoaWNoIGNhbiBiZSBmdWxsIG9yIGhhbGYgZHVwbGV4ICovCisJUmVzdWx0ID0gcEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBMaW5rTW9kZVN0YXR1czsKKworCS8qIENoZWNrIGlmIG5vIHZhbGlkIG1vZGUgY291bGQgYmUgZm91bmQgKGxpbmsgaXMgZG93bikgKi8KKwlpZiAoUmVzdWx0IDwgU0tfTE1PREVfU1RBVF9IQUxGKSB7CisKKwkJUmVzdWx0ID0gU0tfTE1PREVfU1RBVF9VTktOT1dOOworCX0KKwllbHNlIGlmIChwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF0uUExpbmtNb2RlID49IFNLX0xNT0RFX0FVVE9IQUxGKSB7CisKKwkJLyoKKwkJICogQXV0by1uZWdvdGlhdGlvbiB3YXMgdXNlZCB0byBicmluZyB1cCB0aGUgbGluay4gQ2hhbmdlCisJCSAqIHRoZSBhbHJlYWR5IGZvdW5kIGR1cGxleCBzdGF0dXMgdGhhdCBpdCBpbmRpY2F0ZXMKKwkJICogYXV0by1uZWdvdGlhdGlvbiB3YXMgaW52b2x2ZWQuCisJCSAqLworCQlpZiAoUmVzdWx0ID09IFNLX0xNT0RFX1NUQVRfSEFMRikgeworCisJCQlSZXN1bHQgPSBTS19MTU9ERV9TVEFUX0FVVE9IQUxGOworCQl9CisJCWVsc2UgaWYgKFJlc3VsdCA9PSBTS19MTU9ERV9TVEFUX0ZVTEwpIHsKKworCQkJUmVzdWx0ID0gU0tfTE1PREVfU1RBVF9BVVRPRlVMTDsKKwkJfQorCX0KKworCXJldHVybiAoUmVzdWx0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR2V0VnBkS2V5QXJyIC0gT2J0YWluIGFuIGFycmF5IG9mIFZQRCBrZXlzCisgKgorICogRGVzY3JpcHRpb246CisgKglSZWFkIHRoZSBWUEQga2V5cyBhbmQgYnVpbGQgYW4gYXJyYXkgb2YgVlBEIGtleXMsIHdoaWNoIGFyZQorICoJZWFzeSB0byBhY2Nlc3MuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LCSAgICAgVGFzayBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgU29tZXRoaW5nIHdlbnQgd3JvbmcuCisgKi8KK1BOTUlfU1RBVElDIGludCBHZXRWcGRLZXlBcnIoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworY2hhciAqcEtleUFyciwJCS8qIFB0ciBLZXlBcnJheSAqLwordW5zaWduZWQgaW50IEtleUFyckxlbiwJLyogTGVuZ3RoIG9mIGFycmF5IGluIGJ5dGVzICovCit1bnNpZ25lZCBpbnQgKnBLZXlObykJLyogTnVtYmVyIG9mIGtleXMgKi8KK3sKKwl1bnNpZ25lZCBpbnQJCUJ1ZktleXNMZW4gPSBTS19QTk1JX1ZQRF9CVUZTSVpFOworCWNoYXIJCQlCdWZLZXlzW1NLX1BOTUlfVlBEX0JVRlNJWkVdOworCXVuc2lnbmVkIGludAkJU3RhcnRPZmZzZXQ7CisJdW5zaWduZWQgaW50CQlPZmZzZXQ7CisJaW50CQkJSW5kZXg7CisJaW50CQkJUmV0OworCisKKwlTS19NRU1TRVQocEtleUFyciwgMCwgS2V5QXJyTGVuKTsKKworCS8qCisJICogR2V0IFZQRCBrZXkgbGlzdAorCSAqLworCVJldCA9IFZwZEtleXMocEFDLCBJb0MsIChjaGFyICopJkJ1ZktleXMsIChpbnQgKikmQnVmS2V5c0xlbiwKKwkJKGludCAqKXBLZXlObyk7CisJaWYgKFJldCA+IDApIHsKKworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDE0LAorCQkJU0tfUE5NSV9FUlIwMTRNU0cpOworCisJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJfQorCS8qIElmIG5vIGtleXMgYXJlIGF2YWlsYWJsZSByZXR1cm4gbm93ICovCisJaWYgKCpwS2V5Tm8gPT0gMCB8fCBCdWZLZXlzTGVuID09IDApIHsKKworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKKwl9CisJLyoKKwkgKiBJZiB0aGUga2V5IGxpc3QgaXMgdG9vIGxvbmcgZm9yIHVzIHRydW5jIGl0IGFuZCBnaXZlIGEKKwkgKiBlcnJvcmxvZyBub3RpZmljYXRpb24uIFRoaXMgY2FzZSBzaG91bGQgbm90IGhhcHBlbiBiZWNhdXNlCisJICogdGhlIG1heGltdW0gbnVtYmVyIG9mIGtleXMgaXMgbGltaXRlZCBkdWUgdG8gUkFNIGxpbWl0YXRpb25zCisJICovCisJaWYgKCpwS2V5Tm8gPiBTS19QTk1JX1ZQRF9FTlRSSUVTKSB7CisKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS19QTk1JX0VSUjAxNSwKKwkJCVNLX1BOTUlfRVJSMDE1TVNHKTsKKworCQkqcEtleU5vID0gU0tfUE5NSV9WUERfRU5UUklFUzsKKwl9CisKKwkvKgorCSAqIE5vdyBidWlsZCBhbiBhcnJheSBvZiBmaXhlZCBzdHJpbmcgbGVuZ3RoIHNpemUgYW5kIGNvcHkKKwkgKiB0aGUga2V5cyB0b2dldGhlci4KKwkgKi8KKwlmb3IgKEluZGV4ID0gMCwgU3RhcnRPZmZzZXQgPSAwLCBPZmZzZXQgPSAwOyBPZmZzZXQgPCBCdWZLZXlzTGVuOworCQlPZmZzZXQgKyspIHsKKworCQlpZiAoQnVmS2V5c1tPZmZzZXRdICE9IDApIHsKKworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoT2Zmc2V0IC0gU3RhcnRPZmZzZXQgPiBTS19QTk1JX1ZQRF9LRVlfU0laRSkgeworCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDE2LAorCQkJCVNLX1BOTUlfRVJSMDE2TVNHKTsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKworCQlTS19TVFJOQ1BZKHBLZXlBcnIgKyBJbmRleCAqIFNLX1BOTUlfVlBEX0tFWV9TSVpFLAorCQkJJkJ1ZktleXNbU3RhcnRPZmZzZXRdLCBTS19QTk1JX1ZQRF9LRVlfU0laRSk7CisKKwkJSW5kZXggKys7CisJCVN0YXJ0T2Zmc2V0ID0gT2Zmc2V0ICsgMTsKKwl9CisKKwkvKiBMYXN0IGtleSBub3QgemVybyB0ZXJtaW5hdGVkPyBHZXQgaXQgYW55d2F5ICovCisJaWYgKFN0YXJ0T2Zmc2V0IDwgT2Zmc2V0KSB7CisKKwkJU0tfU1RSTkNQWShwS2V5QXJyICsgSW5kZXggKiBTS19QTk1JX1ZQRF9LRVlfU0laRSwKKwkJCSZCdWZLZXlzW1N0YXJ0T2Zmc2V0XSwgU0tfUE5NSV9WUERfS0VZX1NJWkUpOworCX0KKworCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTaXJxVXBkYXRlIC0gTGV0IHRoZSBTSVJRIHVwZGF0ZSBpdHMgaW50ZXJuYWwgdmFsdWVzCisgKgorICogRGVzY3JpcHRpb246CisgKglKdXN0IHRvIGJlIHN1cmUgdGhhdCB0aGUgU0lSUSBtb2R1bGUgaG9sZHMgaXRzIGludGVybmFsIGRhdGEKKyAqCXN0cnVjdHVyZXMgdXAgdG8gZGF0ZSwgd2Ugc2VuZCBhbiB1cGRhdGUgZXZlbnQgYmVmb3JlIHdlIG1ha2UKKyAqCWFueSBhY2Nlc3MuCisgKgorICogUmV0dXJuczoKKyAqCVNLX1BOTUlfRVJSX09LCSAgICAgVGFzayBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgU29tZXRoaW5nIHdlbnQgd3JvbmcuCisgKi8KK1BOTUlfU1RBVElDIGludCBTaXJxVXBkYXRlKAorU0tfQUMgKnBBQywJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MpCS8qIElPIGNvbnRleHQgaGFuZGxlICovCit7CisJU0tfRVZQQVJBCUV2ZW50UGFyYW07CisKKworCS8qIFdhcyB0aGUgbW9kdWxlIGFscmVhZHkgdXBkYXRlZCBkdXJpbmcgdGhlIGN1cnJlbnQgUE5NSSBjYWxsPyAqLworCWlmIChwQUMtPlBubWkuU2lycVVwZGF0ZWRGbGFnID4gMCkgeworCisJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworCX0KKworCS8qIFNlbmQgYW4gc3luY2hyb251b3VzIHVwZGF0ZSBldmVudCB0byB0aGUgbW9kdWxlICovCisJU0tfTUVNU0VUKChjaGFyICopJkV2ZW50UGFyYW0sIDAsIHNpemVvZihFdmVudFBhcmFtKSk7CisJaWYgKFNrR2VTaXJxRXZlbnQocEFDLCBJb0MsIFNLX0hXRVZfVVBEQVRFX1NUQVQsIEV2ZW50UGFyYW0pID4gMCkgeworCisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tfUE5NSV9FUlIwNDcsCisJCQlTS19QTk1JX0VSUjA0N01TRyk7CisKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwl9CisKKwlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmxtdFVwZGF0ZSAtIExldCB0aGUgUkxNVCB1cGRhdGUgaXRzIGludGVybmFsIHZhbHVlcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJSnVzdCB0byBiZSBzdXJlIHRoYXQgdGhlIFJMTVQgbW9kdWxlIGhvbGRzIGl0cyBpbnRlcm5hbCBkYXRhCisgKglzdHJ1Y3R1cmVzIHVwIHRvIGRhdGUsIHdlIHNlbmQgYW4gdXBkYXRlIGV2ZW50IGJlZm9yZSB3ZSBtYWtlCisgKglhbnkgYWNjZXNzLgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSwkgICAgIFRhc2sgc3VjY2Vzc2Z1bGx5IHBlcmZvcm1lZC4KKyAqCVNLX1BOTUlfRVJSX0dFTkVSQUwgIFNvbWV0aGluZyB3ZW50IHdyb25nLgorICovCitQTk1JX1NUQVRJQyBpbnQgUmxtdFVwZGF0ZSgKK1NLX0FDICpwQUMsCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbGx3YXlzIHplcm8gKi8KK3sKKwlTS19FVlBBUkEJRXZlbnRQYXJhbTsKKworCisJLyogV2FzIHRoZSBtb2R1bGUgYWxyZWFkeSB1cGRhdGVkIGR1cmluZyB0aGUgY3VycmVudCBQTk1JIGNhbGw/ICovCisJaWYgKHBBQy0+UG5taS5SbG10VXBkYXRlZEZsYWcgPiAwKSB7CisKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7CisJfQorCisJLyogU2VuZCBhbiBzeW5jaHJvbnVvdXMgdXBkYXRlIGV2ZW50IHRvIHRoZSBtb2R1bGUgKi8KKwlTS19NRU1TRVQoKGNoYXIgKikmRXZlbnRQYXJhbSwgMCwgc2l6ZW9mKEV2ZW50UGFyYW0pKTsKKwlFdmVudFBhcmFtLlBhcmEzMlswXSA9IE5ldEluZGV4OworCUV2ZW50UGFyYW0uUGFyYTMyWzFdID0gKFNLX1UzMiktMTsKKwlpZiAoU2tSbG10RXZlbnQocEFDLCBJb0MsIFNLX1JMTVRfU1RBVFNfVVBEQVRFLCBFdmVudFBhcmFtKSA+IDApIHsKKworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDQ4LAorCQkJU0tfUE5NSV9FUlIwNDhNU0cpOworCisJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJfQorCisJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1hY1VwZGF0ZSAtIEZvcmNlIHRoZSBYTUFDIHRvIG91dHB1dCB0aGUgY3VycmVudCBzdGF0aXN0aWMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoZSBYTUFDIGhvbGRzIGl0cyBzdGF0aXN0aWMgaW50ZXJuYWxseS4gVG8gb2J0YWluIHRoZSBjdXJyZW50CisgKgl2YWx1ZXMgd2UgbXVzdCBzZW5kIGEgY29tbWFuZCBzbyB0aGF0IHRoZSBzdGF0aXN0aWMgZGF0YSB3aWxsCisgKgliZSB3cml0dGVuIHRvIGEgcHJlZGVmaW5lZCBtZW1vcnkgYXJlYSBvbiB0aGUgYWRhcHRlci4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sJICAgICBUYXNrIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICBTb21ldGhpbmcgd2VudCB3cm9uZy4KKyAqLworUE5NSV9TVEFUSUMgaW50IE1hY1VwZGF0ZSgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCit1bnNpZ25lZCBpbnQgRmlyc3RNYWMsCS8qIEluZGV4IG9mIHRoZSBmaXJzdCBNYWMgdG8gYmUgdXBkYXRlZCAqLwordW5zaWduZWQgaW50IExhc3RNYWMpCS8qIEluZGV4IG9mIHRoZSBsYXN0IE1hYyB0byBiZSB1cGRhdGVkICovCit7CisJdW5zaWduZWQgaW50CU1hY0luZGV4OworCisJLyoKKwkgKiBXZXJlIHRoZSBzdGF0aXN0aWNzIGFscmVhZHkgdXBkYXRlZCBkdXJpbmcgdGhlCisJICogY3VycmVudCBQTk1JIGNhbGw/CisJICovCisJaWYgKHBBQy0+UG5taS5NYWNVcGRhdGVkRmxhZyA+IDApIHsKKworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKKwl9CisKKwkvKiBTZW5kIGFuIHVwZGF0ZSBjb21tYW5kIHRvIGFsbCBNQUNzIHNwZWNpZmllZCAqLworCWZvciAoTWFjSW5kZXggPSBGaXJzdE1hYzsgTWFjSW5kZXggPD0gTGFzdE1hYzsgTWFjSW5kZXggKyspIHsKKworCQkvKgorCQkgKiAyMDAyLTA5LTEzIHB3ZWJlcjoJRnJlZXplIHRoZSBjdXJyZW50IFNXIGNvdW50ZXJzLgorCQkgKiAgICAgICAgICAgICAgICAgICAgICAoVGhhdCBzaG91bGQgYmUgZG9uZSBhcyBjbG9zZSBhcworCQkgKiAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZSB0byB0aGUgdXBkYXRlIG9mIHRoZQorCQkgKiAgICAgICAgICAgICAgICAgICAgICBIVyBjb3VudGVycykKKwkJICovCisJCWlmIChwQUMtPkdJbmkuR0lNYWNUeXBlID09IFNLX01BQ19YTUFDKSB7CisJCQlwQUMtPlBubWkuQnVmUG9ydFtNYWNJbmRleF0gPSBwQUMtPlBubWkuUG9ydFtNYWNJbmRleF07CisJCX0KKwkJCQorCQkvKiAyMDAyLTA5LTEzIHB3ZWJlcjogIFVwZGF0ZSB0aGUgSFcgY291bnRlciAgKi8KKwkJaWYgKHBBQy0+R0luaS5HSUZ1bmMucEZuTWFjVXBkYXRlU3RhdHMocEFDLCBJb0MsIE1hY0luZGV4KSAhPSAwKSB7CisKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfR0VORVJBTCk7CisJCX0KKwl9CisKKwlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR2V0U3RhdFZhbCAtIFJldHJpZXZlIGFuIFhNQUMgc3RhdGlzdGljIGNvdW50ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVJldHJpZXZlcyB0aGUgc3RhdGlzdGljIGNvdW50ZXIgb2YgYSB2aXJ0dWFsIG9yIHBoeXNpY2FsIHBvcnQuIFRoZQorICoJdmlydHVhbCBwb3J0IGlzIGlkZW50aWZpZWQgYnkgdGhlIGluZGV4IDAuIEl0IGNvbnNpc3RzIG9mIGFsbAorICoJY3VycmVudGx5IGFjdGl2ZSBwb3J0cy4gVG8gb2J0YWluIHRoZSBjb3VudGVyIHZhbHVlIGZvciB0aGlzIHBvcnQKKyAqCXdlIG11c3QgYWRkIHRoZSBzdGF0aXN0aWMgY291bnRlciBvZiBhbGwgYWN0aXZlIHBvcnRzLiBUbyBncmFudAorICoJY29udGludW91cyBjb3VudGVyIHZhbHVlcyBmb3IgdGhlIHZpcnR1YWwgcG9ydCBldmVuIHdoZW4gcG9ydAorICoJc3dpdGNoZXMgb2NjdXIgd2UgbXVzdCBhZGRpdGlvbmFsbHkgYWRkIGEgZGVsdGEgdmFsdWUsIHdoaWNoIHdhcworICoJY2FsY3VsYXRlZCBkdXJpbmcgYSBTS19QTk1JX0VWVF9STE1UX0FDVElWRV9VUCBldmVudC4KKyAqCisgKiBSZXR1cm5zOgorICoJUmVxdWVzdGVkIHN0YXRpc3RpYyB2YWx1ZQorICovCitQTk1JX1NUQVRJQyBTS19VNjQgR2V0U3RhdFZhbCgKK1NLX0FDICpwQUMsCQkJCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCQkJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCit1bnNpZ25lZCBpbnQgTG9nUG9ydEluZGV4LAkvKiBJbmRleCBvZiB0aGUgbG9naWNhbCBQb3J0IHRvIGJlIHByb2Nlc3NlZCAqLwordW5zaWduZWQgaW50IFN0YXRJbmRleCwJCS8qIEluZGV4IHRvIHN0YXRpc3RpYyB2YWx1ZSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbGx3YXlzIHplcm8gKi8KK3sKKwl1bnNpZ25lZCBpbnQJUGh5c1BvcnRJbmRleDsKKwl1bnNpZ25lZCBpbnQJUGh5c1BvcnRNYXg7CisJU0tfVTY0CQkJVmFsID0gMDsKKworCisJaWYgKHBBQy0+UG5taS5EdWFsTmV0QWN0aXZlRmxhZyA9PSBTS19UUlVFKSB7CS8qIER1YWwgbmV0IG1vZGUgKi8KKworCQlQaHlzUG9ydEluZGV4ID0gTmV0SW5kZXg7CisJCQorCQlWYWwgPSBHZXRQaHlzU3RhdFZhbChwQUMsIElvQywgUGh5c1BvcnRJbmRleCwgU3RhdEluZGV4KTsKKwl9CisJZWxzZSB7CS8qIFNpbmdsZSBOZXQgbW9kZSAqLworCisJCWlmIChMb2dQb3J0SW5kZXggPT0gMCkgeworCisJCQlQaHlzUG9ydE1heCA9IHBBQy0+R0luaS5HSU1hY3NGb3VuZDsKKworCQkJLyogQWRkIGNvdW50ZXIgb2YgYWxsIGFjdGl2ZSBwb3J0cyAqLworCQkJZm9yIChQaHlzUG9ydEluZGV4ID0gMDsgUGh5c1BvcnRJbmRleCA8IFBoeXNQb3J0TWF4OworCQkJCVBoeXNQb3J0SW5kZXggKyspIHsKKworCQkJCWlmIChwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS5BY3RpdmVGbGFnKSB7CisKKwkJCQkJVmFsICs9IEdldFBoeXNTdGF0VmFsKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LCBTdGF0SW5kZXgpOworCQkJCX0KKwkJCX0KKworCQkJLyogQ29ycmVjdCB2YWx1ZSBiZWNhdXNlIG9mIHBvcnQgc3dpdGNoZXMgKi8KKwkJCVZhbCArPSBwQUMtPlBubWkuVmlydHVhbENvdW50ZXJPZmZzZXRbU3RhdEluZGV4XTsKKwkJfQorCQllbHNlIHsKKwkJCS8qIEdldCBjb3VudGVyIHZhbHVlIG9mIHBoeXNpY2FsIHBvcnQgKi8KKwkJCVBoeXNQb3J0SW5kZXggPSBTS19QTk1JX1BPUlRfTE9HMlBIWVMocEFDLCBMb2dQb3J0SW5kZXgpOworCQkJCisJCQlWYWwgPSBHZXRQaHlzU3RhdFZhbChwQUMsIElvQywgUGh5c1BvcnRJbmRleCwgU3RhdEluZGV4KTsKKwkJfQorCX0KKwlyZXR1cm4gKFZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdldFBoeXNTdGF0VmFsIC0gR2V0IGNvdW50ZXIgdmFsdWUgZm9yIHBoeXNpY2FsIHBvcnQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUJ1aWxkcyBhIDY0Yml0IGNvdW50ZXIgdmFsdWUuIEV4Y2VwdCBmb3IgdGhlIG9jdGV0IGNvdW50ZXJzCisgKgl0aGUgbG93ZXIgMzJiaXQgYXJlIGNvdW50ZWQgaW4gaGFyZHdhcmUgYW5kIHRoZSB1cHBlciAzMmJpdAorICoJaW4gc29mdHdhcmUgYnkgbW9uaXRvcmluZyBjb3VudGVyIG92ZXJmbG93IGludGVycnVwdHMgaW4gdGhlCisgKglldmVudCBoYW5kbGVyLiBUbyBncmFudCBjb250aW5vdXMgY291bnRlciB2YWx1ZXMgZHVyaW5nIFhNQUMKKyAqCXJlc2V0cyAoY2F1c2VkIGJ5IGEgd29ya2Fyb3VuZCkgd2UgbXVzdCBhZGQgYSBkZWx0YSB2YWx1ZS4KKyAqCVRoZSBkZWx0YSB3YXMgY2FsY3VsYXRlZCBpbiB0aGUgZXZlbnQgaGFuZGxlciB3aGVuIGEKKyAqCVNLX1BOTUlfRVZUX1hNQUNfUkVTRVQgd2FzIHJlY2VpdmVkLgorICoKKyAqIFJldHVybnM6CisgKglDb3VudGVyIHZhbHVlCisgKi8KK1BOTUlfU1RBVElDIFNLX1U2NCBHZXRQaHlzU3RhdFZhbCgKK1NLX0FDICpwQUMsCQkJCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCQkJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCit1bnNpZ25lZCBpbnQgUGh5c1BvcnRJbmRleCwJLyogSW5kZXggb2YgdGhlIGxvZ2ljYWwgUG9ydCB0byBiZSBwcm9jZXNzZWQgKi8KK3Vuc2lnbmVkIGludCBTdGF0SW5kZXgpCQkvKiBJbmRleCB0byBzdGF0aXN0aWMgdmFsdWUgKi8KK3sKKwlTS19VNjQJVmFsID0gMDsKKwlTS19VMzIJTG93VmFsID0gMDsKKwlTS19VMzIJSGlnaFZhbCA9IDA7CisJU0tfVTE2CVdvcmQ7CisJaW50CQlNYWNUeXBlOworCXVuc2lnbmVkIGludCBIZWxwSW5kZXg7CisJU0tfR0VQT1JUCSpwUHJ0OworCQorCVNLX1BOTUlfUE9SVAkqcFBubWlQcnQ7CisJU0tfR0VNQUNGVU5DCSpwRm5NYWM7CisJCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF07CisJCisJTWFjVHlwZSA9IHBBQy0+R0luaS5HSU1hY1R5cGU7CisJCisJLyogMjAwMi0wOS0xNyBwd2ViZXI6IEZvciBYTUFDLCB1c2UgdGhlIGZyb3plbiBTVyBjb3VudGVycyAoQnVmUG9ydCkgKi8KKwlpZiAoTWFjVHlwZSA9PSBTS19NQUNfWE1BQykgeworCQlwUG5taVBydCA9ICZwQUMtPlBubWkuQnVmUG9ydFtQaHlzUG9ydEluZGV4XTsKKwl9CisJZWxzZSB7CisJCXBQbm1pUHJ0ID0gJnBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdOworCX0KKwkKKwlwRm5NYWMgICA9ICZwQUMtPkdJbmkuR0lGdW5jOworCisJc3dpdGNoIChTdGF0SW5kZXgpIHsKKwljYXNlIFNLX1BOTUlfSFRYOgorCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfR01BQykgeworCQkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJU3RhdEFkZHJbU0tfUE5NSV9IVFhfQlJPQURDQVNUXVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJJkxvd1ZhbCk7CisJCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQlTdGF0QWRkcltTS19QTk1JX0hUWF9NVUxUSUNBU1RdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkmSGlnaFZhbCk7CisJCQlMb3dWYWwgKz0gSGlnaFZhbDsKKwkJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCVN0YXRBZGRyW1NLX1BOTUlfSFRYX1VOSUNBU1RdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkmSGlnaFZhbCk7CisJCQlMb3dWYWwgKz0gSGlnaFZhbDsKKwkJfQorCQllbHNlIHsKKwkJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCQkJCSAgU3RhdEFkZHJbU3RhdEluZGV4XVtNYWNUeXBlXS5SZWcsCisJCQkJCQkJCQkJICAmTG93VmFsKTsKKwkJfQorCQlIaWdoVmFsID0gcFBubWlQcnQtPkNvdW50ZXJIaWdoW1N0YXRJbmRleF07CisJCWJyZWFrOworCQorCWNhc2UgU0tfUE5NSV9IUlg6CisJCWlmIChNYWNUeXBlID09IFNLX01BQ19HTUFDKSB7CisJCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQlTdGF0QWRkcltTS19QTk1JX0hSWF9CUk9BRENBU1RdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkmTG93VmFsKTsKKwkJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCVN0YXRBZGRyW1NLX1BOTUlfSFJYX01VTFRJQ0FTVF1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCSZIaWdoVmFsKTsKKwkJCUxvd1ZhbCArPSBIaWdoVmFsOworCQkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJU3RhdEFkZHJbU0tfUE5NSV9IUlhfVU5JQ0FTVF1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCSZIaWdoVmFsKTsKKwkJCUxvd1ZhbCArPSBIaWdoVmFsOworCQl9CisJCWVsc2UgeworCQkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJCQkJICBTdGF0QWRkcltTdGF0SW5kZXhdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkJCQkgICZMb3dWYWwpOworCQl9CisJCUhpZ2hWYWwgPSBwUG5taVBydC0+Q291bnRlckhpZ2hbU3RhdEluZGV4XTsKKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfSFRYX09DVEVUOgorCWNhc2UgU0tfUE5NSV9IUlhfT0NURVQ6CisJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCQkJICBTdGF0QWRkcltTdGF0SW5kZXhdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkJCSAgJkhpZ2hWYWwpOworCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQkJCSAgU3RhdEFkZHJbU3RhdEluZGV4ICsgMV1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCQkJICAmTG93VmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfSFRYX0JVUlNUOgorCWNhc2UgU0tfUE5NSV9IVFhfRVhDRVNTX0RFRjoKKwljYXNlIFNLX1BOTUlfSFRYX0NBUlJJRVI6CisJCS8qIE5vdCBzdXBwb3J0ZWQgYnkgR01BQyAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfR01BQykgeworCQkJcmV0dXJuIChWYWwpOworCQl9CisKKwkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJCQkgIFN0YXRBZGRyW1N0YXRJbmRleF1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCQkJICAmTG93VmFsKTsKKwkJSGlnaFZhbCA9IHBQbm1pUHJ0LT5Db3VudGVySGlnaFtTdGF0SW5kZXhdOworCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9IVFhfTUFDQzoKKwkJLyogR01BQyBvbmx5IHN1cHBvcnRzIFBBVVNFIE1BQyBjb250cm9sIGZyYW1lcyAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfR01BQykgeworCQkJSGVscEluZGV4ID0gU0tfUE5NSV9IVFhfUE1BQ0M7CisJCX0KKwkJZWxzZSB7CisJCQlIZWxwSW5kZXggPSBTdGF0SW5kZXg7CisJCX0KKwkJCisJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCQlTdGF0QWRkcltIZWxwSW5kZXhdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkJJkxvd1ZhbCk7CisKKwkJSGlnaFZhbCA9IHBQbm1pUHJ0LT5Db3VudGVySGlnaFtTdGF0SW5kZXhdOworCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9IVFhfQ09MOgorCWNhc2UgU0tfUE5NSV9IUlhfVU5ERVJTSVpFOgorCQkvKiBOb3Qgc3VwcG9ydGVkIGJ5IFhNQUMgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCXJldHVybiAoVmFsKTsKKwkJfQorCisJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCQkJICBTdGF0QWRkcltTdGF0SW5kZXhdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkJCSAgJkxvd1ZhbCk7CisJCUhpZ2hWYWwgPSBwUG5taVBydC0+Q291bnRlckhpZ2hbU3RhdEluZGV4XTsKKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfSFRYX0RFRkZFUkFMOgorCQkvKiBOb3Qgc3VwcG9ydGVkIGJ5IEdNQUMgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX0dNQUMpIHsKKwkJCXJldHVybiAoVmFsKTsKKwkJfQorCQkKKwkJLyoKKwkJICogWE1BQyBjb3VudHMgZnJhbWVzIHdpdGggZGVmZXJyZWQgdHJhbnNtaXNzaW9uCisJCSAqIGV2ZW4gaW4gZnVsbC1kdXBsZXggbW9kZS4KKwkJICoKKwkJICogSW4gZnVsbC1kdXBsZXggbW9kZSB0aGUgY291bnRlciByZW1haW5zIGNvbnN0YW50IQorCQkgKi8KKwkJaWYgKChwUHJ0LT5QTGlua01vZGVTdGF0dXMgPT0gU0tfTE1PREVfU1RBVF9BVVRPRlVMTCkgfHwKKwkJCShwUHJ0LT5QTGlua01vZGVTdGF0dXMgPT0gU0tfTE1PREVfU1RBVF9GVUxMKSkgeworCisJCQlMb3dWYWwgPSAwOworCQkJSGlnaFZhbCA9IDA7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBPdGhlcndpc2UgZ2V0IGNvbnRlbnRzIG9mIGhhcmR3YXJlIHJlZ2lzdGVyICovCisJCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQkJCQkgIFN0YXRBZGRyW1N0YXRJbmRleF1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCQkJCSAgJkxvd1ZhbCk7CisJCQlIaWdoVmFsID0gcFBubWlQcnQtPkNvdW50ZXJIaWdoW1N0YXRJbmRleF07CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfSFJYX0JBRE9DVEVUOgorCQkvKiBOb3Qgc3VwcG9ydGVkIGJ5IFhNQUMgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCXJldHVybiAoVmFsKTsKKwkJfQorCisJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCQkJICBTdGF0QWRkcltTdGF0SW5kZXhdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkJCSAgJkhpZ2hWYWwpOworCQkodm9pZClwRm5NYWMtPnBGbk1hY1N0YXRpc3RpYyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwKKwkJCQkJCQkJCSAgU3RhdEFkZHJbU3RhdEluZGV4ICsgMV1bTWFjVHlwZV0uUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTG93VmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfSFRYX09DVEVUTE9XOgorCWNhc2UgU0tfUE5NSV9IUlhfT0NURVRMT1c6CisJY2FzZSBTS19QTk1JX0hSWF9CQURPQ1RFVExPVzoKKwkJcmV0dXJuIChWYWwpOworCisJY2FzZSBTS19QTk1JX0hSWF9MT05HRlJBTUVTOgorCQkvKiBGb3IgWE1BQyB0aGUgU1cgY291bnRlciBpcyBtYW5hZ2VkIGJ5IFBOTUkgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX1hNQUMpIHsKKwkJCXJldHVybiAocFBubWlQcnQtPlN0YXRSeExvbmdGcmFtZUN0cyk7CisJCX0KKwkJCisJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCQkJICBTdGF0QWRkcltTdGF0SW5kZXhdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkJCSAgJkxvd1ZhbCk7CisJCUhpZ2hWYWwgPSBwUG5taVBydC0+Q291bnRlckhpZ2hbU3RhdEluZGV4XTsKKwkJYnJlYWs7CisJCQorCWNhc2UgU0tfUE5NSV9IUlhfVE9PX0xPTkc6CisJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCQlTdGF0QWRkcltTdGF0SW5kZXhdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkJJkxvd1ZhbCk7CisJCUhpZ2hWYWwgPSBwUG5taVBydC0+Q291bnRlckhpZ2hbU3RhdEluZGV4XTsKKwkJCisJCVZhbCA9ICgoKFNLX1U2NClIaWdoVmFsIDw8IDMyKSB8IChTS19VNjQpTG93VmFsKTsKKworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfR01BQykgeworCQkJLyogRm9yIEdNQUMgdGhlIFNXIGNvdW50ZXIgaXMgYWRkaXRpb25hbGx5IG1hbmFnZWQgYnkgUE5NSSAqLworCQkJVmFsICs9IHBQbm1pUHJ0LT5TdGF0UnhGcmFtZVRvb0xvbmdDdHM7CisJCX0KKwkJZWxzZSB7CisJCQkvKgorCQkJICogRnJhbWVzIGxvbmdlciB0aGFuIElFRUUgODAyLjMgZnJhbWUgbWF4IHNpemUgYXJlIGNvdW50ZWQKKwkJCSAqIGJ5IFhNQUMgaW4gZnJhbWVfdG9vX2xvbmcgY291bnRlciBldmVuIHJlY2VwdGlvbiBvZiBsb25nCisJCQkgKiBmcmFtZXMgd2FzIGVuYWJsZWQgYW5kIHRoZSBmcmFtZSB3YXMgY29ycmVjdC4KKwkJCSAqIFNvIGNvcnJlY3QgdGhlIHZhbHVlIGJ5IHN1YnRyYWN0aW5nIFJ4TG9uZ0ZyYW1lIGNvdW50ZXIuCisJCQkgKi8KKwkJCVZhbCAtPSBwUG5taVBydC0+U3RhdFJ4TG9uZ0ZyYW1lQ3RzOworCQl9CisKKwkJTG93VmFsID0gKFNLX1UzMilWYWw7CisJCUhpZ2hWYWwgPSAoU0tfVTMyKShWYWwgPj4gMzIpOworCQlicmVhazsKKwkJCisJY2FzZSBTS19QTk1JX0hSWF9TSE9SVFM6CisJCS8qIE5vdCBzdXBwb3J0ZWQgYnkgR01BQyAqLworCQlpZiAoTWFjVHlwZSA9PSBTS19NQUNfR01BQykgeworCQkJLyogR01fUlhFX0ZSQUc/PyAqLworCQkJcmV0dXJuIChWYWwpOworCQl9CisJCQorCQkvKgorCQkgKiBYTUFDIGNvdW50cyBzaG9ydCBmcmFtZSBlcnJvcnMgZXZlbiBpZiBsaW5rIGRvd24gKCMxMDYyMCkKKwkJICoKKwkJICogSWYgbGluay1kb3duIHRoZSBjb3VudGVyIHJlbWFpbnMgY29uc3RhbnQKKwkJICovCisJCWlmIChwUHJ0LT5QTGlua01vZGVTdGF0dXMgIT0gU0tfTE1PREVfU1RBVF9VTktOT1dOKSB7CisKKwkJCS8qIE90aGVyd2lzZSBnZXQgaW5jcmVtZW50YWwgZGlmZmVyZW5jZSAqLworCQkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJCQkJICBTdGF0QWRkcltTdGF0SW5kZXhdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkJCQkgICZMb3dWYWwpOworCQkJSGlnaFZhbCA9IHBQbm1pUHJ0LT5Db3VudGVySGlnaFtTdGF0SW5kZXhdOworCisJCQlWYWwgPSAoKChTS19VNjQpSGlnaFZhbCA8PCAzMikgfCAoU0tfVTY0KUxvd1ZhbCk7CisJCQlWYWwgLT0gcFBubWlQcnQtPlJ4U2hvcnRaZXJvTWFyazsKKworCQkJTG93VmFsID0gKFNLX1UzMilWYWw7CisJCQlIaWdoVmFsID0gKFNLX1UzMikoVmFsID4+IDMyKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0tfUE5NSV9IUlhfTUFDQzoKKwljYXNlIFNLX1BOTUlfSFJYX01BQ0NfVU5LV046CisJY2FzZSBTS19QTk1JX0hSWF9CVVJTVDoKKwljYXNlIFNLX1BOTUlfSFJYX01JU1NFRDoKKwljYXNlIFNLX1BOTUlfSFJYX0ZSQU1JTkc6CisJY2FzZSBTS19QTk1JX0hSWF9DQVJSSUVSOgorCWNhc2UgU0tfUE5NSV9IUlhfSVJMRU5HVEg6CisJY2FzZSBTS19QTk1JX0hSWF9TWU1CT0w6CisJY2FzZSBTS19QTk1JX0hSWF9DRVhUOgorCQkvKiBOb3Qgc3VwcG9ydGVkIGJ5IEdNQUMgKi8KKwkJaWYgKE1hY1R5cGUgPT0gU0tfTUFDX0dNQUMpIHsKKwkJCXJldHVybiAoVmFsKTsKKwkJfQorCisJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCQkJICBTdGF0QWRkcltTdGF0SW5kZXhdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkJCSAgJkxvd1ZhbCk7CisJCUhpZ2hWYWwgPSBwUG5taVBydC0+Q291bnRlckhpZ2hbU3RhdEluZGV4XTsKKwkJYnJlYWs7CisKKwljYXNlIFNLX1BOTUlfSFJYX1BNQUNDX0VSUjoKKwkJLyogRm9yIEdNQUMgdGhlIFNXIGNvdW50ZXIgaXMgbWFuYWdlZCBieSBQTk1JICovCisJCWlmIChNYWNUeXBlID09IFNLX01BQ19HTUFDKSB7CisJCQlyZXR1cm4gKHBQbm1pUHJ0LT5TdGF0UnhQTWFjY0Vycik7CisJCX0KKwkJCisJCSh2b2lkKXBGbk1hYy0+cEZuTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LAorCQkJCQkJCQkJICBTdGF0QWRkcltTdGF0SW5kZXhdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkJCSAgJkxvd1ZhbCk7CisJCUhpZ2hWYWwgPSBwUG5taVBydC0+Q291bnRlckhpZ2hbU3RhdEluZGV4XTsKKwkJYnJlYWs7CisKKwkvKiBTVyBjb3VudGVyIG1hbmFnZWQgYnkgUE5NSSAqLworCWNhc2UgU0tfUE5NSV9IVFhfU1lOQzoKKwkJTG93VmFsID0gKFNLX1UzMilwUG5taVBydC0+U3RhdFN5bmNDdHM7CisJCUhpZ2hWYWwgPSAoU0tfVTMyKShwUG5taVBydC0+U3RhdFN5bmNDdHMgPj4gMzIpOworCQlicmVhazsKKworCS8qIFNXIGNvdW50ZXIgbWFuYWdlZCBieSBQTk1JICovCisJY2FzZSBTS19QTk1JX0hUWF9TWU5DX09DVEVUOgorCQlMb3dWYWwgPSAoU0tfVTMyKXBQbm1pUHJ0LT5TdGF0U3luY09jdGV0c0N0czsKKwkJSGlnaFZhbCA9IChTS19VMzIpKHBQbm1pUHJ0LT5TdGF0U3luY09jdGV0c0N0cyA+PiAzMik7CisJCWJyZWFrOworCisJY2FzZSBTS19QTk1JX0hSWF9GQ1M6CisJCS8qCisJCSAqIEJyb2FkY29tIGZpbHRlcnMgRkNTIGVycm9ycyBhbmQgY291bnRzIGl0IGluCisJCSAqIFJlY2VpdmUgRXJyb3IgQ291bnRlciByZWdpc3RlcgorCQkgKi8KKwkJaWYgKHBQcnQtPlBoeVR5cGUgPT0gU0tfUEhZX0JDT00pIHsKKwkJCS8qIGRvIG5vdCByZWFkIHdoaWxlIG5vdCBpbml0aWFsaXplZCAoUEhZX1JFQUQgaGFuZ3MhKSovCisJCQlpZiAocFBydC0+UFN0YXRlICE9IFNLX1BSVF9SRVNFVCkgeworCQkJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4LCBQSFlfQkNPTV9SRV9DVFIsICZXb3JkKTsKKwkJCQkKKwkJCQlMb3dWYWwgPSBXb3JkOworCQkJfQorCQkJSGlnaFZhbCA9IHBQbm1pUHJ0LT5Db3VudGVySGlnaFtTdGF0SW5kZXhdOworCQl9CisJCWVsc2UgeworCQkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJCQkJICBTdGF0QWRkcltTdGF0SW5kZXhdW01hY1R5cGVdLlJlZywKKwkJCQkJCQkJCQkgICZMb3dWYWwpOworCQkJSGlnaFZhbCA9IHBQbm1pUHJ0LT5Db3VudGVySGlnaFtTdGF0SW5kZXhdOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJKHZvaWQpcEZuTWFjLT5wRm5NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBoeXNQb3J0SW5kZXgsCisJCQkJCQkJCQkgIFN0YXRBZGRyW1N0YXRJbmRleF1bTWFjVHlwZV0uUmVnLAorCQkJCQkJCQkJICAmTG93VmFsKTsKKwkJSGlnaFZhbCA9IHBQbm1pUHJ0LT5Db3VudGVySGlnaFtTdGF0SW5kZXhdOworCQlicmVhazsKKwl9CisKKwlWYWwgPSAoKChTS19VNjQpSGlnaFZhbCA8PCAzMikgfCAoU0tfVTY0KUxvd1ZhbCk7CisKKwkvKiBDb3JyZWN0IHZhbHVlIGJlY2F1c2Ugb2YgcG9zc2libGUgWE1BQyByZXNldC4gWE1BQyBFcnJhdGEgIzIgKi8KKwlWYWwgKz0gcFBubWlQcnQtPkNvdW50ZXJPZmZzZXRbU3RhdEluZGV4XTsKKworCXJldHVybiAoVmFsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogUmVzZXRDb3VudGVyIC0gU2V0IGFsbCBjb3VudGVycyBhbmQgdGltZXN0YW1wcyB0byB6ZXJvCisgKgorICogRGVzY3JpcHRpb246CisgKglOb3RpZmllcyBvdGhlciBjb21tb24gbW9kdWxlcyB3aGljaCBzdG9yZSBzdGF0aXN0aWMgZGF0YSB0bworICoJcmVzZXQgdGhlaXIgY291bnRlcnMgYW5kIGZpbmFsbHkgcmVzZXQgb3VyIG93biBjb3VudGVycy4KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitQTk1JX1NUQVRJQyB2b2lkIFJlc2V0Q291bnRlcigKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitTS19VMzIgTmV0SW5kZXgpCit7CisJdW5zaWduZWQgaW50CVBoeXNQb3J0SW5kZXg7CisJU0tfRVZQQVJBCUV2ZW50UGFyYW07CisKKworCVNLX01FTVNFVCgoY2hhciAqKSZFdmVudFBhcmFtLCAwLCBzaXplb2YoRXZlbnRQYXJhbSkpOworCisJLyogTm90aWZ5IHNlbnNvciBtb2R1bGUgKi8KKwlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0kyQywgU0tfSTJDRVZfQ0xFQVIsIEV2ZW50UGFyYW0pOworCisJLyogTm90aWZ5IFJMTVQgbW9kdWxlICovCisJRXZlbnRQYXJhbS5QYXJhMzJbMF0gPSBOZXRJbmRleDsKKwlFdmVudFBhcmFtLlBhcmEzMlsxXSA9IChTS19VMzIpLTE7CisJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX1NUQVRTX0NMRUFSLCBFdmVudFBhcmFtKTsKKwlFdmVudFBhcmFtLlBhcmEzMlsxXSA9IDA7CisKKwkvKiBOb3RpZnkgU0lSUSBtb2R1bGUgKi8KKwlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0hXQUMsIFNLX0hXRVZfQ0xFQVJfU1RBVCwgRXZlbnRQYXJhbSk7CisKKwkvKiBOb3RpZnkgQ1NVTSBtb2R1bGUgKi8KKyNpZmRlZiBTS19VU0VfQ1NVTQorCUV2ZW50UGFyYW0uUGFyYTMyWzBdID0gTmV0SW5kZXg7CisJRXZlbnRQYXJhbS5QYXJhMzJbMV0gPSAoU0tfVTMyKS0xOworCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfQ1NVTSwgU0tfQ1NVTV9FVkVOVF9DTEVBUl9QUk9UT19TVEFUUywKKwkJRXZlbnRQYXJhbSk7CisjZW5kaWYgLyogU0tfVVNFX0NTVU0gKi8KKwkKKwkvKiBDbGVhciBYTUFDIHN0YXRpc3RpYyAqLworCWZvciAoUGh5c1BvcnRJbmRleCA9IDA7IFBoeXNQb3J0SW5kZXggPAorCQkodW5zaWduZWQgaW50KXBBQy0+R0luaS5HSU1hY3NGb3VuZDsgUGh5c1BvcnRJbmRleCArKykgeworCisJCSh2b2lkKXBBQy0+R0luaS5HSUZ1bmMucEZuTWFjUmVzZXRDb3VudGVyKHBBQywgSW9DLCBQaHlzUG9ydEluZGV4KTsKKworCQlTS19NRU1TRVQoKGNoYXIgKikmcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uQ291bnRlckhpZ2gsCisJCQkwLCBzaXplb2YocEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uQ291bnRlckhpZ2gpKTsKKwkJU0tfTUVNU0VUKChjaGFyICopJnBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLgorCQkJQ291bnRlck9mZnNldCwgMCwgc2l6ZW9mKHBBQy0+UG5taS5Qb3J0WworCQkJUGh5c1BvcnRJbmRleF0uQ291bnRlck9mZnNldCkpOworCQlTS19NRU1TRVQoKGNoYXIgKikmcEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uU3RhdFN5bmNDdHMsCisJCQkwLCBzaXplb2YocEFDLT5Qbm1pLlBvcnRbUGh5c1BvcnRJbmRleF0uU3RhdFN5bmNDdHMpKTsKKwkJU0tfTUVNU0VUKChjaGFyICopJnBBQy0+UG5taS5Qb3J0W1BoeXNQb3J0SW5kZXhdLgorCQkJU3RhdFN5bmNPY3RldHNDdHMsIDAsIHNpemVvZihwQUMtPlBubWkuUG9ydFsKKwkJCVBoeXNQb3J0SW5kZXhdLlN0YXRTeW5jT2N0ZXRzQ3RzKSk7CisJCVNLX01FTVNFVCgoY2hhciAqKSZwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS4KKwkJCVN0YXRSeExvbmdGcmFtZUN0cywgMCwgc2l6ZW9mKHBBQy0+UG5taS5Qb3J0WworCQkJUGh5c1BvcnRJbmRleF0uU3RhdFJ4TG9uZ0ZyYW1lQ3RzKSk7CisJCVNLX01FTVNFVCgoY2hhciAqKSZwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS4KKwkJCQkgIFN0YXRSeEZyYW1lVG9vTG9uZ0N0cywgMCwgc2l6ZW9mKHBBQy0+UG5taS5Qb3J0WworCQkJUGh5c1BvcnRJbmRleF0uU3RhdFJ4RnJhbWVUb29Mb25nQ3RzKSk7CisJCVNLX01FTVNFVCgoY2hhciAqKSZwQUMtPlBubWkuUG9ydFtQaHlzUG9ydEluZGV4XS4KKwkJCQkgIFN0YXRSeFBNYWNjRXJyLCAwLCBzaXplb2YocEFDLT5Qbm1pLlBvcnRbCisJCQlQaHlzUG9ydEluZGV4XS5TdGF0UnhQTWFjY0VycikpOworCX0KKworCS8qCisJICogQ2xlYXIgbG9jYWwgc3RhdGlzdGljcworCSAqLworCVNLX01FTVNFVCgoY2hhciAqKSZwQUMtPlBubWkuVmlydHVhbENvdW50ZXJPZmZzZXQsIDAsCisJCSAgc2l6ZW9mKHBBQy0+UG5taS5WaXJ0dWFsQ291bnRlck9mZnNldCkpOworCXBBQy0+UG5taS5SbG10Q2hhbmdlQ3RzID0gMDsKKwlwQUMtPlBubWkuUmxtdENoYW5nZVRpbWUgPSAwOworCVNLX01FTVNFVCgoY2hhciAqKSZwQUMtPlBubWkuUmxtdENoYW5nZUVzdGltYXRlLkVzdFZhbHVlWzBdLCAwLAorCQlzaXplb2YocEFDLT5Qbm1pLlJsbXRDaGFuZ2VFc3RpbWF0ZS5Fc3RWYWx1ZSkpOworCXBBQy0+UG5taS5SbG10Q2hhbmdlRXN0aW1hdGUuRXN0VmFsdWVJbmRleCA9IDA7CisJcEFDLT5Qbm1pLlJsbXRDaGFuZ2VFc3RpbWF0ZS5Fc3RpbWF0ZSA9IDA7CisJcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlR4U3dRdWV1ZU1heCA9IDA7CisJcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlR4UmV0cnlDdHMgPSAwOworCXBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5SeEludHJDdHMgPSAwOworCXBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5UeEludHJDdHMgPSAwOworCXBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5SeE5vQnVmQ3RzID0gMDsKKwlwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uVHhOb0J1ZkN0cyA9IDA7CisJcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlR4VXNlZERlc2NyTm8gPSAwOworCXBBQy0+UG5taS5Qb3J0W05ldEluZGV4XS5SeERlbGl2ZXJlZEN0cyA9IDA7CisJcEFDLT5Qbm1pLlBvcnRbTmV0SW5kZXhdLlJ4T2N0ZXRzRGVsaXZlcmVkQ3RzID0gMDsKKwlwQUMtPlBubWkuUG9ydFtOZXRJbmRleF0uRXJyUmVjb3ZlcnlDdHMgPSAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZXRUcmFwRW50cnkgLSBHZXQgYW4gZW50cnkgaW4gdGhlIHRyYXAgYnVmZmVyCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGUgdHJhcCBidWZmZXIgc3RvcmVzIHZhcmlvdXMgZXZlbnRzLiBBIHVzZXIgYXBwbGljYXRpb24gc29tZWhvdworICoJZ2V0cyBub3RpZmllZCB0aGF0IGFuIGV2ZW50IG9jY3VyZWQgYW5kIHJldHJpZXZlcyB0aGUgdHJhcCBidWZmZXIKKyAqCWNvbnRlbnMgKG9yIHNpbXBseSBwb2xscyB0aGUgYnVmZmVyKS4gVGhlIGJ1ZmZlciBpcyBvcmdhbml6ZWQgYXMKKyAqCWEgcmluZyB3aGljaCBzdG9yZXMgdGhlIG5ld2VzdCB0cmFwcyBhdCB0aGUgYmVnaW5uaW5nLiBUaGUgb2xkZXN0CisgKgl0cmFwcyBhcmUgb3ZlcndyaXR0ZW4gYnkgdGhlIG5ld2VzdCBvbmVzLiBFYWNoIHRyYXAgZW50cnkgaGFzIGEKKyAqCXVuaXF1ZSBudW1iZXIsIHNvIHRoYXQgYXBwbGljYXRpb25zIG1heSBkZXRlY3QgbmV3IHRyYXAgZW50cmllcy4KKyAqCisgKiBSZXR1cm5zOgorICoJQSBwb2ludGVyIHRvIHRoZSB0cmFwIGVudHJ5CisgKi8KK1BOTUlfU1RBVElDIGNoYXIqIEdldFRyYXBFbnRyeSgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfVTMyIFRyYXBJZCwJCS8qIFNOTVAgSUQgb2YgdGhlIHRyYXAgKi8KK3Vuc2lnbmVkIGludCBTaXplKQkvKiBTcGFjZSBuZWVkZWQgZm9yIHRyYXAgZW50cnkgKi8KK3sKKwl1bnNpZ25lZCBpbnQJCUJ1ZlBhZCA9IHBBQy0+UG5taS5UcmFwQnVmUGFkOworCXVuc2lnbmVkIGludAkJQnVmRnJlZSA9IHBBQy0+UG5taS5UcmFwQnVmRnJlZTsKKwl1bnNpZ25lZCBpbnQJCUJlZyA9IHBBQy0+UG5taS5UcmFwUXVldWVCZWc7CisJdW5zaWduZWQgaW50CQlFbmQgPSBwQUMtPlBubWkuVHJhcFF1ZXVlRW5kOworCWNoYXIJCQkqcEJ1ZiA9ICZwQUMtPlBubWkuVHJhcEJ1ZlswXTsKKwlpbnQJCQlXcmFwOworCXVuc2lnbmVkIGludAkJTmVlZGVkU3BhY2U7CisJdW5zaWduZWQgaW50CQlFbnRyeVNpemU7CisJU0tfVTMyCQkJVmFsMzI7CisJU0tfVTY0CQkJVmFsNjQ7CisKKworCS8qIExhc3QgYnl0ZSBvZiBlbnRyeSB3aWxsIGdldCBhIGNvcHkgb2YgdGhlIGVudHJ5IGxlbmd0aCAqLworCVNpemUgKys7CisKKwkvKgorCSAqIENhbGN1bGF0ZSBuZWVkZWQgYnVmZmVyIHNwYWNlICovCisJaWYgKEJlZyA+PSBTaXplKSB7CisKKwkJTmVlZGVkU3BhY2UgPSBTaXplOworCQlXcmFwID0gU0tfRkFMU0U7CisJfQorCWVsc2UgeworCQlOZWVkZWRTcGFjZSA9IEJlZyArIFNpemU7CisJCVdyYXAgPSBTS19UUlVFOworCX0KKworCS8qCisJICogQ2hlY2sgaWYgZW5vdWdoIGJ1ZmZlciBzcGFjZSBpcyBwcm92aWRlZC4gT3RoZXJ3aXNlCisJICogZnJlZSBzb21lIGVudHJpZXMuIExlYXZlIG9uZSBieXRlIHNwYWNlIGJldHdlZW4gYmVnaW4KKwkgKiBhbmQgZW5kIG9mIGJ1ZmZlciB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIGRldGVjdCB3aGV0aGVyCisJICogdGhlIGJ1ZmZlciBpcyBmdWxsIG9yIGVtcHR5CisJICovCisJd2hpbGUgKEJ1ZkZyZWUgPCBOZWVkZWRTcGFjZSArIDEpIHsKKworCQlpZiAoRW5kID09IDApIHsKKworCQkJRW5kID0gU0tfUE5NSV9UUkFQX1FVRVVFX0xFTjsKKwkJfQorCisJCUVudHJ5U2l6ZSA9ICh1bnNpZ25lZCBpbnQpKigodW5zaWduZWQgY2hhciAqKXBCdWYgKyBFbmQgLSAxKTsKKwkJQnVmRnJlZSArPSBFbnRyeVNpemU7CisJCUVuZCAtPSBFbnRyeVNpemU7CisjaWZkZWYgREVCVUcKKwkJU0tfTUVNU0VUKHBCdWYgKyBFbmQsIChjaGFyKSgtMSksIEVudHJ5U2l6ZSk7CisjZW5kaWYgLyogREVCVUcgKi8KKwkJaWYgKEVuZCA9PSBCdWZQYWQpIHsKKyNpZmRlZiBERUJVRworCQkJU0tfTUVNU0VUKHBCdWYsIChjaGFyKSgtMSksIEVuZCk7CisjZW5kaWYgLyogREVCVUcgKi8KKwkJCUJ1ZkZyZWUgKz0gRW5kOworCQkJRW5kID0gMDsKKwkJCUJ1ZlBhZCA9IDA7CisJCX0KKwl9CisKKwkvKgorCSAqIEluc2VydCBuZXcgZW50cnkgYXMgZmlyc3QgZW50cnkuIE5ld2VzdCBlbnRyaWVzIGFyZQorCSAqIHN0b3JlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBxdWV1ZS4KKwkgKi8KKwlpZiAoV3JhcCkgeworCisJCUJ1ZlBhZCA9IEJlZzsKKwkJQmVnID0gU0tfUE5NSV9UUkFQX1FVRVVFX0xFTiAtIFNpemU7CisJfQorCWVsc2UgeworCQlCZWcgPSBCZWcgLSBTaXplOworCX0KKwlCdWZGcmVlIC09IE5lZWRlZFNwYWNlOworCisJLyogU2F2ZSB0aGUgY3VycmVudCBvZmZzZXRzICovCisJcEFDLT5Qbm1pLlRyYXBRdWV1ZUJlZyA9IEJlZzsKKwlwQUMtPlBubWkuVHJhcFF1ZXVlRW5kID0gRW5kOworCXBBQy0+UG5taS5UcmFwQnVmUGFkID0gQnVmUGFkOworCXBBQy0+UG5taS5UcmFwQnVmRnJlZSA9IEJ1ZkZyZWU7CisKKwkvKiBJbml0aWFsaXplIHRoZSB0cmFwIGVudHJ5ICovCisJKihwQnVmICsgQmVnICsgU2l6ZSAtIDEpID0gKGNoYXIpU2l6ZTsKKwkqKHBCdWYgKyBCZWcpID0gKGNoYXIpU2l6ZTsKKwlWYWwzMiA9IChwQUMtPlBubWkuVHJhcFVuaXF1ZSkgKys7CisJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiArIEJlZyArIDEsIFZhbDMyKTsKKwlTS19QTk1JX1NUT1JFX1UzMihwQnVmICsgQmVnICsgMSArIHNpemVvZihTS19VMzIpLCBUcmFwSWQpOworCVZhbDY0ID0gU0tfUE5NSV9IVU5EUkVEU19TRUMoU2tPc0dldFRpbWUocEFDKSk7CisJU0tfUE5NSV9TVE9SRV9VNjQocEJ1ZiArIEJlZyArIDEgKyAyICogc2l6ZW9mKFNLX1UzMiksIFZhbDY0KTsKKworCXJldHVybiAocEJ1ZiArIEJlZyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlUcmFwUXVldWUgLSBDb3BpZXMgdGhlIHRyYXAgYnVmZmVyIGZvciB0aGUgVFJBUCBPSUQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCU9uIGEgcXVlcnkgb2YgdGhlIFRSQVAgT0lEIHRoZSB0cmFwIGJ1ZmZlciBjb250ZW50cyB3aWxsIGJlCisgKgljb3BpZWQgY29udGludW91c2x5IHRvIHRoZSByZXF1ZXN0IGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBsYXJnZQorICoJZW5vdWdoLiBObyBsZW5ndGggY2hlY2sgaXMgcGVyZm9ybWVkLgorICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1BOTUlfU1RBVElDIHZvaWQgQ29weVRyYXBRdWV1ZSgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworY2hhciAqcERzdEJ1ZikJCS8qIEJ1ZmZlciB0byB3aGljaCB0aGUgcXVldWVkIHRyYXBzIHdpbGwgYmUgY29waWVkICovCit7CisJdW5zaWduZWQgaW50CUJ1ZlBhZCA9IHBBQy0+UG5taS5UcmFwQnVmUGFkOworCXVuc2lnbmVkIGludAlUcmFwID0gcEFDLT5Qbm1pLlRyYXBRdWV1ZUJlZzsKKwl1bnNpZ25lZCBpbnQJRW5kID0gcEFDLT5Qbm1pLlRyYXBRdWV1ZUVuZDsKKwljaGFyCQkqcEJ1ZiA9ICZwQUMtPlBubWkuVHJhcEJ1ZlswXTsKKwl1bnNpZ25lZCBpbnQJTGVuOworCXVuc2lnbmVkIGludAlEc3RPZmYgPSAwOworCisKKwl3aGlsZSAoVHJhcCAhPSBFbmQpIHsKKworCQlMZW4gPSAodW5zaWduZWQgaW50KSoocEJ1ZiArIFRyYXApOworCisJCS8qCisJCSAqIExhc3QgYnl0ZSBjb250YWluaW5nIGEgY29weSBvZiB0aGUgbGVuZ3RoIHdpbGwKKwkJICogbm90IGJlIGNvcGllZC4KKwkJICovCisJCSoocERzdEJ1ZiArIERzdE9mZikgPSAoY2hhcikoTGVuIC0gMSk7CisJCVNLX01FTUNQWShwRHN0QnVmICsgRHN0T2ZmICsgMSwgcEJ1ZiArIFRyYXAgKyAxLCBMZW4gLSAyKTsKKwkJRHN0T2ZmICs9IExlbiAtIDE7CisKKwkJVHJhcCArPSBMZW47CisJCWlmIChUcmFwID09IFNLX1BOTUlfVFJBUF9RVUVVRV9MRU4pIHsKKworCQkJVHJhcCA9IEJ1ZlBhZDsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogR2V0VHJhcFF1ZXVlTGVuIC0gR2V0IHRoZSBsZW5ndGggb2YgdGhlIHRyYXAgYnVmZmVyCisgKgorICogRGVzY3JpcHRpb246CisgKglFdmFsdWF0ZXMgdGhlIG51bWJlciBvZiBjdXJyZW50bHkgc3RvcmVkIHRyYXBzIGFuZCB0aGUgbmVlZGVkCisgKglidWZmZXIgc2l6ZSB0byByZXRyaWV2ZSB0aGVtLgorICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1BOTUlfU1RBVElDIHZvaWQgR2V0VHJhcFF1ZXVlTGVuKAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIExlbmd0aCBpbiBCeXRlcyBvZiBhbGwgcXVldWVkIHRyYXBzICovCit1bnNpZ25lZCBpbnQgKnBFbnRyaWVzKQkvKiBSZXR1cm5zIG51bWJlciBvZiB0cmFwZXMgc3RvcmVkIGluIHF1ZXVlICovCit7CisJdW5zaWduZWQgaW50CUJ1ZlBhZCA9IHBBQy0+UG5taS5UcmFwQnVmUGFkOworCXVuc2lnbmVkIGludAlUcmFwID0gcEFDLT5Qbm1pLlRyYXBRdWV1ZUJlZzsKKwl1bnNpZ25lZCBpbnQJRW5kID0gcEFDLT5Qbm1pLlRyYXBRdWV1ZUVuZDsKKwljaGFyCQkqcEJ1ZiA9ICZwQUMtPlBubWkuVHJhcEJ1ZlswXTsKKwl1bnNpZ25lZCBpbnQJTGVuOworCXVuc2lnbmVkIGludAlFbnRyaWVzID0gMDsKKwl1bnNpZ25lZCBpbnQJVG90YWxMZW4gPSAwOworCisKKwl3aGlsZSAoVHJhcCAhPSBFbmQpIHsKKworCQlMZW4gPSAodW5zaWduZWQgaW50KSoocEJ1ZiArIFRyYXApOworCQlUb3RhbExlbiArPSBMZW4gLSAxOworCQlFbnRyaWVzICsrOworCisJCVRyYXAgKz0gTGVuOworCQlpZiAoVHJhcCA9PSBTS19QTk1JX1RSQVBfUVVFVUVfTEVOKSB7CisKKwkJCVRyYXAgPSBCdWZQYWQ7CisJCX0KKwl9CisKKwkqcEVudHJpZXMgPSBFbnRyaWVzOworCSpwTGVuID0gVG90YWxMZW47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFF1ZXVlU2ltcGxlVHJhcCAtIFN0b3JlIGEgc2ltcGxlIHRyYXAgdG8gdGhlIHRyYXAgYnVmZmVyCisgKgorICogRGVzY3JpcHRpb246CisgKglBIHNpbXBsZSB0cmFwIGlzIGEgdHJhcCB3aXRoIG5vdyBhZGRpdGlvbmFsIGRhdGEuIEl0IGNvbnNpc3RzCisgKglzaW1wbHkgb2YgYSB0cmFwIGNvZGUuCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUE5NSV9TVEFUSUMgdm9pZCBRdWV1ZVNpbXBsZVRyYXAoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX1UzMiBUcmFwSWQpCQkvKiBUeXBlIG9mIHNlbnNvciB0cmFwICovCit7CisJR2V0VHJhcEVudHJ5KHBBQywgVHJhcElkLCBTS19QTk1JX1RSQVBfU0lNUExFX0xFTik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFF1ZXVlU2Vuc29yVHJhcCAtIFN0b3JlcyBhIHNlbnNvciB0cmFwIGluIHRoZSB0cmFwIGJ1ZmZlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJR2V0cyBhbiBlbnRyeSBpbiB0aGUgdHJhcCBidWZmZXIgYW5kIGZpbGxzIGl0IHdpdGggc2Vuc29yIHJlbGF0ZWQKKyAqCWRhdGEuCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUE5NSV9TVEFUSUMgdm9pZCBRdWV1ZVNlbnNvclRyYXAoCitTS19BQyAqcEFDLAkJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19VMzIgVHJhcElkLAkJCS8qIFR5cGUgb2Ygc2Vuc29yIHRyYXAgKi8KK3Vuc2lnbmVkIGludCBTZW5zb3JJbmRleCkJLyogSW5kZXggb2Ygc2Vuc29yIHdoaWNoIGNhdXNlZCB0aGUgdHJhcCAqLworeworCWNoYXIJCSpwQnVmOworCXVuc2lnbmVkIGludAlPZmZzZXQ7CisJdW5zaWduZWQgaW50CURlc2NyTGVuOworCVNLX1UzMgkJVmFsMzI7CisKKworCS8qIEdldCB0cmFwIGJ1ZmZlciBlbnRyeSAqLworCURlc2NyTGVuID0gU0tfU1RSTEVOKHBBQy0+STJjLlNlblRhYmxlW1NlbnNvckluZGV4XS5TZW5EZXNjKTsKKwlwQnVmID0gR2V0VHJhcEVudHJ5KHBBQywgVHJhcElkLAorCQlTS19QTk1JX1RSQVBfU0VOU09SX0xFTl9CQVNFICsgRGVzY3JMZW4pOworCU9mZnNldCA9IFNLX1BOTUlfVFJBUF9TSU1QTEVfTEVOOworCisJLyogU3RvcmUgYWRkaXRpb25hbGx5IHNlbnNvciB0cmFwIHJlbGF0ZWQgZGF0YSAqLworCVZhbDMyID0gT0lEX1NLR0VfU0VOU09SX0lOREVYOworCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYgKyBPZmZzZXQsIFZhbDMyKTsKKwkqKHBCdWYgKyBPZmZzZXQgKyA0KSA9IDQ7CisJVmFsMzIgPSAoU0tfVTMyKVNlbnNvckluZGV4OworCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYgKyBPZmZzZXQgKyA1LCBWYWwzMik7CisJT2Zmc2V0ICs9IDk7CisJCisJVmFsMzIgPSAoU0tfVTMyKU9JRF9TS0dFX1NFTlNPUl9ERVNDUjsKKwlTS19QTk1JX1NUT1JFX1UzMihwQnVmICsgT2Zmc2V0LCBWYWwzMik7CisJKihwQnVmICsgT2Zmc2V0ICsgNCkgPSAoY2hhcilEZXNjckxlbjsKKwlTS19NRU1DUFkocEJ1ZiArIE9mZnNldCArIDUsIHBBQy0+STJjLlNlblRhYmxlW1NlbnNvckluZGV4XS5TZW5EZXNjLAorCQlEZXNjckxlbik7CisJT2Zmc2V0ICs9IERlc2NyTGVuICsgNTsKKworCVZhbDMyID0gT0lEX1NLR0VfU0VOU09SX1RZUEU7CisJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiArIE9mZnNldCwgVmFsMzIpOworCSoocEJ1ZiArIE9mZnNldCArIDQpID0gMTsKKwkqKHBCdWYgKyBPZmZzZXQgKyA1KSA9IChjaGFyKXBBQy0+STJjLlNlblRhYmxlW1NlbnNvckluZGV4XS5TZW5UeXBlOworCU9mZnNldCArPSA2OworCisJVmFsMzIgPSBPSURfU0tHRV9TRU5TT1JfVkFMVUU7CisJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiArIE9mZnNldCwgVmFsMzIpOworCSoocEJ1ZiArIE9mZnNldCArIDQpID0gNDsKKwlWYWwzMiA9IChTS19VMzIpcEFDLT5JMmMuU2VuVGFibGVbU2Vuc29ySW5kZXhdLlNlblZhbHVlOworCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYgKyBPZmZzZXQgKyA1LCBWYWwzMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFF1ZXVlUmxtdE5ld01hY1RyYXAgLSBTdG9yZSBhIHBvcnQgc3dpdGNoIHRyYXAgaW4gdGhlIHRyYXAgYnVmZmVyCisgKgorICogRGVzY3JpcHRpb246CisgKglOb3RoaW5nIGZ1cnRoZXIgdG8gZXhwbGFpbi4KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitQTk1JX1NUQVRJQyB2b2lkIFF1ZXVlUmxtdE5ld01hY1RyYXAoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK3Vuc2lnbmVkIGludCBBY3RpdmVNYWMpCS8qIEluZGV4ICgwLi5uKSBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBwb3J0ICovCit7CisJY2hhcgkqcEJ1ZjsKKwlTS19VMzIJVmFsMzI7CisKKworCXBCdWYgPSBHZXRUcmFwRW50cnkocEFDLCBPSURfU0tHRV9UUkFQX1JMTVRfQ0hBTkdFX1BPUlQsCisJCVNLX1BOTUlfVFJBUF9STE1UX0NIQU5HRV9MRU4pOworCisJVmFsMzIgPSBPSURfU0tHRV9STE1UX1BPUlRfQUNUSVZFOworCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYgKyBTS19QTk1JX1RSQVBfU0lNUExFX0xFTiwgVmFsMzIpOworCSoocEJ1ZiArIFNLX1BOTUlfVFJBUF9TSU1QTEVfTEVOICsgNCkgPSAxOworCSoocEJ1ZiArIFNLX1BOTUlfVFJBUF9TSU1QTEVfTEVOICsgNSkgPSAoY2hhcilBY3RpdmVNYWM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFF1ZXVlUmxtdFBvcnRUcmFwIC0gU3RvcmUgcG9ydCByZWxhdGVkIFJMTVQgdHJhcCB0byB0cmFwIGJ1ZmZlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJTm90aGluZyBmdXJ0aGVyIHRvIGV4cGxhaW4uCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUE5NSV9TVEFUSUMgdm9pZCBRdWV1ZVJsbXRQb3J0VHJhcCgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfVTMyIFRyYXBJZCwJCS8qIFR5cGUgb2YgUkxNVCBwb3J0IHRyYXAgKi8KK3Vuc2lnbmVkIGludCBQb3J0SW5kZXgpCS8qIEluZGV4IG9mIHRoZSBwb3J0LCB3aGljaCBjaGFuZ2VkIGl0cyBzdGF0ZSAqLworeworCWNoYXIJKnBCdWY7CisJU0tfVTMyCVZhbDMyOworCisKKwlwQnVmID0gR2V0VHJhcEVudHJ5KHBBQywgVHJhcElkLCBTS19QTk1JX1RSQVBfUkxNVF9QT1JUX0xFTik7CisKKwlWYWwzMiA9IE9JRF9TS0dFX1JMTVRfUE9SVF9JTkRFWDsKKwlTS19QTk1JX1NUT1JFX1UzMihwQnVmICsgU0tfUE5NSV9UUkFQX1NJTVBMRV9MRU4sIFZhbDMyKTsKKwkqKHBCdWYgKyBTS19QTk1JX1RSQVBfU0lNUExFX0xFTiArIDQpID0gMTsKKwkqKHBCdWYgKyBTS19QTk1JX1RSQVBfU0lNUExFX0xFTiArIDUpID0gKGNoYXIpUG9ydEluZGV4OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5TWFjIC0gQ29waWVzIGEgTUFDIGFkZHJlc3MKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCU5vdGhpbmcgZnVydGhlciB0byBleHBsYWluLgorICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1BOTUlfU1RBVElDIHZvaWQgQ29weU1hYygKK2NoYXIgKnBEc3QsCQkvKiBQb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlciAqLworU0tfTUFDX0FERFIgKnBNYWMpCS8qIFBvaW50ZXIgb2YgU291cmNlICovCit7CisJaW50CWk7CisKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoU0tfTUFDX0FERFIpOyBpICsrKSB7CisKKwkJKihwRHN0ICsgaSkgPSBwTWFjLT5hW2ldOworCX0KK30KKworI2lmZGVmIFNLX1BPV0VSX01HTVQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFBvd2VyTWFuYWdlbWVudCAtIE9JRCBoYW5kbGVyIGZ1bmN0aW9uIG9mIFBvd2VyTWFuYWdlbWVudCBPSURzCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGUgY29kZSBpcyBzaW1wbGUuIE5vIGRlc2NyaXB0aW9uIG5lY2Vzc2FyeS4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4KKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IGRhdGEgKGUuZy4gYSAzMmJpdCB2YWx1ZSBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCwgYnV0IGEgMTYgYml0IHZhbHVlIHdhcyBwYXNzZWQpLgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2Ugb2YgdGhlIE9JRCBkb2Vzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCAoZS5nLiBwb3J0IGluc3RhbmNlIDMgb24gYSB0d28gcG9ydAorICoJICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXIuCisgKi8KKworUE5NSV9TVEFUSUMgaW50IFBvd2VyTWFuYWdlbWVudCgKK1NLX0FDICpwQUMsCQkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DIElvQywJCS8qIElPIGNvbnRleHQgaGFuZGxlICovCitpbnQgQWN0aW9uLAkJLyogR2V0L1ByZVNldC9TZXQgYWN0aW9uICovCitTS19VMzIgSWQsCQkvKiBPYmplY3QgSUQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQgKi8KK2NoYXIgKnBCdWYsCQkvKiBCdWZmZXIgdG8gd2hpY2ggdG8gbWdtdCBkYXRhIHdpbGwgYmUgcmV0cmlldmVkICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIE9uIGNhbGw6IGJ1ZmZlciBsZW5ndGguIE9uIHJldHVybjogdXNlZCBidWZmZXIgKi8KK1NLX1UzMiBJbnN0YW5jZSwJLyogSW5zdGFuY2UgKDEuLm4pIHRoYXQgaXMgdG8gYmUgcXVlcmllZCBvciAtMSAqLwordW5zaWduZWQgaW50IFRhYmxlSW5kZXgsIC8qIEluZGV4IHRvIHRoZSBJZCB0YWJsZSAqLworU0tfVTMyIE5ldEluZGV4KQkvKiBOZXRJbmRleCAoMC4ubiksIGluIHNpbmdsZSBuZXQgbW9kZSBhbGx3YXlzIHplcm8gKi8KK3sKKwkKKwlTS19VMzIJUmV0Q29kZSA9IFNLX1BOTUlfRVJSX0dFTkVSQUw7CisKKwkvKgorCSAqIENoZWNrIGluc3RhbmNlLiBXZSBvbmx5IGhhbmRsZSBzaW5nbGUgaW5zdGFuY2UgdmFyaWFibGVzCisJICovCisJaWYgKEluc3RhbmNlICE9IChTS19VMzIpKC0xKSAmJiBJbnN0YW5jZSAhPSAxKSB7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCk7CisJfQorCQorICAgIAorICAgIC8qIENoZWNrIGxlbmd0aCAqLworICAgIHN3aXRjaCAoSWQpIHsKKworICAgIGNhc2UgT0lEX1BOUF9DQVBBQklMSVRJRVM6CisgICAgICAgIGlmICgqcExlbiA8IHNpemVvZihTS19QTlBfQ0FQQUJJTElUSUVTKSkgeworCisgICAgICAgICAgICAqcExlbiA9IHNpemVvZihTS19QTlBfQ0FQQUJJTElUSUVTKTsKKyAgICAgICAgICAgIHJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworCWNhc2UgT0lEX1BOUF9TRVRfUE9XRVI6CisgICAgY2FzZSBPSURfUE5QX1FVRVJZX1BPV0VSOgorICAgIAlpZiAoKnBMZW4gPCBzaXplb2YoU0tfREVWSUNFX1BPV0VSX1NUQVRFKSkKKyAgICAJeworICAgIAkJKnBMZW4gPSBzaXplb2YoU0tfREVWSUNFX1BPV0VSX1NUQVRFKTsKKyAgICAJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKyAgICAJfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgT0lEX1BOUF9BRERfV0FLRV9VUF9QQVRURVJOOgorICAgIGNhc2UgT0lEX1BOUF9SRU1PVkVfV0FLRV9VUF9QQVRURVJOOgorCQlpZiAoKnBMZW4gPCBzaXplb2YoU0tfUE1fUEFDS0VUX1BBVFRFUk4pKSB7CisKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1BNX1BBQ0tFVF9QQVRURVJOKTsKKwkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJfQorCQlicmVhazsKKworICAgIGNhc2UgT0lEX1BOUF9FTkFCTEVfV0FLRV9VUDoKKyAgICAgICAgaWYgKCpwTGVuIDwgc2l6ZW9mKFNLX1UzMikpIHsKKworICAgICAgICAgICAgKnBMZW4gPSBzaXplb2YoU0tfVTMyKTsKKyAgICAgICAgICAgIHJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisJCisgICAgLyoKKwkgKiBQZXJmb3JtIGFjdGlvbgorCSAqLworCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9HRVQpIHsKKworCQkvKgorCQkgKiBHZXQgdmFsdWUKKwkJICovCisJCXN3aXRjaCAoSWQpIHsKKworCQljYXNlIE9JRF9QTlBfQ0FQQUJJTElUSUVTOgorCQkJUmV0Q29kZSA9IFNrUG93ZXJRdWVyeVBuUENhcGFiaWxpdGllcyhwQUMsIElvQywgcEJ1ZiwgcExlbik7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9QTlBfUVVFUllfUE9XRVI6CisJCQkvKiBUaGUgV2luZG93cyBEREsgZGVzY3JpYmVzOiBBbiBPSURfUE5QX1FVRVJZX1BPV0VSIHJlcXVlc3RzCisJCQkgdGhlIG1pbmlwb3J0IHRvIGluZGljYXRlIHdoZXRoZXIgaXQgY2FuIHRyYW5zaXRpb24gaXRzIE5JQworCQkJIHRvIHRoZSBsb3ctcG93ZXIgc3RhdGUuCisJCQkgQSBtaW5pcG9ydCBkcml2ZXIgbXVzdCBhbHdheXMgcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1MKKwkJCSB0byBhIHF1ZXJ5IG9mIE9JRF9QTlBfUVVFUllfUE9XRVIuICovCisJCQkqcExlbiA9IHNpemVvZihTS19ERVZJQ0VfUE9XRVJfU1RBVEUpOworICAgICAgICAgICAgUmV0Q29kZSA9IFNLX1BOTUlfRVJSX09LOworCQkJYnJlYWs7CisKKwkJCS8qIE5ESVMgaGFuZGxlcyB0aGVzZSBPSURzIGFzIHdyaXRlLW9ubHkuCisJCQkgKiBTbyBpbiBjYXNlIG9mIGdldCBhY3Rpb24gdGhlIGJ1ZmZlciB3aXRoIHdyaXR0ZW4gbGVuZ3RoID0gMAorCQkJICogaXMgcmV0dXJuZWQKKwkJCSAqLworCQljYXNlIE9JRF9QTlBfU0VUX1BPV0VSOgorCQljYXNlIE9JRF9QTlBfQUREX1dBS0VfVVBfUEFUVEVSTjoKKwkJY2FzZSBPSURfUE5QX1JFTU9WRV9XQUtFX1VQX1BBVFRFUk46CisJCQkqcExlbiA9IDA7CQorICAgICAgICAgICAgUmV0Q29kZSA9IFNLX1BOTUlfRVJSX05PVF9TVVBQT1JURUQ7CisJCQlicmVhazsKKworCQljYXNlIE9JRF9QTlBfRU5BQkxFX1dBS0VfVVA6CisJCQlSZXRDb2RlID0gU2tQb3dlckdldEVuYWJsZVdha2VVcChwQUMsIElvQywgcEJ1ZiwgcExlbik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUmV0Q29kZSA9IFNLX1BOTUlfRVJSX0dFTkVSQUw7CisJCQlicmVhazsKKwkJfQorCisJCXJldHVybiAoUmV0Q29kZSk7CisJfQorCQorCisJLyoKKwkgKiBQZXJmb3JtIHByZXNldCBvciBzZXQKKwkgKi8KKwkKKwkvKiBQT1dFUiBtb2R1bGUgZG9lcyBub3Qgc3VwcG9ydCBQUkVTRVQgYWN0aW9uICovCisJaWYgKEFjdGlvbiA9PSBTS19QTk1JX1BSRVNFVCkgeworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX09LKTsKKwl9CisKKwlzd2l0Y2ggKElkKSB7CisJY2FzZSBPSURfUE5QX1NFVF9QT1dFUjoKKwkJUmV0Q29kZSA9IFNrUG93ZXJTZXRQb3dlcihwQUMsIElvQywgcEJ1ZiwgcExlbik7CQorCQlicmVhazsKKworCWNhc2UgT0lEX1BOUF9BRERfV0FLRV9VUF9QQVRURVJOOgorCQlSZXRDb2RlID0gU2tQb3dlckFkZFdha2VVcFBhdHRlcm4ocEFDLCBJb0MsIHBCdWYsIHBMZW4pOwkKKwkJYnJlYWs7CisJCQorCWNhc2UgT0lEX1BOUF9SRU1PVkVfV0FLRV9VUF9QQVRURVJOOgorCQlSZXRDb2RlID0gU2tQb3dlclJlbW92ZVdha2VVcFBhdHRlcm4ocEFDLCBJb0MsIHBCdWYsIHBMZW4pOwkKKwkJYnJlYWs7CisJCQorCWNhc2UgT0lEX1BOUF9FTkFCTEVfV0FLRV9VUDoKKwkJUmV0Q29kZSA9IFNrUG93ZXJTZXRFbmFibGVXYWtlVXAocEFDLCBJb0MsIHBCdWYsIHBMZW4pOworCQlicmVhazsKKwkJCisJZGVmYXVsdDoKKwkJUmV0Q29kZSA9IFNLX1BOTUlfRVJSX1JFQURfT05MWTsKKwl9CisJCisJcmV0dXJuIChSZXRDb2RlKTsKK30KKyNlbmRpZiAvKiBTS19QT1dFUl9NR01UICovCisKKyNpZmRlZiBTS19ESUFHX1NVUFBPUlQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIERpYWdBY3Rpb25zIC0gT0lEIGhhbmRsZXIgZnVuY3Rpb24gb2YgRGlhZ25vc3RpYyBkcml2ZXIgCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGUgY29kZSBpcyBzaW1wbGUuIE5vIGRlc2NyaXB0aW9uIG5lY2Vzc2FyeS4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkLgorICoJU0tfUE5NSV9FUlJfR0VORVJBTCAgICAgIEEgZ2VuZXJhbCBzZXZlcmUgaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4KKyAqCVNLX1BOTUlfRVJSX1RPT19TSE9SVCAgICBUaGUgcGFzc2VkIGJ1ZmZlciBpcyB0b28gc2hvcnQgdG8gY29udGFpbgorICoJICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb3JyZWN0IGRhdGEgKGUuZy4gYSAzMmJpdCB2YWx1ZSBpcworICoJICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCwgYnV0IGEgMTYgYml0IHZhbHVlIHdhcyBwYXNzZWQpLgorICoJU0tfUE5NSV9FUlJfVU5LTk9XTl9JTlNUIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2Ugb2YgdGhlIE9JRCBkb2Vzbid0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChlLmcuIHBvcnQgaW5zdGFuY2UgMyBvbiBhIHR3byBwb3J0CisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlci4KKyAqLworCitQTk1JX1NUQVRJQyBpbnQgRGlhZ0FjdGlvbnMoCitTS19BQyAqcEFDLAkJLyogUG9pbnRlciB0byBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQyBJb0MsCQkvKiBJTyBjb250ZXh0IGhhbmRsZSAqLworaW50IEFjdGlvbiwJCS8qIEdFVC9QUkVTRVQvU0VUIGFjdGlvbiAqLworU0tfVTMyIElkLAkJLyogT2JqZWN0IElEIHRoYXQgaXMgdG8gYmUgcHJvY2Vzc2VkICovCitjaGFyICpwQnVmLAkJLyogQnVmZmVyIHVzZWQgZm9yIHRoZSBtYW5hZ2VtZW50IGRhdGEgdHJhbnNmZXIgKi8KK3Vuc2lnbmVkIGludCAqcExlbiwJLyogT24gY2FsbDogcEJ1ZiBidWZmZXIgbGVuZ3RoLiBPbiByZXR1cm46IHVzZWQgYnVmZmVyICovCitTS19VMzIgSW5zdGFuY2UsCS8qIEluc3RhbmNlICgxLi5uKSB0aGF0IGlzIHRvIGJlIHF1ZXJpZWQgb3IgLTEgKi8KK3Vuc2lnbmVkIGludCBUYWJsZUluZGV4LCAvKiBJbmRleCB0byB0aGUgSWQgdGFibGUgKi8KK1NLX1UzMiBOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKKworCVNLX1UzMglEaWFnU3RhdHVzOworCVNLX1UzMglSZXRDb2RlID0gU0tfUE5NSV9FUlJfR0VORVJBTDsKKworCS8qCisJICogQ2hlY2sgaW5zdGFuY2UuIFdlIG9ubHkgaGFuZGxlIHNpbmdsZSBpbnN0YW5jZSB2YXJpYWJsZXMuCisJICovCisJaWYgKEluc3RhbmNlICE9IChTS19VMzIpKC0xKSAmJiBJbnN0YW5jZSAhPSAxKSB7CisKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1VOS05PV05fSU5TVCk7CisJfQorCisJLyoKKwkgKiBDaGVjayBsZW5ndGguCisJICovCisJc3dpdGNoIChJZCkgeworCisJY2FzZSBPSURfU0tHRV9ESUFHX01PREU6CisJCWlmICgqcExlbiA8IHNpemVvZihTS19VMzIpKSB7CisKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX1RPT19TSE9SVCk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLX1BOTUlfRVJSMDQwLCBTS19QTk1JX0VSUjA0ME1TRyk7CisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwl9CisKKwkvKiBQZXJmb3JtIGFjdGlvbi4gKi8KKworCS8qIEdFVCB2YWx1ZS4gKi8KKwlpZiAoQWN0aW9uID09IFNLX1BOTUlfR0VUKSB7CisKKwkJc3dpdGNoIChJZCkgeworCisJCWNhc2UgT0lEX1NLR0VfRElBR19NT0RFOgorCQkJRGlhZ1N0YXR1cyA9IHBBQy0+UG5taS5EaWFnQXR0YWNoZWQ7CisJCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBEaWFnU3RhdHVzKTsKKwkJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CQorCQkJUmV0Q29kZSA9IFNLX1BOTUlfRVJSX09LOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCSpwTGVuID0gMDsJCisJCQlSZXRDb2RlID0gU0tfUE5NSV9FUlJfR0VORVJBTDsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiAoUmV0Q29kZSk7IAorCX0KKworCS8qIEZyb20gaGVyZSBTRVQgb3IgUFJFU0VUIHZhbHVlLiAqLworCQorCS8qIFBSRVNFVCB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkLiAqLworCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9QUkVTRVQpIHsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9PSyk7IAorCX0KKworCS8qIFNFVCB2YWx1ZS4gKi8KKwlzd2l0Y2ggKElkKSB7CisJCWNhc2UgT0lEX1NLR0VfRElBR19NT0RFOgorCisJCQkvKiBIYW5kbGUgdGhlIFNFVC4gKi8KKwkJCXN3aXRjaCAoKnBCdWYpIHsKKworCQkJCS8qIEF0dGFjaCB0aGUgRElBRyB0byB0aGlzIGFkYXB0ZXIuICovCisJCQkJY2FzZSBTS19ESUFHX0FUVEFDSEVEOgorCQkJCQkvKiBDaGVjayBpZiB3ZSBjb21lIGZyb20gcnVubmluZyAqLworCQkJCQlpZiAocEFDLT5Qbm1pLkRpYWdBdHRhY2hlZCA9PSBTS19ESUFHX1JVTk5JTkcpIHsKKworCQkJCQkJUmV0Q29kZSA9IFNrRHJ2TGVhdmVEaWFnTW9kZShwQUMpOworCisJCQkJCX0KKwkJCQkJZWxzZSBpZiAocEFDLT5Qbm1pLkRpYWdBdHRhY2hlZCA9PSBTS19ESUFHX0lETEUpIHsKKworCQkJCQkJUmV0Q29kZSA9IFNLX1BOTUlfRVJSX09LOworCQkJCQl9CQorCQkJCQkKKwkJCQkJZWxzZSB7CisKKwkJCQkJCVJldENvZGUgPSBTS19QTk1JX0VSUl9HRU5FUkFMOworCisJCQkJCX0KKwkJCQkJCisJCQkJCWlmIChSZXRDb2RlID09IFNLX1BOTUlfRVJSX09LKSB7CisKKwkJCQkJCXBBQy0+UG5taS5EaWFnQXR0YWNoZWQgPSBTS19ESUFHX0FUVEFDSEVEOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJLyogRW50ZXIgdGhlIERJQUcgbW9kZSBpbiB0aGUgZHJpdmVyLiAqLworCQkJCWNhc2UgU0tfRElBR19SVU5OSU5HOgorCQkJCQlSZXRDb2RlID0gU0tfUE5NSV9FUlJfT0s7CisJCQkJCQorCQkJCQkvKgorCQkJCQkgKiBJZiBEaWFnQXR0YWNoZWQgaXMgc2V0LCB3ZSBjYW4gdGVsbCB0aGUgZHJpdmVyCisJCQkJCSAqIHRvIGVudGVyIHRoZSBESUFHIG1vZGUuCisJCQkJCSAqLworCQkJCQlpZiAocEFDLT5Qbm1pLkRpYWdBdHRhY2hlZCA9PSBTS19ESUFHX0FUVEFDSEVEKSB7CisJCQkJCQkvKiBJZiBEaWFnTW9kZSBpcyBub3QgYWN0aXZlLCB3ZSBjYW4gZW50ZXIgaXQuICovCisJCQkJCQlpZiAoIXBBQy0+RGlhZ01vZGVBY3RpdmUpIHsKKworCQkJCQkJCVJldENvZGUgPSBTa0RydkVudGVyRGlhZ01vZGUocEFDKTsgCisJCQkJCQl9CisJCQkJCQllbHNlIHsKKworCQkJCQkJCVJldENvZGUgPSBTS19QTk1JX0VSUl9HRU5FUkFMOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UgeworCisJCQkJCQlSZXRDb2RlID0gU0tfUE5NSV9FUlJfR0VORVJBTDsKKwkJCQkJfQorCQkJCQkKKwkJCQkJaWYgKFJldENvZGUgPT0gU0tfUE5NSV9FUlJfT0spIHsKKworCQkJCQkJcEFDLT5Qbm1pLkRpYWdBdHRhY2hlZCA9IFNLX0RJQUdfUlVOTklORzsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWNhc2UgU0tfRElBR19JRExFOgorCQkJCQkvKiBDaGVjayBpZiB3ZSBjb21lIGZyb20gcnVubmluZyAqLworCQkJCQlpZiAocEFDLT5Qbm1pLkRpYWdBdHRhY2hlZCA9PSBTS19ESUFHX1JVTk5JTkcpIHsKKworCQkJCQkJUmV0Q29kZSA9IFNrRHJ2TGVhdmVEaWFnTW9kZShwQUMpOworCisJCQkJCX0KKwkJCQkJZWxzZSBpZiAocEFDLT5Qbm1pLkRpYWdBdHRhY2hlZCA9PSBTS19ESUFHX0FUVEFDSEVEKSB7CisKKwkJCQkJCVJldENvZGUgPSBTS19QTk1JX0VSUl9PSzsKKwkJCQkJfQkKKwkJCQkJCisJCQkJCWVsc2UgeworCisJCQkJCQlSZXRDb2RlID0gU0tfUE5NSV9FUlJfR0VORVJBTDsKKworCQkJCQl9CisKKwkJCQkJaWYgKFJldENvZGUgPT0gU0tfUE5NSV9FUlJfT0spIHsKKworCQkJCQkJcEFDLT5Qbm1pLkRpYWdBdHRhY2hlZCA9IFNLX0RJQUdfSURMRTsKKwkJCQkJfQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCVJldENvZGUgPSBTS19QTk1JX0VSUl9CQURfVkFMVUU7CisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVJldENvZGUgPSBTS19QTk1JX0VSUl9HRU5FUkFMOworCX0KKworCWlmIChSZXRDb2RlID09IFNLX1BOTUlfRVJSX09LKSB7CisJCSpwTGVuID0gc2l6ZW9mKFNLX1UzMik7CisJfQorCWVsc2UgeworCisJCSpwTGVuID0gMDsKKwl9CisJcmV0dXJuIChSZXRDb2RlKTsKK30KKyNlbmRpZiAvKiBTS19ESUFHX1NVUFBPUlQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVmN0IC0gT0lEIGhhbmRsZXIgZnVuY3Rpb24gb2YgIE9JRHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoZSBjb2RlIGlzIHNpbXBsZS4gTm8gZGVzY3JpcHRpb24gbmVjZXNzYXJ5LgorICoKKyAqIFJldHVybnM6CisgKglTS19QTk1JX0VSUl9PSyAgICAgICAgICAgVGhlIHJlcXVlc3Qgd2FzIHBlcmZvcm1lZCBzdWNjZXNzZnVsbHkuCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgorICoJU0tfUE5NSV9FUlJfVE9PX1NIT1JUICAgIFRoZSBwYXNzZWQgYnVmZmVyIGlzIHRvbyBzaG9ydCB0byBjb250YWluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3QgZGF0YSAoZS5nLiBhIDMyYml0IHZhbHVlIGlzCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkLCBidXQgYSAxNiBiaXQgdmFsdWUgd2FzIHBhc3NlZCkuCisgKglTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBvZiB0aGUgT0lEIGRvZXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgKGUuZy4gcG9ydCBpbnN0YW5jZSAzIG9uIGEgdHdvIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyKS4KKyAqCVNLX1BOTUlfRVJSX1JFQURfT05MWQkgT25seSB0aGUgR2V0IGFjdGlvbiBpcyBhbGxvd2VkLgorICoKKyAqLworCitQTk1JX1NUQVRJQyBpbnQgVmN0KAorU0tfQUMgKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MgSW9DLAkJLyogSU8gY29udGV4dCBoYW5kbGUgKi8KK2ludCBBY3Rpb24sCQkvKiBHRVQvUFJFU0VUL1NFVCBhY3Rpb24gKi8KK1NLX1UzMiBJZCwJCS8qIE9iamVjdCBJRCB0aGF0IGlzIHRvIGJlIHByb2Nlc3NlZCAqLworY2hhciAqcEJ1ZiwJCS8qIEJ1ZmZlciB1c2VkIGZvciB0aGUgbWFuYWdlbWVudCBkYXRhIHRyYW5zZmVyICovCit1bnNpZ25lZCBpbnQgKnBMZW4sCS8qIE9uIGNhbGw6IHBCdWYgYnVmZmVyIGxlbmd0aC4gT24gcmV0dXJuOiB1c2VkIGJ1ZmZlciAqLworU0tfVTMyIEluc3RhbmNlLAkvKiBJbnN0YW5jZSAoLTEsMi4ubikgdGhhdCBpcyB0byBiZSBxdWVyaWVkICovCit1bnNpZ25lZCBpbnQgVGFibGVJbmRleCwgLyogSW5kZXggdG8gdGhlIElkIHRhYmxlICovCitTS19VMzIgTmV0SW5kZXgpCS8qIE5ldEluZGV4ICgwLi5uKSwgaW4gc2luZ2xlIG5ldCBtb2RlIGFsd2F5cyB6ZXJvICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OworCVNLX1BOTUlfVkNUCSpwVmN0QmFja3VwRGF0YTsKKwlTS19VMzIJCUxvZ1BvcnRNYXg7CisJU0tfVTMyCQlQaHlzUG9ydE1heDsKKwlTS19VMzIJCVBoeXNQb3J0SW5kZXg7CisJU0tfVTMyCQlMaW1pdDsKKwlTS19VMzIJCU9mZnNldDsKKwlTS19CT09MCQlMaW5rOworCVNLX1UzMgkJUmV0Q29kZSA9IFNLX1BOTUlfRVJSX0dFTkVSQUw7CisJaW50CQlpOworCVNLX0VWUEFSQQlQYXJhOworCVNLX1UzMgkJQ2FibGVMZW5ndGg7CisJCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHBvcnQgaW5kZXhlcyBmcm9tIHRoZSBpbnN0YW5jZS4KKwkgKi8KKwlQaHlzUG9ydE1heCA9IHBBQy0+R0luaS5HSU1hY3NGb3VuZDsKKwlMb2dQb3J0TWF4ID0gU0tfUE5NSV9QT1JUX1BIWVMyTE9HKFBoeXNQb3J0TWF4KTsKKwkKKwkvKiBEdWFsIG5ldCBtb2RlPyAqLworCWlmIChwQUMtPlBubWkuRHVhbE5ldEFjdGl2ZUZsYWcgPT0gU0tfVFJVRSkgeworCQlMb2dQb3J0TWF4LS07CisJfQorCQorCWlmICgoSW5zdGFuY2UgIT0gKFNLX1UzMikgKC0xKSkpIHsKKwkJLyogQ2hlY2sgaW5zdGFuY2UgcmFuZ2UuICovCisJCWlmICgoSW5zdGFuY2UgPCAyKSB8fCAoSW5zdGFuY2UgPiBMb2dQb3J0TWF4KSkgeworCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QpOworCQl9CisJCQorCQlpZiAocEFDLT5Qbm1pLkR1YWxOZXRBY3RpdmVGbGFnID09IFNLX1RSVUUpIHsKKwkJCVBoeXNQb3J0SW5kZXggPSBOZXRJbmRleDsKKwkJfQorCQllbHNlIHsKKwkJCVBoeXNQb3J0SW5kZXggPSBJbnN0YW5jZSAtIDI7CisJCX0KKwkJTGltaXQgPSBQaHlzUG9ydEluZGV4ICsgMTsKKwl9CisJZWxzZSB7CisJCS8qCisJCSAqIEluc3RhbmNlID09IChTS19VMzIpICgtMSksIGdldCBhbGwgSW5zdGFuY2VzIG9mIHRoYXQgT0lELgorCQkgKgorCQkgKiBOb3QgaW1wbGVtZW50ZWQgeWV0LiBNYXkgYmUgdXNlZCBpbiBmdXR1cmUgcmVsZWFzZXMuCisJCSAqLworCQlQaHlzUG9ydEluZGV4ID0gMDsKKwkJTGltaXQgPSBQaHlzUG9ydE1heDsKKwl9CisJCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF07CisJaWYgKHBQcnQtPlBIV0xpbmtVcCkgeworCQlMaW5rID0gU0tfVFJVRTsKKwl9CisJZWxzZSB7CisJCUxpbmsgPSBTS19GQUxTRTsKKwl9CisJCisJLyogQ2hlY2sgTUFDIHR5cGUgKi8KKwlpZiAocFBydC0+UGh5VHlwZSAhPSBTS19QSFlfTUFSVl9DT1BQRVIpIHsKKwkJKnBMZW4gPSAwOworCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCX0KKwkKKwkvKiBJbml0aWFsaXplIGJhY2t1cCBkYXRhIHBvaW50ZXIuICovCisJcFZjdEJhY2t1cERhdGEgPSAmcEFDLT5Qbm1pLlZjdEJhY2t1cFtQaHlzUG9ydEluZGV4XTsKKwkKKwkvKiBDaGVjayBhY3Rpb24gdHlwZSAqLworCWlmIChBY3Rpb24gPT0gU0tfUE5NSV9HRVQpIHsKKwkJLyogQ2hlY2sgbGVuZ3RoICovCisJCXN3aXRjaCAoSWQpIHsKKwkJCisJCWNhc2UgT0lEX1NLR0VfVkNUX0dFVDoKKwkJCWlmICgqcExlbiA8IChMaW1pdCAtIFBoeXNQb3J0SW5kZXgpICogc2l6ZW9mKFNLX1BOTUlfVkNUKSkgeworCQkJCSpwTGVuID0gKExpbWl0IC0gUGh5c1BvcnRJbmRleCkgKiBzaXplb2YoU0tfUE5NSV9WQ1QpOworCQkJCXJldHVybiAoU0tfUE5NSV9FUlJfVE9PX1NIT1JUKTsKKwkJCX0KKwkJCWJyZWFrOworCQkKKwkJY2FzZSBPSURfU0tHRV9WQ1RfU1RBVFVTOgorCQkJaWYgKCpwTGVuIDwgKExpbWl0IC0gUGh5c1BvcnRJbmRleCkgKiBzaXplb2YoU0tfVTgpKSB7CisJCQkJKnBMZW4gPSAoTGltaXQgLSBQaHlzUG9ydEluZGV4KSAqIHNpemVvZihTS19VOCk7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQkJfQorCQkJYnJlYWs7CisJCQorCQlkZWZhdWx0OgorCQkJKnBMZW4gPSAwOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJfQkKKwkJCisJCS8qIEdldCB2YWx1ZSAqLworCQlPZmZzZXQgPSAwOworCQlmb3IgKDsgUGh5c1BvcnRJbmRleCA8IExpbWl0OyBQaHlzUG9ydEluZGV4KyspIHsKKwkJCXN3aXRjaCAoSWQpIHsKKwkJCQorCQkJY2FzZSBPSURfU0tHRV9WQ1RfR0VUOgorCQkJCWlmICgoTGluayA9PSBTS19GQUxTRSkgJiYKKwkJCQkJKHBBQy0+UG5taS5WY3RTdGF0dXNbUGh5c1BvcnRJbmRleF0gJiBTS19QTk1JX1ZDVF9QRU5ESU5HKSkgeworCQkJCQlSZXRDb2RlID0gU2tHbUNhYmxlRGlhZ1N0YXR1cyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwgU0tfRkFMU0UpOworCQkJCQlpZiAoUmV0Q29kZSA9PSAwKSB7CisJCQkJCQlwQUMtPlBubWkuVmN0U3RhdHVzW1BoeXNQb3J0SW5kZXhdICY9IH5TS19QTk1JX1ZDVF9QRU5ESU5HOworCQkJCQkJcEFDLT5Qbm1pLlZjdFN0YXR1c1tQaHlzUG9ydEluZGV4XSB8PQorCQkJCQkJCShTS19QTk1JX1ZDVF9ORVdfVkNUX0RBVEEgfCBTS19QTk1JX1ZDVF9URVNUX0RPTkUpOworCQkJCQkJCisJCQkJCQkvKiBDb3B5IHJlc3VsdHMgZm9yIGxhdGVyIHVzZSB0byBQTk1JIHN0cnVjdC4gKi8KKwkJCQkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspICB7CisJCQkJCQkJaWYgKHBQcnQtPlBNZGlQYWlyU3RzW2ldID09IFNLX1BOTUlfVkNUX05PUk1BTF9DQUJMRSkgeworCQkJCQkJCQlpZiAoKHBQcnQtPlBNZGlQYWlyTGVuW2ldID4gMzUpICYmIChwUHJ0LT5QTWRpUGFpckxlbltpXSA8IDB4ZmYpKSB7CisJCQkJCQkJCQlwUHJ0LT5QTWRpUGFpclN0c1tpXSA9IFNLX1BOTUlfVkNUX0lNUEVEQU5DRV9NSVNNQVRDSDsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlpZiAoKHBQcnQtPlBNZGlQYWlyTGVuW2ldID4gMzUpICYmIChwUHJ0LT5QTWRpUGFpckxlbltpXSAhPSAweGZmKSkgeworCQkJCQkJCQlDYWJsZUxlbmd0aCA9IDEwMDAgKiAoKCgxNzUgKiBwUHJ0LT5QTWRpUGFpckxlbltpXSkgLyAyMTApIC0gMjgpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIHsKKwkJCQkJCQkJQ2FibGVMZW5ndGggPSAwOworCQkJCQkJCX0KKwkJCQkJCQlwVmN0QmFja3VwRGF0YS0+UE1kaVBhaXJMZW5baV0gPSBDYWJsZUxlbmd0aDsKKwkJCQkJCQlwVmN0QmFja3VwRGF0YS0+UE1kaVBhaXJTdHNbaV0gPSBwUHJ0LT5QTWRpUGFpclN0c1tpXTsKKwkJCQkJCX0KKworCQkJCQkJUGFyYS5QYXJhMzJbMF0gPSBQaHlzUG9ydEluZGV4OworCQkJCQkJUGFyYS5QYXJhMzJbMV0gPSAtMTsKKwkJCQkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUE9SVF9SRVNFVCwgUGFyYSk7CisJCQkJCQlTa0V2ZW50RGlzcGF0Y2hlcihwQUMsIElvQyk7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQk7IC8qIFZDVCB0ZXN0IGlzIHJ1bm5pbmcuICovCisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJLyogR2V0IGFsbCByZXN1bHRzLiAqLworCQkJCUNoZWNrVmN0U3RhdHVzKHBBQywgSW9DLCBwQnVmLCBPZmZzZXQsIFBoeXNQb3J0SW5kZXgpOworCQkJCU9mZnNldCArPSBzaXplb2YoU0tfVTgpOworCQkJCSoocEJ1ZiArIE9mZnNldCkgPSBwUHJ0LT5QQ2FibGVMZW47CisJCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VOCk7CisJCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgIHsKKwkJCQkJU0tfUE5NSV9TVE9SRV9VMzIoKHBCdWYgKyBPZmZzZXQpLCBwVmN0QmFja3VwRGF0YS0+UE1kaVBhaXJMZW5baV0pOworCQkJCQlPZmZzZXQgKz0gc2l6ZW9mKFNLX1UzMik7CisJCQkJfQorCQkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspICB7CisJCQkJCSoocEJ1ZiArIE9mZnNldCkgPSBwVmN0QmFja3VwRGF0YS0+UE1kaVBhaXJTdHNbaV07CisJCQkJCU9mZnNldCArPSBzaXplb2YoU0tfVTgpOworCQkJCX0KKwkJCQkKKwkJCQlSZXRDb2RlID0gU0tfUE5NSV9FUlJfT0s7CisJCQkJYnJlYWs7CisJCQorCQkJY2FzZSBPSURfU0tHRV9WQ1RfU1RBVFVTOgorCQkJCUNoZWNrVmN0U3RhdHVzKHBBQywgSW9DLCBwQnVmLCBPZmZzZXQsIFBoeXNQb3J0SW5kZXgpOworCQkJCU9mZnNldCArPSBzaXplb2YoU0tfVTgpOworCQkJCVJldENvZGUgPSBTS19QTk1JX0VSUl9PSzsKKwkJCQlicmVhazsKKwkJCQorCQkJZGVmYXVsdDoKKwkJCQkqcExlbiA9IDA7CisJCQkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwkJCX0KKwkJfSAvKiBmb3IgKi8KKwkJKnBMZW4gPSBPZmZzZXQ7CisJCXJldHVybiAoUmV0Q29kZSk7CisJCisJfSAvKiBpZiBTS19QTk1JX0dFVCAqLworCQorCS8qCisJICogRnJvbSBoZXJlIFNFVCBvciBQUkVTRVQgYWN0aW9uLiBDaGVjayBpZiB0aGUgcGFzc2VkCisJICogYnVmZmVyIGxlbmd0aCBpcyBwbGF1c2libGUuCisJICovCisJCisJLyogQ2hlY2sgbGVuZ3RoICovCisJc3dpdGNoIChJZCkgeworCWNhc2UgT0lEX1NLR0VfVkNUX1NFVDoKKwkJaWYgKCpwTGVuIDwgKExpbWl0IC0gUGh5c1BvcnRJbmRleCkgKiBzaXplb2YoU0tfVTMyKSkgeworCQkJKnBMZW4gPSAoTGltaXQgLSBQaHlzUG9ydEluZGV4KSAqIHNpemVvZihTS19VMzIpOworCQkJcmV0dXJuIChTS19QTk1JX0VSUl9UT09fU0hPUlQpOworCQl9CisJCWJyZWFrOworCQorCWRlZmF1bHQ6CisJCSpwTGVuID0gMDsKKwkJcmV0dXJuIChTS19QTk1JX0VSUl9HRU5FUkFMKTsKKwl9CisJCisJLyoKKwkgKiBQZXJmb3JtIHByZXNldCBvciBzZXQuCisJICovCisJCisJLyogVkNUIGRvZXMgbm90IHN1cHBvcnQgUFJFU0VUIGFjdGlvbi4gKi8KKwlpZiAoQWN0aW9uID09IFNLX1BOTUlfUFJFU0VUKSB7CisJCXJldHVybiAoU0tfUE5NSV9FUlJfT0spOworCX0KKwkKKwlPZmZzZXQgPSAwOworCWZvciAoOyBQaHlzUG9ydEluZGV4IDwgTGltaXQ7IFBoeXNQb3J0SW5kZXgrKykgeworCQlzd2l0Y2ggKElkKSB7CisJCWNhc2UgT0lEX1NLR0VfVkNUX1NFVDogLyogU3RhcnQgVkNUIHRlc3QuICovCisJCQlpZiAoTGluayA9PSBTS19GQUxTRSkgeworCQkJCVNrR2VTdG9wUG9ydChwQUMsIElvQywgUGh5c1BvcnRJbmRleCwgU0tfU1RPUF9BTEwsIFNLX1NPRlRfUlNUKTsKKwkJCQkKKwkJCQlSZXRDb2RlID0gU2tHbUNhYmxlRGlhZ1N0YXR1cyhwQUMsIElvQywgUGh5c1BvcnRJbmRleCwgU0tfVFJVRSk7CisJCQkJaWYgKFJldENvZGUgPT0gMCkgeyAvKiBSZXRDb2RlOiAwID0+IFN0YXJ0ISAqLworCQkJCQlwQUMtPlBubWkuVmN0U3RhdHVzW1BoeXNQb3J0SW5kZXhdIHw9IFNLX1BOTUlfVkNUX1BFTkRJTkc7CisJCQkJCXBBQy0+UG5taS5WY3RTdGF0dXNbUGh5c1BvcnRJbmRleF0gJj0gflNLX1BOTUlfVkNUX05FV19WQ1RfREFUQTsKKwkJCQkJcEFDLT5Qbm1pLlZjdFN0YXR1c1tQaHlzUG9ydEluZGV4XSAmPSB+U0tfUE5NSV9WQ1RfTElOSzsKKwkJCQkJCisJCQkJCS8qCisJCQkJCSAqIFN0YXJ0IFZDVCB0aW1lciBjb3VudGVyLgorCQkJCQkgKi8KKwkJCQkJU0tfTUVNU0VUKChjaGFyICopICZQYXJhLCAwLCBzaXplb2YoUGFyYSkpOworCQkJCQlQYXJhLlBhcmEzMlswXSA9IFBoeXNQb3J0SW5kZXg7CisJCQkJCVBhcmEuUGFyYTMyWzFdID0gLTE7CisJCQkJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBBQy0+UG5taS5WY3RUaW1lb3V0W1BoeXNQb3J0SW5kZXhdLlZjdFRpbWVyLAorCQkJCQkJNDAwMDAwMCwgU0tHRV9QTk1JLCBTS19QTk1JX0VWVF9WQ1RfUkVTRVQsIFBhcmEpOworCQkJCQlTS19QTk1JX1NUT1JFX1UzMigocEJ1ZiArIE9mZnNldCksIFJldENvZGUpOworCQkJCQlSZXRDb2RlID0gU0tfUE5NSV9FUlJfT0s7CisJCQkJfQorCQkJCWVsc2UgeyAvKiBSZXRDb2RlOiAyID0+IFJ1bm5pbmchICovCisJCQkJCVNLX1BOTUlfU1RPUkVfVTMyKChwQnVmICsgT2Zmc2V0KSwgUmV0Q29kZSk7CisJCQkJCVJldENvZGUgPSBTS19QTk1JX0VSUl9PSzsKKwkJCQl9CisJCQl9CisJCQllbHNlIHsgLyogUmV0Q29kZTogNCA9PiBMaW5rISAqLworCQkJCVJldENvZGUgPSA0OworCQkJCVNLX1BOTUlfU1RPUkVfVTMyKChwQnVmICsgT2Zmc2V0KSwgUmV0Q29kZSk7CisJCQkJUmV0Q29kZSA9IFNLX1BOTUlfRVJSX09LOworCQkJfQorCQkJT2Zmc2V0ICs9IHNpemVvZihTS19VMzIpOworCQkJYnJlYWs7CisJCisJCWRlZmF1bHQ6CisJCQkqcExlbiA9IDA7CisJCQlyZXR1cm4gKFNLX1BOTUlfRVJSX0dFTkVSQUwpOworCQl9CisJfSAvKiBmb3IgKi8KKwkqcExlbiA9IE9mZnNldDsKKwlyZXR1cm4gKFJldENvZGUpOworCit9IC8qIFZjdCAqLworCisKK1BOTUlfU1RBVElDIHZvaWQgQ2hlY2tWY3RTdGF0dXMoCitTS19BQwkJKnBBQywKK1NLX0lPQwkJSW9DLAorY2hhcgkJKnBCdWYsCitTS19VMzIJCU9mZnNldCwKK1NLX1UzMgkJUGh5c1BvcnRJbmRleCkKK3sKKwlTS19HRVBPUlQgCSpwUHJ0OworCVNLX1BOTUlfVkNUCSpwVmN0RGF0YTsKKwlTS19VMzIJCVJldENvZGU7CisJCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUGh5c1BvcnRJbmRleF07CisJCisJcFZjdERhdGEgPSAoU0tfUE5NSV9WQ1QgKikgKHBCdWYgKyBPZmZzZXQpOworCXBWY3REYXRhLT5WY3RTdGF0dXMgPSBTS19QTk1JX1ZDVF9OT05FOworCQorCWlmICghcFBydC0+UEhXTGlua1VwKSB7CisJCQorCQkvKiBXYXMgYSBWQ1QgdGVzdCBldmVyIG1hZGUgYmVmb3JlPyAqLworCQlpZiAocEFDLT5Qbm1pLlZjdFN0YXR1c1tQaHlzUG9ydEluZGV4XSAmIFNLX1BOTUlfVkNUX1RFU1RfRE9ORSkgeworCQkJaWYgKChwQUMtPlBubWkuVmN0U3RhdHVzW1BoeXNQb3J0SW5kZXhdICYgU0tfUE5NSV9WQ1RfTElOSykpIHsKKwkJCQlwVmN0RGF0YS0+VmN0U3RhdHVzIHw9IFNLX1BOTUlfVkNUX09MRF9WQ1RfREFUQTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXBWY3REYXRhLT5WY3RTdGF0dXMgfD0gU0tfUE5NSV9WQ1RfTkVXX1ZDVF9EQVRBOworCQkJfQorCQl9CisJCQorCQkvKiBDaGVjayBWQ1QgdGVzdCBzdGF0dXMuICovCisJCVJldENvZGUgPSBTa0dtQ2FibGVEaWFnU3RhdHVzKHBBQyxJb0MsIFBoeXNQb3J0SW5kZXgsIFNLX0ZBTFNFKTsKKwkJaWYgKFJldENvZGUgPT0gMikgeyAvKiBWQ1QgdGVzdCBpcyBydW5uaW5nLiAqLworCQkJcFZjdERhdGEtPlZjdFN0YXR1cyB8PSBTS19QTk1JX1ZDVF9SVU5OSU5HOworCQl9CisJCWVsc2UgeyAvKiBWQ1QgZGF0YSB3YXMgY29waWVkIHRvIHBBQyBoZXJlLiBDaGVjayBQRU5ESU5HIHN0YXRlLiAqLworCQkJaWYgKHBBQy0+UG5taS5WY3RTdGF0dXNbUGh5c1BvcnRJbmRleF0gJiBTS19QTk1JX1ZDVF9QRU5ESU5HKSB7CisJCQkJcFZjdERhdGEtPlZjdFN0YXR1cyB8PSBTS19QTk1JX1ZDVF9ORVdfVkNUX0RBVEE7CisJCQl9CisJCX0KKwkJCisJCWlmIChwUHJ0LT5QQ2FibGVMZW4gIT0gMHhmZikgeyAvKiBPbGQgRFNQIHZhbHVlLiAqLworCQkJcFZjdERhdGEtPlZjdFN0YXR1cyB8PSBTS19QTk1JX1ZDVF9PTERfRFNQX0RBVEE7CisJCX0KKwl9CisJZWxzZSB7CisJCQorCQkvKiBXYXMgYSBWQ1QgdGVzdCBldmVyIG1hZGUgYmVmb3JlPyAqLworCQlpZiAocEFDLT5Qbm1pLlZjdFN0YXR1c1tQaHlzUG9ydEluZGV4XSAmIFNLX1BOTUlfVkNUX1RFU1RfRE9ORSkgeworCQkJcFZjdERhdGEtPlZjdFN0YXR1cyAmPSB+U0tfUE5NSV9WQ1RfTkVXX1ZDVF9EQVRBOworCQkJcFZjdERhdGEtPlZjdFN0YXR1cyB8PSBTS19QTk1JX1ZDVF9PTERfVkNUX0RBVEE7CisJCX0KKwkJCisJCS8qIERTUCBvbmx5IHZhbGlkIGluIDEwMC8xMDAwIG1vZGVzLiAqLworCQlpZiAocEFDLT5HSW5pLkdQW1BoeXNQb3J0SW5kZXhdLlBMaW5rU3BlZWRVc2VkICE9CisJCQlTS19MU1BFRURfU1RBVF8xME1CUFMpIHsJCisJCQlwVmN0RGF0YS0+VmN0U3RhdHVzIHw9IFNLX1BOTUlfVkNUX05FV19EU1BfREFUQTsKKwkJfQorCX0KK30gLyogQ2hlY2tWY3RTdGF0dXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgIFNrUG5taUdlbklvY3RsIC0gSGFuZGxlcyBuZXcgZ2VuZXJpYyBQTk1JIElPQ1RMLCBjYWxscyB0aGUgbmVlZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgUE5NSSBmdW5jdGlvbiBkZXBlbmRpbmcgb24gdGhlIHN1YmNvbW1hbmQgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyBhbGwgZGF0YSBiZWxvbmdpbmcgdG8gdGhlIGNvbXBsZXRlIGRhdGFiYXNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgb3IgT0lEIHJlcXVlc3QuCisgKgorICogRGVzY3JpcHRpb246CisgKglMb29rcyB1cCB0aGUgcmVxdWVzdGVkIHN1YmNvbW1hbmQsIGNhbGxzIHRoZSBjb3JyZXNwb25kaW5nIGhhbmRsZXIKKyAqCWZ1bmN0aW9uIGFuZCBwYXNzZXMgYWxsIHJlcXVpcmVkIHBhcmFtZXRlcnMgdG8gaXQuCisgKglUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBkcml2ZXIuIEl0IGlzIG5lZWRlZCB0byBoYW5kbGUgdGhlIG5ldworICogIGdlbmVyaWMgUE5NSSBJT0NUTC4gVGhpcyBJT0NUTCBpcyBnaXZlbiB0byB0aGUgZHJpdmVyIGFuZCBjb250YWlucyBib3RoCisgKiAgdGhlIE9JRCBhbmQgYSBzdWJjb21tYW5kIHRvIGRlY2lkZSB3aGF0IGtpbmQgb2YgcmVxdWVzdCBoYXMgdG8gYmUgZG9uZS4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfUE5NSV9FUlJfT0sgICAgICAgICAgIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkCisgKglTS19QTk1JX0VSUl9HRU5FUkFMICAgICAgQSBnZW5lcmFsIHNldmVyZSBpbnRlcm5hbCBlcnJvciBvY2N1cmVkCisgKglTS19QTk1JX0VSUl9UT09fU0hPUlQgICAgVGhlIHBhc3NlZCBidWZmZXIgaXMgdG9vIHNob3J0IHRvIHRha2UKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0YS4KKyAqCVNLX1BOTUlfRVJSX1VOS05PV05fT0lEICBUaGUgcmVxdWVzdGVkIE9JRCBpcyB1bmtub3duCisgKglTS19QTk1JX0VSUl9VTktOT1dOX0lOU1QgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBvZiB0aGUgT0lEIGRvZXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgKGUuZy4gcG9ydCBpbnN0YW5jZSAzIG9uIGEgdHdvIHBvcnQKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLgorICovCitpbnQgU2tQbm1pR2VuSW9jdGwoCitTS19BQwkJKnBBQywJCS8qIFBvaW50ZXIgdG8gYWRhcHRlciBjb250ZXh0IHN0cnVjdCAqLworU0tfSU9DCQlJb0MsCQkvKiBJL08gY29udGV4dCAqLwordm9pZAkJKnBCdWYsCQkvKiBCdWZmZXIgdXNlZCBmb3IgdGhlIG1hbmFnZW1lbnQgZGF0YSB0cmFuc2ZlciAqLwordW5zaWduZWQgaW50ICpwTGVuLAkJLyogTGVuZ3RoIG9mIGJ1ZmZlciAqLworU0tfVTMyCQlOZXRJbmRleCkJLyogTmV0SW5kZXggKDAuLm4pLCBpbiBzaW5nbGUgbmV0IG1vZGUgYWx3YXlzIHplcm8gKi8KK3sKK1NLX0kzMglNb2RlOwkJCS8qIFN0b3JlIHZhbHVlIG9mIHN1YmNvbW1hbmQuICovCitTS19VMzIJT2lkOwkJCS8qIFN0b3JlIHZhbHVlIG9mIE9JRC4gKi8KK2ludAkJUmV0dXJuQ29kZTsJCS8qIFN0b3JlIHJldHVybiB2YWx1ZSB0byBzaG93IHN0YXR1cyBvZiBQTk1JIGFjdGlvbi4gKi8KK2ludCAJSGVhZGVyTGVuZ3RoOwkvKiBMZW5ndGggb2YgZGVzaXJlZCBhY3Rpb24gcGx1cyBPSUQuICovCisKKwlSZXR1cm5Db2RlID0gU0tfUE5NSV9FUlJfR0VORVJBTDsKKwkKKwlTS19NRU1DUFkoJk1vZGUsIHBCdWYsIHNpemVvZihTS19JMzIpKTsKKwlTS19NRU1DUFkoJk9pZCwgKGNoYXIgKikgcEJ1ZiArIHNpemVvZihTS19JMzIpLCBzaXplb2YoU0tfVTMyKSk7CisJSGVhZGVyTGVuZ3RoID0gc2l6ZW9mKFNLX0kzMikgKyBzaXplb2YoU0tfVTMyKTsKKwkqcExlbiA9ICpwTGVuIC0gSGVhZGVyTGVuZ3RoOworCVNLX01FTUNQWSgoY2hhciAqKSBwQnVmICsgc2l6ZW9mKFNLX0kzMiksIChjaGFyICopIHBCdWYgKyBIZWFkZXJMZW5ndGgsICpwTGVuKTsKKwkKKwlzd2l0Y2goTW9kZSkgeworCWNhc2UgU0tfR0VUX1NJTkdMRV9WQVI6CisJCVJldHVybkNvZGUgPSBTa1BubWlHZXRWYXIocEFDLCBJb0MsIE9pZCwgCisJCQkJKGNoYXIgKikgcEJ1ZiArIHNpemVvZihTS19JMzIpLCBwTGVuLAorCQkJCSgoU0tfVTMyKSAoLTEpKSwgTmV0SW5kZXgpOworCQlTS19QTk1JX1NUT1JFX1UzMihwQnVmLCBSZXR1cm5Db2RlKTsKKwkJKnBMZW4gPSAqcExlbiArIHNpemVvZihTS19JMzIpOworCQlicmVhazsKKwljYXNlIFNLX1BSRVNFVF9TSU5HTEVfVkFSOgorCQlSZXR1cm5Db2RlID0gU2tQbm1pUHJlU2V0VmFyKHBBQywgSW9DLCBPaWQsIAorCQkJCShjaGFyICopIHBCdWYgKyBzaXplb2YoU0tfSTMyKSwgcExlbiwKKwkJCQkoKFNLX1UzMikgKC0xKSksIE5ldEluZGV4KTsKKwkJU0tfUE5NSV9TVE9SRV9VMzIocEJ1ZiwgUmV0dXJuQ29kZSk7CisJCSpwTGVuID0gKnBMZW4gKyBzaXplb2YoU0tfSTMyKTsKKwkJYnJlYWs7CisJY2FzZSBTS19TRVRfU0lOR0xFX1ZBUjoKKwkJUmV0dXJuQ29kZSA9IFNrUG5taVNldFZhcihwQUMsIElvQywgT2lkLCAKKwkJCQkoY2hhciAqKSBwQnVmICsgc2l6ZW9mKFNLX0kzMiksIHBMZW4sCisJCQkJKChTS19VMzIpICgtMSkpLCBOZXRJbmRleCk7CisJCVNLX1BOTUlfU1RPUkVfVTMyKHBCdWYsIFJldHVybkNvZGUpOworCQkqcExlbiA9ICpwTGVuICsgc2l6ZW9mKFNLX0kzMik7CisJCWJyZWFrOworCWNhc2UgU0tfR0VUX0ZVTExfTUlCOgorCQlSZXR1cm5Db2RlID0gU2tQbm1pR2V0U3RydWN0KHBBQywgSW9DLCBwQnVmLCBwTGVuLCBOZXRJbmRleCk7CisJCWJyZWFrOworCWNhc2UgU0tfUFJFU0VUX0ZVTExfTUlCOgorCQlSZXR1cm5Db2RlID0gU2tQbm1pUHJlU2V0U3RydWN0KHBBQywgSW9DLCBwQnVmLCBwTGVuLCBOZXRJbmRleCk7CisJCWJyZWFrOworCWNhc2UgU0tfU0VUX0ZVTExfTUlCOgorCQlSZXR1cm5Db2RlID0gU2tQbm1pU2V0U3RydWN0KHBBQywgSW9DLCBwQnVmLCBwTGVuLCBOZXRJbmRleCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwkKKwlyZXR1cm4gKFJldHVybkNvZGUpOworCit9IC8qIFNrR2VJb2NHZW4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZXNpcnEuYyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZXNpcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzUyMGYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlc2lycS5jCkBAIC0wLDAgKzEsMjI1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrZ2VzaXJxLmMKKyAqIFByb2plY3Q6CUdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcnMsIENvbW1vbiBNb2R1bGVzCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuOTIgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDkvMTYgMTQ6Mzc6MDcgJAorICogUHVycG9zZToJU3BlY2lhbCBJUlEgbW9kdWxlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKglTcGVjaWFsIEludGVycnVwdCBoYW5kbGVyCisgKgorICoJVGhlIGZvbGxvd2luZyBhYnN0cmFjdCBzaG91bGQgc2hvdyBob3cgdGhpcyBtb2R1bGUgaXMgaW5jbHVkZWQKKyAqCWluIHRoZSBkcml2ZXIgcGF0aDoKKyAqCisgKglJbiB0aGUgSVNSIG9mIHRoZSBkcml2ZXIgdGhlIGJpdHMgZm9yIGZyYW1lIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSBhbmQKKyAqCWZvciByZWNlaXZlIGNvbXBsZXRlIGFyZSBjaGVja2VkIGFuZCBoYW5kbGVkIGJ5IHRoZSBkcml2ZXIgaXRzZWxmLgorICoJVGhlIGJpdHMgb2YgdGhlIHNsb3cgcGF0aCBtYXNrIGFyZSBjaGVja2VkIGFmdGVyIHRoYXQgYW5kIHRoZW4gdGhlCisgKgllbnRyeSBpbnRvIHRoZSBzby1jYWxsZWQgInNsb3cgcGF0aCIgaXMgcHJlcGFyZWQuIEl0IGlzIGFuIGltcGxlbWVudG9ycworICoJZGVjaXNpb24gd2hldGhlciB0aGlzIGlzIGV4ZWN1dGVkIGRpcmVjdGx5IG9yIGp1c3Qgc2NoZWR1bGVkIGJ5CisgKglkaXNhYmxpbmcgdGhlIG1hc2suIEluIHRoZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIHNvbWUgZXZlbnRzIG1heSBiZQorICoJZ2VuZXJhdGVkLCBzbyBpdCB3b3VsZCBiZSBhIGdvb2QgaWRlYSB0byBjYWxsIHRoZSBFdmVudERpc3BhdGNoZXIKKyAqCXJpZ2h0IGFmdGVyIHRoaXMgSVNSLgorICoKKyAqCVRoZSBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyIG9mIHRoZSBhZGFwdGVyIGlzIE5PVCByZWFkIGJ5IHRoaXMgbW9kdWxlLgorICogIFNPIGlmIHRoZSBkcml2ZXJzIGltcGxlbWVudG9yIG5lZWRzIGEgd2hpbGUgbG9vcCBhcm91bmQgdGhlCisgKglzbG93IGRhdGEgcGF0aHMgaW50ZXJydXB0IGJpdHMsIGhlIG5lZWRzIHRvIGNhbGwgdGhlIFNrR2VTaXJxSXNyKCkgZm9yCisgKgllYWNoIGxvb3AgZW50ZXJlZC4KKyAqCisgKglIb3dldmVyLCB0aGUgTUFDIEludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXJzIGFyZSByZWFkIGluIGEgd2hpbGUgbG9vcC4KKyAqCisgKi8KKworI2lmIChkZWZpbmVkKERFQlVHKSB8fCAoKCFkZWZpbmVkKExJTlQpKSAmJiAoIWRlZmluZWQoU0tfU0xJTSkpKSkKK3N0YXRpYyBjb25zdCBjaGFyIFN5c0tvbm5lY3RGaWxlSWRbXSA9CisJIkAoIykgJElkOiBza2dlc2lycS5jLHYgMS45MiAyMDAzLzA5LzE2IDE0OjM3OjA3IHJzY2htaWR0IEV4cCAkIChDKSBNYXJ2ZWxsLiI7CisjZW5kaWYKKworI2luY2x1ZGUgImgvc2tkcnYxc3QuaCIJCS8qIERyaXZlciBTcGVjaWZpYyBEZWZpbml0aW9ucyAqLworI2lmbmRlZiBTS19TTElNCisjaW5jbHVkZSAiaC9za2dlcG5taS5oIgkJLyogUE5NSSBEZWZpbml0aW9ucyAqLworI2luY2x1ZGUgImgvc2tybG10LmgiCQkvKiBSTE1UIERlZmluaXRpb25zICovCisjZW5kaWYKKyNpbmNsdWRlICJoL3NrZHJ2Mm5kLmgiCQkvKiBBZGFwdGVyIENvbnRyb2wgYW5kIERyaXZlciBzcGVjaWZpYyBEZWYuICovCisKKy8qIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKyNpZmRlZiBHRU5FU0lTCitzdGF0aWMgaW50CVNrR2VQb3J0Q2hlY2tVcFhtYWMoU0tfQUMqLCBTS19JT0MsIGludCwgU0tfQk9PTCk7CitzdGF0aWMgaW50CVNrR2VQb3J0Q2hlY2tVcEJjb20oU0tfQUMqLCBTS19JT0MsIGludCwgU0tfQk9PTCk7CitzdGF0aWMgdm9pZAlTa1BoeUlzckJjb20oU0tfQUMqLCBTS19JT0MsIGludCwgU0tfVTE2KTsKKyNlbmRpZiAvKiBHRU5FU0lTICovCisjaWZkZWYgWVVLT04KK3N0YXRpYyBpbnQJU2tHZVBvcnRDaGVja1VwR21hYyhTS19BQyosIFNLX0lPQywgaW50LCBTS19CT09MKTsKK3N0YXRpYyB2b2lkCVNrUGh5SXNyR21hYyhTS19BQyosIFNLX0lPQywgaW50LCBTS19VMTYpOworI2VuZGlmIC8qIFlVS09OICovCisjaWZkZWYgT1RIRVJfUEhZCitzdGF0aWMgaW50CVNrR2VQb3J0Q2hlY2tVcExvbmUoU0tfQUMqLCBTS19JT0MsIGludCwgU0tfQk9PTCk7CitzdGF0aWMgaW50CVNrR2VQb3J0Q2hlY2tVcE5hdChTS19BQyosIFNLX0lPQywgaW50LCBTS19CT09MKTsKK3N0YXRpYyB2b2lkCVNrUGh5SXNyTG9uZShTS19BQyosIFNLX0lPQywgaW50LCBTS19VMTYpOworI2VuZGlmIC8qIE9USEVSX1BIWSAqLworCisjaWZkZWYgR0VORVNJUworLyoKKyAqIGFycmF5IG9mIFJ4IGNvdW50ZXIgZnJvbSBYTUFDIHdoaWNoIGFyZSBjaGVja2VkCisgKiBpbiBBdXRvU2Vuc2UgbW9kZSB0byBjaGVjayB3aGV0aGVyIGEgbGluayBpcyBub3QgYWJsZSB0byBhdXRvLW5lZ290aWF0ZS4KKyAqLworc3RhdGljIGNvbnN0IFNLX1UxNiBTa0dlUnhSZWdzW109IHsKKwlYTV9SWEZfNjRCLAorCVhNX1JYRl8xMjdCLAorCVhNX1JYRl8yNTVCLAorCVhNX1JYRl81MTFCLAorCVhNX1JYRl8xMDIzQiwKKwlYTV9SWEZfTUFYX1NaCit9IDsKKyNlbmRpZiAvKiBHRU5FU0lTICovCisKKyNpZmRlZiBfX0MyTUFOX18KKy8qCisgKglTcGVjaWFsIElSUSBmdW5jdGlvbgorICoKKyAqCUdlbmVyYWwgRGVzY3JpcHRpb246CisgKgorICovCitpbnRybygpCit7fQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0hXSW5pdERlZlNlbnNlKCkgLSBEZWZhdWx0IEF1dG9zZW5zaW5nIG1vZGUgaW5pdGlhbGl6YXRpb24KKyAqCisgKiBEZXNjcmlwdGlvbjogc2V0cyB0aGUgUExpbmtNb2RlIGZvciBIV0luaXQKKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqLworc3RhdGljIHZvaWQgU2tIV0luaXREZWZTZW5zZSgKK1NLX0FDCSpwQUMsCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OwkJLyogR0luaSBQb3J0IHN0cnVjdCBwb2ludGVyICovCisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCXBQcnQtPlBBdXRvTmVnVGltZU91dCA9IDA7CisKKwlpZiAocFBydC0+UExpbmtNb2RlQ29uZiAhPSBTS19MTU9ERV9BVVRPU0VOU0UpIHsKKwkJcFBydC0+UExpbmtNb2RlID0gcFBydC0+UExpbmtNb2RlQ29uZjsKKwkJcmV0dXJuOworCX0KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSVJRLAorCQkoIkF1dG9TZW5zaW5nOiBGaXJzdCBtb2RlICVkIG9uIFBvcnQgJWRcbiIsCisJCShpbnQpU0tfTE1PREVfQVVUT0ZVTEwsIFBvcnQpKTsKKworCXBQcnQtPlBMaW5rTW9kZSA9IChTS19VOClTS19MTU9ERV9BVVRPRlVMTDsKKworCXJldHVybjsKK30JLyogU2tIV0luaXREZWZTZW5zZSAqLworCisKKyNpZmRlZiBHRU5FU0lTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tIV1NlbnNlR2V0TmV4dCgpIC0gR2V0IE5leHQgQXV0b3NlbnNpbmcgTW9kZQorICoKKyAqIERlc2NyaXB0aW9uOiBnZXRzIHRoZSBhcHByb3ByaWF0ZSBuZXh0IG1vZGUKKyAqCisgKiBOb3RlOgorICoKKyAqLworc3RhdGljIFNLX1U4IFNrSFdTZW5zZUdldE5leHQoCitTS19BQwkqcEFDLAkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworCVNLX0dFUE9SVAkqcFBydDsJCS8qIEdJbmkgUG9ydCBzdHJ1Y3QgcG9pbnRlciAqLworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlwUHJ0LT5QQXV0b05lZ1RpbWVPdXQgPSAwOworCisgICAgaWYgKHBQcnQtPlBMaW5rTW9kZUNvbmYgIT0gKFNLX1U4KVNLX0xNT0RFX0FVVE9TRU5TRSkgeworCQkvKiBMZWF2ZSBhbGwgYXMgY29uZmlndXJlZCAqLworCQlyZXR1cm4ocFBydC0+UExpbmtNb2RlQ29uZik7CisJfQorCisgICAgaWYgKHBQcnQtPlBMaW5rTW9kZSA9PSAoU0tfVTgpU0tfTE1PREVfQVVUT0ZVTEwpIHsKKwkJLyogUmV0dXJuIG5leHQgbW9kZSBBVVRPQk9USCAqLworICAgICAgICByZXR1cm4gKChTS19VOClTS19MTU9ERV9BVVRPQk9USCk7CisJfQorCisJLyogUmV0dXJuIGRlZmF1bHQgYXV0b2Z1bGwgKi8KKyAgICByZXR1cm4gKChTS19VOClTS19MTU9ERV9BVVRPRlVMTCk7Cit9CS8qIFNrSFdTZW5zZUdldE5leHQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tIV1NlbnNlU2V0TmV4dCgpIC0gQXV0b3NlbnNpbmcgU2V0IG5leHQgbW9kZQorICoKKyAqIERlc2NyaXB0aW9uOglzZXRzIHRoZSBhcHByb3ByaWF0ZSBuZXh0IG1vZGUKKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqLworc3RhdGljIHZvaWQgU2tIV1NlbnNlU2V0TmV4dCgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitTS19VOAlOZXdNb2RlKQkvKiBOZXcgTW9kZSB0byBiZSB3cml0dGVuIGluIHNlbnNlIG1vZGUgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CQkvKiBHSW5pIFBvcnQgc3RydWN0IHBvaW50ZXIgKi8KKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJcFBydC0+UEF1dG9OZWdUaW1lT3V0ID0gMDsKKworICAgIGlmIChwUHJ0LT5QTGlua01vZGVDb25mICE9IChTS19VOClTS19MTU9ERV9BVVRPU0VOU0UpIHsKKwkJcmV0dXJuOworCX0KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSVJRLAorCQkoIkF1dG9TZW5zaW5nOiBuZXh0IG1vZGUgJWQgb24gUG9ydCAlZFxuIiwKKwkJKGludClOZXdNb2RlLCBQb3J0KSk7CisKKwlwUHJ0LT5QTGlua01vZGUgPSBOZXdNb2RlOworCisJcmV0dXJuOworfQkvKiBTa0hXU2Vuc2VTZXROZXh0ICovCisjZW5kaWYgLyogR0VORVNJUyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0hXTGlua0Rvd24oKSAtIExpbmsgRG93biBoYW5kbGluZworICoKKyAqIERlc2NyaXB0aW9uOiBoYW5kbGVzIHRoZSBoYXJkd2FyZSBsaW5rIGRvd24gc2lnbmFsCisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3ZvaWQgU2tIV0xpbmtEb3duKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CQkvKiBHSW5pIFBvcnQgc3RydWN0IHBvaW50ZXIgKi8KKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJLyogRGlzYWJsZSBhbGwgTUFDIGludGVycnVwdHMgKi8KKwlTa01hY0lycURpc2FibGUocEFDLCBJb0MsIFBvcnQpOworCisJLyogRGlzYWJsZSBSZWNlaXZlciBhbmQgVHJhbnNtaXR0ZXIgKi8KKwlTa01hY1J4VHhEaXNhYmxlKHBBQywgSW9DLCBQb3J0KTsKKwkKKwkvKiBJbml0IGRlZmF1bHQgc2Vuc2UgbW9kZSAqLworCVNrSFdJbml0RGVmU2Vuc2UocEFDLCBJb0MsIFBvcnQpOworCisJaWYgKHBQcnQtPlBIV0xpbmtVcCA9PSBTS19GQUxTRSkgeworCQlyZXR1cm47CisJfQorCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCSgiTGluayBkb3duIFBvcnQgJWRcbiIsIFBvcnQpKTsKKworCS8qIFNldCBMaW5rIHRvIERPV04gKi8KKwlwUHJ0LT5QSFdMaW5rVXAgPSBTS19GQUxTRTsKKworCS8qIFJlc2V0IFBvcnQgc3RhdGkgKi8KKyAgICBwUHJ0LT5QTGlua01vZGVTdGF0dXMgPSAoU0tfVTgpU0tfTE1PREVfU1RBVF9VTktOT1dOOworICAgIHBQcnQtPlBGbG93Q3RybFN0YXR1cyA9IChTS19VOClTS19GTE9XX1NUQVRfTk9ORTsKKwlwUHJ0LT5QTGlua1NwZWVkVXNlZCA9IChTS19VOClTS19MU1BFRURfU1RBVF9JTkRFVEVSTUlOQVRFRDsKKworCS8qIFJlLWluaXQgUGh5IGVzcGVjaWFsbHkgd2hlbiB0aGUgQXV0b1NlbnNlIGRlZmF1bHQgaXMgc2V0IG5vdyAqLworCVNrTWFjSW5pdFBoeShwQUMsIElvQywgUG9ydCwgU0tfRkFMU0UpOworCisJLyogR1AwOiB1c2VkIGZvciB3b3JrYXJvdW5kIG9mIFJldi4gQyBFcnJhdGEgMiAqLworCisJLyogRG8gTk9UIHNpZ25hbCB0byBSTE1UICovCisKKwkvKiBEbyBOT1Qgc3RhcnQgdGhlIHRpbWVyIGhlcmUgKi8KK30JLyogU2tIV0xpbmtEb3duICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrSFdMaW5rVXAoKSAtIExpbmsgVXAgaGFuZGxpbmcKKyAqCisgKiBEZXNjcmlwdGlvbjogaGFuZGxlcyB0aGUgaGFyZHdhcmUgbGluayB1cCBzaWduYWwKKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqLwordm9pZCBTa0hXTGlua1VwKAorU0tfQUMJKnBBQywJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CQkvKiBHSW5pIFBvcnQgc3RydWN0IHBvaW50ZXIgKi8KKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJaWYgKHBQcnQtPlBIV0xpbmtVcCkgeworCQkvKiBXZSBkbyBOT1QgbmVlZCB0byBwcm9jZWVkIG9uIGFjdGl2ZSBsaW5rICovCisJCXJldHVybjsKKwl9CisKKwlwUHJ0LT5QSFdMaW5rVXAgPSBTS19UUlVFOworCXBQcnQtPlBBdXRvTmVnRmFpbCA9IFNLX0ZBTFNFOworICAgIHBQcnQtPlBMaW5rTW9kZVN0YXR1cyA9IChTS19VOClTS19MTU9ERV9TVEFUX1VOS05PV047CisKKyAgICBpZiAocFBydC0+UExpbmtNb2RlICE9IChTS19VOClTS19MTU9ERV9BVVRPSEFMRiAmJgorICAgICAgICBwUHJ0LT5QTGlua01vZGUgIT0gKFNLX1U4KVNLX0xNT0RFX0FVVE9GVUxMICYmCisgICAgICAgIHBQcnQtPlBMaW5rTW9kZSAhPSAoU0tfVTgpU0tfTE1PREVfQVVUT0JPVEgpIHsKKwkJLyogTGluayBpcyB1cCBhbmQgbm8gQXV0by1uZWdvdGlhdGlvbiBzaG91bGQgYmUgZG9uZSAqLworCisJCS8qIExpbmsgc3BlZWQgc2hvdWxkIGJlIHRoZSBjb25maWd1cmVkIG9uZSAqLworCQlzd2l0Y2ggKHBQcnQtPlBMaW5rU3BlZWQpIHsKKwkJY2FzZSBTS19MU1BFRURfQVVUTzoKKwkJCS8qIGRlZmF1bHQgaXMgMTAwMCBNYnBzICovCisJCWNhc2UgU0tfTFNQRUVEXzEwMDBNQlBTOgorCQkJcFBydC0+UExpbmtTcGVlZFVzZWQgPSAoU0tfVTgpU0tfTFNQRUVEX1NUQVRfMTAwME1CUFM7CisJCQlicmVhazsKKwkJY2FzZSBTS19MU1BFRURfMTAwTUJQUzoKKwkJCXBQcnQtPlBMaW5rU3BlZWRVc2VkID0gKFNLX1U4KVNLX0xTUEVFRF9TVEFUXzEwME1CUFM7CisJCQlicmVhazsKKwkJY2FzZSBTS19MU1BFRURfMTBNQlBTOgorCQkJcFBydC0+UExpbmtTcGVlZFVzZWQgPSAoU0tfVTgpU0tfTFNQRUVEX1NUQVRfMTBNQlBTOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBTZXQgTGluayBNb2RlIFN0YXR1cyAqLworCQlpZiAocFBydC0+UExpbmtNb2RlID09IFNLX0xNT0RFX0ZVTEwpIHsKKwkJCXBQcnQtPlBMaW5rTW9kZVN0YXR1cyA9IChTS19VOClTS19MTU9ERV9TVEFUX0ZVTEw7CisJCX0KKwkJZWxzZSB7CisgICAgICAgICAgICBwUHJ0LT5QTGlua01vZGVTdGF0dXMgPSAoU0tfVTgpU0tfTE1PREVfU1RBVF9IQUxGOworCQl9CisKKwkJLyogTm8gZmxvdyBjb250cm9sIHdpdGhvdXQgYXV0by1uZWdvdGlhdGlvbiAqLworICAgICAgICBwUHJ0LT5QRmxvd0N0cmxTdGF0dXMgPSAoU0tfVTgpU0tfRkxPV19TVEFUX05PTkU7CisKKwkJLyogZW5hYmxlIFJ4L1R4ICovCisgICAgICAgICh2b2lkKVNrTWFjUnhUeEVuYWJsZShwQUMsIElvQywgUG9ydCk7CisJfQorfQkvKiBTa0hXTGlua1VwICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrTWFjUGFyaXR5KCkgLSBNQUMgcGFyaXR5IHdvcmthcm91bmQKKyAqCisgKiBEZXNjcmlwdGlvbjogaGFuZGxlcyBNQUMgcGFyaXR5IGVycm9ycyBjb3JyZWN0bHkKKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqLworc3RhdGljIHZvaWQgU2tNYWNQYXJpdHkoCitTS19BQwkqcEFDLAkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJLyogUG9ydCBJbmRleCBvZiB0aGUgcG9ydCBmYWlsZWQgKi8KK3sKKwlTS19FVlBBUkEJUGFyYTsKKwlTS19HRVBPUlQJKnBQcnQ7CQkvKiBHSW5pIFBvcnQgc3RydWN0IHBvaW50ZXIgKi8KKwlTS19VMzIJCVR4TWF4OwkJLyogVHggTWF4IFNpemUgQ291bnRlciAqLworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwkvKiBDbGVhciBJUlEgVHggUGFyaXR5IEVycm9yICovCisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisKKwkJU0tfT1VUMTYoSW9DLCBNUl9BRERSKFBvcnQsIFRYX01GRl9DVFJMMSksIE1GRl9DTFJfUEVSUik7CisJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCWlmIChwQUMtPkdJbmkuR0lZdWtvbikgeworCQkvKiBIVy1CdWcgIzg6IGNsZWFyZWQgYnkgR01GX0NMSV9UWF9GQyBpbnN0ZWFkIG9mIEdNRl9DTElfVFhfUEUgKi8KKwkJU0tfT1VUOChJb0MsIE1SX0FERFIoUG9ydCwgVFhfR01GX0NUUkxfVCksCisJCQkoU0tfVTgpKChwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9ZVUtPTiAmJgorCQkJcEFDLT5HSW5pLkdJQ2hpcFJldiA9PSAwKSA/IEdNRl9DTElfVFhfRkMgOiBHTUZfQ0xJX1RYX1BFKSk7CisJfQorI2VuZGlmIC8qIFlVS09OICovCisJCisJaWYgKHBQcnQtPlBDaGVja1BhcikgeworCisJCWlmIChQb3J0ID09IE1BQ18xKSB7CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX1NJUlFfRTAxNiwgU0tFUlJfU0lSUV9FMDE2TVNHKTsKKwkJfQorCQllbHNlIHsKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVywgU0tFUlJfU0lSUV9FMDE3LCBTS0VSUl9TSVJRX0UwMTdNU0cpOworCQl9CisJCVBhcmEuUGFyYTY0ID0gUG9ydDsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9QT1JUX0ZBSUwsIFBhcmEpOworCQkKKwkJUGFyYS5QYXJhMzJbMF0gPSBQb3J0OworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfTElOS19ET1dOLCBQYXJhKTsKKworCQlyZXR1cm47CisJfQorCisJLyogQ2hlY2sgd2hldGhlciBmcmFtZXMgd2l0aCBhIHNpemUgb2YgMWsgd2VyZSBzZW50ICovCisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCS8qIFNuYXAgc3RhdGlzdGljIGNvdW50ZXJzICovCisJCSh2b2lkKVNrWG1VcGRhdGVTdGF0cyhwQUMsIElvQywgUG9ydCk7CisJCQorCQkodm9pZClTa1htTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQb3J0LCBYTV9UWEZfTUFYX1NaLCAmVHhNYXgpOworCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisJCisjaWZkZWYgWVVLT04KKwlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKworCQkodm9pZClTa0dtTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQb3J0LCBHTV9UWEZfMTUxOEIsICZUeE1heCk7CisJfQorI2VuZGlmIC8qIFlVS09OICovCisJCisJaWYgKFR4TWF4ID4gMCkgeworCQkvKiBGcm9tIG5vdyBvbiBjaGVjayB0aGUgcGFyaXR5ICovCisJCXBQcnQtPlBDaGVja1BhciA9IFNLX1RSVUU7CisJfQorfQkvKiBTa01hY1Bhcml0eSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dlSHdFcnIoKSAtIEhhcmR3YXJlIEVycm9yIHNlcnZpY2Ugcm91dGluZQorICoKKyAqIERlc2NyaXB0aW9uOiBoYW5kbGVzIGFsbCBIVyBFcnJvciBpbnRlcnJ1cHRzCisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3N0YXRpYyB2b2lkIFNrR2VId0VycigKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitTS19VMzIJSHdTdGF0dXMpCS8qIEludGVycnVwdCBzdGF0dXMgd29yZCAqLworeworCVNLX0VWUEFSQQlQYXJhOworCVNLX1UxNgkJV29yZDsKKworCWlmICgoSHdTdGF0dXMgJiAoSVNfSVJRX01TVF9FUlIgfCBJU19JUlFfU1RBVCkpICE9IDApIHsKKwkJLyogUENJIEVycm9ycyBvY2N1cmVkICovCisJCWlmICgoSHdTdGF0dXMgJiBJU19JUlFfU1RBVCkgIT0gMCkgeworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9TSVJRX0UwMTMsIFNLRVJSX1NJUlFfRTAxM01TRyk7CisJCX0KKwkJZWxzZSB7CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX1NJUlFfRTAxMiwgU0tFUlJfU0lSUV9FMDEyTVNHKTsKKwkJfQorCisJCS8qIFJlc2V0IGFsbCBiaXRzIGluIHRoZSBQQ0kgU1RBVFVTIHJlZ2lzdGVyICovCisJCVNLX0lOMTYoSW9DLCBQQ0lfQyhQQ0lfU1RBVFVTKSwgJldvcmQpOworCQkKKwkJU0tfT1VUOChJb0MsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PTik7CisgICAgICAgIFNLX09VVDE2KElvQywgUENJX0MoUENJX1NUQVRVUyksIChTS19VMTYpKFdvcmQgfCBQQ0lfRVJSQklUUykpOworCQlTS19PVVQ4KElvQywgQjJfVFNUX0NUUkwxLCBUU1RfQ0ZHX1dSSVRFX09GRik7CisKKwkJUGFyYS5QYXJhNjQgPSAwOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX0FEQVBfRkFJTCwgUGFyYSk7CisJfQorCisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisKKwkJaWYgKChId1N0YXR1cyAmIElTX05PX1NUQVRfTTEpICE9IDApIHsKKwkJCS8qIElnbm9yZSBpdCAqLworCQkJLyogVGhpcyBzaXR1YXRpb24gaXMgYWxzbyBpbmRpY2F0ZWQgaW4gdGhlIGRlc2NyaXB0b3IgKi8KKwkJCVNLX09VVDE2KElvQywgTVJfQUREUihNQUNfMSwgUlhfTUZGX0NUUkwxKSwgTUZGX0NMUl9JTlNUQVQpOworCQl9CisKKwkJaWYgKChId1N0YXR1cyAmIElTX05PX1NUQVRfTTIpICE9IDApIHsKKwkJCS8qIElnbm9yZSBpdCAqLworCQkJLyogVGhpcyBzaXR1YXRpb24gaXMgYWxzbyBpbmRpY2F0ZWQgaW4gdGhlIGRlc2NyaXB0b3IgKi8KKwkJCVNLX09VVDE2KElvQywgTVJfQUREUihNQUNfMiwgUlhfTUZGX0NUUkwxKSwgTUZGX0NMUl9JTlNUQVQpOworCQl9CisKKwkJaWYgKChId1N0YXR1cyAmIElTX05PX1RJU1RfTTEpICE9IDApIHsKKwkJCS8qIElnbm9yZSBpdCAqLworCQkJLyogVGhpcyBzaXR1YXRpb24gaXMgYWxzbyBpbmRpY2F0ZWQgaW4gdGhlIGRlc2NyaXB0b3IgKi8KKwkJCVNLX09VVDE2KElvQywgTVJfQUREUihNQUNfMSwgUlhfTUZGX0NUUkwxKSwgTUZGX0NMUl9JTlRJU1QpOworCQl9CisKKwkJaWYgKChId1N0YXR1cyAmIElTX05PX1RJU1RfTTIpICE9IDApIHsKKwkJCS8qIElnbm9yZSBpdCAqLworCQkJLyogVGhpcyBzaXR1YXRpb24gaXMgYWxzbyBpbmRpY2F0ZWQgaW4gdGhlIGRlc2NyaXB0b3IgKi8KKwkJCVNLX09VVDE2KElvQywgTVJfQUREUihNQUNfMiwgUlhfTUZGX0NUUkwxKSwgTUZGX0NMUl9JTlRJU1QpOworCQl9CisJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCWlmIChwQUMtPkdJbmkuR0lZdWtvbikgeworCQkvKiBUaGlzIGlzIG5lY2Vzc2FyeSBvbmx5IGZvciBSeCB0aW1pbmcgbWVhc3VyZW1lbnRzICovCisJCWlmICgoSHdTdGF0dXMgJiBJU19JUlFfVElTVF9PVikgIT0gMCkgeworCQkJLyogaW5jcmVtZW50IFRpbWUgU3RhbXAgVGltZXIgY291bnRlciAoaGlnaCkgKi8KKwkJCXBBQy0+R0luaS5HSVRpbWVTdGFtcENudCsrOworCisJCQkvKiBDbGVhciBUaW1lIFN0YW1wIFRpbWVyIElSUSAqLworCQkJU0tfT1VUOChJb0MsIEdNQUNfVElfU1RfQ1RSTCwgKFNLX1U4KUdNVF9TVF9DTFJfSVJRKTsKKwkJfQorCisJCWlmICgoSHdTdGF0dXMgJiBJU19JUlFfU0VOU09SKSAhPSAwKSB7CisJCQkvKiBubyBzZW5zb3JzIG9uIDMyLWJpdCBZdWtvbiAqLworCQkJaWYgKHBBQy0+R0luaS5HSVl1a29uMzJCaXQpIHsKKwkJCQkvKiBkaXNhYmxlIEhXIEVycm9yIElSUSAqLworCQkJCXBBQy0+R0luaS5HSVZhbElycU1hc2sgJj0gfklTX0hXX0VSUjsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCisJaWYgKChId1N0YXR1cyAmIElTX1JBTV9SRF9QQVIpICE9IDApIHsKKwkJU0tfT1VUMTYoSW9DLCBCM19SSV9DVFJMLCBSSV9DTFJfUkRfUEVSUik7CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVywgU0tFUlJfU0lSUV9FMDE0LCBTS0VSUl9TSVJRX0UwMTRNU0cpOworCQlQYXJhLlBhcmE2NCA9IDA7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfQURBUF9GQUlMLCBQYXJhKTsKKwl9CisKKwlpZiAoKEh3U3RhdHVzICYgSVNfUkFNX1dSX1BBUikgIT0gMCkgeworCQlTS19PVVQxNihJb0MsIEIzX1JJX0NUUkwsIFJJX0NMUl9XUl9QRVJSKTsKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9TSVJRX0UwMTUsIFNLRVJSX1NJUlFfRTAxNU1TRyk7CisJCVBhcmEuUGFyYTY0ID0gMDsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9BREFQX0ZBSUwsIFBhcmEpOworCX0KKworCWlmICgoSHdTdGF0dXMgJiBJU19NMV9QQVJfRVJSKSAhPSAwKSB7CisJCVNrTWFjUGFyaXR5KHBBQywgSW9DLCBNQUNfMSk7CisJfQorCisJaWYgKChId1N0YXR1cyAmIElTX00yX1BBUl9FUlIpICE9IDApIHsKKwkJU2tNYWNQYXJpdHkocEFDLCBJb0MsIE1BQ18yKTsKKwl9CisKKwlpZiAoKEh3U3RhdHVzICYgSVNfUjFfUEFSX0VSUikgIT0gMCkgeworCQkvKiBDbGVhciBJUlEgKi8KKwkJU0tfT1VUMzIoSW9DLCBCMF9SMV9DU1IsIENTUl9JUlFfQ0xfUCk7CisKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9TSVJRX0UwMTgsIFNLRVJSX1NJUlFfRTAxOE1TRyk7CisJCVBhcmEuUGFyYTY0ID0gTUFDXzE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUE9SVF9GQUlMLCBQYXJhKTsKKwkJCisJCVBhcmEuUGFyYTMyWzBdID0gTUFDXzE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9MSU5LX0RPV04sIFBhcmEpOworCX0KKworCWlmICgoSHdTdGF0dXMgJiBJU19SMl9QQVJfRVJSKSAhPSAwKSB7CisJCS8qIENsZWFyIElSUSAqLworCQlTS19PVVQzMihJb0MsIEIwX1IyX0NTUiwgQ1NSX0lSUV9DTF9QKTsKKworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX1NJUlFfRTAxOSwgU0tFUlJfU0lSUV9FMDE5TVNHKTsKKwkJUGFyYS5QYXJhNjQgPSBNQUNfMjsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9QT1JUX0ZBSUwsIFBhcmEpOworCQkKKwkJUGFyYS5QYXJhMzJbMF0gPSBNQUNfMjsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX0xJTktfRE9XTiwgUGFyYSk7CisJfQorfQkvKiBTa0dlSHdFcnIgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZVNpcnFJc3IoKSAtIFNwZWNpYWwgSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZQorICoKKyAqIERlc2NyaXB0aW9uOiBoYW5kbGVzIGFsbCBub24gZGF0YSB0cmFuc2ZlciBzcGVjaWZpYyBpbnRlcnJ1cHRzIChzbG93IHBhdGgpCisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3ZvaWQgU2tHZVNpcnFJc3IoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworU0tfVTMyCUlzdGF0dXMpCS8qIEludGVycnVwdCBzdGF0dXMgd29yZCAqLworeworCVNLX0VWUEFSQQlQYXJhOworCVNLX1UzMgkJUmVnVmFsMzI7CS8qIFJlYWQgcmVnaXN0ZXIgdmFsdWUgKi8KKwlTS19HRVBPUlQJKnBQcnQ7CQkvKiBHSW5pIFBvcnQgc3RydWN0IHBvaW50ZXIgKi8KKwlTS19VMTYgCQlQaHlJbnQ7CisJaW50CQkJaTsKKworCWlmICgoKElzdGF0dXMgJiBJU19IV19FUlIpICYgcEFDLT5HSW5pLkdJVmFsSXJxTWFzaykgIT0gMCkgeworCQkvKiByZWFkIHRoZSBIVyBFcnJvciBJbnRlcnJ1cHQgc291cmNlICovCisJCVNLX0lOMzIoSW9DLCBCMF9IV0VfSVNSQywgJlJlZ1ZhbDMyKTsKKwkJCisJCVNrR2VId0VycihwQUMsIElvQywgUmVnVmFsMzIpOworCX0KKworCS8qCisJICogUGFja2V0IFRpbWVvdXQgaW50ZXJydXB0cworCSAqLworCS8qIENoZWNrIHdoZXRoZXIgTUFDcyBhcmUgY29ycmVjdGx5IGluaXRpYWxpemVkICovCisJaWYgKCgoSXN0YXR1cyAmIChJU19QQV9UT19SWDEgfCBJU19QQV9UT19UWDEpKSAhPSAwKSAmJgorCQlwQUMtPkdJbmkuR1BbTUFDXzFdLlBTdGF0ZSA9PSBTS19QUlRfUkVTRVQpIHsKKwkJLyogTUFDIDEgd2FzIG5vdCBpbml0aWFsaXplZCBidXQgUGFja2V0IHRpbWVvdXQgb2NjdXJlZCAqLworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1cgfCBTS19FUlJDTF9JTklULCBTS0VSUl9TSVJRX0UwMDQsCisJCQlTS0VSUl9TSVJRX0UwMDRNU0cpOworCX0KKworCWlmICgoKElzdGF0dXMgJiAoSVNfUEFfVE9fUlgyIHwgSVNfUEFfVE9fVFgyKSkgIT0gMCkgJiYKKwkgICAgcEFDLT5HSW5pLkdQW01BQ18yXS5QU3RhdGUgPT0gU0tfUFJUX1JFU0VUKSB7CisJCS8qIE1BQyAyIHdhcyBub3QgaW5pdGlhbGl6ZWQgYnV0IFBhY2tldCB0aW1lb3V0IG9jY3VyZWQgKi8KKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXIHwgU0tfRVJSQ0xfSU5JVCwgU0tFUlJfU0lSUV9FMDA1LAorCQkJU0tFUlJfU0lSUV9FMDA1TVNHKTsKKwl9CisKKwlpZiAoKElzdGF0dXMgJiBJU19QQV9UT19SWDEpICE9IDApIHsKKwkJLyogTWVhbnMgbmV0d29yayBpcyBmaWxsaW5nIHVzIHVwICovCisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVyB8IFNLX0VSUkNMX0lOSVQsIFNLRVJSX1NJUlFfRTAwMiwKKwkJCVNLRVJSX1NJUlFfRTAwMk1TRyk7CisJCVNLX09VVDE2KElvQywgQjNfUEFfQ1RSTCwgUEFfQ0xSX1RPX1JYMSk7CisJfQorCisJaWYgKChJc3RhdHVzICYgSVNfUEFfVE9fUlgyKSAhPSAwKSB7CisJCS8qIE1lYW5zIG5ldHdvcmsgaXMgZmlsbGluZyB1cyB1cCAqLworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcgfCBTS19FUlJDTF9JTklULCBTS0VSUl9TSVJRX0UwMDMsCisJCQlTS0VSUl9TSVJRX0UwMDNNU0cpOworCQlTS19PVVQxNihJb0MsIEIzX1BBX0NUUkwsIFBBX0NMUl9UT19SWDIpOworCX0KKworCWlmICgoSXN0YXR1cyAmIElTX1BBX1RPX1RYMSkgIT0gMCkgeworCQkKKwkJcFBydCA9ICZwQUMtPkdJbmkuR1BbMF07CisKKwkJLyogTWF5IGJlIGEgbm9ybWFsIHNpdHVhdGlvbiBpbiBhIHNlcnZlciB3aXRoIGEgc2xvdyBuZXR3b3JrICovCisJCVNLX09VVDE2KElvQywgQjNfUEFfQ1RSTCwgUEFfQ0xSX1RPX1RYMSk7CisKKyNpZmRlZiBHRU5FU0lTCisJCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQkvKgorCQkJICogd29ya2Fyb3VuZDogaWYgaW4gaGFsZiBkdXBsZXggbW9kZSwgY2hlY2sgZm9yIFR4IGhhbmd1cC4KKwkJCSAqIFJlYWQgbnVtYmVyIG9mIFRYJ2VkIGJ5dGVzLCB3YWl0IGZvciAxMCBtcywgdGhlbiBjb21wYXJlCisJCQkgKiB0aGUgbnVtYmVyIHdpdGggY3VycmVudCB2YWx1ZS4gSWYgbm90aGluZyBjaGFuZ2VkLCB3ZSBhc3N1bWUKKwkJCSAqIHRoYXQgVHggaXMgaGFuZ2luZyBhbmQgZG8gYSBGSUZPIGZsdXNoIChzZWUgZXZlbnQgcm91dGluZSkuCisJCQkgKi8KKwkJCWlmICgocFBydC0+UExpbmtNb2RlU3RhdHVzID09IFNLX0xNT0RFX1NUQVRfSEFMRiB8fAorCQkJCXBQcnQtPlBMaW5rTW9kZVN0YXR1cyA9PSBTS19MTU9ERV9TVEFUX0FVVE9IQUxGKSAmJgorCQkJCSFwUHJ0LT5IYWxmRHVwVGltZXJBY3RpdmUpIHsKKwkJCQkvKgorCQkJCSAqIG1hbnkgbW9yZSBwYWNrLiBhcmIuIHRpbWVvdXRzIG1heSBjb21lIGluIGJldHdlZW4sCisJCQkJICogd2UgaWdub3JlIHRob3NlCisJCQkJICovCisJCQkJcFBydC0+SGFsZkR1cFRpbWVyQWN0aXZlID0gU0tfVFJVRTsKKyNpZmRlZiBYWFgKKwkJCQlMZW4gPSBzaXplb2YoU0tfVTY0KTsKKwkJCQlTa1BubWlHZXRWYXIocEFDLCBJb0MsIE9JRF9TS0dFX1NUQVRfVFhfT0NURVRTLCAoY2hhciAqKSZPY3RldHMsCisJCQkJCSZMZW4sIChTS19VMzIpU0tfUE5NSV9QT1JUX1BIWVMySU5TVChwQUMsIDApLAorCQkJCQlwQUMtPlJsbXQuUG9ydFswXS5OZXQtPk5ldE51bWJlcik7CisJCQkJCisJCQkJcFBydC0+TGFzdE9jdGV0cyA9IE9jdGV0czsKKyNlbmRpZiAvKiBYWFggKi8KKwkJCQkvKiBTbmFwIHN0YXRpc3RpYyBjb3VudGVycyAqLworCQkJCSh2b2lkKVNrWG1VcGRhdGVTdGF0cyhwQUMsIElvQywgMCk7CisKKwkJCQkodm9pZClTa1htTWFjU3RhdGlzdGljKHBBQywgSW9DLCAwLCBYTV9UWE9fT0tfSEksICZSZWdWYWwzMik7CisKKwkJCQlwUHJ0LT5MYXN0T2N0ZXRzID0gKFNLX1U2NClSZWdWYWwzMiA8PCAzMjsKKwkJCQkKKwkJCQkodm9pZClTa1htTWFjU3RhdGlzdGljKHBBQywgSW9DLCAwLCBYTV9UWE9fT0tfTE8sICZSZWdWYWwzMik7CisKKwkJCQlwUHJ0LT5MYXN0T2N0ZXRzICs9IFJlZ1ZhbDMyOworCQkJCQorCQkJCVBhcmEuUGFyYTMyWzBdID0gMDsKKwkJCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwUHJ0LT5IYWxmRHVwQ2hrVGltZXIsIFNLX0hBTEZEVVBfQ0hLX1RJTUUsCisJCQkJCVNLR0VfSFdBQywgU0tfSFdFVl9IQUxGRFVQX0NISywgUGFyYSk7CisJCQl9CisJCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisJfQorCisJaWYgKChJc3RhdHVzICYgSVNfUEFfVE9fVFgyKSAhPSAwKSB7CisJCQorCQlwUHJ0ID0gJnBBQy0+R0luaS5HUFsxXTsKKworCQkvKiBNYXkgYmUgYSBub3JtYWwgc2l0dWF0aW9uIGluIGEgc2VydmVyIHdpdGggYSBzbG93IG5ldHdvcmsgKi8KKwkJU0tfT1VUMTYoSW9DLCBCM19QQV9DVFJMLCBQQV9DTFJfVE9fVFgyKTsKKworI2lmZGVmIEdFTkVTSVMKKwkJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCS8qIHdvcmthcm91bmQ6IHNlZSBhYm92ZSAqLworCQkJaWYgKChwUHJ0LT5QTGlua01vZGVTdGF0dXMgPT0gU0tfTE1PREVfU1RBVF9IQUxGIHx8CisJCQkJIHBQcnQtPlBMaW5rTW9kZVN0YXR1cyA9PSBTS19MTU9ERV9TVEFUX0FVVE9IQUxGKSAmJgorCQkJCSFwUHJ0LT5IYWxmRHVwVGltZXJBY3RpdmUpIHsKKwkJCQlwUHJ0LT5IYWxmRHVwVGltZXJBY3RpdmUgPSBTS19UUlVFOworI2lmZGVmIFhYWAorCQkJCUxlbiA9IHNpemVvZihTS19VNjQpOworCQkJCVNrUG5taUdldFZhcihwQUMsIElvQywgT0lEX1NLR0VfU1RBVF9UWF9PQ1RFVFMsIChjaGFyICopJk9jdGV0cywKKwkJCQkJJkxlbiwgKFNLX1UzMilTS19QTk1JX1BPUlRfUEhZUzJJTlNUKHBBQywgMSksCisJCQkJCXBBQy0+UmxtdC5Qb3J0WzFdLk5ldC0+TmV0TnVtYmVyKTsKKwkJCQkKKwkJCQlwUHJ0LT5MYXN0T2N0ZXRzID0gT2N0ZXRzOworI2VuZGlmIC8qIFhYWCAqLworCQkJCS8qIFNuYXAgc3RhdGlzdGljIGNvdW50ZXJzICovCisJCQkJKHZvaWQpU2tYbVVwZGF0ZVN0YXRzKHBBQywgSW9DLCAxKTsKKworCQkJCSh2b2lkKVNrWG1NYWNTdGF0aXN0aWMocEFDLCBJb0MsIDEsIFhNX1RYT19PS19ISSwgJlJlZ1ZhbDMyKTsKKworCQkJCXBQcnQtPkxhc3RPY3RldHMgPSAoU0tfVTY0KVJlZ1ZhbDMyIDw8IDMyOworCQkJCQorCQkJCSh2b2lkKVNrWG1NYWNTdGF0aXN0aWMocEFDLCBJb0MsIDEsIFhNX1RYT19PS19MTywgJlJlZ1ZhbDMyKTsKKworCQkJCXBQcnQtPkxhc3RPY3RldHMgKz0gUmVnVmFsMzI7CisJCQkJCisJCQkJUGFyYS5QYXJhMzJbMF0gPSAxOworCQkJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBQcnQtPkhhbGZEdXBDaGtUaW1lciwgU0tfSEFMRkRVUF9DSEtfVElNRSwKKwkJCQkJU0tHRV9IV0FDLCBTS19IV0VWX0hBTEZEVVBfQ0hLLCBQYXJhKTsKKwkJCX0KKwkJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwl9CisKKwkvKiBDaGVjayBpbnRlcnJ1cHRzIG9mIHRoZSBwYXJ0aWN1bGFyIHF1ZXVlcyAqLworCWlmICgoSXN0YXR1cyAmIElTX1IxX0MpICE9IDApIHsKKwkJLyogQ2xlYXIgSVJRICovCisJCVNLX09VVDMyKElvQywgQjBfUjFfQ1NSLCBDU1JfSVJRX0NMX0MpOworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1cgfCBTS19FUlJDTF9JTklULCBTS0VSUl9TSVJRX0UwMDYsCisJCQlTS0VSUl9TSVJRX0UwMDZNU0cpOworCQlQYXJhLlBhcmE2NCA9IE1BQ18xOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1BPUlRfRkFJTCwgUGFyYSk7CisJCVBhcmEuUGFyYTMyWzBdID0gTUFDXzE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9MSU5LX0RPV04sIFBhcmEpOworCX0KKworCWlmICgoSXN0YXR1cyAmIElTX1IyX0MpICE9IDApIHsKKwkJLyogQ2xlYXIgSVJRICovCisJCVNLX09VVDMyKElvQywgQjBfUjJfQ1NSLCBDU1JfSVJRX0NMX0MpOworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1cgfCBTS19FUlJDTF9JTklULCBTS0VSUl9TSVJRX0UwMDcsCisJCQlTS0VSUl9TSVJRX0UwMDdNU0cpOworCQlQYXJhLlBhcmE2NCA9IE1BQ18yOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1BPUlRfRkFJTCwgUGFyYSk7CisJCVBhcmEuUGFyYTMyWzBdID0gTUFDXzI7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9MSU5LX0RPV04sIFBhcmEpOworCX0KKworCWlmICgoSXN0YXR1cyAmIElTX1hTMV9DKSAhPSAwKSB7CisJCS8qIENsZWFyIElSUSAqLworCQlTS19PVVQzMihJb0MsIEIwX1hTMV9DU1IsIENTUl9JUlFfQ0xfQyk7CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVyB8IFNLX0VSUkNMX0lOSVQsIFNLRVJSX1NJUlFfRTAwOCwKKwkJCVNLRVJSX1NJUlFfRTAwOE1TRyk7CisJCVBhcmEuUGFyYTY0ID0gTUFDXzE7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUE9SVF9GQUlMLCBQYXJhKTsKKwkJUGFyYS5QYXJhMzJbMF0gPSBNQUNfMTsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX0xJTktfRE9XTiwgUGFyYSk7CisJfQorCisJaWYgKChJc3RhdHVzICYgSVNfWEExX0MpICE9IDApIHsKKwkJLyogQ2xlYXIgSVJRICovCisJCVNLX09VVDMyKElvQywgQjBfWEExX0NTUiwgQ1NSX0lSUV9DTF9DKTsKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXIHwgU0tfRVJSQ0xfSU5JVCwgU0tFUlJfU0lSUV9FMDA5LAorCQkJU0tFUlJfU0lSUV9FMDA5TVNHKTsKKwkJUGFyYS5QYXJhNjQgPSBNQUNfMTsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9QT1JUX0ZBSUwsIFBhcmEpOworCQlQYXJhLlBhcmEzMlswXSA9IE1BQ18xOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1JMTVQsIFNLX1JMTVRfTElOS19ET1dOLCBQYXJhKTsKKwl9CisKKwlpZiAoKElzdGF0dXMgJiBJU19YUzJfQykgIT0gMCkgeworCQkvKiBDbGVhciBJUlEgKi8KKwkJU0tfT1VUMzIoSW9DLCBCMF9YUzJfQ1NSLCBDU1JfSVJRX0NMX0MpOworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1cgfCBTS19FUlJDTF9JTklULCBTS0VSUl9TSVJRX0UwMTAsCisJCQlTS0VSUl9TSVJRX0UwMTBNU0cpOworCQlQYXJhLlBhcmE2NCA9IE1BQ18yOworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1BPUlRfRkFJTCwgUGFyYSk7CisJCVBhcmEuUGFyYTMyWzBdID0gTUFDXzI7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9MSU5LX0RPV04sIFBhcmEpOworCX0KKworCWlmICgoSXN0YXR1cyAmIElTX1hBMl9DKSAhPSAwKSB7CisJCS8qIENsZWFyIElSUSAqLworCQlTS19PVVQzMihJb0MsIEIwX1hBMl9DU1IsIENTUl9JUlFfQ0xfQyk7CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVyB8IFNLX0VSUkNMX0lOSVQsIFNLRVJSX1NJUlFfRTAxMSwKKwkJCVNLRVJSX1NJUlFfRTAxMU1TRyk7CisJCVBhcmEuUGFyYTY0ID0gTUFDXzI7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUE9SVF9GQUlMLCBQYXJhKTsKKwkJUGFyYS5QYXJhMzJbMF0gPSBNQUNfMjsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX0xJTktfRE9XTiwgUGFyYSk7CisJfQorCisJLyogRXh0ZXJuYWwgcmVnIGludGVycnVwdCAqLworCWlmICgoSXN0YXR1cyAmIElTX0VYVF9SRUcpICE9IDApIHsKKwkJLyogVGVzdCBJUlFzIGZyb20gUEhZICovCisJCWZvciAoaSA9IDA7IGkgPCBwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQkJCisJCQlwUHJ0ID0gJnBBQy0+R0luaS5HUFtpXTsKKwkJCQorCQkJaWYgKHBQcnQtPlBTdGF0ZSA9PSBTS19QUlRfUkVTRVQpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCQorI2lmZGVmIEdFTkVTSVMKKwkJCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQkJCisJCQkJc3dpdGNoIChwUHJ0LT5QaHlUeXBlKSB7CisJCQkJCisJCQkJY2FzZSBTS19QSFlfWE1BQzoKKwkJCQkJYnJlYWs7CisJCQkJCisJCQkJY2FzZSBTS19QSFlfQkNPTToKKwkJCQkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIGksIFBIWV9CQ09NX0lOVF9TVEFULCAmUGh5SW50KTsKKwkKKwkJCQkJaWYgKChQaHlJbnQgJiB+UEhZX0JfREVGX01TSykgIT0gMCkgeworCQkJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCQkJCQkJKCJQb3J0ICVkIEJjb20gSW50OiAweCUwNFhcbiIsCisJCQkJCQkJaSwgUGh5SW50KSk7CisJCQkJCQlTa1BoeUlzckJjb20ocEFDLCBJb0MsIGksIFBoeUludCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisjaWZkZWYgT1RIRVJfUEhZCisJCQkJY2FzZSBTS19QSFlfTE9ORToKKwkJCQkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIGksIFBIWV9MT05FX0lOVF9TVEFULCAmUGh5SW50KTsKKwkJCQkJCisJCQkJCWlmICgoUGh5SW50ICYgUEhZX0xfREVGX01TSykgIT0gMCkgeworCQkJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCQkJCQkJKCJQb3J0ICVkIExvbmUgSW50OiAleFxuIiwKKwkJCQkJCQlpLCBQaHlJbnQpKTsKKwkJCQkJCVNrUGh5SXNyTG9uZShwQUMsIElvQywgaSwgUGh5SW50KTsKKwkJCQkJfQorCQkJCQlicmVhazsKKyNlbmRpZiAvKiBPVEhFUl9QSFkgKi8KKwkJCQl9CisJCQl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJCQlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJCQkvKiBSZWFkIFBIWSBJbnRlcnJ1cHQgU3RhdHVzICovCisJCQkJU2tHbVBoeVJlYWQocEFDLCBJb0MsIGksIFBIWV9NQVJWX0lOVF9TVEFULCAmUGh5SW50KTsKKworCQkJCWlmICgoUGh5SW50ICYgUEhZX01fREVGX01TSykgIT0gMCkgeworCQkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lSUSwKKwkJCQkJCSgiUG9ydCAlZCBNYXJ2IEludDogMHglMDRYXG4iLAorCQkJCQkJaSwgUGh5SW50KSk7CisJCQkJCVNrUGh5SXNyR21hYyhwQUMsIElvQywgaSwgUGh5SW50KTsKKwkJCQl9CisJCQl9CisjZW5kaWYgLyogWVVLT04gKi8KKwkJfQorCX0KKworCS8qIEkyQyBSZWFkeSBpbnRlcnJ1cHQgKi8KKwlpZiAoKElzdGF0dXMgJiBJU19JMkNfUkVBRFkpICE9IDApIHsKKyNpZmRlZiBTS19TTElNCisgICAgICAgIFNLX09VVDMyKElvQywgQjJfSTJDX0lSUSwgSTJDX0NMUl9JUlEpOworI2Vsc2UJCQorCQlTa0kyY0lzcihwQUMsIElvQyk7CisjZW5kaWYJCQorCX0KKworCS8qIFNXIGZvcmNlZCBpbnRlcnJ1cHQgKi8KKwlpZiAoKElzdGF0dXMgJiBJU19JUlFfU1cpICE9IDApIHsKKwkJLyogY2xlYXIgdGhlIHNvZnR3YXJlIElSUSAqLworCQlTS19PVVQ4KElvQywgQjBfQ1RTVCwgQ1NfQ0xfU1dfSVJRKTsKKwl9CisKKwlpZiAoKElzdGF0dXMgJiBJU19MTktfU1lOQ19NMSkgIT0gMCkgeworCQkvKgorCQkgKiBXZSBkbyBOT1QgbmVlZCB0aGUgTGluayBTeW5jIGludGVycnVwdCwgYmVjYXVzZSBpdCBzaG93cworCQkgKiB1cyBvbmx5IGEgbGluayBnb2luZyBkb3duLgorCQkgKi8KKwkJLyogY2xlYXIgaW50ZXJydXB0ICovCisJCVNLX09VVDgoSW9DLCBNUl9BRERSKE1BQ18xLCBMTktfU1lOQ19DVFJMKSwgTEVEX0NMUl9JUlEpOworCX0KKworCS8qIENoZWNrIE1BQyBhZnRlciBsaW5rIHN5bmMgY291bnRlciAqLworCWlmICgoSXN0YXR1cyAmIElTX01BQzEpICE9IDApIHsKKwkJLyogSVJRIGZyb20gTUFDIDEgKi8KKwkJU2tNYWNJcnEocEFDLCBJb0MsIE1BQ18xKTsKKwl9CisKKwlpZiAoKElzdGF0dXMgJiBJU19MTktfU1lOQ19NMikgIT0gMCkgeworCQkvKgorCQkgKiBXZSBkbyBOT1QgbmVlZCB0aGUgTGluayBTeW5jIGludGVycnVwdCwgYmVjYXVzZSBpdCBzaG93cworCQkgKiB1cyBvbmx5IGEgbGluayBnb2luZyBkb3duLgorCQkgKi8KKwkJLyogY2xlYXIgaW50ZXJydXB0ICovCisJCVNLX09VVDgoSW9DLCBNUl9BRERSKE1BQ18yLCBMTktfU1lOQ19DVFJMKSwgTEVEX0NMUl9JUlEpOworCX0KKworCS8qIENoZWNrIE1BQyBhZnRlciBsaW5rIHN5bmMgY291bnRlciAqLworCWlmICgoSXN0YXR1cyAmIElTX01BQzIpICE9IDApIHsKKwkJLyogSVJRIGZyb20gTUFDIDIgKi8KKwkJU2tNYWNJcnEocEFDLCBJb0MsIE1BQ18yKTsKKwl9CisKKwkvKiBUaW1lciBpbnRlcnJ1cHQgKHNlcnZlZCBsYXN0KSAqLworCWlmICgoSXN0YXR1cyAmIElTX1RJTUlOVCkgIT0gMCkgeworCQkvKiBjaGVjayBmb3IgSFcgRXJyb3JzICovCisJCWlmICgoKElzdGF0dXMgJiBJU19IV19FUlIpICYgfnBBQy0+R0luaS5HSVZhbElycU1hc2spICE9IDApIHsKKwkJCS8qIHJlYWQgdGhlIEhXIEVycm9yIEludGVycnVwdCBzb3VyY2UgKi8KKwkJCVNLX0lOMzIoSW9DLCBCMF9IV0VfSVNSQywgJlJlZ1ZhbDMyKTsKKworCQkJU2tHZUh3RXJyKHBBQywgSW9DLCBSZWdWYWwzMik7CisJCX0KKworCQlTa0h3dElzcihwQUMsIElvQyk7CisJfQorCit9CS8qIFNrR2VTaXJxSXNyICovCisKKworI2lmZGVmIEdFTkVTSVMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTa0dlUG9ydENoZWNrU2hvcnRzKCkgLSBJbXBsZW1lbnRpbmcgWE1BQyBXb3JrYXJvdW5kIEVycmF0YSAjIDIKKyAqCisgKiByZXR1cm46CisgKgkwCW8uay4gbm90aGluZyBuZWVkZWQKKyAqCTEJUmVzdGFydCBuZWVkZWQgb24gdGhpcyBwb3J0CisgKi8KK3N0YXRpYyBpbnQgU2tHZVBvcnRDaGVja1Nob3J0cygKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBDb250ZXh0ICovCitpbnQJCVBvcnQpCQkvKiBXaGljaCBwb3J0IHNob3VsZCBiZSBjaGVja2VkICovCit7CisJU0tfVTMyCQlTaG9ydHM7CQkJLyogU2hvcnQgRXZlbnQgQ291bnRlciAqLworCVNLX1UzMgkJQ2hlY2tTaG9ydHM7CS8qIENoZWNrIHZhbHVlIGZvciBTaG9ydCBFdmVudCBDb3VudGVyICovCisJU0tfVTY0CQlSeEN0czsJCQkvKiBSeCBDb3VudGVyIChwYWNrZXRzIG9uIG5ldHdvcmspICovCisJU0tfVTMyCQlSeFRtcDsJCQkvKiBSeCB0ZW1wLiBDb3VudGVyICovCisJU0tfVTMyCQlGY3NFcnJDdHM7CQkvKiBGQ1MgRXJyb3IgQ291bnRlciAqLworCVNLX0dFUE9SVAkqcFBydDsJCQkvKiBHSW5pIFBvcnQgc3RydWN0IHBvaW50ZXIgKi8KKwlpbnQJCQlSdHY7CQkJLyogUmV0dXJuIHZhbHVlICovCisJaW50CQkJaTsKKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJLyogRGVmYXVsdDogbm8gYWN0aW9uICovCisJUnR2ID0gU0tfSFdfUFNfTk9ORTsKKworCSh2b2lkKVNrWG1VcGRhdGVTdGF0cyhwQUMsIElvQywgUG9ydCk7CisKKwkvKiBFeHRyYSBwcmVjYXV0aW9uOiBjaGVjayBmb3Igc2hvcnQgRXZlbnQgY291bnRlciAqLworCSh2b2lkKVNrWG1NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBvcnQsIFhNX1JYRV9TSFRfRVJSLCAmU2hvcnRzKTsKKworCS8qCisJICogUmVhZCBSeCBjb3VudGVycyAocGFja2V0cyBzZWVuIG9uIHRoZSBuZXR3b3JrIGFuZCBub3QgbmVjZXNzYXJpbHkKKwkgKiByZWFsbHkgcmVjZWl2ZWQuCisJICovCisJUnhDdHMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihTa0dlUnhSZWdzKS9zaXplb2YoU2tHZVJ4UmVnc1swXSk7IGkrKykgeworCQkKKwkJKHZvaWQpU2tYbU1hY1N0YXRpc3RpYyhwQUMsIElvQywgUG9ydCwgU2tHZVJ4UmVnc1tpXSwgJlJ4VG1wKTsKKwkJCisJCVJ4Q3RzICs9IChTS19VNjQpUnhUbXA7CisJfQorCisJLyogT24gZGVmYXVsdDogY2hlY2sgc2hvcnRzIGFnYWluc3QgemVybyAqLworCUNoZWNrU2hvcnRzID0gMDsKKworCS8qIEV4dHJhIHByZWNhdXRpb24gb24gYWN0aXZlIGxpbmtzICovCisJaWYgKHBQcnQtPlBIV0xpbmtVcCkgeworCQkvKiBSZXNldCBMaW5rIFJlc3RhcnQgY291bnRlciAqLworCQlwUHJ0LT5QTGlua1Jlc0N0ID0gMDsKKwkJcFBydC0+UEF1dG9OZWdUT0N0ID0gMDsKKworCQkvKiBJZiBsaW5rIGlzIHVwIGNoZWNrIGZvciAyICovCisJCUNoZWNrU2hvcnRzID0gMjsKKworCQkodm9pZClTa1htTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQb3J0LCBYTV9SWEZfRkNTX0VSUiwgJkZjc0VyckN0cyk7CisJCQorCQlpZiAocFBydC0+UExpbmtNb2RlQ29uZiA9PSBTS19MTU9ERV9BVVRPU0VOU0UgJiYKKwkJICAgIHBQcnQtPlBMaXBhQXV0b05lZyA9PSBTS19MSVBBX1VOS05PV04gJiYKKwkJICAgIChwUHJ0LT5QTGlua01vZGUgPT0gU0tfTE1PREVfSEFMRiB8fAorCQkJIHBQcnQtPlBMaW5rTW9kZSA9PSBTS19MTU9ERV9GVUxMKSkgeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgYXV0b3NlbnNpbmcgYW5kIHdlIGFyZSBpbiB0aGUgZmFsbGJhY2sKKwkJCSAqIG1hbnVhbCBmdWxsL2hhbGYgZHVwbGV4IG1vZGUuCisJCQkgKi8KKwkJCWlmIChSeEN0cyA9PSBwUHJ0LT5QUHJldlJ4KSB7CisJCQkJLyogTm90aGluZyByZWNlaXZlZCwgcmVzdGFydCBsaW5rICovCisJCQkJcFBydC0+UFByZXZGY3MgPSBGY3NFcnJDdHM7CisJCQkJcFBydC0+UFByZXZTaG9ydHMgPSBTaG9ydHM7CisJCQkJCisJCQkJcmV0dXJuKFNLX0hXX1BTX1JFU1RBUlQpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcFBydC0+UExpcGFBdXRvTmVnID0gU0tfTElQQV9NQU5VQUw7CisJCQl9CisJCX0KKworCQlpZiAoKChSeEN0cyAtIHBQcnQtPlBQcmV2UngpID4gcFBydC0+UFJ4TGltKSB8fAorCQkgICAgKCEoRmNzRXJyQ3RzIC0gcFBydC0+UFByZXZGY3MpKSkgeworCQkJLyoKKwkJCSAqIE5vdGU6IFRoZSBjb21wYXJlIHdpdGggemVybyBhYm92ZSBoYXMgdG8gYmUgZG9uZSB0aGUgd2F5IHNob3duLAorCQkJICogb3RoZXJ3aXNlIHRoZSBMaW51eCBkcml2ZXIgd2lsbCBoYXZlIGEgcHJvYmxlbS4KKwkJCSAqLworCQkJLyoKKwkJCSAqIFdlIHJlY2VpdmVkIGEgYnVuY2ggb2YgZnJhbWVzIG9yIG5vIENSQyBlcnJvciBvY2N1cmVkIG9uIHRoZQorCQkJICogbmV0d29yayAtPiBvay4KKwkJCSAqLworCQkJcFBydC0+UFByZXZSeCA9IFJ4Q3RzOworCQkJcFBydC0+UFByZXZGY3MgPSBGY3NFcnJDdHM7CisJCQlwUHJ0LT5QUHJldlNob3J0cyA9IFNob3J0czsKKworCQkJcmV0dXJuKFNLX0hXX1BTX05PTkUpOworCQl9CisKKwkJcFBydC0+UFByZXZGY3MgPSBGY3NFcnJDdHM7CisJfQorCisKKwlpZiAoKFNob3J0cyAtIHBQcnQtPlBQcmV2U2hvcnRzKSA+IENoZWNrU2hvcnRzKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSVJRLAorCQkJKCJTaG9ydCBFdmVudCBDb3VudCBSZXN0YXJ0IFBvcnQgJWQgXG4iLCBQb3J0KSk7CisJCVJ0diA9IFNLX0hXX1BTX1JFU1RBUlQ7CisJfQorCisJcFBydC0+UFByZXZTaG9ydHMgPSBTaG9ydHM7CisJcFBydC0+UFByZXZSeCA9IFJ4Q3RzOworCisJcmV0dXJuKFJ0dik7Cit9CS8qIFNrR2VQb3J0Q2hlY2tTaG9ydHMgKi8KKyNlbmRpZiAvKiBHRU5FU0lTICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNrR2VQb3J0Q2hlY2tVcCgpIC0gQ2hlY2sgaWYgdGhlIGxpbmsgaXMgdXAKKyAqCisgKiByZXR1cm46CisgKgkwCW8uay4gbm90aGluZyBuZWVkZWQKKyAqCTEJUmVzdGFydCBuZWVkZWQgb24gdGhpcyBwb3J0CisgKgkyCUxpbmsgY2FtZSB1cAorICovCitzdGF0aWMgaW50IFNrR2VQb3J0Q2hlY2tVcCgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBDb250ZXh0ICovCitpbnQJCVBvcnQpCQkvKiBXaGljaCBwb3J0IHNob3VsZCBiZSBjaGVja2VkICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OwkJLyogR0luaSBQb3J0IHN0cnVjdCBwb2ludGVyICovCisJU0tfQk9PTAkJQXV0b05lZzsJLyogSXMgQXV0by1uZWdvdGlhdGlvbiB1c2VkID8gKi8KKwlpbnQJCQlSdHY7CQkvKiBSZXR1cm4gdmFsdWUgKi8KKworCVJ0diA9IFNLX0hXX1BTX05PTkU7CisJCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlpZiAocFBydC0+UExpbmtNb2RlID09IFNLX0xNT0RFX0hBTEYgfHwgcFBydC0+UExpbmtNb2RlID09IFNLX0xNT0RFX0ZVTEwpIHsKKwkJQXV0b05lZyA9IFNLX0ZBTFNFOworCX0KKwllbHNlIHsKKwkJQXV0b05lZyA9IFNLX1RSVUU7CisJfQorCisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisKKwkJc3dpdGNoIChwUHJ0LT5QaHlUeXBlKSB7CisJCQorCQljYXNlIFNLX1BIWV9YTUFDOgorCQkJUnR2ID0gU2tHZVBvcnRDaGVja1VwWG1hYyhwQUMsIElvQywgUG9ydCwgQXV0b05lZyk7CisJCQlicmVhazsKKwkJY2FzZSBTS19QSFlfQkNPTToKKwkJCVJ0diA9IFNrR2VQb3J0Q2hlY2tVcEJjb20ocEFDLCBJb0MsIFBvcnQsIEF1dG9OZWcpOworCQkJYnJlYWs7CisjaWZkZWYgT1RIRVJfUEhZCisJCWNhc2UgU0tfUEhZX0xPTkU6CisJCQlSdHYgPSBTa0dlUG9ydENoZWNrVXBMb25lKHBBQywgSW9DLCBQb3J0LCBBdXRvTmVnKTsKKwkJCWJyZWFrOworCQljYXNlIFNLX1BIWV9OQVQ6CisJCQlSdHYgPSBTa0dlUG9ydENoZWNrVXBOYXQocEFDLCBJb0MsIFBvcnQsIEF1dG9OZWcpOworCQkJYnJlYWs7CisjZW5kaWYgLyogT1RIRVJfUEhZICovCisJCX0KKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJaWYgKHBBQy0+R0luaS5HSVl1a29uKSB7CisJCQorCQlSdHYgPSBTa0dlUG9ydENoZWNrVXBHbWFjKHBBQywgSW9DLCBQb3J0LCBBdXRvTmVnKTsKKwl9CisjZW5kaWYgLyogWVVLT04gKi8KKworCXJldHVybihSdHYpOwkKK30JLyogU2tHZVBvcnRDaGVja1VwICovCisKKworI2lmZGVmIEdFTkVTSVMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTa0dlUG9ydENoZWNrVXBYbWFjKCkgLSBJbXBsZW1lbnRpbmcgb2YgdGhlIFdvcmthcm91bmQgRXJyYXRhICMgMgorICoKKyAqIHJldHVybjoKKyAqCTAJby5rLiBub3RoaW5nIG5lZWRlZAorICoJMQlSZXN0YXJ0IG5lZWRlZCBvbiB0aGlzIHBvcnQKKyAqCTIJTGluayBjYW1lIHVwCisgKi8KK3N0YXRpYyBpbnQgU2tHZVBvcnRDaGVja1VwWG1hYygKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBDb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBXaGljaCBwb3J0IHNob3VsZCBiZSBjaGVja2VkICovCitTS19CT09MCUF1dG9OZWcpCS8qIElzIEF1dG8tbmVnb3RpYXRpb24gdXNlZCA/ICovCit7CisJU0tfVTMyCQlTaG9ydHM7CQkvKiBTaG9ydCBFdmVudCBDb3VudGVyICovCisJU0tfR0VQT1JUCSpwUHJ0OwkJLyogR0luaSBQb3J0IHN0cnVjdCBwb2ludGVyICovCisJaW50CQkJRG9uZTsKKwlTS19VMzIJCUdwUmVnOwkJLyogR2VuZXJhbCBQdXJwb3NlIHJlZ2lzdGVyIHZhbHVlICovCisJU0tfVTE2CQlJc3JjOwkJLyogSW50ZXJydXB0IHNvdXJjZSByZWdpc3RlciAqLworCVNLX1UxNgkJSXNyY1N1bTsJLyogSW50ZXJydXB0IHNvdXJjZSByZWdpc3RlciBzdW0gKi8KKwlTS19VMTYJCUxwQWI7CQkvKiBMaW5rIFBhcnRuZXIgQWJpbGl0eSAqLworCVNLX1UxNgkJUmVzQWI7CQkvKiBSZXNvbHZlZCBBYmlsaXR5ICovCisJU0tfVTE2CQlFeHRTdGF0OwkvKiBFeHRlbmRlZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKwlTS19VOAkJTmV4dE1vZGU7CS8qIE5leHQgQXV0b1NlbnNpbmcgTW9kZSAqLworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlpZiAocFBydC0+UEhXTGlua1VwKSB7CisJCWlmIChwUHJ0LT5QaHlUeXBlICE9IFNLX1BIWV9YTUFDKSB7CisJCQlyZXR1cm4oU0tfSFdfUFNfTk9ORSk7CisJCX0KKwkJZWxzZSB7CisJCQlyZXR1cm4oU2tHZVBvcnRDaGVja1Nob3J0cyhwQUMsIElvQywgUG9ydCkpOworCQl9CisJfQorCisJSXNyY1N1bSA9IHBQcnQtPlBJc2F2ZTsKKwlwUHJ0LT5QSXNhdmUgPSAwOworCisJLyogTm93IHdhaXQgZm9yIGVhY2ggcG9ydCdzIGxpbmsgKi8KKwlpZiAocFBydC0+UExpbmtCcm9rZW4pIHsKKwkJLyogTGluayB3YXMgYnJva2VuICovCisJCVhNX0lOMzIoSW9DLCBQb3J0LCBYTV9HUF9QT1JULCAmR3BSZWcpOworCisJCWlmICgoR3BSZWcgJiBYTV9HUF9JTlBfQVNTKSA9PSAwKSB7CisJCQkvKiBUaGUgTGluayBpcyBpbiBzeW5jICovCisJCQlYTV9JTjE2KElvQywgUG9ydCwgWE1fSVNSQywgJklzcmMpOworCQkJSXNyY1N1bSB8PSBJc3JjOworCQkJU2tYbUF1dG9OZWdMaXBhWG1hYyhwQUMsIElvQywgUG9ydCwgSXNyY1N1bSk7CisJCQkKKwkJCWlmICgoSXNyYyAmIFhNX0lTX0lOUF9BU1MpID09IDApIHsKKwkJCQkvKiBJdCBoYXMgYmVlbiBpbiBzeW5jIHNpbmNlIGxhc3QgdGltZSAqLworCQkJCS8qIFJlc3RhcnQgdGhlIFBPUlQgKi8KKwkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lSUSwKKwkJCQkJKCJMaW5rIGluIHN5bmMgUmVzdGFydCBQb3J0ICVkXG4iLCBQb3J0KSk7CisKKwkJCQkodm9pZClTa1htVXBkYXRlU3RhdHMocEFDLCBJb0MsIFBvcnQpOworCisJCQkJLyogV2Ugbm93IG5lZWQgdG8gcmVpbml0aWFsaXplIHRoZSBQcmV2U2hvcnRzIGNvdW50ZXIgKi8KKwkJCQkodm9pZClTa1htTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQb3J0LCBYTV9SWEVfU0hUX0VSUiwgJlNob3J0cyk7CisJCQkJcFBydC0+UFByZXZTaG9ydHMgPSBTaG9ydHM7CisKKwkJCQlwUHJ0LT5QTGlua0Jyb2tlbiA9IFNLX0ZBTFNFOworCisJCQkJLyoKKwkJCQkgKiBMaW5rIFJlc3RhcnQgV29ya2Fyb3VuZDoKKwkJCQkgKiAgaXQgbWF5IGJlIHBvc3NpYmxlIHRoYXQgdGhlIG90aGVyIExpbmsgc2lkZQorCQkJCSAqICByZXN0YXJ0cyBpdHMgbGluayBhcyB3ZWxsIGFuIHdlIGRldGVjdAorCQkJCSAqICBhbm90aGVyIExpbmtCcm9rZW4uIFRvIHByZXZlbnQgdGhpcworCQkJCSAqICBoYXBwZW5pbmcgd2UgY2hlY2sgZm9yIGEgbWF4aW11bSBudW1iZXIKKwkJCQkgKiAgb2YgY29uc2VjdXRpdmUgcmVzdGFydC4gSWYgdGhvc2UgaGFwcGVucywKKwkJCQkgKiAgd2UgZG8gTk9UIHJlc3RhcnQgdGhlIGFjdGl2ZSBsaW5rIGFuZAorCQkJCSAqICBjaGVjayB3aGV0aGVyIHRoZSBsaW5rIGlzIG5vdyBvLmsuCisJCQkJICovCisJCQkJcFBydC0+UExpbmtSZXNDdCsrOworCQkJCQorCQkJCXBQcnQtPlBBdXRvTmVnVGltZU91dCA9IDA7CisKKwkJCQlpZiAocFBydC0+UExpbmtSZXNDdCA8IFNLX01BWF9MUkVTVEFSVCkgeworCQkJCQlyZXR1cm4oU0tfSFdfUFNfUkVTVEFSVCk7CisJCQkJfQorCisJCQkJcFBydC0+UExpbmtSZXNDdCA9IDA7CisJCQkJCisJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJCQkoIkRvIE5PVCByZXN0YXJ0IG9uIFBvcnQgJWQgJXggJXhcbiIsIFBvcnQsIElzcmMsIElzcmNTdW0pKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXBQcnQtPlBJc2F2ZSA9IChTS19VMTYpKElzcmNTdW0gJiBYTV9JU19BTkQpOworCQkJCQorCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkJKCJTYXZlIFN5bmMvbm9zeW5jIFBvcnQgJWQgJXggJXhcbiIsIFBvcnQsIElzcmMsIElzcmNTdW0pKTsKKworCQkJCS8qIERvIG5vdGhpbmcgbW9yZSBpZiBsaW5rIGlzIGJyb2tlbiAqLworCQkJCXJldHVybihTS19IV19QU19OT05FKTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCS8qIERvIG5vdGhpbmcgbW9yZSBpZiBsaW5rIGlzIGJyb2tlbiAqLworCQkJcmV0dXJuKFNLX0hXX1BTX05PTkUpOworCQl9CisKKwl9CisJZWxzZSB7CisJCS8qIExpbmsgd2FzIG5vdCBicm9rZW4sIGNoZWNrIGlmIGl0IGlzICovCisJCVhNX0lOMTYoSW9DLCBQb3J0LCBYTV9JU1JDLCAmSXNyYyk7CisJCUlzcmNTdW0gfD0gSXNyYzsKKwkJaWYgKChJc3JjICYgWE1fSVNfSU5QX0FTUykgIT0gMCkgeworCQkJWE1fSU4xNihJb0MsIFBvcnQsIFhNX0lTUkMsICZJc3JjKTsKKwkJCUlzcmNTdW0gfD0gSXNyYzsKKwkJCWlmICgoSXNyYyAmIFhNX0lTX0lOUF9BU1MpICE9IDApIHsKKwkJCQlYTV9JTjE2KElvQywgUG9ydCwgWE1fSVNSQywgJklzcmMpOworCQkJCUlzcmNTdW0gfD0gSXNyYzsKKwkJCQlpZiAoKElzcmMgJiBYTV9JU19JTlBfQVNTKSAhPSAwKSB7CisJCQkJCXBQcnQtPlBMaW5rQnJva2VuID0gU0tfVFJVRTsKKwkJCQkJLyogUmUtSW5pdCBMaW5rIHBhcnRuZXIgQXV0b25lZyBmbGFnICovCisJCQkJCXBQcnQtPlBMaXBhQXV0b05lZyA9IFNLX0xJUEFfVU5LTk9XTjsKKwkJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCQkJCQkoIkxpbmsgYnJva2VuIFBvcnQgJWRcbiIsIFBvcnQpKTsKKworCQkJCQkvKiBDYWJsZSByZW1vdmVkLT4gcmVpbml0IHNlbnNlIG1vZGUgKi8KKwkJCQkJU2tIV0luaXREZWZTZW5zZShwQUMsIElvQywgUG9ydCk7CisKKwkJCQkJcmV0dXJuKFNLX0hXX1BTX1JFU1RBUlQpOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCVNrWG1BdXRvTmVnTGlwYVhtYWMocEFDLCBJb0MsIFBvcnQsIElzcmMpOworCQkJCisJCQlpZiAoU2tHZVBvcnRDaGVja1Nob3J0cyhwQUMsIElvQywgUG9ydCkgPT0gU0tfSFdfUFNfUkVTVEFSVCkgeworCQkJCXJldHVybihTS19IV19QU19SRVNUQVJUKTsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogaGVyZSB3ZSB1c3VhbGx5IGNhbiBjaGVjayB3aGV0aGVyIHRoZSBsaW5rIGlzIGluIHN5bmMgYW5kCisJICogYXV0by1uZWdvdGlhdGlvbiBpcyBkb25lLgorCSAqLworCVhNX0lOMzIoSW9DLCBQb3J0LCBYTV9HUF9QT1JULCAmR3BSZWcpOworCVhNX0lOMTYoSW9DLCBQb3J0LCBYTV9JU1JDLCAmSXNyYyk7CisJSXNyY1N1bSB8PSBJc3JjOworCisJU2tYbUF1dG9OZWdMaXBhWG1hYyhwQUMsIElvQywgUG9ydCwgSXNyY1N1bSk7CisJCisJaWYgKChHcFJlZyAmIFhNX0dQX0lOUF9BU1MpICE9IDAgfHwgKElzcmNTdW0gJiBYTV9JU19JTlBfQVNTKSAhPSAwKSB7CisJCWlmICgoR3BSZWcgJiBYTV9HUF9JTlBfQVNTKSA9PSAwKSB7CisJCQkvKiBTYXZlIEF1dG8tbmVnb3RpYXRpb24gRG9uZSBpbnRlcnJ1cHQgb25seSBpZiBsaW5rIGlzIGluIHN5bmMgKi8KKwkJCXBQcnQtPlBJc2F2ZSA9IChTS19VMTYpKElzcmNTdW0gJiBYTV9JU19BTkQpOworCQl9CisjaWZkZWYgREVCVUcKKwkJaWYgKChwUHJ0LT5QSXNhdmUgJiBYTV9JU19BTkQpICE9IDApIHsKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIkF1dG9OZWcgZG9uZSByZXNjaGVkdWxlZCBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCQlyZXR1cm4oU0tfSFdfUFNfTk9ORSk7CisJfQorCisJaWYgKEF1dG9OZWcpIHsKKwkJaWYgKChJc3JjU3VtICYgWE1fSVNfQU5EKSAhPSAwKSB7CisJCQlTa0hXTGlua1VwKHBBQywgSW9DLCBQb3J0KTsKKwkJCURvbmUgPSBTa01hY0F1dG9OZWdEb25lKHBBQywgSW9DLCBQb3J0KTsKKwkJCWlmIChEb25lICE9IFNLX0FORF9PSykgeworCQkJCS8qIEdldCBQSFkgcGFyYW1ldGVycywgZm9yIGRlYnVnZ2luZyBvbmx5ICovCisJCQkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9YTUFDX0FVTkVfTFAsICZMcEFiKTsKKwkJCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX1hNQUNfUkVTX0FCSSwgJlJlc0FiKTsKKwkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJCSgiQXV0b05lZyBGQUlMIFBvcnQgJWQgKExwQWIgJXgsIFJlc0FiICV4KVxuIiwKKwkJCQkJIFBvcnQsIExwQWIsIFJlc0FiKSk7CisJCQkJCQorCQkJCS8qIFRyeSBuZXh0IHBvc3NpYmxlIG1vZGUgKi8KKwkJCQlOZXh0TW9kZSA9IFNrSFdTZW5zZUdldE5leHQocEFDLCBJb0MsIFBvcnQpOworCQkJCVNrSFdMaW5rRG93bihwQUMsIElvQywgUG9ydCk7CisJCQkJaWYgKERvbmUgPT0gU0tfQU5EX0RVUF9DQVApIHsKKwkJCQkJLyogR29UbyBuZXh0IG1vZGUgKi8KKwkJCQkJU2tIV1NlbnNlU2V0TmV4dChwQUMsIElvQywgUG9ydCwgTmV4dE1vZGUpOworCQkJCX0KKworCQkJCXJldHVybihTS19IV19QU19SRVNUQVJUKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBEdW1teSBSZWFkIGV4dGVuZGVkIHN0YXR1cyB0byBwcmV2ZW50IGV4dHJhIGxpbmsgZG93bi91cHMKKwkJCSAqIChjbGVhciBQYWdlIFJlY2VpdmVkIGJpdCBpZiBzZXQpCisJCQkgKi8KKwkJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfWE1BQ19BVU5FX0VYUCwgJkV4dFN0YXQpOworCQkJCisJCQlyZXR1cm4oU0tfSFdfUFNfTElOSyk7CisJCX0KKwkJCisJCS8qIEF1dG9OZWcgbm90IGRvbmUsIGJ1dCBIVyBsaW5rIGlzIHVwLiBDaGVjayBmb3IgdGltZW91dHMgKi8KKwkJcFBydC0+UEF1dG9OZWdUaW1lT3V0Kys7CisJCWlmIChwUHJ0LT5QQXV0b05lZ1RpbWVPdXQgPj0gU0tfQU5EX01BWF9UTykgeworCQkJLyogSW5jcmVhc2UgdGhlIFRpbWVvdXQgY291bnRlciAqLworCQkJcFBydC0+UEF1dG9OZWdUT0N0Kys7CisKKwkJCS8qIFRpbWVvdXQgb2NjdXJlZCAqLworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCQkJKCJBdXRvTmVnIHRpbWVvdXQgUG9ydCAlZFxuIiwgUG9ydCkpOworCQkJaWYgKHBQcnQtPlBMaW5rTW9kZUNvbmYgPT0gU0tfTE1PREVfQVVUT1NFTlNFICYmCisJCQkJcFBydC0+UExpcGFBdXRvTmVnICE9IFNLX0xJUEFfQVVUTykgeworCQkJCS8qIFNldCBMaW5rIG1hbnVhbGx5IHVwICovCisJCQkJU2tIV1NlbnNlU2V0TmV4dChwQUMsIElvQywgUG9ydCwgU0tfTE1PREVfRlVMTCk7CisJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCQkJCSgiU2V0IG1hbnVhbCBmdWxsIGR1cGxleCBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCQl9CisKKwkJCWlmIChwUHJ0LT5QTGlua01vZGVDb25mID09IFNLX0xNT0RFX0FVVE9TRU5TRSAmJgorCQkJCXBQcnQtPlBMaXBhQXV0b05lZyA9PSBTS19MSVBBX0FVVE8gJiYKKwkJCQlwUHJ0LT5QQXV0b05lZ1RPQ3QgPj0gU0tfTUFYX0FORUdfVE8pIHsKKwkJCQkvKgorCQkJCSAqIFRoaXMgaXMgcmF0aGVyIGNvbXBsaWNhdGVkLgorCQkJCSAqIHdlIG5lZWQgdG8gY2hlY2sgaGVyZSB3aGV0aGVyIHRoZSBMSVBBX0FVVE8KKwkJCQkgKiB3ZSBzYXcgYmVmb3JlIGlzIGZhbHNlIGFsZXJ0LiBXZSBzYXcgYXQgb25lCisJCQkJICogc3dpdGNoICggU1I4ODAwKSB0aGF0IG9uIGJvb3QgdGltZSBpdCBzZW5kcworCQkJCSAqIGp1c3Qgb25lIGF1dG8tbmVnIHBhY2tldCBhbmQgZG9lcyBubyBmdXJ0aGVyCisJCQkJICogYXV0by1uZWdvdGlhdGlvbi4KKwkJCQkgKiBTb2x1dGlvbjogd2UgcmVzdGFydCB0aGUgYXV0b3NlbnNpbmcgYWZ0ZXIKKwkJCQkgKiBhIGZldyB0aW1lb3V0cy4KKwkJCQkgKi8KKwkJCQlwUHJ0LT5QQXV0b05lZ1RPQ3QgPSAwOworCQkJCXBQcnQtPlBMaXBhQXV0b05lZyA9IFNLX0xJUEFfVU5LTk9XTjsKKwkJCQlTa0hXSW5pdERlZlNlbnNlKHBBQywgSW9DLCBQb3J0KTsKKwkJCX0KKworCQkJLyogRG8gdGhlIHJlc3RhcnQgKi8KKwkJCXJldHVybihTS19IV19QU19SRVNUQVJUKTsKKwkJfQorCX0KKwllbHNlIHsKKwkJLyogTGluayBpcyB1cCBhbmQgd2UgZG9uJ3QgbmVlZCBtb3JlICovCisjaWZkZWYgREVCVUcKKwkJaWYgKHBQcnQtPlBMaXBhQXV0b05lZyA9PSBTS19MSVBBX0FVVE8pIHsKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIkVSUk9SOiBMaXBhIGF1dG8gZGV0ZWN0ZWQgb24gcG9ydCAlZFxuIiwgUG9ydCkpOworCQl9CisjZW5kaWYgLyogREVCVUcgKi8KKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCQkoIkxpbmsgc3luYyhHUCksIFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJU2tIV0xpbmtVcChwQUMsIElvQywgUG9ydCk7CisJCQorCQkvKgorCQkgKiBMaW5rIHN5bmMgKEdQKSBhbmQgc28gYXNzdW1lIGEgZ29vZCBjb25uZWN0aW9uLiBCdXQgaWYgbm90IHJlY2VpdmVkCisJCSAqIGEgYnVuY2ggb2YgZnJhbWVzIHJlY2VpdmVkIGluIGEgdGltZSBzbG90IChtYXliZSBicm9rZW4gdHggY2FibGUpCisJCSAqIHRoZSBwb3J0IGlzIHJlc3RhcnQuCisJCSAqLworCQlyZXR1cm4oU0tfSFdfUFNfTElOSyk7CisJfQorCisJcmV0dXJuKFNLX0hXX1BTX05PTkUpOworfQkvKiBTa0dlUG9ydENoZWNrVXBYbWFjICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNrR2VQb3J0Q2hlY2tVcEJjb20oKSAtIENoZWNrIGlmIHRoZSBsaW5rIGlzIHVwIG9uIEJjb20gUEhZCisgKgorICogcmV0dXJuOgorICoJMAlvLmsuIG5vdGhpbmcgbmVlZGVkCisgKgkxCVJlc3RhcnQgbmVlZGVkIG9uIHRoaXMgcG9ydAorICoJMglMaW5rIGNhbWUgdXAKKyAqLworc3RhdGljIGludCBTa0dlUG9ydENoZWNrVXBCY29tKAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIENvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFdoaWNoIHBvcnQgc2hvdWxkIGJlIGNoZWNrZWQgKi8KK1NLX0JPT0wJQXV0b05lZykJLyogSXMgQXV0by1uZWdvdGlhdGlvbiB1c2VkID8gKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CQkvKiBHSW5pIFBvcnQgc3RydWN0IHBvaW50ZXIgKi8KKwlpbnQJCQlEb25lOworCVNLX1UxNgkJSXNyYzsJCS8qIEludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIgKi8KKwlTS19VMTYJCVBoeVN0YXQ7CS8qIFBoeSBTdGF0dXMgUmVnaXN0ZXIgKi8KKwlTS19VMTYJCVJlc0FiOwkJLyogTWFzdGVyL1NsYXZlIHJlc29sdXRpb24gKi8KKwlTS19VMTYJCUN0cmw7CQkvKiBCcm9hZGNvbSBjb250cm9sIGZsYWdzICovCisjaWZkZWYgREVCVUcKKwlTS19VMTYJCUxwQWI7CisJU0tfVTE2CQlFeHRTdGF0OworI2VuZGlmIC8qIERFQlVHICovCisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCS8qIENoZWNrIGZvciBObyBIQ0QgTGluayBldmVudHMgKCMxMDUyMykgKi8KKwlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fSU5UX1NUQVQsICZJc3JjKTsKKworI2lmZGVmIHhERUJVRworCWlmICgoSXNyYyAmIH4oUEhZX0JfSVNfSENUIHwgUEhZX0JfSVNfTENUKSA9PQorCQkoUEhZX0JfSVNfU0NSX1NfRVIgfCBQSFlfQl9JU19SUlNfQ0hBTkdFIHwgUEhZX0JfSVNfTFJTX0NIQU5HRSkpIHsKKworCQlTS19VMzIJU3RhdDEsIFN0YXQyLCBTdGF0MzsKKworCQlTdGF0MSA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9JTlRfTUFTSywgJlN0YXQxKTsKKwkJQ01TTVByaW50U3RyaW5nKAorCQkJcEFDLT5wQ29uZmlnVGFibGUsCisJCQlNU0dfVFlQRV9SVU5USU1FX0lORk8sCisJCQkiQ2hlY2tVcDEgLSBTdGF0OiAleCwgTWFzazogJXgiLAorCQkJKHZvaWQgKilJc3JjLAorCQkJKHZvaWQgKilTdGF0MSk7CisKKwkJU3RhdDEgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQ1RSTCwgJlN0YXQxKTsKKwkJU3RhdDIgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fU1RBVCwgJlN0YXQyKTsKKwkJU3RhdDEgPSBTdGF0MSA8PCAxNiB8IFN0YXQyOworCQlTdGF0MiA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9BVU5FX0FEViwgJlN0YXQyKTsKKwkJU3RhdDMgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQVVORV9MUCwgJlN0YXQzKTsKKwkJU3RhdDIgPSBTdGF0MiA8PCAxNiB8IFN0YXQzOworCQlDTVNNUHJpbnRTdHJpbmcoCisJCQlwQUMtPnBDb25maWdUYWJsZSwKKwkJCU1TR19UWVBFX1JVTlRJTUVfSU5GTywKKwkJCSJDdHJsL1N0YXQ6ICV4LCBBTiBBZHYvTFA6ICV4IiwKKwkJCSh2b2lkICopU3RhdDEsCisJCQkodm9pZCAqKVN0YXQyKTsKKworCQlTdGF0MSA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9BVU5FX0VYUCwgJlN0YXQxKTsKKwkJU3RhdDIgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fRVhUX1NUQVQsICZTdGF0Mik7CisJCVN0YXQxID0gU3RhdDEgPDwgMTYgfCBTdGF0MjsKKwkJU3RhdDIgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fMTAwMFRfQ1RSTCwgJlN0YXQyKTsKKwkJU3RhdDMgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fMTAwMFRfU1RBVCwgJlN0YXQzKTsKKwkJU3RhdDIgPSBTdGF0MiA8PCAxNiB8IFN0YXQzOworCQlDTVNNUHJpbnRTdHJpbmcoCisJCQlwQUMtPnBDb25maWdUYWJsZSwKKwkJCU1TR19UWVBFX1JVTlRJTUVfSU5GTywKKwkJCSJBTiBFeHAvSUVFRSBFeHQ6ICV4LCAxMDAwVCBDdHJsL1N0YXQ6ICV4IiwKKwkJCSh2b2lkICopU3RhdDEsCisJCQkodm9pZCAqKVN0YXQyKTsKKworCQlTdGF0MSA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9QX0VYVF9DVFJMLCAmU3RhdDEpOworCQlTdGF0MiA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9QX0VYVF9TVEFULCAmU3RhdDIpOworCQlTdGF0MSA9IFN0YXQxIDw8IDE2IHwgU3RhdDI7CisJCVN0YXQyID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0FVWF9DVFJMLCAmU3RhdDIpOworCQlTdGF0MyA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9BVVhfU1RBVCwgJlN0YXQzKTsKKwkJU3RhdDIgPSBTdGF0MiA8PCAxNiB8IFN0YXQzOworCQlDTVNNUHJpbnRTdHJpbmcoCisJCQlwQUMtPnBDb25maWdUYWJsZSwKKwkJCU1TR19UWVBFX1JVTlRJTUVfSU5GTywKKwkJCSJQSFkgRXh0IEN0cmwvU3RhdDogJXgsIEF1eCBDdHJsL1N0YXQ6ICV4IiwKKwkJCSh2b2lkICopU3RhdDEsCisJCQkodm9pZCAqKVN0YXQyKTsKKwl9CisjZW5kaWYgLyogREVCVUcgKi8KKworCWlmICgoSXNyYyAmIChQSFlfQl9JU19OT19IRENMIC8qIHwgUEhZX0JfSVNfTk9fSERDICovKSkgIT0gMCkgeworCQkvKgorCQkgKiBXb3JrYXJvdW5kIEJDb20gRXJyYXRhOgorCQkgKgllbmFibGUgYW5kIGRpc2FibGUgbG9vcGJhY2sgbW9kZSBpZiAiTk8gSENEIiBvY2N1cnMuCisJCSAqLworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQ1RSTCwgJkN0cmwpOworCQlTa1htUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0NUUkwsCisJCQkoU0tfVTE2KShDdHJsIHwgUEhZX0NUX0xPT1ApKTsKKwkJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9DVFJMLAorCQkJKFNLX1UxNikoQ3RybCAmIH5QSFlfQ1RfTE9PUCkpOworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIk5vIEhDRCBMaW5rIGV2ZW50LCBQb3J0ICVkXG4iLCBQb3J0KSk7CisjaWZkZWYgeERFQlVHCisJCUNNU01QcmludFN0cmluZygKKwkJCXBBQy0+cENvbmZpZ1RhYmxlLAorCQkJTVNHX1RZUEVfUlVOVElNRV9JTkZPLAorCQkJIk5vIEhDRCBsaW5rIGV2ZW50LCBwb3J0ICVkLiIsCisJCQkodm9pZCAqKVBvcnQsCisJCQkodm9pZCAqKU5VTEwpOworI2VuZGlmIC8qIERFQlVHICovCisJfQorCisJLyogTm90IG9ic29sZXRlOiBsaW5rIHN0YXR1cyBiaXQgaXMgbGF0Y2hlZCB0byAwIGFuZCBhdXRvY2xlYXJpbmchICovCisJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX1NUQVQsICZQaHlTdGF0KTsKKworCWlmIChwUHJ0LT5QSFdMaW5rVXApIHsKKwkJcmV0dXJuKFNLX0hXX1BTX05PTkUpOworCX0KKworI2lmZGVmIHhERUJVRworCXsKKwkJU0tfVTMyCVN0YXQxLCBTdGF0MiwgU3RhdDM7CisKKwkJU3RhdDEgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fSU5UX01BU0ssICZTdGF0MSk7CisJCUNNU01QcmludFN0cmluZygKKwkJCXBBQy0+cENvbmZpZ1RhYmxlLAorCQkJTVNHX1RZUEVfUlVOVElNRV9JTkZPLAorCQkJIkNoZWNrVXAxYSAtIFN0YXQ6ICV4LCBNYXNrOiAleCIsCisJCQkodm9pZCAqKUlzcmMsCisJCQkodm9pZCAqKVN0YXQxKTsKKworCQlTdGF0MSA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9DVFJMLCAmU3RhdDEpOworCQlTdGF0MiA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9TVEFULCAmUGh5U3RhdCk7CisJCVN0YXQxID0gU3RhdDEgPDwgMTYgfCBQaHlTdGF0OworCQlTdGF0MiA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9BVU5FX0FEViwgJlN0YXQyKTsKKwkJU3RhdDMgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQVVORV9MUCwgJlN0YXQzKTsKKwkJU3RhdDIgPSBTdGF0MiA8PCAxNiB8IFN0YXQzOworCQlDTVNNUHJpbnRTdHJpbmcoCisJCQlwQUMtPnBDb25maWdUYWJsZSwKKwkJCU1TR19UWVBFX1JVTlRJTUVfSU5GTywKKwkJCSJDdHJsL1N0YXQ6ICV4LCBBTiBBZHYvTFA6ICV4IiwKKwkJCSh2b2lkICopU3RhdDEsCisJCQkodm9pZCAqKVN0YXQyKTsKKworCQlTdGF0MSA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9BVU5FX0VYUCwgJlN0YXQxKTsKKwkJU3RhdDIgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fRVhUX1NUQVQsICZTdGF0Mik7CisJCVN0YXQxID0gU3RhdDEgPDwgMTYgfCBTdGF0MjsKKwkJU3RhdDIgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fMTAwMFRfQ1RSTCwgJlN0YXQyKTsKKwkJU3RhdDMgPSAwOworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fMTAwMFRfU1RBVCwgJlJlc0FiKTsKKwkJU3RhdDIgPSBTdGF0MiA8PCAxNiB8IFJlc0FiOworCQlDTVNNUHJpbnRTdHJpbmcoCisJCQlwQUMtPnBDb25maWdUYWJsZSwKKwkJCU1TR19UWVBFX1JVTlRJTUVfSU5GTywKKwkJCSJBTiBFeHAvSUVFRSBFeHQ6ICV4LCAxMDAwVCBDdHJsL1N0YXQ6ICV4IiwKKwkJCSh2b2lkICopU3RhdDEsCisJCQkodm9pZCAqKVN0YXQyKTsKKworCQlTdGF0MSA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9QX0VYVF9DVFJMLCAmU3RhdDEpOworCQlTdGF0MiA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9QX0VYVF9TVEFULCAmU3RhdDIpOworCQlTdGF0MSA9IFN0YXQxIDw8IDE2IHwgU3RhdDI7CisJCVN0YXQyID0gMDsKKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0FVWF9DVFJMLCAmU3RhdDIpOworCQlTdGF0MyA9IDA7CisJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9BVVhfU1RBVCwgJlN0YXQzKTsKKwkJU3RhdDIgPSBTdGF0MiA8PCAxNiB8IFN0YXQzOworCQlDTVNNUHJpbnRTdHJpbmcoCisJCQlwQUMtPnBDb25maWdUYWJsZSwKKwkJCU1TR19UWVBFX1JVTlRJTUVfSU5GTywKKwkJCSJQSFkgRXh0IEN0cmwvU3RhdDogJXgsIEF1eCBDdHJsL1N0YXQ6ICV4IiwKKwkJCSh2b2lkICopU3RhdDEsCisJCQkodm9pZCAqKVN0YXQyKTsKKwl9CisjZW5kaWYgLyogREVCVUcgKi8KKworCS8qCisJICogSGVyZSB3ZSB1c3VhbGx5IGNhbiBjaGVjayB3aGV0aGVyIHRoZSBsaW5rIGlzIGluIHN5bmMgYW5kCisJICogYXV0by1uZWdvdGlhdGlvbiBpcyBkb25lLgorCSAqLworCisJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX1NUQVQsICZQaHlTdGF0KTsKKworCVNrTWFjQXV0b05lZ0xpcGFQaHkocEFDLCBJb0MsIFBvcnQsIFBoeVN0YXQpOworCQorCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJDaGVja1VwIFBvcnQgJWQsIFBoeVN0YXQ6IDB4JTA0WFxuIiwgUG9ydCwgUGh5U3RhdCkpOworCisJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NXzEwMDBUX1NUQVQsICZSZXNBYik7CisKKwlpZiAoKFJlc0FiICYgUEhZX0JfMTAwMFNfTVNGKSAhPSAwKSB7CisJCS8qIEVycm9yICovCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiTWFzdGVyL1NsYXZlIEZhdWx0IHBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJCisJCXBQcnQtPlBBdXRvTmVnRmFpbCA9IFNLX1RSVUU7CisJCXBQcnQtPlBNU1N0YXR1cyA9IFNLX01TX1NUQVRfRkFVTFQ7CisJCQorCQlyZXR1cm4oU0tfSFdfUFNfUkVTVEFSVCk7CisJfQorCisJaWYgKChQaHlTdGF0ICYgUEhZX1NUX0xTWU5DKSA9PSAwKSB7CisJCXJldHVybihTS19IV19QU19OT05FKTsKKwl9CisJCisJcFBydC0+UE1TU3RhdHVzID0gKChSZXNBYiAmIFBIWV9CXzEwMDBTX01TUikgIT0gMCkgPworCQlTS19NU19TVEFUX01BU1RFUiA6IFNLX01TX1NUQVRfU0xBVkU7CisJCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkoIlBvcnQgJWQsIFJlc0FiOiAweCUwNFhcbiIsIFBvcnQsIFJlc0FiKSk7CisKKwlpZiAoQXV0b05lZykgeworCQlpZiAoKFBoeVN0YXQgJiBQSFlfU1RfQU5fT1ZFUikgIT0gMCkgeworCQkJCisJCQlTa0hXTGlua1VwKHBBQywgSW9DLCBQb3J0KTsKKwkJCQorCQkJRG9uZSA9IFNrTWFjQXV0b05lZ0RvbmUocEFDLCBJb0MsIFBvcnQpOworCQkJCisJCQlpZiAoRG9uZSAhPSBTS19BTkRfT0spIHsKKyNpZmRlZiBERUJVRworCQkJCS8qIEdldCBQSFkgcGFyYW1ldGVycywgZm9yIGRlYnVnZ2luZyBvbmx5ICovCisJCQkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0FVTkVfTFAsICZMcEFiKTsKKwkJCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fMTAwMFRfU1RBVCwgJkV4dFN0YXQpOworCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkJKCJBdXRvTmVnIEZBSUwgUG9ydCAlZCAoTHBBYiAleCwgMTAwMFRTdGF0ICV4KVxuIiwKKwkJCQkJUG9ydCwgTHBBYiwgRXh0U3RhdCkpOworI2VuZGlmIC8qIERFQlVHICovCisJCQkJcmV0dXJuKFNLX0hXX1BTX1JFU1RBUlQpOworCQkJfQorCQkJZWxzZSB7CisjaWZkZWYgeERFQlVHCisJCQkJLyogRHVtbXkgcmVhZCBJU1IgdG8gcHJldmVudCBleHRyYSBsaW5rIGRvd25zL3VwcyAqLworCQkJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9JTlRfU1RBVCwgJkV4dFN0YXQpOworCisJCQkJaWYgKChFeHRTdGF0ICYgfihQSFlfQl9JU19IQ1QgfCBQSFlfQl9JU19MQ1QpKSAhPSAwKSB7CisJCQkJCUNNU01QcmludFN0cmluZygKKwkJCQkJCXBBQy0+cENvbmZpZ1RhYmxlLAorCQkJCQkJTVNHX1RZUEVfUlVOVElNRV9JTkZPLAorCQkJCQkJIkNoZWNrVXAyIC0gU3RhdDogJXgiLAorCQkJCQkJKHZvaWQgKilFeHRTdGF0LAorCQkJCQkJKHZvaWQgKilOVUxMKTsKKwkJCQl9CisjZW5kaWYgLyogREVCVUcgKi8KKwkJCQlyZXR1cm4oU0tfSFdfUFNfTElOSyk7CisJCQl9CisJCX0KKwl9CisJZWxzZSB7CS8qICFBdXRvTmVnICovCisJCS8qIExpbmsgaXMgdXAgYW5kIHdlIGRvbid0IG5lZWQgbW9yZS4gKi8KKyNpZmRlZiBERUJVRworCQlpZiAocFBydC0+UExpcGFBdXRvTmVnID09IFNLX0xJUEFfQVVUTykgeworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiRVJST1I6IExpcGEgYXV0byBkZXRlY3RlZCBvbiBwb3J0ICVkXG4iLCBQb3J0KSk7CisJCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCisjaWZkZWYgeERFQlVHCisJCS8qIER1bW15IHJlYWQgSVNSIHRvIHByZXZlbnQgZXh0cmEgbGluayBkb3ducy91cHMgKi8KKwkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0lOVF9TVEFULCAmRXh0U3RhdCk7CisKKwkJaWYgKChFeHRTdGF0ICYgfihQSFlfQl9JU19IQ1QgfCBQSFlfQl9JU19MQ1QpKSAhPSAwKSB7CisJCQlDTVNNUHJpbnRTdHJpbmcoCisJCQkJcEFDLT5wQ29uZmlnVGFibGUsCisJCQkJTVNHX1RZUEVfUlVOVElNRV9JTkZPLAorCQkJCSJDaGVja1VwMyAtIFN0YXQ6ICV4IiwKKwkJCQkodm9pZCAqKUV4dFN0YXQsCisJCQkJKHZvaWQgKilOVUxMKTsKKwkJfQorI2VuZGlmIC8qIERFQlVHICovCisJCQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lSUSwKKwkJCSgiTGluayBzeW5jKEdQKSwgUG9ydCAlZFxuIiwgUG9ydCkpOworCQlTa0hXTGlua1VwKHBBQywgSW9DLCBQb3J0KTsKKwkJCisJCXJldHVybihTS19IV19QU19MSU5LKTsKKwl9CisKKwlyZXR1cm4oU0tfSFdfUFNfTk9ORSk7Cit9CS8qIFNrR2VQb3J0Q2hlY2tVcEJjb20gKi8KKyNlbmRpZiAvKiBHRU5FU0lTICovCisKKworI2lmZGVmIFlVS09OCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU2tHZVBvcnRDaGVja1VwR21hYygpIC0gQ2hlY2sgaWYgdGhlIGxpbmsgaXMgdXAgb24gTWFydmVsbCBQSFkKKyAqCisgKiByZXR1cm46CisgKgkwCW8uay4gbm90aGluZyBuZWVkZWQKKyAqCTEJUmVzdGFydCBuZWVkZWQgb24gdGhpcyBwb3J0CisgKgkyCUxpbmsgY2FtZSB1cAorICovCitzdGF0aWMgaW50IFNrR2VQb3J0Q2hlY2tVcEdtYWMoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gQ29udGV4dCAqLworaW50CQlQb3J0LAkJLyogV2hpY2ggcG9ydCBzaG91bGQgYmUgY2hlY2tlZCAqLworU0tfQk9PTAlBdXRvTmVnKQkvKiBJcyBBdXRvLW5lZ290aWF0aW9uIHVzZWQgPyAqLworeworCVNLX0dFUE9SVAkqcFBydDsJCS8qIEdJbmkgUG9ydCBzdHJ1Y3QgcG9pbnRlciAqLworCWludAkJCURvbmU7CisJU0tfVTE2CQlQaHlJc3JjOwkvKiBQSFkgSW50ZXJydXB0IHNvdXJjZSAqLworCVNLX1UxNgkJUGh5U3RhdDsJLyogUFBZIFN0YXR1cyAqLworCVNLX1UxNgkJUGh5U3BlY1N0YXQ7LyogUEhZIFNwZWNpZmljIFN0YXR1cyAqLworCVNLX1UxNgkJUmVzQWI7CQkvKiBNYXN0ZXIvU2xhdmUgcmVzb2x1dGlvbiAqLworCVNLX0VWUEFSQQlQYXJhOworI2lmZGVmIERFQlVHCisJU0tfVTE2CQlXb3JkOwkJLyogSS9PIGhlbHBlciAqLworI2VuZGlmIC8qIERFQlVHICovCisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCWlmIChwUHJ0LT5QSFdMaW5rVXApIHsKKwkJcmV0dXJuKFNLX0hXX1BTX05PTkUpOworCX0KKworCS8qIFJlYWQgUEhZIFN0YXR1cyAqLworCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9TVEFULCAmUGh5U3RhdCk7CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiQ2hlY2tVcCBQb3J0ICVkLCBQaHlTdGF0OiAweCUwNFhcbiIsIFBvcnQsIFBoeVN0YXQpKTsKKworCS8qIFJlYWQgUEhZIEludGVycnVwdCBTdGF0dXMgKi8KKwlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfSU5UX1NUQVQsICZQaHlJc3JjKTsKKworCWlmICgoUGh5SXNyYyAmIFBIWV9NX0lTX0FOX0NPTVBMKSAhPSAwKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQXV0by1OZWdvdGlhdGlvbiBDb21wbGV0ZWQsIFBoeUlzcmM6IDB4JTA0WFxuIiwgUGh5SXNyYykpOworCX0KKworCWlmICgoUGh5SXNyYyAmIFBIWV9NX0lTX0xTUF9DSEFOR0UpICE9IDApIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJMaW5rIFNwZWVkIENoYW5nZWQsIFBoeUlzcmM6IDB4JTA0WFxuIiwgUGh5SXNyYykpOworCX0KKworCVNrTWFjQXV0b05lZ0xpcGFQaHkocEFDLCBJb0MsIFBvcnQsIFBoeVN0YXQpOworCQorCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl8xMDAwVF9TVEFULCAmUmVzQWIpOworCisJaWYgKChSZXNBYiAmIFBIWV9CXzEwMDBTX01TRikgIT0gMCkgeworCQkvKiBFcnJvciAqLworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIk1hc3Rlci9TbGF2ZSBGYXVsdCBwb3J0ICVkXG4iLCBQb3J0KSk7CisJCQorCQlwUHJ0LT5QQXV0b05lZ0ZhaWwgPSBTS19UUlVFOworCQlwUHJ0LT5QTVNTdGF0dXMgPSBTS19NU19TVEFUX0ZBVUxUOworCQkKKwkJcmV0dXJuKFNLX0hXX1BTX1JFU1RBUlQpOworCX0KKworCS8qIFJlYWQgUEhZIFNwZWNpZmljIFN0YXR1cyAqLworCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9QSFlfU1RBVCwgJlBoeVNwZWNTdGF0KTsKKwkKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiUGh5MTAwMEJUOiAweCUwNFgsIFBoeVNwZWNTdGF0OiAweCUwNFhcbiIsIFJlc0FiLCBQaHlTcGVjU3RhdCkpOworCisjaWZkZWYgREVCVUcKKwlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfQVVORV9FWFAsICZXb3JkKTsKKworCWlmICgoUGh5SXNyYyAmIFBIWV9NX0lTX0FOX1BSKSAhPSAwIHx8IChXb3JkICYgUEhZX0FORV9SWF9QRykgIT0gMCB8fAorCQkoUGh5U3BlY1N0YXQgJiBQSFlfTV9QU19QQUdFX1JFQykgIT0gMCkgIHsKKwkJLyogUmVhZCBQSFkgTmV4dCBQYWdlIExpbmsgUGFydG5lciAqLworCQlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfTkVQR19MUCwgJldvcmQpOworCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiUGFnZSBSZWNlaXZlZCwgTmV4dFBhZ2U6IDB4JTA0WFxuIiwgV29yZCkpOworCX0KKyNlbmRpZiAvKiBERUJVRyAqLworCisJaWYgKChQaHlTcGVjU3RhdCAmIFBIWV9NX1BTX0xJTktfVVApID09IDApIHsKKwkJcmV0dXJuKFNLX0hXX1BTX05PTkUpOworCX0KKwkKKwlpZiAoKFBoeVNwZWNTdGF0ICYgUEhZX01fUFNfRE9XTlNfU1RBVCkgIT0gMCB8fAorCQkoUGh5SXNyYyAmIFBIWV9NX0lTX0RPV05TSF9ERVQpICE9IDApIHsKKwkJLyogRG93bnNoaWZ0IGRldGVjdGVkICovCisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVywgU0tFUlJfU0lSUV9FMDI1LCBTS0VSUl9TSVJRX0UwMjVNU0cpOworCQkKKwkJUGFyYS5QYXJhNjQgPSBQb3J0OworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX0RPV05TSElGVF9ERVQsIFBhcmEpOworCQkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJEb3duc2hpZnQgZGV0ZWN0ZWQsIFBoeUlzcmM6IDB4JTA0WFxuIiwgUGh5SXNyYykpOworCX0KKworCXBQcnQtPlBNU1N0YXR1cyA9ICgoUmVzQWIgJiBQSFlfQl8xMDAwU19NU1IpICE9IDApID8KKwkJU0tfTVNfU1RBVF9NQVNURVIgOiBTS19NU19TVEFUX1NMQVZFOworCQorCXBQcnQtPlBDYWJsZUxlbiA9IChTS19VOCkoKFBoeVNwZWNTdGF0ICYgUEhZX01fUFNfQ0FCTEVfTVNLKSA+PiA3KTsKKwkKKwlpZiAoQXV0b05lZykgeworCQkvKiBBdXRvLU5lZ290aWF0aW9uIE92ZXIgPyAqLworCQlpZiAoKFBoeVN0YXQgJiBQSFlfU1RfQU5fT1ZFUikgIT0gMCkgeworCQkJCisJCQlTa0hXTGlua1VwKHBBQywgSW9DLCBQb3J0KTsKKwkJCQorCQkJRG9uZSA9IFNrTWFjQXV0b05lZ0RvbmUocEFDLCBJb0MsIFBvcnQpOworCQkJCisJCQlpZiAoRG9uZSAhPSBTS19BTkRfT0spIHsKKwkJCQlyZXR1cm4oU0tfSFdfUFNfUkVTVEFSVCk7CisJCQl9CisJCQkKKwkJCXJldHVybihTS19IV19QU19MSU5LKTsKKwkJfQorCX0KKwllbHNlIHsJLyogIUF1dG9OZWcgKi8KKwkJLyogTGluayBpcyB1cCBhbmQgd2UgZG9uJ3QgbmVlZCBtb3JlICovCisjaWZkZWYgREVCVUcKKwkJaWYgKHBQcnQtPlBMaXBhQXV0b05lZyA9PSBTS19MSVBBX0FVVE8pIHsKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIkVSUk9SOiBMaXBhIGF1dG8gZGV0ZWN0ZWQgb24gcG9ydCAlZFxuIiwgUG9ydCkpOworCQl9CisjZW5kaWYgLyogREVCVUcgKi8KKworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lSUSwKKwkJCSgiTGluayBzeW5jLCBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCVNrSFdMaW5rVXAocEFDLCBJb0MsIFBvcnQpOworCQkKKwkJcmV0dXJuKFNLX0hXX1BTX0xJTkspOworCX0KKworCXJldHVybihTS19IV19QU19OT05FKTsKK30JLyogU2tHZVBvcnRDaGVja1VwR21hYyAqLworI2VuZGlmIC8qIFlVS09OICovCisKKworI2lmZGVmIE9USEVSX1BIWQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNrR2VQb3J0Q2hlY2tVcExvbmUoKSAtIENoZWNrIGlmIHRoZSBsaW5rIGlzIHVwIG9uIExldmVsIE9uZSBQSFkKKyAqCisgKiByZXR1cm46CisgKgkwCW8uay4gbm90aGluZyBuZWVkZWQKKyAqCTEJUmVzdGFydCBuZWVkZWQgb24gdGhpcyBwb3J0CisgKgkyCUxpbmsgY2FtZSB1cAorICovCitzdGF0aWMgaW50IFNrR2VQb3J0Q2hlY2tVcExvbmUoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gQ29udGV4dCAqLworaW50CQlQb3J0LAkJLyogV2hpY2ggcG9ydCBzaG91bGQgYmUgY2hlY2tlZCAqLworU0tfQk9PTAlBdXRvTmVnKQkvKiBJcyBBdXRvLW5lZ290aWF0aW9uIHVzZWQgPyAqLworeworCVNLX0dFUE9SVAkqcFBydDsJCS8qIEdJbmkgUG9ydCBzdHJ1Y3QgcG9pbnRlciAqLworCWludAkJCURvbmU7CisJU0tfVTE2CQlJc3JjOwkJLyogSW50ZXJydXB0IHNvdXJjZSByZWdpc3RlciAqLworCVNLX1UxNgkJTHBBYjsJCS8qIExpbmsgUGFydG5lciBBYmlsaXR5ICovCisJU0tfVTE2CQlFeHRTdGF0OwkvKiBFeHRlbmRlZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKwlTS19VMTYJCVBoeVN0YXQ7CS8qIFBoeSBTdGF0dXMgUmVnaXN0ZXIgKi8KKwlTS19VMTYJCVN0YXRTdW07CisJU0tfVTgJCU5leHRNb2RlOwkvKiBOZXh0IEF1dG9TZW5zaW5nIE1vZGUgKi8KKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJaWYgKHBQcnQtPlBIV0xpbmtVcCkgeworCQlyZXR1cm4oU0tfSFdfUFNfTk9ORSk7CisJfQorCisJU3RhdFN1bSA9IHBQcnQtPlBJc2F2ZTsKKwlwUHJ0LT5QSXNhdmUgPSAwOworCisJLyoKKwkgKiBoZXJlIHdlIHVzdWFsbHkgY2FuIGNoZWNrIHdoZXRoZXIgdGhlIGxpbmsgaXMgaW4gc3luYyBhbmQKKwkgKiBhdXRvLW5lZ290aWF0aW9uIGlzIGRvbmUuCisJICovCisJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9MT05FX1NUQVQsICZQaHlTdGF0KTsKKwlTdGF0U3VtIHw9IFBoeVN0YXQ7CisKKwlTa01hY0F1dG9OZWdMaXBhUGh5KHBBQywgSW9DLCBQb3J0LCBQaHlTdGF0KTsKKwkKKwlpZiAoKFBoeVN0YXQgJiBQSFlfU1RfTFNZTkMpID09IDApIHsKKwkJLyogU2F2ZSBBdXRvLW5lZ290aWF0aW9uIERvbmUgYml0ICovCisJCXBQcnQtPlBJc2F2ZSA9IChTS19VMTYpKFN0YXRTdW0gJiBQSFlfU1RfQU5fT1ZFUik7CisjaWZkZWYgREVCVUcKKwkJaWYgKChwUHJ0LT5QSXNhdmUgJiBQSFlfU1RfQU5fT1ZFUikgIT0gMCkgeworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiQXV0b05lZyBkb25lIHJlc2NoZWR1bGVkIFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJfQorI2VuZGlmIC8qIERFQlVHICovCisJCXJldHVybihTS19IV19QU19OT05FKTsKKwl9CisKKwlpZiAoQXV0b05lZykgeworCQlpZiAoKFN0YXRTdW0gJiBQSFlfU1RfQU5fT1ZFUikgIT0gMCkgeworCQkJU2tIV0xpbmtVcChwQUMsIElvQywgUG9ydCk7CisJCQlEb25lID0gU2tNYWNBdXRvTmVnRG9uZShwQUMsIElvQywgUG9ydCk7CisJCQlpZiAoRG9uZSAhPSBTS19BTkRfT0spIHsKKwkJCQkvKiBHZXQgUEhZIHBhcmFtZXRlcnMsIGZvciBkZWJ1Z2dpbmcgb25seSAqLworCQkJCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTE9ORV9BVU5FX0xQLCAmTHBBYik7CisJCQkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9MT05FXzEwMDBUX1NUQVQsICZFeHRTdGF0KTsKKwkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkJCSgiQXV0b05lZyBGQUlMIFBvcnQgJWQgKExwQWIgJXgsIDEwMDBUU3RhdCAleClcbiIsCisJCQkJCSBQb3J0LCBMcEFiLCBFeHRTdGF0KSk7CisJCQkJCQorCQkJCS8qIFRyeSBuZXh0IHBvc3NpYmxlIG1vZGUgKi8KKwkJCQlOZXh0TW9kZSA9IFNrSFdTZW5zZUdldE5leHQocEFDLCBJb0MsIFBvcnQpOworCQkJCVNrSFdMaW5rRG93bihwQUMsIElvQywgUG9ydCk7CisJCQkJaWYgKERvbmUgPT0gU0tfQU5EX0RVUF9DQVApIHsKKwkJCQkJLyogR29UbyBuZXh0IG1vZGUgKi8KKwkJCQkJU2tIV1NlbnNlU2V0TmV4dChwQUMsIElvQywgUG9ydCwgTmV4dE1vZGUpOworCQkJCX0KKworCQkJCXJldHVybihTS19IV19QU19SRVNUQVJUKTsKKworCQkJfQorCQkJZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBEdW1teSBSZWFkIGludGVycnVwdCBzdGF0dXMgdG8gcHJldmVudAorCQkJCSAqIGV4dHJhIGxpbmsgZG93bi91cHMKKwkJCQkgKi8KKwkJCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0xPTkVfSU5UX1NUQVQsICZFeHRTdGF0KTsKKwkJCQlyZXR1cm4oU0tfSFdfUFNfTElOSyk7CisJCQl9CisJCX0KKwkJCisJCS8qIEF1dG9OZWcgbm90IGRvbmUsIGJ1dCBIVyBsaW5rIGlzIHVwLiBDaGVjayBmb3IgdGltZW91dHMgKi8KKwkJcFBydC0+UEF1dG9OZWdUaW1lT3V0Kys7CisJCWlmIChwUHJ0LT5QQXV0b05lZ1RpbWVPdXQgPj0gU0tfQU5EX01BWF9UTykgeworCQkJLyogVGltZW91dCBvY2N1cmVkICovCisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lSUSwKKwkJCQkoIkF1dG9OZWcgdGltZW91dCBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCQlpZiAocFBydC0+UExpbmtNb2RlQ29uZiA9PSBTS19MTU9ERV9BVVRPU0VOU0UgJiYKKwkJCQlwUHJ0LT5QTGlwYUF1dG9OZWcgIT0gU0tfTElQQV9BVVRPKSB7CisJCQkJLyogU2V0IExpbmsgbWFudWFsbHkgdXAgKi8KKwkJCQlTa0hXU2Vuc2VTZXROZXh0KHBBQywgSW9DLCBQb3J0LCBTS19MTU9ERV9GVUxMKTsKKwkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lSUSwKKwkJCQkJKCJTZXQgbWFudWFsIGZ1bGwgZHVwbGV4IFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJCX0KKworCQkJLyogRG8gdGhlIHJlc3RhcnQgKi8KKwkJCXJldHVybihTS19IV19QU19SRVNUQVJUKTsKKwkJfQorCX0KKwllbHNlIHsKKwkJLyogTGluayBpcyB1cCBhbmQgd2UgZG9uJ3QgbmVlZCBtb3JlICovCisjaWZkZWYgREVCVUcKKwkJaWYgKHBQcnQtPlBMaXBhQXV0b05lZyA9PSBTS19MSVBBX0FVVE8pIHsKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIkVSUk9SOiBMaXBhIGF1dG8gZGV0ZWN0ZWQgb24gcG9ydCAlZFxuIiwgUG9ydCkpOworCQl9CisjZW5kaWYgLyogREVCVUcgKi8KKworCQkvKgorCQkgKiBEdW1teSBSZWFkIGludGVycnVwdCBzdGF0dXMgdG8gcHJldmVudAorCQkgKiBleHRyYSBsaW5rIGRvd24vdXBzCisJCSAqLworCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0xPTkVfSU5UX1NUQVQsICZFeHRTdGF0KTsKKwkJCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfSVJRLAorCQkJKCJMaW5rIHN5bmMoR1ApLCBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCVNrSFdMaW5rVXAocEFDLCBJb0MsIFBvcnQpOworCQkKKwkJcmV0dXJuKFNLX0hXX1BTX0xJTkspOworCX0KKworCXJldHVybihTS19IV19QU19OT05FKTsKK30JLyogU2tHZVBvcnRDaGVja1VwTG9uZSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTa0dlUG9ydENoZWNrVXBOYXQoKSAtIENoZWNrIGlmIHRoZSBsaW5rIGlzIHVwIG9uIE5hdGlvbmFsIFBIWQorICoKKyAqIHJldHVybjoKKyAqCTAJby5rLiBub3RoaW5nIG5lZWRlZAorICoJMQlSZXN0YXJ0IG5lZWRlZCBvbiB0aGlzIHBvcnQKKyAqCTIJTGluayBjYW1lIHVwCisgKi8KK3N0YXRpYyBpbnQgU2tHZVBvcnRDaGVja1VwTmF0KAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIENvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFdoaWNoIHBvcnQgc2hvdWxkIGJlIGNoZWNrZWQgKi8KK1NLX0JPT0wJQXV0b05lZykJLyogSXMgQXV0by1uZWdvdGlhdGlvbiB1c2VkID8gKi8KK3sKKwkvKiB0b2RvOiBOYXRpb25hbCAqLworCXJldHVybihTS19IV19QU19OT05FKTsKK30JLyogU2tHZVBvcnRDaGVja1VwTmF0ICovCisjZW5kaWYgLyogT1RIRVJfUEhZICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VTaXJxRXZlbnQoKSAtIEV2ZW50IFNlcnZpY2UgUm91dGluZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIE5vdGVzOgorICovCitpbnQJU2tHZVNpcnFFdmVudCgKK1NLX0FDCQkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJCS8qIElvIENvbnRleHQgKi8KK1NLX1UzMgkJRXZlbnQsCQkvKiBNb2R1bGUgc3BlY2lmaWMgRXZlbnQgKi8KK1NLX0VWUEFSQQlQYXJhKQkJLyogRXZlbnQgc3BlY2lmaWMgUGFyYW1ldGVyICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OwkJLyogR0luaSBQb3J0IHN0cnVjdCBwb2ludGVyICovCisJU0tfVTMyCQlQb3J0OworCVNLX1UzMgkJVmFsMzI7CisJaW50CQkJUG9ydFN0YXQ7CisJU0tfVTgJCVZhbDg7CisjaWZkZWYgR0VORVNJUworCVNLX1U2NAkJT2N0ZXRzOworI2VuZGlmIC8qIEdFTkVTSVMgKi8KKworCVBvcnQgPSBQYXJhLlBhcmEzMlswXTsKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCXN3aXRjaCAoRXZlbnQpIHsKKwljYXNlIFNLX0hXRVZfV0FUSU06CisJCWlmIChwUHJ0LT5QU3RhdGUgPT0gU0tfUFJUX1JFU0VUKSB7CisJCQorCQkJUG9ydFN0YXQgPSBTS19IV19QU19OT05FOworCQl9CisJCWVsc2UgeworCQkJLyogQ2hlY2sgd2hldGhlciBwb3J0IGNhbWUgdXAgKi8KKwkJCVBvcnRTdGF0ID0gU2tHZVBvcnRDaGVja1VwKHBBQywgSW9DLCAoaW50KVBvcnQpOworCQl9CisKKwkJc3dpdGNoIChQb3J0U3RhdCkgeworCQljYXNlIFNLX0hXX1BTX1JFU1RBUlQ6CisJCQlpZiAocFBydC0+UEhXTGlua1VwKSB7CisJCQkJLyogU2V0IExpbmsgdG8gZG93biAqLworCQkJCVNrSFdMaW5rRG93bihwQUMsIElvQywgKGludClQb3J0KTsKKworCQkJCS8qCisJCQkJICogU2lnbmFsIGRpcmVjdGx5IHRvIFJMTVQgdG8gZW5zdXJlIGNvcnJlY3QKKwkJCQkgKiBzZXF1ZW5jZSBvZiBTV0lUQ0ggYW5kIFJFU0VUIGV2ZW50LgorCQkJCSAqLworCQkJCVNrUmxtdEV2ZW50KHBBQywgSW9DLCBTS19STE1UX0xJTktfRE9XTiwgUGFyYSk7CisJCQl9CisKKwkJCS8qIFJlc3RhcnQgbmVlZGVkICovCisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1BPUlRfUkVTRVQsIFBhcmEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTS19IV19QU19MSU5LOgorCQkJLyogU2lnbmFsIHRvIFJMTVQgKi8KKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9MSU5LX1VQLCBQYXJhKTsKKwkJCWJyZWFrOworCQl9CisJCQorCQkvKiBTdGFydCBhZ2FpbiB0aGUgY2hlY2sgVGltZXIgKi8KKwkJaWYgKHBQcnQtPlBIV0xpbmtVcCkgeworCQkJVmFsMzIgPSBTS19XQV9BQ1RfVElNRTsKKwkJfQorCQllbHNlIHsKKwkJCVZhbDMyID0gU0tfV0FfSU5BX1RJTUU7CisJCX0KKworCQkvKiBUb2RvOiBzdGlsbCBuZWVkZWQgZm9yIG5vbi1YTUFDIFBIWXM/Pz8gKi8KKwkJLyogU3RhcnQgd29ya2Fyb3VuZCBFcnJhdGEgIzIgdGltZXIgKi8KKwkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcFBydC0+UFdhVGltZXIsIFZhbDMyLAorCQkJU0tHRV9IV0FDLCBTS19IV0VWX1dBVElNLCBQYXJhKTsKKwkJYnJlYWs7CisKKwljYXNlIFNLX0hXRVZfUE9SVF9TVEFSVDoKKwkJaWYgKHBQcnQtPlBIV0xpbmtVcCkgeworCQkJLyoKKwkJCSAqIFNpZ25hbCBkaXJlY3RseSB0byBSTE1UIHRvIGVuc3VyZSBjb3JyZWN0CisJCQkgKiBzZXF1ZW5jZSBvZiBTV0lUQ0ggYW5kIFJFU0VUIGV2ZW50LgorCQkJICovCisJCQlTa1JsbXRFdmVudChwQUMsIElvQywgU0tfUkxNVF9MSU5LX0RPV04sIFBhcmEpOworCQl9CisKKwkJU2tIV0xpbmtEb3duKHBBQywgSW9DLCAoaW50KVBvcnQpOworCisJCS8qIFNjaGVkdWxlIFBvcnQgUkVTRVQgKi8KKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9QT1JUX1JFU0VULCBQYXJhKTsKKworCQkvKiBTdGFydCB3b3JrYXJvdW5kIEVycmF0YSAjMiB0aW1lciAqLworCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwUHJ0LT5QV2FUaW1lciwgU0tfV0FfSU5BX1RJTUUsCisJCQlTS0dFX0hXQUMsIFNLX0hXRVZfV0FUSU0sIFBhcmEpOworCQlicmVhazsKKworCWNhc2UgU0tfSFdFVl9QT1JUX1NUT1A6CisJCWlmIChwUHJ0LT5QSFdMaW5rVXApIHsKKwkJCS8qCisJCQkgKiBTaWduYWwgZGlyZWN0bHkgdG8gUkxNVCB0byBlbnN1cmUgY29ycmVjdAorCQkJICogc2VxdWVuY2Ugb2YgU1dJVENIIGFuZCBSRVNFVCBldmVudC4KKwkJCSAqLworCQkJU2tSbG10RXZlbnQocEFDLCBJb0MsIFNLX1JMTVRfTElOS19ET1dOLCBQYXJhKTsKKwkJfQorCisJCS8qIFN0b3AgV29ya2Fyb3VuZCBUaW1lciAqLworCQlTa1RpbWVyU3RvcChwQUMsIElvQywgJnBQcnQtPlBXYVRpbWVyKTsKKworCQlTa0hXTGlua0Rvd24ocEFDLCBJb0MsIChpbnQpUG9ydCk7CisJCWJyZWFrOworCisJY2FzZSBTS19IV0VWX1VQREFURV9TVEFUOgorCQkvKiBXZSBkbyBOT1QgbmVlZCB0byB1cGRhdGUgYW55IHN0YXRpc3RpY3MgKi8KKwkJYnJlYWs7CisKKwljYXNlIFNLX0hXRVZfQ0xFQVJfU1RBVDoKKwkJLyogV2UgZG8gTk9UIG5lZWQgdG8gY2xlYXIgYW55IHN0YXRpc3RpY3MgKi8KKwkJZm9yIChQb3J0ID0gMDsgUG9ydCA8IChTS19VMzIpcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBQb3J0KyspIHsKKwkJCXBQcnQtPlBQcmV2UnggPSAwOworCQkJcFBydC0+UFByZXZGY3MgPSAwOworCQkJcFBydC0+UFByZXZTaG9ydHMgPSAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTS19IV0VWX1NFVF9MTU9ERToKKwkJVmFsOCA9IChTS19VOClQYXJhLlBhcmEzMlsxXTsKKwkJaWYgKHBQcnQtPlBMaW5rTW9kZUNvbmYgIT0gVmFsOCkgeworCQkJLyogU2V0IE5ldyBsaW5rIG1vZGUgKi8KKwkJCXBQcnQtPlBMaW5rTW9kZUNvbmYgPSBWYWw4OworCisJCQkvKiBSZXN0YXJ0IFBvcnQgKi8KKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfSFdBQywgU0tfSFdFVl9QT1JUX1NUT1AsIFBhcmEpOworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9IV0FDLCBTS19IV0VWX1BPUlRfU1RBUlQsIFBhcmEpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTS19IV0VWX1NFVF9GTE9XTU9ERToKKwkJVmFsOCA9IChTS19VOClQYXJhLlBhcmEzMlsxXTsKKwkJaWYgKHBQcnQtPlBGbG93Q3RybE1vZGUgIT0gVmFsOCkgeworCQkJLyogU2V0IE5ldyBGbG93IENvbnRyb2wgbW9kZSAqLworCQkJcFBydC0+UEZsb3dDdHJsTW9kZSA9IFZhbDg7CisKKwkJCS8qIFJlc3RhcnQgUG9ydCAqLworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9IV0FDLCBTS19IV0VWX1BPUlRfU1RPUCwgUGFyYSk7CisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0hXQUMsIFNLX0hXRVZfUE9SVF9TVEFSVCwgUGFyYSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNLX0hXRVZfU0VUX1JPTEU6CisJCS8qIG5vdCBwb3NzaWJsZSBmb3IgZmliZXIgKi8KKwkJaWYgKCFwQUMtPkdJbmkuR0lDb3BwZXJUeXBlKSB7CisJCQlicmVhazsKKwkJfQorCQlWYWw4ID0gKFNLX1U4KVBhcmEuUGFyYTMyWzFdOworCQlpZiAocFBydC0+UE1TTW9kZSAhPSBWYWw4KSB7CisJCQkvKiBTZXQgTmV3IFJvbGUgKE1hc3Rlci9TbGF2ZSkgbW9kZSAqLworCQkJcFBydC0+UE1TTW9kZSA9IFZhbDg7CisKKwkJCS8qIFJlc3RhcnQgUG9ydCAqLworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9IV0FDLCBTS19IV0VWX1BPUlRfU1RPUCwgUGFyYSk7CisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0hXQUMsIFNLX0hXRVZfUE9SVF9TVEFSVCwgUGFyYSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNLX0hXRVZfU0VUX1NQRUVEOgorCQlpZiAocFBydC0+UGh5VHlwZSAhPSBTS19QSFlfTUFSVl9DT1BQRVIpIHsKKwkJCWJyZWFrOworCQl9CisJCVZhbDggPSAoU0tfVTgpUGFyYS5QYXJhMzJbMV07CisJCWlmIChwUHJ0LT5QTGlua1NwZWVkICE9IFZhbDgpIHsKKwkJCS8qIFNldCBOZXcgU3BlZWQgcGFyYW1ldGVyICovCisJCQlwUHJ0LT5QTGlua1NwZWVkID0gVmFsODsKKworCQkJLyogUmVzdGFydCBQb3J0ICovCisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0hXQUMsIFNLX0hXRVZfUE9SVF9TVE9QLCBQYXJhKTsKKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfSFdBQywgU0tfSFdFVl9QT1JUX1NUQVJULCBQYXJhKTsKKwkJfQorCQlicmVhazsKKworI2lmZGVmIEdFTkVTSVMKKwljYXNlIFNLX0hXRVZfSEFMRkRVUF9DSEs6CisJCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQkvKgorCQkJICogaGFsZiBkdXBsZXggaGFuZ3VwIHdvcmthcm91bmQuCisJCQkgKiBTZWUgcGFja2V0IGFyYml0ZXIgdGltZW91dCBpbnRlcnJ1cHQgZm9yIGRlc2NyaXB0aW9uCisJCQkgKi8KKwkJCXBQcnQtPkhhbGZEdXBUaW1lckFjdGl2ZSA9IFNLX0ZBTFNFOworCQkJaWYgKHBQcnQtPlBMaW5rTW9kZVN0YXR1cyA9PSBTS19MTU9ERV9TVEFUX0hBTEYgfHwKKwkJCQlwUHJ0LT5QTGlua01vZGVTdGF0dXMgPT0gU0tfTE1PREVfU1RBVF9BVVRPSEFMRikgeworI2lmZGVmIFhYWAorCQkJCUxlbiA9IHNpemVvZihTS19VNjQpOworCQkJCVNrUG5taUdldFZhcihwQUMsIElvQywgT0lEX1NLR0VfU1RBVF9UWF9PQ1RFVFMsIChjaGFyICopJk9jdGV0cywKKwkJCQkJJkxlbiwgKFNLX1UzMilTS19QTk1JX1BPUlRfUEhZUzJJTlNUKHBBQywgUG9ydCksCisJCQkJCXBBQy0+UmxtdC5Qb3J0W1BvcnRdLk5ldC0+TmV0TnVtYmVyKTsKKyNlbmRpZiAvKiBYWFggKi8KKwkJCQkvKiBTbmFwIHN0YXRpc3RpYyBjb3VudGVycyAqLworCQkJCSh2b2lkKVNrWG1VcGRhdGVTdGF0cyhwQUMsIElvQywgUG9ydCk7CisKKwkJCQkodm9pZClTa1htTWFjU3RhdGlzdGljKHBBQywgSW9DLCBQb3J0LCBYTV9UWE9fT0tfSEksICZWYWwzMik7CisKKwkJCQlPY3RldHMgPSAoU0tfVTY0KVZhbDMyIDw8IDMyOworCQkJCQorCQkJCSh2b2lkKVNrWG1NYWNTdGF0aXN0aWMocEFDLCBJb0MsIFBvcnQsIFhNX1RYT19PS19MTywgJlZhbDMyKTsKKworCQkJCU9jdGV0cyArPSBWYWwzMjsKKwkJCQkKKwkJCQlpZiAocFBydC0+TGFzdE9jdGV0cyA9PSBPY3RldHMpIHsKKwkJCQkJLyogVHggaGFuZ2luZywgYSBGSUZPIGZsdXNoIHJlc3RhcnRzIGl0ICovCisJCQkJCVNrTWFjRmx1c2hUeEZpZm8ocEFDLCBJb0MsIFBvcnQpOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKyNlbmRpZiAvKiBHRU5FU0lTICovCisJCisJZGVmYXVsdDoKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9TSVJRX0UwMDEsIFNLRVJSX1NJUlFfRTAwMU1TRyk7CisJCWJyZWFrOworCX0KKworCXJldHVybigwKTsKK30JLyogU2tHZVNpcnFFdmVudCAqLworCisKKyNpZmRlZiBHRU5FU0lTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tQaHlJc3JCY29tKCkgLSBQSFkgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZQorICoKKyAqIERlc2NyaXB0aW9uOiBoYW5kbGVzIGFsbCBpbnRlcnJ1cHRzIGZyb20gQkNvbSBQSFkKKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqLworc3RhdGljIHZvaWQgU2tQaHlJc3JCY29tKAorU0tfQUMJCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkJLyogSW8gQ29udGV4dCAqLworaW50CQkJUG9ydCwJCS8qIFBvcnQgTnVtID0gUEhZIE51bSAqLworU0tfVTE2CQlJU3RhdHVzKQkvKiBJbnRlcnJ1cHQgU3RhdHVzICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OwkJLyogR0luaSBQb3J0IHN0cnVjdCBwb2ludGVyICovCisJU0tfRVZQQVJBCVBhcmE7CisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCWlmICgoSVN0YXR1cyAmIFBIWV9CX0lTX1BTRSkgIT0gMCkgeworCQkvKiBJbmNvcnJlY3RhYmxlIHBhaXIgc3dhcCBlcnJvciAqLworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcgfCBTS19FUlJDTF9JTklULCBTS0VSUl9TSVJRX0UwMjIsCisJCQlTS0VSUl9TSVJRX0UwMjJNU0cpOworCX0KKwkKKwlpZiAoKElTdGF0dXMgJiAoUEhZX0JfSVNfQU5fUFIgfCBQSFlfQl9JU19MU1RfQ0hBTkdFKSkgIT0gMCkgeworCisJCVNrSFdMaW5rRG93bihwQUMsIElvQywgUG9ydCk7CisKKwkJUGFyYS5QYXJhMzJbMF0gPSAoU0tfVTMyKVBvcnQ7CisJCS8qIFNpZ25hbCB0byBSTE1UICovCisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUkxNVCwgU0tfUkxNVF9MSU5LX0RPV04sIFBhcmEpOworCisJCS8qIFN0YXJ0IHdvcmthcm91bmQgRXJyYXRhICMyIHRpbWVyICovCisJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBQcnQtPlBXYVRpbWVyLCBTS19XQV9JTkFfVElNRSwKKwkJCVNLR0VfSFdBQywgU0tfSFdFVl9XQVRJTSwgUGFyYSk7CisJfQorCit9CS8qIFNrUGh5SXNyQmNvbSAqLworI2VuZGlmIC8qIEdFTkVTSVMgKi8KKworCisjaWZkZWYgWVVLT04KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1BoeUlzckdtYWMoKSAtIFBIWSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lCisgKgorICogRGVzY3JpcHRpb246IGhhbmRsZXMgYWxsIGludGVycnVwdHMgZnJvbSBNYXJ2ZWxsIFBIWQorICoKKyAqIFJldHVybnM6IE4vQQorICovCitzdGF0aWMgdm9pZCBTa1BoeUlzckdtYWMoCitTS19BQwkJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCQkvKiBJbyBDb250ZXh0ICovCitpbnQJCQlQb3J0LAkJLyogUG9ydCBOdW0gPSBQSFkgTnVtICovCitTS19VMTYJCUlTdGF0dXMpCS8qIEludGVycnVwdCBTdGF0dXMgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CQkvKiBHSW5pIFBvcnQgc3RydWN0IHBvaW50ZXIgKi8KKwlTS19FVlBBUkEJUGFyYTsKKwlTS19VMTYJCVdvcmQ7CisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCWlmICgoSVN0YXR1cyAmIChQSFlfTV9JU19BTl9QUiB8IFBIWV9NX0lTX0xTVF9DSEFOR0UpKSAhPSAwKSB7CisKKwkJU2tIV0xpbmtEb3duKHBBQywgSW9DLCBQb3J0KTsKKworCQlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfQVVORV9BRFYsICZXb3JkKTsKKworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkF1dG9OZWcuQWR2OiAweCUwNFhcbiIsIFdvcmQpKTsKKwkJCisJCS8qIFNldCBBdXRvLW5lZ290aWF0aW9uIGFkdmVydGlzZW1lbnQgKi8KKwkJaWYgKHBQcnQtPlBGbG93Q3RybE1vZGUgPT0gU0tfRkxPV19NT0RFX1NZTV9PUl9SRU0pIHsKKwkJCS8qIHJlc3RvcmUgQXN5bW1ldHJpYyBQYXVzZSBiaXQgKi8KKwkJCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfQVVORV9BRFYsCisJCQkJKFNLX1UxNikoV29yZCB8IFBIWV9NX0FOX0FTUCkpOworCQl9CisJCQorCQlQYXJhLlBhcmEzMlswXSA9IChTS19VMzIpUG9ydDsKKwkJLyogU2lnbmFsIHRvIFJMTVQgKi8KKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX0xJTktfRE9XTiwgUGFyYSk7CisJfQorCQorCWlmICgoSVN0YXR1cyAmIFBIWV9NX0lTX0FOX0VSUk9SKSAhPSAwKSB7CisJCS8qIEF1dG8tTmVnb3RpYXRpb24gRXJyb3IgKi8KKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9TSVJRX0UwMjMsIFNLRVJSX1NJUlFfRTAyM01TRyk7CisJfQorCQorCWlmICgoSVN0YXR1cyAmIFBIWV9NX0lTX0ZJRk9fRVJST1IpICE9IDApIHsKKwkJLyogRklGTyBPdmVyZmxvdy9VbmRlcnJ1biBFcnJvciAqLworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX1NJUlFfRTAyNCwgU0tFUlJfU0lSUV9FMDI0TVNHKTsKKwl9CisJCit9CS8qIFNrUGh5SXNyR21hYyAqLworI2VuZGlmIC8qIFlVS09OICovCisKKworI2lmZGVmIE9USEVSX1BIWQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUGh5SXNyTG9uZSgpIC0gUEhZIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUKKyAqCisgKiBEZXNjcmlwdGlvbjogaGFuZGxlcyBhbGwgaW50ZXJydXB0cyBmcm9tIExPTkUgUEhZCisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3N0YXRpYyB2b2lkIFNrUGh5SXNyTG9uZSgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJbyBDb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBQb3J0IE51bSA9IFBIWSBOdW0gKi8KK1NLX1UxNglJU3RhdHVzKQkvKiBJbnRlcnJ1cHQgU3RhdHVzICovCit7CisJU0tfRVZQQVJBCVBhcmE7CisKKwlpZiAoSVN0YXR1cyAmIChQSFlfTF9JU19EVVAgfCBQSFlfTF9JU19JU09MKSkgeworCQkKKwkJU2tIV0xpbmtEb3duKHBBQywgSW9DLCBQb3J0KTsKKworCQlQYXJhLlBhcmEzMlswXSA9IChTS19VMzIpUG9ydDsKKwkJLyogU2lnbmFsIHRvIFJMTVQgKi8KKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX0xJTktfRE9XTiwgUGFyYSk7CisJfQorCit9CS8qIFNrUGh5SXNyTG9uZSAqLworI2VuZGlmIC8qIE9USEVSX1BIWSAqLworCisvKiBFbmQgb2YgRmlsZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2kyYy5jIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2kyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NWEwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NraTJjLmMKQEAgLTAsMCArMSwxMjk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2tpMmMuYworICogUHJvamVjdDoJR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVycywgVFdTSS1Nb2R1bGUKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS41OSAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8xMC8yMCAwOTowNzoyNSAkCisgKiBQdXJwb3NlOglGdW5jdGlvbnMgdG8gYWNjZXNzIFZvbHRhZ2UgYW5kIFRlbXBlcmF0dXJlIFNlbnNvcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QuCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJSTJDIFByb3RvY29sCisgKi8KKyNpZiAoZGVmaW5lZChERUJVRykgfHwgKCghZGVmaW5lZChMSU5UKSkgJiYgKCFkZWZpbmVkKFNLX1NMSU0pKSkpCitzdGF0aWMgY29uc3QgY2hhciBTeXNLb25uZWN0RmlsZUlkW10gPQorCSJAKCMpICRJZDogc2tpMmMuYyx2IDEuNTkgMjAwMy8xMC8yMCAwOTowNzoyNSByc2NobWlkdCBFeHAgJCAoQykgTWFydmVsbC4gIjsKKyNlbmRpZgorCisjaW5jbHVkZSAiaC9za2RydjFzdC5oIgkJLyogRHJpdmVyIFNwZWNpZmljIERlZmluaXRpb25zICovCisjaW5jbHVkZSAiaC9sbTgwLmgiCisjaW5jbHVkZSAiaC9za2RydjJuZC5oIgkJLyogQWRhcHRlciBDb250cm9sLSBhbmQgRHJpdmVyIHNwZWNpZmljIERlZi4gKi8KKworI2lmZGVmIF9fQzJNQU5fXworLyoKKwlJMkMgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24uCisKKwlHZW5lcmFsIERlc2NyaXB0aW9uOgorCisJVGhlIEkyQyBwcm90b2NvbCBpcyB1c2VkIGZvciB0aGUgdGVtcGVyYXR1cmUgc2Vuc29ycyBhbmQgZm9yCisJdGhlIHNlcmlhbCBFRVBST00gd2hpY2ggaG9sZCB0aGUgY29uZmlndXJhdGlvbi4KKworCVRoaXMgZmlsZSBjb3ZlcnMgZnVuY3Rpb25zIHRoYXQgYWxsb3cgdG8gcmVhZCB3cml0ZSBhbmQgZG8KKwlzb21lIGJ1bGsgcmVxdWVzdHMgYSBzcGVjaWZpZWQgSTJDIGFkZHJlc3MuCisKKwlUaGUgR2VuZXNpcyBoYXMgMiBJMkMgYnVzZXMuIE9uZSBmb3IgdGhlIEVFUFJPTSB3aGljaCBob2xkcworCXRoZSBWUEQgRGF0YSBhbmQgb25lIGZvciB0ZW1wZXJhdHVyZSBhbmQgdm9sdGFnZSBzZW5zb3IuCisJVGhlIGZvbGxvd2luZyBwaWN0dXJlIHNob3dzIHRoZSBJMkMgYnVzZXMsIEkyQyBkZXZpY2VzIGFuZAorCXRoZWlyIGNvbnRyb2wgcmVnaXN0ZXJzLgorCisJTm90ZTogVGhlIFZQRCBmdW5jdGlvbnMgYXJlIGluIHNrdnBkLmMKKy4KKy4JUENJIENvbmZpZyBJMkMgQnVzIGZvciBWUEQgRGF0YToKKy4KKy4JCSAgICAgICstLS0tLS0tLS0tLS0rCisuCQkgICAgICB8IFZQRCBFRVBST00gfAorLgkJICAgICAgKy0tLS0tLS0tLS0tLSsKKy4JCQkgICAgIHwKKy4JCQkgICAgIHwgPC0tIEkyQworLgkJCSAgICAgfAorLgkJICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKKy4JCSB8CQkJIHwKKy4JKy0tLS0tLS0tLS0tLS0tLS0tKwkrLS0tLS0tLS0tLS0tLS0tLS0rCisuCXwgUENJX1ZQRF9BRFJfUkVHIHwJfCBQQ0lfVlBEX0RBVF9SRUcgfAorLgkrLS0tLS0tLS0tLS0tLS0tLS0rCSstLS0tLS0tLS0tLS0tLS0tLSsKKy4KKy4KKy4JSTJDIEJ1cyBmb3IgTE04MCBzZW5zb3I6CisuCisuCQkJKy0tLS0tLS0tLS0tLS0tLS0tKworLgkJCXwgVGVtcGVyYXR1cmUgYW5kIHwKKy4JCQl8IFZvbHRhZ2UgU2Vuc29yICB8CisuCQkJfCAJTE04MAkgIHwKKy4JCQkrLS0tLS0tLS0tLS0tLS0tLS0rCisuCQkJCXwKKy4JCQkJfAorLgkJCUkyQyAtLT4gfAorLgkJCQl8CisuCQkJICAgICArLS0tLSsKKy4JICAgICArLS0tLS0tLS0tLS0tLS0+fCBPUiB8PC0tKworLgkgICAgIHwJCSAgICAgKy0tLS0rICAgfAorLiAgICAgKy0tLS0tLSstLS0tLS0rCQkgICAgICB8CisuICAgICB8CQkgICAgfAkJICAgICAgfAorLiArLS0tLS0tLS0rCSstLS0tLS0tLSsJKy0tLS0tLS0tLS0rCisuIHwgQjJfSTJDIHwJfCBCMl9JMkMgfAl8ICBCMl9JMkMgIHwKKy4gfCBfQ1RSTCAgfAl8IF9EQVRBICB8CXwgICBfU1cgICAgfAorLiArLS0tLS0tLS0rCSstLS0tLS0tLSsJKy0tLS0tLS0tLS0rCisuCisJVGhlIEkyQyBidXMgbWF5IGJlIGRyaXZlbiBieSB0aGUgQjJfSTJDX1NXIG9yIGJ5IHRoZSBCMl9JMkNfQ1RSTAorCWFuZCBCMl9JMkNfREFUQSByZWdpc3RlcnMuCisJRm9yIGRyaXZlciBzb2Z0d2FyZSBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIEkyQyBjb250cm9sIGFuZAorCWRhdGEgcmVnaXN0ZXIsIGJlY2F1c2UgSTJDIGJ1cyB0aW1pbmcgaXMgZG9uZSBieSB0aGUgQVNJQyBhbmQKKwlhbiBpbnRlcnJ1cHQgbWF5IGJlIHJlY2VpdmVkIHdoZW4gdGhlIEkyQyByZXF1ZXN0IGlzIGNvbXBsZXRlZC4KKworCUNsb2NrIFJhdGUgVGltaW5nOgkJCU1JTglNQVgJZ2VuZXJhdGVkIGJ5CisJCVZQRCBFRVBST006CQkJNTAga0h6CTEwMCBrSHoJCUhXCisJCUxNODAgb3ZlciBJMkMgQ3RybC9EYXRhIHJlZy4JNTAga0h6CTEwMCBrSHoJCUhXCisJCUxNODAgb3ZlciBCMl9JMkNfU1cgcmVnaXN0ZXIJMAk0MDAga0h6CQlTVworCisJTm90ZToJVGhlIGNsb2NrIGdlbmVyYXRlZCBieSB0aGUgaGFyZHdhcmUgaXMgZGVwZW5kZW5kIG9uIHRoZQorCQlQQ0kgY2xvY2suIElmIHRoZSBQQ0kgYnVzIGNsb2NrIGlzIDMzIE1IeiwgdGhlIEkyQy9WUEQKKwkJY2xvY2sgaXMgNTAga0h6LgorICovCitpbnRybygpCit7fQorI2VuZGlmCisKKyNpZmRlZiBTS19ESUFHCisvKgorICogSTJDIEZhc3QgTW9kZSB0aW1pbmcgdmFsdWVzIHVzZWQgYnkgdGhlIExNODAuCisgKiBJZiBuZXcgZGV2aWNlcyBhcmUgYWRkZWQgdG8gdGhlIEkyQyBidXMgdGhlIHRpbWluZyB2YWx1ZXMgaGF2ZSB0byBiZSBjaGVja2VkLgorICovCisjaWZuZGVmIEkyQ19TTE9XX1RJTUlORworI2RlZmluZQlUX0NMS19MT1cJCQkxMzAwTAkvKiBjbG9jayBsb3cgdGltZSBpbiBucyAqLworI2RlZmluZQlUX0NMS19ISUdICQkgCSA2MDBMCS8qIGNsb2NrIGhpZ2ggdGltZSBpbiBucyAqLworI2RlZmluZSBUX0RBVEFfSU5fU0VUVVAJCSAxMDBMCS8qIGRhdGEgaW4gU2V0LXVwIFRpbWUgKi8KKyNkZWZpbmUgVF9TVEFSVF9IT0xECQkgNjAwTAkvKiBzdGFydCBjb25kaXRpb24gaG9sZCB0aW1lICovCisjZGVmaW5lIFRfU1RBUlRfU0VUVVAJCSA2MDBMCS8qIHN0YXJ0IGNvbmRpdGlvbiBTZXQtdXAgdGltZSAqLworI2RlZmluZQlUX1NUT1BfU0VUVVAJCSA2MDBMCS8qIHN0b3AgY29uZGl0aW9uIFNldC11cCB0aW1lICovCisjZGVmaW5lIFRfQlVTX0lETEUJCQkxMzAwTAkvKiB0aW1lIHRoZSBidXMgbXVzdCBmcmVlIGFmdGVyIFR4ICovCisjZGVmaW5lCVRfQ0xLXzJfREFUQV9PVVQJIDkwMEwJLyogbWF4LiBjbG9jayBsb3cgdG8gZGF0YSBvdXRwdXQgdmFsaWQgKi8KKyNlbHNlCS8qIEkyQ19TTE9XX1RJTUlORyAqLworLyogSTJDIFN0YW5kYXJkIE1vZGUgVGltaW5nICovCisjZGVmaW5lCVRfQ0xLX0xPVwkJCTQ3MDBMCS8qIGNsb2NrIGxvdyB0aW1lIGluIG5zICovCisjZGVmaW5lCVRfQ0xLX0hJR0gJCQk0MDAwTAkvKiBjbG9jayBoaWdoIHRpbWUgaW4gbnMgKi8KKyNkZWZpbmUgVF9EQVRBX0lOX1NFVFVQCQkgMjUwTAkvKiBkYXRhIGluIFNldC11cCBUaW1lICovCisjZGVmaW5lIFRfU1RBUlRfSE9MRAkJNDAwMEwJLyogc3RhcnQgY29uZGl0aW9uIGhvbGQgdGltZSAqLworI2RlZmluZSBUX1NUQVJUX1NFVFVQCQk0NzAwTAkvKiBzdGFydCBjb25kaXRpb24gU2V0LXVwIHRpbWUgKi8KKyNkZWZpbmUJVF9TVE9QX1NFVFVQCQk0MDAwTAkvKiBzdG9wIGNvbmRpdGlvbiBTZXQtdXAgdGltZSAqLworI2RlZmluZSBUX0JVU19JRExFCQkJNDcwMEwJLyogdGltZSB0aGUgYnVzIG11c3QgZnJlZSBhZnRlciBUeCAqLworI2VuZGlmCS8qICFJMkNfU0xPV19USU1JTkcgKi8KKworI2RlZmluZSBOUzJCQ0xLKHgpCSgoKHgpKjEyNSkvMTAwMDApCisKKy8qCisgKiBJMkMgV2lyZSBPcGVyYXRpb25zCisgKgorICogQWJvdXQgSTJDX0NMS19MT1coKToKKyAqCisgKiBUaGUgRGF0YSBEaXJlY3Rpb24gYml0IChJMkNfREFUQV9ESVIpIGhhcyB0byBiZSBzZXQgdG8gaW5wdXQgd2hlbiBzZXR0aW5nCisgKiBjbG9jayB0byBsb3csIHRvIHByZXZlbnQgdGhlIEFTSUMgYW5kIHRoZSBJMkMgZGF0YSBjbGllbnQgZnJvbSBkcml2aW5nIHRoZQorICogc2VyaWFsIGRhdGEgbGluZSBzaW11bHRhbmVvdXNseSAoQVNJQzogbGFzdCBiaXQgb2YgYSBieXRlID0gJzEnLCBJMkMgY2xpZW50CisgKiBzZW5kIGFuICdBQ0snKS4gU2VlIGFsc28gQ29uY2VudHJhdG9yIEJ1Z3JlcG9ydCBOby4gMTAxOTIuCisgKi8KKyNkZWZpbmUgSTJDX0RBVEFfSElHSChJb0MpCVNLX0kyQ19TRVRfQklUKElvQywgSTJDX0RBVEEpCisjZGVmaW5lCUkyQ19EQVRBX0xPVyhJb0MpCVNLX0kyQ19DTFJfQklUKElvQywgSTJDX0RBVEEpCisjZGVmaW5lCUkyQ19EQVRBX09VVChJb0MpCVNLX0kyQ19TRVRfQklUKElvQywgSTJDX0RBVEFfRElSKQorI2RlZmluZQlJMkNfREFUQV9JTihJb0MpCVNLX0kyQ19DTFJfQklUKElvQywgSTJDX0RBVEFfRElSIHwgSTJDX0RBVEEpCisjZGVmaW5lCUkyQ19DTEtfSElHSChJb0MpCVNLX0kyQ19TRVRfQklUKElvQywgSTJDX0NMSykKKyNkZWZpbmUJSTJDX0NMS19MT1coSW9DKQlTS19JMkNfQ0xSX0JJVChJb0MsIEkyQ19DTEsgfCBJMkNfREFUQV9ESVIpCisjZGVmaW5lCUkyQ19TVEFSVF9DT05EKElvQykJU0tfSTJDX0NMUl9CSVQoSW9DLCBJMkNfQ0xLKQorCisjZGVmaW5lIE5TMkNMS1QoeCkJKCh4KjEyNUwpLzEwMDAwKQorCisvKi0tLS0tLS0tLS0tLS0tLSBJMkMgSW50ZXJmYWNlIFJlZ2lzdGVyIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHNlbmRpbmcgb25lIGJpdAorICovCit2b2lkIFNrSTJjU25kQml0KAorU0tfSU9DCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX1U4CUJpdCkJLyogQml0IHRvIHNlbmQgKi8KK3sKKwlJMkNfREFUQV9PVVQoSW9DKTsKKwlpZiAoQml0KSB7CisJCUkyQ19EQVRBX0hJR0goSW9DKTsKKwl9CisJZWxzZSB7CisJCUkyQ19EQVRBX0xPVyhJb0MpOworCX0KKwlTa0RnV2FpdFRpbWUoSW9DLCBOUzJCQ0xLKFRfREFUQV9JTl9TRVRVUCkpOworCUkyQ19DTEtfSElHSChJb0MpOworCVNrRGdXYWl0VGltZShJb0MsIE5TMkJDTEsoVF9DTEtfSElHSCkpOworCUkyQ19DTEtfTE9XKElvQyk7Cit9CS8qIFNrSTJjU25kQml0Ki8KKworCisvKgorICogU2lnbmFsIGEgc3RhcnQgdG8gdGhlIEkyQyBCdXMuCisgKgorICogQSBzdGFydCBpcyBzaWduYWxlZCB3aGVuIGRhdGEgZ29lcyB0byBsb3cgaW4gYSBoaWdoIGNsb2NrIGN5Y2xlLgorICoKKyAqIEVuZHMgd2l0aCBDbG9jayBMb3cuCisgKgorICogU3RhdHVzOiBub3QgdGVzdGVkCisgKi8KK3ZvaWQgU2tJMmNTdGFydCgKK1NLX0lPQwlJb0MpCS8qIEkvTyBDb250ZXh0ICovCit7CisJLyogSW5pdCBkYXRhIGFuZCBDbG9jayB0byBvdXRwdXQgbGluZXMgKi8KKwkvKiBTZXQgRGF0YSBoaWdoICovCisJSTJDX0RBVEFfT1VUKElvQyk7CisJSTJDX0RBVEFfSElHSChJb0MpOworCS8qIFNldCBDbG9jayBoaWdoICovCisJSTJDX0NMS19ISUdIKElvQyk7CisKKwlTa0RnV2FpdFRpbWUoSW9DLCBOUzJCQ0xLKFRfU1RBUlRfU0VUVVApKTsKKworCS8qIFNldCBEYXRhIExvdyAqLworCUkyQ19EQVRBX0xPVyhJb0MpOworCisJU2tEZ1dhaXRUaW1lKElvQywgTlMyQkNMSyhUX1NUQVJUX0hPTEQpKTsKKworCS8qIENsb2NrIGxvdyB3aXRob3V0IERhdGEgdG8gSW5wdXQgKi8KKwlJMkNfU1RBUlRfQ09ORChJb0MpOworCisJU2tEZ1dhaXRUaW1lKElvQywgTlMyQkNMSyhUX0NMS19MT1cpKTsKK30JLyogU2tJMmNTdGFydCAqLworCisKK3ZvaWQgU2tJMmNTdG9wKAorU0tfSU9DCUlvQykJLyogSS9PIENvbnRleHQgKi8KK3sKKwkvKiBJbml0IGRhdGEgYW5kIENsb2NrIHRvIG91dHB1dCBsaW5lcyAqLworCS8qIFNldCBEYXRhIGxvdyAqLworCUkyQ19EQVRBX09VVChJb0MpOworCUkyQ19EQVRBX0xPVyhJb0MpOworCisJU2tEZ1dhaXRUaW1lKElvQywgTlMyQkNMSyhUX0NMS18yX0RBVEFfT1VUKSk7CisKKwkvKiBTZXQgQ2xvY2sgaGlnaCAqLworCUkyQ19DTEtfSElHSChJb0MpOworCisJU2tEZ1dhaXRUaW1lKElvQywgTlMyQkNMSyhUX1NUT1BfU0VUVVApKTsKKworCS8qCisJICogU2V0IERhdGEgSGlnaDoJRG8gaXQgYnkgc2V0dGluZyB0aGUgRGF0YSBMaW5lIHRvIElucHV0LgorCSAqCQkJQmVjYXVzZSBvZiBhIHB1bGwgdXAgcmVzaXN0b3IgdGhlIERhdGEgTGluZQorCSAqCQkJZmxvb2RzIHRvIGhpZ2guCisJICovCisJSTJDX0RBVEFfSU4oSW9DKTsKKworCS8qCisJICoJV2hlbiBJMkMgYWN0aXZpdHkgaXMgc3RvcHBlZAorCSAqCSBvCURBVEEgc2hvdWxkIGJlIHNldCB0byBpbnB1dCBhbmQKKwkgKgkgbwlDTE9DSyBzaG91bGQgYmUgc2V0IHRvIGhpZ2ghCisJICovCisJU2tEZ1dhaXRUaW1lKElvQywgTlMyQkNMSyhUX0JVU19JRExFKSk7Cit9CS8qIFNrSTJjU3RvcCAqLworCisKKy8qCisgKiBSZWNlaXZlIGp1c3Qgb25lIGJpdCB2aWEgdGhlIEkyQyBidXMuCisgKgorICogTm90ZToJQ2xvY2sgbXVzdCBiZSBzZXQgdG8gTE9XIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKgorICogUmV0dXJucyBUaGUgcmVjZWl2ZWQgYml0LgorICovCitpbnQgU2tJMmNSY3ZCaXQoCitTS19JT0MJSW9DKQkvKiBJL08gQ29udGV4dCAqLworeworCWludAlCaXQ7CisJU0tfVTgJSTJjU3dDdHJsOworCisJLyogSW5pdCBkYXRhIGFzIGlucHV0IGxpbmUgKi8KKwlJMkNfREFUQV9JTihJb0MpOworCisJU2tEZ1dhaXRUaW1lKElvQywgTlMyQkNMSyhUX0NMS18yX0RBVEFfT1VUKSk7CisKKwlJMkNfQ0xLX0hJR0goSW9DKTsKKworCVNrRGdXYWl0VGltZShJb0MsIE5TMkJDTEsoVF9DTEtfSElHSCkpOworCisJU0tfSTJDX0dFVF9TVyhJb0MsICZJMmNTd0N0cmwpOworCQorCUJpdCA9IChJMmNTd0N0cmwgJiBJMkNfREFUQSkgPyAxIDogMDsKKworCUkyQ19DTEtfTE9XKElvQyk7CisJU2tEZ1dhaXRUaW1lKElvQywgTlMyQkNMSyhUX0NMS19MT1ctVF9DTEtfMl9EQVRBX09VVCkpOworCisJcmV0dXJuKEJpdCk7Cit9CS8qIFNrSTJjUmN2Qml0ICovCisKKworLyoKKyAqIFJlY2VpdmUgYW4gQUNLLgorICoKKyAqIHJldHVybnMJMCBJZiBhY2tub3dsZWRnZWQKKyAqCQkxIGluIGNhc2Ugb2YgYW4gZXJyb3IKKyAqLworaW50IFNrSTJjUmN2QWNrKAorU0tfSU9DCUlvQykJLyogSS9PIENvbnRleHQgKi8KK3sKKwkvKgorCSAqIFJlY2VpdmVkIGJpdCBtdXN0IGJlIHplcm8uCisJICovCisJcmV0dXJuKFNrSTJjUmN2Qml0KElvQykgIT0gMCk7Cit9CS8qIFNrSTJjUmN2QWNrICovCisKKworLyoKKyAqIFNlbmQgYW4gTkFDSy4KKyAqLwordm9pZCBTa0kyY1NuZE5BY2soCitTS19JT0MJSW9DKQkvKiBJL08gQ29udGV4dCAqLworeworCS8qCisJICogUmVjZWl2ZWQgYml0IG11c3QgYmUgemVyby4KKwkgKi8KKwlTa0kyY1NuZEJpdChJb0MsIDEpOworfQkvKiBTa0kyY1NuZE5BY2sgKi8KKworCisvKgorICogU2VuZCBhbiBBQ0suCisgKi8KK3ZvaWQgU2tJMmNTbmRBY2soCitTS19JT0MgSW9DKQkvKiBJL08gQ29udGV4dCAqLworeworCS8qCisJICogUmVjZWl2ZWQgYml0IG11c3QgYmUgemVyby4KKwkgKi8KKwlTa0kyY1NuZEJpdChJb0MsIDApOworfQkvKiBTa0kyY1NuZEFjayAqLworCisKKy8qCisgKiBTZW5kIG9uZSBieXRlIHRvIHRoZSBJMkMgZGV2aWNlIGFuZCB3YWl0IGZvciBBQ0suCisgKgorICogUmV0dXJuIGFja25vd2xlZ2VkIHN0YXR1cy4KKyAqLworaW50IFNrSTJjU25kQnl0ZSgKK1NLX0lPQwlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitpbnQJCUJ5dGUpCS8qIGJ5dGUgdG8gc2VuZCAqLworeworCWludAlpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlpZiAoQnl0ZSAmICgxPDwoNy1pKSkpIHsKKwkJCVNrSTJjU25kQml0KElvQywgMSk7CisJCX0KKwkJZWxzZSB7CisJCQlTa0kyY1NuZEJpdChJb0MsIDApOworCQl9CisJfQorCisJcmV0dXJuKFNrSTJjUmN2QWNrKElvQykpOworfQkvKiBTa0kyY1NuZEJ5dGUgKi8KKworCisvKgorICogUmVjZWl2ZSBvbmUgYnl0ZSBhbmQgYWNrIGl0LgorICoKKyAqIFJldHVybiBieXRlLgorICovCitpbnQgU2tJMmNSY3ZCeXRlKAorU0tfSU9DCUlvQywJLyogSS9PIENvbnRleHQgKi8KK2ludAkJTGFzdCkJLyogTGFzdCBCeXRlIEZsYWcgKi8KK3sKKwlpbnQJaTsKKwlpbnQJQnl0ZSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCUJ5dGUgPDw9IDE7CisJCUJ5dGUgfD0gU2tJMmNSY3ZCaXQoSW9DKTsKKwl9CisKKwlpZiAoTGFzdCkgeworCQlTa0kyY1NuZE5BY2soSW9DKTsKKwl9CisJZWxzZSB7CisJCVNrSTJjU25kQWNrKElvQyk7CisJfQorCisJcmV0dXJuKEJ5dGUpOworfQkvKiBTa0kyY1JjdkJ5dGUgKi8KKworCisvKgorICogU3RhcnQgZGlhbG9nIGFuZCBzZW5kIGRldmljZSBhZGRyZXNzCisgKgorICogUmV0dXJuIDAgaWYgYWNrbm93bGVnZWQsIDEgaW4gY2FzZSBvZiBhbiBlcnJvcgorICovCitpbnQJU2tJMmNTbmREZXYoCitTS19JT0MJSW9DLAkvKiBJL08gQ29udGV4dCAqLworaW50CQlBZGRyLAkvKiBEZXZpY2UgQWRkcmVzcyAqLworaW50CQlSdykJCS8qIFJlYWQgLyBXcml0ZSBGbGFnICovCit7CisJU2tJMmNTdGFydChJb0MpOworCVJ3ID0gflJ3OworCVJ3ICY9IEkyQ19XUklURTsKKwlyZXR1cm4oU2tJMmNTbmRCeXRlKElvQywgKEFkZHI8PDEpIHwgUncpKTsKK30JLyogU2tJMmNTbmREZXYgKi8KKworI2VuZGlmIC8qIFNLX0RJQUcgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLSBJMkMgQ1RSTCBSZWdpc3RlciBGdW5jdGlvbnMgLS0tLS0tLS0tLSovCisKKy8qCisgKiB3YWl0cyBmb3IgYSBjb21wbGV0aW9uIG9mIGFuIEkyQyB0cmFuc2ZlcgorICoKKyAqIHJldHVybnMJMDoJc3VjY2VzcywgdHJhbnNmZXIgY29tcGxldGVzCisgKgkJCTE6CWVycm9yLAkgdHJhbnNmZXIgZG9lcyBub3QgY29tcGxldGUsIEkyQyB0cmFuc2ZlcgorICoJCQkJCQkga2lsbGVkLCB3YWl0IGxvb3AgdGVybWluYXRlZC4KKyAqLworaW50CVNrSTJjV2FpdCgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSS9PIENvbnRleHQgKi8KK2ludAkJRXZlbnQpCS8qIGNvbXBsZXRlIGV2ZW50IHRvIHdhaXQgZm9yIChJMkNfUkVBRCBvciBJMkNfV1JJVEUpICovCit7CisJU0tfVTY0CVN0YXJ0VGltZTsKKwlTS19VNjQJQ3VycmVudFRpbWU7CisJU0tfVTMyCUkyY0N0cmw7CisKKwlTdGFydFRpbWUgPSBTa09zR2V0VGltZShwQUMpOworCQorCWRvIHsKKwkJQ3VycmVudFRpbWUgPSBTa09zR2V0VGltZShwQUMpOworCisJCWlmIChDdXJyZW50VGltZSAtIFN0YXJ0VGltZSA+IFNLX1RJQ0tTX1BFUl9TRUMgLyA4KSB7CisJCQkKKwkJCVNLX0kyQ19TVE9QKElvQyk7CisjaWZuZGVmIFNLX0RJQUcKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfSTJDX0UwMDIsIFNLRVJSX0kyQ19FMDAyTVNHKTsKKyNlbmRpZiAvKiAhU0tfRElBRyAqLworCQkJcmV0dXJuKDEpOworCQl9CisJCQorCQlTS19JMkNfR0VUX0NUTChJb0MsICZJMmNDdHJsKTsKKworI2lmZGVmIHhZVUtPTl9EQkcKKwkJcHJpbnRmKCJTdGFydFRpbWU9JWx1LCBDdXJyZW50VGltZT0lbHVcbiIsCisJCQlTdGFydFRpbWUsIEN1cnJlbnRUaW1lKTsKKwkJaWYgKGtiaGl0KCkpIHsKKwkJCXJldHVybigxKTsKKwkJfQorI2VuZGlmIC8qIFlVS09OX0RCRyAqLworCQorCX0gd2hpbGUgKChJMmNDdHJsICYgSTJDX0ZMQUcpID09IChTS19VMzIpRXZlbnQgPDwgMzEpOworCisJcmV0dXJuKDApOworfQkvKiBTa0kyY1dhaXQgKi8KKworCisvKgorICogd2FpdHMgZm9yIGEgY29tcGxldGlvbiBvZiBhbiBJMkMgdHJhbnNmZXIKKyAqCisgKiBSZXR1cm5zCisgKglOb3RoaW5nCisgKi8KK3ZvaWQgU2tJMmNXYWl0SXJxKAorU0tfQUMJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DKQkvKiBJL08gQ29udGV4dCAqLworeworCVNLX1NFTlNPUgkqcFNlbjsKKwlTS19VNjQJCVN0YXJ0VGltZTsKKwlTS19VMzIJCUlycVNyYzsKKworCXBTZW4gPSAmcEFDLT5JMmMuU2VuVGFibGVbcEFDLT5JMmMuQ3VyclNlbnNdOworCisJaWYgKHBTZW4tPlNlblN0YXRlID09IFNLX1NFTl9JRExFKSB7CisJCXJldHVybjsKKwl9CisKKwlTdGFydFRpbWUgPSBTa09zR2V0VGltZShwQUMpOworCQorCWRvIHsKKwkJaWYgKFNrT3NHZXRUaW1lKHBBQykgLSBTdGFydFRpbWUgPiBTS19USUNLU19QRVJfU0VDIC8gOCkgeworCQkJCisJCQlTS19JMkNfU1RPUChJb0MpOworI2lmbmRlZiBTS19ESUFHCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0kyQ19FMDE2LCBTS0VSUl9JMkNfRTAxNk1TRyk7CisjZW5kaWYgLyogIVNLX0RJQUcgKi8KKwkJCXJldHVybjsKKwkJfQorCQkKKwkJU0tfSU4zMihJb0MsIEIwX0lTUkMsICZJcnFTcmMpOworCisJfSB3aGlsZSAoKElycVNyYyAmIElTX0kyQ19SRUFEWSkgPT0gMCk7CisKKwlwU2VuLT5TZW5TdGF0ZSA9IFNLX1NFTl9JRExFOworCXJldHVybjsKK30JLyogU2tJMmNXYWl0SXJxICovCisKKy8qCisgKiB3cml0ZXMgYSBzaW5nbGUgYnl0ZSBvciA0IGJ5dGVzIGludG8gdGhlIEkyQyBkZXZpY2UKKyAqCisgKiByZXR1cm5zCTA6CXN1Y2Nlc3MKKyAqCQkJMToJZXJyb3IKKyAqLworaW50IFNrSTJjV3JpdGUoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSS9PIENvbnRleHQgKi8KK1NLX1UzMglJMmNEYXRhLAkvKiBJMkMgRGF0YSB0byB3cml0ZSAqLworaW50CQlJMmNEZXYsCQkvKiBJMkMgRGV2aWNlIEFkZHJlc3MgKi8KK2ludAkJSTJjRGV2U2l6ZSwgLyogSTJDIERldmljZSBTaXplIChlLmcuIEkyQ18wMjVLX0RFViBvciBJMkNfMktfREVWKSAqLworaW50CQlJMmNSZWcsCQkvKiBJMkMgRGV2aWNlIFJlZ2lzdGVyIEFkZHJlc3MgKi8KK2ludAkJSTJjQnVyc3QpCS8qIEkyQyBCdXJzdCBGbGFnICovCit7CisJU0tfT1VUMzIoSW9DLCBCMl9JMkNfREFUQSwgSTJjRGF0YSk7CisJCisJU0tfSTJDX0NUTChJb0MsIEkyQ19XUklURSwgSTJjRGV2LCBJMmNEZXZTaXplLCBJMmNSZWcsIEkyY0J1cnN0KTsKKwkKKwlyZXR1cm4oU2tJMmNXYWl0KHBBQywgSW9DLCBJMkNfV1JJVEUpKTsKK30JLyogU2tJMmNXcml0ZSovCisKKworI2lmZGVmCVNLX0RJQUcKKy8qCisgKiByZWFkcyBhIHNpbmdsZSBieXRlIG9yIDQgYnl0ZXMgZnJvbSB0aGUgSTJDIGRldmljZQorICoKKyAqIHJldHVybnMJdGhlIHdvcmQgcmVhZAorICovCitTS19VMzIgU2tJMmNSZWFkKAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIEkvTyBDb250ZXh0ICovCitpbnQJCUkyY0RldiwJCS8qIEkyQyBEZXZpY2UgQWRkcmVzcyAqLworaW50CQlJMmNEZXZTaXplLCAvKiBJMkMgRGV2aWNlIFNpemUgKGUuZy4gSTJDXzAyNUtfREVWIG9yIEkyQ18yS19ERVYpICovCitpbnQJCUkyY1JlZywJCS8qIEkyQyBEZXZpY2UgUmVnaXN0ZXIgQWRkcmVzcyAqLworaW50CQlJMmNCdXJzdCkJLyogSTJDIEJ1cnN0IEZsYWcgKi8KK3sKKwlTS19VMzIJRGF0YTsKKworCVNLX09VVDMyKElvQywgQjJfSTJDX0RBVEEsIDApOworCVNLX0kyQ19DVEwoSW9DLCBJMkNfUkVBRCwgSTJjRGV2LCBJMmNEZXZTaXplLCBJMmNSZWcsIEkyY0J1cnN0KTsKKwkKKwlpZiAoU2tJMmNXYWl0KHBBQywgSW9DLCBJMkNfUkVBRCkgIT0gMCkgeworCQl3X3ByaW50KCIlc1xuIiwgU0tFUlJfSTJDX0UwMDJNU0cpOworCX0KKwkKKwlTS19JTjMyKElvQywgQjJfSTJDX0RBVEEsICZEYXRhKTsKKwkKKwlyZXR1cm4oRGF0YSk7Cit9CS8qIFNrSTJjUmVhZCAqLworI2VuZGlmIC8qIFNLX0RJQUcgKi8KKworCisvKgorICogcmVhZCBhIHNlbnNvcidzIHZhbHVlCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyBhIHNlbnNvcidzIHZhbHVlIGZyb20gdGhlIEkyQyBzZW5zb3IgY2hpcC4gVGhlIHNlbnNvcgorICogaXMgZGVmaW5lZCBieSBpdHMgaW5kZXggaW50byB0aGUgc2Vuc29ycyBkYXRhYmFzZSBpbiB0aGUgc3RydWN0IHBBQyBwb2ludHMKKyAqIHRvLgorICogUmV0dXJucworICoJCTEgaWYgdGhlIHJlYWQgaXMgY29tcGxldGVkCisgKgkJMCBpZiB0aGUgcmVhZCBtdXN0IGJlIGNvbnRpbnVlZCAoSTJDIEJ1cyBzdGlsbCBhbGxvY2F0ZWQpCisgKi8KK2ludAlTa0kyY1JlYWRTZW5zb3IoCitTS19BQwkJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX1NFTlNPUgkqcFNlbikJLyogU2Vuc29yIHRvIGJlIHJlYWQgKi8KK3sKKyAgICBpZiAocFNlbi0+U2VuUmVhZCAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybigoKnBTZW4tPlNlblJlYWQpKHBBQywgSW9DLCBwU2VuKSk7CisgICAgfQorCWVsc2UgeworICAgICAgICByZXR1cm4oMCk7IC8qIG5vIHN1Y2Nlc3MgKi8KKwl9Cit9CS8qIFNrSTJjUmVhZFNlbnNvciAqLworCisvKgorICogRG8gdGhlIEluaXQgc3RhdGUgMCBpbml0aWFsaXphdGlvbgorICovCitzdGF0aWMgaW50IFNrSTJjSW5pdDAoCitTS19BQwkqcEFDKQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK3sKKwlpbnQJaTsKKworCS8qIEJlZ2luIHdpdGggZmlyc3Qgc2Vuc29yICovCisJcEFDLT5JMmMuQ3VyclNlbnMgPSAwOworCQorCS8qIEJlZ2luIHdpdGggdGltZW91dCBjb250cm9sIGZvciBzdGF0ZSBtYWNoaW5lICovCisJcEFDLT5JMmMuVGltZXJNb2RlID0gU0tfVElNRVJfV0FUQ0hfU007CisJCisJLyogU2V0IHNlbnNvciBudW1iZXIgdG8gemVybyAqLworCXBBQy0+STJjLk1heFNlbnMgPSAwOworCisjaWZuZGVmIFNLX0RJQUcKKwkvKiBJbml0aWFsaXplIE51bWJlciBvZiBEdW1teSBSZWFkcyAqLworCXBBQy0+STJjLkR1bW15UmVhZHMgPSBTS19NQVhfU0VOU09SUzsKKyNlbmRpZgorCisJZm9yIChpID0gMDsgaSA8IFNLX01BWF9TRU5TT1JTOyBpKyspIHsKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRGVzYyA9ICJ1bmtub3duIjsKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVHlwZSA9IFNLX1NFTl9VTktOT1dOOworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJySGlnaCA9IDA7CisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJMb3cgPSAwOworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkhpZ2ggPSAwOworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkxvdyA9IDA7CisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblJlZyA9IExNODBfRkFOMl9JTjsKKwkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuSW5pdCA9IFNLX1NFTl9EWU5fSU5JVF9OT05FOworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5WYWx1ZSA9IDA7CisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkVyckZsYWcgPSBTS19TRU5fRVJSX05PVF9QUkVTRU5UOworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5FcnJDdHMgPSAwOworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5CZWdFcnJUUyA9IDA7CisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblN0YXRlID0gU0tfU0VOX0lETEU7CisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblJlYWQgPSBOVUxMOworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5EZXYgPSAwOworCX0KKworCS8qIE5vdyB3ZSBhcmUgIklOSVQgZGF0YSJlZCAqLworCXBBQy0+STJjLkluaXRMZXZlbCA9IFNLX0lOSVRfREFUQTsKKwlyZXR1cm4oMCk7Cit9CS8qIFNrSTJjSW5pdDAqLworCisKKy8qCisgKiBEbyB0aGUgaW5pdCBzdGF0ZSAxIGluaXRpYWxpemF0aW9uCisgKgorICogaW5pdGlhbGl6ZSB0aGUgZm9sbG93aW5nIHJlZ2lzdGVyIG9mIHRoZSBMTTgwOgorICogQ29uZmlndXJhdGlvbiByZWdpc3RlcjoKKyAqIC0gU1RBUlQsIG5vSU5ULCBhY3RpdmVMT1csIG5vSU5UI0NsZWFyLCBub1JFU0VULCBub0NJLCBub0dQTyMsIG5vSU5JVAorICoKKyAqIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyIDE6CisgKiAtIGFsbCBpbnRlcnJ1cHRzIGFyZSBEaXNhYmxlZCAoMHhmZikKKyAqCisgKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAyOgorICogLSBhbGwgaW50ZXJydXB0cyBhcmUgRGlzYWJsZWQgKDB4ZmYpIEludGVycnVwdCBtb2RpIGRvZXNuJ3QgbWF0dGVyLgorICoKKyAqIEZhbiBEaXZpc29yL1JTVF9PVVQgcmVnaXN0ZXI6CisgKiAtIERpdmlzb3JzIHNldCB0byAxIChiaXRzIDAwKSwgYWxsIG90aGVycyAwcy4KKyAqCisgKiBPUyMgQ29uZmlndXJhdGlvbi9UZW1wZXJhdHVyZSByZXNvbHV0aW9uIFJlZ2lzdGVyOgorICogLSBhbGwgMHMKKyAqCisgKi8KK3N0YXRpYyBpbnQgU2tJMmNJbml0MSgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQykJLyogSS9PIENvbnRleHQgKi8KK3sKKyAgICBpbnQgaTsKKyAgICBTS19VOCBJMmNTd0N0cmw7CisJU0tfR0VQT1JUICpwUHJ0OwkvKiBHSW5pIFBvcnQgc3RydWN0IHBvaW50ZXIgKi8KKworCWlmIChwQUMtPkkyYy5Jbml0TGV2ZWwgIT0gU0tfSU5JVF9EQVRBKSB7CisJCS8qIFJlSW5pdCBub3QgbmVlZGVkIGluIEkyQyBtb2R1bGUgKi8KKwkJcmV0dXJuKDApOworCX0KKworICAgIC8qIFNldCB0aGUgRGlyZWN0aW9uIG9mIEkyQy1EYXRhIFBpbiB0byBJTiAqLworICAgIFNLX0kyQ19DTFJfQklUKElvQywgSTJDX0RBVEFfRElSIHwgSTJDX0RBVEEpOworICAgIC8qIENoZWNrIGZvciAzMi1CaXQgWXVrb24gd2l0aCBMb3cgYXQgSTJDLURhdGEgUGluICovCisJU0tfSTJDX0dFVF9TVyhJb0MsICZJMmNTd0N0cmwpOworCisJaWYgKChJMmNTd0N0cmwgJiBJMkNfREFUQSkgPT0gMCkgeworCQkvKiB0aGlzIGlzIGEgMzItQml0IGJvYXJkICovCisJCXBBQy0+R0luaS5HSVl1a29uMzJCaXQgPSBTS19UUlVFOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorCisJLyogQ2hlY2sgZm9yIDY0IEJpdCBZdWtvbiB3aXRob3V0IHNlbnNvcnMgKi8KKwlpZiAoU2tJMmNXcml0ZShwQUMsIElvQywgMCwgTE04MF9BRERSLCBJMkNfMDI1S19ERVYsIExNODBfQ0ZHLCAwKSAhPSAwKSB7CisgICAgICAgIHJldHVybigwKTsKKyAgICB9CisKKwkodm9pZClTa0kyY1dyaXRlKHBBQywgSW9DLCAweGZmVUwsIExNODBfQUREUiwgSTJDXzAyNUtfREVWLCBMTTgwX0lNU0tfMSwgMCk7CisJCisJKHZvaWQpU2tJMmNXcml0ZShwQUMsIElvQywgMHhmZlVMLCBMTTgwX0FERFIsIEkyQ18wMjVLX0RFViwgTE04MF9JTVNLXzIsIDApOworCQorCSh2b2lkKVNrSTJjV3JpdGUocEFDLCBJb0MsIDAsIExNODBfQUREUiwgSTJDXzAyNUtfREVWLCBMTTgwX0ZBTl9DVFJMLCAwKTsKKwkKKwkodm9pZClTa0kyY1dyaXRlKHBBQywgSW9DLCAwLCBMTTgwX0FERFIsIEkyQ18wMjVLX0RFViwgTE04MF9URU1QX0NUUkwsIDApOworCQorCSh2b2lkKVNrSTJjV3JpdGUocEFDLCBJb0MsIChTS19VMzIpTE04MF9DRkdfU1RBUlQsIExNODBfQUREUiwgSTJDXzAyNUtfREVWLAorCQlMTTgwX0NGRywgMCk7CisJCisJLyoKKwkgKiBNYXhTZW5zIGhhcyB0byBiZSB1cGRhdGVkIGhlcmUsIGJlY2F1c2UgUGh5VHlwZSBpcyBub3QKKwkgKiBzZXQgd2hlbiBwZXJmb3JtaW5nIEluaXQgTGV2ZWwgMAorCSAqLworICAgIHBBQy0+STJjLk1heFNlbnMgPSA1OworCQorCXBQcnQgPSAmcEFDLT5HSW5pLkdQWzBdOworCQorCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCWlmIChwUHJ0LT5QaHlUeXBlID09IFNLX1BIWV9CQ09NKSB7CisJCQlpZiAocEFDLT5HSW5pLkdJTWFjc0ZvdW5kID09IDEpIHsKKwkJCQlwQUMtPkkyYy5NYXhTZW5zICs9IDE7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwQUMtPkkyYy5NYXhTZW5zICs9IDM7CisJCQl9CisJCX0KKwl9CisJZWxzZSB7CisJCXBBQy0+STJjLk1heFNlbnMgKz0gMzsKKwl9CisJCisJZm9yIChpID0gMDsgaSA8IHBBQy0+STJjLk1heFNlbnM7IGkrKykgeworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSAwOgorCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRGVzYyA9ICJUZW1wZXJhdHVyZSI7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UeXBlID0gU0tfU0VOX1RFTVA7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJySGlnaCA9IFNLX1NFTl9URU1QX0hJR0hfRVJSOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5IaWdoID0gU0tfU0VOX1RFTVBfSElHSF9XQVJOOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5Mb3cgPSBTS19TRU5fVEVNUF9MT1dfV0FSTjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJMb3cgPSBTS19TRU5fVEVNUF9MT1dfRVJSOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuUmVnID0gTE04MF9URU1QX0lOOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkRlc2MgPSAiVm9sdGFnZSBQQ0kiOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVHlwZSA9IFNLX1NFTl9WT0xUOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckhpZ2ggPSBTS19TRU5fUENJXzVWX0hJR0hfRVJSOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5IaWdoID0gU0tfU0VOX1BDSV81Vl9ISUdIX1dBUk47CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkxvdyA9IFNLX1NFTl9QQ0lfNVZfTE9XX1dBUk47CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJyTG93ID0gU0tfU0VOX1BDSV81Vl9MT1dfRVJSOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuUmVnID0gTE04MF9WVDBfSU47CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRGVzYyA9ICJWb2x0YWdlIFBDSS1JTyI7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UeXBlID0gU0tfU0VOX1ZPTFQ7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJySGlnaCA9IFNLX1NFTl9QQ0lfSU9fNVZfSElHSF9FUlI7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkhpZ2ggPSBTS19TRU5fUENJX0lPXzVWX0hJR0hfV0FSTjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuTG93ID0gU0tfU0VOX1BDSV9JT18zVjNfTE9XX1dBUk47CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJyTG93ID0gU0tfU0VOX1BDSV9JT18zVjNfTE9XX0VSUjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblJlZyA9IExNODBfVlQxX0lOOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuSW5pdCA9IFNLX1NFTl9EWU5fSU5JVF9QQ0lfSU87CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRGVzYyA9ICJWb2x0YWdlIEFTSUMiOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVHlwZSA9IFNLX1NFTl9WT0xUOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckhpZ2ggPSBTS19TRU5fVkREX0hJR0hfRVJSOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5IaWdoID0gU0tfU0VOX1ZERF9ISUdIX1dBUk47CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkxvdyA9IFNLX1NFTl9WRERfTE9XX1dBUk47CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJyTG93ID0gU0tfU0VOX1ZERF9MT1dfRVJSOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuUmVnID0gTE04MF9WVDJfSU47CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCQlpZiAocFBydC0+UGh5VHlwZSA9PSBTS19QSFlfQkNPTSkgeworCQkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5EZXNjID0gIlZvbHRhZ2UgUEhZIEEgUExMIjsKKwkJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckhpZ2ggPSBTS19TRU5fUExMXzNWM19ISUdIX0VSUjsKKwkJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5IaWdoID0gU0tfU0VOX1BMTF8zVjNfSElHSF9XQVJOOworCQkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkxvdyA9IFNLX1NFTl9QTExfM1YzX0xPV19XQVJOOworCQkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJyTG93ID0gU0tfU0VOX1BMTF8zVjNfTE9XX0VSUjsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkRlc2MgPSAiVm9sdGFnZSBQTUEiOworCQkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJySGlnaCA9IFNLX1NFTl9QTExfM1YzX0hJR0hfRVJSOworCQkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkhpZ2ggPSBTS19TRU5fUExMXzNWM19ISUdIX1dBUk47CisJCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuTG93ID0gU0tfU0VOX1BMTF8zVjNfTE9XX1dBUk47CisJCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJMb3cgPSBTS19TRU5fUExMXzNWM19MT1dfRVJSOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkRlc2MgPSAiVm9sdGFnZSBWQVVYIjsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJySGlnaCA9IFNLX1NFTl9WQVVYXzNWM19ISUdIX0VSUjsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkhpZ2ggPSBTS19TRU5fVkFVWF8zVjNfSElHSF9XQVJOOworCQkJCWlmIChwQUMtPkdJbmkuR0lWYXV4QXZhaWwpIHsKKwkJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5Mb3cgPSBTS19TRU5fVkFVWF8zVjNfTE9XX1dBUk47CisJCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJMb3cgPSBTS19TRU5fVkFVWF8zVjNfTE9XX0VSUjsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJMb3cgPSBTS19TRU5fVkFVWF8wVl9XQVJOX0VSUjsKKwkJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5Mb3cgPSBTS19TRU5fVkFVWF8wVl9XQVJOX0VSUjsKKwkJCQl9CisJCQl9CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UeXBlID0gU0tfU0VOX1ZPTFQ7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5SZWcgPSBMTTgwX1ZUM19JTjsKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkRlc2MgPSAiVm9sdGFnZSBQSFkgMlY1IjsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJySGlnaCA9IFNLX1NFTl9QSFlfMlY1X0hJR0hfRVJSOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuSGlnaCA9IFNLX1NFTl9QSFlfMlY1X0hJR0hfV0FSTjsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkxvdyA9IFNLX1NFTl9QSFlfMlY1X0xPV19XQVJOOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJMb3cgPSBTS19TRU5fUEhZXzJWNV9MT1dfRVJSOworCQkJfQorCQkJZWxzZSB7CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRGVzYyA9ICJWb2x0YWdlIENvcmUgMVY1IjsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJySGlnaCA9IFNLX1NFTl9DT1JFXzFWNV9ISUdIX0VSUjsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkhpZ2ggPSBTS19TRU5fQ09SRV8xVjVfSElHSF9XQVJOOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuTG93ID0gU0tfU0VOX0NPUkVfMVY1X0xPV19XQVJOOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJMb3cgPSBTS19TRU5fQ09SRV8xVjVfTE9XX0VSUjsKKwkJCX0KKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblR5cGUgPSBTS19TRU5fVk9MVDsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblJlZyA9IExNODBfVlQ0X0lOOworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRGVzYyA9ICJWb2x0YWdlIFBIWSBCIFBMTCI7CisJCQl9CisJCQllbHNlIHsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5EZXNjID0gIlZvbHRhZ2UgUEhZIDNWMyI7CisJCQl9CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UeXBlID0gU0tfU0VOX1ZPTFQ7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJySGlnaCA9IFNLX1NFTl9QTExfM1YzX0hJR0hfRVJSOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5IaWdoID0gU0tfU0VOX1BMTF8zVjNfSElHSF9XQVJOOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5Mb3cgPSBTS19TRU5fUExMXzNWM19MT1dfV0FSTjsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVFcnJMb3cgPSBTS19TRU5fUExMXzNWM19MT1dfRVJSOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuUmVnID0gTE04MF9WVDVfSU47CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQkJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5EZXNjID0gIlNwZWVkIEZhbiI7CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVHlwZSA9IFNLX1NFTl9GQU47CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckhpZ2ggPSBTS19TRU5fRkFOX0hJR0hfRVJSOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuSGlnaCA9IFNLX1NFTl9GQU5fSElHSF9XQVJOOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblRocmVXYXJuTG93ID0gU0tfU0VOX0ZBTl9MT1dfV0FSTjsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJyTG93ID0gU0tfU0VOX0ZBTl9MT1dfRVJSOworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblJlZyA9IExNODBfRkFOMl9JTjsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkRlc2MgPSAiVm9sdGFnZSBQSFkgMlY1IjsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UeXBlID0gU0tfU0VOX1ZPTFQ7CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZUVyckhpZ2ggPSBTS19TRU5fUEhZXzJWNV9ISUdIX0VSUjsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlV2FybkhpZ2ggPSBTS19TRU5fUEhZXzJWNV9ISUdIX1dBUk47CisJCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVGhyZVdhcm5Mb3cgPSBTS19TRU5fUEhZXzJWNV9MT1dfV0FSTjsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UaHJlRXJyTG93ID0gU0tfU0VOX1BIWV8yVjVfTE9XX0VSUjsKKwkJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5SZWcgPSBMTTgwX1ZUNl9JTjsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0lOSVQgfCBTS19FUlJDTF9TVywKKwkJCQlTS0VSUl9JMkNfRTAwMSwgU0tFUlJfSTJDX0UwMDFNU0cpOworCQkJYnJlYWs7CisJCX0KKworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5WYWx1ZSA9IDA7CisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkVyckZsYWcgPSBTS19TRU5fRVJSX09LOworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5FcnJDdHMgPSAwOworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5CZWdFcnJUUyA9IDA7CisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblN0YXRlID0gU0tfU0VOX0lETEU7CisJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlblJlYWQgPSBTa0xtODBSZWFkU2Vuc29yOworCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5EZXYgPSBMTTgwX0FERFI7CisJfQorCisjaWZuZGVmIFNLX0RJQUcKKwlwQUMtPkkyYy5EdW1teVJlYWRzID0gcEFDLT5JMmMuTWF4U2VuczsKKyNlbmRpZiAvKiAhU0tfRElBRyAqLworCQorCS8qIENsZWFyIEkyQyBJUlEgKi8KKwlTS19PVVQzMihJb0MsIEIyX0kyQ19JUlEsIEkyQ19DTFJfSVJRKTsKKwkKKwkvKiBOb3cgd2UgYXJlIEkvTyBpbml0aWFsaXplZCAqLworCXBBQy0+STJjLkluaXRMZXZlbCA9IFNLX0lOSVRfSU87CisJcmV0dXJuKDApOworfQkvKiBTa0kyY0luaXQxICovCisKKworLyoKKyAqIEluaXQgbGV2ZWwgMjogU3RhcnQgZmlyc3Qgc2Vuc29yIHJlYWQuCisgKi8KK3N0YXRpYyBpbnQgU2tJMmNJbml0MigKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQykJLyogSS9PIENvbnRleHQgKi8KK3sKKwlpbnQJCVJlYWRDb21wbGV0ZTsKKwlTS19TRU5TT1IJKnBTZW47CisKKwlpZiAocEFDLT5JMmMuSW5pdExldmVsICE9IFNLX0lOSVRfSU8pIHsKKwkJLyogUmVJbml0IG5vdCBuZWVkZWQgaW4gSTJDIG1vZHVsZSAqLworCQkvKiBJbml0MCBhbmQgSW5pdDIgbm90IHBlcm1pdHRlZCAqLworCQlyZXR1cm4oMCk7CisJfQorCisJcFNlbiA9ICZwQUMtPkkyYy5TZW5UYWJsZVtwQUMtPkkyYy5DdXJyU2Vuc107CisJUmVhZENvbXBsZXRlID0gU2tJMmNSZWFkU2Vuc29yKHBBQywgSW9DLCBwU2VuKTsKKworCWlmIChSZWFkQ29tcGxldGUpIHsKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0lOSVQsIFNLRVJSX0kyQ19FMDA4LCBTS0VSUl9JMkNfRTAwOE1TRyk7CisJfQorCisJLyogTm93IHdlIGFyZSBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQgKi8KKwlwQUMtPkkyYy5Jbml0TGV2ZWwgPSBTS19JTklUX1JVTjsKKworCXJldHVybigwKTsKK30JLyogU2tJMmNJbml0MiovCisKKworLyoKKyAqIEluaXRpYWxpemUgSTJDIGRldmljZXMKKyAqCisgKiBHZXQgdGhlIGZpcnN0IHZvbHRhZ2UgdmFsdWUgYW5kIGRpc2NhcmQgaXQuCisgKiBHbyBpbnRvIHRlbXBlcmF0dXJlIHJlYWQgbW9kZS4gQSBkZWZhdWx0IHBvaW50ZXIgaXMgbm90IHNldC4KKyAqCisgKiBUaGUgdGhpbmdzIHRvIGJlIGRvbmUgZGVwZW5kIG9uIHRoZSBpbml0IGxldmVsIGluIHRoZSBwYXJhbWV0ZXIgbGlzdDoKKyAqIExldmVsIDA6CisgKglJbml0aWFsaXplIG9ubHkgdGhlIGRhdGEgc3RydWN0dXJlcy4gRG8gTk9UIGFjY2VzcyBoYXJkd2FyZS4KKyAqIExldmVsIDE6CisgKglJbml0aWFsaXplIGhhcmR3YXJlIHRocm91Z2ggU0tfSU4gLyBTS19PVVQgY29tbWFuZHMuIERvIE5PVCB1c2UgaW50ZXJydXB0cy4KKyAqIExldmVsIDI6CisgKglFdmVyeXRoaW5nIGlzIHBvc3NpYmxlLiBJbnRlcnJ1cHRzIG1heSBiZSB1c2VkIGZyb20gbm93IG9uLgorICoKKyAqIHJldHVybjoKKyAqCTAgPSBzdWNjZXNzCisgKglvdGhlciA9IGVycm9yLgorICovCitpbnQJU2tJMmNJbml0KAorU0tfQUMJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJL08gQ29udGV4dCBuZWVkZWQgaW4gbGV2ZWxzIDEgYW5kIDIgKi8KK2ludAkJTGV2ZWwpCS8qIEluaXQgTGV2ZWwgKi8KK3sKKworCXN3aXRjaCAoTGV2ZWwpIHsKKwljYXNlIFNLX0lOSVRfREFUQToKKwkJcmV0dXJuKFNrSTJjSW5pdDAocEFDKSk7CisJY2FzZSBTS19JTklUX0lPOgorCQlyZXR1cm4oU2tJMmNJbml0MShwQUMsIElvQykpOworCWNhc2UgU0tfSU5JVF9SVU46CisJCXJldHVybihTa0kyY0luaXQyKHBBQywgSW9DKSk7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuKDApOworfQkvKiBTa0kyY0luaXQgKi8KKworCisjaWZuZGVmIFNLX0RJQUcKKworLyoKKyAqIEludGVycnVwdCBzZXJ2aWNlIGZ1bmN0aW9uIGZvciB0aGUgSTJDIEludGVyZmFjZQorICoKKyAqIENsZWFycyB0aGUgSW50ZXJydXB0IHNvdXJjZQorICoKKyAqIFJlYWRzIHRoZSByZWdpc3RlciBhbmQgY2hlY2sgaXQgZm9yIHNlbmRpbmcgYSB0cmFwLgorICoKKyAqIFN0YXJ0cyB0aGUgdGltZXIgaWYgbmVjZXNzYXJ5LgorICovCit2b2lkIFNrSTJjSXNyKAorU0tfQUMJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DKQkvKiBJL08gQ29udGV4dCAqLworeworCVNLX0VWUEFSQQlQYXJhOworCisJLyogQ2xlYXIgSTJDIElSUSAqLworCVNLX09VVDMyKElvQywgQjJfSTJDX0lSUSwgSTJDX0NMUl9JUlEpOworCisJUGFyYS5QYXJhNjQgPSAwOworCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfSTJDLCBTS19JMkNFVl9JUlEsIFBhcmEpOworfQkvKiBTa0kyY0lzciAqLworCisKKy8qCisgKiBDaGVjayB0aGlzIHNlbnNvcnMgVmFsdWUgYWdhaW5zdCB0aGUgdGhyZXNob2xkIGFuZCBzZW5kIGV2ZW50cy4KKyAqLworc3RhdGljIHZvaWQgU2tJMmNDaGVja1NlbnNvcigKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX1NFTlNPUgkqcFNlbikKK3sKKwlTS19FVlBBUkEJUGFyYUxvY2FsOworCVNLX0JPT0wJCVRvb0hpZ2g7CS8qIElzIHNlbnNvciB0b28gaGlnaD8gKi8KKwlTS19CT09MCQlUb29Mb3c7CQkvKiBJcyBzZW5zb3IgdG9vIGxvdz8gKi8KKwlTS19VNjQJCUN1cnJUaW1lOwkvKiBDdXJyZW50IFRpbWUgKi8KKwlTS19CT09MCQlEb1RyYXBTZW5kOwkvKiBXZSBuZWVkIHRvIHNlbmQgYSB0cmFwICovCisJU0tfQk9PTAkJRG9FcnJMb2c7CS8qIFdlIG5lZWQgdG8gbG9nIHRoZSBlcnJvciAqLworCVNLX0JPT0wJCUlzRXJyb3I7CS8qIFdlIG5lZWQgdG8gbG9nIHRoZSBlcnJvciAqLworCisJLyogQ2hlY2sgRHVtbXkgUmVhZHMgZmlyc3QgKi8KKwlpZiAocEFDLT5JMmMuRHVtbXlSZWFkcyA+IDApIHsKKwkJcEFDLT5JMmMuRHVtbXlSZWFkcy0tOworCQlyZXR1cm47CisJfQorCisJLyogR2V0IHRoZSBjdXJyZW50IHRpbWUgKi8KKwlDdXJyVGltZSA9IFNrT3NHZXRUaW1lKHBBQyk7CisKKwkvKiBTZXQgcGFyYSB0byB0aGUgbW9zdCB1c2VmdWwgc2V0dGluZzogVGhlIGN1cnJlbnQgc2Vuc29yLiAqLworCVBhcmFMb2NhbC5QYXJhNjQgPSAoU0tfVTY0KXBBQy0+STJjLkN1cnJTZW5zOworCisJLyogQ2hlY2sgdGhlIFZhbHVlIGFnYWluc3QgdGhlIHRocmVzaG9sZHMuIEZpcnN0OiBFcnJvciBUaHJlc2hvbGRzICovCisJVG9vSGlnaCA9IChwU2VuLT5TZW5WYWx1ZSA+IHBTZW4tPlNlblRocmVFcnJIaWdoKTsKKwlUb29Mb3cgPSAocFNlbi0+U2VuVmFsdWUgPCBwU2VuLT5TZW5UaHJlRXJyTG93KTsKKwkJCisJSXNFcnJvciA9IFNLX0ZBTFNFOworCWlmIChUb29IaWdoIHx8IFRvb0xvdykgeworCQkvKiBFcnJvciBjb25kaXRpb24gaXMgc2F0aXNmaWVkICovCisJCURvVHJhcFNlbmQgPSBTS19UUlVFOworCQlEb0VyckxvZyA9IFNLX1RSVUU7CisKKwkJLyogTm93IGVycm9yIGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQgKi8KKwkJSXNFcnJvciA9IFNLX1RSVUU7CisKKwkJaWYgKHBTZW4tPlNlbkVyckZsYWcgPT0gU0tfU0VOX0VSUl9FUlIpIHsKKwkJCS8qIFRoaXMgc3RhdGUgaXMgdGhlIGZvcm1lciBvbmUgKi8KKworCQkJLyogU28gY2hlY2sgZmlyc3Qgd2hldGhlciB3ZSBoYXZlIHRvIHNlbmQgYSB0cmFwICovCisJCQlpZiAocFNlbi0+U2VuTGFzdEVyclRyYXBUUyArIFNLX1NFTl9FUlJfVFJfSE9MRCA+CisJCQkgICAgQ3VyclRpbWUpIHsKKwkJCQkvKgorCQkJCSAqIERvIE5PVCBzZW5kIHRoZSBUcmFwLiBUaGUgaG9sZCBiYWNrIHRpbWUKKwkJCQkgKiBoYXMgdG8gcnVuIG91dCBmaXJzdC4KKwkJCQkgKi8KKwkJCQlEb1RyYXBTZW5kID0gU0tfRkFMU0U7CisJCQl9CisKKwkJCS8qIENoZWNrIG5vdyB3aGV0aGVyIHdlIGhhdmUgdG8gbG9nIGFuIEVycm9yICovCisJCQlpZiAocFNlbi0+U2VuTGFzdEVyckxvZ1RTICsgU0tfU0VOX0VSUl9MT0dfSE9MRCA+CisJCQkgICAgQ3VyclRpbWUpIHsKKwkJCQkvKgorCQkJCSAqIERvIE5PVCBsb2cgdGhlIGVycm9yLiBUaGUgaG9sZCBiYWNrIHRpbWUKKwkJCQkgKiBoYXMgdG8gcnVuIG91dCBmaXJzdC4KKwkJCQkgKi8KKwkJCQlEb0VyckxvZyA9IFNLX0ZBTFNFOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJLyogV2UgY2FtZSBmcm9tIGEgZGlmZmVyZW50IHN0YXRlIC0+IFNldCBCZWdpbiBUaW1lIFN0YW1wICovCisJCQlwU2VuLT5TZW5CZWdFcnJUUyA9IEN1cnJUaW1lOworCQkJcFNlbi0+U2VuRXJyRmxhZyA9IFNLX1NFTl9FUlJfRVJSOworCQl9CisKKwkJaWYgKERvVHJhcFNlbmQpIHsKKwkJCS8qIFNldCBjdXJyZW50IFRpbWUgKi8KKwkJCXBTZW4tPlNlbkxhc3RFcnJUcmFwVFMgPSBDdXJyVGltZTsKKwkJCXBTZW4tPlNlbkVyckN0cysrOworCisJCQkvKiBRdWV1ZSBQTk1JIEV2ZW50ICovCisJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1BOTUksIChUb29IaWdoID8KKwkJCQlTS19QTk1JX0VWVF9TRU5fRVJSX1VQUCA6CisJCQkJU0tfUE5NSV9FVlRfU0VOX0VSUl9MT1cpLAorCQkJCVBhcmFMb2NhbCk7CisJCX0KKworCQlpZiAoRG9FcnJMb2cpIHsKKwkJCS8qIFNldCBjdXJyZW50IFRpbWUgKi8KKwkJCXBTZW4tPlNlbkxhc3RFcnJMb2dUUyA9IEN1cnJUaW1lOworCisJCQlpZiAocFNlbi0+U2VuVHlwZSA9PSBTS19TRU5fVEVNUCkgeworCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVywgU0tFUlJfSTJDX0UwMTEsIFNLRVJSX0kyQ19FMDExTVNHKTsKKwkJCX0KKwkJCWVsc2UgaWYgKHBTZW4tPlNlblR5cGUgPT0gU0tfU0VOX1ZPTFQpIHsKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX0kyQ19FMDEyLCBTS0VSUl9JMkNfRTAxMk1TRyk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX0kyQ19FMDE1LCBTS0VSUl9JMkNfRTAxNU1TRyk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBDaGVjayB0aGUgVmFsdWUgYWdhaW5zdCB0aGUgdGhyZXNob2xkcyAqLworCS8qIDJuZDogV2FybmluZyB0aHJlc2hvbGRzICovCisJVG9vSGlnaCA9IChwU2VuLT5TZW5WYWx1ZSA+IHBTZW4tPlNlblRocmVXYXJuSGlnaCk7CisJVG9vTG93ID0gKHBTZW4tPlNlblZhbHVlIDwgcFNlbi0+U2VuVGhyZVdhcm5Mb3cpOworCQkKKwlpZiAoIUlzRXJyb3IgJiYgKFRvb0hpZ2ggfHwgVG9vTG93KSkgeworCQkvKiBFcnJvciBjb25kaXRpb24gaXMgc2F0aXNmaWVkICovCisJCURvVHJhcFNlbmQgPSBTS19UUlVFOworCQlEb0VyckxvZyA9IFNLX1RSVUU7CisKKwkJaWYgKHBTZW4tPlNlbkVyckZsYWcgPT0gU0tfU0VOX0VSUl9XQVJOKSB7CisJCQkvKiBUaGlzIHN0YXRlIGlzIHRoZSBmb3JtZXIgb25lICovCisKKwkJCS8qIFNvIGNoZWNrIGZpcnN0IHdoZXRoZXIgd2UgaGF2ZSB0byBzZW5kIGEgdHJhcCAqLworCQkJaWYgKHBTZW4tPlNlbkxhc3RXYXJuVHJhcFRTICsgU0tfU0VOX1dBUk5fVFJfSE9MRCA+IEN1cnJUaW1lKSB7CisJCQkJLyoKKwkJCQkgKiBEbyBOT1Qgc2VuZCB0aGUgVHJhcC4gVGhlIGhvbGQgYmFjayB0aW1lCisJCQkJICogaGFzIHRvIHJ1biBvdXQgZmlyc3QuCisJCQkJICovCisJCQkJRG9UcmFwU2VuZCA9IFNLX0ZBTFNFOworCQkJfQorCisJCQkvKiBDaGVjayBub3cgd2hldGhlciB3ZSBoYXZlIHRvIGxvZyBhbiBFcnJvciAqLworCQkJaWYgKHBTZW4tPlNlbkxhc3RXYXJuTG9nVFMgKyBTS19TRU5fV0FSTl9MT0dfSE9MRCA+IEN1cnJUaW1lKSB7CisJCQkJLyoKKwkJCQkgKiBEbyBOT1QgbG9nIHRoZSBlcnJvci4gVGhlIGhvbGQgYmFjayB0aW1lCisJCQkJICogaGFzIHRvIHJ1biBvdXQgZmlyc3QuCisJCQkJICovCisJCQkJRG9FcnJMb2cgPSBTS19GQUxTRTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCS8qIFdlIGNhbWUgZnJvbSBhIGRpZmZlcmVudCBzdGF0ZSAtPiBTZXQgQmVnaW4gVGltZSBTdGFtcCAqLworCQkJcFNlbi0+U2VuQmVnV2FyblRTID0gQ3VyclRpbWU7CisJCQlwU2VuLT5TZW5FcnJGbGFnID0gU0tfU0VOX0VSUl9XQVJOOworCQl9CisKKwkJaWYgKERvVHJhcFNlbmQpIHsKKwkJCS8qIFNldCBjdXJyZW50IFRpbWUgKi8KKwkJCXBTZW4tPlNlbkxhc3RXYXJuVHJhcFRTID0gQ3VyclRpbWU7CisJCQlwU2VuLT5TZW5XYXJuQ3RzKys7CisKKwkJCS8qIFF1ZXVlIFBOTUkgRXZlbnQgKi8KKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUE5NSSwgKFRvb0hpZ2ggPworCQkJCVNLX1BOTUlfRVZUX1NFTl9XQVJfVVBQIDoKKwkJCQlTS19QTk1JX0VWVF9TRU5fV0FSX0xPVyksCisJCQkJUGFyYUxvY2FsKTsKKwkJfQorCisJCWlmIChEb0VyckxvZykgeworCQkJLyogU2V0IGN1cnJlbnQgVGltZSAqLworCQkJcFNlbi0+U2VuTGFzdFdhcm5Mb2dUUyA9IEN1cnJUaW1lOworCisJCQlpZiAocFNlbi0+U2VuVHlwZSA9PSBTS19TRU5fVEVNUCkgeworCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVywgU0tFUlJfSTJDX0UwMDksIFNLRVJSX0kyQ19FMDA5TVNHKTsKKwkJCX0KKwkJCWVsc2UgaWYgKHBTZW4tPlNlblR5cGUgPT0gU0tfU0VOX1ZPTFQpIHsKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX0kyQ19FMDEwLCBTS0VSUl9JMkNfRTAxME1TRyk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX0kyQ19FMDE0LCBTS0VSUl9JMkNfRTAxNE1TRyk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBDaGVjayBmb3IgTk8gZXJyb3IgYXQgYWxsICovCisJaWYgKCFJc0Vycm9yICYmICFUb29IaWdoICYmICFUb29Mb3cpIHsKKwkJLyogU2V0IG8uay4gU3RhdHVzIGlmIG5vIGVycm9yIGFuZCBubyB3YXJuaW5nIGNvbmRpdGlvbiAqLworCQlwU2VuLT5TZW5FcnJGbGFnID0gU0tfU0VOX0VSUl9PSzsKKwl9CisKKwkvKiBFbmQgb2YgY2hlY2sgYWdhaW5zdCB0aGUgdGhyZXNob2xkcyAqLworCisJLyogQnVnIGZpeCBBRjogMTYuQXVnLjIwMDE6IENvcnJlY3QgdGhlIGluaXQgYmFzZQorCSAqIG9mIExNODAgc2Vuc29yLgorCSAqLworCWlmIChwU2VuLT5TZW5Jbml0ID09IFNLX1NFTl9EWU5fSU5JVF9QQ0lfSU8pIHsKKworICAgICAgICBwU2VuLT5TZW5Jbml0ID0gU0tfU0VOX0RZTl9JTklUX05PTkU7CisKKwkJaWYgKHBTZW4tPlNlblZhbHVlID4gU0tfU0VOX1BDSV9JT19SQU5HRV9MSU1JVEVSKSB7CisJCQkvKiA1ViBQQ0ktSU8gVm9sdGFnZSAqLworCQkJcFNlbi0+U2VuVGhyZVdhcm5Mb3cgPSBTS19TRU5fUENJX0lPXzVWX0xPV19XQVJOOworCQkJcFNlbi0+U2VuVGhyZUVyckxvdyA9IFNLX1NFTl9QQ0lfSU9fNVZfTE9XX0VSUjsKKwkJfQorCQllbHNlIHsKKwkJCS8qIDMuM1YgUENJLUlPIFZvbHRhZ2UgKi8KKwkJCXBTZW4tPlNlblRocmVXYXJuSGlnaCA9IFNLX1NFTl9QQ0lfSU9fM1YzX0hJR0hfV0FSTjsKKwkJCXBTZW4tPlNlblRocmVFcnJIaWdoID0gU0tfU0VOX1BDSV9JT18zVjNfSElHSF9FUlI7CisJCX0KKwl9CisJCisjaWZkZWYgVEVTVF9PTkxZCisgICAgLyogRHluYW1pYyB0aHJlc2hvbGRzIGFsc28gZm9yIFZBVVggb2YgTE04MCBzZW5zb3IgKi8KKwlpZiAocFNlbi0+U2VuSW5pdCA9PSBTS19TRU5fRFlOX0lOSVRfVkFVWCkgeworCisgICAgICAgIHBTZW4tPlNlbkluaXQgPSBTS19TRU5fRFlOX0lOSVRfTk9ORTsKKworCQkvKiAzLjNWIFZBVVggVm9sdGFnZSAqLworCQlpZiAocFNlbi0+U2VuVmFsdWUgPiBTS19TRU5fVkFVWF9SQU5HRV9MSU1JVEVSKSB7CisJCQlwU2VuLT5TZW5UaHJlV2FybkxvdyA9IFNLX1NFTl9WQVVYXzNWM19MT1dfV0FSTjsKKwkJCXBTZW4tPlNlblRocmVFcnJMb3cgPSBTS19TRU5fVkFVWF8zVjNfTE9XX0VSUjsKKwkJfQorCQkvKiAwViBWQVVYIFZvbHRhZ2UgKi8KKwkJZWxzZSB7CisJCQlwU2VuLT5TZW5UaHJlV2FybkhpZ2ggPSBTS19TRU5fVkFVWF8wVl9XQVJOX0VSUjsKKwkJCXBTZW4tPlNlblRocmVFcnJIaWdoID0gU0tfU0VOX1ZBVVhfMFZfV0FSTl9FUlI7CisJCX0KKwl9CisKKwkvKgorCSAqIENoZWNrIGluaXRpYWxpemF0aW9uIHN0YXRlOgorCSAqIFRoZSBWSU8gVGhyZXNob2xkcyBuZWVkIGFkYXB0aW9uCisJICovCisJaWYgKCFwU2VuLT5TZW5Jbml0ICYmIHBTZW4tPlNlblJlZyA9PSBMTTgwX1ZUMV9JTiAmJgorCSAgICAgcFNlbi0+U2VuVmFsdWUgPiBTS19TRU5fV0FSTkxPVzJDICYmCisJICAgICBwU2VuLT5TZW5WYWx1ZSA8IFNLX1NFTl9XQVJOSElHSDIpIHsKKwkJcFNlbi0+U2VuVGhyZUVyckxvdyA9IFNLX1NFTl9FUlJMT1cyQzsKKwkJcFNlbi0+U2VuVGhyZVdhcm5Mb3cgPSBTS19TRU5fV0FSTkxPVzJDOworCQlwU2VuLT5TZW5Jbml0ID0gU0tfVFJVRTsKKwl9CisKKwlpZiAoIXBTZW4tPlNlbkluaXQgJiYgcFNlbi0+U2VuUmVnID09IExNODBfVlQxX0lOICYmCisJICAgICBwU2VuLT5TZW5WYWx1ZSA+IFNLX1NFTl9XQVJOTE9XMiAmJgorCSAgICAgcFNlbi0+U2VuVmFsdWUgPCBTS19TRU5fV0FSTkhJR0gyQykgeworCQlwU2VuLT5TZW5UaHJlRXJySGlnaCA9IFNLX1NFTl9FUlJISUdIMkM7CisJCXBTZW4tPlNlblRocmVXYXJuSGlnaCA9IFNLX1NFTl9XQVJOSElHSDJDOworCQlwU2VuLT5TZW5Jbml0ID0gU0tfVFJVRTsKKwl9CisjZW5kaWYKKworCWlmIChwU2VuLT5TZW5Jbml0ICE9IFNLX1NFTl9EWU5fSU5JVF9OT05FKSB7CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9IVywgU0tFUlJfSTJDX0UwMTMsIFNLRVJSX0kyQ19FMDEzTVNHKTsKKwl9Cit9CS8qIFNrSTJjQ2hlY2tTZW5zb3IgKi8KKworCisvKgorICogVGhlIG9ubHkgRXZlbnQgdG8gYmUgc2VydmVkIGlzIHRoZSB0aW1lb3V0IGV2ZW50CisgKgorICovCitpbnQJU2tJMmNFdmVudCgKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfVTMyCQlFdmVudCwJLyogTW9kdWxlIHNwZWNpZmljIEV2ZW50ICovCitTS19FVlBBUkEJUGFyYSkJLyogRXZlbnQgc3BlY2lmaWMgUGFyYW1ldGVyICovCit7CisJaW50CQkJUmVhZENvbXBsZXRlOworCVNLX1NFTlNPUgkqcFNlbjsKKwlTS19VMzIJCVRpbWU7CisJU0tfRVZQQVJBCVBhcmFMb2NhbDsKKwlpbnQJCQlpOworCisJLyogTmV3IGNhc2U6IG5vIHNlbnNvcnMgKi8KKwlpZiAocEFDLT5JMmMuTWF4U2VucyA9PSAwKSB7CisJCXJldHVybigwKTsKKwl9CisKKwlzd2l0Y2ggKEV2ZW50KSB7CisJY2FzZSBTS19JMkNFVl9JUlE6CisJCXBTZW4gPSAmcEFDLT5JMmMuU2VuVGFibGVbcEFDLT5JMmMuQ3VyclNlbnNdOworCQlSZWFkQ29tcGxldGUgPSBTa0kyY1JlYWRTZW5zb3IocEFDLCBJb0MsIHBTZW4pOworCisJCWlmIChSZWFkQ29tcGxldGUpIHsKKwkJCS8qIENoZWNrIHNlbnNvciBhZ2FpbnN0IGRlZmluZWQgdGhyZXNob2xkcyAqLworCQkJU2tJMmNDaGVja1NlbnNvcihwQUMsIHBTZW4pOworCisJCQkvKiBJbmNyZW1lbnQgQ3VycmVudCBzZW5zb3IgYW5kIHNldCBhcHByb3ByaWF0ZSBUaW1lb3V0ICovCisJCQlwQUMtPkkyYy5DdXJyU2VucysrOworCQkJaWYgKHBBQy0+STJjLkN1cnJTZW5zID49IHBBQy0+STJjLk1heFNlbnMpIHsKKwkJCQlwQUMtPkkyYy5DdXJyU2VucyA9IDA7CisJCQkJVGltZSA9IFNLX0kyQ19USU1fTE9ORzsKKwkJCX0KKwkJCWVsc2UgeworCQkJCVRpbWUgPSBTS19JMkNfVElNX1NIT1JUOworCQkJfQorCisJCQkvKiBTdGFydCBUaW1lciAqLworCQkJUGFyYUxvY2FsLlBhcmE2NCA9IChTS19VNjQpMDsKKworCQkJcEFDLT5JMmMuVGltZXJNb2RlID0gU0tfVElNRVJfTkVXX0dBVUdJTkc7CisJCQkKKwkJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBBQy0+STJjLlNlblRpbWVyLCBUaW1lLAorCQkJCVNLR0VfSTJDLCBTS19JMkNFVl9USU0sIFBhcmFMb2NhbCk7CisJCX0KKyAgICAgICAgZWxzZSB7CisJCQkvKiBTdGFydCBUaW1lciAqLworCQkJUGFyYUxvY2FsLlBhcmE2NCA9IChTS19VNjQpMDsKKworCQkJcEFDLT5JMmMuVGltZXJNb2RlID0gU0tfVElNRVJfV0FUQ0hfU007CisKKyAgICAgICAgICAgIFNrVGltZXJTdGFydChwQUMsIElvQywgJnBBQy0+STJjLlNlblRpbWVyLCBTS19JMkNfVElNX1dBVENILAorCQkJCVNLR0VfSTJDLCBTS19JMkNFVl9USU0sIFBhcmFMb2NhbCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTS19JMkNFVl9USU06CisJCWlmIChwQUMtPkkyYy5UaW1lck1vZGUgPT0gU0tfVElNRVJfTkVXX0dBVUdJTkcpIHsKKworCQkJUGFyYUxvY2FsLlBhcmE2NCA9IChTS19VNjQpMDsKKwkJCVNrVGltZXJTdG9wKHBBQywgSW9DLCAmcEFDLT5JMmMuU2VuVGltZXIpOworCisJCQlwU2VuID0gJnBBQy0+STJjLlNlblRhYmxlW3BBQy0+STJjLkN1cnJTZW5zXTsKKwkJCVJlYWRDb21wbGV0ZSA9IFNrSTJjUmVhZFNlbnNvcihwQUMsIElvQywgcFNlbik7CisKKwkJCWlmIChSZWFkQ29tcGxldGUpIHsKKwkJCQkvKiBDaGVjayBzZW5zb3IgYWdhaW5zdCBkZWZpbmVkIHRocmVzaG9sZHMgKi8KKwkJCQlTa0kyY0NoZWNrU2Vuc29yKHBBQywgcFNlbik7CisKKwkJCQkvKiBJbmNyZW1lbnQgQ3VycmVudCBzZW5zb3IgYW5kIHNldCBhcHByb3ByaWF0ZSBUaW1lb3V0ICovCisJCQkJcEFDLT5JMmMuQ3VyclNlbnMrKzsKKwkJCQlpZiAocEFDLT5JMmMuQ3VyclNlbnMgPT0gcEFDLT5JMmMuTWF4U2VucykgeworCQkJCQlwQUMtPkkyYy5DdXJyU2VucyA9IDA7CisJCQkJCVRpbWUgPSBTS19JMkNfVElNX0xPTkc7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlUaW1lID0gU0tfSTJDX1RJTV9TSE9SVDsKKwkJCQl9CisKKwkJCQkvKiBTdGFydCBUaW1lciAqLworCQkJCVBhcmFMb2NhbC5QYXJhNjQgPSAoU0tfVTY0KTA7CisKKwkJCQlwQUMtPkkyYy5UaW1lck1vZGUgPSBTS19USU1FUl9ORVdfR0FVR0lORzsKKworCQkJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBBQy0+STJjLlNlblRpbWVyLCBUaW1lLAorCQkJCQlTS0dFX0kyQywgU0tfSTJDRVZfVElNLCBQYXJhTG9jYWwpOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJcFNlbiA9ICZwQUMtPkkyYy5TZW5UYWJsZVtwQUMtPkkyYy5DdXJyU2Vuc107CisJCQlwU2VuLT5TZW5FcnJGbGFnID0gU0tfU0VOX0VSUl9GQVVMVFk7CisJCQlTS19JMkNfU1RPUChJb0MpOworCisJCQkvKiBJbmNyZW1lbnQgQ3VycmVudCBzZW5zb3IgYW5kIHNldCBhcHByb3ByaWF0ZSBUaW1lb3V0ICovCisJCQlwQUMtPkkyYy5DdXJyU2VucysrOworCQkJaWYgKHBBQy0+STJjLkN1cnJTZW5zID09IHBBQy0+STJjLk1heFNlbnMpIHsKKwkJCQlwQUMtPkkyYy5DdXJyU2VucyA9IDA7CisJCQkJVGltZSA9IFNLX0kyQ19USU1fTE9ORzsKKwkJCX0KKwkJCWVsc2UgeworCQkJCVRpbWUgPSBTS19JMkNfVElNX1NIT1JUOworCQkJfQorCisJCQkvKiBTdGFydCBUaW1lciAqLworCQkJUGFyYUxvY2FsLlBhcmE2NCA9IChTS19VNjQpMDsKKworCQkJcEFDLT5JMmMuVGltZXJNb2RlID0gU0tfVElNRVJfTkVXX0dBVUdJTkc7CisKKwkJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBBQy0+STJjLlNlblRpbWVyLCBUaW1lLAorCQkJCVNLR0VfSTJDLCBTS19JMkNFVl9USU0sIFBhcmFMb2NhbCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTS19JMkNFVl9DTEVBUjoKKwkJZm9yIChpID0gMDsgaSA8IFNLX01BWF9TRU5TT1JTOyBpKyspIHsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkVyckZsYWcgPSBTS19TRU5fRVJSX09LOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRXJyQ3RzID0gMDsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbldhcm5DdHMgPSAwOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuQmVnRXJyVFMgPSAwOworCQkJcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuQmVnV2FyblRTID0gMDsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkxhc3RFcnJUcmFwVFMgPSAoU0tfVTY0KTA7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5MYXN0RXJyTG9nVFMgPSAoU0tfVTY0KTA7CisJCQlwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5MYXN0V2FyblRyYXBUUyA9IChTS19VNjQpMDsKKwkJCXBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkxhc3RXYXJuTG9nVFMgPSAoU0tfVTY0KTA7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9JMkNfRTAwNiwgU0tFUlJfSTJDX0UwMDZNU0cpOworCX0KKworCXJldHVybigwKTsKK30JLyogU2tJMmNFdmVudCovCisKKyNlbmRpZiAvKiAhU0tfRElBRyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2xtODAuYyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tsbTgwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgyOTJkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tsbTgwLmMKQEAgLTAsMCArMSwyMTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza2xtODAuYworICogUHJvamVjdDoJR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVycywgVFdTSS1Nb2R1bGUKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4yMiAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8xMC8yMCAwOTowODoyMSAkCisgKiBQdXJwb3NlOglGdW5jdGlvbnMgdG8gYWNjZXNzIFZvbHRhZ2UgYW5kIFRlbXBlcmF0dXJlIFNlbnNvciAoTE04MCkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0LgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKwlMTTgwIGZ1bmN0aW9ucworKi8KKyNpZiAoZGVmaW5lZChERUJVRykgfHwgKCghZGVmaW5lZChMSU5UKSkgJiYgKCFkZWZpbmVkKFNLX1NMSU0pKSkpCitzdGF0aWMgY29uc3QgY2hhciBTeXNLb25uZWN0RmlsZUlkW10gPQorCSJAKCMpICRJZDogc2tsbTgwLmMsdiAxLjIyIDIwMDMvMTAvMjAgMDk6MDg6MjEgcnNjaG1pZHQgRXhwICQgKEMpIE1hcnZlbGwuICI7CisjZW5kaWYKKworI2luY2x1ZGUgImgvc2tkcnYxc3QuaCIJCS8qIERyaXZlciBTcGVjaWZpYyBEZWZpbml0aW9ucyAqLworI2luY2x1ZGUgImgvbG04MC5oIgorI2luY2x1ZGUgImgvc2tkcnYybmQuaCIJCS8qIEFkYXB0ZXIgQ29udHJvbC0gYW5kIERyaXZlciBzcGVjaWZpYyBEZWYuICovCisKKyNpZmRlZglTS19ESUFHCisjZGVmaW5lCUJSRUFLX09SX1dBSVQocEFDLElvQyxFdmVudCkJU2tJMmNXYWl0KHBBQyxJb0MsRXZlbnQpCisjZWxzZQkvKiBuU0tfRElBRyAqLworI2RlZmluZQlCUkVBS19PUl9XQUlUKHBBQyxJb0MsRXZlbnQpCWJyZWFrCisjZW5kaWYJLyogblNLX0RJQUcgKi8KKworI2lmZGVmCVNLX0RJQUcKKy8qCisgKiByZWFkIHRoZSByZWdpc3RlciAnUmVnJyBmcm9tIHRoZSBkZXZpY2UgJ0RldicKKyAqCisgKiByZXR1cm4gCXJlYWQgZXJyb3IJLTEKKyAqCQlzdWNjZXNzCQl0aGUgcmVhZCB2YWx1ZQorICovCitpbnQJU2tMbTgwUmN2UmVnKAorU0tfSU9DCUlvQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworaW50CQlEZXYsCQkvKiBJMkMgZGV2aWNlIGFkZHJlc3MgKi8KK2ludAkJUmVnKQkJLyogcmVnaXN0ZXIgdG8gcmVhZCAqLworeworCWludAlWYWwgPSAwOworCWludAlUZW1wRXh0OworCisJLyogU2lnbmFsIGRldmljZSBudW1iZXIgKi8KKwlpZiAoU2tJMmNTbmREZXYoSW9DLCBEZXYsIEkyQ19XUklURSkpIHsKKwkJcmV0dXJuKC0xKTsKKwl9CisKKwlpZiAoU2tJMmNTbmRCeXRlKElvQywgUmVnKSkgeworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIHJlcGVhdCBzdGFydCAqLworCWlmIChTa0kyY1NuZERldihJb0MsIERldiwgSTJDX1JFQUQpKSB7CisJCXJldHVybigtMSk7CisJfQorCisJc3dpdGNoIChSZWcpIHsKKwljYXNlIExNODBfVEVNUF9JTjoKKwkJVmFsID0gKGludClTa0kyY1JjdkJ5dGUoSW9DLCAxKTsKKworCQkvKiBGaXJzdDogY29ycmVjdCB0aGUgdmFsdWU6IGl0IG1pZ2h0IGJlIG5lZ2F0aXZlICovCisJCWlmICgoVmFsICYgMHg4MCkgIT0gMCkgeworCQkJLyogVmFsdWUgaXMgbmVnYXRpdmUgKi8KKwkJCVZhbCA9IFZhbCAtIDI1NjsKKwkJfQorCQlWYWwgPSBWYWwgKiBTS19MTTgwX1RFTVBfTFNCOworCQlTa0kyY1N0b3AoSW9DKTsKKwkJCisJCVRlbXBFeHQgPSAoaW50KVNrTG04MFJjdlJlZyhJb0MsIExNODBfQUREUiwgTE04MF9URU1QX0NUUkwpOworCQkKKwkJaWYgKFZhbCA+IDApIHsKKwkJCVZhbCArPSAoKFRlbXBFeHQgPj4gNykgKiBTS19MTTgwX1RFTVBFWFRfTFNCKTsKKwkJfQorCQllbHNlIHsKKwkJCVZhbCAtPSAoKFRlbXBFeHQgPj4gNykgKiBTS19MTTgwX1RFTVBFWFRfTFNCKTsKKwkJfQorCQlyZXR1cm4oVmFsKTsKKwkJYnJlYWs7CisJY2FzZSBMTTgwX1ZUMF9JTjoKKwljYXNlIExNODBfVlQxX0lOOgorCWNhc2UgTE04MF9WVDJfSU46CisJY2FzZSBMTTgwX1ZUM19JTjoKKwkJVmFsID0gKGludClTa0kyY1JjdkJ5dGUoSW9DLCAxKSAqIFNLX0xNODBfVlRfTFNCOworCQlicmVhazsKKwkKKwlkZWZhdWx0OgorCQlWYWwgPSAoaW50KVNrSTJjUmN2Qnl0ZShJb0MsIDEpOworCQlicmVhazsKKwl9CisKKwlTa0kyY1N0b3AoSW9DKTsKKwlyZXR1cm4oVmFsKTsKK30KKyNlbmRpZgkvKiBTS19ESUFHICovCisKKy8qCisgKiByZWFkIGEgc2Vuc29ycyB2YWx1ZSAoTE04MCBzcGVjaWZpYykKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGEgc2Vuc29ycyB2YWx1ZSBmcm9tIHRoZSBJMkMgc2Vuc29yIGNoaXAgTE04MC4KKyAqIFRoZSBzZW5zb3IgaXMgZGVmaW5lZCBieSBpdHMgaW5kZXggaW50byB0aGUgc2Vuc29ycyBkYXRhYmFzZSBpbiB0aGUgc3RydWN0CisgKiBwQUMgcG9pbnRzIHRvLgorICoKKyAqIFJldHVybnMJMSBpZiB0aGUgcmVhZCBpcyBjb21wbGV0ZWQKKyAqCQkwIGlmIHRoZSByZWFkIG11c3QgYmUgY29udGludWVkIChJMkMgQnVzIHN0aWxsIGFsbG9jYXRlZCkKKyAqLworaW50IFNrTG04MFJlYWRTZW5zb3IoCitTS19BQwkJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJLyogSS9PIENvbnRleHQgbmVlZGVkIGluIGxldmVsIDEgYW5kIDIgKi8KK1NLX1NFTlNPUgkqcFNlbikJLyogU2Vuc29yIHRvIGJlIHJlYWQgKi8KK3sKKwlTS19JMzIJCVZhbHVlOworCisJc3dpdGNoIChwU2VuLT5TZW5TdGF0ZSkgeworCWNhc2UgU0tfU0VOX0lETEU6CisJCS8qIFNlbmQgYWRkcmVzcyB0byBBRERSIHJlZ2lzdGVyICovCisJCVNLX0kyQ19DVEwoSW9DLCBJMkNfUkVBRCwgcFNlbi0+U2VuRGV2LCBJMkNfMDI1S19ERVYsIHBTZW4tPlNlblJlZywgMCk7CisKKwkJcFNlbi0+U2VuU3RhdGUgPSBTS19TRU5fVkFMVUUgOworCQlCUkVBS19PUl9XQUlUKHBBQywgSW9DLCBJMkNfUkVBRCk7CisJCisJY2FzZSBTS19TRU5fVkFMVUU6CisJCS8qIFJlYWQgdmFsdWUgZnJvbSBkYXRhIHJlZ2lzdGVyICovCisJCVNLX0lOMzIoSW9DLCBCMl9JMkNfREFUQSwgKChTS19VMzIgKikmVmFsdWUpKTsKKwkJCisJCVZhbHVlICY9IDB4ZmY7IC8qIG9ubHkgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBpcyB2YWxpZCAqLworCisJCS8qIERvIE5PVCBjaGVjayB0aGUgVmFsdWUgYWdhaW5zdCB0aGUgdGhyZXNob2xkcyAqLworCQkvKiBDaGVja2luZyBpcyBkb25lIGluIHRoZSBjYWxsaW5nIGluc3RhbmNlICovCisKKwkJaWYgKHBTZW4tPlNlblR5cGUgPT0gU0tfU0VOX1ZPTFQpIHsKKwkJCS8qIFZvbHRhZ2Ugc2Vuc29yICovCisJCQlwU2VuLT5TZW5WYWx1ZSA9IFZhbHVlICogU0tfTE04MF9WVF9MU0I7CisJCQlwU2VuLT5TZW5TdGF0ZSA9IFNLX1NFTl9JRExFIDsKKwkJCXJldHVybigxKTsKKwkJfQorCisJCWlmIChwU2VuLT5TZW5UeXBlID09IFNLX1NFTl9GQU4pIHsKKwkJCWlmIChWYWx1ZSAhPSAwICYmIFZhbHVlICE9IDB4ZmYpIHsKKwkJCQkvKiBGYW4gc3BlZWQgY291bnRlciAqLworCQkJCXBTZW4tPlNlblZhbHVlID0gU0tfTE04MF9GQU5fRkFLVE9SL1ZhbHVlOworCQkJfQorCQkJZWxzZSB7CisJCQkJLyogSW5kaWNhdGUgRmFuIGVycm9yICovCisJCQkJcFNlbi0+U2VuVmFsdWUgPSAwOworCQkJfQorCQkJcFNlbi0+U2VuU3RhdGUgPSBTS19TRU5fSURMRSA7CisJCQlyZXR1cm4oMSk7CisJCX0KKworCQkvKiBGaXJzdDogY29ycmVjdCB0aGUgdmFsdWU6IGl0IG1pZ2h0IGJlIG5lZ2F0aXZlICovCisJCWlmICgoVmFsdWUgJiAweDgwKSAhPSAwKSB7CisJCQkvKiBWYWx1ZSBpcyBuZWdhdGl2ZSAqLworCQkJVmFsdWUgPSBWYWx1ZSAtIDI1NjsKKwkJfQorCisJCS8qIFdlIGhhdmUgYSB0ZW1wZXJhdHVyZSBzZW5zb3IgYW5kIG5lZWQgdG8gZ2V0IHRoZSBzaWduZWQgZXh0ZW5zaW9uLgorCQkgKiBGb3Igbm93IHdlIGdldCB0aGUgZXh0ZW5zaW9uIGZyb20gdGhlIGxhc3QgcmVhZGluZywgc28gaW4gdGhlIG5vcm1hbAorCQkgKiBjYXNlIHdlIHdvbid0IHNlZSBmbGlja2VyaW5nIHRlbXBlcmF0dXJlcy4KKwkJICovCisJCXBTZW4tPlNlblZhbHVlID0gKFZhbHVlICogU0tfTE04MF9URU1QX0xTQikgKworCQkJKHBTZW4tPlNlblZhbHVlICUgU0tfTE04MF9URU1QX0xTQik7CisKKwkJLyogU2VuZCBhZGRyZXNzIHRvIEFERFIgcmVnaXN0ZXIgKi8KKwkJU0tfSTJDX0NUTChJb0MsIEkyQ19SRUFELCBwU2VuLT5TZW5EZXYsIEkyQ18wMjVLX0RFViwgTE04MF9URU1QX0NUUkwsIDApOworCisJCXBTZW4tPlNlblN0YXRlID0gU0tfU0VOX1ZBTEVYVCA7CisJCUJSRUFLX09SX1dBSVQocEFDLCBJb0MsIEkyQ19SRUFEKTsKKwkKKwljYXNlIFNLX1NFTl9WQUxFWFQ6CisJCS8qIFJlYWQgdmFsdWUgZnJvbSBkYXRhIHJlZ2lzdGVyICovCisJCVNLX0lOMzIoSW9DLCBCMl9JMkNfREFUQSwgKChTS19VMzIgKikmVmFsdWUpKTsKKwkJVmFsdWUgJj0gTE04MF9URU1QX0xTQl85OyAvKiBvbmx5IGJpdCA3IGlzIHZhbGlkICovCisKKwkJLyogY3V0IHRoZSBMU0IgYml0ICovCisJCXBTZW4tPlNlblZhbHVlID0gKChwU2VuLT5TZW5WYWx1ZSAvIFNLX0xNODBfVEVNUF9MU0IpICoKKwkJCVNLX0xNODBfVEVNUF9MU0IpOworCisJCWlmIChwU2VuLT5TZW5WYWx1ZSA8IDApIHsKKwkJCS8qIFZhbHVlIG5lZ2F0aXZlOiBUaGUgYml0IHZhbHVlIG11c3QgYmUgc3VidHJhY3RlZCAqLworCQkJcFNlbi0+U2VuVmFsdWUgLT0gKChWYWx1ZSA+PiA3KSAqIFNLX0xNODBfVEVNUEVYVF9MU0IpOworCQl9CisJCWVsc2UgeworCQkJLyogVmFsdWUgcG9zaXRpdmU6IFRoZSBiaXQgdmFsdWUgbXVzdCBiZSBhZGRlZCAqLworCQkJcFNlbi0+U2VuVmFsdWUgKz0gKChWYWx1ZSA+PiA3KSAqIFNLX0xNODBfVEVNUEVYVF9MU0IpOworCQl9CisKKwkJcFNlbi0+U2VuU3RhdGUgPSBTS19TRU5fSURMRSA7CisJCXJldHVybigxKTsKKwkKKwlkZWZhdWx0OgorCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0kyQ19FMDA3LCBTS0VSUl9JMkNfRTAwN01TRyk7CisJCXJldHVybigxKTsKKwl9CisKKwkvKiBOb3QgY29tcGxldGVkICovCisJcmV0dXJuKDApOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL3NrcHJvYy5jIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2VjZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za3Byb2MuYwpAQCAtMCwwICsxLDI2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrcHJvYy5jCisgKiBQcm9qZWN0OglHRW5lc2lzLCBQQ0kgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuMTEgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMTIvMTEgMTY6MDM6NTcgJAorICogUHVycG9zZToJRnVua3Rpb25zIHRvIGRpc3BsYXkgc3RhdGljdGljIGRhdGEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LTIwMDIgU3lzS29ubmVjdCBHbWJILgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJQ3JlYXRlZCAyMi1Ob3YtMjAwMAorICoJQXV0aG9yOiBNaXJrbyBMaW5kbmVyIChtbGluZG5lckBzeXNrb25uZWN0LmRlKQorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKyNpbmNsdWRlICJoL3NrZHJ2MXN0LmgiCisjaW5jbHVkZSAiaC9za2RydjJuZC5oIgorI2luY2x1ZGUgImgvc2t2ZXJzaW9uLmgiCisKK3N0YXRpYyBpbnQgc2tfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpOworc3RhdGljIGludCBza19wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNrX3Byb2NfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gc2tfcHJvY19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICAgc2tfc2VxX3Nob3cgLSBzaG93IHByb2MgaW5mb3JtYXRpb24gb2YgYSBwYXJ0aWN1bGFyIGFkYXB0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICBUaGlzIGZ1bmN0aW9uIGZpbGxzIHRoZSBwcm9jIGVudHJ5IHdpdGggc3RhdGlzdGljIGRhdGEgYWJvdXQgCisgKiAgdGhlIGV0aGVybmV0IGRldmljZS4gSXQgaW52b2tlcyB0aGUgZ2VuZXJpYyBza19nZW5fYnJvd3NlKCkgdG8KKyAqICBwcmludCBvdXQgYWxsIGl0ZW1zIG9uZSBwZXIgb25lLgorICogIAorICogUmV0dXJuczogMAorICogICAgICAKKyAqLworc3RhdGljIGludCBza19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2VxLT5wcml2YXRlOworCURFVl9ORVQJCQkqcE5ldCA9IG5ldGRldl9wcml2KGRldik7CisJU0tfQUMJCQkqcEFDID0gcE5ldC0+cEFDOworCVNLX1BOTUlfU1RSVUNUX0RBVEEgCSpwUG5taVN0cnVjdCA9ICZwQUMtPlBubWlTdHJ1Y3Q7CisJdW5zaWduZWQgbG9uZwkJRmxhZ3M7CQorCXVuc2lnbmVkIGludAkJU2l6ZTsKKwljaGFyCQkJc2Vuc19tc2dbNTBdOworCWludCAJCQl0OworCWludCAJCQlpOworCisJLyogTmV0SW5kZXggaW4gR2V0U3RydWN0IGlzIG5vdyByZXF1aXJlZCwgemVybyBpcyBvbmx5IGR1bW15ICovCisJZm9yICh0PXBBQy0+R0luaS5HSU1hY3NGb3VuZDsgdCA+IDA7IHQtLSkgeworCQlpZiAoKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA9PSAyKSAmJiBwQUMtPlJsbXROZXRzID09IDEpCisJCQl0LS07CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBBQy0+U2xvd1BhdGhMb2NrLCBGbGFncyk7CisJCVNpemUgPSBTS19QTk1JX1NUUlVDVF9TSVpFOworI2lmZGVmIFNLX0RJQUdfU1VQUE9SVAorCQlpZiAocEFDLT5Cb2FyZExldmVsID09IFNLX0lOSVRfREFUQSkgeworCQkJU0tfTUVNQ1BZKCYocEFDLT5Qbm1pU3RydWN0KSwgJihwQUMtPlBubWlCYWNrdXApLCBzaXplb2YoU0tfUE5NSV9TVFJVQ1RfREFUQSkpOworCQkJaWYgKHBBQy0+RGlhZ01vZGVBY3RpdmUgPT0gRElBR19OT1RBQ1RJVkUpIHsKKwkJCQlwQUMtPlBubWkuRGlhZ0F0dGFjaGVkID0gU0tfRElBR19JRExFOworCQkJfQorCQl9IGVsc2UgeworCQkJU2tQbm1pR2V0U3RydWN0KHBBQywgcEFDLT5Jb0Jhc2UsIHBQbm1pU3RydWN0LCAmU2l6ZSwgdC0xKTsKKwkJfQorI2Vsc2UKKwkJU2tQbm1pR2V0U3RydWN0KHBBQywgcEFDLT5Jb0Jhc2UsIAorCQkJCXBQbm1pU3RydWN0LCAmU2l6ZSwgdC0xKTsKKyNlbmRpZgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwQUMtPlNsb3dQYXRoTG9jaywgRmxhZ3MpOworCQorCQlpZiAocEFDLT5kZXZbdC0xXSA9PSBkZXYpIHsKKwkJCVNLX1BOTUlfU1RBVAkqcFBubWlTdGF0ID0gJnBQbm1pU3RydWN0LT5TdGF0WzBdOworCisJCQlzZXFfcHJpbnRmKHNlcSwgIlxuRGV0YWlsZWQgc3RhdGlzdGljIGZvciBkZXZpY2UgJXNcbiIsCisJCQkJICAgICAgcEFDLT5kZXZbdC0xXS0+bmFtZSk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJCisJCQkvKiBCb2FyZCBzdGF0aXN0aWNzICovCisJCQlzZXFfcHJpbnRmKHNlcSwgIlxuQm9hcmQgc3RhdGlzdGljc1xuXG4iKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiQWN0aXZlIFBvcnQgICAgICAgICAgICAgICAgICAgICVjXG4iLAorCQkJCSAgICAgICdBJyArIHBBQy0+UmxtdC5OZXRbdC0xXS5Qb3J0W3BBQy0+UmxtdC4KKwkJCQkJCQkJICAgIE5ldFt0LTFdLlByZWZQb3J0XS0+UG9ydE51bWJlcik7CisJCQlzZXFfcHJpbnRmKHNlcSwgIlByZWZlcnJlZCBQb3J0ICAgICAgICAgICAgICAgICAlY1xuIiwKKwkJCQkgICAgICAnQScgKyBwQUMtPlJsbXQuTmV0W3QtMV0uUG9ydFtwQUMtPlJsbXQuCisJCQkJCQkJCSAgICBOZXRbdC0xXS5QcmVmUG9ydF0tPlBvcnROdW1iZXIpOworCisJCQlzZXFfcHJpbnRmKHNlcSwgIkJ1cyBzcGVlZCAoTUh6KSAgICAgICAgICAgICAgICAlZFxuIiwKKwkJCQkgICAgICBwUG5taVN0cnVjdC0+QnVzU3BlZWQpOworCisJCQlzZXFfcHJpbnRmKHNlcSwgIkJ1cyB3aWR0aCAoQml0KSAgICAgICAgICAgICAgICAlZFxuIiwKKwkJCQkgICAgICBwUG5taVN0cnVjdC0+QnVzV2lkdGgpOworCQkJc2VxX3ByaW50ZihzZXEsICJEcml2ZXIgdmVyc2lvbiAgICAgICAgICAgICAgICAgJXNcbiIsCisJCQkJICAgICAgVkVSX1NUUklORyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIkhhcmR3YXJlIHJldmlzaW9uICAgICAgICAgICAgICB2JWQuJWRcbiIsCisJCQkJICAgICAgKHBBQy0+R0luaS5HSVBjaUh3UmV2ID4+IDQpICYgMHgwRiwKKwkJCQkgICAgICBwQUMtPkdJbmkuR0lQY2lId1JldiAmIDB4MEYpOworCisJCQkvKiBQcmludCBzZW5zb3IgaW5mb3JtYXRpb25zICovCisJCQlmb3IgKGk9MDsgaSA8IHBBQy0+STJjLk1heFNlbnM7IGkgKyspIHsKKwkJCQkvKiBDaGVjayB0eXBlICovCisJCQkJc3dpdGNoIChwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5UeXBlKSB7CisJCQkJY2FzZSAxOgorCQkJCQlzdHJjcHkoc2Vuc19tc2csIHBBQy0+STJjLlNlblRhYmxlW2ldLlNlbkRlc2MpOworCQkJCQlzdHJjYXQoc2Vuc19tc2csICIgKEMpIik7CisJCQkJCXNlcV9wcmludGYoc2VxLCAiJS0yNXMgICAgICAlZC4lMDJkXG4iLAorCQkJCQkJICAgICAgc2Vuc19tc2csCisJCQkJCQkgICAgICBwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5WYWx1ZSAvIDEwLAorCQkJCQkJICAgICAgcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVmFsdWUgJSAxMCk7CisKKwkJCQkJc3RyY3B5KHNlbnNfbXNnLCBwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5EZXNjKTsKKwkJCQkJc3RyY2F0KHNlbnNfbXNnLCAiIChGKSIpOworCQkJCQlzZXFfcHJpbnRmKHNlcSwgIiUtMjVzICAgICAgJWQuJTAyZFxuIiwKKwkJCQkJCSAgICAgIHNlbnNfbXNnLAorCQkJCQkJICAgICAgKCgoKHBBQy0+STJjLlNlblRhYmxlW2ldLlNlblZhbHVlKQorCQkJCQkJCSAqMTApKjkpLzUgKyAzMjAwKS8xMDAsCisJCQkJCQkgICAgICAoKCgocEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVmFsdWUpCisJCQkJCQkJICoxMCkqOSkvNSArIDMyMDApICUgMTApOworCQkJCQlicmVhazsKKwkJCQljYXNlIDI6CisJCQkJCXN0cmNweShzZW5zX21zZywgcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuRGVzYyk7CisJCQkJCXN0cmNhdChzZW5zX21zZywgIiAoVikiKTsKKwkJCQkJc2VxX3ByaW50ZihzZXEsICIlLTI1cyAgICAgICVkLiUwM2RcbiIsCisJCQkJCQkgICAgICBzZW5zX21zZywKKwkJCQkJCSAgICAgIHBBQy0+STJjLlNlblRhYmxlW2ldLlNlblZhbHVlIC8gMTAwMCwKKwkJCQkJCSAgICAgIHBBQy0+STJjLlNlblRhYmxlW2ldLlNlblZhbHVlICUgMTAwMCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMzoKKwkJCQkJc3RyY3B5KHNlbnNfbXNnLCBwQUMtPkkyYy5TZW5UYWJsZVtpXS5TZW5EZXNjKTsKKwkJCQkJc3RyY2F0KHNlbnNfbXNnLCAiIChycG0pIik7CisJCQkJCXNlcV9wcmludGYoc2VxLCAiJS0yNXMgICAgICAlZFxuIiwKKwkJCQkJCSAgICAgIHNlbnNfbXNnLAorCQkJCQkJICAgICAgcEFDLT5JMmMuU2VuVGFibGVbaV0uU2VuVmFsdWUpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQkJCisJCQkvKlJlY2VpdmUgc3RhdGlzdGljcyAqLworCQkJc2VxX3ByaW50ZihzZXEsICJcblJlY2VpdmUgc3RhdGlzdGljc1xuXG4iKTsKKworCQkJc2VxX3ByaW50ZihzZXEsICJSZWNlaXZlZCBieXRlcyAgICAgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFJ4T2N0ZXRzT2tDdHMpOworCQkJc2VxX3ByaW50ZihzZXEsICJSZWNlaXZlZCBwYWNrZXRzICAgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFJ4T2tDdHMpOworI2lmIDAKKwkJCWlmIChwQUMtPkdJbmkuR1BbMF0uUGh5VHlwZSA9PSBTS19QSFlfWE1BQyAmJiAKKwkJCSAgICBwQUMtPkhXUmV2aXNpb24gPCAxMikgeworCQkJCXBQbm1pU3RydWN0LT5JbkVycm9yc0N0cyA9IHBQbm1pU3RydWN0LT5JbkVycm9yc0N0cyAtIAorCQkJCQlwUG5taVN0YXQtPlN0YXRSeFNob3J0c0N0czsKKwkJCQlwUG5taVN0YXQtPlN0YXRSeFNob3J0c0N0cyA9IDA7CisJCQl9CisjZW5kaWYKKwkJCWlmIChkZXYtPm10dSA+IDE1MDApCisJCQkJcFBubWlTdHJ1Y3QtPkluRXJyb3JzQ3RzID0gcFBubWlTdHJ1Y3QtPkluRXJyb3JzQ3RzIC0KKwkJCQkJcFBubWlTdGF0LT5TdGF0UnhUb29Mb25nQ3RzOworCisJCQlzZXFfcHJpbnRmKHNlcSwgIlJlY2VpdmUgZXJyb3JzICAgICAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdHJ1Y3QtPkluRXJyb3JzQ3RzKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiUmVjZWl2ZSBkcm9wcGVkICAgICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0cnVjdC0+UnhOb0J1ZkN0cyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIlJlY2VpdmVkIG11bHRpY2FzdCAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0UnhNdWx0aWNhc3RPa0N0cyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIlJlY2VpdmUgZXJyb3IgdHlwZXNcbiIpOworCQkJc2VxX3ByaW50ZihzZXEsICIgICBsZW5ndGggICAgICAgICAgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFJ4UnVudEN0cyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgIGJ1ZmZlciBvdmVyZmxvdyAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0UnhGaWZvT3ZlcmZsb3dDdHMpOworCQkJc2VxX3ByaW50ZihzZXEsICIgICBiYWQgY3JjICAgICAgICAgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFJ4RmNzQ3RzKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgZnJhbWluZyAgICAgICAgICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRSeEZyYW1pbmdDdHMpOworCQkJc2VxX3ByaW50ZihzZXEsICIgICBtaXNzZWQgZnJhbWVzICAgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFJ4TWlzc2VkQ3RzKTsKKworCQkJaWYgKGRldi0+bXR1ID4gMTUwMCkKKwkJCQlwUG5taVN0YXQtPlN0YXRSeFRvb0xvbmdDdHMgPSAwOworCisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgIHRvbyBsb25nICAgICAgICAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0UnhUb29Mb25nQ3RzKTsJCQkJCQorCQkJc2VxX3ByaW50ZihzZXEsICIgICBjYXJyaWVyIGV4dGVuc2lvbiAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFJ4Q2V4dEN0cyk7CQkJCQorCQkJc2VxX3ByaW50ZihzZXEsICIgICB0b28gc2hvcnQgICAgICAgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFJ4U2hvcnRzQ3RzKTsJCQkJCisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgIHN5bWJvbCAgICAgICAgICAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0UnhTeW1ib2xDdHMpOwkJCQkKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgTExDIE1BQyBzaXplICAgICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRSeElSTGVuZ3RoQ3RzKTsJCQkJCisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgIGNhcnJpZXIgZXZlbnQgICAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0UnhDYXJyaWVyQ3RzKTsJCQkJCisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgIGphYmJlciAgICAgICAgICAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0UnhKYWJiZXJDdHMpOwkJCQkKKworCisJCQkvKlRyYW5zbWl0IHN0YXRpc3RpY3MgKi8KKwkJCXNlcV9wcmludGYoc2VxLCAiXG5UcmFuc21pdCBzdGF0aXN0aWNzXG5cbiIpOworCQkJCQorCQkJc2VxX3ByaW50ZihzZXEsICJUcmFuc21pdGVkIGJ5dGVzICAgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFR4T2N0ZXRzT2tDdHMpOworCQkJc2VxX3ByaW50ZihzZXEsICJUcmFuc21pdGVkIHBhY2tldHMgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFR4T2tDdHMpOworCQkJc2VxX3ByaW50ZihzZXEsICJUcmFuc21pdCBlcnJvcnMgICAgICAgICAgICAgICAgJUx1XG4iLAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBQbm1pU3RhdC0+U3RhdFR4U2luZ2xlQ29sbGlzaW9uQ3RzKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiVHJhbnNtaXQgZHJvcHBlZCAgICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0cnVjdC0+VHhOb0J1ZkN0cyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIlRyYW5zbWl0IGNvbGxpc2lvbnMgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0VHhTaW5nbGVDb2xsaXNpb25DdHMpOworCQkJc2VxX3ByaW50ZihzZXEsICJUcmFuc21pdCBlcnJvciB0eXBlc1xuIik7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgIGV4Y2Vzc2l2ZSBjb2xsaXNpb24gICAgICAgICAlbGRcbiIsCisJCQkJICAgICAgcEFDLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgIGNhcnJpZXIgICAgICAgICAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0VHhDYXJyaWVyQ3RzKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgZmlmbyB1bmRlcnJ1biAgICAgICAgICAgICAgICVMdVxuIiwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwUG5taVN0YXQtPlN0YXRUeEZpZm9VbmRlcnJ1bkN0cyk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgIGhlYXJ0YmVhdCAgICAgICAgICAgICAgICAgICAlTHVcbiIsCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcFBubWlTdGF0LT5TdGF0VHhDYXJyaWVyQ3RzKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgd2luZG93ICAgICAgICAgICAgICAgICAgICAgICVsZFxuIiwKKwkJCQkgICAgICBwQUMtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMpOworCQkJCQorCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgIHNrX3Byb2Nfb3BlbiAtIHJlZ2lzdGVyIHRoZSBzaG93IGZ1bmN0aW9uIHdoZW4gcHJvYyBpcyBvcGVuJ2VkCisgKiAgCisgKiBEZXNjcmlwdGlvbjoKKyAqICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBhIHNrOThsaW4gcHJvYyBmaWxlIGlzIHF1ZXJpZWQuCisgKiAgCisgKiBSZXR1cm5zOiB0aGUgcmV0dXJuIHZhbHVlIG9mIHNpbmdsZV9vcGVuKCkKKyAqICAgICAgCisgKi8KK3N0YXRpYyBpbnQgc2tfcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworICAgIHJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBza19zZXFfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRW5kIG9mIGZpbGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za3F1ZXVlLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrcXVldWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjc1YjRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za3F1ZXVlLmMKQEAgLTAsMCArMSwxNzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza3F1ZXVlLmMKKyAqIFByb2plY3Q6CUdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcnMsIEV2ZW50IFNjaGVkdWxlciBNb2R1bGUKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4yMCAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wOS8xNiAxMzo0NDowMCAkCisgKiBQdXJwb3NlOglNYW5hZ2VtZW50IG9mIGFuIGV2ZW50IHF1ZXVlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAyIFN5c0tvbm5lY3QgR21iSC4KKyAqCShDKUNvcHlyaWdodCAyMDAyLTIwMDMgTWFydmVsbC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKyAqCUV2ZW50IHF1ZXVlIGFuZCBkaXNwYXRjaGVyCisgKi8KKyNpZiAoZGVmaW5lZChERUJVRykgfHwgKCghZGVmaW5lZChMSU5UKSkgJiYgKCFkZWZpbmVkKFNLX1NMSU0pKSkpCitzdGF0aWMgY29uc3QgY2hhciBTeXNLb25uZWN0RmlsZUlkW10gPQorCSJAKCMpICRJZDogc2txdWV1ZS5jLHYgMS4yMCAyMDAzLzA5LzE2IDEzOjQ0OjAwIHJzY2htaWR0IEV4cCAkIChDKSBNYXJ2ZWxsLiI7CisjZW5kaWYKKworI2luY2x1ZGUgImgvc2tkcnYxc3QuaCIJCS8qIERyaXZlciBTcGVjaWZpYyBEZWZpbml0aW9ucyAqLworI2luY2x1ZGUgImgvc2txdWV1ZS5oIgkJLyogUXVldWUgRGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJoL3NrZHJ2Mm5kLmgiCQkvKiBBZGFwdGVyIENvbnRyb2wtIGFuZCBEcml2ZXIgc3BlY2lmaWMgRGVmLiAqLworCisjaWZkZWYgX19DMk1BTl9fCisvKgorCUV2ZW50IHF1ZXVlIG1hbmFnZW1lbnQuCisKKwlHZW5lcmFsIERlc2NyaXB0aW9uOgorCisgKi8KK2ludHJvKCkKK3t9CisjZW5kaWYKKworI2RlZmluZSBQUklOVEYoYSxiLGMpCisKKy8qCisgKiBpbml0IGV2ZW50IHF1ZXVlIG1hbmFnZW1lbnQKKyAqCisgKiBNdXN0IGJlIGNhbGxlZCBkdXJpbmcgaW5pdCBsZXZlbCAwLgorICovCit2b2lkCVNrRXZlbnRJbml0KAorU0tfQUMJKnBBQywJLyogQWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9jLAkvKiBJTyBjb250ZXh0ICovCitpbnQJCUxldmVsKQkvKiBJbml0IGxldmVsICovCit7CisJc3dpdGNoIChMZXZlbCkgeworCWNhc2UgU0tfSU5JVF9EQVRBOgorCQlwQUMtPkV2ZW50LkV2UHV0ID0gcEFDLT5FdmVudC5FdkdldCA9IHBBQy0+RXZlbnQuRXZRdWV1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogYWRkIGV2ZW50IHRvIHF1ZXVlCisgKi8KK3ZvaWQJU2tFdmVudFF1ZXVlKAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXJzIGNvbnRleHQgKi8KK1NLX1UzMgkJQ2xhc3MsCS8qIEV2ZW50IENsYXNzICovCitTS19VMzIJCUV2ZW50LAkvKiBFdmVudCB0byBiZSBxdWV1ZWQgKi8KK1NLX0VWUEFSQQlQYXJhKQkvKiBFdmVudCBwYXJhbWV0ZXIgKi8KK3sKKwlwQUMtPkV2ZW50LkV2UHV0LT5DbGFzcyA9IENsYXNzOworCXBBQy0+RXZlbnQuRXZQdXQtPkV2ZW50ID0gRXZlbnQ7CisJcEFDLT5FdmVudC5FdlB1dC0+UGFyYSA9IFBhcmE7CisJCisJaWYgKCsrcEFDLT5FdmVudC5FdlB1dCA9PSAmcEFDLT5FdmVudC5FdlF1ZXVlW1NLX01BWF9FVkVOVF0pCisJCXBBQy0+RXZlbnQuRXZQdXQgPSBwQUMtPkV2ZW50LkV2UXVldWU7CisKKwlpZiAocEFDLT5FdmVudC5FdlB1dCA9PSBwQUMtPkV2ZW50LkV2R2V0KSB7CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9OT1JFUywgU0tFUlJfUV9FMDAxLCBTS0VSUl9RX0UwMDFNU0cpOworCX0KK30KKworLyoKKyAqIGV2ZW50IGRpc3BhdGNoZXIKKyAqCXdoaWxlIGV2ZW50IHF1ZXVlIGlzIG5vdCBlbXB0eQorICoJCWdldCBldmVudCBmcm9tIHF1ZXVlCisgKgkJc2VuZCBjb21tYW5kIHRvIHN0YXRlIG1hY2hpbmUKKyAqCWVuZAorICoJcmV0dXJuIGVycm9yIHJlcG9ydGVkIGJ5IGluZGl2aWR1YWwgRXZlbnQgZnVuY3Rpb24KKyAqCQkwIGlmIG5vIGVycm9yIG9jY3VyZWQuCisgKi8KK2ludAlTa0V2ZW50RGlzcGF0Y2hlcigKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXJzIENvbnRleHQgKi8KK1NLX0lPQwlJb2MpCS8qIElvIGNvbnRleHQgKi8KK3sKKwlTS19FVkVOVEVMRU0JKnBFdjsJLyogcG9pbnRlciBpbnRvIHF1ZXVlICovCisJU0tfVTMyCQkJQ2xhc3M7CisJaW50CQkJUnR2OworCisJcEV2ID0gcEFDLT5FdmVudC5FdkdldDsKKwkKKwlQUklOVEYoImRpc3BhdGNoIGdldCAleCBwdXQgJXhcbiIsIHBFdiwgcEFDLT5FdmVudC5ldl9wdXQpOworCQorCXdoaWxlIChwRXYgIT0gcEFDLT5FdmVudC5FdlB1dCkgeworCQlQUklOVEYoImRpc3BhdGNoIENsYXNzICVkIEV2ZW50ICVkXG4iLCBwRXYtPkNsYXNzLCBwRXYtPkV2ZW50KTsKKworCQlzd2l0Y2ggKENsYXNzID0gcEV2LT5DbGFzcykgeworI2lmbmRlZiBTS19VU0VfTEFDX0VWCisjaWZuZGVmIFNLX1NMSU0KKwkJY2FzZSBTS0dFX1JMTVQ6CQkvKiBSTE1UIEV2ZW50ICovCisJCQlSdHYgPSBTa1JsbXRFdmVudChwQUMsIElvYywgcEV2LT5FdmVudCwgcEV2LT5QYXJhKTsKKwkJCWJyZWFrOworCQljYXNlIFNLR0VfSTJDOgkJLyogSTJDIEV2ZW50ICovCisJCQlSdHYgPSBTa0kyY0V2ZW50KHBBQywgSW9jLCBwRXYtPkV2ZW50LCBwRXYtPlBhcmEpOworCQkJYnJlYWs7CisJCWNhc2UgU0tHRV9QTk1JOgkJLyogUE5NSSBFdmVudCAqLworCQkJUnR2ID0gU2tQbm1pRXZlbnQocEFDLCBJb2MsIHBFdi0+RXZlbnQsIHBFdi0+UGFyYSk7CisJCQlicmVhazsKKyNlbmRpZgkvKiBub3QgU0tfU0xJTSAqLworI2VuZGlmCS8qIG5vdCBTS19VU0VfTEFDX0VWICovCisJCWNhc2UgU0tHRV9EUlY6CQkvKiBEcml2ZXIgRXZlbnQgKi8KKwkJCVJ0diA9IFNrRHJ2RXZlbnQocEFDLCBJb2MsIHBFdi0+RXZlbnQsIHBFdi0+UGFyYSk7CisJCQlicmVhazsKKyNpZm5kZWYgU0tfVVNFX1NXX1RJTUVSCisJCWNhc2UgU0tHRV9IV0FDOgorCQkJUnR2ID0gU2tHZVNpcnFFdmVudChwQUMsIElvYywgcEV2LT5FdmVudCwgcEV2LT5QYXJhKTsKKwkJCWJyZWFrOworI2Vsc2UgLyogIVNLX1VTRV9TV19USU1FUiAqLworICAgICAgICBjYXNlIFNLR0VfU1dUIDoKKwkJCVJ0diA9IFNrU3d0RXZlbnQocEFDLCBJb2MsIHBFdi0+RXZlbnQsIHBFdi0+UGFyYSk7CisJCQlicmVhazsKKyNlbmRpZiAvKiAhU0tfVVNFX1NXX1RJTUVSICovCisjaWZkZWYgU0tfVVNFX0xBQ19FVgorCQljYXNlIFNLR0VfTEFDUCA6CisJCQlSdHYgPSBTa0xhY3BFdmVudChwQUMsIElvYywgcEV2LT5FdmVudCwgcEV2LT5QYXJhKTsKKwkJCWJyZWFrOworCQljYXNlIFNLR0VfUlNGIDoKKwkJCVJ0diA9IFNrUnNmRXZlbnQocEFDLCBJb2MsIHBFdi0+RXZlbnQsIHBFdi0+UGFyYSk7CisJCQlicmVhazsKKwkJY2FzZSBTS0dFX01BUktFUiA6CisJCQlSdHYgPSBTa01hcmtlckV2ZW50KHBBQywgSW9jLCBwRXYtPkV2ZW50LCBwRXYtPlBhcmEpOworCQkJYnJlYWs7CisJCWNhc2UgU0tHRV9GRCA6CisJCQlSdHYgPSBTa0ZkRXZlbnQocEFDLCBJb2MsIHBFdi0+RXZlbnQsIHBFdi0+UGFyYSk7CisJCQlicmVhazsKKyNlbmRpZiAvKiBTS19VU0VfTEFDX0VWICovCisjaWZkZWYJU0tfVVNFX0NTVU0KKwkJY2FzZSBTS0dFX0NTVU0gOgorCQkJUnR2ID0gU2tDc0V2ZW50KHBBQywgSW9jLCBwRXYtPkV2ZW50LCBwRXYtPlBhcmEpOworCQkJYnJlYWs7CisjZW5kaWYJLyogU0tfVVNFX0NTVU0gKi8KKwkJZGVmYXVsdCA6CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX1FfRTAwMiwgU0tFUlJfUV9FMDAyTVNHKTsKKwkJCVJ0diA9IDA7CisJCX0KKworCQlpZiAoUnR2ICE9IDApIHsKKwkJCXJldHVybihSdHYpOworCQl9CisKKwkJaWYgKCsrcEV2ID09ICZwQUMtPkV2ZW50LkV2UXVldWVbU0tfTUFYX0VWRU5UXSkKKwkJCXBFdiA9IHBBQy0+RXZlbnQuRXZRdWV1ZTsKKworCQkvKiBSZW5ldyBnZXQ6IGl0IGlzIHVzZWQgaW4gcXVldWVfZXZlbnRzIHRvIGRldGVjdCBvdmVycnVucyAqLworCQlwQUMtPkV2ZW50LkV2R2V0ID0gcEV2OworCX0KKworCXJldHVybigwKTsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tybG10LmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrcmxtdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYTExYWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrcmxtdC5jCkBAIC0wLDAgKzEsMzI1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNrcmxtdC5jCisgKiBQcm9qZWN0OglHRW5lc2lzLCBQQ0kgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyCisgKiBWZXJzaW9uOgkkUmV2aXNpb246IDEuNjkgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMDQvMTUgMDk6Mzk6MjIgJAorICogUHVycG9zZToJTWFuYWdlIGxpbmtzIG9uIFNLLU5FVCBBZGFwdGVycywgZXNwLiByZWR1bmRhbnQgb25lcy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogVGhpcyBtb2R1bGUgY29udGFpbnMgY29kZSBmb3IgTGluayBNYW5hZ2VtZW5UIChMTVQpIG9mIFNLLU5FVCBBZGFwdGVycy4KKyAqIEl0IGlzIG1haW5seSBpbnRlbmRlZCBmb3IgYWRhcHRlcnMgd2l0aCBtb3JlIHRoYW4gb25lIGxpbmsuCisgKiBGb3Igc3VjaCBhZGFwdGVycywgdGhpcyBtb2R1bGUgcmVhbGl6ZXMgUmVkdW5kYW50IExpbmsgTWFuYWdlbWVuVCAoUkxNVCkuCisgKgorICogSW5jbHVkZSBGaWxlIEhpZXJhcmNoeToKKyAqCisgKgkic2tkcnYxc3QuaCIKKyAqCSJza2RydjJuZC5oIgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYJbGludAorc3RhdGljIGNvbnN0IGNoYXIgU3lzS29ubmVjdEZpbGVJZFtdID0KKwkiQCgjKSAkSWQ6IHNrcmxtdC5jLHYgMS42OSAyMDAzLzA0LzE1IDA5OjM5OjIyIHRzY2hpbGxpIEV4cCAkIChDKSBNYXJ2ZWxsLiI7CisjZW5kaWYJLyogIWRlZmluZWQobGludCkgKi8KKworI2RlZmluZSBfX1NLUkxNVF9DCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYJLyogY3BsdXNwbHVzICovCisKKyNpbmNsdWRlICJoL3NrZHJ2MXN0LmgiCisjaW5jbHVkZSAiaC9za2RydjJuZC5oIgorCisvKiBkZWZpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFNLX0hXQUNfTElOS19MRUQKKyNkZWZpbmUgU0tfSFdBQ19MSU5LX0xFRChhLGIsYyxkKQorI2VuZGlmCS8qICFkZWZpbmVkKFNLX0hXQUNfTElOS19MRUQpICovCisKKyNpZm5kZWYgREVCVUcKKyNkZWZpbmUgUkxNVF9TVEFUSUMJc3RhdGljCisjZWxzZQkvKiBERUJVRyAqLworI2RlZmluZSBSTE1UX1NUQVRJQworCisjaWZuZGVmIFNLX0xJVFRMRV9FTkRJQU4KKy8qIEZpcnN0IDMyIGJpdHMgKi8KKyNkZWZpbmUgT0ZGU19MTzMyCTEKKworLyogU2Vjb25kIDMyIGJpdHMgKi8KKyNkZWZpbmUgT0ZGU19ISTMyCTAKKyNlbHNlCS8qIFNLX0xJVFRMRV9FTkRJQU4gKi8KKy8qIEZpcnN0IDMyIGJpdHMgKi8KKyNkZWZpbmUgT0ZGU19MTzMyCTAKKworLyogU2Vjb25kIDMyIGJpdHMgKi8KKyNkZWZpbmUgT0ZGU19ISTMyCTEKKyNlbmRpZgkvKiBTS19MSVRUTEVfRU5ESUFOICovCisKKyNlbmRpZgkvKiBERUJVRyAqLworCisvKiAtLS0tLSBQcml2YXRlIHRpbWVvdXQgdmFsdWVzIC0tLS0tICovCisKKyNkZWZpbmUgU0tfUkxNVF9NSU5fVE9fVkFMCQkJICAgMTI1MDAwCS8qIDEvOCBzZWMuICovCisjZGVmaW5lIFNLX1JMTVRfREVGX1RPX1ZBTAkJCSAgMTAwMDAwMAkvKiAxIHNlYy4gKi8KKyNkZWZpbmUgU0tfUkxNVF9QT1JURE9XTl9USU1fVkFMCSAgIDkwMDAwMAkvKiBhbm90aGVyIDAuOSBzZWMuICovCisjZGVmaW5lIFNLX1JMTVRfUE9SVFNUQVJUX1RJTV9WQUwJICAgMTAwMDAwCS8qIDAuMSBzZWMuICovCisjZGVmaW5lIFNLX1JMTVRfUE9SVFVQX1RJTV9WQUwJCSAgMjUwMDAwMAkvKiAyLjUgc2VjLiAqLworI2RlZmluZSBTS19STE1UX1NFR19UT19WQUwJCQk5MDAwMDAwMDAJLyogMTUgbWluLiAqLworCisvKiBBc3N1bWUgdGljayBjb3VudGVyIGluY3JlbWVudCBpcyAxIC0gbWF5IGJlIHNldCBPUy1kZXBlbmRlbnQuICovCisjaWZuZGVmIFNLX1RJQ0tfSU5DUgorI2RlZmluZSBTS19USUNLX0lOQ1IJU0tfQ09OU1RVNjQoMSkKKyNlbmRpZgkvKiAhZGVmaW5lZChTS19USUNLX0lOQ1IpICovCisKKy8qCisgKiBBbW91bnQgdGhhdCBhIHRpbWUgc3RhbXAgbXVzdCBiZSBsYXRlciB0byBiZSByZWNvZ25pemVkIGFzICJzdWJzdGFudGlhbGx5CisgKiBsYXRlciIuIFRoaXMgaXMgYWJvdXQgMS8xMjggc2VjLCBidXQgYWJvdmUgMSB0aWNrIGNvdW50ZXIgaW5jcmVtZW50LgorICovCisjZGVmaW5lIFNLX1JMTVRfQkNfREVMVEEJCSgxICsgKChTS19USUNLU19QRVJfU0VDID4+IDcpID4gU0tfVElDS19JTkNSID8gXAorCQkJCQkJCQkJKFNLX1RJQ0tTX1BFUl9TRUMgPj4gNykgOiBTS19USUNLX0lOQ1IpKQorCisvKiAtLS0tLSBQcml2YXRlIFJMTVQgZGVmYXVsdHMgLS0tLS0gKi8KKworI2RlZmluZSBTS19STE1UX0RFRl9QUkVGX1BPUlQJMAkJCQkJLyogIkxvd2VyIiBwb3J0LiAqLworI2RlZmluZSBTS19STE1UX0RFRl9NT0RFIAkJU0tfUkxNVF9DSEVDS19MSU5LCS8qIERlZmF1bHQgUkxNVCBNb2RlLiAqLworCisvKiAtLS0tLSBQcml2YXRlIFJMTVQgY2hlY2tpbmcgc3RhdGVzIC0tLS0tICovCisKKyNkZWZpbmUgU0tfUkxNVF9SQ1NfU0VHCQkJMQkJLyogUkxNVCBDaGVjayBTdGF0ZTogY2hlY2sgc2VnLiAqLworI2RlZmluZSBTS19STE1UX1JDU19TVEFSVF9TRUcJMgkJLyogUkxNVCBDaGVjayBTdGF0ZTogc3RhcnQgY2hlY2sgc2VnLiAqLworI2RlZmluZSBTS19STE1UX1JDU19TRU5EX1NFRwk0CQkvKiBSTE1UIENoZWNrIFN0YXRlOiBzZW5kIEJQRFUgcGFja2V0ICovCisjZGVmaW5lIFNLX1JMTVRfUkNTX1JFUE9SVF9TRUcJOAkJLyogUkxNVCBDaGVjayBTdGF0ZTogcmVwb3J0IHNlZy4gKi8KKworLyogLS0tLS0gUHJpdmF0ZSBQT1JUIGNoZWNraW5nIHN0YXRlcyAtLS0tLSAqLworCisjZGVmaW5lIFNLX1JMTVRfUENTX1RYCQkJMQkJLyogUG9ydCBDaGVjayBTdGF0ZTogY2hlY2sgdHguICovCisjZGVmaW5lIFNLX1JMTVRfUENTX1JYCQkJMgkJLyogUG9ydCBDaGVjayBTdGF0ZTogY2hlY2sgcnguICovCisKKy8qIC0tLS0tIFByaXZhdGUgUE9SVCBldmVudHMgLS0tLS0gKi8KKworLyogTm90ZTogVXBkYXRlIHNpbXVsYXRpb24gd2hlbiBjaGFuZ2luZyB0aGVzZS4gKi8KKyNkZWZpbmUgU0tfUkxNVF9QT1JUU1RBUlRfVElNCTExMDAJLyogUG9ydCBzdGFydCB0aW1lb3V0LiAqLworI2RlZmluZSBTS19STE1UX1BPUlRVUF9USU0JCTExMDEJLyogUG9ydCBjYW4gbm93IGdvIHVwLiAqLworI2RlZmluZSBTS19STE1UX1BPUlRET1dOX1JYX1RJTQkxMTAyCS8qIFBvcnQgZGlkIG5vdCByZWNlaXZlIG9uY2UgLi4uICovCisjZGVmaW5lIFNLX1JMTVRfUE9SVERPV04JCTExMDMJLyogUG9ydCB3ZW50IGRvd24uICovCisjZGVmaW5lIFNLX1JMTVRfUE9SVERPV05fVFhfVElNCTExMDQJLyogUGFydG5lciBkaWQgbm90IHJlY2VpdmUgLi4uICovCisKKy8qIC0tLS0tIFByaXZhdGUgUkxNVCBldmVudHMgLS0tLS0gKi8KKworLyogTm90ZTogVXBkYXRlIHNpbXVsYXRpb24gd2hlbiBjaGFuZ2luZyB0aGVzZS4gKi8KKyNkZWZpbmUgU0tfUkxNVF9USU0JCQkJMjEwMAkvKiBSTE1UIHRpbWVvdXQuICovCisjZGVmaW5lIFNLX1JMTVRfU0VHX1RJTQkJCTIxMDEJLyogUkxNVCBzZWdtZW50YXRpb24gY2hlY2sgdGltZW91dC4gKi8KKworI2RlZmluZSBUT19TSE9SVEVOKHRpbSkJKCh0aW0pIC8gMikKKworLyogRXJyb3IgbnVtYmVycyBhbmQgbWVzc2FnZXMuICovCisjZGVmaW5lIFNLRVJSX1JMTVRfRTAwMQkJKFNLX0VSUkJBU0VfUkxNVCArIDApCisjZGVmaW5lIFNLRVJSX1JMTVRfRTAwMV9NU0cJIk5vIFBhY2tldC4iCisjZGVmaW5lIFNLRVJSX1JMTVRfRTAwMgkJKFNLRVJSX1JMTVRfRTAwMSArIDEpCisjZGVmaW5lIFNLRVJSX1JMTVRfRTAwMl9NU0cJIlNob3J0IFBhY2tldC4iCisjZGVmaW5lIFNLRVJSX1JMTVRfRTAwMwkJKFNLRVJSX1JMTVRfRTAwMiArIDEpCisjZGVmaW5lIFNLRVJSX1JMTVRfRTAwM19NU0cJIlVua25vd24gUkxNVCBldmVudC4iCisjZGVmaW5lIFNLRVJSX1JMTVRfRTAwNAkJKFNLRVJSX1JMTVRfRTAwMyArIDEpCisjZGVmaW5lIFNLRVJSX1JMTVRfRTAwNF9NU0cJIlBvcnRzVXAgaW5jb3JyZWN0LiIKKyNkZWZpbmUgU0tFUlJfUkxNVF9FMDA1CQkoU0tFUlJfUkxNVF9FMDA0ICsgMSkKKyNkZWZpbmUgU0tFUlJfUkxNVF9FMDA1X01TRwlcCisgIk5ldCBzZWVtcyB0byBiZSBzZWdtZW50ZWQgKGRpZmZlcmVudCByb290IGJyaWRnZXMgYXJlIHJlcG9ydGVkIG9uIHRoZSBwb3J0cykuIgorI2RlZmluZSBTS0VSUl9STE1UX0UwMDYJCShTS0VSUl9STE1UX0UwMDUgKyAxKQorI2RlZmluZSBTS0VSUl9STE1UX0UwMDZfTVNHCSJEdXBsaWNhdGUgTUFDIEFkZHJlc3MgZGV0ZWN0ZWQuIgorI2RlZmluZSBTS0VSUl9STE1UX0UwMDcJCShTS0VSUl9STE1UX0UwMDYgKyAxKQorI2RlZmluZSBTS0VSUl9STE1UX0UwMDdfTVNHCSJMaW5rc1VwIGluY29ycmVjdC4iCisjZGVmaW5lIFNLRVJSX1JMTVRfRTAwOAkJKFNLRVJSX1JMTVRfRTAwNyArIDEpCisjZGVmaW5lIFNLRVJSX1JMTVRfRTAwOF9NU0cJIlBvcnQgbm90IHN0YXJ0ZWQgYnV0IGxpbmsgY2FtZSB1cC4iCisjZGVmaW5lIFNLRVJSX1JMTVRfRTAwOQkJKFNLRVJSX1JMTVRfRTAwOCArIDEpCisjZGVmaW5lIFNLRVJSX1JMTVRfRTAwOV9NU0cJIkNvcnJlY3RlZCBpbGxlZ2FsIHNldHRpbmcgb2YgUHJlZmVycmVkIFBvcnQuIgorI2RlZmluZSBTS0VSUl9STE1UX0UwMTAJCShTS0VSUl9STE1UX0UwMDkgKyAxKQorI2RlZmluZSBTS0VSUl9STE1UX0UwMTBfTVNHCSJJZ25vcmVkIGlsbGVnYWwgUHJlZmVycmVkIFBvcnQuIgorCisvKiBMTEMgZmllbGQgdmFsdWVzLiAqLworI2RlZmluZSBMTENfQ09NTUFORF9SRVNQT05TRV9CSVQJCTEKKyNkZWZpbmUgTExDX1RFU1RfQ09NTUFORAkJCQkweEUzCisjZGVmaW5lIExMQ19VSQkJCQkJCQkweDAzCisKKy8qIFJMTVQgUGFja2V0IGZpZWxkcy4gKi8KKyNkZWZpbmUJU0tfUkxNVF9EU0FQCQkJCQkwCisjZGVmaW5lCVNLX1JMTVRfU1NBUAkJCQkJMAorI2RlZmluZSBTS19STE1UX0NUUkwJCQkJCShMTENfVEVTVF9DT01NQU5EKQorI2RlZmluZSBTS19STE1UX0lORElDQVRPUjAJCQkJMHg1MwkvKiBTICovCisjZGVmaW5lIFNLX1JMTVRfSU5ESUNBVE9SMQkJCQkweDRCCS8qIEsgKi8KKyNkZWZpbmUgU0tfUkxNVF9JTkRJQ0FUT1IyCQkJCTB4MkQJLyogLSAqLworI2RlZmluZSBTS19STE1UX0lORElDQVRPUjMJCQkJMHg1MgkvKiBSICovCisjZGVmaW5lIFNLX1JMTVRfSU5ESUNBVE9SNAkJCQkweDRDCS8qIEwgKi8KKyNkZWZpbmUgU0tfUkxNVF9JTkRJQ0FUT1I1CQkJCTB4NEQJLyogTSAqLworI2RlZmluZSBTS19STE1UX0lORElDQVRPUjYJCQkJMHg1NAkvKiBUICovCisjZGVmaW5lIFNLX1JMTVRfUEFDS0VUX1ZFUlNJT04JCQkwCisKKy8qIFJMTVQgU1BUIEZsYWcgdmFsdWVzLiAqLworI2RlZmluZQlTS19STE1UX1NQVF9GTEFHX0NIQU5HRQkJCTB4MDEKKyNkZWZpbmUJU0tfUkxNVF9TUFRfRkxBR19DSEFOR0VfQUNLCQkweDgwCisKKy8qIFJMTVQgU1BUIFBhY2tldCBmaWVsZHMuICovCisjZGVmaW5lCVNLX1JMTVRfU1BUX0RTQVAJCQkJMHg0MgorI2RlZmluZQlTS19STE1UX1NQVF9TU0FQCQkJCTB4NDIKKyNkZWZpbmUgU0tfUkxNVF9TUFRfQ1RSTAkJCQkoTExDX1VJKQorI2RlZmluZQlTS19STE1UX1NQVF9QUk9UT0NPTF9JRDAJCTB4MDAKKyNkZWZpbmUJU0tfUkxNVF9TUFRfUFJPVE9DT0xfSUQxCQkweDAwCisjZGVmaW5lCVNLX1JMTVRfU1BUX1BST1RPQ09MX1ZFUlNJT05fSUQJMHgwMAorI2RlZmluZQlTS19STE1UX1NQVF9CUERVX1RZUEUJCQkweDAwCisjZGVmaW5lCVNLX1JMTVRfU1BUX0ZMQUdTCQkJCTB4MDAJLyogPz8gKi8KKyNkZWZpbmUJU0tfUkxNVF9TUFRfUk9PVF9JRDAJCQkweEZGCS8qIExvd2VzdCBwb3NzaWJsZSBwcmlvcml0eS4gKi8KKyNkZWZpbmUJU0tfUkxNVF9TUFRfUk9PVF9JRDEJCQkweEZGCS8qIExvd2VzdCBwb3NzaWJsZSBwcmlvcml0eS4gKi8KKworLyogUmVtYWluaW5nIDYgYnl0ZXMgd2lsbCBiZSB0aGUgY3VycmVudCBwb3J0IGFkZHJlc3MuICovCisjZGVmaW5lCVNLX1JMTVRfU1BUX1JPT1RfUEFUSF9DT1NUMAkJMHgwMAorI2RlZmluZQlTS19STE1UX1NQVF9ST09UX1BBVEhfQ09TVDEJCTB4MDAKKyNkZWZpbmUJU0tfUkxNVF9TUFRfUk9PVF9QQVRIX0NPU1QyCQkweDAwCisjZGVmaW5lCVNLX1JMTVRfU1BUX1JPT1RfUEFUSF9DT1NUMwkJMHgwMAorI2RlZmluZQlTS19STE1UX1NQVF9CUklER0VfSUQwCQkJMHhGRgkvKiBMb3dlc3QgcG9zc2libGUgcHJpb3JpdHkuICovCisjZGVmaW5lCVNLX1JMTVRfU1BUX0JSSURHRV9JRDEJCQkweEZGCS8qIExvd2VzdCBwb3NzaWJsZSBwcmlvcml0eS4gKi8KKworLyogUmVtYWluaW5nIDYgYnl0ZXMgd2lsbCBiZSB0aGUgY3VycmVudCBwb3J0IGFkZHJlc3MuICovCisjZGVmaW5lCVNLX1JMTVRfU1BUX1BPUlRfSUQwCQkJMHhGRgkvKiBMb3dlc3QgcG9zc2libGUgcHJpb3JpdHkuICovCisjZGVmaW5lCVNLX1JMTVRfU1BUX1BPUlRfSUQxCQkJMHhGRgkvKiBMb3dlc3QgcG9zc2libGUgcHJpb3JpdHkuICovCisjZGVmaW5lCVNLX1JMTVRfU1BUX01TR19BR0UwCQkJMHgwMAorI2RlZmluZQlTS19STE1UX1NQVF9NU0dfQUdFMQkJCTB4MDAKKyNkZWZpbmUJU0tfUkxNVF9TUFRfTUFYX0FHRTAJCQkweDAwCisjZGVmaW5lCVNLX1JMTVRfU1BUX01BWF9BR0UxCQkJMHhGRgorI2RlZmluZQlTS19STE1UX1NQVF9IRUxMT19USU1FMAkJCTB4MDAKKyNkZWZpbmUJU0tfUkxNVF9TUFRfSEVMTE9fVElNRTEJCQkweEZGCisjZGVmaW5lCVNLX1JMTVRfU1BUX0ZXRF9ERUxBWTAJCQkweDAwCisjZGVmaW5lCVNLX1JMTVRfU1BUX0ZXRF9ERUxBWTEJCQkweDQwCisKKy8qIFNpemUgZGVmaW5lcy4gKi8KKyNkZWZpbmUgU0tfUkxNVF9NSU5fUEFDS0VUX1NJWkUJCQkzNAorI2RlZmluZSBTS19STE1UX01BWF9QQUNLRVRfU0laRQkJCShTS19STE1UX01BWF9UWF9CVUZfU0laRSkKKyNkZWZpbmUgU0tfUEFDS0VUX0RBVEFfTEVOCQkJCShTS19STE1UX01BWF9QQUNLRVRfU0laRSAtIFwKKwkJCQkJCQkJCQlTS19STE1UX01JTl9QQUNLRVRfU0laRSkKKworLyogLS0tLS0gUkxNVCBwYWNrZXQgdHlwZXMgLS0tLS0gKi8KKyNkZWZpbmUgU0tfUEFDS0VUX0FOTk9VTkNFCQkJCTEJLyogUG9ydCBhbm5vdW5jZW1lbnQuICovCisjZGVmaW5lIFNLX1BBQ0tFVF9BTElWRQkJCQkJMgkvKiBBbGl2ZSBwYWNrZXQgdG8gcG9ydC4gKi8KKyNkZWZpbmUgU0tfUEFDS0VUX0FERFJfQ0hBTkdFRAkJCTMJLyogUG9ydCBhZGRyZXNzIGNoYW5nZWQuICovCisjZGVmaW5lIFNLX1BBQ0tFVF9DSEVDS19UWAkJCQk0CS8qIENoZWNrIHlvdXIgdHggbGluZS4gKi8KKworI2lmZGVmIFNLX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgU0tfVTE2X1RPX05FVFdPUktfT1JERVIoVmFsLEFkZHIpIHsgXAorCVNLX1U4CSpfQWRkciA9IChTS19VOCopKEFkZHIpOyBcCisJU0tfVTE2CV9WYWwgPSAoU0tfVTE2KShWYWwpOyBcCisJKl9BZGRyKysgPSAoU0tfVTgpKF9WYWwgPj4gOCk7IFwKKwkqX0FkZHIgPSAoU0tfVTgpKF9WYWwgJiAweEZGKTsgXAorfQorI2VuZGlmCS8qIFNLX0xJVFRMRV9FTkRJQU4gKi8KKworI2lmZGVmIFNLX0JJR19FTkRJQU4KKyNkZWZpbmUgU0tfVTE2X1RPX05FVFdPUktfT1JERVIoVmFsLEFkZHIpICgqKFNLX1UxNiopKEFkZHIpID0gKFNLX1UxNikoVmFsKSkKKyNlbmRpZgkvKiBTS19CSUdfRU5ESUFOICovCisKKyNkZWZpbmUgQVVUT05FR19GQUlMRUQJU0tfRkFMU0UKKyNkZWZpbmUgQVVUT05FR19TVUNDRVNTCVNLX1RSVUUKKworCisvKiB0eXBlZGVmcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSTE1UIHBhY2tldC4gIExlbmd0aDogU0tfUkxNVF9NQVhfUEFDS0VUX1NJWkUgKDYwKSBieXRlcy4gKi8KK3R5cGVkZWYgc3RydWN0IHNfUmxtdFBhY2tldCB7CisJU0tfVTgJRHN0QWRkcltTS19NQUNfQUREUl9MRU5dOworCVNLX1U4CVNyY0FkZHJbU0tfTUFDX0FERFJfTEVOXTsKKwlTS19VOAlUeXBlTGVuWzJdOworCVNLX1U4CURTYXA7CisJU0tfVTgJU1NhcDsKKwlTS19VOAlDdHJsOworCVNLX1U4CUluZGljYXRvcls3XTsKKwlTS19VOAlSbG10UGFja2V0VHlwZVsyXTsKKwlTS19VOAlBbGlnbjFbMl07CisJU0tfVTgJUmFuZG9tWzRdOwkJCQkvKiBSYW5kb20gdmFsdWUgb2YgcmVxdWVzdGluZyghKSBzdGF0aW9uLiAqLworCVNLX1U4CVJsbXRQYWNrZXRWZXJzaW9uWzJdOwkvKiBSTE1UIFBhY2tldCB2ZXJzaW9uLiAqLworCVNLX1U4CURhdGFbU0tfUEFDS0VUX0RBVEFfTEVOXTsKK30gU0tfUkxNVF9QQUNLRVQ7CisKK3R5cGVkZWYgc3RydWN0IHNfU3BUcmVlUmxtdFBhY2tldCB7CisJU0tfVTgJRHN0QWRkcltTS19NQUNfQUREUl9MRU5dOworCVNLX1U4CVNyY0FkZHJbU0tfTUFDX0FERFJfTEVOXTsKKwlTS19VOAlUeXBlTGVuWzJdOworCVNLX1U4CURTYXA7CisJU0tfVTgJU1NhcDsKKwlTS19VOAlDdHJsOworCVNLX1U4CVByb3RvY29sSWRbMl07CisJU0tfVTgJUHJvdG9jb2xWZXJzaW9uSWQ7CisJU0tfVTgJQnBkdVR5cGU7CisJU0tfVTgJRmxhZ3M7CisJU0tfVTgJUm9vdElkWzhdOworCVNLX1U4CVJvb3RQYXRoQ29zdFs0XTsKKwlTS19VOAlCcmlkZ2VJZFs4XTsKKwlTS19VOAlQb3J0SWRbMl07CisJU0tfVTgJTWVzc2FnZUFnZVsyXTsKKwlTS19VOAlNYXhBZ2VbMl07CisJU0tfVTgJSGVsbG9UaW1lWzJdOworCVNLX1U4CUZvcndhcmREZWxheVsyXTsKK30gU0tfU1BUUkVFX1BBQ0tFVDsKKworLyogZ2xvYmFsIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworU0tfTUFDX0FERFIJU2tSbG10TWNBZGRyID0Je3sweDAxLCAgMHgwMCwgIDB4NUEsICAweDUyLCAgMHg0QywgIDB4NER9fTsKK1NLX01BQ19BRERSCUJyaWRnZU1jQWRkciA9CXt7MHgwMSwgIDB4ODAsICAweEMyLCAgMHgwMCwgIDB4MDAsICAweDAwfX07CitTS19NQUNfQUREUglCY0FkZHIgPSAJCXt7MHhGRiwgIDB4RkYsICAweEZGLCAgMHhGRiwgIDB4RkYsICAweEZGfX07CisKKy8qIGxvY2FsIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE5vbmUuICovCisKKy8qIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10Q2hlY2tTd2l0Y2goCisJU0tfQUMJKnBBQywKKwlTS19JT0MJSW9DLAorCVNLX1UzMglOZXRJZHgpOworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRDaGVja1NlZygKKwlTS19BQwkqcEFDLAorCVNLX0lPQwlJb0MsCisJU0tfVTMyCU5ldElkeCk7CitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdEV2dFNldE5ldHMoCisJU0tfQUMJCSpwQUMsCisJU0tfSU9DCQlJb0MsCisJU0tfRVZQQVJBCVBhcmEpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10SW5pdCAtIGluaXRpYWxpemUgZGF0YSwgc2V0IHN0YXRlIHRvIGluaXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKglTS19JTklUX0RBVEEKKyAqCT09PT09PT09PT09PQorICoKKyAqCVRoaXMgcm91dGluZSBpbml0aWFsaXplcyBhbGwgUkxNVC1yZWxhdGVkIHZhcmlhYmxlcyB0byBhIGtub3duIHN0YXRlLgorICoJVGhlIGluaXRpYWwgc3RhdGUgaXMgU0tfUkxNVF9SU19JTklULgorICoJQWxsIHBvcnRzIGFyZSBpbml0aWFsaXplZCB0byBTS19STE1UX1BTX0lOSVQuCisgKgorICoKKyAqCVNLX0lOSVRfSU8KKyAqCT09PT09PT09PT0KKyAqCisgKglOb3RoaW5nLgorICoKKyAqCisgKglTS19JTklUX1JVTgorICoJPT09PT09PT09PT0KKyAqCisgKglEZXRlcm1pbmUgdGhlIGFkYXB0ZXIncyByYW5kb20gdmFsdWUuCisgKglTZXQgdGhlIGh3IHJlZ2lzdGVycywgdGhlICJsb2dpY2FsIE1BQyBhZGRyZXNzIiwgdGhlCisgKglSTE1UIG11bHRpY2FzdCBhZGRyZXNzLCBhbmQgZXZlbnR1YWxseSB0aGUgQlBEVSBtdWx0aWNhc3QgYWRkcmVzcy4KKyAqCisgKiBDb250ZXh0OgorICoJaW5pdCwgcGFnZWFibGUKKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZy4KKyAqLwordm9pZAlTa1JsbXRJbml0KAorU0tfQUMJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJL08gQ29udGV4dCAqLworaW50CQlMZXZlbCkJLyogSW5pdGlhbGl6YXRpb24gTGV2ZWwgKi8KK3sKKwlTS19VMzIJCWksIGo7CisJU0tfVTY0CQlSYW5kb207CisJU0tfRVZQQVJBCVBhcmE7CisgICAgU0tfTUFDX0FERFIJCVZpcnR1YWxNYWNBZGRyZXNzOworICAgIFNLX01BQ19BRERSCQlQaHlzaWNhbEFNYWNBZGRyZXNzOworICAgIFNLX0JPT0wJCVZpcnR1YWxNYWNBZGRyZXNzU2V0OworICAgIFNLX0JPT0wJCVBoeXNpY2FsQU1hY0FkZHJlc3NTZXQ7CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9JTklULAorCQkoIlJMTVQgSW5pdCBsZXZlbCAlZC5cbiIsIExldmVsKSkKKworCXN3aXRjaCAoTGV2ZWwpIHsKKwljYXNlIFNLX0lOSVRfREFUQToJLyogSW5pdGlhbGl6ZSBkYXRhIHN0cnVjdHVyZXMuICovCisJCVNLX01FTVNFVCgoY2hhciAqKSZwQUMtPlJsbXQsIDAsIHNpemVvZihTS19STE1UKSk7CisKKwkJZm9yIChpID0gMDsgaSA8IFNLX01BWF9NQUNTOyBpKyspIHsKKwkJCXBBQy0+UmxtdC5Qb3J0W2ldLlBvcnRTdGF0ZSA9IFNLX1JMTVRfUFNfSU5JVDsKKwkJCXBBQy0+UmxtdC5Qb3J0W2ldLkxpbmtEb3duID0gU0tfVFJVRTsKKwkJCXBBQy0+UmxtdC5Qb3J0W2ldLlBvcnREb3duID0gU0tfVFJVRTsKKwkJCXBBQy0+UmxtdC5Qb3J0W2ldLlBvcnRTdGFydGVkID0gU0tfRkFMU0U7CisJCQlwQUMtPlJsbXQuUG9ydFtpXS5Qb3J0Tm9SeCA9IFNLX0ZBTFNFOworCQkJcEFDLT5SbG10LlBvcnRbaV0uUm9vdElkU2V0ID0gU0tfRkFMU0U7CisJCQlwQUMtPlJsbXQuUG9ydFtpXS5Qb3J0TnVtYmVyID0gaTsKKwkJCXBBQy0+UmxtdC5Qb3J0W2ldLk5ldCA9ICZwQUMtPlJsbXQuTmV0WzBdOworCQkJcEFDLT5SbG10LlBvcnRbaV0uQWRkclBvcnQgPSAmcEFDLT5BZGRyLlBvcnRbaV07CisJCX0KKworCQlwQUMtPlJsbXQuTnVtTmV0cyA9IDE7CisJCWZvciAoaSA9IDA7IGkgPCBTS19NQVhfTkVUUzsgaSsrKSB7CisJCQlwQUMtPlJsbXQuTmV0W2ldLlJsbXRTdGF0ZSA9IFNLX1JMTVRfUlNfSU5JVDsKKwkJCXBBQy0+UmxtdC5OZXRbaV0uUm9vdElkU2V0ID0gU0tfRkFMU0U7CisJCQlwQUMtPlJsbXQuTmV0W2ldLlByZWZQb3J0ID0gU0tfUkxNVF9ERUZfUFJFRl9QT1JUOworCQkJcEFDLT5SbG10Lk5ldFtpXS5QcmVmZXJlbmNlID0gMHhGRkZGRkZGRjsJICAvKiBBdXRvbWF0aWMuICovCisJCQkvKiBKdXN0IGFzc3VtaW5nLiAqLworCQkJcEFDLT5SbG10Lk5ldFtpXS5BY3RpdmVQb3J0ID0gcEFDLT5SbG10Lk5ldFtpXS5QcmVmUG9ydDsKKwkJCXBBQy0+UmxtdC5OZXRbaV0uUmxtdE1vZGUgPSBTS19STE1UX0RFRl9NT0RFOworCQkJcEFDLT5SbG10Lk5ldFtpXS5UaW1lb3V0VmFsdWUgPSBTS19STE1UX0RFRl9UT19WQUw7CisJCQlwQUMtPlJsbXQuTmV0W2ldLk5ldE51bWJlciA9IGk7CisJCX0KKworCQlwQUMtPlJsbXQuTmV0WzBdLlBvcnRbMF0gPSAmcEFDLT5SbG10LlBvcnRbMF07CisJCXBBQy0+UmxtdC5OZXRbMF0uUG9ydFsxXSA9ICZwQUMtPlJsbXQuUG9ydFsxXTsKKyNpZiBTS19NQVhfTkVUUyA+IDEKKwkJcEFDLT5SbG10Lk5ldFsxXS5Qb3J0WzBdID0gJnBBQy0+UmxtdC5Qb3J0WzFdOworI2VuZGlmCS8qIFNLX01BWF9ORVRTID4gMSAqLworCQlicmVhazsKKworCWNhc2UgU0tfSU5JVF9JTzoJLyogR0lNYWNzRm91bmQgZmlyc3QgYXZhaWxhYmxlIGhlcmUuICovCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0lOSVQsCisJCQkoIlJMTVQ6ICVkIE1BQ3Mgd2VyZSBkZXRlY3RlZC5cbiIsIHBBQy0+R0luaS5HSU1hY3NGb3VuZCkpCisKKwkJcEFDLT5SbG10Lk5ldFswXS5OdW1Qb3J0cyA9IHBBQy0+R0luaS5HSU1hY3NGb3VuZDsKKworCQkvKiBJbml0aWFsaXplIEhXIHJlZ2lzdGVycz8gKi8KKwkJaWYgKHBBQy0+R0luaS5HSU1hY3NGb3VuZCA9PSAxKSB7CisJCQlQYXJhLlBhcmEzMlswXSA9IFNLX1JMTVRfTU9ERV9DTFM7CisJCQlQYXJhLlBhcmEzMlsxXSA9IDA7CisJCQkodm9pZClTa1JsbXRFdmVudChwQUMsIElvQywgU0tfUkxNVF9NT0RFX0NIQU5HRSwgUGFyYSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNLX0lOSVRfUlVOOgorCQkvKiBFbnN1cmUgUkxNVCBpcyBzZXQgdG8gb25lIG5ldC4gKi8KKwkJaWYgKHBBQy0+UmxtdC5OdW1OZXRzID4gMSkgeworCQkJUGFyYS5QYXJhMzJbMF0gPSAxOworCQkJUGFyYS5QYXJhMzJbMV0gPSAtMTsKKwkJCVNrUmxtdEV2dFNldE5ldHMocEFDLCBJb0MsIFBhcmEpOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IChTS19VMzIpcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJCVJhbmRvbSA9IFNrT3NHZXRUaW1lKHBBQyk7CisJCQkqKFNLX1UzMiopJnBBQy0+UmxtdC5Qb3J0W2ldLlJhbmRvbSA9ICooU0tfVTMyKikmUmFuZG9tOworCisJCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisJCQkJcEFDLT5SbG10LlBvcnRbaV0uUmFuZG9tW2pdIF49IHBBQy0+UmxtdC5Qb3J0W2ldLkFkZHJQb3J0LT4KKwkJCQkJQ3VycmVudE1hY0FkZHJlc3MuYVtTS19NQUNfQUREUl9MRU4gLSAxIC0gal07CisJCQl9CisKKwkJCSh2b2lkKVNrQWRkck1jQ2xlYXIocEFDLCBJb0MsIGksIFNLX0FERFJfUEVSTUFORU5UIHwgU0tfTUNfU1dfT05MWSk7CisJCQkKKwkJCS8qIEFkZCBSTE1UIE1DIGFkZHJlc3MuICovCisJCQkodm9pZClTa0FkZHJNY0FkZChwQUMsIElvQywgaSwgJlNrUmxtdE1jQWRkciwgU0tfQUREUl9QRVJNQU5FTlQpOworCisJCQlpZiAocEFDLT5SbG10Lk5ldFswXS5SbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfU0VHKSB7CisJCQkJLyogQWRkIEJQRFUgTUMgYWRkcmVzcy4gKi8KKwkJCQkodm9pZClTa0FkZHJNY0FkZChwQUMsIElvQywgaSwgJkJyaWRnZU1jQWRkciwgU0tfQUREUl9QRVJNQU5FTlQpOworCQkJfQorCisJCQkodm9pZClTa0FkZHJNY1VwZGF0ZShwQUMsIElvQywgaSk7CisJCX0KKworICAgIAlWaXJ0dWFsTWFjQWRkcmVzc1NldCA9IFNLX0ZBTFNFOworCQkvKiBSZWFkIHZpcnR1YWwgTUFDIGFkZHJlc3MgZnJvbSBDb250cm9sIFJlZ2lzdGVyIEZpbGUuICovCisJCWZvciAoaiA9IDA7IGogPCBTS19NQUNfQUREUl9MRU47IGorKykgeworCQkJCisgICAgICAgICAgICBTS19JTjgoSW9DLCBCMl9NQUNfMSArIGosICZWaXJ0dWFsTWFjQWRkcmVzcy5hW2pdKTsKKyAgICAgICAgICAgIFZpcnR1YWxNYWNBZGRyZXNzU2V0IHw9IFZpcnR1YWxNYWNBZGRyZXNzLmFbal07CisJCX0KKyAgICAJCisgICAgICAgIFBoeXNpY2FsQU1hY0FkZHJlc3NTZXQgPSBTS19GQUxTRTsKKwkJLyogUmVhZCBwaHlzaWNhbCBNQUMgYWRkcmVzcyBmb3IgTUFDIEEgZnJvbSBDb250cm9sIFJlZ2lzdGVyIEZpbGUuICovCisJCWZvciAoaiA9IDA7IGogPCBTS19NQUNfQUREUl9MRU47IGorKykgeworCQkJCisgICAgICAgICAgICBTS19JTjgoSW9DLCBCMl9NQUNfMiArIGosICZQaHlzaWNhbEFNYWNBZGRyZXNzLmFbal0pOworICAgICAgICAgICAgUGh5c2ljYWxBTWFjQWRkcmVzc1NldCB8PSBQaHlzaWNhbEFNYWNBZGRyZXNzLmFbal07CisJCX0KKworICAgICAgICAvKiBjaGVjayBpZiB0aGUgdHdvIG1hYyBhZGRyZXNzZXMgY29udGFpbiByZWFzb25hYmxlIHZhbHVlcyAqLworICAgICAgICBpZiAoIVZpcnR1YWxNYWNBZGRyZXNzU2V0IHx8ICFQaHlzaWNhbEFNYWNBZGRyZXNzU2V0KSB7CisKKyAgICAgICAgICAgIHBBQy0+UmxtdC5SbG10T2ZmID0gU0tfVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGlmIHRoZSB0d28gbWFjIGFkZHJlc3NlcyBhcmUgZXF1YWwgc3dpdGNoIG9mZiB0aGUgUkxNVF9QUkVfTE9PS0FIRUFECisgICAgICAgICAgIGFuZCB0aGUgUkxNVF9MT09LQUhFQUQgbWFjcm9zICovCisgICAgICAgIGVsc2UgaWYgKFNLX0FERFJfRVFVQUwoUGh5c2ljYWxBTWFjQWRkcmVzcy5hLCBWaXJ0dWFsTWFjQWRkcmVzcy5hKSkgeworCisgICAgICAgICAgICBwQUMtPlJsbXQuUmxtdE9mZiA9IFNLX1RSVUU7CisgICAgICAgIH0KKwkJZWxzZSB7CisJCQlwQUMtPlJsbXQuUmxtdE9mZiA9IFNLX0ZBTFNFOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoJLyogZXJyb3IgKi8KKwkJYnJlYWs7CisJfQorCXJldHVybjsKK30JLyogU2tSbG10SW5pdCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRCdWlsZENoZWNrQ2hhaW4gLSBidWlsZCB0aGUgY2hlY2sgY2hhaW4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBidWlsZHMgdGhlIGxvY2FsIGNoZWNrIGNoYWluOgorICoJLSBFYWNoIHBvcnQgdGhhdCBpcyB1cCBjaGVja3MgdGhlIG5leHQgcG9ydC4KKyAqCS0gVGhlIGxhc3QgcG9ydCB0aGF0IGlzIHVwIGNoZWNrcyB0aGUgZmlyc3QgcG9ydCB0aGF0IGlzIHVwLgorICoKKyAqIE5vdGVzOgorICoJLSBDdXJyZW50bHkgb25seSBsb2NhbCBwb3J0cyBhcmUgY29uc2lkZXJlZCB3aGVuIGJ1aWxkaW5nIHRoZSBjaGFpbi4KKyAqCS0gQ3VycmVudGx5IHRoZSBTdXNwZWN0U3RhdGUgaXMganVzdCByZXNldDsKKyAqCSAgaXQgd291bGQgYmUgYmV0dGVyIHRvIHNhdmUgaXQgLi4uCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10QnVpbGRDaGVja0NoYWluKAorU0tfQUMJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19VMzIJTmV0SWR4KQkvKiBOZXQgTnVtYmVyICovCit7CisJU0tfVTMyCQkJaTsKKwlTS19VMzIJCQlOdW1NYWNzVXA7CisJU0tfUkxNVF9QT1JUICoJRmlyc3RNYWNVcDsKKwlTS19STE1UX1BPUlQgKglQcmV2TWFjVXA7CisKKwlGaXJzdE1hY1VwCT0gTlVMTDsKKwlQcmV2TWFjVXAJPSBOVUxMOworCQorCWlmICghKHBBQy0+UmxtdC5OZXRbTmV0SWR4XS5SbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfTE9DX0xJTkspKSB7CisJCWZvciAoaSA9IDA7IGkgPCBwQUMtPlJsbXQuTmV0W2ldLk51bVBvcnRzOyBpKyspIHsKKwkJCXBBQy0+UmxtdC5OZXRbTmV0SWR4XS5Qb3J0W2ldLT5Qb3J0c0NoZWNrZWQgPSAwOworCQl9CisJCXJldHVybjsJLyogRG9uZS4gKi8KKwl9CisJCQkKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNrUmxtdEJ1aWxkQ2hlY2tDaGFpbi5cbiIpKQorCisJTnVtTWFjc1VwID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBwQUMtPlJsbXQuTmV0W05ldElkeF0uTnVtUG9ydHM7IGkrKykgeworCQlwQUMtPlJsbXQuTmV0W05ldElkeF0uUG9ydFtpXS0+UG9ydHNDaGVja2VkID0gMDsKKwkJcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlBvcnRbaV0tPlBvcnRzU3VzcGVjdCA9IDA7CisJCXBBQy0+UmxtdC5OZXRbTmV0SWR4XS5Qb3J0W2ldLT5DaGVja2luZ1N0YXRlICY9CisJCQl+KFNLX1JMTVRfUENTX1JYIHwgU0tfUkxNVF9QQ1NfVFgpOworCisJCS8qCisJCSAqIElmIG1vcmUgdGhhbiB0d28gbGlua3MgYXJlIGRldGVjdGVkIHdlIHNob3VsZCBjb25zaWRlcgorCQkgKiBjaGVja2luZyBhdCBsZWFzdCB0d28gb3RoZXIgcG9ydHM6CisJCSAqIDEuIHRoZSBuZXh0IHBvcnQgdGhhdCBpcyBub3QgTGlua0Rvd24gYW5kCisJCSAqIDIuIHRoZSBuZXh0IHBvcnQgdGhhdCBpcyBub3QgUG9ydERvd24uCisJCSAqLworCQlpZiAoIXBBQy0+UmxtdC5OZXRbTmV0SWR4XS5Qb3J0W2ldLT5MaW5rRG93bikgeworCQkJaWYgKE51bU1hY3NVcCA9PSAwKSB7CisJCQkJRmlyc3RNYWNVcCA9IHBBQy0+UmxtdC5OZXRbTmV0SWR4XS5Qb3J0W2ldOworCQkJfQorCQkJZWxzZSB7CisJCQkJUHJldk1hY1VwLT5Qb3J0Q2hlY2tbCisJCQkJCXBBQy0+UmxtdC5OZXRbTmV0SWR4XS5Qb3J0W2ldLT5Qb3J0c0NoZWNrZWRdLkNoZWNrQWRkciA9CisJCQkJCXBBQy0+UmxtdC5OZXRbTmV0SWR4XS5Qb3J0W2ldLT5BZGRyUG9ydC0+Q3VycmVudE1hY0FkZHJlc3M7CisJCQkJUHJldk1hY1VwLT5Qb3J0Q2hlY2tbCisJCQkJCVByZXZNYWNVcC0+UG9ydHNDaGVja2VkXS5TdXNwZWN0VHggPSBTS19GQUxTRTsKKwkJCQlQcmV2TWFjVXAtPlBvcnRzQ2hlY2tlZCsrOworCQkJfQorCQkJUHJldk1hY1VwID0gcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlBvcnRbaV07CisJCQlOdW1NYWNzVXArKzsKKwkJfQorCX0KKworCWlmIChOdW1NYWNzVXAgPiAxKSB7CisJCVByZXZNYWNVcC0+UG9ydENoZWNrW1ByZXZNYWNVcC0+UG9ydHNDaGVja2VkXS5DaGVja0FkZHIgPQorCQkJRmlyc3RNYWNVcC0+QWRkclBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzOworCQlQcmV2TWFjVXAtPlBvcnRDaGVja1tQcmV2TWFjVXAtPlBvcnRzQ2hlY2tlZF0uU3VzcGVjdFR4ID0KKwkJCVNLX0ZBTFNFOworCQlQcmV2TWFjVXAtPlBvcnRzQ2hlY2tlZCsrOworCX0KKworI2lmZGVmIERFQlVHCisJZm9yIChpID0gMDsgaSA8IHBBQy0+UmxtdC5OZXRbTmV0SWR4XS5OdW1Qb3J0czsgaSsrKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlBvcnQgJWQgY2hlY2tzICVkIG90aGVyIHBvcnRzOiAlMlguXG4iLCBpLAorCQkJCXBBQy0+UmxtdC5OZXRbTmV0SWR4XS5Qb3J0W2ldLT5Qb3J0c0NoZWNrZWQsCisJCQkJcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlBvcnRbaV0tPlBvcnRDaGVja1swXS5DaGVja0FkZHIuYVs1XSkpCisJfQorI2VuZGlmCS8qIERFQlVHICovCisKKwlyZXR1cm47Cit9CS8qIFNrUmxtdEJ1aWxkQ2hlY2tDaGFpbiAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRCdWlsZFBhY2tldCAtIGJ1aWxkIGFuIFJMTVQgcGFja2V0CisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgc2V0cyB1cCBhbiBSTE1UIHBhY2tldC4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgorICogUmV0dXJuczoKKyAqCU5VTEwgb3IgcG9pbnRlciB0byBSTE1UIG1idWYKKyAqLworUkxNVF9TVEFUSUMgU0tfTUJVRgkqU2tSbG10QnVpbGRQYWNrZXQoCitTS19BQwkJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCQkvKiBJL08gQ29udGV4dCAqLworU0tfVTMyCQlQb3J0TnVtYmVyLAkvKiBTZW5kaW5nIHBvcnQgKi8KK1NLX1UxNgkJUGFja2V0VHlwZSwJLyogUkxNVCBwYWNrZXQgdHlwZSAqLworU0tfTUFDX0FERFIJKlNyY0FkZHIsCS8qIFNvdXJjZSBhZGRyZXNzICovCitTS19NQUNfQUREUgkqRGVzdEFkZHIpCS8qIERlc3RpbmF0aW9uIGFkZHJlc3MgKi8KK3sKKwlpbnQJCWk7CisJU0tfVTE2CQlMZW5ndGg7CisJU0tfTUJVRgkJKnBNYjsKKwlTS19STE1UX1BBQ0tFVAkqcFBhY2tldDsKKworI2lmZGVmIERFQlVHCisJU0tfVTgJQ2hlY2tTcmMgID0gMDsKKwlTS19VOAlDaGVja0Rlc3QgPSAwOworCQorCWZvciAoaSA9IDA7IGkgPCBTS19NQUNfQUREUl9MRU47ICsraSkgeworCQlDaGVja1NyYyAgfD0gU3JjQWRkci0+YVtpXTsKKwkJQ2hlY2tEZXN0IHw9IERlc3RBZGRyLT5hW2ldOworCX0KKworCWlmICgoQ2hlY2tTcmMgPT0gMCkgfHwgKENoZWNrRGVzdCA9PSAwKSkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9FUlIsCisJCQkoIlNrUmxtdEJ1aWxkUGFja2V0OiBJbnZhbGlkICVzJXNhZGRyLlxuIiwKKwkJCSAoQ2hlY2tTcmMgPT0gMCA/ICJTcmMiIDogIiIpLCAoQ2hlY2tEZXN0ID09IDAgPyAiRGVzdCIgOiAiIikpKQorCX0KKyNlbmRpZgorCisJaWYgKChwTWIgPSBTa0RydkFsbG9jUmxtdE1idWYocEFDLCBJb0MsIFNLX1JMTVRfTUFYX1BBQ0tFVF9TSVpFKSkgIT0gTlVMTCkgeworCQlwUGFja2V0ID0gKFNLX1JMTVRfUEFDS0VUKilwTWItPnBEYXRhOworCQlmb3IgKGkgPSAwOyBpIDwgU0tfTUFDX0FERFJfTEVOOyBpKyspIHsKKwkJCXBQYWNrZXQtPkRzdEFkZHJbaV0gPSBEZXN0QWRkci0+YVtpXTsKKwkJCXBQYWNrZXQtPlNyY0FkZHJbaV0gPSBTcmNBZGRyLT5hW2ldOworCQl9CisJCXBQYWNrZXQtPkRTYXAgPSBTS19STE1UX0RTQVA7CisJCXBQYWNrZXQtPlNTYXAgPSBTS19STE1UX1NTQVA7CisJCXBQYWNrZXQtPkN0cmwgPSBTS19STE1UX0NUUkw7CisJCXBQYWNrZXQtPkluZGljYXRvclswXSA9IFNLX1JMTVRfSU5ESUNBVE9SMDsKKwkJcFBhY2tldC0+SW5kaWNhdG9yWzFdID0gU0tfUkxNVF9JTkRJQ0FUT1IxOworCQlwUGFja2V0LT5JbmRpY2F0b3JbMl0gPSBTS19STE1UX0lORElDQVRPUjI7CisJCXBQYWNrZXQtPkluZGljYXRvclszXSA9IFNLX1JMTVRfSU5ESUNBVE9SMzsKKwkJcFBhY2tldC0+SW5kaWNhdG9yWzRdID0gU0tfUkxNVF9JTkRJQ0FUT1I0OworCQlwUGFja2V0LT5JbmRpY2F0b3JbNV0gPSBTS19STE1UX0lORElDQVRPUjU7CisJCXBQYWNrZXQtPkluZGljYXRvcls2XSA9IFNLX1JMTVRfSU5ESUNBVE9SNjsKKworCQlTS19VMTZfVE9fTkVUV09SS19PUkRFUihQYWNrZXRUeXBlLCAmcFBhY2tldC0+UmxtdFBhY2tldFR5cGVbMF0pOworCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCXBQYWNrZXQtPlJhbmRvbVtpXSA9IHBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLlJhbmRvbVtpXTsKKwkJfQorCQkKKwkJU0tfVTE2X1RPX05FVFdPUktfT1JERVIoCisJCQlTS19STE1UX1BBQ0tFVF9WRVJTSU9OLCAmcFBhY2tldC0+UmxtdFBhY2tldFZlcnNpb25bMF0pOworCisJCWZvciAoaSA9IDA7IGkgPCBTS19QQUNLRVRfREFUQV9MRU47IGkrKykgeworCQkJcFBhY2tldC0+RGF0YVtpXSA9IDB4MDA7CisJCX0KKworCQlMZW5ndGggPSBTS19STE1UX01BWF9QQUNLRVRfU0laRTsJLyogT3Igc21hbGxlci4gKi8KKwkJcE1iLT5MZW5ndGggPSBMZW5ndGg7CisJCXBNYi0+UG9ydElkeCA9IFBvcnROdW1iZXI7CisJCUxlbmd0aCAtPSAxNDsKKwkJU0tfVTE2X1RPX05FVFdPUktfT1JERVIoTGVuZ3RoLCAmcFBhY2tldC0+VHlwZUxlblswXSk7CisKKwkJaWYgKFBhY2tldFR5cGUgPT0gU0tfUEFDS0VUX0FMSVZFKSB7CisJCQlwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5UeEhlbGxvQ3RzKys7CisJCX0KKwl9CisKKwlyZXR1cm4gKHBNYik7Cit9CS8qIFNrUmxtdEJ1aWxkUGFja2V0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdEJ1aWxkU3Bhbm5pbmdUcmVlUGFja2V0IC0gYnVpbGQgc3Bhbm5pbmcgdHJlZSBjaGVjayBwYWNrZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBzZXRzIHVwIGEgQlBEVSBwYWNrZXQgZm9yIHNwYW5uaW5nIHRyZWUgY2hlY2suCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoKKyAqIFJldHVybnM6CisgKglOVUxMIG9yIHBvaW50ZXIgdG8gUkxNVCBtYnVmCisgKi8KK1JMTVRfU1RBVElDIFNLX01CVUYJKlNrUmxtdEJ1aWxkU3Bhbm5pbmdUcmVlUGFja2V0KAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIEkvTyBDb250ZXh0ICovCitTS19VMzIJUG9ydE51bWJlcikJLyogU2VuZGluZyBwb3J0ICovCit7CisJdW5zaWduZWQJCQlpOworCVNLX1UxNgkJCQlMZW5ndGg7CisJU0tfTUJVRgkJCQkqcE1iOworCVNLX1NQVFJFRV9QQUNLRVQJKnBTUGFja2V0OworCisJaWYgKChwTWIgPSBTa0RydkFsbG9jUmxtdE1idWYocEFDLCBJb0MsIFNLX1JMTVRfTUFYX1BBQ0tFVF9TSVpFKSkgIT0KKwkJTlVMTCkgeworCQlwU1BhY2tldCA9IChTS19TUFRSRUVfUEFDS0VUKilwTWItPnBEYXRhOworCQlmb3IgKGkgPSAwOyBpIDwgU0tfTUFDX0FERFJfTEVOOyBpKyspIHsKKwkJCXBTUGFja2V0LT5Ec3RBZGRyW2ldID0gQnJpZGdlTWNBZGRyLmFbaV07CisJCQlwU1BhY2tldC0+U3JjQWRkcltpXSA9CisJCQkJcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MuYVtpXTsKKwkJfQorCQlwU1BhY2tldC0+RFNhcCA9IFNLX1JMTVRfU1BUX0RTQVA7CisJCXBTUGFja2V0LT5TU2FwID0gU0tfUkxNVF9TUFRfU1NBUDsKKwkJcFNQYWNrZXQtPkN0cmwgPSBTS19STE1UX1NQVF9DVFJMOworCisJCXBTUGFja2V0LT5Qcm90b2NvbElkWzBdID0gU0tfUkxNVF9TUFRfUFJPVE9DT0xfSUQwOworCQlwU1BhY2tldC0+UHJvdG9jb2xJZFsxXSA9IFNLX1JMTVRfU1BUX1BST1RPQ09MX0lEMTsKKwkJcFNQYWNrZXQtPlByb3RvY29sVmVyc2lvbklkID0gU0tfUkxNVF9TUFRfUFJPVE9DT0xfVkVSU0lPTl9JRDsKKwkJcFNQYWNrZXQtPkJwZHVUeXBlID0gU0tfUkxNVF9TUFRfQlBEVV9UWVBFOworCQlwU1BhY2tldC0+RmxhZ3MgPSBTS19STE1UX1NQVF9GTEFHUzsKKwkJcFNQYWNrZXQtPlJvb3RJZFswXSA9IFNLX1JMTVRfU1BUX1JPT1RfSUQwOworCQlwU1BhY2tldC0+Um9vdElkWzFdID0gU0tfUkxNVF9TUFRfUk9PVF9JRDE7CisJCXBTUGFja2V0LT5Sb290UGF0aENvc3RbMF0gPSBTS19STE1UX1NQVF9ST09UX1BBVEhfQ09TVDA7CisJCXBTUGFja2V0LT5Sb290UGF0aENvc3RbMV0gPSBTS19STE1UX1NQVF9ST09UX1BBVEhfQ09TVDE7CisJCXBTUGFja2V0LT5Sb290UGF0aENvc3RbMl0gPSBTS19STE1UX1NQVF9ST09UX1BBVEhfQ09TVDI7CisJCXBTUGFja2V0LT5Sb290UGF0aENvc3RbM10gPSBTS19STE1UX1NQVF9ST09UX1BBVEhfQ09TVDM7CisJCXBTUGFja2V0LT5CcmlkZ2VJZFswXSA9IFNLX1JMTVRfU1BUX0JSSURHRV9JRDA7CisJCXBTUGFja2V0LT5CcmlkZ2VJZFsxXSA9IFNLX1JMTVRfU1BUX0JSSURHRV9JRDE7CisKKwkJLyoKKwkJICogVXNlIGxvZ2ljYWwgTUFDIGFkZHJlc3MgYXMgYnJpZGdlIElEIGFuZCBmaWx0ZXIgdGhlc2UgcGFja2V0cworCQkgKiBvbiByZWNlaXZlLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IFNLX01BQ19BRERSX0xFTjsgaSsrKSB7CisJCQlwU1BhY2tldC0+QnJpZGdlSWRbaSArIDJdID0gcFNQYWNrZXQtPlJvb3RJZFtpICsgMl0gPQorCQkJCXBBQy0+QWRkci5OZXRbcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uTmV0LT5OZXROdW1iZXJdLgorCQkJCQlDdXJyZW50TWFjQWRkcmVzcy5hW2ldOworCQl9CisJCXBTUGFja2V0LT5Qb3J0SWRbMF0gPSBTS19STE1UX1NQVF9QT1JUX0lEMDsKKwkJcFNQYWNrZXQtPlBvcnRJZFsxXSA9IFNLX1JMTVRfU1BUX1BPUlRfSUQxOworCQlwU1BhY2tldC0+TWVzc2FnZUFnZVswXSA9IFNLX1JMTVRfU1BUX01TR19BR0UwOworCQlwU1BhY2tldC0+TWVzc2FnZUFnZVsxXSA9IFNLX1JMTVRfU1BUX01TR19BR0UxOworCQlwU1BhY2tldC0+TWF4QWdlWzBdID0gU0tfUkxNVF9TUFRfTUFYX0FHRTA7CisJCXBTUGFja2V0LT5NYXhBZ2VbMV0gPSBTS19STE1UX1NQVF9NQVhfQUdFMTsKKwkJcFNQYWNrZXQtPkhlbGxvVGltZVswXSA9IFNLX1JMTVRfU1BUX0hFTExPX1RJTUUwOworCQlwU1BhY2tldC0+SGVsbG9UaW1lWzFdID0gU0tfUkxNVF9TUFRfSEVMTE9fVElNRTE7CisJCXBTUGFja2V0LT5Gb3J3YXJkRGVsYXlbMF0gPSBTS19STE1UX1NQVF9GV0RfREVMQVkwOworCQlwU1BhY2tldC0+Rm9yd2FyZERlbGF5WzFdID0gU0tfUkxNVF9TUFRfRldEX0RFTEFZMTsKKworCQlMZW5ndGggPSBTS19STE1UX01BWF9QQUNLRVRfU0laRTsJLyogT3Igc21hbGxlci4gKi8KKwkJcE1iLT5MZW5ndGggPSBMZW5ndGg7CisJCXBNYi0+UG9ydElkeCA9IFBvcnROdW1iZXI7CisJCUxlbmd0aCAtPSAxNDsKKwkJU0tfVTE2X1RPX05FVFdPUktfT1JERVIoTGVuZ3RoLCAmcFNQYWNrZXQtPlR5cGVMZW5bMF0pOworCisJCXBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLlR4U3BIZWxsb1JlcUN0cysrOworCX0KKworCXJldHVybiAocE1iKTsKK30JLyogU2tSbG10QnVpbGRTcGFubmluZ1RyZWVQYWNrZXQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10U2VuZCAtIGJ1aWxkIGFuZCBzZW5kIGNoZWNrIHBhY2tldHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCURlcGVuZGluZyBvbiB0aGUgUkxNVCBzdGF0ZSBhbmQgdGhlIGNoZWNraW5nIHN0YXRlLCBzZXZlcmFsIHBhY2tldHMKKyAqCWFyZSBzZW50IHRocm91Z2ggdGhlIGluZGljYXRlZCBwb3J0LgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZy4KKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRTZW5kKAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIEkvTyBDb250ZXh0ICovCitTS19VMzIJUG9ydE51bWJlcikJLyogU2VuZGluZyBwb3J0ICovCit7CisJdW5zaWduZWQJajsKKwlTS19FVlBBUkEJUGFyYTsKKwlTS19STE1UX1BPUlQJKnBSUG9ydDsKKworCXBSUG9ydCA9ICZwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXTsKKwlpZiAocEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uTmV0LT5SbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfTE9DX0xJTkspIHsKKwkJaWYgKHBSUG9ydC0+Q2hlY2tpbmdTdGF0ZSAmIChTS19STE1UX1BDU19UWCB8IFNLX1JMTVRfUENTX1JYKSkgeworCQkJLyogUG9ydCBpcyBzdXNwaWNpb3VzLiBTZW5kIHRoZSBSTE1UIHBhY2tldCB0byB0aGUgUkxNVCBtYyBhZGRyLiAqLworCQkJaWYgKChQYXJhLnBQYXJhUHRyID0gU2tSbG10QnVpbGRQYWNrZXQocEFDLCBJb0MsIFBvcnROdW1iZXIsCisJCQkJU0tfUEFDS0VUX0FMSVZFLCAmcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl0uQ3VycmVudE1hY0FkZHJlc3MsCisJCQkJJlNrUmxtdE1jQWRkcikpICE9IE5VTEwpIHsKKwkJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1JMTVRfU0VORCwgUGFyYSk7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvKgorCQkJICogU2VuZCBhIGRpcmVjdGVkIFJMTVQgcGFja2V0IHRvIGFsbCBwb3J0cyB0aGF0IGFyZQorCQkJICogY2hlY2tlZCBieSB0aGUgaW5kaWNhdGVkIHBvcnQuCisJCQkgKi8KKwkJCWZvciAoaiA9IDA7IGogPCBwUlBvcnQtPlBvcnRzQ2hlY2tlZDsgaisrKSB7CisJCQkJaWYgKChQYXJhLnBQYXJhUHRyID0gU2tSbG10QnVpbGRQYWNrZXQocEFDLCBJb0MsIFBvcnROdW1iZXIsCisJCQkJCVNLX1BBQ0tFVF9BTElWRSwgJnBBQy0+QWRkci5Qb3J0W1BvcnROdW1iZXJdLkN1cnJlbnRNYWNBZGRyZXNzLAorCQkJCQkmcFJQb3J0LT5Qb3J0Q2hlY2tbal0uQ2hlY2tBZGRyKSkgIT0gTlVMTCkgeworCQkJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1JMTVRfU0VORCwgUGFyYSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYgKChwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5OZXQtPlJsbXRNb2RlICYgU0tfUkxNVF9DSEVDS19TRUcpICYmCisJCShwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5OZXQtPkNoZWNraW5nU3RhdGUgJiBTS19STE1UX1JDU19TRU5EX1NFRykpIHsKKwkJLyoKKwkJICogU2VuZCBhIEJQRFUgcGFja2V0IHRvIG1ha2UgYSBjb25uZWN0ZWQgc3dpdGNoIHRlbGwgdXMKKwkJICogdGhlIGNvcnJlY3Qgcm9vdCBicmlkZ2UuCisJCSAqLworCQlpZiAoKFBhcmEucFBhcmFQdHIgPQorCQkJU2tSbG10QnVpbGRTcGFubmluZ1RyZWVQYWNrZXQocEFDLCBJb0MsIFBvcnROdW1iZXIpKSAhPSBOVUxMKSB7CisJCQlwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5OZXQtPkNoZWNraW5nU3RhdGUgJj0gflNLX1JMTVRfUkNTX1NFTkRfU0VHOworCQkJcFJQb3J0LT5Sb290SWRTZXQgPSBTS19GQUxTRTsKKworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9STE1UX1NFTkQsIFBhcmEpOworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfVFgsCisJCQkJKCJTa1JsbXRTZW5kOiBCUERVIFBhY2tldCBvbiBQb3J0ICV1LlxuIiwgUG9ydE51bWJlcikpCisJCX0KKwl9CisJcmV0dXJuOworfQkvKiBTa1JsbXRTZW5kICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdFBvcnRSZWNlaXZlcyAtIGNoZWNrIGlmIHBvcnQgaXMgKGdvaW5nKSBkb3duIGFuZCBicmluZyBpdCB1cAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGNoZWNrcyBpZiBhIHBvcnQgd2hvIHJlY2VpdmVkIGEgbm9uLUJQRFUgcGFja2V0CisgKgluZWVkcyB0byBnbyB1cCBvciBuZWVkcyB0byBiZSBzdG9wcGVkIGdvaW5nIGRvd24uCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nLgorICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdFBvcnRSZWNlaXZlcygKK1NLX0FDCSpwQUMsCQkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJCS8qIEkvTyBDb250ZXh0ICovCitTS19VMzIJUG9ydE51bWJlcikJCS8qIFBvcnQgdG8gY2hlY2sgKi8KK3sKKwlTS19STE1UX1BPUlQJKnBSUG9ydDsKKwlTS19FVlBBUkEJCVBhcmE7CisKKwlwUlBvcnQgPSAmcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl07CisJcFJQb3J0LT5Qb3J0Tm9SeCA9IFNLX0ZBTFNFOworCisJaWYgKChwUlBvcnQtPlBvcnRTdGF0ZSA9PSBTS19STE1UX1BTX0RPV04pICYmCisJCSEocFJQb3J0LT5DaGVja2luZ1N0YXRlICYgU0tfUkxNVF9QQ1NfVFgpKSB7CisJCS8qCisJCSAqIFBvcnQgaXMgbWFya2VkIGRvd24gKHJ4KSwgYnV0IHJlY2VpdmVkIGEgbm9uLUJQRFUgcGFja2V0LgorCQkgKiBCcmluZyBpdCB1cC4KKwkJICovCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX1JYLAorCQkJKCJTa1JsbXRQYWNrZXRSZWNlaXZlOiBSZWNlaXZlZCBvbiBQb3J0RG93bi5cbiIpKQorCisJCXBSUG9ydC0+UG9ydFN0YXRlID0gU0tfUkxNVF9QU19HT0lOR19VUDsKKwkJcFJQb3J0LT5HdVRpbWVTdGFtcCA9IFNrT3NHZXRUaW1lKHBBQyk7CisJCVBhcmEuUGFyYTMyWzBdID0gUG9ydE51bWJlcjsKKwkJUGFyYS5QYXJhMzJbMV0gPSAoU0tfVTMyKS0xOworCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwUlBvcnQtPlVwVGltZXIsIFNLX1JMTVRfUE9SVFVQX1RJTV9WQUwsCisJCQlTS0dFX1JMTVQsIFNLX1JMTVRfUE9SVFVQX1RJTSwgUGFyYSk7CisJCXBSUG9ydC0+Q2hlY2tpbmdTdGF0ZSAmPSB+U0tfUkxNVF9QQ1NfUlg7CisJCS8qIHBBQy0+UmxtdC5DaGVja1N3aXRjaCA9IFNLX1RSVUU7ICovCisJCVNrUmxtdENoZWNrU3dpdGNoKHBBQywgSW9DLCBwUlBvcnQtPk5ldC0+TmV0TnVtYmVyKTsKKwl9CS8qIFBvcnREb3duICYmICFTdXNwZWN0VHggKi8KKwllbHNlIGlmIChwUlBvcnQtPkNoZWNraW5nU3RhdGUgJiBTS19STE1UX1BDU19SWCkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9SWCwKKwkJCSgiU2tSbG10UGFja2V0UmVjZWl2ZTogU3RvcCBicmluZ2luZyBwb3J0IGRvd24uXG4iKSkKKwkJU2tUaW1lclN0b3AocEFDLCBJb0MsICZwUlBvcnQtPkRvd25SeFRpbWVyKTsKKwkJcFJQb3J0LT5DaGVja2luZ1N0YXRlICY9IH5TS19STE1UX1BDU19SWDsKKwkJLyogcEFDLT5SbG10LkNoZWNrU3dpdGNoID0gU0tfVFJVRTsgKi8KKwkJU2tSbG10Q2hlY2tTd2l0Y2gocEFDLCBJb0MsIHBSUG9ydC0+TmV0LT5OZXROdW1iZXIpOworCX0JLyogUG9ydEdvaW5nRG93biAqLworCisJcmV0dXJuOworfQkvKiBTa1JsbXRQb3J0UmVjZWl2ZXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10UGFja2V0UmVjZWl2ZSAtIHJlY2VpdmUgYSBwYWNrZXQgZm9yIGNsb3NlciBleGFtaW5hdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGV4YW1pbmVzIGEgcGFja2V0IG1vcmUgY2xvc2VseSB0aGFuIFNLX1JMTVRfTE9PS0FIRUFELgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZy4KKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRQYWNrZXRSZWNlaXZlKAorU0tfQUMJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfTUJVRgkqcE1iKQkvKiBSZWNlaXZlZCBwYWNrZXQgKi8KK3sKKyNpZmRlZiB4REVCVUcKKwlleHRlcm4Jdm9pZCBEdW1wRGF0YShjaGFyICpwLCBpbnQgc2l6ZSk7CisjZW5kaWYJLyogREVCVUcgKi8KKwlpbnQJCQkJCWk7CisJdW5zaWduZWQJCQlqOworCVNLX1UxNgkJCQlQYWNrZXRUeXBlOworCVNLX1UzMgkJCQlQb3J0TnVtYmVyOworCVNLX0FERFJfUE9SVAkJKnBBUG9ydDsKKwlTS19STE1UX1BPUlQJCSpwUlBvcnQ7CisJU0tfUkxNVF9QQUNLRVQJCSpwUlBhY2tldDsKKwlTS19TUFRSRUVfUEFDS0VUCSpwU1BhY2tldDsKKwlTS19FVlBBUkEJCQlQYXJhOworCisJUG9ydE51bWJlcgk9IHBNYi0+UG9ydElkeDsKKwlwQVBvcnQgPSAmcEFDLT5BZGRyLlBvcnRbUG9ydE51bWJlcl07CisJcFJQb3J0ID0gJnBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdOworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfUlgsCisJCSgiU2tSbG10UGFja2V0UmVjZWl2ZTogUG9ydE51bWJlciA9PSAlZC5cbiIsIFBvcnROdW1iZXIpKQorCisJcFJQYWNrZXQgPSAoU0tfUkxNVF9QQUNLRVQqKXBNYi0+cERhdGE7CisJcFNQYWNrZXQgPSAoU0tfU1BUUkVFX1BBQ0tFVCopcFJQYWNrZXQ7CisKKyNpZmRlZiB4REVCVUcKKwlEdW1wRGF0YSgoY2hhciAqKXBSUGFja2V0LCAzMik7CisjZW5kaWYJLyogREVCVUcgKi8KKworCWlmICgocFJQb3J0LT5QYWNrZXRzUGVyVGltZVNsb3QgLSBwUlBvcnQtPkJwZHVQYWNrZXRzUGVyVGltZVNsb3QpICE9IDApIHsKKwkJU2tSbG10UG9ydFJlY2VpdmVzKHBBQywgSW9DLCBQb3J0TnVtYmVyKTsKKwl9CisJCisJLyogQ2hlY2sgZGVzdGluYXRpb24gYWRkcmVzcy4gKi8KKworCWlmICghU0tfQUREUl9FUVVBTChwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmEsIHBSUGFja2V0LT5Ec3RBZGRyKSAmJgorCQkhU0tfQUREUl9FUVVBTChTa1JsbXRNY0FkZHIuYSwgcFJQYWNrZXQtPkRzdEFkZHIpICYmCisJCSFTS19BRERSX0VRVUFMKEJyaWRnZU1jQWRkci5hLCBwUlBhY2tldC0+RHN0QWRkcikpIHsKKworCQkvKiBOb3Qgc2VudCB0byBjdXJyZW50IE1BQyBvciByZWdpc3RlcmVkIE1DIGFkZHJlc3MgPT4gVHJhc2ggaXQuICovCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX1JYLAorCQkJKCJTa1JsbXRQYWNrZXRSZWNlaXZlOiBOb3QgZm9yIG1lLlxuIikpCisKKwkJU2tEcnZGcmVlUmxtdE1idWYocEFDLCBJb0MsIHBNYik7CisJCXJldHVybjsKKwl9CisJZWxzZSBpZiAoU0tfQUREUl9FUVVBTChwQVBvcnQtPkN1cnJlbnRNYWNBZGRyZXNzLmEsIHBSUGFja2V0LT5TcmNBZGRyKSkgeworCisJCS8qCisJCSAqIFdhcyBzZW50IGJ5IHNhbWUgcG9ydCAobWF5IGhhcHBlbiBkdXJpbmcgcG9ydCBzd2l0Y2hpbmcKKwkJICogb3IgaW4gY2FzZSBvZiBkdXBsaWNhdGUgTUFDIGFkZHJlc3NlcykuCisJCSAqLworCisJCS8qCisJCSAqIENoZWNrIGZvciBkdXBsaWNhdGUgYWRkcmVzcyBoZXJlOgorCQkgKiBJZiBQYWNrZXQuUmFuZG9tICE9IE15LlJhbmRvbSA9PiBEdXBBZGRyLgorCQkgKi8KKwkJZm9yIChpID0gMzsgaSA+PSAwOyBpLS0pIHsKKwkJCWlmIChwUlBvcnQtPlJhbmRvbVtpXSAhPSBwUlBhY2tldC0+UmFuZG9tW2ldKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBDQVVUSU9OOiBEbyBub3QgY2hlY2sgZm9yIGR1cGxpY2F0ZSBNQUMgYWRkcmVzcyBpbiBSTE1UIEFsaXZlIFJlcGx5CisJCSAqIHBhY2tldHMgKHRoZXkgaGF2ZSB0aGUgTExDX0NPTU1BTkRfUkVTUE9OU0VfQklUIHNldCBpbgorCQkgKiBwUlBhY2tldC0+U1NhcCkuCisJCSAqLworCQlpZiAoaSA+PSAwICYmIHBSUGFja2V0LT5EU2FwID09IFNLX1JMTVRfRFNBUCAmJgorCQkJcFJQYWNrZXQtPkN0cmwgPT0gU0tfUkxNVF9DVFJMICYmCisJCQlwUlBhY2tldC0+U1NhcCA9PSBTS19STE1UX1NTQVAgJiYKKwkJCXBSUGFja2V0LT5JbmRpY2F0b3JbMF0gPT0gU0tfUkxNVF9JTkRJQ0FUT1IwICYmCisJCQlwUlBhY2tldC0+SW5kaWNhdG9yWzFdID09IFNLX1JMTVRfSU5ESUNBVE9SMSAmJgorCQkJcFJQYWNrZXQtPkluZGljYXRvclsyXSA9PSBTS19STE1UX0lORElDQVRPUjIgJiYKKwkJCXBSUGFja2V0LT5JbmRpY2F0b3JbM10gPT0gU0tfUkxNVF9JTkRJQ0FUT1IzICYmCisJCQlwUlBhY2tldC0+SW5kaWNhdG9yWzRdID09IFNLX1JMTVRfSU5ESUNBVE9SNCAmJgorCQkJcFJQYWNrZXQtPkluZGljYXRvcls1XSA9PSBTS19STE1UX0lORElDQVRPUjUgJiYKKwkJCXBSUGFja2V0LT5JbmRpY2F0b3JbNl0gPT0gU0tfUkxNVF9JTkRJQ0FUT1I2KSB7CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9SWCwKKwkJCQkoIlNrUmxtdFBhY2tldFJlY2VpdmU6IER1cGxpY2F0ZSBNQUMgQWRkcmVzcy5cbiIpKQorCisJCQkvKiBFcnJvciBMb2cgZW50cnkuICovCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfQ09NTSwgU0tFUlJfUkxNVF9FMDA2LCBTS0VSUl9STE1UX0UwMDZfTVNHKTsKKwkJfQorCQllbHNlIHsKKwkJCS8qIFNpbXBseSB0cmFzaCBpdC4gKi8KKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX1JYLAorCQkJCSgiU2tSbG10UGFja2V0UmVjZWl2ZTogU2VudCBieSBtZS5cbiIpKQorCQl9CisKKwkJU2tEcnZGcmVlUmxtdE1idWYocEFDLCBJb0MsIHBNYik7CisJCXJldHVybjsKKwl9CisKKwkvKiBDaGVjayBTdXNwZWN0VHggZW50cmllcy4gKi8KKwlpZiAocFJQb3J0LT5Qb3J0c1N1c3BlY3QgPiAwKSB7CisJCWZvciAoaiA9IDA7IGogPCBwUlBvcnQtPlBvcnRzQ2hlY2tlZDsgaisrKSB7CisJCQlpZiAocFJQb3J0LT5Qb3J0Q2hlY2tbal0uU3VzcGVjdFR4ICYmCisJCQkJU0tfQUREUl9FUVVBTCgKKwkJCQkJcFJQYWNrZXQtPlNyY0FkZHIsIHBSUG9ydC0+UG9ydENoZWNrW2pdLkNoZWNrQWRkci5hKSkgeworCQkJCXBSUG9ydC0+UG9ydENoZWNrW2pdLlN1c3BlY3RUeCA9IFNLX0ZBTFNFOworCQkJCXBSUG9ydC0+UG9ydHNTdXNwZWN0LS07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBEZXRlcm1pbmUgdHlwZSBvZiBwYWNrZXQuICovCisJaWYgKHBSUGFja2V0LT5EU2FwID09IFNLX1JMTVRfRFNBUCAmJgorCQlwUlBhY2tldC0+Q3RybCA9PSBTS19STE1UX0NUUkwgJiYKKwkJKHBSUGFja2V0LT5TU2FwICYgfkxMQ19DT01NQU5EX1JFU1BPTlNFX0JJVCkgPT0gU0tfUkxNVF9TU0FQICYmCisJCXBSUGFja2V0LT5JbmRpY2F0b3JbMF0gPT0gU0tfUkxNVF9JTkRJQ0FUT1IwICYmCisJCXBSUGFja2V0LT5JbmRpY2F0b3JbMV0gPT0gU0tfUkxNVF9JTkRJQ0FUT1IxICYmCisJCXBSUGFja2V0LT5JbmRpY2F0b3JbMl0gPT0gU0tfUkxNVF9JTkRJQ0FUT1IyICYmCisJCXBSUGFja2V0LT5JbmRpY2F0b3JbM10gPT0gU0tfUkxNVF9JTkRJQ0FUT1IzICYmCisJCXBSUGFja2V0LT5JbmRpY2F0b3JbNF0gPT0gU0tfUkxNVF9JTkRJQ0FUT1I0ICYmCisJCXBSUGFja2V0LT5JbmRpY2F0b3JbNV0gPT0gU0tfUkxNVF9JTkRJQ0FUT1I1ICYmCisJCXBSUGFja2V0LT5JbmRpY2F0b3JbNl0gPT0gU0tfUkxNVF9JTkRJQ0FUT1I2KSB7CisKKwkJLyogSXQncyBhbiBSTE1UIHBhY2tldC4gKi8KKwkJUGFja2V0VHlwZSA9IChTS19VMTYpKChwUlBhY2tldC0+UmxtdFBhY2tldFR5cGVbMF0gPDwgOCkgfAorCQkJcFJQYWNrZXQtPlJsbXRQYWNrZXRUeXBlWzFdKTsKKworCQlzd2l0Y2ggKFBhY2tldFR5cGUpIHsKKwkJY2FzZSBTS19QQUNLRVRfQU5OT1VOQ0U6CS8qIE5vdCB5ZXQgdXNlZC4gKi8KKyNpZiAwCisJCQkvKiBCdWlsZCB0aGUgY2hlY2sgY2hhaW4uICovCisJCQlTa1JsbXRCdWlsZENoZWNrQ2hhaW4ocEFDKTsKKyNlbmRpZgkvKiAwICovCisKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX1JYLAorCQkJCSgiU2tSbG10UGFja2V0UmVjZWl2ZTogQW5ub3VuY2UuXG4iKSkKKworCQkJU2tEcnZGcmVlUmxtdE1idWYocEFDLCBJb0MsIHBNYik7CisJCQlicmVhazsKKworCQljYXNlIFNLX1BBQ0tFVF9BTElWRToKKwkJCWlmIChwUlBhY2tldC0+U1NhcCAmIExMQ19DT01NQU5EX1JFU1BPTlNFX0JJVCkgeworCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX1JYLAorCQkJCQkoIlNrUmxtdFBhY2tldFJlY2VpdmU6IEFsaXZlIFJlcGx5LlxuIikpCisKKwkJCQlpZiAoIShwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5Qcm9tTW9kZSAmIFNLX1BST01fTU9ERV9MTEMpIHx8CisJCQkJCVNLX0FERFJfRVFVQUwoCisJCQkJCQlwUlBhY2tldC0+RHN0QWRkciwgcEFQb3J0LT5DdXJyZW50TWFjQWRkcmVzcy5hKSkgeworCQkJCQkvKiBPYnZpb3VzbHkgd2UgY291bGQgc2VuZCBzb21ldGhpbmcuICovCisJCQkJCWlmIChwUlBvcnQtPkNoZWNraW5nU3RhdGUgJiBTS19STE1UX1BDU19UWCkgeworCQkJCQkJcFJQb3J0LT5DaGVja2luZ1N0YXRlICY9ICB+U0tfUkxNVF9QQ1NfVFg7CisJCQkJCQlTa1RpbWVyU3RvcChwQUMsIElvQywgJnBSUG9ydC0+RG93blR4VGltZXIpOworCQkJCQl9CisKKwkJCQkJaWYgKChwUlBvcnQtPlBvcnRTdGF0ZSA9PSBTS19STE1UX1BTX0RPV04pICYmCisJCQkJCQkhKHBSUG9ydC0+Q2hlY2tpbmdTdGF0ZSAmIFNLX1JMTVRfUENTX1JYKSkgeworCQkJCQkJcFJQb3J0LT5Qb3J0U3RhdGUgPSBTS19STE1UX1BTX0dPSU5HX1VQOworCQkJCQkJcFJQb3J0LT5HdVRpbWVTdGFtcCA9IFNrT3NHZXRUaW1lKHBBQyk7CisKKwkJCQkJCVNrVGltZXJTdG9wKHBBQywgSW9DLCAmcFJQb3J0LT5Eb3duVHhUaW1lcik7CisKKwkJCQkJCVBhcmEuUGFyYTMyWzBdID0gUG9ydE51bWJlcjsKKwkJCQkJCVBhcmEuUGFyYTMyWzFdID0gKFNLX1UzMiktMTsKKwkJCQkJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBSUG9ydC0+VXBUaW1lciwKKwkJCQkJCQlTS19STE1UX1BPUlRVUF9USU1fVkFMLCBTS0dFX1JMTVQsCisJCQkJCQkJU0tfUkxNVF9QT1JUVVBfVElNLCBQYXJhKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8qIE1hcmsgc2VuZGluZyBwb3J0IGFzIGFsaXZlPyAqLworCQkJCVNrRHJ2RnJlZVJsbXRNYnVmKHBBQywgSW9DLCBwTWIpOworCQkJfQorCQkJZWxzZSB7CS8qIEFsaXZlIFJlcXVlc3QgUGFja2V0LiAqLworCQkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX1JYLAorCQkJCQkoIlNrUmxtdFBhY2tldFJlY2VpdmU6IEFsaXZlIFJlcXVlc3QuXG4iKSkKKworCQkJCXBSUG9ydC0+UnhIZWxsb0N0cysrOworCisJCQkJLyogQW5zd2VyLiAqLworCQkJCWZvciAoaSA9IDA7IGkgPCBTS19NQUNfQUREUl9MRU47IGkrKykgeworCQkJCQlwUlBhY2tldC0+RHN0QWRkcltpXSA9IHBSUGFja2V0LT5TcmNBZGRyW2ldOworCQkJCQlwUlBhY2tldC0+U3JjQWRkcltpXSA9CisJCQkJCQlwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5DdXJyZW50TWFjQWRkcmVzcy5hW2ldOworCQkJCX0KKwkJCQlwUlBhY2tldC0+U1NhcCB8PSBMTENfQ09NTUFORF9SRVNQT05TRV9CSVQ7CisKKwkJCQlQYXJhLnBQYXJhUHRyID0gcE1iOworCQkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUkxNVF9TRU5ELCBQYXJhKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU0tfUEFDS0VUX0NIRUNLX1RYOgorCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfUlgsCisJCQkJKCJTa1JsbXRQYWNrZXRSZWNlaXZlOiBDaGVjayB5b3VyIHR4IGxpbmUuXG4iKSkKKworCQkJLyogQSBwb3J0IGNoZWNraW5nIHVzIHJlcXVlc3RzIHVzIHRvIGNoZWNrIG91ciB0eCBsaW5lLiAqLworCQkJcFJQb3J0LT5DaGVja2luZ1N0YXRlIHw9IFNLX1JMTVRfUENTX1RYOworCisJCQkvKiBTdGFydCBQb3J0RG93blR4IHRpbWVyLiAqLworCQkJUGFyYS5QYXJhMzJbMF0gPSBQb3J0TnVtYmVyOworCQkJUGFyYS5QYXJhMzJbMV0gPSAoU0tfVTMyKS0xOworCQkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcFJQb3J0LT5Eb3duVHhUaW1lciwKKwkJCQlTS19STE1UX1BPUlRET1dOX1RJTV9WQUwsIFNLR0VfUkxNVCwKKwkJCQlTS19STE1UX1BPUlRET1dOX1RYX1RJTSwgUGFyYSk7CisKKwkJCVNrRHJ2RnJlZVJsbXRNYnVmKHBBQywgSW9DLCBwTWIpOworCisJCQlpZiAoKFBhcmEucFBhcmFQdHIgPSBTa1JsbXRCdWlsZFBhY2tldChwQUMsIElvQywgUG9ydE51bWJlciwKKwkJCQlTS19QQUNLRVRfQUxJVkUsICZwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5DdXJyZW50TWFjQWRkcmVzcywKKwkJCQkmU2tSbG10TWNBZGRyKSkgIT0gTlVMTCkgeworCQkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUkxNVF9TRU5ELCBQYXJhKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU0tfUEFDS0VUX0FERFJfQ0hBTkdFRDoKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX1JYLAorCQkJCSgiU2tSbG10UGFja2V0UmVjZWl2ZTogQWRkcmVzcyBDaGFuZ2UuXG4iKSkKKworCQkJLyogQnVpbGQgdGhlIGNoZWNrIGNoYWluLiAqLworCQkJU2tSbG10QnVpbGRDaGVja0NoYWluKHBBQywgcFJQb3J0LT5OZXQtPk5ldE51bWJlcik7CisJCQlTa0RydkZyZWVSbG10TWJ1ZihwQUMsIElvQywgcE1iKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9SWCwKKwkJCQkoIlNrUmxtdFBhY2tldFJlY2VpdmU6IFVua25vd24gUkxNVCBwYWNrZXQuXG4iKSkKKworCQkJLyogUkE7Ojs6ID8/PyAqLworCQkJU2tEcnZGcmVlUmxtdE1idWYocEFDLCBJb0MsIHBNYik7CisJCX0KKwl9CisJZWxzZSBpZiAocFNQYWNrZXQtPkRTYXAgPT0gU0tfUkxNVF9TUFRfRFNBUCAmJgorCQlwU1BhY2tldC0+Q3RybCA9PSBTS19STE1UX1NQVF9DVFJMICYmCisJCShwU1BhY2tldC0+U1NhcCAmIH5MTENfQ09NTUFORF9SRVNQT05TRV9CSVQpID09IFNLX1JMTVRfU1BUX1NTQVApIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfUlgsCisJCQkoIlNrUmxtdFBhY2tldFJlY2VpdmU6IEJQRFUgUGFja2V0LlxuIikpCisKKwkJLyogU3Bhbm5pbmcgVHJlZSBwYWNrZXQuICovCisJCXBSUG9ydC0+UnhTcEhlbGxvQ3RzKys7CisKKwkJaWYgKCFTS19BRERSX0VRVUFMKCZwU1BhY2tldC0+Um9vdElkWzJdLCAmcEFDLT5BZGRyLk5ldFtwQUMtPlJsbXQuCisJCQlQb3J0W1BvcnROdW1iZXJdLk5ldC0+TmV0TnVtYmVyXS5DdXJyZW50TWFjQWRkcmVzcy5hWzBdKSkgeworCQkJLyoKKwkJCSAqIENoZWNrIHNlZ21lbnRhdGlvbiBpZiBhIG5ldyByb290IGJyaWRnZSBpcyBzZXQgYW5kCisJCQkgKiB0aGUgc2VnbWVudGF0aW9uIGNoZWNrIGlzIG5vdCBjdXJyZW50bHkgcnVubmluZy4KKwkJCSAqLworCQkJaWYgKCFTS19BRERSX0VRVUFMKCZwU1BhY2tldC0+Um9vdElkWzJdLCAmcFJQb3J0LT5Sb290LklkWzJdKSAmJgorCQkJCShwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5OZXQtPkxpbmtzVXAgPiAxKSAmJgorCQkJCShwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5OZXQtPlJsbXRNb2RlICYgU0tfUkxNVF9DSEVDS19TRUcpCisJCQkJIT0gMCAmJiAocEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uTmV0LT5DaGVja2luZ1N0YXRlICYKKwkJCQlTS19STE1UX1JDU19TRUcpID09IDApIHsKKwkJCQlwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5OZXQtPkNoZWNraW5nU3RhdGUgfD0KKwkJCQkJU0tfUkxNVF9SQ1NfU1RBUlRfU0VHIHwgU0tfUkxNVF9SQ1NfU0VORF9TRUc7CisJCQl9CisKKwkJCS8qIFN0b3JlIHRyZWUgdmlldyBvZiB0aGlzIHBvcnQuICovCisJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQkJcFJQb3J0LT5Sb290LklkW2ldID0gcFNQYWNrZXQtPlJvb3RJZFtpXTsKKwkJCX0KKwkJCXBSUG9ydC0+Um9vdElkU2V0ID0gU0tfVFJVRTsKKworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfRFVNUCwKKwkJCQkoIlJvb3QgSUQgJWQ6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeC5cbiIsCisJCQkJCVBvcnROdW1iZXIsCisJCQkJCXBSUG9ydC0+Um9vdC5JZFswXSwgcFJQb3J0LT5Sb290LklkWzFdLAorCQkJCQlwUlBvcnQtPlJvb3QuSWRbMl0sIHBSUG9ydC0+Um9vdC5JZFszXSwKKwkJCQkJcFJQb3J0LT5Sb290LklkWzRdLCBwUlBvcnQtPlJvb3QuSWRbNV0sCisJCQkJCXBSUG9ydC0+Um9vdC5JZFs2XSwgcFJQb3J0LT5Sb290LklkWzddKSkKKwkJfQorCisJCVNrRHJ2RnJlZVJsbXRNYnVmKHBBQywgSW9DLCBwTWIpOworCQlpZiAoKHBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLk5ldC0+Q2hlY2tpbmdTdGF0ZSAmCisJCQlTS19STE1UX1JDU19SRVBPUlRfU0VHKSAhPSAwKSB7CisJCQlTa1JsbXRDaGVja1NlZyhwQUMsIElvQywgcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uTmV0LT5OZXROdW1iZXIpOworCQl9CisJfQorCWVsc2UgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9SWCwKKwkJCSgiU2tSbG10UGFja2V0UmVjZWl2ZTogVW5rbm93biBQYWNrZXQgVHlwZS5cbiIpKQorCisJCS8qIFVua25vd24gcGFja2V0LiAqLworCQlTa0RydkZyZWVSbG10TWJ1ZihwQUMsIElvQywgcE1iKTsKKwl9CisJcmV0dXJuOworfQkvKiBTa1JsbXRQYWNrZXRSZWNlaXZlICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdENoZWNrUG9ydCAtIGNoZWNrIGlmIGEgcG9ydCB3b3JrcworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGNoZWNrcyBpZiBhIHBvcnQgd2hvc2UgbGluayBpcyB1cCByZWNlaXZlZCBzb21ldGhpbmcKKyAqCWFuZCBpZiBpdCBzZWVtcyB0byB0cmFuc21pdCBzdWNjZXNzZnVsbHkuCisgKgorICoJIyBQb3J0U3RhdGU6IFBzSW5pdCwgUHNMaW5rRG93biwgUHNEb3duLCBQc0dvaW5nVXAsIFBzVXAKKyAqCSMgUG9ydENoZWNraW5nU3RhdGUgKEJpdGZpZWxkKTogQ2hrVHgsIENoa1J4LCBDaGtTZWcKKyAqCSMgUmxtdENoZWNraW5nU3RhdGUgKEJpdGZpZWxkKTogQ2hrU2VnLCBTdGFydENoa1NlZywgUmVwb3J0U2VnCisgKgorICoJaWYgKFJ4IC0gUnhCcGR1ID09IDApIHsJIyBObyByeC4KKyAqCQlpZiAoc3RhdGUgPT0gUHNVcCkgeworICoJCQlQb3J0Q2hlY2tpbmdTdGF0ZSB8PSBDaGtSeAorICoJCX0KKyAqCQlpZiAoTW9kZUNoZWNrU2VnICYmIChUaW1lb3V0ID09CisgKgkJCVRPX1NIT1JURU4oUkxNVF9ERUZBVUxUX1RJTUVPVVQpKSkgeworICoJCQlSbG10Q2hlY2tpbmdTdGF0ZSB8PSBDaGtTZWcpCisgKgkJCVBvcnRDaGVja2luZ1N0YXRlIHw9IENoa1NlZworICoJCX0KKyAqCQlOZXdUaW1lb3V0ID0gVE9fU0hPUlRFTihUaW1lb3V0KQorICoJCWlmIChOZXdUaW1lb3V0IDwgUkxNVF9NSU5fVElNRU9VVCkgeworICoJCQlOZXdUaW1lb3V0ID0gUkxNVF9NSU5fVElNRU9VVAorICoJCQlQb3J0U3RhdGUgPSBQc0Rvd24KKyAqCQkJLi4uCisgKgkJfQorICoJfQorICoJZWxzZSB7CSMgc29tZXRoaW5nIHdhcyByZWNlaXZlZAorICoJCSMgU2V0IGNvdW50ZXIgdG8gMCBhdCBMaW5rRG93bj8KKyAqCQkjICAgTm8gLSByeCBtYXkgYmUgcmVwb3J0ZWQgYWZ0ZXIgTGlua0Rvd24gPz8/CisgKgkJUG9ydENoZWNraW5nU3RhdGUgJj0gfkNoa1J4CisgKgkJTmV3VGltZW91dCA9IFJMTVRfREVGQVVMVF9USU1FT1VUCisgKgkJaWYgKFJ4QWNrID09IDApIHsKKyAqCQkJcG9zc2libGUgcmVhc29uczoKKyAqCQkJaXMgbXkgdHggbGluZSBiYWQ/IC0tCisgKgkJCQlzZW5kIFJMTVQgbXVsdGljYXN0IGFuZCByZXBvcnQKKyAqCQkJCWJhY2sgaW50ZXJuYWxseT8gKG9ubHkgcG9zc2libGUKKyAqCQkJCWJldHdlZW4gcG9ydHMgb24gc2FtZSBhZGFwdGVyKQorICoJCX0KKyAqCQlpZiAoUnhDaGsgPT0gMCkgeworICoJCQlwb3NzaWJsZSByZWFzb25zOgorICoJCQktIHR4IGxpbmUgb2YgcG9ydCBzZXQgdG8gY2hlY2sgbWUKKyAqCQkJICBtYXliZSBiYWQKKyAqCQkJLSBubyBvdGhlciBwb3J0L2FkYXB0ZXIgYXZhaWxhYmxlIG9yIHNldAorICoJCQkgIHRvIGNoZWNrIG1lCisgKgkJCS0gYWRhcHRlciBjaGVja2luZyBtZSBoYXMgYSBsb25nZXIKKyAqCQkJICB0aW1lb3V0CisgKgkJCT8/PyBhbnl0aGluZyB0aGF0IGNhbiBiZSBkb25lIGhlcmU/CisgKgkJfQorICoJfQorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCisgKiBSZXR1cm5zOgorICoJTmV3IHRpbWVvdXQgdmFsdWUuCisgKi8KK1JMTVRfU1RBVElDIFNLX1UzMglTa1JsbXRDaGVja1BvcnQoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSS9PIENvbnRleHQgKi8KK1NLX1UzMglQb3J0TnVtYmVyKQkvKiBQb3J0IHRvIGNoZWNrICovCit7CisJdW5zaWduZWQJCWk7CisJU0tfVTMyCQkJTmV3VGltZW91dDsKKwlTS19STE1UX1BPUlQJKnBSUG9ydDsKKwlTS19FVlBBUkEJCVBhcmE7CisKKwlwUlBvcnQgPSAmcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl07CisKKwlpZiAoKHBSUG9ydC0+UGFja2V0c1BlclRpbWVTbG90IC0gcFJQb3J0LT5CcGR1UGFja2V0c1BlclRpbWVTbG90KSA9PSAwKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNrUmxtdENoZWNrUG9ydCAlZDogTm8gKCVkKSByZWNlaXZlcyBpbiBsYXN0IHRpbWUgc2xvdC5cbiIsCisJCQkJUG9ydE51bWJlciwgcFJQb3J0LT5QYWNrZXRzUGVyVGltZVNsb3QpKQorCisJCS8qCisJCSAqIENoZWNrIHNlZ21lbnRhdGlvbiBpZiB0aGVyZSB3YXMgbm8gcmVjZWl2ZSBhdCBsZWFzdCB0d2ljZQorCQkgKiBpbiBhIHJvdyAoUG9ydE5vUnggaXMgYWxyZWFkeSBzZXQpIGFuZCB0aGUgc2VnbWVudGF0aW9uCisJCSAqIGNoZWNrIGlzIG5vdCBjdXJyZW50bHkgcnVubmluZy4KKwkJICovCisKKwkJaWYgKHBSUG9ydC0+UG9ydE5vUnggJiYgKHBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLk5ldC0+TGlua3NVcCA+IDEpICYmCisJCQkocEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uTmV0LT5SbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfU0VHKSAmJgorCQkJIShwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5OZXQtPkNoZWNraW5nU3RhdGUgJiBTS19STE1UX1JDU19TRUcpKSB7CisJCQlwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5OZXQtPkNoZWNraW5nU3RhdGUgfD0KKwkJCQlTS19STE1UX1JDU19TVEFSVF9TRUcgfCBTS19STE1UX1JDU19TRU5EX1NFRzsKKwkJfQorCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNrUmxtdENoZWNrUG9ydDogUG9ydHNTdXNwZWN0ICVkLCBQY3NSeCAlZC5cbiIsCisJCQkJcFJQb3J0LT5Qb3J0c1N1c3BlY3QsIHBSUG9ydC0+Q2hlY2tpbmdTdGF0ZSAmIFNLX1JMTVRfUENTX1JYKSkKKworCQlpZiAocFJQb3J0LT5Qb3J0U3RhdGUgIT0gU0tfUkxNVF9QU19ET1dOKSB7CisJCQlOZXdUaW1lb3V0ID0gVE9fU0hPUlRFTihwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5OZXQtPlRpbWVvdXRWYWx1ZSk7CisJCQlpZiAoTmV3VGltZW91dCA8IFNLX1JMTVRfTUlOX1RPX1ZBTCkgeworCQkJCU5ld1RpbWVvdXQgPSBTS19STE1UX01JTl9UT19WQUw7CisJCQl9CisKKwkJCWlmICghKHBSUG9ydC0+Q2hlY2tpbmdTdGF0ZSAmIFNLX1JMTVRfUENTX1JYKSkgeworCQkJCVBhcmEuUGFyYTMyWzBdID0gUG9ydE51bWJlcjsKKwkJCQlwUlBvcnQtPkNoZWNraW5nU3RhdGUgfD0gU0tfUkxNVF9QQ1NfUlg7CisKKwkJCQkvKgorCQkJCSAqIFdoYXQgc2hhbGwgd2UgZG8gaWYgdGhlIHBvcnQgY2hlY2tlZCBieSB0aGlzIG9uZSByZWNlaXZlcworCQkJCSAqIG91ciByZXF1ZXN0IGZyYW1lcz8gIFdoYXQncyBiYWQgLSBvdXIgcnggbGluZSBvciBoaXMgdHggbGluZT8KKwkJCQkgKi8KKwkJCQlQYXJhLlBhcmEzMlsxXSA9IChTS19VMzIpLTE7CisJCQkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcFJQb3J0LT5Eb3duUnhUaW1lciwKKwkJCQkJU0tfUkxNVF9QT1JURE9XTl9USU1fVkFMLCBTS0dFX1JMTVQsCisJCQkJCVNLX1JMTVRfUE9SVERPV05fUlhfVElNLCBQYXJhKTsKKworCQkJCWZvciAoaSA9IDA7IGkgPCBwUlBvcnQtPlBvcnRzQ2hlY2tlZDsgaSsrKSB7CisJCQkJCWlmIChwUlBvcnQtPlBvcnRDaGVja1tpXS5TdXNwZWN0VHgpIHsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCXBSUG9ydC0+UG9ydENoZWNrW2ldLlN1c3BlY3RUeCA9IFNLX1RSVUU7CisJCQkJCXBSUG9ydC0+UG9ydHNTdXNwZWN0Kys7CisJCQkJCWlmICgoUGFyYS5wUGFyYVB0ciA9CisJCQkJCQlTa1JsbXRCdWlsZFBhY2tldChwQUMsIElvQywgUG9ydE51bWJlciwgU0tfUEFDS0VUX0NIRUNLX1RYLAorCQkJCQkJCSZwQUMtPkFkZHIuUG9ydFtQb3J0TnVtYmVyXS5DdXJyZW50TWFjQWRkcmVzcywKKwkJCQkJCQkmcFJQb3J0LT5Qb3J0Q2hlY2tbaV0uQ2hlY2tBZGRyKSkgIT0gTlVMTCkgeworCQkJCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9STE1UX1NFTkQsIFBhcmEpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UgewkvKiBQb3J0RG93biAtLSBvciBhbGwgcGFydG5lcnMgc3VzcGVjdC4gKi8KKwkJCU5ld1RpbWVvdXQgPSBTS19STE1UX0RFRl9UT19WQUw7CisJCX0KKwkJcFJQb3J0LT5Qb3J0Tm9SeCA9IFNLX1RSVUU7CisJfQorCWVsc2UgewkvKiBBIG5vbi1CUERVIHBhY2tldCB3YXMgcmVjZWl2ZWQuICovCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNrUmxtdENoZWNrUG9ydCAlZDogJWQgKCVkKSByZWNlaXZlcyBpbiBsYXN0IHRpbWUgc2xvdC5cbiIsCisJCQkJUG9ydE51bWJlciwKKwkJCQlwUlBvcnQtPlBhY2tldHNQZXJUaW1lU2xvdCAtIHBSUG9ydC0+QnBkdVBhY2tldHNQZXJUaW1lU2xvdCwKKwkJCQlwUlBvcnQtPlBhY2tldHNQZXJUaW1lU2xvdCkpCisJCQorCQlTa1JsbXRQb3J0UmVjZWl2ZXMocEFDLCBJb0MsIFBvcnROdW1iZXIpOworCQlpZiAocEFDLT5SbG10LkNoZWNrU3dpdGNoKSB7CisJCQlTa1JsbXRDaGVja1N3aXRjaChwQUMsIElvQywgcFJQb3J0LT5OZXQtPk5ldE51bWJlcik7CisJCX0KKworCQlOZXdUaW1lb3V0ID0gU0tfUkxNVF9ERUZfVE9fVkFMOworCX0KKworCXJldHVybiAoTmV3VGltZW91dCk7Cit9CS8qIFNrUmxtdENoZWNrUG9ydCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRTZWxlY3RCY1J4IC0gc2VsZWN0IG5ldyBhY3RpdmUgcG9ydCwgY3JpdGVyaWEgMSAoQ0xQKQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIHNlbGVjdHMgdGhlIHBvcnQgdGhhdCByZWNlaXZlZCBhIGJyb2FkY2FzdCBmcmFtZQorICoJc3Vic3RhbnRpYWxseSBsYXRlciB0aGFuIGFsbCBvdGhlciBwb3J0cy4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgorICogUmV0dXJuczoKKyAqCVNLX0JPT0wKKyAqLworUkxNVF9TVEFUSUMgU0tfQk9PTAlTa1JsbXRTZWxlY3RCY1J4KAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIEkvTyBDb250ZXh0ICovCitTS19VMzIJQWN0aXZlLAkJLyogQWN0aXZlIHBvcnQgKi8KK1NLX1UzMglQcmVmUG9ydCwJLyogUHJlZmVycmVkIHBvcnQgKi8KK1NLX1UzMgkqcFNlbGVjdCkJLyogTmV3IGFjdGl2ZSBwb3J0ICovCit7CisJU0tfVTY0CQlCY1RpbWVTdGFtcDsKKwlTS19VMzIJCWk7CisJU0tfQk9PTAkJUG9ydEZvdW5kOworCisJQmNUaW1lU3RhbXAgPSAwOwkvKiBOb3QgdG90YWxseSBuZWNlc3NhcnksIGJ1dCBmZWVsaW5nIGJldHRlci4gKi8KKwlQb3J0Rm91bmQgPSBTS19GQUxTRTsKKwkKKwkvKiBTZWxlY3QgcG9ydCB3aXRoIHRoZSBsYXRlc3QgVGltZVN0YW1wLiAqLworCWZvciAoaSA9IDA7IGkgPCAoU0tfVTMyKXBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiVGltZVN0YW1wIFBvcnQgJWQgKERvd246ICVkLCBOb1J4OiAlZCk6ICUwOHggJTA4eC5cbiIsCisJCQkJaSwKKyAgIAkJCQlwQUMtPlJsbXQuUG9ydFtpXS5Qb3J0RG93biwgcEFDLT5SbG10LlBvcnRbaV0uUG9ydE5vUngsCisJCQkJKigoU0tfVTMyKikoJnBBQy0+UmxtdC5Qb3J0W2ldLkJjVGltZVN0YW1wKSArIE9GRlNfSEkzMiksCisJCQkJKigoU0tfVTMyKikoJnBBQy0+UmxtdC5Qb3J0W2ldLkJjVGltZVN0YW1wKSArIE9GRlNfTE8zMikpKQorCisJCWlmICghcEFDLT5SbG10LlBvcnRbaV0uUG9ydERvd24gJiYgIXBBQy0+UmxtdC5Qb3J0W2ldLlBvcnROb1J4KSB7CisJCQlpZiAoIVBvcnRGb3VuZCB8fCBwQUMtPlJsbXQuUG9ydFtpXS5CY1RpbWVTdGFtcCA+IEJjVGltZVN0YW1wKSB7CisJCQkJQmNUaW1lU3RhbXAgPSBwQUMtPlJsbXQuUG9ydFtpXS5CY1RpbWVTdGFtcDsKKwkJCQkqcFNlbGVjdCA9IGk7CisJCQkJUG9ydEZvdW5kID0gU0tfVFJVRTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChQb3J0Rm91bmQpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiUG9ydCAlZCByZWNlaXZlZCB0aGUgbGFzdCBicm9hZGNhc3QuXG4iLCAqcFNlbGVjdCkpCisKKwkJLyogTG9vayBpZiBhbm90aGVyIHBvcnQncyB0aW1lIHN0YW1wIGlzIHNpbWlsYXIuICovCisJCWZvciAoaSA9IDA7IGkgPCAoU0tfVTMyKXBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCQlpZiAoaSA9PSAqcFNlbGVjdCkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwQUMtPlJsbXQuUG9ydFtpXS5Qb3J0RG93biAmJiAhcEFDLT5SbG10LlBvcnRbaV0uUG9ydE5vUnggJiYKKwkJCQkocEFDLT5SbG10LlBvcnRbaV0uQmNUaW1lU3RhbXAgPgorCQkJCSBCY1RpbWVTdGFtcCAtIFNLX1JMTVRfQkNfREVMVEEgfHwKKwkJCQlwQUMtPlJsbXQuUG9ydFtpXS5CY1RpbWVTdGFtcCArCisJCQkJIFNLX1JMTVRfQkNfREVMVEEgPiBCY1RpbWVTdGFtcCkpIHsKKwkJCQlQb3J0Rm91bmQgPSBTS19GQUxTRTsKKwkJCQkKKwkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJCQkoIlBvcnQgJWQgcmVjZWl2ZWQgYSBicm9hZGNhc3QgYXQgYSBzaW1pbGFyIHRpbWUuXG4iLCBpKSkKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworI2lmZGVmIERFQlVHCisJaWYgKFBvcnRGb3VuZCkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1NFTEVDVF9CQ1JYIGZvdW5kIFBvcnQgJWQgcmVjZWl2aW5nIHRoZSBzdWJzdGFudGlhbGx5ICIKKwkJCSAibGF0ZXN0IGJyb2FkY2FzdCAoJXUpLlxuIiwKKwkJCQkqcFNlbGVjdCwKKwkJCQlCY1RpbWVTdGFtcCAtIHBBQy0+UmxtdC5Qb3J0WzEgLSAqcFNlbGVjdF0uQmNUaW1lU3RhbXApKQorCX0KKyNlbmRpZgkvKiBERUJVRyAqLworCisJcmV0dXJuIChQb3J0Rm91bmQpOworfQkvKiBTa1JsbXRTZWxlY3RCY1J4ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdFNlbGVjdE5vdFN1c3BlY3QgLSBzZWxlY3QgbmV3IGFjdGl2ZSBwb3J0LCBjcml0ZXJpYSAyIChDTFApCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgc2VsZWN0cyBhIGdvb2QgcG9ydCAoaXQgaXMgUG9ydFVwICYmICFTdXNwZWN0UngpLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfQk9PTAorICovCitSTE1UX1NUQVRJQyBTS19CT09MCVNrUmxtdFNlbGVjdE5vdFN1c3BlY3QoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSS9PIENvbnRleHQgKi8KK1NLX1UzMglBY3RpdmUsCQkvKiBBY3RpdmUgcG9ydCAqLworU0tfVTMyCVByZWZQb3J0LAkvKiBQcmVmZXJyZWQgcG9ydCAqLworU0tfVTMyCSpwU2VsZWN0KQkvKiBOZXcgYWN0aXZlIHBvcnQgKi8KK3sKKwlTS19VMzIJCWk7CisJU0tfQk9PTAkJUG9ydEZvdW5kOworCisJUG9ydEZvdW5kID0gU0tfRkFMU0U7CisKKwkvKiBTZWxlY3QgZmlyc3QgcG9ydCB0aGF0IGlzIFBvcnRVcCAmJiAhU3VzcGVjdFJ4LiAqLworCWZvciAoaSA9IDA7IGkgPCAoU0tfVTMyKXBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCWlmICghcEFDLT5SbG10LlBvcnRbaV0uUG9ydERvd24gJiYKKwkJCSEocEFDLT5SbG10LlBvcnRbaV0uQ2hlY2tpbmdTdGF0ZSAmIFNLX1JMTVRfUENTX1JYKSkgeworCQkJKnBTZWxlY3QgPSBpOworCQkJaWYgKCFwQUMtPlJsbXQuUG9ydFtBY3RpdmVdLlBvcnREb3duICYmCisJCQkJIShwQUMtPlJsbXQuUG9ydFtBY3RpdmVdLkNoZWNraW5nU3RhdGUgJiBTS19STE1UX1BDU19SWCkpIHsKKwkJCQkqcFNlbGVjdCA9IEFjdGl2ZTsKKwkJCX0KKwkJCWlmICghcEFDLT5SbG10LlBvcnRbUHJlZlBvcnRdLlBvcnREb3duICYmCisJCQkJIShwQUMtPlJsbXQuUG9ydFtQcmVmUG9ydF0uQ2hlY2tpbmdTdGF0ZSAmIFNLX1JMTVRfUENTX1JYKSkgeworCQkJCSpwU2VsZWN0ID0gUHJlZlBvcnQ7CisJCQl9CisJCQlQb3J0Rm91bmQgPSBTS19UUlVFOworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIlNLX1JMTVRfU0VMRUNUX05PVFNVU1BFQ1QgZm91bmQgUG9ydCAlZCB1cCBhbmQgbm90IGNoZWNrIFJYLlxuIiwKKwkJCQkJKnBTZWxlY3QpKQorCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIChQb3J0Rm91bmQpOworfQkvKiBTa1JsbXRTZWxlY3ROb3RTdXNwZWN0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdFNlbGVjdFVwIC0gc2VsZWN0IG5ldyBhY3RpdmUgcG9ydCwgY3JpdGVyaWEgMywgNCAoQ0xQKQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIHNlbGVjdHMgYSBwb3J0IHRoYXQgaXMgdXAuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoKKyAqIFJldHVybnM6CisgKglTS19CT09MCisgKi8KK1JMTVRfU1RBVElDIFNLX0JPT0wJU2tSbG10U2VsZWN0VXAoCitTS19BQwkqcEFDLAkJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCQkvKiBJL08gQ29udGV4dCAqLworU0tfVTMyCUFjdGl2ZSwJCQkvKiBBY3RpdmUgcG9ydCAqLworU0tfVTMyCVByZWZQb3J0LAkJLyogUHJlZmVycmVkIHBvcnQgKi8KK1NLX1UzMgkqcFNlbGVjdCwJCS8qIE5ldyBhY3RpdmUgcG9ydCAqLworU0tfQk9PTAlBdXRvTmVnRG9uZSkJLyogU3VjY2Vzc2Z1bGx5IGF1dG8tbmVnb3RpYXRlZD8gKi8KK3sKKwlTS19VMzIJCWk7CisJU0tfQk9PTAkJUG9ydEZvdW5kOworCisJUG9ydEZvdW5kID0gU0tfRkFMU0U7CisKKwkvKiBTZWxlY3QgZmlyc3QgcG9ydCB0aGF0IGlzIFBvcnRVcC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgKFNLX1UzMilwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQlpZiAocEFDLT5SbG10LlBvcnRbaV0uUG9ydFN0YXRlID09IFNLX1JMTVRfUFNfVVAgJiYKKwkJCXBBQy0+R0luaS5HUFtpXS5QQXV0b05lZ0ZhaWwgIT0gQXV0b05lZ0RvbmUpIHsKKwkJCSpwU2VsZWN0ID0gaTsKKwkJCWlmIChwQUMtPlJsbXQuUG9ydFtBY3RpdmVdLlBvcnRTdGF0ZSA9PSBTS19STE1UX1BTX1VQICYmCisJCQkJcEFDLT5HSW5pLkdQW0FjdGl2ZV0uUEF1dG9OZWdGYWlsICE9IEF1dG9OZWdEb25lKSB7CisJCQkJKnBTZWxlY3QgPSBBY3RpdmU7CisJCQl9CisJCQlpZiAocEFDLT5SbG10LlBvcnRbUHJlZlBvcnRdLlBvcnRTdGF0ZSA9PSBTS19STE1UX1BTX1VQICYmCisJCQkJcEFDLT5HSW5pLkdQW1ByZWZQb3J0XS5QQXV0b05lZ0ZhaWwgIT0gQXV0b05lZ0RvbmUpIHsKKwkJCQkqcFNlbGVjdCA9IFByZWZQb3J0OworCQkJfQorCQkJUG9ydEZvdW5kID0gU0tfVFJVRTsKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJTS19STE1UX1NFTEVDVF9VUCBmb3VuZCBQb3J0ICVkIHVwLlxuIiwgKnBTZWxlY3QpKQorCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIChQb3J0Rm91bmQpOworfQkvKiBTa1JsbXRTZWxlY3RVcCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRTZWxlY3RHb2luZ1VwIC0gc2VsZWN0IG5ldyBhY3RpdmUgcG9ydCwgY3JpdGVyaWEgNSwgNiAoQ0xQKQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIHNlbGVjdHMgdGhlIHBvcnQgdGhhdCBpcyBnb2luZyB1cCBmb3IgdGhlIGxvbmdlc3QgdGltZS4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgorICogUmV0dXJuczoKKyAqCVNLX0JPT0wKKyAqLworUkxNVF9TVEFUSUMgU0tfQk9PTAlTa1JsbXRTZWxlY3RHb2luZ1VwKAorU0tfQUMJKnBBQywJCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkJLyogSS9PIENvbnRleHQgKi8KK1NLX1UzMglBY3RpdmUsCQkJLyogQWN0aXZlIHBvcnQgKi8KK1NLX1UzMglQcmVmUG9ydCwJCS8qIFByZWZlcnJlZCBwb3J0ICovCitTS19VMzIJKnBTZWxlY3QsCQkvKiBOZXcgYWN0aXZlIHBvcnQgKi8KK1NLX0JPT0wJQXV0b05lZ0RvbmUpCS8qIFN1Y2Nlc3NmdWxseSBhdXRvLW5lZ290aWF0ZWQ/ICovCit7CisJU0tfVTY0CQlHdVRpbWVTdGFtcDsKKwlTS19VMzIJCWk7CisJU0tfQk9PTAkJUG9ydEZvdW5kOworCisJR3VUaW1lU3RhbXAgPSAwOworCVBvcnRGb3VuZCA9IFNLX0ZBTFNFOworCisJLyogU2VsZWN0IHBvcnQgdGhhdCBpcyBQb3J0R29pbmdVcCBmb3IgdGhlIGxvbmdlc3QgdGltZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgKFNLX1UzMilwQUMtPkdJbmkuR0lNYWNzRm91bmQ7IGkrKykgeworCQlpZiAocEFDLT5SbG10LlBvcnRbaV0uUG9ydFN0YXRlID09IFNLX1JMTVRfUFNfR09JTkdfVVAgJiYKKwkJCXBBQy0+R0luaS5HUFtpXS5QQXV0b05lZ0ZhaWwgIT0gQXV0b05lZ0RvbmUpIHsKKwkJCUd1VGltZVN0YW1wID0gcEFDLT5SbG10LlBvcnRbaV0uR3VUaW1lU3RhbXA7CisJCQkqcFNlbGVjdCA9IGk7CisJCQlQb3J0Rm91bmQgPSBTS19UUlVFOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIVBvcnRGb3VuZCkgeworCQlyZXR1cm4gKFNLX0ZBTFNFKTsKKwl9CisKKwlmb3IgKGkgPSAqcFNlbGVjdCArIDE7IGkgPCAoU0tfVTMyKXBBQy0+R0luaS5HSU1hY3NGb3VuZDsgaSsrKSB7CisJCWlmIChwQUMtPlJsbXQuUG9ydFtpXS5Qb3J0U3RhdGUgPT0gU0tfUkxNVF9QU19HT0lOR19VUCAmJgorCQkJcEFDLT5SbG10LlBvcnRbaV0uR3VUaW1lU3RhbXAgPCBHdVRpbWVTdGFtcCAmJgorCQkJcEFDLT5HSW5pLkdQW2ldLlBBdXRvTmVnRmFpbCAhPSBBdXRvTmVnRG9uZSkgeworCQkJR3VUaW1lU3RhbXAgPSBwQUMtPlJsbXQuUG9ydFtpXS5HdVRpbWVTdGFtcDsKKwkJCSpwU2VsZWN0ID0gaTsKKwkJfQorCX0KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9TRUxFQ1RfR09JTkdVUCBmb3VuZCBQb3J0ICVkIGdvaW5nIHVwLlxuIiwgKnBTZWxlY3QpKQorCXJldHVybiAoU0tfVFJVRSk7Cit9CS8qIFNrUmxtdFNlbGVjdEdvaW5nVXAgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10U2VsZWN0RG93biAtIHNlbGVjdCBuZXcgYWN0aXZlIHBvcnQsIGNyaXRlcmlhIDcsIDggKENMUCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBzZWxlY3RzIGEgcG9ydCB0aGF0IGlzIGRvd24uCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoKKyAqIFJldHVybnM6CisgKglTS19CT09MCisgKi8KK1JMTVRfU1RBVElDIFNLX0JPT0wJU2tSbG10U2VsZWN0RG93bigKK1NLX0FDCSpwQUMsCQkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJCS8qIEkvTyBDb250ZXh0ICovCitTS19VMzIJQWN0aXZlLAkJCS8qIEFjdGl2ZSBwb3J0ICovCitTS19VMzIJUHJlZlBvcnQsCQkvKiBQcmVmZXJyZWQgcG9ydCAqLworU0tfVTMyCSpwU2VsZWN0LAkJLyogTmV3IGFjdGl2ZSBwb3J0ICovCitTS19CT09MCUF1dG9OZWdEb25lKQkvKiBTdWNjZXNzZnVsbHkgYXV0by1uZWdvdGlhdGVkPyAqLworeworCVNLX1UzMgkJaTsKKwlTS19CT09MCQlQb3J0Rm91bmQ7CisKKwlQb3J0Rm91bmQgPSBTS19GQUxTRTsKKworCS8qIFNlbGVjdCBmaXJzdCBwb3J0IHRoYXQgaXMgUG9ydERvd24uICovCisJZm9yIChpID0gMDsgaSA8IChTS19VMzIpcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJaWYgKHBBQy0+UmxtdC5Qb3J0W2ldLlBvcnRTdGF0ZSA9PSBTS19STE1UX1BTX0RPV04gJiYKKwkJCXBBQy0+R0luaS5HUFtpXS5QQXV0b05lZ0ZhaWwgIT0gQXV0b05lZ0RvbmUpIHsKKwkJCSpwU2VsZWN0ID0gaTsKKwkJCWlmIChwQUMtPlJsbXQuUG9ydFtBY3RpdmVdLlBvcnRTdGF0ZSA9PSBTS19STE1UX1BTX0RPV04gJiYKKwkJCQlwQUMtPkdJbmkuR1BbQWN0aXZlXS5QQXV0b05lZ0ZhaWwgIT0gQXV0b05lZ0RvbmUpIHsKKwkJCQkqcFNlbGVjdCA9IEFjdGl2ZTsKKwkJCX0KKwkJCWlmIChwQUMtPlJsbXQuUG9ydFtQcmVmUG9ydF0uUG9ydFN0YXRlID09IFNLX1JMTVRfUFNfRE9XTiAmJgorCQkJCXBBQy0+R0luaS5HUFtQcmVmUG9ydF0uUEF1dG9OZWdGYWlsICE9IEF1dG9OZWdEb25lKSB7CisJCQkJKnBTZWxlY3QgPSBQcmVmUG9ydDsKKwkJCX0KKwkJCVBvcnRGb3VuZCA9IFNLX1RSVUU7CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiU0tfUkxNVF9TRUxFQ1RfRE9XTiBmb3VuZCBQb3J0ICVkIGRvd24uXG4iLCAqcFNlbGVjdCkpCisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gKFBvcnRGb3VuZCk7Cit9CS8qIFNrUmxtdFNlbGVjdERvd24gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10Q2hlY2tTd2l0Y2ggLSBzZWxlY3QgbmV3IGFjdGl2ZSBwb3J0IGFuZCBzd2l0Y2ggdG8gaXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBkZWNpZGVzIHdoaWNoIHBvcnQgc2hvdWxkIGJlIHRoZSBhY3RpdmUgb25lIGFuZCBxdWV1ZXMKKyAqCXBvcnQgc3dpdGNoaW5nIGlmIG5lY2Vzc2FyeS4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcuCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10Q2hlY2tTd2l0Y2goCitTS19BQwkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19VMzIJTmV0SWR4KQkvKiBOZXQgaW5kZXggKi8KK3sKKwlTS19FVlBBUkEJUGFyYTsKKwlTS19VMzIJCUFjdGl2ZTsKKwlTS19VMzIJCVByZWZQb3J0OworCVNLX1UzMgkJaTsKKwlTS19CT09MCQlQb3J0Rm91bmQ7CisKKwlBY3RpdmUgPSBwQUMtPlJsbXQuTmV0W05ldElkeF0uQWN0aXZlUG9ydDsJLyogSW5kZXggb2YgYWN0aXZlIHBvcnQuICovCisJUHJlZlBvcnQgPSBwQUMtPlJsbXQuTmV0W05ldElkeF0uUHJlZlBvcnQ7CS8qIEluZGV4IG9mIHByZWZlcnJlZCBwb3J0LiAqLworCVBvcnRGb3VuZCA9IFNLX0ZBTFNFOworCXBBQy0+UmxtdC5DaGVja1N3aXRjaCA9IFNLX0ZBTFNFOworCisjaWYgMAkvKiBSVyAyMDAxLzEwLzE4IC0gYWN0aXZlIHBvcnQgYmVjb21lcyBhbHdheXMgcHJlZmVyZWQgb25lICovCisJaWYgKHBBQy0+UmxtdC5OZXRbTmV0SWR4XS5QcmVmZXJlbmNlID09IDB4RkZGRkZGRkYpIHsgLyogQXV0b21hdGljICovCisJCS8qIGRpc2FibGUgYXV0by1mYWlsIGJhY2sgKi8KKwkJUHJlZlBvcnQgPSBBY3RpdmU7CisJfQorI2VuZGlmCisKKwlpZiAocEFDLT5SbG10Lk5ldFtOZXRJZHhdLkxpbmtzVXAgPT0gMCkgeworCQkvKiBMYXN0IGxpbmsgd2VudCBkb3duIC0gc2h1dCBkb3duIHRoZSBuZXQuICovCisJCXBBQy0+UmxtdC5OZXRbTmV0SWR4XS5SbG10U3RhdGUgPSBTS19STE1UX1JTX05FVF9ET1dOOworCQlQYXJhLlBhcmEzMlswXSA9IFNLX1JMTVRfTkVUX0RPV05fVEVNUDsKKwkJUGFyYS5QYXJhMzJbMV0gPSBOZXRJZHg7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfTkVUX0RPV04sIFBhcmEpOworCisJCVBhcmEuUGFyYTMyWzBdID0gcEFDLT5SbG10Lk5ldFtOZXRJZHhdLgorCQkJUG9ydFtwQUMtPlJsbXQuTmV0W05ldElkeF0uQWN0aXZlUG9ydF0tPlBvcnROdW1iZXI7CisJCVBhcmEuUGFyYTMyWzFdID0gTmV0SWR4OworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1BOTUksIFNLX1BOTUlfRVZUX1JMTVRfQUNUSVZFX0RPV04sIFBhcmEpOworCQlyZXR1cm47CisJfQkvKiBwQUMtPlJsbXQuTGlua3NVcCA9PSAwICovCisJZWxzZSBpZiAocEFDLT5SbG10Lk5ldFtOZXRJZHhdLkxpbmtzVXAgPT0gMSAmJgorCQlwQUMtPlJsbXQuTmV0W05ldElkeF0uUmxtdFN0YXRlID09IFNLX1JMTVRfUlNfTkVUX0RPV04pIHsKKwkJLyogRmlyc3QgbGluayBjYW1lIHVwIC0gZ2V0IHRoZSBuZXQgdXAuICovCisJCXBBQy0+UmxtdC5OZXRbTmV0SWR4XS5SbG10U3RhdGUgPSBTS19STE1UX1JTX05FVF9VUDsKKworCQkvKgorCQkgKiBJZiBwQUMtPlJsbXQuQWN0aXZlUG9ydCAhPSBQYXJhLlBhcmEzMlswXSwKKwkJICogdGhlIERSViBzd2l0Y2hlcyB0byB0aGUgcG9ydCB0aGF0IGNhbWUgdXAuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgcEFDLT5SbG10Lk5ldFtOZXRJZHhdLk51bVBvcnRzOyBpKyspIHsKKwkJCWlmICghcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlBvcnRbaV0tPkxpbmtEb3duKSB7CisJCQkJaWYgKCFwQUMtPlJsbXQuTmV0W05ldElkeF0uUG9ydFtBY3RpdmVdLT5MaW5rRG93bikgeworCQkJCQlpID0gQWN0aXZlOworCQkJCX0KKwkJCQlpZiAoIXBBQy0+UmxtdC5OZXRbTmV0SWR4XS5Qb3J0W1ByZWZQb3J0XS0+TGlua0Rvd24pIHsKKwkJCQkJaSA9IFByZWZQb3J0OworCQkJCX0KKwkJCQlQb3J0Rm91bmQgPSBTS19UUlVFOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKFBvcnRGb3VuZCkgeworCQkJUGFyYS5QYXJhMzJbMF0gPSBwQUMtPlJsbXQuTmV0W05ldElkeF0uUG9ydFtpXS0+UG9ydE51bWJlcjsKKwkJCVBhcmEuUGFyYTMyWzFdID0gTmV0SWR4OworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9QTk1JLCBTS19QTk1JX0VWVF9STE1UX0FDVElWRV9VUCwgUGFyYSk7CisKKwkJCXBBQy0+UmxtdC5OZXRbTmV0SWR4XS5BY3RpdmVQb3J0ID0gaTsKKwkJCVBhcmEuUGFyYTMyWzBdID0gcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlBvcnRbaV0tPlBvcnROdW1iZXI7CisJCQlQYXJhLlBhcmEzMlsxXSA9IE5ldElkeDsKKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfTkVUX1VQLCBQYXJhKTsKKworCQkJaWYgKChwQUMtPlJsbXQuTmV0W05ldElkeF0uUmxtdE1vZGUgJiBTS19STE1UX1RSQU5TUEFSRU5UKSA9PSAwICYmCisJCQkJKFBhcmEucFBhcmFQdHIgPSBTa1JsbXRCdWlsZFBhY2tldChwQUMsIElvQywKKwkJCQlwQUMtPlJsbXQuTmV0W05ldElkeF0uUG9ydFtpXS0+UG9ydE51bWJlciwKKwkJCQlTS19QQUNLRVRfQU5OT1VOQ0UsICZwQUMtPkFkZHIuTmV0W05ldElkeF0uCisJCQkJQ3VycmVudE1hY0FkZHJlc3MsICZTa1JsbXRNY0FkZHIpKSAhPSBOVUxMKSB7CisJCQkJLyoKKwkJCQkgKiBTZW5kIGFubm91bmNlIHBhY2tldCB0byBSTE1UIG11bHRpY2FzdCBhZGRyZXNzIHRvIGZvcmNlCisJCQkJICogc3dpdGNoZXMgdG8gbGVhcm4gdGhlIG5ldyBsb2NhdGlvbiBvZiB0aGUgbG9naWNhbCBNQUMgYWRkcmVzcy4KKwkJCQkgKi8KKwkJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1JMTVRfU0VORCwgUGFyYSk7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX1JMTVRfRTAwNywgU0tFUlJfUkxNVF9FMDA3X01TRyk7CisJCX0KKworCQlyZXR1cm47CisJfQkvKiBMaW5rc1VwID09IDEgJiYgUmxtdFN0YXRlID09IFNLX1JMTVRfUlNfTkVUX0RPV04gKi8KKwllbHNlIHsJLyogQ2Fubm90IGJlIHJlYWNoZWQgaW4gZHVhbC1uZXQgbW9kZS4gKi8KKwkJUGFyYS5QYXJhMzJbMF0gPSBBY3RpdmU7CisKKwkJLyoKKwkJICogUHJlc2VsZWN0aW9uOgorCQkgKglJZiBSTE1UIE1vZGUgIT0gQ2hlY2tMaW5rU3RhdGUKKwkJICoJCXNlbGVjdCBwb3J0IHRoYXQgcmVjZWl2ZWQgYSBicm9hZGNhc3QgZnJhbWUgc3Vic3RhbnRpYWxseSBsYXRlcgorCQkgKgkJdGhhbiBhbGwgb3RoZXIgcG9ydHMKKwkJICoJZWxzZSBzZWxlY3QgZmlyc3QgcG9ydCB0aGF0IGlzIG5vdCBTdXNwZWN0UngKKwkJICoJZWxzZSBzZWxlY3QgZmlyc3QgcG9ydCB0aGF0IGlzIFBvcnRVcAorCQkgKgllbHNlIHNlbGVjdCBwb3J0IHRoYXQgaXMgUG9ydEdvaW5nVXAgZm9yIHRoZSBsb25nZXN0IHRpbWUKKwkJICoJZWxzZSBzZWxlY3QgZmlyc3QgcG9ydCB0aGF0IGlzIFBvcnREb3duCisJCSAqCWVsc2Ugc3RvcC4KKwkJICoKKwkJICogRm9yIHRoZSBwcmVzZWxlY3RlZCBwb3J0OgorCQkgKglJZiBBY3RpdmVQb3J0IGlzIGVxdWFsIGluIHF1YWxpdHksIHNlbGVjdCBBY3RpdmVQb3J0LgorCQkgKgorCQkgKglJZiBQcmVmUG9ydCBpcyBlcXVhbCBpbiBxdWFsaXR5LCBzZWxlY3QgUHJlZlBvcnQuCisJCSAqCisJCSAqCUlmIEFjdGl2ZVBvcnQgIT0gU2VsZWN0ZWRQb3J0LAorCQkgKgkJSWYgb2xkIEFjdGl2ZVBvcnQgaXMgTGlua0Rvd24sCisJCSAqCQkJU3dpdGNoSGFyZAorCQkgKgkJZWxzZQorCQkgKgkJCVN3aXRjaFNvZnQKKwkJICovCisJCS8qIGNoZWNrIG9mIENoZ0JjUHJpbyBmbGFnIGFkZGVkICovCisJCWlmICgocEFDLT5SbG10Lk5ldFswXS5SbG10TW9kZSAhPSBTS19STE1UX01PREVfQ0xTKSAmJgorCQkJKCFwQUMtPlJsbXQuTmV0WzBdLkNoZ0JjUHJpbykpIHsKKwkJCQorCQkJaWYgKCFQb3J0Rm91bmQpIHsKKwkJCQlQb3J0Rm91bmQgPSBTa1JsbXRTZWxlY3RCY1J4KAorCQkJCQlwQUMsIElvQywgQWN0aXZlLCBQcmVmUG9ydCwgJlBhcmEuUGFyYTMyWzFdKTsKKwkJCX0KKworCQkJaWYgKCFQb3J0Rm91bmQpIHsKKwkJCQlQb3J0Rm91bmQgPSBTa1JsbXRTZWxlY3ROb3RTdXNwZWN0KAorCQkJCQlwQUMsIElvQywgQWN0aXZlLCBQcmVmUG9ydCwgJlBhcmEuUGFyYTMyWzFdKTsKKwkJCX0KKwkJfQkvKiBwQUMtPlJsbXQuUmxtdE1vZGUgIT0gU0tfUkxNVF9NT0RFX0NMUyAqLworCisJCS8qIHdpdGggY2hhbmdlZCBwcmlvcml0eSBmb3IgbGFzdCBicm9hZGNhc3QgcmVjZWl2ZWQgKi8KKwkJaWYgKChwQUMtPlJsbXQuTmV0WzBdLlJsbXRNb2RlICE9IFNLX1JMTVRfTU9ERV9DTFMpICYmCisJCQkocEFDLT5SbG10Lk5ldFswXS5DaGdCY1ByaW8pKSB7CisJCQlpZiAoIVBvcnRGb3VuZCkgeworCQkJCVBvcnRGb3VuZCA9IFNrUmxtdFNlbGVjdE5vdFN1c3BlY3QoCisJCQkJCXBBQywgSW9DLCBBY3RpdmUsIFByZWZQb3J0LCAmUGFyYS5QYXJhMzJbMV0pOworCQkJfQorCisJCQlpZiAoIVBvcnRGb3VuZCkgeworCQkJCVBvcnRGb3VuZCA9IFNrUmxtdFNlbGVjdEJjUngoCisJCQkJCXBBQywgSW9DLCBBY3RpdmUsIFByZWZQb3J0LCAmUGFyYS5QYXJhMzJbMV0pOworCQkJfQorCQl9CS8qIHBBQy0+UmxtdC5SbG10TW9kZSAhPSBTS19STE1UX01PREVfQ0xTICovCisKKwkJaWYgKCFQb3J0Rm91bmQpIHsKKwkJCVBvcnRGb3VuZCA9IFNrUmxtdFNlbGVjdFVwKAorCQkJCXBBQywgSW9DLCBBY3RpdmUsIFByZWZQb3J0LCAmUGFyYS5QYXJhMzJbMV0sIEFVVE9ORUdfU1VDQ0VTUyk7CisJCX0KKworCQlpZiAoIVBvcnRGb3VuZCkgeworCQkJUG9ydEZvdW5kID0gU2tSbG10U2VsZWN0VXAoCisJCQkJcEFDLCBJb0MsIEFjdGl2ZSwgUHJlZlBvcnQsICZQYXJhLlBhcmEzMlsxXSwgQVVUT05FR19GQUlMRUQpOworCQl9CisKKwkJaWYgKCFQb3J0Rm91bmQpIHsKKwkJCVBvcnRGb3VuZCA9IFNrUmxtdFNlbGVjdEdvaW5nVXAoCisJCQkJcEFDLCBJb0MsIEFjdGl2ZSwgUHJlZlBvcnQsICZQYXJhLlBhcmEzMlsxXSwgQVVUT05FR19TVUNDRVNTKTsKKwkJfQorCisJCWlmICghUG9ydEZvdW5kKSB7CisJCQlQb3J0Rm91bmQgPSBTa1JsbXRTZWxlY3RHb2luZ1VwKAorCQkJCXBBQywgSW9DLCBBY3RpdmUsIFByZWZQb3J0LCAmUGFyYS5QYXJhMzJbMV0sIEFVVE9ORUdfRkFJTEVEKTsKKwkJfQorCisJCWlmIChwQUMtPlJsbXQuTmV0WzBdLlJsbXRNb2RlICE9IFNLX1JMTVRfTU9ERV9DTFMpIHsKKwkJCWlmICghUG9ydEZvdW5kKSB7CisJCQkJUG9ydEZvdW5kID0gU2tSbG10U2VsZWN0RG93bihwQUMsIElvQywKKwkJCQkJQWN0aXZlLCBQcmVmUG9ydCwgJlBhcmEuUGFyYTMyWzFdLCBBVVRPTkVHX1NVQ0NFU1MpOworCQkJfQorCisJCQlpZiAoIVBvcnRGb3VuZCkgeworCQkJCVBvcnRGb3VuZCA9IFNrUmxtdFNlbGVjdERvd24ocEFDLCBJb0MsCisJCQkJCUFjdGl2ZSwgUHJlZlBvcnQsICZQYXJhLlBhcmEzMlsxXSwgQVVUT05FR19GQUlMRUQpOworCQkJfQorCQl9CS8qIHBBQy0+UmxtdC5SbG10TW9kZSAhPSBTS19STE1UX01PREVfQ0xTICovCisKKwkJaWYgKFBvcnRGb3VuZCkgeworCisJCQlpZiAoUGFyYS5QYXJhMzJbMV0gIT0gQWN0aXZlKSB7CisJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkJKCJBY3RpdmU6ICVkLCBQYXJhMTogJWQuXG4iLCBBY3RpdmUsIFBhcmEuUGFyYTMyWzFdKSkKKwkJCQlwQUMtPlJsbXQuTmV0W05ldElkeF0uQWN0aXZlUG9ydCA9IFBhcmEuUGFyYTMyWzFdOworCQkJCVBhcmEuUGFyYTMyWzBdID0gcEFDLT5SbG10Lk5ldFtOZXRJZHhdLgorCQkJCQlQb3J0W1BhcmEuUGFyYTMyWzBdXS0+UG9ydE51bWJlcjsKKwkJCQlQYXJhLlBhcmEzMlsxXSA9IHBBQy0+UmxtdC5OZXRbTmV0SWR4XS4KKwkJCQkJUG9ydFtQYXJhLlBhcmEzMlsxXV0tPlBvcnROdW1iZXI7CisJCQkJU0tfSFdBQ19MSU5LX0xFRChwQUMsIElvQywgUGFyYS5QYXJhMzJbMV0sIFNLX0xFRF9BQ1RJVkUpOworCQkJCWlmIChwQUMtPlJsbXQuUG9ydFtBY3RpdmVdLkxpbmtEb3duKSB7CisJCQkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfU1dJVENIX0hBUkQsIFBhcmEpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJU0tfSFdBQ19MSU5LX0xFRChwQUMsIElvQywgUGFyYS5QYXJhMzJbMF0sIFNLX0xFRF9TVEFOREJZKTsKKwkJCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9TV0lUQ0hfU09GVCwgUGFyYSk7CisJCQkJfQorCQkJCVBhcmEuUGFyYTMyWzFdID0gTmV0SWR4OworCQkJCVBhcmEuUGFyYTMyWzBdID0KKwkJCQkJcEFDLT5SbG10Lk5ldFtOZXRJZHhdLlBvcnRbUGFyYS5QYXJhMzJbMF1dLT5Qb3J0TnVtYmVyOworCQkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUE5NSSwgU0tfUE5NSV9FVlRfUkxNVF9BQ1RJVkVfRE9XTiwgUGFyYSk7CisJCQkJUGFyYS5QYXJhMzJbMF0gPSBwQUMtPlJsbXQuTmV0W05ldElkeF0uCisJCQkJCVBvcnRbcEFDLT5SbG10Lk5ldFtOZXRJZHhdLkFjdGl2ZVBvcnRdLT5Qb3J0TnVtYmVyOworCQkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUE5NSSwgU0tfUE5NSV9FVlRfUkxNVF9BQ1RJVkVfVVAsIFBhcmEpOworCQkJCWlmICgocEFDLT5SbG10Lk5ldFtOZXRJZHhdLlJsbXRNb2RlICYgU0tfUkxNVF9UUkFOU1BBUkVOVCkgPT0gMCAmJgorCQkJCQkoUGFyYS5wUGFyYVB0ciA9IFNrUmxtdEJ1aWxkUGFja2V0KHBBQywgSW9DLCBQYXJhLlBhcmEzMlswXSwKKwkJCQkJU0tfUEFDS0VUX0FOTk9VTkNFLCAmcEFDLT5BZGRyLk5ldFtOZXRJZHhdLkN1cnJlbnRNYWNBZGRyZXNzLAorCQkJCQkmU2tSbG10TWNBZGRyKSkgIT0gTlVMTCkgeworCQkJCQkvKgorCQkJCQkgKiBTZW5kIGFubm91bmNlIHBhY2tldCB0byBSTE1UIG11bHRpY2FzdCBhZGRyZXNzIHRvIGZvcmNlCisJCQkJCSAqIHN3aXRjaGVzIHRvIGxlYXJuIHRoZSBuZXcgbG9jYXRpb24gb2YgdGhlIGxvZ2ljYWwKKwkJCQkJICogTUFDIGFkZHJlc3MuCisJCQkJCSAqLworCQkJCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX1JMTVRfU0VORCwgUGFyYSk7CisJCQkJfQkvKiAoUGFyYS5wUGFyYVB0ciA9IFNrUmxtdEJ1aWxkUGFja2V0KC4uLikpICE9IE5VTEwgKi8KKwkJCX0JLyogUGFyYS5QYXJhMzJbMV0gIT0gQWN0aXZlICovCisJCX0JLyogUG9ydEZvdW5kICovCisJCWVsc2UgeworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9STE1UX0UwMDQsIFNLRVJSX1JMTVRfRTAwNF9NU0cpOworCQl9CisJfQkvKiBMaW5rc1VwID4gMSB8fCBMaW5rc1VwID09IDEgJiYgUmxtdFN0YXRlICE9IFNLX1JMTVRfUlNfTkVUX0RPV04gKi8KKwlyZXR1cm47Cit9CS8qIFNrUmxtdENoZWNrU3dpdGNoICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdENoZWNrU2VnIC0gUmVwb3J0IGlmIHNlZ21lbnRhdGlvbiBpcyBkZXRlY3RlZAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGNoZWNrcyBpZiB0aGUgcG9ydHMgc2VlIGRpZmZlcmVudCByb290IGJyaWRnZXMgYW5kIHJlcG9ydHMKKyAqCXNlZ21lbnRhdGlvbiBpbiBzdWNoIGEgY2FzZS4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcuCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10Q2hlY2tTZWcoCitTS19BQwkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19VMzIJTmV0SWR4KQkvKiBOZXQgbnVtYmVyICovCit7CisJU0tfRVZQQVJBCVBhcmE7CisJU0tfUkxNVF9ORVQJKnBOZXQ7CisJU0tfVTMyCQlpLCBqOworCVNLX0JPT0wJCUVxdWFsOworCisJcE5ldCA9ICZwQUMtPlJsbXQuTmV0W05ldElkeF07CisJcE5ldC0+Um9vdElkU2V0ID0gU0tfRkFMU0U7CisJRXF1YWwgPSBTS19UUlVFOworCisJZm9yIChpID0gMDsgaSA8IHBOZXQtPk51bVBvcnRzOyBpKyspIHsKKwkJaWYgKHBOZXQtPlBvcnRbaV0tPkxpbmtEb3duIHx8ICFwTmV0LT5Qb3J0W2ldLT5Sb290SWRTZXQpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfRFVNUCwKKwkJCSgiUm9vdCBJRCAlZDogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4LlxuIiwgaSwKKwkJCQlwTmV0LT5Qb3J0W2ldLT5Sb290LklkWzBdLCBwTmV0LT5Qb3J0W2ldLT5Sb290LklkWzFdLAorCQkJCXBOZXQtPlBvcnRbaV0tPlJvb3QuSWRbMl0sIHBOZXQtPlBvcnRbaV0tPlJvb3QuSWRbM10sCisJCQkJcE5ldC0+UG9ydFtpXS0+Um9vdC5JZFs0XSwgcE5ldC0+UG9ydFtpXS0+Um9vdC5JZFs1XSwKKwkJCQlwTmV0LT5Qb3J0W2ldLT5Sb290LklkWzZdLCBwTmV0LT5Qb3J0W2ldLT5Sb290LklkWzddKSkKKworCQlpZiAoIXBOZXQtPlJvb3RJZFNldCkgeworCQkJcE5ldC0+Um9vdCA9IHBOZXQtPlBvcnRbaV0tPlJvb3Q7CisJCQlwTmV0LT5Sb290SWRTZXQgPSBTS19UUlVFOworCQkJY29udGludWU7CisJCX0KKworCQlmb3IgKGogPSAwOyBqIDwgODsgaiArKykgeworCQkJRXF1YWwgJj0gcE5ldC0+UG9ydFtpXS0+Um9vdC5JZFtqXSA9PSBwTmV0LT5Sb290LklkW2pdOworCQkJaWYgKCFFcXVhbCkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCQorCQlpZiAoIUVxdWFsKSB7CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfQ09NTSwgU0tFUlJfUkxNVF9FMDA1LCBTS0VSUl9STE1UX0UwMDVfTVNHKTsKKwkJCVBhcmEuUGFyYTMyWzBdID0gTmV0SWR4OworCQkJUGFyYS5QYXJhMzJbMV0gPSAoU0tfVTMyKS0xOworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9QTk1JLCBTS19QTk1JX0VWVF9STE1UX1NFR01FTlRBVElPTiwgUGFyYSk7CisKKwkJCXBOZXQtPkNoZWNraW5nU3RhdGUgJj0gflNLX1JMTVRfUkNTX1JFUE9SVF9TRUc7CisKKwkJCS8qIDIwMDAtMDMtMDYgUkE6IE5ldy4gKi8KKwkJCVBhcmEuUGFyYTMyWzBdID0gTmV0SWR4OworCQkJUGFyYS5QYXJhMzJbMV0gPSAoU0tfVTMyKS0xOworCQkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcE5ldC0+U2VnVGltZXIsIFNLX1JMTVRfU0VHX1RPX1ZBTCwKKwkJCQlTS0dFX1JMTVQsIFNLX1JMTVRfU0VHX1RJTSwgUGFyYSk7CisJCQlicmVhazsKKwkJfQorCX0JLyogZm9yIChpID0gMDsgaSA8IHBOZXQtPk51bVBvcnRzOyBpKyspICovCisKKwkvKiAyMDAwLTAzLTA2IFJBOiBNb3ZlZCBoZXJlLiAqLworCS8qIFNlZ21lbnRhdGlvbiBjaGVjayBub3QgcnVubmluZyBhbnltb3JlLiAqLworCXBOZXQtPkNoZWNraW5nU3RhdGUgJj0gflNLX1JMTVRfUkNTX1NFRzsKKworfQkvKiBTa1JsbXRDaGVja1NlZyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRQb3J0U3RhcnQgLSBpbml0aWFsaXplIHBvcnQgdmFyaWFibGVzIGFuZCBzdGFydCBwb3J0CisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgYSBwb3J0J3MgdmFyaWFibGVzIGFuZCBpc3N1ZXMgYSBQT1JUX1NUQVJUCisgKgl0byB0aGUgSFdBQyBtb2R1bGUuICBUaGlzIGhhbmRsZXMgcmV0cmllcyBpZiB0aGUgc3RhcnQgZmFpbHMgb3IgdGhlCisgKglsaW5rIGV2ZW50dWFsbHkgZ29lcyBkb3duLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdFBvcnRTdGFydCgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJL08gQ29udGV4dCAqLworU0tfVTMyCVBvcnROdW1iZXIpCS8qIFBvcnQgbnVtYmVyICovCit7CisJU0tfRVZQQVJBCVBhcmE7CisKKwlwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5Qb3J0U3RhdGUgPSBTS19STE1UX1BTX0xJTktfRE9XTjsKKwlwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5Qb3J0U3RhcnRlZCA9IFNLX1RSVUU7CisJcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uTGlua0Rvd24gPSBTS19UUlVFOworCXBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLlBvcnREb3duID0gU0tfVFJVRTsKKwlwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5DaGVja2luZ1N0YXRlID0gMDsKKwlwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5Sb290SWRTZXQgPSBTS19GQUxTRTsKKwlQYXJhLlBhcmEzMlswXSA9IFBvcnROdW1iZXI7CisJUGFyYS5QYXJhMzJbMV0gPSAoU0tfVTMyKS0xOworCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfSFdBQywgU0tfSFdFVl9QT1JUX1NUQVJULCBQYXJhKTsKK30JLyogU2tSbG10UG9ydFN0YXJ0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrUmxtdEV2dFBvcnRTdGFydFRpbSAtIFBPUlRfU1RBUlRfVElNCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgaGFuZGxlcyBQT1JUX1NUQVJUX1RJTSBldmVudHMuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRFdnRQb3J0U3RhcnRUaW0oCitTS19BQwkJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX0VWUEFSQQlQYXJhKQkvKiBTS19VMzIgUG9ydE51bWJlcjsgU0tfVTMyIC0xICovCit7CisJU0tfVTMyCQkJaTsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9QT1JUU1RBUlRfVElNRU9VVCBQb3J0ICVkIEV2ZW50IEJFR0lOLlxuIiwgUGFyYS5QYXJhMzJbMF0pKQorCisJCWlmIChQYXJhLlBhcmEzMlsxXSAhPSAoU0tfVTMyKS0xKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkJhZCBQYXJhbWV0ZXIuXG4iKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9QT1JUU1RBUlRfVElNRU9VVCBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBVc2VkIHRvIHN0YXJ0IG5vbi1wcmVmZXJyZWQgcG9ydHMgaWYgdGhlIHByZWZlcnJlZCBvbmUKKwkgKiBkb2VzIG5vdCBjb21lIHVwLgorCSAqIFRoaXMgdGltZW91dCBuZWVkcyBvbmx5IGJlIHNldCB3aGVuIHN0YXJ0aW5nIHRoZSBmaXJzdAorCSAqIChwcmVmZXJyZWQpIHBvcnQuCisJICovCisJaWYgKHBBQy0+UmxtdC5Qb3J0W1BhcmEuUGFyYTMyWzBdXS5MaW5rRG93bikgeworCQkvKiBQT1JUX1NUQVJUIGZhaWxlZC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IHBBQy0+UmxtdC5Qb3J0W1BhcmEuUGFyYTMyWzBdXS5OZXQtPk51bVBvcnRzOyBpKyspIHsKKwkJCWlmICghcEFDLT5SbG10LlBvcnRbUGFyYS5QYXJhMzJbMF1dLk5ldC0+UG9ydFtpXS0+UG9ydFN0YXJ0ZWQpIHsKKwkJCQlTa1JsbXRQb3J0U3RhcnQocEFDLCBJb0MsCisJCQkJCXBBQy0+UmxtdC5Qb3J0W1BhcmEuUGFyYTMyWzBdXS5OZXQtPlBvcnRbaV0tPlBvcnROdW1iZXIpOworCQkJfQorCQl9CisJfQorCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1BPUlRTVEFSVF9USU1FT1VUIEV2ZW50IEVORC5cbiIpKQorfQkvKiBTa1JsbXRFdnRQb3J0U3RhcnRUaW0gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10RXZ0TGlua1VwIC0gTElOS19VUAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGhhbmRsZXMgTExJTktfVVAgZXZlbnRzLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10RXZ0TGlua1VwKAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19FVlBBUkEJUGFyYSkJLyogU0tfVTMyIFBvcnROdW1iZXI7IFNLX1UzMiBVbmRlZmluZWQgKi8KK3sKKwlTS19VMzIJCQlpOworCVNLX1JMTVRfUE9SVAkqcFJQb3J0OworCVNLX0VWUEFSQQkJUGFyYTI7CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfTElOS19VUCBQb3J0ICVkIEV2ZW50IEJFR0lOLlxuIiwgUGFyYS5QYXJhMzJbMF0pKQorCisJcFJQb3J0ID0gJnBBQy0+UmxtdC5Qb3J0W1BhcmEuUGFyYTMyWzBdXTsKKwlpZiAoIXBSUG9ydC0+UG9ydFN0YXJ0ZWQpIHsKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9STE1UX0UwMDgsIFNLRVJSX1JMTVRfRTAwOF9NU0cpOworCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJTS19STE1UX0xJTktfVVAgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCWlmICghcFJQb3J0LT5MaW5rRG93bikgeworCQkvKiBSQTs6OzogQW55IGJldHRlciBzb2x1dGlvbj8gKi8KKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9MSU5LX1VQIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwlTa1RpbWVyU3RvcChwQUMsIElvQywgJnBSUG9ydC0+VXBUaW1lcik7CisJU2tUaW1lclN0b3AocEFDLCBJb0MsICZwUlBvcnQtPkRvd25SeFRpbWVyKTsKKwlTa1RpbWVyU3RvcChwQUMsIElvQywgJnBSUG9ydC0+RG93blR4VGltZXIpOworCisJLyogRG8gc29tZXRoaW5nIGlmIHRpbWVyIGFscmVhZHkgZmlyZWQ/ICovCisKKwlwUlBvcnQtPkxpbmtEb3duID0gU0tfRkFMU0U7CisJcFJQb3J0LT5Qb3J0U3RhdGUgPSBTS19STE1UX1BTX0dPSU5HX1VQOworCXBSUG9ydC0+R3VUaW1lU3RhbXAgPSBTa09zR2V0VGltZShwQUMpOworCXBSUG9ydC0+QmNUaW1lU3RhbXAgPSAwOworCXBSUG9ydC0+TmV0LT5MaW5rc1VwKys7CisJaWYgKHBSUG9ydC0+TmV0LT5MaW5rc1VwID09IDEpIHsKKwkJU0tfSFdBQ19MSU5LX0xFRChwQUMsIElvQywgUGFyYS5QYXJhMzJbMF0sIFNLX0xFRF9BQ1RJVkUpOworCX0KKwllbHNlIHsKKwkJU0tfSFdBQ19MSU5LX0xFRChwQUMsIElvQywgUGFyYS5QYXJhMzJbMF0sIFNLX0xFRF9TVEFOREJZKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcFJQb3J0LT5OZXQtPk51bVBvcnRzOyBpKyspIHsKKwkJaWYgKCFwUlBvcnQtPk5ldC0+UG9ydFtpXS0+UG9ydFN0YXJ0ZWQpIHsKKwkJCVNrUmxtdFBvcnRTdGFydChwQUMsIElvQywgcFJQb3J0LT5OZXQtPlBvcnRbaV0tPlBvcnROdW1iZXIpOworCQl9CisJfQorCisJU2tSbG10Q2hlY2tTd2l0Y2gocEFDLCBJb0MsIHBSUG9ydC0+TmV0LT5OZXROdW1iZXIpOworCisJaWYgKHBSUG9ydC0+TmV0LT5MaW5rc1VwID49IDIpIHsKKwkJaWYgKHBSUG9ydC0+TmV0LT5SbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfTE9DX0xJTkspIHsKKwkJCS8qIEJ1aWxkIHRoZSBjaGVjayBjaGFpbi4gKi8KKwkJCVNrUmxtdEJ1aWxkQ2hlY2tDaGFpbihwQUMsIHBSUG9ydC0+TmV0LT5OZXROdW1iZXIpOworCQl9CisJfQorCisJLyogSWYgdGhlIGZpcnN0IGxpbmsgY29tZXMgdXAsIHN0YXJ0IHRoZSBwZXJpb2RpY2FsIFJMTVQgdGltZW91dC4gKi8KKwlpZiAocFJQb3J0LT5OZXQtPk51bVBvcnRzID4gMSAmJiBwUlBvcnQtPk5ldC0+TGlua3NVcCA9PSAxICYmCisJCShwUlBvcnQtPk5ldC0+UmxtdE1vZGUgJiBTS19STE1UX0NIRUNLX09USEVSUykgIT0gMCkgeworCQlQYXJhMi5QYXJhMzJbMF0gPSBwUlBvcnQtPk5ldC0+TmV0TnVtYmVyOworCQlQYXJhMi5QYXJhMzJbMV0gPSAoU0tfVTMyKS0xOworCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwUlBvcnQtPk5ldC0+TG9jVGltZXIsCisJCQlwUlBvcnQtPk5ldC0+VGltZW91dFZhbHVlLCBTS0dFX1JMTVQsIFNLX1JMTVRfVElNLCBQYXJhMik7CisJfQorCisJUGFyYTIgPSBQYXJhOworCVBhcmEyLlBhcmEzMlsxXSA9IChTS19VMzIpLTE7CisJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcFJQb3J0LT5VcFRpbWVyLCBTS19STE1UX1BPUlRVUF9USU1fVkFMLAorCQlTS0dFX1JMTVQsIFNLX1JMTVRfUE9SVFVQX1RJTSwgUGFyYTIpOworCQorCS8qIExhdGVyOiBpZiAocEFDLT5SbG10LlJsbXRNb2RlICYgU0tfUkxNVF9DSEVDS19MT0NfTElOSykgJiYgKi8KKwlpZiAoKHBSUG9ydC0+TmV0LT5SbG10TW9kZSAmIFNLX1JMTVRfVFJBTlNQQVJFTlQpID09IDAgJiYKKwkJKHBSUG9ydC0+TmV0LT5SbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfTElOSykgIT0gMCAmJgorCQkoUGFyYTIucFBhcmFQdHIgPQorCQkJU2tSbG10QnVpbGRQYWNrZXQocEFDLCBJb0MsIFBhcmEuUGFyYTMyWzBdLCBTS19QQUNLRVRfQU5OT1VOQ0UsCisJCQkmcEFDLT5BZGRyLlBvcnRbUGFyYS5QYXJhMzJbMF1dLkN1cnJlbnRNYWNBZGRyZXNzLCAmU2tSbG10TWNBZGRyKQorCQkpICE9IE5VTEwpIHsKKwkJLyogU2VuZCAibmV3IiBwYWNrZXQgdG8gUkxNVCBtdWx0aWNhc3QgYWRkcmVzcy4gKi8KKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9EUlYsIFNLX0RSVl9STE1UX1NFTkQsIFBhcmEyKTsKKwl9CisKKwlpZiAocFJQb3J0LT5OZXQtPlJsbXRNb2RlICYgU0tfUkxNVF9DSEVDS19TRUcpIHsKKwkJaWYgKChQYXJhMi5wUGFyYVB0ciA9CisJCQlTa1JsbXRCdWlsZFNwYW5uaW5nVHJlZVBhY2tldChwQUMsIElvQywgUGFyYS5QYXJhMzJbMF0pKSAhPSBOVUxMKSB7CisJCQlwQUMtPlJsbXQuUG9ydFtQYXJhLlBhcmEzMlswXV0uUm9vdElkU2V0ID0gU0tfRkFMU0U7CisJCQlwUlBvcnQtPk5ldC0+Q2hlY2tpbmdTdGF0ZSB8PQorCQkJCVNLX1JMTVRfUkNTX1NFRyB8IFNLX1JMTVRfUkNTX1JFUE9SVF9TRUc7CisKKwkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUkxNVF9TRU5ELCBQYXJhMik7CisKKwkJCVBhcmEuUGFyYTMyWzFdID0gKFNLX1UzMiktMTsKKwkJCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBSUG9ydC0+TmV0LT5TZWdUaW1lciwKKwkJCQlTS19STE1UX1NFR19UT19WQUwsIFNLR0VfUkxNVCwgU0tfUkxNVF9TRUdfVElNLCBQYXJhKTsKKwkJfQorCX0KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9MSU5LX1VQIEV2ZW50IEVORC5cbiIpKQorfQkvKiBTa1JsbXRFdnRMaW5rVXAgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10RXZ0UG9ydFVwVGltIC0gUE9SVF9VUF9USU0KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBoYW5kbGVzIFBPUlRfVVBfVElNIGV2ZW50cy4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdEV2dFBvcnRVcFRpbSgKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfRVZQQVJBCVBhcmEpCS8qIFNLX1UzMiBQb3J0TnVtYmVyOyBTS19VMzIgLTEgKi8KK3sKKwlTS19STE1UX1BPUlQJKnBSUG9ydDsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9QT1JUVVBfVElNIFBvcnQgJWQgRXZlbnQgQkVHSU4uXG4iLCBQYXJhLlBhcmEzMlswXSkpCisKKwlpZiAoUGFyYS5QYXJhMzJbMV0gIT0gKFNLX1UzMiktMSkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJCYWQgUGFyYW1ldGVyLlxuIikpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfUE9SVFVQX1RJTSBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJcFJQb3J0ID0gJnBBQy0+UmxtdC5Qb3J0W1BhcmEuUGFyYTMyWzBdXTsKKwlpZiAocFJQb3J0LT5MaW5rRG93biB8fCAocFJQb3J0LT5Qb3J0U3RhdGUgPT0gU0tfUkxNVF9QU19VUCkpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9QT1JUVVBfVElNIFBvcnQgJWQgRXZlbnQgRU1QVFkuXG4iLCBQYXJhLlBhcmEzMlswXSkpCisJCXJldHVybjsKKwl9CisKKwlwUlBvcnQtPlBvcnREb3duID0gU0tfRkFMU0U7CisJcFJQb3J0LT5Qb3J0U3RhdGUgPSBTS19STE1UX1BTX1VQOworCXBSUG9ydC0+TmV0LT5Qb3J0c1VwKys7CisJaWYgKHBSUG9ydC0+TmV0LT5SbG10U3RhdGUgIT0gU0tfUkxNVF9SU19JTklUKSB7CisJCWlmIChwQUMtPlJsbXQuTnVtTmV0cyA8PSAxKSB7CisJCQlTa1JsbXRDaGVja1N3aXRjaChwQUMsIElvQywgcFJQb3J0LT5OZXQtPk5ldE51bWJlcik7CisJCX0KKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9QTk1JLCBTS19QTk1JX0VWVF9STE1UX1BPUlRfVVAsIFBhcmEpOworCX0KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9QT1JUVVBfVElNIEV2ZW50IEVORC5cbiIpKQorfQkvKiBTa1JsbXRFdnRQb3J0VXBUaW0gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10RXZ0UG9ydERvd25UaW0gLSBQT1JUX0RPV05fKgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGhhbmRsZXMgUE9SVF9ET1dOXyogZXZlbnRzLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10RXZ0UG9ydERvd25YKAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19VMzIJCUV2ZW50LAkvKiBFdmVudCBjb2RlICovCitTS19FVlBBUkEJUGFyYSkJLyogU0tfVTMyIFBvcnROdW1iZXI7IFNLX1UzMiAtMSAqLworeworCVNLX1JMTVRfUE9SVAkqcFJQb3J0OworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1BPUlRET1dOKiBQb3J0ICVkIEV2ZW50ICglZCkgQkVHSU4uXG4iLAorCQkJUGFyYS5QYXJhMzJbMF0sIEV2ZW50KSkKKworCWlmIChQYXJhLlBhcmEzMlsxXSAhPSAoU0tfVTMyKS0xKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkJhZCBQYXJhbWV0ZXIuXG4iKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9QT1JURE9XTiogRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCXBSUG9ydCA9ICZwQUMtPlJsbXQuUG9ydFtQYXJhLlBhcmEzMlswXV07CisJaWYgKCFwUlBvcnQtPlBvcnRTdGFydGVkIHx8IChFdmVudCA9PSBTS19STE1UX1BPUlRET1dOX1RYX1RJTSAmJgorCQkhKHBSUG9ydC0+Q2hlY2tpbmdTdGF0ZSAmIFNLX1JMTVRfUENTX1RYKSkpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9QT1JURE9XTiogRXZlbnQgKCVkKSBFTVBUWS5cbiIsIEV2ZW50KSkKKwkJcmV0dXJuOworCX0KKwkKKwkvKiBTdG9wIHBvcnQncyB0aW1lcnMuICovCisJU2tUaW1lclN0b3AocEFDLCBJb0MsICZwUlBvcnQtPlVwVGltZXIpOworCVNrVGltZXJTdG9wKHBBQywgSW9DLCAmcFJQb3J0LT5Eb3duUnhUaW1lcik7CisJU2tUaW1lclN0b3AocEFDLCBJb0MsICZwUlBvcnQtPkRvd25UeFRpbWVyKTsKKworCWlmIChwUlBvcnQtPlBvcnRTdGF0ZSAhPSBTS19STE1UX1BTX0xJTktfRE9XTikgeworCQlwUlBvcnQtPlBvcnRTdGF0ZSA9IFNLX1JMTVRfUFNfRE9XTjsKKwl9CisKKwlpZiAoIXBSUG9ydC0+UG9ydERvd24pIHsKKwkJcFJQb3J0LT5OZXQtPlBvcnRzVXAtLTsKKwkJcFJQb3J0LT5Qb3J0RG93biA9IFNLX1RSVUU7CisJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfUE5NSSwgU0tfUE5NSV9FVlRfUkxNVF9QT1JUX0RPV04sIFBhcmEpOworCX0KKworCXBSUG9ydC0+UGFja2V0c1BlclRpbWVTbG90ID0gMDsKKwkvKiBwUlBvcnQtPkRhdGFQYWNrZXRzUGVyVGltZVNsb3QgPSAwOyAqLworCXBSUG9ydC0+QnBkdVBhY2tldHNQZXJUaW1lU2xvdCA9IDA7CisJcFJQb3J0LT5CY1RpbWVTdGFtcCA9IDA7CisKKwkvKgorCSAqIFJBOzo7OiBUbyBiZSBjaGVja2VkOgorCSAqIC0gYWN0aW9ucyBhdCBSTE1UX1NUT1A6IFdlIHNob3VsZCBub3Qgc3dpdGNoIGFueW1vcmUuCisJICovCisJaWYgKHBSUG9ydC0+TmV0LT5SbG10U3RhdGUgIT0gU0tfUkxNVF9SU19JTklUKSB7CisJCWlmIChQYXJhLlBhcmEzMlswXSA9PQorCQkJcFJQb3J0LT5OZXQtPlBvcnRbcFJQb3J0LT5OZXQtPkFjdGl2ZVBvcnRdLT5Qb3J0TnVtYmVyKSB7CisJCQkvKiBBY3RpdmUgUG9ydCB3ZW50IGRvd24uICovCisJCQlTa1JsbXRDaGVja1N3aXRjaChwQUMsIElvQywgcFJQb3J0LT5OZXQtPk5ldE51bWJlcik7CisJCX0KKwl9CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfUE9SVERPV04qIEV2ZW50ICglZCkgRU5ELlxuIiwgRXZlbnQpKQorfQkvKiBTa1JsbXRFdnRQb3J0RG93blggKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10RXZ0TGlua0Rvd24gLSBMSU5LX0RPV04KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBoYW5kbGVzIExJTktfRE9XTiBldmVudHMuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRFdnRMaW5rRG93bigKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfRVZQQVJBCVBhcmEpCS8qIFNLX1UzMiBQb3J0TnVtYmVyOyBTS19VMzIgVW5kZWZpbmVkICovCit7CisJU0tfUkxNVF9QT1JUCSpwUlBvcnQ7CisKKwlwUlBvcnQgPSAmcEFDLT5SbG10LlBvcnRbUGFyYS5QYXJhMzJbMF1dOworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9MSU5LX0RPV04gUG9ydCAlZCBFdmVudCBCRUdJTi5cbiIsIFBhcmEuUGFyYTMyWzBdKSkKKworCWlmICghcEFDLT5SbG10LlBvcnRbUGFyYS5QYXJhMzJbMF1dLkxpbmtEb3duKSB7CisJCXBSUG9ydC0+TmV0LT5MaW5rc1VwLS07CisJCXBSUG9ydC0+TGlua0Rvd24gPSBTS19UUlVFOworCQlwUlBvcnQtPlBvcnRTdGF0ZSA9IFNLX1JMTVRfUFNfTElOS19ET1dOOworCQlTS19IV0FDX0xJTktfTEVEKHBBQywgSW9DLCBQYXJhLlBhcmEzMlswXSwgU0tfTEVEX09GRik7CisKKwkJaWYgKChwUlBvcnQtPk5ldC0+UmxtdE1vZGUgJiBTS19STE1UX0NIRUNLX0xPQ19MSU5LKSAhPSAwKSB7CisJCQkvKiBCdWlsZCB0aGUgY2hlY2sgY2hhaW4uICovCisJCQlTa1JsbXRCdWlsZENoZWNrQ2hhaW4ocEFDLCBwUlBvcnQtPk5ldC0+TmV0TnVtYmVyKTsKKwkJfQorCisJCS8qIEVuc3VyZSB0aGF0IHBvcnQgaXMgbWFya2VkIGRvd24uICovCisJCVBhcmEuUGFyYTMyWzFdID0gLTE7CisJCSh2b2lkKVNrUmxtdEV2ZW50KHBBQywgSW9DLCBTS19STE1UX1BPUlRET1dOLCBQYXJhKTsKKwl9CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfTElOS19ET1dOIEV2ZW50IEVORC5cbiIpKQorfQkvKiBTa1JsbXRFdnRMaW5rRG93biAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRFdnRQb3J0QWRkciAtIFBPUlRfQUREUgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGhhbmRsZXMgUE9SVF9BRERSIGV2ZW50cy4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdEV2dFBvcnRBZGRyKAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19FVlBBUkEJUGFyYSkJLyogU0tfVTMyIFBvcnROdW1iZXI7IFNLX1UzMiAtMSAqLworeworCVNLX1UzMgkJCWksIGo7CisJU0tfUkxNVF9QT1JUCSpwUlBvcnQ7CisJU0tfTUFDX0FERFIJCSpwT2xkTWFjQWRkcjsKKwlTS19NQUNfQUREUgkJKnBOZXdNYWNBZGRyOworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1BPUlRfQUREUiBQb3J0ICVkIEV2ZW50IEJFR0lOLlxuIiwgUGFyYS5QYXJhMzJbMF0pKQorCisJaWYgKFBhcmEuUGFyYTMyWzFdICE9IChTS19VMzIpLTEpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQmFkIFBhcmFtZXRlci5cbiIpKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1BPUlRfQUREUiBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJLyogUG9ydCdzIHBoeXNpY2FsIE1BQyBhZGRyZXNzIGNoYW5nZWQuICovCisJcE9sZE1hY0FkZHIgPSAmcEFDLT5BZGRyLlBvcnRbUGFyYS5QYXJhMzJbMF1dLlByZXZpb3VzTWFjQWRkcmVzczsKKwlwTmV3TWFjQWRkciA9ICZwQUMtPkFkZHIuUG9ydFtQYXJhLlBhcmEzMlswXV0uQ3VycmVudE1hY0FkZHJlc3M7CisKKwkvKgorCSAqIE5PVEU6IFRoaXMgaXMgbm90IHNjYWxhYmxlIGZvciBzb2x1dGlvbnMgd2hlcmUgcG9ydHMgYXJlCisJICoJIGNoZWNrZWQgcmVtb3RlbHkuICBUaGVyZSwgd2UgbmVlZCB0byBzZW5kIGFuIFJMTVQKKwkgKgkgYWRkcmVzcyBjaGFuZ2UgcGFja2V0IC0gYW5kIGhvdyBkbyB3ZSBlbnN1cmUgZGVsaXZlcnk/CisJICovCisJZm9yIChpID0gMDsgaSA8IChTS19VMzIpcEFDLT5HSW5pLkdJTWFjc0ZvdW5kOyBpKyspIHsKKwkJcFJQb3J0ID0gJnBBQy0+UmxtdC5Qb3J0W2ldOworCQlmb3IgKGogPSAwOyBqIDwgcFJQb3J0LT5Qb3J0c0NoZWNrZWQ7IGorKykgeworCQkJaWYgKFNLX0FERFJfRVFVQUwoCisJCQkJcFJQb3J0LT5Qb3J0Q2hlY2tbal0uQ2hlY2tBZGRyLmEsIHBPbGRNYWNBZGRyLT5hKSkgeworCQkJCXBSUG9ydC0+UG9ydENoZWNrW2pdLkNoZWNrQWRkciA9ICpwTmV3TWFjQWRkcjsKKwkJCX0KKwkJfQorCX0KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfUE9SVF9BRERSIEV2ZW50IEVORC5cbiIpKQorfQkvKiBTa1JsbXRFdnRQb3J0QWRkciAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRFdnRTdGFydCAtIFNUQVJUCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgaGFuZGxlcyBTVEFSVCBldmVudHMuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRFdnRTdGFydCgKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfRVZQQVJBCVBhcmEpCS8qIFNLX1UzMiBOZXROdW1iZXI7IFNLX1UzMiAtMSAqLworeworCVNLX0VWUEFSQQlQYXJhMjsKKwlTS19VMzIJCVBvcnRJZHg7CisJU0tfVTMyCQlQb3J0TnVtYmVyOworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1NUQVJUIE5ldCAlZCBFdmVudCBCRUdJTi5cbiIsIFBhcmEuUGFyYTMyWzBdKSkKKworCWlmIChQYXJhLlBhcmEzMlsxXSAhPSAoU0tfVTMyKS0xKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkJhZCBQYXJhbWV0ZXIuXG4iKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9TVEFSVCBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJaWYgKFBhcmEuUGFyYTMyWzBdID49IHBBQy0+UmxtdC5OdW1OZXRzKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkJhZCBOZXROdW1iZXIgJWQuXG4iLCBQYXJhLlBhcmEzMlswXSkpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfU1RBUlQgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCWlmIChwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5SbG10U3RhdGUgIT0gU0tfUkxNVF9SU19JTklUKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfU1RBUlQgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCWlmIChwQUMtPlJsbXQuTmV0c1N0YXJ0ZWQgPj0gcEFDLT5SbG10Lk51bU5ldHMpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQWxsIG5ldHMgc2hvdWxkIGhhdmUgYmVlbiBzdGFydGVkLlxuIikpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfU1RBUlQgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCWlmIChwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5QcmVmUG9ydCA+PQorCQlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5OdW1Qb3J0cykgeworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX1JMTVRfRTAwOSwgU0tFUlJfUkxNVF9FMDA5X01TRyk7CisKKwkJLyogQ2hhbmdlIFByZWZQb3J0IHRvIGludGVybmFsIGRlZmF1bHQuICovCisJCVBhcmEyLlBhcmEzMlswXSA9IDB4RkZGRkZGRkY7CisJCVBhcmEyLlBhcmEzMlsxXSA9IFBhcmEuUGFyYTMyWzBdOworCQkodm9pZClTa1JsbXRFdmVudChwQUMsIElvQywgU0tfUkxNVF9QUkVGUE9SVF9DSEFOR0UsIFBhcmEyKTsKKwl9CisKKwlQb3J0SWR4ID0gcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uUHJlZlBvcnQ7CisJUG9ydE51bWJlciA9IHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlBvcnRbUG9ydElkeF0tPlBvcnROdW1iZXI7CisKKwlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5MaW5rc1VwID0gMDsKKwlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5Qb3J0c1VwID0gMDsKKwlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5DaGVja2luZ1N0YXRlID0gMDsKKwlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5SbG10U3RhdGUgPSBTS19STE1UX1JTX05FVF9ET1dOOworCisJLyogU3RhcnQgcHJlZmVycmVkIHBvcnQuICovCisJU2tSbG10UG9ydFN0YXJ0KHBBQywgSW9DLCBQb3J0TnVtYmVyKTsKKworCS8qIFN0YXJ0IFRpbWVyIChmb3IgZmlyc3QgcG9ydCBvbmx5KS4gKi8KKwlQYXJhMi5QYXJhMzJbMF0gPSBQb3J0TnVtYmVyOworCVBhcmEyLlBhcmEzMlsxXSA9IChTS19VMzIpLTE7CisJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uVXBUaW1lciwKKwkJU0tfUkxNVF9QT1JUU1RBUlRfVElNX1ZBTCwgU0tHRV9STE1ULCBTS19STE1UX1BPUlRTVEFSVF9USU0sIFBhcmEyKTsKKworCXBBQy0+UmxtdC5OZXRzU3RhcnRlZCsrOworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9TVEFSVCBFdmVudCBFTkQuXG4iKSkKK30JLyogU2tSbG10RXZ0U3RhcnQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10RXZ0U3RvcCAtIFNUT1AKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBoYW5kbGVzIFNUT1AgZXZlbnRzLgorICoKKyAqIENvbnRleHQ6CisgKglydW50aW1lLCBwYWdlYWJsZT8KKyAqCW1heSBiZSBjYWxsZWQgYWZ0ZXIgU0tfSU5JVF9JTworICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKi8KK1JMTVRfU1RBVElDIHZvaWQJU2tSbG10RXZ0U3RvcCgKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfRVZQQVJBCVBhcmEpCS8qIFNLX1UzMiBOZXROdW1iZXI7IFNLX1UzMiAtMSAqLworeworCVNLX0VWUEFSQQlQYXJhMjsKKwlTS19VMzIJCVBvcnROdW1iZXI7CisJU0tfVTMyCQlpOworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1NUT1AgTmV0ICVkIEV2ZW50IEJFR0lOLlxuIiwgUGFyYS5QYXJhMzJbMF0pKQorCisJaWYgKFBhcmEuUGFyYTMyWzFdICE9IChTS19VMzIpLTEpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQmFkIFBhcmFtZXRlci5cbiIpKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1NUT1AgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCWlmIChQYXJhLlBhcmEzMlswXSA+PSBwQUMtPlJsbXQuTnVtTmV0cykgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJCYWQgTmV0TnVtYmVyICVkLlxuIiwgUGFyYS5QYXJhMzJbMF0pKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1NUT1AgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCWlmIChwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5SbG10U3RhdGUgPT0gU0tfUkxNVF9SU19JTklUKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfU1RPUCBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJaWYgKHBBQy0+UmxtdC5OZXRzU3RhcnRlZCA9PSAwKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkFsbCBuZXRzIGFyZSBzdG9wcGVkLlxuIikpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfU1RPUCBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJLyogU3RvcCBSTE1UIHRpbWVycy4gKi8KKwlTa1RpbWVyU3RvcChwQUMsIElvQywgJnBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLkxvY1RpbWVyKTsKKwlTa1RpbWVyU3RvcChwQUMsIElvQywgJnBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlNlZ1RpbWVyKTsKKworCS8qIFN0b3AgbmV0LiAqLworCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlJsbXRTdGF0ZSA9IFNLX1JMTVRfUlNfSU5JVDsKKwlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5Sb290SWRTZXQgPSBTS19GQUxTRTsKKwlQYXJhMi5QYXJhMzJbMF0gPSBTS19STE1UX05FVF9ET1dOX0ZJTkFMOworCVBhcmEyLlBhcmEzMlsxXSA9IFBhcmEuUGFyYTMyWzBdOwkJCS8qIE5ldCMgKi8KKwlTa0V2ZW50UXVldWUocEFDLCBTS0dFX0RSViwgU0tfRFJWX05FVF9ET1dOLCBQYXJhMik7CisKKwkvKiBTdG9wIHBvcnRzLiAqLworCWZvciAoaSA9IDA7IGkgPCBwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5OdW1Qb3J0czsgaSsrKSB7CisJCVBvcnROdW1iZXIgPSBwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5Qb3J0W2ldLT5Qb3J0TnVtYmVyOworCQlpZiAocEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uUG9ydFN0YXRlICE9IFNLX1JMTVRfUFNfSU5JVCkgeworCQkJU2tUaW1lclN0b3AocEFDLCBJb0MsICZwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5VcFRpbWVyKTsKKwkJCVNrVGltZXJTdG9wKHBBQywgSW9DLCAmcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uRG93blJ4VGltZXIpOworCQkJU2tUaW1lclN0b3AocEFDLCBJb0MsICZwQUMtPlJsbXQuUG9ydFtQb3J0TnVtYmVyXS5Eb3duVHhUaW1lcik7CisKKwkJCXBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLlBvcnRTdGF0ZSA9IFNLX1JMTVRfUFNfSU5JVDsKKwkJCXBBQy0+UmxtdC5Qb3J0W1BvcnROdW1iZXJdLlJvb3RJZFNldCA9IFNLX0ZBTFNFOworCQkJcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl0uUG9ydFN0YXJ0ZWQgPSBTS19GQUxTRTsKKwkJCVBhcmEyLlBhcmEzMlswXSA9IFBvcnROdW1iZXI7CisJCQlQYXJhMi5QYXJhMzJbMV0gPSAoU0tfVTMyKS0xOworCQkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9IV0FDLCBTS19IV0VWX1BPUlRfU1RPUCwgUGFyYTIpOworCQl9CisJfQorCisJcEFDLT5SbG10Lk5ldHNTdGFydGVkLS07CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfU1RPUCBFdmVudCBFTkQuXG4iKSkKK30JLyogU2tSbG10RXZ0U3RvcCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRFdnRUaW0gLSBUSU0KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBoYW5kbGVzIFRJTSBldmVudHMuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRFdnRUaW0oCitTS19BQwkJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX0VWUEFSQQlQYXJhKQkvKiBTS19VMzIgTmV0TnVtYmVyOyBTS19VMzIgLTEgKi8KK3sKKwlTS19STE1UX1BPUlQJKnBSUG9ydDsKKwlTS19VMzIJCQlUaW1lb3V0OworCVNLX1UzMgkJCU5ld1RpbWVvdXQ7CisJU0tfVTMyCQkJUG9ydE51bWJlcjsKKwlTS19VMzIJCQlpOworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1RJTSBFdmVudCBCRUdJTi5cbiIpKQorCisJaWYgKFBhcmEuUGFyYTMyWzFdICE9IChTS19VMzIpLTEpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQmFkIFBhcmFtZXRlci5cbiIpKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1RJTSBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJaWYgKChwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5SbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfT1RIRVJTKSA9PSAwIHx8CisJCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLkxpbmtzVXAgPT0gMCkgeworCQkvKiBNb2RlIGNoYW5nZWQgb3IgYWxsIGxpbmtzIGRvd246IE5vIG1vcmUgbGluayBjaGVja2luZy4gKi8KKwkJcmV0dXJuOworCX0KKworI2lmIDAKKwlwQUMtPlJsbXQuU3dpdGNoQ2hlY2tDb3VudGVyLS07CisJaWYgKHBBQy0+UmxtdC5Td2l0Y2hDaGVja0NvdW50ZXIgPT0gMCkgeworCQlwQUMtPlJsbXQuU3dpdGNoQ2hlY2tDb3VudGVyOworCX0KKyNlbmRpZgkvKiAwICovCisKKwlOZXdUaW1lb3V0ID0gU0tfUkxNVF9ERUZfVE9fVkFMOworCWZvciAoaSA9IDA7IGkgPCBwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5OdW1Qb3J0czsgaSsrKSB7CisJCVBvcnROdW1iZXIgPSBwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5Qb3J0W2ldLT5Qb3J0TnVtYmVyOworCQlwUlBvcnQgPSAmcEFDLT5SbG10LlBvcnRbUG9ydE51bWJlcl07CisJCWlmICghcFJQb3J0LT5MaW5rRG93bikgeworCQkJVGltZW91dCA9IFNrUmxtdENoZWNrUG9ydChwQUMsIElvQywgUG9ydE51bWJlcik7CisJCQlpZiAoVGltZW91dCA8IE5ld1RpbWVvdXQpIHsKKwkJCQlOZXdUaW1lb3V0ID0gVGltZW91dDsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFRoZXNlIGNvdW50ZXJzIHNob3VsZCBiZSBzZXQgdG8gMCBmb3IgYWxsIHBvcnRzIGJlZm9yZSB0aGUKKwkJCSAqIGZpcnN0IGZyYW1lIGlzIHNlbnQgaW4gdGhlIG5leHQgbG9vcC4KKwkJCSAqLworCQkJcFJQb3J0LT5QYWNrZXRzUGVyVGltZVNsb3QgPSAwOworCQkJLyogcFJQb3J0LT5EYXRhUGFja2V0c1BlclRpbWVTbG90ID0gMDsgKi8KKwkJCXBSUG9ydC0+QnBkdVBhY2tldHNQZXJUaW1lU2xvdCA9IDA7CisJCX0KKwl9CisJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uVGltZW91dFZhbHVlID0gTmV3VGltZW91dDsKKworCWlmIChwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5MaW5rc1VwID4gMSkgeworCQkvKgorCQkgKiBJZiBjaGVja2luZyByZW1vdGUgcG9ydHMsIGFsc28gc2VuZCBwYWNrZXRzIGlmCisJCSAqICAgKExpbmtzVXAgPT0gMSkgJiYKKwkJICogICB0aGlzIHBvcnQgY2hlY2tzIGF0IGxlYXN0IG9uZSAocmVtb3RlKSBwb3J0LgorCQkgKi8KKworCQkvKgorCQkgKiBNdXN0IGJlIG5ldyBsb29wLCBhcyBTa1JsbXRDaGVja1BvcnQgY2FuIHJlcXVlc3QgdG8KKwkJICogY2hlY2sgc2VnbWVudGF0aW9uIHdoZW4gZS5nLiBjaGVja2luZyB0aGUgbGFzdCBwb3J0LgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLk51bVBvcnRzOyBpKyspIHsKKwkJCWlmICghcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uUG9ydFtpXS0+TGlua0Rvd24pIHsKKwkJCQlTa1JsbXRTZW5kKHBBQywgSW9DLAorCQkJCQlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5Qb3J0W2ldLT5Qb3J0TnVtYmVyKTsKKwkJCX0KKwkJfQorCX0KKworCVNrVGltZXJTdGFydChwQUMsIElvQywgJnBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLkxvY1RpbWVyLAorCQlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5UaW1lb3V0VmFsdWUsIFNLR0VfUkxNVCwgU0tfUkxNVF9USU0sCisJCVBhcmEpOworCisJaWYgKHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLkxpbmtzVXAgPiAxICYmCisJCShwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5SbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfU0VHKSAmJgorCQkocEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uQ2hlY2tpbmdTdGF0ZSAmIFNLX1JMTVRfUkNTX1NUQVJUX1NFRykpIHsKKwkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uU2VnVGltZXIsCisJCQlTS19STE1UX1NFR19UT19WQUwsIFNLR0VfUkxNVCwgU0tfUkxNVF9TRUdfVElNLCBQYXJhKTsKKwkJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uQ2hlY2tpbmdTdGF0ZSAmPSB+U0tfUkxNVF9SQ1NfU1RBUlRfU0VHOworCQlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5DaGVja2luZ1N0YXRlIHw9CisJCQlTS19STE1UX1JDU19TRUcgfCBTS19STE1UX1JDU19SRVBPUlRfU0VHOworCX0KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfVElNIEV2ZW50IEVORC5cbiIpKQorfQkvKiBTa1JsbXRFdnRUaW0gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10RXZ0U2VnVGltIC0gU0VHX1RJTQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGhhbmRsZXMgU0VHX1RJTSBldmVudHMuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRFdnRTZWdUaW0oCitTS19BQwkJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX0VWUEFSQQlQYXJhKQkvKiBTS19VMzIgTmV0TnVtYmVyOyBTS19VMzIgLTEgKi8KK3sKKyNpZmRlZiB4REVCVUcKKwlpbnQgajsKKyNlbmRpZgkvKiBERUJVRyAqLworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1NFR19USU0gRXZlbnQgQkVHSU4uXG4iKSkKKworCWlmIChQYXJhLlBhcmEzMlsxXSAhPSAoU0tfVTMyKS0xKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkJhZCBQYXJhbWV0ZXIuXG4iKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9TRUdfVElNIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKyNpZmRlZiB4REVCVUcKKwlmb3IgKGogPSAwOyBqIDwgcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uTnVtUG9ydHM7IGorKykgeworCQlTS19BRERSX1BPUlQJKnBBUG9ydDsKKwkJU0tfVTMyCQkJazsKKwkJU0tfVTE2CQkJKkluQWRkcjsKKwkJU0tfVTgJCQlJbkFkZHI4WzZdOworCisJCUluQWRkciA9IChTS19VMTYgKikmSW5BZGRyOFswXTsKKwkJcEFQb3J0ID0gcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uUG9ydFtqXS0+QWRkclBvcnQ7CisJCWZvciAoayA9IDA7IGsgPCBwQVBvcnQtPk5leHRFeGFjdE1hdGNoUmxtdDsgaysrKSB7CisJCQkvKiBHZXQgZXhhY3QgbWF0Y2ggYWRkcmVzcyBrIGZyb20gcG9ydCBqLiAqLworCQkJWE1fSU5BRERSKElvQywgcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uUG9ydFtqXS0+UG9ydE51bWJlciwKKwkJCQlYTV9FWE0oayksIEluQWRkcik7CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiTUMgYWRkcmVzcyAlZCBvbiBQb3J0ICV1OiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAtLSAgJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnguXG4iLAorCQkJCQlrLCBwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzBdXS5Qb3J0W2pdLT5Qb3J0TnVtYmVyLAorCQkJCQlJbkFkZHI4WzBdLCBJbkFkZHI4WzFdLCBJbkFkZHI4WzJdLAorCQkJCQlJbkFkZHI4WzNdLCBJbkFkZHI4WzRdLCBJbkFkZHI4WzVdLAorCQkJCQlwQVBvcnQtPkV4YWN0W2tdLmFbMF0sIHBBUG9ydC0+RXhhY3Rba10uYVsxXSwKKwkJCQkJcEFQb3J0LT5FeGFjdFtrXS5hWzJdLCBwQVBvcnQtPkV4YWN0W2tdLmFbM10sCisJCQkJCXBBUG9ydC0+RXhhY3Rba10uYVs0XSwgcEFQb3J0LT5FeGFjdFtrXS5hWzVdKSkKKwkJfQorCX0KKyNlbmRpZgkvKiB4REVCVUcgKi8KKwkJCQkKKwlTa1JsbXRDaGVja1NlZyhwQUMsIElvQywgUGFyYS5QYXJhMzJbMF0pOworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9TRUdfVElNIEV2ZW50IEVORC5cbiIpKQorfQkvKiBTa1JsbXRFdnRTZWdUaW0gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10RXZ0UGFja2V0UnggLSBQQUNLRVRfUkVDRUlWRUQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBoYW5kbGVzIFBBQ0tFVF9SRUNFSVZFRCBldmVudHMuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRFdnRQYWNrZXRSeCgKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfRVZQQVJBCVBhcmEpCS8qIFNLX01CVUYgKnBNYiAqLworeworCVNLX01CVUYJKnBNYjsKKwlTS19NQlVGCSpwTmV4dE1iOworCVNLX1UzMglOZXROdW1iZXI7CisKKwkKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfUEFDS0VUX1JFQ0VJVkVEIEV2ZW50IEJFR0lOLlxuIikpCisKKwkvKiBTaG91bGQgd2UgaWdub3JlIGZyYW1lcyBkdXJpbmcgcG9ydCBzd2l0Y2hpbmc/ICovCisKKyNpZmRlZiBERUJVRworCXBNYiA9IFBhcmEucFBhcmFQdHI7CisJaWYgKHBNYiA9PSBOVUxMKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsICgiTm8gbWJ1Zi5cbiIpKQorCX0KKwllbHNlIGlmIChwTWItPnBOZXh0ICE9IE5VTEwpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiTW9yZSB0aGFuIG9uZSBtYnVmIG9yIHBNYi0+cE5leHQgbm90IHNldC5cbiIpKQorCX0KKyNlbmRpZgkvKiBERUJVRyAqLworCisJZm9yIChwTWIgPSBQYXJhLnBQYXJhUHRyOyBwTWIgIT0gTlVMTDsgcE1iID0gcE5leHRNYikgeworCQlwTmV4dE1iID0gcE1iLT5wTmV4dDsKKwkJcE1iLT5wTmV4dCA9IE5VTEw7CisKKwkJTmV0TnVtYmVyID0gcEFDLT5SbG10LlBvcnRbcE1iLT5Qb3J0SWR4XS5OZXQtPk5ldE51bWJlcjsKKwkJaWYgKHBBQy0+UmxtdC5OZXRbTmV0TnVtYmVyXS5SbG10U3RhdGUgPT0gU0tfUkxNVF9SU19JTklUKSB7CisJCQlTa0RydkZyZWVSbG10TWJ1ZihwQUMsIElvQywgcE1iKTsKKwkJfQorCQllbHNlIHsKKwkJCVNrUmxtdFBhY2tldFJlY2VpdmUocEFDLCBJb0MsIHBNYik7CisJCX0KKwl9CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfUEFDS0VUX1JFQ0VJVkVEIEV2ZW50IEVORC5cbiIpKQorfQkvKiBTa1JsbXRFdnRQYWNrZXRSeCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRFdnRTdGF0c0NsZWFyIC0gU1RBVFNfQ0xFQVIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBoYW5kbGVzIFNUQVRTX0NMRUFSIGV2ZW50cy4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdEV2dFN0YXRzQ2xlYXIoCitTS19BQwkJKnBBQywJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJCUlvQywJLyogSS9PIENvbnRleHQgKi8KK1NLX0VWUEFSQQlQYXJhKQkvKiBTS19VMzIgTmV0TnVtYmVyOyBTS19VMzIgLTEgKi8KK3sKKwlTS19VMzIJCQlpOworCVNLX1JMTVRfUE9SVAkqcFJQb3J0OworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1NUQVRTX0NMRUFSIEV2ZW50IEJFR0lOLlxuIikpCisKKwlpZiAoUGFyYS5QYXJhMzJbMV0gIT0gKFNLX1UzMiktMSkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJCYWQgUGFyYW1ldGVyLlxuIikpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfU1RBVFNfQ0xFQVIgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCWlmIChQYXJhLlBhcmEzMlswXSA+PSBwQUMtPlJsbXQuTnVtTmV0cykgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJCYWQgTmV0TnVtYmVyICVkLlxuIiwgUGFyYS5QYXJhMzJbMF0pKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1NUQVRTX0NMRUFSIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwkvKiBDbGVhciBzdGF0aXN0aWNzIGZvciBsb2dpY2FsIGFuZCBwaHlzaWNhbCBwb3J0cy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlswXV0uTnVtUG9ydHM7IGkrKykgeworCQlwUlBvcnQgPQorCQkJJnBBQy0+UmxtdC5Qb3J0W3BBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMF1dLlBvcnRbaV0tPlBvcnROdW1iZXJdOworCQlwUlBvcnQtPlR4SGVsbG9DdHMgPSAwOworCQlwUlBvcnQtPlJ4SGVsbG9DdHMgPSAwOworCQlwUlBvcnQtPlR4U3BIZWxsb1JlcUN0cyA9IDA7CisJCXBSUG9ydC0+UnhTcEhlbGxvQ3RzID0gMDsKKwl9CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfU1RBVFNfQ0xFQVIgRXZlbnQgRU5ELlxuIikpCit9CS8qIFNrUmxtdEV2dFN0YXRzQ2xlYXIgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10RXZ0U3RhdHNVcGRhdGUgLSBTVEFUU19VUERBVEUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgcm91dGluZSBoYW5kbGVzIFNUQVRTX1VQREFURSBldmVudHMuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRFdnRTdGF0c1VwZGF0ZSgKK1NLX0FDCQkqcEFDLAkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwkJSW9DLAkvKiBJL08gQ29udGV4dCAqLworU0tfRVZQQVJBCVBhcmEpCS8qIFNLX1UzMiBOZXROdW1iZXI7IFNLX1UzMiAtMSAqLworeworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9TVEFUU19VUERBVEUgRXZlbnQgQkVHSU4uXG4iKSkKKworCWlmIChQYXJhLlBhcmEzMlsxXSAhPSAoU0tfVTMyKS0xKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkJhZCBQYXJhbWV0ZXIuXG4iKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9TVEFUU19VUERBVEUgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCWlmIChQYXJhLlBhcmEzMlswXSA+PSBwQUMtPlJsbXQuTnVtTmV0cykgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJCYWQgTmV0TnVtYmVyICVkLlxuIiwgUGFyYS5QYXJhMzJbMF0pKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1NUQVRTX1VQREFURSBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJLyogVXBkYXRlIHN0YXRpc3RpY3MgLSBjdXJyZW50bHkgYWx3YXlzIHVwLXRvLWRhdGUuICovCisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfU1RBVFNfVVBEQVRFIEV2ZW50IEVORC5cbiIpKQorfQkvKiBTa1JsbXRFdnRTdGF0c1VwZGF0ZSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRFdnRQcmVmcG9ydENoYW5nZSAtIFBSRUZQT1JUX0NIQU5HRQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGhhbmRsZXMgUFJFRlBPUlRfQ0hBTkdFIGV2ZW50cy4KKyAqCisgKiBDb250ZXh0OgorICoJcnVudGltZSwgcGFnZWFibGU/CisgKgltYXkgYmUgY2FsbGVkIGFmdGVyIFNLX0lOSVRfSU8KKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICovCitSTE1UX1NUQVRJQyB2b2lkCVNrUmxtdEV2dFByZWZwb3J0Q2hhbmdlKAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19FVlBBUkEJUGFyYSkJLyogU0tfVTMyIFBvcnRJbmRleDsgU0tfVTMyIE5ldE51bWJlciAqLworeworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiU0tfUkxNVF9QUkVGUE9SVF9DSEFOR0UgdG8gUG9ydCAlZCBFdmVudCBCRUdJTi5cbiIsIFBhcmEuUGFyYTMyWzBdKSkKKworCWlmIChQYXJhLlBhcmEzMlsxXSA+PSBwQUMtPlJsbXQuTnVtTmV0cykgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJCYWQgTmV0TnVtYmVyICVkLlxuIiwgUGFyYS5QYXJhMzJbMV0pKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1BSRUZQT1JUX0NIQU5HRSBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJLyogMHhGRkZGRkZGRiA9PSBhdXRvLW1vZGUuICovCisJaWYgKFBhcmEuUGFyYTMyWzBdID09IDB4RkZGRkZGRkYpIHsKKwkJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uUHJlZlBvcnQgPSBTS19STE1UX0RFRl9QUkVGX1BPUlQ7CisJfQorCWVsc2UgeworCQlpZiAoUGFyYS5QYXJhMzJbMF0gPj0gcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uTnVtUG9ydHMpIHsKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVywgU0tFUlJfUkxNVF9FMDEwLCBTS0VSUl9STE1UX0UwMTBfTVNHKTsKKworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCQkoIlNLX1JMTVRfUFJFRlBPUlRfQ0hBTkdFIEV2ZW50IEVNUFRZLlxuIikpCisJCQlyZXR1cm47CisJCX0KKworCQlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5QcmVmUG9ydCA9IFBhcmEuUGFyYTMyWzBdOworCX0KKworCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLlByZWZlcmVuY2UgPSBQYXJhLlBhcmEzMlswXTsKKworCWlmIChwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5SbG10U3RhdGUgIT0gU0tfUkxNVF9SU19JTklUKSB7CisJCVNrUmxtdENoZWNrU3dpdGNoKHBBQywgSW9DLCBQYXJhLlBhcmEzMlsxXSk7CisJfQorCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1BSRUZQT1JUX0NIQU5HRSBFdmVudCBFTkQuXG4iKSkKK30JLyogU2tSbG10RXZ0UHJlZnBvcnRDaGFuZ2UgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10RXZ0U2V0TmV0cyAtIFNFVF9ORVRTCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgaGFuZGxlcyBTRVRfTkVUUyBldmVudHMuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRFdnRTZXROZXRzKAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19FVlBBUkEJUGFyYSkJLyogU0tfVTMyIE51bU5ldHM7IFNLX1UzMiAtMSAqLworeworCWludCBpOworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX1NFVF9ORVRTIEV2ZW50IEJFR0lOLlxuIikpCisKKwlpZiAoUGFyYS5QYXJhMzJbMV0gIT0gKFNLX1UzMiktMSkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJCYWQgUGFyYW1ldGVyLlxuIikpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfU0VUX05FVFMgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCWlmIChQYXJhLlBhcmEzMlswXSA9PSAwIHx8IFBhcmEuUGFyYTMyWzBdID4gU0tfTUFYX05FVFMgfHwKKwkJUGFyYS5QYXJhMzJbMF0gPiAoU0tfVTMyKXBBQy0+R0luaS5HSU1hY3NGb3VuZCkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJCYWQgbnVtYmVyIG9mIG5ldHM6ICVkLlxuIiwgUGFyYS5QYXJhMzJbMF0pKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1NFVF9ORVRTIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwlpZiAoUGFyYS5QYXJhMzJbMF0gPT0gcEFDLT5SbG10Lk51bU5ldHMpIHsJLyogTm8gY2hhbmdlLiAqLworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1NFVF9ORVRTIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwkvKiBFbnRlcmluZyBhbmQgbGVhdmluZyBkdWFsIG1vZGUgb25seSBhbGxvd2VkIHdoaWxlIG5ldHMgYXJlIHN0b3BwZWQuICovCisJaWYgKHBBQy0+UmxtdC5OZXRzU3RhcnRlZCA+IDApIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQ2hhbmdpbmcgZHVhbCBtb2RlIG9ubHkgYWxsb3dlZCB3aGlsZSBhbGwgbmV0cyBhcmUgc3RvcHBlZC5cbiIpKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1NFVF9ORVRTIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwlpZiAoUGFyYS5QYXJhMzJbMF0gPT0gMSkgeworCQlpZiAocEFDLT5SbG10Lk51bU5ldHMgPiAxKSB7CisJCQkvKiBDbGVhciBsb2dpY2FsIE1BQyBhZGRyIGZyb20gc2Vjb25kIG5ldCdzIGFjdGl2ZSBwb3J0LiAqLworCQkJKHZvaWQpU2tBZGRyT3ZlcnJpZGUocEFDLCBJb0MsIHBBQy0+UmxtdC5OZXRbMV0uUG9ydFtwQUMtPkFkZHIuCisJCQkJTmV0WzFdLkFjdGl2ZVBvcnRdLT5Qb3J0TnVtYmVyLCBOVUxMLCBTS19BRERSX0NMRUFSX0xPR0lDQUwpOworCQkJcEFDLT5SbG10Lk5ldFsxXS5OdW1Qb3J0cyA9IDA7CisJCX0KKworCQlwQUMtPlJsbXQuTnVtTmV0cyA9IFBhcmEuUGFyYTMyWzBdOworCQlmb3IgKGkgPSAwOyAoU0tfVTMyKWkgPCBwQUMtPlJsbXQuTnVtTmV0czsgaSsrKSB7CisJCQlwQUMtPlJsbXQuTmV0W2ldLlJsbXRTdGF0ZSA9IFNLX1JMTVRfUlNfSU5JVDsKKwkJCXBBQy0+UmxtdC5OZXRbaV0uUm9vdElkU2V0ID0gU0tfRkFMU0U7CisJCQlwQUMtPlJsbXQuTmV0W2ldLlByZWZlcmVuY2UgPSAweEZGRkZGRkZGOwkgIC8qICJBdXRvbWF0aWMiICovCisJCQlwQUMtPlJsbXQuTmV0W2ldLlByZWZQb3J0ID0gU0tfUkxNVF9ERUZfUFJFRl9QT1JUOworCQkJLyogSnVzdCBhc3N1bWluZy4gKi8KKwkJCXBBQy0+UmxtdC5OZXRbaV0uQWN0aXZlUG9ydCA9IHBBQy0+UmxtdC5OZXRbaV0uUHJlZlBvcnQ7CisJCQlwQUMtPlJsbXQuTmV0W2ldLlJsbXRNb2RlID0gU0tfUkxNVF9ERUZfTU9ERTsKKwkJCXBBQy0+UmxtdC5OZXRbaV0uVGltZW91dFZhbHVlID0gU0tfUkxNVF9ERUZfVE9fVkFMOworCQkJcEFDLT5SbG10Lk5ldFtpXS5OZXROdW1iZXIgPSBpOworCQl9CisKKwkJcEFDLT5SbG10LlBvcnRbMV0uTmV0PSAmcEFDLT5SbG10Lk5ldFswXTsKKwkJcEFDLT5SbG10Lk5ldFswXS5OdW1Qb3J0cyA9IHBBQy0+R0luaS5HSU1hY3NGb3VuZDsKKworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1BOTUksIFNLX1BOTUlfRVZUX1JMTVRfU0VUX05FVFMsIFBhcmEpOworCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlJMTVQ6IENoYW5nZWQgdG8gb25lIG5ldCB3aXRoIHR3byBwb3J0cy5cbiIpKQorCX0KKwllbHNlIGlmIChQYXJhLlBhcmEzMlswXSA9PSAyKSB7CisJCXBBQy0+UmxtdC5Qb3J0WzFdLk5ldD0gJnBBQy0+UmxtdC5OZXRbMV07CisJCXBBQy0+UmxtdC5OZXRbMV0uTnVtUG9ydHMgPSBwQUMtPkdJbmkuR0lNYWNzRm91bmQgLSAxOworCQlwQUMtPlJsbXQuTmV0WzBdLk51bVBvcnRzID0KKwkJCXBBQy0+R0luaS5HSU1hY3NGb3VuZCAtIHBBQy0+UmxtdC5OZXRbMV0uTnVtUG9ydHM7CisJCQorCQlwQUMtPlJsbXQuTnVtTmV0cyA9IFBhcmEuUGFyYTMyWzBdOworCQlmb3IgKGkgPSAwOyAoU0tfVTMyKWkgPCBwQUMtPlJsbXQuTnVtTmV0czsgaSsrKSB7CisJCQlwQUMtPlJsbXQuTmV0W2ldLlJsbXRTdGF0ZSA9IFNLX1JMTVRfUlNfSU5JVDsKKwkJCXBBQy0+UmxtdC5OZXRbaV0uUm9vdElkU2V0ID0gU0tfRkFMU0U7CisJCQlwQUMtPlJsbXQuTmV0W2ldLlByZWZlcmVuY2UgPSAweEZGRkZGRkZGOwkgIC8qICJBdXRvbWF0aWMiICovCisJCQlwQUMtPlJsbXQuTmV0W2ldLlByZWZQb3J0ID0gU0tfUkxNVF9ERUZfUFJFRl9QT1JUOworCQkJLyogSnVzdCBhc3N1bWluZy4gKi8KKwkJCXBBQy0+UmxtdC5OZXRbaV0uQWN0aXZlUG9ydCA9IHBBQy0+UmxtdC5OZXRbaV0uUHJlZlBvcnQ7CisJCQlwQUMtPlJsbXQuTmV0W2ldLlJsbXRNb2RlID0gU0tfUkxNVF9ERUZfTU9ERTsKKwkJCXBBQy0+UmxtdC5OZXRbaV0uVGltZW91dFZhbHVlID0gU0tfUkxNVF9ERUZfVE9fVkFMOworCisJCQlwQUMtPlJsbXQuTmV0W2ldLk5ldE51bWJlciA9IGk7CisJCX0KKworCQkvKiBTZXQgbG9naWNhbCBNQUMgYWRkciBvbiBzZWNvbmQgbmV0J3MgYWN0aXZlIHBvcnQuICovCisJCSh2b2lkKVNrQWRkck92ZXJyaWRlKHBBQywgSW9DLCBwQUMtPlJsbXQuTmV0WzFdLlBvcnRbcEFDLT5BZGRyLgorCQkJTmV0WzFdLkFjdGl2ZVBvcnRdLT5Qb3J0TnVtYmVyLCBOVUxMLCBTS19BRERSX1NFVF9MT0dJQ0FMKTsKKworCQlTa0V2ZW50UXVldWUocEFDLCBTS0dFX1BOTUksIFNLX1BOTUlfRVZUX1JMTVRfU0VUX05FVFMsIFBhcmEpOworCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlJMTVQ6IENoYW5nZWQgdG8gdHdvIG5ldHMgd2l0aCBvbmUgcG9ydCBlYWNoLlxuIikpCisJfQorCWVsc2UgeworCQkvKiBOb3QgaW1wbGVtZW50ZWQgZm9yIG1vcmUgdGhhbiB0d28gbmV0cy4gKi8KKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU2V0TmV0cyBub3QgaW1wbGVtZW50ZWQgZm9yIG1vcmUgdGhhbiB0d28gbmV0cy5cbiIpKQorCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTS19STE1UX1NFVF9ORVRTIEV2ZW50IEVNUFRZLlxuIikpCisJCXJldHVybjsKKwl9CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1JMTVQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNLX1JMTVRfU0VUX05FVFMgRXZlbnQgRU5ELlxuIikpCit9CS8qIFNrUmxtdFNldE5ldHMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tSbG10RXZ0TW9kZUNoYW5nZSAtIE1PREVfQ0hBTkdFCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIHJvdXRpbmUgaGFuZGxlcyBNT0RFX0NIQU5HRSBldmVudHMuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCU5vdGhpbmcKKyAqLworUkxNVF9TVEFUSUMgdm9pZAlTa1JsbXRFdnRNb2RlQ2hhbmdlKAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19FVlBBUkEJUGFyYSkJLyogU0tfVTMyIE5ld01vZGU7IFNLX1UzMiBOZXROdW1iZXIgKi8KK3sKKwlTS19FVlBBUkEJUGFyYTI7CisJU0tfVTMyCQlpOworCVNLX1UzMgkJUHJldlJsbXRNb2RlOworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTS19STE1UX01PREVfQ0hBTkdFIEV2ZW50IEJFR0lOLlxuIikpCisKKwlpZiAoUGFyYS5QYXJhMzJbMV0gPj0gcEFDLT5SbG10Lk51bU5ldHMpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQmFkIE5ldE51bWJlciAlZC5cbiIsIFBhcmEuUGFyYTMyWzFdKSkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9NT0RFX0NIQU5HRSBFdmVudCBFTVBUWS5cbiIpKQorCQlyZXR1cm47CisJfQorCisJUGFyYS5QYXJhMzJbMF0gfD0gU0tfUkxNVF9DSEVDS19MSU5LOworCisJaWYgKChwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5OdW1Qb3J0cyA9PSAxKSAmJgorCQlQYXJhLlBhcmEzMlswXSAhPSBTS19STE1UX01PREVfQ0xTKSB7CisJCXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLlJsbXRNb2RlID0gU0tfUkxNVF9NT0RFX0NMUzsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiRm9yY2VkIFJMTVQgbW9kZSB0byBDTFMgb24gc2luZ2xlIHBvcnQgbmV0LlxuIikpCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlNLX1JMTVRfTU9ERV9DSEFOR0UgRXZlbnQgRU1QVFkuXG4iKSkKKwkJcmV0dXJuOworCX0KKworCS8qIFVwZGF0ZSBSTE1UIG1vZGUuICovCisJUHJldlJsbXRNb2RlID0gcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uUmxtdE1vZGU7CisJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uUmxtdE1vZGUgPSBQYXJhLlBhcmEzMlswXTsKKworCWlmICgoUHJldlJsbXRNb2RlICYgU0tfUkxNVF9DSEVDS19MT0NfTElOSykgIT0KKwkJKHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLlJsbXRNb2RlICYgU0tfUkxNVF9DSEVDS19MT0NfTElOSykpIHsKKwkJLyogU0tfUkxNVF9DSEVDS19MT0NfTElOSyBiaXQgY2hhbmdlZC4gKi8KKwkJaWYgKChQcmV2UmxtdE1vZGUgJiBTS19STE1UX0NIRUNLX09USEVSUykgPT0gMCAmJgorCQkJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uTnVtUG9ydHMgPiAxICYmCisJCQlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5Qb3J0c1VwID49IDEpIHsKKwkJCS8qIDIwMDAxMjA3IFJBOiBXYXMgIlBvcnRzVXAgPT0gMSIuICovCisJCQlQYXJhMi5QYXJhMzJbMF0gPSBQYXJhLlBhcmEzMlsxXTsKKwkJCVBhcmEyLlBhcmEzMlsxXSA9IChTS19VMzIpLTE7CisJCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5Mb2NUaW1lciwKKwkJCQlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5UaW1lb3V0VmFsdWUsCisJCQkJU0tHRV9STE1ULCBTS19STE1UX1RJTSwgUGFyYTIpOworCQl9CisJfQorCisJaWYgKChQcmV2UmxtdE1vZGUgJiBTS19STE1UX0NIRUNLX1NFRykgIT0KKwkJKHBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLlJsbXRNb2RlICYgU0tfUkxNVF9DSEVDS19TRUcpKSB7CisJCS8qIFNLX1JMTVRfQ0hFQ0tfU0VHIGJpdCBjaGFuZ2VkLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uTnVtUG9ydHM7IGkrKykgeworCQkJKHZvaWQpU2tBZGRyTWNDbGVhcihwQUMsIElvQywKKwkJCQlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5Qb3J0W2ldLT5Qb3J0TnVtYmVyLAorCQkJCVNLX0FERFJfUEVSTUFORU5UIHwgU0tfTUNfU1dfT05MWSk7CisKKwkJCS8qIEFkZCBSTE1UIE1DIGFkZHJlc3MuICovCisJCQkodm9pZClTa0FkZHJNY0FkZChwQUMsIElvQywKKwkJCQlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5Qb3J0W2ldLT5Qb3J0TnVtYmVyLAorCQkJCSZTa1JsbXRNY0FkZHIsIFNLX0FERFJfUEVSTUFORU5UKTsKKworCQkJaWYgKChwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5SbG10TW9kZSAmCisJCQkJU0tfUkxNVF9DSEVDS19TRUcpICE9IDApIHsKKwkJCQkvKiBBZGQgQlBEVSBNQyBhZGRyZXNzLiAqLworCQkJCSh2b2lkKVNrQWRkck1jQWRkKHBBQywgSW9DLAorCQkJCQlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5Qb3J0W2ldLT5Qb3J0TnVtYmVyLAorCQkJCQkmQnJpZGdlTWNBZGRyLCBTS19BRERSX1BFUk1BTkVOVCk7CisKKwkJCQlpZiAocEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uUmxtdFN0YXRlICE9IFNLX1JMTVRfUlNfSU5JVCkgeworCQkJCQlpZiAoIXBBQy0+UmxtdC5OZXRbUGFyYS5QYXJhMzJbMV1dLlBvcnRbaV0tPkxpbmtEb3duICYmCisJCQkJCQkoUGFyYTIucFBhcmFQdHIgPSBTa1JsbXRCdWlsZFNwYW5uaW5nVHJlZVBhY2tldCgKKwkJCQkJCXBBQywgSW9DLCBpKSkgIT0gTlVMTCkgeworCQkJCQkJcEFDLT5SbG10Lk5ldFtQYXJhLlBhcmEzMlsxXV0uUG9ydFtpXS0+Um9vdElkU2V0ID0KKwkJCQkJCQlTS19GQUxTRTsKKwkJCQkJCVNrRXZlbnRRdWV1ZShwQUMsIFNLR0VfRFJWLCBTS19EUlZfUkxNVF9TRU5ELCBQYXJhMik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkodm9pZClTa0FkZHJNY1VwZGF0ZShwQUMsIElvQywKKwkJCQlwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5Qb3J0W2ldLT5Qb3J0TnVtYmVyKTsKKwkJfQkvKiBmb3IgLi4uICovCisKKwkJaWYgKChwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5SbG10TW9kZSAmIFNLX1JMTVRfQ0hFQ0tfU0VHKSAhPSAwKSB7CisJCQlQYXJhMi5QYXJhMzJbMF0gPSBQYXJhLlBhcmEzMlsxXTsKKwkJCVBhcmEyLlBhcmEzMlsxXSA9IChTS19VMzIpLTE7CisJCQlTa1RpbWVyU3RhcnQocEFDLCBJb0MsICZwQUMtPlJsbXQuTmV0W1BhcmEuUGFyYTMyWzFdXS5TZWdUaW1lciwKKwkJCQlTS19STE1UX1NFR19UT19WQUwsIFNLR0VfUkxNVCwgU0tfUkxNVF9TRUdfVElNLCBQYXJhMik7CisJCX0KKwl9CS8qIFNLX1JMTVRfQ0hFQ0tfU0VHIGJpdCBjaGFuZ2VkLiAqLworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9STE1ULCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiU0tfUkxNVF9NT0RFX0NIQU5HRSBFdmVudCBFTkQuXG4iKSkKK30JLyogU2tSbG10RXZ0TW9kZUNoYW5nZSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1JsbXRFdmVudCAtIGEgUE9SVC0gb3IgYW4gUkxNVC1zcGVjaWZpYyBldmVudCBoYXBwZW5lZAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyByb3V0aW5lIGNhbGxzIHN1YnJvdXRpbmVzIHRvIGhhbmRsZSBQT1JULSBhbmQgUkxNVC1zcGVjaWZpYyBldmVudHMuCisgKgorICogQ29udGV4dDoKKyAqCXJ1bnRpbWUsIHBhZ2VhYmxlPworICoJbWF5IGJlIGNhbGxlZCBhZnRlciBTS19JTklUX0lPCisgKgorICogUmV0dXJuczoKKyAqCTAKKyAqLworaW50CVNrUmxtdEV2ZW50KAorU0tfQUMJCSpwQUMsCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCQlJb0MsCS8qIEkvTyBDb250ZXh0ICovCitTS19VMzIJCUV2ZW50LAkvKiBFdmVudCBjb2RlICovCitTS19FVlBBUkEJUGFyYSkJLyogRXZlbnQtc3BlY2lmaWMgcGFyYW1ldGVyICovCit7CisJc3dpdGNoIChFdmVudCkgeworCQorCS8qIC0tLS0tIFBPUlQgZXZlbnRzIC0tLS0tICovCisKKwljYXNlIFNLX1JMTVRfUE9SVFNUQVJUX1RJTToJLyogRnJvbSBSTE1UIHZpYSBUSU1FLiAqLworCQlTa1JsbXRFdnRQb3J0U3RhcnRUaW0ocEFDLCBJb0MsIFBhcmEpOworCQlicmVhazsKKwljYXNlIFNLX1JMTVRfTElOS19VUDoJCS8qIEZyb20gU0lSUS4gKi8KKwkJU2tSbG10RXZ0TGlua1VwKHBBQywgSW9DLCBQYXJhKTsKKwkJYnJlYWs7CisJY2FzZSBTS19STE1UX1BPUlRVUF9USU06CS8qIEZyb20gUkxNVCB2aWEgVElNRS4gKi8KKwkJU2tSbG10RXZ0UG9ydFVwVGltKHBBQywgSW9DLCBQYXJhKTsKKwkJYnJlYWs7CisJY2FzZSBTS19STE1UX1BPUlRET1dOOgkJCS8qIEZyb20gUkxNVC4gKi8KKwljYXNlIFNLX1JMTVRfUE9SVERPV05fUlhfVElNOgkvKiBGcm9tIFJMTVQgdmlhIFRJTUUuICovCisJY2FzZSBTS19STE1UX1BPUlRET1dOX1RYX1RJTToJLyogRnJvbSBSTE1UIHZpYSBUSU1FLiAqLworCQlTa1JsbXRFdnRQb3J0RG93blgocEFDLCBJb0MsIEV2ZW50LCBQYXJhKTsKKwkJYnJlYWs7CisJY2FzZSBTS19STE1UX0xJTktfRE9XTjoJCS8qIEZyb20gU0lSUS4gKi8KKwkJU2tSbG10RXZ0TGlua0Rvd24ocEFDLCBJb0MsIFBhcmEpOworCQlicmVhazsKKwljYXNlIFNLX1JMTVRfUE9SVF9BRERSOgkJLyogRnJvbSBBRERSLiAqLworCQlTa1JsbXRFdnRQb3J0QWRkcihwQUMsIElvQywgUGFyYSk7CisJCWJyZWFrOworCisJLyogLS0tLS0gUkxNVCBldmVudHMgLS0tLS0gKi8KKworCWNhc2UgU0tfUkxNVF9TVEFSVDoJCS8qIEZyb20gRFJWLiAqLworCQlTa1JsbXRFdnRTdGFydChwQUMsIElvQywgUGFyYSk7CisJCWJyZWFrOworCWNhc2UgU0tfUkxNVF9TVE9QOgkJLyogRnJvbSBEUlYuICovCisJCVNrUmxtdEV2dFN0b3AocEFDLCBJb0MsIFBhcmEpOworCQlicmVhazsKKwljYXNlIFNLX1JMTVRfVElNOgkJLyogRnJvbSBSTE1UIHZpYSBUSU1FLiAqLworCQlTa1JsbXRFdnRUaW0ocEFDLCBJb0MsIFBhcmEpOworCQlicmVhazsKKwljYXNlIFNLX1JMTVRfU0VHX1RJTToKKwkJU2tSbG10RXZ0U2VnVGltKHBBQywgSW9DLCBQYXJhKTsKKwkJYnJlYWs7CisJY2FzZSBTS19STE1UX1BBQ0tFVF9SRUNFSVZFRDoJLyogRnJvbSBEUlYuICovCisJCVNrUmxtdEV2dFBhY2tldFJ4KHBBQywgSW9DLCBQYXJhKTsKKwkJYnJlYWs7CisJY2FzZSBTS19STE1UX1NUQVRTX0NMRUFSOgkvKiBGcm9tIFBOTUkuICovCisJCVNrUmxtdEV2dFN0YXRzQ2xlYXIocEFDLCBJb0MsIFBhcmEpOworCQlicmVhazsKKwljYXNlIFNLX1JMTVRfU1RBVFNfVVBEQVRFOgkvKiBGcm9tIFBOTUkuICovCisJCVNrUmxtdEV2dFN0YXRzVXBkYXRlKHBBQywgSW9DLCBQYXJhKTsKKwkJYnJlYWs7CisJY2FzZSBTS19STE1UX1BSRUZQT1JUX0NIQU5HRToJLyogRnJvbSBQTk1JLiAqLworCQlTa1JsbXRFdnRQcmVmcG9ydENoYW5nZShwQUMsIElvQywgUGFyYSk7CisJCWJyZWFrOworCWNhc2UgU0tfUkxNVF9NT0RFX0NIQU5HRToJLyogRnJvbSBQTk1JLiAqLworCQlTa1JsbXRFdnRNb2RlQ2hhbmdlKHBBQywgSW9DLCBQYXJhKTsKKwkJYnJlYWs7CisJY2FzZSBTS19STE1UX1NFVF9ORVRTOgkvKiBGcm9tIERSVi4gKi8KKwkJU2tSbG10RXZ0U2V0TmV0cyhwQUMsIElvQywgUGFyYSk7CisJCWJyZWFrOworCisJLyogLS0tLS0gVW5rbm93biBldmVudHMgLS0tLS0gKi8KKworCWRlZmF1bHQ6CS8qIENyZWF0ZSBlcnJvciBsb2cgZW50cnkuICovCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfUkxNVCwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIlVua25vd24gUkxNVCBFdmVudCAlZC5cbiIsIEV2ZW50KSkKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9STE1UX0UwMDMsIFNLRVJSX1JMTVRfRTAwM19NU0cpOworCQlicmVhazsKKwl9CS8qIHN3aXRjaCgpICovCisKKwlyZXR1cm4gKDApOworfQkvKiBTa1JsbXRFdmVudCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgkvKiBfX2NwbHVzcGx1cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za3RpbWVyLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTQ2Mjk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za3RpbWVyLmMKQEAgLTAsMCArMSwyNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOglza3RpbWVyLmMKKyAqIFByb2plY3Q6CUdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcnMsIEV2ZW50IFNjaGVkdWxlciBNb2R1bGUKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4xNCAkCisgKiBEYXRlOgkkRGF0ZTogMjAwMy8wOS8xNiAxMzo0Njo1MSAkCisgKiBQdXJwb3NlOglIaWdoIGxldmVsIHRpbWVyIGZ1bmN0aW9ucy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0IEdtYkguCisgKgkoQylDb3B5cmlnaHQgMjAwMi0yMDAzIE1hcnZlbGwuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qCisgKglFdmVudCBxdWV1ZSBhbmQgZGlzcGF0Y2hlcgorICovCisjaWYgKGRlZmluZWQoREVCVUcpIHx8ICgoIWRlZmluZWQoTElOVCkpICYmICghZGVmaW5lZChTS19TTElNKSkpKQorc3RhdGljIGNvbnN0IGNoYXIgU3lzS29ubmVjdEZpbGVJZFtdID0KKwkiQCgjKSAkSWQ6IHNrdGltZXIuYyx2IDEuMTQgMjAwMy8wOS8xNiAxMzo0Njo1MSByc2NobWlkdCBFeHAgJCAoQykgTWFydmVsbC4iOworI2VuZGlmCisKKyNpbmNsdWRlICJoL3NrZHJ2MXN0LmgiCQkvKiBEcml2ZXIgU3BlY2lmaWMgRGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJoL3NrZHJ2Mm5kLmgiCQkvKiBBZGFwdGVyIENvbnRyb2wtIGFuZCBEcml2ZXIgc3BlY2lmaWMgRGVmLiAqLworCisjaWZkZWYgX19DMk1BTl9fCisvKgorCUV2ZW50IHF1ZXVlIG1hbmFnZW1lbnQuCisKKwlHZW5lcmFsIERlc2NyaXB0aW9uOgorCisgKi8KK2ludHJvKCkKK3t9CisjZW5kaWYKKworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCitzdGF0aWMgdm9pZCB0aW1lcl9kb25lKFNLX0FDICpwQUMsU0tfSU9DIElvYyxpbnQgUmVzdGFydCk7CisKKworLyoKKyAqIEluaXRzIHRoZSBzb2Z0d2FyZSB0aW1lcgorICoKKyAqIG5lZWRzIHRvIGJlIGNhbGxlZCBkdXJpbmcgSW5pdCBsZXZlbCAxLgorICovCit2b2lkCVNrVGltZXJJbml0KAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXJzIGNvbnRleHQgKi8KK1NLX0lPQwlJb2MsCQkvKiBJb0NvbnRleHQgKi8KK2ludAkJTGV2ZWwpCQkvKiBJbml0IExldmVsICovCit7CisJc3dpdGNoIChMZXZlbCkgeworCWNhc2UgU0tfSU5JVF9EQVRBOgorCQlwQUMtPlRpbS5TdFF1ZXVlID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBTS19JTklUX0lPOgorCQlTa0h3dEluaXQocEFDLCBJb2MpOworCQlTa1RpbWVyRG9uZShwQUMsIElvYyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIFN0b3BzIGEgaGlnaCBsZXZlbCB0aW1lcgorICogLSBJZiBhIHRpbWVyIGlzIG5vdCBpbiB0aGUgcXVldWUgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm9ybWFsbHksIHRvby4KKyAqLwordm9pZAlTa1RpbWVyU3RvcCgKK1NLX0FDCQkqcEFDLAkJLyogQWRhcHRlcnMgY29udGV4dCAqLworU0tfSU9DCQlJb2MsCQkvKiBJb0NvbnRleHQgKi8KK1NLX1RJTUVSCSpwVGltZXIpCS8qIFRpbWVyIFBvaW50ZXIgdG8gYmUgc3RhcnRlZCAqLworeworCVNLX1RJTUVSCSoqcHBUaW1QcmV2OworCVNLX1RJTUVSCSpwVG07CisKKwkvKgorCSAqIHJlbW92ZSB0aW1lciBmcm9tIHF1ZXVlCisJICovCisJcFRpbWVyLT5UbUFjdGl2ZSA9IFNLX0ZBTFNFOworCQorCWlmIChwQUMtPlRpbS5TdFF1ZXVlID09IHBUaW1lciAmJiAhcFRpbWVyLT5UbU5leHQpIHsKKwkJU2tId3RTdG9wKHBBQywgSW9jKTsKKwl9CisJCisJZm9yIChwcFRpbVByZXYgPSAmcEFDLT5UaW0uU3RRdWV1ZTsgKHBUbSA9ICpwcFRpbVByZXYpOworCQlwcFRpbVByZXYgPSAmcFRtLT5UbU5leHQgKSB7CisJCQorCQlpZiAocFRtID09IHBUaW1lcikgeworCQkJLyoKKwkJCSAqIFRpbWVyIGZvdW5kIGluIHF1ZXVlCisJCQkgKiAtIGRlcXVldWUgaXQgYW5kCisJCQkgKiAtIGNvcnJlY3QgZGVsdGEgb2YgdGhlIG5leHQgdGltZXIKKwkJCSAqLworCQkJKnBwVGltUHJldiA9IHBUbS0+VG1OZXh0OworCisJCQlpZiAocFRtLT5UbU5leHQpIHsKKwkJCQkvKiBjb3JyZWN0IGRlbHRhIG9mIG5leHQgdGltZXIgaW4gcXVldWUgKi8KKwkJCQlwVG0tPlRtTmV4dC0+VG1EZWx0YSArPSBwVG0tPlRtRGVsdGE7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKKy8qCisgKiBTdGFydCBhIGhpZ2ggbGV2ZWwgc29mdHdhcmUgdGltZXIKKyAqLwordm9pZAlTa1RpbWVyU3RhcnQoCitTS19BQwkJKnBBQywJCS8qIEFkYXB0ZXJzIGNvbnRleHQgKi8KK1NLX0lPQwkJSW9jLAkJLyogSW9Db250ZXh0ICovCitTS19USU1FUgkqcFRpbWVyLAkvKiBUaW1lciBQb2ludGVyIHRvIGJlIHN0YXJ0ZWQgKi8KK1NLX1UzMgkJVGltZSwJCS8qIFRpbWUgdmFsdWUgKi8KK1NLX1UzMgkJQ2xhc3MsCQkvKiBFdmVudCBDbGFzcyBmb3IgdGhpcyB0aW1lciAqLworU0tfVTMyCQlFdmVudCwJCS8qIEV2ZW50IFZhbHVlIGZvciB0aGlzIHRpbWVyICovCitTS19FVlBBUkEJUGFyYSkJCS8qIEV2ZW50IFBhcmFtZXRlciBmb3IgdGhpcyB0aW1lciAqLworeworCVNLX1RJTUVSCSoqcHBUaW1QcmV2OworCVNLX1RJTUVSCSpwVG07CisJU0tfVTMyCQlEZWx0YTsKKworCVRpbWUgLz0gMTY7CQkvKiBpbnB1dCBpcyB1UywgY2xvY2sgdGlja3MgYXJlIDE2dVMgKi8KKwkKKwlpZiAoIVRpbWUpCisJCVRpbWUgPSAxOworCisJU2tUaW1lclN0b3AocEFDLCBJb2MsIHBUaW1lcik7CisKKwlwVGltZXItPlRtQ2xhc3MgPSBDbGFzczsKKwlwVGltZXItPlRtRXZlbnQgPSBFdmVudDsKKwlwVGltZXItPlRtUGFyYSA9IFBhcmE7CisJcFRpbWVyLT5UbUFjdGl2ZSA9IFNLX1RSVUU7CisKKwlpZiAoIXBBQy0+VGltLlN0UXVldWUpIHsKKwkJLyogRmlyc3QgVGltZXIgdG8gYmUgc3RhcnRlZCAqLworCQlwQUMtPlRpbS5TdFF1ZXVlID0gcFRpbWVyOworCQlwVGltZXItPlRtTmV4dCA9IE5VTEw7CisJCXBUaW1lci0+VG1EZWx0YSA9IFRpbWU7CisJCQorCQlTa0h3dFN0YXJ0KHBBQywgSW9jLCBUaW1lKTsKKwkJCisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIHRpbWVyIGNvcnJlY3Rpb24KKwkgKi8KKwl0aW1lcl9kb25lKHBBQywgSW9jLCAwKTsKKworCS8qCisJICogZmluZCBwb3NpdGlvbiBpbiBxdWV1ZQorCSAqLworCURlbHRhID0gMDsKKwlmb3IgKHBwVGltUHJldiA9ICZwQUMtPlRpbS5TdFF1ZXVlOyAocFRtID0gKnBwVGltUHJldik7CisJCXBwVGltUHJldiA9ICZwVG0tPlRtTmV4dCApIHsKKwkJCisJCWlmIChEZWx0YSArIHBUbS0+VG1EZWx0YSA+IFRpbWUpIHsKKwkJCS8qIFBvc2l0aW9uIGZvdW5kICovCisJCQkvKiBIZXJlIHRoZSB0aW1lciBuZWVkcyB0byBiZSBpbnNlcnRlZC4gKi8KKwkJCWJyZWFrOworCQl9CisJCURlbHRhICs9IHBUbS0+VG1EZWx0YTsKKwl9CisKKwkvKiBpbnNlcnQgaW4gcXVldWUgKi8KKwkqcHBUaW1QcmV2ID0gcFRpbWVyOworCXBUaW1lci0+VG1OZXh0ID0gcFRtOworCXBUaW1lci0+VG1EZWx0YSA9IFRpbWUgLSBEZWx0YTsKKworCWlmIChwVG0pIHsKKwkJLyogVGhlcmUgaXMgYSBuZXh0IHRpbWVyCisJCSAqIC0+IGNvcnJlY3QgaXRzIERlbHRhIHZhbHVlLgorCQkgKi8KKwkJcFRtLT5UbURlbHRhIC09IHBUaW1lci0+VG1EZWx0YTsKKwl9CisKKwkvKiByZXN0YXJ0IHdpdGggZmlyc3QgKi8KKwlTa0h3dFN0YXJ0KHBBQywgSW9jLCBwQUMtPlRpbS5TdFF1ZXVlLT5UbURlbHRhKTsKK30KKworCit2b2lkCVNrVGltZXJEb25lKAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXJzIGNvbnRleHQgKi8KK1NLX0lPQwlJb2MpCQkvKiBJb0NvbnRleHQgKi8KK3sKKwl0aW1lcl9kb25lKHBBQywgSW9jLCAxKTsKK30KKworCitzdGF0aWMgdm9pZAl0aW1lcl9kb25lKAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXJzIGNvbnRleHQgKi8KK1NLX0lPQwlJb2MsCQkvKiBJb0NvbnRleHQgKi8KK2ludAkJUmVzdGFydCkJLyogRG8gd2UgbmVlZCB0byByZXN0YXJ0IHRoZSBIYXJkd2FyZSB0aW1lciA/ICovCit7CisJU0tfVTMyCQlEZWx0YTsKKwlTS19USU1FUgkqcFRtOworCVNLX1RJTUVSCSpwVENvbXA7CS8qIFRpbWVyIGNvbXBsZXRlZCBub3cgbm93ICovCisJU0tfVElNRVIJKipwcExhc3Q7CS8qIE5leHQgZmllbGQgb2YgTGFzdCB0aW1lciB0byBiZSBkZXEgKi8KKwlpbnQJCURvbmUgPSAwOworCisJRGVsdGEgPSBTa0h3dFJlYWQocEFDLCBJb2MpOworCQorCXBwTGFzdCA9ICZwQUMtPlRpbS5TdFF1ZXVlOworCXBUbSA9IHBBQy0+VGltLlN0UXVldWU7CisJd2hpbGUgKHBUbSAmJiAhRG9uZSkgeworCQlpZiAoRGVsdGEgPj0gcFRtLT5UbURlbHRhKSB7CisJCQkvKiBUaW1lciByYW4gb3V0ICovCisJCQlwVG0tPlRtQWN0aXZlID0gU0tfRkFMU0U7CisJCQlEZWx0YSAtPSBwVG0tPlRtRGVsdGE7CisJCQlwcExhc3QgPSAmcFRtLT5UbU5leHQ7CisJCQlwVG0gPSBwVG0tPlRtTmV4dDsKKwkJfQorCQllbHNlIHsKKwkJCS8qIFdlIGZvdW5kIHRoZSBmaXJzdCB0aW1lciB0aGF0IGRpZCBub3QgcnVuIG91dCAqLworCQkJcFRtLT5UbURlbHRhIC09IERlbHRhOworCQkJRGVsdGEgPSAwOworCQkJRG9uZSA9IDE7CisJCX0KKwl9CisJKnBwTGFzdCA9IE5VTEw7CisJLyoKKwkgKiBwVG0gcG9pbnRzIHRvIHRoZSBmaXJzdCBUaW1lciB0aGF0IGRpZCBub3QgcnVuIG91dC4KKwkgKiBTdFF1ZXVlIHBvaW50cyB0byB0aGUgZmlyc3QgVGltZXIgdGhhdCBydW4gb3V0LgorCSAqLworCisJZm9yICggcFRDb21wID0gcEFDLT5UaW0uU3RRdWV1ZTsgcFRDb21wOyBwVENvbXAgPSBwVENvbXAtPlRtTmV4dCkgeworCQlTa0V2ZW50UXVldWUocEFDLHBUQ29tcC0+VG1DbGFzcywgcFRDb21wLT5UbUV2ZW50LCBwVENvbXAtPlRtUGFyYSk7CisJfQorCisJLyogU2V0IGhlYWQgb2YgdGltZXIgcXVldWUgdG8gdGhlIGZpcnN0IHRpbWVyIHRoYXQgZGlkIG5vdCBydW4gb3V0ICovCisJcEFDLT5UaW0uU3RRdWV1ZSA9IHBUbTsKKworCWlmIChSZXN0YXJ0ICYmIHBBQy0+VGltLlN0UXVldWUpIHsKKwkJLyogUmVzdGFydCBIVyB0aW1lciAqLworCQlTa0h3dFN0YXJ0KHBBQywgSW9jLCBwQUMtPlRpbS5TdFF1ZXVlLT5UbURlbHRhKTsKKwl9Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL3NrdnBkLmMgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrdnBkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzYzg5ODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL3NrdnBkLmMKQEAgLTAsMCArMSwxMTk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZToJc2t2cGQuYworICogUHJvamVjdDoJR0VuZXNpcywgUENJIEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgorICogVmVyc2lvbjoJJFJldmlzaW9uOiAxLjM3ICQKKyAqIERhdGU6CSREYXRlOiAyMDAzLzAxLzEzIDEwOjQyOjQ1ICQKKyAqIFB1cnBvc2U6CVNoYXJlZCBzb2Z0d2FyZSB0byByZWFkIGFuZCB3cml0ZSBWUEQgZGF0YQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OC0yMDAzIFN5c0tvbm5lY3QgR21iSC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisJUGxlYXNlIHJlZmVyIHNrdnBkLnR4dCBmb3IgaW5mb21hdGlvbiBob3cgdG8gaW5jbHVkZSB0aGlzIG1vZHVsZQorICovCitzdGF0aWMgY29uc3QgY2hhciBTeXNLb25uZWN0RmlsZUlkW10gPQorCSJAKCMpJElkOiBza3ZwZC5jLHYgMS4zNyAyMDAzLzAxLzEzIDEwOjQyOjQ1IHJzY2htaWR0IEV4cCAkIChDKSBTSyI7CisKKyNpbmNsdWRlICJoL3NrZHJ2MXN0LmgiCisjaW5jbHVkZSAiaC9za3R5cGVzLmgiCisjaW5jbHVkZSAiaC9za2RlYnVnLmgiCisjaW5jbHVkZSAiaC9za2RydjJuZC5oIgorCisvKgorICogU3RhdGljIGZ1bmN0aW9ucworICovCisjaWZuZGVmIFNLX0tSX1BST1RPCitzdGF0aWMgU0tfVlBEX1BBUkEJKnZwZF9maW5kX3BhcmEoCisJU0tfQUMJKnBBQywKKwljb25zdCBjaGFyCSprZXksCisJU0tfVlBEX1BBUkEgKnApOworI2Vsc2UJLyogU0tfS1JfUFJPVE8gKi8KK3N0YXRpYyBTS19WUERfUEFSQQkqdnBkX2ZpbmRfcGFyYSgpOworI2VuZGlmCS8qIFNLX0tSX1BST1RPICovCisKKy8qCisgKiB3YWl0cyBmb3IgYSBjb21wbGV0aW9uIG9mIGEgVlBEIHRyYW5zZmVyCisgKiBUaGUgVlBEIHRyYW5zZmVyIG11c3QgY29tcGxldGUgd2l0aGluIFNLX1RJQ0tTX1BFUl9TRUMvMTYKKyAqCisgKiByZXR1cm5zCTA6CXN1Y2Nlc3MsIHRyYW5zZmVyIGNvbXBsZXRlcworICoJCWVycm9yCWV4aXQoOSkgd2l0aCBhIGVycm9yIG1lc3NhZ2UKKyAqLworc3RhdGljIGludCBWcGRXYWl0KAorU0tfQUMJKnBBQywJLyogQWRhcHRlcnMgY29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSU8gQ29udGV4dCAqLworaW50CQlldmVudCkJLyogZXZlbnQgdG8gd2FpdCBmb3IgKFZQRF9SRUFEIC8gVlBEX3dyaXRlKSBjb21wbGV0aW9uKi8KK3sKKwlTS19VNjQJc3RhcnRfdGltZTsKKwlTS19VMTYJc3RhdGU7CisKKwlTS19EQkdfTVNHKHBBQyxTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJWUEQgd2FpdCBmb3IgJXNcbiIsIGV2ZW50PyJXcml0ZSI6IlJlYWQiKSk7CisJc3RhcnRfdGltZSA9IFNrT3NHZXRUaW1lKHBBQyk7CisJZG8geworCQlpZiAoU2tPc0dldFRpbWUocEFDKSAtIHN0YXJ0X3RpbWUgPiBTS19USUNLU19QRVJfU0VDKSB7CisKKwkJCS8qIEJ1ZyBmaXggQUY6IFRodSBNYXIgMjggMjAwMgorCQkJICogRG8gbm90IGNhbGw6IFZQRF9TVE9QKHBBQywgSW9DKTsKKwkJCSAqIEEgcGVuZGluZyBWUEQgcmVhZCBjeWNsZSBjYW4gbm90IGJlIGFib3J0ZWQgYnkgd3JpdGluZworCQkJICogVlBEX1dSSVRFIHRvIHRoZSBQQ0lfVlBEX0FEUl9SRUcgKFZQRCBhZGRyZXNzIHJlZ2lzdGVyKS4KKwkJCSAqIEFsdGhvdWdoIHRoZSB3cml0ZSB0aHJlc2hvbGQgaW4gdGhlIE9VUi1yZWdpc3RlciBwcm90ZWN0cworCQkJICogVlBEIHJlYWQgb25seSBzcGFjZSBmcm9tIGJlaW5nIG92ZXJ3cml0dGVuIHRoaXMgZG9lcyBub3QKKwkJCSAqIHByb3RlY3QgYSBWUEQgcmVhZCBmcm9tIGJlaW5nIGBjb252ZXJ0ZWRgIGludG8gYSBWUEQgd3JpdGUKKwkJCSAqIG9wZXJhdGlvbiAob24gdGhlIGZseSkuIEFzIGEgY29uc2VxdWVuY2UgdGhlIFZQRF9TVE9QIHdvdWxkCisJCQkgKiBkZWxldGUgVlBEIHJlYWQgb25seSBkYXRhLiBJbiBjYXNlIG9mIGFueSBwcm9ibGVtcyB3aXRoIHRoZQorCQkJICogSTJDIGJ1cyB3ZSBleGl0IHRoZSBsb29wIGhlcmUuIFRoZSBJMkMgcmVhZCBvcGVyYXRpb24gY2FuCisJCQkgKiBub3QgYmUgYWJvcnRlZCBleGNlcHQgYnkgYSByZXNldCAoLT5MUikuCisJCQkgKi8KKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRkFUQUwgfCBTS19EQkdDQVRfRVJSLAorCQkJCSgiRVJST1I6VlBEIHdhaXQgdGltZW91dFxuIikpOworCQkJcmV0dXJuKDEpOworCQl9CisJCQorCQlWUERfSU4xNihwQUMsIElvQywgUENJX1ZQRF9BRFJfUkVHLCAmc3RhdGUpOworCQkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJzdGF0ZSA9ICV4LCBldmVudCAleFxuIixzdGF0ZSxldmVudCkpOworCX0gd2hpbGUoKGludCkoc3RhdGUgJiBQQ0lfVlBEX0ZMQUcpID09IGV2ZW50KTsKKworCXJldHVybigwKTsKK30KKworI2lmZGVmIFNLRElBRworCisvKgorICogUmVhZCB0aGUgZHdvcmQgYXQgYWRkcmVzcyAnYWRkcicgZnJvbSB0aGUgVlBEIEVFUFJPTS4KKyAqCisgKiBOZWVkZWQgVGltZToJTUlOIDEsMyBtcwlNQVggMiw2IG1zCisgKgorICogTm90ZTogVGhlIERXb3JkIGlzIHJldHVybmVkIGluIHRoZSBlbmRpYW5lc3Mgb2YgdGhlIG1hY2hpbmUgdGhlIHJvdXRpbmUKKyAqICAgICAgIGlzIHJ1bm5pbmcgb24uCisgKgorICogUmV0dXJucyB0aGUgZGF0YSByZWFkLgorICovCitTS19VMzIgVnBkUmVhZERXb3JkKAorU0tfQUMJKnBBQywJLyogQWRhcHRlcnMgY29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSU8gQ29udGV4dCAqLworaW50CQlhZGRyKQkvKiBWUEQgYWRkcmVzcyAqLworeworCVNLX1UzMglSdHY7CisKKwkvKiBzdGFydCBWUEQgcmVhZCAqLworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJWUEQgcmVhZCBkd29yZCBhdCAweCV4XG4iLGFkZHIpKTsKKwlhZGRyICY9IH5WUERfV1JJVEU7CQkvKiBlbnN1cmUgdGhlIFIvVyBiaXQgaXMgc2V0IHRvIHJlYWQgKi8KKworCVZQRF9PVVQxNihwQUMsIElvQywgUENJX1ZQRF9BRFJfUkVHLCAoU0tfVTE2KWFkZHIpOworCisJLyogaWdub3JlIHJldHVybiBjb2RlIGhlcmUgKi8KKwkodm9pZClWcGRXYWl0KHBBQywgSW9DLCBWUERfUkVBRCk7CisKKwkvKiBEb24ndCBzd2FwIGhlcmUsIGl0J3MgYSBkYXRhIHN0cmVhbSBvZiBieXRlcyAqLworCVJ0diA9IDA7CisKKwlWUERfSU4zMihwQUMsIElvQywgUENJX1ZQRF9EQVRfUkVHLCAmUnR2KTsKKwkKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiVlBEIHJlYWQgZHdvcmQgZGF0YSA9IDB4JXhcbiIsUnR2KSk7CisJcmV0dXJuKFJ0dik7Cit9CisKKyNlbmRpZgkvKiBTS0RJQUcgKi8KKworI2lmIDAKKworLyoKKwlXcml0ZSB0aGUgZHdvcmQgJ2RhdGEnIGF0IGFkZHJlc3MgJ2FkZHInIGludG8gdGhlIFZQRCBFRVBST00sIGFuZAorCXZlcmlmeSB0aGF0IHRoZSBkYXRhIGlzIHdyaXR0ZW4uCisKKyBOZWVkZWQgVGltZToKKworLgkJCQlNSU4JCU1BWAorLiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisuIHdyaXRlCQkJCTEuOCBtcwkJMy42IG1zCisuIGludGVybmFsIHdyaXRlIGN5bGVzCQkwLjcgbXMJCTcuMCBtcworLiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisuIG92ZXIgYWxsIHByb2dyYW0gdGltZQkgCTIuNSBtcwkJMTAuNiBtcworLiByZWFkCQkJCTEuMyBtcwkJMi42IG1zCisuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy4gb3ZlciBhbGwgCQkJMy44IG1zCQkxMy4yIG1zCisuCisKKworIFJldHVybnMJMDoJc3VjY2VzcworCQkJMToJZXJyb3IsCUkyQyB0cmFuc2ZlciBkb2VzIG5vdCB0ZXJtaW5hdGUKKwkJCTI6CWVycm9yLAlkYXRhIHZlcmlmeSBlcnJvcgorCisgKi8KK3N0YXRpYyBpbnQgVnBkV3JpdGVEV29yZCgKK1NLX0FDCSpwQUMsCS8qIHBBQyBwb2ludGVyICovCitTS19JT0MJSW9DLAkvKiBJTyBDb250ZXh0ICovCitpbnQJCWFkZHIsCS8qIFZQRCBhZGRyZXNzICovCitTS19VMzIJZGF0YSkJLyogVlBEIGRhdGEgdG8gd3JpdGUgKi8KK3sKKwkvKiBzdGFydCBWUEQgd3JpdGUgKi8KKwkvKiBEb24ndCBzd2FwIGhlcmUsIGl0J3MgYSBkYXRhIHN0cmVhbSBvZiBieXRlcyAqLworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJWUEQgd3JpdGUgZHdvcmQgYXQgYWRkciAweCV4LCBkYXRhID0gMHgleFxuIixhZGRyLGRhdGEpKTsKKwlWUERfT1VUMzIocEFDLCBJb0MsIFBDSV9WUERfREFUX1JFRywgKFNLX1UzMilkYXRhKTsKKwkvKiBCdXQgZG8gaXQgaGVyZSAqLworCWFkZHIgfD0gVlBEX1dSSVRFOworCisJVlBEX09VVDE2KHBBQywgSW9DLCBQQ0lfVlBEX0FEUl9SRUcsIChTS19VMTYpKGFkZHIgfCBWUERfV1JJVEUpKTsKKworCS8qIHRoaXMgbWF5IHRha2UgdXAgdG8gMTAsNiBtcyAqLworCWlmIChWcGRXYWl0KHBBQywgSW9DLCBWUERfV1JJVEUpKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSLAorCQkJKCJXcml0ZSBUaW1lZCBPdXRcbiIpKTsKKwkJcmV0dXJuKDEpOworCX07CisKKwkvKiB2ZXJpZnkgZGF0YSAqLworCWlmIChWcGRSZWFkRFdvcmQocEFDLCBJb0MsIGFkZHIpICE9IGRhdGEpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9FUlIgfCBTS19EQkdDQVRfRkFUQUwsCisJCQkoIkRhdGEgVmVyaWZ5IEVycm9yXG4iKSk7CisJCXJldHVybigyKTsKKwl9CisJcmV0dXJuKDApOworfQkvKiBWcGRXcml0ZURXb3JkICovCisKKyNlbmRpZgkvKiAwICovCisKKy8qCisgKglSZWFkIG9uZSBTdHJlYW0gb2YgJ2xlbicgYnl0ZXMgb2YgVlBEIGRhdGEsIHN0YXJ0aW5nIGF0ICdhZGRyJyBmcm9tCisgKglvciB0byB0aGUgSTJDIEVFUFJPTS4KKyAqCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkIC8gd3JpdHRlbi4KKyAqLworc3RhdGljIGludCBWcGRXcml0ZVN0cmVhbSgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXJzIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIElPIENvbnRleHQgKi8KK2NoYXIJKmJ1ZiwJLyogZGF0YSBidWZmZXIgKi8KK2ludAkJQWRkciwJLyogVlBEIHN0YXJ0IGFkZHJlc3MgKi8KK2ludAkJTGVuKQkvKiBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCAvIHRvIHdyaXRlICovCit7CisJaW50CQlpOworCWludAkJajsKKwlTS19VMTYJQWRyUmVnOworCWludAkJUnR2OworCVNLX1U4CSogcENvbXA7CS8qIENvbXBhcmUgcG9pbnRlciAqLworCVNLX1U4CURhdGE7CQkvKiBJbnB1dCBEYXRhIGZvciBDb21wYXJlICovCisKKwkvKiBJbml0IENvbXBhcmUgUG9pbnRlciAqLworCXBDb21wID0gKFNLX1U4ICopIGJ1ZjsKKworCWZvciAoaSA9IDA7IGkgPCBMZW47IGkrKywgYnVmKyspIHsKKwkJaWYgKChpJXNpemVvZihTS19VMzIpKSA9PSAwKSB7CisJCQkvKgorCQkJICogQXQgdGhlIGJlZ2luIG9mIGVhY2ggY3ljbGUgcmVhZCB0aGUgRGF0YSBSZWcKKwkJCSAqIFNvIGl0IGlzIGluaXRpYWxpemVkIGV2ZW4gaWYgb25seSBhIGZldyBieXRlcworCQkJICogYXJlIHdyaXR0ZW4uCisJCQkgKi8KKwkJCUFkclJlZyA9IChTS19VMTYpIEFkZHI7CisJCQlBZHJSZWcgJj0gflZQRF9XUklURTsJLyogUkVBRCBvcGVyYXRpb24gKi8KKworCQkJVlBEX09VVDE2KHBBQywgSW9DLCBQQ0lfVlBEX0FEUl9SRUcsIEFkclJlZyk7CisKKwkJCS8qIFdhaXQgZm9yIHRlcm1pbmF0aW9uICovCisJCQlSdHYgPSBWcGRXYWl0KHBBQywgSW9DLCBWUERfUkVBRCk7CisJCQlpZiAoUnR2ICE9IDApIHsKKwkJCQlyZXR1cm4oaSk7CisJCQl9CisJCX0KKworCQkvKiBXcml0ZSBjdXJyZW50IEJ5dGUgKi8KKwkJVlBEX09VVDgocEFDLCBJb0MsIFBDSV9WUERfREFUX1JFRyArIChpJXNpemVvZihTS19VMzIpKSwKKwkJCQkqKFNLX1U4KilidWYpOworCisJCWlmICgoKGklc2l6ZW9mKFNLX1UzMikpID09IDMpIHx8IChpID09IChMZW4gLSAxKSkpIHsKKwkJCS8qIE5ldyBBZGRyZXNzIG5lZWRzIHRvIGJlIHdyaXR0ZW4gdG8gVlBEX0FERFIgcmVnICovCisJCQlBZHJSZWcgPSAoU0tfVTE2KSBBZGRyOworCQkJQWRkciArPSBzaXplb2YoU0tfVTMyKTsKKwkJCUFkclJlZyB8PSBWUERfV1JJVEU7CS8qIFdSSVRFIG9wZXJhdGlvbiAqLworCisJCQlWUERfT1VUMTYocEFDLCBJb0MsIFBDSV9WUERfQURSX1JFRywgQWRyUmVnKTsKKworCQkJLyogV2FpdCBmb3IgdGVybWluYXRpb24gKi8KKwkJCVJ0diA9IFZwZFdhaXQocEFDLCBJb0MsIFZQRF9XUklURSk7CisJCQlpZiAoUnR2ICE9IDApIHsKKwkJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0VSUiwKKwkJCQkJKCJXcml0ZSBUaW1lZCBPdXRcbiIpKTsKKwkJCQlyZXR1cm4oaSAtIChpJXNpemVvZihTS19VMzIpKSk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBOb3cgcmUtcmVhZCB0byB2ZXJpZnkKKwkJCSAqLworCQkJQWRyUmVnICY9IH5WUERfV1JJVEU7CS8qIFJFQUQgb3BlcmF0aW9uICovCisKKwkJCVZQRF9PVVQxNihwQUMsIElvQywgUENJX1ZQRF9BRFJfUkVHLCBBZHJSZWcpOworCisJCQkvKiBXYWl0IGZvciB0ZXJtaW5hdGlvbiAqLworCQkJUnR2ID0gVnBkV2FpdChwQUMsIElvQywgVlBEX1JFQUQpOworCQkJaWYgKFJ0diAhPSAwKSB7CisJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9FUlIsCisJCQkJCSgiVmVyaWZ5IFRpbWVkIE91dFxuIikpOworCQkJCXJldHVybihpIC0gKGklc2l6ZW9mKFNLX1UzMikpKTsKKwkJCX0KKworCQkJZm9yIChqID0gMDsgaiA8PSAoaW50KShpJXNpemVvZihTS19VMzIpKTsgaisrLCBwQ29tcCsrKSB7CisJCQkJCisJCQkJVlBEX0lOOChwQUMsIElvQywgUENJX1ZQRF9EQVRfUkVHICsgaiwgJkRhdGEpOworCQkJCQorCQkJCWlmIChEYXRhICE9ICpwQ29tcCkgeworCQkJCQkvKiBWZXJpZnkgRXJyb3IgKi8KKwkJCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9FUlIsCisJCQkJCQkoIldyaXRlU3RyZWFtIFZlcmlmeSBFcnJvclxuIikpOworCQkJCQlyZXR1cm4oaSAtIChpJXNpemVvZihTS19VMzIpKSArIGopOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybihMZW4pOworfQorCQorCisvKgorICoJUmVhZCBvbmUgU3RyZWFtIG9mICdsZW4nIGJ5dGVzIG9mIFZQRCBkYXRhLCBzdGFydGluZyBhdCAnYWRkcicgZnJvbQorICoJb3IgdG8gdGhlIEkyQyBFRVBST00uCisgKgorICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVhZCAvIHdyaXR0ZW4uCisgKi8KK3N0YXRpYyBpbnQgVnBkUmVhZFN0cmVhbSgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXJzIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIElPIENvbnRleHQgKi8KK2NoYXIJKmJ1ZiwJLyogZGF0YSBidWZmZXIgKi8KK2ludAkJQWRkciwJLyogVlBEIHN0YXJ0IGFkZHJlc3MgKi8KK2ludAkJTGVuKQkvKiBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCAvIHRvIHdyaXRlICovCit7CisJaW50CQlpOworCVNLX1UxNglBZHJSZWc7CisJaW50CQlSdHY7CisKKwlmb3IgKGkgPSAwOyBpIDwgTGVuOyBpKyssIGJ1ZisrKSB7CisJCWlmICgoaSVzaXplb2YoU0tfVTMyKSkgPT0gMCkgeworCQkJLyogTmV3IEFkZHJlc3MgbmVlZHMgdG8gYmUgd3JpdHRlbiB0byBWUERfQUREUiByZWcgKi8KKwkJCUFkclJlZyA9IChTS19VMTYpIEFkZHI7CisJCQlBZGRyICs9IHNpemVvZihTS19VMzIpOworCQkJQWRyUmVnICY9IH5WUERfV1JJVEU7CS8qIFJFQUQgb3BlcmF0aW9uICovCisKKwkJCVZQRF9PVVQxNihwQUMsIElvQywgUENJX1ZQRF9BRFJfUkVHLCBBZHJSZWcpOworCisJCQkvKiBXYWl0IGZvciB0ZXJtaW5hdGlvbiAqLworCQkJUnR2ID0gVnBkV2FpdChwQUMsIElvQywgVlBEX1JFQUQpOworCQkJaWYgKFJ0diAhPSAwKSB7CisJCQkJcmV0dXJuKGkpOworCQkJfQorCQl9CisJCVZQRF9JTjgocEFDLCBJb0MsIFBDSV9WUERfREFUX1JFRyArIChpJXNpemVvZihTS19VMzIpKSwKKwkJCShTS19VOCAqKWJ1Zik7CisJfQorCisJcmV0dXJuKExlbik7Cit9CisKKy8qCisgKglSZWFkIG9yZSB3cml0ZXMgJ2xlbicgYnl0ZXMgb2YgVlBEIGRhdGEsIHN0YXJ0aW5nIGF0ICdhZGRyJyBmcm9tCisgKglvciB0byB0aGUgSTJDIEVFUFJPTS4KKyAqCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkIC8gd3JpdHRlbi4KKyAqLworc3RhdGljIGludCBWcGRUcmFuc2ZlckJsb2NrKAorU0tfQUMJKnBBQywJLyogQWRhcHRlcnMgY29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSU8gQ29udGV4dCAqLworY2hhcgkqYnVmLAkvKiBkYXRhIGJ1ZmZlciAqLworaW50CQlhZGRyLAkvKiBWUEQgc3RhcnQgYWRkcmVzcyAqLworaW50CQlsZW4sCS8qIG51bWJlciBvZiBieXRlcyB0byByZWFkIC8gdG8gd3JpdGUgKi8KK2ludAkJZGlyKQkvKiB0cmFuc2ZlciBkaXJlY3Rpb24gbWF5IGJlIFZQRF9SRUFEIG9yIFZQRF9XUklURSAqLworeworCWludAkJUnR2OwkvKiBSZXR1cm4gdmFsdWUgKi8KKwlpbnQJCXZwZF9yb21fc2l6ZTsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJWUEQgJXMgYmxvY2ssIGFkZHIgPSAweCV4LCBsZW4gPSAlZFxuIiwKKwkJZGlyID8gIndyaXRlIiA6ICJyZWFkIiwgYWRkciwgbGVuKSk7CisKKwlpZiAobGVuID09IDApCisJCXJldHVybigwKTsKKworCXZwZF9yb21fc2l6ZSA9IHBBQy0+dnBkLnJvbV9zaXplOworCQorCWlmIChhZGRyID4gdnBkX3JvbV9zaXplIC0gNCkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0VSUiB8IFNLX0RCR0NBVF9GQVRBTCwKKwkJCSgiQWRkcmVzcyBlcnJvcjogMHgleCwgZXhwLiA8IDB4JXhcbiIsCisJCQlhZGRyLCB2cGRfcm9tX3NpemUgLSA0KSk7CisJCXJldHVybigwKTsKKwl9CisJCisJaWYgKGFkZHIgKyBsZW4gPiB2cGRfcm9tX3NpemUpIHsKKwkJbGVuID0gdnBkX3JvbV9zaXplIC0gYWRkcjsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9FUlIsCisJCQkoIldhcm5pbmc6IGxlbiB3YXMgY3V0IHRvICVkXG4iLCBsZW4pKTsKKwl9CisKKwlpZiAoZGlyID09IFZQRF9SRUFEKSB7CisJCVJ0diA9IFZwZFJlYWRTdHJlYW0ocEFDLCBJb0MsIGJ1ZiwgYWRkciwgbGVuKTsKKwl9CisJZWxzZSB7CisJCVJ0diA9IFZwZFdyaXRlU3RyZWFtKHBBQywgSW9DLCBidWYsIGFkZHIsIGxlbik7CisJfQorCisJcmV0dXJuKFJ0dik7Cit9CisKKyNpZmRlZiBTS0RJQUcKKworLyoKKyAqCVJlYWQgJ2xlbicgYnl0ZXMgb2YgVlBEIGRhdGEsIHN0YXJ0aW5nIGF0ICdhZGRyJy4KKyAqCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkLgorICovCitpbnQgVnBkUmVhZEJsb2NrKAorU0tfQUMJKnBBQywJLyogcEFDIHBvaW50ZXIgKi8KK1NLX0lPQwlJb0MsCS8qIElPIENvbnRleHQgKi8KK2NoYXIJKmJ1ZiwJLyogYnVmZmVyIHdlcmUgdGhlIGRhdGEgc2hvdWxkIGJlIHN0b3JlZCAqLworaW50CQlhZGRyLAkvKiBzdGFydCByZWFkaW5nIGF0IHRoZSBWUEQgYWRkcmVzcyAqLworaW50CQlsZW4pCS8qIG51bWJlciBvZiBieXRlcyB0byByZWFkICovCit7CisJcmV0dXJuKFZwZFRyYW5zZmVyQmxvY2socEFDLCBJb0MsIGJ1ZiwgYWRkciwgbGVuLCBWUERfUkVBRCkpOworfQorCisvKgorICoJV3JpdGUgJ2xlbicgYnl0ZXMgb2YgKmJ1dCB0byB0aGUgVlBEIEVFUFJPTSwgc3RhcnRpbmcgYXQgJ2FkZHInLgorICoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHdyaXRlcy4KKyAqLworaW50IFZwZFdyaXRlQmxvY2soCitTS19BQwkqcEFDLAkvKiBwQUMgcG9pbnRlciAqLworU0tfSU9DCUlvQywJLyogSU8gQ29udGV4dCAqLworY2hhcgkqYnVmLAkvKiBidWZmZXIsIGhvbGRzIHRoZSBkYXRhIHRvIHdyaXRlICovCitpbnQJCWFkZHIsCS8qIHN0YXJ0IHdyaXRpbmcgYXQgdGhlIFZQRCBhZGRyZXNzICovCitpbnQJCWxlbikJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlICovCit7CisJcmV0dXJuKFZwZFRyYW5zZmVyQmxvY2socEFDLCBJb0MsIGJ1ZiwgYWRkciwgbGVuLCBWUERfV1JJVEUpKTsKK30KKyNlbmRpZgkvKiBTS0RJQUcgKi8KKworLyoKKyAqIChyZSlpbml0aWFsaXplIHRoZSBWUEQgYnVmZmVyCisgKgorICogUmVhZHMgdGhlIFZQRCBkYXRhIGZyb20gdGhlIEVFUFJPTSBpbnRvIHRoZSBWUEQgYnVmZmVyLgorICogR2V0IHRoZSByZW1haW5pbmcgcmVhZCBvbmx5IGFuZCByZWFkIC8gd3JpdGUgc3BhY2UuCisgKgorICogcmV0dXJuCTA6CXN1Y2Nlc3MKKyAqCQkxOglmYXRhbCBWUEQgZXJyb3IKKyAqLworc3RhdGljIGludCBWcGRJbml0KAorU0tfQUMJKnBBQywJLyogQWRhcHRlcnMgY29udGV4dCAqLworU0tfSU9DCUlvQykJLyogSU8gQ29udGV4dCAqLworeworCVNLX1ZQRF9QQVJBICpyLCBycDsJLyogUlcgb3IgUlYgKi8KKwlpbnQJCWk7CisJdW5zaWduZWQgY2hhcgl4OworCWludAkJdnBkX3NpemU7CisJU0tfVTE2CWRldl9pZDsKKwlTS19VMzIJb3VyX3JlZzI7CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0lOSVQsICgiVnBkSW5pdCAuLiAiKSk7CisJCisJVlBEX0lOMTYocEFDLCBJb0MsIFBDSV9ERVZJQ0VfSUQsICZkZXZfaWQpOworCQorCVZQRF9JTjMyKHBBQywgSW9DLCBQQ0lfT1VSX1JFR18yLCAmb3VyX3JlZzIpOworCQorCXBBQy0+dnBkLnJvbV9zaXplID0gMjU2IDw8ICgob3VyX3JlZzIgJiBQQ0lfVlBEX1JPTV9TWikgPj4gMTQpOworCQorCS8qCisJICogdGhpcyBmdW5jdGlvbiBtaWdodCBnZXQgdXNlZCBiZWZvcmUgdGhlIGhhcmR3YXJlIGlzIGluaXRpYWxpemVkCisJICogdGhlcmVmb3JlIHdlIGNhbm5vdCBhbHdheXMgdHJ1c3QgaW4gR0lDaGlwSWQKKwkgKi8KKwlpZiAoKChwQUMtPnZwZC52LnZwZF9zdGF0dXMgJiBWUERfVkFMSUQpID09IDAgJiYKKwkJZGV2X2lkICE9IFZQRF9ERVZfSURfR0VORVNJUykgfHwKKwkJKChwQUMtPnZwZC52LnZwZF9zdGF0dXMgJiBWUERfVkFMSUQpICE9IDAgJiYKKwkJIXBBQy0+R0luaS5HSUdlbmVzaXMpKSB7CisKKwkJLyogZm9yIFl1a29uIHRoZSBWUEQgc2l6ZSBpcyBhbHdheXMgMjU2ICovCisJCXZwZF9zaXplID0gVlBEX1NJWkVfWVVLT047CisJfQorCWVsc2UgeworCQkvKiBHZW5lc2lzIHVzZXMgdGhlIG1heGltdW0gUk9NIHNpemUgdXAgdG8gNTEyIGZvciBWUEQgKi8KKwkJaWYgKHBBQy0+dnBkLnJvbV9zaXplID4gVlBEX1NJWkVfR0VORVNJUykgeworCQkJdnBkX3NpemUgPSBWUERfU0laRV9HRU5FU0lTOworCQl9CisJCWVsc2UgeworCQkJdnBkX3NpemUgPSBwQUMtPnZwZC5yb21fc2l6ZTsKKwkJfQorCX0KKworCS8qIHJlYWQgdGhlIFZQRCBkYXRhIGludG8gdGhlIFZQRCBidWZmZXIgKi8KKwlpZiAoVnBkVHJhbnNmZXJCbG9jayhwQUMsIElvQywgcEFDLT52cGQudnBkX2J1ZiwgMCwgdnBkX3NpemUsIFZQRF9SRUFEKQorCQkhPSB2cGRfc2l6ZSkgeworCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSLAorCQkJKCJCbG9jayBSZWFkIEVycm9yXG4iKSk7CisJCXJldHVybigxKTsKKwl9CisJCisJcEFDLT52cGQudnBkX3NpemUgPSB2cGRfc2l6ZTsKKworCS8qIEFzdXMgSzhWIFNlIERlbHV4ZSBidWdmaXguIENvcnJlY3QgVlBEIGNvbnRlbnQgKi8KKwkvKiBNQm8gQXByaWwgMjAwNCAqLworCWlmICgoKHVuc2lnbmVkIGNoYXIpcEFDLT52cGQudnBkX2J1ZlsweDNmXSA9PSAweDM4KSAmJgorCSAgICAoKHVuc2lnbmVkIGNoYXIpcEFDLT52cGQudnBkX2J1ZlsweDQwXSA9PSAweDNjKSAmJgorCSAgICAoKHVuc2lnbmVkIGNoYXIpcEFDLT52cGQudnBkX2J1ZlsweDQxXSA9PSAweDQ1KSkgeworCQlwcmludGsoInNrOThsaW46IEFzdXMgbWFpbmJvYXJkIHdpdGggYnVnZ3kgVlBEPyAiCisJCQkJIkNvcnJlY3RpbmcgZGF0YS5cbiIpOworCQlwQUMtPnZwZC52cGRfYnVmWzB4NDBdID0gMHgzODsKKwl9CisKKworCS8qIGZpbmQgdGhlIGVuZCB0YWcgb2YgdGhlIFJPIGFyZWEgKi8KKwlpZiAoIShyID0gdnBkX2ZpbmRfcGFyYShwQUMsIFZQRF9SViwgJnJwKSkpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9FUlIgfCBTS19EQkdDQVRfRkFUQUwsCisJCQkoIkVuY29kaW5nIEVycm9yOiBSViBUYWcgbm90IGZvdW5kXG4iKSk7CisJCXJldHVybigxKTsKKwl9CisJCisJaWYgKHItPnBfdmFsICsgci0+cF9sZW4gPiBwQUMtPnZwZC52cGRfYnVmICsgdnBkX3NpemUvMikgeworCQlTS19EQkdfTVNHKHBBQyxTS19EQkdNT0RfVlBELFNLX0RCR0NBVF9FUlIgfCBTS19EQkdDQVRfRkFUQUwsCisJCQkoIkVuY29kaW5nIEVycm9yOiBJbnZhbGlkIFZQRCBzdHJ1Y3Qgc2l6ZVxuIikpOworCQlyZXR1cm4oMSk7CisJfQorCXBBQy0+dnBkLnYudnBkX2ZyZWVfcm8gPSByLT5wX2xlbiAtIDE7CisKKwkvKiB0ZXN0IHRoZSBjaGVja3N1bSAqLworCWZvciAoaSA9IDAsIHggPSAwOyAodW5zaWduZWQpaSA8PSAodW5zaWduZWQpdnBkX3NpemUvMiAtIHItPnBfbGVuOyBpKyspIHsKKwkJeCArPSBwQUMtPnZwZC52cGRfYnVmW2ldOworCX0KKwkKKwlpZiAoeCAhPSAwKSB7CisJCS8qIGNoZWNrc3VtIGVycm9yICovCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSIHwgU0tfREJHQ0FUX0ZBVEFMLAorCQkJKCJWUEQgQ2hlY2tzdW0gRXJyb3JcbiIpKTsKKwkJcmV0dXJuKDEpOworCX0KKworCS8qIGZpbmQgYW5kIGNoZWNrIHRoZSBlbmQgdGFnIG9mIHRoZSBSVyBhcmVhICovCisJaWYgKCEociA9IHZwZF9maW5kX3BhcmEocEFDLCBWUERfUlcsICZycCkpKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSIHwgU0tfREJHQ0FUX0ZBVEFMLAorCQkJKCJFbmNvZGluZyBFcnJvcjogUlYgVGFnIG5vdCBmb3VuZFxuIikpOworCQlyZXR1cm4oMSk7CisJfQorCQorCWlmIChyLT5wX3ZhbCA8IHBBQy0+dnBkLnZwZF9idWYgKyB2cGRfc2l6ZS8yKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSIHwgU0tfREJHQ0FUX0ZBVEFMLAorCQkJKCJFbmNvZGluZyBFcnJvcjogSW52YWxpZCBWUEQgc3RydWN0IHNpemVcbiIpKTsKKwkJcmV0dXJuKDEpOworCX0KKwlwQUMtPnZwZC52LnZwZF9mcmVlX3J3ID0gci0+cF9sZW47CisKKwkvKiBldmVyeXRoaW5nIHNlZW1zIHRvIGJlIG9rICovCisJaWYgKHBBQy0+R0luaS5HSUNoaXBJZCAhPSAwKSB7CisJCXBBQy0+dnBkLnYudnBkX3N0YXR1cyB8PSBWUERfVkFMSUQ7CisJfQorCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9JTklULAorCQkoImRvbmUuIEZyZWUgUk8gPSAlZCwgRnJlZSBSVyA9ICVkXG4iLAorCQlwQUMtPnZwZC52LnZwZF9mcmVlX3JvLCBwQUMtPnZwZC52LnZwZF9mcmVlX3J3KSk7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKglmaW5kIHRoZSBLZXl3b3JkICdrZXknIGluIHRoZSBWUEQgYnVmZmVyIGFuZCBmaWxscyB0aGUKKyAqCXBhcmFtZXRlciBzdHJ1Y3QgJ3AnIHdpdGggaXQncyB2YWx1ZXMKKyAqCisgKiByZXR1cm5zCSpwCXN1Y2Nlc3MKKyAqCQkwOglwYXJhbWV0ZXIgd2FzIG5vdCBmb3VuZCBvciBWUEQgZW5jb2RpbmcgZXJyb3IKKyAqLworc3RhdGljIFNLX1ZQRF9QQVJBICp2cGRfZmluZF9wYXJhKAorU0tfQUMJCSpwQUMsCS8qIGNvbW1vbiBkYXRhIGJhc2UgKi8KK2NvbnN0IGNoYXIJKmtleSwJLyoga2V5d29yZCB0byBmaW5kIChlLmcuICJNTiIpICovCitTS19WUERfUEFSQSAqcCkJCS8qIHBhcmFtZXRlciBkZXNjcmlwdGlvbiBzdHJ1Y3QgKi8KK3sKKwljaGFyICp2CTsJLyogcG9pbnRzIHRvIFZQRCBidWZmZXIgKi8KKwlpbnQgbWF4OwkvKiBNYXhpbXVtIE51bWJlciBvZiBJdGVyYXRpb25zICovCisKKwl2ID0gcEFDLT52cGQudnBkX2J1ZjsKKwltYXggPSAxMjg7CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiVlBEIGZpbmQgcGFyYSAlcyAuLiAiLGtleSkpOworCisJLyogY2hlY2sgbWFuZGF0b3J5IHJlc291cmNlIHR5cGUgSUQgc3RyaW5nIChQcm9kdWN0IE5hbWUpICovCisJaWYgKCp2ICE9IChjaGFyKVJFU19JRCkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0VSUiB8IFNLX0RCR0NBVF9GQVRBTCwKKwkJCSgiRXJyb3I6IDB4JXggbWlzc2luZ1xuIiwgUkVTX0lEKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChzdHJjbXAoa2V5LCBWUERfTkFNRSkgPT0gMCkgeworCQlwLT5wX2xlbiA9IFZQRF9HRVRfUkVTX0xFTih2KTsKKwkJcC0+cF92YWwgPSBWUERfR0VUX1ZBTCh2KTsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJmb3VuZCwgbGVuID0gJWRcbiIsIHAtPnBfbGVuKSk7CisJCXJldHVybihwKTsKKwl9CisKKwl2ICs9IDMgKyBWUERfR0VUX1JFU19MRU4odikgKyAzOworCWZvciAoOzsgKSB7CisJCWlmIChTS19NRU1DTVAoa2V5LHYsMikgPT0gMCkgeworCQkJcC0+cF9sZW4gPSBWUERfR0VUX1ZQRF9MRU4odik7CisJCQlwLT5wX3ZhbCA9IFZQRF9HRVRfVkFMKHYpOworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9DVFJMLAorCQkJCSgiZm91bmQsIGxlbiA9ICVkXG4iLHAtPnBfbGVuKSk7CisJCQlyZXR1cm4ocCk7CisJCX0KKworCQkvKiBleGl0IHdoZW4gcmVhY2hpbmcgdGhlICJSVyIgVGFnIG9yIHRoZSBtYXhpbXVtIG9mIGl0ZXJhLiAqLworCQltYXgtLTsKKwkJaWYgKFNLX01FTUNNUChWUERfUlcsdiwyKSA9PSAwIHx8IG1heCA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChTS19NRU1DTVAoVlBEX1JWLHYsMikgPT0gMCkgeworCQkJdiArPSAzICsgVlBEX0dFVF9WUERfTEVOKHYpICsgMzsJLyogc2tpcCBWUEQtVyAqLworCQl9CisJCWVsc2UgeworCQkJdiArPSAzICsgVlBEX0dFVF9WUERfTEVOKHYpOworCQl9CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgic2Nhbm5pbmcgJyVjJWMnIGxlbiA9ICVkXG4iLHZbMF0sdlsxXSx2WzJdKSk7CisJfQorCisjaWZkZWYgREVCVUcKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0NUUkwsICgibm90IGZvdW5kXG4iKSk7CisJaWYgKG1heCA9PSAwKSB7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSIHwgU0tfREJHQ0FUX0ZBVEFMLAorCQkJKCJLZXkvTGVuIEVuY29kaW5nIGVycm9yXG4iKSk7CisJfQorI2VuZGlmIC8qIERFQlVHICovCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKglNb3ZlICduJyBieXRlcy4gQmVnaW4gd2l0aCB0aGUgbGFzdCBieXRlIGlmICduJyBpcyA+IDAsCisgKglTdGFydCB3aXRoIHRoZSBsYXN0IGJ5dGUgaWYgbiBpcyA8IDAuCisgKgorICogcmV0dXJucyBub3RoaW5nCisgKi8KK3N0YXRpYyB2b2lkIHZwZF9tb3ZlX3BhcmEoCitjaGFyCSpzdGFydCwJCS8qIHN0YXJ0IG9mIG1lbW9yeSBibG9jayAqLworY2hhcgkqZW5kLAkJLyogZW5kIG9mIG1lbW9yeSBibG9jayB0byBtb3ZlICovCitpbnQJCW4pCQkJLyogbnVtYmVyIG9mIGJ5dGVzIHRoZSBtZW1vcnkgYmxvY2sgaGFzIHRvIGJlIG1vdmVkICovCit7CisJY2hhciAqcDsKKwlpbnQgaTsJCS8qIG51bWJlciBvZiBieXRlIGNvcGllZCAqLworCisJaWYgKG4gPT0gMCkKKwkJcmV0dXJuOworCisJaSA9IChpbnQpIChlbmQgLSBzdGFydCArIDEpOworCWlmIChuIDwgMCkgeworCQlwID0gc3RhcnQgKyBuOworCQl3aGlsZSAoaSAhPSAwKSB7CisJCQkqcCsrID0gKnN0YXJ0Kys7CisJCQlpLS07CisJCX0KKwl9CisJZWxzZSB7CisJCXAgPSBlbmQgKyBuOworCQl3aGlsZSAoaSAhPSAwKSB7CisJCQkqcC0tID0gKmVuZC0tOworCQkJaS0tOworCQl9CisJfQorfQorCisvKgorICoJc2V0dXAgdGhlIFZQRCBrZXl3b3JkICdrZXknIGF0ICdpcCcuCisgKgorICogcmV0dXJucyBub3RoaW5nCisgKi8KK3N0YXRpYyB2b2lkIHZwZF9pbnNlcnRfa2V5KAorY29uc3QgY2hhcgkqa2V5LAkvKiBrZXl3b3JkIHRvIGluc2VydCAqLworY29uc3QgY2hhcgkqYnVmLAkvKiBidWZmZXIgd2l0aCB0aGUga2V5d29yZCB2YWx1ZSAqLworaW50CQlsZW4sCQkvKiBsZW5ndGggb2YgdGhlIHZhbHVlIHN0cmluZyAqLworY2hhcgkqaXApCQkvKiBpbnNlcmF0aW9uIHBvaW50ICovCit7CisJU0tfVlBEX0tFWSAqcDsKKworCXAgPSAoU0tfVlBEX0tFWSAqKSBpcDsKKwlwLT5wX2tleVswXSA9IGtleVswXTsKKwlwLT5wX2tleVsxXSA9IGtleVsxXTsKKwlwLT5wX2xlbiA9ICh1bnNpZ25lZCBjaGFyKSBsZW47CisJU0tfTUVNQ1BZKCZwLT5wX3ZhbCxidWYsbGVuKTsKK30KKworLyoKKyAqCVNldHVwIHRoZSBWUEQgZW5kIHRhZyAiUlYiIC8gIlJXIi4KKyAqCUFsc28gY29ycmVjdCB0aGUgcmVtYWluaW5nIHNwYWNlIHZhcmlhYmxlcyB2cGRfZnJlZV9ybyAvIHZwZF9mcmVlX3J3LgorICoKKyAqIHJldHVybnMJMDoJc3VjY2VzcworICoJCTE6CWVuY29kaW5nIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgdnBkX21vZF9lbmR0YWcoCitTS19BQwkqcEFDLAkJLyogY29tbW9uIGRhdGEgYmFzZSAqLworY2hhcgkqZXRwKQkJLyogZW5kIHBvaW50ZXIgaW5wdXQgcG9zaXRpb24gKi8KK3sKKwlTS19WUERfS0VZICpwOworCXVuc2lnbmVkIGNoYXIJeDsKKwlpbnQJaTsKKwlpbnQJdnBkX3NpemU7CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0NUUkwsCisJCSgiVlBEIG1vZGlmeSBlbmR0YWcgYXQgMHgleCA9ICclYyVjJ1xuIixldHAsZXRwWzBdLGV0cFsxXSkpOworCisJdnBkX3NpemUgPSBwQUMtPnZwZC52cGRfc2l6ZTsKKworCXAgPSAoU0tfVlBEX0tFWSAqKSBldHA7CisKKwlpZiAocC0+cF9rZXlbMF0gIT0gJ1InIHx8IChwLT5wX2tleVsxXSAhPSAnVicgJiYgcC0+cF9rZXlbMV0gIT0gJ1cnKSkgeworCQkvKiBzb21ldGhpbmcgd3JvbmcgaGVyZSwgZW5jb2RpbmcgZXJyb3IgKi8KKwkJU0tfREJHX01TRyhwQUMsU0tfREJHTU9EX1ZQRCxTS19EQkdDQVRfRVJSIHwgU0tfREJHQ0FUX0ZBVEFMLAorCQkJKCJFbmNvZGluZyBFcnJvcjogaW52YWxpZCBlbmQgdGFnXG4iKSk7CisJCXJldHVybigxKTsKKwl9CisJaWYgKGV0cCA+IHBBQy0+dnBkLnZwZF9idWYgKyB2cGRfc2l6ZS8yKSB7CisJCS8qIGNyZWF0ZSAiUlciIHRhZyAqLworCQlwLT5wX2xlbiA9ICh1bnNpZ25lZCBjaGFyKShwQUMtPnZwZC52cGRfYnVmK3ZwZF9zaXplLWV0cC0zLTEpOworCQlwQUMtPnZwZC52LnZwZF9mcmVlX3J3ID0gKGludCkgcC0+cF9sZW47CisJCWkgPSBwQUMtPnZwZC52LnZwZF9mcmVlX3J3OworCQlldHAgKz0gMzsKKwl9CisJZWxzZSB7CisJCS8qIGNyZWF0ZSAiUlYiIHRhZyAqLworCQlwLT5wX2xlbiA9ICh1bnNpZ25lZCBjaGFyKShwQUMtPnZwZC52cGRfYnVmK3ZwZF9zaXplLzItZXRwLTMpOworCQlwQUMtPnZwZC52LnZwZF9mcmVlX3JvID0gKGludCkgcC0+cF9sZW4gLSAxOworCisJCS8qIHNldHVwIGNoZWNrc3VtICovCisJCWZvciAoaSA9IDAsIHggPSAwOyBpIDwgdnBkX3NpemUvMiAtIHAtPnBfbGVuOyBpKyspIHsKKwkJCXggKz0gcEFDLT52cGQudnBkX2J1ZltpXTsKKwkJfQorCQlwLT5wX3ZhbCA9IChjaGFyKSAwIC0geDsKKwkJaSA9IHBBQy0+dnBkLnYudnBkX2ZyZWVfcm87CisJCWV0cCArPSA0OworCX0KKwl3aGlsZSAoaSkgeworCQkqZXRwKysgPSAweDAwOworCQlpLS07CisJfQorCisJcmV0dXJuKDApOworfQorCisvKgorICoJSW5zZXJ0IGEgVlBEIGtleXdvcmQgaW50byB0aGUgVlBEIGJ1ZmZlci4KKyAqCisgKglUaGUga2V5d29yZCAna2V5JyBpcyBpbnNlcnRlZCBhdCB0aGUgcG9zaXRpb24gJ2lwJyBpbiB0aGUKKyAqCVZQRCBidWZmZXIuCisgKglUaGUga2V5d29yZHMgYmVoaW5kIHRoZSBpbnB1dCBwb3NpdGlvbiB3aWxsCisgKgliZSBtb3ZlZC4gVGhlIFZQRCBlbmQgdGFnICJSViIgb3IgIlJXIiBpcyBnZW5lcmF0ZWQgYWdhaW4uCisgKgorICogcmV0dXJucwkwOglzdWNjZXNzCisgKgkJMjoJdmFsdWUgc3RyaW5nIHdhcyBjdXQKKyAqCQk0OglWUEQgZnVsbCwga2V5d29yZCB3YXMgbm90IHdyaXR0ZW4KKyAqCQk2OglmYXRhbCBWUEQgZXJyb3IKKyAqCisgKi8KK2ludAlWcGRTZXR1cFBhcmEoCitTS19BQwkqcEFDLAkJLyogY29tbW9uIGRhdGEgYmFzZSAqLworY29uc3QgY2hhcgkqa2V5LAkvKiBrZXl3b3JkIHRvIGluc2VydCAqLworY29uc3QgY2hhcgkqYnVmLAkvKiBidWZmZXIgd2l0aCB0aGUga2V5d29yZCB2YWx1ZSAqLworaW50CQlsZW4sCQkvKiBsZW5ndGggb2YgdGhlIGtleXdvcmQgdmFsdWUgKi8KK2ludAkJdHlwZSwJCS8qIFZQRF9ST19LRVkgb3IgVlBEX1JXX0tFWSAqLworaW50CQlvcCkJCQkvKiBvcGVyYXRpb24gdG8gZG86IEFERF9LRVkgb3IgT1dSX0tFWSAqLworeworCVNLX1ZQRF9QQVJBIHZwOworCWNoYXIJKmV0cDsJCS8qIGVuZCB0YWcgcG9zaXRpb24gKi8KKwlpbnQJZnJlZTsJCS8qIHJlbWFpbmluZyBzcGFjZSBpbiBzZWxlY3RlZCBhcmVhICovCisJY2hhcgkqaXA7CQkvKiBpbnB1dCBwb3NpdGlvbiBpbnNpZGUgdGhlIFZQRCBidWZmZXIgKi8KKwlpbnQJcnR2OwkJLyogcmV0dXJuIGNvZGUgKi8KKwlpbnQJaGVhZDsJCS8qIGFkZGl0aW9uYWwgaGFlZGVyIGJ5dGVzIHRvIG1vdmUgKi8KKwlpbnQJZm91bmQ7CQkvKiBhZGRpdGlub2FsIGJ5dGVzIGlmIHRoZSBrZXl3b3JkIHdhcyBmb3VuZCAqLworCWludCB2cGRfc2l6ZTsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJWUEQgc2V0dXAgcGFyYSBrZXkgPSAlcywgdmFsID0gJXNcbiIsa2V5LGJ1ZikpOworCQorCXZwZF9zaXplID0gcEFDLT52cGQudnBkX3NpemU7CisKKwlydHYgPSAwOworCWlwID0gTlVMTDsKKwlpZiAodHlwZSA9PSBWUERfUldfS0VZKSB7CisJCS8qIGVuZCB0YWcgaXMgIlJXIiAqLworCQlmcmVlID0gcEFDLT52cGQudi52cGRfZnJlZV9ydzsKKwkJZXRwID0gcEFDLT52cGQudnBkX2J1ZiArICh2cGRfc2l6ZSAtIGZyZWUgLSAxIC0gMyk7CisJfQorCWVsc2UgeworCQkvKiBlbmQgdGFnIGlzICJSViIgKi8KKwkJZnJlZSA9IHBBQy0+dnBkLnYudnBkX2ZyZWVfcm87CisJCWV0cCA9IHBBQy0+dnBkLnZwZF9idWYgKyAodnBkX3NpemUvMiAtIGZyZWUgLSA0KTsKKwl9CisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9DVFJMLAorCQkoIkZyZWUgUk8gPSAlZCwgRnJlZSBSVyA9ICVkXG4iLAorCQlwQUMtPnZwZC52LnZwZF9mcmVlX3JvLCBwQUMtPnZwZC52LnZwZF9mcmVlX3J3KSk7CisKKwloZWFkID0gMDsKKwlmb3VuZCA9IDA7CisJaWYgKG9wID09IE9XUl9LRVkpIHsKKwkJaWYgKHZwZF9maW5kX3BhcmEocEFDLCBrZXksICZ2cCkpIHsKKwkJCWZvdW5kID0gMzsKKwkJCWlwID0gdnAucF92YWwgLSAzOworCQkJZnJlZSArPSB2cC5wX2xlbiArIDM7CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJPdmVyd3JpdGUgS2V5XG4iKSk7CisJCX0KKwkJZWxzZSB7CisJCQlvcCA9IEFERF9LRVk7CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0NUUkwsCisJCQkJKCJBZGQgS2V5XG4iKSk7CisJCX0KKwl9CisJaWYgKG9wID09IEFERF9LRVkpIHsKKwkJaXAgPSBldHA7CisJCXZwLnBfbGVuID0gMDsKKwkJaGVhZCA9IDM7CisJfQorCisJaWYgKGxlbiArIDMgPiBmcmVlKSB7CisJCWlmIChmcmVlIDwgNykgeworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9FUlIsCisJCQkJKCJWUEQgQnVmZmVyIE92ZXJmbG93LCBrZXl3b3JkIG5vdCB3cml0dGVuXG4iKSk7CisJCQlyZXR1cm4oNCk7CisJCX0KKwkJLyogY3V0IGl0IGFnYWluICovCisJCWxlbiA9IGZyZWUgLSAzOworCQlydHYgPSAyOworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0VSUiwKKwkJCSgiVlBEIEJ1ZmZlciBGdWxsLCBLZXl3b3JkIHdhcyBjdXRcbiIpKTsKKwl9CisKKwl2cGRfbW92ZV9wYXJhKGlwICsgdnAucF9sZW4gKyBmb3VuZCwgZXRwKzIsIGxlbi12cC5wX2xlbitoZWFkKTsKKwl2cGRfaW5zZXJ0X2tleShrZXksIGJ1ZiwgbGVuLCBpcCk7CisJaWYgKHZwZF9tb2RfZW5kdGFnKHBBQywgZXRwICsgbGVuIC0gdnAucF9sZW4gKyBoZWFkKSkgeworCQlwQUMtPnZwZC52LnZwZF9zdGF0dXMgJj0gflZQRF9WQUxJRDsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9FUlIsCisJCQkoIlZQRCBFbmNvZGluZyBFcnJvclxuIikpOworCQlyZXR1cm4oNik7CisJfQorCisJcmV0dXJuKHJ0dik7Cit9CisKKworLyoKKyAqCVJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBWUEQgRUVQUk9NIGFuZCBjb3B5IGl0IHRvIHRoZQorICoJVlBEIGJ1ZmZlciBpZiBub3QgYWxyZWFkeSBkb25lLgorICoKKyAqIHJldHVybjoJQSBwb2ludGVyIHRvIHRoZSB2cGRfc3RhdHVzIHN0cnVjdHVyZS4gVGhlIHN0cnVjdHVyZSBjb250YWlucworICoJCXRoaXMgZmllbGRzLgorICovCitTS19WUERfU1RBVFVTICpWcGRTdGF0KAorU0tfQUMJKnBBQywJLyogQWRhcHRlcnMgY29udGV4dCAqLworU0tfSU9DCUlvQykJLyogSU8gQ29udGV4dCAqLworeworCWlmICgocEFDLT52cGQudi52cGRfc3RhdHVzICYgVlBEX1ZBTElEKSA9PSAwKSB7CisJCSh2b2lkKVZwZEluaXQocEFDLCBJb0MpOworCX0KKwlyZXR1cm4oJnBBQy0+dnBkLnYpOworfQorCisKKy8qCisgKglSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgVlBEIEVFUFJPTSBhbmQgY29weSBpdCB0byB0aGUgVlBECisgKglidWZmZXIgaWYgbm90IGFscmVhZHkgZG9uZS4KKyAqCVNjYW4gdGhlIFZQRCBidWZmZXIgZm9yIFZQRCBrZXl3b3JkcyBhbmQgY3JlYXRlIHRoZSBWUEQKKyAqCWtleXdvcmQgbGlzdCBieSBjb3B5aW5nIHRoZSBrZXl3b3JkcyB0byAnYnVmJywgYWxsIGFmdGVyCisgKgllYWNoIG90aGVyIGFuZCB0ZXJtaW5hdGVkIHdpdGggYSAnXDAnLgorICoKKyAqIEV4Y2VwdGlvbnM6CW8gVGhlIFJlc291cmNlIFR5cGUgSUQgU3RyaW5nIChwcm9kdWN0IG5hbWUpIGlzIGNhbGxlZCAiTmFtZSIKKyAqCQlvIFRoZSBWUEQgZW5kIHRhZ3MgJ1JWJyBhbmQgJ1JXJyBhcmUgbm90IGxpc3RlZAorICoKKyAqCVRoZSBudW1iZXIgb2YgY29waWVkIGtleXdvcmRzIGlzIGNvdW50ZWQgaW4gJ2VsZW1lbnRzJy4KKyAqCisgKiByZXR1cm5zCTA6CXN1Y2Nlc3MKKyAqCQkyOglidWZmZXIgb3ZlcmZ1bGwsIG9uZSBvciBtb3JlIGtleXdvcmRzIGFyZSBtaXNzaW5nCisgKgkJNjoJZmF0YWwgVlBEIGVycm9yCisgKgorICoJZXhhbXBsZSB2YWx1ZXMgYWZ0ZXIgcmV0dXJuaW5nOgorICoKKyAqCQlidWYgPQkiTmFtZVwwUE5cMEVDXDBNTlwwU05cMENQXDBWRlwwVkxcMFlBXDAiCisgKgkJKmxlbiA9CQkzMAorICoJCSplbGVtZW50cyA9CSA5CisgKi8KK2ludCBWcGRLZXlzKAorU0tfQUMJKnBBQywJCS8qIGNvbW1vbiBkYXRhIGJhc2UgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBDb250ZXh0ICovCitjaGFyCSpidWYsCQkvKiBidWZmZXIgd2hlcmUgdG8gY29weSB0aGUga2V5d29yZHMgKi8KK2ludAkJKmxlbiwJCS8qIGJ1ZmZlciBsZW5ndGggKi8KK2ludAkJKmVsZW1lbnRzKQkvKiBudW1iZXIgb2Yga2V5d29yZHMgcmV0dXJuZWQgKi8KK3sKKwljaGFyICp2OworCWludCBuOworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9SWCwgKCJsaXN0IFZQRCBrZXlzIC4uICIpKTsKKwkqZWxlbWVudHMgPSAwOworCWlmICgocEFDLT52cGQudi52cGRfc3RhdHVzICYgVlBEX1ZBTElEKSA9PSAwKSB7CisJCWlmIChWcGRJbml0KHBBQywgSW9DKSAhPSAwKSB7CisJCQkqbGVuID0gMDsKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSLAorCQkJCSgiVlBEIEluaXQgRXJyb3IsIHRlcm1pbmF0ZWRcbiIpKTsKKwkJCXJldHVybig2KTsKKwkJfQorCX0KKworCWlmICgoc2lnbmVkKXN0cmxlbihWUERfTkFNRSkgKyAxIDw9ICpsZW4pIHsKKwkJdiA9IHBBQy0+dnBkLnZwZF9idWY7CisJCXN0cmNweShidWYsVlBEX05BTUUpOworCQluID0gc3RybGVuKFZQRF9OQU1FKSArIDE7CisJCWJ1ZiArPSBuOworCQkqZWxlbWVudHMgPSAxOworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX1JYLAorCQkJKCInJWMlYycgIix2WzBdLHZbMV0pKTsKKwl9CisJZWxzZSB7CisJCSpsZW4gPSAwOworCQlTS19EQkdfTVNHKHBBQyxTS19EQkdNT0RfVlBELFNLX0RCR0NBVF9FUlIsCisJCQkoImJ1ZmZlciBvdmVyZmxvd1xuIikpOworCQlyZXR1cm4oMik7CisJfQorCisJdiArPSAzICsgVlBEX0dFVF9SRVNfTEVOKHYpICsgMzsKKwlmb3IgKDs7ICkgeworCQkvKiBleGl0IHdoZW4gcmVhY2hpbmcgdGhlICJSVyIgVGFnICovCisJCWlmIChTS19NRU1DTVAoVlBEX1JXLHYsMikgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoU0tfTUVNQ01QKFZQRF9SVix2LDIpID09IDApIHsKKwkJCXYgKz0gMyArIFZQRF9HRVRfVlBEX0xFTih2KSArIDM7CS8qIHNraXAgVlBELVcgKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKG4rMyA8PSAqbGVuKSB7CisJCQlTS19NRU1DUFkoYnVmLHYsMik7CisJCQlidWYgKz0gMjsKKwkJCSpidWYrKyA9ICdcMCc7CisJCQluICs9IDM7CisJCQl2ICs9IDMgKyBWUERfR0VUX1ZQRF9MRU4odik7CisJCQkqZWxlbWVudHMgKz0gMTsKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfUlgsCisJCQkJKCInJWMlYycgIix2WzBdLHZbMV0pKTsKKwkJfQorCQllbHNlIHsKKwkJCSpsZW4gPSBuOworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9FUlIsCisJCQkJKCJidWZmZXIgb3ZlcmZsb3dcbiIpKTsKKwkJCXJldHVybigyKTsKKwkJfQorCX0KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfUlgsICgiXG4iKSk7CisJKmxlbiA9IG47CisJcmV0dXJuKDApOworfQorCisKKy8qCisgKglSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgVlBEIEVFUFJPTSBhbmQgY29weSBpdCB0byB0aGUKKyAqCVZQRCBidWZmZXIgaWYgbm90IGFscmVhZHkgZG9uZS4gU2VhcmNoIGZvciB0aGUgVlBEIGtleXdvcmQKKyAqCSdrZXknIGFuZCBjb3B5IGl0cyB2YWx1ZSB0byAnYnVmJy4gQWRkIGEgdGVybWluYXRpbmcgJ1wwJy4KKyAqCUlmIHRoZSB2YWx1ZSBkb2VzIG5vdCBmaXQgaW50byB0aGUgYnVmZmVyIGN1dCBpdCBhZnRlcgorICoJJ2xlbicgLSAxIGJ5dGVzLgorICoKKyAqIHJldHVybnMJMDoJc3VjY2VzcworICoJCTE6CWtleXdvcmQgbm90IGZvdW5kCisgKgkJMjoJdmFsdWUgc3RyaW5nIHdhcyBjdXQKKyAqCQkzOglWUEQgdHJhbnNmZXIgdGltZW91dAorICoJCTY6CWZhdGFsIFZQRCBlcnJvcgorICovCitpbnQgVnBkUmVhZCgKK1NLX0FDCQkqcEFDLAkvKiBjb21tb24gZGF0YSBiYXNlICovCitTS19JT0MJCUlvQywJLyogSU8gQ29udGV4dCAqLworY29uc3QgY2hhcgkqa2V5LAkvKiBrZXl3b3JkIHRvIHJlYWQgKGUuZy4gIk1OIikgKi8KK2NoYXIJCSpidWYsCS8qIGJ1ZmZlciB3aGVyZSB0byBjb3B5IHRoZSBrZXl3b3JkIHZhbHVlICovCitpbnQJCQkqbGVuKQkvKiBidWZmZXIgbGVuZ3RoICovCit7CisJU0tfVlBEX1BBUkEgKnAsIHZwOworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9SWCwgKCJWUEQgcmVhZCAlcyAuLiAiLCBrZXkpKTsKKwlpZiAoKHBBQy0+dnBkLnYudnBkX3N0YXR1cyAmIFZQRF9WQUxJRCkgPT0gMCkgeworCQlpZiAoVnBkSW5pdChwQUMsIElvQykgIT0gMCkgeworCQkJKmxlbiA9IDA7CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0VSUiwKKwkJCQkoIlZQRCBpbml0IGVycm9yXG4iKSk7CisJCQlyZXR1cm4oNik7CisJCX0KKwl9CisKKwlpZiAoKHAgPSB2cGRfZmluZF9wYXJhKHBBQywga2V5LCAmdnApKSAhPSBOVUxMKSB7CisJCWlmIChwLT5wX2xlbiA+ICgqKHVuc2lnbmVkICopbGVuKS0xKSB7CisJCQlwLT5wX2xlbiA9ICpsZW4gLSAxOworCQl9CisJCVNLX01FTUNQWShidWYsIHAtPnBfdmFsLCBwLT5wX2xlbik7CisJCWJ1ZltwLT5wX2xlbl0gPSAnXDAnOworCQkqbGVuID0gcC0+cF9sZW47CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfUlgsCisJCQkoIiVjJWMlYyVjLi4sIGxlbiA9ICVkXG4iLAorCQkJYnVmWzBdLGJ1ZlsxXSxidWZbMl0sYnVmWzNdLCpsZW4pKTsKKwl9CisJZWxzZSB7CisJCSpsZW4gPSAwOworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0VSUiwgKCJub3QgZm91bmRcbiIpKTsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKKworLyoKKyAqCUNoZWNrIHdoZXRoZXIgYSBnaXZlbiBrZXkgbWF5IGJlIHdyaXR0ZW4KKyAqCisgKiByZXR1cm5zCisgKglTS19UUlVFCQlZZXMgaXQgbWF5IGJlIHdyaXR0ZW4KKyAqCVNLX0ZBTFNFCU5vIGl0IG1heSBiZSB3cml0dGVuCisgKi8KK1NLX0JPT0wgVnBkTWF5V3JpdGUoCitjaGFyCSprZXkpCS8qIGtleXdvcmQgdG8gd3JpdGUgKGFsbG93ZWQgdmFsdWVzICJZeCIsICJWeCIpICovCit7CisJaWYgKCgqa2V5ICE9ICdZJyAmJiAqa2V5ICE9ICdWJykgfHwKKwkJa2V5WzFdIDwgJzAnIHx8IGtleVsxXSA+ICdaJyB8fAorCQkoa2V5WzFdID4gJzknICYmIGtleVsxXSA8ICdBJykgfHwgc3RybGVuKGtleSkgIT0gMikgeworCisJCXJldHVybihTS19GQUxTRSk7CisJfQorCXJldHVybihTS19UUlVFKTsKK30KKworLyoKKyAqCVJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBWUEQgRUVQUk9NIGFuZCBjb3B5IGl0IHRvIHRoZSBWUEQKKyAqCWJ1ZmZlciBpZiBub3QgYWxyZWFkeSBkb25lLiBJbnNlcnQvb3ZlcndyaXRlIHRoZSBrZXl3b3JkICdrZXknCisgKglpbiB0aGUgVlBEIGJ1ZmZlci4gQ3V0IHRoZSBrZXl3b3JkIHZhbHVlIGlmIGl0IGRvZXMgbm90IGZpdAorICoJaW50byB0aGUgVlBEIHJlYWQgLyB3cml0ZSBhcmVhLgorICoKKyAqIHJldHVybnMJMDoJc3VjY2VzcworICoJCTI6CXZhbHVlIHN0cmluZyB3YXMgY3V0CisgKgkJMzoJVlBEIHRyYW5zZmVyIHRpbWVvdXQKKyAqCQk0OglWUEQgZnVsbCwga2V5d29yZCB3YXMgbm90IHdyaXR0ZW4KKyAqCQk1OglrZXl3b3JkIGNhbm5vdCBiZSB3cml0dGVuCisgKgkJNjoJZmF0YWwgVlBEIGVycm9yCisgKi8KK2ludCBWcGRXcml0ZSgKK1NLX0FDCQkqcEFDLAkvKiBjb21tb24gZGF0YSBiYXNlICovCitTS19JT0MJCUlvQywJLyogSU8gQ29udGV4dCAqLworY29uc3QgY2hhcgkqa2V5LAkvKiBrZXl3b3JkIHRvIHdyaXRlIChhbGxvd2VkIHZhbHVlcyAiWXgiLCAiVngiKSAqLworY29uc3QgY2hhcgkqYnVmKQkvKiBidWZmZXIgd2hlcmUgdGhlIGtleXdvcmQgdmFsdWUgY2FuIGJlIHJlYWQgZnJvbSAqLworeworCWludCBsZW47CQkvKiBsZW5ndGggb2YgdGhlIGtleXdvcmQgdG8gd3JpdGUgKi8KKwlpbnQgcnR2OwkJLyogcmV0dXJuIGNvZGUgKi8KKwlpbnQgcnR2MjsKKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfVFgsCisJCSgiVlBEIHdyaXRlICVzID0gJXNcbiIsa2V5LGJ1ZikpOworCisJaWYgKCgqa2V5ICE9ICdZJyAmJiAqa2V5ICE9ICdWJykgfHwKKwkJa2V5WzFdIDwgJzAnIHx8IGtleVsxXSA+ICdaJyB8fAorCQkoa2V5WzFdID4gJzknICYmIGtleVsxXSA8ICdBJykgfHwgc3RybGVuKGtleSkgIT0gMikgeworCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSLAorCQkJKCJpbGxlZ2FsIGtleSB0YWcsIGtleXdvcmQgbm90IHdyaXR0ZW5cbiIpKTsKKwkJcmV0dXJuKDUpOworCX0KKworCWlmICgocEFDLT52cGQudi52cGRfc3RhdHVzICYgVlBEX1ZBTElEKSA9PSAwKSB7CisJCWlmIChWcGRJbml0KHBBQywgSW9DKSAhPSAwKSB7CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0VSUiwKKwkJCQkoIlZQRCBpbml0IGVycm9yXG4iKSk7CisJCQlyZXR1cm4oNik7CisJCX0KKwl9CisKKwlydHYgPSAwOworCWxlbiA9IHN0cmxlbihidWYpOworCWlmIChsZW4gPiBWUERfTUFYX0xFTikgeworCQkvKiBjdXQgaXQgKi8KKwkJbGVuID0gVlBEX01BWF9MRU47CisJCXJ0diA9IDI7CisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSLAorCQkJKCJrZXl3b3JkIHRvbyBsb25nLCBjdXQgYWZ0ZXIgJWQgYnl0ZXNcbiIsVlBEX01BWF9MRU4pKTsKKwl9CisJaWYgKChydHYyID0gVnBkU2V0dXBQYXJhKHBBQywga2V5LCBidWYsIGxlbiwgVlBEX1JXX0tFWSwgT1dSX0tFWSkpICE9IDApIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9FUlIsCisJCQkoIlZQRCB3cml0ZSBlcnJvclxuIikpOworCQlyZXR1cm4ocnR2Mik7CisJfQorCisJcmV0dXJuKHJ0dik7Cit9CisKKy8qCisgKglSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgVlBEIEVFUFJPTSBhbmQgY29weSBpdCB0byB0aGUKKyAqCVZQRCBidWZmZXIgaWYgbm90IGFscmVhZHkgZG9uZS4gUmVtb3ZlIHRoZSBWUEQga2V5d29yZAorICoJJ2tleScgZnJvbSB0aGUgVlBEIGJ1ZmZlci4KKyAqCU9ubHkgdGhlIGtleXdvcmRzIGluIHRoZSByZWFkL3dyaXRlIGFyZWEgY2FuIGJlIGRlbGV0ZWQuCisgKglLZXl3b3JkcyBpbiB0aGUgcmVhZCBvbmx5IGFyZWEgY2Fubm90IGJlIGRlbGV0ZWQuCisgKgorICogcmV0dXJucwkwOglzdWNjZXNzLCBrZXl3b3JkIHdhcyByZW1vdmVkCisgKgkJMToJa2V5d29yZCBub3QgZm91bmQKKyAqCQk1OglrZXl3b3JkIGNhbm5vdCBiZSBkZWxldGVkCisgKgkJNjoJZmF0YWwgVlBEIGVycm9yCisgKi8KK2ludCBWcGREZWxldGUoCitTS19BQwkqcEFDLAkvKiBjb21tb24gZGF0YSBiYXNlICovCitTS19JT0MJSW9DLAkvKiBJTyBDb250ZXh0ICovCitjaGFyCSprZXkpCS8qIGtleXdvcmQgdG8gcmVhZCAoZS5nLiAiTU4iKSAqLworeworCVNLX1ZQRF9QQVJBICpwLCB2cDsKKwljaGFyICpldHA7CisJaW50CXZwZF9zaXplOworCisJdnBkX3NpemUgPSBwQUMtPnZwZC52cGRfc2l6ZTsKKworCVNLX0RCR19NU0cocEFDLFNLX0RCR01PRF9WUEQsU0tfREJHQ0FUX1RYLCgiVlBEIGRlbGV0ZSBrZXkgJXNcbiIsa2V5KSk7CisJaWYgKChwQUMtPnZwZC52LnZwZF9zdGF0dXMgJiBWUERfVkFMSUQpID09IDApIHsKKwkJaWYgKFZwZEluaXQocEFDLCBJb0MpICE9IDApIHsKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSLAorCQkJCSgiVlBEIGluaXQgZXJyb3JcbiIpKTsKKwkJCXJldHVybig2KTsKKwkJfQorCX0KKworCWlmICgocCA9IHZwZF9maW5kX3BhcmEocEFDLCBrZXksICZ2cCkpICE9IE5VTEwpIHsKKwkJaWYgKHAtPnBfdmFsIDwgcEFDLT52cGQudnBkX2J1ZiArIHZwZF9zaXplLzIpIHsKKwkJCS8qIHRyeSB0byBkZWxldGUgcmVhZCBvbmx5IGtleXdvcmQgKi8KKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSLAorCQkJCSgiY2Fubm90IGRlbGV0ZSBSTyBrZXl3b3JkXG4iKSk7CisJCQlyZXR1cm4oNSk7CisJCX0KKworCQlldHAgPSBwQUMtPnZwZC52cGRfYnVmICsgKHZwZF9zaXplLXBBQy0+dnBkLnYudnBkX2ZyZWVfcnctMS0zKTsKKworCQl2cGRfbW92ZV9wYXJhKHZwLnBfdmFsK3ZwLnBfbGVuLCBldHArMiwKKwkJCS0gKChpbnQpKHZwLnBfbGVuICsgMykpKTsKKwkJaWYgKHZwZF9tb2RfZW5kdGFnKHBBQywgZXRwIC0gdnAucF9sZW4gLSAzKSkgeworCQkJcEFDLT52cGQudi52cGRfc3RhdHVzICY9IH5WUERfVkFMSUQ7CisJCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0VSUiwKKwkJCQkoIlZQRCBlbmNvZGluZyBlcnJvclxuIikpOworCQkJcmV0dXJuKDYpOworCQl9CisJfQorCWVsc2UgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX0VSUiwKKwkJCSgia2V5d29yZCBub3QgZm91bmRcbiIpKTsKKwkJcmV0dXJuKDEpOworCX0KKworCXJldHVybigwKTsKK30KKworLyoKKyAqCUlmIHRoZSBWUEQgYnVmZmVyIGNvbnRhaW5zIHZhbGlkIGRhdGEgd3JpdGUgdGhlIFZQRAorICoJcmVhZC93cml0ZSBhcmVhIGJhY2sgdG8gdGhlIFZQRCBFRVBST00uCisgKgorICogcmV0dXJucwkwOglzdWNjZXNzCisgKgkJMzoJVlBEIHRyYW5zZmVyIHRpbWVvdXQKKyAqLworaW50IFZwZFVwZGF0ZSgKK1NLX0FDCSpwQUMsCS8qIEFkYXB0ZXJzIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MpCS8qIElPIENvbnRleHQgKi8KK3sKKwlpbnQgdnBkX3NpemU7CisKKwl2cGRfc2l6ZSA9IHBBQy0+dnBkLnZwZF9zaXplOworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9UWCwgKCJWUEQgdXBkYXRlIC4uICIpKTsKKwlpZiAoKHBBQy0+dnBkLnYudnBkX3N0YXR1cyAmIFZQRF9WQUxJRCkgIT0gMCkgeworCQlpZiAoVnBkVHJhbnNmZXJCbG9jayhwQUMsIElvQywgcEFDLT52cGQudnBkX2J1ZiArIHZwZF9zaXplLzIsCisJCQl2cGRfc2l6ZS8yLCB2cGRfc2l6ZS8yLCBWUERfV1JJVEUpICE9IHZwZF9zaXplLzIpIHsKKworCQkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9FUlIsCisJCQkJKCJ0cmFuc2ZlciB0aW1lZCBvdXRcbiIpKTsKKwkJCXJldHVybigzKTsKKwkJfQorCX0KKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX1RYLCAoImRvbmVcbiIpKTsKKwlyZXR1cm4oMCk7Cit9CisKKworCisvKgorICoJUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIFZQRCBFRVBST00gYW5kIGNvcHkgaXQgdG8gdGhlIFZQRCBidWZmZXIKKyAqCWlmIG5vdCBhbHJlYWR5IGRvbmUuIElmIHRoZSBrZXl3b3JkICJWRiIgaXMgbm90IHByZXNlbnQgaXQgd2lsbCBiZQorICoJY3JlYXRlZCBhbmQgdGhlIGVycm9yIGxvZyBtZXNzYWdlIHdpbGwgYmUgc3RvcmVkIHRvIHRoaXMga2V5d29yZC4KKyAqCUlmICJWRiIgaXMgbm90IHByZXNlbnQgdGhlIGVycm9yIGxvZyBtZXNzYWdlIHdpbGwgYmUgc3RvcmVkIHRvIHRoZQorICoJa2V5d29yZCAiVkwiLiAiVkwiIHdpbGwgY3JlYXRlZCBvciBvdmVyd3JpdHRlbiBpZiAiVkYiIGlzIHByZXNlbnQuCisgKglUaGUgVlBEIHJlYWQvd3JpdGUgYXJlYSBpcyBzYXZlZCB0byB0aGUgVlBEIEVFUFJPTS4KKyAqCisgKiByZXR1cm5zIG5vdGhpbmcsIGVycm9ycyB3aWxsIGJlIGlnbm9yZWQuCisgKi8KK3ZvaWQgVnBkRXJyTG9nKAorU0tfQUMJKnBBQywJLyogY29tbW9uIGRhdGEgYmFzZSAqLworU0tfSU9DCUlvQywJLyogSU8gQ29udGV4dCAqLworY2hhcgkqbXNnKQkvKiBlcnJvciBsb2cgbWVzc2FnZSAqLworeworCVNLX1ZQRF9QQVJBICp2LCB2ZjsJLyogVkYgKi8KKwlpbnQgbGVuOworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9UWCwKKwkJKCJWUEQgZXJyb3IgbG9nIG1zZyAlc1xuIiwgbXNnKSk7CisJaWYgKChwQUMtPnZwZC52LnZwZF9zdGF0dXMgJiBWUERfVkFMSUQpID09IDApIHsKKwkJaWYgKFZwZEluaXQocEFDLCBJb0MpICE9IDApIHsKKwkJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfVlBELCBTS19EQkdDQVRfRVJSLAorCQkJCSgiVlBEIGluaXQgZXJyb3JcbiIpKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWxlbiA9IHN0cmxlbihtc2cpOworCWlmIChsZW4gPiBWUERfTUFYX0xFTikgeworCQkvKiBjdXQgaXQgKi8KKwkJbGVuID0gVlBEX01BWF9MRU47CisJfQorCWlmICgodiA9IHZwZF9maW5kX3BhcmEocEFDLCBWUERfVkYsICZ2ZikpICE9IE5VTEwpIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9WUEQsIFNLX0RCR0NBVF9UWCwgKCJvdmVyd3JpdGUgVkxcbiIpKTsKKwkJKHZvaWQpVnBkU2V0dXBQYXJhKHBBQywgVlBEX1ZMLCBtc2csIGxlbiwgVlBEX1JXX0tFWSwgT1dSX0tFWSk7CisJfQorCWVsc2UgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX1ZQRCwgU0tfREJHQ0FUX1RYLCAoIndyaXRlIFZGXG4iKSk7CisJCSh2b2lkKVZwZFNldHVwUGFyYShwQUMsIFZQRF9WRiwgbXNnLCBsZW4sIFZQRF9SV19LRVksIEFERF9LRVkpOworCX0KKworCSh2b2lkKVZwZFVwZGF0ZShwQUMsIElvQyk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2t4bWFjMi5jIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za3htYWMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhMDlkZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2t4bWFjMi5jCkBAIC0wLDAgKzEsNDYwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6CXNreG1hYzIuYworICogUHJvamVjdDoJR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVycywgQ29tbW9uIE1vZHVsZXMKKyAqIFZlcnNpb246CSRSZXZpc2lvbjogMS4xMDIgJAorICogRGF0ZToJJERhdGU6IDIwMDMvMTAvMDIgMTY6NTM6NTggJAorICogUHVycG9zZToJQ29udGFpbnMgZnVuY3Rpb25zIHRvIGluaXRpYWxpemUgdGhlIE1BQ3MgYW5kIFBIWXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgtMjAwMiBTeXNLb25uZWN0LgorICoJKEMpQ29weXJpZ2h0IDIwMDItMjAwMyBNYXJ2ZWxsLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImgvc2tkcnYxc3QuaCIKKyNpbmNsdWRlICJoL3NrZHJ2Mm5kLmgiCisKKy8qIHR5cGVkZWZzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEJDT00gUEhZIG1hZ2ljIHBhdHRlcm4gbGlzdCAqLwordHlwZWRlZiBzdHJ1Y3Qgc19QaHlIYWNrIHsKKwlpbnQJCVBoeVJlZzsJCS8qIFBoeSByZWdpc3RlciAqLworCVNLX1UxNglQaHlWYWw7CQkvKiBWYWx1ZSB0byB3cml0ZSAqLworfSBCQ09NX0hBQ0s7CisKKy8qIGxvY2FsIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAoZGVmaW5lZChERUJVRykgfHwgKCghZGVmaW5lZChMSU5UKSkgJiYgKCFkZWZpbmVkKFNLX1NMSU0pKSkpCitzdGF0aWMgY29uc3QgY2hhciBTeXNLb25uZWN0RmlsZUlkW10gPQorCSJAKCMpICRJZDogc2t4bWFjMi5jLHYgMS4xMDIgMjAwMy8xMC8wMiAxNjo1Mzo1OCByc2NobWlkdCBFeHAgJCAoQykgTWFydmVsbC4iOworI2VuZGlmCisKKyNpZmRlZiBHRU5FU0lTCitCQ09NX0hBQ0sgQmNvbVJlZ0ExSGFja1tdID0geworIHsgMHgxOCwgMHgwYzIwIH0sIHsgMHgxNywgMHgwMDEyIH0sIHsgMHgxNSwgMHgxMTA0IH0sIHsgMHgxNywgMHgwMDEzIH0sCisgeyAweDE1LCAweDA0MDQgfSwgeyAweDE3LCAweDgwMDYgfSwgeyAweDE1LCAweDAxMzIgfSwgeyAweDE3LCAweDgwMDYgfSwKKyB7IDB4MTUsIDB4MDIzMiB9LCB7IDB4MTcsIDB4ODAwRCB9LCB7IDB4MTUsIDB4MDAwRiB9LCB7IDB4MTgsIDB4MDQyMCB9LAorIHsgMCwgMCB9Cit9OworQkNPTV9IQUNLIEJjb21SZWdDMEhhY2tbXSA9IHsKKyB7IDB4MTgsIDB4MGMyMCB9LCB7IDB4MTcsIDB4MDAxMiB9LCB7IDB4MTUsIDB4MTIwNCB9LCB7IDB4MTcsIDB4MDAxMyB9LAorIHsgMHgxNSwgMHgwQTA0IH0sIHsgMHgxOCwgMHgwNDIwIH0sCisgeyAwLCAwIH0KK307CisjZW5kaWYKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBHRU5FU0lTCitzdGF0aWMgdm9pZAlTa1htSW5pdFBoeVhtYWMoU0tfQUMqLCBTS19JT0MsIGludCwgU0tfQk9PTCk7CitzdGF0aWMgdm9pZAlTa1htSW5pdFBoeUJjb20oU0tfQUMqLCBTS19JT0MsIGludCwgU0tfQk9PTCk7CitzdGF0aWMgaW50CVNrWG1BdXRvTmVnRG9uZVhtYWMoU0tfQUMqLCBTS19JT0MsIGludCk7CitzdGF0aWMgaW50CVNrWG1BdXRvTmVnRG9uZUJjb20oU0tfQUMqLCBTS19JT0MsIGludCk7CisjZW5kaWYgLyogR0VORVNJUyAqLworI2lmZGVmIFlVS09OCitzdGF0aWMgdm9pZAlTa0dtSW5pdFBoeU1hcnYoU0tfQUMqLCBTS19JT0MsIGludCwgU0tfQk9PTCk7CitzdGF0aWMgaW50CVNrR21BdXRvTmVnRG9uZU1hcnYoU0tfQUMqLCBTS19JT0MsIGludCk7CisjZW5kaWYgLyogWVVLT04gKi8KKyNpZmRlZiBPVEhFUl9QSFkKK3N0YXRpYyB2b2lkCVNrWG1Jbml0UGh5TG9uZShTS19BQyosIFNLX0lPQywgaW50LCBTS19CT09MKTsKK3N0YXRpYyB2b2lkCVNrWG1Jbml0UGh5TmF0IChTS19BQyosIFNLX0lPQywgaW50LCBTS19CT09MKTsKK3N0YXRpYyBpbnQJU2tYbUF1dG9OZWdEb25lTG9uZShTS19BQyosIFNLX0lPQywgaW50KTsKK3N0YXRpYyBpbnQJU2tYbUF1dG9OZWdEb25lTmF0IChTS19BQyosIFNLX0lPQywgaW50KTsKKyNlbmRpZiAvKiBPVEhFUl9QSFkgKi8KKworCisjaWZkZWYgR0VORVNJUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrWG1QaHlSZWFkKCkgLSBSZWFkIGZyb20gWE1BQyBQSFkgcmVnaXN0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoJcmVhZHMgYSAxNi1iaXQgd29yZCBmcm9tIFhNQUMgUEhZIG9yIGV4dC4gUEhZCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa1htUGh5UmVhZCgKK1NLX0FDCSpwQUMsCQkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJCS8qIEkvTyBDb250ZXh0ICovCitpbnQJCVBvcnQsCQkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworaW50CQlQaHlSZWcsCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAoT2Zmc2V0KSAqLworU0tfVTE2CVNLX0ZBUiAqcFZhbCkJLyogUG9pbnRlciB0byBWYWx1ZSAqLworeworCVNLX1UxNgkJTW11OworCVNLX0dFUE9SVAkqcFBydDsKKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCQorCS8qIHdyaXRlIHRoZSBQSFkgcmVnaXN0ZXIncyBhZGRyZXNzICovCisJWE1fT1VUMTYoSW9DLCBQb3J0LCBYTV9QSFlfQUREUiwgUGh5UmVnIHwgcFBydC0+UGh5QWRkcik7CisJCisJLyogZ2V0IHRoZSBQSFkgcmVnaXN0ZXIncyB2YWx1ZSAqLworCVhNX0lOMTYoSW9DLCBQb3J0LCBYTV9QSFlfREFUQSwgcFZhbCk7CisJCisJaWYgKHBQcnQtPlBoeVR5cGUgIT0gU0tfUEhZX1hNQUMpIHsKKwkJZG8geworCQkJWE1fSU4xNihJb0MsIFBvcnQsIFhNX01NVV9DTUQsICZNbXUpOworCQkJLyogd2FpdCB1bnRpbCAnUmVhZHknIGlzIHNldCAqLworCQl9IHdoaWxlICgoTW11ICYgWE1fTU1VX1BIWV9SRFkpID09IDApOworCisJCS8qIGdldCB0aGUgUEhZIHJlZ2lzdGVyJ3MgdmFsdWUgKi8KKwkJWE1fSU4xNihJb0MsIFBvcnQsIFhNX1BIWV9EQVRBLCBwVmFsKTsKKwl9Cit9CS8qIFNrWG1QaHlSZWFkICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrWG1QaHlXcml0ZSgpIC0gV3JpdGUgdG8gWE1BQyBQSFkgcmVnaXN0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoJd3JpdGVzIGEgMTYtYml0IHdvcmQgdG8gWE1BQyBQSFkgb3IgZXh0LiBQSFkKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrWG1QaHlXcml0ZSgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJL08gQ29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworaW50CQlQaHlSZWcsCQkvKiBSZWdpc3RlciBBZGRyZXNzIChPZmZzZXQpICovCitTS19VMTYJVmFsKQkJLyogVmFsdWUgKi8KK3sKKwlTS19VMTYJCU1tdTsKKwlTS19HRVBPUlQJKnBQcnQ7CisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKwkKKwlpZiAocFBydC0+UGh5VHlwZSAhPSBTS19QSFlfWE1BQykgeworCQlkbyB7CisJCQlYTV9JTjE2KElvQywgUG9ydCwgWE1fTU1VX0NNRCwgJk1tdSk7CisJCQkvKiB3YWl0IHVudGlsICdCdXN5JyBpcyBjbGVhcmVkICovCisJCX0gd2hpbGUgKChNbXUgJiBYTV9NTVVfUEhZX0JVU1kpICE9IDApOworCX0KKwkKKwkvKiB3cml0ZSB0aGUgUEhZIHJlZ2lzdGVyJ3MgYWRkcmVzcyAqLworCVhNX09VVDE2KElvQywgUG9ydCwgWE1fUEhZX0FERFIsIFBoeVJlZyB8IHBQcnQtPlBoeUFkZHIpOworCQorCS8qIHdyaXRlIHRoZSBQSFkgcmVnaXN0ZXIncyB2YWx1ZSAqLworCVhNX09VVDE2KElvQywgUG9ydCwgWE1fUEhZX0RBVEEsIFZhbCk7CisJCisJaWYgKHBQcnQtPlBoeVR5cGUgIT0gU0tfUEhZX1hNQUMpIHsKKwkJZG8geworCQkJWE1fSU4xNihJb0MsIFBvcnQsIFhNX01NVV9DTUQsICZNbXUpOworCQkJLyogd2FpdCB1bnRpbCAnQnVzeScgaXMgY2xlYXJlZCAqLworCQl9IHdoaWxlICgoTW11ICYgWE1fTU1VX1BIWV9CVVNZKSAhPSAwKTsKKwl9Cit9CS8qIFNrWG1QaHlXcml0ZSAqLworI2VuZGlmIC8qIEdFTkVTSVMgKi8KKworCisjaWZkZWYgWVVLT04KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dtUGh5UmVhZCgpIC0gUmVhZCBmcm9tIEdQSFkgcmVnaXN0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoJcmVhZHMgYSAxNi1iaXQgd29yZCBmcm9tIEdQSFkgdGhyb3VnaCBNRElPCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa0dtUGh5UmVhZCgKK1NLX0FDCSpwQUMsCQkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJCS8qIEkvTyBDb250ZXh0ICovCitpbnQJCVBvcnQsCQkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworaW50CQlQaHlSZWcsCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyAoT2Zmc2V0KSAqLworU0tfVTE2CVNLX0ZBUiAqcFZhbCkJLyogUG9pbnRlciB0byBWYWx1ZSAqLworeworCVNLX1UxNglDdHJsOworCVNLX0dFUE9SVAkqcFBydDsKKyNpZmRlZiBWQ1BVCisJdV9sb25nIFNpbUN5bGU7CisJdV9sb25nIFNpbUxvd1RpbWU7CisJCisJVkNQVWdldFRpbWUoJlNpbUN5bGUsICZTaW1Mb3dUaW1lKTsKKwlWQ1BVcHJpbnRmKDAsICJTa0dtUGh5UmVhZCgldSksIFNpbUN5bGU9JXUsIFNpbUxvd1RpbWU9JXVcbiIsCisJCVBoeVJlZywgU2ltQ3lsZSwgU2ltTG93VGltZSk7CisjZW5kaWYgLyogVkNQVSAqLworCQorCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCQorCS8qIHNldCBQSFktUmVnaXN0ZXIgb2Zmc2V0IGFuZCAnUmVhZCcgT3BDb2RlICg9IDEpICovCisJKnBWYWwgPSAoU0tfVTE2KShHTV9TTUlfQ1RfUEhZX0FEKHBQcnQtPlBoeUFkZHIpIHwKKwkJR01fU01JX0NUX1JFR19BRChQaHlSZWcpIHwgR01fU01JX0NUX09QX1JEKTsKKworCUdNX09VVDE2KElvQywgUG9ydCwgR01fU01JX0NUUkwsICpwVmFsKTsKKworCUdNX0lOMTYoSW9DLCBQb3J0LCBHTV9TTUlfQ1RSTCwgJkN0cmwpOworCQorCS8qIGFkZGl0aW9uYWwgY2hlY2sgZm9yIE1EQy9NRElPIGFjdGl2aXR5ICovCisJaWYgKChDdHJsICYgR01fU01JX0NUX0JVU1kpID09IDApIHsKKwkJKnBWYWwgPSAwOworCQlyZXR1cm47CisJfQorCisJKnBWYWwgfD0gR01fU01JX0NUX0JVU1k7CisJCisJZG8geworI2lmZGVmIFZDUFUKKwkJVkNQVXdhaXRUaW1lKDEwMDApOworI2VuZGlmIC8qIFZDUFUgKi8KKworCQlHTV9JTjE2KElvQywgUG9ydCwgR01fU01JX0NUUkwsICZDdHJsKTsKKworCS8qIHdhaXQgdW50aWwgJ1JlYWRWYWxpZCcgaXMgc2V0ICovCisJfSB3aGlsZSAoQ3RybCA9PSAqcFZhbCk7CisJCisJLyogZ2V0IHRoZSBQSFkgcmVnaXN0ZXIncyB2YWx1ZSAqLworCUdNX0lOMTYoSW9DLCBQb3J0LCBHTV9TTUlfREFUQSwgcFZhbCk7CisKKyNpZmRlZiBWQ1BVCisJVkNQVWdldFRpbWUoJlNpbUN5bGUsICZTaW1Mb3dUaW1lKTsKKwlWQ1BVcHJpbnRmKDAsICJWQ1BVZ2V0VGltZSgpLCBTaW1DeWxlPSV1LCBTaW1Mb3dUaW1lPSV1XG4iLAorCQlTaW1DeWxlLCBTaW1Mb3dUaW1lKTsKKyNlbmRpZiAvKiBWQ1BVICovCisKK30JLyogU2tHbVBoeVJlYWQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHbVBoeVdyaXRlKCkgLSBXcml0ZSB0byBHUEhZIHJlZ2lzdGVyCisgKgorICogRGVzY3JpcHRpb246CXdyaXRlcyBhIDE2LWJpdCB3b3JkIHRvIEdQSFkgdGhyb3VnaCBNRElPCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa0dtUGh5V3JpdGUoCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSS9PIENvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK2ludAkJUGh5UmVnLAkJLyogUmVnaXN0ZXIgQWRkcmVzcyAoT2Zmc2V0KSAqLworU0tfVTE2CVZhbCkJCS8qIFZhbHVlICovCit7CisJU0tfVTE2CUN0cmw7CisJU0tfR0VQT1JUCSpwUHJ0OworI2lmZGVmIFZDUFUKKwlTS19VMzIJRFdvcmQ7CisJdV9sb25nCVNpbUN5bGU7CisJdV9sb25nCVNpbUxvd1RpbWU7CisJCisJVkNQVWdldFRpbWUoJlNpbUN5bGUsICZTaW1Mb3dUaW1lKTsKKwlWQ1BVcHJpbnRmKDAsICJTa0dtUGh5V3JpdGUoUmVnPSV1LCBWYWw9MHglMDR4KSwgU2ltQ3lsZT0ldSwgU2ltTG93VGltZT0ldVxuIiwKKwkJUGh5UmVnLCBWYWwsIFNpbUN5bGUsIFNpbUxvd1RpbWUpOworI2VuZGlmIC8qIFZDUFUgKi8KKwkKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKwkKKwkvKiB3cml0ZSB0aGUgUEhZIHJlZ2lzdGVyJ3MgdmFsdWUgKi8KKwlHTV9PVVQxNihJb0MsIFBvcnQsIEdNX1NNSV9EQVRBLCBWYWwpOworCQorCS8qIHNldCBQSFktUmVnaXN0ZXIgb2Zmc2V0IGFuZCAnV3JpdGUnIE9wQ29kZSAoPSAwKSAqLworCVZhbCA9IEdNX1NNSV9DVF9QSFlfQUQocFBydC0+UGh5QWRkcikgfCBHTV9TTUlfQ1RfUkVHX0FEKFBoeVJlZyk7CisKKwlHTV9PVVQxNihJb0MsIFBvcnQsIEdNX1NNSV9DVFJMLCBWYWwpOworCisJR01fSU4xNihJb0MsIFBvcnQsIEdNX1NNSV9DVFJMLCAmQ3RybCk7CisJCisJLyogYWRkaXRpb25hbCBjaGVjayBmb3IgTURDL01ESU8gYWN0aXZpdHkgKi8KKwlpZiAoKEN0cmwgJiBHTV9TTUlfQ1RfQlVTWSkgPT0gMCkgeworCQlyZXR1cm47CisJfQorCQorCVZhbCB8PSBHTV9TTUlfQ1RfQlVTWTsKKworCWRvIHsKKyNpZmRlZiBWQ1BVCisJCS8qIHJlYWQgVGltZXIgdmFsdWUgKi8KKwkJU0tfSU4zMihJb0MsIEIyX1RJX1ZBTCwgJkRXb3JkKTsKKworCQlWQ1BVd2FpdFRpbWUoMTAwMCk7CisjZW5kaWYgLyogVkNQVSAqLworCisJCUdNX0lOMTYoSW9DLCBQb3J0LCBHTV9TTUlfQ1RSTCwgJkN0cmwpOworCisJLyogd2FpdCB1bnRpbCAnQnVzeScgaXMgY2xlYXJlZCAqLworCX0gd2hpbGUgKEN0cmwgPT0gVmFsKTsKKwkKKyNpZmRlZiBWQ1BVCisJVkNQVWdldFRpbWUoJlNpbUN5bGUsICZTaW1Mb3dUaW1lKTsKKwlWQ1BVcHJpbnRmKDAsICJWQ1BVZ2V0VGltZSgpLCBTaW1DeWxlPSV1LCBTaW1Mb3dUaW1lPSV1XG4iLAorCQlTaW1DeWxlLCBTaW1Mb3dUaW1lKTsKKyNlbmRpZiAvKiBWQ1BVICovCisKK30JLyogU2tHbVBoeVdyaXRlICovCisjZW5kaWYgLyogWVVLT04gKi8KKworCisjaWZkZWYgU0tfRElBRworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR2VQaHlSZWFkKCkgLSBSZWFkIGZyb20gUEhZIHJlZ2lzdGVyCisgKgorICogRGVzY3JpcHRpb246CWNhbGxzIGEgcmVhZCBQSFkgcm91dGluZSBkZXAuIG9uIGJvYXJkIHR5cGUKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrR2VQaHlSZWFkKAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIEkvTyBDb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitpbnQJCVBoeVJlZywJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgKE9mZnNldCkgKi8KK1NLX1UxNgkqcFZhbCkJCS8qIFBvaW50ZXIgdG8gVmFsdWUgKi8KK3sKKwl2b2lkICgqcl9mdW5jKShTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgUG9ydCwgaW50IFJlZywgU0tfVTE2ICpwVmFsKTsKKworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCXJfZnVuYyA9IFNrWG1QaHlSZWFkOworCX0KKwllbHNlIHsKKwkJcl9mdW5jID0gU2tHbVBoeVJlYWQ7CisJfQorCQorCXJfZnVuYyhwQUMsIElvQywgUG9ydCwgUGh5UmVnLCBwVmFsKTsKK30JLyogU2tHZVBoeVJlYWQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHZVBoeVdyaXRlKCkgLSBXcml0ZSB0byBQSFkgcmVnaXN0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoJY2FsbHMgYSB3cml0ZSBQSFkgcm91dGluZSBkZXAuIG9uIGJvYXJkIHR5cGUKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrR2VQaHlXcml0ZSgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJL08gQ29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworaW50CQlQaHlSZWcsCQkvKiBSZWdpc3RlciBBZGRyZXNzIChPZmZzZXQpICovCitTS19VMTYJVmFsKQkJLyogVmFsdWUgKi8KK3sKKwl2b2lkICgqd19mdW5jKShTS19BQyAqcEFDLCBTS19JT0MgSW9DLCBpbnQgUG9ydCwgaW50IFJlZywgU0tfVTE2IFZhbCk7CisKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQl3X2Z1bmMgPSBTa1htUGh5V3JpdGU7CisJfQorCWVsc2UgeworCQl3X2Z1bmMgPSBTa0dtUGh5V3JpdGU7CisJfQorCQorCXdfZnVuYyhwQUMsIElvQywgUG9ydCwgUGh5UmVnLCBWYWwpOworfQkvKiBTa0dlUGh5V3JpdGUgKi8KKyNlbmRpZiAvKiBTS19ESUFHICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrTWFjUHJvbWlzY01vZGUoKSAtIEVuYWJsZSAvIERpc2FibGUgUHJvbWlzY3VvdXMgTW9kZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBlbmFibGVzIC8gZGlzYWJsZXMgcHJvbWlzY3VvdXMgbW9kZSBieSBzZXR0aW5nIE1vZGUgUmVnaXN0ZXIgKFhNQUMpIG9yCisgKiAgIFJlY2VpdmUgQ29udHJvbCBSZWdpc3RlciAoR01BQykgZGVwLiBvbiBib2FyZCB0eXBlICAgCQorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3ZvaWQgU2tNYWNQcm9taXNjTW9kZSgKK1NLX0FDCSpwQUMsCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0LAkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitTS19CT09MCUVuYWJsZSkJLyogRW5hYmxlIC8gRGlzYWJsZSAqLworeworI2lmZGVmIFlVS09OCisJU0tfVTE2CVJjUmVnOworI2VuZGlmCisjaWZkZWYgR0VORVNJUworCVNLX1UzMglNZFJlZzsKKyNlbmRpZgkKKworI2lmZGVmIEdFTkVTSVMKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkKKwkJWE1fSU4zMihJb0MsIFBvcnQsIFhNX01PREUsICZNZFJlZyk7CisJCS8qIGVuYWJsZSBvciBkaXNhYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKwkJaWYgKEVuYWJsZSkgeworCQkJTWRSZWcgfD0gWE1fTURfRU5BX1BST007CisJCX0KKwkJZWxzZSB7CisJCQlNZFJlZyAmPSB+WE1fTURfRU5BX1BST007CisJCX0KKwkJLyogc2V0dXAgTW9kZSBSZWdpc3RlciAqLworCQlYTV9PVVQzMihJb0MsIFBvcnQsIFhNX01PREUsIE1kUmVnKTsKKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJaWYgKHBBQy0+R0luaS5HSVl1a29uKSB7CisJCQorCQlHTV9JTjE2KElvQywgUG9ydCwgR01fUlhfQ1RSTCwgJlJjUmVnKTsKKwkJCisJCS8qIGVuYWJsZSBvciBkaXNhYmxlIHVuaWNhc3QgYW5kIG11bHRpY2FzdCBmaWx0ZXJpbmcgKi8KKwkJaWYgKEVuYWJsZSkgeworCQkJUmNSZWcgJj0gfihHTV9SWENSX1VDRl9FTkEgfCBHTV9SWENSX01DRl9FTkEpOworCQl9CisJCWVsc2UgeworCQkJUmNSZWcgfD0gKEdNX1JYQ1JfVUNGX0VOQSB8IEdNX1JYQ1JfTUNGX0VOQSk7CisJCX0KKwkJLyogc2V0dXAgUmVjZWl2ZSBDb250cm9sIFJlZ2lzdGVyICovCisJCUdNX09VVDE2KElvQywgUG9ydCwgR01fUlhfQ1RSTCwgUmNSZWcpOworCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCit9CS8qIFNrTWFjUHJvbWlzY01vZGUqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa01hY0hhc2hpbmcoKSAtIEVuYWJsZSAvIERpc2FibGUgSGFzaGluZworICoKKyAqIERlc2NyaXB0aW9uOgorICogICBlbmFibGVzIC8gZGlzYWJsZXMgaGFzaGluZyBieSBzZXR0aW5nIE1vZGUgUmVnaXN0ZXIgKFhNQUMpIG9yCisgKiAgIFJlY2VpdmUgQ29udHJvbCBSZWdpc3RlciAoR01BQykgZGVwLiBvbiBib2FyZCB0eXBlCQkKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrTWFjSGFzaGluZygKK1NLX0FDCSpwQUMsCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0LAkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitTS19CT09MCUVuYWJsZSkJLyogRW5hYmxlIC8gRGlzYWJsZSAqLworeworI2lmZGVmIFlVS09OCisJU0tfVTE2CVJjUmVnOworI2VuZGlmCQorI2lmZGVmIEdFTkVTSVMKKwlTS19VMzIJTWRSZWc7CisjZW5kaWYKKworI2lmZGVmIEdFTkVTSVMKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkKKwkJWE1fSU4zMihJb0MsIFBvcnQsIFhNX01PREUsICZNZFJlZyk7CisJCS8qIGVuYWJsZSBvciBkaXNhYmxlIGhhc2hpbmcgKi8KKwkJaWYgKEVuYWJsZSkgeworCQkJTWRSZWcgfD0gWE1fTURfRU5BX0hBU0g7CisJCX0KKwkJZWxzZSB7CisJCQlNZFJlZyAmPSB+WE1fTURfRU5BX0hBU0g7CisJCX0KKwkJLyogc2V0dXAgTW9kZSBSZWdpc3RlciAqLworCQlYTV9PVVQzMihJb0MsIFBvcnQsIFhNX01PREUsIE1kUmVnKTsKKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJaWYgKHBBQy0+R0luaS5HSVl1a29uKSB7CisJCQorCQlHTV9JTjE2KElvQywgUG9ydCwgR01fUlhfQ1RSTCwgJlJjUmVnKTsKKwkJCisJCS8qIGVuYWJsZSBvciBkaXNhYmxlIG11bHRpY2FzdCBmaWx0ZXJpbmcgKi8KKwkJaWYgKEVuYWJsZSkgeworCQkJUmNSZWcgfD0gR01fUlhDUl9NQ0ZfRU5BOworCQl9CisJCWVsc2UgeworCQkJUmNSZWcgJj0gfkdNX1JYQ1JfTUNGX0VOQTsKKwkJfQorCQkvKiBzZXR1cCBSZWNlaXZlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwkJR01fT1VUMTYoSW9DLCBQb3J0LCBHTV9SWF9DVFJMLCBSY1JlZyk7CisJfQorI2VuZGlmIC8qIFlVS09OICovCisKK30JLyogU2tNYWNIYXNoaW5nKi8KKworCisjaWZkZWYgU0tfRElBRworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrWG1TZXRSeENtZCgpIC0gTW9kaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgWE1BQydzIFJ4IENvbW1hbmQgUmVnaXN0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoZSBmZWF0dXJlcworICoJIC0gRkNTIHN0cmlwcGluZywJCQkJCVNLX1NUUklQX0ZDU19PTi9PRkYKKyAqCSAtIHBhZCBieXRlIHN0cmlwcGluZywJCQkJU0tfU1RSSVBfUEFEX09OL09GRgorICoJIC0gZG9uJ3Qgc2V0IFhNUl9GU19FUlIgaW4gc3RhdHVzCVNLX0xFTkVSUl9PS19PTi9PRkYKKyAqCSAgIGZvciBpbnJhbmdlIGxlbmd0aCBlcnJvciBmcmFtZXMKKyAqCSAtIGRvbid0IHNldCBYTVJfRlNfRVJSIGluIHN0YXR1cwlTS19CSUdfUEtfT0tfT04vT0ZGCisgKgkgICBmb3IgZnJhbWVzID4gMTUxNCBieXRlcworICogICAtIGVuYWJsZSBSeCBvZiBvd24gcGFja2V0cyAgICAgICAgIFNLX1NFTEZfUlhfT04vT0ZGCisgKgorICoJZm9yIGluY29taW5nIHBhY2tldHMgbWF5IGJlIGVuYWJsZWQvZGlzYWJsZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAqCUFkZGl0aW9uYWwgbW9kZXMgbWF5IGJlIGFkZGVkIGxhdGVyLgorICoJTXVsdGlwbGUgbW9kZXMgY2FuIGJlIGVuYWJsZWQvZGlzYWJsZWQgYXQgdGhlIHNhbWUgdGltZS4KKyAqCVRoZSBuZXcgY29uZmlndXJhdGlvbiBpcyB3cml0dGVuIHRvIHRoZSBSeCBDb21tYW5kIHJlZ2lzdGVyIGltbWVkaWF0ZWx5LgorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3N0YXRpYyB2b2lkIFNrWG1TZXRSeENtZCgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitpbnQJCU1vZGUpCQkvKiBNb2RlIGlzIFNLX1NUUklQX0ZDU19PTi9PRkYsIFNLX1NUUklQX1BBRF9PTi9PRkYsCisJCQkJCSAgIFNLX0xFTkVSUl9PS19PTi9PRkYsIG9yIFNLX0JJR19QS19PS19PTi9PRkYgKi8KK3sKKwlTS19VMTYJT2xkUnhDbWQ7CisJU0tfVTE2CVJ4Q21kOworCisJWE1fSU4xNihJb0MsIFBvcnQsIFhNX1JYX0NNRCwgJk9sZFJ4Q21kKTsKKworCVJ4Q21kID0gT2xkUnhDbWQ7CisJCisJc3dpdGNoIChNb2RlICYgKFNLX1NUUklQX0ZDU19PTiB8IFNLX1NUUklQX0ZDU19PRkYpKSB7CisJY2FzZSBTS19TVFJJUF9GQ1NfT046CisJCVJ4Q21kIHw9IFhNX1JYX1NUUklQX0ZDUzsKKwkJYnJlYWs7CisJY2FzZSBTS19TVFJJUF9GQ1NfT0ZGOgorCQlSeENtZCAmPSB+WE1fUlhfU1RSSVBfRkNTOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKE1vZGUgJiAoU0tfU1RSSVBfUEFEX09OIHwgU0tfU1RSSVBfUEFEX09GRikpIHsKKwljYXNlIFNLX1NUUklQX1BBRF9PTjoKKwkJUnhDbWQgfD0gWE1fUlhfU1RSSVBfUEFEOworCQlicmVhazsKKwljYXNlIFNLX1NUUklQX1BBRF9PRkY6CisJCVJ4Q21kICY9IH5YTV9SWF9TVFJJUF9QQUQ7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoTW9kZSAmIChTS19MRU5FUlJfT0tfT04gfCBTS19MRU5FUlJfT0tfT0ZGKSkgeworCWNhc2UgU0tfTEVORVJSX09LX09OOgorCQlSeENtZCB8PSBYTV9SWF9MRU5FUlJfT0s7CisJCWJyZWFrOworCWNhc2UgU0tfTEVORVJSX09LX09GRjoKKwkJUnhDbWQgJj0gflhNX1JYX0xFTkVSUl9PSzsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChNb2RlICYgKFNLX0JJR19QS19PS19PTiB8IFNLX0JJR19QS19PS19PRkYpKSB7CisJY2FzZSBTS19CSUdfUEtfT0tfT046CisJCVJ4Q21kIHw9IFhNX1JYX0JJR19QS19PSzsKKwkJYnJlYWs7CisJY2FzZSBTS19CSUdfUEtfT0tfT0ZGOgorCQlSeENtZCAmPSB+WE1fUlhfQklHX1BLX09LOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKE1vZGUgJiAoU0tfU0VMRl9SWF9PTiB8IFNLX1NFTEZfUlhfT0ZGKSkgeworCWNhc2UgU0tfU0VMRl9SWF9PTjoKKwkJUnhDbWQgfD0gWE1fUlhfU0VMRl9SWDsKKwkJYnJlYWs7CisJY2FzZSBTS19TRUxGX1JYX09GRjoKKwkJUnhDbWQgJj0gflhNX1JYX1NFTEZfUlg7CisJCWJyZWFrOworCX0KKworCS8qIFdyaXRlIHRoZSBuZXcgbW9kZSB0byB0aGUgUnggY29tbWFuZCByZWdpc3RlciBpZiByZXF1aXJlZCAqLworCWlmIChPbGRSeENtZCAhPSBSeENtZCkgeworCQlYTV9PVVQxNihJb0MsIFBvcnQsIFhNX1JYX0NNRCwgUnhDbWQpOworCX0KK30JLyogU2tYbVNldFJ4Q21kICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR21TZXRSeENtZCgpIC0gTW9kaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgR01BQydzIFJ4IENvbnRyb2wgUmVnaXN0ZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoZSBmZWF0dXJlcworICoJIC0gRkNTIChDUkMpIHN0cmlwcGluZywJCQkJU0tfU1RSSVBfRkNTX09OL09GRgorICoJIC0gZG9uJ3Qgc2V0IEdNUl9GU19MT05HX0VSUgkJU0tfQklHX1BLX09LX09OL09GRgorICoJICAgZm9yIGZyYW1lcyA+IDE1MTQgYnl0ZXMKKyAqICAgLSBlbmFibGUgUnggb2Ygb3duIHBhY2tldHMgICAgICAgICBTS19TRUxGX1JYX09OL09GRgorICoKKyAqCWZvciBpbmNvbWluZyBwYWNrZXRzIG1heSBiZSBlbmFibGVkL2Rpc2FibGVkIGJ5IHRoaXMgZnVuY3Rpb24uCisgKglBZGRpdGlvbmFsIG1vZGVzIG1heSBiZSBhZGRlZCBsYXRlci4KKyAqCU11bHRpcGxlIG1vZGVzIGNhbiBiZSBlbmFibGVkL2Rpc2FibGVkIGF0IHRoZSBzYW1lIHRpbWUuCisgKglUaGUgbmV3IGNvbmZpZ3VyYXRpb24gaXMgd3JpdHRlbiB0byB0aGUgUnggQ29tbWFuZCByZWdpc3RlciBpbW1lZGlhdGVseS4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCitzdGF0aWMgdm9pZCBTa0dtU2V0UnhDbWQoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworaW50CQlNb2RlKQkJLyogTW9kZSBpcyBTS19TVFJJUF9GQ1NfT04vT0ZGLCBTS19TVFJJUF9QQURfT04vT0ZGLAorCQkJCQkgICBTS19MRU5FUlJfT0tfT04vT0ZGLCBvciBTS19CSUdfUEtfT0tfT04vT0ZGICovCit7CisJU0tfVTE2CU9sZFJ4Q21kOworCVNLX1UxNglSeENtZDsKKworCWlmICgoTW9kZSAmIChTS19TVFJJUF9GQ1NfT04gfCBTS19TVFJJUF9GQ1NfT0ZGKSkgIT0gMCkgeworCQkKKwkJR01fSU4xNihJb0MsIFBvcnQsIEdNX1JYX0NUUkwsICZPbGRSeENtZCk7CisKKwkJUnhDbWQgPSBPbGRSeENtZDsKKworCQlpZiAoKE1vZGUgJiBTS19TVFJJUF9GQ1NfT04pICE9IDApIHsKKwkJCVJ4Q21kIHw9IEdNX1JYQ1JfQ1JDX0RJUzsKKwkJfQorCQllbHNlIHsKKwkJCVJ4Q21kICY9IH5HTV9SWENSX0NSQ19ESVM7CisJCX0KKwkJLyogV3JpdGUgdGhlIG5ldyBtb2RlIHRvIHRoZSBSeCBjb250cm9sIHJlZ2lzdGVyIGlmIHJlcXVpcmVkICovCisJCWlmIChPbGRSeENtZCAhPSBSeENtZCkgeworCQkJR01fT1VUMTYoSW9DLCBQb3J0LCBHTV9SWF9DVFJMLCBSeENtZCk7CisJCX0KKwl9CisKKwlpZiAoKE1vZGUgJiAoU0tfQklHX1BLX09LX09OIHwgU0tfQklHX1BLX09LX09GRikpICE9IDApIHsKKwkJCisJCUdNX0lOMTYoSW9DLCBQb3J0LCBHTV9TRVJJQUxfTU9ERSwgJk9sZFJ4Q21kKTsKKworCQlSeENtZCA9IE9sZFJ4Q21kOworCisJCWlmICgoTW9kZSAmIFNLX0JJR19QS19PS19PTikgIT0gMCkgeworCQkJUnhDbWQgfD0gR01fU01PRF9KVU1CT19FTkE7CisJCX0KKwkJZWxzZSB7CisJCQlSeENtZCAmPSB+R01fU01PRF9KVU1CT19FTkE7CisJCX0KKwkJLyogV3JpdGUgdGhlIG5ldyBtb2RlIHRvIHRoZSBSeCBjb250cm9sIHJlZ2lzdGVyIGlmIHJlcXVpcmVkICovCisJCWlmIChPbGRSeENtZCAhPSBSeENtZCkgeworCQkJR01fT1VUMTYoSW9DLCBQb3J0LCBHTV9TRVJJQUxfTU9ERSwgUnhDbWQpOworCQl9CisJfQorfQkvKiBTa0dtU2V0UnhDbWQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tNYWNTZXRSeENtZCgpIC0gTW9kaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgTUFDJ3MgUnggQ29udHJvbCBSZWdpc3RlcgorICoKKyAqIERlc2NyaXB0aW9uOgltb2RpZmllcyB0aGUgTUFDJ3MgUnggQ29udHJvbCByZWcuIGRlcC4gb24gYm9hcmQgdHlwZQorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3ZvaWQgU2tNYWNTZXRSeENtZCgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitpbnQJCU1vZGUpCQkvKiBSeCBNb2RlICovCit7CisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCisJCVNrWG1TZXRSeENtZChwQUMsIElvQywgUG9ydCwgTW9kZSk7CisJfQorCWVsc2UgeworCQkKKwkJU2tHbVNldFJ4Q21kKHBBQywgSW9DLCBQb3J0LCBNb2RlKTsKKwl9CisKK30JLyogU2tNYWNTZXRSeENtZCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa01hY0NyY0dlbmVyKCkgLSBFbmFibGUgLyBEaXNhYmxlIENSQyBHZW5lcmF0aW9uCisgKgorICogRGVzY3JpcHRpb246CWVuYWJsZXMgLyBkaXNhYmxlcyBDUkMgZ2VuZXJhdGlvbiBkZXAuIG9uIGJvYXJkIHR5cGUKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrTWFjQ3JjR2VuZXIoCitTS19BQwkqcEFDLAkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCwJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworU0tfQk9PTAlFbmFibGUpCS8qIEVuYWJsZSAvIERpc2FibGUgKi8KK3sKKwlTS19VMTYJV29yZDsKKworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQorCQlYTV9JTjE2KElvQywgUG9ydCwgWE1fVFhfQ01ELCAmV29yZCk7CisKKwkJaWYgKEVuYWJsZSkgeworCQkJV29yZCAmPSB+WE1fVFhfTk9fQ1JDOworCQl9CisJCWVsc2UgeworCQkJV29yZCB8PSBYTV9UWF9OT19DUkM7CisJCX0KKwkJLyogc2V0dXAgVHggQ29tbWFuZCBSZWdpc3RlciAqLworCQlYTV9PVVQxNihJb0MsIFBvcnQsIFhNX1RYX0NNRCwgV29yZCk7CisJfQorCWVsc2UgeworCQkKKwkJR01fSU4xNihJb0MsIFBvcnQsIEdNX1RYX0NUUkwsICZXb3JkKTsKKwkJCisJCWlmIChFbmFibGUpIHsKKwkJCVdvcmQgJj0gfkdNX1RYQ1JfQ1JDX0RJUzsKKwkJfQorCQllbHNlIHsKKwkJCVdvcmQgfD0gR01fVFhDUl9DUkNfRElTOworCQl9CisJCS8qIHNldHVwIFR4IENvbnRyb2wgUmVnaXN0ZXIgKi8KKwkJR01fT1VUMTYoSW9DLCBQb3J0LCBHTV9UWF9DVFJMLCBXb3JkKTsKKwl9CisKK30JLyogU2tNYWNDcmNHZW5lciovCisKKyNlbmRpZiAvKiBTS19ESUFHICovCisKKworI2lmZGVmIEdFTkVTSVMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1htQ2xyRXhhY3RBZGRyKCkgLSBDbGVhciBFeGFjdCBNYXRjaCBBZGRyZXNzIFJlZ2lzdGVycworICoKKyAqIERlc2NyaXB0aW9uOgorICoJQWxsIEV4YWN0IE1hdGNoIEFkZHJlc3MgcmVnaXN0ZXJzIG9mIHRoZSBYTUFDICdQb3J0JyB3aWxsIGJlCisgKgljbGVhcmVkIHN0YXJ0aW5nIHdpdGggJ1N0YXJ0TnVtJyB1cCB0byAoYW5kIGluY2x1ZGluZykgdGhlCisgKglFeGFjdCBNYXRjaCBhZGRyZXNzIG51bWJlciBvZiAnU3RvcE51bScuCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa1htQ2xyRXhhY3RBZGRyKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK2ludAkJU3RhcnROdW0sCS8qIEJlZ2luIHdpdGggdGhpcyBBZGRyZXNzIFJlZ2lzdGVyIEluZGV4ICgwLi4xNSkgKi8KK2ludAkJU3RvcE51bSkJLyogU3RvcCBhZnRlciBmaW5pc2hlZCB3aXRoIHRoaXMgUmVnaXN0ZXIgSWR4ICgwLi4xNSkgKi8KK3sKKwlpbnQJCWk7CisJU0tfVTE2CVplcm9BZGRyWzNdID0gezB4MDAwMCwgMHgwMDAwLCAweDAwMDB9OworCisJaWYgKCh1bnNpZ25lZClTdGFydE51bSA+IDE1IHx8ICh1bnNpZ25lZClTdG9wTnVtID4gMTUgfHwKKwkJU3RhcnROdW0gPiBTdG9wTnVtKSB7CisKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9IV0lfRTAwMSwgU0tFUlJfSFdJX0UwMDFNU0cpOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gU3RhcnROdW07IGkgPD0gU3RvcE51bTsgaSsrKSB7CisJCVhNX09VVEFERFIoSW9DLCBQb3J0LCBYTV9FWE0oaSksICZaZXJvQWRkclswXSk7CisJfQorfQkvKiBTa1htQ2xyRXhhY3RBZGRyICovCisjZW5kaWYgLyogR0VORVNJUyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa01hY0ZsdXNoVHhGaWZvKCkgLSBGbHVzaCB0aGUgTUFDJ3MgdHJhbnNtaXQgRklGTworICoKKyAqIERlc2NyaXB0aW9uOgorICoJRmx1c2ggdGhlIHRyYW5zbWl0IEZJRk8gb2YgdGhlIE1BQyBzcGVjaWZpZWQgYnkgdGhlIGluZGV4ICdQb3J0JworICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3ZvaWQgU2tNYWNGbHVzaFR4RmlmbygKK1NLX0FDCSpwQUMsCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisjaWZkZWYgR0VORVNJUworCVNLX1UzMglNZFJlZzsKKworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQorCQlYTV9JTjMyKElvQywgUG9ydCwgWE1fTU9ERSwgJk1kUmVnKTsKKworCQlYTV9PVVQzMihJb0MsIFBvcnQsIFhNX01PREUsIE1kUmVnIHwgWE1fTURfRlRGKTsKKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJaWYgKHBBQy0+R0luaS5HSVl1a29uKSB7CisJCS8qIG5vIHdheSB0byBmbHVzaCB0aGUgRklGTyB3ZSBoYXZlIHRvIGlzc3VlIGEgcmVzZXQgKi8KKwkJLyogVEJEICovCisJfQorI2VuZGlmIC8qIFlVS09OICovCisKK30JLyogU2tNYWNGbHVzaFR4RmlmbyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa01hY0ZsdXNoUnhGaWZvKCkgLSBGbHVzaCB0aGUgTUFDJ3MgcmVjZWl2ZSBGSUZPCisgKgorICogRGVzY3JpcHRpb246CisgKglGbHVzaCB0aGUgcmVjZWl2ZSBGSUZPIG9mIHRoZSBNQUMgc3BlY2lmaWVkIGJ5IHRoZSBpbmRleCAnUG9ydCcKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrTWFjRmx1c2hSeEZpZm8oCitTS19BQwkqcEFDLAkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworI2lmZGVmIEdFTkVTSVMKKwlTS19VMzIJTWRSZWc7CisKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCisJCVhNX0lOMzIoSW9DLCBQb3J0LCBYTV9NT0RFLCAmTWRSZWcpOworCisJCVhNX09VVDMyKElvQywgUG9ydCwgWE1fTU9ERSwgTWRSZWcgfCBYTV9NRF9GUkYpOworCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisJCisjaWZkZWYgWVVLT04KKwlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJLyogbm8gd2F5IHRvIGZsdXNoIHRoZSBGSUZPIHdlIGhhdmUgdG8gaXNzdWUgYSByZXNldCAqLworCQkvKiBUQkQgKi8KKwl9CisjZW5kaWYgLyogWVVLT04gKi8KKworfQkvKiBTa01hY0ZsdXNoUnhGaWZvICovCisKKworI2lmZGVmIEdFTkVTSVMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1htU29mdFJzdCgpIC0gRG8gYSBYTUFDIHNvZnR3YXJlIHJlc2V0CisgKgorICogRGVzY3JpcHRpb246CisgKglUaGUgUEhZIHJlZ2lzdGVycyBzaG91bGQgbm90IGJlIGRlc3Ryb3llZCBkdXJpbmcgdGhpcworICoJa2luZCBvZiBzb2Z0d2FyZSByZXNldC4gVGhlcmVmb3JlIHRoZSBYTUFDIFNvZnR3YXJlIFJlc2V0CisgKgkoWE1fR1BfUkVTX01BQyBiaXQgaW4gWE1fR1BfUE9SVCkgbXVzdCBub3QgYmUgdXNlZCEKKyAqCisgKglUaGUgc29mdHdhcmUgcmVzZXQgaXMgZG9uZSBieQorICoJCS0gZGlzYWJsaW5nIHRoZSBSeCBhbmQgVHggc3RhdGUgbWFjaGluZSwKKyAqCQktIHJlc2V0dGluZyB0aGUgc3RhdGlzdGljcyBtb2R1bGUsCisgKgkJLSBjbGVhciBhbGwgb3RoZXIgc2lnbmlmaWNhbnQgWE1BQyBNb2RlLAorICoJCSAgQ29tbWFuZCwgYW5kIENvbnRyb2wgUmVnaXN0ZXJzCisgKgkJLSBjbGVhcmluZyB0aGUgSGFzaCBSZWdpc3RlciBhbmQgdGhlCisgKgkJICBFeGFjdCBNYXRjaCBBZGRyZXNzIHJlZ2lzdGVycywgYW5kCisgKgkJLSBmbHVzaGluZyB0aGUgWE1BQydzIFJ4IGFuZCBUeCBGSUZPcy4KKyAqCisgKiBOb3RlOgorICoJQW5vdGhlciByZXF1aXJlbWVudCB3aGVuIHN0b3BwaW5nIHRoZSBYTUFDIGlzIHRvCisgKglhdm9pZCBzZW5kaW5nIGNvcnJ1cHRlZCBmcmFtZXMgb24gdGhlIG5ldHdvcmsuCisgKglEaXNhYmxpbmcgdGhlIFR4IHN0YXRlIG1hY2hpbmUgd2lsbCBOT1QgaW50ZXJydXB0CisgKgl0aGUgY3VycmVudGx5IHRyYW5zbWl0dGVkIGZyYW1lLiBCdXQgd2UgbXVzdCB0YWtlIGNhcmUKKyAqCXRoYXQgdGhlIFR4IEZJRk8gaXMgY2xlYXJlZCBBRlRFUiB0aGUgY3VycmVudCBmcmFtZQorICoJaXMgY29tcGxldGUgc2VudCB0byB0aGUgbmV0d29yay4KKyAqCisgKglJdCB0YWtlcyBhYm91dCAxMm5zIHRvIHNlbmQgYSBmcmFtZSB3aXRoIDE1MzggYnl0ZXMuCisgKglPbmUgUENJIGNsb2NrIGdvZXMgYXQgbGVhc3QgMTVucyAoNjZNSHopLiBUaGVyZWZvcmUKKyAqCWFmdGVyIHJlYWRpbmcgWE1fR1BfUE9SVCBiYWNrLCB3ZSBhcmUgc3VyZSB0aGF0IHRoZQorICoJdHJhbnNtaXR0ZXIgaXMgZGlzYWJsZWQgQU5EIGlkbGUuIEFuZCB0aGlzIG1lYW5zCisgKgl3ZSBtYXkgZmx1c2ggdGhlIHRyYW5zbWl0IEZJRk8gbm93LgorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3N0YXRpYyB2b2lkIFNrWG1Tb2Z0UnN0KAorU0tfQUMJKnBBQywJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19VMTYJWmVyb0FkZHJbNF0gPSB7MHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwfTsKKwkKKwkvKiByZXNldCB0aGUgc3RhdGlzdGljcyBtb2R1bGUgKi8KKwlYTV9PVVQzMihJb0MsIFBvcnQsIFhNX0dQX1BPUlQsIFhNX0dQX1JFU19TVEFUKTsKKworCS8qIGRpc2FibGUgYWxsIFhNQUMgSVJRcyAqLworCVhNX09VVDE2KElvQywgUG9ydCwgWE1fSU1TSywgMHhmZmZmKTsKKwkKKwlYTV9PVVQzMihJb0MsIFBvcnQsIFhNX01PREUsIDApOwkJLyogY2xlYXIgTW9kZSBSZWcgKi8KKwkKKwlYTV9PVVQxNihJb0MsIFBvcnQsIFhNX1RYX0NNRCwgMCk7CQkvKiByZXNldCBUWCBDTUQgUmVnICovCisJWE1fT1VUMTYoSW9DLCBQb3J0LCBYTV9SWF9DTUQsIDApOwkJLyogcmVzZXQgUlggQ01EIFJlZyAqLworCQorCS8qIGRpc2FibGUgYWxsIFBIWSBJUlFzICovCisJc3dpdGNoIChwQUMtPkdJbmkuR1BbUG9ydF0uUGh5VHlwZSkgeworCWNhc2UgU0tfUEhZX0JDT006CisJCQlTa1htUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0lOVF9NQVNLLCAweGZmZmYpOworCQkJYnJlYWs7CisjaWZkZWYgT1RIRVJfUEhZCisJCWNhc2UgU0tfUEhZX0xPTkU6CisJCQlTa1htUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9MT05FX0lOVF9FTkFCLCAwKTsKKwkJCWJyZWFrOworCQljYXNlIFNLX1BIWV9OQVQ6CisJCQkvKiB0b2RvOiBOYXRpb25hbAorCQkJIFNrWG1QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX05BVF9JTlRfTUFTSywgMHhmZmZmKTsgKi8KKwkJCWJyZWFrOworI2VuZGlmIC8qIE9USEVSX1BIWSAqLworCX0KKworCS8qIGNsZWFyIHRoZSBIYXNoIFJlZ2lzdGVyICovCisJWE1fT1VUSEFTSChJb0MsIFBvcnQsIFhNX0hTTSwgJlplcm9BZGRyKTsKKworCS8qIGNsZWFyIHRoZSBFeGFjdCBNYXRjaCBBZGRyZXNzIHJlZ2lzdGVycyAqLworCVNrWG1DbHJFeGFjdEFkZHIocEFDLCBJb0MsIFBvcnQsIDAsIDE1KTsKKwkKKwkvKiBjbGVhciB0aGUgU291cmNlIENoZWNrIEFkZHJlc3MgcmVnaXN0ZXJzICovCisJWE1fT1VUSEFTSChJb0MsIFBvcnQsIFhNX1NSQ19DSEssICZaZXJvQWRkcik7CisKK30JLyogU2tYbVNvZnRSc3QgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tYbUhhcmRSc3QoKSAtIERvIGEgWE1BQyBoYXJkd2FyZSByZXNldAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhlIFhNQUMgb2YgdGhlIHNwZWNpZmllZCAnUG9ydCcgYW5kIGFsbCBjb25uZWN0ZWQgZGV2aWNlcworICoJKFBIWSBhbmQgU0VSREVTKSB3aWxsIHJlY2VpdmUgYSByZXNldCBzaWduYWwgb24gaXRzICpSZXNldCBwaW5zLgorICoJRXh0ZXJuYWwgUEhZcyBtdXN0IGJlIHJlc2V0IGJ5IGNsZWFyaW5nIGEgYml0IGluIHRoZSBHUElPIHJlZ2lzdGVyCisgKiAgKFRpbWluZyByZXF1aXJlbWVudHM6IEJyb2FkY29tOiA0MDBucywgTGV2ZWwgT25lOiBub25lLCBOYXRpb25hbDogODBucykuCisgKgorICogQVRURU5USU9OOgorICogCUl0IGlzIGFic29sdXRlbHkgbmVjZXNzYXJ5IHRvIHJlc2V0IHRoZSBTV19SU1QgQml0IGZpcnN0CisgKgliZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3N0YXRpYyB2b2lkIFNrWG1IYXJkUnN0KAorU0tfQUMJKnBBQywJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19VMzIJUmVnOworCWludAkJaTsKKwlpbnQJCVRPdXQ7CisJU0tfVTE2CVdvcmQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCS8qIFRYX01GRl9DVFJMMSBoYXMgMzIgYml0cywgYnV0IG9ubHkgdGhlIGxvd2VzdCAxNiBiaXRzIGFyZSB1c2VkICovCisJCVNLX09VVDE2KElvQywgTVJfQUREUihQb3J0LCBUWF9NRkZfQ1RSTDEpLCBNRkZfQ0xSX01BQ19SU1QpOworCisJCVRPdXQgPSAwOworCQlkbyB7CisJCQlpZiAoVE91dCsrID4gMTAwMDApIHsKKwkJCQkvKgorCQkJCSAqIEFkYXB0ZXIgc2VlbXMgdG8gYmUgaW4gUkVTRVQgc3RhdGUuCisJCQkJICogUmVnaXN0ZXJzIGNhbm5vdCBiZSB3cml0dGVuLgorCQkJCSAqLworCQkJCXJldHVybjsKKwkJCX0KKworCQkJU0tfT1VUMTYoSW9DLCBNUl9BRERSKFBvcnQsIFRYX01GRl9DVFJMMSksIE1GRl9TRVRfTUFDX1JTVCk7CisJCQkKKwkJCVNLX0lOMTYoSW9DLCBNUl9BRERSKFBvcnQsIFRYX01GRl9DVFJMMSksICZXb3JkKTsKKwkJCisJCX0gd2hpbGUgKChXb3JkICYgTUZGX1NFVF9NQUNfUlNUKSA9PSAwKTsKKwl9CisKKwkvKiBGb3IgZXh0ZXJuYWwgUEhZcyB0aGVyZSBtdXN0IGJlIHNwZWNpYWwgaGFuZGxpbmcgKi8KKwlpZiAocEFDLT5HSW5pLkdQW1BvcnRdLlBoeVR5cGUgIT0gU0tfUEhZX1hNQUMpIHsKKwkJCisJCVNLX0lOMzIoSW9DLCBCMl9HUF9JTywgJlJlZyk7CisJCQorCQlpZiAoUG9ydCA9PSAwKSB7CisJCQlSZWcgfD0gR1BfRElSXzA7IAkvKiBzZXQgdG8gb3V0cHV0ICovCisJCQlSZWcgJj0gfkdQX0lPXzA7CS8qIHNldCBQSFkgcmVzZXQgKGFjdGl2ZSBsb3cpICovCisJCX0KKwkJZWxzZSB7CisJCQlSZWcgfD0gR1BfRElSXzI7CS8qIHNldCB0byBvdXRwdXQgKi8KKwkJCVJlZyAmPSB+R1BfSU9fMjsJLyogc2V0IFBIWSByZXNldCAoYWN0aXZlIGxvdykgKi8KKwkJfQorCQkvKiByZXNldCBleHRlcm5hbCBQSFkgKi8KKwkJU0tfT1VUMzIoSW9DLCBCMl9HUF9JTywgUmVnKTsKKworCQkvKiBzaG9ydCBkZWxheSAqLworCQlTS19JTjMyKElvQywgQjJfR1BfSU8sICZSZWcpOworCX0KK30JLyogU2tYbUhhcmRSc3QgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tYbUNsZWFyUnN0KCkgLSBSZWxlYXNlIHRoZSBQSFkgJiBYTUFDIHJlc2V0CisgKgorICogRGVzY3JpcHRpb246CisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLworc3RhdGljIHZvaWQgU2tYbUNsZWFyUnN0KAorU0tfQUMJKnBBQywJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19VMzIJRFdvcmQ7CisJCisJLyogY2xlYXIgSFcgcmVzZXQgKi8KKwlTS19PVVQxNihJb0MsIE1SX0FERFIoUG9ydCwgVFhfTUZGX0NUUkwxKSwgTUZGX0NMUl9NQUNfUlNUKTsKKworCWlmIChwQUMtPkdJbmkuR1BbUG9ydF0uUGh5VHlwZSAhPSBTS19QSFlfWE1BQykgeworCisJCVNLX0lOMzIoSW9DLCBCMl9HUF9JTywgJkRXb3JkKTsKKworCQlpZiAoUG9ydCA9PSAwKSB7CisJCQlEV29yZCB8PSAoR1BfRElSXzAgfCBHUF9JT18wKTsgLyogc2V0IHRvIG91dHB1dCAqLworCQl9CisJCWVsc2UgeworCQkJRFdvcmQgfD0gKEdQX0RJUl8yIHwgR1BfSU9fMik7IC8qIHNldCB0byBvdXRwdXQgKi8KKwkJfQorCQkvKiBDbGVhciBQSFkgcmVzZXQgKi8KKwkJU0tfT1VUMzIoSW9DLCBCMl9HUF9JTywgRFdvcmQpOworCisJCS8qIEVuYWJsZSBHTUlJIGludGVyZmFjZSAqLworCQlYTV9PVVQxNihJb0MsIFBvcnQsIFhNX0hXX0NGRywgWE1fSFdfR01JSV9NRCk7CisJfQorfQkvKiBTa1htQ2xlYXJSc3QgKi8KKyNlbmRpZiAvKiBHRU5FU0lTICovCisKKworI2lmZGVmIFlVS09OCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHbVNvZnRSc3QoKSAtIERvIGEgR01BQyBzb2Z0d2FyZSByZXNldAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhlIEdQSFkgcmVnaXN0ZXJzIHNob3VsZCBub3QgYmUgZGVzdHJveWVkIGR1cmluZyB0aGlzCisgKglraW5kIG9mIHNvZnR3YXJlIHJlc2V0LgorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3N0YXRpYyB2b2lkIFNrR21Tb2Z0UnN0KAorU0tfQUMJKnBBQywJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19VMTYJRW1wdHlIYXNoWzRdID0gezB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMH07CisJU0tfVTE2ICBSeEN0cmw7CisKKwkvKiByZXNldCB0aGUgc3RhdGlzdGljcyBtb2R1bGUgKi8KKworCS8qIGRpc2FibGUgYWxsIEdNQUMgSVJRcyAqLworCVNLX09VVDgoSW9DLCBHTUFDX0lSUV9NU0ssIDApOworCQorCS8qIGRpc2FibGUgYWxsIFBIWSBJUlFzICovCisJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9JTlRfTUFTSywgMCk7CisJCisJLyogY2xlYXIgdGhlIEhhc2ggUmVnaXN0ZXIgKi8KKwlHTV9PVVRIQVNIKElvQywgUG9ydCwgR01fTUNfQUREUl9IMSwgRW1wdHlIYXNoKTsKKworCS8qIEVuYWJsZSBVbmljYXN0IGFuZCBNdWx0aWNhc3QgZmlsdGVyaW5nICovCisJR01fSU4xNihJb0MsIFBvcnQsIEdNX1JYX0NUUkwsICZSeEN0cmwpOworCQorCUdNX09VVDE2KElvQywgUG9ydCwgR01fUlhfQ1RSTCwKKwkJKFNLX1UxNikoUnhDdHJsIHwgR01fUlhDUl9VQ0ZfRU5BIHwgR01fUlhDUl9NQ0ZfRU5BKSk7CisKK30JLyogU2tHbVNvZnRSc3QgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHbUhhcmRSc3QoKSAtIERvIGEgR01BQyBoYXJkd2FyZSByZXNldAorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3N0YXRpYyB2b2lkIFNrR21IYXJkUnN0KAorU0tfQUMJKnBBQywJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19VMzIJRFdvcmQ7CisJCisJLyogV0EgY29kZSBmb3IgQ09NQSBtb2RlICovCisJaWYgKHBBQy0+R0luaS5HSVl1a29uTGl0ZSAmJgorCQlwQUMtPkdJbmkuR0lDaGlwUmV2ID09IENISVBfUkVWX1lVX0xJVEVfQTMpIHsKKwkJCisJCVNLX0lOMzIoSW9DLCBCMl9HUF9JTywgJkRXb3JkKTsKKworCQlEV29yZCB8PSAoR1BfRElSXzkgfCBHUF9JT185KTsKKworCQkvKiBzZXQgUEhZIHJlc2V0ICovCisJCVNLX09VVDMyKElvQywgQjJfR1BfSU8sIERXb3JkKTsKKwl9CisKKwkvKiBzZXQgR1BIWSBDb250cm9sIHJlc2V0ICovCisJU0tfT1VUMzIoSW9DLCBNUl9BRERSKFBvcnQsIEdQSFlfQ1RSTCksIEdQQ19SU1RfU0VUKTsKKworCS8qIHNldCBHTUFDIENvbnRyb2wgcmVzZXQgKi8KKwlTS19PVVQzMihJb0MsIE1SX0FERFIoUG9ydCwgR01BQ19DVFJMKSwgR01DX1JTVF9TRVQpOworCit9CS8qIFNrR21IYXJkUnN0ICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR21DbGVhclJzdCgpIC0gUmVsZWFzZSB0aGUgR1BIWSAmIEdNQUMgcmVzZXQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCitzdGF0aWMgdm9pZCBTa0dtQ2xlYXJSc3QoCitTS19BQwkqcEFDLAkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworCVNLX1UzMglEV29yZDsKKwkKKyNpZmRlZiBYWFgKKwkJLyogY2xlYXIgR01BQyBDb250cm9sIHJlc2V0ICovCisJCVNLX09VVDMyKElvQywgTVJfQUREUihQb3J0LCBHTUFDX0NUUkwpLCBHTUNfUlNUX0NMUik7CisKKwkJLyogc2V0IEdNQUMgQ29udHJvbCByZXNldCAqLworCQlTS19PVVQzMihJb0MsIE1SX0FERFIoUG9ydCwgR01BQ19DVFJMKSwgR01DX1JTVF9TRVQpOworI2VuZGlmIC8qIFhYWCAqLworCisJLyogV0EgY29kZSBmb3IgQ09NQSBtb2RlICovCisJaWYgKHBBQy0+R0luaS5HSVl1a29uTGl0ZSAmJgorCQlwQUMtPkdJbmkuR0lDaGlwUmV2ID09IENISVBfUkVWX1lVX0xJVEVfQTMpIHsKKwkJCisJCVNLX0lOMzIoSW9DLCBCMl9HUF9JTywgJkRXb3JkKTsKKworCQlEV29yZCB8PSBHUF9ESVJfOTsJCS8qIHNldCB0byBvdXRwdXQgKi8KKwkJRFdvcmQgJj0gfkdQX0lPXzk7CQkvKiBjbGVhciBQSFkgcmVzZXQgKGFjdGl2ZSBoaWdoKSAqLworCisJCS8qIGNsZWFyIFBIWSByZXNldCAqLworCQlTS19PVVQzMihJb0MsIEIyX0dQX0lPLCBEV29yZCk7CisJfQorCisJLyogc2V0IEhXQ0ZHX01PREUgKi8KKwlEV29yZCA9IEdQQ19JTlRfUE9MX0hJIHwgR1BDX0RJU19GQyB8IEdQQ19ESVNfU0xFRVAgfAorCQlHUENfRU5BX1hDIHwgR1BDX0FORUdfQURWX0FMTF9NIHwgR1BDX0VOQV9QQVVTRSB8CisJCShwQUMtPkdJbmkuR0lDb3BwZXJUeXBlID8gR1BDX0hXQ0ZHX0dNSUlfQ09QIDoKKwkJR1BDX0hXQ0ZHX0dNSUlfRklCKTsKKworCS8qIHNldCBHUEhZIENvbnRyb2wgcmVzZXQgKi8KKwlTS19PVVQzMihJb0MsIE1SX0FERFIoUG9ydCwgR1BIWV9DVFJMKSwgRFdvcmQgfCBHUENfUlNUX1NFVCk7CisKKwkvKiByZWxlYXNlIEdQSFkgQ29udHJvbCByZXNldCAqLworCVNLX09VVDMyKElvQywgTVJfQUREUihQb3J0LCBHUEhZX0NUUkwpLCBEV29yZCB8IEdQQ19SU1RfQ0xSKTsKKworI2lmZGVmIFZDUFUKKwlWQ3B1V2FpdCg5MDAwKTsKKyNlbmRpZiAvKiBWQ1BVICovCisKKwkvKiBjbGVhciBHTUFDIENvbnRyb2wgcmVzZXQgKi8KKwlTS19PVVQzMihJb0MsIE1SX0FERFIoUG9ydCwgR01BQ19DVFJMKSwgR01DX1BBVVNFX09OIHwgR01DX1JTVF9DTFIpOworCisjaWZkZWYgVkNQVQorCVZDcHVXYWl0KDIwMDApOworCQorCVNLX0lOMzIoSW9DLCBNUl9BRERSKFBvcnQsIEdQSFlfQ1RSTCksICZEV29yZCk7CisJCQkKKwlTS19JTjMyKElvQywgQjBfSVNSQywgJkRXb3JkKTsKKyNlbmRpZiAvKiBWQ1BVICovCisKK30JLyogU2tHbUNsZWFyUnN0ICovCisjZW5kaWYgLyogWVVLT04gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tNYWNTb2Z0UnN0KCkgLSBEbyBhIE1BQyBzb2Z0d2FyZSByZXNldAorICoKKyAqIERlc2NyaXB0aW9uOgljYWxscyBhIE1BQyBzb2Z0d2FyZSByZXNldCByb3V0aW5lIGRlcC4gb24gYm9hcmQgdHlwZQorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3ZvaWQgU2tNYWNTb2Z0UnN0KAorU0tfQUMJKnBBQywJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCS8qIGRpc2FibGUgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyICovCisJU2tNYWNSeFR4RGlzYWJsZShwQUMsIElvQywgUG9ydCk7CisKKyNpZmRlZiBHRU5FU0lTCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCisJCVNrWG1Tb2Z0UnN0KHBBQywgSW9DLCBQb3J0KTsKKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJaWYgKHBBQy0+R0luaS5HSVl1a29uKSB7CisJCQorCQlTa0dtU29mdFJzdChwQUMsIElvQywgUG9ydCk7CisJfQorI2VuZGlmIC8qIFlVS09OICovCisKKwkvKiBmbHVzaCB0aGUgTUFDJ3MgUnggYW5kIFR4IEZJRk9zICovCisJU2tNYWNGbHVzaFR4RmlmbyhwQUMsIElvQywgUG9ydCk7CisJCisJU2tNYWNGbHVzaFJ4RmlmbyhwQUMsIElvQywgUG9ydCk7CisKKwlwUHJ0LT5QU3RhdGUgPSBTS19QUlRfU1RPUDsKKworfQkvKiBTa01hY1NvZnRSc3QgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tNYWNIYXJkUnN0KCkgLSBEbyBhIE1BQyBoYXJkd2FyZSByZXNldAorICoKKyAqIERlc2NyaXB0aW9uOgljYWxscyBhIE1BQyBoYXJkd2FyZSByZXNldCByb3V0aW5lIGRlcC4gb24gYm9hcmQgdHlwZQorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3ZvaWQgU2tNYWNIYXJkUnN0KAorU0tfQUMJKnBBQywJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwkKKyNpZmRlZiBHRU5FU0lTCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCisJCVNrWG1IYXJkUnN0KHBBQywgSW9DLCBQb3J0KTsKKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJaWYgKHBBQy0+R0luaS5HSVl1a29uKSB7CisJCQorCQlTa0dtSGFyZFJzdChwQUMsIElvQywgUG9ydCk7CisJfQorI2VuZGlmIC8qIFlVS09OICovCisKKwlwQUMtPkdJbmkuR1BbUG9ydF0uUFN0YXRlID0gU0tfUFJUX1JFU0VUOworCit9CS8qIFNrTWFjSGFyZFJzdCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa01hY0NsZWFyUnN0KCkgLSBDbGVhciB0aGUgTUFDIHJlc2V0CisgKgorICogRGVzY3JpcHRpb246CWNhbGxzIGEgY2xlYXIgTUFDIHJlc2V0IHJvdXRpbmUgZGVwLiBvbiBib2FyZCB0eXBlCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa01hY0NsZWFyUnN0KAorU0tfQUMJKnBBQywJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwkKKyNpZmRlZiBHRU5FU0lTCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCisJCVNrWG1DbGVhclJzdChwQUMsIElvQywgUG9ydCk7CisJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCWlmIChwQUMtPkdJbmkuR0lZdWtvbikgeworCQkKKwkJU2tHbUNsZWFyUnN0KHBBQywgSW9DLCBQb3J0KTsKKwl9CisjZW5kaWYgLyogWVVLT04gKi8KKworfQkvKiBTa01hY0NsZWFyUnN0ICovCisKKworI2lmZGVmIEdFTkVTSVMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1htSW5pdE1hYygpIC0gSW5pdGlhbGl6ZSB0aGUgWE1BQyBJSQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJSW5pdGlhbGl6ZSB0aGUgWE1BQyBvZiB0aGUgc3BlY2lmaWVkIHBvcnQuCisgKglUaGUgWE1BQyBtdXN0IGJlIHJlc2V0IG9yIHN0b3BwZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBOb3RlOgorICoJVGhlIFhNQUMncyBSeCBhbmQgVHggc3RhdGUgbWFjaGluZSBpcyBzdGlsbCBkaXNhYmxlZCB3aGVuIHJldHVybmluZy4KKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrWG1Jbml0TWFjKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CisJaW50CQkJaTsKKwlTS19VMTYJCVNXb3JkOworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlpZiAocFBydC0+UFN0YXRlID09IFNLX1BSVF9TVE9QKSB7CisJCS8qIFBvcnQgU3RhdGU6IFNLX1BSVF9TVE9QICovCisJCS8qIFZlcmlmeSB0aGF0IHRoZSByZXNldCBiaXQgaXMgY2xlYXJlZCAqLworCQlTS19JTjE2KElvQywgTVJfQUREUihQb3J0LCBUWF9NRkZfQ1RSTDEpLCAmU1dvcmQpOworCisJCWlmICgoU1dvcmQgJiBNRkZfU0VUX01BQ19SU1QpICE9IDApIHsKKwkJCS8qIFBTdGF0ZSBkb2VzIG5vdCBtYXRjaCBIVyBzdGF0ZSAqLworCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9IV0lfRTAwNiwgU0tFUlJfSFdJX0UwMDZNU0cpOworCQkJLyogQ29ycmVjdCBpdCAqLworCQkJcFBydC0+UFN0YXRlID0gU0tfUFJUX1JFU0VUOworCQl9CisJfQorCisJaWYgKHBQcnQtPlBTdGF0ZSA9PSBTS19QUlRfUkVTRVQpIHsKKworCQlTa1htQ2xlYXJSc3QocEFDLCBJb0MsIFBvcnQpOworCisJCWlmIChwUHJ0LT5QaHlUeXBlICE9IFNLX1BIWV9YTUFDKSB7CisJCQkvKiByZWFkIElkIGZyb20gZXh0ZXJuYWwgUEhZIChhbGwgaGF2ZSB0aGUgc2FtZSBhZGRyZXNzKSAqLworCQkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9YTUFDX0lEMSwgJnBQcnQtPlBoeUlkMSk7CisKKwkJCS8qCisJCQkgKiBPcHRpbWl6ZSBNRElPIHRyYW5zZmVyIGJ5IHN1cHByZXNzaW5nIHByZWFtYmxlLgorCQkJICogTXVzdCBiZSBkb25lIEFGVEVSIGZpcnN0IGFjY2VzcyB0byBCQ09NIGNoaXAuCisJCQkgKi8KKwkJCVhNX0lOMTYoSW9DLCBQb3J0LCBYTV9NTVVfQ01ELCAmU1dvcmQpOworCQkJCisJCQlYTV9PVVQxNihJb0MsIFBvcnQsIFhNX01NVV9DTUQsIFNXb3JkIHwgWE1fTU1VX05PX1BSRSk7CisKKwkJCWlmIChwUHJ0LT5QaHlJZDEgPT0gUEhZX0JDT01fSUQxX0MwKSB7CisJCQkJLyoKKwkJCQkgKiBXb3JrYXJvdW5kIEJDT00gRXJyYXRhIGZvciB0aGUgQzAgdHlwZS4KKwkJCQkgKiBXcml0ZSBtYWdpYyBwYXR0ZXJucyB0byByZXNlcnZlZCByZWdpc3RlcnMuCisJCQkJICovCisJCQkJaSA9IDA7CisJCQkJd2hpbGUgKEJjb21SZWdDMEhhY2tbaV0uUGh5UmVnICE9IDApIHsKKwkJCQkJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBCY29tUmVnQzBIYWNrW2ldLlBoeVJlZywKKwkJCQkJCUJjb21SZWdDMEhhY2tbaV0uUGh5VmFsKTsKKwkJCQkJaSsrOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKHBQcnQtPlBoeUlkMSA9PSBQSFlfQkNPTV9JRDFfQTEpIHsKKwkJCQkvKgorCQkJCSAqIFdvcmthcm91bmQgQkNPTSBFcnJhdGEgZm9yIHRoZSBBMSB0eXBlLgorCQkJCSAqIFdyaXRlIG1hZ2ljIHBhdHRlcm5zIHRvIHJlc2VydmVkIHJlZ2lzdGVycy4KKwkJCQkgKi8KKwkJCQlpID0gMDsKKwkJCQl3aGlsZSAoQmNvbVJlZ0ExSGFja1tpXS5QaHlSZWcgIT0gMCkgeworCQkJCQlTa1htUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIEJjb21SZWdBMUhhY2tbaV0uUGh5UmVnLAorCQkJCQkJQmNvbVJlZ0ExSGFja1tpXS5QaHlWYWwpOworCQkJCQlpKys7CisJCQkJfQorCQkJfQorCisJCQkvKgorCQkJICogV29ya2Fyb3VuZCBCQ09NIEVycmF0YSAoIzEwNTIzKSBmb3IgYWxsIEJDb20gUEhZcy4KKwkJCSAqIERpc2FibGUgUG93ZXIgTWFuYWdlbWVudCBhZnRlciByZXNldC4KKwkJCSAqLworCQkJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0FVWF9DVFJMLCAmU1dvcmQpOworCQkJCisJCQlTa1htUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0FVWF9DVFJMLAorCQkJCShTS19VMTYpKFNXb3JkIHwgUEhZX0JfQUNfRElTX1BNKSk7CisKKwkJCS8qIFBIWSBMRUQgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSBpbiBTa0dlWG1pdExFRCgpICovCisJCX0KKworCQkvKiBEdW1teSByZWFkIHRoZSBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyICovCisJCVhNX0lOMTYoSW9DLCBQb3J0LCBYTV9JU1JDLCAmU1dvcmQpOworCQkKKwkJLyoKKwkJICogVGhlIGF1dG8tbmVnb3RpYXRpb24gcHJvY2VzcyBzdGFydHMgaW1tZWRpYXRlbHkgYWZ0ZXIKKwkJICogY2xlYXJpbmcgdGhlIHJlc2V0LiBUaGUgYXV0by1uZWdvdGlhdGlvbiBwcm9jZXNzIHNob3VsZCBiZQorCQkgKiBzdGFydGVkIGJ5IHRoZSBTSVJRLCB0aGVyZWZvcmUgc3RvcCBpdCBoZXJlIGltbWVkaWF0ZWx5LgorCQkgKi8KKwkJU2tNYWNJbml0UGh5KHBBQywgSW9DLCBQb3J0LCBTS19GQUxTRSk7CisKKyNpZmRlZiBURVNUX09OTFkKKwkJLyogdGVtcC4gY29kZTogZW5hYmxlIHNpZ25hbCBkZXRlY3QgKi8KKwkJLyogV0FSTklORzogZG8gbm90IG92ZXJyaWRlIEdNSUkgc2V0dGluZyBhYm92ZSAqLworCQlYTV9PVVQxNihJb0MsIFBvcnQsIFhNX0hXX0NGRywgWE1fSFdfQ09NNFNJRyk7CisjZW5kaWYKKwl9CisKKwkvKgorCSAqIGNvbmZpZ3VyZSB0aGUgWE1BQ3MgU3RhdGlvbiBBZGRyZXNzCisJICogQjJfTUFDXzIgPSB4eCB4eCB4eCB4eCB4eCB4MSBpcyBwcm9ncmFtbWVkIHRvIFhNQUMgQQorCSAqIEIyX01BQ18zID0geHggeHggeHggeHggeHggeDIgaXMgcHJvZ3JhbW1lZCB0byBYTUFDIEIKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCS8qCisJCSAqIFRoZSBmb2xsb3dpbmcgMiBzdGF0ZW1lbnRzIGFyZSB0b2dldGhlciBlbmRpYW5lc3MKKwkJICogaW5kZXBlbmRlbnQuIFJlbWVtYmVyIHRoaXMgd2hlbiBjaGFuZ2luZy4KKwkJICovCisJCVNLX0lOMTYoSW9DLCAoQjJfTUFDXzIgKyBQb3J0ICogOCArIGkgKiAyKSwgJlNXb3JkKTsKKwkJCisJCVhNX09VVDE2KElvQywgUG9ydCwgKFhNX1NBICsgaSAqIDIpLCBTV29yZCk7CisJfQorCisJLyogVHggSW50ZXIgUGFja2V0IEdhcCAoWE1fVFhfSVBHKToJdXNlIGRlZmF1bHQgKi8KKwkvKiBUeCBIaWdoIFdhdGVyIE1hcmsgKFhNX1RYX0hJX1dNKToJdXNlIGRlZmF1bHQgKi8KKwkvKiBUeCBMb3cgV2F0ZXIgTWFyayAoWE1fVFhfTE9fV00pOgl1c2UgZGVmYXVsdCAqLworCS8qIEhvc3QgUmVxdWVzdCBUaHJlc2hvbGQgKFhNX0hUX1RIUik6CXVzZSBkZWZhdWx0ICovCisJLyogUnggUmVxdWVzdCBUaHJlc2hvbGQgKFhNX1JYX1RIUik6CXVzZSBkZWZhdWx0ICovCisJLyogUnggTG93IFdhdGVyIE1hcmsgKFhNX1JYX0xPX1dNKToJdXNlIGRlZmF1bHQgKi8KKworCS8qIGNvbmZpZ3VyZSBSeCBIaWdoIFdhdGVyIE1hcmsgKFhNX1JYX0hJX1dNKSAqLworCVhNX09VVDE2KElvQywgUG9ydCwgWE1fUlhfSElfV00sIFNLX1hNX1JYX0hJX1dNKTsKKworCS8qIENvbmZpZ3VyZSBUeCBSZXF1ZXN0IFRocmVzaG9sZCAqLworCVNXb3JkID0gU0tfWE1fVEhSX1NMOwkJCQkvKiBmb3Igc2luZ2xlIHBvcnQgKi8KKworCWlmIChwQUMtPkdJbmkuR0lNYWNzRm91bmQgPiAxKSB7CisJCXN3aXRjaCAocEFDLT5HSW5pLkdJUG9ydFVzYWdlKSB7CisJCWNhc2UgU0tfUkVEX0xJTks6CisJCQlTV29yZCA9IFNLX1hNX1RIUl9SRURMOwkJLyogcmVkdW5kYW50IGxpbmsgKi8KKwkJCWJyZWFrOworCQljYXNlIFNLX01VTF9MSU5LOgorCQkJU1dvcmQgPSBTS19YTV9USFJfTVVMTDsJCS8qIGxvYWQgYmFsYW5jaW5nICovCisJCQlicmVhazsKKwkJY2FzZSBTS19KVU1CT19MSU5LOgorCQkJU1dvcmQgPSBTS19YTV9USFJfSlVNQk87CS8qIGp1bWJvIGZyYW1lcyAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0hXSV9FMDE0LCBTS0VSUl9IV0lfRTAxNE1TRyk7CisJCQlicmVhazsKKwkJfQorCX0KKwlYTV9PVVQxNihJb0MsIFBvcnQsIFhNX1RYX1RIUiwgU1dvcmQpOworCisJLyogc2V0dXAgcmVnaXN0ZXIgZGVmYXVsdHMgZm9yIHRoZSBUeCBDb21tYW5kIFJlZ2lzdGVyICovCisJWE1fT1VUMTYoSW9DLCBQb3J0LCBYTV9UWF9DTUQsIFhNX1RYX0FVVE9fUEFEKTsKKworCS8qIHNldHVwIHJlZ2lzdGVyIGRlZmF1bHRzIGZvciB0aGUgUnggQ29tbWFuZCBSZWdpc3RlciAqLworCVNXb3JkID0gWE1fUlhfU1RSSVBfRkNTIHwgWE1fUlhfTEVORVJSX09LOworCisJaWYgKHBBQy0+R0luaS5HSVBvcnRVc2FnZSA9PSBTS19KVU1CT19MSU5LKSB7CisJCVNXb3JkIHw9IFhNX1JYX0JJR19QS19PSzsKKwl9CisKKwlpZiAocFBydC0+UExpbmtNb2RlID09IFNLX0xNT0RFX0hBTEYpIHsKKwkJLyoKKwkJICogSWYgaW4gbWFudWFsIGhhbGYgZHVwbGV4IG1vZGUgdGhlIG90aGVyIHNpZGUgbWlnaHQgYmUgaW4KKwkJICogZnVsbCBkdXBsZXggbW9kZSwgc28gaWdub3JlIGlmIGEgY2FycmllciBleHRlbnNpb24gaXMgbm90IHNlZW4KKwkJICogb24gZnJhbWVzIHJlY2VpdmVkCisJCSAqLworCQlTV29yZCB8PSBYTV9SWF9ESVNfQ0VYVDsKKwl9CisJCisJWE1fT1VUMTYoSW9DLCBQb3J0LCBYTV9SWF9DTUQsIFNXb3JkKTsKKworCS8qCisJICogc2V0dXAgcmVnaXN0ZXIgZGVmYXVsdHMgZm9yIHRoZSBNb2RlIFJlZ2lzdGVyCisJICoJLSBEb24ndCBzdHJpcCBlcnJvciBmcmFtZXMgdG8gYXZvaWQgU3RvcmUgJiBGb3J3YXJkCisJICoJICBvbiB0aGUgUnggc2lkZS4KKwkgKgktIEVuYWJsZSAnQ2hlY2sgU3RhdGlvbiBBZGRyZXNzJyBiaXQKKwkgKgktIEVuYWJsZSAnQ2hlY2sgQWRkcmVzcyBBcnJheScgYml0CisJICovCisJWE1fT1VUMzIoSW9DLCBQb3J0LCBYTV9NT0RFLCBYTV9ERUZfTU9ERSk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIFJlY2VpdmUgQ291bnRlciBFdmVudCBNYXNrIChYTV9SWF9FVl9NU0spCisJICoJLSBFbmFibGUgYWxsIGJpdHMgZXhjZXB0aW5nICdPY3RldHMgUnggT0sgTG93IENudE92JworCSAqCSAgYW5kICdPY3RldHMgUnggT0sgSGkgQ250IE92Jy4KKwkgKi8KKwlYTV9PVVQzMihJb0MsIFBvcnQsIFhNX1JYX0VWX01TSywgWE1SX0RFRl9NU0spOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBUcmFuc21pdCBDb3VudGVyIEV2ZW50IE1hc2sgKFhNX1RYX0VWX01TSykKKwkgKgktIEVuYWJsZSBhbGwgYml0cyBleGNlcHRpbmcgJ09jdGV0cyBUeCBPSyBMb3cgQ250T3YnCisJICoJICBhbmQgJ09jdGV0cyBUeCBPSyBIaSBDbnQgT3YnLgorCSAqLworCVhNX09VVDMyKElvQywgUG9ydCwgWE1fVFhfRVZfTVNLLCBYTVRfREVGX01TSyk7CisKKwkvKgorCSAqIERvIE5PVCBpbml0IFhNQUMgaW50ZXJydXB0IG1hc2sgaGVyZS4KKwkgKiBBbGwgaW50ZXJydXB0cyByZW1haW4gZGlzYWJsZSB1bnRpbCBsaW5rIGNvbWVzIHVwIQorCSAqLworCisJLyoKKwkgKiBBbnkgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGNoYW5nZXMgbWF5IGJlIGRvbmUgbm93LgorCSAqIFRoZSBsYXN0IGFjdGlvbiBpcyB0byBlbmFibGUgdGhlIFJ4IGFuZCBUeCBzdGF0ZSBtYWNoaW5lLgorCSAqIFRoaXMgc2hvdWxkIGJlIGRvbmUgYWZ0ZXIgdGhlIGF1dG8tbmVnb3RpYXRpb24gcHJvY2VzcworCSAqIGhhcyBiZWVuIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisJICovCit9CS8qIFNrWG1Jbml0TWFjICovCisjZW5kaWYgLyogR0VORVNJUyAqLworCisKKyNpZmRlZiBZVUtPTgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR21Jbml0TWFjKCkgLSBJbml0aWFsaXplIHRoZSBHTUFDCisgKgorICogRGVzY3JpcHRpb246CisgKglJbml0aWFsaXplIHRoZSBHTUFDIG9mIHRoZSBzcGVjaWZpZWQgcG9ydC4KKyAqCVRoZSBHTUFDIG11c3QgYmUgcmVzZXQgb3Igc3RvcHBlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIE5vdGU6CisgKglUaGUgR01BQydzIFJ4IGFuZCBUeCBzdGF0ZSBtYWNoaW5lIGlzIHN0aWxsIGRpc2FibGVkIHdoZW4gcmV0dXJuaW5nLgorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3ZvaWQgU2tHbUluaXRNYWMoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworCVNLX0dFUE9SVAkqcFBydDsKKwlpbnQJCQlpOworCVNLX1UxNgkJU1dvcmQ7CisJU0tfVTMyCQlEV29yZDsKKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJaWYgKHBQcnQtPlBTdGF0ZSA9PSBTS19QUlRfU1RPUCkgeworCQkvKiBQb3J0IFN0YXRlOiBTS19QUlRfU1RPUCAqLworCQkvKiBWZXJpZnkgdGhhdCB0aGUgcmVzZXQgYml0IGlzIGNsZWFyZWQgKi8KKwkJU0tfSU4zMihJb0MsIE1SX0FERFIoUG9ydCwgR01BQ19DVFJMKSwgJkRXb3JkKTsKKwkJCisJCWlmICgoRFdvcmQgJiBHTUNfUlNUX1NFVCkgIT0gMCkgeworCQkJLyogUFN0YXRlIGRvZXMgbm90IG1hdGNoIEhXIHN0YXRlICovCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0hXSV9FMDA2LCBTS0VSUl9IV0lfRTAwNk1TRyk7CisJCQkvKiBDb3JyZWN0IGl0ICovCisJCQlwUHJ0LT5QU3RhdGUgPSBTS19QUlRfUkVTRVQ7CisJCX0KKwl9CisKKwlpZiAocFBydC0+UFN0YXRlID09IFNLX1BSVF9SRVNFVCkgeworCQkKKwkJU2tHbUhhcmRSc3QocEFDLCBJb0MsIFBvcnQpOworCisJCVNrR21DbGVhclJzdChwQUMsIElvQywgUG9ydCk7CisJCQorCQkvKiBBdXRvLW5lZ290aWF0aW9uID8gKi8KKwkJaWYgKHBQcnQtPlBMaW5rTW9kZSA9PSBTS19MTU9ERV9IQUxGIHx8IHBQcnQtPlBMaW5rTW9kZSA9PSBTS19MTU9ERV9GVUxMKSB7CisJCQkvKiBBdXRvLW5lZ290aWF0aW9uIGRpc2FibGVkICovCisKKwkJCS8qIGdldCBHZW5lcmFsIFB1cnBvc2UgQ29udHJvbCAqLworCQkJR01fSU4xNihJb0MsIFBvcnQsIEdNX0dQX0NUUkwsICZTV29yZCk7CisKKwkJCS8qIGRpc2FibGUgYXV0by11cGRhdGUgZm9yIHNwZWVkLCBkdXBsZXggYW5kIGZsb3ctY29udHJvbCAqLworCQkJU1dvcmQgfD0gR01fR1BDUl9BVV9BTExfRElTOworCQkJCisJCQkvKiBzZXR1cCBHZW5lcmFsIFB1cnBvc2UgQ29udHJvbCBSZWdpc3RlciAqLworCQkJR01fT1VUMTYoSW9DLCBQb3J0LCBHTV9HUF9DVFJMLCBTV29yZCk7CisJCQkKKwkJCVNXb3JkID0gR01fR1BDUl9BVV9BTExfRElTOworCQl9CisJCWVsc2UgeworCQkJU1dvcmQgPSAwOworCQl9CisKKwkJLyogc3BlZWQgc2V0dGluZ3MgKi8KKwkJc3dpdGNoIChwUHJ0LT5QTGlua1NwZWVkKSB7CisJCWNhc2UgU0tfTFNQRUVEX0FVVE86CisJCWNhc2UgU0tfTFNQRUVEXzEwMDBNQlBTOgorCQkJU1dvcmQgfD0gR01fR1BDUl9TUEVFRF8xMDAwIHwgR01fR1BDUl9TUEVFRF8xMDA7CisJCQlicmVhazsKKwkJY2FzZSBTS19MU1BFRURfMTAwTUJQUzoKKwkJCVNXb3JkIHw9IEdNX0dQQ1JfU1BFRURfMTAwOworCQkJYnJlYWs7CisJCWNhc2UgU0tfTFNQRUVEXzEwTUJQUzoKKwkJCWJyZWFrOworCQl9CisKKwkJLyogZHVwbGV4IHNldHRpbmdzICovCisJCWlmIChwUHJ0LT5QTGlua01vZGUgIT0gU0tfTE1PREVfSEFMRikgeworCQkJLyogc2V0IGZ1bGwgZHVwbGV4ICovCisJCQlTV29yZCB8PSBHTV9HUENSX0RVUF9GVUxMOworCQl9CisKKwkJLyogZmxvdy1jb250cm9sIHNldHRpbmdzICovCisJCXN3aXRjaCAocFBydC0+UEZsb3dDdHJsTW9kZSkgeworCQljYXNlIFNLX0ZMT1dfTU9ERV9OT05FOgorCQkJLyogc2V0IFBhdXNlIE9mZiAqLworCQkJU0tfT1VUMzIoSW9DLCBNUl9BRERSKFBvcnQsIEdNQUNfQ1RSTCksIEdNQ19QQVVTRV9PRkYpOworCQkJLyogZGlzYWJsZSBUeCAmIFJ4IGZsb3ctY29udHJvbCAqLworCQkJU1dvcmQgfD0gR01fR1BDUl9GQ19UWF9ESVMgfCBHTV9HUENSX0ZDX1JYX0RJUyB8IEdNX0dQQ1JfQVVfRkNUX0RJUzsKKwkJCWJyZWFrOworCQljYXNlIFNLX0ZMT1dfTU9ERV9MT0NfU0VORDoKKwkJCS8qIGRpc2FibGUgUnggZmxvdy1jb250cm9sICovCisJCQlTV29yZCB8PSBHTV9HUENSX0ZDX1JYX0RJUyB8IEdNX0dQQ1JfQVVfRkNUX0RJUzsKKwkJCWJyZWFrOworCQljYXNlIFNLX0ZMT1dfTU9ERV9TWU1NRVRSSUM6CisJCWNhc2UgU0tfRkxPV19NT0RFX1NZTV9PUl9SRU06CisJCQkvKiBlbmFibGUgVHggJiBSeCBmbG93LWNvbnRyb2wgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJLyogc2V0dXAgR2VuZXJhbCBQdXJwb3NlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwkJR01fT1VUMTYoSW9DLCBQb3J0LCBHTV9HUF9DVFJMLCBTV29yZCk7CisKKwkJLyogZHVtbXkgcmVhZCB0aGUgSW50ZXJydXB0IFNvdXJjZSBSZWdpc3RlciAqLworCQlTS19JTjE2KElvQywgR01BQ19JUlFfU1JDLCAmU1dvcmQpOworCQkKKyNpZm5kZWYgVkNQVQorCQkvKiByZWFkIElkIGZyb20gUEhZICovCisJCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9JRDEsICZwUHJ0LT5QaHlJZDEpOworCQkKKwkJU2tHbUluaXRQaHlNYXJ2KHBBQywgSW9DLCBQb3J0LCBTS19GQUxTRSk7CisjZW5kaWYgLyogVkNQVSAqLworCX0KKworCSh2b2lkKVNrR21SZXNldENvdW50ZXIocEFDLCBJb0MsIFBvcnQpOworCisJLyogc2V0dXAgVHJhbnNtaXQgQ29udHJvbCBSZWdpc3RlciAqLworCUdNX09VVDE2KElvQywgUG9ydCwgR01fVFhfQ1RSTCwgVFhfQ09MX1RIUihwUHJ0LT5QTWFjQ29sVGhyZXMpKTsKKworCS8qIHNldHVwIFJlY2VpdmUgQ29udHJvbCBSZWdpc3RlciAqLworCUdNX09VVDE2KElvQywgUG9ydCwgR01fUlhfQ1RSTCwgR01fUlhDUl9VQ0ZfRU5BIHwgR01fUlhDUl9NQ0ZfRU5BIHwKKwkJR01fUlhDUl9DUkNfRElTKTsKKworCS8qIHNldHVwIFRyYW5zbWl0IEZsb3cgQ29udHJvbCBSZWdpc3RlciAqLworCUdNX09VVDE2KElvQywgUG9ydCwgR01fVFhfRkxPV19DVFJMLCAweGZmZmYpOworCisJLyogc2V0dXAgVHJhbnNtaXQgUGFyYW1ldGVyIFJlZ2lzdGVyICovCisjaWZkZWYgVkNQVQorCUdNX0lOMTYoSW9DLCBQb3J0LCBHTV9UWF9QQVJBTSwgJlNXb3JkKTsKKyNlbmRpZiAvKiBWQ1BVICovCisKKyAgICBTV29yZCA9IFRYX0pBTV9MRU5fVkFMKHBQcnQtPlBNYWNKYW1MZW4pIHwKKwkJCVRYX0pBTV9JUEdfVkFMKHBQcnQtPlBNYWNKYW1JcGdWYWwpIHwKKwkJCVRYX0lQR19KQU1fREFUQShwUHJ0LT5QTWFjSmFtSXBnRGF0YSk7CisJCisJR01fT1VUMTYoSW9DLCBQb3J0LCBHTV9UWF9QQVJBTSwgU1dvcmQpOworCisJLyogY29uZmlndXJlIHRoZSBTZXJpYWwgTW9kZSBSZWdpc3RlciAqLworI2lmZGVmIFZDUFUKKwlHTV9JTjE2KElvQywgUG9ydCwgR01fU0VSSUFMX01PREUsICZTV29yZCk7CisjZW5kaWYgLyogVkNQVSAqLworCQorCVNXb3JkID0gR01fU01PRF9WTEFOX0VOQSB8IElQR19EQVRBX1ZBTChwUHJ0LT5QTWFjSXBnRGF0YSk7CisKKwlpZiAocFBydC0+UE1hY0xpbWl0NCkgeworCQkvKiByZXNldCBvZiBjb2xsaXNpb24gY291bnRlciBhZnRlciA0IGNvbnNlY3V0aXZlIGNvbGxpc2lvbnMgKi8KKwkJU1dvcmQgfD0gR01fU01PRF9MSU1JVF80OworCX0KKworCWlmIChwQUMtPkdJbmkuR0lQb3J0VXNhZ2UgPT0gU0tfSlVNQk9fTElOSykgeworCQkvKiBlbmFibGUganVtYm8gbW9kZSAoTWF4LiBGcmFtZSBMZW5ndGggPSA5MDE4KSAqLworCQlTV29yZCB8PSBHTV9TTU9EX0pVTUJPX0VOQTsKKwl9CisJCisJR01fT1VUMTYoSW9DLCBQb3J0LCBHTV9TRVJJQUxfTU9ERSwgU1dvcmQpOworCQorCS8qCisJICogY29uZmlndXJlIHRoZSBHTUFDcyBTdGF0aW9uIEFkZHJlc3NlcworCSAqIGluIFBST00geW91IGNhbiBmaW5kIG91ciBhZGRyZXNzZXMgYXQ6CisJICogQjJfTUFDXzEgPSB4eCB4eCB4eCB4eCB4eCB4MCB2aXJ0dWFsIGFkZHJlc3MKKwkgKiBCMl9NQUNfMiA9IHh4IHh4IHh4IHh4IHh4IHgxIGlzIHByb2dyYW1tZWQgdG8gR01BQyBBCisJICogQjJfTUFDXzMgPSB4eCB4eCB4eCB4eCB4eCB4MiBpcyByZXNlcnZlZCBmb3IgRHVhbFBvcnQKKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJLyoKKwkJICogVGhlIGZvbGxvd2luZyAyIHN0YXRlbWVudHMgYXJlIHRvZ2V0aGVyIGVuZGlhbmVzcworCQkgKiBpbmRlcGVuZGVudC4gUmVtZW1iZXIgdGhpcyB3aGVuIGNoYW5naW5nLgorCQkgKi8KKwkJLyogcGh5c2ljYWwgYWRkcmVzczogd2lsbCBiZSB1c2VkIGZvciBwYXVzZSBmcmFtZXMgKi8KKwkJU0tfSU4xNihJb0MsIChCMl9NQUNfMiArIFBvcnQgKiA4ICsgaSAqIDIpLCAmU1dvcmQpOworCisjaWZkZWYgV0FfREVWXzE2CisJCS8qIFdBIGZvciBkZXZpYXRpb24gIzE2ICovCisJCWlmIChwQUMtPkdJbmkuR0lDaGlwSWQgPT0gQ0hJUF9JRF9ZVUtPTiAmJiBwQUMtPkdJbmkuR0lDaGlwUmV2ID09IDApIHsKKwkJCS8qIHN3YXAgdGhlIGFkZHJlc3MgYnl0ZXMgKi8KKwkJCVNXb3JkID0gKChTV29yZCAmIDB4ZmYwMCkgPj4gOCkJfCAoKFNXb3JkICYgMHgwMGZmKSA8PCA4KTsKKworCQkJLyogd3JpdGUgdG8gcmVnaXN0ZXIgaW4gcmV2ZXJzZWQgb3JkZXIgKi8KKwkJCUdNX09VVDE2KElvQywgUG9ydCwgKEdNX1NSQ19BRERSXzFMICsgKDIgLSBpKSAqIDQpLCBTV29yZCk7CisJCX0KKwkJZWxzZSB7CisJCQlHTV9PVVQxNihJb0MsIFBvcnQsIChHTV9TUkNfQUREUl8xTCArIGkgKiA0KSwgU1dvcmQpOworCQl9CisjZWxzZQkJCisJCUdNX09VVDE2KElvQywgUG9ydCwgKEdNX1NSQ19BRERSXzFMICsgaSAqIDQpLCBTV29yZCk7CisjZW5kaWYgLyogV0FfREVWXzE2ICovCisJCQorCQkvKiB2aXJ0dWFsIGFkZHJlc3M6IHdpbGwgYmUgdXNlZCBmb3IgZGF0YSAqLworCQlTS19JTjE2KElvQywgKEIyX01BQ18xICsgUG9ydCAqIDggKyBpICogMiksICZTV29yZCk7CisKKwkJR01fT1VUMTYoSW9DLCBQb3J0LCAoR01fU1JDX0FERFJfMkwgKyBpICogNCksIFNXb3JkKTsKKwkJCisJCS8qIHJlc2V0IE11bHRpY2FzdCBmaWx0ZXJpbmcgSGFzaCByZWdpc3RlcnMgMS0zICovCisJCUdNX09VVDE2KElvQywgUG9ydCwgR01fTUNfQUREUl9IMSArIDQqaSwgMCk7CisJfQorCisJLyogcmVzZXQgTXVsdGljYXN0IGZpbHRlcmluZyBIYXNoIHJlZ2lzdGVyIDQgKi8KKwlHTV9PVVQxNihJb0MsIFBvcnQsIEdNX01DX0FERFJfSDQsIDApOworCisJLyogZW5hYmxlIGludGVycnVwdCBtYXNrIGZvciBjb3VudGVyIG92ZXJmbG93cyAqLworCUdNX09VVDE2KElvQywgUG9ydCwgR01fVFhfSVJRX01TSywgMCk7CisJR01fT1VUMTYoSW9DLCBQb3J0LCBHTV9SWF9JUlFfTVNLLCAwKTsKKwlHTV9PVVQxNihJb0MsIFBvcnQsIEdNX1RSX0lSUV9NU0ssIDApOworCisjaWYgZGVmaW5lZChTS19ESUFHKSB8fCBkZWZpbmVkKERFQlVHKQorCS8qIHJlYWQgR2VuZXJhbCBQdXJwb3NlIFN0YXR1cyAqLworCUdNX0lOMTYoSW9DLCBQb3J0LCBHTV9HUF9TVEFULCAmU1dvcmQpOworCQorCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJNQUMgU3RhdCBSZWcuPTB4JTA0WFxuIiwgU1dvcmQpKTsKKyNlbmRpZiAvKiBTS19ESUFHIHx8IERFQlVHICovCisKKyNpZmRlZiBTS19ESUFHCisJY19wcmludCgiTUFDIFN0YXQgUmVnPTB4JTA0WFxuIiwgU1dvcmQpOworI2VuZGlmIC8qIFNLX0RJQUcgKi8KKworfQkvKiBTa0dtSW5pdE1hYyAqLworI2VuZGlmIC8qIFlVS09OICovCisKKworI2lmZGVmIEdFTkVTSVMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1htSW5pdER1cE1kKCkgLSBJbml0aWFsaXplIHRoZSBYTUFDcyBEdXBsZXggTW9kZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgWE1BQ3MgRHVwbGV4IE1vZGUuCisgKglJdCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHN1Y2Nlc3NmdWxseSBmaW5pc2hpbmcKKyAqCXRoZSBBdXRvLW5lZ290aWF0aW9uIFByb2Nlc3MKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrWG1Jbml0RHVwTWQoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworCXN3aXRjaCAocEFDLT5HSW5pLkdQW1BvcnRdLlBMaW5rTW9kZVN0YXR1cykgeworCWNhc2UgU0tfTE1PREVfU1RBVF9BVVRPSEFMRjoKKwljYXNlIFNLX0xNT0RFX1NUQVRfSEFMRjoKKwkJLyogQ29uZmlndXJhdGlvbiBBY3Rpb25zIGZvciBIYWxmIER1cGxleCBNb2RlICovCisJCS8qCisJCSAqIFhNX0JVUlNUID0gZGVmYXVsdCB2YWx1ZS4gV2UgYXJlIHByb2JhYmxlIG5vdCBxdWljaworCQkgKiAJZW5vdWdoIGF0IHRoZSAnWE1BQycgYnVzIHRvIGJ1cnN0IDhrQi4KKwkJICoJVGhlIFhNQUMgc3RvcHMgYnVyc3RpbmcgaWYgbm8gdHJhbnNtaXQgZnJhbWVzCisJCSAqCWFyZSBhdmFpbGFibGUgb3IgdGhlIGJ1cnN0IGxpbWl0IGlzIGV4Y2VlZGVkLgorCQkgKi8KKwkJLyogWE1fVFhfUlRfTElNID0gZGVmYXVsdCB2YWx1ZSAoMTUpICovCisJCS8qIFhNX1RYX1NUSU1FID0gZGVmYXVsdCB2YWx1ZSAoMHhmZiA9IDQwOTYgYml0IHRpbWVzKSAqLworCQlicmVhazsKKwljYXNlIFNLX0xNT0RFX1NUQVRfQVVUT0ZVTEw6CisJY2FzZSBTS19MTU9ERV9TVEFUX0ZVTEw6CisJCS8qIENvbmZpZ3VyYXRpb24gQWN0aW9ucyBmb3IgRnVsbCBEdXBsZXggTW9kZSAqLworCQkvKgorCQkgKiBUaGUgZHVwbGV4IG1vZGUgaXMgY29uZmlndXJlZCBieSB0aGUgUEhZLAorCQkgKiB0aGVyZWZvcmUgaXQgc2VlbXMgdG8gYmUgdGhhdCB0aGVyZSBpcyBub3RoaW5nCisJCSAqIHRvIGRvIGhlcmUuCisJCSAqLworCQlicmVhazsKKwljYXNlIFNLX0xNT0RFX1NUQVRfVU5LTk9XTjoKKwlkZWZhdWx0OgorCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1csIFNLRVJSX0hXSV9FMDA3LCBTS0VSUl9IV0lfRTAwN01TRyk7CisJCWJyZWFrOworCX0KK30JLyogU2tYbUluaXREdXBNZCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1htSW5pdFBhdXNlTWQoKSAtIGluaXRpYWxpemUgdGhlIFBhdXNlIE1vZGUgdG8gYmUgdXNlZCBmb3IgdGhpcyBwb3J0CisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBQYXVzZSBNb2RlIHdoaWNoIHNob3VsZAorICoJYmUgdXNlZCBmb3IgdGhpcyBwb3J0LgorICoJSXQgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBzdWNjZXNzZnVsbHkgZmluaXNoaW5nCisgKgl0aGUgQXV0by1uZWdvdGlhdGlvbiBQcm9jZXNzCisgKgorICogUmV0dXJuczoKKyAqCW5vdGhpbmcKKyAqLwordm9pZCBTa1htSW5pdFBhdXNlTWQoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworCVNLX0dFUE9SVAkqcFBydDsKKwlTS19VMzIJCURXb3JkOworCVNLX1UxNgkJV29yZDsKKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJWE1fSU4xNihJb0MsIFBvcnQsIFhNX01NVV9DTUQsICZXb3JkKTsKKwkKKwlpZiAocFBydC0+UEZsb3dDdHJsU3RhdHVzID09IFNLX0ZMT1dfU1RBVF9OT05FIHx8CisJCXBQcnQtPlBGbG93Q3RybFN0YXR1cyA9PSBTS19GTE9XX1NUQVRfTE9DX1NFTkQpIHsKKworCQkvKiBEaXNhYmxlIFBhdXNlIEZyYW1lIFJlY2VwdGlvbiAqLworCQlXb3JkIHw9IFhNX01NVV9JR05fUEY7CisJfQorCWVsc2UgeworCQkvKgorCQkgKiBlbmFibGluZyBwYXVzZSBmcmFtZSByZWNlcHRpb24gaXMgcmVxdWlyZWQgZm9yIDEwMDBCVAorCQkgKiBiZWNhdXNlIHRoZSBYTUFDIGlzIG5vdCByZXNldCBpZiB0aGUgbGluayBpcyBnb2luZyBkb3duCisJCSAqLworCQkvKiBFbmFibGUgUGF1c2UgRnJhbWUgUmVjZXB0aW9uICovCisJCVdvcmQgJj0gflhNX01NVV9JR05fUEY7CisJfQkKKwkKKwlYTV9PVVQxNihJb0MsIFBvcnQsIFhNX01NVV9DTUQsIFdvcmQpOworCisJWE1fSU4zMihJb0MsIFBvcnQsIFhNX01PREUsICZEV29yZCk7CisKKwlpZiAocFBydC0+UEZsb3dDdHJsU3RhdHVzID09IFNLX0ZMT1dfU1RBVF9TWU1NRVRSSUMgfHwKKwkJcFBydC0+UEZsb3dDdHJsU3RhdHVzID09IFNLX0ZMT1dfU1RBVF9MT0NfU0VORCkgeworCisJCS8qCisJCSAqIENvbmZpZ3VyZSBQYXVzZSBGcmFtZSBHZW5lcmF0aW9uCisJCSAqIFVzZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgUGF1c2UgRnJhbWUgR2VuZXJhdGlvbi4KKwkJICogU2VuZGluZyBwYXVzZSBmcmFtZXMgaXMgZWRnZSB0cmlnZ2VyZWQuCisJCSAqIFNlbmQgYSBQYXVzZSBmcmFtZSB3aXRoIHRoZSBtYXhpbXVtIHBhdXNlIHRpbWUgaWYKKwkJICogaW50ZXJuYWwgb2RlciBleHRlcm5hbCBGSUZPIGZ1bGwgY29uZGl0aW9uIG9jY3Vycy4KKwkJICogU2VuZCBhIHplcm8gcGF1c2UgdGltZSBmcmFtZSB0byByZS1zdGFydCB0cmFuc21pc3Npb24uCisJCSAqLworCisJCS8qIFhNX1BBVVNFX0RBID0gJzAxMDAwMEMyODAwMScgKGRlZmF1bHQpICovCisKKwkJLyogWE1fTUFDX1BUSU1FID0gMHhmZmZmIChtYXhpbXVtKSAqLworCQkvKiByZW1lbWJlciB0aGlzIHZhbHVlIGlzIGRlZmluZWQgaW4gYmlnIGVuZGlhbiAoISkgKi8KKwkJWE1fT1VUMTYoSW9DLCBQb3J0LCBYTV9NQUNfUFRJTUUsIDB4ZmZmZik7CisKKwkJLyogU2V0IFBhdXNlIE1vZGUgaW4gTW9kZSBSZWdpc3RlciAqLworCQlEV29yZCB8PSBYTV9QQVVTRV9NT0RFOworCisJCS8qIFNldCBQYXVzZSBNb2RlIGluIE1BQyBSeCBGSUZPICovCisJCVNLX09VVDE2KElvQywgTVJfQUREUihQb3J0LCBSWF9NRkZfQ1RSTDEpLCBNRkZfRU5BX1BBVVNFKTsKKwl9CisJZWxzZSB7CisJCS8qCisJCSAqIGRpc2FibGUgcGF1c2UgZnJhbWUgZ2VuZXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgMTAwMEJUCisJCSAqIGJlY2F1c2UgdGhlIFhNQUMgaXMgbm90IHJlc2V0IGlmIHRoZSBsaW5rIGlzIGdvaW5nIGRvd24KKwkJICovCisJCS8qIERpc2FibGUgUGF1c2UgTW9kZSBpbiBNb2RlIFJlZ2lzdGVyICovCisJCURXb3JkICY9IH5YTV9QQVVTRV9NT0RFOworCisJCS8qIERpc2FibGUgUGF1c2UgTW9kZSBpbiBNQUMgUnggRklGTyAqLworCQlTS19PVVQxNihJb0MsIE1SX0FERFIoUG9ydCwgUlhfTUZGX0NUUkwxKSwgTUZGX0RJU19QQVVTRSk7CisJfQorCQorCVhNX09VVDMyKElvQywgUG9ydCwgWE1fTU9ERSwgRFdvcmQpOworfQkvKiBTa1htSW5pdFBhdXNlTWQqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1htSW5pdFBoeVhtYWMoKSAtIEluaXRpYWxpemUgdGhlIFhNQUMgUGh5IHJlZ2lzdGVycworICoKKyAqIERlc2NyaXB0aW9uOglpbml0aWFsaXplcyBhbGwgdGhlIFhNQUNzIFBoeSByZWdpc3RlcnMKKyAqCisgKiBOb3RlOgorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3N0YXRpYyB2b2lkIFNrWG1Jbml0UGh5WG1hYygKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitTS19CT09MCURvTG9vcCkJCS8qIFNob3VsZCBhIFBoeSBMb29wQmFjayBiZSBzZXQtdXA/ICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OworCVNLX1UxNgkJQ3RybDsKKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCUN0cmwgPSAwOworCQorCS8qIEF1dG8tbmVnb3RpYXRpb24gPyAqLworCWlmIChwUHJ0LT5QTGlua01vZGUgPT0gU0tfTE1PREVfSEFMRiB8fCBwUHJ0LT5QTGlua01vZGUgPT0gU0tfTE1PREVfRlVMTCkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkluaXRQaHlYbWFjOiBubyBhdXRvLW5lZ290aWF0aW9uIFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJLyogU2V0IER1cGxleE1vZGUgaW4gQ29uZmlnIHJlZ2lzdGVyICovCisJCWlmIChwUHJ0LT5QTGlua01vZGUgPT0gU0tfTE1PREVfRlVMTCkgeworCQkJQ3RybCB8PSBQSFlfQ1RfRFVQX01EOworCQl9CisKKwkJLyoKKwkJICogRG8gTk9UIGVuYWJsZSBBdXRvLW5lZ290aWF0aW9uIGhlcmUuIFRoaXMgd291bGQgaG9sZAorCQkgKiB0aGUgbGluayBkb3duIGJlY2F1c2Ugbm8gSURMRXMgYXJlIHRyYW5zbWl0dGVkCisJCSAqLworCX0KKwllbHNlIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJJbml0UGh5WG1hYzogd2l0aCBhdXRvLW5lZ290aWF0aW9uIFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJLyogU2V0IEF1dG8tbmVnb3RpYXRpb24gYWR2ZXJ0aXNlbWVudCAqLworCisJCS8qIFNldCBGdWxsL2hhbGYgZHVwbGV4IGNhcGFiaWxpdGllcyAqLworCQlzd2l0Y2ggKHBQcnQtPlBMaW5rTW9kZSkgeworCQljYXNlIFNLX0xNT0RFX0FVVE9IQUxGOgorCQkJQ3RybCB8PSBQSFlfWF9BTl9IRDsKKwkJCWJyZWFrOworCQljYXNlIFNLX0xNT0RFX0FVVE9GVUxMOgorCQkJQ3RybCB8PSBQSFlfWF9BTl9GRDsKKwkJCWJyZWFrOworCQljYXNlIFNLX0xNT0RFX0FVVE9CT1RIOgorCQkJQ3RybCB8PSBQSFlfWF9BTl9GRCB8IFBIWV9YX0FOX0hEOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1cgfCBTS19FUlJDTF9JTklULCBTS0VSUl9IV0lfRTAxNSwKKwkJCQlTS0VSUl9IV0lfRTAxNU1TRyk7CisJCX0KKworCQkvKiBTZXQgRmxvdy1jb250cm9sIGNhcGFiaWxpdGllcyAqLworCQlzd2l0Y2ggKHBQcnQtPlBGbG93Q3RybE1vZGUpIHsKKwkJY2FzZSBTS19GTE9XX01PREVfTk9ORToKKwkJCUN0cmwgfD0gUEhZX1hfUF9OT19QQVVTRTsKKwkJCWJyZWFrOworCQljYXNlIFNLX0ZMT1dfTU9ERV9MT0NfU0VORDoKKwkJCUN0cmwgfD0gUEhZX1hfUF9BU1lNX01EOworCQkJYnJlYWs7CisJCWNhc2UgU0tfRkxPV19NT0RFX1NZTU1FVFJJQzoKKwkJCUN0cmwgfD0gUEhZX1hfUF9TWU1fTUQ7CisJCQlicmVhazsKKwkJY2FzZSBTS19GTE9XX01PREVfU1lNX09SX1JFTToKKwkJCUN0cmwgfD0gUEhZX1hfUF9CT1RIX01EOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1cgfCBTS19FUlJDTF9JTklULCBTS0VSUl9IV0lfRTAxNiwKKwkJCQlTS0VSUl9IV0lfRTAxNk1TRyk7CisJCX0KKworCQkvKiBXcml0ZSBBdXRvTmVnIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIgKi8KKwkJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfWE1BQ19BVU5FX0FEViwgQ3RybCk7CisKKwkJLyogUmVzdGFydCBBdXRvLW5lZ290aWF0aW9uICovCisJCUN0cmwgPSBQSFlfQ1RfQU5FIHwgUEhZX0NUX1JFX0NGRzsKKwl9CisKKwlpZiAoRG9Mb29wKSB7CisJCS8qIFNldCB0aGUgUGh5IExvb3BiYWNrIGJpdCwgdG9vICovCisJCUN0cmwgfD0gUEhZX0NUX0xPT1A7CisJfQorCisJLyogV3JpdGUgdG8gdGhlIFBoeSBjb250cm9sIHJlZ2lzdGVyICovCisJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfWE1BQ19DVFJMLCBDdHJsKTsKK30JLyogU2tYbUluaXRQaHlYbWFjICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrWG1Jbml0UGh5QmNvbSgpIC0gSW5pdGlhbGl6ZSB0aGUgQnJvYWRjb20gUGh5IHJlZ2lzdGVycworICoKKyAqIERlc2NyaXB0aW9uOglpbml0aWFsaXplcyBhbGwgdGhlIEJyb2FkY29tIFBoeSByZWdpc3RlcnMKKyAqCisgKiBOb3RlOgorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3N0YXRpYyB2b2lkIFNrWG1Jbml0UGh5QmNvbSgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitTS19CT09MCURvTG9vcCkJCS8qIFNob3VsZCBhIFBoeSBMb29wQmFjayBiZSBzZXQtdXA/ICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OworCVNLX1UxNgkJQ3RybDE7CisJU0tfVTE2CQlDdHJsMjsKKwlTS19VMTYJCUN0cmwzOworCVNLX1UxNgkJQ3RybDQ7CisJU0tfVTE2CQlDdHJsNTsKKworCUN0cmwxID0gUEhZX0NUX1NQMTAwMDsKKwlDdHJsMiA9IDA7CisJQ3RybDMgPSBQSFlfU0VMX1RZUEU7CisJQ3RybDQgPSBQSFlfQl9QRUNfRU5fTFRSOworCUN0cmw1ID0gUEhZX0JfQUNfVFhfVFNUOworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwkvKiBtYW51YWxseSBNYXN0ZXIvU2xhdmUgPyAqLworCWlmIChwUHJ0LT5QTVNNb2RlICE9IFNLX01TX01PREVfQVVUTykgeworCQlDdHJsMiB8PSBQSFlfQl8xMDAwQ19NU0U7CisJCQorCQlpZiAocFBydC0+UE1TTW9kZSA9PSBTS19NU19NT0RFX01BU1RFUikgeworCQkJQ3RybDIgfD0gUEhZX0JfMTAwMENfTVNDOworCQl9CisJfQorCS8qIEF1dG8tbmVnb3RpYXRpb24gPyAqLworCWlmIChwUHJ0LT5QTGlua01vZGUgPT0gU0tfTE1PREVfSEFMRiB8fCBwUHJ0LT5QTGlua01vZGUgPT0gU0tfTE1PREVfRlVMTCkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkluaXRQaHlCY29tOiBubyBhdXRvLW5lZ290aWF0aW9uIFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJLyogU2V0IER1cGxleE1vZGUgaW4gQ29uZmlnIHJlZ2lzdGVyICovCisJCWlmIChwUHJ0LT5QTGlua01vZGUgPT0gU0tfTE1PREVfRlVMTCkgeworCQkJQ3RybDEgfD0gUEhZX0NUX0RVUF9NRDsKKwkJfQorCisJCS8qIERldGVybWluZSBNYXN0ZXIvU2xhdmUgbWFudWFsbHkgaWYgbm90IGFscmVhZHkgZG9uZSAqLworCQlpZiAocFBydC0+UE1TTW9kZSA9PSBTS19NU19NT0RFX0FVVE8pIHsKKwkJCUN0cmwyIHw9IFBIWV9CXzEwMDBDX01TRTsJLyogc2V0IGl0IHRvIFNsYXZlICovCisJCX0KKworCQkvKgorCQkgKiBEbyBOT1QgZW5hYmxlIEF1dG8tbmVnb3RpYXRpb24gaGVyZS4gVGhpcyB3b3VsZCBob2xkCisJCSAqIHRoZSBsaW5rIGRvd24gYmVjYXVzZSBubyBJRExFUyBhcmUgdHJhbnNtaXR0ZWQKKwkJICovCisJfQorCWVsc2UgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkluaXRQaHlCY29tOiB3aXRoIGF1dG8tbmVnb3RpYXRpb24gUG9ydCAlZFxuIiwgUG9ydCkpOworCQkvKiBTZXQgQXV0by1uZWdvdGlhdGlvbiBhZHZlcnRpc2VtZW50ICovCisKKwkJLyoKKwkJICogV29ya2Fyb3VuZCBCQ09NIEVycmF0YSAjMSBmb3IgdGhlIEM1IHR5cGUuCisJCSAqIDEwMDBCYXNlLVQgTGluayBBY3F1aXNpdGlvbiBGYWlsdXJlIGluIFNsYXZlIE1vZGUKKwkJICogU2V0IFJlcGVhdGVyL0RURSBiaXQgMTAgb2YgdGhlIDEwMDBCYXNlLVQgQ29udHJvbCBSZWdpc3RlcgorCQkgKi8KKwkJQ3RybDIgfD0gUEhZX0JfMTAwMENfUkQ7CisJCQorCQkgLyogU2V0IEZ1bGwvaGFsZiBkdXBsZXggY2FwYWJpbGl0aWVzICovCisJCXN3aXRjaCAocFBydC0+UExpbmtNb2RlKSB7CisJCWNhc2UgU0tfTE1PREVfQVVUT0hBTEY6CisJCQlDdHJsMiB8PSBQSFlfQl8xMDAwQ19BSEQ7CisJCQlicmVhazsKKwkJY2FzZSBTS19MTU9ERV9BVVRPRlVMTDoKKwkJCUN0cmwyIHw9IFBIWV9CXzEwMDBDX0FGRDsKKwkJCWJyZWFrOworCQljYXNlIFNLX0xNT0RFX0FVVE9CT1RIOgorCQkJQ3RybDIgfD0gUEhZX0JfMTAwMENfQUZEIHwgUEhZX0JfMTAwMENfQUhEOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1cgfCBTS19FUlJDTF9JTklULCBTS0VSUl9IV0lfRTAxNSwKKwkJCQlTS0VSUl9IV0lfRTAxNU1TRyk7CisJCX0KKworCQkvKiBTZXQgRmxvdy1jb250cm9sIGNhcGFiaWxpdGllcyAqLworCQlzd2l0Y2ggKHBQcnQtPlBGbG93Q3RybE1vZGUpIHsKKwkJY2FzZSBTS19GTE9XX01PREVfTk9ORToKKwkJCUN0cmwzIHw9IFBIWV9CX1BfTk9fUEFVU0U7CisJCQlicmVhazsKKwkJY2FzZSBTS19GTE9XX01PREVfTE9DX1NFTkQ6CisJCQlDdHJsMyB8PSBQSFlfQl9QX0FTWU1fTUQ7CisJCQlicmVhazsKKwkJY2FzZSBTS19GTE9XX01PREVfU1lNTUVUUklDOgorCQkJQ3RybDMgfD0gUEhZX0JfUF9TWU1fTUQ7CisJCQlicmVhazsKKwkJY2FzZSBTS19GTE9XX01PREVfU1lNX09SX1JFTToKKwkJCUN0cmwzIHw9IFBIWV9CX1BfQk9USF9NRDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXIHwgU0tfRVJSQ0xfSU5JVCwgU0tFUlJfSFdJX0UwMTYsCisJCQkJU0tFUlJfSFdJX0UwMTZNU0cpOworCQl9CisKKwkJLyogUmVzdGFydCBBdXRvLW5lZ290aWF0aW9uICovCisJCUN0cmwxIHw9IFBIWV9DVF9BTkUgfCBQSFlfQ1RfUkVfQ0ZHOworCX0KKwkKKwkvKiBJbml0aWFsaXplIExFRCByZWdpc3RlciBoZXJlPyAqLworCS8qIE5vLiBQbGVhc2UgZG8gaXQgaW4gU2tEZ1htaXRMZWQoKSAoaWYgcmVxdWlyZWQpIGFuZCBzd2FwCisJICAgaW5pdCBvcmRlciBvZiBMRURzIGFuZCBYTUFDLiAoTUFsKSAqLworCQorCS8qIFdyaXRlIDEwMDBCYXNlLVQgQ29udHJvbCBSZWdpc3RlciAqLworCVNrWG1QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fMTAwMFRfQ1RSTCwgQ3RybDIpOworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTZXQgMTAwMEItVCBDdHJsIFJlZz0weCUwNFhcbiIsIEN0cmwyKSk7CisJCisJLyogV3JpdGUgQXV0b05lZyBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyICovCisJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9BVU5FX0FEViwgQ3RybDMpOworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTZXQgQXV0by1OZWcuQWR2LlJlZz0weCUwNFhcbiIsIEN0cmwzKSk7CisJCisJaWYgKERvTG9vcCkgeworCQkvKiBTZXQgdGhlIFBoeSBMb29wYmFjayBiaXQsIHRvbyAqLworCQlDdHJsMSB8PSBQSFlfQ1RfTE9PUDsKKwl9CisKKwlpZiAocEFDLT5HSW5pLkdJUG9ydFVzYWdlID09IFNLX0pVTUJPX0xJTkspIHsKKwkJLyogY29uZmlndXJlIEZJRk8gdG8gaGlnaCBsYXRlbmN5IGZvciB0cmFuc21pc3Npb24gb2YgZXh0LiBwYWNrZXRzICovCisJCUN0cmw0IHw9IFBIWV9CX1BFQ19ISUdIX0xBOworCisJCS8qIGNvbmZpZ3VyZSByZWNlcHRpb24gb2YgZXh0ZW5kZWQgcGFja2V0cyAqLworCQlDdHJsNSB8PSBQSFlfQl9BQ19MT05HX1BBQ0s7CisKKwkJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9BVVhfQ1RSTCwgQ3RybDUpOworCX0KKworCS8qIENvbmZpZ3VyZSBMRUQgVHJhZmZpYyBNb2RlIGFuZCBKdW1ibyBGcmFtZSB1c2FnZSBpZiBzcGVjaWZpZWQgKi8KKwlTa1htUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX1BfRVhUX0NUUkwsIEN0cmw0KTsKKwkKKwkvKiBXcml0ZSB0byB0aGUgUGh5IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlTa1htUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0NUUkwsIEN0cmwxKTsKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiUEhZIENvbnRyb2wgUmVnPTB4JTA0WFxuIiwgQ3RybDEpKTsKK30JLyogU2tYbUluaXRQaHlCY29tICovCisjZW5kaWYgLyogR0VORVNJUyAqLworCisKKyNpZmRlZiBZVUtPTgorI2lmbmRlZiBTS19TTElNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHbUVudGVyTG93UG93ZXJNb2RlKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoJCisgKglUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIE1hcnZlbGwgQWxhc2thIFBIWSB0byB0aGUgbG93IHBvd2VyIG1vZGUKKyAqCWdpdmVuIGJ5IHBhcmFtZXRlciBtb2RlLgorICoJVGhlIGZvbGxvd2luZyBsb3cgcG93ZXIgbW9kZXMgYXJlIGF2YWlsYWJsZToKKyAqCQkKKyAqCQktIENvbWEgTW9kZSAoRGVlcCBTbGVlcCk6CisgKgkJCVBvd2VyIGNvbnN1bXB0aW9uOiB+MTUgLSAzMCBtVworICoJCQlUaGUgUEhZIGNhbm5vdCB3YWtlIHVwIG9uIGl0cyBvd24uCisgKgorICoJCS0gSUVFRSAyMi4yLjQuMS41IGNvbXBhdGlibGUgcG93ZXIgZG93biBtb2RlCisgKgkJCVBvd2VyIGNvbnN1bXB0aW9uOiB+MjQwIG1XCisgKgkJCVRoZSBQSFkgY2Fubm90IHdha2UgdXAgb24gaXRzIG93bi4KKyAqCisgKgkJLSBlbmVyZ3kgZGV0ZWN0IG1vZGUKKyAqCQkJUG93ZXIgY29uc3VtcHRpb246IH4xNjAgbVcKKyAqCQkJVGhlIFBIWSBjYW4gd2FrZSB1cCBvbiBpdHMgb3duIGJ5IGRldGVjdGluZyBhY3Rpdml0eQorICoJCQlvbiB0aGUgQ0FUIDUgY2FibGUuCisgKgorICoJCS0gZW5lcmd5IGRldGVjdCBwbHVzIG1vZGUKKyAqCQkJUG93ZXIgY29uc3VtcHRpb246IH4xNTAgbVcKKyAqCQkJVGhlIFBIWSBjYW4gd2FrZSB1cCBvbiBpdHMgb3duIGJ5IGRldGVjdGluZyBhY3Rpdml0eQorICoJCQlvbiB0aGUgQ0FUIDUgY2FibGUuCisgKgkJCUNvbm5lY3RlZCBkZXZpY2VzIGNhbiBiZSB3b2tlbiB1cCBieSBzZW5kaW5nIG5vcm1hbCBsaW5rCisgKgkJCXB1bHNlcyBldmVyeSBvbmUgc2Vjb25kLgorICoKKyAqIE5vdGU6CisgKgorICogUmV0dXJuczoKKyAqCQkwOiBvaworICoJCTE6IGVycm9yCisgKi8KK2ludCBTa0dtRW50ZXJMb3dQb3dlck1vZGUoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBJbmRleCAoZS5nLiBNQUNfMSkgKi8KK1NLX1U4CU1vZGUpCQkvKiBsb3cgcG93ZXIgbW9kZSAqLworeworCVNLX1UxNglXb3JkOworCVNLX1UzMglEV29yZDsKKwlTS19VOAlMYXN0TW9kZTsKKwlpbnQJCVJldCA9IDA7CisKKwlpZiAocEFDLT5HSW5pLkdJWXVrb25MaXRlICYmCisJICAgIHBBQy0+R0luaS5HSUNoaXBSZXYgPT0gQ0hJUF9SRVZfWVVfTElURV9BMykgeworCisJCS8qIHNhdmUgY3VycmVudCBwb3dlciBtb2RlICovCisJCUxhc3RNb2RlID0gcEFDLT5HSW5pLkdQW1BvcnRdLlBQaHlQb3dlclN0YXRlOworCQlwQUMtPkdJbmkuR1BbUG9ydF0uUFBoeVBvd2VyU3RhdGUgPSBNb2RlOworCisJCXN3aXRjaCAoTW9kZSkgeworCQkJLyogY29tYSBtb2RlIChkZWVwIHNsZWVwKSAqLworCQkJY2FzZSBQSFlfUE1fREVFUF9TTEVFUDoKKwkJCQkvKiBzZXR1cCBHZW5lcmFsIFB1cnBvc2UgQ29udHJvbCBSZWdpc3RlciAqLworCQkJCUdNX09VVDE2KElvQywgMCwgR01fR1BfQ1RSTCwgR01fR1BDUl9GTF9QQVNTIHwKKwkJCQkJR01fR1BDUl9TUEVFRF8xMDAgfCBHTV9HUENSX0FVX0FMTF9ESVMpOworCisJCQkJLyogYXBwbHkgQ09NQSBtb2RlIHdvcmthcm91bmQgKi8KKwkJCQlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIDI5LCAweDAwMWYpOworCQkJCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgMzAsIDB4ZmZmMyk7CisKKwkJCQlTS19JTjMyKElvQywgUENJX0MoUENJX09VUl9SRUdfMSksICZEV29yZCk7CisKKwkJCQlTS19PVVQ4KElvQywgQjJfVFNUX0NUUkwxLCBUU1RfQ0ZHX1dSSVRFX09OKTsKKwkJCQkKKwkJCQkvKiBTZXQgUEhZIHRvIENvbWEgTW9kZSAqLworCQkJCVNLX09VVDMyKElvQywgUENJX0MoUENJX09VUl9SRUdfMSksIERXb3JkIHwgUENJX1BIWV9DT01BKTsKKwkJCQkKKwkJCQlTS19PVVQ4KElvQywgQjJfVFNUX0NUUkwxLCBUU1RfQ0ZHX1dSSVRFX09GRik7CisKKwkJCWJyZWFrOworCQkJCisJCQkvKiBJRUVFIDIyLjIuNC4xLjUgY29tcGF0aWJsZSBwb3dlciBkb3duIG1vZGUgKi8KKwkJCWNhc2UgUEhZX1BNX0lFRUVfUE9XRVJfRE9XTjoKKwkJCQkvKgorCQkJCSAqIC0gZGlzYWJsZSBNQUMgMTI1IE1IeiBjbG9jaworCQkJCSAqIC0gYWxsb3cgTUFDIHBvd2VyIGRvd24KKwkJCQkgKi8KKwkJCQlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfUEhZX0NUUkwsICZXb3JkKTsKKwkJCQlXb3JkIHw9IFBIWV9NX1BDX0RJU18xMjVDTEs7CisJCQkJV29yZCAmPQl+UEhZX01fUENfTUFDX1BPV19VUDsKKwkJCQlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX1BIWV9DVFJMLCBXb3JkKTsKKworCQkJCS8qCisJCQkJICogcmVnaXN0ZXIgY2hhbmdlcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc29mdHdhcmUKKwkJCQkgKiByZXNldCB0byB0YWtlIGVmZmVjdAorCQkJCSAqLworCQkJCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9DVFJMLCAmV29yZCk7CisJCQkJV29yZCB8PSBQSFlfQ1RfUkVTRVQ7CisJCQkJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9DVFJMLCBXb3JkKTsKKworCQkJCS8qIHN3aXRjaCBJRUVFIGNvbXBhdGlibGUgcG93ZXIgZG93biBtb2RlIG9uICovCisJCQkJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0NUUkwsICZXb3JkKTsKKwkJCQlXb3JkIHw9IFBIWV9DVF9QRE9XTjsKKwkJCQlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0NUUkwsIFdvcmQpOworCQkJYnJlYWs7CisKKwkJCS8qIGVuZXJneSBkZXRlY3QgYW5kIGVuZXJneSBkZXRlY3QgcGx1cyBtb2RlICovCisJCQljYXNlIFBIWV9QTV9FTkVSR1lfREVURUNUOgorCQkJY2FzZSBQSFlfUE1fRU5FUkdZX0RFVEVDVF9QTFVTOgorCQkJCS8qCisJCQkJICogLSBkaXNhYmxlIE1BQyAxMjUgTUh6IGNsb2NrCisJCQkJICovCisJCQkJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX1BIWV9DVFJMLCAmV29yZCk7CisJCQkJV29yZCB8PSBQSFlfTV9QQ19ESVNfMTI1Q0xLOworCQkJCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfUEhZX0NUUkwsIFdvcmQpOworCQkJCQorCQkJCS8qIGFjdGl2YXRlIGVuZXJneSBkZXRlY3QgbW9kZSAxICovCisJCQkJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX1BIWV9DVFJMLCAmV29yZCk7CisKKwkJCQkvKiBlbmVyZ3kgZGV0ZWN0IG1vZGUgKi8KKwkJCQlpZiAoTW9kZSA9PSBQSFlfUE1fRU5FUkdZX0RFVEVDVCkgeworCQkJCQlXb3JkIHw9IFBIWV9NX1BDX0VOX0RFVDsKKwkJCQl9CisJCQkJLyogZW5lcmd5IGRldGVjdCBwbHVzIG1vZGUgKi8KKwkJCQllbHNlIHsKKwkJCQkJV29yZCB8PSBQSFlfTV9QQ19FTl9ERVRfUExVUzsKKwkJCQl9CisKKwkJCQlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX1BIWV9DVFJMLCBXb3JkKTsKKworCQkJCS8qCisJCQkJICogcmVpbml0aWFsaXplIHRoZSBQSFkgdG8gZm9yY2UgYSBzb2Z0d2FyZSByZXNldAorCQkJCSAqIHdoaWNoIGlzIG5lY2Vzc2FyeSBhZnRlciB0aGUgcmVnaXN0ZXIgc2V0dGluZ3MKKwkJCQkgKiBmb3IgdGhlIGVuZXJneSBkZXRlY3QgbW9kZXMuCisJCQkJICogRnVydGhlcm1vcmUgcmVpbml0aWFsaXNhdGlvbiBwcmV2ZW50cyB0aGF0IHRoZQorCQkJCSAqIFBIWSBpcyBydW5uaW5nIG91dCBvZiBhIHN0YWJsZSBzdGF0ZS4KKwkJCQkgKi8KKwkJCQlTa0dtSW5pdFBoeU1hcnYocEFDLCBJb0MsIFBvcnQsIFNLX0ZBTFNFKTsKKwkJCWJyZWFrOworCisJCQkvKiBkb24ndCBjaGFuZ2UgY3VycmVudCBwb3dlciBtb2RlICovCisJCQlkZWZhdWx0OgorCQkJCXBBQy0+R0luaS5HUFtQb3J0XS5QUGh5UG93ZXJTdGF0ZSA9IExhc3RNb2RlOworCQkJCVJldCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwkvKiBsb3cgcG93ZXIgbW9kZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjaGlwICovCisJZWxzZSB7CisJCVJldCA9IDE7CisJfQorCisJcmV0dXJuKFJldCk7CisKK30JLyogU2tHbUVudGVyTG93UG93ZXJNb2RlICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dtTGVhdmVMb3dQb3dlck1vZGUoKQorICoKKyAqIERlc2NyaXB0aW9uOgkKKyAqCUxlYXZlIHRoZSBjdXJyZW50IGxvdyBwb3dlciBtb2RlIGFuZCBzd2l0Y2ggdG8gbm9ybWFsIG1vZGUKKyAqCisgKiBOb3RlOgorICoKKyAqIFJldHVybnM6CisgKgkJMDoJb2sKKyAqCQkxOgllcnJvcgorICovCitpbnQgU2tHbUxlYXZlTG93UG93ZXJNb2RlKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFBvcnQgSW5kZXggKGUuZy4gTUFDXzEpICovCit7CisJU0tfVTMyCURXb3JkOworCVNLX1UxNglXb3JkOworCVNLX1U4CUxhc3RNb2RlOworCWludAkJUmV0ID0gMDsKKworCWlmIChwQUMtPkdJbmkuR0lZdWtvbkxpdGUgJiYKKwkJcEFDLT5HSW5pLkdJQ2hpcFJldiA9PSBDSElQX1JFVl9ZVV9MSVRFX0EzKSB7CisKKwkJLyogc2F2ZSBjdXJyZW50IHBvd2VyIG1vZGUgKi8KKwkJTGFzdE1vZGUgPSBwQUMtPkdJbmkuR1BbUG9ydF0uUFBoeVBvd2VyU3RhdGU7CisJCXBBQy0+R0luaS5HUFtQb3J0XS5QUGh5UG93ZXJTdGF0ZSA9IFBIWV9QTV9PUEVSQVRJT05BTF9NT0RFOworCisJCXN3aXRjaCAoTGFzdE1vZGUpIHsKKwkJCS8qIGNvbWEgbW9kZSAoZGVlcCBzbGVlcCkgKi8KKwkJCWNhc2UgUEhZX1BNX0RFRVBfU0xFRVA6CisJCQkJU0tfSU4zMihJb0MsIFBDSV9DKFBDSV9PVVJfUkVHXzEpLCAmRFdvcmQpOworCisJCQkJU0tfT1VUOChJb0MsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PTik7CisJCQkJCisJCQkJLyogUmVsZWFzZSBQSFkgZnJvbSBDb21hIE1vZGUgKi8KKwkJCQlTS19PVVQzMihJb0MsIFBDSV9DKFBDSV9PVVJfUkVHXzEpLCBEV29yZCAmIH5QQ0lfUEhZX0NPTUEpOworCQkJCQorCQkJCVNLX09VVDgoSW9DLCBCMl9UU1RfQ1RSTDEsIFRTVF9DRkdfV1JJVEVfT0ZGKTsKKwkJCQkKKwkJCQlTS19JTjMyKElvQywgQjJfR1BfSU8sICZEV29yZCk7CisKKwkJCQkvKiBzZXQgdG8gb3V0cHV0ICovCisJCQkJRFdvcmQgfD0gKEdQX0RJUl85IHwgR1BfSU9fOSk7CisKKwkJCQkvKiBzZXQgUEhZIHJlc2V0ICovCisJCQkJU0tfT1VUMzIoSW9DLCBCMl9HUF9JTywgRFdvcmQpOworCisJCQkJRFdvcmQgJj0gfkdQX0lPXzk7IC8qIGNsZWFyIFBIWSByZXNldCAoYWN0aXZlIGhpZ2gpICovCisKKwkJCQkvKiBjbGVhciBQSFkgcmVzZXQgKi8KKwkJCQlTS19PVVQzMihJb0MsIEIyX0dQX0lPLCBEV29yZCk7CisJCQlicmVhazsKKwkJCQorCQkJLyogSUVFRSAyMi4yLjQuMS41IGNvbXBhdGlibGUgcG93ZXIgZG93biBtb2RlICovCisJCQljYXNlIFBIWV9QTV9JRUVFX1BPV0VSX0RPV046CisJCQkJLyoKKwkJCQkgKiAtIGVuYWJsZSBNQUMgMTI1IE1IeiBjbG9jaworCQkJCSAqIC0gc2V0IE1BQyBwb3dlciB1cAorCQkJCSAqLworCQkJCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9QSFlfQ1RSTCwgJldvcmQpOworCQkJCVdvcmQgJj0gflBIWV9NX1BDX0RJU18xMjVDTEs7CisJCQkJV29yZCB8PQlQSFlfTV9QQ19NQUNfUE9XX1VQOworCQkJCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfUEhZX0NUUkwsIFdvcmQpOworCisJCQkJLyoKKwkJCQkgKiByZWdpc3RlciBjaGFuZ2VzIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBzb2Z0d2FyZQorCQkJCSAqIHJlc2V0IHRvIHRha2UgZWZmZWN0CisJCQkJICovCisJCQkJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0NUUkwsICZXb3JkKTsKKwkJCQlXb3JkIHw9IFBIWV9DVF9SRVNFVDsKKwkJCQlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0NUUkwsIFdvcmQpOworCisJCQkJLyogc3dpdGNoIElFRUUgY29tcGF0aWJsZSBwb3dlciBkb3duIG1vZGUgb2ZmICovCisJCQkJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0NUUkwsICZXb3JkKTsKKwkJCQlXb3JkICY9IH5QSFlfQ1RfUERPV047CisJCQkJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9DVFJMLCBXb3JkKTsKKwkJCWJyZWFrOworCisJCQkvKiBlbmVyZ3kgZGV0ZWN0IGFuZCBlbmVyZ3kgZGV0ZWN0IHBsdXMgbW9kZSAqLworCQkJY2FzZSBQSFlfUE1fRU5FUkdZX0RFVEVDVDoKKwkJCWNhc2UgUEhZX1BNX0VORVJHWV9ERVRFQ1RfUExVUzoKKwkJCQkvKgorCQkJCSAqIC0gZW5hYmxlIE1BQyAxMjUgTUh6IGNsb2NrCisJCQkJICovCisJCQkJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX1BIWV9DVFJMLCAmV29yZCk7CisJCQkJV29yZCAmPSB+UEhZX01fUENfRElTXzEyNUNMSzsKKwkJCQlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX1BIWV9DVFJMLCBXb3JkKTsKKwkJCQkKKwkJCQkvKiBkaXNhYmxlIGVuZXJneSBkZXRlY3QgbW9kZSAqLworCQkJCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9QSFlfQ1RSTCwgJldvcmQpOworCQkJCVdvcmQgJj0gflBIWV9NX1BDX0VOX0RFVF9NU0s7CisJCQkJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9QSFlfQ1RSTCwgV29yZCk7CisKKwkJCQkvKgorCQkJCSAqIHJlaW5pdGlhbGl6ZSB0aGUgUEhZIHRvIGZvcmNlIGEgc29mdHdhcmUgcmVzZXQKKwkJCQkgKiB3aGljaCBpcyBuZWNlc3NhcnkgYWZ0ZXIgdGhlIHJlZ2lzdGVyIHNldHRpbmdzCisJCQkJICogZm9yIHRoZSBlbmVyZ3kgZGV0ZWN0IG1vZGVzLgorCQkJCSAqIEZ1cnRoZXJtb3JlIHJlaW5pdGlhbGlzYXRpb24gcHJldmVudHMgdGhhdCB0aGUKKwkJCQkgKiBQSFkgaXMgcnVubmluZyBvdXQgb2YgYSBzdGFibGUgc3RhdGUuCisJCQkJICovCisJCQkJU2tHbUluaXRQaHlNYXJ2KHBBQywgSW9DLCBQb3J0LCBTS19GQUxTRSk7CisJCQlicmVhazsKKworCQkJLyogZG9uJ3QgY2hhbmdlIGN1cnJlbnQgcG93ZXIgbW9kZSAqLworCQkJZGVmYXVsdDoKKwkJCQlwQUMtPkdJbmkuR1BbUG9ydF0uUFBoeVBvd2VyU3RhdGUgPSBMYXN0TW9kZTsKKwkJCQlSZXQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJLyogbG93IHBvd2VyIG1vZGVzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY2hpcCAqLworCWVsc2UgeworCQlSZXQgPSAxOworCX0KKworCXJldHVybihSZXQpOworCit9CS8qIFNrR21MZWF2ZUxvd1Bvd2VyTW9kZSAqLworI2VuZGlmIC8qICFTS19TTElNICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR21Jbml0UGh5TWFydigpIC0gSW5pdGlhbGl6ZSB0aGUgTWFydmVsbCBQaHkgcmVnaXN0ZXJzCisgKgorICogRGVzY3JpcHRpb246CWluaXRpYWxpemVzIGFsbCB0aGUgTWFydmVsbCBQaHkgcmVnaXN0ZXJzCisgKgorICogTm90ZToKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCitzdGF0aWMgdm9pZCBTa0dtSW5pdFBoeU1hcnYoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworU0tfQk9PTAlEb0xvb3ApCQkvKiBTaG91bGQgYSBQaHkgTG9vcEJhY2sgYmUgc2V0LXVwPyAqLworeworCVNLX0dFUE9SVAkqcFBydDsKKwlTS19VMTYJCVBoeUN0cmw7CisJU0tfVTE2CQlDMTAwMEJhc2VUOworCVNLX1UxNgkJQXV0b05lZ0FkdjsKKwlTS19VMTYJCUV4dFBoeUN0cmw7CisJU0tfVTE2CQlMZWRDdHJsOworCVNLX0JPT0wJCUF1dG9OZWc7CisjaWYgZGVmaW5lZChTS19ESUFHKSB8fCBkZWZpbmVkKERFQlVHKQorCVNLX1UxNgkJUGh5U3RhdDsKKwlTS19VMTYJCVBoeVN0YXQxOworCVNLX1UxNgkJUGh5U3BlY1N0YXQ7CisjZW5kaWYgLyogU0tfRElBRyB8fCBERUJVRyAqLworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwkvKiBBdXRvLW5lZ290aWF0aW9uID8gKi8KKwlpZiAocFBydC0+UExpbmtNb2RlID09IFNLX0xNT0RFX0hBTEYgfHwgcFBydC0+UExpbmtNb2RlID09IFNLX0xNT0RFX0ZVTEwpIHsKKwkJQXV0b05lZyA9IFNLX0ZBTFNFOworCX0KKwllbHNlIHsKKwkJQXV0b05lZyA9IFNLX1RSVUU7CisJfQorCQorCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJJbml0UGh5TWFydjogUG9ydCAlZCwgYXV0by1uZWdvdGlhdGlvbiAlc1xuIiwKKwkJIFBvcnQsIEF1dG9OZWcgPyAiT04iIDogIk9GRiIpKTsKKworI2lmZGVmIFZDUFUKKwlWQ1BVcHJpbnRmKDAsICJTa0dtSW5pdFBoeU1hcnYoKSwgUG9ydD0ldSwgRG9Mb29wPSV1XG4iLAorCQlQb3J0LCBEb0xvb3ApOworI2Vsc2UgLyogVkNQVSAqLworCWlmIChEb0xvb3ApIHsKKwkJLyogU2V0ICdNQUMgUG93ZXIgdXAnLWJpdCwgc2V0IE1hbnVhbCBNREkgY29uZmlndXJhdGlvbiAqLworCQlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX1BIWV9DVFJMLAorCQkJUEhZX01fUENfTUFDX1BPV19VUCk7CisJfQorCWVsc2UgaWYgKEF1dG9OZWcgJiYgcFBydC0+UExpbmtTcGVlZCA9PSBTS19MU1BFRURfQVVUTykgeworCQkvKiBSZWFkIEV4dC4gUEhZIFNwZWNpZmljIENvbnRyb2wgKi8KKwkJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0VYVF9DVFJMLCAmRXh0UGh5Q3RybCk7CisJCQorCQlFeHRQaHlDdHJsICY9IH4oUEhZX01fRUNfTV9EU0NfTVNLIHwgUEhZX01fRUNfU19EU0NfTVNLIHwKKwkJCVBIWV9NX0VDX01BQ19TX01TSyk7CisJCQorCQlFeHRQaHlDdHJsIHw9IFBIWV9NX0VDX01BQ19TKE1BQ19UWF9DTEtfMjVfTUhaKSB8CisJCQlQSFlfTV9FQ19NX0RTQygwKSB8IFBIWV9NX0VDX1NfRFNDKDEpOworCQorCQlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0VYVF9DVFJMLCBFeHRQaHlDdHJsKTsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTZXQgRXh0LiBQSFkgQ3RybD0weCUwNFhcbiIsIEV4dFBoeUN0cmwpKTsKKwl9CisKKwkvKiBSZWFkIFBIWSBDb250cm9sICovCisJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0NUUkwsICZQaHlDdHJsKTsKKworCWlmICghQXV0b05lZykgeworCQkvKiBEaXNhYmxlIEF1dG8tbmVnb3RpYXRpb24gKi8KKwkJUGh5Q3RybCAmPSB+UEhZX0NUX0FORTsKKwl9CisKKwlQaHlDdHJsIHw9IFBIWV9DVF9SRVNFVDsKKwkvKiBBc3NlcnQgc29mdHdhcmUgcmVzZXQgKi8KKwlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0NUUkwsIFBoeUN0cmwpOworI2VuZGlmIC8qIFZDUFUgKi8KKworCVBoeUN0cmwgPSAwIC8qIFBIWV9DVF9DT0xfVFNUICovOworCUMxMDAwQmFzZVQgPSAwOworCUF1dG9OZWdBZHYgPSBQSFlfU0VMX1RZUEU7CisKKwkvKiBtYW51YWxseSBNYXN0ZXIvU2xhdmUgPyAqLworCWlmIChwUHJ0LT5QTVNNb2RlICE9IFNLX01TX01PREVfQVVUTykgeworCQkvKiBlbmFibGUgTWFudWFsIE1hc3Rlci9TbGF2ZSAqLworCQlDMTAwMEJhc2VUIHw9IFBIWV9NXzEwMDBDX01TRTsKKwkJCisJCWlmIChwUHJ0LT5QTVNNb2RlID09IFNLX01TX01PREVfTUFTVEVSKSB7CisJCQlDMTAwMEJhc2VUIHw9IFBIWV9NXzEwMDBDX01TQzsJLyogc2V0IGl0IHRvIE1hc3RlciAqLworCQl9CisJfQorCQorCS8qIEF1dG8tbmVnb3RpYXRpb24gPyAqLworCWlmICghQXV0b05lZykgeworCQkKKwkJaWYgKHBQcnQtPlBMaW5rTW9kZSA9PSBTS19MTU9ERV9GVUxMKSB7CisJCQkvKiBTZXQgRnVsbCBEdXBsZXggTW9kZSAqLworCQkJUGh5Q3RybCB8PSBQSFlfQ1RfRFVQX01EOworCQl9CisKKwkJLyogU2V0IE1hc3Rlci9TbGF2ZSBtYW51YWxseSBpZiBub3QgYWxyZWFkeSBkb25lICovCisJCWlmIChwUHJ0LT5QTVNNb2RlID09IFNLX01TX01PREVfQVVUTykgeworCQkJQzEwMDBCYXNlVCB8PSBQSFlfTV8xMDAwQ19NU0U7CS8qIHNldCBpdCB0byBTbGF2ZSAqLworCQl9CisKKwkJLyogU2V0IFNwZWVkICovCisJCXN3aXRjaCAocFBydC0+UExpbmtTcGVlZCkgeworCQljYXNlIFNLX0xTUEVFRF9BVVRPOgorCQljYXNlIFNLX0xTUEVFRF8xMDAwTUJQUzoKKwkJCVBoeUN0cmwgfD0gUEhZX0NUX1NQMTAwMDsKKwkJCWJyZWFrOworCQljYXNlIFNLX0xTUEVFRF8xMDBNQlBTOgorCQkJUGh5Q3RybCB8PSBQSFlfQ1RfU1AxMDA7CisJCQlicmVhazsKKwkJY2FzZSBTS19MU1BFRURfMTBNQlBTOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1cgfCBTS19FUlJDTF9JTklULCBTS0VSUl9IV0lfRTAxOSwKKwkJCQlTS0VSUl9IV0lfRTAxOU1TRyk7CisJCX0KKworCQlpZiAoIURvTG9vcCkgeworCQkJUGh5Q3RybCB8PSBQSFlfQ1RfUkVTRVQ7CisJCX0KKwl9CisJZWxzZSB7CisJCS8qIFNldCBBdXRvLW5lZ290aWF0aW9uIGFkdmVydGlzZW1lbnQgKi8KKwkJCisJCWlmIChwQUMtPkdJbmkuR0lDb3BwZXJUeXBlKSB7CisJCQkvKiBTZXQgU3BlZWQgY2FwYWJpbGl0aWVzICovCisJCQlzd2l0Y2ggKHBQcnQtPlBMaW5rU3BlZWQpIHsKKwkJCWNhc2UgU0tfTFNQRUVEX0FVVE86CisJCQkJQzEwMDBCYXNlVCB8PSBQSFlfTV8xMDAwQ19BSEQgfCBQSFlfTV8xMDAwQ19BRkQ7CisJCQkJQXV0b05lZ0FkdiB8PSBQSFlfTV9BTl8xMDBfRkQgfCBQSFlfTV9BTl8xMDBfSEQgfAorCQkJCQlQSFlfTV9BTl8xMF9GRCB8IFBIWV9NX0FOXzEwX0hEOworCQkJCWJyZWFrOworCQkJY2FzZSBTS19MU1BFRURfMTAwME1CUFM6CisJCQkJQzEwMDBCYXNlVCB8PSBQSFlfTV8xMDAwQ19BSEQgfCBQSFlfTV8xMDAwQ19BRkQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFNLX0xTUEVFRF8xMDBNQlBTOgorCQkJCUF1dG9OZWdBZHYgfD0gUEhZX01fQU5fMTAwX0ZEIHwgUEhZX01fQU5fMTAwX0hEIHwKKwkJCQkJLyogYWR2ZXJ0aXNlIDEwQmFzZS1UIGFsc28gKi8KKwkJCQkJUEhZX01fQU5fMTBfRkQgfCBQSFlfTV9BTl8xMF9IRDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0tfTFNQRUVEXzEwTUJQUzoKKwkJCQlBdXRvTmVnQWR2IHw9IFBIWV9NX0FOXzEwX0ZEIHwgUEhZX01fQU5fMTBfSEQ7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVyB8IFNLX0VSUkNMX0lOSVQsIFNLRVJSX0hXSV9FMDE5LAorCQkJCQlTS0VSUl9IV0lfRTAxOU1TRyk7CisJCQl9CisKKwkJCS8qIFNldCBGdWxsL2hhbGYgZHVwbGV4IGNhcGFiaWxpdGllcyAqLworCQkJc3dpdGNoIChwUHJ0LT5QTGlua01vZGUpIHsKKwkJCWNhc2UgU0tfTE1PREVfQVVUT0hBTEY6CisJCQkJQzEwMDBCYXNlVCAmPSB+UEhZX01fMTAwMENfQUZEOworCQkJCUF1dG9OZWdBZHYgJj0gfihQSFlfTV9BTl8xMDBfRkQgfCBQSFlfTV9BTl8xMF9GRCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNLX0xNT0RFX0FVVE9GVUxMOgorCQkJCUMxMDAwQmFzZVQgJj0gflBIWV9NXzEwMDBDX0FIRDsKKwkJCQlBdXRvTmVnQWR2ICY9IH4oUEhZX01fQU5fMTAwX0hEIHwgUEhZX01fQU5fMTBfSEQpOworCQkJCWJyZWFrOworCQkJY2FzZSBTS19MTU9ERV9BVVRPQk9USDoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXIHwgU0tfRVJSQ0xfSU5JVCwgU0tFUlJfSFdJX0UwMTUsCisJCQkJCVNLRVJSX0hXSV9FMDE1TVNHKTsKKwkJCX0KKwkJCQorCQkJLyogU2V0IEZsb3ctY29udHJvbCBjYXBhYmlsaXRpZXMgKi8KKwkJCXN3aXRjaCAocFBydC0+UEZsb3dDdHJsTW9kZSkgeworCQkJY2FzZSBTS19GTE9XX01PREVfTk9ORToKKwkJCQlBdXRvTmVnQWR2IHw9IFBIWV9CX1BfTk9fUEFVU0U7CisJCQkJYnJlYWs7CisJCQljYXNlIFNLX0ZMT1dfTU9ERV9MT0NfU0VORDoKKwkJCQlBdXRvTmVnQWR2IHw9IFBIWV9CX1BfQVNZTV9NRDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0tfRkxPV19NT0RFX1NZTU1FVFJJQzoKKwkJCQlBdXRvTmVnQWR2IHw9IFBIWV9CX1BfU1lNX01EOworCQkJCWJyZWFrOworCQkJY2FzZSBTS19GTE9XX01PREVfU1lNX09SX1JFTToKKwkJCQlBdXRvTmVnQWR2IHw9IFBIWV9CX1BfQk9USF9NRDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXIHwgU0tfRVJSQ0xfSU5JVCwgU0tFUlJfSFdJX0UwMTYsCisJCQkJCVNLRVJSX0hXSV9FMDE2TVNHKTsKKwkJCX0KKwkJfQorCQllbHNlIHsJLyogc3BlY2lhbCBkZWZpbmVzIGZvciBGSUJFUiAoODhFMTAxMVMgb25seSkgKi8KKwkJCQorCQkJLyogU2V0IEZ1bGwvaGFsZiBkdXBsZXggY2FwYWJpbGl0aWVzICovCisJCQlzd2l0Y2ggKHBQcnQtPlBMaW5rTW9kZSkgeworCQkJY2FzZSBTS19MTU9ERV9BVVRPSEFMRjoKKwkJCQlBdXRvTmVnQWR2IHw9IFBIWV9NX0FOXzEwMDBYX0FIRDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0tfTE1PREVfQVVUT0ZVTEw6CisJCQkJQXV0b05lZ0FkdiB8PSBQSFlfTV9BTl8xMDAwWF9BRkQ7CisJCQkJYnJlYWs7CisJCQljYXNlIFNLX0xNT0RFX0FVVE9CT1RIOgorCQkJCUF1dG9OZWdBZHYgfD0gUEhZX01fQU5fMTAwMFhfQUhEIHwgUEhZX01fQU5fMTAwMFhfQUZEOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfU1cgfCBTS19FUlJDTF9JTklULCBTS0VSUl9IV0lfRTAxNSwKKwkJCQkJU0tFUlJfSFdJX0UwMTVNU0cpOworCQkJfQorCQkJCisJCQkvKiBTZXQgRmxvdy1jb250cm9sIGNhcGFiaWxpdGllcyAqLworCQkJc3dpdGNoIChwUHJ0LT5QRmxvd0N0cmxNb2RlKSB7CisJCQljYXNlIFNLX0ZMT1dfTU9ERV9OT05FOgorCQkJCUF1dG9OZWdBZHYgfD0gUEhZX01fUF9OT19QQVVTRV9YOworCQkJCWJyZWFrOworCQkJY2FzZSBTS19GTE9XX01PREVfTE9DX1NFTkQ6CisJCQkJQXV0b05lZ0FkdiB8PSBQSFlfTV9QX0FTWU1fTURfWDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0tfRkxPV19NT0RFX1NZTU1FVFJJQzoKKwkJCQlBdXRvTmVnQWR2IHw9IFBIWV9NX1BfU1lNX01EX1g7CisJCQkJYnJlYWs7CisJCQljYXNlIFNLX0ZMT1dfTU9ERV9TWU1fT1JfUkVNOgorCQkJCUF1dG9OZWdBZHYgfD0gUEhZX01fUF9CT1RIX01EX1g7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVyB8IFNLX0VSUkNMX0lOSVQsIFNLRVJSX0hXSV9FMDE2LAorCQkJCQlTS0VSUl9IV0lfRTAxNk1TRyk7CisJCQl9CisJCX0KKworCQlpZiAoIURvTG9vcCkgeworCQkJLyogUmVzdGFydCBBdXRvLW5lZ290aWF0aW9uICovCisJCQlQaHlDdHJsIHw9IFBIWV9DVF9BTkUgfCBQSFlfQ1RfUkVfQ0ZHOworCQl9CisJfQorCQorI2lmZGVmIFZDUFUKKwkvKgorCSAqIEUtbWFpbCBmcm9tIEd1IExpbiAoMDgtMDMtMjAwMik6CisJICovCisJCisJLyogUHJvZ3JhbSBQSFkgcmVnaXN0ZXIgMzAgYXMgMTYnaDA3MDggZm9yIHNpbXVsYXRpb24gc3BlZWQgdXAgKi8KKwlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIDMwLCAweDA3MDAgLyogMHgwNzA4ICovKTsKKwkKKwlWQ3B1V2FpdCgyMDAwKTsKKworI2Vsc2UgLyogVkNQVSAqLworCQorCS8qIFdyaXRlIDEwMDBCYXNlLVQgQ29udHJvbCBSZWdpc3RlciAqLworCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfMTAwMFRfQ1RSTCwgQzEwMDBCYXNlVCk7CisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNldCAxMDAwQi1UIEN0cmwgPTB4JTA0WFxuIiwgQzEwMDBCYXNlVCkpOworCQorCS8qIFdyaXRlIEF1dG9OZWcgQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAqLworCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfQVVORV9BRFYsIEF1dG9OZWdBZHYpOworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJTZXQgQXV0by1OZWcuQWR2Lj0weCUwNFhcbiIsIEF1dG9OZWdBZHYpKTsKKyNlbmRpZiAvKiBWQ1BVICovCisJCisJaWYgKERvTG9vcCkgeworCQkvKiBTZXQgdGhlIFBIWSBMb29wYmFjayBiaXQgKi8KKwkJUGh5Q3RybCB8PSBQSFlfQ1RfTE9PUDsKKworI2lmZGVmIFhYWAorCQkvKiBQcm9ncmFtIFBIWSByZWdpc3RlciAxNiBhcyAxNidoMDQwMCB0byBmb3JjZSBsaW5rIGdvb2QgKi8KKwkJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9QSFlfQ1RSTCwgUEhZX01fUENfRkxfR09PRCk7CisjZW5kaWYgLyogWFhYICovCisKKyNpZm5kZWYgVkNQVQorCQlpZiAocFBydC0+UExpbmtTcGVlZCAhPSBTS19MU1BFRURfQVVUTykgeworCQkJLyogV3JpdGUgRXh0LiBQSFkgU3BlY2lmaWMgQ29udHJvbCAqLworCQkJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9FWFRfQ1RSTCwKKwkJCQkoU0tfVTE2KSgocFBydC0+UExpbmtTcGVlZCArIDIpIDw8IDQpKTsKKwkJfQorI2VuZGlmIC8qIFZDUFUgKi8KKwl9CisjaWZkZWYgVEVTVF9PTkxZCisJZWxzZSBpZiAocFBydC0+UExpbmtTcGVlZCA9PSBTS19MU1BFRURfMTBNQlBTKSB7CisJCQkvKiBXcml0ZSBQSFkgU3BlY2lmaWMgQ29udHJvbCAqLworCQkJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9QSFlfQ1RSTCwKKwkJCQlQSFlfTV9QQ19FTl9ERVRfTVNLKTsKKwl9CisjZW5kaWYKKworCS8qIFdyaXRlIHRvIHRoZSBQSFkgQ29udHJvbCByZWdpc3RlciAqLworCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfQ1RSTCwgUGh5Q3RybCk7CisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkoIlNldCBQSFkgQ3RybCBSZWcuPTB4JTA0WFxuIiwgUGh5Q3RybCkpOworCisjaWZkZWYgVkNQVQorCVZDcHVXYWl0KDIwMDApOworI2Vsc2UKKworCUxlZEN0cmwgPSBQSFlfTV9MRURfUFVMU19EVVIoUFVMU18xNzBNUykgfCBQSFlfTV9MRURfQkxJTktfUlQoQkxJTktfODRNUyk7CisKKwlpZiAoKHBBQy0+R0luaS5HSUxlZEJsaW5rQ3RybCAmIFNLX0FDVF9MRURfQkxJTkspICE9IDApIHsKKwkJTGVkQ3RybCB8PSBQSFlfTV9MRURDX1JYX0NUUkwgfCBQSFlfTV9MRURDX1RYX0NUUkw7CisJfQorCisJaWYgKChwQUMtPkdJbmkuR0lMZWRCbGlua0N0cmwgJiBTS19EVVBfTEVEX05PUk1BTCkgIT0gMCkgeworCQlMZWRDdHJsIHw9IFBIWV9NX0xFRENfRFBfQ1RSTDsKKwl9CisJCisJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9MRURfQ1RSTCwgTGVkQ3RybCk7CisKKwlpZiAoKHBBQy0+R0luaS5HSUxlZEJsaW5rQ3RybCAmIFNLX0xFRF9MSU5LMTAwX09OKSAhPSAwKSB7CisJCS8qIG9ubHkgaW4gZm9yY2VkIDEwMCBNYnBzIG1vZGUgKi8KKwkJaWYgKCFBdXRvTmVnICYmIHBQcnQtPlBMaW5rU3BlZWQgPT0gU0tfTFNQRUVEXzEwME1CUFMpIHsKKworCQkJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9MRURfT1ZFUiwKKwkJCQlQSFlfTV9MRURfTU9fMTAwKE1PX0xFRF9PTikpOworCQl9CisJfQorCisjaWZkZWYgU0tfRElBRworCWNfcHJpbnQoIlNldCBQSFkgQ3RybD0weCUwNFhcbiIsIFBoeUN0cmwpOworCWNfcHJpbnQoIlNldCAxMDAwIEItVD0weCUwNFhcbiIsIEMxMDAwQmFzZVQpOworCWNfcHJpbnQoIlNldCBBdXRvLU5lZz0weCUwNFhcbiIsIEF1dG9OZWdBZHYpOworCWNfcHJpbnQoIlNldCBFeHQgQ3RybD0weCUwNFhcbiIsIEV4dFBoeUN0cmwpOworI2VuZGlmIC8qIFNLX0RJQUcgKi8KKworI2lmIGRlZmluZWQoU0tfRElBRykgfHwgZGVmaW5lZChERUJVRykKKwkvKiBSZWFkIFBIWSBDb250cm9sICovCisJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0NUUkwsICZQaHlDdHJsKTsKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiUEhZIEN0cmwgUmVnLj0weCUwNFhcbiIsIFBoeUN0cmwpKTsKKwkKKwkvKiBSZWFkIDEwMDBCYXNlLVQgQ29udHJvbCBSZWdpc3RlciAqLworCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl8xMDAwVF9DVFJMLCAmQzEwMDBCYXNlVCk7CisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkoIjEwMDBCLVQgQ3RybCA9MHglMDRYXG4iLCBDMTAwMEJhc2VUKSk7CisJCisJLyogUmVhZCBBdXRvTmVnIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIgKi8KKwlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfQVVORV9BRFYsICZBdXRvTmVnQWR2KTsKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiQXV0by1OZWcuQWR2Lj0weCUwNFhcbiIsIEF1dG9OZWdBZHYpKTsKKwkKKwkvKiBSZWFkIEV4dC4gUEhZIFNwZWNpZmljIENvbnRyb2wgKi8KKwlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfRVhUX0NUUkwsICZFeHRQaHlDdHJsKTsKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiRXh0LiBQSFkgQ3RybD0weCUwNFhcbiIsIEV4dFBoeUN0cmwpKTsKKwkKKwkvKiBSZWFkIFBIWSBTdGF0dXMgKi8KKwlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfU1RBVCwgJlBoeVN0YXQpOworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJQSFkgU3RhdCBSZWcuPTB4JTA0WFxuIiwgUGh5U3RhdCkpOworCVNrR21QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9TVEFULCAmUGh5U3RhdDEpOworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJQSFkgU3RhdCBSZWcuPTB4JTA0WFxuIiwgUGh5U3RhdDEpKTsKKwkKKwkvKiBSZWFkIFBIWSBTcGVjaWZpYyBTdGF0dXMgKi8KKwlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfUEhZX1NUQVQsICZQaHlTcGVjU3RhdCk7CisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkoIlBIWSBTcGVjIFN0YXQ9MHglMDRYXG4iLCBQaHlTcGVjU3RhdCkpOworI2VuZGlmIC8qIFNLX0RJQUcgfHwgREVCVUcgKi8KKworI2lmZGVmIFNLX0RJQUcKKwljX3ByaW50KCJQSFkgQ3RybCBSZWc9MHglMDRYXG4iLCBQaHlDdHJsKTsKKwljX3ByaW50KCJQSFkgMTAwMCBSZWc9MHglMDRYXG4iLCBDMTAwMEJhc2VUKTsKKwljX3ByaW50KCJQSFkgQW5BZCBSZWc9MHglMDRYXG4iLCBBdXRvTmVnQWR2KTsKKwljX3ByaW50KCJFeHQgQ3RybCBSZWc9MHglMDRYXG4iLCBFeHRQaHlDdHJsKTsKKwljX3ByaW50KCJQSFkgU3RhdCBSZWc9MHglMDRYXG4iLCBQaHlTdGF0KTsKKwljX3ByaW50KCJQSFkgU3RhdCBSZWc9MHglMDRYXG4iLCBQaHlTdGF0MSk7CisJY19wcmludCgiUEhZIFNwZWMgUmVnPTB4JTA0WFxuIiwgUGh5U3BlY1N0YXQpOworI2VuZGlmIC8qIFNLX0RJQUcgKi8KKworI2VuZGlmIC8qIFZDUFUgKi8KKworfQkvKiBTa0dtSW5pdFBoeU1hcnYgKi8KKyNlbmRpZiAvKiBZVUtPTiAqLworCisKKyNpZmRlZiBPVEhFUl9QSFkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1htSW5pdFBoeUxvbmUoKSAtIEluaXRpYWxpemUgdGhlIExldmVsIE9uZSBQaHkgcmVnaXN0ZXJzCisgKgorICogRGVzY3JpcHRpb246CWluaXRpYWxpemVzIGFsbCB0aGUgTGV2ZWwgT25lIFBoeSByZWdpc3RlcnMKKyAqCisgKiBOb3RlOgorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3N0YXRpYyB2b2lkIFNrWG1Jbml0UGh5TG9uZSgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitTS19CT09MCURvTG9vcCkJCS8qIFNob3VsZCBhIFBoeSBMb29wQmFjayBiZSBzZXQtdXA/ICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OworCVNLX1UxNgkJQ3RybDE7CisJU0tfVTE2CQlDdHJsMjsKKwlTS19VMTYJCUN0cmwzOworCisJQ3RybDEgPSBQSFlfQ1RfU1AxMDAwOworCUN0cmwyID0gMDsKKwlDdHJsMyA9IFBIWV9TRUxfVFlQRTsKKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJLyogbWFudWFsbHkgTWFzdGVyL1NsYXZlID8gKi8KKwlpZiAocFBydC0+UE1TTW9kZSAhPSBTS19NU19NT0RFX0FVVE8pIHsKKwkJQ3RybDIgfD0gUEhZX0xfMTAwMENfTVNFOworCQkKKwkJaWYgKHBQcnQtPlBNU01vZGUgPT0gU0tfTVNfTU9ERV9NQVNURVIpIHsKKwkJCUN0cmwyIHw9IFBIWV9MXzEwMDBDX01TQzsKKwkJfQorCX0KKwkvKiBBdXRvLW5lZ290aWF0aW9uID8gKi8KKwlpZiAocFBydC0+UExpbmtNb2RlID09IFNLX0xNT0RFX0hBTEYgfHwgcFBydC0+UExpbmtNb2RlID09IFNLX0xNT0RFX0ZVTEwpIHsKKwkJLyoKKwkJICogbGV2ZWwgb25lIHNwZWMgc2F5OiAiMTAwMCBNYnBzOiBtYW51YWwgbW9kZSBub3QgYWxsb3dlZCIKKwkJICogYnV0IGxldHMgc2VlIHdoYXQgaGFwcGVucy4uLgorCQkgKi8KKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJJbml0UGh5TG9uZTogbm8gYXV0by1uZWdvdGlhdGlvbiBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCS8qIFNldCBEdXBsZXhNb2RlIGluIENvbmZpZyByZWdpc3RlciAqLworCQlpZiAocFBydC0+UExpbmtNb2RlID09IFNLX0xNT0RFX0ZVTEwpIHsKKwkJCUN0cmwxIHw9IFBIWV9DVF9EVVBfTUQ7CisJCX0KKworCQkvKiBEZXRlcm1pbmUgTWFzdGVyL1NsYXZlIG1hbnVhbGx5IGlmIG5vdCBhbHJlYWR5IGRvbmUgKi8KKwkJaWYgKHBQcnQtPlBNU01vZGUgPT0gU0tfTVNfTU9ERV9BVVRPKSB7CisJCQlDdHJsMiB8PSBQSFlfTF8xMDAwQ19NU0U7CS8qIHNldCBpdCB0byBTbGF2ZSAqLworCQl9CisKKwkJLyoKKwkJICogRG8gTk9UIGVuYWJsZSBBdXRvLW5lZ290aWF0aW9uIGhlcmUuIFRoaXMgd291bGQgaG9sZAorCQkgKiB0aGUgbGluayBkb3duIGJlY2F1c2Ugbm8gSURMRVMgYXJlIHRyYW5zbWl0dGVkCisJCSAqLworCX0KKwllbHNlIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJJbml0UGh5TG9uZTogd2l0aCBhdXRvLW5lZ290aWF0aW9uIFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJLyogU2V0IEF1dG8tbmVnb3RpYXRpb24gYWR2ZXJ0aXNlbWVudCAqLworCisJCS8qIFNldCBGdWxsL2hhbGYgZHVwbGV4IGNhcGFiaWxpdGllcyAqLworCQlzd2l0Y2ggKHBQcnQtPlBMaW5rTW9kZSkgeworCQljYXNlIFNLX0xNT0RFX0FVVE9IQUxGOgorCQkJQ3RybDIgfD0gUEhZX0xfMTAwMENfQUhEOworCQkJYnJlYWs7CisJCWNhc2UgU0tfTE1PREVfQVVUT0ZVTEw6CisJCQlDdHJsMiB8PSBQSFlfTF8xMDAwQ19BRkQ7CisJCQlicmVhazsKKwkJY2FzZSBTS19MTU9ERV9BVVRPQk9USDoKKwkJCUN0cmwyIHw9IFBIWV9MXzEwMDBDX0FGRCB8IFBIWV9MXzEwMDBDX0FIRDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXIHwgU0tfRVJSQ0xfSU5JVCwgU0tFUlJfSFdJX0UwMTUsCisJCQkJU0tFUlJfSFdJX0UwMTVNU0cpOworCQl9CisKKwkJLyogU2V0IEZsb3ctY29udHJvbCBjYXBhYmlsaXRpZXMgKi8KKwkJc3dpdGNoIChwUHJ0LT5QRmxvd0N0cmxNb2RlKSB7CisJCWNhc2UgU0tfRkxPV19NT0RFX05PTkU6CisJCQlDdHJsMyB8PSBQSFlfTF9QX05PX1BBVVNFOworCQkJYnJlYWs7CisJCWNhc2UgU0tfRkxPV19NT0RFX0xPQ19TRU5EOgorCQkJQ3RybDMgfD0gUEhZX0xfUF9BU1lNX01EOworCQkJYnJlYWs7CisJCWNhc2UgU0tfRkxPV19NT0RFX1NZTU1FVFJJQzoKKwkJCUN0cmwzIHw9IFBIWV9MX1BfU1lNX01EOworCQkJYnJlYWs7CisJCWNhc2UgU0tfRkxPV19NT0RFX1NZTV9PUl9SRU06CisJCQlDdHJsMyB8PSBQSFlfTF9QX0JPVEhfTUQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVyB8IFNLX0VSUkNMX0lOSVQsIFNLRVJSX0hXSV9FMDE2LAorCQkJCVNLRVJSX0hXSV9FMDE2TVNHKTsKKwkJfQorCisJCS8qIFJlc3RhcnQgQXV0by1uZWdvdGlhdGlvbiAqLworCQlDdHJsMSA9IFBIWV9DVF9BTkUgfCBQSFlfQ1RfUkVfQ0ZHOworCX0KKwkKKwkvKiBXcml0ZSAxMDAwQmFzZS1UIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlTa1htUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9MT05FXzEwMDBUX0NUUkwsIEN0cmwyKTsKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiMTAwMEItVCBDdHJsIFJlZz0weCUwNFhcbiIsIEN0cmwyKSk7CisJCisJLyogV3JpdGUgQXV0b05lZyBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyICovCisJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTE9ORV9BVU5FX0FEViwgQ3RybDMpOworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJBdXRvLU5lZy5BZHYuUmVnPTB4JTA0WFxuIiwgQ3RybDMpKTsKKworCWlmIChEb0xvb3ApIHsKKwkJLyogU2V0IHRoZSBQaHkgTG9vcGJhY2sgYml0LCB0b28gKi8KKwkJQ3RybDEgfD0gUEhZX0NUX0xPT1A7CisJfQorCisJLyogV3JpdGUgdG8gdGhlIFBoeSBjb250cm9sIHJlZ2lzdGVyICovCisJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTE9ORV9DVFJMLCBDdHJsMSk7CisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkoIlBIWSBDb250cm9sIFJlZz0weCUwNFhcbiIsIEN0cmwxKSk7Cit9CS8qIFNrWG1Jbml0UGh5TG9uZSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1htSW5pdFBoeU5hdCgpIC0gSW5pdGlhbGl6ZSB0aGUgTmF0aW9uYWwgUGh5IHJlZ2lzdGVycworICoKKyAqIERlc2NyaXB0aW9uOglpbml0aWFsaXplcyBhbGwgdGhlIE5hdGlvbmFsIFBoeSByZWdpc3RlcnMKKyAqCisgKiBOb3RlOgorICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3N0YXRpYyB2b2lkIFNrWG1Jbml0UGh5TmF0KAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK1NLX0JPT0wJRG9Mb29wKQkJLyogU2hvdWxkIGEgUGh5IExvb3BCYWNrIGJlIHNldC11cD8gKi8KK3sKKy8qIHRvZG86IE5hdGlvbmFsICovCit9CS8qIFNrWG1Jbml0UGh5TmF0ICovCisjZW5kaWYgLyogT1RIRVJfUEhZICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrTWFjSW5pdFBoeSgpIC0gSW5pdGlhbGl6ZSB0aGUgUEhZIHJlZ2lzdGVycworICoKKyAqIERlc2NyaXB0aW9uOgljYWxscyB0aGUgSW5pdCBQSFkgcm91dGluZXMgZGVwLiBvbiBib2FyZCB0eXBlCisgKgorICogTm90ZToKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrTWFjSW5pdFBoeSgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitTS19CT09MCURvTG9vcCkJCS8qIFNob3VsZCBhIFBoeSBMb29wQmFjayBiZSBzZXQtdXA/ICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKyNpZmRlZiBHRU5FU0lTCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCisJCXN3aXRjaCAocFBydC0+UGh5VHlwZSkgeworCQljYXNlIFNLX1BIWV9YTUFDOgorCQkJU2tYbUluaXRQaHlYbWFjKHBBQywgSW9DLCBQb3J0LCBEb0xvb3ApOworCQkJYnJlYWs7CisJCWNhc2UgU0tfUEhZX0JDT006CisJCQlTa1htSW5pdFBoeUJjb20ocEFDLCBJb0MsIFBvcnQsIERvTG9vcCk7CisJCQlicmVhazsKKyNpZmRlZiBPVEhFUl9QSFkKKwkJY2FzZSBTS19QSFlfTE9ORToKKwkJCVNrWG1Jbml0UGh5TG9uZShwQUMsIElvQywgUG9ydCwgRG9Mb29wKTsKKwkJCWJyZWFrOworCQljYXNlIFNLX1BIWV9OQVQ6CisJCQlTa1htSW5pdFBoeU5hdChwQUMsIElvQywgUG9ydCwgRG9Mb29wKTsKKwkJCWJyZWFrOworI2VuZGlmIC8qIE9USEVSX1BIWSAqLworCQl9CisJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCWlmIChwQUMtPkdJbmkuR0lZdWtvbikgeworCQkKKwkJU2tHbUluaXRQaHlNYXJ2KHBBQywgSW9DLCBQb3J0LCBEb0xvb3ApOworCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCit9CS8qIFNrTWFjSW5pdFBoeSAqLworCisKKyNpZmRlZiBHRU5FU0lTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tYbUF1dG9OZWdEb25lWG1hYygpIC0gQXV0by1uZWdvdGlhdGlvbiBoYW5kbGluZworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBhdXRvLW5lZ290aWF0aW9uIGlmIHRoZSBEb25lIGJpdCBpcyBzZXQuCisgKgorICogUmV0dXJuczoKKyAqCVNLX0FORF9PSwlvLmsuCisgKglTS19BTkRfRFVQX0NBUCAJRHVwbGV4IGNhcGFiaWxpdHkgZXJyb3IgaGFwcGVuZWQKKyAqCVNLX0FORF9PVEhFUiAJT3RoZXIgZXJyb3IgaGFwcGVuZWQKKyAqLworc3RhdGljIGludCBTa1htQXV0b05lZ0RvbmVYbWFjKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CisJU0tfVTE2CQlSZXNBYjsJCS8qIFJlc29sdmVkIEFiaWxpdHkgKi8KKwlTS19VMTYJCUxQQWI7CQkvKiBMaW5rIFBhcnRuZXIgQWJpbGl0eSAqLworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkoIkF1dG9OZWdEb25lWG1hYywgUG9ydCAlZFxuIiwgUG9ydCkpOworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwkvKiBHZXQgUEhZIHBhcmFtZXRlcnMgKi8KKwlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX1hNQUNfQVVORV9MUCwgJkxQQWIpOworCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfWE1BQ19SRVNfQUJJLCAmUmVzQWIpOworCisJaWYgKChMUEFiICYgUEhZX1hfQU5fUkZCKSAhPSAwKSB7CisJCS8qIEF0IGxlYXN0IG9uZSBvZiB0aGUgcmVtb3RlIGZhdWx0IGJpdCBpcyBzZXQgKi8KKwkJLyogRXJyb3IgKi8KKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJBdXRvTmVnRmFpbDogUmVtb3RlIGZhdWx0IGJpdCBzZXQgUG9ydCAlZFxuIiwgUG9ydCkpOworCQlwUHJ0LT5QQXV0b05lZ0ZhaWwgPSBTS19UUlVFOworCQlyZXR1cm4oU0tfQU5EX09USEVSKTsKKwl9CisKKwkvKiBDaGVjayBEdXBsZXggbWlzbWF0Y2ggKi8KKwlpZiAoKFJlc0FiICYgKFBIWV9YX1JTX0hEIHwgUEhZX1hfUlNfRkQpKSA9PSBQSFlfWF9SU19GRCkgeworCQlwUHJ0LT5QTGlua01vZGVTdGF0dXMgPSAoU0tfVTgpU0tfTE1PREVfU1RBVF9BVVRPRlVMTDsKKwl9CisJZWxzZSBpZiAoKFJlc0FiICYgKFBIWV9YX1JTX0hEIHwgUEhZX1hfUlNfRkQpKSA9PSBQSFlfWF9SU19IRCkgeworCQlwUHJ0LT5QTGlua01vZGVTdGF0dXMgPSAoU0tfVTgpU0tfTE1PREVfU1RBVF9BVVRPSEFMRjsKKwl9CisJZWxzZSB7CisJCS8qIEVycm9yICovCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQXV0b05lZ0ZhaWw6IER1cGxleCBtb2RlIG1pc21hdGNoIFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJcFBydC0+UEF1dG9OZWdGYWlsID0gU0tfVFJVRTsKKwkJcmV0dXJuKFNLX0FORF9EVVBfQ0FQKTsKKwl9CisKKwkvKiBDaGVjayBQQVVTRSBtaXNtYXRjaCAqLworCS8qIFdlIGFyZSBOT1QgdXNpbmcgY2hhcHRlciA0LjIzIG9mIHRoZSBYYXF0aSBtYW51YWwgKi8KKwkvKiBXZSBhcmUgdXNpbmcgSUVFRSA4MDIuM3ovRDUuMCBUYWJsZSAzNy00ICovCisJaWYgKChwUHJ0LT5QRmxvd0N0cmxNb2RlID09IFNLX0ZMT1dfTU9ERV9TWU1NRVRSSUMgfHwKKwkgICAgIHBQcnQtPlBGbG93Q3RybE1vZGUgPT0gU0tfRkxPV19NT0RFX1NZTV9PUl9SRU0pICYmCisJICAgIChMUEFiICYgUEhZX1hfUF9TWU1fTUQpICE9IDApIHsKKwkJLyogU3ltbWV0cmljIFBBVVNFICovCisJCXBQcnQtPlBGbG93Q3RybFN0YXR1cyA9IFNLX0ZMT1dfU1RBVF9TWU1NRVRSSUM7CisJfQorCWVsc2UgaWYgKHBQcnQtPlBGbG93Q3RybE1vZGUgPT0gU0tfRkxPV19NT0RFX1NZTV9PUl9SRU0gJiYKKwkJICAgKExQQWIgJiBQSFlfWF9SU19QQVVTRSkgPT0gUEhZX1hfUF9BU1lNX01EKSB7CisJCS8qIEVuYWJsZSBQQVVTRSByZWNlaXZlLCBkaXNhYmxlIFBBVVNFIHRyYW5zbWl0ICovCisJCXBQcnQtPlBGbG93Q3RybFN0YXR1cyA9IFNLX0ZMT1dfU1RBVF9SRU1fU0VORDsKKwl9CisJZWxzZSBpZiAocFBydC0+UEZsb3dDdHJsTW9kZSA9PSBTS19GTE9XX01PREVfTE9DX1NFTkQgJiYKKwkJICAgKExQQWIgJiBQSFlfWF9SU19QQVVTRSkgPT0gUEhZX1hfUF9CT1RIX01EKSB7CisJCS8qIERpc2FibGUgUEFVU0UgcmVjZWl2ZSwgZW5hYmxlIFBBVVNFIHRyYW5zbWl0ICovCisJCXBQcnQtPlBGbG93Q3RybFN0YXR1cyA9IFNLX0ZMT1dfU1RBVF9MT0NfU0VORDsKKwl9CisJZWxzZSB7CisJCS8qIFBBVVNFIG1pc21hdGNoIC0+IG5vIFBBVVNFICovCisJCXBQcnQtPlBGbG93Q3RybFN0YXR1cyA9IFNLX0ZMT1dfU1RBVF9OT05FOworCX0KKwlwUHJ0LT5QTGlua1NwZWVkVXNlZCA9IChTS19VOClTS19MU1BFRURfU1RBVF8xMDAwTUJQUzsKKworCXJldHVybihTS19BTkRfT0spOworfQkvKiBTa1htQXV0b05lZ0RvbmVYbWFjICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrWG1BdXRvTmVnRG9uZUJjb20oKSAtIEF1dG8tbmVnb3RpYXRpb24gaGFuZGxpbmcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgYXV0by1uZWdvdGlhdGlvbiBpZiB0aGUgRG9uZSBiaXQgaXMgc2V0LgorICoKKyAqIFJldHVybnM6CisgKglTS19BTkRfT0sJby5rLgorICoJU0tfQU5EX0RVUF9DQVAgCUR1cGxleCBjYXBhYmlsaXR5IGVycm9yIGhhcHBlbmVkCisgKglTS19BTkRfT1RIRVIgCU90aGVyIGVycm9yIGhhcHBlbmVkCisgKi8KK3N0YXRpYyBpbnQgU2tYbUF1dG9OZWdEb25lQmNvbSgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OworCVNLX1UxNgkJTFBBYjsJCS8qIExpbmsgUGFydG5lciBBYmlsaXR5ICovCisJU0tfVTE2CQlBdXhTdGF0OwkvKiBBdXhpbGlhcnkgU3RhdHVzICovCisKKyNpZmRlZiBURVNUX09OTFkKKzAxLVNlcC0yMDAwIFJBOzo7OgorCVNLX1UxNgkJUmVzQWI7CQkvKiBSZXNvbHZlZCBBYmlsaXR5ICovCisjZW5kaWYJLyogMCAqLworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkoIkF1dG9OZWdEb25lQmNvbSwgUG9ydCAlZFxuIiwgUG9ydCkpOworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisJLyogR2V0IFBIWSBwYXJhbWV0ZXJzICovCisJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0FVTkVfTFAsICZMUEFiKTsKKyNpZmRlZiBURVNUX09OTFkKKzAxLVNlcC0yMDAwIFJBOzo7OgorCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV8xMDAwVF9TVEFULCAmUmVzQWIpOworI2VuZGlmCS8qIDAgKi8KKwkKKwlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQVVYX1NUQVQsICZBdXhTdGF0KTsKKworCWlmICgoTFBBYiAmIFBIWV9CX0FOX1JGKSAhPSAwKSB7CisJCS8qIFJlbW90ZSBmYXVsdCBiaXQgaXMgc2V0OiBFcnJvciAqLworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkF1dG9OZWdGYWlsOiBSZW1vdGUgZmF1bHQgYml0IHNldCBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCXBQcnQtPlBBdXRvTmVnRmFpbCA9IFNLX1RSVUU7CisJCXJldHVybihTS19BTkRfT1RIRVIpOworCX0KKworCS8qIENoZWNrIER1cGxleCBtaXNtYXRjaCAqLworCWlmICgoQXV4U3RhdCAmIFBIWV9CX0FTX0FOX1JFU19NU0spID09IFBIWV9CX1JFU18xMDAwRkQpIHsKKwkJcFBydC0+UExpbmtNb2RlU3RhdHVzID0gKFNLX1U4KVNLX0xNT0RFX1NUQVRfQVVUT0ZVTEw7CisJfQorCWVsc2UgaWYgKChBdXhTdGF0ICYgUEhZX0JfQVNfQU5fUkVTX01TSykgPT0gUEhZX0JfUkVTXzEwMDBIRCkgeworCQlwUHJ0LT5QTGlua01vZGVTdGF0dXMgPSAoU0tfVTgpU0tfTE1PREVfU1RBVF9BVVRPSEFMRjsKKwl9CisJZWxzZSB7CisJCS8qIEVycm9yICovCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQXV0b05lZ0ZhaWw6IER1cGxleCBtb2RlIG1pc21hdGNoIFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJcFBydC0+UEF1dG9OZWdGYWlsID0gU0tfVFJVRTsKKwkJcmV0dXJuKFNLX0FORF9EVVBfQ0FQKTsKKwl9CisJCisjaWZkZWYgVEVTVF9PTkxZCiswMS1TZXAtMjAwMCBSQTs6OzoKKwkvKiBDaGVjayBNYXN0ZXIvU2xhdmUgcmVzb2x1dGlvbiAqLworCWlmICgoUmVzQWIgJiBQSFlfQl8xMDAwU19NU0YpICE9IDApIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJNYXN0ZXIvU2xhdmUgRmF1bHQgUG9ydCAlZFxuIiwgUG9ydCkpOworCQlwUHJ0LT5QQXV0b05lZ0ZhaWwgPSBTS19UUlVFOworCQlwUHJ0LT5QTVNTdGF0dXMgPSBTS19NU19TVEFUX0ZBVUxUOworCQlyZXR1cm4oU0tfQU5EX09USEVSKTsKKwl9CisJCisJcFBydC0+UE1TU3RhdHVzID0gKChSZXNBYiAmIFBIWV9CXzEwMDBTX01TUikgIT0gMCkgPworCQlTS19NU19TVEFUX01BU1RFUiA6IFNLX01TX1NUQVRfU0xBVkU7CisjZW5kaWYJLyogMCAqLworCisJLyogQ2hlY2sgUEFVU0UgbWlzbWF0Y2ggPz8/ICovCisJLyogV2UgYXJlIHVzaW5nIElFRUUgODAyLjN6L0Q1LjAgVGFibGUgMzctNCAqLworCWlmICgoQXV4U3RhdCAmIFBIWV9CX0FTX1BBVVNFX01TSykgPT0gUEhZX0JfQVNfUEFVU0VfTVNLKSB7CisJCS8qIFN5bW1ldHJpYyBQQVVTRSAqLworCQlwUHJ0LT5QRmxvd0N0cmxTdGF0dXMgPSBTS19GTE9XX1NUQVRfU1lNTUVUUklDOworCX0KKwllbHNlIGlmICgoQXV4U3RhdCAmIFBIWV9CX0FTX1BBVVNFX01TSykgPT0gUEhZX0JfQVNfUFJSKSB7CisJCS8qIEVuYWJsZSBQQVVTRSByZWNlaXZlLCBkaXNhYmxlIFBBVVNFIHRyYW5zbWl0ICovCisJCXBQcnQtPlBGbG93Q3RybFN0YXR1cyA9IFNLX0ZMT1dfU1RBVF9SRU1fU0VORDsKKwl9CisJZWxzZSBpZiAoKEF1eFN0YXQgJiBQSFlfQl9BU19QQVVTRV9NU0spID09IFBIWV9CX0FTX1BSVCkgeworCQkvKiBEaXNhYmxlIFBBVVNFIHJlY2VpdmUsIGVuYWJsZSBQQVVTRSB0cmFuc21pdCAqLworCQlwUHJ0LT5QRmxvd0N0cmxTdGF0dXMgPSBTS19GTE9XX1NUQVRfTE9DX1NFTkQ7CisJfQorCWVsc2UgeworCQkvKiBQQVVTRSBtaXNtYXRjaCAtPiBubyBQQVVTRSAqLworCQlwUHJ0LT5QRmxvd0N0cmxTdGF0dXMgPSBTS19GTE9XX1NUQVRfTk9ORTsKKwl9CisJcFBydC0+UExpbmtTcGVlZFVzZWQgPSAoU0tfVTgpU0tfTFNQRUVEX1NUQVRfMTAwME1CUFM7CisKKwlyZXR1cm4oU0tfQU5EX09LKTsKK30JLyogU2tYbUF1dG9OZWdEb25lQmNvbSAqLworI2VuZGlmIC8qIEdFTkVTSVMgKi8KKworCisjaWZkZWYgWVVLT04KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dtQXV0b05lZ0RvbmVNYXJ2KCkgLSBBdXRvLW5lZ290aWF0aW9uIGhhbmRsaW5nCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGF1dG8tbmVnb3RpYXRpb24gaWYgdGhlIERvbmUgYml0IGlzIHNldC4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfQU5EX09LCW8uay4KKyAqCVNLX0FORF9EVVBfQ0FQIAlEdXBsZXggY2FwYWJpbGl0eSBlcnJvciBoYXBwZW5lZAorICoJU0tfQU5EX09USEVSIAlPdGhlciBlcnJvciBoYXBwZW5lZAorICovCitzdGF0aWMgaW50IFNrR21BdXRvTmVnRG9uZU1hcnYoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworCVNLX0dFUE9SVAkqcFBydDsKKwlTS19VMTYJCUxQQWI7CQkvKiBMaW5rIFBhcnRuZXIgQWJpbGl0eSAqLworCVNLX1UxNgkJUmVzQWI7CQkvKiBSZXNvbHZlZCBBYmlsaXR5ICovCisJU0tfVTE2CQlBdXhTdGF0OwkvKiBBdXhpbGlhcnkgU3RhdHVzICovCisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiQXV0b05lZ0RvbmVNYXJ2LCBQb3J0ICVkXG4iLCBQb3J0KSk7CisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwkvKiBHZXQgUEhZIHBhcmFtZXRlcnMgKi8KKwlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfQVVORV9MUCwgJkxQQWIpOworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJMaW5rIFAuQWJpbC49MHglMDRYXG4iLCBMUEFiKSk7CisJCisJaWYgKChMUEFiICYgUEhZX01fQU5fUkYpICE9IDApIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJBdXRvTmVnRmFpbDogUmVtb3RlIGZhdWx0IGJpdCBzZXQgUG9ydCAlZFxuIiwgUG9ydCkpOworCQlwUHJ0LT5QQXV0b05lZ0ZhaWwgPSBTS19UUlVFOworCQlyZXR1cm4oU0tfQU5EX09USEVSKTsKKwl9CisKKwlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfMTAwMFRfU1RBVCwgJlJlc0FiKTsKKwkKKwkvKiBDaGVjayBNYXN0ZXIvU2xhdmUgcmVzb2x1dGlvbiAqLworCWlmICgoUmVzQWIgJiBQSFlfQl8xMDAwU19NU0YpICE9IDApIHsKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJNYXN0ZXIvU2xhdmUgRmF1bHQgUG9ydCAlZFxuIiwgUG9ydCkpOworCQlwUHJ0LT5QQXV0b05lZ0ZhaWwgPSBTS19UUlVFOworCQlwUHJ0LT5QTVNTdGF0dXMgPSBTS19NU19TVEFUX0ZBVUxUOworCQlyZXR1cm4oU0tfQU5EX09USEVSKTsKKwl9CisJCisJcFBydC0+UE1TU3RhdHVzID0gKChSZXNBYiAmIFBIWV9CXzEwMDBTX01TUikgIT0gMCkgPworCQkoU0tfVTgpU0tfTVNfU1RBVF9NQVNURVIgOiAoU0tfVTgpU0tfTVNfU1RBVF9TTEFWRTsKKwkKKwkvKiBSZWFkIFBIWSBTcGVjaWZpYyBTdGF0dXMgKi8KKwlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfUEhZX1NUQVQsICZBdXhTdGF0KTsKKwkKKwkvKiBDaGVjayBTcGVlZCAmIER1cGxleCByZXNvbHZlZCAqLworCWlmICgoQXV4U3RhdCAmIFBIWV9NX1BTX1NQRFVQX1JFUykgPT0gMCkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkF1dG9OZWdGYWlsOiBTcGVlZCAmIER1cGxleCBub3QgcmVzb2x2ZWQsIFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkJcFBydC0+UEF1dG9OZWdGYWlsID0gU0tfVFJVRTsKKwkJcFBydC0+UExpbmtNb2RlU3RhdHVzID0gKFNLX1U4KVNLX0xNT0RFX1NUQVRfVU5LTk9XTjsKKwkJcmV0dXJuKFNLX0FORF9EVVBfQ0FQKTsKKwl9CisJCisJaWYgKChBdXhTdGF0ICYgUEhZX01fUFNfRlVMTF9EVVApICE9IDApIHsKKwkJcFBydC0+UExpbmtNb2RlU3RhdHVzID0gKFNLX1U4KVNLX0xNT0RFX1NUQVRfQVVUT0ZVTEw7CisJfQorCWVsc2UgeworCQlwUHJ0LT5QTGlua01vZGVTdGF0dXMgPSAoU0tfVTgpU0tfTE1PREVfU1RBVF9BVVRPSEFMRjsKKwl9CisJCisJLyogQ2hlY2sgUEFVU0UgbWlzbWF0Y2ggPz8/ICovCisJLyogV2UgYXJlIHVzaW5nIElFRUUgODAyLjN6L0Q1LjAgVGFibGUgMzctNCAqLworCWlmICgoQXV4U3RhdCAmIFBIWV9NX1BTX1BBVVNFX01TSykgPT0gUEhZX01fUFNfUEFVU0VfTVNLKSB7CisJCS8qIFN5bW1ldHJpYyBQQVVTRSAqLworCQlwUHJ0LT5QRmxvd0N0cmxTdGF0dXMgPSBTS19GTE9XX1NUQVRfU1lNTUVUUklDOworCX0KKwllbHNlIGlmICgoQXV4U3RhdCAmIFBIWV9NX1BTX1BBVVNFX01TSykgPT0gUEhZX01fUFNfUlhfUF9FTikgeworCQkvKiBFbmFibGUgUEFVU0UgcmVjZWl2ZSwgZGlzYWJsZSBQQVVTRSB0cmFuc21pdCAqLworCQlwUHJ0LT5QRmxvd0N0cmxTdGF0dXMgPSBTS19GTE9XX1NUQVRfUkVNX1NFTkQ7CisJfQorCWVsc2UgaWYgKChBdXhTdGF0ICYgUEhZX01fUFNfUEFVU0VfTVNLKSA9PSBQSFlfTV9QU19UWF9QX0VOKSB7CisJCS8qIERpc2FibGUgUEFVU0UgcmVjZWl2ZSwgZW5hYmxlIFBBVVNFIHRyYW5zbWl0ICovCisJCXBQcnQtPlBGbG93Q3RybFN0YXR1cyA9IFNLX0ZMT1dfU1RBVF9MT0NfU0VORDsKKwl9CisJZWxzZSB7CisJCS8qIFBBVVNFIG1pc21hdGNoIC0+IG5vIFBBVVNFICovCisJCXBQcnQtPlBGbG93Q3RybFN0YXR1cyA9IFNLX0ZMT1dfU1RBVF9OT05FOworCX0KKwkKKwkvKiBzZXQgdXNlZCBsaW5rIHNwZWVkICovCisJc3dpdGNoICgodW5zaWduZWQpKEF1eFN0YXQgJiBQSFlfTV9QU19TUEVFRF9NU0spKSB7CisJY2FzZSAodW5zaWduZWQpUEhZX01fUFNfU1BFRURfMTAwMDoKKwkJcFBydC0+UExpbmtTcGVlZFVzZWQgPSAoU0tfVTgpU0tfTFNQRUVEX1NUQVRfMTAwME1CUFM7CisJCWJyZWFrOworCWNhc2UgUEhZX01fUFNfU1BFRURfMTAwOgorCQlwUHJ0LT5QTGlua1NwZWVkVXNlZCA9IChTS19VOClTS19MU1BFRURfU1RBVF8xMDBNQlBTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwUHJ0LT5QTGlua1NwZWVkVXNlZCA9IChTS19VOClTS19MU1BFRURfU1RBVF8xME1CUFM7CisJfQorCisJcmV0dXJuKFNLX0FORF9PSyk7Cit9CS8qIFNrR21BdXRvTmVnRG9uZU1hcnYgKi8KKyNlbmRpZiAvKiBZVUtPTiAqLworCisKKyNpZmRlZiBPVEhFUl9QSFkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1htQXV0b05lZ0RvbmVMb25lKCkgLSBBdXRvLW5lZ290aWF0aW9uIGhhbmRsaW5nCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGF1dG8tbmVnb3RpYXRpb24gaWYgdGhlIERvbmUgYml0IGlzIHNldC4KKyAqCisgKiBSZXR1cm5zOgorICoJU0tfQU5EX09LCW8uay4KKyAqCVNLX0FORF9EVVBfQ0FQIAlEdXBsZXggY2FwYWJpbGl0eSBlcnJvciBoYXBwZW5lZAorICoJU0tfQU5EX09USEVSIAlPdGhlciBlcnJvciBoYXBwZW5lZAorICovCitzdGF0aWMgaW50IFNrWG1BdXRvTmVnRG9uZUxvbmUoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworCVNLX0dFUE9SVAkqcFBydDsKKwlTS19VMTYJCVJlc0FiOwkJLyogUmVzb2x2ZWQgQWJpbGl0eSAqLworCVNLX1UxNgkJTFBBYjsJCS8qIExpbmsgUGFydG5lciBBYmlsaXR5ICovCisJU0tfVTE2CQlRdWlja1N0YXQ7CS8qIEF1eGlsaWFyeSBTdGF0dXMgKi8KKworCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJKCJBdXRvTmVnRG9uZUxvbmUsIFBvcnQgJWRcbiIsIFBvcnQpKTsKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCS8qIEdldCBQSFkgcGFyYW1ldGVycyAqLworCVNrWG1QaHlSZWFkKHBBQywgSW9DLCBQb3J0LCBQSFlfTE9ORV9BVU5FX0xQLCAmTFBBYik7CisJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9MT05FXzEwMDBUX1NUQVQsICZSZXNBYik7CisJU2tYbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9MT05FX1FfU1RBVCwgJlF1aWNrU3RhdCk7CisKKwlpZiAoKExQQWIgJiBQSFlfTF9BTl9SRikgIT0gMCkgeworCQkvKiBSZW1vdGUgZmF1bHQgYml0IGlzIHNldCAqLworCQkvKiBFcnJvciAqLworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkF1dG9OZWdGYWlsOiBSZW1vdGUgZmF1bHQgYml0IHNldCBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCXBQcnQtPlBBdXRvTmVnRmFpbCA9IFNLX1RSVUU7CisJCXJldHVybihTS19BTkRfT1RIRVIpOworCX0KKworCS8qIENoZWNrIER1cGxleCBtaXNtYXRjaCAqLworCWlmICgoUXVpY2tTdGF0ICYgUEhZX0xfUVNfRFVQX01PRCkgIT0gMCkgeworCQlwUHJ0LT5QTGlua01vZGVTdGF0dXMgPSAoU0tfVTgpU0tfTE1PREVfU1RBVF9BVVRPRlVMTDsKKwl9CisJZWxzZSB7CisJCXBQcnQtPlBMaW5rTW9kZVN0YXR1cyA9IChTS19VOClTS19MTU9ERV9TVEFUX0FVVE9IQUxGOworCX0KKwkKKwkvKiBDaGVjayBNYXN0ZXIvU2xhdmUgcmVzb2x1dGlvbiAqLworCWlmICgoUmVzQWIgJiBQSFlfTF8xMDAwU19NU0YpICE9IDApIHsKKwkJLyogRXJyb3IgKi8KKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJNYXN0ZXIvU2xhdmUgRmF1bHQgUG9ydCAlZFxuIiwgUG9ydCkpOworCQlwUHJ0LT5QQXV0b05lZ0ZhaWwgPSBTS19UUlVFOworCQlwUHJ0LT5QTVNTdGF0dXMgPSBTS19NU19TVEFUX0ZBVUxUOworCQlyZXR1cm4oU0tfQU5EX09USEVSKTsKKwl9CisJZWxzZSBpZiAoUmVzQWIgJiBQSFlfTF8xMDAwU19NU1IpIHsKKwkJcFBydC0+UE1TU3RhdHVzID0gU0tfTVNfU1RBVF9NQVNURVI7CisJfQorCWVsc2UgeworCQlwUHJ0LT5QTVNTdGF0dXMgPSBTS19NU19TVEFUX1NMQVZFOworCX0KKworCS8qIENoZWNrIFBBVVNFIG1pc21hdGNoICovCisJLyogV2UgYXJlIHVzaW5nIElFRUUgODAyLjN6L0Q1LjAgVGFibGUgMzctNCAqLworCS8qIHdlIG11c3QgbWFudWFsbHkgcmVzb2x2ZSB0aGUgYWJpbGl0aWVzIGhlcmUgKi8KKwlwUHJ0LT5QRmxvd0N0cmxTdGF0dXMgPSBTS19GTE9XX1NUQVRfTk9ORTsKKwkKKwlzd2l0Y2ggKHBQcnQtPlBGbG93Q3RybE1vZGUpIHsKKwljYXNlIFNLX0ZMT1dfTU9ERV9OT05FOgorCQkvKiBkZWZhdWx0ICovCisJCWJyZWFrOworCWNhc2UgU0tfRkxPV19NT0RFX0xPQ19TRU5EOgorCQlpZiAoKFF1aWNrU3RhdCAmIChQSFlfTF9RU19QQVVTRSB8IFBIWV9MX1FTX0FTX1BBVVNFKSkgPT0KKwkJCShQSFlfTF9RU19QQVVTRSB8IFBIWV9MX1FTX0FTX1BBVVNFKSkgeworCQkJLyogRGlzYWJsZSBQQVVTRSByZWNlaXZlLCBlbmFibGUgUEFVU0UgdHJhbnNtaXQgKi8KKwkJCXBQcnQtPlBGbG93Q3RybFN0YXR1cyA9IFNLX0ZMT1dfU1RBVF9MT0NfU0VORDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNLX0ZMT1dfTU9ERV9TWU1NRVRSSUM6CisJCWlmICgoUXVpY2tTdGF0ICYgUEhZX0xfUVNfUEFVU0UpICE9IDApIHsKKwkJCS8qIFN5bW1ldHJpYyBQQVVTRSAqLworCQkJcFBydC0+UEZsb3dDdHJsU3RhdHVzID0gU0tfRkxPV19TVEFUX1NZTU1FVFJJQzsKKwkJfQorCQlicmVhazsKKwljYXNlIFNLX0ZMT1dfTU9ERV9TWU1fT1JfUkVNOgorCQlpZiAoKFF1aWNrU3RhdCAmIChQSFlfTF9RU19QQVVTRSB8IFBIWV9MX1FTX0FTX1BBVVNFKSkgPT0KKwkJCVBIWV9MX1FTX0FTX1BBVVNFKSB7CisJCQkvKiBFbmFibGUgUEFVU0UgcmVjZWl2ZSwgZGlzYWJsZSBQQVVTRSB0cmFuc21pdCAqLworCQkJcFBydC0+UEZsb3dDdHJsU3RhdHVzID0gU0tfRkxPV19TVEFUX1JFTV9TRU5EOworCQl9CisJCWVsc2UgaWYgKChRdWlja1N0YXQgJiBQSFlfTF9RU19QQVVTRSkgIT0gMCkgeworCQkJLyogU3ltbWV0cmljIFBBVVNFICovCisJCQlwUHJ0LT5QRmxvd0N0cmxTdGF0dXMgPSBTS19GTE9XX1NUQVRfU1lNTUVUUklDOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVNLX0VSUl9MT0cocEFDLCBTS19FUlJDTF9TVyB8IFNLX0VSUkNMX0lOSVQsIFNLRVJSX0hXSV9FMDE2LAorCQkJU0tFUlJfSFdJX0UwMTZNU0cpOworCX0KKwkKKwlyZXR1cm4oU0tfQU5EX09LKTsKK30JLyogU2tYbUF1dG9OZWdEb25lTG9uZSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1htQXV0b05lZ0RvbmVOYXQoKSAtIEF1dG8tbmVnb3RpYXRpb24gaGFuZGxpbmcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgYXV0by1uZWdvdGlhdGlvbiBpZiB0aGUgRG9uZSBiaXQgaXMgc2V0LgorICoKKyAqIFJldHVybnM6CisgKglTS19BTkRfT0sJby5rLgorICoJU0tfQU5EX0RVUF9DQVAgCUR1cGxleCBjYXBhYmlsaXR5IGVycm9yIGhhcHBlbmVkCisgKglTS19BTkRfT1RIRVIgCU90aGVyIGVycm9yIGhhcHBlbmVkCisgKi8KK3N0YXRpYyBpbnQgU2tYbUF1dG9OZWdEb25lTmF0KAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKy8qIHRvZG86IE5hdGlvbmFsICovCisJcmV0dXJuKFNLX0FORF9PSyk7Cit9CS8qIFNrWG1BdXRvTmVnRG9uZU5hdCAqLworI2VuZGlmIC8qIE9USEVSX1BIWSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa01hY0F1dG9OZWdEb25lKCkgLSBBdXRvLW5lZ290aWF0aW9uIGhhbmRsaW5nCisgKgorICogRGVzY3JpcHRpb246CWNhbGxzIHRoZSBhdXRvLW5lZ290aWF0aW9uIGRvbmUgcm91dGluZXMgZGVwLiBvbiBib2FyZCB0eXBlCisgKgorICogUmV0dXJuczoKKyAqCVNLX0FORF9PSwlvLmsuCisgKglTS19BTkRfRFVQX0NBUCAJRHVwbGV4IGNhcGFiaWxpdHkgZXJyb3IgaGFwcGVuZWQKKyAqCVNLX0FORF9PVEhFUiAJT3RoZXIgZXJyb3IgaGFwcGVuZWQKKyAqLworaW50CVNrTWFjQXV0b05lZ0RvbmUoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworCVNLX0dFUE9SVAkqcFBydDsKKwlpbnQJUnR2OworCisJUnR2ID0gU0tfQU5EX09LOworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKyNpZmRlZiBHRU5FU0lTCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCisJCXN3aXRjaCAocFBydC0+UGh5VHlwZSkgeworCQkKKwkJY2FzZSBTS19QSFlfWE1BQzoKKwkJCVJ0diA9IFNrWG1BdXRvTmVnRG9uZVhtYWMocEFDLCBJb0MsIFBvcnQpOworCQkJYnJlYWs7CisJCWNhc2UgU0tfUEhZX0JDT006CisJCQlSdHYgPSBTa1htQXV0b05lZ0RvbmVCY29tKHBBQywgSW9DLCBQb3J0KTsKKwkJCWJyZWFrOworI2lmZGVmIE9USEVSX1BIWQorCQljYXNlIFNLX1BIWV9MT05FOgorCQkJUnR2ID0gU2tYbUF1dG9OZWdEb25lTG9uZShwQUMsIElvQywgUG9ydCk7CisJCQlicmVhazsKKwkJY2FzZSBTS19QSFlfTkFUOgorCQkJUnR2ID0gU2tYbUF1dG9OZWdEb25lTmF0KHBBQywgSW9DLCBQb3J0KTsKKwkJCWJyZWFrOworI2VuZGlmIC8qIE9USEVSX1BIWSAqLworCQlkZWZhdWx0OgorCQkJcmV0dXJuKFNLX0FORF9PVEhFUik7CisJCX0KKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJaWYgKHBBQy0+R0luaS5HSVl1a29uKSB7CisJCQorCQlSdHYgPSBTa0dtQXV0b05lZ0RvbmVNYXJ2KHBBQywgSW9DLCBQb3J0KTsKKwl9CisjZW5kaWYgLyogWVVLT04gKi8KKwkKKwlpZiAoUnR2ICE9IFNLX0FORF9PSykgeworCQlyZXR1cm4oUnR2KTsKKwl9CisKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCSgiQXV0b05lZyBkb25lIFBvcnQgJWRcbiIsIFBvcnQpKTsKKwkKKwkvKiBXZSBjaGVja2VkIGV2ZXJ5dGhpbmcgYW5kIG1heSBub3cgZW5hYmxlIHRoZSBsaW5rICovCisJcFBydC0+UEF1dG9OZWdGYWlsID0gU0tfRkFMU0U7CisKKwlTa01hY1J4VHhFbmFibGUocEFDLCBJb0MsIFBvcnQpOworCQorCXJldHVybihTS19BTkRfT0spOworfQkvKiBTa01hY0F1dG9OZWdEb25lICovCisKKworI2lmZGVmIEdFTkVTSVMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1htU2V0UnhUeEVuKCkgLSBTcGVjaWFsIFNldCBSeC9UeCBFbmFibGUgYW5kIHNvbWUgZmVhdHVyZXMgaW4gWE1BQworICoKKyAqIERlc2NyaXB0aW9uOgorICogIHNldHMgTUFDIG9yIFBIWSBMb29wQmFjayBhbmQgRHVwbGV4IE1vZGUgaW4gdGhlIE1NVSBDb21tYW5kIFJlZy4KKyAqICBlbmFibGVzIFJ4L1R4CisgKgorICogUmV0dXJuczogTi9BCisgKi8KK3N0YXRpYyB2b2lkIFNrWG1TZXRSeFR4RW4oCitTS19BQwkqcEFDLAkJLyogQWRhcHRlciBDb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0LAkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworaW50CQlQYXJhKQkJLyogUGFyYW1ldGVyIHRvIHNldDogTUFDIG9yIFBIWSBMb29wQmFjaywgRHVwbGV4IE1vZGUgKi8KK3sKKwlTS19VMTYJV29yZDsKKworCVhNX0lOMTYoSW9DLCBQb3J0LCBYTV9NTVVfQ01ELCAmV29yZCk7CisKKwlzd2l0Y2ggKFBhcmEgJiAoU0tfTUFDX0xPT1BCX09OIHwgU0tfTUFDX0xPT1BCX09GRikpIHsKKwljYXNlIFNLX01BQ19MT09QQl9PTjoKKwkJV29yZCB8PSBYTV9NTVVfTUFDX0xCOworCQlicmVhazsKKwljYXNlIFNLX01BQ19MT09QQl9PRkY6CisJCVdvcmQgJj0gflhNX01NVV9NQUNfTEI7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoUGFyYSAmIChTS19QSFlfTE9PUEJfT04gfCBTS19QSFlfTE9PUEJfT0ZGKSkgeworCWNhc2UgU0tfUEhZX0xPT1BCX09OOgorCQlXb3JkIHw9IFhNX01NVV9HTUlJX0xPT1A7CisJCWJyZWFrOworCWNhc2UgU0tfUEhZX0xPT1BCX09GRjoKKwkJV29yZCAmPSB+WE1fTU1VX0dNSUlfTE9PUDsKKwkJYnJlYWs7CisJfQorCQorCXN3aXRjaCAoUGFyYSAmIChTS19QSFlfRlVMTERfT04gfCBTS19QSFlfRlVMTERfT0ZGKSkgeworCWNhc2UgU0tfUEhZX0ZVTExEX09OOgorCQlXb3JkIHw9IFhNX01NVV9HTUlJX0ZEOworCQlicmVhazsKKwljYXNlIFNLX1BIWV9GVUxMRF9PRkY6CisJCVdvcmQgJj0gflhNX01NVV9HTUlJX0ZEOworCQlicmVhazsKKwl9CisJCisJWE1fT1VUMTYoSW9DLCBQb3J0LCBYTV9NTVVfQ01ELCBXb3JkIHwgWE1fTU1VX0VOQV9SWCB8IFhNX01NVV9FTkFfVFgpOworCisJLyogZHVtbXkgcmVhZCB0byBlbnN1cmUgd3JpdGluZyAqLworCVhNX0lOMTYoSW9DLCBQb3J0LCBYTV9NTVVfQ01ELCAmV29yZCk7CisKK30JLyogU2tYbVNldFJ4VHhFbiAqLworI2VuZGlmIC8qIEdFTkVTSVMgKi8KKworCisjaWZkZWYgWVVLT04KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dtU2V0UnhUeEVuKCkgLSBTcGVjaWFsIFNldCBSeC9UeCBFbmFibGUgYW5kIHNvbWUgZmVhdHVyZXMgaW4gR01BQworICoKKyAqIERlc2NyaXB0aW9uOgorICogIHNldHMgTUFDIExvb3BCYWNrIGFuZCBEdXBsZXggTW9kZSBpbiB0aGUgR2VuZXJhbCBQdXJwb3NlIENvbnRyb2wgUmVnLgorICogIGVuYWJsZXMgUngvVHgKKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqLworc3RhdGljIHZvaWQgU2tHbVNldFJ4VHhFbigKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitpbnQJCVBhcmEpCQkvKiBQYXJhbWV0ZXIgdG8gc2V0OiBNQUMgTG9vcEJhY2ssIER1cGxleCBNb2RlICovCit7CisJU0tfVTE2CUN0cmw7CisJCisJR01fSU4xNihJb0MsIFBvcnQsIEdNX0dQX0NUUkwsICZDdHJsKTsKKworCXN3aXRjaCAoUGFyYSAmIChTS19NQUNfTE9PUEJfT04gfCBTS19NQUNfTE9PUEJfT0ZGKSkgeworCWNhc2UgU0tfTUFDX0xPT1BCX09OOgorCQlDdHJsIHw9IEdNX0dQQ1JfTE9PUF9FTkE7CisJCWJyZWFrOworCWNhc2UgU0tfTUFDX0xPT1BCX09GRjoKKwkJQ3RybCAmPSB+R01fR1BDUl9MT09QX0VOQTsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChQYXJhICYgKFNLX1BIWV9GVUxMRF9PTiB8IFNLX1BIWV9GVUxMRF9PRkYpKSB7CisJY2FzZSBTS19QSFlfRlVMTERfT046CisJCUN0cmwgfD0gR01fR1BDUl9EVVBfRlVMTDsKKwkJYnJlYWs7CisJY2FzZSBTS19QSFlfRlVMTERfT0ZGOgorCQlDdHJsICY9IH5HTV9HUENSX0RVUF9GVUxMOworCQlicmVhazsKKwl9CisJCisgICAgR01fT1VUMTYoSW9DLCBQb3J0LCBHTV9HUF9DVFJMLCAoU0tfVTE2KShDdHJsIHwgR01fR1BDUl9SWF9FTkEgfAorCQlHTV9HUENSX1RYX0VOQSkpOworCisJLyogZHVtbXkgcmVhZCB0byBlbnN1cmUgd3JpdGluZyAqLworCUdNX0lOMTYoSW9DLCBQb3J0LCBHTV9HUF9DVFJMLCAmQ3RybCk7CisKK30JLyogU2tHbVNldFJ4VHhFbiAqLworI2VuZGlmIC8qIFlVS09OICovCisKKworI2lmbmRlZiBTS19TTElNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tNYWNTZXRSeFR4RW4oKSAtIFNwZWNpYWwgU2V0IFJ4L1R4IEVuYWJsZSBhbmQgcGFyYW1ldGVycworICoKKyAqIERlc2NyaXB0aW9uOgljYWxscyB0aGUgU3BlY2lhbCBTZXQgUngvVHggRW5hYmxlIHJvdXRpbmVzIGRlcC4gb24gYm9hcmQgdHlwZQorICoKKyAqIFJldHVybnM6IE4vQQorICovCit2b2lkIFNrTWFjU2V0UnhUeEVuKAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCwJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK2ludAkJUGFyYSkKK3sKKyNpZmRlZiBHRU5FU0lTCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJCisJCVNrWG1TZXRSeFR4RW4ocEFDLCBJb0MsIFBvcnQsIFBhcmEpOworCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisJCisjaWZkZWYgWVVLT04KKwlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJCisJCVNrR21TZXRSeFR4RW4ocEFDLCBJb0MsIFBvcnQsIFBhcmEpOworCX0KKyNlbmRpZiAvKiBZVUtPTiAqLworCit9CS8qIFNrTWFjU2V0UnhUeEVuICovCisjZW5kaWYgLyogIVNLX1NMSU0gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tNYWNSeFR4RW5hYmxlKCkgLSBFbmFibGUgUngvVHggYWN0aXZpdHkgaWYgcG9ydCBpcyB1cAorICoKKyAqIERlc2NyaXB0aW9uOgllbmFibGVzIFJ4L1R4IGRlcC4gb24gYm9hcmQgdHlwZQorICoKKyAqIFJldHVybnM6CisgKgkwCW8uay4KKyAqCSE9IDAJRXJyb3IgaGFwcGVuZWQKKyAqLworaW50IFNrTWFjUnhUeEVuYWJsZSgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OworCVNLX1UxNgkJUmVnOwkJLyogMTYtYml0IHJlZ2lzdGVyIHZhbHVlICovCisJU0tfVTE2CQlJbnRNYXNrOwkvKiBNQUMgaW50ZXJydXB0IG1hc2sgKi8KKyNpZmRlZiBHRU5FU0lTCisJU0tfVTE2CQlTV29yZDsKKyNlbmRpZgorCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlpZiAoIXBQcnQtPlBIV0xpbmtVcCkgeworCQkvKiBUaGUgSGFyZHdhcmUgbGluayBpcyBOT1QgdXAgKi8KKwkJcmV0dXJuKDApOworCX0KKworCWlmICgocFBydC0+UExpbmtNb2RlID09IFNLX0xNT0RFX0FVVE9IQUxGIHx8CisJICAgICBwUHJ0LT5QTGlua01vZGUgPT0gU0tfTE1PREVfQVVUT0ZVTEwgfHwKKwkgICAgIHBQcnQtPlBMaW5rTW9kZSA9PSBTS19MTU9ERV9BVVRPQk9USCkgJiYKKwkgICAgIHBQcnQtPlBBdXRvTmVnRmFpbCkgeworCQkvKiBBdXRvLW5lZ290aWF0aW9uIGlzIG5vdCBkb25lIG9yIGZhaWxlZCAqLworCQlyZXR1cm4oMCk7CisJfQorCisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCS8qIHNldCBEdXBsZXggTW9kZSBhbmQgUGF1c2UgTW9kZSAqLworCQlTa1htSW5pdER1cE1kKHBBQywgSW9DLCBQb3J0KTsKKwkJCisJCVNrWG1Jbml0UGF1c2VNZChwQUMsIElvQywgUG9ydCk7CisJCisJCS8qCisJCSAqIEluaXRpYWxpemUgdGhlIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyLiBEZWZhdWx0IElSUXMgYXJlLi4uCisJCSAqCS0gTGluayBBc3luY2hyb25vdXMgRXZlbnQKKwkJICoJLSBMaW5rIFBhcnRuZXIgcmVxdWVzdHMgY29uZmlnCisJCSAqCS0gQXV0byBOZWdvdGlhdGlvbiBEb25lCisJCSAqCS0gUnggQ291bnRlciBFdmVudCBPdmVyZmxvdworCQkgKgktIFR4IENvdW50ZXIgRXZlbnQgT3ZlcmZsb3cKKwkJICoJLSBUcmFuc21pdCBGSUZPIFVuZGVycnVuCisJCSAqLworCQlJbnRNYXNrID0gWE1fREVGX01TSzsKKworI2lmZGVmIERFQlVHCisJCS8qIGFkZCBJUlEgZm9yIFJlY2VpdmUgRklGTyBPdmVyZmxvdyAqLworCQlJbnRNYXNrICY9IH5YTV9JU19SWEZfT1Y7CisjZW5kaWYgLyogREVCVUcgKi8KKwkJCisJCWlmIChwUHJ0LT5QaHlUeXBlICE9IFNLX1BIWV9YTUFDKSB7CisJCQkvKiBkaXNhYmxlIEdQMCBpbnRlcnJ1cHQgYml0ICovCisJCQlJbnRNYXNrIHw9IFhNX0lTX0lOUF9BU1M7CisJCX0KKwkJWE1fT1VUMTYoSW9DLCBQb3J0LCBYTV9JTVNLLCBJbnRNYXNrKTsKKwkKKwkJLyogZ2V0IE1NVSBDb21tYW5kIFJlZy4gKi8KKwkJWE1fSU4xNihJb0MsIFBvcnQsIFhNX01NVV9DTUQsICZSZWcpOworCQkKKwkJaWYgKHBQcnQtPlBoeVR5cGUgIT0gU0tfUEhZX1hNQUMgJiYKKwkJCShwUHJ0LT5QTGlua01vZGVTdGF0dXMgPT0gU0tfTE1PREVfU1RBVF9GVUxMIHx8CisJCQkgcFBydC0+UExpbmtNb2RlU3RhdHVzID09IFNLX0xNT0RFX1NUQVRfQVVUT0ZVTEwpKSB7CisJCQkvKiBzZXQgdG8gRnVsbCBEdXBsZXggKi8KKwkJCVJlZyB8PSBYTV9NTVVfR01JSV9GRDsKKwkJfQorCQkKKwkJc3dpdGNoIChwUHJ0LT5QaHlUeXBlKSB7CisJCWNhc2UgU0tfUEhZX0JDT006CisJCQkvKgorCQkJICogV29ya2Fyb3VuZCBCQ09NIEVycmF0YSAoIzEwNTIzKSBmb3IgYWxsIEJDb20gUGh5cworCQkJICogRW5hYmxlIFBvd2VyIE1hbmFnZW1lbnQgYWZ0ZXIgbGluayB1cAorCQkJICovCisJCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQVVYX0NUUkwsICZTV29yZCk7CisJCQlTa1htUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9CQ09NX0FVWF9DVFJMLAorCQkJCShTS19VMTYpKFNXb3JkICYgflBIWV9CX0FDX0RJU19QTSkpOworICAgICAgICAgICAgU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9JTlRfTUFTSywKKwkJCQkoU0tfVTE2KVBIWV9CX0RFRl9NU0spOworCQkJYnJlYWs7CisjaWZkZWYgT1RIRVJfUEhZCisJCWNhc2UgU0tfUEhZX0xPTkU6CisJCQlTa1htUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIFBIWV9MT05FX0lOVF9FTkFCLCBQSFlfTF9ERUZfTVNLKTsKKwkJCWJyZWFrOworCQljYXNlIFNLX1BIWV9OQVQ6CisJCQkvKiB0b2RvIE5hdGlvbmFsOgorCQkJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTkFUX0lOVF9NQVNLLCBQSFlfTl9ERUZfTVNLKTsgKi8KKwkJCS8qIG5vIGludGVycnVwdHMgcG9zc2libGUgZnJvbSBOYXRpb25hbCA/Pz8gKi8KKwkJCWJyZWFrOworI2VuZGlmIC8qIE9USEVSX1BIWSAqLworCQl9CisJCQorCQkvKiBlbmFibGUgUngvVHggKi8KKwkJWE1fT1VUMTYoSW9DLCBQb3J0LCBYTV9NTVVfQ01ELCBSZWcgfCBYTV9NTVVfRU5BX1JYIHwgWE1fTU1VX0VOQV9UWCk7CisJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCWlmIChwQUMtPkdJbmkuR0lZdWtvbikgeworCQkvKgorCQkgKiBJbml0aWFsaXplIHRoZSBJbnRlcnJ1cHQgTWFzayBSZWdpc3Rlci4gRGVmYXVsdCBJUlFzIGFyZS4uLgorCQkgKgktIFJ4IENvdW50ZXIgRXZlbnQgT3ZlcmZsb3cKKwkJICoJLSBUeCBDb3VudGVyIEV2ZW50IE92ZXJmbG93CisJCSAqCS0gVHJhbnNtaXQgRklGTyBVbmRlcnJ1bgorCQkgKi8KKwkJSW50TWFzayA9IEdNQUNfREVGX01TSzsKKworI2lmZGVmIERFQlVHCisJCS8qIGFkZCBJUlEgZm9yIFJlY2VpdmUgRklGTyBPdmVycnVuICovCisJCUludE1hc2sgfD0gR01fSVNfUlhfRkZfT1I7CisjZW5kaWYgLyogREVCVUcgKi8KKwkJCisJCVNLX09VVDgoSW9DLCBHTUFDX0lSUV9NU0ssIChTS19VOClJbnRNYXNrKTsKKwkJCisJCS8qIGdldCBHZW5lcmFsIFB1cnBvc2UgQ29udHJvbCAqLworCQlHTV9JTjE2KElvQywgUG9ydCwgR01fR1BfQ1RSTCwgJlJlZyk7CisJCQorCQlpZiAocFBydC0+UExpbmtNb2RlU3RhdHVzID09IFNLX0xNT0RFX1NUQVRfRlVMTCB8fAorCQkJcFBydC0+UExpbmtNb2RlU3RhdHVzID09IFNLX0xNT0RFX1NUQVRfQVVUT0ZVTEwpIHsKKwkJCS8qIHNldCB0byBGdWxsIER1cGxleCAqLworCQkJUmVnIHw9IEdNX0dQQ1JfRFVQX0ZVTEw7CisJCX0KKwkJCisJCS8qIGVuYWJsZSBSeC9UeCAqLworICAgICAgICBHTV9PVVQxNihJb0MsIFBvcnQsIEdNX0dQX0NUUkwsIChTS19VMTYpKFJlZyB8IEdNX0dQQ1JfUlhfRU5BIHwKKwkJCUdNX0dQQ1JfVFhfRU5BKSk7CisKKyNpZm5kZWYgVkNQVQorCQkvKiBFbmFibGUgYWxsIFBIWSBpbnRlcnJ1cHRzICovCisgICAgICAgIFNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfSU5UX01BU0ssCisJCQkoU0tfVTE2KVBIWV9NX0RFRl9NU0spOworI2VuZGlmIC8qIFZDUFUgKi8KKwl9CisjZW5kaWYgLyogWVVLT04gKi8KKwkJCQkJCisJcmV0dXJuKDApOworCit9CS8qIFNrTWFjUnhUeEVuYWJsZSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa01hY1J4VHhEaXNhYmxlKCkgLSBEaXNhYmxlIFJlY2VpdmVyIGFuZCBUcmFuc21pdHRlcgorICoKKyAqIERlc2NyaXB0aW9uOglkaXNhYmxlcyBSeC9UeCBkZXAuIG9uIGJvYXJkIHR5cGUKKyAqCisgKiBSZXR1cm5zOiBOL0EKKyAqLwordm9pZCBTa01hY1J4VHhEaXNhYmxlKAorU0tfQUMJKnBBQywJCS8qIEFkYXB0ZXIgQ29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19VMTYJV29yZDsKKworI2lmZGVmIEdFTkVTSVMKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCQkKKwkJWE1fSU4xNihJb0MsIFBvcnQsIFhNX01NVV9DTUQsICZXb3JkKTsKKwkJCisJCVhNX09VVDE2KElvQywgUG9ydCwgWE1fTU1VX0NNRCwgV29yZCAmIH4oWE1fTU1VX0VOQV9SWCB8IFhNX01NVV9FTkFfVFgpKTsKKwkKKwkJLyogZHVtbXkgcmVhZCB0byBlbnN1cmUgd3JpdGluZyAqLworCQlYTV9JTjE2KElvQywgUG9ydCwgWE1fTU1VX0NNRCwgJldvcmQpOworCX0KKyNlbmRpZiAvKiBHRU5FU0lTICovCisJCisjaWZkZWYgWVVLT04KKwlpZiAocEFDLT5HSW5pLkdJWXVrb24pIHsKKwkJCisJCUdNX0lOMTYoSW9DLCBQb3J0LCBHTV9HUF9DVFJMLCAmV29yZCk7CisKKyAgICAgICAgR01fT1VUMTYoSW9DLCBQb3J0LCBHTV9HUF9DVFJMLCAoU0tfVTE2KShXb3JkICYgfihHTV9HUENSX1JYX0VOQSB8CisJCQlHTV9HUENSX1RYX0VOQSkpKTsKKworCQkvKiBkdW1teSByZWFkIHRvIGVuc3VyZSB3cml0aW5nICovCisJCUdNX0lOMTYoSW9DLCBQb3J0LCBHTV9HUF9DVFJMLCAmV29yZCk7CisJfQorI2VuZGlmIC8qIFlVS09OICovCisKK30JLyogU2tNYWNSeFR4RGlzYWJsZSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa01hY0lycURpc2FibGUoKSAtIERpc2FibGUgSVJRIGZyb20gTUFDCisgKgorICogRGVzY3JpcHRpb246CXNldHMgdGhlIElSUS1tYXNrIHRvIGRpc2FibGUgSVJRIGRlcC4gb24gYm9hcmQgdHlwZQorICoKKyAqIFJldHVybnM6IE4vQQorICovCit2b2lkIFNrTWFjSXJxRGlzYWJsZSgKK1NLX0FDCSpwQUMsCQkvKiBBZGFwdGVyIENvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQpCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJU0tfR0VQT1JUCSpwUHJ0OworI2lmZGVmIEdFTkVTSVMKKwlTS19VMTYJCVdvcmQ7CisjZW5kaWYKKworCXBQcnQgPSAmcEFDLT5HSW5pLkdQW1BvcnRdOworCisjaWZkZWYgR0VORVNJUworCWlmIChwQUMtPkdJbmkuR0lHZW5lc2lzKSB7CisJCQorCQkvKiBkaXNhYmxlIGFsbCBYTUFDIElSUXMgKi8KKwkJWE1fT1VUMTYoSW9DLCBQb3J0LCBYTV9JTVNLLCAweGZmZmYpOwkKKwkJCisJCS8qIERpc2FibGUgYWxsIFBIWSBpbnRlcnJ1cHRzICovCisJCXN3aXRjaCAocFBydC0+UGh5VHlwZSkgeworCQkJY2FzZSBTS19QSFlfQkNPTToKKwkJCQkvKiBNYWtlIHN1cmUgdGhhdCBQSFkgaXMgaW5pdGlhbGl6ZWQgKi8KKwkJCQlpZiAocFBydC0+UFN0YXRlICE9IFNLX1BSVF9SRVNFVCkgeworCQkJCQkvKiBOT1QgYWxsb3dlZCBpZiBCQ09NIGlzIGluIFJFU0VUIHN0YXRlICovCisJCQkJCS8qIFdvcmthcm91bmQgQkNPTSBFcnJhdGEgKCMxMDUyMykgYWxsIEJDb20gKi8KKwkJCQkJLyogRGlzYWJsZSBQb3dlciBNYW5hZ2VtZW50IGlmIGxpbmsgaXMgZG93biAqLworCQkJCQlTa1htUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX0JDT01fQVVYX0NUUkwsICZXb3JkKTsKKwkJCQkJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9BVVhfQ1RSTCwKKwkJCQkJCShTS19VMTYpKFdvcmQgfCBQSFlfQl9BQ19ESVNfUE0pKTsKKwkJCQkJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfQkNPTV9JTlRfTUFTSywgMHhmZmZmKTsKKwkJCQl9CisJCQkJYnJlYWs7CisjaWZkZWYgT1RIRVJfUEhZCisJCQljYXNlIFNLX1BIWV9MT05FOgorCQkJCVNrWG1QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX0xPTkVfSU5UX0VOQUIsIDApOworCQkJCWJyZWFrOworCQkJY2FzZSBTS19QSFlfTkFUOgorCQkJCS8qIHRvZG86IE5hdGlvbmFsCisJCQkJU2tYbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTkFUX0lOVF9NQVNLLCAweGZmZmYpOyAqLworCQkJCWJyZWFrOworI2VuZGlmIC8qIE9USEVSX1BIWSAqLworCQl9CisJfQorI2VuZGlmIC8qIEdFTkVTSVMgKi8KKwkKKyNpZmRlZiBZVUtPTgorCWlmIChwQUMtPkdJbmkuR0lZdWtvbikgeworCQkvKiBkaXNhYmxlIGFsbCBHTUFDIElSUXMgKi8KKwkJU0tfT1VUOChJb0MsIEdNQUNfSVJRX01TSywgMCk7CisJCQorI2lmbmRlZiBWQ1BVCisJCS8qIERpc2FibGUgYWxsIFBIWSBpbnRlcnJ1cHRzICovCisJCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfSU5UX01BU0ssIDApOworI2VuZGlmIC8qIFZDUFUgKi8KKwl9CisjZW5kaWYgLyogWVVLT04gKi8KKworfQkvKiBTa01hY0lycURpc2FibGUgKi8KKworCisjaWZkZWYgU0tfRElBRworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrWG1TZW5kQ29udCgpIC0gRW5hYmxlIC8gRGlzYWJsZSBTZW5kIENvbnRpbnVvdXMgTW9kZQorICoKKyAqIERlc2NyaXB0aW9uOgllbmFibGUgLyBkaXNhYmxlIFNlbmQgQ29udGludW91cyBNb2RlIG9uIFhNQUMKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrWG1TZW5kQ29udCgKK1NLX0FDCSpwQUMsCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0LAkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitTS19CT09MCUVuYWJsZSkJLyogRW5hYmxlIC8gRGlzYWJsZSAqLworeworCVNLX1UzMglNZFJlZzsKKworCVhNX0lOMzIoSW9DLCBQb3J0LCBYTV9NT0RFLCAmTWRSZWcpOworCisJaWYgKEVuYWJsZSkgeworCQlNZFJlZyB8PSBYTV9NRF9UWF9DT05UOworCX0KKwllbHNlIHsKKwkJTWRSZWcgJj0gflhNX01EX1RYX0NPTlQ7CisJfQorCS8qIHNldHVwIE1vZGUgUmVnaXN0ZXIgKi8KKwlYTV9PVVQzMihJb0MsIFBvcnQsIFhNX01PREUsIE1kUmVnKTsKKworfQkvKiBTa1htU2VuZENvbnQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tNYWNUaW1lU3RhbXAoKSAtIEVuYWJsZSAvIERpc2FibGUgVGltZSBTdGFtcAorICoKKyAqIERlc2NyaXB0aW9uOgllbmFibGUgLyBkaXNhYmxlIFRpbWUgU3RhbXAgZ2VuZXJhdGlvbiBmb3IgUnggcGFja2V0cworICoKKyAqIFJldHVybnM6CisgKglub3RoaW5nCisgKi8KK3ZvaWQgU2tNYWNUaW1lU3RhbXAoCitTS19BQwkqcEFDLAkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCwJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworU0tfQk9PTAlFbmFibGUpCS8qIEVuYWJsZSAvIERpc2FibGUgKi8KK3sKKwlTS19VMzIJTWRSZWc7CisJU0tfVTgJVGltZUN0cmw7CisKKwlpZiAocEFDLT5HSW5pLkdJR2VuZXNpcykgeworCisJCVhNX0lOMzIoSW9DLCBQb3J0LCBYTV9NT0RFLCAmTWRSZWcpOworCisJCWlmIChFbmFibGUpIHsKKwkJCU1kUmVnIHw9IFhNX01EX0FUUzsKKwkJfQorCQllbHNlIHsKKwkJCU1kUmVnICY9IH5YTV9NRF9BVFM7CisJCX0KKwkJLyogc2V0dXAgTW9kZSBSZWdpc3RlciAqLworCQlYTV9PVVQzMihJb0MsIFBvcnQsIFhNX01PREUsIE1kUmVnKTsKKwl9CisJZWxzZSB7CisJCWlmIChFbmFibGUpIHsKKwkJCVRpbWVDdHJsID0gR01UX1NUX1NUQVJUIHwgR01UX1NUX0NMUl9JUlE7CisJCX0KKwkJZWxzZSB7CisJCQlUaW1lQ3RybCA9IEdNVF9TVF9TVE9QIHwgR01UX1NUX0NMUl9JUlE7CisJCX0KKwkJLyogU3RhcnQvU3RvcCBUaW1lIFN0YW1wIFRpbWVyICovCisJCVNLX09VVDgoSW9DLCBHTUFDX1RJX1NUX0NUUkwsIFRpbWVDdHJsKTsKKwl9CisKK30JLyogU2tNYWNUaW1lU3RhbXAqLworCisjZWxzZSAvKiAhU0tfRElBRyAqLworCisjaWZkZWYgR0VORVNJUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrWG1BdXRvTmVnTGlwYVhtYWMoKSAtIERlY2lkZXMgd2hldGhlciBMaW5rIFBhcnRuZXIgY291bGQgZG8gYXV0by1uZWcKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGFuYWx5c2VzIHRoZSBJbnRlcnJ1cHQgc3RhdHVzIHdvcmQuIElmIGFueSBvZiB0aGUKKyAqCUF1dG8tbmVnb3RpYXRpbmcgaW50ZXJydXB0IGJpdHMgYXJlIHNldCwgdGhlIFBMaXBhQXV0b05lZyB2YXJpYWJsZQorICoJaXMgc2V0IHRydWUuCisgKi8KK3ZvaWQgU2tYbUF1dG9OZWdMaXBhWG1hYygKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitTS19VMTYJSVN0YXR1cykJLyogSW50ZXJydXB0IFN0YXR1cyB3b3JkIHRvIGFuYWx5c2UgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCWlmIChwUHJ0LT5QTGlwYUF1dG9OZWcgIT0gU0tfTElQQV9BVVRPICYmCisJCShJU3RhdHVzICYgKFhNX0lTX0xJUEFfUkMgfCBYTV9JU19SWF9QQUdFIHwgWE1fSVNfQU5EKSkgIT0gMCkgeworCisJCVNLX0RCR19NU0cocEFDLCBTS19EQkdNT0RfSFdNLCBTS19EQkdDQVRfQ1RSTCwKKwkJCSgiQXV0b05lZ0xpcGE6IEF1dG9OZWcgZGV0ZWN0ZWQgb24gUG9ydCAlZCwgSVN0YXR1cz0weCUwNFhcbiIsCisJCQlQb3J0LCBJU3RhdHVzKSk7CisJCXBQcnQtPlBMaXBhQXV0b05lZyA9IFNLX0xJUEFfQVVUTzsKKwl9Cit9CS8qIFNrWG1BdXRvTmVnTGlwYVhtYWMgKi8KKyNlbmRpZiAvKiBHRU5FU0lTICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrTWFjQXV0b05lZ0xpcGFQaHkoKSAtIERlY2lkZXMgd2hldGhlciBMaW5rIFBhcnRuZXIgY291bGQgZG8gYXV0by1uZWcKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGFuYWx5c2VzIHRoZSBQSFkgc3RhdHVzIHdvcmQuCisgKiAgSWYgYW55IG9mIHRoZSBBdXRvLW5lZ290aWF0aW5nIGJpdHMgYXJlIHNldCwgdGhlIFBMaXBhQXV0b05lZyB2YXJpYWJsZQorICoJaXMgc2V0IHRydWUuCisgKi8KK3ZvaWQgU2tNYWNBdXRvTmVnTGlwYVBoeSgKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitTS19VMTYJUGh5U3RhdCkJLyogUEhZIFN0YXR1cyB3b3JkIHRvIGFuYWx5c2UgKi8KK3sKKwlTS19HRVBPUlQJKnBQcnQ7CisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKworCWlmIChwUHJ0LT5QTGlwYUF1dG9OZWcgIT0gU0tfTElQQV9BVVRPICYmCisJCShQaHlTdGF0ICYgUEhZX1NUX0FOX09WRVIpICE9IDApIHsKKworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0NUUkwsCisJCQkoIkF1dG9OZWdMaXBhOiBBdXRvTmVnIGRldGVjdGVkIG9uIFBvcnQgJWQsIFBoeVN0YXQ9MHglMDRYXG4iLAorCQkJUG9ydCwgUGh5U3RhdCkpOworCQlwUHJ0LT5QTGlwYUF1dG9OZWcgPSBTS19MSVBBX0FVVE87CisJfQorfQkvKiBTa01hY0F1dG9OZWdMaXBhUGh5ICovCisKKworI2lmZGVmIEdFTkVTSVMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa1htSXJxKCkgLSBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lCisgKgorICogRGVzY3JpcHRpb246CXNlcnZpY2VzIGFuIEludGVycnVwdCBSZXF1ZXN0IG9mIHRoZSBYTUFDCisgKgorICogTm90ZToKKyAqCVdpdGggYW4gZXh0ZXJuYWwgUEhZLCBzb21lIGludGVycnVwdCBiaXRzIGFyZSBub3QgbWVhbmluZ2Z1bGwgYW55IG1vcmU6CisgKgktIExpbmtBc3luY0V2ZW50IChiaXQgIzE0KSAgICAgICAgICAgICAgWE1fSVNfTE5LX0FFCisgKgktIExpbmtQYXJ0bmVyUmVxQ29uZmlnIChiaXQgIzEwKQlYTV9JU19MSVBBX1JDCisgKgktIFBhZ2UgUmVjZWl2ZWQgKGJpdCAjOSkJCVhNX0lTX1JYX1BBR0UKKyAqCS0gTmV4dFBhZ2VMb2FkZWRGb3JYbXQgKGJpdCAjOCkJCVhNX0lTX1RYX1BBR0UKKyAqCS0gQXV0b05lZ0RvbmUgKGJpdCAjNykJCQlYTV9JU19BTkQKKyAqCUFsc28gcHJvYmFibHkgbm90IHZhbGlkIGFueSBtb3JlIGlzIHRoZSBHUDAgaW5wdXQgYml0OgorICoJLSBHUFJlZ2lzdGVyQml0MHNldAkJCVhNX0lTX0lOUF9BU1MKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrWG1JcnEoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworCVNLX0dFUE9SVAkqcFBydDsKKwlTS19FVlBBUkEJUGFyYTsKKwlTS19VMTYJCUlTdGF0dXM7CS8qIEludGVycnVwdCBzdGF0dXMgcmVhZCBmcm9tIHRoZSBYTUFDICovCisJU0tfVTE2CQlJU3RhdHVzMjsKKyNpZmRlZiBTS19TTElNCisgICAgU0tfVTY0ICAgICAgT3ZlcmZsb3dTdGF0dXM7CisjZW5kaWYJCisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKwkKKwlYTV9JTjE2KElvQywgUG9ydCwgWE1fSVNSQywgJklTdGF0dXMpOworCQorCS8qIExpbmtQYXJ0bmVyIEF1dG8tbmVnYWJsZT8gKi8KKwlpZiAocFBydC0+UGh5VHlwZSA9PSBTS19QSFlfWE1BQykgeworCQlTa1htQXV0b05lZ0xpcGFYbWFjKHBBQywgSW9DLCBQb3J0LCBJU3RhdHVzKTsKKwl9CisJZWxzZSB7CisJCS8qIG1hc2sgYml0cyB0aGF0IGFyZSBub3QgdXNlZCB3aXRoIGV4dC4gUEhZICovCisJCUlTdGF0dXMgJj0gfihYTV9JU19MTktfQUUgfCBYTV9JU19MSVBBX1JDIHwKKwkJCVhNX0lTX1JYX1BBR0UgfCBYTV9JU19UWF9QQUdFIHwKKwkJCVhNX0lTX0FORCB8IFhNX0lTX0lOUF9BU1MpOworCX0KKwkKKwlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lSUSwKKwkJKCJYbWFjSXJxIFBvcnQgJWQgSXNyIDB4JTA0WFxuIiwgUG9ydCwgSVN0YXR1cykpOworCisJaWYgKCFwUHJ0LT5QSFdMaW5rVXApIHsKKwkJLyogU3B1cmlvdXMgWE1BQyBpbnRlcnJ1cHQgKi8KKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCQkoIlNrWG1JcnE6IHNwdXJpb3VzIGludGVycnVwdCBvbiBQb3J0ICVkXG4iLCBQb3J0KSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKElTdGF0dXMgJiBYTV9JU19JTlBfQVNTKSAhPSAwKSB7CisJCS8qIFJlcmVhZCBJU1IgUmVnaXN0ZXIgaWYgbGluayBpcyBub3QgaW4gc3luYyAqLworCQlYTV9JTjE2KElvQywgUG9ydCwgWE1fSVNSQywgJklTdGF0dXMyKTsKKworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lSUSwKKwkJCSgiU2tYbUlycTogTGluayBhc3luYy4gRG91YmxlIGNoZWNrIFBvcnQgJWQgMHglMDRYIDB4JTA0WFxuIiwKKwkJCSBQb3J0LCBJU3RhdHVzLCBJU3RhdHVzMikpOworCQlJU3RhdHVzICY9IH5YTV9JU19JTlBfQVNTOworCQlJU3RhdHVzIHw9IElTdGF0dXMyOworCX0KKworCWlmICgoSVN0YXR1cyAmIFhNX0lTX0xOS19BRSkgIT0gMCkgeworCQkvKiBub3QgdXNlZCwgR1AwIGlzIHVzZWQgaW5zdGVhZCAqLworCX0KKworCWlmICgoSVN0YXR1cyAmIFhNX0lTX1RYX0FCT1JUKSAhPSAwKSB7CisJCS8qIG5vdCB1c2VkICovCisJfQorCisJaWYgKChJU3RhdHVzICYgWE1fSVNfRlJDX0lOVCkgIT0gMCkgeworCQkvKiBub3QgdXNlZCwgdXNlIEFTSUMgSVJRIGluc3RlYWQgaWYgbmVlZGVkICovCisJfQorCisJaWYgKChJU3RhdHVzICYgKFhNX0lTX0lOUF9BU1MgfCBYTV9JU19MSVBBX1JDIHwgWE1fSVNfUlhfUEFHRSkpICE9IDApIHsKKwkJU2tIV0xpbmtEb3duKHBBQywgSW9DLCBQb3J0KTsKKworCQkvKiBTaWduYWwgdG8gUkxNVCAqLworCQlQYXJhLlBhcmEzMlswXSA9IChTS19VMzIpUG9ydDsKKwkJU2tFdmVudFF1ZXVlKHBBQywgU0tHRV9STE1ULCBTS19STE1UX0xJTktfRE9XTiwgUGFyYSk7CisKKwkJLyogU3RhcnQgd29ya2Fyb3VuZCBFcnJhdGEgIzIgdGltZXIgKi8KKwkJU2tUaW1lclN0YXJ0KHBBQywgSW9DLCAmcFBydC0+UFdhVGltZXIsIFNLX1dBX0lOQV9USU1FLAorCQkJU0tHRV9IV0FDLCBTS19IV0VWX1dBVElNLCBQYXJhKTsKKwl9CisKKwlpZiAoKElTdGF0dXMgJiBYTV9JU19SWF9QQUdFKSAhPSAwKSB7CisJCS8qIG5vdCB1c2VkICovCisJfQorCisJaWYgKChJU3RhdHVzICYgWE1fSVNfVFhfUEFHRSkgIT0gMCkgeworCQkvKiBub3QgdXNlZCAqLworCX0KKworCWlmICgoSVN0YXR1cyAmIFhNX0lTX0FORCkgIT0gMCkgeworCQlTS19EQkdfTVNHKHBBQywgU0tfREJHTU9EX0hXTSwgU0tfREJHQ0FUX0lSUSwKKwkJCSgiU2tYbUlycTogQU5EIG9uIGxpbmsgdGhhdCBpcyB1cCBQb3J0ICVkXG4iLCBQb3J0KSk7CisJfQorCisJaWYgKChJU3RhdHVzICYgWE1fSVNfVFNDX09WKSAhPSAwKSB7CisJCS8qIG5vdCB1c2VkICovCisJfQorCisJLyogQ29tYmluZWQgVHggJiBSeCBDb3VudGVyIE92ZXJmbG93IFNJUlEgRXZlbnQgKi8KKwlpZiAoKElTdGF0dXMgJiAoWE1fSVNfUlhDX09WIHwgWE1fSVNfVFhDX09WKSkgIT0gMCkgeworI2lmZGVmIFNLX1NMSU0KKwkJU2tYbU92ZXJmbG93U3RhdHVzKHBBQywgSW9DLCBQb3J0LCBJU3RhdHVzLCAmT3ZlcmZsb3dTdGF0dXMpOworI2Vsc2UKKwkJUGFyYS5QYXJhMzJbMF0gPSAoU0tfVTMyKVBvcnQ7CisJCVBhcmEuUGFyYTMyWzFdID0gKFNLX1UzMilJU3RhdHVzOworCQlTa1BubWlFdmVudChwQUMsIElvQywgU0tfUE5NSV9FVlRfU0lSUV9PVkVSRkxPVywgUGFyYSk7CisjZW5kaWYgLyogU0tfU0xJTSAqLworCX0KKworCWlmICgoSVN0YXR1cyAmIFhNX0lTX1JYRl9PVikgIT0gMCkgeworCQkvKiBub3JtYWwgc2l0dWF0aW9uIC0+IG5vIGVmZmVjdCAqLworI2lmZGVmIERFQlVHCisJCXBQcnQtPlBSeE92ZXJDbnQrKzsKKyNlbmRpZiAvKiBERUJVRyAqLworCX0KKworCWlmICgoSVN0YXR1cyAmIFhNX0lTX1RYRl9VUikgIT0gMCkgeworCQkvKiBtYXkgTk9UIGhhcHBlbiAtPiBlcnJvciBsb2cgKi8KKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX0hXLCBTS0VSUl9TSVJRX0UwMjAsIFNLRVJSX1NJUlFfRTAyME1TRyk7CisJfQorCisJaWYgKChJU3RhdHVzICYgWE1fSVNfVFhfQ09NUCkgIT0gMCkgeworCQkvKiBub3Qgc2VydmVkIGhlcmUgKi8KKwl9CisKKwlpZiAoKElTdGF0dXMgJiBYTV9JU19SWF9DT01QKSAhPSAwKSB7CisJCS8qIG5vdCBzZXJ2ZWQgaGVyZSAqLworCX0KK30JLyogU2tYbUlycSAqLworI2VuZGlmIC8qIEdFTkVTSVMgKi8KKworCisjaWZkZWYgWVVLT04KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dtSXJxKCkgLSBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lCisgKgorICogRGVzY3JpcHRpb246CXNlcnZpY2VzIGFuIEludGVycnVwdCBSZXF1ZXN0IG9mIHRoZSBHTUFDCisgKgorICogTm90ZToKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrR21JcnEoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLworaW50CQlQb3J0KQkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworCVNLX0dFUE9SVAkqcFBydDsKKwlTS19VOAkJSVN0YXR1czsJLyogSW50ZXJydXB0IHN0YXR1cyAqLworI2lmZGVmIFNLX1NMSU0KKyAgICBTS19VNjQgICAgICBPdmVyZmxvd1N0YXR1czsKKyNlbHNlCisJU0tfRVZQQVJBCVBhcmE7CisjZW5kaWYJCisKKwlwUHJ0ID0gJnBBQy0+R0luaS5HUFtQb3J0XTsKKwkKKwlTS19JTjgoSW9DLCBHTUFDX0lSUV9TUkMsICZJU3RhdHVzKTsKKwkKKyNpZmRlZiBYWFgKKwkvKiBMaW5rUGFydG5lciBBdXRvLW5lZ2FibGU/ICovCisJU2tNYWNBdXRvTmVnTGlwYVBoeShwQUMsIElvQywgUG9ydCwgSVN0YXR1cyk7CisjZW5kaWYgLyogWFhYICovCisJCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9JUlEsCisJCSgiR21hY0lycSBQb3J0ICVkIElzciAweCUwNFhcbiIsIFBvcnQsIElTdGF0dXMpKTsKKworCS8qIENvbWJpbmVkIFR4ICYgUnggQ291bnRlciBPdmVyZmxvdyBTSVJRIEV2ZW50ICovCisJaWYgKElTdGF0dXMgJiAoR01fSVNfUlhfQ09fT1YgfCBHTV9JU19UWF9DT19PVikpIHsKKwkJLyogdGhlc2UgSVJRcyB3aWxsIGJlIGNsZWFyZWQgYnkgcmVhZGluZyBHTUFDcyByZWdpc3RlciAqLworI2lmZGVmIFNLX1NMSU0KKyAgICAgICAgU2tHbU92ZXJmbG93U3RhdHVzKHBBQywgSW9DLCBQb3J0LCBJU3RhdHVzLCAmT3ZlcmZsb3dTdGF0dXMpOworI2Vsc2UKKwkJUGFyYS5QYXJhMzJbMF0gPSAoU0tfVTMyKVBvcnQ7CisJCVBhcmEuUGFyYTMyWzFdID0gKFNLX1UzMilJU3RhdHVzOworCQlTa1BubWlFdmVudChwQUMsIElvQywgU0tfUE5NSV9FVlRfU0lSUV9PVkVSRkxPVywgUGFyYSk7CisjZW5kaWYJCQorCX0KKworCWlmIChJU3RhdHVzICYgR01fSVNfUlhfRkZfT1IpIHsKKwkJLyogY2xlYXIgR01BQyBSeCBGSUZPIE92ZXJydW4gSVJRICovCisJCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIFJYX0dNRl9DVFJMX1QpLCAoU0tfVTgpR01GX0NMSV9SWF9GTyk7CisjaWZkZWYgREVCVUcKKwkJcFBydC0+UFJ4T3ZlckNudCsrOworI2VuZGlmIC8qIERFQlVHICovCisJfQorCisJaWYgKElTdGF0dXMgJiBHTV9JU19UWF9GRl9VUikgeworCQkvKiBjbGVhciBHTUFDIFR4IEZJRk8gVW5kZXJydW4gSVJRICovCisJCVNLX09VVDgoSW9DLCBNUl9BRERSKFBvcnQsIFRYX0dNRl9DVFJMX1QpLCAoU0tfVTgpR01GX0NMSV9UWF9GVSk7CisJCS8qIG1heSBOT1QgaGFwcGVuIC0+IGVycm9yIGxvZyAqLworCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX1NJUlFfRTAyMCwgU0tFUlJfU0lSUV9FMDIwTVNHKTsKKwl9CisKKwlpZiAoSVN0YXR1cyAmIEdNX0lTX1RYX0NPTVBMKSB7CisJCS8qIG5vdCBzZXJ2ZWQgaGVyZSAqLworCX0KKworCWlmIChJU3RhdHVzICYgR01fSVNfUlhfQ09NUEwpIHsKKwkJLyogbm90IHNlcnZlZCBoZXJlICovCisJfQorfQkvKiBTa0dtSXJxICovCisjZW5kaWYgLyogWVVLT04gKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tNYWNJcnEoKSAtIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUgZm9yIE1BQworICoKKyAqIERlc2NyaXB0aW9uOgljYWxscyB0aGUgSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZSBkZXAuIG9uIGJvYXJkIHR5cGUKKyAqCisgKiBSZXR1cm5zOgorICoJbm90aGluZworICovCit2b2lkIFNrTWFjSXJxKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK2ludAkJUG9ydCkJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKyNpZmRlZiBHRU5FU0lTCisJaWYgKHBBQy0+R0luaS5HSUdlbmVzaXMpIHsKKwkJLyogSVJRIGZyb20gWE1BQyAqLworCQlTa1htSXJxKHBBQywgSW9DLCBQb3J0KTsKKwl9CisjZW5kaWYgLyogR0VORVNJUyAqLworCQorI2lmZGVmIFlVS09OCisJaWYgKHBBQy0+R0luaS5HSVl1a29uKSB7CisJCS8qIElSUSBmcm9tIEdNQUMgKi8KKwkJU2tHbUlycShwQUMsIElvQywgUG9ydCk7CisJfQorI2VuZGlmIC8qIFlVS09OICovCisKK30JLyogU2tNYWNJcnEgKi8KKworI2VuZGlmIC8qICFTS19ESUFHICovCisKKyNpZmRlZiBHRU5FU0lTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tYbVVwZGF0ZVN0YXRzKCkgLSBGb3JjZSB0aGUgWE1BQyB0byBvdXRwdXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGUgWE1BQyBob2xkcyBpdHMgc3RhdGlzdGljIGludGVybmFsbHkuIFRvIG9idGFpbiB0aGUgY3VycmVudAorICoJdmFsdWVzIGEgY29tbWFuZCBtdXN0IGJlIHNlbnQgc28gdGhhdCB0aGUgc3RhdGlzdGljIGRhdGEgd2lsbAorICoJYmUgd3JpdHRlbiB0byBhIHByZWRlZmluZWQgbWVtb3J5IGFyZWEgb24gdGhlIGFkYXB0ZXIuCisgKgorICogUmV0dXJuczoKKyAqCTA6ICBzdWNjZXNzCisgKgkxOiAgc29tZXRoaW5nIHdlbnQgd3JvbmcKKyAqLworaW50IFNrWG1VcGRhdGVTdGF0cygKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCit1bnNpZ25lZCBpbnQgUG9ydCkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworCVNLX0dFUE9SVAkqcFBydDsKKwlTS19VMTYJCVN0YXRSZWc7CisJaW50CQkJV2FpdEluZGV4OworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisJV2FpdEluZGV4ID0gMDsKKworCS8qIFNlbmQgYW4gdXBkYXRlIGNvbW1hbmQgdG8gWE1BQyBzcGVjaWZpZWQgKi8KKwlYTV9PVVQxNihJb0MsIFBvcnQsIFhNX1NUQVRfQ01ELCBYTV9TQ19TTlBfVFhDIHwgWE1fU0NfU05QX1JYQyk7CisKKwkvKgorCSAqIEl0IGlzIGFuIGF1dG8tY2xlYXJpbmcgcmVnaXN0ZXIuIElmIHRoZSBjb21tYW5kIGJpdHMKKwkgKiB3ZW50IHRvIHplcm8gYWdhaW4sIHRoZSBzdGF0aXN0aWNzIGFyZSB0cmFuc2ZlcnJlZC4KKwkgKiBOb3JtYWxseSB0aGUgY29tbWFuZCBzaG91bGQgYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkuCisJICogQnV0IGp1c3QgdG8gYmUgc3VyZSB3ZSBleGVjdXRlIGEgbG9vcC4KKwkgKi8KKwlkbyB7CisKKwkJWE1fSU4xNihJb0MsIFBvcnQsIFhNX1NUQVRfQ01ELCAmU3RhdFJlZyk7CisJCQorCQlpZiAoKytXYWl0SW5kZXggPiAxMCkgeworCisJCQlTS19FUlJfTE9HKHBBQywgU0tfRVJSQ0xfSFcsIFNLRVJSX0hXSV9FMDIxLCBTS0VSUl9IV0lfRTAyMU1TRyk7CisKKwkJCXJldHVybigxKTsKKwkJfQorCX0gd2hpbGUgKChTdGF0UmVnICYgKFhNX1NDX1NOUF9UWEMgfCBYTV9TQ19TTlBfUlhDKSkgIT0gMCk7CisJCisJcmV0dXJuKDApOworfQkvKiBTa1htVXBkYXRlU3RhdHMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tYbU1hY1N0YXRpc3RpYygpIC0gR2V0IFhNQUMgY291bnRlciB2YWx1ZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJR2V0cyB0aGUgMzJiaXQgY291bnRlciB2YWx1ZS4gRXhjZXB0IGZvciB0aGUgb2N0ZXQgY291bnRlcnMKKyAqCXRoZSBsb3dlciAzMmJpdCBhcmUgY291bnRlZCBpbiBoYXJkd2FyZSBhbmQgdGhlIHVwcGVyIDMyYml0CisgKgltdXN0IGJlIGNvdW50ZWQgaW4gc29mdHdhcmUgYnkgbW9uaXRvcmluZyBjb3VudGVyIG92ZXJmbG93IGludGVycnVwdHMuCisgKgorICogUmV0dXJuczoKKyAqCTA6ICBzdWNjZXNzCisgKgkxOiAgc29tZXRoaW5nIHdlbnQgd3JvbmcKKyAqLworaW50IFNrWG1NYWNTdGF0aXN0aWMoCitTS19BQwkqcEFDLAkJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCQkvKiBJTyBjb250ZXh0ICovCit1bnNpZ25lZCBpbnQgUG9ydCwJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK1NLX1UxNglTdGF0QWRkciwJCS8qIE1JQiBjb3VudGVyIGJhc2UgYWRkcmVzcyAqLworU0tfVTMyCVNLX0ZBUiAqcFZhbCkJLyogcHRyIHRvIHJldHVybiBzdGF0aXN0aWMgdmFsdWUgKi8KK3sKKwlpZiAoKFN0YXRBZGRyIDwgWE1fVFhGX09LKSB8fCAoU3RhdEFkZHIgPiBYTV9SWEZfTUFYX1NaKSkgeworCQkKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9IV0lfRTAyMiwgU0tFUlJfSFdJX0UwMjJNU0cpOworCQkKKwkJcmV0dXJuKDEpOworCX0KKwkKKwlYTV9JTjMyKElvQywgUG9ydCwgU3RhdEFkZHIsIHBWYWwpOworCisJcmV0dXJuKDApOworfQkvKiBTa1htTWFjU3RhdGlzdGljICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrWG1SZXNldENvdW50ZXIoKSAtIENsZWFyIE1BQyBzdGF0aXN0aWMgY291bnRlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJRm9yY2UgdGhlIFhNQUMgdG8gY2xlYXIgaXRzIHN0YXRpc3RpYyBjb3VudGVyLgorICoKKyAqIFJldHVybnM6CisgKgkwOiAgc3VjY2VzcworICoJMTogIHNvbWV0aGluZyB3ZW50IHdyb25nCisgKi8KK2ludCBTa1htUmVzZXRDb3VudGVyKAorU0tfQUMJKnBBQywJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCS8qIElPIGNvbnRleHQgKi8KK3Vuc2lnbmVkIGludCBQb3J0KQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCit7CisJWE1fT1VUMTYoSW9DLCBQb3J0LCBYTV9TVEFUX0NNRCwgWE1fU0NfQ0xSX1JYQyB8IFhNX1NDX0NMUl9UWEMpOworCS8qIENsZWFyIHR3byB0aW1lcyBhY2NvcmRpbmcgdG8gRXJyYXRhICMzICovCisJWE1fT1VUMTYoSW9DLCBQb3J0LCBYTV9TVEFUX0NNRCwgWE1fU0NfQ0xSX1JYQyB8IFhNX1NDX0NMUl9UWEMpOworCisJcmV0dXJuKDApOworfQkvKiBTa1htUmVzZXRDb3VudGVyICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrWG1PdmVyZmxvd1N0YXR1cygpIC0gR2V0cyB0aGUgc3RhdHVzIG9mIGNvdW50ZXIgb3ZlcmZsb3cgaW50ZXJydXB0CisgKgorICogRGVzY3JpcHRpb246CisgKglDaGVja3MgdGhlIHNvdXJjZSBjYXVzaW5nIGFuIGNvdW50ZXIgb3ZlcmZsb3cgaW50ZXJydXB0LiBPbiBzdWNjZXNzIHRoZQorICoJcmVzdWx0aW5nIGNvdW50ZXIgb3ZlcmZsb3cgc3RhdHVzIGlzIHdyaXR0ZW4gdG8gPHBTdGF0dXM+LCB3aGVyZWFzIHRoZQorICoJdXBwZXIgZHdvcmQgc3RvcmVzIHRoZSBYTUFDIFJlY2VpdmVDb3VudGVyRXZlbnQgcmVnaXN0ZXIgYW5kIHRoZSBsb3dlcgorICoJZHdvcmQgdGhlIFhNQUMgVHJhbnNtaXRDb3VudGVyRXZlbnQgcmVnaXN0ZXIuCisgKgorICogTm90ZToKKyAqCUZvciBYTUFDIHRoZSBpbnRlcnJ1cHQgc291cmNlIGlzIGEgc2VsZi1jbGVhcmluZyByZWdpc3Rlciwgc28gdGhlIHNvdXJjZQorICoJbXVzdCBiZSBjaGVja2VkIG9ubHkgb25jZS4gU0lSUSBtb2R1bGUgZG9lcyBhbm90aGVyIGNoZWNrIHRvIGJlIHN1cmUKKyAqCXRoYXQgbm8gaW50ZXJydXB0IGdldCBsb3N0IGR1cmluZyBwcm9jZXNzIHRpbWUuCisgKgorICogUmV0dXJuczoKKyAqCTA6ICBzdWNjZXNzCisgKgkxOiAgc29tZXRoaW5nIHdlbnQgd3JvbmcKKyAqLworaW50IFNrWG1PdmVyZmxvd1N0YXR1cygKK1NLX0FDCSpwQUMsCQkJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCQkJLyogSU8gY29udGV4dCAqLwordW5zaWduZWQgaW50IFBvcnQsCQkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworU0tfVTE2CUlTdGF0dXMsCQkJLyogSW50ZXJ1cHQgU3RhdHVzIGZyb20gTUFDICovCitTS19VNjQJU0tfRkFSICpwU3RhdHVzKQkvKiBwdHIgZm9yIHJldHVybiBvdmVyZmxvdyBzdGF0dXMgdmFsdWUgKi8KK3sKKwlTS19VNjQJU3RhdHVzOwkvKiBPdmVyZmxvdyBzdGF0dXMgKi8KKwlTS19VMzIJUmVnVmFsOworCisJU3RhdHVzID0gMDsKKworCWlmICgoSVN0YXR1cyAmIFhNX0lTX1JYQ19PVikgIT0gMCkgeworCisJCVhNX0lOMzIoSW9DLCBQb3J0LCBYTV9SWF9DTlRfRVYsICZSZWdWYWwpOworCQlTdGF0dXMgfD0gKFNLX1U2NClSZWdWYWwgPDwgMzI7CisJfQorCQorCWlmICgoSVN0YXR1cyAmIFhNX0lTX1RYQ19PVikgIT0gMCkgeworCisJCVhNX0lOMzIoSW9DLCBQb3J0LCBYTV9UWF9DTlRfRVYsICZSZWdWYWwpOworCQlTdGF0dXMgfD0gKFNLX1U2NClSZWdWYWw7CisJfQorCisJKnBTdGF0dXMgPSBTdGF0dXM7CisKKwlyZXR1cm4oMCk7Cit9CS8qIFNrWG1PdmVyZmxvd1N0YXR1cyAqLworI2VuZGlmIC8qIEdFTkVTSVMgKi8KKworCisjaWZkZWYgWVVLT04KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dtVXBkYXRlU3RhdHMoKSAtIEZvcmNlIHRoZSBHTUFDIHRvIG91dHB1dCB0aGUgY3VycmVudCBzdGF0aXN0aWMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUVtcHR5IGZ1bmN0aW9uIGZvciBHTUFDLiBTdGF0aXN0aWMgZGF0YSBpcyBhY2Nlc3NpYmxlIGluIGRpcmVjdCB3YXkuCisgKgorICogUmV0dXJuczoKKyAqCTA6ICBzdWNjZXNzCisgKgkxOiAgc29tZXRoaW5nIHdlbnQgd3JvbmcKKyAqLworaW50IFNrR21VcGRhdGVTdGF0cygKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsCQkvKiBJTyBjb250ZXh0ICovCit1bnNpZ25lZCBpbnQgUG9ydCkJLyogUG9ydCBJbmRleCAoTUFDXzEgKyBuKSAqLworeworCXJldHVybigwKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJU2tHbU1hY1N0YXRpc3RpYygpIC0gR2V0IEdNQUMgY291bnRlciB2YWx1ZQorICoKKyAqIERlc2NyaXB0aW9uOgorICoJR2V0cyB0aGUgMzJiaXQgY291bnRlciB2YWx1ZS4gRXhjZXB0IGZvciB0aGUgb2N0ZXQgY291bnRlcnMKKyAqCXRoZSBsb3dlciAzMmJpdCBhcmUgY291bnRlZCBpbiBoYXJkd2FyZSBhbmQgdGhlIHVwcGVyIDMyYml0CisgKgltdXN0IGJlIGNvdW50ZWQgaW4gc29mdHdhcmUgYnkgbW9uaXRvcmluZyBjb3VudGVyIG92ZXJmbG93IGludGVycnVwdHMuCisgKgorICogUmV0dXJuczoKKyAqCTA6ICBzdWNjZXNzCisgKgkxOiAgc29tZXRoaW5nIHdlbnQgd3JvbmcKKyAqLworaW50IFNrR21NYWNTdGF0aXN0aWMoCitTS19BQwkqcEFDLAkJCS8qIGFkYXB0ZXIgY29udGV4dCAqLworU0tfSU9DCUlvQywJCQkvKiBJTyBjb250ZXh0ICovCit1bnNpZ25lZCBpbnQgUG9ydCwJCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK1NLX1UxNglTdGF0QWRkciwJCS8qIE1JQiBjb3VudGVyIGJhc2UgYWRkcmVzcyAqLworU0tfVTMyCVNLX0ZBUiAqcFZhbCkJLyogcHRyIHRvIHJldHVybiBzdGF0aXN0aWMgdmFsdWUgKi8KK3sKKworCWlmICgoU3RhdEFkZHIgPCBHTV9SWEZfVUNfT0spIHx8IChTdGF0QWRkciA+IEdNX1RYRV9GSUZPX1VSKSkgeworCQkKKwkJU0tfRVJSX0xPRyhwQUMsIFNLX0VSUkNMX1NXLCBTS0VSUl9IV0lfRTAyMiwgU0tFUlJfSFdJX0UwMjJNU0cpOworCQkKKwkJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkJKCJTa0dtTWFjU3RhdDogd3JvbmcgTUlCIGNvdW50ZXIgMHglMDRYXG4iLCBTdGF0QWRkcikpOworCQlyZXR1cm4oMSk7CisJfQorCQkKKwlHTV9JTjMyKElvQywgUG9ydCwgU3RhdEFkZHIsIHBWYWwpOworCisJcmV0dXJuKDApOworfQkvKiBTa0dtTWFjU3RhdGlzdGljICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVNrR21SZXNldENvdW50ZXIoKSAtIENsZWFyIE1BQyBzdGF0aXN0aWMgY291bnRlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJRm9yY2UgR01BQyB0byBjbGVhciBpdHMgc3RhdGlzdGljIGNvdW50ZXIuCisgKgorICogUmV0dXJuczoKKyAqCTA6ICBzdWNjZXNzCisgKgkxOiAgc29tZXRoaW5nIHdlbnQgd3JvbmcKKyAqLworaW50IFNrR21SZXNldENvdW50ZXIoCitTS19BQwkqcEFDLAkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJLyogSU8gY29udGV4dCAqLwordW5zaWduZWQgaW50IFBvcnQpCS8qIFBvcnQgSW5kZXggKE1BQ18xICsgbikgKi8KK3sKKwlTS19VMTYJUmVnOwkvKiBQaHkgQWRkcmVzcyBSZWdpc3RlciAqLworCVNLX1UxNglXb3JkOworCWludAkJaTsKKworCUdNX0lOMTYoSW9DLCBQb3J0LCBHTV9QSFlfQUREUiwgJlJlZyk7CisKKwkvKiBzZXQgTUlCIENsZWFyIENvdW50ZXIgTW9kZSAqLworCUdNX09VVDE2KElvQywgUG9ydCwgR01fUEhZX0FERFIsIFJlZyB8IEdNX1BBUl9NSUJfQ0xSKTsKKwkKKwkvKiByZWFkIGFsbCBNSUIgQ291bnRlcnMgd2l0aCBDbGVhciBNb2RlIHNldCAqLworCWZvciAoaSA9IDA7IGkgPCBHTV9NSUJfQ05UX1NJWkU7IGkrKykgeworCQkvKiB0aGUgcmVzZXQgaXMgcGVyZm9ybWVkIG9ubHkgd2hlbiB0aGUgbG93ZXIgMTYgYml0cyBhcmUgcmVhZCAqLworCQlHTV9JTjE2KElvQywgUG9ydCwgR01fTUlCX0NOVF9CQVNFICsgOCppLCAmV29yZCk7CisJfQorCQorCS8qIGNsZWFyIE1JQiBDbGVhciBDb3VudGVyIE1vZGUgKi8KKwlHTV9PVVQxNihJb0MsIFBvcnQsIEdNX1BIWV9BRERSLCBSZWcpOworCQorCXJldHVybigwKTsKK30JLyogU2tHbVJlc2V0Q291bnRlciAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dtT3ZlcmZsb3dTdGF0dXMoKSAtIEdldHMgdGhlIHN0YXR1cyBvZiBjb3VudGVyIG92ZXJmbG93IGludGVycnVwdAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJQ2hlY2tzIHRoZSBzb3VyY2UgY2F1c2luZyBhbiBjb3VudGVyIG92ZXJmbG93IGludGVycnVwdC4gT24gc3VjY2VzcyB0aGUKKyAqCXJlc3VsdGluZyBjb3VudGVyIG92ZXJmbG93IHN0YXR1cyBpcyB3cml0dGVuIHRvIDxwU3RhdHVzPiwgd2hlcmVhcyB0aGUKKyAqCXRoZSBmb2xsb3dpbmcgYml0IGNvZGluZyBpcyB1c2VkOgorICoJNjM6NTYgLSB1bnVzZWQKKyAqCTU1OjQ4IC0gVHhSeCBpbnRlcnJ1cHQgcmVnaXN0ZXIgYml0NzowCisgKgkzMjo0NyAtIFJ4IGludGVycnVwdCByZWdpc3RlcgorICoJMzE6MjQgLSB1bnVzZWQKKyAqCTIzOjE2IC0gVHhSeCBpbnRlcnJ1cHQgcmVnaXN0ZXIgYml0MTU6OAorICoJMTU6MCAgLSBUeCBpbnRlcnJ1cHQgcmVnaXN0ZXIKKyAqCisgKiBSZXR1cm5zOgorICoJMDogIHN1Y2Nlc3MKKyAqCTE6ICBzb21ldGhpbmcgd2VudCB3cm9uZworICovCitpbnQgU2tHbU92ZXJmbG93U3RhdHVzKAorU0tfQUMJKnBBQywJCQkJLyogYWRhcHRlciBjb250ZXh0ICovCitTS19JT0MJSW9DLAkJCQkvKiBJTyBjb250ZXh0ICovCit1bnNpZ25lZCBpbnQgUG9ydCwJCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitTS19VMTYJSVN0YXR1cywJCQkvKiBJbnRlcnVwdCBTdGF0dXMgZnJvbSBNQUMgKi8KK1NLX1U2NAlTS19GQVIgKnBTdGF0dXMpCS8qIHB0ciBmb3IgcmV0dXJuIG92ZXJmbG93IHN0YXR1cyB2YWx1ZSAqLworeworCVNLX1U2NAlTdGF0dXM7CQkvKiBPdmVyZmxvdyBzdGF0dXMgKi8KKwlTS19VMTYJUmVnVmFsOworCisJU3RhdHVzID0gMDsKKworCWlmICgoSVN0YXR1cyAmIEdNX0lTX1JYX0NPX09WKSAhPSAwKSB7CisJCS8qIHRoaXMgcmVnaXN0ZXIgaXMgc2VsZi1jbGVhcmluZyBhZnRlciByZWFkICovCisJCUdNX0lOMTYoSW9DLCBQb3J0LCBHTV9SWF9JUlFfU1JDLCAmUmVnVmFsKTsKKwkJU3RhdHVzIHw9IChTS19VNjQpUmVnVmFsIDw8IDMyOworCX0KKwkKKwlpZiAoKElTdGF0dXMgJiBHTV9JU19UWF9DT19PVikgIT0gMCkgeworCQkvKiB0aGlzIHJlZ2lzdGVyIGlzIHNlbGYtY2xlYXJpbmcgYWZ0ZXIgcmVhZCAqLworCQlHTV9JTjE2KElvQywgUG9ydCwgR01fVFhfSVJRX1NSQywgJlJlZ1ZhbCk7CisJCVN0YXR1cyB8PSAoU0tfVTY0KVJlZ1ZhbDsKKwl9CisJCisJLyogdGhpcyByZWdpc3RlciBpcyBzZWxmLWNsZWFyaW5nIGFmdGVyIHJlYWQgKi8KKwlHTV9JTjE2KElvQywgUG9ydCwgR01fVFJfSVJRX1NSQywgJlJlZ1ZhbCk7CisJLyogUnggb3ZlcmZsb3cgaW50ZXJydXB0IHJlZ2lzdGVyIGJpdHMgKExvQnl0ZSkqLworCVN0YXR1cyB8PSAoU0tfVTY0KSgoU0tfVTgpUmVnVmFsKSA8PCA0ODsKKwkvKiBUeCBvdmVyZmxvdyBpbnRlcnJ1cHQgcmVnaXN0ZXIgYml0cyAoSGlCeXRlKSovCisJU3RhdHVzIHw9IChTS19VNjQpKFJlZ1ZhbCA+PiA4KSA8PCAxNjsKKworCSpwU3RhdHVzID0gU3RhdHVzOworCisJcmV0dXJuKDApOworfQkvKiBTa0dtT3ZlcmZsb3dTdGF0dXMgKi8KKworCisjaWZuZGVmIFNLX1NMSU0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglTa0dtQ2FibGVEaWFnU3RhdHVzKCkgLSBTdGFydHMgLyBHZXRzIHN0YXR1cyBvZiBjYWJsZSBkaWFnbm9zdGljIHRlc3QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICBzdGFydHMgdGhlIGNhYmxlIGRpYWdub3N0aWMgdGVzdCBpZiAnU3RhcnRUZXN0JyBpcyB0cnVlCisgKiAgZ2V0cyB0aGUgcmVzdWx0cyBpZiAnU3RhcnRUZXN0JyBpcyB0cnVlCisgKgorICogTk9URToJdGhpcyB0ZXN0IGlzIG1lYW5pbmdmdWwgb25seSB3aGVuIGxpbmsgaXMgZG93bgorICoJCisgKiBSZXR1cm5zOgorICoJMDogIHN1Y2Nlc3MKKyAqCTE6CW5vIFlVS09OIGNvcHBlcgorICoJMjoJdGVzdCBpbiBwcm9ncmVzcworICovCitpbnQgU2tHbUNhYmxlRGlhZ1N0YXR1cygKK1NLX0FDCSpwQUMsCQkvKiBhZGFwdGVyIGNvbnRleHQgKi8KK1NLX0lPQwlJb0MsICAgCQkvKiBJTyBjb250ZXh0ICovCitpbnQJCVBvcnQsCQkvKiBQb3J0IEluZGV4IChNQUNfMSArIG4pICovCitTS19CT09MCVN0YXJ0VGVzdCkJLyogZmxhZyBmb3Igc3RhcnQgLyBnZXQgcmVzdWx0ICovCit7CisJaW50CQlpOworCVNLX1UxNglSZWdWYWw7CisJU0tfR0VQT1JUCSpwUHJ0OworCisJcFBydCA9ICZwQUMtPkdJbmkuR1BbUG9ydF07CisKKwlpZiAocFBydC0+UGh5VHlwZSAhPSBTS19QSFlfTUFSVl9DT1BQRVIpIHsKKwkJCisJCXJldHVybigxKTsKKwl9CisKKwlpZiAoU3RhcnRUZXN0KSB7CisJCS8qIG9ubHkgc3RhcnQgdGhlIGNhYmxlIHRlc3QgKi8KKwkJaWYgKChwUHJ0LT5QaHlJZDEgJiBQSFlfSTFfUkVWX01TSykgPCA0KSB7CisJCQkvKiBhcHBseSBURFIgd29ya2Fyb3VuZCBmcm9tIE1hcnZlbGwgKi8KKwkJCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgMjksIDB4MDAxZSk7CisJCQkKKwkJCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgMzAsIDB4Y2MwMCk7CisJCQlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIDMwLCAweGM4MDApOworCQkJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCAzMCwgMHhjNDAwKTsKKwkJCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgMzAsIDB4YzAwMCk7CisJCQlTa0dtUGh5V3JpdGUocEFDLCBJb0MsIFBvcnQsIDMwLCAweGMxMDApOworCQl9CisKKwkJLyogc2V0IGFkZHJlc3MgdG8gMCBmb3IgTURJWzBdICovCisJCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfRVhUX0FEUiwgMCk7CisKKwkJLyogUmVhZCBDYWJsZSBEaWFnbm9zdGljIFJlZyAqLworCQlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfQ0FCTEVfRElBRywgJlJlZ1ZhbCk7CisKKwkJLyogc3RhcnQgQ2FibGUgRGlhZ25vc3RpYyBUZXN0ICovCisJCVNrR21QaHlXcml0ZShwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfQ0FCTEVfRElBRywKKwkJCShTS19VMTYpKFJlZ1ZhbCB8IFBIWV9NX0NBQkRfRU5BX1RFU1QpKTsKKwkKKwkJcmV0dXJuKDApOworCX0KKwkKKwkvKiBSZWFkIENhYmxlIERpYWdub3N0aWMgUmVnICovCisJU2tHbVBoeVJlYWQocEFDLCBJb0MsIFBvcnQsIFBIWV9NQVJWX0NBQkxFX0RJQUcsICZSZWdWYWwpOworCisJU0tfREJHX01TRyhwQUMsIFNLX0RCR01PRF9IV00sIFNLX0RCR0NBVF9DVFJMLAorCQkoIlBIWSBDYWJsZSBEaWFnLj0weCUwNFhcbiIsIFJlZ1ZhbCkpOworCisJaWYgKChSZWdWYWwgJiBQSFlfTV9DQUJEX0VOQV9URVNUKSAhPSAwKSB7CisJCS8qIHRlc3QgaXMgcnVubmluZyAqLworCQlyZXR1cm4oMik7CisJfQorCisJLyogZ2V0IHRoZSB0ZXN0IHJlc3VsdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSAgeworCQkvKiBzZXQgYWRkcmVzcyB0byBpIGZvciBNRElbaV0gKi8KKwkJU2tHbVBoeVdyaXRlKHBBQywgSW9DLCBQb3J0LCBQSFlfTUFSVl9FWFRfQURSLCAoU0tfVTE2KWkpOworCisJCS8qIGdldCBDYWJsZSBEaWFnbm9zdGljIHZhbHVlcyAqLworCQlTa0dtUGh5UmVhZChwQUMsIElvQywgUG9ydCwgUEhZX01BUlZfQ0FCTEVfRElBRywgJlJlZ1ZhbCk7CisKKwkJcFBydC0+UE1kaVBhaXJMZW5baV0gPSAoU0tfVTgpKFJlZ1ZhbCAmIFBIWV9NX0NBQkRfRElTVF9NU0spOworCisJCXBQcnQtPlBNZGlQYWlyU3RzW2ldID0gKFNLX1U4KSgoUmVnVmFsICYgUEhZX01fQ0FCRF9TVEFUX01TSykgPj4gMTMpOworCX0KKworCXJldHVybigwKTsKK30JLyogU2tHbUNhYmxlRGlhZ1N0YXR1cyAqLworI2VuZGlmIC8qICFTS19TTElNICovCisjZW5kaWYgLyogWVVLT04gKi8KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrX2cxNi5jIGIvZHJpdmVycy9uZXQvc2tfZzE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0YWUwZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrX2cxNi5jCkBAIC0wLDAgKzEsMjA2NiBAQAorLyotCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQgYnkgUEpEIFdlaWNobWFubiAmIFNXUyBCZXJuLCBTd2l0emVybGFuZAorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogTW9kdWxlICAgICAgICAgOiBza19nMTYuYworICoKKyAqIFZlcnNpb24gICAgICAgIDogJFJldmlzaW9uOiAxLjEgJAorICoKKyAqIEF1dGhvciAgICAgICAgIDogUGF0cmljayBKLkQuIFdlaWNobWFubgorICoKKyAqIERhdGUgQ3JlYXRlZCAgIDogOTQvMDUvMjYKKyAqIExhc3QgVXBkYXRlZCAgIDogJERhdGU6IDE5OTQvMDYvMzAgMTY6MjU6MTUgJAorICoKKyAqIERlc2NyaXB0aW9uICAgIDogU2NobmVpZGVyICYgS29jaCBHMTYgRXRoZXJuZXQgRGV2aWNlIERyaXZlciBmb3IKKyAqICAgICAgICAgICAgICAgICAgTGludXggS2VybmVsID49IDEuMS4yMgorICogVXBkYXRlIEhpc3RvcnkgOgorICogICAgICAgICAgICAgICAgICBQYXVsIEdvcnRtYWtlciwgMDMvOTc6IEZpeCBmb3IgdjIuMS54IHRvIHVzZSByZWFke2Isd30KKyAqICAgICAgICAgICAgICAgICAgd3JpdGV7Yix3fSBhbmQgbWVtY3B5IC0+IG1lbWNweV97dG8sZnJvbX1pbworICoKKyAqCQkgICAgSmVmZiBHYXJ6aWssIDA2LzIwMDAsIE1vZHVsYXJpemUKKyAqCistKi8KKworc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSA9ICIkSWQ6IHNrX2cxNi5jLHYgMS4xIDE5OTQvMDYvMzAgMTY6MjU6MTUgcm9vdCBFeHAgJCI7CisKKy8qCisgKiBUaGUgU2NobmVpZGVyICYgS29jaCAoU0spIEcxNiBOZXR3b3JrIGRldmljZSBkcml2ZXIgaXMgYmFzZWQKKyAqIG9uIHRoZSAnbmk2NTEwJyBkcml2ZXIgZnJvbSBNaWNoYWVsIEhpcHAgd2hpY2ggY2FuIGJlIGZvdW5kIGF0CisgKiBmdHA6Ly9zdW5zaXRlLnVuYy5lZHUvcHViL0xpbnV4L3N5c3RlbS9OZXR3b3JrL2RyaXZlcnMvbmlkcml2ZXJzLnRhci5negorICogCisgKiBTb3VyY2VzOiAxKSBuaTY1MTAuYyBieSBNLiBIaXBwCisgKiAgICAgICAgICAyKSBkZXBjYS5jICBieSBELkMuIERhdmllcworICogICAgICAgICAgMykgc2tlbGV0b24uYyBieSBELiBCZWNrZXIKKyAqICAgICAgICAgIDQpIEFtNzk5MCBMb2NhbCBBcmVhIE5ldHdvcmsgQ29udHJvbGxlciBmb3IgRXRoZXJuZXQgKExBTkNFKSwKKyAqICAgICAgICAgICAgIEFNRCwgUHViLiAjMDU2OTgsIEp1bmUgMTk4OQorICoKKyAqIE1hbnkgVGhhbmtzIGZvciBoZWxwaW5nIG1lIHRvIGdldCB0aGluZ3Mgd29ya2luZyB0bzogCisgKiAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgQS4gQ294IChBLkNveEBzd2Fuc2VhLmFjLnVrKQorICogICAgICAgICAgICAgICAgIE0uIEhpcHAgKG1oaXBwQHN0dWRlbnQudW5pLXR1ZWJpbmdlbi5kZSkKKyAqICAgICAgICAgICAgICAgICBSLiBCb2x6IChTY2huZWlkZXIgJiBLb2NoLCBHZXJtYW55KQorICoKKyAqIFRvIERvOiAKKyAqICAgICAgICAtIFN1cHBvcnQgb2YgU0tfRzggYW5kIG90aGVyIFNLIE5ldHdvcmsgQ2FyZHMuCisgKiAgICAgICAgLSBBdXRvc2V0IG1lbW9yeSBtYXBwZWQgUkFNLiBDaGVjayBmb3IgZnJlZSBtZW1vcnkgYW5kIHRoZW4KKyAqICAgICAgICAgIGNvbmZpZ3VyZSBSQU0gY29ycmVjdGx5LiAKKyAqICAgICAgICAtIFNLX2Nsb3NlIHNob3VsZCByZWFsbHkgc2V0IGNhcmQgaW4gdG8gaW5pdGlhbCBzdGF0ZS4KKyAqICAgICAgICAtIFRlc3QgaWYgSVJRIDMgaXMgbm90IHN3aXRjaGVkIG9mZi4gVXNlIGF1dG9pcnEoKSBmdW5jdGlvbmFsaXR5LgorICogICAgICAgICAgKGFzIGluIC9kcml2ZXJzL25ldC9za2VsZXRvbi5jKQorICogICAgICAgIC0gSW1wbGVtZW50IE11bHRpY2FzdCBhZGRyZXNzaW5nLiBBdCBtaW5pbXVtIHNvbWV0aGluZyBsaWtlCisgKiAgICAgICAgICBpbiBkZXBjYS5jLiAKKyAqICAgICAgICAtIFJlZG8gdGhlIHN0YXRpc3RpY3MgcGFydC4KKyAqICAgICAgICAtIFRyeSB0byBmaW5kIG91dCBpZiB0aGUgYm9hcmQgaXMgaW4gOCBCaXQgb3IgMTYgQml0IHNsb3QuCisgKiAgICAgICAgICBJZiBpbiA4IEJpdCBtb2RlIGRvbid0IHVzZSBJUlEgMTEuCisgKiAgICAgICAgLSAoVHJ5IHRvIG1ha2UgaXQgc2xpZ2h0bHkgZmFzdGVyLikgCisgKgkgIC0gUG93ZXIgbWFuYWdlbWVudCBzdXBwb3J0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPiAKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgInNrX2cxNi5oIgorCisvKiAKKyAqIFNjaG5laWRlciAmIEtvY2ggQ2FyZCBEZWZpbml0aW9ucyAKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovICAKKworI2RlZmluZSBTS19OQU1FICAgIlNLX0cxNiIKKworLyoKKyAqIFNLX0cxNiBDb25maWd1cmF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICovIAorCisvKiAKKyAqIEFiYnJldmlhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0KKyAqICAKKyAqIFJBTSAtIHVzZWQgZm9yIHRoZSAxNktCIHNoYXJlZCBtZW1vcnkgCisgKiBCb290X1JPTSwgUk9NIC0gYXJlIHVzZWQgZm9yIHJlZmVyZW5jaW5nIHRoZSBCb290RVBST00KKyAqCisgKiBTS19CT09UX1JPTSBhbmQgU0tfQUREUiBhcmUgc3ltYm9saWMgY29uc3RhbnRzIHVzZWQgdG8gY29uZmlndXJlCisgKiB0aGUgYmVoYXZpb3VyIG9mIHRoZSBkcml2ZXIgYW5kIHRoZSBTS19HMTYuCisgKgorICogISBTZWUgc2tfZzE2Lmluc3RhbGwgb24gaG93IHRvIGluc3RhbGwgYW5kIGNvbmZpZ3VyZSB0aGUgZHJpdmVyICEgICAKKyAqCisgKiBTS19CT09UX1JPTSBkZWZpbmVzIGlmIHRoZSBCb290X1JPTSBzaG91bGQgYmUgc3dpdGNoZWQgb2ZmIG9yIG5vdC4KKyAqCisgKiBTS19BRERSIGRlZmluZXMgdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIFJBTSB3aWxsIGJlIG1hcHBlZCBpbnRvIHRoZSByZWFsCisgKiAgICAgICAgIGhvc3QgbWVtb3J5LgorICogICAgICAgICB2YWxpZCBhZGRyZXNzZXMgYXJlIGZyb20gMHhhMDAwMCB0byAweGZjMDAwIGluIDE2S2J5dGUgc3RlcHMuCisgKi8gIAorIAorI2RlZmluZSBTS19CT09UX1JPTSAgICAgMSAgICAgICAgICAgICAgLyogMT1Cb290Uk9NIG9uIDA9b2ZmICovCisKKyNkZWZpbmUgU0tfQUREUiAgICAgICAgIDB4Y2MwMDAKKworLyogCisgKiBJbiBQT1MzIGFyZSBiaXRzIEExNC1BMTkgb2YgdGhlIGFkZHJlc3MgYnVzLiBUaGVzZSBiaXRzIGNhbiBiZSBzZXQKKyAqIHRvIGNob29zZSB0aGUgUkFNIGFkZHJlc3MuIFRoYXQncyB3aHkgd2Ugb25seSBjYW4gY2hvb3NlIHRoZSBSQU0gYWRkcmVzcworICogaW4gMTZLQiBzdGVwcy4KKyAqLworCisjZGVmaW5lIFBPU19BRERSICAgICAgIChyb21fYWRkcj4+MTQpICAvKiBEbyBub3QgY2hhbmdlIHRoaXMgbGluZSAqLworCisvKiAKKyAqIFNLX0cxNiBJL08gUE9SVCdzICsgSVJRJ3MgKyBCb290X1JPTSBsb2NhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKiAKKyAqIEFzIG5lYXJseSBldmVyeSBjYXJkIGhhcyBhbHNvIFNLX0cxNiBhIHNwZWNpZmllZCBJL08gUG9ydCByZWdpb24gYW5kCisgKiBvbmx5IGEgZmV3IHBvc3NpYmxlIElSUSdzLgorICogSW4gdGhlIEluc3RhbGxhdGlvbiBHdWlkZSBmcm9tIFNjaG5laWRlciAmIEtvY2ggaXMgbGlzdGVkIGEgcG9zc2libGUKKyAqIEludGVycnVwdCBJUlEyLiBJUlEyIGlzIGFsd2F5cyBJUlE5IGluIGJvYXJkcyB3aXRoIHR3byBjYXNjYWRlZCBpbnRlcnJ1cHQKKyAqIGNvbnRyb2xsZXJzLiBTbyB3ZSB1c2UgaW4gU0tfSVJRUyBJUlE5LgorICovCisKKy8qIERvbid0IHRvdWNoIGFueSBvZiB0aGUgZm9sbG93aW5nICNkZWZpbmVzLiAqLworCisjZGVmaW5lIFNLX0lPX1BPUlRTICAgICB7IDB4MTAwLCAweDE4MCwgMHgyMDgsIDB4MjIwLCAweDI4OCwgMHgzMjAsIDB4MzI4LCAweDM5MCwgMCB9CisKKyNkZWZpbmUgU0tfSVJRUyAgICAgICAgIHsgMywgNSwgOSwgMTEsIDAgfQorCisjZGVmaW5lIFNLX0JPT1RfUk9NX0xPQ0FUSU9OUyB7IDB4YzAwMDAsIDB4YzQwMDAsIDB4YzgwMDAsIDB4Y2MwMDAsIDB4ZDAwMDAsIDB4ZDQwMDAsIDB4ZDgwMDAsIDB4ZGMwMDAsIDAgfQorCisjZGVmaW5lIFNLX0JPT1RfUk9NX0lEICB7IDB4NTUsIDB4YWEsIDB4MTAsIDB4NTAsIDB4MDYsIDB4MzMgfQorCisvKiAKKyAqIFNLX0cxNiBQT1MgUkVHSVNURVJTIAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogU0tfRzE2IGhhcyBhIFByb2dyYW1tYWJsZSBPcHRpb24gU2VsZWN0IChQT1MpIFJlZ2lzdGVyLgorICogVGhlIFBPUyBpcyBjb21wb3NlZCBvZiA4IHNlcGFyYXRlIHJlZ2lzdGVycyAoUE9TMC03KSB3aGljaCAKKyAqIGFyZSBJL08gbWFwcGVkIG9uIGFuIGFkZHJlc3Mgc2V0IGJ5IHRoZSBXMSBzd2l0Y2guICAgICAgICAgICAgICAgICAgICAKKyAqCisgKi8KKworI2RlZmluZSBTS19QT1NfU0laRSA4ICAgICAgICAgICAvKiA4IEkvTyBQb3J0cyBhcmUgdXNlZCBieSBTS19HMTYgKi8KKworI2RlZmluZSBTS19QT1MwICAgICBpb2FkZHIgICAgICAvKiBDYXJkLUlEIExvdyAoUikgKi8KKyNkZWZpbmUgU0tfUE9TMSAgICAgaW9hZGRyKzEgICAgLyogQ2FyZC1JRCBIaWdoIChSKSAqLworI2RlZmluZSBTS19QT1MyICAgICBpb2FkZHIrMiAgICAvKiBDYXJkLUVuYWJsZSwgQm9vdC1ST00gRGlzYWJsZSAoUlcpICovCisjZGVmaW5lIFNLX1BPUzMgICAgIGlvYWRkciszICAgIC8qIEJhc2UgYWRkcmVzcyBvZiBSQU0gKi8KKyNkZWZpbmUgU0tfUE9TNCAgICAgaW9hZGRyKzQgICAgLyogSVJRICovCisKKy8qIFBPUzUgLSBQT1M3IGFyZSB1bnVzZWQgKi8KKworLyogCisgKiBTS19HMTYgTUFDIFBSRUZJWCAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyogCisgKiBTY2hlaWRlciAmIEtvY2ggbWFudWZhY3R1cmVyIGNvZGUgKDAwOjAwOmE1KS4KKyAqIFRoaXMgbXVzdCBiZSBjaGVja2VkLCB0aGF0IHdlIGFyZSBzdXJlIGl0IGlzIGEgU0sgY2FyZC4KKyAqLworCisjZGVmaW5lIFNLX01BQzAgICAgICAgICAweDAwCisjZGVmaW5lIFNLX01BQzEgICAgICAgICAweDAwCisjZGVmaW5lIFNLX01BQzIgICAgICAgICAweDVhCisKKy8qIAorICogU0tfRzE2IElEIAorICogLS0tLS0tLS0tCisgKi8gCisKKy8qIAorICogSWYgUE9TMCxQT1MxIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBJRCwgdGhlbiB3ZSBrbm93CisgKiBhdCB3aGljaCBJL08gUG9ydCBBZGRyZXNzIHdlIGFyZS4gCisgKi8KKworI2RlZmluZSBTS19JRExPVyAgMHhmZCAKKyNkZWZpbmUgU0tfSURISUdIIDB4NmEKKworCisvKiAKKyAqIExBTkNFIFBPUyBCaXQgZGVmaW5pdGlvbnMgCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2RlZmluZSBTS19ST01fUkFNX09OICAoUE9TMl9DQVJEKQorI2RlZmluZSBTS19ST01fUkFNX09GRiAoUE9TMl9FUFJPTSkKKyNkZWZpbmUgU0tfUk9NX09OICAgICAgKGluYihTS19QT1MyKSAmIFBPUzJfQ0FSRCkKKyNkZWZpbmUgU0tfUk9NX09GRiAgICAgKGluYihTS19QT1MyKSB8IFBPUzJfRVBST00pCisjZGVmaW5lIFNLX1JBTV9PTiAgICAgIChpbmIoU0tfUE9TMikgfCBQT1MyX0NBUkQpCisjZGVmaW5lIFNLX1JBTV9PRkYgICAgIChpbmIoU0tfUE9TMikgJiBQT1MyX0VQUk9NKSAKKworI2RlZmluZSBQT1MyX0NBUkQgIDB4MDAwMSAgICAgICAgICAgICAgLyogMSA9IFNLX0cxNiBvbiAgICAgIDAgPSBvZmYgKi8KKyNkZWZpbmUgUE9TMl9FUFJPTSAweDAwMDIgICAgICAgICAgICAgIC8qIDEgPSBCb290IEVQUk9NIG9mZiAwID0gb24gKi8gCisKKy8qIAorICogU0tfRzE2IE1lbW9yeSBtYXBwZWQgUmVnaXN0ZXJzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8gCisKKyNkZWZpbmUgU0tfSU9SRUcgICAgICAgICgmYm9hcmQtPmlvcmVnKSAvKiBMQU5DRSBkYXRhIHJlZ2lzdGVycy4gICAgICovIAorI2RlZmluZSBTS19QT1JUICAgICAgICAgKCZib2FyZC0+cG9ydCkgIC8qIENvbnRyb2wsIFN0YXR1cyByZWdpc3RlciAgKi8KKyNkZWZpbmUgU0tfSU9DT00gICAgICAgICgmYm9hcmQtPmlvY29tKSAvKiBJL08gQ29tbWFuZCAgICAgICAgICAgICAgICovCisKKy8qIAorICogU0tfRzE2IFN0YXR1cy9Db250cm9sIFJlZ2lzdGVyIGJpdHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogKEMpIENvbnRyb2xyZWcgKFMpIFN0YXR1c3JlZyAKKyAqLworCisvKiAKKyAqIFJlZ2lzdGVyIHRyYW5zZmVyOiAwID0gbm8gdHJhbnNmZXIKKyAqICAgICAgICAgICAgICAgICAgICAxID0gdHJhbnNmZXJyaW5nIGRhdGEgYmV0d2VlbiBMQU5DRSBhbmQgSS9PIHJlZyAKKyAqLworI2RlZmluZSBTS19JT1JVTiAgICAgICAgMHgyMCAgIAorCisvKiAKKyAqIExBTkNFIGludGVycnVwdDogMCA9IExBTkNFIGludGVycnVwdCBvY2N1cnJlZAkKKyAqICAgICAgICAgICAgICAgICAgMSA9IG5vIExBTkNFIGludGVycnVwdCBvY2N1cnJlZAorICovCisjZGVmaW5lIFNLX0lSUSAgICAgICAgICAweDEwICAgCisJCQkKKyNkZWZpbmUgU0tfUkVTRVQgICAgICAgIDB4MDggICAvKiBSZXNldCBTS19DQVJEOiAwID0gUkVTRVQgMSA9IG5vcm1hbCAqLworI2RlZmluZSBTS19SVyAgICAgICAgICAgMHgwMiAgIC8qIDAgPSB3cml0ZSB0byAxID0gcmVhZCBmcm9tICovCisjZGVmaW5lIFNLX0FEUiAgICAgICAgICAweDAxICAgLyogMCA9IFJFRyBEYXRhUG9ydCAxID0gUkFQIFJlZyBhZGRyIHBvcnQgKi8KKworICAKKyNkZWZpbmUgU0tfUlJFRyAgICAgICAgIFNLX1JXICAvKiBUcmFuc2ZlcmRpcmVjdGlvbiB0byByZWFkIGZyb20gbGFuY2UgKi8KKyNkZWZpbmUgU0tfV1JFRyAgICAgICAgIDAgICAgICAvKiBUcmFuc2ZlcmRpcmVjdGlvbiB0byB3cml0ZSB0byBsYW5jZSAqLworI2RlZmluZSBTS19SQVAgICAgICAgICAgU0tfQURSIC8qIERlc3RpbmF0aW9uIFJlZ2lzdGVyIFJBUCAqLworI2RlZmluZSBTS19SREFUQSAgICAgICAgMCAgICAgIC8qIERlc3RpbmF0aW9uIFJlZ2lzdGVyIFJFRyBEYXRhUG9ydCAqLworCisvKiAKKyAqIFNLX0cxNiBJL08gQ29tbWFuZCAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qIAorICogQW55IGJpdGNvbWJpbmF0aW9uIHNldHMgdGhlIGludGVybmFsIEkvTyBiaXQgKHRyYW5zZmVyIHdpbGwgc3RhcnQpIAorICogd2hlbiB3cml0dGVuIHRvIEkvTyBDb21tYW5kCisgKi8KKworI2RlZmluZSBTS19ET0lPICAgICAgICAgMHg4MCAgIC8qIERvIFRyYW5zZmVyICovIAorIAorLyogCisgKiBMQU5DRSBSQVAgKFJlZ2lzdGVyIEFkZHJlc3MgUG9ydCkuIAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyogICAKKyAqIFRoZSBMQU5DRSBpbnRlcm5hbCByZWdpc3RlcnMgYXJlIHNlbGVjdGVkIHRocm91Z2ggdGhlIFJBUC4gCisgKiBUaGUgUmVnaXN0ZXJzIGFyZToKKyAqCisgKiBDU1IwIC0gU3RhdHVzIGFuZCBDb250cm9sIGZsYWdzIAorICogQ1NSMSAtIExvdyBvcmRlciBiaXRzIG9mIGluaXRpYWxpemUgYmxvY2sgKGJpdHMgMTU6MDApCisgKiBDU1IyIC0gSGlnaCBvcmRlciBiaXRzIG9mIGluaXRpYWxpemUgYmxvY2sgKGJpdHMgMDc6MDAsIDE1OjA4IGFyZSByZXNlcnZlZCkKKyAqIENTUjMgLSBBbGxvd3MgcmVkZWZpbml0aW9uIG9mIHRoZSBCdXMgTWFzdGVyIEludGVyZmFjZS4KKyAqICAgICAgICBUaGlzIHJlZ2lzdGVyIG11c3QgYmUgc2V0IHRvIDB4MDAwMiwgd2hpY2ggbWVhbnMgQlNXQVAgPSAwLAorICogICAgICAgIEFDT04gPSAxLCBCQ09OID0gMDsKKyAqCisgKi8KKyAKKyNkZWZpbmUgQ1NSMCAgICAgICAgICAgIDB4MDAgICAKKyNkZWZpbmUgQ1NSMSAgICAgICAgICAgIDB4MDEgIAorI2RlZmluZSBDU1IyICAgICAgICAgICAgMHgwMiAKKyNkZWZpbmUgQ1NSMyAgICAgICAgICAgIDB4MDMKKworLyogCisgKiBHZW5lcmFsIERlZmluaXRpb25zIAorICogPT09PT09PT09PT09PT09PT09PQorICovCisKKy8qIAorICogU2V0IHRoZSBudW1iZXIgb2YgVHggYW5kIFJ4IGJ1ZmZlcnMsIHVzaW5nIExvZ18yKCMgYnVmZmVycykuCisgKiBXZSBoYXZlIDE2S0IgUkFNIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZCBieSB0aGUgTEFOQ0UuIEluIHRoZSAKKyAqIG1lbW9yeSBhcmUgbm90IG9ubHkgdGhlIGJ1ZmZlcnMgYnV0IGFsc28gdGhlIHJpbmcgZGVzY3JpcHRvcnMgYW5kCisgKiB0aGUgaW5pdGlhbGl6ZSBibG9jay4gCisgKiBEb24ndCBjaGFuZ2UgYW55dGhpbmcgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSBkby4KKyAqLworCisjZGVmaW5lIExDX0xPR19UWF9CVUZGRVJTIDEgICAgICAgICAgICAgICAvKiAoMiA9PSAyXl4xKSAyIFRyYW5zbWl0IGJ1ZmZlcnMgKi8KKyNkZWZpbmUgTENfTE9HX1JYX0JVRkZFUlMgMyAgICAgICAgICAgICAgIC8qICg4ID09IDJeXjMpIDggUmVjZWl2ZSBidWZmZXJzICovCisKKy8qIERlc2NyaXB0b3IgcmluZyBzaXplcyAqLworCisjZGVmaW5lIFRNRE5VTSAoMSA8PCAoTENfTE9HX1RYX0JVRkZFUlMpKSAvKiAyIFRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZ3MgKi8KKyNkZWZpbmUgUk1ETlVNICgxIDw8IChMQ19MT0dfUlhfQlVGRkVSUykpIC8qIDggUmVjZWl2ZSBCdWZmZXJzICovCisKKy8qIERlZmluZSBNYXNrIGZvciBzZXR0aW5nIFJNRCwgVE1EIGxlbmd0aCBpbiB0aGUgTEFOQ0UgaW5pdF9ibG9jayAqLworCisjZGVmaW5lIFRNRE5VTU1BU0sgKExDX0xPR19UWF9CVUZGRVJTIDw8IDI5KQorI2RlZmluZSBSTUROVU1NQVNLIChMQ19MT0dfUlhfQlVGRkVSUyA8PCAyOSkKKworLyoKKyAqIERhdGEgQnVmZmVyIHNpemUgaXMgc2V0IHRvIG1heGltdW0gcGFja2V0IGxlbmd0aC4KKyAqLworCisjZGVmaW5lIFBLVF9CVUZfU1ogICAgICAgICAgICAgIDE1MTggCisKKy8qIAorICogVGhlIG51bWJlciBvZiBsb3cgSS9PIHBvcnRzIHVzZWQgYnkgdGhlIGV0aGVyY2FyZC4gCisgKi8KKworI2RlZmluZSBFVEhFUkNBUkRfVE9UQUxfU0laRSAgICBTS19QT1NfU0laRQorCisvKiAKKyAqIFNLX0RFQlVHCisgKgorICogSGVyZSB5b3UgY2FuIGNob29zZSB3aGF0IGxldmVsIG9mIGRlYnVnZ2luZyB3YW50ZWQuCisgKgorICogSWYgU0tfREVCVUcgYW5kIFNLX0RFQlVHMiBhcmUgdW5kZWZpbmVkLCB0aGVuIG9ubHkgdGhlCisgKiAgbmVjZXNzYXJ5IG1lc3NhZ2VzIHdpbGwgYmUgcHJpbnRlZC4KKyAqCisgKiBJZiBTS19ERUJVRyBpcyBkZWZpbmVkLCB0aGVyZSB3aWxsIGJlIG1hbnkgZGVidWdnaW5nIHByaW50cworICogIHdoaWNoIGNhbiBoZWxwIHRvIGZpbmQgc29tZSBtaXN0YWtlcyBpbiBjb25maWd1cmF0aW9uIG9yIGV2ZW4KKyAqICBpbiB0aGUgZHJpdmVyIGNvZGUuCisgKgorICogSWYgU0tfREVCVUcyIGlzIGRlZmluZWQsIG1hbnkgbWFueSBtZXNzYWdlcyB3aWxsIGJlIHByaW50ZWQgCisgKiAgd2hpY2ggbm9ybWFsbHkgeW91IGRvbid0IG5lZWQuIEkgdXNlZCB0aGlzIHRvIGNoZWNrIHRoZSBpbnRlcnJ1cHQKKyAqICByb3V0aW5lLiAKKyAqCisgKiAoSWYgeW91IGRlZmluZSBvbmx5IFNLX0RFQlVHMiB0aGVuIG9ubHkgdGhlIG1lc3NhZ2VzIGZvciAKKyAqICBjaGVja2luZyBpbnRlcnJ1cHRzIHdpbGwgYmUgcHJpbnRlZCEpCisgKgorICogTm9ybWFsIHdheSBvZiBsaXZlIGlzOiAKKyAqCisgKiBGb3IgdGhlIHdob2xlIHRoaW5nIGdldCBnb2luZyBsZXQgYm90aCBzeW1ib2xpYyBjb25zdGFudHMKKyAqIHVuZGVmaW5lZC4gSWYgeW91IGZhY2UgYW55IHByb2JsZW1zIGFuZCB5b3Uga25vdyB3aGF0J3MgZ29pbmcKKyAqIG9uICh5b3Uga25vdyBzb21ldGhpbmcgYWJvdXQgdGhlIGNhcmQgYW5kIHlvdSBjYW4gaW50ZXJwcmV0IHNvbWUKKyAqIGhleCBMQU5DRSByZWdpc3RlciBvdXRwdXQpIHRoZW4gZGVmaW5lIFNLX0RFQlVHCisgKiAKKyAqLworCisjdW5kZWYgIFNLX0RFQlVHCS8qIGRlYnVnZ2luZyAqLworI3VuZGVmICBTS19ERUJVRzIJLyogZGVidWdnaW5nIHdpdGggbW9yZSB2ZXJib3NlIHJlcG9ydCAqLworCisjaWZkZWYgU0tfREVCVUcKKyNkZWZpbmUgUFJJTlRLKHgpIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBQUklOVEsoeCkgLyoqLworI2VuZGlmCisKKyNpZmRlZiBTS19ERUJVRzIKKyNkZWZpbmUgUFJJTlRLMih4KSBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgUFJJTlRLMih4KSAvKiovCisjZW5kaWYKKworLyogCisgKiBTS19HMTYgUkFNCisgKgorICogVGhlIGNvbXBvbmVudHMgYXJlIG1lbW9yeSBtYXBwZWQgYW5kIGNhbiBiZSBzZXQgaW4gYSByZWdpb24gZnJvbQorICogMHgwMDAwMCB0aHJvdWdoIDB4ZmMwMDAgaW4gMTZLQiBzdGVwcy4gCisgKgorICogVGhlIE5ldHdvcmsgY29tcG9uZW50cyBhcmU6IGR1YWwgcG9ydGVkIFJBTSwgUHJvbSwgSS9PIFJlZywgU3RhdHVzLSwKKyAqIENvbnRyb2xyZWdpc3RlciBhbmQgSS9PIENvbW1hbmQuCisgKgorICogZHVhbCBwb3J0ZWQgUkFNOiBUaGlzIGlzIHRoZSBvbmx5IG1lbW9yeSByZWdpb24gd2hpY2ggdGhlIExBTkNFIGNoaXAKKyAqICAgICAgaGFzIGFjY2VzcyB0by4gRnJvbSB0aGUgTGFuY2UgaXQgaXMgYWRkcmVzc2VkIGZyb20gMHgwMDAwIHRvCisgKiAgICAgIDB4M2ZiZi4gVGhlIGhvc3QgYWNjZXNzZXMgaXQgbm9ybWFsbHkuCisgKgorICogUFJPTTogVGhlIFBST00gb2J0YWlucyB0aGUgRVRIRVJORVQtTUFDLUFkZHJlc3MuIEl0IGlzIHJlYWxpc2VkIGFzIGEKKyAqICAgICAgIDgtQml0IFBST00sIHRoaXMgbWVhbnMgb25seSB0aGUgMTYgZXZlbiBhZGRyZXNzZXMgYXJlIHVzZWQgb2YgdGhlCisgKiAgICAgICAzMiBCeXRlIEFkZHJlc3MgcmVnaW9uLiBBY2Nlc3MgdG8gYW4gb2RkIGFkZHJlc3MgcmVzdWx0cyBpbiBpbnZhbGlkCisgKiAgICAgICBkYXRhLgorICogCisgKiBMQU5DRSBJL08gUmVnOiBUaGUgSS9PIFJlZyBpcyBidWlsZCBvZiA0IHNpbmdsZSBSZWdpc3RlcnMsIExvdy1CeXRlIFdyaXRlLAorICogICAgICAgSGktQnl0ZSBXcml0ZSwgTG93LUJ5dGUgUmVhZCwgSGktQnl0ZSBSZWFkLgorICogICAgICAgVHJhbnNmZXIgZnJvbSBvciB0byB0aGUgTEFOQ0UgaXMgYWx3YXlzIGluIDE2Qml0IHNvIExvdyBhbmQgSGlnaAorICogICAgICAgcmVnaXN0ZXJzIGFyZSBhbHdheXMgcmVsZXZhbnQuCisgKgorICogICAgICAgVGhlIERhdGEgZnJvbSB0aGUgUmVhZHJlZ2lzdGVyIGlzIG5vdCB0aGUgZGF0YSBpbiB0aGUgV3JpdGVyZWdpc3RlciEhCisgKiAgICAgICAKKyAqIFBvcnQ6IFN0YXR1cy0gYW5kIENvbnRyb2xyZWdpc3Rlci4gCisgKiAgICAgICBUd28gZGlmZmVyZW50IHJlZ2lzdGVycyB3aGljaCBzaGFyZSB0aGUgc2FtZSBhZGRyZXNzLCBTdGF0dXMgaXMgCisgKiAgICAgICByZWFkLW9ubHksIENvbnRyb2wgaXMgd3JpdGUtb25seS4KKyAqICAgIAorICogSS9PIENvbW1hbmQ6IAorICogICAgICAgQW55IGJpdGNvbWJpbmF0aW9uIHdyaXR0ZW4gaW4gaGVyZSBzdGFydHMgdGhlIHRyYW5zbWlzc2lvbiBiZXR3ZWVuCisgKiAgICAgICBIb3N0IGFuZCBMQU5DRS4KKyAqLworCit0eXBlZGVmIHN0cnVjdAoreworCXVuc2lnbmVkIGNoYXIgIHJhbVsweDNmYzBdOyAgIC8qIDE2S0IgZHVhbCBwb3J0ZWQgcmFtICovCisJdW5zaWduZWQgY2hhciAgcm9tWzB4MDAyMF07ICAgLyogMzJCeXRlIFBST00gY29udGFpbmluZyA2Qnl0ZSBNQUMgKi8KKwl1bnNpZ25lZCBjaGFyICByZXMxWzB4MDAxMF07ICAvKiByZXNlcnZlZCAqLworCXVuc2lnbmVkIHZvbGF0aWxlIHNob3J0IGlvcmVnOy8qIExBTkNFIEkvTyBSZWdpc3RlciAqLworCXVuc2lnbmVkIHZvbGF0aWxlIGNoYXIgIHBvcnQ7IC8qIFN0YXR1c3JlZ2lzdGVyIGFuZCBDb250cm9scmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBjaGFyICBpb2NvbTsgICAgICAgICAvKiBJL08gQ29tbWFuZCBSZWdpc3RlciAqLworfSBTS19SQU07CisKKy8qIHN0cnVjdCAgKi8KKworLyogCisgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgZm9yIHRoZSBkdWFsIHBvcnRlZCByYW0uIFdlCisgKiBoYXZlIGV4YWN0bHkgMTYgMzIwIEJ5dGVzLiBJbiBoZXJlIHRoZXJlIG11c3QgYmU6CisgKgorICogICAgIC0gSW5pdGlhbGl6ZSBCbG9jayAgIChzdGFydGluZyBhdCBhIHdvcmQgYm91bmRhcnkpCisgKiAgICAgLSBSZWNlaXZlIGFuZCBUcmFuc21pdCBEZXNjcmlwdG9yIFJpbmdzIChxdWFkd29yZCBib3VuZGFyeSkKKyAqICAgICAtIERhdGEgQnVmZmVycyAoYXJiaXRyYXJ5IGJvdW5kYXJ5KQorICoKKyAqIFRoaXMgaXMgYmVjYXVzZSBMQU5DRSBoYXMgb24gU0tfRzE2IG9ubHkgYWNjZXNzIHRvIHRoZSBkdWFsIHBvcnRlZAorICogUkFNIGFuZCBub3doZXJlIGVsc2UuCisgKi8KKworc3RydWN0IFNLX3JhbQoreworICAgIHN0cnVjdCBpbml0X2Jsb2NrIGliOworICAgIHN0cnVjdCB0bWQgdG1kZVtUTUROVU1dOworICAgIHN0cnVjdCBybWQgcm1kZVtSTUROVU1dOworICAgIGNoYXIgdG1kYnVmW1RNRE5VTV1bUEtUX0JVRl9TWl07CisgICAgY2hhciBybWRidWZbUk1ETlVNXVtQS1RfQlVGX1NaXTsKK307CisKKy8qIAorICogU3RydWN0dXJlIHdoZXJlIGFsbCBuZWNlc3NhcnkgaW5mb3JtYXRpb24gaXMgZm9yIHJpbmcgYnVmZmVyIAorICogbWFuYWdlbWVudCBhbmQgc3RhdGlzdGljcy4KKyAqLworCitzdHJ1Y3QgcHJpdgoreworICAgIHN0cnVjdCBTS19yYW0gKnJhbTsgIC8qIGR1YWwgcG9ydGVkIHJhbSBzdHJ1Y3R1cmUgKi8KKyAgICBzdHJ1Y3Qgcm1kICpybWRoZWFkOyAvKiBzdGFydCBvZiByZWNlaXZlIHJpbmcgZGVzY3JpcHRvcnMgKi8KKyAgICBzdHJ1Y3QgdG1kICp0bWRoZWFkOyAvKiBzdGFydCBvZiB0cmFuc21pdCByaW5nIGRlc2NyaXB0b3JzICovCisgICAgaW50ICAgICAgICBybWRudW07ICAgLyogYWN0dWFsIHVzZWQgcmluZyBkZXNjcmlwdG9yICovCisgICAgaW50ICAgICAgICB0bWRudW07ICAgLyogYWN0dWFsIHRyYW5zbWl0IGRlc2NyaXB0b3IgZm9yIHRyYW5zbWl0dGluZyBkYXRhICovCisgICAgaW50ICAgICAgICB0bWRsYXN0OyAgLyogbGFzdCBzZW50IGRlc2NyaXB0b3IgdXNlZCBmb3IgZXJyb3IgaGFuZGxpbmcsIGV0YyAqLworICAgIHZvaWQgICAgICAgKnJtZGJ1ZnNbUk1ETlVNXTsgLyogcG9pbnRlciB0byB0aGUgcmVjZWl2ZSBidWZmZXJzICovCisgICAgdm9pZCAgICAgICAqdG1kYnVmc1tUTUROVU1dOyAvKiBwb2ludGVyIHRvIHRoZSB0cmFuc21pdCBidWZmZXJzICovCisgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7IC8qIERldmljZSBkcml2ZXIgc3RhdGlzdGljcyAqLworfTsKKworLyogZ2xvYmFsIHZhcmlhYmxlIGRlY2xhcmF0aW9uICovCisKKy8qIElSUSBtYXAgdXNlZCB0byByZXNlcnZlIGEgSVJRIChzZWUgU0tfb3BlbigpKSAqLworCisvKiBzdGF0aWMgdmFyaWFibGVzICovCisKK3N0YXRpYyBTS19SQU0gKmJvYXJkOyAgLyogcG9pbnRlciB0byBvdXIgbWVtb3J5IG1hcHBlZCBib2FyZCBjb21wb25lbnRzICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKFNLX2xvY2spOworCisvKiBNYWNyb3MgKi8KKworDAorLyogRnVuY3Rpb24gUHJvdG90eXBlcyAqLworCisvKgorICogRGV2aWNlIERyaXZlciBmdW5jdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTZWUgZm9yIHNob3J0IGV4cGxhbmF0aW9uIG9mIGVhY2ggZnVuY3Rpb24gaXRzIGRlZmluaXRpb25zIGhlYWRlci4KKyAqLworCitzdGF0aWMgaW50ICAgU0tfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgaW9hZGRyKTsKKworc3RhdGljIHZvaWQgIFNLX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgU0tfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICBTS19zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBTS19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpOworc3RhdGljIHZvaWQgIFNLX3J4aW50cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICBTS190eGludHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgU0tfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqU0tfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCit1bnNpZ25lZCBpbnQgU0tfcm9tX2FkZHIodm9pZCk7CisKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoKKyAqIExBTkNFIEZ1bmN0aW9ucworICogLS0tLS0tLS0tLS0tLS0tCisgKi8KKworc3RhdGljIGludCBTS19sYW5jZV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IG1vZGUpOwordm9pZCAgIFNLX3Jlc2V0X2JvYXJkKHZvaWQpOwordm9pZCAgIFNLX3NldF9SQVAoaW50IHJlZ19udW1iZXIpOworaW50ICAgIFNLX3JlYWRfcmVnKGludCByZWdfbnVtYmVyKTsKK2ludCAgICBTS19ycmVhZF9yZWcodm9pZCk7Cit2b2lkICAgU0tfd3JpdGVfcmVnKGludCByZWdfbnVtYmVyLCBpbnQgdmFsdWUpOworCisvKiAKKyAqIERlYnVnZ2luZyBmdW5jdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCit2b2lkIFNLX3ByaW50X3BvcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICp0ZXh0KTsKK3ZvaWQgU0tfcHJpbnRfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKnRleHQpOwordm9pZCBTS19wcmludF9yYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwwKKy8qLQorICogRnVuY3Rpb24gICAgICAgOiBTS19pbml0CisgKiBBdXRob3IgICAgICAgICA6IFBhdHJpY2sgSi5ELiBXZWljaG1hbm4KKyAqIERhdGUgQ3JlYXRlZCAgIDogOTQvMDUvMjYKKyAqCisgKiBEZXNjcmlwdGlvbiAgICA6IENoZWNrIGZvciBhIFNLX0cxNiBuZXR3b3JrIGFkYXB0b3IgYW5kIGluaXRpYWxpemUgaXQuCisgKiAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgYnkgZGV2X2luaXQgd2hpY2ggaW5pdGlhbGl6ZXMKKyAqICAgICAgICAgICAgICAgICAgYWxsIE5ldHdvcmsgZGV2aWNlcy4KKyAqCisgKiBQYXJhbWV0ZXJzICAgICA6IEkgOiBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2IC0gc3RydWN0dXJlIHByZWNvbmZpZ3VyZWQgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIFNwYWNlLmMKKyAqIFJldHVybiBWYWx1ZSAgIDogMCA9IERyaXZlciBGb3VuZCBhbmQgaW5pdGlhbGl6ZWQgCisgKiBFcnJvcnMgICAgICAgICA6IEVOT0RFViAtIG5vIGRldmljZSBmb3VuZAorICogICAgICAgICAgICAgICAgICBFTlhJTyAgLSBub3QgcHJvYmVkCisgKiBHbG9iYWxzICAgICAgICA6IE5vbmUKKyAqIFVwZGF0ZSBIaXN0b3J5IDoKKyAqICAgICBZWS9NTS9ERCAgdWlkICBEZXNjcmlwdGlvbgorLSovCisKK3N0YXRpYyBpbnQgaW87CS8qIDAgPT0gcHJvYmUgKi8KKworLyogCisgKiBDaGVjayBmb3IgYSBuZXR3b3JrIGFkYXB0b3Igb2YgdGhpcyB0eXBlLCBhbmQgcmV0dXJuICcwJyBpZiBvbmUgZXhpc3RzLgorICogSWYgZGV2LT5iYXNlX2FkZHIgPT0gMCwgcHJvYmUgYWxsIGxpa2VseSBsb2NhdGlvbnMuCisgKiBJZiBkZXYtPmJhc2VfYWRkciA9PSAxLCBhbHdheXMgcmV0dXJuIGZhaWx1cmUuCisgKi8KKworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgU0tfaW5pdChpbnQgdW5pdCkKK3sKKwlpbnQgKnBvcnQsIHBvcnRzW10gPSBTS19JT19QT1JUUzsgIC8qIFNLX0cxNiBzdXBwb3J0ZWQgcG9ydHMgKi8KKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHByaXYpKTsKKwlpbnQgZXJyID0gLUVOT0RFVjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCQlpbyA9IGRldi0+YmFzZV9hZGRyOworCX0KKworCWlmICh2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCSAgICAgICAgUFJJTlRLKCgiJXM6ICVzIiwgU0tfTkFNRSwgcmNzaWQpKTsKKworCWlmIChpbyA+IDB4ZmYpIHsgICAgICAgIC8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBhZGRyZXNzICovCisJCWVyciA9IC1FQlVTWTsKKwkJLyogQ2hlY2sgaWYgb24gc3BlY2lmaWVkIGFkZHJlc3MgaXMgYSBTS19HMTYgKi8KKwkJaWYgKHJlcXVlc3RfcmVnaW9uKGlvLCBFVEhFUkNBUkRfVE9UQUxfU0laRSwgInNrX2cxNiIpKSB7CisJCQllcnIgPSBTS19wcm9iZShkZXYsIGlvKTsKKwkJCWlmICghZXJyKQorCQkJCWdvdG8gZ290X2l0OworCQkJcmVsZWFzZV9yZWdpb24oaW8sIEVUSEVSQ0FSRF9UT1RBTF9TSVpFKTsKKwkJfQorCX0gZWxzZSBpZiAoaW8gPiAwKSB7ICAgICAgIC8qIERvbid0IHByb2JlIGF0IGFsbCAqLworCQllcnIgPSAtRU5YSU87CisJfSBlbHNlIHsKKwkJLyogQXV0b3Byb2JlIGJhc2VfYWRkciAqLworCQlmb3IgKHBvcnQgPSAmcG9ydHNbMF07ICpwb3J0OyBwb3J0KyspIHsKKwkJCWlvID0gKnBvcnQ7CisKKwkJCS8qIENoZWNrIGlmIEkvTyBQb3J0IHJlZ2lvbiBpcyB1c2VkIGJ5IGFub3RoZXIgYm9hcmQgKi8KKwkJCWlmICghcmVxdWVzdF9yZWdpb24oaW8sIEVUSEVSQ0FSRF9UT1RBTF9TSVpFLCAic2tfZzE2IikpCisJCQkJY29udGludWU7ICAgICAgIC8qIFRyeSBuZXh0IFBvcnQgYWRkcmVzcyAqLworCisJCQkvKiBDaGVjayBpZiBhdCBpb2FkZHIgaXMgYSBTS19HMTYgKi8KKwkJCWlmIChTS19wcm9iZShkZXYsIGlvKSA9PSAwKQorCQkJCWdvdG8gZ290X2l0OworCisJCQlyZWxlYXNlX3JlZ2lvbihpbywgRVRIRVJDQVJEX1RPVEFMX1NJWkUpOworCQl9CisJfQorZXJyX291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7CisKK2dvdF9pdDoKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBFVEhFUkNBUkRfVE9UQUxfU0laRSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJcmV0dXJuIGRldjsKKworfSAvKiBFbmQgb2YgU0tfaW5pdCAqLworCisKK01PRFVMRV9BVVRIT1IoIlBhdHJpY2sgSi5ELiBXZWljaG1hbm4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2NobmVpZGVyICYgS29jaCBHMTYgRXRoZXJuZXQgRGV2aWNlIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1BBUk0oaW8sICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiMCB0byBwcm9iZSBjb21tb24gcG9ydHMgKHVuc2FmZSksIG9yIHRoZSBJL08gYmFzZSBvZiB0aGUgYm9hcmQiKTsKKworCisjaWZkZWYgTU9EVUxFCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqU0tfZGV2OworCitzdGF0aWMgaW50IF9faW5pdCBTS19pbml0X21vZHVsZSAodm9pZCkKK3sKKyAJU0tfZGV2ID0gU0tfaW5pdCgtMSk7CisgCXJldHVybiBJU19FUlIoU0tfZGV2KSA/IFBUUl9FUlIoU0tfZGV2KSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBTS19jbGVhbnVwX21vZHVsZSAodm9pZCkKK3sKKyAJdW5yZWdpc3Rlcl9uZXRkZXYoU0tfZGV2KTsKKyAJcmVsZWFzZV9yZWdpb24oU0tfZGV2LT5iYXNlX2FkZHIsIEVUSEVSQ0FSRF9UT1RBTF9TSVpFKTsKKyAJZnJlZV9uZXRkZXYoU0tfZGV2KTsKK30KKworbW9kdWxlX2luaXQoU0tfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoU0tfY2xlYW51cF9tb2R1bGUpOworI2VuZGlmCisKKwwKKy8qLQorICogRnVuY3Rpb24gICAgICAgOiBTS19wcm9iZQorICogQXV0aG9yICAgICAgICAgOiBQYXRyaWNrIEouRC4gV2VpY2htYW5uCisgKiBEYXRlIENyZWF0ZWQgICA6IDk0LzA1LzI2CisgKgorICogRGVzY3JpcHRpb24gICAgOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBTS19pbml0IGFuZCAKKyAqICAgICAgICAgICAgICAgICAgZG9lcyB0aGUgbWFpbiBwYXJ0IG9mIGluaXRpYWxpemF0aW9uLgorICogICAgICAgICAgICAgICAgICAKKyAqIFBhcmFtZXRlcnMgICAgIDogSSA6IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgLSBTS19HMTYgZGV2aWNlIHN0cnVjdHVyZQorICogICAgICAgICAgICAgICAgICBJIDogc2hvcnQgaW9hZGRyICAgICAgIC0gSS9PIFBvcnQgYWRkcmVzcyB3aGVyZSBQT1MgaXMuCisgKiBSZXR1cm4gVmFsdWUgICA6IDAgPSBJbml0aWFsaXphdGlvbiBkb25lICAgICAgICAgICAgIAorICogRXJyb3JzICAgICAgICAgOiBFTk9ERVYgLSBObyBTS19HMTYgZm91bmQKKyAqICAgICAgICAgICAgICAgICAgLTEgICAgIC0gQ29uZmlndXJhdGlvbiBwcm9ibGVtCisgKiBHbG9iYWxzICAgICAgICA6IGJvYXJkICAgICAgIC0gcG9pbnRlciB0byBTS19SQU0KKyAqIFVwZGF0ZSBIaXN0b3J5IDoKKyAqICAgICBZWS9NTS9ERCAgdWlkICBEZXNjcmlwdGlvbgorICogICAgIDk0LzA2LzMwICBwd2UgIFNLX0FERFIgbm93IGNoZWNrZWQgYW5kIGF0IHRoZSBjb3JyZWN0IHBsYWNlCistKi8KKworaW50IF9faW5pdCBTS19wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBpb2FkZHIpCit7CisgICAgaW50IGksajsgICAgICAgICAgICAgICAgLyogQ291bnRlcnMgKi8KKyAgICBpbnQgc2tfYWRkcl9mbGFnID0gMDsgICAvKiBTSyBBRERSIGNvcnJlY3Q/IDEgLSBubywgMCAtIHllcyAqLworICAgIHVuc2lnbmVkIGludCByb21fYWRkcjsgIC8qIHVzZWQgdG8gc3RvcmUgUkFNIGFkZHJlc3MgdXNlZCBmb3IgUE9TX0FERFIgKi8KKworICAgIHN0cnVjdCBwcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsJLyogU0tfRzE2IHByaXZhdGUgc3RydWN0dXJlICovCisKKyAgICBpZiAoaW5iKFNLX1BPUzApICE9IFNLX0lETE9XIHx8IGluYihTS19QT1MxKSAhPSBTS19JREhJR0gpCisJcmV0dXJuIC1FTk9ERVY7CisgICAgZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisKKyAgICBpZiAoU0tfQUREUiAmIDB4M2ZmZiB8fCBTS19BRERSIDwgMHhhMDAwMCkKKyAgICB7CisgICAgICAKKyAgICAgICBza19hZGRyX2ZsYWcgPSAxOworCisgICAgICAgLyogCisgICAgICAgICogTm93IGhlcmUgd2UgY291bGQgdXNlIGEgcm91dGluZSB3aGljaCBzZWFyY2hlcyBmb3IgYSBmcmVlCisgICAgICAgICogcGxhY2UgaW4gdGhlIHJhbSBhbmQgc2V0IFNLX0FERFIgaWYgZm91bmQuIFRPRE8uIAorICAgICAgICAqLworICAgIH0KKworICAgIGlmIChTS19CT09UX1JPTSkgICAgICAgICAgICAvKiBTaGFsbCB3ZSBrZWVwIEJvb3RfUk9NIG9uID8gKi8KKyAgICB7CisgICAgICAgIFBSSU5USygoIiMjICVzOiBTS19CT09UX1JPTSBpcyBzZXQuXG4iLCBTS19OQU1FKSk7CisKKyAgICAgICAgcm9tX2FkZHIgPSBTS19yb21fYWRkcigpOworCisJaWYgKHJvbV9hZGRyID09IDApICAgICAgLyogTm8gQm9vdF9ST00gZm91bmQgKi8KKwl7CisgICAgICAgICAgICBpZiAoc2tfYWRkcl9mbGFnKSAgIC8qIE5vIG9yIEludmFsaWQgU0tfQUREUiBpcyBkZWZpbmVkICovIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50aygiJXM6IFNLX0FERFIgJSMwOHggaXMgbm90IHZhbGlkLiBDaGVjayBjb25maWd1cmF0aW9uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBTS19BRERSKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKwkgICAgcm9tX2FkZHIgPSBTS19BRERSOyAvKiBhc3NpZ24gcHJlZGVmaW5lZCBhZGRyZXNzICovCisKKwkgICAgUFJJTlRLKCgiIyMgJXM6IE5PIEJvb3Ryb20gZm91bmQgXG4iLCBTS19OQU1FKSk7CisKKwkgICAgb3V0YihTS19ST01fUkFNX09GRiwgU0tfUE9TMik7IC8qIEJvb3RfUk9NICsgUkFNIG9mZiAqLworCSAgICBvdXRiKFBPU19BRERSLCBTS19QT1MzKTsgICAgICAgLyogU2V0IFJBTSBhZGRyZXNzICovCisJICAgIG91dGIoU0tfUkFNX09OLCBTS19QT1MyKTsgICAgICAvKiBlbmFibGUgUkFNICovCisJfQorCWVsc2UgaWYgKHJvbV9hZGRyID09IFNLX0FERFIpIAorCXsKKyAgICAgICAgICAgIHByaW50aygiJXM6IFJBTSArIFJPTSBhcmUgc2V0IHRvIHRoZSBzYW1lIGFkZHJlc3MgJSMwOHhcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgQ2hlY2sgY29uZmlndXJhdGlvbi4gTm93IHN3aXRjaGluZyBvZmYgQm9vdF9ST01cbiIsCisgICAgICAgICAgICAgICAgICAgU0tfTkFNRSwgcm9tX2FkZHIpOworCisJICAgIG91dGIoU0tfUk9NX1JBTV9PRkYsIFNLX1BPUzIpOyAvKiBCb290X1JPTSArIFJBTSBvZmYqLworCSAgICBvdXRiKFBPU19BRERSLCBTS19QT1MzKTsgICAgICAgLyogU2V0IFJBTSBhZGRyZXNzICovCisJICAgIG91dGIoU0tfUkFNX09OLCBTS19QT1MyKTsgICAgICAvKiBlbmFibGUgUkFNICovCisJfQorCWVsc2UKKwl7CisgICAgICAgICAgICBQUklOVEsoKCIjIyAlczogRm91bmQgUk9NIGF0ICUjMDh4XG4iLCBTS19OQU1FLCByb21fYWRkcikpOworCSAgICBQUklOVEsoKCIjIyAlczogS2VlcGluZyBCb290X1JPTSBvblxuIiwgU0tfTkFNRSkpOworCisgICAgICAgICAgICBpZiAoc2tfYWRkcl9mbGFnKSAgICAgICAvKiBObyBvciBJbnZhbGlkIFNLX0FERFIgaXMgZGVmaW5lZCAqLyAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoIiVzOiBTS19BRERSICUjMDh4IGlzIG5vdCB2YWxpZC4gQ2hlY2sgY29uZmlndXJhdGlvbi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgU0tfQUREUik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisJICAgIHJvbV9hZGRyID0gU0tfQUREUjsKKworCSAgICBvdXRiKFNLX1JPTV9SQU1fT0ZGLCBTS19QT1MyKTsgLyogQm9vdF9ST00gKyBSQU0gb2ZmICovIAorCSAgICBvdXRiKFBPU19BRERSLCBTS19QT1MzKTsgICAgICAgLyogU2V0IFJBTSBhZGRyZXNzICovCisJICAgIG91dGIoU0tfUk9NX1JBTV9PTiwgU0tfUE9TMik7ICAvKiBSQU0gb24sIEJPT1RfUk9NIG9uICovCisJfQorICAgIH0KKyAgICBlbHNlIC8qIERvbid0IGtlZXAgQm9vdF9ST00gKi8KKyAgICB7CisgICAgICAgIFBSSU5USygoIiMjICVzOiBTS19CT09UX1JPTSBpcyBub3Qgc2V0LlxuIiwgU0tfTkFNRSkpOworCisgICAgICAgIGlmIChza19hZGRyX2ZsYWcpICAgICAgICAgICAvKiBObyBvciBJbnZhbGlkIFNLX0FERFIgaXMgZGVmaW5lZCAqLyAKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCIlczogU0tfQUREUiAlIzA4eCBpcyBub3QgdmFsaWQuIENoZWNrIGNvbmZpZ3VyYXRpb24uXG4iLAorICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgU0tfQUREUik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworCXJvbV9hZGRyID0gU0tfcm9tX2FkZHIoKTsgICAgICAgICAgLyogVHJ5IHRvIGZpbmQgYSBCb290X1JPTSAqLworCisJLyogSUYgd2UgZmluZCBhIEJvb3RfUk9NIGRpc2FibGUgaXQgKi8KKworCW91dGIoU0tfUk9NX1JBTV9PRkYsIFNLX1BPUzIpOyAgICAgLyogQm9vdF9ST00gKyBSQU0gb2ZmICovICAKKworICAgICAgICAvKiBXZSBmb3VuZCBhIEJvb3RfUk9NIGFuZCBpdCdzIGdvbmUuIFNldCBSQU0gYWRkcmVzcyBvbgorICAgICAgICAgKiBCb290X1JPTSBhZGRyZXNzLiAKKyAgICAgICAgICovIAorCisJaWYgKHJvbV9hZGRyKSAKKwl7CisgICAgICAgICAgICBwcmludGsoIiVzOiBXZSBmb3VuZCBCb290X1JPTSBhdCAlIzA4eC4gTm93IHNldHRpbmcgUkFNIG9uIgorICAgICAgICAgICAgICAgICAgICJ0aGF0IGFkZHJlc3NcbiIsIFNLX05BTUUsIHJvbV9hZGRyKTsKKworCSAgICBvdXRiKFBPU19BRERSLCBTS19QT1MzKTsgICAgICAgLyogU2V0IFJBTSBvbiBCb290X1JPTSBhZGRyZXNzICovCisJfQorCWVsc2UgLyogV2UgZGlkIG5vdCBmaW5kIGEgQm9vdF9ST00sIHVzZSBwcmVkZWZpbmVkIFNLX0FERFIgZm9yIHJhbSAqLworCXsKKyAgICAgICAgICAgIGlmIChza19hZGRyX2ZsYWcpICAgICAgIC8qIE5vIG9yIEludmFsaWQgU0tfQUREUiBpcyBkZWZpbmVkICovIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50aygiJXM6IFNLX0FERFIgJSMwOHggaXMgbm90IHZhbGlkLiBDaGVjayBjb25maWd1cmF0aW9uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBTS19BRERSKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKwkgICAgcm9tX2FkZHIgPSBTS19BRERSOworCisJICAgIG91dGIoUE9TX0FERFIsIFNLX1BPUzMpOyAgICAgICAvKiBTZXQgUkFNIGFkZHJlc3MgKi8gCisJfQorCW91dGIoU0tfUkFNX09OLCBTS19QT1MyKTsgICAgICAgICAgLyogZW5hYmxlIFJBTSAqLworICAgIH0KKworI2lmZGVmIFNLX0RFQlVHCisgICAgU0tfcHJpbnRfcG9zKGRldiwgIlBPUyByZWdpc3RlcnMgYWZ0ZXIgUk9NLCBSQU0gY29uZmlnIik7CisjZW5kaWYKKworICAgIGJvYXJkID0gKFNLX1JBTSAqKSBpc2FfYnVzX3RvX3ZpcnQocm9tX2FkZHIpOworCisgICAgLyogUmVhZCBpbiBzdGF0aW9uIGFkZHJlc3MgKi8KKyAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IEVUSF9BTEVOOyBpKyssIGorPTIpCisgICAgeworCWRldi0+ZGV2X2FkZHJbaV0gPSByZWFkYihib2FyZC0+cm9tK2opOyAgICAgICAgICAKKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3IgbWFudWZhY3R1cmVyIGNvZGUgKi8KKyAgICBpZiAoIShkZXYtPmRldl9hZGRyWzBdID09IFNLX01BQzAgJiYKKwkgIGRldi0+ZGV2X2FkZHJbMV0gPT0gU0tfTUFDMSAmJgorCSAgZGV2LT5kZXZfYWRkclsyXSA9PSBTS19NQUMyKSApCisgICAgeworICAgICAgICBQUklOVEsoKCIjIyAlczogV2UgZGlkIG5vdCBmaW5kIFNLX0cxNiBhdCBSQU0gbG9jYXRpb24uXG4iLAorICAgICAgICAgICAgICAgIFNLX05BTUUpKTsgCisJcmV0dXJuIC1FTk9ERVY7ICAgICAgICAgICAgICAgICAgICAgLyogTk8gU0tfRzE2IGZvdW5kICovCisgICAgfQorCisgICAgcHJpbnRrKCIlczogJXMgZm91bmQgYXQgJSMzeCwgSFcgYWRkcjogJSMwNHg6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICBkZXYtPm5hbWUsCisJICAgICJTY2huZWlkZXIgJiBLb2NoIE5ldGNhcmQiLAorCSAgICAodW5zaWduZWQgaW50KSBkZXYtPmJhc2VfYWRkciwKKwkgICAgZGV2LT5kZXZfYWRkclswXSwKKwkgICAgZGV2LT5kZXZfYWRkclsxXSwKKwkgICAgZGV2LT5kZXZfYWRkclsyXSwKKwkgICAgZGV2LT5kZXZfYWRkclszXSwKKwkgICAgZGV2LT5kZXZfYWRkcls0XSwKKwkgICAgZGV2LT5kZXZfYWRkcls1XSk7CisKKyAgICBtZW1zZXQoKGNoYXIgKikgZGV2LT5wcml2LCAwLCBzaXplb2Yoc3RydWN0IHByaXYpKTsgLyogY2xlYXIgbWVtb3J5ICovCisKKyAgICAvKiBBc3NpZ24gb3VyIERldmljZSBEcml2ZXIgZnVuY3Rpb25zICovCisKKyAgICBkZXYtPm9wZW4gICAgICAgICAgICAgICAgICAgPSBTS19vcGVuOworICAgIGRldi0+c3RvcCAgICAgICAgICAgICAgICAgICA9IFNLX2Nsb3NlOworICAgIGRldi0+aGFyZF9zdGFydF94bWl0ICAgICAgICA9IFNLX3NlbmRfcGFja2V0OworICAgIGRldi0+Z2V0X3N0YXRzICAgICAgICAgICAgICA9IFNLX2dldF9zdGF0czsKKyAgICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCAgICAgPSBzZXRfbXVsdGljYXN0X2xpc3Q7CisgICAgZGV2LT50eF90aW1lb3V0CQk9IFNLX3RpbWVvdXQ7CisgICAgZGV2LT53YXRjaGRvZ190aW1lbwkJPSBIWi83OworCisKKyAgICBkZXYtPmZsYWdzICY9IH5JRkZfTVVMVElDQVNUOworCisgICAgLyogSW5pdGlhbGl6ZSBwcml2YXRlIHN0cnVjdHVyZSAqLworCisgICAgcC0+cmFtID0gKHN0cnVjdCBTS19yYW0gKikgcm9tX2FkZHI7IC8qIFNldCBkdWFsIHBvcnRlZCBSQU0gYWRkciAqLworICAgIHAtPnRtZGhlYWQgPSAmKHAtPnJhbSktPnRtZGVbMF07ICAgICAvKiBTZXQgVE1EIGhlYWQgKi8KKyAgICBwLT5ybWRoZWFkID0gJihwLT5yYW0pLT5ybWRlWzBdOyAgICAgLyogU2V0IFJNRCBoZWFkICovCisKKyAgICAvKiBJbml0aWFsaXplIGJ1ZmZlciBwb2ludGVycyAqLworCisgICAgZm9yIChpID0gMDsgaSA8IFRNRE5VTTsgaSsrKQorICAgIHsKKwlwLT50bWRidWZzW2ldID0gJihwLT5yYW0pLT50bWRidWZbaV07CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IFJNRE5VTTsgaSsrKQorICAgIHsKKwlwLT5ybWRidWZzW2ldID0gJihwLT5yYW0pLT5ybWRidWZbaV07IAorICAgIH0KKworI2lmZGVmIFNLX0RFQlVHCisgICAgU0tfcHJpbnRfcG9zKGRldiwgIkVuZCBvZiBTS19wcm9iZSIpOworICAgIFNLX3ByaW50X3JhbShkZXYpOworI2VuZGlmIAorICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXphdGlvbiBkb25lICovCit9IC8qIEVuZCBvZiBTS19wcm9iZSgpICovCisKKwwKKy8qLSAKKyAqIEZ1bmN0aW9uICAgICAgIDogU0tfb3BlbgorICogQXV0aG9yICAgICAgICAgOiBQYXRyaWNrIEouRC4gV2VpY2htYW5uCisgKiBEYXRlIENyZWF0ZWQgICA6IDk0LzA1LzI2CisgKgorICogRGVzY3JpcHRpb24gICAgOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBzb21ldGltZXMgYWZ0ZXIgYm9vdGluZyAKKyAqICAgICAgICAgICAgICAgICAgd2hlbiBpZmNvbmZpZyBwcm9ncmFtIGlzIHJ1bi4KKyAqCisgKiAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcmVxdWVzdHMgYW4gSVJRLCBzZXRzIHRoZSBjb3JyZWN0CisgKiAgICAgICAgICAgICAgICAgIElSUSBpbiB0aGUgY2FyZC4gVGhlbiBjYWxscyBTS19sYW5jZV9pbml0KCkgdG8gCisgKiAgICAgICAgICAgICAgICAgIGluaXQgYW5kIHN0YXJ0IHRoZSBMQU5DRSBjaGlwLiBUaGVuIGlmIGV2ZXJ5dGhpbmcgaXMgCisgKiAgICAgICAgICAgICAgICAgIG9rIHJldHVybnMgd2l0aCAwIChPSyksIHdoaWNoIG1lYW5zIFNLX0cxNiBpcyBub3cKKyAqICAgICAgICAgICAgICAgICAgb3BlbmVkIGFuZCBvcGVyYXRpb25hbC4KKyAqCisgKiAgICAgICAgICAgICAgICAgIChDYWxsZWQgYnkgZGV2X29wZW4oKSAvbmV0L2luZXQvZGV2LmMpCisgKgorICogUGFyYW1ldGVycyAgICAgOiBJIDogc3RydWN0IG5ldF9kZXZpY2UgKmRldiAtIFNLX0cxNiBkZXZpY2Ugc3RydWN0dXJlCisgKiBSZXR1cm4gVmFsdWUgICA6IDAgLSBEZXZpY2Ugb3BlbmVkCisgKiBFcnJvcnMgICAgICAgICA6IC1FQUdBSU4gLSBPcGVuIGZhaWxlZAorICogU2lkZSBFZmZlY3RzICAgOiBOb25lCisgKiBVcGRhdGUgSGlzdG9yeSA6CisgKiAgICAgWVkvTU0vREQgIHVpZCAgRGVzY3JpcHRpb24KKy0qLworCitzdGF0aWMgaW50IFNLX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgaW50IGlycXZhbCA9IDA7CisgICAgaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgICAgaW50IGlycXRhYltdID0gU0tfSVJRUzsgCisKKyAgICBzdHJ1Y3QgcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICBQUklOVEsoKCIjIyAlczogQXQgYmVnaW5uaW5nIG9mIFNLX29wZW4oKS4gQ1NSMDogJSMwNnhcbiIsIAorICAgICAgICAgICBTS19OQU1FLCBTS19yZWFkX3JlZyhDU1IwKSkpOworCisgICAgaWYgKGRldi0+aXJxID09IDApIC8qIEF1dG9pcnEgKi8KKyAgICB7CisJaSA9IDA7CisKKwkvKiAKKyAgICAgICAgICogQ2hlY2sgaWYgb25lIElSUSBvdXQgb2YgU0tfSVJRUyBpcyBmcmVlIGFuZCBpbnN0YWxsIAorCSAqIGludGVycnVwdCBoYW5kbGVyLgorCSAqIE1vc3QgZG9uZSBieSByZXF1ZXN0X2lycSgpLiAKKwkgKiBpcnF2YWw6IDAgICAgICAgLSBpbnRlcnJ1cHQgaGFuZGxlciBpbnN0YWxsZWQgZm9yIElSUSBpcnF0YWJbaV0KKwkgKiAgICAgICAgIC1FQlVTWSAgLSBpbnRlcnJ1cHQgYnVzeSAKKyAgICAgICAgICogICAgICAgICAtRUlOVkFMIC0gaXJxID4gMTUgb3IgaGFuZGxlciA9IE5VTEwKKwkgKi8KKworCWRvCisJeworCSAgaXJxdmFsID0gcmVxdWVzdF9pcnEoaXJxdGFiW2ldLCAmU0tfaW50ZXJydXB0LCAwLCAic2tfZzE2IiwgZGV2KTsKKwkgIGkrKzsKKwl9IHdoaWxlIChpcnF2YWwgJiYgaXJxdGFiW2ldKTsKKworCWlmIChpcnF2YWwpIC8qIFdlIHRyaWVkIGV2ZXJ5IHBvc3NpYmxlIElSUSBidXQgbm8gc3VjY2VzcyAqLworCXsKKwkgICAgcHJpbnRrKCIlczogdW5hYmxlIHRvIGdldCBhbiBJUlFcbiIsIGRldi0+bmFtZSk7CisJICAgIHJldHVybiAtRUFHQUlOOworCX0KKworCWRldi0+aXJxID0gaXJxdGFiWy0taV07IAorCQorCW91dGIoaTw8MiwgU0tfUE9TNCk7ICAgICAgICAgICAvKiBTZXQgQ2FyZCBvbiBwcm9iZWQgSVJRICovCisKKyAgICB9CisgICAgZWxzZSBpZiAoZGV2LT5pcnEgPT0gMikgLyogSVJRMiBpcyBhbHdheXMgSVJROSAqLworICAgIHsKKwlpZiAocmVxdWVzdF9pcnEoOSwgJlNLX2ludGVycnVwdCwgMCwgInNrX2cxNiIsIGRldikpCisJeworCSAgICBwcmludGsoIiVzOiB1bmFibGUgdG8gZ2V0IElSUSA5XG4iLCBkZXYtPm5hbWUpOworCSAgICByZXR1cm4gLUVBR0FJTjsKKwl9IAorCWRldi0+aXJxID0gOTsKKwkKKyAgICAgICAgLyogCisgICAgICAgICAqIE5vdyB3ZSBzZXQgY2FyZCBvbiBJUlEyLgorICAgICAgICAgKiBUaGlzIGNhbiBiZSBjb25mdXNpbmcsIGJ1dCByZW1lbWJlciB0aGF0IElSUTIgb24gdGhlIG5ldHdvcmsKKyAgICAgICAgICogY2FyZCBpcyBpbiByZWFsaXR5IElSUTkKKyAgICAgICAgICovCisJb3V0YigweDA4LCBTS19QT1M0KTsgICAgICAgICAgIC8qIHNldCBjYXJkIHRvIElSUTIgKi8KKworICAgIH0KKyAgICBlbHNlICAvKiBDaGVjayBJUlEgYXMgZGVmaW5lZCBpbiBTcGFjZS5jICovCisgICAgeworCWludCBpID0gMDsKKworCS8qIGNoZWNrIGlmIElSUSBmcmVlIGFuZCB2YWxpZC4gVGhlbiBpbnN0YWxsIEludGVycnVwdCBoYW5kbGVyICovCisKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICZTS19pbnRlcnJ1cHQsIDAsICJza19nMTYiLCBkZXYpKQorCXsKKwkgICAgcHJpbnRrKCIlczogdW5hYmxlIHRvIGdldCBzZWxlY3RlZCBJUlFcbiIsIGRldi0+bmFtZSk7CisJICAgIHJldHVybiAtRUFHQUlOOworCX0KKworCXN3aXRjaChkZXYtPmlycSkKKwl7CisJICAgIGNhc2UgMzogaSA9IDA7CisJCSAgICBicmVhazsKKwkgICAgY2FzZSA1OiBpID0gMTsKKwkJICAgIGJyZWFrOworCSAgICBjYXNlIDI6IGkgPSAyOworCQkgICAgYnJlYWs7CisJICAgIGNhc2UgMTE6aSA9IDM7CisJCSAgICBicmVhazsKKwkgICAgZGVmYXVsdDogCisJCXByaW50aygiJXM6IFByZXNlbGVjdGVkIElSUSAlZCBpcyBpbnZhbGlkIGZvciAlcyBib2FyZHMiLAorCQkgICAgICAgZGV2LT5uYW1lLAorCQkgICAgICAgZGV2LT5pcnEsCisgICAgICAgICAgICAgICAgICAgICAgIFNLX05BTUUpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9ICAgICAgCisgIAorCW91dGIoaTw8MiwgU0tfUE9TNCk7ICAgICAgICAgICAvKiBTZXQgSVJRIG9uIGNhcmQgKi8KKyAgICB9CisKKyAgICBwcmludGsoIiVzOiBTY2huZWlkZXIgJiBLb2NoIEcxNiBhdCAlIzN4LCBJUlEgJWQsIHNoYXJlZCBtZW0gYXQgJSMwOHhcbiIsCisJICAgIGRldi0+bmFtZSwgKHVuc2lnbmVkIGludClkZXYtPmJhc2VfYWRkciwgCisJICAgIChpbnQpIGRldi0+aXJxLCAodW5zaWduZWQgaW50KSBwLT5yYW0pOworCisgICAgaWYgKCEoaSA9IFNLX2xhbmNlX2luaXQoZGV2LCAwKSkpICAvKiBMQU5DRSBpbml0IE9LPyAqLworICAgIHsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisjaWZkZWYgU0tfREVCVUcKKworICAgICAgICAvKiAKKyAgICAgICAgICogVGhpcyBkZWJ1ZyBibG9jayB0cmllcyB0byBzdG9wIExBTkNFLAorICAgICAgICAgKiByZWluaXQgTEFOQ0Ugd2l0aCB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIgZGlzYWJsZWQsCisgICAgICAgICAqIHRoZW4gc3RvcCBhZ2FpbiBhbmQgcmVpbml0IHdpdGggTk9STUFMX01PREUKKyAgICAgICAgICovCisKKyAgICAgICAgcHJpbnRrKCIjIyAlczogQWZ0ZXIgbGFuY2UgaW5pdC4gQ1NSMDogJSMwNnhcbiIsIAorICAgICAgICAgICAgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpOworICAgICAgICBTS193cml0ZV9yZWcoQ1NSMCwgQ1NSMF9TVE9QKTsKKyAgICAgICAgcHJpbnRrKCIjIyAlczogTEFOQ0Ugc3RvcHBlZC4gQ1NSMDogJSMwNnhcbiIsIAorICAgICAgICAgICAgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpOworICAgICAgICBTS19sYW5jZV9pbml0KGRldiwgTU9ERV9EVFggfCBNT0RFX0RSWCk7CisgICAgICAgIHByaW50aygiIyMgJXM6IFJlaW5pdCB3aXRoIERUWCArIERSWCBvZmYuIENTUjA6ICUjMDZ4XG4iLCAKKyAgICAgICAgICAgICAgIFNLX05BTUUsIFNLX3JlYWRfcmVnKENTUjApKTsKKyAgICAgICAgU0tfd3JpdGVfcmVnKENTUjAsIENTUjBfU1RPUCk7CisgICAgICAgIHByaW50aygiIyMgJXM6IExBTkNFIHN0b3BwZWQuIENTUjA6ICUjMDZ4XG4iLCAKKyAgICAgICAgICAgICAgIFNLX05BTUUsIFNLX3JlYWRfcmVnKENTUjApKTsKKyAgICAgICAgU0tfbGFuY2VfaW5pdChkZXYsIE1PREVfTk9STUFMKTsKKyAgICAgICAgcHJpbnRrKCIjIyAlczogTEFOQ0UgYmFjayB0byBub3JtYWwgbW9kZS4gQ1NSMDogJSMwNnhcbiIsIAorICAgICAgICAgICAgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpOworICAgICAgICBTS19wcmludF9wb3MoZGV2LCAiUE9TIHJlZ3MgYmVmb3JlIHJldHVybmluZyBPSyIpOworCisjZW5kaWYgLyogU0tfREVCVUcgKi8KKyAgICAgICAKKwlyZXR1cm4gMDsgICAgICAgICAgICAgIC8qIFNLX29wZW4oKSBpcyBzdWNjZXNzZnVsICovCisgICAgfQorICAgIGVsc2UgLyogTEFOQ0UgaW5pdCBmYWlsZWQgKi8KKyAgICB7CisKKwlQUklOVEsoKCIjIyAlczogTEFOQ0UgaW5pdCBmYWlsZWQ6IENTUjA6ICUjMDZ4XG4iLCAKKyAgICAgICAgICAgICAgIFNLX05BTUUsIFNLX3JlYWRfcmVnKENTUjApKSk7CisKKwlyZXR1cm4gLUVBR0FJTjsKKyAgICB9CisKK30gLyogRW5kIG9mIFNLX29wZW4oKSAqLworCisMCisvKi0KKyAqIEZ1bmN0aW9uICAgICAgIDogU0tfbGFuY2VfaW5pdAorICogQXV0aG9yICAgICAgICAgOiBQYXRyaWNrIEouRC4gV2VpY2htYW5uCisgKiBEYXRlIENyZWF0ZWQgICA6IDk0LzA1LzI2CisgKgorICogRGVzY3JpcHRpb24gICAgOiBSZXNldCBMQU5DRSBjaGlwLCBmaWxsIFJNRCwgVE1EIHN0cnVjdHVyZXMgd2l0aAorICogICAgICAgICAgICAgICAgICBzdGFydCB2YWx1ZXMgYW5kIFN0YXJ0IExBTkNFLgorICoKKyAqIFBhcmFtZXRlcnMgICAgIDogSSA6IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgLSBTS19HMTYgZGV2aWNlIHN0cnVjdHVyZQorICogICAgICAgICAgICAgICAgICBJIDogaW50IG1vZGUgLSBwdXQgTEFOQ0UgaW50byAibW9kZSIgc2VlIGRhdGEtc2hlZXQgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmUgaW5mby4KKyAqIFJldHVybiBWYWx1ZSAgIDogMCAgLSBJbml0IGRvbmUKKyAqIEVycm9ycyAgICAgICAgIDogLTEgLSBJbml0IGZhaWxlZAorICogVXBkYXRlIEhpc3RvcnkgOgorICogICAgIFlZL01NL0REICB1aWQgIERlc2NyaXB0aW9uCistKi8KKworc3RhdGljIGludCBTS19sYW5jZV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IG1vZGUpCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBzdHJ1Y3QgcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CisgICAgc3RydWN0IHRtZCAgKnRtZHA7CisgICAgc3RydWN0IHJtZCAgKnJtZHA7CisKKyAgICBQUklOVEsoKCIjIyAlczogQXQgYmVnaW5uaW5nIG9mIExBTkNFIGluaXQuIENTUjA6ICUjMDZ4XG4iLCAKKyAgICAgICAgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpKTsKKworICAgIC8qIFJlc2V0IExBTkNFICovCisgICAgU0tfcmVzZXRfYm9hcmQoKTsKKworICAgIC8qIEluaXRpYWxpemUgVE1EJ3Mgd2l0aCBzdGFydCB2YWx1ZXMgKi8KKyAgICBwLT50bWRudW0gPSAwOyAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBkZXNjcmlwdG9yIGZvciB0cmFuc21pdHRpbmcgKi8gCisgICAgcC0+dG1kbGFzdCA9IDA7ICAgICAgICAgICAgICAgICAgLyogRmlyc3QgZGVzY3JpcHRvciBmb3IgcmVhZGluZyBzdGF0cyAqLworCisgICAgZm9yIChpID0gMDsgaSA8IFRNRE5VTTsgaSsrKSAgICAgLyogSW5pdCBhbGwgVE1EJ3MgKi8KKyAgICB7CisJdG1kcCA9IHAtPnRtZGhlYWQgKyBpOyAKKyAgIAorCXdyaXRlbCgodW5zaWduZWQgbG9uZykgcC0+dG1kYnVmc1tpXSwgdG1kcC0+dS5idWZmZXIpOyAvKiBhc3NpZ24gYnVmZmVyICovCisJCisJLyogTWFyayBUTUQgYXMgc3RhcnQgYW5kIGVuZCBvZiBwYWNrZXQgKi8KKwl3cml0ZWIoVFhfU1RQIHwgVFhfRU5QLCAmdG1kcC0+dS5zLnN0YXR1cyk7CisgICAgfQorCisKKyAgICAvKiBJbml0aWFsaXplIFJNRCdzIHdpdGggc3RhcnQgdmFsdWVzICovCisKKyAgICBwLT5ybWRudW0gPSAwOyAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBSTUQgd2hpY2ggd2lsbCBiZSB1c2VkICovCisgCisgICAgZm9yIChpID0gMDsgaSA8IFJNRE5VTTsgaSsrKSAgICAgLyogSW5pdCBhbGwgUk1EJ3MgKi8KKyAgICB7CisJcm1kcCA9IHAtPnJtZGhlYWQgKyBpOworCisJCisJd3JpdGVsKCh1bnNpZ25lZCBsb25nKSBwLT5ybWRidWZzW2ldLCBybWRwLT51LmJ1ZmZlcik7IC8qIGFzc2lnbiBidWZmZXIgKi8KKwkKKwkvKiAKKyAgICAgICAgICogTEFOQ0UgbXVzdCBiZSBvd25lciBhdCBiZWdpbm5pbmcgc28gdGhhdCBoZSBjYW4gZmlsbCBpbiAKKwkgKiByZWNlaXZpbmcgcGFja2V0cywgc2V0IHN0YXR1cyBhbmQgcmVsZWFzZSBSTUQgCisJICovCisKKwl3cml0ZWIoUlhfT1dOLCAmcm1kcC0+dS5zLnN0YXR1cyk7CisKKwl3cml0ZXcoLVBLVF9CVUZfU1osICZybWRwLT5ibGVuKTsgLyogQnVmZmVyIFNpemUgKHR3bydzIGNvbXBsZW1lbnQpICovCisKKwl3cml0ZWIoMCwgJnJtZHAtPm1sZW4pOyAgICAgICAgICAgLyogaW5pdCBtZXNzYWdlIGxlbmd0aCAqLyAgICAgICAKKwkKKyAgICB9CisKKyAgICAvKiBGaWxsIExBTkNFIEluaXRpYWxpemUgQmxvY2sgKi8KKworICAgIHdyaXRldyhtb2RlLCAoJigocC0+cmFtKS0+aWIubW9kZSkpKTsgLyogU2V0IG9wZXJhdGlvbiBtb2RlICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykgICAvKiBTZXQgcGh5c2ljYWwgYWRkcmVzcyAqLworICAgIHsKKwl3cml0ZWIoZGV2LT5kZXZfYWRkcltpXSwgKCYoKHAtPnJhbSktPmliLnBhZGRyW2ldKSkpOyAKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSAgICAgICAgICAvKiBTZXQgbXVsdGljYXN0LCBsb2dpY2FsIGFkZHJlc3MgKi8KKyAgICB7CisJd3JpdGViKDAsICgmKChwLT5yYW0pLT5pYi5sYWRkcltpXSkpKTsgLyogV2UgZG8gbm90IHVzZSBsb2dpY2FsIGFkZHJlc3NpbmcgKi8KKyAgICB9IAorCisgICAgLyogU2V0IHJpbmcgZGVzY3JpcHRvciBwb2ludGVycyBhbmQgc2V0IG51bWJlciBvZiBkZXNjcmlwdG9ycyAqLworCisgICAgd3JpdGVsKChpbnQpcC0+cm1kaGVhZCB8IFJNRE5VTU1BU0ssICgmKChwLT5yYW0pLT5pYi5yZHJwKSkpOworICAgIHdyaXRlbCgoaW50KXAtPnRtZGhlYWQgfCBUTUROVU1NQVNLLCAoJigocC0+cmFtKS0+aWIudGRycCkpKTsKKworICAgIC8qIFByZXBhcmUgTEFOQ0UgQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVycyAqLworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJlNLX2xvY2ssIGZsYWdzKTsKKworICAgIFNLX3dyaXRlX3JlZyhDU1IzLCBDU1IzX0FDT04pOyAgIC8qIEFsZSBDb250cm9sICEhIVRISVMgTVVTVCBCRSBTRVQhISEhICovCisgCisgICAgLyogCisgICAgICogTEFOQ0UgYWRkcmVzc2VzIHRoZSBSQU0gZnJvbSAweDAwMDAgdG8gMHgzZmJmIGFuZCBoYXMgbm8gYWNjZXNzIHRvCisgICAgICogUEMgTWVtb3J5IGxvY2F0aW9ucy4KKyAgICAgKgorICAgICAqIEluIHN0cnVjdHVyZSBTS19yYW0gaXMgZGVmaW5lZCB0aGF0IHRoZSBmaXJzdCB0aGluZyBpbiByYW0KKyAgICAgKiBpcyB0aGUgaW5pdGlhbGl6YXRpb24gYmxvY2suIFNvIGhpcyBhZGRyZXNzIGlzIGZvciBMQU5DRSBhbHdheXMKKyAgICAgKiAweDAwMDAKKyAgICAgKgorICAgICAqIENTUjEgY29udGFpbnMgbG93IG9yZGVyIGJpdHMgMTU6MCBvZiBpbml0aWFsaXphdGlvbiBibG9jayBhZGRyZXNzCisgICAgICogQ1NSMiBpcyBidWlsdCBvZjogCisgICAgICogICAgNzowICBIaWdoIG9yZGVyIGJpdHMgMjM6MTYgb2YgaW5pdGlhbGl6YXRpb24gYmxvY2sgYWRkcmVzcworICAgICAqICAgMTU6OCAgcmVzZXJ2ZWQsIG11c3QgYmUgMAorICAgICAqLworICAgIAorICAgIC8qIFNldCBpbml0aWFsaXphdGlvbiBibG9jayBhZGRyZXNzIChtdXN0IGJlIG9uIHdvcmQgYm91bmRhcnkpICovCisgICAgU0tfd3JpdGVfcmVnKENTUjEsIDApOyAgICAgICAgICAvKiBTZXQgbG93IG9yZGVyIGJpdHMgMTU6MCAqLworICAgIFNLX3dyaXRlX3JlZyhDU1IyLCAwKTsgICAgICAgICAgLyogU2V0IGhpZ2ggb3JkZXIgYml0cyAyMzoxNiAqLyAKKyAgICAKKworICAgIFBSSU5USygoIiMjICVzOiBBZnRlciBzZXR0aW5nIENTUjEtMy4gQ1NSMDogJSMwNnhcbiIsIAorICAgICAgICAgICBTS19OQU1FLCBTS19yZWFkX3JlZyhDU1IwKSkpOworCisgICAgLyogSW5pdGlhbGl6ZSBMQU5DRSAqLworCisgICAgLyogCisgICAgICogSU5JVCA9IEluaXRpYWxpemUsIHdoZW4gc2V0LCBjYXVzZXMgdGhlIExBTkNFIHRvIGJlZ2luIHRoZQorICAgICAqIGluaXRpYWxpemF0aW9uIHByb2NlZHVyZSBhbmQgYWNjZXNzIHRoZSBJbml0IEJsb2NrLgorICAgICAqLworCisgICAgU0tfd3JpdGVfcmVnKENTUjAsIENTUjBfSU5JVCk7IAorCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmU0tfbG9jaywgZmxhZ3MpOworCisgICAgLyogV2FpdCB1bnRpbCBMQU5DRSBmaW5pc2hlZCBpbml0aWFsaXphdGlvbiAqLworICAgIAorICAgIFNLX3NldF9SQVAoQ1NSMCk7ICAgICAgICAgICAgICAvKiBSZWdpc3RlciBBZGRyZXNzIFBvaW50ZXIgdG8gQ1NSMCAqLworCisgICAgZm9yIChpID0gMDsgKGkgPCAxMDApICYmICEoU0tfcnJlYWRfcmVnKCkgJiBDU1IwX0lET04pOyBpKyspIAorCTsgLyogV2FpdCB1bnRpbCBpbml0IGRvbmUgb3IgZ28gYWhlYWQgaWYgcHJvYmxlbXMgKGk+PTEwMCkgKi8KKworICAgIGlmIChpID49IDEwMCkgLyogU29tZXRoaW5nIGlzIHdyb25nICEgKi8KKyAgICB7CisJcHJpbnRrKCIlczogY2FuJ3QgaW5pdCBhbTc5OTAsIHN0YXR1czogJTA0eCAiCisJICAgICAgICJpbml0X2Jsb2NrOiAlIzA4eFxuIiwgCisJCWRldi0+bmFtZSwgKGludCkgU0tfcmVhZF9yZWcoQ1NSMCksIAorCQkodW5zaWduZWQgaW50KSAmKHAtPnJhbSktPmliKTsKKworI2lmZGVmIFNLX0RFQlVHCisJU0tfcHJpbnRfcG9zKGRldiwgIkxBTkNFIElOSVQgZmFpbGVkIik7CisJU0tfcHJpbnRfZGV2KGRldiwiRGV2aWNlIFN0cnVjdHVyZToiKTsKKyNlbmRpZgorCisJcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgLyogTEFOQ0UgaW5pdCBmYWlsZWQgKi8KKyAgICB9CisKKyAgICBQUklOVEsoKCIjIyAlczogaW5pdCBkb25lIGFmdGVyICVkIHRpY2tzXG4iLCBTS19OQU1FLCBpKSk7CisKKyAgICAvKiBDbGVhciBJbml0aWFsaXplIGRvbmUsIGVuYWJsZSBJbnRlcnJ1cHRzLCBzdGFydCBMQU5DRSAqLworCisgICAgU0tfd3JpdGVfcmVnKENTUjAsIENTUjBfSURPTiB8IENTUjBfSU5FQSB8IENTUjBfU1RSVCk7CisKKyAgICBQUklOVEsoKCIjIyAlczogTEFOQ0Ugc3RhcnRlZC4gQ1NSMDogJSMwNnhcbiIsIFNLX05BTUUsIAorICAgICAgICAgICAgU0tfcmVhZF9yZWcoQ1NSMCkpKTsKKworICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAvKiBMQU5DRSBpcyB1cCBhbmQgcnVubmluZyAqLworCit9IC8qIEVuZCBvZiBTS19sYW5jZV9pbml0KCkgKi8KKworCisMCisvKi0KKyAqIEZ1bmN0aW9uICAgICAgIDogU0tfc2VuZF9wYWNrZXQKKyAqIEF1dGhvciAgICAgICAgIDogUGF0cmljayBKLkQuIFdlaWNobWFubgorICogRGF0ZSBDcmVhdGVkICAgOiA5NC8wNS8yNworICoKKyAqIERlc2NyaXB0aW9uICAgIDogV3JpdGVzIGFuIHNvY2tldCBidWZmZXIgaW50byBhIHRyYW5zbWl0IGRlc2NyaXB0b3IKKyAqICAgICAgICAgICAgICAgICAgYW5kIHN0YXJ0cyB0cmFuc21pc3Npb24uCisgKgorICogUGFyYW1ldGVycyAgICAgOiBJIDogc3RydWN0IHNrX2J1ZmYgKnNrYiAtIHBhY2tldCB0byB0cmFuc2ZlcgorICogICAgICAgICAgICAgICAgICBJIDogc3RydWN0IG5ldF9kZXZpY2UgKmRldiAgLSBTS19HMTYgZGV2aWNlIHN0cnVjdHVyZQorICogUmV0dXJuIFZhbHVlICAgOiAwIC0gT0sKKyAqICAgICAgICAgICAgICAgICAgMSAtIENvdWxkIG5vdCB0cmFuc21pdCAoZGV2X3F1ZXVlX3htaXQgd2lsbCBxdWV1ZSBpdCkKKyAqICAgICAgICAgICAgICAgICAgICAgIGFuZCB0cnkgdG8gc2VudCBpdCBsYXRlcgorICogR2xvYmFscyAgICAgICAgOiBOb25lCisgKiBTaWRlIEVmZmVjdHMgICA6IE5vbmUKKyAqIFVwZGF0ZSBIaXN0b3J5IDoKKyAqICAgICBZWS9NTS9ERCAgdWlkICBEZXNjcmlwdGlvbgorLSovCisKK3N0YXRpYyB2b2lkIFNLX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogeG1pdHRlciB0aW1lZCBvdXQsIHRyeSB0byByZXN0YXJ0IVxuIiwgZGV2LT5uYW1lKTsKKwlTS19sYW5jZV9pbml0KGRldiwgTU9ERV9OT1JNQUwpOyAvKiBSZWluaXQgTEFOQ0UgKi8KKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CQkgLyogQ2xlYXIgVHJhbnNtaXR0ZXIgZmxhZyAqLworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOyAgICAgIC8qIE1hcmsgU3RhcnQgb2YgdHJhbnNtaXNzaW9uICovCit9CisKK3N0YXRpYyBpbnQgU0tfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CisgICAgc3RydWN0IHRtZCAqdG1kcDsKKyAgICBzdGF0aWMgY2hhciBwYWRbNjRdOworCisgICAgUFJJTlRLMigoIiMjICVzOiBTS19zZW5kX3BhY2tldCgpIGNhbGxlZCwgQ1NSMCAlIzA0eC5cbiIsIAorCSAgICBTS19OQU1FLCBTS19yZWFkX3JlZyhDU1IwKSkpOworCisKKyAgICAvKiAKKyAgICAgKiBCbG9jayBhIHRpbWVyLWJhc2VkIHRyYW5zbWl0IGZyb20gb3ZlcmxhcHBpbmcuIAorICAgICAqIFRoaXMgbWVhbnMgY2hlY2sgaWYgd2UgYXJlIGFscmVhZHkgaW4uIAorICAgICAqLworCisgICAgbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworICAgIHsKKworCS8qIEV2YWx1YXRlIFBhY2tldCBsZW5ndGggKi8KKwlzaG9ydCBsZW4gPSBFVEhfWkxFTiA8IHNrYi0+bGVuID8gc2tiLT5sZW4gOiBFVEhfWkxFTjsgCisgICAgICAgCisJdG1kcCA9IHAtPnRtZGhlYWQgKyBwLT50bWRudW07IC8qIFdoaWNoIGRlc2NyaXB0b3IgZm9yIHRyYW5zbWl0dGluZyAqLworCisJLyogRmlsbCBpbiBUcmFuc21pdCBNZXNzYWdlIERlc2NyaXB0b3IgKi8KKworCS8qIENvcHkgZGF0YSBpbnRvIGR1YWwgcG9ydGVkIHJhbSAqLworCisJbWVtY3B5X3RvaW8oKHRtZHAtPnUuYnVmZmVyICYgMHgwMGZmZmZmZiksIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCWlmIChsZW4gIT0gc2tiLT5sZW4pCisJCW1lbWNweV90b2lvKCh0bWRwLT51LmJ1ZmZlciAmIDB4MDBmZmZmZmYpICsgc2tiLT5sZW4sIHBhZCwgbGVuLXNrYi0+bGVuKTsKKworCXdyaXRldygtbGVuLCAmdG1kcC0+Ymxlbik7ICAgICAgICAgICAgLyogc2V0IGxlbmd0aCB0byB0cmFuc21pdCAqLworCisJLyogCisJICogUGFja2V0IHN0YXJ0IGFuZCBlbmQgaXMgYWx3YXlzIHNldCBiZWNhdXNlIHdlIHVzZSB0aGUgbWF4aW11bQorCSAqIHBhY2tldCBsZW5ndGggYXMgYnVmZmVyIGxlbmd0aC4KKwkgKiBSZWxpbnF1aXNoIG93bmVyc2hpcCB0byBMQU5DRQorCSAqLworCisJd3JpdGViKFRYX09XTiB8IFRYX1NUUCB8IFRYX0VOUCwgJnRtZHAtPnUucy5zdGF0dXMpOworCQorCS8qIFN0YXJ0IERlbWFuZCBUcmFuc21pc3Npb24gKi8KKwlTS193cml0ZV9yZWcoQ1NSMCwgQ1NSMF9URE1EIHwgQ1NSMF9JTkVBKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOyAgIC8qIE1hcmsgc3RhcnQgb2YgdHJhbnNtaXNzaW9uICovCisKKwkvKiBTZXQgcG9pbnRlciB0byBuZXh0IHRyYW5zbWl0IGJ1ZmZlciAqLworCXAtPnRtZG51bSsrOyAKKwlwLT50bWRudW0gJj0gVE1ETlVNLTE7IAorCisJLyogRG8gd2Ugb3duIHRoZSBuZXh0IHRyYW5zbWl0IGJ1ZmZlciA/ICovCisJaWYgKCEgKHJlYWRiKCYoKHAtPnRtZGhlYWQgKyBwLT50bWRudW0pLT51LnMuc3RhdHVzKSkgJiBUWF9PV04pICkKKwl7CisJICAgLyogCisJICAgICogV2Ugb3duIG5leHQgYnVmZmVyIGFuZCBhcmUgcmVhZHkgdG8gdHJhbnNtaXQsIHNvCisJICAgICogY2xlYXIgYnVzeSBmbGFnCisJICAgICovCisJICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwl9CisKKwlwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworICAgIH0KKworICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKKyAgICByZXR1cm4gMDsgIAorfSAvKiBFbmQgb2YgU0tfc2VuZF9wYWNrZXQgKi8KKworDAorLyotCisgKiBGdW5jdGlvbiAgICAgICA6IFNLX2ludGVycnVwdAorICogQXV0aG9yICAgICAgICAgOiBQYXRyaWNrIEouRC4gV2VpY2htYW5uCisgKiBEYXRlIENyZWF0ZWQgICA6IDk0LzA1LzI3CisgKgorICogRGVzY3JpcHRpb24gICAgOiBTS19HMTYgaW50ZXJydXB0IGhhbmRsZXIgd2hpY2ggY2hlY2tzIGZvciBMQU5DRQorICogICAgICAgICAgICAgICAgICBFcnJvcnMsIGhhbmRsZXMgdHJhbnNtaXQgYW5kIHJlY2VpdmUgaW50ZXJydXB0cworICoKKyAqIFBhcmFtZXRlcnMgICAgIDogSSA6IGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzIC0KKyAqIFJldHVybiBWYWx1ZSAgIDogTm9uZQorICogRXJyb3JzICAgICAgICAgOiBOb25lCisgKiBHbG9iYWxzICAgICAgICA6IE5vbmUKKyAqIFNpZGUgRWZmZWN0cyAgIDogTm9uZQorICogVXBkYXRlIEhpc3RvcnkgOgorICogICAgIFlZL01NL0REICB1aWQgIERlc2NyaXB0aW9uCistKi8KKworc3RhdGljIGlycXJldHVybl90IFNLX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKyAgICBpbnQgY3NyMDsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworICAgIHN0cnVjdCBwcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCisgICAgUFJJTlRLMigoIiMjICVzOiBTS19pbnRlcnJ1cHQoKS4gc3RhdHVzOiAlIzA2eFxuIiwgCisgICAgICAgICAgICBTS19OQU1FLCBTS19yZWFkX3JlZyhDU1IwKSkpOworCisgICAgaWYgKGRldiA9PSBOVUxMKQorICAgIHsKKwlwcmludGsoIlNLX2ludGVycnVwdCgpOiBJUlEgJWQgZm9yIHVua25vd24gZGV2aWNlLlxuIiwgaXJxKTsKKyAgICB9CisgICAgCisgICAgc3Bpbl9sb2NrICgmU0tfbG9jayk7CisKKyAgICBjc3IwID0gU0tfcmVhZF9yZWcoQ1NSMCk7ICAgICAgLyogc3RvcmUgcmVnaXN0ZXIgZm9yIGNoZWNraW5nICovCisKKyAgICAvKiAKKyAgICAgKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMsIGRpc2FibGUgICAgICAKKyAgICAgKiBJbnRlcnJ1cHRzIChJTkVBID0gMCkgCisgICAgICovCisKKyAgICBTS193cml0ZV9yZWcoQ1NSMCwgY3NyMCAmIENTUjBfQ0xSQUxMKTsgCisKKyAgICBpZiAoY3NyMCAmIENTUjBfRVJSKSAvKiBMQU5DRSBFcnJvciAqLworICAgIHsKKwlwcmludGsoIiVzOiBlcnJvcjogJTA0eFxuIiwgZGV2LT5uYW1lLCBjc3IwKTsKKyAgICAgIAorICAgICAgICBpZiAoY3NyMCAmIENTUjBfTUlTUykgICAgICAvKiBObyBwbGFjZSB0byBzdG9yZSBwYWNrZXQgPyAqLworICAgICAgICB7IAorICAgICAgICAgICAgcC0+c3RhdHMucnhfZHJvcHBlZCsrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNzcjAgJiBDU1IwX1JJTlQpICAgICAgICAgIC8qIFJlY2VpdmUgSW50ZXJydXB0IChwYWNrZXQgYXJyaXZlZCkgKi8gCisgICAgeworCVNLX3J4aW50cihkZXYpOyAKKyAgICB9CisKKyAgICBpZiAoY3NyMCAmIENTUjBfVElOVCkgICAgICAgICAgLyogVHJhbnNtaXQgaW50ZXJydXB0IChwYWNrZXQgc2VudCkgKi8KKyAgICB7CisJU0tfdHhpbnRyKGRldik7CisgICAgfQorCisgICAgU0tfd3JpdGVfcmVnKENTUjAsIENTUjBfSU5FQSk7IC8qIEVuYWJsZSBJbnRlcnJ1cHRzICovCisKKyAgICBzcGluX3VubG9jayAoJlNLX2xvY2spOworICAgIHJldHVybiBJUlFfSEFORExFRDsKK30gLyogRW5kIG9mIFNLX2ludGVycnVwdCgpICovIAorCisMCisvKi0KKyAqIEZ1bmN0aW9uICAgICAgIDogU0tfdHhpbnRyCisgKiBBdXRob3IgICAgICAgICA6IFBhdHJpY2sgSi5ELiBXZWljaG1hbm4KKyAqIERhdGUgQ3JlYXRlZCAgIDogOTQvMDUvMjcKKyAqCisgKiBEZXNjcmlwdGlvbiAgICA6IEFmdGVyIHNlbmRpbmcgYSBwYWNrZXQgd2UgY2hlY2sgc3RhdHVzLCB1cGRhdGUKKyAqICAgICAgICAgICAgICAgICAgc3RhdGlzdGljcyBhbmQgcmVsaW5xdWlzaCBvd25lcnNoaXAgb2YgdHJhbnNtaXQgCisgKiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgcmluZy4KKyAqCisgKiBQYXJhbWV0ZXJzICAgICA6IEkgOiBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2IC0gU0tfRzE2IGRldmljZSBzdHJ1Y3R1cmUKKyAqIFJldHVybiBWYWx1ZSAgIDogTm9uZQorICogRXJyb3JzICAgICAgICAgOiBOb25lCisgKiBHbG9iYWxzICAgICAgICA6IE5vbmUKKyAqIFVwZGF0ZSBIaXN0b3J5IDoKKyAqICAgICBZWS9NTS9ERCAgdWlkICBEZXNjcmlwdGlvbgorLSovCisKK3N0YXRpYyB2b2lkIFNLX3R4aW50cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIGludCB0bWRzdGF0OworICAgIHN0cnVjdCB0bWQgKnRtZHA7CisgICAgc3RydWN0IHByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisKKyAgICBQUklOVEsyKCgiIyMgJXM6IFNLX3R4aW50cigpIHN0YXR1czogJSMwNnhcbiIsIAorICAgICAgICAgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpKTsKKworICAgIHRtZHAgPSBwLT50bWRoZWFkICsgcC0+dG1kbGFzdDsgICAgIC8qIFdoaWNoIGJ1ZmZlciB3ZSBzZW50IGF0IGxhc3QgPyAqLworCisgICAgLyogU2V0IG5leHQgYnVmZmVyICovCisgICAgcC0+dG1kbGFzdCsrOworICAgIHAtPnRtZGxhc3QgJj0gVE1ETlVNLTE7CisKKyAgICB0bWRzdGF0ID0gcmVhZGIoJnRtZHAtPnUucy5zdGF0dXMpOworCisgICAgLyogCisgICAgICogV2UgY2hlY2sgc3RhdHVzIG9mIHRyYW5zbWl0dGVkIHBhY2tldC4KKyAgICAgKiBzZWUgTEFOQ0UgZGF0YS1zaGVldCBmb3IgZXJyb3IgZXhwbGFuYXRpb24KKyAgICAgKi8KKyAgICBpZiAodG1kc3RhdCAmIFRYX0VSUikgLyogRXJyb3Igb2NjdXJyZWQgKi8KKyAgICB7CisJaW50IHN0YXQyID0gcmVhZHcoJnRtZHAtPnN0YXR1czIpOworCisJcHJpbnRrKCIlczogVFggZXJyb3I6ICUwNHggJTA0eFxuIiwgZGV2LT5uYW1lLCB0bWRzdGF0LCBzdGF0Mik7CisKKwlpZiAoc3RhdDIgJiBUWF9URFIpICAgIC8qIFREUiBwcm9ibGVtcz8gKi8KKwl7CisJICAgIHByaW50aygiJXM6IHRkci1wcm9ibGVtcyBcbiIsIGRldi0+bmFtZSk7CisJfQorCisJaWYgKHN0YXQyICYgVFhfUlRSWSkgICAvKiBGYWlsZWQgaW4gMTYgYXR0ZW1wdHMgdG8gdHJhbnNtaXQgPyAqLworICAgICAgICAgICAgcC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsgICAKKyAgICAgICAgaWYgKHN0YXQyICYgVFhfTENPTCkgICAvKiBMYXRlIGNvbGxpc2lvbiA/ICovCisgICAgICAgICAgICBwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7IAorCWlmIChzdGF0MiAmIFRYX0xDQVIpICAgLyogTG9zcyBvZiBDYXJyaWVyID8gKi8gIAorICAgICAgICAgICAgcC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKyAgICAgICAgaWYgKHN0YXQyICYgVFhfVUZMTykgICAvKiBVbmRlcmZsb3cgZXJyb3IgPyAqLworICAgICAgICB7CisgICAgICAgICAgICBwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCisgICAgICAgICAgICAvKiAKKyAgICAgICAgICAgICAqIElmIFVGTE8gZXJyb3Igb2NjdXJzIGl0IHdpbGwgdHVybiB0cmFuc21pdHRlciBvZi4KKyAgICAgICAgICAgICAqIFNvIHdlIG11c3QgcmVpbml0IExBTkNFCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgU0tfbGFuY2VfaW5pdChkZXYsIE1PREVfTk9STUFMKTsKKyAgICAgICAgfQorCQorCXAtPnN0YXRzLnR4X2Vycm9ycysrOworCisJd3JpdGV3KDAsICZ0bWRwLT5zdGF0dXMyKTsgICAgICAgICAgICAgLyogQ2xlYXIgZXJyb3IgZmxhZ3MgKi8KKyAgICB9CisgICAgZWxzZSBpZiAodG1kc3RhdCAmIFRYX01PUkUpICAgICAgICAvKiBDb2xsaXNpb25zIG9jY3VycmVkID8gKi8KKyAgICB7CisgICAgICAgIC8qIAorICAgICAgICAgKiBIZXJlIEkgaGF2ZSBhIHByb2JsZW0uCisgICAgICAgICAqIEkgb25seSBrbm93IHRoYXQgdGhlcmUgbXVzdCBiZSBvbmUgb3IgdXAgdG8gMTUgY29sbGlzaW9ucy4KKyAgICAgICAgICogVGhhdCdzIHdoeSBUWF9NT1JFIGlzIHNldCwgYmVjYXVzZSBhZnRlciAxNiBhdHRlbXB0cyBUWF9SVFJZCisgICAgICAgICAqIHdpbGwgYmUgc2V0IHdoaWNoIG1lYW5zIGNvdWxkbid0IHNlbmQgcGFja2V0IGFib3J0ZWQgdHJhbnNmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEZpcnN0IEkgZGlkIG5vdCBoYXZlIHRoaXMgaW4gYnV0IHRoZW4gSSB0aG91Z2h0IGF0IG1pbmltdW0KKyAgICAgICAgICogd2Ugc2VlIHRoYXQgc29tZXRoaW5nIHdhcyBub3Qgb2suCisgICAgICAgICAqIElmIGFueW9uZSBrbm93cyBzb21ldGhpbmcgYmV0dGVyIHRoYW4gdGhpcyB0byBoYW5kbGUgdGhpcworICAgICAgICAgKiBwbGVhc2UgcmVwb3J0IGl0LgorICAgICAgICAgKi8gCisKKyAgICAgICAgcC0+c3RhdHMuY29sbGlzaW9ucysrOyAKKyAgICB9CisgICAgZWxzZSAgIC8qIFBhY2tldCBzZW50IHdpdGhvdXQgYW55IHByb2JsZW1zICovCisgICAgeworICAgICAgICBwLT5zdGF0cy50eF9wYWNrZXRzKys7IAorICAgIH0KKworICAgIC8qIAorICAgICAqIFdlIG1hcmsgdHJhbnNtaXR0ZXIgbm90IGJ1c3kgYW55bW9yZSwgYmVjYXVzZSBub3cgd2UgaGF2ZSBhIGZyZWUKKyAgICAgKiB0cmFuc21pdCBkZXNjcmlwdG9yIHdoaWNoIGNhbiBiZSBmaWxsZWQgYnkgU0tfc2VuZF9wYWNrZXQgYW5kCisgICAgICogYWZ0ZXJ3YXJkcyBzZW50IGJ5IHRoZSBMQU5DRQorICAgICAqIAorICAgICAqIFRoZSBmdW5jdGlvbiB3aGljaCBkbyBoYW5kbGUgc2xvdyBJUlEgcGFydHMgaXMgZG9fYm90dG9tX2hhbGYoKQorICAgICAqIHdoaWNoIHJ1bnMgYXQgbm9ybWFsIGtlcm5lbCBwcmlvcml0eSwgdGhhdCBtZWFucyBhbGwgaW50ZXJydXB0IGFyZQorICAgICAqIGVuYWJsZWQuIChzZWUga2VybmVsL2lycS5jKQorICAgICAqICAKKyAgICAgKiBuZXRfYmggZG9lcyBzb21ldGhpbmcgbGlrZSB0aGlzOgorICAgICAqICAtIGNoZWNrIGlmIGFscmVhZHkgaW4gbmV0X2JoCisgICAgICogIC0gdHJ5IHRvIHRyYW5zbWl0IHNvbWV0aGluZyBmcm9tIHRoZSBzZW5kIHF1ZXVlCisgICAgICogIC0gaWYgc29tZXRoaW5nIGlzIGluIHRoZSByZWNlaXZlIHF1ZXVlIHNlbmQgaXQgdXAgdG8gaGlnaGVyIAorICAgICAqICAgIGxldmVscyBpZiBpdCBpcyBhIGtub3duIHByb3RvY29sCisgICAgICogIC0gdHJ5IHRvIHRyYW5zbWl0IHNvbWV0aGluZyBmcm9tIHRoZSBzZW5kIHF1ZXVlCisgICAgICovCisKKyAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisKK30gLyogRW5kIG9mIFNLX3R4aW50cigpICovCisKKwwKKy8qLQorICogRnVuY3Rpb24gICAgICAgOiBTS19yeGludHIKKyAqIEF1dGhvciAgICAgICAgIDogUGF0cmljayBKLkQuIFdlaWNobWFubgorICogRGF0ZSBDcmVhdGVkICAgOiA5NC8wNS8yNworICoKKyAqIERlc2NyaXB0aW9uICAgIDogQnVmZmVyIHNlbnQsIGNoZWNrIGZvciBlcnJvcnMsIHJlbGlucXVpc2ggb3duZXJzaGlwCisgKiAgICAgICAgICAgICAgICAgIG9mIHRoZSByZWNlaXZlIG1lc3NhZ2UgZGVzY3JpcHRvci4gCisgKgorICogUGFyYW1ldGVycyAgICAgOiBJIDogU0tfRzE2IGRldmljZSBzdHJ1Y3R1cmUKKyAqIFJldHVybiBWYWx1ZSAgIDogTm9uZQorICogR2xvYmFscyAgICAgICAgOiBOb25lCisgKiBVcGRhdGUgSGlzdG9yeSA6CisgKiAgICAgWVkvTU0vREQgIHVpZCAgRGVzY3JpcHRpb24KKy0qLworCitzdGF0aWMgdm9pZCBTS19yeGludHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworICAgIHN0cnVjdCBybWQgKnJtZHA7CisgICAgaW50IHJtZHN0YXQ7CisgICAgc3RydWN0IHByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgUFJJTlRLMigoIiMjICVzOiBTS19yeGludHIoKS4gQ1NSMDogJSMwNnhcbiIsIAorICAgICAgICAgICAgU0tfTkFNRSwgU0tfcmVhZF9yZWcoQ1NSMCkpKTsKKworICAgIHJtZHAgPSBwLT5ybWRoZWFkICsgcC0+cm1kbnVtOworCisgICAgLyogQXMgbG9uZyBhcyB3ZSBvd24gdGhlIG5leHQgZW50cnksIGNoZWNrIHN0YXR1cyBhbmQgc2VuZAorICAgICAqIGl0IHVwIHRvIGhpZ2hlciBsYXllciAKKyAgICAgKi8KKworICAgIHdoaWxlICghKCAocm1kc3RhdCA9IHJlYWRiKCZybWRwLT51LnMuc3RhdHVzKSkgJiBSWF9PV04pKQorICAgIHsKKwkvKiAKKyAgICAgICAgICogU3RhcnQgYW5kIGVuZCBvZiBwYWNrZXQgbXVzdCBiZSBzZXQsIGJlY2F1c2Ugd2UgdXNlIAorCSAqIHRoZSBldGhlcm5ldCBtYXhpbXVtIHBhY2tldCBsZW5ndGggKDE1MTgpIGFzIGJ1ZmZlciBzaXplLgorCSAqIAorCSAqIEJlY2F1c2Ugb3VyIGJ1ZmZlcnMgYXJlIGF0IG1heGltdW0gT0ZMTyBhbmQgQlVGRiBlcnJvcnMgYXJlCisJICogbm90IHRvIGJlIGNvbmNlcm5lZCAoc2VlIERhdGEgc2hlZXQpCisJICovCisKKwlpZiAoKHJtZHN0YXQgJiAoUlhfU1RQIHwgUlhfRU5QKSkgIT0gKFJYX1NUUCB8IFJYX0VOUCkpCisJeworCSAgICAvKiBTdGFydCBvZiBhIGZyYW1lID4gMTUxOCBCeXRlcyA/ICovCisKKwkgICAgaWYgKHJtZHN0YXQgJiBSWF9TVFApIAorCSAgICB7CisJCXAtPnN0YXRzLnJ4X2Vycm9ycysrOyAgICAgICAgLyogYmFkIHBhY2tldCByZWNlaXZlZCAqLworCQlwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7IC8qIHBhY2tldCB0b28gbG9uZyAqLworCisJCXByaW50aygiJXM6IHBhY2tldCB0b28gbG9uZ1xuIiwgZGV2LT5uYW1lKTsKKwkgICAgfQorCSAgICAKKwkgICAgLyogCisgICAgICAgICAgICAgKiBBbGwgb3RoZXIgcGFja2V0cyB3aWxsIGJlIGlnbm9yZWQgdW50aWwgYSBuZXcgZnJhbWUgd2l0aAorCSAgICAgKiBzdGFydCAoUlhfU1RQKSBzZXQgZm9sbG93cy4KKwkgICAgICogCisJICAgICAqIFdoYXQgd2UgZG8gaXMganVzdCBnaXZlIGRlc2NyaXB0b3IgZnJlZSBmb3IgbmV3IGluY29taW5nCisJICAgICAqIHBhY2tldHMuIAorCSAgICAgKi8KKworCSAgICB3cml0ZWIoUlhfT1dOLCAmcm1kcC0+dS5zLnN0YXR1cyk7IC8qIFJlbGlucXVpc2ggb3duZXJzaGlwIHRvIExBTkNFICovIAorCisJfQorCWVsc2UgaWYgKHJtZHN0YXQgJiBSWF9FUlIpICAgICAgICAgIC8qIFJlY2VpdmUgRXJyb3IgPyAqLworCXsKKwkgICAgcHJpbnRrKCIlczogUlggZXJyb3I6ICUwNHhcbiIsIGRldi0+bmFtZSwgKGludCkgcm1kc3RhdCk7CisJICAgIAorCSAgICBwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKworCSAgICBpZiAocm1kc3RhdCAmIFJYX0ZSQU0pIHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCSAgICBpZiAocm1kc3RhdCAmIFJYX0NSQykgIHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKworCSAgICB3cml0ZWIoUlhfT1dOLCAmcm1kcC0+dS5zLnN0YXR1cyk7IC8qIFJlbGlucXVpc2ggb3duZXJzaGlwIHRvIExBTkNFICovCisKKwl9CisJZWxzZSAvKiBXZSBoYXZlIGEgcGFja2V0IHdoaWNoIGNhbiBiZSBxdWV1ZWQgZm9yIHRoZSB1cHBlciBsYXllcnMgKi8KKwl7CisKKwkgICAgaW50IGxlbiA9IHJlYWR3KCZybWRwLT5tbGVuKSAmIDB4MGZmZjsgIC8qIGV4dHJhY3QgbWVzc2FnZSBsZW5ndGggZnJvbSByZWNlaXZlIGJ1ZmZlciAqLworCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJICAgIHNrYiA9IGRldl9hbGxvY19za2IobGVuKzIpOyAvKiBhbGxvY2F0ZSBzb2NrZXQgYnVmZmVyICovIAorCisJICAgIGlmIChza2IgPT0gTlVMTCkgICAgICAgICAgICAgICAgLyogQ291bGQgbm90IGdldCBtZW0gPyAqLworCSAgICB7CisgICAgCisJCS8qIAorICAgICAgICAgICAgICAgICAqIENvdWxkbid0IGFsbG9jYXRlIHNrX2J1ZmZlciBzbyB3ZSBnaXZlIGRlc2NyaXB0b3IgYmFjaworCQkgKiB0byBMYW5jZSwgdXBkYXRlIHN0YXRpc3RpY3MgYW5kIGdvIGFoZWFkLgorCQkgKi8KKworCQl3cml0ZWIoUlhfT1dOLCAmcm1kcC0+dS5zLnN0YXR1cyk7IC8qIFJlbGlucXVpc2ggb3duZXJzaGlwIHRvIExBTkNFICovCisJCXByaW50aygiJXM6IENvdWxkbid0IGFsbG9jYXRlIHNrX2J1ZmYsIGRlZmVycmluZyBwYWNrZXQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcC0+c3RhdHMucnhfZHJvcHBlZCsrOworCisJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAvKiBKdW1wIG91dCAqLworCSAgICB9CisJICAgIAorCSAgICAvKiBQcmVwYXJlIHNrX2J1ZmYgdG8gcXVldWUgZm9yIHVwcGVyIGxheWVycyAqLworCisJICAgIHNrYi0+ZGV2ID0gZGV2OworCSAgICBza2JfcmVzZXJ2ZShza2IsMik7CQkvKiBBbGlnbiBJUCBoZWFkZXIgb24gMTYgYnl0ZSBib3VuZGFyeSAqLworCSAgICAKKwkgICAgLyogCisgICAgICAgICAgICAgKiBDb3B5IGRhdGEgb3V0IG9mIG91ciByZWNlaXZlIGRlc2NyaXB0b3IgaW50byBza19idWZmLgorCSAgICAgKgorCSAgICAgKiAocm1kcC0+dS5idWZmZXIgJiAweDAwZmZmZmZmKSAtPiBnZXQgYWRkcmVzcyBvZiBidWZmZXIgYW5kIAorCSAgICAgKiBpZ25vcmUgc3RhdHVzIGZpZWxkcykgCisJICAgICAqLworCisJICAgIG1lbWNweV9mcm9taW8oc2tiX3B1dChza2IsbGVuKSwgKHJtZHAtPnUuYnVmZmVyICYgMHgwMGZmZmZmZiksIGxlbik7CisKKworCSAgICAvKiAKKyAgICAgICAgICAgICAqIE5vdGlmeSB0aGUgdXBwZXIgcHJvdG9jb2wgbGF5ZXJzIHRoYXQgdGhlcmUgaXMgYW5vdGhlciBwYWNrZXQKKwkgICAgICogdG8gaGFuZGxlCisJICAgICAqCisJICAgICAqIG5ldGlmX3J4KCkgYWx3YXlzIHN1Y2NlZWRzLiBzZWUgL25ldC9pbmV0L2Rldi5jIGZvciBtb3JlLgorCSAgICAgKi8KKworCSAgICBza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCSAgICBuZXRpZl9yeChza2IpOyAgICAgICAgICAgICAgICAgLyogcXVldWUgcGFja2V0IGFuZCBtYXJrIGl0IGZvciBwcm9jZXNzaW5nICovCisJICAgCisJICAgIC8qIAorICAgICAgICAgICAgICogUGFja2V0IGlzIHF1ZXVlZCBhbmQgbWFya2VkIGZvciBwcm9jZXNzaW5nIHNvIHdlCisJICAgICAqIGZyZWUgb3VyIGRlc2NyaXB0b3IgYW5kIHVwZGF0ZSBzdGF0aXN0aWNzIAorCSAgICAgKi8KKworCSAgICB3cml0ZWIoUlhfT1dOLCAmcm1kcC0+dS5zLnN0YXR1cyk7CisJICAgIGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJICAgIHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkgICAgcC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCisKKwkgICAgcC0+cm1kbnVtKys7CisJICAgIHAtPnJtZG51bSAlPSBSTUROVU07CisKKwkgICAgcm1kcCA9IHAtPnJtZGhlYWQgKyBwLT5ybWRudW07CisJfQorICAgIH0KK30gLyogRW5kIG9mIFNLX3J4aW50cigpICovCisKKwwKKy8qLQorICogRnVuY3Rpb24gICAgICAgOiBTS19jbG9zZQorICogQXV0aG9yICAgICAgICAgOiBQYXRyaWNrIEouRC4gV2VpY2htYW5uCisgKiBEYXRlIENyZWF0ZWQgICA6IDk0LzA1LzI2CisgKgorICogRGVzY3JpcHRpb24gICAgOiBjbG9zZSBnZXRzIGNhbGxlZCBmcm9tIGRldl9jbG9zZSgpIGFuZCBzaG91bGQKKyAqICAgICAgICAgICAgICAgICAgZGVpbnN0YWxsIHRoZSBjYXJkIChmcmVlX2lycSwgbWVtIGV0YykuCisgKgorICogUGFyYW1ldGVycyAgICAgOiBJIDogc3RydWN0IG5ldF9kZXZpY2UgKmRldiAtIG91ciBkZXZpY2Ugc3RydWN0dXJlCisgKiBSZXR1cm4gVmFsdWUgICA6IDAgLSBjbG9zZWQgZGV2aWNlIGRyaXZlcgorICogRXJyb3JzICAgICAgICAgOiBOb25lCisgKiBHbG9iYWxzICAgICAgICA6IE5vbmUKKyAqIFVwZGF0ZSBIaXN0b3J5IDoKKyAqICAgICBZWS9NTS9ERCAgdWlkICBEZXNjcmlwdGlvbgorLSovCisKKy8qIEkgaGF2ZSB0cmllZCB0byBzZXQgQk9PVF9ST00gb24gYW5kIFJBTSBvZmYgYnV0IHRoZW4sIGFmdGVyIGEgJ2lmY29uZmlnCisgKiBkb3duJyB0aGUgc3lzdGVtIHN0b3BzLiBTbyBJIGRvbid0IHNodXQgc2V0IGNhcmQgdG8gaW5pdCBzdGF0ZS4KKyAqLworCitzdGF0aWMgaW50IFNLX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKyAgICBQUklOVEsoKCIjIyAlczogU0tfY2xvc2UoKS4gQ1NSMDogJSMwNnhcbiIsIAorICAgICAgICAgICBTS19OQU1FLCBTS19yZWFkX3JlZyhDU1IwKSkpOworCisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwkgICAvKiBUcmFuc21pdHRlciBidXN5ICovCisKKyAgICBwcmludGsoIiVzOiBTaHV0dGluZyAlcyBkb3duIENTUjAgJSMwNnhcbiIsIGRldi0+bmFtZSwgU0tfTkFNRSwgCisgICAgICAgICAgIChpbnQpIFNLX3JlYWRfcmVnKENTUjApKTsKKworICAgIFNLX3dyaXRlX3JlZyhDU1IwLCBDU1IwX1NUT1ApOyAvKiBTVE9QIHRoZSBMQU5DRSAqLworCisgICAgZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7ICAgICAgLyogRnJlZSBJUlEgKi8KKworICAgIHJldHVybiAwOyAvKiBhbHdheXMgc3VjY2VlZCAqLworICAgIAorfSAvKiBFbmQgb2YgU0tfY2xvc2UoKSAqLworCisMCisvKi0KKyAqIEZ1bmN0aW9uICAgICAgIDogU0tfZ2V0X3N0YXRzCisgKiBBdXRob3IgICAgICAgICA6IFBhdHJpY2sgSi5ELiBXZWljaG1hbm4KKyAqIERhdGUgQ3JlYXRlZCAgIDogOTQvMDUvMjYKKyAqCisgKiBEZXNjcmlwdGlvbiAgICA6IFJldHVybiBjdXJyZW50IHN0YXR1cyBzdHJ1Y3R1cmUgdG8gdXBwZXIgbGF5ZXJzLgorICogICAgICAgICAgICAgICAgICBJdCBpcyBjYWxsZWQgYnkgc3ByaW50Zl9zdGF0cyAoZGV2LmMpLgorICoKKyAqIFBhcmFtZXRlcnMgICAgIDogSSA6IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgICAtIG91ciBkZXZpY2Ugc3RydWN0dXJlCisgKiBSZXR1cm4gVmFsdWUgICA6IHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogLSBvdXIgY3VycmVudCBzdGF0aXN0aWNzCisgKiBFcnJvcnMgICAgICAgICA6IE5vbmUKKyAqIFNpZGUgRWZmZWN0cyAgIDogTm9uZQorICogVXBkYXRlIEhpc3RvcnkgOgorICogICAgIFlZL01NL0REICB1aWQgIERlc2NyaXB0aW9uCistKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpTS19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworICAgIHN0cnVjdCBwcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgIFBSSU5USygoIiMjICVzOiBTS19nZXRfc3RhdHMoKS4gQ1NSMDogJSMwNnhcbiIsIAorICAgICAgICAgICBTS19OQU1FLCBTS19yZWFkX3JlZyhDU1IwKSkpOworCisgICAgcmV0dXJuICZwLT5zdGF0czsgICAgICAgICAgICAgLyogUmV0dXJuIERldmljZSBzdGF0dXMgKi8KKworfSAvKiBFbmQgb2YgU0tfZ2V0X3N0YXRzKCkgKi8KKworDAorLyotCisgKiBGdW5jdGlvbiAgICAgICA6IHNldF9tdWx0aWNhc3RfbGlzdAorICogQXV0aG9yICAgICAgICAgOiBQYXRyaWNrIEouRC4gV2VpY2htYW5uCisgKiBEYXRlIENyZWF0ZWQgICA6IDk0LzA1LzI2CisgKgorICogRGVzY3JpcHRpb24gICAgOiBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIHdoZW4gYSBwcm9ncmFtIHBlcmZvcm1zCisgKiAgICAgICAgICAgICAgICAgIGEgU0lPQ1NJRkZMQUdTIGNhbGwuIElmY29uZmlnIGRvZXMgdGhpcyBpZiB5b3UgY2FsbAorICogICAgICAgICAgICAgICAgICAnaWZjb25maWcgWy1dYWxsbXVsdGknIHdoaWNoIGVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlCisgKiAgICAgICAgICAgICAgICAgIFByb21pc2N1b3VzIG1vZGUuCisgKiAgICAgICAgICAgICAgICAgIFByb21pc2N1b3VzIG1vZGUgaXMgd2hlbiB0aGUgTmV0d29yayBjYXJkIGFjY2VwdHMgYWxsCisgKiAgICAgICAgICAgICAgICAgIHBhY2tldHMsIG5vdCBvbmx5IHRoZSBwYWNrZXRzIHdoaWNoIG1hdGNoIG91ciBNQUMgCisgKiAgICAgICAgICAgICAgICAgIEFkZHJlc3MuIEl0IGlzIHVzZWZ1bCBmb3Igd3JpdGluZyBhIG5ldHdvcmsgbW9uaXRvciwKKyAqICAgICAgICAgICAgICAgICAgYnV0IGl0IGlzIGFsc28gYSBzZWN1cml0eSBwcm9ibGVtLiBZb3UgaGF2ZSB0byByZW1lbWJlcgorICogICAgICAgICAgICAgICAgICB0aGF0IGFsbCBpbmZvcm1hdGlvbiBvbiB0aGUgbmV0IGlzIG5vdCBlbmNyeXB0ZWQuCisgKgorICogUGFyYW1ldGVycyAgICAgOiBJIDogc3RydWN0IG5ldF9kZXZpY2UgKmRldiAtIFNLX0cxNiBkZXZpY2UgU3RydWN0dXJlCisgKiBSZXR1cm4gVmFsdWUgICA6IE5vbmUKKyAqIEVycm9ycyAgICAgICAgIDogTm9uZQorICogR2xvYmFscyAgICAgICAgOiBOb25lCisgKiBVcGRhdGUgSGlzdG9yeSA6CisgKiAgICAgWVkvTU0vREQgIHVpZCAgRGVzY3JpcHRpb24KKyAqICAgICA5NS8xMC8xOCAgQUNveCAgTmV3IG11bHRpY2FzdCBjYWxsaW5nIHNjaGVtZQorLSovCisKKworLyogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciBTS19HMTYuCisgKi8KKworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKyAgICBpZiAoZGV2LT5mbGFncyZJRkZfUFJPTUlTQykKKyAgICB7CisJLyogUmVpbml0aWFsaXplIExBTkNFIHdpdGggTU9ERV9QUk9NIHNldCAqLworCVNLX2xhbmNlX2luaXQoZGV2LCBNT0RFX1BST00pOworICAgIH0KKyAgICBlbHNlIGlmIChkZXYtPm1jX2NvdW50PT0wICYmICEoZGV2LT5mbGFncyZJRkZfQUxMTVVMVEkpKQorICAgIHsKKwkvKiBSZWluaXRpYWxpemUgTEFOQ0Ugd2l0aG91dCBNT0RFX1BST00gKi8KKwlTS19sYW5jZV9pbml0KGRldiwgTU9ERV9OT1JNQUwpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qIE11bHRpY2FzdCB3aXRoIGxvZ2ljYWwgYWRkcmVzcyBmaWx0ZXIgb24gKi8KKwkvKiBSZWluaXRpYWxpemUgTEFOQ0Ugd2l0aG91dCBNT0RFX1BST00gKi8KKwlTS19sYW5jZV9pbml0KGRldiwgTU9ERV9OT1JNQUwpOworCQorCS8qIE5vdCBpbXBsZW1lbnRlZCB5ZXQuICovCisgICAgfQorfSAvKiBFbmQgb2Ygc2V0X211bHRpY2FzdF9saXN0KCkgKi8KKworCisMCisvKi0KKyAqIEZ1bmN0aW9uICAgICAgIDogU0tfcm9tX2FkZHIKKyAqIEF1dGhvciAgICAgICAgIDogUGF0cmljayBKLkQuIFdlaWNobWFubgorICogRGF0ZSBDcmVhdGVkICAgOiA5NC8wNi8wMQorICoKKyAqIERlc2NyaXB0aW9uICAgIDogVHJ5IHRvIGZpbmQgYSBCb290X1JPTSBhdCBhbGwgcG9zc2libGUgbG9jYXRpb25zCisgKgorICogUGFyYW1ldGVycyAgICAgOiBOb25lCisgKiBSZXR1cm4gVmFsdWUgICA6IEFkZHJlc3Mgd2hlcmUgQm9vdF9ST00gaXMKKyAqIEVycm9ycyAgICAgICAgIDogMCAtIERpZCBub3QgZmluZCBCb290X1JPTQorICogR2xvYmFscyAgICAgICAgOiBOb25lCisgKiBVcGRhdGUgSGlzdG9yeSA6CisgKiAgICAgWVkvTU0vREQgIHVpZCAgRGVzY3JpcHRpb24KKy0qLworCit1bnNpZ25lZCBpbnQgX19pbml0IFNLX3JvbV9hZGRyKHZvaWQpCit7CisgICAgaW50IGksajsKKyAgICBpbnQgcm9tX2ZvdW5kID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgcm9tX2xvY2F0aW9uW10gPSBTS19CT09UX1JPTV9MT0NBVElPTlM7CisgICAgdW5zaWduZWQgY2hhciByb21faWRbXSA9IFNLX0JPT1RfUk9NX0lEOworICAgIHVuc2lnbmVkIGNoYXIgdGVzdF9ieXRlOworCisgICAgLyogQXV0b2RldGVjdCBCb290X1JPTSAqLworICAgIFBSSU5USygoIiMjICVzOiBBdXRvZGV0ZWN0aW9uIG9mIEJvb3RfUk9NXG4iLCBTS19OQU1FKSk7CisKKyAgICBmb3IgKGkgPSAwOyAocm9tX2xvY2F0aW9uW2ldICE9IDApICYmIChyb21fZm91bmQgPT0gMCk7IGkrKykKKyAgICB7CisJCisJUFJJTlRLKCgiIyMgICBUcnlpbmcgUk9NIGxvY2F0aW9uICUjMDh4Iiwgcm9tX2xvY2F0aW9uW2ldKSk7CisJCisJcm9tX2ZvdW5kID0gMTsgCisJZm9yIChqID0gMDsgaiA8IDY7IGorKykKKwl7CisJICAgIHRlc3RfYnl0ZSA9IHJlYWRiKHJvbV9sb2NhdGlvbltpXStqKTsKKwkgICAgUFJJTlRLKCgiICUwMnggIiwgKnRlc3RfYnl0ZSkpOworCisJICAgIGlmKHRlc3RfYnl0ZSAhPSByb21faWRbal0pCisJICAgIHsKKwkJcm9tX2ZvdW5kID0gMDsKKwkgICAgfSAKKwl9CisJUFJJTlRLKCgiXG4iKSk7CisgICAgfQorCisgICAgaWYgKHJvbV9mb3VuZCA9PSAxKQorICAgIHsKKwlQUklOVEsoKCIjIyAlczogQm9vdF9ST00gZm91bmQgYXQgJSMwOHhcbiIsIAorICAgICAgICAgICAgICAgU0tfTkFNRSwgcm9tX2xvY2F0aW9uWyhpLTEpXSkpOworCisJcmV0dXJuIChyb21fbG9jYXRpb25bLS1pXSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJUFJJTlRLKCgiJXM6IE5vIEJvb3RfUk9NIGZvdW5kXG4iLCBTS19OQU1FKSk7CisJcmV0dXJuIDA7CisgICAgfQorfSAvKiBFbmQgb2YgU0tfcm9tX2FkZHIoKSAqLworCisKKwwKKy8qIExBTkNFIGFjY2VzcyBmdW5jdGlvbnMgCisgKgorICogISBDU1IxLTMgY2FuIG9ubHkgYmUgYWNjZXNzZWQgd2hlbiBpbiBDU1IwIHRoZSBTVE9QIGJpdCBpcyBzZXQgIQorICovCisKKworLyotCisgKiBGdW5jdGlvbiAgICAgICA6IFNLX3Jlc2V0X2JvYXJkCisgKgorICogQXV0aG9yICAgICAgICAgOiBQYXRyaWNrIEouRC4gV2VpY2htYW5uCisgKgorICogRGF0ZSBDcmVhdGVkICAgOiA5NC8wNS8yNQorICoKKyAqIERlc2NyaXB0aW9uICAgIDogVGhpcyBmdW5jdGlvbiByZXNldHMgU0tfRzE2IGFuZCBhbGwgY29tcG9uZW50cywgYnV0CisgKiAgICAgICAgICAgICAgICAgIFBPUyByZWdpc3RlcnMgYXJlIG5vdCBjaGFuZ2VkCisgKgorICogUGFyYW1ldGVycyAgICAgOiBOb25lCisgKiBSZXR1cm4gVmFsdWUgICA6IE5vbmUKKyAqIEVycm9ycyAgICAgICAgIDogTm9uZQorICogR2xvYmFscyAgICAgICAgOiBTS19SQU0gKmJvYXJkIC0gU0tfUkFNIHN0cnVjdHVyZSBwb2ludGVyCisgKgorICogVXBkYXRlIEhpc3RvcnkgOgorICogICAgIFlZL01NL0REICB1aWQgIERlc2NyaXB0aW9uCistKi8KKwordm9pZCBTS19yZXNldF9ib2FyZCh2b2lkKQoreworICAgIHdyaXRlYigweDAwLCBTS19QT1JUKTsgICAgICAgLyogUmVzZXQgYWN0aXZlICovCisgICAgbWRlbGF5KDUpOyAgICAgICAgICAgICAgICAvKiBEZWxheSBtaW4gNW1zICovCisgICAgd3JpdGViKFNLX1JFU0VULCBTS19QT1JUKTsgICAvKiBTZXQgYmFjayB0byBub3JtYWwgb3BlcmF0aW9uICovCisKK30gLyogRW5kIG9mIFNLX3Jlc2V0X2JvYXJkKCkgKi8KKworDAorLyotCisgKiBGdW5jdGlvbiAgICAgICA6IFNLX3NldF9SQVAKKyAqIEF1dGhvciAgICAgICAgIDogUGF0cmljayBKLkQuIFdlaWNobWFubgorICogRGF0ZSBDcmVhdGVkICAgOiA5NC8wNS8yNQorICoKKyAqIERlc2NyaXB0aW9uICAgIDogU2V0IExBTkNFIFJlZ2lzdGVyIEFkZHJlc3MgUG9ydCB0byByZWdpc3RlcgorICogICAgICAgICAgICAgICAgICBmb3IgbGF0ZXIgZGF0YSB0cmFuc2Zlci4KKyAqCisgKiBQYXJhbWV0ZXJzICAgICA6IEkgOiByZWdfbnVtYmVyIC0gd2hpY2ggQ1NSIHRvIHJlYWQvd3JpdGUgZnJvbS90bworICogUmV0dXJuIFZhbHVlICAgOiBOb25lCisgKiBFcnJvcnMgICAgICAgICA6IE5vbmUKKyAqIEdsb2JhbHMgICAgICAgIDogU0tfUkFNICpib2FyZCAtIFNLX1JBTSBzdHJ1Y3R1cmUgcG9pbnRlcgorICogVXBkYXRlIEhpc3RvcnkgOgorICogICAgIFlZL01NL0REICB1aWQgIERlc2NyaXB0aW9uCistKi8KKwordm9pZCBTS19zZXRfUkFQKGludCByZWdfbnVtYmVyKQoreworICAgIHdyaXRldyhyZWdfbnVtYmVyLCBTS19JT1JFRyk7CisgICAgd3JpdGViKFNLX1JFU0VUIHwgU0tfUkFQIHwgU0tfV1JFRywgU0tfUE9SVCk7CisgICAgd3JpdGViKFNLX0RPSU8sIFNLX0lPQ09NKTsKKworICAgIHdoaWxlIChyZWFkYihTS19QT1JUKSAmIFNLX0lPUlVOKSAKKwliYXJyaWVyKCk7Cit9IC8qIEVuZCBvZiBTS19zZXRfUkFQKCkgKi8KKworDAorLyotCisgKiBGdW5jdGlvbiAgICAgICA6IFNLX3JlYWRfcmVnCisgKiBBdXRob3IgICAgICAgICA6IFBhdHJpY2sgSi5ELiBXZWljaG1hbm4KKyAqIERhdGUgQ3JlYXRlZCAgIDogOTQvMDUvMjUKKyAqCisgKiBEZXNjcmlwdGlvbiAgICA6IFNldCBSQVAgYW5kIHJlYWQgZGF0YSBmcm9tIGEgTEFOQ0UgQ1NSIHJlZ2lzdGVyCisgKgorICogUGFyYW1ldGVycyAgICAgOiBJIDogcmVnX251bWJlciAtIHdoaWNoIENTUiB0byByZWFkIGZyb20KKyAqIFJldHVybiBWYWx1ZSAgIDogUmVnaXN0ZXIgY29udGVudHMKKyAqIEVycm9ycyAgICAgICAgIDogTm9uZQorICogR2xvYmFscyAgICAgICAgOiBTS19SQU0gKmJvYXJkIC0gU0tfUkFNIHN0cnVjdHVyZSBwb2ludGVyCisgKiBVcGRhdGUgSGlzdG9yeSA6CisgKiAgICAgWVkvTU0vREQgIHVpZCAgRGVzY3JpcHRpb24KKy0qLworCitpbnQgU0tfcmVhZF9yZWcoaW50IHJlZ19udW1iZXIpCit7CisgICAgU0tfc2V0X1JBUChyZWdfbnVtYmVyKTsKKworICAgIHdyaXRlYihTS19SRVNFVCB8IFNLX1JEQVRBIHwgU0tfUlJFRywgU0tfUE9SVCk7CisgICAgd3JpdGViKFNLX0RPSU8sIFNLX0lPQ09NKTsKKworICAgIHdoaWxlIChyZWFkYihTS19QT1JUKSAmIFNLX0lPUlVOKQorCWJhcnJpZXIoKTsKKyAgICByZXR1cm4gKHJlYWR3KFNLX0lPUkVHKSk7CisKK30gLyogRW5kIG9mIFNLX3JlYWRfcmVnKCkgKi8KKworDAorLyotCisgKiBGdW5jdGlvbiAgICAgICA6IFNLX3JyZWFkX3JlZworICogQXV0aG9yICAgICAgICAgOiBQYXRyaWNrIEouRC4gV2VpY2htYW5uCisgKiBEYXRlIENyZWF0ZWQgICA6IDk0LzA1LzI4CisgKgorICogRGVzY3JpcHRpb24gICAgOiBSZWFkIGRhdGEgZnJvbSBwcmVzZXRlZCByZWdpc3Rlci4KKyAqICAgICAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiByZXF1aXJlcyB0aGF0IHlvdSBrbm93IHdoaWNoCisgKiAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyIGlzIGFjdHVhbGx5IHNldC4gQmUgYXdhcmUgdGhhdCBDU1IxLTMKKyAqICAgICAgICAgICAgICAgICAgY2FuIG9ubHkgYmUgYWNjZXNzZWQgd2hlbiBpbiBDU1IwIFNUT1AgaXMgc2V0LgorICoKKyAqIFJldHVybiBWYWx1ZSAgIDogUmVnaXN0ZXIgY29udGVudHMKKyAqIEVycm9ycyAgICAgICAgIDogTm9uZQorICogR2xvYmFscyAgICAgICAgOiBTS19SQU0gKmJvYXJkIC0gU0tfUkFNIHN0cnVjdHVyZSBwb2ludGVyCisgKiBVcGRhdGUgSGlzdG9yeSA6CisgKiAgICAgWVkvTU0vREQgIHVpZCAgRGVzY3JpcHRpb24KKy0qLworCitpbnQgU0tfcnJlYWRfcmVnKHZvaWQpCit7CisgICAgd3JpdGViKFNLX1JFU0VUIHwgU0tfUkRBVEEgfCBTS19SUkVHLCBTS19QT1JUKTsKKworICAgIHdyaXRlYihTS19ET0lPLCBTS19JT0NPTSk7CisKKyAgICB3aGlsZSAocmVhZGIoU0tfUE9SVCkgJiBTS19JT1JVTikKKwliYXJyaWVyKCk7CisgICAgcmV0dXJuIChyZWFkdyhTS19JT1JFRykpOworCit9IC8qIEVuZCBvZiBTS19ycmVhZF9yZWcoKSAqLworCisMCisvKi0KKyAqIEZ1bmN0aW9uICAgICAgIDogU0tfd3JpdGVfcmVnCisgKiBBdXRob3IgICAgICAgICA6IFBhdHJpY2sgSi5ELiBXZWljaG1hbm4KKyAqIERhdGUgQ3JlYXRlZCAgIDogOTQvMDUvMjUKKyAqCisgKiBEZXNjcmlwdGlvbiAgICA6IFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgUkFQIHRoZW4gZmlsbHMgaW4gdGhlCisgKiAgICAgICAgICAgICAgICAgIExBTkNFIEkvTyBSZWcgYW5kIHN0YXJ0cyBUcmFuc2ZlciB0byBMQU5DRS4KKyAqICAgICAgICAgICAgICAgICAgSXQgd2FpdHMgdW50aWwgdHJhbnNmZXIgaGFzIGVuZGVkIHdoaWNoIGlzIG1heC4gNyBtcworICogICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpdCByZXR1cm5zLgorICoKKyAqIFBhcmFtZXRlcnMgICAgIDogSSA6IHJlZ19udW1iZXIgLSB3aGljaCBDU1IgdG8gd3JpdGUgdG8KKyAqICAgICAgICAgICAgICAgICAgSSA6IHZhbHVlICAgICAgLSB3aGF0IHZhbHVlIHRvIGZpbGwgaW50byByZWdpc3RlciAKKyAqIFJldHVybiBWYWx1ZSAgIDogTm9uZQorICogRXJyb3JzICAgICAgICAgOiBOb25lCisgKiBHbG9iYWxzICAgICAgICA6IFNLX1JBTSAqYm9hcmQgLSBTS19SQU0gc3RydWN0dXJlIHBvaW50ZXIKKyAqIFVwZGF0ZSBIaXN0b3J5IDoKKyAqICAgICBZWS9NTS9ERCAgdWlkICBEZXNjcmlwdGlvbgorLSovCisKK3ZvaWQgU0tfd3JpdGVfcmVnKGludCByZWdfbnVtYmVyLCBpbnQgdmFsdWUpCit7CisgICAgU0tfc2V0X1JBUChyZWdfbnVtYmVyKTsKKworICAgIHdyaXRldyh2YWx1ZSwgU0tfSU9SRUcpOworICAgIHdyaXRlYihTS19SRVNFVCB8IFNLX1JEQVRBIHwgU0tfV1JFRywgU0tfUE9SVCk7CisgICAgd3JpdGViKFNLX0RPSU8sIFNLX0lPQ09NKTsKKworICAgIHdoaWxlIChyZWFkYihTS19QT1JUKSAmIFNLX0lPUlVOKQorCWJhcnJpZXIoKTsKK30gLyogRW5kIG9mIFNLX3dyaXRlX3JlZyAqLworCisMCisKKy8qIAorICogRGVidWdnaW5nIGZ1bmN0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qLQorICogRnVuY3Rpb24gICAgICAgOiBTS19wcmludF9wb3MKKyAqIEF1dGhvciAgICAgICAgIDogUGF0cmljayBKLkQuIFdlaWNobWFubgorICogRGF0ZSBDcmVhdGVkICAgOiA5NC8wNS8yNQorICoKKyAqIERlc2NyaXB0aW9uICAgIDogVGhpcyBmdW5jdGlvbiBwcmludHMgb3V0IHRoZSA0IFBPUyAoUHJvZ3JhbW1hYmxlCisgKiAgICAgICAgICAgICAgICAgIE9wdGlvbiBTZWxlY3QpIFJlZ2lzdGVycy4gVXNlZCBtYWlubHkgdG8gZGVidWcgb3BlcmF0aW9uLgorICoKKyAqIFBhcmFtZXRlcnMgICAgIDogSSA6IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgLSBTS19HMTYgZGV2aWNlIHN0cnVjdHVyZQorICogICAgICAgICAgICAgICAgICBJIDogY2hhciAqIC0gVGV4dCB3aGljaCB3aWxsIGJlIHByaW50ZWQgYXMgdGl0bGUKKyAqIFJldHVybiBWYWx1ZSAgIDogTm9uZQorICogRXJyb3JzICAgICAgICAgOiBOb25lCisgKiBVcGRhdGUgSGlzdG9yeSA6CisgKiAgICAgWVkvTU0vREQgIHVpZCAgRGVzY3JpcHRpb24KKy0qLworCit2b2lkIFNLX3ByaW50X3BvcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICp0ZXh0KQoreworICAgIGludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIHVuc2lnbmVkIGNoYXIgcG9zMCA9IGluYihTS19QT1MwKSwKKwkJICBwb3MxID0gaW5iKFNLX1BPUzEpLAorCQkgIHBvczIgPSBpbmIoU0tfUE9TMiksCisJCSAgcG9zMyA9IGluYihTS19QT1MzKSwKKwkJICBwb3M0ID0gaW5iKFNLX1BPUzQpOworCisKKyAgICBwcmludGsoIiMjICVzOiAlcy5cbiIKKyAgICAgICAgICAgIiMjICAgcG9zMD0lIzR4IHBvczE9JSM0eCBwb3MyPSUjMDR4IHBvczM9JSMwOHggcG9zND0lIzA0eFxuIiwKKyAgICAgICAgICAgU0tfTkFNRSwgdGV4dCwgcG9zMCwgcG9zMSwgcG9zMiwgKHBvczM8PDE0KSwgcG9zNCk7CisKK30gLyogRW5kIG9mIFNLX3ByaW50X3BvcygpICovCisKKworDAorLyotCisgKiBGdW5jdGlvbiAgICAgICA6IFNLX3ByaW50X2RldgorICogQXV0aG9yICAgICAgICAgOiBQYXRyaWNrIEouRC4gV2VpY2htYW5uCisgKiBEYXRlIENyZWF0ZWQgICA6IDk0LzA1LzI1CisgKgorICogRGVzY3JpcHRpb24gICAgOiBUaGlzIGZ1bmN0aW9uIHNpbXBseSBwcmludHMgb3V0IHRoZSBpbXBvcnRhbnQgZmllbGRzCisgKiAgICAgICAgICAgICAgICAgIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLgorICoKKyAqIFBhcmFtZXRlcnMgICAgIDogSSA6IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgIC0gU0tfRzE2IGRldmljZSBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgICAgICAgSSA6IGNoYXIgKnRleHQgLSBUaXRsZSBmb3IgcHJpbnRpbmcKKyAqIFJldHVybiBWYWx1ZSAgIDogTm9uZQorICogRXJyb3JzICAgICAgICAgOiBOb25lCisgKiBVcGRhdGUgSGlzdG9yeSA6CisgKiAgICAgWVkvTU0vREQgIHVpZCAgRGVzY3JpcHRpb24KKy0qLworCit2b2lkIFNLX3ByaW50X2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICp0ZXh0KQoreworICAgIGlmIChkZXYgPT0gTlVMTCkKKyAgICB7CisJcHJpbnRrKCIjIyAlczogRGV2aWNlIFN0cnVjdHVyZS4gJXNcbiIsIFNLX05BTUUsIHRleHQpOworCXByaW50aygiIyMgREVWSUNFID09IE5VTExcbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworCXByaW50aygiIyMgJXM6IERldmljZSBTdHJ1Y3R1cmUuICVzXG4iLCBTS19OQU1FLCB0ZXh0KTsKKwlwcmludGsoIiMjIERldmljZSBOYW1lOiAlcyBCYXNlIEFkZHJlc3M6ICUjMDZseCBJUlE6ICVkXG4iLCAKKyAgICAgICAgICAgICAgIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKwkgICAgICAgCisJcHJpbnRrKCIjIyBuZXh0IGRldmljZTogJSMwOHggaW5pdCBmdW5jdGlvbjogJSMwOHhcbiIsIAorICAgICAgICAgICAgICAoaW50KSBkZXYtPm5leHQsIChpbnQpIGRldi0+aW5pdCk7CisgICAgfQorCit9IC8qIEVuZCBvZiBTS19wcmludF9kZXYoKSAqLworCisKKwwKKy8qLQorICogRnVuY3Rpb24gICAgICAgOiBTS19wcmludF9yYW0KKyAqIEF1dGhvciAgICAgICAgIDogUGF0cmljayBKLkQuIFdlaWNobWFubgorICogRGF0ZSBDcmVhdGVkICAgOiA5NC8wNi8wMgorICoKKyAqIERlc2NyaXB0aW9uICAgIDogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNoZWNrIGhvdyBhcmUgdGhpbmdzIHNldCB1cAorICogICAgICAgICAgICAgICAgICBpbiB0aGUgMTZLQiBSQU0uIEFsc28gdGhlIHBvaW50ZXJzIHRvIHRoZSByZWNlaXZlIGFuZCAKKyAqICAgICAgICAgICAgICAgICAgdHJhbnNtaXQgZGVzY3JpcHRvciByaW5ncyBhbmQgcnggYW5kIHR4IGJ1ZmZlcnMgbG9jYXRpb25zLgorICogICAgICAgICAgICAgICAgICBJdCBjb250YWlucyBhIG1pbm9yIGJ1ZyBpbiBwcmludGluZywgYnV0IGhhcyBubyBlZmZlY3QgdG8gdGhlIHZhbHVlcworICogICAgICAgICAgICAgICAgICBvbmx5IG5ld2xpbmVzIGFyZSBub3QgY29ycmVjdC4KKyAqCisgKiBQYXJhbWV0ZXJzICAgICA6IEkgOiBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2IC0gU0tfRzE2IGRldmljZSBzdHJ1Y3R1cmUKKyAqIFJldHVybiBWYWx1ZSAgIDogTm9uZQorICogRXJyb3JzICAgICAgICAgOiBOb25lCisgKiBHbG9iYWxzICAgICAgICA6IE5vbmUKKyAqIFVwZGF0ZSBIaXN0b3J5IDoKKyAqICAgICBZWS9NTS9ERCAgdWlkICBEZXNjcmlwdGlvbgorLSovCisKK3ZvaWQgX19pbml0IFNLX3ByaW50X3JhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisgICAgaW50IGk7ICAgIAorICAgIHN0cnVjdCBwcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgIHByaW50aygiIyMgJXM6IFJBTSBEZXRhaWxzLlxuIgorICAgICAgICAgICAiIyMgICBSQU0gYXQgJSMwOHggdG1kaGVhZDogJSMwOHggcm1kaGVhZDogJSMwOHggaW5pdGJsb2NrOiAlIzA4eFxuIiwKKyAgICAgICAgICAgU0tfTkFNRSwgCisgICAgICAgICAgICh1bnNpZ25lZCBpbnQpIHAtPnJhbSwKKyAgICAgICAgICAgKHVuc2lnbmVkIGludCkgcC0+dG1kaGVhZCwgCisgICAgICAgICAgICh1bnNpZ25lZCBpbnQpIHAtPnJtZGhlYWQsIAorICAgICAgICAgICAodW5zaWduZWQgaW50KSAmKHAtPnJhbSktPmliKTsKKyAgICAgICAgICAgCisgICAgcHJpbnRrKCIjIyAgICIpOworCisgICAgZm9yKGkgPSAwOyBpIDwgVE1ETlVNOyBpKyspCisgICAgeworICAgICAgICAgICBpZiAoIShpICUgMykpIC8qIEV2ZXJ5IHRoaXJkIGxpbmUgZG8gYSBuZXdsaW5lICovCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHByaW50aygiXG4jIyAgICIpOworICAgICAgICAgICB9CisgICAgICAgIHByaW50aygidG1kYnVmcyVkOiAlIzA4eCAiLCAoaSsxKSwgKGludCkgcC0+dG1kYnVmc1tpXSk7CisgICAgfQorICAgIHByaW50aygiIyMgICAiKTsKKworICAgIGZvcihpID0gMDsgaSA8IFJNRE5VTTsgaSsrKQorICAgIHsKKyAgICAgICAgIGlmICghKGkgJSAzKSkgLyogRXZlcnkgdGhpcmQgbGluZSBkbyBhIG5ld2xpbmUgKi8KKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcHJpbnRrKCJcbiMjICAgIik7CisgICAgICAgICAgIH0KKyAgICAgICAgcHJpbnRrKCJybWRidWZzJWQ6ICUjMDh4ICIsIChpKzEpLCAoaW50KSBwLT5ybWRidWZzW2ldKTsKKyAgICB9IAorICAgIHByaW50aygiXG4iKTsKKworfSAvKiBFbmQgb2YgU0tfcHJpbnRfcmFtKCkgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tfZzE2LmggYi9kcml2ZXJzL25ldC9za19nMTYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTVkYzA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tfZzE2LmgKQEAgLTAsMCArMSwxNjUgQEAKKy8qLQorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogTW9kdWxlICAgICAgICAgOiBza19nMTYuaAorICogVmVyc2lvbiAgICAgICAgOiAkUmV2aXNpb24kICAKKyAqCisgKiBBdXRob3IgICAgICAgICA6IE0uSGlwcCAobWhpcHBAc3R1ZGVudC51bmktdHVlYmluZ2VuLmRlKQorICogY2hhbmdlcyBieSAgICAgOiBQYXRyaWNrIEouRC4gV2VpY2htYW5uCisgKgorICogRGF0ZSBDcmVhdGVkICAgOiA5NC8wNS8yNQorICoKKyAqIERlc2NyaXB0aW9uICAgIDogSW4gaGVyZSBhcmUgYWxsIG5lY2Vzc2FyeSBkZWZpbml0aW9ucyBvZiAgCisgKiAgICAgICAgICAgICAgICAgIHRoZSBhbTc5OTAgKExBTkNFKSBjaGlwIHVzZWQgZm9yIHdyaXRpbmcgYQorICogICAgICAgICAgICAgICAgICBuZXR3b3JrIGRldmljZSBkcml2ZXIgd2hpY2ggdXNlcyB0aGlzIGNoaXAgCisgKgorICogJExvZyQKKy0qLworCisjaWZuZGVmIFNLX0cxNl9ICisKKyNkZWZpbmUgU0tfRzE2X0gKKworCisvKgorICogCUNvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlciAwIChDU1IwKSBiaXQgZGVmaW5pdGlvbnMKKyAqCisgKiAoUj1SZWFkYWJsZSkgKFc9V3JpdGVhYmxlKSAoUz1TZXQgb24gd3JpdGUpIChDLUNsZWFyIG9uIHdyaXRlKQorICoKKyAqLworCisjZGVmaW5lIENTUjBfRVJSCTB4ODAwMAkvKiBFcnJvciBzdW1tYXJ5IChSKSAqLworI2RlZmluZSBDU1IwX0JBQkwJMHg0MDAwCS8qIEJhYmJsZSB0cmFuc21pdHRlciB0aW1lb3V0IGVycm9yIChSQykgKi8KKyNkZWZpbmUgQ1NSMF9DRVJSCTB4MjAwMAkvKiBDb2xsaXNpb24gRXJyb3IgKFJDKSAqLworI2RlZmluZSBDU1IwX01JU1MJMHgxMDAwCS8qIE1pc3NlZCBwYWNrZXQgKFJDKSAqLworI2RlZmluZSBDU1IwX01FUlIJMHgwODAwCS8qIE1lbW9yeSBFcnJvciAgKFJDKSAqLyAKKyNkZWZpbmUgQ1NSMF9SSU5UCTB4MDQwMAkvKiBSZWNlaXZlciBJbnRlcnJ1cHQgKFJDKSAqLworI2RlZmluZSBDU1IwX1RJTlQgICAgICAgMHgwMjAwCS8qIFRyYW5zbWl0IEludGVycnVwdCAoUkMpICovIAorI2RlZmluZSBDU1IwX0lET04JMHgwMTAwCS8qIEluaXRpYWxpemF0aW9uIERvbmUgKFJDKSAqLworI2RlZmluZSBDU1IwX0lOVFIJMHgwMDgwCS8qIEludGVycnVwdCBGbGFnIChSKSAqLworI2RlZmluZSBDU1IwX0lORUEJMHgwMDQwCS8qIEludGVycnVwdCBFbmFibGUgKFJXKSAqLworI2RlZmluZSBDU1IwX1JYT04JMHgwMDIwCS8qIFJlY2VpdmVyIG9uIChSKSAqLworI2RlZmluZSBDU1IwX1RYT04JMHgwMDEwICAvKiBUcmFuc21pdHRlciBvbiAoUikgKi8KKyNkZWZpbmUgQ1NSMF9URE1ECTB4MDAwOAkvKiBUcmFuc21pdCBEZW1hbmQgKFJTKSAqLworI2RlZmluZSBDU1IwX1NUT1AJMHgwMDA0IAkvKiBTdG9wIChSUykgKi8KKyNkZWZpbmUgQ1NSMF9TVFJUCTB4MDAwMgkvKiBTdGFydCAoUlMpICovCisjZGVmaW5lIENTUjBfSU5JVAkweDAwMDEJLyogSW5pdGlhbGl6ZSAoUlMpICovCisKKyNkZWZpbmUgQ1NSMF9DTFJBTEwgICAgIDB4N2YwMCAgLyogbWFzayBmb3IgYWxsIGNsZWFyYWJsZSBiaXRzICovCisKKy8qCisgKiAgICBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgMyAoQ1NSMykgYml0IGRlZmluaXRpb25zCisgKgorICovCisKKyNkZWZpbmUgQ1NSM19CU1dBUAkweDAwMDQJLyogQnl0ZSBTd2FwIChSVykgKi8KKyNkZWZpbmUgQ1NSM19BQ09OCTB4MDAwMiAgLyogQUxFIENvbnRyb2wgKFJXKSAqLworI2RlZmluZSBDU1IzX0JDT04JMHgwMDAxCS8qIEJ5dGUgQ29udHJvbCAoUlcpICovCisKKy8qCisgKglJbml0aWFsaXphdGlvbiBCbG9jayBNb2RlIG9wZXJhdGlvbiBCaXQgRGVmaW5pdGlvbnMuCisgKi8KKworI2RlZmluZSBNT0RFX1BST00JMHg4MDAwCS8qIFByb21pc2N1b3VzIE1vZGUgKi8KKyNkZWZpbmUgTU9ERV9JTlRMCTB4MDA0MCAgLyogSW50ZXJuYWwgTG9vcGJhY2sgKi8KKyNkZWZpbmUgTU9ERV9EUlRZCTB4MDAyMCAgLyogRGlzYWJsZSBSZXRyeSAqLyAKKyNkZWZpbmUgTU9ERV9DT0xMCTB4MDAxMAkvKiBGb3JjZSBDb2xsaXNpb24gKi8KKyNkZWZpbmUgTU9ERV9EVENSCTB4MDAwOAkvKiBEaXNhYmxlIFRyYW5zbWl0IENSQykgKi8KKyNkZWZpbmUgTU9ERV9MT09QCTB4MDAwNAkvKiBMb29wYmFjayAqLworI2RlZmluZSBNT0RFX0RUWAkweDAwMDIJLyogRGlzYWJsZSB0aGUgVHJhbnNtaXR0ZXIgKi8gCisjZGVmaW5lIE1PREVfRFJYCTB4MDAwMSAgLyogRGlzYWJsZSB0aGUgUmVjZWl2ZXIgKi8KKworI2RlZmluZSBNT0RFX05PUk1BTCAJMHgwMDAwICAvKiBOb3JtYWwgb3BlcmF0aW9uIG1vZGUgKi8KKworLyoKKyAqIAlSZWNlaXZlIG1lc3NhZ2UgZGVzY3JpcHRvciBzdGF0dXMgYml0IGRlZmluaXRpb25zLgorICovCisKKyNkZWZpbmUgUlhfT1dOCQkweDgwCS8qIE93bmVyIGJpdCAwID0gaG9zdCwgMSA9IGxhbmNlICovCisjZGVmaW5lIFJYX0VSUgkJMHg0MAkvKiBFcnJvciBTdW1tYXJ5ICovCisjZGVmaW5lIFJYX0ZSQU0JCTB4MjAJLyogRnJhbWluZyBFcnJvciAqLworI2RlZmluZSBSWF9PRkxPCQkweDEwCS8qIE92ZXJmbG93IEVycm9yICovCisjZGVmaW5lIFJYX0NSQwkJMHgwOAkvKiBDUkMgRXJyb3IgKi8gCisjZGVmaW5lIFJYX0JVRkYJCTB4MDQJLyogQnVmZmVyIEVycm9yICovCisjZGVmaW5lIFJYX1NUUAkJMHgwMgkvKiBTdGFydCBvZiBQYWNrZXQgKi8KKyNkZWZpbmUgUlhfRU5QCQkweDAxCS8qIEVuZCBvZiBQYWNrZXQgKi8KKworCisvKgorICoJVHJhbnNtaXQgbWVzc2FnZSBkZXNjcmlwdG9yIHN0YXR1cyBiaXQgZGVmaW5pdGlvbnMuCisgKi8KKworI2RlZmluZSBUWF9PV04JCTB4ODAJLyogT3duZXIgYml0IDAgPSBob3N0LCAxID0gbGFuY2UgKi8KKyNkZWZpbmUgVFhfRVJSCQkweDQwICAgIC8qIEVycm9yIFN1bW1hcnkgKi8KKyNkZWZpbmUgVFhfTU9SRQkJMHgxMAkvKiBNb3JlIHRoZSAxIHJldHJ5IG5lZWRlZCB0byBYbWl0ICovCisjZGVmaW5lIFRYX09ORQkJMHgwOAkvKiBPbmUgcmV0cnkgbmVlZGVkIHRvIFhtaXQgKi8KKyNkZWZpbmUgVFhfREVGCQkweDA0CS8qIERlZmVycmVkICovCisjZGVmaW5lIFRYX1NUUCAJCTB4MDIJLyogU3RhcnQgb2YgUGFja2V0ICovCisjZGVmaW5lIFRYX0VOUAkJMHgwMQkvKiBFbmQgb2YgUGFja2V0ICovCisKKy8qCisgKiAgICAgIFRyYW5zbWl0IHN0YXR1cyAoMikgKHZhbGlkIGlmIFRYX0VSUiA9PSAxKQorICovCisKKyNkZWZpbmUgVFhfQlVGRiAJMHg4MDAwICAvKiBCdWZmZXJpbmcgZXJyb3IgKG5vIEVOUCkgKi8KKyNkZWZpbmUgVFhfVUZMTyAJMHg0MDAwICAvKiBVbmRlcmZsb3cgKGxhdGUgbWVtb3J5KSAqLworI2RlZmluZSBUWF9MQ09MIAkweDEwMDAgIC8qIExhdGUgY29sbGlzaW9uICovCisjZGVmaW5lIFRYX0xDQVIgCTB4MDQwMCAgLyogTG9zcyBvZiBDYXJyaWVyICovCisjZGVmaW5lIFRYX1JUUlkgCTB4MDIwMCAgLyogRmFpbGVkIGFmdGVyIDE2IHJldHJhbnNtaXNzaW9ucyAgKi8KKyNkZWZpbmUgVFhfVERSICAgICAgICAgIDB4MDAzZiAgLyogVGltZS1kb21haW4tcmVmbGVjdG9tZXRlci12YWx1ZSAqLworCisKKy8qIAorICogU3RydWN0dXJlcyB1c2VkIGZvciBDb21tdW5pY2F0aW9uIHdpdGggdGhlIExBTkNFIAorICovCisKKy8qIExBTkNFIEluaXRpYWxpemUgQmxvY2sgKi8KKworc3RydWN0IGluaXRfYmxvY2sgCit7CisgIHVuc2lnbmVkIHNob3J0IG1vZGU7ICAgICAvKiBNb2RlIFJlZ2lzdGVyICovCisgIHVuc2lnbmVkIGNoYXIgIHBhZGRyWzZdOyAvKiBQaHlzaWNhbCBBZGRyZXNzIChNQUMpICovCisgIHVuc2lnbmVkIGNoYXIgIGxhZGRyWzhdOyAvKiBMb2dpY2FsIEZpbHRlciBBZGRyZXNzIChub3QgdXNlZCkgKi8KKyAgdW5zaWduZWQgaW50ICAgcmRycDsgICAgIC8qIFJlY2VpdmUgRGVzY3JpcHRvciBSaW5nIHBvaW50ZXIgKi8KKyAgdW5zaWduZWQgaW50ICAgdGRycDsgICAgIC8qIFRyYW5zbWl0IERlc2NyaXB0b3IgUmluZyBwb2ludGVyICovCit9OworCisKKy8qIFJlY2VpdmUgTWVzc2FnZSBEZXNjcmlwdG9yIEVudHJ5ICovCisKK3N0cnVjdCBybWQgCit7IAorICB1bmlvbgorICB7CisgICAgdW5zaWduZWQgbG9uZyBidWZmZXI7ICAgICAvKiBBZGRyZXNzIG9mIGJ1ZmZlciAqLworICAgIHN0cnVjdCAKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyIHVudXNlZFszXTsgCisgICAgICB1bnNpZ25lZCB2b2xhdGlsZSBjaGFyIHN0YXR1czsgICAvKiBTdGF0dXMgQml0cyAqLworICAgIH0gczsKKyAgfSB1OworICB2b2xhdGlsZSBzaG9ydCBibGVuOyAgICAgICAgLyogQnVmZmVyIExlbmd0aCAodHdvJ3MgY29tcGxlbWVudCkgKi8KKyAgdW5zaWduZWQgc2hvcnQgbWxlbjsgICAgICAgIC8qIE1lc3NhZ2UgQnl0ZSBDb3VudCAqLworfTsKKworCisvKiBUcmFuc21pdCBNZXNzYWdlIERlc2NyaXB0b3IgRW50cnkgKi8KKworc3RydWN0IHRtZCAgIAoreworICB1bmlvbiAKKyAgeworICAgIHVuc2lnbmVkIGxvbmcgIGJ1ZmZlcjsgICAgLyogQWRkcmVzcyBvZiBidWZmZXIgKi8KKyAgICBzdHJ1Y3QgCisgICAgeworICAgICAgdW5zaWduZWQgY2hhciB1bnVzZWRbM107CisgICAgICB1bnNpZ25lZCB2b2xhdGlsZSBjaGFyIHN0YXR1czsgICAvKiBTdGF0dXMgQml0cyAqLworICAgIH0gczsKKyAgfSB1OworICB1bnNpZ25lZCBzaG9ydCBibGVuOyAgICAgICAgICAgICAvKiBCdWZmZXIgTGVuZ3RoICh0d28ncyBjb21wbGVtZW50KSAqLworICB1bnNpZ25lZCB2b2xhdGlsZSBzaG9ydCBzdGF0dXMyOyAvKiBFcnJvciBTdGF0dXMgQml0cyAqLworfTsKKworI2VuZGlmIC8qIEVuZCBvZiBTS19HMTZfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tfbWNhLmMgYi9kcml2ZXJzL25ldC9za19tY2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzU2YjhkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tfbWNhLmMKQEAgLTAsMCArMSwxMjE3IEBACisvKiAKK25ldC0zLWRyaXZlciBmb3IgdGhlIFNLTkVUIE1DQS1iYXNlZCBjYXJkcworCitUaGlzIGlzIGFuIGV4dGVuc2lvbiB0byB0aGUgTGludXggb3BlcmF0aW5nIHN5c3RlbSwgYW5kIGlzIGNvdmVyZWQgYnkgdGhlCitzYW1lIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoYXQgY292ZXJzIHRoYXQgd29yay4KKworQ29weXJpZ2h0IDE5OTkgYnkgQWxmcmVkIEFybm9sZCAoYWxmcmVkQGNjYWMucnd0aC1hYWNoZW4uZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGZyZWQuYXJub2xkQGxhbmNvbS5kZSkKKworVGhpcyBkcml2ZXIgaXMgYmFzZWQgYm90aCBvbiB0aGUgM0M1MjMgZHJpdmVyIGFuZCB0aGUgU0tfRzE2IGRyaXZlci4KKworcGFwZXIgc291cmNlczoKKyAgJ1BDIEhhcmR3YXJlOiBBdWZiYXUsIEZ1bmt0aW9uc3dlaXNlLCBQcm9ncmFtbWllcnVuZycgYnkgCisgIEhhbnMtUGV0ZXIgTWVzc21lciBmb3IgdGhlIGJhc2ljIE1pY3JvY2hhbm5lbCBzdHVmZgorICAKKyAgJ0xpbnV4IEdlcmFldGV0cmVpYmVyJyBieSBBbGxlc2FuZHJvIFJ1YmluaSwgS2FsbGUgRGFsaGVpbWVyCisgIGZvciBoZWxwIG9uIEV0aGVybmV0IGRyaXZlciBwcm9ncmFtbWluZworCisgICdFdGhlcm5ldC9JRUVFIDgwMi4zIEZhbWlseSAxOTkyIFdvcmxkIE5ldHdvcmsgRGF0YSBCb29rL0hhbmRib29rJyBieSBBTUQKKyAgZm9yIGRvY3VtZW50YXRpb24gb24gdGhlIEFNNzk5MCBMQU5DRQorCisgICdTS05FVCBQZXJzb25hbCBUZWNobmlzY2hlcyBNYW51YWwnLCBWZXJzaW9uIDEuMiBieSBTY2huZWlkZXImS29jaAorICBmb3IgZG9jdW1lbnRhdGlvbiBvbiB0aGUgSnVuaW9yIGJvYXJkCisKKyAgJ1NLLU5FVCBNQzIrIFRlY2huaWNhbCBNYW51YWwiLCBWZXJzaW9uIDEuMSBieSBTY2huZWlkZXImS29jaCBmb3IKKyAgZG9jdW1lbnRhdGlvbiBvbiB0aGUgTUMyIGJvcmQKKyAgCisgIEEgYmlnIHRoYW5rIHlvdSB0byB0aGUgUyZLIHN1cHBvcnQgZm9yIHByb3ZpZGluZyBtZSBzbyBxdWlja2x5IHdpdGgKKyAgZG9jdW1lbnRhdGlvbiEKKworICBBbHNvIHNlZSBodHRwOi8vd3d3LnN5c2tvbm5lY3QuY29tLworCisgIE1pc3NpbmcgdGhpbmdzOgorCisgIC0+IHNldCBkZWJ1ZyBsZXZlbCB2aWEgaW9jdGwgaW5zdGVhZCBvZiBjb21waWxlLXRpbWUgc3dpdGNoZXMKKyAgLT4gSSBkaWRuJ3QgZm9sbG93IHRoZSBkZXZlbG9wbWVudCBvZiB0aGUgMi4xLngga2VybmVscywgc28gbXkKKyAgICAgYXNzdW1wdGlvbnMgYWJvdXQgd2hpY2ggdGhpbmdzIGNoYW5nZWQgd2l0aCB3aGljaCBrZXJuZWwgdmVyc2lvbiAKKyAgICAgYXJlIHByb2JhYmx5IG5vbnNlbnNlCisKK0hpc3Rvcnk6CisgIE1heSAxNnRoLCAxOTk5CisgIAlzdGFydHVwCisgIE1heSAyMnN0LCAxOTk5CisJYWRkZWQgcHJpdmF0ZSBzdHJ1Y3R1cmUsIG1ldGhvZHMKKyAgICAgICAgYmVndW4gYnVpbGRpbmcgZGF0YSBzdHJ1Y3R1cmVzIGluIFJBTQorICBNYXkgMjNuZCwgMTk5OQorCWNhbiByZWNlaXZlIGZyYW1lcywgc2VuZCBmcmFtZXMKKyAgTWF5IDI0dGgsIDE5OTkKKyAgICAgICAgbW9kdWxhcml6ZWQgaW5pdGlhbGl6YXRpb24gb2YgTEFOQ0UKKyAgICAgICAgbG9hZGFibGUgYXMgbW9kdWxlCisJc3RpbGwgVHggcHJvYmxlbSA6LSgKKyAgTWF5IDI2dGgsIDE5OTkKKyAgCU1DMiB3b3JrcworICAJc3VwcG9ydCBmb3IgbXVsdGlwbGUgZGV2aWNlcworICAJZGlzcGxheSBtZWRpYSB0eXBlIGZvciBNQzIrCisgIE1heSAyOHRoLCAxOTk5CisJZml4ZWQgcHJvYmxlbSBpbiBHZXRMQU5DRSBsZWF2aW5nIGludGVycnVwdHMgdHVybmVkIG9mZgorICAgICAgICBpbmNyZWFzZSBUWCBxdWV1ZSB0byA0IHBhY2tldHMgdG8gaW1wcm92ZSBzZW5kIHBlcmZvcm1hbmNlCisgIE1heSAyOXRoLCAxOTk5CisJYSBmZXcgY29ycmVjdGlvbnMgaW4gc3RhdGlzdGljcywgY2F1Z2h0IHJjdnIgb3ZlcnJ1bnMgCisgICAgICAgIHJlaW5pdGlhbGl6YXRpb24gb2YgTEFOQ0UvYm9hcmQgaW4gY3JpdGljYWwgc2l0dWF0aW9ucworICAgICAgICBNQ0EgaW5mbyBpbXBsZW1lbnRlZAorCWltcGxlbWVudGVkIExBTkNFIG11bHRpY2FzdCBmaWx0ZXIKKyAgSnVuIDZ0aCwgMTk5OQorCWFkZGl0aW9ucyBmb3IgTGludXggMi4yCisgIERlYyAyNXRoLCAxOTk5CisgIAl1bmZvcnR1bmF0ZWx5IHRoZXJlIHNlZW0gdG8gYmUgbmV3ZXIgTUMyKyBib2FyZHMgdGhhdCByZWFjdAorICAJb24gSVJRIDMvNS85LzEwIGluc3RlYWQgb2YgMy81LzEwLzExLCBzbyB3ZSBoYXZlIHRvIGF1dG9wcm9iZQorICAJaW4gcXVlc3Rpb25hYmxlIGNhc2VzLi4uCisgIERlYyAyOHRoLCAxOTk5CisJaW50ZWdyYXRlZCBwYXRjaGVzIGZyb20gRGF2aWQgV2VpbmVoYWxsICYgQmlsbCBXZW5kbGluZyBmb3IgMi4zCisJa2VybmVscyAoaXNhXy4uLmZ1bmN0aW9ucykuICBUaGluZ3MgYXJlIGRlZmluZWQgaW4gYSB3YXkgdGhhdAorICAgICAgICBpdCBzdGlsbCB3b3JrcyB3aXRoIDIuMC54IDgtKQorICBEZWMgMzB0aCwgMTk5OQorCWFkZGVkIGhhbmRsaW5nIG9mIHRoZSByZW1haW5pbmcgaW50ZXJydXB0IGNvbmRpdGlvbnMuICBUaGF0CisgICAgICAgIHNob3VsZCBjdXJlIHRoZSBzcHVyaW91cyBoYW5ncy4KKyAgSmFuIDMwdGgsIDIwMDAKKwluZXdlciBrZXJuZWxzIGF1dG9tYXRpY2FsbHkgcHJvYmUgbW9yZSB0aGFuIG9uZSBib2FyZCwgc28gdGhlCisJJ3N0YXJ0c2xvdCcgYXMgYSB2YXJpYWJsZSBpcyBhbHNvIG5lZWRlZCBoZXJlCisgIEp1bmUgMXN0LCAyMDAwCisJYWRkZWQgY2hhbmdlcyBmb3IgcmVjZW50IDIuMyBrZXJuZWxzCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbWNhLWxlZ2FjeS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBfU0tfTUNBX0RSSVZFUl8KKyNpbmNsdWRlICJza19tY2EuaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBnbG9iYWwgc3RhdGljIGRhdGEgLSBub3QgbW9yZSBzaW5jZSB3ZSBjYW4gaGFuZGxlIG11bHRpcGxlIGJvYXJkcyBhbmQKKyAqIGhhdmUgdG8gcGFjayBhbGwgc3RhdGUgaW5mbyBpbnRvIHRoZSBkZXZpY2Ugc3RydWN0IQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjaGFyICpNZWRpYU5hbWVzW01lZGlhX0NvdW50XSA9CisgICAgeyAiMTBCYXNlMiIsICIxMEJhc2VUIiwgIjEwQmFzZTUiLCAiVW5rbm93biIgfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcG9seVtdID0KKyAgICB7IDEsIDEsIDEsIDAsIDEsIDEsIDAsIDEsIDEsIDAsIDEsIDEsIDEsIDAsIDAsIDAsCisJMSwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBwcml2YXRlIHN1YmZ1bmN0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGR1bXAgcGFydHMgb2Ygc2hhcmVkIG1lbW9yeSAtIG9ubHkgbmVlZGVkIGR1cmluZyBkZWJ1Z2dpbmcgKi8KKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCBkdW1wbWVtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdGFydCwgdTMyIGxlbikKK3sKKwlza21jYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgejsKKworCWZvciAoeiA9IDA7IHogPCBsZW47IHorKykgeworCQlpZiAoKHogJiAxNSkgPT0gMCkKKwkJCXByaW50aygiJTA0eDoiLCB6KTsKKwkJcHJpbnRrKCIgJTAyeCIsIHJlYWRiKHByaXYtPmJhc2UgKyBzdGFydCArIHopKTsKKwkJaWYgKCh6ICYgMTUpID09IDE1KQorCQkJcHJpbnRrKCJcbiIpOworCX0KK30KKworLyogcHJpbnQgZXhhY3QgdGltZSAtIGRpdHRvICovCisKK3N0YXRpYyB2b2lkIFByVGltZSh2b2lkKQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCisJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJcHJpbnRrKCIlOWQ6JTA2ZDogIiwgdHYudHZfc2VjLCB0di50dl91c2VjKTsKK30KKyNlbmRpZgorCisvKiBkZWR1Y2UgcmVzb3VyY2VzIG91dCBvZiBQT1MgcmVnaXN0ZXJzICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBnZXRhZGRycyhpbnQgc2xvdCwgaW50IGp1bmlvciwgaW50ICpiYXNlLCBpbnQgKmlycSwKKwkJICAgICBza21jYV9tZWRpdW0gKiBtZWRpdW0pCit7CisJdV9jaGFyIHBvczAsIHBvczEsIHBvczI7CisKKwlpZiAoanVuaW9yKSB7CisJCXBvczAgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDIpOworCQkqYmFzZSA9ICgocG9zMCAmIDB4MGUpIDw8IDEzKSArIDB4YzAwMDA7CisJCSppcnEgPSAoKHBvczAgJiAweDEwKSA+PiA0KSArIDEwOworCQkqbWVkaXVtID0gTWVkaWFfVW5rbm93bjsKKwl9IGVsc2UgeworCQkvKiByZXNldCBQT1MgMTA0IEJpdHMgMCsxIHNvIHRoZSBzaGFyZWQgbWVtb3J5IHJlZ2lvbiBnb2VzIHRvIHRoZQorCQkgICBjb25maWd1cmVkIGFyZWEgYmV0d2VlbiA2NDBLIGFuZCAxTS4gIEFmdGVyd2FyZHMsIGVuYWJsZSB0aGUgTUMyLgorCQkgICBJIHJlYWxseSBkb24ndCBrbm93IHdoYXQgcm9kZSBTSyB0byBkbyB0aGlzLi4uICovCisKKwkJbWNhX3dyaXRlX3BvcyhzbG90LCA0LAorCQkJICAgICAgbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCA0KSAmIDB4ZmMpOworCQltY2Ffd3JpdGVfcG9zKHNsb3QsIDIsCisJCQkgICAgICBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDIpIHwgMHgwMSk7CisKKwkJcG9zMSA9IG1jYV9yZWFkX3N0b3JlZF9wb3Moc2xvdCwgMyk7CisJCXBvczIgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDQpOworCQkqYmFzZSA9ICgocG9zMSAmIDB4MDcpIDw8IDE0KSArIDB4YzAwMDA7CisJCXN3aXRjaCAocG9zMiAmIDB4MGMpIHsKKwkJY2FzZSAwOgorCQkJKmlycSA9IDM7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJKmlycSA9IDU7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJKmlycSA9IC0xMDsKKwkJCWJyZWFrOworCQljYXNlIDEyOgorCQkJKmlycSA9IC0xMTsKKwkJCWJyZWFrOworCQl9CisJCSptZWRpdW0gPSAocG9zMiA+PiA2KSAmIDM7CisJfQorfQorCisvKiBjaGVjayBmb3IgYm90aCBjYXJkczoKKyAgIFdoZW4gdGhlIE1DMiBpcyB0dXJuZWQgb2ZmLCBpdCB3YXMgY29uZmlndXJlZCBmb3IgbW9yZSB0aGFuIDE1TUIgUkFNLAorICAgaXMgZGlzYWJsZWQgYW5kIHdvbid0IGdldCBkZXRlY3RlZCB1c2luZyB0aGUgc3RhbmRhcmQgcHJvYmUuICBXZQorICAgdGhlcmVmb3JlIGhhdmUgdG8gc2NhbiB0aGUgc2xvdHMgbWFudWFsbHkgOi0oICovCisKK3N0YXRpYyBpbnQgX19pbml0IGRvZmluZChpbnQgKmp1bmlvciwgaW50IGZpcnN0c2xvdCkKK3sKKwlpbnQgc2xvdDsKKwl1bnNpZ25lZCBpbnQgaWQ7CisKKwlmb3IgKHNsb3QgPSBmaXJzdHNsb3Q7IHNsb3QgPCBNQ0FfTUFYX1NMT1RfTlI7IHNsb3QrKykgeworCQlpZCA9IG1jYV9yZWFkX3N0b3JlZF9wb3Moc2xvdCwgMCkKKwkJICAgICsgKCgodW5zaWduZWQgaW50KSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDEpKSA8PCA4KTsKKworCQkqanVuaW9yID0gMDsKKwkJaWYgKGlkID09IFNLTkVUX01DQV9JRCkKKwkJCXJldHVybiBzbG90OworCQkqanVuaW9yID0gMTsKKwkJaWYgKGlkID09IFNLTkVUX0pVTklPUl9NQ0FfSUQpCisJCQlyZXR1cm4gc2xvdDsKKwl9CisJcmV0dXJuIE1DQV9OT1RGT1VORDsKK30KKworLyogcmVzZXQgdGhlIHdob2xlIGJvYXJkICovCisKK3N0YXRpYyB2b2lkIFJlc2V0Qm9hcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlza21jYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXdyaXRlYihDVFJMX1JFU0VUX09OLCBwcml2LT5jdHJsYWRkcik7CisJdWRlbGF5KDEwKTsKKwl3cml0ZWIoQ1RSTF9SRVNFVF9PRkYsIHByaXYtPmN0cmxhZGRyKTsKK30KKworLyogd2FpdCBmb3IgTEFOQ0UgaW50ZXJmYWNlIHRvIGJlY29tZSBub3QgYnVzeSAqLworCitzdGF0aWMgaW50IFdhaXRMQU5DRShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNrbWNhX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCB0ID0gMDsKKworCXdoaWxlICgocmVhZGIocHJpdi0+Y3RybGFkZHIpICYgU1RBVF9JT19CVVNZKSA9PQorCSAgICAgICBTVEFUX0lPX0JVU1kpIHsKKwkJdWRlbGF5KDEpOworCQlpZiAoKyt0ID4gMTAwMCkgeworCQkJcHJpbnRrKCIlczogTEFOQ0UgYWNjZXNzIHRpbWVvdXQiLCBkZXYtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogc2V0IExBTkNFIHJlZ2lzdGVyIC0gbXVzdCBiZSBhdG9taWMgKi8KKworc3RhdGljIHZvaWQgU2V0TEFOQ0Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGFkZHIsIHUxNiB2YWx1ZSkKK3sKKwlza21jYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogd2FpdCB1bnRpbCBubyB0cmFuc2ZlciBpcyBwZW5kaW5nICovCisKKwlXYWl0TEFOQ0UoZGV2KTsKKworCS8qIHRyYW5zZmVyIHJlZ2lzdGVyIGFkZHJlc3MgdG8gUkFQICovCisKKwl3cml0ZWIoQ1RSTF9SRVNFVF9PRkYgfCBDVFJMX1JXX1dSSVRFIHwgQ1RSTF9BRFJfUkFQLCBwcml2LT5jdHJsYWRkcik7CisJd3JpdGV3KGFkZHIsIHByaXYtPmlvcmVnYWRkcik7CisJd3JpdGViKElPQ01EX0dPLCBwcml2LT5jbWRhZGRyKTsKKwl1ZGVsYXkoMSk7CisJV2FpdExBTkNFKGRldik7CisKKwkvKiB0cmFuc2ZlciBkYXRhIHRvIHJlZ2lzdGVyICovCisKKwl3cml0ZWIoQ1RSTF9SRVNFVF9PRkYgfCBDVFJMX1JXX1dSSVRFIHwgQ1RSTF9BRFJfREFUQSwgcHJpdi0+Y3RybGFkZHIpOworCXdyaXRldyh2YWx1ZSwgcHJpdi0+aW9yZWdhZGRyKTsKKwl3cml0ZWIoSU9DTURfR08sIHByaXYtPmNtZGFkZHIpOworCXVkZWxheSgxKTsKKwlXYWl0TEFOQ0UoZGV2KTsKKworCS8qIHJlZW5hYmxlIGludGVycnVwdHMgKi8KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKK30KKworLyogZ2V0IExBTkNFIHJlZ2lzdGVyICovCisKK3N0YXRpYyB1MTYgR2V0TEFOQ0Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGFkZHIpCit7CisJc2ttY2FfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgcmVzOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogd2FpdCB1bnRpbCBubyB0cmFuc2ZlciBpcyBwZW5kaW5nICovCisKKwlXYWl0TEFOQ0UoZGV2KTsKKworCS8qIHRyYW5zZmVyIHJlZ2lzdGVyIGFkZHJlc3MgdG8gUkFQICovCisKKwl3cml0ZWIoQ1RSTF9SRVNFVF9PRkYgfCBDVFJMX1JXX1dSSVRFIHwgQ1RSTF9BRFJfUkFQLCBwcml2LT5jdHJsYWRkcik7CisJd3JpdGV3KGFkZHIsIHByaXYtPmlvcmVnYWRkcik7CisJd3JpdGViKElPQ01EX0dPLCBwcml2LT5jbWRhZGRyKTsKKwl1ZGVsYXkoMSk7CisJV2FpdExBTkNFKGRldik7CisKKwkvKiB0cmFuc2ZlciBkYXRhIGZyb20gcmVnaXN0ZXIgKi8KKworCXdyaXRlYihDVFJMX1JFU0VUX09GRiB8IENUUkxfUldfUkVBRCB8IENUUkxfQURSX0RBVEEsIHByaXYtPmN0cmxhZGRyKTsKKwl3cml0ZWIoSU9DTURfR08sIHByaXYtPmNtZGFkZHIpOworCXVkZWxheSgxKTsKKwlXYWl0TEFOQ0UoZGV2KTsKKwlyZXMgPSByZWFkdyhwcml2LT5pb3JlZ2FkZHIpOworCisJLyogcmVlbmFibGUgaW50ZXJydXB0cyAqLworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJlczsKK30KKworLyogYnVpbGQgdXAgZGVzY3JpcHRvcnMgaW4gc2hhcmVkIFJBTSAqLworCitzdGF0aWMgdm9pZCBJbml0RHNjcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlza21jYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgYnVmYWRkcjsKKworCS8qIFNldCB1cCBUeCBkZXNjcmlwdG9ycy4gVGhlIGJvYXJkIGhhcyBvbmx5IDE2SyBSQU0gc28gYml0cyAxNi4uMjMKKwkgICBhcmUgYWx3YXlzIDAuICovCisKKwlidWZhZGRyID0gUkFNX0RBVEFCQVNFOworCXsKKwkJTEFOQ0VfVHhEZXNjciBkZXNjcjsKKwkJaW50IHo7CisKKwkJZm9yICh6ID0gMDsgeiA8IFRYQ09VTlQ7IHorKykgeworCQkJZGVzY3IuTG93QWRkciA9IGJ1ZmFkZHI7CisJCQlkZXNjci5GbGFncyA9IDA7CisJCQlkZXNjci5MZW4gPSAweGYwMDA7CisJCQlkZXNjci5TdGF0dXMgPSAwOworCQkJbWVtY3B5X3RvaW8ocHJpdi0+YmFzZSArIFJBTV9UWEJBU0UgKworCQkJCSAgICh6ICogc2l6ZW9mKExBTkNFX1R4RGVzY3IpKSwgJmRlc2NyLAorCQkJCSAgIHNpemVvZihMQU5DRV9UeERlc2NyKSk7CisJCQltZW1zZXRfaW8ocHJpdi0+YmFzZSArIGJ1ZmFkZHIsIDAsIFJBTV9CVUZTSVpFKTsKKwkJCWJ1ZmFkZHIgKz0gUkFNX0JVRlNJWkU7CisJCX0KKwl9CisKKwkvKiBkbyB0aGUgc2FtZSBmb3IgdGhlIFJ4IGRlc2NyaXB0b3JzICovCisKKwl7CisJCUxBTkNFX1J4RGVzY3IgZGVzY3I7CisJCWludCB6OworCisJCWZvciAoeiA9IDA7IHogPCBSWENPVU5UOyB6KyspIHsKKwkJCWRlc2NyLkxvd0FkZHIgPSBidWZhZGRyOworCQkJZGVzY3IuRmxhZ3MgPSBSWERTQ1JfRkxBR1NfT1dOOworCQkJZGVzY3IuTWF4TGVuID0gLVJBTV9CVUZTSVpFOworCQkJZGVzY3IuTGVuID0gMDsKKwkJCW1lbWNweV90b2lvKHByaXYtPmJhc2UgKyBSQU1fUlhCQVNFICsKKwkJCQkgICAoeiAqIHNpemVvZihMQU5DRV9SeERlc2NyKSksICZkZXNjciwKKwkJCQkgICBzaXplb2YoTEFOQ0VfUnhEZXNjcikpOworCQkJbWVtc2V0X2lvKHByaXYtPmJhc2UgKyBidWZhZGRyLCAwLCBSQU1fQlVGU0laRSk7CisJCQlidWZhZGRyICs9IFJBTV9CVUZTSVpFOworCQl9CisJfQorfQorCisvKiBjYWxjdWxhdGUgdGhlIGhhc2ggYml0IHBvc2l0aW9uIGZvciBhIGdpdmVuIG11bHRpY2FzdCBhZGRyZXNzCisgICB0YWtlbiBtb3JlIG9yIGxlc3MgZGlyZWN0bHkgZnJvbSB0aGUgQU1EIGRhdGFzaGVldC4uLiAqLworCitzdGF0aWMgdm9pZCBVcGRhdGVDUkModW5zaWduZWQgY2hhciAqQ1JDLCBpbnQgYml0KQoreworCWludCBqOworCisJLyogc2hpZnQgQ1JDIG9uZSBiaXQgKi8KKworCW1lbW1vdmUoQ1JDICsgMSwgQ1JDLCAzMiAqIHNpemVvZih1bnNpZ25lZCBjaGFyKSk7CisJQ1JDWzBdID0gMDsKKworCS8qIGlmIGJpdCBYT1IgY29udHJvbGJpdCA9IDEsIHNldCBDUkMgPSBDUkMgWE9SIHBvbHlub21pYWwgKi8KKworCWlmIChiaXQgXiBDUkNbMzJdKQorCQlmb3IgKGogPSAwOyBqIDwgMzI7IGorKykKKwkJCUNSQ1tqXSBePSBwb2x5W2pdOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IEdldEhhc2goY2hhciAqYWRkcmVzcykKK3sKKwl1bnNpZ25lZCBjaGFyIENSQ1szM107CisJaW50IGksIGJ5dGUsIGhhc2hjb2RlOworCisJLyogYSBtdWx0aWNhc3QgYWRkcmVzcyBoYXMgYml0IDAgaW4gdGhlIGZpcnN0IGJ5dGUgc2V0ICovCisKKwlpZiAoKGFkZHJlc3NbMF0gJiAxKSA9PSAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBpbml0aWFsaXplIENSQyAqLworCisJbWVtc2V0KENSQywgMSwgc2l6ZW9mKENSQykpOworCisJLyogbG9vcCB0aHJvdWdoIGFkZHJlc3MgYml0cyAqLworCisJZm9yIChieXRlID0gMDsgYnl0ZSA8IDY7IGJ5dGUrKykKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCVVwZGF0ZUNSQyhDUkMsIChhZGRyZXNzW2J5dGVdID4+IGkpICYgMSk7CisKKwkvKiBoYXNoY29kZSBpcyB0aGUgNiBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBDUkMgKi8KKworCWhhc2hjb2RlID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQloYXNoY29kZSA9IChoYXNoY29kZSA8PCAxKSArIENSQ1tpXTsKKwlyZXR1cm4gaGFzaGNvZGU7Cit9CisKKy8qIGZlZWQgcmVhZHktYnVpbHQgaW5pdGlhbGl6YXRpb24gYmxvY2sgaW50byBMQU5DRSAqLworCitzdGF0aWMgdm9pZCBJbml0TEFOQ0Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlza21jYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIGJ1aWxkIHVwIGRlc2NyaXB0b3JzLiAqLworCisJSW5pdERzY3JzKGRldik7CisKKwkvKiBuZXh0IFJYIGRlc2NyaXB0b3IgdG8gYmUgcmVhZCBpcyB0aGUgZmlyc3Qgb25lLiAgU2luY2UgdGhlIExBTkNFCisJICAgd2lsbCBzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIHdlIGhhdmUgdG8gCisJICAgcmVzZXQgb3V0IHBvaW50ZXJzIHRvby4gKi8KKworCXByaXYtPm5leHRyeCA9IDA7CisKKwkvKiBubyBUWCBkZXNjcmlwdG9ycyBhY3RpdmUgKi8KKworCXByaXYtPm5leHR0eHB1dCA9IHByaXYtPm5leHR0eGRvbmUgPSBwcml2LT50eGJ1c3kgPSAwOworCisJLyogc2V0IHVwIHRoZSBMQU5DRSBidXMgY29udHJvbCByZWdpc3RlciAtIGNvbnN0YW50IGZvciBTS25ldCBib2FyZHMgKi8KKworCVNldExBTkNFKGRldiwgTEFOQ0VfQ1NSMywKKwkJIENTUjNfQlNXQVBfT0ZGIHwgQ1NSM19BTEVfTE9XIHwgQ1NSM19CQ09OX0hPTEQpOworCisJLyogd3JpdGUgYWRkcmVzcyBvZiBpbml0aWFsaXphdGlvbiBibG9jayBpbnRvIExBTkNFICovCisKKwlTZXRMQU5DRShkZXYsIExBTkNFX0NTUjEsIFJBTV9JTklUQkFTRSAmIDB4ZmZmZik7CisJU2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IyLCAoUkFNX0lOSVRCQVNFID4+IDE2KSAmIDB4ZmYpOworCisJLyogd2UgZG9uJ3QgZ2V0IHJlYWR5IHVudGlsIHRoZSBMQU5DRSBoYXMgcmVhZCB0aGUgaW5pdCBibG9jayAqLworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogbGV0IExBTkNFIHJlYWQgdGhlIGluaXRpYWxpemF0aW9uIGJsb2NrLiAgTEFOQ0UgaXMgcmVhZHkKKwkgICB3aGVuIHdlIHJlY2VpdmUgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJydXB0LiAqLworCisJU2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IwLCBDU1IwX0lORUEgfCBDU1IwX0lOSVQpOworfQorCisvKiBzdG9wIHRoZSBMQU5DRSBzbyB3ZSBjYW4gcmVpbml0aWFsaXplIGl0ICovCisKK3N0YXRpYyB2b2lkIFN0b3BMQU5DRShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIGNhbid0IHRha2UgZnJhbWVzIGFueSBtb3JlICovCisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMsIHN0b3AgaXQgKi8KKworCVNldExBTkNFKGRldiwgTEFOQ0VfQ1NSMCwgQ1NSMF9TVE9QKTsKK30KKworLyogaW5pdGlhbGl6ZSBjYXJkIGFuZCBMQU5DRSBmb3IgcHJvcGVyIG9wZXJhdGlvbiAqLworCitzdGF0aWMgdm9pZCBJbml0Qm9hcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlza21jYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlMQU5DRV9Jbml0QmxvY2sgYmxvY2s7CisKKwkvKiBMYXkgb3V0IHRoZSBzaGFyZWQgUkFNIC0gZmlyc3Qgd2UgY3JlYXRlIHRoZSBpbml0IGJsb2NrIGZvciB0aGUgTEFOQ0UuCisJICAgV2UgZG8gbm90IG92ZXJ3cml0ZSBpdCBsYXRlciBiZWNhdXNlIHdlIG5lZWQgaXQgYWdhaW4gd2hlbiB3ZSBzd2l0Y2gKKwkgICBwcm9taXNjb3VzIG1vZGUgb24vb2ZmLiAqLworCisJYmxvY2suTW9kZSA9IDA7CisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJYmxvY2suTW9kZSB8PSBMQU5DRV9JTklUX1BST007CisJbWVtY3B5KGJsb2NrLlBBZHIsIGRldi0+ZGV2X2FkZHIsIDYpOworCW1lbXNldChibG9jay5MQWRyRiwgMCwgc2l6ZW9mKGJsb2NrLkxBZHJGKSk7CisJYmxvY2suUmRyUCA9IChSQU1fUlhCQVNFICYgMHhmZmZmZmYpIHwgKExSWENPVU5UIDw8IDI5KTsKKwlibG9jay5UZHJQID0gKFJBTV9UWEJBU0UgJiAweGZmZmZmZikgfCAoTFRYQ09VTlQgPDwgMjkpOworCisJbWVtY3B5X3RvaW8ocHJpdi0+YmFzZSArIFJBTV9JTklUQkFTRSwgJmJsb2NrLCBzaXplb2YoYmxvY2spKTsKKworCS8qIGluaXRpYWxpemUgTEFOQ0UuIEltcGxpY2l0bHkgc2V0cyB1cCBvdGhlciBzdHJ1Y3R1cmVzIGluIFJBTS4gKi8KKworCUluaXRMQU5DRShkZXYpOworfQorCisvKiBkZWluaXRpYWxpemUgY2FyZCBhbmQgTEFOQ0UgKi8KKworc3RhdGljIHZvaWQgRGVpbml0Qm9hcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBzdG9wIExBTkNFICovCisKKwlTdG9wTEFOQ0UoZGV2KTsKKworCS8qIHJlc2V0IGJvYXJkICovCisKKwlSZXNldEJvYXJkKGRldik7Cit9CisKKy8qIHByb2JlIGZvciBkZXZpY2UncyBpcnEgKi8KKworc3RhdGljIGludCBfX2luaXQgUHJvYmVJUlEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGltYXNrdmFsLCBuamlmZmllcywgaXJxOworCXUxNiBjc3IwdmFsOworCisJLyogZW5hYmxlIGFsbCBpbnRlcnJ1cHRzICovCisKKwlpbWFza3ZhbCA9IHByb2JlX2lycV9vbigpOworCisJLyogaW5pdGlhbGl6ZSB0aGUgYm9hcmQuIFdhaXQgZm9yIGludGVycnVwdCAnSW5pdGlhbGl6YXRpb24gZG9uZScuICovCisKKwlSZXNldEJvYXJkKGRldik7CisJSW5pdEJvYXJkKGRldik7CisKKwluamlmZmllcyA9IGppZmZpZXMgKyBIWjsKKwlkbyB7CisJCWNzcjB2YWwgPSBHZXRMQU5DRShkZXYsIExBTkNFX0NTUjApOworCX0KKwl3aGlsZSAoKChjc3IwdmFsICYgQ1NSMF9JRE9OKSA9PSAwKSAmJiAoamlmZmllcyAhPSBuamlmZmllcykpOworCisJLyogdHVybiBvZiBpbnRlcnJ1cHRzIGFnYWluICovCisKKwlpcnEgPSBwcm9iZV9pcnFfb2ZmKGltYXNrdmFsKTsKKworCS8qIGlmIHdlIGZvdW5kIHNvbWV0aGluZywgYWNrIHRoZSBpbnRlcnJ1cHQgKi8KKworCWlmIChpcnEpCisJCVNldExBTkNFKGRldiwgTEFOQ0VfQ1NSMCwgY3NyMHZhbCB8IENTUjBfSURPTik7CisKKwkvKiBiYWNrIHRvIGlkbGUgc3RhdGUgKi8KKworCURlaW5pdEJvYXJkKGRldik7CisKKwlyZXR1cm4gaXJxOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGludGVycnVwdCBoYW5kbGVyKHMpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogTEFOQ0UgaGFzIHJlYWQgaW5pdGlhbGl6YXRpb24gYmxvY2sgLT4gc3RhcnQgaXQgKi8KKworc3RhdGljIHUxNiBpcnFzdGFydF9oYW5kbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBvbGRjc3IwKQoreworCS8qIG5vdyB3ZSdyZSByZWFkeSB0byB0cmFuc21pdCAqLworCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJLyogcmVzZXQgSURPTiBiaXQsIHN0YXJ0IExBTkNFICovCisKKwlTZXRMQU5DRShkZXYsIExBTkNFX0NTUjAsIG9sZGNzcjAgfCBDU1IwX0lET04gfCBDU1IwX1NUUlQpOworCXJldHVybiBHZXRMQU5DRShkZXYsIExBTkNFX0NTUjApOworfQorCisvKiBkaWQgd2UgbG9zZSBibG9ja3MgZHVlIHRvIGEgRklGTyBvdmVycnVuID8gKi8KKworc3RhdGljIHUxNiBpcnFtaXNzX2hhbmRsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IG9sZGNzcjApCit7CisJc2ttY2FfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiB1cGRhdGUgc3RhdGlzdGljcyAqLworCisJcHJpdi0+c3RhdC5yeF9maWZvX2Vycm9ycysrOworCisJLyogcmVzZXQgTUlTUyBiaXQgKi8KKworCVNldExBTkNFKGRldiwgTEFOQ0VfQ1NSMCwgb2xkY3NyMCB8IENTUjBfTUlTUyk7CisJcmV0dXJuIEdldExBTkNFKGRldiwgTEFOQ0VfQ1NSMCk7Cit9CisKKy8qIHJlY2VpdmUgaW50ZXJydXB0ICovCisKK3N0YXRpYyB1MTYgaXJxcnhfaGFuZGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgb2xkY3NyMCkKK3sKKwlza21jYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlMQU5DRV9SeERlc2NyIGRlc2NyOworCXVuc2lnbmVkIGludCBkZXNjcmFkZHI7CisKKwkvKiBydW4gdGhyb3VnaCBxdWV1ZSB1bnRpbCB3ZSByZWFjaCBhIGRlc2NyaXB0b3Igd2UgZG8gbm90IG93biAqLworCisJZGVzY3JhZGRyID0gUkFNX1JYQkFTRSArIChwcml2LT5uZXh0cnggKiBzaXplb2YoTEFOQ0VfUnhEZXNjcikpOworCXdoaWxlICgxKSB7CisJCS8qIHJlYWQgZGVzY3JpcHRvciAqLworCQltZW1jcHlfZnJvbWlvKCZkZXNjciwgcHJpdi0+YmFzZSArIGRlc2NyYWRkciwKKwkJCSAgICAgc2l6ZW9mKExBTkNFX1J4RGVzY3IpKTsKKworCQkvKiBpZiB3ZSByZWFjaCBhIGRlc2NyaXB0b3Igd2UgZG8gbm90IG93biwgd2UncmUgZG9uZSAqLworCQlpZiAoKGRlc2NyLkZsYWdzICYgUlhEU0NSX0ZMQUdTX09XTikgIT0gMCkKKwkJCWJyZWFrOworCisjaWZkZWYgREVCVUcKKwkJUHJUaW1lKCk7CisJCXByaW50aygiUmVjZWl2ZSBwYWNrZXQgb24gZGVzY3IgJWQgbGVuICVkXG4iLCBwcml2LT5uZXh0cngsCisJCSAgICAgICBkZXNjci5MZW4pOworI2VuZGlmCisKKwkJLyogZXJyb25lb3VzIHBhY2tldCA/ICovCisJCWlmICgoZGVzY3IuRmxhZ3MgJiBSWERTQ1JfRkxBR1NfRVJSKSAhPSAwKSB7CisJCQlwcml2LT5zdGF0LnJ4X2Vycm9ycysrOworCQkJaWYgKChkZXNjci5GbGFncyAmIFJYRFNDUl9GTEFHU19DUkMpICE9IDApCisJCQkJcHJpdi0+c3RhdC5yeF9jcmNfZXJyb3JzKys7CisJCQllbHNlIGlmICgoZGVzY3IuRmxhZ3MgJiBSWERTQ1JfRkxBR1NfQ1JDKSAhPSAwKQorCQkJCXByaXYtPnN0YXQucnhfZnJhbWVfZXJyb3JzKys7CisJCQllbHNlIGlmICgoZGVzY3IuRmxhZ3MgJiBSWERTQ1JfRkxBR1NfT0ZMTykgIT0gMCkKKwkJCQlwcml2LT5zdGF0LnJ4X2ZpZm9fZXJyb3JzKys7CisJCX0KKworCQkvKiBnb29kIHBhY2tldCA/ICovCisJCWVsc2UgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihkZXNjci5MZW4gKyAyKTsKKwkJCWlmIChza2IgPT0gTlVMTCkKKwkJCQlwcml2LT5zdGF0LnJ4X2Ryb3BwZWQrKzsKKwkJCWVsc2UgeworCQkJCW1lbWNweV9mcm9taW8oc2tiX3B1dChza2IsIGRlc2NyLkxlbiksCisJCQkJCSAgICAgcHJpdi0+YmFzZSArCisJCQkJCSAgICAgZGVzY3IuTG93QWRkciwgZGVzY3IuTGVuKTsKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJCQlwcml2LT5zdGF0LnJ4X3BhY2tldHMrKzsKKwkJCQlwcml2LT5zdGF0LnJ4X2J5dGVzICs9IGRlc2NyLkxlbjsKKwkJCQluZXRpZl9yeChza2IpOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQl9CisJCX0KKworCQkvKiBnaXZlIGRlc2NyaXB0b3IgYmFjayB0byBMQU5DRSAqLworCQlkZXNjci5MZW4gPSAwOworCQlkZXNjci5GbGFncyB8PSBSWERTQ1JfRkxBR1NfT1dOOworCisJCS8qIHVwZGF0ZSBkZXNjcmlwdG9yIGluIHNoYXJlZCBSQU0gKi8KKwkJbWVtY3B5X3RvaW8ocHJpdi0+YmFzZSArIGRlc2NyYWRkciwgJmRlc2NyLAorCQkJICAgc2l6ZW9mKExBTkNFX1J4RGVzY3IpKTsKKworCQkvKiBnbyB0byBuZXh0IGRlc2NyaXB0b3IgKi8KKwkJcHJpdi0+bmV4dHJ4Kys7CisJCWRlc2NyYWRkciArPSBzaXplb2YoTEFOQ0VfUnhEZXNjcik7CisJCWlmIChwcml2LT5uZXh0cnggPj0gUlhDT1VOVCkgeworCQkJcHJpdi0+bmV4dHJ4ID0gMDsKKwkJCWRlc2NyYWRkciA9IFJBTV9SWEJBU0U7CisJCX0KKwl9CisKKwkvKiByZXNldCBSSU5UIGJpdCAqLworCisJU2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IwLCBvbGRjc3IwIHwgQ1NSMF9SSU5UKTsKKwlyZXR1cm4gR2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IwKTsKK30KKworLyogdHJhbnNtaXQgaW50ZXJydXB0ICovCisKK3N0YXRpYyB1MTYgaXJxdHhfaGFuZGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgb2xkY3NyMCkKK3sKKwlza21jYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlMQU5DRV9UeERlc2NyIGRlc2NyOworCXVuc2lnbmVkIGludCBkZXNjcmFkZHI7CisKKwkvKiBjaGVjayBkZXNjcmlwdG9ycyBhdCBtb3N0IHVudGlsIG5vIGJ1c3kgb25lIGlzIGxlZnQgKi8KKworCWRlc2NyYWRkciA9CisJICAgIFJBTV9UWEJBU0UgKyAocHJpdi0+bmV4dHR4ZG9uZSAqIHNpemVvZihMQU5DRV9UeERlc2NyKSk7CisJd2hpbGUgKHByaXYtPnR4YnVzeSA+IDApIHsKKwkJLyogcmVhZCBkZXNjcmlwdG9yICovCisJCW1lbWNweV9mcm9taW8oJmRlc2NyLCBwcml2LT5iYXNlICsgZGVzY3JhZGRyLAorCQkJICAgICBzaXplb2YoTEFOQ0VfVHhEZXNjcikpOworCisJCS8qIGlmIHRoZSBMQU5DRSBzdGlsbCBvd25zIHRoaXMgb25lLCB3ZSd2ZSB3b3JrZWQgb3V0IGFsbCBzZW50IHBhY2tldHMgKi8KKwkJaWYgKChkZXNjci5GbGFncyAmIFRYRFNDUl9GTEFHU19PV04pICE9IDApCisJCQlicmVhazsKKworI2lmZGVmIERFQlVHCisJCVByVGltZSgpOworCQlwcmludGsoIlNlbmQgcGFja2V0IGRvbmUgb24gZGVzY3IgJWRcbiIsIHByaXYtPm5leHR0eGRvbmUpOworI2VuZGlmCisKKwkJLyogdXBkYXRlIHN0YXRpc3RpY3MgKi8KKwkJaWYgKChkZXNjci5GbGFncyAmIFRYRFNDUl9GTEFHU19FUlIpID09IDApIHsKKwkJCXByaXYtPnN0YXQudHhfcGFja2V0cysrOworCQkJcHJpdi0+c3RhdC50eF9ieXRlcysrOworCQl9IGVsc2UgeworCQkJcHJpdi0+c3RhdC50eF9lcnJvcnMrKzsKKwkJCWlmICgoZGVzY3IuU3RhdHVzICYgVFhEU0NSX1NUQVRVU19VRkxPKSAhPSAwKSB7CisJCQkJcHJpdi0+c3RhdC50eF9maWZvX2Vycm9ycysrOworCQkJCUluaXRMQU5DRShkZXYpOworCQkJfQorCQkJCWVsc2UKKwkJCSAgICBpZiAoKGRlc2NyLlN0YXR1cyAmIFRYRFNDUl9TVEFUVVNfTENPTCkgIT0KKwkJCQkwKSBwcml2LT5zdGF0LnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJCWVsc2UgaWYgKChkZXNjci5TdGF0dXMgJiBUWERTQ1JfU1RBVFVTX0xDQVIpICE9IDApCisJCQkJcHJpdi0+c3RhdC50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJZWxzZSBpZiAoKGRlc2NyLlN0YXR1cyAmIFRYRFNDUl9TVEFUVVNfUlRSWSkgIT0gMCkKKwkJCQlwcml2LT5zdGF0LnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCX0KKworCQkvKiBnbyB0byBuZXh0IGRlc2NyaXB0b3IgKi8KKwkJcHJpdi0+bmV4dHR4ZG9uZSsrOworCQlkZXNjcmFkZHIgKz0gc2l6ZW9mKExBTkNFX1R4RGVzY3IpOworCQlpZiAocHJpdi0+bmV4dHR4ZG9uZSA+PSBUWENPVU5UKSB7CisJCQlwcml2LT5uZXh0dHhkb25lID0gMDsKKwkJCWRlc2NyYWRkciA9IFJBTV9UWEJBU0U7CisJCX0KKwkJcHJpdi0+dHhidXN5LS07CisJfQorCisJLyogcmVzZXQgVFggaW50ZXJydXB0IGJpdCAqLworCisJU2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IwLCBvbGRjc3IwIHwgQ1NSMF9USU5UKTsKKwlvbGRjc3IwID0gR2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IwKTsKKworCS8qIGF0IGxlYXN0IG9uZSBkZXNjcmlwdG9yIGlzIGZyZWVkLiAgVGhlcmVmb3JlIHdlIGNhbiBhY2NlcHQKKwkgICBhIG5ldyBvbmUgKi8KKwkvKiBpbmZvcm0gdXBwZXIgbGF5ZXJzIHdlJ3JlIGluIGJ1c2luZXNzIGFnYWluICovCisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwlyZXR1cm4gb2xkY3NyMDsKK30KKworLyogZ2VuZXJhbCBpbnRlcnJ1cHQgZW50cnkgKi8KKworc3RhdGljIGlycXJldHVybl90IGlycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldmljZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZpY2U7CisJdTE2IGNzcjB2YWw7CisKKwkvKiByZWFkIENTUjAgdG8gZ2V0IGludGVycnVwdCBjYXVzZSAqLworCisJY3NyMHZhbCA9IEdldExBTkNFKGRldiwgTEFOQ0VfQ1NSMCk7CisKKwkvKiBpbiBjYXNlIHdlJ3JlIG5vdCBtZWFudC4uLiAqLworCisJaWYgKChjc3IwdmFsICYgQ1NSMF9JTlRSKSA9PSAwKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKyNpZiAwCisJc2V0X2JpdChMSU5LX1NUQVRFX1JYU0VNLCAmZGV2LT5zdGF0ZSk7CisjZW5kaWYKKworCS8qIGxvb3AgdGhyb3VnaCB0aGUgaW50ZXJydXB0IGJpdHMgdW50aWwgZXZlcnl0aGluZyBpcyBjbGVhciAqLworCisJZG8geworCQlpZiAoKGNzcjB2YWwgJiBDU1IwX0lET04pICE9IDApCisJCQljc3IwdmFsID0gaXJxc3RhcnRfaGFuZGxlcihkZXYsIGNzcjB2YWwpOworCQlpZiAoKGNzcjB2YWwgJiBDU1IwX1JJTlQpICE9IDApCisJCQljc3IwdmFsID0gaXJxcnhfaGFuZGxlcihkZXYsIGNzcjB2YWwpOworCQlpZiAoKGNzcjB2YWwgJiBDU1IwX01JU1MpICE9IDApCisJCQljc3IwdmFsID0gaXJxbWlzc19oYW5kbGVyKGRldiwgY3NyMHZhbCk7CisJCWlmICgoY3NyMHZhbCAmIENTUjBfVElOVCkgIT0gMCkKKwkJCWNzcjB2YWwgPSBpcnF0eF9oYW5kbGVyKGRldiwgY3NyMHZhbCk7CisJCWlmICgoY3NyMHZhbCAmIENTUjBfTUVSUikgIT0gMCkgeworCQkJU2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IwLCBjc3IwdmFsIHwgQ1NSMF9NRVJSKTsKKwkJCWNzcjB2YWwgPSBHZXRMQU5DRShkZXYsIExBTkNFX0NTUjApOworCQl9CisJCWlmICgoY3NyMHZhbCAmIENTUjBfQkFCTCkgIT0gMCkgeworCQkJU2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IwLCBjc3IwdmFsIHwgQ1NSMF9CQUJMKTsKKwkJCWNzcjB2YWwgPSBHZXRMQU5DRShkZXYsIExBTkNFX0NTUjApOworCQl9CisJfQorCXdoaWxlICgoY3NyMHZhbCAmIENTUjBfSU5UUikgIT0gMCk7CisKKyNpZiAwCisJY2xlYXJfYml0KExJTktfU1RBVEVfUlhTRU0sICZkZXYtPnN0YXRlKTsKKyNlbmRpZgorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBkcml2ZXIgbWV0aG9kcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIE1DQSBpbmZvICovCisKK3N0YXRpYyBpbnQgc2ttY2FfZ2V0aW5mbyhjaGFyICpidWYsIGludCBzbG90LCB2b2lkICpkKQoreworCWludCBsZW4gPSAwLCBpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZDsKKwlza21jYV9wcml2ICpwcml2OworCisJLyogY2FuJ3Qgc2F5IGFueXRoaW5nIGFib3V0IGFuIHVuaW5pdGlhbGl6ZWQgZGV2aWNlLi4uICovCisKKwlpZiAoZGV2ID09IE5VTEwpCisJCXJldHVybiBsZW47CisJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBwcmludCBpbmZvICovCisKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJJUlE6ICVkXG4iLCBwcml2LT5yZWFsaXJxKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJNZW1vcnk6ICUjbHgtJSNseFxuIiwgZGV2LT5tZW1fc3RhcnQsCisJCSAgICAgICBkZXYtPm1lbV9lbmQgLSAxKTsKKwlsZW4gKz0KKwkgICAgc3ByaW50ZihidWYgKyBsZW4sICJUcmFuc2NlaXZlcjogJXNcbiIsCisJCSAgICBNZWRpYU5hbWVzW3ByaXYtPm1lZGl1bV0pOworCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkRldmljZTogJXNcbiIsIGRldi0+bmFtZSk7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiTUFDIGFkZHJlc3M6Iik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiICUwMngiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlidWZbbGVuKytdID0gJ1xuJzsKKwlidWZbbGVuXSA9IDA7CisKKwlyZXR1cm4gbGVuOworfQorCisvKiBvcGVuIGRyaXZlci4gIE1lYW5zIGFsc28gaW5pdGlhbGl6YXRpb24gYW5kIHN0YXJ0IG9mIExBTkNFICovCisKK3N0YXRpYyBpbnQgc2ttY2Ffb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXN1bHQ7CisJc2ttY2FfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiByZWdpc3RlciByZXNvdXJjZXMgLSBvbmx5IG5lY2Vzc2FyeSBmb3IgSVJRICovCisJcmVzdWx0ID0KKwkgICAgcmVxdWVzdF9pcnEocHJpdi0+cmVhbGlycSwgaXJxX2hhbmRsZXIsCisJCQlTQV9TSElSUSB8IFNBX1NBTVBMRV9SQU5ET00sICJza19tY2EiLCBkZXYpOworCWlmIChyZXN1bHQgIT0gMCkgeworCQlwcmludGsoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgaXJxICVkXG4iLCBkZXYtPm5hbWUsCisJCSAgICAgICBkZXYtPmlycSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCWRldi0+aXJxID0gcHJpdi0+cmVhbGlycTsKKworCS8qIHNldCB1cCB0aGUgY2FyZCBhbmQgTEFOQ0UgKi8KKworCUluaXRCb2FyZChkZXYpOworCisJLyogc2V0IHVwIGZsYWdzICovCisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGNsb3NlIGRyaXZlci4gIFNodXQgZG93biBib2FyZCBhbmQgZnJlZSBhbGxvY2F0ZWQgcmVzb3VyY2VzICovCisKK3N0YXRpYyBpbnQgc2ttY2FfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiB0dXJuIG9mZiBib2FyZCAqLworCURlaW5pdEJvYXJkKGRldik7CisKKwkvKiByZWxlYXNlIHJlc291cmNlcyAqLworCWlmIChkZXYtPmlycSAhPSAwKQorCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlkZXYtPmlycSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyogdHJhbnNtaXQgYSBibG9jay4gKi8KKworc3RhdGljIGludCBza21jYV90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNrbWNhX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCUxBTkNFX1R4RGVzY3IgZGVzY3I7CisJdW5zaWduZWQgaW50IGFkZHJlc3M7CisJaW50IHRtcGxlbiwgcmV0dmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogaWYgd2UgZ2V0IGNhbGxlZCB3aXRoIGEgTlVMTCBkZXNjcmlwdG9yLCB0aGUgRXRoZXJuZXQgbGF5ZXIgdGhpbmtzIAorCSAgIG91ciBjYXJkIGlzIHN0dWNrIGFuIHdlIHNob3VsZCByZXNldCBpdC4gIFdlJ2xsIGRvIHRoaXMgY29tcGxldGVseTogKi8KKworCWlmIChza2IgPT0gTlVMTCkgeworCQlEZWluaXRCb2FyZChkZXYpOworCQlJbml0Qm9hcmQoZGV2KTsKKwkJcmV0dXJuIDA7CS8qIGRvbid0IHRyeSB0byBmcmVlIHRoZSBibG9jayBoZXJlIDstKSAqLworCX0KKworCS8qIGlzIHRoZXJlIHNwYWNlIGluIHRoZSBUeCBxdWV1ZSA/IElmIG5vLCB0aGUgdXBwZXIgbGF5ZXIgZ2F2ZSB1cyBhCisJICAgcGFja2V0IGluIHNwaXRlIG9mIHVzIG5vdCBiZWluZyByZWFkeSBhbmQgaXMgcmVhbGx5IGluIHRyb3VibGUuCisJICAgV2UnbGwgZG8gdGhlIGRyb3BwaW5nIGZvciBoaW06ICovCisJaWYgKHByaXYtPnR4YnVzeSA+PSBUWENPVU5UKSB7CisJCXByaXYtPnN0YXQudHhfZHJvcHBlZCsrOworCQlyZXR2YWwgPSAtRUlPOworCQlnb3RvIHR4X2RvbmU7CisJfQorCisJLyogZ2V0IFRYIGRlc2NyaXB0b3IgKi8KKwlhZGRyZXNzID0gUkFNX1RYQkFTRSArIChwcml2LT5uZXh0dHhwdXQgKiBzaXplb2YoTEFOQ0VfVHhEZXNjcikpOworCW1lbWNweV9mcm9taW8oJmRlc2NyLCBwcml2LT5iYXNlICsgYWRkcmVzcywgc2l6ZW9mKExBTkNFX1R4RGVzY3IpKTsKKworCS8qIGVudGVyIHBhY2tldCBsZW5ndGggYXMgMnMgY29tcGxlbWVudCAtIGFzc3VyZSBtaW5pbXVtIGxlbmd0aCAqLworCXRtcGxlbiA9IHNrYi0+bGVuOworCWlmICh0bXBsZW4gPCA2MCkKKwkJdG1wbGVuID0gNjA7CisJZGVzY3IuTGVuID0gNjU1MzYgLSB0bXBsZW47CisKKwkvKiBjb3B5IGZpbGxlciBpbnRvIFJBTSAtIGluIGNhc2Ugd2UncmUgZmlsbGluZyB1cC4uLiAKKwkgICB3ZSdyZSBmaWxsaW5nIGEgYml0IG1vcmUgdGhhbiBuZWNlc3NhcnksIGJ1dCB0aGF0IGRvZXNuJ3QgaGFybQorCSAgIHNpbmNlIHRoZSBidWZmZXIgaXMgZmFyIGxhcmdlci4uLiAqLworCWlmICh0bXBsZW4gPiBza2ItPmxlbikgeworCQljaGFyICpmaWxsID0gIk5ldEJTRCBpcyBhIG5pY2UgT1MgdG9vISAiOworCQl1bnNpZ25lZCBpbnQgZGVzdG9mZnMgPSAwLCBsID0gc3RybGVuKGZpbGwpOworCisJCXdoaWxlIChkZXN0b2ZmcyA8IHRtcGxlbikgeworCQkJbWVtY3B5X3RvaW8ocHJpdi0+YmFzZSArIGRlc2NyLkxvd0FkZHIgKworCQkJCSAgIGRlc3RvZmZzLCBmaWxsLCBsKTsKKwkJCWRlc3RvZmZzICs9IGw7CisJCX0KKwl9CisKKwkvKiBkbyB0aGUgcmVhbCBkYXRhIGNvcHlpbmcgKi8KKwltZW1jcHlfdG9pbyhwcml2LT5iYXNlICsgZGVzY3IuTG93QWRkciwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKwkvKiBoYW5kIGRlc2NyaXB0b3Igb3ZlciB0byBMQU5DRSAtIHRoaXMgaXMgdGhlIGZpcnN0IGFuZCBsYXN0IGNodW5rICovCisJZGVzY3IuRmxhZ3MgPQorCSAgICBUWERTQ1JfRkxBR1NfT1dOIHwgVFhEU0NSX0ZMQUdTX1NUUCB8IFRYRFNDUl9GTEFHU19FTlA7CisKKyNpZmRlZiBERUJVRworCVByVGltZSgpOworCXByaW50aygiU2VuZCBwYWNrZXQgb24gZGVzY3IgJWQgbGVuICVkXG4iLCBwcml2LT5uZXh0dHhwdXQsCisJICAgICAgIHNrYi0+bGVuKTsKKyNlbmRpZgorCisJLyogb25lIG1vcmUgZGVzY3JpcHRvciBidXN5ICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJcHJpdi0+bmV4dHR4cHV0Kys7CisJaWYgKHByaXYtPm5leHR0eHB1dCA+PSBUWENPVU5UKQorCQlwcml2LT5uZXh0dHhwdXQgPSAwOworCXByaXYtPnR4YnVzeSsrOworCisJLyogYXJlIHdlIHNhdHVyYXRlZCA/ICovCisKKwlpZiAocHJpdi0+dHhidXN5ID49IFRYQ09VTlQpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIHdyaXRlIGRlc2NyaXB0b3IgYmFjayB0byBSQU0gKi8KKwltZW1jcHlfdG9pbyhwcml2LT5iYXNlICsgYWRkcmVzcywgJmRlc2NyLCBzaXplb2YoTEFOQ0VfVHhEZXNjcikpOworCisJLyogaWYgbm8gZGVzY3JpcHRvcnMgd2VyZSBhY3RpdmUsIGdpdmUgdGhlIExBTkNFIGEgaGludCB0byByZWFkIGl0CisJICAgaW1tZWRpYXRlbHkgKi8KKworCWlmIChwcml2LT50eGJ1c3kgPT0gMCkKKwkJU2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IwLCBDU1IwX0lORUEgfCBDU1IwX1RETUQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisgICAgICB0eF9kb25lOgorCisJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogcmV0dXJuIHBvaW50ZXIgdG8gRXRoZXJuZXQgc3RhdGlzdGljcyAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNrbWNhX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2ttY2FfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gJihwcml2LT5zdGF0KTsKK30KKworLyogc3dpdGNoIHJlY2VpdmVyIG1vZGUuICBXZSB1c2UgdGhlIExBTkNFJ3MgbXVsdGljYXN0IGZpbHRlciB0byBwcmVmaWx0ZXIKKyAgIG11bHRpY2FzdCBhZGRyZXNzZXMuICovCisKK3N0YXRpYyB2b2lkIHNrbWNhX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNrbWNhX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCUxBTkNFX0luaXRCbG9jayBibG9jazsKKworCS8qIGZpcnN0IHN0b3AgdGhlIExBTkNFLi4uICovCisJU3RvcExBTkNFKGRldik7CisKKwkvKiAuLi50aGVuIG1vZGlmeSB0aGUgaW5pdGlhbGl6YXRpb24gYmxvY2suLi4gKi8KKwltZW1jcHlfZnJvbWlvKCZibG9jaywgcHJpdi0+YmFzZSArIFJBTV9JTklUQkFTRSwgc2l6ZW9mKGJsb2NrKSk7CisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJYmxvY2suTW9kZSB8PSBMQU5DRV9JTklUX1BST007CisJZWxzZQorCQlibG9jay5Nb2RlICY9IH5MQU5DRV9JTklUX1BST007CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgewkvKiBnZXQgYWxsIG11bHRpY2FzdHMgKi8KKwkJbWVtc2V0KGJsb2NrLkxBZHJGLCAweGZmLCBzaXplb2YoYmxvY2suTEFkckYpKTsKKwl9IGVsc2UgewkJLyogZ2V0IHNlbGVjdGVkL25vIG11bHRpY2FzdHMgKi8KKworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1wdHI7CisJCWludCBjb2RlOworCisJCW1lbXNldChibG9jay5MQWRyRiwgMCwgc2l6ZW9mKGJsb2NrLkxBZHJGKSk7CisJCWZvciAobXB0ciA9IGRldi0+bWNfbGlzdDsgbXB0ciAhPSBOVUxMOyBtcHRyID0gbXB0ci0+bmV4dCkgeworCQkJY29kZSA9IEdldEhhc2gobXB0ci0+ZG1pX2FkZHIpOworCQkJYmxvY2suTEFkckZbKGNvZGUgPj4gMykgJiA3XSB8PSAxIDw8IChjb2RlICYgNyk7CisJCX0KKwl9CisKKwltZW1jcHlfdG9pbyhwcml2LT5iYXNlICsgUkFNX0lOSVRCQVNFLCAmYmxvY2ssIHNpemVvZihibG9jaykpOworCisJLyogLi4udGhlbiByZWluaXQgTEFOQ0Ugd2l0aCB0aGUgY29ycmVjdCBmbGFncyAqLworCUluaXRMQU5DRShkZXYpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGhhcmR3YXJlIGNoZWNrCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBzdGFydHNsb3Q7CQkvKiBjb3VudHMgdGhyb3VnaCBzbG90cyB3aGVuIHByb2JpbmcgbXVsdGlwbGUgZGV2aWNlcyAqLworCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlza21jYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlEZWluaXRCb2FyZChkZXYpOworCWlmIChkZXYtPmlycSAhPSAwKQorCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlpb3VubWFwKHByaXYtPmJhc2UpOworCW1jYV9tYXJrX2FzX3VudXNlZChwcml2LT5zbG90KTsKKwltY2Ffc2V0X2FkYXB0ZXJfcHJvY2ZuKHByaXYtPnNsb3QsIE5VTEwsIE5VTEwpOworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBza21jYV9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBmb3JjZV9kZXRlY3QgPSAwOworCWludCBqdW5pb3IsIHNsb3QsIGk7CisJaW50IGJhc2UgPSAwLCBpcnEgPSAwOworCXNrbWNhX3ByaXYgKnByaXY7CisJc2ttY2FfbWVkaXVtIG1lZGl1bTsKKwlpbnQgZXJyOworCisJLyogY2FuJ3Qgd29yayB3aXRob3V0IGFuIE1DQSBidXMgOy0pICovCisKKwlpZiAoTUNBX2J1cyA9PSAwKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihza21jYV9wcml2KSk7CisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWYgKHVuaXQgPj0gMCkgeworCQlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJLyogc3RhcnQgYWRkcmVzcyBvZiAxIC0tPiBmb3JjZWQgZGV0ZWN0aW9uICovCisKKwlpZiAoZGV2LT5tZW1fc3RhcnQgPT0gMSkKKwkJZm9yY2VfZGV0ZWN0ID0gMTsKKworCS8qIHNlYXJjaCB0aHJvdWdoIHNsb3RzICovCisKKwliYXNlID0gZGV2LT5tZW1fc3RhcnQ7CisJaXJxID0gZGV2LT5iYXNlX2FkZHI7CisJZm9yIChzbG90ID0gc3RhcnRzbG90OyAoc2xvdCA9IGRvZmluZCgmanVuaW9yLCBzbG90KSkgIT0gLTE7IHNsb3QrKykgeworCQkvKiBkZWR1Y2UgY2FyZCBhZGRyZXNzZXMgKi8KKworCQlnZXRhZGRycyhzbG90LCBqdW5pb3IsICZiYXNlLCAmaXJxLCAmbWVkaXVtKTsKKworCQkvKiBzbG90IGFscmVhZHkgaW4gdXNlID8gKi8KKworCQlpZiAobWNhX2lzX2FkYXB0ZXJfdXNlZChzbG90KSkKKwkJCWNvbnRpbnVlOworCisJCS8qIHdlcmUgd2UgbG9va2luZyBmb3Igc29tZXRoaW5nIGRpZmZlcmVudCA/ICovCisKKwkJaWYgKGRldi0+aXJxICYmIGRldi0+aXJxICE9IGlycSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZGV2LT5tZW1fc3RhcnQgJiYgZGV2LT5tZW1fc3RhcnQgIT0gYmFzZSkKKwkJCWNvbnRpbnVlOworCisJCS8qIGZvdW5kIHNvbWV0aGluZyB0aGF0IG1hdGNoZXMgKi8KKworCQlicmVhazsKKwl9CisKKwkvKiBub3RoaW5nIGZvdW5kID8gKi8KKworCWlmIChzbG90ID09IC0xKSB7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiAoYmFzZSB8fCBpcnEpID8gRVJSX1BUUigtRU5YSU8pIDogRVJSX1BUUigtRU5PREVWKTsKKwl9CisKKwkvKiBtYWtlIHByb2NmcyBlbnRyaWVzICovCisKKwlpZiAoanVuaW9yKQorCQltY2Ffc2V0X2FkYXB0ZXJfbmFtZShzbG90LAorCQkJCSAgICAgIlNLTkVUIGp1bmlvciBNQzIgRXRoZXJuZXQgQWRhcHRlciIpOworCWVsc2UKKwkJbWNhX3NldF9hZGFwdGVyX25hbWUoc2xvdCwgIlNLTkVUIE1DMisgRXRoZXJuZXQgQWRhcHRlciIpOworCW1jYV9zZXRfYWRhcHRlcl9wcm9jZm4oc2xvdCwgKE1DQV9Qcm9jRm4pIHNrbWNhX2dldGluZm8sIGRldik7CisKKwltY2FfbWFya19hc191c2VkKHNsb3QpOworCisJLyogYW5ub3VuY2Ugc3VjY2VzcyAqLworCXByaW50aygiJXM6IFNLTmV0ICVzIGFkYXB0ZXIgZm91bmQgaW4gc2xvdCAlZFxuIiwgZGV2LT5uYW1lLAorCSAgICAgICBqdW5pb3IgPyAiSnVuaW9yIE1DMiIgOiAiTUMyKyIsIHNsb3QgKyAxKTsKKworCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXByaXYtPmJhc2UgPSBpb3JlbWFwKGJhc2UsIDB4NDAwMCk7CisJaWYgKCFwcml2LT5iYXNlKSB7CisJCW1jYV9zZXRfYWRhcHRlcl9wcm9jZm4oc2xvdCwgTlVMTCwgTlVMTCk7CisJCW1jYV9tYXJrX2FzX3VudXNlZChzbG90KTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJcHJpdi0+c2xvdCA9IHNsb3Q7CisJcHJpdi0+bWFjYmFzZSA9IHByaXYtPmJhc2UgKyAweDNmYzA7CisJcHJpdi0+aW9yZWdhZGRyID0gcHJpdi0+YmFzZSArIDB4M2ZmMDsKKwlwcml2LT5jdHJsYWRkciA9IHByaXYtPmJhc2UgKyAweDNmZjI7CisJcHJpdi0+Y21kYWRkciA9IHByaXYtPmJhc2UgKyAweDNmZjM7CisJcHJpdi0+bWVkaXVtID0gbWVkaXVtOworCW1lbXNldCgmcHJpdi0+c3RhdCwgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOworCisJLyogc2V0IGJhc2UgKyBpcnEgZm9yIHRoaXMgZGV2aWNlIChpcnEgbm90IGFsbG9jYXRlZCBzbyBmYXIpICovCisJZGV2LT5pcnEgPSAwOworCWRldi0+bWVtX3N0YXJ0ID0gYmFzZTsKKwlkZXYtPm1lbV9lbmQgPSBiYXNlICsgMHg0MDAwOworCisJLyogYXV0b3Byb2JlID8gKi8KKwlpZiAoaXJxIDwgMCkgeworCQlpbnQgbmlycTsKKworCQlwcmludGsKKwkJICAgICgiJXM6IGFtYmlnb3VzIFBPUyBiaXQgY29tYmluYXRpb24sIG11c3QgcHJvYmUgZm9yIElSUS4uLlxuIiwKKwkJICAgICBkZXYtPm5hbWUpOworCQluaXJxID0gUHJvYmVJUlEoZGV2KTsKKwkJaWYgKG5pcnEgPD0gMCkKKwkJCXByaW50aygiJXM6IElSUSBwcm9iZSBmYWlsZWQsIGFzc3VtaW5nIElSUSAlZCIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBwcml2LT5yZWFsaXJxID0gLWlycSk7CisJCWVsc2UKKwkJCXByaXYtPnJlYWxpcnEgPSBuaXJxOworCX0gZWxzZQorCQlwcml2LT5yZWFsaXJxID0gaXJxOworCisJLyogc2V0IG1ldGhvZHMgKi8KKwlkZXYtPm9wZW4gPSBza21jYV9vcGVuOworCWRldi0+c3RvcCA9IHNrbWNhX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gc2ttY2FfdHg7CisJZGV2LT5kb19pb2N0bCA9IE5VTEw7CisJZGV2LT5nZXRfc3RhdHMgPSBza21jYV9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHNrbWNhX3NldF9tdWx0aWNhc3RfbGlzdDsKKwlkZXYtPmZsYWdzIHw9IElGRl9NVUxUSUNBU1Q7CisKKwkvKiBjb3B5IG91dCBNQUMgYWRkcmVzcyAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSByZWFkYihwcml2LT5tYWNiYXNlICsgKGkgPDwgMSkpOworCisJLyogcHJpbnQgY29uZmlnICovCisJcHJpbnRrKCIlczogSVJRICVkLCBtZW1vcnkgJSNseC0lI2x4LCAiCisJICAgICAgICJNQUMgYWRkcmVzcyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC5cbiIsCisJICAgICAgIGRldi0+bmFtZSwgcHJpdi0+cmVhbGlycSwgZGV2LT5tZW1fc3RhcnQsIGRldi0+bWVtX2VuZCAtIDEsCisJICAgICAgIGRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sIGRldi0+ZGV2X2FkZHJbMl0sCisJICAgICAgIGRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0pOworCXByaW50aygiJXM6ICVzIG1lZGl1bVxuIiwgZGV2LT5uYW1lLCBNZWRpYU5hbWVzW3ByaXYtPm1lZGl1bV0pOworCisJLyogcmVzZXQgYm9hcmQgKi8KKworCVJlc2V0Qm9hcmQoZGV2KTsKKworCXN0YXJ0c2xvdCA9IHNsb3QgKyAxOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJZGV2ID0gRVJSX1BUUihlcnIpOworCX0KKwlyZXR1cm4gZGV2OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG1vZHVsYXJpemF0aW9uIHN1cHBvcnQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgTU9EVUxFCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgREVWTUFYIDUKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICptb2RkZXZzW0RFVk1BWF07CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWludCB6OworCisJc3RhcnRzbG90ID0gMDsKKwlmb3IgKHogPSAwOyB6IDwgREVWTUFYOyB6KyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrbWNhX3Byb2JlKC0xKTsKKwkJaWYgKElTX0VSUihkZXYpKQorCQkJYnJlYWs7CisJCW1vZGRldnNbel0gPSBkZXY7CisJfQorCWlmICgheikKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgejsKKworCWZvciAoeiA9IDA7IHogPCBERVZNQVg7IHorKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbW9kZGV2c1t6XTsKKwkJaWYgKGRldikgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJfQorCX0KK30KKyNlbmRpZgkJCQkvKiBNT0RVTEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrX21jYS5oIGIvZHJpdmVycy9uZXQvc2tfbWNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U3Yzk5NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrX21jYS5oCkBAIC0wLDAgKzEsMTcyIEBACisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaWZuZGVmIF9TS19NQ0FfSU5DTFVERV8KKyNkZWZpbmUgX1NLX01DQV9JTkNMVURFXworCisjaWZkZWYgX1NLX01DQV9EUklWRVJfCisKKy8qIEFkYXB0ZXIgSUQncyAqLworI2RlZmluZSBTS05FVF9NQ0FfSUQgMHg2YWZkCisjZGVmaW5lIFNLTkVUX0pVTklPUl9NQ0FfSUQgMHg2YmU5CisKKy8qIG1lZGlhIGVudW1lcmF0aW9uIC0gZGVmaW5lZCBpbiBhIHdheSB0aGF0IGl0IGZpdHMgb250byB0aGUgTUMyKydzCisgICBQT1MgcmVnaXN0ZXJzLi4uICovCisKK3R5cGVkZWYgZW51bSB7IE1lZGlhXzEwQmFzZTIsIE1lZGlhXzEwQmFzZVQsCisJTWVkaWFfMTBCYXNlNSwgTWVkaWFfVW5rbm93biwgTWVkaWFfQ291bnQKK30gc2ttY2FfbWVkaXVtOworCisvKiBwcml2YXRlIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzbG90OwkvKiBNQ0EtU2xvdC0jICAgICAgICAgICAgICAgICAgICAgICAqLworCXZvaWQgX19pb21lbSAqYmFzZTsKKwl2b2lkIF9faW9tZW0gKm1hY2Jhc2U7CS8qIGJhc2UgYWRkcmVzcyBvZiBNQUMgYWRkcmVzcyBQUk9NICovCisJdm9pZCBfX2lvbWVtICppb3JlZ2FkZHI7LyogYWRkcmVzcyBvZiBJL08tcmVnaXN0ZXIgKExvKSAgICAgKi8KKwl2b2lkIF9faW9tZW0gKmN0cmxhZGRyOwkvKiBhZGRyZXNzIG9mIGNvbnRyb2wvc3RhdCByZWdpc3RlciAqLworCXZvaWQgX19pb21lbSAqY21kYWRkcjsJLyogYWRkcmVzcyBvZiBJL08tY29tbWFuZCByZWdpc3RlciAgKi8KKwlpbnQgbmV4dHJ4OwkJLyogaW5kZXggb2YgbmV4dCBSWCBkZXNjcmlwdG9yIHRvCisJCQkJICAgYmUgcmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpbnQgbmV4dHR4cHV0OwkJLyogaW5kZXggb2YgbmV4dCBmcmVlIFRYIGRlc2NyaXB0b3IgKi8KKwlpbnQgbmV4dHR4ZG9uZTsJCS8qIGluZGV4IG9mIG5leHQgVFggZGVzY3JpcHRvciB0byAKKwkJCQkgICBiZSBmaW5pc2hlZCAgICAgICAgICAgICAgICAgICAgICAqLworCWludCB0eGJ1c3k7CQkvKiAjIG9mIGJ1c3kgVFggZGVzY3JpcHRvcnMgICAgICAgICAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXQ7CS8qIHBhY2tldCBzdGF0aXN0aWNzICAgICAgICAgICAgKi8KKwlpbnQgcmVhbGlycTsJCS8qIG1lbW9yaXplcyBhY3R1YWwgSVJRLCBldmVuIHdoZW4gCisJCQkJICAgY3VycmVudGx5IG5vdCBhbGxvY2F0ZWQgICAgICAgICAgKi8KKwlza21jYV9tZWRpdW0gbWVkaXVtOwkvKiBwaHlzaWNhbCBjYW5uZWN0b3IgICAgICAgICAgICAgICAqLworCXNwaW5sb2NrX3QgbG9jazsKK30gc2ttY2FfcHJpdjsKKworLyogY2FyZCByZWdpc3RlcnM6IGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyIGJpdHMgKi8KKworI2RlZmluZSBDVFJMX0FEUl9EQVRBICAgICAgMAkvKiBCaXQgMCA9IDAgLT5hY2Nlc3MgZGF0YSByZWdpc3RlciAgKi8KKyNkZWZpbmUgQ1RSTF9BRFJfUkFQICAgICAgIDEJLyogQml0IDAgPSAxIC0+YWNjZXNzIFJBUCByZWdpc3RlciAgICovCisjZGVmaW5lIENUUkxfUldfV1JJVEUgICAgICAwCS8qIEJpdCAxID0gMCAtPndyaXRlIHJlZ2lzdGVyICAgICAgICAqLworI2RlZmluZSBDVFJMX1JXX1JFQUQgICAgICAgMgkvKiBCaXQgMSA9IDEgLT5yZWFkIHJlZ2lzdGVyICAgICAgICAgKi8KKyNkZWZpbmUgQ1RSTF9SRVNFVF9PTiAgICAgIDAJLyogQml0IDMgPSAwIC0+cmVzZXQgYm9hcmQgICAgICAgICAgICovCisjZGVmaW5lIENUUkxfUkVTRVRfT0ZGICAgICA4CS8qIEJpdCAzID0gMSAtPm5vIHJlc2V0IG9mIGJvYXJkICAgICAqLworCisjZGVmaW5lIFNUQVRfQURSX0RBVEEgICAgICAwCS8qIEJpdCAwIG9mIGN0cmwgcmVnaXN0ZXIgcmVhZCBiYWNrICAqLworI2RlZmluZSBTVEFUX0FEUl9SQVAgICAgICAgMQorI2RlZmluZSBTVEFUX1JXX1dSSVRFICAgICAgMAkvKiBCaXQgMSBvZiBjdHJsIHJlZ2lzdGVyIHJlYWQgYmFjayAgKi8KKyNkZWZpbmUgU1RBVF9SV19SRUFEICAgICAgIDIKKyNkZWZpbmUgU1RBVF9SRVNFVF9PTiAgICAgIDAJLyogQml0IDMgb2YgY3RybCByZWdpc3RlciByZWFkIGJhY2sgICovCisjZGVmaW5lIFNUQVRfUkVTRVRfT0ZGICAgICA4CisjZGVmaW5lIFNUQVRfSVJRX0FDVCAgICAgICAwCS8qIGludGVycnVwdCBwZW5kaW5nICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTVEFUX0lSUV9OT0FDVCAgICAgMTYJLyogbm8gaW50ZXJydXB0IHBlbmRpbmcgICAgICAgICAgICAgICovCisjZGVmaW5lIFNUQVRfSU9fTk9CVVNZICAgICAwCS8qIG5vIHRyYW5zZmVyIGJ1c3kgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTVEFUX0lPX0JVU1kgICAgICAgMzIJLyogdHJhbnNmZXIgYnVzeSAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEkvTyBjb21tYW5kIHJlZ2lzdGVyIGJpdHMgKi8KKworI2RlZmluZSBJT0NNRF9HTyAgICAgICAgICAgMTI4CS8qIEJpdCA3ID0gMSAtPiBzdGFydCByZWdpc3RlciB4ZmVyICAqLworCisvKiBMQU5DRSByZWdpc3RlcnMgKi8KKworI2RlZmluZSBMQU5DRV9DU1IwICAgICAgICAgMAkvKiBTdGF0dXMvQ29udHJvbCAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBDU1IwX0VSUiAgICAgICAgICAgMHg4MDAwCS8qIGdlbmVyYWwgZXJyb3IgZmxhZyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDU1IwX0JBQkwgICAgICAgICAgMHg0MDAwCS8qIHRyYW5zbWl0dGVyIHRpbWVvdXQgICAgICAgICAgICAgICAqLworI2RlZmluZSBDU1IwX0NFUlIgICAgICAgICAgMHgyMDAwCS8qIGNvbGxpc2lvbiBlcnJvciAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDU1IwX01JU1MgICAgICAgICAgMHgxMDAwCS8qIGxvc3QgUnggYmxvY2sgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDU1IwX01FUlIgICAgICAgICAgMHgwODAwCS8qIG1lbW9yeSBhY2Nlc3MgZXJyb3IgICAgICAgICAgICAgICAqLworI2RlZmluZSBDU1IwX1JJTlQgICAgICAgICAgMHgwNDAwCS8qIHJlY2VpdmVyIGludGVycnVwdCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDU1IwX1RJTlQgICAgICAgICAgMHgwMjAwCS8qIHRyYW5zbWl0dGVyIGludGVycnVwdCAgICAgICAgICAgICAqLworI2RlZmluZSBDU1IwX0lET04gICAgICAgICAgMHgwMTAwCS8qIGluaXRpYWxpemF0aW9uIGRvbmUgICAgICAgICAgICAgICAqLworI2RlZmluZSBDU1IwX0lOVFIgICAgICAgICAgMHgwMDgwCS8qIGdlbmVyYWwgaW50ZXJydXB0IGZsYWcgICAgICAgICAgICAqLworI2RlZmluZSBDU1IwX0lORUEgICAgICAgICAgMHgwMDQwCS8qIGludGVycnVwdCBlbmFibGUgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDU1IwX1JYT04gICAgICAgICAgMHgwMDIwCS8qIHJlY2VpdmVyIGVuYWJsZWQgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDU1IwX1RYT04gICAgICAgICAgMHgwMDEwCS8qIHRyYW5zbWl0dGVyIGVuYWJsZWQgICAgICAgICAgICAgICAqLworI2RlZmluZSBDU1IwX1RETUQgICAgICAgICAgMHgwMDA4CS8qIGZvcmNlIHRyYW5zbWlzc2lvbiBub3cgICAgICAgICAgICAqLworI2RlZmluZSBDU1IwX1NUT1AgICAgICAgICAgMHgwMDA0CS8qIHN0b3AgTEFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDU1IwX1NUUlQgICAgICAgICAgMHgwMDAyCS8qIHN0YXJ0IExBTkNFICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDU1IwX0lOSVQgICAgICAgICAgMHgwMDAxCS8qIHJlYWQgaW5pdGlhbGl6YXRpb24gYmxvY2sgICAgICAgICAqLworCisjZGVmaW5lIExBTkNFX0NTUjEgICAgICAgICAxCS8qIGFkZHIgYml0IDAuLjE1IG9mIGluaXRpYWxpemF0aW9uICAqLworI2RlZmluZSBMQU5DRV9DU1IyICAgICAgICAgMgkvKiAgICAgICAgICAxNi4uMjMgYmxvY2sgICAgICAgICAgICAgKi8KKworI2RlZmluZSBMQU5DRV9DU1IzICAgICAgICAgMwkvKiBCdXMgY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NSM19CQ09OX0hPTEQgICAgIDAJLyogQml0IDAgPSAwIC0+IEJNMSxCTTAsSE9MRCAgICAgICAgICovCisjZGVmaW5lIENTUjNfQkNPTl9CVVNSUSAgICAxCS8qIEJpdCAwID0gMSAtPiBCVVNBSzAsQllURSxCVVNSUSAgICAqLworI2RlZmluZSBDU1IzX0FMRV9ISUdIICAgICAgMAkvKiBCaXQgMSA9IDAgLT4gQUxFIGFzc2VydGVkIGhpZ2ggICAgKi8KKyNkZWZpbmUgQ1NSM19BTEVfTE9XICAgICAgIDIJLyogQml0IDEgPSAxIC0+IEFMRSBhc3NlcnRlZCBsb3cgICAgICovCisjZGVmaW5lIENTUjNfQlNXQVBfT0ZGICAgICAwCS8qIEJpdCAyID0gMCAtPiBubyBieXRlIHN3YXAgICAgICAgICAqLworI2RlZmluZSBDU1IzX0JTV0FQX09OICAgICAgNAkvKiBCaXQgMiA9IDEgLT4gYnl0ZSBzd2FwICAgICAgICAgICAgKi8KKworLyogTEFOQ0Ugc3RydWN0dXJlcyAqLworCit0eXBlZGVmIHN0cnVjdCB7CQkvKiBMQU5DRSBpbml0aWFsaXphdGlvbiBibG9jayAgICAgICAgKi8KKwl1MTYgTW9kZTsJCS8qIG1vZGUgZmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAqLworCXU4IFBBZHJbNl07CQkvKiBNQUMgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1OCBMQWRyRls4XTsJCS8qIE11bHRpY2FzdCBmaWx0ZXIgICAgICAgICAgICAgICAgICAqLworCXUzMiBSZHJQOwkJLyogUmVjZWl2ZSBkZXNjcmlwdG9yICAgICAgICAgICAgICAgICovCisJdTMyIFRkclA7CQkvKiBUcmFuc21pdCBkZXNjcmlwdG9yICAgICAgICAgICAgICAgKi8KK30gTEFOQ0VfSW5pdEJsb2NrOworCisvKiBNb2RlIGZsYWdzIGluaXQgYmxvY2sgKi8KKworI2RlZmluZSBMQU5DRV9JTklUX1BST00gICAgMHg4MDAwCS8qIGVuYWJsZSBwcm9taXNjb3VzIG1vZGUgICAgICAgICAgICAqLworI2RlZmluZSBMQU5DRV9JTklUX0lOVEwgICAgMHgwMDQwCS8qIGludGVybmFsIGxvb3BiYWNrICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMQU5DRV9JTklUX0RSVFkgICAgMHgwMDIwCS8qIGRpc2FibGUgcmV0cnkgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMQU5DRV9JTklUX0NPTEwgICAgMHgwMDEwCS8qIGZvcmNlIGNvbGxpc2lvbiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMQU5DRV9JTklUX0RUQ1IgICAgMHgwMDA4CS8qIGRpc2FibGUgdHJhbnNtaXQgQ1JDICAgICAgICAgICAgICAqLworI2RlZmluZSBMQU5DRV9JTklUX0xPT1AgICAgMHgwMDA0CS8qIGxvb3BiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMQU5DRV9JTklUX0RUWCAgICAgMHgwMDAyCS8qIGRpc2FibGUgdHJhbnNtaXR0ZXIgICAgICAgICAgICAgICAqLworI2RlZmluZSBMQU5DRV9JTklUX0RSWCAgICAgMHgwMDAxCS8qIGRpc2FibGUgcmVjZWl2ZXIgICAgICAgICAgICAgICAgICAqLworCit0eXBlZGVmIHN0cnVjdCB7CQkvKiBMQU5DRSBUeCBkZXNjcmlwdG9yICAgICAgICAgICAgICAgKi8KKwl1MTYgTG93QWRkcjsJCS8qIGJpdCAwLi4xNSBvZiBhZGRyZXNzICAgICAgICAgICAgICAqLworCXUxNiBGbGFnczsJCS8qIGJpdCAxNi4uMjMgb2YgYWRkcmVzcyArIEZsYWdzICAgICAqLworCXUxNiBMZW47CQkvKiAycyBjb21wbGVtZW50IG9mIHBhY2tldCBsZW5ndGggICAgKi8KKwl1MTYgU3RhdHVzOwkJLyogUmVzdWx0IG9mIHRyYW5zbWlzc2lvbiAgICAgICAgICAgICovCit9IExBTkNFX1R4RGVzY3I7CisKKyNkZWZpbmUgVFhEU0NSX0ZMQUdTX09XTiAgIDB4ODAwMAkvKiBMQU5DRSBvd25zIGRlc2NyaXB0b3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFhEU0NSX0ZMQUdTX0VSUiAgIDB4NDAwMAkvKiBzdW1tYXJ5IGVycm9yIGZsYWcgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFhEU0NSX0ZMQUdTX01PUkUgIDB4MTAwMAkvKiBtb3JlIHRoYW4gb25lIHJldHJ5IG5lZWRlZD8gICAgICAgKi8KKyNkZWZpbmUgVFhEU0NSX0ZMQUdTX09ORSAgIDB4MDgwMAkvKiBvbmUgcmV0cnk/ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFhEU0NSX0ZMQUdTX0RFRiAgIDB4MDQwMAkvKiB0cmFuc21pc3Npb24gZGVmZXJyZWQ/ICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFhEU0NSX0ZMQUdTX1NUUCAgIDB4MDIwMAkvKiBmaXJzdCBwYWNrZXQgaW4gY2hhaW4/ICAgICAgICAgICAgKi8KKyNkZWZpbmUgVFhEU0NSX0ZMQUdTX0VOUCAgIDB4MDEwMAkvKiBsYXN0IHBhY2tldCBpbiBjaGFpbj8gICAgICAgICAgICAgKi8KKworI2RlZmluZSBUWERTQ1JfU1RBVFVTX0JVRkYgMHg4MDAwCS8qIGJ1ZmZlciBlcnJvcj8gICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUWERTQ1JfU1RBVFVTX1VGTE8gMHg0MDAwCS8qIHNpbG8gdW5kZXJmbG93IGR1cmluZyB0cmFuc21pdD8gICAqLworI2RlZmluZSBUWERTQ1JfU1RBVFVTX0xDT0wgMHgxMDAwCS8qIGxhdGUgY29sbGlzaW9uPyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUWERTQ1JfU1RBVFVTX0xDQVIgMHgwODAwCS8qIGxvc3Mgb2YgY2Fycmllcj8gICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUWERTQ1JfU1RBVFVTX1JUUlkgMHgwNDAwCS8qIHJldHJ5IGVycm9yPyAgICAgICAgICAgICAgICAgICAgICAqLworCit0eXBlZGVmIHN0cnVjdCB7CQkvKiBMQU5DRSBSeCBkZXNjcmlwdG9yICAgICAgICAgICAgICAgKi8KKwl1MTYgTG93QWRkcjsJCS8qIGJpdCAwLi4xNSBvZiBhZGRyZXNzICAgICAgICAgICAgICAqLworCXUxNiBGbGFnczsJCS8qIGJpdCAxNi4uMjMgb2YgYWRkcmVzcyArIEZsYWdzICAgICAqLworCXUxNiBNYXhMZW47CQkvKiAycyBjb21wbGVtZW50IG9mIGJ1ZmZlciBsZW5ndGggICAgKi8KKwl1MTYgTGVuOwkJLyogcGFja2V0IGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICovCit9IExBTkNFX1J4RGVzY3I7CisKKyNkZWZpbmUgUlhEU0NSX0ZMQUdTX09XTiAgIDB4ODAwMAkvKiBMQU5DRSBvd25zIGRlc2NyaXB0b3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUlhEU0NSX0ZMQUdTX0VSUiAgIDB4NDAwMAkvKiBzdW1tYXJ5IGVycm9yIGZsYWcgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUlhEU0NSX0ZMQUdTX0ZSQU0gIDB4MjAwMAkvKiBmcmFtaW5nIGVycm9yIGZsYWcgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUlhEU0NSX0ZMQUdTX09GTE8gIDB4MTAwMAkvKiBGSUZPIG92ZXJmbG93PyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUlhEU0NSX0ZMQUdTX0NSQyAgIDB4MDgwMAkvKiBDUkMgZXJyb3I/ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUlhEU0NSX0ZMQUdTX0JVRkYgIDB4MDQwMAkvKiBidWZmZXIgZXJyb3I/ICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUlhEU0NSX0ZMQUdTX1NUUCAgIDB4MDIwMAkvKiBmaXJzdCBwYWNrZXQgaW4gY2hhaW4/ICAgICAgICAgICAgKi8KKyNkZWZpbmUgUlhEQ1NSX0ZMQUdTX0VOUCAgIDB4MDEwMAkvKiBsYXN0IHBhY2tldCBpbiBjaGFpbj8gICAgICAgICAgICAgKi8KKworLyogUkFNIGxheW91dCAqLworCisjZGVmaW5lIFRYQ09VTlQgICAgICAgICAgICA0CS8qIGxlbmd0aCBvZiBUWCBkZXNjcmlwdG9yIHF1ZXVlICAgICAqLworI2RlZmluZSBMVFhDT1VOVCAgICAgICAgICAgMgkvKiBsb2cyIG9mIGl0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUlhDT1VOVCAgICAgICAgICAgIDQJLyogbGVuZ3RoIG9mIFJYIGRlc2NyaXB0b3IgcXVldWUgICAgICovCisjZGVmaW5lIExSWENPVU5UICAgICAgICAgICAyCS8qIGxvZzIgb2YgaXQgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFJBTV9JTklUQkFTRSAgICAgICAwCS8qIExBTkNFIGluaXQgYmxvY2sgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSQU1fVFhCQVNFICAgICAgICAgMjQJLyogU3RhcnQgb2YgVFggZGVzY3JpcHRvciBxdWV1ZSAgICAgICovCisjZGVmaW5lIFJBTV9SWEJBU0UgICAgICAgICBcCisoUkFNX1RYQkFTRSArIChUWENPVU5UICogOCkpCS8qIFN0YXJ0IG9mIFJYIGRlc2NyaXB0b3IgcXVldWUgICAgICAqLworI2RlZmluZSBSQU1fREFUQUJBU0UgICAgICAgXAorKFJBTV9SWEJBU0UgKyAoUlhDT1VOVCAqIDgpKQkvKiBTdGFydCBvZiBkYXRhIGFyZWEgZm9yIGZyYW1lcyAgICAgKi8KKyNkZWZpbmUgUkFNX0JVRlNJWkUgICAgICAgIDE1ODAJLyogbWF4LiBmcmFtZSBzaXplIC0gc2hvdWxkIG5ldmVyIGJlCisJCQkJICAgcmVhY2hlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNlbmRpZgkJCQkvKiBfU0tfTUNBX0RSSVZFUl8gKi8KKworI2VuZGlmCS8qIF9TS19NQ0FfSU5DTFVERV8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9za2ZwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZmNjZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL01ha2VmaWxlCkBAIC0wLDAgKzEsMjAgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBTeXNLb25uZWN0IEZEREkgUENJIGFkYXB0ZXIgZHJpdmVyCisjCisKK29iai0kKENPTkZJR19TS0ZQKSArPSBza2ZwLm8KKworc2tmcC1vYmpzIDo9ICBza2ZkZGkubyAgICBod210bS5vICAgIGZwbHVzdG0ubyAgc210Lm8gICAgICBjZm0ubyAgICAgXAorICAgICAgICAgICAgICBlY20ubyAgICAgICBwY21wbGMubyAgIHBtZi5vICAgICAgcXVldWUubyAgICBybXQubyAgICAgXAorCSAgICAgIHNtdGRlZi5vICAgIHNtdGluaXQubyAgc210dGltZXIubyBzcmYubyAgICAgIGxua3N0YXQubyBcCisgICAgICAgICAgICAgIHNtdHBhcnNlLm8gIGh3dC5vICAgICAgZHJ2ZmJpLm8gICBlc3MubworCisjIE5PVEU6CisjICAgQ29tcGlsaW5nIHRoaXMgZHJpdmVyIHByb2R1Y2VzIHNvbWUgd2FybmluZ3MgKGFuZCBzb21lIG1vcmUgYXJlIAorIyAgIHN3aXRjaGVkIG9mZiBiZWxvdyksIGJ1dCBJIGRpZCBub3QgZml4IHRoaXMsIGJlY2F1c2UgdGhlIEhhcmR3YXJlCisjICAgTW9kdWxlIHNvdXJjZSAoc2VlIHNrZmRkaS5jIGZvciBkZXRhaWxzKSBpcyB1c2VkIGZvciBkaWZmZXJlbnQKKyMgICBkcml2ZXJzLCBhbmQgZml4aW5nIGl0IGZvciBMaW51eCBtaWdodCBicmluZyBwcm9ibGVtcyBvbiBvdGhlcgorIyAgIHByb2plY3RzLiBUbyBrZWVwIHRoZSBzb3VyY2UgY29tbW9uIGZvciBhbGwgdGhvc2UgZHJpdmVycyAoYW5kCisjICAgdGh1cyBzaW1wbGlmeSBmaXhlcyB0byBpdCksIHBsZWFzZSBkbyBub3QgY2xlYW4gaXQgdXAhCisKK0VYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbmV0L3NrZnAgLURQQ0kgLURNRU1fTUFQUEVEX0lPIC1Xbm8tc3RyaWN0LXByb3RvdHlwZXMgCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2Nhbi5jIGIvZHJpdmVycy9uZXQvc2tmcC9jYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTQ5YWJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9jYW4uYwpAQCAtMCwwICsxLDgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCWxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHhJRF9zY2NzW10gPSAiQCgjKWNhbi5jCTEuNSA5Ny8wNC8wNyAoQykgU0sgIiA7CisjZW5kaWYKKworLyoKKyAqIGNhbm9uaWNhbCBiaXQgb3JkZXIKKyAqLworY29uc3QgdV9jaGFyIGNhbm9uaWNhbFsyNTZdID0geworCTB4MDAsMHg4MCwweDQwLDB4YzAsMHgyMCwweGEwLDB4NjAsMHhlMCwKKwkweDEwLDB4OTAsMHg1MCwweGQwLDB4MzAsMHhiMCwweDcwLDB4ZjAsCisJMHgwOCwweDg4LDB4NDgsMHhjOCwweDI4LDB4YTgsMHg2OCwweGU4LAorCTB4MTgsMHg5OCwweDU4LDB4ZDgsMHgzOCwweGI4LDB4NzgsMHhmOCwKKwkweDA0LDB4ODQsMHg0NCwweGM0LDB4MjQsMHhhNCwweDY0LDB4ZTQsCisJMHgxNCwweDk0LDB4NTQsMHhkNCwweDM0LDB4YjQsMHg3NCwweGY0LAorCTB4MGMsMHg4YywweDRjLDB4Y2MsMHgyYywweGFjLDB4NmMsMHhlYywKKwkweDFjLDB4OWMsMHg1YywweGRjLDB4M2MsMHhiYywweDdjLDB4ZmMsCisJMHgwMiwweDgyLDB4NDIsMHhjMiwweDIyLDB4YTIsMHg2MiwweGUyLAorCTB4MTIsMHg5MiwweDUyLDB4ZDIsMHgzMiwweGIyLDB4NzIsMHhmMiwKKwkweDBhLDB4OGEsMHg0YSwweGNhLDB4MmEsMHhhYSwweDZhLDB4ZWEsCisJMHgxYSwweDlhLDB4NWEsMHhkYSwweDNhLDB4YmEsMHg3YSwweGZhLAorCTB4MDYsMHg4NiwweDQ2LDB4YzYsMHgyNiwweGE2LDB4NjYsMHhlNiwKKwkweDE2LDB4OTYsMHg1NiwweGQ2LDB4MzYsMHhiNiwweDc2LDB4ZjYsCisJMHgwZSwweDhlLDB4NGUsMHhjZSwweDJlLDB4YWUsMHg2ZSwweGVlLAorCTB4MWUsMHg5ZSwweDVlLDB4ZGUsMHgzZSwweGJlLDB4N2UsMHhmZSwKKwkweDAxLDB4ODEsMHg0MSwweGMxLDB4MjEsMHhhMSwweDYxLDB4ZTEsCisJMHgxMSwweDkxLDB4NTEsMHhkMSwweDMxLDB4YjEsMHg3MSwweGYxLAorCTB4MDksMHg4OSwweDQ5LDB4YzksMHgyOSwweGE5LDB4NjksMHhlOSwKKwkweDE5LDB4OTksMHg1OSwweGQ5LDB4MzksMHhiOSwweDc5LDB4ZjksCisJMHgwNSwweDg1LDB4NDUsMHhjNSwweDI1LDB4YTUsMHg2NSwweGU1LAorCTB4MTUsMHg5NSwweDU1LDB4ZDUsMHgzNSwweGI1LDB4NzUsMHhmNSwKKwkweDBkLDB4OGQsMHg0ZCwweGNkLDB4MmQsMHhhZCwweDZkLDB4ZWQsCisJMHgxZCwweDlkLDB4NWQsMHhkZCwweDNkLDB4YmQsMHg3ZCwweGZkLAorCTB4MDMsMHg4MywweDQzLDB4YzMsMHgyMywweGEzLDB4NjMsMHhlMywKKwkweDEzLDB4OTMsMHg1MywweGQzLDB4MzMsMHhiMywweDczLDB4ZjMsCisJMHgwYiwweDhiLDB4NGIsMHhjYiwweDJiLDB4YWIsMHg2YiwweGViLAorCTB4MWIsMHg5YiwweDViLDB4ZGIsMHgzYiwweGJiLDB4N2IsMHhmYiwKKwkweDA3LDB4ODcsMHg0NywweGM3LDB4MjcsMHhhNywweDY3LDB4ZTcsCisJMHgxNywweDk3LDB4NTcsMHhkNywweDM3LDB4YjcsMHg3NywweGY3LAorCTB4MGYsMHg4ZiwweDRmLDB4Y2YsMHgyZiwweGFmLDB4NmYsMHhlZiwKKwkweDFmLDB4OWYsMHg1ZiwweGRmLDB4M2YsMHhiZiwweDdmLDB4ZmYKK30gOworCisjaWZkZWYJTUFLRV9UQUJMRQoraW50IGJ5dGVfcmV2ZXJzZSh4KQoraW50IHggOworeworCWludCAgICAgeSA9IDAgOworCisJaWYgKHggJiAweDAxKQorCQl5IHw9IDB4ODAgOworCWlmICh4ICYgMHgwMikKKwkJeSB8PSAweDQwIDsKKwlpZiAoeCAmIDB4MDQpCisJCXkgfD0gMHgyMCA7CisJaWYgKHggJiAweDA4KQorCQl5IHw9IDB4MTAgOworCWlmICh4ICYgMHgxMCkKKwkJeSB8PSAweDA4IDsKKwlpZiAoeCAmIDB4MjApCisJCXkgfD0gMHgwNCA7CisJaWYgKHggJiAweDQwKQorCQl5IHw9IDB4MDIgOworCWlmICh4ICYgMHg4MCkKKwkJeSB8PSAweDAxIDsKKwlyZXR1cm4oeSkgOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2NmbS5jIGIvZHJpdmVycy9uZXQvc2tmcC9jZm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzhhYWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9jZm0uYwpAQCAtMCwwICsxLDYyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVNlZSB0aGUgZmlsZSAic2tmZGRpLmMiIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKwlTTVQgQ0ZNCisJQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50CisJREFTIHdpdGggc2luZ2xlIE1BQworKi8KKworLyoKKyAqCUhhcmR3YXJlIGluZGVwZW5kZW50IHN0YXRlIG1hY2hpbmUgaW1wbGVtYW50YXRpb24KKyAqCVRoZSBmb2xsb3dpbmcgZXh0ZXJuYWwgU01UIGZ1bmN0aW9ucyBhcmUgcmVmZXJlbmNlZCA6CisgKgorICoJCXF1ZXVlX2V2ZW50KCkKKyAqCisgKglUaGUgZm9sbG93aW5nIGV4dGVybmFsIEhXIGRlcGVuZGVudCBmdW5jdGlvbnMgYXJlIHJlZmVyZW5jZWQgOgorICoJCWNvbmZpZ19tdXgoKQorICoKKyAqCVRoZSBmb2xsb3dpbmcgSFcgZGVwZW5kZW50IGV2ZW50cyBhcmUgcmVxdWlyZWQgOgorICoJCU5PTkUgCisgKi8KKworI2luY2x1ZGUgImgvdHlwZXMuaCIKKyNpbmNsdWRlICJoL2ZkZGkuaCIKKyNpbmNsdWRlICJoL3NtYy5oIgorCisjZGVmaW5lIEtFUk5FTAorI2luY2x1ZGUgImgvc210c3RhdGUuaCIKKworI2lmbmRlZglsaW50CitzdGF0aWMgY29uc3QgY2hhciBJRF9zY2NzW10gPSAiQCgjKWNmbS5jCTIuMTggOTgvMTAvMDYgKEMpIFNLICIgOworI2VuZGlmCisKKy8qCisgKiBGU00gTWFjcm9zCisgKi8KKyNkZWZpbmUgQUZMQUcJMHgxMAorI2RlZmluZSBHT19TVEFURSh4KQkoc21jLT5taWIuZmRkaVNNVENGX1N0YXRlID0gKHgpfEFGTEFHKQorI2RlZmluZSBBQ1RJT05TX0RPTkUoKQkoc21jLT5taWIuZmRkaVNNVENGX1N0YXRlICY9IH5BRkxBRykKKyNkZWZpbmUgQUNUSU9OUyh4KQkoeHxBRkxBRykKKworI2lmZGVmCURFQlVHCisvKgorICogc3ltYm9saWMgc3RhdGUgbmFtZXMKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZm1fc3RhdGVzW10gPSB7CisJIlNDMF9JU09MQVRFRCIsIkNGMSIsIkNGMiIsIkNGMyIsIkNGNCIsCisJIlNDMV9XUkFQX0EiLCJTQzJfV1JBUF9CIiwiU0M1X1RSSFVfQiIsIlNDN19XUkFQX1MiLAorCSJTQzlfQ19XUkFQX0EiLCJTQzEwX0NfV1JBUF9CIiwiU0MxMV9DX1dSQVBfUyIsIlNDNF9USFJVX0EiCit9IDsKKworLyoKKyAqIHN5bWJvbGljIGV2ZW50IG5hbWVzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2ZtX2V2ZW50c1tdID0geworCSJOT05FIiwiQ0ZfTE9PUF9BIiwiQ0ZfTE9PUF9CIiwiQ0ZfSk9JTl9BIiwiQ0ZfSk9JTl9CIgorfSA7CisjZW5kaWYKKworLyoKKyAqIG1hcCBmcm9tIHN0YXRlIHRvIGRvd25zdHJlYW0gcG9ydCB0eXBlCisgKi8KK3N0YXRpYyBjb25zdCB1X2NoYXIgY2ZfdG9fcHR5cGVbXSA9IHsKKwlUTk9ORSxUTk9ORSxUTk9ORSxUTk9ORSxUTk9ORSwKKwlUTk9ORSxUQixUQixUUywKKwlUQSxUQixUUyxUQgorfSA7CisKKy8qCisgKiBDRU0gcG9ydCBzdGF0ZXMKKyAqLworI2RlZmluZQlDRU1fUFNUX0RPV04JMAorI2RlZmluZQlDRU1fUFNUX1VQCTEKKyNkZWZpbmUJQ0VNX1BTVF9IT0xECTIKKy8qIGRlZmluZSBwb3J0c3RhdGUgYXJyYXkgb25seSBmb3IgQSBhbmQgQiBwb3J0ICovCisvKiBEbyB0aGlzIHdpdGhpbiB0aGUgc21jIHN0cnVjdHVyZSAodXNlIGluIG11bHRpcGxlIGNhcmRzKSAqLworCisvKgorICogYWxsIEdsb2JhbHMgIGFyZSBkZWZpbmVkIGluIHNtYy5oCisgKiBzdHJ1Y3Qgc19jZm0KKyAqLworCisvKgorICogZnVuY3Rpb24gZGVjbGFyYXRpb25zCisgKi8KK3N0YXRpYyB2b2lkIGNmbV9mc20oc3RydWN0IHNfc21jICpzbWMsIGludCBjbWQpOworCisvKgorCWluaXQgQ0ZNIHN0YXRlIG1hY2hpbmUKKwljbGVhciBhbGwgQ0ZNIHZhcnMgYW5kIGZsYWdzCisqLwordm9pZCBjZm1faW5pdChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzbWMtPm1pYi5mZGRpU01UQ0ZfU3RhdGUgPSBBQ1RJT05TKFNDMF9JU09MQVRFRCkgOworCXNtYy0+ci5ybV9qb2luID0gMCA7CisJc21jLT5yLnJtX2xvb3AgPSAwIDsKKwlzbWMtPnlbUEFdLnNjcnViID0gMCA7CisJc21jLT55W1BCXS5zY3J1YiA9IDAgOworCXNtYy0+eVtQQV0uY2VtX3BzdCA9IENFTV9QU1RfRE9XTiA7CisJc21jLT55W1BCXS5jZW1fcHN0ID0gQ0VNX1BTVF9ET1dOIDsKK30KKworLyogU29tZSB0ZXJtcyBjb25kaXRpb25zIHVzZWQgYnkgdGhlIHNlbGVjdGlvbiBjcml0ZXJpYSAqLworI2RlZmluZSBUSFJVX0VOQUJMRUQoc21jKQkoc21jLT55W1BBXS5wY19tb2RlICE9IFBNX1RSRUUgJiYgXAorCQkJCSBzbWMtPnlbUEJdLnBjX21vZGUgIT0gUE1fVFJFRSkKKy8qIFNlbGVjdGlvbiBjcml0ZXJpYSBmb3IgdGhlIHBvcnRzICovCitzdGF0aWMgdm9pZCBzZWxlY3Rpb25fY3JpdGVyaWEgKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc19waHkgKnBoeSkKK3sKKworCXN3aXRjaCAocGh5LT5taWItPmZkZGlQT1JUTXlfVHlwZSkgeworCWNhc2UgVEE6CisJCWlmICggIVRIUlVfRU5BQkxFRChzbWMpICYmIHNtYy0+eVtQQl0uY2Zfam9pbiApIHsKKwkJCXBoeS0+d2NfZmxhZyA9IFRSVUUgOworCQl9IGVsc2UgeworCQkJcGh5LT53Y19mbGFnID0gRkFMU0UgOworCQl9CisKKwkJYnJlYWs7CisJY2FzZSBUQjoKKwkJLyogdGFrZSBwcmVjZWRlbmNlIG92ZXIgUEEgKi8KKwkJcGh5LT53Y19mbGFnID0gRkFMU0UgOworCQlicmVhazsKKwljYXNlIFRTOgorCQlwaHktPndjX2ZsYWcgPSBGQUxTRSA7CisJCWJyZWFrOworCWNhc2UgVE06CisJCXBoeS0+d2NfZmxhZyA9IEZBTFNFIDsKKwkJYnJlYWs7CisJfQorCit9CisKK3ZvaWQgYWxsX3NlbGVjdGlvbl9jcml0ZXJpYShzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzdHJ1Y3Qgc19waHkJKnBoeSA7CisJaW50CQlwIDsKKworCWZvciAoIHAgPSAwLHBoeSA9IHNtYy0+eSA7IHAgPCBOVU1QSFlTOyBwKyssIHBoeSsrICkgeworCQkvKiBEbyB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhICovCisJCXNlbGVjdGlvbl9jcml0ZXJpYSAoc21jLHBoeSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjZW1fcHJpdl9zdGF0ZShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGV2ZW50KQorLyogU3RhdGUgbWFjaGluZSBmb3IgcHJpdmF0ZSBQT1JUIHN0YXRlczogdXNlZCB0byBvcHRpbWl6ZSBkdWFsIGhvbWluZyAqLworeworCWludAlucDsJLyogTnVtYmVyIG9mIHRoZSBwb3J0ICovCisJaW50CWk7CisKKwkvKiBEbyB0aGlzIG9ubHkgaW4gYSBEQVMgKi8KKwlpZiAoc21jLT5zLnNhcyAhPSBTTVRfREFTICkKKwkJcmV0dXJuIDsKKworCW5wID0gZXZlbnQgLSBDRl9KT0lOOworCisJaWYgKG5wICE9IFBBICYmIG5wICE9IFBCKSB7CisJCXJldHVybiA7CisJfQorCS8qIENoYW5nZSB0aGUgcG9ydCBzdGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGV2ZW50IChwb3J0bnVtYmVyKSAqLworCWlmIChzbWMtPnlbbnBdLmNmX2pvaW4pIHsKKwkJc21jLT55W25wXS5jZW1fcHN0ID0gQ0VNX1BTVF9VUCA7CisJfSBlbHNlIGlmICghc21jLT55W25wXS53Y19mbGFnKSB7CisJCS8qIHNldCB0aGUgcG9ydCB0byBkb25lIG9ubHkgaWYgaXQgaXMgbm90IHdpdGhoZWxkICovCisJCXNtYy0+eVtucF0uY2VtX3BzdCA9IENFTV9QU1RfRE9XTiA7CisJfQorCisJLyogRG9uJ3Qgc2V0IGFuIGhvbGQgcG9ydCB0byBkb3duICovCisKKwkvKiBDaGVjayBhbGwgcG9ydHMgb2YgcmVzdGFydCBjb25kaXRpb25zICovCisJZm9yIChpID0gMCA7IGkgPCAyIDsgaSArKyApIHsKKwkJLyogQ2hlY2sgYWxsIHBvcnQgZm9yIFBPUlQgaXMgb24gaG9sZCBhbmQgbm8gd2l0aGhvbGQgaXMgZG9uZSAqLworCQlpZiAoIHNtYy0+eVtpXS5jZW1fcHN0ID09IENFTV9QU1RfSE9MRCAmJiAhc21jLT55W2ldLndjX2ZsYWcgKSB7CisJCQlzbWMtPnlbaV0uY2VtX3BzdCA9IENFTV9QU1RfRE9XTjsKKwkJCXF1ZXVlX2V2ZW50KHNtYywoaW50KShFVkVOVF9QQ00raSksUENfU1RBUlQpIDsKKwkJfQorCQlpZiAoIHNtYy0+eVtpXS5jZW1fcHN0ID09IENFTV9QU1RfVVAgJiYgc21jLT55W2ldLndjX2ZsYWcgKSB7CisJCQlzbWMtPnlbaV0uY2VtX3BzdCA9IENFTV9QU1RfSE9MRDsKKwkJCXF1ZXVlX2V2ZW50KHNtYywoaW50KShFVkVOVF9QQ00raSksUENfU1RBUlQpIDsKKwkJfQorCQlpZiAoIHNtYy0+eVtpXS5jZW1fcHN0ID09IENFTV9QU1RfRE9XTiAmJiBzbWMtPnlbaV0ud2NfZmxhZyApIHsKKwkJCS8qCisJCQkgKiBUaGUgcG9ydCBtdXN0IGJlIHJlc3RhcnRlZCB3aGVuIHRoZSB3Y19mbGFnCisJCQkgKiB3aWxsIGJlIHJlc2V0LiBTbyBzZXQgdGhlIHBvcnQgb24gaG9sZC4KKwkJCSAqLworCQkJc21jLT55W2ldLmNlbV9wc3QgPSBDRU1fUFNUX0hPTEQ7CisJCX0KKwl9CisJcmV0dXJuIDsKK30KKworLyoKKwlDRk0gc3RhdGUgbWFjaGluZQorCWNhbGxlZCBieSBkaXNwYXRjaGVyCisKKwlkbworCQlkaXNwbGF5IHN0YXRlIGNoYW5nZQorCQlwcm9jZXNzIGV2ZW50CisJdW50aWwgU00gaXMgc3RhYmxlCisqLwordm9pZCBjZm0oc3RydWN0IHNfc21jICpzbWMsIGludCBldmVudCkKK3sKKwlpbnQJc3RhdGUgOwkJLyogcmVtZW1iZXIgbGFzdCBzdGF0ZSAqLworCWludAljb25kIDsKKwlpbnQJb2xkc3RhdGUgOworCisJLyogV2Ugd2lsbCBkbyB0aGUgZm9sbG93aW5nOiAqLworCS8qICAtIGNvbXB1dGUgdGhlIHZhcmlhYmxlIFdDX0ZsYWcgZm9yIGV2ZXJ5IHBvcnQgKFRoaXMgaXMgd2hlcmUgKi8KKwkvKiAgICB3ZSBjYW4gZXh0ZW5kIHRoZSByZXF1ZXN0ZWQgcGF0aCBjaGVja2luZyAhISkgKi8KKwkvKiAgLSBkbyB0aGUgb2xkIChTTVQgNi4yIGxpa2UpIHN0YXRlIG1hY2hpbmUgKi8KKwkvKiAgLSBkbyB0aGUgcmVzdWx0aW5nIHN0YXRpb24gc3RhdGVzICovCisKKwlhbGxfc2VsZWN0aW9uX2NyaXRlcmlhIChzbWMpOworCisJLyogV2Ugd2lsbCBjaGVjayBub3cgd2hldGhlciBhIHN0YXRlIHRyYW5zaXRpb24gaXMgYWxsb3dlZCBvciBub3QgKi8KKwkvKiAgLSBjaGFuZ2UgdGhlIHBvcnRzdGF0ZXMgKi8KKwljZW1fcHJpdl9zdGF0ZSAoc21jLCBldmVudCk7CisKKwlvbGRzdGF0ZSA9IHNtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZSA7CisJZG8geworCQlEQl9DRk0oIkNGTSA6IHN0YXRlICVzJXMiLAorCQkJKHNtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZSAmIEFGTEFHKSA/ICJBQ1RJT05TICIgOiAiIiwKKwkJCWNmbV9zdGF0ZXNbc21jLT5taWIuZmRkaVNNVENGX1N0YXRlICYgfkFGTEFHXSkgOworCQlEQl9DRk0oIiBldmVudCAlc1xuIixjZm1fZXZlbnRzW2V2ZW50XSwwKSA7CisJCXN0YXRlID0gc21jLT5taWIuZmRkaVNNVENGX1N0YXRlIDsKKwkJY2ZtX2ZzbShzbWMsZXZlbnQpIDsKKwkJZXZlbnQgPSAwIDsKKwl9IHdoaWxlIChzdGF0ZSAhPSBzbWMtPm1pYi5mZGRpU01UQ0ZfU3RhdGUpIDsKKworI2lmbmRlZglTTElNX1NNVAorCS8qCisJICogY2hlY2sgcGVlciB3cmFwIGNvbmRpdGlvbgorCSAqLworCWNvbmQgPSBGQUxTRSA7CisJaWYgKAkoc21jLT5taWIuZmRkaVNNVENGX1N0YXRlID09IFNDOV9DX1dSQVBfQSAmJgorCQlzbWMtPnlbUEFdLnBjX21vZGUgPT0gUE1fUEVFUikgCXx8CisJCShzbWMtPm1pYi5mZGRpU01UQ0ZfU3RhdGUgPT0gU0MxMF9DX1dSQVBfQiAmJgorCQlzbWMtPnlbUEJdLnBjX21vZGUgPT0gUE1fUEVFUikgCXx8CisJCShzbWMtPm1pYi5mZGRpU01UQ0ZfU3RhdGUgPT0gU0MxMV9DX1dSQVBfUyAmJgorCQlzbWMtPnlbUFNdLnBjX21vZGUgPT0gUE1fUEVFUiAmJgorCQlzbWMtPnlbUFNdLm1pYi0+ZmRkaVBPUlROZWlnaGJvclR5cGUgIT0gVFMgKSApIHsKKwkJCWNvbmQgPSBUUlVFIDsKKwl9CisJaWYgKGNvbmQgIT0gc21jLT5taWIuZmRkaVNNVFBlZXJXcmFwRmxhZykKKwkJc210X3NyZl9ldmVudChzbWMsU01UX0NPTkRfU01UX1BFRVJfV1JBUCwwLGNvbmQpIDsKKworI2lmCTAKKwkvKgorCSAqIERvbid0IHNlbmQgZXZlciBNQUNfUEFUSF9DSEFOR0UgZXZlbnRzLiBPdXIgTUFDIGlzIGhhcmQtd2lyZWQKKwkgKiB0byB0aGUgcHJpbWFyeSBwYXRoLgorCSAqLworCS8qCisJICogcGF0aCBjaGFuZ2UKKwkgKi8KKwlpZiAoc21jLT5taWIuZmRkaVNNVENGX1N0YXRlICE9IG9sZHN0YXRlKSB7CisJCXNtdF9zcmZfZXZlbnQoc21jLFNNVF9FVkVOVF9NQUNfUEFUSF9DSEFOR0UsSU5ERVhfTUFDLDApIDsKKwl9CisjZW5kaWYKKyNlbmRpZgkvKiBubyBTTElNX1NNVCAqLworCisJLyoKKwkgKiBzZXQgTUFDIHBvcnQgdHlwZQorCSAqLworCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0Rvd25zdHJlYW1QT1JUVHlwZSA9CisJCWNmX3RvX3B0eXBlW3NtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZV0gOworCWNmbV9zdGF0ZV9jaGFuZ2Uoc21jLChpbnQpc21jLT5taWIuZmRkaVNNVENGX1N0YXRlKSA7Cit9CisKKy8qCisJcHJvY2VzcyBDRk0gZXZlbnQKKyovCisvKkFSR1NVU0VEMSovCitzdGF0aWMgdm9pZCBjZm1fZnNtKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgY21kKQoreworCXN3aXRjaChzbWMtPm1pYi5mZGRpU01UQ0ZfU3RhdGUpIHsKKwljYXNlIEFDVElPTlMoU0MwX0lTT0xBVEVEKSA6CisJCXNtYy0+bWliLnBbUEFdLmZkZGlQT1JUQ3VycmVudFBhdGggPSBNSUJfUEFUSF9JU09MQVRFRCA7CisJCXNtYy0+bWliLnBbUEJdLmZkZGlQT1JUQ3VycmVudFBhdGggPSBNSUJfUEFUSF9JU09MQVRFRCA7CisJCXNtYy0+bWliLnBbUEFdLmZkZGlQT1JUTUFDUGxhY2VtZW50ID0gMCA7CisJCXNtYy0+bWliLnBbUEJdLmZkZGlQT1JUTUFDUGxhY2VtZW50ID0gMCA7CisJCXNtYy0+bWliLmZkZGlTTVRTdGF0aW9uU3RhdHVzID0gTUlCX1NNVF9TVEFTVEFfU0VQQSA7CisJCWNvbmZpZ19tdXgoc21jLE1VWF9JU09MQVRFKSA7CS8qIGNvbmZpZ3VyZSBQSFkgTXV4ICovCisJCXNtYy0+ci5ybV9sb29wID0gRkFMU0UgOworCQlzbWMtPnIucm1fam9pbiA9IEZBTFNFIDsKKwkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1JNVCxSTV9KT0lOKSA7Lyogc2lnbmFsIFJNVCAqLworCQkvKiBEb24ndCBkbyB0aGUgV0MtRmxhZyBjaGFuZ2luZyBoZXJlICovCisJCUFDVElPTlNfRE9ORSgpIDsKKwkJREJfQ0ZNTigxLCJDRk0gOiAlc1xuIixjZm1fc3RhdGVzW3NtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZV0sMCkgOworCQlicmVhazsKKwljYXNlIFNDMF9JU09MQVRFRCA6CisJCS8qU0MwNyovCisJCS8qU0FTIHBvcnQgY2FuIGJlIFBBIG9yIFBCICEgKi8KKwkJaWYgKHNtYy0+cy5zYXMgJiYgKHNtYy0+eVtQQV0uY2Zfam9pbiB8fCBzbWMtPnlbUEFdLmNmX2xvb3AgfHwKKwkJCQlzbWMtPnlbUEJdLmNmX2pvaW4gfHwgc21jLT55W1BCXS5jZl9sb29wKSkgeworCQkJR09fU1RBVEUoU0MxMV9DX1dSQVBfUykgOworCQkJYnJlYWsgOworCQl9CisJCS8qU0MwMSovCisJCWlmICgoc21jLT55W1BBXS5jZW1fcHN0ID09IENFTV9QU1RfVVAgJiYgc21jLT55W1BBXS5jZl9qb2luICYmCisJCSAgICAgIXNtYy0+eVtQQV0ud2NfZmxhZykgfHwgc21jLT55W1BBXS5jZl9sb29wKSB7CisJCQlHT19TVEFURShTQzlfQ19XUkFQX0EpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKlNDMDIqLworCQlpZiAoKHNtYy0+eVtQQl0uY2VtX3BzdCA9PSBDRU1fUFNUX1VQICYmIHNtYy0+eVtQQl0uY2Zfam9pbiAmJgorCQkgICAgICFzbWMtPnlbUEJdLndjX2ZsYWcpIHx8IHNtYy0+eVtQQl0uY2ZfbG9vcCkgeworCQkJR09fU1RBVEUoU0MxMF9DX1dSQVBfQikgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIEFDVElPTlMoU0M5X0NfV1JBUF9BKSA6CisJCXNtYy0+bWliLnBbUEFdLmZkZGlQT1JUQ3VycmVudFBhdGggPSBNSUJfUEFUSF9DT05DQVRFTkFURUQgOworCQlzbWMtPm1pYi5wW1BCXS5mZGRpUE9SVEN1cnJlbnRQYXRoID0gTUlCX1BBVEhfSVNPTEFURUQgOworCQlzbWMtPm1pYi5wW1BBXS5mZGRpUE9SVE1BQ1BsYWNlbWVudCA9IElOREVYX01BQyA7CisJCXNtYy0+bWliLnBbUEJdLmZkZGlQT1JUTUFDUGxhY2VtZW50ID0gMCA7CisJCXNtYy0+bWliLmZkZGlTTVRTdGF0aW9uU3RhdHVzID0gTUlCX1NNVF9TVEFTVEFfQ09OIDsKKwkJY29uZmlnX211eChzbWMsTVVYX1dSQVBBKSA7CQkvKiBjb25maWd1cmUgUEhZIG11eCAqLworCQlpZiAoc21jLT55W1BBXS5jZl9sb29wKSB7CisJCQlzbWMtPnIucm1fam9pbiA9IEZBTFNFIDsKKwkJCXNtYy0+ci5ybV9sb29wID0gVFJVRSA7CisJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUk1ULFJNX0xPT1ApIDsvKiBzaWduYWwgUk1UICovCisJCX0KKwkJaWYgKHNtYy0+eVtQQV0uY2Zfam9pbikgeworCQkJc21jLT5yLnJtX2xvb3AgPSBGQUxTRSA7CisJCQlzbWMtPnIucm1fam9pbiA9IFRSVUUgOworCQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1JNVCxSTV9KT0lOKSA7Lyogc2lnbmFsIFJNVCAqLworCQl9CisJCUFDVElPTlNfRE9ORSgpIDsKKwkJREJfQ0ZNTigxLCJDRk0gOiAlc1xuIixjZm1fc3RhdGVzW3NtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZV0sMCkgOworCQlicmVhayA7CisJY2FzZSBTQzlfQ19XUkFQX0EgOgorCQkvKlNDMTAqLworCQlpZiAoIChzbWMtPnlbUEFdLndjX2ZsYWcgfHwgIXNtYy0+eVtQQV0uY2Zfam9pbikgJiYKKwkJICAgICAgIXNtYy0+eVtQQV0uY2ZfbG9vcCApIHsKKwkJCUdPX1NUQVRFKFNDMF9JU09MQVRFRCkgOworCQkJYnJlYWsgOworCQl9CisJCS8qU0MxMiovCisJCWVsc2UgaWYgKCAoc21jLT55W1BCXS5jZl9sb29wICYmIHNtYy0+eVtQQV0uY2Zfam9pbiAmJgorCQkJICAgc21jLT55W1BBXS5jZW1fcHN0ID09IENFTV9QU1RfVVApIHx8CisJCQkgICgoc21jLT55W1BCXS5jZl9sb29wIHx8CisJCQkgICAoc21jLT55W1BCXS5jZl9qb2luICYmCisJCQkgICAgc21jLT55W1BCXS5jZW1fcHN0ID09IENFTV9QU1RfVVApKSAmJgorCQkJICAgIChzbWMtPnlbUEFdLnBjX21vZGUgPT0gUE1fVFJFRSB8fAorCQkJICAgICBzbWMtPnlbUEJdLnBjX21vZGUgPT0gUE1fVFJFRSkpKSB7CisJCQlzbWMtPnlbUEFdLnNjcnViID0gVFJVRSA7CisJCQlHT19TVEFURShTQzEwX0NfV1JBUF9CKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypTQzE0Ki8KKwkJZWxzZSBpZiAoIXNtYy0+cy5hdHRhY2hfcyAmJgorCQkJICBzbWMtPnlbUEFdLmNmX2pvaW4gJiYKKwkJCSAgc21jLT55W1BBXS5jZW1fcHN0ID09IENFTV9QU1RfVVAgJiYKKwkJCSAgc21jLT55W1BBXS5wY19tb2RlID09IFBNX1BFRVIgJiYgc21jLT55W1BCXS5jZl9qb2luICYmCisJCQkgIHNtYy0+eVtQQl0uY2VtX3BzdCA9PSBDRU1fUFNUX1VQICYmCisJCQkgIHNtYy0+eVtQQl0ucGNfbW9kZSA9PSBQTV9QRUVSKSB7CisJCQlzbWMtPnlbUEFdLnNjcnViID0gVFJVRSA7CisJCQlzbWMtPnlbUEJdLnNjcnViID0gVFJVRSA7CisJCQlHT19TVEFURShTQzRfVEhSVV9BKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypTQzE1Ki8KKwkJZWxzZSBpZiAoIHNtYy0+cy5hdHRhY2hfcyAmJgorCQkJICBzbWMtPnlbUEFdLmNmX2pvaW4gJiYKKwkJCSAgc21jLT55W1BBXS5jZW1fcHN0ID09IENFTV9QU1RfVVAgJiYKKwkJCSAgc21jLT55W1BBXS5wY19tb2RlID09IFBNX1BFRVIgJiYKKwkJCSAgc21jLT55W1BCXS5jZl9qb2luICYmCisJCQkgIHNtYy0+eVtQQl0uY2VtX3BzdCA9PSBDRU1fUFNUX1VQICYmCisJCQkgIHNtYy0+eVtQQl0ucGNfbW9kZSA9PSBQTV9QRUVSKSB7CisJCQlzbWMtPnlbUEFdLnNjcnViID0gVFJVRSA7CisJCQlzbWMtPnlbUEJdLnNjcnViID0gVFJVRSA7CisJCQlHT19TVEFURShTQzVfVEhSVV9CKSA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgQUNUSU9OUyhTQzEwX0NfV1JBUF9CKSA6CisJCXNtYy0+bWliLnBbUEFdLmZkZGlQT1JUQ3VycmVudFBhdGggPSBNSUJfUEFUSF9JU09MQVRFRCA7CisJCXNtYy0+bWliLnBbUEJdLmZkZGlQT1JUQ3VycmVudFBhdGggPSBNSUJfUEFUSF9DT05DQVRFTkFURUQgOworCQlzbWMtPm1pYi5wW1BBXS5mZGRpUE9SVE1BQ1BsYWNlbWVudCA9IDAgOworCQlzbWMtPm1pYi5wW1BCXS5mZGRpUE9SVE1BQ1BsYWNlbWVudCA9IElOREVYX01BQyA7CisJCXNtYy0+bWliLmZkZGlTTVRTdGF0aW9uU3RhdHVzID0gTUlCX1NNVF9TVEFTVEFfQ09OIDsKKwkJY29uZmlnX211eChzbWMsTVVYX1dSQVBCKSA7CQkvKiBjb25maWd1cmUgUEhZIG11eCAqLworCQlpZiAoc21jLT55W1BCXS5jZl9sb29wKSB7CisJCQlzbWMtPnIucm1fam9pbiA9IEZBTFNFIDsKKwkJCXNtYy0+ci5ybV9sb29wID0gVFJVRSA7CisJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUk1ULFJNX0xPT1ApIDsvKiBzaWduYWwgUk1UICovCisJCX0KKwkJaWYgKHNtYy0+eVtQQl0uY2Zfam9pbikgeworCQkJc21jLT5yLnJtX2xvb3AgPSBGQUxTRSA7CisJCQlzbWMtPnIucm1fam9pbiA9IFRSVUUgOworCQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1JNVCxSTV9KT0lOKSA7Lyogc2lnbmFsIFJNVCAqLworCQl9CisJCUFDVElPTlNfRE9ORSgpIDsKKwkJREJfQ0ZNTigxLCJDRk0gOiAlc1xuIixjZm1fc3RhdGVzW3NtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZV0sMCkgOworCQlicmVhayA7CisJY2FzZSBTQzEwX0NfV1JBUF9CIDoKKwkJLypTQzIwKi8KKwkJaWYgKCAhc21jLT55W1BCXS5jZl9qb2luICYmICFzbWMtPnlbUEJdLmNmX2xvb3AgKSB7CisJCQlHT19TVEFURShTQzBfSVNPTEFURUQpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKlNDMjEqLworCQllbHNlIGlmICggc21jLT55W1BBXS5jZl9sb29wICYmIHNtYy0+eVtQQV0ucGNfbW9kZSA9PSBQTV9QRUVSICYmCisJCQkgIHNtYy0+eVtQQl0uY2Zfam9pbiAmJiBzbWMtPnlbUEJdLnBjX21vZGUgPT0gUE1fUEVFUikgeworCQkJc21jLT55W1BCXS5zY3J1YiA9IFRSVUUgOworCQkJR09fU1RBVEUoU0M5X0NfV1JBUF9BKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypTQzI0Ki8KKwkJZWxzZSBpZiAoIXNtYy0+cy5hdHRhY2hfcyAmJgorCQkJIHNtYy0+eVtQQV0uY2Zfam9pbiAmJiBzbWMtPnlbUEFdLnBjX21vZGUgPT0gUE1fUEVFUiAmJgorCQkJIHNtYy0+eVtQQl0uY2Zfam9pbiAmJiBzbWMtPnlbUEJdLnBjX21vZGUgPT0gUE1fUEVFUikgeworCQkJc21jLT55W1BBXS5zY3J1YiA9IFRSVUUgOworCQkJc21jLT55W1BCXS5zY3J1YiA9IFRSVUUgOworCQkJR09fU1RBVEUoU0M0X1RIUlVfQSkgOworCQkJYnJlYWsgOworCQl9CisJCS8qU0MyNSovCisJCWVsc2UgaWYgKCBzbWMtPnMuYXR0YWNoX3MgJiYKKwkJCSBzbWMtPnlbUEFdLmNmX2pvaW4gJiYgc21jLT55W1BBXS5wY19tb2RlID09IFBNX1BFRVIgJiYKKwkJCSBzbWMtPnlbUEJdLmNmX2pvaW4gJiYgc21jLT55W1BCXS5wY19tb2RlID09IFBNX1BFRVIpIHsKKwkJCXNtYy0+eVtQQV0uc2NydWIgPSBUUlVFIDsKKwkJCXNtYy0+eVtQQl0uc2NydWIgPSBUUlVFIDsKKwkJCUdPX1NUQVRFKFNDNV9USFJVX0IpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQlicmVhayA7CisJY2FzZSBBQ1RJT05TKFNDNF9USFJVX0EpIDoKKwkJc21jLT5taWIucFtQQV0uZmRkaVBPUlRDdXJyZW50UGF0aCA9IE1JQl9QQVRIX1RIUlUgOworCQlzbWMtPm1pYi5wW1BCXS5mZGRpUE9SVEN1cnJlbnRQYXRoID0gTUlCX1BBVEhfVEhSVSA7CisJCXNtYy0+bWliLnBbUEFdLmZkZGlQT1JUTUFDUGxhY2VtZW50ID0gMCA7CisJCXNtYy0+bWliLnBbUEJdLmZkZGlQT1JUTUFDUGxhY2VtZW50ID0gSU5ERVhfTUFDIDsKKwkJc21jLT5taWIuZmRkaVNNVFN0YXRpb25TdGF0dXMgPSBNSUJfU01UX1NUQVNUQV9USFJVIDsKKwkJY29uZmlnX211eChzbWMsTVVYX1RIUlVBKSA7CQkvKiBjb25maWd1cmUgUEhZIG11eCAqLworCQlzbWMtPnIucm1fbG9vcCA9IEZBTFNFIDsKKwkJc21jLT5yLnJtX2pvaW4gPSBUUlVFIDsKKwkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1JNVCxSTV9KT0lOKSA7Lyogc2lnbmFsIFJNVCAqLworCQlBQ1RJT05TX0RPTkUoKSA7CisJCURCX0NGTU4oMSwiQ0ZNIDogJXNcbiIsY2ZtX3N0YXRlc1tzbWMtPm1pYi5mZGRpU01UQ0ZfU3RhdGVdLDApIDsKKwkJYnJlYWsgOworCWNhc2UgU0M0X1RIUlVfQSA6CisJCS8qU0M0MSovCisJCWlmIChzbWMtPnlbUEJdLndjX2ZsYWcgfHwgIXNtYy0+eVtQQl0uY2Zfam9pbikgeworCQkJc21jLT55W1BBXS5zY3J1YiA9IFRSVUUgOworCQkJR09fU1RBVEUoU0M5X0NfV1JBUF9BKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypTQzQyKi8KKwkJZWxzZSBpZiAoIXNtYy0+eVtQQV0uY2Zfam9pbiB8fCBzbWMtPnlbUEFdLndjX2ZsYWcpIHsKKwkJCXNtYy0+eVtQQl0uc2NydWIgPSBUUlVFIDsKKwkJCUdPX1NUQVRFKFNDMTBfQ19XUkFQX0IpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKlNDNDUqLworCQllbHNlIGlmIChzbWMtPnMuYXR0YWNoX3MpIHsKKwkJCXNtYy0+eVtQQl0uc2NydWIgPSBUUlVFIDsKKwkJCUdPX1NUQVRFKFNDNV9USFJVX0IpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQlicmVhayA7CisJY2FzZSBBQ1RJT05TKFNDNV9USFJVX0IpIDoKKwkJc21jLT5taWIucFtQQV0uZmRkaVBPUlRDdXJyZW50UGF0aCA9IE1JQl9QQVRIX1RIUlUgOworCQlzbWMtPm1pYi5wW1BCXS5mZGRpUE9SVEN1cnJlbnRQYXRoID0gTUlCX1BBVEhfVEhSVSA7CisJCXNtYy0+bWliLnBbUEFdLmZkZGlQT1JUTUFDUGxhY2VtZW50ID0gSU5ERVhfTUFDIDsKKwkJc21jLT5taWIucFtQQl0uZmRkaVBPUlRNQUNQbGFjZW1lbnQgPSAwIDsKKwkJc21jLT5taWIuZmRkaVNNVFN0YXRpb25TdGF0dXMgPSBNSUJfU01UX1NUQVNUQV9USFJVIDsKKwkJY29uZmlnX211eChzbWMsTVVYX1RIUlVCKSA7CQkvKiBjb25maWd1cmUgUEhZIG11eCAqLworCQlzbWMtPnIucm1fbG9vcCA9IEZBTFNFIDsKKwkJc21jLT5yLnJtX2pvaW4gPSBUUlVFIDsKKwkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1JNVCxSTV9KT0lOKSA7Lyogc2lnbmFsIFJNVCAqLworCQlBQ1RJT05TX0RPTkUoKSA7CisJCURCX0NGTU4oMSwiQ0ZNIDogJXNcbiIsY2ZtX3N0YXRlc1tzbWMtPm1pYi5mZGRpU01UQ0ZfU3RhdGVdLDApIDsKKwkJYnJlYWsgOworCWNhc2UgU0M1X1RIUlVfQiA6CisJCS8qU0M1MSovCisJCWlmICghc21jLT55W1BCXS5jZl9qb2luIHx8IHNtYy0+eVtQQl0ud2NfZmxhZykgeworCQkJc21jLT55W1BBXS5zY3J1YiA9IFRSVUUgOworCQkJR09fU1RBVEUoU0M5X0NfV1JBUF9BKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypTQzUyKi8KKwkJZWxzZSBpZiAoIXNtYy0+eVtQQV0uY2Zfam9pbiB8fCBzbWMtPnlbUEFdLndjX2ZsYWcpIHsKKwkJCXNtYy0+eVtQQl0uc2NydWIgPSBUUlVFIDsKKwkJCUdPX1NUQVRFKFNDMTBfQ19XUkFQX0IpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKlNDNTQqLworCQllbHNlIGlmICghc21jLT5zLmF0dGFjaF9zKSB7CisJCQlzbWMtPnlbUEFdLnNjcnViID0gVFJVRSA7CisJCQlHT19TVEFURShTQzRfVEhSVV9BKSA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgQUNUSU9OUyhTQzExX0NfV1JBUF9TKSA6CisJCXNtYy0+bWliLnBbUFNdLmZkZGlQT1JUQ3VycmVudFBhdGggPSBNSUJfUEFUSF9DT05DQVRFTkFURUQgOworCQlzbWMtPm1pYi5wW1BTXS5mZGRpUE9SVE1BQ1BsYWNlbWVudCA9IElOREVYX01BQyA7CisJCXNtYy0+bWliLmZkZGlTTVRTdGF0aW9uU3RhdHVzID0gTUlCX1NNVF9TVEFTVEFfQ09OIDsKKwkJY29uZmlnX211eChzbWMsTVVYX1dSQVBTKSA7CQkvKiBjb25maWd1cmUgUEhZIG11eCAqLworCQlpZiAoc21jLT55W1BBXS5jZl9sb29wIHx8IHNtYy0+eVtQQl0uY2ZfbG9vcCkgeworCQkJc21jLT5yLnJtX2pvaW4gPSBGQUxTRSA7CisJCQlzbWMtPnIucm1fbG9vcCA9IFRSVUUgOworCQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1JNVCxSTV9MT09QKSA7Lyogc2lnbmFsIFJNVCAqLworCQl9CisJCWlmIChzbWMtPnlbUEFdLmNmX2pvaW4gfHwgc21jLT55W1BCXS5jZl9qb2luKSB7CisJCQlzbWMtPnIucm1fbG9vcCA9IEZBTFNFIDsKKwkJCXNtYy0+ci5ybV9qb2luID0gVFJVRSA7CisJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUk1ULFJNX0pPSU4pIDsvKiBzaWduYWwgUk1UICovCisJCX0KKwkJQUNUSU9OU19ET05FKCkgOworCQlEQl9DRk1OKDEsIkNGTSA6ICVzXG4iLGNmbV9zdGF0ZXNbc21jLT5taWIuZmRkaVNNVENGX1N0YXRlXSwwKSA7CisJCWJyZWFrIDsKKwljYXNlIFNDMTFfQ19XUkFQX1MgOgorCQkvKlNDNzAqLworCQlpZiAoICFzbWMtPnlbUEFdLmNmX2pvaW4gJiYgIXNtYy0+eVtQQV0uY2ZfbG9vcCAmJgorCQkgICAgICFzbWMtPnlbUEJdLmNmX2pvaW4gJiYgIXNtYy0+eVtQQl0uY2ZfbG9vcCkgeworCQkJR09fU1RBVEUoU0MwX0lTT0xBVEVEKSA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWsgOworCWRlZmF1bHQ6CisJCVNNVF9QQU5JQyhzbWMsU01UX0UwMTA2LCBTTVRfRTAxMDZfTVNHKSA7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIGdldCBNQUMncyBpbnB1dCBQb3J0CisgKglyZXR1cm4gOgorICoJCVBBIG9yIFBCCisgKi8KK2ludCBjZm1fZ2V0X21hY19pbnB1dChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlyZXR1cm4oKHNtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZSA9PSBTQzEwX0NfV1JBUF9CIHx8CisJCXNtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZSA9PSBTQzVfVEhSVV9CKSA/IFBCIDogUEEpIDsKK30KKworLyoKKyAqIGdldCBNQUMncyBvdXRwdXQgUG9ydAorICoJcmV0dXJuIDoKKyAqCQlQQSBvciBQQgorICovCitpbnQgY2ZtX2dldF9tYWNfb3V0cHV0KHN0cnVjdCBzX3NtYyAqc21jKQoreworCXJldHVybigoc21jLT5taWIuZmRkaVNNVENGX1N0YXRlID09IFNDMTBfQ19XUkFQX0IgfHwKKwkJc21jLT5taWIuZmRkaVNNVENGX1N0YXRlID09IFNDNF9USFJVX0EpID8gUEIgOiBQQSkgOworfQorCitzdGF0aWMgY2hhciBwYXRoX2lzb1tdID0geworCTAsMCwJMCxSRVNfUE9SVCwJMCxQQSArIElOREVYX1BPUlQsCTAsUEFUSF9JU08sCisJMCwwLAkwLFJFU19NQUMsCTAsSU5ERVhfTUFDLAkJMCxQQVRIX0lTTywKKwkwLDAsCTAsUkVTX1BPUlQsCTAsUEIgKyBJTkRFWF9QT1JULAkwLFBBVEhfSVNPCit9IDsKKworc3RhdGljIGNoYXIgcGF0aF93cmFwX2FbXSA9IHsKKwkwLDAsCTAsUkVTX1BPUlQsCTAsUEEgKyBJTkRFWF9QT1JULAkwLFBBVEhfUFJJTSwKKwkwLDAsCTAsUkVTX01BQywJMCxJTkRFWF9NQUMsCQkwLFBBVEhfUFJJTSwKKwkwLDAsCTAsUkVTX1BPUlQsCTAsUEIgKyBJTkRFWF9QT1JULAkwLFBBVEhfSVNPCit9IDsKKworc3RhdGljIGNoYXIgcGF0aF93cmFwX2JbXSA9IHsKKwkwLDAsCTAsUkVTX1BPUlQsCTAsUEIgKyBJTkRFWF9QT1JULAkwLFBBVEhfUFJJTSwKKwkwLDAsCTAsUkVTX01BQywJMCxJTkRFWF9NQUMsCQkwLFBBVEhfUFJJTSwKKwkwLDAsCTAsUkVTX1BPUlQsCTAsUEEgKyBJTkRFWF9QT1JULAkwLFBBVEhfSVNPCit9IDsKKworc3RhdGljIGNoYXIgcGF0aF90aHJ1W10gPSB7CisJMCwwLAkwLFJFU19QT1JULAkwLFBBICsgSU5ERVhfUE9SVCwJMCxQQVRIX1BSSU0sCisJMCwwLAkwLFJFU19NQUMsCTAsSU5ERVhfTUFDLAkJMCxQQVRIX1BSSU0sCisJMCwwLAkwLFJFU19QT1JULAkwLFBCICsgSU5ERVhfUE9SVCwJMCxQQVRIX1BSSU0KK30gOworCitzdGF0aWMgY2hhciBwYXRoX3dyYXBfc1tdID0geworCTAsMCwJMCxSRVNfUE9SVCwJMCxQUyArIElOREVYX1BPUlQsCTAsUEFUSF9QUklNLAorCTAsMCwJMCxSRVNfTUFDLAkwLElOREVYX01BQywJCTAsUEFUSF9QUklNLAorfSA7CisKK3N0YXRpYyBjaGFyIHBhdGhfaXNvX3NbXSA9IHsKKwkwLDAsCTAsUkVTX1BPUlQsCTAsUFMgKyBJTkRFWF9QT1JULAkwLFBBVEhfSVNPLAorCTAsMCwJMCxSRVNfTUFDLAkwLElOREVYX01BQywJCTAsUEFUSF9JU08sCit9IDsKKworaW50IGNlbV9idWlsZF9wYXRoKHN0cnVjdCBzX3NtYyAqc21jLCBjaGFyICp0bywgaW50IHBhdGhfaW5kZXgpCit7CisJY2hhcgkqcGF0aCA7CisJaW50CWxlbiA7CisKKwlzd2l0Y2ggKHNtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZSkgeworCWRlZmF1bHQgOgorCWNhc2UgU0MwX0lTT0xBVEVEIDoKKwkJcGF0aCA9IHNtYy0+cy5zYXMgPyBwYXRoX2lzb19zIDogcGF0aF9pc28gOworCQlsZW4gPSBzbWMtPnMuc2FzID8gc2l6ZW9mKHBhdGhfaXNvX3MpIDogIHNpemVvZihwYXRoX2lzbykgOworCQlicmVhayA7CisJY2FzZSBTQzlfQ19XUkFQX0EgOgorCQlwYXRoID0gcGF0aF93cmFwX2EgOworCQlsZW4gPSBzaXplb2YocGF0aF93cmFwX2EpIDsKKwkJYnJlYWsgOworCWNhc2UgU0MxMF9DX1dSQVBfQiA6CisJCXBhdGggPSBwYXRoX3dyYXBfYiA7CisJCWxlbiA9IHNpemVvZihwYXRoX3dyYXBfYikgOworCQlicmVhayA7CisJY2FzZSBTQzRfVEhSVV9BIDoKKwkJcGF0aCA9IHBhdGhfdGhydSA7CisJCWxlbiA9IHNpemVvZihwYXRoX3RocnUpIDsKKwkJYnJlYWsgOworCWNhc2UgU0MxMV9DX1dSQVBfUyA6CisJCXBhdGggPSBwYXRoX3dyYXBfcyA7CisJCWxlbiA9IHNpemVvZihwYXRoX3dyYXBfcykgOworCQlicmVhayA7CisJfQorCW1lbWNweSh0byxwYXRoLGxlbikgOworCisJTElOVF9VU0UocGF0aF9pbmRleCk7CisKKwlyZXR1cm4obGVuKSA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2RydmZiaS5jIGIvZHJpdmVycy9uZXQvc2tmcC9kcnZmYmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTJlODQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9kcnZmYmkuYwpAQCAtMCwwICsxLDE1MjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OCwxOTk5IFN5c0tvbm5lY3QsCisgKglhIGJ1c2luZXNzIHVuaXQgb2YgU2NobmVpZGVyICYgS29jaCAmIENvLiBEYXRlbnN5c3RlbWUgR21iSC4KKyAqCisgKglTZWUgdGhlIGZpbGUgInNrZmRkaS5jIiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBGQkkgYm9hcmQgZGVwZW5kZW50IERyaXZlciBmb3IgU01UIGFuZCBMTEMKKyAqLworCisjaW5jbHVkZSAiaC90eXBlcy5oIgorI2luY2x1ZGUgImgvZmRkaS5oIgorI2luY2x1ZGUgImgvc21jLmgiCisjaW5jbHVkZSAiaC9zdXBlcm5fMi5oIgorI2luY2x1ZGUgImgvc2tmYmlpbmMuaCIKKworI2lmbmRlZglsaW50CitzdGF0aWMgY29uc3QgY2hhciBJRF9zY2NzW10gPSAiQCgjKWRydmZiaS5jCTEuNjMgOTkvMDIvMTEgKEMpIFNLICIgOworI2VuZGlmCisKKy8qCisgKiBQQ00gYWN0aXZlIHN0YXRlCisgKi8KKyNkZWZpbmUgUEM4X0FDVElWRQk4CisKKyNkZWZpbmUJTEVEX1lfT04JMHgxMQkvKiBVc2VkIGZvciByaW5nIHVwL2Rvd24gaW5kaWNhdGlvbiAqLworI2RlZmluZQlMRURfWV9PRkYJMHgxMAorCisKKyNkZWZpbmUgTVMyQkNMSyh4KQkoKHgpKjEyNTAwTCkKKworLyoKKyAqIHZhbGlkIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGFyZToKKyAqLworI2lmZGVmCUlTQQorY29uc3QgaW50IG9wdF9pbnRzW10gPSB7OCwJMywgNCwgNSwgOSwgMTAsIDExLCAxMiwgMTV9IDsKK2NvbnN0IGludCBvcHRfaW9wc1tdID0gezgsCisJMHgxMDAsIDB4MTIwLCAweDE4MCwgMHgxYTAsIDB4MjIwLCAweDI0MCwgMHgzMjAsIDB4MzQwfTsKK2NvbnN0IGludCBvcHRfZG1hc1tdID0gezQsCTMsIDUsIDYsIDd9IDsKK2NvbnN0IGludCBvcHRfZXByb21zW10gPSB7MTUsCTB4YzAsIDB4YzIsIDB4YzQsIDB4YzYsIDB4YzgsIDB4Y2EsIDB4Y2MsIDB4Y2UsCisJCQkweGQwLCAweGQyLCAweGQ0LCAweGQ2LCAweGQ4LCAweGRhLCAweGRjfSA7CisjZW5kaWYKKyNpZmRlZglFSVNBCitjb25zdCBpbnQgb3B0X2ludHNbXSA9IHs1LCA5LCAxMCwgMTF9IDsKK2NvbnN0IGludCBvcHRfZG1hc1tdID0gezAsIDUsIDYsIDd9IDsKK2NvbnN0IGludCBvcHRfZXByb21zW10gPSB7MHhjMCwgMHhjMiwgMHhjNCwgMHhjNiwgMHhjOCwgMHhjYSwgMHhjYywgMHhjZSwKKwkJCQkweGQwLCAweGQyLCAweGQ0LCAweGQ2LCAweGQ4LCAweGRhLCAweGRjfSA7CisjZW5kaWYKKworI2lmZGVmCU1DQQoraW50CW9wdF9pbnRzW10gPSB7MywgMTEsIDEwLCA5fSA7CQkJLyogRk0xICovCitpbnQJb3B0X2Vwcm9tc1tdID0gezAsIDB4YzQsIDB4YzgsIDB4Y2MsIDB4ZDAsIDB4ZDQsIDB4ZDgsIDB4ZGN9IDsKKyNlbmRpZgkvKiBNQ0EgKi8KKworLyoKKyAqCXhQT1NfSUQ6eHh4eAorICoJfAlcICAvCisgKgl8CSBcLworICoJfAkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0aGUgcGF0Y2hlZCBQT1NfSUQgb2YgdGhlIEFkYXB0ZXIKKyAqCXwJCQkJeHh4eCA9IChWZW5kb3IgSUQgbG93IGJ5dGUsCisgKgl8CQkJCQlWZW5kb3IgSUQgaGlnaCBieXRlLAorICoJfAkJCQkJRGV2aWNlIElEIGxvdyBieXRlLAorICoJfAkJCQkJRGV2aWNlIElEIGhpZ2ggYnl0ZSkKKyAqCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdGhlIHBhdGNoZWQgb2VtX2lkIG11c3QgYmUKKyAqCQkJCQknUycgZm9yIFNLIG9yICdJJyBmb3IgSUJNCisgKgkJCQkJdGhpcyBpcyBhIHNob3J0IGlkIGZvciB0aGUgZHJpdmVyLgorICovCisjaWZuZGVmIE1VTFRfT0VNCisjaWZuZGVmCU9FTV9DT05DRVBUCisjaWZuZGVmIE1DQQorY29uc3QgdV9jaGFyIG9lbV9pZFtdID0gInhQT1NfSUQ6eHh4eCIgOworI2Vsc2UKK2NvbnN0IHVfY2hhciBvZW1faWRbXSA9ICJ4UE9TSUQxOnh4eHgiIDsJLyogRk0xIGNhcmQgaWQuICovCisjZW5kaWYKKyNlbHNlCS8qIE9FTV9DT05DRVBUICovCisjaWZuZGVmIE1DQQorY29uc3QgdV9jaGFyIG9lbV9pZFtdID0gT0VNX0lEIDsKKyNlbHNlCitjb25zdCB1X2NoYXIgb2VtX2lkW10gPSBPRU1fSUQxIDsJLyogRk0xIGNhcmQgaWQuICovCisjZW5kaWYJLyogTUNBICovCisjZW5kaWYJLyogT0VNX0NPTkNFUFQgKi8KKyNkZWZpbmUJSURfQllURTAJOAorI2RlZmluZQlPRU1JRChzbWMsaSkJb2VtX2lkW0lEX0JZVEUwICsgaV0KKyNlbHNlCS8qIE1VTFRfT0VNICovCitjb25zdCBzdHJ1Y3Qgc19vZW1faWRzIG9lbV9pZHNbXSA9IHsKKyNpbmNsdWRlICJvZW1pZHMuaCIKK3swfQorfTsKKyNkZWZpbmUJT0VNSUQoc21jLGkpCXNtYy0+aHcub2VtX2lkLT5vaV9pZFtpXQorI2VuZGlmCS8qIE1VTFRfT0VNICovCisKKy8qIFByb3RvdHlwZXMgb2YgZXh0ZXJuYWwgZnVuY3Rpb25zICovCisjaWZkZWYgQUlYCitleHRlcm4gaW50IEFJWF92cGRSZWFkQnl0ZSgpIDsKKyNlbmRpZgorCisKKy8qIFByb3RvdHlwZXMgb2YgbG9jYWwgZnVuY3Rpb25zLiAqLwordm9pZCBzbXRfc3RvcF93YXRjaGRvZyhzdHJ1Y3Qgc19zbWMgKnNtYyk7CisKKyNpZmRlZiBNQ0EKK3N0YXRpYyBpbnQgcmVhZF9jYXJkX2lkKCkgOworc3RhdGljIHZvaWQgRGlzYWJsZVNsb3RBY2Nlc3MoKSA7CitzdGF0aWMgdm9pZCBFbmFibGVTbG90QWNjZXNzKCkgOworI2lmZGVmIEFJWAorZXh0ZXJuIGludCBhdHRhY2hfUE9TX2FkZHIoKSA7CitleHRlcm4gaW50IGRldGFjaF9QT1NfYWRkcigpIDsKK2V4dGVybiB1X2NoYXIgcmVhZF9QT1MoKSA7CitleHRlcm4gdm9pZCB3cml0ZV9QT1MoKSA7CitleHRlcm4gaW50IEFJWF92cGRSZWFkQnl0ZSgpIDsKKyNlbHNlCisjZGVmaW5lCXJlYWRfUE9TKHNtYyxhMSxhMikJKCh1X2NoYXIpIGlucChhMSkpCisjZGVmaW5lCXdyaXRlX1BPUyhzbWMsYTEsYTIsYTMpCW91dHAoKGExKSwoYTMpKQorI2VuZGlmCisjZW5kaWYJLyogTUNBICovCisKKworLyoKKyAqIEZEREkgY2FyZCByZXNldAorICovCitzdGF0aWMgdm9pZCBjYXJkX3N0YXJ0KHN0cnVjdCBzX3NtYyAqc21jKQoreworCWludCBpIDsKKyNpZmRlZglQQ0kKKwl1X2NoYXIJcmV2X2lkIDsKKwl1X3Nob3J0IHdvcmQ7CisjZW5kaWYKKworCXNtdF9zdG9wX3dhdGNoZG9nKHNtYykgOworCisjaWZkZWYJSVNBCisJb3V0cHcoQ1NSX0EsMCkgOwkJCS8qIHJlc2V0IGZvciBhbGwgY2hpcHMgKi8KKwlmb3IgKGkgPSAxMCA7IGkgOyBpLS0pCQkJLyogZGVsYXkgZm9yIFBMQydzICovCisJCSh2b2lkKWlucHcoSVNSX0EpIDsKKwlPVVRfODJjNTRfVElNRVIoMyxDT1VOVCgyKSB8IFJXX09QKDMpIHwgVE1PREUoMikpIDsKKwkJCQkJLyogY291bnRlciAyLCBtb2RlIDIgKi8KKwlPVVRfODJjNTRfVElNRVIoMiw5NykgOwkJLyogTFNCICovCisJT1VUXzgyYzU0X1RJTUVSKDIsMCkgOwkJLyogTVNCICggMTUuNiB1cyApICovCisJb3V0cHcoQ1NSX0EsQ1NfQ1JFU0VUKSA7CisjZW5kaWYKKyNpZmRlZglFSVNBCisJb3V0cHcoQ1NSX0EsMCkgOwkJCS8qIHJlc2V0IGZvciBhbGwgY2hpcHMgKi8KKwlmb3IgKGkgPSAxMCA7IGkgOyBpLS0pCQkJLyogZGVsYXkgZm9yIFBMQydzICovCisJCSh2b2lkKWlucHcoSVNSX0EpIDsKKwlvdXRwdyhDU1JfQSxDU19DUkVTRVQpIDsKKwlzbWMtPmh3LmxlZCA9ICgyPDw2KSA7CisJb3V0cHcoQ1NSX0EsQ1NfQ1JFU0VUIHwgc21jLT5ody5sZWQpIDsKKyNlbmRpZgorI2lmZGVmCU1DQQorCW91dHAoQUREUihDQVJEX0RJUyksMCkgOwkJLyogcmVzZXQgZm9yIGFsbCBjaGlwcyAqLworCWZvciAoaSA9IDEwIDsgaSA7IGktLSkJCQkvKiBkZWxheSBmb3IgUExDJ3MgKi8KKwkJKHZvaWQpaW5wdyhJU1JfQSkgOworCW91dHAoQUREUihDQVJEX0VOKSwwKSA7CisJLyogZmlyc3QgSS9PIGFmdGVyIHJlc2V0IG11c3Qgbm90IGJlIGEgYWNjZXNzIHRvIEZPUk1BQyBvciBQTEMgKi8KKworCS8qCisJICogYnVzIHRpbWVvdXQgKE1DQSkKKwkgKi8KKwlPVVRfODJjNTRfVElNRVIoMyxDT1VOVCgyKSB8IFJXX09QKDMpIHwgVE1PREUoMykpIDsKKwkJCQkJLyogY291bnRlciAyLCBtb2RlIDMgKi8KKwlPVVRfODJjNTRfVElNRVIoMiwoMioyNCkpIDsJLyogMy45IHVzICogMiBzcXVhcmUgd2F2ZSAqLworCU9VVF84MmM1NF9USU1FUigyLDApIDsJCS8qIE1TQiAqLworCisJLyogUE9TIDEwMiBpbmRpY2F0ZWQgYW4gYWN0aXYgQ2hlY2sgTGluZSBvciBCdXNzIEVycm9yIG1vbml0b3JpbmcgKi8KKwlpZiAoaW5wdyhDU0FfQSkgJiAoUE9TX0VOX0NIS0lOVCB8IFBPU19FTl9CVVNfRVJSKSkgeworCQlvdXRwKEFERFIoSVJRX0NIQ0tfRU4pLDApIDsKKwl9CisKKwlpZiAoISgoaSA9IGlucHcoQ1NSX0EpKSAmIENTX1NBUykpIHsKKwkJaWYgKCEoaSAmIENTX0JZU1RBVCkpIHsKKwkJCW91dHAoQUREUihCWVBBU1MoU1RBVF9JTlMpKSwwKSA7LyogaW5zZXJ0IHN0YXRpb24gKi8KKwkJfQorCX0KKwlvdXRwdyhMRURSX0EsTEVEXzEpIDsJLyogeWVsbG93ICovCisjZW5kaWYJLyogTUNBICovCisjaWZkZWYJUENJCisJLyoKKwkgKiBtYWtlIHN1cmUgbm8gdHJhbnNmZXIgYWN0aXZpdHkgaXMgcGVuZGluZworCSAqLworCW91dHB3KEZNX0EoRk1fTURSRUcxKSxGTV9NSU5JVCkgOworCW91dHAoQUREUihCMF9DVFJMKSwgQ1RSTF9IUElfU0VUKSA7CisJaHd0X3dhaXRfdGltZShzbWMsaHd0X3F1aWNrX3JlYWQoc21jKSxNUzJCQ0xLKDEwKSkgOworCS8qCisJICogbm93IHJlc2V0IGV2ZXJ5dGhpbmcKKwkgKi8KKwlvdXRwKEFERFIoQjBfQ1RSTCksQ1RSTF9SU1RfU0VUKSA7CS8qIHJlc2V0IGZvciBhbGwgY2hpcHMgKi8KKwlpID0gKGludCkgaW5wKEFERFIoQjBfQ1RSTCkpIDsJCS8qIGRvIGR1bW15IHJlYWQgKi8KKwlTS19VTlVTRUQoaSkgOwkJCQkvKiBNYWtlIExJTlQgaGFwcHkuICovCisJb3V0cChBRERSKEIwX0NUUkwpLCBDVFJMX1JTVF9DTFIpIDsKKworCS8qCisJICogUmVzZXQgYWxsIGJpdHMgaW4gdGhlIFBDSSBTVEFUVVMgcmVnaXN0ZXIKKwkgKi8KKwlvdXRwKEFERFIoQjBfVFNUX0NUUkwpLCBUU1RfQ0ZHX1dSSVRFX09OKSA7CS8qIGVuYWJsZSBmb3Igd3JpdGVzICovCisJd29yZCA9IGlucHcoUENJX0MoUENJX1NUQVRVUykpIDsKKwlvdXRwdyhQQ0lfQyhQQ0lfU1RBVFVTKSwgd29yZCB8IFBDSV9FUlJCSVRTKSA7CisJb3V0cChBRERSKEIwX1RTVF9DVFJMKSwgVFNUX0NGR19XUklURV9PRkYpIDsJLyogZGlzYWJsZSB3cml0ZXMgKi8KKworCS8qCisJICogUmVsZWFzZSB0aGUgcmVzZXQgb2YgYWxsIHRoZSBTdGF0ZSBtYWNoaW5lcworCSAqIFJlbGVhc2UgTWFzdGVyX1Jlc2V0CisJICogUmVsZWFzZSBIUElfU01fUmVzZXQKKwkgKi8KKwlvdXRwKEFERFIoQjBfQ1RSTCksIENUUkxfTVJTVF9DTFJ8Q1RSTF9IUElfQ0xSKSA7CisKKwkvKgorCSAqIGRldGVybWluZSB0aGUgYWRhcHRlciB0eXBlCisJICogTm90ZTogRG8gaXQgaGVyZSwgYmVjYXVzZSBzb21lIGRyaXZlcnMgbWF5IGNhbGwgY2FyZF9zdGFydCgpIG9uY2UKKwkgKgkgYXQgdmVyeSBmaXJzdCBiZWZvcmUgYW55IG90aGVyIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyBpcworCSAqCSBleGVjdXRlZC4KKwkgKi8KKwlyZXZfaWQgPSBpbnAoUENJX0MoUENJX1JFVl9JRCkpIDsKKwlpZiAoKHJldl9pZCAmIDB4ZjApID09IFNLX01MX0lEXzEgfHwgKHJldl9pZCAmIDB4ZjApID09IFNLX01MX0lEXzIpIHsKKwkJc21jLT5ody5od19pc182NGJpdCA9IFRSVUUgOworCX0gZWxzZSB7CisJCXNtYy0+aHcuaHdfaXNfNjRiaXQgPSBGQUxTRSA7CisJfQorCisJLyoKKwkgKiBXYXRlcm1hcmsgaW5pdGlhbGl6YXRpb24KKwkgKi8KKwlpZiAoIXNtYy0+aHcuaHdfaXNfNjRiaXQpIHsKKwkJb3V0cGQoQUREUihCNF9SMV9GKSwgUlhfV0FURVJNQVJLKSA7CisJCW91dHBkKEFERFIoQjVfWEFfRiksIFRYX1dBVEVSTUFSSykgOworCQlvdXRwZChBRERSKEI1X1hTX0YpLCBUWF9XQVRFUk1BUkspIDsKKwl9CisKKwlvdXRwKEFERFIoQjBfQ1RSTCksQ1RSTF9SU1RfQ0xSKSA7CS8qIGNsZWFyIHRoZSByZXNldCBjaGlwcyAqLworCW91dHAoQUREUihCMF9MRUQpLExFRF9HQV9PRkZ8TEVEX01ZX09OfExFRF9HQl9PRkYpIDsgLyogeWUgTEVEIG9uICovCisKKwkvKiBpbml0IHRoZSB0aW1lciB2YWx1ZSBmb3IgdGhlIHdhdGNoIGRvZyAyLDUgbWludXRlcyAqLworCW91dHBkKEFERFIoQjJfV0RPR19JTkkpLDB4NkZDMjNBQzApIDsKKworCS8qIGluaXRpYWxpemUgdGhlIElTUiBtYXNrICovCisJc21jLT5ody5pc19pbWFzayA9IElTUl9NQVNLIDsKKwlzbWMtPmh3Lmh3X3N0YXRlID0gU1RPUFBFRCA7CisjZW5kaWYKKwlHRVRfUEFHRSgwKSA7CQkvKiBuZWNlc3NhcnkgZm9yIEJPT1QgKi8KK30KKwordm9pZCBjYXJkX3N0b3Aoc3RydWN0IHNfc21jICpzbWMpCit7CisJc210X3N0b3Bfd2F0Y2hkb2coc21jKSA7CisJc21jLT5ody5tYWNfcmluZ19pc191cCA9IDAgOwkJLyogcmluZyBkb3duICovCisjaWZkZWYJSVNBCisJb3V0cHcoQ1NSX0EsMCkgOwkJCS8qIHJlc2V0IGZvciBhbGwgY2hpcHMgKi8KKyNlbmRpZgorI2lmZGVmCUVJU0EKKwlvdXRwdyhDU1JfQSwwKSA7CQkJLyogcmVzZXQgZm9yIGFsbCBjaGlwcyAqLworI2VuZGlmCisjaWZkZWYJTUNBCisJb3V0cChBRERSKENBUkRfRElTKSwwKSA7CQkvKiByZXNldCBmb3IgYWxsIGNoaXBzICovCisjZW5kaWYKKyNpZmRlZglQQ0kKKwkvKgorCSAqIG1ha2Ugc3VyZSBubyB0cmFuc2ZlciBhY3Rpdml0eSBpcyBwZW5kaW5nCisJICovCisJb3V0cHcoRk1fQShGTV9NRFJFRzEpLEZNX01JTklUKSA7CisJb3V0cChBRERSKEIwX0NUUkwpLCBDVFJMX0hQSV9TRVQpIDsKKwlod3Rfd2FpdF90aW1lKHNtYyxod3RfcXVpY2tfcmVhZChzbWMpLE1TMkJDTEsoMTApKSA7CisJLyoKKwkgKiBub3cgcmVzZXQgZXZlcnl0aGluZworCSAqLworCW91dHAoQUREUihCMF9DVFJMKSxDVFJMX1JTVF9TRVQpIDsJLyogcmVzZXQgZm9yIGFsbCBjaGlwcyAqLworCW91dHAoQUREUihCMF9DVFJMKSxDVFJMX1JTVF9DTFIpIDsJLyogcmVzZXQgZm9yIGFsbCBjaGlwcyAqLworCW91dHAoQUREUihCMF9MRUQpLExFRF9HQV9PRkZ8TEVEX01ZX09GRnxMRURfR0JfT0ZGKSA7IC8qIGFsbCBMRURzIG9mZiAqLworCXNtYy0+aHcuaHdfc3RhdGUgPSBTVE9QUEVEIDsKKyNlbmRpZgorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSVNSIGhhbmRsaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIG1hYzFfaXJxKHN0cnVjdCBzX3NtYyAqc21jLCB1X3Nob3J0IHN0dSwgdV9zaG9ydCBzdGwpCit7CisJaW50CXJlc3RhcnRfdHggPSAwIDsKK2FnYWluOgorI2lmbmRlZiBQQ0kKKyNpZm5kZWYgSVNBCisvKgorICogRk9STUFDKyBidWcgbW9kaWZpZWQgdGhlIHF1ZXVlIHBvaW50ZXIgaWYgbWFueSByZWFkL3dyaXRlIGFjY2Vzc2VzIGhhcHBlbnMhPworICovCisJaWYgKHN0bCAmIChGTV9TUENFUERTICB8CS8qIHBhcml0L2NvZGluZyBlcnIuIHN5bi5xLiovCisJCSAgIEZNX1NQQ0VQREEwIHwJLyogcGFyaXQvY29kaW5nIGVyci4gYS5xLjAgKi8KKwkJICAgRk1fU1BDRVBEQTEgfAkvKiBwYXJpdC9jb2RpbmcgZXJyLiBhLnEuMSAqLworCQkgICBGTV9TUENFUERBMikpIHsJLyogcGFyaXQvY29kaW5nIGVyci4gYS5xLjIgKi8KKwkJU01UX1BBTklDKHNtYyxTTVRfRTAxMzIsIFNNVF9FMDEzMl9NU0cpIDsKKwl9CisJaWYgKHN0bCAmIChGTV9TVEJVUlMgIHwJLyogdHggYnVmZmVyIHVuZGVycnVuIHN5bi5xLiovCisJCSAgIEZNX1NUQlVSQTAgfAkvKiB0eCBidWZmZXIgdW5kZXJydW4gYS5xLjAgKi8KKwkJICAgRk1fU1RCVVJBMSB8CS8qIHR4IGJ1ZmZlciB1bmRlcnJ1biBhLnEuMSAqLworCQkgICBGTV9TVEJVUkEyKSkgewkvKiB0eCBidWZmZXIgdW5kZXJydW4gYS5xLjIgKi8KKwkJU01UX1BBTklDKHNtYyxTTVRfRTAxMzMsIFNNVF9FMDEzM19NU0cpIDsKKwl9CisjZW5kaWYKKwlpZiAoIChzdHUgJiAoRk1fU1hNVEFCVCB8CQkvKiB0cmFuc21pdCBhYm9ydCAqLworI2lmZGVmCVNZTkMKKwkJICAgICBGTV9TVFhBQlJTIHwJLyogc3luLiB0eCBhYm9ydCAqLworI2VuZGlmCS8qIFNZTkMgKi8KKwkJICAgICBGTV9TVFhBQlJBMCkpIHx8CS8qIGFzeW4uIHR4IGFib3J0ICovCisJICAgICAoc3RsICYgKEZNX1NRTENLUyB8CQkvKiBsb2NrIGZvciBzeW4uIHEuICovCisJCSAgICAgRk1fU1FMQ0tBMCkpICkgewkvKiBsb2NrIGZvciBhc3luLiBxLiAqLworCQlmb3JtYWNfdHhfcmVzdGFydChzbWMpIDsJCS8qIGluaXQgdHggKi8KKwkJcmVzdGFydF90eCA9IDEgOworCQlzdHUgPSBpbnB3KEZNX0EoRk1fU1QxVSkpIDsKKwkJc3RsID0gaW5wdyhGTV9BKEZNX1NUMUwpKSA7CisJCXN0dSAmPSB+IChGTV9TVEVDRlJNQTAgfCBGTV9TVEVGUk1BMCB8IEZNX1NURUZSTVMpIDsKKwkJaWYgKHN0dSB8fCBzdGwpCisJCQlnb3RvIGFnYWluIDsKKwl9CisKKyNpZm5kZWYJU1lOQworCWlmIChzdHUgJiAoRk1fU1RFQ0ZSTUEwIHwgLyogZW5kIG9mIGNoYWluIGFzeW4gdHggKi8KKwkJICAgRk1fU1RFRlJNQTApKSB7IC8qIGVuZCBvZiBmcmFtZSBhc3luIHR4ICovCisJCS8qIGZyZWUgdHhfcXVldWUgKi8KKwkJc21jLT5ody5uX2Ffc2VuZCA9IDAgOworCQlpZiAoKytzbWMtPmh3LmZwLnR4X2ZyZWUgPCBzbWMtPmh3LmZwLnR4X21heCkgeworCQkJc3RhcnRfbmV4dF9zZW5kKHNtYyk7CisJCX0KKwkJcmVzdGFydF90eCA9IDEgOworCX0KKyNlbHNlCS8qIFNZTkMgKi8KKwlpZiAoc3R1ICYgKEZNX1NURUZSTUEwIHwJLyogZW5kIG9mIGFzeW4gdHggKi8KKwkJICAgIEZNX1NURUZSTVMpKSB7CS8qIGVuZCBvZiBzeW5jIHR4ICovCisJCXJlc3RhcnRfdHggPSAxIDsKKwl9CisjZW5kaWYJLyogU1lOQyAqLworCWlmIChyZXN0YXJ0X3R4KQorCQlsbGNfcmVzdGFydF90eChzbWMpIDsKK30KKyNlbHNlCS8qIFBDSSAqLworCisJLyoKKwkgKiBwYXJpdHkgZXJyb3I6IG5vdGUgZW5jb2RpbmcgZXJyb3IgaXMgbm90IHBvc3NpYmxlIGluIHRhZyBtb2RlCisJICovCisJaWYgKHN0bCAmIChGTV9TUENFUERTICB8CS8qIHBhcml0eSBlcnIuIHN5bi5xLiovCisJCSAgIEZNX1NQQ0VQREEwIHwJLyogcGFyaXR5IGVyci4gYS5xLjAgKi8KKwkJICAgRk1fU1BDRVBEQTEpKSB7CS8qIHBhcml0eSBlcnIuIGEucS4xICovCisJCVNNVF9QQU5JQyhzbWMsU01UX0UwMTM0LCBTTVRfRTAxMzRfTVNHKSA7CisJfQorCS8qCisJICogYnVmZmVyIHVuZGVycnVuOiBjYW4gb25seSBvY2N1ciBpZiBhIHR4IHRocmVzaG9sZCBpcyBzcGVjaWZpZWQKKwkgKi8KKwlpZiAoc3RsICYgKEZNX1NUQlVSUyAgfAkJLyogdHggYnVmZmVyIHVuZGVycnVuIHN5bi5xLiovCisJCSAgIEZNX1NUQlVSQTAgfAkJLyogdHggYnVmZmVyIHVuZGVycnVuIGEucS4wICovCisJCSAgIEZNX1NUQlVSQTEpKSB7CS8qIHR4IGJ1ZmZlciB1bmRlcnJ1biBhLnEuMiAqLworCQlTTVRfUEFOSUMoc21jLFNNVF9FMDEzMywgU01UX0UwMTMzX01TRykgOworCX0KKworCWlmICggKHN0dSAmIChGTV9TWE1UQUJUIHwJCS8qIHRyYW5zbWl0IGFib3J0ICovCisJCSAgICAgRk1fU1RYQUJSUyB8CQkvKiBzeW4uIHR4IGFib3J0ICovCisJCSAgICAgRk1fU1RYQUJSQTApKSB8fAkJLyogYXN5bi4gdHggYWJvcnQgKi8KKwkgICAgIChzdGwgJiAoRk1fU1FMQ0tTIHwJCS8qIGxvY2sgZm9yIHN5bi4gcS4gKi8KKwkJICAgICBGTV9TUUxDS0EwKSkgKSB7CQkvKiBsb2NrIGZvciBhc3luLiBxLiAqLworCQlmb3JtYWNfdHhfcmVzdGFydChzbWMpIDsJLyogaW5pdCB0eCAqLworCQlyZXN0YXJ0X3R4ID0gMSA7CisJCXN0dSA9IGlucHcoRk1fQShGTV9TVDFVKSkgOworCQlzdGwgPSBpbnB3KEZNX0EoRk1fU1QxTCkpIDsKKwkJc3R1ICY9IH4gKEZNX1NURUNGUk1BMCB8IEZNX1NURUZSTUEwIHwgRk1fU1RFRlJNUykgOworCQlpZiAoc3R1IHx8IHN0bCkKKwkJCWdvdG8gYWdhaW4gOworCX0KKworCWlmIChzdHUgJiAoRk1fU1RFRlJNQTAgfAkvKiBlbmQgb2YgYXN5biB0eCAqLworCQkgICAgRk1fU1RFRlJNUykpIHsJLyogZW5kIG9mIHN5bmMgdHggKi8KKwkJcmVzdGFydF90eCA9IDEgOworCX0KKworCWlmIChyZXN0YXJ0X3R4KQorCQlsbGNfcmVzdGFydF90eChzbWMpIDsKK30KKyNlbmRpZgkvKiBQQ0kgKi8KKy8qCisgKiBpbnRlcnJ1cHQgc291cmNlPSBwbGMxCisgKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBud2ZiaXNyLmFzbQorICovCit2b2lkIHBsYzFfaXJxKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXVfc2hvcnQJc3QgPSBpbnB3KFBMQyhQQixQTF9JTlRSX0VWRU5UKSkgOworCisjaWYJKGRlZmluZWQoSVNBKSB8fCBkZWZpbmVkKEVJU0EpKQorCS8qIHJlc2V0IFBMQyBJbnQuIGJpdHMgKi8KKwlvdXRwdyhQTEMxX0ksaW5wdyhQTEMxX0kpKSA7CisjZW5kaWYKKwlwbGNfaXJxKHNtYyxQQixzdCkgOworfQorCisvKgorICogaW50ZXJydXB0IHNvdXJjZT0gcGxjMgorICogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gbndmYmlzci5hc20KKyAqLwordm9pZCBwbGMyX2lycShzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwl1X3Nob3J0CXN0ID0gaW5wdyhQTEMoUEEsUExfSU5UUl9FVkVOVCkpIDsKKworI2lmCShkZWZpbmVkKElTQSkgfHwgZGVmaW5lZChFSVNBKSkKKwkvKiByZXNldCBQTEMgSW50LiBiaXRzICovCisJb3V0cHcoUExDMl9JLGlucHcoUExDMl9JKSkgOworI2VuZGlmCisJcGxjX2lycShzbWMsUEEsc3QpIDsKK30KKworCisvKgorICogaW50ZXJydXB0IHNvdXJjZT0gdGltZXIKKyAqLwordm9pZCB0aW1lcl9pcnEoc3RydWN0IHNfc21jICpzbWMpCit7CisJaHd0X3Jlc3RhcnQoc21jKTsKKwlzbWMtPmh3LnRfc3RvcCA9IHNtYy0+aHcudF9zdGFydDsKKwlzbXRfdGltZXJfZG9uZShzbWMpIDsKK30KKworLyoKKyAqIHJldHVybiBTLXBvcnQgKFBBIG9yIFBCKQorICovCitpbnQgcGNtX2dldF9zX3BvcnQoc3RydWN0IHNfc21jICpzbWMpCit7CisJU0tfVU5VU0VEKHNtYykgOworCXJldHVybihQUykgOworfQorCisvKgorICogU3RhdGlvbiBMYWJlbCA9ICJGRERJLVhZWiIgd2hlcmUKKyAqCisgKglYID0gY29ubmVjdG9yIHR5cGUKKyAqCVkgPSBQTUQgdHlwZQorICoJWiA9IHBvcnQgdHlwZQorICovCisjZGVmaW5lIFNUQVRJT05fTEFCRUxfQ09OTkVDVE9SX09GRlNFVAk1CisjZGVmaW5lIFNUQVRJT05fTEFCRUxfUE1EX09GRlNFVAk2CisjZGVmaW5lIFNUQVRJT05fTEFCRUxfUE9SVF9PRkZTRVQJNworCit2b2lkIHJlYWRfYWRkcmVzcyhzdHJ1Y3Qgc19zbWMgKnNtYywgdV9jaGFyICptYWNfYWRkcikKK3sKKwljaGFyIENvbm5lY3RvclR5cGUgOworCWNoYXIgUG1kVHlwZSA7CisJaW50CWkgOworCisJZXh0ZXJuIGNvbnN0IHVfY2hhciBjYW5vbmljYWxbMjU2XSA7CisKKyNpZgkoZGVmaW5lZChJU0EpIHx8IGRlZmluZWQoTUNBKSkKKwlmb3IgKGkgPSAwOyBpIDwgNCA7aSsrKSB7CS8qIHJlYWQgbWFjIGFkZHJlc3MgZnJvbSBib2FyZCAqLworCQlzbWMtPmh3LmZkZGlfcGh5c19hZGRyLmFbaV0gPQorCQkJY2Fub25pY2FsWyhpbnB3KFBSX0EoaStTQV9NQUMpKSYweGZmKV0gOworCX0KKwlmb3IgKGkgPSA0OyBpIDwgNjsgaSsrKSB7CisJCXNtYy0+aHcuZmRkaV9waHlzX2FkZHIuYVtpXSA9CisJCQljYW5vbmljYWxbKGlucHcoUFJfQShpK1NBX01BQytQUkFfT0ZGKSkmMHhmZildIDsKKwl9CisjZW5kaWYKKyNpZmRlZglFSVNBCisJLyoKKwkgKiBOb3RlOiBXZSBnZXQgdHJvdWJsZSBvbiBhbiBBbHBoYSBtYWNoaW5lIGlmIHdlIG1ha2UgYSBpbnB3KCkKKwkgKiBpbnN0ZWFkIG9mIGlucCgpCisJICovCisJZm9yIChpID0gMDsgaSA8IDQgO2krKykgewkvKiByZWFkIG1hYyBhZGRyZXNzIGZyb20gYm9hcmQgKi8KKwkJc21jLT5ody5mZGRpX3BoeXNfYWRkci5hW2ldID0KKwkJCWNhbm9uaWNhbFtpbnAoUFJfQShpK1NBX01BQykpXSA7CisJfQorCWZvciAoaSA9IDQ7IGkgPCA2OyBpKyspIHsKKwkJc21jLT5ody5mZGRpX3BoeXNfYWRkci5hW2ldID0KKwkJCWNhbm9uaWNhbFtpbnAoUFJfQShpK1NBX01BQytQUkFfT0ZGKSldIDsKKwl9CisjZW5kaWYKKyNpZmRlZglQQ0kKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CS8qIHJlYWQgbWFjIGFkZHJlc3MgZnJvbSBib2FyZCAqLworCQlzbWMtPmh3LmZkZGlfcGh5c19hZGRyLmFbaV0gPQorCQkJY2Fub25pY2FsW2lucChBRERSKEIyX01BQ18wK2kpKV0gOworCX0KKyNlbmRpZgorI2lmbmRlZglQQ0kKKwlDb25uZWN0b3JUeXBlID0gaW5wdyhQUl9BKFNBX1BNRF9UWVBFKSkgJiAweGZmIDsKKwlQbWRUeXBlID0gaW5wdyhQUl9BKFNBX1BNRF9UWVBFKzEpKSAmIDB4ZmYgOworI2Vsc2UKKwlDb25uZWN0b3JUeXBlID0gaW5wKEFERFIoQjJfQ09OTl9UWVApKSA7CisJUG1kVHlwZSA9IGlucChBRERSKEIyX1BNRF9UWVApKSA7CisjZW5kaWYKKworCXNtYy0+eVtQQV0ucG1kX3R5cGVbUE1EX1NLX0NPTk5dID0KKwlzbWMtPnlbUEJdLnBtZF90eXBlW1BNRF9TS19DT05OXSA9IENvbm5lY3RvclR5cGUgOworCXNtYy0+eVtQQV0ucG1kX3R5cGVbUE1EX1NLX1BNRCBdID0KKwlzbWMtPnlbUEJdLnBtZF90eXBlW1BNRF9TS19QTUQgXSA9IFBtZFR5cGUgOworCisJaWYgKG1hY19hZGRyKSB7CisJCWZvciAoaSA9IDA7IGkgPCA2IDtpKyspIHsKKwkJCXNtYy0+aHcuZmRkaV9jYW5vbl9hZGRyLmFbaV0gPSBtYWNfYWRkcltpXSA7CisJCQlzbWMtPmh3LmZkZGlfaG9tZV9hZGRyLmFbaV0gPSBjYW5vbmljYWxbbWFjX2FkZHJbaV1dIDsKKwkJfQorCQlyZXR1cm4gOworCX0KKwlzbWMtPmh3LmZkZGlfaG9tZV9hZGRyID0gc21jLT5ody5mZGRpX3BoeXNfYWRkciA7CisKKwlmb3IgKGkgPSAwOyBpIDwgNiA7aSsrKSB7CisJCXNtYy0+aHcuZmRkaV9jYW5vbl9hZGRyLmFbaV0gPQorCQkJY2Fub25pY2FsW3NtYy0+aHcuZmRkaV9waHlzX2FkZHIuYVtpXV0gOworCX0KK30KKworLyoKKyAqIEZEREkgY2FyZCBzb2Z0IHJlc2V0CisgKi8KK3ZvaWQgaW5pdF9ib2FyZChzdHJ1Y3Qgc19zbWMgKnNtYywgdV9jaGFyICptYWNfYWRkcikKK3sKKwljYXJkX3N0YXJ0KHNtYykgOworCXJlYWRfYWRkcmVzcyhzbWMsbWFjX2FkZHIpIDsKKworI2lmbmRlZglQQ0kKKwlpZiAoaW5wdyhDU1JfQSkgJiBDU19TQVMpCisjZWxzZQorCWlmICghKGlucChBRERSKEIwX0RBUykpICYgREFTX0FWQUlMKSkKKyNlbmRpZgorCQlzbWMtPnMuc2FzID0gU01UX1NBUyA7CS8qIFNpbmdsZSBhdHQuIHN0YXRpb24gKi8KKwllbHNlCisJCXNtYy0+cy5zYXMgPSBTTVRfREFTIDsJLyogRHVhbCBhdHQuIHN0YXRpb24gKi8KKworI2lmbmRlZglQQ0kKKwlpZiAoaW5wdyhDU1JfQSkgJiBDU19CWVNUQVQpCisjZWxzZQorCWlmICghKGlucChBRERSKEIwX0RBUykpICYgREFTX0JZUF9TVCkpCisjZW5kaWYKKwkJc21jLT5taWIuZmRkaVNNVEJ5cGFzc1ByZXNlbnQgPSAwIDsKKwkJLyogd2l0aG91dCBvcHQuIGJ5cGFzcyAqLworCWVsc2UKKwkJc21jLT5taWIuZmRkaVNNVEJ5cGFzc1ByZXNlbnQgPSAxIDsKKwkJLyogd2l0aCBvcHQuIGJ5cGFzcyAqLworfQorCisvKgorICogaW5zZXJ0IG9yIGRlaW5zZXJ0IG9wdGljYWwgYnlwYXNzIChjYWxsZWQgYnkgRUNNKQorICovCit2b2lkIHNtX3BtX2J5cGFzc19yZXEoc3RydWN0IHNfc21jICpzbWMsIGludCBtb2RlKQoreworI2lmCShkZWZpbmVkKElTQSkgfHwgZGVmaW5lZChFSVNBKSkKKwlpbnQgY3NyYV92IDsKKyNlbmRpZgorCisJREJfRUNNTigxLCJFQ00gOiBzbV9wbV9ieXBhc3NfcmVxKCVzKVxuIiwobW9kZSA9PSBCUF9JTlNFUlQpID8KKwkJCQkJIkJQX0lOU0VSVCIgOiAiQlBfREVJTlNFUlQiLDApIDsKKworCWlmIChzbWMtPnMuc2FzICE9IFNNVF9EQVMpCisJCXJldHVybiA7CisKKyNpZgkoZGVmaW5lZChJU0EpIHx8IGRlZmluZWQoRUlTQSkpCisKKwljc3JhX3YgPSBpbnB3KENTUl9BKSAmIH5DU19CWVBBU1MgOworI2lmZGVmCUVJU0EKKwljc3JhX3YgfD0gc21jLT5ody5sZWQgOworI2VuZGlmCisKKwlzd2l0Y2gobW9kZSkgeworCWNhc2UgQlBfSU5TRVJUIDoKKwkJb3V0cHcoQ1NSX0EsY3NyYV92IHwgQ1NfQllQQVNTKSA7CisJCWJyZWFrIDsKKwljYXNlIEJQX0RFSU5TRVJUIDoKKwkJb3V0cHcoQ1NSX0EsY3NyYV92KSA7CisJCWJyZWFrIDsKKwl9CisjZW5kaWYJLyogSVNBIC8gRUlTQSAqLworI2lmZGVmCU1DQQorCXN3aXRjaChtb2RlKSB7CisJY2FzZSBCUF9JTlNFUlQgOgorCQlvdXRwKEFERFIoQllQQVNTKFNUQVRfSU5TKSksMCkgOy8qIGluc2VydCBzdGF0aW9uICovCisJCWJyZWFrIDsKKwljYXNlIEJQX0RFSU5TRVJUIDoKKwkJb3V0cChBRERSKEJZUEFTUyhTVEFUX0JZUCkpLDApIDsJLyogYnlwYXNzIHN0YXRpb24gKi8KKwkJYnJlYWsgOworCX0KKyNlbmRpZgorI2lmZGVmCVBDSQorCXN3aXRjaChtb2RlKSB7CisJY2FzZSBCUF9JTlNFUlQgOgorCQlvdXRwKEFERFIoQjBfREFTKSxEQVNfQllQX0lOUykgOwkvKiBpbnNlcnQgc3RhdGlvbiAqLworCQlicmVhayA7CisJY2FzZSBCUF9ERUlOU0VSVCA6CisJCW91dHAoQUREUihCMF9EQVMpLERBU19CWVBfUk1WKSA7CS8qIGJ5cGFzcyBzdGF0aW9uICovCisJCWJyZWFrIDsKKwl9CisjZW5kaWYKK30KKworLyoKKyAqIGNoZWNrIGlmIGJ5cGFzcyBjb25uZWN0ZWQKKyAqLworaW50IHNtX3BtX2J5cGFzc19wcmVzZW50KHN0cnVjdCBzX3NtYyAqc21jKQoreworI2lmbmRlZglQQ0kKKwlyZXR1cm4oCShpbnB3KENTUl9BKSAmIENTX0JZU1RBVCkgPyBGQUxTRSA6IFRSVUUgKSA7CisjZWxzZQorCXJldHVybigJKGlucChBRERSKEIwX0RBUykpICYgREFTX0JZUF9TVCkgPyBUUlVFOiBGQUxTRSkgOworI2VuZGlmCit9CisKK3ZvaWQgcGxjX2NsZWFyX2lycShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHApCit7CisJU0tfVU5VU0VEKHApIDsKKworI2lmCShkZWZpbmVkKElTQSkgfHwgZGVmaW5lZChFSVNBKSkKKwlzd2l0Y2ggKHApIHsKKwljYXNlIFBBIDoKKwkJLyogcmVzZXQgUExDIEludC4gYml0cyAqLworCQlvdXRwdyhQTEMyX0ksaW5wdyhQTEMyX0kpKSA7CisJCWJyZWFrIDsKKwljYXNlIFBCIDoKKwkJLyogcmVzZXQgUExDIEludC4gYml0cyAqLworCQlvdXRwdyhQTEMxX0ksaW5wdyhQTEMxX0kpKSA7CisJCWJyZWFrIDsKKwl9CisjZWxzZQorCVNLX1VOVVNFRChzbWMpIDsKKyNlbmRpZgorfQorCisKKy8qCisgKiBsZWRfaW5kaWNhdGlvbiBjYWxsZWQgYnkgcm10X2luZGljYXRpb24oKSBhbmQKKyAqIHBjbV9zdGF0ZV9jaGFuZ2UoKQorICoKKyAqIElucHV0OgorICoJc21jOglTTVQgY29udGV4dAorICoJbGVkX2V2ZW50OgorICoJMAlPbmx5IHN3aXRjaCBncmVlbiBMRURzIGFjY29yZGluZyB0byB0aGVpciByZXNwZWN0aXZlIFBDTSBzdGF0ZQorICoJTEVEX1lfT0ZGCWp1c3Qgc3dpdGNoIHllbGxvdyBMRUQgb2ZmCisgKglMRURfWV9PTglqdXN0IHN3aXRjaCB5ZWxsbyBMRUQgb24KKyAqLwordm9pZCBsZWRfaW5kaWNhdGlvbihzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGxlZF9ldmVudCkKK3sKKwkvKiB1c2Ugc21jLT5ody5tYWNfcmluZ19pc191cCA9PSBUUlVFIAorCSAqIGFzIGluZGljYXRpb24gZm9yIFJpbmcgT3BlcmF0aW9uYWwKKwkgKi8KKwl1X3Nob3J0CQkJbGVkX3N0YXRlIDsKKwlzdHJ1Y3Qgc19waHkJCSpwaHkgOworCXN0cnVjdCBmZGRpX21pYl9wCSptaWJfYSA7CisJc3RydWN0IGZkZGlfbWliX3AJKm1pYl9iIDsKKworCXBoeSA9ICZzbWMtPnlbUEFdIDsKKwltaWJfYSA9IHBoeS0+bWliIDsKKwlwaHkgPSAmc21jLT55W1BCXSA7CisJbWliX2IgPSBwaHktPm1pYiA7CisKKyNpZmRlZglFSVNBCisJLyogUmluZyB1cCA9IHllbGxvdyBsZWQgT0ZGKi8KKwlpZiAobGVkX2V2ZW50ID09IExFRF9ZX09OKSB7CisJCXNtYy0+aHcubGVkIHw9IENTX0xFRF8xIDsKKwl9CisJZWxzZSBpZiAobGVkX2V2ZW50ID09IExFRF9ZX09GRikgeworCQlzbWMtPmh3LmxlZCAmPSB+Q1NfTEVEXzEgOworCX0KKwllbHNlIHsKKwkJLyogTGluayBhdCBQb3J0IEEgb3IgQiA9IGdyZWVuIGxlZCBPTiAqLworCQlpZiAobWliX2EtPmZkZGlQT1JUUENNU3RhdGUgPT0gUEM4X0FDVElWRSB8fAorCQkgICAgbWliX2ItPmZkZGlQT1JUUENNU3RhdGUgPT0gUEM4X0FDVElWRSkgeworCQkJc21jLT5ody5sZWQgfD0gQ1NfTEVEXzAgOworCQl9CisJCWVsc2UgeworCQkJc21jLT5ody5sZWQgJj0gfkNTX0xFRF8wIDsKKwkJfQorCX0KKyNlbmRpZgorI2lmZGVmCU1DQQorCWxlZF9zdGF0ZSA9IGlucHcoTEVEUl9BKSA7CisJCisJLyogUmluZyB1cCA9IHllbGxvdyBsZWQgT0ZGKi8KKwlpZiAobGVkX2V2ZW50ID09IExFRF9ZX09OKSB7CisJCWxlZF9zdGF0ZSB8PSBMRURfMSA7CisJfQorCWVsc2UgaWYgKGxlZF9ldmVudCA9PSBMRURfWV9PRkYpIHsKKwkJbGVkX3N0YXRlICY9IH5MRURfMSA7CisJfQorCWVsc2UgeworICAgICAgICAgICAgICAgIGxlZF9zdGF0ZSAmPSB+KExFRF8yfExFRF8wKSA7CisKKwkJLyogTGluayBhdCBQb3J0IEEgPSBncmVlbiBsZWQgQSBPTiAqLworCQlpZiAobWliX2EtPmZkZGlQT1JUUENNU3RhdGUgPT0gUEM4X0FDVElWRSkgewkKKwkJCWxlZF9zdGF0ZSB8PSBMRURfMiA7CisJCX0KKwkJCisJCS8qIExpbmsgYXQgUG9ydCBCL1MgPSBncmVlbiBsZWQgQiBPTiAqLworCQlpZiAobWliX2ItPmZkZGlQT1JUUENNU3RhdGUgPT0gUEM4X0FDVElWRSkgeworCQkJbGVkX3N0YXRlIHw9IExFRF8wIDsKKwkJfQorCX0KKworICAgICAgICBvdXRwdyhMRURSX0EsIGxlZF9zdGF0ZSkgOworI2VuZGlmCS8qIE1DQSAqLworI2lmZGVmCVBDSQorICAgICAgICBsZWRfc3RhdGUgPSAwIDsKKwkKKwkvKiBSaW5nIHVwID0geWVsbG93IGxlZCBPRkYqLworCWlmIChsZWRfZXZlbnQgPT0gTEVEX1lfT04pIHsKKwkJbGVkX3N0YXRlIHw9IExFRF9NWV9PTiA7CisJfQorCWVsc2UgaWYgKGxlZF9ldmVudCA9PSBMRURfWV9PRkYpIHsKKwkJbGVkX3N0YXRlIHw9IExFRF9NWV9PRkYgOworCX0KKwllbHNlIHsJLyogUENNIHN0YXRlIGNoYW5nZWQgKi8KKwkJLyogTGluayBhdCBQb3J0IEEvUyA9IGdyZWVuIGxlZCBBIE9OICovCisJCWlmIChtaWJfYS0+ZmRkaVBPUlRQQ01TdGF0ZSA9PSBQQzhfQUNUSVZFKSB7CQorCQkJbGVkX3N0YXRlIHw9IExFRF9HQV9PTiA7CisJCX0KKwkJZWxzZSB7CisJCQlsZWRfc3RhdGUgfD0gTEVEX0dBX09GRiA7CisJCX0KKwkJCisJCS8qIExpbmsgYXQgUG9ydCBCID0gZ3JlZW4gbGVkIEIgT04gKi8KKwkJaWYgKG1pYl9iLT5mZGRpUE9SVFBDTVN0YXRlID09IFBDOF9BQ1RJVkUpIHsKKwkJCWxlZF9zdGF0ZSB8PSBMRURfR0JfT04gOworCQl9CisJCWVsc2UgeworCQkJbGVkX3N0YXRlIHw9IExFRF9HQl9PRkYgOworCQl9CisJfQorCisgICAgICAgIG91dHAoQUREUihCMF9MRUQpLCBsZWRfc3RhdGUpIDsKKyNlbmRpZgkvKiBQQ0kgKi8KKworfQorCisKK3ZvaWQgcGNtX3N0YXRlX2NoYW5nZShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHBsYywgaW50IHBfc3RhdGUpCit7CisJLyoKKwkgKiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBwY21fc3RhdGVfY2hhbmdlKCkgaW4gdGhlIGRyaXZlcgorCSAqIHBhcnRzIG11c3QgYmUgcmVuYW1lZCB0byBkcnZfcGNtX3N0YXRlX2NoYW5nZSgpIHdoaWNoIHdpbGwgYmUgY2FsbGVkCisJICogbm93IGFmdGVyIGxlZF9pbmRpY2F0aW9uLgorCSAqLworCURSVl9QQ01fU1RBVEVfQ0hBTkdFKHNtYyxwbGMscF9zdGF0ZSkgOworCQorCWxlZF9pbmRpY2F0aW9uKHNtYywwKSA7Cit9CisKKwordm9pZCBybXRfaW5kaWNhdGlvbihzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGkpCit7CisJLyogQ2FsbCBhIGRyaXZlciBzcGVjaWFsIGZ1bmN0aW9uIGlmIGRlZmluZWQgKi8KKwlEUlZfUk1UX0lORElDQVRJT04oc21jLGkpIDsKKworICAgICAgICBsZWRfaW5kaWNhdGlvbihzbWMsIGkgPyBMRURfWV9PRkYgOiBMRURfWV9PTikgOworfQorCisKKy8qCisgKiBsbGNfcmVjb3Zlcl90eCBjYWxsZWQgYnkgaW5pdF90eCAoZnBsdXMuYykKKyAqLwordm9pZCBsbGNfcmVjb3Zlcl90eChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKyNpZmRlZglMT0FEX0dFTgorCWV4dGVybglpbnQgbG9hZF9nZW5fZmxhZyA7CisKKwlsb2FkX2dlbl9mbGFnID0gMCA7CisjZW5kaWYKKyNpZm5kZWYJU1lOQworCXNtYy0+aHcubl9hX3NlbmQ9IDAgOworI2Vsc2UKKwlTS19VTlVTRUQoc21jKSA7CisjZW5kaWYKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRE1BIGluaXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYJSVNBCisKKy8qCisgKiBpbml0IERNQQorICovCit2b2lkIGluaXRfZG1hKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgZG1hKQoreworCVNLX1VOVVNFRChzbWMpIDsKKworCS8qCisJICogc2V0IGNhc2NhZGUgbW9kZSwKKwkgKiBjbGVhciBtYXNrIGJpdCAoZW5hYmxlIERNQSBjYW5uYWwpCisJICovCisJaWYgKGRtYSA+IDMpIHsKKwkJb3V0cCgweGQ2LChkbWEgJiAweDAzKSB8IDB4YzApIDsKKwkJb3V0cCgweGQ0LCBkbWEgJiAweDAzKSA7CisJfQorCWVsc2UgeworCQlvdXRwKDB4MGIsKGRtYSAmIDB4MDMpIHwgMHhjMCkgOworCQlvdXRwKDB4MGEsZG1hICYgMHgwMykgOworCX0KK30KKworLyoKKyAqIGRpc2FibGUgRE1BCisgKi8KK3ZvaWQgZGlzX2RtYShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGRtYSkKK3sKKwlTS19VTlVTRUQoc21jKSA7CisKKwkvKgorCSAqIHNldCBtYXNrIGJpdCAoZGlzYWJsZSBETUEgY2FubmFsKQorCSAqLworCWlmIChkbWEgPiAzKSB7CisJCW91dHAoMHhkNCwoZG1hICYgMHgwMykgfCAweDA0KSA7CisJfQorCWVsc2UgeworCQlvdXRwKDB4MGEsKGRtYSAmIDB4MDMpIHwgMHgwNCkgOworCX0KK30KKworI2VuZGlmCS8qIElTQSAqLworCisjaWZkZWYJRUlTQQorCisvKmFycmF5cyB3aXRoIGlvIGFkZHJlc3NlcyBvZiBkbWEgY29udHJvbGxlciBsZW5ndGggYW5kIGFkZHJlc3MgcmVnaXN0ZXJzKi8KK3N0YXRpYyBjb25zdCBpbnQgY250cls4XSA9IHsgMHgwMDEsMHgwMDMsMHgwMDUsMHgwMDcsMCwweDBjNiwweDBjYSwweDBjZSB9IDsKK3N0YXRpYyBjb25zdCBpbnQgYmFzZVs4XSA9IHsgMHgwMDAsMHgwMDIsMHgwMDQsMHgwMDYsMCwweDBjNCwweDBjOCwweDBjYyB9IDsKK3N0YXRpYyBjb25zdCBpbnQgcGFnZVs4XSA9IHsgMHgwODcsMHgwODMsMHgwODEsMHgwODIsMCwweDA4YiwweDA4OSwweDA4YSB9IDsKKwordm9pZCBpbml0X2RtYShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGRtYSkKK3sKKwkvKgorCSAqIGV4dGVuZGVkIG1vZGUgcmVnaXN0ZXIKKwkgKiAzMiBiaXQgSU8KKwkgKiB0eXBlIGMKKwkgKiBUQyBvdXRwdXQKKwkgKiBkaXNhYmxlIHN0b3AKKwkgKi8KKworCS8qIG1vZGUgcmVhZCAod3JpdGUpIGRlbWFuZCAqLworCXNtYy0+aHcuZG1hX3Jtb2RlID0gKGRtYSAmIDMpIHwgMHgwOCB8IDB4MCA7CisJc21jLT5ody5kbWFfd21vZGUgPSAoZG1hICYgMykgfCAweDA0IHwgMHgwIDsKKworCS8qIDMyIGJpdCBJTydzLCBidXJzdCBETUEgbW9kZSAodHlwZSAiQyIpICovCisJc21jLT5ody5kbWFfZW1vZGUgPSAoZG1hICYgMykgfCAweDA4IHwgMHgzMCA7CisKKwlvdXRwKChkbWEgPCA0KSA/IDB4NDBiIDogMHg0ZDYsc21jLT5ody5kbWFfZW1vZGUpIDsKKworCS8qIGRpc2FibGUgY2hhaW5pbmcgKi8KKwlvdXRwKChkbWEgPCA0KSA/IDB4NDBhIDogMHg0ZDQsKGRtYSYzKSkgOworCisJLypsb2FkIGRtYSBjb250cm9sbGVyIGFkZHJlc3NlcyBmb3IgZmFzdCBhY2Nlc3MgZHVyaW5nIHNldCBkbWEqLworCXNtYy0+aHcuZG1hX2Jhc2Vfd29yZF9jb3VudCA9IGNudHJbc21jLT5ody5kbWFdOworCXNtYy0+aHcuZG1hX2Jhc2VfYWRkcmVzcyA9IGJhc2Vbc21jLT5ody5kbWFdOworCXNtYy0+aHcuZG1hX2Jhc2VfYWRkcmVzc19wYWdlID0gcGFnZVtzbWMtPmh3LmRtYV07CisKK30KKwordm9pZCBkaXNfZG1hKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgZG1hKQoreworCVNLX1VOVVNFRChzbWMpIDsKKworCW91dHAoKGRtYSA8IDQpID8gMHgwYSA6IDB4ZDQsKGRtYSYzKXw0KSA7LyogbWFzayBiaXQgKi8KK30KKyNlbmRpZgkvKiBFSVNBICovCisKKyNpZmRlZglNQ0EKK3ZvaWQgaW5pdF9kbWEoc3RydWN0IHNfc21jICpzbWMsIGludCBkbWEpCit7CisJU0tfVU5VU0VEKHNtYykgOworCVNLX1VOVVNFRChkbWEpIDsKK30KKwordm9pZCBkaXNfZG1hKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgZG1hKQoreworCVNLX1VOVVNFRChzbWMpIDsKKwlTS19VTlVTRUQoZG1hKSA7Cit9CisjZW5kaWYKKworI2lmZGVmCVBDSQordm9pZCBpbml0X2RtYShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGRtYSkKK3sKKwlTS19VTlVTRUQoc21jKSA7CisJU0tfVU5VU0VEKGRtYSkgOworfQorCit2b2lkIGRpc19kbWEoc3RydWN0IHNfc21jICpzbWMsIGludCBkbWEpCit7CisJU0tfVU5VU0VEKHNtYykgOworCVNLX1VOVVNFRChkbWEpIDsKK30KKyNlbmRpZgorCisjaWZkZWYgTVVMVF9PRU0KK3N0YXRpYyBpbnQgaXNfZXF1YWxfbnVtKGNoYXIgY29tcDFbXSwgY2hhciBjb21wMltdLCBpbnQgbnVtKQoreworCWludCBpIDsKKworCWZvciAoaSA9IDAgOyBpIDwgbnVtIDsgaSsrKSB7CisJCWlmIChjb21wMVtpXSAhPSBjb21wMltpXSkKKwkJCXJldHVybiAoMCkgOworCX0KKwkJcmV0dXJuICgxKSA7Cit9CS8qIGlzX2VxdWFsX251bSAqLworCisKKy8qCisgKiBzZXQgdGhlIE9FTSBJRCBkZWZhdWx0cywgYW5kIHRlc3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBPRU0gZGF0YSBiYXNlCisgKiBUaGUgZGVmYXVsdCBPRU0gaXMgdGhlIGZpcnN0IEFDVElWRSBlbnRyeSBpbiB0aGUgT0VNIGRhdGEgYmFzZSAKKyAqCisgKiByZXR1cm5zOgkwCXN1Y2Nlc3MKKyAqCQkxCWVycm9yIGluIGRhdGEgYmFzZQorICoJCTIJZGF0YSBiYXNlIGVtcHR5CisgKgkJMwlubyBhY3RpdmUgZW50cnkJCisgKi8KK2ludCBzZXRfb2lfaWRfZGVmKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWludCBzZWxfaWQgOworCWludCBpIDsKKwlpbnQgYWN0X2VudHJpZXMgOworCisJaSA9IDAgOworCXNlbF9pZCA9IC0xIDsKKwlhY3RfZW50cmllcyA9IEZBTFNFIDsKKwlzbWMtPmh3Lm9lbV9pZCA9IDAgOworCXNtYy0+aHcub2VtX21pbl9zdGF0dXMgPSBPSV9TVEFUX0FDVElWRSA7CisJCisJLyogY2hlY2sgT0VNIGRhdGEgYmFzZSAqLworCXdoaWxlIChvZW1faWRzW2ldLm9pX3N0YXR1cykgeworCQlzd2l0Y2ggKG9lbV9pZHNbaV0ub2lfc3RhdHVzKSB7CisJCWNhc2UgT0lfU1RBVF9BQ1RJVkU6CisJCQlhY3RfZW50cmllcyA9IFRSVUUgOwkvKiB3ZSBoYXZlIGFjdGl2ZSBJRHMgKi8KKwkJCWlmIChzZWxfaWQgPT0gLTEpCisJCQkJc2VsX2lkID0gaSA7CS8qIHNhdmUgdGhlIGZpcnN0IGFjdGl2ZSBJRCAqLworCQljYXNlIE9JX1NUQVRfVkFMSUQ6CisJCWNhc2UgT0lfU1RBVF9QUkVTRU5UOgorCQkJaSsrIDsKKwkJCWJyZWFrIDsJCQkvKiBlbnRyeSBvayAqLworCQlkZWZhdWx0OgorCQkJcmV0dXJuICgxKSA7CQkvKiBpbnZhbGlkIG9pX3N0YXR1cyAqLworCQl9CisJfQorCisJaWYgKGkgPT0gMCkKKwkJcmV0dXJuICgyKSA7CisJaWYgKCFhY3RfZW50cmllcykKKwkJcmV0dXJuICgzKSA7CisKKwkvKiBvaywgd2UgaGF2ZSBhIHZhbGlkIE9FTSBkYXRhIGJhc2Ugd2l0aCBhbiBhY3RpdmUgZW50cnkgKi8KKwlzbWMtPmh3Lm9lbV9pZCA9IChzdHJ1Y3Qgc19vZW1faWRzICopICAmb2VtX2lkc1tzZWxfaWRdIDsKKwlyZXR1cm4gKDApIDsKK30KKyNlbmRpZgkvKiBNVUxUX09FTSAqLworCisKKyNpZmRlZglNQ0EKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBCRUdJTl9NQU5VQUxfRU5UUlkoKQorICoKKyAqCWV4aXN0X2JvYXJkCisgKgorICoJQ2hlY2sgaWYgYW4gTUNBIGJvYXJkIGlzIHByZXNlbnQgaW4gdGhlIHNwZWNpZmllZCBzbG90LgorICoKKyAqCWludCBleGlzdF9ib2FyZCgKKyAqCQlzdHJ1Y3Qgc19zbWMgKnNtYywKKyAqCQlpbnQgc2xvdCkgOworICogSW4KKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIENvbnRleHQgc3RydWN0LgorICoKKyAqCXNsb3QgLSBUaGUgbnVtYmVyIG9mIHRoZSBzbG90IHRvIGluc3BlY3QuCisgKiBPdXQKKyAqCTAgPSBObyBhZGFwdGVyIHByZXNlbnQuCisgKgkxID0gRm91bmQgRk0xIGFkYXB0ZXIuCisgKgorICogUHNldWRvCisgKiAgICAgIFJlYWQgTUNBIElECisgKglmb3IgYWxsIHZhbGlkIE9FTV9JRHMKKyAqCQljb21wYXJlIHdpdGggSUQgcmVhZAorICoJCWlmIGVxdWFsLCByZXR1cm4gMQorICoJcmV0dXJuKDAKKyAqCisgKiBOb3RlCisgKglUaGUgc21jIHBvaW50ZXIgbXVzdCBiZSB2YWxpZCBub3cuCisgKgorICogRU5EX01BTlVBTF9FTlRSWSgpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTE9OR19DQVJEX0lEKGxvLCBoaSkJKCgoKGhpKSAmIDB4ZmYpIDw8IDgpIHwgKChsbykgJiAweGZmKSkKK2ludCBleGlzdF9ib2FyZChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHNsb3QpCit7CisjaWZkZWYgTVVMVF9PRU0KKwlTS19MT0NfREVDTCh1X2NoYXIsaWRbMl0pIDsKKwlpbnQgaWRpIDsKKyNlbmRpZgkvKiBNVUxUX09FTSAqLworCisJLyogTm8gbG9uZ2VyIHZhbGlkLiAqLworCWlmIChzbWMgPT0gTlVMTCkKKwkJcmV0dXJuKDApIDsKKworI2lmbmRlZiBNVUxUX09FTQorCWlmIChyZWFkX2NhcmRfaWQoc21jLCBzbG90KQorCQk9PSBMT05HX0NBUkRfSUQoT0VNSUQoc21jLDApLCBPRU1JRChzbWMsMSkpKQorCQlyZXR1cm4gKDEpIDsJLyogRm91bmQgRk0gYWRhcHRlci4gKi8KKworI2Vsc2UJLyogTVVMVF9PRU0gKi8KKwlpZGkgPSByZWFkX2NhcmRfaWQoc21jLCBzbG90KSA7CisJaWRbMF0gPSBpZGkgJiAweGZmIDsKKwlpZFsxXSA9IGlkaSA+PiA4IDsKKworICAgICAgICBzbWMtPmh3Lm9lbV9pZCA9IChzdHJ1Y3Qgc19vZW1faWRzICopICZvZW1faWRzWzBdIDsKKwlmb3IgKDsgc21jLT5ody5vZW1faWQtPm9pX3N0YXR1cyAhPSBPSV9TVEFUX0xBU1Q7IHNtYy0+aHcub2VtX2lkKyspIHsKKwkJaWYgKHNtYy0+aHcub2VtX2lkLT5vaV9zdGF0dXMgPCBzbWMtPmh3Lm9lbV9taW5fc3RhdHVzKQorCQkJY29udGludWUgOworCisJCWlmIChpc19lcXVhbF9udW0oJmlkWzBdLCZPRU1JRChzbWMsMCksMikpCisJCQlyZXR1cm4gKDEpIDsKKwl9CisjZW5kaWYJLyogTVVMVF9PRU0gKi8KKwlyZXR1cm4gKDApIDsJLyogTm8gYWRhcHRlciBmb3VuZC4gKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCXJlYWRfY2FyZF9pZAorICoKKyAqCVJlYWQgdGhlIE1DQSBjYXJkIGlkIGZyb20gdGhlIHNwZWNpZmllZCBzbG90LgorICogSW4KKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIENvbnRleHQgc3RydWN0LgorICoJQ0FWRUFUOiBUaGlzIHBvaW50ZXIgbWF5IGJlIE5VTEwgYW5kICptdXN0IG5vdCogYmUgdXNlZCB3aXRoaW4gdGhpcworICoJZnVuY3Rpb24uIEl0J3Mgb25seSBwdXJwb3NlIGlzIGZvciBkcml2ZXJzIHRoYXQgbmVlZCBzb21lIGluZm9ybWF0aW9uCisgKglmb3IgdGhlIGlucCgpIGFuZCBvdXRwKCkgbWFjcm9zLgorICoKKyAqCXNsb3QgLSBUaGUgbnVtYmVyIG9mIHRoZSBzbG90IGZvciB3aGljaCB0aGUgY2FyZCBpZCBpcyByZXR1cm5lZC4KKyAqIE91dAorICoJUmV0dXJucyB0aGUgY2FyZCBpZCByZWFkIGZyb20gdGhlIHNwZWNpZmllZCBzbG90LiBJZiBhbiBpbGxlZ2FsIHNsb3QKKyAqCW51bWJlciBpcyBzcGVjaWZpZWQsIHRoZSBmdW5jdGlvbiByZXR1cm5zIHplcm8uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcmVhZF9jYXJkX2lkKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgc2xvdCkKKy8qIHN0cnVjdCBzX3NtYyAqc21jIDsJRG8gbm90IHVzZS4gKi8KK3sKKwlpbnQgY2FyZF9pZCA7CisKKwlTS19VTlVTRUQoc21jKSA7CS8qIE1ha2UgTElOVCBoYXBweS4gKi8KKwlpZiAoKHNsb3QgPCAxKSB8fCAoc2xvdCA+IDE1KSkJLyogbWF4IDE2IHNsb3RzLCAwID0gbW90aGVyYm9hcmQgKi8KKwkJcmV0dXJuICgwKSA7CS8qIElsbGVnYWwgc2xvdCBudW1iZXIgc3BlY2lmaWVkLiAqLworCisJRW5hYmxlU2xvdEFjY2VzcyhzbWMsIHNsb3QpIDsKKworCWNhcmRfaWQgPSAoKHJlYWRfUE9TKHNtYyxQT1NfSURfSElHSCxzbG90IC0gMSkgJiAweGZmKSA8PCA4KSB8CisJCQkJKHJlYWRfUE9TKHNtYyxQT1NfSURfTE9XLHNsb3QgLSAxKSAmIDB4ZmYpIDsKKworCURpc2FibGVTbG90QWNjZXNzKHNtYykgOworCisJcmV0dXJuIChjYXJkX2lkKSA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBCRUdJTl9NQU5VQUxfRU5UUlkoKQorICoKKyAqCWdldF9ib2FyZF9wYXJhCisgKgorICoJR2V0IGFkYXB0ZXIgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gRmlsbCBhbGwgYm9hcmQgc3BlY2lmaWMKKyAqCXBhcmFtZXRlcnMgd2l0aGluIHRoZSAnc21jJyBzdHJ1Y3R1cmUuCisgKgorICoJaW50IGdldF9ib2FyZF9wYXJhKAorICoJCXN0cnVjdCBzX3NtYyAqc21jLAorICoJCWludCBzbG90KSA7CisgKiBJbgorICoJc21jIC0gQSBwb2ludGVyIHRvIHRoZSBTTVQgQ29udGV4dCBzdHJ1Y3QsIHRvIHdoaWNoIHRoaXMgZnVuY3Rpb24gd2lsbAorICoJd3JpdGUgc29tZSBhZGFwdGVyIGNvbmZpZ3VyYXRpb24gZGF0YS4KKyAqCisgKglzbG90IC0gVGhlIG51bWJlciBvZiB0aGUgc2xvdCwgaW4gd2hpY2ggdGhlIGFkYXB0ZXIgaXMgaW5zdGFsbGVkLgorICogT3V0CisgKgkwID0gTm8gYWRhcHRlciBwcmVzZW50LgorICoJMSA9IE9rLgorICoJMiA9IEFkYXB0ZXIgcHJlc2VudCwgYnV0IGNhcmQgZW5hYmxlIGJpdCBub3Qgc2V0LgorICoKKyAqIEVORF9NQU5VQUxfRU5UUlkoKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZ2V0X2JvYXJkX3BhcmEoc3RydWN0IHNfc21jICpzbWMsIGludCBzbG90KQoreworCWludCB2YWwgOworCWludCBpIDsKKworCS8qIENoZWNrIGlmIGFkYXB0ZXIgcHJlc2VudCAmIGdldCB0eXBlIG9mIGFkYXB0ZXIuICovCisJc3dpdGNoIChleGlzdF9ib2FyZChzbWMsIHNsb3QpKSB7CisJY2FzZSAwOgkvKiBBZGFwdGVyIG5vdCBwcmVzZW50LiAqLworCQlyZXR1cm4gKDApIDsKKwljYXNlIDE6CS8qIEZNIFJldi4gMSAqLworCQlzbWMtPmh3LnJldiA9IEZNMV9SRVYgOworCQlzbWMtPmh3LlZGdWxsUmVhZCA9IDB4MGEgOworCQlzbWMtPmh3LlZGdWxsV3JpdGUgPSAweDA1IDsKKwkJc21jLT5ody5EbWFXcml0ZUV4dHJhQnl0ZXMgPSA4IDsJLyogMiBleHRyYSB3b3Jkcy4gKi8KKwkJYnJlYWsgOworCX0KKwlzbWMtPmh3LnNsb3QgPSBzbG90IDsKKworCUVuYWJsZVNsb3RBY2Nlc3Moc21jLCBzbG90KSA7CisKKwlpZiAoIShyZWFkX1BPUyhzbWMsUE9TXzEwMiwgc2xvdCAtIDEpICYgUE9TX0NBUkRfRU4pKSB7CisJCURpc2FibGVTbG90QWNjZXNzKHNtYykgOworCQlyZXR1cm4gKDIpIDsJLyogQ2FyZCBlbmFibGUgYml0IG5vdCBzZXQuICovCisJfQorCisJdmFsID0gcmVhZF9QT1Moc21jLFBPU18xMDQsIHNsb3QgLSAxKSA7CS8qIEkvTywgSVJRICovCisKKyNpZm5kZWYgTUVNX01BUFBFRF9JTwkvKiBpcyBkZWZpbmVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtICovCisJaSA9IHZhbCAmIFBPU19JT1NFTCA7CS8qIEkvTyBiYXNlIGFkZHIuICgweDAyMDAgLi4gMHhmZTAwKSAqLworCXNtYy0+aHcuaW9wID0gKGkgKyAxKSAqIDB4MDQwMCAtIDB4MjAwIDsKKyNlbmRpZgorCWkgPSAoKHZhbCAmIFBPU19JUlFTRUwpID4+IDYpICYgMHgwMyA7CS8qIElSUSA8MCwgMT4gKi8KKwlzbWMtPmh3LmlycSA9IG9wdF9pbnRzW2ldIDsKKworCS8qIEZQUk9NIGJhc2UgYWRkci4gKi8KKwlpID0gKChyZWFkX1BPUyhzbWMsUE9TXzEwMywgc2xvdCAtIDEpICYgUE9TX01TRUwpID4+IDQpICYgMHgwNyA7CisJc21jLT5ody5lcHJvbSA9IG9wdF9lcHJvbXNbaV0gOworCisJRGlzYWJsZVNsb3RBY2Nlc3Moc21jKSA7CisKKwkvKiBiZWZvcmUgdGhpcywgdGhlIHNtYy0+aHcuaW9wIG11c3QgYmUgc2V0ICEhISAqLworCXNtYy0+aHcuc2xvdF8zMiA9IGlucHcoQ1NGX0EpICYgU0xPVF8zMiA7CisKKwlyZXR1cm4gKDEpIDsKK30KKworLyogRW5hYmxlIGFjY2VzcyB0byBzcGVjaWZpZWQgTUNBIHNsb3QuICovCitzdGF0aWMgdm9pZCBFbmFibGVTbG90QWNjZXNzKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgc2xvdCkKK3sKKwlTS19VTlVTRUQoc2xvdCkgOworCisjaWZuZGVmIEFJWAorCVNLX1VOVVNFRChzbWMpIDsKKworCS8qIFN5c3RlbSBtb2RlLiAqLworCW91dHAoUE9TX1NZU19TRVRVUCwgUE9TX1NZU1RFTSkgOworCisJLyogU2VsZWN0IHNsb3QuICovCisJb3V0cChQT1NfQ0hBTk5FTF9QT1MsIFBPU19DSEFOTkVMX0JJVCB8IChzbG90LTEpKSA7CisjZWxzZQorCWF0dGFjaF9QT1NfYWRkciAoc21jKSA7CisjZW5kaWYKK30KKworLyogRGlzYWJsZSBhY2Nlc3MgdG8gTUNBIHNsb3QgZm9ybWVybHkgZW5hYmxlZCB2aWEgRW5hYmxlU2xvdEFjY2VzcygpLiAqLworc3RhdGljIHZvaWQgRGlzYWJsZVNsb3RBY2Nlc3Moc3RydWN0IHNfc21jICpzbWMpCit7CisjaWZuZGVmIEFJWAorCVNLX1VOVVNFRChzbWMpIDsKKworCW91dHAoUE9TX0NIQU5ORUxfUE9TLCAwKSA7CisjZWxzZQorCWRldGFjaF9QT1NfYWRkciAoc21jKSA7CisjZW5kaWYKK30KKyNlbmRpZgkvKiBNQ0EgKi8KKworI2lmZGVmCUVJU0EKKyNpZm5kZWYJTUVNX01BUFBFRF9JTworI2RlZmluZQlTQUREUihzbG90KQkoKChzbG90KTw8MTIpJjB4ZjAwMCkKKyNlbHNlCS8qIE1FTV9NQVBQRURfSU8gKi8KKyNkZWZpbmUJU0FERFIoc2xvdCkJKHNtYy0+aHcuaW9wKQorI2VuZGlmCS8qIE1FTV9NQVBQRURfSU8gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEJFR0lOX01BTlVBTF9FTlRSWSgpCisgKgorICoJZXhpc3RfYm9hcmQKKyAqCisgKglDaGVjayBpZiBhbiBFSVNBIGJvYXJkIGlzIHByZXNlbnQgaW4gdGhlIHNwZWNpZmllZCBzbG90LgorICoKKyAqCWludCBleGlzdF9ib2FyZCgKKyAqCQlzdHJ1Y3Qgc19zbWMgKnNtYywKKyAqCQlpbnQgc2xvdCkgOworICogSW4KKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIENvbnRleHQgc3RydWN0LgorICoKKyAqCXNsb3QgLSBUaGUgbnVtYmVyIG9mIHRoZSBzbG90IHRvIGluc3BlY3QuCisgKiBPdXQKKyAqCTAgPSBObyBhZGFwdGVyIHByZXNlbnQuCisgKgkxID0gRm91bmQgYWRhcHRlci4KKyAqCisgKiBQc2V1ZG8KKyAqICAgICAgUmVhZCBFSVNBIElECisgKglmb3IgYWxsIHZhbGlkIE9FTV9JRHMKKyAqCQljb21wYXJlIHdpdGggSUQgcmVhZAorICoJCWlmIGVxdWFsLCByZXR1cm4gMQorICoJcmV0dXJuKDAKKyAqCisgKiBOb3RlCisgKglUaGUgc21jIHBvaW50ZXIgbXVzdCBiZSB2YWxpZCBub3cuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBleGlzdF9ib2FyZChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHNsb3QpCit7CisJaW50IGkgOworI2lmZGVmIE1VTFRfT0VNCisJU0tfTE9DX0RFQ0wodV9jaGFyLGlkWzRdKSA7CisjZW5kaWYJLyogTVVMVF9PRU0gKi8KKworCS8qIE5vIGxvbmdlciB2YWxpZC4gKi8KKwlpZiAoc21jID09IE5VTEwpCisJCXJldHVybigwKTsKKworCVNLX1VOVVNFRChzbG90KSA7CisKKyNpZm5kZWYgTVVMVF9PRU0KKwlmb3IgKGkgPSAwIDsgaSA8IDQgOyBpKyspIHsKKwkJaWYgKGlucChTQUREUihzbG90KStQUkEoaSkpICE9IE9FTUlEKHNtYyxpKSkKKwkJCXJldHVybigwKSA7CisJfQorCXJldHVybigxKSA7CisjZWxzZQkvKiBNVUxUX09FTSAqLworCWZvciAoaSA9IDAgOyBpIDwgNCA7IGkrKykKKwkJaWRbaV0gPSBpbnAoU0FERFIoc2xvdCkrUFJBKGkpKSA7CisKKwlzbWMtPmh3Lm9lbV9pZCA9IChzdHJ1Y3Qgc19vZW1faWRzICopICZvZW1faWRzWzBdIDsKKworCWZvciAoOyBzbWMtPmh3Lm9lbV9pZC0+b2lfc3RhdHVzICE9IE9JX1NUQVRfTEFTVDsgc21jLT5ody5vZW1faWQrKykgeworCQlpZiAoc21jLT5ody5vZW1faWQtPm9pX3N0YXR1cyA8IHNtYy0+aHcub2VtX21pbl9zdGF0dXMpCisJCQljb250aW51ZSA7CisKKwkJaWYgKGlzX2VxdWFsX251bSgmaWRbMF0sJk9FTUlEKHNtYywwKSw0KSkKKwkJCXJldHVybiAoMSkgOworCX0KKwlyZXR1cm4gKDApIDsJLyogTm8gYWRhcHRlciBmb3VuZC4gKi8KKyNlbmRpZgkvKiBNVUxUX09FTSAqLworfQorCisKK2ludCBnZXRfYm9hcmRfcGFyYShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHNsb3QpCit7CisJaW50CWkgOworCisJaWYgKCFleGlzdF9ib2FyZChzbWMsc2xvdCkpCisJCXJldHVybigwKSA7CisKKwlzbWMtPmh3LnNsb3QgPSBzbG90IDsKKyNpZm5kZWYJTUVNX01BUFBFRF9JTwkJLyogaWYgZGVmaW5lZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSAqLworCXNtYy0+aHcuaW9wID0gU0FERFIoc2xvdCkgOworI2VuZGlmCisKKwlpZiAoIShpbnAoQzBfQSgwKSkmQ0ZHX0NBUkRfRU4pKSB7CisJCXJldHVybigyKSA7CQkJLyogQ0ZHX0NBUkRfRU4gYml0IG5vdCBzZXQhICovCisJfQorCisJc21jLT5ody5pcnEgPSBvcHRfaW50c1soaW5wKEMxX0EoMCkpICYgQ0ZHX0lSUV9TRUwpXSA7CisJc21jLT5ody5kbWEgPSBvcHRfZG1hc1soKGlucChDMV9BKDApKSAmIENGR19EUlFfU0VMKT4+MyldIDsKKworCWlmICgoaSA9IGlucChDMl9BKDApKSAmIENGR19FUFJPTV9TRUwpICE9IDB4MGYpCisJCXNtYy0+aHcuZXByb20gPSBvcHRfZXByb21zW2ldIDsKKwllbHNlCisJCXNtYy0+aHcuZXByb20gPSAwIDsKKworCXNtYy0+aHcuRG1hV3JpdGVFeHRyYUJ5dGVzID0gOCA7CisKKwlyZXR1cm4oMSkgOworfQorI2VuZGlmCS8qIEVJU0EgKi8KKworI2lmZGVmCUlTQQorI2lmbmRlZiBNVUxUX09FTQorY29uc3QgdV9jaGFyIHNrbG9nb1s2XSA9IFNLTE9HT19TVFIgOworI2RlZmluZQlTSVpFX1NLTE9HTyhzbWMpCXNpemVvZihza2xvZ28pCisjZGVmaW5lCVNLTE9HTyhzbWMsaSkJCXNrbG9nb1tpXQorI2Vsc2UJLyogTVVMVF9PRU0gKi8KKyNkZWZpbmUJU0laRV9TS0xPR08oc21jKQlzbWMtPmh3Lm9lbV9pZC0+b2lfbG9nb19sZW4KKyNkZWZpbmUJU0tMT0dPKHNtYyxpKQkJc21jLT5ody5vZW1faWQtPm9pX2xvZ29baV0KKyNlbmRpZgkvKiBNVUxUX09FTSAqLworCisKK2ludCBleGlzdF9ib2FyZChzdHJ1Y3Qgc19zbWMgKnNtYywgSFdfUFRSIHBvcnQpCit7CisJaW50CWkgOworI2lmZGVmIE1VTFRfT0VNCisJaW50CWJ5dGVzX3JlYWQgOworCXVfY2hhcglib2FyZF9sb2dvWzE1XSA7CisJU0tfTE9DX0RFQ0wodV9jaGFyLGlkWzRdKSA7CisjZW5kaWYJLyogTVVMVF9PRU0gKi8KKworCS8qIE5vIGxvbmdlciB2YWxpZC4gKi8KKwlpZiAoc21jID09IE5VTEwpCisJCXJldHVybigwKTsKKworCVNLX1VOVVNFRChzbWMpIDsKKyNpZm5kZWYgTVVMVF9PRU0KKwlmb3IgKGkgPSBTQUREUkwgOyBpIDwgKHNpZ25lZCkgKFNBRERSTCtTSVpFX1NLTE9HTyhzbWMpKSA7IGkrKykgeworCQlpZiAoKHVfY2hhcilpbnB3KChQUkEoaSkrcG9ydCkpICE9IFNLTE9HTyhzbWMsaS1TQUREUkwpKSB7CisJCQlyZXR1cm4oMCkgOworCQl9CisJfQorCisJLyogY2hlY2sgTUFDIGFkZHJlc3MgKFMmSyBvciBvdGhlcikgKi8KKwlmb3IgKGkgPSAwIDsgaSA8IDMgOyBpKyspIHsKKwkJaWYgKCh1X2NoYXIpaW5wdygoUFJBKGkpK3BvcnQpKSAhPSBPRU1JRChzbWMsaSkpCisJCQlyZXR1cm4oMCkgOworCX0KKwlyZXR1cm4oMSkgOworI2Vsc2UJLyogTVVMVF9PRU0gKi8KKyAgICAgICAgc21jLT5ody5vZW1faWQgPSAoc3RydWN0IHNfb2VtX2lkcyAqKSAgJm9lbV9pZHNbMF0gOworCWJvYXJkX2xvZ29bMF0gPSAodV9jaGFyKWlucHcoKFBSQShTQUREUkwpK3BvcnQpKSA7CisJYnl0ZXNfcmVhZCA9IDEgOworCisJZm9yICg7IHNtYy0+aHcub2VtX2lkLT5vaV9zdGF0dXMgIT0gT0lfU1RBVF9MQVNUOyBzbWMtPmh3Lm9lbV9pZCsrKSB7CisJCWlmIChzbWMtPmh3Lm9lbV9pZC0+b2lfc3RhdHVzIDwgc21jLT5ody5vZW1fbWluX3N0YXR1cykKKwkJCWNvbnRpbnVlIDsKKworCQkvKiBUZXN0IGFsbCByZWFkIGJ5dGVzIHdpdGggY3VycmVudCBPRU1fZW50cnkgKi8KKwkJLyogZm9yIChpPTA7IChpPGJ5dGVzX3JlYWQpICYmIChpIDwgU0laRV9TS0xPR08oc21jKSk7IGkrKykgeyAqLworCQlmb3IgKGkgPSAwOyBpIDwgYnl0ZXNfcmVhZDsgaSsrKSB7CisJCQlpZiAoYm9hcmRfbG9nb1tpXSAhPSBTS0xPR08oc21jLGkpKQorCQkJCWJyZWFrIDsKKwkJfQorCisJCS8qIElmIG1pc21hdGNoLCBzd2l0Y2ggdG8gbmV4dCBPRU0gZW50cnkgKi8KKwkJaWYgKChib2FyZF9sb2dvW2ldICE9IFNLTE9HTyhzbWMsaSkpICYmIChpIDwgYnl0ZXNfcmVhZCkpCisJCQljb250aW51ZSA7CisKKwkJLS1pIDsKKwkJd2hpbGUgKGJ5dGVzX3JlYWQgPCBTSVpFX1NLTE9HTyhzbWMpKSB7CisJCQkvLyAgIGlucHcgbmV4dCBieXRlIFNLX0xvZ28KKwkJCWkrKyA7CisJCQlib2FyZF9sb2dvW2ldID0gKHVfY2hhcilpbnB3KChQUkEoU0FERFJMK2kpK3BvcnQpKSA7CisJCQlieXRlc19yZWFkKysgOworCQkJaWYgKGJvYXJkX2xvZ29baV0gIT0gU0tMT0dPKHNtYyxpKSkKKwkJCQlicmVhayA7CisJCX0KKworCQlmb3IgKGkgPSAwIDsgaSA8IDMgOyBpKyspCisJCQlpZFtpXSA9ICh1X2NoYXIpaW5wdygoUFJBKGkpK3BvcnQpKSA7CisKKwkJaWYgKChib2FyZF9sb2dvW2ldID09IFNLTE9HTyhzbWMsaSkpCisJCQkmJiAoYnl0ZXNfcmVhZCA9PSBTSVpFX1NLTE9HTyhzbWMpKSkgeworCisJCQlpZiAoaXNfZXF1YWxfbnVtKCZpZFswXSwmT0VNSUQoc21jLDApLDMpKQorCQkJCXJldHVybigxKTsKKwkJfQorCX0JLyogZm9yICovCisJcmV0dXJuKDApIDsKKyNlbmRpZgkvKiBNVUxUX09FTSAqLworfQorCitpbnQgZ2V0X2JvYXJkX3BhcmEoc3RydWN0IHNfc21jICpzbWMsIGludCBzbG90KQoreworCVNLX1VOVVNFRChzbWMpIDsKKwlTS19VTlVTRUQoc2xvdCkgOworCXJldHVybigwKSA7CS8qIGZvciBJU0Egbm90IHN1cHBvcnRlZCAqLworfQorI2VuZGlmCS8qIElTQSAqLworCisjaWZkZWYgUENJCisjaWZkZWYgVVNFX0JJT1NfRlVOCitpbnQgZXhpc3RfYm9hcmQoc3RydWN0IHNfc21jICpzbWMsIGludCBzbG90KQoreworCXVfc2hvcnQgZGV2X2lkIDsKKwl1X3Nob3J0IHZlbl9pZCA7CisJaW50IGZvdW5kIDsgCisJaW50IGkgOworCisJZm91bmQgPSBGQUxTRSA7CQkvKiBtYWtlIHN1cmUgd2UgcmV0dXJuZWQgd2l0aCBhZGF0cGVyIG5vdCBmb3VuZCovCisJCQkJLyogaWYgYW4gZW1wdHkgb2VtaWRzLmggd2FzIGluY2x1ZGVkICovCisKKyNpZmRlZiBNVUxUX09FTQorICAgICAgICBzbWMtPmh3Lm9lbV9pZCA9IChzdHJ1Y3Qgc19vZW1faWRzICopICZvZW1faWRzWzBdIDsKKwlmb3IgKDsgc21jLT5ody5vZW1faWQtPm9pX3N0YXR1cyAhPSBPSV9TVEFUX0xBU1Q7IHNtYy0+aHcub2VtX2lkKyspIHsKKwkJaWYgKHNtYy0+aHcub2VtX2lkLT5vaV9zdGF0dXMgPCBzbWMtPmh3Lm9lbV9taW5fc3RhdHVzKQorCQkJY29udGludWUgOworI2VuZGlmCisJCXZlbl9pZCA9IE9FTUlEKHNtYywwKSArIChPRU1JRChzbWMsMSkgPDwgOCkgOyAKKwkJZGV2X2lkID0gT0VNSUQoc21jLDIpICsgKE9FTUlEKHNtYywzKSA8PCA4KSA7IAorCQlmb3IgKGkgPSAwOyBpIDwgc2xvdDsgaSsrKSB7CisJCQlpZiAocGNpX2ZpbmRfZGV2aWNlKGksJnNtYy0+aHcucGNpX2hhbmRsZSwKKwkJCQlkZXZfaWQsdmVuX2lkKSAhPSAwKSB7CisKKwkJCQlmb3VuZCA9IEZBTFNFIDsKKwkJCX0gZWxzZSB7CisJCQkJZm91bmQgPSBUUlVFIDsKKwkJCX0KKwkJfQorCQlpZiAoZm91bmQpIHsKKwkJCXJldHVybigxKSA7CS8qIGFkYXB0ZXIgd2FzIGZvdW5kICovCisJCX0KKyNpZmRlZiBNVUxUX09FTQorCX0KKyNlbmRpZgorCXJldHVybigwKSA7CS8qIGFkYXB0ZXIgd2FzIG5vdCBmb3VuZCAqLworfQorI2VuZGlmCS8qIFBDSSAqLworI2VuZGlmCS8qIFVTRV9CSU9TX0ZVTkMgKi8KKwordm9pZCBkcml2ZXJfZ2V0X2JpYShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IGZkZGlfYWRkciAqYmlhX2FkZHIpCit7CisJaW50IGkgOworCisJZXh0ZXJuIGNvbnN0IHVfY2hhciBjYW5vbmljYWxbMjU2XSA7CisKKwlmb3IgKGkgPSAwIDsgaSA8IDYgOyBpKyspIHsKKwkJYmlhX2FkZHItPmFbaV0gPSBjYW5vbmljYWxbc21jLT5ody5mZGRpX3BoeXNfYWRkci5hW2ldXSA7CisJfQorfQorCit2b2lkIHNtdF9zdGFydF93YXRjaGRvZyhzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlTS19VTlVTRUQoc21jKSA7CS8qIE1ha2UgTElOVCBoYXBweS4gKi8KKworI2lmbmRlZglERUJVRworCisjaWZkZWYJUENJCisJaWYgKHNtYy0+aHcud2RvZ191c2VkKSB7CisJCW91dHB3KEFERFIoQjJfV0RPR19DUlRMKSxUSU1fU1RBUlQpIDsJLyogU3RhcnQgdGltZXIuICovCisJfQorI2VuZGlmCisKKyNlbmRpZgkvKiBERUJVRyAqLworfQorCit2b2lkIHNtdF9zdG9wX3dhdGNoZG9nKHN0cnVjdCBzX3NtYyAqc21jKQoreworCVNLX1VOVVNFRChzbWMpIDsJLyogTWFrZSBMSU5UIGhhcHB5LiAqLworI2lmbmRlZglERUJVRworCisjaWZkZWYJUENJCisJaWYgKHNtYy0+aHcud2RvZ191c2VkKSB7CisJCW91dHB3KEFERFIoQjJfV0RPR19DUlRMKSxUSU1fU1RPUCkgOwkvKiBTdG9wIHRpbWVyLiAqLworCX0KKyNlbmRpZgorCisjZW5kaWYJLyogREVCVUcgKi8KK30KKworI2lmZGVmCVBDSQorc3RhdGljIGNoYXIgZ2V0X3JvbV9ieXRlKHN0cnVjdCBzX3NtYyAqc21jLCB1X3Nob3J0IGFkZHIpCit7CisJR0VUX1BBR0UoYWRkcikgOworCXJldHVybiAoUkVBRF9QUk9NKEFERFIoQjJfRkRQKSkpIDsKK30KKworLyoKKyAqIFJPTSBpbWFnZSBkZWZpbmVzCisgKi8KKyNkZWZpbmUJUk9NX1NJR18xCTAKKyNkZWZpbmUgUk9NX1NJR18yCTEKKyNkZWZpbmUgUENJX0RBVEFfMQkweDE4CisjZGVmaW5lIFBDSV9EQVRBXzIJMHgxOQorCisvKgorICogUENJIGRhdGEgc3RydWN0dXJlIGRlZmluZXMKKyAqLworI2RlZmluZQlWUERfREFUQV8xCTB4MDgKKyNkZWZpbmUJVlBEX0RBVEFfMgkweDA5CisjZGVmaW5lIElNQUdFX0xFTl8xCTB4MTAKKyNkZWZpbmUgSU1BR0VfTEVOXzIJMHgxMQorI2RlZmluZQlDT0RFX1RZUEUJMHgxNAorI2RlZmluZQlJTkRJQ0FUT1IJMHgxNQorCisvKgorICoJQkVHSU5fTUFOVUFMX0VOVFJZKG1hY19kcnZfdnBkX3JlYWQpCisgKgltYWNfZHJ2X3ZwZF9yZWFkKHNtYyxidWYsc2l6ZSxpbWFnZSkKKyAqCisgKiBmdW5jdGlvbglET1dOQ0FMTAkoRkRESVdBUkUpCisgKgkJcmVhZHMgdGhlIFZQRCBkYXRhIG9mIHRoZSBGUFJPTSBhbmQgd3JpdGVzIGl0IGludG8gdGhlCisgKgkJYnVmZmVyCisgKgorICogcGFyYQlidWYJcG9pbnRzIHRvIHRoZSBidWZmZXIgZm9yIHRoZSBWUEQgZGF0YQorICoJc2l6ZQlzaXplIG9mIHRoZSBWUEQgZGF0YSBidWZmZXIKKyAqCWltYWdlCWJvb3QgaW1hZ2U7IGNvZGUgdHlwZSBvZiB0aGUgYm9vdCBpbWFnZQorICoJCWltYWdlID0gMAlJbnRlbCB4ODYsIFBDLUFUIGNvbXBhdGlibGUKKyAqCQkJMQlPUEVOQk9PVCBzdGFuZGFyZCBmb3IgUENJCisgKgkJCTItRkYJcmVzZXJ2ZWQKKyAqCisgKiByZXR1cm5zCWxlbgludW1iZXIgb2YgVlBEIGRhdGEgYnl0ZXMgcmVhZCBmb3JtIHRoZSBGUFJPTQorICoJCTwwCW51bWJlciBvZiByZWFkIGJ5dGVzCisgKgkJPjAJZXJyb3I6IGRhdGEgaW52YWxpZAorICoKKyAqCUVORF9NQU5VQUxfRU5UUlkKKyAqLworaW50IG1hY19kcnZfdnBkX3JlYWQoc3RydWN0IHNfc21jICpzbWMsIGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNoYXIgaW1hZ2UpCit7CisJdV9zaG9ydAlpYmFzZSA7CisJdV9zaG9ydCBwY2lfYmFzZSA7CisJdV9zaG9ydCB2cGQgOworCWludAlsZW4gOworCisJbGVuID0gMCA7CisJaWJhc2UgPSAwIDsKKwkvKgorCSAqIGFzIGxvbmcgaW1hZ2VzIGRlZmluZWQKKwkgKi8KKwl3aGlsZSAoZ2V0X3JvbV9ieXRlKHNtYyxpYmFzZStST01fU0lHXzEpID09IDB4NTUgJiYKKwkJKHVfY2hhcikgZ2V0X3JvbV9ieXRlKHNtYyxpYmFzZStST01fU0lHXzIpID09IDB4YWEpIHsKKwkJLyoKKwkJICogZ2V0IHRoZSBwb2ludGVyIHRvIHRoZSBQQ0kgZGF0YSBzdHJ1Y3R1cmUKKwkJICovCisJCXBjaV9iYXNlID0gaWJhc2UgKyBnZXRfcm9tX2J5dGUoc21jLGliYXNlK1BDSV9EQVRBXzEpICsKKwkJCQkoZ2V0X3JvbV9ieXRlKHNtYyxpYmFzZStQQ0lfREFUQV8yKSA8PCA4KSA7CisKKwkJaWYgKGltYWdlID09IGdldF9yb21fYnl0ZShzbWMscGNpX2Jhc2UrQ09ERV9UWVBFKSkgeworCQkJLyoKKwkJCSAqIHdlIGhhdmUgdGhlIHJpZ2h0IGltYWdlLCByZWFkIHRoZSBWUEQgZGF0YQorCQkJICovCisJCQl2cGQgPSBpYmFzZSArIGdldF9yb21fYnl0ZShzbWMscGNpX2Jhc2UrVlBEX0RBVEFfMSkgKworCQkJCShnZXRfcm9tX2J5dGUoc21jLHBjaV9iYXNlK1ZQRF9EQVRBXzIpIDw8IDgpIDsKKwkJCWlmICh2cGQgPT0gaWJhc2UpIHsKKwkJCQlicmVhayA7CQkvKiBubyBWUEQgZGF0YSAqLworCQkJfQorCQkJZm9yIChsZW4gPSAwOyBsZW4gPCBzaXplOyBsZW4rKyxidWYrKyx2cGQrKykgeworCQkJCSpidWYgPSBnZXRfcm9tX2J5dGUoc21jLHZwZCkgOworCQkJfQorCQkJYnJlYWsgOworCQl9CisJCWVsc2UgeworCQkJLyoKKwkJCSAqIHRyeSB0aGUgbmV4dCBpbWFnZQorCQkJICovCisJCQlpZiAoZ2V0X3JvbV9ieXRlKHNtYyxwY2lfYmFzZStJTkRJQ0FUT1IpICYgMHg4MCkgeworCQkJCWJyZWFrIDsJCS8qIHRoaXMgd2FzIHRoZSBsYXN0IGltYWdlICovCisJCQl9CisJCQlpYmFzZSA9IGliYXNlICsgZ2V0X3JvbV9ieXRlKHNtYyxpYmFzZStJTUFHRV9MRU5fMSkgKworCQkJCShnZXRfcm9tX2J5dGUoc21jLGliYXNlK0lNQUdFX0xFTl8yKSA8PCA4KSA7CisJCX0KKwl9CisKKwlyZXR1cm4obGVuKSA7Cit9CisKK3ZvaWQgbWFjX2Rydl9wY2lfZml4KHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgZml4X3ZhbHVlKQoreworCXNtYy0+aHcucGNpX2ZpeF92YWx1ZSA9IGZpeF92YWx1ZSA7Cit9CisKK3ZvaWQgbWFjX2RvX3BjaV9maXgoc3RydWN0IHNfc21jICpzbWMpCit7CisJU0tfVU5VU0VEKHNtYykgOworfQorI2VuZGlmCS8qIFBDSSAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2VjbS5jIGIvZHJpdmVycy9uZXQvc2tmcC9lY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2Q5MjJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9lY20uYwpAQCAtMCwwICsxLDUzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVNlZSB0aGUgZmlsZSAic2tmZGRpLmMiIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKwlTTVQgRUNNCisJRW50aXR5IENvb3JkaW5hdGlvbiBNYW5hZ2VtZW50CisJSGFyZHdhcmUgaW5kZXBlbmRlbnQgc3RhdGUgbWFjaGluZQorKi8KKworLyoKKyAqIEhhcmR3YXJlIGluZGVwZW5kZW50IHN0YXRlIG1hY2hpbmUgaW1wbGVtYW50YXRpb24KKyAqIFRoZSBmb2xsb3dpbmcgZXh0ZXJuYWwgU01UIGZ1bmN0aW9ucyBhcmUgcmVmZXJlbmNlZCA6CisgKgorICogCQlxdWV1ZV9ldmVudCgpCisgKiAJCXNtdF90aW1lcl9zdGFydCgpCisgKiAJCXNtdF90aW1lcl9zdG9wKCkKKyAqCisgKiAJVGhlIGZvbGxvd2luZyBleHRlcm5hbCBIVyBkZXBlbmRlbnQgZnVuY3Rpb25zIGFyZSByZWZlcmVuY2VkIDoKKyAqIAkJc21fcG1fYnlwYXNzX3JlcSgpCisgKiAJCXNtX3BtX2xzX2xhdGNoKCkKKyAqIAkJc21fcG1fZ2V0X2xzKCkKKyAqIAorICogCVRoZSBmb2xsb3dpbmcgSFcgZGVwZW5kZW50IGV2ZW50cyBhcmUgcmVxdWlyZWQgOgorICoJCU5PTkUKKyAqCisgKi8KKworI2luY2x1ZGUgImgvdHlwZXMuaCIKKyNpbmNsdWRlICJoL2ZkZGkuaCIKKyNpbmNsdWRlICJoL3NtYy5oIgorCisjZGVmaW5lIEtFUk5FTAorI2luY2x1ZGUgImgvc210c3RhdGUuaCIKKworI2lmbmRlZglsaW50CitzdGF0aWMgY29uc3QgY2hhciBJRF9zY2NzW10gPSAiQCgjKWVjbS5jCTIuNyA5OS8wOC8wNSAoQykgU0sgIiA7CisjZW5kaWYKKworLyoKKyAqIEZTTSBNYWNyb3MKKyAqLworI2RlZmluZSBBRkxBRwkweDEwCisjZGVmaW5lIEdPX1NUQVRFKHgpCShzbWMtPm1pYi5mZGRpU01URUNNU3RhdGUgPSAoeCl8QUZMQUcpCisjZGVmaW5lIEFDVElPTlNfRE9ORSgpCShzbWMtPm1pYi5mZGRpU01URUNNU3RhdGUgJj0gfkFGTEFHKQorI2RlZmluZSBBQ1RJT05TKHgpCSh4fEFGTEFHKQorCisjZGVmaW5lIEVDMF9PVVQJCTAJCQkvKiBub3QgaW5zZXJ0ZWQgKi8KKyNkZWZpbmUgRUMxX0lOCQkxCQkJLyogaW5zZXJ0ZWQgKi8KKyNkZWZpbmUgRUMyX1RSQUNFCTIJCQkvKiB0cmFjaW5nICovCisjZGVmaW5lIEVDM19MRUFWRQkzCQkJLyogbGVhdmluZyB0aGUgcmluZyAqLworI2RlZmluZSBFQzRfUEFUSF9URVNUCTQJCQkvKiBwZXJmb3JtaW5nIHBhdGggdGVzdCAqLworI2RlZmluZSBFQzVfSU5TRVJUCTUJCQkvKiBieXBhc3MgYmVpbmcgdHVybmVkIG9uICovCisjZGVmaW5lIEVDNl9DSEVDSwk2CQkJLyogY2hlY2tpbmcgYnlwYXNzICovCisjZGVmaW5lIEVDN19ERUlOU0VSVAk3CQkJLyogYnlwYXNzIGJlaW5nIHR1cm5kZSBvZmYgKi8KKworI2lmZGVmCURFQlVHCisvKgorICogc3ltYm9saWMgc3RhdGUgbmFtZXMKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBlY21fc3RhdGVzW10gPSB7CisJIkVDMF9PVVQiLCJFQzFfSU4iLCJFQzJfVFJBQ0UiLCJFQzNfTEVBVkUiLCJFQzRfUEFUSF9URVNUIiwKKwkiRUM1X0lOU0VSVCIsIkVDNl9DSEVDSyIsIkVDN19ERUlOU0VSVCIKK30gOworCisvKgorICogc3ltYm9saWMgZXZlbnQgbmFtZXMKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBlY21fZXZlbnRzW10gPSB7CisJIk5PTkUiLCJFQ19DT05ORUNUIiwiRUNfRElTQ09OTkVDVCIsIkVDX1RSQUNFX1BST1AiLCJFQ19QQVRIX1RFU1QiLAorCSJFQ19USU1FT1VUX1REIiwiRUNfVElNRU9VVF9UTUFYIiwKKwkiRUNfVElNRU9VVF9JTUFYIiwiRUNfVElNRU9VVF9JTk1BWCIsIkVDX1RFU1RfRE9ORSIKK30gOworI2VuZGlmCisKKy8qCisgKiBhbGwgR2xvYmFscyAgYXJlIGRlZmluZWQgaW4gc21jLmgKKyAqIHN0cnVjdCBzX2VjbQorICovCisKKy8qCisgKiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAqLworCitzdGF0aWMgdm9pZCBlY21fZnNtKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgY21kKTsKK3N0YXRpYyB2b2lkIHN0YXJ0X2VjbV90aW1lcihzdHJ1Y3Qgc19zbWMgKnNtYywgdV9sb25nIHZhbHVlLCBpbnQgZXZlbnQpOworc3RhdGljIHZvaWQgc3RvcF9lY21fdGltZXIoc3RydWN0IHNfc21jICpzbWMpOworc3RhdGljIHZvaWQgcHJvcF9hY3Rpb25zKHN0cnVjdCBzX3NtYyAqc21jKTsKKworLyoKKwlpbml0IEVDTSBzdGF0ZSBtYWNoaW5lCisJY2xlYXIgYWxsIEVDTSB2YXJzIGFuZCBmbGFncworKi8KK3ZvaWQgZWNtX2luaXQoc3RydWN0IHNfc21jICpzbWMpCit7CisJc21jLT5lLnBhdGhfdGVzdCA9IFBUX1BBU1NFRCA7CisJc21jLT5lLnRyYWNlX3Byb3AgPSAwIDsKKwlzbWMtPmUuc2JfZmxhZyA9IDAgOworCXNtYy0+bWliLmZkZGlTTVRFQ01TdGF0ZSA9IEFDVElPTlMoRUMwX09VVCkgOworCXNtYy0+ZS5lY21fbGluZV9zdGF0ZSA9IEZBTFNFIDsKK30KKworLyoKKwlFQ00gc3RhdGUgbWFjaGluZQorCWNhbGxlZCBieSBkaXNwYXRjaGVyCisKKwlkbworCQlkaXNwbGF5IHN0YXRlIGNoYW5nZQorCQlwcm9jZXNzIGV2ZW50CisJdW50aWwgU00gaXMgc3RhYmxlCisqLwordm9pZCBlY20oc3RydWN0IHNfc21jICpzbWMsIGludCBldmVudCkKK3sKKwlpbnQJc3RhdGUgOworCisJZG8geworCQlEQl9FQ00oIkVDTSA6IHN0YXRlICVzJXMiLAorCQkJKHNtYy0+bWliLmZkZGlTTVRFQ01TdGF0ZSAmIEFGTEFHKSA/ICJBQ1RJT05TICIgOiAiIiwKKwkJCWVjbV9zdGF0ZXNbc21jLT5taWIuZmRkaVNNVEVDTVN0YXRlICYgfkFGTEFHXSkgOworCQlEQl9FQ00oIiBldmVudCAlc1xuIixlY21fZXZlbnRzW2V2ZW50XSwwKSA7CisJCXN0YXRlID0gc21jLT5taWIuZmRkaVNNVEVDTVN0YXRlIDsKKwkJZWNtX2ZzbShzbWMsZXZlbnQpIDsKKwkJZXZlbnQgPSAwIDsKKwl9IHdoaWxlIChzdGF0ZSAhPSBzbWMtPm1pYi5mZGRpU01URUNNU3RhdGUpIDsKKwllY21fc3RhdGVfY2hhbmdlKHNtYywoaW50KXNtYy0+bWliLmZkZGlTTVRFQ01TdGF0ZSkgOworfQorCisvKgorCXByb2Nlc3MgRUNNIGV2ZW50CisqLworc3RhdGljIHZvaWQgZWNtX2ZzbShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGNtZCkKK3sKKwlpbnQgbHNfYSA7CQkJLyogY3VycmVudCBsaW5lIHN0YXRlIFBIWSBBICovCisJaW50IGxzX2IgOwkJCS8qIGN1cnJlbnQgbGluZSBzdGF0ZSBQSFkgQiAqLworCWludAlwIDsJCQkvKiBwb3J0cyAqLworCisKKwlzbWMtPm1pYi5mZGRpU01UQnlwYXNzUHJlc2VudCA9IHNtX3BtX2J5cGFzc19wcmVzZW50KHNtYykgOworCWlmIChjbWQgPT0gRUNfQ09OTkVDVCkKKwkJc21jLT5taWIuZmRkaVNNVFJlbW90ZURpc2Nvbm5lY3RGbGFnID0gRkFMU0UgOworCisJLyogRm9yIEFJWCBldmVudCBub3RpZmljYXRpb246ICovCisJLyogSXMgYSBkaXNjb25uZWN0ICBjb21tYW5kIHJlbW90ZWx5IGlzc3VlZCA/ICovCisJaWYgKGNtZCA9PSBFQ19ESVNDT05ORUNUICYmCisJCXNtYy0+bWliLmZkZGlTTVRSZW1vdGVEaXNjb25uZWN0RmxhZyA9PSBUUlVFKQorCQlBSVhfRVZFTlQgKHNtYywgKHVfbG9uZykgQ0lPX0hBUkRfRkFJTCwgKHVfbG9uZykKKwkJCUZERElfUkVNT1RFX0RJU0NPTk5FQ1QsIHNtdF9nZXRfZXZlbnRfd29yZChzbWMpLAorCQkJc210X2dldF9lcnJvcl93b3JkKHNtYykgKTsKKworCS8qamQgMDUtQXVnLTE5OTkgQnVnICMxMDQxOSAiUG9ydCBEaXNjb25uZWN0IGZhaWxzIGF0IER1cCBNQWMgQ29uZC4iKi8KKwlpZiAoY21kID09IEVDX0NPTk5FQ1QpIHsKKwkJc21jLT5lLkRpc2Nvbm5lY3RGbGFnID0gRkFMU0UgOworCX0KKwllbHNlIGlmIChjbWQgPT0gRUNfRElTQ09OTkVDVCkgeworCQlzbWMtPmUuRGlzY29ubmVjdEZsYWcgPSBUUlVFIDsKKwl9CisJCisJc3dpdGNoKHNtYy0+bWliLmZkZGlTTVRFQ01TdGF0ZSkgeworCWNhc2UgQUNUSU9OUyhFQzBfT1VUKSA6CisJCS8qCisJCSAqIFdlIGRvIG5vdCBwZXJmb3JtIGEgcGF0aCB0ZXN0CisJCSAqLworCQlzbWMtPmUucGF0aF90ZXN0ID0gUFRfUEFTU0VEIDsKKwkJc21jLT5lLmVjbV9saW5lX3N0YXRlID0gRkFMU0UgOworCQlzdG9wX2VjbV90aW1lcihzbWMpIDsKKwkJQUNUSU9OU19ET05FKCkgOworCQlicmVhayA7CisJY2FzZSBFQzBfT1VUOgorCQkvKkVDMDEqLworCQlpZiAoY21kID09IEVDX0NPTk5FQ1QgJiYgIXNtYy0+bWliLmZkZGlTTVRCeXBhc3NQcmVzZW50CisJCQkmJiBzbWMtPmUucGF0aF90ZXN0PT1QVF9QQVNTRUQpIHsKKwkJCUdPX1NUQVRFKEVDMV9JTikgOworCQkJYnJlYWsgOworCQl9CisJCS8qRUMwNSovCisJCWVsc2UgaWYgKGNtZCA9PSBFQ19DT05ORUNUICYmIChzbWMtPmUucGF0aF90ZXN0PT1QVF9QQVNTRUQpICYmCisJCQlzbWMtPm1pYi5mZGRpU01UQnlwYXNzUHJlc2VudCAmJgorCQkJKHNtYy0+cy5zYXMgPT0gU01UX0RBUykpIHsKKwkJCUdPX1NUQVRFKEVDNV9JTlNFUlQpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQlicmVhazsKKwljYXNlIEFDVElPTlMoRUMxX0lOKSA6CisJCXN0b3BfZWNtX3RpbWVyKHNtYykgOworCQlzbWMtPmUudHJhY2VfcHJvcCA9IDAgOworCQlzbV9tYV9jb250cm9sKHNtYyxNQV9UUkVRKSA7CisJCWZvciAocCA9IDAgOyBwIDwgTlVNUEhZUyA7IHArKykKKwkJCWlmIChzbWMtPm1pYi5wW3BdLmZkZGlQT1JUSGFyZHdhcmVQcmVzZW50KQorCQkJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9QQ01BK3AsUENfU1RBUlQpIDsKKwkJQUNUSU9OU19ET05FKCkgOworCQlicmVhayA7CisJY2FzZSBFQzFfSU46CisJCS8qRUMxMiovCisJCWlmIChjbWQgPT0gRUNfVFJBQ0VfUFJPUCkgeworCQkJcHJvcF9hY3Rpb25zKHNtYykgOworCQkJR09fU1RBVEUoRUMyX1RSQUNFKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypFQzEzKi8KKwkJZWxzZSBpZiAoY21kID09IEVDX0RJU0NPTk5FQ1QpIHsKKwkJCUdPX1NUQVRFKEVDM19MRUFWRSkgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrOworCWNhc2UgQUNUSU9OUyhFQzJfVFJBQ0UpIDoKKwkJc3RhcnRfZWNtX3RpbWVyKHNtYyxNSUIyVVMoc21jLT5taWIuZmRkaVNNVFRyYWNlX01heEV4cGlyYXRpb24pLAorCQkJRUNfVElNRU9VVF9UTUFYKSA7CisJCUFDVElPTlNfRE9ORSgpIDsKKwkJYnJlYWsgOworCWNhc2UgRUMyX1RSQUNFIDoKKwkJLypFQzIyKi8KKwkJaWYgKGNtZCA9PSBFQ19UUkFDRV9QUk9QKSB7CisJCQlwcm9wX2FjdGlvbnMoc21jKSA7CisJCQlHT19TVEFURShFQzJfVFJBQ0UpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKkVDMjNhKi8KKwkJZWxzZSBpZiAoY21kID09IEVDX0RJU0NPTk5FQ1QpIHsKKwkJCXNtYy0+ZS5wYXRoX3Rlc3QgPSBQVF9FWElUSU5HIDsKKwkJCUdPX1NUQVRFKEVDM19MRUFWRSkgOworCQkJYnJlYWsgOworCQl9CisJCS8qRUMyM2IqLworCQllbHNlIGlmIChzbWMtPmUucGF0aF90ZXN0ID09IFBUX1BFTkRJTkcpIHsKKwkJCUdPX1NUQVRFKEVDM19MRUFWRSkgOworCQkJYnJlYWsgOworCQl9CisJCS8qRUMyM2MqLworCQllbHNlIGlmIChjbWQgPT0gRUNfVElNRU9VVF9UTUFYKSB7CisJCQkvKiBUcmFjZV9NYXggaXMgZXhwaXJlZCAqLworCQkJLyogLT4gc2VuZCBBSVhfRVZFTlQgKi8KKwkJCUFJWF9FVkVOVChzbWMsICh1X2xvbmcpIEZERElfUklOR19TVEFUVVMsCisJCQkJKHVfbG9uZykgRkRESV9TTVRfRVJST1IsICh1X2xvbmcpCisJCQkJRkRESV9UUkFDRV9NQVgsIHNtdF9nZXRfZXJyb3Jfd29yZChzbWMpKTsKKwkJCXNtYy0+ZS5wYXRoX3Rlc3QgPSBQVF9QRU5ESU5HIDsKKwkJCUdPX1NUQVRFKEVDM19MRUFWRSkgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIEFDVElPTlMoRUMzX0xFQVZFKSA6CisJCXN0YXJ0X2VjbV90aW1lcihzbWMsc21jLT5zLmVjbV90ZF9taW4sRUNfVElNRU9VVF9URCkgOworCQlmb3IgKHAgPSAwIDsgcCA8IE5VTVBIWVMgOyBwKyspCisJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUENNQStwLFBDX1NUT1ApIDsKKwkJQUNUSU9OU19ET05FKCkgOworCQlicmVhayA7CisJY2FzZSBFQzNfTEVBVkU6CisJCS8qRUMzMCovCisJCWlmIChjbWQgPT0gRUNfVElNRU9VVF9URCAmJiAhc21jLT5taWIuZmRkaVNNVEJ5cGFzc1ByZXNlbnQgJiYKKwkJCShzbWMtPmUucGF0aF90ZXN0ICE9IFBUX1BFTkRJTkcpKSB7CisJCQlHT19TVEFURShFQzBfT1VUKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypFQzM0Ki8KKwkJZWxzZSBpZiAoY21kID09IEVDX1RJTUVPVVRfVEQgJiYKKwkJCShzbWMtPmUucGF0aF90ZXN0ID09IFBUX1BFTkRJTkcpKSB7CisJCQlHT19TVEFURShFQzRfUEFUSF9URVNUKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypFQzMxKi8KKwkJZWxzZSBpZiAoY21kID09IEVDX0NPTk5FQ1QgJiYgc21jLT5lLnBhdGhfdGVzdCA9PSBQVF9QQVNTRUQpIHsKKwkJCUdPX1NUQVRFKEVDMV9JTikgOworCQkJYnJlYWsgOworCQl9CisJCS8qRUMzMyovCisJCWVsc2UgaWYgKGNtZCA9PSBFQ19ESVNDT05ORUNUICYmCisJCQlzbWMtPmUucGF0aF90ZXN0ID09IFBUX1BFTkRJTkcpIHsKKwkJCXNtYy0+ZS5wYXRoX3Rlc3QgPSBQVF9FWElUSU5HIDsKKwkJCS8qCisJCQkgKiBzdGF5IGluIHN0YXRlIC0gc3RhdGUgd2lsbCBiZSBsZWZ0IHZpYSB0aW1lb3V0CisJCQkgKi8KKwkJfQorCQkvKkVDMzcqLworCQllbHNlIGlmIChjbWQgPT0gRUNfVElNRU9VVF9URCAmJgorCQkJc21jLT5taWIuZmRkaVNNVEJ5cGFzc1ByZXNlbnQgJiYKKwkJCXNtYy0+ZS5wYXRoX3Rlc3QgIT0gUFRfUEVORElORykgeworCQkJR09fU1RBVEUoRUM3X0RFSU5TRVJUKSA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgQUNUSU9OUyhFQzRfUEFUSF9URVNUKSA6CisJCXN0b3BfZWNtX3RpbWVyKHNtYykgOworCQlzbWMtPmUucGF0aF90ZXN0ID0gUFRfVEVTVElORyA7CisJCXN0YXJ0X2VjbV90aW1lcihzbWMsc21jLT5zLmVjbV90ZXN0X2RvbmUsRUNfVEVTVF9ET05FKSA7CisJCS8qIG5vdyBwZXJmb3JtIHBhdGggdGVzdCAuLi4ganVzdCBhIHNpbXVsYXRpb24gKi8KKwkJQUNUSU9OU19ET05FKCkgOworCQlicmVhayA7CisJY2FzZSBFQzRfUEFUSF9URVNUIDoKKwkJLyogcGF0aCB0ZXN0IGRvbmUgZGVsYXkgKi8KKwkJaWYgKGNtZCA9PSBFQ19URVNUX0RPTkUpCisJCQlzbWMtPmUucGF0aF90ZXN0ID0gUFRfUEFTU0VEIDsKKworCQlpZiAoc21jLT5lLnBhdGhfdGVzdCA9PSBQVF9GQUlMRUQpCisJCQlSU19TRVQoc21jLFJTX1BBVEhURVNUKSA7CisKKwkJLypFQzQwYSovCisJCWlmIChzbWMtPmUucGF0aF90ZXN0ID09IFBUX0ZBSUxFRCAmJgorCQkJIXNtYy0+bWliLmZkZGlTTVRCeXBhc3NQcmVzZW50KSB7CisJCQlHT19TVEFURShFQzBfT1VUKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypFQzQwYiovCisJCWVsc2UgaWYgKGNtZCA9PSBFQ19ESVNDT05ORUNUICYmCisJCQkhc21jLT5taWIuZmRkaVNNVEJ5cGFzc1ByZXNlbnQpIHsKKwkJCUdPX1NUQVRFKEVDMF9PVVQpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKkVDNDEqLworCQllbHNlIGlmIChzbWMtPmUucGF0aF90ZXN0ID09IFBUX1BBU1NFRCkgeworCQkJR09fU1RBVEUoRUMxX0lOKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypFQzQ3YSovCisJCWVsc2UgaWYgKHNtYy0+ZS5wYXRoX3Rlc3QgPT0gUFRfRkFJTEVEICYmCisJCQlzbWMtPm1pYi5mZGRpU01UQnlwYXNzUHJlc2VudCkgeworCQkJR09fU1RBVEUoRUM3X0RFSU5TRVJUKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypFQzQ3YiovCisJCWVsc2UgaWYgKGNtZCA9PSBFQ19ESVNDT05ORUNUICYmCisJCQlzbWMtPm1pYi5mZGRpU01UQnlwYXNzUHJlc2VudCkgeworCQkJR09fU1RBVEUoRUM3X0RFSU5TRVJUKSA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgQUNUSU9OUyhFQzVfSU5TRVJUKSA6CisJCXNtX3BtX2J5cGFzc19yZXEoc21jLEJQX0lOU0VSVCk7CisJCXN0YXJ0X2VjbV90aW1lcihzbWMsc21jLT5zLmVjbV9pbl9tYXgsRUNfVElNRU9VVF9JTk1BWCkgOworCQlBQ1RJT05TX0RPTkUoKSA7CisJCWJyZWFrIDsKKwljYXNlIEVDNV9JTlNFUlQgOgorCQkvKkVDNTYqLworCQlpZiAoY21kID09IEVDX1RJTUVPVVRfSU5NQVgpIHsKKwkJCUdPX1NUQVRFKEVDNl9DSEVDSykgOworCQkJYnJlYWsgOworCQl9CisJCS8qRUM1NyovCisJCWVsc2UgaWYgKGNtZCA9PSBFQ19ESVNDT05ORUNUKSB7CisJCQlHT19TVEFURShFQzdfREVJTlNFUlQpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQlicmVhayA7CisJY2FzZSBBQ1RJT05TKEVDNl9DSEVDSykgOgorCQkvKgorCQkgKiBpbiBFQzZfQ0hFQ0ssIHdlICpQT0xMKiB0aGUgbGluZSBzdGF0ZSAhCisJCSAqIGNoZWNrIHdoZXRoZXIgYm90aCBieXBhc3Mgc3dpdGNoZXMgaGF2ZSBzd2l0Y2hlZC4KKwkJICovCisJCXN0YXJ0X2VjbV90aW1lcihzbWMsc21jLT5zLmVjbV9jaGVja19wb2xsLDApIDsKKwkJc21jLT5lLmVjbV9saW5lX3N0YXRlID0gVFJVRSA7CS8qIGZsYWcgdG8gcGNtOiByZXBvcnQgUS9ITFMgKi8KKwkJKHZvaWQpIHNtX3BtX2xzX2xhdGNoKHNtYyxQQSwxKSA7IC8qIGVuYWJsZSBsaW5lIHN0YXRlIGxhdGNoICovCisJCSh2b2lkKSBzbV9wbV9sc19sYXRjaChzbWMsUEIsMSkgOyAvKiBlbmFibGUgbGluZSBzdGF0ZSBsYXRjaCAqLworCQlBQ1RJT05TX0RPTkUoKSA7CisJCWJyZWFrIDsKKwljYXNlIEVDNl9DSEVDSyA6CisJCWxzX2EgPSBzbV9wbV9nZXRfbHMoc21jLFBBKSA7CisJCWxzX2IgPSBzbV9wbV9nZXRfbHMoc21jLFBCKSA7CisKKwkJLypFQzYxKi8KKwkJaWYgKCgobHNfYSA9PSBQQ19RTFMpIHx8IChsc19hID09IFBDX0hMUykpICYmCisJCSAgICAoKGxzX2IgPT0gUENfUUxTKSB8fCAobHNfYiA9PSBQQ19ITFMpKSApIHsKKwkJCXNtYy0+ZS5zYl9mbGFnID0gRkFMU0UgOworCQkJc21jLT5lLmVjbV9saW5lX3N0YXRlID0gRkFMU0UgOworCQkJR09fU1RBVEUoRUMxX0lOKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypFQzY2Ki8KKwkJZWxzZSBpZiAoIXNtYy0+ZS5zYl9mbGFnICYmCisJCQkgKCgobHNfYSA9PSBQQ19JTFMpICYmIChsc19iID09IFBDX1FMUykpIHx8CisJCQkgICgobHNfYSA9PSBQQ19RTFMpICYmIChsc19iID09IFBDX0lMUykpKSl7CisJCQlzbWMtPmUuc2JfZmxhZyA9IFRSVUUgOworCQkJREJfRUNNTigxLCJFQ00gOiBFQzZfQ0hFQ0sgLSBzdHVjayBieXBhc3NcbiIsMCwwKSA7CisJCQlBSVhfRVZFTlQoc21jLCAodV9sb25nKSBGRERJX1JJTkdfU1RBVFVTLCAodV9sb25nKQorCQkJCUZERElfU01UX0VSUk9SLCAodV9sb25nKSBGRERJX0JZUEFTU19TVFVDSywKKwkJCQlzbXRfZ2V0X2Vycm9yX3dvcmQoc21jKSk7CisJCX0KKwkJLypFQzY3Ki8KKwkJZWxzZSBpZiAoY21kID09IEVDX0RJU0NPTk5FQ1QpIHsKKwkJCXNtYy0+ZS5lY21fbGluZV9zdGF0ZSA9IEZBTFNFIDsKKwkJCUdPX1NUQVRFKEVDN19ERUlOU0VSVCkgOworCQkJYnJlYWsgOworCQl9CisJCWVsc2UgeworCQkJLyoKKwkJCSAqIHJlc3RhcnQgcG9sbAorCQkJICovCisJCQlzdGFydF9lY21fdGltZXIoc21jLHNtYy0+cy5lY21fY2hlY2tfcG9sbCwwKSA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgQUNUSU9OUyhFQzdfREVJTlNFUlQpIDoKKwkJc21fcG1fYnlwYXNzX3JlcShzbWMsQlBfREVJTlNFUlQpOworCQlzdGFydF9lY21fdGltZXIoc21jLHNtYy0+cy5lY21faV9tYXgsRUNfVElNRU9VVF9JTUFYKSA7CisJCUFDVElPTlNfRE9ORSgpIDsKKwkJYnJlYWsgOworCWNhc2UgRUM3X0RFSU5TRVJUOgorCQkvKkVDNzAqLworCQlpZiAoY21kID09IEVDX1RJTUVPVVRfSU1BWCkgeworCQkJR09fU1RBVEUoRUMwX09VVCkgOworCQkJYnJlYWsgOworCQl9CisJCS8qRUM3NSovCisJCWVsc2UgaWYgKGNtZCA9PSBFQ19DT05ORUNUICYmIHNtYy0+ZS5wYXRoX3Rlc3QgPT0gUFRfUEFTU0VEKSB7CisJCQlHT19TVEFURShFQzVfSU5TRVJUKSA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJU01UX1BBTklDKHNtYyxTTVRfRTAxMDcsIFNNVF9FMDEwN19NU0cpIDsKKwkJYnJlYWs7CisJfQorfQorCisjaWZuZGVmCUNPTkNFTlRSQVRPUgorLyoKKyAqIHRyYWNlIHByb3BhZ2F0aW9uIGFjdGlvbnMgZm9yIFNBUyAmIERBUworICovCitzdGF0aWMgdm9pZCBwcm9wX2FjdGlvbnMoc3RydWN0IHNfc21jICpzbWMpCit7CisJaW50CXBvcnRfaW4gPSAwIDsKKwlpbnQJcG9ydF9vdXQgPSAwIDsKKworCVJTX1NFVChzbWMsUlNfRVZFTlQpIDsKKwlzd2l0Y2ggKHNtYy0+cy5zYXMpIHsKKwljYXNlIFNNVF9TQVMgOgorCQlwb3J0X2luID0gcG9ydF9vdXQgPSBwY21fZ2V0X3NfcG9ydChzbWMpIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX0RBUyA6CisJCXBvcnRfaW4gPSBjZm1fZ2V0X21hY19pbnB1dChzbWMpIDsJLyogUEEgb3IgUEIgKi8KKwkJcG9ydF9vdXQgPSBjZm1fZ2V0X21hY19vdXRwdXQoc21jKSA7CS8qIFBBIG9yIFBCICovCisJCWJyZWFrIDsKKwljYXNlIFNNVF9OQUMgOgorCQlTTVRfUEFOSUMoc21jLFNNVF9FMDEwOCwgU01UX0UwMTA4X01TRykgOworCQlyZXR1cm4gOworCX0KKworCURCX0VDTSgiRUNNIDogcHJvcF9hY3Rpb25zIC0gdHJhY2VfcHJvcCAlZFxuIiwgc21jLT5lLnRyYWNlX3Byb3AsMCkgOworCURCX0VDTSgiRUNNIDogcHJvcF9hY3Rpb25zIC0gaW4gJWQgb3V0ICVkXG4iLCBwb3J0X2luLHBvcnRfb3V0KSA7CisKKwlpZiAoc21jLT5lLnRyYWNlX3Byb3AgJiBFTlRJVFlfQklUKEVOVElUWV9NQUMpKSB7CisJCS8qIHRyYWNlIGluaXRpYXRpb3IgKi8KKwkJREJfRUNNKCJFQ00gOiBpbml0aWF0ZSBUUkFDRSBvbiBQSFkgJWNcbiIsJ0EnK3BvcnRfaW4tUEEsMCkgOworCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUENNK3BvcnRfaW4sUENfVFJBQ0UpIDsKKwl9CisJZWxzZSBpZiAoKHNtYy0+ZS50cmFjZV9wcm9wICYgRU5USVRZX0JJVChFTlRJVFlfUEhZKFBBKSkpICYmCisJCXBvcnRfb3V0ICE9IFBBKSB7CisJCS8qIHRyYWNlIHByb3BhZ2F0ZSB1cHN0cmVhbSAqLworCQlEQl9FQ00oIkVDTSA6IHByb3BhZ2F0ZSBUUkFDRSBvbiBQSFkgQlxuIiwwLDApIDsKKwkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1BDTUIsUENfVFJBQ0UpIDsKKwl9CisJZWxzZSBpZiAoKHNtYy0+ZS50cmFjZV9wcm9wICYgRU5USVRZX0JJVChFTlRJVFlfUEhZKFBCKSkpICYmCisJCXBvcnRfb3V0ICE9IFBCKSB7CisJCS8qIHRyYWNlIHByb3BhZ2F0ZSB1cHN0cmVhbSAqLworCQlEQl9FQ00oIkVDTSA6IHByb3BhZ2F0ZSBUUkFDRSBvbiBQSFkgQVxuIiwwLDApIDsKKwkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1BDTUEsUENfVFJBQ0UpIDsKKwl9CisJZWxzZSB7CisJCS8qIHNpZ25hbCB0cmFjZSB0ZXJtaW5hdGlvbiAqLworCQlEQl9FQ00oIkVDTSA6IFRSQUNFIHRlcm1pbmF0ZWRcbiIsMCwwKSA7CisJCXNtYy0+ZS5wYXRoX3Rlc3QgPSBQVF9QRU5ESU5HIDsKKwl9CisJc21jLT5lLnRyYWNlX3Byb3AgPSAwIDsKK30KKyNlbHNlCisvKgorICogdHJhY2UgcHJvcGFnYXRpb24gYWN0aW9ucyBmb3IgQ29uY2VudHJhdG9yCisgKi8KK3N0YXRpYyB2b2lkIHByb3BfYWN0aW9ucyhzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlpbnQJaW5pdGlhdG9yIDsKKwlpbnQJdXBzdHJlYW0gOworCWludAlwIDsKKworCVJTX1NFVChzbWMsUlNfRVZFTlQpIDsKKwl3aGlsZSAoc21jLT5lLnRyYWNlX3Byb3ApIHsKKwkJREJfRUNNKCJFQ00gOiBwcm9wX2FjdGlvbnMgLSB0cmFjZV9wcm9wICVkXG4iLAorCQkJc21jLT5lLnRyYWNlX3Byb3AsMCkgOworCisJCWlmIChzbWMtPmUudHJhY2VfcHJvcCAmIEVOVElUWV9CSVQoRU5USVRZX01BQykpIHsKKwkJCWluaXRpYXRvciA9IEVOVElUWV9NQUMgOworCQkJc21jLT5lLnRyYWNlX3Byb3AgJj0gfkVOVElUWV9CSVQoRU5USVRZX01BQykgOworCQkJREJfRUNNKCJFQ006IE1BQyBpbml0aWF0ZXMgdHJhY2VcbiIsMCwwKSA7CisJCX0KKwkJZWxzZSB7CisJCQlmb3IgKHAgPSBOVU1QSFlTLTEgOyBwID49IDAgOyBwLS0pIHsKKwkJCQlpZiAoc21jLT5lLnRyYWNlX3Byb3AgJgorCQkJCQlFTlRJVFlfQklUKEVOVElUWV9QSFkocCkpKQorCQkJCQlicmVhayA7CisJCQl9CisJCQlpbml0aWF0b3IgPSBFTlRJVFlfUEhZKHApIDsKKwkJCXNtYy0+ZS50cmFjZV9wcm9wICY9IH5FTlRJVFlfQklUKEVOVElUWV9QSFkocCkpIDsKKwkJfQorCQl1cHN0cmVhbSA9IGNlbV9nZXRfdXBzdHJlYW0oc21jLGluaXRpYXRvcikgOworCisJCWlmICh1cHN0cmVhbSA9PSBFTlRJVFlfTUFDKSB7CisJCQkvKiBzaWduYWwgdHJhY2UgdGVybWluYXRpb24gKi8KKwkJCURCX0VDTSgiRUNNIDogVFJBQ0UgdGVybWluYXRlZFxuIiwwLDApIDsKKwkJCXNtYy0+ZS5wYXRoX3Rlc3QgPSBQVF9QRU5ESU5HIDsKKwkJfQorCQllbHNlIHsKKwkJCS8qIHRyYWNlIHByb3BhZ2F0ZSB1cHN0cmVhbSAqLworCQkJREJfRUNNKCJFQ00gOiBwcm9wYWdhdGUgVFJBQ0Ugb24gUEhZICVkXG4iLHVwc3RyZWFtLDApIDsKKwkJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9QQ00rdXBzdHJlYW0sUENfVFJBQ0UpIDsKKwkJfQorCX0KK30KKyNlbmRpZgorCisKKy8qCisgKiBTTVQgdGltZXIgaW50ZXJmYWNlCisgKglzdGFydCBFQ00gdGltZXIKKyAqLworc3RhdGljIHZvaWQgc3RhcnRfZWNtX3RpbWVyKHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgdmFsdWUsIGludCBldmVudCkKK3sKKwlzbXRfdGltZXJfc3RhcnQoc21jLCZzbWMtPmUuZWNtX3RpbWVyLHZhbHVlLEVWX1RPS0VOKEVWRU5UX0VDTSxldmVudCkpOworfQorCisvKgorICogU01UIHRpbWVyIGludGVyZmFjZQorICoJc3RvcCBFQ00gdGltZXIKKyAqLworc3RhdGljIHZvaWQgc3RvcF9lY21fdGltZXIoc3RydWN0IHNfc21jICpzbWMpCit7CisJaWYgKHNtYy0+ZS5lY21fdGltZXIudG1fYWN0aXZlKQorCQlzbXRfdGltZXJfc3RvcChzbWMsJnNtYy0+ZS5lY21fdGltZXIpIDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvZXNzLmMgYi9kcml2ZXJzL25ldC9za2ZwL2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMzliNGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2Vzcy5jCkBAIC0wLDAgKzEsNzIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhpcyBTQkEgY29kZSBpbXBsZW1lbnRzIHRoZSBTeW5jaHJvbm91cyBCYW5kd2lkdGggQWxsb2NhdGlvbgorICogZnVuY3Rpb25zIGRlc2NyaWJlZCBpbiB0aGUgIkZEREkgU3luY2hyb25vdXMgRm9ydW0gSW1wbGVtZW50ZXIncworICogQWdyZWVtZW50IiBkYXRlZCBEZWNlbWJlciAxdGgsIDE5OTMuCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJUFVSUE9TRTogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byBjb250cm9sCisgKgkJIHN5bmNocm9ub3VzIGFsbG9jYXRpb25zIG9uIGEgc2luZ2xlIEZEREkgc2VnbWVudC4KKyAqCQkgQWxsb2NhdGlvbnMgYXJlIGxpbWl0ZWQgdG8gdGhlIHByaW1hcnkgRkRESSByaW5nLgorICoJCSBUaGUgU0JNIHByb3ZpZGVzIHJlY292ZXJ5IG1lY2hhbmlzbXMgdG8gcmVjb3ZlcgorICoJCSB1bnVzZWQgYmFuZHdpZHRoIGFsc28gcmVzb2x2ZXMgVF9OZWcgYW5kCisgKgkJIHJlY29uZmlndXJhdGlvbiBjaGFuZ2VzLiBNYW55IG9mIHRoZSBTQk0gc3RhdGUKKyAqCQkgbWFjaGluZSBpbnB1dHMgYXJlIHNvdXJjZWQgYnkgdGhlIHVuZGVybHlpbmcKKyAqCQkgRkRESSBzdWItc3lzdGVtIHN1cHBvcnRpbmcgdGhlIFNCQSBhcHBsaWNhdGlvbi4KKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgImgvdHlwZXMuaCIKKyNpbmNsdWRlICJoL2ZkZGkuaCIKKyNpbmNsdWRlICJoL3NtYy5oIgorI2luY2x1ZGUgImgvc210X3AuaCIKKworCisjaWZuZGVmCVNMSU1fU01UCisKKyNpZmRlZiBFU1MKKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciBJRF9zY2NzW10gPSAiQCgjKWVzcy5jCTEuMTAgOTYvMDIvMjMgKEMpIFNLIiA7CisjZGVmaW5lIExJTlRfVVNFKHgpCisjZWxzZQorI2RlZmluZSBMSU5UX1VTRSh4KQkoeCk9KHgpCisjZW5kaWYKKyNkZWZpbmUgTVMyQkNMSyh4KQkoKHgpKjEyNTAwTCkKKworLyoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTE9DQUwgVkFSSUFCTEVTOgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK3N0YXRpYyBjb25zdCB1X3Nob3J0IHBsaXN0X3JhZl9hbGNfcmVzW10gPSB7IFNNVF9QMDAxMiwgU01UX1AzMjBCLCBTTVRfUDMyMEYsCisJCQkJCVNNVF9QMzIxMCwgU01UX1AwMDE5LCBTTVRfUDAwMUEsCisJCQkJCVNNVF9QMDAxRCwgMCB9IDsKKworc3RhdGljIGNvbnN0IHVfc2hvcnQgcGxpc3RfcmFmX2NoZ19yZXFbXSA9IHsgU01UX1AzMjBCLCBTTVRfUDMyMEYsIFNNVF9QMzIxMCwKKwkJCQkJU01UX1AwMDFBLCAwIH0gOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZkZGlfYWRkciBzbXRfc2JhX2RhID0ge3sweDgwLDB4MDEsMHg0MywweDAwLDB4ODAsMHgwQ319IDsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmRkaV9hZGRyIG51bGxfYWRkciA9IHt7MCwwLDAsMCwwLDB9fSA7CisKKy8qCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUdMT0JBTCBWQVJJQUJMRVM6CisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworCisvKgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlMT0NBTCBGVU5DVElPTlM6CisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworc3RhdGljIHZvaWQgZXNzX3NlbmRfcmVzcG9uc2Uoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfaGVhZGVyICpzbSwKKwkJCSAgICAgIGludCBzYmFfY21kKTsKK3N0YXRpYyB2b2lkIGVzc19jb25maWdfZmlmbyhzdHJ1Y3Qgc19zbWMgKnNtYyk7CitzdGF0aWMgdm9pZCBlc3Nfc2VuZF9hbGNfcmVxKHN0cnVjdCBzX3NtYyAqc21jKTsKK3N0YXRpYyB2b2lkIGVzc19zZW5kX2ZyYW1lKHN0cnVjdCBzX3NtYyAqc21jLCBTTWJ1ZiAqbWIpOworCisvKgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlFWFRFUk5BTCBGVU5DVElPTlM6CisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLyoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUFVCTElDIEZVTkNUSU9OUzoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCit2b2lkIGVzc190aW1lcl9wb2xsKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgZXNzX3BhcmFfY2hhbmdlKHN0cnVjdCBzX3NtYyAqc21jKTsKK2ludCBlc3NfcmFmX3JlY2VpdmVkX3BhY2soc3RydWN0IHNfc21jICpzbWMsIFNNYnVmICptYiwgc3RydWN0IHNtdF9oZWFkZXIgKnNtLAorCQkJICBpbnQgZnMpOworaW50IHByb2Nlc3NfYndfYWxsb2Moc3RydWN0IHNfc21jICpzbWMsIGxvbmcgaW50IHBheWxvYWQsIGxvbmcgaW50IG92ZXJoZWFkKTsKKworCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCUVuZCBTdGF0aW9uIFN1cHBvcnQJKEVTUykKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyoKKyAqIGV2YWx1YXRlIHRoZSBSQUYgZnJhbWUKKyAqLworaW50IGVzc19yYWZfcmVjZWl2ZWRfcGFjayhzdHJ1Y3Qgc19zbWMgKnNtYywgU01idWYgKm1iLCBzdHJ1Y3Qgc210X2hlYWRlciAqc20sCisJCQkgIGludCBmcykKK3sKKwl2b2lkCQkJKnAgOwkJLyogdW5pdmVyc2FsIHBvaW50ZXIgKi8KKwlzdHJ1Y3Qgc210X3BfMDAxNgkqY21kIDsJCS8qIHBhcmE6IGNvbW1hbmQgZm9yIHRoZSBFU1MgKi8KKwlTTWJ1ZgkJCSpkYiA7CisJdV9sb25nCQkJbXNnX3Jlc190eXBlIDsJLyogcmVjb3VyY2UgdHlwZSAqLworCXVfbG9uZwkJCXBheWxvYWQsIG92ZXJoZWFkIDsKKwlpbnQJCQlsb2NhbCA7CisJaW50CQkJaSA7CisKKwkvKgorCSAqIE1lc3NhZ2UgUHJvY2Vzc2luZyBDb2RlCisJICovCisJIGxvY2FsID0gKChmcyAmIExfSU5ESUNBVE9SKSAhPSAwKSA7CisKKwkvKgorCSAqIGdldCB0aGUgcmVzb3VyY2UgdHlwZQorCSAqLworCWlmICghKHAgPSAodm9pZCAqKSBzbV90b19wYXJhKHNtYyxzbSxTTVRfUDAwMTUpKSkgeworCQlEQl9FU1MoIkVTUzogUkFGIGZyYW1lIGVycm9yLCBwYXJhbWV0ZXIgdHlwZSBub3QgZm91bmRcbiIsMCwwKSA7CisJCXJldHVybihmcykgOworCX0KKwltc2dfcmVzX3R5cGUgPSAoKHN0cnVjdCBzbXRfcF8wMDE1ICopcCktPnJlc190eXBlIDsKKworCS8qCisJICogZ2V0IHRoZSBwb2ludGVyIHRvIHRoZSBFU1MgY29tbWFuZAorCSAqLworCWlmICghKGNtZCA9IChzdHJ1Y3Qgc210X3BfMDAxNiAqKSBzbV90b19wYXJhKHNtYyxzbSxTTVRfUDAwMTYpKSkgeworCQkvKgorCQkgKiBlcnJvciBpbiBmcmFtZTogcGFyYSBFU1MgY29tbWFuZCB3YXMgbm90IGZvdW5kCisJCSAqLworCQkgREJfRVNTKCJFU1M6IFJBRiBmcmFtZSBlcnJvciwgcGFyYW1ldGVyIGNvbW1hbmQgbm90IGZvdW5kXG4iLDAsMCk7CisJCSByZXR1cm4oZnMpIDsKKwl9CisKKwlEQl9FU1NOKDIsImZjICV4CWZ0ICV4XG4iLHNtLT5zbXRfY2xhc3Msc20tPnNtdF90eXBlKSA7CisJREJfRVNTTigyLCJ2ZXIgJXgJdHJhbiAlbHhcbiIsc20tPnNtdF92ZXJzaW9uLHNtLT5zbXRfdGlkKSA7CisJREJfRVNTTigyLCJzdG5faWQgJXNcbiIsYWRkcl90b19zdHJpbmcoJnNtLT5zbXRfc291cmNlKSwwKSA7CisKKwlEQl9FU1NOKDIsImluZm9sZW4gJXgJcmVzICV4XG4iLHNtLT5zbXRfbGVuLCBtc2dfcmVzX3R5cGUpIDsKKwlEQl9FU1NOKDIsInNiYWNtZCAleFxuIixjbWQtPnNiYV9jbWQsMCkgOworCisJLyoKKwkgKiBldmFsdWF0ZSB0aGUgRVNTIGNvbW1hbmQKKwkgKi8KKwlzd2l0Y2ggKGNtZC0+c2JhX2NtZCkgeworCisJLyoKKwkgKiBQcm9jZXNzIGFuIEVTUyBBbGxvY2F0aW9uIFJlcXVlc3QKKwkgKi8KKwljYXNlIFJFUVVFU1RfQUxMT0NBVElPTiA6CisJCS8qCisJCSAqIGNoZWNrIGZvciBhbiBSQUYgUmVxdWVzdCAoQWxsb2NhdGlvbiBSZXF1ZXN0KQorCQkgKi8KKwkJaWYgKHNtLT5zbXRfdHlwZSA9PSBTTVRfUkVRVUVTVCkgeworCQkJLyoKKwkJCSAqIHByb2Nlc3MgdGhlIEFsbG9jYXRpb24gcmVxdWVzdCBvbmx5IGlmIHRoZSBmcmFtZSBpcworCQkJICogbG9jYWwgYW5kIG5vIHN0YXRpYyBhbGxvY2F0aW9uIGlzIHVzZWQKKwkJCSAqLworCQkJaWYgKCFsb2NhbCB8fCBzbWMtPm1pYi5mZGRpRVNTUGF5bG9hZCkKKwkJCQlyZXR1cm4oZnMpIDsKKwkJCQorCQkJcCA9ICh2b2lkICopIHNtX3RvX3BhcmEoc21jLHNtLFNNVF9QMDAxOSkgIDsKKwkJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJCQlpZiAoKChzdHJ1Y3Qgc210X3BfMDAxOSAqKXApLT5hbGxvY19hZGRyLmFbaV0pIHsKKwkJCQkJcmV0dXJuKGZzKSA7CisJCQkJfQorCQkJfQorCisJCQkvKgorCQkJICogTm90ZTogVGhlIEFwcGxpY2F0aW9uIHNob3VsZCBzZW5kIGEgTEFOX0xPQ19GUkFNRS4KKwkJCSAqCSBUaGUgRVNTIGRvIG5vdCBzZW5kIHRoZSBGcmFtZSB0byB0aGUgbmV0d29yayEKKwkJCSAqLworCQkJc21jLT5lc3MuYWxsb2NfdHJhbnNfaWQgPSBzbS0+c210X3RpZCA7CisJCQlEQl9FU1MoIkVTUzogc2F2ZSBBbGxvYyBSZXEgVHJhbnMgSUQgJWx4XG4iLHNtLT5zbXRfdGlkLDApOworCQkJcCA9ICh2b2lkICopIHNtX3RvX3BhcmEoc21jLHNtLFNNVF9QMzIwRikgOworCQkJKChzdHJ1Y3Qgc210X3BfMzIwZiAqKXApLT5taWJfcGF5bG9hZCA9CisJCQkJc21jLT5taWIuYVtQQVRIMF0uZmRkaVBBVEhTYmFQYXlsb2FkIDsKKwkJCXAgPSAodm9pZCAqKSBzbV90b19wYXJhKHNtYyxzbSxTTVRfUDMyMTApIDsKKwkJCSgoc3RydWN0IHNtdF9wXzMyMTAgKilwKS0+bWliX292ZXJoZWFkID0KKwkJCQlzbWMtPm1pYi5hW1BBVEgwXS5mZGRpUEFUSFNiYU92ZXJoZWFkIDsKKwkJCXNtLT5zbXRfZGVzdCA9IHNtdF9zYmFfZGEgOworCisJCQlpZiAoc21jLT5lc3MubG9jYWxfc2JhX2FjdGl2ZSkKKwkJCQlyZXR1cm4oZnMgfCBJX0lORElDQVRPUikgOworCisJCQlpZiAoIShkYiA9IHNtdF9nZXRfbWJ1ZihzbWMpKSkKKwkJCQlyZXR1cm4oZnMpIDsKKworCQkJZGItPnNtX2xlbiA9IG1iLT5zbV9sZW4gOworCQkJZGItPnNtX29mZiA9IG1iLT5zbV9vZmYgOworCQkJbWVtY3B5KCgoY2hhciAqKShkYi0+c21fZGF0YStkYi0+c21fb2ZmKSksKGNoYXIgKilzbSwKKwkJCQkoaW50KWRiLT5zbV9sZW4pIDsKKwkJCWR1bXBfc210KHNtYywKKwkJCQkoc3RydWN0IHNtdF9oZWFkZXIgKikoZGItPnNtX2RhdGErZGItPnNtX29mZiksCisJCQkJIlJBRiIpIDsKKwkJCXNtdF9zZW5kX2ZyYW1lKHNtYyxkYixGQ19TTVRfSU5GTywwKSA7CisJCQlyZXR1cm4oZnMpIDsKKwkJfQorCisJCS8qCisJCSAqIFRoZSBSQUYgZnJhbWUgaXMgYW4gQWxsb2NhdGlvbiBSZXNwb25zZSAhCisJCSAqIGNoZWNrIHRoZSBwYXJhbWV0ZXJzCisJCSAqLworCQlpZiAoc210X2NoZWNrX3BhcmEoc21jLHNtLHBsaXN0X3JhZl9hbGNfcmVzKSkgeworCQkJREJfRVNTKCJFU1M6IFJBRiB3aXRoIHBhcmEgcHJvYmxlbSwgaWdub3JpbmdcbiIsMCwwKSA7CisJCQlyZXR1cm4oZnMpIDsKKwkJfQorCisJCS8qCisJCSAqIFZFUklGWSBUSEUgRlJBTUUgSVMgV0VMTCBCVUlMVDoKKwkJICoKKwkJICoJMS4gcGF0aCBpbmRleCA9IHByaW1hcnkgcmluZyBvbmx5CisJCSAqCTIuIHJlc291cmNlIHR5cGUgPSBzeW5jIGJ3IG9ubHkKKwkJICoJMy4gdHJhbnMgYWN0aW9uIGlkID0gYWxsb2NfdHJhbnNfaWQKKwkJICoJNC4gcmVhc29uIGNvZGUgPSBzdWNjZXNzCisJCSAqCisJCSAqIElmIGFueSBhcmUgdmlvbGF0ZWQsIGRpc2NhcmQgdGhlIFJBRiBmcmFtZQorCQkgKi8KKwkJaWYgKCgoKHN0cnVjdCBzbXRfcF8zMjBiICopc21fdG9fcGFyYShzbWMsc20sU01UX1AzMjBCKSktPnBhdGhfaW5kZXgKKwkJCSE9IFBSSU1BUllfUklORykgfHwKKwkJCShtc2dfcmVzX3R5cGUgIT0gU1lOQ19CVykgfHwKKwkJKCgoc3RydWN0IHNtdF9wX3JlYXNvbiAqKXNtX3RvX3BhcmEoc21jLHNtLFNNVF9QMDAxMikpLT5yZGZfcmVhc29uCisJCQkhPSBTTVRfUkRGX1NVQ0NFU1MpIHx8CisJCQkoc20tPnNtdF90aWQgIT0gc21jLT5lc3MuYWxsb2NfdHJhbnNfaWQpKSB7CisKKwkJCURCX0VTUygiRVNTOiBBbGxvY2F0aW9uIFJlc3BvbmNlIG5vdCBhY2NlcHRlZFxuIiwwLDApIDsKKwkJCXJldHVybihmcykgOworCQl9CisKKwkJLyoKKwkJICogRXh0cmFjdCBtZXNzYWdlIHBhcmFtZXRlcnMKKwkJICovCisJCXAgPSAodm9pZCAqKSBzbV90b19wYXJhKHNtYyxzbSxTTVRfUDMyMEYpIDsKKyAgICAgICAgICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRVNTOiBzbV90b19wYXJhIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZzOworICAgICAgICAgICAgICAgIH0gICAgICAgCisJCXBheWxvYWQgPSAoKHN0cnVjdCBzbXRfcF8zMjBmICopcCktPm1pYl9wYXlsb2FkIDsKKwkJcCA9ICh2b2lkICopIHNtX3RvX3BhcmEoc21jLHNtLFNNVF9QMzIxMCkgOworICAgICAgICAgICAgICAgIGlmICghcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJFU1M6IHNtX3RvX3BhcmEgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnM7CisgICAgICAgICAgICAgICAgfSAgICAgICAKKwkJb3ZlcmhlYWQgPSAoKHN0cnVjdCBzbXRfcF8zMjEwICopcCktPm1pYl9vdmVyaGVhZCA7CisKKwkJREJfRVNTTigyLCJwYXlsb2FkPSAlbHgJb3ZlcmhlYWQ9ICVseFxuIixwYXlsb2FkLG92ZXJoZWFkKSA7CisKKwkJLyoKKwkJICogcHJvY2VzcyB0aGUgYmFuZHdpZHRoIGFsbG9jYXRpb24KKwkJICovCisJCSh2b2lkKXByb2Nlc3NfYndfYWxsb2Moc21jLChsb25nKXBheWxvYWQsKGxvbmcpb3ZlcmhlYWQpIDsKKworCQlyZXR1cm4oZnMpIDsKKwkJLyogZW5kIG9mIFByb2Nlc3MgQWxsb2NhdGlvbiBSZXF1ZXN0ICovCisKKwkvKgorCSAqIFByb2Nlc3MgYW4gRVNTIENoYW5nZSBSZXF1ZXN0CisJICovCisJY2FzZSBDSEFOR0VfQUxMT0NBVElPTiA6CisJCS8qCisJCSAqIGV4Y2VwdCBvbmx5IHJlcGxpZXMKKwkJICovCisJCWlmIChzbS0+c210X3R5cGUgIT0gU01UX1JFUVVFU1QpIHsKKwkJCURCX0VTUygiRVNTOiBEbyBub3QgcHJvY2VzcyBDaGFuZ2UgUmVzcG9uc2VzXG4iLDAsMCkgOworCQkJcmV0dXJuKGZzKSA7CisJCX0KKworCQkvKgorCQkgKiBjaGVjayB0aGUgcGFyYSBmb3IgdGhlIENoYW5nZSBSZXF1ZXN0CisJCSAqLworCQlpZiAoc210X2NoZWNrX3BhcmEoc21jLHNtLHBsaXN0X3JhZl9jaGdfcmVxKSkgeworCQkJREJfRVNTKCJFU1M6IFJBRiB3aXRoIHBhcmEgcHJvYmxlbSwgaWdub3JpbmdcbiIsMCwwKSA7CisJCQlyZXR1cm4oZnMpIDsKKwkJfQorCisJCS8qCisJCSAqIFZlcmlmeSB0aGUgcGF0aCBpbmRleCBhbmQgcmVzb3VyY2UKKwkJICogdHlwZSBhcmUgY29ycmVjdC4gSWYgYW55IG9mCisJCSAqIHRoZXNlIGFyZSBmYWxzZSwgZG9uJ3QgcHJvY2VzcyB0aGlzCisJCSAqIGNoYW5nZSByZXF1ZXN0IGZyYW1lLgorCQkgKi8KKwkJaWYgKCgoKHN0cnVjdCBzbXRfcF8zMjBiICopc21fdG9fcGFyYShzbWMsc20sU01UX1AzMjBCKSktPnBhdGhfaW5kZXgKKwkJCSE9IFBSSU1BUllfUklORykgfHwgKG1zZ19yZXNfdHlwZSAhPSBTWU5DX0JXKSkgeworCQkJREJfRVNTKCJFU1M6IFJBRiBmcmFtZSB3aXRoIHBhcmEgcHJvYmxlbSwgaWdub3JpbmdcbiIsMCwwKSA7CisJCQlyZXR1cm4oZnMpIDsKKwkJfQorCisJCS8qCisJCSAqIEV4dHJhY3QgbWVzc2FnZSBxdWV1ZSBwYXJhbWV0ZXJzCisJCSAqLworCQlwID0gKHZvaWQgKikgc21fdG9fcGFyYShzbWMsc20sU01UX1AzMjBGKSA7CisJCXBheWxvYWQgPSAoKHN0cnVjdCBzbXRfcF8zMjBmICopcCktPm1pYl9wYXlsb2FkIDsKKwkJcCA9ICh2b2lkICopIHNtX3RvX3BhcmEoc21jLHNtLFNNVF9QMzIxMCkgOworCQlvdmVyaGVhZCA9ICgoc3RydWN0IHNtdF9wXzMyMTAgKilwKS0+bWliX292ZXJoZWFkIDsKKworCQlEQl9FU1NOKDIsIkVTUzogQ2hhbmdlIFJlcXVlc3QgZnJvbSAlc1xuIiwKKwkJCWFkZHJfdG9fc3RyaW5nKCZzbS0+c210X3NvdXJjZSksMCkgOworCQlEQl9FU1NOKDIsInBheWxvYWQ9ICVseAlvdmVyaGVhZD0gJWx4XG4iLHBheWxvYWQsb3ZlcmhlYWQpIDsKKworCQkvKgorCQkgKiBwcm9jZXNzIHRoZSBiYW5kd2lkdGggYWxsb2NhdGlvbgorCQkgKi8KKwkJaWYoIXByb2Nlc3NfYndfYWxsb2Moc21jLChsb25nKXBheWxvYWQsKGxvbmcpb3ZlcmhlYWQpKQorCQkJcmV0dXJuKGZzKSA7CisKKwkJLyoKKwkJICogc2VuZCBhbiBSQUYgQ2hhbmdlIFJlcGx5CisJCSAqLworCQllc3Nfc2VuZF9yZXNwb25zZShzbWMsc20sQ0hBTkdFX0FMTE9DQVRJT04pIDsKKworCQlyZXR1cm4oZnMpIDsKKwkJLyogZW5kIG9mIFByb2Nlc3MgQ2hhbmdlIFJlcXVlc3QgKi8KKworCS8qCisJICogUHJvY2VzcyBSZXBvcnQgUmVzcG9uc2UKKwkgKi8KKwljYXNlIFJFUE9SVF9BTExPQ0FUSU9OIDoKKwkJLyoKKwkJICogZXhjZXB0IG9ubHkgcmVxdWVzdHMKKwkJICovCisJCWlmIChzbS0+c210X3R5cGUgIT0gU01UX1JFUVVFU1QpIHsKKwkJCURCX0VTUygiRVNTOiBEbyBub3QgcHJvY2VzcyBhIFJlcG9ydCBSZXBseVxuIiwwLDApIDsKKwkJCXJldHVybihmcykgOworCQl9CisKKwkJREJfRVNTTigyLCJFU1M6IFJlcG9ydCBSZXF1ZXN0IGZyb20gJXNcbiIsCisJCQlhZGRyX3RvX3N0cmluZygmKHNtLT5zbXRfc291cmNlKSksMCkgOworCisJCS8qCisJCSAqIHZlcmlmeSB0aGF0IHRoZSByZXNvdXJjZSB0eXBlIGlzIHN5bmMgYncgb25seQorCQkgKi8KKwkJaWYgKG1zZ19yZXNfdHlwZSAhPSBTWU5DX0JXKSB7CisJCQlEQl9FU1MoIkVTUzogaWdub3JpbmcgUkFGIHdpdGggcGFyYSBwcm9ibGVtXG4iLDAsMCkgOworCQkJcmV0dXJuKGZzKSA7CisJCX0KKworCQkvKgorCQkgKiBzZW5kIGFuIFJBRiBDaGFuZ2UgUmVwbHkKKwkJICovCisJCWVzc19zZW5kX3Jlc3BvbnNlKHNtYyxzbSxSRVBPUlRfQUxMT0NBVElPTikgOworCisJCXJldHVybihmcykgOworCQkvKiBlbmQgb2YgUHJvY2VzcyBSZXBvcnQgUmVxdWVzdCAqLworCisJZGVmYXVsdDoKKwkJLyoKKwkJICogZXJyb3IgaW4gZnJhbWUKKwkJICovCisJCURCX0VTUygiRVNTOiBpZ25vcmluZyBSQUYgd2l0aCBiYWQgc2JhX2NtZFxuIiwwLDApIDsKKwkJYnJlYWsgOworCX0KKworCXJldHVybihmcykgOworfQorCisvKgorICogZGV0ZXJtaW5lcyB0aGUgc3luY2hyb25vdXMgYmFuZHdpZHRoLCBzZXQgdGhlIFRTWU5DIHJlZ2lzdGVyIGFuZCB0aGUKKyAqIG1pYiB2YXJpYWJsZXMgU0JBUGF5bG9hZCwgU0JBT3ZlcmhlYWQgYW5kIGZkZGlNQUNULU5FRy4KKyAqLworaW50IHByb2Nlc3NfYndfYWxsb2Moc3RydWN0IHNfc21jICpzbWMsIGxvbmcgaW50IHBheWxvYWQsIGxvbmcgaW50IG92ZXJoZWFkKQoreworCS8qCisJICogZGV0ZXJtaW5lIHRoZSBzeW5jaHJvbm91cyBiYW5kd2lkdGggKHN5bmNfYncpIGluIGJ5dGVzIHBlciBULU5FRywKKwkgKiBpZiB0aGUgcGF5bG9hZCBpcyBncmVhdGVyIHRoYW4gemVyby4KKwkgKiBGb3IgdGhlIFNCQVBheWxvYWQgYW5kIHRoZSBTQkFPdmVyaGVhZCB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcKKwkgKiB1bml0ZSBxdWF0aW9ucworIAkgKgkJICAgICAgXwkJICBfCisJICoJCSAgICAgfAkgICAgIGJ5dGVzIHwKKwkgKglTQkFQYXlsb2FkID0gfCA4MDAwIC0tLS0tLSB8CisJICoJCSAgICAgfAkJcyAgfAorCSAqCQkgICAgICAtCQkgIC0KKyAJICoJCSAgICAgICBfICAgICAgIF8KKwkgKgkJICAgICAgfAkgYnl0ZXMJfAorCSAqCVNCQU92ZXJoZWFkID0gfCAtLS0tLS0JfAorCSAqCQkgICAgICB8CSBULU5FRwl8CisJICoJCSAgICAgICAtICAgICAgIC0KKyAJICoKKwkgKiBULU5FRyBpcyBkaXNjcmliZWQgYnkgdGhlIGVxdWF0aW9uOgorCSAqCisJICoJCSAgICAgKC0pIGZkZGlNQUNULU5FRworCSAqCVQtTkVHID0JICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKgkJCTEyNTAwMDAwIDEvcworCSAqCisJICogVGhlIG51bWJlciBvZiBieXRlcyB3ZSBhcmUgYWJsZSB0byBzZW5kIGlzIHRoZSBwYXlsb2FkCisJICogcGx1cyB0aGUgb3ZlcmhlYWQuCisJICoKKwkgKgkJCSAgYnl0ZXMgICAgVC1ORUcgU0JBUGF5bG9hZCA4MDAwIGJ5dGVzL3MKKwkgKiBzeW5jX2J3ID0gIFNCQU92ZXJoZWFkIC0tLS0tLSArIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICoJICAgCQkgIFQtTkVHCQlULU5FRworCSAqCisJICoKKwkgKgkgICAgICAJCSAgICAgMQorCSAqIHN5bmNfYncgPSAgU0JBT3ZlcmhlYWQgKyAtLS0tICgtKWZkZGlNQUNULU5FRyAqIFNCQVBheWxvYWQKKwkgKgkgICAgICAgCQkgICAgMTU2MgorCSAqCisJICovCisKKwkvKgorCSAqIHNldCB0aGUgbWliIGF0dHJpYnV0ZXMgZmRkaVBBVEhTYmFPdmVyaGVhZCwgZmRkaVBBVEhTYmFQYXlsb2FkCisJICovCisvKglpZiAoc210X3NldF9vYmooc21jLFNNVF9QMzIwRixwYXlsb2FkLFNfU0VUKSkgeworCQlEQl9FU1MoIkVTUzogU01UIGRvZXMgbm90IGFjY2VwdCB0aGUgcGF5bG9hZCB2YWx1ZVxuIiwwLDApIDsKKwkJcmV0dXJuKEZBTFNFKSA7CisJfQorCWlmIChzbXRfc2V0X29iaihzbWMsU01UX1AzMjEwLG92ZXJoZWFkLFNfU0VUKSkgeworCQlEQl9FU1MoIkVTUzogU01UIGRvZXMgbm90IGFjY2VwdCB0aGUgb3ZlcmhlYWQgdmFsdWVcbiIsMCwwKSA7CisJCXJldHVybihGQUxTRSkgOworCX0gKi8KKworCS8qIHByZW1saW1pbmFyeSAqLworCWlmIChwYXlsb2FkID4gTUFYX1BBWUxPQUQgfHwgb3ZlcmhlYWQgPiA1MDAwKSB7CisJCURCX0VTUygiRVNTOiBwYXlsb2FkIC8gb3ZlcmhlYWQgbm90IGFjY2VwdGVkXG4iLDAsMCkgOworCQlyZXR1cm4oRkFMU0UpIDsKKwl9CisKKwkvKgorCSAqIHN0YXJ0IHRoZSBpdGVyYXRpdmUgYWxsb2NhdGlvbiBwcm9jZXNzIGlmIHRoZSBwYXlsb2FkIG9yIHRoZSBvdmVyaGVhZAorCSAqIGFyZSBzbWFsbGVyIHRoYW4gdGhlIHBhcnNlZCB2YWx1ZXMKKwkgKi8KKwlpZiAoc21jLT5taWIuZmRkaUVTU1BheWxvYWQgJiYKKwkJKCh1X2xvbmcpcGF5bG9hZCAhPSBzbWMtPm1pYi5mZGRpRVNTUGF5bG9hZCB8fAorCQkodV9sb25nKW92ZXJoZWFkICE9IHNtYy0+bWliLmZkZGlFU1NPdmVyaGVhZCkpIHsKKwkJc21jLT5lc3MucmFmX2FjdF90aW1lcl9wb2xsID0gVFJVRSA7CisJCXNtYy0+ZXNzLnRpbWVyX2NvdW50ID0gMCA7CisJfQorCisJLyoKKwkgKiBldnVsYXRlIHRoZSBQYXlsb2FkCisJICovCisJaWYgKHBheWxvYWQpIHsKKwkJREJfRVNTTigyLCJFU1M6IHR1cm4gU01UX1NUX1NZTkNfU0VSVklDRSBiaXQgb25cbiIsMCwwKSA7CisJCXNtYy0+ZXNzLnN5bmNfYndfYXZhaWxhYmxlID0gVFJVRSA7CisKKwkJc21jLT5lc3Muc3luY19idyA9IG92ZXJoZWFkIC0KKwkJCShsb25nKXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1RfTmVnICoKKwkJCXBheWxvYWQgLyAxNTYyIDsKKwl9CisJZWxzZSB7CisJCURCX0VTU04oMiwiRVNTOiB0dXJuIFNNVF9TVF9TWU5DX1NFUlZJQ0UgYml0IG9mZlxuIiwwLDApIDsKKwkJc21jLT5lc3Muc3luY19id19hdmFpbGFibGUgPSBGQUxTRSA7CisJCXNtYy0+ZXNzLnN5bmNfYncgPSAwIDsKKwkJb3ZlcmhlYWQgPSAwIDsKKwl9CisKKwlzbWMtPm1pYi5hW1BBVEgwXS5mZGRpUEFUSFNiYVBheWxvYWQgPSBwYXlsb2FkIDsKKwlzbWMtPm1pYi5hW1BBVEgwXS5mZGRpUEFUSFNiYU92ZXJoZWFkID0gb3ZlcmhlYWQgOworCisKKwlEQl9FU1NOKDIsInRzeW5jID0gJWx4XG4iLHNtYy0+ZXNzLnN5bmNfYncsMCkgOworCisJZXNzX2NvbmZpZ19maWZvKHNtYykgOworCXNldF9mb3JtYWNfdHN5bmMoc21jLHNtYy0+ZXNzLnN5bmNfYncpIDsKKwlyZXR1cm4oVFJVRSkgOworfQorCitzdGF0aWMgdm9pZCBlc3Nfc2VuZF9yZXNwb25zZShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9oZWFkZXIgKnNtLAorCQkJICAgICAgaW50IHNiYV9jbWQpCit7CisJc3RydWN0IHNtdF9zYmFfY2hnCSpjaGcgOworCVNNYnVmCQkJKm1iIDsKKwl2b2lkCQkJKnAgOworCisJLyoKKwkgKiBnZXQgYW5kIGluaXRpYWxpemUgdGhlIHJlc3BvbmNlIGZyYW1lCisJICovCisJaWYgKHNiYV9jbWQgPT0gQ0hBTkdFX0FMTE9DQVRJT04pIHsKKwkJaWYgKCEobWI9c210X2J1aWxkX2ZyYW1lKHNtYyxTTVRfUkFGLFNNVF9SRVBMWSwKKwkJCQlzaXplb2Yoc3RydWN0IHNtdF9zYmFfY2hnKSkpKQorCQkJCXJldHVybiA7CisJfQorCWVsc2UgeworCQlpZiAoIShtYj1zbXRfYnVpbGRfZnJhbWUoc21jLFNNVF9SQUYsU01UX1JFUExZLAorCQkJCXNpemVvZihzdHJ1Y3Qgc210X3NiYV9yZXBfcmVzKSkpKQorCQkJCXJldHVybiA7CisJfQorCisJY2hnID0gc210b2QobWIsc3RydWN0IHNtdF9zYmFfY2hnICopIDsKKwljaGctPnNtdC5zbXRfdGlkID0gc20tPnNtdF90aWQgOworCWNoZy0+c210LnNtdF9kZXN0ID0gc20tPnNtdF9zb3VyY2UgOworCisJLyogc2V0IFAxNSAqLworCWNoZy0+c190eXBlLnBhcmEucF90eXBlID0gU01UX1AwMDE1IDsKKwljaGctPnNfdHlwZS5wYXJhLnBfbGVuID0gc2l6ZW9mKHN0cnVjdCBzbXRfcF8wMDE1KSAtIFBBUkFfTEVOIDsKKwljaGctPnNfdHlwZS5yZXNfdHlwZSA9IFNZTkNfQlcgOworCisJLyogc2V0IFAxNiAqLworCWNoZy0+Y21kLnBhcmEucF90eXBlID0gU01UX1AwMDE2IDsKKwljaGctPmNtZC5wYXJhLnBfbGVuID0gc2l6ZW9mKHN0cnVjdCBzbXRfcF8wMDE2KSAtIFBBUkFfTEVOIDsKKwljaGctPmNtZC5zYmFfY21kID0gc2JhX2NtZCA7CisKKwkvKiBzZXQgUDMyMEIgKi8KKwljaGctPnBhdGgucGFyYS5wX3R5cGUgPSBTTVRfUDMyMEIgOworCWNoZy0+cGF0aC5wYXJhLnBfbGVuID0gc2l6ZW9mKHN0cnVjdCBzbXRfcF8zMjBiKSAtIFBBUkFfTEVOIDsKKwljaGctPnBhdGgubWliX2luZGV4ID0gU0JBUEFUSElOREVYIDsKKwljaGctPnBhdGgucGF0aF9wYWQgPSAodV9zaG9ydClOVUxMIDsKKwljaGctPnBhdGgucGF0aF9pbmRleCA9IFBSSU1BUllfUklORyA7CisKKwkvKiBzZXQgUDMyMEYgKi8KKwljaGctPnBheWxvYWQucGFyYS5wX3R5cGUgPSBTTVRfUDMyMEYgOworCWNoZy0+cGF5bG9hZC5wYXJhLnBfbGVuID0gc2l6ZW9mKHN0cnVjdCBzbXRfcF8zMjBmKSAtIFBBUkFfTEVOIDsKKwljaGctPnBheWxvYWQubWliX2luZGV4ID0gU0JBUEFUSElOREVYIDsKKwljaGctPnBheWxvYWQubWliX3BheWxvYWQgPSBzbWMtPm1pYi5hW1BBVEgwXS5mZGRpUEFUSFNiYVBheWxvYWQgOworCisJLyogc2V0IFAzMjEwICovCisJY2hnLT5vdmVyaGVhZC5wYXJhLnBfdHlwZSA9IFNNVF9QMzIxMCA7CisJY2hnLT5vdmVyaGVhZC5wYXJhLnBfbGVuID0gc2l6ZW9mKHN0cnVjdCBzbXRfcF8zMjEwKSAtIFBBUkFfTEVOIDsKKwljaGctPm92ZXJoZWFkLm1pYl9pbmRleCA9IFNCQVBBVEhJTkRFWCA7CisJY2hnLT5vdmVyaGVhZC5taWJfb3ZlcmhlYWQgPSBzbWMtPm1pYi5hW1BBVEgwXS5mZGRpUEFUSFNiYU92ZXJoZWFkIDsKKworCWlmIChzYmFfY21kID09IENIQU5HRV9BTExPQ0FUSU9OKSB7CisJCS8qIHNldCBQMUEgKi8KKwkJY2hnLT5jYXQucGFyYS5wX3R5cGUgPSBTTVRfUDAwMUEgOworCQljaGctPmNhdC5wYXJhLnBfbGVuID0gc2l6ZW9mKHN0cnVjdCBzbXRfcF8wMDFhKSAtIFBBUkFfTEVOIDsKKwkJcCA9ICh2b2lkICopIHNtX3RvX3BhcmEoc21jLHNtLFNNVF9QMDAxQSkgOworCQljaGctPmNhdC5jYXRlZ29yeSA9ICgoc3RydWN0IHNtdF9wXzAwMWEgKilwKS0+Y2F0ZWdvcnkgOworCX0KKwlkdW1wX3NtdChzbWMsKHN0cnVjdCBzbXRfaGVhZGVyICopY2hnLCJSQUYiKSA7CisJZXNzX3NlbmRfZnJhbWUoc21jLG1iKSA7Cit9CisKK3ZvaWQgZXNzX3RpbWVyX3BvbGwoc3RydWN0IHNfc21jICpzbWMpCit7CisJaWYgKCFzbWMtPmVzcy5yYWZfYWN0X3RpbWVyX3BvbGwpCisJCXJldHVybiA7CisKKwlEQl9FU1NOKDIsIkVTUzogdGltZXJfcG9sbFxuIiwwLDApIDsKKworCXNtYy0+ZXNzLnRpbWVyX2NvdW50KysgOworCWlmIChzbWMtPmVzcy50aW1lcl9jb3VudCA9PSAxMCkgeworCQlzbWMtPmVzcy50aW1lcl9jb3VudCA9IDAgOworCQllc3Nfc2VuZF9hbGNfcmVxKHNtYykgOworCX0KK30KKworc3RhdGljIHZvaWQgZXNzX3NlbmRfYWxjX3JlcShzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzdHJ1Y3Qgc210X3NiYV9hbGNfcmVxICpyZXEgOworCVNNYnVmCSptYiA7CisKKwkvKgorCSAqIHNlbmQgbmV2ZXIgYWxsb2NhdGlvbiByZXF1ZXN0IHdoZXJlIHRoZSByZXF1ZXN0ZWQgcGF5bG9hZCBhbmQKKwkgKiBvdmVyaGVhZCBpcyB6ZXJvIG9yIGRlYWxsb2NhdGUgYmFuZHdpZGh0IHdoZW4gbm8gYmFuZHdpZHRoIGlzCisJICogcGFyc2VkCisJICovCisJaWYgKCFzbWMtPm1pYi5mZGRpRVNTUGF5bG9hZCkgeworCQlzbWMtPm1pYi5mZGRpRVNTT3ZlcmhlYWQgPSAwIDsKKwl9CisJZWxzZSB7CisJCWlmICghc21jLT5taWIuZmRkaUVTU092ZXJoZWFkKQorCQkJc21jLT5taWIuZmRkaUVTU092ZXJoZWFkID0gREVGQVVMVF9PViA7CisJfQorCisJaWYgKHNtYy0+bWliLmZkZGlFU1NPdmVyaGVhZCA9PQorCQlzbWMtPm1pYi5hW1BBVEgwXS5mZGRpUEFUSFNiYU92ZXJoZWFkICYmCisJCXNtYy0+bWliLmZkZGlFU1NQYXlsb2FkID09CisJCXNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRIU2JhUGF5bG9hZCl7CisJCXNtYy0+ZXNzLnJhZl9hY3RfdGltZXJfcG9sbCA9IEZBTFNFIDsKKwkJc21jLT5lc3MudGltZXJfY291bnQgPSA3IDsJLyogbmV4dCBSQUYgYWxjIHJlcSBhZnRlciAzIHMgKi8KKwkJcmV0dXJuIDsKKwl9CisJCisJLyoKKwkgKiBnZXQgYW5kIGluaXRpYWxpemUgdGhlIHJlc3BvbmNlIGZyYW1lCisJICovCisJaWYgKCEobWI9c210X2J1aWxkX2ZyYW1lKHNtYyxTTVRfUkFGLFNNVF9SRVFVRVNULAorCQkJc2l6ZW9mKHN0cnVjdCBzbXRfc2JhX2FsY19yZXEpKSkpCisJCQlyZXR1cm4gOworCXJlcSA9IHNtdG9kKG1iLHN0cnVjdCBzbXRfc2JhX2FsY19yZXEgKikgOworCXJlcS0+c210LnNtdF90aWQgPSBzbWMtPmVzcy5hbGxvY190cmFuc19pZCA9IHNtdF9nZXRfdGlkKHNtYykgOworCXJlcS0+c210LnNtdF9kZXN0ID0gc210X3NiYV9kYSA7CisKKwkvKiBzZXQgUDE1ICovCisJcmVxLT5zX3R5cGUucGFyYS5wX3R5cGUgPSBTTVRfUDAwMTUgOworCXJlcS0+c190eXBlLnBhcmEucF9sZW4gPSBzaXplb2Yoc3RydWN0IHNtdF9wXzAwMTUpIC0gUEFSQV9MRU4gOworCXJlcS0+c190eXBlLnJlc190eXBlID0gU1lOQ19CVyA7CisKKwkvKiBzZXQgUDE2ICovCisJcmVxLT5jbWQucGFyYS5wX3R5cGUgPSBTTVRfUDAwMTYgOworCXJlcS0+Y21kLnBhcmEucF9sZW4gPSBzaXplb2Yoc3RydWN0IHNtdF9wXzAwMTYpIC0gUEFSQV9MRU4gOworCXJlcS0+Y21kLnNiYV9jbWQgPSBSRVFVRVNUX0FMTE9DQVRJT04gOworCisJLyoKKwkgKiBzZXQgdGhlIHBhcmFtZXRlciB0eXBlIGFuZCBwYXJhbWV0ZXIgbGVuZ2h0IG9mIGFsbCB1c2VkCisJICogcGFyYW1ldGVycworCSAqLworCisJLyogc2V0IFAzMjBCICovCisJcmVxLT5wYXRoLnBhcmEucF90eXBlID0gU01UX1AzMjBCIDsKKwlyZXEtPnBhdGgucGFyYS5wX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfMzIwYikgLSBQQVJBX0xFTiA7CisJcmVxLT5wYXRoLm1pYl9pbmRleCA9IFNCQVBBVEhJTkRFWCA7CisJcmVxLT5wYXRoLnBhdGhfcGFkID0gKHVfc2hvcnQpTlVMTCA7CisJcmVxLT5wYXRoLnBhdGhfaW5kZXggPSBQUklNQVJZX1JJTkcgOworCisJLyogc2V0IFAwMDE3ICovCisJcmVxLT5wbF9yZXEucGFyYS5wX3R5cGUgPSBTTVRfUDAwMTcgOworCXJlcS0+cGxfcmVxLnBhcmEucF9sZW4gPSBzaXplb2Yoc3RydWN0IHNtdF9wXzAwMTcpIC0gUEFSQV9MRU4gOworCXJlcS0+cGxfcmVxLnNiYV9wbF9yZXEgPSBzbWMtPm1pYi5mZGRpRVNTUGF5bG9hZCAtCisJCXNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRIU2JhUGF5bG9hZCA7CisKKwkvKiBzZXQgUDAwMTggKi8KKwlyZXEtPm92X3JlcS5wYXJhLnBfdHlwZSA9IFNNVF9QMDAxOCA7CisJcmVxLT5vdl9yZXEucGFyYS5wX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfMDAxOCkgLSBQQVJBX0xFTiA7CisJcmVxLT5vdl9yZXEuc2JhX292X3JlcSA9IHNtYy0+bWliLmZkZGlFU1NPdmVyaGVhZCAtCisJCXNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRIU2JhT3ZlcmhlYWQgOworCisJLyogc2V0IFAzMjBGICovCisJcmVxLT5wYXlsb2FkLnBhcmEucF90eXBlID0gU01UX1AzMjBGIDsKKwlyZXEtPnBheWxvYWQucGFyYS5wX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfMzIwZikgLSBQQVJBX0xFTiA7CisJcmVxLT5wYXlsb2FkLm1pYl9pbmRleCA9IFNCQVBBVEhJTkRFWCA7CisJcmVxLT5wYXlsb2FkLm1pYl9wYXlsb2FkID0gc21jLT5taWIuYVtQQVRIMF0uZmRkaVBBVEhTYmFQYXlsb2FkIDsKKworCS8qIHNldCBQMzIxMCAqLworCXJlcS0+b3ZlcmhlYWQucGFyYS5wX3R5cGUgPSBTTVRfUDMyMTAgOworCXJlcS0+b3ZlcmhlYWQucGFyYS5wX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfMzIxMCkgLSBQQVJBX0xFTiA7CisJcmVxLT5vdmVyaGVhZC5taWJfaW5kZXggPSBTQkFQQVRISU5ERVggOworCXJlcS0+b3ZlcmhlYWQubWliX292ZXJoZWFkID0gc21jLT5taWIuYVtQQVRIMF0uZmRkaVBBVEhTYmFPdmVyaGVhZCA7CisKKwkvKiBzZXQgUDE5ICovCisJcmVxLT5hX2FkZHIucGFyYS5wX3R5cGUgPSBTTVRfUDAwMTkgOworCXJlcS0+YV9hZGRyLnBhcmEucF9sZW4gPSBzaXplb2Yoc3RydWN0IHNtdF9wXzAwMTkpIC0gUEFSQV9MRU4gOworCXJlcS0+YV9hZGRyLnNiYV9wYWQgPSAodV9zaG9ydClOVUxMIDsKKwlyZXEtPmFfYWRkci5hbGxvY19hZGRyID0gbnVsbF9hZGRyIDsKKworCS8qIHNldCBQMUEgKi8KKwlyZXEtPmNhdC5wYXJhLnBfdHlwZSA9IFNNVF9QMDAxQSA7CisJcmVxLT5jYXQucGFyYS5wX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfMDAxYSkgLSBQQVJBX0xFTiA7CisJcmVxLT5jYXQuY2F0ZWdvcnkgPSBzbWMtPm1pYi5mZGRpRVNTQ2F0ZWdvcnkgOworCisJLyogc2V0IFAxQiAqLworCXJlcS0+dG5lZy5wYXJhLnBfdHlwZSA9IFNNVF9QMDAxQiA7CisJcmVxLT50bmVnLnBhcmEucF9sZW4gPSBzaXplb2Yoc3RydWN0IHNtdF9wXzAwMWIpIC0gUEFSQV9MRU4gOworCXJlcS0+dG5lZy5tYXhfdF9uZWcgPSBzbWMtPm1pYi5mZGRpRVNTTWF4VE5lZyA7CisKKwkvKiBzZXQgUDFDICovCisJcmVxLT5zZWdtLnBhcmEucF90eXBlID0gU01UX1AwMDFDIDsKKwlyZXEtPnNlZ20ucGFyYS5wX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfMDAxYykgLSBQQVJBX0xFTiA7CisJcmVxLT5zZWdtLm1pbl9zZWdfc2l6ID0gc21jLT5taWIuZmRkaUVTU01pblNlZ21lbnRTaXplIDsKKworCWR1bXBfc210KHNtYywoc3RydWN0IHNtdF9oZWFkZXIgKilyZXEsIlJBRiIpIDsKKwllc3Nfc2VuZF9mcmFtZShzbWMsbWIpIDsKK30KKworc3RhdGljIHZvaWQgZXNzX3NlbmRfZnJhbWUoc3RydWN0IHNfc21jICpzbWMsIFNNYnVmICptYikKK3sKKwkvKgorCSAqIGNoZWNrIGlmIHRoZSBmcmFtZSBtdXN0IGJlIHNlbmQgdG8gdGhlIG93biBFU1MKKwkgKi8KKwlpZiAoc21jLT5lc3MubG9jYWxfc2JhX2FjdGl2ZSkgeworCQkvKgorCQkgKiBTZW5kIHRoZSBDaGFuZ2UgUmVwbHkgdG8gdGhlIGxvY2FsIFNCQQorCQkgKi8KKwkJREJfRVNTKCJFU1M6U2VuZCB0byB0aGUgbG9jYWwgU0JBXG4iLDAsMCkgOworCQlpZiAoIXNtYy0+ZXNzLnNiYV9yZXBseV9wZW5kKQorCQkJc21jLT5lc3Muc2JhX3JlcGx5X3BlbmQgPSBtYiA7CisJCWVsc2UgeworCQkJREJfRVNTKCJGcmFtZSBpcyBsb3N0IC0gYW5vdGhlciBmcmFtZSB3YXMgcGVuZGluZ1xuIiwwLDApOworCQkJc210X2ZyZWVfbWJ1ZihzbWMsbWIpIDsKKwkJfQorCX0KKwllbHNlIHsKKwkJLyoKKwkJICogU2VuZCB0aGUgU0JBIFJBRiBDaGFuZ2UgUmVwbHkgdG8gdGhlIG5ldHdvcmsKKwkJICovCisJCURCX0VTUygiRVNTOlNlbmQgdG8gdGhlIG5ldHdvcmtcbiIsMCwwKSA7CisJCXNtdF9zZW5kX2ZyYW1lKHNtYyxtYixGQ19TTVRfSU5GTywwKSA7CisJfQorfQorCit2b2lkIGVzc19wYXJhX2NoYW5nZShzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwkodm9pZClwcm9jZXNzX2J3X2FsbG9jKHNtYywobG9uZylzbWMtPm1pYi5hW1BBVEgwXS5mZGRpUEFUSFNiYVBheWxvYWQsCisJCShsb25nKXNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRIU2JhT3ZlcmhlYWQpIDsKK30KKworc3RhdGljIHZvaWQgZXNzX2NvbmZpZ19maWZvKHN0cnVjdCBzX3NtYyAqc21jKQoreworCS8qCisJICogaWYgbm90aGluZyB0byBkbyBleGl0IAorCSAqLworCWlmIChzbWMtPm1pYi5hW1BBVEgwXS5mZGRpUEFUSFNiYVBheWxvYWQpIHsKKwkJaWYgKHNtYy0+aHcuZnAuZmlmby5maWZvX2NvbmZpZ19tb2RlICYgU1lOQ19UUkFGRklDX09OICYmCisJCQkoc21jLT5ody5mcC5maWZvLmZpZm9fY29uZmlnX21vZGUmU0VORF9BU1lOQ19BU19TWU5DKSA9PQorCQkJc21jLT5taWIuZmRkaUVTU1N5bmNoVHhNb2RlKSB7CisJCQlyZXR1cm4gOworCQl9CisJfQorCWVsc2UgeworCQlpZiAoIShzbWMtPmh3LmZwLmZpZm8uZmlmb19jb25maWdfbW9kZSAmIFNZTkNfVFJBRkZJQ19PTikpIHsKKwkJCXJldHVybiA7CisJCX0KKwl9CisKKwkvKgorCSAqIHNwbGl0IHVwIHRoZSBGSUZPIGFuZCByZWluaXRpYWxpemUgdGhlIHF1ZXVlcworCSAqLworCWZvcm1hY19yZWluaXRfdHgoc21jKSA7Cit9CisKKyNlbmRpZiAvKiBFU1MgKi8KKworI2VuZGlmCS8qIG5vIFNMSU1fU01UICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvZnBsdXN0bS5jIGIvZHJpdmVycy9uZXQvc2tmcC9mcGx1c3RtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZlNzg0NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvZnBsdXN0bS5jCkBAIC0wLDAgKzEsMTU2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVNlZSB0aGUgZmlsZSAic2tmZGRpLmMiIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEZPUk1BQysgRHJpdmVyIGZvciB0YWcgbW9kZQorICovCisKKyNpbmNsdWRlICJoL3R5cGVzLmgiCisjaW5jbHVkZSAiaC9mZGRpLmgiCisjaW5jbHVkZSAiaC9zbWMuaCIKKyNpbmNsdWRlICJoL3N1cGVybl8yLmgiCisjaW5jbHVkZSAiY2FuLmMiCisKKyNpZm5kZWYJbGludAorc3RhdGljIGNvbnN0IGNoYXIgSURfc2Njc1tdID0gIkAoIylmcGx1c3RtLmMJMS4zMiA5OS8wMi8yMyAoQykgU0sgIiA7CisjZW5kaWYKKworI2lmbmRlZiBVTlVTRUQKKyNpZmRlZiAgbGludAorI2RlZmluZSBVTlVTRUQoeCkJKHgpID0gKHgpCisjZWxzZQorI2RlZmluZSBVTlVTRUQoeCkKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgRk1fQUREUlgJIChGTV9BRERFVHxGTV9FWEdQQTB8Rk1fRVhHUEExKQorI2RlZmluZSBNUzJCQ0xLKHgpCSgoeCkqMTI1MDBMKQorI2RlZmluZSBVUzJCQ0xLKHgpCSgoeCkqMTI1MEwpCisKKy8qCisgKiBwcm90b3R5cGVzIGZvciBzdGF0aWMgZnVuY3Rpb24KKyAqLworc3RhdGljIHZvaWQgYnVpbGRfY2xhaW1fYmVhY29uKHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgdF9yZXF1ZXN0KTsKK3N0YXRpYyBpbnQgaW5pdF9tYWMoc3RydWN0IHNfc21jICpzbWMsIGludCBhbGwpOworc3RhdGljIHZvaWQgcnRtX2luaXQoc3RydWN0IHNfc21jICpzbWMpOworc3RhdGljIHZvaWQgc210X3NwbGl0X3VwX2ZpZm8oc3RydWN0IHNfc21jICpzbWMpOworCisjaWYgKCFkZWZpbmVkKE5PX1NNVF9QQU5JQykgfHwgZGVmaW5lZChERUJVRykpCitzdGF0aWMJY2hhciB3cml0ZV9tZHJfd2FybmluZyBbXSA9ICJFMzUwIHdyaXRlX21kcigpIEZNX1NOUFBORCBpcyBzZXRcbiI7CitzdGF0aWMJY2hhciBjYW1fd2FybmluZyBbXSA9ICJFX1NNVF8wMDQ6IENBTSBzdGlsbCBidXN5XG4iOworI2VuZGlmCisKKyNkZWZpbmUJRFVNTVlfUkVBRCgpCXNtYy0+aHcubWNfZHVtbXkgPSAodV9zaG9ydCkgaW5wKEFERFIoQjBfUkFQKSkKKworI2RlZmluZQlDSEVDS19OUFAoKSB7CXVuc2lnbmVkIGsgPSAxMDAwMCA7XAorCQkJd2hpbGUgKChpbnB3KEZNX0EoRk1fU1RNQ0hOKSkgJiBGTV9TTlBQTkQpICYmIGspIGstLTtcCisJCQlpZiAoIWspIHsgXAorCQkJCVNNVF9QQU5JQyhzbWMsU01UX0UwMTMwLCBTTVRfRTAxMzBfTVNHKSA7IFwKKwkJCX0JXAorCQl9CisKKyNkZWZpbmUJQ0hFQ0tfQ0FNKCkgewl1bnNpZ25lZCBrID0gMTAgO1wKKwkJCXdoaWxlICghKGlucHcoRk1fQShGTV9BRlNUQVQpKSAmIEZNX0RPTkUpICYmIGspIGstLTtcCisJCQlpZiAoIWspIHsgXAorCQkJCVNNVF9QQU5JQyhzbWMsU01UX0UwMTMxLCBTTVRfRTAxMzFfTVNHKSA7IFwKKwkJCX0JXAorCQl9CisKK2NvbnN0IHN0cnVjdCBmZGRpX2FkZHIgZmRkaV9icm9hZGNhc3QgPSB7ezB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmfX07CitzdGF0aWMgY29uc3Qgc3RydWN0IGZkZGlfYWRkciBudWxsX2FkZHIgPSB7ezAsMCwwLDAsMCwwfX07CitzdGF0aWMgY29uc3Qgc3RydWN0IGZkZGlfYWRkciBkYmVhY29uX211bHRpID0ge3sweDAxLDB4ODAsMHhjMiwweDAwLDB4MDEsMHgwMH19OworCitzdGF0aWMgY29uc3QgdV9zaG9ydCBteV9zYWlkID0gMHhmZmZmIDsJLyogc2hvcnQgYWRkcmVzcyAobi51LikgKi8KK3N0YXRpYyBjb25zdCB1X3Nob3J0IG15X3NhZ3AgPSAweGZmZmYgOwkvKiBzaG9ydCBncm91cCBhZGRyZXNzIChuLnUuKSAqLworCisvKgorICogZGVmaW5lIG15IGFkZHJlc3MKKyAqLworI2lmZGVmCVVTRV9DQU5fQUREUgorI2RlZmluZSBNQQlzbWMtPmh3LmZkZGlfY2Fub25fYWRkcgorI2Vsc2UKKyNkZWZpbmUgTUEJc21jLT5ody5mZGRpX2hvbWVfYWRkcgorI2VuZGlmCisKKworLyoKKyAqIHVzZWZ1bCBpbnRlcnJ1cHQgYml0cworICovCitzdGF0aWMgaW50IG1hY19pbXNrMXUgPSBGTV9TVFhBQlJTIHwgRk1fU1RYQUJSQTAgfCBGTV9TWE1UQUJUIDsKK3N0YXRpYyBpbnQgbWFjX2ltc2sxbCA9IEZNX1NRTENLUyB8IEZNX1NRTENLQTAgfCBGTV9TUENFUERTIHwgRk1fU1BDRVBEQTB8CisJCQlGTV9TVEJVUlMgfCBGTV9TVEJVUkEwIDsKKworCS8qIGRlbGV0ZSBGTV9TUkJGTCBhZnRlciB0ZXN0cyAqLworc3RhdGljIGludCBtYWNfaW1zazJ1ID0gRk1fU0VSUlNGIHwgRk1fU05GU0xEIHwgRk1fU1JDVk9WUiB8IEZNX1NSQkZMIHwKKwkJCUZNX1NNWUNMTSA7CitzdGF0aWMgaW50IG1hY19pbXNrMmwgPSBGTV9TVFJURVhSIHwgRk1fU0RVUENMTSB8IEZNX1NGUk1DVFIgfAorCQkJRk1fU0VSUkNUUiB8IEZNX1NMU1RDVFIgfAorCQkJRk1fU1RSVEVYUCB8IEZNX1NNVUxUREEgfCBGTV9TUk5HT1AgOworCitzdGF0aWMgaW50IG1hY19pbXNrM3UgPSBGTV9TUkNWT1ZSMiB8IEZNX1NSQkZMMiA7CitzdGF0aWMgaW50IG1hY19pbXNrM2wgPSBGTV9TUlBFUlJRMiB8IEZNX1NSUEVSUlExIDsKKworc3RhdGljIGludCBtYWNfYmVhY29uX2ltc2sydSA9IEZNX1NPVFJCRUMgfCBGTV9TTVlCRUMgfCBGTV9TQkVDIHwKKwkJCUZNX1NMT0NMTSB8IEZNX1NISUNMTSB8IEZNX1NNWUNMTSB8IEZNX1NDTE0gOworCisKK3N0YXRpYyB1X2xvbmcgbWFjX2dldF90bmVnKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXVfbG9uZwl0bmVnIDsKKworCXRuZWcgPSAodV9sb25nKSgobG9uZylpbnB3KEZNX0EoRk1fVE5FRykpPDw1KSA7CisJcmV0dXJuKCh1X2xvbmcpKCh0bmVnICsgKChpbnB3KEZNX0EoRk1fVE1SUykpPj4xMCkmMHgxZikpIHwKKwkJMHhmZmUwMDAwMEwpKSA7Cit9CisKK3ZvaWQgbWFjX3VwZGF0ZV9jb3VudGVyKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0ZyYW1lX0N0ID0KKwkJKHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0ZyYW1lX0N0ICYgMHhmZmZmMDAwMEwpCisJCSsgKHVfc2hvcnQpIGlucHcoRk1fQShGTV9GQ05UUikpIDsKKwlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNMb3N0X0N0ID0KKwkJKHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0xvc3RfQ3QgJiAweGZmZmYwMDAwTCkKKwkJKyAodV9zaG9ydCkgaW5wdyhGTV9BKEZNX0xDTlRSKSkgOworCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0Vycm9yX0N0ID0KKwkJKHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0Vycm9yX0N0ICYgMHhmZmZmMDAwMEwpCisJCSsgKHVfc2hvcnQpIGlucHcoRk1fQShGTV9FQ05UUikpIDsKKwlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNUX05lZyA9IG1hY19nZXRfdG5lZyhzbWMpIDsKKyNpZmRlZiBTTVRfUkVBTF9UT0tFTl9DVAorCS8qCisJICogSWYgdGhlIHRva2VuIGNvdW50ZXIgaXMgZW11bGF0ZWQgaXQgaXMgdXBkYXRlZCBpbiBzbXRfZXZlbnQuCisJICovCisJVEJECisjZWxzZQorCXNtdF9lbXVsYXRlX3Rva2VuX2N0KCBzbWMsIE1BQzAgKTsKKyNlbmRpZgorfQorCisvKgorICogd3JpdGUgbG9uZyB2YWx1ZSBpbnRvIGJ1ZmZlciBtZW1vcnkgb3ZlciBtZW1vcnkgZGF0YSByZWdpc3RlciAoTURSKSwKKyAqLworc3RhdGljIHZvaWQgd3JpdGVfbWRyKHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgdmFsKQoreworCUNIRUNLX05QUCgpIDsKKwlNRFJXKHZhbCkgOworfQorCisjaWYgMAorLyoKKyAqIHJlYWQgbG9uZyB2YWx1ZSBmcm9tIGJ1ZmZlciBtZW1vcnkgb3ZlciBtZW1vcnkgZGF0YSByZWdpc3RlciAoTURSKSwKKyAqLworc3RhdGljIHVfbG9uZyByZWFkX21kcihzdHJ1Y3Qgc19zbWMgKnNtYywgdW5zaWduZWQgaW50IGFkZHIpCit7CisJbG9uZyBwIDsKKwlDSEVDS19OUFAoKSA7CisJTUFSUihhZGRyKSA7CisJb3V0cHcoRk1fQShGTV9DTURSRUcxKSxGTV9JUk1FTVdPKSA7CisJQ0hFQ0tfTlBQKCkgOwkvKiBuZWVkZWQgZm9yIFBDSSB0byBwcmV2ZW50IGZyb20gdGltZWluZyB2aW9sYXRpb25zICovCisvKglwID0gTURSUigpIDsgKi8JLyogYmFkIHJlYWQgdmFsdWVzIGlmIHRoZSB3b3JrYXJvdW5kICovCisJCQkvKiBzbWMtPmh3Lm1jX2R1bW15ID0gKigoc2hvcnQgdm9sYXRpbGUgZmFyICopKGFkZHIpKSkqLworCQkJLyogaXMgdXNlZCAqLworCXAgPSAodV9sb25nKWlucHcoRk1fQShGTV9NRFJVKSk8PDE2IDsKKwlwICs9ICh1X2xvbmcpaW5wdyhGTV9BKEZNX01EUkwpKSA7CisJcmV0dXJuKHApIDsKK30KKyNlbmRpZgorCisvKgorICogY2xlYXIgYnVmZmVyIG1lbW9yeQorICovCitzdGF0aWMgdm9pZCBpbml0X3JhbShzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwl1X3Nob3J0IGkgOworCisJc21jLT5ody5mcC5maWZvLnJiY19yYW1fc3RhcnQgPSAwIDsKKwlzbWMtPmh3LmZwLmZpZm8ucmJjX3JhbV9lbmQgPQorCQlzbWMtPmh3LmZwLmZpZm8ucmJjX3JhbV9zdGFydCArIFJCQ19NRU1fU0laRSA7CisJQ0hFQ0tfTlBQKCkgOworCU1BUlcoc21jLT5ody5mcC5maWZvLnJiY19yYW1fc3RhcnQpIDsKKwlmb3IgKGkgPSBzbWMtPmh3LmZwLmZpZm8ucmJjX3JhbV9zdGFydDsKKwkJaSA8ICh1X3Nob3J0KSAoc21jLT5ody5mcC5maWZvLnJiY19yYW1fZW5kLTEpOyBpKyspCisJCXdyaXRlX21kcihzbWMsMEwpIDsKKwkvKiBFcmFzZSB0aGUgbGFzdCBieXRlIHRvbyAqLworCXdyaXRlX21kcihzbWMsMEwpIDsKK30KKworLyoKKyAqIHNldCByZWNlaXZlIEZJRk8gcG9pbnRlcgorICovCitzdGF0aWMgdm9pZCBzZXRfcmVjdnB0cihzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwkvKgorCSAqIGluaXRpYWxpemUgdGhlIHBvaW50ZXIgZm9yIHJlY2VpdmUgcXVldWUgMQorCSAqLworCW91dHB3KEZNX0EoRk1fUlBSMSksc21jLT5ody5mcC5maWZvLnJ4MV9maWZvX3N0YXJ0KSA7CS8qIFJQUjEgKi8KKwlvdXRwdyhGTV9BKEZNX1NXUFIxKSxzbWMtPmh3LmZwLmZpZm8ucngxX2ZpZm9fc3RhcnQpIDsJLyogU1dQUjEgKi8KKwlvdXRwdyhGTV9BKEZNX1dQUjEpLHNtYy0+aHcuZnAuZmlmby5yeDFfZmlmb19zdGFydCkgOwkvKiBXUFIxICovCisJb3V0cHcoRk1fQShGTV9FQVJWMSksc21jLT5ody5mcC5maWZvLnR4X3Nfc3RhcnQtMSkgOwkvKiBFQVJWMSAqLworCisJLyoKKwkgKiBpbml0aWFsaXplIHRoZSBwb2ludGVyIGZvciByZWNlaXZlIHF1ZXVlIDIKKwkgKi8KKwlpZiAoc21jLT5ody5mcC5maWZvLnJ4Ml9maWZvX3NpemUpIHsKKwkJb3V0cHcoRk1fQShGTV9SUFIyKSxzbWMtPmh3LmZwLmZpZm8ucngyX2ZpZm9fc3RhcnQpIDsKKwkJb3V0cHcoRk1fQShGTV9TV1BSMiksc21jLT5ody5mcC5maWZvLnJ4Ml9maWZvX3N0YXJ0KSA7CisJCW91dHB3KEZNX0EoRk1fV1BSMiksc21jLT5ody5mcC5maWZvLnJ4Ml9maWZvX3N0YXJ0KSA7CisJCW91dHB3KEZNX0EoRk1fRUFSVjIpLHNtYy0+aHcuZnAuZmlmby5yYmNfcmFtX2VuZC0xKSA7CisJfQorCWVsc2UgeworCQlvdXRwdyhGTV9BKEZNX1JQUjIpLHNtYy0+aHcuZnAuZmlmby5yYmNfcmFtX2VuZC0xKSA7CisJCW91dHB3KEZNX0EoRk1fU1dQUjIpLHNtYy0+aHcuZnAuZmlmby5yYmNfcmFtX2VuZC0xKSA7CisJCW91dHB3KEZNX0EoRk1fV1BSMiksc21jLT5ody5mcC5maWZvLnJiY19yYW1fZW5kLTEpIDsKKwkJb3V0cHcoRk1fQShGTV9FQVJWMiksc21jLT5ody5mcC5maWZvLnJiY19yYW1fZW5kLTEpIDsKKwl9Cit9CisKKy8qCisgKiBzZXQgdHJhbnNtaXQgRklGTyBwb2ludGVyCisgKi8KK3N0YXRpYyB2b2lkIHNldF90eHB0cihzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlvdXRwdyhGTV9BKEZNX0NNRFJFRzIpLEZNX0lSU1RRKSA7CS8qIHJlc2V0IHRyYW5zbWl0IHF1ZXVlcyAqLworCisJLyoKKwkgKiBpbml0aWFsaXplIHRoZSBwb2ludGVyIGZvciBhc3luY2hyb25vdXMgdHJhbnNtaXQgcXVldWUKKwkgKi8KKwlvdXRwdyhGTV9BKEZNX1JQWEEwKSxzbWMtPmh3LmZwLmZpZm8udHhfYTBfc3RhcnQpIDsJLyogUlBYQTAgKi8KKwlvdXRwdyhGTV9BKEZNX1NXUFhBMCksc21jLT5ody5mcC5maWZvLnR4X2EwX3N0YXJ0KSA7CS8qIFNXUFhBMCAqLworCW91dHB3KEZNX0EoRk1fV1BYQTApLHNtYy0+aHcuZnAuZmlmby50eF9hMF9zdGFydCkgOwkvKiBXUFhBMCAqLworCW91dHB3KEZNX0EoRk1fRUFBMCksc21jLT5ody5mcC5maWZvLnJ4Ml9maWZvX3N0YXJ0LTEpIDsJLyogRUFBMCAqLworCisJLyoKKwkgKiBpbml0aWFsaXplIHRoZSBwb2ludGVyIGZvciBzeW5jaHJvbm91cyB0cmFuc21pdCBxdWV1ZQorCSAqLworCWlmIChzbWMtPmh3LmZwLmZpZm8udHhfc19zaXplKSB7CisJCW91dHB3KEZNX0EoRk1fUlBYUyksc21jLT5ody5mcC5maWZvLnR4X3Nfc3RhcnQpIDsKKwkJb3V0cHcoRk1fQShGTV9TV1BYUyksc21jLT5ody5mcC5maWZvLnR4X3Nfc3RhcnQpIDsKKwkJb3V0cHcoRk1fQShGTV9XUFhTKSxzbWMtPmh3LmZwLmZpZm8udHhfc19zdGFydCkgOworCQlvdXRwdyhGTV9BKEZNX0VBUyksc21jLT5ody5mcC5maWZvLnR4X2EwX3N0YXJ0LTEpIDsKKwl9CisJZWxzZSB7CisJCW91dHB3KEZNX0EoRk1fUlBYUyksc21jLT5ody5mcC5maWZvLnR4X2EwX3N0YXJ0LTEpIDsKKwkJb3V0cHcoRk1fQShGTV9TV1BYUyksc21jLT5ody5mcC5maWZvLnR4X2EwX3N0YXJ0LTEpIDsKKwkJb3V0cHcoRk1fQShGTV9XUFhTKSxzbWMtPmh3LmZwLmZpZm8udHhfYTBfc3RhcnQtMSkgOworCQlvdXRwdyhGTV9BKEZNX0VBUyksc21jLT5ody5mcC5maWZvLnR4X2EwX3N0YXJ0LTEpIDsKKwl9Cit9CisKKy8qCisgKiBpbml0IG1lbW9yeSBidWZmZXIgbWFuYWdlbWVudCByZWdpc3RlcnMKKyAqLworc3RhdGljIHZvaWQgaW5pdF9yYmMoc3RydWN0IHNfc21jICpzbWMpCit7CisJdV9zaG9ydAlyYmNfcmFtX2FkZHIgOworCisJLyoKKwkgKiBzZXQgdW51c2VkIHBvaW50ZXJzIG9yIHBlcm1hbmVudCBwb2ludGVycworCSAqLworCXJiY19yYW1fYWRkciA9IHNtYy0+aHcuZnAuZmlmby5yeDJfZmlmb19zdGFydCAtIDEgOworCisJb3V0cHcoRk1fQShGTV9SUFhBMSkscmJjX3JhbV9hZGRyKSA7CS8qIGExLXNlbmQgcG9pbnRlciAqLworCW91dHB3KEZNX0EoRk1fV1BYQTEpLHJiY19yYW1fYWRkcikgOworCW91dHB3KEZNX0EoRk1fU1dQWEExKSxyYmNfcmFtX2FkZHIpIDsKKwlvdXRwdyhGTV9BKEZNX0VBQTEpLHJiY19yYW1fYWRkcikgOworCisJc2V0X3JlY3ZwdHIoc21jKSA7CisJc2V0X3R4cHRyKHNtYykgOworfQorCisvKgorICogaW5pdCByeCBwb2ludGVyCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfcngoc3RydWN0IHNfc21jICpzbWMpCit7CisJc3RydWN0IHNfc210X3J4X3F1ZXVlCSpxdWV1ZSA7CisKKwkvKgorCSAqIGluaXQgYWxsIHR4IGRhdGEgc3RydWN0dXJlcyBmb3IgcmVjZWl2ZSBxdWV1ZSAxCisJICovCisJc21jLT5ody5mcC5yeFtRVUVVRV9SMV0gPSBxdWV1ZSA9ICZzbWMtPmh3LmZwLnJ4X3FbUVVFVUVfUjFdIDsKKwlxdWV1ZS0+cnhfYm11X2N0bCA9IChIV19QVFIpIEFERFIoQjBfUjFfQ1NSKSA7CisJcXVldWUtPnJ4X2JtdV9kc2MgPSAoSFdfUFRSKSBBRERSKEI0X1IxX0RBKSA7CisKKwkvKgorCSAqIGluaXQgYWxsIHR4IGRhdGEgc3RydWN0dXJlcyBmb3IgcmVjZWl2ZSBxdWV1ZSAyCisJICovCisJc21jLT5ody5mcC5yeFtRVUVVRV9SMl0gPSBxdWV1ZSA9ICZzbWMtPmh3LmZwLnJ4X3FbUVVFVUVfUjJdIDsKKwlxdWV1ZS0+cnhfYm11X2N0bCA9IChIV19QVFIpIEFERFIoQjBfUjJfQ1NSKSA7CisJcXVldWUtPnJ4X2JtdV9kc2MgPSAoSFdfUFRSKSBBRERSKEI0X1IyX0RBKSA7Cit9CisKKy8qCisgKiBzZXQgdGhlIFRTWU5DIHJlZ2lzdGVyIG9mIHRoZSBGT1JNQUMgdG8gcmVndWxhdGUgc3luY2hyb25vdXMgdHJhbnNtaXNzaW9uCisgKi8KK3ZvaWQgc2V0X2Zvcm1hY190c3luYyhzdHJ1Y3Qgc19zbWMgKnNtYywgbG9uZyBzeW5jX2J3KQoreworCW91dHB3KEZNX0EoRk1fVFNZTkMpLCh1bnNpZ25lZCBpbnQpICgoKC1zeW5jX2J3KSA+PiA1KSAmIDB4ZmZmZikgKSA7Cit9CisKKy8qCisgKiBpbml0IGFsbCB0eCBkYXRhIHN0cnVjdHVyZXMKKyAqLworc3RhdGljIHZvaWQgaW5pdF90eChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzdHJ1Y3Qgc19zbXRfdHhfcXVldWUJKnF1ZXVlIDsKKworCS8qCisJICogaW5pdCBhbGwgdHggZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgc3luY2hyb25vdXMgcXVldWUKKwkgKi8KKwlzbWMtPmh3LmZwLnR4W1FVRVVFX1NdID0gcXVldWUgPSAmc21jLT5ody5mcC50eF9xW1FVRVVFX1NdIDsKKwlxdWV1ZS0+dHhfYm11X2N0bCA9IChIV19QVFIpIEFERFIoQjBfWFNfQ1NSKSA7CisJcXVldWUtPnR4X2JtdV9kc2MgPSAoSFdfUFRSKSBBRERSKEI1X1hTX0RBKSA7CisKKyNpZmRlZiBFU1MKKwlzZXRfZm9ybWFjX3RzeW5jKHNtYyxzbWMtPmVzcy5zeW5jX2J3KSA7CisjZW5kaWYKKworCS8qCisJICogaW5pdCBhbGwgdHggZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgYXN5bmNocm9ub3VzIHF1ZXVlIDAKKwkgKi8KKwlzbWMtPmh3LmZwLnR4W1FVRVVFX0EwXSA9IHF1ZXVlID0gJnNtYy0+aHcuZnAudHhfcVtRVUVVRV9BMF0gOworCXF1ZXVlLT50eF9ibXVfY3RsID0gKEhXX1BUUikgQUREUihCMF9YQV9DU1IpIDsKKwlxdWV1ZS0+dHhfYm11X2RzYyA9IChIV19QVFIpIEFERFIoQjVfWEFfREEpIDsKKworCisJbGxjX3JlY292ZXJfdHgoc21jKSA7Cit9CisKK3N0YXRpYyB2b2lkIG1hY19jb3VudGVyX2luaXQoc3RydWN0IHNfc21jICpzbWMpCit7CisJaW50IGkgOworCXVfbG9uZyAqZWMgOworCisJLyoKKwkgKiBjbGVhciBGT1JNQUMrIGZyYW1lLSwgbG9zdC0gYW5kIGVycm9yIGNvdW50ZXIKKwkgKi8KKwlvdXRwdyhGTV9BKEZNX0ZDTlRSKSwwKSA7CisJb3V0cHcoRk1fQShGTV9MQ05UUiksMCkgOworCW91dHB3KEZNX0EoRk1fRUNOVFIpLDApIDsKKwkvKgorCSAqIGNsZWFyIGludGVybmFsIGVycm9yIGNvdW50ZXIgc3R1Y3R1cmUKKwkgKi8KKwllYyA9ICh1X2xvbmcgKikmc21jLT5ody5mcC5lcnJfc3RhdHMgOworCWZvciAoaSA9IChzaXplb2Yoc3RydWN0IGVycl9zdCkvc2l6ZW9mKGxvbmcpKSA7IGkgOyBpLS0pCisJCSplYysrID0gMEwgOworCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1JpbmdPcF9DdCA9IDAgOworfQorCisvKgorICogc2V0IEZPUk1BQyBhZGRyZXNzLCBhbmQgdF9yZXF1ZXN0CisgKi8KK3N0YXRpYwl2b2lkIHNldF9mb3JtYWNfYWRkcihzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlsb25nCXRfcmVxdSA9IHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1RfUmVxIDsKKworCW91dHB3KEZNX0EoRk1fU0FJRCksbXlfc2FpZCkgOwkvKiBzZXQgc2hvcnQgYWRkcmVzcyAqLworCW91dHB3KEZNX0EoRk1fTEFJTCksKHVuc2lnbmVkKSgoc21jLT5ody5mZGRpX2hvbWVfYWRkci5hWzRdPDw4KSArCisJCQkJCXNtYy0+aHcuZmRkaV9ob21lX2FkZHIuYVs1XSkpIDsKKwlvdXRwdyhGTV9BKEZNX0xBSUMpLCh1bnNpZ25lZCkoKHNtYy0+aHcuZmRkaV9ob21lX2FkZHIuYVsyXTw8OCkgKworCQkJCQlzbWMtPmh3LmZkZGlfaG9tZV9hZGRyLmFbM10pKSA7CisJb3V0cHcoRk1fQShGTV9MQUlNKSwodW5zaWduZWQpKChzbWMtPmh3LmZkZGlfaG9tZV9hZGRyLmFbMF08PDgpICsKKwkJCQkJc21jLT5ody5mZGRpX2hvbWVfYWRkci5hWzFdKSkgOworCisJb3V0cHcoRk1fQShGTV9TQUdQKSxteV9zYWdwKSA7CS8qIHNldCBzaG9ydCBncm91cCBhZGRyZXNzICovCisKKwlvdXRwdyhGTV9BKEZNX0xBR0wpLCh1bnNpZ25lZCkoKHNtYy0+aHcuZnAuZ3JvdXBfYWRkci5hWzRdPDw4KSArCisJCQkJCXNtYy0+aHcuZnAuZ3JvdXBfYWRkci5hWzVdKSkgOworCW91dHB3KEZNX0EoRk1fTEFHQyksKHVuc2lnbmVkKSgoc21jLT5ody5mcC5ncm91cF9hZGRyLmFbMl08PDgpICsKKwkJCQkJc21jLT5ody5mcC5ncm91cF9hZGRyLmFbM10pKSA7CisJb3V0cHcoRk1fQShGTV9MQUdNKSwodW5zaWduZWQpKChzbWMtPmh3LmZwLmdyb3VwX2FkZHIuYVswXTw8OCkgKworCQkJCQlzbWMtPmh3LmZwLmdyb3VwX2FkZHIuYVsxXSkpIDsKKworCS8qIHNldCByX3JlcXVlc3QgcmVncy4gKE1TVyAmIExTVyBvZiBUUlQgKSAqLworCW91dHB3KEZNX0EoRk1fVFJFUTEpLCh1bnNpZ25lZCkodF9yZXF1Pj4xNikpIDsKKwlvdXRwdyhGTV9BKEZNX1RSRVEwKSwodW5zaWduZWQpdF9yZXF1KSA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9pbnQoY2hhciAqcCwgaW50IGwpCit7CisJcFswXSA9IChjaGFyKShsID4+IDI0KSA7CisJcFsxXSA9IChjaGFyKShsID4+IDE2KSA7CisJcFsyXSA9IChjaGFyKShsID4+IDgpIDsKKwlwWzNdID0gKGNoYXIpKGwgPj4gMCkgOworfQorCisvKgorICogY29weSBUWCBkZXNjcmlwdG9yIHRvIGJ1ZmZlciBtZW0KKyAqIGFwcGVuZCBGQyBmaWVsZCBhbmQgTUFDIGZyYW1lCisgKiBpZiBtb3JlIGJpdCBpcyBzZXQgaW4gZGVzY3IKKyAqCWFwcGVuZCBwb2ludGVyIHRvIGRlc2NyaXB0b3IgKGVuZGxlc3MgbG9vcCkKKyAqIGVsc2UKKyAqCWFwcGVuZCAnZW5kIG9mIGNoYWluJyBwb2ludGVyCisgKi8KK3N0YXRpYyB2b2lkIGNvcHlfdHhfbWFjKHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgdGQsIHN0cnVjdCBmZGRpX21hYyAqbWFjLAorCQkJdW5zaWduZWQgb2ZmLCBpbnQgbGVuKQorLyogdV9sb25nIHRkOwkJIHRyYW5zbWl0IGRlc2NyaXB0b3IgKi8KKy8qIHN0cnVjdCBmZGRpX21hYyAqbWFjOyBtYWMgZnJhbWUgcG9pbnRlciAqLworLyogdW5zaWduZWQgb2ZmOwkgc3RhcnQgYWRkcmVzcyB3aXRoaW4gYnVmZmVyIG1lbW9yeSAqLworLyogaW50IGxlbiA7CQkgbGVuZ2h0IG9mIHRoZSBmcmFtZSBpbmNsdWRpbmcgdGhlIEZDICovCit7CisJaW50CWkgOworCXVfaW50CSpwIDsKKworCUNIRUNLX05QUCgpIDsKKwlNQVJXKG9mZikgOwkJLyogc2V0IG1lbW9yeSBhZGRyZXNzIHJlZyBmb3Igd3JpdGVzICovCisKKwlwID0gKHVfaW50ICopIG1hYyA7CisJZm9yIChpID0gKGxlbiArIDMpLzQgOyBpIDsgaS0tKSB7CisJCWlmIChpID09IDEpIHsKKwkJCS8qIGxhc3Qgd29yZCwgc2V0IHRoZSB0YWcgYml0ICovCisJCQlvdXRwdyhGTV9BKEZNX0NNRFJFRzIpLEZNX0lTVFRCKSA7CisJCX0KKwkJd3JpdGVfbWRyKHNtYyxNRFJfUkVWRVJTRSgqcCkpIDsKKwkJcCsrIDsKKwl9CisKKwlvdXRwdyhGTV9BKEZNX0NNRFJFRzIpLEZNX0lTVFRCKSA7CS8qIHNldCB0aGUgdGFnIGJpdCAqLworCXdyaXRlX21kcihzbWMsdGQpIDsJLyogd3JpdGUgb3ZlciBtZW1vcnkgZGF0YSByZWcgdG8gYnVmZmVyICovCit9CisKKy8qCisJQkVHSU5fTUFOVUFMX0VOVFJZKG1vZHVsZTt0ZXN0czszKQorCUhvdyB0byB0ZXN0IGRpcmVjdGVkIGJlYWNvbiBmcmFtZXMKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlvIEluc2VydCBhIGJyZWFrIHBvaW50IGluIHRoZSBmdW5jdGlvbiBidWlsZF9jbGFpbV9iZWFjb24oKQorCSAgYmVmb3JlIGNhbGxpbmcgY29weV90eF9tYWMoKSBmb3IgYnVpbGRpbmcgdGhlIGNsYWltIGZyYW1lLgorCW8gTW9kaWZ5IHRoZSBSTTNfREVURUNUIGNhc2Ugc28gdGhhdCB0aGUgUk02X0RFVEVDVCBzdGF0ZQorCSAgd2lsbCBhbHdheXMgZW50ZXJlZCBmcm9tIHRoZSBSTTNfREVURUNUIHN0YXRlIChmdW5jdGlvbiBybXRfZnNtKCksCisJICBybXQuYykKKwlvIENvbXBpbGUgdGhlIGRyaXZlci4KKwlvIFNldCB0aGUgcGFyYW1ldGVyIFRSRVEgaW4gdGhlIHByb3RvY29sLmluaSBvciBuZXQuY2ZnIHRvIGEKKwkgIHNtYWxsIHZhbHVlIHRvIG1ha2Ugc3VyZSB5b3VyIHN0YXRpb24gd2lsbCB3aW4gdGhlIGNsYWltCisJICBwcm9jZXNzLgorCW8gU3RhcnQgdGhlIGRyaXZlci4KKwlvIFdoZW4geW91IHJlYWNoIHRoZSBicmVhayBwb2ludCwgbW9kaWZ5IHRoZSBTQSBhbmQgREEgYWRkcmVzcworCSAgb2YgdGhlIGNsYWltIGZyYW1lIChlLmcuIFNBID0gREEgPSAxMDAwNWFmZmZmZmYpLgorCW8gV2hlbiB5b3Ugc2VlIFJNM19ERVRFQ1QgYW5kIFJNNl9ERVRFQ1QsIG9ic2VydmUgdGhlIGRpcmVjdAorCSAgYmVhY29uIGZyYW1lcyBvbiB0aGUgVVBQU0xBTkEuCisKKwlFTkRfTUFOVUFMX0VOVFJZCisgKi8KK3N0YXRpYyB2b2lkIGRpcmVjdGVkX2JlYWNvbihzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlTS19MT0NfREVDTCh1X2ludCxhWzJdKSA7CisKKwkvKgorCSAqIHNldCBVTkEgaW4gZnJhbWUKKwkgKiBlbmFibGUgRk9STUFDIHRvIHNlbmQgZW5kbGVzcyBxdWV1ZSBvZiBkaXJlY3RlZCBiZWFjb24KKwkgKiBpbXBvcnRhbnQ6IHRoZSBVTkEgc3RhcnRzIGF0IGJ5dGUgMSAobm90IGF0IGJ5dGUgMCkKKwkgKi8KKwkqIChjaGFyICopIGEgPSAoY2hhcikgKChsb25nKURCRUFDT05fSU5GTzw8MjRMKSA7CisJYVsxXSA9IDAgOworCW1lbWNweSgoY2hhciAqKWErMSwoY2hhciAqKSAmc21jLT5taWIubVtNQUMwXS5mZGRpTUFDVXBzdHJlYW1OYnIsNikgOworCisJQ0hFQ0tfTlBQKCkgOworCSAvKiBzZXQgbWVtb3J5IGFkZHJlc3MgcmVnIGZvciB3cml0ZXMgKi8KKwlNQVJXKHNtYy0+aHcuZnAuZmlmby5yYmNfcmFtX3N0YXJ0K0RCRUFDT05fRlJBTUVfT0ZGKzQpIDsKKwl3cml0ZV9tZHIoc21jLE1EUl9SRVZFUlNFKGFbMF0pKSA7CisJb3V0cHcoRk1fQShGTV9DTURSRUcyKSxGTV9JU1RUQikgOwkvKiBzZXQgdGhlIHRhZyBiaXQgKi8KKwl3cml0ZV9tZHIoc21jLE1EUl9SRVZFUlNFKGFbMV0pKSA7CisKKwlvdXRwdyhGTV9BKEZNX1NBQkMpLHNtYy0+aHcuZnAuZmlmby5yYmNfcmFtX3N0YXJ0ICsgREJFQUNPTl9GUkFNRV9PRkYpIDsKK30KKworLyoKKwlzZXR1cCBjbGFpbSAmIGJlYWNvbiBwb2ludGVyCisJTk9URSA6CisJCXNwZWNpYWwgZnJhbWUgcGFja2V0cyBlbmQgd2l0aCBhIHBvaW50ZXIgdG8gdGhlaXIgb3duCisJCWRlc2NyaXB0b3IsIGFuZCB0aGUgTU9SRSBiaXQgaXMgc2V0IGluIHRoZSBkZXNjcmlwdG9yCisqLworc3RhdGljIHZvaWQgYnVpbGRfY2xhaW1fYmVhY29uKHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgdF9yZXF1ZXN0KQoreworCXVfaW50CXRkIDsKKwlpbnQJbGVuIDsKKwlzdHJ1Y3QgZmRkaV9tYWNfc2YgKm1hYyA7CisKKwkvKgorCSAqIGJ1aWxkIGNsYWltIHBhY2tldAorCSAqLworCWxlbiA9IDE3IDsKKwl0ZCA9IFRYX0RFU0NSSVBUT1IgfCAoKCgodV9pbnQpbGVuLTEpJjMpPDwyNykgOworCW1hYyA9ICZzbWMtPmh3LmZwLm1hY19zZmIgOworCW1hYy0+bWFjX2ZjID0gRkNfQ0xBSU0gOworCS8qIERBID09IFNBIGluIGNsYWltIGZyYW1lICovCisJbWFjLT5tYWNfc291cmNlID0gbWFjLT5tYWNfZGVzdCA9IE1BIDsKKwkvKiAyJ3MgY29tcGxlbWVudCAqLworCXNldF9pbnQoKGNoYXIgKiltYWMtPm1hY19pbmZvLChpbnQpdF9yZXF1ZXN0KSA7CisKKwljb3B5X3R4X21hYyhzbWMsdGQsKHN0cnVjdCBmZGRpX21hYyAqKW1hYywKKwkJc21jLT5ody5mcC5maWZvLnJiY19yYW1fc3RhcnQgKyBDTEFJTV9GUkFNRV9PRkYsbGVuKSA7CisJLyogc2V0IENMQUlNIHN0YXJ0IHBvaW50ZXIgKi8KKwlvdXRwdyhGTV9BKEZNX1NBQ0wpLHNtYy0+aHcuZnAuZmlmby5yYmNfcmFtX3N0YXJ0ICsgQ0xBSU1fRlJBTUVfT0ZGKSA7CisKKwkvKgorCSAqIGJ1aWxkIGJlYWNvbiBwYWNrZXQKKwkgKi8KKwlsZW4gPSAxNyA7CisJdGQgPSBUWF9ERVNDUklQVE9SIHwgKCgoKHVfaW50KWxlbi0xKSYzKTw8MjcpIDsKKwltYWMtPm1hY19mYyA9IEZDX0JFQUNPTiA7CisJbWFjLT5tYWNfc291cmNlID0gTUEgOworCW1hYy0+bWFjX2Rlc3QgPSBudWxsX2FkZHIgOwkJLyogREEgPT0gMCBpbiBiZWFjb24gZnJhbWUgKi8KKwlzZXRfaW50KChjaGFyICopIG1hYy0+bWFjX2luZm8sKChpbnQpQkVBQ09OX0lORk88PDI0KSArIDAgKSA7CisKKwljb3B5X3R4X21hYyhzbWMsdGQsKHN0cnVjdCBmZGRpX21hYyAqKW1hYywKKwkJc21jLT5ody5mcC5maWZvLnJiY19yYW1fc3RhcnQgKyBCRUFDT05fRlJBTUVfT0ZGLGxlbikgOworCS8qIHNldCBiZWFjb24gc3RhcnQgcG9pbnRlciAqLworCW91dHB3KEZNX0EoRk1fU0FCQyksc21jLT5ody5mcC5maWZvLnJiY19yYW1fc3RhcnQgKyBCRUFDT05fRlJBTUVfT0ZGKSA7CisKKwkvKgorCSAqIGJ1aWxkIGRpcmVjdGVkIGJlYWNvbiBwYWNrZXQKKwkgKiBjb250YWlucyBvcHRpb25hbCBVTkEKKwkgKi8KKwlsZW4gPSAyMyA7CisJdGQgPSBUWF9ERVNDUklQVE9SIHwgKCgoKHVfaW50KWxlbi0xKSYzKTw8MjcpIDsKKwltYWMtPm1hY19mYyA9IEZDX0JFQUNPTiA7CisJbWFjLT5tYWNfc291cmNlID0gTUEgOworCW1hYy0+bWFjX2Rlc3QgPSBkYmVhY29uX211bHRpIDsJCS8qIG11bHRpY2FzdCAqLworCXNldF9pbnQoKGNoYXIgKikgbWFjLT5tYWNfaW5mbywoKGludClEQkVBQ09OX0lORk88PDI0KSArIDAgKSA7CisJc2V0X2ludCgoY2hhciAqKSBtYWMtPm1hY19pbmZvKzQsMCkgOworCXNldF9pbnQoKGNoYXIgKikgbWFjLT5tYWNfaW5mbys4LDApIDsKKworCWNvcHlfdHhfbWFjKHNtYyx0ZCwoc3RydWN0IGZkZGlfbWFjICopbWFjLAorCQlzbWMtPmh3LmZwLmZpZm8ucmJjX3JhbV9zdGFydCArIERCRUFDT05fRlJBTUVfT0ZGLGxlbikgOworCisJLyogZW5kIG9mIGNsYWltL2JlYWNvbiBxdWV1ZSAqLworCW91dHB3KEZNX0EoRk1fRUFDQiksc21jLT5ody5mcC5maWZvLnJ4MV9maWZvX3N0YXJ0LTEpIDsKKworCW91dHB3KEZNX0EoRk1fV1BYU0YpLDApIDsKKwlvdXRwdyhGTV9BKEZNX1JQWFNGKSwwKSA7Cit9CisKK3N0YXRpYyB2b2lkIGZvcm1hY19yY3ZfcmVzdGFydChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwkvKiBlbmFibGUgcmVjZWl2ZSBmdW5jdGlvbiAqLworCVNFVE1BU0soRk1fQShGTV9NRFJFRzEpLHNtYy0+aHcuZnAucnhfbW9kZSxGTV9BRERSWCkgOworCisJb3V0cHcoRk1fQShGTV9DTURSRUcxKSxGTV9JQ0xMUikgOwkvKiBjbGVhciByZWNlaXZlIGxvY2sgKi8KK30KKwordm9pZCBmb3JtYWNfdHhfcmVzdGFydChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlvdXRwdyhGTV9BKEZNX0NNRFJFRzEpLEZNX0lDTExTKSA7CS8qIGNsZWFyIHMtZnJhbWUgbG9jayAqLworCW91dHB3KEZNX0EoRk1fQ01EUkVHMSksRk1fSUNMTEEwKSA7CS8qIGNsZWFyIGEtZnJhbWUgbG9jayAqLworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfZm9ybWFjKHN0cnVjdCBzX3NtYyAqc21jKQoreworCS8qIHNldCBmb3JtYWMgSU1TSyA6IDAgZW5hYmxlcyBpcnEgKi8KKwlvdXRwdyhGTV9BKEZNX0lNU0sxVSksfm1hY19pbXNrMXUpIDsKKwlvdXRwdyhGTV9BKEZNX0lNU0sxTCksfm1hY19pbXNrMWwpIDsKKwlvdXRwdyhGTV9BKEZNX0lNU0syVSksfm1hY19pbXNrMnUpIDsKKwlvdXRwdyhGTV9BKEZNX0lNU0syTCksfm1hY19pbXNrMmwpIDsKKwlvdXRwdyhGTV9BKEZNX0lNU0szVSksfm1hY19pbXNrM3UpIDsKKwlvdXRwdyhGTV9BKEZNX0lNU0szTCksfm1hY19pbXNrM2wpIDsKK30KKworI2lmIDAJLyogUmVtb3ZlZCBiZWNhdXNlIHRoZSBkcml2ZXIgc2hvdWxkIHVzZSB0aGUgQVNJQ3MgVFggY29tcGxldGUgSVJRLiAqLworCS8qIFRoZSBGT1JNQUNzIHR4IGNvbXBsZXRlIElSUSBzaG91bGQgYmUgdXNlZCBhbnkgbG9uZ2VyICovCisKKy8qCisJQkVHSU5fTUFOVUFMX0VOVFJZKGlmLGZ1bmM7b3RoZXJzOzQpCisKKwl2b2lkIGVuYWJsZV90eF9pcnEoc21jLCBxdWV1ZSkKKwlzdHJ1Y3Qgc19zbWMgKnNtYyA7CisJdV9zaG9ydAlxdWV1ZSA7CisKK0Z1bmN0aW9uCURPV05DQUxMCShTTVQsIGZwbHVzdG0uYykKKwkJZW5hYmxlX3R4X2lycSgpIGVuYWJsZXMgdGhlIEZPUk1BQ3MgdHJhbnNtaXQgY29tcGxldGUKKwkJaW50ZXJydXB0IG9mIHRoZSBxdWV1ZS4KKworUGFyYQlxdWV1ZQk9IFFVRVVFX1M6CXN5bmNocm9ub3VzIHF1ZXVlCisJCT0gUVVFVUVfQTA6CWFzeW5jaHJvbm91cyBxdWV1ZQorCitOb3RlCUFmdGVyIGFueSByaW5nIG9wZXJhdGlvbmFsIGNoYW5nZSB0aGUgdHJhbnNtaXQgY29tcGxldGUKKwlpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4KKwlUaGUgb3BlcmF0aW5nIHN5c3RlbSBkZXBlbmRlbnQgbW9kdWxlIG11c3QgZW5hYmxlCisJdGhlIHRyYW5zbWl0IGNvbXBsZXRlIGludGVycnVwdCBvZiBhIHF1ZXVlLAorCQktIHdoZW4gaXQgcXVldWVzIHRoZSBmaXJzdCBmcmFtZSwKKwkJICBiZWNhdXNlIG9mIG5vIHRyYW5zbWl0IHJlc291cmNlcyBhcmUgYmVlaW5nCisJCSAgYXZhaWxhYmxlIGFuZAorCQktIHdoZW4gaXQgZXNjYXBlcyBmcm9tIHRoZSBmdW5jdGlvbiBsbGNfcmVzdGFydF90eAorCQkgIHdoaWxlIHNvbWUgZnJhbWVzIGFyZSBzdGlsbCBxdWV1ZWQuCisKKwlFTkRfTUFOVUFMX0VOVFJZCisgKi8KK3ZvaWQgZW5hYmxlX3R4X2lycShzdHJ1Y3Qgc19zbWMgKnNtYywgdV9zaG9ydCBxdWV1ZSkKKy8qIHVfc2hvcnQgcXVldWU7IDAgPSBzeW5jaHJvbm91cyBxdWV1ZSwgMSA9IGFzeW5jaHJvbm91cyBxdWV1ZSAwICovCit7CisJdV9zaG9ydAlpbWFzayA7CisKKwlpbWFzayA9IH4oaW5wdyhGTV9BKEZNX0lNU0sxVSkpKSA7CisKKwlpZiAocXVldWUgPT0gMCkgeworCQlvdXRwdyhGTV9BKEZNX0lNU0sxVSksfihpbWFza3xGTV9TVEVGUk1TKSkgOworCX0KKwlpZiAocXVldWUgPT0gMSkgeworCQlvdXRwdyhGTV9BKEZNX0lNU0sxVSksfihpbWFza3xGTV9TVEVGUk1BMCkpIDsKKwl9Cit9CisKKy8qCisJQkVHSU5fTUFOVUFMX0VOVFJZKGlmLGZ1bmM7b3RoZXJzOzQpCisKKwl2b2lkIGRpc2FibGVfdHhfaXJxKHNtYywgcXVldWUpCisJc3RydWN0IHNfc21jICpzbWMgOworCXVfc2hvcnQJcXVldWUgOworCitGdW5jdGlvbglET1dOQ0FMTAkoU01ULCBmcGx1c3RtLmMpCisJCWRpc2FibGVfdHhfaXJxIGRpc2FibGVzIHRoZSBGT1JNQUNzIHRyYW5zbWl0IGNvbXBsZXRlCisJCWludGVycnVwdCBvZiB0aGUgcXVldWUKKworUGFyYQlxdWV1ZQk9IFFVRVVFX1M6CXN5bmNocm9ub3VzIHF1ZXVlCisJCT0gUVVFVUVfQTA6CWFzeW5jaHJvbm91cyBxdWV1ZQorCitOb3RlCVRoZSBvcGVyYXRpbmcgc3lzdGVtIGRlcGVuZGVudCBtb2R1bGUgc2hvdWxkIGRpc2FibGUKKwl0aGUgdHJhbnNtaXQgY29tcGxldGUgaW50ZXJydXB0cyBpZiBpdCBlc2NhcGVzIGZyb20gdGhlCisJZnVuY3Rpb24gbGxjX3Jlc3RhcnRfdHggYW5kIG5vIGZyYW1lcyBhcmUgcXVldWVkLgorCisJRU5EX01BTlVBTF9FTlRSWQorICovCit2b2lkIGRpc2FibGVfdHhfaXJxKHN0cnVjdCBzX3NtYyAqc21jLCB1X3Nob3J0IHF1ZXVlKQorLyogdV9zaG9ydCBxdWV1ZTsgMCA9IHN5bmNocm9ub3VzIHF1ZXVlLCAxID0gYXN5bmNocm9ub3VzIHF1ZXVlIDAgKi8KK3sKKwl1X3Nob3J0CWltYXNrIDsKKworCWltYXNrID0gfihpbnB3KEZNX0EoRk1fSU1TSzFVKSkpIDsKKworCWlmIChxdWV1ZSA9PSAwKSB7CisJCW91dHB3KEZNX0EoRk1fSU1TSzFVKSx+KGltYXNrJn5GTV9TVEVGUk1TKSkgOworCX0KKwlpZiAocXVldWUgPT0gMSkgeworCQlvdXRwdyhGTV9BKEZNX0lNU0sxVSksfihpbWFzayZ+Rk1fU1RFRlJNQTApKSA7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGRpc2FibGVfZm9ybWFjKHN0cnVjdCBzX3NtYyAqc21jKQoreworCS8qIGNsZWFyIGZvcm1hYyBJTVNLIDogMSBkaXNhYmxlcyBpcnEgKi8KKwlvdXRwdyhGTV9BKEZNX0lNU0sxVSksTVcpIDsKKwlvdXRwdyhGTV9BKEZNX0lNU0sxTCksTVcpIDsKKwlvdXRwdyhGTV9BKEZNX0lNU0syVSksTVcpIDsKKwlvdXRwdyhGTV9BKEZNX0lNU0syTCksTVcpIDsKKwlvdXRwdyhGTV9BKEZNX0lNU0szVSksTVcpIDsKKwlvdXRwdyhGTV9BKEZNX0lNU0szTCksTVcpIDsKK30KKworCitzdGF0aWMgdm9pZCBtYWNfcmluZ191cChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHVwKQoreworCWlmICh1cCkgeworCQlmb3JtYWNfcmN2X3Jlc3RhcnQoc21jKSA7CS8qIGVuYWJsZSByZWNlaXZlIGZ1bmN0aW9uICovCisJCXNtYy0+aHcubWFjX3JpbmdfaXNfdXAgPSBUUlVFIDsKKwkJbGxjX3Jlc3RhcnRfdHgoc21jKSA7CQkvKiBUWCBxdWV1ZSAqLworCX0KKwllbHNlIHsKKwkJLyogZGlzYWJsZSByZWNlaXZlIGZ1bmN0aW9uICovCisJCVNFVE1BU0soRk1fQShGTV9NRFJFRzEpLEZNX01ESVNSQ1YsRk1fQURERVQpIDsKKworCQkvKiBhYm9ydCBjdXJyZW50IHRyYW5zbWl0IGFjdGl2aXR5ICovCisJCW91dHB3KEZNX0EoRk1fQ01EUkVHMiksRk1fSUFDVFIpIDsKKworCQlzbWMtPmh3Lm1hY19yaW5nX2lzX3VwID0gRkFMU0UgOworCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSVNSIGhhbmRsaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIG1hYzFfaXJxIGlzIGluIGRydmZiaS5jCisgKi8KKworLyoKKyAqIG1hYzJfaXJxOglzdGF0dXMgYml0cyBmb3IgdGhlIHJlY2VpdmUgcXVldWUgMSwgYW5kIHJpbmcgc3RhdHVzCisgKiAJCXJpbmcgc3RhdHVzIGluZGljYXRpb24gYml0cworICovCit2b2lkIG1hYzJfaXJxKHN0cnVjdCBzX3NtYyAqc21jLCB1X3Nob3J0IGNvZGVfczJ1LCB1X3Nob3J0IGNvZGVfczJsKQoreworCXVfc2hvcnQJY2hhbmdlX3MybCA7CisJdV9zaG9ydAljaGFuZ2VfczJ1IDsKKworCS8qIChqZCkgMjItRmViLTE5OTkKKwkgKiBSZXN0YXJ0IDJfRE1heCBUaW1lciBhZnRlciBlbmQgb2YgY2xhaW1pbmcgb3IgYmVhY29uaW5nCisJICovCisJaWYgKGNvZGVfczJ1ICYgKEZNX1NDTE18Rk1fU0hJQ0xNfEZNX1NCRUN8Rk1fU09UUkJFQykpIHsKKwkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1JNVCxSTV9UWF9TVEFURV9DSEFOR0UpIDsKKwl9CisJZWxzZSBpZiAoY29kZV9zMmwgJiAoRk1fU1RLSVNTKSkgeworCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUk1ULFJNX1RYX1NUQVRFX0NIQU5HRSkgOworCX0KKworCS8qCisJICogWE9SIGN1cnJlbnQgc3QgYml0cyB3aXRoIHRoZSBsYXN0IHRvIGF2b2lkIHVzZWxlc3MgUk1UIGV2ZW50IHF1ZXVpbmcKKwkgKi8KKwljaGFuZ2VfczJsID0gc21jLT5ody5mcC5zMmwgXiBjb2RlX3MybCA7CisJY2hhbmdlX3MydSA9IHNtYy0+aHcuZnAuczJ1IF4gY29kZV9zMnUgOworCisJaWYgKChjaGFuZ2VfczJsICYgRk1fU1JOR09QKSB8fAorCQkoIXNtYy0+aHcubWFjX3JpbmdfaXNfdXAgJiYgKChjb2RlX3MybCAmIEZNX1NSTkdPUCkpKSkgeworCQlpZiAoY29kZV9zMmwgJiBGTV9TUk5HT1ApIHsKKwkJCW1hY19yaW5nX3VwKHNtYywxKSA7CisJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUk1ULFJNX1JJTkdfT1ApIDsKKwkJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1JpbmdPcF9DdCsrIDsKKwkJfQorCQllbHNlIHsKKwkJCW1hY19yaW5nX3VwKHNtYywwKSA7CisJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUk1ULFJNX1JJTkdfTk9OX09QKSA7CisJCX0KKwkJZ290byBtYWMyX2VuZCA7CisJfQorCWlmIChjb2RlX3MybCAmIEZNX1NNSVNGUk0pIHsJLyogbWlzc2VkIGZyYW1lICovCisJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ05vdENvcGllZF9DdCsrIDsKKwl9CisJaWYgKGNvZGVfczJ1ICYgKEZNX1NSQ1ZPVlIgfAkvKiByZWN2LiBGSUZPIG92ZXJmbG93ICovCisJCQlGTV9TUkJGTCkpIHsJLyogcmVjdi4gYnVmZmVyIGZ1bGwgKi8KKwkJc21jLT5ody5tYWNfY3QubWFjX3JfcmVzdGFydF9jb3VudGVyKysgOworLyoJCWZvcm1hY19yY3ZfcmVzdGFydChzbWMpIDsJKi8KKwkJc210X3N0YXRfY291bnRlcihzbWMsMSkgOworLyoJCWdvdG8gbWFjMl9lbmQgOwkJCSovCisJfQorCWlmIChjb2RlX3MydSAmIEZNX1NPVFJCRUMpCisJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9STVQsUk1fT1RIRVJfQkVBQ09OKSA7CisJaWYgKGNvZGVfczJ1ICYgRk1fU01ZQkVDKQorCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUk1ULFJNX01ZX0JFQUNPTikgOworCWlmIChjaGFuZ2VfczJ1ICYgY29kZV9zMnUgJiBGTV9TTE9DTE0pIHsKKwkJREJfUk1UTigyLCJSTVQgOiBsb3dlciBjbGFpbSByZWNlaXZlZFxuIiwwLDApIDsKKwl9CisJaWYgKChjb2RlX3MydSAmIEZNX1NNWUNMTSkgJiYgIShjb2RlX3MybCAmIEZNX1NEVVBDTE0pKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgbXkgY2xhaW0gYW5kIHRoYXQgY2xhaW0gaXMgbm90IGRldGVjdGVkIGFzIGEKKwkJICogZHVwbGljYXRlIG9uZS4KKwkJICovCisJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9STVQsUk1fTVlfQ0xBSU0pIDsKKwl9CisJaWYgKGNvZGVfczJsICYgRk1fU0RVUENMTSkgeworCQkvKgorCQkgKiBJZiBhIGR1cGxpY2F0ZSBjbGFpbSBmcmFtZSAoc2FtZSBTQSBidXQgVF9CaWQgIT0gVF9SZXEpCisJCSAqIHRoaXMgZmxhZyB3aWxsIGJlIHNldC4KKwkJICogSW4gdGhlIFJNVCBzdGF0ZSBtYWNoaW5lIHdlIG5lZWQgYSBSTV9WQUxJRF9DTEFJTSBldmVudAorCQkgKiB0byBkbyB0aGUgYXBwcm9wcmlhdGUgc3RhdGUgY2hhbmdlLgorCQkgKiBSTSgzNGMpCisJCSAqLworCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUk1ULFJNX1ZBTElEX0NMQUlNKSA7CisJfQorCWlmIChjaGFuZ2VfczJ1ICYgY29kZV9zMnUgJiBGTV9TSElDTE0pIHsKKwkJREJfUk1UTigyLCJSTVQgOiBoaWdoZXIgY2xhaW0gcmVjZWl2ZWRcbiIsMCwwKSA7CisJfQorCWlmICggKGNvZGVfczJsICYgRk1fU1RSVEVYUCkgfHwKKwkgICAgIChjb2RlX3MybCAmIEZNX1NUUlRFWFIpICkKKwkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1JNVCxSTV9UUlRfRVhQKSA7CisJaWYgKGNvZGVfczJsICYgRk1fU01VTFREQSkgeworCQkvKgorCQkgKiBUaGUgTUFDIGhhcyBmb3VuZCBhIDIuIE1BQyB3aXRoIHRoZSBzYW1lIGFkZHJlc3MuCisJCSAqIFNpZ25hbCBkdXBfYWRkcl90ZXN0ID0gZmFpbGVkIHRvIFJNVCBzdGF0ZSBtYWNoaW5lLgorCQkgKiBSTSgyNSkKKwkJICovCisJCXNtYy0+ci5kdXBfYWRkcl90ZXN0ID0gREFfRkFJTEVEIDsKKwkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1JNVCxSTV9EVVBfQUREUikgOworCX0KKwlpZiAoY29kZV9zMnUgJiBGTV9TQkVDKQorCQlzbWMtPmh3LmZwLmVycl9zdGF0cy5lcnJfYmVjX3N0YXQrKyA7CisJaWYgKGNvZGVfczJ1ICYgRk1fU0NMTSkKKwkJc21jLT5ody5mcC5lcnJfc3RhdHMuZXJyX2NsbV9zdGF0KysgOworCWlmIChjb2RlX3MybCAmIEZNX1NUVlhFWFApCisJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1R2eEV4cGlyZWRfQ3QrKyA7CisJaWYgKChjb2RlX3MydSAmIChGTV9TQkVDfEZNX1NDTE0pKSkgeworCQlpZiAoIShjaGFuZ2VfczJsICYgRk1fU1JOR09QKSAmJiAoc21jLT5ody5mcC5zMmwgJiBGTV9TUk5HT1ApKSB7CisJCQltYWNfcmluZ191cChzbWMsMCkgOworCQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1JNVCxSTV9SSU5HX05PTl9PUCkgOworCisJCQltYWNfcmluZ191cChzbWMsMSkgOworCQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1JNVCxSTV9SSU5HX09QKSA7CisJCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNSaW5nT3BfQ3QrKyA7CisJCX0KKwl9CisJaWYgKGNvZGVfczJsICYgRk1fU1BISU5WKQorCQlzbWMtPmh3LmZwLmVycl9zdGF0cy5lcnJfcGhpbnYrKyA7CisJaWYgKGNvZGVfczJsICYgRk1fU1NJRkcpCisJCXNtYy0+aHcuZnAuZXJyX3N0YXRzLmVycl9zaWZnX2RldCsrIDsKKwlpZiAoY29kZV9zMmwgJiBGTV9TVEtJU1MpCisJCXNtYy0+aHcuZnAuZXJyX3N0YXRzLmVycl90a2lzcysrIDsKKwlpZiAoY29kZV9zMmwgJiBGTV9TVEtFUlIpCisJCXNtYy0+aHcuZnAuZXJyX3N0YXRzLmVycl90a2VycisrIDsKKwlpZiAoY29kZV9zMmwgJiBGTV9TRlJNQ1RSKQorCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNGcmFtZV9DdCArPSAweDEwMDAwTCA7CisJaWYgKGNvZGVfczJsICYgRk1fU0VSUkNUUikKKwkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRXJyb3JfQ3QgKz0gMHgxMDAwMEwgOworCWlmIChjb2RlX3MybCAmIEZNX1NMU1RDVFIpCisJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0xvc3RfQ3QgICs9IDB4MTAwMDBMIDsKKwlpZiAoY29kZV9zMnUgJiBGTV9TRVJSU0YpIHsKKwkJU01UX1BBTklDKHNtYyxTTVRfRTAxMTQsIFNNVF9FMDExNF9NU0cpIDsKKwl9CittYWMyX2VuZDoKKwkvKiBub3RpY2Ugb2xkIHN0YXR1cyAqLworCXNtYy0+aHcuZnAuczJsID0gY29kZV9zMmwgOworCXNtYy0+aHcuZnAuczJ1ID0gY29kZV9zMnUgOworCW91dHB3KEZNX0EoRk1fSU1TSzJVKSx+bWFjX2ltc2sydSkgOworfQorCisvKgorICogbWFjM19pcnE6CXJlY2VpdmUgcXVldWUgMiBiaXRzIGFuZCBhZGRyZXNzIGRldGVjdGlvbiBiaXRzCisgKi8KK3ZvaWQgbWFjM19pcnEoc3RydWN0IHNfc21jICpzbWMsIHVfc2hvcnQgY29kZV9zM3UsIHVfc2hvcnQgY29kZV9zM2wpCit7CisJVU5VU0VEKGNvZGVfczNsKSA7CisKKwlpZiAoY29kZV9zM3UgJiAoRk1fU1JDVk9WUjIgfAkvKiByZWN2LiBGSUZPIG92ZXJmbG93ICovCisJCQlGTV9TUkJGTDIpKSB7CS8qIHJlY3YuIGJ1ZmZlciBmdWxsICovCisJCXNtYy0+aHcubWFjX2N0Lm1hY19yX3Jlc3RhcnRfY291bnRlcisrIDsKKwkJc210X3N0YXRfY291bnRlcihzbWMsMSk7CisJfQorCisKKwlpZiAoY29kZV9zM3UgJiBGTV9TUlBFUlJRMikgewkvKiBwYXJpdHkgZXJyb3IgcmVjZWl2ZSBxdWV1ZSAyICovCisJCVNNVF9QQU5JQyhzbWMsU01UX0UwMTE1LCBTTVRfRTAxMTVfTVNHKSA7CisJfQorCWlmIChjb2RlX3MzdSAmIEZNX1NSUEVSUlExKSB7CS8qIHBhcml0eSBlcnJvciByZWNlaXZlIHF1ZXVlIDIgKi8KKwkJU01UX1BBTklDKHNtYyxTTVRfRTAxMTYsIFNNVF9FMDExNl9NU0cpIDsKKwl9Cit9CisKKworLyoKKyAqIHRha2UgZm9ybWFjIG9mZmxpbmUKKyAqLworc3RhdGljIHZvaWQgZm9ybWFjX29mZmxpbmUoc3RydWN0IHNfc21jICpzbWMpCit7CisJb3V0cHcoRk1fQShGTV9DTURSRUcyKSxGTV9JQUNUUikgOy8qIGFib3J0IGN1cnJlbnQgdHJhbnNtaXQgYWN0aXZpdHkgKi8KKworCS8qIGRpc2FibGUgcmVjZWl2ZSBmdW5jdGlvbiAqLworCVNFVE1BU0soRk1fQShGTV9NRFJFRzEpLEZNX01ESVNSQ1YsRk1fQURERVQpIDsKKworCS8qIEZPUk1BQysgJ0luaXRpYWxpemUgTW9kZScgKi8KKwlTRVRNQVNLKEZNX0EoRk1fTURSRUcxKSxGTV9NSU5JVCxGTV9NTU9ERSkgOworCisJZGlzYWJsZV9mb3JtYWMoc21jKSA7CisJc21jLT5ody5tYWNfcmluZ19pc191cCA9IEZBTFNFIDsKKwlzbWMtPmh3Lmh3X3N0YXRlID0gU1RPUFBFRCA7Cit9CisKKy8qCisgKiBicmluZyBmb3JtYWMgb25saW5lCisgKi8KK3N0YXRpYyB2b2lkIGZvcm1hY19vbmxpbmUoc3RydWN0IHNfc21jICpzbWMpCit7CisJZW5hYmxlX2Zvcm1hYyhzbWMpIDsKKwlTRVRNQVNLKEZNX0EoRk1fTURSRUcxKSxGTV9NT05MSU5FIHwgRk1fU0VMUkEgfCBNRFIxSU5JVCB8CisJCXNtYy0+aHcuZnAucnhfbW9kZSwgRk1fTU1PREUgfCBGTV9TRUxSQSB8IEZNX0FERFJYKSA7Cit9CisKKy8qCisgKiBGT1JNQUMrIGZ1bGwgaW5pdC4gKHR4LCByeCwgdGltZXIsIGNvdW50ZXIsIGNsYWltICYgYmVhY29uKQorICovCitpbnQgaW5pdF9mcGx1cyhzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzbWMtPmh3LmZwLm5zYV9tb2RlID0gRk1fTVJOTlNBRk5NQSA7CisJc21jLT5ody5mcC5yeF9tb2RlID0gRk1fTURBTUEgOworCXNtYy0+aHcuZnAuZ3JvdXBfYWRkciA9IGZkZGlfYnJvYWRjYXN0IDsKKwlzbWMtPmh3LmZwLmZ1bmNfYWRkciA9IDAgOworCXNtYy0+aHcuZnAuZnJzZWxyZWdfaW5pdCA9IDAgOworCisJaW5pdF9kcml2ZXJfZnBsdXMoc21jKSA7CisJaWYgKHNtYy0+cy5zYXMgPT0gU01UX0RBUykKKwkJc21jLT5ody5mcC5tZHIzaW5pdCB8PSBGTV9NRU5EQVMgOworCisJc21jLT5ody5tYWNfY3QubWFjX25vYnVmX2NvdW50ZXIgPSAwIDsKKwlzbWMtPmh3Lm1hY19jdC5tYWNfcl9yZXN0YXJ0X2NvdW50ZXIgPSAwIDsKKworCXNtYy0+aHcuZnAuZm1fc3QxdSA9IChIV19QVFIpIEFERFIoQjBfU1QxVSkgOworCXNtYy0+aHcuZnAuZm1fc3QxbCA9IChIV19QVFIpIEFERFIoQjBfU1QxTCkgOworCXNtYy0+aHcuZnAuZm1fc3QydSA9IChIV19QVFIpIEFERFIoQjBfU1QyVSkgOworCXNtYy0+aHcuZnAuZm1fc3QybCA9IChIV19QVFIpIEFERFIoQjBfU1QyTCkgOworCXNtYy0+aHcuZnAuZm1fc3QzdSA9IChIV19QVFIpIEFERFIoQjBfU1QzVSkgOworCXNtYy0+aHcuZnAuZm1fc3QzbCA9IChIV19QVFIpIEFERFIoQjBfU1QzTCkgOworCisJc21jLT5ody5mcC5zMmwgPSBzbWMtPmh3LmZwLnMydSA9IDAgOworCXNtYy0+aHcubWFjX3JpbmdfaXNfdXAgPSAwIDsKKworCW1hY19jb3VudGVyX2luaXQoc21jKSA7CisKKwkvKiBjb252ZXJ0IEJDS0wgdW5pdHMgdG8gc3ltYm9sIHRpbWUgKi8KKwlzbWMtPmh3Lm1hY19wYS50X25lZyA9ICh1X2xvbmcpMCA7CisJc21jLT5ody5tYWNfcGEudF9wcmkgPSAodV9sb25nKTAgOworCisJLyogbWFrZSBzdXJlIGFsbCBQQ0kgc2V0dGluZ3MgYXJlIGNvcnJlY3QgKi8KKwltYWNfZG9fcGNpX2ZpeChzbWMpIDsKKworCXJldHVybihpbml0X21hYyhzbWMsMSkpIDsKKwkvKiBlbmFibGVfZm9ybWFjKHNtYykgOyAqLworfQorCitzdGF0aWMgaW50IGluaXRfbWFjKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgYWxsKQoreworCXVfc2hvcnQJdF9tYXgseCA7CisJdV9sb25nCXRpbWU9MCA7CisKKwkvKgorCSAqIGNsZWFyIG1lbW9yeQorCSAqLworCW91dHB3KEZNX0EoRk1fTURSRUcxKSxGTV9NSU5JVCkgOwkvKiBGT1JNQUMrIGluaXQgbW9kZSAqLworCXNldF9mb3JtYWNfYWRkcihzbWMpIDsKKwlvdXRwdyhGTV9BKEZNX01EUkVHMSksRk1fTU1FTUFDVCkgOwkvKiBGT1JNQUMrIG1lbW9yeSBhY3RpdiBtb2RlICovCisJLyogTm90ZTogTW9kZSByZWdpc3RlciAyIGlzIHNldCBoZXJlLCBpbmNhc2UgcGFyaXR5IGlzIGVuYWJsZWQuICovCisJb3V0cHcoRk1fQShGTV9NRFJFRzIpLHNtYy0+aHcuZnAubWRyMmluaXQpIDsKKworCWlmIChhbGwpIHsKKwkJaW5pdF9yYW0oc21jKSA7CisJfQorCWVsc2UgeworCQkvKgorCQkgKiByZXNldCB0aGUgSFBJLCB0aGUgTWFzdGVyIGFuZCB0aGUgQk1VcworCQkgKi8KKwkJb3V0cChBRERSKEIwX0NUUkwpLCBDVFJMX0hQSV9TRVQpIDsKKwkJdGltZSA9IGh3dF9xdWlja19yZWFkKHNtYykgOworCX0KKworCS8qCisJICogc2V0IGFsbCBwb2ludGVycywgZnJhbWVzIGV0YworCSAqLworCXNtdF9zcGxpdF91cF9maWZvKHNtYykgOworCisJaW5pdF90eChzbWMpIDsKKwlpbml0X3J4KHNtYykgOworCWluaXRfcmJjKHNtYykgOworCisJYnVpbGRfY2xhaW1fYmVhY29uKHNtYyxzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNUX1JlcSkgOworCisJLyogc2V0IFJYIHRocmVzaG9sZCAqLworCS8qIHNlZSBFcnJhdGEgI1NOMiBQaGFudG9tIHJlY2VpdmUgb3ZlcmZsb3cgKi8KKwlvdXRwdyhGTV9BKEZNX0ZSTVRIUiksMTQ8PDEyKSA7CQkvKiBzd2l0Y2ggb24gKi8KKworCS8qIHNldCBmb3JtYWMgd29yayBtb2RlICovCisJb3V0cHcoRk1fQShGTV9NRFJFRzEpLE1EUjFJTklUIHwgRk1fU0VMUkEgfCBzbWMtPmh3LmZwLnJ4X21vZGUpIDsKKwlvdXRwdyhGTV9BKEZNX01EUkVHMiksc21jLT5ody5mcC5tZHIyaW5pdCkgOworCW91dHB3KEZNX0EoRk1fTURSRUczKSxzbWMtPmh3LmZwLm1kcjNpbml0KSA7CisJb3V0cHcoRk1fQShGTV9GUlNFTFJFRyksc21jLT5ody5mcC5mcnNlbHJlZ19pbml0KSA7CisKKwkvKiBzZXQgdGltZXIgKi8KKwkvKgorCSAqIGVycmF0YSAjMjIgZnBsdXM6CisJICogVF9NQVggbXVzdCBub3QgYmUgRkZGRQorCSAqIG9yIG9uZSBvZiBGRkRGLCBGRkI4LCBGRjkxICgtMHgyNyBldGMuLikKKwkgKi8KKwl0X21heCA9ICh1X3Nob3J0KShzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNUX01heC8zMikgOworCXggPSB0X21heC8weDI3IDsKKwl4ICo9IDB4MjcgOworCWlmICgodF9tYXggPT0gMHhmZmZlKSB8fCAodF9tYXggLSB4ID09IDB4MTYpKQorCQl0X21heC0tIDsKKwlvdXRwdyhGTV9BKEZNX1RNQVgpLCh1X3Nob3J0KXRfbWF4KSA7CisKKwkvKiBCdWdGaXggZm9yIHJlcG9ydCAjMTAyMDQgKi8KKwlpZiAoc21jLT5taWIubVtNQUMwXS5mZGRpTUFDVHZ4VmFsdWUgPCAodV9sb25nKSAoLSBVUzJCQ0xLKDUyKSkpIHsKKwkJb3V0cHcoRk1fQShGTV9UVlgpLCAodV9zaG9ydCkgKC0gVVMyQkNMSyg1MikpLzI1NSAmIE1CKSA7CisJfSBlbHNlIHsKKwkJb3V0cHcoRk1fQShGTV9UVlgpLAorCQkJKHVfc2hvcnQpKChzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNUdnhWYWx1ZS8yNTUpICYgTUIpKSA7CisJfQorCisJb3V0cHcoRk1fQShGTV9DTURSRUcxKSxGTV9JQ0xMUykgOwkvKiBjbGVhciBzLWZyYW1lIGxvY2sgKi8KKwlvdXRwdyhGTV9BKEZNX0NNRFJFRzEpLEZNX0lDTExBMCkgOwkvKiBjbGVhciBhLWZyYW1lIGxvY2sgKi8KKwlvdXRwdyhGTV9BKEZNX0NNRFJFRzEpLEZNX0lDTExSKTsJLyogY2xlYXIgcmVjZWl2ZSBsb2NrICovCisKKwkvKiBBdXRvIHVubG9jayByZWNlaWNlIHRocmVzaG9sZCBmb3IgcmVjZWl2ZSBxdWV1ZSAxIGFuZCAyICovCisJb3V0cHcoRk1fQShGTV9VTkxDS0RMWSksKDB4ZmZ8KDB4ZmY8PDgpKSkgOworCisJcnRtX2luaXQoc21jKSA7CQkJCS8qIFJULU1vbml0b3IgKi8KKworCWlmICghYWxsKSB7CisJCS8qCisJCSAqIGFmdGVyIDEwbXMsIHJlc2V0IHRoZSBCTVVzIGFuZCByZXBhaXIgdGhlIHJpbmdzCisJCSAqLworCQlod3Rfd2FpdF90aW1lKHNtYyx0aW1lLE1TMkJDTEsoMTApKSA7CisJCW91dHBkKEFERFIoQjBfUjFfQ1NSKSxDU1JfU0VUX1JFU0VUKSA7CisJCW91dHBkKEFERFIoQjBfWEFfQ1NSKSxDU1JfU0VUX1JFU0VUKSA7CisJCW91dHBkKEFERFIoQjBfWFNfQ1NSKSxDU1JfU0VUX1JFU0VUKSA7CisJCW91dHAoQUREUihCMF9DVFJMKSwgQ1RSTF9IUElfQ0xSKSA7CisJCW91dHBkKEFERFIoQjBfUjFfQ1NSKSxDU1JfQ0xSX1JFU0VUKSA7CisJCW91dHBkKEFERFIoQjBfWEFfQ1NSKSxDU1JfQ0xSX1JFU0VUKSA7CisJCW91dHBkKEFERFIoQjBfWFNfQ1NSKSxDU1JfQ0xSX1JFU0VUKSA7CisJCWlmICghc21jLT5ody5od19pc182NGJpdCkgeworCQkJb3V0cGQoQUREUihCNF9SMV9GKSwgUlhfV0FURVJNQVJLKSA7CisJCQlvdXRwZChBRERSKEI1X1hBX0YpLCBUWF9XQVRFUk1BUkspIDsKKwkJCW91dHBkKEFERFIoQjVfWFNfRiksIFRYX1dBVEVSTUFSSykgOworCQl9CisJCXNtYy0+aHcuaHdfc3RhdGUgPSBTVE9QUEVEIDsKKwkJbWFjX2Rydl9yZXBhaXJfZGVzY3Ioc21jKSA7CisJfQorCXNtYy0+aHcuaHdfc3RhdGUgPSBTVEFSVEVEIDsKKworCXJldHVybigwKSA7Cit9CisKKworLyoKKyAqIGNhbGxlZCBieSBDRk0KKyAqLwordm9pZCBjb25maWdfbXV4KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbXV4KQoreworCXBsY19jb25maWdfbXV4KHNtYyxtdXgpIDsKKworCVNFVE1BU0soRk1fQShGTV9NRFJFRzEpLEZNX1NFTFJBLEZNX1NFTFJBKSA7Cit9CisKKy8qCisgKiBjYWxsZWQgYnkgUk1UCisgKiBlbmFibGUgQ0xBSU0vQkVBQ09OIGludGVycnVwdHMKKyAqIChvbmx5IGNhbGxlZCBpZiB0aGVzZSBldmVudHMgYXJlIG9mIGludGVyZXN0LCBlLmcuIGluIERFVEVDVCBzdGF0ZQorICogdGhlIGludGVycnVwdCBtdXN0IG5vdCBiZSBwZXJtYW5lbnRseSBlbmFibGVkCisgKiBSTVQgY2FsbHMgdGhpcyBmdW5jdGlvbiBwZXJpb2RpY2FsbHkgKHRpbWVyIGRyaXZlbiBwb2xsaW5nKQorICovCit2b2lkIHNtX21hY19jaGVja19iZWFjb25fY2xhaW0oc3RydWN0IHNfc21jICpzbWMpCit7CisJLyogc2V0IGZvcm1hYyBJTVNLIDogMCBlbmFibGVzIGlycSAqLworCW91dHB3KEZNX0EoRk1fSU1TSzJVKSx+KG1hY19pbXNrMnUgfCBtYWNfYmVhY29uX2ltc2sydSkpIDsKKwkvKiB0aGUgZHJpdmVyIG11c3QgcmVjZWl2ZSB0aGUgZGlyZWN0ZWQgYmVhY29ucyAqLworCWZvcm1hY19yY3ZfcmVzdGFydChzbWMpIDsKKwlwcm9jZXNzX3JlY2VpdmUoc21jKSA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaW50ZXJmYWNlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBjb250cm9sIE1BQyBsYXllcgkoY2FsbGVkIGJ5IFJNVCkKKyAqLwordm9pZCBzbV9tYV9jb250cm9sKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbW9kZSkKK3sKKwlzd2l0Y2gobW9kZSkgeworCWNhc2UgTUFfT0ZGTElORSA6CisJCS8qIEFkZCB0byBtYWtlIHRoZSBNQUMgb2ZmbGluZSBpbiBSTTBfSVNPTEFURUQgc3RhdGUgKi8KKwkJZm9ybWFjX29mZmxpbmUoc21jKSA7CisJCWJyZWFrIDsKKwljYXNlIE1BX1JFU0VUIDoKKwkJKHZvaWQpaW5pdF9tYWMoc21jLDApIDsKKwkJYnJlYWsgOworCWNhc2UgTUFfQkVBQ09OIDoKKwkJZm9ybWFjX29ubGluZShzbWMpIDsKKwkJYnJlYWsgOworCWNhc2UgTUFfRElSRUNURUQgOgorCQlkaXJlY3RlZF9iZWFjb24oc21jKSA7CisJCWJyZWFrIDsKKwljYXNlIE1BX1RSRVEgOgorCQkvKgorCQkgKiBubyBhY3Rpb25zIG5lY2Vzc2FyeSwgVFJFUSBpcyBhbHJlYWR5IHNldAorCQkgKi8KKwkJYnJlYWsgOworCX0KK30KKworaW50IHNtX21hY19nZXRfdHhfc3RhdGUoc3RydWN0IHNfc21jICpzbWMpCit7CisJcmV0dXJuKChpbnB3KEZNX0EoRk1fU1RNQ0hOKSk+PjQpJjcpIDsKK30KKworLyoKKyAqIG11bHRpY2FzdCBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgc3RydWN0IHNfZnBtYyogbWFjX2dldF9tY190YWJsZShzdHJ1Y3Qgc19zbWMgKnNtYywKKwkJCQkgICAgICAgc3RydWN0IGZkZGlfYWRkciAqdXNlciwKKwkJCQkgICAgICAgc3RydWN0IGZkZGlfYWRkciAqb3duLAorCQkJCSAgICAgICBpbnQgZGVsLCBpbnQgY2FuKQoreworCXN0cnVjdCBzX2ZwbWMJKnRiIDsKKwlzdHJ1Y3Qgc19mcG1jCSpzbG90IDsKKwl1X2NoYXIJKnAgOworCWludCBpIDsKKworCS8qCisJICogc2V0IG93biA9IGNhbih1c2VyKQorCSAqLworCSpvd24gPSAqdXNlciA7CisJaWYgKGNhbikgeworCQlwID0gb3duLT5hIDsKKwkJZm9yIChpID0gMCA7IGkgPCA2IDsgaSsrLCBwKyspCisJCQkqcCA9IGNhbm9uaWNhbFsqcF0gOworCX0KKwlzbG90ID0gTlVMTDsKKwlmb3IgKGkgPSAwLCB0YiA9IHNtYy0+aHcuZnAubWMudGFibGUgOyBpIDwgRlBNQVhfTVVMVElDQVNUIDsgaSsrLCB0YisrKXsKKwkJaWYgKCF0Yi0+bikgewkJLyogbm90IHVzZWQgKi8KKwkJCWlmICghZGVsICYmICFzbG90KQkvKiBpZiAhZGVsIHNhdmUgZmlyc3QgZnJlZSAqLworCQkJCXNsb3QgPSB0YiA7CisJCQljb250aW51ZSA7CisJCX0KKwkJaWYgKG1lbWNtcCgoY2hhciAqKSZ0Yi0+YSwoY2hhciAqKW93biw2KSkKKwkJCWNvbnRpbnVlIDsKKwkJcmV0dXJuKHRiKSA7CisJfQorCXJldHVybihzbG90KSA7CQkJLyogcmV0dXJuIGZpcnN0IGZyZWUgb3IgTlVMTCAqLworfQorCisvKgorCUJFR0lOX01BTlVBTF9FTlRSWShpZixmdW5jO290aGVyczsyKQorCisJdm9pZCBtYWNfY2xlYXJfbXVsdGljYXN0KHNtYykKKwlzdHJ1Y3Qgc19zbWMgKnNtYyA7CisKK0Z1bmN0aW9uCURPV05DQUxMCShTTVQsIGZwbHVzdG0uYykKKwkJQ2xlYXIgYWxsIG11bHRpY2FzdCBlbnRyaWVzCisKKwlFTkRfTUFOVUFMX0VOVFJZKCkKKyAqLwordm9pZCBtYWNfY2xlYXJfbXVsdGljYXN0KHN0cnVjdCBzX3NtYyAqc21jKQoreworCXN0cnVjdCBzX2ZwbWMJKnRiIDsKKwlpbnQgaSA7CisKKwlzbWMtPmh3LmZwLm9zX3Nsb3RzX3VzZWQgPSAwIDsJLyogbm90ZSB0aGUgU01UIGFkZHJlc3NlcyAqLworCQkJCQkvKiB3aWxsIG5vdCBiZSBkZWxldGVkICovCisJZm9yIChpID0gMCwgdGIgPSBzbWMtPmh3LmZwLm1jLnRhYmxlIDsgaSA8IEZQTUFYX01VTFRJQ0FTVCA7IGkrKywgdGIrKyl7CisJCWlmICghdGItPnBlcm0pIHsKKwkJCXRiLT5uID0gMCA7CisJCX0KKwl9Cit9CisKKy8qCisJQkVHSU5fTUFOVUFMX0VOVFJZKGlmLGZ1bmM7b3RoZXJzOzIpCisKKwlpbnQgbWFjX3NldF9mdW5jX2FkZHIoc21jLGZfYWRkcikKKwlzdHJ1Y3Qgc19zbWMgKnNtYyA7CisJdV9sb25nIGZfYWRkciA7CisKK0Z1bmN0aW9uCURPV05DQUxMCShTTVQsIGZwbHVzdG0uYykKKwkJU2V0IGEgVG9rZW4tUmluZyBmdW5jdGlvbmFsIGFkZHJlc3MsIHRoZSBhZGRyZXNzIHdpbGwKKwkJYmUgYWN0aXZhdGVkIGFmdGVyIGNhbGxpbmcgbWFjX3VwZGF0ZV9tdWx0aWNhc3QoKQorCitQYXJhCWZfYWRkcglmdW5jdGlvbmFsIGJpdHMgaW4gbm9uLWNhbm9uaWNhbCBmb3JtYXQKKworUmV0dXJucwkwOiBhbHdheXMgc3VjY2VzcworCisJRU5EX01BTlVBTF9FTlRSWSgpCisgKi8KK2ludCBtYWNfc2V0X2Z1bmNfYWRkcihzdHJ1Y3Qgc19zbWMgKnNtYywgdV9sb25nIGZfYWRkcikKK3sKKwlzbWMtPmh3LmZwLmZ1bmNfYWRkciA9IGZfYWRkciA7CisJcmV0dXJuKDApIDsKK30KKworCisvKgorCUJFR0lOX01BTlVBTF9FTlRSWShpZixmdW5jO290aGVyczsyKQorCisJaW50IG1hY19hZGRfbXVsdGljYXN0KHNtYyxhZGRyLGNhbikKKwlzdHJ1Y3Qgc19zbWMgKnNtYyA7CisJc3RydWN0IGZkZGlfYWRkciAqYWRkciA7CisJaW50IGNhbiA7CisKK0Z1bmN0aW9uCURPV05DQUxMCShTTUMsIGZwbHVzdG0uYykKKwkJQWRkIGFuIGVudHJ5IHRvIHRoZSBtdWx0aWNhc3QgdGFibGUKKworUGFyYQlhZGRyCXBvaW50ZXIgdG8gYSBtdWx0aWNhc3QgYWRkcmVzcworCWNhbgk9IDA6CXRoZSBtdWx0aWNhc3QgYWRkcmVzcyBoYXMgdGhlIHBoeXNpY2FsIGZvcm1hdAorCQk9IDE6CXRoZSBtdWx0aWNhc3QgYWRkcmVzcyBoYXMgdGhlIGNhbm9uaWNhbCBmb3JtYXQKKwkJfCAweDgwCXBlcm1hbmVudAorCitSZXR1cm5zCTA6IHN1Y2Nlc3MKKwkxOiBhZGRyZXNzIHRhYmxlIGZ1bGwKKworTm90ZQlBZnRlciBhICdkcml2ZXIgcmVzZXQnIG9yIGEgJ3N0YXRpb24gc2V0IGFkZHJlc3MnIGFsbAorCWVudHJpZXMgb2YgdGhlIG11bHRpY2FzdCB0YWJsZSBhcmUgY2xlYXJlZC4KKwlJbiB0aGlzIGNhc2UgdGhlIGRyaXZlciBoYXMgdG8gZmlsbCB0aGUgbXVsdGljYXN0IHRhYmxlIGFnYWluLgorCUFmdGVyIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGRlcGVuZGVudCBtb2R1bGUgZmlsbGVkCisJdGhlIG11bHRpY2FzdCB0YWJsZSBpdCBtdXN0IGNhbGwgbWFjX3VwZGF0ZV9tdWx0aWNhc3QKKwl0byBhY3RpdmF0ZSB0aGUgbmV3IG11bHRpY2FzdCBhZGRyZXNzZXMhCisKKwlFTkRfTUFOVUFMX0VOVFJZKCkKKyAqLworaW50IG1hY19hZGRfbXVsdGljYXN0KHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3QgZmRkaV9hZGRyICphZGRyLCBpbnQgY2FuKQoreworCVNLX0xPQ19ERUNMKHN0cnVjdCBmZGRpX2FkZHIsb3duKSA7CisJc3RydWN0IHNfZnBtYwkqdGIgOworCisJLyoKKwkgKiBjaGVjayBpZiB0aGVyZSBhcmUgZnJlZSB0YWJsZSBlbnRyaWVzCisJICovCisJaWYgKGNhbiAmIDB4ODApIHsKKwkJaWYgKHNtYy0+aHcuZnAuc210X3Nsb3RzX3VzZWQgPj0gU01UX01BWF9NVUxUSSkgeworCQkJcmV0dXJuKDEpIDsKKwkJfQorCX0KKwllbHNlIHsKKwkJaWYgKHNtYy0+aHcuZnAub3Nfc2xvdHNfdXNlZCA+PSBGUE1BWF9NVUxUSUNBU1QtU01UX01BWF9NVUxUSSkgeworCQkJcmV0dXJuKDEpIDsKKwkJfQorCX0KKworCS8qCisJICogZmluZCBlbXB0eSBzbG90CisJICovCisJaWYgKCEodGIgPSBtYWNfZ2V0X21jX3RhYmxlKHNtYyxhZGRyLCZvd24sMCxjYW4gJiB+MHg4MCkpKQorCQlyZXR1cm4oMSkgOworCXRiLT5uKysgOworCXRiLT5hID0gb3duIDsKKwl0Yi0+cGVybSA9IChjYW4gJiAweDgwKSA/IDEgOiAwIDsKKworCWlmIChjYW4gJiAweDgwKQorCQlzbWMtPmh3LmZwLnNtdF9zbG90c191c2VkKysgOworCWVsc2UKKwkJc21jLT5ody5mcC5vc19zbG90c191c2VkKysgOworCisJcmV0dXJuKDApIDsKK30KKworLyoKKwlCRUdJTl9NQU5VQUxfRU5UUlkoaWYsZnVuYztvdGhlcnM7MikKKworCXZvaWQgbWFjX2RlbF9tdWx0aWNhc3Qoc21jLGFkZHIsY2FuKQorCXN0cnVjdCBzX3NtYyAqc21jIDsKKwlzdHJ1Y3QgZmRkaV9hZGRyICphZGRyIDsKKwlpbnQgY2FuIDsKKworRnVuY3Rpb24JRE9XTkNBTEwJKFNNVCwgZnBsdXN0bS5jKQorCQlEZWxldGUgYW4gZW50cnkgZnJvbSB0aGUgbXVsdGljYXN0IHRhYmxlCisKK1BhcmEJYWRkcglwb2ludGVyIHRvIGEgbXVsdGljYXN0IGFkZHJlc3MKKwljYW4JPSAwOgl0aGUgbXVsdGljYXN0IGFkZHJlc3MgaGFzIHRoZSBwaHlzaWNhbCBmb3JtYXQKKwkJPSAxOgl0aGUgbXVsdGljYXN0IGFkZHJlc3MgaGFzIHRoZSBjYW5vbmljYWwgZm9ybWF0CisJCXwgMHg4MAlwZXJtYW5lbnQKKworCUVORF9NQU5VQUxfRU5UUlkoKQorICovCit2b2lkIG1hY19kZWxfbXVsdGljYXN0KHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3QgZmRkaV9hZGRyICphZGRyLCBpbnQgY2FuKQoreworCVNLX0xPQ19ERUNMKHN0cnVjdCBmZGRpX2FkZHIsb3duKSA7CisJc3RydWN0IHNfZnBtYwkqdGIgOworCisJaWYgKCEodGIgPSBtYWNfZ2V0X21jX3RhYmxlKHNtYyxhZGRyLCZvd24sMSxjYW4gJiB+MHg4MCkpKQorCQlyZXR1cm4gOworCS8qCisJICogcGVybWFuZW50IGFkZHJlc3NlcyBtdXN0IGJlIGRlbGV0ZWQgd2l0aCBwZXJtIGJpdAorCSAqIGFuZCB2aWNlIHZlcnNhCisJICovCisJaWYgKCggdGItPnBlcm0gJiYgIChjYW4gJiAweDgwKSkgfHwKKwkgICAgKCF0Yi0+cGVybSAmJiAhKGNhbiAmIDB4ODApKSkgeworCQkvKgorCQkgKiBkZWxldGUgaXQKKwkJICovCisJCWlmICh0Yi0+bikgeworCQkJdGItPm4tLSA7CisJCQlpZiAodGItPnBlcm0pIHsKKwkJCQlzbWMtPmh3LmZwLnNtdF9zbG90c191c2VkLS0gOworCQkJfQorCQkJZWxzZSB7CisJCQkJc21jLT5ody5mcC5vc19zbG90c191c2VkLS0gOworCQkJfQorCQl9CisJfQorfQorCisvKgorICogbW9kZQorICovCisKKyNkZWZpbmUgUlhfTU9ERV9QUk9NCQkweDEKKyNkZWZpbmUgUlhfTU9ERV9BTExfTVVMVEkJMHgyCisKKy8qCisJQkVHSU5fTUFOVUFMX0VOVFJZKGlmLGZ1bmM7b3RoZXJzOzIpCisKKwl2b2lkIG1hY191cGRhdGVfbXVsdGljYXN0KHNtYykKKwlzdHJ1Y3Qgc19zbWMgKnNtYyA7CisKK0Z1bmN0aW9uCURPV05DQUxMCShTTVQsIGZwbHVzdG0uYykKKwkJVXBkYXRlIEZPUk1BQyBtdWx0aWNhc3QgcmVnaXN0ZXJzCisKKwlFTkRfTUFOVUFMX0VOVFJZKCkKKyAqLwordm9pZCBtYWNfdXBkYXRlX211bHRpY2FzdChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzdHJ1Y3Qgc19mcG1jCSp0YiA7CisJdV9jaGFyCSpmdSA7CisJaW50CWkgOworCisJLyoKKwkgKiBpbnZhbGlkYXRlIHRoZSBDQU0KKwkgKi8KKwlvdXRwdyhGTV9BKEZNX0FGQ01EKSxGTV9JSU5WX0NBTSkgOworCisJLyoKKwkgKiBzZXQgdGhlIGZ1bmN0aW9uYWwgYWRkcmVzcworCSAqLworCWlmIChzbWMtPmh3LmZwLmZ1bmNfYWRkcikgeworCQlmdSA9ICh1X2NoYXIgKikgJnNtYy0+aHcuZnAuZnVuY19hZGRyIDsKKwkJb3V0cHcoRk1fQShGTV9BRk1BU0syKSwweGZmZmYpIDsKKwkJb3V0cHcoRk1fQShGTV9BRk1BU0sxKSwodV9zaG9ydCkgfigoZnVbMF0gPDwgOCkgKyBmdVsxXSkpIDsKKwkJb3V0cHcoRk1fQShGTV9BRk1BU0swKSwodV9zaG9ydCkgfigoZnVbMl0gPDwgOCkgKyBmdVszXSkpIDsKKwkJb3V0cHcoRk1fQShGTV9BRlBFUlMpLEZNX1ZBTElEfEZNX0RBKSA7CisJCW91dHB3KEZNX0EoRk1fQUZDT01QMiksIDB4YzAwMCkgOworCQlvdXRwdyhGTV9BKEZNX0FGQ09NUDEpLCAweDAwMDApIDsKKwkJb3V0cHcoRk1fQShGTV9BRkNPTVAwKSwgMHgwMDAwKSA7CisJCW91dHB3KEZNX0EoRk1fQUZDTUQpLEZNX0lXUklURV9DQU0pIDsKKwl9CisKKwkvKgorCSAqIHNldCB0aGUgbWFzayBhbmQgdGhlIHBlcnNvbmFsaXR5IHJlZ2lzdGVyKHMpCisJICovCisJb3V0cHcoRk1fQShGTV9BRk1BU0swKSwweGZmZmYpIDsKKwlvdXRwdyhGTV9BKEZNX0FGTUFTSzEpLDB4ZmZmZikgOworCW91dHB3KEZNX0EoRk1fQUZNQVNLMiksMHhmZmZmKSA7CisJb3V0cHcoRk1fQShGTV9BRlBFUlMpLEZNX1ZBTElEfEZNX0RBKSA7CisKKwlmb3IgKGkgPSAwLCB0YiA9IHNtYy0+aHcuZnAubWMudGFibGU7IGkgPCBGUE1BWF9NVUxUSUNBU1Q7IGkrKywgdGIrKykgeworCQlpZiAodGItPm4pIHsKKwkJCUNIRUNLX0NBTSgpIDsKKworCQkJLyoKKwkJCSAqIHdyaXRlIHRoZSBtdWx0aWNhc3QgYWRkcmVzcyBpbnRvIHRoZSBDQU0KKwkJCSAqLworCQkJb3V0cHcoRk1fQShGTV9BRkNPTVAyKSwKKwkJCQkodV9zaG9ydCkoKHRiLT5hLmFbMF08PDgpK3RiLT5hLmFbMV0pKSA7CisJCQlvdXRwdyhGTV9BKEZNX0FGQ09NUDEpLAorCQkJCSh1X3Nob3J0KSgodGItPmEuYVsyXTw8OCkrdGItPmEuYVszXSkpIDsKKwkJCW91dHB3KEZNX0EoRk1fQUZDT01QMCksCisJCQkJKHVfc2hvcnQpKCh0Yi0+YS5hWzRdPDw4KSt0Yi0+YS5hWzVdKSkgOworCQkJb3V0cHcoRk1fQShGTV9BRkNNRCksRk1fSVdSSVRFX0NBTSkgOworCQl9CisJfQorfQorCisvKgorCUJFR0lOX01BTlVBTF9FTlRSWShpZixmdW5jO290aGVyczszKQorCisJdm9pZCBtYWNfc2V0X3J4X21vZGUoc21jLG1vZGUpCisJc3RydWN0IHNfc21jICpzbWMgOworCWludCBtb2RlIDsKKworRnVuY3Rpb24JRE9XTkNBTEwvSU5URVJOCShTTVQsIGZwbHVzdG0uYykKKwkJVGhpcyBmdW5jdGlvbiBlbmFibGVzIC8gZGlzYWJsZXMgdGhlIHNlbGVjdGVkIHJlY2VpdmUuCisJCURvbid0IGNhbGwgdGhpcyBmdW5jdGlvbiBpZiB0aGUgaGFyZHdhcmUgbW9kdWxlIGlzCisJCXVzZWQgLS0gdXNlIG1hY19kcnZfcnhfbW9kZSgpIGluc3RlYWQgb2YuCisKK1BhcmEJbW9kZSA9CTEJUlhfRU5BQkxFX0FMTE1VTFRJCWVuYWJsZSBhbGwgbXVsdGljYXN0cworCQkyCVJYX0RJU0FCTEVfQUxMTVVMVEkJZGlzYWJsZSAiZW5hYmxlIGFsbCBtdWx0aWNhc3RzIgorCQkzCVJYX0VOQUJMRV9QUk9NSVNDCWVuYWJsZSBwcm9taXNjb3VzCisJCTQJUlhfRElTQUJMRV9QUk9NSVNDCWRpc2FibGUgcHJvbWlzY291cworCQk1CVJYX0VOQUJMRV9OU0EJCWVuYWJsZSByZWNlcHRpb24gb2YgTlNBIGZyYW1lcworCQk2CVJYX0RJU0FCTEVfTlNBCQlkaXNhYmxlIHJlY2VwdGlvbiBvZiBOU0EgZnJhbWVzCisKK05vdGUJVGhlIHNlbGVjdGVkIHJlY2VpdmUgbW9kZXMgd2lsbCBiZSBsb3N0IGFmdGVyICdkcml2ZXIgcmVzZXQnCisJb3IgJ3NldCBzdGF0aW9uIGFkZHJlc3MnCisKKwlFTkRfTUFOVUFMX0VOVFJZCisgKi8KK3ZvaWQgbWFjX3NldF9yeF9tb2RlKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbW9kZSkKK3sKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIFJYX0VOQUJMRV9BTExNVUxUSSA6CisJCXNtYy0+aHcuZnAucnhfcHJvbSB8PSBSWF9NT0RFX0FMTF9NVUxUSSA7CisJCWJyZWFrIDsKKwljYXNlIFJYX0RJU0FCTEVfQUxMTVVMVEkgOgorCQlzbWMtPmh3LmZwLnJ4X3Byb20gJj0gflJYX01PREVfQUxMX01VTFRJIDsKKwkJYnJlYWsgOworCWNhc2UgUlhfRU5BQkxFX1BST01JU0MgOgorCQlzbWMtPmh3LmZwLnJ4X3Byb20gfD0gUlhfTU9ERV9QUk9NIDsKKwkJYnJlYWsgOworCWNhc2UgUlhfRElTQUJMRV9QUk9NSVNDIDoKKwkJc21jLT5ody5mcC5yeF9wcm9tICY9IH5SWF9NT0RFX1BST00gOworCQlicmVhayA7CisJY2FzZSBSWF9FTkFCTEVfTlNBIDoKKwkJc21jLT5ody5mcC5uc2FfbW9kZSA9IEZNX01EQU1BIDsKKwkJc21jLT5ody5mcC5yeF9tb2RlID0gKHNtYy0+aHcuZnAucnhfbW9kZSAmIH5GTV9BRERFVCkgfAorCQkJc21jLT5ody5mcC5uc2FfbW9kZSA7CisJCWJyZWFrIDsKKwljYXNlIFJYX0RJU0FCTEVfTlNBIDoKKwkJc21jLT5ody5mcC5uc2FfbW9kZSA9IEZNX01STk5TQUZOTUEgOworCQlzbWMtPmh3LmZwLnJ4X21vZGUgPSAoc21jLT5ody5mcC5yeF9tb2RlICYgfkZNX0FEREVUKSB8CisJCQlzbWMtPmh3LmZwLm5zYV9tb2RlIDsKKwkJYnJlYWsgOworCX0KKwlpZiAoc21jLT5ody5mcC5yeF9wcm9tICYgUlhfTU9ERV9QUk9NKSB7CisJCXNtYy0+aHcuZnAucnhfbW9kZSA9IEZNX01MSU1QUk9NIDsKKwl9CisJZWxzZSBpZiAoc21jLT5ody5mcC5yeF9wcm9tICYgUlhfTU9ERV9BTExfTVVMVEkpIHsKKwkJc21jLT5ody5mcC5yeF9tb2RlID0gc21jLT5ody5mcC5uc2FfbW9kZSB8IEZNX0VYR1BBMCA7CisJfQorCWVsc2UKKwkJc21jLT5ody5mcC5yeF9tb2RlID0gc21jLT5ody5mcC5uc2FfbW9kZSA7CisJU0VUTUFTSyhGTV9BKEZNX01EUkVHMSksc21jLT5ody5mcC5yeF9tb2RlLEZNX0FERFJYKSA7CisJbWFjX3VwZGF0ZV9tdWx0aWNhc3Qoc21jKSA7Cit9CisKKy8qCisJQkVHSU5fTUFOVUFMX0VOVFJZKG1vZHVsZTt0ZXN0czszKQorCUhvdyB0byB0ZXN0IHRoZSBSZXN0cmljdGVkIFRva2VuIE1vbml0b3IKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlvIEluc2VydCBhIGJyZWFrIHBvaW50IGluIHRoZSBmdW5jdGlvbiBydG1faXJxKCkKKwlvIFJlbW92ZSBhbGwgc3RhdGlvbnMgd2l0aCBhIHJlc3RyaWN0ZWQgdG9rZW4gbW9uaXRvciBmcm9tIHRoZQorCSAgbmV0d29yay4KKwlvIENvbm5lY3QgYSBVUFBTIElTQSBvciBFSVNBIHN0YXRpb24gdG8gdGhlIG5ldHdvcmsuCisJbyBHaXZlIHRoZSBGT1JNQUMgb2YgVVBQUyBzdGF0aW9uIHRoZSBjb21tYW5kIHRvIHNlbmQKKwkgIHJlc3RyaWN0ZWQgdG9rZW5zIHVudGlsIHRoZSByaW5nIGJlY29tZXMgaW5zdGFibGUuCisJbyBOb3cgY29ubmVjdCB5b3VyIHRlc3QgdGVzdCBjbGllbnQuCisJbyBUaGUgcmVzdHJpY3RlZCB0b2tlbiBtb25pdG9yIHNob3VsZCBkZXRlY3QgdGhlIHJlc3RyaWN0ZWQgdG9rZW4sCisJICBhbmQgeW91ciBicmVhayBwb2ludCB3aWxsIGJlIHJlYWNoZWQuCisJbyBZb3UgY2FuIG92c2VydmUgaG93IHRoZSBzdGF0aW9uIHdpbGwgY2xlYW4gdGhlIHJpbmcuCisKKwlFTkRfTUFOVUFMX0VOVFJZCisgKi8KK3ZvaWQgcnRtX2lycShzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlvdXRwdyhBRERSKEIyX1JUTV9DUlRMKSxUSU1fQ0xfSVJRKSA7CQkvKiBjbGVhciBJUlEgKi8KKwlpZiAoaW5wdyhBRERSKEIyX1JUTV9DUlRMKSkgJiBUSU1fUkVTX1RPSykgeworCQlvdXRwdyhGTV9BKEZNX0NNRFJFRzEpLEZNX0lDTCkgOwkvKiBmb3JjZSBjbGFpbSAqLworCQlEQl9STVQoIlJNVDogZmRkaVBBVEhUX1Jtb2RlIGV4cGlyZWRcbiIsMCwwKSA7CisJCUFJWF9FVkVOVChzbWMsICh1X2xvbmcpIEZERElfUklOR19TVEFUVVMsCisJCQkJKHVfbG9uZykgRkRESV9TTVRfRVZFTlQsCisJCQkJKHVfbG9uZykgRkRESV9SVFQsIHNtdF9nZXRfZXZlbnRfd29yZChzbWMpKTsKKwl9CisJb3V0cHcoQUREUihCMl9SVE1fQ1JUTCksVElNX1NUQVJUKSA7CS8qIGVuYWJsZSBSVE0gbW9uaXRvcmluZyAqLworfQorCitzdGF0aWMgdm9pZCBydG1faW5pdChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlvdXRwZChBRERSKEIyX1JUTV9JTkkpLDApIDsJCS8qIHRpbWVyID0gMCAqLworCW91dHB3KEFERFIoQjJfUlRNX0NSVEwpLFRJTV9TVEFSVCkgOwkvKiBlbmFibGUgSVJRICovCit9CisKK3ZvaWQgcnRtX3NldF90aW1lcihzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwkvKgorCSAqIE1JQiB0aW1lciBhbmQgaGFyZHdhcmUgdGltZXIgaGF2ZSB0aGUgc2FtZSByZXNvbHV0aW9uIG9mIDgwblMKKwkgKi8KKwlEQl9STVQoIlJNVDogc2V0dGluZyBuZXcgZmRkaVBBVEhUX1Jtb2RlLCB0ID0gJWQgbnMgXG4iLAorCQkoaW50KSBzbWMtPm1pYi5hW1BBVEgwXS5mZGRpUEFUSFRfUm1vZGUsMCkgOworCW91dHBkKEFERFIoQjJfUlRNX0lOSSksc21jLT5taWIuYVtQQVRIMF0uZmRkaVBBVEhUX1Jtb2RlKSA7Cit9CisKK3N0YXRpYyB2b2lkIHNtdF9zcGxpdF91cF9maWZvKHN0cnVjdCBzX3NtYyAqc21jKQoreworCisvKgorCUJFR0lOX01BTlVBTF9FTlRSWShtb2R1bGU7bWVtOzEpCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVJFQ0VJVkUgQlVGRkVSIE1FTU9SWSBESVZFUlNJT04KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlSMV9SeEQgPT0gU01UX1IxX1JYRF9DT1VOVAorCVIyX1J4RCA9PSBTTVRfUjJfUlhEX0NPVU5UCisKKwlTTVRfUjFfUlhEX0NPVU5UIG11c3QgYmUgdW5lcXVhbCB6ZXJvCisKKwkJICAgfCBSMV9SeEQgUjJfUnhEIHxSMV9SeEQgUjJfUnhEIHwgUjFfUnhEIFIyX1J4RAorCQkgICB8ICAgeCAgICAgIDAJICAgfCAgeAkgICAgMS0zCSAgfCAgIHggICAgIDwgMworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJICAgfCAgIDYzLDc1IGtCCSAgIHwgICAgNTQsNzUJICB8CVIxX1J4RAorCXJ4IHF1ZXVlIDEgfCBSWF9GSUZPX1NQQUNFIHwgUlhfTEFSR0VfRklGT3wgLS0tLS0tLS0tLS0tLSAqIDYzLDc1IGtCCisJCSAgIHwJCSAgIHwJCSAgfCBSMV9SeEQrUjJfUnhECisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkgICB8CQkgICB8ICAgIDkga0IJICB8ICAgICBSMl9SeEQKKwlyeCBxdWV1ZSAyIHwJMCBrQgkgICB8IFJYX1NNQUxMX0ZJRk98IC0tLS0tLS0tLS0tLS0gKiA2Myw3NSBrQgorCQkgICB8ICAobm90IHVzZWQpICAgfAkJICB8IFIxX1J4RCtSMl9SeEQKKworCUVORF9NQU5VQUxfRU5UUlkKKyovCisKKwlpZiAoU01UX1IxX1JYRF9DT1VOVCA9PSAwKSB7CisJCVNNVF9QQU5JQyhzbWMsU01UX0UwMTE3LCBTTVRfRTAxMTdfTVNHKSA7CisJfQorCisJc3dpdGNoKFNNVF9SMl9SWERfQ09VTlQpIHsKKwljYXNlIDA6CisJCXNtYy0+aHcuZnAuZmlmby5yeDFfZmlmb19zaXplID0gUlhfRklGT19TUEFDRSA7CisJCXNtYy0+aHcuZnAuZmlmby5yeDJfZmlmb19zaXplID0gMCA7CisJCWJyZWFrIDsKKwljYXNlIDE6CisJY2FzZSAyOgorCWNhc2UgMzoKKwkJc21jLT5ody5mcC5maWZvLnJ4MV9maWZvX3NpemUgPSBSWF9MQVJHRV9GSUZPIDsKKwkJc21jLT5ody5mcC5maWZvLnJ4Ml9maWZvX3NpemUgPSBSWF9TTUFMTF9GSUZPIDsKKwkJYnJlYWsgOworCWRlZmF1bHQ6CS8qIHRoaXMgaXMgbm90IHRoZSByZWFsIGRlZmF1bGUgKi8KKwkJc21jLT5ody5mcC5maWZvLnJ4MV9maWZvX3NpemUgPSBSWF9GSUZPX1NQQUNFICoKKwkJU01UX1IxX1JYRF9DT1VOVC8oU01UX1IxX1JYRF9DT1VOVCtTTVRfUjJfUlhEX0NPVU5UKSA7CisJCXNtYy0+aHcuZnAuZmlmby5yeDJfZmlmb19zaXplID0gUlhfRklGT19TUEFDRSAqCisJCVNNVF9SMl9SWERfQ09VTlQvKFNNVF9SMV9SWERfQ09VTlQrU01UX1IyX1JYRF9DT1VOVCkgOworCQlicmVhayA7CisJfQorCisvKgorCUJFR0lOX01BTlVBTF9FTlRSWShtb2R1bGU7bWVtOzEpCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVRSQU5TTUlUIEJVRkZFUiBNRU1PUlkgRElWRVJTSU9OCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKwkJIHwgbm8gc3luYyBidwl8IHN5bmMgYncgYXZhaWxhYmxlIGFuZCB8IHN5bmMgYncgYXZhaWxhYmxlIGFuZAorCQkgfCBhdmFpbGFibGUJfCBTeW5jaFR4TW9kZSA9IFNQTElUCXwgU3luY2hUeE1vZGUgPSBBTEwKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCXN5bmMgdHgJIHwgICAgIDAga0IJfAkzMiBrQgkJfAk1NSBrQgorCXF1ZXVlCSB8CQl8ICAgVFhfTUVESVVNX0ZJRk8JfCAgIFRYX0xBUkdFX0ZJRk8KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWFzeW5jIHR4IHwgICAgNjQga0IJfAkzMiBrQgkJfAkgOSBrCisJcXVldWUJIHwgVFhfRklGT19TUEFDRXwgICBUWF9NRURJVU1fRklGTwl8ICAgVFhfU01BTExfRklGTworCisJRU5EX01BTlVBTF9FTlRSWQorKi8KKworCS8qCisJICogc2V0IHRoZSB0eCBtb2RlIGJpdHMKKwkgKi8KKwlpZiAoc21jLT5taWIuYVtQQVRIMF0uZmRkaVBBVEhTYmFQYXlsb2FkKSB7CisjaWZkZWYgRVNTCisJCXNtYy0+aHcuZnAuZmlmby5maWZvX2NvbmZpZ19tb2RlIHw9CisJCQlzbWMtPm1pYi5mZGRpRVNTU3luY2hUeE1vZGUgfCBTWU5DX1RSQUZGSUNfT04gOworI2VuZGlmCisJfQorCWVsc2UgeworCQlzbWMtPmh3LmZwLmZpZm8uZmlmb19jb25maWdfbW9kZSAmPQorCQkJfihTRU5EX0FTWU5DX0FTX1NZTkN8U1lOQ19UUkFGRklDX09OKSA7CisJfQorCisJLyoKKwkgKiBzcGxpdCB1cCB0aGUgRklGTworCSAqLworCWlmIChzbWMtPmh3LmZwLmZpZm8uZmlmb19jb25maWdfbW9kZSAmIFNZTkNfVFJBRkZJQ19PTikgeworCQlpZiAoc21jLT5ody5mcC5maWZvLmZpZm9fY29uZmlnX21vZGUgJiBTRU5EX0FTWU5DX0FTX1NZTkMpIHsKKwkJCXNtYy0+aHcuZnAuZmlmby50eF9zX3NpemUgPSBUWF9MQVJHRV9GSUZPIDsKKwkJCXNtYy0+aHcuZnAuZmlmby50eF9hMF9zaXplID0gVFhfU01BTExfRklGTyA7CisJCX0KKwkJZWxzZSB7CisJCQlzbWMtPmh3LmZwLmZpZm8udHhfc19zaXplID0gVFhfTUVESVVNX0ZJRk8gOworCQkJc21jLT5ody5mcC5maWZvLnR4X2EwX3NpemUgPSBUWF9NRURJVU1fRklGTyA7CisJCX0KKwl9CisJZWxzZSB7CisJCQlzbWMtPmh3LmZwLmZpZm8udHhfc19zaXplID0gMCA7CisJCQlzbWMtPmh3LmZwLmZpZm8udHhfYTBfc2l6ZSA9IFRYX0ZJRk9fU1BBQ0UgOworCX0KKworCXNtYy0+aHcuZnAuZmlmby5yeDFfZmlmb19zdGFydCA9IHNtYy0+aHcuZnAuZmlmby5yYmNfcmFtX3N0YXJ0ICsKKwkJUlhfRklGT19PRkYgOworCXNtYy0+aHcuZnAuZmlmby50eF9zX3N0YXJ0ID0gc21jLT5ody5mcC5maWZvLnJ4MV9maWZvX3N0YXJ0ICsKKwkJc21jLT5ody5mcC5maWZvLnJ4MV9maWZvX3NpemUgOworCXNtYy0+aHcuZnAuZmlmby50eF9hMF9zdGFydCA9IHNtYy0+aHcuZnAuZmlmby50eF9zX3N0YXJ0ICsKKwkJc21jLT5ody5mcC5maWZvLnR4X3Nfc2l6ZSA7CisJc21jLT5ody5mcC5maWZvLnJ4Ml9maWZvX3N0YXJ0ID0gc21jLT5ody5mcC5maWZvLnR4X2EwX3N0YXJ0ICsKKwkJc21jLT5ody5mcC5maWZvLnR4X2EwX3NpemUgOworCisJREJfU01UKCJGSUZPIHNwbGl0OiBtb2RlID0gJXhcbiIsc21jLT5ody5mcC5maWZvLmZpZm9fY29uZmlnX21vZGUsMCkgOworCURCX1NNVCgicmJjX3JhbV9zdGFydCA9CSV4CSByYmNfcmFtX2VuZCA9IAkleFxuIiwKKwkJc21jLT5ody5mcC5maWZvLnJiY19yYW1fc3RhcnQsIHNtYy0+aHcuZnAuZmlmby5yYmNfcmFtX2VuZCkgOworCURCX1NNVCgicngxX2ZpZm9fc3RhcnQgPSAleAkgdHhfc19zdGFydCA9IAkleFxuIiwKKwkJc21jLT5ody5mcC5maWZvLnJ4MV9maWZvX3N0YXJ0LCBzbWMtPmh3LmZwLmZpZm8udHhfc19zdGFydCkgOworCURCX1NNVCgidHhfYTBfc3RhcnQgPQkleAkgcngyX2ZpZm9fc3RhcnQgPSAJJXhcbiIsCisJCXNtYy0+aHcuZnAuZmlmby50eF9hMF9zdGFydCwgc21jLT5ody5mcC5maWZvLnJ4Ml9maWZvX3N0YXJ0KSA7Cit9CisKK3ZvaWQgZm9ybWFjX3JlaW5pdF90eChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwkvKgorCSAqIFNwbGl0IHVwIHRoZSBGSUZPIGFuZCByZWluaXRpYWxpemUgdGhlIE1BQyBpZiBzeW5jaHJvbm91cworCSAqIGJhbmR3aWR0aCBiZWNvbWVzIGF2YWlsYWJsZSBidXQgbm8gc3luY2hyb25vdXMgcXVldWUgaXMKKwkgKiBjb25maWd1cmVkLgorCSAqLworCWlmICghc21jLT5ody5mcC5maWZvLnR4X3Nfc2l6ZSAmJiBzbWMtPm1pYi5hW1BBVEgwXS5mZGRpUEFUSFNiYVBheWxvYWQpeworCQkodm9pZClpbml0X21hYyhzbWMsMCkgOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9oL2NtdGRlZi5oIGIvZHJpdmVycy9uZXQvc2tmcC9oL2NtdGRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMzk4MmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2gvY210ZGVmLmgKQEAgLTAsMCArMSw3NjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OCwxOTk5IFN5c0tvbm5lY3QsCisgKglhIGJ1c2luZXNzIHVuaXQgb2YgU2NobmVpZGVyICYgS29jaCAmIENvLiBEYXRlbnN5c3RlbWUgR21iSC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYJX0NNVERFRl8KKyNkZWZpbmUgX0NNVERFRl8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisvKgorICogaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29uc3RhbnRzCisgKiBNT0RJSUZZIFRIRSBGT0xMV09JTkcgVEhSRUUgREVGSU5FUworICovCisjZGVmaW5lIEFNRFBMQwkJCS8qIGlmIEFtZCBQTEMgY2hpcCB1c2VkICovCisjaWZkZWYJQ09OQworI2RlZmluZSBOVU1QSFlTCQkxMgkvKiAyIGZvciBTQVMgb3IgREFTLCBtb3JlIGZvciBDb25jZW50cmF0b3IgKi8KKyNlbHNlCisjaWZkZWYJQ09OQ19JSQorI2RlZmluZSBOVU1QSFlTCQkyNAkvKiAyIGZvciBTQVMgb3IgREFTLCBtb3JlIGZvciBDb25jZW50cmF0b3IgKi8KKyNlbHNlCisjZGVmaW5lIE5VTVBIWVMJCTIJLyogMiBmb3IgU0FTIG9yIERBUywgbW9yZSBmb3IgQ29uY2VudHJhdG9yICovCisjZW5kaWYKKyNlbmRpZgorI2RlZmluZSBOVU1NQUNTCQkxCS8qIG9ubHkgMSBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudCAqLworI2RlZmluZSBOVU1QQVRIUwkyCS8qIHByaW1hcnkgYW5kIHNlY29uZGFyeSBwYXRoIHN1cHBvcnRlZCAqLworCisvKgorICogRE8gTk9UIE1PRElGWSBCRVlPTkQgVEhJUyBQT0lOVAorICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKworI2lmCU5VTVBIWVMgPiAyCisjZGVmaW5lIENPTkNFTlRSQVRPUgorI2VuZGlmCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgY29tZm9ydGFibGUgTElOVCB1c2FnZQorICovCisjaWZkZWYJbGludAorI2RlZmluZSBMSU5UX1VTRSh4KQkoeCk9KHgpCisjZWxzZQorI2RlZmluZSBMSU5UX1VTRSh4KQorI2VuZGlmCisKKyNpZmRlZglERUJVRworI2RlZmluZQlEQl9QUihmbGFnLGEsYixjKQl7IGlmIChmbGFnKSBwcmludGYoYSxiLGMpIDsgfQorI2Vsc2UKKyNkZWZpbmUJREJfUFIoZmxhZyxhLGIsYykKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfQlJECisjZGVmaW5lIERCX0VDTShhLGIsYykJCURCX1BSKChzbWMtPmRlYnVnLmRfc210JjEpLGEsYixjKQorI2RlZmluZSBEQl9FQ01OKG4sYSxiLGMpCURCX1BSKChzbWMtPmRlYnVnLmRfZWNtID49KG4pKSxhLGIsYykKKyNkZWZpbmUgREJfUk1UKGEsYixjKQkJREJfUFIoKHNtYy0+ZGVidWcuZF9zbXQmMiksYSxiLGMpCisjZGVmaW5lIERCX1JNVE4obixhLGIsYykJREJfUFIoKHNtYy0+ZGVidWcuZF9ybXQgPj0obikpLGEsYixjKQorI2RlZmluZSBEQl9DRk0oYSxiLGMpCQlEQl9QUigoc21jLT5kZWJ1Zy5kX3NtdCY0KSxhLGIsYykKKyNkZWZpbmUgREJfQ0ZNTihuLGEsYixjKQlEQl9QUigoc21jLT5kZWJ1Zy5kX2NmbSA+PShuKSksYSxiLGMpCisjZGVmaW5lIERCX1BDTShhLGIsYykJCURCX1BSKChzbWMtPmRlYnVnLmRfc210JjgpLGEsYixjKQorI2RlZmluZSBEQl9QQ01OKG4sYSxiLGMpCURCX1BSKChzbWMtPmRlYnVnLmRfcGNtID49KG4pKSxhLGIsYykKKyNkZWZpbmUgREJfU01UKGEsYixjKQkJREJfUFIoKHNtYy0+ZGVidWcuZF9zbXRmKSxhLGIsYykKKyNkZWZpbmUgREJfU01UTihuLGEsYixjKQlEQl9QUigoc21jLT5kZWJ1Zy5kX3NtdGYgPj0obikpLGEsYixjKQorI2RlZmluZSBEQl9TQkEoYSxiLGMpCQlEQl9QUigoc21jLT5kZWJ1Zy5kX3NiYSksYSxiLGMpCisjZGVmaW5lIERCX1NCQU4obixhLGIsYykJREJfUFIoKHNtYy0+ZGVidWcuZF9zYmEgPj0obikpLGEsYixjKQorI2RlZmluZSBEQl9FU1MoYSxiLGMpCQlEQl9QUigoc21jLT5kZWJ1Zy5kX2VzcyksYSxiLGMpCisjZGVmaW5lIERCX0VTU04obixhLGIsYykJREJfUFIoKHNtYy0+ZGVidWcuZF9lc3MgPj0obikpLGEsYixjKQorI2Vsc2UKKyNkZWZpbmUgREJfRUNNKGEsYixjKQkJREJfUFIoKGRlYnVnLmRfc210JjEpLGEsYixjKQorI2RlZmluZSBEQl9FQ01OKG4sYSxiLGMpCURCX1BSKChkZWJ1Zy5kX2VjbSA+PShuKSksYSxiLGMpCisjZGVmaW5lIERCX1JNVChhLGIsYykJCURCX1BSKChkZWJ1Zy5kX3NtdCYyKSxhLGIsYykKKyNkZWZpbmUgREJfUk1UTihuLGEsYixjKQlEQl9QUigoZGVidWcuZF9ybXQgPj0obikpLGEsYixjKQorI2RlZmluZSBEQl9DRk0oYSxiLGMpCQlEQl9QUigoZGVidWcuZF9zbXQmNCksYSxiLGMpCisjZGVmaW5lIERCX0NGTU4obixhLGIsYykJREJfUFIoKGRlYnVnLmRfY2ZtID49KG4pKSxhLGIsYykKKyNkZWZpbmUgREJfUENNKGEsYixjKQkJREJfUFIoKGRlYnVnLmRfc210JjgpLGEsYixjKQorI2RlZmluZSBEQl9QQ01OKG4sYSxiLGMpCURCX1BSKChkZWJ1Zy5kX3BjbSA+PShuKSksYSxiLGMpCisjZGVmaW5lIERCX1NNVChhLGIsYykJCURCX1BSKChkZWJ1Zy5kX3NtdGYpLGEsYixjKQorI2RlZmluZSBEQl9TTVROKG4sYSxiLGMpCURCX1BSKChkZWJ1Zy5kX3NtdGYgPj0obikpLGEsYixjKQorI2RlZmluZSBEQl9TQkEoYSxiLGMpCQlEQl9QUigoZGVidWcuZF9zYmEpLGEsYixjKQorI2RlZmluZSBEQl9TQkFOKG4sYSxiLGMpCURCX1BSKChkZWJ1Zy5kX3NiYSA+PShuKSksYSxiLGMpCisjZGVmaW5lIERCX0VTUyhhLGIsYykJCURCX1BSKChkZWJ1Zy5kX2VzcyksYSxiLGMpCisjZGVmaW5lIERCX0VTU04obixhLGIsYykJREJfUFIoKGRlYnVnLmRfZXNzID49KG4pKSxhLGIsYykKKyNlbmRpZgorCisjaWZuZGVmCVNTX05PVF9EUworI2RlZmluZQlTS19MT0NfREVDTCh0eXBlLHZhcikJdHlwZSB2YXIKKyNlbHNlCisjZGVmaW5lCVNLX0xPQ19ERUNMKHR5cGUsdmFyKQlzdGF0aWMgdHlwZSB2YXIKKyNlbmRpZgorLyoKKyAqIFBIWXMgYW5kIFBPUlRTCisgKiBOb3RlOiBEb24ndCB0b3VjaCB0aGUgZGVmaW5pdGlvbiBvZiBQQSBhbmQgUEIuIFRob3NlIG1pZ2h0IGJlIHVzZWQKKyAqCWJ5IHNvbWUgImZvciIgbG9vcHMuCisgKi8KKyNkZWZpbmUgUEEJCTAKKyNkZWZpbmUgUEIJCTEKKyNpZglkZWZpbmVkKFNVUEVSTkVUXzMpIHx8IGRlZmluZWQoQ09OQ19JSSkKKy8qCisgKiBUaGUgcG9ydCBpbmRpY2VzIGhhdmUgdG8gYmUgZGlmZmVyZW50LAorICogYmVjYXVzZSB0aGUgTUFDIG91dHB1dCBnb2VzIHRocm91Z2ggdGhlIDIuIFBMQworICogQ29uYyBJSTogSXQgaGFzIHRvIGJlIHRoZSBmaXJzdCBwb3J0IGluIHRoZSByb3cuCisgKi8KKyNkZWZpbmUgUFMJCTAJLyogSW50ZXJuYWwgUExDIHdoaWNoIGlzIHRoZSBzYW1lIGFzIFBBICovCisjZWxzZQorI2RlZmluZSBQUwkJMQorI2VuZGlmCisjZGVmaW5lIFBNCQkyCQkvKiBQTSAuLiBQQStOVU1fUEhZUy0xICovCisKKy8qCisgKiBQSFkgdHlwZXMgLSBhcyBpbiBwYXRoIGRlc2NyaXB0b3IgJ2ZkZGlQSFlUeXBlJworICovCisjZGVmaW5lIFRBCQkJMAkvKiBBIHBvcnQgKi8KKyNkZWZpbmUgVEIJCQkxCS8qIEIgcG9ydCAqLworI2RlZmluZSBUUwkJCTIJLyogUyBwb3J0ICovCisjZGVmaW5lIFRNCQkJMwkvKiBNIHBvcnQgKi8KKyNkZWZpbmUgVE5PTkUJCQk0CisKKworLyoKKyAqIGluZGV4ZXMgaW4gTUlCCisgKi8KKyNkZWZpbmUgSU5ERVhfTUFDCTEKKyNkZWZpbmUgSU5ERVhfUEFUSAkxCisjZGVmaW5lIElOREVYX1BPUlQJMQorCisKKy8qCisgKiBwb2xpY2llcworICovCisjZGVmaW5lIFBPTElDWV9BQQkoMTw8MCkJCS8qIHJlamVjdCBBQSAqLworI2RlZmluZSBQT0xJQ1lfQUIJKDE8PDEpCQkvKiByZWplY3QgQUIgKi8KKyNkZWZpbmUgUE9MSUNZX0FTCSgxPDwyKQkJLyogcmVqZWN0IEFTICovCisjZGVmaW5lIFBPTElDWV9BTQkoMTw8MykJCS8qIHJlamVjdCBBTSAqLworI2RlZmluZSBQT0xJQ1lfQkEJKDE8PDQpCQkvKiByZWplY3QgQkEgKi8KKyNkZWZpbmUgUE9MSUNZX0JCCSgxPDw1KQkJLyogcmVqZWN0IEJCICovCisjZGVmaW5lIFBPTElDWV9CUwkoMTw8NikJCS8qIHJlamVjdCBCUyAqLworI2RlZmluZSBQT0xJQ1lfQk0JKDE8PDcpCQkvKiByZWplY3QgQk0gKi8KKyNkZWZpbmUgUE9MSUNZX1NBCSgxPDw4KQkJLyogcmVqZWN0IFNBICovCisjZGVmaW5lIFBPTElDWV9TQgkoMTw8OSkJCS8qIHJlamVjdCBTQiAqLworI2RlZmluZSBQT0xJQ1lfU1MJKDE8PDEwKQkJLyogcmVqZWN0IFNTICovCisjZGVmaW5lIFBPTElDWV9TTQkoMTw8MTEpCQkvKiByZWplY3QgU00gKi8KKyNkZWZpbmUgUE9MSUNZX01BCSgxPDwxMikJCS8qIHJlamVjdCBNQSAqLworI2RlZmluZSBQT0xJQ1lfTUIJKDE8PDEzKQkJLyogcmVqZWN0IE1CICovCisjZGVmaW5lIFBPTElDWV9NUwkoMTw8MTQpCQkvKiByZWplY3QgTVMgKi8KKyNkZWZpbmUgUE9MSUNZX01NCSgxPDwxNSkJCS8qIHJlamVjdCBNTSAqLworCisvKgorICogY29tbWFuZHMKKyAqLworCisvKgorICogRVZFTlRTCisgKiBldmVudCBjbGFzc2VzCisgKi8KKyNkZWZpbmUgRVZFTlRfRUNNCTEJCS8qIGV2ZW50IGNsYXNzIEVDTSAqLworI2RlZmluZSBFVkVOVF9DRk0JMgkJLyogZXZlbnQgY2xhc3MgQ0ZNICovCisjZGVmaW5lIEVWRU5UX1JNVAkzCQkvKiBldmVudCBjbGFzcyBSTVQgKi8KKyNkZWZpbmUgRVZFTlRfU01UCTQJCS8qIGV2ZW50IGNsYXNzIFNNVCAqLworI2RlZmluZSBFVkVOVF9QQ00JNQkJLyogZXZlbnQgY2xhc3MgUENNICovCisjZGVmaW5lIEVWRU5UX1BDTUEJNQkJLyogZXZlbnQgY2xhc3MgUENNQSAqLworI2RlZmluZSBFVkVOVF9QQ01CCTYJCS8qIGV2ZW50IGNsYXNzIFBDTUIgKi8KKworLyogV0FSTklORyA6CisgKiBFVkVOVF9QQ00qIG11c3QgYmUgbGFzdCBpbiB0aGUgYWJvdmUgbGlzdAorICogaWYgbW9yZSB0aGFuIHR3byBwb3J0cyBhcmUgdXNlZCwgRVZFTlRfUENNIC4uIEVWRU5UX1BDTUErTlVNX1BIWVMtMQorICogYXJlIHVzZWQgIQorICovCisKKyNkZWZpbmUgRVZfVE9LRU4oY2xhc3MsZXZlbnQpCSgoKHVfbG9uZykoY2xhc3MpPDwxNkwpfCgodV9sb25nKShldmVudCkpKQorI2RlZmluZSBFVl9UX0NMQVNTKHRva2VuKQkoKGludCkoKHRva2VuKT4+MTYpJjB4ZmZmZikKKyNkZWZpbmUgRVZfVF9FVkVOVCh0b2tlbikJKChpbnQpKHRva2VuKSYweGZmZmYpCisKKy8qCisgKiBFQ00gZXZlbnRzCisgKi8KKyNkZWZpbmUgRUNfQ09OTkVDVAkxCQkvKiBjb25uZWN0IHJlcXVlc3QgKi8KKyNkZWZpbmUgRUNfRElTQ09OTkVDVAkyCQkvKiBkaXNjb25uZWN0IHJlcXVlc3QgKi8KKyNkZWZpbmUgRUNfVFJBQ0VfUFJPUAkzCQkvKiB0cmFjZSBwcm9wYWdhdGlvbiAqLworI2RlZmluZSBFQ19QQVRIX1RFU1QJNAkJLyogcGF0aCB0ZXN0ICovCisjZGVmaW5lIEVDX1RJTUVPVVRfVEQJNQkJLyogdGltZXIgVERfbWluICovCisjZGVmaW5lIEVDX1RJTUVPVVRfVE1BWAk2CQkvKiB0aW1lciB0cmFjZV9tYXggKi8KKyNkZWZpbmUgRUNfVElNRU9VVF9JTUFYCTcJCS8qIHRpbWVyIElfbWF4ICovCisjZGVmaW5lIEVDX1RJTUVPVVRfSU5NQVggOAkJLyogdGltZXIgSU5fbWF4ICovCisjZGVmaW5lIEVDX1RFU1RfRE9ORQk5CQkvKiBwYXRoIHRlc3QgZG9uZSAqLworCisvKgorICogQ0ZNIGV2ZW50cworICovCisjZGVmaW5lIENGX0xPT1AJCTEJCS8qIGNmX2xvb3AgZmxhZyBmcm9tIFBDTSAqLworI2RlZmluZSBDRl9MT09QX0EJMQkJLyogY2ZfbG9vcCBmbGFnIGZyb20gUENNICovCisjZGVmaW5lIENGX0xPT1BfQgkyCQkvKiBjZl9sb29wIGZsYWcgZnJvbSBQQ00gKi8KKyNkZWZpbmUgQ0ZfSk9JTgkJMwkJLyogY2Zfam9pbiBmbGFnIGZyb20gUENNICovCisjZGVmaW5lIENGX0pPSU5fQQkzCQkvKiBjZl9qb2luIGZsYWcgZnJvbSBQQ00gKi8KKyNkZWZpbmUgQ0ZfSk9JTl9CCTQJCS8qIGNmX2pvaW4gZmxhZyBmcm9tIFBDTSAqLworCisvKgorICogUENNIGV2ZW50cworICovCisjZGVmaW5lIFBDX1NUQVJUCQkxCisjZGVmaW5lIFBDX1NUT1AJCQkyCisjZGVmaW5lIFBDX0xPT1AJCQkzCisjZGVmaW5lIFBDX0pPSU4JCQk0CisjZGVmaW5lIFBDX1NJR05BTAkJNQorI2RlZmluZSBQQ19SRUpFQ1QJCTYKKyNkZWZpbmUgUENfTUFJTlQgICAgCQk3CisjZGVmaW5lIFBDX1RSQUNFCQk4CisjZGVmaW5lIFBDX1BEUgkJCTkKKyNkZWZpbmUgUENfRU5BQkxFCQkxMAorI2RlZmluZSBQQ19ESVNBQkxFCQkxMQorCisvKgorICogbXVzdCBiZSBvcmRlcmVkIGFzIGluIExpbmVTdGF0ZVR5cGUKKyAqLworI2RlZmluZSBQQ19RTFMJCQkxMgorI2RlZmluZSBQQ19JTFMJCQkxMworI2RlZmluZSBQQ19NTFMJCQkxNAorI2RlZmluZSBQQ19ITFMJCQkxNQorI2RlZmluZSBQQ19MU19QRFIJCTE2CisjZGVmaW5lIFBDX0xTX05PTkUJCTE3CisjZGVmaW5lIExTMk1JQih4KQkoKHgpLVBDX1FMUykKKyNkZWZpbmUgTUlCMkxTKHgpCSgoeCkrUENfUUxTKQorCisjZGVmaW5lIFBDX1RJTUVPVVRfVEJfTUFYCTE4CS8qIHRpbWVyIFRCX21heCAqLworI2RlZmluZSBQQ19USU1FT1VUX1RCX01JTgkxOQkvKiB0aW1lciBUQl9taW4gKi8KKyNkZWZpbmUgUENfVElNRU9VVF9DX01JTgkyMAkvKiB0aW1lciBDX01pbiAqLworI2RlZmluZSBQQ19USU1FT1VUX1RfT1VUCTIxCS8qIHRpbWVyIFRfT3V0ICovCisjZGVmaW5lIFBDX1RJTUVPVVRfVExfTUlOCTIyCS8qIHRpbWVyIFRMX01pbiAqLworI2RlZmluZSBQQ19USU1FT1VUX1RfTkVYVAkyMwkvKiB0aW1lciB0X25leHRbXSAqLworI2RlZmluZSBQQ19USU1FT1VUX0xDVAkJMjQKKyNkZWZpbmUgUENfTlNFCQkJMjUJLyogTk9JU0UgaGFyZHdhcmUgdGltZXIgKi8KKyNkZWZpbmUgUENfTEVNCQkJMjYJLyogTEVNIGRvbmUgKi8KKworLyoKKyAqIFJNVCBldmVudHMJCQkJICBtZWFuaW5nCQlmcm9tCisgKi8KKyNkZWZpbmUgUk1fUklOR19PUAkxCQkvKiByaW5nIG9wZXJhdGlvbmFsCU1BQwkqLworI2RlZmluZSBSTV9SSU5HX05PTl9PUAkyCQkvKiByaW5nIG5vdCBvcGVyYXRpb25hbAlNQUMJKi8KKyNkZWZpbmUgUk1fTVlfQkVBQ09OCTMJCS8qIHJlY3ZkIG15IGJlYWNvbglNQUMJKi8KKyNkZWZpbmUgUk1fT1RIRVJfQkVBQ09OCTQJCS8qIHJlY3ZkIG90aGVyIGJlYWNvbglNQUMJKi8KKyNkZWZpbmUgUk1fTVlfQ0xBSU0JNQkJLyogcmVjdmQgbXkgY2xhaW0JTUFDCSovCisjZGVmaW5lIFJNX1RSVF9FWFAJNgkJLyogVFJUIGV4cAkJTUFDCSovCisjZGVmaW5lIFJNX1ZBTElEX0NMQUlNCTcJCS8qIGNsYWltIGZyb20gZHVwIGFkZHIJTUFDCSovCisjZGVmaW5lIFJNX0pPSU4JCTgJCS8qIHNpZ25hbCBybV9qb2luCUNGTQkqLworI2RlZmluZSBSTV9MT09QCQk5CQkvKiBzaWduYWwgcm1fbG9vcAlDRk0JKi8KKyNkZWZpbmUgUk1fRFVQX0FERFIJMTAJCS8qIGR1cF9hZGRyX3Rlc3QgaGFuZ2UJU01ULU5JRgkqLworI2RlZmluZSBSTV9FTkFCTEVfRkxBRwkxMQkJLyogZW5hYmxlIGZsYWcgKi8KKworI2RlZmluZSBSTV9USU1FT1VUX05PTl9PUAkxMgkvKiB0aW1lb3V0IFRfTm9uX09QCSovCisjZGVmaW5lIFJNX1RJTUVPVVRfVF9TVFVDSwkxMwkvKiB0aW1lb3V0IFRfU3R1Y2sJKi8KKyNkZWZpbmUgUk1fVElNRU9VVF9BTk5PVU5DRQkxNAkvKiB0aW1lb3V0IFRfQW5ub3VuY2UJKi8KKyNkZWZpbmUgUk1fVElNRU9VVF9UX0RJUkVDVAkxNQkvKiB0aW1lb3V0IFRfRGlyZWN0CSovCisjZGVmaW5lIFJNX1RJTUVPVVRfRF9NQVgJMTYJLyogdGltZW91dCBEX01heAkqLworI2RlZmluZSBSTV9USU1FT1VUX1BPTEwJCTE3CS8qIGNsYWltL2JlYWNvbiBwb2xsZXIJKi8KKyNkZWZpbmUgUk1fVFhfU1RBVEVfQ0hBTkdFCTE4CS8qIFRvIHJlc3RhcnQgdGltZXIgZm9yIERfTWF4ICovCisKKy8qCisgKiBTTVQgZXZlbnRzCisgKi8KKyNkZWZpbmUgU01fVElNRVIJMQkJLyogdGltZXIgKi8KKyNkZWZpbmUgU01fRkFTVAkJMgkJLyogc210X2ZvcmNlX2lycSAqLworCisvKiBQQyBtb2RlcyAqLworI2RlZmluZSBQTV9OT05FCQkwCisjZGVmaW5lIFBNX1BFRVIJCTEKKyNkZWZpbmUgUE1fVFJFRQkJMgorCisvKgorICogUENNIHdpdGhob2xkIGNvZGVzCisgKiBNSUIgUEMtV2l0aGhvbGRUeXBlIEVOVU0KKyAqLworI2RlZmluZSBQQ19XSF9OT05FCTAJCS8qIG9rICovCisjZGVmaW5lIFBDX1dIX01fTQkxCQkvKiBNIHRvIE0gKi8KKyNkZWZpbmUgUENfV0hfT1RIRVIJMgkJLyogb3RoZXIgaW5jb21wYXRpYmxlIHBoeXMgKi8KKyNkZWZpbmUgUENfV0hfUEFUSAkzCQkvKiBwYXRoIG5vdCBhdmFpbGFibGUgKi8KKy8qCisgKiBMQ1QgZHVyYXRpb24KKyAqLworI2RlZmluZSBMQ19TSE9SVAkxCQkvKiBzaG9ydCBMQ1QgKi8KKyNkZWZpbmUgTENfTUVESVVNCTIJCS8qIG1lZGl1bSBMQ1QgKi8KKyNkZWZpbmUgTENfTE9ORwkJMwkJLyogbG9uZyBMQ1QgKi8KKyNkZWZpbmUgTENfRVhURU5ERUQJNAkJLyogZXh0ZW5kZWQgTENUICovCisKKy8qCisgKiBwYXRoX3Rlc3QgdmFsdWVzCisgKi8KKyNkZWZpbmUgUFRfTk9ORQkJMAorI2RlZmluZSBQVF9URVNUSU5HCTEJCS8qIHRlc3QgaXMgcnVubmluZyAqLworI2RlZmluZSBQVF9QQVNTRUQJMgkJLyogdGVzdCBwYXNzZWQgKi8KKyNkZWZpbmUgUFRfRkFJTEVECTMJCS8qIHRlc3QgZmFpbGVkICovCisjZGVmaW5lIFBUX1BFTkRJTkcJNAkJLyogcGF0aCB0ZXN0IGZvbGxvd3MgKi8KKyNkZWZpbmUgUFRfRVhJVElORwk1CQkvKiBkaXNjb25uZWN0ZWQgd2hpbGUgaW4gdHJhY2UvbGVhdmUgKi8KKworLyoKKyAqIGR1cGxpY2F0ZSBhZGRyZXNzIHRlc3QKKyAqIE1JQiBEdXBBZGRyZXNzVGVzdCBFTlVNCisgKi8KKyNkZWZpbmUgREFfTk9ORQkJMAkJLyogCQkqLworI2RlZmluZSBEQV9QQVNTRUQJMQkJLyogdGVzdCBwYXNzZWQgKi8KKyNkZWZpbmUgREFfRkFJTEVECTIJCS8qIHRlc3QgZmFpbGVkICovCisKKworLyoKKyAqIG9wdGljYWwgYnlwYXNzCisgKi8KKyNkZWZpbmUgQlBfREVJTlNFUlQJMAkJLyogZGlzYWJsZSBieXBhc3MgKi8KKyNkZWZpbmUgQlBfSU5TRVJUCTEJCS8qIGVuYWJsZSBieXBhc3MgKi8KKworLyoKKyAqIE9ETCBlbmFibGUvZGlzYWJsZQorICovCisjZGVmaW5lIFBNX1RSQU5TTUlUX0RJU0FCTEUJMAkvKiBkaXNhYmxlIHhtaXQgKi8KKyNkZWZpbmUgUE1fVFJBTlNNSVRfRU5BQkxFCTEJLyogZW5hYmxlIHhtaXQgKi8KKworLyoKKyAqIHBhcmFtZXRlciBmb3IgY29uZmlnX211eAorICogbm90ZSA6IG51bWJlciBpcyBpbmRleCBpbiBjb25maWdfZW5kZWMgdGFibGUgIQorICovCisjZGVmaW5lIE1VWF9USFJVQQkwCQkvKiB0aHJvdWdoIEEgKi8KKyNkZWZpbmUgTVVYX1RIUlVCCTEJCS8qIHRocm91Z2ggQiAqLworI2RlZmluZSBNVVhfV1JBUEEJMgkJLyogd3JhcCBBICovCisjZGVmaW5lIE1VWF9XUkFQQgkzCQkvKiB3cmFwIEIgKi8KKyNkZWZpbmUgTVVYX0lTT0xBVEUJNAkJLyogaXNvbGF0ZWQgKi8KKyNkZWZpbmUgTVVYX1dSQVBTCTUJCS8qIFNBUyAqLworCisvKgorICogTUFDIGNvbnRyb2wKKyAqLworI2RlZmluZSBNQV9SRVNFVAkwCisjZGVmaW5lIE1BX0JFQUNPTgkxCisjZGVmaW5lIE1BX0NMQUlNCTIKKyNkZWZpbmUgTUFfRElSRUNURUQJMwkJLyogZGlyZWN0ZWQgYmVhY29uICovCisjZGVmaW5lIE1BX1RSRVEJCTQJCS8qIGNoYW5nZSBUX1JlcSAqLworI2RlZmluZSBNQV9PRkZMSU5FCTUJCS8qIHN3aXRjaCBNQUMgdG8gb2ZmbGluZSAqLworCisKKy8qCisgKiB0cmFjZSBwcm9wCisgKiBiaXQgbWFwIGZvciB0cmFjZSBwcm9wYWdhdGlvbgorICovCisjZGVmaW5lIEVOVElUWV9NQUMJKE5VTVBIWVMpCisjZGVmaW5lIEVOVElUWV9QSFkocCkJKHApCisjZGVmaW5lIEVOVElUWV9CSVQobSkJKDE8PChtKSkKKworLyoKKyAqIFJlc291cmNlIFRhZyBUeXBlcworICovCisjZGVmaW5lIFBBVEhfSVNPCTAJLyogaXNvbGF0ZWQgKi8KKyNkZWZpbmUgUEFUSF9QUklNCTMJLyogcHJpbWFyeSBwYXRoICovCisjZGVmaW5lIFBBVEhfVEhSVQk1CS8qIHRocm91Z2ggcGF0aCAqLworCisjZGVmaW5lIFJFU19NQUMJCTIJLyogcmVzb3VyY2UgdHlwZSBNQUMgKi8KKyNkZWZpbmUgUkVTX1BPUlQJNAkvKiByZXNvdXJjZSB0eXBlIFBPUlQgKi8KKworCisvKgorICogQ0ZNIHN0YXRlCisgKiBvb3BzOiBNVVNUIE1BVENIIENGLVN0YXRlVHlwZSBpbiBTTVQ3LjIgIQorICovCisjZGVmaW5lIFNDMF9JU09MQVRFRAkwCQkvKiBpc29sYXRlZCAqLworI2RlZmluZSBTQzFfV1JBUF9BCTUJCS8qIHdyYXAgQSAobm90IHVzZWQpICovCisjZGVmaW5lIFNDMl9XUkFQX0IJNgkJLyogd3JhcCBCIChub3QgdXNlZCkgKi8KKyNkZWZpbmUgU0M0X1RIUlVfQQkxMgkJLyogdGhyb3VnaCBBICovCisjZGVmaW5lIFNDNV9USFJVX0IJNwkJLyogdGhyb3VnaCBCICh1c2VkIGluIFNNVCA2LjIpICovCisjZGVmaW5lIFNDN19XUkFQX1MJOAkJLyogU0FTIChub3QgdXNlZCkgKi8KKyNkZWZpbmUgU0M5X0NfV1JBUF9BCTkJCS8qIGMgd3JhcCBBICovCisjZGVmaW5lIFNDMTBfQ19XUkFQX0IJMTAJCS8qIGMgd3JhcCBCICovCisjZGVmaW5lIFNDMTFfQ19XUkFQX1MJMTEJCS8qIGMgd3JhcCBTICovCisKKy8qCisgKiBjb252ZXJ0IE1JQiB0aW1lIGluIHVuaXRzIG9mIDgwblMgdG8gdVMKKyAqLworI2RlZmluZSBNSUIyVVModCkJCSgodCkvMTIpCisjZGVmaW5lIFNFQzJNSUIocykJKChzKSoxMjUwMDAwMEwpCisvKgorICogU01UIHRpbWVyCisgKi8KK3N0cnVjdCBzbXRfdGltZXIgeworCXN0cnVjdCBzbXRfdGltZXIJKnRtX25leHQgOwkvKiBsaW5rZWQgbGlzdCAqLworCXN0cnVjdCBzX3NtYwkJKnRtX3NtYyA7CS8qIHBvaW50ZXIgdG8gY29udGV4dCAqLworCXVfbG9uZwkJCXRtX2RlbHRhIDsJLyogZGVsdGEgdGltZSAqLworCXVfbG9uZwkJCXRtX3Rva2VuIDsJLyogdG9rZW4gdmFsdWUgKi8KKwl1X3Nob3J0CQkJdG1fYWN0aXZlIDsJLyogZmxhZyA6IGFjdGl2ZS9pbmFjdGl2ZSAqLworCXVfc2hvcnQJCQl0bV9wYWQgOwkvKiBwYWQgZmllbGQgKi8KK30gOworCisvKgorICogY29tbXVuaWNhdGlvbiBzdHJ1Y3R1cmVzCisgKi8KK3N0cnVjdCBtYWNfcGFyYW1ldGVyIHsKKwl1X2xvbmcJdF9uZWcgOwkJLyogVF9OZWcgcGFyYW1ldGVyICovCisJdV9sb25nCXRfcHJpIDsJCS8qIFRfUHJpIHJlZ2lzdGVyIGluIE1BQyAqLworfSA7CisKKy8qCisgKiBNQUMgY291bnRlcnMKKyAqLworc3RydWN0IG1hY19jb3VudGVyIHsKKwl1X2xvbmcJbWFjX25vYnVmX2NvdW50ZXIgOwkvKiBNQUMgU1cgY291bnRlcjogbm8gYnVmZmVyICovCisJdV9sb25nCW1hY19yX3Jlc3RhcnRfY291bnRlciA7CS8qIE1BQyBTVyBjb3VudGVyOiByeCByZXN0YXJ0ZWQgKi8KK30gOworCisvKgorICogcGFyYSBzdHJ1Y3QgY29udGV4dCBmb3IgU01UIHBhcmFtZXRlcnMKKyAqLworc3RydWN0IHNfcGNvbiB7CisJaW50CXBjX2xlbiA7CisJaW50CXBjX2VyciA7CisJaW50CXBjX2JhZHNldCA7CisJdm9pZAkqcGNfcCA7Cit9IDsKKworLyoKKyAqIGxpbmsgZXJyb3IgbW9uaXRvcgorICovCisjZGVmaW5lIExFTV9BVkcJNQorc3RydWN0IGxlbV9jb3VudGVyIHsKKyNpZmRlZglBTTI5SworCWludAlsZW1fb24JOworCXVfbG9uZwlsZW1fZXJyb3JzIDsKKwl1X2xvbmcJbGVtX3N5bWJvbHMgOworCXVfbG9uZwlsZW1fdHN5bWJvbHMgOworCWludAlsZW1fc19jb3VudCA7CisJaW50CWxlbV9uX3MgOworCWludAlsZW1fdmFsdWVzIDsKKwlpbnQJbGVtX2luZGV4IDsKKwlpbnQJbGVtX2F2Z19iZXJbTEVNX0FWR10gOworCWludAlsZW1fc3VtIDsKKyNlbHNlCisJdV9zaG9ydAlsZW1fZmxvYXRfYmVyIDsJCS8qIDEwRS1ubiBiaXQgZXJyb3IgcmF0ZSAqLworCXVfbG9uZwlsZW1fZXJyb3JzIDsJCS8qIGFjY3VtdWxhdGVkIGVycm9yIGNvdW50ICovCisJdV9zaG9ydAlsZW1fb24JOworI2VuZGlmCit9IDsKKworI2RlZmluZSBOVU1CSVRTCTEwCisKKyNpZmRlZglBTURQTEMKKworLyoKKyAqIFBMQyBzdGF0ZSB0YWJsZQorICovCitzdHJ1Y3Qgc19wbGMgeworCXVfc2hvcnQJcF9zdGF0ZSA7CQkvKiBjdXJyZW50IHN0YXRlICovCisJdV9zaG9ydAlwX2JpdHMgOwkJLyogbnVtYmVyIG9mIGJpdHMgdG8gc2VuZCAqLworCXVfc2hvcnQJcF9zdGFydCA7CQkvKiBmaXJzdCBiaXQgcG9zICovCisJdV9zaG9ydAlwX3BhZCA7CQkJLyogcGFkZGluZyBmb3IgYWxpZ25tZW50ICovCisJdV9sb25nIHNvZnRfZXJyIDsJCS8qIGVycm9yIGNvdW50ZXIgKi8KKwl1X2xvbmcgcGFyaXR5X2VyciA7CQkvKiBlcnJvciBjb3VudGVyICovCisJdV9sb25nIGVidWZfZXJyIDsJCS8qIGVycm9yIGNvdW50ZXIgKi8KKwl1X2xvbmcgZWJ1Zl9jb250IDsJCS8qIGNvbnRpbm91cyBlcnJvciBjb3VudGVyICovCisJdV9sb25nIHBoeWludiA7CQkJLyogZXJyb3IgY291bnRlciAqLworCXVfbG9uZyB2c3ltX2N0ciA7CQkvKiBlcnJvciBjb3VudGVyICovCisJdV9sb25nIG1pbmlfY3RyIDsJCS8qIGVycm9yIGNvdW50ZXIgKi8KKwl1X2xvbmcgdHBjX2V4cCA7CQkvKiBlcnJvciBjb3VudGVyICovCisJdV9sb25nIG5wX2VyciA7CQkJLyogZXJyb3IgY291bnRlciAqLworCXVfbG9uZyBiX3BjcyA7CQkJLyogZXJyb3IgY291bnRlciAqLworCXVfbG9uZyBiX3RwYyA7CQkJLyogZXJyb3IgY291bnRlciAqLworCXVfbG9uZyBiX3RuZSA7CQkJLyogZXJyb3IgY291bnRlciAqLworCXVfbG9uZyBiX3FscyA7CQkJLyogZXJyb3IgY291bnRlciAqLworCXVfbG9uZyBiX2lscyA7CQkJLyogZXJyb3IgY291bnRlciAqLworCXVfbG9uZyBiX2hscyA7CQkJLyogZXJyb3IgY291bnRlciAqLworfSA7CisjZW5kaWYKKworI2lmZGVmCVBST1RPVFlQX0lOQworI2luY2x1ZGUgImZkZGkvZHJpdmVyLnBybyIKKyNlbHNlCS8qIFBST1RPVFlQX0lOQyAqLworLyoKKyAqIGZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLworI2luY2x1ZGUgImgvbWJ1Zi5oIgkvKiBUeXBlIGRlZmluaXRpb25zIGZvciBNQlVGcyAqLworI2luY2x1ZGUgImgvc210c3RhdGUuaCIJLyogc3RydWN0IHNtdF9zdGF0ZSAqLworCit2b2lkIGh3dF9yZXN0YXJ0KHN0cnVjdCBzX3NtYyAqc21jKTsJLyogaHd0LmMgKi8KK1NNYnVmICpzbXRfYnVpbGRfZnJhbWUoc3RydWN0IHNfc21jICpzbWMsIGludCBjbGFzcywgaW50IHR5cGUsCisJCSAgICAgICBpbnQgbGVuZ3RoKTsJLyogc210LmMgKi8KK1NNYnVmICpzbXRfZ2V0X21idWYoc3RydWN0IHNfc21jICpzbWMpOwkvKiBkcnZzci5jICovCit2b2lkICpzbV90b19wYXJhKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X2hlYWRlciAqc20sCisJCSBpbnQgcGFyYSk7CQkvKiBzbXQuYyAqLworCisjaWZuZGVmIFNLX1VOVVNFRAorI2RlZmluZSBTS19VTlVTRUQodmFyKQkJKHZvaWQpKHZhcikKKyNlbmRpZgorCit2b2lkIHF1ZXVlX2V2ZW50KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgY2xhc3MsIGludCBldmVudCk7Cit2b2lkIGVjbShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGV2ZW50KTsKK3ZvaWQgZWNtX2luaXQoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBybXQoc3RydWN0IHNfc21jICpzbWMsIGludCBldmVudCk7Cit2b2lkIHJtdF9pbml0KHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgcGNtKHN0cnVjdCBzX3NtYyAqc21jLCBjb25zdCBpbnQgbnAsIGludCBldmVudCk7Cit2b2lkIHBjbV9pbml0KHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgY2ZtKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgZXZlbnQpOwordm9pZCBjZm1faW5pdChzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIHNtdF90aW1lcl9zdGFydChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF90aW1lciAqdGltZXIsIHVfbG9uZyB0aW1lLAorCQkgICAgIHVfbG9uZyB0b2tlbik7Cit2b2lkIHNtdF90aW1lcl9zdG9wKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3RpbWVyICp0aW1lcik7Cit2b2lkIHBjbV9zdGF0dXNfc3RhdGUoc3RydWN0IHNfc21jICpzbWMsIGludCBucCwgaW50ICp0eXBlLCBpbnQgKnN0YXRlLAorCQkgICAgICBpbnQgKnJlbW90ZSwgaW50ICptYWMpOwordm9pZCBwbGNfY29uZmlnX211eChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG11eCk7Cit2b2lkIHNtX2xlbV9ldmFsdWF0ZShzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIHNtdF9jbGVhcl91bmFfZG5hKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgbWFjX3VwZGF0ZV9jb3VudGVyKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgc21fcG1fbHNfbGF0Y2goc3RydWN0IHNfc21jICpzbWMsIGludCBwaHksIGludCBvbl9vZmYpOwordm9pZCBzbV9tYV9jb250cm9sKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbW9kZSk7Cit2b2lkIHNtX21hY19jaGVja19iZWFjb25fY2xhaW0oc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBjb25maWdfbXV4KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbXV4KTsKK3ZvaWQgc210X2FnZW50X2luaXQoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBzbXRfdGltZXJfaW5pdChzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIHNtdF9yZWNlaXZlZF9wYWNrKHN0cnVjdCBzX3NtYyAqc21jLCBTTWJ1ZiAqbWIsIGludCBmcyk7Cit2b2lkIHNtdF9hZGRfcGFyYShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNfcGNvbiAqcGNvbiwgdV9zaG9ydCBwYXJhLAorCQkgIGludCBpbmRleCwgaW50IGxvY2FsKTsKK3ZvaWQgc210X3N3YXBfcGFyYShzdHJ1Y3Qgc210X2hlYWRlciAqc20sIGludCBsZW4sIGludCBkaXJlY3Rpb24pOwordm9pZCBldl9pbml0KHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgaHd0X2luaXQoc3RydWN0IHNfc21jICpzbWMpOwordV9sb25nIGh3dF9yZWFkKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgaHd0X3N0b3Aoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBod3Rfc3RhcnQoc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyB0aW1lKTsKK3ZvaWQgc210X3NlbmRfbWJ1ZihzdHJ1Y3Qgc19zbWMgKnNtYywgU01idWYgKm1iLCBpbnQgZmMpOwordm9pZCBzbXRfZnJlZV9tYnVmKHN0cnVjdCBzX3NtYyAqc21jLCBTTWJ1ZiAqbWIpOwordm9pZCBzbV9wbV9ieXBhc3NfcmVxKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbW9kZSk7Cit2b2lkIHJtdF9pbmRpY2F0aW9uKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgaSk7Cit2b2lkIGNmbV9zdGF0ZV9jaGFuZ2Uoc3RydWN0IHNfc21jICpzbWMsIGludCBjX3N0YXRlKTsKKworI2lmIGRlZmluZWQoREVCVUcpIHx8ICFkZWZpbmVkKE5PX1NNVF9QQU5JQykKK3ZvaWQgc210X3BhbmljKHN0cnVjdCBzX3NtYyAqc21jLCBjaGFyICp0ZXh0KTsKKyNlbHNlCisjZGVmaW5lCXNtdF9wYW5pYyhzbWMsdGV4dCkKKyNlbmRpZiAvKiBERUJVRyB8fCAhTk9fU01UX1BBTklDICovCisKK3ZvaWQgc210X3N0YXRfY291bnRlcihzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHN0YXQpOwordm9pZCBzbXRfdGltZXJfcG9sbChzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit1X2xvbmcgc210X2dldF90aW1lKHZvaWQpOwordV9sb25nIHNtdF9nZXRfdGlkKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgc210X3RpbWVyX2RvbmUoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBzbXRfc2V0X2RlZmF1bHRzKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgc210X2ZpeHVwX21pYihzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIHNtdF9yZXNldF9kZWZhdWx0cyhzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGxldmVsKTsKK3ZvaWQgc210X2FnZW50X3Rhc2soc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBzbXRfcGxlYXNlX3JlY29ubmVjdChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHJlY29ubl90aW1lKTsKK2ludCBzbXRfY2hlY2tfcGFyYShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9oZWFkZXIgKnNtLAorCQkgICBjb25zdCB1X3Nob3J0IGxpc3RbXSk7Cit2b2lkIGRyaXZlcl9nZXRfYmlhKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3QgZmRkaV9hZGRyICpiaWFfYWRkcik7CisKKyNpZmRlZiBTVVBFUk5FVF8zCit2b2lkIGRydl9yZXNldF9pbmRpY2F0aW9uKHN0cnVjdCBzX3NtYyAqc21jKTsKKyNlbmRpZgkvKiBTVVBFUk5FVF8zICovCisKK3ZvaWQgc210X3N0YXJ0X3dhdGNoZG9nKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgc210X2V2ZW50KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgZXZlbnQpOwordm9pZCB0aW1lcl9ldmVudChzdHJ1Y3Qgc19zbWMgKnNtYywgdV9sb25nIHRva2VuKTsKK3ZvaWQgZXZfZGlzcGF0Y2hlcihzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIHBjbV9nZXRfc3RhdGUoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfc3RhdGUgKnN0YXRlKTsKK3ZvaWQgZWNtX3N0YXRlX2NoYW5nZShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGVfc3RhdGUpOworaW50IHNtX3BtX2J5cGFzc19wcmVzZW50KHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgcGNtX3N0YXRlX2NoYW5nZShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHBsYywgaW50IHBfc3RhdGUpOwordm9pZCBybXRfc3RhdGVfY2hhbmdlKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcl9zdGF0ZSk7CitpbnQgc21fcG1fZ2V0X2xzKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcGh5KTsKK2ludCBwY21fZ2V0X3NfcG9ydChzdHJ1Y3Qgc19zbWMgKnNtYyk7CitpbnQgcGNtX3Jvb3RlZF9zdGF0aW9uKHN0cnVjdCBzX3NtYyAqc21jKTsKK2ludCBjZm1fZ2V0X21hY19pbnB1dChzdHJ1Y3Qgc19zbWMgKnNtYyk7CitpbnQgY2ZtX2dldF9tYWNfb3V0cHV0KHN0cnVjdCBzX3NtYyAqc21jKTsKK2ludCBwb3J0X3RvX21pYihzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHApOworaW50IGNlbV9idWlsZF9wYXRoKHN0cnVjdCBzX3NtYyAqc21jLCBjaGFyICp0bywgaW50IHBhdGhfaW5kZXgpOworaW50IHNtX21hY19nZXRfdHhfc3RhdGUoc3RydWN0IHNfc21jICpzbWMpOworY2hhciAqZ2V0X3BjbXN0YXRlKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbnApOworaW50IHNtdF9hY3Rpb24oc3RydWN0IHNfc21jICpzbWMsIGludCBjbGFzcywgaW50IGNvZGUsIGludCBpbmRleCk7Cit1X3Nob3J0IHNtdF9vbmxpbmUoc3RydWN0IHNfc21jICpzbWMsIGludCBvbik7Cit2b2lkIHNtdF9mb3JjZV9pcnEoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBzbXRfcG1mX3JlY2VpdmVkX3BhY2soc3RydWN0IHNfc21jICpzbWMsIFNNYnVmICptYiwgaW50IGxvY2FsKTsKK3ZvaWQgc210X3NlbmRfZnJhbWUoc3RydWN0IHNfc21jICpzbWMsIFNNYnVmICptYiwgaW50IGZjLCBpbnQgbG9jYWwpOwordm9pZCBzbXRfc2V0X3RpbWVzdGFtcChzdHJ1Y3Qgc19zbWMgKnNtYywgdV9jaGFyICpwKTsKK3ZvaWQgbWFjX3NldF9yeF9tb2RlKHN0cnVjdCBzX3NtYyAqc21jLAlpbnQgbW9kZSk7CitpbnQgbWFjX2FkZF9tdWx0aWNhc3Qoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBmZGRpX2FkZHIgKmFkZHIsIGludCBjYW4pOworaW50IG1hY19zZXRfZnVuY19hZGRyKHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgZl9hZGRyKTsKK3ZvaWQgbWFjX2RlbF9tdWx0aWNhc3Qoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBmZGRpX2FkZHIgKmFkZHIsIGludCBjYW4pOwordm9pZCBtYWNfdXBkYXRlX211bHRpY2FzdChzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIG1hY19jbGVhcl9tdWx0aWNhc3Qoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBzZXRfZm9ybWFjX3RzeW5jKHN0cnVjdCBzX3NtYyAqc21jLCBsb25nIHN5bmNfYncpOwordm9pZCBmb3JtYWNfcmVpbml0X3R4KHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgZm9ybWFjX3R4X3Jlc3RhcnQoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBwcm9jZXNzX3JlY2VpdmUoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBpbml0X2RyaXZlcl9mcGx1cyhzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIHJ0bV9pcnEoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBydG1fc2V0X3RpbWVyKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgcmluZ19zdGF0dXNfaW5kaWNhdGlvbihzdHJ1Y3Qgc19zbWMgKnNtYywgdV9sb25nIHN0YXR1cyk7Cit2b2lkIGxsY19yZWNvdmVyX3R4KHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgbGxjX3Jlc3RhcnRfdHgoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBwbGNfY2xlYXJfaXJxKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcCk7Cit2b2lkIHBsY19pcnEoc3RydWN0IHNfc21jICpzbWMsCWludCBucCwJdW5zaWduZWQgaW50IGNtZCk7CitpbnQgc210X3NldF9tYWNfb3B2YWx1ZXMoc3RydWN0IHNfc21jICpzbWMpOworCisjaWZkZWYgVEFHX01PREUKK3ZvaWQgbWFjX2Rydl9wY2lfZml4KHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgZml4X3ZhbHVlKTsKK3ZvaWQgbWFjX2RvX3BjaV9maXgoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBtYWNfZHJ2X2NsZWFyX3R4X3F1ZXVlKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgbWFjX2Rydl9yZXBhaXJfZGVzY3Ioc3RydWN0IHNfc21jICpzbWMpOwordV9sb25nIGh3dF9xdWlja19yZWFkKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgaHd0X3dhaXRfdGltZShzdHJ1Y3Qgc19zbWMgKnNtYywgdV9sb25nIHN0YXJ0LCBsb25nIGR1cmF0aW9uKTsKKyNlbmRpZgorCisjaWZkZWYgU01UX1BOTUkKK2ludCBwbm1pX2luaXQoc3RydWN0IHNfc21jKiBzbWMpOworaW50IHBubWlfcHJvY2Vzc19uZGlzX2lkKHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgbmRpc19vaWQsIHZvaWQgKmJ1ZiwgaW50IGxlbiwKKwkJCSBpbnQgKkJ5dGVzQWNjZXNzZWQsIGludCAqQnl0ZXNOZWVkZWQsIHVfY2hhciBhY3Rpb24pOworI2VuZGlmCisKKyNpZmRlZglTQkEKKyNpZm5kZWYgX0gySU5DCit2b2lkIHNiYSgpOworI2VuZGlmCit2b2lkIHNiYV9yYWZfcmVjZWl2ZWRfcGFjaygpOwordm9pZCBzYmFfdGltZXJfcG9sbCgpOwordm9pZCBzbXRfaW5pdF9zYmEoKTsKKyNlbmRpZgorCisjaWZkZWYJRVNTCitpbnQgZXNzX3JhZl9yZWNlaXZlZF9wYWNrKHN0cnVjdCBzX3NtYyAqc21jLCBTTWJ1ZiAqbWIsIHN0cnVjdCBzbXRfaGVhZGVyICpzbSwKKwkJCSAgaW50IGZzKTsKK3ZvaWQgZXNzX3RpbWVyX3BvbGwoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBlc3NfcGFyYV9jaGFuZ2Uoc3RydWN0IHNfc21jICpzbWMpOworI2VuZGlmCisKKyNpZm5kZWYJQk9PVAordm9pZCBzbXRfaW5pdF9ldmMoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBzbXRfc3JmX2V2ZW50KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgY29kZSwgaW50IGluZGV4LCBpbnQgY29uZCk7CisjZWxzZQorI2RlZmluZSBzbXRfaW5pdF9ldmMoc21jKQorI2RlZmluZSBzbXRfc3JmX2V2ZW50KHNtYyxjb2RlLGluZGV4LGNvbmQpCisjZW5kaWYKKworI2lmbmRlZiBTTVRfUkVBTF9UT0tFTl9DVAordm9pZCBzbXRfZW11bGF0ZV90b2tlbl9jdChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG1hY19pbmRleCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoREVCVUcpICYmICFkZWZpbmVkKEJPT1QpCit2b2lkIGR1bXBfc210KHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X2hlYWRlciAqc20sIGNoYXIgKnRleHQpOworI2Vsc2UKKyNkZWZpbmUJZHVtcF9zbXQoc21jLHNtLHRleHQpCisjZW5kaWYKKworI2lmZGVmCURFQlVHCitjaGFyKiBhZGRyX3RvX3N0cmluZyhzdHJ1Y3QgZmRkaV9hZGRyICphZGRyKTsKK3ZvaWQgZHVtcF9oZXgoY2hhciAqcCwgaW50IGxlbik7CisjZW5kaWYKKworI2VuZGlmCS8qIFBST1RPVFlQX0lOQyAqLworCisvKiBQTk1JIGRlZmF1bHQgZGVmaW5lcyAqLworI2lmbmRlZiBQTk1JX0lOSVQKKyNkZWZpbmUJUE5NSV9JTklUKHNtYykJLyogTm90aGluZyAqLworI2VuZGlmCisjaWZuZGVmIFBOTUlfR0VUX0lECisjZGVmaW5lIFBOTUlfR0VUX0lEKCBzbWMsIG5kaXNfb2lkLCBidWYsIGxlbiwgQnl0ZXNXcml0dGVuLCBCeXRlc05lZWRlZCApIFwKKwkJKCAxID8gKC0xKSA6ICgtMSkgKQorI2VuZGlmCisjaWZuZGVmIFBOTUlfU0VUX0lECisjZGVmaW5lIFBOTUlfU0VUX0lEKCBzbWMsIG5kaXNfb2lkLCBidWYsIGxlbiwgQnl0ZXNSZWFkLCBCeXRlc05lZWRlZCwgXAorCQlzZXRfdHlwZSkgKCAxID8gKC0xKSA6ICgtMSkgKQorI2VuZGlmCisKKy8qCisgKiBTTVRfUEFOSUMgZGVmaW5lcworICovCisjaWZuZGVmCVNNVF9QQU5JQworI2RlZmluZQlTTVRfUEFOSUMoc21jLG5yLG1zZykJc210X3BhbmljIChzbWMsIG1zZykKKyNlbmRpZgorCisjaWZuZGVmCVNNVF9FUlJfTE9HCisjZGVmaW5lCVNNVF9FUlJfTE9HKHNtYyxucixtc2cpCVNNVF9QQU5JQyAoc21jLCBuciwgbXNnKQorI2VuZGlmCisKKyNpZm5kZWYJU01UX0VCQVNFCisjZGVmaW5lCVNNVF9FQkFTRQkxMDAKKyNlbmRpZgorCisjZGVmaW5lCVNNVF9FMDEwMAlTTVRfRUJBU0UgKyAwCisjZGVmaW5lCVNNVF9FMDEwMF9NU0cJImNmbSBGU006IGludmFsaWQgY2VfdHlwZSIKKyNkZWZpbmUJU01UX0UwMTAxCVNNVF9FQkFTRSArIDEKKyNkZWZpbmUJU01UX0UwMTAxX01TRwkiQ0VNOiBjYXNlID8/PyIKKyNkZWZpbmUJU01UX0UwMTAyCVNNVF9FQkFTRSArIDIKKyNkZWZpbmUJU01UX0UwMTAyX01TRwkiQ0VNIEE6IGludmFsaWQgc3RhdGUiCisjZGVmaW5lCVNNVF9FMDEwMwlTTVRfRUJBU0UgKyAzCisjZGVmaW5lCVNNVF9FMDEwM19NU0cJIkNFTSBCOiBpbnZhbGlkIHN0YXRlIgorI2RlZmluZQlTTVRfRTAxMDQJU01UX0VCQVNFICsgNAorI2RlZmluZQlTTVRfRTAxMDRfTVNHCSJDRU0gTTogaW52YWxpZCBzdGF0ZSIKKyNkZWZpbmUJU01UX0UwMTA1CVNNVF9FQkFTRSArIDUKKyNkZWZpbmUJU01UX0UwMTA1X01TRwkiQ0VNIFM6IGludmFsaWQgc3RhdGUiCisjZGVmaW5lCVNNVF9FMDEwNglTTVRfRUJBU0UgKyA2CisjZGVmaW5lCVNNVF9FMDEwNl9NU0cJIkNGTSA6IGludmFsaWQgc3RhdGUiCisjZGVmaW5lCVNNVF9FMDEwNwlTTVRfRUJBU0UgKyA3CisjZGVmaW5lCVNNVF9FMDEwN19NU0cJIkVDTSA6IGludmFsaWQgc3RhdGUiCisjZGVmaW5lCVNNVF9FMDEwOAlTTVRfRUJBU0UgKyA4CisjZGVmaW5lCVNNVF9FMDEwOF9NU0cJInByb3BfYWN0aW9ucyA6IE5BQyBpbiBEQVMgQ0ZNIgorI2RlZmluZQlTTVRfRTAxMDkJU01UX0VCQVNFICsgOQorI2RlZmluZQlTTVRfRTAxMDlfTVNHCSJTVDJVLkZNX1NFUlJTRiBlcnJvciBpbiBzcGVjaWFsIGZyYW1lIgorI2RlZmluZQlTTVRfRTAxMTAJU01UX0VCQVNFICsgMTAKKyNkZWZpbmUJU01UX0UwMTEwX01TRwkiU1QyVS5GTV9TUkZSQ1RPViByZWN2LiBjb3VudC4gb3ZlcmZsb3ciCisjZGVmaW5lCVNNVF9FMDExMQlTTVRfRUJBU0UgKyAxMQorI2RlZmluZQlTTVRfRTAxMTFfTVNHCSJTVDJVLkZNX1NORlNMRCBOUCAmIEZPUk1BQyBzaW11bHQuIGxvYWQiCisjZGVmaW5lCVNNVF9FMDExMglTTVRfRUJBU0UgKyAxMgorI2RlZmluZQlTTVRfRTAxMTJfTVNHCSJTVDJVLkZNX1NSQ1ZGUk0gc2luZ2xlLWZyYW1lIHJlY3YuLW1vZGUiCisjZGVmaW5lCVNNVF9FMDExMwlTTVRfRUJBU0UgKyAxMworI2RlZmluZQlTTVRfRTAxMTNfTVNHCSJGUExVUzogQnVmZmVyIE1lbW9yeSBFcnJvciIKKyNkZWZpbmUJU01UX0UwMTE0CVNNVF9FQkFTRSArIDE0CisjZGVmaW5lCVNNVF9FMDExNF9NU0cJIlNUMlUuRk1fU0VSUlNGIGVycm9yIGluIHNwZWNpYWwgZnJhbWUiCisjZGVmaW5lCVNNVF9FMDExNQlTTVRfRUJBU0UgKyAxNQorI2RlZmluZQlTTVRfRTAxMTVfTVNHCSJTVDNMOiBwYXJpdHkgZXJyb3IgaW4gcmVjZWl2ZSBxdWV1ZSAyIgorI2RlZmluZQlTTVRfRTAxMTYJU01UX0VCQVNFICsgMTYKKyNkZWZpbmUJU01UX0UwMTE2X01TRwkiU1QzTDogcGFyaXR5IGVycm9yIGluIHJlY2VpdmUgcXVldWUgMSIKKyNkZWZpbmUJU01UX0UwMTE3CVNNVF9FQkFTRSArIDE3CisjZGVmaW5lCVNNVF9FMDExN19NU0cJIkVfU01UXzAwMTogUnhEIGNvdW50IGZvciByZWNlaXZlIHF1ZXVlIDEgPSAwIgorI2RlZmluZQlTTVRfRTAxMTgJU01UX0VCQVNFICsgMTgKKyNkZWZpbmUJU01UX0UwMTE4X01TRwkiUENNIDogaW52YWxpZCBzdGF0ZSIKKyNkZWZpbmUJU01UX0UwMTE5CVNNVF9FQkFTRSArIDE5CisjZGVmaW5lCVNNVF9FMDExOV9NU0cJInNtdF9hZGRfcGFyYSIKKyNkZWZpbmUJU01UX0UwMTIwCVNNVF9FQkFTRSArIDIwCisjZGVmaW5lCVNNVF9FMDEyMF9NU0cJInNtdF9zZXRfcGFyYSIKKyNkZWZpbmUJU01UX0UwMTIxCVNNVF9FQkFTRSArIDIxCisjZGVmaW5lCVNNVF9FMDEyMV9NU0cJImludmFsaWQgZXZlbnQgaW4gZGlzcGF0Y2hlciIKKyNkZWZpbmUJU01UX0UwMTIyCVNNVF9FQkFTRSArIDIyCisjZGVmaW5lCVNNVF9FMDEyMl9NU0cJIlJNVCA6IGludmFsaWQgc3RhdGUiCisjZGVmaW5lCVNNVF9FMDEyMwlTTVRfRUJBU0UgKyAyMworI2RlZmluZQlTTVRfRTAxMjNfTVNHCSJTQkE6IHN0YXRlIG1hY2hpbmUgaGFzIGludmFsaWQgc3RhdGUiCisjZGVmaW5lCVNNVF9FMDEyNAlTTVRfRUJBU0UgKyAyNAorI2RlZmluZQlTTVRfRTAxMjRfTVNHCSJzYmFfZnJlZV9zZXNzaW9uKCkgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIgorI2RlZmluZQlTTVRfRTAxMjUJU01UX0VCQVNFICsgMjUKKyNkZWZpbmUJU01UX0UwMTI1X01TRwkiU0JBIDogaW52YWxpZCBzZXNzaW9uIHBvaW50ZXIiCisjZGVmaW5lCVNNVF9FMDEyNglTTVRfRUJBU0UgKyAyNgorI2RlZmluZQlTTVRfRTAxMjZfTVNHCSJzbXRfZnJlZV9tYnVmKCkgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyXG4iCisjZGVmaW5lCVNNVF9FMDEyNwlTTVRfRUJBU0UgKyAyNworI2RlZmluZQlTTVRfRTAxMjdfTVNHCSJzaXplb2YgZXZjcyIKKyNkZWZpbmUJU01UX0UwMTI4CVNNVF9FQkFTRSArIDI4CisjZGVmaW5lCVNNVF9FMDEyOF9NU0cJImV2Yy0+ZXZjX2NvbmRfc3RhdGUgPSAwIgorI2RlZmluZQlTTVRfRTAxMjkJU01UX0VCQVNFICsgMjkKKyNkZWZpbmUJU01UX0UwMTI5X01TRwkiZXZjLT5ldmNfbXVsdGlwbGUgPSAwIgorI2RlZmluZQlTTVRfRTAxMzAJU01UX0VCQVNFICsgMzAKKyNkZWZpbmUJU01UX0UwMTMwX01TRwl3cml0ZV9tZHJfd2FybmluZworI2RlZmluZQlTTVRfRTAxMzEJU01UX0VCQVNFICsgMzEKKyNkZWZpbmUJU01UX0UwMTMxX01TRwljYW1fd2FybmluZworI2RlZmluZSBTTVRfRTAxMzIJU01UX0VCQVNFICsgMzIKKyNkZWZpbmUgU01UX0UwMTMyX01TRwkiU1QxTC5GTV9TUENFUER4IHBhcml0eS9jb2RpbmcgZXJyb3IiCisjZGVmaW5lIFNNVF9FMDEzMwlTTVRfRUJBU0UgKyAzMworI2RlZmluZSBTTVRfRTAxMzNfTVNHCSJTVDFMLkZNX1NUQlVSeCB0eCBidWZmZXIgdW5kZXJydW4iCisjZGVmaW5lIFNNVF9FMDEzNAlTTVRfRUJBU0UgKyAzNAorI2RlZmluZSBTTVRfRTAxMzRfTVNHCSJTVDFMLkZNX1NQQ0VQRHggcGFyaXR5IGVycm9yIgorI2RlZmluZSBTTVRfRTAxMzUJU01UX0VCQVNFICsgMzUKKyNkZWZpbmUgU01UX0UwMTM1X01TRwkiUk1UOiBkdXBsaWNhdGUgTUFDIGFkZHJlc3MgZGV0ZWN0ZWQuIFJpbmcgbGVmdCEiCisjZGVmaW5lIFNNVF9FMDEzNglTTVRfRUJBU0UgKyAzNgorI2RlZmluZSBTTVRfRTAxMzZfTVNHCSJFbGFzdGljaXR5IEJ1ZmZlciBoYW5nLXVwIgorI2RlZmluZSBTTVRfRTAxMzcJU01UX0VCQVNFICsgMzcKKyNkZWZpbmUgU01UX0UwMTM3X01TRwkiU01UOiBxdWV1ZSBvdmVycnVuIgorI2RlZmluZSBTTVRfRTAxMzgJU01UX0VCQVNFICsgMzgKKyNkZWZpbmUgU01UX0UwMTM4X01TRwkiUk1UOiBkdXBsaWNhdGUgTUFDIGFkZHJlc3MgZGV0ZWN0ZWQuIFJpbmcgTk9UIGxlZnQhIgorI2VuZGlmCS8qIF9DTVRERUZfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2gvZmRkaS5oIGIvZHJpdmVycy9uZXQvc2tmcC9oL2ZkZGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWEyOGE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9oL2ZkZGkuaApAQCAtMCwwICsxLDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCV9GRERJXworI2RlZmluZSBfRkRESV8KKworc3RydWN0IGZkZGlfYWRkciB7CisJdV9jaGFyCWFbNl0gOworfSA7CisKKyNkZWZpbmUgR1JPVVBfQUREUgkweDgwCQkvKiBNU0IgaW4gYVswXSAqLworCitzdHJ1Y3QgZmRkaV9tYWMgeworCXN0cnVjdCBmZGRpX2FkZHIJbWFjX2Rlc3QgOworCXN0cnVjdCBmZGRpX2FkZHIJbWFjX3NvdXJjZSA7CisJdV9jaGFyCQkJbWFjX2luZm9bNDQ3OF0gOworfSA7CisKKyNkZWZpbmUgRkRESV9NQUNfU0laRQkoMTIpCisjZGVmaW5lIEZERElfUkFXX01UVQkoNDUwMC01KQkvKiBleGwuIFByLFNELCBFRC9GUyAqLworI2RlZmluZSBGRERJX1JBVwkoNDUwMCkKKworLyoKKyAqIEZDIHZhbHVlcworICovCisjZGVmaW5lIEZDX1ZPSUQJCTB4NDAJCS8qIHZvaWQgZnJhbWUgKi8KKyNkZWZpbmUgRkNfVE9LRU4JMHg4MAkJLyogdG9rZW4gKi8KKyNkZWZpbmUgRkNfUkVTX1RPS0VOCTB4YzAJCS8qIHJlc3RyaWN0ZWQgdG9rZW4gKi8KKyNkZWZpbmUgRkNfU01UX0lORk8JMHg0MQkJLyogU01UIEluZm8gZnJhbWUgKi8KKy8qCisgKiBGQ19TTVRfTEFOX0xPQyAmJiBGQ19TTVRfTE9DIGFyZSBTSyBzcGVjaWZpYyAhCisgKi8KKyNkZWZpbmUgRkNfU01UX0xBTl9MT0MJMHg0MgkJLyogbG9jYWwgU01UIEluZm8gZnJhbWUgKi8KKyNkZWZpbmUgRkNfU01UX0xPQwkweDQzCQkvKiBsb2NhbCBTTVQgSW5mbyBmcmFtZSAqLworI2RlZmluZSBGQ19TTVRfTlNBCTB4NGYJCS8qIFNNVCBOU0EgZnJhbWUgKi8KKyNkZWZpbmUgRkNfTUFDCQkweGMwCQkvKiBNQUMgZnJhbWUgKi8KKyNkZWZpbmUgRkNfQkVBQ09OCTB4YzIJCS8qIE1BQyBiZWFjb24gZnJhbWUgKi8KKyNkZWZpbmUgRkNfQ0xBSU0JMHhjMwkJLyogTUFDIGNsYWltIGZyYW1lICovCisjZGVmaW5lIEZDX1NZTkNfTExDCTB4ZDAJCS8qIHN5bmMuIExMQyBmcmFtZSAqLworI2RlZmluZSBGQ19BU1lOQ19MTEMJMHg1MAkJLyogYXN5bmMuIExMQyBmcmFtZSAqLworI2RlZmluZSBGQ19TWU5DX0JJVAkweDgwCQkvKiBzeW5jLiBiaXQgaW4gRkMgKi8KKworI2RlZmluZSBGQ19MTENfUFJJT1IJMHgwNwkJLyogcHJpb3JpdHkgYml0cyAqLworCisjZGVmaW5lIEJFQUNPTl9JTkZPCTAJCS8qIGJlYWNvbiB0eXBlICovCisjZGVmaW5lIERCRUFDT05fSU5GTwkxCQkvKiBiZWFjb24gdHlwZSBESVJFQ1RFRCAqLworCisKKy8qCisgKiBpbmRpY2F0b3IgYml0cworICovCisjZGVmaW5lIENfSU5ESUNBVE9SCSgxPDwwKQorI2RlZmluZSBBX0lORElDQVRPUgkoMTw8MSkKKyNkZWZpbmUgRV9JTkRJQ0FUT1IJKDE8PDIpCisjZGVmaW5lIElfSU5ESUNBVE9SCSgxPDw2KQkJLyogU0sgc3BlY2lmaWMgKi8gCisjZGVmaW5lIExfSU5ESUNBVE9SCSgxPDw3KQkJLyogU0sgc3BlY2lmaWMgKi8KKworI2VuZGlmCS8qIF9GRERJXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9oL2ZkZGltaWIuaCBiL2RyaXZlcnMvbmV0L3NrZnAvaC9mZGRpbWliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFhY2RjNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvaC9mZGRpbWliLmgKQEAgLTAsMCArMSwzNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OCwxOTk5IFN5c0tvbm5lY3QsCisgKglhIGJ1c2luZXNzIHVuaXQgb2YgU2NobmVpZGVyICYgS29jaCAmIENvLiBEYXRlbnN5c3RlbWUgR21iSC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBGRERJIE1JQgorICovCisKKy8qCisgKiB0eXBlZGVmcworICovCisKK3R5cGVkZWYJdV9sb25nCUNvdW50ZXIgOwordHlwZWRlZiB1X2NoYXIJVGltZVN0YW1wWzhdIDsKK3R5cGVkZWYgc3RydWN0IGZkZGlfYWRkciBMb25nQWRkciA7Cit0eXBlZGVmCXVfbG9uZwlUaW1lcl8yIDsKK3R5cGVkZWYJdV9sb25nCVRpbWVyIDsKK3R5cGVkZWYJdV9zaG9ydAlSZXNJZCA7Cit0eXBlZGVmIHVfc2hvcnQJU01URW51bSA7Cit0eXBlZGVmCXVfY2hhcglTTVRGbGFnIDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUNvdW50ZXIJCWNvdW50IDsKKwlUaW1lU3RhbXAJdGltZXN0YW1wIDsKK30gU2V0Q291bnRUeXBlIDsKKworLyoKKyAqIGJpdHMgZm9yIGJpdCBzdHJpbmcgImF2YWlsYWJsZV9wYXRoIgorICovCisjZGVmaW5lIE1JQl9QQVRIX1AJKDE8PDApCisjZGVmaW5lIE1JQl9QQVRIX1MJKDE8PDEpCisjZGVmaW5lIE1JQl9QQVRIX0wJKDE8PDIpCisKKy8qCisgKiBiaXRzIGZvciBiaXQgc3RyaW5nIFBlcm1pdHRlZFBhdGhzICYgUmVxdWVzdGVkUGF0aHMgKFNJWkUoOCkpCisgKi8KKyNkZWZpbmUgTUlCX1BfUEFUSF9MT0NBTAkoMTw8MCkKKyNkZWZpbmUgTUlCX1BfUEFUSF9TRUNfQUxURVIJKDE8PDEpCisjZGVmaW5lIE1JQl9QX1BBVEhfUFJJTV9BTFRFUgkoMTw8MikKKyNkZWZpbmUgTUlCX1BfUEFUSF9DT05fQUxURVIJKDE8PDMpCisjZGVmaW5lIE1JQl9QX1BBVEhfU0VDX1BSRUZFUgkoMTw8NCkKKyNkZWZpbmUgTUlCX1BfUEFUSF9QUklNX1BSRUZFUgkoMTw8NSkKKyNkZWZpbmUgTUlCX1BfUEFUSF9DT05fUFJFRkVSCSgxPDw2KQorI2RlZmluZSBNSUJfUF9QQVRIX1RIUlUJCSgxPDw3KQorCisvKgorICogZW51bSBjdXJyZW50IHBhdGgKKyAqLworI2RlZmluZSBNSUJfUEFUSF9JU09MQVRFRAkwCisjZGVmaW5lIE1JQl9QQVRIX0xPQ0FMCQkxCisjZGVmaW5lIE1JQl9QQVRIX1NFQ09OREFSWQkyCisjZGVmaW5lIE1JQl9QQVRIX1BSSU1BUlkJMworI2RlZmluZSBNSUJfUEFUSF9DT05DQVRFTkFURUQJNAorI2RlZmluZSBNSUJfUEFUSF9USFJVCQk1CisKKy8qCisgKiBlbnVtIFBNRENsYXNzCisgKi8KKyNkZWZpbmUgTUlCX1BNRENMQVNTX01VTFRJCTAKKyNkZWZpbmUgTUlCX1BNRENMQVNTX1NJTkdMRTEJMQorI2RlZmluZSBNSUJfUE1EQ0xBU1NfU0lOR0xFMgkyCisjZGVmaW5lIE1JQl9QTURDTEFTU19TT05FVAkzCisjZGVmaW5lIE1JQl9QTURDTEFTU19MQ0YJNAorI2RlZmluZSBNSUJfUE1EQ0xBU1NfVFAJCTUKKyNkZWZpbmUgTUlCX1BNRENMQVNTX1VOS05PV04JNgorI2RlZmluZSBNSUJfUE1EQ0xBU1NfVU5TUEVDCTcKKworLyoKKyAqIGVudW0gU01UU3RhdGlvblN0YXR1cworICovCisjZGVmaW5lIE1JQl9TTVRfU1RBU1RBX0NPTgkwCisjZGVmaW5lIE1JQl9TTVRfU1RBU1RBX1NFUEEJMQorI2RlZmluZSBNSUJfU01UX1NUQVNUQV9USFJVCTIKKworCitzdHJ1Y3QgZmRkaV9taWIgeworCS8qCisJICogcHJpdmF0ZQorCSAqLworCXVfY2hhcgkJCWZkZGlQUlBNRlBhc3N3ZFs4XSA7CisJc3RydWN0IHNtdF9zaWQJCWZkZGlQUlBNRlN0YXRpb24gOworCisjaWZkZWYJRVNTCisJLyoKKwkgKiBwcml2YXRlIHZhcmlhYmxlcyBmb3Igc3RhdGljIGFsbG9jYXRpb24gb2YgdGhlCisJICogRW5kIFN0YXRpb24gU3VwcG9ydAorCSAqLworCXVfbG9uZwlmZGRpRVNTUGF5bG9hZCA7CS8qIHBheWxvYWQgZm9yIHN0YXRpYyBhbGxvYyAqLworCXVfbG9uZwlmZGRpRVNTT3ZlcmhlYWQgOwkvKiBmcmFtZSBvdiBmb3Igc3RhdGljIGFsbG9jICovCisJdV9sb25nCWZkZGlFU1NNYXhUTmVnIDsJLyogbWF4aW11bSBvZiBULU5FRyAqLworCXVfbG9uZwlmZGRpRVNTTWluU2VnbWVudFNpemUgOwkvKiBtaW4gc2l6ZSBvZiB0aGUgc3luYyBmcmFtZXMgKi8KKwl1X2xvbmcJZmRkaUVTU0NhdGVnb3J5IDsJLyogY2F0ZWdvcnkgZm9yIHRoZSBBbGxvYyByZXEgKi8KKwlzaG9ydAlmZGRpRVNTU3luY2hUeE1vZGUgOwkvKiBzZW5kIGFsbCBMTEMgZnJhbWVzIGFzIHN5bmMgKi8KKyNlbmRpZgkvKiBFU1MgKi8KKyNpZmRlZglTQkEKKwkvKgorCSAqIHByaXZhdGUgdmFyaWFibGVzIGZvciB0aGUgU3luY2hyb25vdXMgQmFuZHdpZHRoIEFsbG9jYXRvcgorCSAqLworCWNoYXIJZmRkaVNCQUNvbW1hbmQgOwkvKiBob2xkcyB0aGUgcGFyc2VkIFNCQSBjbWQgKi8KKwl1X2NoYXIJZmRkaVNCQUF2YWlsYWJsZSA7CS8qIFNCQSBhbGxvY2F0YWJsZSB2YWx1ZSAqLworI2VuZGlmCS8qIFNCQSAqLworCisJLyoKKwkgKiBTTVQgc3RhbmRhcmQgbWliCisJICovCisJc3RydWN0IHNtdF9zaWQJCWZkZGlTTVRTdGF0aW9uSWQgOworCXVfc2hvcnQJCQlmZGRpU01UT3BWZXJzaW9uSWQgOworCXVfc2hvcnQJCQlmZGRpU01USGlWZXJzaW9uSWQgOworCXVfc2hvcnQJCQlmZGRpU01UTG9WZXJzaW9uSWQgOworCXVfY2hhcgkJCWZkZGlTTVRNYW51ZmFjdHVyZXJEYXRhWzMyXSA7CisJdV9jaGFyCQkJZmRkaVNNVFVzZXJEYXRhWzMyXSA7CisJdV9zaG9ydAkJCWZkZGlTTVRNSUJWZXJzaW9uSWQgOworCisJLyoKKwkgKiBDb25maWdHcnAKKwkgKi8KKwl1X2NoYXIJCQlmZGRpU01UTWFjX0N0IDsKKwl1X2NoYXIJCQlmZGRpU01UTm9uTWFzdGVyX0N0IDsKKwl1X2NoYXIJCQlmZGRpU01UTWFzdGVyX0N0IDsKKwl1X2NoYXIJCQlmZGRpU01UQXZhaWxhYmxlUGF0aHMgOworCXVfc2hvcnQJCQlmZGRpU01UQ29uZmlnQ2FwYWJpbGl0aWVzIDsKKwl1X3Nob3J0CQkJZmRkaVNNVENvbmZpZ1BvbGljeSA7CisJdV9zaG9ydAkJCWZkZGlTTVRDb25uZWN0aW9uUG9saWN5IDsKKwl1X3Nob3J0CQkJZmRkaVNNVFRUX05vdGlmeSA7CisJdV9jaGFyCQkJZmRkaVNNVFN0YXRScHRQb2xpY3kgOworCXVfbG9uZwkJCWZkZGlTTVRUcmFjZV9NYXhFeHBpcmF0aW9uIDsKKwl1X3Nob3J0CQkJZmRkaVNNVFBPUlRJbmRleGVzW05VTVBIWVNdIDsKKwl1X3Nob3J0CQkJZmRkaVNNVE1BQ0luZGV4ZXMgOworCXVfY2hhcgkJCWZkZGlTTVRCeXBhc3NQcmVzZW50IDsKKworCS8qCisJICogU3RhdHVzR3JwCisJICovCisJU01URW51bQkJCWZkZGlTTVRFQ01TdGF0ZSA7CisJU01URW51bQkJCWZkZGlTTVRDRl9TdGF0ZSA7CisJU01URW51bQkJCWZkZGlTTVRTdGF0aW9uU3RhdHVzIDsKKwl1X2NoYXIJCQlmZGRpU01UUmVtb3RlRGlzY29ubmVjdEZsYWcgOworCXVfY2hhcgkJCWZkZGlTTVRQZWVyV3JhcEZsYWcgOworCisJLyoKKwkgKiBNSUJPcGVyYXRpb25HcnAKKwkgKi8KKwlUaW1lU3RhbXAJCWZkZGlTTVRUaW1lU3RhbXAgOworCVRpbWVTdGFtcAkJZmRkaVNNVFRyYW5zaXRpb25UaW1lU3RhbXAgOworCVNldENvdW50VHlwZQkJZmRkaVNNVFNldENvdW50IDsKKwlzdHJ1Y3Qgc210X3NpZAkJZmRkaVNNVExhc3RTZXRTdGF0aW9uSWQgOworCisJc3RydWN0IGZkZGlfbWliX20geworCQl1X3Nob3J0CQlmZGRpTUFDRnJhbWVTdGF0dXNGdW5jdGlvbnMgOworCQlUaW1lcl8yCQlmZGRpTUFDVF9NYXhDYXBhYmlsaXRpeSA7CisJCVRpbWVyXzIJCWZkZGlNQUNUVlhDYXBhYmlsaXRpeSA7CisKKwkJLyogQ29uZmlnR3JwICovCisJCXVfY2hhcgkJZmRkaU1BQ011bHRpcGxlX04gOwkvKiBwcml2YXRlICovCisJCXVfY2hhcgkJZmRkaU1BQ011bHRpcGxlX1AgOwkvKiBwcml2YXRlICovCisJCXVfY2hhcgkJZmRkaU1BQ0R1cGxpY2F0ZUFkZHJlc3NDb25kIDsvKiBwcml2YXRlICovCisJCXVfY2hhcgkJZmRkaU1BQ0F2YWlsYWJsZVBhdGhzIDsKKwkJdV9zaG9ydAkJZmRkaU1BQ0N1cnJlbnRQYXRoIDsKKwkJTG9uZ0FkZHIJZmRkaU1BQ1Vwc3RyZWFtTmJyIDsKKwkJTG9uZ0FkZHIJZmRkaU1BQ0Rvd25zdHJlYW1OYnIgOworCQlMb25nQWRkcglmZGRpTUFDT2xkVXBzdHJlYW1OYnIgOworCQlMb25nQWRkcglmZGRpTUFDT2xkRG93bnN0cmVhbU5iciA7CisJCVNNVEVudW0JCWZkZGlNQUNEdXBBZGRyZXNzVGVzdCA7CisJCXVfc2hvcnQJCWZkZGlNQUNSZXF1ZXN0ZWRQYXRocyA7CisJCVNNVEVudW0JCWZkZGlNQUNEb3duc3RyZWFtUE9SVFR5cGUgOworCQlSZXNJZAkJZmRkaU1BQ0luZGV4IDsKKworCQkvKiBBZGRyZXNzR3JwICovCisJCUxvbmdBZGRyCWZkZGlNQUNTTVRBZGRyZXNzIDsKKworCQkvKiBPcGVyYXRpb25HcnAgKi8KKwkJVGltZXJfMgkJZmRkaU1BQ1RfTWluIDsJLyogcHJpdmF0ZSAqLworCQlUaW1lcl8yCQlmZGRpTUFDVF9SZXFNSUIgOworCQlUaW1lcl8yCQlmZGRpTUFDVF9SZXEgOwkvKiBwcml2YXRlICovCisJCVRpbWVyXzIJCWZkZGlNQUNUX05lZyA7CisJCVRpbWVyXzIJCWZkZGlNQUNUX01heE1JQiA7CisJCVRpbWVyXzIJCWZkZGlNQUNUX01heCA7CS8qIHByaXZhdGUgKi8KKwkJVGltZXJfMgkJZmRkaU1BQ1R2eFZhbHVlTUlCIDsKKwkJVGltZXJfMgkJZmRkaU1BQ1R2eFZhbHVlIDsgLyogcHJpdmF0ZSAqLworCQlUaW1lcl8yCQlmZGRpTUFDVF9QcmkwIDsKKwkJVGltZXJfMgkJZmRkaU1BQ1RfUHJpMSA7CisJCVRpbWVyXzIJCWZkZGlNQUNUX1ByaTIgOworCQlUaW1lcl8yCQlmZGRpTUFDVF9QcmkzIDsKKwkJVGltZXJfMgkJZmRkaU1BQ1RfUHJpNCA7CisJCVRpbWVyXzIJCWZkZGlNQUNUX1ByaTUgOworCQlUaW1lcl8yCQlmZGRpTUFDVF9Qcmk2IDsKKworCQkvKiBDb3VudGVyc0dycCAqLworCQlDb3VudGVyCQlmZGRpTUFDRnJhbWVfQ3QgOworCQlDb3VudGVyCQlmZGRpTUFDQ29waWVkX0N0IDsKKwkJQ291bnRlcgkJZmRkaU1BQ1RyYW5zbWl0X0N0IDsKKwkJQ291bnRlcgkJZmRkaU1BQ1Rva2VuX0N0IDsKKwkJQ291bnRlcgkJZmRkaU1BQ0Vycm9yX0N0IDsKKwkJQ291bnRlcgkJZmRkaU1BQ0xvc3RfQ3QgOworCQlDb3VudGVyCQlmZGRpTUFDVHZ4RXhwaXJlZF9DdCA7CisJCUNvdW50ZXIJCWZkZGlNQUNOb3RDb3BpZWRfQ3QgOworCQlDb3VudGVyCQlmZGRpTUFDUmluZ09wX0N0IDsKKworCQlDb3VudGVyCQlmZGRpTUFDU01UQ29waWVkX0N0IDsJCS8qIHByaXZhdGUgKi8KKwkJQ291bnRlcgkJZmRkaU1BQ1NNVFRyYW5zbWl0X0N0IDsJCS8qIHByaXZhdGUgKi8KKworCQkvKiBwcml2YXRlIGZvciBkZWx0YSByYXRpbyAqLworCQlDb3VudGVyCQlmZGRpTUFDT2xkX0ZyYW1lX0N0IDsKKwkJQ291bnRlcgkJZmRkaU1BQ09sZF9Db3BpZWRfQ3QgOworCQlDb3VudGVyCQlmZGRpTUFDT2xkX0Vycm9yX0N0IDsKKwkJQ291bnRlcgkJZmRkaU1BQ09sZF9Mb3N0X0N0IDsKKwkJQ291bnRlcgkJZmRkaU1BQ09sZF9Ob3RDb3BpZWRfQ3QgOworCisJCS8qIEZyYW1lRXJyb3JDb25kaXRpb25HcnAgKi8KKwkJdV9zaG9ydAkJZmRkaU1BQ0ZyYW1lRXJyb3JUaHJlc2hvbGQgOworCQl1X3Nob3J0CQlmZGRpTUFDRnJhbWVFcnJvclJhdGlvIDsKKworCQkvKiBOb3RDb3BpZWRDb25kaXRpb25HcnAgKi8KKwkJdV9zaG9ydAkJZmRkaU1BQ05vdENvcGllZFRocmVzaG9sZCA7CisJCXVfc2hvcnQJCWZkZGlNQUNOb3RDb3BpZWRSYXRpbyA7CisKKwkJLyogU3RhdHVzR3JwICovCisJCVNNVEVudW0JCWZkZGlNQUNSTVRTdGF0ZSA7CisJCVNNVEZsYWcJCWZkZGlNQUNEQV9GbGFnIDsKKwkJU01URmxhZwkJZmRkaU1BQ1VOREFfRmxhZyA7CisJCVNNVEZsYWcJCWZkZGlNQUNGcmFtZUVycm9yRmxhZyA7CisJCVNNVEZsYWcJCWZkZGlNQUNOb3RDb3BpZWRGbGFnIDsKKwkJU01URmxhZwkJZmRkaU1BQ01BX1VuaXRkYXRhQXZhaWxhYmxlIDsKKwkJU01URmxhZwkJZmRkaU1BQ0hhcmR3YXJlUHJlc2VudCA7CisJCVNNVEZsYWcJCWZkZGlNQUNNQV9Vbml0ZGF0YUVuYWJsZSA7CisKKwl9IG1bTlVNTUFDU10gOworI2RlZmluZSBNQUMwCTAKKworCXN0cnVjdCBmZGRpX21pYl9hIHsKKwkJUmVzSWQJCWZkZGlQQVRISW5kZXggOworCQl1X2xvbmcJCWZkZGlQQVRIU2JhUGF5bG9hZCA7CisJCXVfbG9uZwkJZmRkaVBBVEhTYmFPdmVyaGVhZCA7CisJCS8qIGZkZGlQQVRIQ29uZmlndXJhdGlvbiBpcyBidWlsdCBvbiBkZW1hbmQgKi8KKwkJLyogdV9sb25nCQlmZGRpUEFUSENvbmZpZ3VyYXRpb24gOyAqLworCQlUaW1lcgkJZmRkaVBBVEhUX1Jtb2RlIDsKKwkJdV9sb25nCQlmZGRpUEFUSFNiYUF2YWlsYWJsZSA7CisJCVRpbWVyXzIJCWZkZGlQQVRIVFZYTG93ZXJCb3VuZCA7CisJCVRpbWVyXzIJCWZkZGlQQVRIVF9NYXhMb3dlckJvdW5kIDsKKwkJVGltZXJfMgkJZmRkaVBBVEhNYXhUX1JlcSA7CisJfSBhW05VTVBBVEhTXSA7CisjZGVmaW5lIFBBVEgwCTAKKworCXN0cnVjdCBmZGRpX21pYl9wIHsKKwkJLyogQ29uZmlnR3JwICovCisJCVNNVEVudW0JCWZkZGlQT1JUTXlfVHlwZSA7CisJCVNNVEVudW0JCWZkZGlQT1JUTmVpZ2hib3JUeXBlIDsKKwkJdV9jaGFyCQlmZGRpUE9SVENvbm5lY3Rpb25Qb2xpY2llcyA7CisJCXN0cnVjdCB7CisJCQl1X2NoYXIJVF92YWwgOworCQkJdV9jaGFyCVJfdmFsIDsKKwkJfSBmZGRpUE9SVE1hY0luZGljYXRlZCA7CisJCVNNVEVudW0JCWZkZGlQT1JUQ3VycmVudFBhdGggOworCQkvKiBtdXN0IGJlIDQ6IGlzIDMyIGJpdCBpbiBTTVQgZm9ybWF0CisJCSAqIGluZGljZXMgOgorCQkgKgkxCW5vbmUKKwkJICoJMgl0cmVlCisJCSAqCTMJcGVlcgorCQkgKi8KKwkJdV9jaGFyCQlmZGRpUE9SVFJlcXVlc3RlZFBhdGhzWzRdIDsKKwkJdV9zaG9ydAkJZmRkaVBPUlRNQUNQbGFjZW1lbnQgOworCQl1X2NoYXIJCWZkZGlQT1JUQXZhaWxhYmxlUGF0aHMgOworCQl1X2NoYXIJCWZkZGlQT1JUQ29ubmVjdGlvbkNhcGFiaWxpdGllcyA7CisJCVNNVEVudW0JCWZkZGlQT1JUUE1EQ2xhc3MgOworCQlSZXNJZAkJZmRkaVBPUlRJbmRleCA7CisKKwkJLyogT3BlcmF0aW9uR3JwICovCisJCVNNVEVudW0JCWZkZGlQT1JUTWFpbnRfTFMgOworCQlTTVRFbnVtCQlmZGRpUE9SVFBDX0xTIDsKKwkJdV9jaGFyCQlmZGRpUE9SVEJTX0ZsYWcgOworCisJCS8qIEVycm9yQ3Ryc0dycCAqLworCQlDb3VudGVyCQlmZGRpUE9SVExDVEZhaWxfQ3QgOworCQlDb3VudGVyCQlmZGRpUE9SVEVCRXJyb3JfQ3QgOworCQlDb3VudGVyCQlmZGRpUE9SVE9sZEVCRXJyb3JfQ3QgOworCisJCS8qIExlckdycCAqLworCQlDb3VudGVyCQlmZGRpUE9SVExlbV9SZWplY3RfQ3QgOworCQlDb3VudGVyCQlmZGRpUE9SVExlbV9DdCA7CisJCXVfY2hhcgkJZmRkaVBPUlRMZXJfRXN0aW1hdGUgOworCQl1X2NoYXIJCWZkZGlQT1JUTGVyX0N1dG9mZiA7CisJCXVfY2hhcgkJZmRkaVBPUlRMZXJfQWxhcm0gOworCisJCS8qIFN0YXR1c0dycCAqLworCQlTTVRFbnVtCQlmZGRpUE9SVENvbm5lY3RTdGF0ZSA7CisJCVNNVEVudW0JCWZkZGlQT1JUUENNU3RhdGUgOwkvKiByZWFsIHZhbHVlICovCisJCVNNVEVudW0JCWZkZGlQT1JUUENNU3RhdGVYIDsJLyogdmFsdWUgZm9yIE1JQiAqLworCQlTTVRFbnVtCQlmZGRpUE9SVFBDX1dpdGhob2xkIDsKKwkJU01URmxhZwkJZmRkaVBPUlRIYXJkd2FyZVByZXNlbnQgOworCQl1X2NoYXIJCWZkZGlQT1JUTGVyRmxhZyA7CisKKwkJdV9jaGFyCQlmZGRpUE9SVE11bHRpcGxlX1UgOwkvKiBwcml2YXRlICovCisJCXVfY2hhcgkJZmRkaVBPUlRNdWx0aXBsZV9QIDsJLyogcHJpdmF0ZSAqLworCQl1X2NoYXIJCWZkZGlQT1JURUJfQ29uZGl0aW9uIDsJLyogcHJpdmF0ZSAqLworCX0gcFtOVU1QSFlTXSA7CisJc3RydWN0IHsKKwkJQ291bnRlcgkJZmRkaVBSSVZFQ0ZfUmVxX1J4IDsJLyogRUNGIHJlcSByZWNlaXZlZCAqLworCQlDb3VudGVyCQlmZGRpUFJJVkVDRl9SZXBseV9SeCA7CS8qIEVDRiByZXBsIHJlY2VpdmVkICovCisJCUNvdW50ZXIJCWZkZGlQUklWRUNGX1JlcV9UeCA7CS8qIEVDRiByZXEgdHJhbnNtICovCisJCUNvdW50ZXIJCWZkZGlQUklWRUNGX1JlcGx5X1R4IDsJLyogRUNGIHJlcGwgdHJhbnNtICovCisJCUNvdW50ZXIJCWZkZGlQUklWUE1GX0dldF9SeCA7CS8qIFBNRiBHZXQgcmVjICovCisJCUNvdW50ZXIJCWZkZGlQUklWUE1GX1NldF9SeCA7CS8qIFBNRiBTZXQgcmVjICovCisJCUNvdW50ZXIJCWZkZGlQUklWUkRGX1J4IDsJLyogUkRGIHJlY2VpdmVkICovCisJCUNvdW50ZXIJCWZkZGlQUklWUkRGX1R4IDsJLyogUkRGIHRyYW5zbWl0dGVkICovCisJfSBwcml2IDsKK30gOworCisvKgorICogT0lEcyBmb3Igc3RhdGlzdGljcworICovCisjZGVmaW5lCVNNVF9PSURfQ0ZfU1RBVEUJMQkvKiBmZGRpU01UQ0ZfU3RhdGUgKi8KKyNkZWZpbmUJU01UX09JRF9QQ01fU1RBVEVfQQkyCS8qIGZkZGlQT1JUUENNU3RhdGUgcG9ydCBBICovCisjZGVmaW5lCVNNVF9PSURfUENNX1NUQVRFX0IJMTcJLyogZmRkaVBPUlRQQ01TdGF0ZSBwb3J0IEIgKi8KKyNkZWZpbmUJU01UX09JRF9STVRfU1RBVEUJMwkvKiBmZGRpTUFDUk1UU3RhdGUgKi8KKyNkZWZpbmUJU01UX09JRF9VTkEJCTQJLyogZmRkaU1BQ1Vwc3RyZWFtTmJyICovCisjZGVmaW5lCVNNVF9PSURfRE5BCQk1CS8qIGZkZGlNQUNPbGREb3duc3RyZWFtTmJyICovCisjZGVmaW5lCVNNVF9PSURfRVJST1JfQ1QJNgkvKiBmZGRpTUFDRXJyb3JfQ3QgKi8KKyNkZWZpbmUJU01UX09JRF9MT1NUX0NUCQk3CS8qIGZkZGlNQUNMb3N0X0N0ICovCisjZGVmaW5lCVNNVF9PSURfTEVNX0NUCQk4CS8qIGZkZGlQT1JUTGVtX0N0ICovCisjZGVmaW5lCVNNVF9PSURfTEVNX0NUX0EJMTEJLyogZmRkaVBPUlRMZW1fQ3QgcG9ydCBBICovCisjZGVmaW5lCVNNVF9PSURfTEVNX0NUX0IJMTIJLyogZmRkaVBPUlRMZW1fQ3QgcG9ydCBCICovCisjZGVmaW5lCVNNVF9PSURfTENUX0ZBSUxfQ1QJOQkvKiBmZGRpUE9SVExDVEZhaWxfQ3QgKi8KKyNkZWZpbmUJU01UX09JRF9MQ1RfRkFJTF9DVF9BCTEzCS8qIGZkZGlQT1JUTENURmFpbF9DdCBwb3J0IEEgKi8KKyNkZWZpbmUJU01UX09JRF9MQ1RfRkFJTF9DVF9CCTE0CS8qIGZkZGlQT1JUTENURmFpbF9DdCBwb3J0IEIgKi8KKyNkZWZpbmUJU01UX09JRF9MRU1fUkVKRUNUX0NUCTEwCS8qIGZkZGlQT1JUTGVtX1JlamVjdF9DdCAqLworI2RlZmluZQlTTVRfT0lEX0xFTV9SRUpFQ1RfQ1RfQQkxNQkvKiBmZGRpUE9SVExlbV9SZWplY3RfQ3QgcG9ydCBBICovCisjZGVmaW5lCVNNVF9PSURfTEVNX1JFSkVDVF9DVF9CCTE2CS8qIGZkZGlQT1JUTGVtX1JlamVjdF9DdCBwb3J0IEIgKi8KKworLyoKKyAqIFNLIE1JQgorICovCisjZGVmaW5lIFNNVF9PSURfRUNGX1JFUV9SWAkyMAkvKiBFQ0YgcmVxdWVzdHMgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgU01UX09JRF9FQ0ZfUkVQTFlfUlgJMjEJLyogRUNGIHJlcGxpZXMgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgU01UX09JRF9FQ0ZfUkVRX1RYCTIyCS8qIEVDRiByZXF1ZXN0cyB0cmFuc21pdHRlZCAqLworI2RlZmluZSBTTVRfT0lEX0VDRl9SRVBMWV9UWAkyMwkvKiBFQ0YgcmVwbGllcyB0cmFuc21pdHRlZCAqLworI2RlZmluZSBTTVRfT0lEX1BNRl9HRVRfUlgJMjQJLyogUE1GIGdldCByZXF1ZXN0cyByZWNlaXZlZCAqLworI2RlZmluZSBTTVRfT0lEX1BNRl9TRVRfUlgJMjUJLyogUE1GIHNldCByZXF1ZXN0cyByZWNlaXZlZCAqLworI2RlZmluZSBTTVRfT0lEX1JERl9SWAkJMjYJLyogUkRGIHJlY2VpdmVkICovCisjZGVmaW5lIFNNVF9PSURfUkRGX1RYCQkyNwkvKiBSREYgdHJhbnNtaXR0ZWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvaC9mcGx1c3RtLmggYi9kcml2ZXJzL25ldC9za2ZwL2gvZnBsdXN0bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YmJmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2gvZnBsdXN0bS5oCkBAIC0wLDAgKzEsMjc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJQU1EIEZwbHVzIGluIHRhZyBtb2RlIGRhdGEgc3RydWN0cworICoJZGVmcyBmb3IgZnBsdXN0bS5jCisgKi8KKworI2lmbmRlZglfRlBMVVNfCisjZGVmaW5lIF9GUExVU18KKworI2lmbmRlZglIV19QVFIKKyNkZWZpbmUJSFdfUFRSCXZvaWQgX19pb21lbSAqCisjZW5kaWYKKworLyoKKyAqIGZwbHVzIGVycm9yIHN0YXRpc3RpYyBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IGVycl9zdCB7CisJdV9sb25nIGVycl92YWxpZCA7CQkvKiBtZW1vcnkgc3RhdHVzIHZhbGlkICovCisJdV9sb25nIGVycl9hYm9ydCA7CQkvKiBtZW1vcnkgc3RhdHVzIHJlY2VpdmUgYWJvcnQgKi8KKwl1X2xvbmcgZXJyX2VfaW5kaWNhdG9yIDsJLyogZXJyb3IgaW5kaWNhdG9yICovCisJdV9sb25nIGVycl9jcmMgOwkJLyogZXJyb3IgZGV0ZWN0ZWQgKENSQyBvciBsZW5ndGgpICovCisJdV9sb25nIGVycl9sbGNfZnJhbWUgOwkJLyogTExDIGZyYW1lICovCisJdV9sb25nIGVycl9tYWNfZnJhbWUgOwkJLyogTUFDIGZyYW1lICovCisJdV9sb25nIGVycl9zbXRfZnJhbWUgOwkJLyogU01UIGZyYW1lICovCisJdV9sb25nIGVycl9pbXBfZnJhbWUgOwkJLyogaW1wbGVtZW50ZXIgZnJhbWUgKi8KKwl1X2xvbmcgZXJyX25vX2J1ZiA7CQkvKiBubyBidWZmZXIgYXZhaWxhYmxlICovCisJdV9sb25nIGVycl90b29fbG9uZyA7CQkvKiBsb25nZXIgdGhhbiBtYXguIGJ1ZmZlciAqLworCXVfbG9uZyBlcnJfYmVjX3N0YXQgOwkJLyogYmVhY29uIHN0YXRlIGVudGVyZWQgKi8KKwl1X2xvbmcgZXJyX2NsbV9zdGF0IDsJCS8qIGNsYWltIHN0YXRlIGVudGVyZWQgKi8KKwl1X2xvbmcgZXJyX3NpZmdfZGV0IDsJCS8qIHNob3J0IGludGVyZnJhbWUgZ2FwIGRldGVjdCAqLworCXVfbG9uZyBlcnJfcGhpbnYgOwkJLyogUEhZIGludmFsaWQgKi8KKwl1X2xvbmcgZXJyX3RraXNzIDsJCS8qIHRva2VuIGlzc3VlZCAqLworCXVfbG9uZyBlcnJfdGtlcnIgOwkJLyogdG9rZW4gZXJyb3IgKi8KK30gOworCisvKgorICoJVHJhbnNtaXQgRGVzY3JpcHRvciBzdHJ1Y3QKKyAqLworc3RydWN0IHNfc210X2ZwX3R4ZCB7CisJdV9pbnQgdHhkX3RiY3RybCA7CQkvKiB0cmFuc21pdCBidWZmZXIgY29udHJvbCAqLworCXVfaW50IHR4ZF90eGRzY3IgOwkJLyogdHJhbnNtaXQgZnJhbWUgc3RhdHVzIHdvcmQgKi8KKwl1X2ludCB0eGRfdGJhZHIgOwkJLyogcGh5c2ljYWwgdHggYnVmZmVyIGFkZHJlc3MgKi8KKwl1X2ludCB0eGRfbnRkYWRyIDsJCS8qIHBoeXNpY2FsIHBvaW50ZXIgdG8gdGhlIG5leHQgVHhEICovCisjaWZkZWYJRU5BXzY0QklUX1NVUAorCXVfaW50IHR4ZF90YmFkcl9oaSA7CQkvKiBwaHlzaWNhbCB0eCBidWZmZXIgYWRkciAoaGlnaCBkd29yZCkqLworI2VuZGlmCisJY2hhciBmYXIgKnR4ZF92aXJ0IDsJCS8qIHZpcnR1YWwgcG9pbnRlciB0byB0aGUgZGF0YSBmcmFnICovCisJCQkJCS8qIHZpcnQgcG9pbnRlciB0byB0aGUgbmV4dCBUeEQgKi8KKwlzdHJ1Y3Qgc19zbXRfZnBfdHhkIHZvbGF0aWxlIGZhciAqdHhkX25leHQgOworCXN0cnVjdCBzX3R4ZF9vcyB0eGRfb3MgOwkvKiBPUyAtIHNwZWNpZmljIHN0cnVjdCAqLworfSA7CisKKy8qCisgKglSZWNlaXZlIERlc2NyaXB0b3Igc3RydWN0CisgKi8KK3N0cnVjdCBzX3NtdF9mcF9yeGQgeworCXVfaW50IHJ4ZF9yYmN0cmwgOwkJLyogcmVjZWl2ZSBidWZmZXIgY29udHJvbCAqLworCXVfaW50IHJ4ZF9yZnN3IDsJCS8qIHJlY2VpdmUgZnJhbWUgc3RhdHVzIHdvcmQgKi8KKwl1X2ludCByeGRfcmJhZHIgOwkJLyogcGh5c2ljYWwgcnggYnVmZmVyIGFkZHJlc3MgKi8KKwl1X2ludCByeGRfbnJkYWRyIDsJCS8qIHBoeXNpY2FsIHBvaW50ZXIgdG8gdGhlIG5leHQgUnhEICovCisjaWZkZWYJRU5BXzY0QklUX1NVUAorCXVfaW50IHJ4ZF9yYmFkcl9oaSA7CQkvKiBwaHlzaWNhbCB0eCBidWZmZXIgYWRkciAoaGlnaCBkd29yZCkqLworI2VuZGlmCisJY2hhciBmYXIgKnJ4ZF92aXJ0IDsJCS8qIHZpcnR1YWwgcG9pbnRlciB0byB0aGUgZGF0YSBmcmFnICovCisJCQkJCS8qIHZpcnQgcG9pbnRlciB0byB0aGUgbmV4dCBSeEQgKi8KKwlzdHJ1Y3Qgc19zbXRfZnBfcnhkIHZvbGF0aWxlIGZhciAqcnhkX25leHQgOworCXN0cnVjdCBzX3J4ZF9vcyByeGRfb3MgOwkvKiBPUyAtIHNwZWNpZmljIHN0cnVjdCAqLworfSA7CisKKy8qCisgKglEZXNjcmlwdG9yIFVuaW9uIERlZmluaXRpb24KKyAqLwordW5pb24gc19mcF9kZXNjciB7CisJc3RydWN0CXNfc210X2ZwX3R4ZCB0IDsJCS8qIHBvaW50ZXIgdG8gdGhlIFR4RCAqLworCXN0cnVjdAlzX3NtdF9mcF9yeGQgciA7CQkvKiBwb2ludGVyIHRvIHRoZSBSeEQgKi8KK30gOworCisvKgorICoJVHhEIFJpbmcgQ29udHJvbCBzdHJ1Y3QKKyAqLworc3RydWN0IHNfc210X3R4X3F1ZXVlIHsKKwlzdHJ1Y3Qgc19zbXRfZnBfdHhkIHZvbGF0aWxlICp0eF9jdXJyX3B1dCA7IC8qIG5leHQgZnJlZSBUeEQgKi8KKwlzdHJ1Y3Qgc19zbXRfZnBfdHhkIHZvbGF0aWxlICp0eF9wcmV2X3B1dCA7IC8qIHNoYWRvdyBwdXQgcG9pbnRlciAqLworCXN0cnVjdCBzX3NtdF9mcF90eGQgdm9sYXRpbGUgKnR4X2N1cnJfZ2V0IDsgLyogbmV4dCBUeEQgdG8gcmVsZWFzZSovCisJdV9zaG9ydCB0eF9mcmVlIDsJCQkvKiBjb3VudCBvZiBmcmVlIFR4RCdzICovCisJdV9zaG9ydCB0eF91c2VkIDsJCQkvKiBjb3VudCBvZiB1c2VkIFR4RCdzICovCisJSFdfUFRSIHR4X2JtdV9jdGwgOwkJCS8qIEJNVSBhZGRyIGZvciB0eCBzdGFydCAqLworCUhXX1BUUiB0eF9ibXVfZHNjIDsJCQkvKiBCTVUgYWRkciBmb3IgY3VyciBkc2MuICovCit9IDsKKworLyoKKyAqCVJ4RCBSaW5nIENvbnRyb2wgc3RydWN0CisgKi8KK3N0cnVjdCBzX3NtdF9yeF9xdWV1ZSB7CisJc3RydWN0IHNfc210X2ZwX3J4ZCB2b2xhdGlsZSAqcnhfY3Vycl9wdXQgOyAvKiBuZXh0IFJ4RCB0byBxdWV1ZSBpbnRvICovCisJc3RydWN0IHNfc210X2ZwX3J4ZCB2b2xhdGlsZSAqcnhfcHJldl9wdXQgOyAvKiBzaGFkb3cgcHV0IHBvaW50ZXIgKi8KKwlzdHJ1Y3Qgc19zbXRfZnBfcnhkIHZvbGF0aWxlICpyeF9jdXJyX2dldCA7IC8qIG5leHQgUnhEIHRvIGZpbGwgKi8KKwl1X3Nob3J0IHJ4X2ZyZWUgOwkJCS8qIGNvdW50IG9mIGZyZWUgUnhEJ3MgKi8KKwl1X3Nob3J0IHJ4X3VzZWQgOwkJCS8qIGNvdW50IG9mIHVzZWQgUnhEJ3MgKi8KKwlIV19QVFIgcnhfYm11X2N0bCA7CQkJLyogQk1VIGFkZHIgZm9yIHJ4IHN0YXJ0ICovCisJSFdfUFRSIHJ4X2JtdV9kc2MgOwkJCS8qIEJNVSBhZGRyIGZvciBjdXJyIGRzYy4gKi8KK30gOworCisjZGVmaW5lIFZPSURfRlJBTUVfT0ZGCQkweDAwCisjZGVmaW5lIENMQUlNX0ZSQU1FX09GRgkJMHgwOAorI2RlZmluZSBCRUFDT05fRlJBTUVfT0ZGCTB4MTAKKyNkZWZpbmUgREJFQUNPTl9GUkFNRV9PRkYJMHgxOAorI2RlZmluZSBSWF9GSUZPX09GRgkJMHgyMQkJLyogdG8gZ2V0IGEgcHJpbWUgbnVtYmVyIGZvciAqLworCQkJCQkJLyogdGhlIFJYX0ZJRk9fU1BBQ0UgKi8KKworI2RlZmluZSBSQkNfTUVNX1NJWkUJCTB4ODAwMAorI2RlZmluZSBTRU5EX0FTWU5DX0FTX1NZTkMJMHgxCisjZGVmaW5lCVNZTkNfVFJBRkZJQ19PTgkJMHgyCisKKy8qIGJpZyBGSUZPIG1lbW9yeSAqLworI2RlZmluZQlSWF9GSUZPX1NQQUNFCQkweDQwMDAgLSBSWF9GSUZPX09GRgorI2RlZmluZQlUWF9GSUZPX1NQQUNFCQkweDQwMDAKKworI2RlZmluZQlUWF9TTUFMTF9GSUZPCQkweDA5MDAKKyNkZWZpbmUJVFhfTUVESVVNX0ZJRk8JCVRYX0ZJRk9fU1BBQ0UgLyAyCQorI2RlZmluZQlUWF9MQVJHRV9GSUZPCQlUWF9GSUZPX1NQQUNFIC0gVFhfU01BTExfRklGTwkKKworI2RlZmluZQlSWF9TTUFMTF9GSUZPCQkweDA5MDAKKyNkZWZpbmUJUlhfTEFSR0VfRklGTwkJUlhfRklGT19TUEFDRSAtIFJYX1NNQUxMX0ZJRk8JCisKK3N0cnVjdCBzX3NtdF9maWZvX2NvbmYgeworCXVfc2hvcnQJcmJjX3JhbV9zdGFydCA7CQkvKiBGSUZPIHN0YXJ0IGFkZHJlc3MgKi8KKwl1X3Nob3J0CXJiY19yYW1fZW5kIDsJCS8qIEZJRk8gc2l6ZSAqLworCXVfc2hvcnQJcngxX2ZpZm9fc3RhcnQgOwkvKiByeCBxdWV1ZSBzdGFydCBhZGRyZXNzICovCisJdV9zaG9ydAlyeDFfZmlmb19zaXplIDsJCS8qIHJ4IHF1ZXVlIHNpemUgKi8KKwl1X3Nob3J0CXJ4Ml9maWZvX3N0YXJ0IDsJLyogcnggcXVldWUgc3RhcnQgYWRkcmVzcyAqLworCXVfc2hvcnQJcngyX2ZpZm9fc2l6ZSA7CQkvKiByeCBxdWV1ZSBzaXplICovCisJdV9zaG9ydAl0eF9zX3N0YXJ0IDsJCS8qIHN5bmMgcXVldWUgc3RhcnQgYWRkcmVzcyAqLworCXVfc2hvcnQJdHhfc19zaXplIDsJCS8qIHN5bmMgcXVldWUgc2l6ZSAqLworCXVfc2hvcnQJdHhfYTBfc3RhcnQgOwkJLyogYXN5bmMgcXVldWUgQTAgc3RhcnQgYWRkcmVzcyAqLworCXVfc2hvcnQJdHhfYTBfc2l6ZSA7CQkvKiBhc3luYyBxdWV1ZSBBMCBzaXplICovCisJdV9zaG9ydAlmaWZvX2NvbmZpZ19tb2RlIDsJLyogRklGTyBjb25maWd1cmF0aW9uIG1vZGUgKi8KK30gOworCisjZGVmaW5lIEZNX0FERFJYCShGTV9BRERFVHxGTV9FWEdQQTB8Rk1fRVhHUEExKQorCitzdHJ1Y3Qgc19zbXRfZnAgeworCXVfc2hvcnQJbWRyMmluaXQgOwkJLyogbW9kZSByZWdpc3RlciAyIGluaXQgdmFsdWUgKi8KKwl1X3Nob3J0CW1kcjNpbml0IDsJCS8qIG1vZGUgcmVnaXN0ZXIgMyBpbml0IHZhbHVlICovCisJdV9zaG9ydCBmcnNlbHJlZ19pbml0IDsJCS8qIGZyYW1lIHNlbGVjdGlvbiByZWdpc3RlciBpbml0IHZhbCAqLworCXVfc2hvcnQJcnhfbW9kZSA7CQkvKiBhZGRyZXNzIG1vZGUgYnJvYWQvbXVsdGkvcHJvbWlzYyAqLworCXVfc2hvcnQJbnNhX21vZGUgOworCXVfc2hvcnQgcnhfcHJvbSA7CisJdV9zaG9ydAlleGdwYSA7CisKKwlzdHJ1Y3QgZXJyX3N0IGVycl9zdGF0cyA7CS8qIGVycm9yIHN0YXRpc3RpY3MgKi8KKworCS8qCisJICogTUFDIGJ1ZmZlcnMKKwkgKi8KKwlzdHJ1Y3QgZmRkaV9tYWNfc2YgewkJLyogc3BlY2lhbCBmcmFtZSBidWlsZCBidWZmZXIgKi8KKwkJdV9jaGFyCQkJbWFjX2ZjIDsKKwkJc3RydWN0IGZkZGlfYWRkcgltYWNfZGVzdCA7CisJCXN0cnVjdCBmZGRpX2FkZHIJbWFjX3NvdXJjZSA7CisJCXVfY2hhcgkJCW1hY19pbmZvWzB4MjBdIDsKKwl9IG1hY19zZmIgOworCisKKwkvKgorCSAqIHF1ZXVlcworCSAqLworI2RlZmluZSBRVUVVRV9TCQkJMAorI2RlZmluZSBRVUVVRV9BMAkJMQorI2RlZmluZSBRVUVVRV9SMQkJMAorI2RlZmluZSBRVUVVRV9SMgkJMQorI2RlZmluZSBVU0VEX1FVRVVFUwkJMgorCisJLyoKKwkgKiBxdWV1ZSBwb2ludGVyczsgcG9pbnRzIHRvIHRoZSBxdWV1ZSBkZXBlbmRlbnQgdmFyaWFibGVzCisJICovCisJc3RydWN0IHNfc210X3R4X3F1ZXVlICp0eFtVU0VEX1FVRVVFU10gOworCXN0cnVjdCBzX3NtdF9yeF9xdWV1ZSAqcnhbVVNFRF9RVUVVRVNdIDsKKworCS8qCisJICogcXVldWUgZGVwZW5kZW50IHZhcmlhYmxlcworCSAqLworCXN0cnVjdCBzX3NtdF90eF9xdWV1ZSB0eF9xW1VTRURfUVVFVUVTXSA7CisJc3RydWN0IHNfc210X3J4X3F1ZXVlIHJ4X3FbVVNFRF9RVUVVRVNdIDsKKworCS8qCisJICogRklGTyBjb25maWd1cmF0aW9uIHN0cnVjdAorCSAqLworCXN0cnVjdAlzX3NtdF9maWZvX2NvbmYJZmlmbyA7CisKKwkvKiBsYXN0IGZvcm1hYyBzdGF0dXMgKi8KKwl1X3Nob3J0CSBzMnUgOworCXVfc2hvcnQJIHMybCA7CisKKwkvKiBjYWxjdWxhdGVkIEZPUk1BQysgcmVnLmFkZHIuICovCisJSFdfUFRSCWZtX3N0MXUgOworCUhXX1BUUglmbV9zdDFsIDsKKwlIV19QVFIJZm1fc3QydSA7CisJSFdfUFRSCWZtX3N0MmwgOworCUhXX1BUUglmbV9zdDN1IDsKKwlIV19QVFIJZm1fc3QzbCA7CisKKworCS8qCisJICogbXVsdGljYXN0IHRhYmxlCisJICovCisjZGVmaW5lIEZQTUFYX01VTFRJQ0FTVCAzMiAKKyNkZWZpbmUJU01UX01BWF9NVUxUSQk0CisJc3RydWN0IHsKKwkJc3RydWN0IHNfZnBtYyB7CisJCQlzdHJ1Y3QgZmRkaV9hZGRyCWEgOwkvKiBtYyBhZGRyZXNzICovCisJCQl1X2NoYXIJCQluIDsJLyogdXNhZ2UgY291bnRlciAqLworCQkJdV9jaGFyCQkJcGVybSA7CS8qIGZsYWc6IHBlcm1hbmVudCAqLworCQl9IHRhYmxlW0ZQTUFYX01VTFRJQ0FTVF0gOworCX0gbWMgOworCXN0cnVjdCBmZGRpX2FkZHIJZ3JvdXBfYWRkciA7CisJdV9sb25nCWZ1bmNfYWRkciA7CQkvKiBmdW5jdGlvbmFsIGFkZHJlc3MgKi8KKwlpbnQJc210X3Nsb3RzX3VzZWQgOwkvKiBjb3VudCBvZiB0YWJsZSBlbnRyaWVzIGZvciB0aGUgU01UICovCisJaW50CW9zX3Nsb3RzX3VzZWQgOwkJLyogY291bnQgb2YgdGFibGUgZW50cmllcyAqLyAKKwkJCQkJLyogdXNlZCBieSB0aGUgb3Mtc3BlY2lmaWMgbW9kdWxlICovCit9IDsKKworLyoKKyAqIG1vZGVzIGZvciBtYWNfc2V0X3J4X21vZGUoKQorICovCisjZGVmaW5lIFJYX0VOQUJMRV9BTExNVUxUSQkxCS8qIGVuYWJsZSBhbGwgbXVsdGljYXN0cyAqLworI2RlZmluZSBSWF9ESVNBQkxFX0FMTE1VTFRJCTIJLyogZGlzYWJsZSAiZW5hYmxlIGFsbCBtdWx0aWNhc3RzIiAqLworI2RlZmluZSBSWF9FTkFCTEVfUFJPTUlTQwkzCS8qIGVuYWJsZSBwcm9taXNjb3VzICovCisjZGVmaW5lIFJYX0RJU0FCTEVfUFJPTUlTQwk0CS8qIGRpc2FibGUgcHJvbWlzY291cyAqLworI2RlZmluZSBSWF9FTkFCTEVfTlNBCQk1CS8qIGVuYWJsZSByZWNlcHRpb24gb2YgTlNBIGZyYW1lcyAqLworI2RlZmluZSBSWF9ESVNBQkxFX05TQQkJNgkvKiBkaXNhYmxlIHJlY2VwdGlvbiBvZiBOU0EgZnJhbWVzICovCisKKworLyoKKyAqIHN1cHBvcnQgZm9yIGJ5dGUgcmV2ZXJzYWwgaW4gQUlYCisgKiAoZGVzY3JpcHRvcnMgYW5kIHBvaW50ZXJzIG11c3QgYmUgYnl0ZSByZXZlcnNlZCBpbiBtZW1vcnkKKyAqICBDUFUgaXMgYmlnIGVuZGlhbjsgTS1DaGFubmVsIGlzIGxpdHRsZSBlbmRpYW4pCisgKi8KKyNpZmRlZglBSVgKKyNkZWZpbmUgTURSX1JFVgorI2RlZmluZQlBSVhfUkVWRVJTRSh4KQkJKCgoKHgpPDwyNEwpJjB4ZmYwMDAwMDBMKQkrCVwKKwkJCQkgKCgoeCk8PCA4TCkmMHgwMGZmMDAwMEwpCSsJXAorCQkJCSAoKCh4KT4+IDhMKSYweDAwMDBmZjAwTCkJKwlcCisJCQkJICgoKHgpPj4yNEwpJjB4MDAwMDAwZmZMKSkKKyNlbHNlCisjaWZuZGVmIEFJWF9SRVZFUlNFCisjZGVmaW5lCUFJWF9SRVZFUlNFKHgpCSh4KQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmCU1EUl9SRVYJCisjZGVmaW5lCU1EUl9SRVZFUlNFKHgpCQkoKCgoeCk8PDI0TCkmMHhmZjAwMDAwMEwpCSsJXAorCQkJCSAoKCh4KTw8IDhMKSYweDAwZmYwMDAwTCkJKwlcCisJCQkJICgoKHgpPj4gOEwpJjB4MDAwMGZmMDBMKQkrCVwKKwkJCQkgKCgoeCk+PjI0TCkmMHgwMDAwMDBmZkwpKQorI2Vsc2UKKyNpZm5kZWYgTURSX1JFVkVSU0UKKyNkZWZpbmUJTURSX1JFVkVSU0UoeCkJKHgpCisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvaC9od210bS5oIGIvZHJpdmVycy9uZXQvc2tmcC9oL2h3bXRtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUzNjBhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvaC9od210bS5oCkBAIC0wLDAgKzEsNDI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCV9IV01fCisjZGVmaW5lCV9IV01fCisKKyNpbmNsdWRlICJoL21idWYuaCIKKworLyoKKyAqIE1BQ1JPIGZvciBETUEgc3luY2hyb25pemF0aW9uOgorICoJVGhlIGRlc2NyaXB0b3IgJ2Rlc2MnIGlzIGZsdXNoZWQgZm9yIHRoZSBkZXZpY2UgJ2ZsYWcnLgorICoJRGV2aWNlcyBhcmUgdGhlIENQVSAoRERJX0RNQV9TWU5DX0ZPUkNQVSkgYW5kIHRoZQorICoJYWRhcHRlciAoRERJX0RNQV9TWU5DX0ZPUkRFVikuCisgKgorICoJJ2Rlc2MnCVBvaW50ZXIgdG8gYSBSeCBvciBUeCBkZXNjcmlwdG9yLgorICoJJ2ZsYWcnCUZsYWcgZm9yIGRpcmVjdGlvbiAodmlldyBmb3IgQ1BVIG9yIERFVklDRSkgdGhhdAorICoJCXNob3VsZCBiZSBzeW5jaHJvbml6ZWQuCisgKgorICoJRW1wdHkgbWFjcm9zIGFuZCBkZWZpbmVzIGFyZSBzcGVjaWZpZWQgaGVyZS4gVGhlIHJlYWwgbWFjcm8KKyAqCWlzIG9zLXNwZWNpZmljIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBpbiBvc2RlZjFzdC5oLgorICovCisjaWZuZGVmIERSVl9CVUZfRkxVU0gKKyNkZWZpbmUgRFJWX0JVRl9GTFVTSChkZXNjLGZsYWcpCisjZGVmaW5lIERESV9ETUFfU1lOQ19GT1JDUFUKKyNkZWZpbmUgRERJX0RNQV9TWU5DX0ZPUkRFVgorI2VuZGlmCisKKwkvKgorCSAqIGhhcmR3YXJlIG1vZHVsIGRlcGVuZGVudCByZWNlaXZlIG1vZGVzCisJICovCisjZGVmaW5lCVJYX0VOQUJMRV9QQVNTX1NNVAkyMQorI2RlZmluZQlSWF9ESVNBQkxFX1BBU1NfU01UCTIyCisjZGVmaW5lCVJYX0VOQUJMRV9QQVNTX05TQQkyMworI2RlZmluZQlSWF9ESVNBQkxFX1BBU1NfTlNBCTI0CisjZGVmaW5lCVJYX0VOQUJMRV9QQVNTX0RCCTI1CisjZGVmaW5lCVJYX0RJU0FCTEVfUEFTU19EQgkyNgorI2RlZmluZQlSWF9ESVNBQkxFX1BBU1NfQUxMCTI3CisjZGVmaW5lCVJYX0RJU0FCTEVfTExDX1BST01JU0MJMjgKKyNkZWZpbmUJUlhfRU5BQkxFX0xMQ19QUk9NSVNDCTI5CisKKworI2lmbmRlZglETUFfUkQKKyNkZWZpbmUgRE1BX1JECQkxCS8qIG1lbW9yeSAtPiBodyAqLworI2VuZGlmCisjaWZuZGVmIERNQV9XUgorI2RlZmluZSBETUFfV1IJCTIJLyogaHcgLT4gbWVtb3J5ICovCisjZW5kaWYKKyNkZWZpbmUgU01UX0JVRgkJMHg4MAorCisJLyoKKwkgKiBiaXRzIG9mIHRoZSBmcmFtZSBzdGF0dXMgYnl0ZQorCSAqLworI2RlZmluZSBFTl9JUlFfRU9GCTB4MDIJLyogZ2V0IElSUSBhZnRlciBlbmQgb2YgZnJhbWUgdHJhbnNtaXNzaW9uICovCisjZGVmaW5lCUxPQ19UWAkJMHgwNAkvKiBzZW5kIGZyYW1lIHRvIHRoZSBsb2NhbCBTTVQgKi8KKyNkZWZpbmUgTEFTVF9GUkFHCTB4MDgJLyogbGFzdCBUeEQgb2YgdGhlIGZyYW1lICovCisjZGVmaW5lCUZJUlNUX0ZSQUcJMHgxMAkvKiBmaXJzdCBUeEQgb2YgdGhlIGZyYW1lICovCisjZGVmaW5lCUxBTl9UWAkJMHgyMAkvKiBzZW5kIGZyYW1lIHRvIG5ldHdvcmsgaWYgc2V0ICovCisjZGVmaW5lIFJJTkdfRE9XTgkweDQwCS8qIGVycm9yOiB1bmFibGUgdG8gc2VuZCwgcmluZyBkb3duICovCisjZGVmaW5lIE9VVF9PRl9UWEQJMHg4MAkvKiBlcnJvcjogbm90IGVub3VnaCBUeERzIGF2YWlsYWJsZSAqLworCisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMIAkJMAorI2VuZGlmCisKKyNpZmRlZglMSVRUTEVfRU5ESUFOCisjZGVmaW5lIEhXTV9SRVZFUlNFKHgpCSh4KQorI2Vsc2UKKyNkZWZpbmUJSFdNX1JFVkVSU0UoeCkJCSgoKCh4KTw8MjRMKSYweGZmMDAwMDAwTCkJKwlcCisJCQkJICgoKHgpPDwgOEwpJjB4MDBmZjAwMDBMKQkrCVwKKwkJCQkgKCgoeCk+PiA4TCkmMHgwMDAwZmYwMEwpCSsJXAorCQkJCSAoKCh4KT4+MjRMKSYweDAwMDAwMGZmTCkpCisjZW5kaWYKKworI2RlZmluZSBDX0lORElDCQkoMUw8PDI1KQorI2RlZmluZSBBX0lORElDCQkoMUw8PDI2KQorI2RlZmluZQlSRF9GU19MT0NBTAkweDgwCisKKwkvKgorCSAqIERFQlVHIEZMQUdTCisJICovCisjZGVmaW5lCURFQlVHX1NNVEYJMQorI2RlZmluZQlERUJVR19TTVQJMgorI2RlZmluZQlERUJVR19FQ00JMworI2RlZmluZQlERUJVR19STVQJNAorI2RlZmluZQlERUJVR19DRk0JNQorI2RlZmluZQlERUJVR19QQ00JNgorI2RlZmluZQlERUJVR19TQkEJNworI2RlZmluZQlERUJVR19FU1MJOAorCisjZGVmaW5lCURCX0hXTV9SWAkxMAorI2RlZmluZQlEQl9IV01fVFgJMTEKKyNkZWZpbmUgREJfSFdNX0dFTgkxMgorCitzdHJ1Y3Qgc19tYnVmX3Bvb2wgeworI2lmbmRlZglNQl9PVVRTSURFX1NNQworCVNNYnVmCQltYltNQVhfTUJVRl0gOwkJLyogbWJ1ZiBwb29sICovCisjZW5kaWYKKwlTTWJ1ZgkJKm1iX3N0YXJ0IDsJCS8qIHBvaW50cyB0byB0aGUgZmlyc3QgbWIgKi8KKwlTTWJ1ZgkJKm1iX2ZyZWUgOwkJLyogZnJlZSBxdWV1ZSAqLworfSA7CisKK3N0cnVjdCBod21fciB7CisJLyoKKwkgKiBoYXJkd2FyZSBtb2R1bCBzcGVjaWZpYyByZWNlaXZlIHZhcmlhYmxlcworCSAqLworCXVfaW50CQkJbGVuIDsJCS8qIGxlbmd0aCBvZiB0aGUgd2hvbGUgZnJhbWUgKi8KKwljaGFyCQkJKm1iX3BvcyA7CS8qIFNNYnVmIHJlY2VpdmUgcG9zaXRpb24gKi8KK30gOworCitzdHJ1Y3QgaHdfbW9kdWwgeworCS8qCisJICogQWxsIGhhcmR3YXJlIG1vZHVsIHNwZWNpZmljIHZhcmlhYmxlcworCSAqLworCXN0cnVjdAlzX21idWZfcG9vbAltYnVmX3Bvb2wgOworCXN0cnVjdAlod21fcglyIDsKKworCXVuaW9uIHNfZnBfZGVzY3Igdm9sYXRpbGUgKmRlc2NyX3AgOyAvKiBwb2ludHMgdG8gdGhlIGRlc3JpcHRvciBhcmVhICovCisKKwl1X3Nob3J0IHBhc3NfU01UIDsJCS8qIHBhc3MgU01UIGZyYW1lcyAqLworCXVfc2hvcnQgcGFzc19OU0EgOwkJLyogcGFzcyBhbGwgTlNBIGZyYW1lcyAqLworCXVfc2hvcnQgcGFzc19EQiA7CQkvKiBwYXNzIERpcmVjdCBCZWFjb24gRnJhbWVzICovCisJdV9zaG9ydCBwYXNzX2xsY19wcm9taXNjIDsJLyogcGFzcyBhbGwgbGxjIGZyYW1lcyAoZGVmYXVsdCBPTikgKi8KKworCVNNYnVmCSpsbGNfcnhfcGlwZSA7CQkvKiBwb2ludHMgdG8gdGhlIGZpcnN0IHF1ZXVlZCBsbGMgZnIgKi8KKwlTTWJ1ZgkqbGxjX3J4X3RhaWwgOwkJLyogcG9pbnRzIHRvIHRoZSBsYXN0IHF1ZXVlZCBsbGMgZnIgKi8KKwlpbnQJcXVldWVkX3J4X2ZyYW1lcyA7CS8qIG51bWJlciBvZiBxdWV1ZWQgZnJhbWVzICovCisKKwlTTWJ1ZgkqdHhkX3R4X3BpcGUgOwkJLyogcG9pbnRzIHRvIGZpcnN0IG1iIGluIHRoZSB0eGQgcmluZyAqLworCVNNYnVmCSp0eGRfdHhfdGFpbCA7CQkvKiBwb2ludHMgdG8gbGFzdCBtYiBpbiB0aGUgdHhkIHJpbmcgKi8KKwlpbnQJcXVldWVkX3R4ZF9tYiA7CQkvKiBudW1iZXIgb2YgU01UIE1CdWZzIGluIHR4ZCByaW5nICovCisKKwlpbnQJcnhfYnJlYWsgOwkJLyogcmV2LiB3YXMgYnJlYWtlZCBiZWNhdXNlIGluZC4gb2ZmICovCisJaW50CWxlYXZlX2lzciA7CQkvKiBsZWF2ZSBmZGRpX2lzciBpbW1lZGVhdGVseSBpZiBzZXQgKi8KKwlpbnQJaXNyX2ZsYWcgOwkJLyogc2V0LCB3aGVuIEhXTSBpcyBlbnRlcmVkIGZyb20gaXNyICovCisJLyoKKwkgKiB2YXJhaWJsZXMgZm9yIHRoZSBjdXJyZW50IHRyYW5zbWl0IGZyYW1lCisJICovCisJc3RydWN0IHNfc210X3R4X3F1ZXVlICp0eF9wIDsJLyogcG9pbnRlciB0byB0aGUgdHJhbnNtaXQgcXVldWUgKi8KKwl1X2xvbmcJdHhfZGVzY3IgOwkJLyogdHggZGVzY3JpcHRvciBmb3IgRk9STUFDKyAqLworCWludAl0eF9sZW4gOwkJLyogdHggZnJhbWUgbGVuZ3RoICovCisJU01idWYJKnR4X21iIDsJCS8qIFNNVCB0eCBNQnVmIHBvaW50ZXIgKi8KKwljaGFyCSp0eF9kYXRhIDsJCS8qIGRhdGEgcG9pbnRlciB0byB0aGUgU01UIHR4IE1idWYgKi8KKworCWludAlkZXRlY19jb3VudCA7CQkvKiBjb3VudGVyIGZvciBvdXQgb2YgUnhEIGNvbmRpdGlvbiAqLworCXVfbG9uZwlyeF9sZW5fZXJyb3IgOwkJLyogcnggbGVuIEZPUk1BQyAhPSBzdW0gb2YgZnJhZ21lbnRzICovCit9IDsKKworCisvKgorICogREVCVUcgc3RydWN0cyBhbmQgbWFjcm9zCisgKi8KKworI2lmZGVmCURFQlVHCitzdHJ1Y3Qgb3NfZGVidWcgeworCWludAlod21fcnggOworCWludAlod21fdHggOworCWludAlod21fZ2VuIDsKK30gOworI2VuZGlmCisKKyNpZmRlZglERUJVRworI2lmZGVmCURFQlVHX0JSRAorI2RlZmluZQlEQl9QCXNtYy0+ZGVidWcKKyNlbHNlCisjZGVmaW5lIERCX1AJZGVidWcKKyNlbmRpZgorCisjZGVmaW5lIERCX1JYKGEsYixjLGxldikgaWYgKERCX1AuZF9vcy5od21fcnggPj0gKGxldikpCXByaW50ZihhLGIsYykKKyNkZWZpbmUgREJfVFgoYSxiLGMsbGV2KSBpZiAoREJfUC5kX29zLmh3bV90eCA+PSAobGV2KSkJcHJpbnRmKGEsYixjKQorI2RlZmluZSBEQl9HRU4oYSxiLGMsbGV2KSBpZiAoREJfUC5kX29zLmh3bV9nZW4gPj0gKGxldikpIHByaW50ZihhLGIsYykKKyNlbHNlCS8qIERFQlVHICovCisjZGVmaW5lIERCX1JYKGEsYixjLGxldikKKyNkZWZpbmUgREJfVFgoYSxiLGMsbGV2KQorI2RlZmluZSBEQl9HRU4oYSxiLGMsbGV2KQorI2VuZGlmCS8qIERFQlVHICovCisKKyNpZm5kZWYJU0tfQlJFQUsKKyNkZWZpbmUJU0tfQlJFQUsoKQorI2VuZGlmCisKKworLyoKKyAqIEhXTSBNYWNyb3MKKyAqLworCisvKgorICoJQkVHSU5fTUFOVUFMX0VOVFJZKEhXTV9HRVRfVFhfUEhZUykKKyAqCXVfbG9uZyBIV01fR0VUX1RYX1BIWVModHhkKQorICoKKyAqIGZ1bmN0aW9uCU1BQ1JPCQkoaGFyZHdhcmUgbW9kdWxlLCBod210bS5oKQorICoJCVRoaXMgbWFjcm8gbWF5IGJlIGludm9rZWQgYnkgdGhlIE9TLXNwZWNpZmljIG1vZHVsZSB0byByZWFkCisgKgkJdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmllZCBUeEQuCisgKgorICogcGFyYQl0eGQJcG9pbnRlciB0byB0aGUgVHhECisgKgorICoJRU5EX01BTlVBTF9FTlRSWQorICovCisjZGVmaW5lCUhXTV9HRVRfVFhfUEhZUyh0eGQpCQkodV9sb25nKUFJWF9SRVZFUlNFKCh0eGQpLT50eGRfdGJhZHIpCisKKy8qCisgKglCRUdJTl9NQU5VQUxfRU5UUlkoSFdNX0dFVF9UWF9MRU4pCisgKglpbnQgSFdNX0dFVF9UWF9MRU4odHhkKQorICoKKyAqIGZ1bmN0aW9uCU1BQ1JPCQkoaGFyZHdhcmUgbW9kdWxlLCBod210bS5oKQorICoJCVRoaXMgbWFjcm8gbWF5IGJlIGludm9rZWQgYnkgdGhlIE9TLXNwZWNpZmljIG1vZHVsZSB0byByZWFkCisgKgkJdGhlIGZyYWdtZW50IGxlbmd0aCBvZiB0aGUgc3BlY2lmaWVkIFR4RAorICoKKyAqIHBhcmEJcnhkCXBvaW50ZXIgdG8gdGhlIFR4RAorICoKKyAqIHJldHVybgl0aGUgbGVuZ3RoIG9mIHRoZSBmcmFnbWVudCBpbiBieXRlcworICoKKyAqCUVORF9NQU5VQUxfRU5UUlkKKyAqLworI2RlZmluZQlIV01fR0VUX1RYX0xFTih0eGQpCSgoaW50KUFJWF9SRVZFUlNFKCh0eGQpLT50eGRfdGJjdHJsKSYgUkRfTEVOR1RIKQorCisvKgorICoJQkVHSU5fTUFOVUFMX0VOVFJZKEhXTV9HRVRfVFhfVVNFRCkKKyAqCXR4ZCAqSFdNX0dFVF9UWF9VU0VEKHNtYyxxdWV1ZSkKKyAqCisgKiBmdW5jdGlvbglNQUNSTwkJKGhhcmR3YXJlIG1vZHVsZSwgaHdtdG0uaCkKKyAqCQlUaGlzIG1hY3JvIG1heSBiZSBpbnZva2VkIGJ5IHRoZSBPUy1zcGVjaWZpYyBtb2R1bGUgdG8gZ2V0IHRoZQorICoJCW51bWJlciBvZiB1c2VkIFR4RHMgZm9yIHRoZSBxdWV1ZSwgc3BlY2lmaWVkIGJ5IHRoZSBpbmRleC4KKyAqCisgKiBwYXJhCXF1ZXVlCXRoZSBudW1iZXIgb2YgdGhlIHNlbmQgcXVldWU6IENhbiBiZSBzcGVjaWZpZWQgYnkKKyAqCQlRVUVVRV9BMCwgUVVFVUVfUyBvciAoZnJhbWVfc3RhdHVzICYgUVVFVUVfQTApCisgKgorICogcmV0dXJuCW51bWJlciBvZiB1c2VkIFR4RHMgZm9yIHRoaXMgc2VuZCBxdWV1ZQorICoKKyAqCUVORF9NQU5VQUxfRU5UUlkKKyAqLworI2RlZmluZQlIV01fR0VUX1RYX1VTRUQoc21jLHF1ZXVlKQkoaW50KSAoc21jKS0+aHcuZnAudHhfcVtxdWV1ZV0udHhfdXNlZAorCisvKgorICoJQkVHSU5fTUFOVUFMX0VOVFJZKEhXTV9HRVRfQ1VSUl9UWEQpCisgKgl0eGQgKkhXTV9HRVRfQ1VSUl9UWEQoc21jLHF1ZXVlKQorICoKKyAqIGZ1bmN0aW9uCU1BQ1JPCQkoaGFyZHdhcmUgbW9kdWxlLCBod210bS5oKQorICoJCVRoaXMgbWFjcm8gbWF5IGJlIGludm9rZWQgYnkgdGhlIE9TLXNwZWNpZmljIG1vZHVsZSB0byBnZXQgdGhlCisgKgkJcG9pbnRlciB0byB0aGUgVHhEIHdoaWNoIHBvaW50cyB0byB0aGUgY3VycmVudCBxdWV1ZSBwdXQKKyAqCQlwb3NpdGlvbi4KKyAqCisgKiBwYXJhCXF1ZXVlCXRoZSBudW1iZXIgb2YgdGhlIHNlbmQgcXVldWU6IENhbiBiZSBzcGVjaWZpZWQgYnkKKyAqCQlRVUVVRV9BMCwgUVVFVUVfUyBvciAoZnJhbWVfc3RhdHVzICYgUVVFVUVfQTApCisgKgorICogcmV0dXJuCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgVHhECisgKgorICoJRU5EX01BTlVBTF9FTlRSWQorICovCisjZGVmaW5lCUhXTV9HRVRfQ1VSUl9UWEQoc21jLHF1ZXVlKQkoc3RydWN0IHNfc210X2ZwX3R4ZCB2b2xhdGlsZSAqKVwKKwkJCQkJKHNtYyktPmh3LmZwLnR4X3FbcXVldWVdLnR4X2N1cnJfcHV0CisKKy8qCisgKglCRUdJTl9NQU5VQUxfRU5UUlkoSFdNX1RYX0NIRUNLKQorICoJdm9pZCBIV01fVFhfQ0hFQ0soc21jLGZyYW1lX3N0YXR1cyxsb3dfd2F0ZXIpCisgKgorICogZnVuY3Rpb24JTUFDUk8JCShoYXJkd2FyZSBtb2R1bGUsIGh3bXRtLmgpCisgKgkJVGhpcyBtYWNybyBpcyBpbnZva2VkIGJ5IHRoZSBPUy1zcGVjaWZpYyBiZWZvcmUgaXQgbGVmdCBpdCdzCisgKgkJZHJpdmVyX3NlbmQgZnVuY3Rpb24uIFRoaXMgbWFjcm8gY2FsbHMgbWFjX2Rydl9jbGVhcl90eGQKKyAqCQlpZiB0aGUgZnJlZSBUeERzIG9mIHRoZSBjdXJyZW50IHRyYW5zbWl0IHF1ZXVlIGlzIGVxdWFsIG9yCisgKgkJbG93ZXIgdGhhbiB0aGUgZ2l2ZW4gbG93IHdhdGVyIG1hcmsuCisgKgorICogcGFyYQlmcmFtZV9zdGF0dXMJc3RhdHVzIG9mIHRoZSBmcmFtZSwgc2VlIGRlc2lnbiBkZXNjcmlwdGlvbgorICoJbG93X3dhdGVyCWxvdyB3YXRlciBtYXJrIG9mIGZyZWUgVHhEJ3MKKyAqCisgKglFTkRfTUFOVUFMX0VOVFJZCisgKi8KKyNpZm5kZWYgSFdNX05PX0ZMT1dfQ1RMCisjZGVmaW5lCUhXTV9UWF9DSEVDSyhzbWMsZnJhbWVfc3RhdHVzLGxvd193YXRlcikge1wKKwlpZiAoKGxvd193YXRlcik+PShzbWMpLT5ody5mcC50eF9xWyhmcmFtZV9zdGF0dXMpJlFVRVVFX0EwXS50eF9mcmVlKSB7XAorCQltYWNfZHJ2X2NsZWFyX3R4ZChzbWMpIDtcCisJfVwKK30KKyNlbHNlCisjZGVmaW5lCUhXTV9UWF9DSEVDSyhzbWMsZnJhbWVfc3RhdHVzLGxvd193YXRlcikJbWFjX2Rydl9jbGVhcl90eGQoc21jKQorI2VuZGlmCisKKy8qCisgKglCRUdJTl9NQU5VQUxfRU5UUlkoSFdNX0dFVF9SWF9GUkFHX0xFTikKKyAqCWludCBIV01fR0VUX1JYX0ZSQUdfTEVOKHJ4ZCkKKyAqCisgKiBmdW5jdGlvbglNQUNSTwkJKGhhcmR3YXJlIG1vZHVsZSwgaHdtdG0uaCkKKyAqCQlUaGlzIG1hY3JvIG1heSBiZSBpbnZva2VkIGJ5IHRoZSBPUy1zcGVjaWZpYyBtb2R1bGUgdG8gcmVhZAorICoJCXRoZSBmcmFnbWVudCBsZW5ndGggb2YgdGhlIHNwZWNpZmllZCBSeEQKKyAqCisgKiBwYXJhCXJ4ZAlwb2ludGVyIHRvIHRoZSBSeEQKKyAqCisgKiByZXR1cm4JdGhlIGxlbmd0aCBvZiB0aGUgZnJhZ21lbnQgaW4gYnl0ZXMKKyAqCisgKglFTkRfTUFOVUFMX0VOVFJZCisgKi8KKyNkZWZpbmUJSFdNX0dFVF9SWF9GUkFHX0xFTihyeGQpCSgoaW50KUFJWF9SRVZFUlNFKChyeGQpLT5yeGRfcmJjdHJsKSYgXAorCQkJCVJEX0xFTkdUSCkKKworLyoKKyAqCUJFR0lOX01BTlVBTF9FTlRSWShIV01fR0VUX1JYX1BIWVMpCisgKgl1X2xvbmcgSFdNX0dFVF9SWF9QSFlTKHJ4ZCkKKyAqCisgKiBmdW5jdGlvbglNQUNSTwkJKGhhcmR3YXJlIG1vZHVsZSwgaHdtdG0uaCkKKyAqCQlUaGlzIG1hY3JvIG1heSBiZSBpbnZva2VkIGJ5IHRoZSBPUy1zcGVjaWZpYyBtb2R1bGUgdG8gcmVhZAorICoJCXRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQgUnhELgorICoKKyAqIHBhcmEJcnhkCXBvaW50ZXIgdG8gdGhlIFJ4RAorICoKKyAqIHJldHVybgl0aGUgUnhEJ3MgcGh5c2ljYWwgcG9pbnRlciB0byB0aGUgZGF0YSBmcmFnbWVudAorICoKKyAqCUVORF9NQU5VQUxfRU5UUlkKKyAqLworI2RlZmluZQlIV01fR0VUX1JYX1BIWVMocnhkKQkodV9sb25nKUFJWF9SRVZFUlNFKChyeGQpLT5yeGRfcmJhZHIpCisKKy8qCisgKglCRUdJTl9NQU5VQUxfRU5UUlkoSFdNX0dFVF9SWF9VU0VEKQorICoJaW50IEhXTV9HRVRfUlhfVVNFRChzbWMpCisgKgorICogZnVuY3Rpb24JTUFDUk8JCShoYXJkd2FyZSBtb2R1bGUsIGh3bXRtLmgpCisgKgkJVGhpcyBtYWNybyBtYXkgYmUgaW52b2tlZCBieSB0aGUgT1Mtc3BlY2lmaWMgbW9kdWxlIHRvIGdldAorICoJCXRoZSBjb3VudCBvZiB1c2VkIFJYRHMgaW4gcmVjZWl2ZSBxdWV1ZSAxLgorICoKKyAqIHJldHVybgl0aGUgdXNlZCBSWEQgY291bnQgb2YgcmVjZWl2ZSBxdWV1ZSAxCisgKgorICogTk9URTogUmVtZW1iZXIsIGJlY2F1c2Ugb2YgYW4gQVNJQyBidWcgYXQgbGVhc3Qgb25lIFJYRCBzaG91bGQgYmUgdW51c2VkCisgKgkgaW4gdGhlIGRlc2NyaXB0b3IgcmluZyAhCisgKgorICoJRU5EX01BTlVBTF9FTlRSWQorICovCisjZGVmaW5lCUhXTV9HRVRfUlhfVVNFRChzbWMpCSgoaW50KShzbWMpLT5ody5mcC5yeF9xW1FVRVVFX1IxXS5yeF91c2VkKQorCisvKgorICoJQkVHSU5fTUFOVUFMX0VOVFJZKEhXTV9HRVRfUlhfRlJFRSkKKyAqCWludCBIV01fR0VUX1JYX0ZSRUUoc21jKQorICoKKyAqIGZ1bmN0aW9uCU1BQ1JPCQkoaGFyZHdhcmUgbW9kdWxlLCBod210bS5oKQorICoJCVRoaXMgbWFjcm8gbWF5IGJlIGludm9rZWQgYnkgdGhlIE9TLXNwZWNpZmljIG1vZHVsZSB0byBnZXQKKyAqCQl0aGUgcnhkX2ZyZWUgY291bnQgb2YgcmVjZWl2ZSBxdWV1ZSAxLgorICoKKyAqIHJldHVybgl0aGUgcnhkX2ZyZWUgY291bnQgb2YgcmVjZWl2ZSBxdWV1ZSAxCisgKgorICoJRU5EX01BTlVBTF9FTlRSWQorICovCisjZGVmaW5lCUhXTV9HRVRfUlhfRlJFRShzbWMpCSgoaW50KShzbWMpLT5ody5mcC5yeF9xW1FVRVVFX1IxXS5yeF9mcmVlLTEpCisKKy8qCisgKglCRUdJTl9NQU5VQUxfRU5UUlkoSFdNX0dFVF9DVVJSX1JYRCkKKyAqCXJ4ZCAqSFdNX0dFVF9DVVJSX1JYRChzbWMpCisgKgorICogZnVuY3Rpb24JTUFDUk8JCShoYXJkd2FyZSBtb2R1bGUsIGh3bXRtLmgpCisgKgkJVGhpcyBtYWNybyBtYXkgYmUgaW52b2tlZCBieSB0aGUgT1Mtc3BlY2lmaWMgbW9kdWxlIHRvIGdldCB0aGUKKyAqCQlwb2ludGVyIHRvIHRoZSBSeEQgd2hpY2ggcG9pbnRzIHRvIHRoZSBjdXJyZW50IHF1ZXVlIHB1dAorICoJCXBvc2l0aW9uLgorICoKKyAqIHJldHVybglwb2ludGVyIHRvIHRoZSBjdXJyZW50IFJ4RAorICoKKyAqCUVORF9NQU5VQUxfRU5UUlkKKyAqLworI2RlZmluZQlIV01fR0VUX0NVUlJfUlhEKHNtYykJKHN0cnVjdCBzX3NtdF9mcF9yeGQgdm9sYXRpbGUgKilcCisJCQkJKHNtYyktPmh3LmZwLnJ4X3FbUVVFVUVfUjFdLnJ4X2N1cnJfcHV0CisKKy8qCisgKglCRUdJTl9NQU5VQUxfRU5UUlkoSFdNX1JYX0NIRUNLKQorICoJdm9pZCBIV01fUlhfQ0hFQ0soc21jLGxvd193YXRlcikKKyAqCisgKiBmdW5jdGlvbglNQUNSTwkJKGhhcmR3YXJlIG1vZHVsZSwgaHdtdG0uaCkKKyAqCQlUaGlzIG1hY3JvIGlzIGludm9rZWQgYnkgdGhlIE9TLXNwZWNpZmljIGJlZm9yZSBpdCBsZWZ0IHRoZQorICoJCWZ1bmN0aW9uIG1hY19kcnZfcnhfY29tcGxldGUuIFRoaXMgbWFjcm8gY2FsbHMgbWFjX2Rydl9maWxsX3J4ZAorICoJCWlmIHRoZSBudW1iZXIgb2YgdXNlZCBSeERzIGlzIGVxdWFsIG9yIGxvd2VyIHRoYW4gdGhlCisgKgkJdGhlIGdpdmVuIGxvdyB3YXRlciBtYXJrLgorICoKKyAqIHBhcmEJbG93X3dhdGVyCWxvdyB3YXRlciBtYXJrIG9mIHVzZWQgUnhEJ3MKKyAqCisgKglFTkRfTUFOVUFMX0VOVFJZCisgKi8KKyNpZm5kZWYgSFdNX05PX0ZMT1dfQ1RMCisjZGVmaW5lCUhXTV9SWF9DSEVDSyhzbWMsbG93X3dhdGVyKSB7XAorCWlmICgobG93X3dhdGVyKSA+PSAoc21jKS0+aHcuZnAucnhfcVtRVUVVRV9SMV0ucnhfdXNlZCkge1wKKwkJbWFjX2Rydl9maWxsX3J4ZChzbWMpIDtcCisJfVwKK30KKyNlbHNlCisjZGVmaW5lCUhXTV9SWF9DSEVDSyhzbWMsbG93X3dhdGVyKQkJbWFjX2Rydl9maWxsX3J4ZChzbWMpCisjZW5kaWYKKworI2lmbmRlZglIV01fRUJBU0UKKyNkZWZpbmUJSFdNX0VCQVNFCTUwMAorI2VuZGlmCisKKyNkZWZpbmUJSFdNX0UwMDAxCUhXTV9FQkFTRSArIDEKKyNkZWZpbmUJSFdNX0UwMDAxX01TRwkiSFdNOiBXcm9uZyBzaXplIG9mIHNfcnhkX29zIHN0cnVjdCIKKyNkZWZpbmUJSFdNX0UwMDAyCUhXTV9FQkFTRSArIDIKKyNkZWZpbmUJSFdNX0UwMDAyX01TRwkiSFdNOiBXcm9uZyBzaXplIG9mIHNfdHhkX29zIHN0cnVjdCIKKyNkZWZpbmUJSFdNX0UwMDAzCUhXTV9FQkFTRSArIDMKKyNkZWZpbmUJSFdNX0UwMDAzX01TRwkiSFdNOiBzbXRfZnJlZV9tYnVmKCkgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIgorI2RlZmluZQlIV01fRTAwMDQJSFdNX0VCQVNFICsgNAorI2RlZmluZQlIV01fRTAwMDRfTVNHCSJIV006IFBhcml0eSBlcnJvciByeCBxdWV1ZSAxIgorI2RlZmluZQlIV01fRTAwMDUJSFdNX0VCQVNFICsgNQorI2RlZmluZQlIV01fRTAwMDVfTVNHCSJIV006IEVuY29kaW5nIGVycm9yIHJ4IHF1ZXVlIDEiCisjZGVmaW5lCUhXTV9FMDAwNglIV01fRUJBU0UgKyA2CisjZGVmaW5lCUhXTV9FMDAwNl9NU0cJIkhXTTogRW5jb2RpbmcgZXJyb3IgYXN5bmMgdHggcXVldWUiCisjZGVmaW5lCUhXTV9FMDAwNwlIV01fRUJBU0UgKyA3CisjZGVmaW5lCUhXTV9FMDAwN19NU0cJIkhXTTogRW5jb2RpbmcgZXJyb3Igc3luYyB0eCBxdWV1ZSIKKyNkZWZpbmUJSFdNX0UwMDA4CUhXTV9FQkFTRSArIDgKKyNkZWZpbmUJSFdNX0UwMDA4X01TRwkiIgorI2RlZmluZQlIV01fRTAwMDkJSFdNX0VCQVNFICsgOQorI2RlZmluZQlIV01fRTAwMDlfTVNHCSJIV006IE91dCBvZiBSeEQgY29uZGl0aW9uIGRldGVjdGVkIgorI2RlZmluZQlIV01fRTAwMTAJSFdNX0VCQVNFICsgMTAKKyNkZWZpbmUJSFdNX0UwMDEwX01TRwkiSFdNOiBBIHByb3RvY29sIGxheWVyIGhhcyB0cmllZCB0byBzZW5kIGEgZnJhbWUgd2l0aCBhbiBpbnZhbGlkIGZyYW1lIGNvbnRyb2wiCisjZGVmaW5lIEhXTV9FMDAxMQlIV01fRUJBU0UgKyAxMQorI2RlZmluZSBIV01fRTAwMTFfTVNHCSJIV006IG1hY19kcnZfY2xlYXJfdHhfcXVldWUgd2FzIGNhbGxlZCBhbHRob3VnaCB0aGUgaGFyZHdhcmUgd2Fzbid0IHN0b3BwZWQiCisjZGVmaW5lIEhXTV9FMDAxMglIV01fRUJBU0UgKyAxMgorI2RlZmluZSBIV01fRTAwMTJfTVNHCSJIV006IG1hY19kcnZfY2xlYXJfcnhfcXVldWUgd2FzIGNhbGxlZCBhbHRob3VnaCB0aGUgaGFyZHdhcmUgd2Fzbid0IHN0b3BwZWQiCisjZGVmaW5lIEhXTV9FMDAxMwlIV01fRUJBU0UgKyAxMworI2RlZmluZSBIV01fRTAwMTNfTVNHCSJIV006IG1hY19kcnZfcmVwYWlyX2Rlc2NyIHdhcyBjYWxsZWQgYWx0aG91Z2ggdGhlIGhhcmR3YXJlIHdhc24ndCBzdG9wcGVkIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvaC9sbmtzdGF0LmggYi9kcml2ZXJzL25ldC9za2ZwL2gvbG5rc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3M2RjZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2gvbG5rc3RhdC5oCkBAIC0wLDAgKzEsODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OCwxOTk5IFN5c0tvbm5lY3QsCisgKglhIGJ1c2luZXNzIHVuaXQgb2YgU2NobmVpZGVyICYgS29jaCAmIENvLiBEYXRlbnN5c3RlbWUgR21iSC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBEZWZpbml0aW9uIG9mIHRoZSBFcnJvciBMb2cgU3RydWN0dXJlCisgKiBUaGlzIHN0cnVjdHVyZSB3aWxsIGJlIGNvcGllZCBpbnRvIHRoZSBFcnJvciBMb2cgYnVmZmVyCisgKiBkdXJpbmcgdGhlIE5ESVMgR2VuZXJhbCBSZXF1ZXN0IFJlYWRFcnJvckxvZyBieSB0aGUgTUFDIERyaXZlcgorICovCisKK3N0cnVjdAlzX2Vycm9yX2xvZyB7CisKKwkvKgorCSAqIHBsYWNlIGhvbGRlciBmb3IgdG9rZW4gcmluZyBhZGFwdGVyIGVycm9yIGxvZyAoemVyb3MpCisJICovCisJdV9jaGFyCXJlc2VydmVkXzAgOwkJCS8qIGJ5dGUgMCBpbnNpZGUgRXJyb3IgTG9nICovCisJdV9jaGFyCXJlc2VydmVkXzEgOwkJCS8qIGJ5dGUgMSAqLworCXVfY2hhcglyZXNlcnZlZF8yIDsJCQkvKiBieXRlIDIgKi8JCisJdV9jaGFyCXJlc2VydmVkXzMgOwkJCS8qIGJ5dGUgMyAqLworCXVfY2hhcglyZXNlcnZlZF80IDsJCQkvKiBieXRlIDQgKi8KKwl1X2NoYXIJcmVzZXJ2ZWRfNSA7CQkJLyogYnl0ZSA1ICovCisJdV9jaGFyCXJlc2VydmVkXzYgOwkJCS8qIGJ5dGUgNiAqLworCXVfY2hhcglyZXNlcnZlZF83IDsJCQkvKiBieXRlIDcgKi8KKwl1X2NoYXIJcmVzZXJ2ZWRfOCA7CQkJLyogYnl0ZSA4ICovCisJdV9jaGFyCXJlc2VydmVkXzkgOwkJCS8qIGJ5dGUgOSAqLworCXVfY2hhcglyZXNlcnZlZF8xMCA7CQkJLyogYnl0ZSAxMCAqLworCXVfY2hhcglyZXNlcnZlZF8xMSA7CQkJLyogYnl0ZSAxMSAqLworCXVfY2hhcglyZXNlcnZlZF8xMiA7CQkJLyogYnl0ZSAxMiAqLworCXVfY2hhcglyZXNlcnZlZF8xMyA7CQkJLyogYnl0ZSAxMyAqLworCisJLyoKKwkgKiBGRERJIGxpbmsgc3RhdGlzdGljcyAKKwkgKi8KKy8qCisgKiBzbXQgZXJyb3IgbG93CisgKi8KKyNkZWZpbmUgU01UX0VSTF9BRUIJKDE8PDE1KQkJCS8qIEEgZWxhc3QuIGJ1ZmZlciAqLworI2RlZmluZSBTTVRfRVJMX0JMQwkoMTw8MTQpCQkJLyogQiBsaW5rIGVycm9yIGNvbmRpdGlvbiAqLworI2RlZmluZSBTTVRfRVJMX0FMQwkoMTw8MTMpCQkJLyogQSBsaW5rIGVycm9yIGNvbmRpdGlvbiAqLworI2RlZmluZSBTTVRfRVJMX05DQwkoMTw8MTIpCQkJLyogbm90IGNvcGllZCBjb25kaXRpb24gKi8KKyNkZWZpbmUgU01UX0VSTF9GRUMJKDE8PDExKQkJCS8qIGZyYW1lIGVycm9yIGNvbmRpdGlvbiAqLworCisvKgorICogc210IGV2ZW50IGxvdworICovCisjZGVmaW5lIFNNVF9FVkxfTkNFCSgxPDw1KQorCisJdV9zaG9ydAlzbXRfZXJyb3JfbG93IDsJCQkvKiBieXRlIDE0LzE1ICovCisJdV9zaG9ydAlzbXRfZXJyb3JfaGlnaCA7CQkvKiBieXRlIDE2LzE3ICovCisJdV9zaG9ydAlzbXRfZXZlbnRfbG93IDsJCQkvKiBieXRlIDE4LzE5ICovCisJdV9zaG9ydAlzbXRfZXZlbnRfaGlnaCA7CQkvKiBieXRlIDIwLzIxICovCisJdV9zaG9ydAljb25uZWN0aW9uX3BvbGljeV92aW9sYXRpb24gOwkvKiBieXRlIDIyLzIzICovCisJdV9zaG9ydCBwb3J0X2V2ZW50IDsJCQkvKiBieXRlIDI0LzI1ICovCisJdV9zaG9ydCBzZXRfY291bnRfbG93IDsJCQkvKiBieXRlIDI2LzI3ICovCisJdV9zaG9ydCBzZXRfY291bnRfaGlnaCA7CQkvKiBieXRlIDI4LzI5ICovCisJdV9zaG9ydAlhY2lfaWRfY29kZSA7CQkJLyogYnl0ZSAzMC8zMSAqLworCXVfc2hvcnQJcHVyZ2VfZnJhbWVfY291bnRlciA7CQkvKiBieXRlIDMyLzMzICovCisKKwkvKgorCSAqIENNVCBhbmQgUk1UIHN0YXRlIG1hY2hpbmVzCisJICovCisJdV9zaG9ydAllY21fc3RhdGUgOwkJCS8qIGJ5dGUgMzQvMzUgKi8KKwl1X3Nob3J0CXBjbV9hX3N0YXRlIDsJCQkvKiBieXRlIDM2LzM3ICovCisJdV9zaG9ydCBwY21fYl9zdGF0ZSA7CQkJLyogYnl0ZSAzOC8zOSAqLworCXVfc2hvcnQJY2ZtX3N0YXRlIDsJCQkvKiBieXRlIDQwLzQxICovCisJdV9zaG9ydAlybXRfc3RhdGUgOwkJCS8qIGJ5dGUgNDIvNDMgKi8KKworCXVfc2hvcnQJbm90X3VzZWRbMzBdIDsJCQkvKiBieXRlIDQ0LTEwMyAqLworCisJdV9zaG9ydAl1Y29kZV92ZXJzaW9uX2xldmVsIDsJCS8qIGJ5dGUgMTA0LzEwNSAqLworCisJdV9zaG9ydAlub3RfdXNlZF8xIDsJCQkvKiBieXRlIDEwNi8xMDcgKi8KKwl1X3Nob3J0IG5vdF91c2VkXzIgOwkJCS8qIGJ5dGUgMTA4LzEwOSAqLworfSA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2gvbWJ1Zi5oIGIvZHJpdmVycy9uZXQvc2tmcC9oL21idWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzM5ZDFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9oL21idWYuaApAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCV9NQlVGXworI2RlZmluZSBfTUJVRl8KKworI2lmbmRlZiBQQ0kKKyNkZWZpbmUgTV9TSVpFCTQ1NTAKKyNlbHNlCisjZGVmaW5lIE1fU0laRQk0NTA0CisjZW5kaWYKKworI2lmbmRlZiBNQVhfTUJVRgorI2RlZmluZSBNQVhfTUJVRgk0CisjZW5kaWYKKworI2lmbmRlZiBOT19TVERfTUJVRgorI2RlZmluZSBzbV9uZXh0ICAgICAgICAgbV9uZXh0CisjZGVmaW5lIHNtX29mZiAgICAgICAgICBtX29mZgorI2RlZmluZSBzbV9sZW4gICAgICAgICAgbV9sZW4KKyNkZWZpbmUgc21fZGF0YSAgICAgICAgIG1fZGF0YQorI2RlZmluZSBTTWJ1ZiAgICAgICAgICAgTWJ1ZgorI2RlZmluZSBtdG9kCQlzbXRvZAorI2RlZmluZSBtdG9kb2ZmCQlzbXRvZG9mZgorI2VuZGlmCisKK3N0cnVjdCBzX21idWYgeworCXN0cnVjdCBzX21idWYJKnNtX25leHQgOwkJLyogbG93IGxldmVsIGxpbmtlZCBsaXN0ICovCisJc2hvcnQJCXNtX29mZiA7CQkJLyogb2Zmc2V0IGluIG1fZGF0YSAqLworCXVfaW50CQlzbV9sZW4gOwkJCS8qIGxlbiBvZiBkYXRhICovCisjaWZkZWYJUENJCisJaW50CQlzbV91c2VfY291bnQgOworI2VuZGlmCisJY2hhcgkJc21fZGF0YVtNX1NJWkVdIDsKK30gOworCit0eXBlZGVmIHN0cnVjdCBzX21idWYgU01idWYgOworCisvKiBtYnVmIGhlYWQsIHRvIHR5cGVkIGRhdGEgKi8KKyNkZWZpbmUJc210b2QoeCx0KQkoKHQpKCh4KS0+c21fZGF0YSArICh4KS0+c21fb2ZmKSkKKyNkZWZpbmUJc210b2RvZmYoeCx0LG8pCSgodCkoKHgpLT5zbV9kYXRhICsgKG8pKSkKKworI2VuZGlmCS8qIF9NQlVGXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9oL29zZGVmMXN0LmggYi9kcml2ZXJzL25ldC9za2ZwL2gvb3NkZWYxc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzU5ZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9oL29zZGVmMXN0LmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OCwxOTk5IFN5c0tvbm5lY3QsCisgKglhIGJ1c2luZXNzIHVuaXQgb2YgU2NobmVpZGVyICYgS29jaCAmIENvLiBEYXRlbnN5c3RlbWUgR21iSC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIAorICogT3BlcmF0aW5nIHN5c3RlbS1kZXBlbmRlbnQgZGVmaW5pdGlvbnMgdGhhdCBoYXZlIHRvIGJlIGRlZmluZWQKKyAqIGJlZm9yZSBhbnkgb3RoZXIgaGVhZGVyIGZpbGVzIGFyZSBpbmNsdWRlZC4KKyAqLworCisvLyBIV00gKEhhcmRXYXJlIE1vZHVsZSkgRGVmaW5pdGlvbnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgTElUVExFX0VORElBTgorI2Vsc2UKKyNkZWZpbmUgQklHX0VORElBTgorI2VuZGlmCisKKy8vIHRoaXMgaXMgc2V0IGluIHRoZSBtYWtlZmlsZQorLy8gI2RlZmluZSBQQ0kJCQkvKiBvbmx5IFBDSSBhZGFwdGVycyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIgKi8KKy8vICNkZWZpbmUgTUVNX01BUFBFRF9JTwkvKiB1c2UgbWVtb3J5IG1hcHBlZCBJL08gKi8KKworCisjZGVmaW5lIFVTRV9DQU5fQUREUgkJLyogREEgYW5kIFNBIGluIE1BQyBoZWFkZXIgYXJlIGNhbm9uaWNhbC4gKi8KKworI2RlZmluZSBNQl9PVVRTSURFX1NNQwkJLyogU01UIE1idWZzIG91dHNpZGUgb2Ygc21jIHN0cnVjdC4gKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisvLyBTTVQgRGVmaW5pdGlvbnMgCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBTWU5DCSAgICAgICAJCS8qIGFsbG93IHN5bmNocm9ub3VzIGZyYW1lcyAqLworCisvLyAjZGVmaW5lIFNCQQkJCS8qIFN5bmNocm9ub3VzIEJhbmR3aWR0aCBBbGxvY2F0b3Igc3VwcG9ydCAqLworCQkJCS8qIG5vdCBhdmFpbGFibGUgYXMgZnJlZSBzb3VyY2UgKi8KKworI2RlZmluZSBFU1MJCQkvKiBTQkEgRW5kIFN0YXRpb24gU3VwcG9ydCAqLworCisjZGVmaW5lCVNNVF9QQU5JQyhzbWMsIG5yLCBtc2cpCXByaW50ayhLRVJOX0lORk8gIlNNVCBQQU5JQzogY29kZTogJWQsIG1zZzogJXNcbiIsbnIsbXNnKQorCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBwcmludGYocyxhcmdzLi4uKSBwcmludGsoS0VSTl9JTkZPIHMsICMjIGFyZ3MpCisjZW5kaWYKKworLy8gI2RlZmluZSBIV19QVFIJdV9sb25nCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKworLy8gSFdNIGFuZCBPUy1zcGVjaWZpYyBidWZmZXIgZGVmaW5pdGlvbnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGRlZmF1bHQgbnVtYmVyIG9mIHJlY2VpdmUgYnVmZmVycy4KKyNkZWZpbmUgTlVNX1JFQ0VJVkVfQlVGRkVSUwkJMTAKKworLy8gZGVmYXVsdCBudW1iZXIgb2YgdHJhbnNtaXQgYnVmZmVycy4KKyNkZWZpbmUgTlVNX1RSQU5TTUlUX0JVRkZFUlMJCTEwCisKKy8vIE51bWJlciBvZiBTTVQgYnVmZmVycyAoTWJ1ZnMpLgorI2RlZmluZSBOVU1fU01UX0JVRgk0CisKKy8vIE51bWJlciBvZiBUWERzIGZvciBhc3luY2hyb25vdXMgdHJhbnNtaXQgcXVldWUuCisjZGVmaW5lIEhXTV9BU1lOQ19UWERfQ09VTlQJKE5VTV9UUkFOU01JVF9CVUZGRVJTICsgTlVNX1NNVF9CVUYpCisKKy8vIE51bWJlciBvZiBUWERzIGZvciBzeW5jaHJvbm91cyB0cmFuc21pdCBxdWV1ZS4KKyNkZWZpbmUgSFdNX1NZTkNfVFhEX0NPVU5UCUhXTV9BU1lOQ19UWERfQ09VTlQKKworCisvLyBOdW1iZXIgb2YgUlhEcyBmb3IgcmVjZWl2ZSBxdWV1ZSAjMS4KKy8vIE5vdGU6IFdvcmthcm91bmQgZm9yIEFTSUMgRXJyYXRhICM3OiBPbmUgZXh0cmEgUlhEIGlzIHJlcXVpcmVkLgorI2lmIChOVU1fUkVDRUlWRV9CVUZGRVJTID4gMTAwKQorI2RlZmluZSBTTVRfUjFfUlhEX0NPVU5UCSgxICsgMTAwKQorI2Vsc2UKKyNkZWZpbmUgU01UX1IxX1JYRF9DT1VOVAkoMSArIE5VTV9SRUNFSVZFX0JVRkZFUlMpCisjZW5kaWYKKworLy8gTnVtYmVyIG9mIFJYRHMgZm9yIHJlY2VpdmUgcXVldWUgIzIuCisjZGVmaW5lIFNNVF9SMl9SWERfQ09VTlQJMAkvLyBOb3QgdXNlZC4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworCisvKgorICogT1Mtc3BlY2lmaWMgcGFydCBvZiB0aGUgdHJhbnNtaXQvcmVjZWl2ZSBkZXNjcmlwdG9yIHN0cnVjdHVyZSAoVFhEL1JYRCkuCisgKgorICogTm90ZTogVGhlIHNpemUgb2YgdGhlc2Ugc3RydWN0dXJlcyBtdXN0IGZvbGxvdyB0aGlzIHJ1bGU6CisgKgorICoJc2l6ZW9mKHN0cnVjdCkgKyAyKnNpemVvZih2b2lkKikgPT0gbiAqIDE2LCBuID49IDEKKyAqCisgKiBXZSB1c2UgdGhlIGRtYV9hZGRyIGZpZWxkcyB1bmRlciBMaW51eCB0byBrZWVwIHRyYWNrIG9mIHRoZQorICogRE1BIGFkZHJlc3Mgb2YgdGhlIHBhY2tldCBkYXRhLCBmb3IgbGF0ZXIgcGNpX3VubWFwX3NpbmdsZS4gLURhdmVNCisgKi8KKworc3RydWN0IHNfdHhkX29zIHsJLy8gb3Mtc3BlY2lmaWMgcGFydCBvZiB0cmFuc21pdCBkZXNjcmlwdG9yCisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworfSA7CisKK3N0cnVjdCBzX3J4ZF9vcyB7CS8vIG9zLXNwZWNpZmljIHBhcnQgb2YgcmVjZWl2ZSBkZXNjcmlwdG9yCisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworfSA7CisKKworLyoKKyAqIFNvIHdlIGRvIG5vdCBuZWVkIHRvIG1ha2UgdG9vIG1hbnkgbW9kaWZpY2F0aW9ucyB0byB0aGUgZ2VuZXJpYyBkcml2ZXIKKyAqIHBhcnRzLCB3ZSB0YWtlIGFkdmFudGFnZSBvZiB0aGUgQUlYIGJ5dGUgc3dhcHBpbmcgbWFjcm8gaW50ZXJmYWNlLgorICovCisKKyNkZWZpbmUgQUlYX1JFVkVSU0UoeCkJCSgodTMyKWxlMzJfdG9fY3B1KCh1MzIpKHgpKSkKKyNkZWZpbmUgTURSX1JFVkVSU0UoeCkJCSgodTMyKWxlMzJfdG9fY3B1KCh1MzIpKHgpKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvaC9zYmEuaCBiL2RyaXZlcnMvbmV0L3NrZnAvaC9zYmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjcxNmNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9oL3NiYS5oCkBAIC0wLDAgKzEsMTQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogU3luY2hyb25vdXMgQmFuZHdpdGggQWxsb2NhdGlvbiAoU0JBKSBzdHJ1Y3RzCisgKi8KKyAKKyNpZm5kZWYgX1NCQV8KKyNkZWZpbmUgX1NCQV8KKworI2luY2x1ZGUgImgvbWJ1Zi5oIgorI2luY2x1ZGUgImgvc2JhX2RlZi5oIgorCisjaWZkZWYJU0JBCisKKy8qIFRpbWVyIENlbGwgVGVtcGxhdGUgKi8KK3N0cnVjdCB0aW1lcl9jZWxsIHsKKwlzdHJ1Y3QgdGltZXJfY2VsbAkqbmV4dF9wdHIgOworCXN0cnVjdCB0aW1lcl9jZWxsCSpwcmV2X3B0ciA7CisJdV9sb25nCQkJc3RhcnRfdGltZSA7CisJc3RydWN0IHNfc2JhX25vZGVfdmFycwkqbm9kZV92YXIgOworfSA7CisKKy8qCisgKiBOb2RlIHZhcmlhYmxlcworICovCitzdHJ1Y3Qgc19zYmFfbm9kZV92YXJzIHsKKwl1X2NoYXIJCQljaGFuZ2VfcmVzcF9mbGFnIDsKKwl1X2NoYXIJCQlyZXBvcnRfcmVzcF9mbGFnIDsKKwl1X2NoYXIJCQljaGFuZ2VfcmVxX2ZsYWcgOworCXVfY2hhcgkJCXJlcG9ydF9yZXFfZmxhZyA7CisJbG9uZwkJCWNoYW5nZV9hbW91bnQgOworCWxvbmcJCQlub2RlX292ZXJoZWFkIDsKKwlsb25nCQkJbm9kZV9wYXlsb2FkIDsKKwl1X2xvbmcJCQlub2RlX3N0YXR1cyA7CisJdV9jaGFyCQkJZGVhbGxvY2F0ZV9zdGF0dXMgOworCXVfY2hhcgkJCXRpbWVyX3N0YXRlIDsKKwl1X3Nob3J0CQkJcmVwb3J0X2NudCA7CisJbG9uZwkJCWxhc3RyZXBfcmVxX3RyYW5pZCA7CisJc3RydWN0IGZkZGlfYWRkcgltYWNfYWRkcmVzcyA7CisJc3RydWN0IHNfc2JhX3Nlc3Npb25zIAkqbm9kZV9zZXNzaW9ucyA7CisJc3RydWN0IHRpbWVyX2NlbGwJdGltZXIgOworfSA7CisKKy8qCisgKiBTZXNzaW9uIHZhcmlhYmxlcworICovCitzdHJ1Y3Qgc19zYmFfc2Vzc2lvbnMgeworCXVfbG9uZwkJCWRlYWxsb2NhdGVfc3RhdHVzIDsKKwlsb25nCQkJc2Vzc2lvbl9vdmVyaGVhZCA7CisJdV9sb25nCQkJbWluX3NlZ21lbnRfc2l6ZSA7CisJbG9uZwkJCXNlc3Npb25fcGF5bG9hZCA7CisJdV9sb25nCQkJc2Vzc2lvbl9zdGF0dXMgOworCXVfbG9uZwkJCXNiYV9jYXRlZ29yeSA7CisJbG9uZwkJCWxhc3RjaGdfcmVxX3RyYW5pZCA7CisJdV9zaG9ydAkJCXNlc3Npb25faWQgOworCXVfY2hhcgkJCWNsYXNzIDsKKwl1X2NoYXIJCQlmZGRpMiA7CisJdV9sb25nCQkJbWF4X3RfbmVnIDsKKwlzdHJ1Y3Qgc19zYmFfc2Vzc2lvbnMJKm5leHRfc2Vzc2lvbiA7Cit9IDsKKworc3RydWN0IHNfc2JhIHsKKworCXN0cnVjdCBzX3NiYV9ub2RlX3ZhcnMJbm9kZVtNQVhfTk9ERVNdIDsKKwlzdHJ1Y3Qgc19zYmFfc2Vzc2lvbnMJc2Vzc2lvbltNQVhfU0VTU0lPTlNdIDsKKworCXN0cnVjdCBzX3NiYV9zZXNzaW9ucwkqZnJlZV9zZXNzaW9uIDsJLyogcG9pbnRzIHRvIHRoZSBmaXJzdCAqLworCQkJCQkJLyogZnJlZSBzZXNzaW9uICovCisKKwlzdHJ1Y3QgdGltZXJfY2VsbAkqdGFpbF90aW1lciA7CS8qIHBvaW50cyB0byB0aGUgbGFzdCB0aW1lciBjZWxsICovCisKKwkvKgorCSAqIHZhcmlhYmxlcyBmb3IgYWxsb2NhdGlvbiBhY3Rpb25zCisJICovCisJbG9uZwl0b3RhbF9wYXlsb2FkIDsJCS8qIFRvdGFsIFBheWxvYWQgKi8KKwlsb25nCXRvdGFsX292ZXJoZWFkIDsJLyogVG90YWwgT3ZlcmhlYWQgKi8KKwlsb25nCXNiYV9hbGxvY2F0YWJsZSA7CS8qIGFsbG9jYXRhYmxlIHN5bmMgYmFuZHdpZHRoICovCisKKwkvKgorCSAqIFJBRiBtZXNzYWdlIHJlY2VpdmUgcGFyYW1ldGVycworCSAqLworCWxvbmcJCW1zZ19wYXRoX2luZGV4IDsJLyogUGF0aCBUeXBlICovCisJbG9uZwkJbXNnX3NiYV9wbF9yZXEgOwkvKiBQYXlsb2FkIFJlcXVlc3QgKi8KKwlsb25nCQltc2dfc2JhX292X3JlcSA7CS8qIE92ZXJoZWFkIFJlcXVlc3QgKi8KKwlsb25nCQltc2dfbWliX3BsIDsJCS8qIEN1cnJlbnQgUGF5bG9hZCBmb3IgdGhpcyBQYXRoICovCisJbG9uZwkJbXNnX21pYl9vdiA7CQkvKiBDdXJyZW50IE92ZXJoZWFkIGZvciB0aGlzIFBhdGgqLworCWxvbmcJCW1zZ19jYXRlZ29yeSA7CQkvKiBDYXRlZ29yeSBvZiB0aGUgQWxsb2NhdGlvbiAqLworCXVfbG9uZwkJbXNnX21heF90X25lZyA7CQkvKiBsb25nZXN0IFRfTmVnIGFjY2VwdGFibGUgKi8KKwl1X2xvbmcJCW1zZ19taW5fc2VnX3NpeiA7CS8qIG1pbmltdW0gc2VnZW1lbnQgc2l6ZSAqLworCXN0cnVjdCBzbXRfaGVhZGVyCSpzbSA7CQkvKiBwb2ludHMgdG8gdGhlIHJlYyBtZXNzYWdlICovCisJc3RydWN0IGZkZGlfYWRkcgkqbXNnX2FsbG9jX2FkZHIgOwkvKiBBbGxvY2F0aW9uIEFkZHJlc3MgKi8KKworCS8qCisJICogU0JBIHZhcmlhYmxlcworCSAqLworCXVfbG9uZwlzYmFfdF9uZWcgOwkJLyogaG9sZHMgdGhlIGxhc3QgVF9ORUcgKi8KKwlsb25nCXNiYV9tYXhfYWxsb2MgOwkJLyogdGhlIHBhcnNlZCB2YWx1ZSBvZiBTQkFBdmFpbGFibGUgKi8JCisKKwkvKgorCSAqIFNCQSBzdGF0ZSBtYWNoaW5lIHZhcmlhYmxlcworCSAqLworCXNob3J0CXNiYV9uZXh0X3N0YXRlIDsJLyogdGhlIG5leHQgc3RhdGUgb2YgdGhlIFNCQSAqLworCWNoYXIJc2JhX2NvbW1hbmQgOwkJLyogaG9sZHMgdGhlIGV4ZWN1ZGVkIFNCQSBjbWQgKi8KKwl1X2NoYXIJc2JhX2F2YWlsYWJsZSA7CQkvKiBwYXJzZWQgdmFsdWUgYWZ0ZXIgcG9zc2libGUgY2hlY2sgKi8KK30gOworCisjZW5kaWYJLyogU0JBICovCisKKwkvKgorCSAqIHZhcmlhYmxlcyBmb3IgdGhlIEVuZCBTdGF0aW9uIFN1cHBvcnQKKwkgKi8KK3N0cnVjdCBzX2VzcyB7CisKKwkvKgorCSAqIGZsYWdzIGFuZCBjb3VudGVycworCSAqLworCXVfY2hhcglzeW5jX2J3X2F2YWlsYWJsZSA7CS8qIGlzIHNldCBpZiBzeW5jIGJ3IGlzIGFsbG9jYXRlZCAqLworCXVfY2hhcglsb2NhbF9zYmFfYWN0aXZlIDsJLyogc2V0IHdoZW4gYSBsb2NhbCBzYmEgaXMgYXZhaWxhYmxlICovCisJY2hhcglyYWZfYWN0X3RpbWVyX3BvbGwgOwkvKiBhY3RpdmF0ZSB0aGUgdGltZXIgdG8gc2VuZCBhbGxjIHJlcSAqLworCWNoYXIJdGltZXJfY291bnQgOwkJLyogY291bnRzIGV2ZXJ5IHRpbWVyIGZ1bmN0aW9uIGNhbGwgKi8KKworCVNNYnVmCSpzYmFfcmVwbHlfcGVuZCA7CS8qIGxvY2FsIHJlcGx5IGZvciB0aGUgc2JhIGlzIHBlbmRpbmcgKi8KKwkKKwkvKgorCSAqIHZhcmlhYmxlcyBmb3IgdGhlIGVzcyBiYW5kd2lkdGggY29udHJvbAorCSAqLworCWxvbmcJc3luY19idyA7CQkvKiBob2xkcyB0aGUgYWxsb2NhZWQgc3luYyBidyAqLworCXVfbG9uZwlhbGxvY190cmFuc19pZCA7CS8qIHRyYW5zIGlkIG9mIHRoZSBsYXN0IGFsbG9jIHJlcSAqLworfSA7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvaC9zYmFfZGVmLmggYi9kcml2ZXJzL25ldC9za2ZwL2gvc2JhX2RlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NTlhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2gvc2JhX2RlZi5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OCwxOTk5IFN5c0tvbm5lY3QsCisgKglhIGJ1c2luZXNzIHVuaXQgb2YgU2NobmVpZGVyICYgS29jaCAmIENvLiBEYXRlbnN5c3RlbWUgR21iSC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUEhZUwkJCTAJCS8qIHBoeXNpY2FsIGFkZHIgKi8KKyNkZWZpbmUgUEVSTV9BRERSCQkweDgwCQkvKiBwZXJtYW5ldCBhZGRyZXNzICovCisjZGVmaW5lIFNCX1NUQVRJQwkJMHgwMDAwMDAwMQorI2RlZmluZSBNQVhfUEFZTE9BRAkJMTU2MgorI2RlZmluZSBQUklNQVJZX1JJTkcJCTB4MDAwMDAwMDEKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMCQkJMHgwMAorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBTQl9JbnB1dCBWYXJpYWJsZSBWYWx1ZXMgKioqKioqKioqKioqKioqKioqKioqKiovCisvKgkgbWF5IGJlIG5lZWRlZCB3aGVuIGV2ZXIgdGhlIFNCQSBzdGF0ZSBtYWNoaW5lIGlzIGNhbGxlZAkqLworCisjZGVmaW5lIFVOS05PV05fU1lOQ19TT1VSQ0UJMHgwMDAxCisjZGVmaW5lIFJFUV9BTExPQ0FUSU9OCQkweDAwMDIKKyNkZWZpbmUgUkVQT1JUX1JFU1AJCTB4MDAwMworI2RlZmluZSBDSEFOR0VfUkVTUAkJMHgwMDA0CisjZGVmaW5lIFRORUcJCQkweDAwMDUKKyNkZWZpbmUgTklGCQkJMHgwMDA2CisjZGVmaW5lIFNCX1NUT1AJCQkweDAwMDcKKyNkZWZpbmUgU0JfU1RBUlQJCTB4MDAwOAorI2RlZmluZSBSRVBPUlRfVElNRVIJCTB4MDAwOQorI2RlZmluZSBDSEFOR0VfUkVRVUlSRUQJCTB4MDAwQQorCisjZGVmaW5lIERFRkFVTFRfT1YJCTUwCisKKyNpZmRlZiBTQkEKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNCQSBTVEFURVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU0JBX1NUQU5EQlkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgU0JBX0FDVElWRQkJMHgwMDAwMDAwMQorI2RlZmluZSBTQkFfUkVDT1ZFUlkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgU0JBX1JFUE9SVAkJMHgwMDAwMDAwMworI2RlZmluZSBTQkFfQ0hBTkdFCQkweDAwMDAwMDA0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIE9USEVSUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRklGVFlfUEVSQ0VOVAkJNTAJCS8qIGJ5dGVzIHBlciBzZWNvbmQgKi8KKyNkZWZpbmUgTUFYX1NFU1NJT05TCQkxNTAJCisjZGVmaW5lIFRXT19NSU5VVEVTCQkxMzA3OQkJLyogOS4xNzUgbXMvdGljayAqLworI2RlZmluZSBGSUZUWV9CWVRFUwkJNTAKKyNkZWZpbmUgU0JBX0RFTklFRAkJMHgwMDAwMDAwRAorI2RlZmluZSBJX05FRURfT05FCQkweDAwMDAwMDAwCisjZGVmaW5lIE1BWF9OT0RFUwkJNTAKKy8qI2RlZmluZSBUX1JFUE9SVAkJMHg1OTY4MkYwMEwqLwkvKiAxMjBzLzgwbnMgaW4gSGV4ICovCisjZGVmaW5lCVRXT19NSU4JCQkxMjAJCS8qIHNlY29uZHMgKi8KKyNkZWZpbmUgU0JBX1NUX1VOS05PV04JCTB4MDAwMDAwMDIKKyNkZWZpbmUgU0JBX1NUX0FDVElWRQkJMHgwMDAwMDAwMQorI2RlZmluZSBTX0NMRUFSCQkJMHgwMDAwMDAwMEwKKyNkZWZpbmUgWkVSTwkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRlVMTAkJCTB4MDAwMDAwMDAJLyogb2xkOiAweEZGRkZGRkZGRiAqLworI2RlZmluZSBTX1NFVAkJCTB4MDAwMDAwMDFMCisjZGVmaW5lIExPV19QUklPCQkweDAyCQkvKiA/Pz8/Pz8/ICovCisjZGVmaW5lIE9LCQkJMHgwMQkJLyogPz8/Pz8/PyAqLworI2RlZmluZSBOT1RfT0sJCQkweDAwCQkvKiA/Pz8/Pz8/ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZGVhbGxvY2F0ZV9zdGF0dXNbbmldW3NpXSB2YWx1ZXMJKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBUWF9DSEFOR0UJCTBYMDAwMDAwMDFMCisjZGVmaW5lIFBFTkRJTkcJCQkweDAwMDAwMDAyTAorI2RlZmluZSBOT05FCQkJMFgwMDAwMDAwMEwKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9oL3NrZmJpLmggYi9kcml2ZXJzL25ldC9za2ZwL2gvc2tmYmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTM0N2Q2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvaC9za2ZiaS5oCkBAIC0wLDAgKzEsMTkxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZglfU0tGQklfSF8KKyNkZWZpbmUJX1NLRkJJX0hfCisKKyNpZmRlZiBTWU5DCisjZGVmaW5lIGV4aXN0X2JvYXJkX2ZhcgkJCWV4aXN0X2JvYXJkCisjZGVmaW5lIGdldF9ib2FyZF9wYXJhX2ZhcgkJZ2V0X2JvYXJkX3BhcmEKKyNlbmRpZgorCisvKgorICogcGh5c2ljYWwgYWRkcmVzcyBvZmZzZXQgKyBJTy1Qb3J0IGJhc2UgYWRkcmVzcworICovCisjaWZuZGVmCVBDSQorI2RlZmluZQlBRERSKGEpCSgoYSkrc21jLT5ody5pb3ApCisjZGVmaW5lCUFERFJTKHNtYyxhKSAoKGEpKyhzbWMpLT5ody5pb3ApCisjZW5kaWYKKworLyoKKyAqIEZEREktRnggKHggOj0ge0koU0EpLCBFKElTQSksIE0oQ0EpLCBQKENJKX0pCisgKglhZGRyZXNzIGNhbGN1bGF0aW9uICYgZnVuY3Rpb24gZGVmaW5lcworICovCisKKyNpZmRlZglFSVNBCisKKy8qCisgKiBDb25maWd1cmF0aW9uIFBST006CSAhISBhbGwgOC1CaXQgSU8ncyAhIQorICoJCQkJCSAgICB8PC0JICBNQUMtQWRkcmVzcwkgLT58CisgKgkvLSstLSstLSstLSstLSstLy8tKy0tKy0tKy0tKy0tKy0vLy0rLS0rLS0rLS0rLS0rLS8vLSstLSstLSstLSstLSstLworICogdmFsOgkgIHxQUk9EX0lEMC4uM3wJICAgfCBmcmVlICAgICAgfCAgICB8MDB8MDB8NUF8NDB8ICAgIHxubnxtbXwwMHwwMHwKKyAqCS8tKy0tKy0tKy0tKy0tKy0vLy0rLS0rLS0rLS0rLS0rLS8vLSstLSstLSstLSstLSstLy8tKy0tKy0tKy0tKy0tKy0vCisgKiBJTy0JICBeCSAgICAgIF4JICAgXgkJICAgIF4JCSAgICAgXgorICogcG9ydAkwQzgwCSAgICAwQzgzICAwQzg4CQkgICAwQzkwCQkgICAgMEM5OAorICoJICB8CSAgICAgICBcCisgKgkgIHwJCVwKKyAqCSAgfAkJIFxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisgKiBFSVNBIEV4cGFuc2lvbiBCb2FyZCBQcm9kdWN0IElEOgkJCQkJXAorICogQklUOgkgIHw3IDYgNSA0IDMgMiAxIDB8CQkJCQkJIFwKKyAqCSAgfCBQUk9EX0lEMAkgIHwgUFJPRF9JRDEJICB8IFBST0RfSUQyCSAgfCBQUk9EX0lEMwkgIHwKKyAqCSAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqCSAgfDB8IE1BTl9DMCAgfCBNQU5fQzEJfCBNQU5fQzIgIHwgUFJPRDEgfCBQUk9EMCB8IFJFVjEgIHwgUkVWMCAgfAorICoJICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICoJICAgXj1yZXNlcnZlZAkJCSAgfCBwcm9kdWN0IG51bWIuIHwgcmV2aXNpb24gbnVtYiB8CisgKiBNQU5fQ3ggPSBjb21wcmVzc2VkIG1hbnVmYWN0ZXJlciBjb2RlICh4Oj0wLi4yKQorICoJQVNDSUkgOiAnQScuLidaJyA6IDB4NDEuLjB4NUEgLT4gY29tcHIuKGMtMHg0MCkgOiAweDAxLi4weDFBICg1Qml0cyEpCisgKi8KKworI2lmbmRlZglNVUxUX09FTQorI2lmbmRlZglPRU1fQ09OQ0VQVAorI2RlZmluZQlNQU5fQzAJCSgnUyctMHg0MCkKKyNkZWZpbmUJTUFOX0MxCQkoJ0snLTB4NDApCisjZGVmaW5lCU1BTl9DMgkJKCdEJy0weDQwKQorI2RlZmluZQlQUk9EX0lEMAkodV9jaGFyKSgoTUFOX0MwPDwyKSB8IChNQU5fQzE+PjMpKQorI2RlZmluZQlQUk9EX0lEMQkodV9jaGFyKSgoKE1BTl9DMTw8NSkgJiAweGZmKSB8IE1BTl9DMikKKyNkZWZpbmUJUFJPRF9JRDIJKHVfY2hhcikoMSkJLyogcHJvZC4gbnIuICovCisjZGVmaW5lCVBST0RfSUQzCSh1X2NoYXIpKDApCS8qIHJldi4gbnIuICovCisKKyNpZm5kZWYJT0VNX1VTRVJfREFUQQorI2RlZmluZQlPRU1fVVNFUl9EQVRBCSJTSy1ORVQgRkRESSBWMi4wIFVzZXJkYXRhIgorI2VuZGlmCisjZWxzZQkvKiAgT0VNX0NPTkNFUFQgKi8KKworLyogTUFOX0MoMHwxfDIpIG5vIGxvbmdlciBwcmVzZW50IChyYSkuICovCisjZGVmaW5lCVBST0RfSUQwCSh1X2NoYXIpT0VNX1BST0RfSUQwCisjZGVmaW5lCVBST0RfSUQxCSh1X2NoYXIpT0VNX1BST0RfSUQxCisjZGVmaW5lCVBST0RfSUQyCSh1X2NoYXIpT0VNX1BST0RfSUQyCisjZGVmaW5lCVBST0RfSUQzCSh1X2NoYXIpT0VNX1BST0RfSUQzCisjZW5kaWYJLyogT0VNX0NPTkNFUFQgKi8KKworI2RlZmluZQlTS0xPR08JCVBST0RfSUQwLCBQUk9EX0lEMSwgUFJPRF9JRDIsIFBST0RfSUQzCisjZW5kaWYJLyogTVVMVF9PRU0gKi8KKworI2RlZmluZQlTQUREUkwJKDApCQkvKiBzdGFydCBhZGRyZXNzIFNLTE9HTyAqLworI2RlZmluZQlTQV9NQUMJKDB4MTApCQkvKiBzdGFydCBhZGRyLiBNQUNfQUQgd2l0aGluIHRoZSBQUk9NICovCisjZGVmaW5lCVBSQV9PRkYJKDQpCisjZGVmaW5lIFNBX1BNRF9UWVBFCSg4KQkvKiBzdGFydCBhZGRyLiBQTUQtVHlwZSAqLworCisjZGVmaW5lCVNLRkRESV9QU1oJMzIJCS8qIGFkZHJlc3MgUFJPTSBzaXplICovCisKKy8qCisgKiBhZGRyZXNzIHRyYW5zbWlzc2lvbiBmcm9tIGxvZ2ljYWwgdG8gcGh5c2ljYWwgb2Zmc2V0IGFkZHJlc3Mgb24gYm9hcmQKKyAqLworI2RlZmluZSBGTUEoYSkJKDB4MDQwMHwoKGEpPDwxKSkJLyogRk9STUFDKyAoci93KSAqLworI2RlZmluZSBQMUEoYSkJKDB4MDgwMHwoKGEpPDwxKSkJLyogUExDMSAoci93KSAqLworI2RlZmluZSBQMkEoYSkJKDB4MDg0MHwoKGEpPDwxKSkJLyogUExDMiAoci93KSAqLworI2RlZmluZSBUSUEoYSkJKDB4MDg4MHwoKGEpPDwxKSkJLyogVGltZXIgKHIvdykgKi8KKyNkZWZpbmUgUFJBKGEpCSgweDBjODB8IChhKSkJCS8qIGNvbmZpZ3VyYXRpb24gUFJPTSAqLworI2RlZmluZQlDMEEoYSkJKDB4MGM4NHwgKGEpKQkJLyogY29uZmlnLiBSQU0gKi8KKyNkZWZpbmUJQzFBKGEpCSgweDBjYTB8IChhKSkJCS8qIElSUS0sIERNQS1uci4sIEVQUk9NIHR5cGUgKi8KKyNkZWZpbmUJQzJBKGEpCSgweDBjYTR8IChhKSkJCS8qIEVQUk9NIGFuZCBQQUdFIHNlbGVjdG9yICovCisKKyNkZWZpbmUJQ09ORglDMEEoMCkJCQkvKiBjb25maWcgUkFNIChjYXJkIGVuYWJsZSBiaXQgcG9ydCkgKi8KKyNkZWZpbmUgUEdSQQlDMkEoMCkJCQkvKiBGbGFzaCBwYWdlIHJlZ2lzdGVyICovCisjZGVmaW5lCUNESUQJUFJBKDApCQkJLyogQ2FyZCBJRCBJL08gcG9ydCBhZGRyLiBvZmZzZXQgKi8KKworCisvKgorICogcGh5c2ljYWwgYWRkcmVzcyBvZmZzZXQgKyBzbG90IHNwZWNpZmljIElPLVBvcnQgYmFzZSBhZGRyZXNzCisgKi8KKyNkZWZpbmUgRk1fQShhKQkoRk1BKGEpK3NtYy0+aHcuaW9wKQkvKiBGT1JNQUMgUGx1cyBwaHlzaWNhbCBhZGRyICovCisjZGVmaW5lIFAxX0EoYSkJKFAxQShhKStzbWMtPmh3LmlvcCkJLyogUExDMSAoci93KSAqLworI2RlZmluZSBQMl9BKGEpCShQMkEoYSkrc21jLT5ody5pb3ApCS8qIFBMQzIgKHIvdykgKi8KKyNkZWZpbmUgVElfQShhKQkoVElBKGEpK3NtYy0+aHcuaW9wKQkvKiBUaW1lciAoci93KSAqLworI2RlZmluZSBQUl9BKGEpCShQUkEoYSkrc21jLT5ody5pb3ApCS8qIGNvbmZpZy4gUFJPTSAqLworI2RlZmluZSBDMF9BKGEpCShDMEEoYSkrc21jLT5ody5pb3ApCS8qIGNvbmZpZy4gUkFNICovCisjZGVmaW5lIEMxX0EoYSkJKEMxQShhKStzbWMtPmh3LmlvcCkJLyogY29uZmlnLiBSQU0gKi8KKyNkZWZpbmUgQzJfQShhKQkoQzJBKGEpK3NtYy0+aHcuaW9wKQkvKiBjb25maWcuIFJBTSAqLworCisKKyNkZWZpbmUJQ1NSQQkweDAwMDgJCS8qIGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyIGFkZHJlc3MgKHIvdykgKi8KKyNkZWZpbmUJSVNSQQkweDAwMDgJCS8qIGludC4gc291cmNlIHJlZ2lzdGVyIGFkZHJlc3MgKHVwcGVyIDhCaXRzKSAqLworI2RlZmluZSBQTEMxSQkweDAwMWEJCS8qIGNsZWFyIFBMQzEgaW50ZXJydXB0ICh3cml0ZSBvbmx5KSAqLworI2RlZmluZSBQTEMySQkweDAwMjAJCS8qIGNsZWFyIFBMQzIgaW50ZXJydXB0ICh3cml0ZSBvbmx5KSAqLworI2RlZmluZSBDU0ZBCTB4MDAxYwkJLyogY29udHJvbC9zdGF0dXMgRklGTyBCVVNZIGZsYWdzIChyZWFkIG9ubHkpICovCisjZGVmaW5lIFJRQUEJMHgwMDFjCQkvKiBSZXF1ZXN0IHJlZy4gKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIFdDVEEJMHgwMDFlCQkvKiB3b3JkIGNvdW50ZXIgKHIvdykgKi8KKyNkZWZpbmUJRkZMQUcJMHgwMDVlCQkvKiBGTEFHL1ZfRlVMTCAoRklGTyBhbG1vc3QgZnVsbCwgd3JpdGUgb25seSkqLworCisjZGVmaW5lCUNTUl9BCShDU1JBK3NtYy0+aHcuaW9wKQkvKiBjb250cm9sL3N0YXR1cyByZWdpc3RlciBhZGRyZXNzIChyL3cpICovCisjaWZkZWYgVU5JWAorI2RlZmluZQlDU1JfQVMoc21jKQkoQ1NSQSsoc21jKS0+aHcuaW9wKQkvKiBjb250cm9sL3N0YXR1cyByZWdpc3RlciBhZGRyZXNzIChyL3cpICovCisjZW5kaWYKKyNkZWZpbmUJSVNSX0EJKElTUkErc21jLT5ody5pb3ApCS8qIGludC4gc291cmNlIHJlZ2lzdGVyIGFkZHJlc3MgKHVwcGVyIDhCaXRzKSAqLworI2RlZmluZSBQTEMxX0kJKFBMQzFJK3NtYy0+aHcuaW9wKQkvKiBjbGVhciBQTEMxIGludGVybnVwdCAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgUExDMl9JCShQTEMySStzbWMtPmh3LmlvcCkJLyogY2xlYXIgUExDMiBpbnRlcnJ1cHQgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIENTRl9BCShDU0ZBK3NtYy0+aHcuaW9wKQkvKiBjb250cm9sL3N0YXR1cyBGSUZPIEJVU1kgZmxhZ3MgKHIvdykgKi8KKyNkZWZpbmUgUlFBX0EJKFJRQUErc21jLT5ody5pb3ApCS8qIFJlcXVlc3QgcmVnLiAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgV0NUX0EJKFdDVEErc21jLT5ody5pb3ApCS8qIHdvcmQgY291bnRlciAoci93KSAqLworI2RlZmluZQlGRkxBR19BCShGRkxBRytzbWMtPmh3LmlvcCkJLyogRkxBRy9WX0ZVTEwgKEZJRk8gYWxtb3N0IGZ1bGwsIHdyaXRlIG9ubHkpKi8KKworLyoKKyAqIGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyIENTUkEJYml0cworICovCisvKiB3cml0ZSAqLworI2RlZmluZSBDU19DUkVTRVQJMHgwMQkJLyogQ2FyZCByZXNldCAoMD1yZXNldCkgKi8KKyNkZWZpbmUJQ1NfUkVTRVRfRklGTwkweDAyCQkvKiBGSUZPIHJlc2V0ICgwPXJlc2V0KSAqLworI2RlZmluZQlDU19JTVNLCQkweDA0CQkvKiBlbmFibGUgSVJRICgxPWVuYWJsZSwgMD1kaXNhYmxlKSAqLworI2RlZmluZQlDU19FTl9JUlFfVEMJMHgwOAkJLyogZW5hYmxlIElSUSBmcm9tIHRyYW5zZmVyIGNvdW50ZXIgKi8KKyNkZWZpbmUgQ1NfQllQQVNTCTB4MjAJCS8qIGJ5cGFzcyBzd2l0Y2ggKDA9cmVtb3ZlLCAxPWluc2VydCkqLworI2RlZmluZSBDU19MRURfMAkweDQwCQkvKiBzd2l0Y2ggTEVEIDAgKi8KKyNkZWZpbmUJQ1NfTEVEXzEJMHg4MAkJLyogc3dpdGNoIExFRCAxICovCisvKiByZWFkICovCisjZGVmaW5lCUNTX0JZU1RBVAkweDQwCQkvKiAwPUJ5cGFzcyBleGlzdCwgMT0gLi5ub3QgKi8KKyNkZWZpbmUJQ1NfU0FTCQkweDgwCQkvKiBzaW5nbGUgYXR0YWNoZW1lbnQgc3RhdGlvbiAoPTEpICovCisKKy8qCisgKiBjb250cm9sL3N0YXR1cyByZWdpc3RlciBDU0ZBIGJpdHMgKEZJRk8pCisgKi8KKyNkZWZpbmUJQ1NGX01VWDAJMHgwMQorI2RlZmluZQlDU0ZfTVVYMQkweDAyCisjZGVmaW5lCUNTRl9IU1JFUTAJMHgwNAorI2RlZmluZQlDU0ZfSFNSRVExCTB4MDgKKyNkZWZpbmUJQ1NGX0hTUkVRMgkweDEwCisjZGVmaW5lCUNTRl9CVVNZX0RNQQkweDQwCisjZGVmaW5lCUNTRl9CVVNZX0ZJRk8JMHg4MAorCisvKgorICogSW50ZXJydXB0IHNvdXJjZSByZWdpc3RlciBJU1JBICh1cHBlciA4IGRhdGEgYml0cykgcmVhZCBvbmx5ICYgbG93IGFjdGl2LgorICovCisjZGVmaW5lIElTX01JTlRSMQkweDAxMDAJCS8qIEZPUk1BQyBTVDFVL0wgJiB+SU1TSzFVL0wqLworI2RlZmluZSBJU19NSU5UUjIJMHgwMjAwCQkvKiBGT1JNQUMgU1QyVS9MICYgfklNU0syVS9MKi8KKyNkZWZpbmUgSVNfUExJTlQxCTB4MDQwMAkJLyogUExDMSAqLworI2RlZmluZSBJU19QTElOVDIJMHgwODAwCQkvKiBQTEMyICovCisjZGVmaW5lIElTX1RJTUlOVAkweDEwMDAJCS8qIFRpbWVyIDgyQzU0LTIgKi8KKyNkZWZpbmUJSVNfVEMJCTB4MjAwMAkJLyogdHJhbnNmLiBjb3VudGVyICovCisKKyNkZWZpbmUJQUxMX0lSU1IgKElTX01JTlRSMXxJU19NSU5UUjJ8SVNfUExJTlQxfElTX1BMSU5UMnxJU19USU1JTlR8SVNfVEMpCisKKy8qCisgKiBDT05GSUc8MD4gUkFNIChDMF9BKCkpCisgKi8KKyNkZWZpbmUJQ0ZHX0NBUkRfRU4JMHgwMQkJLyogY2FyZCBlbmFibGUgKi8KKworLyoKKyAqIENPTkZJRzwxPiBSQU0gKEMxX0EoKSkKKyAqLworI2RlZmluZQlDRkdfSVJRX1NFTAkweDAzCQkvKiBJUlEgc2VsZWN0ICg0IG5yLikgKi8KKyNkZWZpbmUJQ0ZHX0lSUV9UVAkweDA0CQkvKiBJUlEgdHJpZ2dlciB0eXBlIChMRVZFTC9FREdFKSAqLworI2RlZmluZQlDRkdfRFJRX1NFTAkweDE4CQkvKiBETUEgcmVxdS4gKDQgbnIuKSAqLworI2RlZmluZQlDRkdfQk9PVF9FTgkweDIwCQkvKiAwPUJPT1QtLCAxPUFwcGxpY2F0aW9uIFNvZnR3YXJlICovCisjZGVmaW5lCUNGR19QUk9HX0VOCTB4NDAJCS8qIFZfUHJvZyBmb3IgRkxBU0hfUFJPTSAoMT1vbikgKi8KKworLyoKKyAqIENPTkZJRzwyPiBSQU0gKEMyX0EoKSkKKyAqLworI2RlZmluZQlDRkdfRVBST01fU0VMCTB4MGYJCS8qIEZQUk9NIHN0YXJ0IGFkZHJlc3Mgc2VsZWN0aW9uICovCisjZGVmaW5lCUNGR19QQUdFCTB4ZjAJCS8qIEZQUk9NIHBhZ2Ugc2VsZWN0aW9uICovCisKKworI2RlZmluZQlSRUFEX1BST00oYSkJKCh1X2NoYXIpaW5wKGEpKQorI2RlZmluZQlHRVRfUEFHRShpKQlvdXRwKEMyX0EoMCksKChpbnQpKGkpPDw0KSB8IChpbnAoQzJfQSgwKSkgJiB+Q0ZHX1BBR0UpKQorI2RlZmluZQlGUFJPTV9TVygpCShpbnAoQzFfQSgwKSkgJiBDRkdfQk9PVF9FTikKKworI2RlZmluZQlNQVhfUEFHRVMJMTYJCS8qIDE2IHBhZ2VzICovCisjZGVmaW5lCU1BWF9GQUREUgkweDIwMDAJCS8qIDhLIHBlciBwYWdlICovCisjZGVmaW5lCVZQUF9PTigpCW91dHAoQzFfQSgwKSxpbnAoQzFfQSgwKSkgfCAgQ0ZHX1BST0dfRU4pCisjZGVmaW5lCVZQUF9PRkYoKQlvdXRwKEMxX0EoMCksaW5wKEMxX0EoMCkpICYgfkNGR19QUk9HX0VOKQorCisjZGVmaW5lCURNQV9CVVNZKCkJKGlucHcoQ1NGX0EpICYgQ1NGX0JVU1lfRE1BKQorI2RlZmluZSBGSUZPX0JVU1koKQkoaW5wdyhDU0ZfQSkgJiBDU0ZfQlVTWV9GSUZPKQorI2RlZmluZQlETUFfRklGT19CVVNZKCkJKGlucHcoQ1NGX0EpICYgKENTRl9CVVNZX0RNQSB8IENTRl9CVVNZX0ZJRk8pKQorI2RlZmluZQlCVVNfQ0hFQ0soKQorCisjaWZkZWYgVU5JU1lTCisvKiBGb3IgVU5JU1lTIHVzZSBhbm90aGVyIG1hY3JvIHdpdGggZHJ2X3VzZWNld2FpdCBmdW5jdGlvbiAqLworI2RlZmluZSBDSEVDS19ETUEoKSB7dV9sb25nIGsgPSAxMDAwMDAwOyBcCisJCXdoaWxlIChrICYmIChETUFfQlVTWSgpKSkgeyBrLS07IGRydl91c2Vjd2FpdCgyMCk7IH0gXAorCQlpZiAoIWspIFNNVF9QQU5JQyhzbWMsSFdNX0UwMDAzLEhXTV9FMDAwM19NU0cpIDsgfQorI2Vsc2UKKyNkZWZpbmUgQ0hFQ0tfRE1BKCkge3VfbG9uZyBrID0gMTAwMDAwMCA7XAorCQl3aGlsZSAoayAmJiAoRE1BX0JVU1koKSkpIGstLSA7XAorCQlpZiAoIWspIFNNVF9QQU5JQyhzbWMsSFdNX0UwMDAzLEhXTV9FMDAwM19NU0cpIDsgfQorI2VuZGlmCisKKyNkZWZpbmUgQ0hFQ0tfRklGTygpIHt1X2xvbmcgayA9IDEwMDAwMDAgO1wKKwkJd2hpbGUgKGsgJiYgKEZJRk9fQlVTWSgpKSkgay0tIDtcCisJCWlmICghaykgU01UX1BBTklDKHNtYyxIV01fRTAwMTksSFdNX0UwMDE5X01TRykgOyB9CisKKyNkZWZpbmUgQ0hFQ0tfRE1BX0ZJRk8oKSB7dV9sb25nIGsgPSAxMDAwMDAwIDtcCisJCXdoaWxlIChrICYmIChETUFfRklGT19CVVNZKCkpKSBrLS0gO1wKKwkJaWYgKCFrKSBTTVRfUEFOSUMoc21jLEhXTV9FMDAwNCxIV01fRTAwMDRfTVNHKSA7IH0KKworI2RlZmluZQlHRVRfSVNSKCkJfmlucHcoSVNSX0EpCisjZGVmaW5lIENIRUNLX0lTUigpCX5pbnB3KElTUl9BKQorCisjaWZuZGVmIFVOSVgKKyNpZm5kZWYJV0lOTlQKKyNkZWZpbmUJQ0xJX0ZCSSgpCW91dHB3KENTUl9BLChpbnB3KENTUl9BKSZcCisJCQkoQ1NfQ1JFU0VUfENTX0JZUEFTUykpfENTX1JFU0VUX0ZJRk98c21jLT5ody5sZWQpCisjZWxzZQkvKiBXSU5OVCAqLworI2RlZmluZSBDTElfRkJJKCkJb3V0cHcoQ1NSX0EsKGxfaW5wdyhDU1JfQSkmXAorCQkJKENTX0NSRVNFVHxDU19CWVBBU1MpKXxDU19SRVNFVF9GSUZPfHNtYy0+aHcubGVkKQorI2VuZGlmCS8qIFdJTk5UICovCisjZWxzZQkvKiBVTklYICovCisjZGVmaW5lCUNMSV9GQkkoc21jKQlvdXRwdyhDU1JfQVMoc21jKSwoaW5wdyhDU1JfQVMoc21jKSkmXAorCQkJKENTX0NSRVNFVHxDU19CWVBBU1MpKXxDU19SRVNFVF9GSUZPfChzbWMpLT5ody5sZWQpCisjZW5kaWYKKworI2lmbmRlZiBVTklYCisjZGVmaW5lCVNUSV9GQkkoKQlvdXRwdyhDU1JfQSwoaW5wdyhDU1JfQSkmXAorCQkoQ1NfQ1JFU0VUfENTX0JZUEFTU3xDU19SRVNFVF9GSUZPKSl8Q1NfSU1TS3xzbWMtPmh3LmxlZCkKKyNlbHNlCisjZGVmaW5lCVNUSV9GQkkoc21jKQlvdXRwdyhDU1JfQVMoc21jKSwoaW5wdyhDU1JfQVMoc21jKSkmXAorCQkoQ1NfQ1JFU0VUfENTX0JZUEFTU3xDU19SRVNFVF9GSUZPKSl8Q1NfSU1TS3woc21jKS0+aHcubGVkKQorI2VuZGlmCisKKy8qIEVJU0EgRE1BIENvbnRyb2xsZXIgKi8KKyNkZWZpbmUgRE1BX1dSSVRFX1NJTkdMRV9NQVNLX0JJVF9NCTB4MGEJLyogTWFzdGVyIERNQSBDb250cm9sbGVyICovCisjZGVmaW5lIERNQV9XUklURV9TSU5HTEVfTUFTS19CSVRfUwkweGQ0CS8qIFNsYXZlIERNQSBDb250cm9sbGVyICovCisjZGVmaW5lIERNQV9DTEVBUl9CWVRFX1BPSU5URVJfTQkweDBjCisjZGVmaW5lIERNQV9DTEVBUl9CWVRFX1BPSU5URVJfUwkweGQ4CisKKyNlbmRpZgkvKiBFSVNBICovCisKKyNpZmRlZglNQ0EKKworLyoKKyAqIFBPUyBSZWdpc3RlcjoJICEhIGFsbCBJL08ncyBhcmUgOC1CaXQgISEKKyAqLworI2RlZmluZQlQT1NfU1lTX1NFVFVQCTB4OTQJLyogc3lzdGVtIHNldHVwIHJlZ2lzdGVyICovCisjZGVmaW5lCVBPU19TWVNURU0JMHhmZgkvKiBzeXN0ZW0gbW9kZSAqLworCisjZGVmaW5lCVBPU19DSEFOTkVMX1BPUwkweDk2CS8qIHJlZ2lzdGVyIHNsb3QgSUQgKi8KKyNkZWZpbmUJUE9TX0NIQU5ORUxfQklUCTB4MDgJLyogbWFzayBmb3IgLSItICovCisKKyNkZWZpbmUJUE9TX0JBU0UJMHgxMDAJLyogUE9TIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZQlQT1NfSURfTE9XCVBPU19CQVNFCS8qIGNhcmQgSUQgbG93ICovCisjZGVmaW5lCVBPU19JRF9ISUdICShQT1NfQkFTRSsxKQkvKiBjYXJkIElEIGhpZ2ggKi8KKyNkZWZpbmUJUE9TXzEwMgkJKFBPU19CQVNFKzIpCS8qIGNhcmQgZW4uLCBhcmJpdHJhdGlvbiBsZXZlbCAuLiAqLworI2RlZmluZQlQT1NfMTAzCQkoUE9TX0JBU0UrMykJLyogRlBST00gYWRkciwgcGFnZSAqLworI2RlZmluZQlQT1NfMTA0CQkoUE9TX0JBU0UrNCkJLyogSS9PLCBJUlEgKi8KKyNkZWZpbmUJUE9TXzEwNQkJKFBPU19CQVNFKzUpCS8qIFBPU19DSENLICovCisjZGVmaW5lCVBPU18xMDYJCShQT1NfQkFTRSs2KQkvKiB0byByZWFkIFZQRCAqLworI2RlZmluZQlQT1NfMTA3CQkoUE9TX0JBU0UrNykJLyogYWRkZWQgd2l0aG91dCBmdW5jdGlvbiAqLworCisvKiBGTTEgY2FyZCBJRHMgKi8KKyNkZWZpbmUJRk0xX0NBUkRfSUQwCTB4ODMKKyNkZWZpbmUJRk0xX0NBUkRfSUQxCTAKKworI2RlZmluZQlGTTFfSUJNX0lEMAkweDljCisjZGVmaW5lCUZNMV9JQk1fSUQxCTB4OGYKKworCisvKiBGTTIgY2FyZCBJRHMgKi8KKyNkZWZpbmUJRk0yX0NBUkRfSUQwCTB4YWIKKyNkZWZpbmUJRk0yX0NBUkRfSUQxCTAKKworI2RlZmluZQlGTTJfSUJNX0lEMAkweDdlCisjZGVmaW5lCUZNMl9JQk1fSUQxCTB4OGYKKworLyogQm9hcmQgcmV2aXNpb24uICovCisjZGVmaW5lIEZNMV9SRVYJCTAKKyNkZWZpbmUgRk0yX1JFVgkJMQorCisjZGVmaW5lCU1BWF9TTE9UCTgKKworLyoKKyAqIFBPU18xMDIKKyAqLworI2RlZmluZQlQT1NfQ0FSRF9FTgkweDAxCS8qIGNhcmQgZW5hYmxlID0xICovCisjZGVmaW5lCVBPU19TREFUX0VOCTB4MDIJLyogZW5hYmxlIDMyLWJpdCBzdHJlYW1pbmcgZGF0YSBtb2RlICovCisjZGVmaW5lCVBPU19FTl9DSEtJTlQJMHgwNAkvKiBlbmFibGUgaW50LiBmcm9tIGNoZWNrIGxpbmUgYXNzZXJ0ZWQgKi8KKyNkZWZpbmUJUE9TX0VOX0JVU19FUlIJMHgwOAkvKiBlbmFibGUgaW50LiBvbiBpbnZhbGlkIGJ1c21hc3RlciB0cmFuc2YuICovCisjZGVmaW5lCVBPU19GQUlSTkVTUwkweDEwCS8qIGZhaXJuZXMgb24gPTEgKi8KKy8qIGF0dGVudGlvbjogYXJiaXRyYXRpb24gbGV2ZWwgdXNlZCB3aXRoIGJpdCAwIFBPUyAxMDUgKi8KKyNkZWZpbmUJUE9TX0xBUkJJVAkweGUwCS8qIGFyYml0cmF0aW9uIGxldmVsCSgwLDAsMCktPmxldmVsID0gMHg4CisJCQkJCQkJKDEsMSwxKS0+bGV2ZWwgPSAweGYgKi8KKy8qCisgKiBQT1NfMTAzCisgKi8KKyNkZWZpbmUJUE9TX1BBR0UJMHgwNwkvKiBGUFJPTSBwYWdlIHNlbGVjdGlvbiAqLworI2RlZmluZQlQT1NfQk9PVF9FTgkweDA4CS8qIGJvb3QgUFJPTSBlbmFibGUgPTEgKi8KKyNkZWZpbmUJUE9TX01TRUwJMHg3MAkvKiBtZW1vcnkgc3RhcnQgYWRkcmVzcyBmb3IgRlBST00gbWFwcGluZyAqLworI2RlZmluZQlQUk9HX0VOCQkweDgwCS8qIEZNMTogVnBwIHByb2cgb24vb2ZmICovCisjZGVmaW5lCVBPU19TRFIJCTB4ODAJLyogRk0yOiBTdHJlYW1pbmcgZGF0YSBiaXQgKi8KKworLyoKKyAqIFBPU18xMDQKKyAqLworI2RlZmluZQlQT1NfSU9TRUwJMHgzZgkvKiBzZWxlY3RlZCBJL08gYmFzZSBhZGRyZXNzICovCisjZGVmaW5lCVBPU19JUlFTRUwJMHhjMAkvKiBzZWxlY3RlZCBpbnRlcnJ1cHQgKi8KKworLyoKKyAqIFBPU18xMDUKKyAqLworI2RlZmluZQlQT1NfQ0hDSwkweDgwCisjZGVmaW5lIFBPU19TWU5DX0VSUgkweDIwCS8qIEZNMjogc3luY2hyb25vdXMgZXJyb3IgcmVwb3J0aW5nCSovCisjZGVmaW5lIFBPU19QQVJfREFUQQkweDEwCS8qIEZNMjogZGF0YSBwYXJpdHkgZW5hYmxlIGJpdAkqLworI2RlZmluZSBQT1NfUEFSX0FERFIJMHgwOAkvKiBGTTI6IGFkZHJlc3MgcGFyaXR5IGVuYWJsZSBiaXQJKi8KKyNkZWZpbmUJUE9TX0lSUUhTRUwJMHgwMgkvKiBGTTI6IEhpZ2hlc3QgYml0IGZvciBJUlFfc2VsZWN0aW9uCSovCisjZGVmaW5lIFBPU19IQVJCSVQJMHgwMQkvKiBIaWdoZXN0IGJpdCBpbiBCdXMgYXJiaXRyYXRpb24gc2VsZWN0aW9uICovCisKKyNkZWZpbmUJU0FfTUFDCSgwKQkJLyogc3RhcnQgYWRkci4gTUFDX0FEIHdpdGhpbiB0aGUgUFJPTQkqLworI2RlZmluZQlQUkFfT0ZGCSgwKQorI2RlZmluZSBTQV9QTURfVFlQRQkoOCkJLyogc3RhcnQgYWRkci4gUE1ELVR5cGUJKi8KKworLyoKKyAqIGFkZHJlc3MgdHJhbnNtaXNzaW9uIGZyb20gbG9naWNhbCB0byBwaHlzaWNhbCBvZmZzZXQgYWRkcmVzcyBvbiBib2FyZAorICovCisjZGVmaW5lCUZNQShhKQkoMHgwMTAwfCgoYSk8PDEpKQkvKiBGT1JNQUMrIChyL3cpICovCisjZGVmaW5lCVAyKGEpCSgweDAwYzB8KChhKTw8MSkpCS8qIFBMQzIgKHIvdykgKERBUykgKi8KKyNkZWZpbmUJUDEoYSkJKDB4MDA4MHwoKGEpPDwxKSkJLyogUExDMSAoci93KSAqLworI2RlZmluZQlUSShhKQkoMHgwMDYwfCgoYSk8PDEpKQkvKiBUaW1lciAoci93KSAqLworI2RlZmluZQlQUihhKQkoMHgwMDQwfCgoYSk8PDEpKQkvKiBjb25maWd1cmF0aW9uIFBST00gKi8KKyNkZWZpbmUJQ1MoYSkJKDB4MDAyMHwgKGEpKQkJLyogY29udHJvbC9zdGF0dXMgKi8KKyNkZWZpbmUJRkYoYSkJKDB4MDAxMHwoKGEpPDwxKSkJLyogRklGTyBBU0lDICovCisjZGVmaW5lCUNUKGEpCSgweDAwMDB8KChhKTw8MSkpCS8qIGNvdW50ZXIgKi8KKworLyoKKyAqIGNvdW50ZXIKKyAqLworI2RlZmluZQlBQ0xBCUNUKDApCQkvKiBhZGRyZXNzIGNvdW50ZXIgbG93ICovCisjZGVmaW5lCUFDSEEJQ1QoMSkJCS8qIGFkZHJlc3MgY291bnRlciBoaWdoICovCisjZGVmaW5lCUJDTglDVCgyKQkJLyogYnl0ZSBjb3VudGVyICovCisjZGVmaW5lCU1VWAlDVCgzKQkJLyogTVVYLXJlZ2lzdGVyICovCisjZGVmaW5lCVdDTglDVCgweDA4KQkvKiB3b3JkIGNvdW50ZXIgKi8KKyNkZWZpbmUJRkZMRwlDVCgweDA5KQkvKiBGSUZPIEZsYWdzICovCisKKy8qCisgKiB0ZXN0L2NvbnRyb2wgcmVnaXN0ZXIgKEZNMiBvbmx5KQorICovCisjZGVmaW5lIENOVF9UU1QJMHgwMTgJCS8qIENvdW50ZXIgdGVzdCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIENOVF9TVFAgMHgwMWEJCS8qIENvdW50ZXIgdGVzdCBzdGVwIHJlZy4gKDggQml0KSAqLworCisvKgorICogQ1MgcmVnaXN0ZXIgKHJlYWQgb25seSkKKyAqLworI2RlZmluZQlDU1JBCUNTKDApCQkvKiBjb250cm9sL3N0YXR1cyByZWdpc3RlciBhZGRyZXNzICovCisjZGVmaW5lCUNTRkEJQ1MoMikJCS8qIGNvbnRyb2wvc3RhdHVzIEZJRk8gQlVTWSAuLi4JICovCisjZGVmaW5lCUlTUkEJQ1MoNCkJCS8qIGZpcnN0IGludC4gc291cmNlIHJlZ2lzdGVyIGFkZHJlc3MgKi8KKyNkZWZpbmUJSVNSMglDUyg2KQkJLyogc2Vjb25kIGludC4gc291cmNlIHJlZ2lzdGVyIGFkZHJlc3MgKi8KKyNkZWZpbmUJTEVEUglDUygweDBjKQkvKiBMRUQgcmVnaXN0ZXIgci93ICovCisjZGVmaW5lCUNTSUwJQ1MoMHgxMCkJLyogSS9PIG1hcHBlZCBQT1NfSURfbG93ICgxMDApICovCisjZGVmaW5lCUNTSUgJQ1MoMHgxMikJLyoJLSAiIC0gUE9TX0lEX0hJR0ggKDEwMSkgKi8KKyNkZWZpbmUJQ1NBCUNTKDB4MTQpCS8qCS0gIiAtIFBPU18xMDIgKi8KKyNkZWZpbmUJQ1NNCUNTKDB4MGUpCS8qCS0gIiAtIFBPU18xMDMgKi8KKyNkZWZpbmUJQ1NNX0ZNMQlDUygweDE2KQkvKgktICIgLSBQT1NfMTAzIChjb3B5IGluIEZNMSkgKi8KKyNkZWZpbmUJQ1NJCUNTKDB4MTgpCS8qCS0gIiAtIFBPU18xMDQgKi8KKyNkZWZpbmUJQ1NTCUNTKDB4MWEpCS8qCS0gIiAtIFBPU18xMDUgKi8KKyNkZWZpbmUJQ1NQXzA2CUNTKDB4MWMpCS8qCS0gIiAtIFBPU18xMDYgKi8KKyNkZWZpbmUJV0RPR19TVAkJMHgxYwkvKiBXYXRjaGRvZyBzdGF0dXMgKEZNMiBvbmx5KQkqLworI2RlZmluZQlXRE9HX0VOCQkweDFjCS8qIFdhdGNoZG9nIGVuYWJsaW5nIChGTTIgb25seSwgOEJpdCkJKi8KKyNkZWZpbmUJV0RPR19ESVMJMHgxZQkvKiBXYXRjaGRvZyBkaXNhYmxpbmcgKEZNMiBvbmx5LCA4Qml0KQkqLworCisjZGVmaW5lIFBHUkEJQ1NNCQkvKiBGbGFzaCBwYWdlIHJlZ2lzdGVyICovCisKKworI2RlZmluZQlXQ1RBCUZGKDApCQkvKiB3b3JkIGNvdW50ZXIgKi8KKyNkZWZpbmUJRkZMQUcJRkYoMSkJCS8qIEZMQUcvVl9GVUxMIChGSUZPIGFsbW9zdCBmdWxsLCB3cml0ZSBvbmx5KSovCisKKy8qCisgKiBUaW1lciByZWdpc3RlciAoRk0yIG9ubHkpCisgKi8KKyNkZWZpbmUgUlRNX0NOVAkJMHgyOAkJLyogUlRNIENvdW50ZXIgKi8KKyNkZWZpbmUgVElfRElWCQkweDYwCQkvKiBUaW1lciBQcmVzY2FsZXIgKi8KKyNkZWZpbmUgVElfQ0gxCQkweDYyCQkvKiBUaW1lciBjaGFubmVsIDEgY291bnRlciAqLworI2RlZmluZSBUSV9TVE9QCQkweDY0CQkvKiBTdG9wIHRpbWVyIG9uIGNoYW5uZWwgMSAqLworI2RlZmluZSBUSV9TVFJUCQkweDY2CQkvKiBTdGFydCB0aW1lciBvbiBjaGFubmVsIDEgKi8KKyNkZWZpbmUgVElfSU5JMgkJMHg2OAkJLyogVGltZXI6IEJ1cyBtYXN0ZXIgcHJlZW1wdGlvbiAqLworI2RlZmluZSBUSV9DTlQyCQkweDZhCQkvKiBUaW1lciAqLworI2RlZmluZSBUSV9JTkkzCQkweDZjCQkvKiBUaW1lcjogU3RyZWFtaW5nIGRhdGEgKi8KKyNkZWZpbmUgVElfQ05UMwkJMHg2ZQkJLyogVGltZXIgKi8KKyNkZWZpbmUgV0RPR19MTwkJMHg3MAkJLyogV2F0Y2hkb2cgY291bnRlciBsb3cgKi8KKyNkZWZpbmUgV0RPR19ISQkJMHg3MgkJLyogV2F0Y2hkb2cgY291bnRlciBoaWdoICovCisjZGVmaW5lIFJUTV9QUkUJCTB4NzQJCS8qIHJlc3RyLiB0b2tlbiBwcmVzY2FsZXIgKi8KKyNkZWZpbmUgUlRNX1RJTQkJMHg3NgkJLyogcmVzdHIuIHRva2VuIHRpbWVyICovCisKKy8qCisgKiBSZWNvbW1lbmRlZCBUaW1lb3V0IHZhbHVlcyAoZm9yIEZNMiB0aW1lciBvbmx5KQorICovCisjZGVmaW5lIFRPVVRfQk1fUFJFCTE4OAkJLyogMy43NiB1c2VjCSovCisjZGVmaW5lIFRPVVRfU19EQVQJMzc0CQkvKiA3LjQ4IHVzZWMJKi8KKworLyoKKyAqIENTIHJlZ2lzdGVyICh3cml0ZSBvbmx5KQorICovCisjZGVmaW5lCUhTUihwKQlDUygweDE4fChwKSkJLyogSG9zdCByZXF1ZXN0IHJlZ2lzdGVyICovCisKKyNkZWZpbmUJUlRNX1BVVAkJMHgzNgkJLyogcmVzdHIuIHRva2VuIGNvdW50ZXIgd3JpdGUgKi8KKyNkZWZpbmUJUlRNX0dFVAkJMHgyOAkJLyoJLSAiIC0JY2xlYXIgKi8KKyNkZWZpbmUJUlRNX0NMRUFSCTB4MzQJCS8qCS0gIiAtCXJlYWQgKi8KKworLyoKKyAqIEJDTglCaXQgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBCQ05fQlVTWQkweDgwMDAJCS8qIERNQSBCdXN5IGZsYWcgKi8KKyNkZWZpbmUgQkNOX0FaRVJPCTB4NDAwMAkJLyogQWxtb3N0IHplcm8gZmxhZyAoQkNOIDwgNCkgKi8KKyNkZWZpbmUgQkNOX1NUUkVBTQkweDIwMDAJCS8qIEFsbG93IHN0cmVhbWluZyBkYXRhIChCQ04gPj0gOCkgKi8KKworLyoKKyAqIFdDTglCaXQgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBXQ05fWkVSTwkweDIwMDAJCS8qIFplcm8gZmxhZyAoY291bnRlZCB0byB6ZXJvKSAqLworI2RlZmluZSBXQ05fQVpFUk8JMHgxMDAwCQkvKiBBbG1vc3QgemVybyBmbGFnIChCQ04gPCA0KSAqLworCisvKgorICogQ05UX1RTVAlCaXQgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBDTlRfTU9ERQkweDAxCQkvKiBHbyBpbnRvIHRlc3QgbW9kZSAqLworI2RlZmluZQlDTlRfRDMyCQkweDAyCQkvKiAxNi8zMiBCSVQgdGVzdCBtb2RlICovCisKKy8qCisgKiBGSUZPIEZsYWcJCUZJRk8gRmxhZ3MvVmZ1bGwgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBGRl9WRlVMTAkweDAwM2YJCS8qIFZfZnVsbCB2YWx1ZSBtYXNrICovCisjZGVmaW5lIEZGTEdfRlVMTAkweDIwMDAJCS8qIEZVTEwgZmxhZyAqLworI2RlZmluZSBGRkxHX0FfRlVMTAkweDEwMDAJCS8qIEFsbW9zdCBmdWxsIGZsYWcgKi8KKyNkZWZpbmUgRkZMR19WRlVMTAkweDA4MDAJCS8qIFZfZnVsbCBGbGFnICovCisjZGVmaW5lIEZGTEdfQV9FTVAJMHgwNDAwCQkvKiBhbG1vc3QgZW1wdHkgZmxhZyAqLworI2RlZmluZSBGRkxHX0VNUAkweDAyMDAJCS8qIGVtcHR5IGZsYWcgKi8KKyNkZWZpbmUgRkZMR19UX0VNUAkweDAxMDAJCS8qIHRvdGFsbHkgZW1wdHkgZmxhZyAqLworCisvKgorICogV0RPRwkJV2F0Y2hkb2cgc3RhdHVzIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgV0RPR19BTE0JMHgwMQkJLyogV2F0Y2hkb2cgYWxhcm0gQml0ICovCisjZGVmaW5lIFdET0dfQUNUCTB4MDIJCS8qIFdhdGNoZG9nIGFjdGl2ZSBCaXQgKi8KKworLyoKKyAqIENTKDApCUNPTlRST0xTCisgKi8KKyNkZWZpbmUJQ1NfQ1JFU0VUCTB4MDAwMQorI2RlZmluZQlGSUZPX1JTVAkweDAwMDIKKyNkZWZpbmUJQ1NfSU1TSwkJMHgwMDA0CisjZGVmaW5lCUVOX0lSUV9DSENLCTB4MDAwOAorI2RlZmluZQlFTl9JUlFfVE9LRU4JMHgwMDEwCisjZGVmaW5lCUVOX0lSUV9UQwkweDAwMjAKKyNkZWZpbmUJVE9LRU5fU1RBVFVTCTB4MDA0MAorI2RlZmluZQlSVE1fQ0hBTkdFCTB4MDA4MAorCisjZGVmaW5lCUNTX1NBUwkJMHgwMTAwCisjZGVmaW5lCUNTX0JZU1RBVAkweDAyMDAJLyogYnlwYXNzIGNvbm5lY3RlZCAoMD1jb25uLikgKi8KKyNkZWZpbmUJQ1NfQllQQVNTCTB4MDQwMAkvKiBieXBhc3Mgb24vb2ZmIGluZGljYXRpb24gKi8KKworLyoKKyAqIENTKDIpCUZJRk9TVEFUCisgKi8KKyNkZWZpbmUJSFNSRVEJCTB4MDAwNworI2RlZmluZQlCSUdESVIJCTB4MDAwOAorI2RlZmluZQlDU0ZfQlVTWV9GSUZPCTB4MDAxMAorI2RlZmluZQlDU0ZfQlVTWV9ETUEJMHgwMDIwCisjZGVmaW5lCVNMT1RfMzIJCTB4MDA0MAorCisjZGVmaW5lCUxFRF8wCQkweDAwMDEKKyNkZWZpbmUJTEVEXzEJCTB4MDAwMgorI2RlZmluZQlMRURfMgkJMHgwMTAwCisKKyNkZWZpbmUJTUFYX1BBR0VTCTgJCS8qIHBhZ2VzICovCisjZGVmaW5lCU1BWF9GQUREUgkweDQwMDAJCS8qIDE2SyBwZXIgcGFnZSAqLworCisvKgorICoJSVJRID0gSVNSQSB8fCBJU1IyIDsKKyAqCisgKglJU1JBID0gSVJRX09USF9FTiAmJiAoSVNfTEFOIHwgSVNfQlVTKSA7CisgKglJU1IyID0gSVJRX1RDX0VOICYmIElTX1RDIDsKKyAqCisgKglJU19MQU4gPSAoSVNfTUlOVFIxIHwgSVNfTUlOVFIyIHwgSVNfUExJTlQxIHwgSVNfUExJTlQyIHwgSVNfVElNSU5UKSB8fAorICoJCSAoSVJRX0VOX1RPS0VOICYmIElTX1RPS0VOKSA7CisgKglJU19CVVMgPSBJUlFfQ0hDS19FTiAmJiAoSVNfQlVTRVJSIHwgSVNfQ0hDS19MKSA7CisgKi8KKy8qCisgKglJU1JBCSEhISBhY3RpdiBoaWdoICEhIQorICovCisjZGVmaW5lCUlTX01JTlRSMQkweDAwMDEJCS8qIEZPUk1BQyBTVDFVL0wgJiB+SU1TSzFVL0wqLworI2RlZmluZQlJU19NSU5UUjIJMHgwMDAyCQkvKiBGT1JNQUMgU1QyVS9MICYgfklNU0syVS9MKi8KKyNkZWZpbmUJSVNfUExJTlQxCTB4MDAwNAkJLyogUExDMSAqLworI2RlZmluZQlJU19QTElOVDIJMHgwMDA4CQkvKiBQTEMyICovCisjZGVmaW5lCUlTX1RJTUlOVAkweDAwMTAJCS8qIFRpbWVyIDgyQzU0LTIgKi8KKyNkZWZpbmUJSVNfVE9LRU4JMHgwMDIwCQkvKiByZXN0cmljdGV0IHRva2VuIG1vbml0b3JpbmcgKi8KKyNkZWZpbmUJSVNfQ0hDS19MCTB4MDA0MAkJLyogY2hlY2sgbGluZSBhc3NlcnRlZCAqLworI2RlZmluZQlJU19CVVNFUlIJMHgwMDgwCQkvKiBidXMgZXJyb3IgKi8KKy8qCisgKglJU1IyCisgKi8KKyNkZWZpbmUJSVNfVEMJCTB4MDAwMQkJLyogdGVybWluYWwgY291bnQgaXJxICovCisjZGVmaW5lIElTX1NGREJLUlROCTB4MDAwMgkJLyogc2VsZWN0ZWQgZmVlZGJhY2sgcmV0dXJuICovCisjZGVmaW5lIElTX0QxNgkJMHgwMDA0CQkvKiBEUzE2ICovCisjZGVmaW5lCUlTX0QzMgkJMHgwMDA4CQkvKiBEUzMyICovCisjZGVmaW5lIElTX0RQRUkJCTB4MDAxMAkJLyogRGF0YSBQYXJpdHkgSW5kaWNhdGlvbiAqLworCisjZGVmaW5lCUFMTF9JUlNSCTB4MDBmZgorCisjZGVmaW5lCUZNX0EoYSkJQUREUihGTUEoYSkpCS8qIEZPUk1BQyBQbHVzIHBoeXNpY2FsIGFkZHIgKi8KKyNkZWZpbmUJUDFfQShhKQlBRERSKFAxKGEpKQkvKiBQTEMxIChyL3cpICovCisjZGVmaW5lCVAyX0EoYSkJQUREUihQMihhKSkJLyogUExDMiAoci93KSAoREFTKSAqLworI2RlZmluZQlUSV9BKGEpCUFERFIoVEkoYSkpCS8qIFRpbWVyIChyL3cpIEZNMSBvbmx5ISAqLworI2RlZmluZQlQUl9BKGEpCUFERFIoUFIoYSkpCS8qIGNvbmZpZy4gUFJPTSAqLworI2RlZmluZQlDU19BKGEpCUFERFIoQ1MoYSkpCS8qIGNvbnRyb2wvc3RhdHVzICovCisKKyNkZWZpbmUJSVNSMV9BCUFERFIoSVNSQSkJLyogZmlyc3QgaW50LiBzb3VyY2UgcmVnaXN0ZXIgYWRkcmVzcyAqLworI2RlZmluZQlJU1IyX0EJQUREUihJU1IyKQkvKiBzZWNvbmQJLSItCSAqLworI2RlZmluZQlDU1JfQQlBRERSKENTUkEpCS8qIGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyIGFkZHJlc3MgKi8KKyNkZWZpbmUJQ1NGX0EJQUREUihDU0ZBKQkvKiBjb250cm9sL3N0YXR1cyBGSUZPIEJVU1kgZmxhZ3MgKHIvdykgKi8KKworI2RlZmluZQlDU0lMX0EJQUREUihDU0lMKQkvKiBJL08gbWFwcGVkIFBPU19JRF9sb3cgKDEwMikgKi8KKyNkZWZpbmUJQ1NJSF9BCUFERFIoQ1NJSCkJLyoJLSAiIC0gUE9TX0lEX0hJR0ggKDEwMSkgKi8KKyNkZWZpbmUJQ1NBX0EJQUREUihDU0EpCS8qCS0gIiAtIFBPU18xMDIgKi8KKyNkZWZpbmUJQ1NJX0EJQUREUihDU0kpCS8qCS0gIiAtIFBPU18xMDQgKi8KKyNkZWZpbmUJQ1NNX0EJQUREUihDU00pCS8qCS0gIiAtIFBPU18xMDMgKi8KKyNkZWZpbmUJQ1NNX0ZNMV9BCUFERFIoQ1NNX0ZNMSkJLyoJLSAiIC0gUE9TXzEwMyAoMm5kIGNvcHksIEZNMSkgKi8KKyNkZWZpbmUJQ1NQXzA2X0EJQUREUihDU1BfMDYpCS8qCS0gIiAtIFBPU18xMDYgKi8KKworI2RlZmluZQlXQ1RfQQlBRERSKFdDVEEpCS8qIHdvcmQgY291bnRlciAoci93KSAqLworI2RlZmluZQlGRkxBR19BCUFERFIoRkZMQUcpCS8qIEZMQUcvVl9GVUxMIChGSUZPIGFsbW9zdCBmdWxsLCB3cml0ZSBvbmx5KSovCisKKyNkZWZpbmUJQUNMX0EJQUREUihBQ0xBKQkvKiBhZGRyZXNzIGNvdW50ZXIgbG93ICovCisjZGVmaW5lCUFDSF9BCUFERFIoQUNIQSkJLyogYWRkcmVzcyBjb3VudGVyIGhpZ2ggKi8KKyNkZWZpbmUJQkNOX0EJQUREUihCQ04pCS8qIGJ5dGUgY291bnRlciAqLworI2RlZmluZQlNVVhfQQlBRERSKE1VWCkJLyogTVVYLXJlZ2lzdGVyICovCisKKyNkZWZpbmUJSVNSX0EJQUREUihJU1JBKQkvKiBJbnRlcnJ1cHQgU291cmNlIFJlZ2lzdGVyICovCisjZGVmaW5lCUZJRk9fUkVTRVRfQQlBRERSKEZJRk9fUkVTRVQpCS8qIHJlc2V0IHRoZSBGSUZPICovCisjZGVmaW5lCUZJRk9fRU5fQQlBRERSKEZJRk9fRU4pCQkvKiBlbmFibGUgdGhlIEZJRk8gKi8KKworI2RlZmluZSBXRE9HX0VOX0EJQUREUihXRE9HX0VOKQkJLyogcmVzZXQgYW5kIHN0YXJ0IHRoZSBXRE9HICovCisjZGVmaW5lIFdET0dfRElTX0EJQUREUihXRE9HX0RJUykJCS8qIGRpc2FibGUgdGhlIFdET0cgKi8KKy8qCisgKiBhbGwgY29udHJvbCByZWcuIChyZWFkISkgYXJlIDggYml0IChleGNlcHQgUEFHRV9SR19BIGFuZCBMRURSX0EpCisgKi8KKyNkZWZpbmUJSFNSX0EocCkJQUREUihIU1IocCkpCS8qIEhvc3QgcmVxdWVzdCByZWdpc3RlciAqLworCisjZGVmaW5lCVNUQVRfQllQCTAJCS8qIGJ5cGFzcyBzdGF0aW9uICovCisjZGVmaW5lCVNUQVRfSU5TCTIJCS8qIGluc2VydCBzdGF0aW9uICovCisjZGVmaW5lCUJZUEFTUyhvKQlDUygweDEwfChvKSkJLyogbz1TVEFUX0JZUCB8fCBTVEFUX0lOUyAqLworCisjZGVmaW5lCUlSUV9UQ19FTglDUygweDBiKQkvKiBlbmFibGUvZGlzYWJsZSBJUlEgb24gVEMgKi8KKyNkZWZpbmUJSVJRX1RDX0RJUwlDUygweDBhKQorI2RlZmluZQlJUlFfVE9LRU5fRU4JQ1MoOSkJCS8qIGVuYWJsZS9kaXNhYmxlIElSUSBvbiByZXN0ci4gVG9rZW4gKi8KKyNkZWZpbmUJSVJRX1RPS0VOX0RJUwlDUyg4KQorI2RlZmluZQlJUlFfQ0hDS19FTglDUyg3KQkJLyoJLSItCUlSUSBhZnRlciBDSENLIGxpbmUgKi8KKyNkZWZpbmUJSVJRX0NIQ0tfRElTCUNTKDYpCisjZGVmaW5lCUlSUV9PVEhfRU4JQ1MoNSkJCS8qCS0iLQlvdGhlciBJUlEncyAqLworI2RlZmluZQlJUlFfT1RIX0RJUwlDUyg0KQorI2RlZmluZQlGSUZPX0VOCQlDUygzKQkJLyogZGlzYWJsZSAocmVzZXQpLCBlbmFibGUgRklGTyAqLworI2RlZmluZQlGSUZPX1JFU0VUCUNTKDIpCisjZGVmaW5lCUNBUkRfRU4JCUNTKDEpCQkvKiBkaXNhYmxlIChyZXNldCksIGVuYWJsZSBjYXJkICovCisjZGVmaW5lCUNBUkRfRElTCUNTKDApCisKKyNkZWZpbmUJTEVEUl9BCQlBRERSKExFRFIpCS8qIEQwPWdyZWVuLCBEMT15ZWxsb3csIEQ4PUwyICovCisjZGVmaW5lCVBBR0VfUkdfQQlBRERSKENTTSkJLyogRDwyLi4wPiAqLworI2RlZmluZQlJUlFfQ0hDS19FTl9BCUFERFIoSVJRX0NIQ0tfRU4pCisjZGVmaW5lIElSUV9DSENLX0RJU19BCUFERFIoSVJRX0NIQ0tfRElTKQorCisjZGVmaW5lCUdFVF9QQUdFKGJhbmspCW91dHB3KFBBR0VfUkdfQSwoaW5wdyhQQUdFX1JHX0EpICZcCisJCQkJKH5QT1NfUEFHRSkpIHwoaW50KSAoYmFuaykpCisjZGVmaW5lCVZQUF9PTigpCWlmIChzbWMtPmh3LnJldiA9PSBGTTFfUkVWKSB7CVwKKwkJCQlvdXRwdyhQQUdFX1JHX0EsCVwKKwkJCQkoaW5wdyhQQUdFX1JHX0EpICYgUE9TX1BBR0UpIHwgUFJPR19FTik7IFwKKwkJCX0KKyNkZWZpbmUJVlBQX09GRigpCWlmIChzbWMtPmh3LnJldiA9PSBGTTFfUkVWKSB7CVwKKwkJCQlvdXRwdyhQQUdFX1JHX0EsKGlucHcoUEFHRV9SR19BKSAmIFBPU19QQUdFKSk7IFwKKwkJCX0KKworI2RlZmluZQlTS0ZERElfUFNaCTE2CQkvKiBhZGRyZXNzIFBST00gc2l6ZSAqLworCisjZGVmaW5lCVJFQURfUFJPTShhKQkoKHVfY2hhcilpbnAoYSkpCisKKyNkZWZpbmUJR0VUX0lTUigpCX5pbnB3KElTUjFfQSkKKyNpZm5kZWYJVENJCisjZGVmaW5lCUNIRUNLX0lTUigpCX5pbnB3KElTUjFfQSkKKyNkZWZpbmUJQ0hFQ0tfSVNSX1NNUChpb3ApCX5pbnB3KChpb3ApK0lTUkEpCisjZWxzZQorI2RlZmluZQlDSEVDS19JU1IoKQkJKH5pbnB3KElTUjFfQSkgfCB+aW5wdyhJU1IyX0EpKQorI2RlZmluZQlDSEVDS19JU1JfU01QKGlvcCkJKH5pbnB3KChpb3ApK0lTUkEpIHwgfmlucHcoKGlvcCkrSVNSMikpCisjZW5kaWYKKworI2RlZmluZQlETUFfQlVTWSgpCShpbnB3KENTRl9BKSAmIENTRl9CVVNZX0RNQSkKKyNkZWZpbmUJRklGT19CVVNZKCkJKGlucHcoQ1NGX0EpICYgQ1NGX0JVU1lfRklGTykKKyNkZWZpbmUJRE1BX0ZJRk9fQlVTWSgpCShpbnB3KENTRl9BKSAmIChDU0ZfQlVTWV9ETUEgfCBDU0ZfQlVTWV9GSUZPKSkKKyNkZWZpbmUJQlVTX0NIRUNLKCkgewlpbnQgaSA7IFwKKwkJCWlmICgoaSA9IEdFVF9JU1IoKSkgJiBJU19CVVNFUlIpIFwKKwkJCQlTTVRfUEFOSUMoc21jLEhXTV9FMDAyMCxIV01fRTAwMjBfTVNHKSA7IFwKKwkJCWlmIChpICYgSVNfQ0hDS19MKSBcCisJCQkJU01UX1BBTklDKHNtYyxIV01fRTAwMTQsSFdNX0UwMDE0X01TRykgOyBcCisJCX0KKworI2RlZmluZQlDSEVDS19ETUEoKSB7CXVfbG9uZyBrID0gMTAwMDAgOyBcCisJCSB3aGlsZSAoayAmJiAoRE1BX0JVU1koKSkpIHsgXAorCQkJay0tIDsgXAorCQkJQlVTX0NIRUNLKCkgOyBcCisJCSB9IFwKKwkJIGlmICghaykgU01UX1BBTklDKHNtYyxIV01fRTAwMDMsSFdNX0UwMDAzX01TRykgOyB9CisKKyNkZWZpbmUJQ0hFQ0tfRklGTygpIHt1X2xvbmcgayA9IDEwMDAwMDAgO1wKKwkJIHdoaWxlIChrICYmIChGSUZPX0JVU1koKSkpIGstLSA7XAorCQkgaWYgKCFrKSBTTVRfUEFOSUMoc21jLEhXTV9FMDAxOSxIV01fRTAwMTlfTVNHKSA7IH0KKworI2RlZmluZQlDSEVDS19ETUFfRklGTygpIHt1X2xvbmcgayA9IDEwMDAwMDAgO1wKKwkJIHdoaWxlIChrICYmIChETUFfRklGT19CVVNZKCkpKSB7IFwKKwkJCWstLSA7XAorCQkJQlVTX0NIRUNLKCkgOyBcCisJCSB9IFwKKwkJIGlmICghaykgU01UX1BBTklDKHNtYyxIV01fRTAwMDQsSFdNX0UwMDA0X01TRykgOyB9CisKKyNpZm5kZWYgVU5JWAorI2RlZmluZQlDTElfRkJJKCkJb3V0cChBRERSKElSUV9PVEhfRElTKSwwKQorI2Vsc2UKKyNkZWZpbmUJQ0xJX0ZCSShzbWMpCW91dHAoQUREUlMoKHNtYyksSVJRX09USF9ESVMpLDApCisjZW5kaWYKKworI2lmbmRlZglUQ0kKKyNkZWZpbmUJQ0xJX0ZCSV9TTVAoaW9wKQlvdXRwKChpb3ApK0lSUV9PVEhfRElTLDApCisjZWxzZQorI2RlZmluZQlDTElfRkJJX1NNUChpb3ApCW91dHAoKGlvcCkrSVJRX09USF9ESVMsMCkgO1wKKwkJCQlvdXRwKChpb3ApK0lSUV9UQ19ESVMsMCkKKyNlbmRpZgorCisjaWZuZGVmIFVOSVgKKyNkZWZpbmUJU1RJX0ZCSSgpCW91dHAoQUREUihJUlFfT1RIX0VOKSwwKQorI2Vsc2UKKyNkZWZpbmUJU1RJX0ZCSShzbWMpCW91dHAoQUREUlMoKHNtYyksSVJRX09USF9FTiksMCkKKyNlbmRpZgorCisvKgorICogVGVybWluYWwgY291bnQgcHJpbWl0aXZlcworICovCisjZGVmaW5lIENMSV9UQ0koc21jKQlvdXRwKEFERFJTKChzbWMpLElSUV9UQ19ESVMpLDApCisjZGVmaW5lIFNUSV9UQ0koc21jKQlvdXRwKEFERFJTKChzbWMpLElSUV9UQ19FTiksMCkKKyNkZWZpbmUgQ0hFQ0tfVEMoc21jLGspCXsoaykgPSAxMDAwMCA7XAorCXdoaWxlICgoaykgJiYgKH5pbnB3KElTUjJfQSkgJiBJU19UQykpIChrKS0tIDtcCisJaWYgKCFrKSBTTVRfUEFOSUMoc21jLEhXTV9FMDAxOCxIV01fRTAwMThfTVNHKSA7IH0KKworI2VuZGlmCS8qIE1DQSAqLworCisjaWZkZWYJSVNBCisKKy8qCisgKiBhZGRyZXNzIHRyYW5zbWlzc2lvbiBmcm9tIGxvZ2ljIE5QQUREUjYtMCB0byBwaHlzaWNhbCBvZmZzZXQgYWRkcmVzcyBvbiBib2FyZAorICovCisjZGVmaW5lIEZNQShhKQkoMHg4MDAwfCgoKGEpJjB4MDcpPDwxKXwoKChhKSYweDc4KTw8NykpICAvKiBGT1JNQUMrIChyL3cpICovCisjZGVmaW5lIFBSQShhKQkoMHgxMDAwfCgoKGEpJjB4MDcpPDwxKXwoKChhKSYweDE4KTw8NykpICAvKiBQUk9NIChyZWFkIG9ubHkpKi8KKyNkZWZpbmUgUDFBKGEpCSgweDQwMDB8KCgoYSkmMHgwNyk8PDEpfCgoKGEpJjB4MTgpPDw3KSkgIC8qIFBMQzEgKHIvdykgKi8KKyNkZWZpbmUgUDJBKGEpCSgweDUwMDB8KCgoYSkmMHgwNyk8PDEpfCgoKGEpJjB4MTgpPDw3KSkgIC8qIFBMQzIgKHIvdykgKi8KKyNkZWZpbmUgVElBKGEpCSgweDYwMDB8KCgoYSkmMHgwMyk8PDEpKQkJICAvKiBUaW1lciAoci93KSAqLworCisjZGVmaW5lCUlTUkEJMHgwMDAwCQkvKiBpbnQuIHNvdXJjZSByZWdpc3RlciBhZGRyZXNzIChyZWFkIG9ubHkpICovCisjZGVmaW5lCUFDTEEJMHgwMDAwCQkvKiBhZGRyZXNzIGNvdW50ZXIgbG93IGFkZHJlc3MgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lCUFDSEEJMHgwMDAyCQkvKiBhZGRyZXNzIGNvdW50ZXIgaGlnaCBhZGRyZXNzICh3cml0ZSBvbmx5KSAqLworI2RlZmluZQlUUkNBCTB4MDAwNAkJLyogdHJhbnNmZXIgY291bnRlciBhZGRyZXNzICh3cml0ZSBvbmx5KSAqLworI2RlZmluZQlQR1JBCTB4MDAwNgkJLyogcGFnZSByZWdpc3RlciBhZGRyZXNzICh3cml0ZSBvbmx5KSAqLworI2RlZmluZSBSUUFBCTB4MjAwMAkJLyogUmVxdWVzdCByZWcuICh3cml0ZSBvbmx5KSAqLworI2RlZmluZQlDU1JBCTB4MzAwMAkJLyogY29udHJvbC9zdGF0dXMgcmVnaXN0ZXIgYWRkcmVzcyAoci93KSAqLworCisvKgorICogcGh5c2ljYWwgYWRkcmVzcyBvZmZzZXQgKyBJTy1Qb3J0IGJhc2UgYWRkcmVzcworICovCisjZGVmaW5lIEZNX0EoYSkJKEZNQShhKStzbWMtPmh3LmlvcCkJLyogRk9STUFDIFBsdXMgcGh5c2ljYWwgYWRkciAqLworI2RlZmluZSBQUl9BKGEpCShQUkEoYSkrc21jLT5ody5pb3ApCS8qIFBST00gKHJlYWQgb25seSkqLworI2RlZmluZSBQMV9BKGEpCShQMUEoYSkrc21jLT5ody5pb3ApCS8qIFBMQzEgKHIvdykgKi8KKyNkZWZpbmUgUDJfQShhKQkoUDJBKGEpK3NtYy0+aHcuaW9wKQkvKiBQTEMyIChyL3cpICovCisjZGVmaW5lIFRJX0EoYSkJKFRJQShhKStzbWMtPmh3LmlvcCkJLyogVGltZXIgKHIvdykgKi8KKworI2RlZmluZQlJU1JfQQkoMHgwMDAwK3NtYy0+aHcuaW9wKSAvKiBpbnQuIHNvdXJjZSByZWdpc3RlciBhZGRyZXNzIChyZWFkIG9ubHkpICovCisjZGVmaW5lCUFDTF9BCSgweDAwMDArc21jLT5ody5pb3ApIC8qIGFkZHJlc3MgY291bnRlciBsb3cgYWRkcmVzcyAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUJQUNIX0EJKDB4MDAwMitzbWMtPmh3LmlvcCkgLyogYWRkcmVzcyBjb3VudGVyIGhpZ2ggYWRkcmVzcyAod3JpdGUgb25seSkqLworI2RlZmluZQlUUkNfQQkoMHgwMDA0K3NtYy0+aHcuaW9wKSAvKiB0cmFuc2ZlciBjb3VudGVyIGFkZHJlc3MgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lCVBHUl9BCSgweDAwMDYrc21jLT5ody5pb3ApIC8qIHBhZ2UgcmVnaXN0ZXIgYWRkcmVzcyAod3JpdGUgb25seSkgKi8KKyNkZWZpbmUgUlFBX0EJKDB4MjAwMCtzbWMtPmh3LmlvcCkgLyogUmVxdWVzdCByZWcuICh3cml0ZSBvbmx5KSAqLworI2RlZmluZQlDU1JfQQkoMHgzMDAwK3NtYy0+aHcuaW9wKSAvKiBjb250cm9sL3N0YXR1cyByZWdpc3RlciBhZGRyZXNzIChyL3cpICovCisjaWZkZWYgVU5JWAorI2RlZmluZQlDU1JfQVMoc21jKSAoMHgzMDAwKyhzbWMpLT5ody5pb3ApIC8qIGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyIGFkZHJlc3MgKi8KKyNlbmRpZgorI2RlZmluZQlQTEMxX0kJKDB4MzQwMCtzbWMtPmh3LmlvcCkgLyogY2xlYXIgUExDMSBpbnRlcnJ1cHQgYml0ICovCisjZGVmaW5lCVBMQzJfSQkoMHgzODAwK3NtYy0+aHcuaW9wKSAvKiBjbGVhciBQTEMyIGludGVycnVwdCBiaXQgKi8KKworI2lmbmRlZglNVUxUX09FTQorI2lmbmRlZglPRU1fQ09OQ0VQVAorI2RlZmluZQlTS0xPR09fU1RSCSJTS0ZEREkiCisjZWxzZQkvKiBPRU1fQ09OQ0VQVCAqLworI2RlZmluZQlTS0xPR09fU1RSCU9FTV9GRERJX0xPR08KKyNlbmRpZgkvKiBPRU1fQ09OQ0VQVCAqLworI2VuZGlmICAvKiBNVUxUX09FTSAqLworI2RlZmluZQlTQUREUkwJKDI0KQkJLyogc3RhcnQgYWRkcmVzcyBTS0xPR08gKi8KKyNkZWZpbmUJU0FfTUFDCSgwKQkJLyogc3RhcnQgYWRkci4gTUFDX0FEIHdpdGhpbiB0aGUgUFJPTSAqLworI2RlZmluZQlQUkFfT0ZGCSgwKQorI2RlZmluZSBTQV9QTURfVFlQRQkoOCkJLyogc3RhcnQgYWRkci4gUE1ELVR5cGUgKi8KKworI2RlZmluZQlDRElECShQUkEoU0FERFJMKSkJLyogQ2FyZCBJRCBpbnQvTyBwb3J0IGFkZHIuIG9mZnNldCAqLworI2RlZmluZQlORVhUX0NESUQJKChQUkEoU0FERFJMKzEpKSAtIENESUQpCisKKyNkZWZpbmUJU0tGRERJX1BTWgkzMgkJLyogYWRkcmVzcyBQUk9NIHNpemUgKi8KKworI2RlZmluZQlSRUFEX1BST00oYSkJKCh1X2NoYXIpaW5wdyhhKSkKKyNkZWZpbmUJR0VUX1BBR0UoaSkJb3V0cHcoUEdSX0EsKGludCkoaSkpCisKKyNkZWZpbmUJTUFYX1BBR0VTCTE2CQkvKiAxNiBwYWdlcyAqLworI2RlZmluZQlNQVhfRkFERFIJMHgyMDAwCQkvKiA4SyBwZXIgcGFnZSAqLworI2RlZmluZQlWUFBfT0ZGKCkJb3V0cHcoQ1NSX0EsKGlucHcoQ1NSX0EpICYgKENTX0NSRVNFVHxDU19CWVBBU1MpKSkKKyNkZWZpbmUJVlBQX09OKCkJb3V0cHcoQ1NSX0EsKGlucHcoQ1NSX0EpICYgKENTX0NSRVNFVHxDU19CWVBBU1MpKSB8IFwKKwkJCQlDU19WUFBTVykKKworLyoKKyAqIGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyIENTUkEJYml0cyAobG9nLiBhZGRyOiAweDMwMDApCisgKi8KKy8qIHdyaXRlICovCisjZGVmaW5lIENTX0NSRVNFVAkweDAxCQkvKiBDYXJkIHJlc2V0ICgwPXJlc2V0KSAqLworI2RlZmluZQlDU19JTVNLCQkweDAyCQkvKiBlbmFibGUgSVJRICgxPWVuYWJsZSwgMD1kaXNhYmxlKSAqLworI2RlZmluZSBDU19SRVNJTlQxCTB4MDQJCS8qIFBMSU5UMSByZXNldCAqLworI2RlZmluZQlDU19WUFBTVwkweDEwCQkvKiAxMlYgcG93ZXIgc3dpdGNoICgwPW9mZiwgMT1vbikgKi8KKyNkZWZpbmUgQ1NfQllQQVNTCTB4MjAJCS8qIGJ5cGFzcyBzd2l0Y2ggKDA9cmVtb3ZlLCAxPWluc2VydCkqLworI2RlZmluZSBDU19SRVNJTlQyCTB4NDAJCS8qIFBMSU5UMiByZXNldCAqLworLyogcmVhZCAqLworI2RlZmluZQlDU19CVVNZCQkweDA0CQkvKiBtYXN0ZXIgdHJhbnNmZXIgYWN0aXYgKD0xKSAqLworI2RlZmluZQlDU19TV19FUFJPTQkweDA4CQkvKiAwPUFwcGxpY2F0aW9uIFNvZnQuIDE9Qk9PVC1FUFJPTSAqLworI2RlZmluZQlDU19CWVNUQVQJMHg0MAkJLyogMD1CeXBhc3MgZXhpc3QsIDE9IC4ubm90ICovCisjZGVmaW5lCUNTX1NBUwkJMHg4MAkJLyogc2luZ2xlIGF0dGFjaGVtZW50IHN0YXRpb24gKD0xKSAqLworCisvKgorICogSW50ZXJydXB0IHNvdXJjZSByZWdpc3RlciBJU1JBIChsb2cuIGFkZHI6IDB4MDAwMCkgcmVhZCBvbmx5ICYgbG93IGFjdGl2LgorICovCisjZGVmaW5lIElTX01JTlRSMQkweDAxCQkvKiBGT1JNQUMgU1QxVS9MICYmIH5JTVNLMVUvTCovCisjZGVmaW5lIElTX01JTlRSMgkweDAyCQkvKiBGT1JNQUMgU1QyVS9MICYmIH5JTVNLMlUvTCovCisjZGVmaW5lIElTX1BMSU5UMQkweDA0CQkvKiBQTEMxICovCisjZGVmaW5lIElTX1BMSU5UMgkweDA4CQkvKiBQTEMyICovCisjZGVmaW5lIElTX1RJTUlOVAkweDEwCQkvKiBUaW1lciA4MkM1NC0yICovCisKKyNkZWZpbmUJQUxMX0lSU1IJKElTX01JTlRSMXxJU19NSU5UUjJ8SVNfUExJTlQxfElTX1BMSU5UMnxJU19USU1JTlQpCisKKyNkZWZpbmUJRlBST01fU1coKQkoaW5wdyhDU1JfQSkmQ1NfU1dfRVBST00pCisjZGVmaW5lCURNQV9CVVNZKCkJKGlucHcoQ1NSX0EpJkNTX0JVU1kpCisjZGVmaW5lIENIRUNLX0ZJRk8oKQorI2RlZmluZQlCVVNfQ0hFQ0soKQorCisvKgorICogc2V0IEhvc3QgUmVxdWVzdCByZWdpc3RlciAod3IuKQorICovCisjZGVmaW5lIFNFVF9IUlEocXVwKQlvdXRwdyhSUUFfQSsoKHF1cCk8PDEpLDApCisKKyNpZm5kZWYgVU5JWAorI2lmbmRlZiBXSU5OVAorI2RlZmluZQlDTElfRkJJKCkJb3V0cHcoQ1NSX0EsKGlucHcoQ1NSX0EpJihDU19DUkVTRVR8Q1NfQllQQVNTfENTX1ZQUFNXKSkpCisjZWxzZQorI2RlZmluZQlDTElfRkJJKCkJb3V0cHcoQ1NSX0EsKGxfaW5wdyhDU1JfQSkgJiBcCisJCQkJKENTX0NSRVNFVHxDU19CWVBBU1N8Q1NfVlBQU1cpKSkKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUJQ0xJX0ZCSShzbWMpCW91dHB3KENTUl9BUyhzbWMpLChpbnB3KENTUl9BUyhzbWMpKSYgXAorCQkJCQkJKENTX0NSRVNFVHxDU19CWVBBU1N8Q1NfVlBQU1cpKSkKKyNlbmRpZgorCisjaWZuZGVmIFVOSVgKKyNkZWZpbmUJU1RJX0ZCSSgpCW91dHB3KENTUl9BLChpbnB3KENTUl9BKSAmIFwKKwkJCQkoQ1NfQ1JFU0VUfENTX0JZUEFTU3xDU19WUFBTVykpIHwgQ1NfSU1TSykKKyNlbHNlCisjZGVmaW5lCVNUSV9GQkkoc21jKQlvdXRwdyhDU1JfQVMoc21jKSwoaW5wdyhDU1JfQVMoc21jKSkgJiBcCisJCQkJKENTX0NSRVNFVHxDU19CWVBBU1N8Q1NfVlBQU1cpKSB8IENTX0lNU0spCisjZW5kaWYKKworI2RlZmluZSBDSEVDS19ETUEoKQl7dW5zaWduZWQgayA9IDEwMDAwIDtcCisJCQl3aGlsZSAoayAmJiAoRE1BX0JVU1koKSkpIGstLSA7XAorCQkJaWYgKCFrKSBTTVRfUEFOSUMoc21jLEhXTV9FMDAwMyxIV01fRTAwMDNfTVNHKSA7IH0KKworI2RlZmluZQlHRVRfSVNSKCkJfmlucHcoSVNSX0EpCisKKyNlbmRpZgkvKiBJU0EgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYJUENJCisKKy8qCisgKgkoRFYpCT0gb25seSBkZWZpbmVkIGZvciBEYSBWaW5jaQorICoJKE1MKQk9IG9ubHkgZGVmaW5lZCBmb3IgTW9uYWxpc2EKKyAqLworCisvKgorICogQ29uZmlndXJhdGlvbiBTcGFjZSBoZWFkZXIKKyAqLworI2RlZmluZQlQQ0lfVkVORE9SX0lECTB4MDAJLyogMTYgYml0CVZlbmRvciBJRCAqLworI2RlZmluZQlQQ0lfREVWSUNFX0lECTB4MDIJLyogMTYgYml0CURldmljZSBJRCAqLworI2RlZmluZQlQQ0lfQ09NTUFORAkweDA0CS8qIDE2IGJpdAlDb21tYW5kICovCisjZGVmaW5lCVBDSV9TVEFUVVMJMHgwNgkvKiAxNiBiaXQJU3RhdHVzICovCisjZGVmaW5lCVBDSV9SRVZfSUQJMHgwOAkvKiAgOCBiaXQJUmV2aXNpb24gSUQgKi8KKyNkZWZpbmUJUENJX0NMQVNTX0NPREUJMHgwOQkvKiAyNCBiaXQJQ2xhc3MgQ29kZSAqLworI2RlZmluZQlQQ0lfQ0FDSEVfTFNaCTB4MGMJLyogIDggYml0CUNhY2hlIExpbmUgU2l6ZSAqLworI2RlZmluZQlQQ0lfTEFUX1RJTQkweDBkCS8qICA4IGJpdAlMYXRlbmN5IFRpbWVyICovCisjZGVmaW5lCVBDSV9IRUFERVJfVAkweDBlCS8qICA4IGJpdAlIZWFkZXIgVHlwZSAqLworI2RlZmluZQlQQ0lfQklTVAkweDBmCS8qICA4IGJpdAlCdWlsdC1pbiBzZWxmdGVzdCAqLworI2RlZmluZQlQQ0lfQkFTRV8xU1QJMHgxMAkvKiAzMiBiaXQJMXN0IEJhc2UgYWRkcmVzcyAqLworI2RlZmluZQlQQ0lfQkFTRV8yTkQJMHgxNAkvKiAzMiBiaXQJMm5kIEJhc2UgYWRkcmVzcyAqLworLyogQnl0ZSAxOC4uMmI6CVJlc2VydmVkICovCisjZGVmaW5lCVBDSV9TVUJfVklECTB4MmMJLyogMTYgYml0CVN1YnN5c3RlbSBWZW5kb3IgSUQgKi8KKyNkZWZpbmUJUENJX1NVQl9JRAkweDJlCS8qIDE2IGJpdAlTdWJzeXN0ZW0gSUQgKi8KKyNkZWZpbmUJUENJX0JBU0VfUk9NCTB4MzAJLyogMzIgYml0CUV4cGFuc2lvbiBST00gQmFzZSBBZGRyZXNzICovCisvKiBCeXRlIDM0Li4zMzoJUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUENJX0NBUF9QVFIJMHgzNAkvKiAgOCBiaXQgKE1MKQlDYXBhYmlsaXRpZXMgUHRyICovCisvKiBCeXRlIDM1Li4zYjoJUmVzZXJ2ZWQgKi8KKyNkZWZpbmUJUENJX0lSUV9MSU5FCTB4M2MJLyogIDggYml0CUludGVycnVwdCBMaW5lICovCisjZGVmaW5lCVBDSV9JUlFfUElOCTB4M2QJLyogIDggYml0CUludGVycnVwdCBQaW4gKi8KKyNkZWZpbmUJUENJX01JTl9HTlQJMHgzZQkvKiAgOCBiaXQJTWluX0dudCAqLworI2RlZmluZQlQQ0lfTUFYX0xBVAkweDNmCS8qICA4IGJpdAlNYXhfTGF0ICovCisvKiBEZXZpY2UgRGVwZW5kZW50IFJlZ2lvbiAqLworI2RlZmluZQlQQ0lfT1VSX1JFRwkweDQwCS8qIDMyIGJpdCAoRFYpCU91ciBSZWdpc3RlciAqLworI2RlZmluZQlQQ0lfT1VSX1JFR18xCTB4NDAJLyogMzIgYml0IChNTCkJT3VyIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUJUENJX09VUl9SRUdfMgkweDQ0CS8qIDMyIGJpdCAoTUwpCU91ciBSZWdpc3RlciAyICovCisvKiBQb3dlciBNYW5hZ2VtZW50IFJlZ2lvbiAqLworI2RlZmluZSBQQ0lfUE1fQ0FQX0lECTB4NDgJLyogIDggYml0IChNTCkJUG93ZXIgTWFuYWdlbWVudCBDYXAuIElEICovCisjZGVmaW5lIFBDSV9QTV9OSVRFTQkweDQ5CS8qICA4IGJpdCAoTUwpCU5leHQgSXRlbSBQdHIgKi8KKyNkZWZpbmUgUENJX1BNX0NBUF9SRUcJMHg0YQkvKiAxNiBiaXQgKE1MKQlQb3dlciBNYW5hZ2VtZW50IENhcGFiaWxpdGllcyAqLworI2RlZmluZSBQQ0lfUE1fQ1RMX1NUUwkweDRjCS8qIDE2IGJpdCAoTUwpCVBvd2VyIE1hbmFnLiBDb250cm9sL1N0YXR1cyAqLworLyogQnl0ZSAweDRlOglSZXNlcnZlZCAqLworI2RlZmluZSBQQ0lfUE1fREFUX1JFRwkweDRmCS8qICA4IGJpdCAoTUwpCVBvd2VyIE1hbmFnLiBEYXRhIFJlZ2lzdGVyICovCisvKiBWUEQgUmVnaW9uICovCisjZGVmaW5lCVBDSV9WUERfQ0FQX0lECTB4NTAJLyogIDggYml0IChNTCkJVlBEIENhcC4gSUQgKi8KKyNkZWZpbmUgUENJX1ZQRF9OSVRFTQkweDUxCS8qICA4IGJpdCAoTUwpCU5leHQgSXRlbSBQdHIgKi8KKyNkZWZpbmUgUENJX1ZQRF9BRFJfUkVHCTB4NTIJLyogMTYgYml0IChNTCkJVlBEIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX1ZQRF9EQVRfUkVHCTB4NTQJLyogMzIgYml0IChNTCkJVlBEIERhdGEgUmVnaXN0ZXIgKi8KKy8qIEJ5dGUgNTguLmZmOglSZXNlcnZlZCAqLworCisvKgorICogSTJDIEFkZHJlc3MgKFBDSSBDb25maWcpCisgKgorICogTm90ZTogVGhlIHRlbXBlcmF0dXJlIGFuZCB2b2x0YWdlIHNlbnNvcnMgYXJlIHJlbG9jYXRlZCBvbiBhIGRpZmZlcmVudAorICoJIEkyQyBidXMuCisgKi8KKyNkZWZpbmUgSTJDX0FERFJfVlBECTB4QTAJLyogSTJDIGFkZHJlc3MgZm9yIHRoZSBWUEQgRUVQUk9NICovIAorCisvKgorICogRGVmaW5lIEJpdHMgYW5kIFZhbHVlcyBvZiB0aGUgcmVnaXN0ZXJzCisgKi8KKy8qCVBDSV9WRU5ET1JfSUQJMTYgYml0CVZlbmRvciBJRCAqLworLyoJUENJX0RFVklDRV9JRAkxNiBiaXQJRGV2aWNlIElEICovCisvKiBWYWx1ZXMgZm9yIFZlbmRvciBJRCBhbmQgRGV2aWNlIElEIHNoYWxsIGJlIHBhdGNoZWQgaW50byB0aGUgY29kZSAqLworLyoJUENJX0NPTU1BTkQJMTYgYml0CUNvbW1hbmQgKi8KKyNkZWZpbmUJUENJX0ZCVEVOCTB4MDIwMAkvKiBCaXQgOToJRmFzdCBCYWNrLVRvLUJhY2sgZW5hYmxlICovCisjZGVmaW5lCVBDSV9TRVJSRU4JMHgwMTAwCS8qIEJpdCA4OglTRVJSIGVuYWJsZSAqLworI2RlZmluZQlQQ0lfQURTVEVQCTB4MDA4MAkvKiBCaXQgNzoJQWRkcmVzcyBTdGVwcGluZyAqLworI2RlZmluZQlQQ0lfUEVSUkVOCTB4MDA0MAkvKiBCaXQgNjoJUGFyaXR5IFJlcG9ydCBSZXNwb25zZSBlbmFibGUgKi8KKyNkZWZpbmUJUENJX1ZHQV9TTk9PUAkweDAwMjAJLyogQml0IDU6CVZHQSBwYWxldHRlIHNub29wICovCisjZGVmaW5lCVBDSV9NV0lFTgkweDAwMTAJLyogQml0IDQ6CU1lbW9yeSB3cml0ZSBhbiBpbnYgY3ljbCBlbmEgKi8KKyNkZWZpbmUJUENJX1NDWUNFTgkweDAwMDgJLyogQml0IDM6CVNwZWNpYWwgQ3ljbGUgZW5hYmxlICovCisjZGVmaW5lCVBDSV9CTUVOCTB4MDAwNAkvKiBCaXQgMjoJQnVzIE1hc3RlciBlbmFibGUgKi8KKyNkZWZpbmUJUENJX01FTUVOCTB4MDAwMgkvKiBCaXQgMToJTWVtb3J5IFNwYWNlIEFjY2VzcyBlbmFibGUgKi8KKyNkZWZpbmUJUENJX0lPRU4JMHgwMDAxCS8qIEJpdCAwOglJTyBTcGFjZSBBY2Nlc3MgZW5hYmxlICovCisKKy8qCVBDSV9TVEFUVVMJMTYgYml0CVN0YXR1cyAqLworI2RlZmluZQlQQ0lfUEVSUgkweDgwMDAJLyogQml0IDE1OglQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUJUENJX1NFUlIJMHg0MDAwCS8qIEJpdCAxNDoJU2lnbmFsZWQgU0VSUiAqLworI2RlZmluZQlQQ0lfUk1BQk9SVAkweDIwMDAJLyogQml0IDEzOglSZWNlaXZlZCBNYXN0ZXIgQWJvcnQgKi8KKyNkZWZpbmUJUENJX1JUQUJPUlQJMHgxMDAwCS8qIEJpdCAxMjoJUmVjZWl2ZWQgVGFyZ2V0IEFib3J0ICovCisjZGVmaW5lCVBDSV9TVEFCT1JUCTB4MDgwMAkvKiBCaXQgMTE6CVNlbnQgVGFyZ2V0IEFib3J0ICovCisjZGVmaW5lCVBDSV9ERVZTRUwJMHgwNjAwCS8qIEJpdCAxMC4uOToJREVWU0VMIFRpbWluZyAqLworI2RlZmluZQlQQ0lfREVWX0ZBU1QJKDA8PDkpCS8qCQlmYXN0ICovCisjZGVmaW5lCVBDSV9ERVZfTUVESVVNCSgxPDw5KQkvKgkJbWVkaXVtICovCisjZGVmaW5lCVBDSV9ERVZfU0xPVwkoMjw8OSkJLyoJCXNsb3cgKi8KKyNkZWZpbmUJUENJX0RBVEFQRVJSCTB4MDEwMAkvKiBCaXQgODoJREFUQSBQYXJpdHkgZXJyb3IgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUJUENJX0ZCMkJDQVAJMHgwMDgwCS8qIEJpdCA3OglGYXN0IEJhY2stdG8tQmFjayBDYXBhYmlsaXR5ICovCisjZGVmaW5lCVBDSV9VREYJCTB4MDA0MAkvKiBCaXQgNjoJVXNlciBEZWZpbmVkIEZlYXR1cmVzICovCisjZGVmaW5lIFBDSV82Nk1IWkNBUAkweDAwMjAJLyogQml0IDU6CTY2IE1IeiBQQ0kgYnVzIGNsb2NrIGNhcGFibGUgKi8KKyNkZWZpbmUgUENJX05FV0NBUAkweDAwMTAJLyogQml0IDQ6CU5ldyBjYXAuIGxpc3QgaW1wbGVtZW50ZWQgKi8KKworI2RlZmluZSBQQ0lfRVJSQklUUwkoUENJX1BFUlJ8UENJX1NFUlJ8UENJX1JNQUJPUlR8UENJX1NUQUJPUlR8UENJX0RBVEFQRVJSKQorCisvKglQQ0lfUkVWX0lECTggYml0CVJldmlzaW9uIElEICovCisvKglQQ0lfQ0xBU1NfQ09ERQkyNCBiaXQJQ2xhc3MgQ29kZSAqLworLyoJQnl0ZSAyOgkJQmFzZSBDbGFzcwkJKDAyKSAqLworLyoJQnl0ZSAxOgkJU3ViQ2xhc3MJCSgwMikgKi8KKy8qCUJ5dGUgMDoJCVByb2dyYW1taW5nIEludGVyZmFjZQkoMDApICovCisKKy8qCVBDSV9DQUNIRV9MU1oJOCBiaXQJQ2FjaGUgTGluZSBTaXplICovCisvKglQb3NzaWJsZSB2YWx1ZXM6IDAsMiw0LDgsMTYJKi8KKworLyoJUENJX0xBVF9USU0JOCBiaXQJTGF0ZW5jeSBUaW1lciAqLworCisvKglQQ0lfSEVBREVSX1QJOCBiaXQJSGVhZGVyIFR5cGUgKi8KKyNkZWZpbmUJUENJX0hEX01GX0RFVgkweDgwCS8qIEJpdCA3OgkwPSBzaW5nbGUsIDE9IG11bHRpLWZ1bmMgZGV2ICovCisjZGVmaW5lCVBDSV9IRF9UWVBFCTB4N2YJLyogQml0IDYuLjA6CUhlYWRlciBMYXlvdXQgMD0gbm9ybWFsICovCisKKy8qCVBDSV9CSVNUCTggYml0CUJ1aWx0LWluIHNlbGZ0ZXN0ICovCisjZGVmaW5lCVBDSV9CSVNUX0NBUAkweDgwCS8qIEJpdCA3OglCSVNUIENhcGFibGUgKi8KKyNkZWZpbmUJUENJX0JJU1RfU1QJMHg0MAkvKiBCaXQgNjoJU3RhcnQgQklTVCAqLworI2RlZmluZQlQQ0lfQklTVF9SRVQJMHgwZgkvKiBCaXQgMy4uMDoJQ29tcGxldGlvbiBDb2RlICovCisKKy8qCVBDSV9CQVNFXzFTVAkzMiBiaXQJMXN0IEJhc2UgYWRkcmVzcyAqLworI2RlZmluZQlQQ0lfTUVNU0laRQkweDgwMEwgICAgICAgLyogdXNlIDIga0IgTWVtb3J5IEJhc2UgKi8KKyNkZWZpbmUJUENJX01FTUJBU0VfQklUUyAweGZmZmZmODAwTCAvKiBCaXQgMzEuLjExOglNZW1vcnkgQmFzZSBBZGRyZXNzICovCisjZGVmaW5lCVBDSV9NRU1TSVpFX0JJSVMgMHgwMDAwMDdmMEwgLyogQml0IDEwLi40OglNZW1vcnkgU2l6ZSBSZXEuICovCisjZGVmaW5lCVBDSV9QUkVGRU4JMHgwMDAwMDAwOEwgIC8qIEJpdCAzOgkJUHJlZmV0Y2hhYmxlICovCisjZGVmaW5lCVBDSV9NRU1fVFlQCTB4MDAwMDAwMDZMICAvKiBCaXQgMi4uMToJTWVtb3J5IFR5cGUgKi8KKyNkZWZpbmUJUENJX01FTTMyQklUCSgwPDwxKQkgICAgIC8qIEJhc2UgYWRkciBhbnl3aGVyZSBpbiAzMiBCaXQgcmFuZ2UgKi8KKyNkZWZpbmUJUENJX01FTTFNCSgxPDwxKQkgICAgIC8qIEJhc2UgYWRkciBiZWxvdyAxIE1lZ2FCeXRlICovCisjZGVmaW5lCVBDSV9NRU02NEJJVAkoMjw8MSkJICAgICAvKiBCYXNlIGFkZHIgYW55d2hlcmUgaW4gNjQgQml0IHJhbmdlICovCisjZGVmaW5lCVBDSV9NRU1TUEFDRQkweDAwMDAwMDAxTCAgLyogQml0IDA6CU1lbW9yeSBTcGFjZSBJbmRpYy4gKi8KKworLyoJUENJX0JBU0VfMk5ECTMyIGJpdAkybmQgQmFzZSBhZGRyZXNzICovCisjZGVmaW5lCVBDSV9JT0JBU0UJMHhmZmZmZmYwMEwgIC8qIEJpdCAzMS4uODogIEkvTyBCYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUJUENJX0lPU0laRQkweDAwMDAwMGZjTCAgLyogQml0IDcuLjI6ICAgSS9PIFNpemUgUmVxdWlyZW1lbnRzICovCisjZGVmaW5lCVBDSV9JT1NQQUNFCTB4MDAwMDAwMDFMICAvKiBCaXQgMDoJICAgIEkvTyBTcGFjZSBJbmRpY2F0b3IgKi8KKworLyoJUENJX1NVQl9WSUQJMTYgYml0CVN1YnN5c3RlbSBWZW5kb3IgSUQgKi8KKy8qCVBDSV9TVUJfSUQJMTYgYml0CVN1YnN5c3RlbSBJRCAqLworCisvKglQQ0lfQkFTRV9ST00JMzIgYml0CUV4cGFuc2lvbiBST00gQmFzZSBBZGRyZXNzICovCisjZGVmaW5lCVBDSV9ST01CQVNFCTB4ZmZmZTAwMDBMICAvKiBCaXQgMzEuLjE3OiBST00gQkFTRSBhZGRyZXNzICgxc3QpICovCisjZGVmaW5lCVBDSV9ST01CQVNaCTB4MDAwMWMwMDBMICAvKiBCaXQgMTYuLjE0OiBUcmVhdCBhcyBCQVNFIG9yIFNJWkUgKi8KKyNkZWZpbmUJUENJX1JPTVNJWkUJMHgwMDAwMzgwMEwgIC8qIEJpdCAxMy4uMTE6IFJPTSBTaXplIFJlcXVpcmVtZW50cyAqLworI2RlZmluZQlQQ0lfUk9NRU4JMHgwMDAwMDAwMUwgIC8qIEJpdCAwOgkgICAgQWRkcmVzcyBEZWNvZGUgZW5hYmxlICovCisKKy8qCVBDSV9DQVBfUFRSCTggYml0CU5ldyBDYXBhYmlsaXRpZXMgUG9pbnRlcnMgKi8KKy8qCVBDSV9JUlFfTElORQk4IGJpdAlJbnRlcnJ1cHQgTGluZSAqLworLyoJUENJX0lSUV9QSU4JOCBiaXQJSW50ZXJydXB0IFBpbiAqLworLyoJUENJX01JTl9HTlQJOCBiaXQJTWluX0dudCAqLworLyoJUENJX01BWF9MQVQJOCBiaXQJTWF4X0xhdCAqLworLyogRGV2aWNlIERlcGVuZGVudCBSZWdpb24gKi8KKy8qCVBDSV9PVVJfUkVHCShEVikJMzIgYml0CU91ciBSZWdpc3RlciAqLworLyoJUENJX09VUl9SRUdfMQkoTUwpCTMyIGJpdAlPdXIgUmVnaXN0ZXIgMSAqLworCQkJCSAgLyoJIEJpdCAzMS4uMjk6CXJlc2VydmVkICovCisjZGVmaW5lCVBDSV9QQVRDSF9ESVIJKDNMPDwyNykgIC8qKERWKSBCaXQgMjguLjI3OglFeHQgUGF0Y2hzIGRpcmVjdGlvbiAqLworI2RlZmluZSBQQ0lfUEFUQ0hfRElSXzAJKDFMPDwyNykgIC8qKERWKSBUeXBlIG9mIHRoZSBwaW5zIEVYVF9QQVRDSFM8MS4uMD4gICAqLworI2RlZmluZSBQQ0lfUEFUQ0hfRElSXzEgKDFMPDwyOCkgIC8qCSAgIDAgPSBpbnB1dAkJCSAgICAgKi8KKwkJCQkgIC8qCSAgIDEgPSBvdXRwdXQJCQkgICAgICovCisjZGVmaW5lCVBDSV9FWFRfUEFUQ0hTCSgzTDw8MjUpICAvKihEVikgQml0IDI2Li4yNToJRXh0ZW5kZWQgUGF0Y2hlcyAgICAgKi8KKyNkZWZpbmUgUENJX0VYVF9QQVRDSF8wICgxTDw8MjUpICAvKihEVikJCQkJICAgICAqLworI2RlZmluZSBQQ0lfRVhUX1BBVENIXzEgKDFMPDwyNikgIC8qCSBDTEsgZm9yIE1pY3JvV2lyZSAoTUwpCQkgICAgICovCisjZGVmaW5lIFBDSV9WSU8JCSgxTDw8MjUpICAvKihNTCkJCQkJICAgICAqLworI2RlZmluZQlQQ0lfRU5fQk9PVAkoMUw8PDI0KSAgLyoJIEJpdCAyNDoJRW5hYmxlIEJPT1QgdmlhIFJPTSAgKi8KKwkJCQkgIC8qCSAgIDEgPSBEb24ndCBib290IHdpdGggUk9NCSAgICAgKi8KKwkJCQkgIC8qCSAgIDAgPSBCb290IHdpdGggUk9NCQkgICAgICovCisjZGVmaW5lCVBDSV9FTl9JTwkoMUw8PDIzKSAgLyoJIEJpdCAyMzoJTWFwcGluZyB0byBJTyBzcGFjZSAgKi8KKyNkZWZpbmUJUENJX0VOX0ZQUk9NCSgxTDw8MjIpICAvKgkgQml0IDIyOglGTEFTSCBtYXBwZWQgdG8gbWVtPyAqLworCQkJCSAgLyoJICAgMSA9IE1hcCBGbGFzaCB0byBNZW1vcnkJICAgICAqLworCQkJICAJICAvKgkgICAwID0gRGlzYWJsZSBhbGwgYWRkci4gZGVjb2RpbmcgICAgKi8KKyNkZWZpbmUJUENJX1BBR0VTSVpFCSgzTDw8MjApICAvKgkgQml0IDIxLi4yMDoJRkxBU0ggUGFnZSBTaXplCSAgICAgKi8KKyNkZWZpbmUJUENJX1BBR0VfMTYJKDBMPDwyMCkgIC8qCQkxNiBrIHBhZ2VzCQkgICAgICovCisjZGVmaW5lCVBDSV9QQUdFXzMySwkoMUw8PDIwKSAgLyoJCTMyIGsgcGFnZXMJCSAgICAgKi8KKyNkZWZpbmUJUENJX1BBR0VfNjRLCSgyTDw8MjApICAvKgkJNjQgayBwYWdlcwkJICAgICAqLworI2RlZmluZQlQQ0lfUEFHRV8xMjhLCSgzTDw8MjApICAvKgkJMTI4IGsgcGFnZXMJCSAgICAgKi8KKwkJCQkgIC8qCSBCaXQgMTk6IHJlc2VydmVkIChNTCkgYW5kIChEVikJICAgICAqLworI2RlZmluZQlQQ0lfUEFHRVJFRwkoN0w8PDE2KSAgLyoJIEJpdCAxOC4uMTY6CVBhZ2UgUmVnaXN0ZXIJICAgICAqLworCQkJCSAgLyoJIEJpdCAxNToJcmVzZXJ2ZWQJICAgICAqLworI2RlZmluZQlQQ0lfRk9SQ0VfQkUJKDFMPDwxNCkgIC8qCSBCaXQgMTQ6CUFzc2VydCBhbGwgQkVzIG9uIE1SICovCisjZGVmaW5lCVBDSV9ESVNfTVJMCSgxTDw8MTMpICAvKgkgQml0IDEzOglEaXNhYmxlIE1lbSBSIExpbmUgICAqLworI2RlZmluZQlQQ0lfRElTX01STQkoMUw8PDEyKSAgLyoJIEJpdCAxMjoJRGlzYWJsZSBNZW0gUiBtdWx0aXAgKi8KKyNkZWZpbmUJUENJX0RJU19NV0kJKDFMPDwxMSkgIC8qCSBCaXQgMTE6CURpc2FibGUgTWVtIFcgJiBpbnYgICovCisjZGVmaW5lCVBDSV9ESVNDX0NMUwkoMUw8PDEwKSAgLyoJIEJpdCAxMDoJRGlzYzogY2FjaGVMc3ogYm91bmQgKi8KKyNkZWZpbmUJUENJX0JVUlNUX0RJUwkoMUw8PDkpCSAgLyoJIEJpdCAgOToJQnVyc3QgRGlzYWJsZQkgICAgICovCisjZGVmaW5lCVBDSV9CWVRFX1NXQVAJKDFMPDw4KQkgIC8qKERWKSBCaXQgIDg6CUJ5dGUgU3dhcCBpbiBEQVRBICAgICovCisjZGVmaW5lCVBDSV9TS0VXX0RBUwkoMHhmTDw8NCkgLyoJIEJpdCA3Li40OglTa2V3IEN0cmwsIERBUyBFeHQgICAqLworI2RlZmluZQlQQ0lfU0tFV19CQVNFCSgweGZMPDwwKSAvKgkgQml0IDMuLjA6CVNrZXcgQ3RybCwgQmFzZQkgICAgICovCisKKy8qCVBDSV9PVVJfUkVHXzIJKE1MKQkzMiBiaXQJT3VyIFJlZ2lzdGVyIDIgKE1vbmFsaXNhIG9ubHkpICovCisjZGVmaW5lIFBDSV9WUERfV1JfVEgJKDB4ZmZMPDwyNCkJLyogQml0IDI0Li4zMQlWUEQgV3JpdGUgVGhyZXNob2xkICAqLworI2RlZmluZQlQQ0lfREVWX1NFTAkoMHg3Zkw8PDE3KQkvKiBCaXQgMTcuLjIzCUVFUFJPTSBEZXZpY2UgU2VsZWN0ICovCisjZGVmaW5lCVBDSV9WUERfUk9NX1NaCSg3TDw8MTQpCS8qIEJpdCAxNC4uMTYJVlBEIFJPTSBTaXplCSAgICAgKi8KKwkJCQkJLyogQml0IDEyLi4xMwlyZXNlcnZlZAkgICAgICovCisjZGVmaW5lCVBDSV9QQVRDSF9ESVIyCSgweGZMPDw4KQkvKiBCaXQgIDguLjExCUV4dCBQYXRjaHMgZGlyIDIuLjUgICovCisjZGVmaW5lCVBDSV9QQVRDSF9ESVJfMgkoMUw8PDgpCQkvKiBCaXQgIDgJQ1MgZm9yIE1pY3JvV2lyZSAgICAgKi8KKyNkZWZpbmUJUENJX1BBVENIX0RJUl8zCSgxTDw8OSkKKyNkZWZpbmUJUENJX1BBVENIX0RJUl80CSgxTDw8MTApCisjZGVmaW5lCVBDSV9QQVRDSF9ESVJfNQkoMUw8PDExKQorI2RlZmluZSBQQ0lfRVhUX1BBVENIUzIgKDB4Zkw8PDQpCS8qIEJpdCAgNC4uNwlFeHRlbmRlZCBQYXRjaGVzICAgICAqLworI2RlZmluZQlQQ0lfRVhUX1BBVENIXzIJKDFMPDw0KQkJLyogQml0ICA0CUNTIGZvciBNaWNyb1dpcmUgICAgICovCisjZGVmaW5lCVBDSV9FWFRfUEFUQ0hfMwkoMUw8PDUpCisjZGVmaW5lCVBDSV9FWFRfUEFUQ0hfNAkoMUw8PDYpCisjZGVmaW5lCVBDSV9FWFRfUEFUQ0hfNQkoMUw8PDcpCisjZGVmaW5lCVBDSV9FTl9EVU1NWV9SRAkoMUw8PDMpCQkvKiBCaXQgIDMJRW5hYmxlIER1bW15IFJlYWQgICAgKi8KKyNkZWZpbmUgUENJX1JFVl9ERVNDCSgxTDw8MikJCS8qIEJpdCAgMglSZXZlcnNlIERlc2MuIEJ5dGVzICAqLworI2RlZmluZSBQQ0lfVVNFQUREUjY0CSgxTDw8MSkJCS8qIEJpdCAgMQlVc2UgNjQgQml0IEFkZHJlc3NlICAqLworI2RlZmluZSBQQ0lfVVNFREFUQTY0CSgxTDw8MCkJCS8qIEJpdCAgMAlVc2UgNjQgQml0IERhdGEgYnVzIGV4dCovCisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgUmVnaW9uICovCisvKglQQ0lfUE1fQ0FQX0lECQkgOCBiaXQgKE1MKQlQb3dlciBNYW5hZ2VtZW50IENhcC4gSUQgKi8KKy8qCVBDSV9QTV9OSVRFTQkJIDggYml0IChNTCkJTmV4dCBJdGVtIFB0ciAqLworLyoJUENJX1BNX0NBUF9SRUcJCTE2IGJpdCAoTUwpCVBvd2VyIE1hbmFnZW1lbnQgQ2FwYWJpbGl0aWVzKi8KKyNkZWZpbmUJUENJX1BNRV9TVVAJKDB4MWY8PDExKQkvKiBCaXQgMTEuLjE1CVBNIE1hbmFnLiBFdmVudCBTdXBwb3J0Ki8KKyNkZWZpbmUgUENJX1BNX0QyX1NVQgkoMTw8MTApCQkvKiBCaXQgMTAJRDIgU3VwcG9ydCBCaXQJICAgICAqLworI2RlZmluZSBQQ0lfUE1fRDFfU1VCCSgxPDw5KQkJLyogQml0IDkJRDEgU3VwcG9ydCBCaXQgICAgICAgKi8KKwkJCQkJLyogQml0IDYuLjggcmVzZXJ2ZWQJCSAgICAgKi8KKyNkZWZpbmUgUENJX1BNX0RTSQkoMTw8NSkJCS8qIEJpdCA1CURldmljZSBTcGVjaWZpYyBJbml0LiovCisjZGVmaW5lIFBDSV9QTV9BUFMJKDE8PDQpCQkvKiBCaXQgNAlBdXhpYWxpYXJ5IFBvd2VyIFNyYyAqLworI2RlZmluZSBQQ0lfUE1FX0NMT0NLCSgxPDwzKQkJLyogQml0IDMJUE0gRXZlbnQgQ2xvY2sgICAgICAgKi8KKyNkZWZpbmUgUENJX1BNX1ZFUgkoNzw8MCkJCS8qIEJpdCAwLi4yCVBNIFBDSSBTcGVjLiB2ZXJzaW9uICovCisKKy8qCVBDSV9QTV9DVExfU1RTCQkxNiBiaXQgKE1MKQlQb3dlciBNYW5hZy4gQ29udHJvbC9TdGF0dXMgICovCisjZGVmaW5lCVBDSV9QTUVfU1RBVFVTCSgxPDwxNSkJCS8qIEJpdCAxNSAJUEZBIGRvZXNuJ3Qgc3VwLiBQTUUjKi8KKyNkZWZpbmUgUENJX1BNX0RBVF9TQ0wJKDM8PDEzKQkJLyogQml0IDEzLi4xNAlkYXQgcmVnIFNjYWxpbmcgZmFjdG9yICovCisjZGVmaW5lIFBDSV9QTV9EQVRfU0VMCSgweGY8PDkpCS8qIEJpdCAgOS4uMTIJUE0gZGF0YSBzZWxlY3RvciBmaWVsZCAqLworCQkJCQkvKiBCaXQgIDcuLiAyCXJlc2VydmVkCSAgICAgKi8KKyNkZWZpbmUgUENJX1BNX1NUQVRFCSgzPDwwKQkJLyogQml0ICAwLi4gMQlQb3dlciBNYW5hZ2VtZW50IFN0YXRlICovCisjZGVmaW5lIFBDSV9QTV9TVEFURV9EMAkoMDw8MCkJCS8qIEQwOglPcGVyYXRpb25hbCAoZGVmYXVsdCkgKi8KKyNkZWZpbmUJUENJX1BNX1NUQVRFX0QxCSgxPDwwKQkJLyogRDE6CW5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgUENJX1BNX1NUQVRFX0QyCSgyPDwwKQkJLyogRDI6CW5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgUENJX1BNX1NUQVRFX0QzICgzPDwwKQkJLyogRDM6CUhPVCwgUG93ZXIgRG93biBhbmQgUmVzZXQgKi8KKworLyoJUENJX1BNX0RBVF9SRUcJCSA4IGJpdCAoTUwpCVBvd2VyIE1hbmFnLiBEYXRhIFJlZ2lzdGVyICovCisvKiBWUEQgUmVnaW9uICovCisvKglQQ0lfVlBEX0NBUF9JRAkJIDggYml0IChNTCkJVlBEIENhcC4gSUQgKi8KKy8qCVBDSV9WUERfTklURU0JCSA4IGJpdCAoTUwpCU5leHQgSXRlbSBQdHIgKi8KKy8qCVBDSV9WUERfQURSX1JFRwkJMTYgYml0IChNTCkJVlBEIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJUENJX1ZQRF9GTEFHCSgxPDwxNSkJCS8qIEJpdCAxNQlzdGFydHMgVlBEIHJkL3dkIGN5Y2xlKi8KKworLyoJUENJX1ZQRF9EQVRfUkVHCQkzMiBiaXQgKE1MKQlWUEQgRGF0YSBSZWdpc3RlciAqLworCisvKgorICoJQ29udHJvbCBSZWdpc3RlciBGaWxlOgorICoJQmFuayAwCisgKi8KKyNkZWZpbmUJQjBfUkFQCQkweDAwMDAJLyogIDggYml0IHJlZ2lzdGVyIGFkZHJlc3MgcG9ydCAqLworCS8qIDB4MDAwMSAtIDB4MDAwMzoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUJQjBfQ1RSTAkJMHgwMDA0CS8qICA4IGJpdCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lCUIwX0RBUwkJMHgwMDA1CS8qICA4IEJpdCBjb250cm9sIHJlZ2lzdGVyIChEQVMpICovCisjZGVmaW5lCUIwX0xFRAkJMHgwMDA2CS8qICA4IEJpdCBMRUQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJQjBfVFNUX0NUUkwJMHgwMDA3CS8qICA4IGJpdCB0ZXN0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJQjBfSVNSQwkJMHgwMDA4CS8qIDMyIGJpdCBJbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyICovCisjZGVmaW5lCUIwX0lNU0sJCTB4MDAwYwkvKiAzMiBiaXQgSW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKi8KKworLyogMHgwMDEwIC0gMHgwMDZiOglmb3JtYWMrIChzdXBlcm5ldF8zKSBmZXF1ZW50bHkgdXNlZCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQjBfQ01EUkVHMQkweDAwMTAJLyogd3JpdGUgY29tbWFuZCByZWcgMSBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBCMF9DTURSRUcyCTB4MDAxNAkvKiB3cml0ZSBjb21tYW5kIHJlZyAyIGluc3RydWN0aW9uICovCisjZGVmaW5lIEIwX1NUMVUJCTB4MDAxMAkvKiByZWFkIHVwcGVyIDE2LWJpdCBvZiBzdGF0dXMgcmVnIDEgKi8KKyNkZWZpbmUgQjBfU1QxTAkJMHgwMDE0CS8qIHJlYWQgbG93ZXIgMTYtYml0IG9mIHN0YXR1cyByZWcgMSAqLworI2RlZmluZSBCMF9TVDJVCQkweDAwMTgJLyogcmVhZCB1cHBlciAxNi1iaXQgb2Ygc3RhdHVzIHJlZyAyICovCisjZGVmaW5lIEIwX1NUMkwJCTB4MDAxYwkvKiByZWFkIGxvd2VyIDE2LWJpdCBvZiBzdGF0dXMgcmVnIDIgKi8KKworI2RlZmluZSBCMF9NQVJSCQkweDAwMjAJLyogci93IHRoZSBtZW1vcnkgcmVhZCBhZGRyIHJlZ2lzdGVyICovCisjZGVmaW5lIEIwX01BUlcJCTB4MDAyNAkvKiByL3cgdGhlIG1lbW9yeSB3cml0ZSBhZGRyIHJlZ2lzdGVyKi8KKyNkZWZpbmUgQjBfTURSVQkJMHgwMDI4CS8qIHIvdyB1cHBlciAxNi1iaXQgb2YgbWVtLiBkYXRhIHJlZyAqLworI2RlZmluZSBCMF9NRFJMCQkweDAwMmMJLyogci93IGxvd2VyIDE2LWJpdCBvZiBtZW0uIGRhdGEgcmVnICovCisKKyNkZWZpbmUJQjBfTURSRUczCTB4MDAzMAkvKiByL3cgTW9kZSBSZWdpc3RlciAzICovCisjZGVmaW5lCUIwX1NUM1UJCTB4MDAzNAkvKiByZWFkIHVwcGVyIDE2LWJpdCBvZiBzdGF0dXMgcmVnIDMgKi8KKyNkZWZpbmUJQjBfU1QzTAkJMHgwMDM4CS8qIHJlYWQgbG93ZXIgMTYtYml0IG9mIHN0YXR1cyByZWcgMyAqLworI2RlZmluZQlCMF9JTVNLM1UJMHgwMDNjCS8qIHIvdyB1cHBlciAxNi1iaXQgb2YgSU1TSyByZWcgMyAqLworI2RlZmluZQlCMF9JTVNLM0wJMHgwMDQwCS8qIHIvdyBsb3dlciAxNi1iaXQgb2YgSU1TSyByZWcgMyAqLworI2RlZmluZQlCMF9JVlIJCTB4MDA0NAkvKiByZWFkIEludGVycnVwdCBWZWN0b3IgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJQjBfSU1SCQkweDAwNDgJLyogci93IEludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCisvKiAweDRjCUhpZGRlbiAqLworCisjZGVmaW5lIEIwX0NOVFJMX0EJMHgwMDUwCS8qIGNvbnRyb2wgcmVnaXN0ZXIgQSAoci93KSAqLworI2RlZmluZSBCMF9DTlRSTF9CCTB4MDA1NAkvKiBjb250cm9sIHJlZ2lzdGVyIEIgKHIvdykgKi8KKyNkZWZpbmUgQjBfSU5UUl9NQVNLCTB4MDA1OAkvKiBpbnRlcnJ1cHQgbWFzayAoci93KSAqLworI2RlZmluZSBCMF9YTUlUX1ZFQ1RPUgkweDAwNWMJLyogdHJhbnNtaXQgdmVjdG9yIHJlZ2lzdGVyIChyL3cpICovCisKKyNkZWZpbmUgQjBfU1RBVFVTX0EJMHgwMDYwCS8qIHN0YXR1cyByZWdpc3RlciBBIChyZWFkIG9ubHkpICovCisjZGVmaW5lIEIwX1NUQVRVU19CCTB4MDA2NAkvKiBzdGF0dXMgcmVnaXN0ZXIgQiAocmVhZCBvbmx5KSAqLworI2RlZmluZSBCMF9DTlRSTF9DCTB4MDA2OAkvKiBjb250cm9sIHJlZ2lzdGVyIEMgKHIvdykgKi8KKyNkZWZpbmUJQjBfTURSRUcxCTB4MDA2YwkvKiByL3cgTW9kZSBSZWdpc3RlciAxICovCisKKyNkZWZpbmUJQjBfUjFfQ1NSCTB4MDA3MAkvKiAzMiBiaXQgQk1VIGNvbnRyb2wvc3RhdHVzIHJlZyAocmVjIHEgMSkgKi8KKyNkZWZpbmUJQjBfUjJfQ1NSCTB4MDA3NAkvKiAzMiBiaXQgQk1VIGNvbnRyb2wvc3RhdHVzIHJlZyAocmVjIHEgMikoRFYpKi8KKyNkZWZpbmUJQjBfWEFfQ1NSCTB4MDA3OAkvKiAzMiBiaXQgQk1VIGNvbnRyb2wvc3RhdHVzIHJlZyAoYSB4bWl0IHEpICovCisjZGVmaW5lCUIwX1hTX0NTUgkweDAwN2MJLyogMzIgYml0IEJNVSBjb250cm9sL3N0YXR1cyByZWcgKHMgeG1pdCBxKSAqLworCisvKgorICoJQmFuayAxCisgKgktIGNvbXBsZXRlbHkgZW1wdHkgKHRoaXMgaXMgdGhlIFJBUCBCbG9jayB3aW5kb3cpCisgKglOb3RlOiBpZiBSQVAgPSAxIHRoaXMgcGFnZSBpcyByZXNlcnZlZAorICovCisKKy8qCisgKglCYW5rIDIKKyAqLworI2RlZmluZQlCMl9NQUNfMAkweDAxMDAJLyogIDggYml0IE1BQyBhZGRyZXNzIEJ5dGUgMCAqLworI2RlZmluZQlCMl9NQUNfMQkweDAxMDEJLyogIDggYml0IE1BQyBhZGRyZXNzIEJ5dGUgMSAqLworI2RlZmluZQlCMl9NQUNfMgkweDAxMDIJLyogIDggYml0IE1BQyBhZGRyZXNzIEJ5dGUgMiAqLworI2RlZmluZQlCMl9NQUNfMwkweDAxMDMJLyogIDggYml0IE1BQyBhZGRyZXNzIEJ5dGUgMyAqLworI2RlZmluZQlCMl9NQUNfNAkweDAxMDQJLyogIDggYml0IE1BQyBhZGRyZXNzIEJ5dGUgNCAqLworI2RlZmluZQlCMl9NQUNfNQkweDAxMDUJLyogIDggYml0IE1BQyBhZGRyZXNzIEJ5dGUgNSAqLworI2RlZmluZQlCMl9NQUNfNgkweDAxMDYJLyogIDggYml0IE1BQyBhZGRyZXNzIEJ5dGUgNiAoPT0gMCkgKERWKSAqLworI2RlZmluZQlCMl9NQUNfNwkweDAxMDcJLyogIDggYml0IE1BQyBhZGRyZXNzIEJ5dGUgNyAoPT0gMCkgKERWKSAqLworCisjZGVmaW5lIEIyX0NPTk5fVFlQCTB4MDEwOAkvKiAgOCBiaXQgQ29ubmVjdG9yIHR5cGUgKi8KKyNkZWZpbmUgQjJfUE1EX1RZUAkweDAxMDkJLyogIDggYml0IFBNRCB0eXBlICovCisJCQkJLyogMHgwMTBhIC0gMHgwMTBiOglyZXNlcnZlZCAqLworCS8qIEVwcm9tIHJlZ2lzdGVycyBhcmUgY3VycmVudGx5IG9mIG5vIHVzZSAqLworI2RlZmluZSBCMl9FXzAJCTB4MDEwYwkvKiAgOCBiaXQgRVBST00gQnl0ZSAwICovCisjZGVmaW5lIEIyX0VfMQkJMHgwMTBkCS8qICA4IGJpdCBFUFJPTSBCeXRlIDEgKi8KKyNkZWZpbmUgQjJfRV8yCQkweDAxMGUJLyogIDggYml0IEVQUk9NIEJ5dGUgMiAqLworI2RlZmluZSBCMl9FXzMJCTB4MDEwZgkvKiAgOCBiaXQgRVBST00gQnl0ZSAzICovCisjZGVmaW5lIEIyX0ZBUgkJMHgwMTEwCS8qIDMyIGJpdCBGbGFzaC1Qcm9tIEFkZHJlc3MgUmVnaXN0ZXIvQ291bnRlciAqLworI2RlZmluZSBCMl9GRFAJCTB4MDExNAkvKiAgOCBiaXQgRmxhc2gtUHJvbSBEYXRhIFBvcnQgKi8KKwkJCQkvKiAweDAxMTUgLSAweDAxMTc6CXJlc2VydmVkICovCisjZGVmaW5lIEIyX0xEX0NSVEwJMHgwMTE4CS8qICA4IGJpdCBsb2FkZXIgY29udHJvbCAqLworI2RlZmluZSBCMl9MRF9URVNUCTB4MDExOQkvKiAgOCBiaXQgbG9hZGVyIHRlc3QgKi8KKwkJCQkvKiAweDAxMWEgLSAweDAxMWY6CXJlc2VydmVkICovCisjZGVmaW5lIEIyX1RJX0lOSQkweDAxMjAJLyogMzIgYml0IFRpbWVyIGluaXQgdmFsdWUgKi8KKyNkZWZpbmUgQjJfVElfVkFMCTB4MDEyNAkvKiAzMiBiaXQgVGltZXIgdmFsdWUgKi8KKyNkZWZpbmUgQjJfVElfQ1JUTAkweDAxMjgJLyogIDggYml0IFRpbWVyIGNvbnRyb2wgKi8KKyNkZWZpbmUgQjJfVElfVEVTVAkweDAxMjkJLyogIDggQml0IFRpbWVyIFRlc3QgKi8KKwkJCQkvKiAweDAxMmEgLSAweDAxMmY6CXJlc2VydmVkICovCisjZGVmaW5lIEIyX1dET0dfSU5JCTB4MDEzMAkvKiAzMiBiaXQgV2F0Y2hkb2cgaW5pdCB2YWx1ZSAqLworI2RlZmluZSBCMl9XRE9HX1ZBTAkweDAxMzQJLyogMzIgYml0IFdhdGNoZG9nIHZhbHVlICovCisjZGVmaW5lIEIyX1dET0dfQ1JUTAkweDAxMzgJLyogIDggYml0IFdhdGNoZG9nIGNvbnRyb2wgKi8KKyNkZWZpbmUgQjJfV0RPR19URVNUCTB4MDEzOQkvKiAgOCBCaXQgV2F0Y2hkb2cgVGVzdCAqLworCQkJCS8qIDB4MDEzYSAtIDB4MDEzZjoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQjJfUlRNX0lOSQkweDAxNDAJLyogMzIgYml0IFJUTSBpbml0IHZhbHVlICovCisjZGVmaW5lIEIyX1JUTV9WQUwJMHgwMTQ0CS8qIDMyIGJpdCBSVE0gdmFsdWUgKi8KKyNkZWZpbmUgQjJfUlRNX0NSVEwJMHgwMTQ4CS8qICA4IGJpdCBSVE0gY29udHJvbCAqLworI2RlZmluZSBCMl9SVE1fVEVTVAkweDAxNDkJLyogIDggQml0IFJUTSBUZXN0ICovCisKKyNkZWZpbmUgQjJfVE9LX0NPVU5UCTB4MDE0YwkvKiAoTUwpCTMyIGJpdAlUb2tlbiBDb3VudGVyICovCisjZGVmaW5lIEIyX0RFU0NfQUREUl9ICTB4MDE1MAkvKiAoTUwpIDMyIGJpdAlEZXNjaXB0b3IgQmFzZSBBZGRyIFJlZyBIaWdoICovCisjZGVmaW5lIEIyX0NUUkxfMgkweDAxNTQJLyogKE1MKQkgOCBiaXQJQ29udHJvbCBSZWdpc3RlciAyICovCisjZGVmaW5lIEIyX0lGQUNFX1JFRwkweDAxNTUJLyogKE1MKQkgOCBiaXQJSW50ZXJmYWNlIFJlZ2lzdGVyICovCisJCQkJLyogMHgwMTU2OgkJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQjJfVFNUX0NUUkxfMgkweDAxNTcJLyogKE1MKSAgOCBiaXQJVGVzdCBDb250cm9sIFJlZ2lzdGVyIDIgKi8KKyNkZWZpbmUgQjJfSTJDX0NUUkwJMHgwMTU4CS8qIChNTCkJMzIgYml0CUkyQyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEIyX0kyQ19EQVRBCTB4MDE1YwkvKiAoTUwpIDMyIGJpdAlJMkMgRGF0YSBSZWdpc3RlciAqLworCisjZGVmaW5lIEIyX0lSUV9NT0RfSU5JCTB4MDE2MAkvKiAoTUwpIDMyIGJpdAlJUlEgTW9kZXJhdGlvbiBUaW1lciBJbml0IFJlZy4gKi8KKyNkZWZpbmUgQjJfSVJRX01PRF9WQUwJMHgwMTY0CS8qIChNTCkJMzIgYml0CUlSUSBNb2RlcmF0aW9uIFRpbWVyIFZhbHVlICovCisjZGVmaW5lIEIyX0lSUV9NT0RfQ1RSTAkweDAxNjgJLyogKE1MKSAgOCBiaXQJSVJRIE1vZGVyYXRpb24gVGltZXIgQ29udHJvbCAqLworI2RlZmluZSBCMl9JUlFfTU9EX1RFU1QJMHgwMTY5CS8qIChNTCkJIDggYml0CUlSUSBNb2RlcmF0aW9uIFRpbWVyIFRlc3QgKi8KKwkJCQkvKiAweDAxNmEgLSAweDAxN2Y6CXJlc2VydmVkICovCisKKy8qCisgKglCYW5rIDMKKyAqLworLyoKKyAqIFRoaXMgaXMgYSBjb3B5IG9mIHRoZSBDb25maWd1cmF0aW9uIHJlZ2lzdGVyIGZpbGUgKGxvd2VyIGhhbGYpCisgKi8KKyNkZWZpbmUgQjNfQ0ZHX1NQQwkweDE4MAorCisvKgorICoJQmFuayA0CisgKi8KKyNkZWZpbmUgQjRfUjFfRAkJMHgwMjAwCS8qIAk0KjMyIGJpdCBjdXJyZW50IHJlY2VpdmUgRGVzY3JpcHRvciAgKi8KKyNkZWZpbmUgQjRfUjFfREEJMHgwMjEwCS8qIAkzMiBiaXQgY3VycmVudCByZWMgZGVzYyBhZGRyZXNzCSAgICAgKi8KKyNkZWZpbmUgQjRfUjFfQUMJMHgwMjE0CS8qIAkzMiBiaXQgY3VycmVudCByZWNlaXZlIEFkZHJlc3MgQ291bnQgKi8KKyNkZWZpbmUgQjRfUjFfQkMJMHgwMjE4CS8qCTMyIGJpdCBjdXJyZW50IHJlY2VpdmUgQnl0ZSBDb3VudGVyICAqLworI2RlZmluZSBCNF9SMV9DU1IJMHgwMjFjCS8qIAkzMiBiaXQgQk1VIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyICAgKi8KKyNkZWZpbmUgQjRfUjFfRgkJMHgwMjIwCS8qIAkzMiBiaXQgZmxhZyByZWdpc3RlcgkJICAgICAqLworI2RlZmluZSBCNF9SMV9UMQkweDAyMjQJLyogCTMyIGJpdCBUZXN0IFJlZ2lzdGVyIDEJCSAgICAgKi8KKyNkZWZpbmUgQjRfUjFfVDFfVFIJMHgwMjI0CS8qIAk4IGJpdCBUZXN0IFJlZ2lzdGVyIDEgVFIJICAgICAqLworI2RlZmluZSBCNF9SMV9UMV9XUgkweDAyMjUJLyogCTggYml0IFRlc3QgUmVnaXN0ZXIgMSBXUgkgICAgICovCisjZGVmaW5lIEI0X1IxX1QxX1JECTB4MDIyNgkvKiAJOCBiaXQgVGVzdCBSZWdpc3RlciAxIFJECSAgICAgKi8KKyNkZWZpbmUgQjRfUjFfVDFfU1YJMHgwMjI3CS8qIAk4IGJpdCBUZXN0IFJlZ2lzdGVyIDEgU1YJICAgICAqLworI2RlZmluZSBCNF9SMV9UMgkweDAyMjgJLyogCTMyIGJpdCBUZXN0IFJlZ2lzdGVyIDIJCSAgICAgKi8KKyNkZWZpbmUgQjRfUjFfVDMJMHgwMjJjCS8qIAkzMiBiaXQgVGVzdCBSZWdpc3RlciAzCQkgICAgICovCisjZGVmaW5lIEI0X1IxX0RBX0gJMHgwMjMwCS8qIChNTCkJMzIgYml0IEN1cnIgUnggRGVzYyBBZGRyZXNzIEhpZ2ggICAgICovCisjZGVmaW5lIEI0X1IxX0FDX0gJMHgwMjM0CS8qIChNTCkJMzIgYml0IEN1cnIgQWRkciBDb3VudGVyIEhpZ2ggZHdvcmQgICovCisJCQkJLyogMHgwMjM4IC0gMHgwMjNmOglyZXNlcnZlZAkgICovCisJCQkJLyogUmVjZWl2ZSBxdWV1ZSAyIGlzIHJlbW92ZWQgb24gTW9uYWxpc2EgKi8KKyNkZWZpbmUgQjRfUjJfRAkJMHgwMjQwCS8qIDQqMzIgYml0IGN1cnJlbnQgcmVjZWl2ZSBEZXNjcmlwdG9yCShxMikgKi8KKyNkZWZpbmUgQjRfUjJfREEJMHgwMjUwCS8qIDMyIGJpdCBjdXJyZW50IHJlYyBkZXNjIGFkZHJlc3MJKHEyKSAqLworI2RlZmluZSBCNF9SMl9BQwkweDAyNTQJLyogMzIgYml0IGN1cnJlbnQgcmVjZWl2ZSBBZGRyZXNzIENvdW50CShxMikgKi8KKyNkZWZpbmUgQjRfUjJfQkMJMHgwMjU4CS8qIDMyIGJpdCBjdXJyZW50IHJlY2VpdmUgQnl0ZSBDb3VudGVyCShxMikgKi8KKyNkZWZpbmUgQjRfUjJfQ1NSCTB4MDI1YwkvKiAzMiBiaXQgQk1VIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyCShxMikgKi8KKyNkZWZpbmUgQjRfUjJfRgkJMHgwMjYwCS8qIDMyIGJpdCBmbGFnIHJlZ2lzdGVyCQkJKHEyKSAqLworI2RlZmluZSBCNF9SMl9UMQkweDAyNjQJLyogMzIgYml0IFRlc3QgUmVnaXN0ZXIgMQkJKHEyKSAqLworI2RlZmluZSBCNF9SMl9UMV9UUgkweDAyNjQJLyogOCBiaXQgVGVzdCBSZWdpc3RlciAxIFRSCQkocTIpICovCisjZGVmaW5lIEI0X1IyX1QxX1dSCTB4MDI2NQkvKiA4IGJpdCBUZXN0IFJlZ2lzdGVyIDEgV1IJCShxMikgKi8KKyNkZWZpbmUgQjRfUjJfVDFfUkQJMHgwMjY2CS8qIDggYml0IFRlc3QgUmVnaXN0ZXIgMSBSRAkJKHEyKSAqLworI2RlZmluZSBCNF9SMl9UMV9TVgkweDAyNjcJLyogOCBiaXQgVGVzdCBSZWdpc3RlciAxIFNWCQkocTIpICovCisjZGVmaW5lIEI0X1IyX1QyCTB4MDI2OAkvKiAzMiBiaXQgVGVzdCBSZWdpc3RlciAyCQkocTIpICovCisjZGVmaW5lIEI0X1IyX1QzCTB4MDI2YwkvKiAzMiBiaXQgVGVzdCBSZWdpc3RlciAzCQkocTIpICovCisJCQkJLyogMHgwMjcwIC0gMHgwMjdjOglyZXNlcnZlZCAqLworCisvKgorICoJQmFuayA1CisgKi8KKyNkZWZpbmUgQjVfWEFfRAkJMHgwMjgwCS8qIDQqMzIgYml0IGN1cnJlbnQgdHJhbnNtaXQgRGVzY3JpcHRvcgkoeGEpICovCisjZGVmaW5lIEI1X1hBX0RBCTB4MDI5MAkvKiAzMiBiaXQgY3VycmVudCB0eCBkZXNjIGFkZHJlc3MJKHhhKSAqLworI2RlZmluZSBCNV9YQV9BQwkweDAyOTQJLyogMzIgYml0IGN1cnJlbnQgdHggQWRkcmVzcyBDb3VudAkoeGEpICovCisjZGVmaW5lIEI1X1hBX0JDCTB4MDI5OAkvKiAzMiBiaXQgY3VycmVudCB0eCBCeXRlIENvdW50ZXIJKHhhKSAqLworI2RlZmluZSBCNV9YQV9DU1IJMHgwMjljCS8qIDMyIGJpdCBCTVUgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIJKHhhKSAqLworI2RlZmluZSBCNV9YQV9GCQkweDAyYTAJLyogMzIgYml0IGZsYWcgcmVnaXN0ZXIJCQkoeGEpICovCisjZGVmaW5lIEI1X1hBX1QxCTB4MDJhNAkvKiAzMiBiaXQgVGVzdCBSZWdpc3RlciAxCQkoeGEpICovCisjZGVmaW5lIEI1X1hBX1QxX1RSCTB4MDJhNAkvKiA4IGJpdCBUZXN0IFJlZ2lzdGVyIDEgVFIJCSh4YSkgKi8KKyNkZWZpbmUgQjVfWEFfVDFfV1IJMHgwMmE1CS8qIDggYml0IFRlc3QgUmVnaXN0ZXIgMSBXUgkJKHhhKSAqLworI2RlZmluZSBCNV9YQV9UMV9SRAkweDAyYTYJLyogOCBiaXQgVGVzdCBSZWdpc3RlciAxIFJECQkoeGEpICovCisjZGVmaW5lIEI1X1hBX1QxX1NWCTB4MDJhNwkvKiA4IGJpdCBUZXN0IFJlZ2lzdGVyIDEgU1YJCSh4YSkgKi8KKyNkZWZpbmUgQjVfWEFfVDIJMHgwMmE4CS8qIDMyIGJpdCBUZXN0IFJlZ2lzdGVyIDIJCSh4YSkgKi8KKyNkZWZpbmUgQjVfWEFfVDMJMHgwMmFjCS8qIDMyIGJpdCBUZXN0IFJlZ2lzdGVyIDMJCSh4YSkgKi8KKyNkZWZpbmUgQjVfWEFfREFfSAkweDAyYjAJLyogKE1MKQkzMiBiaXQgQ3VyciBUeCBEZXNjIEFkZHJlc3MgSGlnaCAgICAgKi8KKyNkZWZpbmUgQjVfWEFfQUNfSAkweDAyYjQJLyogKE1MKQkzMiBiaXQgQ3VyciBBZGRyIENvdW50ZXIgSGlnaCBkd29yZCAgKi8KKwkJCQkvKiAweDAyYjggLSAweDAyYmM6CXJlc2VydmVkICovCisjZGVmaW5lIEI1X1hTX0QJCTB4MDJjMAkvKiA0KjMyIGJpdCBjdXJyZW50IHRyYW5zbWl0IERlc2NyaXB0b3IJKHhzKSAqLworI2RlZmluZSBCNV9YU19EQQkweDAyZDAJLyogMzIgYml0IGN1cnJlbnQgdHggZGVzYyBhZGRyZXNzCSh4cykgKi8KKyNkZWZpbmUgQjVfWFNfQUMJMHgwMmQ0CS8qIDMyIGJpdCBjdXJyZW50IHRyYW5zbWl0IEFkZHJlc3MgQ291bnQoeHMpICovCisjZGVmaW5lIEI1X1hTX0JDCTB4MDJkOAkvKiAzMiBiaXQgY3VycmVudCB0cmFuc21pdCBCeXRlIENvdW50ZXIJKHhzKSAqLworI2RlZmluZSBCNV9YU19DU1IJMHgwMmRjCS8qIDMyIGJpdCBCTVUgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIJKHhzKSAqLworI2RlZmluZSBCNV9YU19GCQkweDAyZTAJLyogMzIgYml0IGZsYWcgcmVnaXN0ZXIJCQkoeHMpICovCisjZGVmaW5lIEI1X1hTX1QxCTB4MDJlNAkvKiAzMiBiaXQgVGVzdCBSZWdpc3RlciAxCQkoeHMpICovCisjZGVmaW5lIEI1X1hTX1QxX1RSCTB4MDJlNAkvKiA4IGJpdCBUZXN0IFJlZ2lzdGVyIDEgVFIJCSh4cykgKi8KKyNkZWZpbmUgQjVfWFNfVDFfV1IJMHgwMmU1CS8qIDggYml0IFRlc3QgUmVnaXN0ZXIgMSBXUgkJKHhzKSAqLworI2RlZmluZSBCNV9YU19UMV9SRAkweDAyZTYJLyogOCBiaXQgVGVzdCBSZWdpc3RlciAxIFJECQkoeHMpICovCisjZGVmaW5lIEI1X1hTX1QxX1NWCTB4MDJlNwkvKiA4IGJpdCBUZXN0IFJlZ2lzdGVyIDEgU1YJCSh4cykgKi8KKyNkZWZpbmUgQjVfWFNfVDIJMHgwMmU4CS8qIDMyIGJpdCBUZXN0IFJlZ2lzdGVyIDIJCSh4cykgKi8KKyNkZWZpbmUgQjVfWFNfVDMJMHgwMmVjCS8qIDMyIGJpdCBUZXN0IFJlZ2lzdGVyIDMJCSh4cykgKi8KKyNkZWZpbmUgQjVfWFNfREFfSAkweDAyZjAJLyogKE1MKQkzMiBiaXQgQ3VyciBUeCBEZXNjIEFkZHJlc3MgSGlnaCAgICAgKi8KKyNkZWZpbmUgQjVfWFNfQUNfSAkweDAyZjQJLyogKE1MKQkzMiBiaXQgQ3VyciBBZGRyIENvdW50ZXIgSGlnaCBkd29yZCAgKi8KKwkJCQkvKiAweDAyZjggLSAweDAyZmM6CXJlc2VydmVkICovCisKKy8qCisgKglCYW5rIDYKKyAqLworLyogRXh0ZXJuYWwgUExDLVMgcmVnaXN0ZXJzIChTTjIgY29tcGF0aWJpbGl0eSBmb3IgRFYpICovCisvKiBFeHRlcm5hbCByZWdpc3RlcnMgKE1MKSAqLworI2RlZmluZSBCNl9FWFRfUkVHCTB4MzAwCisKKy8qCisgKglCYW5rIDcKKyAqLworLyogREFTIFBMQy1TIFJlZ2lzdGVycyAqLworCisvKgorICoJQmFuayA4IC0gMTUKKyAqLworLyogSUZDUCByZWdpc3RlcnMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRGVmaW5pdGlvbnMgb2YgdGhlIEJpdHMgaW4gdGhlIHJlZ2lzdGVycyAqLworCisvKglCMF9SQVAJCTE2IGJpdCByZWdpc3RlciBhZGRyZXNzIHBvcnQgKi8KKyNkZWZpbmUJUkFQX1JBUAkJMHgwZgkvKiBCaXQgMy4uMDoJMCA9IGJsb2NrMCwgLi4sIGYgPSBibG9jazE1ICovCisKKy8qCUIwX0NUUkwJCTggYml0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ1RSTF9GRERJX0NMUgkoMTw8NykJLyogQml0IDc6IChNTCkJQ2xlYXIgRkRESSBSZXNldCAqLworI2RlZmluZSBDVFJMX0ZERElfU0VUCSgxPDw2KQkvKiBCaXQgNjogKE1MKQlTZXQgRkRESSBSZXNldCAqLworI2RlZmluZQlDVFJMX0hQSV9DTFIJKDE8PDUpCS8qIEJpdCA1OglDbGVhciBIUEkgU00gcmVzZXQgKi8KKyNkZWZpbmUJQ1RSTF9IUElfU0VUCSgxPDw0KQkvKiBCaXQgNDoJU2V0IEhQSSBTTSByZXNldCAqLworI2RlZmluZQlDVFJMX01SU1RfQ0xSCSgxPDwzKQkvKiBCaXQgMzoJQ2xlYXIgTWFzdGVyIHJlc2V0ICovCisjZGVmaW5lCUNUUkxfTVJTVF9TRVQJKDE8PDIpCS8qIEJpdCAyOglTZXQgTWFzdGVyIHJlc2V0ICovCisjZGVmaW5lCUNUUkxfUlNUX0NMUgkoMTw8MSkJLyogQml0IDE6CUNsZWFyIFNvZnR3YXJlIHJlc2V0ICovCisjZGVmaW5lCUNUUkxfUlNUX1NFVAkoMTw8MCkJLyogQml0IDA6CVNldCBTb2Z0d2FyZSByZXNldCAqLworCisvKglCMF9EQVMJCTggQml0IGNvbnRyb2wgcmVnaXN0ZXIgKERBUykgKi8KKyNkZWZpbmUgQlVTX0NMT0NLCSgxPDw3KQkvKiBCaXQgNzogKE1MKQlCdXMgQ2xvY2sgMC8xID0gMzMvNjZNSHogKi8KKyNkZWZpbmUgQlVTX1NMT1RfU1oJKDE8PDYpCS8qIEJpdCA2OiAoTUwpCVNsb3QgU2l6ZSAwLzEgPSAzMi82NCBiaXQgc2xvdCovCisJCQkJLyogQml0IDUuLjQ6CXJlc2VydmVkICovCisjZGVmaW5lCURBU19BVkFJTAkoMTw8MykJLyogQml0IDM6CTEgPSBEQVMsIDAgPSBTQVMgKi8KKyNkZWZpbmUgREFTX0JZUF9TVAkoMTw8MikJLyogQml0IDI6CTEgPSBhdmFpbCxTQVMsIDAgPSBub3QgYXZhaWwgKi8KKyNkZWZpbmUgREFTX0JZUF9JTlMJKDE8PDEpCS8qIEJpdCAxOgkxID0gaW5zZXJ0IEJ5cGFzcyAqLworI2RlZmluZSBEQVNfQllQX1JNVgkoMTw8MCkJLyogQml0IDA6CTEgPSByZW1vdmUgQnlwYXNzICovCisKKy8qCUIwX0xFRAkJOCBCaXQgTEVEIHJlZ2lzdGVyICovCisJCQkJLyogQml0IDcuLjY6CXJlc2VydmVkICovCisjZGVmaW5lIExFRF8yX09OCSgxPDw1KQkvKiBCaXQgNToJMSA9IHN3aXRjaCBMRURfMiBvbiAobGVmdCxnbikqLworI2RlZmluZSBMRURfMl9PRkYJKDE8PDQpCS8qIEJpdCA0OgkxID0gc3dpdGNoIExFRF8yIG9mZiAqLworI2RlZmluZSBMRURfMV9PTgkoMTw8MykJLyogQml0IDM6CTEgPSBzd2l0Y2ggTEVEXzEgb24gKG1pZCx5ZWwpKi8KKyNkZWZpbmUgTEVEXzFfT0ZGCSgxPDwyKQkvKiBCaXQgMjoJMSA9IHN3aXRjaCBMRURfMSBvZmYgKi8KKyNkZWZpbmUgTEVEXzBfT04JKDE8PDEpCS8qIEJpdCAxOgkxID0gc3dpdGNoIExFRF8wIG9uIChyZ2h0LGduKSovCisjZGVmaW5lIExFRF8wX09GRgkoMTw8MCkJLyogQml0IDA6CTEgPSBzd2l0Y2ggTEVEXzAgb2ZmICovCisvKiBUaGlzIGhhcmR3YXJlIGRlZmluZXMgYXJlIHZlcnkgdWdseSB0aGVyZWZvcmUgd2UgZGVmaW5lIHNvbWUgb3RoZXJzICovCisKKyNkZWZpbmUgTEVEX0dBX09OCUxFRF8yX09OCS8qIFMgcG9ydCA9IEEgcG9ydCAqLworI2RlZmluZSBMRURfR0FfT0ZGCUxFRF8yX09GRgkvKiBTIHBvcnQgPSBBIHBvcnQgKi8KKyNkZWZpbmUgTEVEX01ZX09OCUxFRF8xX09OCisjZGVmaW5lIExFRF9NWV9PRkYJTEVEXzFfT0ZGCisjZGVmaW5lIExFRF9HQl9PTglMRURfMF9PTgorI2RlZmluZSBMRURfR0JfT0ZGCUxFRF8wX09GRgorCisvKglCMF9UU1RfQ1RSTAk4IGJpdCB0ZXN0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVFNUX0ZSQ19EUEVSUl9NUgkoMTw8NykJLyogQml0IDc6ICBmb3JjZSBEQVRBUEVSUiBvbiBNU1QgUkUuICovCisjZGVmaW5lCVRTVF9GUkNfRFBFUlJfTVcJKDE8PDYpCS8qIEJpdCA2OiAgZm9yY2UgREFUQVBFUlIgb24gTVNUIFdSLiAqLworI2RlZmluZQlUU1RfRlJDX0RQRVJSX1RSCSgxPDw1KQkvKiBCaXQgNTogIGZvcmNlIERBVEFQRVJSIG9uIFRSRyBSRS4gKi8KKyNkZWZpbmUJVFNUX0ZSQ19EUEVSUl9UVwkoMTw8NCkJLyogQml0IDQ6ICBmb3JjZSBEQVRBUEVSUiBvbiBUUkcgV1IuICovCisjZGVmaW5lCVRTVF9GUkNfQVBFUlJfTQkJKDE8PDMpCS8qIEJpdCAzOiAgZm9yY2UgQUREUlBFUlIgb24gTVNUICAgICAqLworI2RlZmluZQlUU1RfRlJDX0FQRVJSX1QJCSgxPDwyKQkvKiBCaXQgMjogIGZvcmNlIEFERFJQRVJSIG9uIFRSRyAgICAgKi8KKyNkZWZpbmUJVFNUX0NGR19XUklURV9PTgkoMTw8MSkJLyogQml0IDE6ICBlbmEgY29uZmlndXJhdGlvbiByZWcuIFdSICovCisjZGVmaW5lCVRTVF9DRkdfV1JJVEVfT0ZGCSgxPDwwKQkvKiBCaXQgMDogIGRpcyBjb25maWd1cmF0aW9uIHJlZy4gV1IgKi8KKworLyoJQjBfSVNSQwkJMzIgYml0IEludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIgKi8KKwkJCQkJLyogQml0IDMxLi4yODoJcmVzZXJ2ZWQJICAgICAqLworI2RlZmluZSBJU19JMkNfUkVBRFkJKDFMPDwyNykJLyogQml0IDI3OiAoTUwpCUlSUSBvbiBlbmQgb2YgSTJDIHR4ICovCisjZGVmaW5lIElTX0lSUV9TVwkoMUw8PDI2KQkvKiBCaXQgMjY6IChNTCkJU1cgZm9yY2VkIElSUQkgICAgICovCisjZGVmaW5lIElTX0VYVF9SRUcJKDFMPDwyNSkJLyogQml0IDI1OiAoTUwpIElSUSBmcm9tIGV4dGVybmFsIHJlZyovCisjZGVmaW5lCUlTX0lSUV9TVEFUCSgxTDw8MjQpCS8qIEJpdCAyNDoJSVJRIHN0YXR1cyBleGNlcHRpb24gKi8KKwkJCQkJLyogICBQRVJSLCBSTUFCT1JULCBSVEFCT1JUIERBVEFQRVJSICovCisjZGVmaW5lCUlTX0lSUV9NU1RfRVJSCSgxTDw8MjMpCS8qIEJpdCAyMzoJSVJRIG1hc3RlciBlcnJvciAgICAgKi8KKwkJCQkJLyogICBSTUFCT1JULCBSVEFCT1JULCBEQVRBUEVSUgkgICAgICovCisjZGVmaW5lCUlTX1RJTUlOVAkoMUw8PDIyKQkvKiBCaXQgMjI6CUlSUV9USU1FUgkqLworI2RlZmluZQlJU19UT0tFTgkoMUw8PDIxKQkvKiBCaXQgMjE6CUlSUV9SVE0JCSovCisvKgorICogTm90ZTogVGhlIERBUyBpcyBvdXIgRmlyc3QgUG9ydCAoIT1QQSkKKyAqLworI2RlZmluZQlJU19QTElOVDEJKDFMPDwyMCkJLyogQml0IDIwOglJUlFfUEhZX0RBUwkqLworI2RlZmluZQlJU19QTElOVDIJKDFMPDwxOSkJLyogQml0IDE5OglJUlFfSUZDUF80CSovCisjZGVmaW5lCUlTX01JTlRSMwkoMUw8PDE4KQkvKiBCaXQgMTg6CUlSUV9JRkNQXzMvSVJRX1BIWSAqLworI2RlZmluZQlJU19NSU5UUjIJKDFMPDwxNykJLyogQml0IDE3OglJUlFfSUZDUF8yL0lSUV9NQUNfMiAqLworI2RlZmluZQlJU19NSU5UUjEJKDFMPDwxNikJLyogQml0IDE2OglJUlFfSUZDUF8xL0lSUV9NQUNfMSAqLworLyogUmVjZWl2ZSBRdWV1ZSAxICovCisjZGVmaW5lCUlTX1IxX1AJCSgxTDw8MTUpCS8qIEJpdCAxNToJUGFyaXR5IEVycm9yIChxMSkgKi8KKyNkZWZpbmUJSVNfUjFfQgkJKDFMPDwxNCkJLyogQml0IDE0OglFbmQgb2YgQnVmZmVyIChxMSkgKi8KKyNkZWZpbmUJSVNfUjFfRgkJKDFMPDwxMykJLyogQml0IDEzOglFbmQgb2YgRnJhbWUgKHExKSAqLworI2RlZmluZQlJU19SMV9DCQkoMUw8PDEyKQkvKiBCaXQgMTI6CUVuY29kaW5nIEVycm9yIChxMSkgKi8KKy8qIFJlY2VpdmUgUXVldWUgMiAqLworI2RlZmluZQlJU19SMl9QCQkoMUw8PDExKQkvKiBCaXQgMTE6IChEVikJUGFyaXR5IEVycm9yIChxMikgKi8KKyNkZWZpbmUJSVNfUjJfQgkJKDFMPDwxMCkJLyogQml0IDEwOiAoRFYpCUVuZCBvZiBCdWZmZXIgKHEyKSAqLworI2RlZmluZQlJU19SMl9GCQkoMUw8PDkpCQkvKiBCaXQJOTogKERWKQlFbmQgb2YgRnJhbWUgKHEyKSAqLworI2RlZmluZQlJU19SMl9DCQkoMUw8PDgpCQkvKiBCaXQJODogKERWKQlFbmNvZGluZyBFcnJvciAocTIpICovCisvKiBBc3luY2hyb25vdXMgVHJhbnNtaXQgcXVldWUgKi8KKwkJCQkJLyogQml0ICA3OglyZXNlcnZlZCAqLworI2RlZmluZQlJU19YQV9CCQkoMUw8PDYpCQkvKiBCaXQJNjoJRW5kIG9mIEJ1ZmZlciAoeGEpICovCisjZGVmaW5lCUlTX1hBX0YJCSgxTDw8NSkJCS8qIEJpdAk1OglFbmQgb2YgRnJhbWUgKHhhKSAqLworI2RlZmluZQlJU19YQV9DCQkoMUw8PDQpCQkvKiBCaXQJNDoJRW5jb2RpbmcgRXJyb3IgKHhhKSAqLworLyogU3luY2hyb25vdXMgVHJhbnNtaXQgcXVldWUgKi8KKwkJCQkJLyogQml0ICAzOglyZXNlcnZlZCAqLworI2RlZmluZQlJU19YU19CCQkoMUw8PDIpCQkvKiBCaXQJMjoJRW5kIG9mIEJ1ZmZlciAoeHMpICovCisjZGVmaW5lCUlTX1hTX0YJCSgxTDw8MSkJCS8qIEJpdAkxOglFbmQgb2YgRnJhbWUgKHhzKSAqLworI2RlZmluZQlJU19YU19DCQkoMUw8PDApCQkvKiBCaXQJMDoJRW5jb2RpbmcgRXJyb3IgKHhzKSAqLworCisvKgorICogRGVmaW5lIGFsbCB2YWxpZCBpbnRlcnJ1cHQgc291cmNlIEJpdHMgZnJvbSBHRVRfSVNSICgpCisgKi8KKyNkZWZpbmUJQUxMX0lSU1IJMHgwMWZmZmY3N0wJLyogKERWKSAqLworI2RlZmluZQlBTExfSVJTUl9NTAkweDBmZmZmMDc3TAkvKiAoTUwpICovCisKKworLyoJQjBfSU1TSwkJMzIgYml0IEludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCisvKgorICogVGhlIEJpdCBkZWZpbm5pdGlvbiBvZiB0aGlzIHJlZ2lzdGVyIGFyZSB0aGUgc2FtZSBhcyBvZiB0aGUgaW50ZXJydXB0CisgKiBzb3VyY2UgcmVnaXN0ZXIuIFRoZXNlIGRlZmluaXRpb24gYXJlIGRpcmVjdGx5IGRlcml2ZWQgZnJvbSB0aGUgSGFyZHdhcmUKKyAqIHNwZWMuCisgKi8KKwkJCQkJLyogQml0IDMxLi4yODoJcmVzZXJ2ZWQJICAgICAqLworI2RlZmluZSBJUlFfSTJDX1JFQURZCSgxTDw8MjcpCS8qIEJpdCAyNzogKE1MKQlJUlEgb24gZW5kIG9mIEkyQyB0eCAqLworI2RlZmluZSBJUlFfU1cJCSgxTDw8MjYpCS8qIEJpdCAyNjogKE1MKQlTVyBmb3JjZWQgSVJRCSAgICAgKi8KKyNkZWZpbmUgSVJRX0VYVF9SRUcJKDFMPDwyNSkJLyogQml0IDI1OiAoTUwpIElSUSBmcm9tIGV4dGVybmFsIHJlZyovCisjZGVmaW5lCUlSUV9TVEFUCSgxTDw8MjQpCS8qIEJpdCAyNDoJSVJRIHN0YXR1cyBleGNlcHRpb24gKi8KKwkJCQkJLyogICBQRVJSLCBSTUFCT1JULCBSVEFCT1JUIERBVEFQRVJSICovCisjZGVmaW5lCUlSUV9NU1RfRVJSCSgxTDw8MjMpCS8qIEJpdCAyMzoJSVJRIG1hc3RlciBlcnJvciAgICAgKi8KKwkJCQkJLyogICBSTUFCT1JULCBSVEFCT1JULCBEQVRBUEVSUgkgICAgICovCisjZGVmaW5lCUlSUV9USU1FUgkoMUw8PDIyKQkvKiBCaXQgMjI6CUlSUV9USU1FUgkqLworI2RlZmluZQlJUlFfUlRNCQkoMUw8PDIxKQkvKiBCaXQgMjE6CUlSUV9SVE0JCSovCisjZGVmaW5lCUlSUV9EQVMJCSgxTDw8MjApCS8qIEJpdCAyMDoJSVJRX1BIWV9EQVMJKi8KKyNkZWZpbmUJSVJRX0lGQ1BfNAkoMUw8PDE5KQkvKiBCaXQgMTk6CUlSUV9JRkNQXzQJKi8KKyNkZWZpbmUJSVJRX0lGQ1BfMwkoMUw8PDE4KQkvKiBCaXQgMTg6CUlSUV9JRkNQXzMvSVJRX1BIWSAqLworI2RlZmluZQlJUlFfSUZDUF8yCSgxTDw8MTcpCS8qIEJpdCAxNzoJSVJRX0lGQ1BfMi9JUlFfTUFDXzIgKi8KKyNkZWZpbmUJSVJRX0lGQ1BfMQkoMUw8PDE2KQkvKiBCaXQgMTY6CUlSUV9JRkNQXzEvSVJRX01BQ18xICovCisvKiBSZWNlaXZlIFF1ZXVlIDEgKi8KKyNkZWZpbmUJSVJRX1IxX1AJKDFMPDwxNSkJLyogQml0IDE1OglQYXJpdHkgRXJyb3IgKHExKSAqLworI2RlZmluZQlJUlFfUjFfQgkoMUw8PDE0KQkvKiBCaXQgMTQ6CUVuZCBvZiBCdWZmZXIgKHExKSAqLworI2RlZmluZQlJUlFfUjFfRgkoMUw8PDEzKQkvKiBCaXQgMTM6CUVuZCBvZiBGcmFtZSAocTEpICovCisjZGVmaW5lCUlSUV9SMV9DCSgxTDw8MTIpCS8qIEJpdCAxMjoJRW5jb2RpbmcgRXJyb3IgKHExKSAqLworLyogUmVjZWl2ZSBRdWV1ZSAyICovCisjZGVmaW5lCUlSUV9SMl9QCSgxTDw8MTEpCS8qIEJpdCAxMTogKERWKQlQYXJpdHkgRXJyb3IgKHEyKSAqLworI2RlZmluZQlJUlFfUjJfQgkoMUw8PDEwKQkvKiBCaXQgMTA6IChEVikJRW5kIG9mIEJ1ZmZlciAocTIpICovCisjZGVmaW5lCUlSUV9SMl9GCSgxTDw8OSkJCS8qIEJpdAk5OiAoRFYpCUVuZCBvZiBGcmFtZSAocTIpICovCisjZGVmaW5lCUlSUV9SMl9DCSgxTDw8OCkJCS8qIEJpdAk4OiAoRFYpCUVuY29kaW5nIEVycm9yIChxMikgKi8KKy8qIEFzeW5jaHJvbm91cyBUcmFuc21pdCBxdWV1ZSAqLworCQkJCQkvKiBCaXQgIDc6CXJlc2VydmVkICovCisjZGVmaW5lCUlSUV9YQV9CCSgxTDw8NikJCS8qIEJpdAk2OglFbmQgb2YgQnVmZmVyICh4YSkgKi8KKyNkZWZpbmUJSVJRX1hBX0YJKDFMPDw1KQkJLyogQml0CTU6CUVuZCBvZiBGcmFtZSAoeGEpICovCisjZGVmaW5lCUlSUV9YQV9DCSgxTDw8NCkJCS8qIEJpdAk0OglFbmNvZGluZyBFcnJvciAoeGEpICovCisvKiBTeW5jaHJvbm91cyBUcmFuc21pdCBxdWV1ZSAqLworCQkJCQkvKiBCaXQgIDM6CXJlc2VydmVkICovCisjZGVmaW5lCUlSUV9YU19CCSgxTDw8MikJCS8qIEJpdAkyOglFbmQgb2YgQnVmZmVyICh4cykgKi8KKyNkZWZpbmUJSVJRX1hTX0YJKDFMPDwxKQkJLyogQml0CTE6CUVuZCBvZiBGcmFtZSAoeHMpICovCisjZGVmaW5lCUlSUV9YU19DCSgxTDw8MCkJCS8qIEJpdAkwOglFbmNvZGluZyBFcnJvciAoeHMpICovCisKKy8qIDB4MDAxMCAtIDB4MDA2YjoJZm9ybWFjKyAoc3VwZXJuZXRfMykgZmVxdWVudGx5IHVzZWQgcmVnaXN0ZXJzICovCisvKglCMF9SMV9DU1IJMzIgYml0IEJNVSBjb250cm9sL3N0YXR1cyByZWcgKHJlYyBxIDEgKSAqLworLyoJQjBfUjJfQ1NSCTMyIGJpdCBCTVUgY29udHJvbC9zdGF0dXMgcmVnIChyZWMgcSAyICkgKi8KKy8qCUIwX1hBX0NTUgkzMiBiaXQgQk1VIGNvbnRyb2wvc3RhdHVzIHJlZyAoYSB4bWl0IHEgKSAqLworLyoJQjBfWFNfQ1NSCTMyIGJpdCBCTVUgY29udHJvbC9zdGF0dXMgcmVnIChzIHhtaXQgcSApICovCisvKiBUaGUgcmVnaXN0ZXJzIGFyZSB0aGUgc2FtZSBhcyBCNF9SMV9DU1IsIEI0X1IyX0NTUiwgQjVfWGFfQ1NSLCBCNV9YU19DU1IgKi8KKworLyoJQjJfTUFDXzAJOCBiaXQgTUFDIGFkZHJlc3MgQnl0ZSAwICovCisvKglCMl9NQUNfMQk4IGJpdCBNQUMgYWRkcmVzcyBCeXRlIDEgKi8KKy8qCUIyX01BQ18yCTggYml0IE1BQyBhZGRyZXNzIEJ5dGUgMiAqLworLyoJQjJfTUFDXzMJOCBiaXQgTUFDIGFkZHJlc3MgQnl0ZSAzICovCisvKglCMl9NQUNfNAk4IGJpdCBNQUMgYWRkcmVzcyBCeXRlIDQgKi8KKy8qCUIyX01BQ181CTggYml0IE1BQyBhZGRyZXNzIEJ5dGUgNSAqLworLyoJQjJfTUFDXzYJOCBiaXQgTUFDIGFkZHJlc3MgQnl0ZSA2ICg9PSAwKSAoRFYpICovCisvKglCMl9NQUNfNwk4IGJpdCBNQUMgYWRkcmVzcyBCeXRlIDcgKD09IDApIChEVikgKi8KKworLyoJQjJfQ09OTl9UWVAJOCBiaXQgQ29ubmVjdG9yIHR5cGUgKi8KKy8qCUIyX1BNRF9UWVAJOCBiaXQgUE1EIHR5cGUgKi8KKy8qCVZhbHVlcyBvZiBjb25uZWN0b3IgYW5kIFBNRCB0eXBlIGNvbXBseSB0byBTeXNLb25uZWN0IGludGVybmFsIHN0ZCAqLworCisvKglUaGUgRVBST00gcmVnaXN0ZXIgYXJlIGN1cnJlbnRseSBvZiBubyB1c2UgKi8KKy8qCUIyX0VfMAkJOCBiaXQgRVBST00gQnl0ZSAwICovCisvKglCMl9FXzEJCTggYml0IEVQUk9NIEJ5dGUgMSAqLworLyoJQjJfRV8yCQk4IGJpdCBFUFJPTSBCeXRlIDIgKi8KKy8qCUIyX0VfMwkJOCBiaXQgRVBST00gQnl0ZSAzICovCisKKy8qCUIyX0ZBUgkJMzIgYml0IEZsYXNoLVByb20gQWRkcmVzcyBSZWdpc3Rlci9Db3VudGVyICovCisjZGVmaW5lCUZBUl9BRERSCTB4MWZmZmZMCS8qIEJpdCAxNi4uMDoJRlBST00gQWRkcmVzcyBtYXNrICovCisKKy8qCUIyX0ZEUAkJOCBiaXQgRmxhc2gtUHJvbSBEYXRhIFBvcnQgKi8KKworLyoJQjJfTERfQ1JUTAk4IGJpdCBsb2FkZXIgY29udHJvbCAqLworLyoJQml0cyBhcmUgY3VycmVudGx5IHJlc2VydmVkICovCisKKy8qCUIyX0xEX1RFU1QJOCBiaXQgbG9hZGVyIHRlc3QgKi8KKyNkZWZpbmUJTERfVF9PTgkJKDE8PDMpCS8qIEJpdCAzOiAgICBMb2FkZXIgVGVzdG1vZGUgb24gKi8KKyNkZWZpbmUJTERfVF9PRkYJKDE8PDIpCS8qIEJpdCAyOiAgICBMb2FkZXIgVGVzdG1vZGUgb2ZmICovCisjZGVmaW5lCUxEX1RfU1RFUAkoMTw8MSkJLyogQml0IDE6ICAgIERlY3JlbWVudCBGUFJPTSBhZGRyLiBDb3VudGVyICovCisjZGVmaW5lCUxEX1NUQVJUCSgxPDwwKQkvKiBCaXQgMDogICAgU3RhcnQgbG9hZGluZyBGUFJPTSAqLworCisvKglCMl9USV9JTkkJMzIgYml0IFRpbWVyIGluaXQgdmFsdWUgKi8KKy8qCUIyX1RJX1ZBTAkzMiBiaXQgVGltZXIgdmFsdWUgKi8KKy8qCUIyX1RJX0NSVEwJOCBiaXQgVGltZXIgY29udHJvbCAqLworLyoJQjJfVElfVEVTVAk4IEJpdCBUaW1lciBUZXN0ICovCisvKglCMl9XRE9HX0lOSQkzMiBiaXQgV2F0Y2hkb2cgaW5pdCB2YWx1ZSAqLworLyoJQjJfV0RPR19WQUwJMzIgYml0IFdhdGNoZG9nIHZhbHVlICovCisvKglCMl9XRE9HX0NSVEwJOCBiaXQgV2F0Y2hkb2cgY29udHJvbCAqLworLyoJQjJfV0RPR19URVNUCTggQml0IFdhdGNoZG9nIFRlc3QgKi8KKy8qCUIyX1JUTV9JTkkJMzIgYml0IFJUTSBpbml0IHZhbHVlICovCisvKglCMl9SVE1fVkFMCTMyIGJpdCBSVE0gdmFsdWUgKi8KKy8qCUIyX1JUTV9DUlRMCTggYml0IFJUTSBjb250cm9sICovCisvKglCMl9SVE1fVEVTVAk4IEJpdCBSVE0gVGVzdCAqLworLyoJQjJfPFRJTT5fQ1JUTAk4IGJpdCA8VElNPiBjb250cm9sICovCisvKglCMl9JUlFfTU9EX0lOSQkzMiBiaXQgSVJRIE1vZGVyYXRpb24gVGltZXIgSW5pdCBSZWcuCShNTCkgKi8KKy8qCUIyX0lSUV9NT0RfVkFMCTMyIGJpdCBJUlEgTW9kZXJhdGlvbiBUaW1lciBWYWx1ZQkoTUwpICovCisvKglCMl9JUlFfTU9EX0NUUkwJOCBiaXQgSVJRIE1vZGVyYXRpb24gVGltZXIgQ29udHJvbAkoTUwpICovCisvKglCMl9JUlFfTU9EX1RFU1QJOCBiaXQgSVJRIE1vZGVyYXRpb24gVGltZXIgVGVzdAkJKE1MKSAqLworI2RlZmluZSBHRVRfVE9LX0NUCSgxPDw0KQkvKiBCaXQgNDogR2V0IHRoZSBUb2tlbiBDb3VudGVyIChSVE0pICovCisjZGVmaW5lIFRJTV9SRVNfVE9LCSgxPDwzKQkvKiBCaXQgMzogUlRNIFN0YXR1czogMSA9PSByZXN0cmljdGVkICovCisjZGVmaW5lIFRJTV9BTEFSTQkoMTw8MykJLyogQml0IDM6IFRpbWVyIEFsYXJtIChXRE9HKSAqLworI2RlZmluZSBUSU1fU1RBUlQJKDE8PDIpCS8qIEJpdCAyOiBTdGFydCBUaW1lciAoVEksV0RPRyxSVE0sSVJRX01PRCkqLworI2RlZmluZSBUSU1fU1RPUAkoMTw8MSkJLyogQml0IDE6IFN0b3AgVGltZXIgKFRJLFdET0csUlRNLElSUV9NT0QpICovCisjZGVmaW5lIFRJTV9DTF9JUlEJKDE8PDApCS8qIEJpdCAwOiBDbGVhciBUaW1lciBJUlEgKFRJLFdET0csUlRNKSAqLworLyoJQjJfPFRJTT5fVEVTVAk4IEJpdCA8VElNPiBUZXN0ICovCisjZGVmaW5lCVRJTV9UX09OCSgxPDwyKQkvKiBCaXQgMjogVGVzdCBtb2RlIG9uIChUSSxXRE9HLFJUTSxJUlFfTU9EKSAqLworI2RlZmluZQlUSU1fVF9PRkYJKDE8PDEpCS8qIEJpdCAxOiBUZXN0IG1vZGUgb2ZmIChUSSxXRE9HLFJUTSxJUlFfTU9EKSAqLworI2RlZmluZQlUSU1fVF9TVEVQCSgxPDwwKQkvKiBCaXQgMDogVGVzdCBzdGVwIChUSSxXRE9HLFJUTSxJUlFfTU9EKSAqLworCisvKglCMl9UT0tfQ09VTlQJMHgwMTRjCShNTCkJMzIgYml0CVRva2VuIENvdW50ZXIgKi8KKy8qCUIyX0RFU0NfQUREUl9ICTB4MDE1MAkoTUwpCTMyIGJpdAlEZXNjaXB0b3IgQmFzZSBBZGRyIFJlZyBIaWdoICovCisvKglCMl9DVFJMXzIJMHgwMTU0CShNTCkJIDggYml0CUNvbnRyb2wgUmVnaXN0ZXIgMiAqLworCQkJCS8qIEJpdCA3Li41OglyZXNlcnZlZAkJKi8KKyNkZWZpbmUgQ1RSTF9DTF9JMkNfSVJRICgxPDw0KQkvKiBCaXQgNDoJQ2xlYXIgSTJDIElSUQkJKi8KKyNkZWZpbmUgQ1RSTF9TVF9TV19JUlEJKDE8PDMpCS8qIEJpdCAzOglTZXQgSVJRIFNXIFJlcXVlc3QJKi8KKyNkZWZpbmUgQ1RSTF9DTF9TV19JUlEJKDE8PDIpCS8qIEJpdCAyOglDbGVhciBJUlEgU1cgUmVxdWVzdAkqLworI2RlZmluZSBDVFJMX1NUT1BfRE9ORQkoMTw8MSkJLyogQml0IDE6CVN0b3AgTWFzdGVyIGlzIGZpbmlzaGVkICovCisjZGVmaW5lCUNUUkxfU1RPUF9NQVNUCSgxPDwwKQkvKiBCaXQgMDoJQ29tbWFuZCBCaXQgdG8gc3RvcCB0aGUgbWFzdGVyKi8KKworLyoJQjJfSUZBQ0VfUkVHCTB4MDE1NQkoTUwpCSA4IGJpdAlJbnRlcmZhY2UgUmVnaXN0ZXIgKi8KKwkJCQkvKiBCaXQgNy4uMzoJcmVzZXJ2ZWQJCSovCisjZGVmaW5lCUlGX0kyQ19EQVRBX0RJUgkoMTw8MikJLyogQml0IDI6CWRpcmVjdGlvbiBvZiBJRl9JMkNfREFUQSovCisjZGVmaW5lIElGX0kyQ19EQVRBCSgxPDwxKQkvKiBCaXQgMToJSTJDIERhdGEgUG9ydAkJKi8KKyNkZWZpbmUJSUZfSTJDX0NMSwkoMTw8MCkJLyogQml0IDA6CUkyQyBDbG9jayBQb3J0CQkqLworCisJCQkJLyogMHgwMTU2OgkJcmVzZXJ2ZWQgKi8KKy8qCUIyX1RTVF9DVFJMXzIJMHgwMTU3CShNTCkJIDggYml0CVRlc3QgQ29udHJvbCBSZWdpc3RlciAyICovCisJCQkJCS8qIEJpdCA3Li40OglyZXNlcnZlZCAqLworCQkJCQkvKiBmb3JjZSB0aGUgZm9sbG93aW5nIGVycm9yIG9uICovCisJCQkJCS8qIHRoZSBuZXh0IG1hc3RlciByZWFkL3dyaXRlCSovCisjZGVmaW5lIFRTVF9GUkNfRFBFUlJfTVI2NAkoMTw8MykJLyogQml0IDM6CURhdGFQRVJSIFJEIDY0CSovCisjZGVmaW5lIFRTVF9GUkNfRFBFUlJfTVc2NAkoMTw8MikJLyogQml0IDI6CURhdGFQRVJSIFdSIDY0CSovCisjZGVmaW5lIFRTVF9GUkNfQVBFUlJfMU02NAkoMTw8MSkJLyogQml0IDE6CUFkZHJQRVJSIG9uIDEuIHBoYXNlICovCisjZGVmaW5lIFRTVF9GUkNfQVBFUlJfMk02NAkoMTw8MCkJLyogQml0IDA6CUFkZHJQRVJSIG9uIDIuIHBoYXNlICovCisKKy8qCUIyX0kyQ19DVFJMCTB4MDE1OAkoTUwpCTMyIGJpdAlJMkMgQ29udHJvbCBSZWdpc3RlcgkgICAgICAgKi8KKyNkZWZpbmUJSTJDX0ZMQUcJKDFMPDwzMSkJLyogQml0IDMxOglTdGFydCByZWFkL3dyaXRlIGlmIFdSICovCisjZGVmaW5lIEkyQ19BRERSCSgweDdmZmZMPDwxNikJLyogQml0IDMwLi4xNjoJQWRkciB0byBiZSByZWFkL3dyaXR0ZW4qLworI2RlZmluZQlJMkNfREVWX1NFTAkoMHg3Zkw8PDkpCS8qIEJpdCAgOS4uMTU6CUkyQyBEZXZpY2UgU2VsZWN0ICAgICAgKi8KKwkJCQkJLyogQml0ICA1Li4gODoJcmVzZXJ2ZWQJICAgICAgICovCisjZGVmaW5lIEkyQ19CVVJTVF9MRU4JKDFMPDw0KQkJLyogQml0ICA0CUJ1cnN0IExlbiwgMS80IGJ5dGVzICAgKi8KKyNkZWZpbmUgSTJDX0RFVl9TSVpFCSg3TDw8MSkJCS8qIEJpdAkxLi4gMzoJSTJDIERldmljZSBTaXplCSAgICAgICAqLworI2RlZmluZSBJMkNfMDI1S19ERVYJKDBMPDwxKQkJLyoJCTA6IDI1NiBCeXRlcyBvciBzbWFsbGVyKi8KKyNkZWZpbmUgSTJDXzA1S19ERVYJKDFMPDwxKQkJLyogCQkxOiA1MTIJQnl0ZXMJICAgICAgICovCisjZGVmaW5lCUkyQ18xS19ERVYJKDJMPDwxKQkJLyoJCTI6IDEwMjQgQnl0ZXMJICAgICAgICovCisjZGVmaW5lIEkyQ18yS19ERVYJKDNMPDwxKQkJLyoJCTM6IDIwNDgJQnl0ZXMJICAgICAgICovCisjZGVmaW5lCUkyQ180S19ERVYJKDRMPDwxKQkJLyoJCTQ6IDQwOTYgQnl0ZXMJICAgICAgICovCisjZGVmaW5lCUkyQ184S19ERVYJKDVMPDwxKQkJLyoJCTU6IDgxOTIgQnl0ZXMJICAgICAgICovCisjZGVmaW5lCUkyQ18xNktfREVWCSg2TDw8MSkJCS8qCQk2OiAxNjM4NCBCeXRlcwkgICAgICAgKi8KKyNkZWZpbmUJSTJDXzMyS19ERVYJKDdMPDwxKQkJLyoJCTc6IDMyNzY4IEJ5dGVzCSAgICAgICAqLworI2RlZmluZSBJMkNfU1RPUF9CSVQJKDE8PDApCQkvKiBCaXQgIDA6CUludGVycnVwdCBJMkMgdHJhbnNmZXIgKi8KKworLyoKKyAqIEkyQyBBZGRyZXNzZXMKKyAqCisgKiBUaGUgdGVtcGVyYXR1cmUgc2Vuc29yIGFuZCB0aGUgdm9sdGFnZSBzZW5zb3IgYXJlIG9uIHRoZSBzYW1lIEkyQyBidXMuCisgKiBOb3RlOiBUaGUgdm9sdGFnZSBzZW5zb3IgKE1pY29yd2lyZSkgd2lsbCBiZSBzZWxlY3RlZCBieSBQQ0lfRVhUX1BBVENIXzEKKyAqCSBpbiBQQ0lfT1VSX1JFRyAxLgorICovCisjZGVmaW5lCUkyQ19BRERSX1RFTVAJMHg5MAkvKiBJMkMgQWRkcmVzcyBUZW1wZXJhdHVyZSBTZW5zb3IgKi8KKworLyoJQjJfSTJDX0RBVEEJMHgwMTVjCShNTCkJMzIgYml0CUkyQyBEYXRhIFJlZ2lzdGVyICovCisKKy8qCUI0X1IxX0QJCTQqMzIgYml0IGN1cnJlbnQgcmVjZWl2ZSBEZXNjcmlwdG9yCShxMSkgKi8KKy8qCUI0X1IxX0RBCTMyIGJpdCBjdXJyZW50IHJlYyBkZXNjIGFkZHJlc3MJCShxMSkgKi8KKy8qCUI0X1IxX0FDCTMyIGJpdCBjdXJyZW50IHJlY2VpdmUgQWRkcmVzcyBDb3VudAkocTEpICovCisvKglCNF9SMV9CQwkzMiBiaXQgY3VycmVudCByZWNlaXZlIEJ5dGUgQ291bnRlcgkocTEpICovCisvKglCNF9SMV9DU1IJMzIgYml0IEJNVSBDb250cm9sL1N0YXR1cyBSZWdpc3RlcgkocTEpICovCisvKglCNF9SMV9GCQkzMiBiaXQgZmxhZyByZWdpc3RlcgkJCShxMSkgKi8KKy8qCUI0X1IxX1QxCTMyIGJpdCBUZXN0IFJlZ2lzdGVyIDEJCSAJKHExKSAqLworLyoJQjRfUjFfVDIJMzIgYml0IFRlc3QgUmVnaXN0ZXIgMgkJIAkocTEpICovCisvKglCNF9SMV9UMwkzMiBiaXQgVGVzdCBSZWdpc3RlciAzCQkgCShxMSkgKi8KKy8qCUI0X1IyX0QJCTQqMzIgYml0IGN1cnJlbnQgcmVjZWl2ZSBEZXNjcmlwdG9yCShxMikgKi8KKy8qCUI0X1IyX0RBCTMyIGJpdCBjdXJyZW50IHJlYyBkZXNjIGFkZHJlc3MJCShxMikgKi8KKy8qCUI0X1IyX0FDCTMyIGJpdCBjdXJyZW50IHJlY2VpdmUgQWRkcmVzcyBDb3VudAkocTIpICovCisvKglCNF9SMl9CQwkzMiBiaXQgY3VycmVudCByZWNlaXZlIEJ5dGUgQ291bnRlcgkocTIpICovCisvKglCNF9SMl9DU1IJMzIgYml0IEJNVSBDb250cm9sL1N0YXR1cyBSZWdpc3RlcgkocTIpICovCisvKglCNF9SMl9GCQkzMiBiaXQgZmxhZyByZWdpc3RlcgkJCShxMikgKi8KKy8qCUI0X1IyX1QxCTMyIGJpdCBUZXN0IFJlZ2lzdGVyIDEJCQkocTIpICovCisvKglCNF9SMl9UMgkzMiBiaXQgVGVzdCBSZWdpc3RlciAyCQkJKHEyKSAqLworLyoJQjRfUjJfVDMJMzIgYml0IFRlc3QgUmVnaXN0ZXIgMwkJCShxMikgKi8KKy8qCUI1X1hBX0QJCTQqMzIgYml0IGN1cnJlbnQgcmVjZWl2ZSBEZXNjcmlwdG9yCSh4YSkgKi8KKy8qCUI1X1hBX0RBCTMyIGJpdCBjdXJyZW50IHJlYyBkZXNjIGFkZHJlc3MJCSh4YSkgKi8KKy8qCUI1X1hBX0FDCTMyIGJpdCBjdXJyZW50IHJlY2VpdmUgQWRkcmVzcyBDb3VudAkoeGEpICovCisvKglCNV9YQV9CQwkzMiBiaXQgY3VycmVudCByZWNlaXZlIEJ5dGUgQ291bnRlcgkoeGEpICovCisvKglCNV9YQV9DU1IJMzIgYml0IEJNVSBDb250cm9sL1N0YXR1cyBSZWdpc3RlcgkoeGEpICovCisvKglCNV9YQV9GCQkzMiBiaXQgZmxhZyByZWdpc3RlcgkJCSh4YSkgKi8KKy8qCUI1X1hBX1QxCTMyIGJpdCBUZXN0IFJlZ2lzdGVyIDEJCQkoeGEpICovCisvKglCNV9YQV9UMgkzMiBiaXQgVGVzdCBSZWdpc3RlciAyCQkJKHhhKSAqLworLyoJQjVfWEFfVDMJMzIgYml0IFRlc3QgUmVnaXN0ZXIgMwkJCSh4YSkgKi8KKy8qCUI1X1hTX0QJCTQqMzIgYml0IGN1cnJlbnQgcmVjZWl2ZSBEZXNjcmlwdG9yCSh4cykgKi8KKy8qCUI1X1hTX0RBCTMyIGJpdCBjdXJyZW50IHJlYyBkZXNjIGFkZHJlc3MJCSh4cykgKi8KKy8qCUI1X1hTX0FDCTMyIGJpdCBjdXJyZW50IHJlY2VpdmUgQWRkcmVzcyBDb3VudAkoeHMpICovCisvKglCNV9YU19CQwkzMiBiaXQgY3VycmVudCByZWNlaXZlIEJ5dGUgQ291bnRlcgkoeHMpICovCisvKglCNV9YU19DU1IJMzIgYml0IEJNVSBDb250cm9sL1N0YXR1cyBSZWdpc3RlcgkoeHMpICovCisvKglCNV9YU19GCQkzMiBiaXQgZmxhZyByZWdpc3RlcgkJCSh4cykgKi8KKy8qCUI1X1hTX1QxCTMyIGJpdCBUZXN0IFJlZ2lzdGVyIDEJCQkoeHMpICovCisvKglCNV9YU19UMgkzMiBiaXQgVGVzdCBSZWdpc3RlciAyCQkJKHhzKSAqLworLyoJQjVfWFNfVDMJMzIgYml0IFRlc3QgUmVnaXN0ZXIgMwkJCSh4cykgKi8KKy8qCUI1Xzx4eD5fQ1NSCTMyIGJpdCBCTVUgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIJKHh4KSAqLworI2RlZmluZQlDU1JfREVTQ19DTEVBUgkoMUw8PDIxKSAgICAvKiBCaXQgMjE6CUNsZWFyIFJlc2V0IGZvciBEZXNjciAqLworI2RlZmluZQlDU1JfREVTQ19TRVQJKDFMPDwyMCkgICAgLyogQml0IDIwOglTZXQgUmVzZXQgZm9yIERlc2NyICovCisjZGVmaW5lCUNTUl9GSUZPX0NMRUFSCSgxTDw8MTkpICAgIC8qIEJpdCAxOToJQ2xlYXIgUmVzZXQgZm9yIEZJRk8gKi8KKyNkZWZpbmUJQ1NSX0ZJRk9fU0VUCSgxTDw8MTgpICAgIC8qIEJpdCAxODoJU2V0IFJlc2V0IGZvciBGSUZPICovCisjZGVmaW5lCUNTUl9IUElfUlVOCSgxTDw8MTcpICAgIC8qIEJpdCAxNzoJUmVsZWFzZSBIUEkgU00gKi8KKyNkZWZpbmUJQ1NSX0hQSV9SU1QJKDFMPDwxNikgICAgLyogQml0IDE2OglSZXNldCBIUEkgU00gdG8gSWRsZSAqLworI2RlZmluZQlDU1JfU1ZfUlVOCSgxTDw8MTUpICAgIC8qIEJpdCAxNToJUmVsZWFzZSBTdXBlcnZpc29yIFNNICovCisjZGVmaW5lCUNTUl9TVl9SU1QJKDFMPDwxNCkgICAgLyogQml0IDE0OglSZXNldCBTdXBlcnZpc29yIFNNICovCisjZGVmaW5lCUNTUl9EUkVBRF9SVU4JKDFMPDwxMykgICAgLyogQml0IDEzOglSZWxlYXNlIERlc2NyIFJlYWQgU00gKi8KKyNkZWZpbmUJQ1NSX0RSRUFEX1JTVAkoMUw8PDEyKSAgICAvKiBCaXQgMTI6CVJlc2V0IERlc2NyIFJlYWQgU00gKi8KKyNkZWZpbmUJQ1NSX0RXUklURV9SVU4JKDFMPDwxMSkgICAgLyogQml0IDExOglSZWwuIERlc2NyIFdyaXRlIFNNICovCisjZGVmaW5lCUNTUl9EV1JJVEVfUlNUCSgxTDw8MTApICAgIC8qIEJpdCAxMDoJUmVzZXQgRGVzY3IgV3JpdGUgU00gKi8KKyNkZWZpbmUJQ1NSX1RSQU5TX1JVTgkoMUw8PDkpICAgICAvKiBCaXQgOToJUmVsZWFzZSBUcmFuc2ZlciBTTSAqLworI2RlZmluZQlDU1JfVFJBTlNfUlNUCSgxTDw8OCkgICAgIC8qIEJpdCA4OglSZXNldCBUcmFuc2ZlciBTTSAqLworCQkJCSAgICAvKiBCaXQgNy4uNTogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUJQ1NSX1NUQVJUCSgxTDw8NCkgICAgIC8qIEJpdCA0OglTdGFydCBSZWMvWG1pdCBRdWV1ZSAqLworI2RlZmluZQlDU1JfSVJRX0NMX1AJKDFMPDwzKSAgICAgLyogQml0IDM6CUNsZWFyIFBhcml0eSBJUlEsIFJjdiAqLworI2RlZmluZQlDU1JfSVJRX0NMX0IJKDFMPDwyKSAgICAgLyogQml0IDI6CUNsZWFyIEVPQiBJUlEgKi8KKyNkZWZpbmUJQ1NSX0lSUV9DTF9GCSgxTDw8MSkgICAgIC8qIEJpdCAxOglDbGVhciBFT0YgSVJRICovCisjZGVmaW5lCUNTUl9JUlFfQ0xfQwkoMUw8PDApICAgICAvKiBCaXQgMDoJQ2xlYXIgRVJSIElSUSAqLworCisjZGVmaW5lIENTUl9TRVRfUkVTRVQJKENTUl9ERVNDX1NFVHxDU1JfRklGT19TRVR8Q1NSX0hQSV9SU1R8Q1NSX1NWX1JTVHxcCisJCQlDU1JfRFJFQURfUlNUfENTUl9EV1JJVEVfUlNUfENTUl9UUkFOU19SU1QpCisjZGVmaW5lIENTUl9DTFJfUkVTRVQJKENTUl9ERVNDX0NMRUFSfENTUl9GSUZPX0NMRUFSfENTUl9IUElfUlVOfENTUl9TVl9SVU58XAorCQkJQ1NSX0RSRUFEX1JVTnxDU1JfRFdSSVRFX1JVTnxDU1JfVFJBTlNfUlVOKQorCisKKy8qCUI1Xzx4eD5fRgkzMiBiaXQgZmxhZyByZWdpc3RlcgkJICh4eCkgKi8KKwkJCQkJLyogQml0IDI4Li4zMToJcmVzZXJ2ZWQJICAgICAgKi8KKyNkZWZpbmUgRl9BTE1fRlVMTAkoMUw8PDI3KQkvKiBCaXQgMjc6IChNTCkJRklGTyBhbG1vc3QgZnVsbCAgICAgICovCisjZGVmaW5lIEZfRklGT19FT0YJKDFMPDwyNikJLyogQml0IDI2OiAoTUwpCUZhZyBiaXQgaW4gRklGTyAgICAgICAqLworI2RlZmluZSBGX1dNX1JFQUNIRUQJKDFMPDwyNSkJLyogQml0IDI1OiAoTUwpCVdhdGVybWFyayByZWFjaGVkICAgICAqLworI2RlZmluZSBGX1VQX0RXX1VTRUQJKDFMPDwyNCkJLyogQml0IDI0OiAoTUwpIFVwcGVyIER3b3JkIHVzZWQgKGJ1ZykqLworCQkJCQkvKiBCaXQgMjM6IAlyZXNlcnZlZAkgICAgICAqLworI2RlZmluZSBGX0ZJRk9fTEVWRUwJKDB4MWZMPDwxNikJLyogQml0IDE2Li4yMjooTUwpICMgb2YgUXdvcmRzIGluIEZJRk8qLworCQkJCQkvKiBCaXQgIDguLjE1OiAJcmVzZXJ2ZWQJICAgICAgKi8KKyNkZWZpbmUgRl9NTF9XQVRFUl9NCTB4MDAwMGZmTAkvKiBCaXQgIDAuLiA3OihNTCkgV2F0ZXJtYXJrCSAgICAgICovCisjZGVmaW5lCUZMQUdfV0FURVIJMHgwMDAwMWZMCS8qIEJpdCA0Li4wOihEVikgTGV2ZWwgb2YgcmVxIGRhdGEgdHIuKi8KKworLyoJQjVfPHh4Pl9UMQkzMiBiaXQgVGVzdCBSZWdpc3RlciAxCQkgKHh4KSAqLworLyoJCUhvbGRzIGZvdXIgU3RhdGUgTWFjaGluZSBjb250cm9sIEJ5dGVzICovCisjZGVmaW5lCVNNX0NSVExfU1YJKDB4ZmZMPDwyNCkgLyogQml0IDMxLi4yNDogIENvbnRyb2wgU3VwZXJ2aXNvciBTTSAqLworI2RlZmluZQlTTV9DUlRMX1JECSgweGZmTDw8MTYpIC8qIEJpdCAyMy4uMTY6ICBDb250cm9sIFJlYWQgRGVzYyBTTSAqLworI2RlZmluZQlTTV9DUlRMX1dSCSgweGZmTDw8OCkgIC8qIEJpdCAxNS4uODogICBDb250cm9sIFdyaXRlIERlc2MgU00gKi8KKyNkZWZpbmUJU01fQ1JUTF9UUgkoMHhmZkw8PDApICAvKiBCaXQgNy4uMDogICAgQ29udHJvbCBUcmFuc2ZlciBTTSAqLworCisvKglCNF88eHg+X1QxX1RSCTggYml0IFRlc3QgUmVnaXN0ZXIgMSBUUgkJKHh4KSAqLworLyoJQjRfPHh4Pl9UMV9XUgk4IGJpdCBUZXN0IFJlZ2lzdGVyIDEgV1IJCSh4eCkgKi8KKy8qCUI0Xzx4eD5fVDFfUkQJOCBiaXQgVGVzdCBSZWdpc3RlciAxIFJECQkoeHgpICovCisvKglCNF88eHg+X1QxX1NWCTggYml0IFRlc3QgUmVnaXN0ZXIgMSBTVgkJKHh4KSAqLworLyogVGhlIGNvbnRyb2wgc3RhdHVzIGJ5dGUgb2YgZWFjaCBtYWNoaW5lIGxvb2tzIGxpa2UgLi4uICovCisjZGVmaW5lCVNNX1NUQVRFCTB4ZjAJLyogQml0IDcuLjQ6CVN0YXRlIHdoaWNoIHNoYWxsIGJlIGxvYWRlZCAqLworI2RlZmluZQlTTV9MT0FECQkweDA4CS8qIEJpdCAzOglMb2FkIHRoZSBTTSB3aXRoIFNNX1NUQVRFICovCisjZGVmaW5lCVNNX1RFU1RfT04JMHgwNAkvKiBCaXQgMjoJU3dpdGNoIG9uIFNNIFRlc3QgTW9kZSAqLworI2RlZmluZQlTTV9URVNUX09GRgkweDAyCS8qIEJpdCAxOglHbyBvZmYgdGhlIFRlc3QgTW9kZSAqLworI2RlZmluZQlTTV9TVEVQCQkweDAxCS8qIEJpdCAwOglTdGVwIHRoZSBTdGF0ZSBNYWNoaW5lICovCisKKy8qIFRoZSBjb2Rpbmcgb2YgdGhlIHN0YXRlcyAqLworI2RlZmluZQlTTV9TVl9JRExFCTB4MAkvKiBTdXBlcnZpc29yCUlkbGUJCVRyL1JlCSAgICAgKi8KKyNkZWZpbmUJU01fU1ZfUkVTX1NUQVJUCTB4MQkvKiBTdXBlcnZpc29yCVJlc19TdGFydAlUci9SZQkgICAgICovCisjZGVmaW5lCVNNX1NWX0dFVF9ERVNDCTB4MwkvKiBTdXBlcnZpc29yCUdldF9EZXNjCVRyL1JlCSAgICAgKi8KKyNkZWZpbmUJU01fU1ZfQ0hFQ0sJMHgyCS8qIFN1cGVydmlzb3IJQ2hlY2sJCVRyL1JlCSAgICAgKi8KKyNkZWZpbmUJU01fU1ZfTU9WX0RBVEEJMHg2CS8qIFN1cGVydmlzb3IJTW92ZV9EYXRhCVRyL1JlCSAgICAgKi8KKyNkZWZpbmUJU01fU1ZfUFVUX0RFU0MJMHg3CS8qIFN1cGVydmlzb3IJUHV0X0Rlc2MJVHIvUmUJICAgICAqLworI2RlZmluZQlTTV9TVl9TRVRfSVJRCTB4NQkvKiBTdXBlcnZpc29yCVNldF9JcnEJCVRyL1JlCSAgICAgKi8KKworI2RlZmluZQlTTV9SRF9JRExFCTB4MAkvKiBSZWFkIERlc2MuCUlkbGUJCVRyL1JlCSAgICAgKi8KKyNkZWZpbmUJU01fUkRfTE9BRAkweDEJLyogUmVhZCBEZXNjLglMb2FkCQlUci9SZQkgICAgICovCisjZGVmaW5lCVNNX1JEX1dBSVRfVEMJMHgzCS8qIFJlYWQgRGVzYy4JV2FpdF9UQwkJVHIvUmUJICAgICAqLworI2RlZmluZQlTTV9SRF9SU1RfRU9GCTB4NgkvKiBSZWFkIERlc2MuCVJlc2V0X0VPRgkgICBSZQkgICAgICovCisjZGVmaW5lCVNNX1JEX1dET05FX1IJMHgyCS8qIFJlYWQgRGVzYy4JV2FpdF9Eb25lCSAgIFJlCSAgICAgKi8KKyNkZWZpbmUJU01fUkRfV0RPTkVfVAkweDQJLyogUmVhZCBEZXNjLglXYWl0X0RvbmUJVHIgICAJICAgICAqLworCisjZGVmaW5lCVNNX1RSX0lETEUJMHgwCS8qIFRyYW5zLiBEYXRhCUlkbGUJCVRyL1JlCSAgICAgKi8KKyNkZWZpbmUJU01fVFJfTE9BRAkweDMJLyogVHJhbnMuIERhdGEJTG9hZAkJVHIvUmUJICAgICAqLworI2RlZmluZQlTTV9UUl9MT0FEX1JfTUwJMHgxCS8qIFRyYW5zLiBEYXRhCUxvYWQJCSAgL1JlCShNTCkgKi8KKyNkZWZpbmUJU01fVFJfV0FJVF9UQwkweDIJLyogVHJhbnMuIERhdGEJV2FpdF9UQwkJVHIvUmUJICAgICAqLworI2RlZmluZQlTTV9UUl9XRE9ORQkweDQJLyogVHJhbnMuIERhdGEJV2FpdF9Eb25lCVRyL1JlCSAgICAgKi8KKworI2RlZmluZQlTTV9XUl9JRExFCTB4MAkvKiBXcml0ZSBEZXNjLglJZGxlCQlUci9SZQkgICAgICovCisjZGVmaW5lCVNNX1dSX0FCTEVOCTB4MQkvKiBXcml0ZSBEZXNjLglBY3RfQnVmX0xlbmd0aAlUci9SZQkgICAgICovCisjZGVmaW5lCVNNX1dSX0xEX0E0CTB4MgkvKiBXcml0ZSBEZXNjLglMb2FkX0E0CQkgICBSZQkgICAgICovCisjZGVmaW5lCVNNX1dSX1JFU19PV04JMHgyCS8qIFdyaXRlIERlc2MuCVJlc19PV04JCVRyICAgCSAgICAgKi8KKyNkZWZpbmUJU01fV1JfV0FJVF9FT0YJMHgzCS8qIFdyaXRlIERlc2MuCVdhaXRfRU9GCSAgIFJlCSAgICAgKi8KKyNkZWZpbmUJU01fV1JfTERfTjJDX1IJMHg0CS8qIFdyaXRlIERlc2MuCUxvYWRfTjJDCSAgIFJlCSAgICAgKi8KKyNkZWZpbmUJU01fV1JfV0FJVF9UQ19SCTB4NQkvKiBXcml0ZSBEZXNjLglXYWl0X1RDCQkgICBSZQkgICAgICovCisjZGVmaW5lCVNNX1dSX1dBSVRfVEM0CTB4NgkvKiBXcml0ZSBEZXNjLglXYWl0X1RDNAkgICBSZQkgICAgICovCisjZGVmaW5lCVNNX1dSX0xEX0FfVAkweDYJLyogV3JpdGUgRGVzYy4JTG9hZF9BCQlUciAgIAkgICAgICovCisjZGVmaW5lCVNNX1dSX0xEX0FfUgkweDcJLyogV3JpdGUgRGVzYy4JTG9hZF9BCQkgICBSZQkgICAgICovCisjZGVmaW5lCVNNX1dSX1dBSVRfVENfVAkweDcJLyogV3JpdGUgRGVzYy4JV2FpdF9UQwkJVHIgICAJICAgICAqLworI2RlZmluZQlTTV9XUl9MRF9OMkNfVAkweGMJLyogV3JpdGUgRGVzYy4JTG9hZF9OMkMJVHIgICAJICAgICAqLworI2RlZmluZQlTTV9XUl9XRE9ORV9UCTB4OQkvKiBXcml0ZSBEZXNjLglXYWl0X0RvbmUJVHIgICAJICAgICAqLworI2RlZmluZQlTTV9XUl9XRE9ORV9SCTB4YwkvKiBXcml0ZSBEZXNjLglXYWl0X0RvbmUJICAgUmUJICAgICAqLworI2RlZmluZSBTTV9XUl9MRF9EX0FECTB4ZQkvKiBXcml0ZSBEZXNjLiAgTG9hZF9EdW1yX0EJICAgUmUJKE1MKSAqLworI2RlZmluZSBTTV9XUl9XQUlUX0RfVEMJMHhmCS8qIFdyaXRlIERlc2MuCVdhaXRfRHVtcl9UQwkgICBSZQkoTUwpICovCisKKy8qCUI1Xzx4eD5fVDIJMzIgYml0IFRlc3QgUmVnaXN0ZXIgMgkJICh4eCkgKi8KKy8qIE5vdGU6IFRoaXMgcmVnaXN0ZXIgaXMgb25seSBkZWZpbmVkIGZvciB0aGUgdHJhbnNtaXQgcXVldWVzICovCisJCQkJLyogQml0IDMxLi44OglyZXNlcnZlZCAqLworI2RlZmluZQlBQ19URVNUX09OCSgxPDw3KQkvKiBCaXQgNzoJQWRkcmVzcyBDb3VudGVyIFRlc3QgTW9kZSBvbiAqLworI2RlZmluZQlBQ19URVNUX09GRgkoMTw8NikJLyogQml0IDY6CUFkZHJlc3MgQ291bnRlciBUZXN0IE1vZGUgb2ZmKi8KKyNkZWZpbmUJQkNfVEVTVF9PTgkoMTw8NSkJLyogQml0IDU6CUJ5dGUgQ291bnRlciBUZXN0IE1vZGUgb24gKi8KKyNkZWZpbmUJQkNfVEVTVF9PRkYJKDE8PDQpCS8qIEJpdCA0OglCeXRlIENvdW50ZXIgVGVzdCBNb2RlIG9mZiAqLworI2RlZmluZQlURVNUX1NURVAwNAkoMTw8MykJLyogQml0IDM6CUluYyBBQy9EZWMgQkMgYnkgNCAqLworI2RlZmluZQlURVNUX1NURVAwMwkoMTw8MikJLyogQml0IDI6CUluYyBBQy9EZWMgQkMgYnkgMyAqLworI2RlZmluZQlURVNUX1NURVAwMgkoMTw8MSkJLyogQml0IDE6CUluYyBBQy9EZWMgQkMgYnkgMiAqLworI2RlZmluZQlURVNUX1NURVAwMQkoMTw8MCkJLyogQml0IDA6CUluYyBBQy9EZWMgQkMgYnkgMSAqLworCisvKglCNV88eHg+X1QzCTMyIGJpdCBUZXN0IFJlZ2lzdGVyIDMJCSAoeHgpICovCisvKiBOb3RlOiBUaGlzIHJlZ2lzdGVyIGlzIG9ubHkgZGVmaW5lZCBmb3IgdGhlIHRyYW5zbWl0IHF1ZXVlcyAqLworCQkJCS8qIEJpdCAzMS4uODoJcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgVDNfTVVYXzIJKDE8PDcpCS8qIEJpdCA3OiAoTUwpCU11eCBwb3NpdGlvbiBNU0IgKi8KKyNkZWZpbmUgVDNfVlJBTV8yCSgxPDw2KQkvKiBCaXQgNjogKE1MKQlWaXJ0dWFsIFJBTSBidWZmZXIgYWRkciBNU0IgKi8KKyNkZWZpbmUJVDNfTE9PUAkJKDE8PDUpCS8qIEJpdCA1OiAJU2V0IExvb3BiYWNrIChYbWl0KSAqLworI2RlZmluZQlUM19VTkxPT1AJKDE8PDQpCS8qIEJpdCA0OiAJVW5zZXQgTG9vcGJhY2sgKFhtaXQpICovCisjZGVmaW5lCVQzX01VWAkJKDM8PDIpCS8qIEJpdCAzLi4yOglNdXggcG9zaXRpb24gKi8KKyNkZWZpbmUJVDNfVlJBTQkJKDM8PDApCS8qIEJpdCAxLi4wOglWaXJ0dWFsIFJBTSBidWZmZXIgQWRkcmVzcyAqLworCisvKiBQQ0kgY2FyZCBJRHMgKi8KKy8qCisgKiBOb3RlOiBUaGUgZm9sbG93aW5nIDQgYnl0ZSBkZWZpbml0aW9ucyBzaGFsbCBub3QgYmUgdXNlZCEgVXNlIE9FTSBDb25jZXB0IQorICovCisjZGVmaW5lCVBDSV9WRU5EX0lEMAkweDQ4CQkvKiBQQ0kgdmVuZG9yIElEIChTeXNLb25uZWN0KSAqLworI2RlZmluZQlQQ0lfVkVORF9JRDEJMHgxMQkJLyogUENJIHZlbmRvciBJRCAoU3lzS29ubmVjdCkgKi8KKwkJCQkJLyoJCSAoSGlnaCBieXRlKSAqLworI2RlZmluZQlQQ0lfREVWX0lEMAkweDAwCQkvKiBQQ0kgZGV2aWNlIElEICovCisjZGVmaW5lCVBDSV9ERVZfSUQxCTB4NDAJCS8qIFBDSSBkZXZpY2UgSUQgKEhpZ2ggYnl0ZSkgKi8KKworLyojZGVmaW5lIFBDSV9DTEFTUwkweDAyKi8JCS8qIFBDSSBjbGFzcyBjb2RlOiBuZXR3b3JrIGRldmljZSAqLworI2RlZmluZSBQQ0lfTldfQ0xBU1MJMHgwMgkJLyogUENJIGNsYXNzIGNvZGU6IG5ldHdvcmsgZGV2aWNlICovCisjZGVmaW5lIFBDSV9TVUJfQ0xBU1MJMHgwMgkJLyogUENJIHN1YmNsYXNzIElEOiBGRERJIGRldmljZSAqLworI2RlZmluZSBQQ0lfUFJPR19JTlRGQwkweDAwCQkvKiBQQ0kgcHJvZ3JhbW1pbmcgSW50ZXJmYWNlICg9MCkgKi8KKworLyoKKyAqIGFkZHJlc3MgdHJhbnNtaXNzaW9uIGZyb20gbG9naWNhbCB0byBwaHlzaWNhbCBvZmZzZXQgYWRkcmVzcyBvbiBib2FyZAorICovCisjZGVmaW5lCUZNQShhKQkoMHgwNDAwfCgoYSk8PDIpKQkvKiBGT1JNQUMrIChyL3cpIChTTjMpICovCisjZGVmaW5lCVAxKGEpCSgweDAzODB8KChhKTw8MikpCS8qIFBMQzEgKHIvdykgKERBUykgKi8KKyNkZWZpbmUJUDIoYSkJKDB4MDYwMHwoKGEpPDwyKSkJLyogUExDMiAoci93KSAoY292ZXJlZCBieSB0aGUgU04zKSAqLworI2RlZmluZSBQUkEoYSkJKEIyX01BQ18wICsgKGEpKQkvKiBjb25maWd1cmF0aW9uIFBST00gKE1BQyBhZGRyZXNzKSAqLworCisvKgorICogRmxhc2hQcm9tIHNwZWNpZmljYXRpb24KKyAqLworI2RlZmluZQlNQVhfUEFHRVMJMHgyMDAwMEwJLyogRXZlcnkgYnl0ZSBoYXMgYSBzaW5nbGUgcGFnZSAqLworI2RlZmluZQlNQVhfRkFERFIJMQkJLyogMSBieXRlIHBlciBwYWdlICovCisKKy8qCisgKiBSZWNlaXZlIC8gVHJhbnNtaXQgQnVmZmVyIENvbnRyb2wgd29yZAorICovCisjZGVmaW5lCUJNVV9PV04JCSgxVUw8PDMxKQkvKiBPV04gYml0OiAwID09IGhvc3QsIDEgPT0gYWRhcHRlciAqLworI2RlZmluZQlCTVVfU1RGCQkoMUw8PDMwKQkvKiBTdGFydCBvZiBGcmFtZSA/CQkqLworI2RlZmluZQlCTVVfRU9GCQkoMUw8PDI5KQkvKiBFbmQgb2YgRnJhbWUgPwkJKi8KKyNkZWZpbmUJQk1VX0VOX0lSUV9FT0IJKDFMPDwyOCkJLyogRW5hYmxlICJFbmQgb2YgQnVmZmVyIiBJUlEJKi8KKyNkZWZpbmUJQk1VX0VOX0lSUV9FT0YJKDFMPDwyNykJLyogRW5hYmxlICJFbmQgb2YgRnJhbWUiIElSUQkqLworI2RlZmluZQlCTVVfREVWXzAJKDFMPDwyNikJLyogUlg6IGRvbid0IHRyYW5zZmVyIHRvIHN5c3RlbSBtZW0gKi8KKyNkZWZpbmUgQk1VX1NNVF9UWAkoMUw8PDI1KQkvKiBUWDogaWYgc2V0LCBidWZmZXIgdHlwZSBTTVRfTUJ1ZiAqLworI2RlZmluZSBCTVVfU1RfQlVGCSgxTDw8MjUpCS8qIFJYOiBjb3B5IG9mIHN0YXJ0IG9mIGZyYW1lICovCisjZGVmaW5lIEJNVV9VTlVTRUQJKDFMPDwyNCkJLyogU2V0IGlmIHRoZSBEZXNjciBpcyBjdXJyIHVudXNlZCAqLworI2RlZmluZSBCTVVfU1cJCSgzTDw8MjQpCS8qIDIgQml0cyByZXNlcnZlZCBmb3IgU1cgdXNhZ2UgKi8KKyNkZWZpbmUJQk1VX0NIRUNLCTB4MDA1NTAwMDBMCS8qIFRvIGlkZW50aWZ5IHRoZSBjb250cm9sIHdvcmQgKi8KKyNkZWZpbmUJQk1VX0JCQwkJMHgwMDAwRkZGRkwJLyogUi9UIEJ1ZmZlciBCeXRlIENvdW50ICAgICAgICAqLworCisvKgorICogcGh5c2ljYWwgYWRkcmVzcyBvZmZzZXQgKyBJTy1Qb3J0IGJhc2UgYWRkcmVzcworICovCisjaWZkZWYgTUVNX01BUFBFRF9JTworI2RlZmluZQlBRERSKGEpCQkoY2hhciBmYXIgKikgc21jLT5ody5pb3ArKGEpCisjZGVmaW5lCUFERFJTKHNtYyxhKQkoY2hhciBmYXIgKikgKHNtYyktPmh3LmlvcCsoYSkKKyNlbHNlCisjZGVmaW5lCUFERFIoYSkJKCgoYSk+PjcpID8gKG91dHAoc21jLT5ody5pb3ArQjBfUkFQLChhKT4+NyksIFwKKwkoc21jLT5ody5pb3ArKCgoYSkmMHg3Ril8KChhKT4+NyA/IDB4ODA6MCkpKSkgOiBcCisJKHNtYy0+aHcuaW9wKygoKGEpJjB4N0YpfCgoYSk+PjcgPyAweDgwOjApKSkpCisjZGVmaW5lCUFERFJTKHNtYyxhKSAoKChhKT4+NykgPyAob3V0cCgoc21jKS0+aHcuaW9wK0IwX1JBUCwoYSk+PjcpLCBcCisJKChzbWMpLT5ody5pb3ArKCgoYSkmMHg3Ril8KChhKT4+NyA/IDB4ODA6MCkpKSkgOiBcCisJKChzbWMpLT5ody5pb3ArKCgoYSkmMHg3Ril8KChhKT4+NyA/IDB4ODA6MCkpKSkKKyNlbmRpZgorCisvKgorICogRGVmaW5lIGEgbWFjcm8gdG8gYWNjZXNzIHRoZSBjb25maWd1cmF0aW9uIHNwYWNlCisgKi8KKyNkZWZpbmUgUENJX0MoYSkJQUREUihCM19DRkdfU1BDICsgKGEpKQkvKiBQQ0kgQ29uZmlnIFNwYWNlICovCisKKyNkZWZpbmUgRVhUX1IoYSkJQUREUihCNl9FWFRfUkVHICsgKGEpKQkvKiBFeHRlcm5hbCBSZWdpc3RlcnMgKi8KKworLyoKKyAqIERlZmluZSBzb21lIHZhbHVlcyBuZWVkZWQgZm9yIHRoZSBNQUMgYWRkcmVzcyAoUFJPTSkKKyAqLworI2RlZmluZQlTQV9NQUMJCSgwKQkvKiBzdGFydCBhZGRyLiBNQUNfQUQgd2l0aGluIHRoZSBQUk9NICovCisjZGVmaW5lCVBSQV9PRkYJCSgwKQkvKiBvZmZzZXQgY29ycmVjdGlvbiB3aGVuIDR0aCBieXRlIHJlYWRpbmcgKi8KKworI2RlZmluZQlTS0ZERElfUFNaCTgJLyogYWRkcmVzcyBQUk9NIHNpemUgKi8KKworI2RlZmluZQlGTV9BKGEpCUFERFIoRk1BKGEpKQkvKiBGT1JNQUMgUGx1cyBwaHlzaWNhbCBhZGRyICovCisjZGVmaW5lCVAxX0EoYSkJQUREUihQMShhKSkJLyogUExDMSAoci93KSAqLworI2RlZmluZQlQMl9BKGEpCUFERFIoUDIoYSkpCS8qIFBMQzIgKHIvdykgKERBUykgKi8KKyNkZWZpbmUgUFJfQShhKQlBRERSKFBSQShhKSkJLyogY29uZmlnLiBQUk9NIChNQUMgYWRkcmVzcykgKi8KKworLyoKKyAqIE1hY3JvIHRvIHJlYWQgdGhlIFBST00KKyAqLworI2RlZmluZQlSRUFEX1BST00oYSkJKCh1X2NoYXIpaW5wKGEpKQorCisjZGVmaW5lCUdFVF9QQUdFKGJhbmspCW91dHBkKEFERFIoQjJfRkFSKSxiYW5rKQorI2RlZmluZQlWUFBfT04oKQorI2RlZmluZQlWUFBfT0ZGKCkKKworLyoKKyAqIE5vdGU6IFZhbHVlcyBvZiB0aGUgSW50ZXJydXB0IFNvdXJjZSBSZWdpc3RlciBhcmUgZGVmaW5lZCBhYm92ZQorICovCisjZGVmaW5lIElTUl9BCQlBRERSKEIwX0lTUkMpCisjZGVmaW5lCUdFVF9JU1IoKQkJaW5wZChJU1JfQSkKKyNkZWZpbmUgR0VUX0lTUl9TTVAoaW9wKQlpbnBkKChpb3ApK0IwX0lTUkMpCisjZGVmaW5lCUNIRUNLX0lTUigpCQkoaW5wZChJU1JfQSkgJiBpbnBkKEFERFIoQjBfSU1TSykpKQorI2RlZmluZSBDSEVDS19JU1JfU01QKGlvcCkJKGlucGQoKGlvcCkrQjBfSVNSQykgJiBpbnBkKChpb3ApK0IwX0lNU0spKQorCisjZGVmaW5lCUJVU19DSEVDSygpCisKKy8qCisgKiBDTElfRkJJOglEaXNhYmxlIEJvYXJkIEludGVycnVwdHMKKyAqIFNUSV9GQkk6CUVuYWJsZSBCb2FyZCBJbnRlcnJ1cHRzCisgKi8KKyNpZm5kZWYgVU5JWAorI2RlZmluZQlDTElfRkJJKCkJb3V0cGQoQUREUihCMF9JTVNLKSwwKQorI2Vsc2UKKyNkZWZpbmUJQ0xJX0ZCSShzbWMpCW91dHBkKEFERFJTKChzbWMpLEIwX0lNU0spLDApCisjZW5kaWYKKworI2lmbmRlZiBVTklYCisjZGVmaW5lCVNUSV9GQkkoKQlvdXRwZChBRERSKEIwX0lNU0spLHNtYy0+aHcuaXNfaW1hc2spCisjZWxzZQorI2RlZmluZQlTVElfRkJJKHNtYykJb3V0cGQoQUREUlMoKHNtYyksQjBfSU1TSyksKHNtYyktPmh3LmlzX2ltYXNrKQorI2VuZGlmCisKKyNkZWZpbmUgQ0xJX0ZCSV9TTVAoaW9wKQlvdXRwZCgoaW9wKStCMF9JTVNLLDApCisjZGVmaW5lCVNUSV9GQklfU01QKHNtYyxpb3ApCW91dHBkKChpb3ApK0IwX0lNU0ssKHNtYyktPmh3LmlzX2ltYXNrKQorCisjZW5kaWYJLyogUENJICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIDEyIGJpdCB0cmFuc2ZlciAoZHdvcmQpIGNvdW50ZXI6CisgKgkoSVNBOgkyKnRyYyA9IG51bWJlciBvZiBieXRlKQorICoJKEVJU0E6CTQqdHJjID0gbnVtYmVyIG9mIGJ5dGUpCisgKgkoTUNBOgk0KnRyYyA9IG51bWJlciBvZiBieXRlKQorICovCisjZGVmaW5lCU1BWF9UUkFOUwkoMHgwZmZmKQorCisvKgorICogUEMgUElDCisgKi8KKyNkZWZpbmUJTVNUXzgyNTkgKDB4MjApCisjZGVmaW5lCVNMVl84MjU5ICgweEEwKQorCisjZGVmaW5lIFRQUwkJKDE4KQkJLyogdGlja3MgcGVyIHNlY29uZCAqLworCisvKgorICogZXJyb3IgdGltZXIgZGVmcworICovCisjZGVmaW5lCVROCQkoNCkJLyogbnVtYmVyIG9mIHN1cHBvcnRlZCB0aW1lciA9IFROKzEgKi8KKyNkZWZpbmUJU05QUE5EX1RJTUUJKDUpCS8qIGJ1ZmZlciBtZW1vcnkgYWNjZXNzIG92ZXIgbWVtLiBkYXRhIHJlZy4gKi8KKworI2RlZmluZQlNQUNfQUQJMHg0MDVhMDAwMAorCisjZGVmaW5lIE1PRFIxCUZNX0EoRk1fTURSRUcxKQkvKiBtb2RlIHJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgTU9EUjIJRk1fQShGTV9NRFJFRzIpCS8qIG1vZGUgcmVnaXN0ZXIgMiAqLworCisjZGVmaW5lIENNRFIxCUZNX0EoRk1fQ01EUkVHMSkJLyogY29tbWFuZCByZWdpc3RlciAxICovCisjZGVmaW5lIENNRFIyCUZNX0EoRk1fQ01EUkVHMikJLyogY29tbWFuZCByZWdpc3RlciAyICovCisKKworLyoKKyAqIGZ1bmN0aW9uIGRlZmluZXMKKyAqLworI2RlZmluZQlDTEVBUihpbyxtYXNrKQkJb3V0cHcoKGlvKSxpbnB3KGlvKSYofihtYXNrKSkpCisjZGVmaW5lCVNFVChpbyxtYXNrKQkJb3V0cHcoKGlvKSxpbnB3KGlvKXwobWFzaykpCisjZGVmaW5lCUdFVChpbyxtYXNrKQkJKGlucHcoaW8pJihtYXNrKSkKKyNkZWZpbmUJU0VUTUFTSyhpbyx2YWwsbWFzaykJb3V0cHcoKGlvKSwoaW5wdyhpbykgJiB+KG1hc2spKSB8ICh2YWwpKQorCisvKgorICogUEhZIFBvcnQgQSAoUEEpID0gUExDIDEKKyAqIFdpdGggU3VwZXJOZXQgMyBQSFktQSBhbmQgUEhZIFMgYXJlIGlkZW50aWNhbC4KKyAqLworI2RlZmluZQlQTEMobnAscmVnKQkoKChucCkgPT0gUEEpID8gUDJfQShyZWcpIDogUDFfQShyZWcpKQorCisvKgorICogc2V0IG1lbW9yeSBhZGRyZXNzIHJlZ2lzdGVyIGZvciB3cml0ZSBhbmQgcmVhZAorICovCisjZGVmaW5lCU1BUlcobWEpCW91dHB3KEZNX0EoRk1fTUFSVyksKHVuc2lnbmVkIGludCkobWEpKQorI2RlZmluZQlNQVJSKG1hKQlvdXRwdyhGTV9BKEZNX01BUlIpLCh1bnNpZ25lZCBpbnQpKG1hKSkKKworLyoKKyAqIHJlYWQvd3JpdGUgZnJvbS90byBtZW1vcnkgZGF0YSByZWdpc3RlcgorICovCisvKiB3cml0ZSBkb3VibGUgd29yZCAqLworI2RlZmluZQlNRFJXKGRkKQlvdXRwdyhGTV9BKEZNX01EUlUpLCh1bnNpZ25lZCBpbnQpKChkZCk+PjE2KSkgO1wKKwkJCW91dHB3KEZNX0EoRk1fTURSTCksKHVuc2lnbmVkIGludCkoZGQpKQorCisjaWZuZGVmIFdJTk5UCisvKiByZWFkIGRvdWJsZSB3b3JkICovCisjZGVmaW5lCU1EUlIoKQkJKCgobG9uZylpbnB3KEZNX0EoRk1fTURSVSkpPDwxNikgKyBpbnB3KEZNX0EoRk1fTURSTCkpKQorCisvKiByZWFkIEZPUk1BQysgMzItYml0IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZQlHRVRfU1QxKCkJKCgobG9uZylpbnB3KEZNX0EoRk1fU1QxVSkpPDwxNikgKyBpbnB3KEZNX0EoRk1fU1QxTCkpKQorI2RlZmluZQlHRVRfU1QyKCkJKCgobG9uZylpbnB3KEZNX0EoRk1fU1QyVSkpPDwxNikgKyBpbnB3KEZNX0EoRk1fU1QyTCkpKQorI2lmZGVmCVNVUEVSTkVUXzMKKyNkZWZpbmUJR0VUX1NUMygpCSgoKGxvbmcpaW5wdyhGTV9BKEZNX1NUM1UpKTw8MTYpICsgaW5wdyhGTV9BKEZNX1NUM0wpKSkKKyNlbmRpZgorI2Vsc2UKKy8qIHJlYWQgZG91YmxlIHdvcmQgKi8KKyNkZWZpbmUgTURSUigpCQlpbnAydygoRk1fQShGTV9NRFJVKSksKEZNX0EoRk1fTURSTCkpKQorCisvKiByZWFkIEZPUk1BQysgMzItYml0IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBHRVRfU1QxKCkJaW5wMncoKEZNX0EoRk1fU1QxVSkpLChGTV9BKEZNX1NUMUwpKSkKKyNkZWZpbmUgR0VUX1NUMigpCWlucDJ3KChGTV9BKEZNX1NUMlUpKSwoRk1fQShGTV9TVDJMKSkpCisjaWZkZWYJU1VQRVJORVRfMworI2RlZmluZSBHRVRfU1QzKCkJaW5wMncoKEZNX0EoRk1fU1QzVSkpLChGTV9BKEZNX1NUM0wpKSkKKyNlbmRpZgorI2VuZGlmCisKKy8qIFNwZWNpYWwgdGltZXIgbWFjcm8gZm9yIDgyYzU0ICovCisJCQkJLyogdGltZXIgYWNjZXNzIG92ZXIgZGF0YSBidXMgYml0IDguLjE1ICovCisjZGVmaW5lCU9VVF84MmM1NF9USU1FUihwb3J0LHZhbCkJb3V0cHcoVElfQShwb3J0KSwodmFsKTw8OCkKKyNkZWZpbmUJSU5fODJjNTRfVElNRVIocG9ydCkJCSgoaW5wdyhUSV9BKHBvcnQpKT4+OCkgJiAweGZmKQorCisKKyNpZmRlZglERUJVRworI2RlZmluZQlEQl9NQUMobWFjLHN0KSB7aWYgKGRlYnVnX21hYyAmIDB4MSlcCisJCQkJcHJpbnRmKCJNIikgO1wKKwkJCWlmIChkZWJ1Z19tYWMgJiAweDIpXAorCQkJCXByaW50ZigiXHRNQUMgJWQgc3RhdHVzIDB4JTA4bHhcbiIsbWFjLHN0KSA7XAorCQkJaWYgKGRlYnVnX21hYyAmIDB4NClcCisJCQkJZHBfbWFjKG1hYyxzdCkgO1wKK30KKworI2RlZmluZQlEQl9QTEMocCxpZXYpIHsJaWYgKGRlYnVnX3BsYyAmIDB4MSlcCisJCQkJcHJpbnRmKCJQIikgO1wKKwkJCWlmIChkZWJ1Z19wbGMgJiAweDIpXAorCQkJCXByaW50ZigiXHRQTEMgJXMgSW50IDB4JTA0eFxuIiwgXAorCQkJCQkocCA9PSBQQSkgPyAiQSIgOiAiQiIsIGlldikgO1wKKwkJCWlmIChkZWJ1Z19wbGMgJiAweDQpXAorCQkJCWRwX3BsYyhwLGlldikgO1wKK30KKworI2RlZmluZQlEQl9USU1FUigpIHsJaWYgKGRlYnVnX3RpbWVyICYgMHgxKVwKKwkJCQlwcmludGYoIlQiKSA7XAorCQkJaWYgKGRlYnVnX3RpbWVyICYgMHgyKVwKKwkJCQlwcmludGYoIlx0VGltZXIgSVNSXG4iKSA7XAorfQorCisjZWxzZQkvKiBubyBERUJVRyAqLworCisjZGVmaW5lCURCX01BQyhtYWMsc3QpCisjZGVmaW5lCURCX1BMQyhwLGlldikKKyNkZWZpbmUJREJfVElNRVIoKQorCisjZW5kaWYJLyogbm8gREVCVUcgKi8KKworI2RlZmluZQlJTkNfUFRSKHNwLGNwLGVwKQlpZiAoKytjcCA9PSBlcCkgY3AgPSBzcAorLyoKKyAqIHRpbWVyIGRlZnMKKyAqLworI2RlZmluZQlDT1VOVCh0KQkoKHQpPDw2KQkvKiBjb3VudGVyICovCisjZGVmaW5lCVJXX09QKG8pCSgobyk8PDQpCS8qIHJlYWQvd3JpdGUgb3BlcmF0aW9uICovCisjZGVmaW5lCVRNT0RFKG0pCSgobSk8PDEpCS8qIHRpbWVyIG1vZGUgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2gvc2tmYmlpbmMuaCBiL2RyaXZlcnMvbmV0L3NrZnAvaC9za2ZiaWluYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZDU1YWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2gvc2tmYmlpbmMuaApAQCAtMCwwICsxLDEyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZglfU0tGQklJTkNfCisjZGVmaW5lIF9TS0ZCSUlOQ18KKworI2luY2x1ZGUgImgvc3VwZXJuXzIuaCIKKworLyoKKyAqIHNwZWNpYWwgZGVmaW5lcyBmb3IgdXNlIGludG8gLmFzbSBmaWxlcworICovCisjZGVmaW5lIEVSUl9GTEFHUyAoRlNfTVNSQUJUIHwgRlNfU0VBQzIgfCBGU19TRlJNRVJSIHwgRlNfU0ZSTVRZMSkKKworI2lmZGVmCUlTQQorI2RlZmluZSBETUFfQlVTWV9DSEVDSwlDU1JBCisjZGVmaW5lCUlNQVNLX0ZBU1QJKElTX1BMSU5UMSB8IElTX1BMSU5UMiB8IElTX1RJTUlOVCkKKyNkZWZpbmUJSFJRUgkJKFJRQUErKFJRX1JSUTw8MSkpCisjZGVmaW5lCUhSUVcJCShSUUFBKyhSUV9XQTI8PDEpKQorI2RlZmluZQlIUlFBMAkJKFJRQUErKFJRX1dBMDw8MSkpCisjZGVmaW5lIEhSUVNRCQkoUlFBQSsoUlFfV1NRPDwxKSkKKyNlbmRpZgorCisjaWZkZWYJRUlTQQorI2RlZmluZQlETUFfQlVTWV9DSEVDSwlDU1JBCisjZGVmaW5lIERNQV9ISUdIX1dPUkQJMHgwNDAwCisjZGVmaW5lIERNQV9NQVNLX00JMHgwYQorI2RlZmluZSBETUFfTU9ERV9NCTB4MGIKKyNkZWZpbmUgRE1BX0JZVEVfUFRSX00JMHgwYworI2RlZmluZSBETUFfTUFTS19TCTB4MGQ0CisjZGVmaW5lIERNQV9NT0RFX1MJMHgwZDYKKyNkZWZpbmUgRE1BX0JZVEVfUFRSX1MJMHgwZDgKKyNkZWZpbmUJSU1BU0tfRkFTVAkoSVNfUExJTlQxIHwgSVNfUExJTlQyIHwgSVNfVElNSU5UIHwgSVNfVEMpCisjZW5kaWYJLyogRUlTQSAqLworCisjaWZkZWYJTUNBCisjZGVmaW5lCUlNQVNLX0ZBU1QJKElTX1BMSU5UMSB8IElTX1BMSU5UMiB8IElTX1RJTUlOVCB8IElTX1RPS0VOIHwgXAorCQkJIElTX0NIQ0tfTCB8IElTX0JVU0VSUikKKyNlbmRpZgorCisjaWZkZWYgUENJCisjZGVmaW5lCUlNQVNLX0ZBU1QJKElTX1BMSU5UMSB8IElTX1BMSU5UMiB8IElTX1RJTUlOVCB8IElTX1RPS0VOIHwgXAorCQkJIElTX01JTlRSMiB8IElTX01JTlRSMyB8IElTX1IxX1AgfCBcCisJCQkgSVNfUjFfQyB8IElTX1hBX0MgfCBJU19YU19DKQorI2VuZGlmCisKKyNpZmRlZglQQ0kKKyNkZWZpbmUJSVNSX01BU0sJKElTX01JTlRSMSB8IElTX1IxX0YgfCBJU19YU19GfCBJU19YQV9GIHwgSU1BU0tfRkFTVCkKKyNlbHNlCisjZGVmaW5lCUlTUl9NQVNLCShJU19NSU5UUjEgfCBJU19NSU5UUjIgfCBJTUFTS19GQVNUKQorI2VuZGlmCisKKyNkZWZpbmUJRk1BX0ZNX0NNRFJFRzEJRk1BKEZNX0NNRFJFRzEpCisjZGVmaW5lCUZNQV9GTV9DTURSRUcyCUZNQShGTV9DTURSRUcyKQorI2RlZmluZQlGTUFfRk1fU1RNQ0hOCUZNQShGTV9TVE1DSE4pCisjZGVmaW5lCUZNQV9GTV9SUFIJRk1BKEZNX1JQUikKKyNkZWZpbmUJRk1BX0ZNX1dQWEEwCUZNQShGTV9XUFhBMCkKKyNkZWZpbmUJRk1BX0ZNX1dQWEEyCUZNQShGTV9XUFhBMikKKyNkZWZpbmUJRk1BX0ZNX01BUlIJRk1BKEZNX01BUlIpCisjZGVmaW5lCUZNQV9GTV9NQVJXCUZNQShGTV9NQVJXKQorI2RlZmluZQlGTUFfRk1fTURSVQlGTUEoRk1fTURSVSkKKyNkZWZpbmUJRk1BX0ZNX01EUkwJRk1BKEZNX01EUkwpCisjZGVmaW5lCUZNQV9TVDFMCUZNQShGTV9TVDFMKQorI2RlZmluZQlGTUFfU1QxVQlGTUEoRk1fU1QxVSkKKyNkZWZpbmUJRk1BX1NUMkwJRk1BKEZNX1NUMkwpCisjZGVmaW5lCUZNQV9TVDJVCUZNQShGTV9TVDJVKQorI2lmZGVmCVNVUEVSTkVUXzMKKyNkZWZpbmUgRk1BX1NUM0wJRk1BKEZNX1NUM0wpCisjZGVmaW5lIEZNQV9TVDNVCUZNQShGTV9TVDNVKQorI2VuZGlmCisKKyNkZWZpbmUgVE1PREVfUlJRCVJRX1JSUQorI2RlZmluZSBUTU9ERV9XQVEyCVJRX1dBMgorI2RlZmluZQlIU1JBCQlIU1IoMCkKKworCisjZGVmaW5lIEZNQV9GTV9TVDFMCUZNQV9TVDFMCisjZGVmaW5lIEZNQV9GTV9TVDFVCUZNQV9TVDFVCisjZGVmaW5lIEZNQV9GTV9TVDJMCUZNQV9TVDJMCisjZGVmaW5lIEZNQV9GTV9TVDJVCUZNQV9TVDJVCisjaWZkZWYJU1VQRVJORVRfMworI2RlZmluZSBGTUFfRk1fU1QzTAlGTUFfU1QzTAorI2RlZmluZSBGTUFfRk1fU1QzVQlGTUFfU1QzVQorI2VuZGlmCisKKyNkZWZpbmUgRk1BX0ZNX1NXUFIJRk1BKEZNX1NXUFIpCisKKyNkZWZpbmUgRk1BX0ZNX1JQWEEwCUZNQShGTV9SUFhBMCkKKworI2RlZmluZQlGTUFfRk1fUlBYUwlGTUEoRk1fUlBYUykKKyNkZWZpbmUJRk1BX0ZNX1dQWFMJRk1BKEZNX1dQWFMpCisKKyNkZWZpbmUJRk1BX0ZNX0lNU0sxVQlGTUEoRk1fSU1TSzFVKQorI2RlZmluZQlGTUFfRk1fSU1TSzFMCUZNQShGTV9JTVNLMUwpCisKKyNkZWZpbmUJRk1BX0ZNX0VBUwlGTUEoRk1fRUFTKQorI2RlZmluZQlGTUFfRk1fRUFBMAlGTUEoRk1fRUFBMCkKKworI2RlZmluZQlUTU9ERV9XQVEwCVJRX1dBMAorI2RlZmluZSBUTU9ERV9XU1EJUlFfV1NRCisKKy8qIERlZmluZSBkZWZhdWx0IGZvciBEUlZfUENNX1NUQVRFX0NIQU5HRSAqLworI2lmbmRlZglEUlZfUENNX1NUQVRFX0NIQU5HRQorI2RlZmluZQlEUlZfUENNX1NUQVRFX0NIQU5HRShzbWMscGxjLHBfc3RhdGUpCS8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCisvKiBEZWZpbmUgZGVmYXVsdCBmb3IgRFJWX1JNVF9JTkRJQ0FUSU9OICovCisjaWZuZGVmCURSVl9STVRfSU5ESUNBVElPTgorI2RlZmluZQlEUlZfUk1UX0lORElDQVRJT04oc21jLGkpCS8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCisjZW5kaWYJLyogbl9TS0ZCSUlOQ18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9oL3NtYy5oIGIvZHJpdmVycy9uZXQvc2tmcC9oL3NtYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MzI1OTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2gvc21jLmgKQEAgLTAsMCArMSw0NzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OCwxOTk5IFN5c0tvbm5lY3QsCisgKglhIGJ1c2luZXNzIHVuaXQgb2YgU2NobmVpZGVyICYgS29jaCAmIENvLiBEYXRlbnN5c3RlbWUgR21iSC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYJX1NDTUVDTV8KKyNkZWZpbmUgX1NDTUVDTV8KKworI2lmCWRlZmluZWQoUENJKSAmJiAhZGVmaW5lZChPU0RFRikKKy8qCisgKiBJbiB0aGUgY2FzZSBvZiB0aGUgUENJIGJ1cyB0aGUgZmlsZSBvc2RlZjFzdC5oIG11c3QgYmUgcHJlc2VudAorICovCisjZGVmaW5lCU9TREVGCisjZW5kaWYKKworI2lmZGVmCVBDSQorI2lmbmRlZglTVVBFUk5FVF8zCisjZGVmaW5lCVNVUEVSTkVUXzMKKyNlbmRpZgorI2lmbmRlZglUQUdfTU9ERQorI2RlZmluZQlUQUdfTU9ERQorI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIGluY2x1ZGUgYWxsIG90aGVyIGZpbGVzIGluIHJlcXVpcmVkIG9yZGVyCisgKiB0aGUgZm9sbG93aW5nIGZpbGVzIG11c3QgaGF2ZSBiZWVuIGluY2x1ZGVkIGJlZm9yZToKKyAqCXR5cGVzLmgKKyAqCWZkZGkuaAorICovCisjaWZkZWYJT1NERUYKKyNpbmNsdWRlICJoL29zZGVmMXN0LmgiCisjZW5kaWYJLyogT1NERUYgKi8KKyNpZmRlZglPRU1fQ09OQ0VQVAorI2luY2x1ZGUgIm9lbWRlZi5oIgorI2VuZGlmCS8qIE9FTV9DT05DRVBUICovCisjaW5jbHVkZSAiaC9zbXQuaCIKKyNpbmNsdWRlICJoL2NtdGRlZi5oIgorI2luY2x1ZGUgImgvZmRkaW1pYi5oIgorI2luY2x1ZGUgImgvdGFyZ2V0aHcuaCIJCS8qIGFsbCB0YXJnZXQgaHcgZGVwZW5kZW5jaWVzICovCisjaW5jbHVkZSAiaC90YXJnZXRvcy5oIgkJLyogYWxsIHRhcmdldCBvcyBkZXBlbmRlbmNpZXMgKi8KKyNpZmRlZglFU1MKKyNpbmNsdWRlICJoL3NiYS5oIgorI2VuZGlmCisKKy8qCisgKiBFdmVudCBRdWV1ZQorICoJcXVldWUuYworICogZXZlbnRzIGFyZSBjbGFzcy92YWx1ZSBwYWlycworICoJY2xhc3MJaXMgYWRkcmVzc2VlLCBlLmcuIFJNVCwgUENNIGV0Yy4KKyAqCXZhbHVlCWlzIGNvbW1hbmQsIGUuZy4gbGluZSBzdGF0ZSBjaGFuZ2UsIHJpbmcgb3AgY2hhbmdlIGV0Yy4KKyAqLworc3RydWN0IGV2ZW50X3F1ZXVlIHsKKwl1X3Nob3J0CWNsYXNzIDsJCQkvKiBldmVudCBjbGFzcyAqLworCXVfc2hvcnQJZXZlbnQgOwkJCS8qIGV2ZW50IHZhbHVlICovCit9IDsKKworLyoKKyAqIGRlZmluZSBldmVudCBxdWV1ZSBhcyBjaXJjdWxhciBidWZmZXIKKyAqLworI2lmZGVmCUNPTkNFTlRSQVRPUgorI2RlZmluZSBNQVhfRVZFTlQJMTI4CisjZWxzZQkvKiBuQ09OQ0VOVFJBVE9SICovCisjZGVmaW5lIE1BWF9FVkVOVAk2NAorI2VuZGlmCS8qIG5DT05DRU5UUkFUT1IgKi8KKworc3RydWN0IHNfcXVldWUgeworCisJc3RydWN0IGV2ZW50X3F1ZXVlIGV2X3F1ZXVlW01BWF9FVkVOVF07CisJc3RydWN0IGV2ZW50X3F1ZXVlICpldl9wdXQgOworCXN0cnVjdCBldmVudF9xdWV1ZSAqZXZfZ2V0IDsKK30gOworCisvKgorICogRUNNIC0gRW50aXR5IENvb3JkaW5hdGlvbiBNYW5hZ2VtZW50CisgKiBlY20uYworICovCitzdHJ1Y3Qgc19lY20geworCXVfY2hhciBwYXRoX3Rlc3QgOwkJLyogRUNNIHBhdGggdGVzdCB2YXJpYWJsZSAqLworCXVfY2hhciBzYl9mbGFnIDsJCS8qIEVDTSBzdHVjayBieXBhc3MgKi8KKwl1X2NoYXIgRGlzY29ubmVjdEZsYWcgOwkJLyogamQgMDUtQXVnLTE5OTkgQnVnICMxMDQxOSAKKwkJCQkJICogRUNNIGRpc2Nvbm5lY3RlZCAqLworCXVfY2hhciBlY21fbGluZV9zdGF0ZSA7CQkvKiBmbGFnIHRvIGRpc3BhdGNoZXIgOiBsaW5lIHN0YXRlcyAqLworCXVfbG9uZyB0cmFjZV9wcm9wIDsJCS8qIEVDTSBUcmFjZV9Qcm9wIGZsYWcgPj0gMTYgYml0cyAhISAqLworCS8qIE5VTVBIWVMgbm90ZToKKwkgKiB0aGlzIHZhcmlhYmxlIG11c3QgaGF2ZSBlbm91Z2ggYml0cyB0byBob2xkIGFsbCBlbnRpaWVzIGluCisJICogdGhlIHN0YXRpb24uIFNvIE5VTVBIWVMgbWF5IG5vdCBiZSBncmVhdGVyIHRoYW4gMzEuCisJICovCisJY2hhcgllY19wYWRbMl0gOworCXN0cnVjdCBzbXRfdGltZXIgZWNtX3RpbWVyIDsJLyogdGltZXIgKi8KK30gOworCisKKy8qCisgKiBSTVQgLSBSaW5nIE1hbmFnZW1lbnQKKyAqIHJtdC5jCisgKi8KK3N0cnVjdCBzX3JtdCB7CisJdV9jaGFyIGR1cF9hZGRyX3Rlc3QgOwkJLyogc3RhdGUgb2YgZHVwbC4gYWRkci4gdGVzdCAqLworCXVfY2hhciBkYV9mbGFnIDsJCS8qIGZsYWcgOiBkdXBsaWNhdGUgYWRkcmVzcyBkZXQuICovCisJdV9jaGFyIGxvb3BfYXZhaWwgOwkJLyogZmxhZyA6IE1BQyBhdmFpbGFibGUgZm9yIGxvb3BiYWNrICovCisJdV9jaGFyIHNtX21hX2F2YWlsIDsJCS8qIGZsYWcgOiBNQUMgYXZhaWxhYmxlIGZvciBTTVQgKi8KKwl1X2NoYXIgbm9fZmxhZyA7CQkvKiBmbGFnIDogcmluZyBub3Qgb3BlcmF0aW9uYWwgKi8KKwl1X2NoYXIgYm5fZmxhZyA7CQkvKiBmbGFnIDogTUFDIHJlYWNoZWQgYmVhY29uIHN0YXRlICovCisJdV9jaGFyIGptX2ZsYWcgOwkJLyogZmxhZyA6IGphbW1pbmcgaW4gTk9OX09QX0RVUCAqLworCXVfY2hhciBybV9qb2luIDsJCS8qIENGTSBmbGFnIFJNX0pvaW4gKi8KKwl1X2NoYXIgcm1fbG9vcCA7CQkvKiBDRk0gZmxhZyBSTV9Mb29wICovCisKKwlsb25nIGZhc3Rfcm1fam9pbiA7CQkvKiBiaXQgbWFzayBvZiBhY3RpdmUgcG9ydHMgKi8KKwkvKgorCSAqIHRpbWVyIGFuZCBmbGFncworCSAqLworCXN0cnVjdCBzbXRfdGltZXIgcm10X3RpbWVyMCA7CS8qIHRpbWVyIDAgKi8KKwlzdHJ1Y3Qgc210X3RpbWVyIHJtdF90aW1lcjEgOwkvKiB0aW1lciAxICovCisJc3RydWN0IHNtdF90aW1lciBybXRfdGltZXIyIDsJLyogdGltZXIgMiAqLworCXVfY2hhciB0aW1lcjBfZXhwIDsJCS8qIGZsYWcgOiB0aW1lciAwIGV4cGlyZWQgKi8KKwl1X2NoYXIgdGltZXIxX2V4cCA7CQkvKiBmbGFnIDogdGltZXIgMSBleHBpcmVkICovCisJdV9jaGFyIHRpbWVyMl9leHAgOwkJLyogZmxhZyA6IHRpbWVyIDIgZXhwaXJlZCAqLworCisJdV9jaGFyIHJtX3BhZDFbMV0gOworfSA7CisKKy8qCisgKiBDRk0gLSBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQKKyAqIGNmbS5jCisgKiB1c2VkIGZvciBTQVMgYW5kIERBUworICovCitzdHJ1Y3Qgc19jZm0geworCXVfY2hhciBjZl9zdGF0ZTsJCS8qIENGTSBzdGF0ZSBtYWNoaW5lIGN1cnJlbnQgc3RhdGUgKi8KKwl1X2NoYXIgY2ZfcGFkWzNdIDsKK30gOworCisvKgorICogQ0VNIC0gQ29uZmlndXJhdGlvbiBFbGVtZW50IE1hbmFnZW1lbnQKKyAqIGNlbS5jCisgKiB1c2VkIGZvciBDb25jZW50cmF0b3IKKyAqLworI2lmZGVmCUNPTkNFTlRSQVRPUgorc3RydWN0IHNfY2VtIHsKKwlpbnQJY2Vfc3RhdGUgOwkvKiBDRU0gc3RhdGUgKi8KKwlpbnQJY2VfcG9ydCA7CS8qIFBBIFBCIFBNIFBNKzEgLi4gKi8KKwlpbnQJY2VfdHlwZSA7CS8qIFRBIFRCIFRTIFRNICovCit9IDsKKworLyoKKyAqIGxpbmtlZCBsaXN0IG9mIENDRXMgaW4gY3VycmVudCB0b2tlbiBwYXRoCisgKi8KK3N0cnVjdCBzX2NfcmluZyB7CisJc3RydWN0IHNfY19yaW5nCSpjX25leHQgOworCWNoYXIJCWNfZW50aXR5IDsKK30gOworCitzdHJ1Y3QgbWliX3BhdGhfY29uZmlnIHsKKwl1X2xvbmcJZmRkaW1pYlBBVEhDb25maWdTTVRJbmRleDsKKwl1X2xvbmcJZmRkaW1pYlBBVEhDb25maWdQQVRISW5kZXg7CisJdV9sb25nCWZkZGltaWJQQVRIQ29uZmlnVG9rZW5PcmRlcjsKKwl1X2xvbmcJZmRkaW1pYlBBVEhDb25maWdSZXNvdXJjZVR5cGU7CisjZGVmaW5lIFNOTVBfUkVTX1RZUEVfTUFDCTIJLyogUmVzb3VyY2UgaXMgYSBNQUMgKi8KKyNkZWZpbmUgU05NUF9SRVNfVFlQRV9QT1JUCTQJLyogUmVzb3VyY2UgaXMgYSBQT1JUICovCisJdV9sb25nCWZkZGltaWJQQVRIQ29uZmlnUmVzb3VyY2VJbmRleDsKKwl1X2xvbmcJZmRkaW1pYlBBVEhDb25maWdDdXJyZW50UGF0aDsKKyNkZWZpbmUgU05NUF9QQVRIX0lTT0xBVEVECTEJLyogQ3VycmVudCBwYXRoIGlzIGlzb2xhdGVkICovCisjZGVmaW5lIFNOTVBfUEFUSF9MT0NBTAkJMgkvKiBDdXJyZW50IHBhdGggaXMgbG9jYWwgKi8KKyNkZWZpbmUgU05NUF9QQVRIX1NFQ09OREFSWQkzCS8qIEN1cnJlbnQgcGF0aCBpcyBzZWNvbmRhcnkgKi8KKyNkZWZpbmUgU05NUF9QQVRIX1BSSU1BUlkJNAkvKiBDdXJyZW50IHBhdGggaXMgcHJpbWFyeSAqLworI2RlZmluZSBTTk1QX1BBVEhfQ09OQ0FURU5BVEVECTUJLyogQ3VycmVudCBwYXRoIGlzIGNvbmNhdGVuYXRlZCAqLworI2RlZmluZSBTTk1QX1BBVEhfVEhSVQkJNgkvKiBDdXJyZW50IHBhdGggaXMgdGhydSAqLworfTsKKworCisjZW5kaWYKKworLyoKKyAqIFBDTSBjb25uZWN0IHN0YXRlcworICovCisjZGVmaW5lIFBDTV9ESVNBQkxFRAkwCisjZGVmaW5lIFBDTV9DT05ORUNUSU5HCTEKKyNkZWZpbmUgUENNX1NUQU5EQlkJMgorI2RlZmluZSBQQ01fQUNUSVZFCTMKKworc3RydWN0IHNfcGNtIHsKKwl1X2NoYXIJcGNtX3BhZFszXSA7Cit9IDsKKworLyoKKyAqIFBIWSBzdHJ1Y3QKKyAqIG9uZSBwZXIgcGh5c2ljYWwgcG9ydAorICovCitzdHJ1Y3Qgc19waHkgeworCS8qIEludGVyIE1vZHVsZSBHbG9iYWxzICovCisJc3RydWN0IGZkZGlfbWliX3AJKm1pYiA7CisKKwl1X2NoYXIgbnAgOwkJLyogaW5kZXggMCAuLiBOVU1QSFlTICovCisJdV9jaGFyIGNmX2pvaW4gOworCXVfY2hhciBjZl9sb29wIDsKKwl1X2NoYXIgd2NfZmxhZyA7CS8qIHdpdGhob2xkIGNvbm5lY3Rpb24gZmxhZyAqLworCXVfY2hhciBwY19tb2RlIDsJLyogSG9sZHMgdGhlIG5lZ290aWF0ZWQgbW9kZSBvZiB0aGUgUENNICovCisJdV9jaGFyIHBjX2xlbV9mYWlsIDsJLyogZmxhZyA6IExDVCBmYWlsZWQgKi8KKwl1X2NoYXIgbGNfdGVzdCA7CisJdV9jaGFyIHNjcnViIDsJCS8qIENGTSBmbGFnIFNjcnViIC0+IFBDTSAqLworCWNoYXIgcGh5X25hbWUgOworCXVfY2hhciBwbWRfdHlwZVsyXSA7CS8qIFNLIGNvbm5lY3Rvci90cmFuc2NlaXZlciB0eXBlIGNvZGVzICovCisjZGVmaW5lIFBNRF9TS19DT05OCTAJLyogcG1kX3R5cGVbUE1EX1NLX0NPTk5dID0gQ29ubmVjdG9yICovCisjZGVmaW5lIFBNRF9TS19QTUQJMQkvKiBwbWRfdHlwZVtQTURfU0tfUE1EXSA9IFh2ZXIgKi8KKwl1X2NoYXIgcG1kX3NjcmFtYmxlIDsJLyogc2NyYW1ibGVyIG9uL29mZiAqLworCisJLyogaW5uZXIgTW9kdWxlIEdsb2JhbHMgKi8KKwl1X2NoYXIgY3Vycl9scyA7CS8qIGN1cnJlbnQgbGluZSBzdGF0ZSAqLworCXVfY2hhciBsc19mbGFnIDsKKwl1X2NoYXIgcmNfZmxhZyA7CisJdV9jaGFyIHRjX2ZsYWcgOworCXVfY2hhciB0ZF9mbGFnIDsKKwl1X2NoYXIgYml0biA7CisJdV9jaGFyIHRyX2ZsYWcgOwkvKiB0cmFjZSByZWN2ZCB3aGlsZSBpbiBhY3RpdmUgKi8KKwl1X2NoYXIgdHdpc3RlZCA7CS8qIGZsYWcgdG8gaW5kaWNhdGUgYW4gQS1BIG9yIEItQiBjb25uZWN0aW9uICovCisJdV9jaGFyIHRfdmFsW05VTUJJVFNdIDsJLyogdHJhbnNtaXQgYml0cyBmb3Igc2lnbmFsaW5nICovCisJdV9jaGFyIHJfdmFsW05VTUJJVFNdIDsJLyogcmVjZWl2ZSBiaXRzIGZvciBzaWduYWxpbmcgKi8KKwl1X2xvbmcgdF9uZXh0W05VTUJJVFNdIDsKKwlzdHJ1Y3Qgc210X3RpbWVyIHBjbV90aW1lcjAgOworCXN0cnVjdCBzbXRfdGltZXIgcGNtX3RpbWVyMSA7CisJc3RydWN0IHNtdF90aW1lciBwY21fdGltZXIyIDsKKwl1X2NoYXIgdGltZXIwX2V4cCA7CisJdV9jaGFyIHRpbWVyMV9leHAgOworCXVfY2hhciB0aW1lcjJfZXhwIDsKKwl1X2NoYXIgcGNtX3BhZDFbMV0gOworCWludAljZW1fcHN0IDsJLyogQ0VNIHByaXZhZSBzdGF0ZTsgdXNlZCBmb3IgZHVhbCBob21pbmcgKi8KKwlzdHJ1Y3QgbGVtX2NvdW50ZXIgbGVtIDsKKyNpZmRlZglBTURQTEMKKwlzdHJ1Y3Qgc19wbGMJcGxjIDsKKyNlbmRpZgorfSA7CisKKy8qCisgKiB0aW1lciBwYWNrYWdlCisgKiBzbXR0aW1lci5jCisgKi8KK3N0cnVjdCBzX3RpbWVyIHsKKwlzdHJ1Y3Qgc210X3RpbWVyCSpzdF9xdWV1ZSA7CisJc3RydWN0IHNtdF90aW1lcglzdF9mYXN0IDsKK30gOworCisvKgorICogU1JGIHR5cGVzIGFuZCBkYXRhCisgKi8KKyNkZWZpbmUgU01UX0VWRU5UX0JBU0UJCQkxCisjZGVmaW5lIFNNVF9FVkVOVF9NQUNfUEFUSF9DSEFOR0UJKFNNVF9FVkVOVF9CQVNFKzApCisjZGVmaW5lIFNNVF9FVkVOVF9NQUNfTkVJR0hCT1JfQ0hBTkdFCShTTVRfRVZFTlRfQkFTRSsxKQorI2RlZmluZSBTTVRfRVZFTlRfUE9SVF9QQVRIX0NIQU5HRQkoU01UX0VWRU5UX0JBU0UrMikKKyNkZWZpbmUgU01UX0VWRU5UX1BPUlRfQ09OTkVDVElPTgkoU01UX0VWRU5UX0JBU0UrMykKKworI2RlZmluZSBTTVRfSVNfQ09ORElUSU9OKHgpCQkJKCh4KT49U01UX0NPTkRfQkFTRSkKKworI2RlZmluZSBTTVRfQ09ORF9CQVNFCQkoU01UX0VWRU5UX1BPUlRfQ09OTkVDVElPTisxKQorI2RlZmluZSBTTVRfQ09ORF9TTVRfUEVFUl9XUkFQCQkoU01UX0NPTkRfQkFTRSswKQorI2RlZmluZSBTTVRfQ09ORF9TTVRfSE9MRAkJKFNNVF9DT05EX0JBU0UrMSkKKyNkZWZpbmUgU01UX0NPTkRfTUFDX0ZSQU1FX0VSUk9SCShTTVRfQ09ORF9CQVNFKzIpCisjZGVmaW5lIFNNVF9DT05EX01BQ19EVVBfQUREUgkJKFNNVF9DT05EX0JBU0UrMykKKyNkZWZpbmUgU01UX0NPTkRfTUFDX05PVF9DT1BJRUQJCShTTVRfQ09ORF9CQVNFKzQpCisjZGVmaW5lIFNNVF9DT05EX1BPUlRfRUJfRVJST1IJCShTTVRfQ09ORF9CQVNFKzUpCisjZGVmaW5lIFNNVF9DT05EX1BPUlRfTEVSCQkoU01UX0NPTkRfQkFTRSs2KQorCisjZGVmaW5lIFNSMF9XQUlUCTAKKyNkZWZpbmUgU1IxX0hPTERPRkYJMQorI2RlZmluZSBTUjJfRElTQUJMRUQJMgorCitzdHJ1Y3Qgc19zcmYgeworCXVfbG9uZwlTUlRocmVzaG9sZCA7CQkJLyogdGhyZXNob2xkIHZhbHVlICovCisJdV9jaGFyCVJUX0ZsYWcgOwkJCS8qIHJlcG9ydCB0cmFuc21pdHRlZCBmbGFnICovCisJdV9jaGFyCXNyX3N0YXRlIDsJCQkvKiBzdGF0ZS1tYWNoaW5lICovCisJdV9jaGFyCWFueV9yZXBvcnQgOwkJCS8qIGFueSByZXBvcnQgcmVxdWlyZWQgKi8KKwl1X2xvbmcJVFNSIDsJCQkJLyogdGltZXIgKi8KKwl1X3Nob3J0CXJpbmdfc3RhdHVzIDsJCQkvKiBJQk0gcmluZyBzdGF0dXMgKi8KK30gOworCisvKgorICogSUJNIHRva2VuIHJpbmcgc3RhdHVzCisgKi8KKyNkZWZpbmUgUlNfUkVTMTUJKDE8PDE1KQkJCS8qIHJlc2VydmVkICovCisjZGVmaW5lIFJTX0hBUkRFUlJPUgkoMTw8MTQpCQkJLyogcmluZyBkb3duICovCisjZGVmaW5lIFJTX1NPRlRFUlJPUgkoMTw8MTMpCQkJLyogc2VudCBTUkYgKi8KKyNkZWZpbmUgUlNfQkVBQ09OCSgxPDwxMikJCQkvKiB0cmFuc21pdHRlZCBiZWFjb24gKi8KKyNkZWZpbmUgUlNfUEFUSFRFU1QJKDE8PDExKQkJCS8qIHBhdGggdGVzdCBmYWlsZWQgKi8KKyNkZWZpbmUgUlNfU0VMRlRFU1QJKDE8PDEwKQkJCS8qIHNlbGZ0ZXN0IHJlcXVpcmVkICovCisjZGVmaW5lIFJTX1JFUzkJCSgxPDwgOSkJCQkvKiByZXNlcnZlZCAqLworI2RlZmluZSBSU19ESVNDT05ORUNUCSgxPDwgOCkJCQkvKiByZW1vdGUgZGlzY29ubmVjdCAqLworI2RlZmluZSBSU19SRVM3CQkoMTw8IDcpCQkJLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUlNfRFVQQUREUgkoMTw8IDYpCQkJLyogZHVwbGljYXRlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUlNfTk9SSU5HT1AJKDE8PCA1KQkJCS8qIG5vIHJpbmcgb3AgKi8KKyNkZWZpbmUgUlNfVkVSU0lPTgkoMTw8IDQpCQkJLyogU01UIHZlcnNpb24gbWlzbWF0Y2ggKi8KKyNkZWZpbmUgUlNfU1RVQ0tCWVBBU1NTCSgxPDwgMykJCQkvKiBzdHVjayBieXBhc3MgKi8KKyNkZWZpbmUgUlNfRVZFTlQJKDE8PCAyKQkJCS8qIEZEREkgZXZlbnQgb2NjdXJyZWQgKi8KKyNkZWZpbmUgUlNfUklOR09QQ0hBTkdFCSgxPDwgMSkJCQkvKiByaW5nIG9wIGNoYW5nZWQgKi8KKyNkZWZpbmUgUlNfUkVTMAkJKDE8PCAwKQkJCS8qIHJlc2VydmVkICovCisKKyNkZWZpbmUgUlNfU0VUKHNtYyxiaXQpIFwKKwlyaW5nX3N0YXR1c19pbmRpY2F0aW9uKHNtYyxzbWMtPnNyZi5yaW5nX3N0YXR1cyB8PSBiaXQpCisjZGVmaW5lIFJTX0NMRUFSKHNtYyxiaXQpCVwKKwlyaW5nX3N0YXR1c19pbmRpY2F0aW9uKHNtYyxzbWMtPnNyZi5yaW5nX3N0YXR1cyAmPSB+Yml0KQorCisjZGVmaW5lIFJTX0NMRUFSX0VWRU5UCSgweGZmZmYgJiB+KFJTX05PUklOR09QKSkKKworLyogRGVmaW5lIHRoZSBBSVgtZXZlbnQtTm90aWZpY2F0aW9uIGFzIG51bGwgZnVuY3Rpb24gaWYgaXQgaXNuJ3QgZGVmaW5lZCAqLworLyogaW4gdGhlIHRhcmdldG9zLmggZmlsZSAqLworI2lmbmRlZiBBSVhfRVZFTlQKKyNkZWZpbmUgQUlYX0VWRU5UKHNtYyxvcHQwLG9wdDEsb3B0MixvcHQzKQkvKiBub3RoaW5nICovCisjZW5kaWYKKworc3RydWN0IHNfc3JmX2V2YyB7CisJdV9jaGFyCWV2Y19jb2RlIDsJCQkvKiBldmVudCBjb2RlIHR5cGUgKi8KKwl1X2NoYXIJZXZjX2luZGV4IDsJCQkvKiBpbmRleCBmb3IgbXVsdC4gaW5zdGFuY2VzICovCisJdV9jaGFyCWV2Y19yZXBfcmVxdWlyZWQgOwkJLyogcmVwb3J0IHJlcXVpcmVkICovCisJdV9zaG9ydAlldmNfcGFyYSA7CQkJLyogU01UIFBhcmEgTnVtYmVyICovCisJdV9jaGFyCSpldmNfY29uZF9zdGF0ZSA7CQkvKiBjb25kaXRpb24gc3RhdGUgKi8KKwl1X2NoYXIJKmV2Y19tdWx0aXBsZSA7CQkJLyogbXVsdGlwbGUgb2NjdXJyZW5jZSAqLworfSA7CisKKy8qCisgKiBWYWx1ZXMgdXNlZCBieSBmcmFtZSBiYXNlZCBzZXJ2aWNlcworICogc210LmMKKyAqLworI2RlZmluZSBTTVRfTUFYX1RFU1QJCTUKKyNkZWZpbmUgU01UX1RJRF9OSUYJCTAJCS8qIHBlbmRpbmcgTklGIHJlcXVlc3QgKi8KKyNkZWZpbmUgU01UX1RJRF9OSUZfVEVTVAkxCQkvKiBwZW5kaW5nIE5JRiB0ZXN0ICovCisjZGVmaW5lIFNNVF9USURfRUNGX1VOQQkJMgkJLyogcGVuZGluZyBFQ0YgVU5BIHRlc3QgKi8KKyNkZWZpbmUgU01UX1RJRF9FQ0ZfRE5BCQkzCQkvKiBwZW5kaW5nIEVDRiBETkEgdGVzdCAqLworI2RlZmluZSBTTVRfVElEX0VDRgkJNAkJLyogcGVuZGluZyBFQ0YgdGVzdCAqLworCitzdHJ1Y3Qgc210X3ZhbHVlcyB7CisJdV9sb25nCQlzbXRfdHZ1IDsJCS8qIHRpbWVyIHZhbGlkIHVuYSAqLworCXVfbG9uZwkJc210X3R2ZCA7CQkvKiB0aW1lciB2YWxpZCBkbmEgKi8KKwl1X2xvbmcJCXNtdF90aWQgOwkJLyogdHJhbnNhY3Rpb24gaWQgKi8KKwl1X2xvbmcJCXBlbmRbU01UX01BWF9URVNUXSA7CS8qIFRJRCBvZiByZXF1ZXN0cyAqLworCXVfbG9uZwkJdW5pcV90aW1lIDsJCS8qIHVuaXF1ZSB0aW1lIHN0YW1wICovCisJdV9zaG9ydAkJdW5pcV90aWNrcyAgOwkJLyogdW5pcXVlIHRpbWUgc3RhbXAgKi8KKwl1X3Nob3J0CQlwbGVhc2VfcmVjb25uZWN0IDsJLyogZmxhZyA6IHJlY29ubmVjdCAqLworCXVfbG9uZwkJc210X2xhc3RfbGVtIDsKKwl1X2xvbmcJCXNtdF9sYXN0X25vdGlmeSA7CisJc3RydWN0IHNtdF90aW1lcglzbXRfdGltZXIgOwkvKiBTTVQgTklGIHRpbWVyICovCisJdV9sb25nCQlsYXN0X3Rva190aW1lW05VTU1BQ1NdOwkvKiB0b2tlbiBjbnQgZW11bGF0aW9uICovCit9IDsKKworLyoKKyAqIFNNVC9DTVQgY29uZmlndXJhYmxlIHBhcmFtZXRlcnMKKyAqLworI2RlZmluZSBTTVRfREFTCTAJCQkvKiBkdWFsIGF0dGFjaCAqLworI2RlZmluZSBTTVRfU0FTCTEJCQkvKiBzaW5nbGUgYXR0YWNoICovCisjZGVmaW5lIFNNVF9OQUMJMgkJCS8qIG51bGwgYXR0YWNoIGNvbmNlbnRyYXRvciAqLworCitzdHJ1Y3Qgc210X2NvbmZpZyB7CisJdV9jaGFyCWF0dGFjaF9zIDsJCS8qIENGTSBhdHRhY2ggdG8gc2Vjb25kYXJ5IHBhdGggKi8KKwl1X2NoYXIJc2FzIDsJCQkvKiBTTVRfREFTL1NBUy9OQUMgKi8KKwl1X2NoYXIJYnVpbGRfcmluZ19tYXAgOwkvKiBidWlsZCByaW5nbWFwIGlmIFRSVUUgKi8KKwl1X2NoYXIJbnVtcGh5cyA7CQkvKiBudW1iZXIgb2YgYWN0aXZlIHBoeXMgKi8KKwl1X2NoYXIJc2NfcGFkWzFdIDsKKworCXVfbG9uZwlwY21fdGJfbWluIDsJCS8qIFBDTSA6IFRCX01pbiB0aW1lciB2YWx1ZSAqLworCXVfbG9uZwlwY21fdGJfbWF4IDsJCS8qIFBDTSA6IFRCX01heCB0aW1lciB2YWx1ZSAqLworCXVfbG9uZwlwY21fY19taW4gOwkJLyogUENNIDogQ19NaW4gdGltZXIgdmFsdWUgKi8KKwl1X2xvbmcJcGNtX3Rfb3V0IDsJCS8qIFBDTSA6IFRfT3V0IHRpbWVyIHZhbHVlICovCisJdV9sb25nCXBjbV90bF9taW4gOwkJLyogUENNIDogVExfbWluIHRpbWVyIHZhbHVlICovCisJdV9sb25nCXBjbV9sY19zaG9ydCA7CQkvKiBQQ00gOiBMQ19TaG9ydCB0aW1lciB2YWx1ZSAqLworCXVfbG9uZwlwY21fbGNfbWVkaXVtIDsJCS8qIFBDTSA6IExDX01lZGl1bSB0aW1lciB2YWx1ZSAqLworCXVfbG9uZwlwY21fbGNfbG9uZyA7CQkvKiBQQ00gOiBMQ19Mb25nIHRpbWVyIHZhbHVlICovCisJdV9sb25nCXBjbV9sY19leHRlbmRlZCA7CS8qIFBDTSA6IExDX0V4dGVuZGVkIHRpbWVyIHZhbHVlICovCisJdV9sb25nCXBjbV90X25leHRfOSA7CQkvKiBQQ00gOiBUX05leHRbOV0gdGltZXIgdmFsdWUgKi8KKwl1X2xvbmcJcGNtX25zX21heCA7CQkvKiBQQ00gOiBOU19NYXggdGltZXIgdmFsdWUgKi8KKworCXVfbG9uZwllY21faV9tYXggOwkJLyogRUNNIDogSV9NYXggdGltZXIgdmFsdWUgKi8KKwl1X2xvbmcJZWNtX2luX21heCA7CQkvKiBFQ00gOiBJTl9NYXggdGltZXIgdmFsdWUgKi8KKwl1X2xvbmcJZWNtX3RkX21pbiA7CQkvKiBFQ00gOiBURF9NaW4gdGltZXIgKi8KKwl1X2xvbmcJZWNtX3Rlc3RfZG9uZSA7CQkvKiBFQ00gOiBwYXRoIHRlc3QgZG9uZSB0aW1lciAqLworCXVfbG9uZwllY21fY2hlY2tfcG9sbCA7CS8qIEVDTSA6IGNoZWNrIGJ5cGFzcyBwb2xsZXIgKi8KKworCXVfbG9uZwlybXRfdF9ub25fb3AgOwkJLyogUk1UIDogVF9Ob25fT1AgdGltZXIgdmFsdWUgKi8KKwl1X2xvbmcJcm10X3Rfc3R1Y2sgOwkJLyogUk1UIDogVF9TdHVjayB0aW1lciB2YWx1ZSAqLworCXVfbG9uZwlybXRfdF9kaXJlY3QgOwkJLyogUk1UIDogVF9EaXJlY3QgdGltZXIgdmFsdWUgKi8KKwl1X2xvbmcJcm10X3RfamFtIDsJCS8qIFJNVCA6IFRfSmFtIHRpbWVyIHZhbHVlICovCisJdV9sb25nCXJtdF90X2Fubm91bmNlIDsJLyogUk1UIDogVF9Bbm5vdW5jZSB0aW1lciB2YWx1ZSAqLworCXVfbG9uZwlybXRfdF9wb2xsIDsJCS8qIFJNVCA6IGNsYWltL2JlYWNvbiBwb2xsZXIgKi8KKwl1X2xvbmcgIHJtdF9kdXBfbWFjX2JlaGF2aW9yIDsgIC8qIEZsYWcgZm9yIHRoZSBiZWF2aW9yIG9mIFNNVCBpZgorCQkJCQkgKiBhIER1cGxpY2F0ZSBNQUMgQWRkcmVzcyB3YXMgZGV0ZWN0ZWQuCisJCQkJCSAqIEZBTFNFOiBTTVQgd2lsbCBsZWF2ZSBmaW5hbHkgdGhlIHJpbmcKKwkJCQkJICogVFJVRTogIFNNVCB3aWxsIHJlaW5zdGVydCBpbnRvIHRoZSByaW5nCisJCQkJCSAqLworCXVfbG9uZwltYWNfZF9tYXggOwkJLyogTUFDIDogRF9NYXggdGltZXIgdmFsdWUgKi8KKworCXVfbG9uZyBsY3Rfc2hvcnQgOwkJLyogTENUIDogZXJyb3IgdGhyZXNoaG9sZCAqLworCXVfbG9uZyBsY3RfbWVkaXVtIDsJCS8qIExDVCA6IGVycm9yIHRocmVzaGhvbGQgKi8KKwl1X2xvbmcgbGN0X2xvbmcgOwkJLyogTENUIDogZXJyb3IgdGhyZXNoaG9sZCAqLworCXVfbG9uZyBsY3RfZXh0ZW5kZWQgOwkJLyogTENUIDogZXJyb3IgdGhyZXNoaG9sZCAqLworfSA7CisKKyNpZmRlZglERUJVRworLyoKKyAqIERlYnVnZ2luZyBzdHJ1Y3Qgc29tZXRpbWVzIHVzZWQgaW4gc21jCisgKi8KK3N0cnVjdAlzbXRfZGVidWcgeworCWludAlkX3NtdGYgOworCWludAlkX3NtdCA7CisJaW50CWRfZWNtIDsKKwlpbnQJZF9ybXQgOworCWludAlkX2NmbSA7CisJaW50CWRfcGNtIDsKKwlpbnQJZF9wbGMgOworI2lmZGVmCUVTUworCWludAlkX2VzcyA7CisjZW5kaWYKKyNpZmRlZglTQkEKKwlpbnQJZF9zYmEgOworI2VuZGlmCisJc3RydWN0CW9zX2RlYnVnCWRfb3M7CS8qIEluY2x1ZGUgc3BlY2lmaWMgT1MgREVCVUcgc3RydWN0ICovCit9IDsKKworI2lmbmRlZglERUJVR19CUkQKKy8qIGFsbCBib2FyZHMgc2hhbGwgYmUgZGVidWdnZWQgd2l0aCBvbmUgZGVidWcgc3RydWN0ICovCitleHRlcm4Jc3RydWN0CXNtdF9kZWJ1ZwlkZWJ1ZzsJLyogRGVjbGFyYXRpb24gb2YgZGVidWcgc3RydWN0ICovCisjZW5kaWYJLyogREVCVUdfQlJEICovCisKKyNlbmRpZgkvKiBERUJVRyAqLworCisvKgorICogdGhlIFNNVCBDb250ZXh0IFN0cnVjdCBTTUMKKyAqIHRoaXMgc3RydWN0IGNvbnRhaW5zIEFMTCBnbG9iYWwgdmFyaWFibGVzIG9mIFNNVAorICovCitzdHJ1Y3Qgc19zbWMgeworCXN0cnVjdCBzX3NtdF9vcwlvcyA7CQkvKiBvcyBzcGVjaWZpYyAqLworCXN0cnVjdCBzX3NtdF9odwlodyA7CQkvKiBoYXJkd2FyZSAqLworCisvKgorICogTk9URTogb3MgYW5kIGh3IE1VU1QgQkUgdGhlIGZpcnN0IHR3byBzdHJ1Y3RzCisgKiBhbnl0aGluZyBiZXlvbmQgaHcgV0lMTCBCRSBTRVQgVE8gWkVSTyBpbiBzbXRfc2V0X2RlZmF1bHRzKCkKKyAqLworCXN0cnVjdCBzbXRfY29uZmlnIHMgOwkJLyogc210IGNvbnN0YW50cyAqLworCXN0cnVjdCBzbXRfdmFsdWVzIHNtIDsJCS8qIHNtdCB2YXJpYWJsZXMgKi8KKwlzdHJ1Y3Qgc19lY20JZSA7CQkvKiBlY20gKi8KKwlzdHJ1Y3Qgc19ybXQJciA7CQkvKiBybXQgKi8KKwlzdHJ1Y3Qgc19jZm0JY2YgOwkJLyogY2ZtL2NlbSAqLworI2lmZGVmCUNPTkNFTlRSQVRPUgorCXN0cnVjdCBzX2NlbQljZVtOVU1QSFlTXSA7CS8qIGNlbSAqLworCXN0cnVjdCBzX2NfcmluZwljcltOVU1QSFlTK05VTU1BQ1NdIDsKKyNlbmRpZgorCXN0cnVjdCBzX3BjbQlwIDsJCS8qIHBjbSAqLworCXN0cnVjdCBzX3BoeQl5W05VTVBIWVNdIDsJLyogcGh5ICovCisJc3RydWN0IHNfcXVldWUJcSA7CQkvKiBxdWV1ZSAqLworCXN0cnVjdCBzX3RpbWVyCXQgOwkJLyogdGltZXIgKi8KKwlzdHJ1Y3Qgc19zcmYgc3JmIDsJCS8qIFNSRiAqLworCXN0cnVjdCBzX3NyZl9ldmMgZXZjc1s2K05VTVBIWVMqNF0gOworCXN0cnVjdCBmZGRpX21pYgltaWIgOwkJLyogX19USEVfTUlCX18gKi8KKyNpZmRlZglTQkEKKwlzdHJ1Y3Qgc19zYmEJc2JhIDsJCS8qIFNCQSB2YXJpYWJsZXMgKi8KKyNlbmRpZgorI2lmZGVmCUVTUworCXN0cnVjdCBzX2Vzcwllc3MgOwkJLyogRXNzIHZhcmlhYmxlcyAqLworI2VuZGlmCisjaWYJZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChERUJVR19CUkQpCisJLyogSWYgeW91IHdhbnQgYWxsIHNpbmdsZSBib2FyZCB0byBiZSBkZWJ1Z2dlZCBzZXBhcmF0ZWx5ICovCisJc3RydWN0IHNtdF9kZWJ1ZwlkZWJ1ZzsJLyogRGVjbGFyYXRpb24gb2YgZGVidWcgc3RydWN0ICovCisjZW5kaWYJLyogREVCVUdfQlJEICYmIERFQlVHICovCit9IDsKKworI2VuZGlmCS8qIF9TQ01FQ01fICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvaC9zbXQuaCBiL2RyaXZlcnMvbmV0L3NrZnAvaC9zbXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmY1ODk5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9oL3NtdC5oCkBAIC0wLDAgKzEsODgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJU01UIDcuMiBmcmFtZSBkZWZpbml0aW9ucworICovCisKKyNpZm5kZWYJX1NNVF8KKyNkZWZpbmUgX1NNVF8KKworLyogI2RlZmluZSBTTVQ1XzEwICovCisjZGVmaW5lIFNNVDZfMTAKKyNkZWZpbmUgU01UN18yMAorCisjZGVmaW5lCU9QVF9QTUYJCS8qIGlmIHBhcmFtZXRlciBtYW5hZ2VtZW50IGlzIHN1cHBvcnRlZCAqLworI2RlZmluZQlPUFRfU1JGCQkvKiBpZiBzdGF0dXMgcmVwb3J0IGlzIHN1cHBvcnRlZCAqLworCisvKgorICogU01UIGZyYW1lIHZlcnNpb24gNS4xCisgKi8KKworI2RlZmluZSBTTVRfVklECTB4MDAwMQkJCS8qIFYgNS4xIC4uIDYuMSAqLworI2RlZmluZSBTTVRfVklEXzIgMHgwMDAyCQkvKiBWIDcuMiAqLworCitzdHJ1Y3Qgc210X3NpZCB7CisJdV9jaGFyCXNpZF9vZW1bMl0gOwkJCS8qIGltcGxlbWVudGF0aW9uIHNwZWMuICovCisJc3RydWN0IGZkZGlfYWRkciBzaWRfbm9kZSA7CQkvKiBub2RlIGFkZHJlc3MgKi8KK30gOworCit0eXBlZGVmIHVfY2hhcgl0X3N0YXRpb25faWRbOF0gOworCisvKgorICogbm90ZSBvbiBhbGlnbm1lbnQgOgorICogc2l6ZW9mKHN0cnVjdCBzbXRfaGVhZGVyKSA9IDMyCisgKiBhbGwgcGFyYW1ldGVycyBhcmUgbG9uZyBhbGlnbmVkCisgKiBpZiBzdHJ1Y3Qgc210X2hlYWRlciBzdGFydHMgYXQgb2Zmc2V0IDAsIGFsbCBsb25ncyBhcmUgYWxpZ25lZCBjb3JyZWN0bHkKKyAqIChGQyBzdGFydHMgYXQgb2Zmc2V0IDMpCisgKi8KK19wYWNrZWQgc3RydWN0IHNtdF9oZWFkZXIgeworCXN0cnVjdCBmZGRpX2FkZHIgICAgCXNtdF9kZXN0IDsJLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworCXN0cnVjdCBmZGRpX2FkZHIJc210X3NvdXJjZSA7CS8qIHNvdXJjZSBhZGRyZXNzICovCisJdV9jaGFyCQkJc210X2NsYXNzIDsJLyogTklGLCBTSUYgLi4uICovCisJdV9jaGFyCQkJc210X3R5cGUgOwkvKiByZXEuLCByZXNwb25zZSAuLiAqLworCXVfc2hvcnQJCQlzbXRfdmVyc2lvbiA7CS8qIHZlcnNpb24gaWQgKi8KKwl1X2ludAkJCXNtdF90aWQgOwkvKiB0cmFuc2FjdGlvbiBJRCAqLworCXN0cnVjdCBzbXRfc2lkCQlzbXRfc2lkIDsJLyogc3RhdGlvbiBJRCAqLworCXVfc2hvcnQJCQlzbXRfcGFkIDsJLyogcGFkIHdpdGggMCAqLworCXVfc2hvcnQJCQlzbXRfbGVuIDsJLyogbGVuZ3RoIG9mIGluZm8gZmllbGQgKi8KK30gOworI2RlZmluZSBTV0FQX1NNVEhFQURFUgkiNjYyc2w4c3MiCisKKyNpZgkwCisvKgorICogTUFDIEZDIHZhbHVlcworICovCisjZGVmaW5lIEZDX1NNVF9JTkZPCTB4NDEJCS8qIFNNVCBpbmZvICovCisjZGVmaW5lIEZDX1NNVF9OU0EJMHg0ZgkJLyogU01UIE5leHQgU3RhdGlvbiBBZGRyZXNzaW5nICovCisjZW5kaWYKKworCisvKgorICogdHlwZSBjb2RlcworICovCisjZGVmaW5lIFNNVF9BTk5PVU5DRQkweDAxCQkvKiBhbm5vdW5jZW1lbnQgKi8KKyNkZWZpbmUgU01UX1JFUVVFU1QJMHgwMgkJLyogcmVxdWVzdCAqLworI2RlZmluZSBTTVRfUkVQTFkJMHgwMwkJLyogcmVwbHkgKi8KKworLyoKKyAqIGNsYXNzIGNvZGVzCisgKi8KKyNkZWZpbmUgU01UX05JRgkJMHgwMQkJLyogbmVpZ2hib3IgaW5mb3JtYXRpb24gZnJhbWVzICovCisjZGVmaW5lIFNNVF9TSUZfQ09ORklHCTB4MDIJCS8qIHN0YXRpb24gaW5mb3JtYXRpb24gY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBTTVRfU0lGX09QRVIJMHgwMwkJLyogc3RhdGlvbiBpbmZvcm1hdGlvbiBvcGVyYXRpb24gKi8KKyNkZWZpbmUgU01UX0VDRgkJMHgwNAkJLyogZWNobyBmcmFtZXMgKi8KKyNkZWZpbmUgU01UX1JBRgkJMHgwNQkJLyogcmVzb3VyY2UgYWxsb2NhdGlvbiAqLworI2RlZmluZSBTTVRfUkRGCQkweDA2CQkvKiByZXF1ZXN0IGRlbmllZCAqLworI2RlZmluZSBTTVRfU1JGCQkweDA3CQkvKiBzdGF0dXMgcmVwb3J0ICovCisjZGVmaW5lIFNNVF9QTUZfR0VUCTB4MDgJCS8qIHBhcmFtZXRlciBtYW5hZ2VtZW50IGdldCAqLworI2RlZmluZSBTTVRfUE1GX1NFVAkweDA5CQkvKiBwYXJhbWV0ZXIgbWFuYWdlbWVudCBzZXQgKi8KKyNkZWZpbmUgU01UX0VTRgkJMHhmZgkJLyogZXh0ZW5kZWQgc2VydmljZSAqLworCisjZGVmaW5lIFNNVF9NQVhfRUNIT19MRU4JNDQ1OAkvKiBtYXggbGVuZ3RoIG9mIFNNVCBFY2hvICovCisjaWYJZGVmaW5lZChDT05DKSB8fCBkZWZpbmVkKENPTkNfSUkpCisjZGVmaW5lIFNNVF9URVNUX0VDSE9fTEVOCTUwCS8qIHRlc3QgbGVuZ3RoIG9mIFNNVCBFY2hvICovCisjZWxzZQorI2RlZmluZSBTTVRfVEVTVF9FQ0hPX0xFTglTTVRfTUFYX0VDSE9fTEVOCS8qIHRlc3QgbGVuZ3RoICovCisjZW5kaWYKKworI2RlZmluZSBTTVRfTUFYX0lORk9fTEVOCSg0MzUyLTIwKQkvKiBtYXggbGVuZ3RoIGZvciBTTVQgaW5mbyAqLworCisKKy8qCisgKiBwYXJhbWV0ZXIgdHlwZXMKKyAqLworCitzdHJ1Y3Qgc210X3BhcmEgeworCXVfc2hvcnQJcF90eXBlIDsJCS8qIHR5cGUgKi8KKwl1X3Nob3J0CXBfbGVuIDsJCQkvKiBsZW5ndGggb2YgcGFyYW1ldGVyICovCit9IDsKKworI2RlZmluZSBQQVJBX0xFTgkoc2l6ZW9mKHN0cnVjdCBzbXRfcGFyYSkpCisKKyNkZWZpbmUgU01UU0VUUEFSQShwLHQpCQkocCktPnBhcmEucF90eXBlID0gKHQpLFwKKwkJCQkocCktPnBhcmEucF9sZW4gPSBzaXplb2YoKihwKSkgLSBQQVJBX0xFTgorCisvKgorICogUDAxIDogVXBzdHJlYW0gTmVpZ2hib3IgQWRkcmVzcywgVU5BCisgKi8KKyNkZWZpbmUgU01UX1BfVU5BCTB4MDAwMQkJLyogdXBzdHJlYW0gbmVpZ2hib3IgYWRkcmVzcyAqLworI2RlZmluZSBTV0FQX1NNVF9QX1VOQQkiczYiCisKK3N0cnVjdCBzbXRfcF91bmEgeworCXN0cnVjdCBzbXRfcGFyYQlwYXJhIDsJCS8qIGdlbmVyaWMgcGFyYW1ldGVyIGhlYWRlciAqLworCXVfc2hvcnQJdW5hX3BhZCA7CisJc3RydWN0IGZkZGlfYWRkciB1bmFfbm9kZSA7CS8qIG5vZGUgYWRkcmVzcywgemVybyBpZiB1bmtub3duICovCit9IDsKKworLyoKKyAqIFAwMiA6IFN0YXRpb24gRGVzY3JpcHRvcgorICovCisjZGVmaW5lIFNNVF9QX1NERQkweDAwMDIJCS8qIHN0YXRpb24gZGVzY3JpcHRvciAqLworI2RlZmluZSBTV0FQX1NNVF9QX1NERQkiMTExMSIKKworI2RlZmluZSBTTVRfU0RFX1NUQVRJT04JCTAJLyogZW5kIG5vZGUgKi8KKyNkZWZpbmUgU01UX1NERV9DT05DRU5UUkFUT1IJMQkvKiBjb25jZW50cmF0b3IgKi8KKworc3RydWN0IHNtdF9wX3NkZSB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9jaGFyCXNkZV90eXBlIDsJCS8qIHN0YXRpb24gdHlwZSAqLworCXVfY2hhcglzZGVfbWFjX2NvdW50IDsJCS8qIG51bWJlciBvZiBNQUNzICovCisJdV9jaGFyCXNkZV9ub25fbWFzdGVyIDsJLyogbnVtYmVyIG9mIEEsQiBvciBTIHBvcnRzICovCisJdV9jaGFyCXNkZV9tYXN0ZXIgOwkJLyogbnVtYmVyIG9mIFMgcG9ydHMgb24gY29uYy4gKi8KK30gOworCisvKgorICogUDAzIDogU3RhdGlvbiBTdGF0ZQorICovCisjZGVmaW5lIFNNVF9QX1NUQVRFCTB4MDAwMwkJLyogc3RhdGlvbiBzdGF0ZSAqLworI2RlZmluZSBTV0FQX1NNVF9QX1NUQVRFCSJzY2MiCisKK3N0cnVjdCBzbXRfcF9zdGF0ZSB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9zaG9ydAlzdF9wYWQgOworCXVfY2hhcglzdF90b3BvbG9neSA7CQkvKiB0b3BvbG9neSAqLworCXVfY2hhcglzdF9kdXBsX2FkZHIgOwkJLyogZHVwbGljYXRlIGFkZHJlc3MgZGV0ZWN0ZWQgKi8KK30gOworI2RlZmluZSBTTVRfU1RfV1JBUFBFRAkJKDE8PDApCS8qIHN0YXRpb24gd3JhcHBlZCAqLworI2RlZmluZSBTTVRfU1RfVU5BVFRBQ0hFRAkoMTw8MSkJLyogdW5hdHRhY2hlZCBjb25jZW50cmF0b3IgKi8KKyNkZWZpbmUgU01UX1NUX1RXSVNURURfQQkoMTw8MikJLyogQS1BIGNvbm5lY3Rpb24sIHR3aXN0ZWQgcmluZyAqLworI2RlZmluZSBTTVRfU1RfVFdJU1RFRF9CCSgxPDwzKQkvKiBCLUIgY29ubmVjdGlvbiwgdHdpc3RlZCByaW5nICovCisjZGVmaW5lIFNNVF9TVF9ST09URURfUwkJKDE8PDQpCS8qIHJvb3RlZCBzdGF0aW9uICovCisjZGVmaW5lIFNNVF9TVF9TUkYJCSgxPDw1KQkvKiBTUkYgcHJvdG9jb2wgc3VwcG9ydGVkICovCisjZGVmaW5lIFNNVF9TVF9TWU5DX1NFUlZJQ0UJKDE8PDYpCS8qIHVzZSBzeW5jaHJvbm91cyBiYW5kd2lkdGggKi8KKworI2RlZmluZSBTTVRfU1RfTVlfRFVQQQkJKDE8PDApCS8qIG15IHN0YXRpb24gZGV0ZWN0ZWQgZHVwbC4gKi8KKyNkZWZpbmUgU01UX1NUX1VOQV9EVVBBCQkoMTw8MSkJLyogbXkgVU5BIGRldGVjdGVkIGR1cGxpY2F0ZSAqLworCisvKgorICogUDA0IDogdGltZXN0YW1wCisgKi8KKyNkZWZpbmUgU01UX1BfVElNRVNUQU1QCTB4MDAwNAkJLyogdGltZSBzdGFtcCAqLworI2RlZmluZSBTV0FQX1NNVF9QX1RJTUVTVEFNUAkiOCIKK3N0cnVjdCBzbXRfcF90aW1lc3RhbXAgeworCXN0cnVjdCBzbXRfcGFyYQlwYXJhIDsJCS8qIGdlbmVyaWMgcGFyYW1ldGVyIGhlYWRlciAqLworCXVfY2hhcgl0c190aW1lWzhdIDsJCS8qIHRpbWUsIHJlc29sdXRpb24gODBuUywgdW5pcXVlICovCit9IDsKKworLyoKKyAqIFAwNSA6IHN0YXRpb24gcG9saWNpZXMKKyAqLworI2RlZmluZSBTTVRfUF9QT0xJQ1kJMHgwMDA1CQkvKiBzdGF0aW9uIHBvbGljaWVzICovCisjZGVmaW5lIFNXQVBfU01UX1BfUE9MSUNZCSJzcyIKKworc3RydWN0IHNtdF9wX3BvbGljeSB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9zaG9ydAlwbF9jb25maWcgOworCXVfc2hvcnQgcGxfY29ubmVjdCA7CQkvKiBiaXQgc3RyaW5nIFBPTElDWV9BQSAuLi4gKi8KK30gOworI2RlZmluZSBTTVRfUExfSE9MRAkJMQkvKiBob2xkIHBvbGljeSBzdXBwb3J0ZWQgKER1YWwgTUFDKSAqLworCisvKgorICogUDA2IDogbGF0ZW5jeSBlcXVpdmFsZW50CisgKi8KKyNkZWZpbmUgU01UX1BfTEFURU5DWQkweDAwMDYJCS8qIGxhdGVuY3kgKi8KKyNkZWZpbmUgU1dBUF9TTVRfUF9MQVRFTkNZCSJzc3NzIgorCisvKgorICogbm90ZTogbGF0ZW5jeSBoYXMgdHdvIHBoeSBlbnRyaWVzIGJ5IGRlZmluaXRpb24KKyAqIGZvciBhIFNBUywgdGhlIDJuZCBvbmUgaXMgbnVsbAorICovCitzdHJ1Y3Qgc210X3BfbGF0ZW5jeSB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9zaG9ydAlsdF9waHlvdXRfaWR4MSA7CS8qIGluZGV4ICovCisJdV9zaG9ydAlsdF9sYXRlbmN5MSA7CQkvKiBsYXRlbmN5ICwgdW5pdCA6IGJ5dGUgY2xvY2sgKi8KKwl1X3Nob3J0CWx0X3BoeW91dF9pZHgyIDsJLyogMCBpZiBTQVMgKi8KKwl1X3Nob3J0CWx0X2xhdGVuY3kyIDsJCS8qIDAgaWYgU0FTICovCit9IDsKKworLyoKKyAqIFAwNyA6IE1BQyBuZWlnaGJvcnMKKyAqLworI2RlZmluZSBTTVRfUF9ORUlHSEJPUlMJMHgwMDA3CQkvKiBNQUMgbmVpZ2hib3IgZGVzY3JpcHRpb24gKi8KKyNkZWZpbmUgU1dBUF9TTVRfUF9ORUlHSEJPUlMJInNzNjYiCisKK3N0cnVjdCBzbXRfcF9uZWlnaGJvciB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9zaG9ydAluYl9taWJfaW5kZXggOwkJLyogTUlCIGluZGV4ICovCisJdV9zaG9ydAluYl9tYWNfaW5kZXggOwkJLyogbisxIC4uIG4rbSwgbSA9ICNNQUNzLCBuID0gI1BIWXMgKi8KKwlzdHJ1Y3QgZmRkaV9hZGRyIG5iX3VuYSA7CS8qIFVOQSAsIDAgZm9yIHVua25vd24gKi8KKwlzdHJ1Y3QgZmRkaV9hZGRyIG5iX2RuYSA7CS8qIEROQSAsIDAgZm9yIHVua25vd24gKi8KK30gOworCisvKgorICogUEhZIHJlY29yZAorICovCisjZGVmaW5lIFNNVF9QSFlfQQkwCQkvKiBBIHBvcnQgKi8KKyNkZWZpbmUgU01UX1BIWV9CCTEJCS8qIEIgcG9ydCAqLworI2RlZmluZSBTTVRfUEhZX1MJMgkJLyogc2xhdmUgcG9ydCAqLworI2RlZmluZSBTTVRfUEhZX00JMwkJLyogbWFzdGVyIHBvcnQgKi8KKworI2RlZmluZSBTTVRfQ1NfRElTQUJMRUQJMAkJLyogY29ubmVjdCBzdGF0ZSA6IGRpc2FibGVkICovCisjZGVmaW5lIFNNVF9DU19DT05ORUNUSU5HCTEJLyogY29ubmVjdCBzdGF0ZSA6IGNvbm5lY3RpbmcgKi8KKyNkZWZpbmUgU01UX0NTX1NUQU5EQlkJMgkJLyogY29ubmVjdCBzdGF0ZSA6IHN0YW5kIGJ5ICovCisjZGVmaW5lIFNNVF9DU19BQ1RJVkUJMwkJLyogY29ubmVjdCBzdGF0ZSA6IGFjdGl2ZSAqLworCisjZGVmaW5lIFNNVF9STV9OT05FCTAKKyNkZWZpbmUgU01UX1JNX01BQwkxCisKK3N0cnVjdCBzbXRfcGh5X3JlYyB7CisJdV9zaG9ydAlwaHlfbWliX2luZGV4IDsJCS8qIE1JQiBpbmRleCAqLworCXVfY2hhcglwaHlfdHlwZSA7CQkvKiBBL0IvUy9NICovCisJdV9jaGFyCXBoeV9jb25uZWN0X3N0YXRlIDsJLyogZGlzYWJsZWQvY29ubmVjdGluZy9hY3RpdmUgKi8KKwl1X2NoYXIJcGh5X3JlbW90ZV90eXBlIDsJLyogQS9CL1MvTSAqLworCXVfY2hhcglwaHlfcmVtb3RlX21hYyA7CS8qIG5vbmUvcmVtb3RlICovCisJdV9zaG9ydAlwaHlfcmVzb3VyY2VfaWR4IDsJLyogMSAuLiBuICovCit9IDsKKworLyoKKyAqIE1BQyByZWNvcmQKKyAqLworc3RydWN0IHNtdF9tYWNfcmVjIHsKKwlzdHJ1Y3QgZmRkaV9hZGRyIG1hY19hZGRyIDsJCS8qIE1BQyBhZGRyZXNzICovCisJdV9zaG9ydAkJbWFjX3Jlc291cmNlX2lkeCA7CS8qIG4rMSAuLiBuK20gKi8KK30gOworCisvKgorICogUDA4IDogcGF0aCBkZXNjcmlwdG9ycworICogc2hvdWxkIGJlIHJlYWxseSBhbiBhcnJheSA7IGhvd2V2ZXIgb3VyIGVudmlyb25tZW50IGhhcyBhIGZpeGVkIG51bWJlciBvZgorICogUEhZcyBhbmQgTUFDcworICovCisjZGVmaW5lIFNNVF9QX1BBVEgJMHgwMDA4CQkJLyogcGF0aCBkZXNjcmlwdG9yICovCisjZGVmaW5lIFNXQVBfU01UX1BfUEFUSAkiWzZzXSIKKworc3RydWN0IHNtdF9wX3BhdGggeworCXN0cnVjdCBzbXRfcGFyYQlwYXJhIDsJCS8qIGdlbmVyaWMgcGFyYW1ldGVyIGhlYWRlciAqLworCXN0cnVjdCBzbXRfcGh5X3JlYwlwZF9waHlbMl0gOwkvKiBQSFkgQSAqLworCXN0cnVjdCBzbXRfbWFjX3JlYwlwZF9tYWMgOwkvKiBNQUMgcmVjb3JkICovCit9IDsKKworLyoKKyAqIFAwOSA6IE1BQyBzdGF0dXMKKyAqLworI2RlZmluZSBTTVRfUF9NQUNfU1RBVFVTCTB4MDAwOQkJLyogTUFDIHN0YXR1cyAqLworI2RlZmluZSBTV0FQX1NNVF9QX01BQ19TVEFUVVMJInNzbGxsbGxsbGxsIgorCitzdHJ1Y3Qgc210X3BfbWFjX3N0YXR1cyB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9zaG9ydCBzdF9taWJfaW5kZXggOwkJLyogTUlCIGluZGV4ICovCisJdV9zaG9ydAlzdF9tYWNfaW5kZXggOwkJLyogbisxIC4uIG4rbSAqLworCXVfaW50CXN0X3RfcmVxIDsJCS8qIFRfUmVxICovCisJdV9pbnQJc3RfdF9uZWcgOwkJLyogVF9OZWcgKi8KKwl1X2ludAlzdF90X21heCA7CQkvKiBUX01heCAqLworCXVfaW50CXN0X3R2eF92YWx1ZSA7CQkvKiBUVlhfVmFsdWUgKi8KKwl1X2ludAlzdF90X21pbiA7CQkvKiBUX01pbiAqLworCXVfaW50CXN0X3NiYSA7CQkvKiBzeW5jaHIuIGJhbmR3aWR0aCBhbGxvYyAqLworCXVfaW50CXN0X2ZyYW1lX2N0IDsJCS8qIGZyYW1lIGNvdW50ZXIgKi8KKwl1X2ludAlzdF9lcnJvcl9jdCA7CQkvKiBlcnJvciBjb3VudGVyICovCisJdV9pbnQJc3RfbG9zdF9jdCA7CQkvKiBsb3N0IGZyYW1lcyBjb3VudGVyICovCit9IDsKKworLyoKKyAqIFAwQSA6IFBIWSBsaW5rIGVycm9yIHJhdGUgbW9uaXRvcmluZworICovCisjZGVmaW5lIFNNVF9QX0xFTQkweDAwMGEJCS8qIGxpbmsgZXJyb3IgbW9uaXRvciAqLworI2RlZmluZSBTV0FQX1NNVF9QX0xFTQkic3NjY2NjbGwiCisvKgorICogdW5pdHMgb2YgbGVtX2N1dG9mZixsZW1fYWxhcm0sbGVtX2VzdGltYXRlIDogMTAqKi14CisgKi8KK3N0cnVjdCBzbXRfcF9sZW0geworCXN0cnVjdCBzbXRfcGFyYQlwYXJhIDsJCS8qIGdlbmVyaWMgcGFyYW1ldGVyIGhlYWRlciAqLworCXVfc2hvcnQJbGVtX21pYl9pbmRleCA7CQkvKiBNSUIgaW5kZXggKi8KKwl1X3Nob3J0CWxlbV9waHlfaW5kZXggOwkJLyogMSAuLiBuICovCisJdV9jaGFyCWxlbV9wYWQyIDsJCS8qIGJlIG5pY2UgYW5kIG1ha2UgaXQgZXZlbiAuICovCisJdV9jaGFyCWxlbV9jdXRvZmYgOwkJLyogMHg0IC4uIDB4ZiwgZGVmYXVsdCAweDcgKi8KKwl1X2NoYXIJbGVtX2FsYXJtIDsJCS8qIDB4NCAuLiAweGYsIGRlZmF1bHQgMHg4ICovCisJdV9jaGFyCWxlbV9lc3RpbWF0ZSA7CQkvKiAweDAgLi4gMHhmZiAqLworCXVfaW50CWxlbV9yZWplY3RfY3QgOwkJLyogMHgwMDAwMDAwMCAuLiAweGZmZmZmZmZmICovCisJdV9pbnQJbGVtX2N0IDsJCS8qIDB4MDAwMDAwMDAgLi4gMHhmZmZmZmZmZiAqLworfSA7CisKKy8qCisgKiBQMEIgOiBNQUMgZnJhbWUgY291bnRlcnMKKyAqLworI2RlZmluZSBTTVRfUF9NQUNfQ09VTlRFUiAweDAwMGIJLyogTUFDIGZyYW1lIGNvdW50ZXJzICovCisjZGVmaW5lIFNXQVBfU01UX1BfTUFDX0NPVU5URVIJInNzbGwiCisKK3N0cnVjdCBzbXRfcF9tYWNfY291bnRlciB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9zaG9ydAltY19taWJfaW5kZXggOwkJLyogTUlCIGluZGV4ICovCisJdV9zaG9ydAltY19pbmRleCA7CQkvKiBtYWMgaW5kZXggKi8KKwl1X2ludAltY19yZWNlaXZlX2N0IDsJCS8qIHJlY2VpdmUgY291bnRlciAqLworCXVfaW50CW1jX3RyYW5zbWl0X2N0IDsJLyogdHJhbnNtaXQgY291bnRlciAqLworfSA7CisKKy8qCisgKiBQMEMgOiBNQUMgZnJhbWUgbm90IGNvcGllZCBjb3VudGVyCisgKi8KKyNkZWZpbmUgU01UX1BfTUFDX0ZOQwkweDAwMGMJCS8qIE1BQyBmcmFtZSBub3QgY29waWVkIGNvdW50ZXIgKi8KKyNkZWZpbmUgU1dBUF9TTVRfUF9NQUNfRk5DCSJzc2wiCisKK3N0cnVjdCBzbXRfcF9tYWNfZm5jIHsKKwlzdHJ1Y3Qgc210X3BhcmEJcGFyYSA7CQkvKiBnZW5lcmljIHBhcmFtZXRlciBoZWFkZXIgKi8KKwl1X3Nob3J0CW5jX21pYl9pbmRleCA7CQkvKiBNSUIgaW5kZXggKi8KKwl1X3Nob3J0CW5jX2luZGV4IDsJCS8qIG1hYyBpbmRleCAqLworCXVfaW50CW5jX2NvdW50ZXIgOwkJLyogbm90IGNvcGllZCBjb3VudGVyICovCit9IDsKKworCisvKgorICogUDBEIDogTUFDIHByaW9yaXR5IHZhbHVlcworICovCisjZGVmaW5lIFNNVF9QX1BSSU9SSVRZCTB4MDAwZAkJLyogTUFDIHByaW9yaXR5IHZhbHVlcyAqLworI2RlZmluZSBTV0FQX1NNVF9QX1BSSU9SSVRZCSJzc2wiCisKK3N0cnVjdCBzbXRfcF9wcmlvcml0eSB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9zaG9ydAlwcl9taWJfaW5kZXggOwkJLyogTUlCIGluZGV4ICovCisJdV9zaG9ydAlwcl9pbmRleCA7CQkvKiBtYWMgaW5kZXggKi8KKwl1X2ludAlwcl9wcmlvcml0eVs3XSA7CS8qIHByaW9yaXR5IHZhbHVlcyAqLworfSA7CisKKy8qCisgKiBQMEUgOiBQSFkgZWxhc3RpY2l0eSBidWZmZXIgc3RhdHVzCisgKi8KKyNkZWZpbmUgU01UX1BfRUIJMHgwMDBlCQkvKiBQSFkgRUIgc3RhdHVzICovCisjZGVmaW5lIFNXQVBfU01UX1BfRUIJInNzbCIKKworc3RydWN0IHNtdF9wX2ViIHsKKwlzdHJ1Y3Qgc210X3BhcmEJcGFyYSA7CQkvKiBnZW5lcmljIHBhcmFtZXRlciBoZWFkZXIgKi8KKwl1X3Nob3J0CWViX21pYl9pbmRleCA7CQkvKiBNSUIgaW5kZXggKi8KKwl1X3Nob3J0CWViX2luZGV4IDsJCS8qIHBoeSBpbmRleCAqLworCXVfaW50CWViX2Vycm9yX2N0IDsJCS8qICMgb2YgZWIgb3ZlcmZsb3dzICovCit9IDsKKworLyoKKyAqIFAwRiA6IG1hbnVmYWN0dXJlciBmaWVsZAorICovCisjZGVmaW5lIFNNVF9QX01BTlVGQUNUVVJFUgkweDAwMGYJLyogbWFudWZhY3R1cmVyIGZpZWxkICovCisjZGVmaW5lIFNXQVBfU01UX1BfTUFOVUZBQ1RVUkVSCSIiCisKK3N0cnVjdCBzbXBfcF9tYW51ZmFjdHVyZXIgeworCXN0cnVjdCBzbXRfcGFyYQlwYXJhIDsJCS8qIGdlbmVyaWMgcGFyYW1ldGVyIGhlYWRlciAqLworCXVfY2hhciBtZl9kYXRhWzMyXSA7CQkvKiBPVUkgKyBhcmJpdHJhcnkgZGF0YSAqLworfSA7CisKKy8qCisgKiBQMTAgOiB1c2VyIGZpZWxkCisgKi8KKyNkZWZpbmUgU01UX1BfVVNFUgkJMHgwMDEwCS8qIG1hbnVmYWN0dXJlciBmaWVsZCAqLworI2RlZmluZSBTV0FQX1NNVF9QX1VTRVIJIiIKKworc3RydWN0IHNtcF9wX3VzZXIgeworCXN0cnVjdCBzbXRfcGFyYQlwYXJhIDsJCS8qIGdlbmVyaWMgcGFyYW1ldGVyIGhlYWRlciAqLworCXVfY2hhciB1c19kYXRhWzMyXSA7CQkvKiBhcmJpdHJhcnkgZGF0YSAqLworfSA7CisKKworCisvKgorICogUDExIDogZWNobyBkYXRhCisgKi8KKyNkZWZpbmUgU01UX1BfRUNIT0RBVEEJMHgwMDExCQkvKiBlY2hvIGRhdGEgKi8KKyNkZWZpbmUgU1dBUF9TTVRfUF9FQ0hPREFUQQkiIgorCitzdHJ1Y3Qgc210X3BfZWNobyB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9jaGFyCWVjX2RhdGFbU01UX01BWF9FQ0hPX0xFTi00XSA7CS8qIGVjaG8gZGF0YSAqLworfSA7CisKKy8qCisgKiBQMTIgOiByZWFzb24gY29kZQorICovCisjZGVmaW5lIFNNVF9QX1JFQVNPTgkweDAwMTIJCS8qIHJlYXNvbiBjb2RlICovCisjZGVmaW5lIFNXQVBfU01UX1BfUkVBU09OCSJsIgorCitzdHJ1Y3Qgc210X3BfcmVhc29uIHsKKwlzdHJ1Y3Qgc210X3BhcmEJcGFyYSA7CQkvKiBnZW5lcmljIHBhcmFtZXRlciBoZWFkZXIgKi8KKwl1X2ludAlyZGZfcmVhc29uIDsJCS8qIENMQVNTL1ZFUlNJT04gKi8KK30gOworI2RlZmluZSBTTVRfUkRGX0NMQVNTCTB4MDAwMDAwMDEJLyogY2xhc3Mgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBTTVRfUkRGX1ZFUlNJT04JMHgwMDAwMDAwMgkvKiB2ZXJzaW9uIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgU01UX1JERl9TVUNDRVNTCTB4MDAwMDAwMDMJLyogc3VjY2VzcyAoUE1GKSAqLworI2RlZmluZSBTTVRfUkRGX0JBRFNFVAkweDAwMDAwMDA0CS8qIGJhZCBzZXQgY291bnQgKFBNRikgKi8KKyNkZWZpbmUgU01UX1JERl9JTExFR0FMIDB4MDAwMDAwMDUJLyogcmVhZCBvbmx5IChQTUYpICovCisjZGVmaW5lIFNNVF9SREZfTk9QQVJBTQkweDYJCS8qIHBhcmFtdGVyIG5vdCBzdXBwb3J0ZWQgKFBNRikgKi8KKyNkZWZpbmUgU01UX1JERl9SQU5HRQkweDgJCS8qIG91dCBvZiByYW5nZSAqLworI2RlZmluZSBTTVRfUkRGX0FVVEhPUgkweDkJCS8qIG5vdCBhdXRvaG9yaXplZCAqLworI2RlZmluZSBTTVRfUkRGX0xFTkdUSAkweDBhCQkvKiBsZW5ndGggZXJyb3IgKi8KKyNkZWZpbmUgU01UX1JERl9UT09MT05HCTB4MGIJCS8qIGxlbmd0aCBlcnJvciAqLworI2RlZmluZSBTTVRfUkRGX1NCQQkweDBkCQkvKiBTQkEgZGVuaWVkICovCisKKy8qCisgKiBQMTMgOiByZWZ1c2VkIGZyYW1lIGJlZ2lubmluZworICovCisjZGVmaW5lIFNNVF9QX1JFRlVTRUQJMHgwMDEzCQkvKiByZWZ1c2VkIGZyYW1lIGJlZ2lubmluZyAqLworI2RlZmluZSBTV0FQX1NNVF9QX1JFRlVTRUQJImwiCisKK3N0cnVjdCBzbXRfcF9yZWZ1c2VkIHsKKwlzdHJ1Y3Qgc210X3BhcmEJcGFyYSA7CQkvKiBnZW5lcmljIHBhcmFtZXRlciBoZWFkZXIgKi8KKwl1X2ludAlyZWZfZmMgOwkJLyogMyBieXRlcyAwICsgRkMgKi8KKwlzdHJ1Y3Qgc210X2hlYWRlcglyZWZfaGVhZGVyIDsJLyogcmVmdXNlZCBoZWFkZXIgKi8KK30gOworCisvKgorICogUDE0IDogc3VwcG9ydGVkIFNNVCB2ZXJzaW9ucworICovCisjZGVmaW5lIFNNVF9QX1ZFUlNJT04JMHgwMDE0CQkvKiBTTVQgc3VwcG9ydGVkIHZlcnNpb25zICovCisjZGVmaW5lIFNXQVBfU01UX1BfVkVSU0lPTgkic2Njc3MiCisKK3N0cnVjdCBzbXRfcF92ZXJzaW9uIHsKKwlzdHJ1Y3Qgc210X3BhcmEJcGFyYSA7CQkvKiBnZW5lcmljIHBhcmFtZXRlciBoZWFkZXIgKi8KKwl1X3Nob3J0CXZfcGFkIDsKKwl1X2NoYXIJdl9uIDsJCQkvKiAxIC4uIDB4ZmYsICN2ZXJzaW9ucyAqLworCXVfY2hhcgl2X2luZGV4IDsJCS8qIDEgLi4gMHhmZiwgaW5kZXggb2Ygb3AuIHYuICovCisJdV9zaG9ydAl2X3ZlcnNpb25bMV0gOwkJLyogbGlzdCBvZiBtaW4uIDEgdmVyc2lvbiAqLworCXVfc2hvcnQJdl9wYWQyIDsJCS8qIHBhZCBpZiBuZWNlc3NhcnkgKi8KK30gOworCisvKgorICogUDE1IDogUmVzb3VyY2UgVHlwZQorICovCisjZGVmaW5lCVNXQVBfU01UX1AwMDE1CQkibCIKKworc3RydWN0IHNtdF9wXzAwMTUgeworCXN0cnVjdCBzbXRfcGFyYQlwYXJhIDsJCS8qIGdlbmVyaWMgcGFyYW1ldGVyIGhlYWRlciAqLworCXVfaW50CQlyZXNfdHlwZSA7CS8qIHJlY3NvdXJjZSB0eXBlICovCit9IDsKKworI2RlZmluZQlTWU5DX0JXCQkweDAwMDAwMDAxTAkvKiBTeW5jaHJvbm91cyBCYW5kd2lkdGggKi8KKworLyoKKyAqIFAxNiA6IFNCQSBDb21tYW5kCisgKi8KKyNkZWZpbmUJU1dBUF9TTVRfUDAwMTYJCSJsIgorCitzdHJ1Y3Qgc210X3BfMDAxNiB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9pbnQJCXNiYV9jbWQgOwkvKiBjb21tYW5kIGZvciB0aGUgU0JBICovCit9IDsKKworI2RlZmluZQlSRVFVRVNUX0FMTE9DQVRJT04JMHgxCS8qIHJlcSBhbGxvY2F0aW9uIG9mIHN5bmMgYmFuZHdpZHRoICovCisjZGVmaW5lCVJFUE9SVF9BTExPQ0FUSU9OCTB4MgkvKiByZXAgb2Ygc3luYyBiYW5kd2lkdGggYWxsb2NhdGlvbiAqLworI2RlZmluZQlDSEFOR0VfQUxMT0NBVElPTgkweDMJLyogZm9yY2VzIGEgc3RhdGlvbiB1c2luZyBzeW5jIGJhbmQtKi8KKwkJCQkJLyogd2lkdGggdG8gY2hhbmdlIGl0cyBjdXJyZW50IGFsbG8tKi8KKwkJCQkJLyogY2F0aW9uICovCisKKy8qCisgKiBQMTcgOiBTQkEgUGF5bG9hZCBSZXF1ZXN0CisgKi8KKyNkZWZpbmUJU1dBUF9TTVRfUDAwMTcJCSJsIgorCitzdHJ1Y3Qgc210X3BfMDAxNyB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJaW50CQlzYmFfcGxfcmVxIDsJLyogdG90YWwgc3luYyBiYW5kd2lkdGggbWVhc3VyZWQgaW4gKi8KK30gOwkJCQkJLyogYnl0ZXMgcGVyIDEyNSB1cyAqLworCisvKgorICogUDE4IDogU0JBIE92ZXJoZWFkIFJlcXVlc3QKKyAqLworI2RlZmluZQlTV0FQX1NNVF9QMDAxOAkJImwiCisKK3N0cnVjdCBzbXRfcF8wMDE4IHsKKwlzdHJ1Y3Qgc210X3BhcmEJcGFyYSA7CQkvKiBnZW5lcmljIHBhcmFtZXRlciBoZWFkZXIgKi8KKwlpbnQJCXNiYV9vdl9yZXEgOwkvKiB0b3RhbCBzeW5jIGJhbmR3aWR0aCByZXEgZm9yIG92ZXJoZWFkKi8KK30gOwkJCQkJLyogbWVhc3VlcmVkIGluIGJ5dGVzIHBlciBUX05lZyAqLworCisvKgorICogUDE5IDogU0JBIEFsbG9jYXRpb24gQWRkcmVzcworICovCisjZGVmaW5lCVNXQVBfU01UX1AwMDE5CQkiczYiCisKK3N0cnVjdCBzbXRfcF8wMDE5IHsKKwlzdHJ1Y3Qgc210X3BhcmEJcGFyYSA7CQkvKiBnZW5lcmljIHBhcmFtZXRlciBoZWFkZXIgKi8KKwl1X3Nob3J0CQlzYmFfcGFkIDsKKwlzdHJ1Y3QgZmRkaV9hZGRyIGFsbG9jX2FkZHIgOwkvKiBBbGxvY2F0aW9uIEFkZHJlc3MgKi8KK30gOworCisvKgorICogUDFBIDogU0JBIENhdGVnb3J5CisgKi8KKyNkZWZpbmUJU1dBUF9TTVRfUDAwMUEJCSJsIgorCitzdHJ1Y3Qgc210X3BfMDAxYSB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9pbnQJCWNhdGVnb3J5IDsJLyogQWxsb2NhdG9yIGRlZmluZWQgY2xhc3NpZmljYXRpb24gKi8KK30gOworCisvKgorICogUDFCIDogTWF4aW11bSBUX05lZworICovCisjZGVmaW5lCVNXQVBfU01UX1AwMDFCCQkibCIKKworc3RydWN0IHNtdF9wXzAwMWIgeworCXN0cnVjdCBzbXRfcGFyYQlwYXJhIDsJCS8qIGdlbmVyaWMgcGFyYW1ldGVyIGhlYWRlciAqLworCXVfaW50CQltYXhfdF9uZWcgOwkvKiBsb25nZXN0IFRfTkVHIGZvciB0aGUgc3luYyBzZXJ2aWNlKi8KK30gOworCisvKgorICogUDFDIDogTWluaW11bSBTQkEgU2VnbWVudCBTaXplCisgKi8KKyNkZWZpbmUJU1dBUF9TTVRfUDAwMUMJCSJsIgorCitzdHJ1Y3Qgc210X3BfMDAxYyB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9pbnQJCW1pbl9zZWdfc2l6IDsJLyogc21hbGxlc3QgbnVtYmVyIG9mIGJ5dGVzIHBlciBmcmFtZSovCit9IDsKKworLyoKKyAqIFAxRCA6IFNCQSBBbGxvY2F0YWJsZQorICovCisjZGVmaW5lCVNXQVBfU01UX1AwMDFECQkibCIKKworc3RydWN0IHNtdF9wXzAwMWQgeworCXN0cnVjdCBzbXRfcGFyYQlwYXJhIDsJCS8qIGdlbmVyaWMgcGFyYW1ldGVyIGhlYWRlciAqLworCXVfaW50CQlhbGxvY2F0YWJsZSA7CS8qIHRvdGFsIHN5bmMgYncgYXZhaWxhYmxlIGZvciBhbGxvYyAqLworfSA7CisKKy8qCisgKiBQMjAgMEIgOiBmcmFtZSBzdGF0dXMgY2FwYWJpbGl0aWVzCisgKiBOT1RFOiBub3QgaW4gc3dhcCB0YWJsZSwgaXMgdXNlZCBieSBzbXQuYyBBTkQgUE1GIHRhYmxlCisgKi8KKyNkZWZpbmUgU01UX1BfRlNDCTB4MjAwYgorLyogI2RlZmluZSBTV0FQX1NNVF9QX0ZTQwkic3NzcyIgKi8KKworc3RydWN0IHNtdF9wX2ZzYyB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9zaG9ydAlmc2NfcGFkMCA7CisJdV9zaG9ydAlmc2NfbWFjX2luZGV4IDsJCS8qIG1hYyBpbmRleCAxIC4uIGZmICovCisJdV9zaG9ydAlmc2NfcGFkMSA7CisJdV9zaG9ydAlmc2NfdmFsdWUgOwkJLyogRlNDX1RZUEVbMC0yXSAqLworfSA7CisKKyNkZWZpbmUgRlNDX1RZUEUwCTAJCS8qICJub3JtYWwiIG5vZGUgKEEvQyBoYW5kbGluZykgKi8KKyNkZWZpbmUgRlNDX1RZUEUxCTEJCS8qIFNwZWNpYWwgQS9DIGluZGljYXRvciBmb3J3YXJkaW5nICovCisjZGVmaW5lIEZTQ19UWVBFMgkyCQkvKiBTcGVjaWFsIEEvQyBpbmRpY2F0b3IgZm9yd2FyZGluZyAqLworCisvKgorICogUDAwIDIxIDogdXNlciBkZWZpbmVkIGF1dGhvcml6aWF0aW9uIChzZWUgcG1mLmMpCisgKi8KKyNkZWZpbmUgU01UX1BfQVVUSE9SCTB4MDAyMQorCisvKgorICogbm90aWZpY2F0aW9uIHBhcmFtZXRlcnMKKyAqLworI2RlZmluZSBTV0FQX1NNVF9QMTA0OAkibGwiCitzdHJ1Y3Qgc210X3BfMTA0OCB7CisJdV9pbnQgcDEwNDhfZmxhZyA7CisJdV9pbnQgcDEwNDhfY2Zfc3RhdGUgOworfSA7CisKKy8qCisgKiBOT1RFOiBhbGwgMnh4eCAzeHh4IGFuZCA0eHh4IG11c3QgaW5jbHVkZSB0aGUgSU5ERVggaW4gdGhlIHN3YXAgc3RyaW5nLAorICoJZXZlbiBzbyB0aGUgSU5ERVggaXMgTk9UIHBhcnQgb2YgdGhlIHN0cnVjdC4KKyAqCUlOREVYIGlzIGFscmVhZHkgc3dhcHBlZCBpbiBwbWYuYywgZm9ybWF0IGluIHN0cmluZyBpcyAnNCcKKyAqLworI2RlZmluZSBTV0FQX1NNVF9QMjA4QwkiNGxzczY2Igorc3RydWN0IHNtdF9wXzIwOGMgeworCXVfaW50CQkJcDIwOGNfZmxhZyA7CisJdV9zaG9ydAkJCXAyMDhjX3BhZCA7CisJdV9zaG9ydAkJCXAyMDhjX2R1cGNvbmRpdGlvbiA7CisJc3RydWN0CWZkZGlfYWRkcglwMjA4Y19mZGRpbG9uZyA7CisJc3RydWN0CWZkZGlfYWRkcglwMjA4Y19mZGRpdW5hbG9uZyA7Cit9IDsKKworI2RlZmluZSBTV0FQX1NNVF9QMjA4RAkiNGxsbGxsIgorc3RydWN0IHNtdF9wXzIwOGQgeworCXVfaW50CQkJcDIwOGRfZmxhZyA7CisJdV9pbnQJCQlwMjA4ZF9mcmFtZV9jdCA7CisJdV9pbnQJCQlwMjA4ZF9lcnJvcl9jdCA7CisJdV9pbnQJCQlwMjA4ZF9sb3N0X2N0IDsKKwl1X2ludAkJCXAyMDhkX3JhdGlvIDsKK30gOworCisjZGVmaW5lIFNXQVBfU01UX1AyMDhFCSI0bGxsbCIKK3N0cnVjdCBzbXRfcF8yMDhlIHsKKwl1X2ludAkJCXAyMDhlX2ZsYWcgOworCXVfaW50CQkJcDIwOGVfbm90X2NvcGllZCA7CisJdV9pbnQJCQlwMjA4ZV9jb3BpZWQgOworCXVfaW50CQkJcDIwOGVfbm90X2NvcGllZF9yYXRpbyA7Cit9IDsKKworI2RlZmluZSBTV0FQX1NNVF9QMjA4RgkiNGxsNjY2NnM2IgorCitzdHJ1Y3Qgc210X3BfMjA4ZiB7CisJdV9pbnQJCQlwMjA4Zl9tdWx0aXBsZSA7CisJdV9pbnQJCQlwMjA4Zl9uYWNvbmRpdGlvbiA7CisJc3RydWN0IGZkZGlfYWRkcglwMjA4Zl9vbGRfdW5hIDsKKwlzdHJ1Y3QgZmRkaV9hZGRyCXAyMDhmX25ld191bmEgOworCXN0cnVjdCBmZGRpX2FkZHIJcDIwOGZfb2xkX2RuYSA7CisJc3RydWN0IGZkZGlfYWRkcglwMjA4Zl9uZXdfZG5hIDsKKwl1X3Nob3J0CQkJcDIwOGZfY3VycmVuX3BhdGggOworCXN0cnVjdCBmZGRpX2FkZHIJcDIwOGZfc210X2FkZHJlc3MgOworfSA7CisKKyNkZWZpbmUgU1dBUF9TTVRfUDIwOTAJIjRsc3NsIgorCitzdHJ1Y3Qgc210X3BfMjA5MCB7CisJdV9pbnQJCQlwMjA5MF9tdWx0aXBsZSA7CisJdV9zaG9ydAkJCXAyMDkwX2F2YWlsYWJsZXBhdGhzIDsKKwl1X3Nob3J0CQkJcDIwOTBfY3VycmVudHBhdGggOworCXVfaW50CQkJcDIwOTBfcmVxdWVzdGVkcGF0aHMgOworfSA7CisKKy8qCisgKiBOT1RFOgorICogc3BlY2lhbCBrbHVkZ2UgZm9yIHBhcmFtZXRlcnMgMzIwYiwzMjBmLDMyMTAKKyAqIHRoZXNlIHBhcmFtZXRlcnMgYXJlIHBhcnQgb2YgUkFGIGZyYW1lcworICogUkFGIGZyYW1lcyBhcmUgcGFyc2VkIGluIFNCQS5DIGFuZCBtdXN0IGJlIHN3YXBwZWQKKyAqIFBNRi5DIGhhcyBzcGVjaWFsIGNvZGUgdG8gYXZvaWQgZG91YmxlIHN3YXBwaW5nCisgKi8KKyNpZmRlZglMSVRUTEVfRU5ESUFOCisjZGVmaW5lIFNCQVBBVEhJTkRFWAkoMHgwMTAwMDAwMEwpCisjZWxzZQorI2RlZmluZSBTQkFQQVRISU5ERVgJKDB4MDFMKQorI2VuZGlmCisKKyNkZWZpbmUJU1dBUF9TTVRfUDMyMEIJIjQycyIKKworc3RydWN0CXNtdF9wXzMyMGIgeworCXN0cnVjdCBzbXRfcGFyYSBwYXJhIDsJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9pbnQJbWliX2luZGV4IDsKKwl1X3Nob3J0IHBhdGhfcGFkIDsKKwl1X3Nob3J0CXBhdGhfaW5kZXggOworfSA7CisKKyNkZWZpbmUJU1dBUF9TTVRfUDMyMEYJIjRsIgorCitzdHJ1Y3QJc210X3BfMzIwZiB7CisJc3RydWN0IHNtdF9wYXJhIHBhcmEgOwkvKiBnZW5lcmljIHBhcmFtZXRlciBoZWFkZXIgKi8KKwl1X2ludAltaWJfaW5kZXggOworCXVfaW50CW1pYl9wYXlsb2FkIDsKK30gOworCisjZGVmaW5lCVNXQVBfU01UX1AzMjEwCSI0bCIKKworc3RydWN0CXNtdF9wXzMyMTAgeworCXN0cnVjdCBzbXRfcGFyYSBwYXJhIDsJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9pbnQJbWliX2luZGV4IDsKKwl1X2ludAltaWJfb3ZlcmhlYWQgOworfSA7CisKKyNkZWZpbmUgU1dBUF9TTVRfUDQwNTAJIjRsMTExMWxsIgorCitzdHJ1Y3Qgc210X3BfNDA1MCB7CisJdV9pbnQJCQlwNDA1MF9mbGFnIDsKKwl1X2NoYXIJCQlwNDA1MF9wYWQgOworCXVfY2hhcgkJCXA0MDUwX2N1dG9mZiA7CisJdV9jaGFyCQkJcDQwNTBfYWxhcm0gOworCXVfY2hhcgkJCXA0MDUwX2VzdGltYXRlIDsKKwl1X2ludAkJCXA0MDUwX3JlamVjdF9jdCA7CisJdV9pbnQJCQlwNDA1MF9jdCA7Cit9IDsKKworI2RlZmluZSBTV0FQX1NNVF9QNDA1MQkiNGxzc3NzIgorc3RydWN0IHNtdF9wXzQwNTEgeworCXVfaW50CQkJcDQwNTFfbXVsdGlwbGUgOworCXVfc2hvcnQJCQlwNDA1MV9wb3J0dHlwZSA7CisJdV9zaG9ydAkJCXA0MDUxX2Nvbm5lY3RzdGF0ZSA7CisJdV9zaG9ydAkJCXA0MDUxX3BjX25laWdoYm9yIDsKKwl1X3Nob3J0CQkJcDQwNTFfcGNfd2l0aGhvbGQgOworfSA7CisKKyNkZWZpbmUgU1dBUF9TTVRfUDQwNTIJIjRsbCIKK3N0cnVjdCBzbXRfcF80MDUyIHsKKwl1X2ludAkJCXA0MDUyX2ZsYWcgOworCXVfaW50CQkJcDQwNTJfZWJlcnJvcmNvdW50IDsKK30gOworCisjZGVmaW5lIFNXQVBfU01UX1A0MDUzCSI0bHNzbHNzIgorCitzdHJ1Y3Qgc210X3BfNDA1MyB7CisJdV9pbnQJCQlwNDA1M19tdWx0aXBsZSA7CisJdV9zaG9ydAkJCXA0MDUzX2F2YWlsYWJsZXBhdGhzIDsKKwl1X3Nob3J0CQkJcDQwNTNfY3VycmVudHBhdGggOworCXVfaW50CQkJcDQwNTNfcmVxdWVzdGVkcGF0aHMgOworCXVfc2hvcnQJCQlwNDA1M19teXR5cGUgOworCXVfc2hvcnQJCQlwNDA1M19uZWlnaGJvcnR5cGUgOworfSA7CisKKworI2RlZmluZSBTTVRfUF9TRVRDT1VOVAkweDEwMzUKKyNkZWZpbmUgU1dBUF9TTVRfUF9TRVRDT1VOVAkibDgiCisKK3N0cnVjdCBzbXRfcF9zZXRjb3VudCB7CisJc3RydWN0IHNtdF9wYXJhCXBhcmEgOwkJLyogZ2VuZXJpYyBwYXJhbWV0ZXIgaGVhZGVyICovCisJdV9pbnQJCWNvdW50IDsKKwl1X2NoYXIJCXRpbWVzdGFtcFs4XSA7Cit9IDsKKworLyoKKyAqIFNNVCBGUkFNRVMKKyAqLworCisvKgorICogTklGIDogbmVpZ2hib3IgaW5mb3JtYXRpb24gZnJhbWVzCisgKi8KK3N0cnVjdCBzbXRfbmlmIHsKKwlzdHJ1Y3Qgc210X2hlYWRlcglzbXQgOwkJLyogZ2VuZXJpYyBoZWFkZXIgKi8KKwlzdHJ1Y3Qgc210X3BfdW5hCXVuYSA7CQkvKiBVTkEgKi8KKwlzdHJ1Y3Qgc210X3Bfc2RlCXNkZSA7CQkvKiBzdGF0aW9uIGRlc2NyaXB0b3IgKi8KKwlzdHJ1Y3Qgc210X3Bfc3RhdGUJc3RhdGUgOwkJLyogc3RhdGlvbiBzdGF0ZSAqLworI2lmZGVmCVNNVDZfMTAKKwlzdHJ1Y3Qgc210X3BfZnNjCWZzYyA7CQkvKiBmcmFtZSBzdGF0dXMgY2FwLiAqLworI2VuZGlmCit9IDsKKworLyoKKyAqIFNJRiA6IHN0YXRpb24gaW5mb3JtYXRpb24gZnJhbWVzCisgKi8KK3N0cnVjdCBzbXRfc2lmX2NvbmZpZyB7CisJc3RydWN0IHNtdF9oZWFkZXIJc210IDsJCS8qIGdlbmVyaWMgaGVhZGVyICovCisJc3RydWN0IHNtdF9wX3RpbWVzdGFtcAl0cyA7CQkvKiB0aW1lIHN0YW1wICovCisJc3RydWN0IHNtdF9wX3NkZQlzZGUgOwkJLyogc3RhdGlvbiBkZXNjcmlwdG9yICovCisJc3RydWN0IHNtdF9wX3ZlcnNpb24JdmVyc2lvbiA7CS8qIHN1cHBvcnRlZCB2ZXJzaW9ucyAqLworCXN0cnVjdCBzbXRfcF9zdGF0ZQlzdGF0ZSA7CQkvKiBzdGF0aW9uIHN0YXRlICovCisJc3RydWN0IHNtdF9wX3BvbGljeQlwb2xpY3kgOwkvKiBzdGF0aW9uIHBvbGljeSAqLworCXN0cnVjdCBzbXRfcF9sYXRlbmN5CWxhdGVuY3kgOwkvKiBwYXRoIGxhdGVuY3kgKi8KKwlzdHJ1Y3Qgc210X3BfbmVpZ2hib3IJbmVpZ2hib3IgOwkvKiBuZWlnaGJvcnMsIHdlIGhhdmUgb25seSBvbmUqLworI2lmZGVmCU9QVF9QTUYKKwlzdHJ1Y3Qgc210X3Bfc2V0Y291bnQJc2V0Y291bnQgOwkgLyogU2V0IENvdW50IG1hbmRhdG9yeSAqLworI2VuZGlmCisJLyogV0FSTklORyA6IHBhdGggTVVTVCBCRSBMQVNUIEZJRUxEICEhISAoc2VlIHNtdC5jOnNtdF9maWxsX3BhdGgpICovCisJc3RydWN0IHNtdF9wX3BhdGgJcGF0aCA7CQkvKiBwYXRoIGRlc2NyaXB0b3IgKi8KK30gOworI2RlZmluZSBTSVpFT0ZfU01UX1NJRl9DT05GSUcJKHNpemVvZihzdHJ1Y3Qgc210X3NpZl9jb25maWcpLSBcCisJCQkJIHNpemVvZihzdHJ1Y3Qgc210X3BfcGF0aCkpCisKK3N0cnVjdCBzbXRfc2lmX29wZXJhdGlvbiB7CisJc3RydWN0IHNtdF9oZWFkZXIJc210IDsJCS8qIGdlbmVyaWMgaGVhZGVyICovCisJc3RydWN0IHNtdF9wX3RpbWVzdGFtcAl0cyA7CQkvKiB0aW1lIHN0YW1wICovCisJc3RydWN0IHNtdF9wX21hY19zdGF0dXMJc3RhdHVzIDsJLyogbWFjIHN0YXR1cyAqLworCXN0cnVjdCBzbXRfcF9tYWNfY291bnRlciBtYyA7CQkvKiBNQUMgY291bnRlciAqLworCXN0cnVjdCBzbXRfcF9tYWNfZm5jIAlmbmMgOwkJLyogTUFDIGZyYW1lIG5vdCBjb3BpZWQgKi8KKwlzdHJ1Y3Qgc21wX3BfbWFudWZhY3R1cmVyIG1hbiA7CQkvKiBtYW51ZmFjdHVyZXIgZmllbGQgKi8KKwlzdHJ1Y3Qgc21wX3BfdXNlcgl1c2VyIDsJCS8qIHVzZXIgZmllbGQgKi8KKyNpZmRlZglPUFRfUE1GCisJc3RydWN0IHNtdF9wX3NldGNvdW50CXNldGNvdW50IDsJIC8qIFNldCBDb3VudCBtYW5kYXRvcnkgKi8KKyNlbmRpZgorCS8qIG11c3QgYmUgbGFzdCAqLworCXN0cnVjdCBzbXRfcF9sZW0JbGVtWzFdIDsJLyogcGh5IGxlbSBzdGF0dXMgKi8KK30gOworI2RlZmluZSBTSVpFT0ZfU01UX1NJRl9PUEVSQVRJT04JKHNpemVvZihzdHJ1Y3Qgc210X3NpZl9vcGVyYXRpb24pLSBcCisJCQkJCSBzaXplb2Yoc3RydWN0IHNtdF9wX2xlbSkpCisKKy8qCisgKiBFQ0YgOiBlY2hvIGZyYW1lCisgKi8KK3N0cnVjdCBzbXRfZWNmIHsKKwlzdHJ1Y3Qgc210X2hlYWRlcglzbXQgOwkJLyogZ2VuZXJpYyBoZWFkZXIgKi8KKwlzdHJ1Y3Qgc210X3BfZWNobwllY19lY2hvIDsJLyogZWNobyBwYXJhbWV0ZXIgKi8KK30gOworI2RlZmluZSBTTVRfRUNGX0xFTgkoc2l6ZW9mKHN0cnVjdCBzbXRfaGVhZGVyKStzaXplb2Yoc3RydWN0IHNtdF9wYXJhKSkKKworLyoKKyAqIFJERiA6IHJlcXVlc3QgZGVuaWVkIGZyYW1lCisgKi8KK3N0cnVjdCBzbXRfcmRmIHsKKwlzdHJ1Y3Qgc210X2hlYWRlcglzbXQgOwkJLyogZ2VuZXJpYyBoZWFkZXIgKi8KKwlzdHJ1Y3Qgc210X3BfcmVhc29uCXJlYXNvbiA7CS8qIHJlYXNvbiBjb2RlICovCisJc3RydWN0IHNtdF9wX3ZlcnNpb24JdmVyc2lvbiA7CS8qIHN1cHBvcnRlZCB2ZXJzaW9ucyAqLworCXN0cnVjdCBzbXRfcF9yZWZ1c2VkCXJlZnVzZWQgOwkvKiByZWZ1c2VkIGZyYW1lIGZyYWdtZW50ICovCit9IDsKKworLyoKKyAqIFNCQSBSZXF1ZXN0IEFsbG9jYXRpb24gUmVzcG9uY2UgRnJhbWUKKyAqLworc3RydWN0IHNtdF9zYmFfYWxjX3JlcyB7CisJc3RydWN0IHNtdF9oZWFkZXIJc210IDsJCS8qIGdlbmVyaWMgaGVhZGVyICovCisJc3RydWN0IHNtdF9wXzAwMTUJc190eXBlIDsJLyogcmVzb3VyY2UgdHlwZSAqLworCXN0cnVjdCBzbXRfcF8wMDE2CWNtZCA7CQkvKiBTQkEgY29tbWFuZCAqLworCXN0cnVjdCBzbXRfcF9yZWFzb24JcmVhc29uIDsJLyogcmVhc29uIGNvZGUgKi8KKwlzdHJ1Y3Qgc210X3BfMzIwYglwYXRoIDsJCS8qIHBhdGggdHlwZSAqLworCXN0cnVjdCBzbXRfcF8zMjBmCXBheWxvYWQgOwkvKiBjdXJyZW50IFNCQSBwYXlsb2FkICovCisJc3RydWN0IHNtdF9wXzMyMTAJb3ZlcmhlYWQgOwkvKiBjdXJyZW50IFNCQSBvdmVyaGVhZCAqLworCXN0cnVjdCBzbXRfcF8wMDE5CWFfYWRkciA7CS8qIEFsbG9jYXRpb24gQWRkcmVzcyAqLworCXN0cnVjdCBzbXRfcF8wMDFhCWNhdCA7CQkvKiBDYXRlZ29yeSAtIGZyb20gdGhlIHJlcXVlc3QgKi8KKwlzdHJ1Y3Qgc210X3BfMDAxZAlhbGxvYyA7CQkvKiBTQkEgQWxsb2NhdGFibGUgKi8KK30gOworCisvKgorICogU0JBIFJlcXVlc3QgQWxsb2NhdGlvbiBSZXF1ZXN0IEZyYW1lCisgKi8KK3N0cnVjdCBzbXRfc2JhX2FsY19yZXEgeworCXN0cnVjdCBzbXRfaGVhZGVyCXNtdCA7CQkvKiBnZW5lcmljIGhlYWRlciAqLworCXN0cnVjdCBzbXRfcF8wMDE1CXNfdHlwZSA7CS8qIHJlc291cmNlIHR5cGUgKi8KKwlzdHJ1Y3Qgc210X3BfMDAxNgljbWQgOwkJLyogU0JBIGNvbW1hbmQgKi8KKwlzdHJ1Y3Qgc210X3BfMzIwYglwYXRoIDsJCS8qIHBhdGggdHlwZSAqLworCXN0cnVjdCBzbXRfcF8wMDE3CXBsX3JlcSA7CS8qIHJlcXVlc3RlZCBwYXlsb2FkICovCisJc3RydWN0IHNtdF9wXzAwMTgJb3ZfcmVxIDsJLyogcmVxdWVzdGVkIFNCQSBvdmVyaGVhZCAqLworCXN0cnVjdCBzbXRfcF8zMjBmCXBheWxvYWQgOwkvKiBjdXJyZW50IFNCQSBwYXlsb2FkICovCisJc3RydWN0IHNtdF9wXzMyMTAJb3ZlcmhlYWQgOwkvKiBjdXJyZW50IFNCQSBvdmVyaGVhZCAqLworCXN0cnVjdCBzbXRfcF8wMDE5CWFfYWRkciA7CS8qIEFsbG9jYXRpb24gQWRkcmVzcyAqLworCXN0cnVjdCBzbXRfcF8wMDFhCWNhdCA7CQkvKiBDYXRlZ29yeSAtIGZyb20gdGhlIHJlcXVlc3QgKi8KKwlzdHJ1Y3Qgc210X3BfMDAxYgl0bmVnIDsJCS8qIG1heCBULU5FRyAqLworCXN0cnVjdCBzbXRfcF8wMDFjCXNlZ20gOwkJLyogbWluaW11bSBzZWdtZW50IHNpemUgKi8KK30gOworCisvKgorICogU0JBIENoYW5nZSBBbGxvY2F0aW9uIFJlcXVlc3QgRnJhbWUKKyAqLworc3RydWN0IHNtdF9zYmFfY2hnIHsKKwlzdHJ1Y3Qgc210X2hlYWRlcglzbXQgOwkJLyogZ2VuZXJpYyBoZWFkZXIgKi8KKwlzdHJ1Y3Qgc210X3BfMDAxNQlzX3R5cGUgOwkvKiByZXNvdXJjZSB0eXBlICovCisJc3RydWN0IHNtdF9wXzAwMTYJY21kIDsJCS8qIFNCQSBjb21tYW5kICovCisJc3RydWN0IHNtdF9wXzMyMGIJcGF0aCA7CQkvKiBwYXRoIHR5cGUgKi8KKwlzdHJ1Y3Qgc210X3BfMzIwZglwYXlsb2FkIDsJLyogY3VycmVudCBTQkEgcGF5bG9hZCAqLworCXN0cnVjdCBzbXRfcF8zMjEwCW92ZXJoZWFkIDsJLyogY3VycmVudCBTQkEgb3ZlcmhlYWQgKi8KKwlzdHJ1Y3Qgc210X3BfMDAxYQljYXQgOwkJLyogQ2F0ZWdvcnkgLSBmcm9tIHRoZSByZXF1ZXN0ICovCit9IDsKKworLyoKKyAqIFNCQSBSZXBvcnQgQWxsb2NhdGlvbiBSZXF1ZXN0IEZyYW1lCisgKi8KK3N0cnVjdCBzbXRfc2JhX3JlcF9yZXEgeworCXN0cnVjdCBzbXRfaGVhZGVyCXNtdCA7CQkvKiBnZW5lcmljIGhlYWRlciAqLworCXN0cnVjdCBzbXRfcF8wMDE1CXNfdHlwZSA7CS8qIHJlc291cmNlIHR5cGUgKi8KKwlzdHJ1Y3Qgc210X3BfMDAxNgljbWQgOwkJLyogU0JBIGNvbW1hbmQgKi8KK30gOworCisvKgorICogU0JBIFJlcG9ydCBBbGxvY2F0aW9uIFJlc3BvbnNlIEZyYW1lCisgKi8KK3N0cnVjdCBzbXRfc2JhX3JlcF9yZXMgeworCXN0cnVjdCBzbXRfaGVhZGVyCXNtdCA7CQkvKiBnZW5lcmljIGhlYWRlciAqLworCXN0cnVjdCBzbXRfcF8wMDE1CXNfdHlwZSA7CS8qIHJlc291cmNlIHR5cGUgKi8KKwlzdHJ1Y3Qgc210X3BfMDAxNgljbWQgOwkJLyogU0JBIGNvbW1hbmQgKi8KKwlzdHJ1Y3Qgc210X3BfMzIwYglwYXRoIDsJCS8qIHBhdGggdHlwZSAqLworCXN0cnVjdCBzbXRfcF8zMjBmCXBheWxvYWQgOwkvKiBjdXJyZW50IFNCQSBwYXlsb2FkICovCisJc3RydWN0IHNtdF9wXzMyMTAJb3ZlcmhlYWQgOwkvKiBjdXJyZW50IFNCQSBvdmVyaGVhZCAqLworfSA7CisKKy8qCisgKiBhY3Rpb25zCisgKi8KKyNkZWZpbmUgU01UX1NUQVRJT05fQUNUSU9OCTEKKyNkZWZpbmUgU01UX1NUQVRJT05fQUNUSU9OX0NPTk5FQ1QJMAorI2RlZmluZSBTTVRfU1RBVElPTl9BQ1RJT05fRElTQ09OTkVDVAkxCisjZGVmaW5lIFNNVF9TVEFUSU9OX0FDVElPTl9QQVRIVEVTVAkyCisjZGVmaW5lIFNNVF9TVEFUSU9OX0FDVElPTl9TRUxGVEVTVAkzCisjZGVmaW5lIFNNVF9TVEFUSU9OX0FDVElPTl9ESVNBQkxFX0EJNAorI2RlZmluZSBTTVRfU1RBVElPTl9BQ1RJT05fRElTQUJMRV9CCTUKKyNkZWZpbmUgU01UX1NUQVRJT05fQUNUSU9OX0RJU0FCTEVfTQk2CisKKyNkZWZpbmUgU01UX1BPUlRfQUNUSU9OCQkyCisjZGVmaW5lIFNNVF9QT1JUX0FDVElPTl9NQUlOVAkwCisjZGVmaW5lIFNNVF9QT1JUX0FDVElPTl9FTkFCTEUJMQorI2RlZmluZSBTTVRfUE9SVF9BQ1RJT05fRElTQUJMRQkyCisjZGVmaW5lIFNNVF9QT1JUX0FDVElPTl9TVEFSVAkzCisjZGVmaW5lIFNNVF9QT1JUX0FDVElPTl9TVE9QCTQKKworI2VuZGlmCS8qIF9TTVRfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2gvc210X3AuaCBiL2RyaXZlcnMvbmV0L3NrZnAvaC9zbXRfcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZjliZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2gvc210X3AuaApAQCAtMCwwICsxLDMyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIGRlZmluZXMgZm9yIGFsbCBTTVQgYXR0cmlidXRlcworICovCisKKy8qCisgKiB0aGlzIGJvcmluZyBmaWxlIHdhcyBwcm9kdWNlZCBieSBwZXJsCisgKiB0aGFua3MgTGFycnkgIQorICovCisjZGVmaW5lCVNNVF9QMDAxMgkweDAwMTIKKworI2RlZmluZQlTTVRfUDAwMTUJMHgwMDE1CisjZGVmaW5lCVNNVF9QMDAxNgkweDAwMTYKKyNkZWZpbmUJU01UX1AwMDE3CTB4MDAxNworI2RlZmluZQlTTVRfUDAwMTgJMHgwMDE4CisjZGVmaW5lCVNNVF9QMDAxOQkweDAwMTkKKworI2RlZmluZQlTTVRfUDAwMUEJMHgwMDFhCisjZGVmaW5lCVNNVF9QMDAxQgkweDAwMWIKKyNkZWZpbmUJU01UX1AwMDFDCTB4MDAxYworI2RlZmluZQlTTVRfUDAwMUQJMHgwMDFkCisKKyNkZWZpbmUJU01UX1AxMDBBCTB4MTAwYQorI2RlZmluZQlTTVRfUDEwMEIJMHgxMDBiCisjZGVmaW5lCVNNVF9QMTAwQwkweDEwMGMKKyNkZWZpbmUJU01UX1AxMDBECTB4MTAwZAorI2RlZmluZQlTTVRfUDEwMEUJMHgxMDBlCisjZGVmaW5lCVNNVF9QMTAwRgkweDEwMGYKKyNkZWZpbmUJU01UX1AxMDEwCTB4MTAxMAorI2RlZmluZQlTTVRfUDEwMTEJMHgxMDExCisjZGVmaW5lCVNNVF9QMTAxMgkweDEwMTIKKyNkZWZpbmUJU01UX1AxMDEzCTB4MTAxMworI2RlZmluZQlTTVRfUDEwMTQJMHgxMDE0CisjZGVmaW5lCVNNVF9QMTAxNQkweDEwMTUKKyNkZWZpbmUJU01UX1AxMDE2CTB4MTAxNgorI2RlZmluZQlTTVRfUDEwMTcJMHgxMDE3CisjZGVmaW5lCVNNVF9QMTAxOAkweDEwMTgKKyNkZWZpbmUJU01UX1AxMDE5CTB4MTAxOQorI2RlZmluZQlTTVRfUDEwMUEJMHgxMDFhCisjZGVmaW5lCVNNVF9QMTAxQgkweDEwMWIKKyNkZWZpbmUJU01UX1AxMDFDCTB4MTAxYworI2RlZmluZQlTTVRfUDEwMUQJMHgxMDFkCisjZGVmaW5lCVNNVF9QMTAxRQkweDEwMWUKKyNkZWZpbmUJU01UX1AxMDFGCTB4MTAxZgorI2RlZmluZQlTTVRfUDEwMjAJMHgxMDIwCisjZGVmaW5lCVNNVF9QMTAyMQkweDEwMjEKKyNkZWZpbmUJU01UX1AxMDIyCTB4MTAyMgorI2RlZmluZQlTTVRfUDEwMjMJMHgxMDIzCisjZGVmaW5lCVNNVF9QMTAyNAkweDEwMjQKKyNkZWZpbmUJU01UX1AxMDI1CTB4MTAyNQorI2RlZmluZQlTTVRfUDEwMjYJMHgxMDI2CisjZGVmaW5lCVNNVF9QMTAyNwkweDEwMjcKKyNkZWZpbmUJU01UX1AxMDI4CTB4MTAyOAorI2RlZmluZQlTTVRfUDEwMjkJMHgxMDI5CisjZGVmaW5lCVNNVF9QMTAyQQkweDEwMmEKKyNkZWZpbmUJU01UX1AxMDJCCTB4MTAyYgorI2RlZmluZQlTTVRfUDEwMkMJMHgxMDJjCisjZGVmaW5lCVNNVF9QMTAyRAkweDEwMmQKKyNkZWZpbmUJU01UX1AxMDJFCTB4MTAyZQorI2RlZmluZQlTTVRfUDEwMkYJMHgxMDJmCisjZGVmaW5lCVNNVF9QMTAzMAkweDEwMzAKKyNkZWZpbmUJU01UX1AxMDMxCTB4MTAzMQorI2RlZmluZQlTTVRfUDEwMzIJMHgxMDMyCisjZGVmaW5lCVNNVF9QMTAzMwkweDEwMzMKKyNkZWZpbmUJU01UX1AxMDM0CTB4MTAzNAorI2RlZmluZQlTTVRfUDEwMzUJMHgxMDM1CisjZGVmaW5lCVNNVF9QMTAzNgkweDEwMzYKKyNkZWZpbmUJU01UX1AxMDM3CTB4MTAzNworI2RlZmluZQlTTVRfUDEwMzgJMHgxMDM4CisjZGVmaW5lCVNNVF9QMTAzOQkweDEwMzkKKyNkZWZpbmUJU01UX1AxMDNBCTB4MTAzYQorI2RlZmluZQlTTVRfUDEwM0IJMHgxMDNiCisjZGVmaW5lCVNNVF9QMTAzQwkweDEwM2MKKyNkZWZpbmUJU01UX1AxMDNECTB4MTAzZAorI2RlZmluZQlTTVRfUDEwM0UJMHgxMDNlCisjZGVmaW5lCVNNVF9QMTAzRgkweDEwM2YKKyNkZWZpbmUJU01UX1AxMDQwCTB4MTA0MAorI2RlZmluZQlTTVRfUDEwNDEJMHgxMDQxCisjZGVmaW5lCVNNVF9QMTA0MgkweDEwNDIKKyNkZWZpbmUJU01UX1AxMDQzCTB4MTA0MworI2RlZmluZQlTTVRfUDEwNDQJMHgxMDQ0CisjZGVmaW5lCVNNVF9QMTA0NQkweDEwNDUKKyNkZWZpbmUJU01UX1AxMDQ2CTB4MTA0NgorI2RlZmluZQlTTVRfUDEwNDcJMHgxMDQ3CisjZGVmaW5lCVNNVF9QMTA0OAkweDEwNDgKKyNkZWZpbmUJU01UX1AxMDQ5CTB4MTA0OQorI2RlZmluZQlTTVRfUDEwNEEJMHgxMDRhCisjZGVmaW5lCVNNVF9QMTA0QgkweDEwNGIKKyNkZWZpbmUJU01UX1AxMDRDCTB4MTA0YworI2RlZmluZQlTTVRfUDEwNEQJMHgxMDRkCisjZGVmaW5lCVNNVF9QMTA0RQkweDEwNGUKKyNkZWZpbmUJU01UX1AxMDRGCTB4MTA0ZgorI2RlZmluZQlTTVRfUDEwNTAJMHgxMDUwCisjZGVmaW5lCVNNVF9QMTA1MQkweDEwNTEKKyNkZWZpbmUJU01UX1AxMDUyCTB4MTA1MgorI2RlZmluZQlTTVRfUDEwNTMJMHgxMDUzCisjZGVmaW5lCVNNVF9QMTA1NAkweDEwNTQKKworI2RlZmluZQlTTVRfUDEwRjAJMHgxMGYwCisjZGVmaW5lCVNNVF9QMTBGMQkweDEwZjEKKyNpZmRlZglFU1MKKyNkZWZpbmUJU01UX1AxMEYyCTB4MTBmMgorI2RlZmluZQlTTVRfUDEwRjMJMHgxMGYzCisjZGVmaW5lCVNNVF9QMTBGNAkweDEwZjQKKyNkZWZpbmUJU01UX1AxMEY1CTB4MTBmNQorI2RlZmluZQlTTVRfUDEwRjYJMHgxMGY2CisjZGVmaW5lCVNNVF9QMTBGNwkweDEwZjcKKyNlbmRpZgorI2lmZGVmCVNCQQorI2RlZmluZQlTTVRfUDEwRjgJMHgxMGY4CisjZGVmaW5lCVNNVF9QMTBGOQkweDEwZjkKKyNlbmRpZgorCisjZGVmaW5lCVNNVF9QMjAwQQkweDIwMGEKKyNkZWZpbmUJU01UX1AyMDBCCTB4MjAwYgorI2RlZmluZQlTTVRfUDIwMEMJMHgyMDBjCisjZGVmaW5lCVNNVF9QMjAwRAkweDIwMGQKKyNkZWZpbmUJU01UX1AyMDBFCTB4MjAwZQorI2RlZmluZQlTTVRfUDIwMEYJMHgyMDBmCisjZGVmaW5lCVNNVF9QMjAxMAkweDIwMTAKKyNkZWZpbmUJU01UX1AyMDExCTB4MjAxMQorI2RlZmluZQlTTVRfUDIwMTIJMHgyMDEyCisjZGVmaW5lCVNNVF9QMjAxMwkweDIwMTMKKyNkZWZpbmUJU01UX1AyMDE0CTB4MjAxNAorI2RlZmluZQlTTVRfUDIwMTUJMHgyMDE1CisjZGVmaW5lCVNNVF9QMjAxNgkweDIwMTYKKyNkZWZpbmUJU01UX1AyMDE3CTB4MjAxNworI2RlZmluZQlTTVRfUDIwMTgJMHgyMDE4CisjZGVmaW5lCVNNVF9QMjAxOQkweDIwMTkKKyNkZWZpbmUJU01UX1AyMDFBCTB4MjAxYQorI2RlZmluZQlTTVRfUDIwMUIJMHgyMDFiCisjZGVmaW5lCVNNVF9QMjAxQwkweDIwMWMKKyNkZWZpbmUJU01UX1AyMDFECTB4MjAxZAorI2RlZmluZQlTTVRfUDIwMUUJMHgyMDFlCisjZGVmaW5lCVNNVF9QMjAxRgkweDIwMWYKKyNkZWZpbmUJU01UX1AyMDIwCTB4MjAyMAorI2RlZmluZQlTTVRfUDIwMjEJMHgyMDIxCisjZGVmaW5lCVNNVF9QMjAyMgkweDIwMjIKKyNkZWZpbmUJU01UX1AyMDIzCTB4MjAyMworI2RlZmluZQlTTVRfUDIwMjQJMHgyMDI0CisjZGVmaW5lCVNNVF9QMjAyNQkweDIwMjUKKyNkZWZpbmUJU01UX1AyMDI2CTB4MjAyNgorI2RlZmluZQlTTVRfUDIwMjcJMHgyMDI3CisjZGVmaW5lCVNNVF9QMjAyOAkweDIwMjgKKyNkZWZpbmUJU01UX1AyMDI5CTB4MjAyOQorI2RlZmluZQlTTVRfUDIwMkEJMHgyMDJhCisjZGVmaW5lCVNNVF9QMjAyQgkweDIwMmIKKyNkZWZpbmUJU01UX1AyMDJDCTB4MjAyYworI2RlZmluZQlTTVRfUDIwMkQJMHgyMDJkCisjZGVmaW5lCVNNVF9QMjAyRQkweDIwMmUKKyNkZWZpbmUJU01UX1AyMDJGCTB4MjAyZgorI2RlZmluZQlTTVRfUDIwMzAJMHgyMDMwCisjZGVmaW5lCVNNVF9QMjAzMQkweDIwMzEKKyNkZWZpbmUJU01UX1AyMDMyCTB4MjAzMgorI2RlZmluZQlTTVRfUDIwMzMJMHgyMDMzCisjZGVmaW5lCVNNVF9QMjAzNAkweDIwMzQKKyNkZWZpbmUJU01UX1AyMDM1CTB4MjAzNQorI2RlZmluZQlTTVRfUDIwMzYJMHgyMDM2CisjZGVmaW5lCVNNVF9QMjAzNwkweDIwMzcKKyNkZWZpbmUJU01UX1AyMDM4CTB4MjAzOAorI2RlZmluZQlTTVRfUDIwMzkJMHgyMDM5CisjZGVmaW5lCVNNVF9QMjAzQQkweDIwM2EKKyNkZWZpbmUJU01UX1AyMDNCCTB4MjAzYgorI2RlZmluZQlTTVRfUDIwM0MJMHgyMDNjCisjZGVmaW5lCVNNVF9QMjAzRAkweDIwM2QKKyNkZWZpbmUJU01UX1AyMDNFCTB4MjAzZQorI2RlZmluZQlTTVRfUDIwM0YJMHgyMDNmCisjZGVmaW5lCVNNVF9QMjA0MAkweDIwNDAKKyNkZWZpbmUJU01UX1AyMDQxCTB4MjA0MQorI2RlZmluZQlTTVRfUDIwNDIJMHgyMDQyCisjZGVmaW5lCVNNVF9QMjA0MwkweDIwNDMKKyNkZWZpbmUJU01UX1AyMDQ0CTB4MjA0NAorI2RlZmluZQlTTVRfUDIwNDUJMHgyMDQ1CisjZGVmaW5lCVNNVF9QMjA0NgkweDIwNDYKKyNkZWZpbmUJU01UX1AyMDQ3CTB4MjA0NworI2RlZmluZQlTTVRfUDIwNDgJMHgyMDQ4CisjZGVmaW5lCVNNVF9QMjA0OQkweDIwNDkKKyNkZWZpbmUJU01UX1AyMDRBCTB4MjA0YQorI2RlZmluZQlTTVRfUDIwNEIJMHgyMDRiCisjZGVmaW5lCVNNVF9QMjA0QwkweDIwNGMKKyNkZWZpbmUJU01UX1AyMDRECTB4MjA0ZAorI2RlZmluZQlTTVRfUDIwNEUJMHgyMDRlCisjZGVmaW5lCVNNVF9QMjA0RgkweDIwNGYKKyNkZWZpbmUJU01UX1AyMDUwCTB4MjA1MAorI2RlZmluZQlTTVRfUDIwNTEJMHgyMDUxCisjZGVmaW5lCVNNVF9QMjA1MgkweDIwNTIKKyNkZWZpbmUJU01UX1AyMDUzCTB4MjA1MworI2RlZmluZQlTTVRfUDIwNTQJMHgyMDU0CisjZGVmaW5lCVNNVF9QMjA1NQkweDIwNTUKKyNkZWZpbmUJU01UX1AyMDU2CTB4MjA1NgorI2RlZmluZQlTTVRfUDIwNTcJMHgyMDU3CisjZGVmaW5lCVNNVF9QMjA1OAkweDIwNTgKKyNkZWZpbmUJU01UX1AyMDU5CTB4MjA1OQorI2RlZmluZQlTTVRfUDIwNUEJMHgyMDVhCisjZGVmaW5lCVNNVF9QMjA1QgkweDIwNWIKKyNkZWZpbmUJU01UX1AyMDVDCTB4MjA1YworI2RlZmluZQlTTVRfUDIwNUQJMHgyMDVkCisjZGVmaW5lCVNNVF9QMjA1RQkweDIwNWUKKyNkZWZpbmUJU01UX1AyMDVGCTB4MjA1ZgorI2RlZmluZQlTTVRfUDIwNjAJMHgyMDYwCisjZGVmaW5lCVNNVF9QMjA2MQkweDIwNjEKKyNkZWZpbmUJU01UX1AyMDYyCTB4MjA2MgorI2RlZmluZQlTTVRfUDIwNjMJMHgyMDYzCisjZGVmaW5lCVNNVF9QMjA2NAkweDIwNjQKKyNkZWZpbmUJU01UX1AyMDY1CTB4MjA2NQorI2RlZmluZQlTTVRfUDIwNjYJMHgyMDY2CisjZGVmaW5lCVNNVF9QMjA2NwkweDIwNjcKKyNkZWZpbmUJU01UX1AyMDY4CTB4MjA2OAorI2RlZmluZQlTTVRfUDIwNjkJMHgyMDY5CisjZGVmaW5lCVNNVF9QMjA2QQkweDIwNmEKKyNkZWZpbmUJU01UX1AyMDZCCTB4MjA2YgorI2RlZmluZQlTTVRfUDIwNkMJMHgyMDZjCisjZGVmaW5lCVNNVF9QMjA2RAkweDIwNmQKKyNkZWZpbmUJU01UX1AyMDZFCTB4MjA2ZQorI2RlZmluZQlTTVRfUDIwNkYJMHgyMDZmCisjZGVmaW5lCVNNVF9QMjA3MAkweDIwNzAKKyNkZWZpbmUJU01UX1AyMDcxCTB4MjA3MQorI2RlZmluZQlTTVRfUDIwNzIJMHgyMDcyCisjZGVmaW5lCVNNVF9QMjA3MwkweDIwNzMKKyNkZWZpbmUJU01UX1AyMDc0CTB4MjA3NAorI2RlZmluZQlTTVRfUDIwNzUJMHgyMDc1CisjZGVmaW5lCVNNVF9QMjA3NgkweDIwNzYKKworI2RlZmluZQlTTVRfUDIwOEMJMHgyMDhjCisjZGVmaW5lCVNNVF9QMjA4RAkweDIwOGQKKyNkZWZpbmUJU01UX1AyMDhFCTB4MjA4ZQorI2RlZmluZQlTTVRfUDIwOEYJMHgyMDhmCisjZGVmaW5lCVNNVF9QMjA5MAkweDIwOTAKKworI2RlZmluZQlTTVRfUDIwRjAJMHgyMEYwCisjZGVmaW5lCVNNVF9QMjBGMQkweDIwRjEKKworI2RlZmluZQlTTVRfUDMyMEEJMHgzMjBhCisjZGVmaW5lCVNNVF9QMzIwQgkweDMyMGIKKyNkZWZpbmUJU01UX1AzMjBDCTB4MzIwYworI2RlZmluZQlTTVRfUDMyMEQJMHgzMjBkCisjZGVmaW5lCVNNVF9QMzIwRQkweDMyMGUKKyNkZWZpbmUJU01UX1AzMjBGCTB4MzIwZgorI2RlZmluZQlTTVRfUDMyMTAJMHgzMjEwCisjZGVmaW5lCVNNVF9QMzIxMQkweDMyMTEKKyNkZWZpbmUJU01UX1AzMjEyCTB4MzIxMgorI2RlZmluZQlTTVRfUDMyMTMJMHgzMjEzCisjZGVmaW5lCVNNVF9QMzIxNAkweDMyMTQKKyNkZWZpbmUJU01UX1AzMjE1CTB4MzIxNQorI2RlZmluZQlTTVRfUDMyMTYJMHgzMjE2CisjZGVmaW5lCVNNVF9QMzIxNwkweDMyMTcKKworI2RlZmluZQlTTVRfUDQwMEEJMHg0MDBhCisjZGVmaW5lCVNNVF9QNDAwQgkweDQwMGIKKyNkZWZpbmUJU01UX1A0MDBDCTB4NDAwYworI2RlZmluZQlTTVRfUDQwMEQJMHg0MDBkCisjZGVmaW5lCVNNVF9QNDAwRQkweDQwMGUKKyNkZWZpbmUJU01UX1A0MDBGCTB4NDAwZgorI2RlZmluZQlTTVRfUDQwMTAJMHg0MDEwCisjZGVmaW5lCVNNVF9QNDAxMQkweDQwMTEKKyNkZWZpbmUJU01UX1A0MDEyCTB4NDAxMgorI2RlZmluZQlTTVRfUDQwMTMJMHg0MDEzCisjZGVmaW5lCVNNVF9QNDAxNAkweDQwMTQKKyNkZWZpbmUJU01UX1A0MDE1CTB4NDAxNQorI2RlZmluZQlTTVRfUDQwMTYJMHg0MDE2CisjZGVmaW5lCVNNVF9QNDAxNwkweDQwMTcKKyNkZWZpbmUJU01UX1A0MDE4CTB4NDAxOAorI2RlZmluZQlTTVRfUDQwMTkJMHg0MDE5CisjZGVmaW5lCVNNVF9QNDAxQQkweDQwMWEKKyNkZWZpbmUJU01UX1A0MDFCCTB4NDAxYgorI2RlZmluZQlTTVRfUDQwMUMJMHg0MDFjCisjZGVmaW5lCVNNVF9QNDAxRAkweDQwMWQKKyNkZWZpbmUJU01UX1A0MDFFCTB4NDAxZQorI2RlZmluZQlTTVRfUDQwMUYJMHg0MDFmCisjZGVmaW5lCVNNVF9QNDAyMAkweDQwMjAKKyNkZWZpbmUJU01UX1A0MDIxCTB4NDAyMQorI2RlZmluZQlTTVRfUDQwMjIJMHg0MDIyCisjZGVmaW5lCVNNVF9QNDAyMwkweDQwMjMKKyNkZWZpbmUJU01UX1A0MDI0CTB4NDAyNAorI2RlZmluZQlTTVRfUDQwMjUJMHg0MDI1CisjZGVmaW5lCVNNVF9QNDAyNgkweDQwMjYKKyNkZWZpbmUJU01UX1A0MDI3CTB4NDAyNworI2RlZmluZQlTTVRfUDQwMjgJMHg0MDI4CisjZGVmaW5lCVNNVF9QNDAyOQkweDQwMjkKKyNkZWZpbmUJU01UX1A0MDJBCTB4NDAyYQorI2RlZmluZQlTTVRfUDQwMkIJMHg0MDJiCisjZGVmaW5lCVNNVF9QNDAyQwkweDQwMmMKKyNkZWZpbmUJU01UX1A0MDJECTB4NDAyZAorI2RlZmluZQlTTVRfUDQwMkUJMHg0MDJlCisjZGVmaW5lCVNNVF9QNDAyRgkweDQwMmYKKyNkZWZpbmUJU01UX1A0MDMwCTB4NDAzMAorI2RlZmluZQlTTVRfUDQwMzEJMHg0MDMxCisjZGVmaW5lCVNNVF9QNDAzMgkweDQwMzIKKyNkZWZpbmUJU01UX1A0MDMzCTB4NDAzMworI2RlZmluZQlTTVRfUDQwMzQJMHg0MDM0CisjZGVmaW5lCVNNVF9QNDAzNQkweDQwMzUKKyNkZWZpbmUJU01UX1A0MDM2CTB4NDAzNgorI2RlZmluZQlTTVRfUDQwMzcJMHg0MDM3CisjZGVmaW5lCVNNVF9QNDAzOAkweDQwMzgKKyNkZWZpbmUJU01UX1A0MDM5CTB4NDAzOQorI2RlZmluZQlTTVRfUDQwM0EJMHg0MDNhCisjZGVmaW5lCVNNVF9QNDAzQgkweDQwM2IKKyNkZWZpbmUJU01UX1A0MDNDCTB4NDAzYworI2RlZmluZQlTTVRfUDQwM0QJMHg0MDNkCisjZGVmaW5lCVNNVF9QNDAzRQkweDQwM2UKKyNkZWZpbmUJU01UX1A0MDNGCTB4NDAzZgorI2RlZmluZQlTTVRfUDQwNDAJMHg0MDQwCisjZGVmaW5lCVNNVF9QNDA0MQkweDQwNDEKKyNkZWZpbmUJU01UX1A0MDQyCTB4NDA0MgorI2RlZmluZQlTTVRfUDQwNDMJMHg0MDQzCisjZGVmaW5lCVNNVF9QNDA0NAkweDQwNDQKKyNkZWZpbmUJU01UX1A0MDQ1CTB4NDA0NQorI2RlZmluZQlTTVRfUDQwNDYJMHg0MDQ2CisKKyNkZWZpbmUJU01UX1A0MDUwCTB4NDA1MAorI2RlZmluZQlTTVRfUDQwNTEJMHg0MDUxCisjZGVmaW5lCVNNVF9QNDA1MgkweDQwNTIKKyNkZWZpbmUJU01UX1A0MDUzCTB4NDA1MwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9oL3NtdHN0YXRlLmggYi9kcml2ZXJzL25ldC9za2ZwL2gvc210c3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmZlNjk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9oL3NtdHN0YXRlLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OCwxOTk5IFN5c0tvbm5lY3QsCisgKglhIGJ1c2luZXNzIHVuaXQgb2YgU2NobmVpZGVyICYgS29jaCAmIENvLiBEYXRlbnN5c3RlbWUgR21iSC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1NLRlBfSF9TTVRTVEFURV9IXworI2RlZmluZSBfU0tGUF9IX1NNVFNUQVRFX0hfCisKKy8qCisgKglTTVQgc3RhdGUgZGVmaW5pdGlvbnMKKyAqLworCisjaWZuZGVmCUtFUk5FTAorLyoKKyAqIFBDTSBzdGF0ZXMKKyAqLworI2RlZmluZSBQQzBfT0ZGCQkJMAorI2RlZmluZSBQQzFfQlJFQUsJCTEKKyNkZWZpbmUgUEMyX1RSQUNFCQkyCisjZGVmaW5lIFBDM19DT05ORUNUCQkzCisjZGVmaW5lIFBDNF9ORVhUCQk0CisjZGVmaW5lIFBDNV9TSUdOQUwJCTUKKyNkZWZpbmUgUEM2X0pPSU4JCTYKKyNkZWZpbmUgUEM3X1ZFUklGWQkJNworI2RlZmluZSBQQzhfQUNUSVZFCQk4CisjZGVmaW5lIFBDOV9NQUlOVAkJOQorCisvKgorICogUENNIG1vZGVzCisgKi8KKyNkZWZpbmUgUE1fTk9ORQkJCTAKKyNkZWZpbmUgUE1fUEVFUgkJCTEKKyNkZWZpbmUgUE1fVFJFRQkJCTIKKworLyoKKyAqIFBDTSB0eXBlCisgKi8KKyNkZWZpbmUgVEEJCQkwCisjZGVmaW5lIFRCCQkJMQorI2RlZmluZSBUUwkJCTIKKyNkZWZpbmUgVE0JCQkzCisjZGVmaW5lIFROT05FCQkJNAorCisvKgorICogQ0ZNIHN0YXRlcworICovCisjZGVmaW5lIFNDMF9JU09MQVRFRAkwCQkvKiBpc29sYXRlZCAqLworI2RlZmluZSBTQzFfV1JBUF9BCTUJCS8qIHdyYXAgQSAqLworI2RlZmluZSBTQzJfV1JBUF9CCTYJCS8qIHdyYXAgQiAqLworI2RlZmluZSBTQzRfVEhSVV9BCTEyCQkvKiB0aHJvdWdoIEEgKi8KKyNkZWZpbmUgU0M1X1RIUlVfQgk3CQkvKiB0aHJvdWdoIEIgKFNNdCA2LjIpICovCisjZGVmaW5lIFNDN19XUkFQX1MJOAkJLyogU0FTICovCisKKy8qCisgKiBFQ00gc3RhdGVzCisgKi8KKyNkZWZpbmUgRUMwX09VVAkJMAorI2RlZmluZSBFQzFfSU4JCTEKKyNkZWZpbmUgRUMyX1RSQUNFCTIKKyNkZWZpbmUgRUMzX0xFQVZFCTMKKyNkZWZpbmUgRUM0X1BBVEhfVEVTVAk0CisjZGVmaW5lIEVDNV9JTlNFUlQJNQorI2RlZmluZSBFQzZfQ0hFQ0sJNgorI2RlZmluZSBFQzdfREVJTlNFUlQJNworCisvKgorICogUk1UIHN0YXRlcworICovCisjZGVmaW5lIFJNMF9JU09MQVRFRAkwCisjZGVmaW5lIFJNMV9OT05fT1AJMQkJLyogbm90IG9wZXJhdGlvbmFsICovCisjZGVmaW5lIFJNMl9SSU5HX09QCTIJCS8qIHJpbmcgb3BlcmF0aW9uYWwgKi8KKyNkZWZpbmUgUk0zX0RFVEVDVAkzCQkvKiBkZXRlY3QgZHVwbCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgUk00X05PTl9PUF9EVVAJNAkJLyogZHVwbC4gYWRkciBkZXRlY3RlZCAqLworI2RlZmluZSBSTTVfUklOR19PUF9EVVAJNQkJLyogcmluZyBvcGVyLiB3aXRoIGR1cGwuIGFkZHIgKi8KKyNkZWZpbmUgUk02X0RJUkVDVEVECTYJCS8qIHNlbmRpbmcgZGlyZWN0ZWQgYmVhY29ucyAqLworI2RlZmluZSBSTTdfVFJBQ0UJNwkJLyogdHJhY2UgaW5pdGlhdGVkICovCisjZW5kaWYKKworc3RydWN0IHBjbV9zdGF0ZSB7CisJdW5zaWduZWQgY2hhcglwY21fdHlwZSA7CQkvKiBUQSBUQiBUUyBUTSAqLworCXVuc2lnbmVkIGNoYXIJcGNtX3N0YXRlIDsJCS8qIHN0YXRlIFBDWzAtOV1fKiAqLworCXVuc2lnbmVkIGNoYXIJcGNtX21vZGUgOwkJLyogUE1fe05PTkUsUEVFUixUUkVFfSAqLworCXVuc2lnbmVkIGNoYXIJcGNtX25laWdoYm9yIDsJCS8qIFRBIFRCIFRTIFRNICovCisJdW5zaWduZWQgY2hhcglwY21fYnNmIDsJCS8qIGZsYWcgYnMgOiBUUlVFL0ZBTFNFICovCisJdW5zaWduZWQgY2hhcglwY21fbHNmIDsJCS8qIGZsYWcgbHMgOiBUUlVFL0ZBTFNFICovCisJdW5zaWduZWQgY2hhcglwY21fbGN0X2ZhaWwgOwkJLyogY291bnRlciBsY3RfZmFpbCAqLworCXVuc2lnbmVkIGNoYXIJcGNtX2xzX3J4IDsJCS8qIHJ4IGxpbmUgc3RhdGUgKi8KKwlzaG9ydAkJcGNtX3JfdmFsIDsJCS8qIHNpZ25hbGluZyBiaXRzICovCisJc2hvcnQJCXBjbV90X3ZhbCA7CQkvKiBzaWduYWxpbmcgYml0cyAqLworfSA7CisKK3N0cnVjdCBzbXRfc3RhdGUgeworCXN0cnVjdCBwY21fc3RhdGUgcGNtX3N0YXRlW05VTVBIWVNdIDsJLyogcG9ydCBBICYgcG9ydCBCICovCit9IDsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvaC9zdXBlcm5fMi5oIGIvZHJpdmVycy9uZXQvc2tmcC9oL3N1cGVybl8yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhMGI4MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvaC9zdXBlcm5fMi5oCkBAIC0wLDAgKzEsMTA1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKwlkZWZpbmVzIGZvciBBTUQgU3VwZXJuZXQgSUkgY2hpcCBzZXQKKwl0aGUgY2hpcHMgYXJlIHJlZmVyZWQgdG8gYXMKKwkJRlBMVVMJRm9ybWFjIFBsdXMKKwkJUExDCVBoeXNpY2FsIExheWVyCisKKwlhZGRlZCBkZWZpbmVzIGZvciBBTUQgU3VwZXJuZXQgSUlJIGNoaXAgc2V0CisJYWRkZWQgY29tbWVudHMgb24gZGlmZmVyZW5jZXMgYmV0d2VlbiBTdXBlcm5ldCBJSSBhbmQgU3VwZXJuZXQgSUlJCisJYWRkZWQgZGVmaW5lcyBmb3IgdGhlIE1vdG9yb2xhIEVMTSAoTU9UX0VMTSkKKyovCisKKyNpZm5kZWYJX1NVUEVSTkVUXworI2RlZmluZSBfU1VQRVJORVRfCisKKy8qCisgKiBEZWZpbmUgU3VwZXJuZXQgMyB3aGVuIHVzZWQKKyAqLworI2lmZGVmCVBDSQorI2lmbmRlZglTVVBFUk5FVF8zCisjZGVmaW5lCVNVUEVSTkVUXzMKKyNlbmRpZgorI2RlZmluZSBUQUcKKyNlbmRpZgorCisjZGVmaW5lCU1CCTB4ZmYKKyNkZWZpbmUJTVcJMHhmZmZmCisjZGVmaW5lCU1ECTB4ZmZmZmZmZmYKKworLyoKKyAqIEZPUk1BQyBmcmFtZSBzdGF0dXMgKHJ4X21zZXh0KQorICovCisjZGVmaW5lCUZTX0VJCQkoMTw8MikKKyNkZWZpbmUJRlNfQUkJCSgxPDwxKQorI2RlZmluZQlGU19DSQkJKDE8PDApCisKKyNkZWZpbmUgRlNfTVNWQUxJRAkoMTw8MTUpCQkvKiBlbmQgb2YgcXVldWUgKi8KKyNkZWZpbmUgRlNfTVNSQUJUCSgxPDwxNCkJCS8qIGZyYW1lIHdhcyBhYm9ydGVkIGR1cmluZyByZWNlcHRpb24qLworI2RlZmluZSBGU19TU1JDUlRHCSgxPDwxMikJCS8qIGlmIFNBIGhhcyBzZXQgTVNCIChzb3VyY2Utcm91dGluZykqLworI2RlZmluZSBGU19TRUFDMgkoRlNfRUk8PDkpCS8qIGVycm9yIGluZGljYXRvciAqLworI2RlZmluZSBGU19TRUFDMQkoRlNfQUk8PDkpCS8qIGFkZHJlc3MgaW5kaWNhdG9yICovCisjZGVmaW5lIEZTX1NFQUMwCShGU19DSTw8OSkJLyogY29weSBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgRlNfU0ZSTUVSUgkoMTw8OCkJCS8qIGVycm9yIGRldGVjdGVkIChDUkMgb3IgbGVuZ3RoKSAqLworI2RlZmluZSBGU19TQURSUkcJKDE8PDcpCQkvKiBhZGRyZXNzIHJlY29nbml6ZWQgKi8KKyNkZWZpbmUgRlNfU0ZSTVRZMgkoMTw8NikJCS8qIGZyYW1lLWNsYXNzIGJpdCAqLworI2RlZmluZSBGU19TRlJNVFkxCSgxPDw1KQkJLyogZnJhbWUtdHlwZSBiaXQgKGltcGVtZW50b3IpICovCisjZGVmaW5lIEZTX1NGUk1UWTAJKDE8PDQpCQkvKiBmcmFtZS10eXBlIGJpdCAoTExDKSAqLworI2RlZmluZSBGU19FUkZCQjEJKDE8PDEpCQkvKiBieXRlIG9mZnNldCAoZGVwZW5kcyBvbiBMU0IgYml0KSAqLworI2RlZmluZSBGU19FUkZCQjAJKDE8PDApCQkvKiAgLSAiIC0gKi8KKworLyoKKyAqIHN0YXR1cyBmcmFtZSB0eXBlCisgKi8KKyNkZWZpbmUJRlJNX1NNVAkJKDApCS8qIGFzeW5jaHIuIGZyYW1lcyAqLworI2RlZmluZQlGUk1fTExDQQkoMSkKKyNkZWZpbmUJRlJNX0lNUEEJKDIpCQorI2RlZmluZQlGUk1fTUFDCQkoNCkJLyogc3luY2hyLiBmcmFtZXMgKi8KKyNkZWZpbmUJRlJNX0xMQ1MJKDUpCisjZGVmaW5lCUZSTV9JTVBTCSg2KQorCisvKgorICogYml0cyBpbiByeF9kZXNjci5pCShyZWNlaXZlIGZyYW1lIHN0YXR1cyB3b3JkKQorICovCisjZGVmaW5lIFJYX01TVkFMSUQJKChsb25nKTE8PDMxKQkvKiBtZW1vcnkgc3RhdHVzIHZhbGlkICovCisjZGVmaW5lIFJYX01TUkFCVAkoKGxvbmcpMTw8MzApCS8qIG1lbW9yeSBzdGF0dXMgcmVjZWl2ZSBhYm9ydCAqLworI2RlZmluZSBSWF9GU19FCQkoKGxvbmcpRlNfU0VBQzI8PDE2KQkvKiBlcnJvciBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgUlhfRlNfQQkJKChsb25nKUZTX1NFQUMxPDwxNikJLyogYWRkcmVzcyBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgUlhfRlNfQwkJKChsb25nKUZTX1NFQUMwPDwxNikJLyogY29weSBpbmRpY2F0b3IgKi8KKyNkZWZpbmUgUlhfRlNfQ1JDCSgobG9uZylGU19TRlJNRVJSPDwxNikvKiBlcnJvciBkZXRlY3RlZCAqLworI2RlZmluZSBSWF9GU19BRERSRVNTCSgobG9uZylGU19TQURSUkc8PDE2KQkvKiBhZGRyZXNzIHJlY29nbml6ZWQgKi8KKyNkZWZpbmUgUlhfRlNfTUFDCSgobG9uZylGU19TRlJNVFkyPDwxNikvKiBNQUMgZnJhbWUgKi8KKyNkZWZpbmUgUlhfRlNfU01UCSgobG9uZykwPDwxNikJCS8qIFNNVCBmcmFtZSAqLworI2RlZmluZSBSWF9GU19JTVBMCSgobG9uZylGU19TRlJNVFkxPDwxNikvKiBpbXBsZW1lbnRlciBmcmFtZSAqLworI2RlZmluZSBSWF9GU19MTEMJKChsb25nKUZTX1NGUk1UWTA8PDE2KS8qIExMQyBmcmFtZSAqLworCisvKgorICogcmVjZWl2ZSBmcmFtZSBkZXNjcmlwdG9yCisgKi8KK3VuaW9uIHJ4X2Rlc2NyIHsKKwlzdHJ1Y3QgeworI2lmZGVmCUxJVFRMRV9FTkRJQU4KKwl1bnNpZ25lZAlyeF9sZW5ndGggOjE2IDsJLyogZnJhbWUgbGVuZ3RoIGxvd2VyL3VwcGVyIGJ5dGUgKi8KKwl1bnNpZ25lZAlyeF9lcmZiYiAgOjIgOwkvKiByZWNlaXZlZCBmcmFtZSBieXRlIGJvdW5kYXJ5ICovCisJdW5zaWduZWQJcnhfcmVzZXJ2MjoyIDsJLyogcmVzZXJ2ZWQgKi8JCisJdW5zaWduZWQJcnhfc2ZybXR5IDozIDsJLyogZnJhbWUgdHlwZSBiaXRzICovCisJdW5zaWduZWQJcnhfc2FkcnJnIDoxIDsJLyogREEgPT0gTUEgb3IgYnJvYWQtL211bHRpY2FzdCAqLworCXVuc2lnbmVkCXJ4X3Nmcm1lcnI6MSA7CS8qIHJlY2VpdmVkIGZyYW1lIG5vdCB2YWxpZCAqLworCXVuc2lnbmVkCXJ4X3NlYWMwICA6MSA7CS8qIGZyYW1lLWNvcGllZCAgQy1pbmRpY2F0b3IgKi8KKwl1bnNpZ25lZAlyeF9zZWFjMSAgOjEgOwkvKiBhZGRyZXNzLW1hdGNoIEEtaW5kaWNhdG9yICovCisJdW5zaWduZWQJcnhfc2VhYzIgIDoxIDsJLyogZnJhbWUtZXJyb3IgICBFLWluZGljYXRvciAqLworCXVuc2lnbmVkCXJ4X3NzcmNydGc6MSA7CS8qID09IDEgU0EgaGFzIE1TQiBzZXQgKi8KKwl1bnNpZ25lZAlyeF9yZXNlcnYxOjEgOwkvKiByZXNlcnZlZCAqLwkKKwl1bnNpZ25lZAlyeF9tc3JhYnQgOjEgOwkvKiBtZW1vcnkgc3RhdHVzIHJlY2VpdmUgYWJvcnQgKi8KKwl1bnNpZ25lZAlyeF9tc3ZhbGlkOjEgOwkvKiBtZW1vcnkgc3RhdHVzIHZhbGlkICovCisjZWxzZQorCXVuc2lnbmVkCXJ4X21zdmFsaWQ6MSA7CS8qIG1lbW9yeSBzdGF0dXMgdmFsaWQgKi8KKwl1bnNpZ25lZAlyeF9tc3JhYnQgOjEgOwkvKiBtZW1vcnkgc3RhdHVzIHJlY2VpdmUgYWJvcnQgKi8KKwl1bnNpZ25lZAlyeF9yZXNlcnYxOjEgOwkvKiByZXNlcnZlZCAqLwkKKwl1bnNpZ25lZAlyeF9zc3JjcnRnOjEgOwkvKiA9PSAxIFNBIGhhcyBNU0Igc2V0ICovCisJdW5zaWduZWQJcnhfc2VhYzIgIDoxIDsJLyogZnJhbWUtZXJyb3IgICBFLWluZGljYXRvciAqLworCXVuc2lnbmVkCXJ4X3NlYWMxICA6MSA7CS8qIGFkZHJlc3MtbWF0Y2ggQS1pbmRpY2F0b3IgKi8KKwl1bnNpZ25lZAlyeF9zZWFjMCAgOjEgOwkvKiBmcmFtZS1jb3BpZWQgIEMtaW5kaWNhdG9yICovCisJdW5zaWduZWQJcnhfc2ZybWVycjoxIDsJLyogcmVjZWl2ZWQgZnJhbWUgbm90IHZhbGlkICovCisJdW5zaWduZWQJcnhfc2FkcnJnIDoxIDsJLyogREEgPT0gTUEgb3IgYnJvYWQtL211bHRpY2FzdCAqLworCXVuc2lnbmVkCXJ4X3Nmcm10eSA6MyA7CS8qIGZyYW1lIHR5cGUgYml0cyAqLworCXVuc2lnbmVkCXJ4X2VyZmJiICA6MiA7CS8qIHJlY2VpdmVkIGZyYW1lIGJ5dGUgYm91bmRhcnkgKi8KKwl1bnNpZ25lZAlyeF9yZXNlcnYyOjIgOwkvKiByZXNlcnZlZCAqLwkKKwl1bnNpZ25lZAlyeF9sZW5ndGggOjE2IDsJLyogZnJhbWUgbGVuZ3RoIGxvd2VyL3VwcGVyIGJ5dGUgKi8KKyNlbmRpZgorCX0gciA7CisJbG9uZwlpIDsKK30gOworCisvKiBkZWZpbmVzIGZvciBSZWNlaXZlIEZyYW1lIERlc2NyaXB0b3IgYWNjZXNzICovCisjZGVmaW5lIFJEX1NfRVJGQkIJMHgwMDAzMDAwMEwJLyogcmVjZWl2ZWQgZnJhbWUgYnl0ZSBib3VuZGFyeSAqLworI2RlZmluZSBSRF9TX1JFUzIJMHgwMDBjMDAwMEwJLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUkRfU19TRlJNVFkJMHgwMDcwMDAwMEwJLyogZnJhbWUgdHlwZSBiaXRzICovCisjZGVmaW5lIFJEX1NfU0FEUlJHCTB4MDA4MDAwMDBMCS8qIERBID09IE1BIG9yIGJyb2FkLS9tdWx0aWNhc3QgKi8KKyNkZWZpbmUgUkRfU19TRlJNRVJSCTB4MDEwMDAwMDBMCS8qIHJlY2VpdmVkIGZyYW1lIG5vdCB2YWxpZCAqLworI2RlZmluZQlSRF9TX1NFQUMJMHgwZTAwMDAwMEwJLyogZnJhbWUgc3RhdHVzIGluZGljYXRvcnMgKi8KKyNkZWZpbmUgUkRfU19TRUFDMAkweDAyMDAwMDAwTAkvKiBmcmFtZS1jb3BpZWQgIGNhc2UtaW5kaWNhdG9yICovCisjZGVmaW5lIFJEX1NfU0VBQzEJMHgwNDAwMDAwMEwJLyogYWRkcmVzcy1tYXRjaCBBLWluZGljYXRvciAqLworI2RlZmluZSBSRF9TX1NFQUMyCTB4MDgwMDAwMDBMCS8qIGZyYW1lLWVycm9yICAgRS1pbmRpY2F0b3IgKi8KKyNkZWZpbmUgUkRfU19TU1JDUlRHCTB4MTAwMDAwMDBMCS8qID09IDEgU0EgaGFzIE1TQiBzZXQgKi8KKyNkZWZpbmUgUkRfU19SRVMxCTB4MjAwMDAwMDBMCS8qIHJlc2VydmVkICovCisjZGVmaW5lIFJEX1NfTVNSQUJUCTB4NDAwMDAwMDBMCS8qIG1lbW9yeSBzdGF0dXMgcmVjZWl2ZSBhYm9ydCAqLworI2RlZmluZSBSRF9TX01TVkFMSUQJMHg4MDAwMDAwMEwJLyogbWVtb3J5IHN0YXR1cyB2YWxpZCAqLworCisjZGVmaW5lCVJEX1NUQVRVUwkweGZmZmYwMDAwTAorI2RlZmluZQlSRF9MRU5HVEgJMHgwMDAwZmZmZkwKKworLyogZGVmaW5lcyBmb3IgUmVjZWl2ZSBGcmFtZXMgU3RhdHVzIFdvcmQgdmFsdWVzICovCisvKlJEX1NfU0ZSTVRZKi8KKyNkZWZpbmUgUkRfRlJNX1NNVAkodW5zaWduZWQgbG9uZykoMDw8MjApICAgICAvKiBhc3luY2hyLiBmcmFtZXMgKi8KKyNkZWZpbmUgUkRfRlJNX0xMQ0EJKHVuc2lnbmVkIGxvbmcpKDE8PDIwKQorI2RlZmluZSBSRF9GUk1fSU1QQQkodW5zaWduZWQgbG9uZykoMjw8MjApCisjZGVmaW5lIFJEX0ZSTV9NQUMJKHVuc2lnbmVkIGxvbmcpKDQ8PDIwKSAgICAgLyogc3luY2hyLiBmcmFtZXMgKi8KKyNkZWZpbmUgUkRfRlJNX0xMQ1MJKHVuc2lnbmVkIGxvbmcpKDU8PDIwKQorI2RlZmluZSBSRF9GUk1fSU1QUwkodW5zaWduZWQgbG9uZykoNjw8MjApCisKKyNkZWZpbmUgVFhfREVTQ1JJUFRPUgkweDQwMDAwMDAwTAorI2RlZmluZSBUWF9PRkZTRVRfMwkweDE4MDAwMDAwTAorCisjZGVmaW5lIFRYUDEJMgorCisvKgorICogdHJhbnNtaXQgZnJhbWUgZGVzY3JpcHRvcgorICovCit1bmlvbiB0eF9kZXNjciB7CisJc3RydWN0IHsKKyNpZmRlZglMSVRUTEVfRU5ESUFOCisJdW5zaWduZWQJdHhfbGVuZ3RoOjE2IDsJLyogZnJhbWUgbGVuZ3RoIGxvd2VyL3VwcGVyIGJ5dGUgKi8KKwl1bnNpZ25lZAl0eF9yZXMJIDo4IDsJLyogcmVzZXJ2ZWQgCSAoYml0IDE2Li4yMykgKi8KKwl1bnNpZ25lZAl0eF94bXRhYnQ6MSA7CS8qIHRyYW5zbWl0IGFib3J0ICovCisJdW5zaWduZWQJdHhfbmZjcyAgOjEgOwkvKiBubyBmcmFtZSBjaGVjayBzZXF1ZW5jZSAqLworCXVuc2lnbmVkCXR4X3hkb25lIDoxIDsJLyogZ2l2ZSB1cCB0b2tlbiAqLworCXVuc2lnbmVkCXR4X3JweG0gIDoyIDsJLyogYnl0ZSBvZmZzZXQgKi8KKwl1bnNpZ25lZAl0eF9wYXQxICA6MiA7CS8qIG11c3QgYmUgVFhQMSAqLworCXVuc2lnbmVkCXR4X21vcmUJIDoxIDsJLyogbW9yZSBmcmFtZSBpbiBjaGFpbiAqLworI2Vsc2UKKwl1bnNpZ25lZAl0eF9tb3JlCSA6MSA7CS8qIG1vcmUgZnJhbWUgaW4gY2hhaW4gKi8KKwl1bnNpZ25lZAl0eF9wYXQxICA6MiA7CS8qIG11c3QgYmUgVFhQMSAqLworCXVuc2lnbmVkCXR4X3JweG0gIDoyIDsJLyogYnl0ZSBvZmZzZXQgKi8KKwl1bnNpZ25lZAl0eF94ZG9uZSA6MSA7CS8qIGdpdmUgdXAgdG9rZW4gKi8KKwl1bnNpZ25lZAl0eF9uZmNzICA6MSA7CS8qIG5vIGZyYW1lIGNoZWNrIHNlcXVlbmNlICovCisJdW5zaWduZWQJdHhfeG10YWJ0OjEgOwkvKiB0cmFuc21pdCBhYm9ydCAqLworCXVuc2lnbmVkCXR4X3JlcwkgOjggOwkvKiByZXNlcnZlZCAJIChiaXQgMTYuLjIzKSAqLworCXVuc2lnbmVkCXR4X2xlbmd0aDoxNiA7CS8qIGZyYW1lIGxlbmd0aCBsb3dlci91cHBlciBieXRlICovCisjZW5kaWYKKwl9IHQgOworCWxvbmcJaSA7Cit9IDsKKworLyogZGVmaW5lcyBmb3IgVHJhbnNtaXQgRGVzY3JpcHRvciBhY2Nlc3MgKi8KKyNkZWZpbmUJVERfQ19NT1JFCTB4ODAwMDAwMDBMCS8qIG1vcmUgZnJhbWUgaW4gY2hhaW4gKi8KKyNkZWZpbmUJVERfQ19ERVNDUgkweDYwMDAwMDAwTAkvKiBtdXN0IGJlIFRYUDEgKi8KKyNkZWZpbmUJVERfQ19UWEZCQgkweDE4MDAwMDAwTAkvKiBieXRlIG9mZnNldCAqLworI2RlZmluZQlURF9DX1hET05FCTB4MDQwMDAwMDBMCS8qIGdpdmUgdXAgdG9rZW4gKi8KKyNkZWZpbmUgVERfQ19ORkNTCTB4MDIwMDAwMDBMCS8qIG5vIGZyYW1lIGNoZWNrIHNlcXVlbmNlICovCisjZGVmaW5lIFREX0NfWE1UQUJUCTB4MDEwMDAwMDBMCS8qIHRyYW5zbWl0IGFib3J0ICovCisKKyNkZWZpbmUJVERfQ19MTkNOVQkweDAwMDBmZjAwTAkKKyNkZWZpbmUgVERfQ19MTkNOTAkweDAwMDAwMGZmTAorI2RlZmluZSBURF9DX0xOQ04JMHgwMDAwZmZmZkwJLyogZnJhbWUgbGVuZ3RoIGxvd2VyL3VwcGVyIGJ5dGUgKi8KKyAKKy8qCisgKiB0cmFuc21pdCBwb2ludGVyCisgKi8KK3VuaW9uIHR4X3BvaW50ZXIgeworCXN0cnVjdCB0IHsKKyNpZmRlZglMSVRUTEVfRU5ESUFOCisJdW5zaWduZWQJdHBfcG9pbnRlcjoxNiA7CS8qIHBvaW50ZXIgdG8gdHhfZGVzY3IgKGxvdy9oaWdoKSAqLworCXVuc2lnbmVkCXRwX3JlcwkgIDo4IDsJLyogcmVzZXJ2ZWQgCSAoYml0IDE2Li4yMykgKi8KKwl1bnNpZ25lZAl0cF9wYXR0ZXJuOjggOwkvKiBmaXhlZCBwYXR0ZXJuIChiaXQgMjQuLjMxKSAqLworI2Vsc2UKKwl1bnNpZ25lZAl0cF9wYXR0ZXJuOjggOwkvKiBmaXhlZCBwYXR0ZXJuIChiaXQgMjQuLjMxKSAqLworCXVuc2lnbmVkCXRwX3JlcwkgIDo4IDsJLyogcmVzZXJ2ZWQgCSAoYml0IDE2Li4yMykgKi8KKwl1bnNpZ25lZAl0cF9wb2ludGVyOjE2IDsJLyogcG9pbnRlciB0byB0eF9kZXNjciAobG93L2hpZ2gpICovCisjZW5kaWYKKwl9IHQgOworCWxvbmcJaSA7Cit9IDsKKworLyogZGVmaW5lcyBmb3IgTm9udGFnIE1vZGUgUG9pbnRlciBhY2Nlc3MgKi8KKyNkZWZpbmUJVERfUF9DTlRSTAkweGZmMDAwMDAwTAorI2RlZmluZSBURF9QX1JQWFUJMHgwMDAwZmYwMEwKKyNkZWZpbmUgVERfUF9SUFhMCTB4MDAwMDAwZmZMCisjZGVmaW5lIFREX1BfUlBYCTB4MDAwMGZmZmZMCisKKworI2RlZmluZSBUWF9QQVRURVJOCTB4YTAKKyNkZWZpbmUgVFhfUE9JTlRFUl9FTkQJMHhhMDAwMDAwMEwKKyNkZWZpbmUgVFhfSU5UX1BBVFRFUk4JMHhhMDAwMDAwMEwKKworc3RydWN0IHR4X3F1ZXVlIHsKKwlzdHJ1Y3QgdHhfcXVldWUgKnRxX25leHQgOworCXVfc2hvcnQgdHFfcGFja19vZmZzZXQgOwkvKiBvZmZzZXQgYnVmZmVyIG1lbW9yeSAqLworCXVfY2hhciAgdHFfcGFkWzJdIDsKK30gOworCisvKgorCWRlZmluZXMgZm9yIEZPUk1BQyBQbHVzIChBbTc5QzgzMCkKKyovCisKKy8qCisgKiAgRk9STUFDKyByZWFkL3dyaXRlIChyL3cpIHJlZ2lzdGVycworICovCisjZGVmaW5lIEZNX0NNRFJFRzEJMHgwMAkJLyogd3JpdGUgY29tbWFuZCByZWcgMSBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBGTV9DTURSRUcyCTB4MDEJCS8qIHdyaXRlIGNvbW1hbmQgcmVnIDIgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgRk1fU1QxVQkJMHgwMAkJLyogcmVhZCB1cHBlciAxNi1iaXQgb2Ygc3RhdHVzIHJlZyAxICovCisjZGVmaW5lIEZNX1NUMUwJCTB4MDEJCS8qIHJlYWQgbG93ZXIgMTYtYml0IG9mIHN0YXR1cyByZWcgMSAqLworI2RlZmluZSBGTV9TVDJVCQkweDAyCQkvKiByZWFkIHVwcGVyIDE2LWJpdCBvZiBzdGF0dXMgcmVnIDIgKi8KKyNkZWZpbmUgRk1fU1QyTAkJMHgwMwkJLyogcmVhZCBsb3dlciAxNi1iaXQgb2Ygc3RhdHVzIHJlZyAyICovCisjZGVmaW5lIEZNX0lNU0sxVQkweDA0CQkvKiByL3cgdXBwZXIgMTYtYml0IG9mIElNU0sgMSAqLworI2RlZmluZSBGTV9JTVNLMUwJMHgwNQkJLyogci93IGxvd2VyIDE2LWJpdCBvZiBJTVNLIDEgKi8KKyNkZWZpbmUgRk1fSU1TSzJVCTB4MDYJCS8qIHIvdyB1cHBlciAxNi1iaXQgb2YgSU1TSyAyICovCisjZGVmaW5lIEZNX0lNU0syTAkweDA3CQkvKiByL3cgbG93ZXIgMTYtYml0IG9mIElNU0sgMiAqLworI2RlZmluZSBGTV9TQUlECQkweDA4CQkvKiByL3cgc2hvcnQgYWRkci4taW5kaXZpZHVhbCAqLworI2RlZmluZSBGTV9MQUlNCQkweDA5CQkvKiByL3cgbG9uZyBhZGRyLi1pbmQuIChNU1cgb2YgTEFJRCkgKi8KKyNkZWZpbmUgRk1fTEFJQwkJMHgwYQkJLyogci93IGxvbmcgYWRkci4taW5kLiAobWlkZGxlKSovCisjZGVmaW5lIEZNX0xBSUwJCTB4MGIJCS8qIHIvdyBsb25nIGFkZHIuLWluZC4gKExTVykgKi8KKyNkZWZpbmUgRk1fU0FHUAkJMHgwYwkJLyogci93IHNob3J0IGFkZHJlc3MtZ3JvdXAgKi8KKyNkZWZpbmUgRk1fTEFHTQkJMHgwZAkJLyogci93IGxvbmcgYWRkci4tZ3IuIChNU1cgb2YgTEFHUCkgKi8KKyNkZWZpbmUgRk1fTEFHQwkJMHgwZQkJLyogci93IGxvbmcgYWRkci4tZ3IuIChtaWRkbGUpICovCisjZGVmaW5lIEZNX0xBR0wJCTB4MGYJCS8qIHIvdyBsb25nIGFkZHIuLWdyLiAoTFNXKSAqLworI2RlZmluZSBGTV9NRFJFRzEJMHgxMAkJLyogci93IDE2LWJpdCBtb2RlIHJlZyAxICovCisjZGVmaW5lIEZNX1NUTUNITgkweDExCQkvKiByZWFkIHN0YXRlLW1hY2hpbmUgcmVnICovCisjZGVmaW5lIEZNX01JUjEJCTB4MTIJCS8qIHJlYWQgdXBwZXIgMTYtYml0IG9mIE1BQyBJbmZvIFJlZyAqLworI2RlZmluZSBGTV9NSVIwCQkweDEzCQkvKiByZWFkIGxvd2VyIDE2LWJpdCBvZiBNQUMgSW5mbyBSZWcgKi8KKyNkZWZpbmUgRk1fVE1BWAkJMHgxNAkJLyogci93IDE2LWJpdCBUTUFYIHJlZyAqLworI2RlZmluZSBGTV9UVlgJCTB4MTUJCS8qIHdyaXRlIDgtYml0IFRWWCByZWcgd2l0aCBOUDctMAorCQkJCQkgICByZWFkIFRWWCBvbiBOUDctMCwgdGltZXIgb24gTlAxNS04Ki8KKyNkZWZpbmUgRk1fVFJUCQkweDE2CQkvKiByL3cgdXBwZXIgMTYtYml0IG9mIFRSVCB0aW1lciAqLworI2RlZmluZSBGTV9USFQJCTB4MTcJCS8qIHIvdyB1cHBlciAxNi1iaXQgb2YgVEhUIHRpbWVyICovCisjZGVmaW5lIEZNX1RORUcJCTB4MTgJCS8qIHJlYWQgdXBwZXIgMTYtYml0IG9mIFRORUcgKFRUUlQpICovCisjZGVmaW5lIEZNX1RNUlMJCTB4MTkJCS8qIHJlYWQgbG93ZXIgNS1iaXQgb2YgVE5FRyxUUlQsVEhUICovCisJCQkvKiBGIEUgRCBDICBCIEEgOSA4ICA3IDYgNSA0ICAzIDIgMSAwCisJCQkgICB4IHwtVE5FRzQtMHwgfC1UUlQ0LTAtfCB8LVRIVDQtMC18ICh4LWxhdGUgY291bnQpICovCisjZGVmaW5lIEZNX1RSRVEwCTB4MWEJCS8qIHIvdyAxNi1iaXQgVFJFUTAgcmVnIChMU1cgb2YgVFJUKSAqLworI2RlZmluZSBGTV9UUkVRMQkweDFiCQkvKiByL3cgMTYtYml0IFRSRVExIHJlZyAoTVNXIG9mIFRSVCkgKi8KKyNkZWZpbmUgRk1fUFJJMAkJMHgxYwkJLyogci93IHByaW9yaXR5IHIuIGZvciBhc3luLi1xdWV1ZSAwICovCisjZGVmaW5lIEZNX1BSSTEJCTB4MWQJCS8qIHIvdyBwcmlvcml0eSByLiBmb3IgYXN5bi4tcXVldWUgMSAqLworI2RlZmluZSBGTV9QUkkyCQkweDFlCQkvKiByL3cgcHJpb3JpdHkgci4gZm9yIGFzeW4uLXF1ZXVlIDIgKi8KKyNkZWZpbmUgRk1fVFNZTkMJMHgxZgkJLyogci93IDE2LWJpdCBvZiB0aGUgVFNZTkMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRk1fTURSRUcyCTB4MjAJCS8qIHIvdyAxNi1iaXQgbW9kZSByZWcgMiAqLworI2RlZmluZSBGTV9GUk1USFIJMHgyMQkJLyogci93IHRoZSBmcmFtZSB0aHJlc2hvbGQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRk1fRUFDQgkJMHgyMgkJLyogci93IGVuZCBhZGRyIG9mIGNsYWltL2JlYWNvbiBhcmVhICovCisjZGVmaW5lIEZNX0VBUlYJCTB4MjMJCS8qIHIvdyBlbmQgYWRkciBvZiByZWNlaXZlIHF1ZXVlICovCisvKiBTdXBlcm5ldCAzICovCisjZGVmaW5lCUZNX0VBUlYxCUZNX0VBUlYKKworI2RlZmluZSBGTV9FQVMJCTB4MjQJCS8qIHIvdyBlbmQgYWRkciBvZiBzeW5jaHIuIHF1ZXVlICovCisjZGVmaW5lIEZNX0VBQTAJCTB4MjUJCS8qIHIvdyBlbmQgYWRkciBvZiBhc3luLiBxdWV1ZSAwICovCisjZGVmaW5lIEZNX0VBQTEJCTB4MjYJCS8qIHIvdyBlbmQgYWRkciBvZiBhc3luLiBxdWV1ZSAxICovCisjZGVmaW5lIEZNX0VBQTIJCTB4MjcJCS8qIHIvdyBlbmQgYWRkciBvZiBhc3luLiBxdWV1ZSAyICovCisjZGVmaW5lIEZNX1NBQ0wJCTB4MjgJCS8qIHIvdyBzdGFydCBhZGRyIG9mIGNsYWltIGZyYW1lICovCisjZGVmaW5lIEZNX1NBQkMJCTB4MjkJCS8qIHIvdyBzdGFydCBhZGRyIG9mIGJlYWNvbiBmcmFtZSAqLworI2RlZmluZSBGTV9XUFhTRgkweDJhCQkvKiByL3cgdGhlIHdyaXRlIHB0ci4gZm9yIHNwZWNpYWwgZnIuKi8KKyNkZWZpbmUgRk1fUlBYU0YJMHgyYgkJLyogci93IHRoZSByZWFkIHB0ci4gZm9yIHNwZWNpYWwgZnIuICovCisjZGVmaW5lIEZNX1JQUgkJMHgyZAkJLyogci93IHRoZSByZWFkIHB0ci4gZm9yIHJlY2VpdmUgcXUuICovCisjZGVmaW5lIEZNX1dQUgkJMHgyZQkJLyogci93IHRoZSB3cml0ZSBwdHIuIGZvciByZWNlaXZlIHF1LiovCisjZGVmaW5lIEZNX1NXUFIJCTB4MmYJCS8qIHIvdyB0aGUgc2hhZG93IHdyLi1wdHIuIGZvciByZWMucS4qLworLyogU3VwZXJuZXQgMyAqLyAKKyNkZWZpbmUgRk1fUlBSMSAgICAgICAgIEZNX1JQUiAgIAorI2RlZmluZSBGTV9XUFIxICAgICAgICAgRk1fV1BSIAorI2RlZmluZSBGTV9TV1BSMSAgICAgICAgRk1fU1dQUgorCisjZGVmaW5lIEZNX1dQWFMJCTB4MzAJCS8qIHIvdyB0aGUgd3JpdGUgcHRyLiBmb3Igc3luY2hyLiBxdS4qLworI2RlZmluZSBGTV9XUFhBMAkweDMxCQkvKiByL3cgdGhlIHdyaXRlIHB0ci4gZm9yIGFzeW4uIHF1LjAgKi8KKyNkZWZpbmUgRk1fV1BYQTEJMHgzMgkJLyogci93IHRoZSB3cml0ZSBwdHIuIGZvciBhc3luLiBxdS4xICovCisjZGVmaW5lIEZNX1dQWEEyCTB4MzMJCS8qIHIvdyB0aGUgd3JpdGUgcHRyLiBmb3IgYXN5bi4gcXUuMiAqLworI2RlZmluZSBGTV9TV1BYUwkweDM0CQkvKiByL3cgdGhlIHNoYWRvdyB3ci4tcHRyLiBmb3Igc3luLnEuKi8KKyNkZWZpbmUgRk1fU1dQWEEwCTB4MzUJCS8qIHIvdyB0aGUgc2hhZC4gd3IuLXB0ci4gZm9yIGFzeW4ucTAqLworI2RlZmluZSBGTV9TV1BYQTEJMHgzNgkJLyogci93IHRoZSBzaGFkLiB3ci4tcHRyLiBmb3IgYXN5bi5xMSovCisjZGVmaW5lIEZNX1NXUFhBMgkweDM3CQkvKiByL3cgdGhlIHNoYWQuIHdyLi1wdHIuIGZvciBhc3luLnEyKi8KKyNkZWZpbmUgRk1fUlBYUwkJMHgzOAkJLyogci93IHRoZSByZWFkIHB0ci4gZm9yIHN5bmNoci4gcXUuICovCisjZGVmaW5lIEZNX1JQWEEwCTB4MzkJCS8qIHIvdyB0aGUgcmVhZCBwdHIuIGZvciBhc3luLiBxdS4gMCAqLworI2RlZmluZSBGTV9SUFhBMQkweDNhCQkvKiByL3cgdGhlIHJlYWQgcHRyLiBmb3IgYXN5bi4gcXUuIDEgKi8KKyNkZWZpbmUgRk1fUlBYQTIJMHgzYgkJLyogci93IHRoZSByZWFkIHB0ci4gZm9yIGFzeW4uIHF1LiAyICovCisjZGVmaW5lIEZNX01BUlIJCTB4M2MJCS8qIHIvdyB0aGUgbWVtb3J5IHJlYWQgYWRkciByZWdpc3RlciAqLworI2RlZmluZSBGTV9NQVJXCQkweDNkCQkvKiByL3cgdGhlIG1lbW9yeSB3cml0ZSBhZGRyIHJlZ2lzdGVyKi8KKyNkZWZpbmUgRk1fTURSVQkJMHgzZQkJLyogci93IHVwcGVyIDE2LWJpdCBvZiBtZW0uIGRhdGEgcmVnICovCisjZGVmaW5lIEZNX01EUkwJCTB4M2YJCS8qIHIvdyBsb3dlciAxNi1iaXQgb2YgbWVtLiBkYXRhIHJlZyAqLworCisvKiBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHJlbGF0ZSB0byBNQUMgY291bnRlcnMgYW5kIHRpbWVyICovCisjZGVmaW5lIEZNX1RNU1lOQwkweDQwCQkvKiByL3cgdXBwZXIgMTYgYml0cyBvZiBUTVNZTkMgdGltZXIgKi8KKyNkZWZpbmUgRk1fRkNOVFIJMHg0MQkJLyogci93IHRoZSAxNi1iaXQgZnJhbWUgY291bnRlciAqLworI2RlZmluZSBGTV9MQ05UUgkweDQyCQkvKiByL3cgdGhlIDE2LWJpdCBsb3N0IGNvdW50ZXIgKi8KKyNkZWZpbmUgRk1fRUNOVFIJMHg0MwkJLyogci93IHRoZSAxNi1iaXQgZXJyb3IgY291bnRlciAqLworCisvKiBTdXBlcm5ldCAzOglleHRlbnNpb25zIHRvIG9sZCByZWdpc3RlciBibG9jayAqLworI2RlZmluZQlGTV9GU0NOVFIJMHg0NAkJLyogci8/IEZyYW1lIFN0cmlwIENvdW50ZXIgKi8KKyNkZWZpbmUJRk1fRlJTRUxSRUcJMHg0NQkJLyogci93IEZyYW1lIFNlbGVjdGlvbiBSZWdpc3RlciAqLworCisvKiBTdXBlcm5ldCAzOglleHRlbnNpb25zIGZvciAyLiByZWNlaXZlIHF1ZXVlIGV0Yy4gKi8KKyNkZWZpbmUJRk1fTURSRUczCTB4NjAJCS8qIHIvdyBNb2RlIFJlZ2lzdGVyIDMgKi8KKyNkZWZpbmUJRk1fU1QzVQkJMHg2MQkJLyogcmVhZCB1cHBlciAxNi1iaXQgb2Ygc3RhdHVzIHJlZyAzICovCisjZGVmaW5lCUZNX1NUM0wJCTB4NjIJCS8qIHJlYWQgbG93ZXIgMTYtYml0IG9mIHN0YXR1cyByZWcgMyAqLworI2RlZmluZQlGTV9JTVNLM1UJMHg2MwkJLyogci93IHVwcGVyIDE2LWJpdCBvZiBJTVNLIHJlZyAzICovCisjZGVmaW5lCUZNX0lNU0szTAkweDY0CQkvKiByL3cgbG93ZXIgMTYtYml0IG9mIElNU0sgcmVnIDMgKi8KKyNkZWZpbmUJRk1fSVZSCQkweDY1CQkvKiByZWFkIEludGVycnVwdCBWZWN0b3IgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJRk1fSU1SCQkweDY2CQkvKiByL3cgSW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKi8KKy8qIDB4NjcJSGlkZGVuICovCisjZGVmaW5lCUZNX1JQUjIJCTB4NjgJCS8qIHIvdyB0aGUgcmVhZCBwdHIuIGZvciByZWMuIHF1LiAyICovCisjZGVmaW5lCUZNX1dQUjIJCTB4NjkJCS8qIHIvdyB0aGUgd3JpdGUgcHRyLiBmb3IgcmVjLiBxdS4gMiAqLworI2RlZmluZQlGTV9TV1BSMgkweDZhCQkvKiByL3cgdGhlIHNoYWRvdyB3cHRyLiBmb3IgcmVjLiBxLiAyICovCisjZGVmaW5lCUZNX0VBUlYyCTB4NmIJCS8qIHIvdyBlbmQgYWRkciBvZiByZWMuIHF1LiAyICovCisjZGVmaW5lCUZNX1VOTENLRExZCTB4NmMJCS8qIHIvdyBBdXRvIFVubG9jayBEZWxheSByZWdpc3RlciAqLworCQkJCQkvKiBCaXQgMTUtODogUkVDVjIgdW5sb2NrIHRocmVzaG9sZCAqLworCQkJCQkvKiBCaXQgIDctMDogUkVDVjEgdW5sb2NrIHRocmVzaG9sZCAqLworLyogMHg2Zi0weDczCUhpZGRlbiAqLworI2RlZmluZQlGTV9MVERQQTEJMHg3OQkJLyogci93IExhc3QgVHJhbnMgZGVzYyBwdHIgZm9yIEExIHF1LiAqLworLyogMHg4MC0weDlhCVBMQ1MgcmVnaXN0ZXJzIG9mIGJ1aWx0LWluIFBMQ1MgIChTdXBlcm5ldCAzIG9ubHkpICovCisKKy8qIFN1cGVybmV0IDM6IEFkZGVyc3MgRmlsdGVyIFJlZ2lzdGVycyAqLworI2RlZmluZQlGTV9BRkNNRAkweGIwCQkvKiByL3cgQWRkcmVzcyBGaWx0ZXIgQ29tbWFuZCBSZWcgKi8KKyNkZWZpbmUJRk1fQUZTVEFUCTB4YjIJCS8qIHIvdyBBZGRyZXNzIEZpbHRlciBTdGF0dXMgUmVnICovCisjZGVmaW5lCUZNX0FGQklTVAkweGI0CQkvKiByL3cgQWRkcmVzcyBGaWx0ZXIgQklTVCBzaWduYXR1cmUgKi8KKyNkZWZpbmUJRk1fQUZDT01QMgkweGI2CQkvKiByL3cgQWRkcmVzcyBGaWx0ZXIgQ29tcGFyYW5kIDIgKi8KKyNkZWZpbmUJRk1fQUZDT01QMQkweGI4CQkvKiByL3cgQWRkcmVzcyBGaWx0ZXIgQ29tcGFyYW5kIDEgKi8KKyNkZWZpbmUJRk1fQUZDT01QMAkweGJhCQkvKiByL3cgQWRkcmVzcyBGaWx0ZXIgQ29tcGFyYW5kIDAgKi8KKyNkZWZpbmUJRk1fQUZNQVNLMgkweGJjCQkvKiByL3cgQWRkcmVzcyBGaWx0ZXIgTWFzayAyICovCisjZGVmaW5lCUZNX0FGTUFTSzEJMHhiZQkJLyogci93IEFkZHJlc3MgRmlsdGVyIE1hc2sgMSAqLworI2RlZmluZQlGTV9BRk1BU0swCTB4YzAJCS8qIHIvdyBBZGRyZXNzIEZpbHRlciBNYXNrIDAgKi8KKyNkZWZpbmUJRk1fQUZQRVJTCTB4YzIJCS8qIHIvdyBBZGRyZXNzIEZpbHRlciBQZXJzb25hbGl0eSBSZWcgKi8KKworLyogU3VwZXJuZXQgMzogT3Jpb24gKFBEWD8pIFJlZ2lzdGVycyAqLworI2RlZmluZQlGTV9PUkJJU1QJMHhkMAkJLyogci93IE9yaW9uIEJJU1Qgc2lnbmF0dXJlICovCisjZGVmaW5lCUZNX09SU1RBVAkweGQyCQkvKiByL3cgT3Jpb24gU3RhdHVzIFJlZ2lzdGVyICovCisKKworLyoKKyAqIE1vZGUgUmVnaXN0ZXIgMSAoTURSRUcxKQorICovCisjZGVmaW5lIEZNX1JFUzAJCTB4MDAwMQkJLyogcmVzZXJ2ZWQgKi8KKwkJCQkJLyogU04zOiBvdGhlciBkZWZpbml0aW9uICovCisjZGVmaW5lCUZNX1hNVElOSF9IT0xECTB4MDAwMgkJLyogdHJhbnNtaXQtaW5oaWJpdC9ob2xkIGJpdCAqLworCQkJCQkvKiBTTjM6IG90aGVyIGRlZmluaXRpb24gKi8KKyNkZWZpbmUJRk1fSE9GTFhJCTB4MDAwMwkJLyogU04zOiBIb2xkIC8gRmx1c2ggLyBJbmhpYml0ICovCisjZGVmaW5lCUZNX0ZVTExfSEFMRgkweDAwMDQJCS8qIGZ1bGwtZHVwbGV4L2hhbGYtZHVwbGV4IGJpdCAqLworI2RlZmluZQlGTV9MT0NLVFgJMHgwMDA4CQkvKiBsb2NrLXRyYW5zbWl0LWFzeW5jaHIuLXF1ZXVlcyBiaXQgKi8KKyNkZWZpbmUgRk1fRVhHUEEwCTB4MDAxMAkJLyogZXh0ZW5kZWQtZ3JvdXAtYWRkcmVzc2luZyBiaXQgMCAqLworI2RlZmluZSBGTV9FWEdQQTEJMHgwMDIwCQkvKiBleHRlbmRlZC1ncm91cC1hZGRyZXNzaW5nIGJpdCAxICovCisjZGVmaW5lIEZNX0RJU0NSWQkweDAwNDAJCS8qIGRpc2FibGUtY2FycnkgYml0ICovCisJCQkJCS8qIFNOMzogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRk1fU0VMUkEJMHgwMDgwCQkvKiBzZWxlY3QgaW5wdXQgZnJvbSBQSFkgKDE9UkEsMD1SQikgKi8KKworI2RlZmluZSBGTV9BRERFVAkweDA3MDAJCS8qIGFkZHJlc3MgZGV0ZWN0aW9uICovCisjZGVmaW5lIEZNX01EQU1BCSgwPDw4KQkJLyogYWRkcmVzcyBkZXRlY3Rpb24gOiBEQSA9IE1BICovCisjZGVmaW5lIEZNX01EQVNBTUEJKDE8PDgpCQkvKiBhZGRyZXNzIGRldGVjdGlvbiA6IERBPU1BfHxTQT1NQSAqLworI2RlZmluZQlGTV9NUk5OU0FGTk1BCSgyPDw4KQkJLyogcmVjLiBub24tTlNBIGZyYW1lcyBEQT1NQSYmU0EhPU1BICovCisjZGVmaW5lCUZNX01STk5TQUYJKDM8PDgpCQkvKiByZWMuIG5vbi1OU0EgZnJhbWVzIERBID0gTUEgKi8KKyNkZWZpbmUJRk1fTURJU1JDVgkoNDw8OCkJCS8qIGRpc2FibGUgcmVjZWl2ZSBmdW5jdGlvbiAqLworI2RlZmluZQlGTV9NUkVTMAkoNTw8OCkJCS8qIHJlc2VydmUgKi8KKyNkZWZpbmUJRk1fTUxJTVBST00JKDY8PDgpCQkvKiBsaW1pdGVkLXByb21pc2N1b3VzIG1vZGUgKi8KKyNkZWZpbmUgRk1fTVBST01JU0NPVVMJKDc8PDgpCQkvKiBhZGRyZXNzIGRldGVjdGlvbiA6IHByb21pc2NvdXMgKi8KKworI2RlZmluZSBGTV9TRUxTQQkweDA4MDAJCS8qIHNlbGVjdC1zaG9ydC1hZGRyZXNzIGJpdCAqLworCisjZGVmaW5lIEZNX01NT0RFCTB4NzAwMAkJLyogbW9kZSBzZWxlY3QgKi8KKyNkZWZpbmUgRk1fTUlOSVQJKDA8PDEyKQkJLyogaW5pdGlhbGl6ZSAqLworI2RlZmluZSBGTV9NTUVNQUNUCSgxPDwxMikJCS8qIG1lbW9yeSBhY3RpdmF0ZSAqLworI2RlZmluZSBGTV9NT05MSU5FU1AJKDI8PDEyKQkJLyogb24tbGluZSBzcGVjaWFsICovCisjZGVmaW5lIEZNX01PTkxJTkUJKDM8PDEyKQkJLyogb24tbGluZSAoRkRESSBvcGVyYXRpb25hbCBtb2RlKSAqLworI2RlZmluZSBGTV9NSUxPT1AJKDQ8PDEyKQkJLyogaW50ZXJuYWwgbG9vcGJhY2sgKi8KKyNkZWZpbmUgRk1fTVJFUzEJKDU8PDEyKQkJLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRk1fTVJFUzIJKDY8PDEyKQkJLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRk1fTUVMT09QCSg3PDwxMikJCS8qIGV4dGVybmFsIGxvb3BiYWNrICovCisKKyNkZWZpbmUJRk1fU05HTEZSTQkweDgwMDAJCS8qIHNpbmdsZS1mcmFtZS1yZWNlaXZlIG1vZGUgKi8KKwkJCQkJLyogU04zOiByZXNlcnZlZCAqLworCisjZGVmaW5lCU1EUjFJTklUCShGTV9NSU5JVCB8IEZNX01EQU1BKQorCisvKgorICogTW9kZSBSZWdpc3RlciAyIChNRFJFRzIpCisgKi8KKyNkZWZpbmUJRk1fQUZVTEwJMHgwMDBmCQkvKiA0LWJpdCB2YWx1ZSAoZW1wdHkgbG9jLmluIHR4cXVldWUpKi8KKyNkZWZpbmUJRk1fUkNWRVJSCTB4MDAxMAkJLyogcmVjLi1lcnJvcmVkLWZyYW1lcyBiaXQgKi8KKyNkZWZpbmUJRk1fU1lNQ1RMCTB4MDAyMAkJLyogc3lzbWJvbC1jb250cm9sIGJpdCAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lCUZNX1NZTlBSUQkweDAwNDAJCS8qIHN5bmNocm9uLi1OUC1ETUEtcmVxdWVzdCBiaXQgKi8KKyNkZWZpbmUJRk1fRU5OUFJRCTB4MDA4MAkJLyogZW5hYmxlLU5QLURNQS1yZXF1ZXN0IGJpdCAqLworI2RlZmluZQlGTV9FTkhTUlEJMHgwMTAwCQkvKiBlbmFibGUtaG9zdC1yZXF1ZXN0IGJpdCAqLworI2RlZmluZQlGTV9SWEZCQjAxCTB4MDYwMAkJLyogcmVjLiBmcmFtZSBieXRlIGJvdW5kYXJ5IGJpdDAgJiAxICovCisjZGVmaW5lCUZNX0xTQgkJMHgwODAwCQkvKiBkZXRlcm0uIG9yZGVyaW5nIG9mIGJ5dGVzIGluIGJ1ZmZlciovCisjZGVmaW5lCUZNX1BBUklUWQkweDEwMDAJCS8qIDEgPSBldmVuLCAwID0gb2RkICovCisjZGVmaW5lCUZNX0NIS1BBUgkweDIwMDAJCS8qIDEgPSBwYXJpdHkgb2YgMzItYml0IGJ1ZmZlciBCRC1idXMqLworI2RlZmluZQlGTV9TVFJQRkNTCTB4NDAwMAkJLyogMSA9IHN0cmlwcyBGQ1MgZmllbGQgb2YgcmVjLmZyYW1lICovCisjZGVmaW5lCUZNX0JNTU9ERQkweDgwMDAJCS8qIEJ1ZmZlci1NZW1vcnktTW9kZSAoMSA9IHRhZyBtb2RlKSAqLworCQkJCQkvKiBTTjM6IDEgPSB0YWcsIDAgPSBtb2RpZmllZCB0YWcgKi8KKworLyoKKyAqIFN0YXR1cyBSZWdpc3RlciAxLCBVcHBlciAxNiBCaXRzIChTVDFVKQorICovCisjZGVmaW5lIEZNX1NURUZSTVMJMHgwMDAxCQkvKiB0cmFuc21pdCBlbmQgb2YgZnJhbWU6IHN5bmNoci4gcXUuKi8KKyNkZWZpbmUgRk1fU1RFRlJNQTAJMHgwMDAyCQkvKiB0cmFuc21pdCBlbmQgb2YgZnJhbWU6IGFzeW4uIHF1LjAgKi8KKyNkZWZpbmUgRk1fU1RFRlJNQTEJMHgwMDA0CQkvKiB0cmFuc21pdCBlbmQgb2YgZnJhbWU6IGFzeW4uIHF1LjEgKi8KKyNkZWZpbmUgRk1fU1RFRlJNQTIJMHgwMDA4CQkvKiB0cmFuc21pdCBlbmQgb2YgZnJhbWU6IGFzeW4uIHF1LjIgKi8KKwkJCQkJLyogU04zOiByZXNlcnZlZCAqLworI2RlZmluZSBGTV9TVEVDRlJNUwkweDAwMTAJCS8qIHRyYW5zbWl0IGVuZCBvZiBjaGFpbiBvZiBzeW4uIHF1LiAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lIEZNX1NURUNGUk1BMAkweDAwMjAJCS8qIHRyYW5zbWl0IGVuZCBvZiBjaGFpbiBvZiBhc3luLiBxMCAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lIEZNX1NURUNGUk1BMQkweDAwNDAJCS8qIHRyYW5zbWl0IGVuZCBvZiBjaGFpbiBvZiBhc3luLiBxMSAqLworCQkJCQkvKiBTTjM6IFNURUNNREExICovCisjZGVmaW5lIEZNX1NURUNNREExCTB4MDA0MAkJLyogU04zOiAnbm8gZGVzY3JpcHRpb24nICovCisjZGVmaW5lIEZNX1NURUNGUk1BMgkweDAwODAJCS8qIHRyYW5zbWl0IGVuZCBvZiBjaGFpbiBvZiBhc3luLiBxMiAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lCUZNX1NURVhET05TCTB4MDEwMAkJLyogdHJhbnNtaXQgdW50aWwgWERPTkUgaW4gc3luLiBxdS4gKi8KKyNkZWZpbmUJRk1fU1RCRkxBCTB4MDIwMAkJLyogYXN5bmNoci4tcXVldWUgdHJhbnMuIGJ1ZmZlciBmdWxsICovCisjZGVmaW5lCUZNX1NUQkZMUwkweDA0MDAJCS8qIHN5bmNoci4tcXVldWUgdHJhbnNtLiBidWZmZXIgZnVsbCAqLworI2RlZmluZQlGTV9TVFhBQlJTCTB4MDgwMAkJLyogc3luY2hyLiBxdWV1ZSB0cmFuc21pdC1hYm9ydCAqLworI2RlZmluZQlGTV9TVFhBQlJBMAkweDEwMDAJCS8qIGFzeW5jaHIuIHF1ZXVlIDAgdHJhbnNtaXQtYWJvcnQgKi8KKyNkZWZpbmUJRk1fU1RYQUJSQTEJMHgyMDAwCQkvKiBhc3luY2hyLiBxdWV1ZSAxIHRyYW5zbWl0LWFib3J0ICovCisjZGVmaW5lCUZNX1NUWEFCUkEyCTB4NDAwMAkJLyogYXN5bmNoci4gcXVldWUgMiB0cmFuc21pdC1hYm9ydCAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lCUZNX1NYTVRBQlQJMHg4MDAwCQkvKiB0cmFuc21pdCBhYm9ydCAqLworCisvKgorICogU3RhdHVzIFJlZ2lzdGVyIDEsIExvd2VyIDE2IEJpdHMgKFNUMUwpCisgKi8KKyNkZWZpbmUgRk1fU1FMQ0tTCTB4MDAwMQkJLyogcXVldWUgbG9jayBmb3Igc3luY2hyLiBxdWV1ZSAqLworI2RlZmluZSBGTV9TUUxDS0EwCTB4MDAwMgkJLyogcXVldWUgbG9jayBmb3IgYXN5bmNoci4gcXVldWUgMCAqLworI2RlZmluZSBGTV9TUUxDS0ExCTB4MDAwNAkJLyogcXVldWUgbG9jayBmb3IgYXN5bmNoci4gcXVldWUgMSAqLworI2RlZmluZSBGTV9TUUxDS0EyCTB4MDAwOAkJLyogcXVldWUgbG9jayBmb3IgYXN5bmNoci4gcXVldWUgMiAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lIEZNX1NUWElORkxTCTB4MDAxMAkJLyogdHJhbnNtaXQgaW5zdHJ1Y3Rpb24gZnVsbDogc3luLiAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lIEZNX1NUWElORkxBMAkweDAwMjAJCS8qIHRyYW5zbWl0IGluc3RydWN0aW9uIGZ1bGw6IGFzeW4uMCAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lIEZNX1NUWElORkxBMQkweDAwNDAJCS8qIHRyYW5zbWl0IGluc3RydWN0aW9uIGZ1bGw6IGFzeW4uMSAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lIEZNX1NUWElORkxBMgkweDAwODAJCS8qIHRyYW5zbWl0IGluc3RydWN0aW9uIGZ1bGw6IGFzeW4uMiAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lIEZNX1NQQ0VQRFMJMHgwMTAwCQkvKiBwYXJpdHkvY29kaW5nIGVycm9yOiBzeW4uIHF1ZXVlICovCisjZGVmaW5lIEZNX1NQQ0VQREEwCTB4MDIwMAkJLyogcGFyaXR5L2NvZGluZyBlcnJvcjogYXN5bi4gcXVldWUwICovCisjZGVmaW5lIEZNX1NQQ0VQREExCTB4MDQwMAkJLyogcGFyaXR5L2NvZGluZyBlcnJvcjogYXN5bi4gcXVldWUxICovCisjZGVmaW5lIEZNX1NQQ0VQREEyCTB4MDgwMAkJLyogcGFyaXR5L2NvZGluZyBlcnJvcjogYXN5bi4gcXVldWUyICovCisJCQkJCS8qIFNOMzogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRk1fU1RCVVJTCTB4MTAwMAkJLyogdHJhbnNtaXQgYnVmZmVyIHVuZGVycnVuOiBzeW4uIHEuICovCisjZGVmaW5lIEZNX1NUQlVSQTAJMHgyMDAwCQkvKiB0cmFuc21pdCBidWZmZXIgdW5kZXJydW46IGFzeW4uMCAqLworI2RlZmluZSBGTV9TVEJVUkExCTB4NDAwMAkJLyogdHJhbnNtaXQgYnVmZmVyIHVuZGVycnVuOiBhc3luLjEgKi8KKyNkZWZpbmUgRk1fU1RCVVJBMgkweDgwMDAJCS8qIHRyYW5zbWl0IGJ1ZmZlciB1bmRlcnJ1bjogYXN5bi4yICovCisJCQkJCS8qIFNOMzogcmVzZXJ2ZWQgKi8KKworLyoKKyAqIFN0YXR1cyBSZWdpc3RlciAyLCBVcHBlciAxNiBCaXRzIChTVDJVKQorICovCisjZGVmaW5lIEZNX1NPVFJCRUMJMHgwMDAxCQkvKiBvdGhlciBiZWFjb24gcmVjZWl2ZWQgKi8KKyNkZWZpbmUgRk1fU01ZQkVDCTB4MDAwMgkJLyogbXkgYmVhY29uIHJlY2VpdmVkICovCisjZGVmaW5lIEZNX1NCRUMJCTB4MDAwNAkJLyogYmVhY29uIHN0YXRlIGVudGVyZWQgKi8KKyNkZWZpbmUgRk1fU0xPQ0xNCTB4MDAwOAkJLyogbG93IGNsYWltIHJlY2VpdmVkICovCisjZGVmaW5lIEZNX1NISUNMTQkweDAwMTAJCS8qIGhpZ2ggY2xhaW0gcmVjZWl2ZWQgKi8KKyNkZWZpbmUgRk1fU01ZQ0xNCTB4MDAyMAkJLyogbXkgY2xhaW0gcmVjZWl2ZWQgKi8KKyNkZWZpbmUgRk1fU0NMTQkJMHgwMDQwCQkvKiBjbGFpbSBzdGF0ZSBlbnRlcmVkICovCisjZGVmaW5lIEZNX1NFUlJTRgkweDAwODAJCS8qIGVycm9yIGluIHNwZWNpYWwgZnJhbWUgKi8KKyNkZWZpbmUgRk1fU05GU0xECTB4MDEwMAkJLyogTlAgYW5kIEZPUk1BQysgc2ltdWx0YW5lb3VzIGxvYWQgKi8KKyNkZWZpbmUgRk1fU1JGUkNUT1YJMHgwMjAwCQkvKiByZWNlaXZlIGZyYW1lIGNvdW50ZXIgb3ZlcmZsb3cgKi8KKwkJCQkJLyogU04zOiByZXNlcnZlZCAqLworI2RlZmluZSBGTV9TUkNWRlJNCTB4MDQwMAkJLyogcmVjZWl2ZSBmcmFtZSAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lIEZNX1NSQ1ZPVlIJMHgwODAwCQkvKiByZWNlaXZlIEZJRk8gb3ZlcmZsb3cgKi8KKyNkZWZpbmUgRk1fU1JCRkwJMHgxMDAwCQkvKiByZWNlaXZlIGJ1ZmZlciBmdWxsICovCisjZGVmaW5lIEZNX1NSQUJUCTB4MjAwMAkJLyogcmVjZWl2ZSBhYm9ydCAqLworI2RlZmluZSBGTV9TUkJNVAkweDQwMDAJCS8qIHJlY2VpdmUgYnVmZmVyIGVtcHR5ICovCisjZGVmaW5lIEZNX1NSQ09NUAkweDgwMDAJCS8qIHJlY2VpdmUgY29tcGxldGUuIE5vbnRhZyBtb2RlICovCisKKy8qCisgKiBTdGF0dXMgUmVnaXN0ZXIgMiwgTG93ZXIgMTYgQml0cyAoU1QyTCkKKyAqIEF0dGVudGlvbjogU04zIGRvY3Ugc2hvd3MgdGhlc2UgYml0cyB0aGUgb3RoZXIgd2F5IGFyb3VuZAorICovCisjZGVmaW5lIEZNX1NSRVMwCTB4MDAwMQkJLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRk1fU0VTVFJJUFRLCTB4MDAwMQkJLyogU04zOiAnbm8gZGVzY3JpcHRpb24nICovCisjZGVmaW5lIEZNX1NUUlRFWFIJMHgwMDAyCQkvKiBUUlQgZXhwaXJlZCBpbiBjbGFpbSB8IGJlYWNvbiBzdC4gKi8KKyNkZWZpbmUgRk1fU0RVUENMTQkweDAwMDQJCS8qIGR1cGxpY2F0ZSBjbGFpbSByZWNlaXZlZCAqLworI2RlZmluZSBGTV9TU0lGRwkweDAwMDgJCS8qIHNob3J0IGludGVyZnJhbWUgZ2FwICovCisjZGVmaW5lIEZNX1NGUk1DVFIJMHgwMDEwCQkvKiBmcmFtZSBjb3VudGVyIG92ZXJmbG93ICovCisjZGVmaW5lIEZNX1NFUlJDVFIJMHgwMDIwCQkvKiBlcnJvciBjb3VudGVyIG92ZXJmbG93ICovCisjZGVmaW5lIEZNX1NMU1RDVFIJMHgwMDQwCQkvKiBsb3N0IGNvdW50ZXIgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgRk1fU1BISU5WCTB4MDA4MAkJLyogUEhZIGludmFsaWQgKi8KKyNkZWZpbmUgRk1fU0FERVQJMHgwMTAwCQkvKiBhZGRyZXNzIGRldGVjdCAqLworI2RlZmluZSBGTV9TTUlTRlJNCTB4MDIwMAkJLyogbWlzc2VkIGZyYW1lICovCisjZGVmaW5lIEZNX1NUUlRFWFAJMHgwNDAwCQkvKiBUUlQgZXhwaXJlZCBhbmQgbGF0ZSBjb3VudCA+IDAgKi8KKyNkZWZpbmUgRk1fU1RWWEVYUAkweDA4MDAJCS8qIFRWWCBleHBpcmVkICovCisjZGVmaW5lIEZNX1NUS0lTUwkweDEwMDAJCS8qIHRva2VuIGlzc3VlZCAqLworI2RlZmluZSBGTV9TVEtFUlIJMHgyMDAwCQkvKiB0b2tlbiBlcnJvciAqLworI2RlZmluZSBGTV9TTVVMVERBCTB4NDAwMAkJLyogbXVsdGlwbGUgZGVzdGluYXRpb24gYWRkcmVzcyAqLworI2RlZmluZSBGTV9TUk5HT1AJMHg4MDAwCQkvKiByaW5nIG9wZXJhdGlvbmFsICovCisKKy8qCisgKiBTdXBlcm5ldCAzOgorICogU3RhdHVzIFJlZ2lzdGVyIDMsIFVwcGVyIDE2IEJpdHMgKFNUM1UpCisgKi8KKyNkZWZpbmUJRk1fU1JRVU5MQ0sxCTB4MDAwMQkJLyogcmVjZWl2ZSBxdWV1ZSB1bmxvY2tlZCBxdWV1ZSAxICovCisjZGVmaW5lCUZNX1NSUVVOTENLMgkweDAwMDIJCS8qIHJlY2VpdmUgcXVldWUgdW5sb2NrZWQgcXVldWUgMiAqLworI2RlZmluZQlGTV9TUlBFUlJRMQkweDAwMDQJCS8qIHJlY2VpdmUgcGFyaXR5IGVycm9yIHJ4IHF1ZXVlIDEgKi8KKyNkZWZpbmUJRk1fU1JQRVJSUTIJMHgwMDA4CQkvKiByZWNlaXZlIHBhcml0eSBlcnJvciByeCBxdWV1ZSAyICovCisJCQkJCS8qIEJpdCA0LTEwOiByZXNlcnZlZCAqLworI2RlZmluZQlGTV9TUkNWT1ZSMgkweDA4MDAJCS8qIHJlY2VpdmUgRklGTyBvdmVyZnVsbCByeCBxdWV1ZSAyICovCisjZGVmaW5lCUZNX1NSQkZMMgkweDEwMDAJCS8qIHJlY2VpdmUgYnVmZmVyIGZ1bGwgcnggcXVldWUgMiAqLworI2RlZmluZQlGTV9TUkFCVDIJMHgyMDAwCQkvKiByZWNlaXZlIGFib3J0IHJ4IHF1ZXVlIDIgKi8KKyNkZWZpbmUJRk1fU1JCTVQyCTB4NDAwMAkJLyogcmVjZWl2ZSBidWYgZW1wdHkgcnggcXVldWUgMiAqLworI2RlZmluZQlGTV9TUkNPTVAyCTB4ODAwMAkJLyogcmVjZWl2ZSBjb21wIHJ4IHF1ZXVlIDIgKi8KKworLyoKKyAqIFN1cGVybmV0IDM6CisgKiBTdGF0dXMgUmVnaXN0ZXIgMywgTG93ZXIgMTYgQml0cyAoU1QzTCkKKyAqLworI2RlZmluZQlGTV9BRl9CSVNUX0RPTkUJCTB4MDAwMQkvKiBBZGRyZXNzIEZpbHRlciBCSVNUIGlzIGRvbmUgKi8KKyNkZWZpbmUJRk1fUExDX0JJU1RfRE9ORQkweDAwMDIJLyogaW50ZXJuYWwgUExDIEJpc3QgaXMgZG9uZSAqLworI2RlZmluZQlGTV9QRFhfQklTVF9ET05FCTB4MDAwNAkvKiBQRFggQklTVCBpcyBkb25lICovCisJCQkJCS8qIEJpdCAgMzogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUJRk1fU0lDQU1EQU1BVAkJMHgwMDEwCS8qIFN0YXR1cyBpbnRlcm5hbCBDQU0gREEgbWF0Y2ggKi8KKyNkZWZpbmUJRk1fU0lDQU1EQVhBQ1QJCTB4MDAyMAkvKiBTdGF0dXMgaW50ZXJuYWwgQ0FNIERBIGV4YWN0IG1hdGNoICovCisjZGVmaW5lCUZNX1NJQ0FNU0FNQVQJCTB4MDA0MAkvKiBTdGF0dXMgaW50ZXJuYWwgQ0FNIFNBIG1hdGNoICovCisjZGVmaW5lCUZNX1NJQ0FNU0FYQUNUCQkweDAwODAJLyogU3RhdHVzIGludGVybmFsIENBTSBTQSBleGFjdCBtYXRjaCAqLworCisvKgorICogTUFDIFN0YXRlLU1hY2hpbmUgUmVnaXN0ZXIgRk1fU1RNQ0hOCisgKi8KKyNkZWZpbmUJRk1fTURSVEFHCTB4MDAwNAkJLyogdGFnIGJpdCBvZiBsb25nIHdvcmQgcmVhZCAqLworI2RlZmluZQlGTV9TTlBQTkQJMHgwMDA4CQkvKiByL3cgZnJvbSBidWZmZXIgbWVtLiBpcyBwZW5kaW5nICovCisjZGVmaW5lCUZNX1RYU1RBVAkweDAwNzAJCS8qIHRyYW5zbWl0dGVyIHN0YXRlIG1hY2hpbmUgc3RhdGUgKi8KKyNkZWZpbmUJRk1fUkNTVEFUCTB4MDM4MAkJLyogcmVjZWl2ZXIgc3RhdGUgbWFjaGluZSBzdGF0ZSAqLworI2RlZmluZQlGTV9UTTAxCQkweDBjMDAJCS8qIGluZGljYXRlIHRva2VuIG1vZGUgKi8KKyNkZWZpbmUJRk1fU0lNCQkweDEwMDAJCS8qIGluZGljYXRlIHNlbmQgaW1tZWRpYXRlLW1vZGUgKi8KKyNkZWZpbmUJRk1fUkVWCQkweGUwMDAJCS8qIEZPUk1BQyBQbHVzIHJldmlzaW9uIG51bWJlciAqLworCisvKgorICogU3VwZXJuZXQgMworICogTW9kZSBSZWdpc3RlciAzCisgKi8KKyNkZWZpbmUJRk1fTUVOUlMJMHgwMDAxCQkvKiBFbmEgZW5oYW5jZWQgcmVjIHN0YXR1cyBlbmNvZGluZyAqLworI2RlZmluZQlGTV9NRU5YUwkweDAwMDIJCS8qIEVuYSBlbmhhbmNlZCB4bWl0IHN0YXR1cyBlbmNvZGluZyAqLworI2RlZmluZQlGTV9NRU5YQ1QJMHgwMDA0CQkvKiBFbmEgRVhBQ1QvSU5FWEFDVCBtYXRjaGluZyAqLworI2RlZmluZQlGTV9NRU5BRlVMTAkweDAwMDgJCS8qIEVuYSBlbmggUUNUUkwgZW5jb2RpbmcgZm9yIEFGVUxMICovCisjZGVmaW5lCUZNX01FSU5ECTB4MDAzMAkJLyogRW5hIGVuaCBBLEMgaW5kaWNhdG9yIHNldHRpbmdzICovCisjZGVmaW5lCUZNX01FTlFDVFJMCTB4MDA0MAkJLyogRW5hIGVuaCBRQ1RSTCBlbmNvZGluZyAqLworI2RlZmluZQlGTV9NRU5SUUFVTkxDSwkweDAwODAJCS8qIEVuYSByZWMgcSBhdXRvIHVubG9jayAqLworI2RlZmluZQlGTV9NRU5EQVMJMHgwMTAwCQkvKiBFbmEgREFTIGNvbm5lY3Rpb25zIGJ5IGNudHIgTVVYICovCisjZGVmaW5lCUZNX01FTlBMQ0NTVAkweDAyMDAJCS8qIEVuYSBDb3VudGVyIFNlZ20gdGVzdCBpbiBQTEMgYmxjayAqLworI2RlZmluZQlGTV9NRU5TR0xJTlQJMHgwNDAwCQkvKiBFbmEgVmVjdG9yZWQgSW50ZXJydXB0IHJlYWRpbmcgKi8KKyNkZWZpbmUJRk1fTUVORFJDVgkweDA4MDAJCS8qIEVuYSBkdWFsIHJlY2VpdmUgcXVldWUgb3BlcmF0aW9uICovCisjZGVmaW5lCUZNX01FTkZDTE9DCTB4MzAwMAkJLyogRW5hIEZDIGxvY2F0aW9uIHdpdGhpbiBmcm0gZGF0YSAqLworI2RlZmluZQlGTV9NRU5UUkNNRAkweDQwMDAJCS8qIEVuYSBBU1lOQzEgeG1pdCBvbmx5IGFmdGVyIGNvbW1hbmQgKi8KKyNkZWZpbmUJRk1fTUVOVERMUEJLCTB4ODAwMAkJLyogRW5hIFREQVQgdG8gUkRBVCBsa29vcGJhY2sgKi8KKworLyoKKyAqIFN1cGVybmV0IDMKKyAqIEZyYW1lIFNlbGVjdGlvbiBSZWdpc3RlcgorICovCisjZGVmaW5lCUZNX1JFQ1YxCTB4MDAwZgkJLyogb3B0aW9ucyBmb3IgcmVjZWl2ZSBxdWV1ZSAxICovCisjZGVmaW5lCUZNX1JDVjFfQUxMCSgwPDwwKQkJLyogcmVjZWl2ZSBhbGwgZnJhbWVzICovCisjZGVmaW5lCUZNX1JDVjFfTExDCSgxPDwwKQkJLyogcmVjIGFsbCBMTEMgZnJhbWVzICovCisjZGVmaW5lCUZNX1JDVjFfU01UCSgyPDwwKQkJLyogcmVjIGFsbCBTTVQgZnJhbWVzICovCisjZGVmaW5lCUZNX1JDVjFfTlNNVAkoMzw8MCkJCS8qIHJlYyBub24tU01UIGZyYW1lcyAqLworI2RlZmluZQlGTV9SQ1YxX0lNUAkoNDw8MCkJCS8qIHJlYyBJbXBsZW1lbnRvciBmcmFtZXMgKi8KKyNkZWZpbmUJRk1fUkNWMV9NQUMJKDU8PDApCQkvKiByZWMgYWxsIE1BQyBmcmFtZXMgKi8KKyNkZWZpbmUJRk1fUkNWMV9TTExDCSg2PDwwKQkJLyogcmVjIGFsbCBzeW5jIExMQyBmcmFtZXMgKi8KKyNkZWZpbmUJRk1fUkNWMV9BTExDCSg3PDwwKQkJLyogcmVjIGFsbCBhc3luYyBMTEMgZnJhbWVzICovCisjZGVmaW5lCUZNX1JDVjFfVk9JRAkoODw8MCkJCS8qIHJlYyBhbGwgdm9pZCBmcmFtZXMgKi8KKyNkZWZpbmUJRk1fUkNWMV9BTFNNVAkoOTw8MCkJCS8qIHJlYyBhbGwgYXN5bmMgTExDICYgU01UIGZyYW1lcyAqLworI2RlZmluZQlGTV9SRUNWMgkweDAwZjAJCS8qIG9wdGlvbnMgZm9yIHJlY2VpdmUgcXVldWUgMiAqLworI2RlZmluZQlGTV9SQ1YyX0FMTAkoMDw8NCkJCS8qIHJlY2VpdmUgYWxsIG90aGVyIGZyYW1lcyAqLworI2RlZmluZQlGTV9SQ1YyX0xMQwkoMTw8NCkJCS8qIHJlYyBhbGwgTExDIGZyYW1lcyAqLworI2RlZmluZQlGTV9SQ1YyX1NNVAkoMjw8NCkJCS8qIHJlYyBhbGwgU01UIGZyYW1lcyAqLworI2RlZmluZQlGTV9SQ1YyX05TTVQJKDM8PDQpCQkvKiByZWMgbm9uLVNNVCBmcmFtZXMgKi8KKyNkZWZpbmUJRk1fUkNWMl9JTVAJKDQ8PDQpCQkvKiByZWMgSW1wbGVtZW50b3IgZnJhbWVzICovCisjZGVmaW5lCUZNX1JDVjJfTUFDCSg1PDw0KQkJLyogcmVjIGFsbCBNQUMgZnJhbWVzICovCisjZGVmaW5lCUZNX1JDVjJfU0xMQwkoNjw8NCkJCS8qIHJlYyBhbGwgc3luYyBMTEMgZnJhbWVzICovCisjZGVmaW5lCUZNX1JDVjJfQUxMQwkoNzw8NCkJCS8qIHJlYyBhbGwgYXN5bmMgTExDIGZyYW1lcyAqLworI2RlZmluZQlGTV9SQ1YyX1ZPSUQJKDg8PDQpCQkvKiByZWMgYWxsIHZvaWQgZnJhbWVzICovCisjZGVmaW5lCUZNX1JDVjJfQUxTTVQJKDk8PDQpCQkvKiByZWMgYWxsIGFzeW5jIExMQyAmIFNNVCBmcmFtZXMgKi8KKyNkZWZpbmUJRk1fRU5YTVRBRFNXQVAJMHg0MDAwCQkvKiBlbmggcmVjIGFkZHIgc3dhcCAocGh5cyAtPiBjYW4pICovCisjZGVmaW5lCUZNX0VOUkNWQURTV0FQCTB4ODAwMAkJLyogZW5oIHR4IGFkZHIgc3dhcCAoY2FuIC0+IHBoeXMpICovCisKKy8qCisgKiBTdXBlcm5ldCAzOgorICogQWRkcmVzcyBGaWx0ZXIgQ29tbWFuZCBSZWdpc3RlciAoQUZDTUQpCisgKi8KKyNkZWZpbmUJRk1fSU5TVAkJMHgwMDA3CQkvKiBBZGRyZXNzIEZpbHRlciBPcGVyYXRpb24gKi8KKyNkZWZpbmUgRk1fSUlOVl9DQU0JKDA8PDApCQkvKiBJbnZhbGlkYXRlIENBTSAqLworI2RlZmluZSBGTV9JV1JJVEVfQ0FNCSgxPDwwKQkJLyogV3JpdGUgQ0FNICovCisjZGVmaW5lIEZNX0lSRUFEX0NBTQkoMjw8MCkJCS8qIFJlYWQgQ0FNICovCisjZGVmaW5lIEZNX0lSVU5fQklTVAkoMzw8MCkJCS8qIFJ1biBCSVNUICovCisjZGVmaW5lIEZNX0lGSU5ECSg0PDwwKQkJLyogRmluZCAqLworI2RlZmluZSBGTV9JSU5WCQkoNTw8MCkJCS8qIEludmFsaWRhdGUgKi8KKyNkZWZpbmUgRk1fSVNLSVAJKDY8PDApCQkvKiBTa2lwICovCisjZGVmaW5lIEZNX0lDTF9TS0lQCSg3PDwwKQkJLyogQ2xlYXIgYWxsIFNLSVAgYml0cyAqLworCisvKgorICogU3VwZXJuZXQgMzoKKyAqIEFkZHJlc3MgRmlsdGVyIFN0YXR1cyBSZWdpc3RlciAoQUZTVEFUKQorICovCisJCQkJCS8qIEJpdCAgMC00OiByZXNlcnZlZCAqLworI2RlZmluZQlGTV9SRVZfTk8JMHgwMGUwCQkvKiBSZXZpc2lvbiBOdW1iZXIgb2YgQWRkcmVzcyBGaWx0ZXIgKi8KKyNkZWZpbmUJRk1fQklTVF9ET05FCTB4MDEwMAkJLyogQklTVCBjb21wbGV0ZSAqLworI2RlZmluZQlGTV9FTVBUWQkweDAyMDAJCS8qIENBTSBlbXB0eSAqLworI2RlZmluZQlGTV9FUlJPUgkweDA0MDAJCS8qIEVycm9yIChpbXByb3BlciBvcGVyYXRpb24pICovCisjZGVmaW5lCUZNX01VTFQJCTB4MDgwMAkJLyogTXVsdGlwbGUgTWF0Y2ggKi8KKyNkZWZpbmUJRk1fRVhBQ1QJMHgxMDAwCQkvKiBFeGFjdCBNYXRjaCAqLworI2RlZmluZQlGTV9GT1VORAkweDIwMDAJCS8qIENvbXBhcmFuZCBmb3VuZCBpbiBDQU0gKi8KKyNkZWZpbmUJRk1fRlVMTAkJMHg0MDAwCQkvKiBDQU0gZnVsbCAqLworI2RlZmluZQlGTV9ET05FCQkweDgwMDAJCS8qIERPTkUgaW5kaWNhdG9yICovCisKKy8qCisgKiBTdXBlcm5ldCAzOgorICogQklTVCBTaWduYXR1cmUgUmVnaXN0ZXIgKEFGQklTVCkKKyAqLworI2RlZmluZQlBRl9CSVNUX1NJR05BVAkweDA1NTMJCS8qIEFkZHJlc3MgRmlsdGVyIEJJU1QgU2lnbmF0dXJlICovCisKKy8qCisgKiBTdXBlcm5ldCAzOgorICogUGVyc29uYWxpdHkgUmVnaXN0ZXIgKEFGUEVSUykKKyAqLworI2RlZmluZQlGTV9WQUxJRAkweDAwMDEJCS8qIENBTSBFbnRyeSBWYWxpZCAqLworI2RlZmluZQlGTV9EQQkJMHgwMDAyCQkvKiBEZXN0aW5hdGlvbiBBZGRyZXNzICovCisjZGVmaW5lCUZNX0RBWAkJMHgwMDA0CQkvKiBEZXN0aW5hdGlvbiBBZGRyZXNzIEV4YWN0ICovCisjZGVmaW5lCUZNX1NBCQkweDAwMDgJCS8qIFNvdXJjZSBBZGRyZXNzICovCisjZGVmaW5lCUZNX1NBWAkJMHgwMDEwCQkvKiBTb3VyY2UgQWRkcmVzcyBFeGFjdCAqLworI2RlZmluZQlGTV9TS0lQCQkweDAwMjAJCS8qIFNraXAgdGhpcyBlbnRyeSAqLworCisvKgorICogaW5zdHJ1Y3Rpb24gc2V0IGZvciBjb21tYW5kIHJlZ2lzdGVyIDEgKE5QQUREUjYtMCA9IDB4MDApCisgKi8KKyNkZWZpbmUgRk1fSVJFU0VUCTB4MDEJCS8qIHNvZnR3YXJlIHJlc2V0ICovCisjZGVmaW5lIEZNX0lSTUVNV0kJMHgwMgkJLyogbG9hZCBNZW1vcnkgRGF0YSBSZWcuLCBpbmMgTUFSUiAqLworI2RlZmluZSBGTV9JUk1FTVdPCTB4MDMJCS8qIGxvYWQgTURSIGZyb20gYnVmZmVyIG1lbW9yeSwgbi5pLiAqLworI2RlZmluZSBGTV9JSUwJCTB4MDQJCS8qIGlkbGUvbGlzdGVuICovCisjZGVmaW5lIEZNX0lDTAkJMHgwNQkJLyogY2xhaW0vbGlzdGVuICovCisjZGVmaW5lIEZNX0lCTAkJMHgwNgkJLyogYmVhY29uL2xpc3RlbiAqLworI2RlZmluZSBGTV9JTFRWWAkweDA3CQkvKiBsb2FkIFRWWCB0aW1lciBmcm9tIFRWWCByZWcgKi8KKyNkZWZpbmUgRk1fSU5SVE0JMHgwOAkJLyogbm9ucmVzdHJpY3RlZCB0b2tlbiBtb2RlICovCisjZGVmaW5lIEZNX0lFTlRNCTB4MDkJCS8qIGVudGVyIG5vbnJlc3RyaWN0ZWQgdG9rZW4gbW9kZSAqLworI2RlZmluZSBGTV9JRVJUTQkweDBhCQkvKiBlbnRlciByZXN0cmljdGVkIHRva2VuIG1vZGUgKi8KKyNkZWZpbmUgRk1fSVJUTQkJMHgwYgkJLyogcmVzdHJpY3RlZCB0b2tlbiBtb2RlICovCisjZGVmaW5lIEZNX0lTVVJUCTB4MGMJCS8qIHNlbmQgdW5yZXN0cmljdGVkIHRva2VuICovCisjZGVmaW5lIEZNX0lTUlQJCTB4MGQJCS8qIHNlbmQgcmVzdHJpY3RlZCB0b2tlbiAqLworI2RlZmluZSBGTV9JU0lNCQkweDBlCQkvKiBlbnRlciBzZW5kLWltbWVkaWF0ZSBtb2RlICovCisjZGVmaW5lIEZNX0lFU0lNCTB4MGYJCS8qIGV4aXQgc2VuZC1pbW1lZGlhdGUgbW9kZSAqLworI2RlZmluZSBGTV9JQ0xMUwkweDExCQkvKiBjbGVhciBzeW5jaHJvbm91cyBxdWV1ZSBsb2NrICovCisjZGVmaW5lIEZNX0lDTExBMAkweDEyCQkvKiBjbGVhciBhc3luY2hyb25vdXMgcXVldWUgMCBsb2NrICovCisjZGVmaW5lIEZNX0lDTExBMQkweDE0CQkvKiBjbGVhciBhc3luY2hyb25vdXMgcXVldWUgMSBsb2NrICovCisjZGVmaW5lIEZNX0lDTExBMgkweDE4CQkvKiBjbGVhciBhc3luY2hyb25vdXMgcXVldWUgMiBsb2NrICovCisJCQkJCS8qIFNOMzogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRk1fSUNMTFIJMHgyMAkJLyogY2xlYXIgcmVjZWl2ZSBxdWV1ZSAoU04zOjEpIGxvY2sgKi8KKyNkZWZpbmUgRk1fSUNMTFIyCTB4MjEJCS8qIFNOMzogY2xlYXIgcmVjZWl2ZSBxdWV1ZSAyIGxvY2sgKi8KKyNkZWZpbmUgRk1fSVRSWEJVUwkweDIyCQkvKiBTTjM6IFRyaXN0YXRlIFgtQnVzIChTQVMgb25seSkgKi8KKyNkZWZpbmUgRk1fSURSWEJVUwkweDIzCQkvKiBTTjM6IGRyaXZlIFgtQnVzICovCisjZGVmaW5lIEZNX0lDTExBTAkweDNmCQkvKiBjbGVhciBhbGwgcXVldWUgbG9ja3MgKi8KKworLyoKKyAqIGluc3RydWN0aW9uIHNldCBmb3IgY29tbWFuZCByZWdpc3RlciAyIChOUEFERFI2LTAgPSAweDAxKQorICovCisjZGVmaW5lIEZNX0lUUlMJCTB4MDEJCS8qIHRyYW5zbWl0IHN5bmNocm9ub3VzIHF1ZXVlICovCisJCQkJCS8qIFNOMzogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRk1fSVRSQTAJMHgwMgkJLyogdHJhbnNtaXQgYXN5bmNocm9ub3VzIHF1ZXVlIDAgKi8KKwkJCQkJLyogU04zOiByZXNlcnZlZCAqLworI2RlZmluZSBGTV9JVFJBMQkweDA0CQkvKiB0cmFuc21pdCBhc3luY2hyb25vdXMgcXVldWUgMSAqLworCQkJCQkvKiBTTjM6IHJlc2VydmVkICovCisjZGVmaW5lIEZNX0lUUkEyCTB4MDgJCS8qIHRyYW5zbWl0IGFzeW5jaHJvbm91cyBxdWV1ZSAyICovCisJCQkJCS8qIFNOMzogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgRk1fSUFDVFIJMHgxMAkJLyogYWJvcnQgY3VycmVudCB0cmFuc21pdCBhY3Rpdml0eSAqLworI2RlZmluZSBGTV9JUlNUUQkweDIwCQkvKiByZXNldCB0cmFuc21pdCBxdWV1ZXMgKi8KKyNkZWZpbmUgRk1fSVNUVEIJMHgzMAkJLyogc2V0IHRhZyBiaXQgKi8KKyNkZWZpbmUgRk1fSUVSU0YJMHg0MAkJLyogZW5hYmxlIHJlY2VpdmUgc2luZ2xlIGZyYW1lICovCisJCQkJCS8qIFNOMzogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUJRk1fSVRSCQkweDUwCQkvKiBTTjM6IFRyYW5zbWl0IENvbW1hbmQgKi8KKworCisvKgorICoJZGVmaW5lcyBmb3IgUExDIChBbTc5Qzg2NCkKKyAqLworCisvKgorICogIFBMQyByZWFkL3dyaXRlIChyL3cpIHJlZ2lzdGVycworICovCisjZGVmaW5lIFBMX0NOVFJMX0EJMHgwMAkJLyogY29udHJvbCByZWdpc3RlciBBIChyL3cpICovCisjZGVmaW5lIFBMX0NOVFJMX0IJMHgwMQkJLyogY29udHJvbCByZWdpc3RlciBCIChyL3cpICovCisjZGVmaW5lIFBMX0lOVFJfTUFTSwkweDAyCQkvKiBpbnRlcnJ1cHQgbWFzayAoci93KSAqLworI2RlZmluZSBQTF9YTUlUX1ZFQ1RPUgkweDAzCQkvKiB0cmFuc21pdCB2ZWN0b3IgcmVnaXN0ZXIgKHIvdykgKi8KKyNkZWZpbmUgUExfVkVDVE9SX0xFTgkweDA0CQkvKiB0cmFuc21pdCB2ZWN0b3IgbGVuZ3RoIChyL3cpICovCisjZGVmaW5lIFBMX0xFX1RIUkVTSE9MRAkweDA1CQkvKiBsaW5rIGVycm9yIGV2ZW50IHRocmVzaG9sZCAoci93KSAqLworI2RlZmluZSBQTF9DX01JTgkweDA2CQkvKiBtaW5pbXVtIGNvbm5lY3Qgc3RhdGUgdGltZSAoci93KSAqLworI2RlZmluZSBQTF9UTF9NSU4JMHgwNwkJLyogbWluLiBsaW5lIHN0YXRlIHRyYW5zbWl0IHQuIChyL3cpICovCisjZGVmaW5lIFBMX1RCX01JTgkweDA4CQkvKiBtaW5pbXVtIGJyZWFrIHRpbWUgKHIvdykgKi8KKyNkZWZpbmUgUExfVF9PVVQJMHgwOQkJLyogc2lnbmFsIHRpbWVvdXQgKHIvdykgKi8KKyNkZWZpbmUgUExfQ05UUkxfQwkweDBhCQkvKiBjb250cm9sIHJlZ2lzdGVyIEMgKHIvdykgKi8KKyNkZWZpbmUgUExfTENfTEVOR1RICTB4MGIJCS8qIGxpbmsgY29uZmlkZW5jZSB0ZXN0IHRpbWUgKHIvdykgKi8KKyNkZWZpbmUgUExfVF9TQ1JVQgkweDBjCQkvKiBzY3J1YiB0aW1lID0gTUFDIFRWWCAoci93KSAqLworI2RlZmluZSBQTF9OU19NQVgJMHgwZAkJLyogbWF4LiBub2lzZSB0aW1lIGJlZm9yZSBicmVhayAoci93KSovCisjZGVmaW5lIFBMX1RQQ19MT0FEX1YJMHgwZQkJLyogVFBDIHRpbWVyIGxvYWQgdmFsdWUgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIFBMX1RORV9MT0FEX1YJMHgwZgkJLyogVE5FIHRpbWVyIGxvYWQgdmFsdWUgKHdyaXRlIG9ubHkpICovCisjZGVmaW5lIFBMX1NUQVRVU19BCTB4MTAJCS8qIHN0YXR1cyByZWdpc3RlciBBIChyZWFkIG9ubHkpICovCisjZGVmaW5lIFBMX1NUQVRVU19CCTB4MTEJCS8qIHN0YXR1cyByZWdpc3RlciBCIChyZWFkIG9ubHkpICovCisjZGVmaW5lIFBMX1RQQwkJMHgxMgkJLyogdGltZXIgZm9yIFBDTSAocm8pIFsyMC40OCB1c10gKi8KKyNkZWZpbmUgUExfVE5FCQkweDEzCQkvKiB0aW1lIG9mIG5vaXNlIGV2ZW50IFswLjMyIHVzXSAqLworI2RlZmluZSBQTF9DTEtfRElWCTB4MTQJCS8qIFRORSBjbG9jayBkaXZpZGVyIChyZWFkIG9ubHkpICovCisjZGVmaW5lIFBMX0JJU1RfU0lHTkFUCTB4MTUJCS8qIGJ1aWx0IGluIHNlbGYgdGVzdCBzaWduYXR1cmUgKHJvKSovCisjZGVmaW5lIFBMX1JDVl9WRUNUT1IJMHgxNgkJLyogcmVjZWl2ZSB2ZWN0b3IgcmVnLiAocmVhZCBvbmx5KSAqLworI2RlZmluZSBQTF9JTlRSX0VWRU5UCTB4MTcJCS8qIGludGVycnVwdCBldmVudCByZWcuIChyZWFkIG9ubHkpICovCisjZGVmaW5lIFBMX1ZJT0xfU1lNX0NUUgkweDE4CQkvKiB2aW9sYXRpb24gc3ltYm9sIGNvdW50LiAocmVhZCBvKSAqLworI2RlZmluZSBQTF9NSU5fSURMRV9DVFIJMHgxOQkJLyogbWluaW11bSBpZGxlIGNvdW50ZXIgKHJlYWQgb25seSkgKi8KKyNkZWZpbmUgUExfTElOS19FUlJfQ1RSCTB4MWEJCS8qIGxpbmsgZXJyb3IgZXZlbnQgY3RyLihyZWFkIG9ubHkpICovCisjaWZkZWYJTU9UX0VMTQorI2RlZmluZQlQTF9UX0ZPVF9BU1MJMHgxZQkJLyogRk9UT0ZGIEFzc2VydCBUaW1lciAqLworI2RlZmluZQlQTF9UX0ZPVF9ERUFTUwkweDFmCQkvKiBGT1RPRkYgRGVhc3NlcnQgVGltZXIgKi8KKyNlbmRpZgkvKiBNT1RfRUxNICovCisKKyNpZmRlZglNT1RfRUxNCisvKgorICogU3BlY2lhbCBRdWFkLUVsbSBSZWdpc3RlcnMuCisgKiBBIFF1YWQtRUxNIGNvbnNpc3RzIG9mIGZvciBFTE1zIGFuZCB0aGVzZSBhZGRpdGlvbmFsIHJlZ2lzdGVycy4KKyAqLworI2RlZmluZQlRRUxNX1hCQVJfVwkweDgwCQkvKiBDcm9zc2JhciBDb250cm9sIEVMTSBXICovCisjZGVmaW5lCVFFTE1fWEJBUl9YCTB4ODEJCS8qIENyb3NzYmFyIENvbnRyb2wgRUxNIFggKi8KKyNkZWZpbmUJUUVMTV9YQkFSX1kJMHg4MgkJLyogQ3Jvc3NiYXIgQ29udHJvbCBFTE0gWSAqLworI2RlZmluZQlRRUxNX1hCQVJfWgkweDgzCQkvKiBDcm9zc2JhciBDb250cm9sIEVMTSBaICovCisjZGVmaW5lCVFFTE1fWEJBUl9QCTB4ODQJCS8qIENyb3NzYmFyIENvbnRyb2wgQnVzIFAgKi8KKyNkZWZpbmUJUUVMTV9YQkFSX1MJMHg4NQkJLyogQ3Jvc3NiYXIgQ29udHJvbCBCdXMgUyAqLworI2RlZmluZQlRRUxNX1hCQVJfUgkweDg2CQkvKiBDcm9zc2JhciBDb250cm9sIEJ1cyBSICovCisjZGVmaW5lCVFFTE1fV1JfWEJBUgkweDg3CQkvKiBXcml0ZSB0aGUgQ3Jvc3NiYXIgbm93ICh3cml0ZSkgKi8KKyNkZWZpbmUJUUVMTV9DVFJfVwkweDg4CQkvKiBDb3VudGVyIFcgKi8KKyNkZWZpbmUJUUVMTV9DVFJfWAkweDg5CQkvKiBDb3VudGVyIFggKi8KKyNkZWZpbmUJUUVMTV9DVFJfWQkweDhhCQkvKiBDb3VudGVyIFkgKi8KKyNkZWZpbmUJUUVMTV9DVFJfWgkweDhiCQkvKiBDb3VudGVyIFogKi8KKyNkZWZpbmUJUUVMTV9JTlRfTUFTSwkweDhjCQkvKiBJbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworI2RlZmluZQlRRUxNX0lOVF9EQVRBCTB4OGQJCS8qIEludGVycnVwdCBkYXRhIChldmVudCkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJUUVMTV9FTE1CCTB4MDAJCS8qIEVsbSBiYXNlICovCisjZGVmaW5lCVFFTE1fRUxNX1NJWkUJMHgyMAkJLyogRUxNIHNpemUgKi8KKyNlbmRpZgkvKiBNT1RfRUxNICovCisvKgorICogUExDIGNvbnRyb2wgcmVnaXN0ZXIgQSAoUExfQ05UUkxfQTogbG9nLiBhZGRyLiAweDAwKQorICogSXQgaXMgdXNlZCBmb3IgdGltZXIgY29uZmlndXJhdGlvbiwgc3BlY2lmaWNhdGlvbiBvZiBQQ00gTUFJTlQgc3RhdGUgb3B0aW9uLAorICogY291bnRlciBpbnRlcnJ1cHQgZnJlcXVlbmN5LCBQTEMgZGF0YSBwYXRoIGNvbmZpZy4gYW5kIEJ1aWx0IEluIFNlbGYgVGVzdC4KKyAqLworI2RlZmluZQlQTF9SVU5fQklTVAkweDAwMDEJCS8qIGJlZ2luIHJ1bm5pbmcgaXRzIEJ1aWx0IEluIFNlbGYgVC4qLworI2RlZmluZQlQTF9SRl9ESVNBQkxFCTB4MDAwMgkJLyogZGlzYWJsZSB0aGUgUmVwZWF0IEZpbHRlciBzdGF0ZSBtLiovCisjZGVmaW5lCVBMX1NDX1JFTV9MT09QCTB4MDAwNAkJLyogcmVtb3RlIGxvb3BiYWNrIHBhdGggKi8KKyNkZWZpbmUJUExfU0NfQllQQVNTCTB4MDAwOAkJLyogYnkgcHJvdmlkaW5nIGEgcGh5c2ljYWwgYnlwYXNzICovCisjZGVmaW5lCVBMX0xNX0xPQ19MT09QCTB4MDAxMAkJLyogbG9vcCBwYXRoIGp1c3QgYWZ0ZXIgZWxhc3RpYyBidWZmLiovCisjZGVmaW5lCVBMX0VCX0xPQ19MT09QCTB4MDAyMAkJLyogbG9vcCBwYXRoIGp1c3QgcHJpb3IgdG8gUERUL1BEUiBJRiovCisjZGVmaW5lCVBMX0ZPVF9PRkYJMHgwMDQwCQkvKiBhc3NlcnRpb24gb2YgL0ZPVE9GRiBwaW4gb2YgUExDICovCisjZGVmaW5lCVBMX0xPT1BCQUNLCTB4MDA4MAkJLyogaXQgY2F1c2UgdGhlIC9MUEJDSyBwaW4gYXNzLiBsb3cgKi8KKyNkZWZpbmUJUExfTUlOSV9DVFJfSU5UIDB4MDEwMAkJLyogcGFydGlhbGx5IGNvbnRyLiB3aGVuIGJpdCBpcyBhc3MuICovCisjZGVmaW5lCVBMX1ZTWU1fQ1RSX0lOVAkweDAyMDAJCS8qIGNvbnRyb2xzIHdoZW4gaW50IGJpdCBpcyBhc3NlcnRlZCAqLworI2RlZmluZQlQTF9FTkFfUEFSX0NISwkweDA0MDAJCS8qIGVuYWJsZSBwYXJpdHkgY2hlY2sgKi8KKyNkZWZpbmUJUExfUkVRX1NDUlVCCTB4MDgwMAkJLyogbGltaXRlZCBhY2Nlc3MgdG8gc2NydWIgY2FwYWJpbGl0eSovCisjZGVmaW5lCVBMX1RQQ18xNkJJVAkweDEwMDAJCS8qIGNhdXNlcyB0aGUgVFBDIGFzIGEgMTYgYml0IHRpbWVyICovCisjZGVmaW5lCVBMX1RORV8xNkJJVAkweDIwMDAJCS8qIGNhdXNlcyB0aGUgVE5FIGFzIGEgMTYgYml0IHRpbWVyICovCisjZGVmaW5lCVBMX05PSVNFX1RJTUVSCTB4NDAwMAkJLyogYWxsb3dzIHRoZSBub2lzZSB0aW1pbmcgZnVuY3Rpb24gKi8KKworLyoKKyAqIFBMQyBjb250cm9sIHJlZ2lzdGVyIEIgKFBMX0NOVFJMX0I6IGxvZy4gYWRkci4gMHgwMSkKKyAqIEl0IGNvbnRhaW5zIHNpZ25hbHMgYW5kIHJlcXVlc3RlIHRvIGRpcmVjdCB0aGUgcHJvY2VzcyBvZiBQQ00gYW5kIGl0IGlzIGFsc28KKyAqIHVzZWQgdG8gY29udHJvbCB0aGUgTGluZSBTdGF0ZSBNYXRjaCBpbnRlcnJ1cHQuCisgKi8KKyNkZWZpbmUJUExfUENNX0NOVFJMCTB4MDAwMwkJLyogY29udHJvbCBQQ00gc3RhdGUgbWFjaGluZSAqLworI2RlZmluZQlQTF9QQ01fTkFGCSgwKQkJLyogc3RhdGUgaXMgbm90IGFmZmVjdGVkICovCisjZGVmaW5lCVBMX1BDTV9TVEFSVAkoMSkJCS8qIGdvZXMgdG8gdGhlIEJSRUFLIHN0YXRlICovCisjZGVmaW5lCVBMX1BDTV9UUkFDRQkoMikJCS8qIGdvZXMgdG8gdGhlIFRSQUNFIHN0YXRlICovCisjZGVmaW5lCVBMX1BDTV9TVE9QCSgzKQkJLyogZ29lcyB0byB0aGUgT0ZGIHN0YXRlICovCisKKyNkZWZpbmUJUExfTUFJTlQJMHgwMDA0CQkvKiBpZiBPRkYgc3RhdGUgLS0+IE1BSU5UIHN0YXRlICovCisjZGVmaW5lCVBMX0xPTkcJCTB4MDAwOAkJLyogcGVyZi4gYSBsb25nIExpbmsgQ29uZmlkLlRlc3QoTENUKSovCisjZGVmaW5lCVBMX1BDX0pPSU4JMHgwMDEwCQkvKiBpZiBORVhUIHN0YXRlIC0tPiBKT0lOIHN0YXRlICovCisKKyNkZWZpbmUJUExfUENfTE9PUAkweDAwNjAJCS8qIGxvb3BiYWNrIHVzZWQgaW4gdGhlIExDVCAqLworI2RlZmluZQlQTF9OT0xDVAkoMDw8NSkJCS8qIG5vIExDVCBpcyBwZXJmb3JtZWQgKi8KKyNkZWZpbmUJUExfVFBEUgkJKDE8PDUpCQkvKiBQQ00gYXNzZXJ0cyB0cmFuc21pdCBQRFIgKi8KKyNkZWZpbmUJUExfVElETEUJKDI8PDUpCQkvKiBQQ00gYXNzZXJ0cyB0cmFuc21pdCBpZGxlICovCisjZGVmaW5lCVBMX1JMQlAJCSgzPDw1KQkJLyogdHJhbnMuIFBEUiAmIHJlbW90ZSBsb29wYi4gcGF0aCAqLworCisjZGVmaW5lCVBMX0NMQVNTX1MJMHgwMDgwCQkvKiBzaWduaWYuIHRoYXQgc2luZ2xlIGF0dC4gc3RhdGlvbiAqLworCisjZGVmaW5lCVBMX01BSU5UX0xTCTB4MDcwMAkJLyogbGluZSBzdGF0ZSB3aGlsZSBpbiB0aGUgTUFJTlQgc3QuICovCisjZGVmaW5lCVBMX01fUVVJMAkoMDw8OCkJCS8qIHRyYW5zbWl0IFFVSUVUIGxpbmUgc3RhdGUgKi8KKyNkZWZpbmUJUExfTV9JRExFCSgxPDw4KQkJLyogdHJhbnNtaXQgSURMRSBsaW5lIHN0YXRlICovCisjZGVmaW5lCVBMX01fSEFMVAkoMjw8OCkJCS8qIHRyYW5zbWl0IEhBTFQgbGluZSBzdGF0ZSAqLworI2RlZmluZQlQTF9NX01BU1RSCSgzPDw4KQkJLyogdHJhbnNtaXQgTUFTVEVSIGxpbmUgc3RhdGUgKi8KKyNkZWZpbmUJUExfTV9RVUkxCSg0PDw4KQkJLyogdHJhbnNtaXQgUVVJRVQgbGluZSBzdGF0ZSAqLworI2RlZmluZQlQTF9NX1FVSTIJKDU8PDgpCQkvKiB0cmFuc21pdCBRVUlFVCBsaW5lIHN0YXRlICovCisjZGVmaW5lCVBMX01fVFBEUgkoNjw8OCkJCS8qIHRyLiBQSFlfREFUQSByZXF1Li1zeW1ib2wgaXMgdHIuZWQqLworI2RlZmluZQlQTF9NX1FVSTMJKDc8PDgpCQkvKiB0cmFuc21pdCBRVUlFVCBsaW5lIHN0YXRlICovCisKKyNkZWZpbmUJUExfTUFUQ0hfTFMJMHg3ODAwCQkvKiBsaW5lIHN0YXRlIHRvIGJlIGNvbXAuIHdpdGggY3Vyci4qLworI2RlZmluZQlQTF9JX0FOWQkoMDw8MTEpCQkvKiBJbnQuIG9uIGFueSBjaGFuZ2UgaW4gKl9MSU5FX1NUICovCisjZGVmaW5lCVBMX0lfSURMRQkoMTw8MTEpCQkvKiBJbnRlcnJ1cHQgb24gSURMRSBsaW5lIHN0YXRlICovCisjZGVmaW5lCVBMX0lfSEFMVAkoMjw8MTEpCQkvKiBJbnRlcnJ1cHQgb24gSEFMVCBsaW5lIHN0YXRlICovCisjZGVmaW5lCVBMX0lfTUFTVFIJKDQ8PDExKQkJLyogSW50ZXJydXB0IG9uIE1BU1RFUiBsaW5lIHN0YXRlICovCisjZGVmaW5lCVBMX0lfUVVJRVQJKDg8PDExKQkJLyogSW50ZXJydXB0IG9uIFFVSUVUIGxpbmUgc3RhdGUgKi8KKworI2RlZmluZQlQTF9DT05GSUdfQ05UUkwJMHg4MDAwCQkvKiBjb250cm9sIG92ZXIgc2NydWIsIGJ5cC4gJiBsb29wYi4qLworCisvKgorICogUExDIGNvbnRyb2wgcmVnaXN0ZXIgQyAoUExfQ05UUkxfQzogbG9nLiBhZGRyLiAweDBhKQorICogSXQgY29udGFpbnMgdGhlIHNjcmFtYmxpbmcgY29udHJvbCByZWdpc3RlcnMgKFBMQy1TIG9ubHkpCisgKi8KKyNkZWZpbmUgUExfQ19DSVBIRVJfRU5BQkxFCSgxPDwwKQkvKiBlbmFibGUgc2NyYW1ibGVyICovCisjZGVmaW5lIFBMX0NfQ0lQSEVSX0xQQkNLCSgxPDwxKQkvKiBsb29wYmFjayBzY3JhbWJsZXIgKi8KKyNkZWZpbmUgUExfQ19TRE9GRl9FTkFCTEUJKDE8PDYpCS8qIGVuYWJsZSBTRE9GRiB0aW1lciAqLworI2RlZmluZSBQTF9DX1NET05fRU5BQkxFCSgxPDw3KQkvKiBlbmFibGUgU0RPTiB0aW1lciAqLworI2lmZGVmCU1PVF9FTE0KKyNkZWZpbmUgUExfQ19GT1RPRkZfQ1RSTAkoMzw8MikJLyogRk9UT0ZGIHRpbWVyIGNvbnRyb2wgKi8KKyNkZWZpbmUgUExfQ19GT1RPRkZfVElNCQkoMDw8MikJLyogRk9UT0ZGIHVzZSB0aW1lciBmb3IgKGRlKS1hc3NlcnQgKi8KKyNkZWZpbmUgUExfQ19GT1RPRkZfSU5BCQkoMjw8MikJLyogRk9UT0ZGIGZvcmNlZCBpbmFjdGl2ZSAqLworI2RlZmluZSBQTF9DX0ZPVE9GRl9BQ1QJCSgzPDwyKQkvKiBGT1RPRkYgZm9yY2VkIGFjdGl2ZSAqLworI2RlZmluZSBQTF9DX0ZPVE9GRl9TUkNFCSgxPDw0KQkvKiBGT1RPRkYgc291cmNlIGlzIFBDTSBzdGF0ZSAhPSBPRkYgKi8KKyNkZWZpbmUJUExfQ19SWERBVEFfRU4JCSgxPDw1KQkvKiBSZWMgc2NyIGRhdGEgZm9yY2VkIHRvIDAgKi8KKyNkZWZpbmUJUExfQ19TRE5SWkVOCQkoMTw8OCkJLyogTW9uaXRvciByZWMgZGVzY3IuIGRhdGEgZm9yIGFjdCAqLworI2Vsc2UJLyogbk1PVF9FTE0gKi8KKyNkZWZpbmUgUExfQ19GT1RPRkZfQ1RSTAkoMzw8OCkJLyogRk9UT0ZGIHRpbWVyIGNvbnRyb2wgKi8KKyNkZWZpbmUgUExfQ19GT1RPRkZfMAkJKDA8PDgpCS8qIHRpbWVyIG9mZiAqLworI2RlZmluZSBQTF9DX0ZPVE9GRl8zMAkJKDE8PDgpCS8qIDMwdVMgKi8KKyNkZWZpbmUgUExfQ19GT1RPRkZfNTAJCSgyPDw4KQkvKiA1MHVTICovCisjZGVmaW5lIFBMX0NfRk9UT0ZGX05FVkVSCSgzPDw4KQkvKiBuZXZlciAqLworI2RlZmluZSBQTF9DX1NET05fVElNRVIJCSgzPDwxMCkJLyogU0RPTiB0aW1lciBjb250cm9sICovCisjZGVmaW5lIFBMX0NfU0RPTl8wODQJCSgwPDwxMCkJLyogMC44NCB1UyAqLworI2RlZmluZSBQTF9DX1NET05fMTMyCQkoMTw8MTApCS8qIDEuMzIgdVMgKi8KKyNkZWZpbmUgUExfQ19TRE9OXzI1MgkJKDI8PDEwKQkvKiAyLjUyIHVTICovCisjZGVmaW5lIFBMX0NfU0RPTl81MTIJCSgzPDwxMCkJLyogNS4xMiB1UyAqLworI2RlZmluZSBQTF9DX1NPRkZfVElNRVIJCSgzPDwxMikJLyogU0RPRkYgdGltZXIgY29udHJvbCAqLworI2RlZmluZSBQTF9DX1NPRkZfMDc2CQkoMDw8MTIpCS8qIDAuNzYgdVMgKi8KKyNkZWZpbmUgUExfQ19TT0ZGXzEzMgkJKDE8PDEyKQkvKiAxLjMyIHVTICovCisjZGVmaW5lIFBMX0NfU09GRl8yNTIJCSgyPDwxMikJLyogMi41MiB1UyAqLworI2RlZmluZSBQTF9DX1NPRkZfNTEyCQkoMzw8MTIpCS8qIDUuMTIgdVMgKi8KKyNkZWZpbmUgUExfQ19UU0VMCQkoMzw8MTQpCS8qIHNjcmFtYmxlciBwYXRoIHNlbGVjdCAqLworI2VuZGlmCS8qIG5NT1RfRUxNICovCisKKy8qCisgKiBQTEMgc3RhdHVzIHJlZ2lzdGVyIEEgKFBMX1NUQVRVU19BOiBsb2cuIGFkZHIuIDB4MTApCisgKiBJdCBpcyB1c2VkIHRvIHJlcG9ydCBzdGF0dXMgaW5mb3JtYXRpb24gdG8gdGhlIE5vZGUgUHJvY2Vzc29yIGFib3V0IHRoZSAKKyAqIExpbmUgU3RhdGUgTWFjaGluZSAoTFNNKS4KKyAqLworI2lmZGVmCU1PVF9FTE0KKyNkZWZpbmUgUExDX0lOVF9NQVNLCTB4YzAwMAkJLyogRUxNIGludGVncmF0aW9uIGJpdHMgaW4gc3RhdHVzIEEgKi8KKyNkZWZpbmUgUExDX0lOVF9DCTB4MDAwMAkJLyogRUxNIFJldmlzaW9uIEJhbmQgQyAqLworI2RlZmluZSBQTENfSU5UX0NBTUVMCTB4NDAwMAkJLyogRUxNIGludGVncmF0ZWQgaW50byBDQU1FTCAqLworI2RlZmluZSBQTENfSU5UX1FFCTB4ODAwMAkJLyogRUxNIGludGVncmF0ZWQgaW50byBRdWFkIEVMTSAqLworI2RlZmluZSBQTENfUkVWX01BU0sJMHgzODAwCQkvKiByZXZpc2lvbiBiaXRzIGluIHN0YXR1cyBBICovCisjZGVmaW5lIFBMQ19SRVZJU0lPTl9CCTB4MDAwMAkJLyogcmV2IGJpdHMgZm9yIEVMTSBSZXYgQiAqLworI2RlZmluZSBQTENfUkVWSVNJT05fUUEJMHgwODAwCQkvKiByZXYgYml0cyBmb3IgRUxNIGNvcmUgaW4gUUVMTS1BICovCisjZWxzZQkvKiBuTU9UX0VMTSAqLworI2RlZmluZSBQTENfUkVWX01BU0sJMHhmODAwCQkvKiByZXZpc2lvbiBiaXRzIGluIHN0YXR1cyBBICovCisjZGVmaW5lIFBMQ19SRVZJU0lPTl9BCTB4MDAwMAkJLyogcmV2aXNpb24gYml0cyBmb3IgUExDICovCisjZGVmaW5lIFBMQ19SRVZJU0lPTl9TCTB4ZjgwMAkJLyogcmV2aXNpb24gYml0cyBmb3IgUExDLVMgKi8KKyNkZWZpbmUgUExDX1JFVl9TTjMJMHg3ODAwCQkvKiByZXZpc2lvbiBiaXRzIGZvciBQTEMtUyBpbiBJRkNQICovCisjZW5kaWYJLyogbk1PVF9FTE0gKi8KKyNkZWZpbmUJUExfU1lNX1BSX0NUUgkweDAwMDcJCS8qIGNvbnRhaW5zIHRoZSBMU00gc3ltYm9sIHBhaXIgQ3RyLiAqLworI2RlZmluZQlQTF9VTktOX0xJTkVfU1QJMHgwMDA4CQkvKiB1bmtub3duIGxpbmUgc3RhdGUgYml0IGZyb20gTFNNICovCisjZGVmaW5lCVBMX0xTTV9TVEFURQkweDAwMTAJCS8qIHN0YXRlIGJpdCBvZiBMU00gKi8KKworI2RlZmluZQlQTF9MSU5FX1NUCTB4MDBlMAkJLyogY29udGFpbnMgcmVjb2duLiBsaW5lIHN0YXRlIG9mIExTTSovCisjZGVmaW5lCVBMX0xfTkxTCSgwPDw1KQkJLyogbm9pc2UgbGluZSBzdGF0ZSAqLworI2RlZmluZQlQTF9MX0FMUwkoMTw8NSkJCS8qIGFjdGl2IGxpbmUgc3RhdGUgKi8KKyNkZWZpbmUJUExfTF9VTkQJKDI8PDUpCQkvKiB1bmRlZmluZWQgKi8KKyNkZWZpbmUJUExfTF9JTFM0CSgzPDw1KQkJLyogaWRsZSBsLiBzLiAoYWZ0ZXIgNCBpZGxlIHN5bWJvbHMpICovCisjZGVmaW5lCVBMX0xfUUxTCSg0PDw1KQkJLyogcXVpZXQgbGluZSBzdGF0ZSAqLworI2RlZmluZQlQTF9MX01MUwkoNTw8NSkJCS8qIG1hc3RlciBsaW5lIHN0YXRlICovCisjZGVmaW5lCVBMX0xfSExTCSg2PDw1KQkJLyogaGFsdCBsaW5lIHN0YXRlICovCisjZGVmaW5lCVBMX0xfSUxTMTYJKDc8PDUpCQkvKiBpZGxlIGxpbmUgc3RhdGUgKGFmdGVyIDE2IGlkbGUgcy4pKi8KKworI2RlZmluZQlQTF9QUkVWX0xJTkVfU1QJMHgwMzAwCQkvKiB2YWx1ZSBvZiBwcmV2aW91cyBsaW5lIHN0YXRlICovCisjZGVmaW5lCVBMX1BfUUxTCSgwPDw4KQkJLyogcXVpZXQgbGluZSBzdGF0ZSAqLworI2RlZmluZQlQTF9QX01MUwkoMTw8OCkJCS8qIG1hc3RlciBsaW5lIHN0YXRlICovCisjZGVmaW5lCVBMX1BfSExTCSgyPDw4KQkJLyogaGFsdCBsaW5lIHN0YXRlICovCisjZGVmaW5lCVBMX1BfSUxTMTYJKDM8PDgpCQkvKiBpZGxlIGxpbmUgc3RhdGUgKGFmdGVyIDE2IGlkbGUgcy4pKi8KKworI2RlZmluZQlQTF9TSUdOQUxfREVUCTB4MDQwMAkJLyogMT10aGF0IHNpZ25hbCBkZXRlY3QgaXMgZGVhc3NlcnRlZCovCisKKworLyoKKyAqIFBMQyBzdGF0dXMgcmVnaXN0ZXIgQiAoUExfU1RBVFVTX0I6IGxvZy4gYWRkci4gMHgxMSkKKyAqIEl0IGNvbnRhaW5zIHNpZ25hbHMgYW5kIHN0YXR1cyBmcm9tIHRoZSByZXBlYXQgZmlsdGVyIGFuZCBQQ00gc3RhdGUgbWFjaGluZS4KKyAqLworI2RlZmluZQlQTF9CUkVBS19SRUFTT04JMHgwMDA3CQkvKiByZWFzb24gZm9yIFBDTSBzdGF0ZSBtYWNoLnMgdG8gYnIuKi8KKyNkZWZpbmUJUExfQl9OT1QJKDApCQkvKiBQQ00gU00gaGFzIG5vdCBnb25lIHRvIEJSRUFLIHN0YXRlKi8KKyNkZWZpbmUJUExfQl9QQ1MJKDEpCQkvKiBQQ19TdGFydCBpc3N1ZWQgKi8KKyNkZWZpbmUJUExfQl9UUEMJKDIpCQkvKiBUUEMgdGltZXIgZXhwaXJlZCBhZnRlciBUX09VVCAqLworI2RlZmluZQlQTF9CX1RORQkoMykJCS8qIFRORSB0aW1lciBleHBpcmVkIGFmdGVyIE5TX01BWCAqLworI2RlZmluZQlQTF9CX1FMUwkoNCkJCS8qIHF1aXQgbGluZSBzdGF0ZSBkZXRlY3RlZCAqLworI2RlZmluZQlQTF9CX0lMUwkoNSkJCS8qIGlkbGUgbGluZSBzdGF0ZSBkZXRlY3RlZCAqLworI2RlZmluZQlQTF9CX0hMUwkoNikJCS8qIGhhbHQgbGluZSBzdGF0ZSBkZXRlY3RlZCAqLworCisjZGVmaW5lCVBMX1RDRgkJMHgwMDA4CQkvKiB0cmFuc21pdCBjb2RlIGZsYWcgKHN0YXJ0IGV4ZWMuKSAqLworI2RlZmluZQlQTF9SQ0YJCTB4MDAxMAkJLyogcmVjZWl2ZSBjb2RlIGZsYWcgKHN0YXJ0IGV4ZWMuKSAqLworI2RlZmluZQlQTF9MU0YJCTB4MDAyMAkJLyogbGluZSBzdGF0ZSBmbGFnIChsLnMuIGhhcyBiZWVuIHIuKSovCisjZGVmaW5lCVBMX1BDTV9TSUdOQUwJMHgwMDQwCQkvKiBpbmRpYy4gdGhhdCBYTUlUX1ZFQ1RPUiBoYi53cml0dGVuKi8KKworI2RlZmluZQlQTF9QQ01fU1RBVEUJMHgwNzgwCQkvKiBzdGF0ZSBiaXRzIG9mIFBDTSBzdGF0ZSBtYWNoaW5lICovCisjZGVmaW5lCVBMX1BDMAkJKDA8PDcpCQkvKiBPRkYJICAgLSB3aGVuIC9SU1Qgb3IgUENNX0NOVFJMICovCisjZGVmaW5lCVBMX1BDMQkJKDE8PDcpCQkvKiBCUkVBSyAgIC0gZW50cnkgcG9pbnQgaW4gc3RhcnQgUENNKi8KKyNkZWZpbmUJUExfUEMyCQkoMjw8NykJCS8qIFRSQUNFICAgLSB0byBsb2NhbGl6ZSBzdHVjayBCZWFjb24qLworI2RlZmluZQlQTF9QQzMJCSgzPDw3KQkJLyogQ09OTkVDVCAtIHN5bmNocm9uaXplIGVuZHMgb2YgY29ubiovCisjZGVmaW5lCVBMX1BDNAkJKDQ8PDcpCQkvKiBORVhUCSAgIC0gdG8gc2VwYXJhdGUgdGhlIHNpZ25hbG5nKi8KKyNkZWZpbmUJUExfUEM1CQkoNTw8NykJCS8qIFNJR05BTCAgLSBQQ00gdHJhbnMvcmVjLiBiaXQgaW5mb3MqLworI2RlZmluZQlQTF9QQzYJCSg2PDw3KQkJLyogSk9JTgkgICAtIDEuIHN0YXRlIHRvIGFjdGl2IGNvbm4uICovCisjZGVmaW5lCVBMX1BDNwkJKDc8PDcpCQkvKiBWRVJJRlkgIC0gMi4gLSAiIC0gKDMuIEFDVElWRSkgKi8KKyNkZWZpbmUJUExfUEM4CQkoODw8NykJCS8qIEFDVElWRSAgLSBQSFkgaGFzIGJlZW4gaW5jb3Jwb3JhdGVkKi8KKyNkZWZpbmUJUExfUEM5CQkoOTw8NykJCS8qIE1BSU5UICAgLSBmb3IgdGVzdCBwdXJwb3NlcyBvciBzbyAKKwkJCQkJICAgdGhhdCBQQ00gb3AuIGNvbXBsZXRlbHkgaW4gc29mdHcuICovCisKKyNkZWZpbmUJUExfUENJX1NDUlVCCTB4MDgwMAkJLyogc2NydWJiaW5nIGZ1bmN0aW9uIGlzIGJlaW5nIGV4ZWMuICovCisKKyNkZWZpbmUJUExfUENJX1NUQVRFCTB4MzAwMAkJLyogUGh5c2ljYWwgQ29ubmVjdC4gSW5zZXJ0aW9uIFNNICovCisjZGVmaW5lCVBMX0NJX1JFTVYJKDA8PDEyKQkJLyogUkVNT1ZFRCAqLworI2RlZmluZQlQTF9DSV9JU0NSCSgxPDwxMikJCS8qIElOU0VSVF9TQ1JVQiAqLworI2RlZmluZQlQTF9DSV9SU0NSCSgyPDwxMikJCS8qIFJFTU9WRV9TQ1JVQiAqLworI2RlZmluZQlQTF9DSV9JTlMJKDM8PDEyKQkJLyogSU5TRVJURUQgKi8KKworI2RlZmluZQlQTF9SRl9TVEFURQkweGMwMDAJCS8qIHN0YXRlIGJpdCBvZiByZXBlYXRlIGZpbHRlciBTTSAqLworI2RlZmluZQlQTF9SRl9SRVBUCSgwPDwxNCkJCS8qIFJFUEVBVCAqLworI2RlZmluZQlQTF9SRl9JRExFCSgxPDwxNCkJCS8qIElETEUgKi8KKyNkZWZpbmUJUExfUkZfSEFMVDEJKDI8PDE0KQkJLyogSEFMVDEgKi8KKyNkZWZpbmUJUExfUkZfSEFMVDIJKDM8PDE0KQkJLyogSEFMVDIgKi8KKworCisvKgorICogUExDIGludGVycnVwdCBldmVudCByZWdpc3RlciAoUExfSU5UUl9FVkVOVDogbG9nLiBhZGRyLiAweDE3KQorICogSXQgaXMgcmVhZCBvbmx5IGFuZCBpcyBjbGVhcmRlIHdoZW5ldmVyIGl0IGlzIHJlYWQhCisgKiBJdCBpcyB1c2VkIGJ5IHRoZSBQTEMgdG8gcmVwb3J0IGV2ZW50cyB0byB0aGUgbm9kZSBwcm9jZXNzb3IuCisgKi8KKyNkZWZpbmUJUExfUEFSSVRZX0VSUgkweDAwMDEJCS8qIHAuIGVycm9yIGguYi5kZXRlY3RlZCBvbiBUWDktMCBpbnAqLworI2RlZmluZQlQTF9MU19NQVRDSAkweDAwMDIJCS8qIGwucy49PSBsLnMuIFBMQ19DTlRSTF9CJ3MgTUFUQ0hfTFMqLworI2RlZmluZQlQTF9QQ01fQ09ERQkweDAwMDQJCS8qIHRyYW5zbWl0JnJlY2VpdmUgfCBMQ1QgY29tcGxldGUgKi8KKyNkZWZpbmUJUExfVFJBQ0VfUFJPUAkweDAwMDgJCS8qIG1hc3RlciBsLnMuIHdoaWxlIFBDTSBBQ1RJVnxUUkFDRSAqLworI2RlZmluZQlQTF9TRUxGX1RFU1QJMHgwMDEwCQkvKiBRVUlFVHxIQUxUIHdoaWxlIFBDTSBpbiBUUkFDRSBzdC4gKi8KKyNkZWZpbmUJUExfUENNX0JSRUFLCTB4MDAyMAkJLyogUENNIGhhcyBlbnRlcmVkIHRoZSBCUkVBSyBzdGF0ZSAqLworI2RlZmluZQlQTF9QQ01fRU5BQkxFRAkweDAwNDAJCS8qIGFzc2VydGVkIFNDX0pPSU4sIHNjcnViLiAmIEFDVElWICovCisjZGVmaW5lCVBMX1RQQ19FWFBJUkVECTB4MDA4MAkJLyogVFBDIHRpbWVyIHJlYWNoZWQgemVybyAqLworI2RlZmluZQlQTF9UTkVfRVhQSVJFRAkweDAxMDAJCS8qIFRORSB0aW1lciByZWFjaGVkIHplcm8gKi8KKyNkZWZpbmUJUExfRUJVRl9FUlIJMHgwMjAwCQkvKiBlbGFzdGljIGJ1ZmYuIGRldC4gb3Zlci18dW5kZXJmbG93Ki8KKyNkZWZpbmUJUExfUEhZSU5WCTB4MDQwMAkJLyogcGh5c2ljYWwgbGF5ZXIgaW52YWxpZCBzaWduYWwgKi8KKyNkZWZpbmUJUExfVlNZTV9DVFIJMHgwODAwCQkvKiB2aW9sYXRpb24gc3ltYm9sIGNvdW50ZXIgaGFzIGluY3IuKi8KKyNkZWZpbmUJUExfTUlOSV9DVFIJMHgxMDAwCQkvKiBkZXAuIG9uIFBMQ19DTlRSTF9BJ3MgTUlOSV9DVFJfSU5UKi8KKyNkZWZpbmUJUExfTEVfQ1RSCTB4MjAwMAkJLyogbGluayBlcnJvciBldmVudCBjb3VudGVyICovCisjZGVmaW5lCVBMX0xTRE8JCTB4NDAwMAkJLyogU0RPIGlucHV0IHBpbiBjaGFuZ2VkIHRvIGEgMSAqLworI2RlZmluZQlQTF9OUF9FUlIJMHg4MDAwCQkvKiBOUCBoYXMgcmVxdWVzdGVkIHRvIHIvdyBhbiBpbnYuIHIuKi8KKworLyoKKyAqIFRoZSBQTEMgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKFBMX0lOVFJfTUFTSzogbG9nLiBhZGRyLiAweDAyKSBjb25zdHIuIGlzCisgKiBlcXVhbCBQTF9JTlRSX0VWRU5UIHJlZ2lzdGVyLgorICogRm9yIGVhY2ggc2V0IGJpdCwgdGhlIHNldHRpbmcgb2YgY29ycmVzcG9uZGluZyBiaXQgZ2VuZXJhdGUgYW4gaW50IHRvIE5QLiAKKyAqLworCisjaWZkZWYJTU9UX0VMTQorLyoKKyAqIFF1YWQgRUxNIENyb3NiYXIgQ29udHJvbCByZWdpc3RlciB2YWx1ZXMgKFFFTE1fWEJBUl8/KQorICovCisjZGVmaW5lCVFFTE1fWE9VVF9JRExFCTB4MDAwMAkJLyogSWRsZXMvUGFzc3Rocm91Z2ggKi8KKyNkZWZpbmUJUUVMTV9YT1VUX1AJMHgwMDAxCQkvKiBPdXRwdXQgdG86IEJ1cyBQICovCisjZGVmaW5lCVFFTE1fWE9VVF9TCTB4MDAwMgkJLyogT3V0cHV0IHRvOiBCdXMgUyAqLworI2RlZmluZQlRRUxNX1hPVVRfUgkweDAwMDMJCS8qIE91dHB1dCB0bzogQnVzIFIgKi8KKyNkZWZpbmUJUUVMTV9YT1VUX1cJMHgwMDA0CQkvKiBPdXRwdXQgdG86IEVMTSBXICovCisjZGVmaW5lCVFFTE1fWE9VVF9YCTB4MDAwNQkJLyogT3V0cHV0IHRvOiBFTE0gWCAqLworI2RlZmluZQlRRUxNX1hPVVRfWQkweDAwMDYJCS8qIE91dHB1dCB0bzogRUxNIFkgKi8KKyNkZWZpbmUJUUVMTV9YT1VUX1oJMHgwMDA3CQkvKiBPdXRwdXQgdG86IEVMTSBaICovCisKKy8qCisgKiBRdWFkIEVMTSBJbnRlcnJ1cHQgZGF0YSBhbmQgZXZlbnQgcmVnaXN0ZXJzLgorICovCisjZGVmaW5lCVFFTE1fTlBfRVJSCSgxPDwxNSkJCS8qIE5vZGUgUHJvY2Vzc29yIEVycm9yICovCisjZGVmaW5lCVFFTE1fQ09VTlRfWgkoMTw8NykJCS8qIENvdW50ZXIgWiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJUUVMTV9DT1VOVF9ZCSgxPDw2KQkJLyogQ291bnRlciBZIEludGVycnVwdCAqLworI2RlZmluZQlRRUxNX0NPVU5UX1gJKDE8PDUpCQkvKiBDb3VudGVyIFggSW50ZXJydXB0ICovCisjZGVmaW5lCVFFTE1fQ09VTlRfVwkoMTw8NCkJCS8qIENvdW50ZXIgVyBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJUUVMTV9FTE1fWgkoMTw8MykJCS8qIEVMTSBaIEludGVycnVwdCAqLworI2RlZmluZQlRRUxNX0VMTV9ZCSgxPDwyKQkJLyogRUxNIFkgSW50ZXJydXB0ICovCisjZGVmaW5lCVFFTE1fRUxNX1gJKDE8PDEpCQkvKiBFTE0gWCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJUUVMTV9FTE1fVwkoMTw8MCkJCS8qIEVMTSBXIEludGVycnVwdCAqLworI2VuZGlmCS8qIE1PVF9FTE0gKi8KKy8qCisgKiBQTEMgVGltaW5nIFBhcmFtZXRlcnMKKyAqLworI2RlZmluZQlUUF9DX01JTgkweGZmOWMJLyogICAyICAgIG1zICovCisjZGVmaW5lCVRQX1RMX01JTgkweGZmZjAJLyogICAwLjMgIG1zICovCisjZGVmaW5lCVRQX1RCX01JTgkweGZmMTAJLyogICA1ICAgIG1zICovCisjZGVmaW5lCVRQX1RfT1VUCTB4ZDlkYgkvKiAyMDAgICAgbXMgKi8KKyNkZWZpbmUJVFBfTENfTEVOR1RICTB4ZjY3NgkvKiAgNTAgICAgbXMgKi8KKyNkZWZpbmUJVFBfTENfTE9OR0xOCTB4YTBhMgkvKiA1MDAgICAgbXMgKi8KKyNkZWZpbmUJVFBfVF9TQ1JVQgkweGZmNmQJLyogICAzLjUgIG1zICovCisjZGVmaW5lCVRQX05TX01BWAkweGYwMjEJLyogICAxLjMgICBtcyAqLworCisvKgorICogQklTVCB2YWx1ZXMKKyAqLworI2RlZmluZSBQTENfQklTVAkweDZlY2QJCS8qIEJJU1Qgc2lnbmF0dXJlIGZvciBQTEMgKi8KKyNkZWZpbmUgUExDU19CSVNUCTB4NWI2YiAJCS8qIEJJU1Qgc2lnbmF0dXJlIGZvciBQTEMtUyAqLworI2RlZmluZQlQTENfRUxNX0JfQklTVAkweDZlY2QJCS8qIEJJU1Qgc2lnbmF0dXJlIG9mIEVMTSBSZXYuIEIgKi8KKyNkZWZpbmUJUExDX0VMTV9EX0JJU1QJMHg1YjZiCQkvKiBCSVNUIHNpZ25hdHVyZSBvZiBFTE0gUmV2LiBEICovCisjZGVmaW5lCVBMQ19DQU1fQV9CSVNUCTB4OWU3NQkJLyogQklTVCBzaWduYXR1cmUgb2YgQ0FNRUwgUmV2LiBBICovCisjZGVmaW5lCVBMQ19DQU1fQl9CSVNUCTB4NWI2YgkJLyogQklTVCBzaWduYXR1cmUgb2YgQ0FNRUwgUmV2LiBCICovCisjZGVmaW5lCVBMQ19JRkRfQV9CSVNUCTB4OWU3NQkJLyogQklTVCBzaWduYXR1cmUgb2YgSUZEREkgUmV2LiBBICovCisjZGVmaW5lCVBMQ19JRkRfQl9CSVNUCTB4NWI2YgkJLyogQklTVCBzaWduYXR1cmUgb2YgSUZEREkgUmV2LiBCICovCisjZGVmaW5lCVBMQ19RRUxNX0FfQklTVAkweDViNmIJCS8qIEJJU1Qgc2lnbmF0dXJlIG9mIFFFTE0gUmV2LiBBICovCisKKy8qCisgCUZEREkgYm9hcmQgcmVjb3VyY2VzCQorICovCisKKy8qCisgKiByZXF1ZXN0IHJlZ2lzdGVyIGFycmF5IChsb2cuIGFkZHI6IFJRQV9BICsgYTw8MSB7YT0wLi43fSkgd3JpdGUgb25seS4KKyAqIEl0IHNwZWNpZmllcyB0byBGT1JNQUMrIHRoZSB0eXBlIG9mIGJ1ZmZlciBtZW1vcnkgYWNjZXNzIHRoZSBob3N0IHJlcXVpcmVzLgorICovCisjZGVmaW5lCVJRX05PVAkJMAkJLyogbm90IHJlcXVlc3QgKi8KKyNkZWZpbmUJUlFfUkVTCQkxCQkvKiByZXNlcnZlZCAqLworI2RlZmluZQlSUV9TRlcJCTIJCS8qIHNwZWNpYWwgZnJhbWUgd3JpdGUgKi8KKyNkZWZpbmUJUlFfUlJRCQkzCQkvKiByZWFkIHJlcXVlc3Q6IHJlY2VpdmUgcXVldWUgKi8KKyNkZWZpbmUJUlFfV1NRCQk0CQkvKiB3cml0ZSByZXF1ZXN0OiBzeW5jaHJvbm91cyBxdWV1ZSAqLworI2RlZmluZQlSUV9XQTAJCTUJCS8qIHdyaXRlIHJlcXUuOiBhc3luY2hyb25vdXMgcXVldWUgMCAqLworI2RlZmluZQlSUV9XQTEJCTYJCS8qIHdyaXRlIHJlcXUuOiBhc3luY2hyb25vdXMgcXVldWUgMSAqLworI2RlZmluZQlSUV9XQTIJCTcJCS8qIHdyaXRlIHJlcXUuOiBhc3luY2hyb25vdXMgcXVldWUgMiAqLworCisjZGVmaW5lCVNaX0xPTkcJCShzaXplb2YobG9uZykpCisKKy8qCisgKiBGRERJIGRlZmF1bHRzCisgKiBOT1RFIDogSW4gdGhlIEFOU0kgZG9jcywgdGltZXMgYXJlIHNwZWNpZmllZCBpbiB1bml0cyBvZiAic3ltYm9sIHRpbWUiLgorICogCSAgQU1EIGNoaXBzIHVzZSBCQ0xLIGFzIHVuaXQuIDEgQkNLTCA9PSAyIHN5bWJvbHMKKyAqLworI2RlZmluZQlDT01QTFJFRgkoKHVfbG9uZykzMioyNTYqMjU2KQkvKiB0d28ncyBjb21wbGVtZW50IDIxIGJpdCAqLworI2RlZmluZSBNU1RPQkNMSyh4KQkoKHVfbG9uZykoeCkqMTI1MDBMKQorI2RlZmluZSBNU1RPVFZYKHgpCSgoKHVfbG9uZykoeCkqMTAwMEwpLzgwLzI1NSkKKworI2VuZGlmCS8qIF9TVVBFUk5FVF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvaC90YXJnZXRody5oIGIvZHJpdmVycy9uZXQvc2tmcC9oL3RhcmdldGh3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJjNDkyMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvaC90YXJnZXRody5oCkBAIC0wLDAgKzEsMTY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCV9UQVJHRVRIV18KKyNkZWZpbmUgX1RBUkdFVEhXXworCisJLyoKKwkgKiAgUENJIFdhdGVybWFyayBkZWZpbml0aW9uCisJICovCisjaWZkZWYJUENJCisjZGVmaW5lCVJYX1dBVEVSTUFSSwkyNAorI2RlZmluZSBUWF9XQVRFUk1BUksJMjQKKyNkZWZpbmUgU0tfTUxfSURfMQkweDIwCisjZGVmaW5lIFNLX01MX0lEXzIJMHgzMAorI2VuZGlmCisKKyNpbmNsdWRlCSJoL3NrZmJpLmgiCisjaWZuZGVmIFRBR19NT0RFCQorI2luY2x1ZGUJImgvZnBsdXMuaCIKKyNlbHNlCisjaW5jbHVkZQkiaC9mcGx1c3RtLmgiCisjZW5kaWYKKworI2lmbmRlZglIV19QVFIKKyNkZWZpbmUgSFdfUFRSICB2b2lkIF9faW9tZW0gKgorI2VuZGlmCisKKyNpZmRlZiBNVUxUX09FTQorI2RlZmluZQlPSV9TVEFUX0xBU1QJCTAJLyogZW5kIG9mIE9FTSBkYXRhIGJhc2UgKi8KKyNkZWZpbmUJT0lfU1RBVF9QUkVTRU5UCQkxCS8qIGVudHJ5IHByZXNlbnQgYnV0IG5vdCBlbXB0eSAqLworI2RlZmluZQlPSV9TVEFUX1ZBTElECQkyCS8qIGhvbGRzIHZhbGlkIElELCBidXQgaXMgbm90IGFjdGl2ZSAqLyAKKyNkZWZpbmUJT0lfU1RBVF9BQ1RJVkUJCTMJLyogaG9sZHMgdmFsaWQgSUQsIGVudHJ5IGlzIGFjdGl2ZSAqLworCQkJCQkvKiBhY3RpdmUgPSBhZGFwdGVyIGlzIHN1cHBvcnRlZCAqLworCisvKiBNZW1vcnkgcmVwcmVzZW50YXRpb24gb2YgSURzIG11c3QgbWF0Y2ggcmVwcmVzZW50YXRpb24gaW4gYWRhcHRlci4gKi8KK3N0cnVjdAlzX29lbV9pZHMgeworCXVfY2hhcglvaV9zdGF0dXMgOwkJLyogU3RhdDogbGFzdCwgcHJlc2VudCwgdmFsaWQsIGFjdGl2ZSAqLworCXVfY2hhcglvaV9tYXJrWzVdIDsJCS8qICJQSUQwMCIgLi4gIlBJRDA3IiAuLgkqLworCXVfY2hhciAJb2lfaWRbNF0gOwkJLyogaWQgYnl0ZXMsIHJlcHJlc2VudGF0aW9uIGFzCSovCisJCQkJCS8qIGRlZmluZWQgYnkgaGFyZHdhcmUsCQkqLwkKKyNpZmRlZiBQQ0kKKwl1X2NoYXIgCW9pX3N1Yl9pZFs0XSA7CQkvKiBzdWIgaWQgYnl0ZXMsIHJlcHJlc2VudGF0aW9uIGFzICovCisJCQkJCS8qIGRlZmluZWQgYnkgaGFyZHdhcmUsCQkqLworI2VuZGlmCisjaWZkZWYgSVNBCisJdV9jaGFyCW9pX2xvZ29fbGVuIDsJCS8qIHRoZSBsZW5ndGggb2YgdGhlIGFkYXB0ZXIgbG9nbyAqLwkKKwl1X2NoYXIJb2lfbG9nb1s2XSA7CQkvKiB0aGUgYWRhcHRlciBsb2dvCQkqLworCXVfY2hhcglvaV9yZXNlcnZlZDEgOworI2VuZGlmCS8qIElTQSAqLworfSA7CisjZW5kaWYJLyogTVVMVF9PRU0gKi8KKworCitzdHJ1Y3Qgc19zbXRfaHcgeworCS8qCisJICogZ2xvYmFsCisJICovCisJSFdfUFRSCWlvcCA7CQkJLyogSU8gYmFzZSBhZGRyZXNzICovCisJc2hvcnQJZG1hIDsJCQkvKiBETUEgY2hhbm5lbCAqLworCXNob3J0CWlycSA7CQkJLyogSVJRIGxldmVsICovCisJc2hvcnQJZXByb20gOwkJCS8qIEZMQVNIIHByb20gKi8KKyNpZm5kZWYJUENJCisJc2hvcnQJRG1hV3JpdGVFeHRyYUJ5dGVzIDsJLyogYWRkIGJ5dGVzIGZvciBETUEgd3JpdGUgKi8KKyNlbmRpZgorCisjaWZuZGVmIFNZTkMKKwl1X3Nob3J0CW5fYV9zZW5kIDsJCS8qIHBlbmRpbmcgc2VuZCByZXF1ZXN0cyAqLworI2VuZGlmCisKKyNpZgkoZGVmaW5lZChFSVNBKSB8fCBkZWZpbmVkKE1DQSkgfHwgZGVmaW5lZChQQ0kpKQorCXNob3J0CXNsb3QgOwkJCS8qIHNsb3QgbnVtYmVyICovCisJc2hvcnQgICBtYXhfc2xvdHMgOwkJLyogbWF4aW11bSBudW1iZXIgb2Ygc2xvdHMgKi8KKyNlbmRpZgorCisjaWYJKGRlZmluZWQoUENJKSB8fCBkZWZpbmVkKE1DQSkpCisJc2hvcnQJd2RvZ191c2VkIDsJCS8qIFRSVUUgaWYgdGhlIHdhdGNoIGRvZyBpcyB1c2VkICovCisjZW5kaWYKKworI2lmZGVmCU1DQQorCXNob3J0CXNsb3RfMzIgOwkJLyogMzJiaXQgc2xvdCAoMSkgb3IgMTZiaXQgc2xvdCAoMCkgKi8KKwlzaG9ydAlyZXYgOwkJCS8qIEJvYXJkIHJldmlzaW9uIChGTXhfUkVWKS4gKi8KKwlzaG9ydAlWRnVsbFJlYWQgOwkJLyogVl9mdWxsIHZhbHVlIGZvciBETUEgcmVhZCAqLworCXNob3J0CVZGdWxsV3JpdGUgOwkJLyogVl9mdWxsIHZhbHVlIGZvciBETUEgd3JpdGUgKi8KKyNlbmRpZgorCisjaWZkZWYJRUlTQQorCXNob3J0CWxlZCA7CQkJLyogTEVEIGZvciBGRSBjYXJkICovCisKKwlzaG9ydAlkbWFfcm1vZGUgOwkJLyogcmVhZCBtb2RlICovCisJc2hvcnQJZG1hX3dtb2RlIDsJCS8qIHdyaXRlIG1vZGUgKi8KKwlzaG9ydAlkbWFfZW1vZGUgOwkJLyogZXh0ZW5kIG1vZGUgKi8KKworCS8qIERNQSBjb250cm9sbGVyIGNoYW5uZWwgZGVwZW5kZW50IGlvIGFkZHJlc3NlcyAqLworCXVfc2hvcnQgZG1hX2Jhc2Vfd29yZF9jb3VudCA7CisJdV9zaG9ydCBkbWFfYmFzZV9hZGRyZXNzIDsKKwl1X3Nob3J0IGRtYV9iYXNlX2FkZHJlc3NfcGFnZSA7CisjZW5kaWYKKworI2lmZGVmCVBDSQorCXVfc2hvcnQJcGNpX2hhbmRsZSA7CQkvKiBoYW5kbGUgdG8gYWNjZXNzIHRoZSBCSU9TIGZ1bmMgKi8KKwl1X2xvbmcJaXNfaW1hc2sgOwkJLyogaW50IG1hc2tlIGZvciB0aGUgaW50IHNvdXJjZSByZWcgKi8KKwl1X2xvbmcJcGh5c19tZW1fYWRkciA7CQkvKiBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzcyAqLworCXVfc2hvcnQJbWNfZHVtbXkgOwkJLyogd29yayBhcm91bmQgZm9yIE1DIGNvbXBpbGVyIGJ1ZyAqLwkKKwkvKgorCSAqIHN0YXRlIG9mIHRoZSBoYXJkd2FyZQorCSAqLworCXVfc2hvcnQgaHdfc3RhdGUgOwkJLyogc3RhcnRlZCBvciBzdG9wcGVkICovCisKKyNkZWZpbmUJU1RBUlRFRAkJMQorI2RlZmluZQlTVE9QUEVECQkwCisKKwlpbnQJaHdfaXNfNjRiaXQgOwkJLyogZG9lcyB3ZSBoYXZlIGEgNjQgYml0IGFkYXB0ZXIgKi8KKyNlbmRpZgorCisjaWZkZWYJVEFHX01PREUKKwl1X2xvbmcJcGNpX2ZpeF92YWx1ZSA7CQkvKiB2YWx1ZSBwYXJzZWQgYnkgUENJRklYICovCisjZW5kaWYKKworCS8qCisJICogaHd0LmMKKwkgKi8KKwl1X2xvbmcJdF9zdGFydCA7CQkvKiBIV1Qgc3RhcnQgKi8KKwl1X2xvbmcJdF9zdG9wIDsJCS8qIEhXVCBzdG9wICovCisJdV9zaG9ydAl0aW1lcl9hY3RpdiA7CQkvKiBIV1QgdGltZXIgYWN0aXZlICovCisKKwkvKgorCSAqIFBJQworCSAqLworCXVfY2hhcglwaWNfYTEgOworCXVfY2hhcglwaWNfMjEgOworCisJLyoKKwkgKiBHRU5FUklDIDsgZG8gbm90IG1vZGlmeSBiZXlvbmQgdGhpcyBsaW5lCisJICovCisKKwkvKgorCSAqIHBoeXNpY2FsIGFuZCBjYW5vbmljYWwgYWRkcmVzcworCSAqLworCXN0cnVjdCBmZGRpX2FkZHIgZmRkaV9ob21lX2FkZHIgOworCXN0cnVjdCBmZGRpX2FkZHIgZmRkaV9jYW5vbl9hZGRyIDsKKwlzdHJ1Y3QgZmRkaV9hZGRyIGZkZGlfcGh5c19hZGRyIDsKKworCS8qCisJICogbWFjIHZhcmlhYmxlcworCSAqLworCXN0cnVjdCBtYWNfcGFyYW1ldGVyIG1hY19wYSA7CS8qIHRtaW4sIHRtYXgsIHR2eCwgdHJlcSAuLiAqLworCXN0cnVjdCBtYWNfY291bnRlciBtYWNfY3QgOwkvKiByZWN2LiwgbG9zdCwgZXJyb3IgICovCisJdV9zaG9ydAltYWNfcmluZ19pc191cCA7CS8qIHJpbmcgaXMgdXAgZmxhZyAqLworCisJc3RydWN0IHNfc210X2ZwCWZwIDsJCS8qIGZvcm1hYysgKi8KKworI2lmZGVmIE1VTFRfT0VNCisJc3RydWN0IHNfb2VtX2lkcyAqb2VtX2lkIDsJLyogcG9pbnRlciB0byBzZWxlY3RlZCBpZCAqLworCWludCBvZW1fbWluX3N0YXR1cyA7CQkvKiBJRHMgdG8gdGFrZSBjYXJlIG9mICovCisjZW5kaWYJLyogTVVMVF9PRU0gKi8KKworfSA7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvaC90YXJnZXRvcy5oIGIvZHJpdmVycy9uZXQvc2tmcC9oL3RhcmdldG9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5NDBlNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvaC90YXJnZXRvcy5oCkBAIC0wLDAgKzEsMTY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJT3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpYyBkZWZpbml0aW9ucyBmb3IgZHJpdmVyIGFuZAorICoJaGFyZHdhcmUgbW9kdWxlLgorICovCisKKyNpZm5kZWYJVEFSR0VUT1NfSAorI2RlZmluZSBUQVJHRVRPU19ICisKKworLy8tLS0tLS0tLSB0aG9zZSBzaG91bGQgZ28gaW50byBpbmNsdWRlL2xpbnV4L3BjaS5oCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU0sJCTB4MTE0OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NLX0ZQCQkweDQwMDAKKy8vLS0tLS0tLS0KKworCisKKy8vLS0tLS0tLS0gdGhvc2Ugc2hvdWxkIGdvIGludG8gaW5jbHVkZS9saW51eC9pZl9mZGRpLmgKKyNkZWZpbmUgRkRESV9NQUNfSERSX0xFTiAxMworCisjZGVmaW5lIEZERElfUklJCTB4MDEgLyogcm91dGluZyBpbmZvcm1hdGlvbiBiaXQgKi8KKyNkZWZpbmUgRkRESV9SQ0ZfRElSX0JJVCAweDgwCisjZGVmaW5lIEZERElfUkNGX0xFTl9NQVNLIDB4MWYKKyNkZWZpbmUgRkRESV9SQ0ZfQlJPQURDQVNUIDB4ODAwMAorI2RlZmluZSBGRERJX1JDRl9MSU1JVEVEX0JST0FEQ0FTVCAweEEwMDAKKyNkZWZpbmUgRkRESV9SQ0ZfRlJBTUUySyAweDIwCisjZGVmaW5lIEZERElfUkNGX0ZSQU1FNEsgMHgzMAorLy8tLS0tLS0tLQorCisKKyN1bmRlZiBBRERSCisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mZGRpZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisvLyBpcyByZWRlZmluZWQgYnkgbGludXgsIGJ1dCB3ZSBuZWVkIG91ciBkZWZpbml0aW9uCisjdW5kZWYgQUREUgorI2lmZGVmIE1FTV9NQVBQRURfSU8KKyNkZWZpbmUJQUREUihhKSAoc21jLT5ody5pb3ArKGEpKQorI2Vsc2UKKyNkZWZpbmUJQUREUihhKSAoKChhKT4+NykgPyAob3V0cChzbWMtPmh3LmlvcCtCMF9SQVAsKGEpPj43KSwgKHNtYy0+aHcuaW9wKyggKChhKSYweDdGKSB8ICgoYSk+PjcgPyAweDgwOjApKSApKSA6IChzbWMtPmh3LmlvcCsoKChhKSYweDdGKXwoKGEpPj43ID8gMHg4MDowKSkpKQorI2VuZGlmCisKKyNpbmNsdWRlICJoL2h3bXRtLmgiCisKKyNkZWZpbmUgVFJVRSAgMQorI2RlZmluZSBGQUxTRSAwCisKKy8vIEhXTSBEZWZpbml0aW9ucworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgRkRESV9UUkFDRShzdHJpbmcsIGFyZzEsIGFyZzIsIGFyZzMpCS8vIFBlcmZvcm1hbmNlIGFuYWx5c2lzLgorI2lmZGVmIFBDSQorI2RlZmluZSBORERfVFJBQ0Uoc3RyaW5nLCBhcmcxLCBhcmcyLCBhcmczKQkvLyBQZXJmb3JtYW5jZSBhbmFseXNpcy4KKyNlbmRpZgkvLyBQQ0kKKyNkZWZpbmUgU01UX1BBR0VTSVpFCVBBR0VfU0laRQkvLyBTaXplIG9mIGEgbWVtb3J5IHBhZ2UgKHBvd2VyIG9mIDIpLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisvLyBTTVQgRGVmaW5pdGlvbnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lCVRJQ0tTX1BFUl9TRUNPTkQJSFoKKyNkZWZpbmUgU01DX1ZFUlNJT04gICAgCQkxCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKy8vIE9TLURyaXZlciBEZWZpbml0aW9ucworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgTk9fQUREUkVTUyAweGZmZTAJLyogTm8gRGV2aWNlIChJL08pIEFkZHJlc3MgKi8KKyNkZWZpbmUgU0tGUF9NQVhfTlVNX0JPQVJEUyA4CS8qIG1heGltdW0gbnVtYmVyIG9mIFBDSSBib2FyZHMgKi8KKworI2RlZmluZSBTS19CVVNfVFlQRV9QQ0kJCTAKKyNkZWZpbmUgU0tfQlVTX1RZUEVfRUlTQQkxCisKKyNkZWZpbmUgRlBfSU9fTEVOCQkyNTYJLyogbGVuZ3RoIG9mIElPIGFyZWEgdXNlZCAqLworCisjZGVmaW5lIHU4CXVuc2lnbmVkIGNoYXIKKyNkZWZpbmUgdTE2CXVuc2lnbmVkIHNob3J0CisjZGVmaW5lIHUzMgl1bnNpZ25lZCBpbnQKKworI2RlZmluZSBNQVhfVFhfUVVFVUVfTEVOCTIwIC8vIG51bWJlciBvZiBwYWNrZXRzIHF1ZXVlZCBieSBkcml2ZXIKKyNkZWZpbmUgTUFYX0ZSQU1FX1NJWkUJCTQ1NTAKKworI2RlZmluZQlSWF9MT1dfV0FURVJNQVJLCU5VTV9SRUNFSVZFX0JVRkZFUlMgIC8gMgorI2RlZmluZSBUWF9MT1dfV0FURVJNQVJLCU5VTV9UUkFOU01JVF9CVUZGRVJTIC0gMgorCisvKgorKiogSW5jbHVkZSB0aGUgSU9DVEwgc3R1ZmYKKyovCisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorCisjZGVmaW5lCVNLRlBJT0NUTAlTSU9DREVWUFJJVkFURQorCitzdHJ1Y3Qgc19za2ZwX2lvY3RsIHsKKwl1bnNpZ25lZCBzaG9ydCBjbWQ7ICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgdG8gcnVuICovCisJdW5zaWduZWQgc2hvcnQgbGVuOyAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgdGhlIGRhdGEgYnVmZmVyICovCisJdW5zaWduZWQgY2hhciBfX3VzZXIgKmRhdGE7ICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciAqLworfTsKKworLyogCisqKiBSZWNvZ25pc2VkIGlvY3RsIGNvbW1hbmRzIGZvciB0aGUgZHJpdmVyIAorKi8KKyNkZWZpbmUgU0tGUF9HRVRfU1RBVFMJCTB4MDUgLyogR2V0IHRoZSBkcml2ZXIgc3RhdGlzdGljcyAqLworI2RlZmluZSBTS0ZQX0NMUl9TVEFUUwkJMHgwNiAvKiBaZXJvIG91dCB0aGUgZHJpdmVyIHN0YXRpc3RpY3MgKi8KKworLy8gVGhlIHBlci1hZGFwdGVyIGRyaXZlciBzdHJ1Y3R1cmUKK3N0cnVjdCBzX3NtdF9vcyB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV4dF9tb2R1bGU7CisJdTMyCWJ1c190eXBlOwkJLyogYnVzIHR5cGUgKDAgPT0gUENJLCAxID09IEVJU0EpICovCisJc3RydWN0IHBjaV9kZXYgCXBkZXY7CQkvKiBQQ0kgZGV2aWNlIHN0cnVjdHVyZSAqLworCQorCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyOworCXVuc2lnbmVkIGNoYXIgZmFjdG9yeV9tYWNfYWRkcls4XTsKKwl1bG9uZwlTaGFyZWRNZW1TaXplOworCXVsb25nCVNoYXJlZE1lbUhlYXA7CisJdm9pZCoJU2hhcmVkTWVtQWRkcjsKKwlkbWFfYWRkcl90IFNoYXJlZE1lbURNQTsKKworCXVsb25nCVF1ZXVlU2tiOworCXN0cnVjdAlza19idWZmX2hlYWQgU2VuZFNrYlF1ZXVlOworCisJdWxvbmcJTWF4RnJhbWVTaXplOworCXU4CVJlc2V0UmVxdWVzdGVkOworCisJLy8gTUFDIHN0YXRpc3RpY3Mgc3RydWN0dXJlCisJc3RydWN0IGZkZGlfc3RhdGlzdGljcyBNYWNTdGF0OworCisJLy8gcmVjZWl2ZSBpbnRvIHRoaXMgbG9jYWwgYnVmZmVyIGlmIG5vIHNrYiBhdmFpbGFibGUKKwkvLyBkYXRhIHdpbGwgYmUgbm90IHZhbGlkLCBiZWNhdXNlIG11bHRpcGxlIFJ4RHMgY2FuCisJLy8gcG9pbnQgaGVyZSBhdCB0aGUgc2FtZSB0aW1lLCBpdCBtdXN0IGJlIGF0IGxlYXN0CisJLy8gTUFYX0ZSQU1FX1NJWkUgYnl0ZXMgaW4gc2l6ZQorCXVuc2lnbmVkIGNoYXIgKkxvY2FsUnhCdWZmZXI7CisJZG1hX2FkZHJfdCBMb2NhbFJ4QnVmZmVyRE1BOworCQorCS8vIFZlcnNpb24gKHJlcXVpcmVkIGJ5IFNNVCBtb2R1bGUpLgorCXVfbG9uZyBzbWNfdmVyc2lvbiA7CisKKwkvLyBSZXF1aXJlZCBieSBIYXJkd2FyZSBNb2R1bGUgKEhXTSkuCisJc3RydWN0IGh3X21vZHVsIGh3bSA7CisJCisJLy8gRm9yIFNNUC1zYXZldHkKKwlzcGlubG9ja190IERyaXZlckxvY2s7CisJCit9OworCit0eXBlZGVmIHN0cnVjdCBzX3NtdF9vcyBza2ZkZGlfcHJpdjsKKworI2VuZGlmCSAvLyBfVEFSR0VUT1NfCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2gvdHlwZXMuaCBiL2RyaXZlcnMvbmV0L3NrZnAvaC90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhM2JmODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2gvdHlwZXMuaApAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZQk8bGludXgvdHlwZXMuaD4KKy8qCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUJhc2ljIFNNVCBzeXN0ZW0gdHlwZXMKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2lmbmRlZiBfVFlQRVNfCisjZGVmaW5lCV9UWVBFU18KKworI2RlZmluZSBfcGFja2VkCisjaWZuZGVmIGZhcgorI2RlZmluZSBmYXIKKyNlbmRpZgorI2lmbmRlZiBfZmFyCisjZGVmaW5lIF9mYXIKKyNlbmRpZgorCisjZGVmaW5lIGlucChwKSAgaW9yZWFkOChwKQorI2RlZmluZSBpbnB3KHApCWlvcmVhZDE2KHApCisjZGVmaW5lIGlucGQocCkgaW9yZWFkMzIocCkKKyNkZWZpbmUgb3V0cChwLGMpICBpb3dyaXRlOChjLHApCisjZGVmaW5lIG91dHB3KHAscykgaW93cml0ZTE2KHMscCkKKyNkZWZpbmUgb3V0cGQocCxsKSBpb3dyaXRlMzIobCxwKQorCisjZW5kaWYJLyogX1RZUEVTXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9od210bS5jIGIvZHJpdmVycy9uZXQvc2tmcC9od210bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZDQyOTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2h3bXRtLmMKQEAgLTAsMCArMSwyMjE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCWxpbnQKK3N0YXRpYyBjaGFyIGNvbnN0IElEX3NjY3NbXSA9ICJAKCMpaHdtdG0uYwkxLjQwIDk5LzA1LzMxIChDKSBTSyIgOworI2VuZGlmCisKKyNkZWZpbmUJSFdNVE0KKworI2lmbmRlZiBGRERJCisjZGVmaW5lCUZEREkKKyNlbmRpZgorCisjaW5jbHVkZSAiaC90eXBlcy5oIgorI2luY2x1ZGUgImgvZmRkaS5oIgorI2luY2x1ZGUgImgvc21jLmgiCisjaW5jbHVkZSAiaC9zdXBlcm5fMi5oIgorI2luY2x1ZGUgImgvc2tmYmlpbmMuaCIKKworLyoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJRE9DVU1FTlRBVElPTgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlCRUdJTl9NQU5VQUxfRU5UUlkoRE9DVU1FTlRBVElPTikKKworCQkJVCBCIEQKKworCUVORF9NQU5VQUxfRU5UUlkKKyovCisvKgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlMT0NBTCBWQVJJQUJMRVM6CisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKyNpZmRlZiBDT01NT05fTUJfUE9PTAorc3RhdGljCVNNYnVmICptYl9zdGFydCA9IDAgOworc3RhdGljCVNNYnVmICptYl9mcmVlID0gMCA7CitzdGF0aWMJaW50IG1iX2luaXQgPSBGQUxTRSA7CitzdGF0aWMJaW50IGNhbGxfY291bnQgPSAwIDsKKyNlbmRpZgorCisvKgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlFWFRFUk5FIFZBUklBQkxFUzoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZkZWYJREVCVUcKKyNpZm5kZWYJREVCVUdfQlJECitleHRlcm4Jc3RydWN0IHNtdF9kZWJ1ZwlkZWJ1ZyA7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYJTkRJU19PUzIKK2V4dGVybgl1X2NoYXIJb2ZmRGVwdGggOworZXh0ZXJuCXVfY2hhcglmb3JjZV9pcnFfcGVuZGluZyA7CisjZW5kaWYKKworLyoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTE9DQUwgRlVOQ1RJT05TOgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK3N0YXRpYyB2b2lkIHF1ZXVlX2xsY19yeChzdHJ1Y3Qgc19zbWMgKnNtYywgU01idWYgKm1iKTsKK3N0YXRpYyB2b2lkIHNtdF90b19sbGMoc3RydWN0IHNfc21jICpzbWMsIFNNYnVmICptYik7CitzdGF0aWMgdm9pZCBpbml0X3R4ZF9yaW5nKHN0cnVjdCBzX3NtYyAqc21jKTsKK3N0YXRpYyB2b2lkIGluaXRfcnhkX3Jpbmcoc3RydWN0IHNfc21jICpzbWMpOworc3RhdGljIHZvaWQgcXVldWVfdHhkX21iKHN0cnVjdCBzX3NtYyAqc21jLCBTTWJ1ZiAqbWIpOworc3RhdGljIHVfbG9uZyBpbml0X2Rlc2NyX3Jpbmcoc3RydWN0IHNfc21jICpzbWMsIHVuaW9uIHNfZnBfZGVzY3Igdm9sYXRpbGUgKnN0YXJ0LAorCQkJICAgICAgaW50IGNvdW50KTsKK3N0YXRpYyB1X2xvbmcgcmVwYWlyX3R4ZF9yaW5nKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc19zbXRfdHhfcXVldWUgKnF1ZXVlKTsKK3N0YXRpYyB1X2xvbmcgcmVwYWlyX3J4ZF9yaW5nKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc19zbXRfcnhfcXVldWUgKnF1ZXVlKTsKK3N0YXRpYyBTTWJ1ZiogZ2V0X2xsY19yeChzdHJ1Y3Qgc19zbWMgKnNtYyk7CitzdGF0aWMgU01idWYqIGdldF90eGRfbWIoc3RydWN0IHNfc21jICpzbWMpOworCisvKgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlFWFRFUk5BTCBGVU5DVElPTlM6CisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKy8qCVRoZSBleHRlcm5hbCBTTVQgZnVuY3Rpb25zIGFyZSBsaXN0ZWQgaW4gY210ZGVmLmggKi8KKworZXh0ZXJuIHZvaWQqIG1hY19kcnZfZ2V0X3NwYWNlKHN0cnVjdCBzX3NtYyAqc21jLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCogbWFjX2Rydl9nZXRfZGVzY19tZW0oc3RydWN0IHNfc21jICpzbWMsIHVuc2lnbmVkIGludCBzaXplKTsKK2V4dGVybiB2b2lkIGluaXRfYm9hcmQoc3RydWN0IHNfc21jICpzbWMsIHVfY2hhciAqbWFjX2FkZHIpOworZXh0ZXJuIHZvaWQgbWFjX2Rydl9maWxsX3J4ZChzdHJ1Y3Qgc19zbWMgKnNtYyk7CitleHRlcm4gdm9pZCBwbGMxX2lycShzdHJ1Y3Qgc19zbWMgKnNtYyk7CitleHRlcm4gdm9pZCBtYWNfZHJ2X3R4X2NvbXBsZXRlKHN0cnVjdCBzX3NtYyAqc21jLAorCQkJCXZvbGF0aWxlIHN0cnVjdCBzX3NtdF9mcF90eGQgKnR4ZCk7CitleHRlcm4gdm9pZCBwbGMyX2lycShzdHJ1Y3Qgc19zbWMgKnNtYyk7CitleHRlcm4gdm9pZCBtYWMxX2lycShzdHJ1Y3Qgc19zbWMgKnNtYywgdV9zaG9ydCBzdHUsIHVfc2hvcnQgc3RsKTsKK2V4dGVybiB2b2lkIG1hYzJfaXJxKHN0cnVjdCBzX3NtYyAqc21jLCB1X3Nob3J0IGNvZGVfczJ1LCB1X3Nob3J0IGNvZGVfczJsKTsKK2V4dGVybiB2b2lkIG1hYzNfaXJxKHN0cnVjdCBzX3NtYyAqc21jLCB1X3Nob3J0IGNvZGVfczN1LCB1X3Nob3J0IGNvZGVfczNsKTsKK2V4dGVybiB2b2lkIHRpbWVyX2lycShzdHJ1Y3Qgc19zbWMgKnNtYyk7CitleHRlcm4gdm9pZCBtYWNfZHJ2X3J4X2NvbXBsZXRlKHN0cnVjdCBzX3NtYyAqc21jLAorCQkJCXZvbGF0aWxlIHN0cnVjdCBzX3NtdF9mcF9yeGQgKnJ4ZCwKKwkJCQlpbnQgZnJhZ19jb3VudCwgaW50IGxlbik7CitleHRlcm4gdm9pZCBtYWNfZHJ2X3JlcXVldWVfcnhkKHN0cnVjdCBzX3NtYyAqc21jLCAKKwkJCQl2b2xhdGlsZSBzdHJ1Y3Qgc19zbXRfZnBfcnhkICpyeGQsCisJCQkJaW50IGZyYWdfY291bnQpOworZXh0ZXJuIHZvaWQgaW5pdF9wbGMoc3RydWN0IHNfc21jICpzbWMpOworZXh0ZXJuIHZvaWQgbWFjX2Rydl9jbGVhcl9yeGQoc3RydWN0IHNfc21jICpzbWMsCisJCQkgICAgICB2b2xhdGlsZSBzdHJ1Y3Qgc19zbXRfZnBfcnhkICpyeGQsIGludCBmcmFnX2NvdW50KTsKKworI2lmZGVmCVVTRV9PU19DUFkKK2V4dGVybiB2b2lkIGh3bV9jcHlfcnhkMm1iKHZvaWQpOworZXh0ZXJuIHZvaWQgaHdtX2NweV90eGQybWIodm9pZCk7CisjZW5kaWYKKworI2lmZGVmCUFMTF9SWF9DT01QTEVURQorZXh0ZXJuIHZvaWQgbWFjX2Rydl9hbGxfcmVjZWl2ZXNfY29tcGxldGUodm9pZCk7CisjZW5kaWYKKworZXh0ZXJuIHVfbG9uZyBtYWNfZHJ2X3ZpcnQycGh5cyhzdHJ1Y3Qgc19zbWMgKnNtYywgdm9pZCAqdmlydCk7CitleHRlcm4gdV9sb25nIGRtYV9tYXN0ZXIoc3RydWN0IHNfc21jICpzbWMsIHZvaWQgKnZpcnQsIGludCBsZW4sIGludCBmbGFnKTsKKworI2lmZGVmCU5ESVNfT1MyCitleHRlcm4gdm9pZCBwb3N0X3Byb2Modm9pZCk7CisjZWxzZQorZXh0ZXJuIHZvaWQgZG1hX2NvbXBsZXRlKHN0cnVjdCBzX3NtYyAqc21jLCB2b2xhdGlsZSB1bmlvbiBzX2ZwX2Rlc2NyICpkZXNjciwKKwkJCSBpbnQgZmxhZyk7CisjZW5kaWYKKworZXh0ZXJuIGludCBpbml0X2ZwbHVzKHN0cnVjdCBzX3NtYyAqc21jKTsKK2V4dGVybiBpbnQgbWFjX2Rydl9yeF9pbml0KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbGVuLCBpbnQgZmMsIGNoYXIgKmxvb2tfYWhlYWQsCisJCQkgICBpbnQgbGFfbGVuKTsKKworLyoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJUFVCTElDIEZVTkNUSU9OUzoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLwordm9pZCBwcm9jZXNzX3JlY2VpdmUoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBmZGRpX2lzcihzdHJ1Y3Qgc19zbWMgKnNtYyk7Cit2b2lkIG1hY19kcnZfY2xlYXJfdHhkKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgc210X2ZyZWVfbWJ1ZihzdHJ1Y3Qgc19zbWMgKnNtYywgU01idWYgKm1iKTsKK3ZvaWQgaW5pdF9kcml2ZXJfZnBsdXMoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBtYWNfZHJ2X3J4X21vZGUoc3RydWN0IHNfc21jICpzbWMsIGludCBtb2RlKTsKK3ZvaWQgaW5pdF9mZGRpX2RyaXZlcihzdHJ1Y3Qgc19zbWMgKnNtYywgdV9jaGFyICptYWNfYWRkcik7Cit2b2lkIG1hY19kcnZfY2xlYXJfdHhfcXVldWUoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBtYWNfZHJ2X2NsZWFyX3J4X3F1ZXVlKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgaHdtX3R4X2ZyYWcoc3RydWN0IHNfc21jICpzbWMsIGNoYXIgZmFyICp2aXJ0LCB1X2xvbmcgcGh5cywgaW50IGxlbiwKKwkJIGludCBmcmFtZV9zdGF0dXMpOwordm9pZCBod21fcnhfZnJhZyhzdHJ1Y3Qgc19zbWMgKnNtYywgY2hhciBmYXIgKnZpcnQsIHVfbG9uZyBwaHlzLCBpbnQgbGVuLAorCQkgaW50IGZyYW1lX3N0YXR1cyk7CisKK2ludCBtYWNfZHJ2X3J4X2ZyYWcoc3RydWN0IHNfc21jICpzbWMsIHZvaWQgZmFyICp2aXJ0LCBpbnQgbGVuKTsKK2ludCBtYWNfZHJ2X2luaXQoc3RydWN0IHNfc21jICpzbWMpOworaW50IGh3bV90eF9pbml0KHN0cnVjdCBzX3NtYyAqc21jLCB1X2NoYXIgZmMsIGludCBmcmFnX2NvdW50LCBpbnQgZnJhbWVfbGVuLAorCQlpbnQgZnJhbWVfc3RhdHVzKTsKKwordV9pbnQgbWFjX2Rydl9jaGVja19zcGFjZSh2b2lkKTsKKworU01idWYqIHNtdF9nZXRfbWJ1ZihzdHJ1Y3Qgc19zbWMgKnNtYyk7CisKKyNpZmRlZiBERUJVRworCXZvaWQgbWFjX2Rydl9kZWJ1Z19sZXYodm9pZCk7CisjZW5kaWYKKworLyoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJTUFDUk9TOgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisjaWZuZGVmCVVOVVNFRAorI2lmZGVmCWxpbnQKKyNkZWZpbmUgVU5VU0VEKHgpCSh4KSA9ICh4KQorI2Vsc2UKKyNkZWZpbmUgVU5VU0VEKHgpCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYJVVNFX0NBTl9BRERSCisjZGVmaW5lIE1BCQlzbWMtPmh3LmZkZGlfY2Fub25fYWRkci5hCisjZGVmaW5lCUdST1VQX0FERFJfQklUCTB4MDEKKyNlbHNlCisjZGVmaW5lCU1BCQlzbWMtPmh3LmZkZGlfaG9tZV9hZGRyLmEKKyNkZWZpbmUJR1JPVVBfQUREUl9CSVQJMHg4MAorI2VuZGlmCisKKyNkZWZpbmUgUlhEX1RYRF9DT1VOVAkoSFdNX0FTWU5DX1RYRF9DT1VOVCtIV01fU1lOQ19UWERfQ09VTlQrXAorCQkJU01UX1IxX1JYRF9DT1VOVCtTTVRfUjJfUlhEX0NPVU5UKQorCisjaWZkZWYJTUJfT1VUU0lERV9TTUMKKyNkZWZpbmUJRVhUX1ZJUlRfTUVNCSgoUlhEX1RYRF9DT1VOVCsxKSpzaXplb2Yoc3RydWN0IHNfc210X2ZwX3R4ZCkgK1wKKwkJCU1BWF9NQlVGKnNpemVvZihTTWJ1ZikpCisjZGVmaW5lCUVYVF9WSVJUX01FTV8yCSgoUlhEX1RYRF9DT1VOVCsxKSpzaXplb2Yoc3RydWN0IHNfc210X2ZwX3R4ZCkpCisjZWxzZQorI2RlZmluZQlFWFRfVklSVF9NRU0JKChSWERfVFhEX0NPVU5UKzEpKnNpemVvZihzdHJ1Y3Qgc19zbXRfZnBfdHhkKSkKKyNlbmRpZgorCisJLyoKKwkgKiBkZWZpbmUgY3JpdGljYWwgcmVhZCBmb3IgMTYgQml0IGRyaXZlcnMKKwkgKi8KKyNpZglkZWZpbmVkKE5ESVNfT1MyKSB8fCBkZWZpbmVkKE9ESTIpCisjZGVmaW5lIENSX1JFQUQodmFyKQkoKHZhcikgJiAweGZmZmYwMDAwIHwgKCh2YXIpICYgMHhmZmZmKSkKKyNlbHNlCisjZGVmaW5lIENSX1JFQUQodmFyKQkodV9sb25nKSh2YXIpCisjZW5kaWYKKworI2RlZmluZSBJTUFTS19TTE9XCShJU19QTElOVDEgfCBJU19QTElOVDIgfCBJU19USU1JTlQgfCBJU19UT0tFTiB8IFwKKwkJCSBJU19NSU5UUjEgfCBJU19NSU5UUjIgfCBJU19NSU5UUjMgfCBJU19SMV9QIHwgXAorCQkJIElTX1IxX0MgfCBJU19YQV9DIHwgSVNfWFNfQykKKworLyoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSU5JVC0gQU5EIFNNVCBGVU5DVElPTlM6CisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworCisvKgorICoJQkVHSU5fTUFOVUFMX0VOVFJZKG1hY19kcnZfY2hlY2tfc3BhY2UpCisgKgl1X2ludCBtYWNfZHJ2X2NoZWNrX3NwYWNlKCkKKyAqCisgKglmdW5jdGlvbglET1dOQ0FMTAkoZHJ2c3IuYykKKyAqCQkJVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBuZWVkZWQgbm9uIHZpcnR1YWwKKyAqCQkJbWVtb3J5IGZvciBNQnVmcywgUnhEIGFuZCBUeEQgZGVzY3JpcHRvcnMgZXRjLgorICoJCQluZWVkZWQgYnkgdGhlIGRyaXZlci4KKyAqCisgKglyZXR1cm4JCXVfaW50CW1lbW9yeSBpbiBieXRlcworICoKKyAqCUVORF9NQU5VQUxfRU5UUlkKKyAqLwordV9pbnQgbWFjX2Rydl9jaGVja19zcGFjZSh2b2lkKQoreworI2lmZGVmCU1CX09VVFNJREVfU01DCisjaWZkZWYJQ09NTU9OX01CX1BPT0wKKwljYWxsX2NvdW50KysgOworCWlmIChjYWxsX2NvdW50ID09IDEpIHsKKwkJcmV0dXJuKEVYVF9WSVJUX01FTSkgOworCX0KKwllbHNlIHsKKwkJcmV0dXJuKEVYVF9WSVJUX01FTV8yKSA7CisJfQorI2Vsc2UKKwlyZXR1cm4gKEVYVF9WSVJUX01FTSkgOworI2VuZGlmCisjZWxzZQorCXJldHVybiAoMCkgOworI2VuZGlmCit9CisKKy8qCisgKglCRUdJTl9NQU5VQUxfRU5UUlkobWFjX2Rydl9pbml0KQorICoJdm9pZCBtYWNfZHJ2X2luaXQoc21jKQorICoKKyAqCWZ1bmN0aW9uCURPV05DQUxMCShkcnZzci5jKQorICoJCQlJbiB0aGlzIGZ1bmN0aW9uIHRoZSBoYXJkd2FyZSBtb2R1bGUgYWxsb2NhdGVzIGl0J3MKKyAqCQkJbWVtb3J5LgorICoJCQlUaGUgb3BlcmF0aW5nIHN5c3RlbSBkZXBlbmRlbnQgbW9kdWxlIHNob3VsZCBjYWxsCisgKgkJCW1hY19kcnZfaW5pdCBvbmNlLCBhZnRlciB0aGUgYWRhdHBlciBpcyBkZXRlY3RlZC4KKyAqCUVORF9NQU5VQUxfRU5UUlkKKyAqLworaW50IG1hY19kcnZfaW5pdChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlpZiAoc2l6ZW9mKHN0cnVjdCBzX3NtdF9mcF9yeGQpICUgMTYpIHsKKwkJU01UX1BBTklDKHNtYyxIV01fRTAwMDEsSFdNX0UwMDAxX01TRykgOworCX0KKwlpZiAoc2l6ZW9mKHN0cnVjdCBzX3NtdF9mcF90eGQpICUgMTYpIHsKKwkJU01UX1BBTklDKHNtYyxIV01fRTAwMDIsSFdNX0UwMDAyX01TRykgOworCX0KKworCS8qCisJICogZ2V0IHRoZSByZXF1aXJlZCBtZW1vcnkgZm9yIHRoZSBSeERzIGFuZCBUeERzCisJICovCisJaWYgKCEoc21jLT5vcy5od20uZGVzY3JfcCA9ICh1bmlvbiBzX2ZwX2Rlc2NyIHZvbGF0aWxlICopCisJCW1hY19kcnZfZ2V0X2Rlc2NfbWVtKHNtYywodV9pbnQpCisJCShSWERfVFhEX0NPVU5UKzEpKnNpemVvZihzdHJ1Y3Qgc19zbXRfZnBfdHhkKSkpKSB7CisJCXJldHVybigxKSA7CS8qIG5vIHNwYWNlIHRoZSBod20gbW9kdWwgY2FuJ3Qgd29yayAqLworCX0KKworCS8qCisJICogZ2V0IHRoZSBtZW1vcnkgZm9yIHRoZSBTTVQgTUJ1ZnMKKwkgKi8KKyNpZm5kZWYJTUJfT1VUU0lERV9TTUMKKwlzbWMtPm9zLmh3bS5tYnVmX3Bvb2wubWJfc3RhcnQ9KFNNYnVmICopKCZzbWMtPm9zLmh3bS5tYnVmX3Bvb2wubWJbMF0pIDsKKyNlbHNlCisjaWZuZGVmCUNPTU1PTl9NQl9QT09MCisJaWYgKCEoc21jLT5vcy5od20ubWJ1Zl9wb29sLm1iX3N0YXJ0ID0gKFNNYnVmICopIG1hY19kcnZfZ2V0X3NwYWNlKHNtYywKKwkJTUFYX01CVUYqc2l6ZW9mKFNNYnVmKSkpKSB7CisJCXJldHVybigxKSA7CS8qIG5vIHNwYWNlIHRoZSBod20gbW9kdWwgY2FuJ3Qgd29yayAqLworCX0KKyNlbHNlCisJaWYgKCFtYl9zdGFydCkgeworCQlpZiAoIShtYl9zdGFydCA9IChTTWJ1ZiAqKSBtYWNfZHJ2X2dldF9zcGFjZShzbWMsCisJCQlNQVhfTUJVRipzaXplb2YoU01idWYpKSkpIHsKKwkJCXJldHVybigxKSA7CS8qIG5vIHNwYWNlIHRoZSBod20gbW9kdWwgY2FuJ3Qgd29yayAqLworCQl9CisJfQorI2VuZGlmCisjZW5kaWYKKwlyZXR1cm4gKDApIDsKK30KKworLyoKKyAqCUJFR0lOX01BTlVBTF9FTlRSWShpbml0X2RyaXZlcl9mcGx1cykKKyAqCWluaXRfZHJpdmVyX2ZwbHVzKHNtYykKKyAqCisgKiBTZXRzIGhhcmR3YXJlIG1vZHVsIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhlIG1vZGUgcmVnaXN0ZXIgMgorICogKGUuZy4gdGhlIGJ5dGUgYWxpZ25tZW50IGZvciB0aGUgcmVjZWl2ZWQgZnJhbWVzLCB0aGUgcG9zaXRpb24gb2YgdGhlCisgKgkgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBldGMuKQorICoJRU5EX01BTlVBTF9FTlRSWQorICovCit2b2lkIGluaXRfZHJpdmVyX2ZwbHVzKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXNtYy0+aHcuZnAubWRyMmluaXQgPSBGTV9MU0IgfCBGTV9CTU1PREUgfCBGTV9FTk5QUlEgfCBGTV9FTkhTUlEgfCAzIDsKKworI2lmZGVmCVBDSQorCXNtYy0+aHcuZnAubWRyMmluaXQgfD0gRk1fQ0hLUEFSIHwgRk1fUEFSSVRZIDsKKyNlbmRpZgorCXNtYy0+aHcuZnAubWRyM2luaXQgPSBGTV9NRU5SUUFVTkxDSyB8IEZNX01FTlJTIDsKKworI2lmZGVmCVVTRV9DQU5fQUREUgorCS8qIGVuYWJsZSBhZGRyZXNzIGJpdCBzd2FwcGluZyAqLworCXNtYy0+aHcuZnAuZnJzZWxyZWdfaW5pdCA9IEZNX0VOWE1UQURTV0FQIHwgRk1fRU5SQ1ZBRFNXQVAgOworI2VuZGlmCit9CisKK3N0YXRpYyB1X2xvbmcgaW5pdF9kZXNjcl9yaW5nKHN0cnVjdCBzX3NtYyAqc21jLAorCQkJICAgICAgdW5pb24gc19mcF9kZXNjciB2b2xhdGlsZSAqc3RhcnQsCisJCQkgICAgICBpbnQgY291bnQpCit7CisJaW50IGkgOworCXVuaW9uIHNfZnBfZGVzY3Igdm9sYXRpbGUgKmQxIDsKKwl1bmlvbiBzX2ZwX2Rlc2NyIHZvbGF0aWxlICpkMiA7CisJdV9sb25nCXBoeXMgOworCisJREJfR0VOKCJkZXNjciByaW5nIHN0YXJ0cyBhdCA9ICV4ICIsKHZvaWQgKilzdGFydCwwLDMpIDsKKwlmb3IgKGk9Y291bnQtMSwgZDE9c3RhcnQ7IGkgOyBpLS0pIHsKKwkJZDIgPSBkMSA7CisJCWQxKysgOwkJLyogZGVzY3IgaXMgb3duZWQgYnkgdGhlIGhvc3QgKi8KKwkJZDItPnIucnhkX3JiY3RybCA9IEFJWF9SRVZFUlNFKEJNVV9DSEVDSykgOworCQlkMi0+ci5yeGRfbmV4dCA9ICZkMS0+ciA7CisJCXBoeXMgPSBtYWNfZHJ2X3ZpcnQycGh5cyhzbWMsKHZvaWQgKilkMSkgOworCQlkMi0+ci5yeGRfbnJkYWRyID0gQUlYX1JFVkVSU0UocGh5cykgOworCX0KKwlEQl9HRU4oImRlc2NyIHJpbmcgZW5kcyBhdCA9ICV4ICIsKHZvaWQgKilkMSwwLDMpIDsKKwlkMS0+ci5yeGRfcmJjdHJsID0gQUlYX1JFVkVSU0UoQk1VX0NIRUNLKSA7CisJZDEtPnIucnhkX25leHQgPSAmc3RhcnQtPnIgOworCXBoeXMgPSBtYWNfZHJ2X3ZpcnQycGh5cyhzbWMsKHZvaWQgKilzdGFydCkgOworCWQxLT5yLnJ4ZF9ucmRhZHIgPSBBSVhfUkVWRVJTRShwaHlzKSA7CisKKwlmb3IgKGk9Y291bnQsIGQxPXN0YXJ0OyBpIDsgaS0tKSB7CisJCURSVl9CVUZfRkxVU0goJmQxLT5yLERESV9ETUFfU1lOQ19GT1JERVYpIDsKKwkJZDErKzsKKwl9CisJcmV0dXJuKHBoeXMpIDsKK30KKworc3RhdGljIHZvaWQgaW5pdF90eGRfcmluZyhzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzdHJ1Y3Qgc19zbXRfZnBfdHhkIHZvbGF0aWxlICpkcyA7CisJc3RydWN0IHNfc210X3R4X3F1ZXVlICpxdWV1ZSA7CisJdV9sb25nCXBoeXMgOworCisJLyoKKwkgKiBpbml0aWFsaXplIHRoZSB0cmFuc21pdCBkZXNjcmlwdG9ycworCSAqLworCWRzID0gKHN0cnVjdCBzX3NtdF9mcF90eGQgdm9sYXRpbGUgKikgKChjaGFyICopc21jLT5vcy5od20uZGVzY3JfcCArCisJCVNNVF9SMV9SWERfQ09VTlQqc2l6ZW9mKHN0cnVjdCBzX3NtdF9mcF9yeGQpKSA7CisJcXVldWUgPSBzbWMtPmh3LmZwLnR4W1FVRVVFX0EwXSA7CisJREJfR0VOKCJJbml0IGFzeW5jIFR4RCByaW5nLCAlZCBUeERzICIsSFdNX0FTWU5DX1RYRF9DT1VOVCwwLDMpIDsKKwkodm9pZClpbml0X2Rlc2NyX3Jpbmcoc21jLCh1bmlvbiBzX2ZwX2Rlc2NyIHZvbGF0aWxlICopZHMsCisJCUhXTV9BU1lOQ19UWERfQ09VTlQpIDsKKwlwaHlzID0gQUlYX1JFVkVSU0UoZHMtPnR4ZF9udGRhZHIpIDsKKwlkcysrIDsKKwlxdWV1ZS0+dHhfY3Vycl9wdXQgPSBxdWV1ZS0+dHhfY3Vycl9nZXQgPSBkcyA7CisJZHMtLSA7CisJcXVldWUtPnR4X2ZyZWUgPSBIV01fQVNZTkNfVFhEX0NPVU5UIDsKKwlxdWV1ZS0+dHhfdXNlZCA9IDAgOworCW91dHBkKEFERFIoQjVfWEFfREEpLHBoeXMpIDsKKworCWRzID0gKHN0cnVjdCBzX3NtdF9mcF90eGQgdm9sYXRpbGUgKikgKChjaGFyICopZHMgKworCQlIV01fQVNZTkNfVFhEX0NPVU5UKnNpemVvZihzdHJ1Y3Qgc19zbXRfZnBfdHhkKSkgOworCXF1ZXVlID0gc21jLT5ody5mcC50eFtRVUVVRV9TXSA7CisJREJfR0VOKCJJbml0IHN5bmMgVHhEIHJpbmcsICVkIFR4RHMgIixIV01fU1lOQ19UWERfQ09VTlQsMCwzKSA7CisJKHZvaWQpaW5pdF9kZXNjcl9yaW5nKHNtYywodW5pb24gc19mcF9kZXNjciB2b2xhdGlsZSAqKWRzLAorCQlIV01fU1lOQ19UWERfQ09VTlQpIDsKKwlwaHlzID0gQUlYX1JFVkVSU0UoZHMtPnR4ZF9udGRhZHIpIDsKKwlkcysrIDsKKwlxdWV1ZS0+dHhfY3Vycl9wdXQgPSBxdWV1ZS0+dHhfY3Vycl9nZXQgPSBkcyA7CisJcXVldWUtPnR4X2ZyZWUgPSBIV01fU1lOQ19UWERfQ09VTlQgOworCXF1ZXVlLT50eF91c2VkID0gMCA7CisJb3V0cGQoQUREUihCNV9YU19EQSkscGh5cykgOworfQorCitzdGF0aWMgdm9pZCBpbml0X3J4ZF9yaW5nKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXN0cnVjdCBzX3NtdF9mcF9yeGQgdm9sYXRpbGUgKmRzIDsKKwlzdHJ1Y3Qgc19zbXRfcnhfcXVldWUgKnF1ZXVlIDsKKwl1X2xvbmcJcGh5cyA7CisKKwkvKgorCSAqIGluaXRpYWxpemUgdGhlIHJlY2VpdmUgZGVzY3JpcHRvcnMKKwkgKi8KKwlkcyA9IChzdHJ1Y3Qgc19zbXRfZnBfcnhkIHZvbGF0aWxlICopIHNtYy0+b3MuaHdtLmRlc2NyX3AgOworCXF1ZXVlID0gc21jLT5ody5mcC5yeFtRVUVVRV9SMV0gOworCURCX0dFTigiSW5pdCBSeEQgcmluZywgJWQgUnhEcyAiLFNNVF9SMV9SWERfQ09VTlQsMCwzKSA7CisJKHZvaWQpaW5pdF9kZXNjcl9yaW5nKHNtYywodW5pb24gc19mcF9kZXNjciB2b2xhdGlsZSAqKWRzLAorCQlTTVRfUjFfUlhEX0NPVU5UKSA7CisJcGh5cyA9IEFJWF9SRVZFUlNFKGRzLT5yeGRfbnJkYWRyKSA7CisJZHMrKyA7CisJcXVldWUtPnJ4X2N1cnJfcHV0ID0gcXVldWUtPnJ4X2N1cnJfZ2V0ID0gZHMgOworCXF1ZXVlLT5yeF9mcmVlID0gU01UX1IxX1JYRF9DT1VOVCA7CisJcXVldWUtPnJ4X3VzZWQgPSAwIDsKKwlvdXRwZChBRERSKEI0X1IxX0RBKSxwaHlzKSA7Cit9CisKKy8qCisgKglCRUdJTl9NQU5VQUxfRU5UUlkoaW5pdF9mZGRpX2RyaXZlcikKKyAqCXZvaWQgaW5pdF9mZGRpX2RyaXZlcihzbWMsbWFjX2FkZHIpCisgKgorICogaW5pdGlhbGl6ZXMgdGhlIGRyaXZlciBhbmQgaXQncyB2YXJpYWJsZXMKKyAqCisgKglFTkRfTUFOVUFMX0VOVFJZCisgKi8KK3ZvaWQgaW5pdF9mZGRpX2RyaXZlcihzdHJ1Y3Qgc19zbWMgKnNtYywgdV9jaGFyICptYWNfYWRkcikKK3sKKwlTTWJ1ZgkqbWIgOworCWludAlpIDsKKworCWluaXRfYm9hcmQoc21jLG1hY19hZGRyKSA7CisJKHZvaWQpaW5pdF9mcGx1cyhzbWMpIDsKKworCS8qCisJICogaW5pdGlhbGl6ZSB0aGUgU01idWZzIGZvciB0aGUgU01UCisJICovCisjaWZuZGVmCUNPTU1PTl9NQl9QT09MCisJbWIgPSBzbWMtPm9zLmh3bS5tYnVmX3Bvb2wubWJfc3RhcnQgOworCXNtYy0+b3MuaHdtLm1idWZfcG9vbC5tYl9mcmVlID0gKFNNYnVmICopTlVMTCA7CisJZm9yIChpID0gMDsgaSA8IE1BWF9NQlVGOyBpKyspIHsKKwkJbWItPnNtX3VzZV9jb3VudCA9IDEgOworCQlzbXRfZnJlZV9tYnVmKHNtYyxtYikJOworCQltYisrIDsKKwl9CisjZWxzZQorCW1iID0gbWJfc3RhcnQgOworCWlmICghbWJfaW5pdCkgeworCQltYl9mcmVlID0gMCA7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfTUJVRjsgaSsrKSB7CisJCQltYi0+c21fdXNlX2NvdW50ID0gMSA7CisJCQlzbXRfZnJlZV9tYnVmKHNtYyxtYikJOworCQkJbWIrKyA7CisJCX0KKwkJbWJfaW5pdCA9IFRSVUUgOworCX0KKyNlbmRpZgorCisJLyoKKwkgKiBpbml0aWFsaXplIHRoZSBvdGhlciB2YXJpYWJsZXMKKwkgKi8KKwlzbWMtPm9zLmh3bS5sbGNfcnhfcGlwZSA9IHNtYy0+b3MuaHdtLmxsY19yeF90YWlsID0gKFNNYnVmICopTlVMTCA7CisJc21jLT5vcy5od20udHhkX3R4X3BpcGUgPSBzbWMtPm9zLmh3bS50eGRfdHhfdGFpbCA9IE5VTEwgOworCXNtYy0+b3MuaHdtLnBhc3NfU01UID0gc21jLT5vcy5od20ucGFzc19OU0EgPSBzbWMtPm9zLmh3bS5wYXNzX0RCID0gMCA7CisJc21jLT5vcy5od20ucGFzc19sbGNfcHJvbWlzYyA9IFRSVUUgOworCXNtYy0+b3MuaHdtLnF1ZXVlZF9yeF9mcmFtZXMgPSBzbWMtPm9zLmh3bS5xdWV1ZWRfdHhkX21iID0gMCA7CisJc21jLT5vcy5od20uZGV0ZWNfY291bnQgPSAwIDsKKwlzbWMtPm9zLmh3bS5yeF9icmVhayA9IDAgOworCXNtYy0+b3MuaHdtLnJ4X2xlbl9lcnJvciA9IDAgOworCXNtYy0+b3MuaHdtLmlzcl9mbGFnID0gRkFMU0UgOworCisJLyoKKwkgKiBtYWtlIHN1cmUgdGhhdCB0aGUgc3RhcnQgcG9pbnRlciBpcyAxNiBieXRlIGFsaWduZWQKKwkgKi8KKwlpID0gMTYgLSAoKGxvbmcpc21jLT5vcy5od20uZGVzY3JfcCAmIDB4ZikgOworCWlmIChpICE9IDE2KSB7CisJCURCX0dFTigiaSA9ICVkIixpLDAsMykgOworCQlzbWMtPm9zLmh3bS5kZXNjcl9wID0gKHVuaW9uIHNfZnBfZGVzY3Igdm9sYXRpbGUgKikKKwkJCSgoY2hhciAqKXNtYy0+b3MuaHdtLmRlc2NyX3AraSkgOworCX0KKwlEQl9HRU4oInB0IHRvIGRlc2NyIGFyZWEgPSAleCIsKHZvaWQgKilzbWMtPm9zLmh3bS5kZXNjcl9wLDAsMykgOworCisJaW5pdF90eGRfcmluZyhzbWMpIDsKKwlpbml0X3J4ZF9yaW5nKHNtYykgOworCW1hY19kcnZfZmlsbF9yeGQoc21jKSA7CisKKwlpbml0X3BsYyhzbWMpIDsKK30KKworCitTTWJ1ZiAqc210X2dldF9tYnVmKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXJlZ2lzdGVyIFNNYnVmCSptYiA7CisKKyNpZm5kZWYJQ09NTU9OX01CX1BPT0wKKwltYiA9IHNtYy0+b3MuaHdtLm1idWZfcG9vbC5tYl9mcmVlIDsKKyNlbHNlCisJbWIgPSBtYl9mcmVlIDsKKyNlbmRpZgorCWlmIChtYikgeworI2lmbmRlZglDT01NT05fTUJfUE9PTAorCQlzbWMtPm9zLmh3bS5tYnVmX3Bvb2wubWJfZnJlZSA9IG1iLT5zbV9uZXh0IDsKKyNlbHNlCisJCW1iX2ZyZWUgPSBtYi0+c21fbmV4dCA7CisjZW5kaWYKKwkJbWItPnNtX29mZiA9IDggOworCQltYi0+c21fdXNlX2NvdW50ID0gMSA7CisJfQorCURCX0dFTigiZ2V0IFNNYnVmOiBtYiA9ICV4Iiwodm9pZCAqKW1iLDAsMykgOworCXJldHVybiAobWIpIDsJLyogTWF5IGJlIE5VTEwgKi8KK30KKwordm9pZCBzbXRfZnJlZV9tYnVmKHN0cnVjdCBzX3NtYyAqc21jLCBTTWJ1ZiAqbWIpCit7CisKKwlpZiAobWIpIHsKKwkJbWItPnNtX3VzZV9jb3VudC0tIDsKKwkJREJfR0VOKCJmcmVlX21idWY6IHNtX3VzZV9jb3VudCA9ICVkIixtYi0+c21fdXNlX2NvdW50LDAsMykgOworCQkvKgorCQkgKiBJZiB0aGUgdXNlX2NvdW50IGlzICE9IHplcm8gdGhlIE1CdWYgaXMgcXVldWVkCisJCSAqIG1vcmUgdGhhbiBvbmNlIGFuZCBtdXN0IG5vdCBxdWV1ZWQgaW50byB0aGUKKwkJICogZnJlZSBNQnVmIHF1ZXVlCisJCSAqLworCQlpZiAoIW1iLT5zbV91c2VfY291bnQpIHsKKwkJCURCX0dFTigiZnJlZSBTTWJ1ZjogbWIgPSAleCIsKHZvaWQgKiltYiwwLDMpIDsKKyNpZm5kZWYJQ09NTU9OX01CX1BPT0wKKwkJCW1iLT5zbV9uZXh0ID0gc21jLT5vcy5od20ubWJ1Zl9wb29sLm1iX2ZyZWUgOworCQkJc21jLT5vcy5od20ubWJ1Zl9wb29sLm1iX2ZyZWUgPSBtYiA7CisjZWxzZQorCQkJbWItPnNtX25leHQgPSBtYl9mcmVlIDsKKwkJCW1iX2ZyZWUgPSBtYiA7CisjZW5kaWYKKwkJfQorCX0KKwllbHNlCisJCVNNVF9QQU5JQyhzbWMsSFdNX0UwMDAzLEhXTV9FMDAwM19NU0cpIDsKK30KKworCisvKgorICoJQkVHSU5fTUFOVUFMX0VOVFJZKG1hY19kcnZfcmVwYWlyX2Rlc2NyKQorICoJdm9pZCBtYWNfZHJ2X3JlcGFpcl9kZXNjcihzbWMpCisgKgorICogZnVuY3Rpb24JY2FsbGVkIGZyb20gU01UCShIV00gLyBod210bS5jKQorICoJCVRoZSBCTVUgaXMgaWRsZSB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorICoJCU1hY19kcnZfcmVwYWlyX2Rlc2NyIHNldHMgdXAgdGhlIHBoeXNpY2FsIGFkZHJlc3MKKyAqCQlmb3IgYWxsIHJlY2VpdmUgYW5kIHRyYW5zbWl0IHF1ZXVlcyB3aGVyZSB0aGUgQk1VCisgKgkJc2hvdWxkIGNvbnRpbnVlLgorICoJCUl0IG1heSBiZSB0aGF0IHRoZSBCTVUgd2FzIHJlc2V0ZWQgZHVyaW5nIGEgZnJhZ21lbnRlZAorICoJCXRyYW5zZmVyLiBJbiB0aGlzIGNhc2UgdGhlcmUgYXJlIHNvbWUgZnJhZ21lbnRzIHdoaWNoIHdpbGwKKyAqCQluZXZlciBjb21wbGV0ZWQgYnkgdGhlIEJNVS4gVGhlIE9XTiBiaXQgb2YgdGhpcyBmcmFnbWVudHMKKyAqCQltdXN0IGJlIHN3aXRjaGVkIHRvIGJlIG93bmVkIGJ5IHRoZSBob3N0LgorICoKKyAqCQlHaXZlIGEgc3RhcnQgY29tbWFuZCB0byB0aGUgcmVjZWl2ZSBCTVUuCisgKgkJU3RhcnQgdGhlIHRyYW5zbWl0IEJNVXMgaWYgdHJhbnNtaXQgZnJhbWVzIHBlbmRpbmcuCisgKgorICoJRU5EX01BTlVBTF9FTlRSWQorICovCit2b2lkIG1hY19kcnZfcmVwYWlyX2Rlc2NyKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXVfbG9uZwlwaHlzIDsKKworCWlmIChzbWMtPmh3Lmh3X3N0YXRlICE9IFNUT1BQRUQpIHsKKwkJU0tfQlJFQUsoKSA7CisJCVNNVF9QQU5JQyhzbWMsSFdNX0UwMDEzLEhXTV9FMDAxM19NU0cpIDsKKwkJcmV0dXJuIDsKKwl9CisKKwkvKgorCSAqIHJlcGFpciB0eCBxdWV1ZXM6IGRvbid0IHN0YXJ0CisJICovCisJcGh5cyA9IHJlcGFpcl90eGRfcmluZyhzbWMsc21jLT5ody5mcC50eFtRVUVVRV9BMF0pIDsKKwlvdXRwZChBRERSKEI1X1hBX0RBKSxwaHlzKSA7CisJaWYgKHNtYy0+aHcuZnAudHhfcVtRVUVVRV9BMF0udHhfdXNlZCkgeworCQlvdXRwZChBRERSKEIwX1hBX0NTUiksQ1NSX1NUQVJUKSA7CisJfQorCXBoeXMgPSByZXBhaXJfdHhkX3Jpbmcoc21jLHNtYy0+aHcuZnAudHhbUVVFVUVfU10pIDsKKwlvdXRwZChBRERSKEI1X1hTX0RBKSxwaHlzKSA7CisJaWYgKHNtYy0+aHcuZnAudHhfcVtRVUVVRV9TXS50eF91c2VkKSB7CisJCW91dHBkKEFERFIoQjBfWFNfQ1NSKSxDU1JfU1RBUlQpIDsKKwl9CisKKwkvKgorCSAqIHJlcGFpciByeCBxdWV1ZXMKKwkgKi8KKwlwaHlzID0gcmVwYWlyX3J4ZF9yaW5nKHNtYyxzbWMtPmh3LmZwLnJ4W1FVRVVFX1IxXSkgOworCW91dHBkKEFERFIoQjRfUjFfREEpLHBoeXMpIDsKKwlvdXRwZChBRERSKEIwX1IxX0NTUiksQ1NSX1NUQVJUKSA7Cit9CisKK3N0YXRpYyB1X2xvbmcgcmVwYWlyX3R4ZF9yaW5nKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc19zbXRfdHhfcXVldWUgKnF1ZXVlKQoreworCWludCBpIDsKKwlpbnQgdHhfdXNlZCA7CisJdV9sb25nIHBoeXMgOworCXVfbG9uZyB0YmN0cmwgOworCXN0cnVjdCBzX3NtdF9mcF90eGQgdm9sYXRpbGUgKnQgOworCisJU0tfVU5VU0VEKHNtYykgOworCisJdCA9IHF1ZXVlLT50eF9jdXJyX2dldCA7CisJdHhfdXNlZCA9IHF1ZXVlLT50eF91c2VkIDsKKwlmb3IgKGkgPSB0eF91c2VkK3F1ZXVlLT50eF9mcmVlLTEgOyBpIDsgaS0tICkgeworCQl0ID0gdC0+dHhkX25leHQgOworCX0KKwlwaHlzID0gQUlYX1JFVkVSU0UodC0+dHhkX250ZGFkcikgOworCisJdCA9IHF1ZXVlLT50eF9jdXJyX2dldCA7CisJd2hpbGUgKHR4X3VzZWQpIHsKKwkJRFJWX0JVRl9GTFVTSCh0LERESV9ETUFfU1lOQ19GT1JDUFUpIDsKKwkJdGJjdHJsID0gQUlYX1JFVkVSU0UodC0+dHhkX3RiY3RybCkgOworCisJCWlmICh0YmN0cmwgJiBCTVVfT1dOKSB7CisJCQlpZiAodGJjdHJsICYgQk1VX1NURikgeworCQkJCWJyZWFrIDsJCS8qIGV4aXQgdGhlIGxvb3AgKi8KKwkJCX0KKwkJCWVsc2UgeworCQkJCS8qCisJCQkJICogcmVwYWlyIHRoZSBkZXNjcmlwdG9yCisJCQkJICovCisJCQkJdC0+dHhkX3RiY3RybCAmPSBBSVhfUkVWRVJTRSh+Qk1VX09XTikgOworCQkJfQorCQl9CisJCXBoeXMgPSBBSVhfUkVWRVJTRSh0LT50eGRfbnRkYWRyKSA7CisJCURSVl9CVUZfRkxVU0godCxERElfRE1BX1NZTkNfRk9SREVWKSA7CisJCXQgPSB0LT50eGRfbmV4dCA7CisJCXR4X3VzZWQtLSA7CisJfQorCXJldHVybihwaHlzKSA7Cit9CisKKy8qCisgKiBSZXBhaXJzIHRoZSByZWNlaXZlIGRlc2NyaXB0b3IgcmluZyBhbmQgcmV0dXJucyB0aGUgcGh5c2ljYWwgYWRkcmVzcworICogd2hlcmUgdGhlIEJNVSBzaG91bGQgY29udGludWUgd29ya2luZy4KKyAqCisgKglvIFRoZSBwaHlzaWNhbCBhZGRyZXNzIHdoZXJlIHRoZSBCTVUgd2FzIHN0b3BwZWQgaGFzIHRvIGJlCisgKgkgIGRldGVybWluZWQuIFRoaXMgaXMgdGhlIG5leHQgUnhEIGFmdGVyIHJ4X2N1cnJfZ2V0IHdpdGggYW4gT1dOCisgKgkgIGJpdCBzZXQuCisgKglvIFRoZSBCTVUgc2hvdWxkIHN0YXJ0IHdvcmtpbmcgYXQgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGZyYW1lLgorICoJICBSeERzIHdpdGggYW4gT1dOIGJpdCBzZXQgYnV0IHdpdGggYSByZXNldCBTVEYgYml0IHNob3VsZCBiZQorICoJICBza2lwcGVkIGFuZCBvd25lZCBieSB0aGUgZHJpdmVyIChPV04gPSAwKS4gCisgKi8KK3N0YXRpYyB1X2xvbmcgcmVwYWlyX3J4ZF9yaW5nKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc19zbXRfcnhfcXVldWUgKnF1ZXVlKQoreworCWludCBpIDsKKwlpbnQgcnhfdXNlZCA7CisJdV9sb25nIHBoeXMgOworCXVfbG9uZyByYmN0cmwgOworCXN0cnVjdCBzX3NtdF9mcF9yeGQgdm9sYXRpbGUgKnIgOworCisJU0tfVU5VU0VEKHNtYykgOworCisJciA9IHF1ZXVlLT5yeF9jdXJyX2dldCA7CisJcnhfdXNlZCA9IHF1ZXVlLT5yeF91c2VkIDsKKwlmb3IgKGkgPSBTTVRfUjFfUlhEX0NPVU5ULTEgOyBpIDsgaS0tICkgeworCQlyID0gci0+cnhkX25leHQgOworCX0KKwlwaHlzID0gQUlYX1JFVkVSU0Uoci0+cnhkX25yZGFkcikgOworCisJciA9IHF1ZXVlLT5yeF9jdXJyX2dldCA7CisJd2hpbGUgKHJ4X3VzZWQpIHsKKwkJRFJWX0JVRl9GTFVTSChyLERESV9ETUFfU1lOQ19GT1JDUFUpIDsKKwkJcmJjdHJsID0gQUlYX1JFVkVSU0Uoci0+cnhkX3JiY3RybCkgOworCisJCWlmIChyYmN0cmwgJiBCTVVfT1dOKSB7CisJCQlpZiAocmJjdHJsICYgQk1VX1NURikgeworCQkJCWJyZWFrIDsJCS8qIGV4aXQgdGhlIGxvb3AgKi8KKwkJCX0KKwkJCWVsc2UgeworCQkJCS8qCisJCQkJICogcmVwYWlyIHRoZSBkZXNjcmlwdG9yCisJCQkJICovCisJCQkJci0+cnhkX3JiY3RybCAmPSBBSVhfUkVWRVJTRSh+Qk1VX09XTikgOworCQkJfQorCQl9CisJCXBoeXMgPSBBSVhfUkVWRVJTRShyLT5yeGRfbnJkYWRyKSA7CisJCURSVl9CVUZfRkxVU0gocixERElfRE1BX1NZTkNfRk9SREVWKSA7CisJCXIgPSByLT5yeGRfbmV4dCA7CisJCXJ4X3VzZWQtLSA7CisJfQorCXJldHVybihwaHlzKSA7Cit9CisKKworLyoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJSU5URVJSVVBUIFNFUlZJQ0UgUk9VVElORToKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvKgorICoJQkVHSU5fTUFOVUFMX0VOVFJZKGZkZGlfaXNyKQorICoJdm9pZCBmZGRpX2lzcihzbWMpCisgKgorICogZnVuY3Rpb24JRE9XTkNBTEwJKGRydnNyLmMpCisgKgkJaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSwgaGFuZGxlcyB0aGUgaW50ZXJydXB0IHJlcXVlc3RzCisgKgkJZ2VuZXJhdGVkIGJ5IHRoZSBGRERJIGFkYXB0ZXIuCisgKgorICogTk9URToJVGhlIG9wZXJhdGluZyBzeXN0ZW0gZGVwZW5kZW50IG1vZHVsZSBtdXN0IGdhcmFudGVlIHRoYXQgdGhlCisgKgkJaW50ZXJydXB0cyBvZiB0aGUgYWRhcHRlciBhcmUgZGlzYWJsZWQgd2hlbiBpdCBjYWxscyBmZGRpX2lzci4KKyAqCisgKglBYm91dCB0aGUgVVNFX0JSRUFLX0lTUiBtZWNoYW5pc21uOgorICoKKyAqCVRoZSBtYWluIHJlcXVpcmVtZW50IG9mIHRoaXMgbWVjaGFuaXNtbiBpcyB0byBmb3JjZSBhbiB0aW1lciBJUlEgd2hlbgorICoJbGVhdmluZyBwcm9jZXNzX3JlY2VpdmUoKSB3aXRoIGxlYXZlX2lzciBzZXQuIHByb2Nlc3NfcmVjZWl2ZSgpIG1heQorICoJYmUgY2FsbGVkIGF0IGFueSB0aW1lIGZyb20gYW55d2hlcmUhCisgKglUbyBiZSBzdXJlIHdlIGRvbid0IG1pc3Mgc3VjaCBldmVudCB3ZSBzZXQgJ2ZvcmNlX2lycScgcGVyIGRlZmF1bHQuCisgKglXZSBoYXZlIHRvIGZvcmNlIGFuZCBUaW1lciBJUlEgaWYgJ3NtYy0+b3MuaHdtLmxlYXZlX2lzcicgQU5ECisgKgknZm9yY2VfaXJxJyBhcmUgc2V0LiAnZm9yY2VfaXJxJyBtYXkgYmUgcmVzZXQgaWYgYSByZWNlaXZlIGNvbXBsZXRlCisgKglJUlEgaXMgcGVuZGluZy4KKyAqCisgKglFTkRfTUFOVUFMX0VOVFJZCisgKi8KK3ZvaWQgZmRkaV9pc3Ioc3RydWN0IHNfc21jICpzbWMpCit7CisJdV9sb25nCQlpcyA7CQkvKiBJU1Igc291cmNlICovCisJdV9zaG9ydAkJc3R1LCBzdGwgOworCVNNYnVmCQkqbWIgOworCisjaWZkZWYJVVNFX0JSRUFLX0lTUgorCWludAlmb3JjZV9pcnEgOworI2VuZGlmCisKKyNpZmRlZglPREkyCisJaWYgKHNtYy0+b3MuaHdtLnJ4X2JyZWFrKSB7CisJCW1hY19kcnZfZmlsbF9yeGQoc21jKSA7CisJCWlmIChzbWMtPmh3LmZwLnJ4X3FbUVVFVUVfUjFdLnJ4X3VzZWQgPiAwKSB7CisJCQlzbWMtPm9zLmh3bS5yeF9icmVhayA9IDAgOworCQkJcHJvY2Vzc19yZWNlaXZlKHNtYykgOworCQl9CisJCWVsc2UgeworCQkJc21jLT5vcy5od20uZGV0ZWNfY291bnQgPSAwIDsKKwkJCXNtdF9mb3JjZV9pcnEoc21jKSA7CisJCX0KKwl9CisjZW5kaWYKKwlzbWMtPm9zLmh3bS5pc3JfZmxhZyA9IFRSVUUgOworCisjaWZkZWYJVVNFX0JSRUFLX0lTUgorCWZvcmNlX2lycSA9IFRSVUUgOworCWlmIChzbWMtPm9zLmh3bS5sZWF2ZV9pc3IpIHsKKwkJc21jLT5vcy5od20ubGVhdmVfaXNyID0gRkFMU0UgOworCQlwcm9jZXNzX3JlY2VpdmUoc21jKSA7CisJfQorI2VuZGlmCisKKwl3aGlsZSAoKGlzID0gR0VUX0lTUigpICYgSVNSX01BU0spKSB7CisJCU5ERF9UUkFDRSgiQ0gwQiIsaXMsMCwwKSA7CisJCURCX0dFTigiSVNBID0gMHgleCIsaXMsMCw3KSA7CisKKwkJaWYgKGlzICYgSU1BU0tfU0xPVykgeworCQkJTkREX1RSQUNFKCJDSDFiIixpcywwLDApIDsKKwkJCWlmIChpcyAmIElTX1BMSU5UMSkgewkvKiBQTEMxICovCisJCQkJcGxjMV9pcnEoc21jKSA7CisJCQl9CisJCQlpZiAoaXMgJiBJU19QTElOVDIpIHsJLyogUExDMiAqLworCQkJCXBsYzJfaXJxKHNtYykgOworCQkJfQorCQkJaWYgKGlzICYgSVNfTUlOVFIxKSB7CS8qIEZPUk1BQysgU1RVMShVL0wpICovCisJCQkJc3R1ID0gaW5wdyhGTV9BKEZNX1NUMVUpKSA7CisJCQkJc3RsID0gaW5wdyhGTV9BKEZNX1NUMUwpKSA7CisJCQkJREJfR0VOKCJTbG93IHRyYW5zbWl0IGNvbXBsZXRlIiwwLDAsNikgOworCQkJCW1hYzFfaXJxKHNtYyxzdHUsc3RsKSA7CisJCQl9CisJCQlpZiAoaXMgJiBJU19NSU5UUjIpIHsJLyogRk9STUFDKyBTVFUyKFUvTCkgKi8KKwkJCQlzdHU9IGlucHcoRk1fQShGTV9TVDJVKSkgOworCQkJCXN0bD0gaW5wdyhGTV9BKEZNX1NUMkwpKSA7CisJCQkJREJfR0VOKCJTbG93IHJlY2VpdmUgY29tcGxldGUiLDAsMCw2KSA7CisJCQkJREJfR0VOKCJzdGwgPSAleCA6IHN0dSA9ICV4IixzdGwsc3R1LDcpIDsKKwkJCQltYWMyX2lycShzbWMsc3R1LHN0bCkgOworCQkJfQorCQkJaWYgKGlzICYgSVNfTUlOVFIzKSB7CS8qIEZPUk1BQysgU1RVMyhVL0wpICovCisJCQkJc3R1PSBpbnB3KEZNX0EoRk1fU1QzVSkpIDsKKwkJCQlzdGw9IGlucHcoRk1fQShGTV9TVDNMKSkgOworCQkJCURCX0dFTigiRk9STUFDIE1vZGUgUmVnaXN0ZXIgMyIsMCwwLDYpIDsKKwkJCQltYWMzX2lycShzbWMsc3R1LHN0bCkgOworCQkJfQorCQkJaWYgKGlzICYgSVNfVElNSU5UKSB7CS8qIFRpbWVyIDgyQzU0LTIgKi8KKwkJCQl0aW1lcl9pcnEoc21jKSA7CisjaWZkZWYJTkRJU19PUzIKKwkJCQlmb3JjZV9pcnFfcGVuZGluZyA9IDAgOworI2VuZGlmCisJCQkJLyoKKwkJCQkgKiBvdXQgb2YgUnhEIGRldGVjdGlvbgorCQkJCSAqLworCQkJCWlmICgrK3NtYy0+b3MuaHdtLmRldGVjX2NvdW50ID4gNCkgeworCQkJCQkvKgorCQkJCQkgKiBjaGVjayBvdXQgb2YgUnhEIGNvbmRpdGlvbgorCQkJCQkgKi8KKwkJCQkJIHByb2Nlc3NfcmVjZWl2ZShzbWMpIDsKKwkJCQl9CisJCQl9CisJCQlpZiAoaXMgJiBJU19UT0tFTikgewkvKiBSZXN0cmljdGVkIFRva2VuIE1vbml0b3IgKi8KKwkJCQlydG1faXJxKHNtYykgOworCQkJfQorCQkJaWYgKGlzICYgSVNfUjFfUCkgewkvKiBQYXJpdHkgZXJyb3IgcnggcXVldWUgMSAqLworCQkJCS8qIGNsZWFyIElSUSAqLworCQkJCW91dHBkKEFERFIoQjRfUjFfQ1NSKSxDU1JfSVJRX0NMX1ApIDsKKwkJCQlTTVRfUEFOSUMoc21jLEhXTV9FMDAwNCxIV01fRTAwMDRfTVNHKSA7CisJCQl9CisJCQlpZiAoaXMgJiBJU19SMV9DKSB7CS8qIEVuY29kaW5nIGVycm9yIHJ4IHF1ZXVlIDEgKi8KKwkJCQkvKiBjbGVhciBJUlEgKi8KKwkJCQlvdXRwZChBRERSKEI0X1IxX0NTUiksQ1NSX0lSUV9DTF9DKSA7CisJCQkJU01UX1BBTklDKHNtYyxIV01fRTAwMDUsSFdNX0UwMDA1X01TRykgOworCQkJfQorCQkJaWYgKGlzICYgSVNfWEFfQykgewkvKiBFbmNvZGluZyBlcnJvciBhc3luYyB0eCBxICovCisJCQkJLyogY2xlYXIgSVJRICovCisJCQkJb3V0cGQoQUREUihCNV9YQV9DU1IpLENTUl9JUlFfQ0xfQykgOworCQkJCVNNVF9QQU5JQyhzbWMsSFdNX0UwMDA2LEhXTV9FMDAwNl9NU0cpIDsKKwkJCX0KKwkJCWlmIChpcyAmIElTX1hTX0MpIHsJLyogRW5jb2RpbmcgZXJyb3Igc3luYyB0eCBxICovCisJCQkJLyogY2xlYXIgSVJRICovCisJCQkJb3V0cGQoQUREUihCNV9YU19DU1IpLENTUl9JUlFfQ0xfQykgOworCQkJCVNNVF9QQU5JQyhzbWMsSFdNX0UwMDA3LEhXTV9FMDAwN19NU0cpIDsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqCUZhc3QgVHggY29tcGxldGUgQXN5bmMvU3luYyBRdWV1ZSAoQk1VIHNlcnZpY2UpCisJCSAqLworCQlpZiAoaXMgJiAoSVNfWFNfRnxJU19YQV9GKSkgeworCQkJREJfR0VOKCJGYXN0IHR4IGNvbXBsZXRlIHF1ZXVlIiwwLDAsNikgOworCQkJLyoKKwkJCSAqIGNsZWFyIElSUSwgTm90ZTogbm8gSVJRIGlzIGxvc3QsIGJlY2F1c2UKKwkJCSAqIAl3ZSBhbHdheXMgc2VydmljZSBib3RoIHF1ZXVlcworCQkJICovCisJCQlvdXRwZChBRERSKEI1X1hTX0NTUiksQ1NSX0lSUV9DTF9GKSA7CisJCQlvdXRwZChBRERSKEI1X1hBX0NTUiksQ1NSX0lSUV9DTF9GKSA7CisJCQltYWNfZHJ2X2NsZWFyX3R4ZChzbWMpIDsKKwkJCWxsY19yZXN0YXJ0X3R4KHNtYykgOworCQl9CisKKwkJLyoKKwkJICoJRmFzdCBSeCBDb21wbGV0ZSAoQk1VIHNlcnZpY2UpCisJCSAqLworCQlpZiAoaXMgJiBJU19SMV9GKSB7CisJCQlEQl9HRU4oIkZhc3QgcmVjZWl2ZSBjb21wbGV0ZSIsMCwwLDYpIDsKKwkJCS8qIGNsZWFyIElSUSAqLworI2lmbmRlZiBVU0VfQlJFQUtfSVNSCisJCQlvdXRwZChBRERSKEI0X1IxX0NTUiksQ1NSX0lSUV9DTF9GKSA7CisJCQlwcm9jZXNzX3JlY2VpdmUoc21jKSA7CisjZWxzZQorCQkJcHJvY2Vzc19yZWNlaXZlKHNtYykgOworCQkJaWYgKHNtYy0+b3MuaHdtLmxlYXZlX2lzcikgeworCQkJCWZvcmNlX2lycSA9IEZBTFNFIDsKKwkJCX0gZWxzZSB7CisJCQkJb3V0cGQoQUREUihCNF9SMV9DU1IpLENTUl9JUlFfQ0xfRikgOworCQkJCXByb2Nlc3NfcmVjZWl2ZShzbWMpIDsKKwkJCX0KKyNlbmRpZgorCQl9CisKKyNpZm5kZWYJTkRJU19PUzIKKwkJd2hpbGUgKChtYiA9IGdldF9sbGNfcngoc21jKSkpIHsKKwkJCXNtdF90b19sbGMoc21jLG1iKSA7CisJCX0KKyNlbHNlCisJCWlmIChvZmZEZXB0aCkKKwkJCXBvc3RfcHJvYygpIDsKKworCQl3aGlsZSAoIW9mZkRlcHRoICYmIChtYiA9IGdldF9sbGNfcngoc21jKSkpIHsKKwkJCXNtdF90b19sbGMoc21jLG1iKSA7CisJCX0KKworCQlpZiAoIW9mZkRlcHRoICYmIHNtYy0+b3MuaHdtLnJ4X2JyZWFrKSB7CisJCQlwcm9jZXNzX3JlY2VpdmUoc21jKSA7CisJCX0KKyNlbmRpZgorCQlpZiAoc21jLT5xLmV2X2dldCAhPSBzbWMtPnEuZXZfcHV0KSB7CisJCQlORERfVFJBQ0UoIkNIMmEiLDAsMCwwKSA7CisJCQlldl9kaXNwYXRjaGVyKHNtYykgOworCQl9CisjaWZkZWYJTkRJU19PUzIKKwkJcG9zdF9wcm9jKCkgOworCQlpZiAob2ZmRGVwdGgpIHsJCS8qIGxlYXZlIGZkZGlfaXNyIGJlY2F1c2UgKi8KKwkJCWJyZWFrIDsJCS8qIGluZGljYXRpb25zIG5vdCBhbGxvd2VkICovCisJCX0KKyNlbmRpZgorI2lmZGVmCVVTRV9CUkVBS19JU1IKKwkJaWYgKHNtYy0+b3MuaHdtLmxlYXZlX2lzcikgeworCQkJYnJlYWsgOwkJLyogbGVhdmUgZmRkaV9pc3IgKi8KKwkJfQorI2VuZGlmCisKKwkJLyogTk9URTogd2hlbiB0aGUgaXNyIGlzIGxlZnQsIG5vIHJ4IGlzIHBlbmRpbmcgKi8KKwl9CS8qIGVuZCBvZiBpbnRlcnJ1cHQgc291cmNlIHBvbGxpbmcgbG9vcCAqLworCisjaWZkZWYJVVNFX0JSRUFLX0lTUgorCWlmIChzbWMtPm9zLmh3bS5sZWF2ZV9pc3IgJiYgZm9yY2VfaXJxKSB7CisJCXNtdF9mb3JjZV9pcnEoc21jKSA7CisJfQorI2VuZGlmCisJc21jLT5vcy5od20uaXNyX2ZsYWcgPSBGQUxTRSA7CisJTkREX1RSQUNFKCJDSDBFIiwwLDAsMCkgOworfQorCisKKy8qCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVJFQ0VJVkUgRlVOQ1RJT05TOgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKyNpZm5kZWYJTkRJU19PUzIKKy8qCisgKglCRUdJTl9NQU5VQUxfRU5UUlkobWFjX2Rydl9yeF9tb2RlKQorICoJdm9pZCBtYWNfZHJ2X3J4X21vZGUoc21jLG1vZGUpCisgKgorICogZnVuY3Rpb24JRE9XTkNBTEwJKGZwbHVzLmMpCisgKgkJQ29ycmVzcG9uZGluZyB0byB0aGUgcGFyYW1ldGVyIG1vZGUsIHRoZSBvcGVyYXRpbmcgc3lzdGVtCisgKgkJZGVwZW5kZW50IG1vZHVsZSBjYW4gYWN0aXZhdGUgc2V2ZXJhbCByZWNlaXZlIG1vZGVzLgorICoKKyAqIHBhcmEJbW9kZQk9IDE6CVJYX0VOQUJMRV9BTExNVUxUSQllbmFibGUgYWxsIG11bHRpY2FzdHMKKyAqCQk9IDI6CVJYX0RJU0FCTEVfQUxMTVVMVEkJZGlzYWJsZSAiZW5hYmxlIGFsbCBtdWx0aWNhc3RzIgorICoJCT0gMzoJUlhfRU5BQkxFX1BST01JU0MJZW5hYmxlIHByb21pc2N1b3VzCisgKgkJPSA0OglSWF9ESVNBQkxFX1BST01JU0MJZGlzYWJsZSBwcm9taXNjdW91cworICoJCT0gNToJUlhfRU5BQkxFX05TQQkJZW5hYmxlIHJlYy4gb2YgYWxsIE5TQSBmcmFtZXMKKyAqCQkJKGRpc2FibGVkIGFmdGVyICdkcml2ZXIgcmVzZXQnICYgJ3NldCBzdGF0aW9uIGFkZHJlc3MnKQorICoJCT0gNjoJUlhfRElTQUJMRV9OU0EJCWRpc2FibGUgcmVjLiBvZiBhbGwgTlNBIGZyYW1lcworICoKKyAqCQk9IDIxOglSWF9FTkFCTEVfUEFTU19TTVQJKCBzZWUgZGVzY3JpcHRpb24gKQorICoJCT0gMjI6CVJYX0RJU0FCTEVfUEFTU19TTVQJKCAgIgkgICAiCSAgKQorICoJCT0gMjM6CVJYX0VOQUJMRV9QQVNTX05TQQkoICAiCSAgICIJICApCisgKgkJPSAyNDoJUlhfRElTQUJMRV9QQVNTX05TQQkoICAiCSAgICIJICApCisgKgkJPSAyNToJUlhfRU5BQkxFX1BBU1NfREIJKCAgIgkgICAiCSAgKQorICoJCT0gMjY6CVJYX0RJU0FCTEVfUEFTU19EQgkoICAiCSAgICIJICApCisgKgkJPSAyNzoJUlhfRElTQUJMRV9QQVNTX0FMTAkoICAiCSAgICIJICApCisgKgkJPSAyODoJUlhfRElTQUJMRV9MTENfUFJPTUlTQwkoICAiCSAgICIJICApCisgKgkJPSAyOToJUlhfRU5BQkxFX0xMQ19QUk9NSVNDCSggICIJICAgIgkgICkKKyAqCisgKgorICoJCVJYX0VOQUJMRV9QQVNTX1NNVCAvIFJYX0RJU0FCTEVfUEFTU19TTVQKKyAqCisgKgkJSWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gZGVwZW5kZW50IG1vZHVsZSBhY3RpdmF0ZXMgdGhlCisgKgkJbW9kZSBSWF9FTkFCTEVfUEFTU19TTVQsIHRoZSBoYXJkd2FyZSBtb2R1bGUKKyAqCQlkdXBsaWNhdGVzIGFsbCBTTVQgZnJhbWVzIHdpdGggdGhlIGZyYW1lIGNvbnRyb2wKKyAqCQlGQ19TTVRfSU5GTyBhbmQgcGFzc2VzIHRoZW0gdG8gdGhlIExMQyByZWNlaXZlIGNoYW5uZWwKKyAqCQlieSBjYWxsaW5nIG1hY19kcnZfcnhfaW5pdC4KKyAqCQlUaGUgU01UIEZyYW1lcyB3aGljaCBhcmUgc2VudCBieSB0aGUgbG9jYWwgU01UIGFuZCB0aGUgTlNBCisgKgkJZnJhbWVzIHdob3NlIEEtIGFuZCBDLUluZGljYXRvciBpcyBub3Qgc2V0IGFyZSBhbHNvIGR1cGxpY2F0ZWQKKyAqCQlhbmQgcGFzc2VkLgorICoJCVRoZSByZWNlaXZlIG1vZGUgUlhfRElTQUJMRV9QQVNTX1NNVCBkaXNhYmxlcyB0aGUgcGFzc2luZworICoJCW9mIFNNVCBmcmFtZXMuCisgKgorICoJCVJYX0VOQUJMRV9QQVNTX05TQSAvIFJYX0RJU0FCTEVfUEFTU19OU0EKKyAqCisgKgkJSWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gZGVwZW5kZW50IG1vZHVsZSBhY3RpdmF0ZXMgdGhlCisgKgkJbW9kZSBSWF9FTkFCTEVfUEFTU19OU0EsIHRoZSBoYXJkd2FyZSBtb2R1bGUKKyAqCQlkdXBsaWNhdGVzIGFsbCBOU0EgZnJhbWVzIHdpdGggZnJhbWUgY29udHJvbCBGQ19TTVRfTlNBCisgKgkJYW5kIGEgc2V0IEEtSW5kaWNhdG9yIGFuZCBwYXNzZWQgdGhlbSB0byB0aGUgTExDCisgKgkJcmVjZWl2ZSBjaGFubmVsIGJ5IGNhbGxpbmcgbWFjX2Rydl9yeF9pbml0LgorICoJCUFsbCBOU0EgRnJhbWVzIHdoaWNoIGFyZSBzZW50IGJ5IHRoZSBsb2NhbCBTTVQKKyAqCQlhcmUgYWxzbyBkdXBsaWNhdGVkIGFuZCBwYXNzZWQuCisgKgkJVGhlIHJlY2VpdmUgbW9kZSBSWF9ESVNBQkxFX1BBU1NfTlNBIGRpc2FibGVzIHRoZSBwYXNzaW5nCisgKgkJb2YgTlNBIGZyYW1lcyB3aXRoIHRoZSBBLSBvciBDLUluZGljYXRvciBzZXQuCisgKgorICogTk9URToJRm9yIGZlYXIgdGhhdCB0aGUgaGFyZHdhcmUgbW9kdWxlIHJlY2VpdmVzIE5TQSBmcmFtZXMgd2l0aAorICoJCWEgcmVzZXQgQS1JbmRpY2F0b3IsIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGRlcGVuZGVudCBtb2R1bGUKKyAqCQloYXMgdG8gY2FsbCBtYWNfZHJ2X3J4X21vZGUgd2l0aCB0aGUgbW9kZSBSWF9FTkFCTEVfTlNBCisgKgkJYmVmb3JlIGFjdGl2YXRlIHRoZSBSWF9FTkFCTEVfUEFTU19OU0EgbW9kZSBhbmQgYWZ0ZXIgZXZlcnkKKyAqCQknZHJpdmVyIHJlc2V0JyBhbmQgJ3NldCBzdGF0aW9uIGFkZHJlc3MnLgorICoKKyAqCQlSWF9FTkFCTEVfUEFTU19EQiAvIFJYX0RJU0FCTEVfUEFTU19EQgorICoKKyAqCQlJZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBkZXBlbmRlbnQgbW9kdWxlIGFjdGl2YXRlcyB0aGUKKyAqCQltb2RlIFJYX0VOQUJMRV9QQVNTX0RCLCBkaXJlY3QgQkVBQ09OIGZyYW1lcworICoJCShGQ19CRUFDT04gZnJhbWUgY29udHJvbCkgYXJlIHBhc3NlZCB0byB0aGUgTExDIHJlY2VpdmUKKyAqCQljaGFubmVsIGJ5IG1hY19kcnZfcnhfaW5pdC4KKyAqCQlUaGUgcmVjZWl2ZSBtb2RlIFJYX0RJU0FCTEVfUEFTU19EQiBkaXNhYmxlcyB0aGUgcGFzc2luZworICoJCW9mIGRpcmVjdCBCRUFDT04gZnJhbWVzLgorICoKKyAqCQlSWF9ESVNBQkxFX1BBU1NfQUxMCisgKgorICoJCURpc2FibGVzIGFsbCBzcGVjaWFsIHJlY2VpdmVzIG1vZGVzLiBJdCBpcyBlcXVhbCB0bworICoJCWNhbGwgbWFjX2Rydl9zZXRfcnhfbW9kZSBzdWNjZXNzaXZlbHkgd2l0aCB0aGUKKyAqCQlwYXJhbWV0ZXJzIFJYX0RJU0FCTEVfTlNBLCBSWF9ESVNBQkxFX1BBU1NfU01ULAorICoJCVJYX0RJU0FCTEVfUEFTU19OU0EgYW5kIFJYX0RJU0FCTEVfUEFTU19EQi4KKyAqCisgKgkJUlhfRU5BQkxFX0xMQ19QUk9NSVNDCisgKgorICoJCShkZWZhdWx0KSBhbGwgcmVjZWl2ZWQgTExDIGZyYW1lcyBhbmQgYWxsIFNNVC9OU0EvREJFQUNPTgorICoJCWZyYW1lcyBkZXBlbmRpbmcgb24gdGhlIGF0dGl0dWRlIG9mIHRoZSBmbGFncworICoJCVBBU1NfU01UL1BBU1NfTlNBL1BBU1NfREJFQUNPTiB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGUKKyAqCQlMTEMgbGF5ZXIKKyAqCisgKgkJUlhfRElTQUJMRV9MTENfUFJPTUlTQworICoKKyAqCQlhbGwgcmVjZWl2ZWQgU01UL05TQS9EQkVBQ09OIGZyYW1lcyBkZXBlbmRpbmcgb24gdGhlCisgKgkJYXR0aXR1ZGUgb2YgdGhlIGZsYWdzIFBBU1NfU01UL1BBU1NfTlNBL1BBU1NfREJFQUNPTgorICoJCXdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZSBMTEMgbGF5ZXIuCisgKgkJYWxsIHJlY2VpdmVkIExMQyBmcmFtZXMgd2l0aCBhIGRpcmVjdGVkIGFkZHJlc3MsIE11bHRpY2FzdAorICoJCW9yIEJyb2FkY2FzdCBhZGRyZXNzIHdpbGwgYmUgZGVsaXZlcmVkIHRvIHRoZSBMTEMKKyAqCQlsYXllciB0b28uCisgKgorICoJRU5EX01BTlVBTF9FTlRSWQorICovCit2b2lkIG1hY19kcnZfcnhfbW9kZShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG1vZGUpCit7CisJc3dpdGNoKG1vZGUpIHsKKwljYXNlIFJYX0VOQUJMRV9QQVNTX1NNVDoKKwkJc21jLT5vcy5od20ucGFzc19TTVQgPSBUUlVFIDsKKwkJYnJlYWsgOworCWNhc2UgUlhfRElTQUJMRV9QQVNTX1NNVDoKKwkJc21jLT5vcy5od20ucGFzc19TTVQgPSBGQUxTRSA7CisJCWJyZWFrIDsKKwljYXNlIFJYX0VOQUJMRV9QQVNTX05TQToKKwkJc21jLT5vcy5od20ucGFzc19OU0EgPSBUUlVFIDsKKwkJYnJlYWsgOworCWNhc2UgUlhfRElTQUJMRV9QQVNTX05TQToKKwkJc21jLT5vcy5od20ucGFzc19OU0EgPSBGQUxTRSA7CisJCWJyZWFrIDsKKwljYXNlIFJYX0VOQUJMRV9QQVNTX0RCOgorCQlzbWMtPm9zLmh3bS5wYXNzX0RCID0gVFJVRSA7CisJCWJyZWFrIDsKKwljYXNlIFJYX0RJU0FCTEVfUEFTU19EQjoKKwkJc21jLT5vcy5od20ucGFzc19EQiA9IEZBTFNFIDsKKwkJYnJlYWsgOworCWNhc2UgUlhfRElTQUJMRV9QQVNTX0FMTDoKKwkJc21jLT5vcy5od20ucGFzc19TTVQgPSBzbWMtPm9zLmh3bS5wYXNzX05TQSA9IEZBTFNFIDsKKwkJc21jLT5vcy5od20ucGFzc19EQiA9IEZBTFNFIDsKKwkJc21jLT5vcy5od20ucGFzc19sbGNfcHJvbWlzYyA9IFRSVUUgOworCQltYWNfc2V0X3J4X21vZGUoc21jLFJYX0RJU0FCTEVfTlNBKSA7CisJCWJyZWFrIDsKKwljYXNlIFJYX0RJU0FCTEVfTExDX1BST01JU0M6CisJCXNtYy0+b3MuaHdtLnBhc3NfbGxjX3Byb21pc2MgPSBGQUxTRSA7CisJCWJyZWFrIDsKKwljYXNlIFJYX0VOQUJMRV9MTENfUFJPTUlTQzoKKwkJc21jLT5vcy5od20ucGFzc19sbGNfcHJvbWlzYyA9IFRSVUUgOworCQlicmVhayA7CisJY2FzZSBSWF9FTkFCTEVfQUxMTVVMVEk6CisJY2FzZSBSWF9ESVNBQkxFX0FMTE1VTFRJOgorCWNhc2UgUlhfRU5BQkxFX1BST01JU0M6CisJY2FzZSBSWF9ESVNBQkxFX1BST01JU0M6CisJY2FzZSBSWF9FTkFCTEVfTlNBOgorCWNhc2UgUlhfRElTQUJMRV9OU0E6CisJZGVmYXVsdDoKKwkJbWFjX3NldF9yeF9tb2RlKHNtYyxtb2RlKSA7CisJCWJyZWFrIDsKKwl9Cit9CisjZW5kaWYJLyogaWZuZGVmIE5ESVNfT1MyICovCisKKy8qCisgKiBwcm9jZXNzIHJlY2VpdmUgcXVldWUKKyAqLwordm9pZCBwcm9jZXNzX3JlY2VpdmUoc3RydWN0IHNfc21jICpzbWMpCit7CisJaW50IGkgOworCWludCBuIDsKKwlpbnQgZnJhZ19jb3VudCA7CQkvKiBudW1iZXIgb2YgUnhEcyBvZiB0aGUgY3VyciByeCBidWYgKi8KKwlpbnQgdXNlZF9mcmFncyA7CQkvKiBudW1iZXIgb2YgUnhEcyBvZiB0aGUgY3VyciBmcmFtZSAqLworCXN0cnVjdCBzX3NtdF9yeF9xdWV1ZSAqcXVldWUgOwkvKiBwb2ludHMgdG8gdGhlIHF1ZXVlIGN0bCBzdHJ1Y3QgKi8KKwlzdHJ1Y3Qgc19zbXRfZnBfcnhkIHZvbGF0aWxlICpyIDsJLyogcnhkIHBvaW50ZXIgKi8KKwlzdHJ1Y3Qgc19zbXRfZnBfcnhkIHZvbGF0aWxlICpyeGQgOwkvKiBmaXJzdCByeGQgb2YgcnggZnJhbWUgKi8KKwl1X2xvbmcgcmJjdHJsIDsJCQkvKiByZWNlaXZlIGJ1ZmZlciBjb250cm9sIHdvcmQgKi8KKwl1X2xvbmcgcmZzdyA7CQkJLyogcmVjZWl2ZSBmcmFtZSBzdGF0dXMgd29yZCAqLworCXVfc2hvcnQgcnhfdXNlZCA7CisJdV9jaGFyIGZhciAqdmlydCA7CisJY2hhciBmYXIgKmRhdGEgOworCVNNYnVmICptYiA7CisJdV9jaGFyIGZjIDsJCQkvKiBGcmFtZSBjb250cm9sICovCisJaW50IGxlbiA7CQkJLyogRnJhbWUgbGVuZ3RoICovCisKKwlzbWMtPm9zLmh3bS5kZXRlY19jb3VudCA9IDAgOworCXF1ZXVlID0gc21jLT5ody5mcC5yeFtRVUVVRV9SMV0gOworCU5ERF9UUkFDRSgiUkh4QiIsMCwwLDApIDsKKwlmb3IgKCA7IDsgKSB7CisJCXIgPSBxdWV1ZS0+cnhfY3Vycl9nZXQgOworCQlyeF91c2VkID0gcXVldWUtPnJ4X3VzZWQgOworCQlmcmFnX2NvdW50ID0gMCA7CisKKyNpZmRlZglVU0VfQlJFQUtfSVNSCisJCWlmIChzbWMtPm9zLmh3bS5sZWF2ZV9pc3IpIHsKKwkJCWdvdG8gcnhfZW5kIDsKKwkJfQorI2VuZGlmCisjaWZkZWYJTkRJU19PUzIKKwkJaWYgKG9mZkRlcHRoKSB7CisJCQlzbWMtPm9zLmh3bS5yeF9icmVhayA9IDEgOworCQkJZ290byByeF9lbmQgOworCQl9CisJCXNtYy0+b3MuaHdtLnJ4X2JyZWFrID0gMCA7CisjZW5kaWYKKyNpZmRlZglPREkyCisJCWlmIChzbWMtPm9zLmh3bS5yeF9icmVhaykgeworCQkJZ290byByeF9lbmQgOworCQl9CisjZW5kaWYKKwkJbiA9IDAgOworCQlkbyB7CisJCQlEQl9SWCgiQ2hlY2sgUnhEICV4IGZvciBPV04gYW5kIEVPRiIsKHZvaWQgKilyLDAsNSkgOworCQkJRFJWX0JVRl9GTFVTSChyLERESV9ETUFfU1lOQ19GT1JDUFUpIDsKKwkJCXJiY3RybCA9IENSX1JFQUQoci0+cnhkX3JiY3RybCkgOworCQkJcmJjdHJsID0gQUlYX1JFVkVSU0UocmJjdHJsKSA7CisKKwkJCWlmIChyYmN0cmwgJiBCTVVfT1dOKSB7CisJCQkJTkREX1RSQUNFKCJSSHhFIixyLHJmc3cscmJjdHJsKSA7CisJCQkJREJfUlgoIkVuZCBvZiBSeERzIiwwLDAsNCkgOworCQkJCWdvdG8gcnhfZW5kIDsKKwkJCX0KKwkJCS8qCisJCQkgKiBvdXQgb2YgUnhEIGRldGVjdGlvbgorCQkJICovCisJCQlpZiAoIXJ4X3VzZWQpIHsKKwkJCQlTS19CUkVBSygpIDsKKwkJCQlTTVRfUEFOSUMoc21jLEhXTV9FMDAwOSxIV01fRTAwMDlfTVNHKSA7CisJCQkJLyogRWl0aGVyIHdlIGRvbid0IGhhdmUgYW4gUnhEIG9yIGFsbAorCQkJCSAqIFJ4RHMgYXJlIGZpbGxlZC4gVGhlcmVmb3JlIGl0J3MgYWxsb3dlZAorCQkJCSAqIGZvciB0byBzZXQgdGhlIFNUT1BQRUQgZmxhZyAqLworCQkJCXNtYy0+aHcuaHdfc3RhdGUgPSBTVE9QUEVEIDsKKwkJCQltYWNfZHJ2X2NsZWFyX3J4X3F1ZXVlKHNtYykgOworCQkJCXNtYy0+aHcuaHdfc3RhdGUgPSBTVEFSVEVEIDsKKwkJCQltYWNfZHJ2X2ZpbGxfcnhkKHNtYykgOworCQkJCXNtYy0+b3MuaHdtLmRldGVjX2NvdW50ID0gMCA7CisJCQkJZ290byByeF9lbmQgOworCQkJfQorCQkJcmZzdyA9IEFJWF9SRVZFUlNFKHItPnJ4ZF9yZnN3KSA7CisJCQlpZiAoKHJiY3RybCAmIEJNVV9TVEYpICE9ICgocmJjdHJsICYgQk1VX1NUX0JVRikgPDw1KSkgeworCQkJCS8qCisJCQkJICogVGhlIEJNVV9TVEYgYml0IGlzIGRlbGV0ZWQsIDEgZnJhbWUgaXMKKwkJCQkgKiBwbGFjZWQgaW50byBtb3JlIHRoYW4gMSByeCBidWZmZXIKKwkJCQkgKgorCQkJCSAqIHNraXAgZnJhbWUgYnkgc2V0dGluZyB0aGUgcnggbGVuIHRvIDAKKwkJCQkgKgorCQkJCSAqIGlmIGZyYWdtZW50IGNvdW50ID09IDAKKwkJCQkgKglUaGUgbWlzc2luZyBTVEYgYml0IGJlbG9uZ3MgdG8gdGhlCisJCQkJICoJY3VycmVudCBmcmFtZSwgc2VhcmNoIGZvciB0aGUKKwkJCQkgKglFT0YgYml0IHRvIGNvbXBsZXRlIHRoZSBmcmFtZQorCQkJCSAqIGVsc2UKKwkJCQkgKgl0aGUgZnJhZ21lbnQgYmVsb25ncyB0byB0aGUgbmV4dCBmcmFtZSwKKwkJCQkgKglleGl0IHRoZSBsb29wIGFuZCBwcm9jZXNzIHRoZSBmcmFtZQorCQkJCSAqLworCQkJCVNLX0JSRUFLKCkgOworCQkJCXJmc3cgPSAwIDsKKwkJCQlpZiAoZnJhZ19jb3VudCkgeworCQkJCQlicmVhayA7CisJCQkJfQorCQkJfQorCQkJbiArPSByYmN0cmwgJiAweGZmZmYgOworCQkJciA9IHItPnJ4ZF9uZXh0IDsKKwkJCWZyYWdfY291bnQrKyA7CisJCQlyeF91c2VkLS0gOworCQl9IHdoaWxlICghKHJiY3RybCAmIEJNVV9FT0YpKSA7CisJCXVzZWRfZnJhZ3MgPSBmcmFnX2NvdW50IDsKKwkJREJfUlgoIkVPRiBzZXQgaW4gUnhELCB1c2VkX2ZyYWdzID0gJWQgIix1c2VkX2ZyYWdzLDAsNSkgOworCisJCS8qIG1heSBiZSBuZXh0IDIgRFJWX0JVRl9GTFVTSCgpIGNhbiBiZSBza2lwcGVkLCBiZWNhdXNlICovCisJCS8qIEJNVV9TVF9CVUYgd2lsbCBub3QgYmUgY2hhbmdlZCBieSB0aGUgQVNJQyAqLworCQlEUlZfQlVGX0ZMVVNIKHIsRERJX0RNQV9TWU5DX0ZPUkNQVSkgOworCQl3aGlsZSAocnhfdXNlZCAmJiAhKHItPnJ4ZF9yYmN0cmwgJiBBSVhfUkVWRVJTRShCTVVfU1RfQlVGKSkpIHsKKwkJCURCX1JYKCJDaGVjayBTVEYgYml0IGluICV4Iiwodm9pZCAqKXIsMCw1KSA7CisJCQlyID0gci0+cnhkX25leHQgOworCQkJRFJWX0JVRl9GTFVTSChyLERESV9ETUFfU1lOQ19GT1JDUFUpIDsKKwkJCWZyYWdfY291bnQrKyA7CisJCQlyeF91c2VkLS0gOworCQl9CisJCURCX1JYKCJTVEYgYml0IGZvdW5kIiwwLDAsNSkgOworCisJCS8qCisJCSAqIFRoZSByZWNlaXZlZCBmcmFtZSBpcyBmaW5pc2hlZCBmb3IgdGhlIHByb2Nlc3MgcmVjZWl2ZQorCQkgKi8KKwkJcnhkID0gcXVldWUtPnJ4X2N1cnJfZ2V0IDsKKwkJcXVldWUtPnJ4X2N1cnJfZ2V0ID0gciA7CisJCXF1ZXVlLT5yeF9mcmVlICs9IGZyYWdfY291bnQgOworCQlxdWV1ZS0+cnhfdXNlZCA9IHJ4X3VzZWQgOworCisJCS8qCisJCSAqIEFTSUMgRXJyYXRhIG5vLiA3IChTVEYgLSBCaXQgQnVnKQorCQkgKi8KKwkJcnhkLT5yeGRfcmJjdHJsICY9IEFJWF9SRVZFUlNFKH5CTVVfU1RGKSA7CisKKwkJZm9yIChyPXJ4ZCwgaT1mcmFnX2NvdW50IDsgaSA7IHI9ci0+cnhkX25leHQsIGktLSl7CisJCQlEQl9SWCgiZG1hX2NvbXBsZXRlIGZvciBSeEQgJXgiLCh2b2lkICopciwwLDUpIDsKKwkJCWRtYV9jb21wbGV0ZShzbWMsKHVuaW9uIHNfZnBfZGVzY3Igdm9sYXRpbGUgKilyLERNQV9XUik7CisJCX0KKwkJc21jLT5ody5mcC5lcnJfc3RhdHMuZXJyX3ZhbGlkKysgOworCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNDb3BpZWRfQ3QrKyA7CisKKwkJLyogdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBpbmNsdWRpbmcgdGhlIEZDICovCisJCWxlbiA9IChyZnN3ICYgUkRfTEVOR1RIKSAtIDQgOworCisJCURCX1JYKCJmcmFtZSBsZW5ndGggPSAlZCIsbGVuLDAsNCkgOworCQkvKgorCQkgKiBjaGVjayB0aGUgZnJhbWVfbGVuZ2h0IGFuZCBhbGwgZXJyb3IgZmxhZ3MKKwkJICovCisJCWlmIChyZnN3ICYgKFJYX01TUkFCVHxSWF9GU19FfFJYX0ZTX0NSQ3xSWF9GU19JTVBMKSl7CisJCQlpZiAocmZzdyAmIFJEX1NfTVNSQUJUKSB7CisJCQkJREJfUlgoIkZyYW1lIGFib3J0ZWQgYnkgdGhlIEZPUk1BQyIsMCwwLDIpIDsKKwkJCQlzbWMtPmh3LmZwLmVycl9zdGF0cy5lcnJfYWJvcnQrKyA7CisJCQl9CisJCQkvKgorCQkJICogY2hlY2sgZnJhbWUgc3RhdHVzCisJCQkgKi8KKwkJCWlmIChyZnN3ICYgUkRfU19TRUFDMikgeworCQkJCURCX1JYKCJFLUluZGljYXRvciBzZXQiLDAsMCwyKSA7CisJCQkJc21jLT5ody5mcC5lcnJfc3RhdHMuZXJyX2VfaW5kaWNhdG9yKysgOworCQkJfQorCQkJaWYgKHJmc3cgJiBSRF9TX1NGUk1FUlIpIHsKKwkJCQlEQl9SWCgiQ1JDIGVycm9yIiwwLDAsMikgOworCQkJCXNtYy0+aHcuZnAuZXJyX3N0YXRzLmVycl9jcmMrKyA7CisJCQl9CisJCQlpZiAocmZzdyAmIFJYX0ZTX0lNUEwpIHsKKwkJCQlEQl9SWCgiSW1wbGVtZW50ZXIgZnJhbWUiLDAsMCwyKSA7CisJCQkJc21jLT5ody5mcC5lcnJfc3RhdHMuZXJyX2ltcF9mcmFtZSsrIDsKKwkJCX0KKwkJCWdvdG8gYWJvcnRfZnJhbWUgOworCQl9CisJCWlmIChsZW4gPiBGRERJX1JBV19NVFUtNCkgeworCQkJREJfUlgoIkZyYW1lIHRvbyBsb25nIGVycm9yIiwwLDAsMikgOworCQkJc21jLT5ody5mcC5lcnJfc3RhdHMuZXJyX3Rvb19sb25nKysgOworCQkJZ290byBhYm9ydF9mcmFtZSA7CisJCX0KKwkJLyoKKwkJICogU1VQRVJORVQgMyBCdWc6IEZPUk1BQyBkZWxpdmVycyBzdGF0dXMgd29yZHMKKwkJICogb2YgYWJvcmRlZCBmcmFtZXMgdG8gdGhlIEJNVQorCQkgKi8KKwkJaWYgKGxlbiA8PSA0KSB7CisJCQlEQl9SWCgiRnJhbWUgbGVuZ3RoID0gMCIsMCwwLDIpIDsKKwkJCWdvdG8gYWJvcnRfZnJhbWUgOworCQl9CisKKwkJaWYgKGxlbiAhPSAobi00KSkgeworCQkJREJfUlgoIkJNVTogcnggbGVuIGRpZmZlcnM6IFslZDolZF0iLGxlbixuLDQpOworCQkJc21jLT5vcy5od20ucnhfbGVuX2Vycm9yKysgOworCQkJZ290byBhYm9ydF9mcmFtZSA7CisJCX0KKworCQkvKgorCQkgKiBDaGVjayBTQSA9PSBNQQorCQkgKi8KKwkJdmlydCA9ICh1X2NoYXIgZmFyICopIHJ4ZC0+cnhkX3ZpcnQgOworCQlEQl9SWCgiRkMgPSAleCIsKnZpcnQsMCwyKSA7CisJCWlmICh2aXJ0WzEyXSA9PSBNQVs1XSAmJgorCQkgICAgdmlydFsxMV0gPT0gTUFbNF0gJiYKKwkJICAgIHZpcnRbMTBdID09IE1BWzNdICYmCisJCSAgICB2aXJ0WzldID09IE1BWzJdICYmCisJCSAgICB2aXJ0WzhdID09IE1BWzFdICYmCisJCSAgICAodmlydFs3XSAmIH5HUk9VUF9BRERSX0JJVCkgPT0gTUFbMF0pIHsKKwkJCWdvdG8gYWJvcnRfZnJhbWUgOworCQl9CisKKwkJLyoKKwkJICogdGVzdCBpZiBMTEMgZnJhbWUKKwkJICovCisJCWlmIChyZnN3ICYgUlhfRlNfTExDKSB7CisJCQkvKgorCQkJICogaWYgcGFzc19sbGNfcHJvbWlzYyBpcyBkaXNhYmxlCisJCQkgKglpZiBEQSAhPSBNdWx0aWNhc3Qgb3IgQnJvYWRjYXN0IG9yIERBIT1NQQorCQkJICoJCWFib3J0IHRoZSBmcmFtZQorCQkJICovCisJCQlpZiAoIXNtYy0+b3MuaHdtLnBhc3NfbGxjX3Byb21pc2MpIHsKKwkJCQlpZighKHZpcnRbMV0gJiBHUk9VUF9BRERSX0JJVCkpIHsKKwkJCQkJaWYgKHZpcnRbNl0gIT0gTUFbNV0gfHwKKwkJCQkJICAgIHZpcnRbNV0gIT0gTUFbNF0gfHwKKwkJCQkJICAgIHZpcnRbNF0gIT0gTUFbM10gfHwKKwkJCQkJICAgIHZpcnRbM10gIT0gTUFbMl0gfHwKKwkJCQkJICAgIHZpcnRbMl0gIT0gTUFbMV0gfHwKKwkJCQkJICAgIHZpcnRbMV0gIT0gTUFbMF0pIHsKKwkJCQkJCURCX1JYKCJEQSAhPSBNQSBhbmQgbm90IG11bHRpLSBvciBicm9hZGNhc3QiLDAsMCwyKSA7CisJCQkJCQlnb3RvIGFib3J0X2ZyYW1lIDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLyoKKwkJCSAqIExMQyBmcmFtZSByZWNlaXZlZAorCQkJICovCisJCQlEQl9SWCgiTExDIC0gcmVjZWl2ZSIsMCwwLDQpIDsKKwkJCW1hY19kcnZfcnhfY29tcGxldGUoc21jLHJ4ZCxmcmFnX2NvdW50LGxlbikgOworCQl9CisJCWVsc2UgeworCQkJaWYgKCEobWIgPSBzbXRfZ2V0X21idWYoc21jKSkpIHsKKwkJCQlzbWMtPmh3LmZwLmVycl9zdGF0cy5lcnJfbm9fYnVmKysgOworCQkJCURCX1JYKCJObyBTTWJ1ZjsgcmVjZWl2ZSB0ZXJtaW5hdGVkIiwwLDAsNCkgOworCQkJCWdvdG8gYWJvcnRfZnJhbWUgOworCQkJfQorCQkJZGF0YSA9IHNtdG9kKG1iLGNoYXIgKikgLSAxIDsKKworCQkJLyoKKwkJCSAqIGNvcHkgdGhlIGZyYW1lIGludG8gYSBTTVRfTUJ1ZgorCQkJICovCisjaWZkZWYgVVNFX09TX0NQWQorCQkJaHdtX2NweV9yeGQybWIocnhkLGRhdGEsbGVuKSA7CisjZWxzZQorCQkJZm9yIChyPXJ4ZCwgaT11c2VkX2ZyYWdzIDsgaSA7IHI9ci0+cnhkX25leHQsIGktLSl7CisJCQkJbiA9IEFJWF9SRVZFUlNFKHItPnJ4ZF9yYmN0cmwpICYgUkRfTEVOR1RIIDsKKwkJCQlEQl9SWCgiY3AgU01UIGZyYW1lIHRvIG1iOiBsZW4gPSAlZCIsbiwwLDYpIDsKKwkJCQltZW1jcHkoZGF0YSxyLT5yeGRfdmlydCxuKSA7CisJCQkJZGF0YSArPSBuIDsKKwkJCX0KKwkJCWRhdGEgPSBzbXRvZChtYixjaGFyICopIC0gMSA7CisjZW5kaWYKKwkJCWZjID0gKihjaGFyICopbWItPnNtX2RhdGEgPSAqZGF0YSA7CisJCQltYi0+c21fbGVuID0gbGVuIC0gMSA7CQkvKiBsZW4gLSBmYyAqLworCQkJZGF0YSsrIDsKKworCQkJLyoKKwkJCSAqIFNNVCBmcmFtZSByZWNlaXZlZAorCQkJICovCisJCQlzd2l0Y2goZmMpIHsKKwkJCWNhc2UgRkNfU01UX0lORk8gOgorCQkJCXNtYy0+aHcuZnAuZXJyX3N0YXRzLmVycl9zbXRfZnJhbWUrKyA7CisJCQkJREJfUlgoIlNNVCBmcmFtZSByZWNlaXZlZCAiLDAsMCw1KSA7CisKKwkJCQlpZiAoc21jLT5vcy5od20ucGFzc19TTVQpIHsKKwkJCQkJREJfUlgoInBhc3MgU01UIGZyYW1lICIsMCwwLDUpIDsKKwkJCQkJbWFjX2Rydl9yeF9jb21wbGV0ZShzbWMsIHJ4ZCwKKwkJCQkJCWZyYWdfY291bnQsbGVuKSA7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlEQl9SWCgicmVxdWV1ZSBSeEQiLDAsMCw1KSA7CisJCQkJCW1hY19kcnZfcmVxdWV1ZV9yeGQoc21jLHJ4ZCxmcmFnX2NvdW50KTsKKwkJCQl9CisKKwkJCQlzbXRfcmVjZWl2ZWRfcGFjayhzbWMsbWIsKGludCkocmZzdz4+MjUpKSA7CisJCQkJYnJlYWsgOworCQkJY2FzZSBGQ19TTVRfTlNBIDoKKwkJCQlzbWMtPmh3LmZwLmVycl9zdGF0cy5lcnJfc210X2ZyYW1lKysgOworCQkJCURCX1JYKCJTTVQgZnJhbWUgcmVjZWl2ZWQgIiwwLDAsNSkgOworCisJCQkJLyogaWYgcGFzc19OU0Egc2V0IHBhc3MgdGhlIE5TQSBmcmFtZSBvciAqLworCQkJCS8qIHBhc3NfU01UIHNldCBhbmQgdGhlIEEtSW5kaWNhdG9yICovCisJCQkJLyogaXMgbm90IHNldCwgcGFzcyB0aGUgTlNBIGZyYW1lICovCisJCQkJaWYgKHNtYy0+b3MuaHdtLnBhc3NfTlNBIHx8CisJCQkJCShzbWMtPm9zLmh3bS5wYXNzX1NNVCAmJgorCQkJCQkhKHJmc3cgJiBBX0lORElDKSkpIHsKKwkJCQkJREJfUlgoInBhc3MgU01UIGZyYW1lICIsMCwwLDUpIDsKKwkJCQkJbWFjX2Rydl9yeF9jb21wbGV0ZShzbWMsIHJ4ZCwKKwkJCQkJCWZyYWdfY291bnQsbGVuKSA7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlEQl9SWCgicmVxdWV1ZSBSeEQiLDAsMCw1KSA7CisJCQkJCW1hY19kcnZfcmVxdWV1ZV9yeGQoc21jLHJ4ZCxmcmFnX2NvdW50KTsKKwkJCQl9CisKKwkJCQlzbXRfcmVjZWl2ZWRfcGFjayhzbWMsbWIsKGludCkocmZzdz4+MjUpKSA7CisJCQkJYnJlYWsgOworCQkJY2FzZSBGQ19CRUFDT04gOgorCQkJCWlmIChzbWMtPm9zLmh3bS5wYXNzX0RCKSB7CisJCQkJCURCX1JYKCJwYXNzIERCIGZyYW1lICIsMCwwLDUpIDsKKwkJCQkJbWFjX2Rydl9yeF9jb21wbGV0ZShzbWMsIHJ4ZCwKKwkJCQkJCWZyYWdfY291bnQsbGVuKSA7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlEQl9SWCgicmVxdWV1ZSBSeEQiLDAsMCw1KSA7CisJCQkJCW1hY19kcnZfcmVxdWV1ZV9yeGQoc21jLHJ4ZCxmcmFnX2NvdW50KTsKKwkJCQl9CisJCQkJc210X2ZyZWVfbWJ1ZihzbWMsbWIpIDsKKwkJCQlicmVhayA7CisJCQlkZWZhdWx0IDoKKwkJCQkvKgorCQkJCSAqIHVua25vd24gRkMgYWJvcmQgdGhlIGZyYW1lCisJCQkJICovCisJCQkJREJfUlgoInVua25vd24gRkMgZXJyb3IiLDAsMCwyKSA7CisJCQkJc210X2ZyZWVfbWJ1ZihzbWMsbWIpIDsKKwkJCQlEQl9SWCgicmVxdWV1ZSBSeEQiLDAsMCw1KSA7CisJCQkJbWFjX2Rydl9yZXF1ZXVlX3J4ZChzbWMscnhkLGZyYWdfY291bnQpIDsKKwkJCQlpZiAoKGZjICYgMHhmMCkgPT0gRkNfTUFDKQorCQkJCQlzbWMtPmh3LmZwLmVycl9zdGF0cy5lcnJfbWFjX2ZyYW1lKysgOworCQkJCWVsc2UKKwkJCQkJc21jLT5ody5mcC5lcnJfc3RhdHMuZXJyX2ltcF9mcmFtZSsrIDsKKworCQkJCWJyZWFrIDsKKwkJCX0KKwkJfQorCisJCURCX1JYKCJuZXh0IFJ4RCBpcyAleCAiLHF1ZXVlLT5yeF9jdXJyX2dldCwwLDMpIDsKKwkJTkREX1RSQUNFKCJSSHgxIixxdWV1ZS0+cnhfY3Vycl9nZXQsMCwwKSA7CisKKwkJY29udGludWUgOworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworYWJvcnRfZnJhbWU6CisJCURCX1JYKCJyZXF1ZXVlIFJ4RCIsMCwwLDUpIDsKKwkJbWFjX2Rydl9yZXF1ZXVlX3J4ZChzbWMscnhkLGZyYWdfY291bnQpIDsKKworCQlEQl9SWCgibmV4dCBSeEQgaXMgJXggIixxdWV1ZS0+cnhfY3Vycl9nZXQsMCwzKSA7CisJCU5ERF9UUkFDRSgiUkh4MiIscXVldWUtPnJ4X2N1cnJfZ2V0LDAsMCkgOworCX0KK3J4X2VuZDoKKyNpZmRlZglBTExfUlhfQ09NUExFVEUKKwltYWNfZHJ2X2FsbF9yZWNlaXZlc19jb21wbGV0ZShzbWMpIDsKKyNlbmRpZgorCXJldHVybiA7CS8qIGxpbnQgYnVnOiBuZWVkcyByZXR1cm4gZGV0ZWN0IGVuZCBvZiBmdW5jdGlvbiAqLworfQorCitzdGF0aWMgdm9pZCBzbXRfdG9fbGxjKHN0cnVjdCBzX3NtYyAqc21jLCBTTWJ1ZiAqbWIpCit7CisJdV9jaGFyCWZjIDsKKworCURCX1JYKCJzZW5kIGEgcXVldWVkIGZyYW1lIHRvIHRoZSBsbGMgbGF5ZXIiLDAsMCw0KSA7CisJc21jLT5vcy5od20uci5sZW4gPSBtYi0+c21fbGVuIDsKKwlzbWMtPm9zLmh3bS5yLm1iX3BvcyA9IHNtdG9kKG1iLGNoYXIgKikgOworCWZjID0gKnNtYy0+b3MuaHdtLnIubWJfcG9zIDsKKwkodm9pZCltYWNfZHJ2X3J4X2luaXQoc21jLChpbnQpbWItPnNtX2xlbiwoaW50KWZjLAorCQlzbWMtPm9zLmh3bS5yLm1iX3BvcywoaW50KW1iLT5zbV9sZW4pIDsKKwlzbXRfZnJlZV9tYnVmKHNtYyxtYikgOworfQorCisvKgorICoJQkVHSU5fTUFOVUFMX0VOVFJZKGh3bV9yeF9mcmFnKQorICoJdm9pZCBod21fcnhfZnJhZyhzbWMsdmlydCxwaHlzLGxlbixmcmFtZV9zdGF0dXMpCisgKgorICogZnVuY3Rpb24JTUFDUk8JCShoYXJkd2FyZSBtb2R1bGUsIGh3bXRtLmgpCisgKgkJVGhpcyBmdW5jdGlvbiBjYWxscyBkbWFfbWFzdGVyIGZvciBwcmVwYXJpbmcgdGhlCisgKgkJc3lzdGVtIGhhcmR3YXJlIGZvciB0aGUgRE1BIHRyYW5zZmVyIGFuZCBpbml0aWFsaXplcworICoJCXRoZSBjdXJyZW50IFJ4RCB3aXRoIHRoZSBsZW5ndGggYW5kIHRoZSBwaHlzaWNhbCBhbmQKKyAqCQl2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGZyYWdtZW50LiBGdXJ0aGVybW9yZSwgaXQgc2V0cyB0aGUKKyAqCQlTVEYgYW5kIEVPRiBiaXRzIGRlcGVuZGluZyBvbiB0aGUgZnJhbWUgc3RhdHVzIGJ5dGUsCisgKgkJc3dpdGNoZXMgdGhlIE9XTiBmbGFnIG9mIHRoZSBSeEQsIHNvIHRoYXQgaXQgaXMgb3duZWQgYnkgdGhlCisgKgkJYWRhcHRlciBhbmQgaXNzdWVzIGFuIHJ4X3N0YXJ0LgorICoKKyAqIHBhcmEJdmlydAl2aXJ0dWFsIHBvaW50ZXIgdG8gdGhlIGZyYWdtZW50CisgKglsZW4JdGhlIGxlbmd0aCBvZiB0aGUgZnJhZ21lbnQKKyAqCWZyYW1lX3N0YXR1cwlzdGF0dXMgb2YgdGhlIGZyYW1lLCBzZWUgZGVzaWduIGRlc2NyaXB0aW9uCisgKgorICogTk9URToJSXQgaXMgcG9zc2libGUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggYSBmcmFnbWVudCBsZW5ndGgKKyAqCQlvZiB6ZXJvLgorICoKKyAqCUVORF9NQU5VQUxfRU5UUlkKKyAqLwordm9pZCBod21fcnhfZnJhZyhzdHJ1Y3Qgc19zbWMgKnNtYywgY2hhciBmYXIgKnZpcnQsIHVfbG9uZyBwaHlzLCBpbnQgbGVuLAorCQkgaW50IGZyYW1lX3N0YXR1cykKK3sKKwlzdHJ1Y3Qgc19zbXRfZnBfcnhkIHZvbGF0aWxlICpyIDsKKwl1X2ludAlyYmN0cmwgOworCisJTkREX1RSQUNFKCJSSGZCIix2aXJ0LGxlbixmcmFtZV9zdGF0dXMpIDsKKwlEQl9SWCgiaHdtX3J4X2ZyYWc6IGxlbiA9ICVkLCBmcmFtZV9zdGF0dXMgPSAleFxuIixsZW4sZnJhbWVfc3RhdHVzLDIpIDsKKwlyID0gc21jLT5ody5mcC5yeF9xW1FVRVVFX1IxXS5yeF9jdXJyX3B1dCA7CisJci0+cnhkX3ZpcnQgPSB2aXJ0IDsKKwlyLT5yeGRfcmJhZHIgPSBBSVhfUkVWRVJTRShwaHlzKSA7CisJcmJjdHJsID0gQUlYX1JFVkVSU0UoICgoKHVfbG9uZylmcmFtZV9zdGF0dXMgJgorCQkoRklSU1RfRlJBR3xMQVNUX0ZSQUcpKTw8MjYpIHwKKwkJKCgodV9sb25nKSBmcmFtZV9zdGF0dXMgJiBGSVJTVF9GUkFHKSA8PCAyMSkgfAorCQlCTVVfT1dOIHwgQk1VX0NIRUNLIHwgQk1VX0VOX0lSUV9FT0YgfCBsZW4pIDsKKwlyLT5yeGRfcmJjdHJsID0gcmJjdHJsIDsKKworCURSVl9CVUZfRkxVU0gocixERElfRE1BX1NZTkNfRk9SREVWKSA7CisJb3V0cGQoQUREUihCMF9SMV9DU1IpLENTUl9TVEFSVCkgOworCXNtYy0+aHcuZnAucnhfcVtRVUVVRV9SMV0ucnhfZnJlZS0tIDsKKwlzbWMtPmh3LmZwLnJ4X3FbUVVFVUVfUjFdLnJ4X3VzZWQrKyA7CisJc21jLT5ody5mcC5yeF9xW1FVRVVFX1IxXS5yeF9jdXJyX3B1dCA9IHItPnJ4ZF9uZXh0IDsKKwlORERfVFJBQ0UoIlJIZkUiLHIsQUlYX1JFVkVSU0Uoci0+cnhkX3JiYWRyKSwwKSA7Cit9CisKKyNpZm5kZWYJTkRJU19PUzIKKy8qCisgKglCRUdJTl9NQU5VQUxfRU5UUlkobWFjX2Rydl9yeF9mcmFnKQorICoJaW50IG1hY19kcnZfcnhfZnJhZyhzbWMsdmlydCxsZW4pCisgKgorICogZnVuY3Rpb24JRE9XTkNBTEwJKGh3bXRtLmMpCisgKgkJbWFjX2Rydl9yeF9mcmFnIGZpbGxzIHRoZSBmcmFnbWVudCB3aXRoIGEgcGFydCBvZiB0aGUgZnJhbWUuCisgKgorICogcGFyYQl2aXJ0CXRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGZyYWdtZW50CisgKglsZW4JdGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgZnJhZ21lbnQKKyAqCisgKiByZXR1cm4gMDoJc3VjY2VzcyBjb2RlLCBubyBlcnJvcnMgcG9zc2libGUKKyAqCisgKglFTkRfTUFOVUFMX0VOVFJZCisgKi8KK2ludCBtYWNfZHJ2X3J4X2ZyYWcoc3RydWN0IHNfc21jICpzbWMsIHZvaWQgZmFyICp2aXJ0LCBpbnQgbGVuKQoreworCU5ERF9UUkFDRSgiUkhTQiIsdmlydCxsZW4sc21jLT5vcy5od20uci5tYl9wb3MpIDsKKworCURCX1JYKCJyZWNlaXZlIGZyb20gcXVldWU6IGxlbi92aXJ0OiA9ICVkLyV4IixsZW4sdmlydCw0KSA7CisJbWVtY3B5KChjaGFyIGZhciAqKXZpcnQsc21jLT5vcy5od20uci5tYl9wb3MsbGVuKSA7CisJc21jLT5vcy5od20uci5tYl9wb3MgKz0gbGVuIDsKKworCU5ERF9UUkFDRSgiUkhTRSIsc21jLT5vcy5od20uci5tYl9wb3MsMCwwKSA7CisJcmV0dXJuKDApIDsKK30KKyNlbmRpZgorCisKKy8qCisgKglCRUdJTk5fTUFOVUFMX0VOVFJZKG1hY19kcnZfY2xlYXJfcnhfcXVldWUpCisgKgorICogdm9pZCBtYWNfZHJ2X2NsZWFyX3J4X3F1ZXVlKHNtYykKKyAqIHN0cnVjdCBzX3NtYyAqc21jIDsKKyAqCisgKiBmdW5jdGlvbglET1dOQ0FMTAkoaGFyZHdhcmUgbW9kdWxlLCBod210bS5jKQorICoJCW1hY19kcnZfY2xlYXJfcnhfcXVldWUgaXMgY2FsbGVkIGJ5IHRoZSBPUy1zcGVjaWZpYyBtb2R1bGUKKyAqCQlhZnRlciBpdCBoYXMgaXNzdWVkIGEgY2FyZF9zdG9wLgorICoJCUluIHRoaXMgY2FzZSwgdGhlIGZyYW1lcyBpbiB0aGUgcmVjZWl2ZSBxdWV1ZSBhcmUgb2Jzb2xldGUgYW5kCisgKgkJc2hvdWxkIGJlIHJlbW92ZWQuIEZvciByZW1vdmluZyBtYWNfZHJ2X2NsZWFyX3J4X3F1ZXVlCisgKgkJY2FsbHMgZG1hX21hc3RlciBmb3IgZWFjaCBSeEQgYW5kIG1hY19kcnZfY2xlYXJfcnhkIGZvciBlYWNoCisgKgkJcmVjZWl2ZSBidWZmZXIuCisgKgorICogTk9URToJY2FsbGluZyBzZXF1ZW5jZSBjYXJkX3N0b3A6CisgKgkJQ0xJX0ZCSSgpLCBjYXJkX3N0b3AoKSwKKyAqCQltYWNfZHJ2X2NsZWFyX3R4X3F1ZXVlKCksIG1hY19kcnZfY2xlYXJfcnhfcXVldWUoKSwKKyAqCisgKiBOT1RFOglUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRoYXQgdGhlIEJNVXMgYXJlIGlkbGUKKyAqCQl3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorICoKKyAqCUVORF9NQU5VQUxfRU5UUlkKKyAqLwordm9pZCBtYWNfZHJ2X2NsZWFyX3J4X3F1ZXVlKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXN0cnVjdCBzX3NtdF9mcF9yeGQgdm9sYXRpbGUgKnIgOworCXN0cnVjdCBzX3NtdF9mcF9yeGQgdm9sYXRpbGUgKm5leHRfcnhkIDsKKwlzdHJ1Y3Qgc19zbXRfcnhfcXVldWUgKnF1ZXVlIDsKKwlpbnQgZnJhZ19jb3VudCA7CisJaW50IGkgOworCisJaWYgKHNtYy0+aHcuaHdfc3RhdGUgIT0gU1RPUFBFRCkgeworCQlTS19CUkVBSygpIDsKKwkJU01UX1BBTklDKHNtYyxIV01fRTAwMTIsSFdNX0UwMDEyX01TRykgOworCQlyZXR1cm4gOworCX0KKworCXF1ZXVlID0gc21jLT5ody5mcC5yeFtRVUVVRV9SMV0gOworCURCX1JYKCJjbGVhcl9yeF9xdWV1ZSIsMCwwLDUpIDsKKworCS8qCisJICogZG1hX2NvbXBsZXRlIGFuZCBtYWNfZHJ2X2NsZWFyX3J4ZCBmb3IgYWxsIFJ4RHMgLyByZWNlaXZlIGJ1ZmZlcnMKKwkgKi8KKwlyID0gcXVldWUtPnJ4X2N1cnJfZ2V0IDsKKwl3aGlsZSAocXVldWUtPnJ4X3VzZWQpIHsKKwkJRFJWX0JVRl9GTFVTSChyLERESV9ETUFfU1lOQ19GT1JDUFUpIDsKKwkJREJfUlgoInN3aXRjaCBPV04gYml0IG9mIFJ4RCAweCV4ICIsciwwLDUpIDsKKwkJci0+cnhkX3JiY3RybCAmPSBBSVhfUkVWRVJTRSh+Qk1VX09XTikgOworCQlmcmFnX2NvdW50ID0gMSA7CisJCURSVl9CVUZfRkxVU0gocixERElfRE1BX1NZTkNfRk9SREVWKSA7CisJCXIgPSByLT5yeGRfbmV4dCA7CisJCURSVl9CVUZfRkxVU0gocixERElfRE1BX1NZTkNfRk9SQ1BVKSA7CisJCXdoaWxlIChyICE9IHF1ZXVlLT5yeF9jdXJyX3B1dCAmJgorCQkJIShyLT5yeGRfcmJjdHJsICYgQUlYX1JFVkVSU0UoQk1VX1NUX0JVRikpKSB7CisJCQlEQl9SWCgiQ2hlY2sgU1RGIGJpdCBpbiAleCIsKHZvaWQgKilyLDAsNSkgOworCQkJci0+cnhkX3JiY3RybCAmPSBBSVhfUkVWRVJTRSh+Qk1VX09XTikgOworCQkJRFJWX0JVRl9GTFVTSChyLERESV9ETUFfU1lOQ19GT1JERVYpIDsKKwkJCXIgPSByLT5yeGRfbmV4dCA7CisJCQlEUlZfQlVGX0ZMVVNIKHIsRERJX0RNQV9TWU5DX0ZPUkNQVSkgOworCQkJZnJhZ19jb3VudCsrIDsKKwkJfQorCQlEQl9SWCgiU1RGIGJpdCBmb3VuZCIsMCwwLDUpIDsKKwkJbmV4dF9yeGQgPSByIDsKKworCQlmb3IgKHI9cXVldWUtPnJ4X2N1cnJfZ2V0LGk9ZnJhZ19jb3VudDsgaSA7IHI9ci0+cnhkX25leHQsaS0tKXsKKwkJCURCX1JYKCJkbWFfY29tcGxldGUgZm9yIFJ4RCAleCIsKHZvaWQgKilyLDAsNSkgOworCQkJZG1hX2NvbXBsZXRlKHNtYywodW5pb24gc19mcF9kZXNjciB2b2xhdGlsZSAqKXIsRE1BX1dSKTsKKwkJfQorCisJCURCX1JYKCJtYWNfZHJ2X2NsZWFyX3J4ZDogUnhEICV4IGZyYWdfY291bnQgJWQgIiwKKwkJCSh2b2lkICopcXVldWUtPnJ4X2N1cnJfZ2V0LGZyYWdfY291bnQsNSkgOworCQltYWNfZHJ2X2NsZWFyX3J4ZChzbWMscXVldWUtPnJ4X2N1cnJfZ2V0LGZyYWdfY291bnQpIDsKKworCQlxdWV1ZS0+cnhfY3Vycl9nZXQgPSBuZXh0X3J4ZCA7CisJCXF1ZXVlLT5yeF91c2VkIC09IGZyYWdfY291bnQgOworCQlxdWV1ZS0+cnhfZnJlZSArPSBmcmFnX2NvdW50IDsKKwl9Cit9CisKKworLyoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJU0VORCBGVU5DVElPTlM6CisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLyoKKyAqCUJFR0lOX01BTlVBTF9FTlRSWShod21fdHhfaW5pdCkKKyAqCWludCBod21fdHhfaW5pdChzbWMsZmMsZnJhZ19jb3VudCxmcmFtZV9sZW4sZnJhbWVfc3RhdHVzKQorICoKKyAqIGZ1bmN0aW9uCURPV05fQ0FMTAkoaGFyZHdhcmUgbW9kdWxlLCBod210bS5jKQorICoJCWh3bV90eF9pbml0IGNoZWNrcyBpZiB0aGUgZnJhbWUgY2FuIGJlIHNlbnQgdGhyb3VnaCB0aGUKKyAqCQljb3JyZXNwb25kaW5nIHNlbmQgcXVldWUuCisgKgorICogcGFyYQlmYwl0aGUgZnJhbWUgY29udHJvbC4gVG8gZGV0ZXJtaW5lIHRocm91Z2ggd2hpY2gKKyAqCQlzZW5kIHF1ZXVlIHRoZSBmcmFtZSBzaG91bGQgYmUgdHJhbnNtaXR0ZWQuCisgKgkJMHg1MCAtIDB4NTc6CWFzeW5jaHJvbm91cyBMTEMgZnJhbWUKKyAqCQkweEQwIC0gMHhENzoJc3luY2hyb25vdXMgTExDIGZyYW1lCisgKgkJMHg0MSwgMHg0RjoJU01UIGZyYW1lIHRvIHRoZSBuZXR3b3JrCisgKgkJMHg0MjoJCVNNVCBmcmFtZSB0byB0aGUgbmV0d29yayBhbmQgdG8gdGhlIGxvY2FsIFNNVAorICoJCTB4NDM6CQlTTVQgZnJhbWUgdG8gdGhlIGxvY2FsIFNNVAorICoJZnJhZ19jb3VudAljb3VudCBvZiB0aGUgZnJhZ21lbnRzIGZvciB0aGlzIGZyYW1lCisgKglmcmFtZV9sZW4JbGVuZ3RoIG9mIHRoZSBmcmFtZQorICoJZnJhbWVfc3RhdHVzCXN0YXR1cyBvZiB0aGUgZnJhbWUsIHRoZSBzZW5kIHF1ZXVlIGJpdCBpcyBhbHJlYWR5CisgKgkJCXNwZWNpZmllZAorICoKKyAqIHJldHVybgkJZnJhbWVfc3RhdHVzCisgKgorICoJRU5EX01BTlVBTF9FTlRSWQorICovCitpbnQgaHdtX3R4X2luaXQoc3RydWN0IHNfc21jICpzbWMsIHVfY2hhciBmYywgaW50IGZyYWdfY291bnQsIGludCBmcmFtZV9sZW4sCisJCWludCBmcmFtZV9zdGF0dXMpCit7CisJTkREX1RSQUNFKCJUSGlCIixmYyxmcmFnX2NvdW50LGZyYW1lX2xlbikgOworCXNtYy0+b3MuaHdtLnR4X3AgPSBzbWMtPmh3LmZwLnR4W2ZyYW1lX3N0YXR1cyAmIFFVRVVFX0EwXSA7CisJc21jLT5vcy5od20udHhfZGVzY3IgPSBUWF9ERVNDUklQVE9SIHwgKCgodV9sb25nKShmcmFtZV9sZW4tMSkmMyk8PDI3KSA7CisJc21jLT5vcy5od20udHhfbGVuID0gZnJhbWVfbGVuIDsKKwlEQl9UWCgiaHdtX3R4X2luaXQ6IGZjID0gJXgsIGxlbiA9ICVkIixmYyxmcmFtZV9sZW4sMykgOworCWlmICgoZmMgJiB+KEZDX1NZTkNfQklUfEZDX0xMQ19QUklPUikpID09IEZDX0FTWU5DX0xMQykgeworCQlmcmFtZV9zdGF0dXMgfD0gTEFOX1RYIDsKKwl9CisJZWxzZSB7CisJCXN3aXRjaCAoZmMpIHsKKwkJY2FzZSBGQ19TTVRfSU5GTyA6CisJCWNhc2UgRkNfU01UX05TQSA6CisJCQlmcmFtZV9zdGF0dXMgfD0gTEFOX1RYIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSBGQ19TTVRfTE9DIDoKKwkJCWZyYW1lX3N0YXR1cyB8PSBMT0NfVFggOworCQkJYnJlYWsgOworCQljYXNlIEZDX1NNVF9MQU5fTE9DIDoKKwkJCWZyYW1lX3N0YXR1cyB8PSBMQU5fVFggfCBMT0NfVFggOworCQkJYnJlYWsgOworCQlkZWZhdWx0IDoKKwkJCVNNVF9QQU5JQyhzbWMsSFdNX0UwMDEwLEhXTV9FMDAxMF9NU0cpIDsKKwkJfQorCX0KKwlpZiAoIXNtYy0+aHcubWFjX3JpbmdfaXNfdXApIHsKKwkJZnJhbWVfc3RhdHVzICY9IH5MQU5fVFggOworCQlmcmFtZV9zdGF0dXMgfD0gUklOR19ET1dOIDsKKwkJREJfVFgoIlJpbmcgaXMgZG93bjogdGVybWluYXRlIExBTl9UWCIsMCwwLDIpIDsKKwl9CisJaWYgKGZyYWdfY291bnQgPiBzbWMtPm9zLmh3bS50eF9wLT50eF9mcmVlKSB7CisjaWZuZGVmCU5ESVNfT1MyCisJCW1hY19kcnZfY2xlYXJfdHhkKHNtYykgOworCQlpZiAoZnJhZ19jb3VudCA+IHNtYy0+b3MuaHdtLnR4X3AtPnR4X2ZyZWUpIHsKKwkJCURCX1RYKCJPdXQgb2YgVHhEcywgdGVybWluYXRlIExBTl9UWCIsMCwwLDIpIDsKKwkJCWZyYW1lX3N0YXR1cyAmPSB+TEFOX1RYIDsKKwkJCWZyYW1lX3N0YXR1cyB8PSBPVVRfT0ZfVFhEIDsKKwkJfQorI2Vsc2UKKwkJREJfVFgoIk91dCBvZiBUeERzLCB0ZXJtaW5hdGUgTEFOX1RYIiwwLDAsMikgOworCQlmcmFtZV9zdGF0dXMgJj0gfkxBTl9UWCA7CisJCWZyYW1lX3N0YXR1cyB8PSBPVVRfT0ZfVFhEIDsKKyNlbmRpZgorCX0KKwlEQl9UWCgiZnJhbWVfc3RhdHVzID0gJXgiLGZyYW1lX3N0YXR1cywwLDMpIDsKKwlORERfVFJBQ0UoIlRIaUUiLGZyYW1lX3N0YXR1cyxzbWMtPm9zLmh3bS50eF9wLT50eF9mcmVlLDApIDsKKwlyZXR1cm4oZnJhbWVfc3RhdHVzKSA7Cit9CisKKy8qCisgKglCRUdJTl9NQU5VQUxfRU5UUlkoaHdtX3R4X2ZyYWcpCisgKgl2b2lkIGh3bV90eF9mcmFnKHNtYyx2aXJ0LHBoeXMsbGVuLGZyYW1lX3N0YXR1cykKKyAqCisgKiBmdW5jdGlvbglET1dOQ0FMTAkoaGFyZHdhcmUgbW9kdWxlLCBod210bS5jKQorICoJCUlmIHRoZSBmcmFtZSBzaG91bGQgYmUgc2VudCB0byB0aGUgTEFOLCB0aGlzIGZ1bmN0aW9uIGNhbGxzCisgKgkJZG1hX21hc3RlciwgZmlsbHMgdGhlIGN1cnJlbnQgVHhEIHdpdGggdGhlIHZpcnR1YWwgYW5kIHRoZQorICoJCXBoeXNpY2FsIGFkZHJlc3MsIHNldHMgdGhlIFNURiBhbmQgRU9GIGJpdHMgZGVwZW5kZW50IG9uCisgKgkJdGhlIGZyYW1lIHN0YXR1cywgYW5kIHJlcXVlc3RzIHRoZSBCTVUgdG8gc3RhcnQgdGhlCisgKgkJdHJhbnNtaXQuCisgKgkJSWYgdGhlIGZyYW1lIHNob3VsZCBiZSBzZW50IHRvIHRoZSBsb2NhbCBTTVQsIGFuIFNNVF9NQnVmCisgKgkJaXMgYWxsb2NhdGVkIGlmIHRoZSBGSVJTVF9GUkFHIGJpdCBpcyBzZXQgaW4gdGhlIGZyYW1lX3N0YXR1cy4KKyAqCQlUaGUgZnJhZ21lbnQgb2YgdGhlIGZyYW1lIGlzIGNvcGllZCBpbnRvIHRoZSBTTVQgTUJ1Zi4KKyAqCQlUaGUgZnVuY3Rpb24gc210X3JlY2VpdmVkX3BhY2sgaXMgY2FsbGVkIGlmIHRoZSBMQVNUX0ZSQUcKKyAqCQliaXQgaXMgc2V0IGluIHRoZSBmcmFtZV9zdGF0dXMgd29yZC4KKyAqCisgKiBwYXJhCXZpcnQJdmlydHVhbCBwb2ludGVyIHRvIHRoZSBmcmFnbWVudAorICoJbGVuCXRoZSBsZW5ndGggb2YgdGhlIGZyYWdtZW50CisgKglmcmFtZV9zdGF0dXMJc3RhdHVzIG9mIHRoZSBmcmFtZSwgc2VlIGRlc2lnbiBkZXNjcmlwdGlvbgorICoKKyAqIHJldHVybglub3RoaW5nIHJldHVybmVkLCBubyBwYXJhbWV0ZXIgaXMgbW9kaWZpZWQKKyAqCisgKiBOT1RFOglJdCBpcyBwb3NzaWJsZSB0byBpbnZva2UgdGhpcyBtYWNybyB3aXRoIGEgZnJhZ21lbnQgbGVuZ3RoCisgKgkJb2YgemVyby4KKyAqCisgKglFTkRfTUFOVUFMX0VOVFJZCisgKi8KK3ZvaWQgaHdtX3R4X2ZyYWcoc3RydWN0IHNfc21jICpzbWMsIGNoYXIgZmFyICp2aXJ0LCB1X2xvbmcgcGh5cywgaW50IGxlbiwKKwkJIGludCBmcmFtZV9zdGF0dXMpCit7CisJc3RydWN0IHNfc210X2ZwX3R4ZCB2b2xhdGlsZSAqdCA7CisJc3RydWN0IHNfc210X3R4X3F1ZXVlICpxdWV1ZSA7CisJdV9pbnQJdGJjdHJsIDsKKworCXF1ZXVlID0gc21jLT5vcy5od20udHhfcCA7CisKKwlORERfVFJBQ0UoIlRIZkIiLHZpcnQsbGVuLGZyYW1lX3N0YXR1cykgOworCS8qIEJ1ZyBmaXg6IEFGIC8gTWF5IDMxIDE5OTkgKCNtaXNzaW5nKQorCSAqIHNubXBpbmZvIHByb2JsZW0gcmVwb3J0ZWQgYnkgSUJNIGlzIGNhdXNlZCBieSBpbnZhbGlkCisJICogdC1wb2ludGVyICh0eGQpIGlmIExBTl9UWCBpcyBub3Qgc2V0IGJ1dCBMT0NfVFggb25seS4KKwkgKiBTZXQ6IHQgPSBxdWV1ZS0+dHhfY3Vycl9wdXQgIGhlcmUgIQorCSAqLworCXQgPSBxdWV1ZS0+dHhfY3Vycl9wdXQgOworCisJREJfVFgoImh3bV90eF9mcmFnOiBsZW4gPSAlZCwgZnJhbWVfc3RhdHVzID0gJXggIixsZW4sZnJhbWVfc3RhdHVzLDIpIDsKKwlpZiAoZnJhbWVfc3RhdHVzICYgTEFOX1RYKSB7CisJCS8qICcqdCcgaXMgYWxyZWFkeSBkZWZpbmVkICovCisJCURCX1RYKCJMQU5fVFg6IFR4RCA9ICV4LCB2aXJ0ID0gJXggIix0LHZpcnQsMykgOworCQl0LT50eGRfdmlydCA9IHZpcnQgOworCQl0LT50eGRfdHhkc2NyID0gQUlYX1JFVkVSU0Uoc21jLT5vcy5od20udHhfZGVzY3IpIDsKKwkJdC0+dHhkX3RiYWRyID0gQUlYX1JFVkVSU0UocGh5cykgOworCQl0YmN0cmwgPSBBSVhfUkVWRVJTRSgoKCh1X2xvbmcpZnJhbWVfc3RhdHVzICYKKwkJCShGSVJTVF9GUkFHfExBU1RfRlJBR3xFTl9JUlFfRU9GKSk8PCAyNikgfAorCQkJQk1VX09XTnxCTVVfQ0hFQ0sgfGxlbikgOworCQl0LT50eGRfdGJjdHJsID0gdGJjdHJsIDsKKworI2lmbmRlZglBSVgKKwkJRFJWX0JVRl9GTFVTSCh0LERESV9ETUFfU1lOQ19GT1JERVYpIDsKKwkJb3V0cGQocXVldWUtPnR4X2JtdV9jdGwsQ1NSX1NUQVJUKSA7CisjZWxzZQkvKiBpZm5kZWYgQUlYICovCisJCURSVl9CVUZfRkxVU0godCxERElfRE1BX1NZTkNfRk9SREVWKSA7CisJCWlmIChmcmFtZV9zdGF0dXMgJiBRVUVVRV9BMCkgeworCQkJb3V0cGQoQUREUihCMF9YQV9DU1IpLENTUl9TVEFSVCkgOworCQl9CisJCWVsc2UgeworCQkJb3V0cGQoQUREUihCMF9YU19DU1IpLENTUl9TVEFSVCkgOworCQl9CisjZW5kaWYKKwkJcXVldWUtPnR4X2ZyZWUtLSA7CisJCXF1ZXVlLT50eF91c2VkKysgOworCQlxdWV1ZS0+dHhfY3Vycl9wdXQgPSB0LT50eGRfbmV4dCA7CisJCWlmIChmcmFtZV9zdGF0dXMgJiBMQVNUX0ZSQUcpIHsKKwkJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1RyYW5zbWl0X0N0KysgOworCQl9CisJfQorCWlmIChmcmFtZV9zdGF0dXMgJiBMT0NfVFgpIHsKKwkJREJfVFgoIkxPQ19UWDogIiwwLDAsMykgOworCQlpZiAoZnJhbWVfc3RhdHVzICYgRklSU1RfRlJBRykgeworCQkJaWYoIShzbWMtPm9zLmh3bS50eF9tYiA9IHNtdF9nZXRfbWJ1ZihzbWMpKSkgeworCQkJCXNtYy0+aHcuZnAuZXJyX3N0YXRzLmVycl9ub19idWYrKyA7CisJCQkJREJfVFgoIk5vIFNNYnVmOyB0cmFuc21pdCB0ZXJtaW5hdGVkIiwwLDAsNCkgOworCQkJfQorCQkJZWxzZSB7CisJCQkJc21jLT5vcy5od20udHhfZGF0YSA9CisJCQkJCXNtdG9kKHNtYy0+b3MuaHdtLnR4X21iLGNoYXIgKikgLSAxIDsKKyNpZmRlZiBVU0VfT1NfQ1BZCisjaWZkZWYgUEFTU18xU1RfVFhEXzJfVFhfQ09NUAorCQkJCWh3bV9jcHlfdHhkMm1iKHQsc21jLT5vcy5od20udHhfZGF0YSwKKwkJCQkJc21jLT5vcy5od20udHhfbGVuKSA7CisjZW5kaWYKKyNlbmRpZgorCQkJfQorCQl9CisJCWlmIChzbWMtPm9zLmh3bS50eF9tYikgeworI2lmbmRlZglVU0VfT1NfQ1BZCisJCQlEQl9UWCgiY29weSBmcmFnbWVudCBpbnRvIE1CdWYgIiwwLDAsMykgOworCQkJbWVtY3B5KHNtYy0+b3MuaHdtLnR4X2RhdGEsdmlydCxsZW4pIDsKKwkJCXNtYy0+b3MuaHdtLnR4X2RhdGEgKz0gbGVuIDsKKyNlbmRpZgorCQkJaWYgKGZyYW1lX3N0YXR1cyAmIExBU1RfRlJBRykgeworI2lmZGVmCVVTRV9PU19DUFkKKyNpZm5kZWYgUEFTU18xU1RfVFhEXzJfVFhfQ09NUAorCQkJCS8qCisJCQkJICogaHdtX2NweV90eGQybWIodHhkLGRhdGEsbGVuKSBjb3BpZXMgJ2xlbicgCisJCQkJICogYnl0ZXMgZnJvbSB0aGUgdmlydHVhbCBwb2ludGVyIGluICdyeGQnCisJCQkJICogdG8gJ2RhdGEnLiBUaGUgdmlydHVhbCBwb2ludGVyIG9mIHRoZSAKKwkJCQkgKiBvcy1zcGVjaWZpYyB0eC1idWZmZXIgc2hvdWxkIGJlIHdyaXR0ZW4KKwkJCQkgKiBpbiB0aGUgTEFTVCB0eGQuCisJCQkJICovIAorCQkJCWh3bV9jcHlfdHhkMm1iKHQsc21jLT5vcy5od20udHhfZGF0YSwKKwkJCQkJc21jLT5vcy5od20udHhfbGVuKSA7CisjZW5kaWYJLyogblBBU1NfMVNUX1RYRF8yX1RYX0NPTVAgKi8KKyNlbmRpZgkvKiBVU0VfT1NfQ1BZICovCisJCQkJc21jLT5vcy5od20udHhfZGF0YSA9CisJCQkJCXNtdG9kKHNtYy0+b3MuaHdtLnR4X21iLGNoYXIgKikgLSAxIDsKKwkJCQkqKGNoYXIgKilzbWMtPm9zLmh3bS50eF9tYi0+c21fZGF0YSA9CisJCQkJCSpzbWMtPm9zLmh3bS50eF9kYXRhIDsKKwkJCQlzbWMtPm9zLmh3bS50eF9kYXRhKysgOworCQkJCXNtYy0+b3MuaHdtLnR4X21iLT5zbV9sZW4gPQorCQkJCQlzbWMtPm9zLmh3bS50eF9sZW4gLSAxIDsKKwkJCQlEQl9UWCgicGFzcyBMTEMgZnJhbWUgdG8gU01UICIsMCwwLDMpIDsKKwkJCQlzbXRfcmVjZWl2ZWRfcGFjayhzbWMsc21jLT5vcy5od20udHhfbWIsCisJCQkJCQlSRF9GU19MT0NBTCkgOworCQkJfQorCQl9CisJfQorCU5ERF9UUkFDRSgiVEhmRSIsdCxxdWV1ZS0+dHhfZnJlZSwwKSA7Cit9CisKKworLyoKKyAqIHF1ZXVlcyBhIHJlY2VpdmUgZm9yIGxhdGVyIHNlbmQKKyAqLworc3RhdGljIHZvaWQgcXVldWVfbGxjX3J4KHN0cnVjdCBzX3NtYyAqc21jLCBTTWJ1ZiAqbWIpCit7CisJREJfR0VOKCJxdWV1ZV9sbGNfcng6IG1iID0gJXgiLCh2b2lkICopbWIsMCw0KSA7CisJc21jLT5vcy5od20ucXVldWVkX3J4X2ZyYW1lcysrIDsKKwltYi0+c21fbmV4dCA9IChTTWJ1ZiAqKU5VTEwgOworCWlmIChzbWMtPm9zLmh3bS5sbGNfcnhfcGlwZSA9PSAwKSB7CisJCXNtYy0+b3MuaHdtLmxsY19yeF9waXBlID0gbWIgOworCX0KKwllbHNlIHsKKwkJc21jLT5vcy5od20ubGxjX3J4X3RhaWwtPnNtX25leHQgPSBtYiA7CisJfQorCXNtYy0+b3MuaHdtLmxsY19yeF90YWlsID0gbWIgOworCisJLyoKKwkgKiBmb3JjZSBhbiB0aW1lciBJUlEgdG8gcmVjZWl2ZSB0aGUgZGF0YQorCSAqLworCWlmICghc21jLT5vcy5od20uaXNyX2ZsYWcpIHsKKwkJc210X2ZvcmNlX2lycShzbWMpIDsKKwl9Cit9CisKKy8qCisgKiBnZXQgYSBTTWJ1ZiBmcm9tIHRoZSBsbGNfcnhfcXVldWUKKyAqLworc3RhdGljIFNNYnVmICpnZXRfbGxjX3J4KHN0cnVjdCBzX3NtYyAqc21jKQoreworCVNNYnVmCSptYiA7CisKKwlpZiAoKG1iID0gc21jLT5vcy5od20ubGxjX3J4X3BpcGUpKSB7CisJCXNtYy0+b3MuaHdtLnF1ZXVlZF9yeF9mcmFtZXMtLSA7CisJCXNtYy0+b3MuaHdtLmxsY19yeF9waXBlID0gbWItPnNtX25leHQgOworCX0KKwlEQl9HRU4oImdldF9sbGNfcng6IG1iID0gMHgleCIsKHZvaWQgKiltYiwwLDQpIDsKKwlyZXR1cm4obWIpIDsKK30KKworLyoKKyAqIHF1ZXVlcyBhIHRyYW5zbWl0IFNNVCBNQnVmIGR1cmluZyB0aGUgdGltZSB3ZXJlIHRoZSBNQnVmIGlzCisgKiBxdWV1ZWQgdGhlIFR4RCByaW5nCisgKi8KK3N0YXRpYyB2b2lkIHF1ZXVlX3R4ZF9tYihzdHJ1Y3Qgc19zbWMgKnNtYywgU01idWYgKm1iKQoreworCURCX0dFTigiX3J4OiBxdWV1ZV90eGRfbWIgPSAleCIsKHZvaWQgKiltYiwwLDQpIDsKKwlzbWMtPm9zLmh3bS5xdWV1ZWRfdHhkX21iKysgOworCW1iLT5zbV9uZXh0ID0gKFNNYnVmICopTlVMTCA7CisJaWYgKHNtYy0+b3MuaHdtLnR4ZF90eF9waXBlID09IDApIHsKKwkJc21jLT5vcy5od20udHhkX3R4X3BpcGUgPSBtYiA7CisJfQorCWVsc2UgeworCQlzbWMtPm9zLmh3bS50eGRfdHhfdGFpbC0+c21fbmV4dCA9IG1iIDsKKwl9CisJc21jLT5vcy5od20udHhkX3R4X3RhaWwgPSBtYiA7Cit9CisKKy8qCisgKiBnZXQgYSBTTWJ1ZiBmcm9tIHRoZSB0eGRfdHhfcXVldWUKKyAqLworc3RhdGljIFNNYnVmICpnZXRfdHhkX21iKHN0cnVjdCBzX3NtYyAqc21jKQoreworCVNNYnVmICptYiA7CisKKwlpZiAoKG1iID0gc21jLT5vcy5od20udHhkX3R4X3BpcGUpKSB7CisJCXNtYy0+b3MuaHdtLnF1ZXVlZF90eGRfbWItLSA7CisJCXNtYy0+b3MuaHdtLnR4ZF90eF9waXBlID0gbWItPnNtX25leHQgOworCX0KKwlEQl9HRU4oImdldF90eGRfbWI6IG1iID0gMHgleCIsKHZvaWQgKiltYiwwLDQpIDsKKwlyZXR1cm4obWIpIDsKK30KKworLyoKKyAqCVNNVCBTZW5kIGZ1bmN0aW9uCisgKi8KK3ZvaWQgc210X3NlbmRfbWJ1ZihzdHJ1Y3Qgc19zbWMgKnNtYywgU01idWYgKm1iLCBpbnQgZmMpCit7CisJY2hhciBmYXIgKmRhdGEgOworCWludAlsZW4gOworCWludAluIDsKKwlpbnQJaSA7CisJaW50CWZyYWdfY291bnQgOworCWludAlmcmFtZV9zdGF0dXMgOworCVNLX0xPQ19ERUNMKGNoYXIgZmFyLCp2aXJ0WzNdKSA7CisJaW50CWZyYWdfbGVuWzNdIDsKKwlzdHJ1Y3Qgc19zbXRfdHhfcXVldWUgKnF1ZXVlIDsKKwlzdHJ1Y3Qgc19zbXRfZnBfdHhkIHZvbGF0aWxlICp0IDsKKwl1X2xvbmcJcGh5cyA7CisJdV9pbnQJdGJjdHJsIDsKKworCU5ERF9UUkFDRSgiVEhTQiIsbWIsZmMsMCkgOworCURCX1RYKCJzbXRfc2VuZF9tYnVmOiBtYiA9IDB4JXgsIGZjID0gMHgleCIsbWIsZmMsNCkgOworCisJbWItPnNtX29mZi0tIDsJLyogc2V0IHRvIGZjICovCisJbWItPnNtX2xlbisrIDsJLyogKyBmYyAqLworCWRhdGEgPSBzbXRvZChtYixjaGFyICopIDsKKwkqZGF0YSA9IGZjIDsKKwlpZiAoZmMgPT0gRkNfU01UX0xPQykKKwkJKmRhdGEgPSBGQ19TTVRfSU5GTyA7CisKKwkvKgorCSAqIGRldGVybWluZSB0aGUgZnJhZyBjb3VudCBhbmQgdGhlIHZpcnQgYWRkcmVzc2VzIG9mIHRoZSBmcmFncworCSAqLworCWZyYWdfY291bnQgPSAwIDsKKwlsZW4gPSBtYi0+c21fbGVuIDsKKwl3aGlsZSAobGVuKSB7CisJCW4gPSBTTVRfUEFHRVNJWkUgLSAoKGxvbmcpZGF0YSAmIChTTVRfUEFHRVNJWkUtMSkpIDsKKwkJaWYgKG4gPj0gbGVuKSB7CisJCQluID0gbGVuIDsKKwkJfQorCQlEQl9UWCgiZnJhZzogdmlydC9sZW4gPSAweCV4LyVkICIsKHZvaWQgKilkYXRhLG4sNSkgOworCQl2aXJ0W2ZyYWdfY291bnRdID0gZGF0YSA7CisJCWZyYWdfbGVuW2ZyYWdfY291bnRdID0gbiA7CisJCWZyYWdfY291bnQrKyA7CisJCWxlbiAtPSBuIDsKKwkJZGF0YSArPSBuIDsKKwl9CisKKwkvKgorCSAqIGRldGVybWluZSB0aGUgZnJhbWUgc3RhdHVzCisJICovCisJcXVldWUgPSBzbWMtPmh3LmZwLnR4W1FVRVVFX0EwXSA7CisJaWYgKGZjID09IEZDX0JFQUNPTiB8fCBmYyA9PSBGQ19TTVRfTE9DKSB7CisJCWZyYW1lX3N0YXR1cyA9IExPQ19UWCA7CisJfQorCWVsc2UgeworCQlmcmFtZV9zdGF0dXMgPSBMQU5fVFggOworCQlpZiAoKHNtYy0+b3MuaHdtLnBhc3NfTlNBICYmKGZjID09IEZDX1NNVF9OU0EpKSB8fAorCQkgICAoc21jLT5vcy5od20ucGFzc19TTVQgJiYoZmMgPT0gRkNfU01UX0lORk8pKSkKKwkJCWZyYW1lX3N0YXR1cyB8PSBMT0NfVFggOworCX0KKworCWlmICghc21jLT5ody5tYWNfcmluZ19pc191cCB8fCBmcmFnX2NvdW50ID4gcXVldWUtPnR4X2ZyZWUpIHsKKwkJZnJhbWVfc3RhdHVzICY9IH5MQU5fVFg7CisJCWlmIChmcmFtZV9zdGF0dXMpIHsKKwkJCURCX1RYKCJSaW5nIGlzIGRvd246IHRlcm1pbmF0ZSBMQU5fVFgiLDAsMCwyKSA7CisJCX0KKwkJZWxzZSB7CisJCQlEQl9UWCgiUmluZyBpcyBkb3duOiB0ZXJtaW5hdGUgdHJhbnNtaXNzaW9uIiwwLDAsMikgOworCQkJc210X2ZyZWVfbWJ1ZihzbWMsbWIpIDsKKwkJCXJldHVybiA7CisJCX0KKwl9CisJREJfVFgoImZyYW1lX3N0YXR1cyA9IDB4JXggIixmcmFtZV9zdGF0dXMsMCw1KSA7CisKKwlpZiAoKGZyYW1lX3N0YXR1cyAmIExBTl9UWCkgJiYgKGZyYW1lX3N0YXR1cyAmIExPQ19UWCkpIHsKKwkJbWItPnNtX3VzZV9jb3VudCA9IDIgOworCX0KKworCWlmIChmcmFtZV9zdGF0dXMgJiBMQU5fVFgpIHsKKwkJdCA9IHF1ZXVlLT50eF9jdXJyX3B1dCA7CisJCWZyYW1lX3N0YXR1cyB8PSBGSVJTVF9GUkFHIDsKKwkJZm9yIChpID0gMDsgaSA8IGZyYWdfY291bnQ7IGkrKykgeworCQkJREJfVFgoImluaXQgVHhEID0gMHgleCIsKHZvaWQgKil0LDAsNSkgOworCQkJaWYgKGkgPT0gZnJhZ19jb3VudC0xKSB7CisJCQkJZnJhbWVfc3RhdHVzIHw9IExBU1RfRlJBRyA7CisJCQkJdC0+dHhkX3R4ZHNjciA9IEFJWF9SRVZFUlNFKFRYX0RFU0NSSVBUT1IgfAorCQkJCQkoKCh1X2xvbmcpKG1iLT5zbV9sZW4tMSkmMykgPDwgMjcpKSA7CisJCQl9CisJCQl0LT50eGRfdmlydCA9IHZpcnRbaV0gOworCQkJcGh5cyA9IGRtYV9tYXN0ZXIoc21jLCAodm9pZCBmYXIgKil2aXJ0W2ldLAorCQkJCWZyYWdfbGVuW2ldLCBETUFfUkR8U01UX0JVRikgOworCQkJdC0+dHhkX3RiYWRyID0gQUlYX1JFVkVSU0UocGh5cykgOworCQkJdGJjdHJsID0gQUlYX1JFVkVSU0UoKCgodV9sb25nKSBmcmFtZV9zdGF0dXMgJgorCQkJCShGSVJTVF9GUkFHfExBU1RfRlJBRykpIDw8IDI2KSB8CisJCQkJQk1VX09XTiB8IEJNVV9DSEVDSyB8IEJNVV9TTVRfVFggfGZyYWdfbGVuW2ldKSA7CisJCQl0LT50eGRfdGJjdHJsID0gdGJjdHJsIDsKKyNpZm5kZWYJQUlYCisJCQlEUlZfQlVGX0ZMVVNIKHQsRERJX0RNQV9TWU5DX0ZPUkRFVikgOworCQkJb3V0cGQocXVldWUtPnR4X2JtdV9jdGwsQ1NSX1NUQVJUKSA7CisjZWxzZQorCQkJRFJWX0JVRl9GTFVTSCh0LERESV9ETUFfU1lOQ19GT1JERVYpIDsKKwkJCW91dHBkKEFERFIoQjBfWEFfQ1NSKSxDU1JfU1RBUlQpIDsKKyNlbmRpZgorCQkJZnJhbWVfc3RhdHVzICY9IH5GSVJTVF9GUkFHIDsKKwkJCXF1ZXVlLT50eF9jdXJyX3B1dCA9IHQgPSB0LT50eGRfbmV4dCA7CisJCQlxdWV1ZS0+dHhfZnJlZS0tIDsKKwkJCXF1ZXVlLT50eF91c2VkKysgOworCQl9CisJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1RyYW5zbWl0X0N0KysgOworCQlxdWV1ZV90eGRfbWIoc21jLG1iKSA7CisJfQorCisJaWYgKGZyYW1lX3N0YXR1cyAmIExPQ19UWCkgeworCQlEQl9UWCgicGFzcyBNYnVmIHRvIExMQyBxdWV1ZSIsMCwwLDUpIDsKKwkJcXVldWVfbGxjX3J4KHNtYyxtYikgOworCX0KKworCS8qCisJICogV2UgbmVlZCB0byB1bnF1ZXVlIHRoZSBmcmVlIFNNVF9NQlVGcyBoZXJlLCBiZWNhdXNlIGl0IG1heQorCSAqIGJlIHRoYXQgdGhlIFNNVCB3YW50J3MgdG8gc2VuZCBtb3JlIHRoYW4gMSBmcmFtZSBmb3Igb25lIGRvd24gY2FsbAorCSAqLworCW1hY19kcnZfY2xlYXJfdHhkKHNtYykgOworCU5ERF9UUkFDRSgiVEhTRSIsdCxxdWV1ZS0+dHhfZnJlZSxmcmFnX2NvdW50KSA7Cit9CisKKy8qCUJFR0lOX01BTlVBTF9FTlRSWShtYWNfZHJ2X2NsZWFyX3R4ZCkKKyAqCXZvaWQgbWFjX2Rydl9jbGVhcl90eGQoc21jKQorICoKKyAqIGZ1bmN0aW9uCURPV05DQUxMCShoYXJkd2FyZSBtb2R1bGUsIGh3bXRtLmMpCisgKgkJbWFjX2Rydl9jbGVhcl90eGQgc2VhcmNoZXMgaW4gYm90aCBzZW5kIHF1ZXVlcyBmb3IgVHhEJ3MKKyAqCQl3aGljaCB3ZXJlIGZpbmlzaGVkIGJ5IHRoZSBhZGFwdGVyLiBJdCBjYWxscyBkbWFfY29tcGxldGUKKyAqCQlmb3IgZWFjaCBUeEQuIElmIHRoZSBsYXN0IGZyYWdtZW50IG9mIGFuIExMQyBmcmFtZSBpcworICoJCXJlYWNoZWQsIGl0IGNhbGxzIG1hY19kcnZfdHhfY29tcGxldGUgdG8gcmVsZWFzZSB0aGUKKyAqCQlzZW5kIGJ1ZmZlci4KKyAqCisgKiByZXR1cm4Jbm90aGluZworICoKKyAqCUVORF9NQU5VQUxfRU5UUlkKKyAqLwordm9pZCBtYWNfZHJ2X2NsZWFyX3R4ZChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzdHJ1Y3Qgc19zbXRfdHhfcXVldWUgKnF1ZXVlIDsKKwlzdHJ1Y3Qgc19zbXRfZnBfdHhkIHZvbGF0aWxlICp0MSA7CisJc3RydWN0IHNfc210X2ZwX3R4ZCB2b2xhdGlsZSAqdDIgPSBOVUxMIDsKKwlTTWJ1ZiAqbWIgOworCXVfbG9uZwl0YmN0cmwgOworCWludCBpIDsKKwlpbnQgZnJhZ19jb3VudCA7CisJaW50IG4gOworCisJTkREX1RSQUNFKCJUSGNCIiwwLDAsMCkgOworCWZvciAoaSA9IFFVRVVFX1M7IGkgPD0gUVVFVUVfQTA7IGkrKykgeworCQlxdWV1ZSA9IHNtYy0+aHcuZnAudHhbaV0gOworCQl0MSA9IHF1ZXVlLT50eF9jdXJyX2dldCA7CisJCURCX1RYKCJjbGVhcl90eGQ6IFFVRVVFID0gJWQgKDA9c3luYy8xPWFzeW5jKSIsaSwwLDUpIDsKKworCQlmb3IgKCA7IDsgKSB7CisJCQlmcmFnX2NvdW50ID0gMCA7CisKKwkJCWRvIHsKKwkJCQlEUlZfQlVGX0ZMVVNIKHQxLERESV9ETUFfU1lOQ19GT1JDUFUpIDsKKwkJCQlEQl9UWCgiY2hlY2sgT1dOL0VPRiBiaXQgb2YgVHhEIDB4JXgiLHQxLDAsNSkgOworCQkJCXRiY3RybCA9IENSX1JFQUQodDEtPnR4ZF90YmN0cmwpIDsKKwkJCQl0YmN0cmwgPSBBSVhfUkVWRVJTRSh0YmN0cmwpIDsKKworCQkJCWlmICh0YmN0cmwgJiBCTVVfT1dOIHx8ICFxdWV1ZS0+dHhfdXNlZCl7CisJCQkJCURCX1RYKCJFbmQgb2YgVHhEcyBxdWV1ZSAlZCIsaSwwLDQpIDsKKwkJCQkJZ290byBmcmVlX25leHRfcXVldWUgOwkvKiBuZXh0IHF1ZXVlICovCisJCQkJfQorCQkJCXQxID0gdDEtPnR4ZF9uZXh0IDsKKwkJCQlmcmFnX2NvdW50KysgOworCQkJfSB3aGlsZSAoISh0YmN0cmwgJiBCTVVfRU9GKSkgOworCisJCQl0MSA9IHF1ZXVlLT50eF9jdXJyX2dldCA7CisJCQlmb3IgKG4gPSBmcmFnX2NvdW50OyBuOyBuLS0pIHsKKwkJCQl0YmN0cmwgPSBBSVhfUkVWRVJTRSh0MS0+dHhkX3RiY3RybCkgOworCQkJCWRtYV9jb21wbGV0ZShzbWMsCisJCQkJCSh1bmlvbiBzX2ZwX2Rlc2NyIHZvbGF0aWxlICopIHQxLAorCQkJCQkoaW50KSAoRE1BX1JEIHwKKwkJCQkJKCh0YmN0cmwgJiBCTVVfU01UX1RYKSA+PiAxOCkpKSA7CisJCQkJdDIgPSB0MSA7CisJCQkJdDEgPSB0MS0+dHhkX25leHQgOworCQkJfQorCisJCQlpZiAodGJjdHJsICYgQk1VX1NNVF9UWCkgeworCQkJCW1iID0gZ2V0X3R4ZF9tYihzbWMpIDsKKwkJCQlzbXRfZnJlZV9tYnVmKHNtYyxtYikgOworCQkJfQorCQkJZWxzZSB7CisjaWZuZGVmIFBBU1NfMVNUX1RYRF8yX1RYX0NPTVAKKwkJCQlEQl9UWCgibWFjX2Rydl90eF9jb21wIGZvciBUeEQgMHgleCIsdDIsMCw0KSA7CisJCQkJbWFjX2Rydl90eF9jb21wbGV0ZShzbWMsdDIpIDsKKyNlbHNlCisJCQkJREJfVFgoIm1hY19kcnZfdHhfY29tcCBmb3IgVHhEIDB4JXgiLAorCQkJCQlxdWV1ZS0+dHhfY3Vycl9nZXQsMCw0KSA7CisJCQkJbWFjX2Rydl90eF9jb21wbGV0ZShzbWMscXVldWUtPnR4X2N1cnJfZ2V0KSA7CisjZW5kaWYKKwkJCX0KKwkJCXF1ZXVlLT50eF9jdXJyX2dldCA9IHQxIDsKKwkJCXF1ZXVlLT50eF9mcmVlICs9IGZyYWdfY291bnQgOworCQkJcXVldWUtPnR4X3VzZWQgLT0gZnJhZ19jb3VudCA7CisJCX0KK2ZyZWVfbmV4dF9xdWV1ZTogOworCX0KKwlORERfVFJBQ0UoIlRIY0UiLDAsMCwwKSA7Cit9CisKKy8qCisgKglCRUdJTk5fTUFOVUFMX0VOVFJZKG1hY19kcnZfY2xlYXJfdHhfcXVldWUpCisgKgorICogdm9pZCBtYWNfZHJ2X2NsZWFyX3R4X3F1ZXVlKHNtYykKKyAqIHN0cnVjdCBzX3NtYyAqc21jIDsKKyAqCisgKiBmdW5jdGlvbglET1dOQ0FMTAkoaGFyZHdhcmUgbW9kdWxlLCBod210bS5jKQorICoJCW1hY19kcnZfY2xlYXJfdHhfcXVldWUgaXMgY2FsbGVkIGZyb20gdGhlIFNNVCB3aGVuCisgKgkJdGhlIFJNVCBzdGF0ZSBtYWNoaW5lIGhhcyBlbnRlcmVkIHRoZSBJU09MQVRFIHN0YXRlLgorICoJCVRoaXMgZnVuY3Rpb24gaXMgYWxzbyBjYWxsZWQgYnkgdGhlIG9zLXNwZWNpZmljIG1vZHVsZQorICoJCWFmdGVyIGl0IGhhcyBjYWxsZWQgdGhlIGZ1bmN0aW9uIGNhcmRfc3RvcCgpLgorICoJCUluIHRoaXMgY2FzZSwgdGhlIGZyYW1lcyBpbiB0aGUgc2VuZCBxdWV1ZXMgYXJlIG9ic29sZXRlIGFuZAorICoJCXNob3VsZCBiZSByZW1vdmVkLgorICoKKyAqIG5vdGUJCWNhbGxpbmcgc2VxdWVuY2U6CisgKgkJQ0xJX0ZCSSgpLCBjYXJkX3N0b3AoKSwKKyAqCQltYWNfZHJ2X2NsZWFyX3R4X3F1ZXVlKCksIG1hY19kcnZfY2xlYXJfcnhfcXVldWUoKSwKKyAqCisgKiBOT1RFOglUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRoYXQgdGhlIEJNVXMgYXJlIGlkbGUKKyAqCQl3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorICoKKyAqCUVORF9NQU5VQUxfRU5UUlkKKyAqLwordm9pZCBtYWNfZHJ2X2NsZWFyX3R4X3F1ZXVlKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXN0cnVjdCBzX3NtdF9mcF90eGQgdm9sYXRpbGUgKnQgOworCXN0cnVjdCBzX3NtdF90eF9xdWV1ZSAqcXVldWUgOworCWludCB0eF91c2VkIDsKKwlpbnQgaSA7CisKKwlpZiAoc21jLT5ody5od19zdGF0ZSAhPSBTVE9QUEVEKSB7CisJCVNLX0JSRUFLKCkgOworCQlTTVRfUEFOSUMoc21jLEhXTV9FMDAxMSxIV01fRTAwMTFfTVNHKSA7CisJCXJldHVybiA7CisJfQorCisJZm9yIChpID0gUVVFVUVfUzsgaSA8PSBRVUVVRV9BMDsgaSsrKSB7CisJCXF1ZXVlID0gc21jLT5ody5mcC50eFtpXSA7CisJCURCX1RYKCJjbGVhcl90eF9xdWV1ZTogUVVFVUUgPSAlZCAoMD1zeW5jLzE9YXN5bmMpIixpLDAsNSkgOworCisJCS8qCisJCSAqIHN3aXRjaCB0aGUgT1dOIGJpdCBvZiBhbGwgcGVuZGluZyBmcmFtZXMgdG8gdGhlIGhvc3QKKwkJICovCisJCXQgPSBxdWV1ZS0+dHhfY3Vycl9nZXQgOworCQl0eF91c2VkID0gcXVldWUtPnR4X3VzZWQgOworCQl3aGlsZSAodHhfdXNlZCkgeworCQkJRFJWX0JVRl9GTFVTSCh0LERESV9ETUFfU1lOQ19GT1JDUFUpIDsKKwkJCURCX1RYKCJzd2l0Y2ggT1dOIGJpdCBvZiBUeEQgMHgleCAiLHQsMCw1KSA7CisJCQl0LT50eGRfdGJjdHJsICY9IEFJWF9SRVZFUlNFKH5CTVVfT1dOKSA7CisJCQlEUlZfQlVGX0ZMVVNIKHQsRERJX0RNQV9TWU5DX0ZPUkRFVikgOworCQkJdCA9IHQtPnR4ZF9uZXh0IDsKKwkJCXR4X3VzZWQtLSA7CisJCX0KKwl9CisKKwkvKgorCSAqIHJlbGVhc2UgYWxsIFR4RCdzIGZvciBib3RoIHNlbmQgcXVldWVzCisJICovCisJbWFjX2Rydl9jbGVhcl90eGQoc21jKSA7CisKKwlmb3IgKGkgPSBRVUVVRV9TOyBpIDw9IFFVRVVFX0EwOyBpKyspIHsKKwkJcXVldWUgPSBzbWMtPmh3LmZwLnR4W2ldIDsKKwkJdCA9IHF1ZXVlLT50eF9jdXJyX2dldCA7CisKKwkJLyoKKwkJICogd3JpdGUgdGhlIHBoeXMgcG9pbnRlciBvZiB0aGUgTkVYVCBkZXNjcmlwdG9yIGludG8gdGhlCisJCSAqIEJNVSdzIGN1cnJlbnQgYWRkcmVzcyBkZXNjcmlwdG9yIHBvaW50ZXIgYW5kIHNldAorCQkgKiB0eF9jdXJyX2dldCBhbmQgdHhfY3Vycl9wdXQgdG8gdGhpcyBwb3NpdGlvbgorCQkgKi8KKwkJaWYgKGkgPT0gUVVFVUVfUykgeworCQkJb3V0cGQoQUREUihCNV9YU19EQSksQUlYX1JFVkVSU0UodC0+dHhkX250ZGFkcikpIDsKKwkJfQorCQllbHNlIHsKKwkJCW91dHBkKEFERFIoQjVfWEFfREEpLEFJWF9SRVZFUlNFKHQtPnR4ZF9udGRhZHIpKSA7CisJCX0KKworCQlxdWV1ZS0+dHhfY3Vycl9wdXQgPSBxdWV1ZS0+dHhfY3Vycl9nZXQtPnR4ZF9uZXh0IDsKKwkJcXVldWUtPnR4X2N1cnJfZ2V0ID0gcXVldWUtPnR4X2N1cnJfcHV0IDsKKwl9Cit9CisKKworLyoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJVEVTVCBGVU5DVElPTlM6CisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworI2lmZGVmCURFQlVHCisvKgorICoJQkVHSU5fTUFOVUFMX0VOVFJZKG1hY19kcnZfZGVidWdfbGV2KQorICoJdm9pZCBtYWNfZHJ2X2RlYnVnX2xldihzbWMsZmxhZyxsZXYpCisgKgorICogZnVuY3Rpb24JRE9XTkNBTEwJKGRydnNyLmMpCisgKgkJVG8gZ2V0IGEgc3BlY2lhbCBkZWJ1ZyBpbmZvIHRoZSB1c2VyIGNhbiBhc3NpZ24gYSBkZWJ1ZyBsZXZlbAorICoJCXRvIGFueSBkZWJ1ZyBmbGFnLgorICoKKyAqIHBhcmEJZmxhZwlkZWJ1ZyBmbGFnLCBwb3NzaWJsZSB2YWx1ZXMgYXJlOgorICoJCQk9IDA6CXJlc2V0IGFsbCBkZWJ1ZyBmbGFncyAodGhlIGRlZmluZWQgbGV2ZWwgaXMKKyAqCQkJCWlnbm9yZWQpCisgKgkJCT0gMToJZGVidWcuZF9zbXRmCisgKgkJCT0gMjoJZGVidWcuZF9zbXQKKyAqCQkJPSAzOglkZWJ1Zy5kX2VjbQorICoJCQk9IDQ6CWRlYnVnLmRfcm10CisgKgkJCT0gNToJZGVidWcuZF9jZm0KKyAqCQkJPSA2OglkZWJ1Zy5kX3BjbQorICoKKyAqCQkJPSAxMDoJZGVidWcuZF9vcy5od21fcnggKGhhcmR3YXJlIG1vZHVsZSByZWNlaXZlIHBhdGgpCisgKgkJCT0gMTE6CWRlYnVnLmRfb3MuaHdtX3R4KGhhcmR3YXJlIG1vZHVsZSB0cmFuc21pdCBwYXRoKQorICoJCQk9IDEyOglkZWJ1Zy5kX29zLmh3bV9nZW4oaGFyZHdhcmUgbW9kdWxlIGdlbmVyYWwgZmxhZykKKyAqCisgKglsZXYJZGVidWcgbGV2ZWwKKyAqCisgKglFTkRfTUFOVUFMX0VOVFJZCisgKi8KK3ZvaWQgbWFjX2Rydl9kZWJ1Z19sZXYoc3RydWN0IHNfc21jICpzbWMsIGludCBmbGFnLCBpbnQgbGV2KQoreworCXN3aXRjaChmbGFnKSB7CisJY2FzZSAoaW50KU5VTEw6CisJCURCX1AuZF9zbXRmID0gREJfUC5kX3NtdCA9IERCX1AuZF9lY20gPSBEQl9QLmRfcm10ID0gMCA7CisJCURCX1AuZF9jZm0gPSAwIDsKKwkJREJfUC5kX29zLmh3bV9yeCA9IERCX1AuZF9vcy5od21fdHggPSBEQl9QLmRfb3MuaHdtX2dlbiA9IDAgOworI2lmZGVmCVNCQQorCQlEQl9QLmRfc2JhID0gMCA7CisjZW5kaWYKKyNpZmRlZglFU1MKKwkJREJfUC5kX2VzcyA9IDAgOworI2VuZGlmCisJCWJyZWFrIDsKKwljYXNlIERFQlVHX1NNVEY6CisJCURCX1AuZF9zbXRmID0gbGV2IDsKKwkJYnJlYWsgOworCWNhc2UgREVCVUdfU01UOgorCQlEQl9QLmRfc210ID0gbGV2IDsKKwkJYnJlYWsgOworCWNhc2UgREVCVUdfRUNNOgorCQlEQl9QLmRfZWNtID0gbGV2IDsKKwkJYnJlYWsgOworCWNhc2UgREVCVUdfUk1UOgorCQlEQl9QLmRfcm10ID0gbGV2IDsKKwkJYnJlYWsgOworCWNhc2UgREVCVUdfQ0ZNOgorCQlEQl9QLmRfY2ZtID0gbGV2IDsKKwkJYnJlYWsgOworCWNhc2UgREVCVUdfUENNOgorCQlEQl9QLmRfcGNtID0gbGV2IDsKKwkJYnJlYWsgOworCWNhc2UgREVCVUdfU0JBOgorI2lmZGVmCVNCQQorCQlEQl9QLmRfc2JhID0gbGV2IDsKKyNlbmRpZgorCQlicmVhayA7CisJY2FzZSBERUJVR19FU1M6CisjaWZkZWYJRVNTCisJCURCX1AuZF9lc3MgPSBsZXYgOworI2VuZGlmCisJCWJyZWFrIDsKKwljYXNlIERCX0hXTV9SWDoKKwkJREJfUC5kX29zLmh3bV9yeCA9IGxldiA7CisJCWJyZWFrIDsKKwljYXNlIERCX0hXTV9UWDoKKwkJREJfUC5kX29zLmh3bV90eCA9IGxldiA7CisJCWJyZWFrIDsKKwljYXNlIERCX0hXTV9HRU46CisJCURCX1AuZF9vcy5od21fZ2VuID0gbGV2IDsKKwkJYnJlYWsgOworCWRlZmF1bHQ6CisJCWJyZWFrIDsKKwl9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvaHd0LmMgYi9kcml2ZXJzL25ldC9za2ZwL2h3dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMWY4YTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2h3dC5jCkBAIC0wLDAgKzEsMzA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGltZXIgRHJpdmVyIGZvciBGQkkgYm9hcmQgKHRpbWVyIGNoaXAgODJDNTQpCisgKi8KKworLyoKKyAqIE1vZGlmaWNhdGlvbnM6CisgKgorICoJMjgtSnVuLTE5OTQgc3cJRWRpdCB2MS42LgorICoJCQlNQ0E6IEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBTSy1ORVQgRkRESS1GTTIgYWRhcHRlci4gVGhlCisgKgkJCSBmb2xsb3dpbmcgZnVuY3Rpb25zIGhhdmUgYmVlbiBhZGRlZCgrKSBvciBtb2RpZmllZCgqKToKKyAqCQkJIGh3dF9zdGFydCgqKSwgaHd0X3N0b3AoKiksIGh3dF9yZXN0YXJ0KCopLCBod3RfcmVhZCgqKQorICovCisKKyNpbmNsdWRlICJoL3R5cGVzLmgiCisjaW5jbHVkZSAiaC9mZGRpLmgiCisjaW5jbHVkZSAiaC9zbWMuaCIKKworI2lmbmRlZglsaW50CitzdGF0aWMgY29uc3QgY2hhciBJRF9zY2NzW10gPSAiQCgjKWh3dC5jCTEuMTMgOTcvMDQvMjMgKEMpIFNLICIgOworI2VuZGlmCisKKy8qCisgKiBQcm90b3R5cGVzIG9mIGxvY2FsIGZ1bmN0aW9ucy4KKyAqLworLyogMjgtSnVuLTE5OTQgc3cgLSBOb3RlOiBod3RfcmVzdGFydCgpIGlzIGFsc28gdXNlZCBpbiBtb2R1bGUgJ2RydmZiaS5jJy4gKi8KKy8qc3RhdGljIHZvaWQgaHd0X3Jlc3RhcnQoKSA7ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglod3Rfc3RhcnQKKyAqCisgKglTdGFydCBoYXJkd2FyZSB0aW1lciAoY2xvY2sgdGlja3MgYXJlIDE2dXMpLgorICoKKyAqCXZvaWQgaHd0X3N0YXJ0KAorICoJCXN0cnVjdCBzX3NtYyAqc21jLAorICoJCXVfbG9uZyB0aW1lKSA7CisgKiBJbgorICoJc21jIC0gQSBwb2ludGVyIHRvIHRoZSBTTVQgQ29udGV4dCBzdHJ1Y3R1cmUuCisgKgorICoJdGltZSAtIFRoZSB0aW1lIGluIHVuaXRzIG9mIDE2dXMgdG8gbG9hZCB0aGUgdGltZXIgd2l0aC4KKyAqIE91dAorICoJTm90aGluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZQlIV1RfTUFYCSg2NTAwMCkKKwordm9pZCBod3Rfc3RhcnQoc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyB0aW1lKQoreworCXVfc2hvcnQJY250IDsKKworCWlmICh0aW1lID4gSFdUX01BWCkKKwkJdGltZSA9IEhXVF9NQVggOworCisJc21jLT5ody50X3N0YXJ0ID0gdGltZSA7CisJc21jLT5ody50X3N0b3AgPSAwTCA7CisKKwljbnQgPSAodV9zaG9ydCl0aW1lIDsKKwkvKgorCSAqIGlmIHRpbWUgPCAxNiB1cworCSAqCXRpbWUgPSAxNiB1cworCSAqLworCWlmICghY250KQorCQljbnQrKyA7CisjaWZuZGVmCVBDSQorCS8qCisJICogNi4yNU1IeiAtPiBDTEswIDogVDAgKGNudDAgPSAxNnVzKQktPiBPVVQwCisJICogICAgT1VUMCAtPiBDTEsxIDogVDEgKGNudDEpCU9VVDEJLT4gSVNSQShJU19USU1JTlQpCisJICovCisJT1VUXzgyYzU0X1RJTUVSKDMsMTw8NiB8IDM8PDQgfCAwPDwxKSA7CS8qIGNvdW50ZXIgMSwgbW9kZSAwICovCisJT1VUXzgyYzU0X1RJTUVSKDEsY250ICYgMHhmZikgOwkJLyogTFNCICovCisJT1VUXzgyYzU0X1RJTUVSKDEsKGNudD4+OCkgJiAweGZmKSA7CS8qIE1TQiAqLworCS8qCisJICogc3RhcnQgdGltZXIgYnkgc3dpdGNoaW5nIGNvdW50ZXIgMCB0byBtb2RlIDMKKwkgKglUMCByZXNvbHV0aW9uIDE2IHVzIChDTEswPTAuMTZ1cykKKwkgKi8KKwlPVVRfODJjNTRfVElNRVIoMywwPDw2IHwgMzw8NCB8IDM8PDEpIDsJLyogY291bnRlciAwLCBtb2RlIDMgKi8KKwlPVVRfODJjNTRfVElNRVIoMCwxMDApIDsJCS8qIExTQiAqLworCU9VVF84MmM1NF9USU1FUigwLDApIDsJCQkvKiBNU0IgKi8KKyNlbHNlCS8qIFBDSSAqLworCW91dHBkKEFERFIoQjJfVElfSU5JKSwgKHVfbG9uZykgY250ICogMjAwKSA7CS8qIExvYWQgdGltZXIgdmFsdWUuICovCisJb3V0cHcoQUREUihCMl9USV9DUlRMKSwgVElNX1NUQVJUKSA7CQkvKiBTdGFydCB0aW1lci4gKi8KKyNlbmRpZgkvKiBQQ0kgKi8KKwlzbWMtPmh3LnRpbWVyX2FjdGl2ID0gVFJVRSA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglod3Rfc3RvcAorICoKKyAqCVN0b3AgaGFyZHdhcmUgdGltZXIuCisgKgorICoJdm9pZCBod3Rfc3RvcCgKKyAqCQlzdHJ1Y3Qgc19zbWMgKnNtYykgOworICogSW4KKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIENvbnRleHQgc3RydWN0dXJlLgorICogT3V0CisgKglOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGh3dF9zdG9wKHN0cnVjdCBzX3NtYyAqc21jKQoreworI2lmbmRlZiBQQ0kKKwkvKiBzdG9wIGNvdW50ZXIgMCBieSBzd2l0Y2hpbmcgdG8gbW9kZSAwICovCisJT1VUXzgyYzU0X1RJTUVSKDMsMDw8NiB8IDM8PDQgfCAwPDwxKSA7CS8qIGNvdW50ZXIgMCwgbW9kZSAwICovCisJT1VUXzgyYzU0X1RJTUVSKDAsMCkgOwkJCS8qIExTQiAqLworCU9VVF84MmM1NF9USU1FUigwLDApIDsJCQkvKiBNU0IgKi8KKyNlbHNlCS8qIFBDSSAqLworCW91dHB3KEFERFIoQjJfVElfQ1JUTCksIFRJTV9TVE9QKSA7CisJb3V0cHcoQUREUihCMl9USV9DUlRMKSwgVElNX0NMX0lSUSkgOworI2VuZGlmCS8qIFBDSSAqLworCisJc21jLT5ody50aW1lcl9hY3RpdiA9IEZBTFNFIDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCWh3dF9pbml0CisgKgorICoJSW5pdGlhbGl6ZSBoYXJkd2FyZSB0aW1lci4KKyAqCisgKgl2b2lkIGh3dF9pbml0KAorICoJCXN0cnVjdCBzX3NtYyAqc21jKSA7CisgKiBJbgorICoJc21jIC0gQSBwb2ludGVyIHRvIHRoZSBTTVQgQ29udGV4dCBzdHJ1Y3R1cmUuCisgKiBPdXQKKyAqCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaHd0X2luaXQoc3RydWN0IHNfc21jICpzbWMpCit7CisJc21jLT5ody50X3N0YXJ0ID0gMCA7CisJc21jLT5ody50X3N0b3AJPSAwIDsKKwlzbWMtPmh3LnRpbWVyX2FjdGl2ID0gRkFMU0UgOworCisJaHd0X3Jlc3RhcnQoc21jKSA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglod3RfcmVzdGFydAorICoKKyAqCUNsZWFyIHRpbWVyIGludGVycnVwdC4KKyAqCisgKgl2b2lkIGh3dF9yZXN0YXJ0KAorICoJCXN0cnVjdCBzX3NtYyAqc21jKSA7CisgKiBJbgorICoJc21jIC0gQSBwb2ludGVyIHRvIHRoZSBTTVQgQ29udGV4dCBzdHJ1Y3R1cmUuCisgKiBPdXQKKyAqCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaHd0X3Jlc3RhcnQoc3RydWN0IHNfc21jICpzbWMpCit7CisJaHd0X3N0b3Aoc21jKSA7CisjaWZuZGVmCVBDSQorCU9VVF84MmM1NF9USU1FUigzLDE8PDYgfCAzPDw0IHwgMDw8MSkgOwkvKiBjb3VudGVyIDEsIG1vZGUgMCAqLworCU9VVF84MmM1NF9USU1FUigxLDEgKSA7CQkJLyogTFNCICovCisJT1VUXzgyYzU0X1RJTUVSKDEsMCApIDsJCQkvKiBNU0IgKi8KKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJaHd0X3JlYWQKKyAqCisgKglTdG9wIGhhcmR3YXJlIHRpbWVyIGFuZCByZWFkIHRpbWUgZWxhcHNlZCBzaW5jZSBsYXN0IHN0YXJ0LgorICoKKyAqCXVfbG9uZyBod3RfcmVhZChzbWMpIDsKKyAqIEluCisgKglzbWMgLSBBIHBvaW50ZXIgdG8gdGhlIFNNVCBDb250ZXh0IHN0cnVjdHVyZS4KKyAqIE91dAorICoJVGhlIGVsYXBzZWQgdGltZSBzaW5jZSBsYXN0IHN0YXJ0IGluIHVuaXRzIG9mIDE2dXMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3VfbG9uZyBod3RfcmVhZChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwl1X3Nob3J0CXRyIDsKKyNpZm5kZWYJUENJCisJdV9zaG9ydAlpcyA7CisjZWxzZQorCXVfbG9uZwlpcyA7CisjZW5kaWYKKworCWlmIChzbWMtPmh3LnRpbWVyX2FjdGl2KSB7CisJCWh3dF9zdG9wKHNtYykgOworI2lmbmRlZglQQ0kKKwkJT1VUXzgyYzU0X1RJTUVSKDMsMTw8NikgOwkvKiBsYXRjaCBjb21tYW5kICovCisJCXRyID0gSU5fODJjNTRfVElNRVIoMSkgJiAweGZmIDsKKwkJdHIgKz0gKElOXzgyYzU0X1RJTUVSKDEpICYgMHhmZik8PDggOworI2Vsc2UJLyogUENJICovCisJCXRyID0gKHVfc2hvcnQpKChpbnBkKEFERFIoQjJfVElfVkFMKSkvMjAwKSAmIDB4ZmZmZikgOworI2VuZGlmCS8qIFBDSSAqLworCQlpcyA9IEdFVF9JU1IoKSA7CisJCS8qIENoZWNrIGlmIHRpbWVyIGV4cGlyZWQgKG9yIHdyYXBhcm91bmQpLiAqLworCQlpZiAoKHRyID4gc21jLT5ody50X3N0YXJ0KSB8fCAoaXMgJiBJU19USU1JTlQpKSB7CisJCQlod3RfcmVzdGFydChzbWMpIDsKKwkJCXNtYy0+aHcudF9zdG9wID0gc21jLT5ody50X3N0YXJ0IDsKKwkJfQorCQllbHNlCisJCQlzbWMtPmh3LnRfc3RvcCA9IHNtYy0+aHcudF9zdGFydCAtIHRyIDsKKwl9CisJcmV0dXJuIChzbWMtPmh3LnRfc3RvcCkgOworfQorCisjaWZkZWYJUENJCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJaHd0X3F1aWNrX3JlYWQKKyAqCisgKglTdG9wIGhhcmR3YXJlIHRpbWVyIGFuZCByZWFkIHRpbWVyIHZhbHVlIGFuZCBzdGFydCB0aGUgdGltZXIgYWdhaW4uCisgKgorICoJdV9sb25nIGh3dF9yZWFkKHNtYykgOworICogSW4KKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIENvbnRleHQgc3RydWN0dXJlLgorICogT3V0CisgKgljdXJyZW50IHRpbWVyIHZhbHVlIGluIHVuaXRzIG9mIDgwbnMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3VfbG9uZyBod3RfcXVpY2tfcmVhZChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwl1X2xvbmcgaW50ZXJ2YWwgOworCXVfbG9uZyB0aW1lIDsKKworCWludGVydmFsID0gaW5wZChBRERSKEIyX1RJX0lOSSkpIDsKKwlvdXRwdyhBRERSKEIyX1RJX0NSVEwpLCBUSU1fU1RPUCkgOworCXRpbWUgPSBpbnBkKEFERFIoQjJfVElfVkFMKSkgOworCW91dHBkKEFERFIoQjJfVElfSU5JKSx0aW1lKSA7CisJb3V0cHcoQUREUihCMl9USV9DUlRMKSwgVElNX1NUQVJUKSA7CisJb3V0cGQoQUREUihCMl9USV9JTkkpLGludGVydmFsKSA7CisKKwlyZXR1cm4odGltZSkgOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJaHd0X3dhaXRfdGltZShzbWMsc3RhcnQsZHVyYXRpb24pCisgKgorICoJVGhpcyBmdW5jdGlvbiByZXR1cm5lcyBhZnRlciB0aGUgYW1vdW50IG9mIHRpbWUgaXMgZWxhcHNlZAorICoJc2luY2UgdGhlIHN0YXJ0IHRpbWUuCisgKiAKKyAqIHBhcmEJc3RhcnQJCXN0YXJ0IHRpbWUKKyAqCWR1cmF0aW9uCXRpbWUgdG8gd2FpdAorICoKKyAqIE5PVEU6IFRoZSBmdWN0aW9uIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LCBpZiB0aGUgdGltZXIgaXMgbm90IAorICoJIHN0YXJ0ZWQKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGh3dF93YWl0X3RpbWUoc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyBzdGFydCwgbG9uZyBpbnQgZHVyYXRpb24pCit7CisJbG9uZwlkaWZmIDsKKwlsb25nCWludGVydmFsIDsKKwlpbnQJd3JhcHBlZCA7CisKKwkvKgorCSAqIGNoZWNrIGlmIHRpbWVyIGlzIHJ1bm5pbmcKKwkgKi8KKwlpZiAoc21jLT5ody50aW1lcl9hY3RpdiA9PSBGQUxTRSB8fAorCQlod3RfcXVpY2tfcmVhZChzbWMpID09IGh3dF9xdWlja19yZWFkKHNtYykpIHsKKwkJcmV0dXJuIDsKKwl9CisKKwlpbnRlcnZhbCA9IGlucGQoQUREUihCMl9USV9JTkkpKSA7CisJaWYgKGludGVydmFsID4gZHVyYXRpb24pIHsKKwkJZG8geworCQkJZGlmZiA9IChsb25nKShzdGFydCAtIGh3dF9xdWlja19yZWFkKHNtYykpIDsKKwkJCWlmIChkaWZmIDwgMCkgeworCQkJCWRpZmYgKz0gaW50ZXJ2YWwgOworCQkJfQorCQl9IHdoaWxlIChkaWZmIDw9IGR1cmF0aW9uKSA7CisJfQorCWVsc2UgeworCQlkaWZmID0gaW50ZXJ2YWwgOworCQl3cmFwcGVkID0gMCA7CisJCWRvIHsKKwkJCWlmICghd3JhcHBlZCkgeworCQkJCWlmIChod3RfcXVpY2tfcmVhZChzbWMpID49IHN0YXJ0KSB7CisJCQkJCWRpZmYgKz0gaW50ZXJ2YWwgOworCQkJCQl3cmFwcGVkID0gMSA7CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJaWYgKGh3dF9xdWlja19yZWFkKHNtYykgPCBzdGFydCkgeworCQkJCQl3cmFwcGVkID0gMCA7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlIChkaWZmIDw9IGR1cmF0aW9uKSA7CisJfQorfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvbG5rc3RhdC5jIGIvZHJpdmVycy9uZXQvc2tmcC9sbmtzdGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBhMjQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvbG5rc3RhdC5jCkBAIC0wLDAgKzEsMjA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorCUlCTSBGRERJIHJlYWQgZXJyb3IgbG9nIGZ1bmN0aW9uCisqLworCisjaW5jbHVkZSAiaC90eXBlcy5oIgorI2luY2x1ZGUgImgvZmRkaS5oIgorI2luY2x1ZGUgImgvc21jLmgiCisjaW5jbHVkZSAiaC9sbmtzdGF0LmgiCisKKyNpZm5kZWYJbGludAorc3RhdGljIGNvbnN0IGNoYXIgSURfc2Njc1tdID0gIkAoIylsbmtzdGF0LmMJMS44IDk3LzA0LzExIChDKSBTSyAiIDsKKyNlbmRpZgorCisjaWZkZWYJc3VuCisjZGVmaW5lIF9mYXIKKyNlbmRpZgorCisjZGVmaW5lIEVMX0lTX09LKHgsbCkJKCgoKGludCkmKCgoc3RydWN0IHNfZXJyb3JfbG9nICopMCktPngpKSArIFwKKwkJCXNpemVvZihlci0+eCkpIDw9IGwpCisKKy8qCisJQkVHSU5fTUFOVUFMX0VOVFJZKGlmLGZ1bmM7b3RoZXJzOzExKQorCisJdV9sb25nIHNtdF9nZXRfZXJyb3Jfd29yZChzbWMpCisJc3RydWN0IHNfc21jICpzbWMgOworCitGdW5jdGlvbglET1dOQ0FMTAkoU01ULCBsbmtzdGF0LmMpCisJCVRoaXMgZnVuY3Rpb25zIHJldHVybnMgdGhlIFNNVCBlcnJvciB3b3JrIGZvciBBSVggZXZlbnRzLgorCitSZXR1cm4Jc210X2Vycm9yX3dvcmQJVGhlc2UgYml0cyBhcmUgc3VwcG9ydGVkOgorCisJCVNNVF9FUkxfQUxDCT09IAlbUFMvUEFdLmZkZGlQT1JUTGVyRmxhZworCQlTTVRfRVJMX0JMQwk9PQlbUEJdLmZkZGlQT1JUTGVyRmxhZworCQlTTVRfRVJMX05DQwk9PQlmZGRpTUFDTm90Q29waWVkRmxhZworCQlTTVRfRVJMX0ZFQwk9PQlmZGRpTUFDRnJhbWVFcnJvckZsYWcKKworCUVORF9NQU5VQUxfRU5UUlkoKQorICovCit1X2xvbmcgc210X2dldF9lcnJvcl93b3JkKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXVfbG9uZwlzdDsKKworCS8qCisJICogc210IGVycm9yIHdvcmQgbG93CisJICovCisJc3QgPSAwIDsKKwlpZiAoc21jLT5zLnNhcyA9PSBTTVRfU0FTKSB7CisJCWlmIChzbWMtPm1pYi5wW1BTXS5mZGRpUE9SVExlckZsYWcpCisJCQlzdCB8PSBTTVRfRVJMX0FMQyA7CisJfQorCWVsc2UgeworCQlpZiAoc21jLT5taWIucFtQQV0uZmRkaVBPUlRMZXJGbGFnKQorCQkJc3QgfD0gU01UX0VSTF9BTEMgOworCQlpZiAoc21jLT5taWIucFtQQl0uZmRkaVBPUlRMZXJGbGFnKQorCQkJc3QgfD0gU01UX0VSTF9CTEMgOworCX0KKwlpZiAoc21jLT5taWIubVtNQUMwXS5mZGRpTUFDTm90Q29waWVkRmxhZykKKwkJc3QgfD0gU01UX0VSTF9OQ0MgOwkJLyogbm90IGNvcGllZCBjb25kaXRpb24gKi8KKwlpZiAoc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRnJhbWVFcnJvckZsYWcpCisJCXN0IHw9IFNNVF9FUkxfRkVDIDsJCS8qIGZyYW1lIGVycm9yIGNvbmRpdGlvbiAqLworCisJcmV0dXJuIHN0OworfQorCisvKgorCUJFR0lOX01BTlVBTF9FTlRSWShpZixmdW5jO290aGVyczsxMSkKKworCXVfbG9uZyBzbXRfZ2V0X2V2ZW50X3dvcmQoc21jKQorCXN0cnVjdCBzX3NtYyAqc21jIDsKKworRnVuY3Rpb24JRE9XTkNBTEwJKFNNVCwgbG5rc3RhdC5jKQorCQlUaGlzIGZ1bmN0aW9ucyByZXR1cm5zIHRoZSBTTVQgZXZlbnQgd29yayBmb3IgQUlYIGV2ZW50cy4KKworUmV0dXJuCXNtdF9ldmVudF93b3JkCWFsd2F5cyAwCisKKwlFTkRfTUFOVUFMX0VOVFJZKCkKKyAqLwordV9sb25nIHNtdF9nZXRfZXZlbnRfd29yZChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlyZXR1cm4gKHVfbG9uZykgMDsKK30KKworLyoKKwlCRUdJTl9NQU5VQUxfRU5UUlkoaWYsZnVuYztvdGhlcnM7MTEpCisKKwl1X2xvbmcgc210X2dldF9wb3J0X2V2ZW50X3dvcmQoc21jKQorCXN0cnVjdCBzX3NtYyAqc21jIDsKKworRnVuY3Rpb24JRE9XTkNBTEwJKFNNVCwgbG5rc3RhdC5jKQorCQlUaGlzIGZ1bmN0aW9ucyByZXR1cm5zIHRoZSBTTVQgcG9ydCBldmVudCB3b3JrIGZvciBBSVggZXZlbnRzLgorCitSZXR1cm4Jc210X3BvcnRfZXZlbnRfd29yZAlhbHdheXMgMAorCisJRU5EX01BTlVBTF9FTlRSWSgpCisgKi8KK3VfbG9uZyBzbXRfZ2V0X3BvcnRfZXZlbnRfd29yZChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlyZXR1cm4gKHVfbG9uZykgMDsKK30KKworLyoKKwlCRUdJTl9NQU5VQUxfRU5UUlkoaWYsZnVuYztvdGhlcnM7MTEpCisKKwl1X2xvbmcgc210X3JlYWRfZXJyb3Jsb2coc21jLHAsbGVuKQorCXN0cnVjdCBzX3NtYyAqc21jIDsKKwljaGFyIF9mYXIgKnAgOworCWludCBsZW4gOworCitGdW5jdGlvbglET1dOQ0FMTAkoU01ULCBsbmtzdGF0LmMpCisJCVRoaXMgZnVuY3Rpb25zIHJldHVybnMgdGhlIFNNVCBlcnJvciBsb2cgZmllbGQgZm9yIEFJWCBldmVudHMuCisKK1BhcmEJcAlwb2ludGVyIHRvIHRoZSBlcnJvciBsb2cgZmllbGQKKwlsZW4JbGVuIG9mIHRoZSBlcnJvciBsb2cgZmllbGQKKworUmV0dXJuCWxlbgl1c2VkIGxlbiBvZiB0aGUgZXJyb3IgbG9nIGZpZWxkCisKKwlFTkRfTUFOVUFMX0VOVFJZKCkKKyAqLworaW50IHNtdF9yZWFkX2Vycm9ybG9nKHN0cnVjdCBzX3NtYyAqc21jLCBjaGFyIF9mYXIgKnAsIGludCBsZW4pCit7CisJaW50CQkJaSA7CisJaW50CQkJc3QgOworCXN0cnVjdCBzX2Vycm9yX2xvZyBfZmFyCSplciA7CisKKwllciA9IChzdHJ1Y3Qgc19lcnJvcl9sb2cgX2ZhciAqKSBwIDsKKwlpZiAobGVuID4gc2l6ZW9mKHN0cnVjdCBzX2Vycm9yX2xvZykpCisJCWxlbiA9IHNpemVvZihzdHJ1Y3Qgc19lcnJvcl9sb2cpIDsKKwlmb3IgKGkgPSAwIDsgaSA8IGxlbiA7IGkrKykKKwkJKnArKyA9IDAgOworCS8qCisJICogc2V0IGNvdW50CisJICovCisJaWYgKEVMX0lTX09LKHNldF9jb3VudF9oaWdoLGxlbikpIHsKKwkJZXItPnNldF9jb3VudF9sb3cgPSAodV9zaG9ydClzbWMtPm1pYi5mZGRpU01UU2V0Q291bnQuY291bnQgOworCQllci0+c2V0X2NvdW50X2hpZ2ggPQorCQkJKHVfc2hvcnQpKHNtYy0+bWliLmZkZGlTTVRTZXRDb3VudC5jb3VudCA+PiAxNkwpIDsKKwl9CisJLyoKKwkgKiBhY2kKKwkgKi8KKwlpZiAoRUxfSVNfT0soYWNpX2lkX2NvZGUsbGVuKSkgeworCQllci0+YWNpX2lkX2NvZGUgPSAwIDsKKwl9CisJLyoKKwkgKiBwdXJnZSBjb3VudGVyIGlzIG1pc3NlZCBmcmFtZXM7IDE2IGJpdHMgb25seQorCSAqLworCWlmIChFTF9JU19PSyhwdXJnZV9mcmFtZV9jb3VudGVyLGxlbikpIHsKKwkJaWYgKHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0NvcGllZF9DdCA+IDB4ZmZmZikKKwkJCWVyLT5wdXJnZV9mcmFtZV9jb3VudGVyID0gMHhmZmZmIDsKKwkJZWxzZQorCQkJZXItPnB1cmdlX2ZyYW1lX2NvdW50ZXIgPQorCQkJCSh1X3Nob3J0KXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0NvcGllZF9DdCA7CisJfQorCS8qCisJICogQ01UIGFuZCBSTVQgc3RhdGUgbWFjaGluZXMKKwkgKi8KKwlpZiAoRUxfSVNfT0soZWNtX3N0YXRlLGxlbikpCisJCWVyLT5lY21fc3RhdGUgPSBzbWMtPm1pYi5mZGRpU01URUNNU3RhdGUgOworCisJaWYgKEVMX0lTX09LKHBjbV9iX3N0YXRlLGxlbikpIHsKKwkJaWYgKHNtYy0+cy5zYXMgPT0gU01UX1NBUykgeworCQkJZXItPnBjbV9hX3N0YXRlID0gc21jLT55W1BTXS5taWItPmZkZGlQT1JUUENNU3RhdGUgOworCQkJZXItPnBjbV9iX3N0YXRlID0gMCA7CisJCX0KKwkJZWxzZSB7CisJCQllci0+cGNtX2Ffc3RhdGUgPSBzbWMtPnlbUEFdLm1pYi0+ZmRkaVBPUlRQQ01TdGF0ZSA7CisJCQllci0+cGNtX2Jfc3RhdGUgPSBzbWMtPnlbUEJdLm1pYi0+ZmRkaVBPUlRQQ01TdGF0ZSA7CisJCX0KKwl9CisJaWYgKEVMX0lTX09LKGNmbV9zdGF0ZSxsZW4pKQorCQllci0+Y2ZtX3N0YXRlID0gc21jLT5taWIuZmRkaVNNVENGX1N0YXRlIDsKKwlpZiAoRUxfSVNfT0socm10X3N0YXRlLGxlbikpCisJCWVyLT5ybXRfc3RhdGUgPSBzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNSTVRTdGF0ZSA7CisKKwkvKgorCSAqIHNtdCBlcnJvciB3b3JkIGxvdyAod2Ugb25seSBuZWVkIHRoZSBsb3cgb3JkZXIgMTYgYml0cy4pCisJICovCisKKwlzdCA9IHNtdF9nZXRfZXJyb3Jfd29yZChzbWMpICYgMHhmZmZmIDsKKworCWlmIChFTF9JU19PSyhzbXRfZXJyb3JfbG93LGxlbikpCisJCWVyLT5zbXRfZXJyb3JfbG93ID0gc3QgOworCisJaWYgKEVMX0lTX09LKHVjb2RlX3ZlcnNpb25fbGV2ZWwsbGVuKSkKKwkJZXItPnVjb2RlX3ZlcnNpb25fbGV2ZWwgPSAweDAxMDEgOworCXJldHVybihsZW4pIDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9wY21wbGMuYyBiL2RyaXZlcnMvbmV0L3NrZnAvcGNtcGxjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcxZjA1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvcGNtcGxjLmMKQEAgLTAsMCArMSwyMDI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorCVBDTQorCVBoeXNpY2FsIENvbm5lY3Rpb24gTWFuYWdlbWVudAorKi8KKworLyoKKyAqIEhhcmR3YXJlIGluZGVwZW5kZW50IHN0YXRlIG1hY2hpbmUgaW1wbGVtYW50YXRpb24KKyAqIFRoZSBmb2xsb3dpbmcgZXh0ZXJuYWwgU01UIGZ1bmN0aW9ucyBhcmUgcmVmZXJlbmNlZCA6CisgKgorICogCQlxdWV1ZV9ldmVudCgpCisgKiAJCXNtdF90aW1lcl9zdGFydCgpCisgKiAJCXNtdF90aW1lcl9zdG9wKCkKKyAqCisgKiAJVGhlIGZvbGxvd2luZyBleHRlcm5hbCBIVyBkZXBlbmRlbnQgZnVuY3Rpb25zIGFyZSByZWZlcmVuY2VkIDoKKyAqIAkJc21fcG1fY29udHJvbCgpCisgKgkJc21fcGhfbGluZXN0YXRlKCkKKyAqCQlzbV9wbV9sc19sYXRjaCgpCisgKgorICogCVRoZSBmb2xsb3dpbmcgSFcgZGVwZW5kZW50IGV2ZW50cyBhcmUgcmVxdWlyZWQgOgorICoJCVBDX1FMUworICoJCVBDX0lMUworICoJCVBDX0hMUworICoJCVBDX01MUworICoJCVBDX05TRQorICoJCVBDX0xFTQorICoKKyAqLworCisKKyNpbmNsdWRlICJoL3R5cGVzLmgiCisjaW5jbHVkZSAiaC9mZGRpLmgiCisjaW5jbHVkZSAiaC9zbWMuaCIKKyNpbmNsdWRlICJoL3N1cGVybl8yLmgiCisjZGVmaW5lIEtFUk5FTAorI2luY2x1ZGUgImgvc210c3RhdGUuaCIKKworI2lmbmRlZglsaW50CitzdGF0aWMgY29uc3QgY2hhciBJRF9zY2NzW10gPSAiQCgjKXBjbXBsYy5jCTIuNTUgOTkvMDgvMDUgKEMpIFNLICIgOworI2VuZGlmCisKKyNpZmRlZglGRERJX01JQgorZXh0ZXJuIGludCBzbm1wX2ZkZGlfdHJhcCgKKyNpZmRlZglBTlNJQworc3RydWN0IHNfc21jCSogc21jLCBpbnQgIHR5cGUsIGludCAgaW5kZXgKKyNlbmRpZgorKTsKKyNlbmRpZgorI2lmZGVmCUNPTkNFTlRSQVRPUgorZXh0ZXJuIGludCBwbGNfaXNfaW5zdGFsbGVkKAorI2lmZGVmCUFOU0lDCitzdHJ1Y3Qgc19zbWMgKnNtYyAsCitpbnQgcAorI2VuZGlmCispIDsKKyNlbmRpZgorLyoKKyAqIEZTTSBNYWNyb3MKKyAqLworI2RlZmluZSBBRkxBRwkJKDB4MjApCisjZGVmaW5lIEdPX1NUQVRFKHgpCShtaWItPmZkZGlQT1JUUENNU3RhdGUgPSAoeCl8QUZMQUcpCisjZGVmaW5lIEFDVElPTlNfRE9ORSgpCShtaWItPmZkZGlQT1JUUENNU3RhdGUgJj0gfkFGTEFHKQorI2RlZmluZSBBQ1RJT05TKHgpCSh4fEFGTEFHKQorCisvKgorICogUENNIHN0YXRlcworICovCisjZGVmaW5lIFBDMF9PRkYJCQkwCisjZGVmaW5lIFBDMV9CUkVBSwkJMQorI2RlZmluZSBQQzJfVFJBQ0UJCTIKKyNkZWZpbmUgUEMzX0NPTk5FQ1QJCTMKKyNkZWZpbmUgUEM0X05FWFQJCTQKKyNkZWZpbmUgUEM1X1NJR05BTAkJNQorI2RlZmluZSBQQzZfSk9JTgkJNgorI2RlZmluZSBQQzdfVkVSSUZZCQk3CisjZGVmaW5lIFBDOF9BQ1RJVkUJCTgKKyNkZWZpbmUgUEM5X01BSU5UCQk5CisKKyNpZmRlZglERUJVRworLyoKKyAqIHN5bWJvbGljIHN0YXRlIG5hbWVzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNtX3N0YXRlc1tdID0gIHsKKwkiUEMwX09GRiIsIlBDMV9CUkVBSyIsIlBDMl9UUkFDRSIsIlBDM19DT05ORUNUIiwiUEM0X05FWFQiLAorCSJQQzVfU0lHTkFMIiwiUEM2X0pPSU4iLCJQQzdfVkVSSUZZIiwiUEM4X0FDVElWRSIsIlBDOV9NQUlOVCIKK30gOworCisvKgorICogc3ltYm9saWMgZXZlbnQgbmFtZXMKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwY21fZXZlbnRzW10gPSB7CisJIk5PTkUiLCJQQ19TVEFSVCIsIlBDX1NUT1AiLCJQQ19MT09QIiwiUENfSk9JTiIsIlBDX1NJR05BTCIsCisJIlBDX1JFSkVDVCIsIlBDX01BSU5UIiwiUENfVFJBQ0UiLCJQQ19QRFIiLAorCSJQQ19FTkFCTEUiLCJQQ19ESVNBQkxFIiwKKwkiUENfUUxTIiwiUENfSUxTIiwiUENfTUxTIiwiUENfSExTIiwiUENfTFNfUERSIiwiUENfTFNfTk9ORSIsCisJIlBDX1RJTUVPVVRfVEJfTUFYIiwiUENfVElNRU9VVF9UQl9NSU4iLAorCSJQQ19USU1FT1VUX0NfTUlOIiwiUENfVElNRU9VVF9UX09VVCIsCisJIlBDX1RJTUVPVVRfVExfTUlOIiwiUENfVElNRU9VVF9UX05FWFQiLCJQQ19USU1FT1VUX0xDVCIsCisJIlBDX05TRSIsIlBDX0xFTSIKK30gOworI2VuZGlmCisKKyNpZmRlZglNT1RfRUxNCisvKgorICogUENMLVMgY29udHJvbCByZWdpc3RlcgorICogdGhpcyByZWdpc3RlciBpbiB0aGUgUExDLVMgY29udHJvbHMgdGhlIHNjcmFtYmxpbmcgcGFyYW1ldGVycworICovCisjZGVmaW5lIFBMQ1NfQ09OVFJPTF9DX1UJMAorI2RlZmluZSBQTENTX0NPTlRST0xfQ19TCShQTF9DX1NET0ZGX0VOQUJMRSB8IFBMX0NfU0RPTl9FTkFCTEUgfCBcCisJCQkJIFBMX0NfQ0lQSEVSX0VOQUJMRSkKKyNkZWZpbmUJUExDU19GQVNTRVJUX1UJCTAKKyNkZWZpbmUJUExDU19GQVNTRVJUX1MJCTB4RmQ3NgkvKiA1Mi4wIHVzICovCisjZGVmaW5lCVBMQ1NfRkRFQVNTRVJUX1UJMAorI2RlZmluZQlQTENTX0ZERUFTU0VSVF9TCTAKKyNlbHNlCS8qIG5NT1RfRUxNICovCisvKgorICogUENMLVMgY29udHJvbCByZWdpc3RlcgorICogdGhpcyByZWdpc3RlciBpbiB0aGUgUExDLVMgY29udHJvbHMgdGhlIHNjcmFtYmxpbmcgcGFyYW1ldGVycworICogY2FuIGJlIHBhdGNoZWQgZm9yIEFOU0kgY29tcGxpYW5jZSBpZiBzdGFuZGFyZCBjaGFuZ2VzCisgKi8KK3N0YXRpYyBjb25zdCB1X2NoYXIgcGxjc19jb250cm9sX2NfdVsxN10gPSAiUExDX0NOVFJMX0NfVT1cMFwwIiA7CitzdGF0aWMgY29uc3QgdV9jaGFyIHBsY3NfY29udHJvbF9jX3NbMTddID0gIlBMQ19DTlRSTF9DX1M9XDAxXDAyIiA7CisKKyNkZWZpbmUgUExDU19DT05UUk9MX0NfVSAocGxjc19jb250cm9sX2NfdVsxNF0gfCAocGxjc19jb250cm9sX2NfdVsxNV08PDgpKQorI2RlZmluZSBQTENTX0NPTlRST0xfQ19TIChwbGNzX2NvbnRyb2xfY19zWzE0XSB8IChwbGNzX2NvbnRyb2xfY19zWzE1XTw8OCkpCisjZW5kaWYJLyogbk1PVF9FTE0gKi8KKworLyoKKyAqIGV4dGVybmFsIHZhcnMKKyAqLworLyogc3RydWN0IGRlZmluaXRpb24gc2VlICdjbXRkZWYuaCcgKGFsc28gdXNlZCBieSBDRk0pICovCisKKyNkZWZpbmUgUFNfT0ZGCQkwCisjZGVmaW5lIFBTX0JJVDMJCTEKKyNkZWZpbmUgUFNfQklUNAkJMgorI2RlZmluZSBQU19CSVQ3CQkzCisjZGVmaW5lIFBTX0xDVAkJNAorI2RlZmluZSBQU19CSVQ4CQk1CisjZGVmaW5lIFBTX0pPSU4JCTYKKyNkZWZpbmUgUFNfQUNUSVZFCTcKKworI2RlZmluZSBMQ1RfTEVNX01BWAkyNTUKKworLyoKKyAqIFBMQyB0aW1pbmcgcGFyYW1ldGVyCisgKi8KKworI2RlZmluZSBQTENfTVMobSkJKChpbnQpKCgweDEwMDAwTC0obSoxMDAwMDBMLzIwNDgpKSkpCisjZGVmaW5lIFNMT1dfVExfTUlOCVBMQ19NUyg2KQorI2RlZmluZSBTTE9XX0NfTUlOCVBMQ19NUygxMCkKKworc3RhdGljCWNvbnN0IHN0cnVjdCBwbHQgeworCWludAl0aW1lciA7CQkJLyogcmVsYXRpdmUgcGxjIHRpbWVyIGFkZHJlc3MgKi8KKwlpbnQJcGFyYSA7CQkJLyogZGVmYXVsdCB0aW1pbmcgcGFyYW1ldGVycyAqLworfSBwbHRtW10gPSB7CisJeyBQTF9DX01JTiwgU0xPV19DX01JTiB9LAkvKiBtaW4gdC4gdG8gcmVtYWluIENvbm5lY3QgU3RhdGUgKi8KKwl7IFBMX1RMX01JTiwgU0xPV19UTF9NSU4gfSwJLyogbWluIHQuIHRvIHRyYW5zbWl0IGEgTGluZSBTdGF0ZSAqLworCXsgUExfVEJfTUlOLCBUUF9UQl9NSU4gfSwJLyogbWluIGJyZWFrIHRpbWUgKi8KKwl7IFBMX1RfT1VULCBUUF9UX09VVCB9LAkJLyogU2lnbmFsaW5nIHRpbWVvdXQgKi8KKwl7IFBMX0xDX0xFTkdUSCwgVFBfTENfTEVOR1RIIH0sCS8qIExpbmsgQ29uZmlkZW5jZSBUZXN0IFRpbWUgKi8KKwl7IFBMX1RfU0NSVUIsIFRQX1RfU0NSVUIgfSwJLyogU2NydWIgVGltZSA9PSBNQUMgVFZYIHRpbWUgISAqLworCXsgUExfTlNfTUFYLCBUUF9OU19NQVggfSwJLyogbWF4IHQuIHRoYXQgbm9pc2UgaXMgdG9sZXJhdGVkICovCisJeyAwLDAgfQorfSA7CisKKy8qCisgKiBpbnRlcnJ1cHQgbWFzaworICovCisjaWZkZWYJU1VQRVJORVRfMworLyoKKyAqIERvIHdlIG5lZWQgdGhlIEVCVUYgZXJyb3IgZHVyaW5nIHNpZ25hbGluZywgdG9vLCB0byBkZXRlY3QgU1VQRVJORVRfMworICogUExMIGJ1Zz8KKyAqLworc3RhdGljIGludCBwbGNfaW1za19uYSA9IFBMX1BDTV9DT0RFIHwgUExfVFJBQ0VfUFJPUCB8IFBMX1BDTV9CUkVBSyB8CisJCQlQTF9QQ01fRU5BQkxFRCB8IFBMX1NFTEZfVEVTVCB8IFBMX0VCVUZfRVJSOworI2Vsc2UJLyogU1VQRVJORVRfMyAqLworLyoKKyAqIFdlIGRvIE5PVCBuZWVkIHRoZSBlbGFzdGljaXR5IGJ1ZmZlciBlcnJvciBkdXJpbmcgc2lnbmFsaW5nLgorICovCitzdGF0aWMgaW50IHBsY19pbXNrX25hID0gUExfUENNX0NPREUgfCBQTF9UUkFDRV9QUk9QIHwgUExfUENNX0JSRUFLIHwKKwkJCVBMX1BDTV9FTkFCTEVEIHwgUExfU0VMRl9URVNUIDsKKyNlbmRpZgkvKiBTVVBFUk5FVF8zICovCitzdGF0aWMgaW50IHBsY19pbXNrX2FjdCA9IFBMX1BDTV9DT0RFIHwgUExfVFJBQ0VfUFJPUCB8IFBMX1BDTV9CUkVBSyB8CisJCQlQTF9QQ01fRU5BQkxFRCB8IFBMX1NFTEZfVEVTVCB8IFBMX0VCVUZfRVJSOworCisvKiBleHRlcm5hbCBmdW5jdGlvbnMgKi8KK3ZvaWQgYWxsX3NlbGVjdGlvbl9jcml0ZXJpYShzdHJ1Y3Qgc19zbWMgKnNtYyk7CisKKy8qIGludGVybmFsIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgcGNtX2ZzbShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNfcGh5ICpwaHksIGludCBjbWQpOworc3RhdGljIHZvaWQgcGNfcmNvZGVfYWN0aW9ucyhzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGJpdCwgc3RydWN0IHNfcGh5ICpwaHkpOworc3RhdGljIHZvaWQgcGNfdGNvZGVfYWN0aW9ucyhzdHJ1Y3Qgc19zbWMgKnNtYywgY29uc3QgaW50IGJpdCwgc3RydWN0IHNfcGh5ICpwaHkpOworc3RhdGljIHZvaWQgcmVzZXRfbGVtX3N0cnVjdChzdHJ1Y3Qgc19waHkgKnBoeSk7CitzdGF0aWMgdm9pZCBwbGNfaW5pdChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHApOworc3RhdGljIHZvaWQgc21fcGhfbGVtX3N0YXJ0KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbnAsIGludCB0aHJlc2hvbGQpOworc3RhdGljIHZvaWQgc21fcGhfbGVtX3N0b3Aoc3RydWN0IHNfc21jICpzbWMsIGludCBucCk7CitzdGF0aWMgdm9pZCBzbV9waF9saW5lc3RhdGUoc3RydWN0IHNfc21jICpzbWMsIGludCBwaHksIGludCBscyk7CitzdGF0aWMgdm9pZCByZWFsX2luaXRfcGxjKHN0cnVjdCBzX3NtYyAqc21jKTsKKworLyoKKyAqIFNNVCB0aW1lciBpbnRlcmZhY2UKKyAqICAgICAgc3RhcnQgUENNIHRpbWVyIDAKKyAqLworc3RhdGljIHZvaWQgc3RhcnRfcGNtX3RpbWVyMChzdHJ1Y3Qgc19zbWMgKnNtYywgdV9sb25nIHZhbHVlLCBpbnQgZXZlbnQsCisJCQkgICAgIHN0cnVjdCBzX3BoeSAqcGh5KQoreworCXBoeS0+dGltZXIwX2V4cCA9IEZBTFNFIDsgICAgICAgLyogY2xlYXIgdGltZXIgZXZlbnQgZmxhZyAqLworCXNtdF90aW1lcl9zdGFydChzbWMsJnBoeS0+cGNtX3RpbWVyMCx2YWx1ZSwKKwkJRVZfVE9LRU4oRVZFTlRfUENNK3BoeS0+bnAsZXZlbnQpKSA7Cit9CisvKgorICogU01UIHRpbWVyIGludGVyZmFjZQorICogICAgICBzdG9wIFBDTSB0aW1lciAwCisgKi8KK3N0YXRpYyB2b2lkIHN0b3BfcGNtX3RpbWVyMChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNfcGh5ICpwaHkpCit7CisJaWYgKHBoeS0+cGNtX3RpbWVyMC50bV9hY3RpdmUpCisJCXNtdF90aW1lcl9zdG9wKHNtYywmcGh5LT5wY21fdGltZXIwKSA7Cit9CisKKy8qCisJaW5pdCBQQ00gc3RhdGUgbWFjaGluZSAoY2FsbGVkIGJ5IGRyaXZlcikKKwljbGVhciBhbGwgUENNIHZhcnMgYW5kIGZsYWdzCisqLwordm9pZCBwY21faW5pdChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlpbnQJCWkgOworCWludAkJbnAgOworCXN0cnVjdCBzX3BoeQkqcGh5IDsKKwlzdHJ1Y3QgZmRkaV9taWJfcAkqbWliIDsKKworCWZvciAobnAgPSAwLHBoeSA9IHNtYy0+eSA7IG5wIDwgTlVNUEhZUyA7IG5wKysscGh5KyspIHsKKwkJLyogSW5kaWNhdGVzIHRoZSB0eXBlIG9mIFBIWSBiZWluZyB1c2VkICovCisJCW1pYiA9IHBoeS0+bWliIDsKKwkJbWliLT5mZGRpUE9SVFBDTVN0YXRlID0gQUNUSU9OUyhQQzBfT0ZGKSA7CisJCXBoeS0+bnAgPSBucCA7CisJCXN3aXRjaCAoc21jLT5zLnNhcykgeworI2lmZGVmCUNPTkNFTlRSQVRPUgorCQljYXNlIFNNVF9TQVMgOgorCQkJbWliLT5mZGRpUE9SVE15X1R5cGUgPSAobnAgPT0gUFMpID8gVFMgOiBUTSA7CisJCQlicmVhayA7CisJCWNhc2UgU01UX0RBUyA6CisJCQltaWItPmZkZGlQT1JUTXlfVHlwZSA9IChucCA9PSBQQSkgPyBUQSA6CisJCQkJCShucCA9PSBQQikgPyBUQiA6IFRNIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSBTTVRfTkFDIDoKKwkJCW1pYi0+ZmRkaVBPUlRNeV9UeXBlID0gVE0gOworCQkJYnJlYWs7CisjZWxzZQorCQljYXNlIFNNVF9TQVMgOgorCQkJbWliLT5mZGRpUE9SVE15X1R5cGUgPSAobnAgPT0gUFMpID8gVFMgOiBUTk9ORSA7CisJCQltaWItPmZkZGlQT1JUSGFyZHdhcmVQcmVzZW50ID0gKG5wID09IFBTKSA/IFRSVUUgOgorCQkJCQlGQUxTRSA7CisjaWZuZGVmCVNVUEVSTkVUXzMKKwkJCXNtYy0+eVtQQV0ubWliLT5mZGRpUE9SVFBDTVN0YXRlID0gUEMwX09GRiA7CisjZWxzZQorCQkJc21jLT55W1BCXS5taWItPmZkZGlQT1JUUENNU3RhdGUgPSBQQzBfT0ZGIDsKKyNlbmRpZgorCQkJYnJlYWsgOworCQljYXNlIFNNVF9EQVMgOgorCQkJbWliLT5mZGRpUE9SVE15X1R5cGUgPSAobnAgPT0gUEIpID8gVEIgOiBUQSA7CisJCQlicmVhayA7CisjZW5kaWYKKwkJfQorCQkvKgorCQkgKiBzZXQgUE1ELXR5cGUKKwkJICovCisJCXBoeS0+cG1kX3NjcmFtYmxlID0gMCA7CisJCXN3aXRjaCAocGh5LT5wbWRfdHlwZVtQTURfU0tfUE1EXSkgeworCQljYXNlICdQJyA6CisJCQltaWItPmZkZGlQT1JUUE1EQ2xhc3MgPSBNSUJfUE1EQ0xBU1NfTVVMVEkgOworCQkJYnJlYWsgOworCQljYXNlICdMJyA6CisJCQltaWItPmZkZGlQT1JUUE1EQ2xhc3MgPSBNSUJfUE1EQ0xBU1NfTENGIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnRCcgOgorCQkJbWliLT5mZGRpUE9SVFBNRENsYXNzID0gTUlCX1BNRENMQVNTX1RQIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnUycgOgorCQkJbWliLT5mZGRpUE9SVFBNRENsYXNzID0gTUlCX1BNRENMQVNTX1RQIDsKKwkJCXBoeS0+cG1kX3NjcmFtYmxlID0gVFJVRSA7CisJCQlicmVhayA7CisJCWNhc2UgJ1UnIDoKKwkJCW1pYi0+ZmRkaVBPUlRQTURDbGFzcyA9IE1JQl9QTURDTEFTU19UUCA7CisJCQlwaHktPnBtZF9zY3JhbWJsZSA9IFRSVUUgOworCQkJYnJlYWsgOworCQljYXNlICcxJyA6CisJCQltaWItPmZkZGlQT1JUUE1EQ2xhc3MgPSBNSUJfUE1EQ0xBU1NfU0lOR0xFMSA7CisJCQlicmVhayA7CisJCWNhc2UgJzInIDoKKwkJCW1pYi0+ZmRkaVBPUlRQTURDbGFzcyA9IE1JQl9QTURDTEFTU19TSU5HTEUyIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnMycgOgorCQkJbWliLT5mZGRpUE9SVFBNRENsYXNzID0gTUlCX1BNRENMQVNTX1NJTkdMRTIgOworCQkJYnJlYWsgOworCQljYXNlICc0JyA6CisJCQltaWItPmZkZGlQT1JUUE1EQ2xhc3MgPSBNSUJfUE1EQ0xBU1NfU0lOR0xFMSA7CisJCQlicmVhayA7CisJCWNhc2UgJ0gnIDoKKwkJCW1pYi0+ZmRkaVBPUlRQTURDbGFzcyA9IE1JQl9QTURDTEFTU19VTktOT1dOIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnSScgOgorCQkJbWliLT5mZGRpUE9SVFBNRENsYXNzID0gTUlCX1BNRENMQVNTX1RQIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnRycgOgorCQkJbWliLT5mZGRpUE9SVFBNRENsYXNzID0gTUlCX1BNRENMQVNTX1RQIDsKKwkJCWJyZWFrIDsKKwkJZGVmYXVsdDoKKwkJCW1pYi0+ZmRkaVBPUlRQTURDbGFzcyA9IE1JQl9QTURDTEFTU19VTktOT1dOIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKgorCQkgKiBBIGFuZCBCIHBvcnQgY2FuIGJlIG9uIHByaW1hcnkgYW5kIHNlY29uZGFyeSBwYXRoCisJCSAqLworCQlzd2l0Y2ggKG1pYi0+ZmRkaVBPUlRNeV9UeXBlKSB7CisJCWNhc2UgVEEgOgorCQkJbWliLT5mZGRpUE9SVEF2YWlsYWJsZVBhdGhzIHw9IE1JQl9QQVRIX1MgOworCQkJbWliLT5mZGRpUE9SVFJlcXVlc3RlZFBhdGhzWzFdID0gTUlCX1BfUEFUSF9MT0NBTCA7CisJCQltaWItPmZkZGlQT1JUUmVxdWVzdGVkUGF0aHNbMl0gPQorCQkJCU1JQl9QX1BBVEhfTE9DQUwgfAorCQkJCU1JQl9QX1BBVEhfQ09OX0FMVEVSIHwKKwkJCQlNSUJfUF9QQVRIX1NFQ19QUkVGRVIgOworCQkJbWliLT5mZGRpUE9SVFJlcXVlc3RlZFBhdGhzWzNdID0KKwkJCQlNSUJfUF9QQVRIX0xPQ0FMIHwKKwkJCQlNSUJfUF9QQVRIX0NPTl9BTFRFUiB8CisJCQkJTUlCX1BfUEFUSF9TRUNfUFJFRkVSIHwKKwkJCQlNSUJfUF9QQVRIX1RIUlUgOworCQkJYnJlYWsgOworCQljYXNlIFRCIDoKKwkJCW1pYi0+ZmRkaVBPUlRBdmFpbGFibGVQYXRocyB8PSBNSUJfUEFUSF9TIDsKKwkJCW1pYi0+ZmRkaVBPUlRSZXF1ZXN0ZWRQYXRoc1sxXSA9IE1JQl9QX1BBVEhfTE9DQUwgOworCQkJbWliLT5mZGRpUE9SVFJlcXVlc3RlZFBhdGhzWzJdID0KKwkJCQlNSUJfUF9QQVRIX0xPQ0FMIHwKKwkJCQlNSUJfUF9QQVRIX1BSSU1fUFJFRkVSIDsKKwkJCW1pYi0+ZmRkaVBPUlRSZXF1ZXN0ZWRQYXRoc1szXSA9CisJCQkJTUlCX1BfUEFUSF9MT0NBTCB8CisJCQkJTUlCX1BfUEFUSF9QUklNX1BSRUZFUiB8CisJCQkJTUlCX1BfUEFUSF9DT05fUFJFRkVSIHwKKwkJCQlNSUJfUF9QQVRIX1RIUlUgOworCQkJYnJlYWsgOworCQljYXNlIFRTIDoKKwkJCW1pYi0+ZmRkaVBPUlRBdmFpbGFibGVQYXRocyB8PSBNSUJfUEFUSF9TIDsKKwkJCW1pYi0+ZmRkaVBPUlRSZXF1ZXN0ZWRQYXRoc1sxXSA9IE1JQl9QX1BBVEhfTE9DQUwgOworCQkJbWliLT5mZGRpUE9SVFJlcXVlc3RlZFBhdGhzWzJdID0KKwkJCQlNSUJfUF9QQVRIX0xPQ0FMIHwKKwkJCQlNSUJfUF9QQVRIX0NPTl9BTFRFUiB8CisJCQkJTUlCX1BfUEFUSF9QUklNX1BSRUZFUiA7CisJCQltaWItPmZkZGlQT1JUUmVxdWVzdGVkUGF0aHNbM10gPQorCQkJCU1JQl9QX1BBVEhfTE9DQUwgfAorCQkJCU1JQl9QX1BBVEhfQ09OX0FMVEVSIHwKKwkJCQlNSUJfUF9QQVRIX1BSSU1fUFJFRkVSIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSBUTSA6CisJCQltaWItPmZkZGlQT1JUUmVxdWVzdGVkUGF0aHNbMV0gPSBNSUJfUF9QQVRIX0xPQ0FMIDsKKwkJCW1pYi0+ZmRkaVBPUlRSZXF1ZXN0ZWRQYXRoc1syXSA9CisJCQkJTUlCX1BfUEFUSF9MT0NBTCB8CisJCQkJTUlCX1BfUEFUSF9TRUNfQUxURVIgfAorCQkJCU1JQl9QX1BBVEhfUFJJTV9BTFRFUiA7CisJCQltaWItPmZkZGlQT1JUUmVxdWVzdGVkUGF0aHNbM10gPSAwIDsKKwkJCWJyZWFrIDsKKwkJfQorCisJCXBoeS0+cGNfbGVtX2ZhaWwgPSBGQUxTRSA7CisJCW1pYi0+ZmRkaVBPUlRQQ01TdGF0ZVggPSBtaWItPmZkZGlQT1JUUENNU3RhdGUgOworCQltaWItPmZkZGlQT1JUTENURmFpbF9DdCA9IDAgOworCQltaWItPmZkZGlQT1JUQlNfRmxhZyA9IDAgOworCQltaWItPmZkZGlQT1JUQ3VycmVudFBhdGggPSBNSUJfUEFUSF9JU09MQVRFRCA7CisJCW1pYi0+ZmRkaVBPUlROZWlnaGJvclR5cGUgPSBUTk9ORSA7CisJCXBoeS0+bHNfZmxhZyA9IDAgOworCQlwaHktPnJjX2ZsYWcgPSAwIDsKKwkJcGh5LT50Y19mbGFnID0gMCA7CisJCXBoeS0+dGRfZmxhZyA9IDAgOworCQlpZiAobnAgPj0gUE0pCisJCQlwaHktPnBoeV9uYW1lID0gJzAnICsgbnAgLSBQTSA7CisJCWVsc2UKKwkJCXBoeS0+cGh5X25hbWUgPSAnQScgKyBucCA7CisJCXBoeS0+d2NfZmxhZyA9IEZBTFNFIDsJCS8qIHNldCBieSBTTVQgKi8KKwkJbWVtc2V0KChjaGFyICopJnBoeS0+bGVtLDAsc2l6ZW9mKHN0cnVjdCBsZW1fY291bnRlcikpIDsKKwkJcmVzZXRfbGVtX3N0cnVjdChwaHkpIDsKKwkJbWVtc2V0KChjaGFyICopJnBoeS0+cGxjLDAsc2l6ZW9mKHN0cnVjdCBzX3BsYykpIDsKKwkJcGh5LT5wbGMucF9zdGF0ZSA9IFBTX09GRiA7CisJCWZvciAoaSA9IDAgOyBpIDwgTlVNQklUUyA7IGkrKykgeworCQkJcGh5LT50X25leHRbaV0gPSAwIDsKKwkJfQorCX0KKwlyZWFsX2luaXRfcGxjKHNtYykgOworfQorCit2b2lkIGluaXRfcGxjKHN0cnVjdCBzX3NtYyAqc21jKQoreworCVNLX1VOVVNFRChzbWMpIDsKKworCS8qCisJICogZHVtbXkKKwkgKiB0aGlzIGlzIGFuIG9ic29sZXRlIHB1YmxpYyBlbnRyeSBwb2ludCB0aGF0IGhhcyB0byByZW1haW4KKwkgKiBmb3IgY29tcGF0LiBJdCBpcyB1c2VkIGJ5IHZhcmlvdXMgZHJpdmVycy4KKwkgKiB0aGUgd29yayBpcyBub3cgZG9uZSBpbiByZWFsX2luaXRfcGxjKCkKKwkgKiB3aGljaCBpcyBjYWxsZWQgZnJvbSBwY21faW5pdCgpIDsKKwkgKi8KK30KKworc3RhdGljIHZvaWQgcmVhbF9pbml0X3BsYyhzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlpbnQJcCA7CisKKwlmb3IgKHAgPSAwIDsgcCA8IE5VTVBIWVMgOyBwKyspCisJCXBsY19pbml0KHNtYyxwKSA7Cit9CisKK3N0YXRpYyB2b2lkIHBsY19pbml0KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcCkKK3sKKwlpbnQJaSA7CisjaWZuZGVmCU1PVF9FTE0KKwlpbnQJcmV2IDsJLyogUmV2aXNpb24gb2YgUExDLXggKi8KKyNlbmRpZgkvKiBNT1RfRUxNICovCisKKwkvKiB0cmFuc2l0IFBDTSBzdGF0ZSBtYWNoaW5lIHRvIE1BSU5UIHN0YXRlICovCisJb3V0cHcoUExDKHAsUExfQ05UUkxfQiksMCkgOworCW91dHB3KFBMQyhwLFBMX0NOVFJMX0IpLFBMX1BDTV9TVE9QKSA7CisJb3V0cHcoUExDKHAsUExfQ05UUkxfQSksMCkgOworCisJLyoKKwkgKiBpZiBQTEMtUyB0aGVuIHNldCBjb250cm9sIHJlZ2lzdGVyIEMKKwkgKi8KKyNpZm5kZWYJTU9UX0VMTQorCXJldiA9IGlucHcoUExDKHAsUExfU1RBVFVTX0EpKSAmIFBMQ19SRVZfTUFTSyA7CisJaWYgKHJldiAhPSBQTENfUkVWSVNJT05fQSkKKyNlbmRpZgkvKiBNT1RfRUxNICovCisJeworCQlpZiAoc21jLT55W3BdLnBtZF9zY3JhbWJsZSkgeworCQkJb3V0cHcoUExDKHAsUExfQ05UUkxfQyksUExDU19DT05UUk9MX0NfUykgOworI2lmZGVmCU1PVF9FTE0KKwkJCW91dHB3KFBMQyhwLFBMX1RfRk9UX0FTUyksUExDU19GQVNTRVJUX1MpIDsKKwkJCW91dHB3KFBMQyhwLFBMX1RfRk9UX0RFQVNTKSxQTENTX0ZERUFTU0VSVF9TKSA7CisjZW5kaWYJLyogTU9UX0VMTSAqLworCQl9CisJCWVsc2UgeworCQkJb3V0cHcoUExDKHAsUExfQ05UUkxfQyksUExDU19DT05UUk9MX0NfVSkgOworI2lmZGVmCU1PVF9FTE0KKwkJCW91dHB3KFBMQyhwLFBMX1RfRk9UX0FTUyksUExDU19GQVNTRVJUX1UpIDsKKwkJCW91dHB3KFBMQyhwLFBMX1RfRk9UX0RFQVNTKSxQTENTX0ZERUFTU0VSVF9VKSA7CisjZW5kaWYJLyogTU9UX0VMTSAqLworCQl9CisJfQorCisJLyoKKwkgKiBzZXQgdGltZXIgcmVnaXN0ZXIKKwkgKi8KKwlmb3IgKCBpID0gMCA7IHBsdG1baV0udGltZXI7IGkrKykJLyogc2V0IHRpbWVyIHBhcmFtZXRlciByZWcgKi8KKwkJb3V0cHcoUExDKHAscGx0bVtpXS50aW1lcikscGx0bVtpXS5wYXJhKSA7CisKKwkodm9pZClpbnB3KFBMQyhwLFBMX0lOVFJfRVZFTlQpKSA7CS8qIGNsZWFyIGludGVycnVwdCBldmVudCByZWcgKi8KKwlwbGNfY2xlYXJfaXJxKHNtYyxwKSA7CisJb3V0cHcoUExDKHAsUExfSU5UUl9NQVNLKSxwbGNfaW1za19uYSk7IC8qIGVuYWJsZSBub24gYWN0aXZlIGlycSdzICovCisKKwkvKgorCSAqIGlmIFBDTSBpcyBjb25maWd1cmVkIGZvciBjbGFzcyBzLCBpdCB3aWxsIE5PVCBnbyB0byB0aGUKKwkgKiBSRU1PVkUgc3RhdGUgaWYgb2ZmbGluZSAocGFnZSAzLTM2OykKKwkgKiBpbiB0aGUgY29uY2VudHJhdG9yLCBhbGwgaW5hY3RpdmUgUEhZUyBhbHdheXMgbXVzdCBiZSBpbgorCSAqIHRoZSByZW1vdmUgc3RhdGUKKwkgKiB0aGVyZSdzIG5vIHJlYWwgbmVlZCB0byB1c2UgdGhpcyBmZWF0dXJlIGF0IGFsbCAuLgorCSAqLworI2lmbmRlZglDT05DRU5UUkFUT1IKKwlpZiAoKHNtYy0+cy5zYXMgPT0gU01UX1NBUykgJiYgKHAgPT0gUFMpKSB7CisJCW91dHB3KFBMQyhwLFBMX0NOVFJMX0IpLFBMX0NMQVNTX1MpIDsKKwl9CisjZW5kaWYKK30KKworLyoKKyAqIGNvbnRyb2wgUENNIHN0YXRlIG1hY2hpbmUKKyAqLworc3RhdGljIHZvaWQgcGxjX2dvX3N0YXRlKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcCwgaW50IHN0YXRlKQoreworCUhXX1BUUiBwb3J0IDsKKwlpbnQgdmFsIDsKKworCVNLX1VOVVNFRChzbWMpIDsKKworCXBvcnQgPSAoSFdfUFRSKSAoUExDKHAsUExfQ05UUkxfQikpIDsKKwl2YWwgPSBpbnB3KHBvcnQpICYgfihQTF9QQ01fQ05UUkwgfCBQTF9NQUlOVCkgOworCW91dHB3KHBvcnQsdmFsKSA7CisJb3V0cHcocG9ydCx2YWwgfCBzdGF0ZSkgOworfQorCisvKgorICogcmVhZCBjdXJyZW50IGxpbmUgc3RhdGUgKGNhbGxlZCBieSBFQ00gJiBQQ00pCisgKi8KK2ludCBzbV9wbV9nZXRfbHMoc3RydWN0IHNfc21jICpzbWMsIGludCBwaHkpCit7CisJaW50CXN0YXRlIDsKKworI2lmZGVmCUNPTkNFTlRSQVRPUgorCWlmICghcGxjX2lzX2luc3RhbGxlZChzbWMscGh5KSkKKwkJcmV0dXJuKFBDX1FMUykgOworI2VuZGlmCisKKwlzdGF0ZSA9IGlucHcoUExDKHBoeSxQTF9TVEFUVVNfQSkpICYgUExfTElORV9TVCA7CisJc3dpdGNoKHN0YXRlKSB7CisJY2FzZSBQTF9MX1FMUzoKKwkJc3RhdGUgPSBQQ19RTFMgOworCQlicmVhayA7CisJY2FzZSBQTF9MX01MUzoKKwkJc3RhdGUgPSBQQ19NTFMgOworCQlicmVhayA7CisJY2FzZSBQTF9MX0hMUzoKKwkJc3RhdGUgPSBQQ19ITFMgOworCQlicmVhayA7CisJY2FzZSBQTF9MX0lMUzQ6CisJY2FzZSBQTF9MX0lMUzE2OgorCQlzdGF0ZSA9IFBDX0lMUyA7CisJCWJyZWFrIDsKKwljYXNlIFBMX0xfQUxTOgorCQlzdGF0ZSA9IFBDX0xTX1BEUiA7CisJCWJyZWFrIDsKKwlkZWZhdWx0IDoKKwkJc3RhdGUgPSBQQ19MU19OT05FIDsKKwl9CisJcmV0dXJuKHN0YXRlKSA7Cit9CisKK3N0YXRpYyBpbnQgcGxjX3NlbmRfYml0cyhzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNfcGh5ICpwaHksIGludCBsZW4pCit7CisJaW50IG5wID0gcGh5LT5ucCA7CQkvKiBQSFkgaW5kZXggKi8KKwlpbnQJbiA7CisJaW50CWkgOworCisJU0tfVU5VU0VEKHNtYykgOworCisJLyogY3JlYXRlIGJpdCB2ZWN0b3IgKi8KKwlmb3IgKGkgPSBsZW4tMSxuID0gMCA7IGkgPj0gMCA7IGktLSkgeworCQluID0gKG48PDEpIHwgcGh5LT50X3ZhbFtwaHktPmJpdG4raV0gOworCX0KKwlpZiAoaW5wdyhQTEMobnAsUExfU1RBVFVTX0IpKSAmIFBMX1BDTV9TSUdOQUwpIHsKKyNpZgkwCisJCXByaW50ZigiUExfUENNX1NJR05BTCBpcyBzZXRcbiIpIDsKKyNlbmRpZgorCQlyZXR1cm4oMSkgOworCX0KKwkvKiB3cml0ZSBiaXRbbl0gJiBsZW5ndGggPSAxIHRvIHJlZ3MgKi8KKwlvdXRwdyhQTEMobnAsUExfVkVDVE9SX0xFTiksbGVuLTEpIDsJLyogbGVuPW5yLTEgKi8KKwlvdXRwdyhQTEMobnAsUExfWE1JVF9WRUNUT1IpLG4pIDsKKyNpZmRlZglERUJVRworI2lmIDEKKyNpZmRlZglERUJVR19CUkQKKwlpZiAoc21jLT5kZWJ1Zy5kX3BsYyAmIDB4ODApCisjZWxzZQorCWlmIChkZWJ1Zy5kX3BsYyAmIDB4ODApCisjZW5kaWYKKwkJcHJpbnRmKCJTSUdOQUxJTkcgYml0ICVkIC4uICVkXG4iLHBoeS0+Yml0bixwaHktPmJpdG4rbGVuLTEpIDsKKyNlbmRpZgorI2VuZGlmCisJcmV0dXJuKDApIDsKK30KKworLyoKKyAqIGNvbmZpZyBwbGMgbXV4ZXMKKyAqLwordm9pZCBwbGNfY29uZmlnX211eChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG11eCkKK3sKKwlpZiAoc21jLT5zLnNhcyAhPSBTTVRfREFTKQorCQlyZXR1cm4gOworCWlmIChtdXggPT0gTVVYX1dSQVBCKSB7CisJCVNFVE1BU0soUExDKFBBLFBMX0NOVFJMX0IpLFBMX0NPTkZJR19DTlRSTCxQTF9DT05GSUdfQ05UUkwpIDsKKwkJU0VUTUFTSyhQTEMoUEEsUExfQ05UUkxfQSksUExfU0NfUkVNX0xPT1AsUExfU0NfUkVNX0xPT1ApIDsKKwl9CisJZWxzZSB7CisJCUNMRUFSKFBMQyhQQSxQTF9DTlRSTF9CKSxQTF9DT05GSUdfQ05UUkwpIDsKKwkJQ0xFQVIoUExDKFBBLFBMX0NOVFJMX0EpLFBMX1NDX1JFTV9MT09QKSA7CisJfQorCUNMRUFSKFBMQyhQQixQTF9DTlRSTF9CKSxQTF9DT05GSUdfQ05UUkwpIDsKKwlDTEVBUihQTEMoUEIsUExfQ05UUkxfQSksUExfU0NfUkVNX0xPT1ApIDsKK30KKworLyoKKwlQQ00gc3RhdGUgbWFjaGluZQorCWNhbGxlZCBieSBkaXNwYXRjaGVyICAmIGZkZGlfaW5pdCgpIChkcml2ZXIpCisJZG8KKwkJZGlzcGxheSBzdGF0ZSBjaGFuZ2UKKwkJcHJvY2VzcyBldmVudAorCXVudGlsIFNNIGlzIHN0YWJsZQorKi8KK3ZvaWQgcGNtKHN0cnVjdCBzX3NtYyAqc21jLCBjb25zdCBpbnQgbnAsIGludCBldmVudCkKK3sKKwlpbnQJc3RhdGUgOworCWludAlvbGRzdGF0ZSA7CisJc3RydWN0IHNfcGh5CSpwaHkgOworCXN0cnVjdCBmZGRpX21pYl9wCSptaWIgOworCisjaWZuZGVmCUNPTkNFTlRSQVRPUgorCS8qCisJICogaWdub3JlIDJuZCBQSFkgaWYgU0FTCisJICovCisJaWYgKChucCAhPSBQUykgJiYgKHNtYy0+cy5zYXMgPT0gU01UX1NBUykpCisJCXJldHVybiA7CisjZW5kaWYKKwlwaHkgPSAmc21jLT55W25wXSA7CisJbWliID0gcGh5LT5taWIgOworCW9sZHN0YXRlID0gbWliLT5mZGRpUE9SVFBDTVN0YXRlIDsKKwlkbyB7CisJCURCX1BDTSgiUENNICVjOiBzdGF0ZSAlcyIsCisJCQlwaHktPnBoeV9uYW1lLAorCQkJKG1pYi0+ZmRkaVBPUlRQQ01TdGF0ZSAmIEFGTEFHKSA/ICJBQ1RJT05TICIgOiAiIikgOworCQlEQl9QQ00oIiVzLCBldmVudCAlc1xuIiwKKwkJCXBjbV9zdGF0ZXNbbWliLT5mZGRpUE9SVFBDTVN0YXRlICYgfkFGTEFHXSwKKwkJCXBjbV9ldmVudHNbZXZlbnRdKSA7CisJCXN0YXRlID0gbWliLT5mZGRpUE9SVFBDTVN0YXRlIDsKKwkJcGNtX2ZzbShzbWMscGh5LGV2ZW50KSA7CisJCWV2ZW50ID0gMCA7CisJfSB3aGlsZSAoc3RhdGUgIT0gbWliLT5mZGRpUE9SVFBDTVN0YXRlKSA7CisJLyoKKwkgKiBiZWNhdXNlIHRoZSBQTEMgZG9lcyB0aGUgYml0IHNpZ25hbGluZyBmb3IgdXMsCisJICogd2UncmUgYWx3YXlzIGluIFNJR05BTCBzdGF0ZQorCSAqIHRoZSBNSUIgd2FudCdzIHRvIHNlZSBDT05ORUNUCisJICogd2UgdGhlcmVmb3JlIGZha2UgYW4gZW50cnkgaW4gdGhlIE1JQgorCSAqLworCWlmIChzdGF0ZSA9PSBQQzVfU0lHTkFMKQorCQltaWItPmZkZGlQT1JUUENNU3RhdGVYID0gUEMzX0NPTk5FQ1QgOworCWVsc2UKKwkJbWliLT5mZGRpUE9SVFBDTVN0YXRlWCA9IHN0YXRlIDsKKworI2lmbmRlZglTTElNX1NNVAorCS8qCisJICogcGF0aCBjaGFuZ2UKKwkgKi8KKwlpZiAoCW1pYi0+ZmRkaVBPUlRQQ01TdGF0ZSAhPSBvbGRzdGF0ZSAmJgorCQkoKG9sZHN0YXRlID09IFBDOF9BQ1RJVkUpIHx8IChtaWItPmZkZGlQT1JUUENNU3RhdGUgPT0gUEM4X0FDVElWRSkpKSB7CisJCXNtdF9zcmZfZXZlbnQoc21jLFNNVF9FVkVOVF9QT1JUX1BBVEhfQ0hBTkdFLAorCQkJKGludCkgKElOREVYX1BPUlQrIHBoeS0+bnApLDApIDsKKwl9CisjZW5kaWYKKworI2lmZGVmIEZERElfTUlCCisJLyogY2hlY2sgd2hldGhlciBhIHNubXAtdHJhcCBoYXMgdG8gYmUgc2VudCAqLworCisJaWYgKCBtaWItPmZkZGlQT1JUUENNU3RhdGUgIT0gb2xkc3RhdGUgKSB7CisJCS8qIGEgcmVhbCBzdGF0ZSBjaGFuZ2UgdG9vayBwbGFjZSAqLworCQlEQl9TTk1QICgiUENNIGZyb20gJWQgdG8gJWRcbiIsIG9sZHN0YXRlLCBtaWItPmZkZGlQT1JUUENNU3RhdGUpOworCQlpZiAoIG1pYi0+ZmRkaVBPUlRQQ01TdGF0ZSA9PSBQQzBfT0ZGICkgeworCQkJLyogc2VuZCBmaXJzdCB0cmFwICovCisJCQlzbm1wX2ZkZGlfdHJhcCAoc21jLCAxLCAoaW50KSBtaWItPmZkZGlQT1JUSW5kZXggKTsKKwkJfSBlbHNlIGlmICggb2xkc3RhdGUgPT0gUEMwX09GRiApIHsKKwkJCS8qIHNlbmQgc2Vjb25kIHRyYXAgKi8KKwkJCXNubXBfZmRkaV90cmFwIChzbWMsIDIsIChpbnQpIG1pYi0+ZmRkaVBPUlRJbmRleCApOworCQl9IGVsc2UgaWYgKCBtaWItPmZkZGlQT1JUUENNU3RhdGUgIT0gUEMyX1RSQUNFICYmCisJCQlvbGRzdGF0ZSA9PSBQQzhfQUNUSVZFICkgeworCQkJLyogc2VuZCB0aGlyZCB0cmFwICovCisJCQlzbm1wX2ZkZGlfdHJhcCAoc21jLCAzLCAoaW50KSBtaWItPmZkZGlQT1JUSW5kZXggKTsKKwkJfSBlbHNlIGlmICggbWliLT5mZGRpUE9SVFBDTVN0YXRlID09IFBDOF9BQ1RJVkUgKSB7CisJCQkvKiBzZW5kIGZvdXJ0aCB0cmFwICovCisJCQlzbm1wX2ZkZGlfdHJhcCAoc21jLCA0LCAoaW50KSBtaWItPmZkZGlQT1JUSW5kZXggKTsKKwkJfQorCX0KKyNlbmRpZgorCisJcGNtX3N0YXRlX2NoYW5nZShzbWMsbnAsc3RhdGUpIDsKK30KKworLyoKKyAqIFBDTSBzdGF0ZSBtYWNoaW5lCisgKi8KK3N0YXRpYyB2b2lkIHBjbV9mc20oc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzX3BoeSAqcGh5LCBpbnQgY21kKQoreworCWludAlpIDsKKwlpbnQJbnAgPSBwaHktPm5wIDsJCS8qIFBIWSBpbmRleCAqLworCXN0cnVjdCBzX3BsYwkqcGxjIDsKKwlzdHJ1Y3QgZmRkaV9taWJfcAkqbWliIDsKKyNpZm5kZWYJTU9UX0VMTQorCXVfc2hvcnQJcGxjX3JldiA7CQkvKiBSZXZpc2lvbiBvZiB0aGUgcGxjICovCisjZW5kaWYJLyogbk1PVF9FTE0gKi8KKworCXBsYyA9ICZwaHktPnBsYyA7CisJbWliID0gcGh5LT5taWIgOworCisJLyoKKwkgKiBnZW5lcmFsIHRyYW5zaXRpb25zIGluZGVwZW5kZW50IG9mIHN0YXRlCisJICovCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFBDX1NUT1AgOgorCQkvKlBDMDAtUEM4MCovCisJCWlmIChtaWItPmZkZGlQT1JUUENNU3RhdGUgIT0gUEM5X01BSU5UKSB7CisJCQlHT19TVEFURShQQzBfT0ZGKSA7CisJCQlBSVhfRVZFTlQoc21jLCAodV9sb25nKSBGRERJX1JJTkdfU1RBVFVTLCAodV9sb25nKQorCQkJCUZERElfUE9SVF9FVkVOVCwgKHVfbG9uZykgRkRESV9QT1JUX1NUT1AsCisJCQkJc210X2dldF9wb3J0X2V2ZW50X3dvcmQoc21jKSk7CisJCX0KKwkJcmV0dXJuIDsKKwljYXNlIFBDX1NUQVJUIDoKKwkJLypQQzAxLVBDODEqLworCQlpZiAobWliLT5mZGRpUE9SVFBDTVN0YXRlICE9IFBDOV9NQUlOVCkKKwkJCUdPX1NUQVRFKFBDMV9CUkVBSykgOworCQlyZXR1cm4gOworCWNhc2UgUENfRElTQUJMRSA6CisJCS8qIFBDMDktUEM5OSAqLworCQlHT19TVEFURShQQzlfTUFJTlQpIDsKKwkJQUlYX0VWRU5UKHNtYywgKHVfbG9uZykgRkRESV9SSU5HX1NUQVRVUywgKHVfbG9uZykKKwkJCUZERElfUE9SVF9FVkVOVCwgKHVfbG9uZykgRkRESV9QT1JUX0RJU0FCTEVELAorCQkJc210X2dldF9wb3J0X2V2ZW50X3dvcmQoc21jKSk7CisJCXJldHVybiA7CisJY2FzZSBQQ19USU1FT1VUX0xDVCA6CisJCS8qIGlmIGxvbmcgb3IgZXh0ZW5kZWQgTENUICovCisJCXN0b3BfcGNtX3RpbWVyMChzbWMscGh5KSA7CisJCUNMRUFSKFBMQyhucCxQTF9DTlRSTF9CKSxQTF9MT05HKSA7CisJCS8qIGVuZCBvZiBMQ1QgaXMgaW5kaWNhdGUgYnkgUENNX0NPREUgKGluaXRpYXRlIFBDTSBldmVudCkgKi8KKwkJcmV0dXJuIDsKKwl9CisKKwlzd2l0Y2gobWliLT5mZGRpUE9SVFBDTVN0YXRlKSB7CisJY2FzZSBBQ1RJT05TKFBDMF9PRkYpIDoKKwkJc3RvcF9wY21fdGltZXIwKHNtYyxwaHkpIDsKKwkJb3V0cHcoUExDKG5wLFBMX0NOVFJMX0EpLDApIDsKKwkJQ0xFQVIoUExDKG5wLFBMX0NOVFJMX0IpLFBMX1BDX0pPSU4pIDsKKwkJQ0xFQVIoUExDKG5wLFBMX0NOVFJMX0IpLFBMX0xPTkcpIDsKKwkJc21fcGhfbGVtX3N0b3Aoc21jLG5wKSA7CQkvKiBkaXNhYmxlIExFTSAqLworCQlwaHktPmNmX2xvb3AgPSBGQUxTRSA7CisJCXBoeS0+Y2Zfam9pbiA9IEZBTFNFIDsKKwkJcXVldWVfZXZlbnQoc21jLEVWRU5UX0NGTSxDRl9KT0lOK25wKSA7CisJCXBsY19nb19zdGF0ZShzbWMsbnAsUExfUENNX1NUT1ApIDsKKwkJbWliLT5mZGRpUE9SVENvbm5lY3RTdGF0ZSA9IFBDTV9ESVNBQkxFRCA7CisJCUFDVElPTlNfRE9ORSgpIDsKKwkJYnJlYWsgOworCWNhc2UgUEMwX09GRjoKKwkJLypQQzA5Ki8KKwkJaWYgKGNtZCA9PSBQQ19NQUlOVCkgeworCQkJR09fU1RBVEUoUEM5X01BSU5UKSA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgQUNUSU9OUyhQQzFfQlJFQUspIDoKKwkJLyogU3RvcCB0aGUgTENUIHRpbWVyIGlmIHdlIGNhbWUgZnJvbSBTaWduYWwgc3RhdGUgKi8KKwkJc3RvcF9wY21fdGltZXIwKHNtYyxwaHkpIDsKKwkJQUNUSU9OU19ET05FKCkgOworCQlwbGNfZ29fc3RhdGUoc21jLG5wLDApIDsKKwkJQ0xFQVIoUExDKG5wLFBMX0NOVFJMX0IpLFBMX1BDX0pPSU4pIDsKKwkJQ0xFQVIoUExDKG5wLFBMX0NOVFJMX0IpLFBMX0xPTkcpIDsKKwkJc21fcGhfbGVtX3N0b3Aoc21jLG5wKSA7CQkvKiBkaXNhYmxlIExFTSAqLworCQkvKgorCQkgKiBpZiB2ZWN0b3IgaXMgYWxyZWFkeSBsb2FkZWQsIGdvIHRvIE9GRiB0byBjbGVhciBQQ01fU0lHTkFMCisJCSAqLworI2lmCTAKKwkJaWYgKGlucHcoUExDKG5wLFBMX1NUQVRVU19CKSkgJiBQTF9QQ01fU0lHTkFMKSB7CisJCQlwbGNfZ29fc3RhdGUoc21jLG5wLFBMX1BDTV9TVE9QKSA7CisJCQkvKiBUQl9NSU4gPyAqLworCQl9CisjZW5kaWYKKwkJLyoKKwkJICogR28gdG8gT0ZGIHN0YXRlIGluIGFueSBjYXNlLgorCQkgKi8KKwkJcGxjX2dvX3N0YXRlKHNtYyxucCxQTF9QQ01fU1RPUCkgOworCisJCWlmIChtaWItPmZkZGlQT1JUUENfV2l0aGhvbGQgPT0gUENfV0hfTk9ORSkKKwkJCW1pYi0+ZmRkaVBPUlRDb25uZWN0U3RhdGUgPSBQQ01fQ09OTkVDVElORyA7CisJCXBoeS0+Y2ZfbG9vcCA9IEZBTFNFIDsKKwkJcGh5LT5jZl9qb2luID0gRkFMU0UgOworCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfQ0ZNLENGX0pPSU4rbnApIDsKKwkJcGh5LT5sc19mbGFnID0gRkFMU0UgOworCQlwaHktPnBjX21vZGUgPSBQTV9OT05FIDsJLyogbmVlZGVkIGJ5IENGTSAqLworCQlwaHktPmJpdG4gPSAwIDsJCQkvKiBiaXQgc2lnbmFsaW5nIHN0YXJ0IGJpdCAqLworCQlmb3IgKGkgPSAwIDsgaSA8IDMgOyBpKyspCisJCQlwY190Y29kZV9hY3Rpb25zKHNtYyxpLHBoeSkgOworCisJCS8qIFNldCB0aGUgbm9uLWFjdGl2ZSBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworCQlvdXRwdyhQTEMobnAsUExfSU5UUl9NQVNLKSxwbGNfaW1za19uYSkgOworCisJCS8qCisJCSAqIElmIHRoZSBMQ1Qgd2FzIHN0b3BwZWQuIFRoZXJlIG1pZ2h0IGJlIGEKKwkJICogUENNX0NPREUgaW50ZXJydXB0IGV2ZW50IHByZXNlbnQuCisJCSAqIFRoaXMgbXVzdCBiZSBjbGVhcmVkLgorCQkgKi8KKwkJKHZvaWQpaW5wdyhQTEMobnAsUExfSU5UUl9FVkVOVCkpIDsKKyNpZm5kZWYJTU9UX0VMTQorCQkvKiBHZXQgdGhlIHBsYyByZXZpc2lvbiBmb3IgcmV2aXNpb24gZGVwZW5kZW50IGNvZGUgKi8KKwkJcGxjX3JldiA9IGlucHcoUExDKG5wLFBMX1NUQVRVU19BKSkgJiBQTENfUkVWX01BU0sgOworCisJCWlmIChwbGNfcmV2ICE9IFBMQ19SRVZfU04zKQorI2VuZGlmCS8qIE1PVF9FTE0gKi8KKwkJeworCQkJLyoKKwkJCSAqIE5vIHN1cGVybmV0IElJSSBQTEMsIHNvIHNldCBYbWl0IHZlcmN0b3IgYW5kCisJCQkgKiBsZW5ndGggQkVGT1JFIHN0YXJ0aW5nIHRoZSBzdGF0ZSBtYWNoaW5lLgorCQkJICovCisJCQlpZiAocGxjX3NlbmRfYml0cyhzbWMscGh5LDMpKSB7CisJCQkJcmV0dXJuIDsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIE5vdyBnaXZlIHRoZSBTdGFydCBjb21tYW5kLgorCQkgKiAtIFRoZSBzdGFydCBjb21tYW5kIHNoYWxsIGJlIGRvbmUgYmVmb3JlIHNldHRpbmcgdGhlIGJpdHMKKwkJICogICB0byBiZSBzaWduYWxlZC4gKEluIFBMQy1TIGRlc2NyaXB0aW9uIGFuZCBQTENTIGluIFNOMy4KKwkJICogLSBUaGUgc3RhcnQgY29tbWFuZCBzaGFsbCBiZSBpc3N1ZWQgQUZURVIgc2V0dGluZyB0aGUKKwkJICogICBYTUlUIHZlY3RvciBhbmQgdGhlIFhNSVQgbGVuZ3RoIHJlZ2lzdGVyLgorCQkgKgorCQkgKiBXZSBkbyBpdCBleGFjdGx5IGFjY29yZGluZyB0aGlzIHNwZWNzIGZvciB0aGUgb2xkIFBMQyBhbmQKKwkJICogdGhlIG5ldyBQTENTIGluc2lkZSB0aGUgU04zLgorCQkgKiBGb3IgdGhlIHVzdWFsIFBMQ1Mgd2UgdHJ5IGl0IHRoZSB3YXkgaXQgaXMgZG9uZSBmb3IgdGhlCisJCSAqIG9sZCBQTEMgYW5kIHNldCB0aGUgWE1JVCByZWdpc3RlcnMgYWdhaW4sIGlmIHRoZSBQTEMgaXMKKwkJICogbm90IGluIFNJR05BTCBzdGF0ZS4gVGhpcyBpcyBkb25lIGFjY29yZGluZyB0byBhbiBQTENTCisJCSAqIGVycmF0YSB3b3JrYXJvdW5kLgorCQkgKi8KKworCQlwbGNfZ29fc3RhdGUoc21jLG5wLFBMX1BDTV9TVEFSVCkgOworCisJCS8qCisJCSAqIHdvcmthcm91bmQgZm9yIFBMQy1TIGVuZy4gc2FtcGxlIGVycmF0YQorCQkgKi8KKyNpZmRlZglNT1RfRUxNCisJCWlmICghKGlucHcoUExDKG5wLFBMX1NUQVRVU19CKSkgJiBQTF9QQ01fU0lHTkFMKSkKKyNlbHNlCS8qIG5NT1RfRUxNICovCisJCWlmICgoKGlucHcoUExDKG5wLFBMX1NUQVRVU19BKSkgJiBQTENfUkVWX01BU0spICE9CisJCQlQTENfUkVWSVNJT05fQSkgJiYKKwkJCSEoaW5wdyhQTEMobnAsUExfU1RBVFVTX0IpKSAmIFBMX1BDTV9TSUdOQUwpKQorI2VuZGlmCS8qIG5NT1RfRUxNICovCisJCXsKKwkJCS8qCisJCQkgKiBTZXQgcmVnaXN0ZXIgYWdhaW4gKFBMQ1MgZXJyYXRhKSBvciB0aGUgZmlyc3QgdGltZQorCQkJICogKG5ldyBTTjMgUExDUykuCisJCQkgKi8KKwkJCSh2b2lkKSBwbGNfc2VuZF9iaXRzKHNtYyxwaHksMykgOworCQl9CisJCS8qCisJCSAqIGVuZCBvZiB3b3JrYXJvdW5kCisJCSAqLworCisJCUdPX1NUQVRFKFBDNV9TSUdOQUwpIDsKKwkJcGxjLT5wX3N0YXRlID0gUFNfQklUMyA7CisJCXBsYy0+cF9iaXRzID0gMyA7CisJCXBsYy0+cF9zdGFydCA9IDAgOworCisJCWJyZWFrIDsKKwljYXNlIFBDMV9CUkVBSyA6CisJCWJyZWFrIDsKKwljYXNlIEFDVElPTlMoUEMyX1RSQUNFKSA6CisJCXBsY19nb19zdGF0ZShzbWMsbnAsUExfUENNX1RSQUNFKSA7CisJCUFDVElPTlNfRE9ORSgpIDsKKwkJYnJlYWsgOworCWNhc2UgUEMyX1RSQUNFIDoKKwkJYnJlYWsgOworCisJY2FzZSBQQzNfQ09OTkVDVCA6CS8qIHRoZXNlIHN0YXRlcyBhcmUgZG9uZSBieSBoYXJkd2FyZSAqLworCWNhc2UgUEM0X05FWFQgOgorCQlicmVhayA7CisKKwljYXNlIEFDVElPTlMoUEM1X1NJR05BTCkgOgorCQlBQ1RJT05TX0RPTkUoKSA7CisJY2FzZSBQQzVfU0lHTkFMIDoKKwkJaWYgKChjbWQgIT0gUENfU0lHTkFMKSAmJiAoY21kICE9IFBDX1RJTUVPVVRfTENUKSkKKwkJCWJyZWFrIDsKKwkJc3dpdGNoIChwbGMtPnBfc3RhdGUpIHsKKwkJY2FzZSBQU19CSVQzIDoKKwkJCWZvciAoaSA9IDAgOyBpIDw9IDIgOyBpKyspCisJCQkJcGNfcmNvZGVfYWN0aW9ucyhzbWMsaSxwaHkpIDsKKwkJCXBjX3Rjb2RlX2FjdGlvbnMoc21jLDMscGh5KSA7CisJCQlwbGMtPnBfc3RhdGUgPSBQU19CSVQ0IDsKKwkJCXBsYy0+cF9iaXRzID0gMSA7CisJCQlwbGMtPnBfc3RhcnQgPSAzIDsKKwkJCXBoeS0+Yml0biA9IDMgOworCQkJaWYgKHBsY19zZW5kX2JpdHMoc21jLHBoeSwxKSkgeworCQkJCXJldHVybiA7CisJCQl9CisJCQlicmVhayA7CisJCWNhc2UgUFNfQklUNCA6CisJCQlwY19yY29kZV9hY3Rpb25zKHNtYywzLHBoeSkgOworCQkJZm9yIChpID0gNCA7IGkgPD0gNiA7IGkrKykKKwkJCQlwY190Y29kZV9hY3Rpb25zKHNtYyxpLHBoeSkgOworCQkJcGxjLT5wX3N0YXRlID0gUFNfQklUNyA7CisJCQlwbGMtPnBfYml0cyA9IDMgOworCQkJcGxjLT5wX3N0YXJ0ID0gNCA7CisJCQlwaHktPmJpdG4gPSA0IDsKKwkJCWlmIChwbGNfc2VuZF9iaXRzKHNtYyxwaHksMykpIHsKKwkJCQlyZXR1cm4gOworCQkJfQorCQkJYnJlYWsgOworCQljYXNlIFBTX0JJVDcgOgorCQkJZm9yIChpID0gMyA7IGkgPD0gNiA7IGkrKykKKwkJCQlwY19yY29kZV9hY3Rpb25zKHNtYyxpLHBoeSkgOworCQkJcGxjLT5wX3N0YXRlID0gUFNfTENUIDsKKwkJCXBsYy0+cF9iaXRzID0gMCA7CisJCQlwbGMtPnBfc3RhcnQgPSA3IDsKKwkJCXBoeS0+Yml0biA9IDcgOworCQlzbV9waF9sZW1fc3RhcnQoc21jLG5wLChpbnQpc21jLT5zLmxjdF9zaG9ydCkgOyAvKiBlbmFibGUgTEVNICovCisJCQkvKiBzdGFydCBMQ1QgKi8KKwkJCWkgPSBpbnB3KFBMQyhucCxQTF9DTlRSTF9CKSkgJiB+UExfUENfTE9PUCA7CisJCQlvdXRwdyhQTEMobnAsUExfQ05UUkxfQiksaSkgOwkvKiBtdXN0IGJlIGNsZWFyZWQgKi8KKwkJCW91dHB3KFBMQyhucCxQTF9DTlRSTF9CKSxpIHwgUExfUkxCUCkgOworCQkJYnJlYWsgOworCQljYXNlIFBTX0xDVCA6CisJCQkvKiBjaGVjayBmb3IgbG9jYWwgTENUIGZhaWx1cmUgKi8KKwkJCXBjX3Rjb2RlX2FjdGlvbnMoc21jLDcscGh5KSA7CisJCQkvKgorCQkJICogc2V0IHR2YWxbN10KKwkJCSAqLworCQkJcGxjLT5wX3N0YXRlID0gUFNfQklUOCA7CisJCQlwbGMtPnBfYml0cyA9IDEgOworCQkJcGxjLT5wX3N0YXJ0ID0gNyA7CisJCQlwaHktPmJpdG4gPSA3IDsKKwkJCWlmIChwbGNfc2VuZF9iaXRzKHNtYyxwaHksMSkpIHsKKwkJCQlyZXR1cm4gOworCQkJfQorCQkJYnJlYWsgOworCQljYXNlIFBTX0JJVDggOgorCQkJLyogY2hlY2sgZm9yIHJlbW90ZSBMQ1QgZmFpbHVyZSAqLworCQkJcGNfcmNvZGVfYWN0aW9ucyhzbWMsNyxwaHkpIDsKKwkJCWlmIChwaHktPnRfdmFsWzddIHx8IHBoeS0+cl92YWxbN10pIHsKKwkJCQlwbGNfZ29fc3RhdGUoc21jLG5wLFBMX1BDTV9TVE9QKSA7CisJCQkJR09fU1RBVEUoUEMxX0JSRUFLKSA7CisJCQkJYnJlYWsgOworCQkJfQorCQkJZm9yIChpID0gOCA7IGkgPD0gOSA7IGkrKykKKwkJCQlwY190Y29kZV9hY3Rpb25zKHNtYyxpLHBoeSkgOworCQkJcGxjLT5wX3N0YXRlID0gUFNfSk9JTiA7CisJCQlwbGMtPnBfYml0cyA9IDIgOworCQkJcGxjLT5wX3N0YXJ0ID0gOCA7CisJCQlwaHktPmJpdG4gPSA4IDsKKwkJCWlmIChwbGNfc2VuZF9iaXRzKHNtYyxwaHksMikpIHsKKwkJCQlyZXR1cm4gOworCQkJfQorCQkJYnJlYWsgOworCQljYXNlIFBTX0pPSU4gOgorCQkJZm9yIChpID0gOCA7IGkgPD0gOSA7IGkrKykKKwkJCQlwY19yY29kZV9hY3Rpb25zKHNtYyxpLHBoeSkgOworCQkJcGxjLT5wX3N0YXRlID0gUFNfQUNUSVZFIDsKKwkJCUdPX1NUQVRFKFBDNl9KT0lOKSA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWsgOworCisJY2FzZSBBQ1RJT05TKFBDNl9KT0lOKSA6CisJCS8qCisJCSAqIHByZXZlbnQgbXV4IGVycm9yIHdoZW4gZ29pbmcgZnJvbSBXUkFQX0EgdG8gV1JBUF9CCisJCSAqLworCQlpZiAoc21jLT5zLnNhcyA9PSBTTVRfREFTICYmIG5wID09IFBCICYmCisJCQkoc21jLT55W1BBXS5wY19tb2RlID09IFBNX1RSRUUgfHwKKwkJCSBzbWMtPnlbUEJdLnBjX21vZGUgPT0gUE1fVFJFRSkpIHsKKwkJCVNFVE1BU0soUExDKG5wLFBMX0NOVFJMX0EpLAorCQkJCVBMX1NDX1JFTV9MT09QLFBMX1NDX1JFTV9MT09QKSA7CisJCQlTRVRNQVNLKFBMQyhucCxQTF9DTlRSTF9CKSwKKwkJCQlQTF9DT05GSUdfQ05UUkwsUExfQ09ORklHX0NOVFJMKSA7CisJCX0KKwkJU0VUTUFTSyhQTEMobnAsUExfQ05UUkxfQiksUExfUENfSk9JTixQTF9QQ19KT0lOKSA7CisJCVNFVE1BU0soUExDKG5wLFBMX0NOVFJMX0IpLFBMX1BDX0pPSU4sUExfUENfSk9JTikgOworCQlBQ1RJT05TX0RPTkUoKSA7CisJCWNtZCA9IDAgOworCQkvKiBmYWxsIHRocnUgKi8KKwljYXNlIFBDNl9KT0lOIDoKKwkJc3dpdGNoIChwbGMtPnBfc3RhdGUpIHsKKwkJY2FzZSBQU19BQ1RJVkU6CisJCQkvKlBDODhiKi8KKwkJCWlmICghcGh5LT5jZl9qb2luKSB7CisJCQkJcGh5LT5jZl9qb2luID0gVFJVRSA7CisJCQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX0NGTSxDRl9KT0lOK25wKSA7IDsKKwkJCX0KKwkJCWlmIChjbWQgPT0gUENfSk9JTikKKwkJCQlHT19TVEFURShQQzhfQUNUSVZFKSA7CisJCQkvKlBDODIqLworCQkJaWYgKGNtZCA9PSBQQ19UUkFDRSkgeworCQkJCUdPX1NUQVRFKFBDMl9UUkFDRSkgOworCQkJCWJyZWFrIDsKKwkJCX0KKwkJCWJyZWFrIDsKKwkJfQorCQlicmVhayA7CisKKwljYXNlIFBDN19WRVJJRlkgOgorCQlicmVhayA7CisKKwljYXNlIEFDVElPTlMoUEM4X0FDVElWRSkgOgorCQkvKgorCQkgKiBzdGFydCBMRU0gZm9yIFNNVAorCQkgKi8KKwkJc21fcGhfbGVtX3N0YXJ0KHNtYywoaW50KXBoeS0+bnAsTENUX0xFTV9NQVgpIDsKKworCQlwaHktPnRyX2ZsYWcgPSBGQUxTRSA7CisJCW1pYi0+ZmRkaVBPUlRDb25uZWN0U3RhdGUgPSBQQ01fQUNUSVZFIDsKKworCQkvKiBTZXQgdGhlIGFjdGl2ZSBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworCQlvdXRwdyhQTEMobnAsUExfSU5UUl9NQVNLKSxwbGNfaW1za19hY3QpIDsKKworCQlBQ1RJT05TX0RPTkUoKSA7CisJCWJyZWFrIDsKKwljYXNlIFBDOF9BQ1RJVkUgOgorCQkvKlBDODEgaXMgZG9uZSBieSBQTF9UTkVfRVhQSVJFRCBpcnEgKi8KKwkJLypQQzgyKi8KKwkJaWYgKGNtZCA9PSBQQ19UUkFDRSkgeworCQkJR09fU1RBVEUoUEMyX1RSQUNFKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypQQzg4YzogaXMgZG9uZSBieSBUUkFDRV9QUk9QIGlycSAqLworCisJCWJyZWFrIDsKKwljYXNlIEFDVElPTlMoUEM5X01BSU5UKSA6CisJCXN0b3BfcGNtX3RpbWVyMChzbWMscGh5KSA7CisJCUNMRUFSKFBMQyhucCxQTF9DTlRSTF9CKSxQTF9QQ19KT0lOKSA7CisJCUNMRUFSKFBMQyhucCxQTF9DTlRSTF9CKSxQTF9MT05HKSA7CisJCUNMRUFSKFBMQyhucCxQTF9JTlRSX01BU0spLFBMX0xFX0NUUikgOwkvKiBkaXNhYmxlIExFTSBpbnQuICovCisJCXNtX3BoX2xlbV9zdG9wKHNtYyxucCkgOwkJLyogZGlzYWJsZSBMRU0gKi8KKwkJcGh5LT5jZl9sb29wID0gRkFMU0UgOworCQlwaHktPmNmX2pvaW4gPSBGQUxTRSA7CisJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9DRk0sQ0ZfSk9JTitucCkgOworCQlwbGNfZ29fc3RhdGUoc21jLG5wLFBMX1BDTV9TVE9QKSA7CisJCW1pYi0+ZmRkaVBPUlRDb25uZWN0U3RhdGUgPSBQQ01fRElTQUJMRUQgOworCQlTRVRNQVNLKFBMQyhucCxQTF9DTlRSTF9CKSxQTF9NQUlOVCxQTF9NQUlOVCkgOworCQlzbV9waF9saW5lc3RhdGUoc21jLG5wLChpbnQpIE1JQjJMUyhtaWItPmZkZGlQT1JUTWFpbnRfTFMpKSA7CisJCW91dHB3KFBMQyhucCxQTF9DTlRSTF9BKSxQTF9TQ19CWVBBU1MpIDsKKwkJQUNUSU9OU19ET05FKCkgOworCQlicmVhayA7CisJY2FzZSBQQzlfTUFJTlQgOgorCQlEQl9QQ01OKDEsIlBDTSAlYyA6IE1BSU5UXG4iLHBoeS0+cGh5X25hbWUsMCkgOworCQkvKlBDOTAqLworCQlpZiAoY21kID09IFBDX0VOQUJMRSkgeworCQkJR09fU1RBVEUoUEMwX09GRikgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrIDsKKworCWRlZmF1bHQ6CisJCVNNVF9QQU5JQyhzbWMsU01UX0UwMTE4LCBTTVRfRTAxMThfTVNHKSA7CisJCWJyZWFrIDsKKwl9Cit9CisKKy8qCisgKiBmb3JjZSBsaW5lIHN0YXRlIG9uIGEgUEhZIG91dHB1dAkob25seSBpbiBNQUlOVCBzdGF0ZSkKKyAqLworc3RhdGljIHZvaWQgc21fcGhfbGluZXN0YXRlKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcGh5LCBpbnQgbHMpCit7CisJaW50CWNudHJsIDsKKworCVNLX1VOVVNFRChzbWMpIDsKKworCWNudHJsID0gKGlucHcoUExDKHBoeSxQTF9DTlRSTF9CKSkgJiB+UExfTUFJTlRfTFMpIHwKKwkJCQkJCVBMX1BDTV9TVE9QIHwgUExfTUFJTlQgOworCXN3aXRjaChscykgeworCWNhc2UgUENfUUxTOiAJCS8qIEZvcmNlIFF1aWV0ICovCisJCWNudHJsIHw9IFBMX01fUVVJMCA7CisJCWJyZWFrIDsKKwljYXNlIFBDX01MUzogCQkvKiBGb3JjZSBNYXN0ZXIgKi8KKwkJY250cmwgfD0gUExfTV9NQVNUUiA7CisJCWJyZWFrIDsKKwljYXNlIFBDX0hMUzogCQkvKiBGb3JjZSBIYWx0ICovCisJCWNudHJsIHw9IFBMX01fSEFMVCA7CisJCWJyZWFrIDsKKwlkZWZhdWx0IDoKKwljYXNlIFBDX0lMUzogCQkvKiBGb3JjZSBJZGxlICovCisJCWNudHJsIHw9IFBMX01fSURMRSA7CisJCWJyZWFrIDsKKwljYXNlIFBDX0xTX1BEUjogCS8qIEVuYWJsZSByZXBlYXQgZmlsdGVyICovCisJCWNudHJsIHw9IFBMX01fVFBEUiA7CisJCWJyZWFrIDsKKwl9CisJb3V0cHcoUExDKHBoeSxQTF9DTlRSTF9CKSxjbnRybCkgOworfQorCitzdGF0aWMgdm9pZCByZXNldF9sZW1fc3RydWN0KHN0cnVjdCBzX3BoeSAqcGh5KQoreworCXN0cnVjdCBsZW1fY291bnRlciAqbGVtID0gJnBoeS0+bGVtIDsKKworCXBoeS0+bWliLT5mZGRpUE9SVExlcl9Fc3RpbWF0ZSA9IDE1IDsKKwlsZW0tPmxlbV9mbG9hdF9iZXIgPSAxNSAqIDEwMCA7Cit9CisKKy8qCisgKiBsaW5rIGVycm9yIG1vbml0b3IKKyAqLworc3RhdGljIHZvaWQgbGVtX2V2YWx1YXRlKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc19waHkgKnBoeSkKK3sKKwlpbnQgYmVyIDsKKwl1X2xvbmcgZXJyb3JzIDsKKwlzdHJ1Y3QgbGVtX2NvdW50ZXIgKmxlbSA9ICZwaHktPmxlbSA7CisJc3RydWN0IGZkZGlfbWliX3AJKm1pYiA7CisJaW50CQkJY29uZCA7CisKKwltaWIgPSBwaHktPm1pYiA7CisKKwlpZiAoIWxlbS0+bGVtX29uKQorCQlyZXR1cm4gOworCisJZXJyb3JzID0gaW5wdyhQTEMoKChpbnQpIHBoeS0+bnApLFBMX0xJTktfRVJSX0NUUikpIDsKKwlsZW0tPmxlbV9lcnJvcnMgKz0gZXJyb3JzIDsKKwltaWItPmZkZGlQT1JUTGVtX0N0ICs9IGVycm9ycyA7CisKKwllcnJvcnMgPSBsZW0tPmxlbV9lcnJvcnMgOworCS8qCisJICogY2FsY3VsYXRpb24gaXMgY2FsbGVkIG9uIGEgaW50ZXJ2YWxsIG9mIDggc2Vjb25kcworCSAqCS0+IHRoaXMgbWVhbnMsIHRoYXQgb25lIGVycm9yIGluIDggc2VjLiBpcyBvbmUgb2YgOCoxMjUqMTBFNgorCSAqCXRoZSBzYW1lIGFzIEJFUiA9IDEwRS05CisJICogUGxlYXNlIG5vdGU6CisJICoJLT4gOSBlcnJvcnMgaW4gOCBzZWNvbmRzIG1lYW46CisJICoJICAgQkVSID0gOSAqIDEwRS05ICBhbmQgdGhpcyBpcworCSAqCSAgICA8IDEwRS04LCBzbyB0aGUgbGltaXQgb2YgMTBFLTggaXMgbm90IHJlYWNoZWQhCisJICovCisKKwkJaWYgKCFlcnJvcnMpCQliZXIgPSAxNSA7CisJZWxzZQlpZiAoZXJyb3JzIDw9IDkpCWJlciA9IDkgOworCWVsc2UJaWYgKGVycm9ycyA8PSA5OSkJYmVyID0gOCA7CisJZWxzZQlpZiAoZXJyb3JzIDw9IDk5OSkJYmVyID0gNyA7CisJZWxzZQlpZiAoZXJyb3JzIDw9IDk5OTkpCWJlciA9IDYgOworCWVsc2UJaWYgKGVycm9ycyA8PSA5OTk5OSkJYmVyID0gNSA7CisJZWxzZQlpZiAoZXJyb3JzIDw9IDk5OTk5OSkJYmVyID0gNCA7CisJZWxzZQlpZiAoZXJyb3JzIDw9IDk5OTk5OTkpCWJlciA9IDMgOworCWVsc2UJaWYgKGVycm9ycyA8PSA5OTk5OTk5OSkJYmVyID0gMiA7CisJZWxzZQlpZiAoZXJyb3JzIDw9IDk5OTk5OTk5OSkgYmVyID0gMSA7CisJZWxzZQkJCQliZXIgPSAwIDsKKworCS8qCisJICogd2VpZ2h0ZWQgYXZlcmFnZQorCSAqLworCWJlciAqPSAxMDAgOworCWxlbS0+bGVtX2Zsb2F0X2JlciA9IGxlbS0+bGVtX2Zsb2F0X2JlciAqIDcgKyBiZXIgKiAzIDsKKwlsZW0tPmxlbV9mbG9hdF9iZXIgLz0gMTAgOworCW1pYi0+ZmRkaVBPUlRMZXJfRXN0aW1hdGUgPSBsZW0tPmxlbV9mbG9hdF9iZXIgLyAxMDAgOworCWlmIChtaWItPmZkZGlQT1JUTGVyX0VzdGltYXRlIDwgNCkgeworCQltaWItPmZkZGlQT1JUTGVyX0VzdGltYXRlID0gNCA7CisJfQorCisJaWYgKGxlbS0+bGVtX2Vycm9ycykgeworCQlEQl9QQ01OKDEsIkxFTSAlYyA6XG4iLHBoeS0+bnAgPT0gUEI/ICdCJyA6ICdBJywwKSA7CisJCURCX1BDTU4oMSwiZXJyb3JzICAgICAgOiAlbGRcbiIsbGVtLT5sZW1fZXJyb3JzLDApIDsKKwkJREJfUENNTigxLCJzdW1fZXJyb3JzICA6ICVsZFxuIixtaWItPmZkZGlQT1JUTGVtX0N0LDApIDsKKwkJREJfUENNTigxLCJjdXJyZW50IEJFUiA6IDEwRS0lZFxuIixiZXIvMTAwLDApIDsKKwkJREJfUENNTigxLCJmbG9hdCBCRVIgICA6IDEwRS0oJWQvMTAwKVxuIixsZW0tPmxlbV9mbG9hdF9iZXIsMCkgOworCQlEQl9QQ01OKDEsImF2Zy4gQkVSICAgIDogMTBFLSVkXG4iLAorCQkJbWliLT5mZGRpUE9SVExlcl9Fc3RpbWF0ZSwwKSA7CisJfQorCisJbGVtLT5sZW1fZXJyb3JzID0gMEwgOworCisjaWZuZGVmCVNMSU1fU01UCisJY29uZCA9IChtaWItPmZkZGlQT1JUTGVyX0VzdGltYXRlIDw9IG1pYi0+ZmRkaVBPUlRMZXJfQWxhcm0pID8KKwkJVFJVRSA6IEZBTFNFIDsKKyNpZmRlZglTTVRfRVhUX0NVVE9GRgorCXNtdF9sZXJfYWxhcm1fY2hlY2soc21jLHBoeSxjb25kKSA7CisjZW5kaWYJLyogblNNVF9FWFRfQ1VUT0ZGICovCisJaWYgKGNvbmQgIT0gbWliLT5mZGRpUE9SVExlckZsYWcpIHsKKwkJc210X3NyZl9ldmVudChzbWMsU01UX0NPTkRfUE9SVF9MRVIsCisJCQkoaW50KSAoSU5ERVhfUE9SVCsgcGh5LT5ucCkgLGNvbmQpIDsKKwl9CisjZW5kaWYKKworCWlmICgJbWliLT5mZGRpUE9SVExlcl9Fc3RpbWF0ZSA8PSBtaWItPmZkZGlQT1JUTGVyX0N1dG9mZikgeworCQlwaHktPnBjX2xlbV9mYWlsID0gVFJVRSA7CQkvKiBmbGFnICovCisJCW1pYi0+ZmRkaVBPUlRMZW1fUmVqZWN0X0N0KysgOworCQkvKgorCQkgKiAiZm9yZ2l2ZSAxMGUtMiIgaWYgd2UgY3V0b2ZmIHNvIHdlIGNhbiBjb21lCisJCSAqIHVwIGFnYWluIC4uCisJCSAqLworCQlsZW0tPmxlbV9mbG9hdF9iZXIgKz0gMioxMDAgOworCisJCS8qUEM4MWIqLworI2lmZGVmCUNPTkNFTlRSQVRPUgorCQlEQl9QQ01OKDEsIlBDTTogTEVSIGN1dG9mZiBvbiBwb3J0ICVkIGN1dG9mZiAlZFxuIiwKKwkJCXBoeS0+bnAsIG1pYi0+ZmRkaVBPUlRMZXJfQ3V0b2ZmKSA7CisjZW5kaWYKKyNpZmRlZglTTVRfRVhUX0NVVE9GRgorCQlzbXRfcG9ydF9vZmZfZXZlbnQoc21jLHBoeS0+bnApOworI2Vsc2UJLyogblNNVF9FWFRfQ1VUT0ZGICovCisJCXF1ZXVlX2V2ZW50KHNtYywoaW50KShFVkVOVF9QQ00rcGh5LT5ucCksUENfU1RBUlQpIDsKKyNlbmRpZgkvKiBuU01UX0VYVF9DVVRPRkYgKi8KKwl9Cit9CisKKy8qCisgKiBjYWxsZWQgYnkgU01UIHRvIGNhbGN1bGF0ZSBMRU0gYml0IGVycm9yIHJhdGUKKyAqLwordm9pZCBzbV9sZW1fZXZhbHVhdGUoc3RydWN0IHNfc21jICpzbWMpCit7CisJaW50IG5wIDsKKworCWZvciAobnAgPSAwIDsgbnAgPCBOVU1QSFlTIDsgbnArKykKKwkJbGVtX2V2YWx1YXRlKHNtYywmc21jLT55W25wXSkgOworfQorCitzdGF0aWMgdm9pZCBsZW1fY2hlY2tfbGN0KHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc19waHkgKnBoeSkKK3sKKwlzdHJ1Y3QgbGVtX2NvdW50ZXIJKmxlbSA9ICZwaHktPmxlbSA7CisJc3RydWN0IGZkZGlfbWliX3AJKm1pYiA7CisJaW50IGVycm9ycyA7CisKKwltaWIgPSBwaHktPm1pYiA7CisKKwlwaHktPnBjX2xlbV9mYWlsID0gRkFMU0UgOwkJLyogZmxhZyAqLworCWVycm9ycyA9IGlucHcoUExDKCgoaW50KXBoeS0+bnApLFBMX0xJTktfRVJSX0NUUikpIDsKKwlsZW0tPmxlbV9lcnJvcnMgKz0gZXJyb3JzIDsKKwltaWItPmZkZGlQT1JUTGVtX0N0ICs9IGVycm9ycyA7CisJaWYgKGxlbS0+bGVtX2Vycm9ycykgeworCQlzd2l0Y2gocGh5LT5sY190ZXN0KSB7CisJCWNhc2UgTENfU0hPUlQ6CisJCQlpZiAobGVtLT5sZW1fZXJyb3JzID49IHNtYy0+cy5sY3Rfc2hvcnQpCisJCQkJcGh5LT5wY19sZW1fZmFpbCA9IFRSVUUgOworCQkJYnJlYWsgOworCQljYXNlIExDX01FRElVTToKKwkJCWlmIChsZW0tPmxlbV9lcnJvcnMgPj0gc21jLT5zLmxjdF9tZWRpdW0pCisJCQkJcGh5LT5wY19sZW1fZmFpbCA9IFRSVUUgOworCQkJYnJlYWsgOworCQljYXNlIExDX0xPTkc6CisJCQlpZiAobGVtLT5sZW1fZXJyb3JzID49IHNtYy0+cy5sY3RfbG9uZykKKwkJCQlwaHktPnBjX2xlbV9mYWlsID0gVFJVRSA7CisJCQlicmVhayA7CisJCWNhc2UgTENfRVhURU5ERUQ6CisJCQlpZiAobGVtLT5sZW1fZXJyb3JzID49IHNtYy0+cy5sY3RfZXh0ZW5kZWQpCisJCQkJcGh5LT5wY19sZW1fZmFpbCA9IFRSVUUgOworCQkJYnJlYWsgOworCQl9CisJCURCX1BDTU4oMSwiID4+ZXJyb3JzIDogJWRcbiIsbGVtLT5sZW1fZXJyb3JzLDApIDsKKwl9CisJaWYgKHBoeS0+cGNfbGVtX2ZhaWwpIHsKKwkJbWliLT5mZGRpUE9SVExDVEZhaWxfQ3QrKyA7CisJCW1pYi0+ZmRkaVBPUlRMZW1fUmVqZWN0X0N0KysgOworCX0KKwllbHNlCisJCW1pYi0+ZmRkaVBPUlRMQ1RGYWlsX0N0ID0gMCA7Cit9CisKKy8qCisgKiBMRU0gZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkIHNtX3BoX2xlbV9zdGFydChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG5wLCBpbnQgdGhyZXNob2xkKQoreworCXN0cnVjdCBsZW1fY291bnRlciAqbGVtID0gJnNtYy0+eVtucF0ubGVtIDsKKworCWxlbS0+bGVtX29uID0gMSA7CisJbGVtLT5sZW1fZXJyb3JzID0gMEwgOworCisJLyogRG8gTk9UIHJlc2V0IG1pYi0+ZmRkaVBPUlRMZXJfRXN0aW1hdGUgaGVyZS4gSXQgaXMgY2FsbGVkIHRvbworCSAqIG9mdGVuLgorCSAqLworCisJb3V0cHcoUExDKG5wLFBMX0xFX1RIUkVTSE9MRCksdGhyZXNob2xkKSA7CisJKHZvaWQpaW5wdyhQTEMobnAsUExfTElOS19FUlJfQ1RSKSkgOwkvKiBjbGVhciBlcnJvciBjb3VudGVyICovCisKKwkvKiBlbmFibGUgTEUgSU5UICovCisJU0VUTUFTSyhQTEMobnAsUExfSU5UUl9NQVNLKSxQTF9MRV9DVFIsUExfTEVfQ1RSKSA7Cit9CisKK3N0YXRpYyB2b2lkIHNtX3BoX2xlbV9zdG9wKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbnApCit7CisJc3RydWN0IGxlbV9jb3VudGVyICpsZW0gPSAmc21jLT55W25wXS5sZW0gOworCisJbGVtLT5sZW1fb24gPSAwIDsKKwlDTEVBUihQTEMobnAsUExfSU5UUl9NQVNLKSxQTF9MRV9DVFIpIDsKK30KKworLyogQVJHU1VTRUQgKi8KK3ZvaWQgc21fcG1fbHNfbGF0Y2goc3RydWN0IHNfc21jICpzbWMsIGludCBwaHksIGludCBvbl9vZmYpCisvKiBpbnQgb25fb2ZmOwllbi0gb3IgZGlzYWJsZSBpZGVudC4gbHMgKi8KK3sKKwlTS19VTlVTRUQoc21jKSA7CisKKwlwaHkgPSBwaHkgOyBvbl9vZmYgPSBvbl9vZmYgOworfQorCisKKy8qCisgKiBQQ00gcHNldWRvIGNvZGUKKyAqIHJlY2VpdmUgYWN0aW9ucyBhcmUgY2FsbGVkIEFGVEVSIHRoZSBiaXQgbiBpcyByZWNlaXZlZCwKKyAqIGkuZS4gaWYgcGNfcmNvZGVfYWN0aW9ucyg1KSBpcyBjYWxsZWQsIGJpdCA2IGlzIHRoZSBuZXh0IGJpdCB0byBiZSByZWNlaXZlZAorICovCisKKy8qCisgKiBQQ00gcHNldWRvIGNvZGUgNS4xIC4uIDYuMQorICovCitzdGF0aWMgdm9pZCBwY19yY29kZV9hY3Rpb25zKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgYml0LCBzdHJ1Y3Qgc19waHkgKnBoeSkKK3sKKwlzdHJ1Y3QgZmRkaV9taWJfcAkqbWliIDsKKworCW1pYiA9IHBoeS0+bWliIDsKKworCURCX1BDTU4oMSwiU0lHIHJlYyAleCAleDogXG4iLCBiaXQscGh5LT5yX3ZhbFtiaXRdICkgOworCWJpdCsrIDsKKworCXN3aXRjaChiaXQpIHsKKwljYXNlIDA6CisJY2FzZSAxOgorCWNhc2UgMjoKKwkJYnJlYWsgOworCWNhc2UgMyA6CisJCWlmIChwaHktPnJfdmFsWzFdID09IDAgJiYgcGh5LT5yX3ZhbFsyXSA9PSAwKQorCQkJbWliLT5mZGRpUE9SVE5laWdoYm9yVHlwZSA9IFRBIDsKKwkJZWxzZSBpZiAocGh5LT5yX3ZhbFsxXSA9PSAwICYmIHBoeS0+cl92YWxbMl0gPT0gMSkKKwkJCW1pYi0+ZmRkaVBPUlROZWlnaGJvclR5cGUgPSBUQiA7CisJCWVsc2UgaWYgKHBoeS0+cl92YWxbMV0gPT0gMSAmJiBwaHktPnJfdmFsWzJdID09IDApCisJCQltaWItPmZkZGlQT1JUTmVpZ2hib3JUeXBlID0gVFMgOworCQllbHNlIGlmIChwaHktPnJfdmFsWzFdID09IDEgJiYgcGh5LT5yX3ZhbFsyXSA9PSAxKQorCQkJbWliLT5mZGRpUE9SVE5laWdoYm9yVHlwZSA9IFRNIDsKKwkJYnJlYWsgOworCWNhc2UgNDoKKwkJaWYgKG1pYi0+ZmRkaVBPUlRNeV9UeXBlID09IFRNICYmCisJCQltaWItPmZkZGlQT1JUTmVpZ2hib3JUeXBlID09IFRNKSB7CisJCQlEQl9QQ01OKDEsIlBDTSAlYyA6IEUxMDAgd2l0aGhvbGQgTS1NXG4iLAorCQkJCXBoeS0+cGh5X25hbWUsMCkgOworCQkJbWliLT5mZGRpUE9SVFBDX1dpdGhob2xkID0gUENfV0hfTV9NIDsKKwkJCVJTX1NFVChzbWMsUlNfRVZFTlQpIDsKKwkJfQorCQllbHNlIGlmIChwaHktPnRfdmFsWzNdIHx8IHBoeS0+cl92YWxbM10pIHsKKwkJCW1pYi0+ZmRkaVBPUlRQQ19XaXRoaG9sZCA9IFBDX1dIX05PTkUgOworCQkJaWYgKG1pYi0+ZmRkaVBPUlRNeV9UeXBlID09IFRNIHx8CisJCQkgICAgbWliLT5mZGRpUE9SVE5laWdoYm9yVHlwZSA9PSBUTSkKKwkJCQlwaHktPnBjX21vZGUgPSBQTV9UUkVFIDsKKwkJCWVsc2UKKwkJCQlwaHktPnBjX21vZGUgPSBQTV9QRUVSIDsKKworCQkJLyogcmVldmFsdWF0ZSB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhICh3Y19mbGFnKSAqLworCQkJYWxsX3NlbGVjdGlvbl9jcml0ZXJpYSAoc21jKTsKKworCQkJaWYgKHBoeS0+d2NfZmxhZykgeworCQkJCW1pYi0+ZmRkaVBPUlRQQ19XaXRoaG9sZCA9IFBDX1dIX1BBVEggOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJbWliLT5mZGRpUE9SVFBDX1dpdGhob2xkID0gUENfV0hfT1RIRVIgOworCQkJUlNfU0VUKHNtYyxSU19FVkVOVCkgOworCQkJREJfUENNTigxLCJQQ00gJWMgOiBFMTAxIHdpdGhob2xkIG90aGVyXG4iLAorCQkJCXBoeS0+cGh5X25hbWUsMCkgOworCQl9CisJCXBoeS0+dHdpc3RlZCA9ICgobWliLT5mZGRpUE9SVE15X1R5cGUgIT0gVFMpICYmCisJCQkJKG1pYi0+ZmRkaVBPUlRNeV9UeXBlICE9IFRNKSAmJgorCQkJCShtaWItPmZkZGlQT1JUTmVpZ2hib3JUeXBlID09CisJCQkJbWliLT5mZGRpUE9SVE15X1R5cGUpKSA7CisJCWlmIChwaHktPnR3aXN0ZWQpIHsKKwkJCURCX1BDTU4oMSwiUENNICVjIDogRTEwMiAhISEgVFdJU1RFRCAhISFcbiIsCisJCQkJcGh5LT5waHlfbmFtZSwwKSA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgNSA6CisJCWJyZWFrIDsKKwljYXNlIDY6CisJCWlmIChwaHktPnRfdmFsWzRdIHx8IHBoeS0+cl92YWxbNF0pIHsKKwkJCWlmICgocGh5LT50X3ZhbFs0XSAmJiBwaHktPnRfdmFsWzVdKSB8fAorCQkJICAgIChwaHktPnJfdmFsWzRdICYmIHBoeS0+cl92YWxbNV0pICkKKwkJCQlwaHktPmxjX3Rlc3QgPSBMQ19FWFRFTkRFRCA7CisJCQllbHNlCisJCQkJcGh5LT5sY190ZXN0ID0gTENfTE9ORyA7CisJCX0KKwkJZWxzZSBpZiAocGh5LT50X3ZhbFs1XSB8fCBwaHktPnJfdmFsWzVdKQorCQkJcGh5LT5sY190ZXN0ID0gTENfTUVESVVNIDsKKwkJZWxzZQorCQkJcGh5LT5sY190ZXN0ID0gTENfU0hPUlQgOworCQlzd2l0Y2ggKHBoeS0+bGNfdGVzdCkgeworCQljYXNlIExDX1NIT1JUIDoJCQkJLyogNTBtcyAqLworCQkJb3V0cHcoUExDKChpbnQpcGh5LT5ucCxQTF9MQ19MRU5HVEgpLCBUUF9MQ19MRU5HVEggKSA7CisJCQlwaHktPnRfbmV4dFs3XSA9IHNtYy0+cy5wY21fbGNfc2hvcnQgOworCQkJYnJlYWsgOworCQljYXNlIExDX01FRElVTSA6CQkJLyogNTAwbXMgKi8KKwkJCW91dHB3KFBMQygoaW50KXBoeS0+bnAsUExfTENfTEVOR1RIKSwgVFBfTENfTE9OR0xOICkgOworCQkJcGh5LT50X25leHRbN10gPSBzbWMtPnMucGNtX2xjX21lZGl1bSA7CisJCQlicmVhayA7CisJCWNhc2UgTENfTE9ORyA6CisJCQlTRVRNQVNLKFBMQygoaW50KXBoeS0+bnAsUExfQ05UUkxfQiksUExfTE9ORyxQTF9MT05HKSA7CisJCQlwaHktPnRfbmV4dFs3XSA9IHNtYy0+cy5wY21fbGNfbG9uZyA7CisJCQlicmVhayA7CisJCWNhc2UgTENfRVhURU5ERUQgOgorCQkJU0VUTUFTSyhQTEMoKGludClwaHktPm5wLFBMX0NOVFJMX0IpLFBMX0xPTkcsUExfTE9ORykgOworCQkJcGh5LT50X25leHRbN10gPSBzbWMtPnMucGNtX2xjX2V4dGVuZGVkIDsKKwkJCWJyZWFrIDsKKwkJfQorCQlpZiAocGh5LT50X25leHRbN10gPiBzbWMtPnMucGNtX2xjX21lZGl1bSkgeworCQkJc3RhcnRfcGNtX3RpbWVyMChzbWMscGh5LT50X25leHRbN10sUENfVElNRU9VVF9MQ1QscGh5KTsKKwkJfQorCQlEQl9QQ01OKDEsIkxDVCB0aW1lciA9ICVsZCB1c1xuIiwgcGh5LT50X25leHRbN10sIDApIDsKKwkJcGh5LT50X25leHRbOV0gPSBzbWMtPnMucGNtX3RfbmV4dF85IDsKKwkJYnJlYWsgOworCWNhc2UgNzoKKwkJaWYgKHBoeS0+dF92YWxbNl0pIHsKKwkJCXBoeS0+Y2ZfbG9vcCA9IFRSVUUgOworCQl9CisJCXBoeS0+dGRfZmxhZyA9IFRSVUUgOworCQlicmVhayA7CisJY2FzZSA4OgorCQlpZiAocGh5LT50X3ZhbFs3XSB8fCBwaHktPnJfdmFsWzddKSB7CisJCQlEQl9QQ01OKDEsIlBDTSAlYyA6IEUxMDMgTENUIGZhaWwgJXNcbiIsCisJCQkJcGh5LT5waHlfbmFtZSxwaHktPnRfdmFsWzddPyAibG9jYWwiOiJyZW1vdGUiKSA7CisJCQlxdWV1ZV9ldmVudChzbWMsKGludCkoRVZFTlRfUENNK3BoeS0+bnApLFBDX1NUQVJUKSA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgOToKKwkJaWYgKHBoeS0+dF92YWxbOF0gfHwgcGh5LT5yX3ZhbFs4XSkgeworCQkJaWYgKHBoeS0+dF92YWxbOF0pCisJCQkJcGh5LT5jZl9sb29wID0gVFJVRSA7CisJCQlwaHktPnRkX2ZsYWcgPSBUUlVFIDsKKwkJfQorCQlicmVhayA7CisJY2FzZSAxMDoKKwkJaWYgKHBoeS0+cl92YWxbOV0pIHsKKwkJCS8qIG5laWdoYm9yIGludGVuZHMgdG8gaGF2ZSBNQUMgb24gb3V0cHV0ICovIDsKKwkJCW1pYi0+ZmRkaVBPUlRNYWNJbmRpY2F0ZWQuUl92YWwgPSBUUlVFIDsKKwkJfQorCQllbHNlIHsKKwkJCS8qIG5laWdoYm9yIGRvZXMgbm90IGludGVuZCB0byBoYXZlIE1BQyBvbiBvdXRwdXQgKi8gOworCQkJbWliLT5mZGRpUE9SVE1hY0luZGljYXRlZC5SX3ZhbCA9IEZBTFNFIDsKKwkJfQorCQlicmVhayA7CisJfQorfQorCisvKgorICogUENNIHBzZXVkbyBjb2RlIDUuMSAuLiA2LjEKKyAqLworc3RhdGljIHZvaWQgcGNfdGNvZGVfYWN0aW9ucyhzdHJ1Y3Qgc19zbWMgKnNtYywgY29uc3QgaW50IGJpdCwgc3RydWN0IHNfcGh5ICpwaHkpCit7CisJaW50CW5wID0gcGh5LT5ucCA7CisJc3RydWN0IGZkZGlfbWliX3AJKm1pYiA7CisKKwltaWIgPSBwaHktPm1pYiA7CisKKwlzd2l0Y2goYml0KSB7CisJY2FzZSAwOgorCQlwaHktPnRfdmFsWzBdID0gMCA7CQkvKiBubyBlc2NhcGUgdXNlZCAqLworCQlicmVhayA7CisJY2FzZSAxOgorCQlpZiAobWliLT5mZGRpUE9SVE15X1R5cGUgPT0gVFMgfHwgbWliLT5mZGRpUE9SVE15X1R5cGUgPT0gVE0pCisJCQlwaHktPnRfdmFsWzFdID0gMSA7CisJCWVsc2UKKwkJCXBoeS0+dF92YWxbMV0gPSAwIDsKKwkJYnJlYWsgOworCWNhc2UgMiA6CisJCWlmIChtaWItPmZkZGlQT1JUTXlfVHlwZSA9PSBUQiB8fCBtaWItPmZkZGlQT1JUTXlfVHlwZSA9PSBUTSkKKwkJCXBoeS0+dF92YWxbMl0gPSAxIDsKKwkJZWxzZQorCQkJcGh5LT50X3ZhbFsyXSA9IDAgOworCQlicmVhayA7CisJY2FzZSAzOgorCQl7CisJCWludAl0eXBlLG5lIDsKKwkJaW50CXBvbGljeSA7CisKKwkJdHlwZSA9IG1pYi0+ZmRkaVBPUlRNeV9UeXBlIDsKKwkJbmUgPSBtaWItPmZkZGlQT1JUTmVpZ2hib3JUeXBlIDsKKwkJcG9saWN5ID0gc21jLT5taWIuZmRkaVNNVENvbm5lY3Rpb25Qb2xpY3kgOworCisJCXBoeS0+dF92YWxbM10gPSAxIDsJLyogQWNjZXB0IGNvbm5lY3Rpb24gKi8KKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgVEEgOgorCQkJaWYgKAorCQkJCSgocG9saWN5ICYgUE9MSUNZX0FBKSAmJiBuZSA9PSBUQSkgfHwKKwkJCQkoKHBvbGljeSAmIFBPTElDWV9BQikgJiYgbmUgPT0gVEIpIHx8CisJCQkJKChwb2xpY3kgJiBQT0xJQ1lfQVMpICYmIG5lID09IFRTKSB8fAorCQkJCSgocG9saWN5ICYgUE9MSUNZX0FNKSAmJiBuZSA9PSBUTSkgKQorCQkJCXBoeS0+dF92YWxbM10gPSAwIDsJLyogUmVqZWN0ICovCisJCQlicmVhayA7CisJCWNhc2UgVEIgOgorCQkJaWYgKAorCQkJCSgocG9saWN5ICYgUE9MSUNZX0JBKSAmJiBuZSA9PSBUQSkgfHwKKwkJCQkoKHBvbGljeSAmIFBPTElDWV9CQikgJiYgbmUgPT0gVEIpIHx8CisJCQkJKChwb2xpY3kgJiBQT0xJQ1lfQlMpICYmIG5lID09IFRTKSB8fAorCQkJCSgocG9saWN5ICYgUE9MSUNZX0JNKSAmJiBuZSA9PSBUTSkgKQorCQkJCXBoeS0+dF92YWxbM10gPSAwIDsJLyogUmVqZWN0ICovCisJCQlicmVhayA7CisJCWNhc2UgVFMgOgorCQkJaWYgKAorCQkJCSgocG9saWN5ICYgUE9MSUNZX1NBKSAmJiBuZSA9PSBUQSkgfHwKKwkJCQkoKHBvbGljeSAmIFBPTElDWV9TQikgJiYgbmUgPT0gVEIpIHx8CisJCQkJKChwb2xpY3kgJiBQT0xJQ1lfU1MpICYmIG5lID09IFRTKSB8fAorCQkJCSgocG9saWN5ICYgUE9MSUNZX1NNKSAmJiBuZSA9PSBUTSkgKQorCQkJCXBoeS0+dF92YWxbM10gPSAwIDsJLyogUmVqZWN0ICovCisJCQlicmVhayA7CisJCWNhc2UgVE0gOgorCQkJaWYgKAluZSA9PSBUTSB8fAorCQkJCSgocG9saWN5ICYgUE9MSUNZX01BKSAmJiBuZSA9PSBUQSkgfHwKKwkJCQkoKHBvbGljeSAmIFBPTElDWV9NQikgJiYgbmUgPT0gVEIpIHx8CisJCQkJKChwb2xpY3kgJiBQT0xJQ1lfTVMpICYmIG5lID09IFRTKSB8fAorCQkJCSgocG9saWN5ICYgUE9MSUNZX01NKSAmJiBuZSA9PSBUTSkgKQorCQkJCXBoeS0+dF92YWxbM10gPSAwIDsJLyogUmVqZWN0ICovCisJCQlicmVhayA7CisJCX0KKyNpZm5kZWYJU0xJTV9TTVQKKwkJLyoKKwkJICogZGV0ZWN0IHVuZGVzaXJhYmxlIGNvbm5lY3Rpb24gYXR0ZW1wdCBldmVudAorCQkgKi8KKwkJaWYgKAkodHlwZSA9PSBUQSAmJiBuZSA9PSBUQSApIHx8CisJCQkodHlwZSA9PSBUQSAmJiBuZSA9PSBUUyApIHx8CisJCQkodHlwZSA9PSBUQiAmJiBuZSA9PSBUQiApIHx8CisJCQkodHlwZSA9PSBUQiAmJiBuZSA9PSBUUyApIHx8CisJCQkodHlwZSA9PSBUUyAmJiBuZSA9PSBUQSApIHx8CisJCQkodHlwZSA9PSBUUyAmJiBuZSA9PSBUQiApICkgeworCQkJc210X3NyZl9ldmVudChzbWMsU01UX0VWRU5UX1BPUlRfQ09OTkVDVElPTiwKKwkJCQkoaW50KSAoSU5ERVhfUE9SVCsgcGh5LT5ucCkgLDApIDsKKwkJfQorI2VuZGlmCisJCX0KKwkJYnJlYWsgOworCWNhc2UgNDoKKwkJaWYgKG1pYi0+ZmRkaVBPUlRQQ19XaXRoaG9sZCA9PSBQQ19XSF9OT05FKSB7CisJCQlpZiAocGh5LT5wY19sZW1fZmFpbCkgeworCQkJCXBoeS0+dF92YWxbNF0gPSAxIDsJLyogbG9uZyAqLworCQkJCXBoeS0+dF92YWxbNV0gPSAwIDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXBoeS0+dF92YWxbNF0gPSAwIDsKKwkJCQlpZiAobWliLT5mZGRpUE9SVExDVEZhaWxfQ3QgPiAwKQorCQkJCQlwaHktPnRfdmFsWzVdID0gMSA7CS8qIG1lZGl1bSAqLworCQkJCWVsc2UKKwkJCQkJcGh5LT50X3ZhbFs1XSA9IDAgOwkvKiBzaG9ydCAqLworCisJCQkJLyoKKwkJCQkgKiBJbXBsZW1lbnRlcnMgY2hvaWNlOiB1c2UgbWVkaXVtCisJCQkJICogaW5zdGVhZCBvZiBzaG9ydCB3aGVuIHVuZGVzaXJlZAorCQkJCSAqIGNvbm5lY3Rpb24gYXR0ZW1wdCBpcyBtYWRlLgorCQkJCSAqLworCQkJCWlmIChwaHktPndjX2ZsYWcpCisJCQkJCXBoeS0+dF92YWxbNV0gPSAxIDsJLyogbWVkaXVtICovCisJCQl9CisJCQltaWItPmZkZGlQT1JUQ29ubmVjdFN0YXRlID0gUENNX0NPTk5FQ1RJTkcgOworCQl9CisJCWVsc2UgeworCQkJbWliLT5mZGRpUE9SVENvbm5lY3RTdGF0ZSA9IFBDTV9TVEFOREJZIDsKKwkJCXBoeS0+dF92YWxbNF0gPSAxIDsJLyogZXh0ZW5kZWQgKi8KKwkJCXBoeS0+dF92YWxbNV0gPSAxIDsKKwkJfQorCQlicmVhayA7CisJY2FzZSA1OgorCQlicmVhayA7CisJY2FzZSA2OgorCQkvKiB3ZSBkbyBOT1QgaGF2ZSBhIE1BQyBmb3IgTENUICovCisJCXBoeS0+dF92YWxbNl0gPSAwIDsKKwkJYnJlYWsgOworCWNhc2UgNzoKKwkJcGh5LT5jZl9sb29wID0gRkFMU0UgOworCQlsZW1fY2hlY2tfbGN0KHNtYyxwaHkpIDsKKwkJaWYgKHBoeS0+cGNfbGVtX2ZhaWwpIHsKKwkJCURCX1BDTU4oMSwiUENNICVjIDogRTEwNCBMQ1QgZmFpbGVkXG4iLAorCQkJCXBoeS0+cGh5X25hbWUsMCkgOworCQkJcGh5LT50X3ZhbFs3XSA9IDEgOworCQl9CisJCWVsc2UKKwkJCXBoeS0+dF92YWxbN10gPSAwIDsKKwkJYnJlYWsgOworCWNhc2UgODoKKwkJcGh5LT50X3ZhbFs4XSA9IDAgOwkvKiBEb24ndCByZXF1ZXN0IE1BQyBsb29wYmFjayAqLworCQlicmVhayA7CisJY2FzZSA5OgorCQlwaHktPmNmX2xvb3AgPSAwIDsKKwkJaWYgKChtaWItPmZkZGlQT1JUUENfV2l0aGhvbGQgIT0gUENfV0hfTk9ORSkgfHwKKwkJICAgICAoKHNtYy0+cy5zYXMgPT0gU01UX0RBUykgJiYgKHBoeS0+d2NfZmxhZykpKSB7CisJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUENNK25wLFBDX1NUQVJUKSA7CisJCQlicmVhayA7CisJCX0KKwkJcGh5LT50X3ZhbFs5XSA9IEZBTFNFIDsKKwkJc3dpdGNoIChzbWMtPnMuc2FzKSB7CisJCWNhc2UgU01UX0RBUyA6CisJCQkvKgorCQkJICogTUFDIGludGVuZGVkIG9uIG91dHB1dAorCQkJICovCisJCQlpZiAocGh5LT5wY19tb2RlID09IFBNX1RSRUUpIHsKKwkJCQlpZiAoKG5wID09IFBCKSB8fCAoKG5wID09IFBBKSAmJgorCQkJCShzbWMtPnlbUEJdLm1pYi0+ZmRkaVBPUlRDb25uZWN0U3RhdGUgIT0KKwkJCQkJUENNX0FDVElWRSkpKQorCQkJCQlwaHktPnRfdmFsWzldID0gVFJVRSA7CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZiAobnAgPT0gUEIpCisJCQkJCXBoeS0+dF92YWxbOV0gPSBUUlVFIDsKKwkJCX0KKwkJCWJyZWFrIDsKKwkJY2FzZSBTTVRfU0FTIDoKKwkJCWlmIChucCA9PSBQUykKKwkJCQlwaHktPnRfdmFsWzldID0gVFJVRSA7CisJCQlicmVhayA7CisjaWZkZWYJQ09OQ0VOVFJBVE9SCisJCWNhc2UgU01UX05BQyA6CisJCQkvKgorCQkJICogTUFDIGludGVuZGVkIG9uIG91dHB1dAorCQkJICovCisJCQlpZiAobnAgPT0gUEIpCisJCQkJcGh5LT50X3ZhbFs5XSA9IFRSVUUgOworCQkJYnJlYWsgOworI2VuZGlmCisJCX0KKwkJbWliLT5mZGRpUE9SVE1hY0luZGljYXRlZC5UX3ZhbCA9IHBoeS0+dF92YWxbOV0gOworCQlicmVhayA7CisJfQorCURCX1BDTU4oMSwiU0lHIHNuZCAleCAleDogXG4iLCBiaXQscGh5LT50X3ZhbFtiaXRdICkgOworfQorCisvKgorICogcmV0dXJuIHN0YXR1cyB0d2lzdGVkIChjYWxsZWQgYnkgU01UKQorICovCitpbnQgcGNtX3N0YXR1c190d2lzdGVkKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWludAl0d2lzdCA9IDAgOworCWlmIChzbWMtPnMuc2FzICE9IFNNVF9EQVMpCisJCXJldHVybigwKSA7CisJaWYgKHNtYy0+eVtQQV0udHdpc3RlZCAmJiAoc21jLT55W1BBXS5taWItPmZkZGlQT1JUUENNU3RhdGUgPT0gUEM4X0FDVElWRSkpCisJCXR3aXN0IHw9IDEgOworCWlmIChzbWMtPnlbUEJdLnR3aXN0ZWQgJiYgKHNtYy0+eVtQQl0ubWliLT5mZGRpUE9SVFBDTVN0YXRlID09IFBDOF9BQ1RJVkUpKQorCQl0d2lzdCB8PSAyIDsKKwlyZXR1cm4odHdpc3QpIDsKK30KKworLyoKKyAqIHJldHVybiBzdGF0dXMJKGNhbGxlZCBieSBTTVQpCisgKgl0eXBlCisgKglzdGF0ZQorICoJcmVtb3RlIHBoeSB0eXBlCisgKglyZW1vdGUgbWFjIHllcy9ubworICovCit2b2lkIHBjbV9zdGF0dXNfc3RhdGUoc3RydWN0IHNfc21jICpzbWMsIGludCBucCwgaW50ICp0eXBlLCBpbnQgKnN0YXRlLAorCQkgICAgICBpbnQgKnJlbW90ZSwgaW50ICptYWMpCit7CisJc3RydWN0IHNfcGh5CSpwaHkgPSAmc21jLT55W25wXSA7CisJc3RydWN0IGZkZGlfbWliX3AJKm1pYiA7CisKKwltaWIgPSBwaHktPm1pYiA7CisKKwkvKiByZW1vdGUgUEhZIHR5cGUgYW5kIE1BQyAtIHNldCBvbmx5IGlmIGFjdGl2ZSAqLworCSptYWMgPSAwIDsKKwkqdHlwZSA9IG1pYi0+ZmRkaVBPUlRNeV9UeXBlIDsJCS8qIG91ciBQSFkgdHlwZSAqLworCSpzdGF0ZSA9IG1pYi0+ZmRkaVBPUlRDb25uZWN0U3RhdGUgOworCSpyZW1vdGUgPSBtaWItPmZkZGlQT1JUTmVpZ2hib3JUeXBlIDsKKworCXN3aXRjaChtaWItPmZkZGlQT1JUUENNU3RhdGUpIHsKKwljYXNlIFBDOF9BQ1RJVkUgOgorCQkqbWFjID0gbWliLT5mZGRpUE9SVE1hY0luZGljYXRlZC5SX3ZhbCA7CisJCWJyZWFrIDsKKwl9Cit9CisKKy8qCisgKiByZXR1cm4gcm9vdGVkIHN0YXRpb24gc3RhdHVzIChjYWxsZWQgYnkgU01UKQorICovCitpbnQgcGNtX3Jvb3RlZF9zdGF0aW9uKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWludAluIDsKKworCWZvciAobiA9IDAgOyBuIDwgTlVNUEhZUyA7IG4rKykgeworCQlpZiAoc21jLT55W25dLm1pYi0+ZmRkaVBPUlRQQ01TdGF0ZSA9PSBQQzhfQUNUSVZFICYmCisJCSAgICBzbWMtPnlbbl0ubWliLT5mZGRpUE9SVE5laWdoYm9yVHlwZSA9PSBUTSkKKwkJCXJldHVybigwKSA7CisJfQorCXJldHVybigxKSA7Cit9CisKKy8qCisgKiBJbnRlcnJ1cHQgYWN0aW9ucyBmb3IgUExDICYgUENNIGV2ZW50cworICovCit2b2lkIHBsY19pcnEoc3RydWN0IHNfc21jICpzbWMsIGludCBucCwgdW5zaWduZWQgaW50IGNtZCkKKy8qIGludCBucDsJUEhZIGluZGV4ICovCit7CisJc3RydWN0IHNfcGh5ICpwaHkgPSAmc21jLT55W25wXSA7CisJc3RydWN0IHNfcGxjICpwbGMgPSAmcGh5LT5wbGMgOworCWludAkJbiA7CisjaWZkZWYJU1VQRVJORVRfMworCWludAkJY29ycl9tYXNrIDsKKyNlbmRpZgkvKiBTVVBFUk5FVF8zICovCisJaW50CQlpIDsKKworCWlmIChucCA+PSBzbWMtPnMubnVtcGh5cykgeworCQlwbGMtPnNvZnRfZXJyKysgOworCQlyZXR1cm4gOworCX0KKwlpZiAoY21kICYgUExfRUJVRl9FUlIpIHsJLyogZWxhc3RpYyBidWZmLiBkZXQuIG92ZXItfHVuZGVyZmxvdyovCisJCS8qCisJCSAqIENoZWNrIHdoZXRoZXIgdGhlIFNSRiBDb25kaXRpb24gb2NjdXJyZWQuCisJCSAqLworCQlpZiAoIXBsYy0+ZWJ1Zl9jb250ICYmIHBoeS0+bWliLT5mZGRpUE9SVFBDTVN0YXRlID09IFBDOF9BQ1RJVkUpeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgdGhlIHJlYWwgRWxhc3RpY2l0eSBFcnJvci4KKwkJCSAqIE1vcmUgdGhhbiBvbmUgaW4gYSByb3cgYXJlIHRyZWF0ZWQgYXMgYQorCQkJICogc2luZ2xlIG9uZS4KKwkJCSAqIE9ubHkgY291bnQgdGhpcyBpbiB0aGUgYWN0aXZlIHN0YXRlLgorCQkJICovCisJCQlwaHktPm1pYi0+ZmRkaVBPUlRFQkVycm9yX0N0ICsrIDsKKworCQl9CisKKwkJcGxjLT5lYnVmX2VycisrIDsKKwkJaWYgKHBsYy0+ZWJ1Zl9jb250IDw9IDEwMDApIHsKKwkJCS8qCisJCQkgKiBQcmV2ZW50IGNvdW50ZXIgZnJvbSBiZWluZyB3cmFwcGVkIGFmdGVyCisJCQkgKiBoYW5naW5nIHllYXJzIGluIHRoYXQgaW50ZXJydXB0LgorCQkJICovCisJCQlwbGMtPmVidWZfY29udCsrIDsJLyogRWJ1ZiBjb250aW5vdXMgZXJyb3IgKi8KKwkJfQorCisjaWZkZWYJU1VQRVJORVRfMworCQlpZiAocGxjLT5lYnVmX2NvbnQgPT0gMTAwMCAmJgorCQkJKChpbnB3KFBMQyhucCxQTF9TVEFUVVNfQSkpICYgUExDX1JFVl9NQVNLKSA9PQorCQkJUExDX1JFVl9TTjMpKSB7CisJCQkvKgorCQkJICogVGhpcyBpbnRlcnJ1cHQgcmVtZWFpbmVkIGhpZ2ggZm9yIGF0IGxlYXN0CisJCQkgKiAxMDAwIGNvbnNlY3V0aXZlIGludGVycnVwdCBjYWxscy4KKwkJCSAqCisJCQkgKiBUaGlzIGlzIGNhdXNlZCBieSBhIGhhcmR3YXJlIGVycm9yIG9mIHRoZQorCQkJICogT1JJT04gcGFydCBvZiB0aGUgU3VwZXJuZXQgSUlJIGNoaXBzZXQuCisJCQkgKgorCQkJICogRGlzYWJsZSB0aGlzIGJpdCBmcm9tIHRoZSBtYXNrLgorCQkJICovCisJCQljb3JyX21hc2sgPSAocGxjX2ltc2tfbmEgJiB+UExfRUJVRl9FUlIpIDsKKwkJCW91dHB3KFBMQyhucCxQTF9JTlRSX01BU0spLGNvcnJfbWFzayk7CisKKwkJCS8qCisJCQkgKiBEaXNjb25uZWN0IGZyb20gdGhlIHJpbmcuCisJCQkgKiBDYWxsIHRoZSBkcml2ZXIgd2l0aCB0aGUgcmVzZXQgaW5kaWNhdGlvbi4KKwkJCSAqLworCQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX0VDTSxFQ19ESVNDT05ORUNUKSA7CisKKwkJCS8qCisJCQkgKiBNYWtlIGFuIGVycm9yIGxvZyBlbnRyeS4KKwkJCSAqLworCQkJU01UX0VSUl9MT0coc21jLFNNVF9FMDEzNiwgU01UX0UwMTM2X01TRykgOworCisJCQkvKgorCQkJICogSW5kaWNhdGUgdGhlIFJlc2V0LgorCQkJICovCisJCQlkcnZfcmVzZXRfaW5kaWNhdGlvbihzbWMpIDsKKwkJfQorI2VuZGlmCS8qIFNVUEVSTkVUXzMgKi8KKwl9IGVsc2UgeworCQkvKiBSZXNldCB0aGUgY29udGlub3VzIGVycm9yIHZhcmlhYmxlICovCisJCXBsYy0+ZWJ1Zl9jb250ID0gMCA7CS8qIHJlc2V0IEVidWYgY29udGlub3VzIGVycm9yICovCisJfQorCWlmIChjbWQgJiBQTF9QSFlJTlYpIHsJCS8qIHBoeXNpY2FsIGxheWVyIGludmFsaWQgc2lnbmFsICovCisJCXBsYy0+cGh5aW52KysgOworCX0KKwlpZiAoY21kICYgUExfVlNZTV9DVFIpIHsJLyogdmlvbGF0aW9uIHN5bWJvbCBjb3VudGVyIGhhcyBpbmNyLiovCisJCXBsYy0+dnN5bV9jdHIrKyA7CisJfQorCWlmIChjbWQgJiBQTF9NSU5JX0NUUikgewkvKiBkZXAuIG9uIFBMQ19DTlRSTF9BJ3MgTUlOSV9DVFJfSU5UKi8KKwkJcGxjLT5taW5pX2N0cisrIDsKKwl9CisJaWYgKGNtZCAmIFBMX0xFX0NUUikgewkJLyogbGluayBlcnJvciBldmVudCBjb3VudGVyICovCisJCWludAlqIDsKKworCQkvKgorCQkgKiBub3RlOiBQTF9MSU5LX0VSUl9DVFIgTVVTVCBiZSByZWFkIHRvIGNsZWFyIGl0CisJCSAqLworCQlqID0gaW5wdyhQTEMobnAsUExfTEVfVEhSRVNIT0xEKSkgOworCQlpID0gaW5wdyhQTEMobnAsUExfTElOS19FUlJfQ1RSKSkgOworCisJCWlmIChpIDwgaikgeworCQkJLyogd3JhcHBlZCBhcm91bmQgKi8KKwkJCWkgKz0gMjU2IDsKKwkJfQorCisJCWlmIChwaHktPmxlbS5sZW1fb24pIHsKKwkJCS8qIE5vdGU6IExlbSBlcnJvcnMgc2hhbGwgb25seSBiZSBjb3VudGVkIHdoZW4KKwkJCSAqIGxpbmsgaXMgQUNUSVZFIG9yIExDVCBpcyBhY3RpdmUuCisJCQkgKi8KKwkJCXBoeS0+bGVtLmxlbV9lcnJvcnMgKz0gaSA7CisJCQlwaHktPm1pYi0+ZmRkaVBPUlRMZW1fQ3QgKz0gaSA7CisJCX0KKwl9CisJaWYgKGNtZCAmIFBMX1RQQ19FWFBJUkVEKSB7CS8qIFRQQyB0aW1lciByZWFjaGVkIHplcm8gKi8KKwkJaWYgKHBsYy0+cF9zdGF0ZSA9PSBQU19MQ1QpIHsKKwkJCS8qCisJCQkgKiBlbmQgb2YgTENUCisJCQkgKi8KKwkJCTsKKwkJfQorCQlwbGMtPnRwY19leHArKyA7CisJfQorCWlmIChjbWQgJiBQTF9MU19NQVRDSCkgewkvKiBMUyA9PSBMUyBpbiBQTENfQ05UUkxfQidzIE1BVENIX0xTKi8KKwkJc3dpdGNoIChpbnB3KFBMQyhucCxQTF9DTlRSTF9CKSkgJiBQTF9NQVRDSF9MUykgeworCQljYXNlIFBMX0lfSURMRSA6CXBoeS0+Y3Vycl9scyA9IFBDX0lMUyA7CQlicmVhayA7CisJCWNhc2UgUExfSV9IQUxUIDoJcGh5LT5jdXJyX2xzID0gUENfSExTIDsJCWJyZWFrIDsKKwkJY2FzZSBQTF9JX01BU1RSIDoJcGh5LT5jdXJyX2xzID0gUENfTUxTIDsJCWJyZWFrIDsKKwkJY2FzZSBQTF9JX1FVSUVUIDoJcGh5LT5jdXJyX2xzID0gUENfUUxTIDsJCWJyZWFrIDsKKwkJfQorCX0KKwlpZiAoY21kICYgUExfUENNX0JSRUFLKSB7CS8qIFBDTSBoYXMgZW50ZXJlZCB0aGUgQlJFQUsgc3RhdGUgKi8KKwkJaW50CXJlYXNvbjsKKworCQlyZWFzb24gPSBpbnB3KFBMQyhucCxQTF9TVEFUVVNfQikpICYgUExfQlJFQUtfUkVBU09OIDsKKworCQlzd2l0Y2ggKHJlYXNvbikgeworCQljYXNlIFBMX0JfUENTIDoJCXBsYy0+Yl9wY3MrKyA7CWJyZWFrIDsKKwkJY2FzZSBQTF9CX1RQQyA6CQlwbGMtPmJfdHBjKysgOwlicmVhayA7CisJCWNhc2UgUExfQl9UTkUgOgkJcGxjLT5iX3RuZSsrIDsJYnJlYWsgOworCQljYXNlIFBMX0JfUUxTIDoJCXBsYy0+Yl9xbHMrKyA7CWJyZWFrIDsKKwkJY2FzZSBQTF9CX0lMUyA6CQlwbGMtPmJfaWxzKysgOwlicmVhayA7CisJCWNhc2UgUExfQl9ITFMgOgkJcGxjLT5iX2hscysrIDsJYnJlYWsgOworCQl9CisKKwkJLypqZCAwNS1BdWctMTk5OSBjaGFuZ2VkOiBCdWcgIzEwNDE5ICovCisJCURCX1BDTU4oMSwiUExDICVkOiBNRGNGID0gJXhcbiIsIG5wLCBzbWMtPmUuRGlzY29ubmVjdEZsYWcpOworCQlpZiAoc21jLT5lLkRpc2Nvbm5lY3RGbGFnID09IEZBTFNFKSB7CisJCQlEQl9QQ01OKDEsIlBMQyAlZDogcmVzdGFydCAocmVhc29uICV4KVxuIiwgbnAsIHJlYXNvbik7CisJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUENNK25wLFBDX1NUQVJUKSA7CisJCX0KKwkJZWxzZSB7CisJCQlEQl9QQ01OKDEsIlBMQyAlZDogTk8hISByZXN0YXJ0IChyZWFzb24gJXgpXG4iLCBucCwgcmVhc29uKTsKKwkJfQorCQlyZXR1cm4gOworCX0KKwkvKgorCSAqIElmIGJvdGggQ09ERSAmIEVOQUJMRSBhcmUgc2V0IGlnbm9yZSBlbmFibGUKKwkgKi8KKwlpZiAoY21kICYgUExfUENNX0NPREUpIHsgLyogcmVjZWl2ZSBsYXN0IHNpZ24uLWJpdCB8IExDVCBjb21wbGV0ZSAqLworCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUENNK25wLFBDX1NJR05BTCkgOworCQluID0gaW5wdyhQTEMobnAsUExfUkNWX1ZFQ1RPUikpIDsKKwkJZm9yIChpID0gMCA7IGkgPCBwbGMtPnBfYml0cyA7IGkrKykgeworCQkJcGh5LT5yX3ZhbFtwbGMtPnBfc3RhcnQraV0gPSBuICYgMSA7CisJCQluID4+PSAxIDsKKwkJfQorCX0KKwllbHNlIGlmIChjbWQgJiBQTF9QQ01fRU5BQkxFRCkgeyAvKiBhc3NlcnRlZCBTQ19KT0lOLCBzY3J1Yi5jb21wbGV0ZWQqLworCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUENNK25wLFBDX0pPSU4pIDsKKwl9CisJaWYgKGNtZCAmIFBMX1RSQUNFX1BST1ApIHsJLyogTUxTIHdoaWxlIFBDOF9BQ1RJViB8fCBQQzJfVFJBQ0UgKi8KKwkJLypQQzIyYiovCisJCWlmICghcGh5LT50cl9mbGFnKSB7CisJCQlEQl9QQ01OKDEsIlBDTSA6IGlycSBUUkFDRV9QUk9QICVkICVkXG4iLAorCQkJCW5wLHNtYy0+bWliLmZkZGlTTVRFQ01TdGF0ZSkgOworCQkJcGh5LT50cl9mbGFnID0gVFJVRSA7CisJCQlzbWMtPmUudHJhY2VfcHJvcCB8PSBFTlRJVFlfQklUKEVOVElUWV9QSFkobnApKSA7CisJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfRUNNLEVDX1RSQUNFX1BST1ApIDsKKwkJfQorCX0KKwkvKgorCSAqIGZpbHRlciBQTEMgZ2xpdGNoID8/PworCSAqIFFMUyB8fCBITFMgb25seSB3aGlsZSBpbiBQQzJfVFJBQ0Ugc3RhdGUKKwkgKi8KKwlpZiAoKGNtZCAmIFBMX1NFTEZfVEVTVCkgJiYgKHBoeS0+bWliLT5mZGRpUE9SVFBDTVN0YXRlID09IFBDMl9UUkFDRSkpIHsKKwkJLypQQzIyYSovCisJCWlmIChzbWMtPmUucGF0aF90ZXN0ID09IFBUX1BBU1NFRCkgeworCQkJREJfUENNTigxLCJQQ00gOiBzdGF0ZSA9ICVzICVkXG4iLCBnZXRfcGNtc3RhdGUoc21jLG5wKSwKKwkJCQlwaHktPm1pYi0+ZmRkaVBPUlRQQ01TdGF0ZSkgOworCisJCQlzbWMtPmUucGF0aF90ZXN0ID0gUFRfUEVORElORyA7CisJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfRUNNLEVDX1BBVEhfVEVTVCkgOworCQl9CisJfQorCWlmIChjbWQgJiBQTF9UTkVfRVhQSVJFRCkgewkvKiBUTkU6IGxlbmd0aCBvZiBub2lzZSBldmVudHMgKi8KKwkJLyogYnJlYWtfcmVxdWlyZWQgKFRORSA+IE5TX01heCkgKi8KKwkJaWYgKHBoeS0+bWliLT5mZGRpUE9SVFBDTVN0YXRlID09IFBDOF9BQ1RJVkUpIHsKKwkJCWlmICghcGh5LT50cl9mbGFnKSB7CisJCQkgICBEQl9QQ01OKDEsIlBDTSAlYyA6IFBDODEgJXNcbiIscGh5LT5waHlfbmFtZSwiTlNFIik7CisJCQkgICBxdWV1ZV9ldmVudChzbWMsRVZFTlRfUENNK25wLFBDX1NUQVJUKSA7CisJCQkgICByZXR1cm4gOworCQkJfQorCQl9CisJfQorI2lmCTAKKwlpZiAoY21kICYgUExfTlBfRVJSKSB7CQkvKiBOUCBoYXMgcmVxdWVzdGVkIHRvIHIvdyBhbiBpbnYgcmVnKi8KKwkJLyoKKwkJICogSXQncyBhIGJ1ZyBieSBBTUQKKwkJICovCisJCXBsYy0+bnBfZXJyKysgOworCX0KKwkvKiBwaW4gaW5hY3RpdiAoR05EKSAqLworCWlmIChjbWQgJiBQTF9QQVJJVFlfRVJSKSB7CS8qIHAuIGVycm9yIGRlZGVjdGVkIG9uIFRYOS0wIGlucCAqLworCQlwbGMtPnBhcml0eV9lcnIrKyA7CisJfQorCWlmIChjbWQgJiBQTF9MU0RPKSB7CQkvKiBjYXJyaWVyIGRldGVjdGVkICovCisJCTsKKwl9CisjZW5kaWYKK30KKwordm9pZCBwY21fc2V0X2xjdF9zaG9ydChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG4pCit7CisJaWYgKG4gPD0gMCB8fCBuID4gMTAwMCkKKwkJcmV0dXJuIDsKKwlzbWMtPnMubGN0X3Nob3J0ID0gbiA7Cit9CisKKyNpZmRlZglERUJVRworLyoKKyAqIGZpbGwgc3RhdGUgc3RydWN0CisgKi8KK3ZvaWQgcGNtX2dldF9zdGF0ZShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IHNfcGh5CSpwaHkgOworCXN0cnVjdCBwY21fc3RhdGUgKnBjcyA7CisJaW50CWkgOworCWludAlpaSA7CisJc2hvcnQJcmJpdHMgOworCXNob3J0CXRiaXRzIDsKKwlzdHJ1Y3QgZmRkaV9taWJfcAkqbWliIDsKKworCWZvciAoaSA9IDAsIHBoeSA9IHNtYy0+eSwgcGNzID0gc3RhdGUtPnBjbV9zdGF0ZSA7IGkgPCBOVU1QSFlTIDsKKwkJaSsrICwgcGh5KyssIHBjcysrICkgeworCQltaWIgPSBwaHktPm1pYiA7CisJCXBjcy0+cGNtX3R5cGUgPSAodV9jaGFyKSBtaWItPmZkZGlQT1JUTXlfVHlwZSA7CisJCXBjcy0+cGNtX3N0YXRlID0gKHVfY2hhcikgbWliLT5mZGRpUE9SVFBDTVN0YXRlIDsKKwkJcGNzLT5wY21fbW9kZSA9IHBoeS0+cGNfbW9kZSA7CisJCXBjcy0+cGNtX25laWdoYm9yID0gKHVfY2hhcikgbWliLT5mZGRpUE9SVE5laWdoYm9yVHlwZSA7CisJCXBjcy0+cGNtX2JzZiA9IG1pYi0+ZmRkaVBPUlRCU19GbGFnIDsKKwkJcGNzLT5wY21fbHNmID0gcGh5LT5sc19mbGFnIDsKKwkJcGNzLT5wY21fbGN0X2ZhaWwgPSAodV9jaGFyKSBtaWItPmZkZGlQT1JUTENURmFpbF9DdCA7CisJCXBjcy0+cGNtX2xzX3J4ID0gTFMyTUlCKHNtX3BtX2dldF9scyhzbWMsaSkpIDsKKwkJZm9yIChpaSA9IDAsIHJiaXRzID0gdGJpdHMgPSAwIDsgaWkgPCBOVU1CSVRTIDsgaWkrKykgeworCQkJcmJpdHMgPDw9IDEgOworCQkJdGJpdHMgPDw9IDEgOworCQkJaWYgKHBoeS0+cl92YWxbTlVNQklUUy0xLWlpXSkKKwkJCQlyYml0cyB8PSAxIDsKKwkJCWlmIChwaHktPnRfdmFsW05VTUJJVFMtMS1paV0pCisJCQkJdGJpdHMgfD0gMSA7CisJCX0KKwkJcGNzLT5wY21fcl92YWwgPSByYml0cyA7CisJCXBjcy0+cGNtX3RfdmFsID0gdGJpdHMgOworCX0KK30KKworaW50IGdldF9wY21fc3RhdGUoc3RydWN0IHNfc21jICpzbWMsIGludCBucCkKK3sKKwlpbnQgcGNzIDsKKworCVNLX1VOVVNFRChzbWMpIDsKKworCXN3aXRjaCAoaW5wdyhQTEMobnAsUExfU1RBVFVTX0IpKSAmIFBMX1BDTV9TVEFURSkgeworCQljYXNlIFBMX1BDMCA6CXBjcyA9IFBDX1NUT1AgOwkJYnJlYWsgOworCQljYXNlIFBMX1BDMSA6CXBjcyA9IFBDX1NUQVJUIDsJYnJlYWsgOworCQljYXNlIFBMX1BDMiA6CXBjcyA9IFBDX1RSQUNFIDsJYnJlYWsgOworCQljYXNlIFBMX1BDMyA6CXBjcyA9IFBDX1NJR05BTCA7CWJyZWFrIDsKKwkJY2FzZSBQTF9QQzQgOglwY3MgPSBQQ19TSUdOQUwgOwlicmVhayA7CisJCWNhc2UgUExfUEM1IDoJcGNzID0gUENfU0lHTkFMIDsJYnJlYWsgOworCQljYXNlIFBMX1BDNiA6CXBjcyA9IFBDX0pPSU4gOwkJYnJlYWsgOworCQljYXNlIFBMX1BDNyA6CXBjcyA9IFBDX0pPSU4gOwkJYnJlYWsgOworCQljYXNlIFBMX1BDOCA6CXBjcyA9IFBDX0VOQUJMRSA7CWJyZWFrIDsKKwkJY2FzZSBQTF9QQzkgOglwY3MgPSBQQ19NQUlOVCA7CWJyZWFrIDsKKwkJZGVmYXVsdCA6CXBjcyA9IFBDX0RJU0FCTEUgOyAJYnJlYWsgOworCX0KKwlyZXR1cm4ocGNzKSA7Cit9CisKK2NoYXIgKmdldF9saW5lc3RhdGUoc3RydWN0IHNfc21jICpzbWMsIGludCBucCkKK3sKKwljaGFyICpscyA9ICIiIDsKKworCVNLX1VOVVNFRChzbWMpIDsKKworCXN3aXRjaCAoaW5wdyhQTEMobnAsUExfU1RBVFVTX0EpKSAmIFBMX0xJTkVfU1QpIHsKKwkJY2FzZSBQTF9MX05MUyA6CWxzID0gIk5PSVNFIiA7CWJyZWFrIDsKKwkJY2FzZSBQTF9MX0FMUyA6CWxzID0gIkFDVElWIiA7CWJyZWFrIDsKKwkJY2FzZSBQTF9MX1VORCA6CWxzID0gIlVOREVGIiA7CWJyZWFrIDsKKwkJY2FzZSBQTF9MX0lMUzQ6CWxzID0gIklMUyA0IiA7CWJyZWFrIDsKKwkJY2FzZSBQTF9MX1FMUyA6CWxzID0gIlFMUyIgOwlicmVhayA7CisJCWNhc2UgUExfTF9NTFMgOglscyA9ICJNTFMiIDsJYnJlYWsgOworCQljYXNlIFBMX0xfSExTIDoJbHMgPSAiSExTIiA7CWJyZWFrIDsKKwkJY2FzZSBQTF9MX0lMUzE2OmxzID0gIklMUzE2IiA7CWJyZWFrIDsKKyNpZmRlZglsaW50CisJCWRlZmF1bHQ6CWxzID0gInVua25vd24iIDsgYnJlYWsgOworI2VuZGlmCisJfQorCXJldHVybihscykgOworfQorCitjaGFyICpnZXRfcGNtc3RhdGUoc3RydWN0IHNfc21jICpzbWMsIGludCBucCkKK3sKKwljaGFyICpwY3MgOworCQorCVNLX1VOVVNFRChzbWMpIDsKKworCXN3aXRjaCAoaW5wdyhQTEMobnAsUExfU1RBVFVTX0IpKSAmIFBMX1BDTV9TVEFURSkgeworCQljYXNlIFBMX1BDMCA6CXBjcyA9ICJPRkYiIDsJCWJyZWFrIDsKKwkJY2FzZSBQTF9QQzEgOglwY3MgPSAiQlJFQUsiIDsJCWJyZWFrIDsKKwkJY2FzZSBQTF9QQzIgOglwY3MgPSAiVFJBQ0UiIDsJCWJyZWFrIDsKKwkJY2FzZSBQTF9QQzMgOglwY3MgPSAiQ09OTkVDVCI7CWJyZWFrIDsKKwkJY2FzZSBQTF9QQzQgOglwY3MgPSAiTkVYVCIgOwkJYnJlYWsgOworCQljYXNlIFBMX1BDNSA6CXBjcyA9ICJTSUdOQUwiIDsJYnJlYWsgOworCQljYXNlIFBMX1BDNiA6CXBjcyA9ICJKT0lOIiA7CQlicmVhayA7CisJCWNhc2UgUExfUEM3IDoJcGNzID0gIlZFUklGWSIgOwlicmVhayA7CisJCWNhc2UgUExfUEM4IDoJcGNzID0gIkFDVElWIiA7CQlicmVhayA7CisJCWNhc2UgUExfUEM5IDoJcGNzID0gIk1BSU5UIiA7CQlicmVhayA7CisJCWRlZmF1bHQgOglwY3MgPSAiVU5LTk9XTiIgOyAJYnJlYWsgOworCX0KKwlyZXR1cm4ocGNzKSA7Cit9CisKK3ZvaWQgbGlzdF9waHkoc3RydWN0IHNfc21jICpzbWMpCit7CisJc3RydWN0IHNfcGxjICpwbGMgOworCWludCBucCA7CisKKwlmb3IgKG5wID0gMCA7IG5wIDwgTlVNUEhZUyA7IG5wKyspIHsKKwkJcGxjICA9ICZzbWMtPnlbbnBdLnBsYyA7CisJCXByaW50ZigiUEhZICVkOlx0RVJST1JTXHRcdFx0QlJFQUtfUkVBU09OU1x0XHRTVEFURVM6XG4iLG5wKSA7CisJCXByaW50ZigiXHRzb2Z0X2Vycm9yOiAlbGQgXHRcdFBDX1N0YXJ0IDogJWxkXG4iLAorCQkJCQkJcGxjLT5zb2Z0X2VycixwbGMtPmJfcGNzKTsKKwkJcHJpbnRmKCJcdHBhcml0eV9lcnI6ICVsZCBcdFx0VFBDIGV4cC4gOiAlbGRcdFx0TGluZTogJXNcbiIsCisJCQlwbGMtPnBhcml0eV9lcnIscGxjLT5iX3RwYyxnZXRfbGluZXN0YXRlKHNtYyxucCkpIDsKKwkJcHJpbnRmKCJcdGVidWZfZXJyb3I6ICVsZCBcdFx0VE5FIGV4cC4gOiAlbGRcbiIsCisJCQkJCQlwbGMtPmVidWZfZXJyLHBsYy0+Yl90bmUpIDsKKwkJcHJpbnRmKCJcdHBoeWludmFsaWQ6ICVsZCBcdFx0UUxTIGRldC4gOiAlbGRcdFx0UENNIDogJXNcbiIsCisJCQlwbGMtPnBoeWludixwbGMtPmJfcWxzLGdldF9wY21zdGF0ZShzbWMsbnApKSA7CisJCXByaW50ZigiXHR2aW9zeW1fY3RyOiAlbGQgXHRcdElMUyBkZXQuIDogJWxkXG4iLAorCQkJCQkJcGxjLT52c3ltX2N0cixwbGMtPmJfaWxzKSAgOworCQlwcmludGYoIlx0bWluZ2FwX2N0cjogJWxkIFx0XHRITFMgZGV0LiA6ICVsZFxuIiwKKwkJCQkJCXBsYy0+bWluaV9jdHIscGxjLT5iX2hscykgOworCQlwcmludGYoIlx0bm9kZXByX2VycjogJWxkXG4iLHBsYy0+bnBfZXJyKSA7CisJCXByaW50ZigiXHRUUENfZXhwIDogJWxkXG4iLHBsYy0+dHBjX2V4cCkgOworCQlwcmludGYoIlx0TEVNX2VyciA6ICVsZFxuIixzbWMtPnlbbnBdLmxlbS5sZW1fZXJyb3JzKSA7CisJfQorfQorCisKKyNpZmRlZglDT05DRU5UUkFUT1IKK3ZvaWQgcGNtX2xlbV9kdW1wKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWludAkJaSA7CisJc3RydWN0IHNfcGh5CSpwaHkgOworCXN0cnVjdCBmZGRpX21pYl9wCSptaWIgOworCisJY2hhcgkJKmVudG9zdHJpbmcoKSA7CisKKwlwcmludGYoIlBIWQllcnJvcnMJQkVSXG4iKSA7CisJcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKSA7CisJZm9yIChpID0gMCxwaHkgPSBzbWMtPnkgOyBpIDwgTlVNUEhZUyA7IGkrKyxwaHkrKykgeworCQlpZiAoIXBsY19pc19pbnN0YWxsZWQoc21jLGkpKQorCQkJY29udGludWUgOworCQltaWIgPSBwaHktPm1pYiA7CisJCXByaW50ZigiJXNcdCVsZFx0MTBFLSVkXG4iLAorCQkJZW50b3N0cmluZyhzbWMsRU5USVRZX1BIWShpKSksCisJCQltaWItPmZkZGlQT1JUTGVtX0N0LAorCQkJbWliLT5mZGRpUE9SVExlcl9Fc3RpbWF0ZSkgOworCX0KK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL3BtZi5jIGIvZHJpdmVycy9uZXQvc2tmcC9wbWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmI0NDZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9wbWYuYwpAQCAtMCwwICsxLDE2NzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OCwxOTk5IFN5c0tvbm5lY3QsCisgKglhIGJ1c2luZXNzIHVuaXQgb2YgU2NobmVpZGVyICYgS29jaCAmIENvLiBEYXRlbnN5c3RlbWUgR21iSC4KKyAqCisgKglTZWUgdGhlIGZpbGUgInNrZmRkaS5jIiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisJUGFyYW1ldGVyIE1hbmFnZW1lbnQgRnJhbWUgcHJvY2Vzc2luZyBmb3IgU01UIDcuMgorKi8KKworI2luY2x1ZGUgImgvdHlwZXMuaCIKKyNpbmNsdWRlICJoL2ZkZGkuaCIKKyNpbmNsdWRlICJoL3NtYy5oIgorI2luY2x1ZGUgImgvc210X3AuaCIKKworI2RlZmluZSBLRVJORUwKKyNpbmNsdWRlICJoL3NtdHN0YXRlLmgiCisKKyNpZm5kZWYJU0xJTV9TTVQKKworI2lmbmRlZglsaW50CitzdGF0aWMgY29uc3QgY2hhciBJRF9zY2NzW10gPSAiQCgjKXBtZi5jCTEuMzcgOTcvMDgvMDQgKEMpIFNLICIgOworI2VuZGlmCisKK3N0YXRpYyBpbnQgc210X2F1dGhvcml6ZShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9oZWFkZXIgKnNtKTsKK3N0YXRpYyBpbnQgc210X2NoZWNrX3NldF9jb3VudChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9oZWFkZXIgKnNtKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc19wX3RhYiogc210X2dldF9wdGFiKHVfc2hvcnQgcGFyYSk7CitzdGF0aWMgaW50IHNtdF9taWJfcGh5cyhzdHJ1Y3Qgc19zbWMgKnNtYyk7CitpbnQgc210X3NldF9wYXJhKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BhcmEgKnBhLCBpbnQgaW5kZXgsIGludCBsb2NhbCwKKwkJIGludCBzZXQpOwordm9pZCBzbXRfYWRkX3BhcmEoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzX3Bjb24gKnBjb24sIHVfc2hvcnQgcGFyYSwKKwkJICBpbnQgaW5kZXgsIGludCBsb2NhbCk7CitzdGF0aWMgU01idWYgKnNtdF9idWlsZF9wbWZfcmVzcG9uc2Uoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfaGVhZGVyICpyZXEsCisJCQkJICAgICBpbnQgc2V0LCBpbnQgbG9jYWwpOworCisjZGVmaW5lIE1PRkZTUyhlKQkoKGludCkmKCgoc3RydWN0IGZkZGlfbWliICopMCktPmUpKQorI2RlZmluZSBNT0ZGU0EoZSkJKChpbnQpICgoKHN0cnVjdCBmZGRpX21pYiAqKTApLT5lKSkKKworI2RlZmluZSBNT0ZGTVMoZSkJKChpbnQpJigoKHN0cnVjdCBmZGRpX21pYl9tICopMCktPmUpKQorI2RlZmluZSBNT0ZGTUEoZSkJKChpbnQpICgoKHN0cnVjdCBmZGRpX21pYl9tICopMCktPmUpKQorCisjZGVmaW5lIE1PRkZBUyhlKQkoKGludCkmKCgoc3RydWN0IGZkZGlfbWliX2EgKikwKS0+ZSkpCisjZGVmaW5lIE1PRkZBQShlKQkoKGludCkgKCgoc3RydWN0IGZkZGlfbWliX2EgKikwKS0+ZSkpCisKKyNkZWZpbmUgTU9GRlBTKGUpCSgoaW50KSYoKChzdHJ1Y3QgZmRkaV9taWJfcCAqKTApLT5lKSkKKyNkZWZpbmUgTU9GRlBBKGUpCSgoaW50KSAoKChzdHJ1Y3QgZmRkaV9taWJfcCAqKTApLT5lKSkKKworCisjZGVmaW5lIEFDX0cJMHgwMQkJLyogR2V0ICovCisjZGVmaW5lIEFDX0dSCTB4MDIJCS8qIEdldC9TZXQgKi8KKyNkZWZpbmUgQUNfUwkweDA0CQkvKiBTZXQgKi8KKyNkZWZpbmUgQUNfTkEJMHgwOAorI2RlZmluZSBBQ19HUk9VUAkweDEwCQkvKiBHcm91cCAqLworI2RlZmluZSBNUzJCQ0xLKHgpCSgoeCkqMTI1MDBMKQorLyoKKwlGCUxGYWcgKGJ5dGUpCisJQglieXRlCisJUwl1X3Nob3J0CTE2IGJpdAorCUMJQ291bnRlciAzMiBiaXQKKwlMCUxvbmcgMzIgYml0CisJVAlUaW1lcl8yCTMyIGJpdAorCVAJVGltZVN0YW1wIDsKKwlBCUxvbmdBZGRyZXNzICg2IGJ5dGUpCisJRQlFbnVtIDE2IGJpdAorCVIJUmVzSWQgMTYgQml0CisqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzX3BfdGFiIHsKKwl1X3Nob3J0CXBfbnVtIDsJCS8qIHBhcmFtZXRlciBjb2RlICovCisJdV9jaGFyCXBfYWNjZXNzIDsJLyogYWNjZXNzIHJpZ2h0cyAqLworCXVfc2hvcnQJcF9vZmZzZXQgOwkvKiBvZmZzZXQgaW4gbWliICovCisJY2hhcglwX3N3YXBbM10gOwkvKiBmb3JtYXQgc3RyaW5nICovCit9IHBfdGFiW10gPSB7CisJLyogU3RhdGlvbklkR3JwICovCisJeyBTTVRfUDEwMEEsQUNfR1JPVVAJfSAsCisJeyBTTVRfUDEwMEIsQUNfRywJTU9GRlNTKGZkZGlTTVRTdGF0aW9uSWQpLAkiOCIJfSAsCisJeyBTTVRfUDEwMEQsQUNfRywJTU9GRlNTKGZkZGlTTVRPcFZlcnNpb25JZCksCSJTIgl9ICwKKwl7IFNNVF9QMTAwRSxBQ19HLAlNT0ZGU1MoZmRkaVNNVEhpVmVyc2lvbklkKSwJIlMiCX0gLAorCXsgU01UX1AxMDBGLEFDX0csCU1PRkZTUyhmZGRpU01UTG9WZXJzaW9uSWQpLAkiUyIJfSAsCisJeyBTTVRfUDEwMTAsQUNfRywJTU9GRlNBKGZkZGlTTVRNYW51ZmFjdHVyZXJEYXRhKSwgIkQiIH0gLAorCXsgU01UX1AxMDExLEFDX0dSLAlNT0ZGU0EoZmRkaVNNVFVzZXJEYXRhKSwJIkQiCX0gLAorCXsgU01UX1AxMDEyLEFDX0csCU1PRkZTUyhmZGRpU01UTUlCVmVyc2lvbklkKSwJIlMiCX0gLAorCisJLyogU3RhdGlvbkNvbmZpZ0dycCAqLworCXsgU01UX1AxMDE0LEFDX0dST1VQCX0gLAorCXsgU01UX1AxMDE1LEFDX0csCU1PRkZTUyhmZGRpU01UTWFjX0N0KSwJCSJCIgl9ICwKKwl7IFNNVF9QMTAxNixBQ19HLAlNT0ZGU1MoZmRkaVNNVE5vbk1hc3Rlcl9DdCksCSJCIgl9ICwKKwl7IFNNVF9QMTAxNyxBQ19HLAlNT0ZGU1MoZmRkaVNNVE1hc3Rlcl9DdCksCSJCIgl9ICwKKwl7IFNNVF9QMTAxOCxBQ19HLAlNT0ZGU1MoZmRkaVNNVEF2YWlsYWJsZVBhdGhzKSwJIkIiCX0gLAorCXsgU01UX1AxMDE5LEFDX0csCU1PRkZTUyhmZGRpU01UQ29uZmlnQ2FwYWJpbGl0aWVzKSwiUyIJfSAsCisJeyBTTVRfUDEwMUEsQUNfR1IsCU1PRkZTUyhmZGRpU01UQ29uZmlnUG9saWN5KSwJIndTIgl9ICwKKwl7IFNNVF9QMTAxQixBQ19HUiwJTU9GRlNTKGZkZGlTTVRDb25uZWN0aW9uUG9saWN5KSwid1MiCX0gLAorCXsgU01UX1AxMDFELEFDX0dSLAlNT0ZGU1MoZmRkaVNNVFRUX05vdGlmeSksCSJ3UyIJfSAsCisJeyBTTVRfUDEwMUUsQUNfR1IsCU1PRkZTUyhmZGRpU01UU3RhdFJwdFBvbGljeSksCSJiQiIJfSAsCisJeyBTTVRfUDEwMUYsQUNfR1IsCU1PRkZTUyhmZGRpU01UVHJhY2VfTWF4RXhwaXJhdGlvbiksImxMIgl9ICwKKwl7IFNNVF9QMTAyMCxBQ19HLAlNT0ZGU0EoZmRkaVNNVFBPUlRJbmRleGVzKSwJIklJIgl9ICwKKwl7IFNNVF9QMTAyMSxBQ19HLAlNT0ZGU1MoZmRkaVNNVE1BQ0luZGV4ZXMpLAkiSSIJfSAsCisJeyBTTVRfUDEwMjIsQUNfRywJTU9GRlNTKGZkZGlTTVRCeXBhc3NQcmVzZW50KSwJIkYiCX0gLAorCisJLyogU3RhdHVzR3JwICovCisJeyBTTVRfUDEwMjgsQUNfR1JPVVAJfSAsCisJeyBTTVRfUDEwMjksQUNfRywJTU9GRlNTKGZkZGlTTVRFQ01TdGF0ZSksCSJFIgl9ICwKKwl7IFNNVF9QMTAyQSxBQ19HLAlNT0ZGU1MoZmRkaVNNVENGX1N0YXRlKSwJIkUiCX0gLAorCXsgU01UX1AxMDJDLEFDX0csCU1PRkZTUyhmZGRpU01UUmVtb3RlRGlzY29ubmVjdEZsYWcpLCJGIgl9ICwKKwl7IFNNVF9QMTAyRCxBQ19HLAlNT0ZGU1MoZmRkaVNNVFN0YXRpb25TdGF0dXMpLAkiRSIJfSAsCisJeyBTTVRfUDEwMkUsQUNfRywJTU9GRlNTKGZkZGlTTVRQZWVyV3JhcEZsYWcpLAkiRiIJfSAsCisKKwkvKiBNSUJPcGVyYXRpb25HcnAgKi8KKwl7IFNNVF9QMTAzMixBQ19HUk9VUAl9ICwKKwl7IFNNVF9QMTAzMyxBQ19HLAlNT0ZGU0EoZmRkaVNNVFRpbWVTdGFtcCksIlAiCQl9ICwKKwl7IFNNVF9QMTAzNCxBQ19HLAlNT0ZGU0EoZmRkaVNNVFRyYW5zaXRpb25UaW1lU3RhbXApLCJQIgl9ICwKKwkvKiBOT1RFIDogU01UX1AxMDM1IGlzIGFscmVhZHkgc3dhcHBlZCAhIFNNVF9QX1NFVENPVU5UICovCisJeyBTTVRfUDEwMzUsQUNfRywJTU9GRlNTKGZkZGlTTVRTZXRDb3VudCksIjRQIgkJfSAsCisJeyBTTVRfUDEwMzYsQUNfRywJTU9GRlNTKGZkZGlTTVRMYXN0U2V0U3RhdGlvbklkKSwiOCIJfSAsCisKKwl7IFNNVF9QMTAzQyxBQ19TLAkwLAkJCQkid1MiCX0gLAorCisJLyoKKwkgKiBQUklWQVRFIEVYVEVOU0lPTlMKKwkgKiBvbmx5IGFjY2Vzc2libGUgbG9jYWxseSB0byBnZXQvc2V0IHBhc3N3ZAorCSAqLworCXsgU01UX1AxMEYwLEFDX0dSLAlNT0ZGU0EoZmRkaVBSUE1GUGFzc3dkKSwJIjgiCX0gLAorCXsgU01UX1AxMEYxLEFDX0dSLAlNT0ZGU1MoZmRkaVBSUE1GU3RhdGlvbiksCSI4Igl9ICwKKyNpZmRlZglFU1MKKwl7IFNNVF9QMTBGMixBQ19HUiwJTU9GRlNTKGZkZGlFU1NQYXlsb2FkKSwJCSJsTCIJfSAsCisJeyBTTVRfUDEwRjMsQUNfR1IsCU1PRkZTUyhmZGRpRVNTT3ZlcmhlYWQpLAkibEwiCX0gLAorCXsgU01UX1AxMEY0LEFDX0dSLAlNT0ZGU1MoZmRkaUVTU01heFROZWcpLAkJImxMIgl9ICwKKwl7IFNNVF9QMTBGNSxBQ19HUiwJTU9GRlNTKGZkZGlFU1NNaW5TZWdtZW50U2l6ZSksCSJsTCIJfSAsCisJeyBTTVRfUDEwRjYsQUNfR1IsCU1PRkZTUyhmZGRpRVNTQ2F0ZWdvcnkpLAkibEwiCX0gLAorCXsgU01UX1AxMEY3LEFDX0dSLAlNT0ZGU1MoZmRkaUVTU1N5bmNoVHhNb2RlKSwJIndTIgl9ICwKKyNlbmRpZgorI2lmZGVmCVNCQQorCXsgU01UX1AxMEY4LEFDX0dSLAlNT0ZGU1MoZmRkaVNCQUNvbW1hbmQpLAkJImJGIgl9ICwKKwl7IFNNVF9QMTBGOSxBQ19HUiwJTU9GRlNTKGZkZGlTQkFBdmFpbGFibGUpLAkiYkYiCX0gLAorI2VuZGlmCisJLyogTUFDIEF0dHJpYnV0ZXMgKi8KKwl7IFNNVF9QMjAwQSxBQ19HUk9VUAl9ICwKKwl7IFNNVF9QMjAwQixBQ19HLAlNT0ZGTVMoZmRkaU1BQ0ZyYW1lU3RhdHVzRnVuY3Rpb25zKSwiUyIJfSAsCisJeyBTTVRfUDIwMEQsQUNfRywJTU9GRk1TKGZkZGlNQUNUX01heENhcGFiaWxpdGl5KSwiVCIJfSAsCisJeyBTTVRfUDIwMEUsQUNfRywJTU9GRk1TKGZkZGlNQUNUVlhDYXBhYmlsaXRpeSksIlQiCX0gLAorCisJLyogQ29uZmlnR3JwICovCisJeyBTTVRfUDIwMTQsQUNfR1JPVVAJfSAsCisJeyBTTVRfUDIwMTYsQUNfRywJTU9GRk1TKGZkZGlNQUNBdmFpbGFibGVQYXRocyksCSJCIgl9ICwKKwl7IFNNVF9QMjAxNyxBQ19HLAlNT0ZGTVMoZmRkaU1BQ0N1cnJlbnRQYXRoKSwJIlMiCX0gLAorCXsgU01UX1AyMDE4LEFDX0csCU1PRkZNUyhmZGRpTUFDVXBzdHJlYW1OYnIpLAkiQSIJfSAsCisJeyBTTVRfUDIwMTksQUNfRywJTU9GRk1TKGZkZGlNQUNEb3duc3RyZWFtTmJyKSwJIkEiCX0gLAorCXsgU01UX1AyMDFBLEFDX0csCU1PRkZNUyhmZGRpTUFDT2xkVXBzdHJlYW1OYnIpLAkiQSIJfSAsCisJeyBTTVRfUDIwMUIsQUNfRywJTU9GRk1TKGZkZGlNQUNPbGREb3duc3RyZWFtTmJyKSwiQSIJfSAsCisJeyBTTVRfUDIwMUQsQUNfRywJTU9GRk1TKGZkZGlNQUNEdXBBZGRyZXNzVGVzdCksCSJFIgl9ICwKKwl7IFNNVF9QMjAyMCxBQ19HUiwJTU9GRk1TKGZkZGlNQUNSZXF1ZXN0ZWRQYXRocyksCSJ3UyIJfSAsCisJeyBTTVRfUDIwMjEsQUNfRywJTU9GRk1TKGZkZGlNQUNEb3duc3RyZWFtUE9SVFR5cGUpLCJFIgl9ICwKKwl7IFNNVF9QMjAyMixBQ19HLAlNT0ZGTVMoZmRkaU1BQ0luZGV4KSwJCSJTIgl9ICwKKworCS8qIEFkZHJlc3NHcnAgKi8KKwl7IFNNVF9QMjAyOCxBQ19HUk9VUAl9ICwKKwl7IFNNVF9QMjAyOSxBQ19HLAlNT0ZGTVMoZmRkaU1BQ1NNVEFkZHJlc3MpLAkiQSIJfSAsCisKKwkvKiBPcGVyYXRpb25HcnAgKi8KKwl7IFNNVF9QMjAzMixBQ19HUk9VUAl9ICwKKwl7IFNNVF9QMjAzMyxBQ19HLAlNT0ZGTVMoZmRkaU1BQ1RfUmVxKSwJCSJUIgl9ICwKKwl7IFNNVF9QMjAzNCxBQ19HLAlNT0ZGTVMoZmRkaU1BQ1RfTmVnKSwJCSJUIgl9ICwKKwl7IFNNVF9QMjAzNSxBQ19HLAlNT0ZGTVMoZmRkaU1BQ1RfTWF4KSwJCSJUIgl9ICwKKwl7IFNNVF9QMjAzNixBQ19HLAlNT0ZGTVMoZmRkaU1BQ1R2eFZhbHVlKSwJIlQiCX0gLAorCXsgU01UX1AyMDM4LEFDX0csCU1PRkZNUyhmZGRpTUFDVF9QcmkwKSwJCSJUIgl9ICwKKwl7IFNNVF9QMjAzOSxBQ19HLAlNT0ZGTVMoZmRkaU1BQ1RfUHJpMSksCQkiVCIJfSAsCisJeyBTTVRfUDIwM0EsQUNfRywJTU9GRk1TKGZkZGlNQUNUX1ByaTIpLAkJIlQiCX0gLAorCXsgU01UX1AyMDNCLEFDX0csCU1PRkZNUyhmZGRpTUFDVF9QcmkzKSwJCSJUIgl9ICwKKwl7IFNNVF9QMjAzQyxBQ19HLAlNT0ZGTVMoZmRkaU1BQ1RfUHJpNCksCQkiVCIJfSAsCisJeyBTTVRfUDIwM0QsQUNfRywJTU9GRk1TKGZkZGlNQUNUX1ByaTUpLAkJIlQiCX0gLAorCXsgU01UX1AyMDNFLEFDX0csCU1PRkZNUyhmZGRpTUFDVF9Qcmk2KSwJCSJUIgl9ICwKKworCisJLyogQ291bnRlcnNHcnAgKi8KKwl7IFNNVF9QMjA0NixBQ19HUk9VUAl9ICwKKwl7IFNNVF9QMjA0NyxBQ19HLAlNT0ZGTVMoZmRkaU1BQ0ZyYW1lX0N0KSwJIkMiCX0gLAorCXsgU01UX1AyMDQ4LEFDX0csCU1PRkZNUyhmZGRpTUFDQ29waWVkX0N0KSwJIkMiCX0gLAorCXsgU01UX1AyMDQ5LEFDX0csCU1PRkZNUyhmZGRpTUFDVHJhbnNtaXRfQ3QpLAkiQyIJfSAsCisJeyBTTVRfUDIwNEEsQUNfRywJTU9GRk1TKGZkZGlNQUNUb2tlbl9DdCksCSJDIgl9ICwKKwl7IFNNVF9QMjA1MSxBQ19HLAlNT0ZGTVMoZmRkaU1BQ0Vycm9yX0N0KSwJIkMiCX0gLAorCXsgU01UX1AyMDUyLEFDX0csCU1PRkZNUyhmZGRpTUFDTG9zdF9DdCksCQkiQyIJfSAsCisJeyBTTVRfUDIwNTMsQUNfRywJTU9GRk1TKGZkZGlNQUNUdnhFeHBpcmVkX0N0KSwJIkMiCX0gLAorCXsgU01UX1AyMDU0LEFDX0csCU1PRkZNUyhmZGRpTUFDTm90Q29waWVkX0N0KSwJIkMiCX0gLAorCXsgU01UX1AyMDU2LEFDX0csCU1PRkZNUyhmZGRpTUFDUmluZ09wX0N0KSwJIkMiCX0gLAorCisJLyogRnJhbWVFcnJvckNvbmRpdGlvbkdycCAqLworCXsgU01UX1AyMDVBLEFDX0dST1VQCX0gLAorCXsgU01UX1AyMDVGLEFDX0dSLAlNT0ZGTVMoZmRkaU1BQ0ZyYW1lRXJyb3JUaHJlc2hvbGQpLCJ3UyIJfSAsCisJeyBTTVRfUDIwNjAsQUNfRywJTU9GRk1TKGZkZGlNQUNGcmFtZUVycm9yUmF0aW8pLAkiUyIJfSAsCisKKwkvKiBOb3RDb3BpZWRDb25kaXRpb25HcnAgKi8KKwl7IFNNVF9QMjA2NCxBQ19HUk9VUAl9ICwKKwl7IFNNVF9QMjA2NyxBQ19HUiwJTU9GRk1TKGZkZGlNQUNOb3RDb3BpZWRUaHJlc2hvbGQpLCJ3UyIJfSAsCisJeyBTTVRfUDIwNjksQUNfRywJTU9GRk1TKGZkZGlNQUNOb3RDb3BpZWRSYXRpbyksCSJTIgl9ICwKKworCS8qIFN0YXR1c0dycCAqLworCXsgU01UX1AyMDZFLEFDX0dST1VQCX0gLAorCXsgU01UX1AyMDZGLEFDX0csCU1PRkZNUyhmZGRpTUFDUk1UU3RhdGUpLAkiUyIJfSAsCisJeyBTTVRfUDIwNzAsQUNfRywJTU9GRk1TKGZkZGlNQUNEQV9GbGFnKSwJIkYiCX0gLAorCXsgU01UX1AyMDcxLEFDX0csCU1PRkZNUyhmZGRpTUFDVU5EQV9GbGFnKSwJIkYiCX0gLAorCXsgU01UX1AyMDcyLEFDX0csCU1PRkZNUyhmZGRpTUFDRnJhbWVFcnJvckZsYWcpLAkiRiIJfSAsCisJeyBTTVRfUDIwNzMsQUNfRywJTU9GRk1TKGZkZGlNQUNOb3RDb3BpZWRGbGFnKSwJIkYiCX0gLAorCXsgU01UX1AyMDc0LEFDX0csCU1PRkZNUyhmZGRpTUFDTUFfVW5pdGRhdGFBdmFpbGFibGUpLCJGIgl9ICwKKwl7IFNNVF9QMjA3NSxBQ19HLAlNT0ZGTVMoZmRkaU1BQ0hhcmR3YXJlUHJlc2VudCksCSJGIgl9ICwKKwl7IFNNVF9QMjA3NixBQ19HUiwJTU9GRk1TKGZkZGlNQUNNQV9Vbml0ZGF0YUVuYWJsZSksImJGIgl9ICwKKworCS8qCisJICogUFJJVkFURSBFWFRFTlNJT05TCisJICogb25seSBhY2Nlc3NpYmxlIGxvY2FsbHkgdG8gZ2V0L3NldCBUTUlOCisJICovCisJeyBTTVRfUDIwRjAsQUNfTkEJCQkJCQl9ICwKKwl7IFNNVF9QMjBGMSxBQ19HUiwJTU9GRk1TKGZkZGlNQUNUX01pbiksCQkibFQiCX0gLAorCisJLyogUGF0aCBBdHRyaWJ1dGVzICovCisJLyoKKwkgKiBET04ndCBzd2FwIDMyMEIsMzIwRiwzMjEwOiB0aGV5IGFyZSBhbHJlYWR5IHN3YXBwZWQgaW4gc3dhcF9wYXJhKCkKKwkgKi8KKwl7IFNNVF9QMzIwQSxBQ19HUk9VUAl9ICwKKwl7IFNNVF9QMzIwQixBQ19HLAlNT0ZGQVMoZmRkaVBBVEhJbmRleCksCQkiciIJfSAsCisJeyBTTVRfUDMyMEYsQUNfR1IsCU1PRkZBUyhmZGRpUEFUSFNiYVBheWxvYWQpLAkibDQiCX0gLAorCXsgU01UX1AzMjEwLEFDX0dSLAlNT0ZGQVMoZmRkaVBBVEhTYmFPdmVyaGVhZCksCSJsNCIJfSAsCisJLyogZmRkaVBBVEhDb25maWd1cmF0aW9uICovCisJeyBTTVRfUDMyMTIsQUNfRywJMCwJCQkJIiIJfSAsCisJeyBTTVRfUDMyMTMsQUNfR1IsCU1PRkZBUyhmZGRpUEFUSFRfUm1vZGUpLAkibFQiCX0gLAorCXsgU01UX1AzMjE0LEFDX0dSLAlNT0ZGQVMoZmRkaVBBVEhTYmFBdmFpbGFibGUpLAkibEwiCX0gLAorCXsgU01UX1AzMjE1LEFDX0dSLAlNT0ZGQVMoZmRkaVBBVEhUVlhMb3dlckJvdW5kKSwJImxUIgl9ICwKKwl7IFNNVF9QMzIxNixBQ19HUiwJTU9GRkFTKGZkZGlQQVRIVF9NYXhMb3dlckJvdW5kKSwibFQiCX0gLAorCXsgU01UX1AzMjE3LEFDX0dSLAlNT0ZGQVMoZmRkaVBBVEhNYXhUX1JlcSksCSJsVCIJfSAsCisKKwkvKiBQb3J0IEF0dHJpYnV0ZXMgKi8KKwkvKiBDb25maWdHcnAgKi8KKwl7IFNNVF9QNDAwQSxBQ19HUk9VUAl9ICwKKwl7IFNNVF9QNDAwQyxBQ19HLAlNT0ZGUFMoZmRkaVBPUlRNeV9UeXBlKSwJIkUiCX0gLAorCXsgU01UX1A0MDBELEFDX0csCU1PRkZQUyhmZGRpUE9SVE5laWdoYm9yVHlwZSksCSJFIgl9ICwKKwl7IFNNVF9QNDAwRSxBQ19HUiwJTU9GRlBTKGZkZGlQT1JUQ29ubmVjdGlvblBvbGljaWVzKSwiYkIiCX0gLAorCXsgU01UX1A0MDBGLEFDX0csCU1PRkZQUyhmZGRpUE9SVE1hY0luZGljYXRlZCksCSIyIgl9ICwKKwl7IFNNVF9QNDAxMCxBQ19HLAlNT0ZGUFMoZmRkaVBPUlRDdXJyZW50UGF0aCksCSJFIgl9ICwKKwl7IFNNVF9QNDAxMSxBQ19HUiwJTU9GRlBBKGZkZGlQT1JUUmVxdWVzdGVkUGF0aHMpLAkibDQiCX0gLAorCXsgU01UX1A0MDEyLEFDX0csCU1PRkZQUyhmZGRpUE9SVE1BQ1BsYWNlbWVudCksCSJTIgl9ICwKKwl7IFNNVF9QNDAxMyxBQ19HLAlNT0ZGUFMoZmRkaVBPUlRBdmFpbGFibGVQYXRocyksCSJCIgl9ICwKKwl7IFNNVF9QNDAxNixBQ19HLAlNT0ZGUFMoZmRkaVBPUlRQTURDbGFzcyksCSJFIgl9ICwKKwl7IFNNVF9QNDAxNyxBQ19HLAlNT0ZGUFMoZmRkaVBPUlRDb25uZWN0aW9uQ2FwYWJpbGl0aWVzKSwJIkIifSAsCisJeyBTTVRfUDQwMUQsQUNfRywJTU9GRlBTKGZkZGlQT1JUSW5kZXgpLAkJIlIiCX0gLAorCisJLyogT3BlcmF0aW9uR3JwICovCisJeyBTTVRfUDQwMUUsQUNfR1JPVVAJfSAsCisJeyBTTVRfUDQwMUYsQUNfR1IsCU1PRkZQUyhmZGRpUE9SVE1haW50X0xTKSwJIndFIgl9ICwKKwl7IFNNVF9QNDAyMSxBQ19HLAlNT0ZGUFMoZmRkaVBPUlRCU19GbGFnKSwJIkYiCX0gLAorCXsgU01UX1A0MDIyLEFDX0csCU1PRkZQUyhmZGRpUE9SVFBDX0xTKSwJCSJFIgl9ICwKKworCS8qIEVycm9yQ3Ryc0dycCAqLworCXsgU01UX1A0MDI4LEFDX0dST1VQCX0gLAorCXsgU01UX1A0MDI5LEFDX0csCU1PRkZQUyhmZGRpUE9SVEVCRXJyb3JfQ3QpLAkiQyIJfSAsCisJeyBTTVRfUDQwMkEsQUNfRywJTU9GRlBTKGZkZGlQT1JUTENURmFpbF9DdCksCSJDIgl9ICwKKworCS8qIExlckdycCAqLworCXsgU01UX1A0MDMyLEFDX0dST1VQCX0gLAorCXsgU01UX1A0MDMzLEFDX0csCU1PRkZQUyhmZGRpUE9SVExlcl9Fc3RpbWF0ZSksCSJGIgl9ICwKKwl7IFNNVF9QNDAzNCxBQ19HLAlNT0ZGUFMoZmRkaVBPUlRMZW1fUmVqZWN0X0N0KSwJIkMiCX0gLAorCXsgU01UX1A0MDM1LEFDX0csCU1PRkZQUyhmZGRpUE9SVExlbV9DdCksCQkiQyIJfSAsCisJeyBTTVRfUDQwM0EsQUNfR1IsCU1PRkZQUyhmZGRpUE9SVExlcl9DdXRvZmYpLAkiYkIiCX0gLAorCXsgU01UX1A0MDNCLEFDX0dSLAlNT0ZGUFMoZmRkaVBPUlRMZXJfQWxhcm0pLAkiYkIiCX0gLAorCisJLyogU3RhdHVzR3JwICovCisJeyBTTVRfUDQwM0MsQUNfR1JPVVAJfSAsCisJeyBTTVRfUDQwM0QsQUNfRywJTU9GRlBTKGZkZGlQT1JUQ29ubmVjdFN0YXRlKSwJIkUiCX0gLAorCXsgU01UX1A0MDNFLEFDX0csCU1PRkZQUyhmZGRpUE9SVFBDTVN0YXRlWCksCSJFIgl9ICwKKwl7IFNNVF9QNDAzRixBQ19HLAlNT0ZGUFMoZmRkaVBPUlRQQ19XaXRoaG9sZCksCSJFIgl9ICwKKwl7IFNNVF9QNDA0MCxBQ19HLAlNT0ZGUFMoZmRkaVBPUlRMZXJGbGFnKSwJIkYiCX0gLAorCXsgU01UX1A0MDQxLEFDX0csCU1PRkZQUyhmZGRpUE9SVEhhcmR3YXJlUHJlc2VudCksIkYiCX0gLAorCisJeyBTTVRfUDQwNDYsQUNfUywJMCwJCQkJIndTIgl9ICwKKworCXsgMCwJQUNfR1JPVVAJfSAsCisJeyAwIH0KK30gOworCit2b2lkIHNtdF9wbWZfcmVjZWl2ZWRfcGFjayhzdHJ1Y3Qgc19zbWMgKnNtYywgU01idWYgKm1iLCBpbnQgbG9jYWwpCit7CisJc3RydWN0IHNtdF9oZWFkZXIJKnNtIDsKKwlTTWJ1ZgkJKnJlcGx5IDsKKworCXNtID0gc210b2QobWIsc3RydWN0IHNtdF9oZWFkZXIgKikgOworCURCX1NNVCgiU01UOiBwcm9jZXNzaW5nIFBNRiBmcmFtZSBhdCAleCBsZW4gJWRcbiIsc20sbWItPnNtX2xlbikgOworI2lmZGVmCURFQlVHCisJZHVtcF9zbXQoc21jLHNtLCJQTUYgUmVjZWl2ZWQiKSA7CisjZW5kaWYKKwkvKgorCSAqIFN0YXJ0IHRoZSB3YXRjaGRvZzogSXQgbWF5IGJlIGEgbG9uZywgbG9uZyBwYWNrZXQgYW5kCisJICogbWF5YmUgdGhlIHdhdGNoZG9nIG9jY3VycyAuLi4KKwkgKi8KKwlzbXRfc3RhcnRfd2F0Y2hkb2coc21jKSA7CisKKwlpZiAoc20tPnNtdF9jbGFzcyA9PSBTTVRfUE1GX0dFVCB8fAorCSAgICBzbS0+c210X2NsYXNzID09IFNNVF9QTUZfU0VUKSB7CisJCXJlcGx5ID0gc210X2J1aWxkX3BtZl9yZXNwb25zZShzbWMsc20sCisJCQlzbS0+c210X2NsYXNzID09IFNNVF9QTUZfU0VULGxvY2FsKSA7CisJCWlmIChyZXBseSkgeworCQkJc20gPSBzbXRvZChyZXBseSxzdHJ1Y3Qgc210X2hlYWRlciAqKSA7CisjaWZkZWYJREVCVUcKKwkJCWR1bXBfc210KHNtYyxzbSwiUE1GIFJlcGx5IikgOworI2VuZGlmCisJCQlzbXRfc2VuZF9mcmFtZShzbWMscmVwbHksRkNfU01UX0lORk8sbG9jYWwpIDsKKwkJfQorCX0KK30KKworc3RhdGljIFNNYnVmICpzbXRfYnVpbGRfcG1mX3Jlc3BvbnNlKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X2hlYWRlciAqcmVxLAorCQkJCSAgICAgaW50IHNldCwgaW50IGxvY2FsKQoreworCVNNYnVmCQkJKm1iIDsKKwlzdHJ1Y3Qgc210X2hlYWRlcgkqc210IDsKKwlzdHJ1Y3Qgc210X3BhcmEJCSpwYSA7CisJc3RydWN0IHNtdF9wX3JlYXNvbgkqcmVzIDsKKwljb25zdCBzdHJ1Y3Qgc19wX3RhYgkqcHQgOworCWludAkJCWxlbiA7CisJaW50CQkJaW5kZXggOworCWludAkJCWlkeF9lbmQgOworCWludAkJCWVycm9yIDsKKwlpbnQJCQlyYW5nZSA7CisJU0tfTE9DX0RFQ0woc3RydWN0IHNfcGNvbixwY29uKSA7CisJU0tfTE9DX0RFQ0woc3RydWN0IHNfcGNvbixzZXRfcGNvbikgOworCisJLyoKKwkgKiBidWlsZCBTTVQgaGVhZGVyCisJICovCisJaWYgKCEobWIgPSBzbXRfZ2V0X21idWYoc21jKSkpCisJCXJldHVybihtYikgOworCisJc210ID0gc210b2QobWIsIHN0cnVjdCBzbXRfaGVhZGVyICopIDsKKwlzbXQtPnNtdF9kZXN0ID0gcmVxLT5zbXRfc291cmNlIDsJLyogREEgPT0gc291cmNlIG9mIHJlcXVlc3QgKi8KKwlzbXQtPnNtdF9jbGFzcyA9IHJlcS0+c210X2NsYXNzIDsJLyogc2FtZSBjbGFzcyAoR0VUL1NFVCkgKi8KKwlzbXQtPnNtdF90eXBlID0gU01UX1JFUExZIDsKKwlzbXQtPnNtdF92ZXJzaW9uID0gU01UX1ZJRF8yIDsKKwlzbXQtPnNtdF90aWQgPSByZXEtPnNtdF90aWQgOwkJLyogc2FtZSBUSUQgKi8KKwlzbXQtPnNtdF9wYWQgPSAwIDsKKwlzbXQtPnNtdF9sZW4gPSAwIDsKKworCS8qCisJICogc2V0dXAgcGFyYW1ldGVyIHN0YXR1cworCSAqLworCXBjb24ucGNfbGVuID0gU01UX01BWF9JTkZPX0xFTiA7CS8qIG1heCBwYXJhIGxlbmd0aCAqLworCXBjb24ucGNfZXJyID0gMCA7CQkJLyogbm8gZXJyb3IgKi8KKwlwY29uLnBjX2JhZHNldCA9IDAgOwkJCS8qIG5vIGJhZCBzZXQgY291bnQgKi8KKwlwY29uLnBjX3AgPSAodm9pZCAqKSAoc210ICsgMSkgOwkvKiBwYXJhcyBzdGFydCBoZXJlICovCisKKwkvKgorCSAqIGNoZWNrIGF1dGhvcml6aWF0aW9uIGFuZCBzZXQgY291bnQKKwkgKi8KKwllcnJvciA9IDAgOworCWlmIChzZXQpIHsKKwkJaWYgKCFsb2NhbCAmJiBzbXRfYXV0aG9yaXplKHNtYyxyZXEpKQorCQkJZXJyb3IgPSBTTVRfUkRGX0FVVEhPUiA7CisJCWVsc2UgaWYgKHNtdF9jaGVja19zZXRfY291bnQoc21jLHJlcSkpCisJCQlwY29uLnBjX2JhZHNldCA9IFNNVF9SREZfQkFEU0VUIDsKKwl9CisJLyoKKwkgKiBhZGQgcmVhc29uIGNvZGUgYW5kIGFsbCBtYW5kYXRvcnkgcGFyYW1ldGVycworCSAqLworCXJlcyA9IChzdHJ1Y3Qgc210X3BfcmVhc29uICopIHBjb24ucGNfcCA7CisJc210X2FkZF9wYXJhKHNtYywmcGNvbiwodV9zaG9ydCkgU01UX1BfUkVBU09OLDAsMCkgOworCXNtdF9hZGRfcGFyYShzbWMsJnBjb24sKHVfc2hvcnQpIFNNVF9QMTAzMywwLDApIDsKKwkvKiB1cGRhdGUgMTAzNSBhbmQgMTAzNiBsYXRlciBpZiBzZXQgKi8KKwlzZXRfcGNvbiA9IHBjb24gOworCXNtdF9hZGRfcGFyYShzbWMsJnBjb24sKHVfc2hvcnQpIFNNVF9QMTAzNSwwLDApIDsKKwlzbXRfYWRkX3BhcmEoc21jLCZwY29uLCh1X3Nob3J0KSBTTVRfUDEwMzYsMCwwKSA7CisKKwlwY29uLnBjX2VyciA9IGVycm9yIDsKKwlsZW4gPSByZXEtPnNtdF9sZW4gOworCXBhID0gKHN0cnVjdCBzbXRfcGFyYSAqKSAocmVxICsgMSkgOworCS8qCisJICogcHJvY2VzcyBsaXN0IG9mIHBhcmFzCisJICovCisJd2hpbGUgKCFwY29uLnBjX2VyciAmJiBsZW4gPiAwICkgeworCQlpZiAoKCh1X3Nob3J0KWxlbiA8IHBhLT5wX2xlbiArIFBBUkFfTEVOKSB8fCAocGEtPnBfbGVuICYgMykpIHsKKwkJCXBjb24ucGNfZXJyID0gU01UX1JERl9MRU5HVEggOworCQkJYnJlYWsgOworCQl9CisKKwkJaWYgKCgocmFuZ2UgPSAocGEtPnBfdHlwZSAmIDB4ZjAwMCkpID09IDB4MjAwMCkgfHwKKwkJCXJhbmdlID09IDB4MzAwMCB8fCByYW5nZSA9PSAweDQwMDApIHsKKwkJCS8qCisJCQkgKiBnZXQgaW5kZXggZm9yIFBBUlQsTUFDIGFkIFBBVEggZ3JvdXAKKwkJCSAqLworCQkJaW5kZXggPSAqKCh1X2NoYXIgKilwYSArIFBBUkFfTEVOICsgMykgOy8qIGluZGV4ICovCisJCQlpZHhfZW5kID0gaW5kZXggOworCQkJaWYgKCFzZXQgJiYgKHBhLT5wX2xlbiAhPSA0KSkgeworCQkJCXBjb24ucGNfZXJyID0gU01UX1JERl9MRU5HVEggOworCQkJCWJyZWFrIDsKKwkJCX0KKwkJCWlmICghaW5kZXggJiYgIXNldCkgeworCQkJCXN3aXRjaCAocmFuZ2UpIHsKKwkJCQljYXNlIDB4MjAwMCA6CisJCQkJCWluZGV4ID0gSU5ERVhfTUFDIDsKKwkJCQkJaWR4X2VuZCA9IGluZGV4IC0gMSArIE5VTU1BQ1MgOworCQkJCQlicmVhayA7CisJCQkJY2FzZSAweDMwMDAgOgorCQkJCQlpbmRleCA9IElOREVYX1BBVEggOworCQkJCQlpZHhfZW5kID0gaW5kZXggLSAxICsgTlVNUEFUSFMgOworCQkJCQlicmVhayA7CisJCQkJY2FzZSAweDQwMDAgOgorCQkJCQlpbmRleCA9IElOREVYX1BPUlQgOworCQkJCQlpZHhfZW5kID0gaW5kZXggLSAxICsgTlVNUEhZUyA7CisjaWZuZGVmCUNPTkNFTlRSQVRPUgorCQkJCQlpZiAoc21jLT5zLnNhcyA9PSBTTVRfU0FTKQorCQkJCQkJaWR4X2VuZCA9IElOREVYX1BPUlQgOworI2VuZGlmCisJCQkJCWJyZWFrIDsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvKgorCQkJICogc210IGdyb3VwIGhhcyBubyBpbmRleAorCQkJICovCisJCQlpZiAoIXNldCAmJiAocGEtPnBfbGVuICE9IDApKSB7CisJCQkJcGNvbi5wY19lcnIgPSBTTVRfUkRGX0xFTkdUSCA7CisJCQkJYnJlYWsgOworCQkJfQorCQkJaW5kZXggPSAwIDsKKwkJCWlkeF9lbmQgPSAwIDsKKwkJfQorCQl3aGlsZSAoaW5kZXggPD0gaWR4X2VuZCkgeworCQkJLyoKKwkJCSAqIGlmIGdyb3VwCisJCQkgKglhZGQgYWxsIHBhcmFzIG9mIGdyb3VwCisJCQkgKi8KKwkJCXB0ID0gc210X2dldF9wdGFiKHBhLT5wX3R5cGUpIDsKKwkJCWlmIChwdCAmJiBwdC0+cF9hY2Nlc3MgPT0gQUNfR1JPVVAgJiYgIXNldCkgeworCQkJCXB0KysgOworCQkJCXdoaWxlIChwdC0+cF9hY2Nlc3MgPT0gQUNfRyB8fAorCQkJCQlwdC0+cF9hY2Nlc3MgPT0gQUNfR1IpIHsKKwkJCQkJc210X2FkZF9wYXJhKHNtYywmcGNvbixwdC0+cF9udW0sCisJCQkJCQlpbmRleCxsb2NhbCk7CisJCQkJCXB0KysgOworCQkJCX0KKwkJCX0KKwkJCS8qCisJCQkgKiBpZ25vcmUKKwkJCSAqCUFVVEhPUklaQVRJT04gaW4gZ2V0L3NldAorCQkJICoJU0VUIENPVU5UIGluIHNldAorCQkJICovCisJCQllbHNlIGlmIChwYS0+cF90eXBlICE9IFNNVF9QX0FVVEhPUiAmJgorCQkJCSAoIXNldCB8fCAocGEtPnBfdHlwZSAhPSBTTVRfUDEwMzUpKSkgeworCQkJCWludAlzdCA7CisJCQkJaWYgKHBjb24ucGNfYmFkc2V0KSB7CisJCQkJCXNtdF9hZGRfcGFyYShzbWMsJnBjb24scGEtPnBfdHlwZSwKKwkJCQkJCWluZGV4LGxvY2FsKSA7CisJCQkJfQorCQkJCWVsc2UgaWYgKHNldCkgeworCQkJCQlzdCA9IHNtdF9zZXRfcGFyYShzbWMscGEsaW5kZXgsbG9jYWwsMSk7CisJCQkJCS8qCisJCQkJCSAqIHJldHVybiBwYXJhIGV2ZW4gaWYgZXJyb3IKKwkJCQkJICovCisJCQkJCXNtdF9hZGRfcGFyYShzbWMsJnBjb24scGEtPnBfdHlwZSwKKwkJCQkJCWluZGV4LGxvY2FsKSA7CisJCQkJCXBjb24ucGNfZXJyID0gc3QgOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJaWYgKHB0ICYmIHB0LT5wX2FjY2VzcyA9PSBBQ19TKSB7CisJCQkJCQlwY29uLnBjX2VyciA9CisJCQkJCQkJU01UX1JERl9JTExFR0FMIDsKKwkJCQkJfQorCQkJCQlzbXRfYWRkX3BhcmEoc21jLCZwY29uLHBhLT5wX3R5cGUsCisJCQkJCQlpbmRleCxsb2NhbCkgOworCQkJCX0KKwkJCX0KKwkJCWlmIChwY29uLnBjX2VycikKKwkJCQlicmVhayA7CisJCQlpbmRleCsrIDsKKwkJfQorCQlsZW4gLT0gcGEtPnBfbGVuICsgUEFSQV9MRU4gOworCQlwYSA9IChzdHJ1Y3Qgc210X3BhcmEgKikgKChjaGFyICopcGEgKyBwYS0+cF9sZW4gKyBQQVJBX0xFTikgOworCX0KKwlzbXQtPnNtdF9sZW4gPSBTTVRfTUFYX0lORk9fTEVOIC0gcGNvbi5wY19sZW4gOworCW1iLT5zbV9sZW4gPSBzbXQtPnNtdF9sZW4gKyBzaXplb2Yoc3RydWN0IHNtdF9oZWFkZXIpIDsKKworCS8qIHVwZGF0ZSByZWFzb24gY29kZSAqLworCXJlcy0+cmRmX3JlYXNvbiA9IHBjb24ucGNfYmFkc2V0ID8gcGNvbi5wY19iYWRzZXQgOgorCQkJcGNvbi5wY19lcnIgPyBwY29uLnBjX2VyciA6IFNNVF9SREZfU1VDQ0VTUyA7CisJaWYgKHNldCAmJiAocmVzLT5yZGZfcmVhc29uID09IFNNVF9SREZfU1VDQ0VTUykpIHsKKwkJLyoKKwkJICogaW5jcmVtZW50IHNldCBjb3VudAorCQkgKiBzZXQgdGltZSBzdGFtcAorCQkgKiBzdG9yZSBzdGF0aW9uIGlkIG9mIGxhc3Qgc2V0CisJCSAqLworCQlzbWMtPm1pYi5mZGRpU01UU2V0Q291bnQuY291bnQrKyA7CisJCXNtdF9zZXRfdGltZXN0YW1wKHNtYyxzbWMtPm1pYi5mZGRpU01UU2V0Q291bnQudGltZXN0YW1wKSA7CisJCXNtYy0+bWliLmZkZGlTTVRMYXN0U2V0U3RhdGlvbklkID0gcmVxLT5zbXRfc2lkIDsKKwkJc210X2FkZF9wYXJhKHNtYywmc2V0X3Bjb24sKHVfc2hvcnQpIFNNVF9QMTAzNSwwLDApIDsKKwkJc210X2FkZF9wYXJhKHNtYywmc2V0X3Bjb24sKHVfc2hvcnQpIFNNVF9QMTAzNiwwLDApIDsKKwl9CisJcmV0dXJuKG1iKSA7Cit9CisKK3N0YXRpYyBpbnQgc210X2F1dGhvcml6ZShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9oZWFkZXIgKnNtKQoreworCXN0cnVjdCBzbXRfcGFyYQkqcGEgOworCWludAkJaSA7CisJY2hhcgkJKnAgOworCisJLyoKKwkgKiBjaGVjayBzb3VyY2Ugc3RhdGlvbiBpZCBpZiBub3QgemVybworCSAqLworCXAgPSAoY2hhciAqKSAmc21jLT5taWIuZmRkaVBSUE1GU3RhdGlvbiA7CisJZm9yIChpID0gMCA7IGkgPCA4ICYmICFwW2ldIDsgaSsrKQorCQk7CisJaWYgKGkgIT0gOCkgeworCQlpZiAobWVtY21wKChjaGFyICopICZzbS0+c210X3NpZCwKKwkJCShjaGFyICopICZzbWMtPm1pYi5mZGRpUFJQTUZTdGF0aW9uLDgpKQorCQkJcmV0dXJuKDEpIDsKKwl9CisJLyoKKwkgKiBjaGVjayBhdXRob3JpemlhdGlvbiBwYXJhbWV0ZXIgaWYgcGFzc3dkIG5vdCB6ZXJvCisJICovCisJcCA9IChjaGFyICopIHNtYy0+bWliLmZkZGlQUlBNRlBhc3N3ZCA7CisJZm9yIChpID0gMCA7IGkgPCA4ICYmICFwW2ldIDsgaSsrKQorCQk7CisJaWYgKGkgIT0gOCkgeworCQlwYSA9IChzdHJ1Y3Qgc210X3BhcmEgKikgc21fdG9fcGFyYShzbWMsc20sU01UX1BfQVVUSE9SKSA7CisJCWlmICghcGEpCisJCQlyZXR1cm4oMSkgOworCQlpZiAocGEtPnBfbGVuICE9IDgpCisJCQlyZXR1cm4oMSkgOworCQlpZiAobWVtY21wKChjaGFyICopKHBhKzEpLChjaGFyICopc21jLT5taWIuZmRkaVBSUE1GUGFzc3dkLDgpKQorCQkJcmV0dXJuKDEpIDsKKwl9CisJcmV0dXJuKDApIDsKK30KKworc3RhdGljIGludCBzbXRfY2hlY2tfc2V0X2NvdW50KHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X2hlYWRlciAqc20pCit7CisJc3RydWN0IHNtdF9wYXJhCSpwYSA7CisJc3RydWN0IHNtdF9wX3NldGNvdW50CSpzYyA7CisKKwlwYSA9IChzdHJ1Y3Qgc210X3BhcmEgKikgc21fdG9fcGFyYShzbWMsc20sU01UX1AxMDM1KSA7CisJaWYgKHBhKSB7CisJCXNjID0gKHN0cnVjdCBzbXRfcF9zZXRjb3VudCAqKSBwYSA7CisJCWlmICgoc21jLT5taWIuZmRkaVNNVFNldENvdW50LmNvdW50ICE9IHNjLT5jb3VudCkgfHwKKwkJCW1lbWNtcCgoY2hhciAqKSBzbWMtPm1pYi5mZGRpU01UU2V0Q291bnQudGltZXN0YW1wLAorCQkJKGNoYXIgKilzYy0+dGltZXN0YW1wLDgpKQorCQkJcmV0dXJuKDEpIDsKKwl9CisJcmV0dXJuKDApIDsKK30KKwordm9pZCBzbXRfYWRkX3BhcmEoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzX3Bjb24gKnBjb24sIHVfc2hvcnQgcGFyYSwKKwkJICBpbnQgaW5kZXgsIGludCBsb2NhbCkKK3sKKwlzdHJ1Y3Qgc210X3BhcmEJKnBhIDsKKwljb25zdCBzdHJ1Y3Qgc19wX3RhYgkqcHQgOworCXN0cnVjdCBmZGRpX21pYl9tICptaWJfbSA9IE5VTEw7CisJc3RydWN0IGZkZGlfbWliX3AgKm1pYl9wID0gTlVMTDsKKwlpbnQJCWxlbiA7CisJaW50CQlwbGVuIDsKKwljaGFyCQkqZnJvbSA7CisJY2hhcgkJKnRvIDsKKwljb25zdCBjaGFyCSpzd2FwIDsKKwljaGFyCQljIDsKKwlpbnQJCXJhbmdlIDsKKwljaGFyCQkqbWliX2FkZHIgOworCWludAkJbWFjIDsKKwlpbnQJCXBhdGggOworCWludAkJcG9ydCA7CisJaW50CQlzcF9sZW4gOworCisJLyoKKwkgKiBza2lwIGlmIGVycnJvcgorCSAqLworCWlmIChwY29uLT5wY19lcnIpCisJCXJldHVybiA7CisKKwkvKgorCSAqIGFjdGlvbnMgZG9uJ3QgaGF2ZSBhIHZhbHVlCisJICovCisJcHQgPSBzbXRfZ2V0X3B0YWIocGFyYSkgOworCWlmIChwdCAmJiBwdC0+cF9hY2Nlc3MgPT0gQUNfUykKKwkJcmV0dXJuIDsKKworCXRvID0gKGNoYXIgKikgKHBjb24tPnBjX3ApIDsJLyogZGVzdGluYXRpb24gcG9pbnRlciAqLworCWxlbiA9IHBjb24tPnBjX2xlbiA7CQkvKiBmcmVlIHNwYWNlICovCisJcGxlbiA9IGxlbiA7CQkJLyogcmVtZW1iZXIgc3RhcnQgbGVuZ3RoICovCisJcGEgPSAoc3RydWN0IHNtdF9wYXJhICopIHRvIDsJLyogdHlwZS9sZW5ndGggcG9pbnRlciAqLworCXRvICs9IFBBUkFfTEVOIDsJCS8qIHNraXAgc210X3BhcmEgKi8KKwlsZW4gLT0gUEFSQV9MRU4gOworCS8qCisJICogc2V0IGluZGV4IGlmIHJlcXVpcmVkCisJICovCisJaWYgKCgocmFuZ2UgPSAocGFyYSAmIDB4ZjAwMCkpID09IDB4MjAwMCkgfHwKKwkJcmFuZ2UgPT0gMHgzMDAwIHx8IHJhbmdlID09IDB4NDAwMCkgeworCQlpZiAobGVuIDwgNCkKKwkJCWdvdG8gd3JvbmdfZXJyb3IgOworCQl0b1swXSA9IDAgOworCQl0b1sxXSA9IDAgOworCQl0b1syXSA9IDAgOworCQl0b1szXSA9IGluZGV4IDsKKwkJbGVuIC09IDQgOworCQl0byArPSA0IDsKKwl9CisJbWFjID0gaW5kZXggLSBJTkRFWF9NQUMgOworCXBhdGggPSBpbmRleCAtIElOREVYX1BBVEggOworCXBvcnQgPSBpbmRleCAtIElOREVYX1BPUlQgOworCS8qCisJICogZ2V0IHBvaW50ZXIgdG8gbWliCisJICovCisJc3dpdGNoIChyYW5nZSkgeworCWNhc2UgMHgxMDAwIDoKKwlkZWZhdWx0IDoKKwkJbWliX2FkZHIgPSAoY2hhciAqKSAoJnNtYy0+bWliKSA7CisJCWJyZWFrIDsKKwljYXNlIDB4MjAwMCA6CisJCWlmIChtYWMgPCAwIHx8IG1hYyA+PSBOVU1NQUNTKSB7CisJCQlwY29uLT5wY19lcnIgPSBTTVRfUkRGX05PUEFSQU0gOworCQkJcmV0dXJuIDsKKwkJfQorCQltaWJfYWRkciA9IChjaGFyICopICgmc21jLT5taWIubVttYWNdKSA7CisJCW1pYl9tID0gKHN0cnVjdCBmZGRpX21pYl9tICopIG1pYl9hZGRyIDsKKwkJYnJlYWsgOworCWNhc2UgMHgzMDAwIDoKKwkJaWYgKHBhdGggPCAwIHx8IHBhdGggPj0gTlVNUEFUSFMpIHsKKwkJCXBjb24tPnBjX2VyciA9IFNNVF9SREZfTk9QQVJBTSA7CisJCQlyZXR1cm4gOworCQl9CisJCW1pYl9hZGRyID0gKGNoYXIgKikgKCZzbWMtPm1pYi5hW3BhdGhdKSA7CisJCWJyZWFrIDsKKwljYXNlIDB4NDAwMCA6CisJCWlmIChwb3J0IDwgMCB8fCBwb3J0ID49IHNtdF9taWJfcGh5cyhzbWMpKSB7CisJCQlwY29uLT5wY19lcnIgPSBTTVRfUkRGX05PUEFSQU0gOworCQkJcmV0dXJuIDsKKwkJfQorCQltaWJfYWRkciA9IChjaGFyICopICgmc21jLT5taWIucFtwb3J0X3RvX21pYihzbWMscG9ydCldKSA7CisJCW1pYl9wID0gKHN0cnVjdCBmZGRpX21pYl9wICopIG1pYl9hZGRyIDsKKwkJYnJlYWsgOworCX0KKwkvKgorCSAqIGNoZWNrIHNwZWNpYWwgcGFyYXMKKwkgKi8KKwlzd2FwID0gTlVMTDsKKwlzd2l0Y2ggKHBhcmEpIHsKKwljYXNlIFNNVF9QMTBGMCA6CisJY2FzZSBTTVRfUDEwRjEgOgorI2lmZGVmCUVTUworCWNhc2UgU01UX1AxMEYyIDoKKwljYXNlIFNNVF9QMTBGMyA6CisJY2FzZSBTTVRfUDEwRjQgOgorCWNhc2UgU01UX1AxMEY1IDoKKwljYXNlIFNNVF9QMTBGNiA6CisJY2FzZSBTTVRfUDEwRjcgOgorI2VuZGlmCisjaWZkZWYJU0JBCisJY2FzZSBTTVRfUDEwRjggOgorCWNhc2UgU01UX1AxMEY5IDoKKyNlbmRpZgorCWNhc2UgU01UX1AyMEYxIDoKKwkJaWYgKCFsb2NhbCkgeworCQkJcGNvbi0+cGNfZXJyID0gU01UX1JERl9OT1BBUkFNIDsKKwkJCXJldHVybiA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgU01UX1AyMDM0IDoKKwljYXNlIFNNVF9QMjA0NiA6CisJY2FzZSBTTVRfUDIwNDcgOgorCWNhc2UgU01UX1AyMDRBIDoKKwljYXNlIFNNVF9QMjA1MSA6CisJY2FzZSBTTVRfUDIwNTIgOgorCQltYWNfdXBkYXRlX2NvdW50ZXIoc21jKSA7CisJCWJyZWFrIDsKKwljYXNlIFNNVF9QNDAyMjoKKwkJbWliX3AtPmZkZGlQT1JUUENfTFMgPSBMUzJNSUIoCisJCQlzbV9wbV9nZXRfbHMoc21jLHBvcnRfdG9fbWliKHNtYyxwb3J0KSkpIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX1BfUkVBU09OIDoKKwkJKiAodV9sb25nICopIHRvID0gMCA7CisJCXNwX2xlbiA9IDQgOworCQlnb3RvIHNwX2RvbmUgOworCWNhc2UgU01UX1AxMDMzIDoJCQkvKiB0aW1lIHN0YW1wICovCisJCXNtdF9zZXRfdGltZXN0YW1wKHNtYyxzbWMtPm1pYi5mZGRpU01UVGltZVN0YW1wKSA7CisJCWJyZWFrIDsKKworCWNhc2UgU01UX1AxMDIwOgkJCQkvKiBwb3J0IGluZGV4ZXMgKi8KKyNpZglOVU1QSFlTID09IDEyCisJCXN3YXAgPSAiSUlJSUlJSUlJSUlJIiA7CisjZWxzZQorI2lmCU5VTVBIWVMgPT0gMgorCQlpZiAoc21jLT5zLnNhcyA9PSBTTVRfU0FTKQorCQkJc3dhcCA9ICJJIiA7CisJCWVsc2UKKwkJCXN3YXAgPSAiSUkiIDsKKyNlbHNlCisjaWYJTlVNUEhZUyA9PSAyNAorCQlzd2FwID0gIklJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSSIgOworI2Vsc2UKKwk/Pz8/CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisJCWJyZWFrIDsKKwljYXNlIFNNVF9QMzIxMiA6CisJCXsKKwkJCXNwX2xlbiA9IGNlbV9idWlsZF9wYXRoKHNtYyx0byxwYXRoKSA7CisJCQlnb3RvIHNwX2RvbmUgOworCQl9CisJY2FzZSBTTVRfUDEwNDggOgkJLyogcGVlciB3cmFwIGNvbmRpdGlvbiAqLworCQl7CisJCQlzdHJ1Y3Qgc210X3BfMTA0OAkqc3AgOworCQkJc3AgPSAoc3RydWN0IHNtdF9wXzEwNDggKikgdG8gOworCQkJc3AtPnAxMDQ4X2ZsYWcgPSBzbWMtPm1pYi5mZGRpU01UUGVlcldyYXBGbGFnIDsKKwkJCXNwLT5wMTA0OF9jZl9zdGF0ZSA9IHNtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZSA7CisJCQlzcF9sZW4gPSBzaXplb2Yoc3RydWN0IHNtdF9wXzEwNDgpIDsKKwkJCWdvdG8gc3BfZG9uZSA7CisJCX0KKwljYXNlIFNNVF9QMjA4QyA6CisJCXsKKwkJCXN0cnVjdCBzbXRfcF8yMDhjCSpzcCA7CisJCQlzcCA9IChzdHJ1Y3Qgc210X3BfMjA4YyAqKSB0byA7CisJCQlzcC0+cDIwOGNfZmxhZyA9CisJCQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRHVwbGljYXRlQWRkcmVzc0NvbmQgOworCQkJc3AtPnAyMDhjX2R1cGNvbmRpdGlvbiA9CisJCQkJKG1pYl9tLT5mZGRpTUFDREFfRmxhZyA/IFNNVF9TVF9NWV9EVVBBIDogMCkgfAorCQkJCShtaWJfbS0+ZmRkaU1BQ1VOREFfRmxhZyA/IFNNVF9TVF9VTkFfRFVQQSA6IDApOworCQkJc3AtPnAyMDhjX2ZkZGlsb25nID0KKwkJCQltaWJfbS0+ZmRkaU1BQ1NNVEFkZHJlc3MgOworCQkJc3AtPnAyMDhjX2ZkZGl1bmFsb25nID0KKwkJCQltaWJfbS0+ZmRkaU1BQ1Vwc3RyZWFtTmJyIDsKKwkJCXNwLT5wMjA4Y19wYWQgPSAwIDsKKwkJCXNwX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfMjA4YykgOworCQkJZ290byBzcF9kb25lIDsKKwkJfQorCWNhc2UgU01UX1AyMDhEIDoJCS8qIGZyYW1lIGVycm9yIGNvbmRpdGlvbiAqLworCQl7CisJCQlzdHJ1Y3Qgc210X3BfMjA4ZAkqc3AgOworCQkJc3AgPSAoc3RydWN0IHNtdF9wXzIwOGQgKikgdG8gOworCQkJc3AtPnAyMDhkX2ZsYWcgPQorCQkJCW1pYl9tLT5mZGRpTUFDRnJhbWVFcnJvckZsYWcgOworCQkJc3AtPnAyMDhkX2ZyYW1lX2N0ID0KKwkJCQltaWJfbS0+ZmRkaU1BQ0ZyYW1lX0N0IDsKKwkJCXNwLT5wMjA4ZF9lcnJvcl9jdCA9CisJCQkJbWliX20tPmZkZGlNQUNFcnJvcl9DdCA7CisJCQlzcC0+cDIwOGRfbG9zdF9jdCA9CisJCQkJbWliX20tPmZkZGlNQUNMb3N0X0N0IDsKKwkJCXNwLT5wMjA4ZF9yYXRpbyA9CisJCQkJbWliX20tPmZkZGlNQUNGcmFtZUVycm9yUmF0aW8gOworCQkJc3BfbGVuID0gc2l6ZW9mKHN0cnVjdCBzbXRfcF8yMDhkKSA7CisJCQlnb3RvIHNwX2RvbmUgOworCQl9CisJY2FzZSBTTVRfUDIwOEUgOgkJLyogbm90IGNvcGllZCBjb25kaXRpb24gKi8KKwkJeworCQkJc3RydWN0IHNtdF9wXzIwOGUJKnNwIDsKKwkJCXNwID0gKHN0cnVjdCBzbXRfcF8yMDhlICopIHRvIDsKKwkJCXNwLT5wMjA4ZV9mbGFnID0KKwkJCQltaWJfbS0+ZmRkaU1BQ05vdENvcGllZEZsYWcgOworCQkJc3AtPnAyMDhlX25vdF9jb3BpZWQgPQorCQkJCW1pYl9tLT5mZGRpTUFDTm90Q29waWVkX0N0IDsKKwkJCXNwLT5wMjA4ZV9jb3BpZWQgPQorCQkJCW1pYl9tLT5mZGRpTUFDQ29waWVkX0N0IDsKKwkJCXNwLT5wMjA4ZV9ub3RfY29waWVkX3JhdGlvID0KKwkJCQltaWJfbS0+ZmRkaU1BQ05vdENvcGllZFJhdGlvIDsKKwkJCXNwX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfMjA4ZSkgOworCQkJZ290byBzcF9kb25lIDsKKwkJfQorCWNhc2UgU01UX1AyMDhGIDoJLyogbmVpZ2hib3IgY2hhbmdlIGV2ZW50ICovCisJCXsKKwkJCXN0cnVjdCBzbXRfcF8yMDhmCSpzcCA7CisJCQlzcCA9IChzdHJ1Y3Qgc210X3BfMjA4ZiAqKSB0byA7CisJCQlzcC0+cDIwOGZfbXVsdGlwbGUgPQorCQkJCW1pYl9tLT5mZGRpTUFDTXVsdGlwbGVfTiA7CisJCQlzcC0+cDIwOGZfbmFjb25kaXRpb24gPQorCQkJCW1pYl9tLT5mZGRpTUFDRHVwbGljYXRlQWRkcmVzc0NvbmQgOworCQkJc3AtPnAyMDhmX29sZF91bmEgPQorCQkJCW1pYl9tLT5mZGRpTUFDT2xkVXBzdHJlYW1OYnIgOworCQkJc3AtPnAyMDhmX25ld191bmEgPQorCQkJCW1pYl9tLT5mZGRpTUFDVXBzdHJlYW1OYnIgOworCQkJc3AtPnAyMDhmX29sZF9kbmEgPQorCQkJCW1pYl9tLT5mZGRpTUFDT2xkRG93bnN0cmVhbU5iciA7CisJCQlzcC0+cDIwOGZfbmV3X2RuYSA9CisJCQkJbWliX20tPmZkZGlNQUNEb3duc3RyZWFtTmJyIDsKKwkJCXNwLT5wMjA4Zl9jdXJyZW5fcGF0aCA9CisJCQkJbWliX20tPmZkZGlNQUNDdXJyZW50UGF0aCA7CisJCQlzcC0+cDIwOGZfc210X2FkZHJlc3MgPQorCQkJCW1pYl9tLT5mZGRpTUFDU01UQWRkcmVzcyA7CisJCQlzcF9sZW4gPSBzaXplb2Yoc3RydWN0IHNtdF9wXzIwOGYpIDsKKwkJCWdvdG8gc3BfZG9uZSA7CisJCX0KKwljYXNlIFNNVF9QMjA5MCA6CisJCXsKKwkJCXN0cnVjdCBzbXRfcF8yMDkwCSpzcCA7CisJCQlzcCA9IChzdHJ1Y3Qgc210X3BfMjA5MCAqKSB0byA7CisJCQlzcC0+cDIwOTBfbXVsdGlwbGUgPQorCQkJCW1pYl9tLT5mZGRpTUFDTXVsdGlwbGVfUCA7CisJCQlzcC0+cDIwOTBfYXZhaWxhYmxlcGF0aHMgPQorCQkJCW1pYl9tLT5mZGRpTUFDQXZhaWxhYmxlUGF0aHMgOworCQkJc3AtPnAyMDkwX2N1cnJlbnRwYXRoID0KKwkJCQltaWJfbS0+ZmRkaU1BQ0N1cnJlbnRQYXRoIDsKKwkJCXNwLT5wMjA5MF9yZXF1ZXN0ZWRwYXRocyA9CisJCQkJbWliX20tPmZkZGlNQUNSZXF1ZXN0ZWRQYXRocyA7CisJCQlzcF9sZW4gPSBzaXplb2Yoc3RydWN0IHNtdF9wXzIwOTApIDsKKwkJCWdvdG8gc3BfZG9uZSA7CisJCX0KKwljYXNlIFNNVF9QNDA1MCA6CisJCXsKKwkJCXN0cnVjdCBzbXRfcF80MDUwCSpzcCA7CisJCQlzcCA9IChzdHJ1Y3Qgc210X3BfNDA1MCAqKSB0byA7CisJCQlzcC0+cDQwNTBfZmxhZyA9CisJCQkJbWliX3AtPmZkZGlQT1JUTGVyRmxhZyA7CisJCQlzcC0+cDQwNTBfcGFkID0gMCA7CisJCQlzcC0+cDQwNTBfY3V0b2ZmID0KKwkJCQltaWJfcC0+ZmRkaVBPUlRMZXJfQ3V0b2ZmIDsgOworCQkJc3AtPnA0MDUwX2FsYXJtID0KKwkJCQltaWJfcC0+ZmRkaVBPUlRMZXJfQWxhcm0gOyA7CisJCQlzcC0+cDQwNTBfZXN0aW1hdGUgPQorCQkJCW1pYl9wLT5mZGRpUE9SVExlcl9Fc3RpbWF0ZSA7CisJCQlzcC0+cDQwNTBfcmVqZWN0X2N0ID0KKwkJCQltaWJfcC0+ZmRkaVBPUlRMZW1fUmVqZWN0X0N0IDsKKwkJCXNwLT5wNDA1MF9jdCA9CisJCQkJbWliX3AtPmZkZGlQT1JUTGVtX0N0IDsKKwkJCXNwX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfNDA1MCkgOworCQkJZ290byBzcF9kb25lIDsKKwkJfQorCisJY2FzZSBTTVRfUDQwNTEgOgorCQl7CisJCQlzdHJ1Y3Qgc210X3BfNDA1MQkqc3AgOworCQkJc3AgPSAoc3RydWN0IHNtdF9wXzQwNTEgKikgdG8gOworCQkJc3AtPnA0MDUxX211bHRpcGxlID0KKwkJCQltaWJfcC0+ZmRkaVBPUlRNdWx0aXBsZV9VIDsKKwkJCXNwLT5wNDA1MV9wb3J0dHlwZSA9CisJCQkJbWliX3AtPmZkZGlQT1JUTXlfVHlwZSA7CisJCQlzcC0+cDQwNTFfY29ubmVjdHN0YXRlID0KKwkJCQltaWJfcC0+ZmRkaVBPUlRDb25uZWN0U3RhdGUgOyA7CisJCQlzcC0+cDQwNTFfcGNfbmVpZ2hib3IgPQorCQkJCW1pYl9wLT5mZGRpUE9SVE5laWdoYm9yVHlwZSA7CisJCQlzcC0+cDQwNTFfcGNfd2l0aGhvbGQgPQorCQkJCW1pYl9wLT5mZGRpUE9SVFBDX1dpdGhob2xkIDsKKwkJCXNwX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfNDA1MSkgOworCQkJZ290byBzcF9kb25lIDsKKwkJfQorCWNhc2UgU01UX1A0MDUyIDoKKwkJeworCQkJc3RydWN0IHNtdF9wXzQwNTIJKnNwIDsKKwkJCXNwID0gKHN0cnVjdCBzbXRfcF80MDUyICopIHRvIDsKKwkJCXNwLT5wNDA1Ml9mbGFnID0KKwkJCQltaWJfcC0+ZmRkaVBPUlRFQl9Db25kaXRpb24gOworCQkJc3AtPnA0MDUyX2ViZXJyb3Jjb3VudCA9CisJCQkJbWliX3AtPmZkZGlQT1JURUJFcnJvcl9DdCA7CisJCQlzcF9sZW4gPSBzaXplb2Yoc3RydWN0IHNtdF9wXzQwNTIpIDsKKwkJCWdvdG8gc3BfZG9uZSA7CisJCX0KKwljYXNlIFNNVF9QNDA1MyA6CisJCXsKKwkJCXN0cnVjdCBzbXRfcF80MDUzCSpzcCA7CisJCQlzcCA9IChzdHJ1Y3Qgc210X3BfNDA1MyAqKSB0byA7CisJCQlzcC0+cDQwNTNfbXVsdGlwbGUgPQorCQkJCW1pYl9wLT5mZGRpUE9SVE11bHRpcGxlX1AgOyA7CisJCQlzcC0+cDQwNTNfYXZhaWxhYmxlcGF0aHMgPQorCQkJCW1pYl9wLT5mZGRpUE9SVEF2YWlsYWJsZVBhdGhzIDsKKwkJCXNwLT5wNDA1M19jdXJyZW50cGF0aCA9CisJCQkJbWliX3AtPmZkZGlQT1JUQ3VycmVudFBhdGggOworCQkJbWVtY3B5KAkoY2hhciAqKSAmc3AtPnA0MDUzX3JlcXVlc3RlZHBhdGhzLAorCQkJCShjaGFyICopIG1pYl9wLT5mZGRpUE9SVFJlcXVlc3RlZFBhdGhzLDQpIDsKKwkJCXNwLT5wNDA1M19teXR5cGUgPQorCQkJCW1pYl9wLT5mZGRpUE9SVE15X1R5cGUgOworCQkJc3AtPnA0MDUzX25laWdoYm9ydHlwZSA9CisJCQkJbWliX3AtPmZkZGlQT1JUTmVpZ2hib3JUeXBlIDsKKwkJCXNwX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc210X3BfNDA1MykgOworCQkJZ290byBzcF9kb25lIDsKKwkJfQorCWRlZmF1bHQgOgorCQlicmVhayA7CisJfQorCS8qCisJICogaW4gdGFibGUgPworCSAqLworCWlmICghcHQpIHsKKwkJcGNvbi0+cGNfZXJyID0gKHBhcmEgJiAweGZmMDApID8gU01UX1JERl9OT1BBUkFNIDoKKwkJCQkJCVNNVF9SREZfSUxMRUdBTCA7CisJCXJldHVybiA7CisJfQorCS8qCisJICogY2hlY2sgYWNjZXNzIHJpZ2h0cworCSAqLworCXN3aXRjaCAocHQtPnBfYWNjZXNzKSB7CisJY2FzZSBBQ19HIDoKKwljYXNlIEFDX0dSIDoKKwkJYnJlYWsgOworCWRlZmF1bHQgOgorCQlwY29uLT5wY19lcnIgPSBTTVRfUkRGX0lMTEVHQUwgOworCQlyZXR1cm4gOworCX0KKwlmcm9tID0gbWliX2FkZHIgKyBwdC0+cF9vZmZzZXQgOworCWlmICghc3dhcCkKKwkJc3dhcCA9IHB0LT5wX3N3YXAgOwkJLyogcG9pbnRlciB0byBzd2FwIHN0cmluZyAqLworCisJLyoKKwkgKiBjb3B5IHZhbHVlcworCSAqLworCXdoaWxlICgoYyA9ICpzd2FwKyspKSB7CisJCXN3aXRjaChjKSB7CisJCWNhc2UgJ2InIDoKKwkJY2FzZSAndycgOgorCQljYXNlICdsJyA6CisJCQlicmVhayA7CisJCWNhc2UgJ1MnIDoKKwkJY2FzZSAnRScgOgorCQljYXNlICdSJyA6CisJCWNhc2UgJ3InIDoKKwkJCWlmIChsZW4gPCA0KQorCQkJCWdvdG8gbGVuX2Vycm9yIDsKKwkJCXRvWzBdID0gMCA7CisJCQl0b1sxXSA9IDAgOworI2lmZGVmCUxJVFRMRV9FTkRJQU4KKwkJCWlmIChjID09ICdyJykgeworCQkJCXRvWzJdID0gKmZyb20rKyA7CisJCQkJdG9bM10gPSAqZnJvbSsrIDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXRvWzNdID0gKmZyb20rKyA7CisJCQkJdG9bMl0gPSAqZnJvbSsrIDsKKwkJCX0KKyNlbHNlCisJCQl0b1syXSA9ICpmcm9tKysgOworCQkJdG9bM10gPSAqZnJvbSsrIDsKKyNlbmRpZgorCQkJdG8gKz0gNCA7CisJCQlsZW4gLT0gNCA7CisJCQlicmVhayA7CisJCWNhc2UgJ0knIDoJCS8qIGZvciBTRVQgb2YgcG9ydCBpbmRleGVzICovCisJCQlpZiAobGVuIDwgMikKKwkJCQlnb3RvIGxlbl9lcnJvciA7CisjaWZkZWYJTElUVExFX0VORElBTgorCQkJdG9bMV0gPSAqZnJvbSsrIDsKKwkJCXRvWzBdID0gKmZyb20rKyA7CisjZWxzZQorCQkJdG9bMF0gPSAqZnJvbSsrIDsKKwkJCXRvWzFdID0gKmZyb20rKyA7CisjZW5kaWYKKwkJCXRvICs9IDIgOworCQkJbGVuIC09IDIgOworCQkJYnJlYWsgOworCQljYXNlICdGJyA6CisJCWNhc2UgJ0InIDoKKwkJCWlmIChsZW4gPCA0KQorCQkJCWdvdG8gbGVuX2Vycm9yIDsKKwkJCWxlbiAtPSA0IDsKKwkJCXRvWzBdID0gMCA7CisJCQl0b1sxXSA9IDAgOworCQkJdG9bMl0gPSAwIDsKKwkJCXRvWzNdID0gKmZyb20rKyA7CisJCQl0byArPSA0IDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnQycgOgorCQljYXNlICdUJyA6CisJCWNhc2UgJ0wnIDoKKwkJCWlmIChsZW4gPCA0KQorCQkJCWdvdG8gbGVuX2Vycm9yIDsKKyNpZmRlZglMSVRUTEVfRU5ESUFOCisJCQl0b1szXSA9ICpmcm9tKysgOworCQkJdG9bMl0gPSAqZnJvbSsrIDsKKwkJCXRvWzFdID0gKmZyb20rKyA7CisJCQl0b1swXSA9ICpmcm9tKysgOworI2Vsc2UKKwkJCXRvWzBdID0gKmZyb20rKyA7CisJCQl0b1sxXSA9ICpmcm9tKysgOworCQkJdG9bMl0gPSAqZnJvbSsrIDsKKwkJCXRvWzNdID0gKmZyb20rKyA7CisjZW5kaWYKKwkJCWxlbiAtPSA0IDsKKwkJCXRvICs9IDQgOworCQkJYnJlYWsgOworCQljYXNlICcyJyA6CQkvKiBQb3J0TWFjSW5kaWNhdGVkICovCisJCQlpZiAobGVuIDwgNCkKKwkJCQlnb3RvIGxlbl9lcnJvciA7CisJCQl0b1swXSA9IDAgOworCQkJdG9bMV0gPSAwIDsKKwkJCXRvWzJdID0gKmZyb20rKyA7CisJCQl0b1szXSA9ICpmcm9tKysgOworCQkJbGVuIC09IDQgOworCQkJdG8gKz0gNCA7CisJCQlicmVhayA7CisJCWNhc2UgJzQnIDoKKwkJCWlmIChsZW4gPCA0KQorCQkJCWdvdG8gbGVuX2Vycm9yIDsKKwkJCXRvWzBdID0gKmZyb20rKyA7CisJCQl0b1sxXSA9ICpmcm9tKysgOworCQkJdG9bMl0gPSAqZnJvbSsrIDsKKwkJCXRvWzNdID0gKmZyb20rKyA7CisJCQlsZW4gLT0gNCA7CisJCQl0byArPSA0IDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnQScgOgorCQkJaWYgKGxlbiA8IDgpCisJCQkJZ290byBsZW5fZXJyb3IgOworCQkJdG9bMF0gPSAwIDsKKwkJCXRvWzFdID0gMCA7CisJCQltZW1jcHkoKGNoYXIgKikgdG8rMiwoY2hhciAqKSBmcm9tLDYpIDsKKwkJCXRvICs9IDggOworCQkJZnJvbSArPSA4IDsKKwkJCWxlbiAtPSA4IDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnOCcgOgorCQkJaWYgKGxlbiA8IDgpCisJCQkJZ290byBsZW5fZXJyb3IgOworCQkJbWVtY3B5KChjaGFyICopIHRvLChjaGFyICopIGZyb20sOCkgOworCQkJdG8gKz0gOCA7CisJCQlmcm9tICs9IDggOworCQkJbGVuIC09IDggOworCQkJYnJlYWsgOworCQljYXNlICdEJyA6CisJCQlpZiAobGVuIDwgMzIpCisJCQkJZ290byBsZW5fZXJyb3IgOworCQkJbWVtY3B5KChjaGFyICopIHRvLChjaGFyICopIGZyb20sMzIpIDsKKwkJCXRvICs9IDMyIDsKKwkJCWZyb20gKz0gMzIgOworCQkJbGVuIC09IDMyIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnUCcgOgkJLyogdGltZXN0YW1wIGlzIE5PVCBzd2FwcGVkICovCisJCQlpZiAobGVuIDwgOCkKKwkJCQlnb3RvIGxlbl9lcnJvciA7CisJCQl0b1swXSA9ICpmcm9tKysgOworCQkJdG9bMV0gPSAqZnJvbSsrIDsKKwkJCXRvWzJdID0gKmZyb20rKyA7CisJCQl0b1szXSA9ICpmcm9tKysgOworCQkJdG9bNF0gPSAqZnJvbSsrIDsKKwkJCXRvWzVdID0gKmZyb20rKyA7CisJCQl0b1s2XSA9ICpmcm9tKysgOworCQkJdG9bN10gPSAqZnJvbSsrIDsKKwkJCXRvICs9IDggOworCQkJbGVuIC09IDggOworCQkJYnJlYWsgOworCQlkZWZhdWx0IDoKKwkJCVNNVF9QQU5JQyhzbWMsU01UX0UwMTE5LCBTTVRfRTAxMTlfTVNHKSA7CisJCQlicmVhayA7CisJCX0KKwl9CisKK2RvbmU6CisJLyoKKwkgKiBtYWtlIGl0IGV2ZW4gKGluIGNhc2Ugb2YgJ0knIGVuY29kaW5nKQorCSAqIG5vdGU6IGxlbiBpcyBERUNSRU1FTlRFRAorCSAqLworCWlmIChsZW4gJiAzKSB7CisJCXRvWzBdID0gMCA7CisJCXRvWzFdID0gMCA7CisJCXRvICs9IDQgLSAobGVuICYgMyApIDsKKwkJbGVuID0gbGVuICYgfiAzIDsKKwl9CisKKwkvKiBzZXQgdHlwZSBhbmQgbGVuZ3RoICovCisJcGEtPnBfdHlwZSA9IHBhcmEgOworCXBhLT5wX2xlbiA9IHBsZW4gLSBsZW4gLSBQQVJBX0xFTiA7CisJLyogcmV0dXJuIHZhbHVlcyAqLworCXBjb24tPnBjX3AgPSAodm9pZCAqKSB0byA7CisJcGNvbi0+cGNfbGVuID0gbGVuIDsKKwlyZXR1cm4gOworCitzcF9kb25lOgorCWxlbiAtPSBzcF9sZW4gOworCXRvICs9IHNwX2xlbiA7CisJZ290byBkb25lIDsKKworbGVuX2Vycm9yOgorCS8qIHBhcmFtZXRlciBkb2VzIG5vdCBmaXQgaW4gZnJhbWUgKi8KKwlwY29uLT5wY19lcnIgPSBTTVRfUkRGX1RPT0xPTkcgOworCXJldHVybiA7CisKK3dyb25nX2Vycm9yOgorCXBjb24tPnBjX2VyciA9IFNNVF9SREZfTEVOR1RIIDsKK30KKworLyoKKyAqIHNldCBwYXJhbWV0ZXIKKyAqLworaW50IHNtdF9zZXRfcGFyYShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wYXJhICpwYSwgaW50IGluZGV4LCBpbnQgbG9jYWwsCisJCSBpbnQgc2V0KQoreworI2RlZmluZSBJRlNFVCh4KQlpZiAoc2V0KSAoeCkKKworCWNvbnN0IHN0cnVjdCBzX3BfdGFiCSpwdCA7CisJaW50CQlsZW4gOworCWNoYXIJCSpmcm9tIDsKKwljaGFyCQkqdG8gOworCWNvbnN0IGNoYXIJKnN3YXAgOworCWNoYXIJCWMgOworCWNoYXIJCSptaWJfYWRkciA7CisJc3RydWN0IGZkZGlfbWliCSptaWIgOworCXN0cnVjdCBmZGRpX21pYl9tCSptaWJfbSA9IE5VTEw7CisJc3RydWN0IGZkZGlfbWliX2EJKm1pYl9hID0gTlVMTDsKKwlzdHJ1Y3QgZmRkaV9taWJfcAkqbWliX3AgPSBOVUxMOworCWludAkJbWFjIDsKKwlpbnQJCXBhdGggOworCWludAkJcG9ydCA7CisJU0tfTE9DX0RFQ0wodV9jaGFyLGJ5dGVfdmFsKSA7CisJU0tfTE9DX0RFQ0wodV9zaG9ydCx3b3JkX3ZhbCkgOworCVNLX0xPQ19ERUNMKHVfbG9uZyxsb25nX3ZhbCkgOworCisJbWFjID0gaW5kZXggLSBJTkRFWF9NQUMgOworCXBhdGggPSBpbmRleCAtIElOREVYX1BBVEggOworCXBvcnQgPSBpbmRleCAtIElOREVYX1BPUlQgOworCWxlbiA9IHBhLT5wX2xlbiA7CisJZnJvbSA9IChjaGFyICopIChwYSArIDEgKSA7CisKKwltaWIgPSAmc21jLT5taWIgOworCXN3aXRjaCAocGEtPnBfdHlwZSAmIDB4ZjAwMCkgeworCWNhc2UgMHgxMDAwIDoKKwlkZWZhdWx0IDoKKwkJbWliX2FkZHIgPSAoY2hhciAqKSBtaWIgOworCQlicmVhayA7CisJY2FzZSAweDIwMDAgOgorCQlpZiAobWFjIDwgMCB8fCBtYWMgPj0gTlVNTUFDUykgeworCQkJcmV0dXJuKFNNVF9SREZfTk9QQVJBTSkgOworCQl9CisJCW1pYl9tID0gJnNtYy0+bWliLm1bbWFjXSA7CisJCW1pYl9hZGRyID0gKGNoYXIgKikgbWliX20gOworCQlmcm9tICs9IDQgOwkJLyogc2tpcCBpbmRleCAqLworCQlsZW4gLT0gNCA7CisJCWJyZWFrIDsKKwljYXNlIDB4MzAwMCA6CisJCWlmIChwYXRoIDwgMCB8fCBwYXRoID49IE5VTVBBVEhTKSB7CisJCQlyZXR1cm4oU01UX1JERl9OT1BBUkFNKSA7CisJCX0KKwkJbWliX2EgPSAmc21jLT5taWIuYVtwYXRoXSA7CisJCW1pYl9hZGRyID0gKGNoYXIgKikgbWliX2EgOworCQlmcm9tICs9IDQgOwkJLyogc2tpcCBpbmRleCAqLworCQlsZW4gLT0gNCA7CisJCWJyZWFrIDsKKwljYXNlIDB4NDAwMCA6CisJCWlmIChwb3J0IDwgMCB8fCBwb3J0ID49IHNtdF9taWJfcGh5cyhzbWMpKSB7CisJCQlyZXR1cm4oU01UX1JERl9OT1BBUkFNKSA7CisJCX0KKwkJbWliX3AgPSAmc21jLT5taWIucFtwb3J0X3RvX21pYihzbWMscG9ydCldIDsKKwkJbWliX2FkZHIgPSAoY2hhciAqKSBtaWJfcCA7CisJCWZyb20gKz0gNCA7CQkvKiBza2lwIGluZGV4ICovCisJCWxlbiAtPSA0IDsKKwkJYnJlYWsgOworCX0KKwlzd2l0Y2ggKHBhLT5wX3R5cGUpIHsKKwljYXNlIFNNVF9QMTBGMCA6CisJY2FzZSBTTVRfUDEwRjEgOgorI2lmZGVmCUVTUworCWNhc2UgU01UX1AxMEYyIDoKKwljYXNlIFNNVF9QMTBGMyA6CisJY2FzZSBTTVRfUDEwRjQgOgorCWNhc2UgU01UX1AxMEY1IDoKKwljYXNlIFNNVF9QMTBGNiA6CisJY2FzZSBTTVRfUDEwRjcgOgorI2VuZGlmCisjaWZkZWYJU0JBCisJY2FzZSBTTVRfUDEwRjggOgorCWNhc2UgU01UX1AxMEY5IDoKKyNlbmRpZgorCWNhc2UgU01UX1AyMEYxIDoKKwkJaWYgKCFsb2NhbCkgeworCQkJcmV0dXJuKFNNVF9SREZfTk9QQVJBTSkgOworCQl9CisJCWJyZWFrIDsKKwl9CisJcHQgPSBzbXRfZ2V0X3B0YWIocGEtPnBfdHlwZSkgOworCWlmICghcHQpIHsKKwkJcmV0dXJuKCAocGEtPnBfdHlwZSAmIDB4ZmYwMCkgPyBTTVRfUkRGX05PUEFSQU0gOgorCQkJCQkJU01UX1JERl9JTExFR0FMICkgOworCX0KKwlzd2l0Y2ggKHB0LT5wX2FjY2VzcykgeworCWNhc2UgQUNfR1IgOgorCWNhc2UgQUNfUyA6CisJCWJyZWFrIDsKKwlkZWZhdWx0IDoKKwkJcmV0dXJuKFNNVF9SREZfSUxMRUdBTCkgOworCX0KKwl0byA9IG1pYl9hZGRyICsgcHQtPnBfb2Zmc2V0IDsKKwlzd2FwID0gcHQtPnBfc3dhcCA7CQkvKiBwb2ludGVyIHRvIHN3YXAgc3RyaW5nICovCisKKwl3aGlsZSAoc3dhcCAmJiAoYyA9ICpzd2FwKyspKSB7CisJCXN3aXRjaChjKSB7CisJCWNhc2UgJ2InIDoKKwkJCXRvID0gKGNoYXIgKikgJmJ5dGVfdmFsIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAndycgOgorCQkJdG8gPSAoY2hhciAqKSAmd29yZF92YWwgOworCQkJYnJlYWsgOworCQljYXNlICdsJyA6CisJCQl0byA9IChjaGFyICopICZsb25nX3ZhbCA7CisJCQlicmVhayA7CisJCWNhc2UgJ1MnIDoKKwkJY2FzZSAnRScgOgorCQljYXNlICdSJyA6CisJCWNhc2UgJ3InIDoKKwkJCWlmIChsZW4gPCA0KSB7CisJCQkJZ290byBsZW5fZXJyb3IgOworCQkJfQorCQkJaWYgKGZyb21bMF0gfCBmcm9tWzFdKQorCQkJCWdvdG8gdmFsX2Vycm9yIDsKKyNpZmRlZglMSVRUTEVfRU5ESUFOCisJCQlpZiAoYyA9PSAncicpIHsKKwkJCQl0b1swXSA9IGZyb21bMl0gOworCQkJCXRvWzFdID0gZnJvbVszXSA7CisJCQl9CisJCQllbHNlIHsKKwkJCQl0b1sxXSA9IGZyb21bMl0gOworCQkJCXRvWzBdID0gZnJvbVszXSA7CisJCQl9CisjZWxzZQorCQkJdG9bMF0gPSBmcm9tWzJdIDsKKwkJCXRvWzFdID0gZnJvbVszXSA7CisjZW5kaWYKKwkJCWZyb20gKz0gNCA7CisJCQl0byArPSAyIDsKKwkJCWxlbiAtPSA0IDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnRicgOgorCQljYXNlICdCJyA6CisJCQlpZiAobGVuIDwgNCkgeworCQkJCWdvdG8gbGVuX2Vycm9yIDsKKwkJCX0KKwkJCWlmIChmcm9tWzBdIHwgZnJvbVsxXSB8IGZyb21bMl0pCisJCQkJZ290byB2YWxfZXJyb3IgOworCQkJdG9bMF0gPSBmcm9tWzNdIDsKKwkJCWxlbiAtPSA0IDsKKwkJCWZyb20gKz0gNCA7CisJCQl0byArPSA0IDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnQycgOgorCQljYXNlICdUJyA6CisJCWNhc2UgJ0wnIDoKKwkJCWlmIChsZW4gPCA0KSB7CisJCQkJZ290byBsZW5fZXJyb3IgOworCQkJfQorI2lmZGVmCUxJVFRMRV9FTkRJQU4KKwkJCXRvWzNdID0gKmZyb20rKyA7CisJCQl0b1syXSA9ICpmcm9tKysgOworCQkJdG9bMV0gPSAqZnJvbSsrIDsKKwkJCXRvWzBdID0gKmZyb20rKyA7CisjZWxzZQorCQkJdG9bMF0gPSAqZnJvbSsrIDsKKwkJCXRvWzFdID0gKmZyb20rKyA7CisJCQl0b1syXSA9ICpmcm9tKysgOworCQkJdG9bM10gPSAqZnJvbSsrIDsKKyNlbmRpZgorCQkJbGVuIC09IDQgOworCQkJdG8gKz0gNCA7CisJCQlicmVhayA7CisJCWNhc2UgJ0EnIDoKKwkJCWlmIChsZW4gPCA4KQorCQkJCWdvdG8gbGVuX2Vycm9yIDsKKwkJCWlmIChzZXQpCisJCQkJbWVtY3B5KChjaGFyICopIHRvLChjaGFyICopIGZyb20rMiw2KSA7CisJCQl0byArPSA4IDsKKwkJCWZyb20gKz0gOCA7CisJCQlsZW4gLT0gOCA7CisJCQlicmVhayA7CisJCWNhc2UgJzQnIDoKKwkJCWlmIChsZW4gPCA0KQorCQkJCWdvdG8gbGVuX2Vycm9yIDsKKwkJCWlmIChzZXQpCisJCQkJbWVtY3B5KChjaGFyICopIHRvLChjaGFyICopIGZyb20sNCkgOworCQkJdG8gKz0gNCA7CisJCQlmcm9tICs9IDQgOworCQkJbGVuIC09IDQgOworCQkJYnJlYWsgOworCQljYXNlICc4JyA6CisJCQlpZiAobGVuIDwgOCkKKwkJCQlnb3RvIGxlbl9lcnJvciA7CisJCQlpZiAoc2V0KQorCQkJCW1lbWNweSgoY2hhciAqKSB0bywoY2hhciAqKSBmcm9tLDgpIDsKKwkJCXRvICs9IDggOworCQkJZnJvbSArPSA4IDsKKwkJCWxlbiAtPSA4IDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnRCcgOgorCQkJaWYgKGxlbiA8IDMyKQorCQkJCWdvdG8gbGVuX2Vycm9yIDsKKwkJCWlmIChzZXQpCisJCQkJbWVtY3B5KChjaGFyICopIHRvLChjaGFyICopIGZyb20sMzIpIDsKKwkJCXRvICs9IDMyIDsKKwkJCWZyb20gKz0gMzIgOworCQkJbGVuIC09IDMyIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnUCcgOgkJLyogdGltZXN0YW1wIGlzIE5PVCBzd2FwcGVkICovCisJCQlpZiAoc2V0KSB7CisJCQkJdG9bMF0gPSAqZnJvbSsrIDsKKwkJCQl0b1sxXSA9ICpmcm9tKysgOworCQkJCXRvWzJdID0gKmZyb20rKyA7CisJCQkJdG9bM10gPSAqZnJvbSsrIDsKKwkJCQl0b1s0XSA9ICpmcm9tKysgOworCQkJCXRvWzVdID0gKmZyb20rKyA7CisJCQkJdG9bNl0gPSAqZnJvbSsrIDsKKwkJCQl0b1s3XSA9ICpmcm9tKysgOworCQkJfQorCQkJdG8gKz0gOCA7CisJCQlsZW4gLT0gOCA7CisJCQlicmVhayA7CisJCWRlZmF1bHQgOgorCQkJU01UX1BBTklDKHNtYyxTTVRfRTAxMjAsIFNNVF9FMDEyMF9NU0cpIDsKKwkJCXJldHVybihTTVRfUkRGX0lMTEVHQUwpIDsKKwkJfQorCX0KKwkvKgorCSAqIGFjdGlvbnMgYW5kIGludGVybmFsIHVwZGF0ZXMKKwkgKi8KKwlzd2l0Y2ggKHBhLT5wX3R5cGUpIHsKKwljYXNlIFNNVF9QMTAxQToJCQkvKiBmZGRpU01UQ29uZmlnUG9saWN5ICovCisJCWlmICh3b3JkX3ZhbCAmIH4xKQorCQkJZ290byB2YWxfZXJyb3IgOworCQlJRlNFVChtaWItPmZkZGlTTVRDb25maWdQb2xpY3kgPSB3b3JkX3ZhbCkgOworCQlicmVhayA7CisJY2FzZSBTTVRfUDEwMUIgOgkJLyogZmRkaVNNVENvbm5lY3Rpb25Qb2xpY3kgKi8KKwkJaWYgKCEod29yZF92YWwgJiBQT0xJQ1lfTU0pKQorCQkJZ290byB2YWxfZXJyb3IgOworCQlJRlNFVChtaWItPmZkZGlTTVRDb25uZWN0aW9uUG9saWN5ID0gd29yZF92YWwpIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX1AxMDFEIDogCQkvKiBmZGRpU01UVFRfTm90aWZ5ICovCisJCWlmICh3b3JkX3ZhbCA8IDIgfHwgd29yZF92YWwgPiAzMCkKKwkJCWdvdG8gdmFsX2Vycm9yIDsKKwkJSUZTRVQobWliLT5mZGRpU01UVFRfTm90aWZ5ID0gd29yZF92YWwpIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX1AxMDFFIDoJCS8qIGZkZGlTTVRTdGF0UnB0UG9saWN5ICovCisJCWlmIChieXRlX3ZhbCAmIH4xKQorCQkJZ290byB2YWxfZXJyb3IgOworCQlJRlNFVChtaWItPmZkZGlTTVRTdGF0UnB0UG9saWN5ID0gYnl0ZV92YWwpIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX1AxMDFGIDoJCS8qIGZkZGlTTVRUcmFjZV9NYXhFeHBpcmF0aW9uICovCisJCS8qCisJCSAqIG5vdGU6IGxvd2VyIGxpbWl0IHRyYWNlX21heCA9IDYuMDAxNzczLi4uIHMKKwkJICogTk8gdXBwZXIgbGltaXQKKwkJICovCisJCWlmIChsb25nX3ZhbCA8IChsb25nKTB4NDc4YmY1MUwpCisJCQlnb3RvIHZhbF9lcnJvciA7CisJCUlGU0VUKG1pYi0+ZmRkaVNNVFRyYWNlX01heEV4cGlyYXRpb24gPSBsb25nX3ZhbCkgOworCQlicmVhayA7CisjaWZkZWYJRVNTCisJY2FzZSBTTVRfUDEwRjIgOgkJLyogZmRkaUVTU1BheWxvYWQgKi8KKwkJaWYgKGxvbmdfdmFsID4gMTU2MikKKwkJCWdvdG8gdmFsX2Vycm9yIDsKKwkJaWYgKHNldCAmJiBzbWMtPm1pYi5mZGRpRVNTUGF5bG9hZCAhPSBsb25nX3ZhbCkgeworCQkJc21jLT5lc3MucmFmX2FjdF90aW1lcl9wb2xsID0gVFJVRSA7CisJCQlzbWMtPm1pYi5mZGRpRVNTUGF5bG9hZCA9IGxvbmdfdmFsIDsKKwkJfQorCQlicmVhayA7CisJY2FzZSBTTVRfUDEwRjMgOgkJLyogZmRkaUVTU092ZXJoZWFkICovCisJCWlmIChsb25nX3ZhbCA8IDUwIHx8IGxvbmdfdmFsID4gNTAwMCkKKwkJCWdvdG8gdmFsX2Vycm9yIDsKKwkJaWYgKHNldCAmJiBzbWMtPm1pYi5mZGRpRVNTUGF5bG9hZCAmJgorCQkJc21jLT5taWIuZmRkaUVTU092ZXJoZWFkICE9IGxvbmdfdmFsKSB7CisJCQlzbWMtPmVzcy5yYWZfYWN0X3RpbWVyX3BvbGwgPSBUUlVFIDsKKwkJCXNtYy0+bWliLmZkZGlFU1NPdmVyaGVhZCA9IGxvbmdfdmFsIDsKKwkJfQorCQlicmVhayA7CisJY2FzZSBTTVRfUDEwRjQgOgkJLyogZmRkaUVTU01heFROZWcgKi8KKwkJaWYgKGxvbmdfdmFsID4gLU1TMkJDTEsoNSkgfHwgbG9uZ192YWwgPCAtTVMyQkNMSygxNjUpKQorCQkJZ290byB2YWxfZXJyb3IgOworCQlJRlNFVChtaWItPmZkZGlFU1NNYXhUTmVnID0gbG9uZ192YWwpIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX1AxMEY1IDoJCS8qIGZkZGlFU1NNaW5TZWdtZW50U2l6ZSAqLworCQlpZiAobG9uZ192YWwgPCAxIHx8IGxvbmdfdmFsID4gNDQ3OCkKKwkJCWdvdG8gdmFsX2Vycm9yIDsKKwkJSUZTRVQobWliLT5mZGRpRVNTTWluU2VnbWVudFNpemUgPSBsb25nX3ZhbCkgOworCQlicmVhayA7CisJY2FzZSBTTVRfUDEwRjYgOgkJLyogZmRkaUVTU0NhdGVnb3J5ICovCisJCWlmICgobG9uZ192YWwgJiAweGZmZmYpICE9IDEpCisJCQlnb3RvIHZhbF9lcnJvciA7CisJCUlGU0VUKG1pYi0+ZmRkaUVTU0NhdGVnb3J5ID0gbG9uZ192YWwpIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX1AxMEY3IDoJCS8qIGZkZGlFU1NTeW5jVHhNb2RlICovCisJCWlmICh3b3JkX3ZhbCA+IDEpCisJCQlnb3RvIHZhbF9lcnJvciA7CisJCUlGU0VUKG1pYi0+ZmRkaUVTU1N5bmNoVHhNb2RlID0gd29yZF92YWwpIDsKKwkJYnJlYWsgOworI2VuZGlmCisjaWZkZWYJU0JBCisJY2FzZSBTTVRfUDEwRjggOgkJLyogZmRkaVNCQUNvbW1hbmQgKi8KKwkJaWYgKGJ5dGVfdmFsICE9IFNCX1NUT1AgJiYgYnl0ZV92YWwgIT0gU0JfU1RBUlQpCisJCQlnb3RvIHZhbF9lcnJvciA7CisJCUlGU0VUKG1pYi0+ZmRkaVNCQUNvbW1hbmQgPSBieXRlX3ZhbCkgOworCQlicmVhayA7CisJY2FzZSBTTVRfUDEwRjkgOgkJLyogZmRkaVNCQUF2YWlsYWJsZSAqLworCQlpZiAoYnl0ZV92YWwgPiAxMDApCisJCQlnb3RvIHZhbF9lcnJvciA7CisJCUlGU0VUKG1pYi0+ZmRkaVNCQUF2YWlsYWJsZSA9IGJ5dGVfdmFsKSA7CisJCWJyZWFrIDsKKyNlbmRpZgorCWNhc2UgU01UX1AyMDIwIDoJCS8qIGZkZGlNQUNSZXF1ZXN0ZWRQYXRocyAqLworCQlpZiAoKHdvcmRfdmFsICYgKE1JQl9QX1BBVEhfUFJJTV9QUkVGRVIgfAorCQkJTUlCX1BfUEFUSF9QUklNX0FMVEVSKSkgPT0gMCApCisJCQlnb3RvIHZhbF9lcnJvciA7CisJCUlGU0VUKG1pYl9tLT5mZGRpTUFDUmVxdWVzdGVkUGF0aHMgPSB3b3JkX3ZhbCkgOworCQlicmVhayA7CisJY2FzZSBTTVRfUDIwNUYgOgkJLyogZmRkaU1BQ0ZyYW1lRXJyb3JUaHJlc2hvbGQgKi8KKwkJLyogMCAuLiBmZmZmIGFjY2VwdGFibGUgKi8KKwkJSUZTRVQobWliX20tPmZkZGlNQUNGcmFtZUVycm9yVGhyZXNob2xkID0gd29yZF92YWwpIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX1AyMDY3IDoJCS8qIGZkZGlNQUNOb3RDb3BpZWRUaHJlc2hvbGQgKi8KKwkJLyogMCAuLiBmZmZmIGFjY2VwdGFibGUgKi8KKwkJSUZTRVQobWliX20tPmZkZGlNQUNOb3RDb3BpZWRUaHJlc2hvbGQgPSB3b3JkX3ZhbCkgOworCQlicmVhayA7CisJY2FzZSBTTVRfUDIwNzY6CQkJLyogZmRkaU1BQ01BX1VuaXRkYXRhRW5hYmxlICovCisJCWlmIChieXRlX3ZhbCAmIH4xKQorCQkJZ290byB2YWxfZXJyb3IgOworCQlpZiAoc2V0KSB7CisJCQltaWJfbS0+ZmRkaU1BQ01BX1VuaXRkYXRhRW5hYmxlID0gYnl0ZV92YWwgOworCQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX1JNVCxSTV9FTkFCTEVfRkxBRykgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIFNNVF9QMjBGMSA6CQkvKiBmZGRpTUFDVF9NaW4gKi8KKwkJSUZTRVQobWliX20tPmZkZGlNQUNUX01pbiA9IGxvbmdfdmFsKSA7CisJCWJyZWFrIDsKKwljYXNlIFNNVF9QMzIwRiA6CisJCWlmIChsb25nX3ZhbCA+IDE1NjIpCisJCQlnb3RvIHZhbF9lcnJvciA7CisJCUlGU0VUKG1pYl9hLT5mZGRpUEFUSFNiYVBheWxvYWQgPSBsb25nX3ZhbCkgOworI2lmZGVmCUVTUworCQlpZiAoc2V0KQorCQkJZXNzX3BhcmFfY2hhbmdlKHNtYykgOworI2VuZGlmCisJCWJyZWFrIDsKKwljYXNlIFNNVF9QMzIxMCA6CisJCWlmIChsb25nX3ZhbCA+IDUwMDApCisJCQlnb3RvIHZhbF9lcnJvciA7CisJCQorCQlpZiAobG9uZ192YWwgIT0gMCAmJiBtaWJfYS0+ZmRkaVBBVEhTYmFQYXlsb2FkID09IDApCisJCQlnb3RvIHZhbF9lcnJvciA7CisKKwkJSUZTRVQobWliX2EtPmZkZGlQQVRIU2JhT3ZlcmhlYWQgPSBsb25nX3ZhbCkgOworI2lmZGVmCUVTUworCQlpZiAoc2V0KQorCQkJZXNzX3BhcmFfY2hhbmdlKHNtYykgOworI2VuZGlmCisJCWJyZWFrIDsKKwljYXNlIFNNVF9QMzIxMzoJCQkvKiBmZGRpUEFUSFRfUm1vZGUgKi8KKwkJLyogbm8gbGltaXQgOgorCQkgKiAwIC4uIDM0My41OTcgPT4gMCAuLiAyZTMyICogODBuUworCQkgKi8KKwkJaWYgKHNldCkgeworCQkJbWliX2EtPmZkZGlQQVRIVF9SbW9kZSA9IGxvbmdfdmFsIDsKKwkJCXJ0bV9zZXRfdGltZXIoc21jKSA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgU01UX1AzMjE0IDoJCS8qIGZkZGlQQVRIU2JhQXZhaWxhYmxlICovCisJCWlmIChsb25nX3ZhbCA+IDB4MDBCRUJDMjBMKQorCQkJZ290byB2YWxfZXJyb3IgOworI2lmZGVmIFNCQSAKKwkJaWYgKHNldCAmJiBtaWItPmZkZGlTQkFDb21tYW5kID09IFNCX1NUT1ApCisJCQlnb3RvIHZhbF9lcnJvciA7CisjZW5kaWYKKwkJSUZTRVQobWliX2EtPmZkZGlQQVRIU2JhQXZhaWxhYmxlID0gbG9uZ192YWwpIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX1AzMjE1IDoJCS8qIGZkZGlQQVRIVFZYTG93ZXJCb3VuZCAqLworCQlJRlNFVChtaWJfYS0+ZmRkaVBBVEhUVlhMb3dlckJvdW5kID0gbG9uZ192YWwpIDsKKwkJZ290byBjaGFuZ2VfbWFjX3BhcmEgOworCWNhc2UgU01UX1AzMjE2IDoJCS8qIGZkZGlQQVRIVF9NYXhMb3dlckJvdW5kICovCisJCUlGU0VUKG1pYl9hLT5mZGRpUEFUSFRfTWF4TG93ZXJCb3VuZCA9IGxvbmdfdmFsKSA7CisJCWdvdG8gY2hhbmdlX21hY19wYXJhIDsKKwljYXNlIFNNVF9QMzIxNyA6CQkvKiBmZGRpUEFUSE1heFRfUmVxICovCisJCUlGU0VUKG1pYl9hLT5mZGRpUEFUSE1heFRfUmVxID0gbG9uZ192YWwpIDsKKworY2hhbmdlX21hY19wYXJhOgorCQlpZiAoc2V0ICYmIHNtdF9zZXRfbWFjX29wdmFsdWVzKHNtYykpIHsKKwkJCVJTX1NFVChzbWMsUlNfRVZFTlQpIDsKKwkJCXNtYy0+c20ucGxlYXNlX3JlY29ubmVjdCA9IDEgOworCQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX0VDTSxFQ19ESVNDT05ORUNUKSA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgU01UX1A0MDBFIDoJCS8qIGZkZGlQT1JUQ29ubmVjdGlvblBvbGljaWVzICovCisJCWlmIChieXRlX3ZhbCA+IDEpCisJCQlnb3RvIHZhbF9lcnJvciA7CisJCUlGU0VUKG1pYl9wLT5mZGRpUE9SVENvbm5lY3Rpb25Qb2xpY2llcyA9IGJ5dGVfdmFsKSA7CisJCWJyZWFrIDsKKwljYXNlIFNNVF9QNDAxMSA6CQkvKiBmZGRpUE9SVFJlcXVlc3RlZFBhdGhzICovCisJCS8qIGFsbCAzKjggYml0cyBhbGxvd2VkICovCisJCUlGU0VUKG1lbWNweSgoY2hhciAqKW1pYl9wLT5mZGRpUE9SVFJlcXVlc3RlZFBhdGhzLAorCQkJKGNoYXIgKikmbG9uZ192YWwsNCkpIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX1A0MDFGOgkJCS8qIGZkZGlQT1JUTWFpbnRfTFMgKi8KKwkJaWYgKHdvcmRfdmFsID4gNCkKKwkJCWdvdG8gdmFsX2Vycm9yIDsKKwkJSUZTRVQobWliX3AtPmZkZGlQT1JUTWFpbnRfTFMgPSB3b3JkX3ZhbCkgOworCQlicmVhayA7CisJY2FzZSBTTVRfUDQwM0EgOgkJLyogZmRkaVBPUlRMZXJfQ3V0b2ZmICovCisJCWlmIChieXRlX3ZhbCA8IDQgfHwgYnl0ZV92YWwgPiAxNSkKKwkJCWdvdG8gdmFsX2Vycm9yIDsKKwkJSUZTRVQobWliX3AtPmZkZGlQT1JUTGVyX0N1dG9mZiA9IGJ5dGVfdmFsKSA7CisJCWJyZWFrIDsKKwljYXNlIFNNVF9QNDAzQiA6CQkvKiBmZGRpUE9SVExlcl9BbGFybSAqLworCQlpZiAoYnl0ZV92YWwgPCA0IHx8IGJ5dGVfdmFsID4gMTUpCisJCQlnb3RvIHZhbF9lcnJvciA7CisJCUlGU0VUKG1pYl9wLT5mZGRpUE9SVExlcl9BbGFybSA9IGJ5dGVfdmFsKSA7CisJCWJyZWFrIDsKKworCS8qCisJICogQWN0aW9ucworCSAqLworCWNhc2UgU01UX1AxMDNDIDoJCS8qIGZkZGlTTVRTdGF0aW9uQWN0aW9uICovCisJCWlmIChzbXRfYWN0aW9uKHNtYyxTTVRfU1RBVElPTl9BQ1RJT04sIChpbnQpIHdvcmRfdmFsLCAwKSkKKwkJCWdvdG8gdmFsX2Vycm9yIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX1A0MDQ2OgkJCS8qIGZkZGlQT1JUQWN0aW9uICovCisJCWlmIChzbXRfYWN0aW9uKHNtYyxTTVRfUE9SVF9BQ1RJT04sIChpbnQpIHdvcmRfdmFsLAorCQkJcG9ydF90b19taWIoc21jLHBvcnQpKSkKKwkJCWdvdG8gdmFsX2Vycm9yIDsKKwkJYnJlYWsgOworCWRlZmF1bHQgOgorCQlicmVhayA7CisJfQorCXJldHVybigwKSA7CisKK3ZhbF9lcnJvcjoKKwkvKiBwYXJhbWV0ZXIgdmFsdWUgaW4gZnJhbWUgaXMgb3V0IG9mIHJhbmdlICovCisJcmV0dXJuKFNNVF9SREZfUkFOR0UpIDsKKworbGVuX2Vycm9yOgorCS8qIHBhcmFtZXRlciB2YWx1ZSBpbiBmcmFtZSBpcyB0b28gc2hvcnQgKi8KKwlyZXR1cm4oU01UX1JERl9MRU5HVEgpIDsKKworI2lmCTAKK25vX2F1dGhvcl9lcnJvcjoKKwkvKiBwYXJhbWV0ZXIgbm90IHNldGFibGUsIGJlY2F1c2UgdGhlIFNCQSBpcyBub3QgYWN0aXZlCisJICogUGxlYXNlIG5vdGU6IHdlIGdpdmUgdGhlIHJldHVybiBjb2RlICdub3QgYXV0aG9yaXplZWQKKwkgKiAgYmVjYXVzZSBTQkEgZGVuaWVkIGlzIG5vdCBhIHZhbGlkIHJldHVybiBjb2RlIGluIHRoZQorCSAqIFBNRiBwcm90b2NvbC4KKwkgKi8KKwlyZXR1cm4oU01UX1JERl9BVVRIT1IpIDsKKyNlbmRpZgorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNfcF90YWIgKnNtdF9nZXRfcHRhYih1X3Nob3J0IHBhcmEpCit7CisJY29uc3Qgc3RydWN0IHNfcF90YWIJKnB0IDsKKwlmb3IgKHB0ID0gcF90YWIgOyBwdC0+cF9udW0gJiYgcHQtPnBfbnVtICE9IHBhcmEgOyBwdCsrKQorCQk7CisJcmV0dXJuKHB0LT5wX251bSA/IHB0IDogTlVMTCkgOworfQorCitzdGF0aWMgaW50IHNtdF9taWJfcGh5cyhzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKyNpZmRlZglDT05DRU5UUkFUT1IKKwlTS19VTlVTRUQoc21jKSA7CisKKwlyZXR1cm4oTlVNUEhZUykgOworI2Vsc2UKKwlpZiAoc21jLT5zLnNhcyA9PSBTTVRfU0FTKQorCQlyZXR1cm4oMSkgOworCXJldHVybihOVU1QSFlTKSA7CisjZW5kaWYKK30KKworaW50IHBvcnRfdG9fbWliKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcCkKK3sKKyNpZmRlZglDT05DRU5UUkFUT1IKKwlTS19VTlVTRUQoc21jKSA7CisKKwlyZXR1cm4ocCkgOworI2Vsc2UKKwlpZiAoc21jLT5zLnNhcyA9PSBTTVRfU0FTKQorCQlyZXR1cm4oUFMpIDsKKwlyZXR1cm4ocCkgOworI2VuZGlmCit9CisKKworI2lmZGVmCURFQlVHCisjaWZuZGVmCUJPT1QKK3ZvaWQgZHVtcF9zbXQoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfaGVhZGVyICpzbSwgY2hhciAqdGV4dCkKK3sKKwlpbnQJbGVuIDsKKwlzdHJ1Y3Qgc210X3BhcmEJKnBhIDsKKwljaGFyCSpjIDsKKwlpbnQJbiA7CisJaW50CW5uIDsKKyNpZmRlZglMSVRUTEVfRU5ESUFOCisJaW50CXNtdGxlbiA7CisjZW5kaWYKKworCVNLX1VOVVNFRChzbWMpIDsKKworI2lmZGVmCURFQlVHX0JSRAorCWlmIChzbWMtPmRlYnVnLmRfc210ZiA8IDIpCisjZWxzZQorCWlmIChkZWJ1Zy5kX3NtdGYgPCAyKQorI2VuZGlmCisJCXJldHVybiA7CisjaWZkZWYJTElUVExFX0VORElBTgorCXNtdGxlbiA9IHNtLT5zbXRfbGVuICsgc2l6ZW9mKHN0cnVjdCBzbXRfaGVhZGVyKSA7CisjZW5kaWYKKwlwcmludGYoIlNNVCBGcmFtZSBbJXNdOlxuREEgICIsdGV4dCkgOworCWR1bXBfaGV4KChjaGFyICopICZzbS0+c210X2Rlc3QsNikgOworCXByaW50ZigiXHRTQSAiKSA7CisJZHVtcF9oZXgoKGNoYXIgKikgJnNtLT5zbXRfc291cmNlLDYpIDsKKwlwcmludGYoIiBDbGFzcyAleCBUeXBlICV4IFZlcnNpb24gJXhcbiIsCisJCXNtLT5zbXRfY2xhc3Msc20tPnNtdF90eXBlLHNtLT5zbXRfdmVyc2lvbikgIDsKKwlwcmludGYoIlRJRCAlbHhcdFx0U0lEICIsc20tPnNtdF90aWQpIDsKKwlkdW1wX2hleCgoY2hhciAqKSAmc20tPnNtdF9zaWQsOCkgOworCXByaW50ZigiIExFTiAleFxuIixzbS0+c210X2xlbikgOworCisJbGVuID0gc20tPnNtdF9sZW4gOworCXBhID0gKHN0cnVjdCBzbXRfcGFyYSAqKSAoc20gKyAxKSA7CisJd2hpbGUgKGxlbiA+IDAgKSB7CisJCWludAlwbGVuIDsKKyNpZmRlZiBVTklYCisJCXByaW50ZigiVFlQRSAleCBMRU4gJXggVkFMVUVcdCIscGEtPnBfdHlwZSxwYS0+cF9sZW4pIDsKKyNlbHNlCisJCXByaW50ZigiVFlQRSAlMDR4IExFTiAlMnggVkFMVUVcdCIscGEtPnBfdHlwZSxwYS0+cF9sZW4pIDsKKyNlbmRpZgorCQluID0gcGEtPnBfbGVuIDsKKwkJaWYgKCAobiA8IDAgKSB8fCAobiA+IChpbnQpKGxlbiAtIFBBUkFfTEVOKSkpIHsKKwkJCW4gPSBsZW4gLSBQQVJBX0xFTiA7CisJCQlwcmludGYoIiBCQUQgTEVOR1RIXG4iKSA7CisJCQlicmVhayA7CisJCX0KKyNpZmRlZglMSVRUTEVfRU5ESUFOCisJCXNtdF9zd2FwX3BhcmEoc20sc210bGVuLDApIDsKKyNlbmRpZgorCQlpZiAobiA8IDI0KSB7CisJCQlkdW1wX2hleCgoY2hhciAqKShwYSsxKSwoaW50KSBuKSA7CisJCQlwcmludGYoIlxuIikgOworCQl9CisJCWVsc2UgeworCQkJaW50CWZpcnN0ID0gMCA7CisJCQljID0gKGNoYXIgKikocGErMSkgOworCQkJZHVtcF9oZXgoYywxNikgOworCQkJcHJpbnRmKCJcbiIpIDsKKwkJCW4gLT0gMTYgOworCQkJYyArPSAxNiA7CisJCQl3aGlsZSAobiA+IDApIHsKKwkJCQlubiA9IChuID4gMTYpID8gMTYgOiBuIDsKKwkJCQlpZiAobiA+IDY0KSB7CisJCQkJCWlmIChmaXJzdCA9PSAwKQorCQkJCQkJcHJpbnRmKCJcdFx0XHQuLi5cbiIpIDsKKwkJCQkJZmlyc3QgPSAxIDsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCXByaW50ZigiXHRcdFx0IikgOworCQkJCQlkdW1wX2hleChjLG5uKSA7CisJCQkJCXByaW50ZigiXG4iKSA7CisJCQkJfQorCQkJCW4gLT0gbm4gOworCQkJCWMgKz0gMTYgOworCQkJfQorCQl9CisjaWZkZWYJTElUVExFX0VORElBTgorCQlzbXRfc3dhcF9wYXJhKHNtLHNtdGxlbiwxKSA7CisjZW5kaWYKKwkJcGxlbiA9IChwYS0+cF9sZW4gKyBQQVJBX0xFTiArIDMpICYgfjMgOworCQlsZW4gLT0gcGxlbiA7CisJCXBhID0gKHN0cnVjdCBzbXRfcGFyYSAqKSgoY2hhciAqKXBhICsgcGxlbikgOworCX0KKwlwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuIikgOworfQorCit2b2lkIGR1bXBfaGV4KGNoYXIgKnAsIGludCBsZW4pCit7CisJaW50CW4gPSAwIDsKKwl3aGlsZSAobGVuLS0pIHsKKwkJbisrIDsKKyNpZmRlZiBVTklYCisJCXByaW50ZigiJXglcyIsKnArKyAmIDB4ZmYsbGVuID8gKCAobiAmIDcpID8gIiAiIDogIi0iKSA6ICIiKSA7CisjZWxzZQorCQlwcmludGYoIiUwMnglcyIsKnArKyAmIDB4ZmYsbGVuID8gKCAobiAmIDcpID8gIiAiIDogIi0iKSA6ICIiKSA7CisjZW5kaWYKKwl9Cit9CisjZW5kaWYJLyogbm8gQk9PVCAqLworI2VuZGlmCS8qIERFQlVHICovCisKKworI2VuZGlmCS8qIG5vIFNMSU1fU01UICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL3F1ZXVlLmMgYi9kcml2ZXJzL25ldC9za2ZwL3F1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlhZGIzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvcXVldWUuYwpAQCAtMCwwICsxLDE3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVNlZSB0aGUgZmlsZSAic2tmZGRpLmMiIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKwlTTVQgRXZlbnQgUXVldWUgTWFuYWdlbWVudAorKi8KKworI2luY2x1ZGUgImgvdHlwZXMuaCIKKyNpbmNsdWRlICJoL2ZkZGkuaCIKKyNpbmNsdWRlICJoL3NtYy5oIgorCisjaWZuZGVmCWxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIElEX3NjY3NbXSA9ICJAKCMpcXVldWUuYwkyLjkgOTcvMDgvMDQgKEMpIFNLICIgOworI2VuZGlmCisKKyNkZWZpbmUgUFJJTlRGKGEsYixjKQorCisvKgorICogaW5pdCBldmVudCBxdWV1ZSBtYW5hZ2VtZW50CisgKi8KK3ZvaWQgZXZfaW5pdChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzbWMtPnEuZXZfcHV0ID0gc21jLT5xLmV2X2dldCA9IHNtYy0+cS5ldl9xdWV1ZSA7Cit9CisKKy8qCisgKiBhZGQgZXZlbnQgdG8gcXVldWUKKyAqLwordm9pZCBxdWV1ZV9ldmVudChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGNsYXNzLCBpbnQgZXZlbnQpCit7CisJUFJJTlRGKCJxdWV1ZSBjbGFzcyAlZCBldmVudCAlZFxuIixjbGFzcyxldmVudCkgOworCXNtYy0+cS5ldl9wdXQtPmNsYXNzID0gY2xhc3MgOworCXNtYy0+cS5ldl9wdXQtPmV2ZW50ID0gZXZlbnQgOworCWlmICgrK3NtYy0+cS5ldl9wdXQgPT0gJnNtYy0+cS5ldl9xdWV1ZVtNQVhfRVZFTlRdKQorCQlzbWMtPnEuZXZfcHV0ID0gc21jLT5xLmV2X3F1ZXVlIDsKKworCWlmIChzbWMtPnEuZXZfcHV0ID09IHNtYy0+cS5ldl9nZXQpIHsKKwkJU01UX0VSUl9MT0coc21jLFNNVF9FMDEzNywgU01UX0UwMTM3X01TRykgOworCX0KK30KKworLyoKKyAqIHRpbWVyX2V2ZW50IGlzIGNhbGxlZCBmcm9tIEhXIHRpbWVyIHBhY2thZ2UuCisgKi8KK3ZvaWQgdGltZXJfZXZlbnQoc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyB0b2tlbikKK3sKKwlQUklOVEYoInRpbWVyIGV2ZW50IGNsYXNzICVkIHRva2VuICVkXG4iLAorCQlFVl9UX0NMQVNTKHRva2VuKSwKKwkJRVZfVF9FVkVOVCh0b2tlbikpIDsKKwlxdWV1ZV9ldmVudChzbWMsRVZfVF9DTEFTUyh0b2tlbiksRVZfVF9FVkVOVCh0b2tlbikpOworfQorCisvKgorICogZXZlbnQgZGlzcGF0Y2hlcgorICoJd2hpbGUgZXZlbnQgcXVldWUgaXMgbm90IGVtcHR5CisgKgkJZ2V0IGV2ZW50IGZyb20gcXVldWUKKyAqCQlzZW5kIGNvbW1hbmQgdG8gc3RhdGUgbWFjaGluZQorICoJZW5kCisgKi8KK3ZvaWQgZXZfZGlzcGF0Y2hlcihzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzdHJ1Y3QgZXZlbnRfcXVldWUgKmV2IDsJLyogcG9pbnRlciBpbnRvIHF1ZXVlICovCisJaW50CQljbGFzcyA7CisKKwlldiA9IHNtYy0+cS5ldl9nZXQgOworCVBSSU5URigiZGlzcGF0Y2ggZ2V0ICV4IHB1dCAleFxuIixldixzbWMtPnEuZXZfcHV0KSA7CisJd2hpbGUgKGV2ICE9IHNtYy0+cS5ldl9wdXQpIHsKKwkJUFJJTlRGKCJkaXNwYXRjaCBjbGFzcyAlZCBldmVudCAlZFxuIixldi0+Y2xhc3MsZXYtPmV2ZW50KSA7CisJCXN3aXRjaChjbGFzcyA9IGV2LT5jbGFzcykgeworCQljYXNlIEVWRU5UX0VDTSA6CQkvKiBFbnRpdHkgQ29yb3JkaW5hdGlvbiAgTWFuLiAqLworCQkJZWNtKHNtYywoaW50KWV2LT5ldmVudCkgOworCQkJYnJlYWsgOworCQljYXNlIEVWRU5UX0NGTSA6CQkvKiBDb25maWd1cmF0aW9uIE1hbi4gKi8KKwkJCWNmbShzbWMsKGludClldi0+ZXZlbnQpIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSBFVkVOVF9STVQgOgkJLyogUmluZyBNYW4uICovCisJCQlybXQoc21jLChpbnQpZXYtPmV2ZW50KSA7CisJCQlicmVhayA7CisJCWNhc2UgRVZFTlRfU01UIDoKKwkJCXNtdF9ldmVudChzbWMsKGludClldi0+ZXZlbnQpIDsKKwkJCWJyZWFrIDsKKyNpZmRlZglDT05DRU5UUkFUT1IKKwkJY2FzZSA5OSA6CisJCQl0aW1lcl90ZXN0X2V2ZW50KHNtYywoaW50KWV2LT5ldmVudCkgOworCQkJYnJlYWsgOworI2VuZGlmCisJCWNhc2UgRVZFTlRfUENNQSA6CQkvKiBQSFkgQSAqLworCQljYXNlIEVWRU5UX1BDTUIgOgkJLyogUEhZIEIgKi8KKwkJZGVmYXVsdCA6CisJCQlpZiAoY2xhc3MgPj0gRVZFTlRfUENNQSAmJgorCQkJICAgIGNsYXNzIDwgRVZFTlRfUENNQSArIE5VTVBIWVMpIHsKKwkJCQlwY20oc21jLGNsYXNzIC0gRVZFTlRfUENNQSwoaW50KWV2LT5ldmVudCkgOworCQkJCWJyZWFrIDsKKwkJCX0KKwkJCVNNVF9QQU5JQyhzbWMsU01UX0UwMTIxLCBTTVRfRTAxMjFfTVNHKSA7CisJCQlyZXR1cm4gOworCQl9CisKKwkJaWYgKCsrZXYgPT0gJnNtYy0+cS5ldl9xdWV1ZVtNQVhfRVZFTlRdKQorCQkJZXYgPSBzbWMtPnEuZXZfcXVldWUgOworCisJCS8qIFJlbmV3IGdldDogaXQgaXMgdXNlZCBpbiBxdWV1ZV9ldmVudHMgdG8gZGV0ZWN0IG92ZXJydW5zICovCisJCXNtYy0+cS5ldl9nZXQgPSBldjsKKwl9Cit9CisKKy8qCisgKiBzbXRfb25saW5lIGNvbm5lY3RzIHRvIG9yIGRpc2Nvbm5lY3RzIGZyb20gdGhlIHJpbmcKKyAqIE1VU1QgYmUgY2FsbGVkIHRvIGluaXRpYXRlIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudAorICoKKyAqCW9uCTAJZGlzY29ubmVjdAorICoJb24JMQljb25uZWN0CisgKi8KK3Vfc2hvcnQgc210X29ubGluZShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG9uKQoreworCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9FQ00sb24gPyBFQ19DT05ORUNUIDogRUNfRElTQ09OTkVDVCkgOworCWV2X2Rpc3BhdGNoZXIoc21jKSA7CisJcmV0dXJuKHNtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZSkgOworfQorCisvKgorICogc2V0IFNNVCBmbGFnIHRvIHZhbHVlCisgKglmbGFnCQlmbGFnIG5hbWUKKyAqCXZhbHVlCQlmbGFnIHZhbHVlCisgKiBkdW1wIGN1cnJlbnQgZmxhZyBzZXR0aW5nCisgKi8KKyNpZmRlZglDT05DRU5UUkFUT1IKK3ZvaWQgZG9fc210X2ZsYWcoc3RydWN0IHNfc21jICpzbWMsIGNoYXIgKmZsYWcsIGludCB2YWx1ZSkKK3sKKyNpZmRlZglERUJVRworCXN0cnVjdCBzbXRfZGVidWcJKmRlYjsKKworCVNLX1VOVVNFRChzbWMpIDsKKworI2lmZGVmCURFQlVHX0JSRAorCWRlYiA9ICZzbWMtPmRlYnVnOworI2Vsc2UKKwlkZWIgPSAmZGVidWc7CisjZW5kaWYKKwlpZiAoIXN0cmNtcChmbGFnLCJzbXQiKSkKKwkJZGViLT5kX3NtdCA9IHZhbHVlIDsKKwllbHNlIGlmICghc3RyY21wKGZsYWcsInNtdGYiKSkKKwkJZGViLT5kX3NtdGYgPSB2YWx1ZSA7CisJZWxzZSBpZiAoIXN0cmNtcChmbGFnLCJwY20iKSkKKwkJZGViLT5kX3BjbSA9IHZhbHVlIDsKKwllbHNlIGlmICghc3RyY21wKGZsYWcsInJtdCIpKQorCQlkZWItPmRfcm10ID0gdmFsdWUgOworCWVsc2UgaWYgKCFzdHJjbXAoZmxhZywiY2ZtIikpCisJCWRlYi0+ZF9jZm0gPSB2YWx1ZSA7CisJZWxzZSBpZiAoIXN0cmNtcChmbGFnLCJlY20iKSkKKwkJZGViLT5kX2VjbSA9IHZhbHVlIDsKKwlwcmludGYoInNtdAklZFxuIixkZWItPmRfc210KSA7CisJcHJpbnRmKCJzbXRmCSVkXG4iLGRlYi0+ZF9zbXRmKSA7CisJcHJpbnRmKCJwY20JJWRcbiIsZGViLT5kX3BjbSkgOworCXByaW50Zigicm10CSVkXG4iLGRlYi0+ZF9ybXQpIDsKKwlwcmludGYoImNmbQklZFxuIixkZWItPmRfY2ZtKSA7CisJcHJpbnRmKCJlY20JJWRcbiIsZGViLT5kX2VjbSkgOworI2VuZGlmCS8qIERFQlVHICovCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvcm10LmMgYi9kcml2ZXJzL25ldC9za2ZwL3JtdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmOGQ1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL3JtdC5jCkBAIC0wLDAgKzEsNjU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorCVNNVCBSTVQKKwlSaW5nIE1hbmFnZW1lbnQKKyovCisKKy8qCisgKiBIYXJkd2FyZSBpbmRlcGVuZGVudCBzdGF0ZSBtYWNoaW5lIGltcGxlbWFudGF0aW9uCisgKiBUaGUgZm9sbG93aW5nIGV4dGVybmFsIFNNVCBmdW5jdGlvbnMgYXJlIHJlZmVyZW5jZWQgOgorICoKKyAqIAkJcXVldWVfZXZlbnQoKQorICogCQlzbXRfdGltZXJfc3RhcnQoKQorICogCQlzbXRfdGltZXJfc3RvcCgpCisgKgorICogCVRoZSBmb2xsb3dpbmcgZXh0ZXJuYWwgSFcgZGVwZW5kZW50IGZ1bmN0aW9ucyBhcmUgcmVmZXJlbmNlZCA6CisgKgkJc21fbWFfY29udHJvbCgpCisgKgkJc21fbWFjX2NoZWNrX2JlYWNvbl9jbGFpbSgpCisgKgorICogCVRoZSBmb2xsb3dpbmcgSFcgZGVwZW5kZW50IGV2ZW50cyBhcmUgcmVxdWlyZWQgOgorICoJCVJNX1JJTkdfT1AKKyAqCQlSTV9SSU5HX05PTl9PUAorICoJCVJNX01ZX0JFQUNPTgorICoJCVJNX09USEVSX0JFQUNPTgorICoJCVJNX01ZX0NMQUlNCisgKgkJUk1fVFJUX0VYUAorICoJCVJNX1ZBTElEX0NMQUlNCisgKgorICovCisKKyNpbmNsdWRlICJoL3R5cGVzLmgiCisjaW5jbHVkZSAiaC9mZGRpLmgiCisjaW5jbHVkZSAiaC9zbWMuaCIKKworI2RlZmluZSBLRVJORUwKKyNpbmNsdWRlICJoL3NtdHN0YXRlLmgiCisKKyNpZm5kZWYJbGludAorc3RhdGljIGNvbnN0IGNoYXIgSURfc2Njc1tdID0gIkAoIylybXQuYwkyLjEzIDk5LzA3LzAyIChDKSBTSyAiIDsKKyNlbmRpZgorCisvKgorICogRlNNIE1hY3JvcworICovCisjZGVmaW5lIEFGTEFHCTB4MTAKKyNkZWZpbmUgR09fU1RBVEUoeCkJKHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1JNVFN0YXRlID0gKHgpfEFGTEFHKQorI2RlZmluZSBBQ1RJT05TX0RPTkUoKQkoc21jLT5taWIubVtNQUMwXS5mZGRpTUFDUk1UU3RhdGUgJj0gfkFGTEFHKQorI2RlZmluZSBBQ1RJT05TKHgpCSh4fEFGTEFHKQorCisjZGVmaW5lIFJNMF9JU09MQVRFRAkwCisjZGVmaW5lIFJNMV9OT05fT1AJMQkJLyogbm90IG9wZXJhdGlvbmFsICovCisjZGVmaW5lIFJNMl9SSU5HX09QCTIJCS8qIHJpbmcgb3BlcmF0aW9uYWwgKi8KKyNkZWZpbmUgUk0zX0RFVEVDVAkzCQkvKiBkZXRlY3QgZHVwbCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgUk00X05PTl9PUF9EVVAJNAkJLyogZHVwbC4gYWRkciBkZXRlY3RlZCAqLworI2RlZmluZSBSTTVfUklOR19PUF9EVVAJNQkJLyogcmluZyBvcGVyLiB3aXRoIGR1cGwuIGFkZHIgKi8KKyNkZWZpbmUgUk02X0RJUkVDVEVECTYJCS8qIHNlbmRpbmcgZGlyZWN0ZWQgYmVhY29ucyAqLworI2RlZmluZSBSTTdfVFJBQ0UJNwkJLyogdHJhY2UgaW5pdGlhdGVkICovCisKKyNpZmRlZglERUJVRworLyoKKyAqIHN5bWJvbGljIHN0YXRlIG5hbWVzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgcm10X3N0YXRlc1tdID0geworCSJSTTBfSVNPTEFURUQiLCJSTTFfTk9OX09QIiwiUk0yX1JJTkdfT1AiLCJSTTNfREVURUNUIiwKKwkiUk00X05PTl9PUF9EVVAiLCJSTTVfUklOR19PUF9EVVAiLCJSTTZfRElSRUNURUQiLAorCSJSTTdfVFJBQ0UiCit9IDsKKworLyoKKyAqIHN5bWJvbGljIGV2ZW50IG5hbWVzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgcm10X2V2ZW50c1tdID0geworCSJOT05FIiwiUk1fUklOR19PUCIsIlJNX1JJTkdfTk9OX09QIiwiUk1fTVlfQkVBQ09OIiwKKwkiUk1fT1RIRVJfQkVBQ09OIiwiUk1fTVlfQ0xBSU0iLCJSTV9UUlRfRVhQIiwiUk1fVkFMSURfQ0xBSU0iLAorCSJSTV9KT0lOIiwiUk1fTE9PUCIsIlJNX0RVUF9BRERSIiwiUk1fRU5BQkxFX0ZMQUciLAorCSJSTV9USU1FT1VUX05PTl9PUCIsIlJNX1RJTUVPVVRfVF9TVFVDSyIsCisJIlJNX1RJTUVPVVRfQU5OT1VOQ0UiLCJSTV9USU1FT1VUX1RfRElSRUNUIiwKKwkiUk1fVElNRU9VVF9EX01BWCIsIlJNX1RJTUVPVVRfUE9MTCIsIlJNX1RYX1NUQVRFX0NIQU5HRSIKK30gOworI2VuZGlmCisKKy8qCisgKiBHbG9iYWxzCisgKiBpbiBzdHJ1Y3Qgc19ybXQKKyAqLworCisKKy8qCisgKiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAqLworc3RhdGljIHZvaWQgcm10X2ZzbShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGNtZCk7CitzdGF0aWMgdm9pZCBzdGFydF9ybXRfdGltZXIwKHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgdmFsdWUsIGludCBldmVudCk7CitzdGF0aWMgdm9pZCBzdGFydF9ybXRfdGltZXIxKHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgdmFsdWUsIGludCBldmVudCk7CitzdGF0aWMgdm9pZCBzdGFydF9ybXRfdGltZXIyKHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgdmFsdWUsIGludCBldmVudCk7CitzdGF0aWMgdm9pZCBzdG9wX3JtdF90aW1lcjAoc3RydWN0IHNfc21jICpzbWMpOworc3RhdGljIHZvaWQgc3RvcF9ybXRfdGltZXIxKHN0cnVjdCBzX3NtYyAqc21jKTsKK3N0YXRpYyB2b2lkIHN0b3Bfcm10X3RpbWVyMihzdHJ1Y3Qgc19zbWMgKnNtYyk7CitzdGF0aWMgdm9pZCBybXRfZHVwX2FjdGlvbnMoc3RydWN0IHNfc21jICpzbWMpOworc3RhdGljIHZvaWQgcm10X3JlaW5zZXJ0X2FjdGlvbnMoc3RydWN0IHNfc21jICpzbWMpOworc3RhdGljIHZvaWQgcm10X2xlYXZlX2FjdGlvbnMoc3RydWN0IHNfc21jICpzbWMpOworc3RhdGljIHZvaWQgcm10X25ld19kdXBfYWN0aW9ucyhzdHJ1Y3Qgc19zbWMgKnNtYyk7CisKKyNpZm5kZWYgU1VQRVJORVRfMworZXh0ZXJuIHZvaWQgcmVzdGFydF90cnRfZm9yX2RiY24oKSA7CisjZW5kaWYgLypTVVBFUk5FVF8zKi8KKworLyoKKwlpbml0IFJNVCBzdGF0ZSBtYWNoaW5lCisJY2xlYXIgYWxsIFJNVCB2YXJzIGFuZCBmbGFncworKi8KK3ZvaWQgcm10X2luaXQoc3RydWN0IHNfc21jICpzbWMpCit7CisJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDUk1UU3RhdGUgPSBBQ1RJT05TKFJNMF9JU09MQVRFRCkgOworCXNtYy0+ci5kdXBfYWRkcl90ZXN0ID0gREFfTk9ORSA7CisJc21jLT5yLmRhX2ZsYWcgPSAwIDsKKwlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNNQV9Vbml0ZGF0YUF2YWlsYWJsZSA9IEZBTFNFIDsKKwlzbWMtPnIuc21fbWFfYXZhaWwgPSBGQUxTRSA7CisJc21jLT5yLmxvb3BfYXZhaWwgPSAwIDsKKwlzbWMtPnIuYm5fZmxhZyA9IDAgOworCXNtYy0+ci5qbV9mbGFnID0gMCA7CisJc21jLT5yLm5vX2ZsYWcgPSBUUlVFIDsKK30KKworLyoKKwlSTVQgc3RhdGUgbWFjaGluZQorCWNhbGxlZCBieSBkaXNwYXRjaGVyCisKKwlkbworCQlkaXNwbGF5IHN0YXRlIGNoYW5nZQorCQlwcm9jZXNzIGV2ZW50CisJdW50aWwgU00gaXMgc3RhYmxlCisqLwordm9pZCBybXQoc3RydWN0IHNfc21jICpzbWMsIGludCBldmVudCkKK3sKKwlpbnQJc3RhdGUgOworCisJZG8geworCQlEQl9STVQoIlJNVCA6IHN0YXRlICVzJXMiLAorCQkJKHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1JNVFN0YXRlICYgQUZMQUcpID8gIkFDVElPTlMgIiA6ICIiLAorCQkJcm10X3N0YXRlc1tzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNSTVRTdGF0ZSAmIH5BRkxBR10pIDsKKwkJREJfUk1UKCIgZXZlbnQgJXNcbiIscm10X2V2ZW50c1tldmVudF0sMCkgOworCQlzdGF0ZSA9IHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1JNVFN0YXRlIDsKKwkJcm10X2ZzbShzbWMsZXZlbnQpIDsKKwkJZXZlbnQgPSAwIDsKKwl9IHdoaWxlIChzdGF0ZSAhPSBzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNSTVRTdGF0ZSkgOworCXJtdF9zdGF0ZV9jaGFuZ2Uoc21jLChpbnQpc21jLT5taWIubVtNQUMwXS5mZGRpTUFDUk1UU3RhdGUpIDsKK30KKworLyoKKwlwcm9jZXNzIFJNVCBldmVudAorKi8KK3N0YXRpYyB2b2lkIHJtdF9mc20oc3RydWN0IHNfc21jICpzbWMsIGludCBjbWQpCit7CisJLyoKKwkgKiBSTTAwLVJNNzAgOiBmcm9tIGFsbCBzdGF0ZXMKKwkgKi8KKwlpZiAoIXNtYy0+ci5ybV9qb2luICYmICFzbWMtPnIucm1fbG9vcCAmJgorCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNSTVRTdGF0ZSAhPSBBQ1RJT05TKFJNMF9JU09MQVRFRCkgJiYKKwkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDUk1UU3RhdGUgIT0gUk0wX0lTT0xBVEVEKSB7CisJCVJTX1NFVChzbWMsUlNfTk9SSU5HT1ApIDsKKwkJcm10X2luZGljYXRpb24oc21jLDApIDsKKwkJR09fU1RBVEUoUk0wX0lTT0xBVEVEKSA7CisJCXJldHVybiA7CisJfQorCisJc3dpdGNoKHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1JNVFN0YXRlKSB7CisJY2FzZSBBQ1RJT05TKFJNMF9JU09MQVRFRCkgOgorCQlzdG9wX3JtdF90aW1lcjAoc21jKSA7CisJCXN0b3Bfcm10X3RpbWVyMShzbWMpIDsKKwkJc3RvcF9ybXRfdGltZXIyKHNtYykgOworCisJCS8qCisJCSAqIERpc2FibGUgTUFDLgorCQkgKi8KKwkJc21fbWFfY29udHJvbChzbWMsTUFfT0ZGTElORSkgOworCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNNQV9Vbml0ZGF0YUF2YWlsYWJsZSA9IEZBTFNFIDsKKwkJc21jLT5yLmxvb3BfYXZhaWwgPSBGQUxTRSA7CisJCXNtYy0+ci5zbV9tYV9hdmFpbCA9IEZBTFNFIDsKKwkJc21jLT5yLm5vX2ZsYWcgPSBUUlVFIDsKKwkJREJfUk1UTigxLCJSTVQgOiBJU09MQVRFRFxuIiwwLDApIDsKKwkJQUNUSU9OU19ET05FKCkgOworCQlicmVhayA7CisJY2FzZSBSTTBfSVNPTEFURUQgOgorCQkvKlJNMDEqLworCQlpZiAoc21jLT5yLnJtX2pvaW4gfHwgc21jLT5yLnJtX2xvb3ApIHsKKwkJCS8qCisJCQkgKiBBY2NvcmRpbmcgdG8gdGhlIHN0YW5kYXJkIHRoZSBNQUMgbXVzdCBiZSByZXNldAorCQkJICogaGVyZS4gVGhlIEZPUk1BQyB3aWxsIGJlIGluaXRpYWxpemVkIGFuZCBDbGFpbQorCQkJICogYW5kIEJlYWNvbiBGcmFtZXMgd2lsbCBiZSB1cGxvYWRlZCB0byB0aGUgTUFDLgorCQkJICogU28gYW55IGNoYW5nZSBvZiBUcmVxIHdpbGwgdGFrZSBlZmZlY3QgTk9XLgorCQkJICovCisJCQlzbV9tYV9jb250cm9sKHNtYyxNQV9SRVNFVCkgOworCQkJR09fU1RBVEUoUk0xX05PTl9PUCkgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIEFDVElPTlMoUk0xX05PTl9PUCkgOgorCQlzdGFydF9ybXRfdGltZXIwKHNtYyxzbWMtPnMucm10X3Rfbm9uX29wLFJNX1RJTUVPVVRfTk9OX09QKSA7CisJCXN0b3Bfcm10X3RpbWVyMShzbWMpIDsKKwkJc3RvcF9ybXRfdGltZXIyKHNtYykgOworCQlzbV9tYV9jb250cm9sKHNtYyxNQV9CRUFDT04pIDsKKwkJREJfUk1UTigxLCJSTVQgOiBSSU5HIERPV05cbiIsMCwwKSA7CisJCVJTX1NFVChzbWMsUlNfTk9SSU5HT1ApIDsKKwkJc21jLT5yLnNtX21hX2F2YWlsID0gRkFMU0UgOworCQlybXRfaW5kaWNhdGlvbihzbWMsMCkgOworCQlBQ1RJT05TX0RPTkUoKSA7CisJCWJyZWFrIDsKKwljYXNlIFJNMV9OT05fT1AgOgorCQkvKlJNMTIqLworCQlpZiAoY21kID09IFJNX1JJTkdfT1ApIHsKKwkJCVJTX1NFVChzbWMsUlNfUklOR09QQ0hBTkdFKSA7CisJCQlHT19TVEFURShSTTJfUklOR19PUCkgOworCQkJYnJlYWsgOworCQl9CisJCS8qUk0xMyovCisJCWVsc2UgaWYgKGNtZCA9PSBSTV9USU1FT1VUX05PTl9PUCkgeworCQkJc21jLT5yLmJuX2ZsYWcgPSBGQUxTRSA7CisJCQlzbWMtPnIubm9fZmxhZyA9IFRSVUUgOworCQkJR09fU1RBVEUoUk0zX0RFVEVDVCkgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIEFDVElPTlMoUk0yX1JJTkdfT1ApIDoKKwkJc3RvcF9ybXRfdGltZXIwKHNtYykgOworCQlzdG9wX3JtdF90aW1lcjEoc21jKSA7CisJCXN0b3Bfcm10X3RpbWVyMihzbWMpIDsKKwkJc21jLT5yLm5vX2ZsYWcgPSBGQUxTRSA7CisJCWlmIChzbWMtPnIucm1fbG9vcCkKKwkJCXNtYy0+ci5sb29wX2F2YWlsID0gVFJVRSA7CisJCWlmIChzbWMtPnIucm1fam9pbikgeworCQkJc21jLT5yLnNtX21hX2F2YWlsID0gVFJVRSA7CisJCQlpZiAoc21jLT5taWIubVtNQUMwXS5mZGRpTUFDTUFfVW5pdGRhdGFFbmFibGUpCisJCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNNQV9Vbml0ZGF0YUF2YWlsYWJsZSA9IFRSVUUgOworCQkJCWVsc2UKKwkJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ01BX1VuaXRkYXRhQXZhaWxhYmxlID0gRkFMU0UgOworCQl9CisJCURCX1JNVE4oMSwiUk1UIDogUklORyBVUFxuIiwwLDApIDsKKwkJUlNfQ0xFQVIoc21jLFJTX05PUklOR09QKSA7CisJCVJTX1NFVChzbWMsUlNfUklOR09QQ0hBTkdFKSA7CisJCXJtdF9pbmRpY2F0aW9uKHNtYywxKSA7CisJCXNtdF9zdGF0X2NvdW50ZXIoc21jLDApIDsKKwkJQUNUSU9OU19ET05FKCkgOworCQlicmVhayA7CisJY2FzZSBSTTJfUklOR19PUCA6CisJCS8qUk0yMSovCisJCWlmIChjbWQgPT0gUk1fUklOR19OT05fT1ApIHsKKwkJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ01BX1VuaXRkYXRhQXZhaWxhYmxlID0gRkFMU0UgOworCQkJc21jLT5yLmxvb3BfYXZhaWwgPSBGQUxTRSA7CisJCQlSU19TRVQoc21jLFJTX1JJTkdPUENIQU5HRSkgOworCQkJR09fU1RBVEUoUk0xX05PTl9PUCkgOworCQkJYnJlYWsgOworCQl9CisJCS8qUk0yMmEqLworCQllbHNlIGlmIChjbWQgPT0gUk1fRU5BQkxFX0ZMQUcpIHsKKwkJCWlmIChzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNNQV9Vbml0ZGF0YUVuYWJsZSkKKwkJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ01BX1VuaXRkYXRhQXZhaWxhYmxlID0gVFJVRSA7CisJCQkJZWxzZQorCQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDTUFfVW5pdGRhdGFBdmFpbGFibGUgPSBGQUxTRSA7CisJCX0KKwkJLypSTTI1Ki8KKwkJZWxzZSBpZiAoc21jLT5yLmR1cF9hZGRyX3Rlc3QgPT0gREFfRkFJTEVEKSB7CisJCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNNQV9Vbml0ZGF0YUF2YWlsYWJsZSA9IEZBTFNFIDsKKwkJCXNtYy0+ci5sb29wX2F2YWlsID0gRkFMU0UgOworCQkJc21jLT5yLmRhX2ZsYWcgPSBUUlVFIDsKKwkJCUdPX1NUQVRFKFJNNV9SSU5HX09QX0RVUCkgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIEFDVElPTlMoUk0zX0RFVEVDVCkgOgorCQlzdGFydF9ybXRfdGltZXIwKHNtYyxzbWMtPnMubWFjX2RfbWF4KjIsUk1fVElNRU9VVF9EX01BWCkgOworCQlzdGFydF9ybXRfdGltZXIxKHNtYyxzbWMtPnMucm10X3Rfc3R1Y2ssUk1fVElNRU9VVF9UX1NUVUNLKSA7CisJCXN0YXJ0X3JtdF90aW1lcjIoc21jLHNtYy0+cy5ybXRfdF9wb2xsLFJNX1RJTUVPVVRfUE9MTCkgOworCQlzbV9tYWNfY2hlY2tfYmVhY29uX2NsYWltKHNtYykgOworCQlEQl9STVROKDEsIlJNVCA6IFJNM19ERVRFQ1RcbiIsMCwwKSA7CisJCUFDVElPTlNfRE9ORSgpIDsKKwkJYnJlYWsgOworCWNhc2UgUk0zX0RFVEVDVCA6CisJCWlmIChjbWQgPT0gUk1fVElNRU9VVF9QT0xMKSB7CisJCQlzdGFydF9ybXRfdGltZXIyKHNtYyxzbWMtPnMucm10X3RfcG9sbCxSTV9USU1FT1VUX1BPTEwpOworCQkJc21fbWFjX2NoZWNrX2JlYWNvbl9jbGFpbShzbWMpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQlpZiAoY21kID09IFJNX1RJTUVPVVRfRF9NQVgpIHsKKwkJCXNtYy0+ci50aW1lcjBfZXhwID0gVFJVRSA7CisJCX0KKwkJLyoKKwkJICpqZCgyMi1GZWItMTk5OSkKKwkJICogV2UgbmVlZCBhIHRpbWUgIj49IDIqbWFjX2RfbWF4IiBzaW5jZSB3ZSBoYWQgZmluaXNoZWQKKwkJICogQ2xhaW0gb3IgQmVhY29uIHN0YXRlLiBTbyB3ZSB3aWxsIHJlc3RhcnQgdGltZXIwIGF0CisJCSAqIGV2ZXJ5IHN0YXRlIGNoYW5nZS4KKwkJICovCisJCWlmIChjbWQgPT0gUk1fVFhfU1RBVEVfQ0hBTkdFKSB7CisJCQlzdGFydF9ybXRfdGltZXIwKHNtYywKKwkJCQkJIHNtYy0+cy5tYWNfZF9tYXgqMiwKKwkJCQkJIFJNX1RJTUVPVVRfRF9NQVgpIDsKKwkJfQorCQkvKlJNMzIqLworCQlpZiAoY21kID09IFJNX1JJTkdfT1ApIHsKKwkJCUdPX1NUQVRFKFJNMl9SSU5HX09QKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypSTTMzYSovCisJCWVsc2UgaWYgKChjbWQgPT0gUk1fTVlfQkVBQ09OIHx8IGNtZCA9PSBSTV9PVEhFUl9CRUFDT04pCisJCQkmJiBzbWMtPnIuYm5fZmxhZykgeworCQkJc21jLT5yLmJuX2ZsYWcgPSBGQUxTRSA7CisJCX0KKwkJLypSTTMzYiovCisJCWVsc2UgaWYgKGNtZCA9PSBSTV9UUlRfRVhQICYmICFzbWMtPnIuYm5fZmxhZykgeworCQkJaW50CXR4IDsKKwkJCS8qCisJCQkgKiBzZXQgYm5fZmxhZyBvbmx5IGlmIGluIHN0YXRlIFQ0IG9yIFQ1OgorCQkJICogb25seSBpZiB3ZSdyZSB0aGUgYmVhY29uZXIgc2hvdWxkIHdlIHN0YXJ0IHRoZQorCQkJICogdHJhY2UgIQorCQkJICovCisJCQlpZiAoKHR4ID0gIHNtX21hY19nZXRfdHhfc3RhdGUoc21jKSkgPT0gNCB8fCB0eCA9PSA1KSB7CisJCQlEQl9STVROKDIsIlJNVCA6IERFVEVDVCAmJiBUUlRfRVhQSVJFRCAmJiBUNC9UNVxuIiwwLDApOworCQkJCXNtYy0+ci5ibl9mbGFnID0gVFJVRSA7CisJCQkJLyoKKwkJCQkgKiBJZiBvbmUgb2YgdGhlIHVwc3RyZWFtIHN0YXRpb25zIGJlYWNvbmVkCisJCQkJICogYW5kIHRoZSBsaW5rIHRvIHRoZSB1cHN0cmVhbSBuZWlnaGJvciBpcworCQkJCSAqIGxvc3Qgd2UgbmVlZCB0byByZXN0YXJ0IHRoZSBzdHVjayB0aW1lciB0bworCQkJCSAqIGNoZWNrIHRoZSAic3R1Y2sgYmVhY29uIiBjb25kaXRpb24uCisJCQkJICovCisJCQkJc3RhcnRfcm10X3RpbWVyMShzbWMsc21jLT5zLnJtdF90X3N0dWNrLAorCQkJCQlSTV9USU1FT1VUX1RfU1RVQ0spIDsKKwkJCX0KKwkJCS8qCisJCQkgKiBXZSBkbyBOT1QgbmVlZCB0byBjbGVhciBzbWMtPnIuYm5fZmxhZyBpbiBjYXNlIG9mCisJCQkgKiBub3QgYmVpbmcgaW4gc3RhdGUgVDQgb3IgVDUsIGJlY2F1c2UgdGhlIGZsYWcKKwkJCSAqIG11c3QgYmUgY2xlYXJlZCBpbiBvcmRlciB0byBnZXQgaW4gdGhpcyBjb25kaXRpb24uCisJCQkgKi8KKworCQkJREJfUk1UTigyLAorCQkJIlJNVCA6IHNtX21hY19nZXRfdHhfc3RhdGUoKSA9ICVkIChibl9mbGFnID0gJWQpXG4iLAorCQkJdHgsc21jLT5yLmJuX2ZsYWcpIDsKKwkJfQorCQkvKlJNMzRhKi8KKwkJZWxzZSBpZiAoY21kID09IFJNX01ZX0NMQUlNICYmIHNtYy0+ci50aW1lcjBfZXhwKSB7CisJCQlybXRfbmV3X2R1cF9hY3Rpb25zKHNtYykgOworCQkJR09fU1RBVEUoUk00X05PTl9PUF9EVVApIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKlJNMzRiKi8KKwkJZWxzZSBpZiAoY21kID09IFJNX01ZX0JFQUNPTiAmJiBzbWMtPnIudGltZXIwX2V4cCkgeworCQkJcm10X25ld19kdXBfYWN0aW9ucyhzbWMpIDsKKwkJCUdPX1NUQVRFKFJNNF9OT05fT1BfRFVQKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypSTTM0YyovCisJCWVsc2UgaWYgKGNtZCA9PSBSTV9WQUxJRF9DTEFJTSkgeworCQkJcm10X25ld19kdXBfYWN0aW9ucyhzbWMpIDsKKwkJCUdPX1NUQVRFKFJNNF9OT05fT1BfRFVQKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypSTTM2Ki8KKwkJZWxzZSBpZiAoY21kID09IFJNX1RJTUVPVVRfVF9TVFVDSyAmJgorCQkJc21jLT5yLnJtX2pvaW4gJiYgc21jLT5yLmJuX2ZsYWcpIHsKKwkJCUdPX1NUQVRFKFJNNl9ESVJFQ1RFRCkgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIEFDVElPTlMoUk00X05PTl9PUF9EVVApIDoKKwkJc3RhcnRfcm10X3RpbWVyMChzbWMsc21jLT5zLnJtdF90X2Fubm91bmNlLFJNX1RJTUVPVVRfQU5OT1VOQ0UpOworCQlzdGFydF9ybXRfdGltZXIxKHNtYyxzbWMtPnMucm10X3Rfc3R1Y2ssUk1fVElNRU9VVF9UX1NUVUNLKSA7CisJCXN0YXJ0X3JtdF90aW1lcjIoc21jLHNtYy0+cy5ybXRfdF9wb2xsLFJNX1RJTUVPVVRfUE9MTCkgOworCQlzbV9tYWNfY2hlY2tfYmVhY29uX2NsYWltKHNtYykgOworCQlEQl9STVROKDEsIlJNVCA6IFJNNF9OT05fT1BfRFVQXG4iLDAsMCkgOworCQlBQ1RJT05TX0RPTkUoKSA7CisJCWJyZWFrIDsKKwljYXNlIFJNNF9OT05fT1BfRFVQIDoKKwkJaWYgKGNtZCA9PSBSTV9USU1FT1VUX1BPTEwpIHsKKwkJCXN0YXJ0X3JtdF90aW1lcjIoc21jLHNtYy0+cy5ybXRfdF9wb2xsLFJNX1RJTUVPVVRfUE9MTCk7CisJCQlzbV9tYWNfY2hlY2tfYmVhY29uX2NsYWltKHNtYykgOworCQkJYnJlYWsgOworCQl9CisJCS8qUk00MSovCisJCWlmICghc21jLT5yLmRhX2ZsYWcpIHsKKwkJCUdPX1NUQVRFKFJNMV9OT05fT1ApIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKlJNNDRhKi8KKwkJZWxzZSBpZiAoKGNtZCA9PSBSTV9NWV9CRUFDT04gfHwgY21kID09IFJNX09USEVSX0JFQUNPTikgJiYKKwkJCXNtYy0+ci5ibl9mbGFnKSB7CisJCQlzbWMtPnIuYm5fZmxhZyA9IEZBTFNFIDsKKwkJfQorCQkvKlJNNDRiKi8KKwkJZWxzZSBpZiAoY21kID09IFJNX1RSVF9FWFAgJiYgIXNtYy0+ci5ibl9mbGFnKSB7CisJCQlpbnQJdHggOworCQkJLyoKKwkJCSAqIHNldCBibl9mbGFnIG9ubHkgaWYgaW4gc3RhdGUgVDQgb3IgVDU6CisJCQkgKiBvbmx5IGlmIHdlJ3JlIHRoZSBiZWFjb25lciBzaG91bGQgd2Ugc3RhcnQgdGhlCisJCQkgKiB0cmFjZSAhCisJCQkgKi8KKwkJCWlmICgodHggPSAgc21fbWFjX2dldF90eF9zdGF0ZShzbWMpKSA9PSA0IHx8IHR4ID09IDUpIHsKKwkJCURCX1JNVE4oMiwiUk1UIDogTk9QRFVQICYmIFRSVF9FWFBJUkVEICYmIFQ0L1Q1XG4iLDAsMCk7CisJCQkJc21jLT5yLmJuX2ZsYWcgPSBUUlVFIDsKKwkJCQkvKgorCQkJCSAqIElmIG9uZSBvZiB0aGUgdXBzdHJlYW0gc3RhdGlvbnMgYmVhY29uZWQKKwkJCQkgKiBhbmQgdGhlIGxpbmsgdG8gdGhlIHVwc3RyZWFtIG5laWdoYm9yIGlzCisJCQkJICogbG9zdCB3ZSBuZWVkIHRvIHJlc3RhcnQgdGhlIHN0dWNrIHRpbWVyIHRvCisJCQkJICogY2hlY2sgdGhlICJzdHVjayBiZWFjb24iIGNvbmRpdGlvbi4KKwkJCQkgKi8KKwkJCQlzdGFydF9ybXRfdGltZXIxKHNtYyxzbWMtPnMucm10X3Rfc3R1Y2ssCisJCQkJCVJNX1RJTUVPVVRfVF9TVFVDSykgOworCQkJfQorCQkJLyoKKwkJCSAqIFdlIGRvIE5PVCBuZWVkIHRvIGNsZWFyIHNtYy0+ci5ibl9mbGFnIGluIGNhc2Ugb2YKKwkJCSAqIG5vdCBiZWluZyBpbiBzdGF0ZSBUNCBvciBUNSwgYmVjYXVzZSB0aGUgZmxhZworCQkJICogbXVzdCBiZSBjbGVhcmVkIGluIG9yZGVyIHRvIGdldCBpbiB0aGlzIGNvbmRpdGlvbi4KKwkJCSAqLworCisJCQlEQl9STVROKDIsCisJCQkiUk1UIDogc21fbWFjX2dldF90eF9zdGF0ZSgpID0gJWQgKGJuX2ZsYWcgPSAlZClcbiIsCisJCQl0eCxzbWMtPnIuYm5fZmxhZykgOworCQl9CisJCS8qUk00NGMqLworCQllbHNlIGlmIChjbWQgPT0gUk1fVElNRU9VVF9BTk5PVU5DRSAmJiAhc21jLT5yLmJuX2ZsYWcpIHsKKwkJCXJtdF9kdXBfYWN0aW9ucyhzbWMpIDsKKwkJfQorCQkvKlJNNDUqLworCQllbHNlIGlmIChjbWQgPT0gUk1fUklOR19PUCkgeworCQkJc21jLT5yLm5vX2ZsYWcgPSBGQUxTRSA7CisJCQlHT19TVEFURShSTTVfUklOR19PUF9EVVApIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKlJNNDYqLworCQllbHNlIGlmIChjbWQgPT0gUk1fVElNRU9VVF9UX1NUVUNLICYmCisJCQlzbWMtPnIucm1fam9pbiAmJiBzbWMtPnIuYm5fZmxhZykgeworCQkJR09fU1RBVEUoUk02X0RJUkVDVEVEKSA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgQUNUSU9OUyhSTTVfUklOR19PUF9EVVApIDoKKwkJc3RvcF9ybXRfdGltZXIwKHNtYykgOworCQlzdG9wX3JtdF90aW1lcjEoc21jKSA7CisJCXN0b3Bfcm10X3RpbWVyMihzbWMpIDsKKwkJREJfUk1UTigxLCJSTVQgOiBSTTVfUklOR19PUF9EVVBcbiIsMCwwKSA7CisJCUFDVElPTlNfRE9ORSgpIDsKKwkJYnJlYWs7CisJY2FzZSBSTTVfUklOR19PUF9EVVAgOgorCQkvKlJNNTIqLworCQlpZiAoc21jLT5yLmR1cF9hZGRyX3Rlc3QgPT0gREFfUEFTU0VEKSB7CisJCQlzbWMtPnIuZGFfZmxhZyA9IEZBTFNFIDsKKwkJCUdPX1NUQVRFKFJNMl9SSU5HX09QKSA7CisJCQlicmVhayA7CisJCX0KKwkJLypSTTU0Ki8KKwkJZWxzZSBpZiAoY21kID09IFJNX1JJTkdfTk9OX09QKSB7CisJCQlzbWMtPnIuam1fZmxhZyA9IEZBTFNFIDsKKwkJCXNtYy0+ci5ibl9mbGFnID0gRkFMU0UgOworCQkJR09fU1RBVEUoUk00X05PTl9PUF9EVVApIDsKKwkJCWJyZWFrIDsKKwkJfQorCQlicmVhayA7CisJY2FzZSBBQ1RJT05TKFJNNl9ESVJFQ1RFRCkgOgorCQlzdGFydF9ybXRfdGltZXIwKHNtYyxzbWMtPnMucm10X3RfZGlyZWN0LFJNX1RJTUVPVVRfVF9ESVJFQ1QpIDsKKwkJc3RvcF9ybXRfdGltZXIxKHNtYykgOworCQlzdGFydF9ybXRfdGltZXIyKHNtYyxzbWMtPnMucm10X3RfcG9sbCxSTV9USU1FT1VUX1BPTEwpIDsKKwkJc21fbWFfY29udHJvbChzbWMsTUFfRElSRUNURUQpIDsKKwkJUlNfU0VUKHNtYyxSU19CRUFDT04pIDsKKwkJREJfUk1UTigxLCJSTVQgOiBSTTZfRElSRUNURURcbiIsMCwwKSA7CisJCUFDVElPTlNfRE9ORSgpIDsKKwkJYnJlYWsgOworCWNhc2UgUk02X0RJUkVDVEVEIDoKKwkJLypSTTYzKi8KKwkJaWYgKGNtZCA9PSBSTV9USU1FT1VUX1BPTEwpIHsKKwkJCXN0YXJ0X3JtdF90aW1lcjIoc21jLHNtYy0+cy5ybXRfdF9wb2xsLFJNX1RJTUVPVVRfUE9MTCk7CisJCQlzbV9tYWNfY2hlY2tfYmVhY29uX2NsYWltKHNtYykgOworI2lmbmRlZiBTVVBFUk5FVF8zCisJCQkvKiBCZWNhdXNlIG9mIHByb2JsZW1zIHdpdGggdGhlIFN1cGVybmV0IElJIGNoaXAgc2V0CisJCQkgKiBzZW5kaW5nIG9mIERpcmVjdGVkIEJlYWNvbiB3aWxsIHN0b3AgYWZ0ZXIgMTY1bXMKKwkJCSAqIHRoZXJlZm9yZSByZXN0YXJ0X3RydF9mb3JfZGJjbihzbWMpIHdpbGwgYmUgY2FsbGVkCisJCQkgKiB0byBwcmV2ZW50IHRoaXMuCisJCQkgKi8KKwkJCXJlc3RhcnRfdHJ0X2Zvcl9kYmNuKHNtYykgOworI2VuZGlmIC8qU1VQRVJORVRfMyovCisJCQlicmVhayA7CisJCX0KKwkJaWYgKChjbWQgPT0gUk1fTVlfQkVBQ09OIHx8IGNtZCA9PSBSTV9PVEhFUl9CRUFDT04pICYmCisJCQkhc21jLT5yLmRhX2ZsYWcpIHsKKwkJCXNtYy0+ci5ibl9mbGFnID0gRkFMU0UgOworCQkJR09fU1RBVEUoUk0zX0RFVEVDVCkgOworCQkJYnJlYWsgOworCQl9CisJCS8qUk02NCovCisJCWVsc2UgaWYgKChjbWQgPT0gUk1fTVlfQkVBQ09OIHx8IGNtZCA9PSBSTV9PVEhFUl9CRUFDT04pICYmCisJCQlzbWMtPnIuZGFfZmxhZykgeworCQkJc21jLT5yLmJuX2ZsYWcgPSBGQUxTRSA7CisJCQlHT19TVEFURShSTTRfTk9OX09QX0RVUCkgOworCQkJYnJlYWsgOworCQl9CisJCS8qUk02NyovCisJCWVsc2UgaWYgKGNtZCA9PSBSTV9USU1FT1VUX1RfRElSRUNUKSB7CisJCQlHT19TVEFURShSTTdfVFJBQ0UpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQlicmVhayA7CisJY2FzZSBBQ1RJT05TKFJNN19UUkFDRSkgOgorCQlzdG9wX3JtdF90aW1lcjAoc21jKSA7CisJCXN0b3Bfcm10X3RpbWVyMShzbWMpIDsKKwkJc3RvcF9ybXRfdGltZXIyKHNtYykgOworCQlzbWMtPmUudHJhY2VfcHJvcCB8PSBFTlRJVFlfQklUKEVOVElUWV9NQUMpIDsKKwkJcXVldWVfZXZlbnQoc21jLEVWRU5UX0VDTSxFQ19UUkFDRV9QUk9QKSA7CisJCURCX1JNVE4oMSwiUk1UIDogUk03X1RSQUNFXG4iLDAsMCkgOworCQlBQ1RJT05TX0RPTkUoKSA7CisJCWJyZWFrIDsKKwljYXNlIFJNN19UUkFDRSA6CisJCWJyZWFrIDsKKwlkZWZhdWx0OgorCQlTTVRfUEFOSUMoc21jLFNNVF9FMDEyMiwgU01UX0UwMTIyX01TRykgOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiAoamQpIFJNVCBkdXBsaWNhdGUgYWRkcmVzcyBhY3Rpb25zCisgKiBsZWF2ZSB0aGUgcmluZyBvciByZWluc2VydCBqdXN0IGFzIGNvbmZpZ3VyZWQKKyAqLworc3RhdGljIHZvaWQgcm10X2R1cF9hY3Rpb25zKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWlmIChzbWMtPnIuam1fZmxhZykgeworCX0KKwllbHNlIHsKKwkJaWYgKHNtYy0+cy5ybXRfZHVwX21hY19iZWhhdmlvcikgeworCQkJU01UX0VSUl9MT0coc21jLFNNVF9FMDEzOCwgU01UX0UwMTM4X01TRykgOworICAgICAgICAgICAgICAgICAgICAgICAgcm10X3JlaW5zZXJ0X2FjdGlvbnMoc21jKSA7CisJCX0KKwkJZWxzZSB7CisJCQlTTVRfRVJSX0xPRyhzbWMsU01UX0UwMTM1LCBTTVRfRTAxMzVfTVNHKSA7CisJCQlybXRfbGVhdmVfYWN0aW9ucyhzbWMpIDsKKwkJfQorCX0KK30KKworLyoKKyAqIFJlY29ubmVjdCB0byB0aGUgUmluZworICovCitzdGF0aWMgdm9pZCBybXRfcmVpbnNlcnRfYWN0aW9ucyhzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlxdWV1ZV9ldmVudChzbWMsRVZFTlRfRUNNLEVDX0RJU0NPTk5FQ1QpIDsKKwlxdWV1ZV9ldmVudChzbWMsRVZFTlRfRUNNLEVDX0NPTk5FQ1QpIDsKK30KKworLyoKKyAqIGR1cGxpY2F0ZSBhZGRyZXNzIGRldGVjdGVkCisgKi8KK3N0YXRpYyB2b2lkIHJtdF9uZXdfZHVwX2FjdGlvbnMoc3RydWN0IHNfc21jICpzbWMpCit7CisJc21jLT5yLmRhX2ZsYWcgPSBUUlVFIDsKKwlzbWMtPnIuYm5fZmxhZyA9IEZBTFNFIDsKKwlzbWMtPnIuam1fZmxhZyA9IEZBTFNFIDsKKwkvKgorCSAqIHdlIGhhdmUgdGhyZWUgb3B0aW9ucyA6IGNoYW5nZSBhZGRyZXNzLCBqYW0gb3IgbGVhdmUKKwkgKiB3ZSBsZWF2ZSB0aGUgcmluZyBhcyBkZWZhdWx0IAorCSAqIE9wdGlvbmFsbHkgaXQncyBwb3NzaWJsZSB0byByZWluc2VydCBhZnRlciBsZWF2aW5nIHRoZSBSaW5nCisJICogYnV0IHRoaXMgd2lsbCBub3QgY29uZm9ybSB3aXRoIFNNVCBTcGVjLgorCSAqLworCWlmIChzbWMtPnMucm10X2R1cF9tYWNfYmVoYXZpb3IpIHsKKwkJU01UX0VSUl9MT0coc21jLFNNVF9FMDEzOCwgU01UX0UwMTM4X01TRykgOworCQlybXRfcmVpbnNlcnRfYWN0aW9ucyhzbWMpIDsKKwl9CisJZWxzZSB7CisJCVNNVF9FUlJfTE9HKHNtYyxTTVRfRTAxMzUsIFNNVF9FMDEzNV9NU0cpIDsKKwkJcm10X2xlYXZlX2FjdGlvbnMoc21jKSA7CisJfQorfQorCisKKy8qCisgKiBsZWF2ZSB0aGUgcmluZworICovCitzdGF0aWMgdm9pZCBybXRfbGVhdmVfYWN0aW9ucyhzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlxdWV1ZV9ldmVudChzbWMsRVZFTlRfRUNNLEVDX0RJU0NPTk5FQ1QpIDsKKwkvKgorCSAqIE5vdGU6IERvIE5PVCB0cnkgYWdhaW4gbGF0ZXIuICh3aXRoIHBsZWFzZSByZWNvbm5lY3QpCisJICogVGhlIHN0YXRpb24gbXVzdCBiZSBsZWZ0IGZyb20gdGhlIHJpbmchCisJICovCit9CisKKy8qCisgKiBTTVQgdGltZXIgaW50ZXJmYWNlCisgKglzdGFydCBSTVQgdGltZXIgMAorICovCitzdGF0aWMgdm9pZCBzdGFydF9ybXRfdGltZXIwKHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgdmFsdWUsIGludCBldmVudCkKK3sKKwlzbWMtPnIudGltZXIwX2V4cCA9IEZBTFNFIDsJCS8qIGNsZWFyIHRpbWVyIGV2ZW50IGZsYWcgKi8KKwlzbXRfdGltZXJfc3RhcnQoc21jLCZzbWMtPnIucm10X3RpbWVyMCx2YWx1ZSxFVl9UT0tFTihFVkVOVF9STVQsZXZlbnQpKTsKK30KKworLyoKKyAqIFNNVCB0aW1lciBpbnRlcmZhY2UKKyAqCXN0YXJ0IFJNVCB0aW1lciAxCisgKi8KK3N0YXRpYyB2b2lkIHN0YXJ0X3JtdF90aW1lcjEoc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyB2YWx1ZSwgaW50IGV2ZW50KQoreworCXNtYy0+ci50aW1lcjFfZXhwID0gRkFMU0UgOwkvKiBjbGVhciB0aW1lciBldmVudCBmbGFnICovCisJc210X3RpbWVyX3N0YXJ0KHNtYywmc21jLT5yLnJtdF90aW1lcjEsdmFsdWUsRVZfVE9LRU4oRVZFTlRfUk1ULGV2ZW50KSk7Cit9CisKKy8qCisgKiBTTVQgdGltZXIgaW50ZXJmYWNlCisgKglzdGFydCBSTVQgdGltZXIgMgorICovCitzdGF0aWMgdm9pZCBzdGFydF9ybXRfdGltZXIyKHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgdmFsdWUsIGludCBldmVudCkKK3sKKwlzbWMtPnIudGltZXIyX2V4cCA9IEZBTFNFIDsJCS8qIGNsZWFyIHRpbWVyIGV2ZW50IGZsYWcgKi8KKwlzbXRfdGltZXJfc3RhcnQoc21jLCZzbWMtPnIucm10X3RpbWVyMix2YWx1ZSxFVl9UT0tFTihFVkVOVF9STVQsZXZlbnQpKTsKK30KKworLyoKKyAqIFNNVCB0aW1lciBpbnRlcmZhY2UKKyAqCXN0b3AgUk1UIHRpbWVyIDAKKyAqLworc3RhdGljIHZvaWQgc3RvcF9ybXRfdGltZXIwKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWlmIChzbWMtPnIucm10X3RpbWVyMC50bV9hY3RpdmUpCisJCXNtdF90aW1lcl9zdG9wKHNtYywmc21jLT5yLnJtdF90aW1lcjApIDsKK30KKworLyoKKyAqIFNNVCB0aW1lciBpbnRlcmZhY2UKKyAqCXN0b3AgUk1UIHRpbWVyIDEKKyAqLworc3RhdGljIHZvaWQgc3RvcF9ybXRfdGltZXIxKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWlmIChzbWMtPnIucm10X3RpbWVyMS50bV9hY3RpdmUpCisJCXNtdF90aW1lcl9zdG9wKHNtYywmc21jLT5yLnJtdF90aW1lcjEpIDsKK30KKworLyoKKyAqIFNNVCB0aW1lciBpbnRlcmZhY2UKKyAqCXN0b3AgUk1UIHRpbWVyIDIKKyAqLworc3RhdGljIHZvaWQgc3RvcF9ybXRfdGltZXIyKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWlmIChzbWMtPnIucm10X3RpbWVyMi50bV9hY3RpdmUpCisJCXNtdF90aW1lcl9zdG9wKHNtYywmc21jLT5yLnJtdF90aW1lcjIpIDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9za2ZkZGkuYyBiL2RyaXZlcnMvbmV0L3NrZnAvc2tmZGRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg4YWFkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvc2tmZGRpLmMKQEAgLTAsMCArMSwyMjkzIEBACisvKgorICogRmlsZSBOYW1lOgorICogICBza2ZkZGkuYworICoKKyAqIENvcHlyaWdodCBJbmZvcm1hdGlvbjoKKyAqICAgQ29weXJpZ2h0IFN5c0tvbm5lY3QgMTk5OCwxOTk5LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICogQWJzdHJhY3Q6CisgKiAgIEEgTGludXggZGV2aWNlIGRyaXZlciBzdXBwb3J0aW5nIHRoZSBTeXNLb25uZWN0IEZEREkgUENJIGNvbnRyb2xsZXIKKyAqICAgZmFtaWxpZS4KKyAqCisgKiBNYWludGFpbmVyczoKKyAqICAgQ0cgICAgQ2hyaXN0b3BoIEdvb3MgKGNnb29zQHN5c2tvbm5lY3QuZGUpCisgKgorICogQ29udHJpYnV0b3JzOgorICogICBETSAgICBEYXZpZCBTLiBNaWxsZXIKKyAqCisgKiBBZGRyZXNzIGFsbCBxdWVzdGlvbiB0bzoKKyAqICAgbGludXhAc3lza29ubmVjdC5kZQorICoKKyAqIFRoZSB0ZWNobmljYWwgbWFudWFsIGZvciB0aGUgYWRhcHRlcnMgaXMgYXZhaWxhYmxlIGZyb20gU3lzS29ubmVjdCdzCisgKiB3ZWIgcGFnZXM6IHd3dy5zeXNrb25uZWN0LmNvbQorICogR290byAiU3VwcG9ydCIgYW5kIHNlYXJjaCBLbm93bGVkZ2UgQmFzZSBmb3IgIm1hbnVhbCIuCisgKgorICogRHJpdmVyIEFyY2hpdGVjdHVyZToKKyAqICAgVGhlIGRyaXZlciBhcmNoaXRlY3R1cmUgaXMgYmFzZWQgb24gdGhlIERFQyBGRERJIGRyaXZlciBieQorICogICBMYXdyZW5jZSBWLiBTdGVmYW5pIGFuZCBzZXZlcmFsIGV0aGVybmV0IGRyaXZlcnMuCisgKiAgIEkgYWxzbyB1c2VkIGFuIGV4aXN0aW5nIFdpbmRvd3MgTlQgbWluaXBvcnQgZHJpdmVyLgorICogICBBbGwgaGFyZHdhcmUgZGVwZW5kZW50IGZ1Y3Rpb25zIGFyZSBoYW5kbGVkIGJ5IHRoZSBTeXNLb25uZWN0CisgKiAgIEhhcmR3YXJlIE1vZHVsZS4KKyAqICAgVGhlIG9ubHkgaGVhZGVyZmlsZXMgdGhhdCBhcmUgZGlyZWN0bHkgcmVsYXRlZCB0byB0aGlzIHNvdXJjZQorICogICBhcmUgc2tmZGRpLmMsIGgvdHlwZXMuaCwgaC9vc2RlZjFzdC5oLCBoL3RhcmdldG9zLmguCisgKiAgIFRoZSBvdGhlcnMgYmVsb25nIHRvIHRoZSBTeXNLb25uZWN0IEZEREkgSGFyZHdhcmUgTW9kdWxlIGFuZAorICogICBzaG91bGQgYmV0dGVyIG5vdCBiZSBjaGFuZ2VkLgorICoKKyAqIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgorICogICAgICAgICAgICAgIERhdGUgICAgICAgICAgICBOYW1lICAgIERlc2NyaXB0aW9uCisgKiAgICAgICAgICAgICAgMDItTWFyLTk4ICAgICAgIENHCUNyZWF0ZWQuCisgKgorICoJCTEwLU1hci05OQlDRwlTdXBwb3J0IGZvciAyLjIueCBhZGRlZC4KKyAqCQkyNS1NYXItOTkJQ0cJQ29ycmVjdGVkIElSUSByb3V0aW5nIGZvciBTTVAgKEFQSUMpCisgKgkJMjYtT2N0LTk5CUNHCUZpeGVkIGNvbXBpbGF0aW9uIGVycm9yIG9uIDIuMi4xMworICoJCTEyLU5vdi05OQlDRwlTb3VyY2UgY29kZSByZWxlYXNlCisgKgkJMjItTm92LTk5CUNHCUluY2x1ZGVkIGluIGtlcm5lbCBzb3VyY2UuCisgKgkJMDctTWF5LTAwCURNCTY0IGJpdCBmaXhlcywgbmV3IGRtYSBpbnRlcmZhY2UKKyAqCQkzMS1KdWwtMDMJREIJQXVkaXQgY29weV8qX3VzZXIgaW4gc2tmcF9pb2N0bAorICoJCQkJCSAgRGFuaWVsZSBCZWxsdWNjaSA8YmVsbHVjZGFAdGlzY2FsaS5pdD4KKyAqCQkwMy1EZWMtMDMJU0gJQ29udmVydCB0byBQQ0kgZGV2aWNlIG1vZGVsCisgKgorICogQ29tcGlsYXRpb24gb3B0aW9ucyAoLUR4eHgpOgorICogICAgICAgICAgICAgIERSSVZFUkRFQlVHICAgICBwcmludCBsb3RzIG9mIG1lc3NhZ2VzIHRvIGxvZyBmaWxlCisgKiAgICAgICAgICAgICAgRFVNUFBBQ0tFVFMgICAgIHByaW50IHJlY2VpdmVkL3RyYW5zbWl0dGVkIHBhY2tldHMgdG8gbG9nZmlsZQorICogCisgKiBUZXN0ZWQgY3B1IGFyY2hpdGVjdHVyZXM6CisgKgktIGkzODYKKyAqCS0gc3BhcmM2NAorICovCisKKy8qIFZlcnNpb24gaW5mb3JtYXRpb24gc3RyaW5nIC0gc2hvdWxkIGJlIHVwZGF0ZWQgcHJpb3IgdG8gKi8KKy8qIGVhY2ggbmV3IHJlbGVhc2UhISEgKi8KKyNkZWZpbmUgVkVSU0lPTgkJIjIuMDciCisKK3N0YXRpYyBjb25zdCBjaGFyICpib290X21zZyA9IAorCSJTeXNLb25uZWN0IEZEREkgUENJIEFkYXB0ZXIgZHJpdmVyIHYiIFZFUlNJT04gIiBmb3JcbiIKKwkiICBTSy01NXh4L1NLLTU4eHggYWRhcHRlcnMgKFNLLU5FVCBGRERJLUZQL1VQL0xQKSI7CisKKy8qIEluY2x1ZGUgZmlsZXMgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZkZGlkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZQkiaC90eXBlcy5oIgorI3VuZGVmIEFERFIJCQkvLyB1bmRvIExpbnV4IGRlZmluaXRpb24KKyNpbmNsdWRlCSJoL3NrZmJpLmgiCisjaW5jbHVkZQkiaC9mZGRpLmgiCisjaW5jbHVkZQkiaC9zbWMuaCIKKyNpbmNsdWRlCSJoL3NtdHN0YXRlLmgiCisKKworLy8gRGVmaW5lIG1vZHVsZS13aWRlIChzdGF0aWMpIHJvdXRpbmVzCitzdGF0aWMgaW50IHNrZnBfZHJpdmVyX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNrZnBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc2tmcF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBza2ZwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2tmcF9jdGxfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2tmcF9jdGxfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc2tmcF9jdGxfc2V0X211bHRpY2FzdF9saXN0X3dvX2xvY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNrZnBfY3RsX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKTsKK3N0YXRpYyBpbnQgc2tmcF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgc2tmcF9zZW5kX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNlbmRfcXVldWVkX3BhY2tldHMoc3RydWN0IHNfc21jICpzbWMpOworc3RhdGljIHZvaWQgQ2hlY2tTb3VyY2VBZGRyZXNzKHVuc2lnbmVkIGNoYXIgKmZyYW1lLCB1bnNpZ25lZCBjaGFyICpod19hZGRyKTsKK3N0YXRpYyB2b2lkIFJlc2V0QWRhcHRlcihzdHJ1Y3Qgc19zbWMgKnNtYyk7CisKKworLy8gRnVuY3Rpb25zIG5lZWRlZCBieSB0aGUgaGFyZHdhcmUgbW9kdWxlCit2b2lkICptYWNfZHJ2X2dldF9zcGFjZShzdHJ1Y3Qgc19zbWMgKnNtYywgdV9pbnQgc2l6ZSk7Cit2b2lkICptYWNfZHJ2X2dldF9kZXNjX21lbShzdHJ1Y3Qgc19zbWMgKnNtYywgdV9pbnQgc2l6ZSk7Cit1bnNpZ25lZCBsb25nIG1hY19kcnZfdmlydDJwaHlzKHN0cnVjdCBzX3NtYyAqc21jLCB2b2lkICp2aXJ0KTsKK3Vuc2lnbmVkIGxvbmcgZG1hX21hc3RlcihzdHJ1Y3Qgc19zbWMgKnNtYywgdm9pZCAqdmlydCwgaW50IGxlbiwgaW50IGZsYWcpOwordm9pZCBkbWFfY29tcGxldGUoc3RydWN0IHNfc21jICpzbWMsIHZvbGF0aWxlIHVuaW9uIHNfZnBfZGVzY3IgKmRlc2NyLAorCQkgIGludCBmbGFnKTsKK3ZvaWQgbWFjX2Rydl90eF9jb21wbGV0ZShzdHJ1Y3Qgc19zbWMgKnNtYywgdm9sYXRpbGUgc3RydWN0IHNfc210X2ZwX3R4ZCAqdHhkKTsKK3ZvaWQgbGxjX3Jlc3RhcnRfdHgoc3RydWN0IHNfc21jICpzbWMpOwordm9pZCBtYWNfZHJ2X3J4X2NvbXBsZXRlKHN0cnVjdCBzX3NtYyAqc21jLCB2b2xhdGlsZSBzdHJ1Y3Qgc19zbXRfZnBfcnhkICpyeGQsCisJCQkgaW50IGZyYWdfY291bnQsIGludCBsZW4pOwordm9pZCBtYWNfZHJ2X3JlcXVldWVfcnhkKHN0cnVjdCBzX3NtYyAqc21jLCB2b2xhdGlsZSBzdHJ1Y3Qgc19zbXRfZnBfcnhkICpyeGQsCisJCQkgaW50IGZyYWdfY291bnQpOwordm9pZCBtYWNfZHJ2X2ZpbGxfcnhkKHN0cnVjdCBzX3NtYyAqc21jKTsKK3ZvaWQgbWFjX2Rydl9jbGVhcl9yeGQoc3RydWN0IHNfc21jICpzbWMsIHZvbGF0aWxlIHN0cnVjdCBzX3NtdF9mcF9yeGQgKnJ4ZCwKKwkJICAgICAgIGludCBmcmFnX2NvdW50KTsKK2ludCBtYWNfZHJ2X3J4X2luaXQoc3RydWN0IHNfc21jICpzbWMsIGludCBsZW4sIGludCBmYywgY2hhciAqbG9va19haGVhZCwKKwkJICAgIGludCBsYV9sZW4pOwordm9pZCBkdW1wX2RhdGEodW5zaWduZWQgY2hhciAqRGF0YSwgaW50IGxlbmd0aCk7CisKKy8vIEV4dGVybmFsIGZ1bmN0aW9ucyBmcm9tIHRoZSBoYXJkd2FyZSBtb2R1bGUKK2V4dGVybiB1X2ludCBtYWNfZHJ2X2NoZWNrX3NwYWNlKHZvaWQpOworZXh0ZXJuIHZvaWQgcmVhZF9hZGRyZXNzKHN0cnVjdCBzX3NtYyAqc21jLCB1X2NoYXIgKiBtYWNfYWRkcik7CitleHRlcm4gdm9pZCBjYXJkX3N0b3Aoc3RydWN0IHNfc21jICpzbWMpOworZXh0ZXJuIGludCBtYWNfZHJ2X2luaXQoc3RydWN0IHNfc21jICpzbWMpOworZXh0ZXJuIHZvaWQgaHdtX3R4X2ZyYWcoc3RydWN0IHNfc21jICpzbWMsIGNoYXIgZmFyICogdmlydCwgdV9sb25nIHBoeXMsCisJCQlpbnQgbGVuLCBpbnQgZnJhbWVfc3RhdHVzKTsKK2V4dGVybiBpbnQgaHdtX3R4X2luaXQoc3RydWN0IHNfc21jICpzbWMsIHVfY2hhciBmYywgaW50IGZyYWdfY291bnQsCisJCSAgICAgICBpbnQgZnJhbWVfbGVuLCBpbnQgZnJhbWVfc3RhdHVzKTsKK2V4dGVybiBpbnQgaW5pdF9zbXQoc3RydWN0IHNfc21jICpzbWMsIHVfY2hhciAqIG1hY19hZGRyKTsKK2V4dGVybiB2b2lkIGZkZGlfaXNyKHN0cnVjdCBzX3NtYyAqc21jKTsKK2V4dGVybiB2b2lkIGh3bV9yeF9mcmFnKHN0cnVjdCBzX3NtYyAqc21jLCBjaGFyIGZhciAqIHZpcnQsIHVfbG9uZyBwaHlzLAorCQkJaW50IGxlbiwgaW50IGZyYW1lX3N0YXR1cyk7CitleHRlcm4gdm9pZCBtYWNfZHJ2X3J4X21vZGUoc3RydWN0IHNfc21jICpzbWMsIGludCBtb2RlKTsKK2V4dGVybiB2b2lkIG1hY19kcnZfY2xlYXJfcnhfcXVldWUoc3RydWN0IHNfc21jICpzbWMpOworZXh0ZXJuIHZvaWQgZW5hYmxlX3R4X2lycShzdHJ1Y3Qgc19zbWMgKnNtYywgdV9zaG9ydCBxdWV1ZSk7CitleHRlcm4gdm9pZCBtYWNfZHJ2X2NsZWFyX3R4ZChzdHJ1Y3Qgc19zbWMgKnNtYyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBza2ZkZGlfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9TSywgUENJX0RFVklDRV9JRF9TS19GUCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IH0JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBza2ZkZGlfcGNpX3RibCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNaXJrbyBMaW5kbmVyIDxtbGluZG5lckBzeXNrb25uZWN0LmRlPiIpOworCisvLyBEZWZpbmUgbW9kdWxlLXdpZGUgKHN0YXRpYykgdmFyaWFibGVzCisKK3N0YXRpYyBpbnQgbnVtX2JvYXJkczsJLyogdG90YWwgbnVtYmVyIG9mIGFkYXB0ZXJzIGNvbmZpZ3VyZWQgKi8KKworI2lmZGVmIERSSVZFUkRFQlVHCisjZGVmaW5lIFBSSU5USyhzLCBhcmdzLi4uKSBwcmludGsocywgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIFBSSU5USyhzLCBhcmdzLi4uKQorI2VuZGlmCQkJCS8vIERSSVZFUkRFQlVHCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PQorICogPSBza2ZwX2luaXRfb25lID0KKyAqID09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIFByb2JlcyBmb3Igc3VwcG9ydGVkIEZEREkgUENJIGNvbnRyb2xsZXJzCisgKiAgCisgKiBSZXR1cm5zOgorICogICBDb25kaXRpb24gY29kZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIHBkZXYgLSBwb2ludGVyIHRvIFBDSSBkZXZpY2UgaW5mb3JtYXRpb24KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBUaGlzIGlzIG5vdyBjYWxsZWQgYnkgUENJIGRyaXZlciByZWdpc3RyYXRpb24gcHJvY2VzcworICogICBmb3IgZWFjaCBib2FyZCBmb3VuZC4KKyAqICAgCisgKiBSZXR1cm4gQ29kZXM6CisgKiAgIDAgICAgICAgICAgIC0gVGhpcyBkZXZpY2UgKGZkZGkwLCBmZGRpMSwgZXRjKSBjb25maWd1cmVkIHN1Y2Nlc3NmdWxseQorICogICAtRU5PREVWIC0gTm8gZGV2aWNlcyBwcmVzZW50LCBvciBubyBTeXNLb25uZWN0IEZEREkgUENJIGRldmljZQorICogICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudCBmb3IgdGhpcyBkZXZpY2UgbmFtZQorICoKKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIERldmljZSBzdHJ1Y3R1cmVzIGZvciBGRERJIGFkYXB0ZXJzIChmZGRpMCwgZmRkaTEsIGV0YykgYXJlCisgKiAgIGluaXRpYWxpemVkIGFuZCB0aGUgYm9hcmQgcmVzb3VyY2VzIGFyZSByZWFkIGFuZCBzdG9yZWQgaW4KKyAqICAgdGhlIGRldmljZSBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyBpbnQgc2tmcF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHNfc21jICpzbWM7CS8qIGJvYXJkIHBvaW50ZXIgKi8KKwl2b2lkIF9faW9tZW0gKm1lbTsKKwlpbnQgZXJyOworCisJUFJJTlRLKEtFUk5fSU5GTyAiZW50ZXJpbmcgc2tmcF9pbml0X29uZVxuIik7CisKKwlpZiAobnVtX2JvYXJkcyA9PSAwKSAKKwkJcHJpbnRrKCIlc1xuIiwgYm9vdF9tc2cpOworCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgInNrZmRkaSIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dDE7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworI2lmZGVmIE1FTV9NQVBQRURfSU8KKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJza2ZwOiByZWdpb24gaXMgbm90IGFuIE1NSU8gcmVzb3VyY2VcbiIpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9vdXQyOworCX0KKworCW1lbSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLCAweDQwMDApOworI2Vsc2UKKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMSkgJiBJT19SRVNPVVJDRV9JTykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJza2ZwOiByZWdpb24gaXMgbm90IFBJTyByZXNvdXJjZVxuIik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX291dDI7CisJfQorCisJbWVtID0gaW9wb3J0X21hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSksIEZQX0lPX0xFTik7CisjZW5kaWYKKwlpZiAoIW1lbSkgeworCQlwcmludGsoS0VSTl9FUlIgInNrZnA6ICBVbmFibGUgdG8gbWFwIHJlZ2lzdGVyLCAiCisJCQkJIkZEREkgYWRhcHRlciB3aWxsIGJlIGRpc2FibGVkLlxuIik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX291dDI7CisJfQorCisJZGV2ID0gYWxsb2NfZmRkaWRldihzaXplb2Yoc3RydWN0IHNfc21jKSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJza2ZwOiBVbmFibGUgdG8gYWxsb2NhdGUgZmRkaSBkZXZpY2UsICIKKwkJCQkiRkRESSBhZGFwdGVyIHdpbGwgYmUgZGlzYWJsZWQuXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0MzsKKwl9CisKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKwlkZXYtPmdldF9zdGF0cyA9ICZza2ZwX2N0bF9nZXRfc3RhdHM7CisJZGV2LT5vcGVuID0gJnNrZnBfb3BlbjsKKwlkZXYtPnN0b3AgPSAmc2tmcF9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZza2ZwX3NlbmRfcGt0OworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNrZnBfY3RsX3NldF9tdWx0aWNhc3RfbGlzdDsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9ICZza2ZwX2N0bF9zZXRfbWFjX2FkZHJlc3M7CisJZGV2LT5kb19pb2N0bCA9ICZza2ZwX2lvY3RsOworCWRldi0+aGVhZGVyX2NhY2hlX3VwZGF0ZSA9IE5VTEw7CS8qIG5vdCBzdXBwb3J0ZWQgKi8KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJLyogSW5pdGlhbGl6ZSBib2FyZCBzdHJ1Y3R1cmUgd2l0aCBidXMtc3BlY2lmaWMgaW5mbyAqLworCXNtYyA9IG5ldGRldl9wcml2KGRldik7CisJc21jLT5vcy5kZXYgPSBkZXY7CisJc21jLT5vcy5idXNfdHlwZSA9IFNLX0JVU19UWVBFX1BDSTsKKwlzbWMtPm9zLnBkZXYgPSAqcGRldjsKKwlzbWMtPm9zLlF1ZXVlU2tiID0gTUFYX1RYX1FVRVVFX0xFTjsKKwlzbWMtPm9zLk1heEZyYW1lU2l6ZSA9IE1BWF9GUkFNRV9TSVpFOworCXNtYy0+b3MuZGV2ID0gZGV2OworCXNtYy0+aHcuc2xvdCA9IC0xOworCXNtYy0+aHcuaW9wID0gbWVtOworCXNtYy0+b3MuUmVzZXRSZXF1ZXN0ZWQgPSBGQUxTRTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZzbWMtPm9zLlNlbmRTa2JRdWV1ZSk7CisKKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKW1lbTsKKworCWVyciA9IHNrZnBfZHJpdmVyX2luaXQoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXQ0OworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0NTsKKworCSsrbnVtX2JvYXJkczsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCWlmICgocGRldi0+c3Vic3lzdGVtX2RldmljZSAmIDB4ZmYwMCkgPT0gMHg1NTAwIHx8CisJICAgIChwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlICYgMHhmZjAwKSA9PSAweDU4MDApIAorCQlwcmludGsoIiVzOiBTeXNLb25uZWN0IEZEREkgUENJIGFkYXB0ZXIiCisJCSAgICAgICAiIGZvdW5kIChTSy0lMDRYKVxuIiwgZGV2LT5uYW1lLAkKKwkJICAgICAgIHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpOworCWVsc2UKKwkJcHJpbnRrKCIlczogRkRESSBQQ0kgYWRhcHRlciBmb3VuZFxuIiwgZGV2LT5uYW1lKTsKKworCXJldHVybiAwOworZXJyX291dDU6CisJaWYgKHNtYy0+b3MuU2hhcmVkTWVtQWRkcikgCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc21jLT5vcy5TaGFyZWRNZW1TaXplLAorCQkJCSAgICBzbWMtPm9zLlNoYXJlZE1lbUFkZHIsIAorCQkJCSAgICBzbWMtPm9zLlNoYXJlZE1lbURNQSk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBNQVhfRlJBTUVfU0laRSwKKwkJCSAgICBzbWMtPm9zLkxvY2FsUnhCdWZmZXIsIHNtYy0+b3MuTG9jYWxSeEJ1ZmZlckRNQSk7CitlcnJfb3V0NDoKKwlmcmVlX25ldGRldihkZXYpOworZXJyX291dDM6CisjaWZkZWYgTUVNX01BUFBFRF9JTworCWlvdW5tYXAobWVtKTsKKyNlbHNlCisJaW9wb3J0X3VubWFwKG1lbSk7CisjZW5kaWYKK2Vycl9vdXQyOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfb3V0MToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIENhbGxlZCBmb3IgZWFjaCBhZGFwdGVyIGJvYXJkIGZyb20gcGNpX3VucmVnaXN0ZXJfZHJpdmVyCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBza2ZwX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKnAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNfc21jICpscCA9IG5ldGRldl9wcml2KHApOworCisJdW5yZWdpc3Rlcl9uZXRkZXYocCk7CisKKwlpZiAobHAtPm9zLlNoYXJlZE1lbUFkZHIpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCgmbHAtPm9zLnBkZXYsCisJCQkJICAgIGxwLT5vcy5TaGFyZWRNZW1TaXplLAorCQkJCSAgICBscC0+b3MuU2hhcmVkTWVtQWRkciwKKwkJCQkgICAgbHAtPm9zLlNoYXJlZE1lbURNQSk7CisJCWxwLT5vcy5TaGFyZWRNZW1BZGRyID0gTlVMTDsKKwl9CisJaWYgKGxwLT5vcy5Mb2NhbFJ4QnVmZmVyKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoJmxwLT5vcy5wZGV2LAorCQkJCSAgICBNQVhfRlJBTUVfU0laRSwKKwkJCQkgICAgbHAtPm9zLkxvY2FsUnhCdWZmZXIsCisJCQkJICAgIGxwLT5vcy5Mb2NhbFJ4QnVmZmVyRE1BKTsKKwkJbHAtPm9zLkxvY2FsUnhCdWZmZXIgPSBOVUxMOworCX0KKyNpZmRlZiBNRU1fTUFQUEVEX0lPCisJaW91bm1hcChscC0+aHcuaW9wKTsKKyNlbHNlCisJaW9wb3J0X3VubWFwKGxwLT5ody5pb3ApOworI2VuZGlmCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlmcmVlX25ldGRldihwKTsKKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PQorICogPSBza2ZwX2RyaXZlcl9pbml0ID0KKyAqID09PT09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIEluaXRpYWxpemVzIHJlbWFpbmluZyBhZGFwdGVyIGJvYXJkIHN0cnVjdHVyZSBpbmZvcm1hdGlvbgorICogICBhbmQgbWFrZXMgc3VyZSBhZGFwdGVyIGlzIGluIGEgc2FmZSBzdGF0ZSBwcmlvciB0byBza2ZwX29wZW4oKS4KKyAqICAKKyAqIFJldHVybnM6CisgKiAgIENvbmRpdGlvbiBjb2RlCisgKiAgICAgICAKKyAqIEFyZ3VtZW50czoKKyAqICAgZGV2IC0gcG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhZGRpdGlvbmFsIHJlc291cmNlcyBzdWNoIGFzIHRoZSBob3N0IG1lbW9yeQorICogICBibG9ja3MgbmVlZGVkIGJ5IHRoZSBhZGFwdGVyLgorICogICBUaGUgYWRhcHRlciBpcyBhbHNvIHJlc2V0LiBUaGUgT1MgbXVzdCBjYWxsIHNrZnBfb3BlbigpIHRvIG9wZW4gCisgKiAgIHRoZSBhZGFwdGVyIGFuZCBicmluZyBpdCBvbi1saW5lLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgIDAgLSBpbml0aWFsaXphdGlvbiBzdWNjZWVkZWQKKyAqICAgLTEgLSBpbml0aWFsaXphdGlvbiBmYWlsZWQKKyAqLworc3RhdGljICBpbnQgc2tmcF9kcml2ZXJfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzX3NtYyAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlza2ZkZGlfcHJpdiAqYnAgPSAmc21jLT5vczsKKwlpbnQgZXJyID0gLUVJTzsKKworCVBSSU5USyhLRVJOX0lORk8gImVudGVyaW5nIHNrZnBfZHJpdmVyX2luaXRcbiIpOworCisJLy8gc2V0IHRoZSBpbyBhZGRyZXNzIGluIHByaXZhdGUgc3RydWN0dXJlcworCWJwLT5iYXNlX2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCS8vIEdldCB0aGUgaW50ZXJydXB0IGxldmVsIGZyb20gdGhlIFBDSSBDb25maWd1cmF0aW9uIFRhYmxlCisJc21jLT5ody5pcnEgPSBkZXYtPmlycTsKKworCXNwaW5fbG9ja19pbml0KCZicC0+RHJpdmVyTG9jayk7CisJCisJLy8gQWxsb2NhdGUgaW52YWxpZCBmcmFtZQorCWJwLT5Mb2NhbFJ4QnVmZmVyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoJmJwLT5wZGV2LCBNQVhfRlJBTUVfU0laRSwgJmJwLT5Mb2NhbFJ4QnVmZmVyRE1BKTsKKwlpZiAoIWJwLT5Mb2NhbFJ4QnVmZmVyKSB7CisJCXByaW50aygiY291bGQgbm90IGFsbG9jYXRlIG1lbSBmb3IgIik7CisJCXByaW50aygiTG9jYWxSeEJ1ZmZlcjogJWQgYnl0ZVxuIiwgTUFYX0ZSQU1FX1NJWkUpOworCQlnb3RvIGZhaWw7CisJfQorCisJLy8gRGV0ZXJtaW5lIHRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSAnc2hhcmVkJyBtZW1vcnkgYXJlYS4KKwlicC0+U2hhcmVkTWVtU2l6ZSA9IG1hY19kcnZfY2hlY2tfc3BhY2UoKTsKKwlQUklOVEsoS0VSTl9JTkZPICJNZW1vcnkgZm9yIEhXTTogJWxkXG4iLCBicC0+U2hhcmVkTWVtU2l6ZSk7CisJaWYgKGJwLT5TaGFyZWRNZW1TaXplID4gMCkgeworCQlicC0+U2hhcmVkTWVtU2l6ZSArPSAxNjsJLy8gZm9yIGRlc2NyaXB0b3IgYWxpZ25tZW50CisKKwkJYnAtPlNoYXJlZE1lbUFkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudCgmYnAtPnBkZXYsCisJCQkJCQkJIGJwLT5TaGFyZWRNZW1TaXplLAorCQkJCQkJCSAmYnAtPlNoYXJlZE1lbURNQSk7CisJCWlmICghYnAtPlNoYXJlZE1lbVNpemUpIHsKKwkJCXByaW50aygiY291bGQgbm90IGFsbG9jYXRlIG1lbSBmb3IgIik7CisJCQlwcmludGsoImhhcmR3YXJlIG1vZHVsZTogJWxkIGJ5dGVcbiIsCisJCQkgICAgICAgYnAtPlNoYXJlZE1lbVNpemUpOworCQkJZ290byBmYWlsOworCQl9CisJCWJwLT5TaGFyZWRNZW1IZWFwID0gMDsJLy8gTm90aGluZyB1c2VkIHlldC4KKworCX0gZWxzZSB7CisJCWJwLT5TaGFyZWRNZW1BZGRyID0gTlVMTDsKKwkJYnAtPlNoYXJlZE1lbUhlYXAgPSAwOworCX0JCQkvLyBTaGFyZWRNZW1TaXplID4gMAorCisJbWVtc2V0KGJwLT5TaGFyZWRNZW1BZGRyLCAwLCBicC0+U2hhcmVkTWVtU2l6ZSk7CisKKwljYXJkX3N0b3Aoc21jKTsJCS8vIFJlc2V0IGFkYXB0ZXIuCisKKwlQUklOVEsoS0VSTl9JTkZPICJtYWNfZHJ2X2luaXQoKS4uXG4iKTsKKwlpZiAobWFjX2Rydl9pbml0KHNtYykgIT0gMCkgeworCQlQUklOVEsoS0VSTl9JTkZPICJtYWNfZHJ2X2luaXQoKSBmYWlsZWQuXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlyZWFkX2FkZHJlc3Moc21jLCBOVUxMKTsKKwlQUklOVEsoS0VSTl9JTkZPICJIVy1BZGRyOiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkgICAgICAgc21jLT5ody5mZGRpX2Nhbm9uX2FkZHIuYVswXSwKKwkgICAgICAgc21jLT5ody5mZGRpX2Nhbm9uX2FkZHIuYVsxXSwKKwkgICAgICAgc21jLT5ody5mZGRpX2Nhbm9uX2FkZHIuYVsyXSwKKwkgICAgICAgc21jLT5ody5mZGRpX2Nhbm9uX2FkZHIuYVszXSwKKwkgICAgICAgc21jLT5ody5mZGRpX2Nhbm9uX2FkZHIuYVs0XSwKKwkgICAgICAgc21jLT5ody5mZGRpX2Nhbm9uX2FkZHIuYVs1XSk7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHNtYy0+aHcuZmRkaV9jYW5vbl9hZGRyLmEsIDYpOworCisJc210X3Jlc2V0X2RlZmF1bHRzKHNtYywgMCk7CisKKwlyZXR1cm4gKDApOworCitmYWlsOgorCWlmIChicC0+U2hhcmVkTWVtQWRkcikgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KCZicC0+cGRldiwKKwkJCQkgICAgYnAtPlNoYXJlZE1lbVNpemUsCisJCQkJICAgIGJwLT5TaGFyZWRNZW1BZGRyLAorCQkJCSAgICBicC0+U2hhcmVkTWVtRE1BKTsKKwkJYnAtPlNoYXJlZE1lbUFkZHIgPSBOVUxMOworCX0KKwlpZiAoYnAtPkxvY2FsUnhCdWZmZXIpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCgmYnAtPnBkZXYsIE1BWF9GUkFNRV9TSVpFLAorCQkJCSAgICBicC0+TG9jYWxSeEJ1ZmZlciwgYnAtPkxvY2FsUnhCdWZmZXJETUEpOworCQlicC0+TG9jYWxSeEJ1ZmZlciA9IE5VTEw7CisJfQorCXJldHVybiBlcnI7Cit9CQkJCS8vIHNrZnBfZHJpdmVyX2luaXQKKworCisvKgorICogPT09PT09PT09PT09PQorICogPSBza2ZwX29wZW4gPQorICogPT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBPcGVucyB0aGUgYWRhcHRlcgorICogIAorICogUmV0dXJuczoKKyAqICAgQ29uZGl0aW9uIGNvZGUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBkZXYgLSBwb2ludGVyIHRvIGRldmljZSBpbmZvcm1hdGlvbgorICoKKyAqIEZ1bmN0aW9uYWwgRGVzY3JpcHRpb246CisgKiAgIFRoaXMgZnVuY3Rpb24gYnJpbmdzIHRoZSBhZGFwdGVyIHRvIGFuIG9wZXJhdGlvbmFsIHN0YXRlLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgMCAgICAgICAgICAgLSBBZGFwdGVyIHdhcyBzdWNjZXNzZnVsbHkgb3BlbmVkCisgKiAgIC1FQUdBSU4gLSBDb3VsZCBub3QgcmVnaXN0ZXIgSVJRCisgKi8KK3N0YXRpYyBpbnQgc2tmcF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNfc21jICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnI7CisKKwlQUklOVEsoS0VSTl9JTkZPICJlbnRlcmluZyBza2ZwX29wZW5cbiIpOworCS8qIFJlZ2lzdGVyIElSUSAtIHN1cHBvcnQgc2hhcmVkIGludGVycnVwdHMgYnkgcGFzc2luZyBkZXZpY2UgcHRyICovCisJZXJyID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICh2b2lkICopIHNrZnBfaW50ZXJydXB0LCBTQV9TSElSUSwKKwkJCSAgZGV2LT5uYW1lLCBkZXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKgorCSAqIFNldCBjdXJyZW50IGFkZHJlc3MgdG8gZmFjdG9yeSBNQUMgYWRkcmVzcworCSAqCisJICogTm90ZTogV2UndmUgYWxyZWFkeSBkb25lIHRoaXMgc3RlcCBpbiBza2ZwX2RyaXZlcl9pbml0LgorCSAqICAgICAgIEhvd2V2ZXIsIGl0J3MgcG9zc2libGUgdGhhdCBhIHVzZXIgaGFzIHNldCBhIG5vZGUKKwkgKiAgICAgICAgICAgICAgIGFkZHJlc3Mgb3ZlcnJpZGUsIHRoZW4gY2xvc2VkIGFuZCByZW9wZW5lZCB0aGUKKwkgKiAgICAgICAgICAgICAgIGFkYXB0ZXIuICBVbmxlc3Mgd2UgcmVzZXQgdGhlIGRldmljZSBhZGRyZXNzIGZpZWxkCisJICogICAgICAgICAgICAgICBub3csIHdlJ2xsIGNvbnRpbnVlIHRvIHVzZSB0aGUgZXhpc3RpbmcgbW9kaWZpZWQKKwkgKiAgICAgICAgICAgICAgIGFkZHJlc3MuCisJICovCisJcmVhZF9hZGRyZXNzKHNtYywgTlVMTCk7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHNtYy0+aHcuZmRkaV9jYW5vbl9hZGRyLmEsIDYpOworCisJaW5pdF9zbXQoc21jLCBOVUxMKTsKKwlzbXRfb25saW5lKHNtYywgMSk7CisJU1RJX0ZCSSgpOworCisJLyogQ2xlYXIgbG9jYWwgbXVsdGljYXN0IGFkZHJlc3MgdGFibGVzICovCisJbWFjX2NsZWFyX211bHRpY2FzdChzbWMpOworCisJLyogRGlzYWJsZSBwcm9taXNjdW91cyBmaWx0ZXIgc2V0dGluZ3MgKi8KKwltYWNfZHJ2X3J4X21vZGUoc21jLCBSWF9ESVNBQkxFX1BST01JU0MpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gKDApOworfQkJCQkvLyBza2ZwX29wZW4KKworCisvKgorICogPT09PT09PT09PT09PT0KKyAqID0gc2tmcF9jbG9zZSA9CisgKiA9PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBDbG9zZXMgdGhlIGRldmljZS9tb2R1bGUuCisgKiAgCisgKiBSZXR1cm5zOgorICogICBDb25kaXRpb24gY29kZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGRldiAtIHBvaW50ZXIgdG8gZGV2aWNlIGluZm9ybWF0aW9uCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyByb3V0aW5lIGNsb3NlcyB0aGUgYWRhcHRlciBhbmQgYnJpbmdzIGl0IHRvIGEgc2FmZSBzdGF0ZS4KKyAqICAgVGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgaXMgZGVyZWdpc3RlcmVkIHdpdGggdGhlIE9TLgorICogICBUaGUgYWRhcHRlciBjYW4gYmUgb3BlbmVkIGFnYWluIHdpdGggYW5vdGhlciBjYWxsIHRvIHNrZnBfb3BlbigpLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgQWx3YXlzIHJldHVybiAwLgorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBObyBmdXJ0aGVyIHJlcXVlc3RzIGZvciB0aGlzIGFkYXB0ZXIgYXJlIG1hZGUgYWZ0ZXIgdGhpcyByb3V0aW5lIGlzCisgKiAgIGNhbGxlZC4gIHNrZnBfb3BlbigpIGNhbiBiZSBjYWxsZWQgdG8gcmVzZXQgYW5kIHJlaW5pdGlhbGl6ZSB0aGUKKyAqICAgYWRhcHRlci4KKyAqLworc3RhdGljIGludCBza2ZwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNfc21jICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworCXNrZmRkaV9wcml2ICpicCA9ICZzbWMtPm9zOworCisJQ0xJX0ZCSSgpOworCXNtdF9yZXNldF9kZWZhdWx0cyhzbWMsIDEpOworCWNhcmRfc3RvcChzbWMpOworCW1hY19kcnZfY2xlYXJfdHhfcXVldWUoc21jKTsKKwltYWNfZHJ2X2NsZWFyX3J4X3F1ZXVlKHNtYyk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJLyogRGVyZWdpc3RlciAoZnJlZSkgSVJRICovCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlza2JfcXVldWVfcHVyZ2UoJmJwLT5TZW5kU2tiUXVldWUpOworCWJwLT5RdWV1ZVNrYiA9IE1BWF9UWF9RVUVVRV9MRU47CisKKwlyZXR1cm4gKDApOworfQkJCQkvLyBza2ZwX2Nsb3NlCisKKworLyoKKyAqID09PT09PT09PT09PT09PT09PQorICogPSBza2ZwX2ludGVycnVwdCA9CisgKiA9PT09PT09PT09PT09PT09PT0KKyAqICAgCisgKiBPdmVydmlldzoKKyAqICAgSW50ZXJydXB0IHByb2Nlc3Npbmcgcm91dGluZQorICogIAorICogUmV0dXJuczoKKyAqICAgTm9uZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGlycSAgICAgICAgLSBpbnRlcnJ1cHQgdmVjdG9yCisgKiAgIGRldl9pZCAgICAgLSBwb2ludGVyIHRvIGRldmljZSBpbmZvcm1hdGlvbgorICogICAgICAgcmVncyAgIC0gcG9pbnRlciB0byByZWdpc3RlcnMgc3RydWN0dXJlCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyByb3V0aW5lIGNhbGxzIHRoZSBpbnRlcnJ1cHQgcHJvY2Vzc2luZyByb3V0aW5lIGZvciB0aGlzIGFkYXB0ZXIuICBJdAorICogICBkaXNhYmxlcyBhbmQgcmVlbmFibGVzIGFkYXB0ZXIgaW50ZXJydXB0cywgYXMgYXBwcm9wcmlhdGUuICBXZSBjYW4gc3VwcG9ydAorICogICBzaGFyZWQgaW50ZXJydXB0cyBzaW5jZSB0aGUgaW5jb21pbmcgZGV2X2lkIHBvaW50ZXIgcHJvdmlkZXMgb3VyIGRldmljZQorICogICBzdHJ1Y3R1cmUgY29udGV4dC4gQWxsIHRoZSByZWFsIHdvcmsgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUgbW9kdWxlLgorICoKKyAqIFJldHVybiBDb2RlczoKKyAqICAgTm9uZQorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBUaGUgaW50ZXJydXB0IGFja25vd2xlZGdlbWVudCBhdCB0aGUgaGFyZHdhcmUgbGV2ZWwgKGVnLiBBQ0tpbmcgdGhlIFBJQworICogICBvbiBJbnRlbC1iYXNlZCBzeXN0ZW1zKSBpcyBkb25lIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIG91dHNpZGUgdGhpcworICogICByb3V0aW5lLgorICoKKyAqICAgICAgIFN5c3RlbSBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkIHRocm91Z2ggdGhpcyBjYWxsLgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgSW50ZXJydXB0cyBhcmUgZGlzYWJsZWQsIHRoZW4gcmVlbmFibGVkIGF0IHRoZSBhZGFwdGVyLgorICovCisKK2lycXJldHVybl90IHNrZnBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7CisJc3RydWN0IHNfc21jICpzbWM7CS8qIHByaXZhdGUgYm9hcmQgc3RydWN0dXJlIHBvaW50ZXIgKi8KKwlza2ZkZGlfcHJpdiAqYnA7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKCIlczogaXJxICVkIGZvciB1bmtub3duIGRldmljZVxuIiwgZGV2LT5uYW1lLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlicCA9ICZzbWMtPm9zOworCisJLy8gSVJRcyBlbmFibGVkIG9yIGRpc2FibGVkID8KKwlpZiAoaW5wZChBRERSKEIwX0lNU0spKSA9PSAwKSB7CisJCS8vIElSUXMgYXJlIGRpc2FibGVkOiBtdXN0IGJlIHNoYXJlZCBpbnRlcnJ1cHQKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKwkvLyBOb3RlOiBBdCB0aGlzIHBvaW50LCBJUlFzIGFyZSBlbmFibGVkLgorCWlmICgoaW5wZChJU1JfQSkgJiBzbWMtPmh3LmlzX2ltYXNrKSA9PSAwKSB7CS8vIElSUT8KKwkJLy8gQWRhcHRlciBkaWQgbm90IGlzc3VlIGFuIElSUTogbXVzdCBiZSBzaGFyZWQgaW50ZXJydXB0CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJQ0xJX0ZCSSgpOwkJLy8gRGlzYWJsZSBJUlFzIGZyb20gb3VyIGFkYXB0ZXIuCisJc3Bpbl9sb2NrKCZicC0+RHJpdmVyTG9jayk7CisKKwkvLyBDYWxsIGludGVycnVwdCBoYW5kbGVyIGluIGhhcmR3YXJlIG1vZHVsZSAoSFdNKS4KKwlmZGRpX2lzcihzbWMpOworCisJaWYgKHNtYy0+b3MuUmVzZXRSZXF1ZXN0ZWQpIHsKKwkJUmVzZXRBZGFwdGVyKHNtYyk7CisJCXNtYy0+b3MuUmVzZXRSZXF1ZXN0ZWQgPSBGQUxTRTsKKwl9CisJc3Bpbl91bmxvY2soJmJwLT5Ecml2ZXJMb2NrKTsKKwlTVElfRkJJKCk7CQkvLyBFbmFibGUgSVJRcyBmcm9tIG91ciBhZGFwdGVyLgorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQkJCQkvLyBza2ZwX2ludGVycnVwdAorCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09CisgKiA9IHNrZnBfY3RsX2dldF9zdGF0cyA9CisgKiA9PT09PT09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIEdldCBzdGF0aXN0aWNzIGZvciBGRERJIGFkYXB0ZXIKKyAqICAKKyAqIFJldHVybnM6CisgKiAgIFBvaW50ZXIgdG8gRkRESSBzdGF0aXN0aWNzIHN0cnVjdHVyZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIGRldiAtIHBvaW50ZXIgdG8gZGV2aWNlIGluZm9ybWF0aW9uCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgR2V0cyBjdXJyZW50IE1JQiBvYmplY3RzIGZyb20gYWRhcHRlciwgdGhlbgorICogICByZXR1cm5zIEZEREkgc3RhdGlzdGljcyBzdHJ1Y3R1cmUgYXMgZGVmaW5lZAorICogICBpbiBpZl9mZGRpLmguCisgKgorICogICBOb3RlOiBTaW5jZSB0aGUgRkRESSBzdGF0aXN0aWNzIHN0cnVjdHVyZSBpcworICogICBzdGlsbCBuZXcgYW5kIHRoZSBkZXZpY2Ugc3RydWN0dXJlIGRvZXNuJ3QKKyAqICAgaGF2ZSBhbiBGRERJLXNwZWNpZmljIGdldCBzdGF0aXN0aWNzIGhhbmRsZXIsCisgKiAgIHdlJ2xsIHJldHVybiB0aGUgRkRESSBzdGF0aXN0aWNzIHN0cnVjdHVyZSBhcworICogICBhIHBvaW50ZXIgdG8gYW4gRXRoZXJuZXQgc3RhdGlzdGljcyBzdHJ1Y3R1cmUuCisgKiAgIFRoYXQgd2F5LCBhdCBsZWFzdCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgc3RhdGlzdGljcworICogICBzdHJ1Y3R1cmUgY2FuIGJlIGRlY29kZWQgcHJvcGVybHkuCisgKiAgIFdlJ2xsIGhhdmUgdG8gcGF5IGF0dGVudGlvbiB0byB0aGlzIHJvdXRpbmUgYXMgdGhlCisgKiAgIGRldmljZSBzdHJ1Y3R1cmUgYmVjb21lcyBtb3JlIG1hdHVyZSBhbmQgTEFOIG1lZGlhCisgKiAgIGluZGVwZW5kZW50LgorICoKKyAqLworc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNrZnBfY3RsX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzX3NtYyAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogRmlsbCB0aGUgYnAtPnN0YXRzIHN0cnVjdHVyZSB3aXRoIGRyaXZlci1tYWludGFpbmVkIGNvdW50ZXJzICovCisKKwlicC0+b3MuTWFjU3RhdC5wb3J0X2JzX2ZsYWdbMF0gPSAweDEyMzQ7CisJYnAtPm9zLk1hY1N0YXQucG9ydF9ic19mbGFnWzFdID0gMHg1Njc4OworLy8gZ29vczogbmVlZCB0byBmaWxsIG91dCBmZGRpIHN0YXRpc3RpYworI2lmIDAKKwkvKiBHZXQgRkRESSBTTVQgTUlCIG9iamVjdHMgKi8KKworLyogRmlsbCB0aGUgYnAtPnN0YXRzIHN0cnVjdHVyZSB3aXRoIHRoZSBTTVQgTUlCIG9iamVjdCB2YWx1ZXMgKi8KKworCW1lbWNweShicC0+c3RhdHMuc210X3N0YXRpb25faWQsICZicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfc3RhdGlvbl9pZCwgc2l6ZW9mKGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9zdGF0aW9uX2lkKSk7CisJYnAtPnN0YXRzLnNtdF9vcF92ZXJzaW9uX2lkID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X29wX3ZlcnNpb25faWQ7CisJYnAtPnN0YXRzLnNtdF9oaV92ZXJzaW9uX2lkID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X2hpX3ZlcnNpb25faWQ7CisJYnAtPnN0YXRzLnNtdF9sb192ZXJzaW9uX2lkID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X2xvX3ZlcnNpb25faWQ7CisJbWVtY3B5KGJwLT5zdGF0cy5zbXRfdXNlcl9kYXRhLCAmYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X3VzZXJfZGF0YSwgc2l6ZW9mKGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF91c2VyX2RhdGEpKTsKKwlicC0+c3RhdHMuc210X21pYl92ZXJzaW9uX2lkID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X21pYl92ZXJzaW9uX2lkOworCWJwLT5zdGF0cy5zbXRfbWFjX2N0cyA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9tYWNfY3Q7CisJYnAtPnN0YXRzLnNtdF9ub25fbWFzdGVyX2N0cyA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9ub25fbWFzdGVyX2N0OworCWJwLT5zdGF0cy5zbXRfbWFzdGVyX2N0cyA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9tYXN0ZXJfY3Q7CisJYnAtPnN0YXRzLnNtdF9hdmFpbGFibGVfcGF0aHMgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfYXZhaWxhYmxlX3BhdGhzOworCWJwLT5zdGF0cy5zbXRfY29uZmlnX2NhcGFiaWxpdGllcyA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9jb25maWdfY2FwYWJpbGl0aWVzOworCWJwLT5zdGF0cy5zbXRfY29uZmlnX3BvbGljeSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9jb25maWdfcG9saWN5OworCWJwLT5zdGF0cy5zbXRfY29ubmVjdGlvbl9wb2xpY3kgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfY29ubmVjdGlvbl9wb2xpY3k7CisJYnAtPnN0YXRzLnNtdF90X25vdGlmeSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF90X25vdGlmeTsKKwlicC0+c3RhdHMuc210X3N0YXRfcnB0X3BvbGljeSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9zdGF0X3JwdF9wb2xpY3k7CisJYnAtPnN0YXRzLnNtdF90cmFjZV9tYXhfZXhwaXJhdGlvbiA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF90cmFjZV9tYXhfZXhwaXJhdGlvbjsKKwlicC0+c3RhdHMuc210X2J5cGFzc19wcmVzZW50ID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X2J5cGFzc19wcmVzZW50OworCWJwLT5zdGF0cy5zbXRfZWNtX3N0YXRlID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X2VjbV9zdGF0ZTsKKwlicC0+c3RhdHMuc210X2NmX3N0YXRlID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQuc210X2NmX3N0YXRlOworCWJwLT5zdGF0cy5zbXRfcmVtb3RlX2Rpc2Nvbm5lY3RfZmxhZyA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9yZW1vdGVfZGlzY29ubmVjdF9mbGFnOworCWJwLT5zdGF0cy5zbXRfc3RhdGlvbl9zdGF0dXMgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfc3RhdGlvbl9zdGF0dXM7CisJYnAtPnN0YXRzLnNtdF9wZWVyX3dyYXBfZmxhZyA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnNtdF9wZWVyX3dyYXBfZmxhZzsKKwlicC0+c3RhdHMuc210X3RpbWVfc3RhbXAgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfbXNnX3RpbWVfc3RhbXAubHM7CisJYnAtPnN0YXRzLnNtdF90cmFuc2l0aW9uX3RpbWVfc3RhbXAgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5zbXRfdHJhbnNpdGlvbl90aW1lX3N0YW1wLmxzOworCWJwLT5zdGF0cy5tYWNfZnJhbWVfc3RhdHVzX2Z1bmN0aW9ucyA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY19mcmFtZV9zdGF0dXNfZnVuY3Rpb25zOworCWJwLT5zdGF0cy5tYWNfdF9tYXhfY2FwYWJpbGl0eSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY190X21heF9jYXBhYmlsaXR5OworCWJwLT5zdGF0cy5tYWNfdHZ4X2NhcGFiaWxpdHkgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfdHZ4X2NhcGFiaWxpdHk7CisJYnAtPnN0YXRzLm1hY19hdmFpbGFibGVfcGF0aHMgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfYXZhaWxhYmxlX3BhdGhzOworCWJwLT5zdGF0cy5tYWNfY3VycmVudF9wYXRoID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX2N1cnJlbnRfcGF0aDsKKwltZW1jcHkoYnAtPnN0YXRzLm1hY191cHN0cmVhbV9uYnIsICZicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfdXBzdHJlYW1fbmJyLCBGRERJX0tfQUxFTik7CisJbWVtY3B5KGJwLT5zdGF0cy5tYWNfZG93bnN0cmVhbV9uYnIsICZicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfZG93bnN0cmVhbV9uYnIsIEZERElfS19BTEVOKTsKKwltZW1jcHkoYnAtPnN0YXRzLm1hY19vbGRfdXBzdHJlYW1fbmJyLCAmYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX29sZF91cHN0cmVhbV9uYnIsIEZERElfS19BTEVOKTsKKwltZW1jcHkoYnAtPnN0YXRzLm1hY19vbGRfZG93bnN0cmVhbV9uYnIsICZicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfb2xkX2Rvd25zdHJlYW1fbmJyLCBGRERJX0tfQUxFTik7CisJYnAtPnN0YXRzLm1hY19kdXBfYWRkcmVzc190ZXN0ID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX2R1cF9hZGRyZXNzX3Rlc3Q7CisJYnAtPnN0YXRzLm1hY19yZXF1ZXN0ZWRfcGF0aHMgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfcmVxdWVzdGVkX3BhdGhzOworCWJwLT5zdGF0cy5tYWNfZG93bnN0cmVhbV9wb3J0X3R5cGUgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfZG93bnN0cmVhbV9wb3J0X3R5cGU7CisJbWVtY3B5KGJwLT5zdGF0cy5tYWNfc210X2FkZHJlc3MsICZicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfc210X2FkZHJlc3MsIEZERElfS19BTEVOKTsKKwlicC0+c3RhdHMubWFjX3RfcmVxID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX3RfcmVxOworCWJwLT5zdGF0cy5tYWNfdF9uZWcgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfdF9uZWc7CisJYnAtPnN0YXRzLm1hY190X21heCA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY190X21heDsKKwlicC0+c3RhdHMubWFjX3R2eF92YWx1ZSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY190dnhfdmFsdWU7CisJYnAtPnN0YXRzLm1hY19mcmFtZV9lcnJvcl90aHJlc2hvbGQgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfZnJhbWVfZXJyb3JfdGhyZXNob2xkOworCWJwLT5zdGF0cy5tYWNfZnJhbWVfZXJyb3JfcmF0aW8gPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfZnJhbWVfZXJyb3JfcmF0aW87CisJYnAtPnN0YXRzLm1hY19ybXRfc3RhdGUgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfcm10X3N0YXRlOworCWJwLT5zdGF0cy5tYWNfZGFfZmxhZyA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY19kYV9mbGFnOworCWJwLT5zdGF0cy5tYWNfdW5hX2RhX2ZsYWcgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfdW5kYV9mbGFnOworCWJwLT5zdGF0cy5tYWNfZnJhbWVfZXJyb3JfZmxhZyA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY19mcmFtZV9lcnJvcl9mbGFnOworCWJwLT5zdGF0cy5tYWNfbWFfdW5pdGRhdGFfYXZhaWxhYmxlID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQubWFjX21hX3VuaXRkYXRhX2F2YWlsYWJsZTsKKwlicC0+c3RhdHMubWFjX2hhcmR3YXJlX3ByZXNlbnQgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5tYWNfaGFyZHdhcmVfcHJlc2VudDsKKwlicC0+c3RhdHMubWFjX21hX3VuaXRkYXRhX2VuYWJsZSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0Lm1hY19tYV91bml0ZGF0YV9lbmFibGU7CisJYnAtPnN0YXRzLnBhdGhfdHZ4X2xvd2VyX2JvdW5kID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucGF0aF90dnhfbG93ZXJfYm91bmQ7CisJYnAtPnN0YXRzLnBhdGhfdF9tYXhfbG93ZXJfYm91bmQgPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wYXRoX3RfbWF4X2xvd2VyX2JvdW5kOworCWJwLT5zdGF0cy5wYXRoX21heF90X3JlcSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBhdGhfbWF4X3RfcmVxOworCW1lbWNweShicC0+c3RhdHMucGF0aF9jb25maWd1cmF0aW9uLCAmYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucGF0aF9jb25maWd1cmF0aW9uLCBzaXplb2YoYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucGF0aF9jb25maWd1cmF0aW9uKSk7CisJYnAtPnN0YXRzLnBvcnRfbXlfdHlwZVswXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbXlfdHlwZVswXTsKKwlicC0+c3RhdHMucG9ydF9teV90eXBlWzFdID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9teV90eXBlWzFdOworCWJwLT5zdGF0cy5wb3J0X25laWdoYm9yX3R5cGVbMF0gPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X25laWdoYm9yX3R5cGVbMF07CisJYnAtPnN0YXRzLnBvcnRfbmVpZ2hib3JfdHlwZVsxXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbmVpZ2hib3JfdHlwZVsxXTsKKwlicC0+c3RhdHMucG9ydF9jb25uZWN0aW9uX3BvbGljaWVzWzBdID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9jb25uZWN0aW9uX3BvbGljaWVzWzBdOworCWJwLT5zdGF0cy5wb3J0X2Nvbm5lY3Rpb25fcG9saWNpZXNbMV0gPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2Nvbm5lY3Rpb25fcG9saWNpZXNbMV07CisJYnAtPnN0YXRzLnBvcnRfbWFjX2luZGljYXRlZFswXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbWFjX2luZGljYXRlZFswXTsKKwlicC0+c3RhdHMucG9ydF9tYWNfaW5kaWNhdGVkWzFdID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9tYWNfaW5kaWNhdGVkWzFdOworCWJwLT5zdGF0cy5wb3J0X2N1cnJlbnRfcGF0aFswXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfY3VycmVudF9wYXRoWzBdOworCWJwLT5zdGF0cy5wb3J0X2N1cnJlbnRfcGF0aFsxXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfY3VycmVudF9wYXRoWzFdOworCW1lbWNweSgmYnAtPnN0YXRzLnBvcnRfcmVxdWVzdGVkX3BhdGhzWzAgKiAzXSwgJmJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfcmVxdWVzdGVkX3BhdGhzWzBdLCAzKTsKKwltZW1jcHkoJmJwLT5zdGF0cy5wb3J0X3JlcXVlc3RlZF9wYXRoc1sxICogM10sICZicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X3JlcXVlc3RlZF9wYXRoc1sxXSwgMyk7CisJYnAtPnN0YXRzLnBvcnRfbWFjX3BsYWNlbWVudFswXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbWFjX3BsYWNlbWVudFswXTsKKwlicC0+c3RhdHMucG9ydF9tYWNfcGxhY2VtZW50WzFdID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9tYWNfcGxhY2VtZW50WzFdOworCWJwLT5zdGF0cy5wb3J0X2F2YWlsYWJsZV9wYXRoc1swXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfYXZhaWxhYmxlX3BhdGhzWzBdOworCWJwLT5zdGF0cy5wb3J0X2F2YWlsYWJsZV9wYXRoc1sxXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfYXZhaWxhYmxlX3BhdGhzWzFdOworCWJwLT5zdGF0cy5wb3J0X3BtZF9jbGFzc1swXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfcG1kX2NsYXNzWzBdOworCWJwLT5zdGF0cy5wb3J0X3BtZF9jbGFzc1sxXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfcG1kX2NsYXNzWzFdOworCWJwLT5zdGF0cy5wb3J0X2Nvbm5lY3Rpb25fY2FwYWJpbGl0aWVzWzBdID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9jb25uZWN0aW9uX2NhcGFiaWxpdGllc1swXTsKKwlicC0+c3RhdHMucG9ydF9jb25uZWN0aW9uX2NhcGFiaWxpdGllc1sxXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfY29ubmVjdGlvbl9jYXBhYmlsaXRpZXNbMV07CisJYnAtPnN0YXRzLnBvcnRfYnNfZmxhZ1swXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfYnNfZmxhZ1swXTsKKwlicC0+c3RhdHMucG9ydF9ic19mbGFnWzFdID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9ic19mbGFnWzFdOworCWJwLT5zdGF0cy5wb3J0X2xlcl9lc3RpbWF0ZVswXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbGVyX2VzdGltYXRlWzBdOworCWJwLT5zdGF0cy5wb3J0X2xlcl9lc3RpbWF0ZVsxXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbGVyX2VzdGltYXRlWzFdOworCWJwLT5zdGF0cy5wb3J0X2xlcl9jdXRvZmZbMF0gPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2xlcl9jdXRvZmZbMF07CisJYnAtPnN0YXRzLnBvcnRfbGVyX2N1dG9mZlsxXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbGVyX2N1dG9mZlsxXTsKKwlicC0+c3RhdHMucG9ydF9sZXJfYWxhcm1bMF0gPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2xlcl9hbGFybVswXTsKKwlicC0+c3RhdHMucG9ydF9sZXJfYWxhcm1bMV0gPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2xlcl9hbGFybVsxXTsKKwlicC0+c3RhdHMucG9ydF9jb25uZWN0X3N0YXRlWzBdID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9jb25uZWN0X3N0YXRlWzBdOworCWJwLT5zdGF0cy5wb3J0X2Nvbm5lY3Rfc3RhdGVbMV0gPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2Nvbm5lY3Rfc3RhdGVbMV07CisJYnAtPnN0YXRzLnBvcnRfcGNtX3N0YXRlWzBdID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9wY21fc3RhdGVbMF07CisJYnAtPnN0YXRzLnBvcnRfcGNtX3N0YXRlWzFdID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9wY21fc3RhdGVbMV07CisJYnAtPnN0YXRzLnBvcnRfcGNfd2l0aGhvbGRbMF0gPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X3BjX3dpdGhob2xkWzBdOworCWJwLT5zdGF0cy5wb3J0X3BjX3dpdGhob2xkWzFdID0gYnAtPmNtZF9yc3BfdmlydC0+c210X21pYl9nZXQucG9ydF9wY193aXRoaG9sZFsxXTsKKwlicC0+c3RhdHMucG9ydF9sZXJfZmxhZ1swXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfbGVyX2ZsYWdbMF07CisJYnAtPnN0YXRzLnBvcnRfbGVyX2ZsYWdbMV0gPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2xlcl9mbGFnWzFdOworCWJwLT5zdGF0cy5wb3J0X2hhcmR3YXJlX3ByZXNlbnRbMF0gPSBicC0+Y21kX3JzcF92aXJ0LT5zbXRfbWliX2dldC5wb3J0X2hhcmR3YXJlX3ByZXNlbnRbMF07CisJYnAtPnN0YXRzLnBvcnRfaGFyZHdhcmVfcHJlc2VudFsxXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPnNtdF9taWJfZ2V0LnBvcnRfaGFyZHdhcmVfcHJlc2VudFsxXTsKKworCisJLyogRmlsbCB0aGUgYnAtPnN0YXRzIHN0cnVjdHVyZSB3aXRoIHRoZSBGRERJIGNvdW50ZXIgdmFsdWVzICovCisKKwlicC0+c3RhdHMubWFjX2ZyYW1lX2N0cyA9IGJwLT5jbWRfcnNwX3ZpcnQtPmNudHJzX2dldC5jbnRycy5mcmFtZV9jbnQubHM7CisJYnAtPnN0YXRzLm1hY19jb3BpZWRfY3RzID0gYnAtPmNtZF9yc3BfdmlydC0+Y250cnNfZ2V0LmNudHJzLmNvcGllZF9jbnQubHM7CisJYnAtPnN0YXRzLm1hY190cmFuc21pdF9jdHMgPSBicC0+Y21kX3JzcF92aXJ0LT5jbnRyc19nZXQuY250cnMudHJhbnNtaXRfY250LmxzOworCWJwLT5zdGF0cy5tYWNfZXJyb3JfY3RzID0gYnAtPmNtZF9yc3BfdmlydC0+Y250cnNfZ2V0LmNudHJzLmVycm9yX2NudC5sczsKKwlicC0+c3RhdHMubWFjX2xvc3RfY3RzID0gYnAtPmNtZF9yc3BfdmlydC0+Y250cnNfZ2V0LmNudHJzLmxvc3RfY250LmxzOworCWJwLT5zdGF0cy5wb3J0X2xjdF9mYWlsX2N0c1swXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPmNudHJzX2dldC5jbnRycy5sY3RfcmVqZWN0c1swXS5sczsKKwlicC0+c3RhdHMucG9ydF9sY3RfZmFpbF9jdHNbMV0gPSBicC0+Y21kX3JzcF92aXJ0LT5jbnRyc19nZXQuY250cnMubGN0X3JlamVjdHNbMV0ubHM7CisJYnAtPnN0YXRzLnBvcnRfbGVtX3JlamVjdF9jdHNbMF0gPSBicC0+Y21kX3JzcF92aXJ0LT5jbnRyc19nZXQuY250cnMubGVtX3JlamVjdHNbMF0ubHM7CisJYnAtPnN0YXRzLnBvcnRfbGVtX3JlamVjdF9jdHNbMV0gPSBicC0+Y21kX3JzcF92aXJ0LT5jbnRyc19nZXQuY250cnMubGVtX3JlamVjdHNbMV0ubHM7CisJYnAtPnN0YXRzLnBvcnRfbGVtX2N0c1swXSA9IGJwLT5jbWRfcnNwX3ZpcnQtPmNudHJzX2dldC5jbnRycy5saW5rX2Vycm9yc1swXS5sczsKKwlicC0+c3RhdHMucG9ydF9sZW1fY3RzWzFdID0gYnAtPmNtZF9yc3BfdmlydC0+Y250cnNfZ2V0LmNudHJzLmxpbmtfZXJyb3JzWzFdLmxzOworCisjZW5kaWYKKwlyZXR1cm4gKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKSAmYnAtPm9zLk1hY1N0YXQpOworfQkJCQkvLyBjdGxfZ2V0X3N0YXQKKworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiA9IHNrZnBfY3RsX3NldF9tdWx0aWNhc3RfbGlzdCA9CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgCisgKiBPdmVydmlldzoKKyAqICAgRW5hYmxlL0Rpc2FibGUgTExDIGZyYW1lIHByb21pc2N1b3VzIG1vZGUgcmVjZXB0aW9uCisgKiAgIG9uIHRoZSBhZGFwdGVyIGFuZC9vciB1cGRhdGUgbXVsdGljYXN0IGFkZHJlc3MgdGFibGUuCisgKiAgCisgKiBSZXR1cm5zOgorICogICBOb25lCisgKiAgICAgICAKKyAqIEFyZ3VtZW50czoKKyAqICAgZGV2IC0gcG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24KKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBUaGlzIGZ1bmN0aW9uIGFjcXVpcmVzIHRoZSBkcml2ZXIgbG9jayBhbmQgb25seSBjYWxscworICogICBza2ZwX2N0bF9zZXRfbXVsdGljYXN0X2xpc3Rfd29fbG9jayB0aGVuLgorICogICBUaGlzIHJvdXRpbmUgZm9sbG93cyBhIGZhaXJseSBzaW1wbGUgYWxnb3JpdGhtIGZvciBzZXR0aW5nIHRoZQorICogICBhZGFwdGVyIGZpbHRlcnMgYW5kIENBTToKKyAqCisgKiAgICAgIGlmIElGRl9QUk9NSVNDIGZsYWcgaXMgc2V0CisgKiAgICAgICAgICAgICAgZW5hYmxlIHByb21pc2N1b3VzIG1vZGUKKyAqICAgICAgZWxzZQorICogICAgICAgICAgICAgIGRpc2FibGUgcHJvbWlzY3VvdXMgbW9kZQorICogICAgICAgICAgICAgIGlmIG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzIDw9IG1heC4gbXVsdGljYXN0IG51bWJlcgorICogICAgICAgICAgICAgICAgICAgICAgYWRkIG1jIGFkZHJlc3NlcyB0byBhZGFwdGVyIHRhYmxlCisgKiAgICAgICAgICAgICAgZWxzZQorICogICAgICAgICAgICAgICAgICAgICAgZW5hYmxlIHByb21pc2N1b3VzIG1vZGUKKyAqICAgICAgICAgICAgICB1cGRhdGUgYWRhcHRlciBmaWx0ZXJzCisgKgorICogQXNzdW1wdGlvbnM6CisgKiAgIE11bHRpY2FzdCBhZGRyZXNzZXMgYXJlIHByZXNlbnRlZCBpbiBjYW5vbmljYWwgKExTQikgZm9ybWF0LgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqICAgT24tYm9hcmQgYWRhcHRlciBmaWx0ZXJzIGFyZSB1cGRhdGVkLgorICovCitzdGF0aWMgdm9pZCBza2ZwX2N0bF9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc19zbWMgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisJc2tmZGRpX3ByaXYgKmJwID0gJnNtYy0+b3M7CisJdW5zaWduZWQgbG9uZyBGbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZicC0+RHJpdmVyTG9jaywgRmxhZ3MpOworCXNrZnBfY3RsX3NldF9tdWx0aWNhc3RfbGlzdF93b19sb2NrKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPkRyaXZlckxvY2ssIEZsYWdzKTsKKwlyZXR1cm47Cit9CQkJCS8vIHNrZnBfY3RsX3NldF9tdWx0aWNhc3RfbGlzdAorCisKKworc3RhdGljIHZvaWQgc2tmcF9jdGxfc2V0X211bHRpY2FzdF9saXN0X3dvX2xvY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc19zbWMgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGRldl9tY19saXN0ICpkbWk7CS8qIHB0ciB0byBtdWx0aWNhc3QgYWRkciBlbnRyeSAqLworCWludCBpOworCisJLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUsIGlmIG5lY2Vzc2FyeSAqLworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJbWFjX2Rydl9yeF9tb2RlKHNtYywgUlhfRU5BQkxFX1BST01JU0MpOworCQlQUklOVEsoS0VSTl9JTkZPICJQUk9NSVNDVU9VUyBNT0RFIEVOQUJMRURcbiIpOworCX0KKwkvKiBFbHNlLCB1cGRhdGUgbXVsdGljYXN0IGFkZHJlc3MgdGFibGUgKi8KKwllbHNlIHsKKwkJbWFjX2Rydl9yeF9tb2RlKHNtYywgUlhfRElTQUJMRV9QUk9NSVNDKTsKKwkJUFJJTlRLKEtFUk5fSU5GTyAiUFJPTUlTQ1VPVVMgTU9ERSBESVNBQkxFRFxuIik7CisKKwkJLy8gUmVzZXQgYWxsIE1DIGFkZHJlc3NlcworCQltYWNfY2xlYXJfbXVsdGljYXN0KHNtYyk7CisJCW1hY19kcnZfcnhfbW9kZShzbWMsIFJYX0RJU0FCTEVfQUxMTVVMVEkpOworCisJCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CisJCQltYWNfZHJ2X3J4X21vZGUoc21jLCBSWF9FTkFCTEVfQUxMTVVMVEkpOworCQkJUFJJTlRLKEtFUk5fSU5GTyAiRU5BQkxFIEFMTCBNQyBBRERSRVNTRVNcbiIpOworCQl9IGVsc2UgaWYgKGRldi0+bWNfY291bnQgPiAwKSB7CisJCQlpZiAoZGV2LT5tY19jb3VudCA8PSBGUE1BWF9NVUxUSUNBU1QpIHsKKwkJCQkvKiB1c2UgZXhhY3QgZmlsdGVyaW5nICovCisKKwkJCQkvLyBwb2ludCB0byBmaXJzdCBtdWx0aWNhc3QgYWRkcgorCQkJCWRtaSA9IGRldi0+bWNfbGlzdDsKKworCQkJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyspIHsKKwkJCQkJbWFjX2FkZF9tdWx0aWNhc3Qoc21jLCAKKwkJCQkJCQkgIChzdHJ1Y3QgZmRkaV9hZGRyICopZG1pLT5kbWlfYWRkciwgCisJCQkJCQkJICAxKTsKKworCQkJCQlQUklOVEsoS0VSTl9JTkZPICJFTkFCTEUgTUMgQUREUkVTUzoiKTsKKwkJCQkJUFJJTlRLKCIgJTAyeCAlMDJ4ICUwMnggIiwKKwkJCQkJICAgICAgIGRtaS0+ZG1pX2FkZHJbMF0sCisJCQkJCSAgICAgICBkbWktPmRtaV9hZGRyWzFdLAorCQkJCQkgICAgICAgZG1pLT5kbWlfYWRkclsyXSk7CisJCQkJCVBSSU5USygiJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkJCSAgICAgICBkbWktPmRtaV9hZGRyWzNdLAorCQkJCQkgICAgICAgZG1pLT5kbWlfYWRkcls0XSwKKwkJCQkJICAgICAgIGRtaS0+ZG1pX2FkZHJbNV0pOworCQkJCQlkbWkgPSBkbWktPm5leHQ7CisJCQkJfQkvLyBmb3IKKworCQkJfSBlbHNlIHsJLy8gbW9yZSBNQyBhZGRyZXNzZXMgdGhhbiBIVyBzdXBwb3J0cworCisJCQkJbWFjX2Rydl9yeF9tb2RlKHNtYywgUlhfRU5BQkxFX0FMTE1VTFRJKTsKKwkJCQlQUklOVEsoS0VSTl9JTkZPICJFTkFCTEUgQUxMIE1DIEFERFJFU1NFU1xuIik7CisJCQl9CisJCX0gZWxzZSB7CS8vIG5vIE1DIGFkZHJlc3NlcworCisJCQlQUklOVEsoS0VSTl9JTkZPICJESVNBQkxFIEFMTCBNQyBBRERSRVNTRVNcbiIpOworCQl9CisKKwkJLyogVXBkYXRlIGFkYXB0ZXIgZmlsdGVycyAqLworCQltYWNfdXBkYXRlX211bHRpY2FzdChzbWMpOworCX0KKwlyZXR1cm47Cit9CQkJCS8vIHNrZnBfY3RsX3NldF9tdWx0aWNhc3RfbGlzdF93b19sb2NrCisKKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogPSBza2ZwX2N0bF9zZXRfbWFjX2FkZHJlc3MgPQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIHNldCBuZXcgbWFjIGFkZHJlc3Mgb24gYWRhcHRlciBhbmQgdXBkYXRlIGRldl9hZGRyIGZpZWxkIGluIGRldmljZSB0YWJsZS4KKyAqICAKKyAqIFJldHVybnM6CisgKiAgIE5vbmUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBkZXYgIC0gcG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24KKyAqICAgYWRkciAtIHBvaW50ZXIgdG8gc29ja2FkZHIgc3RydWN0dXJlIGNvbnRhaW5pbmcgdW5pY2FzdCBhZGRyZXNzIHRvIHNldAorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBUaGUgYWRkcmVzcyBwb2ludGVkIHRvIGJ5IGFkZHItPnNhX2RhdGEgaXMgYSB2YWxpZCB1bmljYXN0CisgKiAgIGFkZHJlc3MgYW5kIGlzIHByZXNlbnRlZCBpbiBjYW5vbmljYWwgKExTQikgZm9ybWF0LgorICovCitzdGF0aWMgaW50IHNrZnBfY3RsX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBzX3NtYyAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnBfc29ja2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopIGFkZHI7CisJc2tmZGRpX3ByaXYgKmJwID0gJnNtYy0+b3M7CisJdW5zaWduZWQgbG9uZyBGbGFnczsKKworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHBfc29ja2FkZHItPnNhX2RhdGEsIEZERElfS19BTEVOKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPkRyaXZlckxvY2ssIEZsYWdzKTsKKwlSZXNldEFkYXB0ZXIoc21jKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZicC0+RHJpdmVyTG9jaywgRmxhZ3MpOworCisJcmV0dXJuICgwKTsJCS8qIGFsd2F5cyByZXR1cm4gemVybyAqLworfQkJCQkvLyBza2ZwX2N0bF9zZXRfbWFjX2FkZHJlc3MKKworCisvKgorICogPT09PT09PT09PT09PT0KKyAqID0gc2tmcF9pb2N0bCA9CisgKiA9PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICoKKyAqIFBlcmZvcm0gSU9DVEwgY2FsbCBmdW5jdGlvbnMgaGVyZS4gU29tZSBhcmUgcHJpdmlsZWdlZCBvcGVyYXRpb25zIGFuZCB0aGUKKyAqIGVmZmVjdGl2ZSB1aWQgaXMgY2hlY2tlZCBpbiB0aG9zZSBjYXNlcy4KKyAqICAKKyAqIFJldHVybnM6CisgKiAgIHN0YXR1cyB2YWx1ZQorICogICAwIC0gc3VjY2VzcworICogICBvdGhlciAtIGZhaWx1cmUKKyAqICAgICAgIAorICogQXJndW1lbnRzOgorICogICBkZXYgIC0gcG9pbnRlciB0byBkZXZpY2UgaW5mb3JtYXRpb24KKyAqICAgcnEgLSBwb2ludGVyIHRvIGlvY3RsIHJlcXVlc3Qgc3RydWN0dXJlCisgKiAgIGNtZCAtID8KKyAqCisgKi8KKworCitzdGF0aWMgaW50IHNrZnBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3Qgc19zbWMgKnNtYyA9IG5ldGRldl9wcml2KGRldik7CisJc2tmZGRpX3ByaXYgKmxwID0gJnNtYy0+b3M7CisJc3RydWN0IHNfc2tmcF9pb2N0bCBpb2M7CisJaW50IHN0YXR1cyA9IDA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmlvYywgcnEtPmlmcl9kYXRhLCBzaXplb2Yoc3RydWN0IHNfc2tmcF9pb2N0bCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAoaW9jLmNtZCkgeworCWNhc2UgU0tGUF9HRVRfU1RBVFM6CS8qIEdldCB0aGUgZHJpdmVyIHN0YXRpc3RpY3MgKi8KKwkJaW9jLmxlbiA9IHNpemVvZihscC0+TWFjU3RhdCk7CisJCXN0YXR1cyA9IGNvcHlfdG9fdXNlcihpb2MuZGF0YSwgc2tmcF9jdGxfZ2V0X3N0YXRzKGRldiksIGlvYy5sZW4pCisJCQkJPyAtRUZBVUxUIDogMDsKKwkJYnJlYWs7CisJY2FzZSBTS0ZQX0NMUl9TVEFUUzoJLyogWmVybyBvdXQgdGhlIGRyaXZlciBzdGF0aXN0aWNzICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJbWVtc2V0KCZscC0+TWFjU3RhdCwgMCwgc2l6ZW9mKGxwLT5NYWNTdGF0KSk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRVBFUk07CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKCJpb2N0bCBmb3IgJXM6IHVua25vdyBjbWQ6ICUwNHhcbiIsIGRldi0+bmFtZSwgaW9jLmNtZCk7CisJCXN0YXR1cyA9IC1FT1BOT1RTVVBQOworCisJfQkJCS8vIHN3aXRjaAorCisJcmV0dXJuIHN0YXR1czsKK30JCQkJLy8gc2tmcF9pb2N0bAorCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT0KKyAqID0gc2tmcF9zZW5kX3BrdCAgICAgPQorICogPT09PT09PT09PT09PT09PT09PT09CisgKiAgIAorICogT3ZlcnZpZXc6CisgKiAgIFF1ZXVlcyBhIHBhY2tldCBmb3IgdHJhbnNtaXNzaW9uIGFuZCB0cnkgdG8gdHJhbnNtaXQgaXQuCisgKiAgCisgKiBSZXR1cm5zOgorICogICBDb25kaXRpb24gY29kZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIHNrYiAtIHBvaW50ZXIgdG8gc2tfYnVmZiB0byBxdWV1ZSBmb3IgdHJhbnNtaXNzaW9uCisgKiAgIGRldiAtIHBvaW50ZXIgdG8gZGV2aWNlIGluZm9ybWF0aW9uCisgKgorICogRnVuY3Rpb25hbCBEZXNjcmlwdGlvbjoKKyAqICAgSGVyZSB3ZSBhc3N1bWUgdGhhdCBhbiBpbmNvbWluZyBza2IgdHJhbnNtaXQgcmVxdWVzdAorICogICBpcyBjb250YWluZWQgaW4gYSBzaW5nbGUgcGh5c2ljYWxseSBjb250aWd1b3VzIGJ1ZmZlcgorICogICBpbiB3aGljaCB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiBwYWNrZXQKKyAqICAgKHNrYi0+ZGF0YSkgY2FuIGJlIGNvbnZlcnRlZCB0byBhIHBoeXNpY2FsIGFkZHJlc3MKKyAqICAgYnkgdXNpbmcgcGNpX21hcF9zaW5nbGUoKS4KKyAqCisgKiAgIFdlIGhhdmUgYW4gaW50ZXJuYWwgcXVldWUgZm9yIHBhY2tldHMgd2UgY2FuIG5vdCBzZW5kIAorICogICBpbW1lZGlhdGVseS4gUGFja2V0cyBpbiB0aGlzIHF1ZXVlIGNhbiBiZSBnaXZlbiB0byB0aGUgCisgKiAgIGFkYXB0ZXIgaWYgdHJhbnNtaXQgYnVmZmVycyBhcmUgZnJlZWQuCisgKgorICogICBXZSBjYW4ndCBmcmVlIHRoZSBza2IgdW50aWwgYWZ0ZXIgaXQncyBiZWVuIERNQSdkCisgKiAgIG91dCBieSB0aGUgYWRhcHRlciwgc28gd2UnbGwga2VlcCBpdCBpbiB0aGUgZHJpdmVyIGFuZAorICogICByZXR1cm4gaXQgaW4gbWFjX2Rydl90eF9jb21wbGV0ZS4KKyAqCisgKiBSZXR1cm4gQ29kZXM6CisgKiAgIDAgLSBkcml2ZXIgaGFzIHF1ZXVlZCBhbmQvb3Igc2VudCBwYWNrZXQKKyAqICAgICAgIDEgLSBjYWxsZXIgc2hvdWxkIHJlcXVldWUgdGhlIHNrX2J1ZmYgZm9yIGxhdGVyIHRyYW5zbWlzc2lvbgorICoKKyAqIEFzc3VtcHRpb25zOgorICogICBUaGUgZW50aXJlIHBhY2tldCBpcyBzdG9yZWQgaW4gb25lIHBoeXNpY2FsbHkKKyAqICAgY29udGlndW91cyBidWZmZXIgd2hpY2ggaXMgbm90IGNhY2hlZCBhbmQgd2hvc2UKKyAqICAgMzItYml0IHBoeXNpY2FsIGFkZHJlc3MgY2FuIGJlIGRldGVybWluZWQuCisgKgorICogICBJdCdzIHZpdGFsIHRoYXQgdGhpcyByb3V0aW5lIGlzIE5PVCByZWVudGVyZWQgZm9yIHRoZQorICogICBzYW1lIGJvYXJkIGFuZCB0aGF0IHRoZSBPUyBpcyBub3QgaW4gYW5vdGhlciBzZWN0aW9uIG9mCisgKiAgIGNvZGUgKGVnLiBza2ZwX2ludGVycnVwdCkgZm9yIHRoZSBzYW1lIGJvYXJkIG9uIGEKKyAqICAgZGlmZmVyZW50IHRocmVhZC4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAgIE5vbmUKKyAqLworc3RhdGljIGludCBza2ZwX3NlbmRfcGt0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNfc21jICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOworCXNrZmRkaV9wcml2ICpicCA9ICZzbWMtPm9zOworCisJUFJJTlRLKEtFUk5fSU5GTyAic2tmcF9zZW5kX3BrdFxuIik7CisKKwkvKgorCSAqIFZlcmlmeSB0aGF0IGluY29taW5nIHRyYW5zbWl0IHJlcXVlc3QgaXMgT0sKKwkgKgorCSAqIE5vdGU6IFRoZSBwYWNrZXQgc2l6ZSBjaGVjayBpcyBjb25zaXN0ZW50IHdpdGggb3RoZXIKKwkgKiAgICAgICAgICAgICAgIExpbnV4IGRldmljZSBkcml2ZXJzLCBhbHRob3VnaCB0aGUgY29ycmVjdCBwYWNrZXQKKwkgKiAgICAgICAgICAgICAgIHNpemUgc2hvdWxkIGJlIHZlcmlmaWVkIGJlZm9yZSBjYWxsaW5nIHRoZQorCSAqICAgICAgICAgICAgICAgdHJhbnNtaXQgcm91dGluZS4KKwkgKi8KKworCWlmICghKHNrYi0+bGVuID49IEZERElfS19MTENfWkxFTiAmJiBza2ItPmxlbiA8PSBGRERJX0tfTExDX0xFTikpIHsKKwkJYnAtPk1hY1N0YXQuZ2VuLnR4X2Vycm9ycysrOwkvKiBidW1wIGVycm9yIGNvdW50ZXIgKi8KKwkJLy8gZGVxdWV1ZSBwYWNrZXRzIGZyb20geG10IHF1ZXVlIGFuZCBzZW5kIHRoZW0KKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gKDApOwkvKiByZXR1cm4gInN1Y2Nlc3MiICovCisJfQorCWlmIChicC0+UXVldWVTa2IgPT0gMCkgewkvLyByZXR1cm4gd2l0aCB0YnVzeSBzZXQ6IHF1ZXVlIGZ1bGwKKworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXJldHVybiAxOworCX0KKwlicC0+UXVldWVTa2ItLTsKKwlza2JfcXVldWVfdGFpbCgmYnAtPlNlbmRTa2JRdWV1ZSwgc2tiKTsKKwlzZW5kX3F1ZXVlZF9wYWNrZXRzKG5ldGRldl9wcml2KGRldikpOworCWlmIChicC0+UXVldWVTa2IgPT0gMCkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJfQorCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXJldHVybiAwOworCit9CQkJCS8vIHNrZnBfc2VuZF9wa3QKKworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT0KKyAqID0gc2VuZF9xdWV1ZWRfcGFja2V0cyA9CisgKiA9PT09PT09PT09PT09PT09PT09PT09PQorICogICAKKyAqIE92ZXJ2aWV3OgorICogICBTZW5kIHBhY2tldHMgZnJvbSB0aGUgZHJpdmVyIHF1ZXVlIGFzIGxvbmcgYXMgdGhlcmUgYXJlIHNvbWUgYW5kCisgKiAgIHRyYW5zbWl0IHJlc291cmNlcyBhcmUgYXZhaWxhYmxlLgorICogIAorICogUmV0dXJuczoKKyAqICAgTm9uZQorICogICAgICAgCisgKiBBcmd1bWVudHM6CisgKiAgIHNtYyAtIHBvaW50ZXIgdG8gc21jIChhZGFwdGVyKSBzdHJ1Y3R1cmUKKyAqCisgKiBGdW5jdGlvbmFsIERlc2NyaXB0aW9uOgorICogICBUYWtlIGEgcGFja2V0IGZyb20gcXVldWUgaWYgdGhlcmUgaXMgYW55LiBJZiBub3QsIHRoZW4gd2UgYXJlIGRvbmUuCisgKiAgIENoZWNrIGlmIHRoZXJlIGFyZSByZXNvdXJjZXMgdG8gc2VuZCB0aGUgcGFja2V0LiBJZiBub3QsIHJlcXVldWUgaXQKKyAqICAgYW5kIGV4aXQuIAorICogICBTZXQgcGFja2V0IGRlc2NyaXB0b3IgZmxhZ3MgYW5kIGdpdmUgcGFja2V0IHRvIGFkYXB0ZXIuCisgKiAgIENoZWNrIGlmIGFueSBzZW5kIHJlc291cmNlcyBjYW4gYmUgZnJlZWQgKHdlIGRvIG5vdCB1c2UgdGhlCisgKiAgIHRyYW5zbWl0IGNvbXBsZXRlIGludGVycnVwdCkuCisgKi8KK3N0YXRpYyB2b2lkIHNlbmRfcXVldWVkX3BhY2tldHMoc3RydWN0IHNfc21jICpzbWMpCit7CisJc2tmZGRpX3ByaXYgKmJwID0gJnNtYy0+b3M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyIGZjOworCWludCBxdWV1ZTsKKwlzdHJ1Y3Qgc19zbXRfZnBfdHhkICp0eGQ7CS8vIEN1cnJlbnQgVHhELgorCWRtYV9hZGRyX3QgZG1hX2FkZHJlc3M7CisJdW5zaWduZWQgbG9uZyBGbGFnczsKKworCWludCBmcmFtZV9zdGF0dXM7CS8vIEhXTSB0eCBmcmFtZSBzdGF0dXMuCisKKwlQUklOVEsoS0VSTl9JTkZPICJzZW5kIHF1ZXVlZCBwYWNrZXRzXG4iKTsKKwlmb3IgKDs7KSB7CisJCS8vIHNlbmQgZmlyc3QgYnVmZmVyIGZyb20gcXVldWUKKwkJc2tiID0gc2tiX2RlcXVldWUoJmJwLT5TZW5kU2tiUXVldWUpOworCisJCWlmICghc2tiKSB7CisJCQlQUklOVEsoS0VSTl9JTkZPICJxdWV1ZSBlbXB0eVxuIik7CisJCQlyZXR1cm47CisJCX0JCS8vIHF1ZXVlIGVtcHR5ICEKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYnAtPkRyaXZlckxvY2ssIEZsYWdzKTsKKwkJZmMgPSBza2ItPmRhdGFbMF07CisJCXF1ZXVlID0gKGZjICYgRkNfU1lOQ19CSVQpID8gUVVFVUVfUyA6IFFVRVVFX0EwOworI2lmZGVmIEVTUworCQkvLyBDaGVjayBpZiB0aGUgZnJhbWUgbWF5L211c3QgYmUgc2VudCBhcyBhIHN5bmNocm9ub3VzIGZyYW1lLgorCisJCWlmICgoZmMgJiB+KEZDX1NZTkNfQklUIHwgRkNfTExDX1BSSU9SKSkgPT0gRkNfQVNZTkNfTExDKSB7CisJCQkvLyBJdCdzIGFuIExMQyBmcmFtZS4KKwkJCWlmICghc21jLT5lc3Muc3luY19id19hdmFpbGFibGUpCisJCQkJZmMgJj0gfkZDX1NZTkNfQklUOyAvLyBObyBiYW5kd2lkdGggYXZhaWxhYmxlLgorCisJCQllbHNlIHsJLy8gQmFuZHdpZHRoIGlzIGF2YWlsYWJsZS4KKworCQkJCWlmIChzbWMtPm1pYi5mZGRpRVNTU3luY2hUeE1vZGUpIHsKKwkJCQkJLy8gU2VuZCBhcyBzeW5jLiBmcmFtZS4KKwkJCQkJZmMgfD0gRkNfU1lOQ19CSVQ7CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYJCQkJLy8gRVNTCisJCWZyYW1lX3N0YXR1cyA9IGh3bV90eF9pbml0KHNtYywgZmMsIDEsIHNrYi0+bGVuLCBxdWV1ZSk7CisKKwkJaWYgKChmcmFtZV9zdGF0dXMgJiAoTE9DX1RYIHwgTEFOX1RYKSkgPT0gMCkgeworCQkJLy8gVW5hYmxlIHRvIHNlbmQgdGhlIGZyYW1lLgorCisJCQlpZiAoKGZyYW1lX3N0YXR1cyAmIFJJTkdfRE9XTikgIT0gMCkgeworCQkJCS8vIFJpbmcgaXMgZG93bi4KKwkJCQlQUklOVEsoIlR4IGF0dGVtcHQgd2hpbGUgcmluZyBkb3duLlxuIik7CisJCQl9IGVsc2UgaWYgKChmcmFtZV9zdGF0dXMgJiBPVVRfT0ZfVFhEKSAhPSAwKSB7CisJCQkJUFJJTlRLKCIlczogb3V0IG9mIFRYRHMuXG4iLCBicC0+ZGV2LT5uYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJUFJJTlRLKCIlczogb3V0IG9mIHRyYW5zbWl0IHJlc291cmNlcyIsCisJCQkJCWJwLT5kZXYtPm5hbWUpOworCQkJfQorCisJCQkvLyBOb3RlOiBXZSB3aWxsIHJldHJ5IHRoZSBvcGVyYXRpb24gYXMgc29vbiBhcworCQkJLy8gdHJhbnNtaXQgcmVzb3VyY2VzIGJlY29tZSBhdmFpbGFibGUuCisJCQlza2JfcXVldWVfaGVhZCgmYnAtPlNlbmRTa2JRdWV1ZSwgc2tiKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5Ecml2ZXJMb2NrLCBGbGFncyk7CisJCQlyZXR1cm47CS8vIFBhY2tldCBoYXMgYmVlbiBxdWV1ZWQuCisKKwkJfQkJLy8gaWYgKHVuYWJsZSB0byBzZW5kIGZyYW1lKQorCisJCWJwLT5RdWV1ZVNrYisrOwkvLyBvbmUgcGFja2V0IGxlc3MgaW4gbG9jYWwgcXVldWUKKworCQkvLyBzb3VyY2UgYWRkcmVzcyBpbiBwYWNrZXQgPworCQlDaGVja1NvdXJjZUFkZHJlc3Moc2tiLT5kYXRhLCBzbWMtPmh3LmZkZGlfY2Fub25fYWRkci5hKTsKKworCQl0eGQgPSAoc3RydWN0IHNfc210X2ZwX3R4ZCAqKSBIV01fR0VUX0NVUlJfVFhEKHNtYywgcXVldWUpOworCisJCWRtYV9hZGRyZXNzID0gcGNpX21hcF9zaW5nbGUoJmJwLT5wZGV2LCBza2ItPmRhdGEsCisJCQkJCSAgICAgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlpZiAoZnJhbWVfc3RhdHVzICYgTEFOX1RYKSB7CisJCQl0eGQtPnR4ZF9vcy5za2IgPSBza2I7CQkJLy8gc2F2ZSBza2IKKwkJCXR4ZC0+dHhkX29zLmRtYV9hZGRyID0gZG1hX2FkZHJlc3M7CS8vIHNhdmUgZG1hIG1hcHBpbmcKKwkJfQorCQlod21fdHhfZnJhZyhzbWMsIHNrYi0+ZGF0YSwgZG1hX2FkZHJlc3MsIHNrYi0+bGVuLAorICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX3N0YXR1cyB8IEZJUlNUX0ZSQUcgfCBMQVNUX0ZSQUcgfCBFTl9JUlFfRU9GKTsKKworCQlpZiAoIShmcmFtZV9zdGF0dXMgJiBMQU5fVFgpKSB7CQkvLyBsb2NhbCBvbmx5IGZyYW1lCisJCQlwY2lfdW5tYXBfc2luZ2xlKCZicC0+cGRldiwgZG1hX2FkZHJlc3MsCisJCQkJCSBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJwLT5Ecml2ZXJMb2NrLCBGbGFncyk7CisJfQkJCS8vIGZvcgorCisJcmV0dXJuOwkJCS8vIG5ldmVyIHJlYWNoZWQKKworfQkJCQkvLyBzZW5kX3F1ZXVlZF9wYWNrZXRzCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBDaGVja1NvdXJjZUFkZHJlc3MKKyAqCisgKiBWZXJpZnkgaWYgdGhlIHNvdXJjZSBhZGRyZXNzIGlzIHNldC4gSW5zZXJ0IGl0IGlmIG5lY2Vzc2FyeS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBDaGVja1NvdXJjZUFkZHJlc3ModW5zaWduZWQgY2hhciAqZnJhbWUsIHVuc2lnbmVkIGNoYXIgKmh3X2FkZHIpCit7CisJdW5zaWduZWQgY2hhciBTUkJpdDsKKworCWlmICgoKCh1bnNpZ25lZCBsb25nKSBmcmFtZVsxICsgNl0pICYgfjB4MDEpICE9IDApIC8vIHNvdXJjZSByb3V0aW5nIGJpdAorCisJCXJldHVybjsKKwlpZiAoKHVuc2lnbmVkIHNob3J0KSBmcmFtZVsxICsgMTBdICE9IDApCisJCXJldHVybjsKKwlTUkJpdCA9IGZyYW1lWzEgKyA2XSAmIDB4MDE7CisJbWVtY3B5KCZmcmFtZVsxICsgNl0sIGh3X2FkZHIsIDYpOworCWZyYW1lWzhdIHw9IFNSQml0OworfQkJCQkvLyBDaGVja1NvdXJjZUFkZHJlc3MKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJUmVzZXRBZGFwdGVyCisgKgorICoJUmVzZXQgdGhlIGFkYXB0ZXIgYW5kIGJyaW5nIGl0IGJhY2sgdG8gb3BlcmF0aW9uYWwgbW9kZS4KKyAqIEFyZ3MKKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIGNvbnRleHQgc3RydWN0LgorICogT3V0CisgKglOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBSZXNldEFkYXB0ZXIoc3RydWN0IHNfc21jICpzbWMpCit7CisKKwlQUklOVEsoS0VSTl9JTkZPICJbZmRkaTogUmVzZXRBZGFwdGVyXVxuIik7CisKKwkvLyBTdG9wIHRoZSBhZGFwdGVyLgorCisJY2FyZF9zdG9wKHNtYyk7CQkvLyBTdG9wIGFsbCBhY3Rpdml0eS4KKworCS8vIENsZWFyIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBkZXNjcmlwdG9yIHF1ZXVlcy4KKwltYWNfZHJ2X2NsZWFyX3R4X3F1ZXVlKHNtYyk7CisJbWFjX2Rydl9jbGVhcl9yeF9xdWV1ZShzbWMpOworCisJLy8gUmVzdGFydCB0aGUgYWRhcHRlci4KKworCXNtdF9yZXNldF9kZWZhdWx0cyhzbWMsIDEpOwkvLyBJbml0aWFsaXplIHRoZSBTTVQgbW9kdWxlLgorCisJaW5pdF9zbXQoc21jLCAoc21jLT5vcy5kZXYpLT5kZXZfYWRkcik7CS8vIEluaXRpYWxpemUgdGhlIGhhcmR3YXJlLgorCisJc210X29ubGluZShzbWMsIDEpOwkvLyBJbnNlcnQgaW50byB0aGUgcmluZyBhZ2Fpbi4KKwlTVElfRkJJKCk7CisKKwkvLyBSZXN0b3JlIG9yaWdpbmFsIHJlY2VpdmUgbW9kZSAobXVsdGljYXN0cywgcHJvbWlzY3VvdXMsIGV0Yy4pLgorCXNrZnBfY3RsX3NldF9tdWx0aWNhc3RfbGlzdF93b19sb2NrKHNtYy0+b3MuZGV2KTsKK30JCQkJLy8gUmVzZXRBZGFwdGVyCisKKworLy8tLS0tLS0tLS0tLS0tLS0gZnVuY3Rpb25zIGNhbGxlZCBieSBoYXJkd2FyZSBtb2R1bGUgLS0tLS0tLS0tLS0tLS0tLQorCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJbGxjX3Jlc3RhcnRfdHgKKyAqCisgKglUaGUgaGFyZHdhcmUgZHJpdmVyIGNhbGxzIHRoaXMgcm91dGluZSB3aGVuIHRoZSB0cmFuc21pdCBjb21wbGV0ZQorICoJaW50ZXJydXB0IGJpdHMgKGVuZCBvZiBmcmFtZSkgZm9yIHRoZSBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMKKyAqCXF1ZXVlIGlzIHNldC4KKyAqCisgKiBOT1RFIFRoZSBoYXJkd2FyZSBkcml2ZXIgY2FsbHMgdGhpcyBmdW5jdGlvbiBhbHNvIGlmIG5vIHBhY2tldHMgYXJlIHF1ZXVlZC4KKyAqCVRoZSByb3V0aW5lIG11c3QgYmUgYWJsZSB0byBoYW5kbGUgdGhpcyBjYXNlLgorICogQXJncworICoJc21jIC0gQSBwb2ludGVyIHRvIHRoZSBTTVQgY29udGV4dCBzdHJ1Y3QuCisgKiBPdXQKKyAqCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbGxjX3Jlc3RhcnRfdHgoc3RydWN0IHNfc21jICpzbWMpCit7CisJc2tmZGRpX3ByaXYgKmJwID0gJnNtYy0+b3M7CisKKwlQUklOVEsoS0VSTl9JTkZPICJbbGxjX3Jlc3RhcnRfdHhdXG4iKTsKKworCS8vIFRyeSB0byBzZW5kIHF1ZXVlZCBwYWNrZXRzCisJc3Bpbl91bmxvY2soJmJwLT5Ecml2ZXJMb2NrKTsKKwlzZW5kX3F1ZXVlZF9wYWNrZXRzKHNtYyk7CisJc3Bpbl9sb2NrKCZicC0+RHJpdmVyTG9jayk7CisJbmV0aWZfc3RhcnRfcXVldWUoYnAtPmRldik7Ly8gc3lzdGVtIG1heSBzZW5kIGFnYWluIGlmIGl0IHdhcyBibG9ja2VkCisKK30JCQkJLy8gbGxjX3Jlc3RhcnRfdHgKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJbWFjX2Rydl9nZXRfc3BhY2UKKyAqCisgKglUaGUgaGFyZHdhcmUgbW9kdWxlIGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gYWxsb2NhdGUgdGhlIG1lbW9yeQorICoJZm9yIHRoZSBTTVQgTUJ1ZnMgaWYgdGhlIGRlZmluZSBNQl9PVVRTSURFX1NNQyBpcyBzcGVjaWZpZWQuCisgKiBBcmdzCisgKglzbWMgLSBBIHBvaW50ZXIgdG8gdGhlIFNNVCBjb250ZXh0IHN0cnVjdC4KKyAqCisgKglzaXplIC0gU2l6ZSBvZiBtZW1vcnkgaW4gYnl0ZXMgdG8gYWxsb2NhdGUuCisgKiBPdXQKKyAqCSE9IDAJQSBwb2ludGVyIHRvIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkuCisgKgk9PSAwCUFsbG9jYXRpb24gZXJyb3IuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKm1hY19kcnZfZ2V0X3NwYWNlKHN0cnVjdCBzX3NtYyAqc21jLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwl2b2lkICp2aXJ0OworCisJUFJJTlRLKEtFUk5fSU5GTyAibWFjX2Rydl9nZXRfc3BhY2UgKCVkIGJ5dGVzKSwgIiwgc2l6ZSk7CisJdmlydCA9ICh2b2lkICopIChzbWMtPm9zLlNoYXJlZE1lbUFkZHIgKyBzbWMtPm9zLlNoYXJlZE1lbUhlYXApOworCisJaWYgKChzbWMtPm9zLlNoYXJlZE1lbUhlYXAgKyBzaXplKSA+IHNtYy0+b3MuU2hhcmVkTWVtU2l6ZSkgeworCQlwcmludGsoIlVuZXhwZWN0ZWQgU01UIG1lbW9yeSBzaXplIHJlcXVlc3RlZDogJWRcbiIsIHNpemUpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlzbWMtPm9zLlNoYXJlZE1lbUhlYXAgKz0gc2l6ZTsJLy8gTW92ZSBoZWFwIHBvaW50ZXIuCisKKwlQUklOVEsoS0VSTl9JTkZPICJtYWNfZHJ2X2dldF9zcGFjZSBlbmRcbiIpOworCVBSSU5USyhLRVJOX0lORk8gInZpcnQgYWRkcjogJWx4XG4iLCAodWxvbmcpIHZpcnQpOworCVBSSU5USyhLRVJOX0lORk8gImJ1cyAgYWRkcjogJWx4XG4iLCAodWxvbmcpCisJICAgICAgIChzbWMtPm9zLlNoYXJlZE1lbURNQSArCisJCSgoY2hhciAqKSB2aXJ0IC0gKGNoYXIgKilzbWMtPm9zLlNoYXJlZE1lbUFkZHIpKSk7CisJcmV0dXJuICh2aXJ0KTsKK30JCQkJLy8gbWFjX2Rydl9nZXRfc3BhY2UKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJbWFjX2Rydl9nZXRfZGVzY19tZW0KKyAqCisgKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgaGFyZHdhcmUgZGVwZW5kZW50IG1vZHVsZS4KKyAqCUl0IGFsbG9jYXRlcyB0aGUgbWVtb3J5IGZvciB0aGUgUnhEIGFuZCBUeEQgZGVzY3JpcHRvcnMuCisgKgorICoJVGhpcyBtZW1vcnkgbXVzdCBiZSBub24tY2FjaGVkLCBub24tbW92YWJsZSBhbmQgbm9uLXN3YXBwYWJsZS4KKyAqCVRoaXMgbWVtb3J5IHNob3VsZCBzdGFydCBhdCBhIHBoeXNpY2FsIHBhZ2UgYm91bmRhcnkuCisgKiBBcmdzCisgKglzbWMgLSBBIHBvaW50ZXIgdG8gdGhlIFNNVCBjb250ZXh0IHN0cnVjdC4KKyAqCisgKglzaXplIC0gU2l6ZSBvZiBtZW1vcnkgaW4gYnl0ZXMgdG8gYWxsb2NhdGUuCisgKiBPdXQKKyAqCSE9IDAJQSBwb2ludGVyIHRvIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkuCisgKgk9PSAwCUFsbG9jYXRpb24gZXJyb3IuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKm1hY19kcnZfZ2V0X2Rlc2NfbWVtKHN0cnVjdCBzX3NtYyAqc21jLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKworCWNoYXIgKnZpcnQ7CisKKwlQUklOVEsoS0VSTl9JTkZPICJtYWNfZHJ2X2dldF9kZXNjX21lbVxuIik7CisKKwkvLyBEZXNjcmlwdG9yIG1lbW9yeSBtdXN0IGJlIGFsaWduZWQgb24gMTYtYnl0ZSBib3VuZGFyeS4KKworCXZpcnQgPSBtYWNfZHJ2X2dldF9zcGFjZShzbWMsIHNpemUpOworCisJc2l6ZSA9ICh1X2ludCkgKDE2IC0gKCgodW5zaWduZWQgbG9uZykgdmlydCkgJiAxNVVMKSk7CisJc2l6ZSA9IHNpemUgJSAxNjsKKworCVBSSU5USygiQWxsb2NhdGUgJXUgYnl0ZXMgYWxpZ25tZW50IGdhcCAiLCBzaXplKTsKKwlQUklOVEsoImZvciBkZXNjcmlwdG9yIG1lbW9yeS5cbiIpOworCisJaWYgKCFtYWNfZHJ2X2dldF9zcGFjZShzbWMsIHNpemUpKSB7CisJCXByaW50aygiZmRkaTogVW5hYmxlIHRvIGFsaWduIGRlc2NyaXB0b3IgbWVtb3J5LlxuIik7CisJCXJldHVybiAoTlVMTCk7CisJfQorCXJldHVybiAodmlydCArIHNpemUpOworfQkJCQkvLyBtYWNfZHJ2X2dldF9kZXNjX21lbQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgltYWNfZHJ2X3ZpcnQycGh5cworICoKKyAqCUdldCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBhIGdpdmVuIHZpcnR1YWwgYWRkcmVzcy4KKyAqIEFyZ3MKKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIGNvbnRleHQgc3RydWN0LgorICoKKyAqCXZpcnQgLSBBICh2aXJ0dWFsKSBwb2ludGVyIGludG8gb3VyICdzaGFyZWQnIG1lbW9yeSBhcmVhLgorICogT3V0CisgKglQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBnaXZlbiB2aXJ0dWFsIGFkZHJlc3MuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGxvbmcgbWFjX2Rydl92aXJ0MnBoeXMoc3RydWN0IHNfc21jICpzbWMsIHZvaWQgKnZpcnQpCit7CisJcmV0dXJuIChzbWMtPm9zLlNoYXJlZE1lbURNQSArCisJCSgoY2hhciAqKSB2aXJ0IC0gKGNoYXIgKilzbWMtPm9zLlNoYXJlZE1lbUFkZHIpKTsKK30JCQkJLy8gbWFjX2Rydl92aXJ0MnBoeXMKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJZG1hX21hc3RlcgorICoKKyAqCVRoZSBIV00gY2FsbHMgdGhpcyBmdW5jdGlvbiwgd2hlbiB0aGUgZHJpdmVyIGxlYWRzIHRocm91Z2ggYSBETUEKKyAqCXRyYW5zZmVyLiBJZiB0aGUgT1Mtc3BlY2lmaWMgbW9kdWxlIG11c3QgcHJlcGFyZSB0aGUgc3lzdGVtIGhhcmR3YXJlCisgKglmb3IgdGhlIERNQSB0cmFuc2ZlciwgaXQgc2hvdWxkIGRvIGl0IGluIHRoaXMgZnVuY3Rpb24uCisgKgorICoJVGhlIGhhcmR3YXJlIG1vZHVsZSBjYWxscyB0aGlzIGRtYV9tYXN0ZXIgaWYgaXQgd2FudHMgdG8gc2VuZCBhbiBTTVQKKyAqCWZyYW1lLiAgVGhpcyBtZWFucyB0aGF0IHRoZSB2aXJ0IGFkZHJlc3MgcGFzc2VkIGluIGhlcmUgaXMgcGFydCBvZgorICogICAgICB0aGUgJ3NoYXJlZCcgbWVtb3J5IGFyZWEuCisgKiBBcmdzCisgKglzbWMgLSBBIHBvaW50ZXIgdG8gdGhlIFNNVCBjb250ZXh0IHN0cnVjdC4KKyAqCisgKgl2aXJ0IC0gVGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgZGF0YS4KKyAqCisgKglsZW4gLSBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBkYXRhLgorICoKKyAqCWZsYWcgLSBJbmRpY2F0ZXMgdGhlIHRyYW5zbWl0IGRpcmVjdGlvbiBhbmQgdGhlIGJ1ZmZlciB0eXBlOgorICoJCURNQV9SRAkoMHgwMSkJc3lzdGVtIFJBTSA9PT4gYWRhcHRlciBidWZmZXIgbWVtb3J5CisgKgkJRE1BX1dSCSgweDAyKQlhZGFwdGVyIGJ1ZmZlciBtZW1vcnkgPT0+IHN5c3RlbSBSQU0KKyAqCQlTTVRfQlVGICgweDgwKQlTTVQgYnVmZmVyCisgKgorICoJPj4gTk9URTogU01UX0JVRiBhbmQgRE1BX1JEIGFyZSBhbHdheXMgc2V0IGZvciBQQ0kuIDw8CisgKiBPdXQKKyAqCVJldHVybnMgdGhlIHB5aHNpY2FsIGFkZHJlc3MgZm9yIHRoZSBETUEgdHJhbnNmZXIuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3VfbG9uZyBkbWFfbWFzdGVyKHN0cnVjdCBzX3NtYyAqIHNtYywgdm9pZCAqdmlydCwgaW50IGxlbiwgaW50IGZsYWcpCit7CisJcmV0dXJuIChzbWMtPm9zLlNoYXJlZE1lbURNQSArCisJCSgoY2hhciAqKSB2aXJ0IC0gKGNoYXIgKilzbWMtPm9zLlNoYXJlZE1lbUFkZHIpKTsKK30JCQkJLy8gZG1hX21hc3RlcgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglkbWFfY29tcGxldGUKKyAqCisgKglUaGUgaGFyZHdhcmUgbW9kdWxlIGNhbGxzIHRoaXMgcm91dGluZSB3aGVuIGl0IGhhcyBjb21wbGV0ZWQgYSBETUEKKyAqCXRyYW5zZmVyLiBJZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBkZXBlbmRlbnQgbW9kdWxlIGhhcyBzZXQgdXAgdGhlIERNQQorICoJY2hhbm5lbCB2aWEgZG1hX21hc3RlcigpIChlLmcuIFdpbmRvd3MgTlQgb3IgQUlYKSBpdCBzaG91bGQgY2xlYW4gdXAKKyAqCXRoZSBETUEgY2hhbm5lbC4KKyAqIEFyZ3MKKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIGNvbnRleHQgc3RydWN0LgorICoKKyAqCWRlc2NyIC0gQSBwb2ludGVyIHRvIGEgVHhEIG9yIFJ4RCwgcmVzcGVjdGl2ZWx5LgorICoKKyAqCWZsYWcgLSBJbmRpY2F0ZXMgdGhlIERNQSB0cmFuc2ZlciBkaXJlY3Rpb24gLyBTTVQgYnVmZmVyOgorICoJCURNQV9SRAkoMHgwMSkJc3lzdGVtIFJBTSA9PT4gYWRhcHRlciBidWZmZXIgbWVtb3J5CisgKgkJRE1BX1dSCSgweDAyKQlhZGFwdGVyIGJ1ZmZlciBtZW1vcnkgPT0+IHN5c3RlbSBSQU0KKyAqCQlTTVRfQlVGICgweDgwKQlTTVQgYnVmZmVyIChtYW5hZ2VkIGJ5IEhXTSkKKyAqIE91dAorICoJTm90aGluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBkbWFfY29tcGxldGUoc3RydWN0IHNfc21jICpzbWMsIHZvbGF0aWxlIHVuaW9uIHNfZnBfZGVzY3IgKmRlc2NyLCBpbnQgZmxhZykKK3sKKwkvKiBGb3IgVFggYnVmZmVycywgdGhlcmUgYXJlIHR3byBjYXNlcy4gIElmIGl0IGlzIGFuIFNNVCB0cmFuc21pdAorCSAqIGJ1ZmZlciwgdGhlcmUgaXMgbm90aGluZyB0byBkbyBzaW5jZSB3ZSB1c2UgY29uc2lzdGVudCBtZW1vcnkKKwkgKiBmb3IgdGhlICdzaGFyZWQnIG1lbW9yeSBhcmVhLiAgVGhlIG90aGVyIGNhc2UgaXMgZm9yIG5vcm1hbAorCSAqIHRyYW5zbWl0IHBhY2tldHMgZ2l2ZW4gdG8gdXMgYnkgdGhlIG5ldHdvcmtpbmcgc3RhY2ssIGFuZCBpbgorCSAqIHRoYXQgY2FzZSB3ZSBjbGVhbnVwIHRoZSBQQ0kgRE1BIG1hcHBpbmcgaW4gbWFjX2Rydl90eF9jb21wbGV0ZQorCSAqIGJlbG93LgorCSAqCisJICogRm9yIFJYIGJ1ZmZlcnMsIHdlIGhhdmUgdG8gdW5tYXAgZHluYW1pYyBQQ0kgRE1BIG1hcHBpbmdzIGhlcmUKKwkgKiBiZWNhdXNlIHRoZSBoYXJkd2FyZSBtb2R1bGUgaXMgYWJvdXQgdG8gcG90ZW50aWFsbHkgbG9vayBhdAorCSAqIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyLiAgSWYgd2UgZGlkIG5vdCBjYWxsIHRoZSBQQ0kgRE1BCisJICogdW5tYXAgZmlyc3QsIHRoZSBoYXJkd2FyZSBtb2R1bGUgY291bGQgcmVhZCBpbmNvbnNpc3RlbnQgZGF0YS4KKwkgKi8KKwlpZiAoZmxhZyAmIERNQV9XUikgeworCQlza2ZkZGlfcHJpdiAqYnAgPSAmc21jLT5vczsKKwkJdm9sYXRpbGUgc3RydWN0IHNfc210X2ZwX3J4ZCAqciA9ICZkZXNjci0+cjsKKworCQkvKiBJZiBTS0IgaXMgTlVMTCwgd2UgdXNlZCB0aGUgbG9jYWwgYnVmZmVyLiAqLworCQlpZiAoci0+cnhkX29zLnNrYiAmJiByLT5yeGRfb3MuZG1hX2FkZHIpIHsKKwkJCWludCBNYXhGcmFtZVNpemUgPSBicC0+TWF4RnJhbWVTaXplOworCisJCQlwY2lfdW5tYXBfc2luZ2xlKCZicC0+cGRldiwgci0+cnhkX29zLmRtYV9hZGRyLAorCQkJCQkgTWF4RnJhbWVTaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJci0+cnhkX29zLmRtYV9hZGRyID0gMDsKKwkJfQorCX0KK30JCQkJLy8gZG1hX2NvbXBsZXRlCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCW1hY19kcnZfdHhfY29tcGxldGUKKyAqCisgKglUcmFuc21pdCBvZiBhIHBhY2tldCBpcyBjb21wbGV0ZS4gUmVsZWFzZSB0aGUgdHggc3RhZ2luZyBidWZmZXIuCisgKgorICogQXJncworICoJc21jIC0gQSBwb2ludGVyIHRvIHRoZSBTTVQgY29udGV4dCBzdHJ1Y3QuCisgKgorICoJdHhkIC0gQSBwb2ludGVyIHRvIHRoZSBsYXN0IFR4RCB3aGljaCBpcyB1c2VkIGJ5IHRoZSBmcmFtZS4KKyAqIE91dAorICoJUmV0dXJucyBub3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG1hY19kcnZfdHhfY29tcGxldGUoc3RydWN0IHNfc21jICpzbWMsIHZvbGF0aWxlIHN0cnVjdCBzX3NtdF9mcF90eGQgKnR4ZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJUFJJTlRLKEtFUk5fSU5GTyAiZW50ZXJpbmcgbWFjX2Rydl90eF9jb21wbGV0ZVxuIik7CisJLy8gQ2hlY2sgaWYgdGhpcyBUeEQgcG9pbnRzIHRvIGEgc2tiCisKKwlpZiAoIShza2IgPSB0eGQtPnR4ZF9vcy5za2IpKSB7CisJCVBSSU5USygiVFhEIHdpdGggbm8gc2tiIGFzc2lnbmVkLlxuIik7CisJCXJldHVybjsKKwl9CisJdHhkLT50eGRfb3Muc2tiID0gTlVMTDsKKworCS8vIHJlbGVhc2UgdGhlIERNQSBtYXBwaW5nCisJcGNpX3VubWFwX3NpbmdsZSgmc21jLT5vcy5wZGV2LCB0eGQtPnR4ZF9vcy5kbWFfYWRkciwKKwkJCSBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJdHhkLT50eGRfb3MuZG1hX2FkZHIgPSAwOworCisJc21jLT5vcy5NYWNTdGF0Lmdlbi50eF9wYWNrZXRzKys7CS8vIENvdW50IHRyYW5zbWl0dGVkIHBhY2tldHMuCisJc21jLT5vcy5NYWNTdGF0Lmdlbi50eF9ieXRlcys9c2tiLT5sZW47CS8vIENvdW50IGJ5dGVzCisKKwkvLyBmcmVlIHRoZSBza2IKKwlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCisJUFJJTlRLKEtFUk5fSU5GTyAibGVhdmluZyBtYWNfZHJ2X3R4X2NvbXBsZXRlXG4iKTsKK30JCQkJLy8gbWFjX2Rydl90eF9jb21wbGV0ZQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBkdW1wIHBhY2tldHMgdG8gbG9nZmlsZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgRFVNUFBBQ0tFVFMKK3ZvaWQgZHVtcF9kYXRhKHVuc2lnbmVkIGNoYXIgKkRhdGEsIGludCBsZW5ndGgpCit7CisJaW50IGksIGo7CisJdW5zaWduZWQgY2hhciBzWzI1NV0sIHNoWzEwXTsKKwlpZiAobGVuZ3RoID4gNjQpIHsKKwkJbGVuZ3RoID0gNjQ7CisJfQorCXByaW50ayhLRVJOX0lORk8gIi0tLVBhY2tldCBzdGFydC0tLVxuIik7CisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBsZW5ndGggLyA4OyBpKyssIGogKz0gOCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkgICAgICAgRGF0YVtqICsgMF0sIERhdGFbaiArIDFdLCBEYXRhW2ogKyAyXSwgRGF0YVtqICsgM10sCisJCSAgICAgICBEYXRhW2ogKyA0XSwgRGF0YVtqICsgNV0sIERhdGFbaiArIDZdLCBEYXRhW2ogKyA3XSk7CisJc3RyY3B5KHMsICIiKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoICUgODsgaSsrKSB7CisJCXNwcmludGYoc2gsICIlMDJ4ICIsIERhdGFbaiArIGldKTsKKwkJc3RyY2F0KHMsIHNoKTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIHMpOworCXByaW50ayhLRVJOX0lORk8gIi0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Cit9CQkJCS8vIGR1bXBfZGF0YQorI2Vsc2UKKyNkZWZpbmUgZHVtcF9kYXRhKGRhdGEsbGVuKQorI2VuZGlmCQkJCS8vIERVTVBQQUNLRVRTCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgltYWNfZHJ2X3J4X2NvbXBsZXRlCisgKgorICoJVGhlIGhhcmR3YXJlIG1vZHVsZSBjYWxscyB0aGlzIGZ1bmN0aW9uIGlmIGFuIExMQyBmcmFtZSBpcyByZWNlaXZlZAorICoJaW4gYSByZWNlaXZlIGJ1ZmZlci4gQWxzbyB0aGUgU01ULCBOU0EsIGFuZCBkaXJlY3RlZCBiZWFjb24gZnJhbWVzCisgKglmcm9tIHRoZSBuZXR3b3JrIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBMTEMgbGF5ZXIgYnkgdGhpcyBmdW5jdGlvbgorICoJaWYgcGFzc2luZyBpcyBlbmFibGVkLgorICoKKyAqCW1hY19kcnZfcnhfY29tcGxldGUgZm9yd2FyZHMgdGhlIGZyYW1lIHRvIHRoZSBMTEMgbGF5ZXIgaWYgaXQgc2hvdWxkCisgKgliZSByZWNlaXZlZC4gSXQgYWxzbyBmaWxscyB0aGUgUnhEIHJpbmcgd2l0aCBuZXcgcmVjZWl2ZSBidWZmZXJzIGlmCisgKglzb21lIGNhbiBiZSBxdWV1ZWQuCisgKiBBcmdzCisgKglzbWMgLSBBIHBvaW50ZXIgdG8gdGhlIFNNVCBjb250ZXh0IHN0cnVjdC4KKyAqCisgKglyeGQgLSBBIHBvaW50ZXIgdG8gdGhlIGZpcnN0IFJ4RCB3aGljaCBpcyB1c2VkIGJ5IHRoZSByZWNlaXZlIGZyYW1lLgorICoKKyAqCWZyYWdfY291bnQgLSBDb3VudCBvZiBSeERzIHVzZWQgYnkgdGhlIHJlY2VpdmVkIGZyYW1lLgorICoKKyAqCWxlbiAtIEZyYW1lIGxlbmd0aC4KKyAqIE91dAorICoJTm90aGluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtYWNfZHJ2X3J4X2NvbXBsZXRlKHN0cnVjdCBzX3NtYyAqc21jLCB2b2xhdGlsZSBzdHJ1Y3Qgc19zbXRfZnBfcnhkICpyeGQsCisJCQkgaW50IGZyYWdfY291bnQsIGludCBsZW4pCit7CisJc2tmZGRpX3ByaXYgKmJwID0gJnNtYy0+b3M7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICp2aXJ0LCAqY3A7CisJdW5zaWduZWQgc2hvcnQgcmk7CisJdV9pbnQgUmlmTGVuZ3RoOworCisJUFJJTlRLKEtFUk5fSU5GTyAiZW50ZXJpbmcgbWFjX2Rydl9yeF9jb21wbGV0ZSAobGVuPSVkKVxuIiwgbGVuKTsKKwlpZiAoZnJhZ19jb3VudCAhPSAxKSB7CS8vIFRoaXMgaXMgbm90IGFsbG93ZWQgdG8gaGFwcGVuLgorCisJCXByaW50aygiZmRkaTogTXVsdGktZnJhZ21lbnQgcmVjZWl2ZSFcbiIpOworCQlnb3RvIFJlcXVldWVSeGQ7CS8vIFJlLXVzZSB0aGUgZ2l2ZW4gUlhEKHMpLgorCisJfQorCXNrYiA9IHJ4ZC0+cnhkX29zLnNrYjsKKwlpZiAoIXNrYikgeworCQlQUklOVEsoS0VSTl9JTkZPICJObyBza2IgaW4gcnhkXG4iKTsKKwkJc21jLT5vcy5NYWNTdGF0Lmdlbi5yeF9lcnJvcnMrKzsKKwkJZ290byBSZXF1ZXVlUnhkOworCX0KKwl2aXJ0ID0gc2tiLT5kYXRhOworCisJLy8gVGhlIERNQSBtYXBwaW5nIHdhcyByZWxlYXNlZCBpbiBkbWFfY29tcGxldGUgYWJvdmUuCisKKwlkdW1wX2RhdGEoc2tiLT5kYXRhLCBsZW4pOworCisJLyoKKwkgKiBGRERJIEZyYW1lIGZvcm1hdDoKKwkgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKKwkgKiB8IEZDWzFdIHwgREFbNl0gfCBTQVs2XSB8IFJJRlswLi4xOF0gfCBMTENbM10gfCBEYXRhWzAuLm5dIHwKKwkgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKKwkgKgorCSAqIEZDID0gRnJhbWUgQ29udHJvbAorCSAqIERBID0gRGVzdGluYXRpb24gQWRkcmVzcworCSAqIFNBID0gU291cmNlIEFkZHJlc3MKKwkgKiBSSUYgPSBSb3V0aW5nIEluZm9ybWF0aW9uIEZpZWxkCisJICogTExDID0gTG9naWNhbCBMaW5rIENvbnRyb2wKKwkgKi8KKworCS8vIFJlbW92ZSBSb3V0aW5nIEluZm9ybWF0aW9uIEZpZWxkIChSSUYpLCBpZiBwcmVzZW50LgorCisJaWYgKCh2aXJ0WzEgKyA2XSAmIEZERElfUklJKSA9PSAwKQorCQlSaWZMZW5ndGggPSAwOworCWVsc2UgeworCQlpbnQgbjsKKy8vIGdvb3M6IFJJRiByZW1vdmFsIGhhcyBzdGlsbCB0byBiZSB0ZXN0ZWQKKwkJUFJJTlRLKEtFUk5fSU5GTyAiUklGIGZvdW5kXG4iKTsKKwkJLy8gR2V0IFJJRiBsZW5ndGggZnJvbSBSb3V0aW5nIENvbnRyb2wgKFJDKSBmaWVsZC4KKwkJY3AgPSB2aXJ0ICsgRkRESV9NQUNfSERSX0xFTjsJLy8gUG9pbnQgYmVoaW5kIE1BQyBoZWFkZXIuCisKKwkJcmkgPSBudG9ocygqKCh1bnNpZ25lZCBzaG9ydCAqKSBjcCkpOworCQlSaWZMZW5ndGggPSByaSAmIEZERElfUkNGX0xFTl9NQVNLOworCQlpZiAobGVuIDwgKGludCkgKEZERElfTUFDX0hEUl9MRU4gKyBSaWZMZW5ndGgpKSB7CisJCQlwcmludGsoImZkZGk6IEludmFsaWQgUklGLlxuIik7CisJCQlnb3RvIFJlcXVldWVSeGQ7CS8vIERpc2NhcmQgdGhlIGZyYW1lLgorCisJCX0KKwkJdmlydFsxICsgNl0gJj0gfkZERElfUklJOwkvLyBDbGVhciBSSUkgYml0LgorCQkvLyByZWdpb25zIG92ZXJsYXAKKworCQl2aXJ0ID0gY3AgKyBSaWZMZW5ndGg7CisJCWZvciAobiA9IEZERElfTUFDX0hEUl9MRU47IG47IG4tLSkKKwkJCSotLXZpcnQgPSAqLS1jcDsKKwkJLy8gYWRqdXN0IHNiZC0+ZGF0YSBwb2ludGVyCisJCXNrYl9wdWxsKHNrYiwgUmlmTGVuZ3RoKTsKKwkJbGVuIC09IFJpZkxlbmd0aDsKKwkJUmlmTGVuZ3RoID0gMDsKKwl9CisKKwkvLyBDb3VudCBzdGF0aXN0aWNzLgorCXNtYy0+b3MuTWFjU3RhdC5nZW4ucnhfcGFja2V0cysrOwkvLyBDb3VudCBpbmRpY2F0ZWQgcmVjZWl2ZQorCQkJCQkJLy8gcGFja2V0cy4KKwlzbWMtPm9zLk1hY1N0YXQuZ2VuLnJ4X2J5dGVzKz1sZW47CS8vIENvdW50IGJ5dGVzLgorCisJLy8gdmlydCBwb2ludHMgdG8gaGVhZGVyIGFnYWluCisJaWYgKHZpcnRbMV0gJiAweDAxKSB7CS8vIENoZWNrIGdyb3VwIChtdWx0aWNhc3QpIGJpdC4KKworCQlzbWMtPm9zLk1hY1N0YXQuZ2VuLm11bHRpY2FzdCsrOworCX0KKworCS8vIGRlbGl2ZXIgZnJhbWUgdG8gc3lzdGVtCisJcnhkLT5yeGRfb3Muc2tiID0gTlVMTDsKKwlza2JfdHJpbShza2IsIGxlbik7CisJc2tiLT5wcm90b2NvbCA9IGZkZGlfdHlwZV90cmFucyhza2IsIGJwLT5kZXYpOworCXNrYi0+ZGV2ID0gYnAtPmRldjsJLyogcGFzcyB1cCBkZXZpY2UgcG9pbnRlciAqLworCisJbmV0aWZfcngoc2tiKTsKKwlicC0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworCUhXTV9SWF9DSEVDSyhzbWMsIFJYX0xPV19XQVRFUk1BUkspOworCXJldHVybjsKKworICAgICAgUmVxdWV1ZVJ4ZDoKKwlQUklOVEsoS0VSTl9JTkZPICJSeDogcmUtcXVldWUgUlhELlxuIik7CisJbWFjX2Rydl9yZXF1ZXVlX3J4ZChzbWMsIHJ4ZCwgZnJhZ19jb3VudCk7CisJc21jLT5vcy5NYWNTdGF0Lmdlbi5yeF9lcnJvcnMrKzsJLy8gQ291bnQgcmVjZWl2ZSBwYWNrZXRzCisJCQkJCQkvLyBub3QgaW5kaWNhdGVkLgorCit9CQkJCS8vIG1hY19kcnZfcnhfY29tcGxldGUKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJbWFjX2Rydl9yZXF1ZXVlX3J4ZAorICoKKyAqCVRoZSBoYXJkd2FyZSBtb2R1bGUgY2FsbHMgdGhpcyBmdW5jdGlvbiB0byByZXF1ZXN0IHRoZSBPUy1zcGVjaWZpYworICoJbW9kdWxlIHRvIHF1ZXVlIHRoZSByZWNlaXZlIGJ1ZmZlcihzKSByZXByZXNlbnRlZCBieSB0aGUgcG9pbnRlcgorICoJdG8gdGhlIFJ4RCBhbmQgdGhlIGZyYWdfY291bnQgaW50byB0aGUgcmVjZWl2ZSBxdWV1ZSBhZ2Fpbi4gVGhpcworICoJYnVmZmVyIHdhcyBmaWxsZWQgd2l0aCBhbiBpbnZhbGlkIGZyYW1lIG9yIGFuIFNNVCBmcmFtZS4KKyAqIEFyZ3MKKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIGNvbnRleHQgc3RydWN0LgorICoKKyAqCXJ4ZCAtIEEgcG9pbnRlciB0byB0aGUgZmlyc3QgUnhEIHdoaWNoIGlzIHVzZWQgYnkgdGhlIHJlY2VpdmUgZnJhbWUuCisgKgorICoJZnJhZ19jb3VudCAtIENvdW50IG9mIFJ4RHMgdXNlZCBieSB0aGUgcmVjZWl2ZWQgZnJhbWUuCisgKiBPdXQKKyAqCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbWFjX2Rydl9yZXF1ZXVlX3J4ZChzdHJ1Y3Qgc19zbWMgKnNtYywgdm9sYXRpbGUgc3RydWN0IHNfc210X2ZwX3J4ZCAqcnhkLAorCQkJIGludCBmcmFnX2NvdW50KQoreworCXZvbGF0aWxlIHN0cnVjdCBzX3NtdF9mcF9yeGQgKm5leHRfcnhkOworCXZvbGF0aWxlIHN0cnVjdCBzX3NtdF9mcF9yeGQgKnNyY19yeGQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgTWF4RnJhbWVTaXplOworCXVuc2lnbmVkIGNoYXIgKnZfYWRkcjsKKwlkbWFfYWRkcl90IGJfYWRkcjsKKworCWlmIChmcmFnX2NvdW50ICE9IDEpCS8vIFRoaXMgaXMgbm90IGFsbG93ZWQgdG8gaGFwcGVuLgorCisJCXByaW50aygiZmRkaTogTXVsdGktZnJhZ21lbnQgcmVxdWV1ZSFcbiIpOworCisJTWF4RnJhbWVTaXplID0gc21jLT5vcy5NYXhGcmFtZVNpemU7CisJc3JjX3J4ZCA9IHJ4ZDsKKwlmb3IgKDsgZnJhZ19jb3VudCA+IDA7IGZyYWdfY291bnQtLSkgeworCQluZXh0X3J4ZCA9IHNyY19yeGQtPnJ4ZF9uZXh0OworCQlyeGQgPSBIV01fR0VUX0NVUlJfUlhEKHNtYyk7CisKKwkJc2tiID0gc3JjX3J4ZC0+cnhkX29zLnNrYjsKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CS8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4KKworCQkJUFJJTlRLKCJSZXF1ZXVlIHdpdGggbm8gc2tiIGluIHJ4ZCFcbiIpOworCQkJc2tiID0gYWxsb2Nfc2tiKE1heEZyYW1lU2l6ZSArIDMsIEdGUF9BVE9NSUMpOworCQkJaWYgKHNrYikgeworCQkJCS8vIHdlIGdvdCBhIHNrYgorCQkJCXJ4ZC0+cnhkX29zLnNrYiA9IHNrYjsKKwkJCQlza2JfcmVzZXJ2ZShza2IsIDMpOworCQkJCXNrYl9wdXQoc2tiLCBNYXhGcmFtZVNpemUpOworCQkJCXZfYWRkciA9IHNrYi0+ZGF0YTsKKwkJCQliX2FkZHIgPSBwY2lfbWFwX3NpbmdsZSgmc21jLT5vcy5wZGV2LAorCQkJCQkJCXZfYWRkciwKKwkJCQkJCQlNYXhGcmFtZVNpemUsCisJCQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlyeGQtPnJ4ZF9vcy5kbWFfYWRkciA9IGJfYWRkcjsKKwkJCX0gZWxzZSB7CisJCQkJLy8gbm8gc2tiIGF2YWlsYWJsZSwgdXNlIGxvY2FsIGJ1ZmZlcgorCQkJCVBSSU5USygiUXVldWVpbmcgaW52YWxpZCBidWZmZXIhXG4iKTsKKwkJCQlyeGQtPnJ4ZF9vcy5za2IgPSBOVUxMOworCQkJCXZfYWRkciA9IHNtYy0+b3MuTG9jYWxSeEJ1ZmZlcjsKKwkJCQliX2FkZHIgPSBzbWMtPm9zLkxvY2FsUnhCdWZmZXJETUE7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyB3ZSB1c2Ugc2tiIGZyb20gb2xkIHJ4ZAorCQkJcnhkLT5yeGRfb3Muc2tiID0gc2tiOworCQkJdl9hZGRyID0gc2tiLT5kYXRhOworCQkJYl9hZGRyID0gcGNpX21hcF9zaW5nbGUoJnNtYy0+b3MucGRldiwKKwkJCQkJCXZfYWRkciwKKwkJCQkJCU1heEZyYW1lU2l6ZSwKKwkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlyeGQtPnJ4ZF9vcy5kbWFfYWRkciA9IGJfYWRkcjsKKwkJfQorCQlod21fcnhfZnJhZyhzbWMsIHZfYWRkciwgYl9hZGRyLCBNYXhGcmFtZVNpemUsCisJCQkgICAgRklSU1RfRlJBRyB8IExBU1RfRlJBRyk7CisKKwkJc3JjX3J4ZCA9IG5leHRfcnhkOworCX0KK30JCQkJLy8gbWFjX2Rydl9yZXF1ZXVlX3J4ZAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgltYWNfZHJ2X2ZpbGxfcnhkCisgKgorICoJVGhlIGhhcmR3YXJlIG1vZHVsZSBjYWxscyB0aGlzIGZ1bmN0aW9uIGF0IGluaXRpYWxpemF0aW9uIHRpbWUKKyAqCXRvIGZpbGwgdGhlIFJ4RCByaW5nIHdpdGggcmVjZWl2ZSBidWZmZXJzLiBJdCBpcyBhbHNvIGNhbGxlZCBieQorICoJbWFjX2Rydl9yeF9jb21wbGV0ZSBpZiByeF9mcmVlIGlzIGxhcmdlIGVub3VnaCB0byBxdWV1ZSBzb21lIG5ldworICoJcmVjZWl2ZSBidWZmZXJzIGludG8gdGhlIFJ4RCByaW5nLiBtYWNfZHJ2X2ZpbGxfcnhkIHF1ZXVlcyBuZXcKKyAqCXJlY2VpdmUgYnVmZmVycyBhcyBsb25nIGFzIGVub3VnaCBSeERzIGFuZCByZWNlaXZlIGJ1ZmZlcnMgYXJlCisgKglhdmFpbGFibGUuCisgKiBBcmdzCisgKglzbWMgLSBBIHBvaW50ZXIgdG8gdGhlIFNNVCBjb250ZXh0IHN0cnVjdC4KKyAqIE91dAorICoJTm90aGluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtYWNfZHJ2X2ZpbGxfcnhkKHN0cnVjdCBzX3NtYyAqc21jKQoreworCWludCBNYXhGcmFtZVNpemU7CisJdW5zaWduZWQgY2hhciAqdl9hZGRyOworCXVuc2lnbmVkIGxvbmcgYl9hZGRyOworCXN0cnVjdCBza19idWZmICpza2I7CisJdm9sYXRpbGUgc3RydWN0IHNfc210X2ZwX3J4ZCAqcnhkOworCisJUFJJTlRLKEtFUk5fSU5GTyAiZW50ZXJpbmcgbWFjX2Rydl9maWxsX3J4ZFxuIik7CisKKwkvLyBXYWxrIHRocm91Z2ggdGhlIGxpc3Qgb2YgZnJlZSByZWNlaXZlIGJ1ZmZlcnMsIHBhc3NpbmcgcmVjZWl2ZQorCS8vIGJ1ZmZlcnMgdG8gdGhlIEhXTSBhcyBsb25nIGFzIFJYRHMgYXJlIGF2YWlsYWJsZS4KKworCU1heEZyYW1lU2l6ZSA9IHNtYy0+b3MuTWF4RnJhbWVTaXplOworCS8vIENoZWNrIGlmIHRoZXJlIGlzIGFueSBSWEQgbGVmdC4KKwl3aGlsZSAoSFdNX0dFVF9SWF9GUkVFKHNtYykgPiAwKSB7CisJCVBSSU5USyhLRVJOX0lORk8gIi5cbiIpOworCisJCXJ4ZCA9IEhXTV9HRVRfQ1VSUl9SWEQoc21jKTsKKwkJc2tiID0gYWxsb2Nfc2tiKE1heEZyYW1lU2l6ZSArIDMsIEdGUF9BVE9NSUMpOworCQlpZiAoc2tiKSB7CisJCQkvLyB3ZSBnb3QgYSBza2IKKwkJCXNrYl9yZXNlcnZlKHNrYiwgMyk7CisJCQlza2JfcHV0KHNrYiwgTWF4RnJhbWVTaXplKTsKKwkJCXZfYWRkciA9IHNrYi0+ZGF0YTsKKwkJCWJfYWRkciA9IHBjaV9tYXBfc2luZ2xlKCZzbWMtPm9zLnBkZXYsCisJCQkJCQl2X2FkZHIsCisJCQkJCQlNYXhGcmFtZVNpemUsCisJCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJcnhkLT5yeGRfb3MuZG1hX2FkZHIgPSBiX2FkZHI7CisJCX0gZWxzZSB7CisJCQkvLyBubyBza2IgYXZhaWxhYmxlLCB1c2UgbG9jYWwgYnVmZmVyCisJCQkvLyBTeXN0ZW0gaGFzIHJ1biBvdXQgb2YgYnVmZmVyIG1lbW9yeSwgYnV0IHdlIHdhbnQgdG8KKwkJCS8vIGtlZXAgdGhlIHJlY2VpdmVyIHJ1bm5pbmcgaW4gaG9wZSBvZiBiZXR0ZXIgdGltZXMuCisJCQkvLyBNdWx0aXBsZSBkZXNjcmlwdG9ycyBtYXkgcG9pbnQgdG8gdGhpcyBsb2NhbCBidWZmZXIsCisJCQkvLyBzbyBkYXRhIGluIGl0IG11c3QgYmUgY29uc2lkZXJlZCBpbnZhbGlkLgorCQkJUFJJTlRLKCJRdWV1ZWluZyBpbnZhbGlkIGJ1ZmZlciFcbiIpOworCQkJdl9hZGRyID0gc21jLT5vcy5Mb2NhbFJ4QnVmZmVyOworCQkJYl9hZGRyID0gc21jLT5vcy5Mb2NhbFJ4QnVmZmVyRE1BOworCQl9CisKKwkJcnhkLT5yeGRfb3Muc2tiID0gc2tiOworCisJCS8vIFBhc3MgcmVjZWl2ZSBidWZmZXIgdG8gSFdNLgorCQlod21fcnhfZnJhZyhzbWMsIHZfYWRkciwgYl9hZGRyLCBNYXhGcmFtZVNpemUsCisJCQkgICAgRklSU1RfRlJBRyB8IExBU1RfRlJBRyk7CisJfQorCVBSSU5USyhLRVJOX0lORk8gImxlYXZpbmcgbWFjX2Rydl9maWxsX3J4ZFxuIik7Cit9CQkJCS8vIG1hY19kcnZfZmlsbF9yeGQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJbWFjX2Rydl9jbGVhcl9yeGQKKyAqCisgKglUaGUgaGFyZHdhcmUgbW9kdWxlIGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gcmVsZWFzZSB1bnVzZWQKKyAqCXJlY2VpdmUgYnVmZmVycy4KKyAqIEFyZ3MKKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIGNvbnRleHQgc3RydWN0LgorICoKKyAqCXJ4ZCAtIEEgcG9pbnRlciB0byB0aGUgZmlyc3QgUnhEIHdoaWNoIGlzIHVzZWQgYnkgdGhlIHJlY2VpdmUgYnVmZmVyLgorICoKKyAqCWZyYWdfY291bnQgLSBDb3VudCBvZiBSeERzIHVzZWQgYnkgdGhlIHJlY2VpdmUgYnVmZmVyLgorICogT3V0CisgKglOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG1hY19kcnZfY2xlYXJfcnhkKHN0cnVjdCBzX3NtYyAqc21jLCB2b2xhdGlsZSBzdHJ1Y3Qgc19zbXRfZnBfcnhkICpyeGQsCisJCSAgICAgICBpbnQgZnJhZ19jb3VudCkKK3sKKworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlQUklOVEsoImVudGVyaW5nIG1hY19kcnZfY2xlYXJfcnhkXG4iKTsKKworCWlmIChmcmFnX2NvdW50ICE9IDEpCS8vIFRoaXMgaXMgbm90IGFsbG93ZWQgdG8gaGFwcGVuLgorCisJCXByaW50aygiZmRkaTogTXVsdGktZnJhZ21lbnQgY2xlYXIhXG4iKTsKKworCWZvciAoOyBmcmFnX2NvdW50ID4gMDsgZnJhZ19jb3VudC0tKSB7CisJCXNrYiA9IHJ4ZC0+cnhkX29zLnNrYjsKKwkJaWYgKHNrYiAhPSBOVUxMKSB7CisJCQlza2ZkZGlfcHJpdiAqYnAgPSAmc21jLT5vczsKKwkJCWludCBNYXhGcmFtZVNpemUgPSBicC0+TWF4RnJhbWVTaXplOworCisJCQlwY2lfdW5tYXBfc2luZ2xlKCZicC0+cGRldiwgcnhkLT5yeGRfb3MuZG1hX2FkZHIsCisJCQkJCSBNYXhGcmFtZVNpemUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJ4ZC0+cnhkX29zLnNrYiA9IE5VTEw7CisJCX0KKwkJcnhkID0gcnhkLT5yeGRfbmV4dDsJLy8gTmV4dCBSWEQuCisKKwl9Cit9CQkJCS8vIG1hY19kcnZfY2xlYXJfcnhkCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCW1hY19kcnZfcnhfaW5pdAorICoKKyAqCVRoZSBoYXJkd2FyZSBtb2R1bGUgY2FsbHMgdGhpcyByb3V0aW5lIHdoZW4gYW4gU01UIG9yIE5TQSBmcmFtZSBvZiB0aGUKKyAqCWxvY2FsIFNNVCBzaG91bGQgYmUgZGVsaXZlcmVkIHRvIHRoZSBMTEMgbGF5ZXIuCisgKgorICoJSXQgaXMgbmVjZXNzYXJ5IHRvIGhhdmUgdGhpcyBmdW5jdGlvbiwgYmVjYXVzZSB0aGVyZSBpcyBubyBvdGhlciB3YXkgdG8KKyAqCWNvcHkgdGhlIGNvbnRlbnRzIG9mIFNNVCBNQnVmcyBpbnRvIHJlY2VpdmUgYnVmZmVycy4KKyAqCisgKgltYWNfZHJ2X3J4X2luaXQgYWxsb2NhdGVzIHRoZSByZXF1aXJlZCB0YXJnZXQgbWVtb3J5IGZvciB0aGlzIGZyYW1lLAorICoJYW5kIHJlY2VpdmVzIHRoZSBmcmFtZSBmcmFnbWVudCBieSBmcmFnbWVudCBieSBjYWxsaW5nIG1hY19kcnZfcnhfZnJhZy4KKyAqIEFyZ3MKKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIGNvbnRleHQgc3RydWN0LgorICoKKyAqCWxlbiAtIFRoZSBsZW5ndGggKGluIGJ5dGVzKSBvZiB0aGUgcmVjZWl2ZWQgZnJhbWUgKEZDLCBEQSwgU0EsIERhdGEpLgorICoKKyAqCWZjIC0gVGhlIEZyYW1lIENvbnRyb2wgZmllbGQgb2YgdGhlIHJlY2VpdmVkIGZyYW1lLgorICoKKyAqCWxvb2tfYWhlYWQgLSBBIHBvaW50ZXIgdG8gdGhlIGxvb2thaGVhZCBkYXRhIGJ1ZmZlciAobWF5IGJlIE5VTEwpLgorICoKKyAqCWxhX2xlbiAtIFRoZSBsZW5ndGggb2YgdGhlIGxvb2thaGVhZCBkYXRhIHN0b3JlZCBpbiB0aGUgbG9va2FoZWFkCisgKglidWZmZXIgKG1heSBiZSB6ZXJvKS4KKyAqIE91dAorICoJQWx3YXlzIHJldHVybnMgemVybyAoMCkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtYWNfZHJ2X3J4X2luaXQoc3RydWN0IHNfc21jICpzbWMsIGludCBsZW4sIGludCBmYywKKwkJICAgIGNoYXIgKmxvb2tfYWhlYWQsIGludCBsYV9sZW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCVBSSU5USygiZW50ZXJpbmcgbWFjX2Rydl9yeF9pbml0KGxlbj0lZClcbiIsIGxlbik7CisKKwkvLyAiUmVjZWl2ZWQiIGEgU01UIG9yIE5TQSBmcmFtZSBvZiB0aGUgbG9jYWwgU01ULgorCisJaWYgKGxlbiAhPSBsYV9sZW4gfHwgbGVuIDwgRkRESV9NQUNfSERSX0xFTiB8fCAhbG9va19haGVhZCkgeworCQlQUklOVEsoImZkZGk6IERpc2NhcmQgaW52YWxpZCBsb2NhbCBTTVQgZnJhbWVcbiIpOworCQlQUklOVEsoIiAgbGVuPSVkLCBsYV9sZW49JWQsIChVTE9ORykgbG9va19haGVhZD0lMDhsWGguXG4iLAorCQkgICAgICAgbGVuLCBsYV9sZW4sICh1bnNpZ25lZCBsb25nKSBsb29rX2FoZWFkKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJc2tiID0gYWxsb2Nfc2tiKGxlbiArIDMsIEdGUF9BVE9NSUMpOworCWlmICghc2tiKSB7CisJCVBSSU5USygiZmRkaTogTG9jYWwgU01UOiBza2IgbWVtb3J5IGV4aGF1c3RlZC5cbiIpOworCQlyZXR1cm4gKDApOworCX0KKwlza2JfcmVzZXJ2ZShza2IsIDMpOworCXNrYl9wdXQoc2tiLCBsZW4pOworCW1lbWNweShza2ItPmRhdGEsIGxvb2tfYWhlYWQsIGxlbik7CisKKwkvLyBkZWxpdmVyIGZyYW1lIHRvIHN5c3RlbQorCXNrYi0+cHJvdG9jb2wgPSBmZGRpX3R5cGVfdHJhbnMoc2tiLCBzbWMtPm9zLmRldik7CisJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCW5ldGlmX3J4KHNrYik7CisKKwlyZXR1cm4gKDApOworfQkJCQkvLyBtYWNfZHJ2X3J4X2luaXQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJc210X3RpbWVyX3BvbGwKKyAqCisgKglUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHBlcmlvZGljYWxseSBieSB0aGUgU01UIG1vZHVsZSB0byBjbGVhbiB1cCB0aGUKKyAqCWRyaXZlci4KKyAqCisgKglSZXR1cm4gYW55IHF1ZXVlZCBmcmFtZXMgYmFjayB0byB0aGUgdXBwZXIgcHJvdG9jb2wgbGF5ZXJzIGlmIHRoZSByaW5nCisgKglpcyBkb3duLgorICogQXJncworICoJc21jIC0gQSBwb2ludGVyIHRvIHRoZSBTTVQgY29udGV4dCBzdHJ1Y3QuCisgKiBPdXQKKyAqCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc210X3RpbWVyX3BvbGwoc3RydWN0IHNfc21jICpzbWMpCit7Cit9CQkJCS8vIHNtdF90aW1lcl9wb2xsCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCXJpbmdfc3RhdHVzX2luZGljYXRpb24KKyAqCisgKglUaGlzIGZ1bmN0aW9uIGluZGljYXRlcyBhIGNoYW5nZSBvZiB0aGUgcmluZyBzdGF0ZS4KKyAqIEFyZ3MKKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIGNvbnRleHQgc3RydWN0LgorICoKKyAqCXN0YXR1cyAtIFRoZSBjdXJyZW50IHJpbmcgc3RhdHVzLgorICogT3V0CisgKglOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHJpbmdfc3RhdHVzX2luZGljYXRpb24oc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyBzdGF0dXMpCit7CisJUFJJTlRLKCJyaW5nX3N0YXR1c19pbmRpY2F0aW9uKCAiKTsKKwlpZiAoc3RhdHVzICYgUlNfUkVTMTUpCisJCVBSSU5USygiUlNfUkVTMTUgIik7CisJaWYgKHN0YXR1cyAmIFJTX0hBUkRFUlJPUikKKwkJUFJJTlRLKCJSU19IQVJERVJST1IgIik7CisJaWYgKHN0YXR1cyAmIFJTX1NPRlRFUlJPUikKKwkJUFJJTlRLKCJSU19TT0ZURVJST1IgIik7CisJaWYgKHN0YXR1cyAmIFJTX0JFQUNPTikKKwkJUFJJTlRLKCJSU19CRUFDT04gIik7CisJaWYgKHN0YXR1cyAmIFJTX1BBVEhURVNUKQorCQlQUklOVEsoIlJTX1BBVEhURVNUICIpOworCWlmIChzdGF0dXMgJiBSU19TRUxGVEVTVCkKKwkJUFJJTlRLKCJSU19TRUxGVEVTVCAiKTsKKwlpZiAoc3RhdHVzICYgUlNfUkVTOSkKKwkJUFJJTlRLKCJSU19SRVM5ICIpOworCWlmIChzdGF0dXMgJiBSU19ESVNDT05ORUNUKQorCQlQUklOVEsoIlJTX0RJU0NPTk5FQ1QgIik7CisJaWYgKHN0YXR1cyAmIFJTX1JFUzcpCisJCVBSSU5USygiUlNfUkVTNyAiKTsKKwlpZiAoc3RhdHVzICYgUlNfRFVQQUREUikKKwkJUFJJTlRLKCJSU19EVVBBRERSICIpOworCWlmIChzdGF0dXMgJiBSU19OT1JJTkdPUCkKKwkJUFJJTlRLKCJSU19OT1JJTkdPUCAiKTsKKwlpZiAoc3RhdHVzICYgUlNfVkVSU0lPTikKKwkJUFJJTlRLKCJSU19WRVJTSU9OICIpOworCWlmIChzdGF0dXMgJiBSU19TVFVDS0JZUEFTU1MpCisJCVBSSU5USygiUlNfU1RVQ0tCWVBBU1NTICIpOworCWlmIChzdGF0dXMgJiBSU19FVkVOVCkKKwkJUFJJTlRLKCJSU19FVkVOVCAiKTsKKwlpZiAoc3RhdHVzICYgUlNfUklOR09QQ0hBTkdFKQorCQlQUklOVEsoIlJTX1JJTkdPUENIQU5HRSAiKTsKKwlpZiAoc3RhdHVzICYgUlNfUkVTMCkKKwkJUFJJTlRLKCJSU19SRVMwICIpOworCVBSSU5USygiXVxuIik7Cit9CQkJCS8vIHJpbmdfc3RhdHVzX2luZGljYXRpb24KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJc210X2dldF90aW1lCisgKgorICoJR2V0cyB0aGUgY3VycmVudCB0aW1lIGZyb20gdGhlIHN5c3RlbS4KKyAqIEFyZ3MKKyAqCU5vbmUuCisgKiBPdXQKKyAqCVRoZSBjdXJyZW50IHRpbWUgaW4gVElDS1NfUEVSX1NFQ09ORC4KKyAqCisgKglUSUNLU19QRVJfU0VDT05EIGhhcyB0aGUgdW5pdCAnY291bnQgb2YgdGltZXIgdGlja3MgcGVyIHNlY29uZCcuIEl0IGlzCisgKglkZWZpbmVkIGluICJ0YXJnZXRvcy5oIi4gVGhlIGRlZmluaXRpb24gb2YgVElDS1NfUEVSX1NFQ09ORCBtdXN0IGNvbXBseQorICoJdG8gdGhlIHRpbWUgcmV0dXJuZWQgYnkgc210X2dldF90aW1lKCkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIGxvbmcgc210X2dldF90aW1lKHZvaWQpCit7CisJcmV0dXJuIGppZmZpZXM7Cit9CQkJCS8vIHNtdF9nZXRfdGltZQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglzbXRfc3RhdF9jb3VudGVyCisgKgorICoJU3RhdHVzIGNvdW50ZXIgdXBkYXRlIChyaW5nX29wLCBmaWZvIGZ1bGwpLgorICogQXJncworICoJc21jIC0gQSBwb2ludGVyIHRvIHRoZSBTTVQgY29udGV4dCBzdHJ1Y3QuCisgKgorICoJc3RhdCAtCT0gMDogQSByaW5nIG9wZXJhdGlvbmFsIGNoYW5nZSBvY2N1cnJlZC4KKyAqCQk9IDE6IFRoZSBGT1JNQUMgRklGTyBidWZmZXIgaXMgZnVsbCAvIEZJRk8gb3ZlcmZsb3cuCisgKiBPdXQKKyAqCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc210X3N0YXRfY291bnRlcihzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHN0YXQpCit7CisvLyAgICAgIEJPT0xFQU4gUmluZ0lzVXAgOworCisJUFJJTlRLKEtFUk5fSU5GTyAic210X3N0YXRfY291bnRlclxuIik7CisJc3dpdGNoIChzdGF0KSB7CisJY2FzZSAwOgorCQlQUklOVEsoS0VSTl9JTkZPICJSaW5nIG9wZXJhdGlvbmFsIGNoYW5nZS5cbiIpOworCQlicmVhazsKKwljYXNlIDE6CisJCVBSSU5USyhLRVJOX0lORk8gIlJlY2VpdmUgZmlmbyBvdmVyZmxvdy5cbiIpOworCQlzbWMtPm9zLk1hY1N0YXQuZ2VuLnJ4X2Vycm9ycysrOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlQUklOVEsoS0VSTl9JTkZPICJVbmtub3duIHN0YXR1cyAoJWQpLlxuIiwgc3RhdCk7CisJCWJyZWFrOworCX0KK30JCQkJLy8gc210X3N0YXRfY291bnRlcgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgljZm1fc3RhdGVfY2hhbmdlCisgKgorICoJU2V0cyBDRk0gc3RhdGUgaW4gY3VzdG9tIHN0YXRpc3RpY3MuCisgKiBBcmdzCisgKglzbWMgLSBBIHBvaW50ZXIgdG8gdGhlIFNNVCBjb250ZXh0IHN0cnVjdC4KKyAqCisgKgljX3N0YXRlIC0gUG9zc2libGUgdmFsdWVzIGFyZToKKyAqCisgKgkJRUMwX09VVCwgRUMxX0lOLCBFQzJfVFJBQ0UsIEVDM19MRUFWRSwgRUM0X1BBVEhfVEVTVCwKKyAqCQlFQzVfSU5TRVJULCBFQzZfQ0hFQ0ssIEVDN19ERUlOU0VSVAorICogT3V0CisgKglOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGNmbV9zdGF0ZV9jaGFuZ2Uoc3RydWN0IHNfc21jICpzbWMsIGludCBjX3N0YXRlKQoreworI2lmZGVmIERSSVZFUkRFQlVHCisJY2hhciAqczsKKworCXN3aXRjaCAoY19zdGF0ZSkgeworCWNhc2UgU0MwX0lTT0xBVEVEOgorCQlzID0gIlNDMF9JU09MQVRFRCI7CisJCWJyZWFrOworCWNhc2UgU0MxX1dSQVBfQToKKwkJcyA9ICJTQzFfV1JBUF9BIjsKKwkJYnJlYWs7CisJY2FzZSBTQzJfV1JBUF9COgorCQlzID0gIlNDMl9XUkFQX0IiOworCQlicmVhazsKKwljYXNlIFNDNF9USFJVX0E6CisJCXMgPSAiU0M0X1RIUlVfQSI7CisJCWJyZWFrOworCWNhc2UgU0M1X1RIUlVfQjoKKwkJcyA9ICJTQzVfVEhSVV9CIjsKKwkJYnJlYWs7CisJY2FzZSBTQzdfV1JBUF9TOgorCQlzID0gIlNDN19XUkFQX1MiOworCQlicmVhazsKKwljYXNlIFNDOV9DX1dSQVBfQToKKwkJcyA9ICJTQzlfQ19XUkFQX0EiOworCQlicmVhazsKKwljYXNlIFNDMTBfQ19XUkFQX0I6CisJCXMgPSAiU0MxMF9DX1dSQVBfQiI7CisJCWJyZWFrOworCWNhc2UgU0MxMV9DX1dSQVBfUzoKKwkJcyA9ICJTQzExX0NfV1JBUF9TIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUFJJTlRLKEtFUk5fSU5GTyAiY2ZtX3N0YXRlX2NoYW5nZTogdW5rbm93biAlZFxuIiwgY19zdGF0ZSk7CisJCXJldHVybjsKKwl9CisJUFJJTlRLKEtFUk5fSU5GTyAiY2ZtX3N0YXRlX2NoYW5nZTogJXNcbiIsIHMpOworI2VuZGlmCQkJCS8vIERSSVZFUkRFQlVHCit9CQkJCS8vIGNmbV9zdGF0ZV9jaGFuZ2UKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJZWNtX3N0YXRlX2NoYW5nZQorICoKKyAqCVNldHMgRUNNIHN0YXRlIGluIGN1c3RvbSBzdGF0aXN0aWNzLgorICogQXJncworICoJc21jIC0gQSBwb2ludGVyIHRvIHRoZSBTTVQgY29udGV4dCBzdHJ1Y3QuCisgKgorICoJZV9zdGF0ZSAtIFBvc3NpYmxlIHZhbHVlcyBhcmU6CisgKgorICoJCVNDMF9JU09MQVRFRCwgU0MxX1dSQVBfQSAoNSksIFNDMl9XUkFQX0IgKDYpLCBTQzRfVEhSVV9BICgxMiksCisgKgkJU0M1X1RIUlVfQiAoNyksIFNDN19XUkFQX1MgKDgpCisgKiBPdXQKKyAqCU5vdGhpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZWNtX3N0YXRlX2NoYW5nZShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGVfc3RhdGUpCit7CisjaWZkZWYgRFJJVkVSREVCVUcKKwljaGFyICpzOworCisJc3dpdGNoIChlX3N0YXRlKSB7CisJY2FzZSBFQzBfT1VUOgorCQlzID0gIkVDMF9PVVQiOworCQlicmVhazsKKwljYXNlIEVDMV9JTjoKKwkJcyA9ICJFQzFfSU4iOworCQlicmVhazsKKwljYXNlIEVDMl9UUkFDRToKKwkJcyA9ICJFQzJfVFJBQ0UiOworCQlicmVhazsKKwljYXNlIEVDM19MRUFWRToKKwkJcyA9ICJFQzNfTEVBVkUiOworCQlicmVhazsKKwljYXNlIEVDNF9QQVRIX1RFU1Q6CisJCXMgPSAiRUM0X1BBVEhfVEVTVCI7CisJCWJyZWFrOworCWNhc2UgRUM1X0lOU0VSVDoKKwkJcyA9ICJFQzVfSU5TRVJUIjsKKwkJYnJlYWs7CisJY2FzZSBFQzZfQ0hFQ0s6CisJCXMgPSAiRUM2X0NIRUNLIjsKKwkJYnJlYWs7CisJY2FzZSBFQzdfREVJTlNFUlQ6CisJCXMgPSAiRUM3X0RFSU5TRVJUIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcyA9ICJ1bmtub3duIjsKKwkJYnJlYWs7CisJfQorCVBSSU5USyhLRVJOX0lORk8gImVjbV9zdGF0ZV9jaGFuZ2U6ICVzXG4iLCBzKTsKKyNlbmRpZgkJCQkvL0RSSVZFUkRFQlVHCit9CQkJCS8vIGVjbV9zdGF0ZV9jaGFuZ2UKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJcm10X3N0YXRlX2NoYW5nZQorICoKKyAqCVNldHMgUk1UIHN0YXRlIGluIGN1c3RvbSBzdGF0aXN0aWNzLgorICogQXJncworICoJc21jIC0gQSBwb2ludGVyIHRvIHRoZSBTTVQgY29udGV4dCBzdHJ1Y3QuCisgKgorICoJcl9zdGF0ZSAtIFBvc3NpYmxlIHZhbHVlcyBhcmU6CisgKgorICoJCVJNMF9JU09MQVRFRCwgUk0xX05PTl9PUCwgUk0yX1JJTkdfT1AsIFJNM19ERVRFQ1QsCisgKgkJUk00X05PTl9PUF9EVVAsIFJNNV9SSU5HX09QX0RVUCwgUk02X0RJUkVDVEVELCBSTTdfVFJBQ0UKKyAqIE91dAorICoJTm90aGluZy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBybXRfc3RhdGVfY2hhbmdlKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcl9zdGF0ZSkKK3sKKyNpZmRlZiBEUklWRVJERUJVRworCWNoYXIgKnM7CisKKwlzd2l0Y2ggKHJfc3RhdGUpIHsKKwljYXNlIFJNMF9JU09MQVRFRDoKKwkJcyA9ICJSTTBfSVNPTEFURUQiOworCQlicmVhazsKKwljYXNlIFJNMV9OT05fT1A6CisJCXMgPSAiUk0xX05PTl9PUCAtIG5vdCBvcGVyYXRpb25hbCI7CisJCWJyZWFrOworCWNhc2UgUk0yX1JJTkdfT1A6CisJCXMgPSAiUk0yX1JJTkdfT1AgLSByaW5nIG9wZXJhdGlvbmFsIjsKKwkJYnJlYWs7CisJY2FzZSBSTTNfREVURUNUOgorCQlzID0gIlJNM19ERVRFQ1QgLSBkZXRlY3QgZHVwbCBhZGRyZXNzZXMiOworCQlicmVhazsKKwljYXNlIFJNNF9OT05fT1BfRFVQOgorCQlzID0gIlJNNF9OT05fT1BfRFVQIC0gZHVwbC4gYWRkciBkZXRlY3RlZCI7CisJCWJyZWFrOworCWNhc2UgUk01X1JJTkdfT1BfRFVQOgorCQlzID0gIlJNNV9SSU5HX09QX0RVUCAtIHJpbmcgb3Blci4gd2l0aCBkdXBsLiBhZGRyIjsKKwkJYnJlYWs7CisJY2FzZSBSTTZfRElSRUNURUQ6CisJCXMgPSAiUk02X0RJUkVDVEVEIC0gc2VuZGluZyBkaXJlY3RlZCBiZWFjb25zIjsKKwkJYnJlYWs7CisJY2FzZSBSTTdfVFJBQ0U6CisJCXMgPSAiUk03X1RSQUNFIC0gdHJhY2UgaW5pdGlhdGVkIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcyA9ICJ1bmtub3duIjsKKwkJYnJlYWs7CisJfQorCVBSSU5USyhLRVJOX0lORk8gIltybXRfc3RhdGVfY2hhbmdlOiAlc11cbiIsIHMpOworI2VuZGlmCQkJCS8vIERSSVZFUkRFQlVHCit9CQkJCS8vIHJtdF9zdGF0ZV9jaGFuZ2UKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJZHJ2X3Jlc2V0X2luZGljYXRpb24KKyAqCisgKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgU01UIHdoZW4gaXQgaGFzIGRldGVjdGVkIGEgc2V2ZXJlCisgKgloYXJkd2FyZSBwcm9ibGVtLiBUaGUgZHJpdmVyIHNob3VsZCBwZXJmb3JtIGEgcmVzZXQgb24gdGhlIGFkYXB0ZXIKKyAqCWFzIHNvb24gYXMgcG9zc2libGUsIGJ1dCBub3QgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbi4KKyAqIEFyZ3MKKyAqCXNtYyAtIEEgcG9pbnRlciB0byB0aGUgU01UIGNvbnRleHQgc3RydWN0LgorICogT3V0CisgKglOb3RoaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGRydl9yZXNldF9pbmRpY2F0aW9uKHN0cnVjdCBzX3NtYyAqc21jKQoreworCVBSSU5USyhLRVJOX0lORk8gImVudGVyaW5nIGRydl9yZXNldF9pbmRpY2F0aW9uXG4iKTsKKworCXNtYy0+b3MuUmVzZXRSZXF1ZXN0ZWQgPSBUUlVFOwkvLyBTZXQgZmxhZy4KKworfQkJCQkvLyBkcnZfcmVzZXRfaW5kaWNhdGlvbgorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc2tmZGRpX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInNrZmRkaSIsCisJLmlkX3RhYmxlCT0gc2tmZGRpX3BjaV90YmwsCisJLnByb2JlCQk9IHNrZnBfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChza2ZwX3JlbW92ZV9vbmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2tmZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmc2tmZGRpX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2tmZF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZza2ZkZGlfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNrZmRfaW5pdCk7Cittb2R1bGVfZXhpdChza2ZkX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9zbXQuYyBiL2RyaXZlcnMvbmV0L3NrZnAvc210LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE5MzVlYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvc210LmMKQEAgLTAsMCArMSwyMDk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiaC90eXBlcy5oIgorI2luY2x1ZGUgImgvZmRkaS5oIgorI2luY2x1ZGUgImgvc21jLmgiCisjaW5jbHVkZSAiaC9zbXRfcC5oIgorCisjZGVmaW5lIEtFUk5FTAorI2luY2x1ZGUgImgvc210c3RhdGUuaCIKKworI2lmbmRlZglsaW50CitzdGF0aWMgY29uc3QgY2hhciBJRF9zY2NzW10gPSAiQCgjKXNtdC5jCTIuNDMgOTgvMTEvMjMgKEMpIFNLICIgOworI2VuZGlmCisKK2V4dGVybiBjb25zdCB1X2NoYXIgY2Fub25pY2FsWzI1Nl0gOworCisvKgorICogRkMgaW4gU01idWYKKyAqLworI2RlZmluZSBtX2ZjKG1iKQkoKG1iKS0+c21fZGF0YVswXSkKKworI2RlZmluZSBTTVRfVElEX01BR0lDCTB4MWYwYTdiM2MKKworI2lmZGVmCURFQlVHCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc210X3R5cGVfbmFtZVtdID0geworCSJTTVRfMDA/PyIsICJTTVRfSU5GTyIsICJTTVRfMDI/PyIsICJTTVRfMDM/PyIsCisJIlNNVF8wND8/IiwgIlNNVF8wNT8/IiwgIlNNVF8wNj8/IiwgIlNNVF8wNz8/IiwKKwkiU01UXzA4Pz8iLCAiU01UXzA5Pz8iLCAiU01UXzBBPz8iLCAiU01UXzBCPz8iLAorCSJTTVRfMEM/PyIsICJTTVRfMEQ/PyIsICJTTVRfMEU/PyIsICJTTVRfTlNBIgorfSA7CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzbXRfY2xhc3NfbmFtZVtdID0geworCSJVTktOT1dOIiwiTklGIiwiU0lGX0NPTkZJRyIsIlNJRl9PUEVSIiwiRUNGIiwiUkFGIiwiUkRGIiwKKwkiU1JGIiwiUE1GX0dFVCIsIlBNRl9TRVQiLCJFU0YiCit9IDsKKyNlbmRpZgorI2RlZmluZSBMQVNUX0NMQVNTCShTTVRfUE1GX1NFVCkKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmZGRpX2FkZHIgU01UX1Vua25vd24gPSB7CisJeyAwLDAsMHgxZiwwLDAsMCB9Cit9IDsKKworLyoKKyAqIGV4dGVybmFsIHZhcmlhYmxlcworICovCitleHRlcm4gY29uc3Qgc3RydWN0IGZkZGlfYWRkciBmZGRpX2Jyb2FkY2FzdCA7CisKKy8qCisgKiBleHRlcm5hbCBmdW5jdGlvbnMKKyAqLworaW50IHBjbV9zdGF0dXNfdHdpc3RlZChzdHJ1Y3Qgc19zbWMgKnNtYyk7CisKKy8qCisgKiBmdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KKyNpZmRlZglMSVRUTEVfRU5ESUFOCitzdGF0aWMgaW50IHNtdF9zd2FwX3Nob3J0KHVfc2hvcnQgcyk7CisjZW5kaWYKK3N0YXRpYyBpbnQgbWFjX2luZGV4KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbWFjKTsKK3N0YXRpYyBpbnQgcGh5X2luZGV4KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcGh5KTsKK3N0YXRpYyBpbnQgbWFjX2Nvbl9yZXNvdXJjZV9pbmRleChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG1hYyk7CitzdGF0aWMgaW50IHBoeV9jb25fcmVzb3VyY2VfaW5kZXgoc3RydWN0IHNfc21jICpzbWMsIGludCBwaHkpOworc3RhdGljIHZvaWQgc210X3NlbmRfcmRmKHN0cnVjdCBzX3NtYyAqc21jLCBTTWJ1ZiAqcmVqLCBpbnQgZmMsIGludCByZWFzb24sCisJCQkgaW50IGxvY2FsKTsKK3N0YXRpYyB2b2lkIHNtdF9zZW5kX25pZihzdHJ1Y3Qgc19zbWMgKnNtYywgY29uc3Qgc3RydWN0IGZkZGlfYWRkciAqZGVzdCwgCisJCQkgaW50IGZjLCB1X2xvbmcgdGlkLCBpbnQgdHlwZSwgaW50IGxvY2FsKTsKK3N0YXRpYyB2b2lkIHNtdF9zZW5kX2VjZihzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IGZkZGlfYWRkciAqZGVzdCwgaW50IGZjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVfbG9uZyB0aWQsIGludCB0eXBlLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIHNtdF9lY2hvX3Rlc3Qoc3RydWN0IHNfc21jICpzbWMsIGludCBkbmEpOworc3RhdGljIHZvaWQgc210X3NlbmRfc2lmX2NvbmZpZyhzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IGZkZGlfYWRkciAqZGVzdCwKKwkJCQl1X2xvbmcgdGlkLCBpbnQgbG9jYWwpOworc3RhdGljIHZvaWQgc210X3NlbmRfc2lmX29wZXJhdGlvbihzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IGZkZGlfYWRkciAqZGVzdCwKKwkJCQkgICB1X2xvbmcgdGlkLCBpbnQgbG9jYWwpOworI2lmZGVmIExJVFRMRV9FTkRJQU4KK3N0YXRpYyB2b2lkIHNtdF9zdHJpbmdfc3dhcCh2b2lkKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgc210X2FkZF9mcmFtZV9sZW4oU01idWYgKm1iLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIHNtdF9maWxsX3VuYShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX3VuYSAqdW5hKTsKK3N0YXRpYyB2b2lkIHNtdF9maWxsX3NkZShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX3NkZSAqc2RlKTsKK3N0YXRpYyB2b2lkIHNtdF9maWxsX3N0YXRlKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3Bfc3RhdGUgKnN0YXRlKTsKK3N0YXRpYyB2b2lkIHNtdF9maWxsX3RpbWVzdGFtcChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX3RpbWVzdGFtcCAqdHMpOworc3RhdGljIHZvaWQgc210X2ZpbGxfcG9saWN5KHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BfcG9saWN5ICpwb2xpY3kpOworc3RhdGljIHZvaWQgc210X2ZpbGxfbGF0ZW5jeShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX2xhdGVuY3kgKmxhdGVuY3kpOworc3RhdGljIHZvaWQgc210X2ZpbGxfbmVpZ2hib3Ioc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfcF9uZWlnaGJvciAqbmVpZ2hib3IpOworc3RhdGljIGludCBzbXRfZmlsbF9wYXRoKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BfcGF0aCAqcGF0aCk7CitzdGF0aWMgdm9pZCBzbXRfZmlsbF9tYWNfc3RhdHVzKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BfbWFjX3N0YXR1cyAqc3QpOworc3RhdGljIHZvaWQgc210X2ZpbGxfbGVtKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BfbGVtICpsZW0sIGludCBwaHkpOworc3RhdGljIHZvaWQgc210X2ZpbGxfdmVyc2lvbihzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX3ZlcnNpb24gKnZlcnMpOworc3RhdGljIHZvaWQgc210X2ZpbGxfZnNjKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BfZnNjICpmc2MpOworc3RhdGljIHZvaWQgc210X2ZpbGxfbWFjX2NvdW50ZXIoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfcF9tYWNfY291bnRlciAqbWMpOworc3RhdGljIHZvaWQgc210X2ZpbGxfbWFjX2ZuYyhzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX21hY19mbmMgKmZuYyk7CitzdGF0aWMgdm9pZCBzbXRfZmlsbF9tYW51ZmFjdHVyZXIoc3RydWN0IHNfc21jICpzbWMsIAorCQkJCSAgc3RydWN0IHNtcF9wX21hbnVmYWN0dXJlciAqbWFuKTsKK3N0YXRpYyB2b2lkIHNtdF9maWxsX3VzZXIoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXBfcF91c2VyICp1c2VyKTsKK3N0YXRpYyB2b2lkIHNtdF9maWxsX3NldGNvdW50KHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3Bfc2V0Y291bnQgKnNldGNvdW50KTsKK3N0YXRpYyB2b2lkIHNtdF9maWxsX2VjaG8oc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfcF9lY2hvICplY2hvLCB1X2xvbmcgc2VlZCwKKwkJCSAgaW50IGxlbik7CisKK3ZvaWQgc210X2NsZWFyX3VuYV9kbmEoc3RydWN0IHNfc21jICpzbWMpOworc3RhdGljIHZvaWQgc210X2NsZWFyX29sZF91bmFfZG5hKHN0cnVjdCBzX3NtYyAqc21jKTsKKyNpZmRlZglDT05DRU5UUkFUT1IKK3N0YXRpYyBpbnQgZW50aXR5X3RvX2luZGV4KHZvaWQpOworI2VuZGlmCitzdGF0aWMgdm9pZCB1cGRhdGVfZGFjKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcmVwb3J0KTsKK3N0YXRpYyBpbnQgZGl2X3JhdGlvKHVfbG9uZyB1cHBlciwgdV9sb25nIGxvd2VyKTsKKyNpZmRlZiAgVVNFX0NBTl9BRERSCit2b2lkCWh3bV9jb252X2NhbihzdHJ1Y3Qgc19zbWMgKnNtYywgY2hhciAqZGF0YSwgaW50IGxlbik7CisjZWxzZQorI2RlZmluZQkJaHdtX2NvbnZfY2FuKHNtYyxkYXRhLGxlbikKKyNlbmRpZgorCisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX215X2FkZHIoY29uc3Qgc3RydWN0IHNfc21jICpzbWMsIAorCQkJICAgICBjb25zdCBzdHJ1Y3QgZmRkaV9hZGRyICphZGRyKQoreworCXJldHVybigqKHNob3J0ICopKCZhZGRyLT5hWzBdKSA9PQorCQkqKHNob3J0ICopKCZzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNTTVRBZGRyZXNzLmFbMF0pCisJICAmJiAqKHNob3J0ICopKCZhZGRyLT5hWzJdKSA9PQorCQkqKHNob3J0ICopKCZzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNTTVRBZGRyZXNzLmFbMl0pCisJICAmJiAqKHNob3J0ICopKCZhZGRyLT5hWzRdKSA9PQorCQkqKHNob3J0ICopKCZzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNTTVRBZGRyZXNzLmFbNF0pKSA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2Jyb2FkY2FzdChjb25zdCBzdHJ1Y3QgZmRkaV9hZGRyICphZGRyKQoreworCXJldHVybigqKHVfc2hvcnQgKikoJmFkZHItPmFbMF0pID09IDB4ZmZmZiAmJgorCSAgICAgICAqKHVfc2hvcnQgKikoJmFkZHItPmFbMl0pID09IDB4ZmZmZiAmJgorCSAgICAgICAqKHVfc2hvcnQgKikoJmFkZHItPmFbNF0pID09IDB4ZmZmZiApIDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfaW5kaXZpZHVhbChjb25zdCBzdHJ1Y3QgZmRkaV9hZGRyICphZGRyKQoreworCXJldHVybighKGFkZHItPmFbMF0gJiBHUk9VUF9BRERSKSkgOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19lcXVhbChjb25zdCBzdHJ1Y3QgZmRkaV9hZGRyICphZGRyMSwgCisJCQkgICBjb25zdCBzdHJ1Y3QgZmRkaV9hZGRyICphZGRyMikKK3sKKwlyZXR1cm4oKih1X3Nob3J0ICopKCZhZGRyMS0+YVswXSkgPT0gKih1X3Nob3J0ICopKCZhZGRyMi0+YVswXSkgJiYKKwkgICAgICAgKih1X3Nob3J0ICopKCZhZGRyMS0+YVsyXSkgPT0gKih1X3Nob3J0ICopKCZhZGRyMi0+YVsyXSkgJiYKKwkgICAgICAgKih1X3Nob3J0ICopKCZhZGRyMS0+YVs0XSkgPT0gKih1X3Nob3J0ICopKCZhZGRyMi0+YVs0XSkgKSA7Cit9CisKKy8qCisgKiBsaXN0IG9mIG1hbmRhdG9yeSBwYXJhcyBpbiBmcmFtZXMKKyAqLworc3RhdGljIGNvbnN0IHVfc2hvcnQgcGxpc3RfbmlmW10gPSB7IFNNVF9QX1VOQSxTTVRfUF9TREUsU01UX1BfU1RBVEUsMCB9IDsKKworLyoKKyAqIGluaXQgU01UIGFnZW50CisgKi8KK3ZvaWQgc210X2FnZW50X2luaXQoc3RydWN0IHNfc21jICpzbWMpCit7CisJaW50CQlpIDsKKworCS8qCisJICogZ2V0IE1BQyBhZGRyZXNzCisJICovCisJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDU01UQWRkcmVzcyA9IHNtYy0+aHcuZmRkaV9ob21lX2FkZHIgOworCisJLyoKKwkgKiBnZXQgT1VJIGFkZHJlc3MgZnJvbSBkcml2ZXIgKGJpYSA9PSBidWlsdC1pbi1hZGRyZXNzKQorCSAqLworCXNtYy0+bWliLmZkZGlTTVRTdGF0aW9uSWQuc2lkX29lbVswXSA9IDAgOworCXNtYy0+bWliLmZkZGlTTVRTdGF0aW9uSWQuc2lkX29lbVsxXSA9IDAgOworCWRyaXZlcl9nZXRfYmlhKHNtYywmc21jLT5taWIuZmRkaVNNVFN0YXRpb25JZC5zaWRfbm9kZSkgOworCWZvciAoaSA9IDAgOyBpIDwgNiA7IGkgKyspIHsKKwkJc21jLT5taWIuZmRkaVNNVFN0YXRpb25JZC5zaWRfbm9kZS5hW2ldID0KKwkJCWNhbm9uaWNhbFtzbWMtPm1pYi5mZGRpU01UU3RhdGlvbklkLnNpZF9ub2RlLmFbaV1dIDsKKwl9CisJc21jLT5taWIuZmRkaVNNVE1hbnVmYWN0dXJlckRhdGFbMF0gPQorCQlzbWMtPm1pYi5mZGRpU01UU3RhdGlvbklkLnNpZF9ub2RlLmFbMF0gOworCXNtYy0+bWliLmZkZGlTTVRNYW51ZmFjdHVyZXJEYXRhWzFdID0KKwkJc21jLT5taWIuZmRkaVNNVFN0YXRpb25JZC5zaWRfbm9kZS5hWzFdIDsKKwlzbWMtPm1pYi5mZGRpU01UTWFudWZhY3R1cmVyRGF0YVsyXSA9CisJCXNtYy0+bWliLmZkZGlTTVRTdGF0aW9uSWQuc2lkX25vZGUuYVsyXSA7CisJc21jLT5zbS5zbXRfdGlkID0gMCA7CisJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRHVwQWRkcmVzc1Rlc3QgPSBEQV9OT05FIDsKKwlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNVTkRBX0ZsYWcgPSBGQUxTRSA7CisjaWZuZGVmCVNMSU1fU01UCisJc210X2NsZWFyX3VuYV9kbmEoc21jKSA7CisJc210X2NsZWFyX29sZF91bmFfZG5hKHNtYykgOworI2VuZGlmCisJZm9yIChpID0gMCA7IGkgPCBTTVRfTUFYX1RFU1QgOyBpKyspCisJCXNtYy0+c20ucGVuZFtpXSA9IDAgOworCXNtYy0+c20ucGxlYXNlX3JlY29ubmVjdCA9IDAgOworCXNtYy0+c20udW5pcV90aWNrcyA9IDAgOworfQorCisvKgorICogU01UIHRhc2sKKyAqIGZvcmV2ZXIKKyAqCWRlbGF5IDMwIHNlY29uZHMKKyAqCXNlbmQgTklGCisgKgljaGVjayB0dnUgJiB0dmQKKyAqIGVuZAorICovCit2b2lkIHNtdF9hZ2VudF90YXNrKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXNtdF90aW1lcl9zdGFydChzbWMsJnNtYy0+c20uc210X3RpbWVyLCAodV9sb25nKTEwMDAwMDBMLAorCQlFVl9UT0tFTihFVkVOVF9TTVQsU01fVElNRVIpKSA7CisJREJfU01UKCJTTVQgYWdlbnQgdGFza1xuIiwwLDApIDsKK30KKwordm9pZCBzbXRfcGxlYXNlX3JlY29ubmVjdChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHJlY29ubl90aW1lKQorLyogc3RydWN0IHNfc21jCSpzbWM7ICBQb2ludGVyIHRvIFNNVCBjb250ZXh0ICovCisvKiBpbnQgcmVjb25uX3RpbWU7ICAgIFdhaXQgZm9yIHJlY29ubmVjdCB0aW1lIGluIHNlY29uZHMgKi8KK3sKKwkvKgorCSAqIFRoZSBwbGVhc2UgcmVjb25uZWN0IHZhcmlhYmxlIGlzIHVzZWQgYXMgYSB0aW1lci4KKwkgKiBJdCBpcyBkZWNyZW1lbnRlZCBlYWNoIHRpbWUgc210X2V2ZW50IGlzIGNhbGxlZC4KKwkgKiBUaGlzIGhhcHBlbnMgZXZlcnkgc2Vjb25kIG9yIHdoZW4gc210X2ZvcmNlX2lycSBpcyBjYWxsZWQuCisJICogTm90ZTogc210X2ZvcmNlX2lycSAoKSBpcyBjYWxsZWQgb24gc29tZSBwYWNrZXQgcmVjZWl2ZXMgYW5kCisJICogICAgICAgd2hlbiBhIG11bHRpY2FzdCBhZGRyZXNzIGlzIGNoYW5nZWQuIFNpbmNlIG5vdGhpbmcKKwkgKiAgICAgICBpcyByZWNlaXZlZCBkdXJpbmcgdGhlIGRpc2Nvbm5lY3QgYW5kIHRoZSBtdWx0aWNhc3QKKwkgKiAgICAgICBhZGRyZXNzIGNoYW5nZXMgY2FuIGJlIHZpZXdlZCBhcyBub3QgdmVyeSBvZnRlbiBhbmQKKwkgKiAgICAgICB0aGUgdGltZXIgcnVucyBvdXQgY2xvc2UgdG8gaXRzIGdpdmVuIHZhbHVlCisJICogICAgICAgKHJlY29ubl90aW1lKS4KKwkgKi8KKwlzbWMtPnNtLnBsZWFzZV9yZWNvbm5lY3QgPSByZWNvbm5fdGltZSA7Cit9CisKKyNpZm5kZWYgU01UX1JFQUxfVE9LRU5fQ1QKK3ZvaWQgc210X2VtdWxhdGVfdG9rZW5fY3Qoc3RydWN0IHNfc21jICpzbWMsIGludCBtYWNfaW5kZXgpCit7CisJdV9sb25nCWNvdW50OworCXVfbG9uZwl0aW1lOworCisKKwl0aW1lID0gc210X2dldF90aW1lKCk7CisJY291bnQgPQkoKHRpbWUgLSBzbWMtPnNtLmxhc3RfdG9rX3RpbWVbbWFjX2luZGV4XSkgKgorCQkJCQkxMDApL1RJQ0tTX1BFUl9TRUNPTkQ7CisKKwkvKgorCSAqIE9ubHkgd2hlbiByaW5nIGlzIHVwIHdlIHdpbGwgaGF2ZSBhIHRva2VuIGNvdW50LiBUaGUKKwkgKiBmbGFnIGlzIHVuZm9ydHVuYXRseSBhIHNpbmdsZSBpbnN0YW5jZSB2YWx1ZS4gVGhpcworCSAqIGRvZXNuJ3QgbWF0dGVyIG5vdywgYmVjYXVzZSB3ZSBjdXJyZW50bHkgaGF2ZSBvbmx5CisJICogb25lIE1BQyBpbnN0YW5jZS4KKwkgKi8KKwlpZiAoc21jLT5ody5tYWNfcmluZ19pc191cCl7CisJCXNtYy0+bWliLm1bbWFjX2luZGV4XS5mZGRpTUFDVG9rZW5fQ3QgKz0gY291bnQ7CisJfQorCisJLyogUmVtZW1iZXIgY3VycmVudCB0aW1lICovCisJc21jLT5zbS5sYXN0X3Rva190aW1lW21hY19pbmRleF0gPSB0aW1lOworCit9CisjZW5kaWYKKworLypBUkdTVVNFRDEqLwordm9pZCBzbXRfZXZlbnQoc3RydWN0IHNfc21jICpzbWMsIGludCBldmVudCkKK3sKKwl1X2xvbmcJCXRpbWUgOworI2lmbmRlZiBTTVRfUkVBTF9UT0tFTl9DVAorCWludAkJaSA7CisjZW5kaWYKKworCisJaWYgKHNtYy0+c20ucGxlYXNlX3JlY29ubmVjdCkgeworCQlzbWMtPnNtLnBsZWFzZV9yZWNvbm5lY3QgLS0gOworCQlpZiAoc21jLT5zbS5wbGVhc2VfcmVjb25uZWN0ID09IDApIHsKKwkJCS8qIENvdW50ZWQgZG93biAqLworCQkJcXVldWVfZXZlbnQoc21jLEVWRU5UX0VDTSxFQ19DT05ORUNUKSA7CisJCX0KKwl9CisKKwlpZiAoZXZlbnQgPT0gU01fRkFTVCkKKwkJcmV0dXJuIDsKKworCS8qCisJICogdGltZXIgZm9yIHBlcmlvZGljIGNsZWFudXAgaW4gZHJpdmVyCisJICogcmVzZXQgYW5kIHN0YXJ0IHRoZSB3YXRjaGRvZyAoRk0yKQorCSAqIEVTUyB0aW1lcgorCSAqIFNCQSB0aW1lcgorCSAqLworCXNtdF90aW1lcl9wb2xsKHNtYykgOworCXNtdF9zdGFydF93YXRjaGRvZyhzbWMpIDsKKyNpZm5kZWYJU0xJTV9TTVQKKyNpZm5kZWYgQk9PVAorI2lmZGVmCUVTUworCWVzc190aW1lcl9wb2xsKHNtYykgOworI2VuZGlmCisjZW5kaWYKKyNpZmRlZglTQkEKKwlzYmFfdGltZXJfcG9sbChzbWMpIDsKKyNlbmRpZgorCisJc210X3NyZl9ldmVudChzbWMsMCwwLDApIDsKKworI2VuZGlmCS8qIG5vIFNMSU1fU01UICovCisKKwl0aW1lID0gc210X2dldF90aW1lKCkgOworCisJaWYgKHRpbWUgLSBzbWMtPnNtLnNtdF9sYXN0X2xlbSA+PSBUSUNLU19QRVJfU0VDT05EKjgpIHsKKwkJLyoKKwkJICogVXNlIDggc2VjLiBmb3IgdGhlIHRpbWUgaW50ZXJ2YWxsLCBpdCBzaW1wbGlmaWVzIHRoZQorCQkgKiBMRVIgZXN0aW1hdGlvbi4KKwkJICovCisJCXN0cnVjdCBmZGRpX21pYl9tCSptaWIgOworCQl1X2xvbmcJCQl1cHBlciA7CisJCXVfbG9uZwkJCWxvd2VyIDsKKwkJaW50CQkJY29uZCA7CisJCWludAkJCXBvcnQ7CisJCXN0cnVjdCBzX3BoeQkJKnBoeSA7CisJCS8qCisJCSAqIGNhbGN1bGF0ZSBMRU0gYml0IGVycm9yIHJhdGUKKwkJICovCisJCXNtX2xlbV9ldmFsdWF0ZShzbWMpIDsKKwkJc21jLT5zbS5zbXRfbGFzdF9sZW0gPSB0aW1lIDsKKworCQkvKgorCQkgKiBjaGVjayBjb25kaXRpb25zCisJCSAqLworI2lmbmRlZglTTElNX1NNVAorCQltYWNfdXBkYXRlX2NvdW50ZXIoc21jKSA7CisJCW1pYiA9IHNtYy0+bWliLm0gOworCQl1cHBlciA9CisJCShtaWItPmZkZGlNQUNMb3N0X0N0IC0gbWliLT5mZGRpTUFDT2xkX0xvc3RfQ3QpICsKKwkJKG1pYi0+ZmRkaU1BQ0Vycm9yX0N0IC0gbWliLT5mZGRpTUFDT2xkX0Vycm9yX0N0KSA7CisJCWxvd2VyID0KKwkJKG1pYi0+ZmRkaU1BQ0ZyYW1lX0N0IC0gbWliLT5mZGRpTUFDT2xkX0ZyYW1lX0N0KSArCisJCShtaWItPmZkZGlNQUNMb3N0X0N0IC0gbWliLT5mZGRpTUFDT2xkX0xvc3RfQ3QpIDsKKwkJbWliLT5mZGRpTUFDRnJhbWVFcnJvclJhdGlvID0gZGl2X3JhdGlvKHVwcGVyLGxvd2VyKSA7CisKKwkJY29uZCA9CisJCQkoKCFtaWItPmZkZGlNQUNGcmFtZUVycm9yVGhyZXNob2xkICYmCisJCQltaWItPmZkZGlNQUNFcnJvcl9DdCAhPSBtaWItPmZkZGlNQUNPbGRfRXJyb3JfQ3QpIHx8CisJCQkobWliLT5mZGRpTUFDRnJhbWVFcnJvclJhdGlvID4KKwkJCW1pYi0+ZmRkaU1BQ0ZyYW1lRXJyb3JUaHJlc2hvbGQpKSA7CisKKwkJaWYgKGNvbmQgIT0gbWliLT5mZGRpTUFDRnJhbWVFcnJvckZsYWcpCisJCQlzbXRfc3JmX2V2ZW50KHNtYyxTTVRfQ09ORF9NQUNfRlJBTUVfRVJST1IsCisJCQkJSU5ERVhfTUFDLGNvbmQpIDsKKworCQl1cHBlciA9CisJCShtaWItPmZkZGlNQUNOb3RDb3BpZWRfQ3QgLSBtaWItPmZkZGlNQUNPbGRfTm90Q29waWVkX0N0KSA7CisJCWxvd2VyID0KKwkJdXBwZXIgKworCQkobWliLT5mZGRpTUFDQ29waWVkX0N0IC0gbWliLT5mZGRpTUFDT2xkX0NvcGllZF9DdCkgOworCQltaWItPmZkZGlNQUNOb3RDb3BpZWRSYXRpbyA9IGRpdl9yYXRpbyh1cHBlcixsb3dlcikgOworCisJCWNvbmQgPQorCQkJKCghbWliLT5mZGRpTUFDTm90Q29waWVkVGhyZXNob2xkICYmCisJCQltaWItPmZkZGlNQUNOb3RDb3BpZWRfQ3QgIT0KKwkJCQltaWItPmZkZGlNQUNPbGRfTm90Q29waWVkX0N0KXx8CisJCQkobWliLT5mZGRpTUFDTm90Q29waWVkUmF0aW8gPgorCQkJbWliLT5mZGRpTUFDTm90Q29waWVkVGhyZXNob2xkKSkgOworCisJCWlmIChjb25kICE9IG1pYi0+ZmRkaU1BQ05vdENvcGllZEZsYWcpCisJCQlzbXRfc3JmX2V2ZW50KHNtYyxTTVRfQ09ORF9NQUNfTk9UX0NPUElFRCwKKwkJCQlJTkRFWF9NQUMsY29uZCkgOworCisJCS8qCisJCSAqIHNldCBvbGQgdmFsdWVzCisJCSAqLworCQltaWItPmZkZGlNQUNPbGRfRnJhbWVfQ3QgPSBtaWItPmZkZGlNQUNGcmFtZV9DdCA7CisJCW1pYi0+ZmRkaU1BQ09sZF9Db3BpZWRfQ3QgPSBtaWItPmZkZGlNQUNDb3BpZWRfQ3QgOworCQltaWItPmZkZGlNQUNPbGRfRXJyb3JfQ3QgPSBtaWItPmZkZGlNQUNFcnJvcl9DdCA7CisJCW1pYi0+ZmRkaU1BQ09sZF9Mb3N0X0N0ID0gbWliLT5mZGRpTUFDTG9zdF9DdCA7CisJCW1pYi0+ZmRkaU1BQ09sZF9Ob3RDb3BpZWRfQ3QgPSBtaWItPmZkZGlNQUNOb3RDb3BpZWRfQ3QgOworCisJCS8qCisJCSAqIENoZWNrIHBvcnQgRUJFcnJvciBDb25kaXRpb24KKwkJICovCisJCWZvciAocG9ydCA9IDA7IHBvcnQgPCBOVU1QSFlTOyBwb3J0ICsrKSB7CisJCQlwaHkgPSAmc21jLT55W3BvcnRdIDsKKworCQkJaWYgKCFwaHktPm1pYi0+ZmRkaVBPUlRIYXJkd2FyZVByZXNlbnQpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJY29uZCA9IChwaHktPm1pYi0+ZmRkaVBPUlRFQkVycm9yX0N0IC0KKwkJCQlwaHktPm1pYi0+ZmRkaVBPUlRPbGRFQkVycm9yX0N0ID4gNSkgOworCisJCQkvKiBJZiByYXRpbyBpcyBtb3JlIHRoYW4gNSBpbiA4IHNlY29uZHMKKwkJCSAqIFNldCB0aGUgY29uZGl0aW9uLgorCQkJICovCisJCQlzbXRfc3JmX2V2ZW50KHNtYyxTTVRfQ09ORF9QT1JUX0VCX0VSUk9SLAorCQkJCShpbnQpIChJTkRFWF9QT1JUKyBwaHktPm5wKSAsY29uZCkgOworCisJCQkvKgorCQkJICogc2V0IG9sZCB2YWx1ZXMKKwkJCSAqLworCQkJcGh5LT5taWItPmZkZGlQT1JUT2xkRUJFcnJvcl9DdCA9CisJCQkJcGh5LT5taWItPmZkZGlQT1JURUJFcnJvcl9DdCA7CisJCX0KKworI2VuZGlmCS8qIG5vIFNMSU1fU01UICovCisJfQorCisjaWZuZGVmCVNMSU1fU01UCisKKwlpZiAodGltZSAtIHNtYy0+c20uc210X2xhc3Rfbm90aWZ5ID49ICh1X2xvbmcpCisJCShzbWMtPm1pYi5mZGRpU01UVFRfTm90aWZ5ICogVElDS1NfUEVSX1NFQ09ORCkgKSB7CisJCS8qCisJCSAqIHdlIGNhbiBlaXRoZXIgc2VuZCBhbiBhbm5vdW5jZW1lbnQgb3IgYSByZXF1ZXN0CisJCSAqIGEgcmVxdWVzdCB3aWxsIHRyaWdnZXIgYSByZXBseSBzbyB0aGF0IHdlIGNhbiB1cGRhdGUKKwkJICogb3VyIGRuYQorCQkgKiBub3RlOiBzYW1lIHRpZCBtdXN0IGJlIHVzZWQgdW50aWwgcmVwbHkgaXMgcmVjZWl2ZWQKKwkJICovCisJCWlmICghc21jLT5zbS5wZW5kW1NNVF9USURfTklGXSkKKwkJCXNtYy0+c20ucGVuZFtTTVRfVElEX05JRl0gPSBzbXRfZ2V0X3RpZChzbWMpIDsKKwkJc210X3NlbmRfbmlmKHNtYywmZmRkaV9icm9hZGNhc3QsIEZDX1NNVF9OU0EsCisJCQlzbWMtPnNtLnBlbmRbU01UX1RJRF9OSUZdLCBTTVRfUkVRVUVTVCwwKSA7CisJCXNtYy0+c20uc210X2xhc3Rfbm90aWZ5ID0gdGltZSA7CisJfQorCisJLyoKKwkgKiBjaGVjayB0aW1lcgorCSAqLworCWlmIChzbWMtPnNtLnNtdF90dnUgJiYKKwkgICAgdGltZSAtIHNtYy0+c20uc210X3R2dSA+IDIyOCpUSUNLU19QRVJfU0VDT05EKSB7CisJCURCX1NNVCgiU01UIDogVU5BIGV4cGlyZWRcbiIsMCwwKSA7CisJCXNtYy0+c20uc210X3R2dSA9IDAgOworCisJCWlmICghaXNfZXF1YWwoJnNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1Vwc3RyZWFtTmJyLAorCQkJJlNNVF9Vbmtub3duKSl7CisJCQkvKiBEbyBub3QgdXBkYXRlIHVua25vd24gYWRkcmVzcyAqLworCQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDT2xkVXBzdHJlYW1OYnI9CisJCQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDVXBzdHJlYW1OYnIgOworCQl9CisJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1Vwc3RyZWFtTmJyID0gU01UX1Vua25vd24gOworCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNVTkRBX0ZsYWcgPSBGQUxTRSA7CisJCS8qCisJCSAqIE1ha2Ugc3VyZSB0aGUgZmRkaU1BQ1VOREFfRmxhZyA9IEZBTFNFIGlzCisJCSAqIGluY2x1ZGVkIGluIHRoZSBTUkYgc28gd2UgZG9uJ3QgZ2VuZXJhdGUKKwkJICogYSBzZXBhcmF0ZSBTUkYgZm9yIHRoZSBkZWFzc2VydGlvbiBvZiB0aGlzCisJCSAqIGNvbmRpdGlvbgorCQkgKi8KKwkJdXBkYXRlX2RhYyhzbWMsMCkgOworCQlzbXRfc3JmX2V2ZW50KHNtYywgU01UX0VWRU5UX01BQ19ORUlHSEJPUl9DSEFOR0UsCisJCQlJTkRFWF9NQUMsMCkgOworCX0KKwlpZiAoc21jLT5zbS5zbXRfdHZkICYmCisJICAgIHRpbWUgLSBzbWMtPnNtLnNtdF90dmQgPiAyMjgqVElDS1NfUEVSX1NFQ09ORCkgeworCQlEQl9TTVQoIlNNVCA6IEROQSBleHBpcmVkXG4iLDAsMCkgOworCQlzbWMtPnNtLnNtdF90dmQgPSAwIDsKKwkJaWYgKCFpc19lcXVhbCgmc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRG93bnN0cmVhbU5iciwKKwkJCSZTTVRfVW5rbm93bikpeworCQkJLyogRG8gbm90IHVwZGF0ZSB1bmtub3duIGFkZHJlc3MgKi8KKwkJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ09sZERvd25zdHJlYW1OYnI9CisJCQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRG93bnN0cmVhbU5iciA7CisJCX0KKwkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRG93bnN0cmVhbU5iciA9IFNNVF9Vbmtub3duIDsKKwkJc210X3NyZl9ldmVudChzbWMsIFNNVF9FVkVOVF9NQUNfTkVJR0hCT1JfQ0hBTkdFLAorCQkJSU5ERVhfTUFDLDApIDsKKwl9CisKKyNlbmRpZgkvKiBubyBTTElNX1NNVCAqLworCisjaWZuZGVmIFNNVF9SRUFMX1RPS0VOX0NUCisJLyoKKwkgKiBUb2tlbiBjb3VudGVyIGVtdWxhdGlvbiBzZWN0aW9uLiBJZiBoYXJkd2FyZSBzdXBwb3J0cyB0aGUgdG9rZW4KKwkgKiBjb3VudCwgdGhlIHRva2VuIGNvdW50ZXIgd2lsbCBiZSB1cGRhdGVkIGluIG1hY191cGRhdGVfY291bnRlci4KKwkgKi8KKwlmb3IgKGkgPSBNQUMwOyBpIDwgTlVNTUFDUzsgaSsrICl7CisJCWlmICh0aW1lIC0gc21jLT5zbS5sYXN0X3Rva190aW1lW2ldID4gMipUSUNLU19QRVJfU0VDT05EICl7CisJCQlzbXRfZW11bGF0ZV90b2tlbl9jdCggc21jLCBpICk7CisJCX0KKwl9CisjZW5kaWYKKworCXNtdF90aW1lcl9zdGFydChzbWMsJnNtYy0+c20uc210X3RpbWVyLCAodV9sb25nKTEwMDAwMDBMLAorCQlFVl9UT0tFTihFVkVOVF9TTVQsU01fVElNRVIpKSA7Cit9CisKK3N0YXRpYyBpbnQgZGl2X3JhdGlvKHVfbG9uZyB1cHBlciwgdV9sb25nIGxvd2VyKQoreworCWlmICgodXBwZXI8PDE2TCkgPCB1cHBlcikKKwkJdXBwZXIgPSAweGZmZmYwMDAwTCA7CisJZWxzZQorCQl1cHBlciA8PD0gMTZMIDsKKwlpZiAoIWxvd2VyKQorCQlyZXR1cm4oMCkgOworCXJldHVybigoaW50KSh1cHBlci9sb3dlcikpIDsKK30KKworI2lmbmRlZglTTElNX1NNVAorCisvKgorICogcmVjZWl2ZSBwYWNrZXQgaGFuZGxlcgorICovCit2b2lkIHNtdF9yZWNlaXZlZF9wYWNrKHN0cnVjdCBzX3NtYyAqc21jLCBTTWJ1ZiAqbWIsIGludCBmcykKKy8qIGludCBmczsgIGZyYW1lIHN0YXR1cyAqLworeworCXN0cnVjdCBzbXRfaGVhZGVyCSpzbSA7CisJaW50CQkJbG9jYWwgOworCisJaW50CQkJaWxsZWdhbCA9IDAgOworCisJc3dpdGNoIChtX2ZjKG1iKSkgeworCWNhc2UgRkNfU01UX0lORk8gOgorCWNhc2UgRkNfU01UX0xBTl9MT0MgOgorCWNhc2UgRkNfU01UX0xPQyA6CisJY2FzZSBGQ19TTVRfTlNBIDoKKwkJYnJlYWsgOworCWRlZmF1bHQgOgorCQlzbXRfZnJlZV9tYnVmKHNtYyxtYikgOworCQlyZXR1cm4gOworCX0KKworCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1NNVENvcGllZF9DdCsrIDsKKwlzbSA9IHNtdG9kKG1iLHN0cnVjdCBzbXRfaGVhZGVyICopIDsKKwlsb2NhbCA9ICgoZnMgJiBMX0lORElDQVRPUikgIT0gMCkgOworCWh3bV9jb252X2NhbihzbWMsKGNoYXIgKilzbSwxMikgOworCisJLyogY2hlY2sgZGVzdGluYXRpb24gYWRkcmVzcyAqLworCWlmIChpc19pbmRpdmlkdWFsKCZzbS0+c210X2Rlc3QpICYmICFpc19teV9hZGRyKHNtYywmc20tPnNtdF9kZXN0KSkgeworCQlzbXRfZnJlZV9tYnVmKHNtYyxtYikgOworCQlyZXR1cm4gOworCX0KKyNpZgkwCQkvKiBmb3IgRFVQIHJlY29nbml0aW9uLCBkbyBOT1QgZmlsdGVyIHRoZW0gKi8KKwkvKiBpZ25vcmUgbG9vcCBiYWNrIHBhY2tldHMgKi8KKwlpZiAoaXNfbXlfYWRkcihzbWMsJnNtLT5zbXRfc291cmNlKSAmJiAhbG9jYWwpIHsKKwkJc210X2ZyZWVfbWJ1ZihzbWMsbWIpIDsKKwkJcmV0dXJuIDsKKwl9CisjZW5kaWYKKworCXNtdF9zd2FwX3BhcmEoc20sKGludCkgbWItPnNtX2xlbiwxKSA7CisJREJfU01UKCJTTVQgOiByZWNlaXZlZCBwYWNrZXQgWyVzXSBhdCAweCV4XG4iLAorCQlzbXRfdHlwZV9uYW1lW21fZmMobWIpICYgMHhmXSxzbSkgOworCURCX1NNVCgiU01UIDogdmVyc2lvbiAlZCwgY2xhc3MgJXNcbiIsc20tPnNtdF92ZXJzaW9uLAorCQlzbXRfY2xhc3NfbmFtZVsoc20tPnNtdF9jbGFzcz5MQVNUX0NMQVNTKT8wIDogc20tPnNtdF9jbGFzc10pIDsKKworI2lmZGVmCVNCQQorCS8qCisJICogY2hlY2sgaWYgTlNBIGZyYW1lCisJICovCisJaWYgKG1fZmMobWIpID09IEZDX1NNVF9OU0EgJiYgc20tPnNtdF9jbGFzcyA9PSBTTVRfTklGICYmCisJCShzbS0+c210X3R5cGUgPT0gU01UX0FOTk9VTkNFIHx8IHNtLT5zbXRfdHlwZSA9PSBTTVRfUkVRVUVTVCkpIHsKKwkJCXNtYy0+c2JhLnNtID0gc20gOworCQkJc2JhKHNtYyxOSUYpIDsKKwl9CisjZW5kaWYKKworCS8qCisJICogaWdub3JlIGFueSBwYWNrZXQgd2l0aCBOU0EgYW5kIEEtaW5kaWNhdG9yIHNldAorCSAqLworCWlmICggKGZzICYgQV9JTkRJQ0FUT1IpICYmIG1fZmMobWIpID09IEZDX1NNVF9OU0EpIHsKKwkJREJfU01UKCJTTVQgOiBpZ25vcmluZyBOU0Egd2l0aCBBLWluZGljYXRvciBzZXQgZnJvbSAlc1xuIiwKKwkJCWFkZHJfdG9fc3RyaW5nKCZzbS0+c210X3NvdXJjZSksMCkgOworCQlzbXRfZnJlZV9tYnVmKHNtYyxtYikgOworCQlyZXR1cm4gOworCX0KKworCS8qCisJICogaWdub3JlIGZyYW1lcyB3aXRoIGlsbGVnYWwgbGVuZ3RoCisJICovCisJaWYgKCgoc20tPnNtdF9jbGFzcyA9PSBTTVRfRUNGKSAmJiAoc20tPnNtdF9sZW4gPiBTTVRfTUFYX0VDSE9fTEVOKSkgfHwKKwkgICAgKChzbS0+c210X2NsYXNzICE9IFNNVF9FQ0YpICYmIChzbS0+c210X2xlbiA+IFNNVF9NQVhfSU5GT19MRU4pKSkgeworCQlzbXRfZnJlZV9tYnVmKHNtYyxtYikgOworCQlyZXR1cm4gOworCX0KKworCS8qCisJICogY2hlY2sgU01UIHZlcnNpb24KKwkgKi8KKwlzd2l0Y2ggKHNtLT5zbXRfY2xhc3MpIHsKKwljYXNlIFNNVF9OSUYgOgorCWNhc2UgU01UX1NJRl9DT05GSUcgOgorCWNhc2UgU01UX1NJRl9PUEVSIDoKKwljYXNlIFNNVF9FQ0YgOgorCQlpZiAoc20tPnNtdF92ZXJzaW9uICE9IFNNVF9WSUQpCisJCQlpbGxlZ2FsID0gMTsKKwkJYnJlYWsgOworCWRlZmF1bHQgOgorCQlpZiAoc20tPnNtdF92ZXJzaW9uICE9IFNNVF9WSURfMikKKwkJCWlsbGVnYWwgPSAxOworCQlicmVhayA7CisJfQorCWlmIChpbGxlZ2FsKSB7CisJCURCX1NNVCgiU01UIDogdmVyc2lvbiA9ICVkLCBkZXN0ID0gJXNcbiIsCisJCQlzbS0+c210X3ZlcnNpb24sYWRkcl90b19zdHJpbmcoJnNtLT5zbXRfc291cmNlKSkgOworCQlzbXRfc2VuZF9yZGYoc21jLG1iLG1fZmMobWIpLFNNVF9SREZfVkVSU0lPTixsb2NhbCkgOworCQlzbXRfZnJlZV9tYnVmKHNtYyxtYikgOworCQlyZXR1cm4gOworCX0KKwlpZiAoKHNtLT5zbXRfbGVuID4gbWItPnNtX2xlbiAtIHNpemVvZihzdHJ1Y3Qgc210X2hlYWRlcikpIHx8CisJICAgICgoc20tPnNtdF9sZW4gJiAzKSAmJiAoc20tPnNtdF9jbGFzcyAhPSBTTVRfRUNGKSkpIHsKKwkJREJfU01UKCJTTVQ6IGluZm8gbGVuZ3RoIGVycm9yLCBsZW4gPSAlZFxuIixzbS0+c210X2xlbiwwKSA7CisJCXNtdF9zZW5kX3JkZihzbWMsbWIsbV9mYyhtYiksU01UX1JERl9MRU5HVEgsbG9jYWwpIDsKKwkJc210X2ZyZWVfbWJ1ZihzbWMsbWIpIDsKKwkJcmV0dXJuIDsKKwl9CisJc3dpdGNoIChzbS0+c210X2NsYXNzKSB7CisJY2FzZSBTTVRfTklGIDoKKwkJaWYgKHNtdF9jaGVja19wYXJhKHNtYyxzbSxwbGlzdF9uaWYpKSB7CisJCQlEQl9TTVQoIlNNVDogTklGIHdpdGggcGFyYSBwcm9ibGVtLCBpZ25vcmluZ1xuIiwwLDApIDsKKwkJCWJyZWFrIDsKKwkJfSA7CisJCXN3aXRjaCAoc20tPnNtdF90eXBlKSB7CisJCWNhc2UgU01UX0FOTk9VTkNFIDoKKwkJY2FzZSBTTVRfUkVRVUVTVCA6CisJCQlpZiAoIShmcyAmIENfSU5ESUNBVE9SKSAmJiBtX2ZjKG1iKSA9PSBGQ19TTVRfTlNBCisJCQkJJiYgaXNfYnJvYWRjYXN0KCZzbS0+c210X2Rlc3QpKSB7CisJCQkJc3RydWN0IHNtdF9wX3N0YXRlCSpzdCA7CisKKwkJCQkvKiBzZXQgbXkgVU5BICovCisJCQkJaWYgKCFpc19lcXVhbCgKKwkJCQkJJnNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1Vwc3RyZWFtTmJyLAorCQkJCQkmc20tPnNtdF9zb3VyY2UpKSB7CisJCQkJCURCX1NNVCgiU01UIDogdXBkYXRlZCBteSBVTkEgPSAlc1xuIiwKKwkJCQkJYWRkcl90b19zdHJpbmcoJnNtLT5zbXRfc291cmNlKSwwKSA7CisJCQkJCWlmICghaXNfZXF1YWwoJnNtYy0+bWliLm1bTUFDMF0uCisJCQkJCSAgICBmZGRpTUFDVXBzdHJlYW1OYnIsJlNNVF9Vbmtub3duKSl7CisJCQkJCSAvKiBEbyBub3QgdXBkYXRlIHVua25vd24gYWRkcmVzcyAqLworCQkJCQkgc21jLT5taWIubVtNQUMwXS5mZGRpTUFDT2xkVXBzdHJlYW1OYnI9CisJCQkJCSBzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNVcHN0cmVhbU5iciA7CisJCQkJCX0KKworCQkJCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNVcHN0cmVhbU5iciA9CisJCQkJCQlzbS0+c210X3NvdXJjZSA7CisJCQkJCXNtdF9zcmZfZXZlbnQoc21jLAorCQkJCQkJU01UX0VWRU5UX01BQ19ORUlHSEJPUl9DSEFOR0UsCisJCQkJCQlJTkRFWF9NQUMsMCkgOworCQkJCQlzbXRfZWNob190ZXN0KHNtYywwKSA7CisJCQkJfQorCQkJCXNtYy0+c20uc210X3R2dSA9IHNtdF9nZXRfdGltZSgpIDsKKwkJCQlzdCA9IChzdHJ1Y3Qgc210X3Bfc3RhdGUgKikKKwkJCQkJc21fdG9fcGFyYShzbWMsc20sU01UX1BfU1RBVEUpIDsKKwkJCQlpZiAoc3QpIHsKKwkJCQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDVU5EQV9GbGFnID0KKwkJCQkJKHN0LT5zdF9kdXBsX2FkZHIgJiBTTVRfU1RfTVlfRFVQQSkgPworCQkJCQlUUlVFIDogRkFMU0UgOworCQkJCQl1cGRhdGVfZGFjKHNtYywxKSA7CisJCQkJfQorCQkJfQorCQkJaWYgKChzbS0+c210X3R5cGUgPT0gU01UX1JFUVVFU1QpICYmCisJCQkgICAgaXNfaW5kaXZpZHVhbCgmc20tPnNtdF9zb3VyY2UpICYmCisJCQkgICAgKCghKGZzICYgQV9JTkRJQ0FUT1IpICYmIG1fZmMobWIpID09IEZDX1NNVF9OU0EpIHx8CisJCQkgICAgIChtX2ZjKG1iKSAhPSBGQ19TTVRfTlNBKSkpIHsKKwkJCQlEQl9TTVQoIlNNVCA6IHJlcGx5aW5nIHRvIE5JRiByZXF1ZXN0ICVzXG4iLAorCQkJCQlhZGRyX3RvX3N0cmluZygmc20tPnNtdF9zb3VyY2UpLDApIDsKKwkJCQlzbXRfc2VuZF9uaWYoc21jLCZzbS0+c210X3NvdXJjZSwKKwkJCQkJRkNfU01UX0lORk8sCisJCQkJCXNtLT5zbXRfdGlkLAorCQkJCQlTTVRfUkVQTFksbG9jYWwpIDsKKwkJCX0KKwkJCWJyZWFrIDsKKwkJY2FzZSBTTVRfUkVQTFkgOgorCQkJREJfU01UKCJTTVQgOiByZWNlaXZlZCBOSUYgcmVzcG9uc2UgZnJvbSAlc1xuIiwKKwkJCQlhZGRyX3RvX3N0cmluZygmc20tPnNtdF9zb3VyY2UpLDApIDsKKwkJCWlmIChmcyAmIEFfSU5ESUNBVE9SKSB7CisJCQkJc21jLT5zbS5wZW5kW1NNVF9USURfTklGXSA9IDAgOworCQkJCURCX1NNVCgiU01UIDogZHVwbGljYXRlIGFkZHJlc3NcbiIsMCwwKSA7CisJCQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRHVwQWRkcmVzc1Rlc3QgPQorCQkJCQlEQV9GQUlMRUQgOworCQkJCXNtYy0+ci5kdXBfYWRkcl90ZXN0ID0gREFfRkFJTEVEIDsKKwkJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUk1ULFJNX0RVUF9BRERSKSA7CisJCQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDREFfRmxhZyA9IFRSVUUgOworCQkJCXVwZGF0ZV9kYWMoc21jLDEpIDsKKwkJCQlicmVhayA7CisJCQl9CisJCQlpZiAoc20tPnNtdF90aWQgPT0gc21jLT5zbS5wZW5kW1NNVF9USURfTklGXSkgeworCQkJCXNtYy0+c20ucGVuZFtTTVRfVElEX05JRl0gPSAwIDsKKwkJCQkvKiBzZXQgbXkgRE5BICovCisJCQkJaWYgKCFpc19lcXVhbCgKKwkJCQkJJnNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0Rvd25zdHJlYW1OYnIsCisJCQkJCSZzbS0+c210X3NvdXJjZSkpIHsKKwkJCQkJREJfU01UKCJTTVQgOiB1cGRhdGVkIG15IEROQVxuIiwwLDApIDsKKwkJCQkJaWYgKCFpc19lcXVhbCgmc21jLT5taWIubVtNQUMwXS4KKwkJCQkJIGZkZGlNQUNEb3duc3RyZWFtTmJyLCAmU01UX1Vua25vd24pKXsKKwkJCQkJIC8qIERvIG5vdCB1cGRhdGUgdW5rbm93biBhZGRyZXNzICovCisJCQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDT2xkRG93bnN0cmVhbU5iciA9CisJCQkJCSBzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNEb3duc3RyZWFtTmJyIDsKKwkJCQkJfQorCisJCQkJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0Rvd25zdHJlYW1OYnIgPQorCQkJCQkJc20tPnNtdF9zb3VyY2UgOworCQkJCQlzbXRfc3JmX2V2ZW50KHNtYywKKwkJCQkJCVNNVF9FVkVOVF9NQUNfTkVJR0hCT1JfQ0hBTkdFLAorCQkJCQkJSU5ERVhfTUFDLDApIDsKKwkJCQkJc210X2VjaG9fdGVzdChzbWMsMSkgOworCQkJCX0KKwkJCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNEQV9GbGFnID0gRkFMU0UgOworCQkJCXVwZGF0ZV9kYWMoc21jLDEpIDsKKwkJCQlzbWMtPnNtLnNtdF90dmQgPSBzbXRfZ2V0X3RpbWUoKSA7CisJCQkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRHVwQWRkcmVzc1Rlc3QgPQorCQkJCQlEQV9QQVNTRUQgOworCQkJCWlmIChzbWMtPnIuZHVwX2FkZHJfdGVzdCAhPSBEQV9QQVNTRUQpIHsKKwkJCQkJc21jLT5yLmR1cF9hZGRyX3Rlc3QgPSBEQV9QQVNTRUQgOworCQkJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUk1ULFJNX0RVUF9BRERSKSA7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoc20tPnNtdF90aWQgPT0KKwkJCQlzbWMtPnNtLnBlbmRbU01UX1RJRF9OSUZfVEVTVF0pIHsKKwkJCQlEQl9TTVQoIlNNVCA6IE5JRiB0ZXN0IFRJRCBva1xuIiwwLDApIDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCURCX1NNVCgiU01UIDogZXhwZWN0ZWQgVElEICVseCwgZ290ICVseFxuIiwKKwkJCQlzbWMtPnNtLnBlbmRbU01UX1RJRF9OSUZdLHNtLT5zbXRfdGlkKSA7CisJCQl9CisJCQlicmVhayA7CisJCWRlZmF1bHQgOgorCQkJaWxsZWdhbCA9IDIgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIFNNVF9TSUZfQ09ORklHIDoJLyogc3RhdGlvbiBpbmZvcm1hdGlvbiAqLworCQlpZiAoc20tPnNtdF90eXBlICE9IFNNVF9SRVFVRVNUKQorCQkJYnJlYWsgOworCQlEQl9TTVQoIlNNVCA6IHJlcGx5aW5nIHRvIFNJRiBDb25maWcgcmVxdWVzdCBmcm9tICVzXG4iLAorCQkJYWRkcl90b19zdHJpbmcoJnNtLT5zbXRfc291cmNlKSwwKSA7CisJCXNtdF9zZW5kX3NpZl9jb25maWcoc21jLCZzbS0+c210X3NvdXJjZSxzbS0+c210X3RpZCxsb2NhbCkgOworCQlicmVhayA7CisJY2FzZSBTTVRfU0lGX09QRVIgOgkvKiBzdGF0aW9uIGluZm9ybWF0aW9uICovCisJCWlmIChzbS0+c210X3R5cGUgIT0gU01UX1JFUVVFU1QpCisJCQlicmVhayA7CisJCURCX1NNVCgiU01UIDogcmVwbHlpbmcgdG8gU0lGIE9wZXJhdGlvbiByZXF1ZXN0IGZyb20gJXNcbiIsCisJCQlhZGRyX3RvX3N0cmluZygmc20tPnNtdF9zb3VyY2UpLDApIDsKKwkJc210X3NlbmRfc2lmX29wZXJhdGlvbihzbWMsJnNtLT5zbXRfc291cmNlLHNtLT5zbXRfdGlkLGxvY2FsKSA7CisJCWJyZWFrIDsKKwljYXNlIFNNVF9FQ0YgOgkJLyogZWNobyBmcmFtZSAqLworCQlzd2l0Y2ggKHNtLT5zbXRfdHlwZSkgeworCQljYXNlIFNNVF9SRVBMWSA6CisJCQlzbWMtPm1pYi5wcml2LmZkZGlQUklWRUNGX1JlcGx5X1J4KysgOworCQkJREJfU01UKCJTTVQ6IHJlY2VpdmVkIEVDRiByZXBseSBmcm9tICVzXG4iLAorCQkJCWFkZHJfdG9fc3RyaW5nKCZzbS0+c210X3NvdXJjZSksMCkgOworCQkJaWYgKHNtX3RvX3BhcmEoc21jLHNtLFNNVF9QX0VDSE9EQVRBKSA9PSAwKSB7CisJCQkJREJfU01UKCJTTVQ6IEVDSE9EQVRBIG1pc3NpbmdcbiIsMCwwKSA7CisJCQkJYnJlYWsgOworCQkJfQorCQkJaWYgKHNtLT5zbXRfdGlkID09IHNtYy0+c20ucGVuZFtTTVRfVElEX0VDRl0pIHsKKwkJCQlEQl9TTVQoIlNNVCA6IEVDRiB0ZXN0IFRJRCBva1xuIiwwLDApIDsKKwkJCX0KKwkJCWVsc2UgaWYgKHNtLT5zbXRfdGlkID09IHNtYy0+c20ucGVuZFtTTVRfVElEX0VDRl9VTkFdKSB7CisJCQkJREJfU01UKCJTTVQgOiBFQ0YgdGVzdCBVTkEgb2tcbiIsMCwwKSA7CisJCQl9CisJCQllbHNlIGlmIChzbS0+c210X3RpZCA9PSBzbWMtPnNtLnBlbmRbU01UX1RJRF9FQ0ZfRE5BXSkgeworCQkJCURCX1NNVCgiU01UIDogRUNGIHRlc3QgRE5BIG9rXG4iLDAsMCkgOworCQkJfQorCQkJZWxzZSB7CisJCQkJREJfU01UKCJTTVQgOiBleHBlY3RlZCBUSUQgJWx4LCBnb3QgJWx4XG4iLAorCQkJCQlzbWMtPnNtLnBlbmRbU01UX1RJRF9FQ0ZdLAorCQkJCQlzbS0+c210X3RpZCkgOworCQkJfQorCQkJYnJlYWsgOworCQljYXNlIFNNVF9SRVFVRVNUIDoKKwkJCXNtYy0+bWliLnByaXYuZmRkaVBSSVZFQ0ZfUmVxX1J4KysgOworCQkJeworCQkJaWYgKHNtLT5zbXRfbGVuICYmICFzbV90b19wYXJhKHNtYyxzbSxTTVRfUF9FQ0hPREFUQSkpIHsKKwkJCURCX1NNVCgiU01UOiBFQ0Ygd2l0aCBwYXJhIHByb2JsZW0sc2VuZGluZyBSREZcbiIsMCwwKSA7CisJCQkJc210X3NlbmRfcmRmKHNtYyxtYixtX2ZjKG1iKSxTTVRfUkRGX0xFTkdUSCwKKwkJCQkJbG9jYWwpIDsKKwkJCQlicmVhayA7CisJCQl9CisJCQlEQl9TTVQoIlNNVCAtIHNlbmRpbmcgRUNGIHJlcGx5IHRvICVzXG4iLAorCQkJCWFkZHJfdG9fc3RyaW5nKCZzbS0+c210X3NvdXJjZSksMCkgOworCisJCQkvKiBzZXQgZGVzdGluYXRpb24gYWRkci4gICYgcmVwbHkgKi8KKwkJCXNtLT5zbXRfZGVzdCA9IHNtLT5zbXRfc291cmNlIDsKKwkJCXNtLT5zbXRfdHlwZSA9IFNNVF9SRVBMWSA7CisJCQlkdW1wX3NtdChzbWMsc20sIkVDRiBSRVBMWSIpIDsKKwkJCXNtYy0+bWliLnByaXYuZmRkaVBSSVZFQ0ZfUmVwbHlfVHgrKyA7CisJCQlzbXRfc2VuZF9mcmFtZShzbWMsbWIsRkNfU01UX0lORk8sbG9jYWwpIDsKKwkJCXJldHVybiA7CQkvKiBET04nVCBmcmVlIG1idWYgKi8KKwkJCX0KKwkJZGVmYXVsdCA6CisJCQlpbGxlZ2FsID0gMSA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWsgOworI2lmbmRlZglCT09UCisJY2FzZSBTTVRfUkFGIDoJCS8qIHJlc291cmNlIGFsbG9jYXRpb24gKi8KKyNpZmRlZglFU1MKKwkJREJfRVNTTigyLCJFU1M6IFJBRiBmcmFtZSByZWNlaXZlZFxuIiwwLDApIDsKKwkJZnMgPSBlc3NfcmFmX3JlY2VpdmVkX3BhY2soc21jLG1iLHNtLGZzKSA7CisjZW5kaWYKKworI2lmZGVmCVNCQQorCQlEQl9TQkFOKDIsIlNCQTogUkFGIGZyYW1lIHJlY2VpdmVkXG4iLDAsMCkgOworCQlzYmFfcmFmX3JlY2VpdmVkX3BhY2soc21jLHNtLGZzKSA7CisjZW5kaWYKKwkJYnJlYWsgOworCWNhc2UgU01UX1JERiA6CQkvKiByZXF1ZXN0IGRlbmllZCAqLworCQlzbWMtPm1pYi5wcml2LmZkZGlQUklWUkRGX1J4KysgOworCQlicmVhayA7CisJY2FzZSBTTVRfRVNGIDoJCS8qIGV4dGVuZGVkIHNlcnZpY2UgLSBub3Qgc3VwcG9ydGVkICovCisJCWlmIChzbS0+c210X3R5cGUgPT0gU01UX1JFUVVFU1QpIHsKKwkJCURCX1NNVCgiU01UIC0gcmVjZWl2ZWQgRVNGLCBzZW5kaW5nIFJERlxuIiwwLDApIDsKKwkJCXNtdF9zZW5kX3JkZihzbWMsbWIsbV9mYyhtYiksU01UX1JERl9DTEFTUyxsb2NhbCkgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIFNNVF9QTUZfR0VUIDoKKwljYXNlIFNNVF9QTUZfU0VUIDoKKwkJaWYgKHNtLT5zbXRfdHlwZSAhPSBTTVRfUkVRVUVTVCkKKwkJCWJyZWFrIDsKKwkJLyogdXBkYXRlIHN0YXRpc3RpY3MgKi8KKwkJaWYgKHNtLT5zbXRfY2xhc3MgPT0gU01UX1BNRl9HRVQpCisJCQlzbWMtPm1pYi5wcml2LmZkZGlQUklWUE1GX0dldF9SeCsrIDsKKwkJZWxzZQorCQkJc21jLT5taWIucHJpdi5mZGRpUFJJVlBNRl9TZXRfUngrKyA7CisJCS8qCisJCSAqIGlnbm9yZSBQTUYgU0VUIHdpdGggSS9HIHNldAorCQkgKi8KKwkJaWYgKChzbS0+c210X2NsYXNzID09IFNNVF9QTUZfU0VUKSAmJgorCQkJIWlzX2luZGl2aWR1YWwoJnNtLT5zbXRfZGVzdCkpIHsKKwkJCURCX1NNVCgiU01UOiBpZ25vcmluZyBQTUYtU0VUIHdpdGggSS9HIHNldFxuIiwwLDApIDsKKwkJCWJyZWFrIDsKKwkJfQorCQlzbXRfcG1mX3JlY2VpdmVkX3BhY2soc21jLG1iLCBsb2NhbCkgOworCQlicmVhayA7CisJY2FzZSBTTVRfU1JGIDoKKwkJZHVtcF9zbXQoc21jLHNtLCJTUkYgcmVjZWl2ZWQiKSA7CisJCWJyZWFrIDsKKwlkZWZhdWx0IDoKKwkJaWYgKHNtLT5zbXRfdHlwZSAhPSBTTVRfUkVRVUVTVCkKKwkJCWJyZWFrIDsKKwkJLyoKKwkJICogRm9yIGZyYW1lcyB3aXRoIHVua25vd24gY2xhc3M6CisJCSAqIHdlIG5lZWQgdG8gc2VuZCBhIFJERiBmcmFtZSBhY2NvcmRpbmcgdG8gOC4xLjMuMS4xLAorCQkgKiBvbmx5IGlmIGl0IGlzIGEgUkVRVUVTVC4KKwkJICovCisJCURCX1NNVCgiU01UIDogY2xhc3MgPSAlZCwgc2VuZCBSREYgdG8gJXNcbiIsCisJCQlzbS0+c210X2NsYXNzLCBhZGRyX3RvX3N0cmluZygmc20tPnNtdF9zb3VyY2UpKSA7CisKKwkJc210X3NlbmRfcmRmKHNtYyxtYixtX2ZjKG1iKSxTTVRfUkRGX0NMQVNTLGxvY2FsKSA7CisJCWJyZWFrIDsKKyNlbmRpZgorCX0KKwlpZiAoaWxsZWdhbCkgeworCQlEQl9TTVQoIlNNVDogZGlzY2FyZGluZyBpbnZhbGlkIGZyYW1lLCByZWFzb24gPSAlZFxuIiwKKwkJCWlsbGVnYWwsMCkgOworCX0KKwlzbXRfZnJlZV9tYnVmKHNtYyxtYikgOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfZGFjKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcmVwb3J0KQoreworCWludAljb25kIDsKKworCWNvbmQgPSAoIHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1VOREFfRmxhZyB8CisJCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0RBX0ZsYWcpICE9IDAgOworCWlmIChyZXBvcnQgJiYgKGNvbmQgIT0gc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRHVwbGljYXRlQWRkcmVzc0NvbmQpKQorCQlzbXRfc3JmX2V2ZW50KHNtYywgU01UX0NPTkRfTUFDX0RVUF9BRERSLElOREVYX01BQyxjb25kKSA7CisJZWxzZQorCQlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNEdXBsaWNhdGVBZGRyZXNzQ29uZCA9IGNvbmQgOworfQorCisvKgorICogc2VuZCBTTVQgZnJhbWUKKyAqCXNldCBzb3VyY2UgYWRkcmVzcworICoJc2V0IHN0YXRpb24gSUQKKyAqCXNlbmQgZnJhbWUKKyAqLwordm9pZCBzbXRfc2VuZF9mcmFtZShzdHJ1Y3Qgc19zbWMgKnNtYywgU01idWYgKm1iLCBpbnQgZmMsIGludCBsb2NhbCkKKy8qIFNNYnVmICptYjsJYnVmZmVyIHRvIHNlbmQgKi8KKy8qIGludCBmYzsJRkMgdmFsdWUgKi8KK3sKKwlzdHJ1Y3Qgc210X2hlYWRlcgkqc20gOworCisJaWYgKCFzbWMtPnIuc21fbWFfYXZhaWwgJiYgIWxvY2FsKSB7CisJCXNtdF9mcmVlX21idWYoc21jLG1iKSA7CisJCXJldHVybiA7CisJfQorCXNtID0gc210b2QobWIsc3RydWN0IHNtdF9oZWFkZXIgKikgOworCXNtLT5zbXRfc291cmNlID0gc21jLT5taWIubVtNQUMwXS5mZGRpTUFDU01UQWRkcmVzcyA7CisJc20tPnNtdF9zaWQgPSBzbWMtPm1pYi5mZGRpU01UU3RhdGlvbklkIDsKKworCXNtdF9zd2FwX3BhcmEoc20sKGludCkgbWItPnNtX2xlbiwwKSA7CQkvKiBzd2FwIHBhcmEgJiBoZWFkZXIgKi8KKwlod21fY29udl9jYW4oc21jLChjaGFyICopc20sMTIpIDsJCS8qIGNvbnZlcnQgU0EgYW5kIERBICovCisJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDU01UVHJhbnNtaXRfQ3QrKyA7CisJc210X3NlbmRfbWJ1ZihzbWMsbWIsbG9jYWwgPyBGQ19TTVRfTE9DIDogZmMpIDsKK30KKworLyoKKyAqIGdlbmVyYXRlIGFuZCBzZW5kIFJERgorICovCitzdGF0aWMgdm9pZCBzbXRfc2VuZF9yZGYoc3RydWN0IHNfc21jICpzbWMsIFNNYnVmICpyZWosIGludCBmYywgaW50IHJlYXNvbiwKKwkJCSBpbnQgbG9jYWwpCisvKiBTTWJ1ZiAqcmVqOwltYnVmIG9mIG9mZmVuZGluZyBmcmFtZSAqLworLyogaW50IGZjOwlGQyBvZiBkZW5pZWQgZnJhbWUgKi8KKy8qIGludCByZWFzb247CXJlYXNvbiBjb2RlICovCit7CisJU01idWYJKm1iIDsKKwlzdHJ1Y3Qgc210X2hlYWRlcgkqc20gOwkvKiBoZWFkZXIgb2Ygb2ZmZW5kaW5nIGZyYW1lICovCisJc3RydWN0IHNtdF9yZGYJKnJkZiA7CisJaW50CQlsZW4gOworCWludAkJZnJhbWVfbGVuIDsKKworCXNtID0gc210b2QocmVqLHN0cnVjdCBzbXRfaGVhZGVyICopIDsKKwlpZiAoc20tPnNtdF90eXBlICE9IFNNVF9SRVFVRVNUKQorCQlyZXR1cm4gOworCisJREJfU01UKCJTTVQ6IHNlbmRpbmcgUkRGIHRvICVzLHJlYXNvbiA9IDB4JXhcbiIsCisJCWFkZHJfdG9fc3RyaW5nKCZzbS0+c210X3NvdXJjZSkscmVhc29uKSA7CisKKworCS8qCisJICogbm90ZTogZ2V0IGZyYW1lbGVuZ3RoIGZyb20gTUFDIGxlbmd0aCwgTk9UIGZyb20gU01UIGhlYWRlcgorCSAqIHNtdCBoZWFkZXIgbGVuZ3RoIGlzIGluY2x1ZGVkIGluIHNtX2xlbgorCSAqLworCWZyYW1lX2xlbiA9IHJlai0+c21fbGVuIDsKKworCWlmICghKG1iPXNtdF9idWlsZF9mcmFtZShzbWMsU01UX1JERixTTVRfUkVQTFksc2l6ZW9mKHN0cnVjdCBzbXRfcmRmKSkpKQorCQlyZXR1cm4gOworCXJkZiA9IHNtdG9kKG1iLHN0cnVjdCBzbXRfcmRmICopIDsKKwlyZGYtPnNtdC5zbXRfdGlkID0gc20tPnNtdF90aWQgOwkJLyogdXNlIFRJRCBmcm9tIHNtICovCisJcmRmLT5zbXQuc210X2Rlc3QgPSBzbS0+c210X3NvdXJjZSA7CQkvKiBzZXQgZGVzdCA9IHNvdXJjZSAqLworCisJLyogc2V0IFAxMiAqLworCXJkZi0+cmVhc29uLnBhcmEucF90eXBlID0gU01UX1BfUkVBU09OIDsKKwlyZGYtPnJlYXNvbi5wYXJhLnBfbGVuID0gc2l6ZW9mKHN0cnVjdCBzbXRfcF9yZWFzb24pIC0gUEFSQV9MRU4gOworCXJkZi0+cmVhc29uLnJkZl9yZWFzb24gPSByZWFzb24gOworCisJLyogc2V0IFAxNCAqLworCXJkZi0+dmVyc2lvbi5wYXJhLnBfdHlwZSA9IFNNVF9QX1ZFUlNJT04gOworCXJkZi0+dmVyc2lvbi5wYXJhLnBfbGVuID0gc2l6ZW9mKHN0cnVjdCBzbXRfcF92ZXJzaW9uKSAtIFBBUkFfTEVOIDsKKwlyZGYtPnZlcnNpb24udl9wYWQgPSAwIDsKKwlyZGYtPnZlcnNpb24udl9uID0gMSA7CisJcmRmLT52ZXJzaW9uLnZfaW5kZXggPSAxIDsKKwlyZGYtPnZlcnNpb24udl92ZXJzaW9uWzBdID0gU01UX1ZJRF8yIDsKKwlyZGYtPnZlcnNpb24udl9wYWQyID0gMCA7CisKKwkvKiBzZXQgUDEzICovCisJaWYgKCh1bnNpZ25lZCkgZnJhbWVfbGVuIDw9IFNNVF9NQVhfSU5GT19MRU4gLSBzaXplb2YoKnJkZikgKworCQkyKnNpemVvZihzdHJ1Y3Qgc210X2hlYWRlcikpCisJCWxlbiA9IGZyYW1lX2xlbiA7CisJZWxzZQorCQlsZW4gPSBTTVRfTUFYX0lORk9fTEVOIC0gc2l6ZW9mKCpyZGYpICsKKwkJCTIqc2l6ZW9mKHN0cnVjdCBzbXRfaGVhZGVyKSA7CisJLyogbWFrZSBsZW5ndGggbXVsdGlwbGUgb2YgNCAqLworCWxlbiAmPSB+MyA7CisJcmRmLT5yZWZ1c2VkLnBhcmEucF90eXBlID0gU01UX1BfUkVGVVNFRCA7CisJLyogbGVuZ3RoIG9mIHBhcmEgaXMgc210X2ZyYW1lICsgcmVmX2ZjICovCisJcmRmLT5yZWZ1c2VkLnBhcmEucF9sZW4gPSBsZW4gKyA0IDsKKwlyZGYtPnJlZnVzZWQucmVmX2ZjID0gZmMgOworCisJLyogc3dhcCBpdCBiYWNrICovCisJc210X3N3YXBfcGFyYShzbSxmcmFtZV9sZW4sMCkgOworCisJbWVtY3B5KChjaGFyICopICZyZGYtPnJlZnVzZWQucmVmX2hlYWRlciwoY2hhciAqKSBzbSxsZW4pIDsKKworCWxlbiAtPSBzaXplb2Yoc3RydWN0IHNtdF9oZWFkZXIpIDsKKwltYi0+c21fbGVuICs9IGxlbiA7CisJcmRmLT5zbXQuc210X2xlbiArPSBsZW4gOworCisJZHVtcF9zbXQoc21jLChzdHJ1Y3Qgc210X2hlYWRlciAqKXJkZiwiUkRGIikgOworCXNtYy0+bWliLnByaXYuZmRkaVBSSVZSREZfVHgrKyA7CisJc210X3NlbmRfZnJhbWUoc21jLG1iLEZDX1NNVF9JTkZPLGxvY2FsKSA7Cit9CisKKy8qCisgKiBnZW5lcmF0ZSBhbmQgc2VuZCBOSUYKKyAqLworc3RhdGljIHZvaWQgc210X3NlbmRfbmlmKHN0cnVjdCBzX3NtYyAqc21jLCBjb25zdCBzdHJ1Y3QgZmRkaV9hZGRyICpkZXN0LCAKKwkJCSBpbnQgZmMsIHVfbG9uZyB0aWQsIGludCB0eXBlLCBpbnQgbG9jYWwpCisvKiBzdHJ1Y3QgZmRkaV9hZGRyICpkZXN0OwlkZXN0IGFkZHJlc3MgKi8KKy8qIGludCBmYzsJCQlmcmFtZSBjb250cm9sICovCisvKiB1X2xvbmcgdGlkOwkJCXRyYW5zYWN0aW9uIGlkICovCisvKiBpbnQgdHlwZTsJCQlmcmFtZSB0eXBlICovCit7CisJc3RydWN0IHNtdF9uaWYJKm5pZiA7CisJU01idWYJCSptYiA7CisKKwlpZiAoIShtYiA9IHNtdF9idWlsZF9mcmFtZShzbWMsU01UX05JRix0eXBlLHNpemVvZihzdHJ1Y3Qgc210X25pZikpKSkKKwkJcmV0dXJuIDsKKwluaWYgPSBzbXRvZChtYiwgc3RydWN0IHNtdF9uaWYgKikgOworCXNtdF9maWxsX3VuYShzbWMsJm5pZi0+dW5hKSA7CS8qIHNldCBVTkEgKi8KKwlzbXRfZmlsbF9zZGUoc21jLCZuaWYtPnNkZSkgOwkvKiBzZXQgc3RhdGlvbiBkZXNjcmlwdG9yICovCisJc210X2ZpbGxfc3RhdGUoc21jLCZuaWYtPnN0YXRlKSA7CS8qIHNldCBzdGF0ZSBpbmZvcm1hdGlvbiAqLworI2lmZGVmCVNNVDZfMTAKKwlzbXRfZmlsbF9mc2Moc21jLCZuaWYtPmZzYykgOwkvKiBzZXQgZnJhbWUgc3RhdHVzIGNhcC4gKi8KKyNlbmRpZgorCW5pZi0+c210LnNtdF9kZXN0ID0gKmRlc3QgOwkvKiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJbmlmLT5zbXQuc210X3RpZCA9IHRpZCA7CS8qIHRyYW5zYWN0aW9uIElEICovCisJZHVtcF9zbXQoc21jLChzdHJ1Y3Qgc210X2hlYWRlciAqKW5pZiwiTklGIikgOworCXNtdF9zZW5kX2ZyYW1lKHNtYyxtYixmYyxsb2NhbCkgOworfQorCisjaWZkZWYJREVCVUcKKy8qCisgKiBzZW5kIE5JRiByZXF1ZXN0ICh0ZXN0IHB1cnBvc2UpCisgKi8KK3N0YXRpYyB2b2lkIHNtdF9zZW5kX25pZl9yZXF1ZXN0KHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3QgZmRkaV9hZGRyICpkZXN0KQoreworCXNtYy0+c20ucGVuZFtTTVRfVElEX05JRl9URVNUXSA9IHNtdF9nZXRfdGlkKHNtYykgOworCXNtdF9zZW5kX25pZihzbWMsZGVzdCwgRkNfU01UX0lORk8sIHNtYy0+c20ucGVuZFtTTVRfVElEX05JRl9URVNUXSwKKwkJU01UX1JFUVVFU1QsMCkgOworfQorCisvKgorICogc2VuZCBFQ0YgcmVxdWVzdCAodGVzdCBwdXJwb3NlKQorICovCitzdGF0aWMgdm9pZCBzbXRfc2VuZF9lY2ZfcmVxdWVzdChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IGZkZGlfYWRkciAqZGVzdCwKKwkJCQkgaW50IGxlbikKK3sKKwlzbWMtPnNtLnBlbmRbU01UX1RJRF9FQ0ZdID0gc210X2dldF90aWQoc21jKSA7CisJc210X3NlbmRfZWNmKHNtYyxkZXN0LCBGQ19TTVRfSU5GTywgc21jLT5zbS5wZW5kW1NNVF9USURfRUNGXSwKKwkJU01UX1JFUVVFU1QsbGVuKSA7Cit9CisjZW5kaWYKKworLyoKKyAqIGVjaG8gdGVzdAorICovCitzdGF0aWMgdm9pZCBzbXRfZWNob190ZXN0KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgZG5hKQoreworCXVfbG9uZwl0aWQgOworCisJc21jLT5zbS5wZW5kW2RuYSA/IFNNVF9USURfRUNGX0ROQSA6IFNNVF9USURfRUNGX1VOQV0gPQorCQl0aWQgPSBzbXRfZ2V0X3RpZChzbWMpIDsKKwlzbXRfc2VuZF9lY2Yoc21jLCBkbmEgPworCQkmc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRG93bnN0cmVhbU5iciA6CisJCSZzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNVcHN0cmVhbU5iciwKKwkJRkNfU01UX0lORk8sdGlkLCBTTVRfUkVRVUVTVCwgKFNNVF9URVNUX0VDSE9fTEVOICYgfjMpLTgpIDsKK30KKworLyoKKyAqIGdlbmVyYXRlIGFuZCBzZW5kIEVDRgorICovCitzdGF0aWMgdm9pZCBzbXRfc2VuZF9lY2Yoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBmZGRpX2FkZHIgKmRlc3QsIGludCBmYywKKwkJCSB1X2xvbmcgdGlkLCBpbnQgdHlwZSwgaW50IGxlbikKKy8qIHN0cnVjdCBmZGRpX2FkZHIgKmRlc3Q7CWRlc3QgYWRkcmVzcyAqLworLyogaW50IGZjOwkJCWZyYW1lIGNvbnRyb2wgKi8KKy8qIHVfbG9uZyB0aWQ7CQkJdHJhbnNhY3Rpb24gaWQgKi8KKy8qIGludCB0eXBlOwkJCWZyYW1lIHR5cGUgKi8KKy8qIGludCBsZW47CQkJZnJhbWUgbGVuZ3RoICovCit7CisJc3RydWN0IHNtdF9lY2YJKmVjZiA7CisJU01idWYJCSptYiA7CisKKwlpZiAoIShtYiA9IHNtdF9idWlsZF9mcmFtZShzbWMsU01UX0VDRix0eXBlLFNNVF9FQ0ZfTEVOICsgbGVuKSkpCisJCXJldHVybiA7CisJZWNmID0gc210b2QobWIsIHN0cnVjdCBzbXRfZWNmICopIDsKKworCXNtdF9maWxsX2VjaG8oc21jLCZlY2YtPmVjX2VjaG8sdGlkLGxlbikgOwkvKiBzZXQgRUNITyAqLworCWVjZi0+c210LnNtdF9kZXN0ID0gKmRlc3QgOwkvKiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJZWNmLT5zbXQuc210X3RpZCA9IHRpZCA7CS8qIHRyYW5zYWN0aW9uIElEICovCisJc21jLT5taWIucHJpdi5mZGRpUFJJVkVDRl9SZXFfVHgrKyA7CisJc210X3NlbmRfZnJhbWUoc21jLG1iLGZjLDApIDsKK30KKworLyoKKyAqIGdlbmVyYXRlIGFuZCBzZW5kIFNJRiBjb25maWcgcmVzcG9uc2UKKyAqLworCitzdGF0aWMgdm9pZCBzbXRfc2VuZF9zaWZfY29uZmlnKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3QgZmRkaV9hZGRyICpkZXN0LAorCQkJCXVfbG9uZyB0aWQsIGludCBsb2NhbCkKKy8qIHN0cnVjdCBmZGRpX2FkZHIgKmRlc3Q7CWRlc3QgYWRkcmVzcyAqLworLyogdV9sb25nIHRpZDsJCQl0cmFuc2FjdGlvbiBpZCAqLworeworCXN0cnVjdCBzbXRfc2lmX2NvbmZpZwkqc2lmIDsKKwlTTWJ1ZgkJCSptYiA7CisJaW50CQkJbGVuIDsKKwlpZiAoIShtYiA9IHNtdF9idWlsZF9mcmFtZShzbWMsU01UX1NJRl9DT05GSUcsU01UX1JFUExZLAorCQlTSVpFT0ZfU01UX1NJRl9DT05GSUcpKSkKKwkJcmV0dXJuIDsKKworCXNpZiA9IHNtdG9kKG1iLCBzdHJ1Y3Qgc210X3NpZl9jb25maWcgKikgOworCXNtdF9maWxsX3RpbWVzdGFtcChzbWMsJnNpZi0+dHMpIDsJLyogc2V0IHRpbWUgc3RhbXAgKi8KKwlzbXRfZmlsbF9zZGUoc21jLCZzaWYtPnNkZSkgOwkJLyogc2V0IHN0YXRpb24gZGVzY3JpcHRvciAqLworCXNtdF9maWxsX3ZlcnNpb24oc21jLCZzaWYtPnZlcnNpb24pIDsJLyogc2V0IHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKwlzbXRfZmlsbF9zdGF0ZShzbWMsJnNpZi0+c3RhdGUpIDsJLyogc2V0IHN0YXRlIGluZm9ybWF0aW9uICovCisJc210X2ZpbGxfcG9saWN5KHNtYywmc2lmLT5wb2xpY3kpIDsJLyogc2V0IHN0YXRpb24gcG9saWN5ICovCisJc210X2ZpbGxfbGF0ZW5jeShzbWMsJnNpZi0+bGF0ZW5jeSk7CS8qIHNldCBzdGF0aW9uIGxhdGVuY3kgKi8KKwlzbXRfZmlsbF9uZWlnaGJvcihzbWMsJnNpZi0+bmVpZ2hib3IpOwkvKiBzZXQgc3RhdGlvbiBuZWlnaGJvciAqLworCXNtdF9maWxsX3NldGNvdW50KHNtYywmc2lmLT5zZXRjb3VudCkgOwkvKiBzZXQgY291bnQgKi8KKwlsZW4gPSBzbXRfZmlsbF9wYXRoKHNtYywmc2lmLT5wYXRoKTsJLyogc2V0IHN0YXRpb24gcGF0aCBkZXNjcmlwdG9yKi8KKwlzaWYtPnNtdC5zbXRfZGVzdCA9ICpkZXN0IDsJCS8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlzaWYtPnNtdC5zbXRfdGlkID0gdGlkIDsJCS8qIHRyYW5zYWN0aW9uIElEICovCisJc210X2FkZF9mcmFtZV9sZW4obWIsbGVuKSA7CQkvKiBhZGp1c3QgbGVuZ3RoIGZpZWxkcyAqLworCWR1bXBfc210KHNtYywoc3RydWN0IHNtdF9oZWFkZXIgKilzaWYsIlNJRiBDb25maWd1cmF0aW9uIFJlcGx5IikgOworCXNtdF9zZW5kX2ZyYW1lKHNtYyxtYixGQ19TTVRfSU5GTyxsb2NhbCkgOworfQorCisvKgorICogZ2VuZXJhdGUgYW5kIHNlbmQgU0lGIG9wZXJhdGlvbiByZXNwb25zZQorICovCisKK3N0YXRpYyB2b2lkIHNtdF9zZW5kX3NpZl9vcGVyYXRpb24oc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBmZGRpX2FkZHIgKmRlc3QsCisJCQkJICAgdV9sb25nIHRpZCwgaW50IGxvY2FsKQorLyogc3RydWN0IGZkZGlfYWRkciAqZGVzdDsJZGVzdCBhZGRyZXNzICovCisvKiB1X2xvbmcgdGlkOwkJCXRyYW5zYWN0aW9uIGlkICovCit7CisJc3RydWN0IHNtdF9zaWZfb3BlcmF0aW9uICpzaWYgOworCVNNYnVmCQkJKm1iIDsKKwlpbnQJCQlwb3J0cyA7CisJaW50CQkJaSA7CisKKwlwb3J0cyA9IE5VTVBIWVMgOworI2lmbmRlZglDT05DRU5UUkFUT1IKKwlpZiAoc21jLT5zLnNhcyA9PSBTTVRfU0FTKQorCQlwb3J0cyA9IDEgOworI2VuZGlmCisKKwlpZiAoIShtYiA9IHNtdF9idWlsZF9mcmFtZShzbWMsU01UX1NJRl9PUEVSLFNNVF9SRVBMWSwKKwkJU0laRU9GX1NNVF9TSUZfT1BFUkFUSU9OK3BvcnRzKnNpemVvZihzdHJ1Y3Qgc210X3BfbGVtKSkpKQorCQlyZXR1cm4gOworCXNpZiA9IHNtdG9kKG1iLCBzdHJ1Y3Qgc210X3NpZl9vcGVyYXRpb24gKikgOworCXNtdF9maWxsX3RpbWVzdGFtcChzbWMsJnNpZi0+dHMpIDsJLyogc2V0IHRpbWUgc3RhbXAgKi8KKwlzbXRfZmlsbF9tYWNfc3RhdHVzKHNtYywmc2lmLT5zdGF0dXMpIDsgLyogc2V0IG1hYyBzdGF0dXMgKi8KKwlzbXRfZmlsbF9tYWNfY291bnRlcihzbWMsJnNpZi0+bWMpIDsgLyogc2V0IG1hYyBjb3VudGVyIGZpZWxkICovCisJc210X2ZpbGxfbWFjX2ZuYyhzbWMsJnNpZi0+Zm5jKSA7IC8qIHNldCBmcmFtZSBub3QgY29waWVkIGNvdW50ZXIgKi8KKwlzbXRfZmlsbF9tYW51ZmFjdHVyZXIoc21jLCZzaWYtPm1hbikgOyAvKiBzZXQgbWFudWZhY3R1cmVyIGZpZWxkICovCisJc210X2ZpbGxfdXNlcihzbWMsJnNpZi0+dXNlcikgOwkJLyogc2V0IHVzZXIgZmllbGQgKi8KKwlzbXRfZmlsbF9zZXRjb3VudChzbWMsJnNpZi0+c2V0Y291bnQpIDsJLyogc2V0IGNvdW50ICovCisJLyoKKwkgKiBzZXQgbGluayBlcnJvciBtb24gaW5mb3JtYXRpb24KKwkgKi8KKwlpZiAocG9ydHMgPT0gMSkgeworCQlzbXRfZmlsbF9sZW0oc21jLHNpZi0+bGVtLFBTKSA7CisJfQorCWVsc2UgeworCQlmb3IgKGkgPSAwIDsgaSA8IHBvcnRzIDsgaSsrKSB7CisJCQlzbXRfZmlsbF9sZW0oc21jLCZzaWYtPmxlbVtpXSxpKSA7CisJCX0KKwl9CisKKwlzaWYtPnNtdC5zbXRfZGVzdCA9ICpkZXN0IDsJLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworCXNpZi0+c210LnNtdF90aWQgPSB0aWQgOwkvKiB0cmFuc2FjdGlvbiBJRCAqLworCWR1bXBfc210KHNtYywoc3RydWN0IHNtdF9oZWFkZXIgKilzaWYsIlNJRiBPcGVyYXRpb24gUmVwbHkiKSA7CisJc210X3NlbmRfZnJhbWUoc21jLG1iLEZDX1NNVF9JTkZPLGxvY2FsKSA7Cit9CisKKy8qCisgKiBnZXQgYW5kIGluaXRpYWxpemUgU01UIGZyYW1lCisgKi8KK1NNYnVmICpzbXRfYnVpbGRfZnJhbWUoc3RydWN0IHNfc21jICpzbWMsIGludCBjbGFzcywgaW50IHR5cGUsCisJCQkJICBpbnQgbGVuZ3RoKQoreworCVNNYnVmCQkJKm1iIDsKKwlzdHJ1Y3Qgc210X2hlYWRlcgkqc210IDsKKworI2lmCTAKKwlpZiAoIXNtYy0+ci5zbV9tYV9hdmFpbCkgeworCQlyZXR1cm4oMCkgOworCX0KKyNlbmRpZgorCWlmICghKG1iID0gc210X2dldF9tYnVmKHNtYykpKQorCQlyZXR1cm4obWIpIDsKKworCW1iLT5zbV9sZW4gPSBsZW5ndGggOworCXNtdCA9IHNtdG9kKG1iLCBzdHJ1Y3Qgc210X2hlYWRlciAqKSA7CisJc210LT5zbXRfZGVzdCA9IGZkZGlfYnJvYWRjYXN0IDsgLyogc2V0IGRlc3QgPSBicm9hZGNhc3QgKi8KKwlzbXQtPnNtdF9jbGFzcyA9IGNsYXNzIDsKKwlzbXQtPnNtdF90eXBlID0gdHlwZSA7CisJc3dpdGNoIChjbGFzcykgeworCWNhc2UgU01UX05JRiA6CisJY2FzZSBTTVRfU0lGX0NPTkZJRyA6CisJY2FzZSBTTVRfU0lGX09QRVIgOgorCWNhc2UgU01UX0VDRiA6CisJCXNtdC0+c210X3ZlcnNpb24gPSBTTVRfVklEIDsKKwkJYnJlYWsgOworCWRlZmF1bHQgOgorCQlzbXQtPnNtdF92ZXJzaW9uID0gU01UX1ZJRF8yIDsKKwkJYnJlYWsgOworCX0KKwlzbXQtPnNtdF90aWQgPSBzbXRfZ2V0X3RpZChzbWMpIDsJLyogc2V0IHRyYW5zYWN0aW9uIElEICovCisJc210LT5zbXRfcGFkID0gMCA7CisJc210LT5zbXRfbGVuID0gbGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBzbXRfaGVhZGVyKSA7CisJcmV0dXJuKG1iKSA7Cit9CisKK3N0YXRpYyB2b2lkIHNtdF9hZGRfZnJhbWVfbGVuKFNNYnVmICptYiwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc210X2hlYWRlcgkqc210IDsKKworCXNtdCA9IHNtdG9kKG1iLCBzdHJ1Y3Qgc210X2hlYWRlciAqKSA7CisJc210LT5zbXRfbGVuICs9IGxlbiA7CisJbWItPnNtX2xlbiArPSBsZW4gOworfQorCisKKworLyoKKyAqIGZpbGwgdmFsdWVzIGluIFVOQSBwYXJhbWV0ZXIKKyAqLworc3RhdGljIHZvaWQgc210X2ZpbGxfdW5hKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BfdW5hICp1bmEpCit7CisJU01UU0VUUEFSQSh1bmEsU01UX1BfVU5BKSA7CisJdW5hLT51bmFfcGFkID0gMCA7CisJdW5hLT51bmFfbm9kZSA9IHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1Vwc3RyZWFtTmJyIDsKK30KKworLyoKKyAqIGZpbGwgdmFsdWVzIGluIFNERSBwYXJhbWV0ZXIKKyAqLworc3RhdGljIHZvaWQgc210X2ZpbGxfc2RlKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3Bfc2RlICpzZGUpCit7CisJU01UU0VUUEFSQShzZGUsU01UX1BfU0RFKSA7CisJc2RlLT5zZGVfbm9uX21hc3RlciA9IHNtYy0+bWliLmZkZGlTTVROb25NYXN0ZXJfQ3QgOworCXNkZS0+c2RlX21hc3RlciA9IHNtYy0+bWliLmZkZGlTTVRNYXN0ZXJfQ3QgOworCXNkZS0+c2RlX21hY19jb3VudCA9IE5VTU1BQ1MgOwkJLyogb25seSAxIE1BQyAqLworI2lmZGVmCUNPTkNFTlRSQVRPUgorCXNkZS0+c2RlX3R5cGUgPSBTTVRfU0RFX0NPTkNFTlRSQVRPUiA7CisjZWxzZQorCXNkZS0+c2RlX3R5cGUgPSBTTVRfU0RFX1NUQVRJT04gOworI2VuZGlmCit9CisKKy8qCisgKiBmaWxsIGluIHZhbHVlcyBpbiBzdGF0aW9uIHN0YXRlIHBhcmFtZXRlcgorICovCitzdGF0aWMgdm9pZCBzbXRfZmlsbF9zdGF0ZShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQJdG9wIDsKKwlpbnQJdHdpc3QgOworCisJU01UU0VUUEFSQShzdGF0ZSxTTVRfUF9TVEFURSkgOworCXN0YXRlLT5zdF9wYWQgPSAwIDsKKworCS8qIGRldGVybWluZSB0b3BvbG9neSAqLworCXRvcCA9IDAgOworCWlmIChzbWMtPm1pYi5mZGRpU01UUGVlcldyYXBGbGFnKSB7CisJCXRvcCB8PSBTTVRfU1RfV1JBUFBFRCA7CQkvKiBzdGF0ZSB3cmFwcGVkICovCisJfQorI2lmZGVmCUNPTkNFTlRSQVRPUgorCWlmIChjZm1fc3RhdHVzX3VuYXR0YWNoZWQoc21jKSkgeworCQl0b3AgfD0gU01UX1NUX1VOQVRUQUNIRUQgOwkvKiB1bmF0dGFjaGVkIGNvbmNlbnRyYXRvciAqLworCX0KKyNlbmRpZgorCWlmICgodHdpc3QgPSBwY21fc3RhdHVzX3R3aXN0ZWQoc21jKSkgJiAxKSB7CisJCXRvcCB8PSBTTVRfU1RfVFdJU1RFRF9BIDsJLyogdHdpc3RlZCBjYWJsZSAqLworCX0KKwlpZiAodHdpc3QgJiAyKSB7CisJCXRvcCB8PSBTTVRfU1RfVFdJU1RFRF9CIDsJLyogdHdpc3RlZCBjYWJsZSAqLworCX0KKyNpZmRlZglPUFRfU1JGCisJdG9wIHw9IFNNVF9TVF9TUkYgOworI2VuZGlmCisJaWYgKHBjbV9yb290ZWRfc3RhdGlvbihzbWMpKQorCQl0b3AgfD0gU01UX1NUX1JPT1RFRF9TIDsKKwlpZiAoc21jLT5taWIuYVswXS5mZGRpUEFUSFNiYVBheWxvYWQgIT0gMCkKKwkJdG9wIHw9IFNNVF9TVF9TWU5DX1NFUlZJQ0UgOworCXN0YXRlLT5zdF90b3BvbG9neSA9IHRvcCA7CisJc3RhdGUtPnN0X2R1cGxfYWRkciA9CisJCSgoc21jLT5taWIubVtNQUMwXS5mZGRpTUFDREFfRmxhZyA/IFNNVF9TVF9NWV9EVVBBIDogMCApIHwKKwkJIChzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNVTkRBX0ZsYWcgPyBTTVRfU1RfVU5BX0RVUEEgOiAwKSkgOworfQorCisvKgorICogZmlsbCB2YWx1ZXMgaW4gdGltZXN0YW1wIHBhcmFtZXRlcgorICovCitzdGF0aWMgdm9pZCBzbXRfZmlsbF90aW1lc3RhbXAoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfcF90aW1lc3RhbXAgKnRzKQoreworCisJU01UU0VUUEFSQSh0cyxTTVRfUF9USU1FU1RBTVApIDsKKwlzbXRfc2V0X3RpbWVzdGFtcChzbWMsdHMtPnRzX3RpbWUpIDsKK30KKwordm9pZCBzbXRfc2V0X3RpbWVzdGFtcChzdHJ1Y3Qgc19zbWMgKnNtYywgdV9jaGFyICpwKQoreworCXVfbG9uZwl0aW1lIDsKKwl1X2xvbmcJdXRpbWUgOworCisJLyoKKwkgKiB0aW1lc3RhbXAgaXMgNjQgYml0cyBsb25nIDsgcmVzb2x1dGlvbiBpcyA4MCBuUworCSAqIG91ciBjbG9jayByZXNvbHV0aW9uIGlzIDEwbVMKKwkgKiAxMG1TLzgwbnMgPSAxMjUwMDAgfiAyXjE3ID0gMTMxMDcyCisJICovCisJdXRpbWUgPSBzbXRfZ2V0X3RpbWUoKSA7CisJdGltZSA9IHV0aW1lICogMTAwIDsKKwl0aW1lIC89IFRJQ0tTX1BFUl9TRUNPTkQgOworCXBbMF0gPSAwIDsKKwlwWzFdID0gKHVfY2hhcikoKHRpbWU+Pig4KzgrOCs4LTEpKSAmIDEpIDsKKwlwWzJdID0gKHVfY2hhcikodGltZT4+KDgrOCs4LTEpKSA7CisJcFszXSA9ICh1X2NoYXIpKHRpbWU+Pig4KzgtMSkpIDsKKwlwWzRdID0gKHVfY2hhcikodGltZT4+KDgtMSkpIDsKKwlwWzVdID0gKHVfY2hhcikodGltZTw8MSkgOworCXBbNl0gPSAodV9jaGFyKShzbWMtPnNtLnVuaXFfdGlja3M+PjgpIDsKKwlwWzddID0gKHVfY2hhcilzbWMtPnNtLnVuaXFfdGlja3MgOworCS8qCisJICogbWFrZSBzdXJlIHdlIGRvbid0IHdyYXA6IHJlc3RhcnQgd2hlbmV2ZXIgdGhlIHVwcGVyIGRpZ2l0cyBjaGFuZ2UKKwkgKi8KKwlpZiAodXRpbWUgIT0gc21jLT5zbS51bmlxX3RpbWUpIHsKKwkJc21jLT5zbS51bmlxX3RpY2tzID0gMCA7CisJfQorCXNtYy0+c20udW5pcV90aWNrcysrIDsKKwlzbWMtPnNtLnVuaXFfdGltZSA9IHV0aW1lIDsKK30KKworLyoKKyAqIGZpbGwgdmFsdWVzIGluIHN0YXRpb24gcG9saWN5IHBhcmFtZXRlcgorICovCitzdGF0aWMgdm9pZCBzbXRfZmlsbF9wb2xpY3koc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfcF9wb2xpY3kgKnBvbGljeSkKK3sKKwlpbnQJaSA7CisJdV9jaGFyCSptYXAgOworCXVfc2hvcnQJaW4gOworCXVfc2hvcnQJb3V0IDsKKworCS8qCisJICogTUlCIHBhcmEgMTAxYiAoZmRkaVNNVENvbm5lY3Rpb25Qb2xpY3kpIGNvZGluZworCSAqIGlzIGRpZmZlcmVudCBmcm9tIDAwMDUgY29kaW5nCisJICovCisJc3RhdGljIHVfY2hhcglhbnNpX3dlaXJkbmVzc1sxNl0gPSB7CisJCTAsNyw1LDMsOCwxLDYsNCw5LDEwLDIsMTEsMTIsMTMsMTQsMTUKKwl9IDsKKwlTTVRTRVRQQVJBKHBvbGljeSxTTVRfUF9QT0xJQ1kpIDsKKworCW91dCA9IDAgOworCWluID0gc21jLT5taWIuZmRkaVNNVENvbm5lY3Rpb25Qb2xpY3kgOworCWZvciAoaSA9IDAsIG1hcCA9IGFuc2lfd2VpcmRuZXNzIDsgaSA8IDE2IDsgaSsrKSB7CisJCWlmIChpbiAmIDEpCisJCQlvdXQgfD0gKDE8PCptYXApIDsKKwkJaW4gPj49IDEgOworCQltYXArKyA7CisJfQorCXBvbGljeS0+cGxfY29uZmlnID0gc21jLT5taWIuZmRkaVNNVENvbmZpZ1BvbGljeSA7CisJcG9saWN5LT5wbF9jb25uZWN0ID0gb3V0IDsKK30KKworLyoKKyAqIGZpbGwgdmFsdWVzIGluIGxhdGVuY3kgZXF1aXZhbGVudCBwYXJhbWV0ZXIKKyAqLworc3RhdGljIHZvaWQgc210X2ZpbGxfbGF0ZW5jeShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX2xhdGVuY3kgKmxhdGVuY3kpCit7CisJU01UU0VUUEFSQShsYXRlbmN5LFNNVF9QX0xBVEVOQ1kpIDsKKworCWxhdGVuY3ktPmx0X3BoeW91dF9pZHgxID0gcGh5X2luZGV4KHNtYywwKSA7CisJbGF0ZW5jeS0+bHRfbGF0ZW5jeTEgPSAxMCA7CS8qIGluIG9jdGV0cyAoYnl0ZSBjbG9jaykgKi8KKwkvKgorCSAqIG5vdGU6IGxhdGVuY3kgaGFzIHR3byBwaHkgZW50cmllcyBieSBkZWZpbml0aW9uCisJICogZm9yIGEgU0FTLCB0aGUgMm5kIG9uZSBpcyBudWxsCisJICovCisJaWYgKHNtYy0+cy5zYXMgPT0gU01UX0RBUykgeworCQlsYXRlbmN5LT5sdF9waHlvdXRfaWR4MiA9IHBoeV9pbmRleChzbWMsMSkgOworCQlsYXRlbmN5LT5sdF9sYXRlbmN5MiA9IDEwIDsJLyogaW4gb2N0ZXRzIChieXRlIGNsb2NrKSAqLworCX0KKwllbHNlIHsKKwkJbGF0ZW5jeS0+bHRfcGh5b3V0X2lkeDIgPSAwIDsKKwkJbGF0ZW5jeS0+bHRfbGF0ZW5jeTIgPSAwIDsKKwl9Cit9CisKKy8qCisgKiBmaWxsIHZhbHVlcyBpbiBNQUMgbmVpZ2hib3JzIHBhcmFtZXRlcgorICovCitzdGF0aWMgdm9pZCBzbXRfZmlsbF9uZWlnaGJvcihzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX25laWdoYm9yICpuZWlnaGJvcikKK3sKKwlTTVRTRVRQQVJBKG5laWdoYm9yLFNNVF9QX05FSUdIQk9SUykgOworCisJbmVpZ2hib3ItPm5iX21pYl9pbmRleCA9IElOREVYX01BQyA7CisJbmVpZ2hib3ItPm5iX21hY19pbmRleCA9IG1hY19pbmRleChzbWMsMSkgOworCW5laWdoYm9yLT5uYl91bmEgPSBzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNVcHN0cmVhbU5iciA7CisJbmVpZ2hib3ItPm5iX2RuYSA9IHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0Rvd25zdHJlYW1OYnIgOworfQorCisvKgorICogZmlsbCB2YWx1ZXMgaW4gcGF0aCBkZXNjcmlwdG9yCisgKi8KKyNpZmRlZglDT05DRU5UUkFUT1IKKyNkZWZpbmUgQUxMUEhZUwlOVU1QSFlTCisjZWxzZQorI2RlZmluZSBBTExQSFlTCSgoc21jLT5zLnNhcyA9PSBTTVRfU0FTKSA/IDEgOiAyKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgc210X2ZpbGxfcGF0aChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX3BhdGggKnBhdGgpCit7CisJU0tfTE9DX0RFQ0woaW50LHR5cGUpIDsKKwlTS19MT0NfREVDTChpbnQsc3RhdGUpIDsKKwlTS19MT0NfREVDTChpbnQscmVtb3RlKSA7CisJU0tfTE9DX0RFQ0woaW50LG1hYykgOworCWludAlsZW4gOworCWludAlwIDsKKwlpbnQJcGh5c3AgOworCXN0cnVjdCBzbXRfcGh5X3JlYwkqcGh5IDsKKwlzdHJ1Y3Qgc210X21hY19yZWMJKnBkX21hYyA7CisKKwlsZW4gPQlQQVJBX0xFTiArCisJCXNpemVvZihzdHJ1Y3Qgc210X21hY19yZWMpICogTlVNTUFDUyArCisJCXNpemVvZihzdHJ1Y3Qgc210X3BoeV9yZWMpICogQUxMUEhZUyA7CisJcGF0aC0+cGFyYS5wX3R5cGUgPSBTTVRfUF9QQVRIIDsKKwlwYXRoLT5wYXJhLnBfbGVuID0gbGVuIC0gUEFSQV9MRU4gOworCisJLyogUEhZcyAqLworCWZvciAocCA9IDAscGh5ID0gcGF0aC0+cGRfcGh5IDsgcCA8IEFMTFBIWVMgOyBwKyssIHBoeSsrKSB7CisJCXBoeXNwID0gcCA7CisjaWZuZGVmCUNPTkNFTlRSQVRPUgorCQlpZiAoc21jLT5zLnNhcyA9PSBTTVRfU0FTKQorCQkJcGh5c3AgPSBQUyA7CisjZW5kaWYKKwkJcGNtX3N0YXR1c19zdGF0ZShzbWMscGh5c3AsJnR5cGUsJnN0YXRlLCZyZW1vdGUsJm1hYykgOworI2lmZGVmCUxJVFRMRV9FTkRJQU4KKwkJcGh5LT5waHlfbWliX2luZGV4ID0gc210X3N3YXBfc2hvcnQoKHVfc2hvcnQpcCtJTkRFWF9QT1JUKSA7CisjZWxzZQorCQlwaHktPnBoeV9taWJfaW5kZXggPSBwK0lOREVYX1BPUlQgOworI2VuZGlmCisJCXBoeS0+cGh5X3R5cGUgPSB0eXBlIDsKKwkJcGh5LT5waHlfY29ubmVjdF9zdGF0ZSA9IHN0YXRlIDsKKwkJcGh5LT5waHlfcmVtb3RlX3R5cGUgPSByZW1vdGUgOworCQlwaHktPnBoeV9yZW1vdGVfbWFjID0gbWFjIDsKKwkJcGh5LT5waHlfcmVzb3VyY2VfaWR4ID0gcGh5X2Nvbl9yZXNvdXJjZV9pbmRleChzbWMscCkgOworCX0KKworCS8qIE1BQyAqLworCXBkX21hYyA9IChzdHJ1Y3Qgc210X21hY19yZWMgKikgcGh5IDsKKwlwZF9tYWMtPm1hY19hZGRyID0gc21jLT5taWIubVtNQUMwXS5mZGRpTUFDU01UQWRkcmVzcyA7CisJcGRfbWFjLT5tYWNfcmVzb3VyY2VfaWR4ID0gbWFjX2Nvbl9yZXNvdXJjZV9pbmRleChzbWMsMSkgOworCXJldHVybihsZW4pIDsKK30KKworLyoKKyAqIGZpbGwgdmFsdWVzIGluIG1hYyBzdGF0dXMKKyAqLworc3RhdGljIHZvaWQgc210X2ZpbGxfbWFjX3N0YXR1cyhzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX21hY19zdGF0dXMgKnN0KQoreworCVNNVFNFVFBBUkEoc3QsU01UX1BfTUFDX1NUQVRVUykgOworCisJc3QtPnN0X21pYl9pbmRleCA9IElOREVYX01BQyA7CisJc3QtPnN0X21hY19pbmRleCA9IG1hY19pbmRleChzbWMsMSkgOworCisJbWFjX3VwZGF0ZV9jb3VudGVyKHNtYykgOworCS8qCisJICogdGltZXIgdmFsdWVzIGFyZSByZXByZXNlbnRlZCBpbiBTTVQgYXMgMidzIGNvbXBsZW1lbnQgbnVtYmVycworCSAqIHVuaXRzIDoJaW50ZXJuYWwgOiAgMidzIGNvbXBsZW1lbnQgQkNMSworCSAqLworCXN0LT5zdF90X3JlcSA9IHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1RfUmVxIDsKKwlzdC0+c3RfdF9uZWcgPSBzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNUX05lZyA7CisJc3QtPnN0X3RfbWF4ID0gc21jLT5taWIubVtNQUMwXS5mZGRpTUFDVF9NYXggOworCXN0LT5zdF90dnhfdmFsdWUgPSBzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNUdnhWYWx1ZSA7CisJc3QtPnN0X3RfbWluID0gc21jLT5taWIubVtNQUMwXS5mZGRpTUFDVF9NaW4gOworCisJc3QtPnN0X3NiYSA9IHNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRIU2JhUGF5bG9hZCA7CisJc3QtPnN0X2ZyYW1lX2N0ID0gc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRnJhbWVfQ3QgOworCXN0LT5zdF9lcnJvcl9jdCA9IHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0Vycm9yX0N0IDsKKwlzdC0+c3RfbG9zdF9jdCA9IHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0xvc3RfQ3QgOworfQorCisvKgorICogZmlsbCB2YWx1ZXMgaW4gTEVNIHN0YXR1cworICovCitzdGF0aWMgdm9pZCBzbXRfZmlsbF9sZW0oc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfcF9sZW0gKmxlbSwgaW50IHBoeSkKK3sKKwlzdHJ1Y3QgZmRkaV9taWJfcAkqbWliIDsKKworCW1pYiA9IHNtYy0+eVtwaHldLm1pYiA7CisKKwlTTVRTRVRQQVJBKGxlbSxTTVRfUF9MRU0pIDsKKwlsZW0tPmxlbV9taWJfaW5kZXggPSBwaHkrSU5ERVhfUE9SVCA7CisJbGVtLT5sZW1fcGh5X2luZGV4ID0gcGh5X2luZGV4KHNtYyxwaHkpIDsKKwlsZW0tPmxlbV9wYWQyID0gMCA7CisJbGVtLT5sZW1fY3V0b2ZmID0gbWliLT5mZGRpUE9SVExlcl9DdXRvZmYgOworCWxlbS0+bGVtX2FsYXJtID0gbWliLT5mZGRpUE9SVExlcl9BbGFybSA7CisJLyogbG9uZyB0ZXJtIGJpdCBlcnJvciByYXRlICovCisJbGVtLT5sZW1fZXN0aW1hdGUgPSBtaWItPmZkZGlQT1JUTGVyX0VzdGltYXRlIDsKKwkvKiAjIG9mIHJlamVjdGVkIGNvbm5lY3Rpb25zICovCisJbGVtLT5sZW1fcmVqZWN0X2N0ID0gbWliLT5mZGRpUE9SVExlbV9SZWplY3RfQ3QgOworCWxlbS0+bGVtX2N0ID0gbWliLT5mZGRpUE9SVExlbV9DdCA7CS8qIHRvdGFsIG51bWJlciBvZiBlcnJvcnMgKi8KK30KKworLyoKKyAqIGZpbGwgdmVyc2lvbiBwYXJhbWV0ZXIKKyAqLworc3RhdGljIHZvaWQgc210X2ZpbGxfdmVyc2lvbihzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX3ZlcnNpb24gKnZlcnMpCit7CisJU0tfVU5VU0VEKHNtYykgOworCVNNVFNFVFBBUkEodmVycyxTTVRfUF9WRVJTSU9OKSA7CisJdmVycy0+dl9wYWQgPSAwIDsKKwl2ZXJzLT52X24gPSAxIDsJCQkJLyogb25lIHZlcnNpb24gaXMgZW5vdWdoIC4uICovCisJdmVycy0+dl9pbmRleCA9IDEgOworCXZlcnMtPnZfdmVyc2lvblswXSA9IFNNVF9WSURfMiA7CisJdmVycy0+dl9wYWQyID0gMCA7Cit9CisKKyNpZmRlZglTTVQ2XzEwCisvKgorICogZmlsbCBmcmFtZSBzdGF0dXMgY2FwYWJpbGl0aWVzCisgKi8KKy8qCisgKiBub3RlOiB0aGlzIHBhcmEgMjAwQiBpcyBOT1QgaW4gc3dhcCB0YWJsZSwgYmVjYXVzZSBpdCdzIGFsc28gc2V0IGluCisgKiBQTUYgYWRkX3BhcmEKKyAqLworc3RhdGljIHZvaWQgc210X2ZpbGxfZnNjKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BfZnNjICpmc2MpCit7CisJU0tfVU5VU0VEKHNtYykgOworCVNNVFNFVFBBUkEoZnNjLFNNVF9QX0ZTQykgOworCWZzYy0+ZnNjX3BhZDAgPSAwIDsKKwlmc2MtPmZzY19tYWNfaW5kZXggPSBJTkRFWF9NQUMgOwkvKiB0aGlzIGlzIE1JQiA7IE1JQiBpcyBOT1QKKwkJCQkJCSAqIG1hY19pbmRleCAoKWkgIQorCQkJCQkJICovCisJZnNjLT5mc2NfcGFkMSA9IDAgOworCWZzYy0+ZnNjX3ZhbHVlID0gRlNDX1RZUEUwIDsJCS8qICJub3JtYWwiIG5vZGUgKi8KKyNpZmRlZglMSVRUTEVfRU5ESUFOCisJZnNjLT5mc2NfbWFjX2luZGV4ID0gc210X3N3YXBfc2hvcnQoSU5ERVhfTUFDKSA7CisJZnNjLT5mc2NfdmFsdWUgPSBzbXRfc3dhcF9zaG9ydChGU0NfVFlQRTApIDsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qCisgKiBmaWxsIG1hYyBjb3VudGVyIGZpZWxkCisgKi8KK3N0YXRpYyB2b2lkIHNtdF9maWxsX21hY19jb3VudGVyKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BfbWFjX2NvdW50ZXIgKm1jKQoreworCVNNVFNFVFBBUkEobWMsU01UX1BfTUFDX0NPVU5URVIpIDsKKwltYy0+bWNfbWliX2luZGV4ID0gSU5ERVhfTUFDIDsKKwltYy0+bWNfaW5kZXggPSBtYWNfaW5kZXgoc21jLDEpIDsKKwltYy0+bWNfcmVjZWl2ZV9jdCA9IHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ0NvcGllZF9DdCA7CisJbWMtPm1jX3RyYW5zbWl0X2N0ID0gIHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1RyYW5zbWl0X0N0IDsKK30KKworLyoKKyAqIGZpbGwgbWFjIGZyYW1lIG5vdCBjb3BpZWQgY291bnRlcgorICovCitzdGF0aWMgdm9pZCBzbXRfZmlsbF9tYWNfZm5jKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BfbWFjX2ZuYyAqZm5jKQoreworCVNNVFNFVFBBUkEoZm5jLFNNVF9QX01BQ19GTkMpIDsKKwlmbmMtPm5jX21pYl9pbmRleCA9IElOREVYX01BQyA7CisJZm5jLT5uY19pbmRleCA9IG1hY19pbmRleChzbWMsMSkgOworCWZuYy0+bmNfY291bnRlciA9IHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ05vdENvcGllZF9DdCA7Cit9CisKKworLyoKKyAqIGZpbGwgbWFudWZhY3R1cmVyIGZpZWxkCisgKi8KK3N0YXRpYyB2b2lkIHNtdF9maWxsX21hbnVmYWN0dXJlcihzdHJ1Y3Qgc19zbWMgKnNtYywgCisJCQkJICBzdHJ1Y3Qgc21wX3BfbWFudWZhY3R1cmVyICptYW4pCit7CisJU01UU0VUUEFSQShtYW4sU01UX1BfTUFOVUZBQ1RVUkVSKSA7CisJbWVtY3B5KChjaGFyICopIG1hbi0+bWZfZGF0YSwKKwkJKGNoYXIgKikgc21jLT5taWIuZmRkaVNNVE1hbnVmYWN0dXJlckRhdGEsCisJCXNpemVvZihtYW4tPm1mX2RhdGEpKSA7Cit9CisKKy8qCisgKiBmaWxsIHVzZXIgZmllbGQKKyAqLworc3RhdGljIHZvaWQgc210X2ZpbGxfdXNlcihzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtcF9wX3VzZXIgKnVzZXIpCit7CisJU01UU0VUUEFSQSh1c2VyLFNNVF9QX1VTRVIpIDsKKwltZW1jcHkoKGNoYXIgKikgdXNlci0+dXNfZGF0YSwKKwkJKGNoYXIgKikgc21jLT5taWIuZmRkaVNNVFVzZXJEYXRhLAorCQlzaXplb2YodXNlci0+dXNfZGF0YSkpIDsKK30KKworLyoKKyAqIGZpbGwgc2V0IGNvdW50CisgKi8KK3N0YXRpYyB2b2lkIHNtdF9maWxsX3NldGNvdW50KHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3Bfc2V0Y291bnQgKnNldGNvdW50KQoreworCVNLX1VOVVNFRChzbWMpIDsKKwlTTVRTRVRQQVJBKHNldGNvdW50LFNNVF9QX1NFVENPVU5UKSA7CisJc2V0Y291bnQtPmNvdW50ID0gc21jLT5taWIuZmRkaVNNVFNldENvdW50LmNvdW50IDsKKwltZW1jcHkoKGNoYXIgKilzZXRjb3VudC0+dGltZXN0YW1wLAorCQkoY2hhciAqKXNtYy0+bWliLmZkZGlTTVRTZXRDb3VudC50aW1lc3RhbXAsOCkgOworfQorCisvKgorICogZmlsbCBlY2hvIGRhdGEKKyAqLworc3RhdGljIHZvaWQgc210X2ZpbGxfZWNobyhzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX2VjaG8gKmVjaG8sIHVfbG9uZyBzZWVkLAorCQkJICBpbnQgbGVuKQoreworCXVfY2hhcgkqcCA7CisKKwlTS19VTlVTRUQoc21jKSA7CisJU01UU0VUUEFSQShlY2hvLFNNVF9QX0VDSE9EQVRBKSA7CisJZWNoby0+cGFyYS5wX2xlbiA9IGxlbiA7CisJZm9yIChwID0gZWNoby0+ZWNfZGF0YSA7IGxlbiA7IGxlbi0tKSB7CisJCSpwKysgPSAodV9jaGFyKSBzZWVkIDsKKwkJc2VlZCArPSAxMyA7CisJfQorfQorCisvKgorICogY2xlYXIgRE5BIGFuZCBVTkEKKyAqIGNhbGxlZCBmcm9tIENGTSBpZiBjb25maWd1cmF0aW9uIGNoYW5nZXMKKyAqLwordm9pZCBzbXRfY2xlYXJfdW5hX2RuYShzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNVcHN0cmVhbU5iciA9IFNNVF9Vbmtub3duIDsKKwlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNEb3duc3RyZWFtTmJyID0gU01UX1Vua25vd24gOworfQorCitzdGF0aWMgdm9pZCBzbXRfY2xlYXJfb2xkX3VuYV9kbmEoc3RydWN0IHNfc21jICpzbWMpCit7CisJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDT2xkVXBzdHJlYW1OYnIgPSBTTVRfVW5rbm93biA7CisJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDT2xkRG93bnN0cmVhbU5iciA9IFNNVF9Vbmtub3duIDsKK30KKwordV9sb25nIHNtdF9nZXRfdGlkKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXVfbG9uZwl0aWQgOworCXdoaWxlICgodGlkID0gKysoc21jLT5zbS5zbXRfdGlkKSBeIFNNVF9USURfTUFHSUMpID09IDApCisJCTsKKwlyZXR1cm4odGlkICYgMHgzZmZmZmZmZkwpIDsKK30KKworCisvKgorICogdGFibGUgb2YgcGFyYW1ldGVyIGxlbmd0aHMKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbXRfcGRlZiB7CisJaW50CXB0eXBlIDsKKwlpbnQJcGxlbiA7CisJY29uc3QgY2hhcgkqcHN3YXAgOworfSBzbXRfcGRlZltdID0geworCXsgU01UX1BfVU5BLAlzaXplb2Yoc3RydWN0IHNtdF9wX3VuYSkgLAorCQlTV0FQX1NNVF9QX1VOQQkJCQkJfSAsCisJeyBTTVRfUF9TREUsCXNpemVvZihzdHJ1Y3Qgc210X3Bfc2RlKSAsCisJCVNXQVBfU01UX1BfU0RFCQkJCQl9ICwKKwl7IFNNVF9QX1NUQVRFLAlzaXplb2Yoc3RydWN0IHNtdF9wX3N0YXRlKSAsCisJCVNXQVBfU01UX1BfU1RBVEUJCQkJfSAsCisJeyBTTVRfUF9USU1FU1RBTVAsc2l6ZW9mKHN0cnVjdCBzbXRfcF90aW1lc3RhbXApICwKKwkJU1dBUF9TTVRfUF9USU1FU1RBTVAJCQkJfSAsCisJeyBTTVRfUF9QT0xJQ1ksCXNpemVvZihzdHJ1Y3Qgc210X3BfcG9saWN5KSAsCisJCVNXQVBfU01UX1BfUE9MSUNZCQkJCX0gLAorCXsgU01UX1BfTEFURU5DWSwJc2l6ZW9mKHN0cnVjdCBzbXRfcF9sYXRlbmN5KSAsCisJCVNXQVBfU01UX1BfTEFURU5DWQkJCQl9ICwKKwl7IFNNVF9QX05FSUdIQk9SUyxzaXplb2Yoc3RydWN0IHNtdF9wX25laWdoYm9yKSAsCisJCVNXQVBfU01UX1BfTkVJR0hCT1JTCQkJCX0gLAorCXsgU01UX1BfUEFUSCwJc2l6ZW9mKHN0cnVjdCBzbXRfcF9wYXRoKSAsCisJCVNXQVBfU01UX1BfUEFUSAkJCQkJfSAsCisJeyBTTVRfUF9NQUNfU1RBVFVTLHNpemVvZihzdHJ1Y3Qgc210X3BfbWFjX3N0YXR1cykgLAorCQlTV0FQX1NNVF9QX01BQ19TVEFUVVMJCQkJfSAsCisJeyBTTVRfUF9MRU0sCXNpemVvZihzdHJ1Y3Qgc210X3BfbGVtKSAsCisJCVNXQVBfU01UX1BfTEVNCQkJCQl9ICwKKwl7IFNNVF9QX01BQ19DT1VOVEVSLHNpemVvZihzdHJ1Y3Qgc210X3BfbWFjX2NvdW50ZXIpICwKKwkJU1dBUF9TTVRfUF9NQUNfQ09VTlRFUgkJCQl9ICwKKwl7IFNNVF9QX01BQ19GTkMsc2l6ZW9mKHN0cnVjdCBzbXRfcF9tYWNfZm5jKSAsCisJCVNXQVBfU01UX1BfTUFDX0ZOQwkJCQl9ICwKKwl7IFNNVF9QX1BSSU9SSVRZLHNpemVvZihzdHJ1Y3Qgc210X3BfcHJpb3JpdHkpICwKKwkJU1dBUF9TTVRfUF9QUklPUklUWQkJCQl9ICwKKwl7IFNNVF9QX0VCLHNpemVvZihzdHJ1Y3Qgc210X3BfZWIpICwKKwkJU1dBUF9TTVRfUF9FQgkJCQkJfSAsCisJeyBTTVRfUF9NQU5VRkFDVFVSRVIsc2l6ZW9mKHN0cnVjdCBzbXBfcF9tYW51ZmFjdHVyZXIpICwKKwkJU1dBUF9TTVRfUF9NQU5VRkFDVFVSRVIJCQkJfSAsCisJeyBTTVRfUF9SRUFTT04sCXNpemVvZihzdHJ1Y3Qgc210X3BfcmVhc29uKSAsCisJCVNXQVBfU01UX1BfUkVBU09OCQkJCX0gLAorCXsgU01UX1BfUkVGVVNFRCwgc2l6ZW9mKHN0cnVjdCBzbXRfcF9yZWZ1c2VkKSAsCisJCVNXQVBfU01UX1BfUkVGVVNFRAkJCQl9ICwKKwl7IFNNVF9QX1ZFUlNJT04sIHNpemVvZihzdHJ1Y3Qgc210X3BfdmVyc2lvbikgLAorCQlTV0FQX1NNVF9QX1ZFUlNJT04JCQkJfSAsCisjaWZkZWYgRVNTCisJeyBTTVRfUDAwMTUsIHNpemVvZihzdHJ1Y3Qgc210X3BfMDAxNSkgLCBTV0FQX1NNVF9QMDAxNSB9ICwKKwl7IFNNVF9QMDAxNiwgc2l6ZW9mKHN0cnVjdCBzbXRfcF8wMDE2KSAsIFNXQVBfU01UX1AwMDE2IH0gLAorCXsgU01UX1AwMDE3LCBzaXplb2Yoc3RydWN0IHNtdF9wXzAwMTcpICwgU1dBUF9TTVRfUDAwMTcgfSAsCisJeyBTTVRfUDAwMTgsIHNpemVvZihzdHJ1Y3Qgc210X3BfMDAxOCkgLCBTV0FQX1NNVF9QMDAxOCB9ICwKKwl7IFNNVF9QMDAxOSwgc2l6ZW9mKHN0cnVjdCBzbXRfcF8wMDE5KSAsIFNXQVBfU01UX1AwMDE5IH0gLAorCXsgU01UX1AwMDFBLCBzaXplb2Yoc3RydWN0IHNtdF9wXzAwMWEpICwgU1dBUF9TTVRfUDAwMUEgfSAsCisJeyBTTVRfUDAwMUIsIHNpemVvZihzdHJ1Y3Qgc210X3BfMDAxYikgLCBTV0FQX1NNVF9QMDAxQiB9ICwKKwl7IFNNVF9QMDAxQywgc2l6ZW9mKHN0cnVjdCBzbXRfcF8wMDFjKSAsIFNXQVBfU01UX1AwMDFDIH0gLAorCXsgU01UX1AwMDFELCBzaXplb2Yoc3RydWN0IHNtdF9wXzAwMWQpICwgU1dBUF9TTVRfUDAwMUQgfSAsCisjZW5kaWYKKyNpZgkwCisJeyBTTVRfUF9GU0MsCXNpemVvZihzdHJ1Y3Qgc210X3BfZnNjKSAsCisJCVNXQVBfU01UX1BfRlNDCQkJCQl9ICwKKyNlbmRpZgorCisJeyBTTVRfUF9TRVRDT1VOVCwwLAlTV0FQX1NNVF9QX1NFVENPVU5UCQl9ICwKKwl7IFNNVF9QMTA0OCwJMCwJU1dBUF9TTVRfUDEwNDgJCQl9ICwKKwl7IFNNVF9QMjA4QywJMCwJU1dBUF9TTVRfUDIwOEMJCQl9ICwKKwl7IFNNVF9QMjA4RCwJMCwJU1dBUF9TTVRfUDIwOEQJCQl9ICwKKwl7IFNNVF9QMjA4RSwJMCwJU1dBUF9TTVRfUDIwOEUJCQl9ICwKKwl7IFNNVF9QMjA4RiwJMCwJU1dBUF9TTVRfUDIwOEYJCQl9ICwKKwl7IFNNVF9QMjA5MCwJMCwJU1dBUF9TTVRfUDIwOTAJCQl9ICwKKyNpZmRlZglFU1MKKwl7IFNNVF9QMzIwQiwgc2l6ZW9mKHN0cnVjdCBzbXRfcF8zMjBiKSAsIFNXQVBfU01UX1AzMjBCIH0gLAorCXsgU01UX1AzMjBGLCBzaXplb2Yoc3RydWN0IHNtdF9wXzMyMGYpICwgU1dBUF9TTVRfUDMyMEYgfSAsCisJeyBTTVRfUDMyMTAsIHNpemVvZihzdHJ1Y3Qgc210X3BfMzIxMCkgLCBTV0FQX1NNVF9QMzIxMCB9ICwKKyNlbmRpZgorCXsgU01UX1A0MDUwLAkwLAlTV0FQX1NNVF9QNDA1MAkJCX0gLAorCXsgU01UX1A0MDUxLAkwLAlTV0FQX1NNVF9QNDA1MQkJCX0gLAorCXsgU01UX1A0MDUyLAkwLAlTV0FQX1NNVF9QNDA1MgkJCX0gLAorCXsgU01UX1A0MDUzLAkwLAlTV0FQX1NNVF9QNDA1MwkJCX0gLAorfSA7CisKKyNkZWZpbmUgTl9TTVRfUExFTgkoc2l6ZW9mKHNtdF9wZGVmKS9zaXplb2Yoc210X3BkZWZbMF0pKQorCitpbnQgc210X2NoZWNrX3BhcmEoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfaGVhZGVyCSpzbSwKKwkJICAgY29uc3QgdV9zaG9ydCBsaXN0W10pCit7CisJY29uc3QgdV9zaG9ydAkJKnAgPSBsaXN0IDsKKwl3aGlsZSAoKnApIHsKKwkJaWYgKCFzbV90b19wYXJhKHNtYyxzbSwoaW50KSAqcCkpIHsKKwkJCURCX1NNVCgiU01UOiBzbXRfY2hlY2tfcGFyYSAtIG1pc3NpbmcgcGFyYSAleFxuIiwqcCwwKTsKKwkJCXJldHVybigtMSkgOworCQl9CisJCXArKyA7CisJfQorCXJldHVybigwKSA7Cit9CisKK3ZvaWQgKnNtX3RvX3BhcmEoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfaGVhZGVyICpzbSwgaW50IHBhcmEpCit7CisJY2hhcgkqcCA7CisJaW50CWxlbiA7CisJaW50CXBsZW4gOworCXZvaWQJKmZvdW5kID0gTlVMTDsKKworCVNLX1VOVVNFRChzbWMpIDsKKworCWxlbiA9IHNtLT5zbXRfbGVuIDsKKwlwID0gKGNoYXIgKikoc20rMSkgOwkJLyogcG9pbnRlciB0byBpbmZvICovCisJd2hpbGUgKGxlbiA+IDAgKSB7CisJCWlmICgoKHN0cnVjdCBzbXRfcGFyYSAqKXApLT5wX3R5cGUgPT0gcGFyYSkKKwkJCWZvdW5kID0gKHZvaWQgKikgcCA7CisJCXBsZW4gPSAoKHN0cnVjdCBzbXRfcGFyYSAqKXApLT5wX2xlbiArIFBBUkFfTEVOIDsKKwkJcCArPSBwbGVuIDsKKwkJbGVuIC09IHBsZW4gOworCQlpZiAobGVuIDwgMCkgeworCQkJREJfU01UKCJTTVQgOiBzbV90b19wYXJhIC0gbGVuZ3RoIGVycm9yICVkXG4iLHBsZW4sMCkgOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKChwbGVuICYgMykgJiYgKHBhcmEgIT0gU01UX1BfRUNIT0RBVEEpKSB7CisJCQlEQl9TTVQoIlNNVCA6IHNtX3RvX3BhcmEgLSBvZGQgbGVuZ3RoICVkXG4iLHBsZW4sMCkgOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKGZvdW5kKQorCQkJcmV0dXJuKGZvdW5kKSA7CisJfQorCXJldHVybiBOVUxMOworfQorCisjaWYJMAorLyoKKyAqIHNlbmQgQU5UQyBkYXRhIHRlc3QgZnJhbWUKKyAqLwordm9pZCBmZGRpX3NlbmRfYW50YyhzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IGZkZGlfYWRkciAqZGVzdCkKK3sKKwlTS19VTlVTRUQoc21jKSA7CisJU0tfVU5VU0VEKGRlc3QpIDsKKyNpZgkwCisJU01idWYJCQkqbWIgOworCXN0cnVjdCBzbXRfaGVhZGVyCSpzbXQgOworCWludAkJCWkgOworCWNoYXIJCQkqcCA7CisKKwltYiA9IHNtdF9nZXRfbWJ1ZigpIDsKKwltYi0+c21fbGVuID0gMzAwMCsxMiA7CisJcCA9IHNtdG9kKG1iLCBjaGFyICopICsgMTIgOworCWZvciAoaSA9IDAgOyBpIDwgMzAwMCA7IGkrKykKKwkJKnArKyA9IDEgPDwgKGkmNykgOworCisJc210ID0gc210b2QobWIsIHN0cnVjdCBzbXRfaGVhZGVyICopIDsKKwlzbXQtPnNtdF9kZXN0ID0gKmRlc3QgOworCXNtdC0+c210X3NvdXJjZSA9IHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1NNVEFkZHJlc3MgOworCXNtdF9zZW5kX21idWYoc21jLG1iLEZDX0FTWU5DX0xMQykgOworI2VuZGlmCit9CisjZW5kaWYKKworI2lmZGVmCURFQlVHCisjZGVmaW5lIGhleHRvYXNjKHgpCSIwMTIzNDU2Nzg5YWJjZGVmIlt4XQorCitjaGFyICphZGRyX3RvX3N0cmluZyhzdHJ1Y3QgZmRkaV9hZGRyICphZGRyKQoreworCWludAlpIDsKKwlzdGF0aWMgY2hhcglzdHJpbmdbNiozXSA9ICIqKioqIiA7CisKKwlmb3IgKGkgPSAwIDsgaSA8IDYgOyBpKyspIHsKKwkJc3RyaW5nW2kqM10gPSBoZXh0b2FzYygoYWRkci0+YVtpXT4+NCkmMHhmKSA7CisJCXN0cmluZ1tpKjMrMV0gPSBoZXh0b2FzYygoYWRkci0+YVtpXSkmMHhmKSA7CisJCXN0cmluZ1tpKjMrMl0gPSAnOicgOworCX0KKwlzdHJpbmdbNSozKzJdID0gMCA7CisJcmV0dXJuKHN0cmluZykgOworfQorI2VuZGlmCisKKyNpZmRlZglBTTI5Sworc210X2lmY29uZmlnKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaWYgKGFyZ2MgPj0gMiAmJiAhc3RyY21wKGFyZ3ZbMF0sIm9wdF9ieXBhc3MiKSAmJgorCSAgICAhc3RyY21wKGFyZ3ZbMV0sInllcyIpKSB7CisJCXNtYy0+bWliLmZkZGlTTVRCeXBhc3NQcmVzZW50ID0gMSA7CisJCXJldHVybigwKSA7CisJfQorCXJldHVybihhbWRmZGRpX2NvbmZpZygwLGFyZ2MsYXJndikpIDsKK30KKyNlbmRpZgorCisvKgorICogcmV0dXJuIHN0YXRpYyBtYWMgaW5kZXgKKyAqLworc3RhdGljIGludCBtYWNfaW5kZXgoc3RydWN0IHNfc21jICpzbWMsIGludCBtYWMpCit7CisJU0tfVU5VU0VEKG1hYykgOworI2lmZGVmCUNPTkNFTlRSQVRPUgorCVNLX1VOVVNFRChzbWMpIDsKKwlyZXR1cm4oTlVNUEhZUysxKSA7CisjZWxzZQorCXJldHVybigoc21jLT5zLnNhcyA9PSBTTVRfU0FTKSA/IDIgOiAzKSA7CisjZW5kaWYKK30KKworLyoKKyAqIHJldHVybiBzdGF0aWMgcGh5IGluZGV4CisgKi8KK3N0YXRpYyBpbnQgcGh5X2luZGV4KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcGh5KQoreworCVNLX1VOVVNFRChzbWMpIDsKKwlyZXR1cm4ocGh5KzEpOworfQorCisvKgorICogcmV0dXJuIGR5bmFtaWMgbWFjIGNvbm5lY3Rpb24gcmVzb3VyY2UgaW5kZXgKKyAqLworc3RhdGljIGludCBtYWNfY29uX3Jlc291cmNlX2luZGV4KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbWFjKQoreworI2lmZGVmCUNPTkNFTlRSQVRPUgorCVNLX1VOVVNFRChzbWMpIDsKKwlTS19VTlVTRUQobWFjKSA7CisJcmV0dXJuKGVudGl0eV90b19pbmRleChzbWMsY2VtX2dldF9kb3duc3RyZWFtKHNtYyxFTlRJVFlfTUFDKSkpIDsKKyNlbHNlCisJU0tfVU5VU0VEKG1hYykgOworCXN3aXRjaCAoc21jLT5taWIuZmRkaVNNVENGX1N0YXRlKSB7CisJY2FzZSBTQzlfQ19XUkFQX0EgOgorCWNhc2UgU0M1X1RIUlVfQiA6CisJY2FzZSBTQzExX0NfV1JBUF9TIDoKKwkJcmV0dXJuKDEpIDsKKwljYXNlIFNDMTBfQ19XUkFQX0IgOgorCWNhc2UgU0M0X1RIUlVfQSA6CisJCXJldHVybigyKSA7CisJfQorCXJldHVybihzbWMtPnMuc2FzID09IFNNVF9TQVMgPyAyIDogMykgOworI2VuZGlmCit9CisKKy8qCisgKiByZXR1cm4gZHluYW1pYyBwaHkgY29ubmVjdGlvbiByZXNvdXJjZSBpbmRleAorICovCitzdGF0aWMgaW50IHBoeV9jb25fcmVzb3VyY2VfaW5kZXgoc3RydWN0IHNfc21jICpzbWMsIGludCBwaHkpCit7CisjaWZkZWYJQ09OQ0VOVFJBVE9SCisJcmV0dXJuKGVudGl0eV90b19pbmRleChzbWMsY2VtX2dldF9kb3duc3RyZWFtKHNtYyxFTlRJVFlfUEhZKHBoeSkpKSkgOworI2Vsc2UKKwlzd2l0Y2ggKHNtYy0+bWliLmZkZGlTTVRDRl9TdGF0ZSkgeworCWNhc2UgU0M5X0NfV1JBUF9BIDoKKwkJcmV0dXJuKHBoeSA9PSBQQSA/IDMgOiAyKSA7CisJY2FzZSBTQzEwX0NfV1JBUF9CIDoKKwkJcmV0dXJuKHBoeSA9PSBQQSA/IDEgOiAzKSA7CisJY2FzZSBTQzRfVEhSVV9BIDoKKwkJcmV0dXJuKHBoeSA9PSBQQSA/IDMgOiAxKSA7CisJY2FzZSBTQzVfVEhSVV9CIDoKKwkJcmV0dXJuKHBoeSA9PSBQQSA/IDIgOiAzKSA7CisJY2FzZSBTQzExX0NfV1JBUF9TIDoKKwkJcmV0dXJuKDIpIDsKKwl9CisJcmV0dXJuKHBoeSkgOworI2VuZGlmCit9CisKKyNpZmRlZglDT05DRU5UUkFUT1IKK3N0YXRpYyBpbnQgZW50aXR5X3RvX2luZGV4KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgZSkKK3sKKwlpZiAoZSA9PSBFTlRJVFlfTUFDKQorCQlyZXR1cm4obWFjX2luZGV4KHNtYywxKSkgOworCWVsc2UKKwkJcmV0dXJuKHBoeV9pbmRleChzbWMsZSAtIEVOVElUWV9QSFkoMCkpKSA7Cit9CisjZW5kaWYKKworI2lmZGVmCUxJVFRMRV9FTkRJQU4KK3N0YXRpYyBpbnQgc210X3N3YXBfc2hvcnQodV9zaG9ydCBzKQoreworCXJldHVybigoKHM+PjgpJjB4ZmYpfCgocyYweGZmKTw8OCkpIDsKK30KKwordm9pZCBzbXRfc3dhcF9wYXJhKHN0cnVjdCBzbXRfaGVhZGVyICpzbSwgaW50IGxlbiwgaW50IGRpcmVjdGlvbikKKy8qIGludCBkaXJlY3Rpb247CTAgZW5jb2RlIDEgZGVjb2RlICovCit7CisJc3RydWN0IHNtdF9wYXJhCSpwYSA7CisJY29uc3QgIHN0cnVjdCBzbXRfcGRlZgkqcGQgOworCWNoYXIJKnAgOworCWludAlwbGVuIDsKKwlpbnQJdHlwZSA7CisJaW50CWkgOworCisvKglwcmludGYoInNtdF9zd2FwX3BhcmEgc20gJXggbGVuICVkIGRpciAlZFxuIiwKKwkJc20sbGVuLGRpcmVjdGlvbikgOworICovCisJc210X3N0cmluZ19zd2FwKChjaGFyICopc20sU1dBUF9TTVRIRUFERVIsbGVuKSA7CisKKwkvKiBzd2FwIGFyZ3MgKi8KKwlsZW4gLT0gc2l6ZW9mKHN0cnVjdCBzbXRfaGVhZGVyKSA7CisKKwlwID0gKGNoYXIgKikgKHNtICsgMSkgOworCXdoaWxlIChsZW4gPiAwKSB7CisJCXBhID0gKHN0cnVjdCBzbXRfcGFyYSAqKSBwIDsKKwkJcGxlbiA9IHBhLT5wX2xlbiA7CisJCXR5cGUgPSBwYS0+cF90eXBlIDsKKwkJcGEtPnBfdHlwZSA9IHNtdF9zd2FwX3Nob3J0KHBhLT5wX3R5cGUpIDsKKwkJcGEtPnBfbGVuID0gc210X3N3YXBfc2hvcnQocGEtPnBfbGVuKSA7CisJCWlmIChkaXJlY3Rpb24pIHsKKwkJCXBsZW4gPSBwYS0+cF9sZW4gOworCQkJdHlwZSA9IHBhLT5wX3R5cGUgOworCQl9CisJCS8qCisJCSAqIG5vdGU6IHBhcmFzIGNhbiBoYXZlIDAgbGVuZ3RoICEKKwkJICovCisJCWlmIChwbGVuIDwgMCkKKwkJCWJyZWFrIDsKKwkJcGxlbiArPSBQQVJBX0xFTiA7CisJCWZvciAoaSA9IE5fU01UX1BMRU4sIHBkID0gc210X3BkZWY7IGkgOyBpLS0scGQrKykgeworCQkJaWYgKHBkLT5wdHlwZSA9PSB0eXBlKQorCQkJCWJyZWFrIDsKKwkJfQorCQlpZiAoaSAmJiBwZC0+cHN3YXApIHsKKwkJCXNtdF9zdHJpbmdfc3dhcChwK1BBUkFfTEVOLHBkLT5wc3dhcCxsZW4pIDsKKwkJfQorCQlsZW4gLT0gcGxlbiA7CisJCXAgKz0gcGxlbiA7CisJfQorfQorCitzdGF0aWMgdm9pZCBzbXRfc3RyaW5nX3N3YXAoY2hhciAqZGF0YSwgY29uc3QgY2hhciAqZm9ybWF0LCBpbnQgbGVuKQoreworCWNvbnN0IGNoYXIJKm9wZW5fcGFyZW4gPSAwIDsKKwlpbnQJeCA7CisKKwl3aGlsZSAobGVuID4gMCAgJiYgKmZvcm1hdCkgeworCQlzd2l0Y2ggKCpmb3JtYXQpIHsKKwkJY2FzZSAnWycgOgorCQkJb3Blbl9wYXJlbiA9IGZvcm1hdCA7CisJCQlicmVhayA7CisJCWNhc2UgJ10nIDoKKwkJCWZvcm1hdCA9IG9wZW5fcGFyZW4gOworCQkJYnJlYWsgOworCQljYXNlICcxJyA6CisJCWNhc2UgJzInIDoKKwkJY2FzZSAnMycgOgorCQljYXNlICc0JyA6CisJCWNhc2UgJzUnIDoKKwkJY2FzZSAnNicgOgorCQljYXNlICc3JyA6CisJCWNhc2UgJzgnIDoKKwkJY2FzZSAnOScgOgorCQkJZGF0YSAgKz0gKmZvcm1hdCAtICcwJyA7CisJCQlsZW4gICAtPSAqZm9ybWF0IC0gJzAnIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAnYyc6CisJCQlkYXRhKysgOworCQkJbGVuLS0gOworCQkJYnJlYWsgOworCQljYXNlICdzJyA6CisJCQl4ID0gZGF0YVswXSA7CisJCQlkYXRhWzBdID0gZGF0YVsxXSA7CisJCQlkYXRhWzFdID0geCA7CisJCQlkYXRhICs9IDIgOworCQkJbGVuIC09IDIgOworCQkJYnJlYWsgOworCQljYXNlICdsJyA6CisJCQl4ID0gZGF0YVswXSA7CisJCQlkYXRhWzBdID0gZGF0YVszXSA7CisJCQlkYXRhWzNdID0geCA7CisJCQl4ID0gZGF0YVsxXSA7CisJCQlkYXRhWzFdID0gZGF0YVsyXSA7CisJCQlkYXRhWzJdID0geCA7CisJCQlkYXRhICs9IDQgOworCQkJbGVuIC09IDQgOworCQkJYnJlYWsgOworCQl9CisJCWZvcm1hdCsrIDsKKwl9Cit9CisjZWxzZQordm9pZCBzbXRfc3dhcF9wYXJhKHN0cnVjdCBzbXRfaGVhZGVyICpzbSwgaW50IGxlbiwgaW50IGRpcmVjdGlvbikKKy8qIGludCBkaXJlY3Rpb247CTAgZW5jb2RlIDEgZGVjb2RlICovCit7CisJU0tfVU5VU0VEKHNtKSA7CisJU0tfVU5VU0VEKGxlbikgOworCVNLX1VOVVNFRChkaXJlY3Rpb24pIDsKK30KKyNlbmRpZgorCisvKgorICogUE1GIGFjdGlvbnMKKyAqLworaW50IHNtdF9hY3Rpb24oc3RydWN0IHNfc21jICpzbWMsIGludCBjbGFzcywgaW50IGNvZGUsIGludCBpbmRleCkKK3sKKwlpbnQJZXZlbnQgOworCWludAlwb3J0IDsKKwlEQl9TTVQoIlNNVDogYWN0aW9uICVkIGNvZGUgJWRcbiIsY2xhc3MsY29kZSkgOworCXN3aXRjaChjbGFzcykgeworCWNhc2UgU01UX1NUQVRJT05fQUNUSU9OIDoKKwkJc3dpdGNoKGNvZGUpIHsKKwkJY2FzZSBTTVRfU1RBVElPTl9BQ1RJT05fQ09OTkVDVCA6CisJCQlzbWMtPm1pYi5mZGRpU01UUmVtb3RlRGlzY29ubmVjdEZsYWcgPSBGQUxTRSA7CisJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfRUNNLEVDX0NPTk5FQ1QpIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSBTTVRfU1RBVElPTl9BQ1RJT05fRElTQ09OTkVDVCA6CisJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfRUNNLEVDX0RJU0NPTk5FQ1QpIDsKKwkJCXNtYy0+bWliLmZkZGlTTVRSZW1vdGVEaXNjb25uZWN0RmxhZyA9IFRSVUUgOworCQkJUlNfU0VUKHNtYyxSU19ESVNDT05ORUNUKSA7CisJCQlBSVhfRVZFTlQoc21jLCAodV9sb25nKSBGRERJX1JJTkdfU1RBVFVTLCAodV9sb25nKQorCQkJCUZERElfU01UX0VWRU5ULCAodV9sb25nKSBGRERJX1JFTU9URV9ESVNDT05ORUNULAorCQkJCXNtdF9nZXRfZXZlbnRfd29yZChzbWMpKTsKKwkJCWJyZWFrIDsKKwkJY2FzZSBTTVRfU1RBVElPTl9BQ1RJT05fUEFUSFRFU1QgOgorCQkJQUlYX0VWRU5UKHNtYywgKHVfbG9uZykgRkRESV9SSU5HX1NUQVRVUywgKHVfbG9uZykKKwkJCQlGRERJX1NNVF9FVkVOVCwgKHVfbG9uZykgRkRESV9QQVRIX1RFU1QsCisJCQkJc210X2dldF9ldmVudF93b3JkKHNtYykpOworCQkJYnJlYWsgOworCQljYXNlIFNNVF9TVEFUSU9OX0FDVElPTl9TRUxGVEVTVCA6CisJCQlBSVhfRVZFTlQoc21jLCAodV9sb25nKSBGRERJX1JJTkdfU1RBVFVTLCAodV9sb25nKQorCQkJCUZERElfU01UX0VWRU5ULCAodV9sb25nKSBGRERJX1JFTU9URV9TRUxGX1RFU1QsCisJCQkJc210X2dldF9ldmVudF93b3JkKHNtYykpOworCQkJYnJlYWsgOworCQljYXNlIFNNVF9TVEFUSU9OX0FDVElPTl9ESVNBQkxFX0EgOgorCQkJaWYgKHNtYy0+eVtQQV0ucGNfbW9kZSA9PSBQTV9QRUVSKSB7CisJCQkJUlNfU0VUKHNtYyxSU19FVkVOVCkgOworCQkJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9QQ00rUEEsUENfRElTQUJMRSkgOworCQkJfQorCQkJYnJlYWsgOworCQljYXNlIFNNVF9TVEFUSU9OX0FDVElPTl9ESVNBQkxFX0IgOgorCQkJaWYgKHNtYy0+eVtQQl0ucGNfbW9kZSA9PSBQTV9QRUVSKSB7CisJCQkJUlNfU0VUKHNtYyxSU19FVkVOVCkgOworCQkJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9QQ00rUEIsUENfRElTQUJMRSkgOworCQkJfQorCQkJYnJlYWsgOworCQljYXNlIFNNVF9TVEFUSU9OX0FDVElPTl9ESVNBQkxFX00gOgorCQkJZm9yIChwb3J0ID0gMCA7IHBvcnQgPCAgTlVNUEhZUyA7IHBvcnQrKykgeworCQkJCWlmIChzbWMtPm1pYi5wW3BvcnRdLmZkZGlQT1JUTXlfVHlwZSAhPSBUTSkKKwkJCQkJY29udGludWUgOworCQkJCVJTX1NFVChzbWMsUlNfRVZFTlQpIDsKKwkJCQlxdWV1ZV9ldmVudChzbWMsRVZFTlRfUENNK3BvcnQsUENfRElTQUJMRSkgOworCQkJfQorCQkJYnJlYWsgOworCQlkZWZhdWx0IDoKKwkJCXJldHVybigxKSA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgU01UX1BPUlRfQUNUSU9OIDoKKwkJc3dpdGNoKGNvZGUpIHsKKwkJY2FzZSBTTVRfUE9SVF9BQ1RJT05fRU5BQkxFIDoKKwkJCWV2ZW50ID0gUENfRU5BQkxFIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSBTTVRfUE9SVF9BQ1RJT05fRElTQUJMRSA6CisJCQlldmVudCA9IFBDX0RJU0FCTEUgOworCQkJYnJlYWsgOworCQljYXNlIFNNVF9QT1JUX0FDVElPTl9NQUlOVCA6CisJCQlldmVudCA9IFBDX01BSU5UIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSBTTVRfUE9SVF9BQ1RJT05fU1RBUlQgOgorCQkJZXZlbnQgPSBQQ19TVEFSVCA7CisJCQlicmVhayA7CisJCWNhc2UgU01UX1BPUlRfQUNUSU9OX1NUT1AgOgorCQkJZXZlbnQgPSBQQ19TVE9QIDsKKwkJCWJyZWFrIDsKKwkJZGVmYXVsdCA6CisJCQlyZXR1cm4oMSkgOworCQl9CisJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9QQ00raW5kZXgsZXZlbnQpIDsKKwkJYnJlYWsgOworCWRlZmF1bHQgOgorCQlyZXR1cm4oMSkgOworCX0KKwlyZXR1cm4oMCkgOworfQorCisvKgorICogY2hhbmdlIHRuZWcKKyAqCXNldCBUX1JlcSBpbiBNSUIgKFBhdGggQXR0cmlidXRlKQorICoJY2FsY3VsYXRlIG5ldyB2YWx1ZXMgZm9yIE1BQworICoJaWYgY2hhbmdlIHJlcXVpcmVkCisgKgkJZGlzY29ubmVjdAorICoJCXNldCByZWNvbm5lY3QKKyAqCWVuZAorICovCit2b2lkIHNtdF9jaGFuZ2VfdF9uZWcoc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyB0bmVnKQoreworCXNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRITWF4VF9SZXEgPSB0bmVnIDsKKworCWlmIChzbXRfc2V0X21hY19vcHZhbHVlcyhzbWMpKSB7CisJCVJTX1NFVChzbWMsUlNfRVZFTlQpIDsKKwkJc21jLT5zbS5wbGVhc2VfcmVjb25uZWN0ID0gMSA7CisJCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9FQ00sRUNfRElTQ09OTkVDVCkgOworCX0KK30KKworLyoKKyAqIGNhbm9uaWNhbCBjb252ZXJzaW9uIG9mIDxsZW4+IGJ5dGVzIGJlZ2lubmluZyBmb3JtICpkYXRhCisgKi8KKyNpZmRlZiAgVVNFX0NBTl9BRERSCit2b2lkIGh3bV9jb252X2NhbihzdHJ1Y3Qgc19zbWMgKnNtYywgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwlpbnQgaSA7CisKKwlTS19VTlVTRUQoc21jKSA7CisKKwlmb3IgKGkgPSBsZW47IGkgOyBpLS0sIGRhdGErKykgeworCQkqZGF0YSA9IGNhbm9uaWNhbFsqKHVfY2hhciAqKWRhdGFdIDsKKwl9Cit9CisjZW5kaWYKKworI2VuZGlmCS8qIG5vIFNMSU1fU01UICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvc210ZGVmLmMgYi9kcml2ZXJzL25ldC9za2ZwL3NtdGRlZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMGM4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL3NtdGRlZi5jCkBAIC0wLDAgKzEsMzYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorCVNNVC9DTVQgZGVmYXVsdHMKKyovCisKKyNpbmNsdWRlICJoL3R5cGVzLmgiCisjaW5jbHVkZSAiaC9mZGRpLmgiCisjaW5jbHVkZSAiaC9zbWMuaCIKKworI2lmbmRlZiBPRU1fVVNFUl9EQVRBCisjZGVmaW5lIE9FTV9VU0VSX0RBVEEJIlNLLU5FVCBGRERJIFYyLjAgVXNlcmRhdGEiCisjZW5kaWYKKworI2lmbmRlZglsaW50CitzdGF0aWMgY29uc3QgY2hhciBJRF9zY2NzW10gPSAiQCgjKXNtdGRlZi5jCTIuNTMgOTkvMDgvMTEgKEMpIFNLICIgOworI2VuZGlmCisKKy8qCisgKiBkZWZhdWx0cworICovCisjZGVmaW5lIFRUTVMoeCkJKCh1X2xvbmcpKHgpKjEwMDBMKQorI2RlZmluZSBUVFMoeCkJKCh1X2xvbmcpKHgpKjEwMDAwMDBMKQorI2RlZmluZSBUVFVTKHgpCSgodV9sb25nKSh4KSkKKworI2RlZmluZSBERUZBVUxUX1RCX01JTgkJVFRNUyg1KQorI2RlZmluZSBERUZBVUxUX1RCX01BWAkJVFRNUyg1MCkKKyNkZWZpbmUgREVGQVVMVF9DX01JTgkJVFRVUygxNjAwKQorI2RlZmluZSBERUZBVUxUX1RfT1VUCQlUVE1TKDEwMCs1KQorI2RlZmluZSBERUZBVUxUX1RMX01JTgkJVFRVUygzMCkKKyNkZWZpbmUgREVGQVVMVF9MQ19TSE9SVAlUVE1TKDUwKzUpCisjZGVmaW5lIERFRkFVTFRfTENfTUVESVVNCVRUTVMoNTAwKzIwKQorI2RlZmluZSBERUZBVUxUX0xDX0xPTkcJCVRUUyg1KStUVE1TKDUwKQorI2RlZmluZSBERUZBVUxUX0xDX0VYVEVOREVECVRUUyg1MCkrVFRNUyg1MCkKKyNkZWZpbmUgREVGQVVMVF9UX05FWFRfOQlUVE1TKDIwMCsxMCkKKyNkZWZpbmUgREVGQVVMVF9OU19NQVgJCVRUVVMoMTMxMCkKKyNkZWZpbmUgREVGQVVMVF9JX01BWAkJVFRNUygyNSkKKyNkZWZpbmUgREVGQVVMVF9JTl9NQVgJCVRUTVMoNDApCisjZGVmaW5lIERFRkFVTFRfVERfTUlOCQlUVE1TKDUpCisjZGVmaW5lIERFRkFVTFRfVF9OT05fT1AJVFRTKDEpCisjZGVmaW5lIERFRkFVTFRfVF9TVFVDSwkJVFRTKDgpCisjZGVmaW5lIERFRkFVTFRfVF9ESVJFQ1QJVFRNUygzNzApCisjZGVmaW5lIERFRkFVTFRfVF9KQU0JCVRUTVMoMzcwKQorI2RlZmluZSBERUZBVUxUX1RfQU5OT1VOQ0UJVFRNUygyNTAwKQorI2RlZmluZSBERUZBVUxUX0RfTUFYCQlUVFVTKDE2MTcpCisjZGVmaW5lIERFRkFVTFRfTEVNX0FMQVJNCSg4KQorI2RlZmluZSBERUZBVUxUX0xFTV9DVVRPRkYJKDcpCisjZGVmaW5lIERFRkFVTFRfVEVTVF9ET05FCVRUUygxKQorI2RlZmluZSBERUZBVUxUX0NIRUNLX1BPTEwJVFRTKDEpCisjZGVmaW5lIERFRkFVTFRfUE9MTAkJVFRNUyg1MCkKKworLyoKKyAqIExDVCBlcnJvcnMgdGhyZXNob2xkCisgKi8KKyNkZWZpbmUgREVGQVVMVF9MQ1RfU0hPUlQJMQorI2RlZmluZSBERUZBVUxUX0xDVF9NRURJVU0JMworI2RlZmluZSBERUZBVUxUX0xDVF9MT05HCTUKKyNkZWZpbmUgREVGQVVMVF9MQ1RfRVhURU5ECTUwCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCit2b2lkIHNtdF9yZXNldF9kZWZhdWx0cyhzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGxldmVsKTsKK3N0YXRpYyB2b2lkIHNtdF9pbml0X21pYihzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGxldmVsKTsKK3N0YXRpYyBpbnQgc2V0X21pbl9tYXgoaW50IG1heGZsYWcsIHVfbG9uZyBtaWIsIHVfbG9uZyBsaW1pdCwgdV9sb25nICpvcGVyKTsKKwordm9pZCBzbXRfc2V0X2RlZmF1bHRzKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXNtdF9yZXNldF9kZWZhdWx0cyhzbWMsMCkgOworfQorCisjZGVmaW5lIE1TMkJDTEsoeCkJKCh4KSoxMjUwMEwpCisjZGVmaW5lIFVTMkJDTEsoeCkJKCh4KSoxMjUwTCkKKwordm9pZCBzbXRfcmVzZXRfZGVmYXVsdHMoc3RydWN0IHNfc21jICpzbWMsIGludCBsZXZlbCkKK3sKKwlzdHJ1Y3Qgc210X2NvbmZpZwkqc210IDsKKwlpbnQJCQlpIDsKKwl1X2xvbmcJCQlzbXRfYm9vdF90aW1lOworCisKKwlzbXRfaW5pdF9taWIoc21jLGxldmVsKSA7CisKKwlzbWMtPm9zLnNtY192ZXJzaW9uID0gU01DX1ZFUlNJT04gOworCXNtdF9ib290X3RpbWUgPSBzbXRfZ2V0X3RpbWUoKTsKKwlmb3IoIGkgPSAwOyBpIDwgTlVNTUFDUzsgaSsrICkKKwkJc21jLT5zbS5sYXN0X3Rva190aW1lW2ldID0gc210X2Jvb3RfdGltZSA7CisJc210ID0gJnNtYy0+cyA7CisJc210LT5hdHRhY2hfcyA9IDAgOworCXNtdC0+YnVpbGRfcmluZ19tYXAgPSAxIDsKKwlzbXQtPnNhcyA9IFNNVF9EQVMgOworCXNtdC0+bnVtcGh5cyA9IE5VTVBIWVMgOworCXNtdC0+cGNtX3RiX21pbiA9IERFRkFVTFRfVEJfTUlOIDsKKwlzbXQtPnBjbV90Yl9tYXggPSBERUZBVUxUX1RCX01BWCA7CisJc210LT5wY21fY19taW4gPSBERUZBVUxUX0NfTUlOIDsKKwlzbXQtPnBjbV90X291dCA9IERFRkFVTFRfVF9PVVQgOworCXNtdC0+cGNtX3RsX21pbiA9IERFRkFVTFRfVExfTUlOIDsKKwlzbXQtPnBjbV9sY19zaG9ydCA9IERFRkFVTFRfTENfU0hPUlQgOworCXNtdC0+cGNtX2xjX21lZGl1bSA9IERFRkFVTFRfTENfTUVESVVNIDsKKwlzbXQtPnBjbV9sY19sb25nID0gREVGQVVMVF9MQ19MT05HIDsKKwlzbXQtPnBjbV9sY19leHRlbmRlZCA9IERFRkFVTFRfTENfRVhURU5ERUQgOworCXNtdC0+cGNtX3RfbmV4dF85ID0gREVGQVVMVF9UX05FWFRfOSA7CisJc210LT5wY21fbnNfbWF4ID0gREVGQVVMVF9OU19NQVggOworCXNtdC0+ZWNtX2lfbWF4ID0gREVGQVVMVF9JX01BWCA7CisJc210LT5lY21faW5fbWF4ID0gREVGQVVMVF9JTl9NQVggOworCXNtdC0+ZWNtX3RkX21pbiA9IERFRkFVTFRfVERfTUlOIDsKKwlzbXQtPmVjbV90ZXN0X2RvbmUgPSBERUZBVUxUX1RFU1RfRE9ORSA7CisJc210LT5lY21fY2hlY2tfcG9sbCA9IERFRkFVTFRfQ0hFQ0tfUE9MTCA7CisJc210LT5ybXRfdF9ub25fb3AgPSBERUZBVUxUX1RfTk9OX09QIDsKKwlzbXQtPnJtdF90X3N0dWNrID0gREVGQVVMVF9UX1NUVUNLIDsKKwlzbXQtPnJtdF90X2RpcmVjdCA9IERFRkFVTFRfVF9ESVJFQ1QgOworCXNtdC0+cm10X3RfamFtID0gREVGQVVMVF9UX0pBTSA7CisJc210LT5ybXRfdF9hbm5vdW5jZSA9IERFRkFVTFRfVF9BTk5PVU5DRSA7CisJc210LT5ybXRfdF9wb2xsID0gREVGQVVMVF9QT0xMIDsKKyAgICAgICAgc210LT5ybXRfZHVwX21hY19iZWhhdmlvciA9IEZBTFNFIDsgIC8qIFNlZSBTdHJ1Y3Qgc210X2NvbmZpZyAqLworCXNtdC0+bWFjX2RfbWF4ID0gREVGQVVMVF9EX01BWCA7CisKKwlzbXQtPmxjdF9zaG9ydCA9IERFRkFVTFRfTENUX1NIT1JUIDsKKwlzbXQtPmxjdF9tZWRpdW0gPSBERUZBVUxUX0xDVF9NRURJVU0gOworCXNtdC0+bGN0X2xvbmcgPSBERUZBVUxUX0xDVF9MT05HIDsKKwlzbXQtPmxjdF9leHRlbmRlZCA9IERFRkFVTFRfTENUX0VYVEVORCA7CisKKyNpZm5kZWYJU0xJTV9TTVQKKyNpZmRlZglFU1MKKwlpZiAobGV2ZWwgPT0gMCkgeworCQlzbWMtPmVzcy5zeW5jX2J3X2F2YWlsYWJsZSA9IEZBTFNFIDsKKwkJc21jLT5taWIuZmRkaUVTU1BheWxvYWQgPSAwIDsKKwkJc21jLT5taWIuZmRkaUVTU092ZXJoZWFkID0gMCA7CisJCXNtYy0+bWliLmZkZGlFU1NNYXhUTmVnID0gKHVfbG9uZykoLSBNUzJCQ0xLKDI1KSkgOworCQlzbWMtPm1pYi5mZGRpRVNTTWluU2VnbWVudFNpemUgPSAxIDsKKwkJc21jLT5taWIuZmRkaUVTU0NhdGVnb3J5ID0gU0JfU1RBVElDIDsKKwkJc21jLT5taWIuZmRkaUVTU1N5bmNoVHhNb2RlID0gRkFMU0UgOworCQlzbWMtPmVzcy5yYWZfYWN0X3RpbWVyX3BvbGwgPSBGQUxTRSA7CisJCXNtYy0+ZXNzLnRpbWVyX2NvdW50ID0gNyA7IAkvKiBmaXJzdCBSQUYgYWxjIHJlcSBhZnRlciAzcyAqLworCX0KKwlzbWMtPmVzcy5sb2NhbF9zYmFfYWN0aXZlID0gRkFMU0UgOworCXNtYy0+ZXNzLnNiYV9yZXBseV9wZW5kID0gTlVMTCA7CisjZW5kaWYKKyNpZmRlZglTQkEKKwlzbXRfaW5pdF9zYmEoc21jLGxldmVsKSA7CisjZW5kaWYKKyNlbmRpZgkvKiBubyBTTElNX1NNVCAqLworI2lmZGVmCVRBR19NT0RFCisJaWYgKGxldmVsID09IDApIHsKKwkJc21jLT5ody5wY2lfZml4X3ZhbHVlID0gMCA7CisJfQorI2VuZGlmCit9CisKKy8qCisgKiBtYW51ZmFjdHVyZXIgZGF0YQorICovCitzdGF0aWMgY29uc3QgY2hhciBtYW5fZGF0YVszMl0gPQorLyoJIDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxCSovCisJInh4eFNLLU5FVCBGRERJIFNNVCA3LjMgLSBWMi44LjgiIDsKKworc3RhdGljIHZvaWQgc210X2luaXRfbWliKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbGV2ZWwpCit7CisJc3RydWN0IGZkZGlfbWliCQkqbWliIDsKKwlzdHJ1Y3QgZmRkaV9taWJfcAkqcG0gOworCWludAkJCXBvcnQgOworCWludAkJCXBhdGggOworCisJbWliID0gJnNtYy0+bWliIDsKKwlpZiAobGV2ZWwgPT0gMCkgeworCQkvKgorCQkgKiBzZXQgRVZFUllUSElORyB0byBaRVJPCisJCSAqIEVYQ0VQVCBodyBhbmQgb3MKKwkJICovCisJCW1lbXNldCgoKGNoYXIgKilzbWMpKworCQkJc2l6ZW9mKHN0cnVjdCBzX3NtdF9vcykrc2l6ZW9mKHN0cnVjdCBzX3NtdF9odyksIDAsCisJCQlzaXplb2Yoc3RydWN0IHNfc21jKSAtCisJCQlzaXplb2Yoc3RydWN0IHNfc210X29zKSAtIHNpemVvZihzdHJ1Y3Qgc19zbXRfaHcpKSA7CisJfQorCWVsc2UgeworCQltaWItPmZkZGlTTVRSZW1vdGVEaXNjb25uZWN0RmxhZyA9IDAgOworCQltaWItPmZkZGlTTVRQZWVyV3JhcEZsYWcgPSAwIDsKKwl9CisKKwltaWItPmZkZGlTTVRPcFZlcnNpb25JZCA9IDIgOworCW1pYi0+ZmRkaVNNVEhpVmVyc2lvbklkID0gMiA7CisJbWliLT5mZGRpU01UTG9WZXJzaW9uSWQgPSAyIDsKKwltZW1jcHkoKGNoYXIgKikgbWliLT5mZGRpU01UTWFudWZhY3R1cmVyRGF0YSxtYW5fZGF0YSwzMikgOworCWlmIChsZXZlbCA9PSAwKSB7CisJCXN0cmNweShtaWItPmZkZGlTTVRVc2VyRGF0YSxPRU1fVVNFUl9EQVRBKSA7CisJfQorCW1pYi0+ZmRkaVNNVE1JQlZlcnNpb25JZCA9IDEgOworCW1pYi0+ZmRkaVNNVE1hY19DdCA9IE5VTU1BQ1MgOworCW1pYi0+ZmRkaVNNVENvbm5lY3Rpb25Qb2xpY3kgPSBQT0xJQ1lfTU0gfCBQT0xJQ1lfQUEgfCBQT0xJQ1lfQkIgOworCisJLyoKKwkgKiBmZGRpU01UTm9uTWFzdGVyX0N0IGFuZCBmZGRpU01UTWFzdGVyX0N0IGFyZSBzZXQgaW4gc210X2ZpeHVwX21pYgorCSAqIHMuc2FzIGlzIG5vdCBzZXQgeWV0IChpcyBzZXQgaW4gaW5pdCBkcml2ZXIpCisJICovCisJbWliLT5mZGRpU01UQXZhaWxhYmxlUGF0aHMgPSBNSUJfUEFUSF9QIHwgTUlCX1BBVEhfUyA7CisKKwltaWItPmZkZGlTTVRDb25maWdDYXBhYmlsaXRpZXMgPSAwIDsJLyogbm8gaG9sZCxubyB3cmFwX2FiKi8KKwltaWItPmZkZGlTTVRUVF9Ob3RpZnkgPSAxMCA7CisJbWliLT5mZGRpU01UU3RhdFJwdFBvbGljeSA9IFRSVUUgOworCW1pYi0+ZmRkaVNNVFRyYWNlX01heEV4cGlyYXRpb24gPSBTRUMyTUlCKDcpIDsKKwltaWItPmZkZGlTTVRNQUNJbmRleGVzID0gSU5ERVhfTUFDIDsKKwltaWItPmZkZGlTTVRTdGF0aW9uU3RhdHVzID0gTUlCX1NNVF9TVEFTVEFfU0VQQSA7CS8qIHNlcGFyYXRlZCAqLworCisJbWliLT5tW01BQzBdLmZkZGlNQUNJbmRleCA9IElOREVYX01BQyA7CisJbWliLT5tW01BQzBdLmZkZGlNQUNGcmFtZVN0YXR1c0Z1bmN0aW9ucyA9IEZTQ19UWVBFMCA7CisJbWliLT5tW01BQzBdLmZkZGlNQUNSZXF1ZXN0ZWRQYXRocyA9CisJCU1JQl9QX1BBVEhfTE9DQUwgfAorCQlNSUJfUF9QQVRIX1NFQ19BTFRFUiB8CisJCU1JQl9QX1BBVEhfUFJJTV9BTFRFUiA7CisJbWliLT5tW01BQzBdLmZkZGlNQUNBdmFpbGFibGVQYXRocyA9IE1JQl9QQVRIX1AgOworCW1pYi0+bVtNQUMwXS5mZGRpTUFDQ3VycmVudFBhdGggPSBNSUJfUEFUSF9QUklNQVJZIDsKKwltaWItPm1bTUFDMF0uZmRkaU1BQ1RfTWF4Q2FwYWJpbGl0aXkgPSAodV9sb25nKSgtIE1TMkJDTEsoMTY1KSkgOworCW1pYi0+bVtNQUMwXS5mZGRpTUFDVFZYQ2FwYWJpbGl0aXkgPSAodV9sb25nKSgtIFVTMkJDTEsoNTIpKSA7CisJaWYgKGxldmVsID09IDApIHsKKwkJbWliLT5tW01BQzBdLmZkZGlNQUNUdnhWYWx1ZSA9ICh1X2xvbmcpKC0gVVMyQkNMSygyNykpIDsKKwkJbWliLT5tW01BQzBdLmZkZGlNQUNUdnhWYWx1ZU1JQiA9ICh1X2xvbmcpKC0gVVMyQkNMSygyNykpIDsKKwkJbWliLT5tW01BQzBdLmZkZGlNQUNUX1JlcSA9ICh1X2xvbmcpKC0gTVMyQkNMSygxNjUpKSA7CisJCW1pYi0+bVtNQUMwXS5mZGRpTUFDVF9SZXFNSUIgPSAodV9sb25nKSgtIE1TMkJDTEsoMTY1KSkgOworCQltaWItPm1bTUFDMF0uZmRkaU1BQ1RfTWF4ID0gKHVfbG9uZykoLSBNUzJCQ0xLKDE2NSkpIDsKKwkJbWliLT5tW01BQzBdLmZkZGlNQUNUX01heE1JQiA9ICh1X2xvbmcpKC0gTVMyQkNMSygxNjUpKSA7CisJCW1pYi0+bVtNQUMwXS5mZGRpTUFDVF9NaW4gPSAodV9sb25nKSgtIE1TMkJDTEsoNCkpIDsKKwl9CisJbWliLT5tW01BQzBdLmZkZGlNQUNIYXJkd2FyZVByZXNlbnQgPSBUUlVFIDsKKwltaWItPm1bTUFDMF0uZmRkaU1BQ01BX1VuaXRkYXRhRW5hYmxlID0gVFJVRSA7CisJbWliLT5tW01BQzBdLmZkZGlNQUNGcmFtZUVycm9yVGhyZXNob2xkID0gMSA7CisJbWliLT5tW01BQzBdLmZkZGlNQUNOb3RDb3BpZWRUaHJlc2hvbGQgPSAxIDsKKwkvKgorCSAqIFBhdGggYXR0cmlidXRlcworCSAqLworCWZvciAocGF0aCA9IDAgOyBwYXRoIDwgTlVNUEFUSFMgOyBwYXRoKyspIHsKKwkJbWliLT5hW3BhdGhdLmZkZGlQQVRISW5kZXggPSBJTkRFWF9QQVRIICsgcGF0aCA7CisJCWlmIChsZXZlbCA9PSAwKSB7CisJCQltaWItPmFbcGF0aF0uZmRkaVBBVEhUVlhMb3dlckJvdW5kID0KKwkJCQkodV9sb25nKSgtIFVTMkJDTEsoMjcpKSA7CisJCQltaWItPmFbcGF0aF0uZmRkaVBBVEhUX01heExvd2VyQm91bmQgPQorCQkJCSh1X2xvbmcpKC0gTVMyQkNMSygxNjUpKSA7CisJCQltaWItPmFbcGF0aF0uZmRkaVBBVEhNYXhUX1JlcSA9CisJCQkJKHVfbG9uZykoLSBNUzJCQ0xLKDE2NSkpIDsKKwkJfQorCX0KKworCisJLyoKKwkgKiBQb3J0IGF0dHJpYnV0ZXMKKwkgKi8KKwlwbSA9IG1pYi0+cCA7CisJZm9yIChwb3J0ID0gMCA7IHBvcnQgPCAgTlVNUEhZUyA7IHBvcnQrKykgeworCQkvKgorCQkgKiBzZXQgTUlCIHBvaW50ZXIgaW4gcGh5CisJCSAqLworCQkvKiBBdHRlbnRpb246IGRvbid0IGluaXRpYWxpemUgbWliIHBvaW50ZXIgaGVyZSEgKi8KKwkJLyogIEl0IG11c3QgYmUgaW5pdGlhbGl6ZWQgZHVyaW5nIHBoYXNlIDIgKi8KKwkJc21jLT55W3BvcnRdLm1pYiA9IE5VTEw7CisJCW1pYi0+ZmRkaVNNVFBPUlRJbmRleGVzW3BvcnRdID0gcG9ydCtJTkRFWF9QT1JUIDsKKworCQlwbS0+ZmRkaVBPUlRJbmRleCA9IHBvcnQrSU5ERVhfUE9SVCA7CisJCXBtLT5mZGRpUE9SVEhhcmR3YXJlUHJlc2VudCA9IFRSVUUgOworCQlpZiAobGV2ZWwgPT0gMCkgeworCQkJcG0tPmZkZGlQT1JUTGVyX0FsYXJtID0gREVGQVVMVF9MRU1fQUxBUk0gOworCQkJcG0tPmZkZGlQT1JUTGVyX0N1dG9mZiA9IERFRkFVTFRfTEVNX0NVVE9GRiA7CisJCX0KKwkJLyoKKwkJICogZmRkaVBPUlRSZXF1ZXN0ZWRQYXRocyBhcmUgc2V0IGluIHBjbXBsYy5jCisJCSAqIHdlIGRvbid0IGtub3cgdGhlIHBvcnQgdHlwZSB5ZXQgIQorCQkgKi8KKwkJcG0tPmZkZGlQT1JUUmVxdWVzdGVkUGF0aHNbMV0gPSAwIDsKKwkJcG0tPmZkZGlQT1JUUmVxdWVzdGVkUGF0aHNbMl0gPSAwIDsKKwkJcG0tPmZkZGlQT1JUUmVxdWVzdGVkUGF0aHNbM10gPSAwIDsKKwkJcG0tPmZkZGlQT1JUQXZhaWxhYmxlUGF0aHMgPSBNSUJfUEFUSF9QIDsKKwkJcG0tPmZkZGlQT1JUUE1EQ2xhc3MgPSBNSUJfUE1EQ0xBU1NfTVVMVEkgOworCQlwbSsrIDsKKwl9CisKKwkodm9pZCkgc210X3NldF9tYWNfb3B2YWx1ZXMoc21jKSA7Cit9CisKK2ludCBzbXRfc2V0X21hY19vcHZhbHVlcyhzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlpbnQJc3QgOworCWludAlzdDIgOworCisJc3QgPSBzZXRfbWluX21heCgxLHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1R2eFZhbHVlTUlCLAorCQlzbWMtPm1pYi5hW1BBVEgwXS5mZGRpUEFUSFRWWExvd2VyQm91bmQsCisJCSZzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNUdnhWYWx1ZSkgOworCXN0IHw9IHNldF9taW5fbWF4KDAsc21jLT5taWIubVtNQUMwXS5mZGRpTUFDVF9NYXhNSUIsCisJCXNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRIVF9NYXhMb3dlckJvdW5kLAorCQkmc21jLT5taWIubVtNQUMwXS5mZGRpTUFDVF9NYXgpIDsKKwlzdCB8PSAoc3QyID0gc2V0X21pbl9tYXgoMCxzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNUX1JlcU1JQiwKKwkJc21jLT5taWIuYVtQQVRIMF0uZmRkaVBBVEhNYXhUX1JlcSwKKwkJJnNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1RfUmVxKSkgOworCWlmIChzdDIpIHsKKwkJLyogVHJlcSBhdHRyaWJ1dGUgY2hhbmdlZCByZW1vdGVseS4gU28gc2VuZCBhbiBBSVhfRVZFTlQgdG8gdGhlCisJCSAqIHVzZXIKKwkJICovCisJCUFJWF9FVkVOVChzbWMsICh1X2xvbmcpIEZERElfUklOR19TVEFUVVMsICh1X2xvbmcpCisJCQlGRERJX1NNVF9FVkVOVCwgKHVfbG9uZykgRkRESV9SRU1PVEVfVF9SRVEsCisJCQlzbXRfZ2V0X2V2ZW50X3dvcmQoc21jKSk7CisJfQorCXJldHVybihzdCkgOworfQorCit2b2lkIHNtdF9maXh1cF9taWIoc3RydWN0IHNfc21jICpzbWMpCit7CisjaWZkZWYJQ09OQ0VOVFJBVE9SCisJc3dpdGNoIChzbWMtPnMuc2FzKSB7CisJY2FzZSBTTVRfU0FTIDoKKwkJc21jLT5taWIuZmRkaVNNVE5vbk1hc3Rlcl9DdCA9IDEgOworCQlicmVhayA7CisJY2FzZSBTTVRfREFTIDoKKwkJc21jLT5taWIuZmRkaVNNVE5vbk1hc3Rlcl9DdCA9IDIgOworCQlicmVhayA7CisJY2FzZSBTTVRfTkFDIDoKKwkJc21jLT5taWIuZmRkaVNNVE5vbk1hc3Rlcl9DdCA9IDAgOworCQlicmVhayA7CisJfQorCXNtYy0+bWliLmZkZGlTTVRNYXN0ZXJfQ3QgPSBOVU1QSFlTIC0gc21jLT5taWIuZmRkaVNNVE5vbk1hc3Rlcl9DdCA7CisjZWxzZQorCXN3aXRjaCAoc21jLT5zLnNhcykgeworCWNhc2UgU01UX1NBUyA6CisJCXNtYy0+bWliLmZkZGlTTVROb25NYXN0ZXJfQ3QgPSAxIDsKKwkJYnJlYWsgOworCWNhc2UgU01UX0RBUyA6CisJCXNtYy0+bWliLmZkZGlTTVROb25NYXN0ZXJfQ3QgPSAyIDsKKwkJYnJlYWsgOworCX0KKwlzbWMtPm1pYi5mZGRpU01UTWFzdGVyX0N0ID0gMCA7CisjZW5kaWYKK30KKworLyoKKyAqIGRldGVybWluZSBuZXcgc2V0dGluZyBmb3Igb3BlcmF0aW9uYWwgdmFsdWUKKyAqIGlmIGxpbWl0IGlzIGxvd2VyIHRoYW4gbWliCisgKgl1c2UgbGltaXQKKyAqIGVsc2UKKyAqCXVzZSBtaWIKKyAqIE5PVEUgOiBudW1iZXJzIGFyZSBuZWdhdGl2ZSwgbmVnYXRlIGNvbXBhcmlzb24gIQorICovCitzdGF0aWMgaW50IHNldF9taW5fbWF4KGludCBtYXhmbGFnLCB1X2xvbmcgbWliLCB1X2xvbmcgbGltaXQsIHVfbG9uZyAqb3BlcikKK3sKKwl1X2xvbmcJb2xkIDsKKwlvbGQgPSAqb3BlciA7CisJaWYgKChsaW1pdCA+IG1pYikgXiBtYXhmbGFnKQorCQkqb3BlciA9IGxpbWl0IDsKKwllbHNlCisJCSpvcGVyID0gbWliIDsKKwlyZXR1cm4ob2xkICE9ICpvcGVyKSA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvc210aW5pdC5jIGIvZHJpdmVycy9uZXQvc2tmcC9zbXRpbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M4OTY0YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvc210aW5pdC5jCkBAIC0wLDAgKzEsMTI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorCUluaXQgU01UCisJY2FsbCBhbGwgbW9kdWxlIGxldmVsIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzCisqLworCisjaW5jbHVkZSAiaC90eXBlcy5oIgorI2luY2x1ZGUgImgvZmRkaS5oIgorI2luY2x1ZGUgImgvc21jLmgiCisKKyNpZm5kZWYJbGludAorc3RhdGljIGNvbnN0IGNoYXIgSURfc2Njc1tdID0gIkAoIylzbXRpbml0LmMJMS4xNSA5Ny8wNS8wNiAoQykgU0sgIiA7CisjZW5kaWYKKwordm9pZCBpbml0X2ZkZGlfZHJpdmVyKHN0cnVjdCBzX3NtYyAqc21jLCB1X2NoYXIgKm1hY19hZGRyKTsKKworLyogZGVmaW5lIGdsb2JhbCBkZWJ1ZyB2YXJpYWJsZSAqLworI2lmIGRlZmluZWQoREVCVUcpICYmICFkZWZpbmVkKERFQlVHX0JSRCkKK3N0cnVjdCBzbXRfZGVidWcgZGVidWc7CisjZW5kaWYKKworI2lmbmRlZiBNVUxUX09FTQorI2RlZmluZSBPRU1JRChzbWMsaSkJb2VtX2lkW2ldCisJZXh0ZXJuIHVfY2hhcglvZW1faWRbXSA7CisjZWxzZQkvKiBNVUxUX09FTSAqLworI2RlZmluZSBPRU1JRChzbWMsaSkJc21jLT5ody5vZW1faWQtPm9pX21hcmtbaV0KKwlleHRlcm4gc3RydWN0IHNfb2VtX2lkcwlvZW1faWRzW10gOworI2VuZGlmCS8qIE1VTFRfT0VNICovCisKKy8qCisgKiBTZXQgT0VNIHNwZWNpZmljIHZhbHVlcworICoKKyAqIENhbiBub3QgYmUgY2FsbGVkIGluIHNtdF9yZXNldF9kZWZhdWx0cywgYmVjYXVzZSBpdCBpcyBub3Qgc3VyZSB0aGF0CisgKiB0aGUgT0VNIElEIGlzIGFscmVhZHkgZGVmaW5lZC4KKyAqLworc3RhdGljIHZvaWQgc2V0X29lbV9zcGVjX3ZhbChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzdHJ1Y3QgZmRkaV9taWIgKm1pYiA7CisKKwltaWIgPSAmc21jLT5taWIgOworCisJLyoKKwkgKiBzZXQgSUJNIHNwZWNpZmljIHZhbHVlcworCSAqLworCWlmIChPRU1JRChzbWMsMCkgPT0gJ0knKSB7CisJCW1pYi0+ZmRkaVNNVENvbm5lY3Rpb25Qb2xpY3kgPSBQT0xJQ1lfTU0gOworCX0KK30KKworLyoKKyAqIEluaXQgU01UCisgKi8KK2ludCBpbml0X3NtdChzdHJ1Y3Qgc19zbWMgKnNtYywgdV9jaGFyICptYWNfYWRkcikKKy8qIHVfY2hhciAqbWFjX2FkZHI7CWNhbm9uaWNhbCBhZGRyZXNzIG9yIE5VTEwgKi8KK3sKKwlpbnQJcCA7CisKKyNpZiBkZWZpbmVkKERFQlVHKSAmJiAhZGVmaW5lZChERUJVR19CUkQpCisJZGVidWcuZF9zbXQgPSAwIDsKKwlkZWJ1Zy5kX3NtdGYgPSAwIDsKKwlkZWJ1Zy5kX3JtdCA9IDAgOworCWRlYnVnLmRfZWNtID0gMCA7CisJZGVidWcuZF9wY20gPSAwIDsKKwlkZWJ1Zy5kX2NmbSA9IDAgOworCisJZGVidWcuZF9wbGMgPSAwIDsKKyNpZmRlZglFU1MKKwlkZWJ1Zy5kX2VzcyA9IDAgOworI2VuZGlmCisjaWZkZWYJU0JBCisJZGVidWcuZF9zYmEgPSAwIDsKKyNlbmRpZgorI2VuZGlmCS8qIERFQlVHICYmICFERUJVR19CUkQgKi8KKworCS8qIEZpcnN0IGluaXRpYWxpemUgdGhlIHBvcnRzIG1pYi0+cG9pbnRlcnMgKi8KKwlmb3IgKCBwID0gMDsgcCA8IE5VTVBIWVM7IHAgKysgKSB7CisJCXNtYy0+eVtwXS5taWIgPSAmIHNtYy0+bWliLnBbcF0gOworCX0KKworCXNldF9vZW1fc3BlY192YWwoc21jKSA7CQorCSh2b2lkKSBzbXRfc2V0X21hY19vcHZhbHVlcyhzbWMpIDsKKwlpbml0X2ZkZGlfZHJpdmVyKHNtYyxtYWNfYWRkcikgOwkvKiBIVyBkcml2ZXIgKi8KKwlzbXRfZml4dXBfbWliKHNtYykgOwkJLyogdXBkYXRlIHZhbHVlcyB0aGF0IGRlcGVuZCBvbiBzLnNhcyAqLworCisJZXZfaW5pdChzbWMpIDsJCQkvKiBldmVudCBxdWV1ZSAqLworI2lmbmRlZglTTElNX1NNVAorCXNtdF9pbml0X2V2YyhzbWMpIDsJCS8qIGV2Y3MgaW4gTUlCICovCisjZW5kaWYJLyogbm8gU0xJTV9TTVQgKi8KKwlzbXRfdGltZXJfaW5pdChzbWMpIDsJCS8qIHRpbWVyIHBhY2thZ2UgKi8KKwlzbXRfYWdlbnRfaW5pdChzbWMpIDsJCS8qIFNNVCBmcmFtZSBtYW5hZ2VyICovCisKKwlwY21faW5pdChzbWMpIDsJCQkvKiBQQ00gc3RhdGUgbWFjaGluZSAqLworCWVjbV9pbml0KHNtYykgOwkJCS8qIEVDTSBzdGF0ZSBtYWNoaW5lICovCisJY2ZtX2luaXQoc21jKSA7CQkJLyogQ0ZNIHN0YXRlIG1hY2hpbmUgKi8KKwlybXRfaW5pdChzbWMpIDsJCQkvKiBSTVQgc3RhdGUgbWFjaGluZSAqLworCisJZm9yIChwID0gMCA7IHAgPCBOVU1QSFlTIDsgcCsrKSB7CisJCXBjbShzbWMscCwwKSA7CQkvKiBQQ00gQSBzdGF0ZSBtYWNoaW5lICovCisJfQorCWVjbShzbWMsMCkgOwkJCS8qIEVDTSBzdGF0ZSBtYWNoaW5lICovCisJY2ZtKHNtYywwKSA7CQkJLyogQ0ZNIHN0YXRlIG1hY2hpbmUgKi8KKwlybXQoc21jLDApIDsJCQkvKiBSTVQgc3RhdGUgbWFjaGluZSAqLworCisJc210X2FnZW50X3Rhc2soc21jKSA7CQkvKiBOSUYgRlNNIGV0YyAqLworCisgICAgICAgIFBOTUlfSU5JVChzbWMpIDsgICAgICAgICAgICAgICAgLyogUE5NSSBpbml0aWFsaXphdGlvbiAqLworCisJcmV0dXJuKDApIDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9zbXRwYXJzZS5jIGIvZHJpdmVycy9uZXQvc2tmcC9zbXRwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Nzc5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9za2ZwL3NtdHBhcnNlLmMKQEAgLTAsMCArMSw0NjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkoQylDb3B5cmlnaHQgMTk5OCwxOTk5IFN5c0tvbm5lY3QsCisgKglhIGJ1c2luZXNzIHVuaXQgb2YgU2NobmVpZGVyICYgS29jaCAmIENvLiBEYXRlbnN5c3RlbWUgR21iSC4KKyAqCisgKglTZWUgdGhlIGZpbGUgInNrZmRkaS5jIiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKwlwYXJzZXIgZm9yIFNNVCBwYXJhbWV0ZXJzCisqLworCisjaW5jbHVkZSAiaC90eXBlcy5oIgorI2luY2x1ZGUgImgvZmRkaS5oIgorI2luY2x1ZGUgImgvc21jLmgiCisjaW5jbHVkZSAiaC9zbXRfcC5oIgorCisjZGVmaW5lIEtFUk5FTAorI2luY2x1ZGUgImgvc210c3RhdGUuaCIKKworI2lmbmRlZglsaW50CitzdGF0aWMgY29uc3QgY2hhciBJRF9zY2NzW10gPSAiQCgjKXNtdHBhcnNlLmMJMS4xMiA5OC8xMC8wNiAoQykgU0sgIiA7CisjZW5kaWYKKworI2lmZGVmCXN1bgorI2RlZmluZSBfZmFyCisjZW5kaWYKKworLyoKKyAqIGNvbnZlcnQgdG8gQkNMSyB1bml0cworICovCisjZGVmaW5lIE1TMkJDTEsoeCkgICAgICAoKHgpKjEyNTAwTCkKKyNkZWZpbmUgVVMyQkNMSyh4KSAgICAgICgoeC8xMCkqMTI1TCkKKworLyoKKyAqIHBhcmFtZXRlciB0YWJsZQorICovCitzdGF0aWMgc3RydWN0IHNfcHRhYiB7CisJY2hhcgkqcHRfbmFtZSA7CisJdV9zaG9ydAlwdF9udW0gOworCXVfc2hvcnQJcHRfdHlwZSA7CisJdV9sb25nCXB0X21pbiA7CisJdV9sb25nCXB0X21heCA7Cit9IHB0YWJbXSA9IHsKKwl7ICJQTUZQQVNTV0QiLDAsCTAgfSAsCisJeyAiVVNFUkRBVEEiLDEsCQkwIH0gLAorCXsgIkxFUkNVVE9GRkEiLDIsCTEsCTQsCTE1CX0gLAorCXsgIkxFUkNVVE9GRkIiLDMsCTEsCTQsCTE1CX0gLAorCXsgIkxFUkFMQVJNQSIsNCwJMSwJNCwJMTUJfSAsCisJeyAiTEVSQUxBUk1CIiw1LAkxLAk0LAkxNQl9ICwKKwl7ICJUTUFYIiw2LAkJMSwJNSwJMTY1CX0gLAorCXsgIlRNSU4iLDcsCQkxLAk1LAkxNjUJfSAsCisJeyAiVFJFUSIsOCwJCTEsCTUsCTE2NQl9ICwKKwl7ICJUVlgiLDksCQkxLAkyNTAwLAkxMDAwMAl9ICwKKyNpZmRlZiBFU1MKKwl7ICJTQkFQQVlMT0FEIiwxMCwJMSwJMCwJMTU2Mgl9ICwKKwl7ICJTQkFPVkVSSEVBRCIsMTEsCTEsCTUwLAk1MDAwCX0gLAorCXsgIk1BWFRORUciLDEyLAkJMSwJNSwJMTY1CX0gLAorCXsgIk1JTlNFR01FTlRTSVpFIiwxMywJMSwJMCwJNDQ3OAl9ICwKKwl7ICJTQkFDQVRFR09SWSIsMTQsCTEsCTAsCTB4ZmZmZgl9ICwKKwl7ICJTWU5DSFRYTU9ERSIsMTUsCTAgfSAsCisjZW5kaWYKKyNpZmRlZiBTQkEKKwl7ICJTQkFDT01NQU5EIiwxNiwJMCB9ICwKKwl7ICJTQkFBVkFJTEFCTEUiLDE3LAkxLAkwLAkxMDAJfSAsCisjZW5kaWYKKwl7IE5VTEwgfQorfSA7CisKKy8qIERlZmluZSBtYXhpbXVtIHN0cmluZyBzaXplIGZvciB2YWx1ZXMgYW5kIGtleWJ1ZmZlciAqLworI2RlZmluZSBNQVhfVkFMCTQwCisKKy8qCisgKiBsb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAqLworc3RhdGljIHVfbG9uZyBwYXJzZV9udW0oaW50IHR5cGUsIGNoYXIgX2ZhciAqdmFsdWUsIGNoYXIgKnYsIHVfbG9uZyBtbiwKKwkJCXVfbG9uZyBteCwgaW50IHNjYWxlKTsKK3N0YXRpYyBpbnQgcGFyc2Vfd29yZChjaGFyICpidWYsIGNoYXIgX2ZhciAqdGV4dCk7CisKKyNpZmRlZiBTSU0KKyNkZWZpbmUgREJfTUFJTihhLGIsYykJcHJpbnRmKGEsYixjKQorI2Vsc2UKKyNkZWZpbmUgREJfTUFJTihhLGIsYykKKyNlbmRpZgorCisvKgorICogQkVHSU5fTUFOVUFMX0VOVFJZKCkKKyAqCisgKglpbnQgc210X3BhcnNlX2FyZyhzdHJ1Y3Qgc19zbWMgKixjaGFyIF9mYXIgKmtleXdvcmQsaW50IHR5cGUsCisJCWNoYXIgX2ZhciAqdmFsdWUpCisgKgorICoJcGFyc2UgU01UIHBhcmFtZXRlcgorICoJKmtleXdvcmQKKyAqCQlwb2ludGVyIHRvIGtleXdvcmQsIG11c3QgYmUgXDAsIFxuIG9yIFxyIHRlcm1pbmF0ZWQKKyAqCSp2YWx1ZQlwb2ludGVyIHRvIHZhbHVlLCBlaXRoZXIgY2hhciAqIG9yIHVfbG9uZyAqCisgKgkJaWYgY2hhciAqCisgKgkJCXBvaW50ZXIgdG8gdmFsdWUsIG11c3QgYmUgXDAsIFxuIG9yIFxyIHRlcm1pbmF0ZWQKKyAqCQlpZiB1X2xvbmcgKgorICoJCQljb250YWlucyBiaW5hcnkgdmFsdWUKKyAqCisgKgl0eXBlCTA6IGludGVnZXIKKyAqCQkxOiBzdHJpbmcKKyAqCXJldHVybgorICoJCTAJcGFyYW1ldGVyIHBhcnNlZCBvaworICoJCSE9IDAJZXJyb3IKKyAqCU5PVEU6CisgKgkJZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCB3aXRoIERTICE9IFNTCisgKgorICoKKyAqIEVORF9NQU5VQUxfRU5UUlkoKQorICovCitpbnQgc210X3BhcnNlX2FyZyhzdHJ1Y3Qgc19zbWMgKnNtYywgY2hhciBfZmFyICprZXl3b3JkLCBpbnQgdHlwZSwKKwkJICBjaGFyIF9mYXIgKnZhbHVlKQoreworCWNoYXIJCWtleWJ1ZltNQVhfVkFMKzFdOworCWNoYXIJCXZhbGJ1ZltNQVhfVkFMKzFdOworCWNoYXIJCWMgOworCWNoYXIgCQkqcCA7CisJY2hhcgkJKnYgOworCWNoYXIJCSpkIDsKKwl1X2xvbmcJCXZhbCA9IDAgOworCXN0cnVjdCBzX3B0YWIJKnB0IDsKKwlpbnQJCXN0IDsKKwlpbnQJCWkgOworCisJLyoKKwkgKiBwYXJzZSBrZXl3b3JkCisJICovCisJaWYgKChzdCA9IHBhcnNlX3dvcmQoa2V5YnVmLGtleXdvcmQpKSkKKwkJcmV0dXJuKHN0KSA7CisJLyoKKwkgKiBwYXJzZSB2YWx1ZSBpZiBnaXZlbiBhcyBzdHJpbmcKKwkgKi8KKwlpZiAodHlwZSA9PSAxKSB7CisJCWlmICgoc3QgPSBwYXJzZV93b3JkKHZhbGJ1Zix2YWx1ZSkpKQorCQkJcmV0dXJuKHN0KSA7CisJfQorCS8qCisJICogc2VhcmNoIGluIHRhYmxlCisJICovCisJc3QgPSAwIDsKKwlmb3IgKHB0ID0gcHRhYiA7ICh2ID0gcHQtPnB0X25hbWUpIDsgcHQrKykgeworCQlmb3IgKHAgPSBrZXlidWYgOyAoYyA9ICpwKSA7IHArKyx2KyspIHsKKwkJCWlmIChjICE9ICp2KQorCQkJCWJyZWFrIDsKKwkJfQorCQlpZiAoIWMgJiYgISp2KQorCQkJYnJlYWsgOworCX0KKwlpZiAoIXYpCisJCXJldHVybigtMSkgOworI2lmCTAKKwlwcmludGYoIj0+JXM8PT0+JXM8PVxuIixwdC0+cHRfbmFtZSx2YWxidWYpIDsKKyNlbmRpZgorCS8qCisJICogc2V0IHZhbHVlIGluIE1JQgorCSAqLworCWlmIChwdC0+cHRfdHlwZSkKKwkJdmFsID0gcGFyc2VfbnVtKHR5cGUsdmFsdWUsdmFsYnVmLHB0LT5wdF9taW4scHQtPnB0X21heCwxKSA7CisJc3dpdGNoIChwdC0+cHRfbnVtKSB7CisJY2FzZSAwIDoKKwkJdiA9IHZhbGJ1ZiA7CisJCWQgPSAoY2hhciAqKSBzbWMtPm1pYi5mZGRpUFJQTUZQYXNzd2QgOworCQlmb3IgKGkgPSAwIDsgaSA8IChzaWduZWQpc2l6ZW9mKHNtYy0+bWliLmZkZGlQUlBNRlBhc3N3ZCkgOyBpKyspCisJCQkqZCsrID0gKnYrKyA7CisJCURCX01BSU4oIlNFVCAlcyA9ICVzXG4iLHB0LT5wdF9uYW1lLHNtYy0+bWliLmZkZGlQUlBNRlBhc3N3ZCkgOworCQlicmVhayA7CisJY2FzZSAxIDoKKwkJdiA9IHZhbGJ1ZiA7CisJCWQgPSAoY2hhciAqKSBzbWMtPm1pYi5mZGRpU01UVXNlckRhdGEgOworCQlmb3IgKGkgPSAwIDsgaSA8IChzaWduZWQpc2l6ZW9mKHNtYy0+bWliLmZkZGlTTVRVc2VyRGF0YSkgOyBpKyspCisJCQkqZCsrID0gKnYrKyA7CisJCURCX01BSU4oIlNFVCAlcyA9ICVzXG4iLHB0LT5wdF9uYW1lLHNtYy0+bWliLmZkZGlTTVRVc2VyRGF0YSkgOworCQlicmVhayA7CisJY2FzZSAyIDoKKwkJc21jLT5taWIucFtQQV0uZmRkaVBPUlRMZXJfQ3V0b2ZmID0gKHVfY2hhcikgdmFsIDsKKwkJREJfTUFJTigiU0VUICVzID0gJWRcbiIsCisJCQlwdC0+cHRfbmFtZSxzbWMtPm1pYi5wW1BBXS5mZGRpUE9SVExlcl9DdXRvZmYpIDsKKwkJYnJlYWsgOworCWNhc2UgMyA6CisJCXNtYy0+bWliLnBbUEJdLmZkZGlQT1JUTGVyX0N1dG9mZiA9ICh1X2NoYXIpIHZhbCA7CisJCURCX01BSU4oIlNFVCAlcyA9ICVkXG4iLAorCQkJcHQtPnB0X25hbWUsc21jLT5taWIucFtQQl0uZmRkaVBPUlRMZXJfQ3V0b2ZmKSA7CisJCWJyZWFrIDsKKwljYXNlIDQgOgorCQlzbWMtPm1pYi5wW1BBXS5mZGRpUE9SVExlcl9BbGFybSA9ICh1X2NoYXIpIHZhbCA7CisJCURCX01BSU4oIlNFVCAlcyA9ICVkXG4iLAorCQkJcHQtPnB0X25hbWUsc21jLT5taWIucFtQQV0uZmRkaVBPUlRMZXJfQWxhcm0pIDsKKwkJYnJlYWsgOworCWNhc2UgNSA6CisJCXNtYy0+bWliLnBbUEJdLmZkZGlQT1JUTGVyX0FsYXJtID0gKHVfY2hhcikgdmFsIDsKKwkJREJfTUFJTigiU0VUICVzID0gJWRcbiIsCisJCQlwdC0+cHRfbmFtZSxzbWMtPm1pYi5wW1BCXS5mZGRpUE9SVExlcl9BbGFybSkgOworCQlicmVhayA7CisJY2FzZSA2IDoJCQkvKiBUTUFYICovCisJCURCX01BSU4oIlNFVCAlcyA9ICVkXG4iLHB0LT5wdF9uYW1lLHZhbCkgOworCQlzbWMtPm1pYi5hW1BBVEgwXS5mZGRpUEFUSFRfTWF4TG93ZXJCb3VuZCA9CisJCQkodV9sb25nKSAtTVMyQkNMSygobG9uZyl2YWwpIDsKKwkJYnJlYWsgOworCWNhc2UgNyA6CQkJLyogVE1JTiAqLworCQlEQl9NQUlOKCJTRVQgJXMgPSAlZFxuIixwdC0+cHRfbmFtZSx2YWwpIDsKKwkJc21jLT5taWIubVtNQUMwXS5mZGRpTUFDVF9NaW4gPQorCQkJKHVfbG9uZykgLU1TMkJDTEsoKGxvbmcpdmFsKSA7CisJCWJyZWFrIDsKKwljYXNlIDggOgkJCS8qIFRSRVEgKi8KKwkJREJfTUFJTigiU0VUICVzID0gJWRcbiIscHQtPnB0X25hbWUsdmFsKSA7CisJCXNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRITWF4VF9SZXEgPQorCQkJKHVfbG9uZykgLU1TMkJDTEsoKGxvbmcpdmFsKSA7CisJCWJyZWFrIDsKKwljYXNlIDkgOgkJCS8qIFRWWCAqLworCQlEQl9NQUlOKCJTRVQgJXMgPSAlZCBcbiIscHQtPnB0X25hbWUsdmFsKSA7CisJCXNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRIVFZYTG93ZXJCb3VuZCA9CisJCQkodV9sb25nKSAtVVMyQkNMSygobG9uZyl2YWwpIDsKKwkJYnJlYWsgOworI2lmZGVmCUVTUworCWNhc2UgMTAgOgkJCS8qIFNCQVBBWUxPQUQgKi8KKwkJREJfTUFJTigiU0VUICVzID0gJWRcbiIscHQtPnB0X25hbWUsdmFsKSA7CisJCWlmIChzbWMtPm1pYi5mZGRpRVNTUGF5bG9hZCAhPSB2YWwpIHsKKwkJCXNtYy0+ZXNzLnJhZl9hY3RfdGltZXJfcG9sbCA9IFRSVUUgOworCQkJc21jLT5taWIuZmRkaUVTU1BheWxvYWQgPSB2YWwgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIDExIDoJCQkvKiBTQkFPVkVSSEVBRCAqLworCQlEQl9NQUlOKCJTRVQgJXMgPSAlZFxuIixwdC0+cHRfbmFtZSx2YWwpIDsKKwkJc21jLT5taWIuZmRkaUVTU092ZXJoZWFkID0gdmFsIDsKKwkJYnJlYWsgOworCWNhc2UgMTIgOgkJCS8qIE1BWFRORUcgKi8KKwkJREJfTUFJTigiU0VUICVzID0gJWRcbiIscHQtPnB0X25hbWUsdmFsKSA7CisJCXNtYy0+bWliLmZkZGlFU1NNYXhUTmVnID0gKHVfbG9uZykgLU1TMkJDTEsoKGxvbmcpdmFsKSA7CisJCWJyZWFrIDsKKwljYXNlIDEzIDoJCQkvKiBNSU5TRUdNRU5UU0laRSAqLworCQlEQl9NQUlOKCJTRVQgJXMgPSAlZFxuIixwdC0+cHRfbmFtZSx2YWwpIDsKKwkJc21jLT5taWIuZmRkaUVTU01pblNlZ21lbnRTaXplID0gdmFsIDsKKwkJYnJlYWsgOworCWNhc2UgMTQgOgkJCS8qIFNCQUNBVEVHT1JZICovCisJCURCX01BSU4oIlNFVCAlcyA9ICVkXG4iLHB0LT5wdF9uYW1lLHZhbCkgOworCQlzbWMtPm1pYi5mZGRpRVNTQ2F0ZWdvcnkgPQorCQkJKHNtYy0+bWliLmZkZGlFU1NDYXRlZ29yeSAmIDB4ZmZmZikgfAorCQkJKCh1X2xvbmcpKHZhbCA8PCAxNikpIDsKKwkJYnJlYWsgOworCWNhc2UgMTUgOgkJCS8qIFNZTkNIVFhNT0RFICovCisJCS8qIGRvIG5vdCB1c2UgbWVtY21wKHZhbGJ1ZiwiQUxMIiwzKSBiZWNhdXNlIERTICE9IFNTICovCisJCWlmICh2YWxidWZbMF0gPT0gJ0EnICYmIHZhbGJ1ZlsxXSA9PSAnTCcgJiYgdmFsYnVmWzJdID09ICdMJykgeworCQkJc21jLT5taWIuZmRkaUVTU1N5bmNoVHhNb2RlID0gVFJVRSA7CisJCQlEQl9NQUlOKCJTRVQgJXMgPSAlc1xuIixwdC0+cHRfbmFtZSx2YWxidWYpIDsKKwkJfQorCQkvKiBpZiAoIW1lbWNtcCh2YWxidWYsIlNQTElUIiw1KSkgeyAqLworCQlpZiAodmFsYnVmWzBdID09ICdTJyAmJiB2YWxidWZbMV0gPT0gJ1AnICYmIHZhbGJ1ZlsyXSA9PSAnTCcgJiYKKwkJCXZhbGJ1ZlszXSA9PSAnSScgJiYgdmFsYnVmWzRdID09ICdUJykgeworCQkJREJfTUFJTigiU0VUICVzID0gJXNcbiIscHQtPnB0X25hbWUsdmFsYnVmKSA7CisJCQlzbWMtPm1pYi5mZGRpRVNTU3luY2hUeE1vZGUgPSBGQUxTRSA7CisJCX0KKwkJYnJlYWsgOworI2VuZGlmCisjaWZkZWYJU0JBCisJY2FzZSAxNiA6CQkJLyogU0JBQ09NTUFORCAqLworCQkvKiBpZiAoIW1lbWNtcCh2YWxidWYsIlNUQVJUIiw1KSkgeyAqLworCQlpZiAodmFsYnVmWzBdID09ICdTJyAmJiB2YWxidWZbMV0gPT0gJ1QnICYmIHZhbGJ1ZlsyXSA9PSAnQScgJiYKKwkJCXZhbGJ1ZlszXSA9PSAnUicgJiYgdmFsYnVmWzRdID09ICdUJykgeworCQkJREJfTUFJTigiU0VUICVzID0gJXNcbiIscHQtPnB0X25hbWUsdmFsYnVmKSA7CisJCQlzbWMtPm1pYi5mZGRpU0JBQ29tbWFuZCA9IFNCX1NUQVJUIDsKKwkJfQorCQkvKiBpZiAoIW1lbWNtcCh2YWxidWYsIlNUT1AiLDQpKSB7ICovCisJCWlmICh2YWxidWZbMF0gPT0gJ1MnICYmIHZhbGJ1ZlsxXSA9PSAnVCcgJiYgdmFsYnVmWzJdID09ICdPJyAmJgorCQkJdmFsYnVmWzNdID09ICdQJykgeworCQkJREJfTUFJTigiU0VUICVzID0gJXNcbiIscHQtPnB0X25hbWUsdmFsYnVmKSA7CisJCQlzbWMtPm1pYi5mZGRpU0JBQ29tbWFuZCA9IFNCX1NUT1AgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIDE3IDoJCQkvKiBTQkFBVkFJTEFCTEUgKi8KKwkJREJfTUFJTigiU0VUICVzID0gJWRcbiIscHQtPnB0X25hbWUsdmFsKSA7CisJCXNtYy0+bWliLmZkZGlTQkFBdmFpbGFibGUgPSAodV9jaGFyKSB2YWwgOworCQlicmVhayA7CisjZW5kaWYKKwl9CisJcmV0dXJuKDApIDsKK30KKworc3RhdGljIGludCBwYXJzZV93b3JkKGNoYXIgKmJ1ZiwgY2hhciBfZmFyICp0ZXh0KQoreworCWNoYXIJCWMgOworCWNoYXIgCQkqcCA7CisJaW50CQlwX2xlbiA7CisJaW50CQlxdW90ZSA7CisJaW50CQlpIDsKKwlpbnQJCW9rIDsKKworCS8qCisJICogc2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlCisJICovCisJcCA9IGJ1ZiA7CisJZm9yIChpID0gMCA7IGkgPCBNQVhfVkFMIDsgaSsrKQorCQkqcCsrID0gMCA7CisJcCA9IGJ1ZiA7CisJcF9sZW4gPSAwIDsKKwlvayA9IDAgOworCXdoaWxlICggKGMgPSAqdGV4dCsrKSAmJiAoYyAhPSAnXG4nKSAmJiAoYyAhPSAnXHInKSkgeworCQlpZiAoKGMgIT0gJyAnKSAmJiAoYyAhPSAnXHQnKSkgeworCQkJb2sgPSAxIDsKKwkJCWJyZWFrIDsKKwkJfQorCX0KKwlpZiAoIW9rKQorCQlyZXR1cm4oLTEpIDsKKwlpZiAoYyA9PSAnIicpIHsKKwkJcXVvdGUgPSAxIDsKKwl9CisJZWxzZSB7CisJCXF1b3RlID0gMCA7CisJCXRleHQtLSA7CisJfQorCS8qCisJICogcGFyc2UgdmFsYnVmCisJICovCisJb2sgPSAwIDsKKwl3aGlsZSAoIW9rICYmIHBfbGVuIDwgTUFYX1ZBTC0xICYmIChjID0gKnRleHQrKykgJiYgKGMgIT0gJ1xuJykKKwkJJiYgKGMgIT0gJ1xyJykpIHsKKwkJc3dpdGNoIChxdW90ZSkgeworCQljYXNlIDAgOgorCQkJaWYgKChjID09ICcgJykgfHwgKGMgPT0gJ1x0JykgfHwgKGMgPT0gJz0nKSkgeworCQkJCW9rID0gMSA7CisJCQkJYnJlYWsgOworCQkJfQorCQkJKnArKyA9IGMgOworCQkJcF9sZW4rKyA7CisJCQlicmVhayA7CisJCWNhc2UgMiA6CisJCQkqcCsrID0gYyA7CisJCQlwX2xlbisrIDsKKwkJCXF1b3RlID0gMSA7CisJCQlicmVhayA7CisJCWNhc2UgMSA6CisJCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgJyInIDoKKwkJCQlvayA9IDEgOworCQkJCWJyZWFrIDsKKwkJCWNhc2UgJ1xcJyA6CisJCQkJcXVvdGUgPSAyIDsKKwkJCQlicmVhayA7CisJCQlkZWZhdWx0IDoKKwkJCQkqcCsrID0gYyA7CisJCQkJcF9sZW4rKyA7CisJCQl9CisJCX0KKwl9CisJKnArKyA9IDAgOworCWZvciAocCA9IGJ1ZiA7IChjID0gKnApIDsgcCsrKSB7CisJCWlmIChjID49ICdhJyAmJiBjIDw9ICd6JykKKwkJCSpwID0gYyArICdBJyAtICdhJyA7CisJfQorCXJldHVybigwKSA7Cit9CisKK3N0YXRpYyB1X2xvbmcgcGFyc2VfbnVtKGludCB0eXBlLCBjaGFyIF9mYXIgKnZhbHVlLCBjaGFyICp2LCB1X2xvbmcgbW4sCisJCQl1X2xvbmcgbXgsIGludCBzY2FsZSkKK3sKKwl1X2xvbmcJeCA9IDAgOworCWNoYXIJYyA7CisKKwlpZiAodHlwZSA9PSAwKSB7CQkvKiBpbnRlZ2VyICovCisJCXVfbG9uZyBfZmFyCSpsIDsKKwkJdV9sb25nCQl1MSA7CisKKwkJbCA9ICh1X2xvbmcgX2ZhciAqKSB2YWx1ZSA7CisJCXUxID0gKmwgOworCQkvKgorCQkgKiBpZiB0aGUgdmFsdWUgaXMgbmVnYXRpdmUgdGFrZSB0aGUgbG93ZXIgbGltaXQKKwkJICovCisJCWlmICgobG9uZyl1MSA8IDApIHsKKwkJCWlmICgtICgobG9uZyl1MSkgPiAobG9uZykgbXgpIHsKKwkJCQl1MSA9IDAgOworCQkJfQorCQkJZWxzZSB7CisJCQkJdTEgPSAodV9sb25nKSAtICgobG9uZyl1MSkgOworCQkJfQorCQl9CisJCXggPSB1MSA7CisJfQorCWVsc2UgewkJCQkvKiBzdHJpbmcgKi8KKwkJaW50CXNpZ24gPSAwIDsKKworCQlpZiAoKnYgPT0gJy0nKSB7CisJCQlzaWduID0gMSA7CisJCX0KKwkJd2hpbGUgKChjID0gKnYrKykgJiYgKGMgPj0gJzAnKSAmJiAoYyA8PSAnOScpKSB7CisJCQl4ID0geCAqIDEwICsgYyAtICcwJyA7CisJCX0KKwkJaWYgKHNjYWxlID09IDEwKSB7CisJCQl4ICo9IDEwIDsKKwkJCWlmIChjID09ICcuJykgeworCQkJCWlmICgoYyA9ICp2KyspICYmIChjID49ICcwJykgJiYgKGMgPD0gJzknKSkgeworCQkJCQl4ICs9IGMgLSAnMCcgOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoc2lnbikKKwkJCXggPSAodV9sb25nKSAtICgobG9uZyl4KSA7CisJfQorCS8qCisJICogaWYgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlCisJICoJYW5kIHRoZSBhYnNvbHV0ZSB2YWx1ZSBpcyBvdXRzaWRlIHRoZSBsaW1pdHMKKwkgKgkJdGFrZSB0aGUgbG93ZXIgbGltaXQKKwkgKgllbHNlCisJICoJCXRha2UgdGhlIGFic291dGUgdmFsdWUKKwkgKi8KKwlpZiAoKGxvbmcpeCA8IDApIHsKKwkJaWYgKC0gKChsb25nKXgpID4gKGxvbmcpIG14KSB7CisJCQl4ID0gMCA7CisJCX0KKwkJZWxzZSB7CisJCQl4ID0gKHVfbG9uZykgLSAoKGxvbmcpeCkgOworCQl9CisJfQorCWlmICh4IDwgbW4pCisJCXJldHVybihtbikgOworCWVsc2UgaWYgKHggPiBteCkKKwkJcmV0dXJuKG14KSA7CisJcmV0dXJuKHgpIDsKK30KKworI2lmIDAKK3N0cnVjdAlzX3NtYwlTTUMgOworbWFpbigpCit7CisJY2hhcgkqcCA7CisJY2hhcgkqdiA7CisJY2hhcglidWZbMTAwXSA7CisJaW50CXRvZ2dsZSA9IDAgOworCisJd2hpbGUgKGdldHMoYnVmKSkgeworCQlwID0gYnVmIDsKKwkJd2hpbGUgKCpwICYmICgoKnAgPT0gJyAnKSB8fCAoKnAgPT0gJ1x0JykpKQorCQkJcCsrIDsKKworCQl3aGlsZSAoKnAgJiYgKCgqcCAhPSAnICcpICYmICgqcCAhPSAnXHQnKSkpCisJCQlwKysgOworCisJCXYgPSBwIDsKKwkJd2hpbGUgKCp2ICYmICgoKnYgPT0gJyAnKSB8fCAoKnYgPT0gJ1x0JykpKQorCQkJdisrIDsKKwkJaWYgKCgqdiA+PSAnMCcpICYmICgqdiA8PSAnOScpKSB7CisJCQl0b2dnbGUgPSAhdG9nZ2xlIDsKKwkJCWlmICh0b2dnbGUpIHsKKwkJCQl1X2xvbmcJbCA7CisJCQkJbCA9IGF0b2wodikgOworCQkJCXNtdF9wYXJzZV9hcmcoJlNNQyxidWYsMCwoY2hhciBfZmFyICopJmwpIDsKKwkJCX0KKwkJCWVsc2UKKwkJCQlzbXRfcGFyc2VfYXJnKCZTTUMsYnVmLDEsKGNoYXIgX2ZhciAqKXApIDsKKwkJfQorCQllbHNlIHsKKwkJCXNtdF9wYXJzZV9hcmcoJlNNQyxidWYsMSwoY2hhciBfZmFyICopcCkgOworCQl9CisJfQorCWV4aXQoMCkgOworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvc210dGltZXIuYyBiL2RyaXZlcnMvbmV0L3NrZnAvc210dGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzE3OTVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9zbXR0aW1lci5jCkBAIC0wLDAgKzEsMTU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAorICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCisgKgorICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorCVNNVCB0aW1lcgorKi8KKworI2luY2x1ZGUgImgvdHlwZXMuaCIKKyNpbmNsdWRlICJoL2ZkZGkuaCIKKyNpbmNsdWRlICJoL3NtYy5oIgorCisjaWZuZGVmCWxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIElEX3NjY3NbXSA9ICJAKCMpc210dGltZXIuYwkyLjQgOTcvMDgvMDQgKEMpIFNLICIgOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHRpbWVyX2RvbmUoc3RydWN0IHNfc21jICpzbWMsIGludCByZXN0YXJ0KTsKKwordm9pZCBzbXRfdGltZXJfaW5pdChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzbWMtPnQuc3RfcXVldWUgPSBOVUxMOworCXNtYy0+dC5zdF9mYXN0LnRtX2FjdGl2ZSA9IEZBTFNFIDsKKwlzbWMtPnQuc3RfZmFzdC50bV9uZXh0ID0gTlVMTDsKKwlod3RfaW5pdChzbWMpIDsKK30KKwordm9pZCBzbXRfdGltZXJfc3RvcChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF90aW1lciAqdGltZXIpCit7CisJc3RydWN0IHNtdF90aW1lcgkqKnByZXYgOworCXN0cnVjdCBzbXRfdGltZXIJKnRtIDsKKworCS8qCisJICogcmVtb3ZlIHRpbWVyIGZyb20gcXVldWUKKwkgKi8KKwl0aW1lci0+dG1fYWN0aXZlID0gRkFMU0UgOworCWlmIChzbWMtPnQuc3RfcXVldWUgPT0gdGltZXIgJiYgIXRpbWVyLT50bV9uZXh0KSB7CisJCWh3dF9zdG9wKHNtYykgOworCX0KKwlmb3IgKHByZXYgPSAmc21jLT50LnN0X3F1ZXVlIDsgKHRtID0gKnByZXYpIDsgcHJldiA9ICZ0bS0+dG1fbmV4dCApIHsKKwkJaWYgKHRtID09IHRpbWVyKSB7CisJCQkqcHJldiA9IHRtLT50bV9uZXh0IDsKKwkJCWlmICh0bS0+dG1fbmV4dCkgeworCQkJCXRtLT50bV9uZXh0LT50bV9kZWx0YSArPSB0bS0+dG1fZGVsdGEgOworCQkJfQorCQkJcmV0dXJuIDsKKwkJfQorCX0KK30KKwordm9pZCBzbXRfdGltZXJfc3RhcnQoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfdGltZXIgKnRpbWVyLCB1X2xvbmcgdGltZSwKKwkJICAgICB1X2xvbmcgdG9rZW4pCit7CisJc3RydWN0IHNtdF90aW1lcgkqKnByZXYgOworCXN0cnVjdCBzbXRfdGltZXIJKnRtIDsKKwl1X2xvbmcJCQlkZWx0YSA9IDAgOworCisJdGltZSAvPSAxNiA7CQkvKiBpbnB1dCBpcyB1UywgY2xvY2sgdGlja3MgYXJlIDE2dVMgKi8KKwlpZiAoIXRpbWUpCisJCXRpbWUgPSAxIDsKKwlzbXRfdGltZXJfc3RvcChzbWMsdGltZXIpIDsKKwl0aW1lci0+dG1fc21jID0gc21jIDsKKwl0aW1lci0+dG1fdG9rZW4gPSB0b2tlbiA7CisJdGltZXItPnRtX2FjdGl2ZSA9IFRSVUUgOworCWlmICghc21jLT50LnN0X3F1ZXVlKSB7CisJCXNtYy0+dC5zdF9xdWV1ZSA9IHRpbWVyIDsKKwkJdGltZXItPnRtX25leHQgPSBOVUxMOworCQl0aW1lci0+dG1fZGVsdGEgPSB0aW1lIDsKKwkJaHd0X3N0YXJ0KHNtYyx0aW1lKSA7CisJCXJldHVybiA7CisJfQorCS8qCisJICogdGltZXIgY29ycmVjdGlvbgorCSAqLworCXRpbWVyX2RvbmUoc21jLDApIDsKKworCS8qCisJICogZmluZCBwb3NpdGlvbiBpbiBxdWV1ZQorCSAqLworCWRlbHRhID0gMCA7CisJZm9yIChwcmV2ID0gJnNtYy0+dC5zdF9xdWV1ZSA7ICh0bSA9ICpwcmV2KSA7IHByZXYgPSAmdG0tPnRtX25leHQgKSB7CisJCWlmIChkZWx0YSArIHRtLT50bV9kZWx0YSA+IHRpbWUpIHsKKwkJCWJyZWFrIDsKKwkJfQorCQlkZWx0YSArPSB0bS0+dG1fZGVsdGEgOworCX0KKwkvKiBpbnNlcnQgaW4gcXVldWUgKi8KKwkqcHJldiA9IHRpbWVyIDsKKwl0aW1lci0+dG1fbmV4dCA9IHRtIDsKKwl0aW1lci0+dG1fZGVsdGEgPSB0aW1lIC0gZGVsdGEgOworCWlmICh0bSkKKwkJdG0tPnRtX2RlbHRhIC09IHRpbWVyLT50bV9kZWx0YSA7CisJLyoKKwkgKiBzdGFydCBuZXcgd2l0aCBmaXJzdAorCSAqLworCWh3dF9zdGFydChzbWMsc21jLT50LnN0X3F1ZXVlLT50bV9kZWx0YSkgOworfQorCit2b2lkIHNtdF9mb3JjZV9pcnEoc3RydWN0IHNfc21jICpzbWMpCit7CisJc210X3RpbWVyX3N0YXJ0KHNtYywmc21jLT50LnN0X2Zhc3QsMzJMLCBFVl9UT0tFTihFVkVOVF9TTVQsU01fRkFTVCkpOyAKK30KKwordm9pZCBzbXRfdGltZXJfZG9uZShzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwl0aW1lcl9kb25lKHNtYywxKSA7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVyX2RvbmUoc3RydWN0IHNfc21jICpzbWMsIGludCByZXN0YXJ0KQoreworCXVfbG9uZwkJCWRlbHRhIDsKKwlzdHJ1Y3Qgc210X3RpbWVyCSp0bSA7CisJc3RydWN0IHNtdF90aW1lcgkqbmV4dCA7CisJc3RydWN0IHNtdF90aW1lcgkqKmxhc3QgOworCWludAkJCWRvbmUgPSAwIDsKKworCWRlbHRhID0gaHd0X3JlYWQoc21jKSA7CisJbGFzdCA9ICZzbWMtPnQuc3RfcXVldWUgOworCXRtID0gc21jLT50LnN0X3F1ZXVlIDsKKwl3aGlsZSAodG0gJiYgIWRvbmUpIHsKKwkJaWYgKGRlbHRhID49IHRtLT50bV9kZWx0YSkgeworCQkJdG0tPnRtX2FjdGl2ZSA9IEZBTFNFIDsKKwkJCWRlbHRhIC09IHRtLT50bV9kZWx0YSA7CisJCQlsYXN0ID0gJnRtLT50bV9uZXh0IDsKKwkJCXRtID0gdG0tPnRtX25leHQgOworCQl9CisJCWVsc2UgeworCQkJdG0tPnRtX2RlbHRhIC09IGRlbHRhIDsKKwkJCWRlbHRhID0gMCA7CisJCQlkb25lID0gMSA7CisJCX0KKwl9CisJKmxhc3QgPSBOVUxMOworCW5leHQgPSBzbWMtPnQuc3RfcXVldWUgOworCXNtYy0+dC5zdF9xdWV1ZSA9IHRtIDsKKworCWZvciAoIHRtID0gbmV4dCA7IHRtIDsgdG0gPSBuZXh0KSB7CisJCW5leHQgPSB0bS0+dG1fbmV4dCA7CisJCXRpbWVyX2V2ZW50KHNtYyx0bS0+dG1fdG9rZW4pIDsKKwl9CisKKwlpZiAocmVzdGFydCAmJiBzbWMtPnQuc3RfcXVldWUpCisJCWh3dF9zdGFydChzbWMsc21jLT50LnN0X3F1ZXVlLT50bV9kZWx0YSkgOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL3NyZi5jIGIvZHJpdmVycy9uZXQvc2tmcC9zcmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjU3M2FjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9zcmYuYwpAQCAtMCwwICsxLDQyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKKyAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgorICoKKyAqCVNlZSB0aGUgZmlsZSAic2tmZGRpLmMiIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKwlTTVQgNy4yIFN0YXR1cyBSZXNwb25zZSBGcmFtZSBJbXBsZW1lbnRhdGlvbgorCVNSRiBzdGF0ZSBtYWNoaW5lIGFuZCBmcmFtZSBnZW5lcmF0aW9uCisqLworCisjaW5jbHVkZSAiaC90eXBlcy5oIgorI2luY2x1ZGUgImgvZmRkaS5oIgorI2luY2x1ZGUgImgvc21jLmgiCisjaW5jbHVkZSAiaC9zbXRfcC5oIgorCisjZGVmaW5lIEtFUk5FTAorI2luY2x1ZGUgImgvc210c3RhdGUuaCIKKworI2lmbmRlZglTTElNX1NNVAorI2lmbmRlZglCT09UCisKKyNpZm5kZWYJbGludAorc3RhdGljIGNvbnN0IGNoYXIgSURfc2Njc1tdID0gIkAoIylzcmYuYwkxLjE4IDk3LzA4LzA0IChDKSBTSyAiIDsKKyNlbmRpZgorCisKKy8qCisgKiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAqLworc3RhdGljIHZvaWQgY2xlYXJfYWxsX3JlcChzdHJ1Y3Qgc19zbWMgKnNtYyk7CitzdGF0aWMgdm9pZCBjbGVhcl9yZXBvcnRlZChzdHJ1Y3Qgc19zbWMgKnNtYyk7CitzdGF0aWMgdm9pZCBzbXRfc2VuZF9zcmYoc3RydWN0IHNfc21jICpzbWMpOworc3RhdGljIHN0cnVjdCBzX3NyZl9ldmMgKnNtdF9nZXRfZXZjKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgY29kZSwgaW50IGluZGV4KTsKKworI2RlZmluZSBNQVhfRVZDUwkoc2l6ZW9mKHNtYy0+ZXZjcykvc2l6ZW9mKHNtYy0+ZXZjc1swXSkpCisKK3N0cnVjdCBldmNfaW5pdCB7CisJdV9jaGFyIGNvZGUgOworCXVfY2hhciBpbmRleCA7CisJdV9jaGFyIG4gOworCXVfc2hvcnQJcGFyYSA7Cit9ICA7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXZjX2luaXQgZXZjX2luaXRzW10gPSB7CisJeyBTTVRfQ09ORF9TTVRfUEVFUl9XUkFQLAkJMCwxLFNNVF9QMTA0OAl9ICwKKworCXsgU01UX0NPTkRfTUFDX0RVUF9BRERSLAkJSU5ERVhfTUFDLCBOVU1NQUNTLFNNVF9QMjA4QyB9ICwKKwl7IFNNVF9DT05EX01BQ19GUkFNRV9FUlJPUiwJCUlOREVYX01BQywgTlVNTUFDUyxTTVRfUDIwOEQgfSAsCisJeyBTTVRfQ09ORF9NQUNfTk9UX0NPUElFRCwJCUlOREVYX01BQywgTlVNTUFDUyxTTVRfUDIwOEUgfSAsCisJeyBTTVRfRVZFTlRfTUFDX05FSUdIQk9SX0NIQU5HRSwJSU5ERVhfTUFDLCBOVU1NQUNTLFNNVF9QMjA4RiB9ICwKKwl7IFNNVF9FVkVOVF9NQUNfUEFUSF9DSEFOR0UsCQlJTkRFWF9NQUMsIE5VTU1BQ1MsU01UX1AyMDkwIH0gLAorCisJeyBTTVRfQ09ORF9QT1JUX0xFUiwJCQlJTkRFWF9QT1JULE5VTVBIWVMsU01UX1A0MDUwIH0gLAorCXsgU01UX0NPTkRfUE9SVF9FQl9FUlJPUiwJCUlOREVYX1BPUlQsTlVNUEhZUyxTTVRfUDQwNTIgfSAsCisJeyBTTVRfRVZFTlRfUE9SVF9DT05ORUNUSU9OLAkJSU5ERVhfUE9SVCxOVU1QSFlTLFNNVF9QNDA1MSB9ICwKKwl7IFNNVF9FVkVOVF9QT1JUX1BBVEhfQ0hBTkdFLAkJSU5ERVhfUE9SVCxOVU1QSFlTLFNNVF9QNDA1MyB9ICwKK30gOworCisjZGVmaW5lIE1BWF9JTklUX0VWQwkoc2l6ZW9mKGV2Y19pbml0cykvc2l6ZW9mKGV2Y19pbml0c1swXSkpCisKK3ZvaWQgc210X2luaXRfZXZjKHN0cnVjdCBzX3NtYyAqc21jKQoreworCXN0cnVjdCBzX3NyZl9ldmMJKmV2YyA7CisJY29uc3Qgc3RydWN0IGV2Y19pbml0IAkqaW5pdCA7CisJaW50CQkJaSA7CisJaW50CQkJaW5kZXggOworCWludAkJCW9mZnNldCA7CisKKwlzdGF0aWMgdV9jaGFyCQlmYWlsX3NhZmUgPSBGQUxTRSA7CisKKwltZW1zZXQoKGNoYXIgKilzbWMtPmV2Y3MsMCxzaXplb2Yoc21jLT5ldmNzKSkgOworCisJZXZjID0gc21jLT5ldmNzIDsKKwlpbml0ID0gZXZjX2luaXRzIDsKKworCWZvciAoaSA9IDAgOyAodW5zaWduZWQpIGkgPCBNQVhfSU5JVF9FVkMgOyBpKyspIHsKKwkJZm9yIChpbmRleCA9IDAgOyBpbmRleCA8IGluaXQtPm4gOyBpbmRleCsrKSB7CisJCQlldmMtPmV2Y19jb2RlID0gaW5pdC0+Y29kZSA7CisJCQlldmMtPmV2Y19wYXJhID0gaW5pdC0+cGFyYSA7CisJCQlldmMtPmV2Y19pbmRleCA9IGluaXQtPmluZGV4ICsgaW5kZXggOworI2lmbmRlZglERUJVRworCQkJZXZjLT5ldmNfbXVsdGlwbGUgPSAmZmFpbF9zYWZlIDsKKwkJCWV2Yy0+ZXZjX2NvbmRfc3RhdGUgPSAmZmFpbF9zYWZlIDsKKyNlbmRpZgorCQkJZXZjKysgOworCQl9CisJCWluaXQrKyA7CisJfQorCisJaWYgKCh1bnNpZ25lZCkgKGV2YyAtIHNtYy0+ZXZjcykgPiBNQVhfRVZDUykgeworCQlTTVRfUEFOSUMoc21jLFNNVF9FMDEyNywgU01UX0UwMTI3X01TRykgOworCX0KKworCS8qCisJICogY29uZGl0aW9ucworCSAqLworCXNtYy0+ZXZjc1swXS5ldmNfY29uZF9zdGF0ZSA9ICZzbWMtPm1pYi5mZGRpU01UUGVlcldyYXBGbGFnIDsKKwlzbWMtPmV2Y3NbMV0uZXZjX2NvbmRfc3RhdGUgPQorCQkmc21jLT5taWIubVtNQUMwXS5mZGRpTUFDRHVwbGljYXRlQWRkcmVzc0NvbmQgOworCXNtYy0+ZXZjc1syXS5ldmNfY29uZF9zdGF0ZSA9CisJCSZzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNGcmFtZUVycm9yRmxhZyA7CisJc21jLT5ldmNzWzNdLmV2Y19jb25kX3N0YXRlID0KKwkJJnNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ05vdENvcGllZEZsYWcgOworCisJLyoKKwkgKiBldmVudHMKKwkgKi8KKwlzbWMtPmV2Y3NbNF0uZXZjX211bHRpcGxlID0gJnNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ011bHRpcGxlX04gOworCXNtYy0+ZXZjc1s1XS5ldmNfbXVsdGlwbGUgPSAmc21jLT5taWIubVtNQUMwXS5mZGRpTUFDTXVsdGlwbGVfUCA7CisKKwlvZmZzZXQgPSA2IDsKKwlmb3IgKGkgPSAwIDsgaSA8IE5VTVBIWVMgOyBpKyspIHsKKwkJLyoKKwkJICogY29uZGl0aW9ucworCQkgKi8KKwkJc21jLT5ldmNzW29mZnNldCArIDAqTlVNUEhZU10uZXZjX2NvbmRfc3RhdGUgPQorCQkJJnNtYy0+bWliLnBbaV0uZmRkaVBPUlRMZXJGbGFnIDsKKwkJc21jLT5ldmNzW29mZnNldCArIDEqTlVNUEhZU10uZXZjX2NvbmRfc3RhdGUgPQorCQkJJnNtYy0+bWliLnBbaV0uZmRkaVBPUlRFQl9Db25kaXRpb24gOworCisJCS8qCisJCSAqIGV2ZW50cworCQkgKi8KKwkJc21jLT5ldmNzW29mZnNldCArIDIqTlVNUEhZU10uZXZjX211bHRpcGxlID0KKwkJCSZzbWMtPm1pYi5wW2ldLmZkZGlQT1JUTXVsdGlwbGVfVSA7CisJCXNtYy0+ZXZjc1tvZmZzZXQgKyAzKk5VTVBIWVNdLmV2Y19tdWx0aXBsZSA9CisJCQkmc21jLT5taWIucFtpXS5mZGRpUE9SVE11bHRpcGxlX1AgOworCQlvZmZzZXQrKyA7CisJfQorI2lmZGVmCURFQlVHCisJZm9yIChpID0gMCwgZXZjID0gc21jLT5ldmNzIDsgKHVuc2lnbmVkKSBpIDwgTUFYX0VWQ1MgOyBpKyssIGV2YysrKSB7CisJCWlmIChTTVRfSVNfQ09ORElUSU9OKGV2Yy0+ZXZjX2NvZGUpKSB7CisJCQlpZiAoIWV2Yy0+ZXZjX2NvbmRfc3RhdGUpIHsKKwkJCQlTTVRfUEFOSUMoc21jLFNNVF9FMDEyOCwgU01UX0UwMTI4X01TRykgOworCQkJfQorCQkJZXZjLT5ldmNfbXVsdGlwbGUgPSAmZmFpbF9zYWZlIDsKKwkJfQorCQllbHNlIHsKKwkJCWlmICghZXZjLT5ldmNfbXVsdGlwbGUpIHsKKwkJCQlTTVRfUEFOSUMoc21jLFNNVF9FMDEyOSwgU01UX0UwMTI5X01TRykgOworCQkJfQorCQkJZXZjLT5ldmNfY29uZF9zdGF0ZSA9ICZmYWlsX3NhZmUgOworCQl9CisJfQorI2VuZGlmCisJc21jLT5zcmYuVFNSID0gc210X2dldF90aW1lKCkgOworCXNtYy0+c3JmLnNyX3N0YXRlID0gU1IwX1dBSVQgOworfQorCitzdGF0aWMgc3RydWN0IHNfc3JmX2V2YyAqc210X2dldF9ldmMoc3RydWN0IHNfc21jICpzbWMsIGludCBjb2RlLCBpbnQgaW5kZXgpCit7CisJaW50CQkJaSA7CisJc3RydWN0IHNfc3JmX2V2YwkqZXZjIDsKKworCWZvciAoaSA9IDAsIGV2YyA9IHNtYy0+ZXZjcyA7ICh1bnNpZ25lZCkgaSA8IE1BWF9FVkNTIDsgaSsrLCBldmMrKykgeworCQlpZiAoZXZjLT5ldmNfY29kZSA9PSBjb2RlICYmIGV2Yy0+ZXZjX2luZGV4ID09IGluZGV4KQorCQkJcmV0dXJuKGV2YykgOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworI2RlZmluZSBUSFJFU0hPTERfMgkoMipUSUNLU19QRVJfU0VDT05EKQorI2RlZmluZSBUSFJFU0hPTERfMzIJKDMyKlRJQ0tTX1BFUl9TRUNPTkQpCisKKyNpZmRlZglERUJVRworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcmZfbmFtZXNbXSA9IHsKKwkiTm9uZSIsIk1BQ1BhdGhDaGFuZ2VFdmVudCIsCSJNQUNOZWlnaGJvckNoYW5nZUV2ZW50IiwKKwkiUE9SVFBhdGhDaGFuZ2VFdmVudCIsCQkiUE9SVFVuZGVzaXJlZENvbm5lY3Rpb25BdHRlbXB0RXZlbnQiLAorCSJTTVRQZWVyV3JhcENvbmRpdGlvbiIsCQkiU01USG9sZENvbmRpdGlvbiIsCisJIk1BQ0ZyYW1lRXJyb3JDb25kaXRpb24iLAkiTUFDRHVwbGljYXRlQWRkcmVzc0NvbmRpdGlvbiIsCisJIk1BQ05vdENvcGllZENvbmRpdGlvbiIsCSJQT1JURUJFcnJvckNvbmRpdGlvbiIsCisJIlBPUlRMZXJDb25kaXRpb24iCit9IDsKKyNlbmRpZgorCit2b2lkIHNtdF9zcmZfZXZlbnQoc3RydWN0IHNfc21jICpzbWMsIGludCBjb2RlLCBpbnQgaW5kZXgsIGludCBjb25kKQoreworCXN0cnVjdCBzX3NyZl9ldmMJKmV2YyA7CisJaW50CQkJY29uZF9hc3NlcnRlZCA9IDAgOworCWludAkJCWNvbmRfZGVhc3NlcnRlZCA9IDAgOworCWludAkJCWV2ZW50X29jY3VycmVkID0gMCA7CisJaW50CQkJdHNyIDsKKwlpbnQJCQlUX0xpbWl0ID0gMipUSUNLU19QRVJfU0VDT05EIDsKKworCWlmIChjb2RlID09IFNNVF9DT05EX01BQ19EVVBfQUREUiAmJiBjb25kKSB7CisJCVJTX1NFVChzbWMsUlNfRFVQQUREUikgOworCX0KKworCWlmIChjb2RlKSB7CisJCURCX1NNVCgiU1JGOiAlcyBpbmRleCAlZFxuIixzcmZfbmFtZXNbY29kZV0saW5kZXgpIDsKKworCQlpZiAoIShldmMgPSBzbXRfZ2V0X2V2YyhzbWMsY29kZSxpbmRleCkpKSB7CisJCQlEQl9TTVQoIlNSRiA6IHNtdF9nZXRfZXZjKCkgZmFpbGVkXG4iLDAsMCkgOworCQkJcmV0dXJuIDsKKwkJfQorCQkvKgorCQkgKiBpZ25vcmUgY29uZGl0aW9uIGlmIG5vIGNoYW5nZQorCQkgKi8KKwkJaWYgKFNNVF9JU19DT05ESVRJT04oY29kZSkpIHsKKwkJCWlmICgqZXZjLT5ldmNfY29uZF9zdGF0ZSA9PSBjb25kKQorCQkJCXJldHVybiA7CisJCX0KKworCQkvKgorCQkgKiBzZXQgdHJhbnNpdGlvbiB0aW1lIHN0YW1wCisJCSAqLworCQlzbXRfc2V0X3RpbWVzdGFtcChzbWMsc21jLT5taWIuZmRkaVNNVFRyYW5zaXRpb25UaW1lU3RhbXApIDsKKwkJaWYgKFNNVF9JU19DT05ESVRJT04oY29kZSkpIHsKKwkJCURCX1NNVCgiU1JGOiBjb25kaXRpb24gaXMgJXNcbiIsY29uZCA/ICJPTiI6Ik9GRiIsMCkgOworCQkJaWYgKGNvbmQpIHsKKwkJCQkqZXZjLT5ldmNfY29uZF9zdGF0ZSA9IFRSVUUgOworCQkJCWV2Yy0+ZXZjX3JlcF9yZXF1aXJlZCA9IFRSVUUgOworCQkJCXNtYy0+c3JmLmFueV9yZXBvcnQgPSBUUlVFIDsKKwkJCQljb25kX2Fzc2VydGVkID0gVFJVRSA7CisJCQl9CisJCQllbHNlIHsKKwkJCQkqZXZjLT5ldmNfY29uZF9zdGF0ZSA9IEZBTFNFIDsKKwkJCQljb25kX2RlYXNzZXJ0ZWQgPSBUUlVFIDsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWlmIChldmMtPmV2Y19yZXBfcmVxdWlyZWQpIHsKKwkJCQkqZXZjLT5ldmNfbXVsdGlwbGUgID0gVFJVRSA7CisJCQl9CisJCQllbHNlIHsKKwkJCQlldmMtPmV2Y19yZXBfcmVxdWlyZWQgPSBUUlVFIDsKKwkJCQkqZXZjLT5ldmNfbXVsdGlwbGUgID0gRkFMU0UgOworCQkJfQorCQkJc21jLT5zcmYuYW55X3JlcG9ydCA9IFRSVUUgOworCQkJZXZlbnRfb2NjdXJyZWQgPSBUUlVFIDsKKwkJfQorI2lmZGVmCUZERElfTUlCCisJCXNubXBfc3JmX2V2ZW50KHNtYyxldmMpIDsKKyNlbmRpZgkvKiBGRERJX01JQiAqLworCX0KKwl0c3IgPSBzbXRfZ2V0X3RpbWUoKSAtIHNtYy0+c3JmLlRTUiA7CisKKwlzd2l0Y2ggKHNtYy0+c3JmLnNyX3N0YXRlKSB7CisJY2FzZSBTUjBfV0FJVCA6CisJCS8qIFNSMDFhICovCisJCWlmIChjb25kX2Fzc2VydGVkICYmIHRzciA8IFRfTGltaXQpIHsKKwkJCXNtYy0+c3JmLlNSVGhyZXNob2xkID0gVEhSRVNIT0xEXzIgOworCQkJc21jLT5zcmYuc3Jfc3RhdGUgPSBTUjFfSE9MRE9GRiA7CisJCQlicmVhayA7CisJCX0KKwkJLyogU1IwMWIgKi8KKwkJaWYgKGNvbmRfZGVhc3NlcnRlZCAmJiB0c3IgPCBUX0xpbWl0KSB7CisJCQlzbWMtPnNyZi5zcl9zdGF0ZSA9IFNSMV9IT0xET0ZGIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKiBTUjAxYyAqLworCQlpZiAoZXZlbnRfb2NjdXJyZWQgJiYgdHNyIDwgVF9MaW1pdCkgeworCQkJc21jLT5zcmYuc3Jfc3RhdGUgPSBTUjFfSE9MRE9GRiA7CisJCQlicmVhayA7CisJCX0KKwkJLyogU1IwMGIgKi8KKwkJaWYgKGNvbmRfYXNzZXJ0ZWQgJiYgdHNyID49IFRfTGltaXQpIHsKKwkJCXNtYy0+c3JmLlNSVGhyZXNob2xkID0gVEhSRVNIT0xEXzIgOworCQkJc21jLT5zcmYuVFNSID0gc210X2dldF90aW1lKCkgOworCQkJc210X3NlbmRfc3JmKHNtYykgOworCQkJYnJlYWsgOworCQl9CisJCS8qIFNSMDBjICovCisJCWlmIChjb25kX2RlYXNzZXJ0ZWQgJiYgdHNyID49IFRfTGltaXQpIHsKKwkJCXNtYy0+c3JmLlRTUiA9IHNtdF9nZXRfdGltZSgpIDsKKwkJCXNtdF9zZW5kX3NyZihzbWMpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKiBTUjAwZCAqLworCQlpZiAoZXZlbnRfb2NjdXJyZWQgJiYgdHNyID49IFRfTGltaXQpIHsKKwkJCXNtYy0+c3JmLlRTUiA9IHNtdF9nZXRfdGltZSgpIDsKKwkJCXNtdF9zZW5kX3NyZihzbWMpIDsKKwkJCWJyZWFrIDsKKwkJfQorCQkvKiBTUjAwZSAqLworCQlpZiAoc21jLT5zcmYuYW55X3JlcG9ydCAmJiAodV9sb25nKSB0c3IgPj0KKwkJCXNtYy0+c3JmLlNSVGhyZXNob2xkKSB7CisJCQlzbWMtPnNyZi5TUlRocmVzaG9sZCAqPSAyIDsKKwkJCWlmIChzbWMtPnNyZi5TUlRocmVzaG9sZCA+IFRIUkVTSE9MRF8zMikKKwkJCQlzbWMtPnNyZi5TUlRocmVzaG9sZCA9IFRIUkVTSE9MRF8zMiA7CisJCQlzbWMtPnNyZi5UU1IgPSBzbXRfZ2V0X3RpbWUoKSA7CisJCQlzbXRfc2VuZF9zcmYoc21jKSA7CisJCQlicmVhayA7CisJCX0KKwkJLyogU1IwMiAqLworCQlpZiAoIXNtYy0+bWliLmZkZGlTTVRTdGF0UnB0UG9saWN5KSB7CisJCQlzbWMtPnNyZi5zcl9zdGF0ZSA9IFNSMl9ESVNBQkxFRCA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWsgOworCWNhc2UgU1IxX0hPTERPRkYgOgorCQkvKiBTUjEwYiAqLworCQlpZiAodHNyID49IFRfTGltaXQpIHsKKwkJCXNtYy0+c3JmLnNyX3N0YXRlID0gU1IwX1dBSVQgOworCQkJc21jLT5zcmYuVFNSID0gc210X2dldF90aW1lKCkgOworCQkJc210X3NlbmRfc3JmKHNtYykgOworCQkJYnJlYWsgOworCQl9CisJCS8qIFNSMTFhICovCisJCWlmIChjb25kX2Fzc2VydGVkKSB7CisJCQlzbWMtPnNyZi5TUlRocmVzaG9sZCA9IFRIUkVTSE9MRF8yIDsKKwkJfQorCQkvKiBTUjExYiAqLworCQkvKiBTUjExYyAqLworCQkvKiBoYW5kbGVkIGFib3ZlICovCisJCS8qIFNSMTIgKi8KKwkJaWYgKCFzbWMtPm1pYi5mZGRpU01UU3RhdFJwdFBvbGljeSkgeworCQkJc21jLT5zcmYuc3Jfc3RhdGUgPSBTUjJfRElTQUJMRUQgOworCQkJYnJlYWsgOworCQl9CisJCWJyZWFrIDsKKwljYXNlIFNSMl9ESVNBQkxFRCA6CisJCWlmIChzbWMtPm1pYi5mZGRpU01UU3RhdFJwdFBvbGljeSkgeworCQkJc21jLT5zcmYuc3Jfc3RhdGUgPSBTUjBfV0FJVCA7CisJCQlzbWMtPnNyZi5UU1IgPSBzbXRfZ2V0X3RpbWUoKSA7CisJCQlzbWMtPnNyZi5TUlRocmVzaG9sZCA9IFRIUkVTSE9MRF8yIDsKKwkJCWNsZWFyX2FsbF9yZXAoc21jKSA7CisJCQlicmVhayA7CisJCX0KKwkJYnJlYWsgOworCX0KK30KKworc3RhdGljIHZvaWQgY2xlYXJfYWxsX3JlcChzdHJ1Y3Qgc19zbWMgKnNtYykKK3sKKwlzdHJ1Y3Qgc19zcmZfZXZjCSpldmMgOworCWludAkJCWkgOworCisJZm9yIChpID0gMCwgZXZjID0gc21jLT5ldmNzIDsgKHVuc2lnbmVkKSBpIDwgTUFYX0VWQ1MgOyBpKyssIGV2YysrKSB7CisJCWV2Yy0+ZXZjX3JlcF9yZXF1aXJlZCA9IEZBTFNFIDsKKwkJaWYgKFNNVF9JU19DT05ESVRJT04oZXZjLT5ldmNfY29kZSkpCisJCQkqZXZjLT5ldmNfY29uZF9zdGF0ZSA9IEZBTFNFIDsKKwl9CisJc21jLT5zcmYuYW55X3JlcG9ydCA9IEZBTFNFIDsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfcmVwb3J0ZWQoc3RydWN0IHNfc21jICpzbWMpCit7CisJc3RydWN0IHNfc3JmX2V2YwkqZXZjIDsKKwlpbnQJCQlpIDsKKworCXNtYy0+c3JmLmFueV9yZXBvcnQgPSBGQUxTRSA7CisJZm9yIChpID0gMCwgZXZjID0gc21jLT5ldmNzIDsgKHVuc2lnbmVkKSBpIDwgTUFYX0VWQ1MgOyBpKyssIGV2YysrKSB7CisJCWlmIChTTVRfSVNfQ09ORElUSU9OKGV2Yy0+ZXZjX2NvZGUpKSB7CisJCQlpZiAoKmV2Yy0+ZXZjX2NvbmRfc3RhdGUgPT0gRkFMU0UpCisJCQkJZXZjLT5ldmNfcmVwX3JlcXVpcmVkID0gRkFMU0UgOworCQkJZWxzZQorCQkJCXNtYy0+c3JmLmFueV9yZXBvcnQgPSBUUlVFIDsKKwkJfQorCQllbHNlIHsKKwkJCWV2Yy0+ZXZjX3JlcF9yZXF1aXJlZCA9IEZBTFNFIDsKKwkJCSpldmMtPmV2Y19tdWx0aXBsZSA9IEZBTFNFIDsKKwkJfQorCX0KK30KKworLyoKKyAqIGJ1aWxkIGFuZCBzZW5kIFNNVCBTUkYgZnJhbWUKKyAqLworc3RhdGljIHZvaWQgc210X3NlbmRfc3JmKHN0cnVjdCBzX3NtYyAqc21jKQoreworCisJc3RydWN0IHNtdF9oZWFkZXIJKnNtdCA7CisJc3RydWN0IHNfc3JmX2V2YwkqZXZjIDsKKwlTS19MT0NfREVDTChzdHJ1Y3Qgc19wY29uLHBjb24pIDsKKwlTTWJ1ZgkJCSptYiA7CisJaW50CQkJaSA7CisKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGZkZGlfYWRkciBTTVRfU1JGX0RBID0geworCQl7IDB4ODAsIDB4MDEsIDB4NDMsIDB4MDAsIDB4ODAsIDB4MDggfQorCX0gOworCisJLyoKKwkgKiBidWlsZCBTTVQgaGVhZGVyCisJICovCisJaWYgKCFzbWMtPnIuc21fbWFfYXZhaWwpCisJCXJldHVybiA7CisJaWYgKCEobWIgPSBzbXRfYnVpbGRfZnJhbWUoc21jLFNNVF9TUkYsU01UX0FOTk9VTkNFLDApKSkKKwkJcmV0dXJuIDsKKworCVJTX1NFVChzbWMsUlNfU09GVEVSUk9SKSA7CisKKwlzbXQgPSBzbXRvZChtYiwgc3RydWN0IHNtdF9oZWFkZXIgKikgOworCXNtdC0+c210X2Rlc3QgPSBTTVRfU1JGX0RBIDsJCS8qIERBID09IFNSRiBtdWx0aWNhc3QgKi8KKworCS8qCisJICogc2V0dXAgcGFyYW1ldGVyIHN0YXR1cworCSAqLworCXBjb24ucGNfbGVuID0gU01UX01BWF9JTkZPX0xFTiA7CS8qIG1heCBwYXJhIGxlbmd0aCAqLworCXBjb24ucGNfZXJyID0gMCA7CQkJLyogbm8gZXJyb3IgKi8KKwlwY29uLnBjX2JhZHNldCA9IDAgOwkJCS8qIG5vIGJhZCBzZXQgY291bnQgKi8KKwlwY29uLnBjX3AgPSAodm9pZCAqKSAoc210ICsgMSkgOwkvKiBwYXJhcyBzdGFydCBoZXJlICovCisKKwlzbXRfYWRkX3BhcmEoc21jLCZwY29uLCh1X3Nob3J0KSBTTVRfUDEwMzMsMCwwKSA7CisJc210X2FkZF9wYXJhKHNtYywmcGNvbiwodV9zaG9ydCkgU01UX1AxMDM0LDAsMCkgOworCisJZm9yIChpID0gMCwgZXZjID0gc21jLT5ldmNzIDsgKHVuc2lnbmVkKSBpIDwgTUFYX0VWQ1MgOyBpKyssIGV2YysrKSB7CisJCWlmIChldmMtPmV2Y19yZXBfcmVxdWlyZWQpIHsKKwkJCXNtdF9hZGRfcGFyYShzbWMsJnBjb24sZXZjLT5ldmNfcGFyYSwKKwkJCQkoaW50KWV2Yy0+ZXZjX2luZGV4LDApIDsKKwkJfQorCX0KKwlzbXQtPnNtdF9sZW4gPSBTTVRfTUFYX0lORk9fTEVOIC0gcGNvbi5wY19sZW4gOworCW1iLT5zbV9sZW4gPSBzbXQtPnNtdF9sZW4gKyBzaXplb2Yoc3RydWN0IHNtdF9oZWFkZXIpIDsKKworCURCX1NNVCgiU1JGOiBzZW5kaW5nIFNSRiBhdCAleCwgbGVuICVkIFxuIixzbXQsbWItPnNtX2xlbikgOworCURCX1NNVCgiU1JGOiBzdGF0ZSBTUiVkIFRocmVzaG9sZCAlZFxuIiwKKwkJc21jLT5zcmYuc3Jfc3RhdGUsc21jLT5zcmYuU1JUaHJlc2hvbGQvVElDS1NfUEVSX1NFQ09ORCkgOworI2lmZGVmCURFQlVHCisJZHVtcF9zbXQoc21jLHNtdCwiU1JGIFNlbmQiKSA7CisjZW5kaWYKKwlzbXRfc2VuZF9mcmFtZShzbWMsbWIsRkNfU01UX0lORk8sMCkgOworCWNsZWFyX3JlcG9ydGVkKHNtYykgOworfQorCisjZW5kaWYJLyogbm8gQk9PVCAqLworI2VuZGlmCS8qIG5vIFNMSU1fU01UICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NsaGMuYyBiL2RyaXZlcnMvbmV0L3NsaGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmZiYjFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2xoYy5jCkBAIC0wLDAgKzEsNzY4IEBACisvKgorICogUm91dGluZXMgdG8gY29tcHJlc3MgYW5kIHVuY29tcHJlc3MgdGNwIHBhY2tldHMgKGZvciB0cmFuc21pc3Npb24KKyAqIG92ZXIgbG93IHNwZWVkIHNlcmlhbCBsaW5lcykuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTg5IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKKyAqIGR1cGxpY2F0ZWQgaW4gYWxsIHN1Y2ggZm9ybXMgYW5kIHRoYXQgYW55IGRvY3VtZW50YXRpb24sCisgKiBhZHZlcnRpc2luZyBtYXRlcmlhbHMsIGFuZCBvdGhlciBtYXRlcmlhbHMgcmVsYXRlZCB0byBzdWNoCisgKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCisgKiBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleS4gIFRoZSBuYW1lIG9mIHRoZQorICogVW5pdmVyc2l0eSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqCVZhbiBKYWNvYnNvbiAodmFuQGhlbGlvcy5lZS5sYmwuZ292KSwgRGVjIDMxLCAxOTg5OgorICoJLSBJbml0aWFsIGRpc3RyaWJ1dGlvbi4KKyAqCisgKgorICogbW9kaWZpZWQgZm9yIEtBOVEgSW50ZXJuZXQgU29mdHdhcmUgUGFja2FnZSBieQorICogS2F0aWUgU3RldmVucyAoZGtzdGV2ZW5zQHVjZGF2aXMuZWR1KQorICogVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBEYXZpcworICogQ29tcHV0aW5nIFNlcnZpY2VzCisgKgktIDAxLTMxLTkwCWluaXRpYWwgYWRhcHRhdGlvbiAoZnJvbSAxLjE5KQorICoJUFBQLjA1CTAyLTE1LTkwIFtrc10KKyAqCVBQUC4wOAkwNS0wMi05MCBba3NdCXVzZSBQUFAgcHJvdG9jb2wgZmllbGQgdG8gc2lnbmFsIGNvbXByZXNzaW9uCisgKglQUFAuMTUJMDktOTAJIFtrc10JaW1wcm92ZSBtYnVmIGhhbmRsaW5nCisgKglQUFAuMTYJMTEtMDIJIFtrYXJuXQlzdWJzdGFudGlhbGx5IHJld3JpdHRlbiB0byB1c2UgTk9TIGZhY2lsaXRpZXMKKyAqCisgKgktIEZlYiAxOTkxCUJpbGxfU2ltcHNvbkB1bS5jYy51bWljaC5lZHUKKyAqCQkJdmFyaWFibGUgbnVtYmVyIG9mIGNvbnZlcnNhdGlvbiBzbG90cworICoJCQlhbGxvdyB6ZXJvIG9yIG9uZSBzbG90cworICoJCQlzZXBhcmF0ZSByb3V0aW5lcworICoJCQlzdGF0dXMgZGlzcGxheQorICoJLSBKdWwgMTk5NAlEbWl0cnkgR29yb2RjaGFuaW4KKyAqCQkJRml4ZXMgZm9yIG1lbW9yeSBsZWFrcy4KKyAqICAgICAgLSBPY3QgMTk5NCAgICAgIERtaXRyeSBHb3JvZGNoYW5pbgorICogICAgICAgICAgICAgICAgICAgICAgTW9kdWxhcml6YXRpb24uCisgKgktIEphbiAxOTk1CUJqb3JuIEVrd2FsbAorICoJCQlVc2UgaXBfZmFzdF9jc3VtIGZyb20gaXAuaAorICoJLSBKdWx5IDE5OTUJQ2hyaXN0b3MgQS4gUG9seXpvbHMgCisgKgkJCVNwb3R0ZWQgYnVnIGluIHRjcCBvcHRpb24gY2hlY2tpbmcKKyAqCisgKgorICoJVGhpcyBtb2R1bGUgaXMgYSBkaWZmaWN1bHQgaXNzdWUuIEl0J3MgY2xlYXJseSBpbmV0IGNvZGUgYnV0IGl0J3MgYWxzbyBjbGVhcmx5CisgKglkcml2ZXIgY29kZSBiZWxvbmdpbmcgY2xvc2UgdG8gUFBQIGFuZCBTTElQCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxuZXQvc2xoY192ai5oPgorCisjaWZkZWYgQ09ORklHX0lORVQKKy8qIEVudGlyZSBtb2R1bGUgaXMgZm9yIElQIG9ubHkgKi8KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxuZXQvaWNtcC5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqZW5jb2RlKHVuc2lnbmVkIGNoYXIgKmNwLCB1bnNpZ25lZCBzaG9ydCBuKTsKK3N0YXRpYyBsb25nIGRlY29kZSh1bnNpZ25lZCBjaGFyICoqY3BwKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICogcHV0MTYodW5zaWduZWQgY2hhciAqY3AsIHVuc2lnbmVkIHNob3J0IHgpOworc3RhdGljIHVuc2lnbmVkIHNob3J0IHB1bGwxNih1bnNpZ25lZCBjaGFyICoqY3BwKTsKKworLyogSW5pdGlhbGl6ZSBjb21wcmVzc2lvbiBkYXRhIHN0cnVjdHVyZQorICoJc2xvdHMgbXVzdCBiZSBpbiByYW5nZSAwIHRvIDI1NSAoemVybyBtZWFuaW5nIG5vIGNvbXByZXNzaW9uKQorICovCitzdHJ1Y3Qgc2xjb21wcmVzcyAqCitzbGhjX2luaXQoaW50IHJzbG90cywgaW50IHRzbG90cykKK3sKKwlyZWdpc3RlciBzaG9ydCBpOworCXJlZ2lzdGVyIHN0cnVjdCBjc3RhdGUgKnRzOworCXN0cnVjdCBzbGNvbXByZXNzICpjb21wOworCisJY29tcCA9IChzdHJ1Y3Qgc2xjb21wcmVzcyAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbGNvbXByZXNzKSwKKwkJCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghIGNvbXApCisJCWdvdG8gb3V0X2ZhaWw7CisJbWVtc2V0KGNvbXAsIDAsIHNpemVvZihzdHJ1Y3Qgc2xjb21wcmVzcykpOworCisJaWYgKCByc2xvdHMgPiAwICAmJiAgcnNsb3RzIDwgMjU2ICkgeworCQlzaXplX3QgcnNpemUgPSByc2xvdHMgKiBzaXplb2Yoc3RydWN0IGNzdGF0ZSk7CisJCWNvbXAtPnJzdGF0ZSA9IChzdHJ1Y3QgY3N0YXRlICopIGttYWxsb2MocnNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoISBjb21wLT5yc3RhdGUpCisJCQlnb3RvIG91dF9mcmVlOworCQltZW1zZXQoY29tcC0+cnN0YXRlLCAwLCByc2l6ZSk7CisJCWNvbXAtPnJzbG90X2xpbWl0ID0gcnNsb3RzIC0gMTsKKwl9CisKKwlpZiAoIHRzbG90cyA+IDAgICYmICB0c2xvdHMgPCAyNTYgKSB7CisJCXNpemVfdCB0c2l6ZSA9IHRzbG90cyAqIHNpemVvZihzdHJ1Y3QgY3N0YXRlKTsKKwkJY29tcC0+dHN0YXRlID0gKHN0cnVjdCBjc3RhdGUgKikga21hbGxvYyh0c2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghIGNvbXAtPnRzdGF0ZSkKKwkJCWdvdG8gb3V0X2ZyZWUyOworCQltZW1zZXQoY29tcC0+dHN0YXRlLCAwLCB0c2l6ZSk7CisJCWNvbXAtPnRzbG90X2xpbWl0ID0gdHNsb3RzIC0gMTsKKwl9CisKKwljb21wLT54bWl0X29sZGVzdCA9IDA7CisJY29tcC0+eG1pdF9jdXJyZW50ID0gMjU1OworCWNvbXAtPnJlY3ZfY3VycmVudCA9IDI1NTsKKwkvKgorCSAqIGRvbid0IGFjY2VwdCBhbnkgcGFja2V0cyB3aXRoIGltcGxpY2l0IGluZGV4IHVudGlsIHdlIGdldAorCSAqIG9uZSB3aXRoIGFuIGV4cGxpY2l0IGluZGV4LiAgT3RoZXJ3aXNlIHRoZSB1bmNvbXByZXNzIGNvZGUKKwkgKiB3aWxsIHRyeSB0byB1c2UgY29ubmVjdGlvbiAyNTUsIHdoaWNoIGlzIGFsbW9zdCBjZXJ0YWlubHkKKwkgKiBvdXQgb2YgcmFuZ2UKKwkgKi8KKwljb21wLT5mbGFncyB8PSBTTEZfVE9TUzsKKworCWlmICggdHNsb3RzID4gMCApIHsKKwkJdHMgPSBjb21wLT50c3RhdGU7CisJCWZvcihpID0gY29tcC0+dHNsb3RfbGltaXQ7IGkgPiAwOyAtLWkpeworCQkJdHNbaV0uY3NfdGhpcyA9IGk7CisJCQl0c1tpXS5uZXh0ID0gJih0c1tpIC0gMV0pOworCQl9CisJCXRzWzBdLm5leHQgPSAmKHRzW2NvbXAtPnRzbG90X2xpbWl0XSk7CisJCXRzWzBdLmNzX3RoaXMgPSAwOworCX0KKwlyZXR1cm4gY29tcDsKKworb3V0X2ZyZWUyOgorCWtmcmVlKCh1bnNpZ25lZCBjaGFyICopY29tcC0+cnN0YXRlKTsKK291dF9mcmVlOgorCWtmcmVlKCh1bnNpZ25lZCBjaGFyICopY29tcCk7CitvdXRfZmFpbDoKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKiBGcmVlIGEgY29tcHJlc3Npb24gZGF0YSBzdHJ1Y3R1cmUgKi8KK3ZvaWQKK3NsaGNfZnJlZShzdHJ1Y3Qgc2xjb21wcmVzcyAqY29tcCkKK3sKKwlpZiAoIGNvbXAgPT0gTlVMTFNMQ09NUFIgKQorCQlyZXR1cm47CisKKwlpZiAoIGNvbXAtPnRzdGF0ZSAhPSBOVUxMU0xTVEFURSApCisJCWtmcmVlKCBjb21wLT50c3RhdGUgKTsKKworCWlmICggY29tcC0+cnN0YXRlICE9IE5VTExTTFNUQVRFICkKKwkJa2ZyZWUoIGNvbXAtPnJzdGF0ZSApOworCisJa2ZyZWUoIGNvbXAgKTsKK30KKworCisvKiBQdXQgYSBzaG9ydCBpbiBob3N0IG9yZGVyIGludG8gYSBjaGFyIGFycmF5IGluIG5ldHdvcmsgb3JkZXIgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqCitwdXQxNih1bnNpZ25lZCBjaGFyICpjcCwgdW5zaWduZWQgc2hvcnQgeCkKK3sKKwkqY3ArKyA9IHggPj4gODsKKwkqY3ArKyA9IHg7CisKKwlyZXR1cm4gY3A7Cit9CisKKworLyogRW5jb2RlIGEgbnVtYmVyICovCit1bnNpZ25lZCBjaGFyICoKK2VuY29kZSh1bnNpZ25lZCBjaGFyICpjcCwgdW5zaWduZWQgc2hvcnQgbikKK3sKKwlpZihuID49IDI1NiB8fCBuID09IDApeworCQkqY3ArKyA9IDA7CisJCWNwID0gcHV0MTYoY3Asbik7CisJfSBlbHNlIHsKKwkJKmNwKysgPSBuOworCX0KKwlyZXR1cm4gY3A7Cit9CisKKy8qIFB1bGwgYSAxNi1iaXQgaW50ZWdlciBpbiBob3N0IG9yZGVyIGZyb20gYnVmZmVyIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0CitwdWxsMTYodW5zaWduZWQgY2hhciAqKmNwcCkKK3sKKwlzaG9ydCBydmFsOworCisJcnZhbCA9ICooKmNwcCkrKzsKKwlydmFsIDw8PSA4OworCXJ2YWwgfD0gKigqY3BwKSsrOworCXJldHVybiBydmFsOworfQorCisvKiBEZWNvZGUgYSBudW1iZXIgKi8KK2xvbmcKK2RlY29kZSh1bnNpZ25lZCBjaGFyICoqY3BwKQoreworCXJlZ2lzdGVyIGludCB4OworCisJeCA9ICooKmNwcCkrKzsKKwlpZih4ID09IDApeworCQlyZXR1cm4gcHVsbDE2KGNwcCkgJiAweGZmZmY7CS8qIHB1bGwxNiByZXR1cm5zIC0xIG9uIGVycm9yICovCisJfSBlbHNlIHsKKwkJcmV0dXJuIHggJiAweGZmOwkJLyogLTEgaWYgUFVMTENIQVIgcmV0dXJuZWQgZXJyb3IgKi8KKwl9Cit9CisKKy8qCisgKiBpY3AgYW5kIGlzaXplIGFyZSB0aGUgb3JpZ2luYWwgcGFja2V0LgorICogb2NwIGlzIGEgcGxhY2UgdG8gcHV0IGEgY29weSBpZiBuZWNlc3NhcnkuCisgKiBjcHAgaXMgaW5pdGlhbGx5IGEgcG9pbnRlciB0byBpY3AuICBJZiB0aGUgY29weSBpcyB1c2VkLAorICogICAgY2hhbmdlIGl0IHRvIG9jcC4KKyAqLworCitpbnQKK3NsaGNfY29tcHJlc3Moc3RydWN0IHNsY29tcHJlc3MgKmNvbXAsIHVuc2lnbmVkIGNoYXIgKmljcCwgaW50IGlzaXplLAorCXVuc2lnbmVkIGNoYXIgKm9jcCwgdW5zaWduZWQgY2hhciAqKmNwcCwgaW50IGNvbXByZXNzX2NpZCkKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgY3N0YXRlICpvY3MgPSAmKGNvbXAtPnRzdGF0ZVtjb21wLT54bWl0X29sZGVzdF0pOworCXJlZ2lzdGVyIHN0cnVjdCBjc3RhdGUgKmxjcyA9IG9jczsKKwlyZWdpc3RlciBzdHJ1Y3QgY3N0YXRlICpjcyA9IGxjcy0+bmV4dDsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGRlbHRhUywgZGVsdGFBOworCXJlZ2lzdGVyIHNob3J0IGNoYW5nZXMgPSAwOworCWludCBobGVuOworCXVuc2lnbmVkIGNoYXIgbmV3X3NlcVsxNl07CisJcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqY3AgPSBuZXdfc2VxOworCXN0cnVjdCBpcGhkciAqaXA7CisJc3RydWN0IHRjcGhkciAqdGgsICpvdGg7CisKKworCS8qCisJICoJRG9uJ3QgcGxheSB3aXRoIHJ1bnQgcGFja2V0cy4KKwkgKi8KKwkgCisJaWYoaXNpemU8c2l6ZW9mKHN0cnVjdCBpcGhkcikpCisJCXJldHVybiBpc2l6ZTsKKwkJCisJaXAgPSAoc3RydWN0IGlwaGRyICopIGljcDsKKworCS8qIEJhaWwgaWYgdGhpcyBwYWNrZXQgaXNuJ3QgVENQLCBvciBpcyBhbiBJUCBmcmFnbWVudCAqLworCWlmIChpcC0+cHJvdG9jb2wgIT0gSVBQUk9UT19UQ1AgfHwgKG50b2hzKGlwLT5mcmFnX29mZikgJiAweDNmZmYpKSB7CisJCS8qIFNlbmQgYXMgcmVndWxhciBJUCAqLworCQlpZihpcC0+cHJvdG9jb2wgIT0gSVBQUk9UT19UQ1ApCisJCQljb21wLT5zbHNfb19ub250Y3ArKzsKKwkJZWxzZQorCQkJY29tcC0+c2xzX29fdGNwKys7CisJCXJldHVybiBpc2l6ZTsKKwl9CisJLyogRXh0cmFjdCBUQ1AgaGVhZGVyICovCisKKwl0aCA9IChzdHJ1Y3QgdGNwaGRyICopKCgodW5zaWduZWQgY2hhciAqKWlwKSArIGlwLT5paGwqNCk7CisJaGxlbiA9IGlwLT5paGwqNCArIHRoLT5kb2ZmKjQ7CisKKwkvKiAgQmFpbCBpZiB0aGUgVENQIHBhY2tldCBpc24ndCBgY29tcHJlc3NpYmxlJyAoaS5lLiwgQUNLIGlzbid0IHNldCBvcgorCSAqICBzb21lIG90aGVyIGNvbnRyb2wgYml0IGlzIHNldCkuIEFsc28gdW5jb21wcmVzc2libGUgaWYKKwkgKiAgaXQncyBhIHJ1bnQuCisJICovCisJaWYoaGxlbiA+IGlzaXplIHx8IHRoLT5zeW4gfHwgdGgtPmZpbiB8fCB0aC0+cnN0IHx8CisJICAgICEgKHRoLT5hY2spKXsKKwkJLyogVENQIGNvbm5lY3Rpb24gc3R1ZmY7IHNlbmQgYXMgcmVndWxhciBJUCAqLworCQljb21wLT5zbHNfb190Y3ArKzsKKwkJcmV0dXJuIGlzaXplOworCX0KKwkvKgorCSAqIFBhY2tldCBpcyBjb21wcmVzc2libGUgLS0gd2UncmUgZ29pbmcgdG8gc2VuZCBlaXRoZXIgYQorCSAqIENPTVBSRVNTRURfVENQIG9yIFVOQ09NUFJFU1NFRF9UQ1AgcGFja2V0LiAgRWl0aGVyIHdheSwKKwkgKiB3ZSBuZWVkIHRvIGxvY2F0ZSAob3IgY3JlYXRlKSB0aGUgY29ubmVjdGlvbiBzdGF0ZS4KKwkgKgorCSAqIFN0YXRlcyBhcmUga2VwdCBpbiBhIGNpcmN1bGFybHkgbGlua2VkIGxpc3Qgd2l0aAorCSAqIHhtaXRfb2xkZXN0IHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuICBUaGUKKwkgKiBsaXN0IGlzIGtlcHQgaW4gbHJ1IG9yZGVyIGJ5IG1vdmluZyBhIHN0YXRlIHRvIHRoZQorCSAqIGhlYWQgb2YgdGhlIGxpc3Qgd2hlbmV2ZXIgaXQgaXMgcmVmZXJlbmNlZC4gIFNpbmNlCisJICogdGhlIGxpc3QgaXMgc2hvcnQgYW5kLCBlbXBpcmljYWxseSwgdGhlIGNvbm5lY3Rpb24KKwkgKiB3ZSB3YW50IGlzIGFsbW9zdCBhbHdheXMgbmVhciB0aGUgZnJvbnQsIHdlIGxvY2F0ZQorCSAqIHN0YXRlcyB2aWEgbGluZWFyIHNlYXJjaC4gIElmIHdlIGRvbid0IGZpbmQgYSBzdGF0ZQorCSAqIGZvciB0aGUgZGF0YWdyYW0sIHRoZSBvbGRlc3Qgc3RhdGUgaXMgKHJlLSl1c2VkLgorCSAqLworCWZvciAoIDsgOyApIHsKKwkJaWYoIGlwLT5zYWRkciA9PSBjcy0+Y3NfaXAuc2FkZHIKKwkJICYmIGlwLT5kYWRkciA9PSBjcy0+Y3NfaXAuZGFkZHIKKwkJICYmIHRoLT5zb3VyY2UgPT0gY3MtPmNzX3RjcC5zb3VyY2UKKwkJICYmIHRoLT5kZXN0ID09IGNzLT5jc190Y3AuZGVzdCkKKwkJCWdvdG8gZm91bmQ7CisKKwkJLyogaWYgY3VycmVudCBlcXVhbCBvbGRlc3QsIGF0IGVuZCBvZiBsaXN0ICovCisJCWlmICggY3MgPT0gb2NzICkKKwkJCWJyZWFrOworCQlsY3MgPSBjczsKKwkJY3MgPSBjcy0+bmV4dDsKKwkJY29tcC0+c2xzX29fc2VhcmNoZXMrKzsKKwl9OworCS8qCisJICogRGlkbid0IGZpbmQgaXQgLS0gcmUtdXNlIG9sZGVzdCBjc3RhdGUuICBTZW5kIGFuCisJICogdW5jb21wcmVzc2VkIHBhY2tldCB0aGF0IHRlbGxzIHRoZSBvdGhlciBzaWRlIHdoYXQKKwkgKiBjb25uZWN0aW9uIG51bWJlciB3ZSdyZSB1c2luZyBmb3IgdGhpcyBjb252ZXJzYXRpb24uCisJICoKKwkgKiBOb3RlIHRoYXQgc2luY2UgdGhlIHN0YXRlIGxpc3QgaXMgY2lyY3VsYXIsIHRoZSBvbGRlc3QKKwkgKiBzdGF0ZSBwb2ludHMgdG8gdGhlIG5ld2VzdCBhbmQgd2Ugb25seSBuZWVkIHRvIHNldAorCSAqIHhtaXRfb2xkZXN0IHRvIHVwZGF0ZSB0aGUgbHJ1IGxpbmthZ2UuCisJICovCisJY29tcC0+c2xzX29fbWlzc2VzKys7CisJY29tcC0+eG1pdF9vbGRlc3QgPSBsY3MtPmNzX3RoaXM7CisJZ290byB1bmNvbXByZXNzZWQ7CisKK2ZvdW5kOgorCS8qCisJICogRm91bmQgaXQgLS0gbW92ZSB0byB0aGUgZnJvbnQgb24gdGhlIGNvbm5lY3Rpb24gbGlzdC4KKwkgKi8KKwlpZihsY3MgPT0gb2NzKSB7CisgCQkvKiBmb3VuZCBhdCBtb3N0IHJlY2VudGx5IHVzZWQgKi8KKwl9IGVsc2UgaWYgKGNzID09IG9jcykgeworCQkvKiBmb3VuZCBhdCBsZWFzdCByZWNlbnRseSB1c2VkICovCisJCWNvbXAtPnhtaXRfb2xkZXN0ID0gbGNzLT5jc190aGlzOworCX0gZWxzZSB7CisJCS8qIG1vcmUgdGhhbiAyIGVsZW1lbnRzICovCisJCWxjcy0+bmV4dCA9IGNzLT5uZXh0OworCQljcy0+bmV4dCA9IG9jcy0+bmV4dDsKKwkJb2NzLT5uZXh0ID0gY3M7CisJfQorCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCBvbmx5IHdoYXQgd2UgZXhwZWN0IHRvIGNoYW5nZSBjaGFuZ2VkLgorCSAqIENoZWNrIHRoZSBmb2xsb3dpbmc6CisJICogSVAgcHJvdG9jb2wgdmVyc2lvbiwgaGVhZGVyIGxlbmd0aCAmIHR5cGUgb2Ygc2VydmljZS4KKwkgKiBUaGUgIkRvbid0IGZyYWdtZW50IiBiaXQuCisJICogVGhlIHRpbWUtdG8tbGl2ZSBmaWVsZC4KKwkgKiBUaGUgVENQIGhlYWRlciBsZW5ndGguCisJICogSVAgb3B0aW9ucywgaWYgYW55LgorCSAqIFRDUCBvcHRpb25zLCBpZiBhbnkuCisJICogSWYgYW55IG9mIHRoZXNlIHRoaW5ncyBhcmUgZGlmZmVyZW50IGJldHdlZW4gdGhlIHByZXZpb3VzICYKKwkgKiBjdXJyZW50IGRhdGFncmFtLCB3ZSBzZW5kIHRoZSBjdXJyZW50IGRhdGFncmFtIGB1bmNvbXByZXNzZWQnLgorCSAqLworCW90aCA9ICZjcy0+Y3NfdGNwOworCisJaWYoaXAtPnZlcnNpb24gIT0gY3MtPmNzX2lwLnZlcnNpb24gfHwgaXAtPmlobCAhPSBjcy0+Y3NfaXAuaWhsCisJIHx8IGlwLT50b3MgIT0gY3MtPmNzX2lwLnRvcworCSB8fCAoaXAtPmZyYWdfb2ZmICYgaHRvbnMoMHg0MDAwKSkgIT0gKGNzLT5jc19pcC5mcmFnX29mZiAmIGh0b25zKDB4NDAwMCkpCisJIHx8IGlwLT50dGwgIT0gY3MtPmNzX2lwLnR0bAorCSB8fCB0aC0+ZG9mZiAhPSBjcy0+Y3NfdGNwLmRvZmYKKwkgfHwgKGlwLT5paGwgPiA1ICYmIG1lbWNtcChpcCsxLGNzLT5jc19pcG9wdCwoKGlwLT5paGwpLTUpKjQpICE9IDApCisJIHx8ICh0aC0+ZG9mZiA+IDUgJiYgbWVtY21wKHRoKzEsY3MtPmNzX3RjcG9wdCwoKHRoLT5kb2ZmKS01KSo0KSAhPSAwKSl7CisJCWdvdG8gdW5jb21wcmVzc2VkOworCX0KKworCS8qCisJICogRmlndXJlIG91dCB3aGljaCBvZiB0aGUgY2hhbmdpbmcgZmllbGRzIGNoYW5nZWQuICBUaGUKKwkgKiByZWNlaXZlciBleHBlY3RzIGNoYW5nZXMgaW4gdGhlIG9yZGVyOiB1cmdlbnQsIHdpbmRvdywKKwkgKiBhY2ssIHNlcSAodGhlIG9yZGVyIG1pbmltaXplcyB0aGUgbnVtYmVyIG9mIHRlbXBvcmFyaWVzCisJICogbmVlZGVkIGluIHRoaXMgc2VjdGlvbiBvZiBjb2RlKS4KKwkgKi8KKwlpZih0aC0+dXJnKXsKKwkJZGVsdGFTID0gbnRvaHModGgtPnVyZ19wdHIpOworCQljcCA9IGVuY29kZShjcCxkZWx0YVMpOworCQljaGFuZ2VzIHw9IE5FV19VOworCX0gZWxzZSBpZih0aC0+dXJnX3B0ciAhPSBvdGgtPnVyZ19wdHIpeworCQkvKiBhcmdoISBVUkcgbm90IHNldCBidXQgdXJwIGNoYW5nZWQgLS0gYSBzZW5zaWJsZQorCQkgKiBpbXBsZW1lbnRhdGlvbiBzaG91bGQgbmV2ZXIgZG8gdGhpcyBidXQgUkZDNzkzCisJCSAqIGRvZXNuJ3QgcHJvaGliaXQgdGhlIGNoYW5nZSBzbyB3ZSBoYXZlIHRvIGRlYWwKKwkJICogd2l0aCBpdC4gKi8KKwkJZ290byB1bmNvbXByZXNzZWQ7CisJfQorCWlmKChkZWx0YVMgPSBudG9ocyh0aC0+d2luZG93KSAtIG50b2hzKG90aC0+d2luZG93KSkgIT0gMCl7CisJCWNwID0gZW5jb2RlKGNwLGRlbHRhUyk7CisJCWNoYW5nZXMgfD0gTkVXX1c7CisJfQorCWlmKChkZWx0YUEgPSBudG9obCh0aC0+YWNrX3NlcSkgLSBudG9obChvdGgtPmFja19zZXEpKSAhPSAwTCl7CisJCWlmKGRlbHRhQSA+IDB4MDAwMGZmZmYpCisJCQlnb3RvIHVuY29tcHJlc3NlZDsKKwkJY3AgPSBlbmNvZGUoY3AsZGVsdGFBKTsKKwkJY2hhbmdlcyB8PSBORVdfQTsKKwl9CisJaWYoKGRlbHRhUyA9IG50b2hsKHRoLT5zZXEpIC0gbnRvaGwob3RoLT5zZXEpKSAhPSAwTCl7CisJCWlmKGRlbHRhUyA+IDB4MDAwMGZmZmYpCisJCQlnb3RvIHVuY29tcHJlc3NlZDsKKwkJY3AgPSBlbmNvZGUoY3AsZGVsdGFTKTsKKwkJY2hhbmdlcyB8PSBORVdfUzsKKwl9CisKKwlzd2l0Y2goY2hhbmdlcyl7CisJY2FzZSAwOgkvKiBOb3RoaW5nIGNoYW5nZWQuIElmIHRoaXMgcGFja2V0IGNvbnRhaW5zIGRhdGEgYW5kIHRoZQorCQkgKiBsYXN0IG9uZSBkaWRuJ3QsIHRoaXMgaXMgcHJvYmFibHkgYSBkYXRhIHBhY2tldCBmb2xsb3dpbmcKKwkJICogYW4gYWNrIChub3JtYWwgb24gYW4gaW50ZXJhY3RpdmUgY29ubmVjdGlvbikgYW5kIHdlIHNlbmQKKwkJICogaXQgY29tcHJlc3NlZC4gIE90aGVyd2lzZSBpdCdzIHByb2JhYmx5IGEgcmV0cmFuc21pdCwKKwkJICogcmV0cmFuc21pdHRlZCBhY2sgb3Igd2luZG93IHByb2JlLiAgU2VuZCBpdCB1bmNvbXByZXNzZWQKKwkJICogaW4gY2FzZSB0aGUgb3RoZXIgc2lkZSBtaXNzZWQgdGhlIGNvbXByZXNzZWQgdmVyc2lvbi4KKwkJICovCisJCWlmKGlwLT50b3RfbGVuICE9IGNzLT5jc19pcC50b3RfbGVuICYmCisJCSAgIG50b2hzKGNzLT5jc19pcC50b3RfbGVuKSA9PSBobGVuKQorCQkJYnJlYWs7CisJCWdvdG8gdW5jb21wcmVzc2VkOworCQlicmVhazsKKwljYXNlIFNQRUNJQUxfSToKKwljYXNlIFNQRUNJQUxfRDoKKwkJLyogYWN0dWFsIGNoYW5nZXMgbWF0Y2ggb25lIG9mIG91ciBzcGVjaWFsIGNhc2UgZW5jb2RpbmdzIC0tCisJCSAqIHNlbmQgcGFja2V0IHVuY29tcHJlc3NlZC4KKwkJICovCisJCWdvdG8gdW5jb21wcmVzc2VkOworCWNhc2UgTkVXX1N8TkVXX0E6CisJCWlmKGRlbHRhUyA9PSBkZWx0YUEgJiYKKwkJICAgIGRlbHRhUyA9PSBudG9ocyhjcy0+Y3NfaXAudG90X2xlbikgLSBobGVuKXsKKwkJCS8qIHNwZWNpYWwgY2FzZSBmb3IgZWNob2VkIHRlcm1pbmFsIHRyYWZmaWMgKi8KKwkJCWNoYW5nZXMgPSBTUEVDSUFMX0k7CisJCQljcCA9IG5ld19zZXE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBORVdfUzoKKwkJaWYoZGVsdGFTID09IG50b2hzKGNzLT5jc19pcC50b3RfbGVuKSAtIGhsZW4peworCQkJLyogc3BlY2lhbCBjYXNlIGZvciBkYXRhIHhmZXIgKi8KKwkJCWNoYW5nZXMgPSBTUEVDSUFMX0Q7CisJCQljcCA9IG5ld19zZXE7CisJCX0KKwkJYnJlYWs7CisJfQorCWRlbHRhUyA9IG50b2hzKGlwLT5pZCkgLSBudG9ocyhjcy0+Y3NfaXAuaWQpOworCWlmKGRlbHRhUyAhPSAxKXsKKwkJY3AgPSBlbmNvZGUoY3AsZGVsdGFTKTsKKwkJY2hhbmdlcyB8PSBORVdfSTsKKwl9CisJaWYodGgtPnBzaCkKKwkJY2hhbmdlcyB8PSBUQ1BfUFVTSF9CSVQ7CisJLyogR3JhYiB0aGUgY2tzdW0gYmVmb3JlIHdlIG92ZXJ3cml0ZSBpdCBiZWxvdy4gIFRoZW4gdXBkYXRlIG91cgorCSAqIHN0YXRlIHdpdGggdGhpcyBwYWNrZXQncyBoZWFkZXIuCisJICovCisJZGVsdGFBID0gbnRvaHModGgtPmNoZWNrKTsKKwltZW1jcHkoJmNzLT5jc19pcCxpcCwyMCk7CisJbWVtY3B5KCZjcy0+Y3NfdGNwLHRoLDIwKTsKKwkvKiBXZSB3YW50IHRvIHVzZSB0aGUgb3JpZ2luYWwgcGFja2V0IGFzIG91ciBjb21wcmVzc2VkIHBhY2tldC4KKwkgKiAoY3AgLSBuZXdfc2VxKSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIG5lZWQgZm9yIGNvbXByZXNzZWQKKwkgKiBzZXF1ZW5jZSBudW1iZXJzLiAgSW4gYWRkaXRpb24gd2UgbmVlZCBvbmUgYnl0ZSBmb3IgdGhlIGNoYW5nZQorCSAqIG1hc2ssIG9uZSBmb3IgdGhlIGNvbm5lY3Rpb24gaWQgYW5kIHR3byBmb3IgdGhlIHRjcCBjaGVja3N1bS4KKwkgKiBTbywgKGNwIC0gbmV3X3NlcSkgKyA0IGJ5dGVzIG9mIGhlYWRlciBhcmUgbmVlZGVkLgorCSAqLworCWRlbHRhUyA9IGNwIC0gbmV3X3NlcTsKKwlpZihjb21wcmVzc19jaWQgPT0gMCB8fCBjb21wLT54bWl0X2N1cnJlbnQgIT0gY3MtPmNzX3RoaXMpeworCQljcCA9IG9jcDsKKwkJKmNwcCA9IG9jcDsKKwkJKmNwKysgPSBjaGFuZ2VzIHwgTkVXX0M7CisJCSpjcCsrID0gY3MtPmNzX3RoaXM7CisJCWNvbXAtPnhtaXRfY3VycmVudCA9IGNzLT5jc190aGlzOworCX0gZWxzZSB7CisJCWNwID0gb2NwOworCQkqY3BwID0gb2NwOworCQkqY3ArKyA9IGNoYW5nZXM7CisJfQorCWNwID0gcHV0MTYoY3AsKHNob3J0KWRlbHRhQSk7CS8qIFdyaXRlIFRDUCBjaGVja3N1bSAqLworLyogZGVsdGFTIGlzIG5vdyB0aGUgc2l6ZSBvZiB0aGUgY2hhbmdlIHNlY3Rpb24gb2YgdGhlIGNvbXByZXNzZWQgaGVhZGVyICovCisJbWVtY3B5KGNwLG5ld19zZXEsZGVsdGFTKTsJLyogV3JpdGUgbGlzdCBvZiBkZWx0YXMgKi8KKwltZW1jcHkoY3ArZGVsdGFTLGljcCtobGVuLGlzaXplLWhsZW4pOworCWNvbXAtPnNsc19vX2NvbXByZXNzZWQrKzsKKwlvY3BbMF0gfD0gU0xfVFlQRV9DT01QUkVTU0VEX1RDUDsKKwlyZXR1cm4gaXNpemUgLSBobGVuICsgZGVsdGFTICsgKGNwIC0gb2NwKTsKKworCS8qIFVwZGF0ZSBjb25uZWN0aW9uIHN0YXRlIGNzICYgc2VuZCB1bmNvbXByZXNzZWQgcGFja2V0IChpLmUuLAorCSAqIGEgcmVndWxhciBpcC90Y3AgcGFja2V0IGJ1dCB3aXRoIHRoZSAnY29udmVyc2F0aW9uIGlkJyB3ZSBob3BlCisJICogdG8gdXNlIG9uIGZ1dHVyZSBjb21wcmVzc2VkIHBhY2tldHMgaW4gdGhlIHByb3RvY29sIGZpZWxkKS4KKwkgKi8KK3VuY29tcHJlc3NlZDoKKwltZW1jcHkoJmNzLT5jc19pcCxpcCwyMCk7CisJbWVtY3B5KCZjcy0+Y3NfdGNwLHRoLDIwKTsKKwlpZiAoaXAtPmlobCA+IDUpCisJICBtZW1jcHkoY3MtPmNzX2lwb3B0LCBpcCsxLCAoKGlwLT5paGwpIC0gNSkgKiA0KTsKKwlpZiAodGgtPmRvZmYgPiA1KQorCSAgbWVtY3B5KGNzLT5jc190Y3BvcHQsIHRoKzEsICgodGgtPmRvZmYpIC0gNSkgKiA0KTsKKwljb21wLT54bWl0X2N1cnJlbnQgPSBjcy0+Y3NfdGhpczsKKwljb21wLT5zbHNfb191bmNvbXByZXNzZWQrKzsKKwltZW1jcHkob2NwLCBpY3AsIGlzaXplKTsKKwkqY3BwID0gb2NwOworCW9jcFs5XSA9IGNzLT5jc190aGlzOworCW9jcFswXSB8PSBTTF9UWVBFX1VOQ09NUFJFU1NFRF9UQ1A7CisJcmV0dXJuIGlzaXplOworfQorCisKK2ludAorc2xoY191bmNvbXByZXNzKHN0cnVjdCBzbGNvbXByZXNzICpjb21wLCB1bnNpZ25lZCBjaGFyICppY3AsIGludCBpc2l6ZSkKK3sKKwlyZWdpc3RlciBpbnQgY2hhbmdlczsKKwlsb25nIHg7CisJcmVnaXN0ZXIgc3RydWN0IHRjcGhkciAqdGhwOworCXJlZ2lzdGVyIHN0cnVjdCBpcGhkciAqaXA7CisJcmVnaXN0ZXIgc3RydWN0IGNzdGF0ZSAqY3M7CisJaW50IGxlbiwgaGRybGVuOworCXVuc2lnbmVkIGNoYXIgKmNwID0gaWNwOworCisJLyogV2UndmUgZ290IGEgY29tcHJlc3NlZCBwYWNrZXQ7IHJlYWQgdGhlIGNoYW5nZSBieXRlICovCisJY29tcC0+c2xzX2lfY29tcHJlc3NlZCsrOworCWlmKGlzaXplIDwgMyl7CisJCWNvbXAtPnNsc19pX2Vycm9yKys7CisJCXJldHVybiAwOworCX0KKwljaGFuZ2VzID0gKmNwKys7CisJaWYoY2hhbmdlcyAmIE5FV19DKXsKKwkJLyogTWFrZSBzdXJlIHRoZSBzdGF0ZSBpbmRleCBpcyBpbiByYW5nZSwgdGhlbiBncmFiIHRoZSBzdGF0ZS4KKwkJICogSWYgd2UgaGF2ZSBhIGdvb2Qgc3RhdGUgaW5kZXgsIGNsZWFyIHRoZSAnZGlzY2FyZCcgZmxhZy4KKwkJICovCisJCXggPSAqY3ArKzsJLyogUmVhZCBjb25uIGluZGV4ICovCisJCWlmKHggPCAwIHx8IHggPiBjb21wLT5yc2xvdF9saW1pdCkKKwkJCWdvdG8gYmFkOworCisJCWNvbXAtPmZsYWdzICY9fiBTTEZfVE9TUzsKKwkJY29tcC0+cmVjdl9jdXJyZW50ID0geDsKKwl9IGVsc2UgeworCQkvKiB0aGlzIHBhY2tldCBoYXMgYW4gaW1wbGljaXQgc3RhdGUgaW5kZXguICBJZiB3ZSd2ZQorCQkgKiBoYWQgYSBsaW5lIGVycm9yIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgZ290IGFuCisJCSAqIGV4cGxpY2l0IHN0YXRlIGluZGV4LCB3ZSBoYXZlIHRvIHRvc3MgdGhlIHBhY2tldC4gKi8KKwkJaWYoY29tcC0+ZmxhZ3MgJiBTTEZfVE9TUyl7CisJCQljb21wLT5zbHNfaV90b3NzZWQrKzsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWNzID0gJmNvbXAtPnJzdGF0ZVtjb21wLT5yZWN2X2N1cnJlbnRdOworCXRocCA9ICZjcy0+Y3NfdGNwOworCWlwID0gJmNzLT5jc19pcDsKKworCWlmKCh4ID0gcHVsbDE2KCZjcCkpID09IC0xKSB7CS8qIFJlYWQgdGhlIFRDUCBjaGVja3N1bSAqLworCQlnb3RvIGJhZDsKKyAgICAgICAgfQorCXRocC0+Y2hlY2sgPSBodG9ucyh4KTsKKworCXRocC0+cHNoID0gKGNoYW5nZXMgJiBUQ1BfUFVTSF9CSVQpID8gMSA6IDA7CisvKgorICogd2UgY2FuIHVzZSB0aGUgc2FtZSBudW1iZXIgZm9yIHRoZSBsZW5ndGggb2YgdGhlIHNhdmVkIGhlYWRlciBhbmQKKyAqIHRoZSBjdXJyZW50IG9uZSwgYmVjYXVzZSB0aGUgcGFja2V0IHdvdWxkbid0IGhhdmUgYmVlbiBzZW50CisgKiBhcyBjb21wcmVzc2VkIHVubGVzcyB0aGUgb3B0aW9ucyB3ZXJlIHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyBvbmUKKyAqLworCisJaGRybGVuID0gaXAtPmlobCAqIDQgKyB0aHAtPmRvZmYgKiA0OworCisJc3dpdGNoKGNoYW5nZXMgJiBTUEVDSUFMU19NQVNLKXsKKwljYXNlIFNQRUNJQUxfSToJCS8qIEVjaG9lZCB0ZXJtaW5hbCB0cmFmZmljICovCisJCXsKKwkJcmVnaXN0ZXIgc2hvcnQgaTsKKwkJaSA9IG50b2hzKGlwLT50b3RfbGVuKSAtIGhkcmxlbjsKKwkJdGhwLT5hY2tfc2VxID0gaHRvbmwoIG50b2hsKHRocC0+YWNrX3NlcSkgKyBpKTsKKwkJdGhwLT5zZXEgPSBodG9ubCggbnRvaGwodGhwLT5zZXEpICsgaSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNQRUNJQUxfRDoJCQkvKiBVbmlkaXJlY3Rpb25hbCBkYXRhICovCisJCXRocC0+c2VxID0gaHRvbmwoIG50b2hsKHRocC0+c2VxKSArCisJCQkJICBudG9ocyhpcC0+dG90X2xlbikgLSBoZHJsZW4pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWlmKGNoYW5nZXMgJiBORVdfVSl7CisJCQl0aHAtPnVyZyA9IDE7CisJCQlpZigoeCA9IGRlY29kZSgmY3ApKSA9PSAtMSkgeworCQkJCWdvdG8gYmFkOworCQkJfQorCQkJdGhwLT51cmdfcHRyID0gaHRvbnMoeCk7CisJCX0gZWxzZQorCQkJdGhwLT51cmcgPSAwOworCQlpZihjaGFuZ2VzICYgTkVXX1cpeworCQkJaWYoKHggPSBkZWNvZGUoJmNwKSkgPT0gLTEpIHsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCXRocC0+d2luZG93ID0gaHRvbnMoIG50b2hzKHRocC0+d2luZG93KSArIHgpOworCQl9CisJCWlmKGNoYW5nZXMgJiBORVdfQSl7CisJCQlpZigoeCA9IGRlY29kZSgmY3ApKSA9PSAtMSkgeworCQkJCWdvdG8gYmFkOworCQkJfQorCQkJdGhwLT5hY2tfc2VxID0gaHRvbmwoIG50b2hsKHRocC0+YWNrX3NlcSkgKyB4KTsKKwkJfQorCQlpZihjaGFuZ2VzICYgTkVXX1MpeworCQkJaWYoKHggPSBkZWNvZGUoJmNwKSkgPT0gLTEpIHsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCXRocC0+c2VxID0gaHRvbmwoIG50b2hsKHRocC0+c2VxKSArIHgpOworCQl9CisJCWJyZWFrOworCX0KKwlpZihjaGFuZ2VzICYgTkVXX0kpeworCQlpZigoeCA9IGRlY29kZSgmY3ApKSA9PSAtMSkgeworCQkJZ290byBiYWQ7CisJCX0KKwkJaXAtPmlkID0gaHRvbnMgKG50b2hzIChpcC0+aWQpICsgeCk7CisJfSBlbHNlCisJCWlwLT5pZCA9IGh0b25zIChudG9ocyAoaXAtPmlkKSArIDEpOworCisJLyoKKwkgKiBBdCB0aGlzIHBvaW50LCBjcCBwb2ludHMgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgZGF0YSBpbiB0aGUKKwkgKiBwYWNrZXQuICBQdXQgdGhlIHJlY29uc3RydWN0ZWQgVENQIGFuZCBJUCBoZWFkZXJzIGJhY2sgb24gdGhlCisJICogcGFja2V0LiAgUmVjYWxjdWxhdGUgSVAgY2hlY2tzdW0gKGJ1dCBub3QgVENQIGNoZWNrc3VtKS4KKwkgKi8KKworCWxlbiA9IGlzaXplIC0gKGNwIC0gaWNwKTsKKwlpZiAobGVuIDwgMCkKKwkJZ290byBiYWQ7CisJbGVuICs9IGhkcmxlbjsKKwlpcC0+dG90X2xlbiA9IGh0b25zKGxlbik7CisJaXAtPmNoZWNrID0gMDsKKworCW1lbW1vdmUoaWNwICsgaGRybGVuLCBjcCwgbGVuIC0gaGRybGVuKTsKKworCWNwID0gaWNwOworCW1lbWNweShjcCwgaXAsIDIwKTsKKwljcCArPSAyMDsKKworCWlmIChpcC0+aWhsID4gNSkgeworCSAgbWVtY3B5KGNwLCBjcy0+Y3NfaXBvcHQsIChpcC0+aWhsIC0gNSkgKiA0KTsKKwkgIGNwICs9IChpcC0+aWhsIC0gNSkgKiA0OworCX0KKworCXB1dF91bmFsaWduZWQoaXBfZmFzdF9jc3VtKGljcCwgaXAtPmlobCksCisJCSAgICAgICYoKHN0cnVjdCBpcGhkciAqKWljcCktPmNoZWNrKTsKKworCW1lbWNweShjcCwgdGhwLCAyMCk7CisJY3AgKz0gMjA7CisKKwlpZiAodGhwLT5kb2ZmID4gNSkgeworCSAgbWVtY3B5KGNwLCBjcy0+Y3NfdGNwb3B0LCAoKHRocC0+ZG9mZikgLSA1KSAqIDQpOworCSAgY3AgKz0gKCh0aHAtPmRvZmYpIC0gNSkgKiA0OworCX0KKworCXJldHVybiBsZW47CitiYWQ6CisJY29tcC0+c2xzX2lfZXJyb3IrKzsKKwlyZXR1cm4gc2xoY190b3NzKCBjb21wICk7Cit9CisKKworaW50CitzbGhjX3JlbWVtYmVyKHN0cnVjdCBzbGNvbXByZXNzICpjb21wLCB1bnNpZ25lZCBjaGFyICppY3AsIGludCBpc2l6ZSkKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgY3N0YXRlICpjczsKKwl1bnNpZ25lZCBpaGw7CisKKwl1bnNpZ25lZCBjaGFyIGluZGV4OworCisJaWYoaXNpemUgPCAyMCkgeworCQkvKiBUaGUgcGFja2V0IGlzIHNob3J0ZXIgdGhhbiBhIGxlZ2FsIElQIGhlYWRlciAqLworCQljb21wLT5zbHNfaV9ydW50Kys7CisJCXJldHVybiBzbGhjX3Rvc3MoIGNvbXAgKTsKKwl9CisJLyogUGVlayBhdCB0aGUgSVAgaGVhZGVyJ3MgSUhMIGZpZWxkIHRvIGZpbmQgaXRzIGxlbmd0aCAqLworCWlobCA9IGljcFswXSAmIDB4ZjsKKwlpZihpaGwgPCAyMCAvIDQpeworCQkvKiBUaGUgSVAgaGVhZGVyIGxlbmd0aCBmaWVsZCBpcyB0b28gc21hbGwgKi8KKwkJY29tcC0+c2xzX2lfcnVudCsrOworCQlyZXR1cm4gc2xoY190b3NzKCBjb21wICk7CisJfQorCWluZGV4ID0gaWNwWzldOworCWljcFs5XSA9IElQUFJPVE9fVENQOworCisJaWYgKGlwX2Zhc3RfY3N1bShpY3AsIGlobCkpIHsKKwkJLyogQmFkIElQIGhlYWRlciBjaGVja3N1bTsgZGlzY2FyZCAqLworCQljb21wLT5zbHNfaV9iYWRjaGVjaysrOworCQlyZXR1cm4gc2xoY190b3NzKCBjb21wICk7CisJfQorCWlmKGluZGV4ID4gY29tcC0+cnNsb3RfbGltaXQpIHsKKwkJY29tcC0+c2xzX2lfZXJyb3IrKzsKKwkJcmV0dXJuIHNsaGNfdG9zcyhjb21wKTsKKwl9CisKKwkvKiBVcGRhdGUgbG9jYWwgc3RhdGUgKi8KKwljcyA9ICZjb21wLT5yc3RhdGVbY29tcC0+cmVjdl9jdXJyZW50ID0gaW5kZXhdOworCWNvbXAtPmZsYWdzICY9fiBTTEZfVE9TUzsKKwltZW1jcHkoJmNzLT5jc19pcCxpY3AsMjApOworCW1lbWNweSgmY3MtPmNzX3RjcCxpY3AgKyBpaGwqNCwyMCk7CisJaWYgKGlobCA+IDUpCisJICBtZW1jcHkoY3MtPmNzX2lwb3B0LCBpY3AgKyBzaXplb2Yoc3RydWN0IGlwaGRyKSwgKGlobCAtIDUpICogNCk7CisJaWYgKGNzLT5jc190Y3AuZG9mZiA+IDUpCisJICBtZW1jcHkoY3MtPmNzX3RjcG9wdCwgaWNwICsgaWhsKjQgKyBzaXplb2Yoc3RydWN0IHRjcGhkciksIChjcy0+Y3NfdGNwLmRvZmYgLSA1KSAqIDQpOworCWNzLT5jc19oc2l6ZSA9IGlobCoyICsgY3MtPmNzX3RjcC5kb2ZmKjI7CisJLyogUHV0IGhlYWRlcnMgYmFjayBvbiBwYWNrZXQKKwkgKiBOZWl0aGVyIGhlYWRlciBjaGVja3N1bSBpcyByZWNhbGN1bGF0ZWQKKwkgKi8KKwljb21wLT5zbHNfaV91bmNvbXByZXNzZWQrKzsKKwlyZXR1cm4gaXNpemU7Cit9CisKK2ludAorc2xoY190b3NzKHN0cnVjdCBzbGNvbXByZXNzICpjb21wKQoreworCWlmICggY29tcCA9PSBOVUxMU0xDT01QUiApCisJCXJldHVybiAwOworCisJY29tcC0+ZmxhZ3MgfD0gU0xGX1RPU1M7CisJcmV0dXJuIDA7Cit9CisKKworLyogVkogaGVhZGVyIGNvbXByZXNzaW9uICovCitFWFBPUlRfU1lNQk9MKHNsaGNfaW5pdCk7CitFWFBPUlRfU1lNQk9MKHNsaGNfZnJlZSk7CitFWFBPUlRfU1lNQk9MKHNsaGNfcmVtZW1iZXIpOworRVhQT1JUX1NZTUJPTChzbGhjX2NvbXByZXNzKTsKK0VYUE9SVF9TWU1CT0woc2xoY191bmNvbXByZXNzKTsKK0VYUE9SVF9TWU1CT0woc2xoY190b3NzKTsKKworI2lmZGVmIE1PRFVMRQorCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJDU0xJUDogY29kZSBjb3B5cmlnaHQgMTk4OSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWFcbiIpOworCXJldHVybiAwOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuOworfQorCisjZW5kaWYgLyogTU9EVUxFICovCisjZWxzZSAvKiBDT05GSUdfSU5FVCAqLworCisKK2ludAorc2xoY190b3NzKHN0cnVjdCBzbGNvbXByZXNzICpjb21wKQoreworICBwcmludGsoS0VSTl9ERUJVRyAiQ2FsbGVkIElQIGZ1bmN0aW9uIG9uIG5vbiBJUC1zeXN0ZW06IHNsaGNfdG9zcyIpOworICByZXR1cm4gLUVJTlZBTDsKK30KK2ludAorc2xoY191bmNvbXByZXNzKHN0cnVjdCBzbGNvbXByZXNzICpjb21wLCB1bnNpZ25lZCBjaGFyICppY3AsIGludCBpc2l6ZSkKK3sKKyAgcHJpbnRrKEtFUk5fREVCVUcgIkNhbGxlZCBJUCBmdW5jdGlvbiBvbiBub24gSVAtc3lzdGVtOiBzbGhjX3VuY29tcHJlc3MiKTsKKyAgcmV0dXJuIC1FSU5WQUw7Cit9CitpbnQKK3NsaGNfY29tcHJlc3Moc3RydWN0IHNsY29tcHJlc3MgKmNvbXAsIHVuc2lnbmVkIGNoYXIgKmljcCwgaW50IGlzaXplLAorCXVuc2lnbmVkIGNoYXIgKm9jcCwgdW5zaWduZWQgY2hhciAqKmNwcCwgaW50IGNvbXByZXNzX2NpZCkKK3sKKyAgcHJpbnRrKEtFUk5fREVCVUcgIkNhbGxlZCBJUCBmdW5jdGlvbiBvbiBub24gSVAtc3lzdGVtOiBzbGhjX2NvbXByZXNzIik7CisgIHJldHVybiAtRUlOVkFMOworfQorCitpbnQKK3NsaGNfcmVtZW1iZXIoc3RydWN0IHNsY29tcHJlc3MgKmNvbXAsIHVuc2lnbmVkIGNoYXIgKmljcCwgaW50IGlzaXplKQoreworICBwcmludGsoS0VSTl9ERUJVRyAiQ2FsbGVkIElQIGZ1bmN0aW9uIG9uIG5vbiBJUC1zeXN0ZW06IHNsaGNfcmVtZW1iZXIiKTsKKyAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK3ZvaWQKK3NsaGNfZnJlZShzdHJ1Y3Qgc2xjb21wcmVzcyAqY29tcCkKK3sKKyAgcHJpbnRrKEtFUk5fREVCVUcgIkNhbGxlZCBJUCBmdW5jdGlvbiBvbiBub24gSVAtc3lzdGVtOiBzbGhjX2ZyZWUiKTsKKyAgcmV0dXJuOworfQorc3RydWN0IHNsY29tcHJlc3MgKgorc2xoY19pbml0KGludCByc2xvdHMsIGludCB0c2xvdHMpCit7CisgIHByaW50ayhLRVJOX0RFQlVHICJDYWxsZWQgSVAgZnVuY3Rpb24gb24gbm9uIElQLXN5c3RlbTogc2xoY19pbml0Iik7CisgIHJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChzbGhjX2luaXQpOworRVhQT1JUX1NZTUJPTChzbGhjX2ZyZWUpOworRVhQT1JUX1NZTUJPTChzbGhjX3JlbWVtYmVyKTsKK0VYUE9SVF9TWU1CT0woc2xoY19jb21wcmVzcyk7CitFWFBPUlRfU1lNQk9MKHNsaGNfdW5jb21wcmVzcyk7CitFWFBPUlRfU1lNQk9MKHNsaGNfdG9zcyk7CisKKyNlbmRpZiAvKiBDT05GSUdfSU5FVCAqLworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2xpcC5jIGIvZHJpdmVycy9uZXQvc2xpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZTUyZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zbGlwLmMKQEAgLTAsMCArMSwxNTIyIEBACisvKgorICogc2xpcC5jCVRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIFNMSVAgcHJvdG9jb2wgZm9yIGtlcm5lbC1iYXNlZAorICoJCWRldmljZXMgbGlrZSBUVFkuICBJdCBpbnRlcmZhY2VzIGJldHdlZW4gYSByYXcgVFRZLCBhbmQgdGhlCisgKgkJa2VybmVsJ3MgSU5FVCBwcm90b2NvbCBsYXllcnMuCisgKgorICogVmVyc2lvbjoJQCgjKXNsaXAuYwkwLjguMwkxMi8yNC85NAorICoKKyAqIEF1dGhvcnM6CUxhdXJlbmNlIEN1bGhhbmUsIDxsb3pAaG9sbWVzLmRlbW9uLmNvLnVrPgorICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1d2FsdC5ubC5tdWduZXQub3JnPgorICoKKyAqIEZpeGVzOgorICoJCUFsYW4gQ294CTogCVNhbml0eSBjaGVja3MgYW5kIGF2b2lkIHR4IG92ZXJydW5zLgorICoJCQkJCUhhcyBhIG5ldyBzbC0+bXR1IGZpZWxkLgorICoJCUFsYW4gQ294CTogCUZvdW5kIGNhdXNlIG9mIG92ZXJydW4uIGlmY29uZmlnIHNsMCBtdHUgdXB3YXJkcy4KKyAqCQkJCQlEcml2ZXIgbm93IHNwb3RzIHRoaXMgYW5kIGdyb3dzL3Nocmlua3MgaXRzIGJ1ZmZlcnMoaGFjayEpLgorICoJCQkJCU1lbW9yeSBsZWFrIGlmIHlvdSBydW4gb3V0IG9mIG1lbW9yeSBzZXR0aW5nIHVwIGEgc2xpcCBkcml2ZXIgZml4ZWQuCisgKgkJTWF0dCBEaWxsb24JOglQcmludGFibGUgc2xpcCAoYm9ycm93ZWQgZnJvbSBORVQyRSkKKyAqCVBhdWxpbmUgTWlkZGVsaW5rCToJU2xpcCBkcml2ZXIgZml4ZXMuCisgKgkJQWxhbiBDb3gJOglIb25vdXJzIHRoZSBvbGQgU0xfQ09NUFJFU1NFRCBmbGFnCisgKgkJQWxhbiBDb3gJOglLSVNTIEFYLjI1IGFuZCBBWFVJIElQIHN1cHBvcnQKKyAqCQlNaWNoYWVsIFJpZXBlCToJQXV0b21hdGljIENTTElQIHJlY29nbml0aW9uIGFkZGVkCisgKgkJQ2hhcmxlcyBIZWRyaWNrIDoJQ1NMSVAgaGVhZGVyIGxlbmd0aCBwcm9ibGVtIGZpeC4KKyAqCQlBbGFuIENveAk6CUNvcnJlY3RlZCBub24tSVAgY2FzZXMgb2YgdGhlIGFib3ZlLgorICoJCUFsYW4gQ294CToJTm93IHVzZXMgaGFyZHdhcmUgdHlwZSBhcyBwZXIgRnZLLgorICoJCUFsYW4gQ294CToJRGVmYXVsdCB0byAxOTIuMTY4LjAuMCAoUkZDIDE1OTcpCisgKgkJQS5OLkt1em5ldHNvdgk6CWRldl90aW50KCkgcmVjdXJzaW9uIGZpeC4KKyAqCURtaXRyeSBHb3JvZGNoYW5pbgk6CVNMSVAgbWVtb3J5IGxlYWtzCisgKiAgICAgIERtaXRyeSBHb3JvZGNoYW5pbiAgICAgIDogICAgICAgQ29kZSBjbGVhbnVwLiBSZWR1Y2UgdHR5IGRyaXZlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcmluZyBmcm9tIDQwOTYgdG8gMjU2IGJ5dGVzLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltcHJvdmluZyBTTElQIHJlc3BvbnNlIHRpbWUuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX1NMSVBfTU9ERV9TTElQNi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmNvbmZpZyBzbD8gdXAgJiBkb3duIG5vdyB3b3JrcyBjb3JyZWN0bHkuCisgKgkJCQkJTW9kdWxhcml6YXRpb24uCisgKiAgICAgICAgICAgICAgQWxhbiBDb3ggICAgICAgIDogICAgICAgT29wcyAtIGZpeCBBWC4yNSBidWZmZXIgbGVuZ3RocworICogICAgICBEbWl0cnkgR29yb2RjaGFuaW4gICAgICA6ICAgICAgIEV2ZW4gbW9yZSBjbGVhbnVwcy4gUHJlc2VydmUgQ1NMSVAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aXN0aWNzLiBJbmNsdWRlIENTTElQIGNvZGUgb25seQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGl0IHJlYWxseSBuZWVkZWQuCisgKgkJQWxhbiBDb3gJOglGcmVlIHNsaGMgYnVmZmVycyBpbiB0aGUgcmlnaHQgcGxhY2UuCisgKgkJQWxhbiBDb3gJOglBbGxvdyBmb3IgZGlnaXBlYXRlZCBJUCBvdmVyIEFYLjI1CisgKgkJTWF0dGkgQWFybmlvCToJRHluYW1pYyBTTElQIGRldmljZXMsIHdpdGggaWRlYXMgdGFrZW4KKyAqCQkJCQlmcm9tIEppbSBGcmVlbWFuJ3MgPGpmcmVlQGNhbGRlcmEuY29tPgorICoJCQkJCWR5bmFtaWMgUFBQIGRldmljZXMuICBXZSBkbyBOT1Qga2ZyZWUoKQorICoJCQkJCWRldmljZSBlbnRyaWVzLCBqdXN0IHJlZy4vdW5yZWcuIHRoZW0KKyAqCQkJCQlhcyB0aGV5IGFyZSBuZWVkZWQuICBXZSBrZnJlZSgpIHRoZW0KKyAqCQkJCQlhdCBtb2R1bGUgY2xlYW51cC4KKyAqCQkJCQlXaXRoIE1PRFVMRS1sb2FkaW5nIGBgaW5zbW9kJycsIHVzZXIgY2FuCisgKgkJCQkJaXNzdWUgcGFyYW1ldGVyOiAgIHNsaXBfbWF4ZGV2PTEwMjQKKyAqCQkJCQkoT3IgaG93IG11Y2ggaGUvc2hlIHdhbnRzLi4gRGVmYXVsdCBpcyAyNTYpCisgKiAqCVN0YW5pc2xhdiBWb3JvbnlpCToJU2xpcCBsaW5lIGNoZWNraW5nLCB3aXRoIGlkZWFzIHRha2VuCisgKgkJCQkJZnJvbSBtdWx0aXNsaXAgQlNESSBkcml2ZXIgd2hpY2ggd2FzIHdyaXR0ZW4KKyAqCQkJCQlieSBJZ29yIENoZWNoaWssIFJFTENPTSBDb3JwLiBPbmx5IGFsZ29yaXRobXMKKyAqIAkJCQkJaGF2ZSBiZWVuIHBvcnRlZCB0byBMaW51eCBTTElQIGRyaXZlci4KKyAqCVZpdGFseSBFLiBMYXZyb3YJOglTYW5lIGJlaGF2aW91ciBvbiB0dHkgaGFuZ3VwLgorICoJQWxleGV5IEt1em5ldHNvdgk6CUNsZWFudXAgaW50ZXJmYWNlcyB0byB0dHkmbmV0ZGV2aWNlIG1vZHVsZXMuCisgKi8KKworI2RlZmluZSBTTF9DSEVDS19UUkFOU01JVAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3NsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSAic2xpcC5oIgorI2lmZGVmIENPTkZJR19JTkVUCisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvc2xoY192ai5oPgorI2VuZGlmCisKKyNkZWZpbmUgU0xJUF9WRVJTSU9OCSIwLjguNC1ORVQzLjAxOS1ORVdUVFkiCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqKnNsaXBfZGV2czsKKworc3RhdGljIGludCBzbGlwX21heGRldiA9IFNMX05SVU5JVDsKK21vZHVsZV9wYXJhbShzbGlwX21heGRldiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc2xpcF9tYXhkZXYsICJNYXhpbXVtIG51bWJlciBvZiBzbGlwIGRldmljZXMiKTsKKworc3RhdGljIGludCBzbGlwX2VzYyh1bnNpZ25lZCBjaGFyICpwLCB1bnNpZ25lZCBjaGFyICpkLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIHNsaXBfdW5lc2Moc3RydWN0IHNsaXAgKnNsLCB1bnNpZ25lZCBjaGFyIGMpOworI2lmZGVmIENPTkZJR19TTElQX01PREVfU0xJUDYKK3N0YXRpYyBpbnQgc2xpcF9lc2M2KHVuc2lnbmVkIGNoYXIgKnAsIHVuc2lnbmVkIGNoYXIgKmQsIGludCBsZW4pOworc3RhdGljIHZvaWQgc2xpcF91bmVzYzYoc3RydWN0IHNsaXAgKnNsLCB1bnNpZ25lZCBjaGFyIGMpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NMSVBfU01BUlQKK3N0YXRpYyB2b2lkIHNsX2tlZXBhbGl2ZSh1bnNpZ25lZCBsb25nIHNscyk7CitzdGF0aWMgdm9pZCBzbF9vdXRmaWxsKHVuc2lnbmVkIGxvbmcgc2xzKTsKK3N0YXRpYyBpbnQgc2xfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzdHJ1Y3QgaWZyZXEgKnJxLGludCBjbWQpOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgQnVmZmVyIGFkbWluaXN0cmF0aW9uIHJvdXRpbmVzOgorKglzbF9hbGxvY19idWZzKCkKKyoJc2xfZnJlZV9idWZzKCkKKyoJc2xfcmVhbGxvY19idWZzKCkKKyoKKyogTk9URTogc2xfcmVhbGxvY19idWZzICE9IHNsX2ZyZWVfYnVmcyArIHNsX2FsbG9jX2J1ZnMsIGJlY2F1c2UKKyoJc2xfcmVhbGxvY19idWZzIHByb3ZpZGVzIHN0cm9uZyBhdG9taWNpdHkgYW5kIHJlYWxsb2NhdGlvbgorKglvbiBhY3RpdmVseSBydW5uaW5nIGRldmljZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogCisgICBBbGxvY2F0ZSBjaGFubmVsIGJ1ZmZlcnMuCisgKi8KKworc3RhdGljIGludAorc2xfYWxsb2NfYnVmcyhzdHJ1Y3Qgc2xpcCAqc2wsIGludCBtdHUpCit7CisJaW50IGVyciA9IC1FTk9CVUZTOworCXVuc2lnbmVkIGxvbmcgbGVuOworCWNoYXIgKiByYnVmZiA9IE5VTEw7CisJY2hhciAqIHhidWZmID0gTlVMTDsKKyNpZmRlZiBTTF9JTkNMVURFX0NTTElQCisJY2hhciAqIGNidWZmID0gTlVMTDsKKwlzdHJ1Y3Qgc2xjb21wcmVzcyAqc2xjb21wID0gTlVMTDsKKyNlbmRpZgorCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgU0xJUCBmcmFtZSBidWZmZXJzOgorCSAqCisJICogcmJ1ZmYJUmVjZWl2ZSBidWZmZXIuCisJICogeGJ1ZmYJVHJhbnNtaXQgYnVmZmVyLgorCSAqIGNidWZmICAgICAgICBUZW1wb3JhcnkgY29tcHJlc3Npb24gYnVmZmVyLgorCSAqLworCWxlbiA9IG10dSAqIDI7CisKKwkvKgorCSAqIGFsbG93IGZvciBhcnJpdmFsIG9mIGxhcmdlciBVRFAgcGFja2V0cywgZXZlbiBpZiB3ZSBzYXkgbm90IHRvCisJICogYWxzbyBmaXhlcyBhIGJ1ZyBpbiB3aGljaCBTdW5PUyBzZW5kcyA1MTItYnl0ZSBwYWNrZXRzIGV2ZW4gd2l0aAorCSAqIGFuIE1TUyBvZiAxMjgKKwkgKi8KKwlpZiAobGVuIDwgNTc2ICogMikKKwkJbGVuID0gNTc2ICogMjsKKwlyYnVmZiA9IGttYWxsb2MobGVuICsgNCwgR0ZQX0tFUk5FTCk7CisJaWYgKHJidWZmID09IE5VTEwpCisJCWdvdG8gZXJyX2V4aXQ7CisJeGJ1ZmYgPSBrbWFsbG9jKGxlbiArIDQsIEdGUF9LRVJORUwpOworCWlmICh4YnVmZiA9PSBOVUxMKQorCQlnb3RvIGVycl9leGl0OworI2lmZGVmIFNMX0lOQ0xVREVfQ1NMSVAKKwljYnVmZiA9IGttYWxsb2MobGVuICsgNCwgR0ZQX0tFUk5FTCk7CisJaWYgKGNidWZmID09IE5VTEwpCisJCWdvdG8gZXJyX2V4aXQ7CisJc2xjb21wID0gc2xoY19pbml0KDE2LCAxNik7CisJaWYgKHNsY29tcCA9PSBOVUxMKQorCQlnb3RvIGVycl9leGl0OworI2VuZGlmCisJc3Bpbl9sb2NrX2JoKCZzbC0+bG9jayk7CisJaWYgKHNsLT50dHkgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19iaCgmc2wtPmxvY2spOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9leGl0OworCX0KKwlzbC0+bXR1CSAgICAgPSBtdHU7CisJc2wtPmJ1ZmZzaXplID0gbGVuOworCXNsLT5yY291bnQgICA9IDA7CisJc2wtPnhsZWZ0ICAgID0gMDsKKwlyYnVmZiA9IHhjaGcoJnNsLT5yYnVmZiwgcmJ1ZmYpOworCXhidWZmID0geGNoZygmc2wtPnhidWZmLCB4YnVmZik7CisjaWZkZWYgU0xfSU5DTFVERV9DU0xJUAorCWNidWZmID0geGNoZygmc2wtPmNidWZmLCBjYnVmZik7CisJc2xjb21wID0geGNoZygmc2wtPnNsY29tcCwgc2xjb21wKTsKKyNpZmRlZiBDT05GSUdfU0xJUF9NT0RFX1NMSVA2CisJc2wtPnhkYXRhICAgID0gMDsKKwlzbC0+eGJpdHMgICAgPSAwOworI2VuZGlmCisjZW5kaWYKKwlzcGluX3VubG9ja19iaCgmc2wtPmxvY2spOworCWVyciA9IDA7CisKKwkvKiBDbGVhbnVwICovCitlcnJfZXhpdDoKKyNpZmRlZiBTTF9JTkNMVURFX0NTTElQCisJaWYgKGNidWZmKQorCQlrZnJlZShjYnVmZik7CisJaWYgKHNsY29tcCkKKwkJc2xoY19mcmVlKHNsY29tcCk7CisjZW5kaWYKKwlpZiAoeGJ1ZmYpCisJCWtmcmVlKHhidWZmKTsKKwlpZiAocmJ1ZmYpCisJCWtmcmVlKHJidWZmKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBGcmVlIGEgU0xJUCBjaGFubmVsIGJ1ZmZlcnMuICovCitzdGF0aWMgdm9pZAorc2xfZnJlZV9idWZzKHN0cnVjdCBzbGlwICpzbCkKK3sKKwl2b2lkICogdG1wOworCisJLyogRnJlZSBhbGwgU0xJUCBmcmFtZSBidWZmZXJzLiAqLworCWlmICgodG1wID0geGNoZygmc2wtPnJidWZmLCBOVUxMKSkgIT0gTlVMTCkKKwkJa2ZyZWUodG1wKTsKKwlpZiAoKHRtcCA9IHhjaGcoJnNsLT54YnVmZiwgTlVMTCkpICE9IE5VTEwpCisJCWtmcmVlKHRtcCk7CisjaWZkZWYgU0xfSU5DTFVERV9DU0xJUAorCWlmICgodG1wID0geGNoZygmc2wtPmNidWZmLCBOVUxMKSkgIT0gTlVMTCkKKwkJa2ZyZWUodG1wKTsKKwlpZiAoKHRtcCA9IHhjaGcoJnNsLT5zbGNvbXAsIE5VTEwpKSAhPSBOVUxMKQorCQlzbGhjX2ZyZWUodG1wKTsKKyNlbmRpZgorfQorCisvKiAKKyAgIFJlYWxsb2NhdGUgc2xpcCBjaGFubmVsIGJ1ZmZlcnMuCisgKi8KKworc3RhdGljIGludCBzbF9yZWFsbG9jX2J1ZnMoc3RydWN0IHNsaXAgKnNsLCBpbnQgbXR1KQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzbC0+ZGV2OworCXVuc2lnbmVkIGNoYXIgKnhidWZmLCAqcmJ1ZmY7CisjaWZkZWYgU0xfSU5DTFVERV9DU0xJUAorCXVuc2lnbmVkIGNoYXIgKmNidWZmOworI2VuZGlmCisJaW50IGxlbiA9IG10dSAqIDI7CisKKy8qCisgKiBhbGxvdyBmb3IgYXJyaXZhbCBvZiBsYXJnZXIgVURQIHBhY2tldHMsIGV2ZW4gaWYgd2Ugc2F5IG5vdCB0bworICogYWxzbyBmaXhlcyBhIGJ1ZyBpbiB3aGljaCBTdW5PUyBzZW5kcyA1MTItYnl0ZSBwYWNrZXRzIGV2ZW4gd2l0aAorICogYW4gTVNTIG9mIDEyOAorICovCisJaWYgKGxlbiA8IDU3NiAqIDIpCisJCWxlbiA9IDU3NiAqIDI7CisKKwl4YnVmZiA9ICh1bnNpZ25lZCBjaGFyICopIGttYWxsb2MgKGxlbiArIDQsIEdGUF9BVE9NSUMpOworCXJidWZmID0gKHVuc2lnbmVkIGNoYXIgKikga21hbGxvYyAobGVuICsgNCwgR0ZQX0FUT01JQyk7CisjaWZkZWYgU0xfSU5DTFVERV9DU0xJUAorCWNidWZmID0gKHVuc2lnbmVkIGNoYXIgKikga21hbGxvYyAobGVuICsgNCwgR0ZQX0FUT01JQyk7CisjZW5kaWYKKworCisjaWZkZWYgU0xfSU5DTFVERV9DU0xJUAorCWlmICh4YnVmZiA9PSBOVUxMIHx8IHJidWZmID09IE5VTEwgfHwgY2J1ZmYgPT0gTlVMTCkgIHsKKyNlbHNlCisJaWYgKHhidWZmID09IE5VTEwgfHwgcmJ1ZmYgPT0gTlVMTCkgIHsKKyNlbmRpZgorCQlpZiAobXR1ID49IHNsLT5tdHUpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmFibGUgdG8gZ3JvdyBzbGlwIGJ1ZmZlcnMsIE1UVSBjaGFuZ2UgY2FuY2VsbGVkLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJZXJyID0gLUVOT0JVRlM7CisJCX0KKwkJZ290byBkb25lOworCX0KKworCXNwaW5fbG9ja19iaCgmc2wtPmxvY2spOworCisJZXJyID0gLUVOT0RFVjsKKwlpZiAoc2wtPnR0eSA9PSBOVUxMKQorCQlnb3RvIGRvbmVfb25fYmg7CisKKwl4YnVmZiAgICA9IHhjaGcoJnNsLT54YnVmZiwgeGJ1ZmYpOworCXJidWZmICAgID0geGNoZygmc2wtPnJidWZmLCByYnVmZik7CisjaWZkZWYgU0xfSU5DTFVERV9DU0xJUAorCWNidWZmICAgID0geGNoZygmc2wtPmNidWZmLCBjYnVmZik7CisjZW5kaWYKKwlpZiAoc2wtPnhsZWZ0KSAgeworCQlpZiAoc2wtPnhsZWZ0IDw9IGxlbikgIHsKKwkJCW1lbWNweShzbC0+eGJ1ZmYsIHNsLT54aGVhZCwgc2wtPnhsZWZ0KTsKKwkJfSBlbHNlICB7CisJCQlzbC0+eGxlZnQgPSAwOworCQkJc2wtPnR4X2Ryb3BwZWQrKzsKKwkJfQorCX0KKwlzbC0+eGhlYWQgPSBzbC0+eGJ1ZmY7CisKKwlpZiAoc2wtPnJjb3VudCkgIHsKKwkJaWYgKHNsLT5yY291bnQgPD0gbGVuKSB7CisJCQltZW1jcHkoc2wtPnJidWZmLCByYnVmZiwgc2wtPnJjb3VudCk7CisJCX0gZWxzZSAgeworCQkJc2wtPnJjb3VudCA9IDA7CisJCQlzbC0+cnhfb3Zlcl9lcnJvcnMrKzsKKwkJCXNldF9iaXQoU0xGX0VSUk9SLCAmc2wtPmZsYWdzKTsKKwkJfQorCX0KKwlzbC0+bXR1ICAgICAgPSBtdHU7CisJZGV2LT5tdHUgICAgICA9IG10dTsKKwlzbC0+YnVmZnNpemUgPSBsZW47CisJZXJyID0gMDsKKworZG9uZV9vbl9iaDoKKwlzcGluX3VubG9ja19iaCgmc2wtPmxvY2spOworCitkb25lOgorCWlmICh4YnVmZikKKwkJa2ZyZWUoeGJ1ZmYpOworCWlmIChyYnVmZikKKwkJa2ZyZWUocmJ1ZmYpOworI2lmZGVmIFNMX0lOQ0xVREVfQ1NMSVAKKwlpZiAoY2J1ZmYpCisJCWtmcmVlKGNidWZmKTsKKyNlbmRpZgorCXJldHVybiBlcnI7Cit9CisKKworLyogU2V0IHRoZSAic2VuZGluZyIgZmxhZy4gIFRoaXMgbXVzdCBiZSBhdG9taWMgaGVuY2UgdGhlIHNldF9iaXQuICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3NsX2xvY2soc3RydWN0IHNsaXAgKnNsKQoreworCW5ldGlmX3N0b3BfcXVldWUoc2wtPmRldik7Cit9CisKKworLyogQ2xlYXIgdGhlICJzZW5kaW5nIiBmbGFnLiAgVGhpcyBtdXN0IGJlIGF0b21pYywgaGVuY2UgdGhlIEFTTS4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc2xfdW5sb2NrKHN0cnVjdCBzbGlwICpzbCkKK3sKKwluZXRpZl93YWtlX3F1ZXVlKHNsLT5kZXYpOworfQorCisvKiBTZW5kIG9uZSBjb21wbGV0ZWx5IGRlY2Fwc3VsYXRlZCBJUCBkYXRhZ3JhbSB0byB0aGUgSVAgbGF5ZXIuICovCitzdGF0aWMgdm9pZAorc2xfYnVtcChzdHJ1Y3Qgc2xpcCAqc2wpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgY291bnQ7CisKKwljb3VudCA9IHNsLT5yY291bnQ7CisjaWZkZWYgU0xfSU5DTFVERV9DU0xJUAorCWlmIChzbC0+bW9kZSAmIChTTF9NT0RFX0FEQVBUSVZFIHwgU0xfTU9ERV9DU0xJUCkpIHsKKwkJdW5zaWduZWQgY2hhciBjOworCQlpZiAoKGMgPSBzbC0+cmJ1ZmZbMF0pICYgU0xfVFlQRV9DT01QUkVTU0VEX1RDUCkgeworCQkJLyogaWdub3JlIGNvbXByZXNzZWQgcGFja2V0cyB3aGVuIENTTElQIGlzIG9mZiAqLworCQkJaWYgKCEoc2wtPm1vZGUgJiBTTF9NT0RFX0NTTElQKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb21wcmVzc2VkIHBhY2tldCBpZ25vcmVkXG4iLCBzbC0+ZGV2LT5uYW1lKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkvKiBtYWtlIHN1cmUgd2UndmUgcmVzZXJ2ZWQgZW5vdWdoIHNwYWNlIGZvciB1bmNvbXByZXNzIHRvIHVzZSAqLworCQkJaWYgKGNvdW50ICsgODAgPiBzbC0+YnVmZnNpemUpIHsKKwkJCQlzbC0+cnhfb3Zlcl9lcnJvcnMrKzsKKwkJCQlyZXR1cm47CisJCQl9CisJCQljb3VudCA9IHNsaGNfdW5jb21wcmVzcyhzbC0+c2xjb21wLCBzbC0+cmJ1ZmYsIGNvdW50KTsKKwkJCWlmIChjb3VudCA8PSAwKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQl9IGVsc2UgaWYgKGMgPj0gU0xfVFlQRV9VTkNPTVBSRVNTRURfVENQKSB7CisJCQlpZiAoIShzbC0+bW9kZSAmIFNMX01PREVfQ1NMSVApKSB7CisJCQkJLyogdHVybiBvbiBoZWFkZXIgY29tcHJlc3Npb24gKi8KKwkJCQlzbC0+bW9kZSB8PSBTTF9NT0RFX0NTTElQOworCQkJCXNsLT5tb2RlICY9IH5TTF9NT0RFX0FEQVBUSVZFOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBoZWFkZXIgY29tcHJlc3Npb24gdHVybmVkIG9uXG4iLCBzbC0+ZGV2LT5uYW1lKTsKKwkJCX0KKwkJCXNsLT5yYnVmZlswXSAmPSAweDRmOworCQkJaWYgKHNsaGNfcmVtZW1iZXIoc2wtPnNsY29tcCwgc2wtPnJidWZmLCBjb3VudCkgPD0gMCkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAgLyogU0xfSU5DTFVERV9DU0xJUCAqLworCisJc2wtPnJ4X2J5dGVzKz1jb3VudDsKKwkKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGNvdW50KTsKKwlpZiAoc2tiID09IE5VTEwpICB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBtZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgc2wtPmRldi0+bmFtZSk7CisJCXNsLT5yeF9kcm9wcGVkKys7CisJCXJldHVybjsKKwl9CisJc2tiLT5kZXYgPSBzbC0+ZGV2OworCW1lbWNweShza2JfcHV0KHNrYixjb3VudCksIHNsLT5yYnVmZiwgY291bnQpOworCXNrYi0+bWFjLnJhdz1za2ItPmRhdGE7CisJc2tiLT5wcm90b2NvbD1odG9ucyhFVEhfUF9JUCk7CisJbmV0aWZfcngoc2tiKTsKKwlzbC0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlzbC0+cnhfcGFja2V0cysrOworfQorCisvKiBFbmNhcHN1bGF0ZSBvbmUgSVAgZGF0YWdyYW0gYW5kIHN0dWZmIGludG8gYSBUVFkgcXVldWUuICovCitzdGF0aWMgdm9pZAorc2xfZW5jYXBzKHN0cnVjdCBzbGlwICpzbCwgdW5zaWduZWQgY2hhciAqaWNwLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnA7CisJaW50IGFjdHVhbCwgY291bnQ7CisKKwlpZiAobGVuID4gc2wtPm10dSkgewkJLyogU2lnaCwgc2hvdWxkbid0IG9jY3VyIEJVVCAuLi4gKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRydW5jYXRpbmcgb3ZlcnNpemVkIHRyYW5zbWl0IHBhY2tldCFcbiIsIHNsLT5kZXYtPm5hbWUpOworCQlzbC0+dHhfZHJvcHBlZCsrOworCQlzbF91bmxvY2soc2wpOworCQlyZXR1cm47CisJfQorCisJcCA9IGljcDsKKyNpZmRlZiBTTF9JTkNMVURFX0NTTElQCisJaWYgKHNsLT5tb2RlICYgU0xfTU9ERV9DU0xJUCkgIHsKKwkJbGVuID0gc2xoY19jb21wcmVzcyhzbC0+c2xjb21wLCBwLCBsZW4sIHNsLT5jYnVmZiwgJnAsIDEpOworCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19TTElQX01PREVfU0xJUDYKKwlpZihzbC0+bW9kZSAmIFNMX01PREVfU0xJUDYpCisJCWNvdW50ID0gc2xpcF9lc2M2KHAsICh1bnNpZ25lZCBjaGFyICopIHNsLT54YnVmZiwgbGVuKTsKKwllbHNlCisjZW5kaWYKKwkJY291bnQgPSBzbGlwX2VzYyhwLCAodW5zaWduZWQgY2hhciAqKSBzbC0+eGJ1ZmYsIGxlbik7CisKKwkvKiBPcmRlciBvZiBuZXh0IHR3byBsaW5lcyBpcyAqdmVyeSogaW1wb3J0YW50LgorCSAqIFdoZW4gd2UgYXJlIHNlbmRpbmcgYSBsaXR0bGUgYW1vdW50IG9mIGRhdGEsCisJICogdGhlIHRyYW5zZmVyIG1heSBiZSBjb21wbGV0ZWQgaW5zaWRlIGRyaXZlci53cml0ZSgpCisJICogcm91dGluZSwgYmVjYXVzZSBpdCdzIHJ1bm5pbmcgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQuCisJICogSW4gdGhpcyBjYXNlIHdlICpuZXZlciogZ290IFdSSVRFX1dBS0VVUCBldmVudCwKKwkgKiBpZiB3ZSBkaWQgbm90IHJlcXVlc3QgaXQgYmVmb3JlIHdyaXRlIG9wZXJhdGlvbi4KKwkgKiAgICAgICAxNCBPY3QgMTk5NCAgRG1pdHJ5IEdvcm9kY2hhbmluLgorCSAqLworCXNsLT50dHktPmZsYWdzIHw9ICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApOworCWFjdHVhbCA9IHNsLT50dHktPmRyaXZlci0+d3JpdGUoc2wtPnR0eSwgc2wtPnhidWZmLCBjb3VudCk7CisjaWZkZWYgU0xfQ0hFQ0tfVFJBTlNNSVQKKwlzbC0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisjZW5kaWYKKwlzbC0+eGxlZnQgPSBjb3VudCAtIGFjdHVhbDsKKwlzbC0+eGhlYWQgPSBzbC0+eGJ1ZmYgKyBhY3R1YWw7CisjaWZkZWYgQ09ORklHX1NMSVBfU01BUlQKKwkvKiBWU1YgKi8KKwljbGVhcl9iaXQoU0xGX09VVFdBSVQsICZzbC0+ZmxhZ3MpOwkvKiByZXNldCBvdXRmaWxsIGZsYWcgKi8KKyNlbmRpZgorfQorCisvKgorICogQ2FsbGVkIGJ5IHRoZSBkcml2ZXIgd2hlbiB0aGVyZSdzIHJvb20gZm9yIG1vcmUgZGF0YS4gIElmIHdlIGhhdmUKKyAqIG1vcmUgcGFja2V0cyB0byBzZW5kLCB3ZSBzZW5kIHRoZW0gaGVyZS4KKyAqLworc3RhdGljIHZvaWQgc2xpcF93cml0ZV93YWtldXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpbnQgYWN0dWFsOworCXN0cnVjdCBzbGlwICpzbCA9IChzdHJ1Y3Qgc2xpcCAqKSB0dHktPmRpc2NfZGF0YTsKKworCS8qIEZpcnN0IG1ha2Ugc3VyZSB3ZSdyZSBjb25uZWN0ZWQuICovCisJaWYgKCFzbCB8fCBzbC0+bWFnaWMgIT0gU0xJUF9NQUdJQyB8fCAhbmV0aWZfcnVubmluZyhzbC0+ZGV2KSkgeworCQlyZXR1cm47CisJfQorCWlmIChzbC0+eGxlZnQgPD0gMCkgIHsKKwkJLyogTm93IHNlcmlhbCBidWZmZXIgaXMgYWxtb3N0IGZyZWUgJiB3ZSBjYW4gc3RhcnQKKwkJICogdHJhbnNtaXNzaW9uIG9mIGFub3RoZXIgcGFja2V0ICovCisJCXNsLT50eF9wYWNrZXRzKys7CisJCXR0eS0+ZmxhZ3MgJj0gfigxIDw8IFRUWV9ET19XUklURV9XQUtFVVApOworCQlzbF91bmxvY2soc2wpOworCQlyZXR1cm47CisJfQorCisJYWN0dWFsID0gdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgc2wtPnhoZWFkLCBzbC0+eGxlZnQpOworCXNsLT54bGVmdCAtPSBhY3R1YWw7CisJc2wtPnhoZWFkICs9IGFjdHVhbDsKK30KKworc3RhdGljIHZvaWQgc2xfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbGlwICpzbCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2soJnNsLT5sb2NrKTsKKworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKKwkJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCQlnb3RvIG91dDsKKworCQkvKiBNYXkgYmUgd2UgbXVzdCBjaGVjayB0cmFuc21pdHRlciB0aW1lb3V0IGhlcmUgPworCQkgKiAgICAgIDE0IE9jdCAxOTk0IERtaXRyeSBHb3JvZGNoYW5pbi4KKwkJICovCisjaWZkZWYgU0xfQ0hFQ0tfVFJBTlNNSVQKKwkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGRldi0+dHJhbnNfc3RhcnQgKyAyMCAqIEhaKSkgIHsKKwkJCS8qIDIwIHNlYyB0aW1lb3V0IG5vdCByZWFjaGVkICovCisJCQlnb3RvIG91dDsKKwkJfQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCAlcz9cbiIsIGRldi0+bmFtZSwKKwkJICAgICAgIChzbC0+dHR5LT5kcml2ZXItPmNoYXJzX2luX2J1ZmZlcihzbC0+dHR5KSB8fCBzbC0+eGxlZnQpID8KKwkJICAgICAgICJiYWQgbGluZSBxdWFsaXR5IiA6ICJkcml2ZXIgZXJyb3IiKTsKKwkJc2wtPnhsZWZ0ID0gMDsKKwkJc2wtPnR0eS0+ZmxhZ3MgJj0gfigxIDw8IFRUWV9ET19XUklURV9XQUtFVVApOworCQlzbF91bmxvY2soc2wpOworI2VuZGlmCisJfQorCitvdXQ6CisJc3Bpbl91bmxvY2soJnNsLT5sb2NrKTsKK30KKworCisvKiBFbmNhcHN1bGF0ZSBhbiBJUCBkYXRhZ3JhbSBhbmQga2ljayBpdCBpbnRvIGEgVFRZIHF1ZXVlLiAqLworc3RhdGljIGludAorc2xfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbGlwICpzbCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2soJnNsLT5sb2NrKTsKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkgIHsKKwkJc3Bpbl91bmxvY2soJnNsLT5sb2NrKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHhtaXQgY2FsbCB3aGVuIGlmYWNlIGlzIGRvd25cbiIsIGRldi0+bmFtZSk7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChzbC0+dHR5ID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2soJnNsLT5sb2NrKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzbF9sb2NrKHNsKTsKKwlzbC0+dHhfYnl0ZXMrPXNrYi0+bGVuOworCXNsX2VuY2FwcyhzbCwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJc3Bpbl91bmxvY2soJnNsLT5sb2NrKTsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIFJvdXRpbmVzIGxvb2tpbmcgYXQgbmV0ZGV2aWNlIHNpZGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBOZXRkZXZpY2UgVVAgLT4gRE9XTiByb3V0aW5lICovCisKK3N0YXRpYyBpbnQKK3NsX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNsaXAgKnNsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19iaCgmc2wtPmxvY2spOworCWlmIChzbC0+dHR5KSB7CisJCS8qIFRUWSBkaXNjaXBsaW5lIGlzIHJ1bm5pbmcuICovCisJCXNsLT50dHktPmZsYWdzICY9IH4oMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKwl9CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXNsLT5yY291bnQgICA9IDA7CisJc2wtPnhsZWZ0ICAgID0gMDsKKwlzcGluX3VubG9ja19iaCgmc2wtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE5ldGRldmljZSBET1dOIC0+IFVQIHJvdXRpbmUgKi8KKworc3RhdGljIGludCBzbF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNsaXAgKnNsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChzbC0+dHR5PT1OVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNsLT5mbGFncyAmPSAoMSA8PCBTTEZfSU5VU0UpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qIE5ldGRldmljZSBjaGFuZ2UgTVRVIHJlcXVlc3QgKi8KKworc3RhdGljIGludCBzbF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBzbGlwICpzbCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAobmV3X210dSA8IDY4IHx8IG5ld19tdHUgPiA2NTUzNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobmV3X210dSAhPSBkZXYtPm10dSkKKwkJcmV0dXJuIHNsX3JlYWxsb2NfYnVmcyhzbCwgbmV3X210dSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIE5ldGRldmljZSBnZXQgc3RhdGlzdGljcyByZXF1ZXN0ICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCitzbF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IHNsaXAgKnNsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyNpZmRlZiBTTF9JTkNMVURFX0NTTElQCisJc3RydWN0IHNsY29tcHJlc3MgKmNvbXA7CisjZW5kaWYKKworCW1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCisJc3RhdHMucnhfcGFja2V0cyAgICAgPSBzbC0+cnhfcGFja2V0czsKKwlzdGF0cy50eF9wYWNrZXRzICAgICA9IHNsLT50eF9wYWNrZXRzOworCXN0YXRzLnJ4X2J5dGVzCSAgICAgPSBzbC0+cnhfYnl0ZXM7CisJc3RhdHMudHhfYnl0ZXMJICAgICA9IHNsLT50eF9ieXRlczsKKwlzdGF0cy5yeF9kcm9wcGVkICAgICA9IHNsLT5yeF9kcm9wcGVkOworCXN0YXRzLnR4X2Ryb3BwZWQgICAgID0gc2wtPnR4X2Ryb3BwZWQ7CisJc3RhdHMudHhfZXJyb3JzICAgICAgPSBzbC0+dHhfZXJyb3JzOworCXN0YXRzLnJ4X2Vycm9ycyAgICAgID0gc2wtPnJ4X2Vycm9yczsKKwlzdGF0cy5yeF9vdmVyX2Vycm9ycyA9IHNsLT5yeF9vdmVyX2Vycm9yczsKKyNpZmRlZiBTTF9JTkNMVURFX0NTTElQCisJc3RhdHMucnhfZmlmb19lcnJvcnMgPSBzbC0+cnhfY29tcHJlc3NlZDsKKwlzdGF0cy50eF9maWZvX2Vycm9ycyA9IHNsLT50eF9jb21wcmVzc2VkOworCXN0YXRzLmNvbGxpc2lvbnMgICAgID0gc2wtPnR4X21pc3NlczsKKwljb21wID0gc2wtPnNsY29tcDsKKwlpZiAoY29tcCkgeworCQlzdGF0cy5yeF9maWZvX2Vycm9ycyArPSBjb21wLT5zbHNfaV9jb21wcmVzc2VkOworCQlzdGF0cy5yeF9kcm9wcGVkICAgICArPSBjb21wLT5zbHNfaV90b3NzZWQ7CisJCXN0YXRzLnR4X2ZpZm9fZXJyb3JzICs9IGNvbXAtPnNsc19vX2NvbXByZXNzZWQ7CisJCXN0YXRzLmNvbGxpc2lvbnMgICAgICs9IGNvbXAtPnNsc19vX21pc3NlczsKKwl9CisjZW5kaWYgLyogQ09ORklHX0lORVQgKi8KKwlyZXR1cm4gKCZzdGF0cyk7Cit9CisKKy8qIE5ldGRldmljZSByZWdpc3RlciBjYWxsYmFjayAqLworCitzdGF0aWMgaW50IHNsX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2xpcCAqc2wgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyoKKwkgKglGaW5pc2ggc2V0dGluZyB1cCB0aGUgREVWSUNFIGluZm8uIAorCSAqLworCisJZGV2LT5tdHUJCT0gc2wtPm10dTsKKwlkZXYtPnR5cGUJCT0gQVJQSFJEX1NMSVAgKyBzbC0+bW9kZTsKKyNpZmRlZiBTTF9DSEVDS19UUkFOU01JVAorCWRldi0+dHhfdGltZW91dAkJPSBzbF90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSAyMCpIWjsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHNsX3VuaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbGlwICpzbCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzbF9mcmVlX2J1ZnMoc2wpOworfQorCitzdGF0aWMgdm9pZCBzbF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRldi0+aW5pdAkJPSBzbF9pbml0OworCWRldi0+dW5pbml0CSAgCT0gc2xfdW5pbml0OworCWRldi0+b3BlbgkJPSBzbF9vcGVuOworCWRldi0+ZGVzdHJ1Y3RvcgkJPSBmcmVlX25ldGRldjsKKwlkZXYtPnN0b3AJCT0gc2xfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMJICAgICAgICA9IHNsX2dldF9zdGF0czsKKwlkZXYtPmNoYW5nZV9tdHUJCT0gc2xfY2hhbmdlX210dTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHNsX3htaXQ7CisjaWZkZWYgQ09ORklHX1NMSVBfU01BUlQKKwlkZXYtPmRvX2lvY3RsCQk9IHNsX2lvY3RsOworI2VuZGlmCisJZGV2LT5oYXJkX2hlYWRlcl9sZW4JPSAwOworCWRldi0+YWRkcl9sZW4JCT0gMDsKKwlkZXYtPnR4X3F1ZXVlX2xlbgk9IDEwOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJLyogTmV3LXN0eWxlIGZsYWdzLiAqLworCWRldi0+ZmxhZ3MJCT0gSUZGX05PQVJQfElGRl9QT0lOVE9QT0lOVHxJRkZfTVVMVElDQVNUOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIFJvdXRpbmVzIGxvb2tpbmcgYXQgVFRZIHNpZGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyBpbnQgc2xpcF9yZWNlaXZlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlyZXR1cm4gNjU1MzY7ICAvKiBXZSBjYW4gaGFuZGxlIGFuIGluZmluaXRlIGFtb3VudCBvZiBkYXRhLiA6LSkgKi8KK30KKworLyoKKyAqIEhhbmRsZSB0aGUgJ3JlY2VpdmVyIGRhdGEgcmVhZHknIGludGVycnVwdC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSAndHR5X2lvJyBtb2R1bGUgaW4gdGhlIGtlcm5lbCB3aGVuCisgKiBhIGJsb2NrIG9mIFNMSVAgZGF0YSBoYXMgYmVlbiByZWNlaXZlZCwgd2hpY2ggY2FuIG5vdyBiZSBkZWNhcHN1bGF0ZWQKKyAqIGFuZCBzZW50IG9uIHRvIHNvbWUgSVAgbGF5ZXIgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gVGhpcyB3aWxsIG5vdAorICogYmUgcmUtZW50ZXJlZCB3aGlsZSBydW5uaW5nIGJ1dCBvdGhlciBsZGlzYyBmdW5jdGlvbnMgbWF5IGJlIGNhbGxlZAorICogaW4gcGFyYWxsZWwKKyAqLworIAorc3RhdGljIHZvaWQgc2xpcF9yZWNlaXZlX2J1ZihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjcCwgY2hhciAqZnAsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2xpcCAqc2wgPSAoc3RydWN0IHNsaXAgKikgdHR5LT5kaXNjX2RhdGE7CisKKwlpZiAoIXNsIHx8IHNsLT5tYWdpYyAhPSBTTElQX01BR0lDIHx8CisJICAgICFuZXRpZl9ydW5uaW5nKHNsLT5kZXYpKQorCQlyZXR1cm47CisKKwkvKiBSZWFkIHRoZSBjaGFyYWN0ZXJzIG91dCBvZiB0aGUgYnVmZmVyICovCisJd2hpbGUgKGNvdW50LS0pIHsKKwkJaWYgKGZwICYmICpmcCsrKSB7CisJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoU0xGX0VSUk9SLCAmc2wtPmZsYWdzKSkgIHsKKwkJCQlzbC0+cnhfZXJyb3JzKys7CisJCQl9CisJCQljcCsrOworCQkJY29udGludWU7CisJCX0KKyNpZmRlZiBDT05GSUdfU0xJUF9NT0RFX1NMSVA2CisJCWlmIChzbC0+bW9kZSAmIFNMX01PREVfU0xJUDYpCisJCQlzbGlwX3VuZXNjNihzbCwgKmNwKyspOworCQllbHNlCisjZW5kaWYKKwkJCXNsaXBfdW5lc2Moc2wsICpjcCsrKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBzbGlwX29wZW4gaGVscGVyIHJvdXRpbmVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29sbGVjdCBoYW5nZWQgdXAgY2hhbm5lbHMgKi8KKworc3RhdGljIHZvaWQgc2xfc3luYyh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHNsaXAJICAqc2w7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2xpcF9tYXhkZXY7IGkrKykgeworCQlpZiAoKGRldiA9IHNsaXBfZGV2c1tpXSkgPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCXNsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJaWYgKHNsLT50dHkgfHwgc2wtPmxlYXNlZCkKKwkJCWNvbnRpbnVlOworCQlpZiAoZGV2LT5mbGFncyZJRkZfVVApCisJCQlkZXZfY2xvc2UoZGV2KTsKKwl9Cit9CisKKworLyogRmluZCBhIGZyZWUgU0xJUCBjaGFubmVsLCBhbmQgbGluayBpbiB0aGlzIGB0dHknIGxpbmUuICovCitzdGF0aWMgc3RydWN0IHNsaXAgKgorc2xfYWxsb2MoZGV2X3QgbGluZSkKK3sKKwlpbnQgaTsKKwlpbnQgc2VsID0gLTE7CisJaW50IHNjb3JlID0gLTE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IHNsaXAgICAgICAgKnNsOworCisJaWYgKHNsaXBfZGV2cyA9PSBOVUxMKSAKKwkJcmV0dXJuIE5VTEw7CS8qIE1hc3RlciBhcnJheSBtaXNzaW5nICEgKi8KKworCWZvciAoaSA9IDA7IGkgPCBzbGlwX21heGRldjsgaSsrKSB7CisJCWRldiA9IHNsaXBfZGV2c1tpXTsKKwkJaWYgKGRldiA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJc2wgPSBuZXRkZXZfcHJpdihkZXYpOworCQlpZiAoc2wtPmxlYXNlZCkgeworCQkJaWYgKHNsLT5saW5lICE9IGxpbmUpCisJCQkJY29udGludWU7CisJCQlpZiAoc2wtPnR0eSkKKwkJCQlyZXR1cm4gTlVMTDsKKworCQkJLyogQ2xlYXIgRVNDQVBFICYgRVJST1IgZmxhZ3MgKi8KKwkJCXNsLT5mbGFncyAmPSAoMSA8PCBTTEZfSU5VU0UpOworCQkJcmV0dXJuIHNsOworCQl9CisKKwkJaWYgKHNsLT50dHkpCisJCQljb250aW51ZTsKKworCQlpZiAoY3VycmVudC0+cGlkID09IHNsLT5waWQpIHsKKwkJCWlmIChzbC0+bGluZSA9PSBsaW5lICYmIHNjb3JlIDwgMykgeworCQkJCXNlbCA9IGk7CisJCQkJc2NvcmUgPSAzOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHNjb3JlIDwgMikgeworCQkJCXNlbCA9IGk7CisJCQkJc2NvcmUgPSAyOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKHNsLT5saW5lID09IGxpbmUgJiYgc2NvcmUgPCAxKSB7CisJCQlzZWwgPSBpOworCQkJc2NvcmUgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHNjb3JlIDwgMCkgeworCQkJc2VsID0gaTsKKwkJCXNjb3JlID0gMDsKKwkJfQorCX0KKworCWlmIChzZWwgPj0gMCkgeworCQlpID0gc2VsOworCQlkZXYgPSBzbGlwX2RldnNbaV07CisJCWlmIChzY29yZSA+IDEpIHsKKwkJCXNsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJCXNsLT5mbGFncyAmPSAoMSA8PCBTTEZfSU5VU0UpOworCQkJcmV0dXJuIHNsOworCQl9CisJfQorCisJLyogU29ycnksIHRvbyBtYW55LCBhbGwgc2xvdHMgaW4gdXNlICovCisJaWYgKGkgPj0gc2xpcF9tYXhkZXYpCisJCXJldHVybiBOVUxMOworCisJaWYgKGRldikgeworCQlzbCA9IG5ldGRldl9wcml2KGRldik7CisJCWlmICh0ZXN0X2JpdChTTEZfSU5VU0UsICZzbC0+ZmxhZ3MpKSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldmljZShkZXYpOworCQkJZGV2ID0gTlVMTDsKKwkJCXNsaXBfZGV2c1tpXSA9IE5VTEw7CisJCX0KKwl9CisJCisJaWYgKCFkZXYpIHsKKwkJY2hhciBuYW1lW0lGTkFNU0laXTsKKwkJc3ByaW50ZihuYW1lLCAic2wlZCIsIGkpOworCisJCWRldiA9IGFsbG9jX25ldGRldihzaXplb2YoKnNsKSwgbmFtZSwgc2xfc2V0dXApOworCQlpZiAoIWRldikKKwkJCXJldHVybiBOVUxMOworCQlkZXYtPmJhc2VfYWRkciAgPSBpOworCX0KKworCXNsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIEluaXRpYWxpemUgY2hhbm5lbCBjb250cm9sIGRhdGEgKi8KKwlzbC0+bWFnaWMgICAgICAgPSBTTElQX01BR0lDOworCXNsLT5kZXYJICAgICAgCT0gZGV2OworCXNwaW5fbG9ja19pbml0KCZzbC0+bG9jayk7CisJc2wtPm1vZGUgICAgICAgID0gU0xfTU9ERV9ERUZBVUxUOworI2lmZGVmIENPTkZJR19TTElQX1NNQVJUCisJaW5pdF90aW1lcigmc2wtPmtlZXBhbGl2ZV90aW1lcik7CS8qIGluaXRpYWxpemUgdGltZXJfbGlzdCBzdHJ1Y3QgKi8KKwlzbC0+a2VlcGFsaXZlX3RpbWVyLmRhdGE9KHVuc2lnbmVkIGxvbmcpc2w7CisJc2wtPmtlZXBhbGl2ZV90aW1lci5mdW5jdGlvbj1zbF9rZWVwYWxpdmU7CisJaW5pdF90aW1lcigmc2wtPm91dGZpbGxfdGltZXIpOworCXNsLT5vdXRmaWxsX3RpbWVyLmRhdGE9KHVuc2lnbmVkIGxvbmcpc2w7CisJc2wtPm91dGZpbGxfdGltZXIuZnVuY3Rpb249c2xfb3V0ZmlsbDsKKyNlbmRpZgorCXNsaXBfZGV2c1tpXSA9IGRldjsKKwkJCQkgICAKKwlyZXR1cm4gc2w7Cit9CisKKy8qCisgKiBPcGVuIHRoZSBoaWdoLWxldmVsIHBhcnQgb2YgdGhlIFNMSVAgY2hhbm5lbC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBUVFkgbW9kdWxlIHdoZW4gdGhlCisgKiBTTElQIGxpbmUgZGlzY2lwbGluZSBpcyBjYWxsZWQgZm9yLiAgQmVjYXVzZSB3ZSBhcmUKKyAqIHN1cmUgdGhlIHR0eSBsaW5lIGV4aXN0cywgd2Ugb25seSBoYXZlIHRvIGxpbmsgaXQgdG8KKyAqIGEgZnJlZSBTTElQIGNoYW5uZWwuLi4KKyAqCisgKiBDYWxsZWQgaW4gcHJvY2VzcyBjb250ZXh0IHNlcmlhbGl6ZWQgZnJvbSBvdGhlciBsZGlzYyBjYWxscy4KKyAqLworCitzdGF0aWMgaW50IHNsaXBfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzbGlwICpzbDsKKwlpbnQgZXJyOworCisJaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJCQorCS8qIFJUbmV0bGluayBsb2NrIGlzIG1pc3VzZWQgaGVyZSB0byBzZXJpYWxpemUgY29uY3VycmVudAorCSAgIG9wZW5zIG9mIHNsaXAgY2hhbm5lbHMuIFRoZXJlIGFyZSBiZXR0ZXIgd2F5cywgYnV0IGl0IGlzCisJICAgdGhlIHNpbXBsZXN0IG9uZS4KKwkgKi8KKwlydG5sX2xvY2soKTsKKworCS8qIENvbGxlY3QgaGFuZ2VkIHVwIGNoYW5uZWxzLiAqLworCXNsX3N5bmMoKTsKKworCXNsID0gKHN0cnVjdCBzbGlwICopIHR0eS0+ZGlzY19kYXRhOworCisJZXJyID0gLUVFWElTVDsKKwkvKiBGaXJzdCBtYWtlIHN1cmUgd2UncmUgbm90IGFscmVhZHkgY29ubmVjdGVkLiAqLworCWlmIChzbCAmJiBzbC0+bWFnaWMgPT0gU0xJUF9NQUdJQykKKwkJZ290byBlcnJfZXhpdDsKKworCS8qIE9LLiAgRmluZCBhIGZyZWUgU0xJUCBjaGFubmVsIHRvIHVzZS4gKi8KKwllcnIgPSAtRU5GSUxFOworCWlmICgoc2wgPSBzbF9hbGxvYyh0dHlfZGV2bnVtKHR0eSkpKSA9PSBOVUxMKQorCQlnb3RvIGVycl9leGl0OworCisJc2wtPnR0eSA9IHR0eTsKKwl0dHktPmRpc2NfZGF0YSA9IHNsOworCXNsLT5saW5lID0gdHR5X2Rldm51bSh0dHkpOworCXNsLT5waWQgPSBjdXJyZW50LT5waWQ7CisJCisJLyogRklYTUU6IGFscmVhZHkgZG9uZSBiZWZvcmUgd2Ugd2VyZSBjYWxsZWQgLSBzZWVtcyB0aGlzIGNhbiBnbyAqLworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJCQorCWlmICghdGVzdF9iaXQoU0xGX0lOVVNFLCAmc2wtPmZsYWdzKSkgeworCQkvKiBQZXJmb3JtIHRoZSBsb3ctbGV2ZWwgU0xJUCBpbml0aWFsaXphdGlvbi4gKi8KKwkJaWYgKChlcnIgPSBzbF9hbGxvY19idWZzKHNsLCBTTF9NVFUpKSAhPSAwKQorCQkJZ290byBlcnJfZnJlZV9jaGFuOworCisJCXNldF9iaXQoU0xGX0lOVVNFLCAmc2wtPmZsYWdzKTsKKworCQlpZiAoKGVyciA9IHJlZ2lzdGVyX25ldGRldmljZShzbC0+ZGV2KSkpCisJCQlnb3RvIGVycl9mcmVlX2J1ZnM7CisJfQorCisjaWZkZWYgQ09ORklHX1NMSVBfU01BUlQKKwlpZiAoc2wtPmtlZXBhbGl2ZSkgeworCQlzbC0+a2VlcGFsaXZlX3RpbWVyLmV4cGlyZXM9amlmZmllcytzbC0+a2VlcGFsaXZlKkhaOworCQlhZGRfdGltZXIgKCZzbC0+a2VlcGFsaXZlX3RpbWVyKTsKKwl9CisJaWYgKHNsLT5vdXRmaWxsKSB7CisJCXNsLT5vdXRmaWxsX3RpbWVyLmV4cGlyZXM9amlmZmllcytzbC0+b3V0ZmlsbCpIWjsKKwkJYWRkX3RpbWVyICgmc2wtPm91dGZpbGxfdGltZXIpOworCX0KKyNlbmRpZgorCisJLyogRG9uZS4gIFdlIGhhdmUgbGlua2VkIHRoZSBUVFkgbGluZSB0byBhIGNoYW5uZWwuICovCisJcnRubF91bmxvY2soKTsKKwlyZXR1cm4gc2wtPmRldi0+YmFzZV9hZGRyOworCitlcnJfZnJlZV9idWZzOgorCXNsX2ZyZWVfYnVmcyhzbCk7CisKK2Vycl9mcmVlX2NoYW46CisJc2wtPnR0eSA9IE5VTEw7CisJdHR5LT5kaXNjX2RhdGEgPSBOVUxMOworCWNsZWFyX2JpdChTTEZfSU5VU0UsICZzbC0+ZmxhZ3MpOworCitlcnJfZXhpdDoKKwlydG5sX3VubG9jaygpOworCisJLyogQ291bnQgcmVmZXJlbmNlcyBmcm9tIFRUWSBtb2R1bGUgKi8KKwlyZXR1cm4gZXJyOworfQorCisvKgorCisgIEZJWE1FOiAxLDIgYXJlIGZpeGVkIDMgd2FzIG5ldmVyIHRydWUgYW55d2F5LgorICAKKyAgIExldCBtZSB0byBibGFtZSBhIGJpdC4KKyAgIDEuIFRUWSBtb2R1bGUgY2FsbHMgdGhpcyBmdW5zdGlvbiBvbiBzb2Z0IGludGVycnVwdC4KKyAgIDIuIFRUWSBtb2R1bGUgY2FsbHMgdGhpcyBmdW5jdGlvbiBXSVRIIE1BU0tFRCBJTlRFUlJVUFRTIQorICAgMy4gVFRZIG1vZHVsZSBkb2VzIG5vdCBub3RpZnkgdXMgYWJvdXQgbGluZSBkaXNjaXBsaW5lCisgICAgICBzaHV0ZG93biwKKworICAgU2VlbXMsIG5vdyBpdCBpcyBjbGVhbi4gVGhlIHNvbHV0aW9uIGlzIHRvIGNvbnNpZGVyIG5ldGRldmljZSBhbmQKKyAgIGxpbmUgZGlzY2lwbGluZSBzaWRlcyBhcyB0d28gaW5kZXBlbmRlbnQgdGhyZWFkcy4KKworICAgQnktcHJvZHVjdCAobm90IGRlc2lyZWQpOiBzbD8gZG9lcyBub3QgZmVlbCBoYW5ndXBzIGFuZCByZW1haW5zIG9wZW4uCisgICBJdCBpcyBzdXBwb3NlZCwgdGhhdCB1c2VyIGxldmVsIHByb2dyYW0gKGRpcCwgZGlhbGQsIHNsYXR0YWNoLi4uKQorICAgd2lsbCBjYXRjaCBTSUdIVVAgYW5kIG1ha2UgdGhlIHJlc3Qgb2Ygd29yay4gCisKKyAgIEkgc2VlIG5vIHdheSB0byBtYWtlIG1vcmUgd2l0aCBjdXJyZW50IHR0eSBjb2RlLiAtLUFOSworICovCisKKy8qCisgKiBDbG9zZSBkb3duIGEgU0xJUCBjaGFubmVsLgorICogVGhpcyBtZWFucyBmbHVzaGluZyBvdXQgYW55IHBlbmRpbmcgcXVldWVzLCBhbmQgdGhlbiByZXR1cm5pbmcuIFRoaXMKKyAqIGNhbGwgaXMgc2VyaWFsaXplZCBhZ2FpbnN0IG90aGVyIGxkaXNjIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIHZvaWQKK3NsaXBfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgc2xpcCAqc2wgPSAoc3RydWN0IHNsaXAgKikgdHR5LT5kaXNjX2RhdGE7CisKKwkvKiBGaXJzdCBtYWtlIHN1cmUgd2UncmUgY29ubmVjdGVkLiAqLworCWlmICghc2wgfHwgc2wtPm1hZ2ljICE9IFNMSVBfTUFHSUMgfHwgc2wtPnR0eSAhPSB0dHkpCisJCXJldHVybjsKKworCXR0eS0+ZGlzY19kYXRhID0gTlVMTDsKKwlzbC0+dHR5ID0gTlVMTDsKKwlpZiAoIXNsLT5sZWFzZWQpCisJCXNsLT5saW5lID0gMDsKKworCS8qIFZTViA9IHZlcnkgaW1wb3J0YW50IHRvIHJlbW92ZSB0aW1lcnMgKi8KKyNpZmRlZiBDT05GSUdfU0xJUF9TTUFSVAorCWRlbF90aW1lcl9zeW5jKCZzbC0+a2VlcGFsaXZlX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmc2wtPm91dGZpbGxfdGltZXIpOworI2VuZGlmCisKKwkvKiBDb3VudCByZWZlcmVuY2VzIGZyb20gVFRZIG1vZHVsZSAqLworfQorCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAqCQkJU1RBTkRBUkQgU0xJUCBFTkNBUFNVTEFUSU9OCQkgIAkgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludAorc2xpcF9lc2ModW5zaWduZWQgY2hhciAqcywgdW5zaWduZWQgY2hhciAqZCwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpwdHIgPSBkOworCXVuc2lnbmVkIGNoYXIgYzsKKworCS8qCisJICogU2VuZCBhbiBpbml0aWFsIEVORCBjaGFyYWN0ZXIgdG8gZmx1c2ggb3V0IGFueQorCSAqIGRhdGEgdGhhdCBtYXkgaGF2ZSBhY2N1bXVsYXRlZCBpbiB0aGUgcmVjZWl2ZXIKKwkgKiBkdWUgdG8gbGluZSBub2lzZS4KKwkgKi8KKworCSpwdHIrKyA9IEVORDsKKworCS8qCisJICogRm9yIGVhY2ggYnl0ZSBpbiB0aGUgcGFja2V0LCBzZW5kIHRoZSBhcHByb3ByaWF0ZQorCSAqIGNoYXJhY3RlciBzZXF1ZW5jZSwgYWNjb3JkaW5nIHRvIHRoZSBTTElQIHByb3RvY29sLgorCSAqLworCisJd2hpbGUgKGxlbi0tID4gMCkgeworCQlzd2l0Y2goYyA9ICpzKyspIHsKKwkJIGNhc2UgRU5EOgorCQkJKnB0cisrID0gRVNDOworCQkJKnB0cisrID0gRVNDX0VORDsKKwkJCWJyZWFrOworCQkgY2FzZSBFU0M6CisJCQkqcHRyKysgPSBFU0M7CisJCQkqcHRyKysgPSBFU0NfRVNDOworCQkJYnJlYWs7CisJCSBkZWZhdWx0OgorCQkJKnB0cisrID0gYzsKKwkJCWJyZWFrOworCQl9CisJfQorCSpwdHIrKyA9IEVORDsKKwlyZXR1cm4gKHB0ciAtIGQpOworfQorCitzdGF0aWMgdm9pZCBzbGlwX3VuZXNjKHN0cnVjdCBzbGlwICpzbCwgdW5zaWduZWQgY2hhciBzKQoreworCisJc3dpdGNoKHMpIHsKKwkgY2FzZSBFTkQ6CisjaWZkZWYgQ09ORklHX1NMSVBfU01BUlQKKwkJLyogZHJvcCBrZWVwdGVzdCBiaXQgPSBWU1YgKi8KKwkJaWYgKHRlc3RfYml0KFNMRl9LRUVQVEVTVCwgJnNsLT5mbGFncykpCisJCQljbGVhcl9iaXQoU0xGX0tFRVBURVNULCAmc2wtPmZsYWdzKTsKKyNlbmRpZgorCisJCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KFNMRl9FUlJPUiwgJnNsLT5mbGFncykgJiYgKHNsLT5yY291bnQgPiAyKSkgIHsKKwkJCXNsX2J1bXAoc2wpOworCQl9CisJCWNsZWFyX2JpdChTTEZfRVNDQVBFLCAmc2wtPmZsYWdzKTsKKwkJc2wtPnJjb3VudCA9IDA7CisJCXJldHVybjsKKworCSBjYXNlIEVTQzoKKwkJc2V0X2JpdChTTEZfRVNDQVBFLCAmc2wtPmZsYWdzKTsKKwkJcmV0dXJuOworCSBjYXNlIEVTQ19FU0M6CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU0xGX0VTQ0FQRSwgJnNsLT5mbGFncykpICB7CisJCQlzID0gRVNDOworCQl9CisJCWJyZWFrOworCSBjYXNlIEVTQ19FTkQ6CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU0xGX0VTQ0FQRSwgJnNsLT5mbGFncykpICB7CisJCQlzID0gRU5EOworCQl9CisJCWJyZWFrOworCX0KKwlpZiAoIXRlc3RfYml0KFNMRl9FUlJPUiwgJnNsLT5mbGFncykpICB7CisJCWlmIChzbC0+cmNvdW50IDwgc2wtPmJ1ZmZzaXplKSAgeworCQkJc2wtPnJidWZmW3NsLT5yY291bnQrK10gPSBzOworCQkJcmV0dXJuOworCQl9CisJCXNsLT5yeF9vdmVyX2Vycm9ycysrOworCQlzZXRfYml0KFNMRl9FUlJPUiwgJnNsLT5mbGFncyk7CisJfQorfQorCisKKyNpZmRlZiBDT05GSUdfU0xJUF9NT0RFX1NMSVA2CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCSA2IEJJVCBTTElQIEVOQ0FQU1VMQVRJT04JCQkqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQKK3NsaXBfZXNjNih1bnNpZ25lZCBjaGFyICpzLCB1bnNpZ25lZCBjaGFyICpkLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnB0ciA9IGQ7CisJdW5zaWduZWQgY2hhciBjOworCWludCBpOworCXVuc2lnbmVkIHNob3J0IHYgPSAwOworCXNob3J0IGJpdHMgPSAwOworCisJLyoKKwkgKiBTZW5kIGFuIGluaXRpYWwgRU5EIGNoYXJhY3RlciB0byBmbHVzaCBvdXQgYW55CisJICogZGF0YSB0aGF0IG1heSBoYXZlIGFjY3VtdWxhdGVkIGluIHRoZSByZWNlaXZlcgorCSAqIGR1ZSB0byBsaW5lIG5vaXNlLgorCSAqLworCisJKnB0cisrID0gMHg3MDsKKworCS8qCisJICogRW5jb2RlIHRoZSBwYWNrZXQgaW50byBwcmludGFibGUgYXNjaWkgY2hhcmFjdGVycworCSAqLworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisJCXYgPSAodiA8PCA4KSB8IHNbaV07CisJCWJpdHMgKz0gODsKKwkJd2hpbGUgKGJpdHMgPj0gNikgeworCQkJYml0cyAtPSA2OworCQkJYyA9IDB4MzAgKyAoKHYgPj4gYml0cykgJiAweDNGKTsKKwkJCSpwdHIrKyA9IGM7CisJCX0KKwl9CisJaWYgKGJpdHMpIHsKKwkJYyA9IDB4MzAgKyAoKHYgPDwgKDYgLSBiaXRzKSkgJiAweDNGKTsKKwkJKnB0cisrID0gYzsKKwl9CisJKnB0cisrID0gMHg3MDsKKwlyZXR1cm4gcHRyIC0gZDsKK30KKwordm9pZAorc2xpcF91bmVzYzYoc3RydWN0IHNsaXAgKnNsLCB1bnNpZ25lZCBjaGFyIHMpCit7CisJdW5zaWduZWQgY2hhciBjOworCisJaWYgKHMgPT0gMHg3MCkgeworI2lmZGVmIENPTkZJR19TTElQX1NNQVJUCisJCS8qIGRyb3Aga2VlcHRlc3QgYml0ID0gVlNWICovCisJCWlmICh0ZXN0X2JpdChTTEZfS0VFUFRFU1QsICZzbC0+ZmxhZ3MpKQorCQkJY2xlYXJfYml0KFNMRl9LRUVQVEVTVCwgJnNsLT5mbGFncyk7CisjZW5kaWYKKworCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChTTEZfRVJST1IsICZzbC0+ZmxhZ3MpICYmIChzbC0+cmNvdW50ID4gMikpICB7CisJCQlzbF9idW1wKHNsKTsKKwkJfQorCQlzbC0+cmNvdW50ID0gMDsKKwkJc2wtPnhiaXRzID0gMDsKKwkJc2wtPnhkYXRhID0gMDsKKyAJfSBlbHNlIGlmIChzID49IDB4MzAgJiYgcyA8IDB4NzApIHsKKwkJc2wtPnhkYXRhID0gKHNsLT54ZGF0YSA8PCA2KSB8ICgocyAtIDB4MzApICYgMHgzRik7CisJCXNsLT54Yml0cyArPSA2OworCQlpZiAoc2wtPnhiaXRzID49IDgpIHsKKwkJCXNsLT54Yml0cyAtPSA4OworCQkJYyA9ICh1bnNpZ25lZCBjaGFyKShzbC0+eGRhdGEgPj4gc2wtPnhiaXRzKTsKKwkJCWlmICghdGVzdF9iaXQoU0xGX0VSUk9SLCAmc2wtPmZsYWdzKSkgIHsKKwkJCQlpZiAoc2wtPnJjb3VudCA8IHNsLT5idWZmc2l6ZSkgIHsKKwkJCQkJc2wtPnJidWZmW3NsLT5yY291bnQrK10gPSBjOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCXNsLT5yeF9vdmVyX2Vycm9ycysrOworCQkJCXNldF9iaXQoU0xGX0VSUk9SLCAmc2wtPmZsYWdzKTsKKwkJCX0KKwkJfQorIAl9Cit9CisjZW5kaWYgLyogQ09ORklHX1NMSVBfTU9ERV9TTElQNiAqLworCisvKiBQZXJmb3JtIEkvTyBjb250cm9sIG9uIGFuIGFjdGl2ZSBTTElQIGNoYW5uZWwuICovCitzdGF0aWMgaW50IHNsaXBfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzbGlwICpzbCA9IChzdHJ1Y3Qgc2xpcCAqKSB0dHktPmRpc2NfZGF0YTsKKwl1bnNpZ25lZCBpbnQgdG1wOworCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKKworCS8qIEZpcnN0IG1ha2Ugc3VyZSB3ZSdyZSBjb25uZWN0ZWQuICovCisJaWYgKCFzbCB8fCBzbC0+bWFnaWMgIT0gU0xJUF9NQUdJQykgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2goY21kKSB7CisJIGNhc2UgU0lPQ0dJRk5BTUU6CisJCXRtcCA9IHN0cmxlbihzbC0+ZGV2LT5uYW1lKSArIDE7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCBzbC0+ZGV2LT5uYW1lLCB0bXApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBTSU9DR0lGRU5DQVA6CisJCWlmIChwdXRfdXNlcihzbC0+bW9kZSwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNJT0NTSUZFTkNBUDoKKwkJaWYgKGdldF91c2VyKHRtcCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKyNpZm5kZWYgU0xfSU5DTFVERV9DU0xJUAorCQlpZiAodG1wICYgKFNMX01PREVfQ1NMSVB8U0xfTU9ERV9BREFQVElWRSkpICB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorI2Vsc2UKKwkJaWYgKCh0bXAgJiAoU0xfTU9ERV9BREFQVElWRSB8IFNMX01PREVfQ1NMSVApKSA9PQorCQkgICAgKFNMX01PREVfQURBUFRJVkUgfCBTTF9NT0RFX0NTTElQKSkgIHsKKwkJCS8qIHJldHVybiAtRUlOVkFMOyAqLworCQkJdG1wICY9IH5TTF9NT0RFX0FEQVBUSVZFOworCQl9CisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX1NMSVBfTU9ERV9TTElQNgorCQlpZiAodG1wICYgU0xfTU9ERV9TTElQNikgIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisjZW5kaWYKKwkJc2wtPm1vZGUgPSB0bXA7CisJCXNsLT5kZXYtPnR5cGUgPSBBUlBIUkRfU0xJUCtzbC0+bW9kZTsKKwkJcmV0dXJuIDA7CisKKwkgY2FzZSBTSU9DU0lGSFdBRERSOgorCQlyZXR1cm4gLUVJTlZBTDsKKworI2lmZGVmIENPTkZJR19TTElQX1NNQVJUCisJLyogVlNWIGNoYW5nZXMgc3RhcnQgaGVyZSAqLworICAgICAgICBjYXNlIFNJT0NTS0VFUEFMSVZFOgorCQlpZiAoZ2V0X3VzZXIodG1wLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgICAgIGlmICh0bXAgPiAyNTUpIC8qIG1heCBmb3IgdW5jaGFyICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzcGluX2xvY2tfYmgoJnNsLT5sb2NrKTsKKwkJaWYgKCFzbC0+dHR5KSB7CisJCQlzcGluX3VubG9ja19iaCgmc2wtPmxvY2spOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJaWYgKChzbC0+a2VlcGFsaXZlID0gKHVuY2hhcikgdG1wKSAhPSAwKSB7CisJCQltb2RfdGltZXIoJnNsLT5rZWVwYWxpdmVfdGltZXIsIGppZmZpZXMrc2wtPmtlZXBhbGl2ZSpIWik7CisJCQlzZXRfYml0KFNMRl9LRUVQVEVTVCwgJnNsLT5mbGFncyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbF90aW1lciAoJnNsLT5rZWVwYWxpdmVfdGltZXIpOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZzbC0+bG9jayk7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU0lPQ0dLRUVQQUxJVkU6CisJCWlmIChwdXRfdXNlcihzbC0+a2VlcGFsaXZlLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNJT0NTT1VURklMTDoKKwkJaWYgKGdldF91c2VyKHRtcCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgICAgICAgICBpZiAodG1wID4gMjU1KSAvKiBtYXggZm9yIHVuY2hhciAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNwaW5fbG9ja19iaCgmc2wtPmxvY2spOworCQlpZiAoIXNsLT50dHkpIHsKKwkJCXNwaW5fdW5sb2NrX2JoKCZzbC0+bG9jayk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorICAgICAgICAgICAgICAgIGlmICgoc2wtPm91dGZpbGwgPSAodW5jaGFyKSB0bXApICE9IDApeworCQkJbW9kX3RpbWVyKCZzbC0+b3V0ZmlsbF90aW1lciwgamlmZmllcytzbC0+b3V0ZmlsbCpIWik7CisJCQlzZXRfYml0KFNMRl9PVVRXQUlULCAmc2wtPmZsYWdzKTsKKwkJfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbF90aW1lciAoJnNsLT5vdXRmaWxsX3RpbWVyKTsKKwkJfQorCQlzcGluX3VubG9ja19iaCgmc2wtPmxvY2spOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGNhc2UgU0lPQ0dPVVRGSUxMOgorCQlpZiAocHV0X3VzZXIoc2wtPm91dGZpbGwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCS8qIFZTViBjaGFuZ2VzIGVuZCAqLworI2VuZGlmCisKKwkvKiBBbGxvdyBzdHR5IHRvIHJlYWQsIGJ1dCBub3Qgc2V0LCB0aGUgc2VyaWFsIHBvcnQgKi8KKwljYXNlIFRDR0VUUzoKKwljYXNlIFRDR0VUQToKKwkJcmV0dXJuIG5fdHR5X2lvY3RsKHR0eSwgZmlsZSwgY21kLCBhcmcpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9Cit9CisKKy8qIFZTViBjaGFuZ2VzIHN0YXJ0IGhlcmUgKi8KKyNpZmRlZiBDT05GSUdfU0xJUF9TTUFSVAorLyogZnVuY3Rpb24gZG9faW9jdGwgY2FsbGVkIGZyb20gbmV0L2NvcmUvZGV2LmMKKyAgIHRvIGFsbG93IGdldC9zZXQgb3V0ZmlsbC9rZWVwYWxpdmUgcGFyYW1ldGVyCisgICBieSBpZmNvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK3N0YXRpYyBpbnQgc2xfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzdHJ1Y3QgaWZyZXEgKnJxLGludCBjbWQpCit7CisJc3RydWN0IHNsaXAgKnNsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nICpwID0gKHVuc2lnbmVkIGxvbmcgKikmcnEtPmlmcl9pZnJ1OworCisJaWYgKHNsID09IE5VTEwpCQkvKiBBbGxvY2F0aW9uIGZhaWxlZCA/PyAqLworCQlyZXR1cm4gLUVOT0RFVjsKKworCXNwaW5fbG9ja19iaCgmc2wtPmxvY2spOworCisJaWYgKCFzbC0+dHR5KSB7CisJCXNwaW5fdW5sb2NrX2JoKCZzbC0+bG9jayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXN3aXRjaChjbWQpeworICAgICAgICBjYXNlIFNJT0NTS0VFUEFMSVZFOgorCQkvKiBtYXggZm9yIHVuY2hhciAqLworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKnAgPiAyNTUpIHsKKwkJCXNwaW5fdW5sb2NrX2JoKCZzbC0+bG9jayk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlzbC0+a2VlcGFsaXZlID0gKHVuY2hhcikgKnA7CisJCWlmIChzbC0+a2VlcGFsaXZlICE9IDApIHsKKwkJCXNsLT5rZWVwYWxpdmVfdGltZXIuZXhwaXJlcz1qaWZmaWVzK3NsLT5rZWVwYWxpdmUqSFo7CisJCQltb2RfdGltZXIoJnNsLT5rZWVwYWxpdmVfdGltZXIsIGppZmZpZXMrc2wtPmtlZXBhbGl2ZSpIWik7CisJCQlzZXRfYml0KFNMRl9LRUVQVEVTVCwgJnNsLT5mbGFncyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbF90aW1lcigmc2wtPmtlZXBhbGl2ZV90aW1lcik7CisJCX0KKwkJYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSU9DR0tFRVBBTElWRToKKwkJKnAgPSBzbC0+a2VlcGFsaXZlOworCQlicmVhazsKKworICAgICAgICBjYXNlIFNJT0NTT1VURklMTDoKKyAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKSpwID4gMjU1KSB7IC8qIG1heCBmb3IgdW5jaGFyICovCisJCQlzcGluX3VubG9ja19iaCgmc2wtPmxvY2spOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKyAgICAgICAgICAgICAgICBpZiAoKHNsLT5vdXRmaWxsID0gKHVuY2hhcikqcCkgIT0gMCl7CisJCQltb2RfdGltZXIoJnNsLT5vdXRmaWxsX3RpbWVyLCBqaWZmaWVzK3NsLT5vdXRmaWxsKkhaKTsKKwkJCXNldF9iaXQoU0xGX09VVFdBSVQsICZzbC0+ZmxhZ3MpOworCQl9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVsX3RpbWVyICgmc2wtPm91dGZpbGxfdGltZXIpOworCQl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSU9DR09VVEZJTEw6CisJCSpwID0gc2wtPm91dGZpbGw7CisJCWJyZWFrOworCisgICAgICAgIGNhc2UgU0lPQ1NMRUFTRToKKwkJLyogUmVzb2x2ZSByYWNlIGNvbmRpdGlvbiwgd2hlbiBpb2N0bCdpbmcgaGFuZ2VkIHVwIAorCQkgICBhbmQgb3BlbmVkIGJ5IGFub3RoZXIgcHJvY2VzcyBkZXZpY2UuCisJCSAqLworCQlpZiAoc2wtPnR0eSAhPSBjdXJyZW50LT5zaWduYWwtPnR0eSAmJiBzbC0+cGlkICE9IGN1cnJlbnQtPnBpZCkgeworCQkJc3Bpbl91bmxvY2tfYmgoJnNsLT5sb2NrKTsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKwkJc2wtPmxlYXNlZCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCpwKQorCQkJc2wtPmxlYXNlZCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSU9DR0xFQVNFOgorCQkqcCA9IHNsLT5sZWFzZWQ7CisJfTsKKwlzcGluX3VubG9ja19iaCgmc2wtPmxvY2spOworCXJldHVybiAwOworfQorI2VuZGlmCisvKiBWU1YgY2hhbmdlcyBlbmQgKi8KKworc3RhdGljIHN0cnVjdCB0dHlfbGRpc2MJc2xfbGRpc2MgPSB7CisJLm93bmVyIAkJPSBUSElTX01PRFVMRSwKKwkubWFnaWMgCQk9IFRUWV9MRElTQ19NQUdJQywKKwkubmFtZSAJCT0gInNsaXAiLAorCS5vcGVuIAkJPSBzbGlwX29wZW4sCisJLmNsb3NlCSAJPSBzbGlwX2Nsb3NlLAorCS5pb2N0bAkJPSBzbGlwX2lvY3RsLAorCS5yZWNlaXZlX2J1Zgk9IHNsaXBfcmVjZWl2ZV9idWYsCisJLnJlY2VpdmVfcm9vbQk9IHNsaXBfcmVjZWl2ZV9yb29tLAorCS53cml0ZV93YWtldXAJPSBzbGlwX3dyaXRlX3dha2V1cCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNsaXBfaW5pdCh2b2lkKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoc2xpcF9tYXhkZXYgPCA0KQorCQlzbGlwX21heGRldiA9IDQ7IC8qIFNhbml0eSAqLworCisJcHJpbnRrKEtFUk5fSU5GTyAiU0xJUDogdmVyc2lvbiAlcyAoZHluYW1pYyBjaGFubmVscywgbWF4PSVkKSIKKyNpZmRlZiBDT05GSUdfU0xJUF9NT0RFX1NMSVA2CisJICAgICAgICIgKDYgYml0IGVuY2Fwc3VsYXRpb24gZW5hYmxlZCkiCisjZW5kaWYKKwkgICAgICAgIi5cbiIsCisJICAgICAgIFNMSVBfVkVSU0lPTiwgc2xpcF9tYXhkZXYgKTsKKyNpZiBkZWZpbmVkKFNMX0lOQ0xVREVfQ1NMSVApCisJcHJpbnRrKEtFUk5fSU5GTyAiQ1NMSVA6IGNvZGUgY29weXJpZ2h0IDE5ODkgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLlxuIik7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0xJUF9TTUFSVAorCXByaW50ayhLRVJOX0lORk8gIlNMSVAgbGluZWZpbGwva2VlcGFsaXZlIG9wdGlvbi5cbiIpOworI2VuZGlmCisKKwlzbGlwX2RldnMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZSAqKSpzbGlwX21heGRldiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzbGlwX2RldnMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTTElQOiBDYW4ndCBhbGxvY2F0ZSBzbGlwIGRldmljZXMgYXJyYXkhICBVYWFyZ2ghICgtPiBObyBTTElQIGF2YWlsYWJsZSlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBDbGVhciB0aGUgcG9pbnRlciBhcnJheSwgd2UgYWxsb2NhdGUgZGV2aWNlcyB3aGVuIHdlIG5lZWQgdGhlbSAqLworCW1lbXNldChzbGlwX2RldnMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZSAqKSpzbGlwX21heGRldik7IAorCisJLyogRmlsbCBpbiBvdXIgbGluZSBwcm90b2NvbCBkaXNjaXBsaW5lLCBhbmQgcmVnaXN0ZXIgaXQgKi8KKwlpZiAoKHN0YXR1cyA9IHR0eV9yZWdpc3Rlcl9sZGlzYyhOX1NMSVAsICZzbF9sZGlzYykpICE9IDApICB7CisJCXByaW50ayhLRVJOX0VSUiAiU0xJUDogY2FuJ3QgcmVnaXN0ZXIgbGluZSBkaXNjaXBsaW5lIChlcnIgPSAlZClcbiIsIHN0YXR1cyk7CisJCWtmcmVlKHNsaXBfZGV2cyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbGlwX2V4aXQodm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBzbGlwICpzbDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CisJaW50IGJ1c3kgPSAwOworCisJaWYgKHNsaXBfZGV2cyA9PSBOVUxMKSAKKwkJcmV0dXJuOworCisJLyogRmlyc3Qgb2YgYWxsOiBjaGVjayBmb3IgYWN0aXZlIGRpc2NpcGxpbmVzIGFuZCBoYW5ndXAgdGhlbS4KKwkgKi8KKwlkbyB7CisJCWlmIChidXN5KSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dChIWiAvIDEwKTsKKwkJfQorCisJCWJ1c3kgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgc2xpcF9tYXhkZXY7IGkrKykgeworCQkJZGV2ID0gc2xpcF9kZXZzW2ldOworCQkJaWYgKCFkZXYpCisJCQkJY29udGludWU7CisJCQlzbCA9IG5ldGRldl9wcml2KGRldik7CisJCQlzcGluX2xvY2tfYmgoJnNsLT5sb2NrKTsKKwkJCWlmIChzbC0+dHR5KSB7CisJCQkJYnVzeSsrOworCQkJCXR0eV9oYW5ndXAoc2wtPnR0eSk7CisJCQl9CisJCQlzcGluX3VubG9ja19iaCgmc2wtPmxvY2spOworCQl9CisJfSB3aGlsZSAoYnVzeSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSk7CisKKworCWZvciAoaSA9IDA7IGkgPCBzbGlwX21heGRldjsgaSsrKSB7CisJCWRldiA9IHNsaXBfZGV2c1tpXTsKKwkJaWYgKCFkZXYpCisJCQljb250aW51ZTsKKwkJc2xpcF9kZXZzW2ldID0gTlVMTDsKKworCQlzbCA9IG5ldGRldl9wcml2KGRldik7CisJCWlmIChzbC0+dHR5KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0dHkgZGlzY2lwbGluZSBzdGlsbCBydW5uaW5nXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkvKiBJbnRlbnRpb25hbGx5IGxlYWsgdGhlIGNvbnRyb2wgYmxvY2suICovCisJCQlkZXYtPmRlc3RydWN0b3IgPSBOVUxMOworCQl9IAorCisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJfQorCisJa2ZyZWUoc2xpcF9kZXZzKTsKKwlzbGlwX2RldnMgPSBOVUxMOworCisJaWYgKChpID0gdHR5X3JlZ2lzdGVyX2xkaXNjKE5fU0xJUCwgTlVMTCkpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJTTElQOiBjYW4ndCB1bnJlZ2lzdGVyIGxpbmUgZGlzY2lwbGluZSAoZXJyID0gJWQpXG4iLCBpKTsKKwl9Cit9CisKK21vZHVsZV9pbml0KHNsaXBfaW5pdCk7Cittb2R1bGVfZXhpdChzbGlwX2V4aXQpOworCisjaWZkZWYgQ09ORklHX1NMSVBfU01BUlQKKy8qCisgKiBUaGlzIGlzIHN0YXJ0IG9mIHRoZSBjb2RlIGZvciBtdWx0aXNsaXAgc3R5bGUgbGluZSBjaGVja2luZworICogYWRkZWQgYnkgU3RhbmlzbGF2IFZvcm9ueWkuIEFsbCBjaGFuZ2VzIGJlZm9yZSBtYXJrZWQgVlNWCisgKi8KKworc3RhdGljIHZvaWQgc2xfb3V0ZmlsbCh1bnNpZ25lZCBsb25nIHNscykKK3sKKwlzdHJ1Y3Qgc2xpcCAqc2w9KHN0cnVjdCBzbGlwICopc2xzOworCisJc3Bpbl9sb2NrKCZzbC0+bG9jayk7CisKKwlpZiAoc2wtPnR0eSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWlmKHNsLT5vdXRmaWxsKQorCXsKKwkJaWYoIHRlc3RfYml0KFNMRl9PVVRXQUlULCAmc2wtPmZsYWdzKSApCisJCXsKKwkJCS8qIG5vIHBhY2tldHMgd2VyZSB0cmFuc21pdHRlZCwgZG8gb3V0ZmlsbCAqLworI2lmZGVmIENPTkZJR19TTElQX01PREVfU0xJUDYKKwkJCXVuc2lnbmVkIGNoYXIgcyA9IChzbC0+bW9kZSAmIFNMX01PREVfU0xJUDYpPzB4NzA6RU5EOworI2Vsc2UKKwkJCXVuc2lnbmVkIGNoYXIgcyA9IEVORDsKKyNlbmRpZgorCQkJLyogcHV0IEVORCBpbnRvIHR0eSBxdWV1ZS4gSXMgaXQgcmlnaHQgPz8/ICovCisJCQlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoc2wtPmRldikpCisJCQl7CisJCQkJLyogaWYgZGV2aWNlIGJ1c3kgbm8gb3V0ZmlsbCAqLworCQkJCXNsLT50dHktPmRyaXZlci0+d3JpdGUoc2wtPnR0eSwgJnMsIDEpOworCQkJfQorCQl9CisJCWVsc2UKKwkJCXNldF9iaXQoU0xGX09VVFdBSVQsICZzbC0+ZmxhZ3MpOworCisJCW1vZF90aW1lcigmc2wtPm91dGZpbGxfdGltZXIsIGppZmZpZXMrc2wtPm91dGZpbGwqSFopOworCX0KK291dDoKKwlzcGluX3VubG9jaygmc2wtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBzbF9rZWVwYWxpdmUodW5zaWduZWQgbG9uZyBzbHMpCit7CisJc3RydWN0IHNsaXAgKnNsPShzdHJ1Y3Qgc2xpcCAqKXNsczsKKworCXNwaW5fbG9jaygmc2wtPmxvY2spOworCisJaWYgKHNsLT50dHkgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlpZiggc2wtPmtlZXBhbGl2ZSkKKwl7CisJCWlmKHRlc3RfYml0KFNMRl9LRUVQVEVTVCwgJnNsLT5mbGFncykpCisJCXsKKwkJCS8qIGtlZXBhbGl2ZSBzdGlsbCBoaWdoIDooLCB3ZSBtdXN0IGhhbmd1cCAqLworCQkJaWYoIHNsLT5vdXRmaWxsICkgLyogb3V0ZmlsbCB0aW1lciBtdXN0IGJlIGRlbGV0ZWQgdG9vICovCisJCQkJKHZvaWQpZGVsX3RpbWVyKCZzbC0+b3V0ZmlsbF90aW1lcik7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG5vIHBhY2tldHMgcmVjZWl2ZWQgZHVyaW5nIGtlZXBhbGl2ZSB0aW1lb3V0LCBoYW5ndXAuXG4iLCBzbC0+ZGV2LT5uYW1lKTsKKwkJCXR0eV9oYW5ndXAoc2wtPnR0eSk7IC8qIHRoaXMgbXVzdCBoYW5ndXAgdHR5ICYgY2xvc2Ugc2xpcCAqLworCQkJLyogSSB0aGluayB3ZSBuZWVkIG5vdCBzb21ldGhpbmcgZWxzZSAqLworCQkJZ290byBvdXQ7CisJCX0KKwkJZWxzZQorCQkJc2V0X2JpdChTTEZfS0VFUFRFU1QsICZzbC0+ZmxhZ3MpOworCisJCW1vZF90aW1lcigmc2wtPmtlZXBhbGl2ZV90aW1lciwgamlmZmllcytzbC0+a2VlcGFsaXZlKkhaKTsKKwl9CisKK291dDoKKwlzcGluX3VubG9jaygmc2wtPmxvY2spOworfQorCisjZW5kaWYKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19MRElTQyhOX1NMSVApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2xpcC5oIGIvZHJpdmVycy9uZXQvc2xpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiM2VmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zbGlwLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBzbGlwLmgJRGVmaW5lIHRoZSBTTElQIGRldmljZSBkcml2ZXIgaW50ZXJmYWNlIGFuZCBjb25zdGFudHMuCisgKgorICogTk9URToJVEhJUyBGSUxFIFdJTEwgQkUgTU9WRUQgVE8gVEhFIExJTlVYIElOQ0xVREUgRElSRUNUT1JZCisgKgkJQVMgU09PTiBBUyBQT1NTSUJMRSEKKyAqCisgKiBWZXJzaW9uOglAKCMpc2xpcC5oCTEuMi4wCTAzLzI4LzkzCisgKgorICogRml4ZXM6CisgKgkJQWxhbiBDb3gJOiAJQWRkZWQgc2xpcCBtdHUgZmllbGQuCisgKgkJTWF0dCBEaWxsb24JOglQcmludGFibGUgc2xpcCAoYm9ycm93ZWQgZnJvbSBuZXQyZSkKKyAqCQlBbGFuIENveAk6CUFkZGVkIFNMX1NMSVBfTE9UUworICoJRG1pdHJ5IEdvcm9kY2hhbmluCToJQSBsb3Qgb2YgY2hhbmdlcyBpbiB0aGUgJ3N0cnVjdCBzbGlwJworICoJRG1pdHJ5IEdvcm9kY2hhbmluCToJQWRkZWQgQ1NMSVAgc3RhdGlzdGljcy4KKyAqCVN0YW5pc2xhdiBWb3JvbnlpCToJTWFrZSBsaW5lIGNoZWNraW5nIGFzIGNyZWF0ZWQgYnkKKyAqCQkJCQlJZ29yIENoZWNoaWssIFJFTENPTSBDb3JwLgorICoJQ3JhaWcgU2NobGVudGVyCQk6CUZpeGVkICNkZWZpbmUgYnVnIHRoYXQgY2F1c2VkCisgKgkJCQkJQ1NMSVAgdGVsbmV0cyB0byBoYW5nIGluIDEuMy42MS02CisgKgorICogQXV0aG9yOglGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdXdhbHQubmwubXVnbmV0Lm9yZz4KKyAqLworI2lmbmRlZiBfTElOVVhfU0xJUF9ICisjZGVmaW5lIF9MSU5VWF9TTElQX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfSU5FVCkgJiYgZGVmaW5lZChDT05GSUdfU0xJUF9DT01QUkVTU0VEKQorIyBkZWZpbmUgU0xfSU5DTFVERV9DU0xJUAorI2VuZGlmCisKKyNpZmRlZiBTTF9JTkNMVURFX0NTTElQCisjIGRlZmluZSBTTF9NT0RFX0RFRkFVTFQgU0xfTU9ERV9BREFQVElWRQorI2Vsc2UKKyMgZGVmaW5lIFNMX01PREVfREVGQVVMVCBTTF9NT0RFX1NMSVAKKyNlbmRpZgorCisvKiBTTElQIGNvbmZpZ3VyYXRpb24uICovCisjZGVmaW5lIFNMX05SVU5JVAkyNTYJCS8qIE1BWCBudW1iZXIgb2YgU0xJUCBjaGFubmVsczsKKwkJCQkJICAgVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoCisJCQkJCSAgIGluc21vZCAtb3NsaXBfbWF4ZGV2PW5ubgkqLworI2RlZmluZSBTTF9NVFUJCTI5NgkJLyogMjk2OyBJIGFtIHVzZWQgdG8gNjAwLSBGdksJKi8KKworLyogU0xJUCBwcm90b2NvbCBjaGFyYWN0ZXJzLiAqLworI2RlZmluZSBFTkQgICAgICAgICAgICAgMDMwMAkJLyogaW5kaWNhdGVzIGVuZCBvZiBmcmFtZQkqLworI2RlZmluZSBFU0MgICAgICAgICAgICAgMDMzMwkJLyogaW5kaWNhdGVzIGJ5dGUgc3R1ZmZpbmcJKi8KKyNkZWZpbmUgRVNDX0VORCAgICAgICAgIDAzMzQJCS8qIEVTQyBFU0NfRU5EIG1lYW5zIEVORCAnZGF0YScJKi8KKyNkZWZpbmUgRVNDX0VTQyAgICAgICAgIDAzMzUJCS8qIEVTQyBFU0NfRVNDIG1lYW5zIEVTQyAnZGF0YScJKi8KKworCitzdHJ1Y3Qgc2xpcCB7CisgIGludAkJCW1hZ2ljOworCisgIC8qIFZhcmlvdXMgZmllbGRzLiAqLworICBzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OwkJLyogcHRyIHRvIFRUWSBzdHJ1Y3R1cmUJCSovCisgIHN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CQkvKiBlYXN5IGZvciBpbnRyIGhhbmRsaW5nCSovCisgIHNwaW5sb2NrX3QJCWxvY2s7CisKKyNpZmRlZiBTTF9JTkNMVURFX0NTTElQCisgIHN0cnVjdCBzbGNvbXByZXNzCSpzbGNvbXA7CS8qIGZvciBoZWFkZXIgY29tcHJlc3Npb24gCSovCisgIHVuc2lnbmVkIGNoYXIJCSpjYnVmZjsJCS8qIGNvbXByZXNzaW9uIGJ1ZmZlcgkJKi8KKyNlbmRpZgorCisgIC8qIFRoZXNlIGFyZSBwb2ludGVycyB0byB0aGUgbWFsbG9jKCllZCBmcmFtZSBidWZmZXJzLiAqLworICB1bnNpZ25lZCBjaGFyCQkqcmJ1ZmY7CQkvKiByZWNlaXZlciBidWZmZXIJCSovCisgIGludCAgICAgICAgICAgICAgICAgICByY291bnQ7ICAgICAgICAgLyogcmVjZWl2ZWQgY2hhcnMgY291bnRlciAgICAgICAqLworICB1bnNpZ25lZCBjaGFyCQkqeGJ1ZmY7CQkvKiB0cmFuc21pdHRlciBidWZmZXIJCSovCisgIHVuc2lnbmVkIGNoYXIgICAgICAgICAqeGhlYWQ7ICAgICAgICAgLyogcG9pbnRlciB0byBuZXh0IGJ5dGUgdG8gWE1JVCAqLworICBpbnQgICAgICAgICAgICAgICAgICAgeGxlZnQ7ICAgICAgICAgIC8qIGJ5dGVzIGxlZnQgaW4gWE1JVCBxdWV1ZSAgICAgKi8KKworICAvKiBTTElQIGludGVyZmFjZSBzdGF0aXN0aWNzLiAqLworICB1bnNpZ25lZCBsb25nCQlyeF9wYWNrZXRzOwkvKiBpbmJvdW5kIGZyYW1lcyBjb3VudGVyCSovCisgIHVuc2lnbmVkIGxvbmcgICAgICAgICB0eF9wYWNrZXRzOyAgICAgLyogb3V0Ym91bmQgZnJhbWVzIGNvdW50ZXIgICAgICAqLworICB1bnNpZ25lZCBsb25nCQlyeF9ieXRlczsJLyogaW5ib3VuZCBieXRlIGNvdW50ZQkJKi8KKyAgdW5zaWduZWQgbG9uZyAgICAgICAgIHR4X2J5dGVzOyAgICAgICAvKiBvdXRib3VuZCBieXRlIGNvdW50ZXIJKi8KKyAgdW5zaWduZWQgbG9uZyAgICAgICAgIHJ4X2Vycm9yczsgICAgICAvKiBQYXJpdHksIGV0Yy4gZXJyb3JzICAgICAgICAgICovCisgIHVuc2lnbmVkIGxvbmcgICAgICAgICB0eF9lcnJvcnM7ICAgICAgLyogUGxhbm5lZCBzdHVmZiAgICAgICAgICAgICAgICAqLworICB1bnNpZ25lZCBsb25nICAgICAgICAgcnhfZHJvcHBlZDsgICAgIC8qIE5vIG1lbW9yeSBmb3Igc2tiICAgICAgICAgICAgKi8KKyAgdW5zaWduZWQgbG9uZyAgICAgICAgIHR4X2Ryb3BwZWQ7ICAgICAvKiBXaGVuIE1UVSBjaGFuZ2UgICAgICAgICAgICAgICovCisgIHVuc2lnbmVkIGxvbmcgICAgICAgICByeF9vdmVyX2Vycm9yczsgLyogRnJhbWUgYmlnZ2VyIHRoZW4gU0xJUCBidWYuICAqLworI2lmZGVmIFNMX0lOQ0xVREVfQ1NMSVAKKyAgdW5zaWduZWQgbG9uZwkJdHhfY29tcHJlc3NlZDsKKyAgdW5zaWduZWQgbG9uZwkJcnhfY29tcHJlc3NlZDsKKyAgdW5zaWduZWQgbG9uZwkJdHhfbWlzc2VzOworI2VuZGlmCisgIC8qIERldGFpbGVkIFNMSVAgc3RhdGlzdGljcy4gKi8KKworICBpbnQJCQltdHU7CQkvKiBPdXIgbXR1ICh0byBzcG90IGNoYW5nZXMhKSAgICovCisgIGludCAgICAgICAgICAgICAgICAgICBidWZmc2l6ZTsgICAgICAgLyogTWF4IGJ1ZmZlcnMgc2l6ZXMgICAgICAgICAgICAqLworCisjaWZkZWYgQ09ORklHX1NMSVBfTU9ERV9TTElQNgorICBpbnQJCQl4ZGF0YSwgeGJpdHM7CS8qIDYgYml0IHNsaXAgY29udHJvbHMgCQkqLworI2VuZGlmCisKKyAgdW5zaWduZWQgbG9uZwkJZmxhZ3M7CQkvKiBGbGFnIHZhbHVlcy8gbW9kZSBldGMJKi8KKyNkZWZpbmUgU0xGX0lOVVNFCTAJCS8qIENoYW5uZWwgaW4gdXNlICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0xGX0VTQ0FQRQkxICAgICAgICAgICAgICAgLyogRVNDIHJlY2VpdmVkICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTTEZfRVJST1IJMiAgICAgICAgICAgICAgIC8qIFBhcml0eSwgZXRjLiBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgU0xGX0tFRVBURVNUCTMJCS8qIEtlZXBhbGl2ZSB0ZXN0IGZsYWcJCSovCisjZGVmaW5lIFNMRl9PVVRXQUlUCTQJCS8qIGlzIG91dHBhY2tldCB3YXMgZmxhZwkqLworCisgIHVuc2lnbmVkIGNoYXIJCW1vZGU7CQkvKiBTTElQIG1vZGUJCQkqLworICB1bnNpZ25lZCBjaGFyCQlsZWFzZWQ7CisgIGRldl90CQkJbGluZTsKKyAgcGlkX3QJCQlwaWQ7CisjZGVmaW5lIFNMX01PREVfU0xJUAkwCisjZGVmaW5lIFNMX01PREVfQ1NMSVAJMQorI2RlZmluZSBTTF9NT0RFX1NMSVA2CTIJCS8qIE1hdHQgRGlsbG9uJ3MgcHJpbnRhYmxlIHNsaXAgKi8KKyNkZWZpbmUgU0xfTU9ERV9DU0xJUDYJKFNMX01PREVfU0xJUDZ8U0xfTU9ERV9DU0xJUCkKKyNkZWZpbmUgU0xfTU9ERV9BWDI1CTQKKyNkZWZpbmUgU0xfTU9ERV9BREFQVElWRSA4CisjaWZkZWYgQ09ORklHX1NMSVBfU01BUlQgIAorICB1bnNpZ25lZCBjaGFyCQlvdXRmaWxsOwkvKiAjIG9mIHNlYyBiZXR3ZWVuIG91dGZpbGwgcGFja2V0ICovCisgIHVuc2lnbmVkIGNoYXIJCWtlZXBhbGl2ZTsJLyoga2VlcGFsaXZlIHNlY29uZHMJCSovCisgIHN0cnVjdCB0aW1lcl9saXN0CW91dGZpbGxfdGltZXI7CisgIHN0cnVjdCB0aW1lcl9saXN0CWtlZXBhbGl2ZV90aW1lcjsKKyNlbmRpZiAgCit9OworCisjZGVmaW5lIFNMSVBfTUFHSUMgMHg1MzAyCisKKyNlbmRpZgkvKiBfTElOVVhfU0xJUC5IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWMtbWNhLmMgYi9kcml2ZXJzL25ldC9zbWMtbWNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkwMjAxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NtYy1tY2EuYwpAQCAtMCwwICsxLDUwOCBAQAorLyogc21jLW1jYS5jOiBBIFNNQyBVbHRyYSBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4LiAqLworLyoKKyAgICBNb3N0IG9mIHRoaXMgZHJpdmVyLCBleGNlcHQgZm9yIHVsdHJhbWNhX3Byb2JlIGlzIG5lYXJseQorICAgIHZlcmJhdGltIGZyb20gc21jLXVsdHJhLmMgYnkgRG9uYWxkIEJlY2tlci4gVGhlIHJlc3QgaXMKKyAgICB3cml0dGVuIGFuZCBjb3B5cmlnaHQgMTk5NiBieSBEYXZpZCBXZWlzLCB3ZWlzZDM0NThAdW5pLmVkdQorCisgICAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFNNQyBVbHRyYSBhbmQgU01DIEV0aGVyRVogZXRoZXJjYXJkcy4KKworICAgIFRoaXMgZHJpdmVyIHVzZXMgdGhlIGNhcmRzIGluIHRoZSA4MzkwLWNvbXBhdGlibGUsIHNoYXJlZCBtZW1vcnkgbW9kZS4KKyAgICBNb3N0IG9mIHRoZSBydW4tdGltZSBjb21wbGV4aXR5IGlzIGhhbmRsZWQgYnkgdGhlIGdlbmVyaWMgY29kZSBpbgorICAgIDgzOTAuYy4KKworICAgIFRoaXMgZHJpdmVyIGVuYWJsZXMgdGhlIHNoYXJlZCBtZW1vcnkgb25seSB3aGVuIGRvaW5nIHRoZSBhY3R1YWwgZGF0YQorICAgIHRyYW5zZmVycyB0byBhdm9pZCBhIGJ1ZyBpbiBlYXJseSB2ZXJzaW9uIG9mIHRoZSBjYXJkIHRoYXQgY29ycnVwdGVkCisgICAgZGF0YSB0cmFuc2ZlcnJlZCBieSBhIEFIQTE1NDIuCisKKyAgICBUaGlzIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBwcm9ncmFtbWVkLUkvTyBkYXRhIHRyYW5zZmVyIG1vZGUgb2YKKyAgICB0aGUgRXRoZXJFWi4gIFRoYXQgc3VwcG9ydCAoaWYgYXZhaWxhYmxlKSBpcyBzbWMtZXouYy4gIE5vciBkb2VzIGl0CisgICAgdXNlIHRoZSBub24tODM5MC1jb21wYXRpYmxlICJBbHRlZ28iIG1vZGUuIChObyBzdXBwb3J0IGN1cnJlbnRseSBwbGFubmVkLikKKworICAgIENoYW5nZWxvZzoKKworICAgIFBhdWwgR29ydG1ha2VyCSA6IG11bHRpcGxlIGNhcmQgc3VwcG9ydCBmb3IgbW9kdWxlIHVzZXJzLgorICAgIERhdmlkIFdlaXMJCSA6IE1pY3JvIENoYW5uZWwtaXplZCBpdC4KKyAgICBUb20gU2lnaHRsZXIJIDogQWRkZWQgc3VwcG9ydCBmb3IgSUJNIFBTLzIgRXRoZXJuZXQgQWRhcHRlci9BCisgICAgQ2hyaXN0b3BoZXIgVHVyY2tzaW4gOiBDaGFuZ2VkIE1DQS1wcm9iZSBzbyB0aGF0IG11bHRpcGxlIGFkYXB0ZXJzIGFyZQorCQkJICAgZm91bmQgY29ycmVjdGx5IChKdWwgMTYsIDE5OTcpCisgICAgQ2hyaXMgQmVhdXJlZ2FyZAkgOiBUcmllZCB0byBtZXJnZSB0aGUgdHdvIGNoYW5nZXMgYWJvdmUgKERlYyAxNSwgMTk5NykKKyAgICBUb20gU2lnaHRsZXIJIDogRml4ZWQgbWlub3IgZGV0ZWN0aW9uIGJ1ZyBjYXVzZWQgYnkgYWJvdmUgbWVyZ2UKKyAgICBUb20gU2lnaHRsZXIJIDogQWRkZWQgc3VwcG9ydCBmb3IgdGhyZWUgbW9yZSBXZXN0ZXJuIERpZ2l0YWwKKwkJCSAgIE1DQS1hZGFwdGVycworICAgIFRvbSBTaWdodGxlcgkgOiBBZGRlZCBzdXBwb3J0IGZvciAyLjIueCBtY2FfZmluZF91bnVzZWRfYWRhcHRlcgorICAgIEhhcnRtdXQgU2NobWlkdAkgOiAtIE1vZGlmaWVkIHBhcmFtZXRlciBkZXRlY3Rpb24gdG8gaGFuZGxlIGVhY2gKKwkJCSAgICAgY2FyZCBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gYSBzd2l0Y2gtbGlzdAorCQkJICAgLSAnY2FyZF92ZXInIHJlbW92ZWQgZnJvbSB0aGUgYWRhcHRlciBsaXN0CisJCQkgICAtIFNvbWUgbWlub3IgYnVnIGZpeGVzCisqLworCisjaW5jbHVkZSA8bGludXgvbWNhLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgIjgzOTAuaCIKKyNpbmNsdWRlICJzbWMtbWNhLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgInNtYy1tY2EiCisKK3N0YXRpYyBpbnQgdWx0cmFtY2Ffb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHVsdHJhbWNhX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB1bHRyYW1jYV9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByaW5nX3BhZ2UpOworc3RhdGljIHZvaWQgdWx0cmFtY2FfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByaW5nX29mZnNldCk7CitzdGF0aWMgdm9pZCB1bHRyYW1jYV9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3RhcnRfcGFnZSk7CitzdGF0aWMgaW50IHVsdHJhbWNhX2Nsb3NlX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKyNkZWZpbmUgU1RBUlRfUEcgICAgICAgIDB4MDAgICAgLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKworI2RlZmluZSBVTFRSQV9DTURSRUcgMCAgICAgIC8qIE9mZnNldCB0byBBU0lDIGNvbW1hbmQgcmVnaXN0ZXIuICovCisjZGVmaW5lIFVMVFJBX1JFU0VUICAweDgwICAgLyogQm9hcmQgcmVzZXQsIGluIFVMVFJBX0NNRFJFRy4gKi8KKyNkZWZpbmUgVUxUUkFfTUVNRU5CIDB4NDAgICAvKiBFbmFibGUgdGhlIHNoYXJlZCBtZW1vcnkuICovCisjZGVmaW5lIFVMVFJBX05JQ19PRkZTRVQgMTYgLyogTklDIHJlZ2lzdGVyIG9mZnNldCBmcm9tIHRoZSBiYXNlX2FkZHIuICovCisjZGVmaW5lIFVMVFJBX0lPX0VYVEVOVCAzMgorI2RlZmluZSBFTjBfRVJXQ05UICAgICAgMHgwOCAgLyogRWFybHkgcmVjZWl2ZSB3YXJuaW5nIGNvdW50LiAqLworCisjZGVmaW5lIF82MWM4X1NNQ19FdGhlcmNhcmRfUExVU19FbGl0ZV9BX0JOQ19BVUlfV0Q4MDEzRVBfQSAgICAgICAgICAgIDAKKyNkZWZpbmUgXzYxYzlfU01DX0V0aGVyY2FyZF9QTFVTX0VsaXRlX0FfVVRQX0FVSV9XRDgwMTNFUF9BICAgICAgICAgICAgMQorI2RlZmluZSBfNmZjMF9XRF9FdGhlcmNhcmRfUExVU19BX1dEODAwM0VfQV9PUl9XRDgwMDNFVF9BICAgICAgICAgICAgICAyCisjZGVmaW5lIF82ZmMxX1dEX1N0YXJjYXJkX1BMVVNfQV9XRDgwMDNTVF9BICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgXzZmYzJfV0RfRXRoZXJjYXJkX1BMVVNfMTBUX0FfV0Q4MDAzV19BICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBfZWZkNF9JQk1fUFMyX0FkYXB0ZXJfQV9mb3JfRXRoZXJuZXRfVVRQX0FVSV9XRDgwMTNXUF9BICAgICAgICA1CisjZGVmaW5lIF9lZmQ1X0lCTV9QUzJfQWRhcHRlcl9BX2Zvcl9FdGhlcm5ldF9CTkNfQVVJX1dEODAxM1dQX0EgICAgICAgIDYKKyNkZWZpbmUgX2VmZTVfSUJNX1BTMl9BZGFwdGVyX0FfZm9yX0V0aGVybmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgNworCitzdHJ1Y3Qgc21jX21jYV9hZGFwdGVyc190IHsKKwl1bnNpZ25lZCBpbnQgaWQ7CisJY2hhciAqbmFtZTsKK307CisKKyNkZWZpbmUgTUFYX1VMVFJBTUNBX0NBUkRTIDQJLyogTWF4IG51bWJlciBvZiBVbHRyYSBjYXJkcyBwZXIgbW9kdWxlICovCisKK3N0YXRpYyBpbnQgdWx0cmFfaW9bTUFYX1VMVFJBTUNBX0NBUkRTXTsKK3N0YXRpYyBpbnQgdWx0cmFfaXJxW01BWF9VTFRSQU1DQV9DQVJEU107CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbV9hcnJheSh1bHRyYV9pbywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheSh1bHRyYV9pcnEsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHVsdHJhX2lvLCAiU01DIFVsdHJhL0V0aGVyRVogTUNBIEkvTyBiYXNlIGFkZHJlc3MoZXMpIik7CitNT0RVTEVfUEFSTV9ERVNDKHVsdHJhX2lycSwgIlNNQyBVbHRyYS9FdGhlckVaIE1DQSBJUlEgbnVtYmVyKHMpIik7CisKK3N0YXRpYyBzaG9ydCBzbWNfbWNhX2FkYXB0ZXJfaWRzW10gX19pbml0ZGF0YSA9IHsKKwkweDYxYzgsCisJMHg2MWM5LAorCTB4NmZjMCwKKwkweDZmYzEsCisJMHg2ZmMyLAorCTB4ZWZkNCwKKwkweGVmZDUsCisJMHhlZmU1LAorCTB4MDAwMAorfTsKKworc3RhdGljIGNoYXIgKnNtY19tY2FfYWRhcHRlcl9uYW1lc1tdIF9faW5pdGRhdGEgPSB7CisJIlNNQyBFdGhlcmNhcmQgUExVUyBFbGl0ZS9BIEJOQy9BVUkgKFdEODAxM0VQL0EpIiwKKwkiU01DIEV0aGVyY2FyZCBQTFVTIEVsaXRlL0EgVVRQL0FVSSAoV0Q4MDEzV1AvQSkiLAorCSJXRCBFdGhlcmNhcmQgUExVUy9BIChXRDgwMDNFL0Egb3IgV0Q4MDAzRVQvQSkiLAorCSJXRCBTdGFyY2FyZCBQTFVTL0EgKFdEODAwM1NUL0EpIiwKKwkiV0QgRXRoZXJjYXJkIFBMVVMgMTBUL0EgKFdEODAwM1cvQSkiLAorCSJJQk0gUFMvMiBBZGFwdGVyL0EgZm9yIEV0aGVybmV0IFVUUC9BVUkgKFdEODAxM1dQL0EpIiwKKwkiSUJNIFBTLzIgQWRhcHRlci9BIGZvciBFdGhlcm5ldCBCTkMvQVVJIChXRDgwMTNFUC9BKSIsCisJIklCTSBQUy8yIEFkYXB0ZXIvQSBmb3IgRXRoZXJuZXQiLAorCU5VTEwKK307CisKK3N0YXRpYyBpbnQgdWx0cmFfZm91bmQgPSAwOworCitpbnQgX19pbml0IHVsdHJhbWNhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmdlbl9kZXYpCit7CisJdW5zaWduZWQgc2hvcnQgaW9hZGRyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgY2hhciByZWc0LCBudW1fcGFnZXM7CisJc3RydWN0IG1jYV9kZXZpY2UgKm1jYV9kZXYgPSB0b19tY2FfZGV2aWNlKGdlbl9kZXYpOworCWNoYXIgc2xvdCA9IG1jYV9kZXYtPnNsb3Q7CisJdW5zaWduZWQgY2hhciBwb3MyID0gMHhmZiwgcG9zMyA9IDB4ZmYsIHBvczQgPSAweGZmLCBwb3M1ID0gMHhmZjsKKwlpbnQgaSwgcmM7CisJaW50IGFkYXB0ZXIgPSBtY2FfZGV2LT5pbmRleDsKKwlpbnQgdGJhc2UgPSAwOworCWludCB0aXJxID0gMDsKKwlpbnQgYmFzZV9hZGRyID0gdWx0cmFfaW9bdWx0cmFfZm91bmRdOworCWludCBpcnEgPSB1bHRyYV9pcnFbdWx0cmFfZm91bmRdOworCisJaWYgKGJhc2VfYWRkciB8fCBpcnEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUHJvYmluZyBmb3IgU01DIE1DQSBhZGFwdGVyIik7CisJCWlmIChiYXNlX2FkZHIpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiBhdCBJL08gYWRkcmVzcyAweCUwNHglYyIsCisJCQkgICAgICAgYmFzZV9hZGRyLCBpcnEgPyAnICcgOiAnXG4nKTsKKwkJfQorCQlpZiAoaXJxKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJ1c2luZyBpcnEgJWRcbiIsIGlycSk7CisJCX0KKwl9CisKKwl0aXJxID0gMDsKKwl0YmFzZSA9IDA7CisKKwkvKiBJZiB3ZSdyZSB0cnlpbmcgdG8gbWF0Y2ggYSBzcGVjaWZpY2llZCBpcnEgb3IgaW8gYWRkcmVzcywKKwkgKiB3ZSdsbCByZWplY3QgdGhlIGFkYXB0ZXIgZm91bmQgdW5sZXNzIGl0J3MgdGhlIG9uZSB3ZSdyZQorCSAqIGxvb2tpbmcgZm9yICovCisKKwlwb3MyID0gbWNhX2RldmljZV9yZWFkX3N0b3JlZF9wb3MobWNhX2RldiwgMik7IC8qIGlvX2FkZHIgKi8KKwlwb3MzID0gbWNhX2RldmljZV9yZWFkX3N0b3JlZF9wb3MobWNhX2RldiwgMyk7IC8qIHNoYXJlZCBtZW0gKi8KKwlwb3M0ID0gbWNhX2RldmljZV9yZWFkX3N0b3JlZF9wb3MobWNhX2RldiwgNCk7IC8qIFJPTSBiaW9zIGFkZHIgcmFuZ2UgKi8KKwlwb3M1ID0gbWNhX2RldmljZV9yZWFkX3N0b3JlZF9wb3MobWNhX2RldiwgNSk7IC8qIGlycSwgbWVkaWEgYW5kIFJJUEwgKi8KKworCS8qIFRlc3QgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCSAqIC0gSWYgYW4gaXJxIHBhcmFtZXRlciBpcyBzdXBwbGllZCwgY29tcGFyZSBpdAorCSAqICAgd2l0aCB0aGUgaXJxIG9mIHRoZSBhZGFwdGVyIHdlIGZvdW5kCisJICogLSBJZiBhIGJhc2VfYWRkciBwYXJhbWF0ZXIgaXMgZ2l2ZW4sIGNvbXBhcmUgaXQKKwkgKiAgIHdpdGggdGhlIGJhc2VfYWRkciBvZiB0aGUgYWRhcHRlciB3ZSBmb3VuZAorCSAqIC0gQ2hlY2sgdGhhdCB0aGUgaXJxIGFuZCB0aGUgYmFzZV9hZGRyIG9mIHRoZQorCSAqICAgYWRhcHRlciB3ZSBmb3VuZCBpcyBub3QgYWxyZWFkeSBpbiB1c2UgYnkKKwkgKiAgIHRoaXMgZHJpdmVyCisJICovCisKKwlzd2l0Y2ggKG1jYV9kZXYtPmluZGV4KSB7CisJY2FzZSBfNjFjOF9TTUNfRXRoZXJjYXJkX1BMVVNfRWxpdGVfQV9CTkNfQVVJX1dEODAxM0VQX0E6CisJY2FzZSBfNjFjOV9TTUNfRXRoZXJjYXJkX1BMVVNfRWxpdGVfQV9VVFBfQVVJX1dEODAxM0VQX0E6CisJY2FzZSBfZWZkNF9JQk1fUFMyX0FkYXB0ZXJfQV9mb3JfRXRoZXJuZXRfVVRQX0FVSV9XRDgwMTNXUF9BOgorCWNhc2UgX2VmZDVfSUJNX1BTMl9BZGFwdGVyX0FfZm9yX0V0aGVybmV0X0JOQ19BVUlfV0Q4MDEzV1BfQToKKwkJeworCQkJdGJhc2UgPSBhZGRyX3RhYmxlWyhwb3MyICYgMHhmMCkgPj4gNF0uYmFzZV9hZGRyOworCQkJdGlycSAgPSBpcnFfdGFibGVbKHBvczUgJiAweGMpID4+IDJdLm5ld19pcnE7CisJCQlicmVhazsKKwkJfQorCWNhc2UgXzZmYzBfV0RfRXRoZXJjYXJkX1BMVVNfQV9XRDgwMDNFX0FfT1JfV0Q4MDAzRVRfQToKKwljYXNlIF82ZmMxX1dEX1N0YXJjYXJkX1BMVVNfQV9XRDgwMDNTVF9BOgorCWNhc2UgXzZmYzJfV0RfRXRoZXJjYXJkX1BMVVNfMTBUX0FfV0Q4MDAzV19BOgorCWNhc2UgX2VmZTVfSUJNX1BTMl9BZGFwdGVyX0FfZm9yX0V0aGVybmV0OgorCQl7CisJCQl0YmFzZSA9ICgocG9zMiAmIDB4MGZlKSAqIDB4MTApOworCQkJdGlycSAgPSBpcnFfdGFibGVbKHBvczUgJiAzKV0ub2xkX2lycTsKKwkJCWJyZWFrOworCQl9CisJfQorCQorCWlmKCF0aXJxIHx8ICF0YmFzZSAKKwkgICB8fCAoaXJxICYmIGlycSAhPSB0aXJxKSAKKwkgICB8fCAoYmFzZV9hZGRyICYmIHRiYXNlICE9IGJhc2VfYWRkcikpCisJCS8qIEZJWE1FOiB3ZSdyZSB0cnlpbmcgdG8gZm9yY2UgdGhlIG9yZGVyaW5nIG9mIHRoZQorCQkgKiBkZXZpY2VzIGhlcmUsIHRoZXJlIHNob3VsZCBiZSBhIHdheSBvZiBnZXR0aW5nIHRoaXMKKwkJICogdG8gaGFwcGVuICovCisJCXJldHVybiAtRU5YSU87CisKKyAgICAgICAgLyogQWRhcHRlciBmb3VuZC4gKi8KKwlkZXYgID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisJaWYoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCBnZW5fZGV2KTsKKwltY2FfZGV2aWNlX3NldF9uYW1lKG1jYV9kZXYsIHNtY19tY2FfYWRhcHRlcl9uYW1lc1thZGFwdGVyXSk7CisJbWNhX2RldmljZV9zZXRfY2xhaW0obWNhX2RldiwgMSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJzbWNfbWNhOiAlcyBmb3VuZCBpbiBzbG90ICVkXG4iLAorCQkgICAgICAgc21jX21jYV9hZGFwdGVyX25hbWVzW2FkYXB0ZXJdLCBzbG90ICsgMSk7CisKKwl1bHRyYV9mb3VuZCsrOworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHIgPSBtY2FfZGV2aWNlX3RyYW5zZm9ybV9pb3BvcnQobWNhX2RldiwgdGJhc2UpOworCWRldi0+aXJxICAgICAgID0gbWNhX2RldmljZV90cmFuc2Zvcm1faXJxKG1jYV9kZXYsIHRpcnEpOworCWRldi0+bWVtX3N0YXJ0ID0gMDsKKwludW1fcGFnZXMgICAgICA9IDQwOworCisJc3dpdGNoIChhZGFwdGVyKSB7CS8qIGNhcmQtIyBpbiBjb25zdCBhcnJheSBhYm92ZSBbaHNdICovCisJCWNhc2UgXzYxYzhfU01DX0V0aGVyY2FyZF9QTFVTX0VsaXRlX0FfQk5DX0FVSV9XRDgwMTNFUF9BOgorCQljYXNlIF82MWM5X1NNQ19FdGhlcmNhcmRfUExVU19FbGl0ZV9BX1VUUF9BVUlfV0Q4MDEzRVBfQToKKwkJeworCQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsgLyogdGFraW5nIDE2IGNvdW50cworCQkJCQkJICAgICogdXAgdG8gMTUgW2hzXSAqLworCQkJCWlmIChtZW1fdGFibGVbaV0ubWVtX2luZGV4ID09IChwb3MzICYgfk1FTV9NQVNLKSkgeworCQkJCQlkZXYtPm1lbV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKQorCQkJCQkgIG1jYV9kZXZpY2VfdHJhbnNmb3JtX21lbW9yeShtY2FfZGV2LCAodm9pZCAqKW1lbV90YWJsZVtpXS5tZW1fc3RhcnQpOworCQkJCQludW1fcGFnZXMgPSBtZW1fdGFibGVbaV0ubnVtX3BhZ2VzOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgXzZmYzBfV0RfRXRoZXJjYXJkX1BMVVNfQV9XRDgwMDNFX0FfT1JfV0Q4MDAzRVRfQToKKwkJY2FzZSBfNmZjMV9XRF9TdGFyY2FyZF9QTFVTX0FfV0Q4MDAzU1RfQToKKwkJY2FzZSBfNmZjMl9XRF9FdGhlcmNhcmRfUExVU18xMFRfQV9XRDgwMDNXX0E6CisJCWNhc2UgX2VmZTVfSUJNX1BTMl9BZGFwdGVyX0FfZm9yX0V0aGVybmV0OgorCQl7CisJCQlkZXYtPm1lbV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKQorCQkJICBtY2FfZGV2aWNlX3RyYW5zZm9ybV9tZW1vcnkobWNhX2RldiwgKHZvaWQgKikoKHBvczMgJiAweGZjKSAqIDB4MTAwMCkpOworCQkJbnVtX3BhZ2VzID0gMHg0MDsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgX2VmZDRfSUJNX1BTMl9BZGFwdGVyX0FfZm9yX0V0aGVybmV0X1VUUF9BVUlfV0Q4MDEzV1BfQToKKwkJY2FzZSBfZWZkNV9JQk1fUFMyX0FkYXB0ZXJfQV9mb3JfRXRoZXJuZXRfQk5DX0FVSV9XRDgwMTNXUF9BOgorCQl7CisJCQkvKiBjb3VydGVzeSBvZiBnYW1lcmFAcXVhcnR6Lm9jbi5uZS5qcCwgcG9zMyBpbmRpY2F0ZXMKKwkJCSAqIHRoZSBpbmRleCBvZiB0aGUgMHgyMDAwIHN0ZXAuCisJCQkgKiBiZXdhcmUgZGlmZmVyZW50IG51bWJlciBvZiBwYWdlcyBbaHNdCisJCQkgKi8KKwkJCWRldi0+bWVtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIAorCQkJICBtY2FfZGV2aWNlX3RyYW5zZm9ybV9tZW1vcnkobWNhX2RldiwgKHZvaWQgKikoMHhjMDAwMCArICgweDIwMDAgKiAocG9zMyAmIDB4ZikpKSk7CisJCQludW1fcGFnZXMgPSAweDIwICsgKDIgKiAocG9zMyAmIDB4MTApKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogc2FuaXR5IGNoZWNrLCBzaG91bGRuJ3QgaGFwcGVuICovCisJaWYgKGRldi0+bWVtX3N0YXJ0ID09IDApIHsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycl91bmNsYWltOworCX0KKworCWlmICghcmVxdWVzdF9yZWdpb24oaW9hZGRyLCBVTFRSQV9JT19FWFRFTlQsIERSVl9OQU1FKSkgeworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3VuY2xhaW07CisJfQorCisJcmVnNCA9IGluYihpb2FkZHIgKyA0KSAmIDB4N2Y7CisJb3V0YihyZWc0LCBpb2FkZHIgKyA0KTsKKworCXByaW50ayhLRVJOX0lORk8gInNtY19tY2FbJWRdOiBQYXJhbWV0ZXJzOiAlIzN4LCIsIHNsb3QgKyAxLCBpb2FkZHIpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIgJTIuMlgiLCBkZXYtPmRldl9hZGRyW2ldID0gaW5iKGlvYWRkciArIDggKyBpKSk7CisKKwkvKiBTd2l0Y2ggZnJvbSB0aGUgc3RhdGlvbiBhZGRyZXNzIHRvIHRoZSBhbHRlcm5hdGUgcmVnaXN0ZXIgc2V0CisJICogYW5kIHJlYWQgdGhlIHVzZWZ1bCByZWdpc3RlcnMgdGhlcmUuCisJICovCisKKwlvdXRiKDB4ODAgfCByZWc0LCBpb2FkZHIgKyA0KTsKKworCS8qIEVuYWJsZSBGSU5FMTYgbW9kZSB0byBhdm9pZCBCSU9TIFJPTSB3aWR0aCBtaXNtYXRjaGVzIEAgcmVib290LgorCSAqLworCisJb3V0YigweDgwIHwgaW5iKGlvYWRkciArIDB4MGMpLCBpb2FkZHIgKyAweDBjKTsKKworCS8qIFN3aXRjaCBiYWNrIHRvIHRoZSBzdGF0aW9uIGFkZHJlc3MgcmVnaXN0ZXIgc2V0IHNvIHRoYXQKKwkgKiB0aGUgTVMtRE9TIGRyaXZlciBjYW4gZmluZCB0aGUgY2FyZCBhZnRlciBhIHdhcm0gYm9vdC4KKwkgKi8KKworCW91dGIocmVnNCwgaW9hZGRyICsgNCk7CisKKwlnZW5fZGV2LT5kcml2ZXJfZGF0YSA9IGRldjsKKworCS8qIFRoZSA4MzkwIGlzbid0IGF0IHRoZSBiYXNlIGFkZHJlc3MsIHNvIGZha2UgdGhlIG9mZnNldAorCSAqLworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHIgKyBVTFRSQV9OSUNfT0ZGU0VUOworCisJZWlfc3RhdHVzLm5hbWUgPSAiU01DIFVsdHJhIE1DQSI7CisJZWlfc3RhdHVzLndvcmQxNiA9IDE7CisJZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBTVEFSVF9QRzsKKwllaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IFNUQVJUX1BHICsgVFhfUEFHRVM7CisJZWlfc3RhdHVzLnN0b3BfcGFnZSA9IG51bV9wYWdlczsKKworCWVpX3N0YXR1cy5tZW0gPSBpb3JlbWFwKGRldi0+bWVtX3N0YXJ0LCAoZWlfc3RhdHVzLnN0b3BfcGFnZSAtIFNUQVJUX1BHKSAqIDI1Nik7CisJaWYgKCFlaV9zdGF0dXMubWVtKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfcmVsZWFzZV9yZWdpb247CisJfQorCisJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyAoZWlfc3RhdHVzLnN0b3BfcGFnZSAtIFNUQVJUX1BHKSAqIDI1NjsKKworCXByaW50aygiLCBJUlEgJWQgbWVtb3J5ICUjbHgtJSNseC5cbiIsCisJZGV2LT5pcnEsIGRldi0+bWVtX3N0YXJ0LCBkZXYtPm1lbV9lbmQgLSAxKTsKKworCWVpX3N0YXR1cy5yZXNldF84MzkwID0gJnVsdHJhbWNhX3Jlc2V0XzgzOTA7CisJZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJnVsdHJhbWNhX2Jsb2NrX2lucHV0OworCWVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmdWx0cmFtY2FfYmxvY2tfb3V0cHV0OworCWVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmdWx0cmFtY2FfZ2V0XzgzOTBfaGRyOworCisJZWlfc3RhdHVzLnByaXYgPSBzbG90OworCisJZGV2LT5vcGVuID0gJnVsdHJhbWNhX29wZW47CisJZGV2LT5zdG9wID0gJnVsdHJhbWNhX2Nsb3NlX2NhcmQ7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CisjZW5kaWYKKworCU5TODM5MF9pbml0KGRldiwgMCk7CisKKwlyYyA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyYykKKwkJZ290byBlcnJfdW5tYXA7CisKKwlyZXR1cm4gMDsKKworZXJyX3VubWFwOgorCWlvdW5tYXAoZWlfc3RhdHVzLm1lbSk7CitlcnJfcmVsZWFzZV9yZWdpb246CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBVTFRSQV9JT19FWFRFTlQpOworZXJyX3VuY2xhaW06CisJbWNhX2RldmljZV9zZXRfY2xhaW0obWNhX2RldiwgMCk7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdWx0cmFtY2Ffb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciAtIFVMVFJBX05JQ19PRkZTRVQ7IC8qIEFTSUMgYWRkciAqLworCWludCByZXR2YWw7CisKKwlpZiAoKHJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBlaV9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSkpCisJCXJldHVybiByZXR2YWw7CisKKwlvdXRiKFVMVFJBX01FTUVOQiwgaW9hZGRyKTsgLyogRW5hYmxlIG1lbW9yeSAqLworCW91dGIoMHg4MCwgaW9hZGRyICsgNSk7ICAgICAvKiA/Pz8gKi8KKwlvdXRiKDB4MDEsIGlvYWRkciArIDYpOyAgICAgLyogRW5hYmxlIGludGVycnVwdHMgYW5kIG1lbW9yeS4gKi8KKwlvdXRiKDB4MDQsIGlvYWRkciArIDUpOyAgICAgLyogPz8/ICovCisKKwkvKiBTZXQgdGhlIGVhcmx5IHJlY2VpdmUgd2FybmluZyBsZXZlbCBpbiB3aW5kb3cgMCBoaWdoIGVub3VnaCBub3QKKwkgKiB0byByZWNlaXZlIEVSVyBpbnRlcnJ1cHRzLgorCSAqLworCisJLyogb3V0Yl9wKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTAsIGRldi0+YmFzZV9hZGRyKTsKKwkgKiBvdXRiKDB4ZmYsIGRldi0+YmFzZV9hZGRyICsgRU4wX0VSV0NOVCk7CisJICovCisKKwllaV9vcGVuKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVsdHJhbWNhX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIgLSBVTFRSQV9OSUNfT0ZGU0VUOyAvKiBBU0lDIGFkZHIgKi8KKworCW91dGIoVUxUUkFfUkVTRVQsIGlvYWRkcik7CisJaWYgKGVpX2RlYnVnID4gMSkKKwkJcHJpbnRrKCJyZXNldHRpbmcgVWx0cmEsIHQ9JWxkLi4uIiwgamlmZmllcyk7CisJZWlfc3RhdHVzLnR4aW5nID0gMDsKKworCW91dGIoMHg4MCwgaW9hZGRyICsgNSk7ICAgICAvKiA/Pz8gKi8KKwlvdXRiKDB4MDEsIGlvYWRkciArIDYpOyAgICAgLyogRW5hYmxlIGludGVycnVwdHMgYW5kIG1lbW9yeS4gKi8KKworCWlmIChlaV9kZWJ1ZyA+IDEpCisJCXByaW50aygicmVzZXQgZG9uZVxuIik7CisJcmV0dXJuOworfQorCisvKiBHcmFiIHRoZSA4MzkwIHNwZWNpZmljIGhlYWRlci4gU2ltaWxhciB0byB0aGUgYmxvY2tfaW5wdXQgcm91dGluZSwgYnV0CisgKiB3ZSBkb24ndCBuZWVkIHRvIGJlIGNvbmNlcm5lZCB3aXRoIHJpbmcgd3JhcCBhcyB0aGUgaGVhZGVyIHdpbGwgYmUgYXQKKyAqIHRoZSBzdGFydCBvZiBhIHBhZ2UsIHNvIHdlIG9wdGltaXplIGFjY29yZGluZ2x5LgorICovCisKK3N0YXRpYyB2b2lkIHVsdHJhbWNhX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQoreworCXZvaWQgX19pb21lbSAqaGRyX3N0YXJ0ID0gZWlfc3RhdHVzLm1lbSArICgocmluZ19wYWdlIC0gU1RBUlRfUEcpIDw8IDgpOworCisjaWZkZWYgbm90ZGVmCisJLyogT2ZmaWNpYWxseSB0aGlzIGlzIHdoYXQgd2UgYXJlIGRvaW5nLCBidXQgdGhlIHJlYWRsKCkgaXMgZmFzdGVyICovCisJbWVtY3B5X2Zyb21pbyhoZHIsIGhkcl9zdGFydCwgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSk7CisjZWxzZQorCSgodW5zaWduZWQgaW50KiloZHIpWzBdID0gcmVhZGwoaGRyX3N0YXJ0KTsKKyNlbmRpZgorfQorCisvKiBCbG9jayBpbnB1dCBhbmQgb3V0cHV0IGFyZSBlYXN5IG9uIHNoYXJlZCBtZW1vcnkgZXRoZXJjYXJkcywgdGhlIG9ubHkKKyAqIGNvbXBsaWNhdGlvbiBpcyB3aGVuIHRoZSByaW5nIGJ1ZmZlciB3cmFwcy4KKyAqLworCitzdGF0aWMgdm9pZCB1bHRyYW1jYV9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCkKK3sKKwl2b2lkIF9faW9tZW0gKnhmZXJfc3RhcnQgPSBlaV9zdGF0dXMubWVtICsgcmluZ19vZmZzZXQgLSBTVEFSVF9QRyAqIDI1NjsKKworCWlmIChyaW5nX29mZnNldCArIGNvdW50ID4gZWlfc3RhdHVzLnN0b3BfcGFnZSAqIDI1NikgeworCQkvKiBXZSBtdXN0IHdyYXAgdGhlIGlucHV0IG1vdmUuICovCisJCWludCBzZW1pX2NvdW50ID0gZWlfc3RhdHVzLnN0b3BfcGFnZSAqIDI1NiAtIHJpbmdfb2Zmc2V0OworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgeGZlcl9zdGFydCwgc2VtaV9jb3VudCk7CisJCWNvdW50IC09IHNlbWlfY291bnQ7CisJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhICsgc2VtaV9jb3VudCwgZWlfc3RhdHVzLm1lbSArIFRYX1BBR0VTICogMjU2LCBjb3VudCk7CisJfSBlbHNlIHsKKwkJLyogUGFja2V0IGlzIGluIG9uZSBjaHVuayAtLSB3ZSBjYW4gY29weSArIGNrc3VtLiAqLworCQlldGhfaW9fY29weV9hbmRfc3VtKHNrYiwgeGZlcl9zdGFydCwgY291bnQsIDApOworCX0KKworfQorCitzdGF0aWMgdm9pZCB1bHRyYW1jYV9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3BhZ2UpCit7CisJdm9pZCBfX2lvbWVtICpzaG1lbSA9IGVpX3N0YXR1cy5tZW0gKyAoKHN0YXJ0X3BhZ2UgLSBTVEFSVF9QRykgPDwgOCk7CisKKwltZW1jcHlfdG9pbyhzaG1lbSwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgdWx0cmFtY2FfY2xvc2VfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciAtIFVMVFJBX05JQ19PRkZTRVQ7IC8qIEFTSUMgYWRkciAqLworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCWlmIChlaV9kZWJ1ZyA+IDEpCisJCXByaW50aygiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKKworCW91dGIoMHgwMCwgaW9hZGRyICsgNik7ICAgICAvKiBEaXNhYmxlIGludGVycnVwdHMuICovCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlOUzgzOTBfaW5pdChkZXYsIDApOworCS8qIFdlIHNob3VsZCBzb21lZGF5IGRpc2FibGUgc2hhcmVkIG1lbW9yeSBhbmQgY2hhbmdlIHRvIDgtYml0IG1vZGUKKyAgICAgICAgICogImp1c3QgaW4gY2FzZSIuLi4KKwkgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVsdHJhbWNhX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpnZW5fZGV2KQoreworCXN0cnVjdCBtY2FfZGV2aWNlICptY2FfZGV2ID0gdG9fbWNhX2RldmljZShnZW5fZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZ2VuX2Rldi0+ZHJpdmVyX2RhdGE7CisKKwlpZiAoZGV2KSB7CisJCS8qIE5COiB1bHRyYV9jbG9zZV9jYXJkKCkgZG9lcyBmcmVlX2lycSAqLworCQlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIgLSBVTFRSQV9OSUNfT0ZGU0VUOworCisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCW1jYV9kZXZpY2Vfc2V0X2NsYWltKG1jYV9kZXYsIDApOworCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIFVMVFJBX0lPX0VYVEVOVCk7CisJCWlvdW5tYXAoZWlfc3RhdHVzLm1lbSk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbWNhX2RyaXZlciB1bHRyYV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlID0gc21jX21jYV9hZGFwdGVyX2lkcywKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJzbWMtbWNhIiwKKwkJLmJ1cyA9ICZtY2FfYnVzX3R5cGUsCisJCS5wcm9iZSA9IHVsdHJhbWNhX3Byb2JlLAorCQkucmVtb3ZlID0gdWx0cmFtY2FfcmVtb3ZlLAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHVsdHJhbWNhX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaWYoIU1DQV9idXMpCisJCXJldHVybiAtRU5YSU87CisKKwltY2FfcmVnaXN0ZXJfZHJpdmVyKCZ1bHRyYV9kcml2ZXIpOworCisJcmV0dXJuIHVsdHJhX2ZvdW5kID8gMCA6IC1FTlhJTzsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVsdHJhbWNhX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJbWNhX3VucmVnaXN0ZXJfZHJpdmVyKCZ1bHRyYV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQodWx0cmFtY2FfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQodWx0cmFtY2FfY2xlYW51cF9tb2R1bGUpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWMtbWNhLmggYi9kcml2ZXJzL25ldC9zbWMtbWNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1MDExN2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zbWMtbWNhLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIGRqd2VpcyB3ZWlzZDM0NThAdW5pLmVkdQorICogbW9zdCBvZiB0aGlzIGZpbGUgd2FzIHRha2VuIGZyb20gcHMyZXNkaS5oCisgKi8KKworc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGJhc2VfYWRkcjsKK30gYWRkcl90YWJsZVtdID0geworICAgIHsgMHgwODAwIH0sCisgICAgeyAweDE4MDAgfSwKKyAgICB7IDB4MjgwMCB9LAorICAgIHsgMHgzODAwIH0sCisgICAgeyAweDQ4MDAgfSwKKyAgICB7IDB4NTgwMCB9LAorICAgIHsgMHg2ODAwIH0sCisgICAgeyAweDc4MDAgfSwKKyAgICB7IDB4ODgwMCB9LAorICAgIHsgMHg5ODAwIH0sCisgICAgeyAweGE4MDAgfSwKKyAgICB7IDB4YjgwMCB9LAorICAgIHsgMHhjODAwIH0sCisgICAgeyAweGQ4MDAgfSwKKyAgICB7IDB4ZTgwMCB9LAorICAgIHsgMHhmODAwIH0KK307CisKKyNkZWZpbmUgTUVNX01BU0sgNjQKKworc3RydWN0IHsKKyAgdW5zaWduZWQgY2hhciBtZW1faW5kZXg7CisgIHVuc2lnbmVkIGxvbmcgbWVtX3N0YXJ0OworICB1bnNpZ25lZCBjaGFyIG51bV9wYWdlczsKK30gbWVtX3RhYmxlW10gPSB7CisgICAgeyAxNiwgMHgwYzAwMDAsIDQwIH0sCisgICAgeyAxOCwgMHgwYzQwMDAsIDQwIH0sCisgICAgeyAyMCwgMHgwYzgwMDAsIDQwIH0sCisgICAgeyAyMiwgMHgwY2MwMDAsIDQwIH0sCisgICAgeyAyNCwgMHgwZDAwMDAsIDQwIH0sCisgICAgeyAyNiwgMHgwZDQwMDAsIDQwIH0sCisgICAgeyAyOCwgMHgwZDgwMDAsIDQwIH0sCisgICAgeyAzMCwgMHgwZGMwMDAsIDQwIH0sCisgICAgezE0NCwgMHhmYzAwMDAsIDQwIH0sCisgICAgezE0OCwgMHhmYzgwMDAsIDQwIH0sCisgICAgezE1NCwgMHhmZDAwMDAsIDQwIH0sCisgICAgezE1NiwgMHhmZDgwMDAsIDQwIH0sCisgICAgeyAgMCwgMHgwYzAwMDAsIDIwIH0sCisgICAgeyAgMSwgMHgwYzIwMDAsIDIwIH0sCisgICAgeyAgMiwgMHgwYzQwMDAsIDIwIH0sCisgICAgeyAgMywgMHgwYzYwMDAsIDIwIH0KK307CisKKyNkZWZpbmUgSVJRX01BU0sgMjQzCitzdHJ1Y3QgeworICAgdW5zaWduZWQgY2hhciBuZXdfaXJxOworICAgdW5zaWduZWQgY2hhciBvbGRfaXJxOworfSBpcnFfdGFibGVbXSA9IHsKKyAgIHsgIDMsICAzIH0sCisgICB7ICA0LCAgNCB9LAorICAgeyAxMCwgMTAgfSwKKyAgIHsgMTQsIDE1IH0KK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWMtdWx0cmEuYyBiL2RyaXZlcnMvbmV0L3NtYy11bHRyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NjRjNjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zbWMtdWx0cmEuYwpAQCAtMCwwICsxLDYxNSBAQAorLyogc21jLXVsdHJhLmM6IEEgU01DIFVsdHJhIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXguICovCisvKgorCVRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBTTUMgVWx0cmEgYW5kIFNNQyBFdGhlckVaIElTQSBldGhlcmNhcmRzLgorCisJV3JpdHRlbiAxOTkzLTE5OTggYnkgRG9uYWxkIEJlY2tlci4KKworCUNvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKwlEaXJlY3RvciwgTmF0aW9uYWwgU2VjdXJpdHkgQWdlbmN5LgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKwlUaGlzIGRyaXZlciB1c2VzIHRoZSBjYXJkcyBpbiB0aGUgODM5MC1jb21wYXRpYmxlIG1vZGUuCisJTW9zdCBvZiB0aGUgcnVuLXRpbWUgY29tcGxleGl0eSBpcyBoYW5kbGVkIGJ5IHRoZSBnZW5lcmljIGNvZGUgaW4KKwk4MzkwLmMuICBUaGUgY29kZSBpbiB0aGlzIGZpbGUgaXMgcmVzcG9uc2libGUgZm9yCisKKwkJdWx0cmFfcHJvYmUoKQkgCURldGVjdGluZyBhbmQgaW5pdGlhbGl6aW5nIHRoZSBjYXJkLgorCQl1bHRyYV9wcm9iZTEoKQorCQl1bHRyYV9wcm9iZV9pc2FwbnAoKQorCisJCXVsdHJhX29wZW4oKQkJVGhlIGNhcmQtc3BlY2lmaWMgZGV0YWlscyBvZiBzdGFydGluZywgc3RvcHBpbmcKKwkJdWx0cmFfcmVzZXRfODM5MCgpCWFuZCByZXNldHRpbmcgdGhlIDgzOTAgTklDIGNvcmUuCisJCXVsdHJhX2Nsb3NlKCkKKworCQl1bHRyYV9ibG9ja19pbnB1dCgpCQlSb3V0aW5lcyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBibG9ja3Mgb2YKKwkJdWx0cmFfYmxvY2tfb3V0cHV0KCkJcGFja2V0IGJ1ZmZlciBtZW1vcnkuCisJCXVsdHJhX3Bpb19pbnB1dCgpCisJCXVsdHJhX3Bpb19vdXRwdXQoKQorCisJVGhpcyBkcml2ZXIgZW5hYmxlcyB0aGUgc2hhcmVkIG1lbW9yeSBvbmx5IHdoZW4gZG9pbmcgdGhlIGFjdHVhbCBkYXRhCisJdHJhbnNmZXJzIHRvIGF2b2lkIGEgYnVnIGluIGVhcmx5IHZlcnNpb24gb2YgdGhlIGNhcmQgdGhhdCBjb3JydXB0ZWQKKwlkYXRhIHRyYW5zZmVycmVkIGJ5IGEgQUhBMTU0Mi4KKworCVRoaXMgZHJpdmVyIG5vdyBzdXBwb3J0cyB0aGUgcHJvZ3JhbW1lZC1JL08gKFBJTykgZGF0YSB0cmFuc2ZlciBtb2RlIG9mCisJdGhlIEV0aGVyRVouIEl0IGRvZXMgbm90IHVzZSB0aGUgbm9uLTgzOTAtY29tcGF0aWJsZSAiQWx0ZWdvIiBtb2RlLgorCVRoYXQgc3VwcG9ydCAoaWYgYXZhaWxhYmxlKSBpcyBpbiBzbWMtZXouYy4KKworCUNoYW5nZWxvZzoKKworCVBhdWwgR29ydG1ha2VyCTogbXVsdGlwbGUgY2FyZCBzdXBwb3J0IGZvciBtb2R1bGUgdXNlcnMuCisJRG9uYWxkIEJlY2tlcgk6IDQvMTcvOTYgUElPIHN1cHBvcnQsIG1pbm9yIHBvdGVudGlhbCBwcm9ibGVtcyBhdm9pZGVkLgorCURvbmFsZCBCZWNrZXIJOiA2LzYvOTYgY29ycmVjdGx5IHNldCBhdXRvLXdyYXAgYml0LgorCUFsZXhhbmRlciBTb3Rpcm92IDogMS8yMC8wMSBBZGRlZCBzdXBwb3J0IGZvciBJU0FQblAgY2FyZHMKKworCU5vdGUgYWJvdXQgdGhlIElTQSBQblAgc3VwcG9ydDoKKworCVRoaXMgZHJpdmVyIGNhbiBub3QgYXV0b3Byb2JlIGZvciBtb3JlIHRoYW4gb25lIFNNQyBFdGhlckVaIFBuUCBjYXJkLgorCVlvdSBoYXZlIHRvIGNvbmZpZ3VyZSB0aGUgc2Vjb25kIGNhcmQgbWFudWFsbHkgdGhyb3VnaCB0aGUgL3Byb2MvaXNhcG5wCisJaW50ZXJmYWNlIGFuZCB0aGVuIGxvYWQgdGhlIG1vZHVsZSB3aXRoIGFuIGV4cGxpY2l0IGlvPTB4X19fIG9wdGlvbi4KKyovCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9CisJInNtYy11bHRyYS5jOnYyLjAyIDIvMy85OCBEb25hbGQgQmVja2VyIChiZWNrZXJAY2VzZGlzLmdzZmMubmFzYS5nb3YpXG4iOworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXNhcG5wLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgIjgzOTAuaCIKKworI2RlZmluZSBEUlZfTkFNRSAic21jLXVsdHJhIgorCisvKiBBIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIEkvTyBhZGRyZXNzZXMgdG8gYmUgcHJvYmVkLiAqLworc3RhdGljIHVuc2lnbmVkIGludCB1bHRyYV9wb3J0bGlzdFtdIF9faW5pdGRhdGEgPQorezB4MjAwLCAweDIyMCwgMHgyNDAsIDB4MjgwLCAweDMwMCwgMHgzNDAsIDB4MzgwLCAwfTsKKworc3RhdGljIGludCB1bHRyYV9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcik7CisKKyNpZmRlZiBfX0lTQVBOUF9fCitzdGF0aWMgaW50IHVsdHJhX3Byb2JlX2lzYXBucChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorCitzdGF0aWMgaW50IHVsdHJhX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB1bHRyYV9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgdWx0cmFfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsCisJCQkJCQlpbnQgcmluZ19wYWdlKTsKK3N0YXRpYyB2b2lkIHVsdHJhX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIHVsdHJhX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBjb25zdCBpbnQgc3RhcnRfcGFnZSk7CitzdGF0aWMgdm9pZCB1bHRyYV9waW9fZ2V0X2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLAorCQkJCQkJaW50IHJpbmdfcGFnZSk7CitzdGF0aWMgdm9pZCB1bHRyYV9waW9faW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQgdWx0cmFfcGlvX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgY29uc3QgaW50IHN0YXJ0X3BhZ2UpOworc3RhdGljIGludCB1bHRyYV9jbG9zZV9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisjaWZkZWYgX19JU0FQTlBfXworc3RhdGljIHN0cnVjdCBpc2FwbnBfZGV2aWNlX2lkIHVsdHJhX2RldmljZV9pZHNbXSBfX2luaXRkYXRhID0geworICAgICAgICB7ICAgICAgIElTQVBOUF9WRU5ET1IoJ1MnLCdNJywnQycpLCBJU0FQTlBfRlVOQ1RJT04oMHg4NDE2KSwKKyAgICAgICAgICAgICAgICBJU0FQTlBfVkVORE9SKCdTJywnTScsJ0MnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4ODQxNiksCisgICAgICAgICAgICAgICAgKGxvbmcpICJTTUMgRXRoZXJFWiAoODQxNikiIH0sCisgICAgICAgIHsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpc2FwbnAsIHVsdHJhX2RldmljZV9pZHMpOworI2VuZGlmCisKKwwKKyNkZWZpbmUgU1RBUlRfUEcJCTB4MDAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKworI2RlZmluZSBVTFRSQV9DTURSRUcJMAkJLyogT2Zmc2V0IHRvIEFTSUMgY29tbWFuZCByZWdpc3Rlci4gKi8KKyNkZWZpbmUJIFVMVFJBX1JFU0VUCTB4ODAJLyogQm9hcmQgcmVzZXQsIGluIFVMVFJBX0NNRFJFRy4gKi8KKyNkZWZpbmUJIFVMVFJBX01FTUVOQgkweDQwCS8qIEVuYWJsZSB0aGUgc2hhcmVkIG1lbW9yeS4gKi8KKyNkZWZpbmUgSU9QRAkweDAyCQkJLyogSS9PIFBpcGUgRGF0YSAoMTYgYml0cyksIFBJTyBvcGVyYXRpb24uICovCisjZGVmaW5lIElPUEEJMHgwNwkJCS8qIEkvTyBQaXBlIEFkZHJlc3MgZm9yIFBJTyBvcGVyYXRpb24uICovCisjZGVmaW5lIFVMVFJBX05JQ19PRkZTRVQgIDE2CS8qIE5JQyByZWdpc3RlciBvZmZzZXQgZnJvbSB0aGUgYmFzZV9hZGRyLiAqLworI2RlZmluZSBVTFRSQV9JT19FWFRFTlQgMzIKKyNkZWZpbmUgRU4wX0VSV0NOVAkJMHgwOAkvKiBFYXJseSByZWNlaXZlIHdhcm5pbmcgY291bnQuICovCisMCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIHVsdHJhX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJZWlfaW50ZXJydXB0KGRldi0+aXJxLCBkZXYsIE5VTEwpOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworfQorI2VuZGlmCisvKglQcm9iZSBmb3IgdGhlIFVsdHJhLiAgVGhpcyBsb29rcyBsaWtlIGEgODAxMyB3aXRoIHRoZSBzdGF0aW9uCisJYWRkcmVzcyBQUk9NIGF0IEkvTyBwb3J0cyA8YmFzZT4rOCB0byA8YmFzZT4rMTMsIHdpdGggYSBjaGVja3N1bQorCWZvbGxvd2luZy4KKyovCisKK3N0YXRpYyBpbnQgX19pbml0IGRvX3VsdHJhX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJaW50IGJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpcnEgPSBkZXYtPmlycTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSAmdWx0cmFfcG9sbDsKKyNlbmRpZgorCWlmIChiYXNlX2FkZHIgPiAweDFmZikJCS8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KKwkJcmV0dXJuIHVsdHJhX3Byb2JlMShkZXYsIGJhc2VfYWRkcik7CisJZWxzZSBpZiAoYmFzZV9hZGRyICE9IDApCS8qIERvbid0IHByb2JlIGF0IGFsbC4gKi8KKwkJcmV0dXJuIC1FTlhJTzsKKworI2lmZGVmIF9fSVNBUE5QX18KKwkvKiBMb29rIGZvciBhbnkgaW5zdGFsbGVkIElTQVBuUCBjYXJkcyAqLworCWlmIChpc2FwbnBfcHJlc2VudCgpICYmICh1bHRyYV9wcm9iZV9pc2FwbnAoZGV2KSA9PSAwKSkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IHVsdHJhX3BvcnRsaXN0W2ldOyBpKyspIHsKKwkJZGV2LT5pcnEgPSBpcnE7CisJCWlmICh1bHRyYV9wcm9iZTEoZGV2LCB1bHRyYV9wb3J0bGlzdFtpXSkgPT0gMCkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBOQjogdWx0cmFfY2xvc2VfY2FyZCgpIGRvZXMgZnJlZV9pcnEgKi8KKyNpZmRlZiBfX0lTQVBOUF9fCisJc3RydWN0IHBucF9kZXYgKmlkZXYgPSAoc3RydWN0IHBucF9kZXYgKillaV9zdGF0dXMucHJpdjsKKwlpZiAoaWRldikKKwkJcG5wX2RldmljZV9kZXRhY2goaWRldik7CisjZW5kaWYKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciAtIFVMVFJBX05JQ19PRkZTRVQsIFVMVFJBX0lPX0VYVEVOVCk7CisJaW91bm1hcChlaV9zdGF0dXMubWVtKTsKK30KKworI2lmbmRlZiBNT0RVTEUKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IHVsdHJhX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKwlpbnQgZXJyOworCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisKKwllcnIgPSBkb191bHRyYV9wcm9iZShkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlyZXR1cm4gZGV2Oworb3V0MToKKwljbGVhbnVwX2NhcmQoZGV2KTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgdWx0cmFfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpCit7CisJaW50IGksIHJldHZhbDsKKwlpbnQgY2hlY2tzdW0gPSAwOworCWNvbnN0IGNoYXIgKm1vZGVsX25hbWU7CisJdW5zaWduZWQgY2hhciBlZXByb21faXJxID0gMDsKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCS8qIFZhbHVlcyBmcm9tIHZhcmlvdXMgY29uZmlnIHJlZ3MuICovCisJdW5zaWduZWQgY2hhciBudW1fcGFnZXMsIGlycXJlZywgYWRkciwgcGlvbW9kZTsKKwl1bnNpZ25lZCBjaGFyIGlkcmVnID0gaW5iKGlvYWRkciArIDcpOworCXVuc2lnbmVkIGNoYXIgcmVnNCA9IGluYihpb2FkZHIgKyA0KSAmIDB4N2Y7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgVUxUUkFfSU9fRVhURU5ULCBEUlZfTkFNRSkpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBDaGVjayB0aGUgSUQgbmliYmxlLiAqLworCWlmICgoaWRyZWcgJiAweEYwKSAhPSAweDIwIAkJCS8qIFNNQyBVbHRyYSAqLworCQkmJiAoaWRyZWcgJiAweEYwKSAhPSAweDQwKSB7CQkvKiBTTUMgRXRoZXJFWiAqLworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTZWxlY3QgdGhlIHN0YXRpb24gYWRkcmVzcyByZWdpc3RlciBzZXQuICovCisJb3V0YihyZWc0LCBpb2FkZHIgKyA0KTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWNoZWNrc3VtICs9IGluYihpb2FkZHIgKyA4ICsgaSk7CisJaWYgKChjaGVja3N1bSAmIDB4ZmYpICE9IDB4RkYpIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGVpX2RlYnVnICAmJiAgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKHZlcnNpb24pOworCisJbW9kZWxfbmFtZSA9IChpZHJlZyAmIDB4RjApID09IDB4MjAgPyAiU01DIFVsdHJhIiA6ICJTTUMgRXRoZXJFWiI7CisKKwlwcmludGsoIiVzOiAlcyBhdCAlIzN4LCIsIGRldi0+bmFtZSwgbW9kZWxfbmFtZSwgaW9hZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiICUyLjJYIiwgZGV2LT5kZXZfYWRkcltpXSA9IGluYihpb2FkZHIgKyA4ICsgaSkpOworCisJLyogU3dpdGNoIGZyb20gdGhlIHN0YXRpb24gYWRkcmVzcyB0byB0aGUgYWx0ZXJuYXRlIHJlZ2lzdGVyIHNldCBhbmQKKwkgICByZWFkIHRoZSB1c2VmdWwgcmVnaXN0ZXJzIHRoZXJlLiAqLworCW91dGIoMHg4MCB8IHJlZzQsIGlvYWRkciArIDQpOworCisJLyogRW5hYmxlZCBGSU5FMTYgbW9kZSB0byBhdm9pZCBCSU9TIFJPTSB3aWR0aCBtaXNtYXRjaGVzIEAgcmVib290LiAqLworCW91dGIoMHg4MCB8IGluYihpb2FkZHIgKyAweDBjKSwgaW9hZGRyICsgMHgwYyk7CisJcGlvbW9kZSA9IGluYihpb2FkZHIgKyAweDgpOworCWFkZHIgPSBpbmIoaW9hZGRyICsgMHhiKTsKKwlpcnFyZWcgPSBpbmIoaW9hZGRyICsgMHhkKTsKKworCS8qIFN3aXRjaCBiYWNrIHRvIHRoZSBzdGF0aW9uIGFkZHJlc3MgcmVnaXN0ZXIgc2V0IHNvIHRoYXQgdGhlIE1TLURPUyBkcml2ZXIKKwkgICBjYW4gZmluZCB0aGUgY2FyZCBhZnRlciBhIHdhcm0gYm9vdC4gKi8KKwlvdXRiKHJlZzQsIGlvYWRkciArIDQpOworCisJaWYgKGRldi0+aXJxIDwgMikgeworCQl1bnNpZ25lZCBjaGFyIGlycW1hcFtdID0gezAsIDksIDMsIDUsIDcsIDEwLCAxMSwgMTV9OworCQlpbnQgaXJxOworCisJCS8qIFRoZSBJUlEgYml0cyBhcmUgc3BsaXQuICovCisJCWlycSA9IGlycW1hcFsoKGlycXJlZyAmIDB4NDApID4+IDQpICsgKChpcnFyZWcgJiAweDBjKSA+PiAyKV07CisKKwkJaWYgKGlycSA9PSAwKSB7CisJCQlwcmludGsoIiwgZmFpbGVkIHRvIGRldGVjdCBJUlEgbGluZS5cbiIpOworCQkJcmV0dmFsID0gIC1FQUdBSU47CisJCQlnb3RvIG91dDsKKwkJfQorCQlkZXYtPmlycSA9IGlycTsKKwkJZWVwcm9tX2lycSA9IDE7CisJfQorCisJLyogVGhlIDgzOTAgaXNuJ3QgYXQgdGhlIGJhc2UgYWRkcmVzcywgc28gZmFrZSB0aGUgb2Zmc2V0ICovCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHIrVUxUUkFfTklDX09GRlNFVDsKKworCXsKKwkJaW50IGFkZHJfdGJsWzRdID0gezB4MEMwMDAwLCAweDBFMDAwMCwgMHhGQzAwMDAsIDB4RkUwMDAwfTsKKwkJc2hvcnQgbnVtX3BhZ2VzX3RibFs0XSA9IHsweDIwLCAweDQwLCAweDgwLCAweGZmfTsKKworCQlkZXYtPm1lbV9zdGFydCA9ICgoYWRkciAmIDB4MGYpIDw8IDEzKSArIGFkZHJfdGJsWyhhZGRyID4+IDYpICYgM10gOworCQludW1fcGFnZXMgPSBudW1fcGFnZXNfdGJsWyhhZGRyID4+IDQpICYgM107CisJfQorCisJZWlfc3RhdHVzLm5hbWUgPSBtb2RlbF9uYW1lOworCWVpX3N0YXR1cy53b3JkMTYgPSAxOworCWVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gU1RBUlRfUEc7CisJZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPSBTVEFSVF9QRyArIFRYX1BBR0VTOworCWVpX3N0YXR1cy5zdG9wX3BhZ2UgPSBudW1fcGFnZXM7CisKKwllaV9zdGF0dXMubWVtID0gaW9yZW1hcChkZXYtPm1lbV9zdGFydCwgKGVpX3N0YXR1cy5zdG9wX3BhZ2UgLSBTVEFSVF9QRykqMjU2KTsKKwlpZiAoIWVpX3N0YXR1cy5tZW0pIHsKKwkJcHJpbnRrKCIsIGZhaWxlZCB0byBpb3JlbWFwLlxuIik7CisJCXJldHZhbCA9ICAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlkZXYtPm1lbV9lbmQgPSBkZXYtPm1lbV9zdGFydCArIChlaV9zdGF0dXMuc3RvcF9wYWdlIC0gU1RBUlRfUEcpKjI1NjsKKworCWlmIChwaW9tb2RlKSB7CisJCXByaW50aygiLCVzIElSUSAlZCBwcm9ncmFtbWVkLUkvTyBtb2RlLlxuIiwKKwkJCSAgIGVlcHJvbV9pcnEgPyAiRUVQUk9NIiA6ICJhc3NpZ25lZCAiLCBkZXYtPmlycSk7CisJCWVpX3N0YXR1cy5ibG9ja19pbnB1dCA9ICZ1bHRyYV9waW9faW5wdXQ7CisJCWVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmdWx0cmFfcGlvX291dHB1dDsKKwkJZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZ1bHRyYV9waW9fZ2V0X2hkcjsKKwl9IGVsc2UgeworCQlwcmludGsoIiwlcyBJUlEgJWQgbWVtb3J5ICUjbHgtJSNseC5cbiIsIGVlcHJvbV9pcnEgPyAiIiA6ICJhc3NpZ25lZCAiLAorCQkJICAgZGV2LT5pcnEsIGRldi0+bWVtX3N0YXJ0LCBkZXYtPm1lbV9lbmQtMSk7CisJCWVpX3N0YXR1cy5ibG9ja19pbnB1dCA9ICZ1bHRyYV9ibG9ja19pbnB1dDsKKwkJZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZ1bHRyYV9ibG9ja19vdXRwdXQ7CisJCWVpX3N0YXR1cy5nZXRfODM5MF9oZHIgPSAmdWx0cmFfZ2V0XzgzOTBfaGRyOworCX0KKwllaV9zdGF0dXMucmVzZXRfODM5MCA9ICZ1bHRyYV9yZXNldF84MzkwOworCWRldi0+b3BlbiA9ICZ1bHRyYV9vcGVuOworCWRldi0+c3RvcCA9ICZ1bHRyYV9jbG9zZV9jYXJkOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlaV9wb2xsOworI2VuZGlmCisJTlM4MzkwX2luaXQoZGV2LCAwKTsKKworCXJldHVybiAwOworb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgVUxUUkFfSU9fRVhURU5UKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisjaWZkZWYgX19JU0FQTlBfXworc3RhdGljIGludCBfX2luaXQgdWx0cmFfcHJvYmVfaXNhcG5wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IHVsdHJhX2RldmljZV9pZHNbaV0udmVuZG9yICE9IDA7IGkrKykgeworCQlzdHJ1Y3QgcG5wX2RldiAqaWRldiA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGlkZXYgPSBwbnBfZmluZF9kZXYoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWx0cmFfZGV2aWNlX2lkc1tpXS52ZW5kb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsdHJhX2RldmljZV9pZHNbaV0uZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZXYpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogQXZvaWQgYWxyZWFkeSBmb3VuZCBjYXJkcyBmcm9tIHByZXZpb3VzIGNhbGxzICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG5wX2RldmljZV9hdHRhY2goaWRldikgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgCWNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBucF9hY3RpdmF0ZV9kZXYoaWRldikgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2FnYWluOgorICAgICAgICAgICAgICAgICAgICAgICAgCXBucF9kZXZpY2VfZGV0YWNoKGlkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgCWNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJLyogaWYgbm8gaW8gYW5kIGlycSwgc2VhcmNoIGZvciBuZXh0ICovCisJCQlpZiAoIXBucF9wb3J0X3ZhbGlkKGlkZXYsIDApIHx8ICFwbnBfaXJxX3ZhbGlkKGlkZXYsIDApKQorCQkJCWdvdG8gX19hZ2FpbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvdW5kIGl0ICovCisJCQlkZXYtPmJhc2VfYWRkciA9IHBucF9wb3J0X3N0YXJ0KGlkZXYsIDApOworCQkJZGV2LT5pcnEgPSBwbnBfaXJxKGlkZXYsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAic21jLXVsdHJhLmM6IElTQVBuUCByZXBvcnRzICVzIGF0IGkvbyAlI2x4LCBpcnEgJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSB1bHRyYV9kZXZpY2VfaWRzW2ldLmRyaXZlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVsdHJhX3Byb2JlMShkZXYsIGRldi0+YmFzZV9hZGRyKSAhPSAwKSB7ICAgICAgLyogU2hvdWxkbid0IGhhcHBlbi4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJzbWMtdWx0cmEuYzogUHJvYmUgb2YgSVNBUG5QIGNhcmQgYXQgJSNseCBmYWlsZWQuXG4iLCBkZXYtPmJhc2VfYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBucF9kZXZpY2VfZGV0YWNoKGlkZXYpOworCQkJCXJldHVybiAtRU5YSU87CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlaV9zdGF0dXMucHJpdiA9ICh1bnNpZ25lZCBsb25nKWlkZXY7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFpZGV2KQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gLUVOT0RFVjsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50Cit1bHRyYV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJldHZhbDsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIgLSBVTFRSQV9OSUNfT0ZGU0VUOyAvKiBBU0lDIGFkZHIgKi8KKwl1bnNpZ25lZCBjaGFyIGlycTJyZWdbXSA9IHswLCAwLCAweDA0LCAweDA4LCAwLCAweDBDLCAwLCAweDQwLAorCQkJCSAgIDAsIDB4MDQsIDB4NDQsIDB4NDgsIDAsIDAsIDAsIDB4NEMsIH07CisKKwlyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgZWlfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCW91dGIoMHgwMCwgaW9hZGRyKTsJLyogRGlzYWJsZSBzaGFyZWQgbWVtb3J5IGZvciBzYWZldHkuICovCisJb3V0YigweDgwLCBpb2FkZHIgKyA1KTsKKwkvKiBTZXQgdGhlIElSUSBsaW5lLiAqLworCW91dGIoaW5iKGlvYWRkciArIDQpIHwgMHg4MCwgaW9hZGRyICsgNCk7CisJb3V0YigoaW5iKGlvYWRkciArIDEzKSAmIH4weDRDKSB8IGlycTJyZWdbZGV2LT5pcnFdLCBpb2FkZHIgKyAxMyk7CisJb3V0YihpbmIoaW9hZGRyICsgNCkgJiAweDdmLCBpb2FkZHIgKyA0KTsKKworCWlmIChlaV9zdGF0dXMuYmxvY2tfaW5wdXQgPT0gJnVsdHJhX3Bpb19pbnB1dCkgeworCQlvdXRiKDB4MTEsIGlvYWRkciArIDYpOwkJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIFBJTy4gKi8KKwkJb3V0YigweDAxLCBpb2FkZHIgKyAweDE5KTsgIAkvKiBFbmFibGUgcmluZyByZWFkIGF1dG8td3JhcC4gKi8KKwl9IGVsc2UKKwkJb3V0YigweDAxLCBpb2FkZHIgKyA2KTsJCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCBtZW1vcnkuICovCisJLyogU2V0IHRoZSBlYXJseSByZWNlaXZlIHdhcm5pbmcgbGV2ZWwgaW4gd2luZG93IDAgaGlnaCBlbm91Z2ggbm90CisJICAgdG8gcmVjZWl2ZSBFUlcgaW50ZXJydXB0cy4gKi8KKwlvdXRiX3AoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTAsIGRldi0+YmFzZV9hZGRyKTsKKwlvdXRiKDB4ZmYsIGRldi0+YmFzZV9hZGRyICsgRU4wX0VSV0NOVCk7CisJZWlfb3BlbihkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAordWx0cmFfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBjbWRfcG9ydCA9IGRldi0+YmFzZV9hZGRyIC0gVUxUUkFfTklDX09GRlNFVDsgLyogQVNJQyBiYXNlIGFkZHIgKi8KKworCW91dGIoVUxUUkFfUkVTRVQsIGNtZF9wb3J0KTsKKwlpZiAoZWlfZGVidWcgPiAxKSBwcmludGsoInJlc2V0dGluZyBVbHRyYSwgdD0lbGQuLi4iLCBqaWZmaWVzKTsKKwllaV9zdGF0dXMudHhpbmcgPSAwOworCisJb3V0YigweDAwLCBjbWRfcG9ydCk7CS8qIERpc2FibGUgc2hhcmVkIG1lbW9yeSBmb3Igc2FmZXR5LiAqLworCW91dGIoMHg4MCwgY21kX3BvcnQgKyA1KTsKKwlpZiAoZWlfc3RhdHVzLmJsb2NrX2lucHV0ID09ICZ1bHRyYV9waW9faW5wdXQpCisJCW91dGIoMHgxMSwgY21kX3BvcnQgKyA2KTsJCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCBQSU8uICovCisJZWxzZQorCQlvdXRiKDB4MDEsIGNtZF9wb3J0ICsgNik7CQkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgbWVtb3J5LiAqLworCisJaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCJyZXNldCBkb25lXG4iKTsKKwlyZXR1cm47Cit9CisKKy8qIEdyYWIgdGhlIDgzOTAgc3BlY2lmaWMgaGVhZGVyLiBTaW1pbGFyIHRvIHRoZSBibG9ja19pbnB1dCByb3V0aW5lLCBidXQKKyAgIHdlIGRvbid0IG5lZWQgdG8gYmUgY29uY2VybmVkIHdpdGggcmluZyB3cmFwIGFzIHRoZSBoZWFkZXIgd2lsbCBiZSBhdAorICAgdGhlIHN0YXJ0IG9mIGEgcGFnZSwgc28gd2Ugb3B0aW1pemUgYWNjb3JkaW5nbHkuICovCisKK3N0YXRpYyB2b2lkCit1bHRyYV9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSkKK3sKKwl2b2lkIF9faW9tZW0gKmhkcl9zdGFydCA9IGVpX3N0YXR1cy5tZW0gKyAoKHJpbmdfcGFnZSAtIFNUQVJUX1BHKTw8OCk7CisKKwlvdXRiKFVMVFJBX01FTUVOQiwgZGV2LT5iYXNlX2FkZHIgLSBVTFRSQV9OSUNfT0ZGU0VUKTsJLyogc2htZW0gb24gKi8KKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkvKiBPZmZpY2lhbGx5IHRoaXMgaXMgd2hhdCB3ZSBhcmUgZG9pbmcsIGJ1dCB0aGUgcmVhZGwoKSBpcyBmYXN0ZXIgKi8KKwkvKiB1bmZvcnR1bmF0ZWx5IGl0IGlzbid0IGVuZGlhbiBhd2FyZSBvZiB0aGUgc3RydWN0ICAgICAgICAgICAgICAgKi8KKwltZW1jcHlfZnJvbWlvKGhkciwgaGRyX3N0YXJ0LCBzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpKTsKKwloZHItPmNvdW50ID0gbGUxNl90b19jcHUoaGRyLT5jb3VudCk7CisjZWxzZQorCSgodW5zaWduZWQgaW50KiloZHIpWzBdID0gcmVhZGwoaGRyX3N0YXJ0KTsKKyNlbmRpZgorCW91dGIoMHgwMCwgZGV2LT5iYXNlX2FkZHIgLSBVTFRSQV9OSUNfT0ZGU0VUKTsgLyogc2htZW0gb2ZmICovCit9CisKKy8qIEJsb2NrIGlucHV0IGFuZCBvdXRwdXQgYXJlIGVhc3kgb24gc2hhcmVkIG1lbW9yeSBldGhlcmNhcmRzLCB0aGUgb25seQorICAgY29tcGxpY2F0aW9uIGlzIHdoZW4gdGhlIHJpbmcgYnVmZmVyIHdyYXBzLiAqLworCitzdGF0aWMgdm9pZAordWx0cmFfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpCit7CisJdm9pZCBfX2lvbWVtICp4ZmVyX3N0YXJ0ID0gZWlfc3RhdHVzLm1lbSArIHJpbmdfb2Zmc2V0IC0gKFNUQVJUX1BHPDw4KTsKKworCS8qIEVuYWJsZSBzaGFyZWQgbWVtb3J5LiAqLworCW91dGIoVUxUUkFfTUVNRU5CLCBkZXYtPmJhc2VfYWRkciAtIFVMVFJBX05JQ19PRkZTRVQpOworCisJaWYgKHJpbmdfb2Zmc2V0ICsgY291bnQgPiBlaV9zdGF0dXMuc3RvcF9wYWdlKjI1NikgeworCQkvKiBXZSBtdXN0IHdyYXAgdGhlIGlucHV0IG1vdmUuICovCisJCWludCBzZW1pX2NvdW50ID0gZWlfc3RhdHVzLnN0b3BfcGFnZSoyNTYgLSByaW5nX29mZnNldDsKKwkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEsIHhmZXJfc3RhcnQsIHNlbWlfY291bnQpOworCQljb3VudCAtPSBzZW1pX2NvdW50OworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSArIHNlbWlfY291bnQsIGVpX3N0YXR1cy5tZW0gKyBUWF9QQUdFUyAqIDI1NiwgY291bnQpOworCX0gZWxzZSB7CisJCS8qIFBhY2tldCBpcyBpbiBvbmUgY2h1bmsgLS0gd2UgY2FuIGNvcHkgKyBja3N1bS4gKi8KKwkJZXRoX2lvX2NvcHlfYW5kX3N1bShza2IsIHhmZXJfc3RhcnQsIGNvdW50LCAwKTsKKwl9CisKKwlvdXRiKDB4MDAsIGRldi0+YmFzZV9hZGRyIC0gVUxUUkFfTklDX09GRlNFVCk7CS8qIERpc2FibGUgbWVtb3J5LiAqLworfQorCitzdGF0aWMgdm9pZAordWx0cmFfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJCWludCBzdGFydF9wYWdlKQoreworCXZvaWQgX19pb21lbSAqc2htZW0gPSBlaV9zdGF0dXMubWVtICsgKChzdGFydF9wYWdlIC0gU1RBUlRfUEcpPDw4KTsKKworCS8qIEVuYWJsZSBzaGFyZWQgbWVtb3J5LiAqLworCW91dGIoVUxUUkFfTUVNRU5CLCBkZXYtPmJhc2VfYWRkciAtIFVMVFJBX05JQ19PRkZTRVQpOworCisJbWVtY3B5X3RvaW8oc2htZW0sIGJ1ZiwgY291bnQpOworCisJb3V0YigweDAwLCBkZXYtPmJhc2VfYWRkciAtIFVMVFJBX05JQ19PRkZTRVQpOyAvKiBEaXNhYmxlIG1lbW9yeS4gKi8KK30KKworLyogVGhlIGlkZW50aWNhbCBvcGVyYXRpb25zIGZvciBwcm9ncmFtbWVkIEkvTyBjYXJkcy4KKyAgIFRoZSBQSU8gbW9kZWwgaXMgdHJpdmlhbCB0byB1c2U6IHRoZSAxNiBiaXQgc3RhcnQgYWRkcmVzcyBpcyB3cml0dGVuCisgICBieXRlLXNlcXVlbnRpYWxseSB0byBJT1BBLCB3aXRoIG5vIGludGVydmVuaW5nIEkvTyBvcGVyYXRpb25zLCBhbmQgdGhlCisgICBkYXRhIGlzIHJlYWQgb3Igd3JpdHRlbiB0byB0aGUgSU9QRCBkYXRhIHBvcnQuCisgICBUaGUgb25seSBwb3RlbnRpYWwgY29tcGxpY2F0aW9uIGlzIHRoYXQgdGhlIGFkZHJlc3MgcmVnaXN0ZXIgaXMgc2hhcmVkCisgICBhbmQgbXVzdCBiZSBhbHdheXMgYmUgcmV3cml0dGVuIGJldHdlZW4gZWFjaCByZWFkL3dyaXRlIGRpcmVjdGlvbiBjaGFuZ2UuCisgICBUaGlzIGlzIG5vIHByb2JsZW0gZm9yIHVzLCBhcyB0aGUgODM5MCBjb2RlIGVuc3VyZXMgdGhhdCB3ZSBhcmUgc2luZ2xlCisgICB0aHJlYWRlZC4gKi8KK3N0YXRpYyB2b2lkIHVsdHJhX3Bpb19nZXRfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsCisJCQkJCQlpbnQgcmluZ19wYWdlKQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciAtIFVMVFJBX05JQ19PRkZTRVQ7IC8qIEFTSUMgYWRkciAqLworCW91dGIoMHgwMCwgaW9hZGRyICsgSU9QQSk7CS8qIFNldCB0aGUgYWRkcmVzcywgTFNCIGZpcnN0LiAqLworCW91dGIocmluZ19wYWdlLCBpb2FkZHIgKyBJT1BBKTsKKwlpbnN3KGlvYWRkciArIElPUEQsIGhkciwgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKT4+MSk7Cit9CisKK3N0YXRpYyB2b2lkIHVsdHJhX3Bpb19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCkKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIgLSBVTFRSQV9OSUNfT0ZGU0VUOyAvKiBBU0lDIGFkZHIgKi8KKyAgICBjaGFyICpidWYgPSBza2ItPmRhdGE7CisKKwkvKiBGb3Igbm93IHNldCB0aGUgYWRkcmVzcyBhZ2FpbiwgYWx0aG91Z2ggaXQgc2hvdWxkIGFscmVhZHkgYmUgY29ycmVjdC4gKi8KKwlvdXRiKHJpbmdfb2Zmc2V0LCBpb2FkZHIgKyBJT1BBKTsJLyogU2V0IHRoZSBhZGRyZXNzLCBMU0IgZmlyc3QuICovCisJb3V0YihyaW5nX29mZnNldCA+PiA4LCBpb2FkZHIgKyBJT1BBKTsKKwkvKiBXZSBrbm93IHNrYnVmZnMgYXJlIHBhZGRlZCB0byBhdCBsZWFzdCB3b3JkIGFsaWdubWVudC4gKi8KKwlpbnN3KGlvYWRkciArIElPUEQsIGJ1ZiwgKGNvdW50KzEpPj4xKTsKK30KKworc3RhdGljIHZvaWQgdWx0cmFfcGlvX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBjb25zdCBpbnQgc3RhcnRfcGFnZSkKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIgLSBVTFRSQV9OSUNfT0ZGU0VUOyAvKiBBU0lDIGFkZHIgKi8KKwlvdXRiKDB4MDAsIGlvYWRkciArIElPUEEpOwkvKiBTZXQgdGhlIGFkZHJlc3MsIExTQiBmaXJzdC4gKi8KKwlvdXRiKHN0YXJ0X3BhZ2UsIGlvYWRkciArIElPUEEpOworCS8qIEFuIGV4dHJhIG9kZCBieXRlIGlzIE9LIGhlcmUgYXMgd2VsbC4gKi8KKwlvdXRzdyhpb2FkZHIgKyBJT1BELCBidWYsIChjb3VudCsxKT4+MSk7Cit9CisKK3N0YXRpYyBpbnQKK3VsdHJhX2Nsb3NlX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIgLSBVTFRSQV9OSUNfT0ZGU0VUOyAvKiBDTURSRUcgKi8KKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmIChlaV9kZWJ1ZyA+IDEpCisJCXByaW50aygiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKKworCW91dGIoMHgwMCwgaW9hZGRyICsgNik7CQkvKiBEaXNhYmxlIGludGVycnVwdHMuICovCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlOUzgzOTBfaW5pdChkZXYsIDApOworCisJLyogV2Ugc2hvdWxkIHNvbWVkYXkgZGlzYWJsZSBzaGFyZWQgbWVtb3J5IGFuZCBjaGFuZ2UgdG8gOC1iaXQgbW9kZQorCSAgICJqdXN0IGluIGNhc2UiLi4uICovCisKKwlyZXR1cm4gMDsKK30KKworDAorI2lmZGVmIE1PRFVMRQorI2RlZmluZSBNQVhfVUxUUkFfQ0FSRFMJNAkvKiBNYXggbnVtYmVyIG9mIFVsdHJhIGNhcmRzIHBlciBtb2R1bGUgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X3VsdHJhW01BWF9VTFRSQV9DQVJEU107CitzdGF0aWMgaW50IGlvW01BWF9VTFRSQV9DQVJEU107CitzdGF0aWMgaW50IGlycVtNQVhfVUxUUkFfQ0FSRFNdOworCittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBiYXNlIGFkZHJlc3MoZXMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSBudW1iZXIocykgKGFzc2lnbmVkKSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTTUMgVWx0cmEvRXRoZXJFWiBJU0EvUG5QIEV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBUaGlzIGlzIHNldCB1cCBzbyB0aGF0IG9ubHkgYSBzaW5nbGUgYXV0b3Byb2JlIHRha2VzIHBsYWNlIHBlciBjYWxsLgorSVNBIGRldmljZSBhdXRvcHJvYmVzIG9uIGEgcnVubmluZyBtYWNoaW5lIGFyZSBub3QgcmVjb21tZW5kZWQuICovCitpbnQKK2luaXRfbW9kdWxlKHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgdGhpc19kZXYsIGZvdW5kID0gMDsKKworCWZvciAodGhpc19kZXYgPSAwOyB0aGlzX2RldiA8IE1BWF9VTFRSQV9DQVJEUzsgdGhpc19kZXYrKykgeworCQlpZiAoaW9bdGhpc19kZXZdID09IDApICB7CisJCQlpZiAodGhpc19kZXYgIT0gMCkgYnJlYWs7IC8qIG9ubHkgYXV0b3Byb2JlIDFzdCBvbmUgKi8KKwkJCXByaW50ayhLRVJOX05PVElDRSAic21jLXVsdHJhLmM6IFByZXNlbnRseSBhdXRvcHJvYmluZyAobm90IHJlY29tbWVuZGVkKSBmb3IgYSBzaW5nbGUgY2FyZC5cbiIpOworCQl9CisJCWRldiA9IGFsbG9jX2VpX25ldGRldigpOworCQlpZiAoIWRldikKKwkJCWJyZWFrOworCQlkZXYtPmlycSA9IGlycVt0aGlzX2Rldl07CisJCWRldi0+YmFzZV9hZGRyID0gaW9bdGhpc19kZXZdOworCQlpZiAoZG9fdWx0cmFfcHJvYmUoZGV2KSA9PSAwKSB7CisJCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgeworCQkJCWRldl91bHRyYVtmb3VuZCsrXSA9IGRldjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQl9CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNtYy11bHRyYS5jOiBObyBTTUMgVWx0cmEgY2FyZCBmb3VuZCAoaS9vID0gMHgleCkuXG4iLCBpb1t0aGlzX2Rldl0pOworCQlicmVhazsKKwl9CisJaWYgKGZvdW5kKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVOWElPOworfQorCit2b2lkCitjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWludCB0aGlzX2RldjsKKworCWZvciAodGhpc19kZXYgPSAwOyB0aGlzX2RldiA8IE1BWF9VTFRSQV9DQVJEUzsgdGhpc19kZXYrKykgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X3VsdHJhW3RoaXNfZGV2XTsKKwkJaWYgKGRldikgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJfQorCX0KK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYy11bHRyYTMyLmMgYi9kcml2ZXJzL25ldC9zbWMtdWx0cmEzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZTM5N2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zbWMtdWx0cmEzMi5jCkBAIC0wLDAgKzEsNDU0IEBACisvKiAJc21jLXVsdHJhMzIuYzogQW4gU01DIFVsdHJhMzIgRUlTQSBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4LgorCitTb3VyY2VzOgorCisJVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gKGNsb25lZCBmcm9tKSB0aGUgSVNBIFNNQyBVbHRyYSBkcml2ZXIKKwl3cml0dGVuIGJ5IERvbmFsZCBCZWNrZXIuIE1vZGlmaWNhdGlvbnMgdG8gc3VwcG9ydCB0aGUgRUlTQQorCXZlcnNpb24gb2YgdGhlIGNhcmQgYnkgUGF1bCBHb3J0bWFrZXIgYW5kIExlb25hcmQgTi4gWnVia29mZi4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCitUaGVvcnkgb2YgT3BlcmF0aW9uOgorCisJVGhlIFNNQyBVbHRyYTMyQyBjYXJkIHVzZXMgdGhlIFNNQyA4M2M3OTAgY2hpcCB3aGljaCBpcyBhbHNvCisJZm91bmQgb24gdGhlIElTQSBTTUMgVWx0cmEgY2FyZHMuIEl0IGhhcyBhIHNoYXJlZCBtZW1vcnkgbW9kZSBvZgorCW9wZXJhdGlvbiB0aGF0IG1ha2VzIGl0IHNpbWlsYXIgdG8gdGhlIElTQSB2ZXJzaW9uIG9mIHRoZSBjYXJkLgorCVRoZSBtYWluIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgRUlTQSBjYXJkIGhhcyAzMktCIG9mIFJBTSwgYnV0CisJb25seSBhbiA4S0Igd2luZG93IGludG8gdGhhdCBtZW1vcnkuIFRoZSBFSVNBIGNhcmQgYWxzbyBjYW4gYmUKKwlzZXQgZm9yIGEgYnVzLW1hc3RlcmluZyBtb2RlIG9mIG9wZXJhdGlvbiB2aWEgdGhlIEVDVSwgYnV0IHRoYXQKKwlpcyBub3QgKGFuZCBwcm9iYWJseSB3aWxsIG5ldmVyIGJlKSBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuCisJVGhlIEVDVSBzaG91bGQgYmUgcnVuIHRvIGVuYWJsZSBzaGFyZWQgbWVtb3J5IGFuZCB0byBkaXNhYmxlIHRoZQorCWJ1cy1tYXN0ZXJpbmcgZmVhdHVyZSBmb3IgdXNlIHdpdGggbGludXguCisKKwlCeSBwcm9ncmFtbWluZyB0aGUgODM5MCB0byB1c2Ugb25seSA4S0IgUkFNLCB0aGUgbW9kaWZpY2F0aW9ucworCXRvIHRoZSBJU0EgZHJpdmVyIGNhbiBiZSBsaW1pdGVkIHRvIHRoZSBwcm9iZSBhbmQgaW5pdGlhbGl6YXRpb24KKwljb2RlLiBUaGlzIGFsbG93cyBlYXN5IGludGVncmF0aW9uIG9mIEVJU0Egc3VwcG9ydCBpbnRvIHRoZSBJU0EKKwlkcml2ZXIuIEhvd2V2ZXIsIHRoZSBkcml2ZXIgZGV2ZWxvcG1lbnQga2l0IGZyb20gU01DIHByb3ZpZGVkIHRoZQorCXJlZ2lzdGVyIGluZm9ybWF0aW9uIGZvciBzbGlkaW5nIHRoZSA4S0Igd2luZG93LCBhbmQgaGVuY2UgdGhlIDgzOTAKKwlpcyBwcm9ncmFtbWVkIHRvIHVzZSB0aGUgZnVsbCAzMktCIFJBTS4KKworCVVuZm9ydHVuYXRlbHkgdGhpcyByZXF1aXJlZCBjb2RlIGNoYW5nZXMgb3V0c2lkZSB0aGUgcHJvYmUvaW5pdAorCXJvdXRpbmVzLCBhbmQgdGh1cyB3ZSBkZWNpZGVkIHRvIHNlcGFyYXRlIHRoZSBFSVNBIGRyaXZlciBmcm9tCisJdGhlIElTQSBvbmUuIEluIHRoaXMgd2F5LCBJU0EgdXNlcnMgZG9uJ3QgZW5kIHVwIHdpdGggYSBsYXJnZXIKKwlkcml2ZXIgZHVlIHRvIHRoZSBFSVNBIGNvZGUsIGFuZCBFSVNBIHVzZXJzIGRvbid0IGVuZCB1cCB3aXRoIGEKKwlsYXJnZXIgZHJpdmVyIGR1ZSB0byB0aGUgSVNBIEV0aGVyRVogUElPIGNvZGUuIFRoZSBkcml2ZXIgaXMKKwlzaW1pbGFyIHRvIHRoZSAzYzUwMy8xNiBkcml2ZXIsIGluIHRoYXQgdGhlIHdpbmRvdyBtdXN0IGJlIHNldAorCWJhY2sgdG8gdGhlIDFzdCA4S0Igb2Ygc3BhY2UgZm9yIGFjY2VzcyB0byB0aGUgdHdvIDgzOTAgVHggc2xvdHMuCisKKwlJbiB0ZXN0aW5nLCB1c2luZyBvbmx5IDhLQiBSQU0gKDMgVHggLyA1IFJ4KSBkaWRuJ3QgYXBwZWFyIHRvCisJYmUgYSBsaW1pdGluZyBmYWN0b3IsIHNpbmNlIHRoZSBFSVNBIGJ1cyBjb3VsZCBnZXQgcGFja2V0cyBvZmYKKwl0aGUgY2FyZCBmYXN0IGVub3VnaCwgYnV0IGhhdmluZyB0aGUgdXNlIG9mIGxvdHMgb2YgUkFNIGFzIFJ4CisJc3BhY2UgaXMgZXh0cmEgaW5zdXJhbmNlIGlmIGludGVycnVwdCBsYXRlbmNpZXMgYmVjb21lIGV4Y2Vzc2l2ZS4KKworKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb24gPSAic21jLXVsdHJhMzIuYzogMDYvOTcgdjEuMDBcbiI7CisKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vpc2EuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSAiODM5MC5oIgorCisjZGVmaW5lIERSVl9OQU1FICJzbWMtdWx0cmEzMiIKKworc3RhdGljIGludCB1bHRyYTMyX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKTsKK3N0YXRpYyBpbnQgdWx0cmEzMl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgdWx0cmEzMl9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgdWx0cmEzMl9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwKKwkJCQkgaW50IHJpbmdfcGFnZSk7CitzdGF0aWMgdm9pZCB1bHRyYTMyX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQgdWx0cmEzMl9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkJIGNvbnN0IGludCBzdGFydF9wYWdlKTsKK3N0YXRpYyBpbnQgdWx0cmEzMl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwwKKyNkZWZpbmUgVUxUUkEzMl9DTURSRUcJMAkvKiBPZmZzZXQgdG8gQVNJQyBjb21tYW5kIHJlZ2lzdGVyLiAqLworI2RlZmluZQkgVUxUUkEzMl9SRVNFVAkweDgwCS8qIEJvYXJkIHJlc2V0LCBpbiBVTFRSQTMyX0NNRFJFRy4gKi8KKyNkZWZpbmUJIFVMVFJBMzJfTUVNRU5CCTB4NDAJLyogRW5hYmxlIHRoZSBzaGFyZWQgbWVtb3J5LiAqLworI2RlZmluZSBVTFRSQTMyX05JQ19PRkZTRVQgMTYJLyogTklDIHJlZ2lzdGVyIG9mZnNldCBmcm9tIHRoZSBiYXNlX2FkZHIuICovCisjZGVmaW5lIFVMVFJBMzJfSU9fRVhURU5UIDMyCisjZGVmaW5lIEVOMF9FUldDTlQJCTB4MDgJLyogRWFybHkgcmVjZWl2ZSB3YXJuaW5nIGNvdW50LiAqLworCisvKgorICogRGVmaW5lcyB0aGF0IGFwcGx5IG9ubHkgdG8gdGhlIFVsdHJhMzIgRUlTQSBjYXJkLiBOb3RlIHRoYXQKKyAqICJzbWMiID0gMTAwMTEgMDExMDEgMDAwMTEgPSAweDRkYTMsIGFuZCBoZW5jZSAhc21jODAxMC5jZmcgdHJhbnNsYXRlcworICogaW50byBhbiBFSVNBIElEIG9mIDB4MTA4MEEzNEQKKyAqLworI2RlZmluZSBVTFRSQTMyX0JBU0UJMHhjYTAKKyNkZWZpbmUgVUxUUkEzMl9JRAkweDEwODBhMzRkCisjZGVmaW5lIFVMVFJBMzJfSURQT1JUCSgtMHgyMCkJLyogMHhjODAgKi8KKy8qIENvbmZpZyByZWdzIDEtPjcgZnJvbSB0aGUgRUlTQSAhU01DODAxMC5DRkcgZmlsZS4gKi8KKyNkZWZpbmUgVUxUUkEzMl9DRkcxCTB4MDQJLyogMHhjYTQgKi8KKyNkZWZpbmUgVUxUUkEzMl9DRkcyCTB4MDUJLyogMHhjYTUgKi8KKyNkZWZpbmUgVUxUUkEzMl9DRkczCSgtMHgxOCkJLyogMHhjODggKi8KKyNkZWZpbmUgVUxUUkEzMl9DRkc0CSgtMHgxNykJLyogMHhjODkgKi8KKyNkZWZpbmUgVUxUUkEzMl9DRkc1CSgtMHgxNikJLyogMHhjOGEgKi8KKyNkZWZpbmUgVUxUUkEzMl9DRkc2CSgtMHgxNSkJLyogMHhjOGIgKi8KKyNkZWZpbmUgVUxUUkEzMl9DRkc3CTB4MGQJLyogMHhjYWQgKi8KKworc3RhdGljIHZvaWQgY2xlYW51cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyIC0gVUxUUkEzMl9OSUNfT0ZGU0VUOworCS8qIE5COiB1bHRyYTMyX2Nsb3NlX2NhcmQoKSBkb2VzIGZyZWVfaXJxICovCisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBVTFRSQTMyX0lPX0VYVEVOVCk7CisJaW91bm1hcChlaV9zdGF0dXMubWVtKTsKK30KKworLyoJUHJvYmUgZm9yIHRoZSBVbHRyYTMyLiAgVGhpcyBsb29rcyBsaWtlIGEgODAxMyB3aXRoIHRoZSBzdGF0aW9uCisJYWRkcmVzcyBQUk9NIGF0IEkvTyBwb3J0cyA8YmFzZT4rOCB0byA8YmFzZT4rMTMsIHdpdGggYSBjaGVja3N1bQorCWZvbGxvd2luZy4KKyovCisKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IHVsdHJhMzJfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgYmFzZTsKKwlpbnQgaXJxOworCWludCBlcnIgPSAtRU5PREVWOworCisJaWYgKCFFSVNBX2J1cykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwlkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWlycSA9IGRldi0+aXJxOworCisJLyogRUlTQSBzcGVjIGFsbG93cyBmb3IgdXAgdG8gMTYgc2xvdHMsIGJ1dCA4IGlzIHR5cGljYWwuICovCisJZm9yIChiYXNlID0gMHgxMDAwICsgVUxUUkEzMl9CQVNFOyBiYXNlIDwgMHg5MDAwOyBiYXNlICs9IDB4MTAwMCkgeworCQlpZiAodWx0cmEzMl9wcm9iZTEoZGV2LCBiYXNlKSA9PSAwKQorCQkJYnJlYWs7CisJCWRldi0+aXJxID0gaXJxOworCX0KKwlpZiAoYmFzZSA+PSAweDkwMDApCisJCWdvdG8gb3V0OworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwlyZXR1cm4gZGV2Oworb3V0MToKKwljbGVhbnVwX2NhcmQoZGV2KTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHVsdHJhMzJfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpCit7CisJaW50IGksIGVkZ2UsIG1lZGlhLCByZXR2YWw7CisJaW50IGNoZWNrc3VtID0gMDsKKwljb25zdCBjaGFyICptb2RlbF9uYW1lOworCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7CisJLyogVmFsdWVzIGZyb20gdmFyaW91cyBjb25maWcgcmVncy4gKi8KKwl1bnNpZ25lZCBjaGFyIGlkcmVnOworCXVuc2lnbmVkIGNoYXIgcmVnNDsKKwljb25zdCBjaGFyICppZm1hcFtdID0geyJVVFAgTm8gTGluayIsICIiLCAiVVRQL0FVSSIsICJVVFAvQk5DIn07CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgVUxUUkEzMl9JT19FWFRFTlQsIERSVl9OQU1FKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChpbmIoaW9hZGRyICsgVUxUUkEzMl9JRFBPUlQpID09IDB4ZmYgfHwKKwkgICAgaW5sKGlvYWRkciArIFVMVFJBMzJfSURQT1JUKSAhPSBVTFRSQTMyX0lEKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCW1lZGlhID0gaW5iKGlvYWRkciArIFVMVFJBMzJfQ0ZHNykgJiAweDAzOworCWVkZ2UgPSBpbmIoaW9hZGRyICsgVUxUUkEzMl9DRkc1KSAmIDB4MDg7CisJcHJpbnRrKCJTTUMgVWx0cmEzMiBpbiBFSVNBIFNsb3QgJWQsIE1lZGlhOiAlcywgJXMgSVJRcy5cbiIsCisJCWlvYWRkciA+PiAxMiwgaWZtYXBbbWVkaWFdLAorCQkoZWRnZSA/ICJFZGdlIFRyaWdnZXJlZCIgOiAiTGV2ZWwgU2Vuc2l0aXZlIikpOworCisJaWRyZWcgPSBpbmIoaW9hZGRyICsgNyk7CisJcmVnNCA9IGluYihpb2FkZHIgKyA0KSAmIDB4N2Y7CisKKwkvKiBDaGVjayB0aGUgSUQgbmliYmxlLiAqLworCWlmICgoaWRyZWcgJiAweGYwKSAhPSAweDIwKSB7CQkJLyogU01DIFVsdHJhICovCisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFNlbGVjdCB0aGUgc3RhdGlvbiBhZGRyZXNzIHJlZ2lzdGVyIHNldC4gKi8KKwlvdXRiKHJlZzQsIGlvYWRkciArIDQpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJY2hlY2tzdW0gKz0gaW5iKGlvYWRkciArIDggKyBpKTsKKwlpZiAoKGNoZWNrc3VtICYgMHhmZikgIT0gMHhmZikgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZWlfZGVidWcgICYmICB2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsodmVyc2lvbik7CisKKwltb2RlbF9uYW1lID0gIlNNQyBVbHRyYTMyIjsKKworCXByaW50aygiJXM6ICVzIGF0IDB4JVgsIiwgZGV2LT5uYW1lLCBtb2RlbF9uYW1lLCBpb2FkZHIpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIgJTIuMlgiLCBkZXYtPmRldl9hZGRyW2ldID0gaW5iKGlvYWRkciArIDggKyBpKSk7CisKKwkvKiBTd2l0Y2ggZnJvbSB0aGUgc3RhdGlvbiBhZGRyZXNzIHRvIHRoZSBhbHRlcm5hdGUgcmVnaXN0ZXIgc2V0IGFuZAorCSAgIHJlYWQgdGhlIHVzZWZ1bCByZWdpc3RlcnMgdGhlcmUuICovCisJb3V0YigweDgwIHwgcmVnNCwgaW9hZGRyICsgNCk7CisKKwkvKiBFbmFibGUgRklORTE2IG1vZGUgdG8gYXZvaWQgQklPUyBST00gd2lkdGggbWlzbWF0Y2hlcyBAIHJlYm9vdC4gKi8KKwlvdXRiKDB4ODAgfCBpbmIoaW9hZGRyICsgMHgwYyksIGlvYWRkciArIDB4MGMpOworCisJLyogUmVzZXQgUkFNIGFkZHIuICovCisJb3V0YigweDAwLCBpb2FkZHIgKyAweDBiKTsKKworCS8qIFN3aXRjaCBiYWNrIHRvIHRoZSBzdGF0aW9uIGFkZHJlc3MgcmVnaXN0ZXIgc2V0IHNvIHRoYXQgdGhlCisJICAgTVMtRE9TIGRyaXZlciBjYW4gZmluZCB0aGUgY2FyZCBhZnRlciBhIHdhcm0gYm9vdC4gKi8KKwlvdXRiKHJlZzQsIGlvYWRkciArIDQpOworCisJaWYgKChpbmIoaW9hZGRyICsgVUxUUkEzMl9DRkc1KSAmIDB4NDApID09IDApIHsKKwkJcHJpbnRrKCJcbnNtYy11bHRyYTMyOiBDYXJkIFJBTSBpcyBkaXNhYmxlZCEgICIKKwkJICAgICAgICJSdW4gRUlTQSBjb25maWcgdXRpbGl0eS5cbiIpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisJaWYgKChpbmIoaW9hZGRyICsgVUxUUkEzMl9DRkcyKSAmIDB4MDQpID09IDApCisJCXByaW50aygiXG5zbWMtdWx0cmEzMjogSWdub3JpbmcgQnVzLU1hc3RlciBlbmFibGUgYml0LiAgIgorCQkgICAgICAgIlJ1biBFSVNBIGNvbmZpZyB1dGlsaXR5LlxuIik7CisKKwlpZiAoZGV2LT5pcnEgPCAyKSB7CisJCXVuc2lnbmVkIGNoYXIgaXJxbWFwW10gPSB7MCwgOSwgMywgNSwgNywgMTAsIDExLCAxNX07CisJCWludCBpcnEgPSBpcnFtYXBbaW5iKGlvYWRkciArIFVMVFJBMzJfQ0ZHNSkgJiAweDA3XTsKKwkJaWYgKGlycSA9PSAwKSB7CisJCQlwcmludGsoIiwgZmFpbGVkIHRvIGRldGVjdCBJUlEgbGluZS5cbiIpOworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWdvdG8gb3V0OworCQl9CisJCWRldi0+aXJxID0gaXJxOworCX0KKworCS8qIFRoZSA4MzkwIGlzbid0IGF0IHRoZSBiYXNlIGFkZHJlc3MsIHNvIGZha2UgdGhlIG9mZnNldCAqLworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyICsgVUxUUkEzMl9OSUNfT0ZGU0VUOworCisJLyogU2F2ZSBSQU0gYWRkcmVzcyBpbiB0aGUgdW51c2VkIHJlZzAgdG8gYXZvaWQgZXhjZXNzIGluYidzLiAqLworCWVpX3N0YXR1cy5yZWcwID0gaW5iKGlvYWRkciArIFVMVFJBMzJfQ0ZHMykgJiAweGZjOworCisJZGV2LT5tZW1fc3RhcnQgPSAgMHhjMDAwMCArICgoZWlfc3RhdHVzLnJlZzAgJiAweDdjKSA8PCAxMSk7CisKKwllaV9zdGF0dXMubmFtZSA9IG1vZGVsX25hbWU7CisJZWlfc3RhdHVzLndvcmQxNiA9IDE7CisJZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSAwOworCWVpX3N0YXR1cy5yeF9zdGFydF9wYWdlID0gVFhfUEFHRVM7CisJLyogQWxsIFVsdHJhMzIgY2FyZHMgaGF2ZSAzMktCIG1lbW9yeSB3aXRoIGFuIDhLQiB3aW5kb3cuICovCisJZWlfc3RhdHVzLnN0b3BfcGFnZSA9IDEyODsKKworCWVpX3N0YXR1cy5tZW0gPSBpb3JlbWFwKGRldi0+bWVtX3N0YXJ0LCAweDIwMDApOworCWlmICghZWlfc3RhdHVzLm1lbSkgeworCQlwcmludGsoIiwgZmFpbGVkIHRvIGlvcmVtYXAuXG4iKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCWRldi0+bWVtX2VuZCA9IGRldi0+bWVtX3N0YXJ0ICsgMHgxZmZmOworCisJcHJpbnRrKCIsIElSUSAlZCwgMzJLQiBtZW1vcnksIDhLQiB3aW5kb3cgYXQgMHglbHgtMHglbHguXG4iLAorCSAgICAgICBkZXYtPmlycSwgZGV2LT5tZW1fc3RhcnQsIGRldi0+bWVtX2VuZCk7CisJZWlfc3RhdHVzLmJsb2NrX2lucHV0ID0gJnVsdHJhMzJfYmxvY2tfaW5wdXQ7CisJZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZ1bHRyYTMyX2Jsb2NrX291dHB1dDsKKwllaV9zdGF0dXMuZ2V0XzgzOTBfaGRyID0gJnVsdHJhMzJfZ2V0XzgzOTBfaGRyOworCWVpX3N0YXR1cy5yZXNldF84MzkwID0gJnVsdHJhMzJfcmVzZXRfODM5MDsKKwlkZXYtPm9wZW4gPSAmdWx0cmEzMl9vcGVuOworCWRldi0+c3RvcCA9ICZ1bHRyYTMyX2Nsb3NlOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlaV9wb2xsOworI2VuZGlmCisJTlM4MzkwX2luaXQoZGV2LCAwKTsKKworCXJldHVybiAwOworb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgVUxUUkEzMl9JT19FWFRFTlQpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgdWx0cmEzMl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyIC0gVUxUUkEzMl9OSUNfT0ZGU0VUOyAvKiBBU0lDIGFkZHIgKi8KKwlpbnQgaXJxX2ZsYWdzID0gKGluYihpb2FkZHIgKyBVTFRSQTMyX0NGRzUpICYgMHgwOCkgPyAwIDogU0FfU0hJUlE7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBlaV9pbnRlcnJ1cHQsIGlycV9mbGFncywgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlvdXRiKFVMVFJBMzJfTUVNRU5CLCBpb2FkZHIpOyAvKiBFbmFibGUgU2hhcmVkIE1lbW9yeS4gKi8KKwlvdXRiKDB4ODAsIGlvYWRkciArIFVMVFJBMzJfQ0ZHNik7IC8qIEVuYWJsZSBJbnRlcnJ1cHRzLiAqLworCW91dGIoMHg4NCwgaW9hZGRyICsgNSk7CS8qIEVuYWJsZSBNRU0xNiAmIERpc2FibGUgQnVzIE1hc3Rlci4gKi8KKwlvdXRiKDB4MDEsIGlvYWRkciArIDYpOwkvKiBFbmFibGUgSW50ZXJydXB0cy4gKi8KKwkvKiBTZXQgdGhlIGVhcmx5IHJlY2VpdmUgd2FybmluZyBsZXZlbCBpbiB3aW5kb3cgMCBoaWdoIGVub3VnaCBub3QKKwkgICB0byByZWNlaXZlIEVSVyBpbnRlcnJ1cHRzLiAqLworCW91dGJfcChFODM5MF9OT0RNQStFODM5MF9QQUdFMCwgZGV2LT5iYXNlX2FkZHIpOworCW91dGIoMHhmZiwgZGV2LT5iYXNlX2FkZHIgKyBFTjBfRVJXQ05UKTsKKwllaV9vcGVuKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdWx0cmEzMl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkciAtIFVMVFJBMzJfTklDX09GRlNFVDsgLyogQ01EUkVHICovCisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJaWYgKGVpX2RlYnVnID4gMSkKKwkJcHJpbnRrKCIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQuXG4iLCBkZXYtPm5hbWUpOworCisJb3V0YigweDAwLCBpb2FkZHIgKyBVTFRSQTMyX0NGRzYpOyAvKiBEaXNhYmxlIEludGVycnVwdHMuICovCisJb3V0YigweDAwLCBpb2FkZHIgKyA2KTsJCS8qIERpc2FibGUgaW50ZXJydXB0cy4gKi8KKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCU5TODM5MF9pbml0KGRldiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdWx0cmEzMl9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyIC0gVUxUUkEzMl9OSUNfT0ZGU0VUOyAvKiBBU0lDIGJhc2UgYWRkciAqLworCisJb3V0YihVTFRSQTMyX1JFU0VULCBpb2FkZHIpOworCWlmIChlaV9kZWJ1ZyA+IDEpIHByaW50aygicmVzZXR0aW5nIFVsdHJhMzIsIHQ9JWxkLi4uIiwgamlmZmllcyk7CisJZWlfc3RhdHVzLnR4aW5nID0gMDsKKworCW91dGIoVUxUUkEzMl9NRU1FTkIsIGlvYWRkcik7IC8qIEVuYWJsZSBTaGFyZWQgTWVtb3J5LiAqLworCW91dGIoMHg4MCwgaW9hZGRyICsgVUxUUkEzMl9DRkc2KTsgLyogRW5hYmxlIEludGVycnVwdHMuICovCisJb3V0YigweDg0LCBpb2FkZHIgKyA1KTsJLyogRW5hYmxlIE1FTTE2ICYgRGlzYWJsZSBCdXMgTWFzdGVyLiAqLworCW91dGIoMHgwMSwgaW9hZGRyICsgNik7CS8qIEVuYWJsZSBJbnRlcnJ1cHRzLiAqLworCWlmIChlaV9kZWJ1ZyA+IDEpIHByaW50aygicmVzZXQgZG9uZVxuIik7CisJcmV0dXJuOworfQorCisvKiBHcmFiIHRoZSA4MzkwIHNwZWNpZmljIGhlYWRlci4gU2ltaWxhciB0byB0aGUgYmxvY2tfaW5wdXQgcm91dGluZSwgYnV0CisgICB3ZSBkb24ndCBuZWVkIHRvIGJlIGNvbmNlcm5lZCB3aXRoIHJpbmcgd3JhcCBhcyB0aGUgaGVhZGVyIHdpbGwgYmUgYXQKKyAgIHRoZSBzdGFydCBvZiBhIHBhZ2UsIHNvIHdlIG9wdGltaXplIGFjY29yZGluZ2x5LiAqLworCitzdGF0aWMgdm9pZCB1bHRyYTMyX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLAorCQkJCSBpbnQgcmluZ19wYWdlKQoreworCXZvaWQgX19pb21lbSAqaGRyX3N0YXJ0ID0gZWlfc3RhdHVzLm1lbSArICgocmluZ19wYWdlICYgMHgxZikgPDwgOCk7CisJdW5zaWduZWQgaW50IFJhbVJlZyA9IGRldi0+YmFzZV9hZGRyIC0gVUxUUkEzMl9OSUNfT0ZGU0VUICsgVUxUUkEzMl9DRkczOworCisJLyogU2VsZWN0IGNvcnJlY3QgOEtCIFdpbmRvdy4gKi8KKwlvdXRiKGVpX3N0YXR1cy5yZWcwIHwgKChyaW5nX3BhZ2UgJiAweDYwKSA+PiA1KSwgUmFtUmVnKTsKKworI2lmZGVmIF9fQklHX0VORElBTgorCS8qIE9mZmljaWFsbHkgdGhpcyBpcyB3aGF0IHdlIGFyZSBkb2luZywgYnV0IHRoZSByZWFkbCgpIGlzIGZhc3RlciAqLworCS8qIHVuZm9ydHVuYXRlbHkgaXQgaXNuJ3QgZW5kaWFuIGF3YXJlIG9mIHRoZSBzdHJ1Y3QgICAgICAgICAgICAgICAqLworCW1lbWNweV9mcm9taW8oaGRyLCBoZHJfc3RhcnQsIHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcikpOworCWhkci0+Y291bnQgPSBsZTE2X3RvX2NwdShoZHItPmNvdW50KTsKKyNlbHNlCisJKCh1bnNpZ25lZCBpbnQqKWhkcilbMF0gPSByZWFkbChoZHJfc3RhcnQpOworI2VuZGlmCit9CisKKy8qIEJsb2NrIGlucHV0IGFuZCBvdXRwdXQgYXJlIGVhc3kgb24gc2hhcmVkIG1lbW9yeSBldGhlcmNhcmRzLCB0aGUgb25seQorICAgY29tcGxpY2F0aW9uIGlzIHdoZW4gdGhlIHJpbmcgYnVmZmVyIHdyYXBzLCBvciBpbiB0aGlzIGNhc2UsIHdoZW4gYQorICAgcGFja2V0IHNwYW5zIGFuIDhLQiBib3VuZGFyeS4gTm90ZSB0aGF0IHRoZSBjdXJyZW50IDhLQiBzZWdtZW50IGlzCisgICBhbHJlYWR5IHNldCBieSB0aGUgZ2V0XzgzOTBfaGRyIHJvdXRpbmUuICovCisKK3N0YXRpYyB2b2lkIHVsdHJhMzJfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlpbnQgY291bnQsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQlpbnQgcmluZ19vZmZzZXQpCit7CisJdm9pZCBfX2lvbWVtICp4ZmVyX3N0YXJ0ID0gZWlfc3RhdHVzLm1lbSArIChyaW5nX29mZnNldCAmIDB4MWZmZik7CisJdW5zaWduZWQgaW50IFJhbVJlZyA9IGRldi0+YmFzZV9hZGRyIC0gVUxUUkEzMl9OSUNfT0ZGU0VUICsgVUxUUkEzMl9DRkczOworCisJaWYgKChyaW5nX29mZnNldCAmIH4weDFmZmYpICE9ICgocmluZ19vZmZzZXQgKyBjb3VudCAtIDEpICYgfjB4MWZmZikpIHsKKwkJaW50IHNlbWlfY291bnQgPSA4MTkyIC0gKHJpbmdfb2Zmc2V0ICYgMHgxRkZGKTsKKwkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEsIHhmZXJfc3RhcnQsIHNlbWlfY291bnQpOworCQljb3VudCAtPSBzZW1pX2NvdW50OworCQlpZiAocmluZ19vZmZzZXQgPCA5NioyNTYpIHsKKwkJCS8qIFNlbGVjdCBuZXh0IDhLQiBXaW5kb3cuICovCisJCQlyaW5nX29mZnNldCArPSBzZW1pX2NvdW50OworCQkJb3V0YihlaV9zdGF0dXMucmVnMCB8ICgocmluZ19vZmZzZXQgJiAweDYwMDApID4+IDEzKSwgUmFtUmVnKTsKKwkJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhICsgc2VtaV9jb3VudCwgZWlfc3RhdHVzLm1lbSwgY291bnQpOworCQl9IGVsc2UgeworCQkJLyogU2VsZWN0IGZpcnN0IDhLQiBXaW5kb3cuICovCisJCQlvdXRiKGVpX3N0YXR1cy5yZWcwLCBSYW1SZWcpOworCQkJbWVtY3B5X2Zyb21pbyhza2ItPmRhdGEgKyBzZW1pX2NvdW50LCBlaV9zdGF0dXMubWVtICsgVFhfUEFHRVMgKiAyNTYsIGNvdW50KTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFBhY2tldCBpcyBpbiBvbmUgY2h1bmsgLS0gd2UgY2FuIGNvcHkgKyBja3N1bS4gKi8KKwkJZXRoX2lvX2NvcHlfYW5kX3N1bShza2IsIHhmZXJfc3RhcnQsIGNvdW50LCAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVsdHJhMzJfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIGludCBjb3VudCwKKwkJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJCSBpbnQgc3RhcnRfcGFnZSkKK3sKKwl2b2lkIF9faW9tZW0gKnhmZXJfc3RhcnQgPSBlaV9zdGF0dXMubWVtICsgKHN0YXJ0X3BhZ2U8PDgpOworCXVuc2lnbmVkIGludCBSYW1SZWcgPSBkZXYtPmJhc2VfYWRkciAtIFVMVFJBMzJfTklDX09GRlNFVCArIFVMVFJBMzJfQ0ZHMzsKKworCS8qIFNlbGVjdCBmaXJzdCA4S0IgV2luZG93LiAqLworCW91dGIoZWlfc3RhdHVzLnJlZzAsIFJhbVJlZyk7CisKKwltZW1jcHlfdG9pbyh4ZmVyX3N0YXJ0LCBidWYsIGNvdW50KTsKK30KKwwKKyNpZmRlZiBNT0RVTEUKKyNkZWZpbmUgTUFYX1VMVFJBMzJfQ0FSRFMgICA0CS8qIE1heCBudW1iZXIgb2YgVWx0cmEgY2FyZHMgcGVyIG1vZHVsZSAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfdWx0cmFbTUFYX1VMVFJBMzJfQ0FSRFNdOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNNQyBVbHRyYTMyIEVJU0EgZXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWludCB0aGlzX2RldiwgZm91bmQgPSAwOworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX1VMVFJBMzJfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHVsdHJhMzJfcHJvYmUoLTEpOworCQlpZiAoSVNfRVJSKGRldikpCisJCQlicmVhazsKKwkJZGV2X3VsdHJhW2ZvdW5kKytdID0gZGV2OworCX0KKwlpZiAoZm91bmQpCisJCXJldHVybiAwOworCXByaW50ayhLRVJOX1dBUk5JTkcgInNtYy11bHRyYTMyLmM6IE5vIFNNQyBVbHRyYTMyIGZvdW5kLlxuIik7CisJcmV0dXJuIC1FTlhJTzsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWludCB0aGlzX2RldjsKKworCWZvciAodGhpc19kZXYgPSAwOyB0aGlzX2RldiA8IE1BWF9VTFRSQTMyX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfdWx0cmFbdGhpc19kZXZdOworCQlpZiAoZGV2KSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQkJY2xlYW51cF9jYXJkKGRldik7CisJCQlmcmVlX25ldGRldihkZXYpOworCQl9CisJfQorfQorI2VuZGlmIC8qIE1PRFVMRSAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWM5MTk0LmMgYi9kcml2ZXJzL25ldC9zbWM5MTk0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg2Njk3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NtYzkxOTQuYwpAQCAtMCwwICsxLDE2MzEgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgLiBzbWM5MTk0LmMKKyAuIFRoaXMgaXMgYSBkcml2ZXIgZm9yIFNNQydzIDkwMDAgc2VyaWVzIG9mIEV0aGVybmV0IGNhcmRzLgorIC4KKyAuIENvcHlyaWdodCAoQykgMTk5NiBieSBFcmlrIFN0YWhsbWFuCisgLiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgLiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorIC4KKyAuICJGZWF0dXJlcyIgb2YgdGhlIFNNQyBjaGlwOgorIC4gICA0NjA4IGJ5dGUgcGFja2V0IG1lbW9yeS4gKCBmb3IgdGhlIDkxQzkyLiAgT3RoZXJzIGhhdmUgbW9yZSApCisgLiAgIEVFUFJPTSBmb3IgY29uZmlndXJhdGlvbgorIC4gICBBVUkvVFAgc2VsZWN0aW9uICAoIG1pbmUgaGFzIDEwQmFzZTIvMTBCYXNlVCBzZWxlY3QgKQorIC4KKyAuIEFyZ3VtZW50czoKKyAuIAlpbwkJID0gZm9yIHRoZSBiYXNlIGFkZHJlc3MKKyAuCWlycQkgPSBmb3IgdGhlIElSUQorIC4JaWZwb3J0ID0gMCBmb3IgYXV0b2RldGVjdCwgMSBmb3IgVFAsIDIgZm9yIEFVSSAoIG9yIDEwYmFzZTIgKQorIC4KKyAuIGF1dGhvcjoKKyAuIAlFcmlrIFN0YWhsbWFuCQkJCSggZXJpa0B2dC5lZHUgKQorIC4gY29udHJpYnV0b3JzOgorIC4gICAgICBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAuCisgLiBIYXJkd2FyZSBtdWx0aWNhc3QgY29kZSBmcm9tIFBldGVyIENhbW1hZXJ0ICggcGNAZGVua2FydC5iZSApCisgLgorIC4gU291cmNlczoKKyAuICAgIG8gICBTTUMgZGF0YWJvb2sKKyAuICAgIG8gICBza2VsZXRvbi5jIGJ5IERvbmFsZCBCZWNrZXIgKCBiZWNrZXJAc2N5bGQuY29tICkKKyAuICAgIG8gICAoIGEgTE9UIG9mIGFkdmljZSBmcm9tIEJlY2tlciBhcyB3ZWxsICkKKyAuCisgLiBIaXN0b3J5OgorIC4JMTIvMDcvOTUgIEVyaWsgU3RhaGxtYW4gIHdyaXR0ZW4sIGdvdCByZWNlaXZlL3htaXQgaGFuZGxlZAorIC4gCTAxLzAzLzk2ICBFcmlrIFN0YWhsbWFuICB3b3JrZWQgb3V0IHNvbWUgYnVncywgYWN0dWFsbHkgdXNhYmxlISEhIDotKQorIC4JMDEvMDYvOTYgIEVyaWsgU3RhaGxtYW4JIGNsZWFuZWQgdXAgc29tZSwgYmV0dGVyIHRlc3RpbmcsIGV0YworIC4JMDEvMjkvOTYgIEVyaWsgU3RhaGxtYW4JIGZpeGVkIGF1dG9pcnEsIGFkZGVkIG11bHRpY2FzdAorIC4gCTAyLzAxLzk2ICBFcmlrIFN0YWhsbWFuCSAxLiBkaXNhYmxlZCBhbGwgaW50ZXJydXB0cyBpbiBzbWNfcmVzZXQKKyAuCQkgICAJCSAyLiBnb3QgcmlkIG9mIHBvc3QtZGVjcmVtZW50aW5nIGJ1ZyAtLSBVR0guCisgLgkwMi8xMy85NiAgRXJpayBTdGFobG1hbiAgVHJpZWQgdG8gZml4IGF1dG9pcnEgZmFpbHVyZS4gIEFkZGVkIG1vcmUKKyAuCQkJCSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlcy4KKyAuCTAyLzE1Lzk2ICBFcmlrIFN0YWhsbWFuICBGaXhlZCB0eXBvIHRoYXQgY2F1c2VkIGRldGVjdGlvbiBmYWlsdXJlCisgLiAJMDIvMjMvOTYgIEVyaWsgU3RhaGxtYW4JIE1vZGlmaWVkIGl0IHRvIGZpdCBpbnRvIGtlcm5lbCB0cmVlCisgLgkJCQkgQWRkZWQgc3VwcG9ydCB0byBjaGFuZ2UgaGFyZHdhcmUgYWRkcmVzcworIC4JCQkJIENsZWFyZWQgc3RhdHMgb24gb3BlbnMKKyAuCTAyLzI2Lzk2ICBFcmlrIFN0YWhsbWFuCSBUcmlhbCBzdXBwb3J0IGZvciBLZXJuZWwgMS4yLjEzCisgLgkJCQkgS2x1ZGdlIGZvciBhdXRvbWF0aWMgSVJRIGRldGVjdGlvbgorIC4JMDMvMDQvOTYgIEVyaWsgU3RhaGxtYW4JIEZpeGVkIGtlcm5lbCAxLjMuNzAgKworIC4JCQkJIEZpeGVkIGJ1ZyByZXBvcnRlZCBieSBHYXJkbmVyIEJ1Y2hhbmFuIGluCisgLgkJCQkgICBzbWNfZW5hYmxlLCB3aXRoIG91dHcgaW5zdGVhZCBvZiBvdXRiCisgLgkwMy8wNi85NiAgRXJpayBTdGFobG1hbiAgQWRkZWQgaGFyZHdhcmUgbXVsdGljYXN0IGZyb20gUGV0ZXIgQ2FtbWFlcnQKKyAuCTA0LzE0LzAwICBIZWlrbyBQcnVlc3NpbmcgKFNNQSBSZWdlbHN5c3RlbWUpICBGaXhlZCBidWcgaW4gY2hpcCBtZW1vcnkKKyAuCQkJCSBhbGxvY2F0aW9uCisgLiAgICAgIDA4LzIwLzAwICBBcm5hbGRvIE1lbG8gICBmaXgga2ZyZWUoc2tiKSBpbiBzbWNfaGFyZHdhcmVfc2VuZF9wYWNrZXQKKyAuICAgICAgMTIvMTUvMDAgIENocmlzdGlhbiBKdWxsaWVuIGZpeCAiV2FybmluZzoga2ZyZWVfc2tiIG9uIGhhcmQgSVJRIgorIC4gICAgICAxMS8wOC8wMSBNYXR0IERvbXNjaCAgICAgVXNlIGNvbW1vbiBjcmMzMiBmdW5jdGlvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPQorCSJzbWM5MTk0LmM6djAuMTQgMTIvMTUvMDAgYnkgRXJpayBTdGFobG1hbiAoZXJpa0B2dC5lZHUpXG4iOworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAic21jOTE5NC5oIgorCisjZGVmaW5lIERSVl9OQU1FICJzbWM5MTk0IgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIC4KKyAuIENvbmZpZ3VyYXRpb24gb3B0aW9ucywgZm9yIHRoZSBleHBlcmllbmNlZCB1c2VyIHRvIGNoYW5nZS4KKyAuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgLiBEbyB5b3Ugd2FudCB0byB1c2UgMzIgYml0IHhmZXJzPyAgVGhpcyBzaG91bGQgd29yayBvbiBhbGwgY2hpcHMsIGFzCisgLiB0aGUgY2hpcHNldCBpcyBkZXNpZ25lZCB0byBhY2NvbW1vZGF0ZSB0aGVtLgorKi8KKyNpZmRlZiBfX3NoX18KKyN1bmRlZiBVU0VfMzJfQklUCisjZWxzZQorI2RlZmluZSBVU0VfMzJfQklUIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0g4MzAwSF9fKSB8fCBkZWZpbmVkKF9fSDgzMDBTX18pCisjZGVmaW5lIE5PX0FVVE9QUk9CRQorI3VuZGVmIGluc2wKKyN1bmRlZiBvdXRzbAorI2RlZmluZSBpbnNsKGEsYixsKSAgaW9faW5zbF9ub3N3YXAoYSxiLGwpCisjZGVmaW5lIG91dHNsKGEsYixsKSBpb19vdXRzbF9ub3N3YXAoYSxiLGwpCisjZW5kaWYKKworLyoKKyAudGhlIFNNQzkxOTQgY2FuIGJlIGF0IGFueSBvZiB0aGUgZm9sbG93aW5nIHBvcnQgYWRkcmVzc2VzLiAgVG8gY2hhbmdlLAorIC5mb3IgYSBzbGlnaHRseSBkaWZmZXJlbnQgY2FyZCwgeW91IGNhbiBhZGQgaXQgdG8gdGhlIGFycmF5LiAgS2VlcCBpbgorIC5taW5kIHRoYXQgdGhlIGFycmF5IG11c3QgZW5kIGluIHplcm8uCisqLworCitzdHJ1Y3QgZGV2bGlzdCB7CisJdW5zaWduZWQgaW50IHBvcnQ7CisJdW5zaWduZWQgaW50IGlycTsKK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19IOFNfRURPU0syNjc0KQorc3RhdGljIHN0cnVjdCBkZXZsaXN0IHNtY19kZXZsaXN0W10gX19pbml0ZGF0YSA9IHsKKwl7LnBvcnQgPSAweGY4MDAwMCwgLmlycSA9IDE2fSwKKwl7LnBvcnQgPSAwLCAgICAgICAgLmlycSA9IDAgfSwKK307CisjZWxzZQorc3RhdGljIHN0cnVjdCBkZXZsaXN0IHNtY19kZXZsaXN0W10gX19pbml0ZGF0YSA9IHsKKwl7LnBvcnQgPSAweDIwMCwgLmlycSA9IDB9LAorCXsucG9ydCA9IDB4MjIwLCAuaXJxID0gMH0sCisJey5wb3J0ID0gMHgyNDAsIC5pcnEgPSAwfSwKKwl7LnBvcnQgPSAweDI2MCwgLmlycSA9IDB9LAorCXsucG9ydCA9IDB4MjgwLCAuaXJxID0gMH0sCisJey5wb3J0ID0gMHgyQTAsIC5pcnEgPSAwfSwKKwl7LnBvcnQgPSAweDJDMCwgLmlycSA9IDB9LAorCXsucG9ydCA9IDB4MkUwLCAuaXJxID0gMH0sCisJey5wb3J0ID0gMHgzMDAsIC5pcnEgPSAwfSwKKwl7LnBvcnQgPSAweDMyMCwgLmlycSA9IDB9LAorCXsucG9ydCA9IDB4MzQwLCAuaXJxID0gMH0sCisJey5wb3J0ID0gMHgzNjAsIC5pcnEgPSAwfSwKKwl7LnBvcnQgPSAweDM4MCwgLmlycSA9IDB9LAorCXsucG9ydCA9IDB4M0EwLCAuaXJxID0gMH0sCisJey5wb3J0ID0gMHgzQzAsIC5pcnEgPSAwfSwKKwl7LnBvcnQgPSAweDNFMCwgLmlycSA9IDB9LAorCXsucG9ydCA9IDAsICAgICAuaXJxID0gMH0sCit9OworI2VuZGlmCisvKgorIC4gV2FpdCB0aW1lIGZvciBtZW1vcnkgdG8gYmUgZnJlZS4gIFRoaXMgcHJvYmFibHkgc2hvdWxkbid0IGJlCisgLiB0dW5lZCB0aGF0IG11Y2gsIGFzIHdhaXRpbmcgZm9yIHRoaXMgbWVhbnMgbm90aGluZyBlbHNlIGhhcHBlbnMKKyAuIGluIHRoZSBzeXN0ZW0KKyovCisjZGVmaW5lIE1FTU9SWV9XQUlUX1RJTUUgMTYKKworLyoKKyAuIERFQlVHR0lORyBMRVZFTFMKKyAuCisgLiAwIGZvciBub3JtYWwgb3BlcmF0aW9uCisgLiAxIGZvciBzbGlnaHRseSBtb3JlIGRldGFpbHMKKyAuID4yIGZvciB2YXJpb3VzIGxldmVscyBvZiBpbmNyZWFzaW5nbHkgdXNlbGVzcyBpbmZvcm1hdGlvbgorIC4gICAgMiBmb3IgaW50ZXJydXB0IHRyYWNraW5nLCBzdGF0dXMgZmxhZ3MKKyAuICAgIDMgZm9yIHBhY2tldCBkdW1wcywgZXRjLgorKi8KKyNkZWZpbmUgU01DX0RFQlVHIDAKKworI2lmIChTTUNfREVCVUcgPiAyICkKKyNkZWZpbmUgUFJJTlRLMyh4KSBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgUFJJTlRLMyh4KQorI2VuZGlmCisKKyNpZiBTTUNfREVCVUcgPiAxCisjZGVmaW5lIFBSSU5USzIoeCkgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIFBSSU5USzIoeCkKKyNlbmRpZgorCisjaWZkZWYgU01DX0RFQlVHCisjZGVmaW5lIFBSSU5USyh4KSBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgUFJJTlRLKHgpCisjZW5kaWYKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIC4KKyAuIFRoZSBpbnRlcm5hbCB3b3JraW5ncyBvZiB0aGUgZHJpdmVyLiAgSWYgeW91IGFyZSBjaGFuZ2luZyBhbnl0aGluZworIC4gaGVyZSB3aXRoIHRoZSBTTUMgc3R1ZmYsIHlvdSBzaG91bGQgaGF2ZSB0aGUgZGF0YXNoZWV0IGFuZCBrbm93bgorIC4gd2hhdCB5b3UgYXJlIGRvaW5nLgorIC4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgQ0FSRE5BTUUgIlNNQzkxOTQiCisKKworLyogc3RvcmUgdGhpcyBpbmZvcm1hdGlvbiBmb3IgdGhlIGRyaXZlci4uICovCitzdHJ1Y3Qgc21jX2xvY2FsIHsKKwkvKgorIAkgICB0aGVzZSBhcmUgdGhpbmdzIHRoYXQgdGhlIGtlcm5lbCB3YW50cyBtZSB0byBrZWVwLCBzbyB1c2VycworCSAgIGNhbiBmaW5kIG91dCBzZW1pLXVzZWxlc3Mgc3RhdGlzdGljcyBvZiBob3cgd2VsbCB0aGUgY2FyZCBpcworCSAgIHBlcmZvcm1pbmcKKyAJKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKworCS8qCisJICAgSWYgSSBoYXZlIHRvIHdhaXQgdW50aWwgbWVtb3J5IGlzIGF2YWlsYWJsZSB0byBzZW5kCisJICAgYSBwYWNrZXQsIEkgd2lsbCBzdG9yZSB0aGUgc2tidWZmIGhlcmUsIHVudGlsIEkgZ2V0IHRoZQorCSAgIGRlc2lyZWQgbWVtb3J5LiAgVGhlbiwgSSdsbCBzZW5kIGl0IG91dCBhbmQgZnJlZSBpdC4KKwkqLworCXN0cnVjdCBza19idWZmICogc2F2ZWRfc2tiOworCisJLyoKKyAJIC4gVGhpcyBrZWVwcyB0cmFjayBvZiBob3cgbWFueSBwYWNrZXRzIHRoYXQgSSBoYXZlCisgCSAuIHNlbnQgb3V0LiAgV2hlbiBhbiBUWF9FTVBUWSBpbnRlcnJ1cHQgY29tZXMsIEkga25vdworCSAuIHRoYXQgYWxsIG9mIHRoZXNlIGhhdmUgYmVlbiBzZW50LgorCSovCisJaW50CXBhY2tldHNfd2FpdGluZzsKK307CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIC4KKyAuICBUaGUgZHJpdmVyIGNhbiBiZSBlbnRlcmVkIGF0IGFueSBvZiB0aGUgZm9sbG93aW5nIGVudHJ5IHBvaW50cy4KKyAuCisgLi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgKi8KKworLyoKKyAuIFRoaXMgaXMgY2FsbGVkIGJ5ICByZWdpc3Rlcl9uZXRkZXYoKS4gIEl0IGlzIHJlc3BvbnNpYmxlIGZvcgorIC4gY2hlY2tpbmcgdGhlIHBvcnRsaXN0IGZvciB0aGUgU01DOTAwMCBzZXJpZXMgY2hpcHNldC4gIElmIGl0IGZpbmRzCisgLiBvbmUsIHRoZW4gaXQgd2lsbCBpbml0aWFsaXplIHRoZSBkZXZpY2UsIGZpbmQgdGhlIGhhcmR3YXJlIGluZm9ybWF0aW9uLAorIC4gYW5kIHNldHMgdXAgdGhlIGFwcHJvcHJpYXRlIGRldmljZSBwYXJhbWV0ZXJzLgorIC4gTk9URTogSW50ZXJydXB0cyBhcmUgKk9GRiogd2hlbiB0aGlzIHByb2NlZHVyZSBpcyBjYWxsZWQuCisgLgorIC4gTkI6VGhpcyBzaG91bGRuJ3QgYmUgc3RhdGljIHNpbmNlIGl0IGlzIHJlZmVycmVkIHRvIGV4dGVybmFsbHkuCisqLworc3RydWN0IG5ldF9kZXZpY2UgKnNtY19pbml0KGludCB1bml0KTsKKworLyoKKyAuIFRoZSBrZXJuZWwgY2FsbHMgdGhpcyBmdW5jdGlvbiB3aGVuIHNvbWVvbmUgd2FudHMgdG8gdXNlIHRoZSBkZXZpY2UsCisgLiB0eXBpY2FsbHkgJ2lmY29uZmlnIGV0aFggdXAnLgorKi8KK3N0YXRpYyBpbnQgc21jX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qCisgLiBPdXIgd2F0Y2hkb2cgdGltZWQgb3V0LiBDYWxsZWQgYnkgdGhlIG5ldHdvcmtpbmcgbGF5ZXIKKyovCitzdGF0aWMgdm9pZCBzbWNfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoKKyAuIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBrZXJuZWwgaW4gcmVzcG9uc2UgdG8gJ2lmY29uZmlnIGV0aFggZG93bicuICBJdAorIC4gaXMgcmVzcG9uc2libGUgZm9yIGNsZWFuaW5nIHVwIGV2ZXJ5dGhpbmcgdGhhdCB0aGUgb3BlbiByb3V0aW5lCisgLiBkb2VzLCBhbmQgbWF5YmUgcHV0dGluZyB0aGUgY2FyZCBpbnRvIGEgcG93ZXJkb3duIHN0YXRlLgorKi8KK3N0YXRpYyBpbnQgc21jX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKgorIC4gVGhpcyByb3V0aW5lIGFsbG93cyB0aGUgcHJvYyBmaWxlIHN5c3RlbSB0byBxdWVyeSB0aGUgZHJpdmVyJ3MKKyAuIHN0YXRpc3RpY3MuCisqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogc21jX3F1ZXJ5X3N0YXRpc3RpY3MoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKgorIC4gRmluYWxseSwgYSBjYWxsIHRvIHNldCBwcm9taXNjdW91cyBtb2RlICggZm9yIFRDUERVTVAgYW5kIHJlbGF0ZWQKKyAuIHByb2dyYW1zICkgYW5kIG11bHRpY2FzdCBtb2Rlcy4KKyovCitzdGF0aWMgdm9pZCBzbWNfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgLgorIC4gSW50ZXJydXB0IGxldmVsIGNhbGxzLi4KKyAuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgLiBIYW5kbGVzIHRoZSBhY3R1YWwgaW50ZXJydXB0CisqLworc3RhdGljIGlycXJldHVybl90IHNtY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisvKgorIC4gVGhpcyBpcyBhIHNlcGFyYXRlIHByb2NlZHVyZSB0byBoYW5kbGUgdGhlIHJlY2VpcHQgb2YgYSBwYWNrZXQsIHRvCisgLiBsZWF2ZSB0aGUgaW50ZXJydXB0IGNvZGUgbG9va2luZyBzbGlnaHRseSBjbGVhbmVyCisqLworc3RhdGljIGlubGluZSB2b2lkIHNtY19yY3YoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKy8qCisgLiBUaGlzIGhhbmRsZXMgYSBUWCBpbnRlcnJ1cHQsIHdoaWNoIGlzIG9ubHkgY2FsbGVkIHdoZW4gYW4gZXJyb3IKKyAuIHJlbGF0aW5nIHRvIGEgcGFja2V0IGlzIHNlbnQuCisqLworc3RhdGljIGlubGluZSB2b2lkIHNtY190eCggc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYgKTsKKworLyoKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAuCisgLiBJbnRlcm5hbCByb3V0aW5lcworIC4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8qCisgLiBUZXN0IGlmIGEgZ2l2ZW4gbG9jYXRpb24gY29udGFpbnMgYSBjaGlwLCB0cnlpbmcgdG8gY2F1c2UgYXMKKyAuIGxpdHRsZSBkYW1hZ2UgYXMgcG9zc2libGUgaWYgaXQncyBub3QgYSBTTUMgY2hpcC4KKyovCitzdGF0aWMgaW50IHNtY19wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKTsKKworLyoKKyAuIEEgcmF0aGVyIHNpbXBsZSByb3V0aW5lIHRvIHByaW50IG91dCBhIHBhY2tldCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorKi8KKyNpZiBTTUNfREVCVUcgPiAyCitzdGF0aWMgdm9pZCBwcmludF9wYWNrZXQoIGJ5dGUgKiwgaW50ICk7CisjZW5kaWYKKworI2RlZmluZSB0eF9kb25lKGRldikgMQorCisvKiB0aGlzIGlzIGNhbGxlZCB0byBhY3R1YWxseSBzZW5kIHRoZSBwYWNrZXQgdG8gdGhlIGNoaXAgKi8KK3N0YXRpYyB2b2lkIHNtY19oYXJkd2FyZV9zZW5kX3BhY2tldCggc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYgKTsKKworLyogU2luY2UgSSBhbSBub3Qgc3VyZSBpZiBJIHdpbGwgaGF2ZSBlbm91Z2ggcm9vbSBpbiB0aGUgY2hpcCdzIHJhbQorIC4gdG8gc3RvcmUgdGhlIHBhY2tldCwgSSBjYWxsIHRoaXMgcm91dGluZSwgd2hpY2ggZWl0aGVyIHNlbmRzIGl0CisgLiBub3csIG9yIGdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQgd2hlbiB0aGUgY2FyZCBpcyByZWFkeSBmb3IgdGhlCisgLiBwYWNrZXQgKi8KK3N0YXRpYyBpbnQgIHNtY193YWl0X3RvX3NlbmRfcGFja2V0KCBzdHJ1Y3Qgc2tfYnVmZiAqIHNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCisvKiB0aGlzIGRvZXMgYSBzb2Z0IHJlc2V0IG9uIHRoZSBkZXZpY2UgKi8KK3N0YXRpYyB2b2lkIHNtY19yZXNldCggaW50IGlvYWRkciApOworCisvKiBFbmFibGUgSW50ZXJydXB0cywgUmVjZWl2ZSwgYW5kIFRyYW5zbWl0ICovCitzdGF0aWMgdm9pZCBzbWNfZW5hYmxlKCBpbnQgaW9hZGRyICk7CisKKy8qIHRoaXMgcHV0cyB0aGUgZGV2aWNlIGluIGFuIGluYWN0aXZlIHN0YXRlICovCitzdGF0aWMgdm9pZCBzbWNfc2h1dGRvd24oIGludCBpb2FkZHIgKTsKKworLyogVGhpcyByb3V0aW5lIHdpbGwgZmluZCB0aGUgSVJRIG9mIHRoZSBkcml2ZXIgaWYgb25lIGlzIG5vdAorIC4gc3BlY2lmaWVkIGluIHRoZSBpbnB1dCB0byB0aGUgZGV2aWNlLiAgKi8KK3N0YXRpYyBpbnQgc21jX2ZpbmRpcnEoIGludCBpb2FkZHIgKTsKKworLyoKKyAuIEZ1bmN0aW9uOiBzbWNfcmVzZXQoIGludCBpb2FkZHIgKQorIC4gUHVycG9zZToKKyAuICAJVGhpcyBzZXRzIHRoZSBTTUM5MXh4IGNoaXAgdG8gaXRzIG5vcm1hbCBzdGF0ZSwgaG9wZWZ1bGx5IGZyb20gd2hhdGV2ZXIKKyAuIAltZXNzIHRoYXQgYW55IG90aGVyIERPUyBkcml2ZXIgaGFzIHB1dCBpdCBpbi4KKyAuCisgLiBNYXliZSBJIHNob3VsZCByZXNldCBtb3JlIHJlZ2lzdGVycyB0byBkZWZhdWx0cyBpbiBoZXJlPyAgU09GVFJFU0VUICBzaG91bGQKKyAuIGRvIHRoYXQgZm9yIG1lLgorIC4KKyAuIE1ldGhvZDoKKyAuCTEuICBzZW5kIGEgU09GVCBSRVNFVAorIC4JMi4gIHdhaXQgZm9yIGl0IHRvIGZpbmlzaAorIC4JMy4gIGVuYWJsZSBhdXRvcmVsZWFzZSBtb2RlCisgLgk0LiAgcmVzZXQgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHVuaXQKKyAuCTUuICBjbGVhciBhbGwgaW50ZXJydXB0cworIC4KKyovCitzdGF0aWMgdm9pZCBzbWNfcmVzZXQoIGludCBpb2FkZHIgKQoreworCS8qIFRoaXMgcmVzZXRzIHRoZSByZWdpc3RlcnMgbW9zdGx5IHRvIGRlZmF1bHRzLCBidXQgZG9lc24ndAorCSAgIGFmZmVjdCBFRVBST00uICBUaGF0IHNlZW1zIHVubmVjZXNzYXJ5ICovCisJU01DX1NFTEVDVF9CQU5LKCAwICk7CisJb3V0dyggUkNSX1NPRlRSRVNFVCwgaW9hZGRyICsgUkNSICk7CisKKwkvKiB0aGlzIHNob3VsZCBwYXVzZSBlbm91Z2ggZm9yIHRoZSBjaGlwIHRvIGJlIGhhcHB5ICovCisJU01DX0RFTEFZKCApOworCisJLyogU2V0IHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyB0bworCSAgIGRlZmF1bHQgdmFsdWVzICovCisJb3V0dyggUkNSX0NMRUFSLCBpb2FkZHIgKyBSQ1IgKTsKKwlvdXR3KCBUQ1JfQ0xFQVIsIGlvYWRkciArIFRDUiApOworCisJLyogc2V0IHRoZSBjb250cm9sIHJlZ2lzdGVyIHRvIGF1dG9tYXRpY2FsbHkKKwkgICByZWxlYXNlIHN1Y2Nlc3NmdWxseSB0cmFuc21pdHRlZCBwYWNrZXRzLCB0byBtYWtlIHRoZSBiZXN0CisJICAgdXNlIG91dCBvZiBvdXIgbGltaXRlZCBtZW1vcnkgKi8KKwlTTUNfU0VMRUNUX0JBTksoIDEgKTsKKwlvdXR3KCBpbncoIGlvYWRkciArIENPTlRST0wgKSB8IENUTF9BVVRPX1JFTEVBU0UgLCBpb2FkZHIgKyBDT05UUk9MICk7CisKKwkvKiBSZXNldCB0aGUgTU1VICovCisJU01DX1NFTEVDVF9CQU5LKCAyICk7CisJb3V0dyggTUNfUkVTRVQsIGlvYWRkciArIE1NVV9DTUQgKTsKKworCS8qIE5vdGU6ICBJdCBkb2Vzbid0IHNlZW0gdGhhdCB3YWl0aW5nIGZvciB0aGUgTU1VIGJ1c3kgaXMgbmVlZGVkIGhlcmUsCisJICAgYnV0IHRoaXMgaXMgYSBwbGFjZSB3aGVyZSBmdXR1cmUgY2hpcHNldHMgX0NPVUxEXyBicmVhay4gIEJlIHdhcnkKKyAJICAgb2YgaXNzdWluZyBhbm90aGVyIE1NVSBjb21tYW5kIHJpZ2h0IGFmdGVyIHRoaXMgKi8KKworCW91dGIoIDAsIGlvYWRkciArIElOVF9NQVNLICk7Cit9CisKKy8qCisgLiBGdW5jdGlvbjogc21jX2VuYWJsZQorIC4gUHVycG9zZTogbGV0IHRoZSBjaGlwIHRhbGsgdG8gdGhlIG91dHNpZGUgd29yaworIC4gTWV0aG9kOgorIC4JMS4gIEVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIKKyAuCTIuICBFbmFibGUgdGhlIHJlY2VpdmVyCisgLgkzLiAgRW5hYmxlIGludGVycnVwdHMKKyovCitzdGF0aWMgdm9pZCBzbWNfZW5hYmxlKCBpbnQgaW9hZGRyICkKK3sKKwlTTUNfU0VMRUNUX0JBTksoIDAgKTsKKwkvKiBzZWUgdGhlIGhlYWRlciBmaWxlIGZvciBvcHRpb25zIGluIFRDUi9SQ1IgTk9STUFMKi8KKwlvdXR3KCBUQ1JfTk9STUFMLCBpb2FkZHIgKyBUQ1IgKTsKKwlvdXR3KCBSQ1JfTk9STUFMLCBpb2FkZHIgKyBSQ1IgKTsKKworCS8qIG5vdywgZW5hYmxlIGludGVycnVwdHMgKi8KKwlTTUNfU0VMRUNUX0JBTksoIDIgKTsKKwlvdXRiKCBTTUNfSU5URVJSVVBUX01BU0ssIGlvYWRkciArIElOVF9NQVNLICk7Cit9CisKKy8qCisgLiBGdW5jdGlvbjogc21jX3NodXRkb3duCisgLiBQdXJwb3NlOiAgY2xvc2VzIGRvd24gdGhlIFNNQzkxeHh4IGNoaXAuCisgLiBNZXRob2Q6CisgLgkxLiB6ZXJvIHRoZSBpbnRlcnJ1cHQgbWFzaworIC4JMi4gY2xlYXIgdGhlIGVuYWJsZSByZWNlaXZlIGZsYWcKKyAuCTMuIGNsZWFyIHRoZSBlbmFibGUgeG1pdCBmbGFncworIC4KKyAuIFRPRE86CisgLiAgICgxKSBtYXliZSB1dGlsaXplIHBvd2VyIGRvd24gbW9kZS4KKyAuCVdoeSBub3QgeWV0PyAgQmVjYXVzZSB3aGlsZSB0aGUgY2hpcCB3aWxsIGdvIGludG8gcG93ZXIgZG93biBtb2RlLAorIC4JdGhlIG1hbnVhbCBzYXlzIHRoYXQgaXQgd2lsbCB3YWtlIHVwIGluIHJlc3BvbnNlIHRvIGFueSBJL08gcmVxdWVzdHMKKyAuCWluIHRoZSByZWdpc3RlciBzcGFjZS4gICBFbXBpcmljYWwgcmVzdWx0cyBkbyBub3Qgc2hvdyB0aGlzIHdvcmtpbmcuCisqLworc3RhdGljIHZvaWQgc21jX3NodXRkb3duKCBpbnQgaW9hZGRyICkKK3sKKwkvKiBubyBtb3JlIGludGVycnVwdHMgZm9yIG1lICovCisJU01DX1NFTEVDVF9CQU5LKCAyICk7CisJb3V0YiggMCwgaW9hZGRyICsgSU5UX01BU0sgKTsKKworCS8qIGFuZCB0ZWxsIHRoZSBjYXJkIHRvIHN0YXkgYXdheSBmcm9tIHRoYXQgbmFzdHkgb3V0c2lkZSB3b3JsZCAqLworCVNNQ19TRUxFQ1RfQkFOSyggMCApOworCW91dGIoIFJDUl9DTEVBUiwgaW9hZGRyICsgUkNSICk7CisJb3V0YiggVENSX0NMRUFSLCBpb2FkZHIgKyBUQ1IgKTsKKyNpZiAwCisJLyogZmluYWxseSwgc2h1dCB0aGUgY2hpcCBkb3duICovCisJU01DX1NFTEVDVF9CQU5LKCAxICk7CisJb3V0dyggaW53KCBpb2FkZHIgKyBDT05UUk9MICksIENUTF9QT1dFUkRPV04sIGlvYWRkciArIENPTlRST0wgICk7CisjZW5kaWYKK30KKworCisvKgorIC4gRnVuY3Rpb246IHNtY19zZXRtdWx0aWNhc3QoIGludCBpb2FkZHIsIGludCBjb3VudCwgZGV2X21jX2xpc3QgKiBhZGRzICkKKyAuIFB1cnBvc2U6CisgLiAgICBUaGlzIHNldHMgdGhlIGludGVybmFsIGhhcmR3YXJlIHRhYmxlIHRvIGZpbHRlciBvdXQgdW53YW50ZWQgbXVsdGljYXN0CisgLiAgICBwYWNrZXRzIGJlZm9yZSB0aGV5IHRha2UgdXAgbWVtb3J5LgorIC4KKyAuICAgIFRoZSBTTUMgY2hpcCB1c2VzIGEgaGFzaCB0YWJsZSB3aGVyZSB0aGUgaGlnaCA2IGJpdHMgb2YgdGhlIENSQyBvZgorIC4gICAgYWRkcmVzcyBhcmUgdGhlIG9mZnNldCBpbnRvIHRoZSB0YWJsZS4gIElmIHRoYXQgYml0IGlzIDEsIHRoZW4gdGhlCisgLiAgICBtdWx0aWNhc3QgcGFja2V0IGlzIGFjY2VwdGVkLiAgT3RoZXJ3aXNlLCBpdCdzIGRyb3BwZWQgc2lsZW50bHkuCisgLgorIC4gICAgVG8gdXNlIHRoZSA2IGJpdHMgYXMgYW4gb2Zmc2V0IGludG8gdGhlIHRhYmxlLCB0aGUgaGlnaCAzIGJpdHMgYXJlIHRoZQorIC4gICAgbnVtYmVyIG9mIHRoZSA4IGJpdCByZWdpc3Rlciwgd2hpbGUgdGhlIGxvdyAzIGJpdHMgYXJlIHRoZSBiaXQgd2l0aGluCisgLiAgICB0aGF0IHJlZ2lzdGVyLgorIC4KKyAuIFRoaXMgcm91dGluZSBpcyBiYXNlZCB2ZXJ5IGhlYXZpbHkgb24gdGhlIG9uZSBwcm92aWRlZCBieSBQZXRlciBDYW1tYWVydC4KKyovCisKKworc3RhdGljIHZvaWQgc21jX3NldG11bHRpY2FzdCggaW50IGlvYWRkciwgaW50IGNvdW50LCBzdHJ1Y3QgZGV2X21jX2xpc3QgKiBhZGRycyApIHsKKwlpbnQJCQlpOworCXVuc2lnbmVkIGNoYXIJCW11bHRpY2FzdF90YWJsZVsgOCBdOworCXN0cnVjdCBkZXZfbWNfbGlzdAkqIGN1cl9hZGRyOworCS8qIHRhYmxlIGZvciBmbGlwcGluZyB0aGUgb3JkZXIgb2YgMyBiaXRzICovCisJdW5zaWduZWQgY2hhciBpbnZlcnQzW10gPSB7IDAsIDQsIDIsIDYsIDEsIDUsIDMsIDcgfTsKKworCS8qIHN0YXJ0IHdpdGggYSB0YWJsZSBvZiBhbGwgemVyb3M6IHJlamVjdCBhbGwgKi8KKwltZW1zZXQoIG11bHRpY2FzdF90YWJsZSwgMCwgc2l6ZW9mKCBtdWx0aWNhc3RfdGFibGUgKSApOworCisJY3VyX2FkZHIgPSBhZGRyczsKKwlmb3IgKCBpID0gMDsgaSA8IGNvdW50IDsgaSArKywgY3VyX2FkZHIgPSBjdXJfYWRkci0+bmV4dCAgKSB7CisJCWludCBwb3NpdGlvbjsKKworCQkvKiBkbyB3ZSBoYXZlIGEgcG9pbnRlciBoZXJlPyAqLworCQlpZiAoICFjdXJfYWRkciApCisJCQlicmVhazsKKwkJLyogbWFrZSBzdXJlIHRoaXMgaXMgYSBtdWx0aWNhc3QgYWRkcmVzcyAtIHNob3VsZG4ndCB0aGlzCisJCSAgIGJlIGEgZ2l2ZW4gaWYgd2UgaGF2ZSBpdCBoZXJlID8gKi8KKwkJaWYgKCAhKCAqY3VyX2FkZHItPmRtaV9hZGRyICYgMSApICkKKwkJCWNvbnRpbnVlOworCisJCS8qIG9ubHkgdXNlIHRoZSBsb3cgb3JkZXIgYml0cyAqLworCQlwb3NpdGlvbiA9IGV0aGVyX2NyY19sZSg2LCBjdXJfYWRkci0+ZG1pX2FkZHIpICYgMHgzZjsKKworCQkvKiBkbyBzb21lIG1lc3N5IHN3YXBwaW5nIHRvIHB1dCB0aGUgYml0IGluIHRoZSByaWdodCBzcG90ICovCisJCW11bHRpY2FzdF90YWJsZVtpbnZlcnQzW3Bvc2l0aW9uJjddXSB8PQorCQkJCQkoMTw8aW52ZXJ0M1socG9zaXRpb24+PjMpJjddKTsKKworCX0KKwkvKiBub3csIHRoZSB0YWJsZSBjYW4gYmUgbG9hZGVkIGludG8gdGhlIGNoaXBzZXQgKi8KKwlTTUNfU0VMRUNUX0JBTksoIDMgKTsKKworCWZvciAoIGkgPSAwOyBpIDwgOCA7IGkrKyApIHsKKwkJb3V0YiggbXVsdGljYXN0X3RhYmxlW2ldLCBpb2FkZHIgKyBNVUxUSUNBU1QxICsgaSApOworCX0KK30KKworLyoKKyAuIEZ1bmN0aW9uOiBzbWNfd2FpdF90b19zZW5kX3BhY2tldCggc3RydWN0IHNrX2J1ZmYgKiBza2IsIHN0cnVjdCBuZXRfZGV2aWNlICogKQorIC4gUHVycG9zZToKKyAuICAgIEF0dGVtcHQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhIHBhY2tldCwgaWYgY2hpcC1tZW1vcnkgaXMgbm90CisgLiAgICBhdmFpbGFibGUsIHRoZW4gdGVsbCB0aGUgY2FyZCB0byBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQgd2hlbiBpdAorIC4gICAgaXMgYXZhaWxhYmxlLgorIC4KKyAuIEFsZ29yaXRobToKKyAuCisgLiBvCWlmIHRoZSBzYXZlZF9za2IgaXMgbm90IGN1cnJlbnRseSBudWxsLCB0aGVuIGRyb3AgdGhpcyBwYWNrZXQKKyAuCW9uIHRoZSBmbG9vci4gIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYmVjYXVzZSBvZiBUQlVTWS4KKyAuIG8JaWYgdGhlIHNhdmVkX3NrYiBpcyBudWxsLCB0aGVuIHJlcGxhY2UgaXQgd2l0aCB0aGUgY3VycmVudCBwYWNrZXQsCisgLiBvCVNlZSBpZiBJIGNhbiBzZW5kaW5nIGl0IG5vdy4KKyAuIG8gCShOTyk6IEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCBsZXQgdGhlIGludGVycnVwdCBoYW5kbGVyIGRlYWwgd2l0aCBpdC4KKyAuIG8JKFlFUyk6U2VuZCBpdCBub3cuCisqLworc3RhdGljIGludCBzbWNfd2FpdF90b19zZW5kX3BhY2tldCggc3RydWN0IHNrX2J1ZmYgKiBza2IsIHN0cnVjdCBuZXRfZGV2aWNlICogZGV2ICkKK3sKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IGlvYWRkciAJPSBkZXYtPmJhc2VfYWRkcjsKKwl3b3JkIAkJCWxlbmd0aDsKKwl1bnNpZ25lZCBzaG9ydCAJCW51bVBhZ2VzOworCXdvcmQJCQl0aW1lX291dDsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkvKiBXZWxsLCBJIHdhbnQgdG8gc2VuZCB0aGUgcGFja2V0Li4gYnV0IEkgZG9uJ3Qga25vdworCSAgIGlmIEkgY2FuIHNlbmQgaXQgcmlnaHQgbm93Li4uICAqLworCisJaWYgKCBscC0+c2F2ZWRfc2tiKSB7CisJCS8qIFRISVMgU0hPVUxEIE5FVkVSIEhBUFBFTi4gKi8KKwkJbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCXByaW50ayhDQVJETkFNRSI6IEJhZCBDcmF6aW5lc3MgLSBzZW50IHBhY2tldCB3aGlsZSBidXN5LlxuIiApOworCQlyZXR1cm4gMTsKKwl9CisJbHAtPnNhdmVkX3NrYiA9IHNrYjsKKworCWxlbmd0aCA9IHNrYi0+bGVuOworCisJaWYgKGxlbmd0aCA8IEVUSF9aTEVOKSB7CisJCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlsZW5ndGggPSBFVEhfWkxFTjsKKwl9CisJCQorCS8qCisJKiogVGhlIE1NVSB3YW50cyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGJlIHRoZSBudW1iZXIgb2YgMjU2IGJ5dGVzCisJKiogJ3BhZ2VzJywgbWludXMgMSAoIHNpbmNlIGEgcGFja2V0IGNhbid0IGV2ZXIgaGF2ZSAwIHBhZ2VzIDopICkKKwkqKgorCSoqIFBrdCBzaXplIGZvciBhbGxvY2F0aW5nIGlzIGRhdGEgbGVuZ3RoICs2IChmb3IgYWRkaXRpb25hbCBzdGF0dXMgd29yZHMsCisJKiogbGVuZ3RoIGFuZCBjdGwhKSBJZiBvZGQgc2l6ZSBsYXN0IGJ5dGUgaXMgaW5jbHVkZWQgaW4gdGhpcyBoZWFkZXIuCisJKi8KKwludW1QYWdlcyA9ICAoKGxlbmd0aCAmIDB4ZmZmZSkgKyA2KSAvIDI1NjsKKworCWlmIChudW1QYWdlcyA+IDcgKSB7CisJCXByaW50ayhDQVJETkFNRSI6IEZhciB0b28gYmlnIHBhY2tldCBlcnJvci4gXG4iKTsKKwkJLyogZnJlZWluZyB0aGUgcGFja2V0IGlzIGEgZ29vZCB0aGluZyBoZXJlLi4uIGJ1dCBzaG91bGQKKwkJIC4gYW55IHBhY2tldHMgb2YgdGhpcyBzaXplIGdldCBkb3duIGhlcmU/ICAgKi8KKwkJZGV2X2tmcmVlX3NrYiAoc2tiKTsKKwkJbHAtPnNhdmVkX3NrYiA9IE5VTEw7CisJCS8qIHRoaXMgSVMgYW4gZXJyb3IsIGJ1dCwgaSBkb24ndCB3YW50IHRoZSBza2Igc2F2ZWQgKi8KKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQlyZXR1cm4gMDsKKwl9CisJLyogZWl0aGVyIHdheSwgYSBwYWNrZXQgaXMgd2FpdGluZyBub3cgKi8KKwlscC0+cGFja2V0c193YWl0aW5nKys7CisKKwkvKiBub3csIHRyeSB0byBhbGxvY2F0ZSB0aGUgbWVtb3J5ICovCisJU01DX1NFTEVDVF9CQU5LKCAyICk7CisJb3V0dyggTUNfQUxMT0MgfCBudW1QYWdlcywgaW9hZGRyICsgTU1VX0NNRCApOworCS8qCisgCS4gUGVyZm9ybWFuY2UgSGFjaworCS4KKyAJLiB3YWl0IGEgc2hvcnQgYW1vdW50IG9mIHRpbWUuLiBpZiBJIGNhbiBzZW5kIGEgcGFja2V0IG5vdywgSSBzZW5kCisJLiBpdCBub3cuICBPdGhlcndpc2UsIEkgZW5hYmxlIGFuIGludGVycnVwdCBhbmQgd2FpdCBmb3Igb25lIHRvIGJlCisJLiBhdmFpbGFibGUuCisJLgorCS4gSSBjb3VsZCBoYXZlIGhhbmRsZWQgdGhpcyBhIHNsaWdodGx5IGRpZmZlcmVudCB3YXksIGJ5IGNoZWNraW5nIHRvCisJLiBzZWUgaWYgYW55IG1lbW9yeSB3YXMgYXZhaWxhYmxlIGluIHRoZSBGUkVFIE1FTU9SWSByZWdpc3Rlci4gIEhvd2V2ZXIsCisJLiBlaXRoZXIgd2F5LCBJIG5lZWQgdG8gZ2VuZXJhdGUgYW4gYWxsb2NhdGlvbiwgYW5kIHRoZSBhbGxvY2F0aW9uIHdvcmtzCisJLiBubyBtYXR0ZXIgd2hhdCwgc28gSSBzYXcgbm8gcG9pbnQgaW4gY2hlY2tpbmcgZnJlZSBtZW1vcnkuCisJKi8KKwl0aW1lX291dCA9IE1FTU9SWV9XQUlUX1RJTUU7CisJZG8geworCQl3b3JkCXN0YXR1czsKKworCQlzdGF0dXMgPSBpbmIoIGlvYWRkciArIElOVEVSUlVQVCApOworCQlpZiAoIHN0YXR1cyAmIElNX0FMTE9DX0lOVCApIHsKKwkJCS8qIGFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHQgKi8KKwkJCW91dGIoIElNX0FMTE9DX0lOVCwgaW9hZGRyICsgSU5URVJSVVBUICk7CisgIAkJCWJyZWFrOworCQl9CisgICAJfSB3aGlsZSAoIC0tIHRpbWVfb3V0ICk7CisKKyAgIAlpZiAoICF0aW1lX291dCApIHsKKwkJLyogb2ggd2VsbCwgd2FpdCB1bnRpbCB0aGUgY2hpcCBmaW5kcyBtZW1vcnkgbGF0ZXIgKi8KKwkJU01DX0VOQUJMRV9JTlQoIElNX0FMTE9DX0lOVCApOworICAgICAgCQlQUklOVEsyKChDQVJETkFNRSI6IG1lbW9yeSBhbGxvY2F0aW9uIGRlZmVycmVkLiBcbiIpKTsKKwkJLyogaXQncyBkZWZlcnJlZCwgYnV0IEknbGwgaGFuZGxlIGl0IGxhdGVyICovCisgICAgICAJCXJldHVybiAwOworICAgCX0KKwkvKiBvciBZRVMhIEkgY2FuIHNlbmQgdGhlIHBhY2tldCBub3cuLiAqLworCXNtY19oYXJkd2FyZV9zZW5kX3BhY2tldChkZXYpOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAuIEZ1bmN0aW9uOiAgc21jX2hhcmR3YXJlX3NlbmRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICogKQorIC4gUHVycG9zZToKKyAuCVRoaXMgc2VuZHMgdGhlIGFjdHVhbCBwYWNrZXQgdG8gdGhlIFNNQzl4eHggY2hpcC4KKyAuCisgLiBBbGdvcml0aG06CisgLiAJRmlyc3QsIHNlZSBpZiBhIHNhdmVkX3NrYiBpcyBhdmFpbGFibGUuCisgLgkJKCB0aGlzIHNob3VsZCBOT1QgYmUgY2FsbGVkIGlmIHRoZXJlIGlzIG5vICdzYXZlZF9za2InCisgLglOb3csIGZpbmQgdGhlIHBhY2tldCBudW1iZXIgdGhhdCB0aGUgY2hpcCBhbGxvY2F0ZWQKKyAuCVBvaW50IHRoZSBkYXRhIHBvaW50ZXJzIGF0IGl0IGluIG1lbW9yeQorIC4JU2V0IHRoZSBsZW5ndGggd29yZCBpbiB0aGUgY2hpcCdzIG1lbW9yeQorIC4JRHVtcCB0aGUgcGFja2V0IHRvIGNoaXAgbWVtb3J5CisgLglDaGVjayBpZiBhIGxhc3QgYnl0ZSBpcyBuZWVkZWQgKCBvZGQgbGVuZ3RoIHBhY2tldCApCisgLgkJaWYgc28sIHNldCB0aGUgY29udHJvbCBmbGFnIHJpZ2h0CisgLiAJVGVsbCB0aGUgY2FyZCB0byBzZW5kIGl0CisgLglFbmFibGUgdGhlIHRyYW5zbWl0IGludGVycnVwdCwgc28gSSBrbm93IGlmIGl0IGZhaWxlZAorIC4gCUZyZWUgdGhlIGtlcm5lbCBkYXRhIGlmIEkgYWN0dWFsbHkgc2VudCBpdC4KKyovCitzdGF0aWMgdm9pZCBzbWNfaGFyZHdhcmVfc2VuZF9wYWNrZXQoIHN0cnVjdCBuZXRfZGV2aWNlICogZGV2ICkKK3sKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJYnl0ZQkgCQlwYWNrZXRfbm87CisJc3RydWN0IHNrX2J1ZmYgKiAJc2tiID0gbHAtPnNhdmVkX3NrYjsKKwl3b3JkCQkJbGVuZ3RoOworCXVuc2lnbmVkIGludAkJaW9hZGRyOworCWJ5dGUJCQkqIGJ1ZjsKKworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKCAhc2tiICkgeworCQlQUklOVEsoKENBUkROQU1FIjogSW4gWE1JVCB3aXRoIG5vIHBhY2tldCB0byBzZW5kIFxuIikpOworCQlyZXR1cm47CisJfQorCWxlbmd0aCA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOworCWJ1ZiA9IHNrYi0+ZGF0YTsKKworCS8qIElmIEkgZ2V0IGhlcmUsIEkgX2tub3dfIHRoZXJlIGlzIGEgcGFja2V0IHNsb3Qgd2FpdGluZyBmb3IgbWUgKi8KKwlwYWNrZXRfbm8gPSBpbmIoIGlvYWRkciArIFBOUl9BUlIgKyAxICk7CisJaWYgKCBwYWNrZXRfbm8gJiAweDgwICkgeworCQkvKiBvciBpc24ndCB0aGVyZT8gIEJBRCBDSElQISAqLworCQlwcmludGsoS0VSTl9ERUJVRyBDQVJETkFNRSI6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gXG4iKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJbHAtPnNhdmVkX3NrYiA9IE5VTEw7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJcmV0dXJuOworCX0KKworCS8qIHdlIGhhdmUgYSBwYWNrZXQgYWRkcmVzcywgc28gdGVsbCB0aGUgY2FyZCB0byB1c2UgaXQgKi8KKwlvdXRiKCBwYWNrZXRfbm8sIGlvYWRkciArIFBOUl9BUlIgKTsKKworCS8qIHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhY2tldCAqLworCW91dHcoIFBUUl9BVVRPSU5DICwgaW9hZGRyICsgUE9JTlRFUiApOworCisgICAJUFJJTlRLMygoQ0FSRE5BTUUiOiBUcnlpbmcgdG8geG1pdCBwYWNrZXQgb2YgbGVuZ3RoICV4XG4iLCBsZW5ndGggKSk7CisjaWYgU01DX0RFQlVHID4gMgorCXByaW50X3BhY2tldCggYnVmLCBsZW5ndGggKTsKKyNlbmRpZgorCisJLyogc2VuZCB0aGUgcGFja2V0IGxlbmd0aCAoICs2IGZvciBzdGF0dXMsIGxlbmd0aCBhbmQgY3RsIGJ5dGUgKQorIAkgICBhbmQgdGhlIHN0YXR1cyB3b3JkICggc2V0IHRvIHplcm9zICkgKi8KKyNpZmRlZiBVU0VfMzJfQklUCisJb3V0bCggIChsZW5ndGggKzYgKSA8PCAxNiAsIGlvYWRkciArIERBVEFfMSApOworI2Vsc2UKKwlvdXR3KCAwLCBpb2FkZHIgKyBEQVRBXzEgKTsKKwkvKiBzZW5kIHRoZSBwYWNrZXQgbGVuZ3RoICggKzYgZm9yIHN0YXR1cyB3b3JkcywgbGVuZ3RoLCBhbmQgY3RsKi8KKwlvdXRiKCAobGVuZ3RoKzYpICYgMHhGRixpb2FkZHIgKyBEQVRBXzEgKTsKKwlvdXRiKCAobGVuZ3RoKzYpID4+IDggLCBpb2FkZHIgKyBEQVRBXzEgKTsKKyNlbmRpZgorCisJLyogc2VuZCB0aGUgYWN0dWFsIGRhdGEKKwkgLiBJIF90aGlua18gaXQncyBmYXN0ZXIgdG8gc2VuZCB0aGUgbG9uZ3MgZmlyc3QsIGFuZCB0aGVuCisJIC4gbW9wIHVwIGJ5IHNlbmRpbmcgdGhlIGxhc3Qgd29yZC4gIEl0IGRlcGVuZHMgaGVhdmlseQorIAkgLiBvbiBhbGlnbm1lbnQsIGF0IGxlYXN0IG9uIHRoZSA0ODYuICBNYXliZSBpdCB3b3VsZCBiZQorIAkgLiBhIGdvb2QgaWRlYSB0byBjaGVjayB3aGljaCBpcyBvcHRpbWFsPyAgQnV0IHRoYXQgY291bGQgdGFrZQorCSAuIGFsbW9zdCBhcyBtdWNoIHRpbWUgYXMgaXMgc2F2ZWQ/CisJKi8KKyNpZmRlZiBVU0VfMzJfQklUCisJaWYgKCBsZW5ndGggJiAweDIgICkgeworCQlvdXRzbChpb2FkZHIgKyBEQVRBXzEsIGJ1ZiwgIGxlbmd0aCA+PiAyICk7CisjaWYgIWRlZmluZWQoX19IODMwMEhfXykgJiYgIWRlZmluZWQoX19IODMwMFNfXykKKwkJb3V0dyggKigod29yZCAqKShidWYgKyAobGVuZ3RoICYgMHhGRkZGRkZGQykpKSxpb2FkZHIgK0RBVEFfMSk7CisjZWxzZQorCQljdHJsX291dHcoICooKHdvcmQgKikoYnVmICsgKGxlbmd0aCAmIDB4RkZGRkZGRkMpKSksaW9hZGRyICtEQVRBXzEpOworI2VuZGlmCisJfQorCWVsc2UKKwkJb3V0c2woaW9hZGRyICsgREFUQV8xLCBidWYsICBsZW5ndGggPj4gMiApOworI2Vsc2UKKwlvdXRzdyhpb2FkZHIgKyBEQVRBXzEgLCBidWYsIChsZW5ndGggKSA+PiAxKTsKKyNlbmRpZgorCS8qIFNlbmQgdGhlIGxhc3QgYnl0ZSwgaWYgdGhlcmUgaXMgb25lLiAgICovCisKKwlpZiAoIChsZW5ndGggJiAxKSA9PSAwICkgeworCQlvdXR3KCAwLCBpb2FkZHIgKyBEQVRBXzEgKTsKKwl9IGVsc2UgeworCQlvdXRiKCBidWZbbGVuZ3RoIC0xIF0sIGlvYWRkciArIERBVEFfMSApOworCQlvdXRiKCAweDIwLCBpb2FkZHIgKyBEQVRBXzEpOworCX0KKworCS8qIGVuYWJsZSB0aGUgaW50ZXJydXB0cyAqLworCVNNQ19FTkFCTEVfSU5UKCAoSU1fVFhfSU5UIHwgSU1fVFhfRU1QVFlfSU5UKSApOworCisJLyogYW5kIGxldCB0aGUgY2hpcHNldCBkZWFsIHdpdGggaXQgKi8KKwlvdXR3KCBNQ19FTlFVRVVFICwgaW9hZGRyICsgTU1VX0NNRCApOworCisJUFJJTlRLMigoQ0FSRE5BTUUiOiBTZW50IHBhY2tldCBvZiBsZW5ndGggJWQgXG4iLGxlbmd0aCkpOworCisJbHAtPnNhdmVkX3NrYiA9IE5VTEw7CisJZGV2X2tmcmVlX3NrYl9hbnkgKHNrYik7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIHdlIGNhbiBzZW5kIGFub3RoZXIgcGFja2V0ICovCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJcmV0dXJuOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB8CisgfCBzbWNfaW5pdChpbnQgdW5pdCkKKyB8ICAgSW5wdXQgcGFyYW1ldGVyczoKKyB8CWRldi0+YmFzZV9hZGRyID09IDAsIHRyeSB0byBmaW5kIGFsbCBwb3NzaWJsZSBsb2NhdGlvbnMKKyB8CWRldi0+YmFzZV9hZGRyID09IDEsIHJldHVybiBmYWlsdXJlIGNvZGUKKyB8CWRldi0+YmFzZV9hZGRyID09IDIsIGFsd2F5cyBhbGxvY2F0ZSBzcGFjZSwgIGFuZCByZXR1cm4gc3VjY2VzcworIHwJZGV2LT5iYXNlX2FkZHIgPT0gPGFueXRoaW5nIGVsc2U+ICAgdGhpcyBpcyB0aGUgYWRkcmVzcyB0byBjaGVjaworIHwKKyB8ICAgT3V0cHV0OgorIHwJcG9pbnRlciB0byBuZXRfZGV2aWNlIG9yIEVSUl9QVFIoZXJyb3IpCisgfAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyBpbnQgaW87CitzdGF0aWMgaW50IGlycTsKK3N0YXRpYyBpbnQgaWZwb3J0OworCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBzbWNfaW5pdChpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBzbWNfbG9jYWwpKTsKKwlzdGF0aWMgc3RydWN0IGRldmxpc3QgKnNtY2RldiA9IHNtY19kZXZsaXN0OworCWludCBlcnIgPSAwOworCisjaWZuZGVmIE5PX0FVVE9QUk9CRQorCXNtY2RldiA9IHNtY19kZXZsaXN0OworI2VuZGlmCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisJaWYgKHVuaXQgPj0gMCkgeworCQlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisJCWlvID0gZGV2LT5iYXNlX2FkZHI7CisJCWlycSA9IGRldi0+aXJxOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWlmIChpbyA+IDB4MWZmKSB7CS8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KKwkJZXJyID0gc21jX3Byb2JlKGRldiwgaW8pOworCX0gZWxzZSBpZiAoaW8gIT0gMCkgewkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCWVyciA9IC1FTlhJTzsKKwl9IGVsc2UgeworCQlmb3IgKDtzbWNkZXYtPnBvcnQ7IHNtY2RldisrKSB7CisJCQlpZiAoc21jX3Byb2JlKGRldiwgc21jZGV2LT5wb3J0KSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisJCWlmICghc21jZGV2LT5wb3J0KQorCQkJZXJyID0gLUVOT0RFVjsKKwl9CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBTTUNfSU9fRVhURU5UKTsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIC4gc21jX2ZpbmRpcnEKKyAuCisgLiBUaGlzIHJvdXRpbmUgaGFzIGEgc2ltcGxlIHB1cnBvc2UgLS0gbWFrZSB0aGUgU01DIGNoaXAgZ2VuZXJhdGUgYW4KKyAuIGludGVycnVwdCwgc28gYW4gYXV0by1kZXRlY3Qgcm91dGluZSBjYW4gZGV0ZWN0IGl0LCBhbmQgZmluZCB0aGUgSVJRLAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK2ludCBfX2luaXQgc21jX2ZpbmRpcnEoIGludCBpb2FkZHIgKQoreworI2lmbmRlZiBOT19BVVRPUFJPQkUKKwlpbnQJdGltZW91dCA9IDIwOworCXVuc2lnbmVkIGxvbmcgY29va2llOworCisKKwljb29raWUgPSBwcm9iZV9pcnFfb24oKTsKKworCS8qCisJICogV2hhdCBJIHRyeSB0byBkbyBoZXJlIGlzIHRyaWdnZXIgYW4gQUxMT0NfSU5ULiBUaGlzIGlzIGRvbmUKKwkgKiBieSBhbGxvY2F0aW5nIGEgc21hbGwgY2h1bmsgb2YgbWVtb3J5LCB3aGljaCB3aWxsIGdpdmUgYW4gaW50ZXJydXB0CisJICogd2hlbiBkb25lLgorCSAqLworCisKKwlTTUNfU0VMRUNUX0JBTksoMik7CisJLyogZW5hYmxlIEFMTE9DYXRpb24gaW50ZXJydXB0cyBPTkxZICovCisJb3V0YiggSU1fQUxMT0NfSU5ULCBpb2FkZHIgKyBJTlRfTUFTSyApOworCisJLyoKKyAJIC4gQWxsb2NhdGUgNTEyIGJ5dGVzIG9mIG1lbW9yeS4gIE5vdGUgdGhhdCB0aGUgY2hpcCB3YXMganVzdAorCSAuIHJlc2V0IHNvIGFsbCB0aGUgbWVtb3J5IGlzIGF2YWlsYWJsZQorCSovCisJb3V0dyggTUNfQUxMT0MgfCAxLCBpb2FkZHIgKyBNTVVfQ01EICk7CisKKwkvKgorCSAuIFdhaXQgdW50aWwgcG9zaXRpdmUgdGhhdCB0aGUgaW50ZXJydXB0IGhhcyBiZWVuIGdlbmVyYXRlZAorCSovCisJd2hpbGUgKCB0aW1lb3V0ICkgeworCQlieXRlCWludF9zdGF0dXM7CisKKwkJaW50X3N0YXR1cyA9IGluYiggaW9hZGRyICsgSU5URVJSVVBUICk7CisKKwkJaWYgKCBpbnRfc3RhdHVzICYgSU1fQUxMT0NfSU5UICkKKwkJCWJyZWFrOwkJLyogZ290IHRoZSBpbnRlcnJ1cHQgKi8KKwkJdGltZW91dC0tOworCX0KKwkvKiB0aGVyZSBpcyByZWFsbHkgbm90aGluZyB0aGF0IEkgY2FuIGRvIGhlcmUgaWYgdGltZW91dCBmYWlscywKKwkgICBhcyBwcm9iZV9pcnFfb2ZmIHdpbGwgcmV0dXJuIGEgMCBhbnl3YXksIHdoaWNoIGlzIHdoYXQgSQorCSAgIHdhbnQgaW4gdGhpcyBjYXNlLiAgIFBsdXMsIHRoZSBjbGVhbiB1cCBpcyBuZWVkZWQgaW4gYm90aAorCSAgIGNhc2VzLiAgKi8KKworCS8qIERFTEFZIEhFUkUhCisJICAgT24gYSBmYXN0IG1hY2hpbmUsIHRoZSBzdGF0dXMgbWlnaHQgY2hhbmdlIGJlZm9yZSB0aGUgaW50ZXJydXB0CisJICAgaXMgZ2l2ZW4gdG8gdGhlIHByb2Nlc3Nvci4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgaW50ZXJydXB0IHdhcworCSAgIG5ldmVyIGRldGVjdGVkLCBhbmQgcHJvYmVfaXJxX29mZiBmYWlscyB0byByZXBvcnQgYW55dGhpbmcuCisJICAgVGhpcyBzaG91bGQgZml4IHByb2JlX2lycV8qIHByb2JsZW1zLgorCSovCisJU01DX0RFTEFZKCk7CisJU01DX0RFTEFZKCk7CisKKwkvKiBhbmQgZGlzYWJsZSBhbGwgaW50ZXJydXB0cyBhZ2FpbiAqLworCW91dGIoIDAsIGlvYWRkciArIElOVF9NQVNLICk7CisKKwkvKiBhbmQgcmV0dXJuIHdoYXQgSSBmb3VuZCAqLworCXJldHVybiBwcm9iZV9pcnFfb2ZmKGNvb2tpZSk7CisjZWxzZSAvKiBOT19BVVRPUFJPQkUgKi8KKwlzdHJ1Y3QgZGV2bGlzdCAqc21jZGV2OworCWZvciAoc21jZGV2ID0gc21jX2Rldmxpc3Q7IHNtY2Rldi0+cG9ydDsgc21jZGV2KyspIHsKKwkJaWYgKHNtY2Rldi0+cG9ydCA9PSBpb2FkZHIpCisJCQlyZXR1cm4gc21jZGV2LT5pcnE7CisJfQorCXJldHVybiAwOworI2VuZGlmCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIC4gRnVuY3Rpb246IHNtY19wcm9iZSggaW50IGlvYWRkciApCisgLgorIC4gUHVycG9zZToKKyAuCVRlc3RzIHRvIHNlZSBpZiBhIGdpdmVuIGlvYWRkciBwb2ludHMgdG8gYW4gU01DOXh4eCBjaGlwLgorIC4JUmV0dXJucyBhIDAgb24gc3VjY2VzcworIC4KKyAuIEFsZ29yaXRobToKKyAuCSgxKSBzZWUgaWYgdGhlIGhpZ2ggYnl0ZSBvZiBCQU5LX1NFTEVDVCBpcyAweDMzCisgLiAJKDIpIGNvbXBhcmUgdGhlIGlvYWRkciB3aXRoIHRoZSBiYXNlIHJlZ2lzdGVyJ3MgYWRkcmVzcworIC4JKDMpIHNlZSBpZiBJIHJlY29nbml6ZSB0aGUgY2hpcCBJRCBpbiB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIKKyAuCisgLi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgLiBIZXJlIEkgZG8gdHlwaWNhbCBpbml0aWFsaXphdGlvbiB0YXNrcy4KKyAuCisgLiBvICBJbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUgaWYgbmVlZGVkCisgLiBvICBwcmludCBvdXQgbXkgdmFuaXR5IG1lc3NhZ2UgaWYgbm90IGRvbmUgc28gYWxyZWFkeQorIC4gbyAgcHJpbnQgb3V0IHdoYXQgdHlwZSBvZiBoYXJkd2FyZSBpcyBkZXRlY3RlZAorIC4gbyAgcHJpbnQgb3V0IHRoZSBldGhlcm5ldCBhZGRyZXNzCisgLiBvICBmaW5kIHRoZSBJUlEKKyAuIG8gIHNldCB1cCBteSBwcml2YXRlIGRhdGEKKyAuIG8gIGNvbmZpZ3VyZSB0aGUgZGV2IHN0cnVjdHVyZSB3aXRoIG15IHN1YnJvdXRpbmVzCisgLiBvICBhY3R1YWxseSBHUkFCIHRoZSBpcnEuCisgLiBvICBHUkFCIHRoZSByZWdpb24KKyAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitzdGF0aWMgaW50IF9faW5pdCBzbWNfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKwlpbnQgaSwgbWVtb3J5LCByZXR2YWw7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKwl1bnNpZ25lZCBpbnQgYmFuazsKKworCWNvbnN0IGNoYXIgKnZlcnNpb25fc3RyaW5nOworCWNvbnN0IGNoYXIgKmlmX3N0cmluZzsKKworCS8qIHJlZ2lzdGVycyAqLworCXdvcmQgcmV2aXNpb25fcmVnaXN0ZXI7CisJd29yZCBiYXNlX2FkZHJlc3NfcmVnaXN0ZXI7CisJd29yZCBjb25maWd1cmF0aW9uX3JlZ2lzdGVyOworCXdvcmQgbWVtb3J5X2luZm9fcmVnaXN0ZXI7CisJd29yZCBtZW1vcnlfY2ZnX3JlZ2lzdGVyOworCisJLyogR3JhYiB0aGUgcmVnaW9uIHNvIHRoYXQgbm8gb25lIGVsc2UgdHJpZXMgdG8gcHJvYmUgb3VyIGlvcG9ydHMuICovCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIFNNQ19JT19FWFRFTlQsIERSVl9OQU1FKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWRldi0+aXJxID0gaXJxOworCWRldi0+aWZfcG9ydCA9IGlmcG9ydDsKKworCS8qIEZpcnN0LCBzZWUgaWYgdGhlIGhpZ2ggYnl0ZSBpcyAweDMzICovCisJYmFuayA9IGludyggaW9hZGRyICsgQkFOS19TRUxFQ1QgKTsKKwlpZiAoIChiYW5rICYgMHhGRjAwKSAhPSAweDMzMDAgKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogVGhlIGFib3ZlIE1JR0hUIGluZGljYXRlIGEgZGV2aWNlLCBidXQgSSBuZWVkIHRvIHdyaXRlIHRvIGZ1cnRoZXIKKyAJIAl0ZXN0IHRoaXMuICAqLworCW91dHcoIDB4MCwgaW9hZGRyICsgQkFOS19TRUxFQ1QgKTsKKwliYW5rID0gaW53KCBpb2FkZHIgKyBCQU5LX1NFTEVDVCApOworCWlmICggKGJhbmsgJiAweEZGMDAgKSAhPSAweDMzMDAgKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisjaWYgIWRlZmluZWQoQ09ORklHX0g4U19FRE9TSzI2NzQpCisJLyogd2VsbCwgd2UndmUgYWxyZWFkeSB3cml0dGVuIG9uY2UsIHNvIGhvcGVmdWxseSBhbm90aGVyIHRpbWUgd29uJ3QKKyAJICAgaHVydC4gIFRoaXMgdGltZSwgSSBuZWVkIHRvIHN3aXRjaCB0aGUgYmFuayByZWdpc3RlciB0byBiYW5rIDEsCisJICAgc28gSSBjYW4gYWNjZXNzIHRoZSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKwlTTUNfU0VMRUNUX0JBTksoMSk7CisJYmFzZV9hZGRyZXNzX3JlZ2lzdGVyID0gaW53KCBpb2FkZHIgKyBCQVNFICk7CisJaWYgKCBpb2FkZHIgIT0gKCBiYXNlX2FkZHJlc3NfcmVnaXN0ZXIgPj4gMyAmIDB4M0UwICkgKSAgeworCQlwcmludGsoQ0FSRE5BTUUgIjogSU9BRERSICV4IGRvZXNuJ3QgbWF0Y2ggY29uZmlndXJhdGlvbiAoJXgpLiIKKwkJCSJQcm9iYWJseSBub3QgYSBTTUMgY2hpcFxuIiwKKwkJCWlvYWRkciwgYmFzZV9hZGRyZXNzX3JlZ2lzdGVyID4+IDMgJiAweDNFMCApOworCQkvKiB3ZWxsLCB0aGUgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIGRpZG4ndCBtYXRjaC4gIE11c3Qgbm90IGhhdmUKKwkJICAgYmVlbiBhIFNNQyBjaGlwIGFmdGVyIGFsbC4gKi8KKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKyNlbHNlCisJKHZvaWQpYmFzZV9hZGRyZXNzX3JlZ2lzdGVyOyAvKiBXYXJuaW5nIHN1cHByZXNzaW9uICovCisjZW5kaWYKKworCisJLyogIGNoZWNrIGlmIHRoZSByZXZpc2lvbiByZWdpc3RlciBpcyBzb21ldGhpbmcgdGhhdCBJIHJlY29nbml6ZS4KKwkgICAgVGhlc2UgbWlnaHQgbmVlZCB0byBiZSBhZGRlZCB0byBsYXRlciwgYXMgZnV0dXJlIHJldmlzaW9ucworCSAgICBjb3VsZCBiZSBhZGRlZC4gICovCisJU01DX1NFTEVDVF9CQU5LKDMpOworCXJldmlzaW9uX3JlZ2lzdGVyICA9IGludyggaW9hZGRyICsgUkVWSVNJT04gKTsKKwlpZiAoICFjaGlwX2lkc1sgKCByZXZpc2lvbl9yZWdpc3RlciAgPj4gNCApICYgMHhGICBdICkgeworCQkvKiBJIGRvbid0IHJlY29nbml6ZSB0aGlzIGNoaXAsIHNvLi4uICovCisJCXByaW50ayhDQVJETkFNRSAiOiBJTyAleDogVW5yZWNvZ25pemVkIHJldmlzaW9uIHJlZ2lzdGVyOiIKKwkJCSIgJXgsIENvbnRhY3QgYXV0aG9yLiBcbiIsIGlvYWRkciwgcmV2aXNpb25fcmVnaXN0ZXIgKTsKKworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogYXQgdGhpcyBwb2ludCBJJ2xsIGFzc3VtZSB0aGF0IHRoZSBjaGlwIGlzIGFuIFNNQzl4eHguCisJICAgSXQgbWlnaHQgYmUgcHJ1ZGVudCB0byBjaGVjayBhIGxpc3Rpbmcgb2YgTUFDIGFkZHJlc3NlcworCSAgIGFnYWluc3QgdGhlIGhhcmR3YXJlIGFkZHJlc3MsIG9yIGRvIHNvbWUgb3RoZXIgdGVzdHMuICovCisKKwlpZiAodmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKCIlcyIsIHZlcnNpb24pOworCisJLyogZmlsbCBpbiBzb21lIG9mIHRoZSBmaWVsZHMgKi8KKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKworCS8qCisgCSAuIEdldCB0aGUgTUFDIGFkZHJlc3MgKCBiYW5rIDEsIHJlZ3MgNCAtIDkgKQorCSovCisJU01DX1NFTEVDVF9CQU5LKCAxICk7CisJZm9yICggaSA9IDA7IGkgPCA2OyBpICs9IDIgKSB7CisJCXdvcmQJYWRkcmVzczsKKworCQlhZGRyZXNzID0gaW53KCBpb2FkZHIgKyBBRERSMCArIGkgICk7CisJCWRldi0+ZGV2X2FkZHJbIGkgKyAxXSA9IGFkZHJlc3MgPj4gODsKKwkJZGV2LT5kZXZfYWRkclsgaSBdID0gYWRkcmVzcyAmIDB4RkY7CisJfQorCisJLyogZ2V0IHRoZSBtZW1vcnkgaW5mb3JtYXRpb24gKi8KKworCVNNQ19TRUxFQ1RfQkFOSyggMCApOworCW1lbW9yeV9pbmZvX3JlZ2lzdGVyID0gaW53KCBpb2FkZHIgKyBNSVIgKTsKKwltZW1vcnlfY2ZnX3JlZ2lzdGVyICA9IGludyggaW9hZGRyICsgTUNSICk7CisJbWVtb3J5ID0gKCBtZW1vcnlfY2ZnX3JlZ2lzdGVyID4+IDkgKSAgJiAweDc7ICAvKiBtdWx0aXBsaWVyICovCisJbWVtb3J5ICo9IDI1NiAqICggbWVtb3J5X2luZm9fcmVnaXN0ZXIgJiAweEZGICk7CisKKwkvKgorCSBOb3csIEkgd2FudCB0byBmaW5kIG91dCBtb3JlIGFib3V0IHRoZSBjaGlwLiAgVGhpcyBpcyBzb3J0IG9mCisgCSByZWR1bmRhbnQsIGJ1dCBpdCdzIGNsZWFuZXIgdG8gaGF2ZSBpdCBpbiBib3RoLCByYXRoZXIgdGhhbiBoYXZpbmcKKyAJIG9uZSBWRVJZIGxvbmcgcHJvYmUgcHJvY2VkdXJlLgorCSovCisJU01DX1NFTEVDVF9CQU5LKDMpOworCXJldmlzaW9uX3JlZ2lzdGVyICA9IGludyggaW9hZGRyICsgUkVWSVNJT04gKTsKKwl2ZXJzaW9uX3N0cmluZyA9IGNoaXBfaWRzWyAoIHJldmlzaW9uX3JlZ2lzdGVyICA+PiA0ICkgJiAweEYgIF07CisJaWYgKCAhdmVyc2lvbl9zdHJpbmcgKSB7CisJCS8qIEkgc2hvdWxkbid0IGdldCBoZXJlIGJlY2F1c2UgdGhpcyBjYWxsIHdhcyBkb25lIGJlZm9yZS4uLi4gKi8KKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qIGlzIGl0IHVzaW5nIEFVSSBvciAxMEJhc2VUID8gKi8KKwlpZiAoIGRldi0+aWZfcG9ydCA9PSAwICkgeworCQlTTUNfU0VMRUNUX0JBTksoMSk7CisJCWNvbmZpZ3VyYXRpb25fcmVnaXN0ZXIgPSBpbncoIGlvYWRkciArIENPTkZJRyApOworCQlpZiAoIGNvbmZpZ3VyYXRpb25fcmVnaXN0ZXIgJiBDRkdfQVVJX1NFTEVDVCApCisJCQlkZXYtPmlmX3BvcnQgPSAyOworCQllbHNlCisJCQlkZXYtPmlmX3BvcnQgPSAxOworCX0KKwlpZl9zdHJpbmcgPSBpbnRlcmZhY2VzWyBkZXYtPmlmX3BvcnQgLSAxIF07CisKKwkvKiBub3csIHJlc2V0IHRoZSBjaGlwLCBhbmQgcHV0IGl0IGludG8gYSBrbm93biBzdGF0ZSAqLworCXNtY19yZXNldCggaW9hZGRyICk7CisKKwkvKgorCSAuIElmIGRldi0+aXJxIGlzIDAsIHRoZW4gdGhlIGRldmljZSBoYXMgdG8gYmUgYmFuZ2VkIG9uIHRvIHNlZQorCSAuIHdoYXQgdGhlIElSUSBpcy4KKyAJIC4KKwkgLiBUaGlzIGJhbmdpbmcgZG9lc24ndCBhbHdheXMgZGV0ZWN0IHRoZSBJUlEsIGZvciB1bmtub3duIHJlYXNvbnMuCisJIC4gYSB3b3JrYXJvdW5kIGlzIHRvIHJlc2V0IHRoZSBjaGlwIGFuZCB0cnkgYWdhaW4uCisJIC4KKwkgLiBJbnRlcmVzdGluZ2x5LCB0aGUgRE9TIHBhY2tldCBkcml2ZXIgKlNFVFMqIHRoZSBJUlEgb24gdGhlIGNhcmQgdG8KKwkgLiBiZSB3aGF0IGlzIHJlcXVlc3RlZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgIEkgZG9uJ3QgZG8gdGhhdCwgbW9zdGx5CisJIC4gYmVjYXVzZSB0aGUgY2FyZCB0aGF0IEkgaGF2ZSB1c2VzIGEgbm9uLXN0YW5kYXJkIG1ldGhvZCBvZiBhY2Nlc3NpbmcKKwkgLiB0aGUgSVJRcywgYW5kIGJlY2F1c2UgdGhpcyBfc2hvdWxkXyB3b3JrIGluIG1vc3QgY29uZmlndXJhdGlvbnMuCisJIC4KKwkgLiBTcGVjaWZ5aW5nIGFuIElSUSBpcyBkb25lIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgdXNlciBrbm93cworCSAuIHdoYXQgKHMpaGUgaXMgZG9pbmcuICBObyBjaGVja2luZyBpcyBkb25lISEhIQorIAkgLgorCSovCisJaWYgKCBkZXYtPmlycSA8IDIgKSB7CisJCWludAl0cmlhbHM7CisKKwkJdHJpYWxzID0gMzsKKwkJd2hpbGUgKCB0cmlhbHMtLSApIHsKKwkJCWRldi0+aXJxID0gc21jX2ZpbmRpcnEoIGlvYWRkciApOworCQkJaWYgKCBkZXYtPmlycSApCisJCQkJYnJlYWs7CisJCQkvKiBraWNrIHRoZSBjYXJkIGFuZCB0cnkgYWdhaW4gKi8KKwkJCXNtY19yZXNldCggaW9hZGRyICk7CisJCX0KKwl9CisJaWYgKGRldi0+aXJxID09IDAgKSB7CisJCXByaW50ayhDQVJETkFNRSI6IENvdWxkbid0IGF1dG9kZXRlY3QgeW91ciBJUlEuIFVzZSBpcnE9eHguXG4iKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qIG5vdywgcHJpbnQgb3V0IHRoZSBjYXJkIGluZm8sIGluIGEgc2hvcnQgZm9ybWF0Li4gKi8KKworCXByaW50aygiJXM6ICVzKHI6JWQpIGF0ICUjM3ggSVJROiVkIElOVEY6JXMgTUVNOiVkYiAiLCBkZXYtPm5hbWUsCisJCXZlcnNpb25fc3RyaW5nLCByZXZpc2lvbl9yZWdpc3RlciAmIDB4RiwgaW9hZGRyLCBkZXYtPmlycSwKKwkJaWZfc3RyaW5nLCBtZW1vcnkgKTsKKwkvKgorCSAuIFByaW50IHRoZSBFdGhlcm5ldCBhZGRyZXNzCisJKi8KKwlwcmludGsoIkFERFI6ICIpOworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCXByaW50aygiJTIuMng6IiwgZGV2LT5kZXZfYWRkcltpXSApOworCXByaW50aygiJTIuMnggXG4iLCBkZXYtPmRldl9hZGRyWzVdICk7CisKKwkvKiBzZXQgdGhlIHByaXZhdGUgZGF0YSB0byB6ZXJvIGJ5IGRlZmF1bHQgKi8KKwltZW1zZXQoZGV2LT5wcml2LCAwLCBzaXplb2Yoc3RydWN0IHNtY19sb2NhbCkpOworCisJLyogR3JhYiB0aGUgSVJRICovCisgICAgICAJcmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZzbWNfaW50ZXJydXB0LCAwLCBEUlZfTkFNRSwgZGV2KTsKKyAgICAgIAlpZiAocmV0dmFsKSB7CisJCXByaW50aygiJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkIChpcnF2YWw9JWQpLlxuIiwgRFJWX05BTUUsCisJCQlkZXYtPmlycSwgcmV0dmFsKTsKKyAgCSAgCWdvdG8gZXJyX291dDsKKyAgICAgIAl9CisKKwlkZXYtPm9wZW4JCSAgICAgICAgPSBzbWNfb3BlbjsKKwlkZXYtPnN0b3AJCSAgICAgICAgPSBzbWNfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgICAgCT0gc21jX3dhaXRfdG9fc2VuZF9wYWNrZXQ7CisJZGV2LT50eF90aW1lb3V0CQkgICAgCT0gc21jX3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwkJPSBIWi8yMDsKKwlkZXYtPmdldF9zdGF0cwkJCT0gc21jX3F1ZXJ5X3N0YXRpc3RpY3M7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgCT0gc21jX3NldF9tdWx0aWNhc3RfbGlzdDsKKworCXJldHVybiAwOworCitlcnJfb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgU01DX0lPX0VYVEVOVCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworI2lmIFNNQ19ERUJVRyA+IDIKK3N0YXRpYyB2b2lkIHByaW50X3BhY2tldCggYnl0ZSAqIGJ1ZiwgaW50IGxlbmd0aCApCit7CisjaWYgMAorCWludCBpOworCWludCByZW1haW5kZXI7CisJaW50IGxpbmVzOworCisJcHJpbnRrKCJQYWNrZXQgb2YgbGVuZ3RoICVkIFxuIiwgbGVuZ3RoICk7CisJbGluZXMgPSBsZW5ndGggLyAxNjsKKwlyZW1haW5kZXIgPSBsZW5ndGggJSAxNjsKKworCWZvciAoIGkgPSAwOyBpIDwgbGluZXMgOyBpICsrICkgeworCQlpbnQgY3VyOworCisJCWZvciAoIGN1ciA9IDA7IGN1ciA8IDg7IGN1ciArKyApIHsKKwkJCWJ5dGUgYSwgYjsKKworCQkJYSA9ICooYnVmICsrICk7CisJCQliID0gKihidWYgKysgKTsKKwkJCXByaW50aygiJTAyeCUwMnggIiwgYSwgYiApOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9CisJZm9yICggaSA9IDA7IGkgPCByZW1haW5kZXIvMiA7IGkrKyApIHsKKwkJYnl0ZSBhLCBiOworCisJCWEgPSAqKGJ1ZiArKyApOworCQliID0gKihidWYgKysgKTsKKwkJcHJpbnRrKCIlMDJ4JTAyeCAiLCBhLCBiICk7CisJfQorCXByaW50aygiXG4iKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKworLyoKKyAqIE9wZW4gYW5kIEluaXRpYWxpemUgdGhlIGJvYXJkCisgKgorICogU2V0IHVwIGV2ZXJ5dGhpbmcsIHJlc2V0IHRoZSBjYXJkLCBldGMgLi4KKyAqCisgKi8KK3N0YXRpYyBpbnQgc21jX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlpbnQJaTsJLyogdXNlZCB0byBzZXQgaHcgZXRoZXJuZXQgYWRkcmVzcyAqLworCisJLyogY2xlYXIgb3V0IGFsbCB0aGUganVuayB0aGF0IHdhcyBwdXQgaGVyZSBiZWZvcmUuLi4gKi8KKwltZW1zZXQoZGV2LT5wcml2LCAwLCBzaXplb2Yoc3RydWN0IHNtY19sb2NhbCkpOworCisJLyogcmVzZXQgdGhlIGhhcmR3YXJlICovCisKKwlzbWNfcmVzZXQoIGlvYWRkciApOworCXNtY19lbmFibGUoIGlvYWRkciApOworCisJLyogU2VsZWN0IHdoaWNoIGludGVyZmFjZSB0byB1c2UgKi8KKworCVNNQ19TRUxFQ1RfQkFOSyggMSApOworCWlmICggZGV2LT5pZl9wb3J0ID09IDEgKSB7CisJCW91dHcoIGludyggaW9hZGRyICsgQ09ORklHICkgJiB+Q0ZHX0FVSV9TRUxFQ1QsCisJCQlpb2FkZHIgKyBDT05GSUcgKTsKKwl9CisJZWxzZSBpZiAoIGRldi0+aWZfcG9ydCA9PSAyICkgeworCQlvdXR3KCBpbncoIGlvYWRkciArIENPTkZJRyApIHwgQ0ZHX0FVSV9TRUxFQ1QsCisJCQlpb2FkZHIgKyBDT05GSUcgKTsKKwl9CisKKwkvKgorICAJCUFjY29yZGluZyB0byBCZWNrZXIsIEkgaGF2ZSB0byBzZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3MKKwkJYXQgdGhpcyBwb2ludCwgYmVjYXVzZSB0aGUgKGwpdXNlciBjYW4gc2V0IGl0IHdpdGggYW4KKwkJaW9jdGwuICBFYXNpbHkgZG9uZS4uLgorCSovCisJU01DX1NFTEVDVF9CQU5LKCAxICk7CisJZm9yICggaSA9IDA7IGkgPCA2OyBpICs9IDIgKSB7CisJCXdvcmQJYWRkcmVzczsKKworCQlhZGRyZXNzID0gZGV2LT5kZXZfYWRkclsgaSArIDEgXSA8PCA4IDsKKwkJYWRkcmVzcyAgfD0gZGV2LT5kZXZfYWRkclsgaSBdOworCQlvdXR3KCBhZGRyZXNzLCBpb2FkZHIgKyBBRERSMCArIGkgKTsKKwl9CisJCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIC4gQ2FsbGVkIGJ5IHRoZSBrZXJuZWwgdG8gc2VuZCBhIHBhY2tldCBvdXQgaW50byB0aGUgdm9pZAorIC4gb2YgdGhlIG5ldC4gIFRoaXMgcm91dGluZSBpcyBsYXJnZWx5IGJhc2VkIG9uCisgLiBza2VsZXRvbi5jLCBmcm9tIEJlY2tlci4KKyAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK3N0YXRpYyB2b2lkIHNtY190aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogSWYgd2UgZ2V0IGhlcmUsIHNvbWUgaGlnaGVyIGxldmVsIGhhcyBkZWNpZGVkIHdlIGFyZSBicm9rZW4uCisJICAgVGhlcmUgc2hvdWxkIHJlYWxseSBiZSBhICJraWNrIG1lIiBmdW5jdGlvbiBjYWxsIGluc3RlYWQuICovCisJcHJpbnRrKEtFUk5fV0FSTklORyBDQVJETkFNRSI6IHRyYW5zbWl0IHRpbWVkIG91dCwgJXM/XG4iLAorCQl0eF9kb25lKGRldikgPyAiSVJRIGNvbmZsaWN0IiA6CisJCSJuZXR3b3JrIGNhYmxlIHByb2JsZW0iKTsKKwkvKiAia2ljayIgdGhlIGFkYXB0b3IgKi8KKwlzbWNfcmVzZXQoIGRldi0+YmFzZV9hZGRyICk7CisJc21jX2VuYWJsZSggZGV2LT5iYXNlX2FkZHIgKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkvKiBjbGVhciBhbnl0aGluZyBzYXZlZCAqLworCSgoc3RydWN0IHNtY19sb2NhbCAqKWRldi0+cHJpdiktPnNhdmVkX3NrYiA9IE5VTEw7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAuCisgLiBzbWNfcmN2IC0gIHJlY2VpdmUgYSBwYWNrZXQgZnJvbSB0aGUgY2FyZAorIC4KKyAuIFRoZXJlIGlzICggYXQgbGVhc3QgKSBhIHBhY2tldCB3YWl0aW5nIHRvIGJlIHJlYWQgZnJvbQorIC4gY2hpcC1tZW1vcnkuCisgLgorIC4gbyBSZWFkIHRoZSBzdGF0dXMKKyAuIG8gSWYgYW4gZXJyb3IsIHJlY29yZCBpdAorIC4gbyBvdGhlcndpc2UsIHJlYWQgaW4gdGhlIHBhY2tldAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RhdGljIHZvaWQgc21jX3JjdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCAJcGFja2V0X251bWJlcjsKKwl3b3JkCXN0YXR1czsKKwl3b3JkCXBhY2tldF9sZW5ndGg7CisKKwkvKiBhc3N1bWUgYmFuayAyICovCisKKwlwYWNrZXRfbnVtYmVyID0gaW53KCBpb2FkZHIgKyBGSUZPX1BPUlRTICk7CisKKwlpZiAoIHBhY2tldF9udW1iZXIgJiBGUF9SWEVNUFRZICkgeworCQkvKiB3ZSBnb3QgY2FsbGVkICwgYnV0IG5vdGhpbmcgd2FzIG9uIHRoZSBGSUZPICovCisJCVBSSU5USygoQ0FSRE5BTUUgIjogV0FSTklORzogc21jX3JjdiB3aXRoIG5vdGhpbmcgb24gRklGTy4gXG4iKSk7CisJCS8qIGRvbid0IG5lZWQgdG8gcmVzdG9yZSBhbnl0aGluZyAqLworCQlyZXR1cm47CisJfQorCisJLyogIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHBhY2tldCAqLworCW91dHcoIFBUUl9SRUFEIHwgUFRSX1JDViB8IFBUUl9BVVRPSU5DLCBpb2FkZHIgKyBQT0lOVEVSICk7CisKKwkvKiBGaXJzdCB0d28gd29yZHMgYXJlIHN0YXR1cyBhbmQgcGFja2V0X2xlbmd0aCAqLworCXN0YXR1cyAJCT0gaW53KCBpb2FkZHIgKyBEQVRBXzEgKTsKKwlwYWNrZXRfbGVuZ3RoIAk9IGludyggaW9hZGRyICsgREFUQV8xICk7CisKKwlwYWNrZXRfbGVuZ3RoICY9IDB4MDdmZjsgIC8qIG1hc2sgb2ZmIHRvcCBiaXRzICovCisKKwlQUklOVEsyKCgiUkNWOiBTVEFUVVMgJTR4IExFTkdUSCAlNHhcbiIsIHN0YXR1cywgcGFja2V0X2xlbmd0aCApKTsKKwkvKgorCSAuIHRoZSBwYWNrZXQgbGVuZ3RoIGNvbnRhaW5zIDMgZXh0cmEgd29yZHMgOgorCSAuIHN0YXR1cywgbGVuZ3RoLCBhbmQgYW4gZXh0cmEgd29yZCB3aXRoIGFuIG9kZCBieXRlIC4KKwkqLworCXBhY2tldF9sZW5ndGggLT0gNjsKKworCWlmICggIShzdGF0dXMgJiBSU19FUlJPUlMgKSApeworCQkvKiBkbyBzdHVmZiB0byBtYWtlIGEgbmV3IHBhY2tldCAqLworCQlzdHJ1Y3Qgc2tfYnVmZiAgKiBza2I7CisJCWJ5dGUJCSogZGF0YTsKKworCQkvKiByZWFkIG9uZSBleHRyYSBieXRlICovCisJCWlmICggc3RhdHVzICYgUlNfT0RERlJBTUUgKQorCQkJcGFja2V0X2xlbmd0aCsrOworCisJCS8qIHNldCBtdWx0aWNhc3Qgc3RhdHMgKi8KKwkJaWYgKCBzdGF0dXMgJiBSU19NVUxUSUNBU1QgKQorCQkJbHAtPnN0YXRzLm11bHRpY2FzdCsrOworCisJCXNrYiA9IGRldl9hbGxvY19za2IoIHBhY2tldF9sZW5ndGggKyA1KTsKKworCQlpZiAoIHNrYiA9PSBOVUxMICkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFIENBUkROQU1FICI6IExvdyBtZW1vcnksIHBhY2tldCBkcm9wcGVkLlxuIik7CisJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJZ290byBkb25lOworCQl9CisKKwkJLyoKKwkJICEgVGhpcyBzaG91bGQgd29yayB3aXRob3V0IGFsaWdubWVudCwgYnV0IGl0IGNvdWxkIGJlCisJCSAhIGluIHRoZSB3b3JzZSBjYXNlCisJCSovCisKKwkJc2tiX3Jlc2VydmUoIHNrYiwgMiApOyAgIC8qIDE2IGJpdCBhbGlnbm1lbnQgKi8KKworCQlza2ItPmRldiA9IGRldjsKKwkJZGF0YSA9IHNrYl9wdXQoIHNrYiwgcGFja2V0X2xlbmd0aCk7CisKKyNpZmRlZiBVU0VfMzJfQklUCisJCS8qIFFVRVNUSU9OOiAgTGlrZSBpbiB0aGUgVFggcm91dGluZSwgZG8gSSB3YW50CisJCSAgIHRvIHNlbmQgdGhlIERXT1JEcyBvciB0aGUgYnl0ZXMgZmlyc3QsIG9yIHNvbWUKKwkJICAgbWl4dHVyZS4gIEEgbWl4dHVyZSBtaWdodCBpbXByb3ZlIGFscmVhZHkgc2xvdyBQSU8KKwkJICAgcGVyZm9ybWFuY2UgICovCisJCVBSSU5USzMoKCIgUmVhZGluZyAlZCBkd29yZHMgKGFuZCAlZCBieXRlcykgXG4iLAorCQkJcGFja2V0X2xlbmd0aCA+PiAyLCBwYWNrZXRfbGVuZ3RoICYgMyApKTsKKwkJaW5zbChpb2FkZHIgKyBEQVRBXzEgLCBkYXRhLCBwYWNrZXRfbGVuZ3RoID4+IDIgKTsKKwkJLyogcmVhZCB0aGUgbGVmdCBvdmVyIGJ5dGVzICovCisJCWluc2IoIGlvYWRkciArIERBVEFfMSwgZGF0YSArIChwYWNrZXRfbGVuZ3RoICYgMHhGRkZGRkMpLAorCQkJcGFja2V0X2xlbmd0aCAmIDB4MyAgKTsKKyNlbHNlCisJCVBSSU5USzMoKCIgUmVhZGluZyAlZCB3b3JkcyBhbmQgJWQgYnl0ZShzKSBcbiIsCisJCQkocGFja2V0X2xlbmd0aCA+PiAxICksIHBhY2tldF9sZW5ndGggJiAxICkpOworCQlpbnN3KGlvYWRkciArIERBVEFfMSAsIGRhdGEsIHBhY2tldF9sZW5ndGggPj4gMSk7CisJCWlmICggcGFja2V0X2xlbmd0aCAmIDEgKSB7CisJCQlkYXRhICs9IHBhY2tldF9sZW5ndGggJiB+MTsKKwkJCSooZGF0YSsrKSA9IGluYiggaW9hZGRyICsgREFUQV8xICk7CisJCX0KKyNlbmRpZgorI2lmCVNNQ19ERUJVRyA+IDIKKwkJCXByaW50X3BhY2tldCggZGF0YSwgcGFja2V0X2xlbmd0aCApOworI2VuZGlmCisKKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2ICk7CisJCW5ldGlmX3J4KHNrYik7CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBwYWNrZXRfbGVuZ3RoOworCX0gZWxzZSB7CisJCS8qIGVycm9yIC4uLiAqLworCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisKKwkJaWYgKCBzdGF0dXMgJiBSU19BTEdORVJSICkgIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJaWYgKCBzdGF0dXMgJiAoUlNfVE9PU0hPUlQgfCBSU19UT09MT05HICkgKQorCQkJbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJaWYgKCBzdGF0dXMgJiBSU19CQURDUkMpCWxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJfQorCitkb25lOgorCS8qICBlcnJvciBvciBnb29kLCB0ZWxsIHRoZSBjYXJkIHRvIGdldCByaWQgb2YgdGhpcyBwYWNrZXQgKi8KKwlvdXR3KCBNQ19SRUxFQVNFLCBpb2FkZHIgKyBNTVVfQ01EICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAuIHNtY190eAorIC4KKyAuIFB1cnBvc2U6ICBIYW5kbGUgYSB0cmFuc21pdCBlcnJvciBtZXNzYWdlLiAgIFRoaXMgd2lsbCBvbmx5IGJlIGNhbGxlZAorIC4gICB3aGVuIGFuIGVycm9yLCBiZWNhdXNlIG9mIHRoZSBBVVRPX1JFTEVBU0UgbW9kZS4KKyAuCisgLiBBbGdvcml0aG06CisgLglTYXZlIHBvaW50ZXIgYW5kIHBhY2tldCBubworIC4JR2V0IHRoZSBwYWNrZXQgbm8gZnJvbSB0aGUgdG9wIG9mIHRoZSBxdWV1ZQorIC4JY2hlY2sgaWYgaXQncyB2YWxpZCAoIGlmIG5vdCwgaXMgdGhpcyBhbiBlcnJvcj8/PyApCisgLglyZWFkIHRoZSBzdGF0dXMgd29yZAorIC4JcmVjb3JkIHRoZSBlcnJvcgorIC4JKCByZXNlbmQ/ICBOb3QgcmVhbGx5LCBzaW5jZSB3ZSBkb24ndCB3YW50IG9sZCBwYWNrZXRzIGFyb3VuZCApCisgLglSZXN0b3JlIHNhdmVkIHZhbHVlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHNtY190eCggc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYgKQoreworCWludAlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJYnl0ZSBzYXZlZF9wYWNrZXQ7CisJYnl0ZSBwYWNrZXRfbm87CisJd29yZCB0eF9zdGF0dXM7CisKKworCS8qIGFzc3VtZSBiYW5rIDIgICovCisKKwlzYXZlZF9wYWNrZXQgPSBpbmIoIGlvYWRkciArIFBOUl9BUlIgKTsKKwlwYWNrZXRfbm8gPSBpbncoIGlvYWRkciArIEZJRk9fUE9SVFMgKTsKKwlwYWNrZXRfbm8gJj0gMHg3RjsKKworCS8qIHNlbGVjdCB0aGlzIGFzIHRoZSBwYWNrZXQgdG8gcmVhZCBmcm9tICovCisJb3V0YiggcGFja2V0X25vLCBpb2FkZHIgKyBQTlJfQVJSICk7CisKKwkvKiByZWFkIHRoZSBmaXJzdCB3b3JkIGZyb20gdGhpcyBwYWNrZXQgKi8KKwlvdXR3KCBQVFJfQVVUT0lOQyB8IFBUUl9SRUFELCBpb2FkZHIgKyBQT0lOVEVSICk7CisKKwl0eF9zdGF0dXMgPSBpbncoIGlvYWRkciArIERBVEFfMSApOworCVBSSU5USzMoKENBUkROQU1FIjogVFggRE9ORSBTVEFUVVM6ICU0eCBcbiIsIHR4X3N0YXR1cyApKTsKKworCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwlpZiAoIHR4X3N0YXR1cyAmIFRTX0xPU1RDQVIgKSBscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwlpZiAoIHR4X3N0YXR1cyAmIFRTX0xBVENPTCAgKSB7CisJCXByaW50ayhLRVJOX0RFQlVHIENBUkROQU1FCisJCQkiOiBMYXRlIGNvbGxpc2lvbiBvY2N1cnJlZCBvbiBsYXN0IHhtaXQuXG4iKTsKKwkJbHAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwl9CisjaWYgMAorCQlpZiAoIHR4X3N0YXR1cyAmIFRTXzE2Q09MICkgeyAuLi4gfQorI2VuZGlmCisKKwlpZiAoIHR4X3N0YXR1cyAmIFRTX1NVQ0NFU1MgKSB7CisJCXByaW50ayhDQVJETkFNRSI6IFN1Y2Nlc3NmdWwgcGFja2V0IGNhdXNlZCBpbnRlcnJ1cHQgXG4iKTsKKwl9CisJLyogcmUtZW5hYmxlIHRyYW5zbWl0ICovCisJU01DX1NFTEVDVF9CQU5LKCAwICk7CisJb3V0dyggaW53KCBpb2FkZHIgKyBUQ1IgKSB8IFRDUl9FTkFCTEUsIGlvYWRkciArIFRDUiApOworCisJLyoga2lsbCB0aGUgcGFja2V0ICovCisJU01DX1NFTEVDVF9CQU5LKCAyICk7CisJb3V0dyggTUNfRlJFRVBLVCwgaW9hZGRyICsgTU1VX0NNRCApOworCisJLyogb25lIGxlc3MgcGFja2V0IHdhaXRpbmcgZm9yIG1lICovCisJbHAtPnBhY2tldHNfd2FpdGluZy0tOworCisJb3V0Yiggc2F2ZWRfcGFja2V0LCBpb2FkZHIgKyBQTlJfQVJSICk7CisJcmV0dXJuOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgLgorIC4gVGhpcyBpcyB0aGUgbWFpbiByb3V0aW5lIG9mIHRoZSBkcml2ZXIsIHRvIGhhbmRsZSB0aGUgZGV2aWNlIHdoZW4KKyAuIGl0IG5lZWRzIHNvbWUgYXR0ZW50aW9uLgorIC4KKyAuIFNvOgorIC4gICBmaXJzdCwgc2F2ZSBzdGF0ZSBvZiB0aGUgY2hpcHNldAorIC4gICBicmFuY2ggb2ZmIGludG8gcm91dGluZXMgdG8gaGFuZGxlIGVhY2ggY2FzZSwgYW5kIGFja25vd2xlZGdlCisgLgkgICAgZWFjaCB0byB0aGUgaW50ZXJydXB0IHJlZ2lzdGVyCisgLiAgIGFuZCBmaW5hbGx5IHJlc3RvcmUgc3RhdGUuCisgLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzbWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKiBkZXZfaWQsICBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiAJPSBkZXZfaWQ7CisJaW50IGlvYWRkciAJCT0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJYnl0ZQlzdGF0dXM7CisJd29yZAljYXJkX3N0YXRzOworCWJ5dGUJbWFzazsKKwlpbnQJdGltZW91dDsKKwkvKiBzdGF0ZSByZWdpc3RlcnMgKi8KKwl3b3JkCXNhdmVkX2Jhbms7CisJd29yZAlzYXZlZF9wb2ludGVyOworCWludCBoYW5kbGVkID0gMDsKKworCisJUFJJTlRLMygoQ0FSRE5BTUUiOiBTTUMgaW50ZXJydXB0IHN0YXJ0ZWQgXG4iKSk7CisKKwlzYXZlZF9iYW5rID0gaW53KCBpb2FkZHIgKyBCQU5LX1NFTEVDVCApOworCisJU01DX1NFTEVDVF9CQU5LKDIpOworCXNhdmVkX3BvaW50ZXIgPSBpbncoIGlvYWRkciArIFBPSU5URVIgKTsKKworCW1hc2sgPSBpbmIoIGlvYWRkciArIElOVF9NQVNLICk7CisJLyogY2xlYXIgYWxsIGludGVycnVwdHMgKi8KKwlvdXRiKCAwLCBpb2FkZHIgKyBJTlRfTUFTSyApOworCisKKwkvKiBzZXQgYSB0aW1lb3V0IHZhbHVlLCBzbyBJIGRvbid0IHN0YXkgaGVyZSBmb3JldmVyICovCisJdGltZW91dCA9IDQ7CisKKwlQUklOVEsyKChLRVJOX1dBUk5JTkcgQ0FSRE5BTUUgIjogTUFTSyBJUyAleCBcbiIsIG1hc2sgKSk7CisJZG8geworCQkvKiByZWFkIHRoZSBzdGF0dXMgZmxhZywgYW5kIG1hc2sgaXQgKi8KKwkJc3RhdHVzID0gaW5iKCBpb2FkZHIgKyBJTlRFUlJVUFQgKSAmIG1hc2s7CisJCWlmICghc3RhdHVzICkKKwkJCWJyZWFrOworCisJCWhhbmRsZWQgPSAxOworCisJCVBSSU5USzMoKEtFUk5fV0FSTklORyBDQVJETkFNRQorCQkJIjogSGFuZGxpbmcgaW50ZXJydXB0IHN0YXR1cyAleCBcbiIsIHN0YXR1cyApKTsKKworCQlpZiAoc3RhdHVzICYgSU1fUkNWX0lOVCkgeworCQkJLyogR290IGEgcGFja2V0KHMpLiAqLworCQkJUFJJTlRLMigoS0VSTl9XQVJOSU5HIENBUkROQU1FCisJCQkJIjogUmVjZWl2ZSBJbnRlcnJ1cHRcbiIpKTsKKwkJCXNtY19yY3YoZGV2KTsKKwkJfSBlbHNlIGlmIChzdGF0dXMgJiBJTV9UWF9JTlQgKSB7CisJCQlQUklOVEsyKChLRVJOX1dBUk5JTkcgQ0FSRE5BTUUKKwkJCQkiOiBUWCBFUlJPUiBoYW5kbGVkXG4iKSk7CisJCQlzbWNfdHgoZGV2KTsKKwkJCW91dGIoSU1fVFhfSU5ULCBpb2FkZHIgKyBJTlRFUlJVUFQgKTsKKwkJfSBlbHNlIGlmIChzdGF0dXMgJiBJTV9UWF9FTVBUWV9JTlQgKSB7CisJCQkvKiB1cGRhdGUgc3RhdHMgKi8KKwkJCVNNQ19TRUxFQ1RfQkFOSyggMCApOworCQkJY2FyZF9zdGF0cyA9IGludyggaW9hZGRyICsgQ09VTlRFUiApOworCQkJLyogc2luZ2xlIGNvbGxpc2lvbnMgKi8KKwkJCWxwLT5zdGF0cy5jb2xsaXNpb25zICs9IGNhcmRfc3RhdHMgJiAweEY7CisJCQljYXJkX3N0YXRzID4+PSA0OworCQkJLyogbXVsdGlwbGUgY29sbGlzaW9ucyAqLworCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gY2FyZF9zdGF0cyAmIDB4RjsKKworCQkJLyogdGhlc2UgYXJlIGZvciB3aGVuIGxpbnV4IHN1cHBvcnRzIHRoZXNlIHN0YXRpc3RpY3MgKi8KKworCQkJU01DX1NFTEVDVF9CQU5LKCAyICk7CisJCQlQUklOVEsyKChLRVJOX1dBUk5JTkcgQ0FSRE5BTUUKKwkJCQkiOiBUWF9CVUZGRVJfRU1QVFkgaGFuZGxlZFxuIikpOworCQkJb3V0YiggSU1fVFhfRU1QVFlfSU5ULCBpb2FkZHIgKyBJTlRFUlJVUFQgKTsKKwkJCW1hc2sgJj0gfklNX1RYX0VNUFRZX0lOVDsKKwkJCWxwLT5zdGF0cy50eF9wYWNrZXRzICs9IGxwLT5wYWNrZXRzX3dhaXRpbmc7CisJCQlscC0+cGFja2V0c193YWl0aW5nID0gMDsKKworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIElNX0FMTE9DX0lOVCApIHsKKwkJCVBSSU5USzIoKEtFUk5fREVCVUcgQ0FSRE5BTUUKKwkJCQkiOiBBbGxvY2F0aW9uIGludGVycnVwdCBcbiIpKTsKKwkJCS8qIGNsZWFyIHRoaXMgaW50ZXJydXB0IHNvIGl0IGRvZXNuJ3QgaGFwcGVuIGFnYWluICovCisJCQltYXNrICY9IH5JTV9BTExPQ19JTlQ7CisKKwkJCXNtY19oYXJkd2FyZV9zZW5kX3BhY2tldCggZGV2ICk7CisKKwkJCS8qIGVuYWJsZSB4bWl0IGludGVycnVwdHMgYmFzZWQgb24gdGhpcyAqLworCQkJbWFzayB8PSAoIElNX1RYX0VNUFRZX0lOVCB8IElNX1RYX0lOVCApOworCisJCQkvKiBhbmQgbGV0IHRoZSBjYXJkIHNlbmQgbW9yZSBwYWNrZXRzIHRvIG1lICovCisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwkJCVBSSU5USzIoKENBUkROQU1FIjogSGFuZG9mZiBkb25lIHN1Y2Nlc3NmdWxseS5cbiIpKTsKKwkJfSBlbHNlIGlmIChzdGF0dXMgJiBJTV9SWF9PVlJOX0lOVCApIHsKKwkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWxwLT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJb3V0YiggSU1fUlhfT1ZSTl9JTlQsIGlvYWRkciArIElOVEVSUlVQVCApOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIElNX0VQSF9JTlQgKSB7CisJCQlQUklOVEsoKENBUkROQU1FICI6IFVOU1VQUE9SVEVEOiBFUEggSU5URVJSVVBUIFxuIikpOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIElNX0VSQ1ZfSU5UICkgeworCQkJUFJJTlRLKChDQVJETkFNRSAiOiBVTlNVUFBPUlRFRDogRVJDViBJTlRFUlJVUFQgXG4iKSk7CisJCQlvdXRiKCBJTV9FUkNWX0lOVCwgaW9hZGRyICsgSU5URVJSVVBUICk7CisJCX0KKwl9IHdoaWxlICggdGltZW91dCAtLSApOworCisKKwkvKiByZXN0b3JlIHN0YXRlIHJlZ2lzdGVyICovCisJU01DX1NFTEVDVF9CQU5LKCAyICk7CisJb3V0YiggbWFzaywgaW9hZGRyICsgSU5UX01BU0sgKTsKKworCVBSSU5USzMoKCBLRVJOX1dBUk5JTkcgQ0FSRE5BTUUgIjogTUFTSyBpcyBub3cgJXggXG4iLCBtYXNrICkpOworCW91dHcoIHNhdmVkX3BvaW50ZXIsIGlvYWRkciArIFBPSU5URVIgKTsKKworCVNNQ19TRUxFQ1RfQkFOSyggc2F2ZWRfYmFuayApOworCisJUFJJTlRLMygoQ0FSRE5BTUUgIjogSW50ZXJydXB0IGRvbmVcbiIpKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAuIHNtY19jbG9zZQorIC4KKyAuIHRoaXMgbWFrZXMgdGhlIGJvYXJkIGNsZWFuIHVwIGV2ZXJ5dGhpbmcgdGhhdCBpdCBjYW4KKyAuIGFuZCBub3QgdGFsayB0byB0aGUgb3V0c2lkZSB3b3JsZC4gICBDYXVzZWQgYnkKKyAuIGFuICdpZmNvbmZpZyBldGhYIGRvd24nCisgLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgc21jX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCS8qIGNsZWFyIGV2ZXJ5dGhpbmcgKi8KKwlzbWNfc2h1dGRvd24oIGRldi0+YmFzZV9hZGRyICk7CisKKwkvKiBVcGRhdGUgdGhlIHN0YXRpc3RpY3MgaGVyZS4gKi8KKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAuIEdldCB0aGUgY3VycmVudCBzdGF0aXN0aWNzLgorIC4gVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbiBvciBjbG9zZWQuCisgLi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKiBzbWNfcXVlcnlfc3RhdGlzdGljcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuICZscC0+c3RhdHM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAuIHNtY19zZXRfbXVsdGljYXN0X2xpc3QKKyAuCisgLiBUaGlzIHJvdXRpbmUgd2lsbCwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZXMgcGFzc2VkIHRvIGl0LAorIC4gZWl0aGVyIG1ha2UgaXQgYWNjZXB0IG11bHRpY2FzdCBwYWNrZXRzLCBnbyBpbnRvCisgLiBwcm9taXNjdW91cyBtb2RlICggZm9yIFRDUERVTVAgYW5kIGNvdXNpbnMgKSBvciBhY2NlcHQKKyAuIGEgc2VsZWN0IHNldCBvZiBtdWx0aWNhc3QgcGFja2V0cworKi8KK3N0YXRpYyB2b2lkIHNtY19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzaG9ydCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCVNNQ19TRUxFQ1RfQkFOSygwKTsKKwlpZiAoIGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyApCisJCW91dHcoIGludyhpb2FkZHIgKyBSQ1IgKSB8IFJDUl9QUk9NSVNDLCBpb2FkZHIgKyBSQ1IgKTsKKworLyogQlVHPyAgSSBuZXZlciBkaXNhYmxlIHByb21pc2N1b3VzIG1vZGUgaWYgbXVsdGljYXN0aW5nIHdhcyB0dXJuZWQgb24uCisgICBOb3csIEkgdHVybiBvZmYgcHJvbWlzY3VvdXMgbW9kZSwgYnV0IEkgZG9uJ3QgZG8gYW55dGhpbmcgdG8gbXVsdGljYXN0aW5nCisgICB3aGVuIHByb21pc2N1b3VzIG1vZGUgaXMgdHVybmVkIG9uLgorKi8KKworCS8qIEhlcmUsIEkgYW0gc2V0dGluZyB0aGlzIHRvIGFjY2VwdCBhbGwgbXVsdGljYXN0IHBhY2tldHMuCisJICAgSSBkb24ndCBuZWVkIHRvIHplcm8gdGhlIG11bHRpY2FzdCB0YWJsZSwgYmVjYXVzZSB0aGUgZmxhZyBpcworCSAgIGNoZWNrZWQgYmVmb3JlIHRoZSB0YWJsZSBpcworCSovCisJZWxzZSBpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkKKwkJb3V0dyggaW53KGlvYWRkciArIFJDUiApIHwgUkNSX0FMTVVMLCBpb2FkZHIgKyBSQ1IgKTsKKworCS8qIFdlIGp1c3QgZ2V0IGFsbCBtdWx0aWNhc3QgcGFja2V0cyBldmVuIGlmIHdlIG9ubHkgd2FudCB0aGVtCisJIC4gZnJvbSBvbmUgc291cmNlLiAgVGhpcyB3aWxsIGJlIGNoYW5nZWQgYXQgc29tZSBmdXR1cmUKKwkgLiBwb2ludC4gKi8KKwllbHNlIGlmIChkZXYtPm1jX2NvdW50ICkgIHsKKwkJLyogc3VwcG9ydCBoYXJkd2FyZSBtdWx0aWNhc3RpbmcgKi8KKworCQkvKiBiZSBzdXJlIEkgZ2V0IHJpZCBvZiBmbGFncyBJIG1pZ2h0IGhhdmUgc2V0ICovCisJCW91dHcoIGludyggaW9hZGRyICsgUkNSICkgJiB+KFJDUl9QUk9NSVNDIHwgUkNSX0FMTVVMKSwKKwkJCWlvYWRkciArIFJDUiApOworCQkvKiBOT1RFOiB0aGlzIGhhcyB0byBzZXQgdGhlIGJhbmssIHNvIG1ha2Ugc3VyZSBpdCBpcyB0aGUKKwkJICAgbGFzdCB0aGluZyBjYWxsZWQuICBUaGUgYmFuayBpcyBzZXQgdG8gemVybyBhdCB0aGUgdG9wICovCisJCXNtY19zZXRtdWx0aWNhc3QoIGlvYWRkciwgZGV2LT5tY19jb3VudCwgZGV2LT5tY19saXN0ICk7CisJfQorCWVsc2UgIHsKKwkJb3V0dyggaW53KCBpb2FkZHIgKyBSQ1IgKSAmIH4oUkNSX1BST01JU0MgfCBSQ1JfQUxNVUwpLAorCQkJaW9hZGRyICsgUkNSICk7CisKKwkJLyoKKwkJICBzaW5jZSBJJ20gZGlzYWJsaW5nIGFsbCBtdWx0aWNhc3QgZW50aXJlbHksIEkgbmVlZCB0bworCQkgIGNsZWFyIHRoZSBtdWx0aWNhc3QgbGlzdAorCQkqLworCQlTTUNfU0VMRUNUX0JBTksoIDMgKTsKKwkJb3V0dyggMCwgaW9hZGRyICsgTVVMVElDQVNUMSApOworCQlvdXR3KCAwLCBpb2FkZHIgKyBNVUxUSUNBU1QyICk7CisJCW91dHcoIDAsIGlvYWRkciArIE1VTFRJQ0FTVDMgKTsKKwkJb3V0dyggMCwgaW9hZGRyICsgTVVMVElDQVNUNCApOworCX0KK30KKworI2lmZGVmIE1PRFVMRQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldlNNQzkxOTQ7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaWZwb3J0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIlNNQyA5OTE5NCBJL08gYmFzZSBhZGRyZXNzIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIlNNQyA5OTE5NCBJUlEgbnVtYmVyIik7CitNT0RVTEVfUEFSTV9ERVNDKGlmcG9ydCwgIlNNQyA5OTE5NCBpbnRlcmZhY2UgcG9ydCAoMC1kZWZhdWx0LCAxLVRQLCAyLUFVSSkiKTsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJaWYgKGlvID09IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJQ0FSRE5BTUUiOiBZb3Ugc2hvdWxkbid0IHVzZSBhdXRvLXByb2Jpbmcgd2l0aCBpbnNtb2QhXG4iICk7CisKKwkvKiBjb3B5IHRoZSBwYXJhbWV0ZXJzIGZyb20gaW5zbW9kIGludG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwlkZXZTTUM5MTk0ID0gc21jX2luaXQoLTEpOworCWlmIChJU19FUlIoZGV2U01DOTE5NCkpCisJCXJldHVybiBQVFJfRVJSKGRldlNNQzkxOTQpOworCXJldHVybiAwOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2U01DOTE5NCk7CisJZnJlZV9pcnEoZGV2U01DOTE5NC0+aXJxLCBkZXZTTUM5MTk0KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXZTTUM5MTk0LT5iYXNlX2FkZHIsIFNNQ19JT19FWFRFTlQpOworCWZyZWVfbmV0ZGV2KGRldlNNQzkxOTQpOworfQorCisjZW5kaWYgLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWM5MTk0LmggYi9kcml2ZXJzL25ldC9zbWM5MTk0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkzYWI5MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3NtYzkxOTQuaApAQCAtMCwwICsxLDI0MSBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAuIHNtYzkxOTQuaAorIC4gQ29weXJpZ2h0IChDKSAxOTk2IGJ5IEVyaWsgU3RhaGxtYW4gCisgLgorIC4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworIC4gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAuCisgLiBUaGlzIGZpbGUgY29udGFpbnMgcmVnaXN0ZXIgaW5mb3JtYXRpb24gYW5kIGFjY2VzcyBtYWNyb3MgZm9yIAorIC4gdGhlIFNNQzkxeHh4IGNoaXBzZXQuICAgCisgLiAKKyAuIEluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUgd2FzIG9idGFpbmVkIGZyb20gdGhlIFNNQzkxQzk0IAorIC4gbWFudWFsIGZyb20gU01DLiAgVG8gZ2V0IGEgY29weSwgaWYgeW91IHJlYWxseSB3YW50IG9uZSwgeW91IGNhbiBmaW5kIAorIC4gaW5mb3JtYXRpb24gdW5kZXIgd3d3LnNtYy5jb20gaW4gdGhlIGNvbXBvbmVudHMgZGl2aXNpb24uCisgLiAoIHRoaXMgdGhhbmtzIHRvIGFkdmljZSBmcm9tIERvbmFsZCBCZWNrZXIgKS4KKyAuIAorIC4gQXV0aG9ycworIC4gCUVyaWsgU3RhaGxtYW4JCQkJKCBlcmlrQHZ0LmVkdSApCisgLgorIC4gSGlzdG9yeQorIC4gMDEvMDYvOTYJCSBFcmlrIFN0YWhsbWFuICAgbW92ZWQgZGVmaW5pdGlvbnMgaGVyZSBmcm9tIG1haW4gLmMgZmlsZQorIC4gMDEvMTkvOTYJCSBFcmlrIFN0YWhsbWFuCSAgcG9saXNoZWQgdGhpcyB1cCBzb21lLCBhbmQgYWRkZWQgYmV0dGVyCisgLgkJCQkJCQkJCQkgIGVycm9yIGhhbmRsaW5nCisgLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9TTUM5MTk0X0hfCisjZGVmaW5lIF9TTUM5MTk0X0hfCisKKy8qIEkgd2FudCBzb21lIHNpbXBsZSB0eXBlcyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCQlieXRlOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJCXdvcmQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IAkJZHdvcmQ7CisKKworLyogQmVjYXVzZSBvZiBiYW5rIHN3aXRjaGluZywgdGhlIFNNQzkxeHh4IHVzZXMgb25seSAxNiBJL08gcG9ydHMgKi8KKworI2RlZmluZSBTTUNfSU9fRVhURU5UCTE2CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAuICAKKyAuIEEgZGVzY3JpcHRpb24gb2YgdGhlIFNNQyByZWdpc3RlcnMgaXMgcHJvYmFibHkgaW4gb3JkZXIgaGVyZSwKKyAuIGFsdGhvdWdoIGZvciBkZXRhaWxzLCB0aGUgU01DIGRhdGFzaGVldCBpcyBpbnZhbHVhYmxlLiAgCisgLiAKKyAuIEJhc2ljYWxseSwgdGhlIGNoaXAgaGFzIDQgYmFua3Mgb2YgcmVnaXN0ZXJzICggMCB0byAzICksIHdoaWNoCisgLiBhcmUgYWNjZXNzZWQgYnkgd3JpdGluZyBhIG51bWJlciBpbnRvIHRoZSBCQU5LX1NFTEVDVCByZWdpc3RlcgorIC4gKCBJIGFsc28gdXNlIGEgU01DX1NFTEVDVF9CQU5LIG1hY3JvIGZvciB0aGlzICkuCisgLiAKKyAuIFRoZSBiYW5rcyBhcmUgY29uZmlndXJlZCBzbyB0aGF0IGZvciBtb3N0IHB1cnBvc2VzLCBiYW5rIDIgaXMgYWxsCisgLiB0aGF0IGlzIG5lZWRlZCBmb3Igc2ltcGxlIHJ1biB0aW1lIHRhc2tzLiAgCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorIC4gQmFuayBTZWxlY3QgUmVnaXN0ZXI6IAorIC4KKyAuCQl5eXl5IHl5eXkgMDAwMCAwMHh4ICAKKyAuCQl4eCAJCT0gYmFuayBudW1iZXIKKyAuCQl5eXl5IHl5eXkJPSAweDMzLCBmb3IgaWRlbnRpZmljYXRpb24gcHVycG9zZXMuCisqLworI2RlZmluZQlCQU5LX1NFTEVDVAkJMTQKKworLyogQkFOSyAwICAqLworCisjZGVmaW5lCVRDUiAJCTAgICAgCS8qIHRyYW5zbWl0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVENSX0VOQUJMRQkweDAwMDEJLyogaWYgdGhpcyBpcyAxLCB3ZSBjYW4gdHJhbnNtaXQgKi8gCisjZGVmaW5lIFRDUl9GRFVQTFggICAgCTB4MDgwMCAgLyogcmVjZWl2ZSBwYWNrZXRzIHNlbnQgb3V0ICovCisjZGVmaW5lIFRDUl9TVFBfU1FFVAkweDEwMDAJLyogc3RvcCB0cmFuc21pdHRpbmcgaWYgU2lnbmFsIHF1YWxpdHkgZXJyb3IgKi8KKyNkZWZpbmUJVENSX01PTl9DTlMJMHgwNDAwCS8qIG1vbml0b3JzIHRoZSBjYXJyaWVyIHN0YXR1cyAqLworI2RlZmluZQlUQ1JfUEFEX0VOQUJMRQkweDAwODAJLyogcGFkcyBzaG9ydCBwYWNrZXRzIHRvIDY0IGJ5dGVzICovCisKKyNkZWZpbmUJVENSX0NMRUFSCTAJLyogZG8gTk9USElORyAqLworLyogdGhlIG5vcm1hbCBzZXR0aW5ncyBmb3IgdGhlIFRDUiByZWdpc3RlciA6ICovIAorLyogUVVFU1RJT046IGRvIEkgd2FudCB0byBlbmFibGUgcGFkZGluZyBvZiBzaG9ydCBwYWNrZXRzID8gKi8KKyNkZWZpbmUJVENSX05PUk1BTCAgCVRDUl9FTkFCTEUgCisKKworI2RlZmluZSBFUEhfU1RBVFVTCTIKKyNkZWZpbmUgRVNfTElOS19PSwkweDQwMDAJLyogaXMgdGhlIGxpbmsgaW50ZWdyaXR5IG9rID8gKi8KKworI2RlZmluZQlSQ1IJCTQKKyNkZWZpbmUgUkNSX1NPRlRSRVNFVAkweDgwMDAgCS8qIHJlc2V0cyB0aGUgY2hpcCAqLwkKKyNkZWZpbmUJUkNSX1NUUklQX0NSQwkweDIwMAkvKiBzdHJpcHMgQ1JDICovCisjZGVmaW5lIFJDUl9FTkFCTEUJMHgxMDAJLyogSUZGIHRoaXMgaXMgc2V0LCB3ZSBjYW4gcmVjZWl2ZSBwYWNrZXRzICovCisjZGVmaW5lIFJDUl9BTE1VTAkweDQgCS8qIHJlY2VpdmUgYWxsIG11bHRpY2FzdCBwYWNrZXRzICovCisjZGVmaW5lCVJDUl9QUk9NSVNDCTB4MgkvKiBlbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworCisvKiB0aGUgbm9ybWFsIHNldHRpbmdzIGZvciB0aGUgUkNSIHJlZ2lzdGVyIDogKi8KKyNkZWZpbmUJUkNSX05PUk1BTAkoUkNSX1NUUklQX0NSQyB8IFJDUl9FTkFCTEUpCisjZGVmaW5lIFJDUl9DTEVBUgkweDAJCS8qIHNldCBpdCB0byBhIGJhc2Ugc3RhdGUgKi8KKworI2RlZmluZQlDT1VOVEVSCQk2CisjZGVmaW5lCU1JUgkJOAorI2RlZmluZQlNQ1IJCTEwCisvKiAxMiBpcyByZXNlcnZlZCAqLworCisvKiBCQU5LIDEgKi8KKyNkZWZpbmUgQ09ORklHCQkJMAorI2RlZmluZSBDRkdfQVVJX1NFTEVDVAkgCTB4MTAwCisjZGVmaW5lCUJBU0UJCQkyCisjZGVmaW5lCUFERFIwCQkJNAorI2RlZmluZQlBRERSMQkJCTYKKyNkZWZpbmUJQUREUjIJCQk4CisjZGVmaW5lCUdFTkVSQUwJCQkxMAorI2RlZmluZQlDT05UUk9MCQkJMTIKKyNkZWZpbmUJQ1RMX1BPV0VSRE9XTgkJMHgyMDAwCisjZGVmaW5lCUNUTF9MRV9FTkFCTEUJCTB4ODAKKyNkZWZpbmUJQ1RMX0NSX0VOQUJMRQkJMHg0MAorI2RlZmluZQlDVExfVEVfRU5BQkxFCQkweDAwMjAKKyNkZWZpbmUgQ1RMX0FVVE9fUkVMRUFTRQkweDA4MDAKKyNkZWZpbmUJQ1RMX0VQUk9NX0FDQ0VTUwkweDAwMDMgLyogaGlnaCBpZiBFcHJvbSBpcyBiZWluZyByZWFkICovCisKKy8qIEJBTksgMiAqLworI2RlZmluZSBNTVVfQ01ECQkwCisjZGVmaW5lIE1DX0JVU1kJCTEJLyogb25seSByZWFkYWJsZSBiaXQgaW4gdGhlIHJlZ2lzdGVyICovCisjZGVmaW5lIE1DX05PUAkJMAorI2RlZmluZQlNQ19BTExPQwkweDIwICAJLyogb3Igd2l0aCBudW1iZXIgb2YgMjU2IGJ5dGUgcGFja2V0cyAqLworI2RlZmluZQlNQ19SRVNFVAkweDQwCQorI2RlZmluZQlNQ19SRU1PVkUJMHg2MCAgCS8qIHJlbW92ZSB0aGUgY3VycmVudCByeCBwYWNrZXQgKi8KKyNkZWZpbmUgTUNfUkVMRUFTRSAgCTB4ODAgIAkvKiByZW1vdmUgYW5kIHJlbGVhc2UgdGhlIGN1cnJlbnQgcnggcGFja2V0ICovCisjZGVmaW5lIE1DX0ZSRUVQS1QgIAkweEEwICAJLyogUmVsZWFzZSBwYWNrZXQgaW4gUE5SIHJlZ2lzdGVyICovCisjZGVmaW5lIE1DX0VOUVVFVUUJMHhDMCAJLyogRW5xdWV1ZSB0aGUgcGFja2V0IGZvciB0cmFuc21pdCAqLworIAkKKyNkZWZpbmUJUE5SX0FSUgkJMgorI2RlZmluZSBGSUZPX1BPUlRTCTQKKworI2RlZmluZSBGUF9SWEVNUFRZICAweDgwMDAKKyNkZWZpbmUgRlBfVFhFTVBUWSAgMHg4MAorCisjZGVmaW5lCVBPSU5URVIJCTYKKyNkZWZpbmUgUFRSX1JFQUQJMHgyMDAwCisjZGVmaW5lCVBUUl9SQ1YJCTB4ODAwMAorI2RlZmluZQlQVFJfQVVUT0lOQyAJMHg0MDAwCisjZGVmaW5lIFBUUl9BVVRPX0lOQwkweDAwNDAKKworI2RlZmluZQlEQVRBXzEJCTgKKyNkZWZpbmUJREFUQV8yCQkxMAorI2RlZmluZQlJTlRFUlJVUFQJMTIKKworI2RlZmluZSBJTlRfTUFTSwkxMworI2RlZmluZSBJTV9SQ1ZfSU5UCTB4MQorI2RlZmluZQlJTV9UWF9JTlQJMHgyCisjZGVmaW5lCUlNX1RYX0VNUFRZX0lOVAkweDQJCisjZGVmaW5lCUlNX0FMTE9DX0lOVAkweDgKKyNkZWZpbmUJSU1fUlhfT1ZSTl9JTlQJMHgxMAorI2RlZmluZQlJTV9FUEhfSU5UCTB4MjAKKyNkZWZpbmUJSU1fRVJDVl9JTlQJMHg0MCAvKiBub3Qgb24gU01DOTE5MiAqLwkJCisKKy8qIEJBTksgMyAqLworI2RlZmluZQlNVUxUSUNBU1QxCTAKKyNkZWZpbmUJTVVMVElDQVNUMgkyCisjZGVmaW5lCU1VTFRJQ0FTVDMJNAorI2RlZmluZQlNVUxUSUNBU1Q0CTYKKyNkZWZpbmUJTUdNVAkJOAorI2RlZmluZQlSRVZJU0lPTgkxMCAvKiAoIGhpOiBjaGlwIGlkICAgbG93OiByZXYgIyApICovCisKKworLyogdGhpcyBpcyBOT1Qgb24gU01DOTE5MiAqLworI2RlZmluZQlFUkNWCQkxMgorCisjZGVmaW5lIENISVBfOTE5MAkzCisjZGVmaW5lIENISVBfOTE5NAk0CisjZGVmaW5lIENISVBfOTE5NQk1CisjZGVmaW5lIENISVBfOTExMDAJNworCitzdGF0aWMgY29uc3QgY2hhciAqIGNoaXBfaWRzWyAxNSBdID0gIHsgCisJTlVMTCwgTlVMTCwgTlVMTCwgCisJLyogMyAqLyAiU01DOTFDOTAvOTFDOTIiLAorCS8qIDQgKi8gIlNNQzkxQzk0IiwKKwkvKiA1ICovICJTTUM5MUM5NSIsCisJTlVMTCwKKwkvKiA3ICovICJTTUM5MUMxMDAiLCAKKwkvKiA4ICovICJTTUM5MUMxMDBGRCIsIAorCU5VTEwsIE5VTEwsIE5VTEwsIAorCU5VTEwsIE5VTEwsIE5VTEx9OyAgCisKKy8qIAorIC4gVHJhbnNtaXQgc3RhdHVzIGJpdHMgCisqLworI2RlZmluZSBUU19TVUNDRVNTIDB4MDAwMQorI2RlZmluZSBUU19MT1NUQ0FSIDB4MDQwMAorI2RlZmluZSBUU19MQVRDT0wgIDB4MDIwMAorI2RlZmluZSBUU18xNkNPTCAgIDB4MDAxMAorCisvKgorIC4gUmVjZWl2ZSBzdGF0dXMgYml0cworKi8KKyNkZWZpbmUgUlNfQUxHTkVSUgkweDgwMDAKKyNkZWZpbmUgUlNfQkFEQ1JDCTB4MjAwMAorI2RlZmluZSBSU19PRERGUkFNRQkweDEwMDAKKyNkZWZpbmUgUlNfVE9PTE9ORwkweDA4MDAKKyNkZWZpbmUgUlNfVE9PU0hPUlQJMHgwNDAwCisjZGVmaW5lIFJTX01VTFRJQ0FTVAkweDAwMDEKKyNkZWZpbmUgUlNfRVJST1JTCShSU19BTEdORVJSIHwgUlNfQkFEQ1JDIHwgUlNfVE9PTE9ORyB8IFJTX1RPT1NIT1JUKSAKKworc3RhdGljIGNvbnN0IGNoYXIgKiBpbnRlcmZhY2VzWyAyIF0gPSB7ICJUUCIsICJBVUkiIH07CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIC4gIEkgZGVmaW5lIHNvbWUgbWFjcm9zIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGRvIHNvbWV3aGF0IGNvbW1vbgorIC4gb3Igc2xpZ2h0bHkgY29tcGxpY2F0ZWQsIHJlcGVhdGVkIHRhc2tzLiAKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHNlbGVjdCBhIHJlZ2lzdGVyIGJhbmssIDAgdG8gMyAgKi8KKworI2RlZmluZSBTTUNfU0VMRUNUX0JBTksoeCkgIHsgb3V0dyggeCwgaW9hZGRyICsgQkFOS19TRUxFQ1QgKTsgfSAKKworLyogZGVmaW5lIGEgc21hbGwgZGVsYXkgZm9yIHRoZSByZXNldCAqLworI2RlZmluZSBTTUNfREVMQVkoKSB7IGludyggaW9hZGRyICsgUkNSICk7XAorCQkJaW53KCBpb2FkZHIgKyBSQ1IgKTtcCisJCQlpbncoIGlvYWRkciArIFJDUiApOyAgfQorCisvKiB0aGlzIGVuYWJsZXMgYW4gaW50ZXJydXB0IGluIHRoZSBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworI2RlZmluZSBTTUNfRU5BQkxFX0lOVCh4KSB7XAorCQl1bnNpZ25lZCBjaGFyIG1hc2s7XAorCQlTTUNfU0VMRUNUX0JBTksoMik7XAorCQltYXNrID0gaW5iKCBpb2FkZHIgKyBJTlRfTUFTSyApO1wKKwkJbWFzayB8PSAoeCk7XAorCQlvdXRiKCBtYXNrLCBpb2FkZHIgKyBJTlRfTUFTSyApOyBcCit9CisKKy8qIHRoaXMgZGlzYWJsZXMgYW4gaW50ZXJydXB0IGZyb20gdGhlIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgU01DX0RJU0FCTEVfSU5UKHgpIHtcCisJCXVuc2lnbmVkIGNoYXIgbWFzaztcCisJCVNNQ19TRUxFQ1RfQkFOSygyKTtcCisJCW1hc2sgPSBpbmIoIGlvYWRkciArIElOVF9NQVNLICk7XAorCQltYXNrICY9IH4oeCk7XAorCQlvdXRiKCBtYXNrLCBpb2FkZHIgKyBJTlRfTUFTSyApOyBcCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIC4gRGVmaW5lIHRoZSBpbnRlcnJ1cHRzIHRoYXQgSSB3YW50IHRvIHJlY2VpdmUgZnJvbSB0aGUgY2FyZAorIC4gCisgLiBJIHdhbnQ6IAorIC4gIElNX0VQSF9JTlQsIGZvciBuYXN0eSBlcnJvcnMKKyAuICBJTV9SQ1ZfSU5ULCBmb3IgaGFwcHkgcmVjZWl2ZWQgcGFja2V0cworIC4gIElNX1JYX09WUk5fSU5ULCBiZWNhdXNlIEkgaGF2ZSB0byBraWNrIHRoZSByZWNlaXZlcgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU01DX0lOVEVSUlVQVF9NQVNLICAgKElNX0VQSF9JTlQgfCBJTV9SWF9PVlJOX0lOVCB8IElNX1JDVl9JTlQpIAorCisjZW5kaWYgIC8qIF9TTUNfOTE5NF9IXyAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWM5MXguYyBiL2RyaXZlcnMvbmV0L3NtYzkxeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NjZiYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zbWM5MXguYwpAQCAtMCwwICsxLDIzNDMgQEAKKy8qCisgKiBzbWM5MXguYworICogVGhpcyBpcyBhIGRyaXZlciBmb3IgU01TQydzIDkxQzl4LzkxQzF4eCBzaW5nbGUtY2hpcCBFdGhlcm5ldCBkZXZpY2VzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBieSBFcmlrIFN0YWhsbWFuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgU3RhbmRhcmQgTWljcm9zeXN0ZW1zIENvcnBvcmF0aW9uCisgKglEZXZlbG9wZWQgYnkgU2ltcGxlIE5ldHdvcmsgTWFnaWMgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwMyBNb250YSBWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoJVW5pZmllZCBTTUM5MXggZHJpdmVyIGJ5IE5pY29sYXMgUGl0cmUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogQXJndW1lbnRzOgorICogCWlvCT0gZm9yIHRoZSBiYXNlIGFkZHJlc3MKKyAqCWlycQk9IGZvciB0aGUgSVJRCisgKglub3dhaXQJPSAwIGZvciBub3JtYWwgd2FpdCBzdGF0ZXMsIDEgZWxpbWluYXRlcyBhZGRpdGlvbmFsIHdhaXQgc3RhdGVzCisgKgorICogb3JpZ2luYWwgYXV0aG9yOgorICogCUVyaWsgU3RhaGxtYW4gPGVyaWtAdnQuZWR1PgorICoKKyAqIGhhcmR3YXJlIG11bHRpY2FzdCBjb2RlOgorICogICAgUGV0ZXIgQ2FtbWFlcnQgPHBjQGRlbmthcnQuYmU+CisgKgorICogY29udHJpYnV0b3JzOgorICogCURhcmlzIEEgTmV2aWwgPGRuZXZpbEBzbm1jLmNvbT4KKyAqICAgICAgTmljb2xhcyBQaXRyZSA8bmljb0BjYW0ub3JnPgorICoJUnVzc2VsbCBLaW5nIDxybWtAYXJtLmxpbnV4Lm9yZy51az4KKyAqCisgKiBIaXN0b3J5OgorICogICAwOC8yMC8wMCAgQXJuYWxkbyBNZWxvICAgICAgIGZpeCBrZnJlZShza2IpIGluIHNtY19oYXJkd2FyZV9zZW5kX3BhY2tldAorICogICAxMi8xNS8wMCAgQ2hyaXN0aWFuIEp1bGxpZW4gIGZpeCAiV2FybmluZzoga2ZyZWVfc2tiIG9uIGhhcmQgSVJRIgorICogICAwMy8xNi8wMSAgRGFyaXMgQSBOZXZpbCAgICAgIG1vZGlmaWVkIHNtYzkxOTQuYyBmb3IgdXNlIHdpdGggTEFOOTFDMTExCisgKiAgIDA4LzIyLzAxICBTY290dCBBbmRlcnNvbiAgICAgbWVyZ2UgY2hhbmdlcyBmcm9tIHNtYzkxOTQgdG8gc21jOTExMTEKKyAqICAgMDgvMjEvMDEgIFByYW1vZCBCIEJoYXJkd2FqICBhZGRlZCBzdXBwb3J0IGZvciBSZXZCIG9mIExBTjkxQzExMQorICogICAxMi8yMC8wMSAgSmVmZiBTdXRoZXJsYW5kICAgIGluaXRpYWwgcG9ydCB0byBYc2NhbGUgUFhBIHdpdGggRE1BIHN1cHBvcnQKKyAqICAgMDQvMDcvMDMgIE5pY29sYXMgUGl0cmUgICAgICB1bmlmaWVkIFNNQzkxeCBkcml2ZXIsIGtpbGxlZCBpcnEgcmFjZXMsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBidXMgYWJzdHJhY3Rpb24sIGJpZyBjbGVhbnVwLCBldGMuCisgKiAgIDI5LzA5LzAzICBSdXNzZWxsIEtpbmcgICAgICAgLSBhZGQgZHJpdmVyIG1vZGVsIHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGV0aHRvb2wgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gY29udmVydCB0byB1c2UgZ2VuZXJpYyBNSUkgaW50ZXJmYWNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBhZGQgbGluayB1cC9kb3duIG5vdGlmaWNhdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZG9uJ3QgdHJ5IHRvIGhhbmRsZSBmdWxsIG5lZ290aWF0aW9uIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWNfcGh5X2NvbmZpZ3VyZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gY2xlYW4gdXAgKGFuZCBmaXggc3RhY2sgb3ZlcnJ1bikgaW4gUEhZCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSUkgcmVhZC93cml0ZSBmdW5jdGlvbnMKKyAqICAgMjIvMDkvMDQgIE5pY29sYXMgUGl0cmUgICAgICBiaWcgdXBkYXRlIChzZWUgY29tbWl0IGxvZyBmb3IgZGV0YWlscykKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0KKwkic21jOTF4LmM6IHYxLjEsIHNlcCAyMiAyMDA0IGJ5IE5pY29sYXMgUGl0cmUgPG5pY29AY2FtLm9yZz5cbiI7CisKKy8qIERlYnVnZ2luZyBsZXZlbCAqLworI2lmbmRlZiBTTUNfREVCVUcKKyNkZWZpbmUgU01DX0RFQlVHCQkwCisjZW5kaWYKKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgInNtYzkxeC5oIgorCisjaWZkZWYgQ09ORklHX0lTQQorLyoKKyAqIHRoZSBMQU45MUMxMTEgY2FuIGJlIGF0IGFueSBvZiB0aGUgZm9sbG93aW5nIHBvcnQgYWRkcmVzc2VzLiAgVG8gY2hhbmdlLAorICogZm9yIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGNhcmQsIHlvdSBjYW4gYWRkIGl0IHRvIHRoZSBhcnJheS4gIEtlZXAgaW4KKyAqIG1pbmQgdGhhdCB0aGUgYXJyYXkgbXVzdCBlbmQgaW4gemVyby4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBzbWNfcG9ydGxpc3RbXSBfX2luaXRkYXRhID0geworCTB4MjAwLCAweDIyMCwgMHgyNDAsIDB4MjYwLCAweDI4MCwgMHgyQTAsIDB4MkMwLCAweDJFMCwKKwkweDMwMCwgMHgzMjAsIDB4MzQwLCAweDM2MCwgMHgzODAsIDB4M0EwLCAweDNDMCwgMHgzRTAsIDAKK307CisKKyNpZm5kZWYgU01DX0lPQUREUgorIyBkZWZpbmUgU01DX0lPQUREUgkJLTEKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGxvbmcgaW8gPSBTTUNfSU9BRERSOworbW9kdWxlX3BhcmFtKGlvLCB1bG9uZywgMDQwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiSS9PIGJhc2UgYWRkcmVzcyIpOworCisjaWZuZGVmIFNNQ19JUlEKKyMgZGVmaW5lIFNNQ19JUlEJCS0xCisjZW5kaWYKK3N0YXRpYyBpbnQgaXJxID0gU01DX0lSUTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMDQwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSBudW1iZXIiKTsKKworI2VuZGlmICAvKiBDT05GSUdfSVNBICovCisKKyNpZm5kZWYgU01DX05PV0FJVAorIyBkZWZpbmUgU01DX05PV0FJVAkJMAorI2VuZGlmCitzdGF0aWMgaW50IG5vd2FpdCA9IFNNQ19OT1dBSVQ7Cittb2R1bGVfcGFyYW0obm93YWl0LCBpbnQsIDA0MDApOworTU9EVUxFX1BBUk1fREVTQyhub3dhaXQsICJzZXQgdG8gMSBmb3Igbm8gd2FpdCBzdGF0ZSIpOworCisvKgorICogVHJhbnNtaXQgdGltZW91dCwgZGVmYXVsdCA1IHNlY29uZHMuCisgKi8KK3N0YXRpYyBpbnQgd2F0Y2hkb2cgPSA1MDAwOworbW9kdWxlX3BhcmFtKHdhdGNoZG9nLCBpbnQsIDA0MDApOworTU9EVUxFX1BBUk1fREVTQyh3YXRjaGRvZywgInRyYW5zbWl0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIFRoZSBpbnRlcm5hbCB3b3JraW5ncyBvZiB0aGUgZHJpdmVyLiAgSWYgeW91IGFyZSBjaGFuZ2luZyBhbnl0aGluZworICogaGVyZSB3aXRoIHRoZSBTTUMgc3R1ZmYsIHlvdSBzaG91bGQgaGF2ZSB0aGUgZGF0YXNoZWV0IGFuZCBrbm93CisgKiB3aGF0IHlvdSBhcmUgZG9pbmcuCisgKi8KKyNkZWZpbmUgQ0FSRE5BTUUgInNtYzkxeCIKKworLyoKKyAqIFVzZSBwb3dlci1kb3duIGZlYXR1cmUgb2YgdGhlIGNoaXAKKyAqLworI2RlZmluZSBQT1dFUl9ET1dOCQkxCisKKy8qCisgKiBXYWl0IHRpbWUgZm9yIG1lbW9yeSB0byBiZSBmcmVlLiAgVGhpcyBwcm9iYWJseSBzaG91bGRuJ3QgYmUKKyAqIHR1bmVkIHRoYXQgbXVjaCwgYXMgd2FpdGluZyBmb3IgdGhpcyBtZWFucyBub3RoaW5nIGVsc2UgaGFwcGVucworICogaW4gdGhlIHN5c3RlbQorICovCisjZGVmaW5lIE1FTU9SWV9XQUlUX1RJTUUJMTYKKworLyoKKyAqIFRoaXMgc2VsZWN0cyB3aGV0aGVyIFRYIHBhY2tldHMgYXJlIHNlbnQgb25lIGJ5IG9uZSB0byB0aGUgU01DOTF4IGludGVybmFsCisgKiBtZW1vcnkgYW5kIHRocm90dGxlZCB1bnRpbCB0cmFuc21pc3Npb24gY29tcGxldGVzLiAgVGhpcyBtYXkgcHJldmVudAorICogUlggb3ZlcnJ1bnMgYSBsaXRsZSBieSBrZWVwaW5nIG11Y2ggb2YgdGhlIG1lbW9yeSBmcmVlIGZvciBSWCBwYWNrZXRzCisgKiBidXQgdG8gdGhlIGV4cGVuc2Ugb2YgcmVkdWNlZCBUWCB0aHJvdWdocHV0IGFuZCBpbmNyZWFzZWQgSVJRIG92ZXJoZWFkLgorICogTm90ZSB0aGlzIGlzIG5vdCBhIGN1cmUgZm9yIGEgdG9vIHNsb3cgZGF0YSBidXMgb3IgdG9vIGhpZ2ggSVJRIGxhdGVuY3kuCisgKi8KKyNkZWZpbmUgVEhST1RUTEVfVFhfUEtUUwkwCisKKy8qCisgKiBUaGUgTUlJIGNsb2NrIGhpZ2gvbG93IHRpbWVzLiAgMnggdGhpcyBudW1iZXIgZ2l2ZXMgdGhlIE1JSSBjbG9jayBwZXJpb2QKKyAqIGluIG1pY3Jvc2Vjb25kcy4gKHdhcyA1MCwgYnV0IHRoaXMgZ2l2ZXMgNi40bXMgZm9yIGVhY2ggTUlJIHRyYW5zYWN0aW9uISkKKyAqLworI2RlZmluZSBNSUlfREVMQVkJCTEKKworLyogc3RvcmUgdGhpcyBpbmZvcm1hdGlvbiBmb3IgdGhlIGRyaXZlci4uICovCitzdHJ1Y3Qgc21jX2xvY2FsIHsKKwkvKgorCSAqIElmIEkgaGF2ZSB0byB3YWl0IHVudGlsIG1lbW9yeSBpcyBhdmFpbGFibGUgdG8gc2VuZCBhCisJICogcGFja2V0LCBJIHdpbGwgc3RvcmUgdGhlIHNrYnVmZiBoZXJlLCB1bnRpbCBJIGdldCB0aGUKKwkgKiBkZXNpcmVkIG1lbW9yeS4gIFRoZW4sIEknbGwgc2VuZCBpdCBvdXQgYW5kIGZyZWUgaXQuCisJICovCisJc3RydWN0IHNrX2J1ZmYgKnBlbmRpbmdfdHhfc2tiOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0eF90YXNrOworCisgCS8qCisJICogdGhlc2UgYXJlIHRoaW5ncyB0aGF0IHRoZSBrZXJuZWwgd2FudHMgbWUgdG8ga2VlcCwgc28gdXNlcnMKKwkgKiBjYW4gZmluZCBvdXQgc2VtaS11c2VsZXNzIHN0YXRpc3RpY3Mgb2YgaG93IHdlbGwgdGhlIGNhcmQgaXMKKwkgKiBwZXJmb3JtaW5nCisJICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisKKwkvKiB2ZXJzaW9uL3JldmlzaW9uIG9mIHRoZSBTTUM5MXggY2hpcCAqLworCWludAl2ZXJzaW9uOworCisJLyogQ29udGFpbnMgdGhlIGN1cnJlbnQgYWN0aXZlIHRyYW5zbWlzc2lvbiBtb2RlICovCisJaW50CXRjcl9jdXJfbW9kZTsKKworCS8qIENvbnRhaW5zIHRoZSBjdXJyZW50IGFjdGl2ZSByZWNlaXZlIG1vZGUgKi8KKwlpbnQJcmNyX2N1cl9tb2RlOworCisJLyogQ29udGFpbnMgdGhlIGN1cnJlbnQgYWN0aXZlIHJlY2VpdmUvcGh5IG1vZGUgKi8KKwlpbnQJcnBjX2N1cl9tb2RlOworCWludAljdGxfcmZkdXBseDsKKwlpbnQJY3RsX3JzcGVlZDsKKworCXUzMgltc2dfZW5hYmxlOworCXUzMglwaHlfdHlwZTsKKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpOworCisJLyogd29yayBxdWV1ZSAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCBwaHlfY29uZmlndXJlOworCWludAl3b3JrX3BlbmRpbmc7CisKKwlzcGlubG9ja190IGxvY2s7CisKKyNpZmRlZiBTTUNfQ0FOX1VTRV9EQVRBQ1MKKwl1MzIJX19pb21lbSAqZGF0YWNzOworI2VuZGlmCisKKyNpZmRlZiBTTUNfVVNFX1BYQV9ETUEKKwkvKiBETUEgbmVlZHMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGNoaXAgKi8KKwl1X2xvbmcgcGh5c2FkZHI7CisjZW5kaWYKKwl2b2lkIF9faW9tZW0gKmJhc2U7Cit9OworCisjaWYgU01DX0RFQlVHID4gMAorI2RlZmluZSBEQkcobiwgYXJncy4uLikJCQkJCVwKKwlkbyB7CQkJCQkJXAorCQlpZiAoU01DX0RFQlVHID49IChuKSkJCQlcCisJCQlwcmludGsoYXJncyk7CVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFBSSU5USyhhcmdzLi4uKSAgIHByaW50ayhhcmdzKQorI2Vsc2UKKyNkZWZpbmUgREJHKG4sIGFyZ3MuLi4pICAgZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIFBSSU5USyhhcmdzLi4uKSAgIHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpCisjZW5kaWYKKworI2lmIFNNQ19ERUJVRyA+IDMKK3N0YXRpYyB2b2lkIFBSSU5UX1BLVCh1X2NoYXIgKmJ1ZiwgaW50IGxlbmd0aCkKK3sKKwlpbnQgaTsKKwlpbnQgcmVtYWluZGVyOworCWludCBsaW5lczsKKworCWxpbmVzID0gbGVuZ3RoIC8gMTY7CisJcmVtYWluZGVyID0gbGVuZ3RoICUgMTY7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGluZXMgOyBpICsrKSB7CisJCWludCBjdXI7CisJCWZvciAoY3VyID0gMDsgY3VyIDwgODsgY3VyKyspIHsKKwkJCXVfY2hhciBhLCBiOworCQkJYSA9ICpidWYrKzsKKwkJCWIgPSAqYnVmKys7CisJCQlwcmludGsoIiUwMnglMDJ4ICIsIGEsIGIpOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IHJlbWFpbmRlci8yIDsgaSsrKSB7CisJCXVfY2hhciBhLCBiOworCQlhID0gKmJ1ZisrOworCQliID0gKmJ1ZisrOworCQlwcmludGsoIiUwMnglMDJ4ICIsIGEsIGIpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisjZWxzZQorI2RlZmluZSBQUklOVF9QS1QoeC4uLikgIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKworLyogdGhpcyBlbmFibGVzIGFuIGludGVycnVwdCBpbiB0aGUgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU01DX0VOQUJMRV9JTlQoeCkgZG8gewkJCQkJCVwKKwl1bnNpZ25lZCBjaGFyIG1hc2s7CQkJCQkJXAorCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsJCQkJCVwKKwltYXNrID0gU01DX0dFVF9JTlRfTUFTSygpOwkJCQkJXAorCW1hc2sgfD0gKHgpOwkJCQkJCQlcCisJU01DX1NFVF9JTlRfTUFTSyhtYXNrKTsJCQkJCQlcCisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CQkJCQlcCit9IHdoaWxlICgwKQorCisvKiB0aGlzIGRpc2FibGVzIGFuIGludGVycnVwdCBmcm9tIHRoZSBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworI2RlZmluZSBTTUNfRElTQUJMRV9JTlQoeCkgZG8gewkJCQkJCVwKKwl1bnNpZ25lZCBjaGFyIG1hc2s7CQkJCQkJXAorCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsJCQkJCVwKKwltYXNrID0gU01DX0dFVF9JTlRfTUFTSygpOwkJCQkJXAorCW1hc2sgJj0gfih4KTsJCQkJCQkJXAorCVNNQ19TRVRfSU5UX01BU0sobWFzayk7CQkJCQkJXAorCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOwkJCQkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIFdhaXQgd2hpbGUgTU1VIGlzIGJ1c3kuICBUaGlzIGlzIHVzdWFsbHkgaW4gdGhlIG9yZGVyIG9mIGEgZmV3IG5hbm9zZWNzCisgKiBpZiBhdCBhbGwsIGJ1dCBsZXQncyBhdm9pZCBkZWFkbG9ja2luZyB0aGUgc3lzdGVtIGlmIHRoZSBoYXJkd2FyZQorICogZGVjaWRlcyB0byBnbyBzb3V0aC4KKyAqLworI2RlZmluZSBTTUNfV0FJVF9NTVVfQlVTWSgpIGRvIHsJCQkJCVwKKwlpZiAodW5saWtlbHkoU01DX0dFVF9NTVVfQ01EKCkgJiBNQ19CVVNZKSkgewkJCVwKKwkJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIDI7CQkJXAorCQl3aGlsZSAoU01DX0dFVF9NTVVfQ01EKCkgJiBNQ19CVVNZKSB7CQkJXAorCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsJCVwKKwkJCQlwcmludGsoIiVzOiB0aW1lb3V0ICVzIGxpbmUgJWRcbiIsCVwKKwkJCQkJZGV2LT5uYW1lLCBfX0ZJTEVfXywgX19MSU5FX18pOwlcCisJCQkJYnJlYWs7CQkJCQlcCisJCQl9CQkJCQkJXAorCQkJY3B1X3JlbGF4KCk7CQkJCQlcCisJCX0JCQkJCQkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKworLyoKKyAqIHRoaXMgZG9lcyBhIHNvZnQgcmVzZXQgb24gdGhlIGRldmljZQorICovCitzdGF0aWMgdm9pZCBzbWNfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+YmFzZTsKKwl1bnNpZ25lZCBpbnQgY3RsLCBjZmc7CisKKwlEQkcoMiwgIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCisJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCXNwaW5fbG9jaygmbHAtPmxvY2spOworCVNNQ19TRUxFQ1RfQkFOSygyKTsKKwlTTUNfU0VUX0lOVF9NQVNLKDApOworCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisKKwkvKgorCSAqIFRoaXMgcmVzZXRzIHRoZSByZWdpc3RlcnMgbW9zdGx5IHRvIGRlZmF1bHRzLCBidXQgZG9lc24ndAorCSAqIGFmZmVjdCBFRVBST00uICBUaGF0IHNlZW1zIHVubmVjZXNzYXJ5CisJICovCisJU01DX1NFTEVDVF9CQU5LKDApOworCVNNQ19TRVRfUkNSKFJDUl9TT0ZUUlNUKTsKKworCS8qCisJICogU2V0dXAgdGhlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKwkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBDT05GSUdfUkVHIGlzIG5vdCBhZmZlY3RlZAorCSAqIGJ5IGEgc29mdCByZXNldAorCSAqLworCVNNQ19TRUxFQ1RfQkFOSygxKTsKKworCWNmZyA9IENPTkZJR19ERUZBVUxUOworCisJLyoKKwkgKiBTZXR1cCBmb3IgZmFzdCBhY2Nlc3NlcyBpZiByZXF1ZXN0ZWQuICBJZiB0aGUgY2FyZC9zeXN0ZW0KKwkgKiBjYW4ndCBoYW5kbGUgaXQgdGhlbiB0aGVyZSB3aWxsIGJlIG5vIHJlY292ZXJ5IGV4Y2VwdCBmb3IKKwkgKiBhIGhhcmQgcmVzZXQgb3IgcG93ZXIgY3ljbGUKKwkgKi8KKwlpZiAobm93YWl0KQorCQljZmcgfD0gQ09ORklHX05PX1dBSVQ7CisKKwkvKgorCSAqIFJlbGVhc2UgZnJvbSBwb3NzaWJsZSBwb3dlci1kb3duIHN0YXRlCisJICogQ29uZmlndXJhdGlvbiByZWdpc3RlciBpcyBub3QgYWZmZWN0ZWQgYnkgU29mdCBSZXNldAorCSAqLworCWNmZyB8PSBDT05GSUdfRVBIX1BPV0VSX0VOOworCisJU01DX1NFVF9DT05GSUcoY2ZnKTsKKworCS8qIHRoaXMgc2hvdWxkIHBhdXNlIGVub3VnaCBmb3IgdGhlIGNoaXAgdG8gYmUgaGFwcHkgKi8KKwkvKgorCSAqIGVsYWJvcmF0ZT8gIFdoYXQgZG9lcyB0aGUgY2hpcCBfbmVlZF8/IC0tamdhcnppaworCSAqCisJICogVGhpcyBzZWVtcyB0byBiZSB1bmRvY3VtZW50ZWQsIGJ1dCBzb21ldGhpbmcgdGhlIG9yaWdpbmFsCisJICogZHJpdmVyKHMpIGhhdmUgYWx3YXlzIGRvbmUuICBTdXNwZWN0IHVuZG9jdW1lbnRlZCB0aW1pbmcKKwkgKiBpbmZvL2RldGVybWluZWQgZW1waXJpY2FsbHkuIC0tcm1rCisJICovCisJdWRlbGF5KDEpOworCisJLyogRGlzYWJsZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBmdW5jdGlvbmFsaXR5ICovCisJU01DX1NFTEVDVF9CQU5LKDApOworCVNNQ19TRVRfUkNSKFJDUl9DTEVBUik7CisJU01DX1NFVF9UQ1IoVENSX0NMRUFSKTsKKworCVNNQ19TRUxFQ1RfQkFOSygxKTsKKwljdGwgPSBTTUNfR0VUX0NUTCgpIHwgQ1RMX0xFX0VOQUJMRTsKKworCS8qCisJICogU2V0IHRoZSBjb250cm9sIHJlZ2lzdGVyIHRvIGF1dG9tYXRpY2FsbHkgcmVsZWFzZSBzdWNjZXNzZnVsbHkKKwkgKiB0cmFuc21pdHRlZCBwYWNrZXRzLCB0byBtYWtlIHRoZSBiZXN0IHVzZSBvdXQgb2Ygb3VyIGxpbWl0ZWQKKwkgKiBtZW1vcnkKKwkgKi8KKwlpZighVEhST1RUTEVfVFhfUEtUUykKKwkJY3RsIHw9IENUTF9BVVRPX1JFTEVBU0U7CisJZWxzZQorCQljdGwgJj0gfkNUTF9BVVRPX1JFTEVBU0U7CisJU01DX1NFVF9DVEwoY3RsKTsKKworCS8qIFJlc2V0IHRoZSBNTVUgKi8KKwlTTUNfU0VMRUNUX0JBTksoMik7CisJU01DX1NFVF9NTVVfQ01EKE1DX1JFU0VUKTsKKwlTTUNfV0FJVF9NTVVfQlVTWSgpOworCisJLyogY2xlYXIgYW55dGhpbmcgc2F2ZWQgKi8KKwlpZiAobHAtPnBlbmRpbmdfdHhfc2tiICE9IE5VTEwpIHsKKwkJZGV2X2tmcmVlX3NrYiAobHAtPnBlbmRpbmdfdHhfc2tiKTsKKwkJbHAtPnBlbmRpbmdfdHhfc2tiID0gTlVMTDsKKwkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwl9Cit9CisKKy8qCisgKiBFbmFibGUgSW50ZXJydXB0cywgUmVjZWl2ZSwgYW5kIFRyYW5zbWl0CisgKi8KK3N0YXRpYyB2b2lkIHNtY19lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+YmFzZTsKKwlpbnQgbWFzazsKKworCURCRygyLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBzZWUgdGhlIGhlYWRlciBmaWxlIGZvciBvcHRpb25zIGluIFRDUi9SQ1IgREVGQVVMVCAqLworCVNNQ19TRUxFQ1RfQkFOSygwKTsKKwlTTUNfU0VUX1RDUihscC0+dGNyX2N1cl9tb2RlKTsKKwlTTUNfU0VUX1JDUihscC0+cmNyX2N1cl9tb2RlKTsKKworCVNNQ19TRUxFQ1RfQkFOSygxKTsKKwlTTUNfU0VUX01BQ19BRERSKGRldi0+ZGV2X2FkZHIpOworCisJLyogbm93LCBlbmFibGUgaW50ZXJydXB0cyAqLworCW1hc2sgPSBJTV9FUEhfSU5UfElNX1JYX09WUk5fSU5UfElNX1JDVl9JTlQ7CisJaWYgKGxwLT52ZXJzaW9uID49IChDSElQXzkxMTAwIDw8IDQpKQorCQltYXNrIHw9IElNX01ESU5UOworCVNNQ19TRUxFQ1RfQkFOSygyKTsKKwlTTUNfU0VUX0lOVF9NQVNLKG1hc2spOworCisJLyoKKwkgKiBGcm9tIHRoaXMgcG9pbnQgdGhlIHJlZ2lzdGVyIGJhbmsgbXVzdCBfTk9UXyBiZSBzd2l0Y2hlZCBhd2F5CisJICogdG8gc29tZXRoaW5nIGVsc2UgdGhhbiBiYW5rIDIgd2l0aG91dCBwcm9wZXIgbG9ja2luZyBhZ2FpbnN0CisJICogcmFjZXMgd2l0aCBhbnkgdGFza2xldCBvciBpbnRlcnJ1cHQgaGFuZGxlcnMgdW50aWwgc21jX3NodXRkb3duKCkKKwkgKiBvciBzbWNfcmVzZXQoKSBpcyBjYWxsZWQuCisJICovCit9CisKKy8qCisgKiB0aGlzIHB1dHMgdGhlIGRldmljZSBpbiBhbiBpbmFjdGl2ZSBzdGF0ZQorICovCitzdGF0aWMgdm9pZCBzbWNfc2h1dGRvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+YmFzZTsKKworCURCRygyLCAiJXM6ICVzXG4iLCBDQVJETkFNRSwgX19GVU5DVElPTl9fKTsKKworCS8qIG5vIG1vcmUgaW50ZXJydXB0cyBmb3IgbWUgKi8KKwlzcGluX2xvY2soJmxwLT5sb2NrKTsKKwlTTUNfU0VMRUNUX0JBTksoMik7CisJU01DX1NFVF9JTlRfTUFTSygwKTsKKwlzcGluX3VubG9jaygmbHAtPmxvY2spOworCisJLyogYW5kIHRlbGwgdGhlIGNhcmQgdG8gc3RheSBhd2F5IGZyb20gdGhhdCBuYXN0eSBvdXRzaWRlIHdvcmxkICovCisJU01DX1NFTEVDVF9CQU5LKDApOworCVNNQ19TRVRfUkNSKFJDUl9DTEVBUik7CisJU01DX1NFVF9UQ1IoVENSX0NMRUFSKTsKKworI2lmZGVmIFBPV0VSX0RPV04KKwkvKiBmaW5hbGx5LCBzaHV0IHRoZSBjaGlwIGRvd24gKi8KKwlTTUNfU0VMRUNUX0JBTksoMSk7CisJU01DX1NFVF9DT05GSUcoU01DX0dFVF9DT05GSUcoKSAmIH5DT05GSUdfRVBIX1BPV0VSX0VOKTsKKyNlbmRpZgorfQorCisvKgorICogVGhpcyBpcyB0aGUgcHJvY2VkdXJlIHRvIGhhbmRsZSB0aGUgcmVjZWlwdCBvZiBhIHBhY2tldC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICBzbWNfcmN2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbHAtPmJhc2U7CisJdW5zaWduZWQgaW50IHBhY2tldF9udW1iZXIsIHN0YXR1cywgcGFja2V0X2xlbjsKKworCURCRygzLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisKKwlwYWNrZXRfbnVtYmVyID0gU01DX0dFVF9SWEZJRk8oKTsKKwlpZiAodW5saWtlbHkocGFja2V0X251bWJlciAmIFJYRklGT19SRU1QVFkpKSB7CisJCVBSSU5USygiJXM6IHNtY19yY3Ygd2l0aCBub3RoaW5nIG9uIEZJRk8uXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJLyogcmVhZCBmcm9tIHN0YXJ0IG9mIHBhY2tldCAqLworCVNNQ19TRVRfUFRSKFBUUl9SRUFEIHwgUFRSX1JDViB8IFBUUl9BVVRPSU5DKTsKKworCS8qIEZpcnN0IHR3byB3b3JkcyBhcmUgc3RhdHVzIGFuZCBwYWNrZXQgbGVuZ3RoICovCisJU01DX0dFVF9QS1RfSERSKHN0YXR1cywgcGFja2V0X2xlbik7CisJcGFja2V0X2xlbiAmPSAweDA3ZmY7ICAvKiBtYXNrIG9mZiB0b3AgYml0cyAqLworCURCRygyLCAiJXM6IFJYIFBOUiAweCV4IFNUQVRVUyAweCUwNHggTEVOR1RIIDB4JTA0eCAoJWQpXG4iLAorCQlkZXYtPm5hbWUsIHBhY2tldF9udW1iZXIsIHN0YXR1cywKKwkJcGFja2V0X2xlbiwgcGFja2V0X2xlbik7CisKKwliYWNrOgorCWlmICh1bmxpa2VseShwYWNrZXRfbGVuIDwgNiB8fCBzdGF0dXMgJiBSU19FUlJPUlMpKSB7CisJCWlmIChzdGF0dXMgJiBSU19UT09MT05HICYmIHBhY2tldF9sZW4gPD0gKDE1MTQgKyA0ICsgNikpIHsKKwkJCS8qIGFjY2VwdCBWTEFOIHBhY2tldHMgKi8KKwkJCXN0YXR1cyAmPSB+UlNfVE9PTE9ORzsKKwkJCWdvdG8gYmFjazsKKwkJfQorCQlpZiAocGFja2V0X2xlbiA8IDYpIHsKKwkJCS8qIGJsb29keSBoYXJkd2FyZSAqLworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZnViYXIgKHJ4bGVuICV1IHN0YXR1cyAleFxuIiwKKwkJCQkJZGV2LT5uYW1lLCBwYWNrZXRfbGVuLCBzdGF0dXMpOworCQkJc3RhdHVzIHw9IFJTX1RPT1NIT1JUOworCQl9CisJCVNNQ19XQUlUX01NVV9CVVNZKCk7CisJCVNNQ19TRVRfTU1VX0NNRChNQ19SRUxFQVNFKTsKKwkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgUlNfQUxHTkVSUikKKwkJCWxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIChSU19UT09TSE9SVCB8IFJTX1RPT0xPTkcpKQorCQkJbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIFJTX0JBRENSQykKKwkJCWxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJfSBlbHNlIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdW5zaWduZWQgY2hhciAqZGF0YTsKKwkJdW5zaWduZWQgaW50IGRhdGFfbGVuOworCisJCS8qIHNldCBtdWx0aWNhc3Qgc3RhdHMgKi8KKwkJaWYgKHN0YXR1cyAmIFJTX01VTFRJQ0FTVCkKKwkJCWxwLT5zdGF0cy5tdWx0aWNhc3QrKzsKKworCQkvKgorCQkgKiBBY3R1YWwgcGF5bG9hZCBpcyBwYWNrZXRfbGVuIC0gNiAob3IgNSBpZiBvZGQgYnl0ZSkuCisJCSAqIFdlIHdhbnQgc2tiX3Jlc2VydmUoMikgYW5kIHRoZSBmaW5hbCBjdHJsIHdvcmQKKwkJICogKDIgYnl0ZXMsIHBvc3NpYmx5IGNvbnRhaW5pbmcgdGhlIHBheWxvYWQgb2RkIGJ5dGUpLgorCQkgKiBGdXJ0aGVybW9yZSwgd2UgYWRkIDIgYnl0ZXMgdG8gYWxsb3cgcm91bmRpbmcgdXAgdG8KKwkJICogbXVsdGlwbGUgb2YgNCBieXRlcyBvbiAzMiBiaXQgYnVzZXMuCisJCSAqIEhlbmNlIHBhY2tldF9sZW4gLSA2ICsgMiArIDIgKyAyLgorCQkgKi8KKwkJc2tiID0gZGV2X2FsbG9jX3NrYihwYWNrZXRfbGVuKTsKKwkJaWYgKHVubGlrZWx5KHNrYiA9PSBOVUxMKSkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogTG93IG1lbW9yeSwgcGFja2V0IGRyb3BwZWQuXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCQlTTUNfV0FJVF9NTVVfQlVTWSgpOworCQkJU01DX1NFVF9NTVVfQ01EKE1DX1JFTEVBU0UpOworCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIEFsaWduIElQIGhlYWRlciB0byAzMiBiaXRzICovCisJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisKKwkJLyogQlVHOiB0aGUgTEFOOTFDMTExIHJldiBBIG5ldmVyIHNldHMgdGhpcyBiaXQuIEZvcmNlIGl0LiAqLworCQlpZiAobHAtPnZlcnNpb24gPT0gMHg5MCkKKwkJCXN0YXR1cyB8PSBSU19PRERGUkFNRTsKKworCQkvKgorCQkgKiBJZiBvZGQgbGVuZ3RoOiBwYWNrZXRfbGVuIC0gNSwKKwkJICogb3RoZXJ3aXNlIHBhY2tldF9sZW4gLSA2LgorCQkgKiBXaXRoIHRoZSB0cmFpbGluZyBjdHJsIGJ5dGUgaXQncyBwYWNrZXRfbGVuIC0gNC4KKwkJICovCisJCWRhdGFfbGVuID0gcGFja2V0X2xlbiAtICgoc3RhdHVzICYgUlNfT0RERlJBTUUpID8gNSA6IDYpOworCQlkYXRhID0gc2tiX3B1dChza2IsIGRhdGFfbGVuKTsKKwkJU01DX1BVTExfREFUQShkYXRhLCBwYWNrZXRfbGVuIC0gNCk7CisKKwkJU01DX1dBSVRfTU1VX0JVU1koKTsKKwkJU01DX1NFVF9NTVVfQ01EKE1DX1JFTEVBU0UpOworCisJCVBSSU5UX1BLVChkYXRhLCBwYWNrZXRfbGVuIC0gNCk7CisKKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCW5ldGlmX3J4KHNrYik7CisJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBkYXRhX2xlbjsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfU01QCisvKgorICogT24gU01QIHdlIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9ibGVtOgorICoKKyAqIAlBID0gc21jX2hhcmR3YXJlX3NlbmRfcGt0KCkKKyAqIAlCID0gc21jX2hhcmRfc3RhcnRfeG1pdCgpCisgKiAJQyA9IHNtY19pbnRlcnJ1cHQoKQorICoKKyAqIEEgYW5kIEIgY2FuIG5ldmVyIGJlIGV4ZWN1dGVkIHNpbXVsdGFuZW91c2x5LiAgSG93ZXZlciwgYXQgbGVhc3Qgb24gVVAsCisgKiBpdCBpcyBwb3NzaWJsZSAoYW5kIGV2ZW4gZGVzaXJhYmxlKSBmb3IgQyB0byBpbnRlcnJ1cHQgZXhlY3V0aW9uIG9mCisgKiBBIG9yIEIgaW4gb3JkZXIgdG8gaGF2ZSBiZXR0ZXIgUlggcmVsaWFiaWxpdHkgYW5kIGF2b2lkIG92ZXJydW5zLgorICogQywganVzdCBsaWtlIEEgYW5kIEIsIG11c3QgaGF2ZSBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBjaGlwIGFuZAorICogZWFjaCBvZiB0aGVtIG11c3QgbG9jayBhZ2FpbnN0IGFueSBvdGhlciBjb25jdXJyZW50IGFjY2Vzcy4KKyAqIFVuZm9ydHVuYXRlbHkgdGhpcyBpcyBub3QgcG9zc2libGUgdG8gaGF2ZSBDIHN1c3BlbmQgZXhlY3V0aW9uIG9mIEEgb3IKKyAqIEIgdGFraW5nIHBsYWNlIG9uIGFub3RoZXIgQ1BVLiBPbiBVUCB0aGlzIGlzIG5vIGFuIGlzc3VlIHNpbmNlIEEgYW5kIEIKKyAqIGFyZSBydW4gZnJvbSBzb2Z0aXJxIGNvbnRleHQgYW5kIEMgZnJvbSBoYXJkIElSUSBjb250ZXh0LCBhbmQgdGhlcmUgaXMKKyAqIG5vIG90aGVyIENQVSB3aGVyZSBjb25jdXJyZW50IGFjY2VzcyBjYW4gaGFwcGVuLgorICogSWYgZXZlciB0aGVyZSBpcyBhIHdheSB0byBmb3JjZSBhdCBsZWFzdCBCIGFuZCBDIHRvIGFsd2F5cyBiZSBleGVjdXRlZAorICogb24gdGhlIHNhbWUgQ1BVIHRoZW4gd2UgY291bGQgdXNlIHJlYWQvd3JpdGUgbG9ja3MgdG8gcHJvdGVjdCBhZ2FpbnN0CisgKiBhbnkgb3RoZXIgY29uY3VycmVudCBhY2Nlc3MgYW5kIEMgd291bGQgYWx3YXlzIGludGVycnVwdCBCLiBCdXQgbGlmZQorICogaXNuJ3QgdGhhdCBlYXN5IGluIGEgU01QIHdvcmxkLi4uCisgKi8KKyNkZWZpbmUgc21jX3NwZWNpYWxfdHJ5bG9jayhsb2NrKQkJCQkJXAorKHsJCQkJCQkJCQlcCisJaW50IF9fcmV0OwkJCQkJCQlcCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsJCQkJCQlcCisJX19yZXQgPSBzcGluX3RyeWxvY2sobG9jayk7CQkJCQlcCisJaWYgKCFfX3JldCkJCQkJCQkJXAorCQlsb2NhbF9pcnFfZW5hYmxlKCk7CQkJCQlcCisJX19yZXQ7CQkJCQkJCQlcCit9KQorI2RlZmluZSBzbWNfc3BlY2lhbF9sb2NrKGxvY2spCQlzcGluX2xvY2tfaXJxKGxvY2spCisjZGVmaW5lIHNtY19zcGVjaWFsX3VubG9jayhsb2NrKQlzcGluX3VubG9ja19pcnEobG9jaykKKyNlbHNlCisjZGVmaW5lIHNtY19zcGVjaWFsX3RyeWxvY2sobG9jaykJKDEpCisjZGVmaW5lIHNtY19zcGVjaWFsX2xvY2sobG9jaykJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc21jX3NwZWNpYWxfdW5sb2NrKGxvY2spCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gYWN0dWFsbHkgc2VuZCBhIHBhY2tldCB0byB0aGUgY2hpcC4KKyAqLworc3RhdGljIHZvaWQgc21jX2hhcmR3YXJlX3NlbmRfcGt0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+YmFzZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGludCBwYWNrZXRfbm8sIGxlbjsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisKKwlEQkcoMywgIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCisJaWYgKCFzbWNfc3BlY2lhbF90cnlsb2NrKCZscC0+bG9jaykpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQl0YXNrbGV0X3NjaGVkdWxlKCZscC0+dHhfdGFzayk7CisJCXJldHVybjsKKwl9CisKKwlza2IgPSBscC0+cGVuZGluZ190eF9za2I7CisJbHAtPnBlbmRpbmdfdHhfc2tiID0gTlVMTDsKKwlwYWNrZXRfbm8gPSBTTUNfR0VUX0FSKCk7CisJaWYgKHVubGlrZWx5KHBhY2tldF9ubyAmIEFSX0ZBSUxFRCkpIHsKKwkJcHJpbnRrKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQlscC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJc21jX3NwZWNpYWxfdW5sb2NrKCZscC0+bG9jayk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBwb2ludCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQgKi8KKwlTTUNfU0VUX1BOKHBhY2tldF9ubyk7CisJU01DX1NFVF9QVFIoUFRSX0FVVE9JTkMpOworCisJYnVmID0gc2tiLT5kYXRhOworCWxlbiA9IHNrYi0+bGVuOworCURCRygyLCAiJXM6IFRYIFBOUiAweCV4IExFTkdUSCAweCUwNHggKCVkKSBCVUYgMHglcFxuIiwKKwkJZGV2LT5uYW1lLCBwYWNrZXRfbm8sIGxlbiwgbGVuLCBidWYpOworCVBSSU5UX1BLVChidWYsIGxlbik7CisKKwkvKgorCSAqIFNlbmQgdGhlIHBhY2tldCBsZW5ndGggKCs2IGZvciBzdGF0dXMgd29yZHMsIGxlbmd0aCwgYW5kIGN0bC4KKwkgKiBUaGUgY2FyZCB3aWxsIHBhZCB0byA2NCBieXRlcyB3aXRoIHplcm9lcyBpZiBwYWNrZXQgaXMgdG9vIHNtYWxsLgorCSAqLworCVNNQ19QVVRfUEtUX0hEUigwLCBsZW4gKyA2KTsKKworCS8qIHNlbmQgdGhlIGFjdHVhbCBkYXRhICovCisJU01DX1BVU0hfREFUQShidWYsIGxlbiAmIH4xKTsKKworCS8qIFNlbmQgZmluYWwgY3RsIHdvcmQgd2l0aCB0aGUgbGFzdCBieXRlIGlmIHRoZXJlIGlzIG9uZSAqLworCVNNQ19vdXR3KCgobGVuICYgMSkgPyAoMHgyMDAwIHwgYnVmW2xlbi0xXSkgOiAwKSwgaW9hZGRyLCBEQVRBX1JFRyk7CisKKwkvKgorCSAqIElmIFRIUk9UVExFX1RYX1BLVFMgaXMgc2V0LCB3ZSBsb29rIGF0IHRoZSBUWF9FTVBUWSBmbGFnCisJICogYmVmb3JlIHF1ZXVlaW5nIHRoaXMgcGFja2V0IGZvciBUWCwgYW5kIGlmIGl0J3MgY2xlYXIgdGhlbgorCSAqIHdlIHN0b3AgdGhlIHF1ZXVlIGhlcmUuICBUaGlzIHdpbGwgaGF2ZSB0aGUgZWZmZWN0IG9mCisJICogaGF2aW5nIGF0IG1vc3QgMiBwYWNrZXRzIHF1ZXVlZCBmb3IgVFggaW4gdGhlIGNoaXAncyBtZW1vcnkKKwkgKiBhdCBhbGwgdGltZS4gSWYgVEhST1RUTEVfVFhfUEtUUyBpcyBub3Qgc2V0IHRoZW4gdGhlIHF1ZXVlCisJICogaXMgc3RvcHBlZCBvbmx5IHdoZW4gbWVtb3J5IGFsbG9jYXRpb24gKE1DX0FMTE9DKSBkb2VzIG5vdAorCSAqIHN1Y2NlZWQgcmlnaHQgYXdheS4KKwkgKi8KKwlpZiAoVEhST1RUTEVfVFhfUEtUUyAmJiAhKFNNQ19HRVRfSU5UKCkgJiBJTV9UWF9FTVBUWV9JTlQpKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBxdWV1ZSB0aGUgcGFja2V0IGZvciBUWCAqLworCVNNQ19TRVRfTU1VX0NNRChNQ19FTlFVRVVFKTsKKwlTTUNfQUNLX0lOVChJTV9UWF9FTVBUWV9JTlQpOworCXNtY19zcGVjaWFsX3VubG9jaygmbHAtPmxvY2spOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlscC0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuOworCisJU01DX0VOQUJMRV9JTlQoSU1fVFhfSU5UIHwgSU1fVFhfRU1QVFlfSU5UKTsKKworZG9uZToJaWYgKCFUSFJPVFRMRV9UWF9QS1RTKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qCisgKiBTaW5jZSBJIGFtIG5vdCBzdXJlIGlmIEkgd2lsbCBoYXZlIGVub3VnaCByb29tIGluIHRoZSBjaGlwJ3MgcmFtCisgKiB0byBzdG9yZSB0aGUgcGFja2V0LCBJIGNhbGwgdGhpcyByb3V0aW5lIHdoaWNoIGVpdGhlciBzZW5kcyBpdAorICogbm93LCBvciBzZXQgdGhlIGNhcmQgdG8gZ2VuZXJhdGVzIGFuIGludGVycnVwdCB3aGVuIHJlYWR5CisgKiBmb3IgdGhlIHBhY2tldC4KKyAqLworc3RhdGljIGludCBzbWNfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbHAtPmJhc2U7CisJdW5zaWduZWQgaW50IG51bVBhZ2VzLCBwb2xsX2NvdW50LCBzdGF0dXM7CisKKwlEQkcoMywgIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCisJQlVHX09OKGxwLT5wZW5kaW5nX3R4X3NrYiAhPSBOVUxMKTsKKwlscC0+cGVuZGluZ190eF9za2IgPSBza2I7CisKKwkvKgorCSAqIFRoZSBNTVUgd2FudHMgdGhlIG51bWJlciBvZiBwYWdlcyB0byBiZSB0aGUgbnVtYmVyIG9mIDI1NiBieXRlcworCSAqICdwYWdlcycsIG1pbnVzIDEgKHNpbmNlIGEgcGFja2V0IGNhbid0IGV2ZXIgaGF2ZSAwIHBhZ2VzIDopKQorCSAqCisJICogVGhlIDkxQzExMSBpZ25vcmVzIHRoZSBzaXplIGJpdHMsIGJ1dCBlYXJsaWVyIG1vZGVscyBkb24ndC4KKwkgKgorCSAqIFBrdCBzaXplIGZvciBhbGxvY2F0aW5nIGlzIGRhdGEgbGVuZ3RoICs2IChmb3IgYWRkaXRpb25hbCBzdGF0dXMKKwkgKiB3b3JkcywgbGVuZ3RoIGFuZCBjdGwpCisJICoKKwkgKiBJZiBvZGQgc2l6ZSB0aGVuIGxhc3QgYnl0ZSBpcyBpbmNsdWRlZCBpbiBjdGwgd29yZC4KKwkgKi8KKwludW1QYWdlcyA9ICgoc2tiLT5sZW4gJiB+MSkgKyAoNiAtIDEpKSA+PiA4OworCWlmICh1bmxpa2VseShudW1QYWdlcyA+IDcpKSB7CisJCXByaW50aygiJXM6IEZhciB0b28gYmlnIHBhY2tldCBlcnJvci5cbiIsIGRldi0+bmFtZSk7CisJCWxwLT5wZW5kaW5nX3R4X3NrYiA9IE5VTEw7CisJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJbHAtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzbWNfc3BlY2lhbF9sb2NrKCZscC0+bG9jayk7CisKKwkvKiBub3csIHRyeSB0byBhbGxvY2F0ZSB0aGUgbWVtb3J5ICovCisJU01DX1NFVF9NTVVfQ01EKE1DX0FMTE9DIHwgbnVtUGFnZXMpOworCisJLyoKKwkgKiBQb2xsIHRoZSBjaGlwIGZvciBhIHNob3J0IGFtb3VudCBvZiB0aW1lIGluIGNhc2UgdGhlCisJICogYWxsb2NhdGlvbiBzdWNjZWVkcyBxdWlja2x5LgorCSAqLworCXBvbGxfY291bnQgPSBNRU1PUllfV0FJVF9USU1FOworCWRvIHsKKwkJc3RhdHVzID0gU01DX0dFVF9JTlQoKTsKKwkJaWYgKHN0YXR1cyAmIElNX0FMTE9DX0lOVCkgeworCQkJU01DX0FDS19JTlQoSU1fQUxMT0NfSU5UKTsKKyAgCQkJYnJlYWs7CisJCX0KKyAgIAl9IHdoaWxlICgtLXBvbGxfY291bnQpOworCisJc21jX3NwZWNpYWxfdW5sb2NrKCZscC0+bG9jayk7CisKKyAgIAlpZiAoIXBvbGxfY291bnQpIHsKKwkJLyogb2ggd2VsbCwgd2FpdCB1bnRpbCB0aGUgY2hpcCBmaW5kcyBtZW1vcnkgbGF0ZXIgKi8KKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlEQkcoMiwgIiVzOiBUWCBtZW1vcnkgYWxsb2NhdGlvbiBkZWZlcnJlZC5cbiIsIGRldi0+bmFtZSk7CisJCVNNQ19FTkFCTEVfSU5UKElNX0FMTE9DX0lOVCk7CisgICAJfSBlbHNlIHsKKwkJLyoKKwkJICogQWxsb2NhdGlvbiBzdWNjZWVkZWQ6IHB1c2ggcGFja2V0IHRvIHRoZSBjaGlwJ3Mgb3duIG1lbW9yeQorCQkgKiBpbW1lZGlhdGVseS4KKwkJICovICAKKwkJc21jX2hhcmR3YXJlX3NlbmRfcGt0KCh1bnNpZ25lZCBsb25nKWRldik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGhhbmRsZXMgYSBUWCBpbnRlcnJ1cHQsIHdoaWNoIGlzIG9ubHkgY2FsbGVkIHdoZW46CisgKiAtIGEgVFggZXJyb3Igb2NjdXJyZWQsIG9yCisgKiAtIENUTF9BVVRPX1JFTEVBU0UgaXMgbm90IHNldCBhbmQgVFggb2YgYSBwYWNrZXQgY29tcGxldGVkLgorICovCitzdGF0aWMgdm9pZCBzbWNfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+YmFzZTsKKwl1bnNpZ25lZCBpbnQgc2F2ZWRfcGFja2V0LCBwYWNrZXRfbm8sIHR4X3N0YXR1cywgcGt0X2xlbjsKKworCURCRygzLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBJZiB0aGUgVFggRklGTyBpcyBlbXB0eSB0aGVuIG5vdGhpbmcgdG8gZG8gKi8KKwlwYWNrZXRfbm8gPSBTTUNfR0VUX1RYRklGTygpOworCWlmICh1bmxpa2VseShwYWNrZXRfbm8gJiBUWEZJRk9fVEVNUFRZKSkgeworCQlQUklOVEsoIiVzOiBzbWNfdHggd2l0aCBub3RoaW5nIG9uIEZJRk8uXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJLyogc2VsZWN0IHBhY2tldCB0byByZWFkIGZyb20gKi8KKwlzYXZlZF9wYWNrZXQgPSBTTUNfR0VUX1BOKCk7CisJU01DX1NFVF9QTihwYWNrZXRfbm8pOworCisJLyogcmVhZCB0aGUgZmlyc3Qgd29yZCAoc3RhdHVzIHdvcmQpIGZyb20gdGhpcyBwYWNrZXQgKi8KKwlTTUNfU0VUX1BUUihQVFJfQVVUT0lOQyB8IFBUUl9SRUFEKTsKKwlTTUNfR0VUX1BLVF9IRFIodHhfc3RhdHVzLCBwa3RfbGVuKTsKKwlEQkcoMiwgIiVzOiBUWCBTVEFUVVMgMHglMDR4IFBOUiAweCUwMnhcbiIsCisJCWRldi0+bmFtZSwgdHhfc3RhdHVzLCBwYWNrZXRfbm8pOworCisJaWYgKCEodHhfc3RhdHVzICYgVFNfU1VDQ0VTUykpCisJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwlpZiAodHhfc3RhdHVzICYgVFNfTE9TVENBUikKKwkJbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisKKwlpZiAodHhfc3RhdHVzICYgVFNfTEFUQ09MKSB7CisJCVBSSU5USygiJXM6IGxhdGUgY29sbGlzaW9uIG9jY3VycmVkIG9uIGxhc3QgeG1pdFxuIiwgZGV2LT5uYW1lKTsKKwkJbHAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJaWYgKCEobHAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMgJiA2MykgJiYgbmV0X3JhdGVsaW1pdCgpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogdW5leHBlY3RlZGx5IGxhcmdlIG51bWJlcnMgb2YgIgorCQkJICAgICAgICJsYXRlIGNvbGxpc2lvbnMuIFBsZWFzZSBjaGVjayBkdXBsZXggIgorCQkJICAgICAgICJzZXR0aW5nLlxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCX0KKworCS8qIGtpbGwgdGhlIHBhY2tldCAqLworCVNNQ19XQUlUX01NVV9CVVNZKCk7CisJU01DX1NFVF9NTVVfQ01EKE1DX0ZSRUVQS1QpOworCisJLyogRG9uJ3QgcmVzdG9yZSBQYWNrZXQgTnVtYmVyIFJlZyB1bnRpbCBidXN5IGJpdCBpcyBjbGVhcmVkICovCisJU01DX1dBSVRfTU1VX0JVU1koKTsKKwlTTUNfU0VUX1BOKHNhdmVkX3BhY2tldCk7CisKKwkvKiByZS1lbmFibGUgdHJhbnNtaXQgKi8KKwlTTUNfU0VMRUNUX0JBTksoMCk7CisJU01DX1NFVF9UQ1IobHAtPnRjcl9jdXJfbW9kZSk7CisJU01DX1NFTEVDVF9CQU5LKDIpOworfQorCisKKy8qLS0tUEhZIENPTlRST0wgQU5EIENPTkZJR1VSQVRJT04tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHNtY19taWlfb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCB2YWwsIGludCBiaXRzKQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5iYXNlOworCXVuc2lnbmVkIGludCBtaWlfcmVnLCBtYXNrOworCisJbWlpX3JlZyA9IFNNQ19HRVRfTUlJKCkgJiB+KE1JSV9NQ0xLIHwgTUlJX01ET0UgfCBNSUlfTURPKTsKKwltaWlfcmVnIHw9IE1JSV9NRE9FOworCisJZm9yIChtYXNrID0gMSA8PCAoYml0cyAtIDEpOyBtYXNrOyBtYXNrID4+PSAxKSB7CisJCWlmICh2YWwgJiBtYXNrKQorCQkJbWlpX3JlZyB8PSBNSUlfTURPOworCQllbHNlCisJCQltaWlfcmVnICY9IH5NSUlfTURPOworCisJCVNNQ19TRVRfTUlJKG1paV9yZWcpOworCQl1ZGVsYXkoTUlJX0RFTEFZKTsKKwkJU01DX1NFVF9NSUkobWlpX3JlZyB8IE1JSV9NQ0xLKTsKKwkJdWRlbGF5KE1JSV9ERUxBWSk7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNtY19taWlfaW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGJpdHMpCit7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbHAtPmJhc2U7CisJdW5zaWduZWQgaW50IG1paV9yZWcsIG1hc2ssIHZhbDsKKworCW1paV9yZWcgPSBTTUNfR0VUX01JSSgpICYgfihNSUlfTUNMSyB8IE1JSV9NRE9FIHwgTUlJX01ETyk7CisJU01DX1NFVF9NSUkobWlpX3JlZyk7CisKKwlmb3IgKG1hc2sgPSAxIDw8IChiaXRzIC0gMSksIHZhbCA9IDA7IG1hc2s7IG1hc2sgPj49IDEpIHsKKwkJaWYgKFNNQ19HRVRfTUlJKCkgJiBNSUlfTURJKQorCQkJdmFsIHw9IG1hc2s7CisKKwkJU01DX1NFVF9NSUkobWlpX3JlZyk7CisJCXVkZWxheShNSUlfREVMQVkpOworCQlTTUNfU0VUX01JSShtaWlfcmVnIHwgTUlJX01DTEspOworCQl1ZGVsYXkoTUlJX0RFTEFZKTsKKwl9CisKKwlyZXR1cm4gdmFsOworfQorCisvKgorICogUmVhZHMgYSByZWdpc3RlciBmcm9tIHRoZSBNSUkgTWFuYWdlbWVudCBzZXJpYWwgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyBpbnQgc21jX3BoeV9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlhZGRyLCBpbnQgcGh5cmVnKQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5iYXNlOworCXVuc2lnbmVkIGludCBwaHlkYXRhOworCisJU01DX1NFTEVDVF9CQU5LKDMpOworCisJLyogSWRsZSAtIDMyIG9uZXMgKi8KKwlzbWNfbWlpX291dChkZXYsIDB4ZmZmZmZmZmYsIDMyKTsKKworCS8qIFN0YXJ0IGNvZGUgKDAxKSArIHJlYWQgKDEwKSArIHBoeWFkZHIgKyBwaHlyZWcgKi8KKwlzbWNfbWlpX291dChkZXYsIDYgPDwgMTAgfCBwaHlhZGRyIDw8IDUgfCBwaHlyZWcsIDE0KTsKKworCS8qIFR1cm5hcm91bmQgKDJiaXRzKSArIHBoeWRhdGEgKi8KKwlwaHlkYXRhID0gc21jX21paV9pbihkZXYsIDE4KTsKKworCS8qIFJldHVybiB0byBpZGxlIHN0YXRlICovCisJU01DX1NFVF9NSUkoU01DX0dFVF9NSUkoKSAmIH4oTUlJX01DTEt8TUlJX01ET0V8TUlJX01ETykpOworCisJREJHKDMsICIlczogcGh5YWRkcj0weCV4LCBwaHlyZWc9MHgleCwgcGh5ZGF0YT0weCV4XG4iLAorCQlfX0ZVTkNUSU9OX18sIHBoeWFkZHIsIHBoeXJlZywgcGh5ZGF0YSk7CisKKwlTTUNfU0VMRUNUX0JBTksoMik7CisJcmV0dXJuIHBoeWRhdGE7Cit9CisKKy8qCisgKiBXcml0ZXMgYSByZWdpc3RlciB0byB0aGUgTUlJIE1hbmFnZW1lbnQgc2VyaWFsIGludGVyZmFjZQorICovCitzdGF0aWMgdm9pZCBzbWNfcGh5X3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlhZGRyLCBpbnQgcGh5cmVnLAorCQkJICBpbnQgcGh5ZGF0YSkKK3sKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+YmFzZTsKKworCVNNQ19TRUxFQ1RfQkFOSygzKTsKKworCS8qIElkbGUgLSAzMiBvbmVzICovCisJc21jX21paV9vdXQoZGV2LCAweGZmZmZmZmZmLCAzMik7CisKKwkvKiBTdGFydCBjb2RlICgwMSkgKyB3cml0ZSAoMDEpICsgcGh5YWRkciArIHBoeXJlZyArIHR1cm5hcm91bmQgKyBwaHlkYXRhICovCisJc21jX21paV9vdXQoZGV2LCA1IDw8IDI4IHwgcGh5YWRkciA8PCAyMyB8IHBoeXJlZyA8PCAxOCB8IDIgPDwgMTYgfCBwaHlkYXRhLCAzMik7CisKKwkvKiBSZXR1cm4gdG8gaWRsZSBzdGF0ZSAqLworCVNNQ19TRVRfTUlJKFNNQ19HRVRfTUlJKCkgJiB+KE1JSV9NQ0xLfE1JSV9NRE9FfE1JSV9NRE8pKTsKKworCURCRygzLCAiJXM6IHBoeWFkZHI9MHgleCwgcGh5cmVnPTB4JXgsIHBoeWRhdGE9MHgleFxuIiwKKwkJX19GVU5DVElPTl9fLCBwaHlhZGRyLCBwaHlyZWcsIHBoeWRhdGEpOworCisJU01DX1NFTEVDVF9CQU5LKDIpOworfQorCisvKgorICogRmluZHMgYW5kIHJlcG9ydHMgdGhlIFBIWSBhZGRyZXNzCisgKi8KK3N0YXRpYyB2b2lkIHNtY19waHlfZGV0ZWN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBwaHlhZGRyOworCisJREJHKDIsICIlczogJXNcbiIsIGRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKworCWxwLT5waHlfdHlwZSA9IDA7CisKKwkvKgorCSAqIFNjYW4gYWxsIDMyIFBIWSBhZGRyZXNzZXMgaWYgbmVjZXNzYXJ5LCBzdGFydGluZyBhdAorCSAqIFBIWSMxIHRvIFBIWSMzMSwgYW5kIHRoZW4gUEhZIzAgbGFzdC4KKwkgKi8KKwlmb3IgKHBoeWFkZHIgPSAxOyBwaHlhZGRyIDwgMzM7ICsrcGh5YWRkcikgeworCQl1bnNpZ25lZCBpbnQgaWQxLCBpZDI7CisKKwkJLyogUmVhZCB0aGUgUEhZIGlkZW50aWZpZXJzICovCisJCWlkMSA9IHNtY19waHlfcmVhZChkZXYsIHBoeWFkZHIgJiAzMSwgTUlJX1BIWVNJRDEpOworCQlpZDIgPSBzbWNfcGh5X3JlYWQoZGV2LCBwaHlhZGRyICYgMzEsIE1JSV9QSFlTSUQyKTsKKworCQlEQkcoMywgIiVzOiBwaHlfaWQxPTB4JXgsIHBoeV9pZDI9MHgleFxuIiwKKwkJCWRldi0+bmFtZSwgaWQxLCBpZDIpOworCisJCS8qIE1ha2Ugc3VyZSBpdCBpcyBhIHZhbGlkIGlkZW50aWZpZXIgKi8KKwkJaWYgKGlkMSAhPSAweDAwMDAgJiYgaWQxICE9IDB4ZmZmZiAmJiBpZDEgIT0gMHg4MDAwICYmCisJCSAgICBpZDIgIT0gMHgwMDAwICYmIGlkMiAhPSAweGZmZmYgJiYgaWQyICE9IDB4ODAwMCkgeworCQkJLyogU2F2ZSB0aGUgUEhZJ3MgYWRkcmVzcyAqLworCQkJbHAtPm1paS5waHlfaWQgPSBwaHlhZGRyICYgMzE7CisJCQlscC0+cGh5X3R5cGUgPSBpZDEgPDwgMTYgfCBpZDI7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoKKyAqIFNldHMgdGhlIFBIWSB0byBhIGNvbmZpZ3VyYXRpb24gYXMgZGV0ZXJtaW5lZCBieSB0aGUgdXNlcgorICovCitzdGF0aWMgaW50IHNtY19waHlfZml4ZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+YmFzZTsKKwlpbnQgcGh5YWRkciA9IGxwLT5taWkucGh5X2lkOworCWludCBibWNyLCBjZmcxOworCisJREJHKDMsICIlczogJXNcbiIsIGRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKworCS8qIEVudGVyIExpbmsgRGlzYWJsZSBzdGF0ZSAqLworCWNmZzEgPSBzbWNfcGh5X3JlYWQoZGV2LCBwaHlhZGRyLCBQSFlfQ0ZHMV9SRUcpOworCWNmZzEgfD0gUEhZX0NGRzFfTE5LRElTOworCXNtY19waHlfd3JpdGUoZGV2LCBwaHlhZGRyLCBQSFlfQ0ZHMV9SRUcsIGNmZzEpOworCisJLyoKKwkgKiBTZXQgb3VyIGZpeGVkIGNhcGFiaWxpdGllcworCSAqIERpc2FibGUgYXV0by1uZWdvdGlhdGlvbgorCSAqLworCWJtY3IgPSAwOworCisJaWYgKGxwLT5jdGxfcmZkdXBseCkKKwkJYm1jciB8PSBCTUNSX0ZVTExEUExYOworCisJaWYgKGxwLT5jdGxfcnNwZWVkID09IDEwMCkKKwkJYm1jciB8PSBCTUNSX1NQRUVEMTAwOworCisJLyogV3JpdGUgb3VyIGNhcGFiaWxpdGllcyB0byB0aGUgcGh5IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlzbWNfcGh5X3dyaXRlKGRldiwgcGh5YWRkciwgTUlJX0JNQ1IsIGJtY3IpOworCisJLyogUmUtQ29uZmlndXJlIHRoZSBSZWNlaXZlL1BoeSBDb250cm9sIHJlZ2lzdGVyICovCisJU01DX1NFTEVDVF9CQU5LKDApOworCVNNQ19TRVRfUlBDKGxwLT5ycGNfY3VyX21vZGUpOworCVNNQ19TRUxFQ1RfQkFOSygyKTsKKworCXJldHVybiAxOworfQorCisvKgorICogc21jX3BoeV9yZXNldCAtIHJlc2V0IHRoZSBwaHkKKyAqIEBkZXY6IG5ldCBkZXZpY2UKKyAqIEBwaHk6IHBoeSBhZGRyZXNzCisgKgorICogSXNzdWUgYSBzb2Z0d2FyZSByZXNldCBmb3IgdGhlIHNwZWNpZmllZCBQSFkgYW5kCisgKiB3YWl0IHVwIHRvIDEwMG1zIGZvciB0aGUgcmVzZXQgdG8gY29tcGxldGUuICBXZSBzaG91bGQKKyAqIG5vdCBhY2Nlc3MgdGhlIFBIWSBmb3IgNTBtcyBhZnRlciBpc3N1aW5nIHRoZSByZXNldC4KKyAqCisgKiBUaGUgdGltZSB0byB3YWl0IGFwcGVhcnMgdG8gYmUgZGVwZW5kZW50IG9uIHRoZSBQSFkuCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBscC0+bG9jayBsb2NrZWQuCisgKi8KK3N0YXRpYyBpbnQgc21jX3BoeV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5KQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgYm1jcjsKKwlpbnQgdGltZW91dDsKKworCXNtY19waHlfd3JpdGUoZGV2LCBwaHksIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKKworCWZvciAodGltZW91dCA9IDI7IHRpbWVvdXQ7IHRpbWVvdXQtLSkgeworCQlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKwkJbXNsZWVwKDUwKTsKKwkJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCisJCWJtY3IgPSBzbWNfcGh5X3JlYWQoZGV2LCBwaHksIE1JSV9CTUNSKTsKKwkJaWYgKCEoYm1jciAmIEJNQ1JfUkVTRVQpKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGJtY3IgJiBCTUNSX1JFU0VUOworfQorCisvKgorICogc21jX3BoeV9wb3dlcmRvd24gLSBwb3dlcmRvd24gcGh5CisgKiBAZGV2OiBuZXQgZGV2aWNlCisgKgorICogUG93ZXIgZG93biB0aGUgc3BlY2lmaWVkIFBIWQorICovCitzdGF0aWMgdm9pZCBzbWNfcGh5X3Bvd2VyZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgYm1jcjsKKwlpbnQgcGh5ID0gbHAtPm1paS5waHlfaWQ7CisKKwlpZiAobHAtPnBoeV90eXBlID09IDApCisJCXJldHVybjsKKworCS8qIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgbm8gY2FsbHMgdG8gc21jX3BoeV9jb25maWd1cmUgYXJlCisJICAgcGVuZGluZy4KKworCSAgIGZsdXNoX3NjaGVkdWxlZF93b3JrKCkgY2Fubm90IGJlIGNhbGxlZCBiZWNhdXNlIHdlIGFyZQorCSAgIHJ1bm5pbmcgd2l0aCB0aGUgbmV0bGluayBzZW1hcGhvcmUgaGVsZCAoZnJvbQorCSAgIGRldmluZXRfaW9jdGwoKSkgYW5kIHRoZSBwZW5kaW5nIHdvcmsgcXVldWUgY29udGFpbnMKKwkgICBsaW5rd2F0Y2hfZXZlbnQoKSAoc2NoZWR1bGVkIGJ5IG5ldGlmX2NhcnJpZXJfb2ZmKCkKKwkgICBhYm92ZSkuIGxpbmt3YXRjaF9ldmVudCgpIGFsc28gd2FudHMgdGhlIG5ldGxpbmsgc2VtYXBob3JlLgorCSovCisJd2hpbGUobHAtPndvcmtfcGVuZGluZykKKwkJc2NoZWR1bGUoKTsKKworCWJtY3IgPSBzbWNfcGh5X3JlYWQoZGV2LCBwaHksIE1JSV9CTUNSKTsKKwlzbWNfcGh5X3dyaXRlKGRldiwgcGh5LCBNSUlfQk1DUiwgYm1jciB8IEJNQ1JfUERPV04pOworfQorCisvKgorICogc21jX3BoeV9jaGVja19tZWRpYSAtIGNoZWNrIHRoZSBtZWRpYSBzdGF0dXMgYW5kIGFkanVzdCBUQ1IKKyAqIEBkZXY6IG5ldCBkZXZpY2UKKyAqIEBpbml0OiBzZXQgdHJ1ZSBmb3IgaW5pdGlhbGlzYXRpb24KKyAqCisgKiBTZWxlY3QgZHVwbGV4IG1vZGUgZGVwZW5kaW5nIG9uIG5lZ290aWF0aW9uIHN0YXRlLiAgVGhpcworICogYWxzbyB1cGRhdGVzIG91ciBjYXJyaWVyIHN0YXRlLgorICovCitzdGF0aWMgdm9pZCBzbWNfcGh5X2NoZWNrX21lZGlhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbml0KQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5iYXNlOworCisJaWYgKG1paV9jaGVja19tZWRpYSgmbHAtPm1paSwgbmV0aWZfbXNnX2xpbmsobHApLCBpbml0KSkgeworCQkvKiBkdXBsZXggc3RhdGUgaGFzIGNoYW5nZWQgKi8KKwkJaWYgKGxwLT5taWkuZnVsbF9kdXBsZXgpIHsKKwkJCWxwLT50Y3JfY3VyX21vZGUgfD0gVENSX1NXRkRVUDsKKwkJfSBlbHNlIHsKKwkJCWxwLT50Y3JfY3VyX21vZGUgJj0gflRDUl9TV0ZEVVA7CisJCX0KKworCQlTTUNfU0VMRUNUX0JBTksoMCk7CisJCVNNQ19TRVRfVENSKGxwLT50Y3JfY3VyX21vZGUpOworCX0KK30KKworLyoKKyAqIENvbmZpZ3VyZXMgdGhlIHNwZWNpZmllZCBQSFkgdGhyb3VnaCB0aGUgTUlJIG1hbmFnZW1lbnQgaW50ZXJmYWNlCisgKiB1c2luZyBBdXRvbmVnb3RpYXRpb24uCisgKiBDYWxscyBzbWNfcGh5X2ZpeGVkKCkgaWYgdGhlIHVzZXIgaGFzIHJlcXVlc3RlZCBhIGNlcnRhaW4gY29uZmlnLgorICogSWYgUlBDIEFORUcgYml0IGlzIHNldCwgdGhlIG1lZGlhIHNlbGVjdGlvbiBpcyBkZXBlbmRlbnQgcHVyZWx5IG9uCisgKiB0aGUgc2VsZWN0aW9uIGJ5IHRoZSBNSUkgKGVpdGhlciBpbiB0aGUgTUlJIEJNQ1IgcmVnIG9yIHRoZSByZXN1bHQKKyAqIG9mIGF1dG9uZWdvdGlhdGlvbi4pICBJZiB0aGUgUlBDIEFORUcgYml0IGlzIGNsZWFyZWQsIHRoZSBzZWxlY3Rpb24KKyAqIGlzIGNvbnRyb2xsZWQgYnkgdGhlIFJQQyBTUEVFRCBhbmQgUlBDIERQTFggYml0cy4KKyAqLworc3RhdGljIHZvaWQgc21jX3BoeV9jb25maWd1cmUodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+YmFzZTsKKwlpbnQgcGh5YWRkciA9IGxwLT5taWkucGh5X2lkOworCWludCBteV9waHlfY2FwczsgLyogTXkgUEhZIGNhcGFiaWxpdGllcyAqLworCWludCBteV9hZF9jYXBzOyAvKiBNeSBBZHZlcnRpc2VkIGNhcGFiaWxpdGllcyAqLworCWludCBzdGF0dXM7CisKKwlEQkcoMywgIiVzOnNtY19wcm9ncmFtX3BoeSgpXG4iLCBkZXYtPm5hbWUpOworCisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCisJLyoKKwkgKiBXZSBzaG91bGQgbm90IGJlIGNhbGxlZCBpZiBwaHlfdHlwZSBpcyB6ZXJvLgorCSAqLworCWlmIChscC0+cGh5X3R5cGUgPT0gMCkKKwkJZ290byBzbWNfcGh5X2NvbmZpZ3VyZV9leGl0OworCisJaWYgKHNtY19waHlfcmVzZXQoZGV2LCBwaHlhZGRyKSkgeworCQlwcmludGsoIiVzOiBQSFkgcmVzZXQgdGltZWQgb3V0XG4iLCBkZXYtPm5hbWUpOworCQlnb3RvIHNtY19waHlfY29uZmlndXJlX2V4aXQ7CisJfQorCisJLyoKKwkgKiBFbmFibGUgUEhZIEludGVycnVwdHMgKGZvciByZWdpc3RlciAxOCkKKwkgKiBJbnRlcnJ1cHRzIGxpc3RlZCBoZXJlIGFyZSBkaXNhYmxlZAorCSAqLworCXNtY19waHlfd3JpdGUoZGV2LCBwaHlhZGRyLCBQSFlfTUFTS19SRUcsCisJCVBIWV9JTlRfTE9TU1NZTkMgfCBQSFlfSU5UX0NXUkQgfCBQSFlfSU5UX1NTRCB8CisJCVBIWV9JTlRfRVNEIHwgUEhZX0lOVF9SUE9MIHwgUEhZX0lOVF9KQUIgfAorCQlQSFlfSU5UX1NQRERFVCB8IFBIWV9JTlRfRFBMWERFVCk7CisKKwkvKiBDb25maWd1cmUgdGhlIFJlY2VpdmUvUGh5IENvbnRyb2wgcmVnaXN0ZXIgKi8KKwlTTUNfU0VMRUNUX0JBTksoMCk7CisJU01DX1NFVF9SUEMobHAtPnJwY19jdXJfbW9kZSk7CisKKwkvKiBJZiB0aGUgdXNlciByZXF1ZXN0ZWQgbm8gYXV0byBuZWcsIHRoZW4gZ28gc2V0IGhpcyByZXF1ZXN0ICovCisJaWYgKGxwLT5taWkuZm9yY2VfbWVkaWEpIHsKKwkJc21jX3BoeV9maXhlZChkZXYpOworCQlnb3RvIHNtY19waHlfY29uZmlndXJlX2V4aXQ7CisJfQorCisJLyogQ29weSBvdXIgY2FwYWJpbGl0aWVzIGZyb20gTUlJX0JNU1IgdG8gTUlJX0FEVkVSVElTRSAqLworCW15X3BoeV9jYXBzID0gc21jX3BoeV9yZWFkKGRldiwgcGh5YWRkciwgTUlJX0JNU1IpOworCisJaWYgKCEobXlfcGh5X2NhcHMgJiBCTVNSX0FORUdDQVBBQkxFKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJBdXRvIG5lZ290aWF0aW9uIE5PVCBzdXBwb3J0ZWRcbiIpOworCQlzbWNfcGh5X2ZpeGVkKGRldik7CisJCWdvdG8gc21jX3BoeV9jb25maWd1cmVfZXhpdDsKKwl9CisKKwlteV9hZF9jYXBzID0gQURWRVJUSVNFX0NTTUE7IC8qIEkgYW0gQ1NNQSBjYXBhYmxlICovCisKKwlpZiAobXlfcGh5X2NhcHMgJiBCTVNSXzEwMEJBU0U0KQorCQlteV9hZF9jYXBzIHw9IEFEVkVSVElTRV8xMDBCQVNFNDsKKwlpZiAobXlfcGh5X2NhcHMgJiBCTVNSXzEwMEZVTEwpCisJCW15X2FkX2NhcHMgfD0gQURWRVJUSVNFXzEwMEZVTEw7CisJaWYgKG15X3BoeV9jYXBzICYgQk1TUl8xMDBIQUxGKQorCQlteV9hZF9jYXBzIHw9IEFEVkVSVElTRV8xMDBIQUxGOworCWlmIChteV9waHlfY2FwcyAmIEJNU1JfMTBGVUxMKQorCQlteV9hZF9jYXBzIHw9IEFEVkVSVElTRV8xMEZVTEw7CisJaWYgKG15X3BoeV9jYXBzICYgQk1TUl8xMEhBTEYpCisJCW15X2FkX2NhcHMgfD0gQURWRVJUSVNFXzEwSEFMRjsKKworCS8qIERpc2FibGUgY2FwYWJpbGl0aWVzIG5vdCBzZWxlY3RlZCBieSBvdXIgdXNlciAqLworCWlmIChscC0+Y3RsX3JzcGVlZCAhPSAxMDApCisJCW15X2FkX2NhcHMgJj0gfihBRFZFUlRJU0VfMTAwQkFTRTR8QURWRVJUSVNFXzEwMEZVTEx8QURWRVJUSVNFXzEwMEhBTEYpOworCisJaWYgKCFscC0+Y3RsX3JmZHVwbHgpCisJCW15X2FkX2NhcHMgJj0gfihBRFZFUlRJU0VfMTAwRlVMTHxBRFZFUlRJU0VfMTBGVUxMKTsKKworCS8qIFVwZGF0ZSBvdXIgQXV0by1OZWcgQWR2ZXJ0aXNlbWVudCBSZWdpc3RlciAqLworCXNtY19waHlfd3JpdGUoZGV2LCBwaHlhZGRyLCBNSUlfQURWRVJUSVNFLCBteV9hZF9jYXBzKTsKKwlscC0+bWlpLmFkdmVydGlzaW5nID0gbXlfYWRfY2FwczsKKworCS8qCisJICogUmVhZCB0aGUgcmVnaXN0ZXIgYmFjay4gIFdpdGhvdXQgdGhpcywgaXQgYXBwZWFycyB0aGF0IHdoZW4KKwkgKiBhdXRvLW5lZ290aWF0aW9uIGlzIHJlc3RhcnRlZCwgc29tZXRpbWVzIGl0IGlzbid0IHJlYWR5IGFuZAorCSAqIHRoZSBsaW5rIGRvZXMgbm90IGNvbWUgdXAuCisJICovCisJc3RhdHVzID0gc21jX3BoeV9yZWFkKGRldiwgcGh5YWRkciwgTUlJX0FEVkVSVElTRSk7CisKKwlEQkcoMiwgIiVzOiBwaHkgY2Fwcz0leFxuIiwgZGV2LT5uYW1lLCBteV9waHlfY2Fwcyk7CisJREJHKDIsICIlczogcGh5IGFkdmVydGlzZWQgY2Fwcz0leFxuIiwgZGV2LT5uYW1lLCBteV9hZF9jYXBzKTsKKworCS8qIFJlc3RhcnQgYXV0by1uZWdvdGlhdGlvbiBwcm9jZXNzIGluIG9yZGVyIHRvIGFkdmVydGlzZSBteSBjYXBzICovCisJc21jX3BoeV93cml0ZShkZXYsIHBoeWFkZHIsIE1JSV9CTUNSLCBCTUNSX0FORU5BQkxFIHwgQk1DUl9BTlJFU1RBUlQpOworCisJc21jX3BoeV9jaGVja19tZWRpYShkZXYsIDEpOworCitzbWNfcGh5X2NvbmZpZ3VyZV9leGl0OgorCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworCWxwLT53b3JrX3BlbmRpbmcgPSAwOworfQorCisvKgorICogc21jX3BoeV9pbnRlcnJ1cHQKKyAqCisgKiBQdXJwb3NlOiAgSGFuZGxlIGludGVycnVwdHMgcmVsYXRpbmcgdG8gUEhZIHJlZ2lzdGVyIDE4LiBUaGlzIGlzCisgKiAgY2FsbGVkIGZyb20gdGhlICJoYXJkIiBpbnRlcnJ1cHQgaGFuZGxlciB1bmRlciBvdXIgcHJpdmF0ZSBzcGlubG9jay4KKyAqLworc3RhdGljIHZvaWQgc21jX3BoeV9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHBoeWFkZHIgPSBscC0+bWlpLnBoeV9pZDsKKwlpbnQgcGh5MTg7CisKKwlEQkcoMiwgIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCisJaWYgKGxwLT5waHlfdHlwZSA9PSAwKQorCQlyZXR1cm47CisKKwlmb3IoOzspIHsKKwkJc21jX3BoeV9jaGVja19tZWRpYShkZXYsIDApOworCisJCS8qIFJlYWQgUEhZIFJlZ2lzdGVyIDE4LCBTdGF0dXMgT3V0cHV0ICovCisJCXBoeTE4ID0gc21jX3BoeV9yZWFkKGRldiwgcGh5YWRkciwgUEhZX0lOVF9SRUcpOworCQlpZiAoKHBoeTE4ICYgUEhZX0lOVF9JTlQpID09IDApCisJCQlicmVhazsKKwl9Cit9CisKKy8qLS0tIEVORCBQSFkgQ09OVFJPTCBBTkQgQ09ORklHVVJBVElPTi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBzbWNfMTBidF9jaGVja19tZWRpYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5pdCkKK3sKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+YmFzZTsKKwl1bnNpZ25lZCBpbnQgb2xkX2NhcnJpZXIsIG5ld19jYXJyaWVyOworCisJb2xkX2NhcnJpZXIgPSBuZXRpZl9jYXJyaWVyX29rKGRldikgPyAxIDogMDsKKworCVNNQ19TRUxFQ1RfQkFOSygwKTsKKwluZXdfY2FycmllciA9IFNNQ19pbncoaW9hZGRyLCBFUEhfU1RBVFVTX1JFRykgJiBFU19MSU5LX09LID8gMSA6IDA7CisJU01DX1NFTEVDVF9CQU5LKDIpOworCisJaWYgKGluaXQgfHwgKG9sZF9jYXJyaWVyICE9IG5ld19jYXJyaWVyKSkgeworCQlpZiAoIW5ld19jYXJyaWVyKSB7CisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQl9IGVsc2UgeworCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQl9CisJCWlmIChuZXRpZl9tc2dfbGluayhscCkpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogbGluayAlc1xuIiwgZGV2LT5uYW1lLAorCQkJICAgICAgIG5ld19jYXJyaWVyID8gInVwIiA6ICJkb3duIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzbWNfZXBoX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5iYXNlOworCXVuc2lnbmVkIGludCBjdGw7CisKKwlzbWNfMTBidF9jaGVja19tZWRpYShkZXYsIDApOworCisJU01DX1NFTEVDVF9CQU5LKDEpOworCWN0bCA9IFNNQ19HRVRfQ1RMKCk7CisJU01DX1NFVF9DVEwoY3RsICYgfkNUTF9MRV9FTkFCTEUpOworCVNNQ19TRVRfQ1RMKGN0bCk7CisJU01DX1NFTEVDVF9CQU5LKDIpOworfQorCisvKgorICogVGhpcyBpcyB0aGUgbWFpbiByb3V0aW5lIG9mIHRoZSBkcml2ZXIsIHRvIGhhbmRsZSB0aGUgZGV2aWNlIHdoZW4KKyAqIGl0IG5lZWRzIHNvbWUgYXR0ZW50aW9uLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgc21jX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbHAtPmJhc2U7CisJaW50IHN0YXR1cywgbWFzaywgdGltZW91dCwgY2FyZF9zdGF0czsKKwlpbnQgc2F2ZWRfcG9pbnRlcjsKKworCURCRygzLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisKKwlzcGluX2xvY2soJmxwLT5sb2NrKTsKKworCS8qIEEgcHJlYW1ibGUgbWF5IGJlIHVzZWQgd2hlbiB0aGVyZSBpcyBhIHBvdGVudGlhbCByYWNlCisJICogYmV0d2VlbiB0aGUgaW50ZXJydXB0aWJsZSB0cmFuc21pdCBmdW5jdGlvbnMgYW5kIHRoaXMKKwkgKiBJU1IuICovCisJU01DX0lOVEVSUlVQVF9QUkVBTUJMRTsKKworCXNhdmVkX3BvaW50ZXIgPSBTTUNfR0VUX1BUUigpOworCW1hc2sgPSBTTUNfR0VUX0lOVF9NQVNLKCk7CisJU01DX1NFVF9JTlRfTUFTSygwKTsKKworCS8qIHNldCBhIHRpbWVvdXQgdmFsdWUsIHNvIEkgZG9uJ3Qgc3RheSBoZXJlIGZvcmV2ZXIgKi8KKwl0aW1lb3V0ID0gODsKKworCWRvIHsKKwkJc3RhdHVzID0gU01DX0dFVF9JTlQoKTsKKworCQlEQkcoMiwgIiVzOiBJTlQgMHglMDJ4IE1BU0sgMHglMDJ4IE1FTSAweCUwNHggRklGTyAweCUwNHhcbiIsCisJCQlkZXYtPm5hbWUsIHN0YXR1cywgbWFzaywKKwkJCSh7IGludCBtZW1pbmZvOyBTTUNfU0VMRUNUX0JBTksoMCk7CisJCQkgICBtZW1pbmZvID0gU01DX0dFVF9NSVIoKTsKKwkJCSAgIFNNQ19TRUxFQ1RfQkFOSygyKTsgbWVtaW5mbzsgfSksCisJCQlTTUNfR0VUX0ZJRk8oKSk7CisKKwkJc3RhdHVzICY9IG1hc2s7CisJCWlmICghc3RhdHVzKQorCQkJYnJlYWs7CisKKwkJaWYgKHN0YXR1cyAmIElNX1JDVl9JTlQpIHsKKwkJCURCRygzLCAiJXM6IFJYIGlycVxuIiwgZGV2LT5uYW1lKTsKKwkJCXNtY19yY3YoZGV2KTsKKwkJfSBlbHNlIGlmIChzdGF0dXMgJiBJTV9UWF9JTlQpIHsKKwkJCURCRygzLCAiJXM6IFRYIGludFxuIiwgZGV2LT5uYW1lKTsKKwkJCXNtY190eChkZXYpOworCQkJU01DX0FDS19JTlQoSU1fVFhfSU5UKTsKKwkJCWlmIChUSFJPVFRMRV9UWF9QS1RTKQorCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJfSBlbHNlIGlmIChzdGF0dXMgJiBJTV9BTExPQ19JTlQpIHsKKwkJCURCRygzLCAiJXM6IEFsbG9jYXRpb24gaXJxXG4iLCBkZXYtPm5hbWUpOworCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmbHAtPnR4X3Rhc2spOworCQkJbWFzayAmPSB+SU1fQUxMT0NfSU5UOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIElNX1RYX0VNUFRZX0lOVCkgeworCQkJREJHKDMsICIlczogVFggZW1wdHlcbiIsIGRldi0+bmFtZSk7CisJCQltYXNrICY9IH5JTV9UWF9FTVBUWV9JTlQ7CisKKwkJCS8qIHVwZGF0ZSBzdGF0cyAqLworCQkJU01DX1NFTEVDVF9CQU5LKDApOworCQkJY2FyZF9zdGF0cyA9IFNNQ19HRVRfQ09VTlRFUigpOworCQkJU01DX1NFTEVDVF9CQU5LKDIpOworCisJCQkvKiBzaW5nbGUgY29sbGlzaW9ucyAqLworCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gY2FyZF9zdGF0cyAmIDB4RjsKKwkJCWNhcmRfc3RhdHMgPj49IDQ7CisKKwkJCS8qIG11bHRpcGxlIGNvbGxpc2lvbnMgKi8KKwkJCWxwLT5zdGF0cy5jb2xsaXNpb25zICs9IGNhcmRfc3RhdHMgJiAweEY7CisJCX0gZWxzZSBpZiAoc3RhdHVzICYgSU1fUlhfT1ZSTl9JTlQpIHsKKwkJCURCRygxLCAiJXM6IFJYIG92ZXJydW5cbiIsIGRldi0+bmFtZSk7CisJCQlTTUNfQUNLX0lOVChJTV9SWF9PVlJOX0lOVCk7CisJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJfSBlbHNlIGlmIChzdGF0dXMgJiBJTV9FUEhfSU5UKSB7CisJCQlzbWNfZXBoX2ludGVycnVwdChkZXYpOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIElNX01ESU5UKSB7CisJCQlTTUNfQUNLX0lOVChJTV9NRElOVCk7CisJCQlzbWNfcGh5X2ludGVycnVwdChkZXYpOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIElNX0VSQ1ZfSU5UKSB7CisJCQlTTUNfQUNLX0lOVChJTV9FUkNWX0lOVCk7CisJCQlQUklOVEsoIiVzOiBVTlNVUFBPUlRFRDogRVJDViBJTlRFUlJVUFQgXG4iLCBkZXYtPm5hbWUpOworCQl9CisJfSB3aGlsZSAoLS10aW1lb3V0KTsKKworCS8qIHJlc3RvcmUgcmVnaXN0ZXIgc3RhdGVzICovCisJU01DX1NFVF9QVFIoc2F2ZWRfcG9pbnRlcik7CisJU01DX1NFVF9JTlRfTUFTSyhtYXNrKTsKKworCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisKKwlEQkcoMywgIiVzOiBJbnRlcnJ1cHQgZG9uZSAoJWQgbG9vcHMpXG4iLCBkZXYtPm5hbWUsIDgtdGltZW91dCk7CisKKwkvKgorCSAqIFdlIHJldHVybiBJUlFfSEFORExFRCB1bmNvbmRpdGlvbmFsbHkgaGVyZSBldmVuIGlmIHRoZXJlIHdhcworCSAqIG5vdGhpbmcgdG8gZG8uICBUaGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgYSBwYWNrZXQgbWlnaHQKKwkgKiBnZXQgZW5xdWV1ZWQgaW50byB0aGUgY2hpcCByaWdodCBhZnRlciBUWF9FTVBUWV9JTlQgaXMgcmFpc2VkCisJICogYnV0IGp1c3QgYmVmb3JlIHRoZSBDUFUgYWNrbm93bGVkZ2VzIHRoZSBJUlEuCisJICogQmV0dGVyIHRha2UgYW4gdW5uZWVkZWQgSVJRIGluIHNvbWUgb2NjYXNpb25zIHRoYW4gY29tcGxleGlmeWluZworCSAqIHRoZSBjb2RlIGZvciBhbGwgY2FzZXMuCisJICovCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKy8qCisgKiBQb2xsaW5nIHJlY2VpdmUgLSB1c2VkIGJ5IG5ldGNvbnNvbGUgYW5kIG90aGVyIGRpYWdub3N0aWMgdG9vbHMKKyAqIHRvIGFsbG93IG5ldHdvcmsgaS9vIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqLworc3RhdGljIHZvaWQgc21jX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlzbWNfaW50ZXJydXB0KGRldi0+aXJxLCBkZXYsIE5VTEwpOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworfQorI2VuZGlmCisKKy8qIE91ciB3YXRjaGRvZyB0aW1lZCBvdXQuIENhbGxlZCBieSB0aGUgbmV0d29ya2luZyBsYXllciAqLworc3RhdGljIHZvaWQgc21jX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBscC0+YmFzZTsKKwlpbnQgc3RhdHVzLCBtYXNrLCBtZW1pbmZvLCBmaWZvOworCisJREJHKDIsICIlczogJXNcbiIsIGRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKworCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsKKwlzdGF0dXMgPSBTTUNfR0VUX0lOVCgpOworCW1hc2sgPSBTTUNfR0VUX0lOVF9NQVNLKCk7CisJZmlmbyA9IFNNQ19HRVRfRklGTygpOworCVNNQ19TRUxFQ1RfQkFOSygwKTsKKwltZW1pbmZvID0gU01DX0dFVF9NSVIoKTsKKwlTTUNfU0VMRUNUX0JBTksoMik7CisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CisJUFJJTlRLKCAiJXM6IElOVCAweCUwMnggTUFTSyAweCUwMnggTUVNIDB4JTA0eCBGSUZPIDB4JTA0eFxuIiwKKwkJZGV2LT5uYW1lLCBzdGF0dXMsIG1hc2ssIG1lbWluZm8sIGZpZm8gKTsKKworCXNtY19yZXNldChkZXYpOworCXNtY19lbmFibGUoZGV2KTsKKworCS8qCisJICogUmVjb25maWd1cmluZyB0aGUgUEhZIGRvZXNuJ3Qgc2VlbSBsaWtlIGEgYmFkIGlkZWEgaGVyZSwgYnV0CisJICogc21jX3BoeV9jb25maWd1cmUoKSBjYWxscyBtc2xlZXAoKSB3aGljaCBjYWxscyBzY2hlZHVsZV90aW1lb3V0KCkKKwkgKiB3aGljaCBjYWxscyBzY2hlZHVsZSgpLiAgSGVuY2Ugd2UgdXNlIGEgd29yayBxdWV1ZS4KKwkgKi8KKwlpZiAobHAtPnBoeV90eXBlICE9IDApIHsKKwkJaWYgKHNjaGVkdWxlX3dvcmsoJmxwLT5waHlfY29uZmlndXJlKSkgeworCQkJbHAtPndvcmtfcGVuZGluZyA9IDE7CisJCX0KKwl9CisKKwkvKiBXZSBjYW4gYWNjZXB0IFRYIHBhY2tldHMgYWdhaW4gKi8KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgd2lsbCwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZXMgcGFzc2VkIHRvIGl0LAorICogZWl0aGVyIG1ha2UgaXQgYWNjZXB0IG11bHRpY2FzdCBwYWNrZXRzLCBnbyBpbnRvCisgKiBwcm9taXNjdW91cyBtb2RlIChmb3IgVENQRFVNUCBhbmQgY291c2lucykgb3IgYWNjZXB0CisgKiBhIHNlbGVjdCBzZXQgb2YgbXVsdGljYXN0IHBhY2tldHMKKyAqLworc3RhdGljIHZvaWQgc21jX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5iYXNlOworCXVuc2lnbmVkIGNoYXIgbXVsdGljYXN0X3RhYmxlWzhdOworCWludCB1cGRhdGVfbXVsdGljYXN0ID0gMDsKKworCURCRygyLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCURCRygyLCAiJXM6IFJDUl9QUk1TXG4iLCBkZXYtPm5hbWUpOworCQlscC0+cmNyX2N1cl9tb2RlIHw9IFJDUl9QUk1TOworCX0KKworLyogQlVHPyAgSSBuZXZlciBkaXNhYmxlIHByb21pc2N1b3VzIG1vZGUgaWYgbXVsdGljYXN0aW5nIHdhcyB0dXJuZWQgb24uCisgICBOb3csIEkgdHVybiBvZmYgcHJvbWlzY3VvdXMgbW9kZSwgYnV0IEkgZG9uJ3QgZG8gYW55dGhpbmcgdG8gbXVsdGljYXN0aW5nCisgICB3aGVuIHByb21pc2N1b3VzIG1vZGUgaXMgdHVybmVkIG9uLgorKi8KKworCS8qCisJICogSGVyZSwgSSBhbSBzZXR0aW5nIHRoaXMgdG8gYWNjZXB0IGFsbCBtdWx0aWNhc3QgcGFja2V0cy4KKwkgKiBJIGRvbid0IG5lZWQgdG8gemVybyB0aGUgbXVsdGljYXN0IHRhYmxlLCBiZWNhdXNlIHRoZSBmbGFnIGlzCisJICogY2hlY2tlZCBiZWZvcmUgdGhlIHRhYmxlIGlzCisJICovCisJZWxzZSBpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSB8fCBkZXYtPm1jX2NvdW50ID4gMTYpIHsKKwkJREJHKDIsICIlczogUkNSX0FMTVVMXG4iLCBkZXYtPm5hbWUpOworCQlscC0+cmNyX2N1cl9tb2RlIHw9IFJDUl9BTE1VTDsKKwl9CisKKwkvKgorCSAqIFRoaXMgc2V0cyB0aGUgaW50ZXJuYWwgaGFyZHdhcmUgdGFibGUgdG8gZmlsdGVyIG91dCB1bndhbnRlZAorCSAqIG11bHRpY2FzdCBwYWNrZXRzIGJlZm9yZSB0aGV5IHRha2UgdXAgbWVtb3J5LgorCSAqCisJICogVGhlIFNNQyBjaGlwIHVzZXMgYSBoYXNoIHRhYmxlIHdoZXJlIHRoZSBoaWdoIDYgYml0cyBvZiB0aGUgQ1JDIG9mCisJICogYWRkcmVzcyBhcmUgdGhlIG9mZnNldCBpbnRvIHRoZSB0YWJsZS4gIElmIHRoYXQgYml0IGlzIDEsIHRoZW4gdGhlCisJICogbXVsdGljYXN0IHBhY2tldCBpcyBhY2NlcHRlZC4gIE90aGVyd2lzZSwgaXQncyBkcm9wcGVkIHNpbGVudGx5LgorCSAqCisJICogVG8gdXNlIHRoZSA2IGJpdHMgYXMgYW4gb2Zmc2V0IGludG8gdGhlIHRhYmxlLCB0aGUgaGlnaCAzIGJpdHMgYXJlCisJICogdGhlIG51bWJlciBvZiB0aGUgOCBiaXQgcmVnaXN0ZXIsIHdoaWxlIHRoZSBsb3cgMyBiaXRzIGFyZSB0aGUgYml0CisJICogd2l0aGluIHRoYXQgcmVnaXN0ZXIuCisJICovCisJZWxzZSBpZiAoZGV2LT5tY19jb3VudCkgIHsKKwkJaW50IGk7CisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqY3VyX2FkZHI7CisKKwkJLyogdGFibGUgZm9yIGZsaXBwaW5nIHRoZSBvcmRlciBvZiAzIGJpdHMgKi8KKwkJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW52ZXJ0M1tdID0gezAsIDQsIDIsIDYsIDEsIDUsIDMsIDd9OworCisJCS8qIHN0YXJ0IHdpdGggYSB0YWJsZSBvZiBhbGwgemVyb3M6IHJlamVjdCBhbGwgKi8KKwkJbWVtc2V0KG11bHRpY2FzdF90YWJsZSwgMCwgc2l6ZW9mKG11bHRpY2FzdF90YWJsZSkpOworCisJCWN1cl9hZGRyID0gZGV2LT5tY19saXN0OworCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrLCBjdXJfYWRkciA9IGN1cl9hZGRyLT5uZXh0KSB7CisJCQlpbnQgcG9zaXRpb247CisKKwkJCS8qIGRvIHdlIGhhdmUgYSBwb2ludGVyIGhlcmU/ICovCisJCQlpZiAoIWN1cl9hZGRyKQorCQkJCWJyZWFrOworCQkJLyogbWFrZSBzdXJlIHRoaXMgaXMgYSBtdWx0aWNhc3QgYWRkcmVzcyAtCisJCSAgIAkgICBzaG91bGRuJ3QgdGhpcyBiZSBhIGdpdmVuIGlmIHdlIGhhdmUgaXQgaGVyZSA/ICovCisJCQlpZiAoISgqY3VyX2FkZHItPmRtaV9hZGRyICYgMSkpCisJCQkJY29udGludWU7CisKKwkJCS8qIG9ubHkgdXNlIHRoZSBsb3cgb3JkZXIgYml0cyAqLworCQkJcG9zaXRpb24gPSBjcmMzMl9sZSh+MCwgY3VyX2FkZHItPmRtaV9hZGRyLCA2KSAmIDB4M2Y7CisKKwkJCS8qIGRvIHNvbWUgbWVzc3kgc3dhcHBpbmcgdG8gcHV0IHRoZSBiaXQgaW4gdGhlIHJpZ2h0IHNwb3QgKi8KKwkJCW11bHRpY2FzdF90YWJsZVtpbnZlcnQzW3Bvc2l0aW9uJjddXSB8PQorCQkJCSgxPDxpbnZlcnQzWyhwb3NpdGlvbj4+MykmN10pOworCQl9CisKKwkJLyogYmUgc3VyZSBJIGdldCByaWQgb2YgZmxhZ3MgSSBtaWdodCBoYXZlIHNldCAqLworCQlscC0+cmNyX2N1cl9tb2RlICY9IH4oUkNSX1BSTVMgfCBSQ1JfQUxNVUwpOworCisJCS8qIG5vdywgdGhlIHRhYmxlIGNhbiBiZSBsb2FkZWQgaW50byB0aGUgY2hpcHNldCAqLworCQl1cGRhdGVfbXVsdGljYXN0ID0gMTsKKwl9IGVsc2UgIHsKKwkJREJHKDIsICIlczogfihSQ1JfUFJNU3xSQ1JfQUxNVUwpXG4iLCBkZXYtPm5hbWUpOworCQlscC0+cmNyX2N1cl9tb2RlICY9IH4oUkNSX1BSTVMgfCBSQ1JfQUxNVUwpOworCisJCS8qCisJCSAqIHNpbmNlIEknbSBkaXNhYmxpbmcgYWxsIG11bHRpY2FzdCBlbnRpcmVseSwgSSBuZWVkIHRvCisJCSAqIGNsZWFyIHRoZSBtdWx0aWNhc3QgbGlzdAorCQkgKi8KKwkJbWVtc2V0KG11bHRpY2FzdF90YWJsZSwgMCwgc2l6ZW9mKG11bHRpY2FzdF90YWJsZSkpOworCQl1cGRhdGVfbXVsdGljYXN0ID0gMTsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CisJU01DX1NFTEVDVF9CQU5LKDApOworCVNNQ19TRVRfUkNSKGxwLT5yY3JfY3VyX21vZGUpOworCWlmICh1cGRhdGVfbXVsdGljYXN0KSB7CisJCVNNQ19TRUxFQ1RfQkFOSygzKTsKKwkJU01DX1NFVF9NQ0FTVChtdWx0aWNhc3RfdGFibGUpOworCX0KKwlTTUNfU0VMRUNUX0JBTksoMik7CisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7Cit9CisKKworLyoKKyAqIE9wZW4gYW5kIEluaXRpYWxpemUgdGhlIGJvYXJkCisgKgorICogU2V0IHVwIGV2ZXJ5dGhpbmcsIHJlc2V0IHRoZSBjYXJkLCBldGMuLgorICovCitzdGF0aWMgaW50CitzbWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCURCRygyLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisKKwkvKgorCSAqIENoZWNrIHRoYXQgdGhlIGFkZHJlc3MgaXMgdmFsaWQuICBJZiBpdHMgbm90LCByZWZ1c2UKKwkgKiB0byBicmluZyB0aGUgZGV2aWNlIHVwLiAgVGhlIHVzZXIgbXVzdCBzcGVjaWZ5IGFuCisJICogYWRkcmVzcyB1c2luZyBpZmNvbmZpZyBldGgwIGh3IGV0aGVyIHh4Onh4Onh4Onh4Onh4Onh4CisJICovCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKSB7CisJCVBSSU5USygiJXM6IG5vIHZhbGlkIGV0aGVybmV0IGh3IGFkZHJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFNldHVwIHRoZSBkZWZhdWx0IFJlZ2lzdGVyIE1vZGVzICovCisJbHAtPnRjcl9jdXJfbW9kZSA9IFRDUl9ERUZBVUxUOworCWxwLT5yY3JfY3VyX21vZGUgPSBSQ1JfREVGQVVMVDsKKwlscC0+cnBjX2N1cl9tb2RlID0gUlBDX0RFRkFVTFQ7CisKKwkvKgorCSAqIElmIHdlIGFyZSBub3QgdXNpbmcgYSBNSUkgaW50ZXJmYWNlLCB3ZSBuZWVkIHRvCisJICogbW9uaXRvciBvdXIgb3duIGNhcnJpZXIgc2lnbmFsIHRvIGRldGVjdCBmYXVsdHMuCisJICovCisJaWYgKGxwLT5waHlfdHlwZSA9PSAwKQorCQlscC0+dGNyX2N1cl9tb2RlIHw9IFRDUl9NT05fQ1NOOworCisJLyogcmVzZXQgdGhlIGhhcmR3YXJlICovCisJc21jX3Jlc2V0KGRldik7CisJc21jX2VuYWJsZShkZXYpOworCisJLyogQ29uZmlndXJlIHRoZSBQSFksIGluaXRpYWxpemUgdGhlIGxpbmsgc3RhdGUgKi8KKwlpZiAobHAtPnBoeV90eXBlICE9IDApCisJCXNtY19waHlfY29uZmlndXJlKGRldik7CisJZWxzZSB7CisJCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsKKwkJc21jXzEwYnRfY2hlY2tfbWVkaWEoZGV2LCAxKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNtY19jbG9zZQorICoKKyAqIHRoaXMgbWFrZXMgdGhlIGJvYXJkIGNsZWFuIHVwIGV2ZXJ5dGhpbmcgdGhhdCBpdCBjYW4KKyAqIGFuZCBub3QgdGFsayB0byB0aGUgb3V0c2lkZSB3b3JsZC4gICBDYXVzZWQgYnkKKyAqIGFuICdpZmNvbmZpZyBldGhYIGRvd24nCisgKi8KK3N0YXRpYyBpbnQgc21jX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJREJHKDIsICIlczogJXNcbiIsIGRldi0+bmFtZSwgX19GVU5DVElPTl9fKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJLyogY2xlYXIgZXZlcnl0aGluZyAqLworCXNtY19zaHV0ZG93bihkZXYpOworCisJc21jX3BoeV9wb3dlcmRvd24oZGV2KTsKKworCWlmIChscC0+cGVuZGluZ190eF9za2IpIHsKKwkJZGV2X2tmcmVlX3NrYihscC0+cGVuZGluZ190eF9za2IpOworCQlscC0+cGVuZGluZ190eF9za2IgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCisgKiBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aCB0aGUgY2FyZCBvcGVuIG9yIGNsb3NlZC4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzbWNfcXVlcnlfc3RhdGlzdGljcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCURCRygyLCAiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworLyoKKyAqIEV0aHRvb2wgc3VwcG9ydAorICovCitzdGF0aWMgaW50CitzbWNfZXRodG9vbF9nZXRzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJldDsKKworCWNtZC0+bWF4dHhwa3QgPSAxOworCWNtZC0+bWF4cnhwa3QgPSAxOworCisJaWYgKGxwLT5waHlfdHlwZSAhPSAwKSB7CisJCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsKKwkJcmV0ID0gbWlpX2V0aHRvb2xfZ3NldCgmbHAtPm1paSwgY21kKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CisJfSBlbHNlIHsKKwkJY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkJCQkgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CisJCQkJIFNVUFBPUlRFRF9UUCB8IFNVUFBPUlRFRF9BVUk7CisKKwkJaWYgKGxwLT5jdGxfcnNwZWVkID09IDEwKQorCQkJY21kLT5zcGVlZCA9IFNQRUVEXzEwOworCQllbHNlIGlmIChscC0+Y3RsX3JzcGVlZCA9PSAxMDApCisJCQljbWQtPnNwZWVkID0gU1BFRURfMTAwOworCisJCWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKwkJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisJCWNtZC0+cG9ydCA9IDA7CisJCWNtZC0+ZHVwbGV4ID0gbHAtPnRjcl9jdXJfbW9kZSAmIFRDUl9TV0ZEVVAgPyBEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOworCisJCXJldCA9IDA7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorc21jX2V0aHRvb2xfc2V0c2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXQ7CisKKwlpZiAobHAtPnBoeV90eXBlICE9IDApIHsKKwkJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCQlyZXQgPSBtaWlfZXRodG9vbF9zc2V0KCZscC0+bWlpLCBjbWQpOworCQlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKwl9IGVsc2UgeworCQlpZiAoY21kLT5hdXRvbmVnICE9IEFVVE9ORUdfRElTQUJMRSB8fAorCQkgICAgY21kLT5zcGVlZCAhPSBTUEVFRF8xMCB8fAorCQkgICAgKGNtZC0+ZHVwbGV4ICE9IERVUExFWF9IQUxGICYmIGNtZC0+ZHVwbGV4ICE9IERVUExFWF9GVUxMKSB8fAorCQkgICAgKGNtZC0+cG9ydCAhPSBQT1JUX1RQICYmIGNtZC0+cG9ydCAhPSBQT1JUX0FVSSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworLy8JCWxwLT5wb3J0ID0gY21kLT5wb3J0OworCQlscC0+Y3RsX3JmZHVwbHggPSBjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTDsKKworLy8JCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisvLwkJCXNtY19zZXRfcG9ydChkZXYpOworCisJCXJldCA9IDA7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK3NtY19ldGh0b29sX2dldGRydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJuY3B5KGluZm8tPmRyaXZlciwgQ0FSRE5BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJuY3B5KGluZm8tPnZlcnNpb24sIHZlcnNpb24sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CisJc3RybmNweShpbmZvLT5idXNfaW5mbywgZGV2LT5jbGFzc19kZXYuZGV2LT5idXNfaWQsIHNpemVvZihpbmZvLT5idXNfaW5mbykpOworfQorCitzdGF0aWMgaW50IHNtY19ldGh0b29sX253YXlyZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWlmIChscC0+cGh5X3R5cGUgIT0gMCkgeworCQlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CisJCXJldCA9IG1paV9ud2F5X3Jlc3RhcnQoJmxwLT5taWkpOworCQlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTMyIHNtY19ldGh0b29sX2dldG1zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiBscC0+bXNnX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQgc21jX2V0aHRvb2xfc2V0bXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGxldmVsKQoreworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlscC0+bXNnX2VuYWJsZSA9IGxldmVsOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHNtY19ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzCT0gc21jX2V0aHRvb2xfZ2V0c2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwk9IHNtY19ldGh0b29sX3NldHNldHRpbmdzLAorCS5nZXRfZHJ2aW5mbwk9IHNtY19ldGh0b29sX2dldGRydmluZm8sCisKKwkuZ2V0X21zZ2xldmVsCT0gc21jX2V0aHRvb2xfZ2V0bXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAk9IHNtY19ldGh0b29sX3NldG1zZ2xldmVsLAorCS5ud2F5X3Jlc2V0CT0gc21jX2V0aHRvb2xfbndheXJlc2V0LAorCS5nZXRfbGluawk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisvLwkuZ2V0X2VlcHJvbQk9IHNtY19ldGh0b29sX2dldGVlcHJvbSwKKy8vCS5zZXRfZWVwcm9tCT0gc21jX2V0aHRvb2xfc2V0ZWVwcm9tLAorfTsKKworLyoKKyAqIHNtY19maW5kaXJxCisgKgorICogVGhpcyByb3V0aW5lIGhhcyBhIHNpbXBsZSBwdXJwb3NlIC0tIG1ha2UgdGhlIFNNQyBjaGlwIGdlbmVyYXRlIGFuCisgKiBpbnRlcnJ1cHQsIHNvIGFuIGF1dG8tZGV0ZWN0IHJvdXRpbmUgY2FuIGRldGVjdCBpdCwgYW5kIGZpbmQgdGhlIElSUSwKKyAqLworLyoKKyAqIGRvZXMgdGhpcyBzdGlsbCB3b3JrPworICoKKyAqIEkganVzdCBkZWxldGVkIGF1dG9faXJxLmMsIHNpbmNlIGl0IHdhcyBuZXZlciBidWlsdC4uLgorICogICAtLWpnYXJ6aWsKKyAqLworc3RhdGljIGludCBfX2luaXQgc21jX2ZpbmRpcnEodm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJaW50IHRpbWVvdXQgPSAyMDsKKwl1bnNpZ25lZCBsb25nIGNvb2tpZTsKKworCURCRygyLCAiJXM6ICVzXG4iLCBDQVJETkFNRSwgX19GVU5DVElPTl9fKTsKKworCWNvb2tpZSA9IHByb2JlX2lycV9vbigpOworCisJLyoKKwkgKiBXaGF0IEkgdHJ5IHRvIGRvIGhlcmUgaXMgdHJpZ2dlciBhbiBBTExPQ19JTlQuIFRoaXMgaXMgZG9uZQorCSAqIGJ5IGFsbG9jYXRpbmcgYSBzbWFsbCBjaHVuayBvZiBtZW1vcnksIHdoaWNoIHdpbGwgZ2l2ZSBhbiBpbnRlcnJ1cHQKKwkgKiB3aGVuIGRvbmUuCisJICovCisJLyogZW5hYmxlIEFMTE9DYXRpb24gaW50ZXJydXB0cyBPTkxZICovCisJU01DX1NFTEVDVF9CQU5LKDIpOworCVNNQ19TRVRfSU5UX01BU0soSU1fQUxMT0NfSU5UKTsKKworCS8qCisgCSAqIEFsbG9jYXRlIDUxMiBieXRlcyBvZiBtZW1vcnkuICBOb3RlIHRoYXQgdGhlIGNoaXAgd2FzIGp1c3QKKwkgKiByZXNldCBzbyBhbGwgdGhlIG1lbW9yeSBpcyBhdmFpbGFibGUKKwkgKi8KKwlTTUNfU0VUX01NVV9DTUQoTUNfQUxMT0MgfCAxKTsKKworCS8qCisJICogV2FpdCB1bnRpbCBwb3NpdGl2ZSB0aGF0IHRoZSBpbnRlcnJ1cHQgaGFzIGJlZW4gZ2VuZXJhdGVkCisJICovCisJZG8geworCQlpbnQgaW50X3N0YXR1czsKKwkJdWRlbGF5KDEwKTsKKwkJaW50X3N0YXR1cyA9IFNNQ19HRVRfSU5UKCk7CisJCWlmIChpbnRfc3RhdHVzICYgSU1fQUxMT0NfSU5UKQorCQkJYnJlYWs7CQkvKiBnb3QgdGhlIGludGVycnVwdCAqLworCX0gd2hpbGUgKC0tdGltZW91dCk7CisKKwkvKgorCSAqIHRoZXJlIGlzIHJlYWxseSBub3RoaW5nIHRoYXQgSSBjYW4gZG8gaGVyZSBpZiB0aW1lb3V0IGZhaWxzLAorCSAqIGFzIGF1dG9pcnFfcmVwb3J0IHdpbGwgcmV0dXJuIGEgMCBhbnl3YXksIHdoaWNoIGlzIHdoYXQgSQorCSAqIHdhbnQgaW4gdGhpcyBjYXNlLiAgIFBsdXMsIHRoZSBjbGVhbiB1cCBpcyBuZWVkZWQgaW4gYm90aAorCSAqIGNhc2VzLgorCSAqLworCisJLyogYW5kIGRpc2FibGUgYWxsIGludGVycnVwdHMgYWdhaW4gKi8KKwlTTUNfU0VUX0lOVF9NQVNLKDApOworCisJLyogYW5kIHJldHVybiB3aGF0IEkgZm91bmQgKi8KKwlyZXR1cm4gcHJvYmVfaXJxX29mZihjb29raWUpOworfQorCisvKgorICogRnVuY3Rpb246IHNtY19wcm9iZSh1bnNpZ25lZCBsb25nIGlvYWRkcikKKyAqCisgKiBQdXJwb3NlOgorICoJVGVzdHMgdG8gc2VlIGlmIGEgZ2l2ZW4gaW9hZGRyIHBvaW50cyB0byBhbiBTTUM5MXggY2hpcC4KKyAqCVJldHVybnMgYSAwIG9uIHN1Y2Nlc3MKKyAqCisgKiBBbGdvcml0aG06CisgKgkoMSkgc2VlIGlmIHRoZSBoaWdoIGJ5dGUgb2YgQkFOS19TRUxFQ1QgaXMgMHgzMworICogCSgyKSBjb21wYXJlIHRoZSBpb2FkZHIgd2l0aCB0aGUgYmFzZSByZWdpc3RlcidzIGFkZHJlc3MKKyAqCSgzKSBzZWUgaWYgSSByZWNvZ25pemUgdGhlIGNoaXAgSUQgaW4gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyCisgKgorICogSGVyZSBJIGRvIHR5cGljYWwgaW5pdGlhbGl6YXRpb24gdGFza3MuCisgKgorICogbyAgSW5pdGlhbGl6ZSB0aGUgc3RydWN0dXJlIGlmIG5lZWRlZAorICogbyAgcHJpbnQgb3V0IG15IHZhbml0eSBtZXNzYWdlIGlmIG5vdCBkb25lIHNvIGFscmVhZHkKKyAqIG8gIHByaW50IG91dCB3aGF0IHR5cGUgb2YgaGFyZHdhcmUgaXMgZGV0ZWN0ZWQKKyAqIG8gIHByaW50IG91dCB0aGUgZXRoZXJuZXQgYWRkcmVzcworICogbyAgZmluZCB0aGUgSVJRCisgKiBvICBzZXQgdXAgbXkgcHJpdmF0ZSBkYXRhCisgKiBvICBjb25maWd1cmUgdGhlIGRldiBzdHJ1Y3R1cmUgd2l0aCBteSBzdWJyb3V0aW5lcworICogbyAgYWN0dWFsbHkgR1JBQiB0aGUgaXJxLgorICogbyAgR1JBQiB0aGUgcmVnaW9uCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNtY19wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3RhdGljIGludCB2ZXJzaW9uX3ByaW50ZWQgPSAwOworCWludCBpLCByZXR2YWw7CisJdW5zaWduZWQgaW50IHZhbCwgcmV2aXNpb25fcmVnaXN0ZXI7CisJY29uc3QgY2hhciAqdmVyc2lvbl9zdHJpbmc7CisKKwlEQkcoMiwgIiVzOiAlc1xuIiwgQ0FSRE5BTUUsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiBGaXJzdCwgc2VlIGlmIHRoZSBoaWdoIGJ5dGUgaXMgMHgzMyAqLworCXZhbCA9IFNNQ19DVVJSRU5UX0JBTksoKTsKKwlEQkcoMiwgIiVzOiBiYW5rIHNpZ25hdHVyZSBwcm9iZSByZXR1cm5lZCAweCUwNHhcbiIsIENBUkROQU1FLCB2YWwpOworCWlmICgodmFsICYgMHhGRjAwKSAhPSAweDMzMDApIHsKKwkJaWYgKCh2YWwgJiAweEZGKSA9PSAweDMzKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJIiVzOiBEZXRlY3RlZCBwb3NzaWJsZSBieXRlLXN3YXBwZWQgaW50ZXJmYWNlIgorCQkJCSIgYXQgSU9BRERSICVwXG4iLCBDQVJETkFNRSwgaW9hZGRyKTsKKwkJfQorCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyoKKwkgKiBUaGUgYWJvdmUgTUlHSFQgaW5kaWNhdGUgYSBkZXZpY2UsIGJ1dCBJIG5lZWQgdG8gd3JpdGUgdG8KKwkgKiBmdXJ0aGVyIHRlc3QgdGhpcy4KKwkgKi8KKwlTTUNfU0VMRUNUX0JBTksoMCk7CisJdmFsID0gU01DX0NVUlJFTlRfQkFOSygpOworCWlmICgodmFsICYgMHhGRjAwKSAhPSAweDMzMDApIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qCisJICogd2VsbCwgd2UndmUgYWxyZWFkeSB3cml0dGVuIG9uY2UsIHNvIGhvcGVmdWxseSBhbm90aGVyCisJICogdGltZSB3b24ndCBodXJ0LiAgVGhpcyB0aW1lLCBJIG5lZWQgdG8gc3dpdGNoIHRoZSBiYW5rCisJICogcmVnaXN0ZXIgdG8gYmFuayAxLCBzbyBJIGNhbiBhY2Nlc3MgdGhlIGJhc2UgYWRkcmVzcworCSAqIHJlZ2lzdGVyCisJICovCisJU01DX1NFTEVDVF9CQU5LKDEpOworCXZhbCA9IFNNQ19HRVRfQkFTRSgpOworCXZhbCA9ICgodmFsICYgMHgxRjAwKSA+PiAzKSA8PCBTTUNfSU9fU0hJRlQ7CisJaWYgKCgodW5zaWduZWQgbG9uZylpb2FkZHIgJiAoKFBBR0VfU0laRS0xKTw8U01DX0lPX1NISUZUKSkgIT0gdmFsKSB7IC8qWFhYOiBXVEY/ICovCisJCXByaW50aygiJXM6IElPQUREUiAlcCBkb2Vzbid0IG1hdGNoIGNvbmZpZ3VyYXRpb24gKCV4KS5cbiIsCisJCQlDQVJETkFNRSwgaW9hZGRyLCB2YWwpOworCX0KKworCS8qCisJICogY2hlY2sgaWYgdGhlIHJldmlzaW9uIHJlZ2lzdGVyIGlzIHNvbWV0aGluZyB0aGF0IEkKKwkgKiByZWNvZ25pemUuICBUaGVzZSBtaWdodCBuZWVkIHRvIGJlIGFkZGVkIHRvIGxhdGVyLAorCSAqIGFzIGZ1dHVyZSByZXZpc2lvbnMgY291bGQgYmUgYWRkZWQuCisJICovCisJU01DX1NFTEVDVF9CQU5LKDMpOworCXJldmlzaW9uX3JlZ2lzdGVyID0gU01DX0dFVF9SRVYoKTsKKwlEQkcoMiwgIiVzOiByZXZpc2lvbiA9IDB4JTA0eFxuIiwgQ0FSRE5BTUUsIHJldmlzaW9uX3JlZ2lzdGVyKTsKKwl2ZXJzaW9uX3N0cmluZyA9IGNoaXBfaWRzWyAocmV2aXNpb25fcmVnaXN0ZXIgPj4gNCkgJiAweEZdOworCWlmICghdmVyc2lvbl9zdHJpbmcgfHwgKHJldmlzaW9uX3JlZ2lzdGVyICYgMHhmZjAwKSAhPSAweDMzMDApIHsKKwkJLyogSSBkb24ndCByZWNvZ25pemUgdGhpcyBjaGlwLCBzby4uLiAqLworCQlwcmludGsoIiVzOiBJTyAlcDogVW5yZWNvZ25pemVkIHJldmlzaW9uIHJlZ2lzdGVyIDB4JTA0eCIKKwkJCSIsIENvbnRhY3QgYXV0aG9yLlxuIiwgQ0FSRE5BTUUsCisJCQlpb2FkZHIsIHJldmlzaW9uX3JlZ2lzdGVyKTsKKworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogQXQgdGhpcyBwb2ludCBJJ2xsIGFzc3VtZSB0aGF0IHRoZSBjaGlwIGlzIGFuIFNNQzkxeC4gKi8KKwlpZiAodmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKCIlcyIsIHZlcnNpb24pOworCisJLyogZmlsbCBpbiBzb21lIG9mIHRoZSBmaWVsZHMgKi8KKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvYWRkcjsKKwlscC0+YmFzZSA9IGlvYWRkcjsKKwlscC0+dmVyc2lvbiA9IHJldmlzaW9uX3JlZ2lzdGVyICYgMHhmZjsKKwlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCisJLyogR2V0IHRoZSBNQUMgYWRkcmVzcyAqLworCVNNQ19TRUxFQ1RfQkFOSygxKTsKKwlTTUNfR0VUX01BQ19BRERSKGRldi0+ZGV2X2FkZHIpOworCisJLyogbm93LCByZXNldCB0aGUgY2hpcCwgYW5kIHB1dCBpdCBpbnRvIGEga25vd24gc3RhdGUgKi8KKwlzbWNfcmVzZXQoZGV2KTsKKworCS8qCisJICogSWYgZGV2LT5pcnEgaXMgMCwgdGhlbiB0aGUgZGV2aWNlIGhhcyB0byBiZSBiYW5nZWQgb24gdG8gc2VlCisJICogd2hhdCB0aGUgSVJRIGlzLgorIAkgKgorCSAqIFRoaXMgYmFuZ2luZyBkb2Vzbid0IGFsd2F5cyBkZXRlY3QgdGhlIElSUSwgZm9yIHVua25vd24gcmVhc29ucy4KKwkgKiBhIHdvcmthcm91bmQgaXMgdG8gcmVzZXQgdGhlIGNoaXAgYW5kIHRyeSBhZ2Fpbi4KKwkgKgorCSAqIEludGVyZXN0aW5nbHksIHRoZSBET1MgcGFja2V0IGRyaXZlciAqU0VUUyogdGhlIElSUSBvbiB0aGUgY2FyZCB0bworCSAqIGJlIHdoYXQgaXMgcmVxdWVzdGVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICAgSSBkb24ndCBkbyB0aGF0LCBtb3N0bHkKKwkgKiBiZWNhdXNlIHRoZSBjYXJkIHRoYXQgSSBoYXZlIHVzZXMgYSBub24tc3RhbmRhcmQgbWV0aG9kIG9mIGFjY2Vzc2luZworCSAqIHRoZSBJUlFzLCBhbmQgYmVjYXVzZSB0aGlzIF9zaG91bGRfIHdvcmsgaW4gbW9zdCBjb25maWd1cmF0aW9ucy4KKwkgKgorCSAqIFNwZWNpZnlpbmcgYW4gSVJRIGlzIGRvbmUgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSB1c2VyIGtub3dzCisJICogd2hhdCAocyloZSBpcyBkb2luZy4gIE5vIGNoZWNraW5nIGlzIGRvbmUhISEhCisJICovCisJaWYgKGRldi0+aXJxIDwgMSkgeworCQlpbnQgdHJpYWxzOworCisJCXRyaWFscyA9IDM7CisJCXdoaWxlICh0cmlhbHMtLSkgeworCQkJZGV2LT5pcnEgPSBzbWNfZmluZGlycShpb2FkZHIpOworCQkJaWYgKGRldi0+aXJxKQorCQkJCWJyZWFrOworCQkJLyoga2ljayB0aGUgY2FyZCBhbmQgdHJ5IGFnYWluICovCisJCQlzbWNfcmVzZXQoZGV2KTsKKwkJfQorCX0KKwlpZiAoZGV2LT5pcnEgPT0gMCkgeworCQlwcmludGsoIiVzOiBDb3VsZG4ndCBhdXRvZGV0ZWN0IHlvdXIgSVJRLiBVc2UgaXJxPXh4LlxuIiwKKwkJCWRldi0+bmFtZSk7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisJZGV2LT5pcnEgPSBpcnFfY2Fub25pY2FsaXplKGRldi0+aXJxKTsKKworCS8qIEZpbGwgaW4gdGhlIGZpZWxkcyBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSB3aXRoIGV0aGVybmV0IHZhbHVlcy4gKi8KKwlldGhlcl9zZXR1cChkZXYpOworCisJZGV2LT5vcGVuID0gc21jX29wZW47CisJZGV2LT5zdG9wID0gc21jX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gc21jX2hhcmRfc3RhcnRfeG1pdDsKKwlkZXYtPnR4X3RpbWVvdXQgPSBzbWNfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gbXNlY3NfdG9famlmZmllcyh3YXRjaGRvZyk7CisJZGV2LT5nZXRfc3RhdHMgPSBzbWNfcXVlcnlfc3RhdGlzdGljczsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHNtY19zZXRfbXVsdGljYXN0X2xpc3Q7CisJZGV2LT5ldGh0b29sX29wcyA9ICZzbWNfZXRodG9vbF9vcHM7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IHNtY19wb2xsX2NvbnRyb2xsZXI7CisjZW5kaWYKKworCXRhc2tsZXRfaW5pdCgmbHAtPnR4X3Rhc2ssIHNtY19oYXJkd2FyZV9zZW5kX3BrdCwgKHVuc2lnbmVkIGxvbmcpZGV2KTsKKwlJTklUX1dPUksoJmxwLT5waHlfY29uZmlndXJlLCBzbWNfcGh5X2NvbmZpZ3VyZSwgZGV2KTsKKwlscC0+bWlpLnBoeV9pZF9tYXNrID0gMHgxZjsKKwlscC0+bWlpLnJlZ19udW1fbWFzayA9IDB4MWY7CisJbHAtPm1paS5mb3JjZV9tZWRpYSA9IDA7CisJbHAtPm1paS5mdWxsX2R1cGxleCA9IDA7CisJbHAtPm1paS5kZXYgPSBkZXY7CisJbHAtPm1paS5tZGlvX3JlYWQgPSBzbWNfcGh5X3JlYWQ7CisJbHAtPm1paS5tZGlvX3dyaXRlID0gc21jX3BoeV93cml0ZTsKKworCS8qCisJICogTG9jYXRlIHRoZSBwaHksIGlmIGFueS4KKwkgKi8KKwlpZiAobHAtPnZlcnNpb24gPj0gKENISVBfOTExMDAgPDwgNCkpCisJCXNtY19waHlfZGV0ZWN0KGRldik7CisKKwkvKiBTZXQgZGVmYXVsdCBwYXJhbWV0ZXJzICovCisJbHAtPm1zZ19lbmFibGUgPSBORVRJRl9NU0dfTElOSzsKKwlscC0+Y3RsX3JmZHVwbHggPSAwOworCWxwLT5jdGxfcnNwZWVkID0gMTA7CisKKwlpZiAobHAtPnZlcnNpb24gPj0gKENISVBfOTExMDAgPDwgNCkpIHsKKwkJbHAtPmN0bF9yZmR1cGx4ID0gMTsKKwkJbHAtPmN0bF9yc3BlZWQgPSAxMDA7CisJfQorCisJLyogR3JhYiB0aGUgSVJRICovCisgICAgICAJcmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZzbWNfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldik7CisgICAgICAJaWYgKHJldHZhbCkKKyAgICAgIAkJZ290byBlcnJfb3V0OworCisJc2V0X2lycV90eXBlKGRldi0+aXJxLCBJUlFUX1JJU0lORyk7CisKKyNpZmRlZiBTTUNfVVNFX1BYQV9ETUEKKwl7CisJCWludCBkbWEgPSBweGFfcmVxdWVzdF9kbWEoZGV2LT5uYW1lLCBETUFfUFJJT19MT1csCisJCQkJCSAgc21jX3B4YV9kbWFfaXJxLCBOVUxMKTsKKwkJaWYgKGRtYSA+PSAwKQorCQkJZGV2LT5kbWEgPSBkbWE7CisJfQorI2VuZGlmCisKKwlyZXR2YWwgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0dmFsID09IDApIHsKKwkJLyogbm93LCBwcmludCBvdXQgdGhlIGNhcmQgaW5mbywgaW4gYSBzaG9ydCBmb3JtYXQuLiAqLworCQlwcmludGsoIiVzOiAlcyAocmV2ICVkKSBhdCAlcCBJUlEgJWQiLAorCQkJZGV2LT5uYW1lLCB2ZXJzaW9uX3N0cmluZywgcmV2aXNpb25fcmVnaXN0ZXIgJiAweDBmLAorCQkJbHAtPmJhc2UsIGRldi0+aXJxKTsKKworCQlpZiAoZGV2LT5kbWEgIT0gKHVuc2lnbmVkIGNoYXIpLTEpCisJCQlwcmludGsoIiBETUEgJWQiLCBkZXYtPmRtYSk7CisKKwkJcHJpbnRrKCIlcyVzXG4iLCBub3dhaXQgPyAiIFtub3dhaXRdIiA6ICIiLAorCQkJVEhST1RUTEVfVFhfUEtUUyA/ICIgW3Rocm90dGxlX3R4XSIgOiAiIik7CisKKwkJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKSB7CisJCQlwcmludGsoIiVzOiBJbnZhbGlkIGV0aGVybmV0IE1BQyBhZGRyZXNzLiAgUGxlYXNlICIKKwkJCSAgICAgICAic2V0IHVzaW5nIGlmY29uZmlnXG4iLCBkZXYtPm5hbWUpOworCQl9IGVsc2UgeworCQkJLyogUHJpbnQgdGhlIEV0aGVybmV0IGFkZHJlc3MgKi8KKwkJCXByaW50aygiJXM6IEV0aGVybmV0IGFkZHI6ICIsIGRldi0+bmFtZSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQkJCXByaW50aygiJTIuMng6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJCQlwcmludGsoIiUyLjJ4XG4iLCBkZXYtPmRldl9hZGRyWzVdKTsKKwkJfQorCisJCWlmIChscC0+cGh5X3R5cGUgPT0gMCkgeworCQkJUFJJTlRLKCIlczogTm8gUEhZIGZvdW5kXG4iLCBkZXYtPm5hbWUpOworCQl9IGVsc2UgaWYgKChscC0+cGh5X3R5cGUgJiAweGZmZmZmZmYwKSA9PSAweDAwMTZmODQwKSB7CisJCQlQUklOVEsoIiVzOiBQSFkgTEFOODNDMTgzIChMQU45MUMxMTEgSW50ZXJuYWwpXG4iLCBkZXYtPm5hbWUpOworCQl9IGVsc2UgaWYgKChscC0+cGh5X3R5cGUgJiAweGZmZmZmZmYwKSA9PSAweDAyODIxYzUwKSB7CisJCQlQUklOVEsoIiVzOiBQSFkgTEFOODNDMTgwXG4iLCBkZXYtPm5hbWUpOworCQl9CisJfQorCitlcnJfb3V0OgorI2lmZGVmIFNNQ19VU0VfUFhBX0RNQQorCWlmIChyZXR2YWwgJiYgZGV2LT5kbWEgIT0gKHVuc2lnbmVkIGNoYXIpLTEpCisJCXB4YV9mcmVlX2RtYShkZXYtPmRtYSk7CisjZW5kaWYKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHNtY19lbmFibGVfZGV2aWNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIGVjb3IsIGVjc3I7CisJdm9pZCBfX2lvbWVtICphZGRyOworCXN0cnVjdCByZXNvdXJjZSAqIHJlczsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJzbWM5MXgtYXR0cmliIik7CisJaWYgKCFyZXMpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBNYXAgdGhlIGF0dHJpYnV0ZSBzcGFjZS4gIFRoaXMgaXMgb3ZlcmtpbGwsIGJ1dCBjbGVhbi4KKwkgKi8KKwlhZGRyID0gaW9yZW1hcChyZXMtPnN0YXJ0LCBBVFRSSUJfU0laRSk7CisJaWYgKCFhZGRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qCisJICogUmVzZXQgdGhlIGRldmljZS4gIFdlIG11c3QgZGlzYWJsZSBJUlFzIGFyb3VuZCB0aGlzCisJICogc2luY2UgYSByZXNldCBjYXVzZXMgdGhlIElSUSBsaW5lIGJlY29tZSBhY3RpdmUuCisJICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWVjb3IgPSByZWFkYihhZGRyICsgKEVDT1IgPDwgU01DX0lPX1NISUZUKSkgJiB+RUNPUl9SRVNFVDsKKwl3cml0ZWIoZWNvciB8IEVDT1JfUkVTRVQsIGFkZHIgKyAoRUNPUiA8PCBTTUNfSU9fU0hJRlQpKTsKKwlyZWFkYihhZGRyICsgKEVDT1IgPDwgU01DX0lPX1NISUZUKSk7CisKKwkvKgorCSAqIFdhaXQgMTAwdXMgZm9yIHRoZSBjaGlwIHRvIHJlc2V0LgorCSAqLworCXVkZWxheSgxMDApOworCisJLyoKKwkgKiBUaGUgZGV2aWNlIHdpbGwgaWdub3JlIGFsbCB3cml0ZXMgdG8gdGhlIGVuYWJsZSBiaXQgd2hpbGUKKwkgKiByZXNldCBpcyBhc3NlcnRlZCwgZXZlbiBpZiB0aGUgcmVzZXQgYml0IGlzIGNsZWFyZWQgaW4gdGhlCisJICogc2FtZSB3cml0ZS4gIE11c3QgY2xlYXIgcmVzZXQgZmlyc3QsIHRoZW4gZW5hYmxlIHRoZSBkZXZpY2UuCisJICovCisJd3JpdGViKGVjb3IsIGFkZHIgKyAoRUNPUiA8PCBTTUNfSU9fU0hJRlQpKTsKKwl3cml0ZWIoZWNvciB8IEVDT1JfRU5BQkxFLCBhZGRyICsgKEVDT1IgPDwgU01DX0lPX1NISUZUKSk7CisKKwkvKgorCSAqIFNldCB0aGUgYXBwcm9wcmlhdGUgYnl0ZS93b3JkIG1vZGUuCisJICovCisJZWNzciA9IHJlYWRiKGFkZHIgKyAoRUNTUiA8PCBTTUNfSU9fU0hJRlQpKSAmIH5FQ1NSX0lPSVM4OworI2lmbmRlZiBTTUNfQ0FOX1VTRV8xNkJJVAorCWVjc3IgfD0gRUNTUl9JT0lTODsKKyNlbmRpZgorCXdyaXRlYihlY3NyLCBhZGRyICsgKEVDU1IgPDwgU01DX0lPX1NISUZUKSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJaW91bm1hcChhZGRyKTsKKworCS8qCisJICogV2FpdCBmb3IgdGhlIGNoaXAgdG8gd2FrZSB1cC4gIFdlIGNvdWxkIHBvbGwgdGhlIGNvbnRyb2wKKwkgKiByZWdpc3RlciBpbiB0aGUgbWFpbiByZWdpc3RlciBzcGFjZSwgYnV0IHRoYXQgaXNuJ3QgbWFwcGVkCisJICogeWV0LiAgV2Uga25vdyB0aGlzIGlzIGdvaW5nIHRvIHRha2UgNzUwdXMuCisJICovCisJbXNsZWVwKDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21jX3JlcXVlc3RfYXR0cmliKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICogcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgInNtYzkxeC1hdHRyaWIiKTsKKworCWlmICghcmVzKQorCQlyZXR1cm4gMDsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIEFUVFJJQl9TSVpFLCBDQVJETkFNRSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc21jX3JlbGVhc2VfYXR0cmliKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICogcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgInNtYzkxeC1hdHRyaWIiKTsKKworCWlmIChyZXMpCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBBVFRSSUJfU0laRSk7Cit9CisKKyNpZmRlZiBTTUNfQ0FOX1VTRV9EQVRBQ1MKK3N0YXRpYyB2b2lkIHNtY19yZXF1ZXN0X2RhdGFjcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKiByZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAic21jOTF4LWRhdGEzMiIpOworCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlpZiAoIXJlcykKKwkJcmV0dXJuOworCisJaWYoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBTTUNfREFUQV9FWFRFTlQsIENBUkROQU1FKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogZmFpbGVkIHRvIHJlcXVlc3QgZGF0YWNzIG1lbW9yeSByZWdpb24uXG4iLCBDQVJETkFNRSk7CisJCXJldHVybjsKKwl9CisKKwlscC0+ZGF0YWNzID0gaW9yZW1hcChyZXMtPnN0YXJ0LCBTTUNfREFUQV9FWFRFTlQpOworfQorCitzdGF0aWMgdm9pZCBzbWNfcmVsZWFzZV9kYXRhY3Moc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKiByZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAic21jOTF4LWRhdGEzMiIpOworCisJaWYgKGxwLT5kYXRhY3MpCisJCWlvdW5tYXAobHAtPmRhdGFjcyk7CisKKwlscC0+ZGF0YWNzID0gTlVMTDsKKworCWlmIChyZXMpCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBTTUNfREFUQV9FWFRFTlQpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHNtY19yZXF1ZXN0X2RhdGFjcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikge30KK3N0YXRpYyB2b2lkIHNtY19yZWxlYXNlX2RhdGFjcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikge30KKyNlbmRpZgorCisvKgorICogc21jX2luaXQodm9pZCkKKyAqICAgSW5wdXQgcGFyYW1ldGVyczoKKyAqCWRldi0+YmFzZV9hZGRyID09IDAsIHRyeSB0byBmaW5kIGFsbCBwb3NzaWJsZSBsb2NhdGlvbnMKKyAqCWRldi0+YmFzZV9hZGRyID4gMHgxZmYsIHRoaXMgaXMgdGhlIGFkZHJlc3MgdG8gY2hlY2sKKyAqCWRldi0+YmFzZV9hZGRyID09IDxhbnl0aGluZyBlbHNlPiwgcmV0dXJuIGZhaWx1cmUgY29kZQorICoKKyAqICAgT3V0cHV0OgorICoJMCAtLT4gdGhlcmUgaXMgYSBkZXZpY2UKKyAqCWFueXRoaW5nIGVsc2UsIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgc21jX2Rydl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXVuc2lnbmVkIGludCBfX2lvbWVtICphZGRyOworCWludCByZXQ7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAic21jOTF4LXJlZ3MiKTsKKwlpZiAoIXJlcykKKwkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIFNNQ19JT19FWFRFTlQsIENBUkROQU1FKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCW5kZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHNtY19sb2NhbCkpOworCWlmICghbmRldikgeworCQlwcmludGsoIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgZGV2aWNlLlxuIiwgQ0FSRE5BTUUpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9yZWxlYXNlX2lvOworCX0KKwlTRVRfTU9EVUxFX09XTkVSKG5kZXYpOworCVNFVF9ORVRERVZfREVWKG5kZXYsIGRldik7CisKKwluZGV2LT5kbWEgPSAodW5zaWduZWQgY2hhciktMTsKKwluZGV2LT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCisJcmV0ID0gc21jX3JlcXVlc3RfYXR0cmliKHBkZXYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2ZyZWVfbmV0ZGV2OworI2lmIGRlZmluZWQoQ09ORklHX1NBMTEwMF9BU1NBQkVUKQorCU5DUl8wIHw9IE5DUl9FTkVUX09TQ19FTjsKKyNlbmRpZgorCXJldCA9IHNtY19lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3JlbGVhc2VfYXR0cmliOworCisJYWRkciA9IGlvcmVtYXAocmVzLT5zdGFydCwgU01DX0lPX0VYVEVOVCk7CisJaWYgKCFhZGRyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3JlbGVhc2VfYXR0cmliOworCX0KKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIG5kZXYpOworCXJldCA9IHNtY19wcm9iZShuZGV2LCBhZGRyKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gb3V0X2lvdW5tYXA7CisjaWZkZWYgU01DX1VTRV9QWEFfRE1BCisJZWxzZSB7CisJCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYobmRldik7CisJCWxwLT5waHlzYWRkciA9IHJlcy0+c3RhcnQ7CisJfQorI2VuZGlmCisKKwlzbWNfcmVxdWVzdF9kYXRhY3MocGRldiwgbmRldik7CisKKwlyZXR1cm4gMDsKKworIG91dF9pb3VubWFwOgorCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCWlvdW5tYXAoYWRkcik7Cisgb3V0X3JlbGVhc2VfYXR0cmliOgorCXNtY19yZWxlYXNlX2F0dHJpYihwZGV2KTsKKyBvdXRfZnJlZV9uZXRkZXY6CisJZnJlZV9uZXRkZXYobmRldik7Cisgb3V0X3JlbGVhc2VfaW86CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIFNNQ19JT19FWFRFTlQpOworIG91dDoKKwlwcmludGsoIiVzOiBub3QgZm91bmQgKCVkKS5cbiIsIENBUkROQU1FLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzbWNfZHJ2X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYobmRldik7CisKKwlmcmVlX2lycShuZGV2LT5pcnEsIG5kZXYpOworCisjaWZkZWYgU01DX1VTRV9QWEFfRE1BCisJaWYgKG5kZXYtPmRtYSAhPSAodW5zaWduZWQgY2hhciktMSkKKwkJcHhhX2ZyZWVfZG1hKG5kZXYtPmRtYSk7CisjZW5kaWYKKwlpb3VubWFwKGxwLT5iYXNlKTsKKworCXNtY19yZWxlYXNlX2RhdGFjcyhwZGV2LG5kZXYpOworCXNtY19yZWxlYXNlX2F0dHJpYihwZGV2KTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJzbWM5MXgtcmVncyIpOworCWlmICghcmVzKQorCQlwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBTTUNfSU9fRVhURU5UKTsKKworCWZyZWVfbmV0ZGV2KG5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21jX2Rydl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIHN0YXRlLCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChuZGV2ICYmIGxldmVsID09IFNVU1BFTkRfRElTQUJMRSkgeworCQlpZiAobmV0aWZfcnVubmluZyhuZGV2KSkgeworCQkJbmV0aWZfZGV2aWNlX2RldGFjaChuZGV2KTsKKwkJCXNtY19zaHV0ZG93bihuZGV2KTsKKwkJCXNtY19waHlfcG93ZXJkb3duKG5kZXYpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNtY19kcnZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGxldmVsKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKG5kZXYgJiYgbGV2ZWwgPT0gUkVTVU1FX0VOQUJMRSkgeworCQlzdHJ1Y3Qgc21jX2xvY2FsICpscCA9IG5ldGRldl9wcml2KG5kZXYpOworCQlzbWNfZW5hYmxlX2RldmljZShwZGV2KTsKKwkJaWYgKG5ldGlmX3J1bm5pbmcobmRldikpIHsKKwkJCXNtY19yZXNldChuZGV2KTsKKwkJCXNtY19lbmFibGUobmRldik7CisJCQlpZiAobHAtPnBoeV90eXBlICE9IDApCisJCQkJc21jX3BoeV9jb25maWd1cmUobmRldik7CisJCQluZXRpZl9kZXZpY2VfYXR0YWNoKG5kZXYpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgc21jX2RyaXZlciA9IHsKKwkubmFtZQkJPSBDQVJETkFNRSwKKwkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUJCT0gc21jX2Rydl9wcm9iZSwKKwkucmVtb3ZlCQk9IHNtY19kcnZfcmVtb3ZlLAorCS5zdXNwZW5kCT0gc21jX2Rydl9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc21jX2Rydl9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzbWNfaW5pdCh2b2lkKQoreworI2lmZGVmIE1PRFVMRQorI2lmZGVmIENPTkZJR19JU0EKKwlpZiAoaW8gPT0gLTEpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgCisJCQkiJXM6IFlvdSBzaG91bGRuJ3QgdXNlIGF1dG8tcHJvYmluZyB3aXRoIGluc21vZCFcbiIsCisJCQlDQVJETkFNRSk7CisjZW5kaWYKKyNlbmRpZgorCisJcmV0dXJuIGRyaXZlcl9yZWdpc3Rlcigmc21jX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbWNfY2xlYW51cCh2b2lkKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZzbWNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc21jX2luaXQpOworbW9kdWxlX2V4aXQoc21jX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21jOTF4LmggYi9kcml2ZXJzL25ldC9zbWM5MXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGQyNjg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc21jOTF4LmgKQEAgLTAsMCArMSwxMDMyIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIC4gc21jOTF4LmggLSBtYWNyb3MgZm9yIFNNU0MncyA5MUM5eC85MUMxeHggc2luZ2xlLWNoaXAgRXRoZXJuZXQgZGV2aWNlLgorIC4KKyAuIENvcHlyaWdodCAoQykgMTk5NiBieSBFcmlrIFN0YWhsbWFuCisgLiBDb3B5cmlnaHQgKEMpIDIwMDEgU3RhbmRhcmQgTWljcm9zeXN0ZW1zIENvcnBvcmF0aW9uCisgLglEZXZlbG9wZWQgYnkgU2ltcGxlIE5ldHdvcmsgTWFnaWMgQ29ycG9yYXRpb24KKyAuIENvcHlyaWdodCAoQykgMjAwMyBNb250YSBWaXN0YSBTb2Z0d2FyZSwgSW5jLgorIC4JVW5pZmllZCBTTUM5MXggZHJpdmVyIGJ5IE5pY29sYXMgUGl0cmUKKyAuCisgLiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIC4gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAuIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgLiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIC4KKyAuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIC4gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAuIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAuIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgLgorIC4gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAuIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgLiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgLgorIC4gSW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoaXMgZmlsZSB3YXMgb2J0YWluZWQgZnJvbSB0aGUgTEFOOTFDMTExCisgLiBtYW51YWwgZnJvbSBTTUMuICBUbyBnZXQgYSBjb3B5LCBpZiB5b3UgcmVhbGx5IHdhbnQgb25lLCB5b3UgY2FuIGZpbmQKKyAuIGluZm9ybWF0aW9uIHVuZGVyIHd3dy5zbXNjLmNvbS4KKyAuCisgLiBBdXRob3JzCisgLglFcmlrIFN0YWhsbWFuCQk8ZXJpa0B2dC5lZHU+CisgLglEYXJpcyBBIE5ldmlsCQk8ZG5ldmlsQHNubWMuY29tPgorIC4JTmljb2xhcyBQaXRyZSAJCTxuaWNvQGNhbS5vcmc+CisgLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZuZGVmIF9TTUM5MVhfSF8KKyNkZWZpbmUgX1NNQzkxWF9IXworCisKKy8qCisgKiBEZWZpbmUgeW91ciBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgYnVzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBoZXJlLgorICovCisKKyNpZglkZWZpbmVkKENPTkZJR19BUkNIX0xVQkJPQ0spCisKKy8qIFdlIGNhbiBvbmx5IGRvIDE2LWJpdCByZWFkcyBhbmQgd3JpdGVzIGluIHRoZSBzdGF0aWMgbWVtb3J5IHNwYWNlLiAqLworI2RlZmluZSBTTUNfQ0FOX1VTRV84QklUCTAKKyNkZWZpbmUgU01DX0NBTl9VU0VfMTZCSVQJMQorI2RlZmluZSBTTUNfQ0FOX1VTRV8zMkJJVAkwCisjZGVmaW5lIFNNQ19OT1dBSVQJCTEKKworLyogVGhlIGZpcnN0IHR3byBhZGRyZXNzIGxpbmVzIGFyZW4ndCBjb25uZWN0ZWQuLi4gKi8KKyNkZWZpbmUgU01DX0lPX1NISUZUCQkyCisKKyNkZWZpbmUgU01DX2ludyhhLCByKQkJcmVhZHcoKGEpICsgKHIpKQorI2RlZmluZSBTTUNfb3V0dyh2LCBhLCByKQl3cml0ZXcodiwgKGEpICsgKHIpKQorI2RlZmluZSBTTUNfaW5zdyhhLCByLCBwLCBsKQlyZWFkc3coKGEpICsgKHIpLCBwLCBsKQorI2RlZmluZSBTTUNfb3V0c3coYSwgciwgcCwgbCkJd3JpdGVzdygoYSkgKyAociksIHAsIGwpCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX1JFRFdPT0RfNSkgfHwgZGVmaW5lZChDT05GSUdfUkVEV09PRF82KQorCisvKiBXZSBjYW4gb25seSBkbyAxNi1iaXQgcmVhZHMgYW5kIHdyaXRlcyBpbiB0aGUgc3RhdGljIG1lbW9yeSBzcGFjZS4gKi8KKyNkZWZpbmUgU01DX0NBTl9VU0VfOEJJVAkwCisjZGVmaW5lIFNNQ19DQU5fVVNFXzE2QklUCTEKKyNkZWZpbmUgU01DX0NBTl9VU0VfMzJCSVQJMAorI2RlZmluZSBTTUNfTk9XQUlUCQkxCisKKyNkZWZpbmUgU01DX0lPX1NISUZUCQkwCisKKyNkZWZpbmUgU01DX2ludyhhLCByKQkJaW5fYmUxNigodm9sYXRpbGUgdTE2ICopKChhKSArIChyKSkpCisjZGVmaW5lIFNNQ19vdXR3KHYsIGEsIHIpCW91dF9iZTE2KCh2b2xhdGlsZSB1MTYgKikoKGEpICsgKHIpKSwgdikKKyNkZWZpbmUgU01DX2luc3coYSwgciwgcCwgbCkgCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJdW5zaWduZWQgbG9uZyBfX3BvcnQgPSAoYSkgKyAocik7CQkJXAorCQl1MTYgKl9fcCA9ICh1MTYgKikocCk7CQkJCQlcCisJCWludCBfX2wgPSAobCk7CQkJCQkJXAorCQlpbnN3KF9fcG9ydCwgX19wLCBfX2wpOwkJCQkJXAorCQl3aGlsZSAoX19sID4gMCkgewkJCQkJXAorCQkJKl9fcCA9IHN3YWIxNigqX19wKTsJCQkJXAorCQkJX19wKys7CQkJCQkJXAorCQkJX19sLS07CQkJCQkJXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBTTUNfb3V0c3coYSwgciwgcCwgbCkgCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJdW5zaWduZWQgbG9uZyBfX3BvcnQgPSAoYSkgKyAocik7CQkJXAorCQl1MTYgKl9fcCA9ICh1MTYgKikocCk7CQkJCQlcCisJCWludCBfX2wgPSAobCk7CQkJCQkJXAorCQl3aGlsZSAoX19sID4gMCkgewkJCQkJXAorCQkJLyogQmVsaWV2ZSBpdCBvciBub3QsIHRoZSBzd2FiIGlzbid0IG5lZWRlZC4gKi8JXAorCQkJb3V0dyggLyogc3dhYjE2ICovICgqX19wKyspLCBfX3BvcnQpOwkJXAorCQkJX19sLS07CQkJCQkJXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBzZXRfaXJxX3R5cGUoaXJxLCB0eXBlKQorCisjZWxpZiBkZWZpbmVkKENPTkZJR19TQTExMDBfUExFQikKKy8qIFdlIGNhbiBvbmx5IGRvIDE2LWJpdCByZWFkcyBhbmQgd3JpdGVzIGluIHRoZSBzdGF0aWMgbWVtb3J5IHNwYWNlLiAqLworI2RlZmluZSBTTUNfQ0FOX1VTRV84QklUCTEKKyNkZWZpbmUgU01DX0NBTl9VU0VfMTZCSVQJMQorI2RlZmluZSBTTUNfQ0FOX1VTRV8zMkJJVAkwCisjZGVmaW5lIFNNQ19JT19TSElGVAkJMAorI2RlZmluZSBTTUNfTk9XQUlUCQkxCisKKyNkZWZpbmUgU01DX2luYihhLCByKQkJaW5iKChhKSArIChyKSkKKyNkZWZpbmUgU01DX2luc2IoYSwgciwgcCwgbCkJaW5zYigoYSkgKyAociksIHAsIChsKSkKKyNkZWZpbmUgU01DX2ludyhhLCByKQkJaW53KChhKSArIChyKSkKKyNkZWZpbmUgU01DX2luc3coYSwgciwgcCwgbCkJaW5zdygoYSkgKyAociksIHAsIGwpCisjZGVmaW5lIFNNQ19vdXRiKHYsIGEsIHIpCW91dGIodiwgKGEpICsgKHIpKQorI2RlZmluZSBTTUNfb3V0c2IoYSwgciwgcCwgbCkJb3V0c2IoKGEpICsgKHIpLCBwLCAobCkpCisjZGVmaW5lIFNNQ19vdXR3KHYsIGEsIHIpCW91dHcodiwgKGEpICsgKHIpKQorI2RlZmluZSBTTUNfb3V0c3coYSwgciwgcCwgbCkJb3V0c3coKGEpICsgKHIpLCBwLCBsKQorCisjZGVmaW5lIHNldF9pcnFfdHlwZShpcnEsIHR5cGUpIGRvIHt9IHdoaWxlICgwKQorCisjZWxpZiBkZWZpbmVkKENPTkZJR19TQTExMDBfQVNTQUJFVCkKKworI2luY2x1ZGUgPGFzbS9hcmNoL25lcG9uc2V0Lmg+CisKKy8qIFdlIGNhbiBvbmx5IGRvIDgtYml0IHJlYWRzIGFuZCB3cml0ZXMgaW4gdGhlIHN0YXRpYyBtZW1vcnkgc3BhY2UuICovCisjZGVmaW5lIFNNQ19DQU5fVVNFXzhCSVQJMQorI2RlZmluZSBTTUNfQ0FOX1VTRV8xNkJJVAkwCisjZGVmaW5lIFNNQ19DQU5fVVNFXzMyQklUCTAKKyNkZWZpbmUgU01DX05PV0FJVAkJMQorCisvKiBUaGUgZmlyc3QgdHdvIGFkZHJlc3MgbGluZXMgYXJlbid0IGNvbm5lY3RlZC4uLiAqLworI2RlZmluZSBTTUNfSU9fU0hJRlQJCTIKKworI2RlZmluZSBTTUNfaW5iKGEsIHIpCQlyZWFkYigoYSkgKyAocikpCisjZGVmaW5lIFNNQ19vdXRiKHYsIGEsIHIpCXdyaXRlYih2LCAoYSkgKyAocikpCisjZGVmaW5lIFNNQ19pbnNiKGEsIHIsIHAsIGwpCXJlYWRzYigoYSkgKyAociksIHAsIChsKSkKKyNkZWZpbmUgU01DX291dHNiKGEsIHIsIHAsIGwpCXdyaXRlc2IoKGEpICsgKHIpLCBwLCAobCkpCisKKyNlbGlmCWRlZmluZWQoQ09ORklHX0FSQ0hfSU5OT0tPTSkgfHwgXAorCWRlZmluZWQoQ09ORklHX01BQ0hfTUFJTlNUT05FKSB8fCBcCisJZGVmaW5lZChDT05GSUdfQVJDSF9QWEFfSURQKSB8fCBcCisJZGVmaW5lZChDT05GSUdfQVJDSF9SQU1TRVMpCisKKyNkZWZpbmUgU01DX0NBTl9VU0VfOEJJVAkxCisjZGVmaW5lIFNNQ19DQU5fVVNFXzE2QklUCTEKKyNkZWZpbmUgU01DX0NBTl9VU0VfMzJCSVQJMQorI2RlZmluZSBTTUNfSU9fU0hJRlQJCTAKKyNkZWZpbmUgU01DX05PV0FJVAkJMQorI2RlZmluZSBTTUNfVVNFX1BYQV9ETUEJCTEKKworI2RlZmluZSBTTUNfaW5iKGEsIHIpCQlyZWFkYigoYSkgKyAocikpCisjZGVmaW5lIFNNQ19pbncoYSwgcikJCXJlYWR3KChhKSArIChyKSkKKyNkZWZpbmUgU01DX2lubChhLCByKQkJcmVhZGwoKGEpICsgKHIpKQorI2RlZmluZSBTTUNfb3V0Yih2LCBhLCByKQl3cml0ZWIodiwgKGEpICsgKHIpKQorI2RlZmluZSBTTUNfb3V0bCh2LCBhLCByKQl3cml0ZWwodiwgKGEpICsgKHIpKQorI2RlZmluZSBTTUNfaW5zbChhLCByLCBwLCBsKQlyZWFkc2woKGEpICsgKHIpLCBwLCBsKQorI2RlZmluZSBTTUNfb3V0c2woYSwgciwgcCwgbCkJd3JpdGVzbCgoYSkgKyAociksIHAsIGwpCisKKy8qIFdlIGFjdHVhbGx5IGNhbid0IHdyaXRlIGhhbGZ3b3JkcyBwcm9wZXJseSBpZiBub3Qgd29yZCBhbGlnbmVkICovCitzdGF0aWMgaW5saW5lIHZvaWQKK1NNQ19vdXR3KHUxNiB2YWwsIHVuc2lnbmVkIGxvbmcgaW9hZGRyLCBpbnQgcmVnKQoreworCWlmIChyZWcgJiAyKSB7CisJCXVuc2lnbmVkIGludCB2ID0gdmFsIDw8IDE2OworCQl2IHw9IHJlYWRsKGlvYWRkciArIChyZWcgJiB+MikpICYgMHhmZmZmOworCQl3cml0ZWwodiwgaW9hZGRyICsgKHJlZyAmIH4yKSk7CisJfSBlbHNlIHsKKwkJd3JpdGV3KHZhbCwgaW9hZGRyICsgcmVnKTsKKwl9Cit9CisKKyNlbGlmCWRlZmluZWQoQ09ORklHX0FSQ0hfT01BUCkKKworLyogV2UgY2FuIG9ubHkgZG8gMTYtYml0IHJlYWRzIGFuZCB3cml0ZXMgaW4gdGhlIHN0YXRpYyBtZW1vcnkgc3BhY2UuICovCisjZGVmaW5lIFNNQ19DQU5fVVNFXzhCSVQJMAorI2RlZmluZSBTTUNfQ0FOX1VTRV8xNkJJVAkxCisjZGVmaW5lIFNNQ19DQU5fVVNFXzMyQklUCTAKKyNkZWZpbmUgU01DX0lPX1NISUZUCQkwCisjZGVmaW5lIFNNQ19OT1dBSVQJCTEKKworI2RlZmluZSBTTUNfaW5iKGEsIHIpCQlyZWFkYigoYSkgKyAocikpCisjZGVmaW5lIFNNQ19vdXRiKHYsIGEsIHIpCXdyaXRlYih2LCAoYSkgKyAocikpCisjZGVmaW5lIFNNQ19pbncoYSwgcikJCXJlYWR3KChhKSArIChyKSkKKyNkZWZpbmUgU01DX291dHcodiwgYSwgcikJd3JpdGV3KHYsIChhKSArIChyKSkKKyNkZWZpbmUgU01DX2luc3coYSwgciwgcCwgbCkJcmVhZHN3KChhKSArIChyKSwgcCwgbCkKKyNkZWZpbmUgU01DX291dHN3KGEsIHIsIHAsIGwpCXdyaXRlc3coKGEpICsgKHIpLCBwLCBsKQorI2RlZmluZSBTTUNfaW5sKGEsIHIpCQlyZWFkbCgoYSkgKyAocikpCisjZGVmaW5lIFNNQ19vdXRsKHYsIGEsIHIpCXdyaXRlbCh2LCAoYSkgKyAocikpCisjZGVmaW5lIFNNQ19pbnNsKGEsIHIsIHAsIGwpCXJlYWRzbCgoYSkgKyAociksIHAsIGwpCisjZGVmaW5lIFNNQ19vdXRzbChhLCByLCBwLCBsKQl3cml0ZXNsKChhKSArIChyKSwgcCwgbCkKKworI2VsaWYJZGVmaW5lZChDT05GSUdfU0hfU0g0MjAyX01JQ1JPREVWKQorCisjZGVmaW5lIFNNQ19DQU5fVVNFXzhCSVQJMAorI2RlZmluZSBTTUNfQ0FOX1VTRV8xNkJJVAkxCisjZGVmaW5lIFNNQ19DQU5fVVNFXzMyQklUCTAKKworI2RlZmluZSBTTUNfaW5iKGEsIHIpCQlpbmIoKGEpICsgKHIpIC0gMHhhMDAwMDAwMCkKKyNkZWZpbmUgU01DX2ludyhhLCByKQkJaW53KChhKSArIChyKSAtIDB4YTAwMDAwMDApCisjZGVmaW5lIFNNQ19pbmwoYSwgcikJCWlubCgoYSkgKyAocikgLSAweGEwMDAwMDAwKQorI2RlZmluZSBTTUNfb3V0Yih2LCBhLCByKQlvdXRiKHYsIChhKSArIChyKSAtIDB4YTAwMDAwMDApCisjZGVmaW5lIFNNQ19vdXR3KHYsIGEsIHIpCW91dHcodiwgKGEpICsgKHIpIC0gMHhhMDAwMDAwMCkKKyNkZWZpbmUgU01DX291dGwodiwgYSwgcikJb3V0bCh2LCAoYSkgKyAocikgLSAweGEwMDAwMDAwKQorI2RlZmluZSBTTUNfaW5zbChhLCByLCBwLCBsKQlpbnNsKChhKSArIChyKSAtIDB4YTAwMDAwMDAsIHAsIGwpCisjZGVmaW5lIFNNQ19vdXRzbChhLCByLCBwLCBsKQlvdXRzbCgoYSkgKyAocikgLSAweGEwMDAwMDAwLCBwLCBsKQorI2RlZmluZSBTTUNfaW5zdyhhLCByLCBwLCBsKQlpbnN3KChhKSArIChyKSAtIDB4YTAwMDAwMDAsIHAsIGwpCisjZGVmaW5lIFNNQ19vdXRzdyhhLCByLCBwLCBsKQlvdXRzdygoYSkgKyAocikgLSAweGEwMDAwMDAwLCBwLCBsKQorCisjZGVmaW5lIHNldF9pcnFfdHlwZShpcnEsIHR5cGUpCWRvIHt9IHdoaWxlKDApCisKKyNlbGlmCWRlZmluZWQoQ09ORklHX0lTQSkKKworI2RlZmluZSBTTUNfQ0FOX1VTRV84QklUCTEKKyNkZWZpbmUgU01DX0NBTl9VU0VfMTZCSVQJMQorI2RlZmluZSBTTUNfQ0FOX1VTRV8zMkJJVAkwCisKKyNkZWZpbmUgU01DX2luYihhLCByKQkJaW5iKChhKSArIChyKSkKKyNkZWZpbmUgU01DX2ludyhhLCByKQkJaW53KChhKSArIChyKSkKKyNkZWZpbmUgU01DX291dGIodiwgYSwgcikJb3V0Yih2LCAoYSkgKyAocikpCisjZGVmaW5lIFNNQ19vdXR3KHYsIGEsIHIpCW91dHcodiwgKGEpICsgKHIpKQorI2RlZmluZSBTTUNfaW5zdyhhLCByLCBwLCBsKQlpbnN3KChhKSArIChyKSwgcCwgbCkKKyNkZWZpbmUgU01DX291dHN3KGEsIHIsIHAsIGwpCW91dHN3KChhKSArIChyKSwgcCwgbCkKKworI2VsaWYgICBkZWZpbmVkKENPTkZJR19NMzJSKQorCisjZGVmaW5lIFNNQ19DQU5fVVNFXzhCSVQJMAorI2RlZmluZSBTTUNfQ0FOX1VTRV8xNkJJVAkxCisjZGVmaW5lIFNNQ19DQU5fVVNFXzMyQklUCTAKKworI2RlZmluZSBTTUNfaW5iKGEsIHIpCQlpbmIoKGEpICsgKHIpIC0gMHhhMDAwMDAwMCkKKyNkZWZpbmUgU01DX2ludyhhLCByKQkJaW53KChhKSArIChyKSAtIDB4YTAwMDAwMDApCisjZGVmaW5lIFNNQ19vdXRiKHYsIGEsIHIpCW91dGIodiwgKGEpICsgKHIpIC0gMHhhMDAwMDAwMCkKKyNkZWZpbmUgU01DX291dHcodiwgYSwgcikJb3V0dyh2LCAoYSkgKyAocikgLSAweGEwMDAwMDAwKQorI2RlZmluZSBTTUNfaW5zdyhhLCByLCBwLCBsKQlpbnN3KChhKSArIChyKSAtIDB4YTAwMDAwMDAsIHAsIGwpCisjZGVmaW5lIFNNQ19vdXRzdyhhLCByLCBwLCBsKQlvdXRzdygoYSkgKyAocikgLSAweGEwMDAwMDAwLCBwLCBsKQorCisjZGVmaW5lIHNldF9pcnFfdHlwZShpcnEsIHR5cGUpCWRvIHt9IHdoaWxlKDApCisKKyNkZWZpbmUgUlBDX0xTQV9ERUZBVUxUCQlSUENfTEVEX1RYX1JYCisjZGVmaW5lIFJQQ19MU0JfREVGQVVMVAkJUlBDX0xFRF8xMDBfMTAKKworI2VsaWYJZGVmaW5lZChDT05GSUdfTUFDSF9MUEQ3QTQwMCkgfHwgZGVmaW5lZChDT05GSUdfTUFDSF9MUEQ3QTQwNCkKKworLyogVGhlIExQRDdBNDBYX0lPQkFSUklFUiBpcyBuZWNlc3NhcnkgdG8gb3ZlcmNvbWUgYSBtaXNtYXRjaCBiZXR3ZWVuCisgKiB0aGUgd2F5IHRoYXQgdGhlIENQVSBoYW5kbGVzIGNoaXAgc2VsZWN0cyBhbmQgdGhlIHdheSB0aGF0IHRoZSBTTUMKKyAqIGNoaXAgZXhwZWN0cyB0aGUgY2hpcCBzZWxlY3QgdG8gb3BlcmF0ZS4gIFJlZmVyIHRvCisgKiBEb2N1bWVudGF0aW9uL2FybS9TaGFycC1MSC9JT0JhcnJpZXIgZm9yIGRldGFpbHMuICBUaGUgcmVhZCBmcm9tCisgKiBJT0JBUlJJRVIgaXMgYSBieXRlIGFzIGEgbGVhc3QtY29tbW9uIGRlbm9taW5hdG9yIG9mIHBvc3NpYmxlCisgKiByZWdpb25zIHRvIHVzZSBhcyB0aGUgYmFycmllci4gIEl0IHdvdWxkIGJlIHdhc3RlZnVsIHRvIHJlYWQgMzIKKyAqIGJpdHMgZnJvbSBhIGJ5dGUgb3JpZW50ZWQgcmVnaW9uLgorICoKKyAqIFRoZXJlIGlzIG5vIGV4cGxpY2l0IHByb3RlY3Rpb24gYWdhaW5zdCBpbnRlcnJ1cHRzIGludGVydmVuaW5nCisgKiBiZXR3ZWVuIHRoZSB3cml0ZXcgYW5kIHRoZSBJT0JBUlJJRVIuICBJbiBTTUMgSVNSIHRoZXJlIGlzIGEKKyAqIHByZWFtYmxlIHRoYXQgcGVyZm9ybXMgYW4gSU9CQVJSSUVSIGluIHRoZSBleHRyZW1lbHkgdW5saWtlbHkgZXZlbnQKKyAqIHRoYXQgdGhlIGRyaXZlciBpbnRlcnJ1cHRzIGl0c2VsZiBiZXR3ZWVuIGEgd3JpdGV3IHRvIHRoZSBjaGlwIGFuCisgKiB0aGUgSU9CQVJSSUVSIHRoYXQgZm9sbG93cyAqYW5kKiB0aGUgY2FjaGUgaXMgbGFyZ2UgZW5vdWdoIHRoYXQgdGhlCisgKiBmaXJzdCBvZmYtY2hpcCBhY2Nlc3Mgd2hpbGUgaGFuZGluZyB0aGUgaW50ZXJydXB0IGlzIHRvIHRoZSBTTUMKKyAqIGNoaXAuICBPdGhlciBkZXZpY2VzIGluIHRoZSBzYW1lIGFkZHJlc3Mgc3BhY2UgYXMgdGhlIFNNQyBjaGlwIG11c3QKKyAqIGJlIGF3YXJlIG9mIHRoZSBwb3RlbnRpYWwgZm9yIHRyb3VibGUgYW5kIHBlcmZvcm0gYSBzaW1pbGFyCisgKiBJT0JBUlJJRVIgb24gZW50cnkgdG8gdGhlaXIgSVNSLgorICovCisKKyNpbmNsdWRlIDxhc20vYXJjaC9jb25zdGFudHMuaD4JLyogSU9CQVJSSUVSX1ZJUlQgKi8KKworI2RlZmluZSBTTUNfQ0FOX1VTRV84QklUCTAKKyNkZWZpbmUgU01DX0NBTl9VU0VfMTZCSVQJMQorI2RlZmluZSBTTUNfQ0FOX1VTRV8zMkJJVAkwCisjZGVmaW5lIFNNQ19OT1dBSVQJCTAKKyNkZWZpbmUgTFBEN0E0MFhfSU9CQVJSSUVSCXJlYWRiIChJT0JBUlJJRVJfVklSVCkKKworI2RlZmluZSBTTUNfaW53KGEscikJCXJlYWR3ICgodm9pZCopICgoYSkgKyAocikpKQorI2RlZmluZSBTTUNfaW5zdyhhLHIscCxsKQlyZWFkc3cgKCh2b2lkKikgKChhKSArIChyKSksIHAsIGwpCisjZGVmaW5lIFNNQ19vdXR3KHYsYSxyKQkgICAgICh7IHdyaXRldyAoKHYpLCAoYSkgKyAocikpOyBMUEQ3QTQwWF9JT0JBUlJJRVI7IH0pCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBTTUNfb3V0c3cgKHVuc2lnbmVkIGxvbmcgYSwgaW50IHIsIHVuc2lnbmVkIGNoYXIqIHAsIGludCBsKQoreworCXVuc2lnbmVkIHNob3J0KiBwcyA9ICh1bnNpZ25lZCBzaG9ydCopIHA7CisJd2hpbGUgKGwtLSA+IDApIHsKKwkJd3JpdGV3ICgqcHMrKywgYSArIHIpOworCQlMUEQ3QTQwWF9JT0JBUlJJRVI7CisJfQorfQorCisjZGVmaW5lIFNNQ19JTlRFUlJVUFRfUFJFQU1CTEUJTFBEN0E0MFhfSU9CQVJSSUVSCisKKyNkZWZpbmUgUlBDX0xTQV9ERUZBVUxUCQlSUENfTEVEX1RYX1JYCisjZGVmaW5lIFJQQ19MU0JfREVGQVVMVAkJUlBDX0xFRF8xMDBfMTAKKworI2Vsc2UKKworI2RlZmluZSBTTUNfQ0FOX1VTRV84QklUCTEKKyNkZWZpbmUgU01DX0NBTl9VU0VfMTZCSVQJMQorI2RlZmluZSBTTUNfQ0FOX1VTRV8zMkJJVAkxCisjZGVmaW5lIFNNQ19OT1dBSVQJCTEKKworI2RlZmluZSBTTUNfaW5iKGEsIHIpCQlyZWFkYigoYSkgKyAocikpCisjZGVmaW5lIFNNQ19pbncoYSwgcikJCXJlYWR3KChhKSArIChyKSkKKyNkZWZpbmUgU01DX2lubChhLCByKQkJcmVhZGwoKGEpICsgKHIpKQorI2RlZmluZSBTTUNfb3V0Yih2LCBhLCByKQl3cml0ZWIodiwgKGEpICsgKHIpKQorI2RlZmluZSBTTUNfb3V0dyh2LCBhLCByKQl3cml0ZXcodiwgKGEpICsgKHIpKQorI2RlZmluZSBTTUNfb3V0bCh2LCBhLCByKQl3cml0ZWwodiwgKGEpICsgKHIpKQorI2RlZmluZSBTTUNfaW5zbChhLCByLCBwLCBsKQlyZWFkc2woKGEpICsgKHIpLCBwLCBsKQorI2RlZmluZSBTTUNfb3V0c2woYSwgciwgcCwgbCkJd3JpdGVzbCgoYSkgKyAociksIHAsIGwpCisKKyNkZWZpbmUgUlBDX0xTQV9ERUZBVUxUCQlSUENfTEVEXzEwMF8xMAorI2RlZmluZSBSUENfTFNCX0RFRkFVTFQJCVJQQ19MRURfVFhfUlgKKworI2VuZGlmCisKKworI2lmZGVmIFNNQ19VU0VfUFhBX0RNQQorLyoKKyAqIExldCdzIHVzZSB0aGUgRE1BIGVuZ2luZSBvbiB0aGUgWFNjYWxlIFBYQTJ4eCBmb3IgUlggcGFja2V0cy4gVGhpcyBpcworICogYWx3YXlzIGhhcHBlbmluZyBpbiBpcnEgY29udGV4dCBzbyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHJhY2VzLiAgVFggaXMKKyAqIGRpZmZlcmVudCBhbmQgcHJvYmFibHkgbm90IHdvcnRoIGl0IGZvciB0aGF0IHJlYXNvbiwgYW5kIG5vdCBhcyBjcml0aWNhbAorICogYXMgUlggd2hpY2ggY2FuIG92ZXJydW4gbWVtb3J5IGFuZCBsb3NlIHBhY2tldHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgorCisjaWZkZWYgU01DX2luc2wKKyN1bmRlZiBTTUNfaW5zbAorI2RlZmluZSBTTUNfaW5zbChhLCByLCBwLCBsKSBcCisJc21jX3B4YV9kbWFfaW5zbChhLCBscC0+cGh5c2FkZHIsIHIsIGRldi0+ZG1hLCBwLCBsKQorc3RhdGljIGlubGluZSB2b2lkCitzbWNfcHhhX2RtYV9pbnNsKHVfbG9uZyBpb2FkZHIsIHVfbG9uZyBwaHlzYWRkciwgaW50IHJlZywgaW50IGRtYSwKKwkJIHVfY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWRtYV9hZGRyX3QgZG1hYnVmOworCisJLyogZmFsbGJhY2sgaWYgbm8gRE1BIGF2YWlsYWJsZSAqLworCWlmIChkbWEgPT0gKHVuc2lnbmVkIGNoYXIpLTEpIHsKKwkJcmVhZHNsKGlvYWRkciArIHJlZywgYnVmLCBsZW4pOworCQlyZXR1cm47CisJfQorCisJLyogNjQgYml0IGFsaWdubWVudCBpcyByZXF1aXJlZCBmb3IgbWVtb3J5IHRvIG1lbW9yeSBETUEgKi8KKwlpZiAoKGxvbmcpYnVmICYgNCkgeworCQkqKCh1MzIgKilidWYpID0gU01DX2lubChpb2FkZHIsIHJlZyk7CisJCWJ1ZiArPSA0OworCQlsZW4tLTsKKwl9CisKKwlsZW4gKj0gNDsKKwlkbWFidWYgPSBkbWFfbWFwX3NpbmdsZShOVUxMLCBidWYsIGxlbiwgRE1BX0ZST01fREVWSUNFKTsKKwlEQ1NSKGRtYSkgPSBEQ1NSX05PREVTQzsKKwlEVEFEUihkbWEpID0gZG1hYnVmOworCURTQURSKGRtYSkgPSBwaHlzYWRkciArIHJlZzsKKwlEQ01EKGRtYSkgPSAoRENNRF9JTkNUUkdBRERSIHwgRENNRF9CVVJTVDMyIHwKKwkJICAgICBEQ01EX1dJRFRINCB8IChEQ01EX0xFTkdUSCAmIGxlbikpOworCURDU1IoZG1hKSA9IERDU1JfTk9ERVNDIHwgRENTUl9SVU47CisJd2hpbGUgKCEoRENTUihkbWEpICYgRENTUl9TVE9QU1RBVEUpKQorCQljcHVfcmVsYXgoKTsKKwlEQ1NSKGRtYSkgPSAwOworCWRtYV91bm1hcF9zaW5nbGUoTlVMTCwgZG1hYnVmLCBsZW4sIERNQV9GUk9NX0RFVklDRSk7Cit9CisjZW5kaWYKKworI2lmZGVmIFNNQ19pbnN3CisjdW5kZWYgU01DX2luc3cKKyNkZWZpbmUgU01DX2luc3coYSwgciwgcCwgbCkgXAorCXNtY19weGFfZG1hX2luc3coYSwgbHAtPnBoeXNhZGRyLCByLCBkZXYtPmRtYSwgcCwgbCkKK3N0YXRpYyBpbmxpbmUgdm9pZAorc21jX3B4YV9kbWFfaW5zdyh1X2xvbmcgaW9hZGRyLCB1X2xvbmcgcGh5c2FkZHIsIGludCByZWcsIGludCBkbWEsCisJCSB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlkbWFfYWRkcl90IGRtYWJ1ZjsKKworCS8qIGZhbGxiYWNrIGlmIG5vIERNQSBhdmFpbGFibGUgKi8KKwlpZiAoZG1hID09ICh1bnNpZ25lZCBjaGFyKS0xKSB7CisJCXJlYWRzdyhpb2FkZHIgKyByZWcsIGJ1ZiwgbGVuKTsKKwkJcmV0dXJuOworCX0KKworCS8qIDY0IGJpdCBhbGlnbm1lbnQgaXMgcmVxdWlyZWQgZm9yIG1lbW9yeSB0byBtZW1vcnkgRE1BICovCisJd2hpbGUgKChsb25nKWJ1ZiAmIDYpIHsKKwkJKigodTE2ICopYnVmKSA9IFNNQ19pbncoaW9hZGRyLCByZWcpOworCQlidWYgKz0gMjsKKwkJbGVuLS07CisJfQorCisJbGVuICo9IDI7CisJZG1hYnVmID0gZG1hX21hcF9zaW5nbGUoTlVMTCwgYnVmLCBsZW4sIERNQV9GUk9NX0RFVklDRSk7CisJRENTUihkbWEpID0gRENTUl9OT0RFU0M7CisJRFRBRFIoZG1hKSA9IGRtYWJ1ZjsKKwlEU0FEUihkbWEpID0gcGh5c2FkZHIgKyByZWc7CisJRENNRChkbWEpID0gKERDTURfSU5DVFJHQUREUiB8IERDTURfQlVSU1QzMiB8CisJCSAgICAgRENNRF9XSURUSDIgfCAoRENNRF9MRU5HVEggJiBsZW4pKTsKKwlEQ1NSKGRtYSkgPSBEQ1NSX05PREVTQyB8IERDU1JfUlVOOworCXdoaWxlICghKERDU1IoZG1hKSAmIERDU1JfU1RPUFNUQVRFKSkKKwkJY3B1X3JlbGF4KCk7CisJRENTUihkbWEpID0gMDsKKwlkbWFfdW5tYXBfc2luZ2xlKE5VTEwsIGRtYWJ1ZiwgbGVuLCBETUFfRlJPTV9ERVZJQ0UpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitzbWNfcHhhX2RtYV9pcnEoaW50IGRtYSwgdm9pZCAqZHVtbXksIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCURDU1IoZG1hKSA9IDA7Cit9CisjZW5kaWYgIC8qIFNNQ19VU0VfUFhBX0RNQSAqLworCisKKy8qIEJlY2F1c2Ugb2YgYmFuayBzd2l0Y2hpbmcsIHRoZSBMQU45MXggdXNlcyBvbmx5IDE2IEkvTyBwb3J0cyAqLworI2lmbmRlZiBTTUNfSU9fU0hJRlQKKyNkZWZpbmUgU01DX0lPX1NISUZUCTAKKyNlbmRpZgorI2RlZmluZSBTTUNfSU9fRVhURU5UCSgxNiA8PCBTTUNfSU9fU0hJRlQpCisjZGVmaW5lIFNNQ19EQVRBX0VYVEVOVCAoNCkKKworLyoKKyAuIEJhbmsgU2VsZWN0IFJlZ2lzdGVyOgorIC4KKyAuCQl5eXl5IHl5eXkgMDAwMCAwMHh4CisgLgkJeHggCQk9IGJhbmsgbnVtYmVyCisgLgkJeXl5eSB5eXl5CT0gMHgzMywgZm9yIGlkZW50aWZpY2F0aW9uIHB1cnBvc2VzLgorKi8KKyNkZWZpbmUgQkFOS19TRUxFQ1QJCSgxNCA8PCBTTUNfSU9fU0hJRlQpCisKKworLy8gVHJhbnNtaXQgQ29udHJvbCBSZWdpc3RlcgorLyogQkFOSyAwICAqLworI2RlZmluZSBUQ1JfUkVHIAlTTUNfUkVHKDB4MDAwMCwgMCkKKyNkZWZpbmUgVENSX0VOQUJMRQkweDAwMDEJLy8gV2hlbiAxIHdlIGNhbiB0cmFuc21pdAorI2RlZmluZSBUQ1JfTE9PUAkweDAwMDIJLy8gQ29udHJvbHMgb3V0cHV0IHBpbiBMQksKKyNkZWZpbmUgVENSX0ZPUkNPTAkweDAwMDQJLy8gV2hlbiAxIHdpbGwgZm9yY2UgYSBjb2xsaXNpb24KKyNkZWZpbmUgVENSX1BBRF9FTgkweDAwODAJLy8gV2hlbiAxIHdpbGwgcGFkIHR4IGZyYW1lcyA8IDY0IGJ5dGVzIHcvMAorI2RlZmluZSBUQ1JfTk9DUkMJMHgwMTAwCS8vIFdoZW4gMSB3aWxsIG5vdCBhcHBlbmQgQ1JDIHRvIHR4IGZyYW1lcworI2RlZmluZSBUQ1JfTU9OX0NTTgkweDA0MDAJLy8gV2hlbiAxIHR4IG1vbml0b3JzIGNhcnJpZXIKKyNkZWZpbmUgVENSX0ZEVVBMWCAgICAJMHgwODAwICAvLyBXaGVuIDEgZW5hYmxlcyBmdWxsIGR1cGxleCBvcGVyYXRpb24KKyNkZWZpbmUgVENSX1NUUF9TUUVUCTB4MTAwMAkvLyBXaGVuIDEgc3RvcHMgdHggaWYgU2lnbmFsIFF1YWxpdHkgRXJyb3IKKyNkZWZpbmUgVENSX0VQSF9MT09QCTB4MjAwMAkvLyBXaGVuIDEgZW5hYmxlcyBFUEggYmxvY2sgbG9vcGJhY2sKKyNkZWZpbmUgVENSX1NXRkRVUAkweDgwMDAJLy8gV2hlbiAxIGVuYWJsZXMgU3dpdGNoZWQgRnVsbCBEdXBsZXggbW9kZQorCisjZGVmaW5lIFRDUl9DTEVBUgkwCS8qIGRvIE5PVEhJTkcgKi8KKy8qIHRoZSBkZWZhdWx0IHNldHRpbmdzIGZvciB0aGUgVENSIHJlZ2lzdGVyIDogKi8KKyNkZWZpbmUgVENSX0RFRkFVTFQJKFRDUl9FTkFCTEUgfCBUQ1JfUEFEX0VOKQorCisKKy8vIEVQSCBTdGF0dXMgUmVnaXN0ZXIKKy8qIEJBTksgMCAgKi8KKyNkZWZpbmUgRVBIX1NUQVRVU19SRUcJU01DX1JFRygweDAwMDIsIDApCisjZGVmaW5lIEVTX1RYX1NVQwkweDAwMDEJLy8gTGFzdCBUWCB3YXMgc3VjY2Vzc2Z1bAorI2RlZmluZSBFU19TTkdMX0NPTAkweDAwMDIJLy8gU2luZ2xlIGNvbGxpc2lvbiBkZXRlY3RlZCBmb3IgbGFzdCB0eAorI2RlZmluZSBFU19NVUxfQ09MCTB4MDAwNAkvLyBNdWx0aXBsZSBjb2xsaXNpb25zIGRldGVjdGVkIGZvciBsYXN0IHR4CisjZGVmaW5lIEVTX0xUWF9NVUxUCTB4MDAwOAkvLyBMYXN0IHR4IHdhcyBhIG11bHRpY2FzdAorI2RlZmluZSBFU18xNkNPTAkweDAwMTAJLy8gMTYgQ29sbGlzaW9ucyBSZWFjaGVkCisjZGVmaW5lIEVTX1NRRVQJCTB4MDAyMAkvLyBTaWduYWwgUXVhbGl0eSBFcnJvciBUZXN0CisjZGVmaW5lIEVTX0xUWEJSRAkweDAwNDAJLy8gTGFzdCB0eCB3YXMgYSBicm9hZGNhc3QKKyNkZWZpbmUgRVNfVFhERUZSCTB4MDA4MAkvLyBUcmFuc21pdCBEZWZlcnJlZAorI2RlZmluZSBFU19MQVRDT0wJMHgwMjAwCS8vIExhdGUgY29sbGlzaW9uIGRldGVjdGVkIG9uIGxhc3QgdHgKKyNkZWZpbmUgRVNfTE9TVENBUlIJMHgwNDAwCS8vIExvc3QgQ2FycmllciBTZW5zZQorI2RlZmluZSBFU19FWENfREVGCTB4MDgwMAkvLyBFeGNlc3NpdmUgRGVmZXJyYWwKKyNkZWZpbmUgRVNfQ1RSX1JPTAkweDEwMDAJLy8gQ291bnRlciBSb2xsIE92ZXIgaW5kaWNhdGlvbgorI2RlZmluZSBFU19MSU5LX09LCTB4NDAwMAkvLyBEcml2ZW4gYnkgaW52ZXJ0ZWQgdmFsdWUgb2YgbkxOSyBwaW4KKyNkZWZpbmUgRVNfVFhVTlJOCTB4ODAwMAkvLyBUeCBVbmRlcnJ1bgorCisKKy8vIFJlY2VpdmUgQ29udHJvbCBSZWdpc3RlcgorLyogQkFOSyAwICAqLworI2RlZmluZSBSQ1JfUkVHCQlTTUNfUkVHKDB4MDAwNCwgMCkKKyNkZWZpbmUgUkNSX1JYX0FCT1JUCTB4MDAwMQkvLyBTZXQgaWYgYSByeCBmcmFtZSB3YXMgYWJvcnRlZAorI2RlZmluZSBSQ1JfUFJNUwkweDAwMDIJLy8gRW5hYmxlIHByb21pc2N1b3VzIG1vZGUKKyNkZWZpbmUgUkNSX0FMTVVMCTB4MDAwNAkvLyBXaGVuIHNldCBhY2NlcHRzIGFsbCBtdWx0aWNhc3QgZnJhbWVzCisjZGVmaW5lIFJDUl9SWEVOCTB4MDEwMAkvLyBJRkYgdGhpcyBpcyBzZXQsIHdlIGNhbiByZWNlaXZlIHBhY2tldHMKKyNkZWZpbmUgUkNSX1NUUklQX0NSQwkweDAyMDAJLy8gV2hlbiBzZXQgc3RyaXBzIENSQyBmcm9tIHJ4IHBhY2tldHMKKyNkZWZpbmUgUkNSX0FCT1JUX0VOQgkweDAyMDAJLy8gV2hlbiBzZXQgd2lsbCBhYm9ydCByeCBvbiBjb2xsaXNpb24KKyNkZWZpbmUgUkNSX0ZJTFRfQ0FSCTB4MDQwMAkvLyBXaGVuIHNldCBmaWx0ZXJzIGxlYWRpbmcgMTIgYml0IHMgb2YgY2FycmllcgorI2RlZmluZSBSQ1JfU09GVFJTVAkweDgwMDAgCS8vIHJlc2V0cyB0aGUgY2hpcAorCisvKiB0aGUgbm9ybWFsIHNldHRpbmdzIGZvciB0aGUgUkNSIHJlZ2lzdGVyIDogKi8KKyNkZWZpbmUgUkNSX0RFRkFVTFQJKFJDUl9TVFJJUF9DUkMgfCBSQ1JfUlhFTikKKyNkZWZpbmUgUkNSX0NMRUFSCTB4MAkvLyBzZXQgaXQgdG8gYSBiYXNlIHN0YXRlCisKKworLy8gQ291bnRlciBSZWdpc3RlcgorLyogQkFOSyAwICAqLworI2RlZmluZSBDT1VOVEVSX1JFRwlTTUNfUkVHKDB4MDAwNiwgMCkKKworCisvLyBNZW1vcnkgSW5mb3JtYXRpb24gUmVnaXN0ZXIKKy8qIEJBTksgMCAgKi8KKyNkZWZpbmUgTUlSX1JFRwkJU01DX1JFRygweDAwMDgsIDApCisKKworLy8gUmVjZWl2ZS9QaHkgQ29udHJvbCBSZWdpc3RlcgorLyogQkFOSyAwICAqLworI2RlZmluZSBSUENfUkVHCQlTTUNfUkVHKDB4MDAwQSwgMCkKKyNkZWZpbmUgUlBDX1NQRUVECTB4MjAwMAkvLyBXaGVuIDEgUEhZIGlzIGluIDEwME1icHMgbW9kZS4KKyNkZWZpbmUgUlBDX0RQTFgJMHgxMDAwCS8vIFdoZW4gMSBQSFkgaXMgaW4gRnVsbC1EdXBsZXggTW9kZQorI2RlZmluZSBSUENfQU5FRwkweDA4MDAJLy8gV2hlbiAxIFBIWSBpcyBpbiBBdXRvLU5lZ290aWF0ZSBNb2RlCisjZGVmaW5lIFJQQ19MU1hBX1NIRlQJNQkvLyBCaXRzIHRvIHNoaWZ0IExTMkEsTFMxQSxMUzBBIHRvIGxzYgorI2RlZmluZSBSUENfTFNYQl9TSEZUCTIJLy8gQml0cyB0byBnZXQgTFMyQixMUzFCLExTMEIgdG8gbHNiCisjZGVmaW5lIFJQQ19MRURfMTAwXzEwCSgweDAwKQkvLyBMRUQgPSAxMDBNYnBzIE9SJ3Mgd2l0aCAxME1icHMgbGluayBkZXRlY3QKKyNkZWZpbmUgUlBDX0xFRF9SRVMJKDB4MDEpCS8vIExFRCA9IFJlc2VydmVkCisjZGVmaW5lIFJQQ19MRURfMTAJKDB4MDIpCS8vIExFRCA9IDEwTWJwcyBsaW5rIGRldGVjdAorI2RlZmluZSBSUENfTEVEX0ZECSgweDAzKQkvLyBMRUQgPSBGdWxsIER1cGxleCBNb2RlCisjZGVmaW5lIFJQQ19MRURfVFhfUlgJKDB4MDQpCS8vIExFRCA9IFRYIG9yIFJYIHBhY2tldCBvY2N1cnJlZAorI2RlZmluZSBSUENfTEVEXzEwMAkoMHgwNSkJLy8gTEVEID0gMTAwTWJwcyBsaW5rIGRlY3RlY3QKKyNkZWZpbmUgUlBDX0xFRF9UWAkoMHgwNikJLy8gTEVEID0gVFggcGFja2V0IG9jY3VycmVkCisjZGVmaW5lIFJQQ19MRURfUlgJKDB4MDcpCS8vIExFRCA9IFJYIHBhY2tldCBvY2N1cnJlZAorCisjaWZuZGVmIFJQQ19MU0FfREVGQVVMVAorI2RlZmluZSBSUENfTFNBX0RFRkFVTFQJUlBDX0xFRF8xMDAKKyNlbmRpZgorI2lmbmRlZiBSUENfTFNCX0RFRkFVTFQKKyNkZWZpbmUgUlBDX0xTQl9ERUZBVUxUIFJQQ19MRURfRkQKKyNlbmRpZgorCisjZGVmaW5lIFJQQ19ERUZBVUxUIChSUENfQU5FRyB8IChSUENfTFNBX0RFRkFVTFQgPDwgUlBDX0xTWEFfU0hGVCkgfCAoUlBDX0xTQl9ERUZBVUxUIDw8IFJQQ19MU1hCX1NIRlQpIHwgUlBDX1NQRUVEIHwgUlBDX0RQTFgpCisKKworLyogQmFuayAwIDB4MEMgaXMgcmVzZXJ2ZWQgKi8KKworLy8gQmFuayBTZWxlY3QgUmVnaXN0ZXIKKy8qIEFsbCBCYW5rcyAqLworI2RlZmluZSBCU1JfUkVHCQkweDAwMEUKKworCisvLyBDb25maWd1cmF0aW9uIFJlZworLyogQkFOSyAxICovCisjZGVmaW5lIENPTkZJR19SRUcJU01DX1JFRygweDAwMDAsCTEpCisjZGVmaW5lIENPTkZJR19FWFRfUEhZCTB4MDIwMAkvLyAxPWV4dGVybmFsIE1JSSwgMD1pbnRlcm5hbCBQaHkKKyNkZWZpbmUgQ09ORklHX0dQQ05UUkwJMHgwNDAwCS8vIEludmVyc2UgdmFsdWUgZHJpdmVzIHBpbiBuQ05UUkwKKyNkZWZpbmUgQ09ORklHX05PX1dBSVQJMHgxMDAwCS8vIFdoZW4gMSBubyBleHRyYSB3YWl0IHN0YXRlcyBvbiBJU0EgYnVzCisjZGVmaW5lIENPTkZJR19FUEhfUE9XRVJfRU4gMHg4MDAwIC8vIFdoZW4gMCBFUEggaXMgcGxhY2VkIGludG8gbG93IHBvd2VyIG1vZGUuCisKKy8vIERlZmF1bHQgaXMgcG93ZXJlZC11cCwgSW50ZXJuYWwgUGh5LCBXYWl0IFN0YXRlcywgYW5kIHBpbiBuQ05UUkw9bG93CisjZGVmaW5lIENPTkZJR19ERUZBVUxUCShDT05GSUdfRVBIX1BPV0VSX0VOKQorCisKKy8vIEJhc2UgQWRkcmVzcyBSZWdpc3RlcgorLyogQkFOSyAxICovCisjZGVmaW5lIEJBU0VfUkVHCVNNQ19SRUcoMHgwMDAyLCAxKQorCisKKy8vIEluZGl2aWR1YWwgQWRkcmVzcyBSZWdpc3RlcnMKKy8qIEJBTksgMSAqLworI2RlZmluZSBBRERSMF9SRUcJU01DX1JFRygweDAwMDQsIDEpCisjZGVmaW5lIEFERFIxX1JFRwlTTUNfUkVHKDB4MDAwNiwgMSkKKyNkZWZpbmUgQUREUjJfUkVHCVNNQ19SRUcoMHgwMDA4LCAxKQorCisKKy8vIEdlbmVyYWwgUHVycG9zZSBSZWdpc3RlcgorLyogQkFOSyAxICovCisjZGVmaW5lIEdQX1JFRwkJU01DX1JFRygweDAwMEEsIDEpCisKKworLy8gQ29udHJvbCBSZWdpc3RlcgorLyogQkFOSyAxICovCisjZGVmaW5lIENUTF9SRUcJCVNNQ19SRUcoMHgwMDBDLCAxKQorI2RlZmluZSBDVExfUkNWX0JBRAkweDQwMDAgLy8gV2hlbiAxIGJhZCBDUkMgcGFja2V0cyBhcmUgcmVjZWl2ZWQKKyNkZWZpbmUgQ1RMX0FVVE9fUkVMRUFTRSAweDA4MDAgLy8gV2hlbiAxIHR4IHBhZ2VzIGFyZSByZWxlYXNlZCBhdXRvbWF0aWNhbGx5CisjZGVmaW5lIENUTF9MRV9FTkFCTEUJMHgwMDgwIC8vIFdoZW4gMSBlbmFibGVzIExpbmsgRXJyb3IgaW50ZXJydXB0CisjZGVmaW5lIENUTF9DUl9FTkFCTEUJMHgwMDQwIC8vIFdoZW4gMSBlbmFibGVzIENvdW50ZXIgUm9sbG92ZXIgaW50ZXJydXB0CisjZGVmaW5lIENUTF9URV9FTkFCTEUJMHgwMDIwIC8vIFdoZW4gMSBlbmFibGVzIFRyYW5zbWl0IEVycm9yIGludGVycnVwdAorI2RlZmluZSBDVExfRUVQUk9NX1NFTEVDVCAweDAwMDQgLy8gQ29udHJvbHMgRUVQUk9NIHJlbG9hZCAmIHN0b3JlCisjZGVmaW5lIENUTF9SRUxPQUQJMHgwMDAyIC8vIFdoZW4gc2V0IHJlYWRzIEVFUFJPTSBpbnRvIHJlZ2lzdGVycworI2RlZmluZSBDVExfU1RPUkUJMHgwMDAxIC8vIFdoZW4gc2V0IHN0b3JlcyByZWdpc3RlcnMgaW50byBFRVBST00KKworCisvLyBNTVUgQ29tbWFuZCBSZWdpc3RlcgorLyogQkFOSyAyICovCisjZGVmaW5lIE1NVV9DTURfUkVHCVNNQ19SRUcoMHgwMDAwLCAyKQorI2RlZmluZSBNQ19CVVNZCQkxCS8vIFdoZW4gMSB0aGUgbGFzdCByZWxlYXNlIGhhcyBub3QgY29tcGxldGVkCisjZGVmaW5lIE1DX05PUAkJKDA8PDUpCS8vIE5vIE9wCisjZGVmaW5lIE1DX0FMTE9DCSgxPDw1KSAJLy8gT1Igd2l0aCBudW1iZXIgb2YgMjU2IGJ5dGUgcGFja2V0cworI2RlZmluZSBNQ19SRVNFVAkoMjw8NSkJLy8gUmVzZXQgTU1VIHRvIGluaXRpYWwgc3RhdGUKKyNkZWZpbmUgTUNfUkVNT1ZFCSgzPDw1KSAJLy8gUmVtb3ZlIHRoZSBjdXJyZW50IHJ4IHBhY2tldAorI2RlZmluZSBNQ19SRUxFQVNFICAJKDQ8PDUpIAkvLyBSZW1vdmUgYW5kIHJlbGVhc2UgdGhlIGN1cnJlbnQgcnggcGFja2V0CisjZGVmaW5lIE1DX0ZSRUVQS1QgIAkoNTw8NSkgCS8vIFJlbGVhc2UgcGFja2V0IGluIFBOUiByZWdpc3RlcgorI2RlZmluZSBNQ19FTlFVRVVFCSg2PDw1KQkvLyBFbnF1ZXVlIHRoZSBwYWNrZXQgZm9yIHRyYW5zbWl0CisjZGVmaW5lIE1DX1JTVFRYRklGTwkoNzw8NSkJLy8gUmVzZXQgdGhlIFRYIEZJRk9zCisKKworLy8gUGFja2V0IE51bWJlciBSZWdpc3RlcgorLyogQkFOSyAyICovCisjZGVmaW5lIFBOX1JFRwkJU01DX1JFRygweDAwMDIsIDIpCisKKworLy8gQWxsb2NhdGlvbiBSZXN1bHQgUmVnaXN0ZXIKKy8qIEJBTksgMiAqLworI2RlZmluZSBBUl9SRUcJCVNNQ19SRUcoMHgwMDAzLCAyKQorI2RlZmluZSBBUl9GQUlMRUQJMHg4MAkvLyBBbG9jYXRpb24gRmFpbGVkCisKKworLy8gVFggRklGTyBQb3J0cyBSZWdpc3RlcgorLyogQkFOSyAyICovCisjZGVmaW5lIFRYRklGT19SRUcJU01DX1JFRygweDAwMDQsIDIpCisjZGVmaW5lIFRYRklGT19URU1QVFkJMHg4MAkvLyBUWCBGSUZPIEVtcHR5CisKKy8vIFJYIEZJRk8gUG9ydHMgUmVnaXN0ZXIKKy8qIEJBTksgMiAqLworI2RlZmluZSBSWEZJRk9fUkVHCVNNQ19SRUcoMHgwMDA1LCAyKQorI2RlZmluZSBSWEZJRk9fUkVNUFRZCTB4ODAJLy8gUlggRklGTyBFbXB0eQorCisjZGVmaW5lIEZJRk9fUkVHCVNNQ19SRUcoMHgwMDA0LCAyKQorCisvLyBQb2ludGVyIFJlZ2lzdGVyCisvKiBCQU5LIDIgKi8KKyNkZWZpbmUgUFRSX1JFRwkJU01DX1JFRygweDAwMDYsIDIpCisjZGVmaW5lIFBUUl9SQ1YJCTB4ODAwMCAvLyAxPVJlY2VpdmUgYXJlYSwgMD1UcmFuc21pdCBhcmVhCisjZGVmaW5lIFBUUl9BVVRPSU5DIAkweDQwMDAgLy8gQXV0byBpbmNyZW1lbnQgdGhlIHBvaW50ZXIgb24gZWFjaCBhY2Nlc3MKKyNkZWZpbmUgUFRSX1JFQUQJMHgyMDAwIC8vIFdoZW4gMSB0aGUgb3BlcmF0aW9uIGlzIGEgcmVhZAorCisKKy8vIERhdGEgUmVnaXN0ZXIKKy8qIEJBTksgMiAqLworI2RlZmluZSBEQVRBX1JFRwlTTUNfUkVHKDB4MDAwOCwgMikKKworCisvLyBJbnRlcnJ1cHQgU3RhdHVzL0Fja25vd2xlZGdlIFJlZ2lzdGVyCisvKiBCQU5LIDIgKi8KKyNkZWZpbmUgSU5UX1JFRwkJU01DX1JFRygweDAwMEMsIDIpCisKKworLy8gSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIKKy8qIEJBTksgMiAqLworI2RlZmluZSBJTV9SRUcJCVNNQ19SRUcoMHgwMDBELCAyKQorI2RlZmluZSBJTV9NRElOVAkweDgwIC8vIFBIWSBNSSBSZWdpc3RlciAxOCBJbnRlcnJ1cHQKKyNkZWZpbmUgSU1fRVJDVl9JTlQJMHg0MCAvLyBFYXJseSBSZWNlaXZlIEludGVycnVwdAorI2RlZmluZSBJTV9FUEhfSU5UCTB4MjAgLy8gU2V0IGJ5IEV0aGVybmV0IFByb3RvY29sIEhhbmRsZXIgc2VjdGlvbgorI2RlZmluZSBJTV9SWF9PVlJOX0lOVAkweDEwIC8vIFNldCBieSBSZWNlaXZlciBPdmVycnVucworI2RlZmluZSBJTV9BTExPQ19JTlQJMHgwOCAvLyBTZXQgd2hlbiBhbGxvY2F0aW9uIHJlcXVlc3QgaXMgY29tcGxldGVkCisjZGVmaW5lIElNX1RYX0VNUFRZX0lOVAkweDA0IC8vIFNldCBpZiB0aGUgVFggRklGTyBnb2VzIGVtcHR5CisjZGVmaW5lIElNX1RYX0lOVAkweDAyIC8vIFRyYW5zbWl0IEludGVycnVwdAorI2RlZmluZSBJTV9SQ1ZfSU5UCTB4MDEgLy8gUmVjZWl2ZSBJbnRlcnJ1cHQKKworCisvLyBNdWx0aWNhc3QgVGFibGUgUmVnaXN0ZXJzCisvKiBCQU5LIDMgKi8KKyNkZWZpbmUgTUNBU1RfUkVHMQlTTUNfUkVHKDB4MDAwMCwgMykKKyNkZWZpbmUgTUNBU1RfUkVHMglTTUNfUkVHKDB4MDAwMiwgMykKKyNkZWZpbmUgTUNBU1RfUkVHMwlTTUNfUkVHKDB4MDAwNCwgMykKKyNkZWZpbmUgTUNBU1RfUkVHNAlTTUNfUkVHKDB4MDAwNiwgMykKKworCisvLyBNYW5hZ2VtZW50IEludGVyZmFjZSBSZWdpc3RlciAoTUlJKQorLyogQkFOSyAzICovCisjZGVmaW5lIE1JSV9SRUcJCVNNQ19SRUcoMHgwMDA4LCAzKQorI2RlZmluZSBNSUlfTVNLX0NSUzEwMAkweDQwMDAgLy8gRGlzYWJsZXMgQ1JTMTAwIGRldGVjdGlvbiBkdXJpbmcgdHggaGFsZiBkdXAKKyNkZWZpbmUgTUlJX01ET0UJMHgwMDA4IC8vIE1JSSBPdXRwdXQgRW5hYmxlCisjZGVmaW5lIE1JSV9NQ0xLCTB4MDAwNCAvLyBNSUkgQ2xvY2ssIHBpbiBNRENMSworI2RlZmluZSBNSUlfTURJCQkweDAwMDIgLy8gTUlJIElucHV0LCBwaW4gTURJCisjZGVmaW5lIE1JSV9NRE8JCTB4MDAwMSAvLyBNSUkgT3V0cHV0LCBwaW4gTURPCisKKworLy8gUmV2aXNpb24gUmVnaXN0ZXIKKy8qIEJBTksgMyAqLworLyogKCBoaTogY2hpcCBpZCAgIGxvdzogcmV2ICMgKSAqLworI2RlZmluZSBSRVZfUkVHCQlTTUNfUkVHKDB4MDAwQSwgMykKKworCisvLyBFYXJseSBSQ1YgUmVnaXN0ZXIKKy8qIEJBTksgMyAqLworLyogdGhpcyBpcyBOT1Qgb24gU01DOTE5MiAqLworI2RlZmluZSBFUkNWX1JFRwlTTUNfUkVHKDB4MDAwQywgMykKKyNkZWZpbmUgRVJDVl9SQ1ZfRElTQ1JECTB4MDA4MCAvLyBXaGVuIDEgZGlzY2FyZHMgYSBwYWNrZXQgYmVpbmcgcmVjZWl2ZWQKKyNkZWZpbmUgRVJDVl9USFJFU0hPTEQJMHgwMDFGIC8vIEVSQ1YgVGhyZXNob2xkIE1hc2sKKworCisvLyBFeHRlcm5hbCBSZWdpc3RlcgorLyogQkFOSyA3ICovCisjZGVmaW5lIEVYVF9SRUcJCVNNQ19SRUcoMHgwMDAwLCA3KQorCisKKyNkZWZpbmUgQ0hJUF85MTkyCTMKKyNkZWZpbmUgQ0hJUF85MTk0CTQKKyNkZWZpbmUgQ0hJUF85MTk1CTUKKyNkZWZpbmUgQ0hJUF85MTk2CTYKKyNkZWZpbmUgQ0hJUF85MTEwMAk3CisjZGVmaW5lIENISVBfOTExMDBGRAk4CisjZGVmaW5lIENISVBfOTExMTFGRAk5CisKK3N0YXRpYyBjb25zdCBjaGFyICogY2hpcF9pZHNbIDE2IF0gPSAgeworCU5VTEwsIE5VTEwsIE5VTEwsCisJLyogMyAqLyAiU01DOTFDOTAvOTFDOTIiLAorCS8qIDQgKi8gIlNNQzkxQzk0IiwKKwkvKiA1ICovICJTTUM5MUM5NSIsCisJLyogNiAqLyAiU01DOTFDOTYiLAorCS8qIDcgKi8gIlNNQzkxQzEwMCIsCisJLyogOCAqLyAiU01DOTFDMTAwRkQiLAorCS8qIDkgKi8gIlNNQzkxQzExeEZEIiwKKwlOVUxMLCBOVUxMLCBOVUxMLAorCU5VTEwsIE5VTEwsIE5VTEx9OworCisKKy8qCisgLiBUcmFuc21pdCBzdGF0dXMgYml0cworKi8KKyNkZWZpbmUgVFNfU1VDQ0VTUyAweDAwMDEKKyNkZWZpbmUgVFNfTE9TVENBUiAweDA0MDAKKyNkZWZpbmUgVFNfTEFUQ09MICAweDAyMDAKKyNkZWZpbmUgVFNfMTZDT0wgICAweDAwMTAKKworLyoKKyAuIFJlY2VpdmUgc3RhdHVzIGJpdHMKKyovCisjZGVmaW5lIFJTX0FMR05FUlIJMHg4MDAwCisjZGVmaW5lIFJTX0JST0RDQVNUCTB4NDAwMAorI2RlZmluZSBSU19CQURDUkMJMHgyMDAwCisjZGVmaW5lIFJTX09EREZSQU1FCTB4MTAwMAorI2RlZmluZSBSU19UT09MT05HCTB4MDgwMAorI2RlZmluZSBSU19UT09TSE9SVAkweDA0MDAKKyNkZWZpbmUgUlNfTVVMVElDQVNUCTB4MDAwMQorI2RlZmluZSBSU19FUlJPUlMJKFJTX0FMR05FUlIgfCBSU19CQURDUkMgfCBSU19UT09MT05HIHwgUlNfVE9PU0hPUlQpCisKKworLyoKKyAqIFBIWSBJRHMKKyAqICBMQU44M0MxODMgPT0gTEFOOTFDMTExIEludGVybmFsIFBIWQorICovCisjZGVmaW5lIFBIWV9MQU44M0MxODMJMHgwMDE2Zjg0MAorI2RlZmluZSBQSFlfTEFOODNDMTgwCTB4MDI4MjFjNTAKKworLyoKKyAqIFBIWSBSZWdpc3RlciBBZGRyZXNzZXMgKExBTjkxQzExMSBJbnRlcm5hbCBQSFkpCisgKgorICogR2VuZXJpYyBQSFkgcmVnaXN0ZXJzIGNhbiBiZSBmb3VuZCBpbiA8bGludXgvbWlpLmg+CisgKgorICogVGhlc2UgcGh5IHJlZ2lzdGVycyBhcmUgc3BlY2lmaWMgdG8gb3VyIG9uLWJvYXJkIHBoeS4KKyAqLworCisvLyBQSFkgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxCisjZGVmaW5lIFBIWV9DRkcxX1JFRwkJMHgxMAorI2RlZmluZSBQSFlfQ0ZHMV9MTktESVMJCTB4ODAwMAkvLyAxPVJ4IExpbmsgRGV0ZWN0IEZ1bmN0aW9uIGRpc2FibGVkCisjZGVmaW5lIFBIWV9DRkcxX1hNVERJUwkJMHg0MDAwCS8vIDE9VFAgVHJhbnNtaXR0ZXIgRGlzYWJsZWQKKyNkZWZpbmUgUEhZX0NGRzFfWE1UUEROCQkweDIwMDAJLy8gMT1UUCBUcmFuc21pdHRlciBQb3dlcmVkIERvd24KKyNkZWZpbmUgUEhZX0NGRzFfQllQU0NSCQkweDA0MDAJLy8gMT1CeXBhc3Mgc2NyYW1ibGVyL2Rlc2NyYW1ibGVyCisjZGVmaW5lIFBIWV9DRkcxX1VOU0NEUwkJMHgwMjAwCS8vIDE9VW5zY3JhbWJsZSBJZGxlIFJlY2VwdGlvbiBEaXNhYmxlCisjZGVmaW5lIFBIWV9DRkcxX0VRTFpSCQkweDAxMDAJLy8gMT1SeCBFcXVhbGl6ZXIgRGlzYWJsZWQKKyNkZWZpbmUgUEhZX0NGRzFfQ0FCTEUJCTB4MDA4MAkvLyAxPVNUUCgxNTBvaG0pLCAwPVVUUCgxMDBvaG0pCisjZGVmaW5lIFBIWV9DRkcxX1JMVkwwCQkweDAwNDAJLy8gMT1SeCBTcXVlbGNoIGxldmVsIHJlZHVjZWQgYnkgNC41ZGIKKyNkZWZpbmUgUEhZX0NGRzFfVExWTF9TSElGVAkyCS8vIFRyYW5zbWl0IE91dHB1dCBMZXZlbCBBZGp1c3QKKyNkZWZpbmUgUEhZX0NGRzFfVExWTF9NQVNLCTB4MDAzQworI2RlZmluZSBQSFlfQ0ZHMV9UUkZfTUFTSwkweDAwMDMJLy8gVHJhbnNtaXR0ZXIgUmlzZS9GYWxsIHRpbWUKKworCisvLyBQSFkgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAyCisjZGVmaW5lIFBIWV9DRkcyX1JFRwkJMHgxMQorI2RlZmluZSBQSFlfQ0ZHMl9BUE9MRElTCTB4MDAyMAkvLyAxPUF1dG8gUG9sYXJpdHkgQ29ycmVjdGlvbiBkaXNhYmxlZAorI2RlZmluZSBQSFlfQ0ZHMl9KQUJESVMJCTB4MDAxMAkvLyAxPUphYmJlciBkaXNhYmxlZAorI2RlZmluZSBQSFlfQ0ZHMl9NUkVHCQkweDAwMDgJLy8gMT1NdWx0aXBsZSByZWdpc3RlciBhY2Nlc3MgKE1JSSBtZ3QpCisjZGVmaW5lIFBIWV9DRkcyX0lOVE1ESU8JMHgwMDA0CS8vIDE9SW50ZXJydXB0IHNpZ25hbGVkIHdpdGggTURJTyBwdWxzZW8KKworLy8gUEhZIFN0YXR1cyBPdXRwdXQgKGFuZCBJbnRlcnJ1cHQgc3RhdHVzKSBSZWdpc3RlcgorI2RlZmluZSBQSFlfSU5UX1JFRwkJMHgxMgkvLyBTdGF0dXMgT3V0cHV0IChJbnRlcnJ1cHQgU3RhdHVzKQorI2RlZmluZSBQSFlfSU5UX0lOVAkJMHg4MDAwCS8vIDE9Yml0cyBoYXZlIGNoYW5nZWQgc2luY2UgbGFzdCByZWFkCisjZGVmaW5lIFBIWV9JTlRfTE5LRkFJTAkJMHg0MDAwCS8vIDE9TGluayBOb3QgZGV0ZWN0ZWQKKyNkZWZpbmUgUEhZX0lOVF9MT1NTU1lOQwkweDIwMDAJLy8gMT1EZXNjcmFtYmxlciBoYXMgbG9zdCBzeW5jCisjZGVmaW5lIFBIWV9JTlRfQ1dSRAkJMHgxMDAwCS8vIDE9SW52YWxpZCA0QjVCIGNvZGUgZGV0ZWN0ZWQgb24gcngKKyNkZWZpbmUgUEhZX0lOVF9TU0QJCTB4MDgwMAkvLyAxPU5vIFN0YXJ0IE9mIFN0cmVhbSBkZXRlY3RlZCBvbiByeAorI2RlZmluZSBQSFlfSU5UX0VTRAkJMHgwNDAwCS8vIDE9Tm8gRW5kIE9mIFN0cmVhbSBkZXRlY3RlZCBvbiByeAorI2RlZmluZSBQSFlfSU5UX1JQT0wJCTB4MDIwMAkvLyAxPVJldmVyc2UgUG9sYXJpdHkgZGV0ZWN0ZWQKKyNkZWZpbmUgUEhZX0lOVF9KQUIJCTB4MDEwMAkvLyAxPUphYmJlciBkZXRlY3RlZAorI2RlZmluZSBQSFlfSU5UX1NQRERFVAkJMHgwMDgwCS8vIDE9MTAwQmFzZS1UWCBtb2RlLCAwPTEwQmFzZS1UIG1vZGUKKyNkZWZpbmUgUEhZX0lOVF9EUExYREVUCQkweDAwNDAJLy8gMT1EZXZpY2UgaW4gRnVsbCBEdXBsZXgKKworLy8gUEhZIEludGVycnVwdC9TdGF0dXMgTWFzayBSZWdpc3RlcgorI2RlZmluZSBQSFlfTUFTS19SRUcJCTB4MTMJLy8gSW50ZXJydXB0IE1hc2sKKy8vIFVzZXMgdGhlIHNhbWUgYml0IGRlZmluaXRpb25zIGFzIFBIWV9JTlRfUkVHCisKKworLyoKKyAqIFNNQzkxQzk2IGV0aGVybmV0IGNvbmZpZyBhbmQgc3RhdHVzIHJlZ2lzdGVycy4KKyAqIFRoZXNlIGFyZSBpbiB0aGUgImF0dHJpYnV0ZSIgc3BhY2UuCisgKi8KKyNkZWZpbmUgRUNPUgkJCTB4ODAwMAorI2RlZmluZSBFQ09SX1JFU0VUCQkweDgwCisjZGVmaW5lIEVDT1JfTEVWRUxfSVJRCQkweDQwCisjZGVmaW5lIEVDT1JfV1JfQVRUUklCCQkweDA0CisjZGVmaW5lIEVDT1JfRU5BQkxFCQkweDAxCisKKyNkZWZpbmUgRUNTUgkJCTB4ODAwMgorI2RlZmluZSBFQ1NSX0lPSVM4CQkweDIwCisjZGVmaW5lIEVDU1JfUFdSRFdOCQkweDA0CisjZGVmaW5lIEVDU1JfSU5UCQkweDAyCisKKyNkZWZpbmUgQVRUUklCX1NJWkUJCSgoNjQqMTAyNCkgPDwgU01DX0lPX1NISUZUKQorCisKKy8qCisgKiBNYWNyb3MgdG8gYWJzdHJhY3QgcmVnaXN0ZXIgYWNjZXNzIGFjY29yZGluZyB0byB0aGUgZGF0YSBidXMKKyAqIGNhcGFiaWxpdGllcy4gIFBsZWFzZSB1c2UgdGhvc2UgYW5kIG5vdCB0aGUgaW4vb3V0IHByaW1pdGl2ZXMuCisgKiBOb3RlOiB0aGUgZm9sbG93aW5nIG1hY3JvcyBkbyAqbm90KiBzZWxlY3QgdGhlIGJhbmsgLS0gdGhpcyBtdXN0CisgKiBiZSBkb25lIHNlcGFyYXRlbHkgYXMgbmVlZGVkIGluIHRoZSBtYWluIGNvZGUuICBUaGUgU01DX1JFRygpIG1hY3JvCisgKiBvbmx5IHVzZXMgdGhlIGJhbmsgYXJndW1lbnQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyAod2hlbiBlbmFibGVkKS4KKyAqLworCisjaWYgU01DX0RFQlVHID4gMAorI2RlZmluZSBTTUNfUkVHKHJlZywgYmFuaykJCQkJCQlcCisJKHsJCQkJCQkJCVwKKwkJaW50IF9fYiA9IFNNQ19DVVJSRU5UX0JBTksoKTsJCQkJXAorCQlpZiAodW5saWtlbHkoKF9fYiAmIH4weGYwKSAhPSAoMHgzMzAwIHwgYmFuaykpKSB7CVwKKwkJCXByaW50ayggIiVzOiBiYW5rIHJlZyBzY3Jld2VkICgweCUwNHgpXG4iLAlcCisJCQkJQ0FSRE5BTUUsIF9fYiApOwkJCVwKKwkJCUJVRygpOwkJCQkJCVwKKwkJfQkJCQkJCQlcCisJCXJlZzw8U01DX0lPX1NISUZUOwkJCQkJXAorCX0pCisjZWxzZQorI2RlZmluZSBTTUNfUkVHKHJlZywgYmFuaykJKHJlZzw8U01DX0lPX1NISUZUKQorI2VuZGlmCisKKyNpZiBTTUNfQ0FOX1VTRV84QklUCisjZGVmaW5lIFNNQ19HRVRfUE4oKQkJU01DX2luYiggaW9hZGRyLCBQTl9SRUcgKQorI2RlZmluZSBTTUNfU0VUX1BOKHgpCQlTTUNfb3V0YiggeCwgaW9hZGRyLCBQTl9SRUcgKQorI2RlZmluZSBTTUNfR0VUX0FSKCkJCVNNQ19pbmIoIGlvYWRkciwgQVJfUkVHICkKKyNkZWZpbmUgU01DX0dFVF9UWEZJRk8oKQlTTUNfaW5iKCBpb2FkZHIsIFRYRklGT19SRUcgKQorI2RlZmluZSBTTUNfR0VUX1JYRklGTygpCVNNQ19pbmIoIGlvYWRkciwgUlhGSUZPX1JFRyApCisjZGVmaW5lIFNNQ19HRVRfSU5UKCkJCVNNQ19pbmIoIGlvYWRkciwgSU5UX1JFRyApCisjZGVmaW5lIFNNQ19BQ0tfSU5UKHgpCQlTTUNfb3V0YiggeCwgaW9hZGRyLCBJTlRfUkVHICkKKyNkZWZpbmUgU01DX0dFVF9JTlRfTUFTSygpCVNNQ19pbmIoIGlvYWRkciwgSU1fUkVHICkKKyNkZWZpbmUgU01DX1NFVF9JTlRfTUFTSyh4KQlTTUNfb3V0YiggeCwgaW9hZGRyLCBJTV9SRUcgKQorI2Vsc2UKKyNkZWZpbmUgU01DX0dFVF9QTigpCQkoU01DX2ludyggaW9hZGRyLCBQTl9SRUcgKSAmIDB4RkYpCisjZGVmaW5lIFNNQ19TRVRfUE4oeCkJCVNNQ19vdXR3KCB4LCBpb2FkZHIsIFBOX1JFRyApCisjZGVmaW5lIFNNQ19HRVRfQVIoKQkJKFNNQ19pbncoIGlvYWRkciwgUE5fUkVHICkgPj4gOCkKKyNkZWZpbmUgU01DX0dFVF9UWEZJRk8oKQkoU01DX2ludyggaW9hZGRyLCBUWEZJRk9fUkVHICkgJiAweEZGKQorI2RlZmluZSBTTUNfR0VUX1JYRklGTygpCShTTUNfaW53KCBpb2FkZHIsIFRYRklGT19SRUcgKSA+PiA4KQorI2RlZmluZSBTTUNfR0VUX0lOVCgpCQkoU01DX2ludyggaW9hZGRyLCBJTlRfUkVHICkgJiAweEZGKQorI2RlZmluZSBTTUNfQUNLX0lOVCh4KQkJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQl1bnNpZ25lZCBsb25nIF9fZmxhZ3M7CQkJCQlcCisJCWludCBfX21hc2s7CQkJCQkJXAorCQlsb2NhbF9pcnFfc2F2ZShfX2ZsYWdzKTsJCQkJXAorCQlfX21hc2sgPSBTTUNfaW53KCBpb2FkZHIsIElOVF9SRUcgKSAmIH4weGZmOwkJXAorCQlTTUNfb3V0dyggX19tYXNrIHwgKHgpLCBpb2FkZHIsIElOVF9SRUcgKTsJCVwKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoX19mbGFncyk7CQkJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBTTUNfR0VUX0lOVF9NQVNLKCkJKFNNQ19pbncoIGlvYWRkciwgSU5UX1JFRyApID4+IDgpCisjZGVmaW5lIFNNQ19TRVRfSU5UX01BU0soeCkJU01DX291dHcoICh4KSA8PCA4LCBpb2FkZHIsIElOVF9SRUcgKQorI2VuZGlmCisKKyNkZWZpbmUgU01DX0NVUlJFTlRfQkFOSygpCVNNQ19pbncoIGlvYWRkciwgQkFOS19TRUxFQ1QgKQorI2RlZmluZSBTTUNfU0VMRUNUX0JBTksoeCkJU01DX291dHcoIHgsIGlvYWRkciwgQkFOS19TRUxFQ1QgKQorI2RlZmluZSBTTUNfR0VUX0JBU0UoKQkJU01DX2ludyggaW9hZGRyLCBCQVNFX1JFRyApCisjZGVmaW5lIFNNQ19TRVRfQkFTRSh4KQkJU01DX291dHcoIHgsIGlvYWRkciwgQkFTRV9SRUcgKQorI2RlZmluZSBTTUNfR0VUX0NPTkZJRygpCVNNQ19pbncoIGlvYWRkciwgQ09ORklHX1JFRyApCisjZGVmaW5lIFNNQ19TRVRfQ09ORklHKHgpCVNNQ19vdXR3KCB4LCBpb2FkZHIsIENPTkZJR19SRUcgKQorI2RlZmluZSBTTUNfR0VUX0NPVU5URVIoKQlTTUNfaW53KCBpb2FkZHIsIENPVU5URVJfUkVHICkKKyNkZWZpbmUgU01DX0dFVF9DVEwoKQkJU01DX2ludyggaW9hZGRyLCBDVExfUkVHICkKKyNkZWZpbmUgU01DX1NFVF9DVEwoeCkJCVNNQ19vdXR3KCB4LCBpb2FkZHIsIENUTF9SRUcgKQorI2RlZmluZSBTTUNfR0VUX01JSSgpCQlTTUNfaW53KCBpb2FkZHIsIE1JSV9SRUcgKQorI2RlZmluZSBTTUNfU0VUX01JSSh4KQkJU01DX291dHcoIHgsIGlvYWRkciwgTUlJX1JFRyApCisjZGVmaW5lIFNNQ19HRVRfTUlSKCkJCVNNQ19pbncoIGlvYWRkciwgTUlSX1JFRyApCisjZGVmaW5lIFNNQ19TRVRfTUlSKHgpCQlTTUNfb3V0dyggeCwgaW9hZGRyLCBNSVJfUkVHICkKKyNkZWZpbmUgU01DX0dFVF9NTVVfQ01EKCkJU01DX2ludyggaW9hZGRyLCBNTVVfQ01EX1JFRyApCisjZGVmaW5lIFNNQ19TRVRfTU1VX0NNRCh4KQlTTUNfb3V0dyggeCwgaW9hZGRyLCBNTVVfQ01EX1JFRyApCisjZGVmaW5lIFNNQ19HRVRfRklGTygpCQlTTUNfaW53KCBpb2FkZHIsIEZJRk9fUkVHICkKKyNkZWZpbmUgU01DX0dFVF9QVFIoKQkJU01DX2ludyggaW9hZGRyLCBQVFJfUkVHICkKKyNkZWZpbmUgU01DX1NFVF9QVFIoeCkJCVNNQ19vdXR3KCB4LCBpb2FkZHIsIFBUUl9SRUcgKQorI2RlZmluZSBTTUNfR0VUX1JDUigpCQlTTUNfaW53KCBpb2FkZHIsIFJDUl9SRUcgKQorI2RlZmluZSBTTUNfU0VUX1JDUih4KQkJU01DX291dHcoIHgsIGlvYWRkciwgUkNSX1JFRyApCisjZGVmaW5lIFNNQ19HRVRfUkVWKCkJCVNNQ19pbncoIGlvYWRkciwgUkVWX1JFRyApCisjZGVmaW5lIFNNQ19HRVRfUlBDKCkJCVNNQ19pbncoIGlvYWRkciwgUlBDX1JFRyApCisjZGVmaW5lIFNNQ19TRVRfUlBDKHgpCQlTTUNfb3V0dyggeCwgaW9hZGRyLCBSUENfUkVHICkKKyNkZWZpbmUgU01DX0dFVF9UQ1IoKQkJU01DX2ludyggaW9hZGRyLCBUQ1JfUkVHICkKKyNkZWZpbmUgU01DX1NFVF9UQ1IoeCkJCVNNQ19vdXR3KCB4LCBpb2FkZHIsIFRDUl9SRUcgKQorCisjaWZuZGVmIFNNQ19HRVRfTUFDX0FERFIKKyNkZWZpbmUgU01DX0dFVF9NQUNfQUREUihhZGRyKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCXVuc2lnbmVkIGludCBfX3Y7CQkJCQlcCisJCV9fdiA9IFNNQ19pbncoIGlvYWRkciwgQUREUjBfUkVHICk7CQkJXAorCQlhZGRyWzBdID0gX192OyBhZGRyWzFdID0gX192ID4+IDg7CQkJXAorCQlfX3YgPSBTTUNfaW53KCBpb2FkZHIsIEFERFIxX1JFRyApOwkJCVwKKwkJYWRkclsyXSA9IF9fdjsgYWRkclszXSA9IF9fdiA+PiA4OwkJCVwKKwkJX192ID0gU01DX2ludyggaW9hZGRyLCBBRERSMl9SRUcgKTsJCQlcCisJCWFkZHJbNF0gPSBfX3Y7IGFkZHJbNV0gPSBfX3YgPj4gODsJCQlcCisJfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZGVmaW5lIFNNQ19TRVRfTUFDX0FERFIoYWRkcikJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlTTUNfb3V0dyggYWRkclswXXwoYWRkclsxXSA8PCA4KSwgaW9hZGRyLCBBRERSMF9SRUcgKTsJXAorCQlTTUNfb3V0dyggYWRkclsyXXwoYWRkclszXSA8PCA4KSwgaW9hZGRyLCBBRERSMV9SRUcgKTsJXAorCQlTTUNfb3V0dyggYWRkcls0XXwoYWRkcls1XSA8PCA4KSwgaW9hZGRyLCBBRERSMl9SRUcgKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgU01DX1NFVF9NQ0FTVCh4KQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm10ID0gKHgpOwkJCQlcCisJCVNNQ19vdXR3KCBtdFswXSB8IChtdFsxXSA8PCA4KSwgaW9hZGRyLCBNQ0FTVF9SRUcxICk7CVwKKwkJU01DX291dHcoIG10WzJdIHwgKG10WzNdIDw8IDgpLCBpb2FkZHIsIE1DQVNUX1JFRzIgKTsJXAorCQlTTUNfb3V0dyggbXRbNF0gfCAobXRbNV0gPDwgOCksIGlvYWRkciwgTUNBU1RfUkVHMyApOwlcCisJCVNNQ19vdXR3KCBtdFs2XSB8IChtdFs3XSA8PCA4KSwgaW9hZGRyLCBNQ0FTVF9SRUc0ICk7CVwKKwl9IHdoaWxlICgwKQorCisjaWYgU01DX0NBTl9VU0VfMzJCSVQKKy8qCisgKiBTb21lIHNldHVwcyBqdXN0IGNhbid0IHdyaXRlIDggb3IgMTYgYml0cyByZWxpYWJseSB3aGVuIG5vdCBhbGlnbmVkCisgKiB0byBhIDMyIGJpdCBib3VuZGFyeS4gIEkgdGVsbCB5b3UgdGhhdCBleGlzdHMhCisgKiBXZSByZS1kbyB0aGUgb25lcyBoZXJlIHRoYXQgY2FuIGJlIGVhc2lseSB3b3JrZWQgYXJvdW5kIGlmIHRoZXkgY2FuIGhhdmUKKyAqIHRoZWlyIGxvdyBwYXJ0cyB3cml0dGVuIHRvIDAgd2l0aG91dCBhZHZlcnNlIGVmZmVjdHMuCisgKi8KKyN1bmRlZiBTTUNfU0VMRUNUX0JBTksKKyNkZWZpbmUgU01DX1NFTEVDVF9CQU5LKHgpCVNNQ19vdXRsKCAoeCk8PDE2LCBpb2FkZHIsIDEyPDxTTUNfSU9fU0hJRlQgKQorI3VuZGVmIFNNQ19TRVRfUlBDCisjZGVmaW5lIFNNQ19TRVRfUlBDKHgpCQlTTUNfb3V0bCggKHgpPDwxNiwgaW9hZGRyLCBTTUNfUkVHKDgsIDApICkKKyN1bmRlZiBTTUNfU0VUX1BOCisjZGVmaW5lIFNNQ19TRVRfUE4oeCkJCVNNQ19vdXRsKCAoeCk8PDE2LCBpb2FkZHIsIFNNQ19SRUcoMCwgMikgKQorI3VuZGVmIFNNQ19TRVRfUFRSCisjZGVmaW5lIFNNQ19TRVRfUFRSKHgpCQlTTUNfb3V0bCggKHgpPDwxNiwgaW9hZGRyLCBTTUNfUkVHKDQsIDIpICkKKyNlbmRpZgorCisjaWYgU01DX0NBTl9VU0VfMzJCSVQKKyNkZWZpbmUgU01DX1BVVF9QS1RfSERSKHN0YXR1cywgbGVuZ3RoKQkJCQkJXAorCVNNQ19vdXRsKCAoc3RhdHVzKSB8IChsZW5ndGgpIDw8IDE2LCBpb2FkZHIsIERBVEFfUkVHICkKKyNkZWZpbmUgU01DX0dFVF9QS1RfSERSKHN0YXR1cywgbGVuZ3RoKQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJdW5zaWduZWQgaW50IF9fdmFsID0gU01DX2lubCggaW9hZGRyLCBEQVRBX1JFRyApOwlcCisJCShzdGF0dXMpID0gX192YWwgJiAweGZmZmY7CQkJCVwKKwkJKGxlbmd0aCkgPSBfX3ZhbCA+PiAxNjsJCQkJCVwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgU01DX1BVVF9QS1RfSERSKHN0YXR1cywgbGVuZ3RoKQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJU01DX291dHcoIHN0YXR1cywgaW9hZGRyLCBEQVRBX1JFRyApOwkJCVwKKwkJU01DX291dHcoIGxlbmd0aCwgaW9hZGRyLCBEQVRBX1JFRyApOwkJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBTTUNfR0VUX1BLVF9IRFIoc3RhdHVzLCBsZW5ndGgpCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQkoc3RhdHVzKSA9IFNNQ19pbncoIGlvYWRkciwgREFUQV9SRUcgKTsJCQlcCisJCShsZW5ndGgpID0gU01DX2ludyggaW9hZGRyLCBEQVRBX1JFRyApOwkJCVwKKwl9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZiBTTUNfQ0FOX1VTRV8zMkJJVAorI2RlZmluZSBfU01DX1BVU0hfREFUQShwLCBsKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWNoYXIgKl9fcHRyID0gKHApOwkJCQkJXAorCQlpbnQgX19sZW4gPSAobCk7CQkJCQlcCisJCWlmIChfX2xlbiA+PSAyICYmICh1bnNpZ25lZCBsb25nKV9fcHRyICYgMikgewkJXAorCQkJX19sZW4gLT0gMjsJCQkJCVwKKwkJCVNNQ19vdXR3KCAqKHUxNiAqKV9fcHRyLCBpb2FkZHIsIERBVEFfUkVHICk7CVwKKwkJCV9fcHRyICs9IDI7CQkJCQlcCisJCX0JCQkJCQkJXAorCQlTTUNfb3V0c2woIGlvYWRkciwgREFUQV9SRUcsIF9fcHRyLCBfX2xlbiA+PiAyKTsJXAorCQlpZiAoX19sZW4gJiAyKSB7CQkJCQlcCisJCQlfX3B0ciArPSAoX19sZW4gJiB+Myk7CQkJCVwKKwkJCVNNQ19vdXR3KCAqKCh1MTYgKilfX3B0ciksIGlvYWRkciwgREFUQV9SRUcgKTsJXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBfU01DX1BVTExfREFUQShwLCBsKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWNoYXIgKl9fcHRyID0gKHApOwkJCQkJXAorCQlpbnQgX19sZW4gPSAobCk7CQkJCQlcCisJCWlmICgodW5zaWduZWQgbG9uZylfX3B0ciAmIDIpIHsJCQkJXAorCQkJLyoJCQkJCQlcCisJCQkgKiBXZSB3YW50IDMyYml0IGFsaWdubWVudCBoZXJlLgkJXAorCQkJICogU2luY2Ugc29tZSBidXNlcyBwZXJmb3JtIGEgZnVsbCAzMmJpdAlcCisJCQkgKiBmZXRjaCBldmVuIGZvciAxNmJpdCBkYXRhIHdlIGNhbid0IHVzZQlcCisJCQkgKiBTTUNfaW53KCkgaGVyZS4gIEJhY2sgYm90aCBzb3VyY2UgKG9uIGNoaXAJXAorCQkJICogYW5kIGRlc3RpbmF0aW9uKSBwb2ludGVycyBvZiAyIGJ5dGVzLglcCisJCQkgKi8JCQkJCQlcCisJCQlfX3B0ciAtPSAyOwkJCQkJXAorCQkJX19sZW4gKz0gMjsJCQkJCVwKKwkJCVNNQ19TRVRfUFRSKCAyfFBUUl9SRUFEfFBUUl9SQ1Z8UFRSX0FVVE9JTkMgKTsJXAorCQl9CQkJCQkJCVwKKwkJX19sZW4gKz0gMjsJCQkJCQlcCisJCVNNQ19pbnNsKCBpb2FkZHIsIERBVEFfUkVHLCBfX3B0ciwgX19sZW4gPj4gMik7CQlcCisJfSB3aGlsZSAoMCkKKyNlbGlmIFNNQ19DQU5fVVNFXzE2QklUCisjZGVmaW5lIF9TTUNfUFVTSF9EQVRBKHAsIGwpCVNNQ19vdXRzdyggaW9hZGRyLCBEQVRBX1JFRywgcCwgKGwpID4+IDEgKQorI2RlZmluZSBfU01DX1BVTExfREFUQShwLCBsKQlTTUNfaW5zdyAoIGlvYWRkciwgREFUQV9SRUcsIHAsIChsKSA+PiAxICkKKyNlbGlmIFNNQ19DQU5fVVNFXzhCSVQKKyNkZWZpbmUgX1NNQ19QVVNIX0RBVEEocCwgbCkJU01DX291dHNiKCBpb2FkZHIsIERBVEFfUkVHLCBwLCBsICkKKyNkZWZpbmUgX1NNQ19QVUxMX0RBVEEocCwgbCkJU01DX2luc2IgKCBpb2FkZHIsIERBVEFfUkVHLCBwLCBsICkKKyNlbmRpZgorCisjaWYgISBTTUNfQ0FOX1VTRV8xNkJJVAorI2RlZmluZSBTTUNfb3V0dyh4LCBpb2FkZHIsIHJlZykJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCXVuc2lnbmVkIGludCBfX3ZhbDE2ID0gKHgpOwkJCQlcCisJCVNNQ19vdXRiKCBfX3ZhbDE2LCBpb2FkZHIsIHJlZyApOwkJCVwKKwkJU01DX291dGIoIF9fdmFsMTYgPj4gOCwgaW9hZGRyLCByZWcgKyAoMSA8PCBTTUNfSU9fU0hJRlQpKTtcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgU01DX2ludyhpb2FkZHIsIHJlZykJCQkJCQlcCisJKHsJCQkJCQkJCVwKKwkJdW5zaWduZWQgaW50IF9fdmFsMTY7CQkJCQlcCisJCV9fdmFsMTYgPSAgU01DX2luYiggaW9hZGRyLCByZWcgKTsJCQlcCisJCV9fdmFsMTYgfD0gU01DX2luYiggaW9hZGRyLCByZWcgKyAoMSA8PCBTTUNfSU9fU0hJRlQpKSA8PCA4OyBcCisJCV9fdmFsMTY7CQkJCQkJXAorCX0pCisjZW5kaWYKKworI2lmIFNNQ19DQU5fVVNFX0RBVEFDUworI2RlZmluZSBTTUNfUFVTSF9EQVRBKHAsIGwpCQkJCQkJXAorCWlmICggbHAtPmRhdGFjcyApIHsJCQkJCQlcCisJCXVuc2lnbmVkIGNoYXIgKl9fcHRyID0gKHApOwkJCQlcCisJCWludCBfX2xlbiA9IChsKTsJCQkJCVwKKyAJCWlmIChfX2xlbiA+PSAyICYmICh1bnNpZ25lZCBsb25nKV9fcHRyICYgMikgewkJXAorIAkJCV9fbGVuIC09IDI7CQkJCQlcCisgCQkJU01DX291dHcoICooKHUxNiAqKV9fcHRyKSwgaW9hZGRyLCBEQVRBX1JFRyApOwlcCisgCQkJX19wdHIgKz0gMjsJCQkJCVwKKyAJCX0JCQkJCQkJXAorCQlvdXRzbChscC0+ZGF0YWNzLCBfX3B0ciwgX19sZW4gPj4gMik7CQkJXAorIAkJaWYgKF9fbGVuICYgMikgewkJCQkJXAorIAkJCV9fcHRyICs9IChfX2xlbiAmIH4zKTsJCQkJXAorIAkJCVNNQ19vdXR3KCAqKCh1MTYgKilfX3B0ciksIGlvYWRkciwgREFUQV9SRUcgKTsJXAorIAkJfQkJCQkJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQlfU01DX1BVU0hfREFUQShwLCBsKTsJCQkJCVwKKwl9CisKKyNkZWZpbmUgU01DX1BVTExfREFUQShwLCBsKQkJCQkJCVwKKwlpZiAoIGxwLT5kYXRhY3MgKSB7IAkJCQkJCVwKKwkJdW5zaWduZWQgY2hhciAqX19wdHIgPSAocCk7CQkJCVwKKwkJaW50IF9fbGVuID0gKGwpOwkJCQkJXAorCQlpZiAoKHVuc2lnbmVkIGxvbmcpX19wdHIgJiAyKSB7CQkJIAlcCisJCQkvKgkJCQkJCVwKKwkJCSAqIFdlIHdhbnQgMzJiaXQgYWxpZ25tZW50IGhlcmUuCQlcCisJCQkgKiBTaW5jZSBzb21lIGJ1c2VzIHBlcmZvcm0gYSBmdWxsIDMyYml0CVwKKwkJCSAqIGZldGNoIGV2ZW4gZm9yIDE2Yml0IGRhdGEgd2UgY2FuJ3QgdXNlCVwKKwkJCSAqIFNNQ19pbncoKSBoZXJlLiAgQmFjayBib3RoIHNvdXJjZSAob24gY2hpcAlcCisJCQkgKiBhbmQgZGVzdGluYXRpb24pIHBvaW50ZXJzIG9mIDIgYnl0ZXMuCVwKKwkJCSAqLwkJCQkJCVwKKwkJCV9fcHRyIC09IDI7CQkJCQlcCisJCQlfX2xlbiArPSAyOwkJCQkJXAorCQkJU01DX1NFVF9QVFIoIDJ8UFRSX1JFQUR8UFRSX1JDVnxQVFJfQVVUT0lOQyApOyAJXAorCQl9CQkJCQkJCVwKKwkJX19sZW4gKz0gMjsJCQkJCQlcCisJCWluc2woIGxwLT5kYXRhY3MsIF9fcHRyLCBfX2xlbiA+PiAyKTsJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQlfU01DX1BVTExfREFUQShwLCBsKTsJCQkJCVwKKwl9CisjZWxzZQorI2RlZmluZSBTTUNfUFVTSF9EQVRBKHAsIGwpIF9TTUNfUFVTSF9EQVRBKHAsIGwpCisjZGVmaW5lIFNNQ19QVUxMX0RBVEEocCwgbCkgX1NNQ19QVUxMX0RBVEEocCwgbCkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgKFNNQ19JTlRFUlJVUFRfUFJFQU1CTEUpCisjIGRlZmluZSBTTUNfSU5URVJSVVBUX1BSRUFNQkxFCisjZW5kaWYKKworI2VuZGlmICAvKiBfU01DOTFYX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zb25pYy5jIGIvZHJpdmVycy9uZXQvc29uaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGM5Y2M4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc29uaWMuYwpAQCAtMCwwICsxLDYxNiBAQAorLyoKKyAqIHNvbmljLmMKKyAqCisgKiAoQykgMTk5NiwxOTk4IGJ5IFRob21hcyBCb2dlbmRvZXJmZXIgKHRzYm9nZW5kQGFscGhhLmZyYW5rZW4uZGUpCisgKiAKKyAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHdvcmsgZnJvbSBBbmRyZWFzIEJ1c3NlLCBidXQgbW9zdCBvZgorICogdGhlIGNvZGUgaXMgcmV3cml0dGVuLgorICogCisgKiAoQykgMTk5NSBieSBBbmRyZWFzIEJ1c3NlIChhbmR5QHdhbGRvcmYtZ21iaC5kZSkKKyAqCisgKiAgICBDb3JlIGNvZGUgaW5jbHVkZWQgYnkgc3lzdGVtIHNvbmljIGRyaXZlcnMKKyAqLworCisvKgorICogU291cmNlczogT2xpdmV0dGkgTTcwMC0xMCBSaXNjIFBlcnNvbmFsIENvbXB1dGVyIGhhcmR3YXJlIGhhbmRib29rLAorICogTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcnMgZGF0YSBzaGVldCBmb3IgdGhlIERQODM5MzJCIFNvbmljIEV0aGVybmV0CisgKiBjb250cm9sbGVyLCBhbmQgdGhlIGZpbGVzICI4MzkwLmMiIGFuZCAic2tlbGV0b24uYyIgaW4gdGhpcyBkaXJlY3RvcnkuCisgKi8KKworCisKKy8qCisgKiBPcGVuL2luaXRpYWxpemUgdGhlIFNPTklDIGNvbnRyb2xsZXIuCisgKgorICogVGhpcyByb3V0aW5lIHNob3VsZCBzZXQgZXZlcnl0aGluZyB1cCBhbmV3IGF0IGVhY2ggb3BlbiwgZXZlbgorICogIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0CisgKiAgdGhlcmUgaXMgbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAqLworc3RhdGljIGludCBzb25pY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKHNvbmljX2RlYnVnID4gMikKKwkJcHJpbnRrKCJzb25pY19vcGVuOiBpbml0aWFsaXppbmcgc29uaWMgZHJpdmVyLlxuIik7CisKKwkvKgorCSAqIFdlIGRvbid0IG5lZWQgdG8gZGVhbCB3aXRoIGF1dG8taXJxIHN0dWZmIHNpbmNlIHdlCisJICogaGFyZHdpcmUgdGhlIHNvbmljIGludGVycnVwdC4KKwkgKi8KKy8qCisgKiBYWFggSG9ycmlibGUgd29yayBhcm91bmQ6ICBXZSBpbnN0YWxsIHNvbmljX2ludGVycnVwdCBhcyBmYXN0IGludGVycnVwdC4KKyAqIFRoaXMgbWVhbnMgdGhhdCBkdXJpbmcgZXhlY3V0aW9uIG9mIHRoZSBoYW5kbGVyIGludGVycnVwdCBhcmUgZGlzYWJsZWQKKyAqIGNvdmVyaW5nIGFub3RoZXIgYnVnIG90aGVyd2lzZSBjb3JydXB0aW5nIGRhdGEuICBUaGlzIGRvZXNuJ3QgbWVhbgorICogdGhpcyBnbHVlIHdvcmtzIG9rIHVuZGVyIGFsbCBzaXR1YXRpb25zLgorICovCisvLyAgICBpZiAoc29uaWNfcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZzb25pY19pbnRlcnJ1cHQsIDAsICJzb25pYyIsIGRldikpIHsKKwlpZiAoc29uaWNfcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZzb25pY19pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwKKwkgICAgICAgICAgICAgICAgICAgICAgInNvbmljIiwgZGV2KSkgeworCQlwcmludGsoIlxuJXM6IHVuYWJsZSB0byBnZXQgSVJRICVkIC5cbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIFNPTklDCisJICovCisJc29uaWNfaW5pdChkZXYpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCWlmIChzb25pY19kZWJ1ZyA+IDIpCisJCXByaW50aygic29uaWNfb3BlbjogSW5pdGlhbGl6YXRpb24gZG9uZS5cbiIpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIENsb3NlIHRoZSBTT05JQyBkZXZpY2UKKyAqLworc3RhdGljIGludCBzb25pY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGludCBiYXNlX2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWlmIChzb25pY19kZWJ1ZyA+IDIpCisJCXByaW50aygic29uaWNfY2xvc2VcbiIpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyoKKwkgKiBzdG9wIHRoZSBTT05JQywgZGlzYWJsZSBpbnRlcnJ1cHRzCisJICovCisJU09OSUNfV1JJVEUoU09OSUNfSVNSLCAweDdmZmYpOworCVNPTklDX1dSSVRFKFNPTklDX0lNUiwgMCk7CisJU09OSUNfV1JJVEUoU09OSUNfQ01ELCBTT05JQ19DUl9SU1QpOworCisJc29uaWNfZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CS8qIHJlbGVhc2UgdGhlIElSUSAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNvbmljX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc29uaWNfbG9jYWwgKmxwID0gKHN0cnVjdCBzb25pY19sb2NhbCAqKSBkZXYtPnByaXY7CisJcHJpbnRrKCIlczogdHJhbnNtaXQgdGltZWQgb3V0LlxuIiwgZGV2LT5uYW1lKTsKKworCS8qIFRyeSB0byByZXN0YXJ0IHRoZSBhZGFwdG9yLiAqLworCXNvbmljX2luaXQoZGV2KTsKKwlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisvKgorICogdHJhbnNtaXQgcGFja2V0CisgKi8KK3N0YXRpYyBpbnQgc29uaWNfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc29uaWNfbG9jYWwgKmxwID0gKHN0cnVjdCBzb25pY19sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgaW50IGJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGludCBsYWRkcjsKKwlpbnQgZW50cnksIGxlbmd0aDsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmIChzb25pY19kZWJ1ZyA+IDIpCisJCXByaW50aygic29uaWNfc2VuZF9wYWNrZXQ6IHNrYj0lcCwgZGV2PSVwXG4iLCBza2IsIGRldik7CisKKwkvKgorCSAqIE1hcCB0aGUgcGFja2V0IGRhdGEgaW50byB0aGUgbG9naWNhbCBETUEgYWRkcmVzcyBzcGFjZQorCSAqLworCWlmICgobGFkZHIgPSB2ZG1hX2FsbG9jKENQSFlTQUREUihza2ItPmRhdGEpLCBza2ItPmxlbikpID09IH4wVUwpIHsKKwkJcHJpbnRrKCIlczogbm8gVkRNQSBlbnRyeSBmb3IgdHJhbnNtaXQgYXZhaWxhYmxlLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJcmV0dXJuIDE7CisJfQorCWVudHJ5ID0gbHAtPmN1cl90eCAmIFNPTklDX1REU19NQVNLOworCWxwLT50eF9sYWRkcltlbnRyeV0gPSBsYWRkcjsKKwlscC0+dHhfc2tiW2VudHJ5XSA9IHNrYjsKKworCWxlbmd0aCA9IChza2ItPmxlbiA8IEVUSF9aTEVOKSA/IEVUSF9aTEVOIDogc2tiLT5sZW47CisJZmx1c2hfY2FjaGVfYWxsKCk7CisKKwkvKgorCSAqIFNldHVwIHRoZSB0cmFuc21pdCBkZXNjcmlwdG9yIGFuZCBpc3N1ZSB0aGUgdHJhbnNtaXQgY29tbWFuZC4KKwkgKi8KKwlscC0+dGRhW2VudHJ5XS50eF9zdGF0dXMgPSAwOwkvKiBjbGVhciBzdGF0dXMgKi8KKwlscC0+dGRhW2VudHJ5XS50eF9mcmFnX2NvdW50ID0gMTsJLyogc2luZ2xlIGZyYWdtZW50ICovCisJbHAtPnRkYVtlbnRyeV0udHhfcGt0c2l6ZSA9IGxlbmd0aDsJLyogbGVuZ3RoIG9mIHBhY2tldCAqLworCWxwLT50ZGFbZW50cnldLnR4X2ZyYWdfcHRyX2wgPSBsYWRkciAmIDB4ZmZmZjsKKwlscC0+dGRhW2VudHJ5XS50eF9mcmFnX3B0cl9oID0gbGFkZHIgPj4gMTY7CisJbHAtPnRkYVtlbnRyeV0udHhfZnJhZ19zaXplID0gbGVuZ3RoOworCWxwLT5jdXJfdHgrKzsKKwlscC0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuZ3RoOworCisJaWYgKHNvbmljX2RlYnVnID4gMikKKwkJcHJpbnRrKCJzb25pY19zZW5kX3BhY2tldDogaXNzdWVpbmcgVHggY29tbWFuZFxuIik7CisKKwlTT05JQ19XUklURShTT05JQ19DTUQsIFNPTklDX0NSX1RYUCk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCWlmIChscC0+Y3VyX3R4IDwgbHAtPmRpcnR5X3R4ICsgU09OSUNfTlVNX1REUykKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwllbHNlCisJCWxwLT50eF9mdWxsID0gMTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhlIHR5cGljYWwgd29ya2xvYWQgb2YgdGhlIGRyaXZlcjoKKyAqIEhhbmRsZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaW50ZXJydXB0cy4KKyAqLworc3RhdGljIGlycXJldHVybl90IHNvbmljX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCXVuc2lnbmVkIGludCBiYXNlX2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3Qgc29uaWNfbG9jYWwgKmxwOworCWludCBzdGF0dXM7CisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKCJzb25pY19pbnRlcnJ1cHQ6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJbHAgPSAoc3RydWN0IHNvbmljX2xvY2FsICopIGRldi0+cHJpdjsKKworCXN0YXR1cyA9IFNPTklDX1JFQUQoU09OSUNfSVNSKTsKKwlTT05JQ19XUklURShTT05JQ19JU1IsIDB4N2ZmZik7CS8qIGNsZWFyIGFsbCBiaXRzICovCisKKwlpZiAoc29uaWNfZGVidWcgPiAyKQorCQlwcmludGsoInNvbmljX2ludGVycnVwdDogSVNSPSV4XG4iLCBzdGF0dXMpOworCisJaWYgKHN0YXR1cyAmIFNPTklDX0lOVF9QS1RSWCkgeworCQlzb25pY19yeChkZXYpOwkvKiBnb3QgcGFja2V0KHMpICovCisJfQorCisJaWYgKHN0YXR1cyAmIFNPTklDX0lOVF9UWEROKSB7CisJCWludCBkaXJ0eV90eCA9IGxwLT5kaXJ0eV90eDsKKworCQl3aGlsZSAoZGlydHlfdHggPCBscC0+Y3VyX3R4KSB7CisJCQlpbnQgZW50cnkgPSBkaXJ0eV90eCAmIFNPTklDX1REU19NQVNLOworCQkJaW50IHN0YXR1cyA9IGxwLT50ZGFbZW50cnldLnR4X3N0YXR1czsKKworCQkJaWYgKHNvbmljX2RlYnVnID4gMykKKwkJCQlwcmludGsKKwkJCQkgICAgKCJzb25pY19pbnRlcnJ1cHQ6IHN0YXR1cyAlZCwgY3VyX3R4ICVkLCBkaXJ0eV90eCAlZFxuIiwKKwkJCQkgICAgIHN0YXR1cywgbHAtPmN1cl90eCwgbHAtPmRpcnR5X3R4KTsKKworCQkJaWYgKHN0YXR1cyA9PSAwKSB7CisJCQkJLyogSXQgc3RpbGwgaGFzbid0IGJlZW4gVHhlZCwga2ljayB0aGUgc29uaWMgYWdhaW4gKi8KKwkJCQlTT05JQ19XUklURShTT05JQ19DTUQsIFNPTklDX0NSX1RYUCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIHB1dCBiYWNrIEVPTCBhbmQgZnJlZSBkZXNjcmlwdG9yICovCisJCQlscC0+dGRhW2VudHJ5XS50eF9mcmFnX2NvdW50ID0gMDsKKwkJCWxwLT50ZGFbZW50cnldLnR4X3N0YXR1cyA9IDA7CisKKwkJCWlmIChzdGF0dXMgJiAweDAwMDEpCisJCQkJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCWVsc2UgeworCQkJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgMHgwNjQyKQorCQkJCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgMHgwMTgwKQorCQkJCQlscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgMHgwMDIwKQorCQkJCQlscC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiAweDAwMDQpCisJCQkJCWxwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJfQorCisJCQkvKiBXZSBtdXN0IGZyZWUgdGhlIG9yaWdpbmFsIHNrYiAqLworCQkJaWYgKGxwLT50eF9za2JbZW50cnldKSB7CisJCQkJZGV2X2tmcmVlX3NrYl9pcnEobHAtPnR4X3NrYltlbnRyeV0pOworCQkJCWxwLT50eF9za2JbZW50cnldID0gMDsKKwkJCX0KKwkJCS8qIGFuZCB0aGUgVkRNQSBhZGRyZXNzICovCisJCQl2ZG1hX2ZyZWUobHAtPnR4X2xhZGRyW2VudHJ5XSk7CisJCQlkaXJ0eV90eCsrOworCQl9CisKKwkJaWYgKGxwLT50eF9mdWxsCisJCSAgICAmJiBkaXJ0eV90eCArIFNPTklDX05VTV9URFMgPiBscC0+Y3VyX3R4ICsgMikgeworCQkJLyogVGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwsIGNsZWFyIHRidXN5LiAqLworCQkJbHAtPnR4X2Z1bGwgPSAwOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQl9CisKKwkJbHAtPmRpcnR5X3R4ID0gZGlydHlfdHg7CisJfQorCisJLyoKKwkgKiBjaGVjayBlcnJvciBjb25kaXRpb25zCisJICovCisJaWYgKHN0YXR1cyAmIFNPTklDX0lOVF9SRk8pIHsKKwkJcHJpbnRrKCIlczogcmVjZWl2ZSBmaWZvIHVuZGVycnVuXG4iLCBkZXYtPm5hbWUpOworCQlscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwl9CisJaWYgKHN0YXR1cyAmIFNPTklDX0lOVF9SREUpIHsKKwkJcHJpbnRrKCIlczogcmVjZWl2ZSBkZXNjcmlwdG9ycyBleGhhdXN0ZWRcbiIsIGRldi0+bmFtZSk7CisJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJfQorCWlmIChzdGF0dXMgJiBTT05JQ19JTlRfUkJFKSB7CisJCXByaW50aygiJXM6IHJlY2VpdmUgYnVmZmVyIGV4aGF1c3RlZFxuIiwgZGV2LT5uYW1lKTsKKwkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwl9CisJaWYgKHN0YXR1cyAmIFNPTklDX0lOVF9SQkFFKSB7CisJCXByaW50aygiJXM6IHJlY2VpdmUgYnVmZmVyIGFyZWEgZXhoYXVzdGVkXG4iLCBkZXYtPm5hbWUpOworCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCX0KKworCS8qIGNvdW50ZXIgb3ZlcnJ1bnM7IGFsbCBjb3VudGVycyBhcmUgMTZiaXQgd2lkZSAqLworCWlmIChzdGF0dXMgJiBTT05JQ19JTlRfRkFFKQorCQlscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICs9IDY1NTM2OworCWlmIChzdGF0dXMgJiBTT05JQ19JTlRfQ1JDKQorCQlscC0+c3RhdHMucnhfY3JjX2Vycm9ycyArPSA2NTUzNjsKKwlpZiAoc3RhdHVzICYgU09OSUNfSU5UX01QKQorCQlscC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSA2NTUzNjsKKworCS8qIHRyYW5zbWl0IGVycm9yICovCisJaWYgKHN0YXR1cyAmIFNPTklDX0lOVF9UWEVSKQorCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisKKwkvKgorCSAqIGNsZWFyIGludGVycnVwdCBiaXRzIGFuZCByZXR1cm4KKwkgKi8KKwlTT05JQ19XUklURShTT05JQ19JU1IsIHN0YXR1cyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogV2UgaGF2ZSBhIGdvb2QgcGFja2V0KHMpLCBnZXQgaXQvdGhlbSBvdXQgb2YgdGhlIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyB2b2lkIHNvbmljX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgaW50IGJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBzb25pY19sb2NhbCAqbHAgPSAoc3RydWN0IHNvbmljX2xvY2FsICopIGRldi0+cHJpdjsKKwlzb25pY19yZF90ICpyZCA9ICZscC0+cmRhW2xwLT5jdXJfcnggJiBTT05JQ19SRFNfTUFTS107CisJaW50IHN0YXR1czsKKworCXdoaWxlIChyZC0+aW5fdXNlID09IDApIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJaW50IHBrdF9sZW47CisJCXVuc2lnbmVkIGNoYXIgKnBrdF9wdHI7CisKKwkJc3RhdHVzID0gcmQtPnJ4X3N0YXR1czsKKwkJaWYgKHNvbmljX2RlYnVnID4gMykKKwkJCXByaW50aygic3RhdHVzICV4LCBjdXJfcnggJWQsIGN1cl9ycmEgJXhcbiIsCisJCQkgICAgICAgc3RhdHVzLCBscC0+Y3VyX3J4LCBscC0+Y3VyX3JyYSk7CisJCWlmIChzdGF0dXMgJiBTT05JQ19SQ1JfUFJYKSB7CisJCQlwa3RfbGVuID0gcmQtPnJ4X3BrdGxlbjsKKwkJCXBrdF9wdHIgPQorCQkJICAgIChjaGFyICopCisJCQkgICAgc29uaWNfY2hpcHRvbWVtKChyZC0+cnhfcGt0cHRyX2ggPDwgMTYpICsKKwkJCQkJICAgIHJkLT5yeF9wa3RwdHJfbCk7CisKKwkJCWlmIChzb25pY19kZWJ1ZyA+IDMpCisJCQkJcHJpbnRrCisJCQkJICAgICgicGt0cHRyICVwIChyYmEgJXApIGg6JXggbDoleCwgYnNpemUgaDoleCBsOiV4XG4iLAorCQkJCSAgICAgcGt0X3B0ciwgbHAtPnJiYSwgcmQtPnJ4X3BrdHB0cl9oLAorCQkJCSAgICAgcmQtPnJ4X3BrdHB0cl9sLAorCQkJCSAgICAgU09OSUNfUkVBRChTT05JQ19SQldDMSksCisJCQkJICAgICBTT05JQ19SRUFEKFNPTklDX1JCV0MwKSk7CisKKwkJCS8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLiAqLworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMik7CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQlwcmludGsKKwkJCQkgICAgKCIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsCisJCQkJICAgICBkZXYtPm5hbWUpOworCQkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlza2ItPmRldiA9IGRldjsKKwkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gKi8KKwkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsJLyogTWFrZSByb29tICovCisJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgcGt0X3B0ciwgcGt0X2xlbiwgMCk7CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJbmV0aWZfcngoc2tiKTsJLyogcGFzcyB0aGUgcGFja2V0IHRvIHVwcGVyIGxheWVycyAqLworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKworCQl9IGVsc2UgeworCQkJLyogVGhpcyBzaG91bGQgb25seSBoYXBwZW4sIGlmIHdlIGVuYWJsZSBhY2NlcHRpbmcgYnJva2VuIHBhY2tldHMuICovCisJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgU09OSUNfUkNSX0ZBRVIpCisJCQkJbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIFNPTklDX1JDUl9DUkNSKQorCQkJCWxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCX0KKworCQlyZC0+aW5fdXNlID0gMTsKKwkJcmQgPSAmbHAtPnJkYVsoKytscC0+Y3VyX3J4KSAmIFNPTklDX1JEU19NQVNLXTsKKwkJLyogbm93IGdpdmUgYmFjayB0aGUgYnVmZmVyIHRvIHRoZSByZWNlaXZlIGJ1ZmZlciBhcmVhICovCisJCWlmIChzdGF0dXMgJiBTT05JQ19SQ1JfTFBLVCkgeworCQkJLyoKKwkJCSAqIHRoaXMgd2FzIHRoZSBsYXN0IHBhY2tldCBvdXQgb2YgdGhlIGN1cnJlbnQgcmVjZWljZSBidWZmZXIKKwkJCSAqIGdpdmUgdGhlIGJ1ZmZlciBiYWNrIHRvIHRoZSBTT05JQworCQkJICovCisJCQlscC0+Y3VyX3JyYSArPSBzaXplb2Yoc29uaWNfcnJfdCk7CisJCQlpZiAobHAtPmN1cl9ycmEgPgorCQkJICAgIChscC0+cnJhX2xhZGRyICsKKwkJCSAgICAgKFNPTklDX05VTV9SUlMgLQorCQkJICAgICAgMSkgKiBzaXplb2Yoc29uaWNfcnJfdCkpKSBscC0+Y3VyX3JyYSA9CisJCQkJICAgIGxwLT5ycmFfbGFkZHI7CisJCQlTT05JQ19XUklURShTT05JQ19SV1AsIGxwLT5jdXJfcnJhICYgMHhmZmZmKTsKKwkJfSBlbHNlCisJCQlwcmludGsKKwkJCSAgICAoIiVzOiByeCBkZXNjIHdpdGhvdXQgUkNSX0xQS1QuIFNob3VsZG4ndCBoYXBwZW4gIT9cbiIsCisJCQkgICAgIGRldi0+bmFtZSk7CisJfQorCS8qCisJICogSWYgYW55IHdvcnRoLXdoaWxlIHBhY2tldHMgaGF2ZSBiZWVuIHJlY2VpdmVkLCBkZXZfcmludCgpCisJICogaGFzIGRvbmUgYSBtYXJrX2JoKE5FVF9CSCkgZm9yIHVzIGFuZCB3aWxsIHdvcmsgb24gdGhlbQorCSAqIHdoZW4gd2UgZ2V0IHRvIHRoZSBib3R0b20taGFsZiByb3V0aW5lLgorCSAqLworfQorCisKKy8qCisgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4KKyAqIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBkZXZpY2Ugb3BlbiBvciBjbG9zZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc29uaWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNvbmljX2xvY2FsICpscCA9IChzdHJ1Y3Qgc29uaWNfbG9jYWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGludCBiYXNlX2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCS8qIHJlYWQgdGhlIHRhbGx5IGNvdW50ZXIgZnJvbSB0aGUgU09OSUMgYW5kIHJlc2V0IHRoZW0gKi8KKwlscC0+c3RhdHMucnhfY3JjX2Vycm9ycyArPSBTT05JQ19SRUFEKFNPTklDX0NSQ1QpOworCVNPTklDX1dSSVRFKFNPTklDX0NSQ1QsIDB4ZmZmZik7CisJbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyArPSBTT05JQ19SRUFEKFNPTklDX0ZBRVQpOworCVNPTklDX1dSSVRFKFNPTklDX0ZBRVQsIDB4ZmZmZik7CisJbHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gU09OSUNfUkVBRChTT05JQ19NUFQpOworCVNPTklDX1dSSVRFKFNPTklDX01QVCwgMHhmZmZmKTsKKworCXJldHVybiAmbHAtPnN0YXRzOworfQorCisKKy8qCisgKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAqLworc3RhdGljIHZvaWQgc29uaWNfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc29uaWNfbG9jYWwgKmxwID0gKHN0cnVjdCBzb25pY19sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgaW50IGJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGludCByY3I7CisJc3RydWN0IGRldl9tY19saXN0ICpkbWkgPSBkZXYtPm1jX2xpc3Q7CisJdW5zaWduZWQgY2hhciAqYWRkcjsKKwlpbnQgaTsKKworCXJjciA9IFNPTklDX1JFQUQoU09OSUNfUkNSKSAmIH4oU09OSUNfUkNSX1BSTyB8IFNPTklDX1JDUl9BTUMpOworCXJjciB8PSBTT05JQ19SQ1JfQlJEOwkvKiBhY2NlcHQgYnJvYWRjYXN0IHBhY2tldHMgKi8KKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsJLyogc2V0IHByb21pc2N1b3VzIG1vZGUgKi8KKwkJcmNyIHw9IFNPTklDX1JDUl9QUk87CisJfSBlbHNlIHsKKwkJaWYgKChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fCAoZGV2LT5tY19jb3VudCA+IDE1KSkgeworCQkJcmNyIHw9IFNPTklDX1JDUl9BTUM7CisJCX0gZWxzZSB7CisJCQlpZiAoc29uaWNfZGVidWcgPiAyKQorCQkJCXByaW50aworCQkJCSAgICAoInNvbmljX211bHRpY2FzdF9saXN0OiBtY19jb3VudCAlZFxuIiwKKwkJCQkgICAgIGRldi0+bWNfY291bnQpOworCQkJbHAtPmNkYS5jYW1fZW5hYmxlID0gMTsJLyogYWx3YXlzIGVuYWJsZSBvdXIgb3duIGFkZHJlc3MgKi8KKwkJCWZvciAoaSA9IDE7IGkgPD0gZGV2LT5tY19jb3VudDsgaSsrKSB7CisJCQkJYWRkciA9IGRtaS0+ZG1pX2FkZHI7CisJCQkJZG1pID0gZG1pLT5uZXh0OworCQkJCWxwLT5jZGEuY2FtX2Rlc2NbaV0uY2FtX2NhcDAgPQorCQkJCSAgICBhZGRyWzFdIDw8IDggfCBhZGRyWzBdOworCQkJCWxwLT5jZGEuY2FtX2Rlc2NbaV0uY2FtX2NhcDEgPQorCQkJCSAgICBhZGRyWzNdIDw8IDggfCBhZGRyWzJdOworCQkJCWxwLT5jZGEuY2FtX2Rlc2NbaV0uY2FtX2NhcDIgPQorCQkJCSAgICBhZGRyWzVdIDw8IDggfCBhZGRyWzRdOworCQkJCWxwLT5jZGEuY2FtX2VuYWJsZSB8PSAoMSA8PCBpKTsKKwkJCX0KKwkJCVNPTklDX1dSSVRFKFNPTklDX0NEQywgMTYpOworCQkJLyogaXNzdWUgTG9hZCBDQU0gY29tbWFuZCAqLworCQkJU09OSUNfV1JJVEUoU09OSUNfQ0RQLCBscC0+Y2RhX2xhZGRyICYgMHhmZmZmKTsKKwkJCVNPTklDX1dSSVRFKFNPTklDX0NNRCwgU09OSUNfQ1JfTENBTSk7CisJCX0KKwl9CisKKwlpZiAoc29uaWNfZGVidWcgPiAyKQorCQlwcmludGsoInNvbmljX211bHRpY2FzdF9saXN0OiBzZXR0aW5nIFJDUj0leFxuIiwgcmNyKTsKKworCVNPTklDX1dSSVRFKFNPTklDX1JDUiwgcmNyKTsKK30KKworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgU09OSUMgZXRoZXJuZXQgY29udHJvbGxlci4KKyAqLworc3RhdGljIGludCBzb25pY19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgaW50IGJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGludCBjbWQ7CisJc3RydWN0IHNvbmljX2xvY2FsICpscCA9IChzdHJ1Y3Qgc29uaWNfbG9jYWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGludCBycmFfc3RhcnQ7CisJdW5zaWduZWQgaW50IHJyYV9lbmQ7CisJaW50IGk7CisKKwkvKgorCSAqIHB1dCB0aGUgU29uaWMgaW50byBzb2Z0d2FyZS1yZXNldCBtb2RlIGFuZAorCSAqIGRpc2FibGUgYWxsIGludGVycnVwdHMKKwkgKi8KKwlTT05JQ19XUklURShTT05JQ19JU1IsIDB4N2ZmZik7CisJU09OSUNfV1JJVEUoU09OSUNfSU1SLCAwKTsKKwlTT05JQ19XUklURShTT05JQ19DTUQsIFNPTklDX0NSX1JTVCk7CisKKwkvKgorCSAqIGNsZWFyIHNvZnR3YXJlIHJlc2V0IGZsYWcsIGRpc2FibGUgcmVjZWl2ZXIsIGNsZWFyIGFuZAorCSAqIGVuYWJsZSBpbnRlcnJ1cHRzLCB0aGVuIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZSB0aGUgU09OSUMKKwkgKi8KKwlTT05JQ19XUklURShTT05JQ19DTUQsIDApOworCVNPTklDX1dSSVRFKFNPTklDX0NNRCwgU09OSUNfQ1JfUlhESVMpOworCisJLyoKKwkgKiBpbml0aWFsaXplIHRoZSByZWNlaXZlIHJlc291cmNlIGFyZWEKKwkgKi8KKwlpZiAoc29uaWNfZGVidWcgPiAyKQorCQlwcmludGsoInNvbmljX2luaXQ6IGluaXRpYWxpemUgcmVjZWl2ZSByZXNvdXJjZSBhcmVhXG4iKTsKKworCXJyYV9zdGFydCA9IGxwLT5ycmFfbGFkZHIgJiAweGZmZmY7CisJcnJhX2VuZCA9CisJICAgIChycmFfc3RhcnQgKyAoU09OSUNfTlVNX1JSUyAqIHNpemVvZihzb25pY19ycl90KSkpICYgMHhmZmZmOworCisJZm9yIChpID0gMDsgaSA8IFNPTklDX05VTV9SUlM7IGkrKykgeworCQlscC0+cnJhW2ldLnJ4X2J1ZmFkcl9sID0KKwkJICAgIChscC0+cmJhX2xhZGRyICsgaSAqIFNPTklDX1JCU0laRSkgJiAweGZmZmY7CisJCWxwLT5ycmFbaV0ucnhfYnVmYWRyX2ggPQorCQkgICAgKGxwLT5yYmFfbGFkZHIgKyBpICogU09OSUNfUkJTSVpFKSA+PiAxNjsKKwkJbHAtPnJyYVtpXS5yeF9idWZzaXplX2wgPSBTT05JQ19SQlNJWkUgPj4gMTsKKwkJbHAtPnJyYVtpXS5yeF9idWZzaXplX2ggPSAwOworCX0KKworCS8qIGluaXRpYWxpemUgYWxsIFJSQSByZWdpc3RlcnMgKi8KKwlTT05JQ19XUklURShTT05JQ19SU0EsIHJyYV9zdGFydCk7CisJU09OSUNfV1JJVEUoU09OSUNfUkVBLCBycmFfZW5kKTsKKwlTT05JQ19XUklURShTT05JQ19SUlAsIHJyYV9zdGFydCk7CisJU09OSUNfV1JJVEUoU09OSUNfUldQLCBycmFfZW5kKTsKKwlTT05JQ19XUklURShTT05JQ19VUlJBLCBscC0+cnJhX2xhZGRyID4+IDE2KTsKKwlTT05JQ19XUklURShTT05JQ19FT0JDLCAoU09OSUNfUkJTSVpFIC0gMikgPj4gMSk7CisKKwlscC0+Y3VyX3JyYSA9CisJICAgIGxwLT5ycmFfbGFkZHIgKyAoU09OSUNfTlVNX1JSUyAtIDEpICogc2l6ZW9mKHNvbmljX3JyX3QpOworCisJLyogbG9hZCB0aGUgcmVzb3VyY2UgcG9pbnRlcnMgKi8KKwlpZiAoc29uaWNfZGVidWcgPiAzKQorCQlwcmludGsoInNvbmljX2luaXQ6IGlzc3VlaW5nIFJSUkEgY29tbWFuZFxuIik7CisKKwlTT05JQ19XUklURShTT05JQ19DTUQsIFNPTklDX0NSX1JSUkEpOworCWkgPSAwOworCXdoaWxlIChpKysgPCAxMDApIHsKKwkJaWYgKFNPTklDX1JFQUQoU09OSUNfQ01EKSAmIFNPTklDX0NSX1JSUkEpCisJCQlicmVhazsKKwl9CisKKwlpZiAoc29uaWNfZGVidWcgPiAyKQorCQlwcmludGsoInNvbmljX2luaXQ6IHN0YXR1cz0leFxuIiwgU09OSUNfUkVBRChTT05JQ19DTUQpKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgcmVjZWl2ZSBkZXNjcmlwdG9ycyBzbyB0aGF0IHRoZXkKKwkgKiBiZWNvbWUgYSBjaXJjdWxhciBsaW5rZWQgbGlzdCwgaWUuIGxldCB0aGUgbGFzdAorCSAqIGRlc2NyaXB0b3IgcG9pbnQgdG8gdGhlIGZpcnN0IGFnYWluLgorCSAqLworCWlmIChzb25pY19kZWJ1ZyA+IDIpCisJCXByaW50aygic29uaWNfaW5pdDogaW5pdGlhbGl6ZSByZWNlaXZlIGRlc2NyaXB0b3JzXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgU09OSUNfTlVNX1JEUzsgaSsrKSB7CisJCWxwLT5yZGFbaV0ucnhfc3RhdHVzID0gMDsKKwkJbHAtPnJkYVtpXS5yeF9wa3RsZW4gPSAwOworCQlscC0+cmRhW2ldLnJ4X3BrdHB0cl9sID0gMDsKKwkJbHAtPnJkYVtpXS5yeF9wa3RwdHJfaCA9IDA7CisJCWxwLT5yZGFbaV0ucnhfc2Vxbm8gPSAwOworCQlscC0+cmRhW2ldLmluX3VzZSA9IDE7CisJCWxwLT5yZGFbaV0ubGluayA9CisJCSAgICBscC0+cmRhX2xhZGRyICsgKGkgKyAxKSAqIHNpemVvZihzb25pY19yZF90KTsKKwl9CisJLyogZml4IGxhc3QgZGVzY3JpcHRvciAqLworCWxwLT5yZGFbU09OSUNfTlVNX1JEUyAtIDFdLmxpbmsgPSBscC0+cmRhX2xhZGRyOworCWxwLT5jdXJfcnggPSAwOworCVNPTklDX1dSSVRFKFNPTklDX1VSREEsIGxwLT5yZGFfbGFkZHIgPj4gMTYpOworCVNPTklDX1dSSVRFKFNPTklDX0NSREEsIGxwLT5yZGFfbGFkZHIgJiAweGZmZmYpOworCisJLyogCisJICogaW5pdGlhbGl6ZSB0cmFuc21pdCBkZXNjcmlwdG9ycworCSAqLworCWlmIChzb25pY19kZWJ1ZyA+IDIpCisJCXByaW50aygic29uaWNfaW5pdDogaW5pdGlhbGl6ZSB0cmFuc21pdCBkZXNjcmlwdG9yc1xuIik7CisJZm9yIChpID0gMDsgaSA8IFNPTklDX05VTV9URFM7IGkrKykgeworCQlscC0+dGRhW2ldLnR4X3N0YXR1cyA9IDA7CisJCWxwLT50ZGFbaV0udHhfY29uZmlnID0gMDsKKwkJbHAtPnRkYVtpXS50eF9wa3RzaXplID0gMDsKKwkJbHAtPnRkYVtpXS50eF9mcmFnX2NvdW50ID0gMDsKKwkJbHAtPnRkYVtpXS5saW5rID0KKwkJICAgIChscC0+dGRhX2xhZGRyICsKKwkJICAgICAoaSArIDEpICogc2l6ZW9mKHNvbmljX3RkX3QpKSB8IFNPTklDX0VORF9PRl9MSU5LUzsKKwl9CisJbHAtPnRkYVtTT05JQ19OVU1fVERTIC0gMV0ubGluayA9CisJICAgIChscC0+dGRhX2xhZGRyICYgMHhmZmZmKSB8IFNPTklDX0VORF9PRl9MSU5LUzsKKworCVNPTklDX1dSSVRFKFNPTklDX1VUREEsIGxwLT50ZGFfbGFkZHIgPj4gMTYpOworCVNPTklDX1dSSVRFKFNPTklDX0NUREEsIGxwLT50ZGFfbGFkZHIgJiAweGZmZmYpOworCWxwLT5jdXJfdHggPSBscC0+ZGlydHlfdHggPSAwOworCisJLyoKKwkgKiBwdXQgb3VyIG93biBhZGRyZXNzIHRvIENBTSBkZXNjWzBdCisJICovCisJbHAtPmNkYS5jYW1fZGVzY1swXS5jYW1fY2FwMCA9CisJICAgIGRldi0+ZGV2X2FkZHJbMV0gPDwgOCB8IGRldi0+ZGV2X2FkZHJbMF07CisJbHAtPmNkYS5jYW1fZGVzY1swXS5jYW1fY2FwMSA9CisJICAgIGRldi0+ZGV2X2FkZHJbM10gPDwgOCB8IGRldi0+ZGV2X2FkZHJbMl07CisJbHAtPmNkYS5jYW1fZGVzY1swXS5jYW1fY2FwMiA9CisJICAgIGRldi0+ZGV2X2FkZHJbNV0gPDwgOCB8IGRldi0+ZGV2X2FkZHJbNF07CisJbHAtPmNkYS5jYW1fZW5hYmxlID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlscC0+Y2RhLmNhbV9kZXNjW2ldLmNhbV9lbnRyeV9wb2ludGVyID0gaTsKKworCS8qCisJICogaW5pdGlhbGl6ZSBDQU0gcmVnaXN0ZXJzCisJICovCisJU09OSUNfV1JJVEUoU09OSUNfQ0RQLCBscC0+Y2RhX2xhZGRyICYgMHhmZmZmKTsKKwlTT05JQ19XUklURShTT05JQ19DREMsIDE2KTsKKworCS8qCisJICogbG9hZCB0aGUgQ0FNCisJICovCisJU09OSUNfV1JJVEUoU09OSUNfQ01ELCBTT05JQ19DUl9MQ0FNKTsKKworCWkgPSAwOworCXdoaWxlIChpKysgPCAxMDApIHsKKwkJaWYgKFNPTklDX1JFQUQoU09OSUNfSVNSKSAmIFNPTklDX0lOVF9MQ0QpCisJCQlicmVhazsKKwl9CisJaWYgKHNvbmljX2RlYnVnID4gMikgeworCQlwcmludGsoInNvbmljX2luaXQ6IENNRD0leCwgSVNSPSV4XG4iLAorCQkgICAgICAgU09OSUNfUkVBRChTT05JQ19DTUQpLCBTT05JQ19SRUFEKFNPTklDX0lTUikpOworCX0KKworCS8qCisJICogZW5hYmxlIHJlY2VpdmVyLCBkaXNhYmxlIGxvb3BiYWNrCisJICogYW5kIGVuYWJsZSBhbGwgaW50ZXJydXB0cworCSAqLworCVNPTklDX1dSSVRFKFNPTklDX0NNRCwgU09OSUNfQ1JfUlhFTiB8IFNPTklDX0NSX1NUUCk7CisJU09OSUNfV1JJVEUoU09OSUNfUkNSLCBTT05JQ19SQ1JfREVGQVVMVCk7CisJU09OSUNfV1JJVEUoU09OSUNfVENSLCBTT05JQ19UQ1JfREVGQVVMVCk7CisJU09OSUNfV1JJVEUoU09OSUNfSVNSLCAweDdmZmYpOworCVNPTklDX1dSSVRFKFNPTklDX0lNUiwgU09OSUNfSU1SX0RFRkFVTFQpOworCisJY21kID0gU09OSUNfUkVBRChTT05JQ19DTUQpOworCWlmICgoY21kICYgU09OSUNfQ1JfUlhFTikgPT0gMCB8fCAoY21kICYgU09OSUNfQ1JfU1RQKSA9PSAwKQorCQlwcmludGsoInNvbmljX2luaXQ6IGZhaWxlZCwgc3RhdHVzPSV4XG4iLCBjbWQpOworCisJaWYgKHNvbmljX2RlYnVnID4gMikKKwkJcHJpbnRrKCJzb25pY19pbml0OiBuZXcgc3RhdHVzPSV4XG4iLAorCQkgICAgICAgU09OSUNfUkVBRChTT05JQ19DTUQpKTsKKworCXJldHVybiAwOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zb25pYy5oIGIvZHJpdmVycy9uZXQvc29uaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGE2ZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc29uaWMuaApAQCAtMCwwICsxLDQ4MyBAQAorLyoKKyAqIEhlbHBmaWxlIGZvciBzb25pYy5jCisgKgorICogKEMpIFdhbGRvcmYgRWxlY3Ryb25pY3MsIEdlcm1hbnkKKyAqIFdyaXR0ZW4gYnkgQW5kcmVhcyBCdXNzZQorICoKKyAqIE5PVEU6IG1vc3Qgb2YgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBoZXJlIGFyZSBlbmRpYW4gZGVwZW5kZW50LgorICogSWYgeW91IHdhbnQgdG8gdXNlIHRoaXMgZHJpdmVyIG9uIGJpZyBlbmRpYW4gbWFjaGluZXMsIHRoZSBkYXRhCisgKiBhbmQgcGFkIHN0cnVjdHVyZSBtZW1iZXJzIG11c3QgYmUgZXhjaGFuZ2VkLiBBbHNvLCB0aGUgc3RydWN0dXJlcworICogbmVlZCB0byBiZSBjaGFuZ2VkIGFjY29yZGluZ2x5IHRvIHRoZSBidXMgc2l6ZS4gCisgKgorICogOTgxMjI5IE1TY2g6CWRpZCBqdXN0IHRoYXQgZm9yIHRoZSA2OGsgTWFjIHBvcnQgKDMyIGJpdCwgYmlnIGVuZGlhbiksCisgKgkJc2VlIENPTkZJR19NQUNTT05JQyBicmFuY2ggYmVsb3cuCisgKgorICovCisjaWZuZGVmIFNPTklDX0gKKyNkZWZpbmUgU09OSUNfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKy8qCisgKiBTT05JQyByZWdpc3RlciBvZmZzZXRzCisgKi8KKworI2RlZmluZSBTT05JQ19DTUQgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgU09OSUNfRENSICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFNPTklDX1JDUiAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBTT05JQ19UQ1IgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgU09OSUNfSU1SICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIFNPTklDX0lTUiAgICAgICAgICAgICAgMHgwNQorCisjZGVmaW5lIFNPTklDX1VUREEgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBTT05JQ19DVERBICAgICAgICAgICAgIDB4MDcKKworI2RlZmluZSBTT05JQ19VUkRBICAgICAgICAgICAgIDB4MGQKKyNkZWZpbmUgU09OSUNfQ1JEQSAgICAgICAgICAgICAweDBlCisjZGVmaW5lIFNPTklDX0VPQkMgICAgICAgICAgICAgMHgxMworI2RlZmluZSBTT05JQ19VUlJBICAgICAgICAgICAgIDB4MTQKKyNkZWZpbmUgU09OSUNfUlNBICAgICAgICAgICAgICAweDE1CisjZGVmaW5lIFNPTklDX1JFQSAgICAgICAgICAgICAgMHgxNgorI2RlZmluZSBTT05JQ19SUlAgICAgICAgICAgICAgIDB4MTcKKyNkZWZpbmUgU09OSUNfUldQICAgICAgICAgICAgICAweDE4CisjZGVmaW5lIFNPTklDX1JTQyAgICAgICAgICAgICAgMHgyYgorCisjZGVmaW5lIFNPTklDX0NFUCAgICAgICAgICAgICAgMHgyMQorI2RlZmluZSBTT05JQ19DQVAyICAgICAgICAgICAgIDB4MjIKKyNkZWZpbmUgU09OSUNfQ0FQMSAgICAgICAgICAgICAweDIzCisjZGVmaW5lIFNPTklDX0NBUDAgICAgICAgICAgICAgMHgyNAorI2RlZmluZSBTT05JQ19DRSAgICAgICAgICAgICAgIDB4MjUKKyNkZWZpbmUgU09OSUNfQ0RQICAgICAgICAgICAgICAweDI2CisjZGVmaW5lIFNPTklDX0NEQyAgICAgICAgICAgICAgMHgyNworCisjZGVmaW5lIFNPTklDX1dUMCAgICAgICAgICAgICAgMHgyOQorI2RlZmluZSBTT05JQ19XVDEgICAgICAgICAgICAgIDB4MmEKKworI2RlZmluZSBTT05JQ19TUiAgICAgICAgICAgICAgIDB4MjgKKworCisvKiB0ZXN0LW9ubHkgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgU09OSUNfVFBTCQkweDA4CisjZGVmaW5lIFNPTklDX1RGQwkJMHgwOQorI2RlZmluZSBTT05JQ19UU0EwCQkweDBhCisjZGVmaW5lIFNPTklDX1RTQTEJCTB4MGIKKyNkZWZpbmUgU09OSUNfVEZTCQkweDBjCisKKyNkZWZpbmUgU09OSUNfQ1JCQTAJCTB4MGYKKyNkZWZpbmUgU09OSUNfQ1JCQTEJCTB4MTAKKyNkZWZpbmUgU09OSUNfUkJXQzAJCTB4MTEKKyNkZWZpbmUgU09OSUNfUkJXQzEJCTB4MTIKKyNkZWZpbmUgU09OSUNfVFREQQkJMHgyMAorI2RlZmluZSBTT05JQ19NRFQJCTB4MmYKKworI2RlZmluZSBTT05JQ19UUkJBMAkJMHgxOQorI2RlZmluZSBTT05JQ19UUkJBMQkJMHgxYQorI2RlZmluZSBTT05JQ19UQldDMAkJMHgxYgorI2RlZmluZSBTT05JQ19UQldDMQkJMHgxYworI2RlZmluZSBTT05JQ19MTEZBCQkweDFmCisKKyNkZWZpbmUgU09OSUNfQUREUjAJCTB4MWQKKyNkZWZpbmUgU09OSUNfQUREUjEJCTB4MWUKKworLyoKKyAqIEVycm9yIGNvdW50ZXJzCisgKi8KKyNkZWZpbmUgU09OSUNfQ1JDVCAgICAgICAgICAgICAgMHgyYworI2RlZmluZSBTT05JQ19GQUVUICAgICAgICAgICAgICAweDJkCisjZGVmaW5lIFNPTklDX01QVCAgICAgICAgICAgICAgIDB4MmUKKworI2RlZmluZSBTT05JQ19EQ1IyICAgICAgICAgICAgICAweDNmCisKKy8qCisgKiBTT05JQyBjb21tYW5kIGJpdHMKKyAqLworCisjZGVmaW5lIFNPTklDX0NSX0xDQU0gICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBTT05JQ19DUl9SUlJBICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgU09OSUNfQ1JfUlNUICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFNPTklDX0NSX1NUICAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBTT05JQ19DUl9TVFAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgU09OSUNfQ1JfUlhFTiAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFNPTklDX0NSX1JYRElTICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBTT05JQ19DUl9UWFAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgU09OSUNfQ1JfSFRYICAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBTT05JQyBkYXRhIGNvbmZpZ3VyYXRpb24gYml0cworICovCisKKyNkZWZpbmUgU09OSUNfRENSX0VYQlVTICAgICAgICAgMHg4MDAwCisjZGVmaW5lIFNPTklDX0RDUl9MQlIgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBTT05JQ19EQ1JfUE8xICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgU09OSUNfRENSX1BPMCAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFNPTklDX0RDUl9TQlVTICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBTT05JQ19EQ1JfVVNSMSAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgU09OSUNfRENSX1VTUjAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFNPTklDX0RDUl9XQzEgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBTT05JQ19EQ1JfV0MwICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgU09OSUNfRENSX0RXICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFNPTklDX0RDUl9CTVMgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBTT05JQ19EQ1JfUkZUMSAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgU09OSUNfRENSX1JGVDAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFNPTklDX0RDUl9URlQxICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBTT05JQ19EQ1JfVEZUMCAgICAgICAgICAweDAwMDEKKworLyoKKyAqIENvbnN0YW50cyBmb3IgdGhlIFNPTklDIHJlY2VpdmUgY29udHJvbCByZWdpc3Rlci4KKyAqLworCisjZGVmaW5lIFNPTklDX1JDUl9FUlIgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBTT05JQ19SQ1JfUk5UICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgU09OSUNfUkNSX0JSRCAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFNPTklDX1JDUl9QUk8gICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBTT05JQ19SQ1JfQU1DICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgU09OSUNfUkNSX0xCMSAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFNPTklDX1JDUl9MQjAgICAgICAgICAgIDB4MDIwMAorCisjZGVmaW5lIFNPTklDX1JDUl9NQyAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBTT05JQ19SQ1JfQkMgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgU09OSUNfUkNSX0xQS1QgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFNPTklDX1JDUl9DUlMgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBTT05JQ19SQ1JfQ09MICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgU09OSUNfUkNSX0NSQ1IgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFNPTklDX1JDUl9GQUVSICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBTT05JQ19SQ1JfTEJLICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgU09OSUNfUkNSX1BSWCAgICAgICAgICAgMHgwMDAxCisKKyNkZWZpbmUgU09OSUNfUkNSX0xCX09GRiAgICAgICAgMAorI2RlZmluZSBTT05JQ19SQ1JfTEJfTUFDICAgICAgICBTT05JQ19SQ1JfTEIwCisjZGVmaW5lIFNPTklDX1JDUl9MQl9FTkRFQyAgICAgIFNPTklDX1JDUl9MQjEKKyNkZWZpbmUgU09OSUNfUkNSX0xCX1RSQU5TICAgICAgKFNPTklDX1JDUl9MQjAgfCBTT05JQ19SQ1JfTEIxKQorCisvKiBkZWZhdWx0IFJDUiBzZXR1cCAqLworCisjZGVmaW5lIFNPTklDX1JDUl9ERUZBVUxUICAgICAgIChTT05JQ19SQ1JfQlJEKQorCisKKy8qCisgKiBTT05JQyBUcmFuc21pdCBDb250cm9sIHJlZ2lzdGVyIGJpdHMKKyAqLworCisjZGVmaW5lIFNPTklDX1RDUl9QSU5UUiAgICAgICAgIDB4ODAwMAorI2RlZmluZSBTT05JQ19UQ1JfUE9XQyAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgU09OSUNfVENSX0NSQ0kgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFNPTklDX1RDUl9FWERJUyAgICAgICAgIDB4MTAwMAorI2RlZmluZSBTT05JQ19UQ1JfRVhEICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgU09OSUNfVENSX0RFRiAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFNPTklDX1RDUl9OQ1JTICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBTT05JQ19UQ1JfQ1JMUyAgICAgICAgICAweDAwODAKKyNkZWZpbmUgU09OSUNfVENSX0VYQyAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFNPTklDX1RDUl9QTUIgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBTT05JQ19UQ1JfRlUgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgU09OSUNfVENSX0JDTSAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFNPTklDX1RDUl9QVFggICAgICAgICAgIDB4MDAwMQorCisjZGVmaW5lIFNPTklDX1RDUl9ERUZBVUxUICAgICAgIDB4MDAwMAorCisvKiAKKyAqIENvbnN0YW50cyBmb3IgdGhlIFNPTklDX0lOVEVSUlVQVF9NQVNLIGFuZAorICogU09OSUNfSU5URVJSVVBUX1NUQVRVUyByZWdpc3RlcnMuCisgKi8KKworI2RlZmluZSBTT05JQ19JTlRfQlIJCTB4NDAwMAorI2RlZmluZSBTT05JQ19JTlRfSEJMCQkweDIwMDAKKyNkZWZpbmUgU09OSUNfSU5UX0xDRCAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFNPTklDX0lOVF9QSU5UICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBTT05JQ19JTlRfUEtUUlggICAgICAgICAweDA0MDAKKyNkZWZpbmUgU09OSUNfSU5UX1RYRE4gICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFNPTklDX0lOVF9UWEVSICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBTT05JQ19JTlRfVEMgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgU09OSUNfSU5UX1JERSAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFNPTklDX0lOVF9SQkUgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBTT05JQ19JTlRfUkJBRQkJMHgwMDEwCisjZGVmaW5lIFNPTklDX0lOVF9DUkMJCTB4MDAwOAorI2RlZmluZSBTT05JQ19JTlRfRkFFCQkweDAwMDQKKyNkZWZpbmUgU09OSUNfSU5UX01QCQkweDAwMDIKKyNkZWZpbmUgU09OSUNfSU5UX1JGTwkJMHgwMDAxCisKKworLyoKKyAqIFRoZSBpbnRlcnJ1cHRzIHdlIGFsbG93LgorICovCisKKyNkZWZpbmUgU09OSUNfSU1SX0RFRkFVTFQJKFNPTklDX0lOVF9CUiB8IFwKKwkJCQlTT05JQ19JTlRfTENEIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JQ19JTlRfUElOVCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUNfSU5UX1BLVFJYIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JQ19JTlRfVFhETiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUNfSU5UX1RYRVIgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklDX0lOVF9SREUgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklDX0lOVF9SQkUgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklDX0lOVF9SQkFFIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JQ19JTlRfQ1JDIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JQ19JTlRfRkFFIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JQ19JTlRfTVApCisKKworI2RlZmluZQlTT05JQ19FTkRfT0ZfTElOS1MJMHgwMDAxCisKKworI2lmZGVmIENPTkZJR19NQUNTT05JQworLyoKKyAqIEJpZyBlbmRpYW4gbGlrZSBzdHJ1Y3R1cmVzIG9uIDY4MHgwIE1hY3MKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyIHJ4X2J1ZmFkcl9sOwkvKiByZWNlaXZlIGJ1ZmZlciBwdHIgKi8KKwl1MzIgcnhfYnVmYWRyX2g7CisKKwl1MzIgcnhfYnVmc2l6ZV9sOwkvKiBuby4gb2Ygd29yZHMgaW4gdGhlIHJlY2VpdmUgYnVmZmVyICovCisJdTMyIHJ4X2J1ZnNpemVfaDsKK30gc29uaWNfcnJfdDsKKworLyoKKyAqIFNvbmljIHJlY2VpdmUgZGVzY3JpcHRvci4gUmVjZWl2ZSBkZXNjcmlwdG9ycyBhcmUKKyAqIGtlcHQgaW4gYSBsaW5rZWQgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlTUkVHU19QQUQocGFkMCk7CisJdTE2IHJ4X3N0YXR1czsJCS8qIHN0YXR1cyBhZnRlciByZWNlcHRpb24gb2YgYSBwYWNrZXQgKi8KKwkgU1JFR1NfUEFEKHBhZDEpOworCXUxNiByeF9wa3RsZW47CQkvKiBsZW5ndGggb2YgdGhlIHBhY2tldCBpbmNsLiBDUkMgKi8KKworCS8qCisJICogUG9pbnRlcnMgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSByZWNlaXZlIGJ1ZmZlciBhcmVhIChSQkEpCisJICogd2hlcmUgdGhlIHBhY2tldCByZXNpZGVzLiBBIHBhY2tldCBpcyBhbHdheXMgcmVjZWl2ZWQgaW50bworCSAqIGEgY29udGlndW91cyBwaWVjZSBvZiBtZW1vcnkuCisJICovCisJIFNSRUdTX1BBRChwYWQyKTsKKwl1MTYgcnhfcGt0cHRyX2w7CisJIFNSRUdTX1BBRChwYWQzKTsKKwl1MTYgcnhfcGt0cHRyX2g7CisKKwkgU1JFR1NfUEFEKHBhZDQpOworCXUxNiByeF9zZXFubzsJCS8qIHNlcXVlbmNlIG5vLiAqLworCisJIFNSRUdTX1BBRChwYWQ1KTsKKwl1MTYgbGluazsJCS8qIGxpbmsgdG8gbmV4dCBSREQgKGVuZCBpZiBFT0wgYml0IHNldCkgKi8KKworCS8qCisJICogT3duZXIgb2YgdGhpcyBkZXNjcmlwdG9yLCAwPSBkcml2ZXIsIDE9c29uaWMKKwkgKi8KKworCSBTUkVHU19QQUQocGFkNik7CisJdTE2IGluX3VzZTsKKworCWNhZGRyX3QgcmRhX25leHQ7CS8qIHBvaW50ZXIgdG8gbmV4dCBSRCAqLworfSBzb25pY19yZF90OworCisKKy8qCisgKiBEZXNjcmliZXMgYSBUcmFuc21pdCBEZXNjcmlwdG9yCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlTUkVHU19QQUQocGFkMCk7CisJdTE2IHR4X3N0YXR1czsJCS8qIHN0YXR1cyBhZnRlciB0cmFuc21pc3Npb24gb2YgYSBwYWNrZXQgKi8KKwkgU1JFR1NfUEFEKHBhZDEpOworCXUxNiB0eF9jb25maWc7CQkvKiB0cmFuc21pdCBjb25maWd1cmF0aW9uIGZvciB0aGlzIHBhY2tldCAqLworCSBTUkVHU19QQUQocGFkMik7CisJdTE2IHR4X3BrdHNpemU7CQkvKiBzaXplIG9mIHRoZSBwYWNrZXQgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KKwkgU1JFR1NfUEFEKHBhZDMpOworCXUxNiB0eF9mcmFnX2NvdW50OwkvKiBuby4gb2YgZnJhZ21lbnRzICovCisKKwkgU1JFR1NfUEFEKHBhZDQpOworCXUxNiB0eF9mcmFnX3B0cl9sOworCSBTUkVHU19QQUQocGFkNSk7CisJdTE2IHR4X2ZyYWdfcHRyX2g7CisJIFNSRUdTX1BBRChwYWQ2KTsKKwl1MTYgdHhfZnJhZ19zaXplOworCisJIFNSRUdTX1BBRChwYWQ3KTsKKwl1MTYgbGluazsJCS8qIHB0ciB0byBuZXh0IGRlc2NyaXB0b3IgKi8KK30gc29uaWNfdGRfdDsKKworCisvKgorICogRGVzY3JpYmVzIGFuIGVudHJ5IGluIHRoZSBDQU0gRGVzY3JpcHRvciBBcmVhLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlTUkVHU19QQUQocGFkMCk7CisJdTE2IGNhbV9lbnRyeV9wb2ludGVyOworCSBTUkVHU19QQUQocGFkMSk7CisJdTE2IGNhbV9jYXAwOworCSBTUkVHU19QQUQocGFkMik7CisJdTE2IGNhbV9jYXAxOworCSBTUkVHU19QQUQocGFkMyk7CisJdTE2IGNhbV9jYXAyOworfSBzb25pY19jZF90OworCisjZGVmaW5lIENBTV9ERVNDUklQVE9SUyAxNgorCisKK3R5cGVkZWYgc3RydWN0IHsKKwlzb25pY19jZF90IGNhbV9kZXNjW0NBTV9ERVNDUklQVE9SU107CisJIFNSRUdTX1BBRChwYWQpOworCXUxNiBjYW1fZW5hYmxlOworfSBzb25pY19jZGFfdDsKKworI2Vsc2UJCQkJLyogb3JpZ2luYWwgZGVjbGFyYXRpb25zLCBsaXR0bGUgZW5kaWFuIDMyIGJpdCAqLworCisvKgorICogc3RydWN0dXJlIGRlZmluaXRpb25zCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiByeF9idWZhZHJfbDsJLyogcmVjZWl2ZSBidWZmZXIgcHRyICovCisJdTMyIHJ4X2J1ZmFkcl9oOworCisJdTMyIHJ4X2J1ZnNpemVfbDsJLyogbm8uIG9mIHdvcmRzIGluIHRoZSByZWNlaXZlIGJ1ZmZlciAqLworCXUzMiByeF9idWZzaXplX2g7Cit9IHNvbmljX3JyX3Q7CisKKy8qCisgKiBTb25pYyByZWNlaXZlIGRlc2NyaXB0b3IuIFJlY2VpdmUgZGVzY3JpcHRvcnMgYXJlCisgKiBrZXB0IGluIGEgbGlua2VkIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IHJ4X3N0YXR1czsJCS8qIHN0YXR1cyBhZnRlciByZWNlcHRpb24gb2YgYSBwYWNrZXQgKi8KKwkgU1JFR1NfUEFEKHBhZDApOworCXUxNiByeF9wa3RsZW47CQkvKiBsZW5ndGggb2YgdGhlIHBhY2tldCBpbmNsLiBDUkMgKi8KKwkgU1JFR1NfUEFEKHBhZDEpOworCisJLyoKKwkgKiBQb2ludGVycyB0byB0aGUgbG9jYXRpb24gaW4gdGhlIHJlY2VpdmUgYnVmZmVyIGFyZWEgKFJCQSkKKwkgKiB3aGVyZSB0aGUgcGFja2V0IHJlc2lkZXMuIEEgcGFja2V0IGlzIGFsd2F5cyByZWNlaXZlZCBpbnRvCisJICogYSBjb250aWd1b3VzIHBpZWNlIG9mIG1lbW9yeS4KKwkgKi8KKwl1MTYgcnhfcGt0cHRyX2w7CisJIFNSRUdTX1BBRChwYWQyKTsKKwl1MTYgcnhfcGt0cHRyX2g7CisJIFNSRUdTX1BBRChwYWQzKTsKKworCXUxNiByeF9zZXFubzsJCS8qIHNlcXVlbmNlIG5vLiAqLworCSBTUkVHU19QQUQocGFkNCk7CisKKwl1MTYgbGluazsJCS8qIGxpbmsgdG8gbmV4dCBSREQgKGVuZCBpZiBFT0wgYml0IHNldCkgKi8KKwkgU1JFR1NfUEFEKHBhZDUpOworCisJLyoKKwkgKiBPd25lciBvZiB0aGlzIGRlc2NyaXB0b3IsIDA9IGRyaXZlciwgMT1zb25pYworCSAqLworCisJdTE2IGluX3VzZTsKKwkgU1JFR1NfUEFEKHBhZDYpOworCisJY2FkZHJfdCByZGFfbmV4dDsJLyogcG9pbnRlciB0byBuZXh0IFJEICovCit9IHNvbmljX3JkX3Q7CisKKworLyoKKyAqIERlc2NyaWJlcyBhIFRyYW5zbWl0IERlc2NyaXB0b3IKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiB0eF9zdGF0dXM7CQkvKiBzdGF0dXMgYWZ0ZXIgdHJhbnNtaXNzaW9uIG9mIGEgcGFja2V0ICovCisJIFNSRUdTX1BBRChwYWQwKTsKKwl1MTYgdHhfY29uZmlnOwkJLyogdHJhbnNtaXQgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBwYWNrZXQgKi8KKwkgU1JFR1NfUEFEKHBhZDEpOworCXUxNiB0eF9wa3RzaXplOwkJLyogc2l6ZSBvZiB0aGUgcGFja2V0IHRvIGJlIHRyYW5zbWl0dGVkICovCisJIFNSRUdTX1BBRChwYWQyKTsKKwl1MTYgdHhfZnJhZ19jb3VudDsJLyogbm8uIG9mIGZyYWdtZW50cyAqLworCSBTUkVHU19QQUQocGFkMyk7CisKKwl1MTYgdHhfZnJhZ19wdHJfbDsKKwkgU1JFR1NfUEFEKHBhZDQpOworCXUxNiB0eF9mcmFnX3B0cl9oOworCSBTUkVHU19QQUQocGFkNSk7CisJdTE2IHR4X2ZyYWdfc2l6ZTsKKwkgU1JFR1NfUEFEKHBhZDYpOworCisJdTE2IGxpbms7CQkvKiBwdHIgdG8gbmV4dCBkZXNjcmlwdG9yICovCisJIFNSRUdTX1BBRChwYWQ3KTsKK30gc29uaWNfdGRfdDsKKworCisvKgorICogRGVzY3JpYmVzIGFuIGVudHJ5IGluIHRoZSBDQU0gRGVzY3JpcHRvciBBcmVhLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgY2FtX2VudHJ5X3BvaW50ZXI7CisJIFNSRUdTX1BBRChwYWQwKTsKKwl1MTYgY2FtX2NhcDA7CisJIFNSRUdTX1BBRChwYWQxKTsKKwl1MTYgY2FtX2NhcDE7CisJIFNSRUdTX1BBRChwYWQyKTsKKwl1MTYgY2FtX2NhcDI7CisJIFNSRUdTX1BBRChwYWQzKTsKK30gc29uaWNfY2RfdDsKKworI2RlZmluZSBDQU1fREVTQ1JJUFRPUlMgMTYKKworCit0eXBlZGVmIHN0cnVjdCB7CisJc29uaWNfY2RfdCBjYW1fZGVzY1tDQU1fREVTQ1JJUFRPUlNdOworCXUxNiBjYW1fZW5hYmxlOworCSBTUkVHU19QQUQocGFkKTsKK30gc29uaWNfY2RhX3Q7CisjZW5kaWYJCQkJLyogZW5kaWFubmVzcyAqLworCisvKgorICogU29tZSB0dW5hYmxlcyBmb3IgdGhlIGJ1ZmZlciBhcmVhcy4gUG93ZXIgb2YgMiBpcyByZXF1aXJlZAorICogdGhlIGN1cnJlbnQgZHJpdmVyIHVzZXMgb25lIHJlY2VpdmUgYnVmZmVyIGZvciBlYWNoIGRlc2NyaXB0b3IuCisgKgorICogTVNjaDogdXNlIG1vcmUgYnVmZmVyIHNwYWNlIGZvciB0aGUgc2xvdyBtNjhrIE1hY3MhCisgKi8KKyNpZmRlZiBDT05GSUdfTUFDU09OSUMKKyNkZWZpbmUgU09OSUNfTlVNX1JSUyAgICAzMgkvKiBudW1iZXIgb2YgcmVjZWl2ZSByZXNvdXJjZXMgKi8KKyNkZWZpbmUgU09OSUNfTlVNX1JEUyAgICBTT05JQ19OVU1fUlJTCS8qIG51bWJlciBvZiByZWNlaXZlIGRlc2NyaXB0b3JzICovCisjZGVmaW5lIFNPTklDX05VTV9URFMgICAgMzIJLyogbnVtYmVyIG9mIHRyYW5zbWl0IGRlc2NyaXB0b3JzICovCisjZWxzZQorI2RlZmluZSBTT05JQ19OVU1fUlJTICAgIDE2CS8qIG51bWJlciBvZiByZWNlaXZlIHJlc291cmNlcyAqLworI2RlZmluZSBTT05JQ19OVU1fUkRTICAgIFNPTklDX05VTV9SUlMJLyogbnVtYmVyIG9mIHJlY2VpdmUgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgU09OSUNfTlVNX1REUyAgICAxNgkvKiBudW1iZXIgb2YgdHJhbnNtaXQgZGVzY3JpcHRvcnMgKi8KKyNlbmRpZgorI2RlZmluZSBTT05JQ19SQlNJWkUgICAxNTIwCS8qIHNpemUgb2Ygb25lIHJlc291cmNlIGJ1ZmZlciAqLworCisjZGVmaW5lIFNPTklDX1JEU19NQVNLICAgKFNPTklDX05VTV9SRFMtMSkKKyNkZWZpbmUgU09OSUNfVERTX01BU0sgICAoU09OSUNfTlVNX1REUy0xKQorCisKKy8qIEluZm9ybWF0aW9uIHRoYXQgbmVlZCB0byBiZSBrZXB0IGZvciBlYWNoIGJvYXJkLiAqLworc3RydWN0IHNvbmljX2xvY2FsIHsKKwlzb25pY19jZGFfdCBjZGE7CS8qIHZpcnR1YWwgQ1BVIGFkZHJlc3Mgb2YgQ0RBICovCisJc29uaWNfdGRfdCB0ZGFbU09OSUNfTlVNX1REU107CS8qIHRyYW5zbWl0IGRlc2NyaXB0b3IgYXJlYSAqLworCXNvbmljX3JyX3QgcnJhW1NPTklDX05VTV9SUlNdOwkvKiByZWNlaXZlIHJlc291cmNlIGFyZWEgKi8KKwlzb25pY19yZF90IHJkYVtTT05JQ19OVU1fUkRTXTsJLyogcmVjZWl2ZSBkZXNjcmlwdG9yIGFyZWEgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiW1NPTklDX05VTV9URFNdOwkvKiBza2J1ZmZzIGZvciBwYWNrZXRzIHRvIHRyYW5zbWl0ICovCisJdW5zaWduZWQgaW50IHR4X2xhZGRyW1NPTklDX05VTV9URFNdOwkvKiBsb2dpY2FsIERNQSBhZGRyZXNzIGZybyBza2J1ZmZzICovCisJdW5zaWduZWQgY2hhciAqcmJhOwkvKiBzdGFydCBvZiByZWNlaXZlIGJ1ZmZlciBhcmVhcyAqLworCXVuc2lnbmVkIGludCBjZGFfbGFkZHI7CS8qIGxvZ2ljYWwgRE1BIGFkZHJlc3Mgb2YgQ0RBICovCisJdW5zaWduZWQgaW50IHRkYV9sYWRkcjsJLyogbG9naWNhbCBETUEgYWRkcmVzcyBvZiBUREEgKi8KKwl1bnNpZ25lZCBpbnQgcnJhX2xhZGRyOwkvKiBsb2dpY2FsIERNQSBhZGRyZXNzIG9mIFJSQSAqLworCXVuc2lnbmVkIGludCByZGFfbGFkZHI7CS8qIGxvZ2ljYWwgRE1BIGFkZHJlc3Mgb2YgUkRBICovCisJdW5zaWduZWQgaW50IHJiYV9sYWRkcjsJLyogbG9naWNhbCBETUEgYWRkcmVzcyBvZiBSQkEgKi8KKwl1bnNpZ25lZCBpbnQgY3VyX3JyYTsJLyogY3VycmVudCBpbmRleGVzIHRvIHJlc291cmNlIGFyZWFzICovCisJdW5zaWduZWQgaW50IGN1cl9yeDsKKwl1bnNpZ25lZCBpbnQgY3VyX3R4OworCXVuc2lnbmVkIGludCBkaXJ0eV90eDsJLyogbGFzdCB1bmFja2VkIHRyYW5zbWl0IHBhY2tldCAqLworCWNoYXIgdHhfZnVsbDsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKK307CisKKyNkZWZpbmUgVFhfVElNRU9VVCA2CisKKy8qIEluZGV4IHRvIGZ1bmN0aW9ucywgYXMgZnVuY3Rpb24gcHJvdG90eXBlcy4gKi8KKworc3RhdGljIGludCBzb25pY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzb25pY19zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBzb25pY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBzb25pY19yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc29uaWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNvbmljX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNvbmljX211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzb25pY19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc29uaWNfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb24gPQorICAgICJzb25pYy5jOnYwLjkyIDIwLjkuOTggdHNib2dlbmRAYWxwaGEuZnJhbmtlbi5kZVxuIjsKKworI2VuZGlmIC8qIFNPTklDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N0YXJmaXJlLmMgYi9kcml2ZXJzL25ldC9zdGFyZmlyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNmJkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdGFyZmlyZS5jCkBAIC0wLDAgKzEsMjIxOCBAQAorLyogc3RhcmZpcmUuYzogTGludXggZGV2aWNlIGRyaXZlciBmb3IgdGhlIEFkYXB0ZWMgU3RhcmZpcmUgbmV0d29yayBhZGFwdGVyLiAqLworLyoKKwlXcml0dGVuIDE5OTgtMjAwMCBieSBEb25hbGQgQmVja2VyLgorCisJQ3VycmVudCBtYWludGFpbmVyIGlzIElvbiBCYWR1bGVzY3UgPGlvbnV0QGNzLmNvbHVtYmlhLmVkdT4uIFBsZWFzZQorCXNlbmQgYWxsIGJ1ZyByZXBvcnRzIHRvIG1lLCBhbmQgbm90IHRvIERvbmFsZCBCZWNrZXIsIGFzIHRoaXMgY29kZQorCWhhcyBiZWVuIGhlYXZpbHkgbW9kaWZpZWQgZnJvbSBEb25hbGQncyBvcmlnaW5hbCB2ZXJzaW9uLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorCXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisJRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdAorCXJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZS4gIFRoaXMgZmlsZSBpcyBub3QKKwlhIGNvbXBsZXRlIHByb2dyYW0gYW5kIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgZW50aXJlIG9wZXJhdGluZworCXN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorCisJVGhlIGluZm9ybWF0aW9uIGJlbG93IGNvbWVzIGZyb20gRG9uYWxkIEJlY2tlcidzIG9yaWdpbmFsIGRyaXZlcjoKKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisJNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKwlBbm5hcG9saXMgTUQgMjE0MDMKKworCVN1cHBvcnQgYW5kIHVwZGF0ZXMgYXZhaWxhYmxlIGF0CisJaHR0cDovL3d3dy5zY3lsZC5jb20vbmV0d29yay9zdGFyZmlyZS5odG1sCisKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJTGludXgga2VybmVsLXNwZWNpZmljIGNoYW5nZXM6CisKKwlMSzEuMS4xIChqZ2FyemlrKToKKwktIFVzZSBQQ0kgZHJpdmVyIGludGVyZmFjZQorCS0gRml4IE1PRF94eHggcmFjZXMKKwktIHNvZnRuZXQgZml4dXBzCisKKwlMSzEuMS4yIChqZ2FyemlrKToKKwktIE1lcmdlIEJlY2tlciB2ZXJzaW9uIDAuMTUKKworCUxLMS4xLjMgKEFuZHJldyBNb3J0b24pCisJLSBUaW1lciBjbGVhbnVwcworCisJTEsxLjEuNCAoamdhcnppayk6CisJLSBNZXJnZSBCZWNrZXIgdmVyc2lvbiAxLjAzCisKKwlMSzEuMi4xIChJb24gQmFkdWxlc2N1IDxpb251dEBjcy5jb2x1bWJpYS5lZHU+KQorCS0gU3VwcG9ydCBoYXJkd2FyZSBSeC9UeCBjaGVja3N1bW1pbmcKKwktIFVzZSB0aGUgR0ZQIGZpcm13YXJlIHRha2VuIGZyb20gQWRhcHRlYydzIE5ldHdhcmUgZHJpdmVyCisKKwlMSzEuMi4yIChJb24gQmFkdWxlc2N1KQorCS0gQmFja3BvcnRlZCB0byAyLjIueAorCisJTEsxLjIuMyAoSW9uIEJhZHVsZXNjdSkKKwktIEZpeCB0aGUgZmxha3kgbWRpbyBpbnRlcmZhY2UKKwktIE1vcmUgY29tcGF0IGNsZWFuLXVwcworCisJTEsxLjIuNCAoSW9uIEJhZHVsZXNjdSkKKwktIE1vcmUgMi4yLnggaW5pdGlhbGl6YXRpb24gZml4ZXMKKworCUxLMS4yLjUgKElvbiBCYWR1bGVzY3UpCisJLSBTZXZlcmFsIGZpeGVzIGZyb20gTWFuZnJlZCBTcHJhdWwKKworCUxLMS4yLjYgKElvbiBCYWR1bGVzY3UpCisJLSBGaXhlZCBpZnVwL2lmZG93bi9pZnVwIHByb2JsZW0gaW4gMi40LngKKworCUxLMS4yLjcgKElvbiBCYWR1bGVzY3UpCisJLSBSZW1vdmVkIHVudXNlZCBjb2RlCisJLSBNYWRlIG1vcmUgZnVuY3Rpb25zIHN0YXRpYyBhbmQgX19pbml0CisKKwlMSzEuMi44IChJb24gQmFkdWxlc2N1KQorCS0gUXVlbGwgYm9ndXMgZXJyb3IgbWVzc2FnZXMsIGluZm9ybSBhYm91dCB0aGUgVHggdGhyZXNob2xkCisJLSBSZW1vdmVkICNpZmRlZiBDT05GSUdfUENJLCB0aGlzIGRyaXZlciBpcyBQQ0kgb25seQorCisJTEsxLjIuOSAoSW9uIEJhZHVsZXNjdSkKKwktIE1lcmdlZCBKZWZmIEdhcnppaydzIGNoYW5nZXMgZnJvbSAyLjQuNC1wcmU1CisJLSBBZGRlZCAyLjIueCBjb21wYXRpYmlsaXR5IHN0dWZmIHJlcXVpcmVkIGJ5IHRoZSBhYm92ZSBjaGFuZ2VzCisKKwlMSzEuMi45YSAoSW9uIEJhZHVsZXNjdSkKKwktIE1vcmUgdXBkYXRlcyBmcm9tIEplZmYgR2FyemlrCisKKwlMSzEuMy4wIChJb24gQmFkdWxlc2N1KQorCS0gTWVyZ2VkIHplcm9jb3B5IHN1cHBvcnQKKworCUxLMS4zLjEgKElvbiBCYWR1bGVzY3UpCisJLSBBZGRlZCBldGh0b29sIHN1cHBvcnQKKwktIEFkZGVkIEdQSU8gKG1lZGlhIGNoYW5nZSkgaW50ZXJydXB0IHN1cHBvcnQKKworCUxLMS4zLjIgKElvbiBCYWR1bGVzY3UpCisJLSBGaXhlZCAyLjIueCBjb21wYXRpYmlsaXR5IGlzc3VlcyBpbnRyb2R1Y2VkIGluIDEuMy4xCisJLSBGaXhlZCBldGh0b29sIGlvY3RsIHJldHVybmluZyB1bmluaXRpYWxpemVkIG1lbW9yeQorCisJTEsxLjMuMyAoSW9uIEJhZHVsZXNjdSkKKwktIEluaXRpYWxpemUgdGhlIFR4TW9kZSByZWdpc3RlciBwcm9wZXJseQorCS0gRG9uJ3QgZGVyZWZlcmVuY2UgZGV2LT5wcml2IGFmdGVyIGZyZWVpbmcgaXQKKworCUxLMS4zLjQgKElvbiBCYWR1bGVzY3UpCisJLSBGaXhlZCBpbml0aWFsaXphdGlvbiB0aW1pbmcgcHJvYmxlbXMKKwktIEZpeGVkIGludGVycnVwdCBtYXNrIGRlZmluaXRpb25zCisKKwlMSzEuMy41IChqZ2FyemlrKQorCS0gZXRodG9vbCBOV0FZX1JTVCwgR0xJTkssIFtHU11NU0dMVkwgc3VwcG9ydAorCisJTEsxLjMuNjoKKwktIFNwYXJjNjQgc3VwcG9ydCBhbmQgZml4ZXMgKElvbiBCYWR1bGVzY3UpCisJLSBCZXR0ZXIgc3RhdHMgYW5kIGVycm9yIGhhbmRsaW5nIChJb24gQmFkdWxlc2N1KQorCS0gVXNlIG5ldyBwY2lfc2V0X213aSgpIFBDSSBBUEkgZnVuY3Rpb24gKGpnYXJ6aWspCisKKwlMSzEuMy43IChJb24gQmFkdWxlc2N1KQorCS0gbWluaW1hbCBpbXBsZW1lbnRhdGlvbiBvZiB0eF90aW1lb3V0KCkKKwktIGNvcnJlY3RseSBzaHV0ZG93biB0aGUgUngvVHggZW5naW5lcyBpbiBuZXRkZXZfY2xvc2UoKQorCS0gYWRkZWQgY2FsbHMgdG8gbmV0aWZfY2Fycmllcl9vbi9vZmYKKwkocGF0Y2ggZnJvbSBTdGVmYW4gUm9tcGYgPHNyb21wZkBpc2cuZGU+KQorCS0gVkxBTiBzdXBwb3J0CisKKwlMSzEuMy44IChJb24gQmFkdWxlc2N1KQorCS0gYWRqdXN0IERNQSBidXJzdCBzaXplIG9uIHNwYXJjNjQKKwktIDY0LWJpdCBzdXBwb3J0CisJLSByZXdvcmtlZCB6ZXJvY29weSBzdXBwb3J0IGZvciA2NC1iaXQgYnVmZmVycworCS0gd29ya2luZyBhbmQgdXNhYmxlIGludGVycnVwdCBtaXRpZ2F0aW9uL2xhdGVuY3kKKwktIHJlZHVjZWQgVHggaW50ZXJydXB0IGZyZXF1ZW5jeSBmb3IgbG93ZXIgaW50ZXJydXB0IG92ZXJoZWFkCisKKwlMSzEuMy45IChJb24gQmFkdWxlc2N1KQorCS0gYnVnZml4IGZvciBtY2FzdCBmaWx0ZXIKKwktIGVuYWJsZSB0aGUgcmlnaHQga2luZCBvZiBUeCBpbnRlcnJ1cHRzIChUeERNQURvbmUsIG5vdCBUeERvbmUpCisKKwlMSzEuNC4wIChJb24gQmFkdWxlc2N1KQorCS0gTkFQSSBzdXBwb3J0CisKKwlMSzEuNC4xIChJb24gQmFkdWxlc2N1KQorCS0gZmx1c2ggUENJIHBvc3RpbmcgYnVmZmVycyBhZnRlciBkaXNhYmxpbmcgUnggaW50ZXJydXB0cworCS0gcHV0IHRoZSBjaGlwIHRvIGEgRDMgc2x1bWJlciBvbiBkcml2ZXIgdW5sb2FkCisJLSBhZGRlZCBjb25maWcgb3B0aW9uIHRvIGVuYWJsZS9kaXNhYmxlIE5BUEkKKworVE9ETzoJYnVnZml4ZXMgKG5vIGJ1Z3Mga25vd24gYXMgb2YgcmlnaHQgbm93KQorKi8KKworI2RlZmluZSBEUlZfTkFNRQkic3RhcmZpcmUiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjAzK0xLMS40LjEiCisjZGVmaW5lIERSVl9SRUxEQVRFCSJGZWJydWFyeSAxMCwgMjAwMiIKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4JCS8qIFByb2Nlc3NvciB0eXBlIGZvciBjYWNoZSBhbGlnbm1lbnQuICovCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworLyoKKyAqIEFkYXB0ZWMncyBsaWNlbnNlIGZvciB0aGVpciBkcml2ZXJzICh3aGljaCBpcyB3aGVyZSBJIGdvdCB0aGUKKyAqIGZpcm13YXJlIGZpbGVzKSBkb2VzIG5vdCBhbGxvdyBvbmUgdG8gcmVkaXN0cmlidXRlIHRoZW0uIFRodXMsIHdlIGNhbid0CisgKiBpbmNsdWRlIHRoZSBmaXJtd2FyZSB3aXRoIHRoaXMgZHJpdmVyLgorICoKKyAqIEhvd2V2ZXIsIHNob3VsZCBhIGxlZ2FsLXRvLWRpc3RyaWJ1dGUgZmlybXdhcmUgYmVjb21lIGF2YWlsYWJsZSwKKyAqIHRoZSBkcml2ZXIgZGV2ZWxvcGVyIHdvdWxkIG5lZWQgb25seSB0byBvYnRhaW4gdGhlIGZpcm13YXJlIGluIHRoZQorICogZm9ybSBvZiBhIEMgaGVhZGVyIGZpbGUuCisgKiBPbmNlIHRoYXQncyBkb25lLCB0aGUgI3VuZGVmIGJlbG93IG11c3QgYmUgY2hhbmdlZCBpbnRvIGEgI2RlZmluZQorICogZm9yIHRoaXMgZHJpdmVyIHRvIHJlYWxseSB1c2UgdGhlIGZpcm13YXJlLiBOb3RlIHRoYXQgUngvVHgKKyAqIGhhcmR3YXJlIFRDUCBjaGVja3N1bW1pbmcgaXMgbm90IHBvc3NpYmxlIHdpdGhvdXQgdGhlIGZpcm13YXJlLgorICoKKyAqIFdBTlRFRDogbGVnYWwgZmlybXdhcmUgdG8gaW5jbHVkZSB3aXRoIHRoaXMgR1BMJ2QgZHJpdmVyLgorICovCisjdW5kZWYgSEFTX0ZJUk1XQVJFCisvKgorICogVGhlIGN1cnJlbnQgZnJhbWUgcHJvY2Vzc29yIGZpcm13YXJlIGZhaWxzIHRvIGNoZWNrc3VtIGEgZnJhZ21lbnQKKyAqIG9mIGxlbmd0aCAxLiBJZiBhbmQgd2hlbiB0aGlzIGlzIGZpeGVkLCB0aGUgI2RlZmluZSBiZWxvdyBjYW4gYmUgcmVtb3ZlZC4KKyAqLworI2RlZmluZSBIQVNfQlJPS0VOX0ZJUk1XQVJFCisvKgorICogRGVmaW5lIHRoaXMgaWYgdXNpbmcgdGhlIGRyaXZlciB3aXRoIHRoZSB6ZXJvLWNvcHkgcGF0Y2gKKyAqLworI2lmIGRlZmluZWQoSEFTX0ZJUk1XQVJFKSAmJiBkZWZpbmVkKE1BWF9TS0JfRlJBR1MpCisjZGVmaW5lIFpFUk9DT1BZCisjZW5kaWYKKworI2lmZGVmIEhBU19GSVJNV0FSRQorI2luY2x1ZGUgInN0YXJmaXJlX2Zpcm13YXJlLmgiCisjZW5kaWYgLyogSEFTX0ZJUk1XQVJFICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKKyNkZWZpbmUgVkxBTl9TVVBQT1JUCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfQURBUFRFQ19TVEFSRklSRV9OQVBJCisjdW5kZWYgSEFWRV9ORVRERVZfUE9MTAorI2VuZGlmCisKKy8qIFRoZSB1c2VyLWNvbmZpZ3VyYWJsZSB2YWx1ZXMuCisgICBUaGVzZSBtYXkgYmUgbW9kaWZpZWQgd2hlbiBhIGRyaXZlciBtb2R1bGUgaXMgbG9hZGVkLiovCisKKy8qIFVzZWQgZm9yIHR1bmluZyBpbnRlcnJ1cHQgbGF0ZW5jeSB2cy4gb3ZlcmhlYWQuICovCitzdGF0aWMgaW50IGludHJfbGF0ZW5jeTsKK3N0YXRpYyBpbnQgc21hbGxfZnJhbWVzOworCitzdGF0aWMgaW50IGRlYnVnID0gMTsJCQkvKiAxIG5vcm1hbCBtZXNzYWdlcywgMCBxdWlldCAuLiA3IHZlcmJvc2UuICovCitzdGF0aWMgaW50IG1heF9pbnRlcnJ1cHRfd29yayA9IDIwOworc3RhdGljIGludCBtdHU7CisvKiBNYXhpbXVtIG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIGZpbHRlciAodnMuIHJ4LWFsbC1tdWx0aWNhc3QpLgorICAgVGhlIFN0YXJmaXJlIGhhcyBhIDUxMiBlbGVtZW50IGhhc2ggdGFibGUgYmFzZWQgb24gdGhlIEV0aGVybmV0IENSQy4gKi8KK3N0YXRpYyBpbnQgbXVsdGljYXN0X2ZpbHRlcl9saW1pdCA9IDUxMjsKKy8qIFdoZXRoZXIgdG8gZG8gVENQL1VEUCBjaGVja3N1bXMgaW4gaGFyZHdhcmUgKi8KKyNpZmRlZiBIQVNfRklSTVdBUkUKK3N0YXRpYyBpbnQgZW5hYmxlX2h3X2Nrc3VtID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IGVuYWJsZV9od19ja3N1bSA9IDA7CisjZW5kaWYKKworI2RlZmluZSBQS1RfQlVGX1NaCTE1MzYJCS8qIFNpemUgb2YgZWFjaCB0ZW1wb3JhcnkgUnggYnVmZmVyLiovCisvKgorICogU2V0IHRoZSBjb3B5IGJyZWFrcG9pbnQgZm9yIHRoZSBjb3B5LW9ubHktdGlueS1mcmFtZXMgc2NoZW1lLgorICogU2V0dGluZyB0byA+IDE1MTggZWZmZWN0aXZlbHkgZGlzYWJsZXMgdGhpcyBmZWF0dXJlLgorICoKKyAqIE5PVEU6CisgKiBUaGUgaWE2NCBkb2Vzbid0IGFsbG93IGZvciB1bmFsaWduZWQgbG9hZHMgZXZlbiBvZiBpbnRlZ2VycyBiZWluZworICogbWlzYWxpZ25lZCBvbiBhIDIgYnl0ZSBib3VuZGFyeS4gVGh1cyBhbHdheXMgZm9yY2UgY29weWluZyBvZgorICogcGFja2V0cyBhcyB0aGUgc3RhcmZpcmUgZG9lc24ndCBhbGxvdyBmb3IgbWlzYWxpZ25lZCBETUFzIDstKAorICogMjMvMTAvMjAwMCAtIEplcworICoKKyAqIFRoZSBBbHBoYSBhbmQgdGhlIFNwYXJjIGRvbid0IGxpa2UgdW5hbGlnbmVkIGxvYWRzLCBlaXRoZXIuIE9uIFNwYXJjNjQsCisgKiBhdCBsZWFzdCwgaGF2aW5nIHVuYWxpZ25lZCBmcmFtZXMgbGVhZHMgdG8gYSByYXRoZXIgc2VyaW91cyBwZXJmb3JtYW5jZQorICogcGVuYWx0eS4gLUlvbgorICovCisjaWYgZGVmaW5lZChfX2lhNjRfXykgfHwgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19zcGFyY19fKQorc3RhdGljIGludCByeF9jb3B5YnJlYWsgPSBQS1RfQlVGX1NaOworI2Vsc2UKK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrIC8qID0gMCAqLzsKKyNlbmRpZgorCisvKiBQQ0kgRE1BIGJ1cnN0IHNpemUgLS0gb24gc3BhcmM2NCB3ZSB3YW50IHRvIGZvcmNlIGl0IHRvIDY0IGJ5dGVzLCBvbiB0aGUgb3RoZXJzIHRoZSBkZWZhdWx0IG9mIDEyOCBpcyBmaW5lLiAqLworI2lmZGVmIF9fc3BhcmNfXworI2RlZmluZSBETUFfQlVSU1RfU0laRSA2NAorI2Vsc2UKKyNkZWZpbmUgRE1BX0JVUlNUX1NJWkUgMTI4CisjZW5kaWYKKworLyogVXNlZCB0byBwYXNzIHRoZSBtZWRpYSB0eXBlLCBldGMuCisgICBCb3RoICdvcHRpb25zW10nIGFuZCAnZnVsbF9kdXBsZXhbXScgZXhpc3QgZm9yIGRyaXZlciBpbnRlcm9wZXJhYmlsaXR5LgorICAgVGhlIG1lZGlhIHR5cGUgaXMgdXN1YWxseSBwYXNzZWQgaW4gJ29wdGlvbnNbXScuCisgICBUaGVzZSB2YXJpYWJsZXMgYXJlIGRlcHJlY2F0ZWQsIHVzZSBldGh0b29sIGluc3RlYWQuIC1Jb24KKyovCisjZGVmaW5lIE1BWF9VTklUUyA4CQkvKiBNb3JlIGFyZSBzdXBwb3J0ZWQsIGxpbWl0IG9ubHkgb24gb3B0aW9ucyAqLworc3RhdGljIGludCBvcHRpb25zW01BWF9VTklUU10gPSB7MCwgfTsKK3N0YXRpYyBpbnQgZnVsbF9kdXBsZXhbTUFYX1VOSVRTXSA9IHswLCB9OworCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIHNldCBhdCBjb21waWxlIHRpbWUuICovCisKKy8qIFRoZSAibmF0aXZlIiByaW5nIHNpemVzIGFyZSBlaXRoZXIgMjU2IG9yIDIwNDguCisgICBIb3dldmVyIGluIHNvbWUgbW9kZXMgYSBkZXNjcmlwdG9yIG1heSBiZSBtYXJrZWQgdG8gd3JhcCB0aGUgcmluZyBlYXJsaWVyLgorKi8KKyNkZWZpbmUgUlhfUklOR19TSVpFCTI1NgorI2RlZmluZSBUWF9SSU5HX1NJWkUJMzIKKy8qIFRoZSBjb21wbGV0aW9uIHF1ZXVlcyBhcmUgZml4ZWQgYXQgMTAyNCBlbnRyaWVzIGkuZS4gNEsgb3IgOEtCLiAqLworI2RlZmluZSBET05FX1FfU0laRQkxMDI0CisvKiBBbGwgcXVldWVzIG11c3QgYmUgYWxpZ25lZCBvbiBhIDI1Ni1ieXRlIGJvdW5kYXJ5ICovCisjZGVmaW5lIFFVRVVFX0FMSUdOCTI1NgorCisjaWYgUlhfUklOR19TSVpFID4gMjU2CisjZGVmaW5lIFJYX1FfRU5UUklFUyBSeDIwNDhRRW50cmllcworI2Vsc2UKKyNkZWZpbmUgUlhfUV9FTlRSSUVTIFJ4MjU2UUVudHJpZXMKKyNlbmRpZgorCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgdXN1YWxseSBhcmUgbm90IGNoYW5nZWQuICovCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQJKDIgKiBIWikKKworLyoKKyAqIFRoaXMgU1VDS1MuCisgKiBXZSBuZWVkIGEgbXVjaCBiZXR0ZXIgbWV0aG9kIHRvIGRldGVybWluZSBpZiBkbWFfYWRkcl90IGlzIDY0LWJpdC4KKyAqLworI2lmIChkZWZpbmVkKF9faTM4Nl9fKSAmJiBkZWZpbmVkKENPTkZJR19ISUdITUVNKSAmJiAoTElOVVhfVkVSU0lPTl9DT0RFID4gMHgyMDUwMCB8fCBkZWZpbmVkKENPTkZJR19ISUdITUVNNjRHKSkpIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZCAoX19pYTY0X18pIHx8IGRlZmluZWQoX19taXBzNjRfXykgfHwgKGRlZmluZWQoX19taXBzX18pICYmIGRlZmluZWQoQ09ORklHX0hJR0hNRU0pICYmIGRlZmluZWQoQ09ORklHXzY0QklUX1BIWVNfQUREUikpCisvKiA2NC1iaXQgZG1hX2FkZHJfdCAqLworI2RlZmluZSBBRERSXzY0QklUUwkvKiBUaGlzIGNoaXAgdXNlcyA2NCBiaXQgYWRkcmVzc2VzLiAqLworI2RlZmluZSBjcHVfdG9fZG1hKHgpIGNwdV90b19sZTY0KHgpCisjZGVmaW5lIGRtYV90b19jcHUoeCkgbGU2NF90b19jcHUoeCkKKyNkZWZpbmUgUlhfREVTQ19RX0FERFJfU0laRSBSeERlc2NRQWRkcjY0Yml0CisjZGVmaW5lIFRYX0RFU0NfUV9BRERSX1NJWkUgVHhEZXNjUUFkZHI2NGJpdAorI2RlZmluZSBSWF9DT01QTF9RX0FERFJfU0laRSBSeENvbXBsUUFkZHI2NGJpdAorI2RlZmluZSBUWF9DT01QTF9RX0FERFJfU0laRSBUeENvbXBsUUFkZHI2NGJpdAorI2RlZmluZSBSWF9ERVNDX0FERFJfU0laRSBSeERlc2NBZGRyNjRiaXQKKyNlbHNlICAvKiAzMi1iaXQgZG1hX2FkZHJfdCAqLworI2RlZmluZSBjcHVfdG9fZG1hKHgpIGNwdV90b19sZTMyKHgpCisjZGVmaW5lIGRtYV90b19jcHUoeCkgbGUzMl90b19jcHUoeCkKKyNkZWZpbmUgUlhfREVTQ19RX0FERFJfU0laRSBSeERlc2NRQWRkcjMyYml0CisjZGVmaW5lIFRYX0RFU0NfUV9BRERSX1NJWkUgVHhEZXNjUUFkZHIzMmJpdAorI2RlZmluZSBSWF9DT01QTF9RX0FERFJfU0laRSBSeENvbXBsUUFkZHIzMmJpdAorI2RlZmluZSBUWF9DT01QTF9RX0FERFJfU0laRSBUeENvbXBsUUFkZHIzMmJpdAorI2RlZmluZSBSWF9ERVNDX0FERFJfU0laRSBSeERlc2NBZGRyMzJiaXQKKyNlbmRpZgorCisjaWZkZWYgTUFYX1NLQl9GUkFHUworI2RlZmluZSBza2JfZmlyc3RfZnJhZ19sZW4oc2tiKQlza2JfaGVhZGxlbihza2IpCisjZGVmaW5lIHNrYl9udW1fZnJhZ3Moc2tiKSAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDEpCisjZWxzZSAgLyogbm90IE1BWF9TS0JfRlJBR1MgKi8KKyNkZWZpbmUgc2tiX2ZpcnN0X2ZyYWdfbGVuKHNrYikJKHNrYi0+bGVuKQorI2RlZmluZSBza2JfbnVtX2ZyYWdzKHNrYikgMQorI2VuZGlmIC8qIG5vdCBNQVhfU0tCX0ZSQUdTICovCisKKy8qIDIuMi54IGNvbXBhdGliaWxpdHkgY29kZSAqLworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IDB4MjAzMDAKKworI2luY2x1ZGUgInN0YXJmaXJlLWtjb21wMjIuaCIKKworI2Vsc2UgIC8qIExJTlVYX1ZFUlNJT05fQ09ERSA+IDB4MjAzMDAgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorCisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorCisjZGVmaW5lIGluaXRfdHhfdGltZXIoZGV2LCBmdW5jLCB0aW1lb3V0KSBcCisJZGV2LT50eF90aW1lb3V0ID0gZnVuYzsgXAorCWRldi0+d2F0Y2hkb2dfdGltZW8gPSB0aW1lb3V0OworI2RlZmluZSBraWNrX3R4X3RpbWVyKGRldiwgZnVuYywgdGltZW91dCkKKworI2RlZmluZSBuZXRpZl9zdGFydF9pZihkZXYpCisjZGVmaW5lIG5ldGlmX3N0b3BfaWYoZGV2KQorCisjZGVmaW5lIFBDSV9TTE9UX05BTUUocGNpX2RldikJcGNpX25hbWUocGNpX2RldikKKworI2VuZGlmIC8qIExJTlVYX1ZFUlNJT05fQ09ERSA+IDB4MjAzMDAgKi8KKworI2lmZGVmIEhBVkVfTkVUREVWX1BPTEwKKyNkZWZpbmUgaW5pdF9wb2xsKGRldikgXAorCWRldi0+cG9sbCA9ICZuZXRkZXZfcG9sbDsgXAorCWRldi0+d2VpZ2h0ID0gbWF4X2ludGVycnVwdF93b3JrOworI2RlZmluZSBuZXRkZXZfcngoZGV2LCBpb2FkZHIpIFwKK2RvIHsgXAorCXUzMiBpbnRyX2VuYWJsZTsgXAorCWlmIChuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKGRldikpIHsgXAorCQlfX25ldGlmX3J4X3NjaGVkdWxlKGRldik7IFwKKwkJaW50cl9lbmFibGUgPSByZWFkbChpb2FkZHIgKyBJbnRyRW5hYmxlKTsgXAorCQlpbnRyX2VuYWJsZSAmPSB+KEludHJSeERvbmUgfCBJbnRyUnhFbXB0eSk7IFwKKwkJd3JpdGVsKGludHJfZW5hYmxlLCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsgXAorCQlyZWFkbChpb2FkZHIgKyBJbnRyRW5hYmxlKTsgLyogZmx1c2ggUENJIHBvc3RpbmcgYnVmZmVycyAqLyBcCisJfSBlbHNlIHsgXAorCQkvKiBQYXJhbm9pYSBjaGVjayAqLyBcCisJCWludHJfZW5hYmxlID0gcmVhZGwoaW9hZGRyICsgSW50ckVuYWJsZSk7IFwKKwkJaWYgKGludHJfZW5hYmxlICYgKEludHJSeERvbmUgfCBJbnRyUnhFbXB0eSkpIHsgXAorCQkJcHJpbnRrKCIlczogaW50ZXJydXB0IHdoaWxlIGluIHBvbGxpbmcgbW9kZSFcbiIsIGRldi0+bmFtZSk7IFwKKwkJCWludHJfZW5hYmxlICY9IH4oSW50clJ4RG9uZSB8IEludHJSeEVtcHR5KTsgXAorCQkJd3JpdGVsKGludHJfZW5hYmxlLCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsgXAorCQl9IFwKKwl9IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIG5ldGRldl9yZWNlaXZlX3NrYihza2IpIG5ldGlmX3JlY2VpdmVfc2tiKHNrYikKKyNkZWZpbmUgdmxhbl9uZXRkZXZfcmVjZWl2ZV9za2Ioc2tiLCB2bGdycCwgdmxpZCkgdmxhbl9od2FjY2VsX3JlY2VpdmVfc2tiKHNrYiwgdmxncnAsIHZsaWQpCitzdGF0aWMgaW50CW5ldGRldl9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KTsKKyNlbHNlICAvKiBub3QgSEFWRV9ORVRERVZfUE9MTCAqLworI2RlZmluZSBpbml0X3BvbGwoZGV2KQorI2RlZmluZSBuZXRkZXZfcmVjZWl2ZV9za2Ioc2tiKSBuZXRpZl9yeChza2IpCisjZGVmaW5lIHZsYW5fbmV0ZGV2X3JlY2VpdmVfc2tiKHNrYiwgdmxncnAsIHZsaWQpIHZsYW5faHdhY2NlbF9yeChza2IsIHZsZ3JwLCB2bGlkKQorI2RlZmluZSBuZXRkZXZfcngoZGV2LCBpb2FkZHIpIFwKK2RvIHsgXAorCWludCBxdW90YSA9IG5wLT5kaXJ0eV9yeCArIFJYX1JJTkdfU0laRSAtIG5wLT5jdXJfcng7IFwKKwlfX25ldGRldl9yeChkZXYsICZxdW90YSk7XAorfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBub3QgSEFWRV9ORVRERVZfUE9MTCAqLworLyogZW5kIG9mIGNvbXBhdGliaWxpdHkgY29kZSAqLworCisKKy8qIFRoZXNlIGlkZW50aWZ5IHRoZSBkcml2ZXIgYmFzZSB2ZXJzaW9uIGFuZCBtYXkgbm90IGJlIHJlbW92ZWQuICovCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CitLRVJOX0lORk8gInN0YXJmaXJlLmM6djEuMDMgNy8yNi8yMDAwICBXcml0dGVuIGJ5IERvbmFsZCBCZWNrZXIgPGJlY2tlckBzY3lsZC5jb20+XG4iCitLRVJOX0lORk8gIiAodW5vZmZpY2lhbCAyLjIvMi40IGtlcm5lbCBwb3J0LCB2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIiwgIiBEUlZfUkVMREFURSAiKVxuIjsKKworTU9EVUxFX0FVVEhPUigiRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQWRhcHRlYyBTdGFyZmlyZSBFdGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShtdHUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocnhfY29weWJyZWFrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGludHJfbGF0ZW5jeSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShzbWFsbF9mcmFtZXMsIGludCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkob3B0aW9ucywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShmdWxsX2R1cGxleCwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbShlbmFibGVfaHdfY2tzdW0sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9pbnRlcnJ1cHRfd29yaywgIk1heGltdW0gZXZlbnRzIGhhbmRsZWQgcGVyIGludGVycnVwdCIpOworTU9EVUxFX1BBUk1fREVTQyhtdHUsICJNVFUgKGFsbCBib2FyZHMpIik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgKDAtNikiKTsKK01PRFVMRV9QQVJNX0RFU0MocnhfY29weWJyZWFrLCAiQ29weSBicmVha3BvaW50IGZvciBjb3B5LW9ubHktdGlueS1mcmFtZXMiKTsKK01PRFVMRV9QQVJNX0RFU0MoaW50cl9sYXRlbmN5LCAiTWF4aW11bSBpbnRlcnJ1cHQgbGF0ZW5jeSwgaW4gbWljcm9zZWNvbmRzIik7CitNT0RVTEVfUEFSTV9ERVNDKHNtYWxsX2ZyYW1lcywgIk1heGltdW0gc2l6ZSBvZiByZWNlaXZlIGZyYW1lcyB0aGF0IGJ5cGFzcyBpbnRlcnJ1cHQgbGF0ZW5jeSAoMCw2NCwxMjgsMjU2LDUxMikiKTsKK01PRFVMRV9QQVJNX0RFU0Mob3B0aW9ucywgIkRlcHJlY2F0ZWQ6IEJpdHMgMC0zOiBtZWRpYSB0eXBlLCBiaXQgMTc6IGZ1bGwgZHVwbGV4Iik7CitNT0RVTEVfUEFSTV9ERVNDKGZ1bGxfZHVwbGV4LCAiRGVwcmVjYXRlZDogRm9yY2VkIGZ1bGwtZHVwbGV4IHNldHRpbmcgKDAvMSkiKTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX2h3X2Nrc3VtLCAiRW5hYmxlL2Rpc2FibGUgaGFyZHdhcmUgY2tzdW0gc3VwcG9ydCAoMC8xKSIpOworCisvKgorCQkJCVRoZW9yeSBvZiBPcGVyYXRpb24KKworSS4gQm9hcmQgQ29tcGF0aWJpbGl0eQorCitUaGlzIGRyaXZlciBpcyBmb3IgdGhlIEFkYXB0ZWMgNjkxNSAiU3RhcmZpcmUiIDY0IGJpdCBQQ0kgRXRoZXJuZXQgYWRhcHRlci4KKworSUkuIEJvYXJkLXNwZWNpZmljIHNldHRpbmdzCisKK0lJSS4gRHJpdmVyIG9wZXJhdGlvbgorCitJSUlhLiBSaW5nIGJ1ZmZlcnMKKworVGhlIFN0YXJmaXJlIGhhcmR3YXJlIHVzZXMgbXVsdGlwbGUgZml4ZWQtc2l6ZSBkZXNjcmlwdG9yIHF1ZXVlcy9yaW5ncy4gIFRoZQorcmluZyBzaXplcyBhcmUgc2V0IGZpeGVkIGJ5IHRoZSBoYXJkd2FyZSwgYnV0IG1heSBvcHRpb25hbGx5IGJlIHdyYXBwZWQKK2VhcmxpZXIgYnkgdGhlIEVORCBiaXQgaW4gdGhlIGRlc2NyaXB0b3IuCitUaGlzIGRyaXZlciB1c2VzIHRoYXQgaGFyZHdhcmUgcXVldWUgc2l6ZSBmb3IgdGhlIFJ4IHJpbmcsIHdoZXJlIGEgbGFyZ2UKK251bWJlciBvZiBlbnRyaWVzIGhhcyBubyBpbGwgZWZmZWN0IGJleW9uZCBpbmNyZWFzZXMgdGhlIHBvdGVudGlhbCBiYWNrbG9nLgorVGhlIFR4IHJpbmcgaXMgd3JhcHBlZCB3aXRoIHRoZSBFTkQgYml0LCBzaW5jZSBhIGxhcmdlIGhhcmR3YXJlIFR4IHF1ZXVlCitkaXNhYmxlcyB0aGUgcXVldWUgbGF5ZXIgcHJpb3JpdHkgb3JkZXJpbmcgYW5kIHdlIGhhdmUgbm8gbWVjaGFuaXNtIHRvCit1dGlsaXplIHRoZSBoYXJkd2FyZSB0d28tbGV2ZWwgcHJpb3JpdHkgcXVldWUuICBXaGVuIG1vZGlmeWluZyB0aGUKK1JYL1RYX1JJTkdfU0laRSBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHBhZ2Ugc2l6ZXMgYW5kIHRoZSByaW5nLWVtcHR5IHdhcm5pbmcKK2xldmVscy4KKworSUlJYi9jLiBUcmFuc21pdC9SZWNlaXZlIFN0cnVjdHVyZQorCitTZWUgdGhlIEFkYXB0ZWMgbWFudWFsIGZvciB0aGUgbWFueSBwb3NzaWJsZSBzdHJ1Y3R1cmVzLCBhbmQgb3B0aW9ucyBmb3IKK2VhY2ggc3RydWN0dXJlLiAgVGhlcmUgYXJlIGZhciB0b28gbWFueSB0byBkb2N1bWVudCBhbGwgb2YgdGhlbSBoZXJlLgorCitGb3IgdHJhbnNtaXQgdGhpcyBkcml2ZXIgdXNlcyB0eXBlIDAvMSB0cmFuc21pdCBkZXNjcmlwdG9ycyAoZGVwZW5kaW5nCitvbiB0aGUgMzIvNjQgYml0bmVzcyBvZiB0aGUgYXJjaGl0ZWN0dXJlKSwgYW5kIHJlbGllcyBvbiBhdXRvbWF0aWMKK21pbmltdW0tbGVuZ3RoIHBhZGRpbmcuICBJdCBkb2VzIG5vdCB1c2UgdGhlIGNvbXBsZXRpb24gcXVldWUKK2NvbnN1bWVyIGluZGV4LCBidXQgaW5zdGVhZCBjaGVja3MgZm9yIG5vbi16ZXJvIHN0YXR1cyBlbnRyaWVzLgorCitGb3IgcmVjZWl2ZSB0aGlzIGRyaXZlciB1c2VzIHR5cGUgMC8xLzIvMyByZWNlaXZlIGRlc2NyaXB0b3JzLiAgVGhlIGRyaXZlcgorYWxsb2NhdGVzIGZ1bGwgZnJhbWUgc2l6ZSBza2J1ZmZzIGZvciB0aGUgUnggcmluZyBidWZmZXJzLCBzbyBhbGwgZnJhbWVzCitzaG91bGQgZml0IGluIGEgc2luZ2xlIGRlc2NyaXB0b3IuICBUaGUgZHJpdmVyIGRvZXMgbm90IHVzZSB0aGUgY29tcGxldGlvbgorcXVldWUgY29uc3VtZXIgaW5kZXgsIGJ1dCBpbnN0ZWFkIGNoZWNrcyBmb3Igbm9uLXplcm8gc3RhdHVzIGVudHJpZXMuCisKK1doZW4gYW4gaW5jb21pbmcgZnJhbWUgaXMgbGVzcyB0aGFuIFJYX0NPUFlCUkVBSyBieXRlcyBsb25nLCBhIGZyZXNoIHNrYnVmZgoraXMgYWxsb2NhdGVkIGFuZCB0aGUgZnJhbWUgaXMgY29waWVkIHRvIHRoZSBuZXcgc2tidWZmLiAgV2hlbiB0aGUgaW5jb21pbmcKK2ZyYW1lIGlzIGxhcmdlciwgdGhlIHNrYnVmZiBpcyBwYXNzZWQgZGlyZWN0bHkgdXAgdGhlIHByb3RvY29sIHN0YWNrLgorQnVmZmVycyBjb25zdW1lZCB0aGlzIHdheSBhcmUgcmVwbGFjZWQgYnkgbmV3bHkgYWxsb2NhdGVkIHNrYnVmZnMgaW4gYSBsYXRlcgorcGhhc2Ugb2YgcmVjZWl2ZS4KKworQSBub3RhYmxlIGFzcGVjdCBvZiBvcGVyYXRpb24gaXMgdGhhdCB1bmFsaWduZWQgYnVmZmVycyBhcmUgbm90IHBlcm1pdHRlZCBieQordGhlIFN0YXJmaXJlIGhhcmR3YXJlLiAgVGh1cyB0aGUgSVAgaGVhZGVyIGF0IG9mZnNldCAxNCBpbiBhbiBldGhlcm5ldCBmcmFtZQoraXNuJ3QgbG9uZ3dvcmQgYWxpZ25lZCwgd2hpY2ggbWF5IGNhdXNlIHByb2JsZW1zIG9uIHNvbWUgbWFjaGluZQorZS5nLiBBbHBoYXMgYW5kIElBNjQuIEZvciB0aGVzZSBhcmNoaXRlY3R1cmVzLCB0aGUgZHJpdmVyIGlzIGZvcmNlZCB0byBjb3B5Cit0aGUgZnJhbWUgaW50byBhIG5ldyBza2J1ZmYgdW5jb25kaXRpb25hbGx5LiBDb3BpZWQgZnJhbWVzIGFyZSBwdXQgaW50byB0aGUKK3NrYnVmZiBhdCBhbiBvZmZzZXQgb2YgIisyIiwgdGh1cyAxNi1ieXRlIGFsaWduaW5nIHRoZSBJUCBoZWFkZXIuCisKK0lJSWQuIFN5bmNocm9uaXphdGlvbgorCitUaGUgZHJpdmVyIHJ1bnMgYXMgdHdvIGluZGVwZW5kZW50LCBzaW5nbGUtdGhyZWFkZWQgZmxvd3Mgb2YgY29udHJvbC4gIE9uZQoraXMgdGhlIHNlbmQtcGFja2V0IHJvdXRpbmUsIHdoaWNoIGVuZm9yY2VzIHNpbmdsZS10aHJlYWRlZCB1c2UgYnkgdGhlCitkZXYtPnRidXN5IGZsYWcuICBUaGUgb3RoZXIgdGhyZWFkIGlzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgd2hpY2ggaXMgc2luZ2xlCit0aHJlYWRlZCBieSB0aGUgaGFyZHdhcmUgYW5kIGludGVycnVwdCBoYW5kbGluZyBzb2Z0d2FyZS4KKworVGhlIHNlbmQgcGFja2V0IHRocmVhZCBoYXMgcGFydGlhbCBjb250cm9sIG92ZXIgdGhlIFR4IHJpbmcgYW5kIHRoZSBuZXRpZl9xdWV1ZQorc3RhdHVzLiBJZiB0aGUgbnVtYmVyIG9mIGZyZWUgVHggc2xvdHMgaW4gdGhlIHJpbmcgZmFsbHMgYmVsb3cgYSBjZXJ0YWluIG51bWJlcgorKGN1cnJlbnRseSBoYXJkY29kZWQgdG8gNCksIGl0IHNpZ25hbHMgdGhlIHVwcGVyIGxheWVyIHRvIHN0b3AgdGhlIHF1ZXVlLgorCitUaGUgaW50ZXJydXB0IGhhbmRsZXIgaGFzIGV4Y2x1c2l2ZSBjb250cm9sIG92ZXIgdGhlIFJ4IHJpbmcgYW5kIHJlY29yZHMgc3RhdHMKK2Zyb20gdGhlIFR4IHJpbmcuICBBZnRlciByZWFwaW5nIHRoZSBzdGF0cywgaXQgbWFya3MgdGhlIFR4IHF1ZXVlIGVudHJ5IGFzCitlbXB0eSBieSBpbmNyZW1lbnRpbmcgdGhlIGRpcnR5X3R4IG1hcmsuIElmZiB0aGUgbmV0aWZfcXVldWUgaXMgc3RvcHBlZCBhbmQgdGhlCitudW1iZXIgb2YgZnJlZSBUeCBzbG93IGlzIGFib3ZlIHRoZSB0aHJlc2hvbGQsIGl0IHNpZ25hbHMgdGhlIHVwcGVyIGxheWVyIHRvCityZXN0YXJ0IHRoZSBxdWV1ZS4KKworSVYuIE5vdGVzCisKK0lWYi4gUmVmZXJlbmNlcworCitUaGUgQWRhcHRlYyBTdGFyZmlyZSBtYW51YWxzLCBhdmFpbGFibGUgb25seSBmcm9tIEFkYXB0ZWMuCitodHRwOi8vd3d3LnNjeWxkLmNvbS9leHBlcnQvMTAwbWJwcy5odG1sCitodHRwOi8vd3d3LnNjeWxkLmNvbS9leHBlcnQvTldheS5odG1sCisKK0lWYy4gRXJyYXRhCisKKy0gU3RvcE9uUGVyciBpcyBicm9rZW4sIGRvbid0IGVuYWJsZQorLSBIYXJkd2FyZSBldGhlcm5ldCBwYWRkaW5nIGV4cG9zZXMgcmFuZG9tIGRhdGEsIHBlcmZvcm0gc29mdHdhcmUgcGFkZGluZworICBpbnN0ZWFkICh1bnZlcmlmaWVkIC0tIHdvcmtzIGNvcnJlY3RseSBmb3IgYWxsIHRoZSBoYXJkd2FyZSBJIGhhdmUpCisKKyovCisKKwwKKworZW51bSBjaGlwX2NhcGFiaWxpdHlfZmxhZ3Mge0NhbkhhdmVNSUk9MSwgfTsKKworZW51bSBjaGlwc2V0IHsKKwlDSF82OTE1ID0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzdGFyZmlyZV9wY2lfdGJsW10gPSB7CisJeyAweDkwMDQsIDB4NjkxNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hfNjkxNSB9LAorCXsgMCwgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzdGFyZmlyZV9wY2lfdGJsKTsKKworLyogQSBjaGlwIGNhcGFiaWxpdGllcyB0YWJsZSwgbWF0Y2hpbmcgdGhlIENIX3h4eCBlbnRyaWVzIGluIHh4eF9wY2lfdGJsW10gYWJvdmUuICovCitzdGF0aWMgc3RydWN0IGNoaXBfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgZHJ2X2ZsYWdzOworfSBuZXRkcnZfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7ICJBZGFwdGVjIFN0YXJmaXJlIDY5MTUiLCBDYW5IYXZlTUlJIH0sCit9OworCisKKy8qIE9mZnNldHMgdG8gdGhlIGRldmljZSByZWdpc3RlcnMuCisgICBVbmxpa2Ugc29mdHdhcmUtb25seSBzeXN0ZW1zLCBkZXZpY2UgZHJpdmVycyBpbnRlcmFjdCB3aXRoIGNvbXBsZXggaGFyZHdhcmUuCisgICBJdCdzIG5vdCB1c2VmdWwgdG8gZGVmaW5lIHN5bWJvbGljIG5hbWVzIGZvciBldmVyeSByZWdpc3RlciBiaXQgaW4gdGhlCisgICBkZXZpY2UuICBUaGUgbmFtZSBjYW4gb25seSBwYXJ0aWFsbHkgZG9jdW1lbnQgdGhlIHNlbWFudGljcyBhbmQgbWFrZQorICAgdGhlIGRyaXZlciBsb25nZXIgYW5kIG1vcmUgZGlmZmljdWx0IHRvIHJlYWQuCisgICBJbiBnZW5lcmFsLCBvbmx5IHRoZSBpbXBvcnRhbnQgY29uZmlndXJhdGlvbiB2YWx1ZXMgb3IgYml0cyBjaGFuZ2VkCisgICBtdWx0aXBsZSB0aW1lcyBzaG91bGQgYmUgZGVmaW5lZCBzeW1ib2xpY2FsbHkuCisqLworZW51bSByZWdpc3Rlcl9vZmZzZXRzIHsKKwlQQ0lEZXZpY2VDb25maWc9MHg1MDA0MCwgR2VuQ3RybD0weDUwMDcwLCBJbnRyVGltZXJDdHJsPTB4NTAwNzQsCisJSW50ckNsZWFyPTB4NTAwODAsIEludHJTdGF0dXM9MHg1MDA4NCwgSW50ckVuYWJsZT0weDUwMDg4LAorCU1JSUN0cmw9MHg1MjAwMCwgVHhTdGF0aW9uQWRkcj0weDUwMTIwLCBFRVBST01DdHJsPTB4NTEwMDAsCisJR1BJT0N0cmw9MHg1MDA4QywgVHhEZXNjQ3RybD0weDUwMDkwLAorCVR4UmluZ1B0cj0weDUwMDk4LCBIaVByaVR4UmluZ1B0cj0weDUwMDk0LCAvKiBMb3cgYW5kIEhpZ2ggcHJpb3JpdHkuICovCisJVHhSaW5nSGlBZGRyPTB4NTAwOUMsCQkvKiA2NCBiaXQgYWRkcmVzcyBleHRlbnNpb24uICovCisJVHhQcm9kdWNlcklkeD0weDUwMEEwLCBUeENvbnN1bWVySWR4PTB4NTAwQTQsCisJVHhUaHJlc2hvbGQ9MHg1MDBCMCwKKwlDb21wbGV0aW9uSGlBZGRyPTB4NTAwQjQsIFR4Q29tcGxldGlvbkFkZHI9MHg1MDBCOCwKKwlSeENvbXBsZXRpb25BZGRyPTB4NTAwQkMsIFJ4Q29tcGxldGlvblEyQWRkcj0weDUwMEMwLAorCUNvbXBsZXRpb25RQ29uc3VtZXJJZHg9MHg1MDBDNCwgUnhETUFDdHJsPTB4NTAwRDAsCisJUnhEZXNjUUN0cmw9MHg1MDBENCwgUnhEZXNjUUhpQWRkcj0weDUwMERDLCBSeERlc2NRQWRkcj0weDUwMEUwLAorCVJ4RGVzY1FJZHg9MHg1MDBFOCwgUnhETUFTdGF0dXM9MHg1MDBGMCwgUnhGaWx0ZXJNb2RlPTB4NTAwRjQsCisJVHhNb2RlPTB4NTUwMDAsIFZsYW5UeXBlPTB4NTUwNjQsCisJUGVyZkZpbHRlclRhYmxlPTB4NTYwMDAsIEhhc2hUYWJsZT0weDU2MTAwLAorCVR4R2ZwTWVtPTB4NTgwMDAsIFJ4R2ZwTWVtPTB4NWEwMDAsCit9OworCisvKgorICogQml0cyBpbiB0aGUgaW50ZXJydXB0IHN0YXR1cy9tYXNrIHJlZ2lzdGVycy4KKyAqIFdhcm5pbmc6IHNldHRpbmcgSW50cltBYl1Ob3JtYWxTdW1tYXJ5IGluIHRoZSBJbnRyRW5hYmxlIHJlZ2lzdGVyCisgKiBlbmFibGVzIGFsbCB0aGUgaW50ZXJydXB0IHNvdXJjZXMgdGhhdCBhcmUgb3InZWQgaW50byB0aG9zZSBzdGF0dXMgYml0cy4KKyAqLworZW51bSBpbnRyX3N0YXR1c19iaXRzIHsKKwlJbnRyTGlua0NoYW5nZT0weGYwMDAwMDAwLCBJbnRyU3RhdHNNYXg9MHgwODAwMDAwMCwKKwlJbnRyQWJub3JtYWxTdW1tYXJ5PTB4MDIwMDAwMDAsIEludHJHZW5lcmFsVGltZXI9MHgwMTAwMDAwMCwKKwlJbnRyU29mdHdhcmU9MHg4MDAwMDAsIEludHJSeENvbXBsUTFMb3c9MHg0MDAwMDAsCisJSW50clR4Q29tcGxRTG93PTB4MjAwMDAwLCBJbnRyUENJPTB4MTAwMDAwLAorCUludHJETUFFcnI9MHgwODAwMDAsIEludHJUeERhdGFMb3c9MHgwNDAwMDAsCisJSW50clJ4Q29tcGxRMkxvdz0weDAyMDAwMCwgSW50clJ4RGVzY1ExTG93PTB4MDEwMDAwLAorCUludHJOb3JtYWxTdW1tYXJ5PTB4ODAwMCwgSW50clR4RG9uZT0weDQwMDAsCisJSW50clR4RE1BRG9uZT0weDIwMDAsIEludHJUeEVtcHR5PTB4MTAwMCwKKwlJbnRyRWFybHlSeFEyPTB4MDgwMCwgSW50ckVhcmx5UnhRMT0weDA0MDAsCisJSW50clJ4UTJEb25lPTB4MDIwMCwgSW50clJ4UTFEb25lPTB4MDEwMCwKKwlJbnRyUnhHRlBEZWFkPTB4ODAsIEludHJSeERlc2NRMkxvdz0weDQwLAorCUludHJOb1R4Q3N1bT0weDIwLCBJbnRyVHhCYWRJRD0weDEwLAorCUludHJIaVByaVR4QmFkSUQ9MHgwOCwgSW50clJ4R2ZwPTB4MDQsCisJSW50clR4R2ZwPTB4MDIsIEludHJQQ0lQYWQ9MHgwMSwKKwkvKiBub3QgcXVpdGUgYml0cyAqLworCUludHJSeERvbmU9SW50clJ4UTJEb25lIHwgSW50clJ4UTFEb25lLAorCUludHJSeEVtcHR5PUludHJSeERlc2NRMUxvdyB8IEludHJSeERlc2NRMkxvdywKKwlJbnRyTm9ybWFsTWFzaz0weGZmMDAsIEludHJBYm5vcm1hbE1hc2s9MHgzZmYwMGZlLAorfTsKKworLyogQml0cyBpbiB0aGUgUnhGaWx0ZXJNb2RlIHJlZ2lzdGVyLiAqLworZW51bSByeF9tb2RlX2JpdHMgeworCUFjY2VwdEJyb2FkY2FzdD0weDA0LCBBY2NlcHRBbGxNdWx0aWNhc3Q9MHgwMiwgQWNjZXB0QWxsPTB4MDEsCisJQWNjZXB0TXVsdGljYXN0PTB4MTAsIFBlcmZlY3RGaWx0ZXI9MHg0MCwgSGFzaEZpbHRlcj0weDMwLAorCVBlcmZlY3RGaWx0ZXJWbGFuPTB4ODAsIE1pblZMQU5QcmlvPTB4RTAwMCwgVmxhbk1vZGU9MHgwMjAwLAorCVdha2V1cE9uR0ZQPTB4MDgwMCwKK307CisKKy8qIEJpdHMgaW4gdGhlIFR4TW9kZSByZWdpc3RlciAqLworZW51bSB0eF9tb2RlX2JpdHMgeworCU1paVNvZnRSZXNldD0weDgwMDAsIE1JSUxvb3BiYWNrPTB4NDAwMCwKKwlUeEZsb3dFbmFibGU9MHgwODAwLCBSeEZsb3dFbmFibGU9MHgwNDAwLAorCVBhZEVuYWJsZT0weDA0LCBGdWxsRHVwbGV4PTB4MDIsIEh1Z2VGcmFtZT0weDAxLAorfTsKKworLyogQml0cyBpbiB0aGUgVHhEZXNjQ3RybCByZWdpc3Rlci4gKi8KK2VudW0gdHhfY3RybF9iaXRzIHsKKwlUeERlc2NTcGFjZVVubGltPTB4MDAsIFR4RGVzY1NwYWNlMzI9MHgxMCwgVHhEZXNjU3BhY2U2ND0weDIwLAorCVR4RGVzY1NwYWNlMTI4PTB4MzAsIFR4RGVzY1NwYWNlMjU2PTB4NDAsCisJVHhEZXNjVHlwZTA9MHgwMCwgVHhEZXNjVHlwZTE9MHgwMSwgVHhEZXNjVHlwZTI9MHgwMiwKKwlUeERlc2NUeXBlMz0weDAzLCBUeERlc2NUeXBlND0weDA0LAorCVR4Tm9ETUFDb21wbGV0aW9uPTB4MDgsCisJVHhEZXNjUUFkZHI2NGJpdD0weDgwLCBUeERlc2NRQWRkcjMyYml0PTAsCisJVHhIaVByaUZJRk9UaHJlc2hTaGlmdD0yNCwgVHhQYWRMZW5TaGlmdD0xNiwKKwlUeERNQUJ1cnN0U2l6ZVNoaWZ0PTgsCit9OworCisvKiBCaXRzIGluIHRoZSBSeERlc2NRQ3RybCByZWdpc3Rlci4gKi8KK2VudW0gcnhfY3RybF9iaXRzIHsKKwlSeEJ1ZmZlckxlblNoaWZ0PTE2LCBSeE1pbkRlc2NyVGhyZXNoU2hpZnQ9MCwKKwlSeFByZWZldGNoTW9kZT0weDgwMDAsIFJ4VmFyaWFibGVRPTB4MjAwMCwKKwlSeDIwNDhRRW50cmllcz0weDQwMDAsIFJ4MjU2UUVudHJpZXM9MCwKKwlSeERlc2NBZGRyNjRiaXQ9MHgxMDAwLCBSeERlc2NBZGRyMzJiaXQ9MCwKKwlSeERlc2NRQWRkcjY0Yml0PTB4MDEwMCwgUnhEZXNjUUFkZHIzMmJpdD0wLAorCVJ4RGVzY1NwYWNlND0weDAwMCwgUnhEZXNjU3BhY2U4PTB4MTAwLAorCVJ4RGVzY1NwYWNlMTY9MHgyMDAsIFJ4RGVzY1NwYWNlMzI9MHgzMDAsCisJUnhEZXNjU3BhY2U2ND0weDQwMCwgUnhEZXNjU3BhY2UxMjg9MHg1MDAsCisJUnhDb25zdW1lcldyRW49MHg4MCwKK307CisKKy8qIEJpdHMgaW4gdGhlIFJ4RE1BQ3RybCByZWdpc3Rlci4gKi8KK2VudW0gcnhfZG1hY3RybF9iaXRzIHsKKwlSeFJlcG9ydEJhZEZyYW1lcz0weDgwMDAwMDAwLCBSeERNQVNob3J0RnJhbWVzPTB4NDAwMDAwMDAsCisJUnhETUFCYWRGcmFtZXM9MHgyMDAwMDAwMCwgUnhETUFDcmNFcnJvckZyYW1lcz0weDEwMDAwMDAwLAorCVJ4RE1BQ29udHJvbEZyYW1lPTB4MDgwMDAwMDAsIFJ4RE1BUGF1c2VGcmFtZT0weDA0MDAwMDAwLAorCVJ4Q2hlY2tzdW1JZ25vcmU9MCwgUnhDaGVja3N1bVJlamVjdFRDUFVEUD0weDAyMDAwMDAwLAorCVJ4Q2hlY2tzdW1SZWplY3RUQ1BPbmx5PTB4MDEwMDAwMDAsCisJUnhDb21wbGV0aW9uUTJFbmFibGU9MHg4MDAwMDAsCisJUnhETUFRMkRpc2FibGU9MCwgUnhETUFRMkZQT25seT0weDEwMDAwMCwKKwlSeERNQVEyU21hbGxQa3Q9MHgyMDAwMDAsIFJ4RE1BUTJIaWdoUHJpbz0weDMwMDAwMCwKKwlSeERNQVEyTm9uSVA9MHg0MDAwMDAsCisJUnhVc2VCYWNrdXBRdWV1ZT0weDA4MDAwMCwgUnhETUFDUkM9MHgwNDAwMDAsCisJUnhFYXJseUludFRocmVzaFNoaWZ0PTEyLCBSeEhpZ2hQcmlvVGhyZXNoU2hpZnQ9OCwKKwlSeEJ1cnN0U2l6ZVNoaWZ0PTAsCit9OworCisvKiBCaXRzIGluIHRoZSBSeENvbXBsZXRpb25BZGRyIHJlZ2lzdGVyICovCitlbnVtIHJ4X2NvbXBsX2JpdHMgeworCVJ4Q29tcGxRQWRkcjY0Yml0PTB4ODAsIFJ4Q29tcGxRQWRkcjMyYml0PTAsCisJUnhDb21wbFByb2R1Y2VyV3JFbj0weDQwLAorCVJ4Q29tcGxUeXBlMD0weDAwLCBSeENvbXBsVHlwZTE9MHgxMCwKKwlSeENvbXBsVHlwZTI9MHgyMCwgUnhDb21wbFR5cGUzPTB4MzAsCisJUnhDb21wbFRocmVzaFNoaWZ0PTAsCit9OworCisvKiBCaXRzIGluIHRoZSBUeENvbXBsZXRpb25BZGRyIHJlZ2lzdGVyICovCitlbnVtIHR4X2NvbXBsX2JpdHMgeworCVR4Q29tcGxRQWRkcjY0Yml0PTB4ODAsIFR4Q29tcGxRQWRkcjMyYml0PTAsCisJVHhDb21wbFByb2R1Y2VyV3JFbj0weDQwLAorCVR4Q29tcGxJbnRyU3RhdHVzPTB4MjAsCisJQ29tbW9uUXVldWVNb2RlPTB4MTAsCisJVHhDb21wbFRocmVzaFNoaWZ0PTAsCit9OworCisvKiBCaXRzIGluIHRoZSBHZW5DdHJsIHJlZ2lzdGVyICovCitlbnVtIGdlbl9jdHJsX2JpdHMgeworCVJ4RW5hYmxlPTB4MDUsIFR4RW5hYmxlPTB4MGEsCisJUnhHRlBFbmFibGU9MHgxMCwgVHhHRlBFbmFibGU9MHgyMCwKK307CisKKy8qIEJpdHMgaW4gdGhlIEludHJUaW1lckN0cmwgcmVnaXN0ZXIgKi8KK2VudW0gaW50cl9jdHJsX2JpdHMgeworCVRpbWVyMTBYPTB4ODAwLCBFbmFibGVJbnRyTWFza2luZz0weDYwLCBTbWFsbEZyYW1lQnlwYXNzPTB4MTAwLAorCVNtYWxsRnJhbWU2ND0wLCBTbWFsbEZyYW1lMTI4PTB4MjAwLCBTbWFsbEZyYW1lMjU2PTB4NDAwLCBTbWFsbEZyYW1lNTEyPTB4NjAwLAorCUludHJMYXRlbmN5TWFzaz0weDFmLAorfTsKKworLyogVGhlIFJ4IGFuZCBUeCBidWZmZXIgZGVzY3JpcHRvcnMuICovCitzdHJ1Y3Qgc3RhcmZpcmVfcnhfZGVzYyB7CisJZG1hX2FkZHJfdCByeGFkZHI7Cit9OworZW51bSByeF9kZXNjX2JpdHMgeworCVJ4RGVzY1ZhbGlkPTEsIFJ4RGVzY0VuZFJpbmc9MiwKK307CisKKy8qIENvbXBsZXRpb24gcXVldWUgZW50cnkuICovCitzdHJ1Y3Qgc2hvcnRfcnhfZG9uZV9kZXNjIHsKKwl1MzIgc3RhdHVzOwkJCS8qIExvdyAxNiBiaXRzIGlzIGxlbmd0aC4gKi8KK307CitzdHJ1Y3QgYmFzaWNfcnhfZG9uZV9kZXNjIHsKKwl1MzIgc3RhdHVzOwkJCS8qIExvdyAxNiBiaXRzIGlzIGxlbmd0aC4gKi8KKwl1MTYgdmxhbmlkOworCXUxNiBzdGF0dXMyOworfTsKK3N0cnVjdCBjc3VtX3J4X2RvbmVfZGVzYyB7CisJdTMyIHN0YXR1czsJCQkvKiBMb3cgMTYgYml0cyBpcyBsZW5ndGguICovCisJdTE2IGNzdW07CQkJLyogUGFydGlhbCBjaGVja3N1bSAqLworCXUxNiBzdGF0dXMyOworfTsKK3N0cnVjdCBmdWxsX3J4X2RvbmVfZGVzYyB7CisJdTMyIHN0YXR1czsJCQkvKiBMb3cgMTYgYml0cyBpcyBsZW5ndGguICovCisJdTE2IHN0YXR1czM7CisJdTE2IHN0YXR1czI7CisJdTE2IHZsYW5pZDsKKwl1MTYgY3N1bTsJCQkvKiBwYXJ0aWFsIGNoZWNrc3VtICovCisJdTMyIHRpbWVzdGFtcDsKK307CisvKiBYWFg6IHRoaXMgaXMgdWdseSBhbmQgSSdtIG5vdCBzdXJlIGl0J3Mgd29ydGggdGhlIHRyb3VibGUgLUlvbiAqLworI2lmZGVmIEhBU19GSVJNV0FSRQorI2lmZGVmIFZMQU5fU1VQUE9SVAordHlwZWRlZiBzdHJ1Y3QgZnVsbF9yeF9kb25lX2Rlc2MgcnhfZG9uZV9kZXNjOworI2RlZmluZSBSeENvbXBsVHlwZSBSeENvbXBsVHlwZTMKKyNlbHNlICAvKiBub3QgVkxBTl9TVVBQT1JUICovCit0eXBlZGVmIHN0cnVjdCBjc3VtX3J4X2RvbmVfZGVzYyByeF9kb25lX2Rlc2M7CisjZGVmaW5lIFJ4Q29tcGxUeXBlIFJ4Q29tcGxUeXBlMgorI2VuZGlmIC8qIG5vdCBWTEFOX1NVUFBPUlQgKi8KKyNlbHNlICAvKiBub3QgSEFTX0ZJUk1XQVJFICovCisjaWZkZWYgVkxBTl9TVVBQT1JUCit0eXBlZGVmIHN0cnVjdCBiYXNpY19yeF9kb25lX2Rlc2MgcnhfZG9uZV9kZXNjOworI2RlZmluZSBSeENvbXBsVHlwZSBSeENvbXBsVHlwZTEKKyNlbHNlICAvKiBub3QgVkxBTl9TVVBQT1JUICovCit0eXBlZGVmIHN0cnVjdCBzaG9ydF9yeF9kb25lX2Rlc2MgcnhfZG9uZV9kZXNjOworI2RlZmluZSBSeENvbXBsVHlwZSBSeENvbXBsVHlwZTAKKyNlbmRpZiAvKiBub3QgVkxBTl9TVVBQT1JUICovCisjZW5kaWYgLyogbm90IEhBU19GSVJNV0FSRSAqLworCitlbnVtIHJ4X2RvbmVfYml0cyB7CisJUnhPSz0weDIwMDAwMDAwLCBSeEZJRk9FcnI9MHgxMDAwMDAwMCwgUnhCdWZRMj0weDA4MDAwMDAwLAorfTsKKworLyogVHlwZSAxIFR4IGRlc2NyaXB0b3IuICovCitzdHJ1Y3Qgc3RhcmZpcmVfdHhfZGVzY18xIHsKKwl1MzIgc3RhdHVzOwkJCS8qIFVwcGVyIGJpdHMgYXJlIHN0YXR1cywgbG93ZXIgMTYgbGVuZ3RoLiAqLworCXUzMiBhZGRyOworfTsKKworLyogVHlwZSAyIFR4IGRlc2NyaXB0b3IuICovCitzdHJ1Y3Qgc3RhcmZpcmVfdHhfZGVzY18yIHsKKwl1MzIgc3RhdHVzOwkJCS8qIFVwcGVyIGJpdHMgYXJlIHN0YXR1cywgbG93ZXIgMTYgbGVuZ3RoLiAqLworCXUzMiByZXNlcnZlZDsKKwl1NjQgYWRkcjsKK307CisKKyNpZmRlZiBBRERSXzY0QklUUwordHlwZWRlZiBzdHJ1Y3Qgc3RhcmZpcmVfdHhfZGVzY18yIHN0YXJmaXJlX3R4X2Rlc2M7CisjZGVmaW5lIFRYX0RFU0NfVFlQRSBUeERlc2NUeXBlMgorI2Vsc2UgIC8qIG5vdCBBRERSXzY0QklUUyAqLwordHlwZWRlZiBzdHJ1Y3Qgc3RhcmZpcmVfdHhfZGVzY18xIHN0YXJmaXJlX3R4X2Rlc2M7CisjZGVmaW5lIFRYX0RFU0NfVFlQRSBUeERlc2NUeXBlMQorI2VuZGlmIC8qIG5vdCBBRERSXzY0QklUUyAqLworI2RlZmluZSBUWF9ERVNDX1NQQUNJTkcgVHhEZXNjU3BhY2VVbmxpbQorCitlbnVtIHR4X2Rlc2NfYml0cyB7CisJVHhEZXNjSUQ9MHhCMDAwMDAwMCwKKwlUeENSQ0VuPTB4MDEwMDAwMDAsIFR4RGVzY0ludHI9MHgwODAwMDAwMCwKKwlUeFJpbmdXcmFwPTB4MDQwMDAwMDAsIFR4Q2FsVENQPTB4MDIwMDAwMDAsCit9Oworc3RydWN0IHR4X2RvbmVfZGVzYyB7CisJdTMyIHN0YXR1czsJCQkvKiB0aW1lc3RhbXAsIGluZGV4LiAqLworI2lmIDAKKwl1MzIgaW50cnN0YXR1czsJCQkvKiBpbnRlcnJ1cHQgc3RhdHVzICovCisjZW5kaWYKK307CisKK3N0cnVjdCByeF9yaW5nX2luZm8geworCXN0cnVjdCBza19idWZmICpza2I7CisJZG1hX2FkZHJfdCBtYXBwaW5nOworfTsKK3N0cnVjdCB0eF9yaW5nX2luZm8geworCXN0cnVjdCBza19idWZmICpza2I7CisJZG1hX2FkZHJfdCBtYXBwaW5nOworCXVuc2lnbmVkIGludCB1c2VkX3Nsb3RzOworfTsKKworI2RlZmluZSBQSFlfQ05UCQkyCitzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgeworCS8qIERlc2NyaXB0b3IgcmluZ3MgZmlyc3QgZm9yIGFsaWdubWVudC4gKi8KKwlzdHJ1Y3Qgc3RhcmZpcmVfcnhfZGVzYyAqcnhfcmluZzsKKwlzdGFyZmlyZV90eF9kZXNjICp0eF9yaW5nOworCWRtYV9hZGRyX3QgcnhfcmluZ19kbWE7CisJZG1hX2FkZHJfdCB0eF9yaW5nX2RtYTsKKwkvKiBUaGUgYWRkcmVzc2VzIG9mIHJ4L3R4LWluLXBsYWNlIHNrYnVmZnMuICovCisJc3RydWN0IHJ4X3JpbmdfaW5mbyByeF9pbmZvW1JYX1JJTkdfU0laRV07CisJc3RydWN0IHR4X3JpbmdfaW5mbyB0eF9pbmZvW1RYX1JJTkdfU0laRV07CisJLyogUG9pbnRlcnMgdG8gY29tcGxldGlvbiBxdWV1ZXMgKGZ1bGwgcGFnZXMpLiAqLworCXJ4X2RvbmVfZGVzYyAqcnhfZG9uZV9xOworCWRtYV9hZGRyX3QgcnhfZG9uZV9xX2RtYTsKKwl1bnNpZ25lZCBpbnQgcnhfZG9uZTsKKwlzdHJ1Y3QgdHhfZG9uZV9kZXNjICp0eF9kb25lX3E7CisJZG1hX2FkZHJfdCB0eF9kb25lX3FfZG1hOworCXVuc2lnbmVkIGludCB0eF9kb25lOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworI2lmZGVmIFZMQU5fU1VQUE9SVAorCXN0cnVjdCB2bGFuX2dyb3VwICp2bGdycDsKKyNlbmRpZgorCXZvaWQgKnF1ZXVlX21lbTsKKwlkbWFfYWRkcl90IHF1ZXVlX21lbV9kbWE7CisJc2l6ZV90IHF1ZXVlX21lbV9zaXplOworCisJLyogRnJlcXVlbnRseSB1c2VkIHZhbHVlczoga2VlcCBzb21lIGFkamFjZW50IGZvciBjYWNoZSBlZmZlY3QuICovCisJc3BpbmxvY2tfdCBsb2NrOworCXVuc2lnbmVkIGludCBjdXJfcngsIGRpcnR5X3J4OwkvKiBQcm9kdWNlci9jb25zdW1lciByaW5nIGluZGljZXMgKi8KKwl1bnNpZ25lZCBpbnQgY3VyX3R4LCBkaXJ0eV90eCwgcmVhcF90eDsKKwl1bnNpZ25lZCBpbnQgcnhfYnVmX3N6OwkJLyogQmFzZWQgb24gTVRVK3NsYWNrLiAqLworCS8qIFRoZXNlIHZhbHVlcyBrZWVwIHRyYWNrIG9mIHRoZSB0cmFuc2NlaXZlci9tZWRpYSBpbiB1c2UuICovCisJaW50IHNwZWVkMTAwOwkJCS8qIFNldCBpZiBzcGVlZCA9PSAxMDBNQml0LiAqLworCXUzMiB0eF9tb2RlOworCXUzMiBpbnRyX3RpbWVyX2N0cmw7CisJdTggdHhfdGhyZXNob2xkOworCS8qIE1JSSB0cmFuc2NlaXZlciBzZWN0aW9uLiAqLworCXN0cnVjdCBtaWlfaWZfaW5mbyBtaWlfaWY7CQkvKiBNSUkgbGliIGhvb2tzL2luZm8gKi8KKwlpbnQgcGh5X2NudDsJCQkvKiBNSUkgZGV2aWNlIGFkZHJlc3Nlcy4gKi8KKwl1bnNpZ25lZCBjaGFyIHBoeXNbUEhZX0NOVF07CS8qIE1JSSBkZXZpY2UgYWRkcmVzc2VzLiAqLworCXZvaWQgX19pb21lbSAqYmFzZTsKK307CisKKworc3RhdGljIGludAltZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkCW1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpOworc3RhdGljIGludAluZXRkZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkCWNoZWNrX2R1cGxleChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkCXR4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAlpbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CXN0YXJ0X3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGludHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkCW5ldGRldl9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW50cl9zdGF0dXMpOworc3RhdGljIGludAlfX25ldGRldl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKnF1b3RhKTsKK3N0YXRpYyB2b2lkCXJlZmlsbF9yeF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQJbmV0ZGV2X2Vycm9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbnRyX3N0YXR1cyk7CitzdGF0aWMgdm9pZAlzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludAluZXRkZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgaW50CW5ldGRldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkCW5ldGRldl9tZWRpYV9jaGFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzOworCisKKyNpZmRlZiBWTEFOX1NVUFBPUlQKK3N0YXRpYyB2b2lkIG5ldGRldl92bGFuX3J4X3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB2bGFuX2dyb3VwICpncnApCit7CisgICAgICAgIHN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIHNwaW5fbG9jaygmbnAtPmxvY2spOworCWlmIChkZWJ1ZyA+IDIpCisJCXByaW50aygiJXM6IFNldHRpbmcgdmxncnAgdG8gJXBcbiIsIGRldi0+bmFtZSwgZ3JwKTsKKyAgICAgICAgbnAtPnZsZ3JwID0gZ3JwOworCXNldF9yeF9tb2RlKGRldik7CisgICAgICAgIHNwaW5fdW5sb2NrKCZucC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrKCZucC0+bG9jayk7CisJaWYgKGRlYnVnID4gMSkKKwkJcHJpbnRrKCIlczogQWRkaW5nIHZsYW5pZCAlZCB0byB2bGFuIGZpbHRlclxuIiwgZGV2LT5uYW1lLCB2aWQpOworCXNldF9yeF9tb2RlKGRldik7CisJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrKCZucC0+bG9jayk7CisJaWYgKGRlYnVnID4gMSkKKwkJcHJpbnRrKCIlczogcmVtb3ZpbmcgdmxhbmlkICVkIGZyb20gdmxhbiBmaWx0ZXJcbiIsIGRldi0+bmFtZSwgdmlkKTsKKwlpZiAobnAtPnZsZ3JwKQorCQlucC0+dmxncnAtPnZsYW5fZGV2aWNlc1t2aWRdID0gTlVMTDsKKwlzZXRfcnhfbW9kZShkZXYpOworCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7Cit9CisjZW5kaWYgLyogVkxBTl9TVVBQT1JUICovCisKKworc3RhdGljIGludCBfX2RldmluaXQgc3RhcmZpcmVfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucDsKKwlpbnQgaSwgaXJxLCBvcHRpb24sIGNoaXBfaWR4ID0gZW50LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0YXRpYyBpbnQgY2FyZF9pZHggPSAtMTsKKwlsb25nIGlvYWRkcjsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJaW50IGRydl9mbGFncywgaW9fc2l6ZTsKKwlpbnQgYm9ndXNjbnQ7CisKKy8qIHdoZW4gYnVpbHQgaW50byB0aGUga2VybmVsLCB3ZSBvbmx5IHByaW50IHZlcnNpb24gaWYgZGV2aWNlIGlzIGZvdW5kICovCisjaWZuZGVmIE1PRFVMRQorCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorCisJY2FyZF9pZHgrKzsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZSAocGRldikpCisJCXJldHVybiAtRUlPOworCisJaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWlvX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOworCWlmICghaW9hZGRyIHx8ICgocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApICYgSU9SRVNPVVJDRV9NRU0pID09IDApKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiICVkOiBubyBQQ0kgTUVNIHJlc291cmNlcywgYWJvcnRpbmdcbiIsIGNhcmRfaWR4KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKCpucCkpOworCWlmICghZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiICVkOiBjYW5ub3QgYWxsb2MgZXRoZXJkZXYsIGFib3J0aW5nXG4iLCBjYXJkX2lkeCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWlycSA9IHBkZXYtPmlycTsKKworCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zIChwZGV2LCBEUlZfTkFNRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICIgJWQ6IGNhbm5vdCByZXNlcnZlIFBDSSByZXNvdXJjZXMsIGFib3J0aW5nXG4iLCBjYXJkX2lkeCk7CisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKwl9CisKKwkvKiBpb3JlbWFwIGlzIGJvcmtlbiBpbiBMaW51eC0yLjIueC9zcGFyYzY0ICovCisJYmFzZSA9IGlvcmVtYXAoaW9hZGRyLCBpb19zaXplKTsKKwlpZiAoIWJhc2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICIgJWQ6IGNhbm5vdCByZW1hcCAlI3ggQCAlI2x4LCBhYm9ydGluZ1xuIiwKKwkJCWNhcmRfaWR4LCBpb19zaXplLCBpb2FkZHIpOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwkvKiBlbmFibGUgTVdJIC0tIGl0IHZhc3RseSBpbXByb3ZlcyBSeCBwZXJmb3JtYW5jZSBvbiBzcGFyYzY0ICovCisJcGNpX3NldF9td2kocGRldik7CisKKyNpZmRlZiBNQVhfU0tCX0ZSQUdTCisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHOworI2VuZGlmIC8qIE1BWF9TS0JfRlJBR1MgKi8KKyNpZmRlZiBaRVJPQ09QWQorCS8qIFN0YXJmaXJlIGNhbiBkbyBUQ1AvVURQIGNoZWNrc3VtbWluZyAqLworCWlmIChlbmFibGVfaHdfY2tzdW0pCisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNOworI2VuZGlmIC8qIFpFUk9DT1BZICovCisjaWZkZWYgVkxBTl9TVVBQT1JUCisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fUlggfCBORVRJRl9GX0hXX1ZMQU5fRklMVEVSOworCWRldi0+dmxhbl9yeF9yZWdpc3RlciA9IG5ldGRldl92bGFuX3J4X3JlZ2lzdGVyOworCWRldi0+dmxhbl9yeF9hZGRfdmlkID0gbmV0ZGV2X3ZsYW5fcnhfYWRkX3ZpZDsKKwlkZXYtPnZsYW5fcnhfa2lsbF92aWQgPSBuZXRkZXZfdmxhbl9yeF9raWxsX3ZpZDsKKyNlbmRpZiAvKiBWTEFOX1JYX0tJTExfVklEICovCisjaWZkZWYgQUREUl82NEJJVFMKKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKKyNlbmRpZiAvKiBBRERSXzY0QklUUyAqLworCisJLyogU2VyaWFsIEVFUFJPTSByZWFkcyBhcmUgaGlkZGVuIGJ5IHRoZSBoYXJkd2FyZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gcmVhZGIoYmFzZSArIEVFUFJPTUN0cmwgKyAyMCAtIGkpOworCisjaWYgISBkZWZpbmVkKGZpbmFsX3ZlcnNpb24pIC8qIER1bXAgdGhlIEVFUFJPTSBjb250ZW50cyBkdXJpbmcgZGV2ZWxvcG1lbnQuICovCisJaWYgKGRlYnVnID4gNCkKKwkJZm9yIChpID0gMDsgaSA8IDB4MjA7IGkrKykKKwkJCXByaW50aygiJTIuMnglcyIsCisJCQkgICAgICAgKHVuc2lnbmVkIGludClyZWFkYihiYXNlICsgRUVQUk9NQ3RybCArIGkpLAorCQkJICAgICAgIGkgJSAxNiAhPSAxNSA/ICIgIiA6ICJcbiIpOworI2VuZGlmCisKKwkvKiBJc3N1ZSBzb2Z0IHJlc2V0ICovCisJd3JpdGVsKE1paVNvZnRSZXNldCwgYmFzZSArIFR4TW9kZSk7CisJdWRlbGF5KDEwMDApOworCXdyaXRlbCgwLCBiYXNlICsgVHhNb2RlKTsKKworCS8qIFJlc2V0IHRoZSBjaGlwIHRvIGVyYXNlIHByZXZpb3VzIG1pc2NvbmZpZ3VyYXRpb24uICovCisJd3JpdGVsKDEsIGJhc2UgKyBQQ0lEZXZpY2VDb25maWcpOworCWJvZ3VzY250ID0gMTAwMDsKKwl3aGlsZSAoLS1ib2d1c2NudCA+IDApIHsKKwkJdWRlbGF5KDEwKTsKKwkJaWYgKChyZWFkbChiYXNlICsgUENJRGV2aWNlQ29uZmlnKSAmIDEpID09IDApCisJCQlicmVhazsKKwl9CisJaWYgKGJvZ3VzY250ID09IDApCisJCXByaW50aygiJXM6IGNoaXBzZXQgcmVzZXQgbmV2ZXIgY29tcGxldGVkIVxuIiwgZGV2LT5uYW1lKTsKKwkvKiB3YWl0IGEgbGl0dGxlIGxvbmdlciAqLworCXVkZWxheSgxMDAwKTsKKworCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpYmFzZTsKKwlkZXYtPmlycSA9IGlycTsKKworCW5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlucC0+YmFzZSA9IGJhc2U7CisJc3Bpbl9sb2NrX2luaXQoJm5wLT5sb2NrKTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCW5wLT5wY2lfZGV2ID0gcGRldjsKKworCW5wLT5taWlfaWYuZGV2ID0gZGV2OworCW5wLT5taWlfaWYubWRpb19yZWFkID0gbWRpb19yZWFkOworCW5wLT5taWlfaWYubWRpb193cml0ZSA9IG1kaW9fd3JpdGU7CisJbnAtPm1paV9pZi5waHlfaWRfbWFzayA9IDB4MWY7CisJbnAtPm1paV9pZi5yZWdfbnVtX21hc2sgPSAweDFmOworCisJZHJ2X2ZsYWdzID0gbmV0ZHJ2X3RibFtjaGlwX2lkeF0uZHJ2X2ZsYWdzOworCisJb3B0aW9uID0gY2FyZF9pZHggPCBNQVhfVU5JVFMgPyBvcHRpb25zW2NhcmRfaWR4XSA6IDA7CisJaWYgKGRldi0+bWVtX3N0YXJ0KQorCQlvcHRpb24gPSBkZXYtPm1lbV9zdGFydDsKKworCS8qIFRoZSBsb3dlciBmb3VyIGJpdHMgYXJlIHRoZSBtZWRpYSB0eXBlLiAqLworCWlmIChvcHRpb24gJiAweDIwMCkKKwkJbnAtPm1paV9pZi5mdWxsX2R1cGxleCA9IDE7CisKKwlpZiAoY2FyZF9pZHggPCBNQVhfVU5JVFMgJiYgZnVsbF9kdXBsZXhbY2FyZF9pZHhdID4gMCkKKwkJbnAtPm1paV9pZi5mdWxsX2R1cGxleCA9IDE7CisKKwlpZiAobnAtPm1paV9pZi5mdWxsX2R1cGxleCkKKwkJbnAtPm1paV9pZi5mb3JjZV9tZWRpYSA9IDE7CisJZWxzZQorCQlucC0+bWlpX2lmLmZvcmNlX21lZGlhID0gMDsKKwlucC0+c3BlZWQxMDAgPSAxOworCisJLyogdGltZXIgcmVzb2x1dGlvbiBpcyAxMjggKiAwLjh1cyAqLworCW5wLT5pbnRyX3RpbWVyX2N0cmwgPSAoKChpbnRyX2xhdGVuY3kgKiAxMCkgLyAxMDI0KSAmIEludHJMYXRlbmN5TWFzaykgfAorCQlUaW1lcjEwWCB8IEVuYWJsZUludHJNYXNraW5nOworCisJaWYgKHNtYWxsX2ZyYW1lcyA+IDApIHsKKwkJbnAtPmludHJfdGltZXJfY3RybCB8PSBTbWFsbEZyYW1lQnlwYXNzOworCQlzd2l0Y2ggKHNtYWxsX2ZyYW1lcykgeworCQljYXNlIDEgLi4uIDY0OgorCQkJbnAtPmludHJfdGltZXJfY3RybCB8PSBTbWFsbEZyYW1lNjQ7CisJCQlicmVhazsKKwkJY2FzZSA2NSAuLi4gMTI4OgorCQkJbnAtPmludHJfdGltZXJfY3RybCB8PSBTbWFsbEZyYW1lMTI4OworCQkJYnJlYWs7CisJCWNhc2UgMTI5IC4uLiAyNTY6CisJCQlucC0+aW50cl90aW1lcl9jdHJsIHw9IFNtYWxsRnJhbWUyNTY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW5wLT5pbnRyX3RpbWVyX2N0cmwgfD0gU21hbGxGcmFtZTUxMjsKKwkJCWlmIChzbWFsbF9mcmFtZXMgPiA1MTIpCisJCQkJcHJpbnRrKCJBZGp1c3Rpbmcgc21hbGxfZnJhbWVzIGRvd24gdG8gNTEyXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogVGhlIGNoaXAtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSAmbmV0ZGV2X29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmc3RhcnRfdHg7CisJaW5pdF90eF90aW1lcihkZXYsIHR4X3RpbWVvdXQsIFRYX1RJTUVPVVQpOworCWluaXRfcG9sbChkZXYpOworCWRldi0+c3RvcCA9ICZuZXRkZXZfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSAmZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOworCWRldi0+ZG9faW9jdGwgPSAmbmV0ZGV2X2lvY3RsOworCVNFVF9FVEhUT09MX09QUyhkZXYsICZldGh0b29sX29wcyk7CisKKwlpZiAobXR1KQorCQlkZXYtPm10dSA9IG10dTsKKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkKKwkJZ290byBlcnJfb3V0X2NsZWFyZGV2OworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGF0ICVwLCAiLAorCQkgICBkZXYtPm5hbWUsIG5ldGRydl90YmxbY2hpcF9pZHhdLm5hbWUsIGJhc2UpOworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCXByaW50aygiJTIuMng6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCIlMi4yeCwgSVJRICVkLlxuIiwgZGV2LT5kZXZfYWRkcltpXSwgaXJxKTsKKworCWlmIChkcnZfZmxhZ3MgJiBDYW5IYXZlTUlJKSB7CisJCWludCBwaHksIHBoeV9pZHggPSAwOworCQlpbnQgbWlpX3N0YXR1czsKKwkJZm9yIChwaHkgPSAwOyBwaHkgPCAzMiAmJiBwaHlfaWR4IDwgUEhZX0NOVDsgcGh5KyspIHsKKwkJCW1kaW9fd3JpdGUoZGV2LCBwaHksIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKKwkJCW1kZWxheSgxMDApOworCQkJYm9ndXNjbnQgPSAxMDAwOworCQkJd2hpbGUgKC0tYm9ndXNjbnQgPiAwKQorCQkJCWlmICgobWRpb19yZWFkKGRldiwgcGh5LCBNSUlfQk1DUikgJiBCTUNSX1JFU0VUKSA9PSAwKQorCQkJCQlicmVhazsKKwkJCWlmIChib2d1c2NudCA9PSAwKSB7CisJCQkJcHJpbnRrKCIlczogUEhZIHJlc2V0IG5ldmVyIGNvbXBsZXRlZCFcbiIsIGRldi0+bmFtZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQltaWlfc3RhdHVzID0gbWRpb19yZWFkKGRldiwgcGh5LCBNSUlfQk1TUik7CisJCQlpZiAobWlpX3N0YXR1cyAhPSAwKSB7CisJCQkJbnAtPnBoeXNbcGh5X2lkeCsrXSA9IHBoeTsKKwkJCQlucC0+bWlpX2lmLmFkdmVydGlzaW5nID0gbWRpb19yZWFkKGRldiwgcGh5LCBNSUlfQURWRVJUSVNFKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTUlJIFBIWSBmb3VuZCBhdCBhZGRyZXNzICVkLCBzdGF0dXMgIgorCQkJCQkgICAiJSM0LjR4IGFkdmVydGlzaW5nICUjNC40eC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgcGh5LCBtaWlfc3RhdHVzLCBucC0+bWlpX2lmLmFkdmVydGlzaW5nKTsKKwkJCQkvKiB0aGVyZSBjYW4gYmUgb25seSBvbmUgUEhZIG9uLWJvYXJkICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJbnAtPnBoeV9jbnQgPSBwaHlfaWR4OworCQlpZiAobnAtPnBoeV9jbnQgPiAwKQorCQkJbnAtPm1paV9pZi5waHlfaWQgPSBucC0+cGh5c1swXTsKKwkJZWxzZQorCQkJbWVtc2V0KCZucC0+bWlpX2lmLCAwLCBzaXplb2YobnAtPm1paV9pZikpOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBzY2F0dGVyLWdhdGhlciBhbmQgaGFyZHdhcmUgVENQIGNrc3VtbWluZyAlcy5cbiIsCisJICAgICAgIGRldi0+bmFtZSwgZW5hYmxlX2h3X2Nrc3VtID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfY2xlYXJkZXY6CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWlvdW5tYXAoYmFzZSk7CitlcnJfb3V0X2ZyZWVfcmVzOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMgKHBkZXYpOworZXJyX291dF9mcmVlX25ldGRldjoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiAtRU5PREVWOworfQorCisKKy8qIFJlYWQgdGhlIE1JSSBNYW5hZ2VtZW50IERhdGEgSS9PIChNRElPKSBpbnRlcmZhY2VzLiAqLworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqbWRpb19hZGRyID0gbnAtPmJhc2UgKyBNSUlDdHJsICsgKHBoeV9pZDw8NykgKyAobG9jYXRpb248PDIpOworCWludCByZXN1bHQsIGJvZ3VzY250PTEwMDA7CisJLyogPz8/IFNob3VsZCB3ZSBhZGQgYSBidXN5LXdhaXQgaGVyZT8gKi8KKwlkbworCQlyZXN1bHQgPSByZWFkbChtZGlvX2FkZHIpOworCXdoaWxlICgocmVzdWx0ICYgMHhDMDAwMDAwMCkgIT0gMHg4MDAwMDAwMCAmJiAtLWJvZ3VzY250ID4gMCk7CisJaWYgKGJvZ3VzY250ID09IDApCisJCXJldHVybiAwOworCWlmICgocmVzdWx0ICYgMHhmZmZmKSA9PSAweGZmZmYpCisJCXJldHVybiAwOworCXJldHVybiByZXN1bHQgJiAweGZmZmY7Cit9CisKKworc3RhdGljIHZvaWQgbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKm1kaW9fYWRkciA9IG5wLT5iYXNlICsgTUlJQ3RybCArIChwaHlfaWQ8PDcpICsgKGxvY2F0aW9uPDwyKTsKKwl3cml0ZWwodmFsdWUsIG1kaW9fYWRkcik7CisJLyogVGhlIGJ1c3ktd2FpdCB3aWxsIG9jY3VyIGJlZm9yZSBhIHJlYWQuICovCit9CisKKworc3RhdGljIGludCBuZXRkZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2U7CisJaW50IGksIHJldHZhbDsKKwlzaXplX3QgdHhfZG9uZV9xX3NpemUsIHJ4X2RvbmVfcV9zaXplLCB0eF9yaW5nX3NpemUsIHJ4X3Jpbmdfc2l6ZTsKKworCS8qIERvIHdlIGV2ZXIgbmVlZCB0byByZXNldCB0aGUgY2hpcD8/PyAqLworCXJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmaW50cl9oYW5kbGVyLCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwkvKiBEaXNhYmxlIHRoZSBSeCBhbmQgVHgsIGFuZCByZXNldCB0aGUgY2hpcC4gKi8KKwl3cml0ZWwoMCwgaW9hZGRyICsgR2VuQ3RybCk7CisJd3JpdGVsKDEsIGlvYWRkciArIFBDSURldmljZUNvbmZpZyk7CisJaWYgKGRlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBuZXRkZXZfb3BlbigpIGlycSAlZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKworCS8qIEFsbG9jYXRlIHRoZSB2YXJpb3VzIHF1ZXVlcy4gKi8KKwlpZiAobnAtPnF1ZXVlX21lbSA9PSAwKSB7CisJCXR4X2RvbmVfcV9zaXplID0gKChzaXplb2Yoc3RydWN0IHR4X2RvbmVfZGVzYykgKiBET05FX1FfU0laRSArIFFVRVVFX0FMSUdOIC0gMSkgLyBRVUVVRV9BTElHTikgKiBRVUVVRV9BTElHTjsKKwkJcnhfZG9uZV9xX3NpemUgPSAoKHNpemVvZihyeF9kb25lX2Rlc2MpICogRE9ORV9RX1NJWkUgKyBRVUVVRV9BTElHTiAtIDEpIC8gUVVFVUVfQUxJR04pICogUVVFVUVfQUxJR047CisJCXR4X3Jpbmdfc2l6ZSA9ICgoc2l6ZW9mKHN0YXJmaXJlX3R4X2Rlc2MpICogVFhfUklOR19TSVpFICsgUVVFVUVfQUxJR04gLSAxKSAvIFFVRVVFX0FMSUdOKSAqIFFVRVVFX0FMSUdOOworCQlyeF9yaW5nX3NpemUgPSBzaXplb2Yoc3RydWN0IHN0YXJmaXJlX3J4X2Rlc2MpICogUlhfUklOR19TSVpFOworCQlucC0+cXVldWVfbWVtX3NpemUgPSB0eF9kb25lX3Ffc2l6ZSArIHJ4X2RvbmVfcV9zaXplICsgdHhfcmluZ19zaXplICsgcnhfcmluZ19zaXplOworCQlucC0+cXVldWVfbWVtID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQobnAtPnBjaV9kZXYsIG5wLT5xdWV1ZV9tZW1fc2l6ZSwgJm5wLT5xdWV1ZV9tZW1fZG1hKTsKKwkJaWYgKG5wLT5xdWV1ZV9tZW0gPT0gMCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCW5wLT50eF9kb25lX3EgICAgID0gbnAtPnF1ZXVlX21lbTsKKwkJbnAtPnR4X2RvbmVfcV9kbWEgPSBucC0+cXVldWVfbWVtX2RtYTsKKwkJbnAtPnJ4X2RvbmVfcSAgICAgPSAodm9pZCAqKSBucC0+dHhfZG9uZV9xICsgdHhfZG9uZV9xX3NpemU7CisJCW5wLT5yeF9kb25lX3FfZG1hID0gbnAtPnR4X2RvbmVfcV9kbWEgKyB0eF9kb25lX3Ffc2l6ZTsKKwkJbnAtPnR4X3JpbmcgICAgICAgPSAodm9pZCAqKSBucC0+cnhfZG9uZV9xICsgcnhfZG9uZV9xX3NpemU7CisJCW5wLT50eF9yaW5nX2RtYSAgID0gbnAtPnJ4X2RvbmVfcV9kbWEgKyByeF9kb25lX3Ffc2l6ZTsKKwkJbnAtPnJ4X3JpbmcgICAgICAgPSAodm9pZCAqKSBucC0+dHhfcmluZyArIHR4X3Jpbmdfc2l6ZTsKKwkJbnAtPnJ4X3JpbmdfZG1hICAgPSBucC0+dHhfcmluZ19kbWEgKyB0eF9yaW5nX3NpemU7CisJfQorCisJLyogU3RhcnQgd2l0aCBubyBjYXJyaWVyLCBpdCBnZXRzIGFkanVzdGVkIGxhdGVyICovCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwlpbml0X3JpbmcoZGV2KTsKKwkvKiBTZXQgdGhlIHNpemUgb2YgdGhlIFJ4IGJ1ZmZlcnMuICovCisJd3JpdGVsKChucC0+cnhfYnVmX3N6IDw8IFJ4QnVmZmVyTGVuU2hpZnQpIHwKKwkgICAgICAgKDAgPDwgUnhNaW5EZXNjclRocmVzaFNoaWZ0KSB8CisJICAgICAgIFJ4UHJlZmV0Y2hNb2RlIHwgUnhWYXJpYWJsZVEgfAorCSAgICAgICBSWF9RX0VOVFJJRVMgfAorCSAgICAgICBSWF9ERVNDX1FfQUREUl9TSVpFIHwgUlhfREVTQ19BRERSX1NJWkUgfAorCSAgICAgICBSeERlc2NTcGFjZTQsCisJICAgICAgIGlvYWRkciArIFJ4RGVzY1FDdHJsKTsKKworCS8qIFNldCB1cCB0aGUgUnggRE1BIGNvbnRyb2xsZXIuICovCisJd3JpdGVsKFJ4Q2hlY2tzdW1JZ25vcmUgfAorCSAgICAgICAoMCA8PCBSeEVhcmx5SW50VGhyZXNoU2hpZnQpIHwKKwkgICAgICAgKDYgPDwgUnhIaWdoUHJpb1RocmVzaFNoaWZ0KSB8CisJICAgICAgICgoRE1BX0JVUlNUX1NJWkUgLyAzMikgPDwgUnhCdXJzdFNpemVTaGlmdCksCisJICAgICAgIGlvYWRkciArIFJ4RE1BQ3RybCk7CisKKwkvKiBTZXQgVHggZGVzY3JpcHRvciAqLworCXdyaXRlbCgoMiA8PCBUeEhpUHJpRklGT1RocmVzaFNoaWZ0KSB8CisJICAgICAgICgwIDw8IFR4UGFkTGVuU2hpZnQpIHwKKwkgICAgICAgKChETUFfQlVSU1RfU0laRSAvIDMyKSA8PCBUeERNQUJ1cnN0U2l6ZVNoaWZ0KSB8CisJICAgICAgIFRYX0RFU0NfUV9BRERSX1NJWkUgfAorCSAgICAgICBUWF9ERVNDX1NQQUNJTkcgfCBUWF9ERVNDX1RZUEUsCisJICAgICAgIGlvYWRkciArIFR4RGVzY0N0cmwpOworCisJd3JpdGVsKCAobnAtPnF1ZXVlX21lbV9kbWEgPj4gMTYpID4+IDE2LCBpb2FkZHIgKyBSeERlc2NRSGlBZGRyKTsKKwl3cml0ZWwoIChucC0+cXVldWVfbWVtX2RtYSA+PiAxNikgPj4gMTYsIGlvYWRkciArIFR4UmluZ0hpQWRkcik7CisJd3JpdGVsKCAobnAtPnF1ZXVlX21lbV9kbWEgPj4gMTYpID4+IDE2LCBpb2FkZHIgKyBDb21wbGV0aW9uSGlBZGRyKTsKKwl3cml0ZWwobnAtPnJ4X3JpbmdfZG1hLCBpb2FkZHIgKyBSeERlc2NRQWRkcik7CisJd3JpdGVsKG5wLT50eF9yaW5nX2RtYSwgaW9hZGRyICsgVHhSaW5nUHRyKTsKKworCXdyaXRlbChucC0+dHhfZG9uZV9xX2RtYSwgaW9hZGRyICsgVHhDb21wbGV0aW9uQWRkcik7CisJd3JpdGVsKG5wLT5yeF9kb25lX3FfZG1hIHwKKwkgICAgICAgUnhDb21wbFR5cGUgfAorCSAgICAgICAoMCA8PCBSeENvbXBsVGhyZXNoU2hpZnQpLAorCSAgICAgICBpb2FkZHIgKyBSeENvbXBsZXRpb25BZGRyKTsKKworCWlmIChkZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRmlsbGluZyBpbiB0aGUgc3RhdGlvbiBhZGRyZXNzLlxuIiwgZGV2LT5uYW1lKTsKKworCS8qIEZpbGwgYm90aCB0aGUgVHggU0EgcmVnaXN0ZXIgYW5kIHRoZSBSeCBwZXJmZWN0IGZpbHRlci4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQl3cml0ZWIoZGV2LT5kZXZfYWRkcltpXSwgaW9hZGRyICsgVHhTdGF0aW9uQWRkciArIDUgLSBpKTsKKwkvKiBUaGUgZmlyc3QgZW50cnkgaXMgc3BlY2lhbCBiZWNhdXNlIGl0IGJ5cGFzc2VzIHRoZSBWTEFOIGZpbHRlci4KKwkgICBEb24ndCB1c2UgaXQuICovCisJd3JpdGV3KDAsIGlvYWRkciArIFBlcmZGaWx0ZXJUYWJsZSk7CisJd3JpdGV3KDAsIGlvYWRkciArIFBlcmZGaWx0ZXJUYWJsZSArIDQpOworCXdyaXRldygwLCBpb2FkZHIgKyBQZXJmRmlsdGVyVGFibGUgKyA4KTsKKwlmb3IgKGkgPSAxOyBpIDwgMTY7IGkrKykgeworCQl1MTYgKmVhZGRycyA9ICh1MTYgKilkZXYtPmRldl9hZGRyOworCQl2b2lkIF9faW9tZW0gKnNldHVwX2ZybSA9IGlvYWRkciArIFBlcmZGaWx0ZXJUYWJsZSArIGkgKiAxNjsKKwkJd3JpdGV3KGNwdV90b19iZTE2KGVhZGRyc1syXSksIHNldHVwX2ZybSk7IHNldHVwX2ZybSArPSA0OworCQl3cml0ZXcoY3B1X3RvX2JlMTYoZWFkZHJzWzFdKSwgc2V0dXBfZnJtKTsgc2V0dXBfZnJtICs9IDQ7CisJCXdyaXRldyhjcHVfdG9fYmUxNihlYWRkcnNbMF0pLCBzZXR1cF9mcm0pOyBzZXR1cF9mcm0gKz0gODsKKwl9CisKKwkvKiBJbml0aWFsaXplIG90aGVyIHJlZ2lzdGVycy4gKi8KKwkvKiBDb25maWd1cmUgdGhlIFBDSSBidXMgYnVyc3RzIGFuZCBGSUZPIHRocmVzaG9sZHMuICovCisJbnAtPnR4X21vZGUgPSBUeEZsb3dFbmFibGV8UnhGbG93RW5hYmxlfFBhZEVuYWJsZTsJLyogbW9kaWZpZWQgd2hlbiBsaW5rIGlzIHVwLiAqLworCXdyaXRlbChNaWlTb2Z0UmVzZXQgfCBucC0+dHhfbW9kZSwgaW9hZGRyICsgVHhNb2RlKTsKKwl1ZGVsYXkoMTAwMCk7CisJd3JpdGVsKG5wLT50eF9tb2RlLCBpb2FkZHIgKyBUeE1vZGUpOworCW5wLT50eF90aHJlc2hvbGQgPSA0OworCXdyaXRlbChucC0+dHhfdGhyZXNob2xkLCBpb2FkZHIgKyBUeFRocmVzaG9sZCk7CisKKwl3cml0ZWwobnAtPmludHJfdGltZXJfY3RybCwgaW9hZGRyICsgSW50clRpbWVyQ3RybCk7CisKKwluZXRpZl9zdGFydF9pZihkZXYpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlpZiAoZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNldHRpbmcgdGhlIFJ4IGFuZCBUeCBtb2Rlcy5cbiIsIGRldi0+bmFtZSk7CisJc2V0X3J4X21vZGUoZGV2KTsKKworCW5wLT5taWlfaWYuYWR2ZXJ0aXNpbmcgPSBtZGlvX3JlYWQoZGV2LCBucC0+cGh5c1swXSwgTUlJX0FEVkVSVElTRSk7CisJY2hlY2tfZHVwbGV4KGRldik7CisKKwkvKiBFbmFibGUgR1BJTyBpbnRlcnJ1cHRzIG9uIGxpbmsgY2hhbmdlICovCisJd3JpdGVsKDB4MGYwMGZmMDAsIGlvYWRkciArIEdQSU9DdHJsKTsKKworCS8qIFNldCB0aGUgaW50ZXJydXB0IG1hc2sgKi8KKwl3cml0ZWwoSW50clJ4RG9uZSB8IEludHJSeEVtcHR5IHwgSW50ckRNQUVyciB8CisJICAgICAgIEludHJUeERNQURvbmUgfCBJbnRyU3RhdHNNYXggfCBJbnRyTGlua0NoYW5nZSB8CisJICAgICAgIEludHJSeEdGUERlYWQgfCBJbnRyTm9UeENzdW0gfCBJbnRyVHhCYWRJRCwKKwkgICAgICAgaW9hZGRyICsgSW50ckVuYWJsZSk7CisJLyogRW5hYmxlIFBDSSBpbnRlcnJ1cHRzLiAqLworCXdyaXRlbCgweDAwODAwMDAwIHwgcmVhZGwoaW9hZGRyICsgUENJRGV2aWNlQ29uZmlnKSwKKwkgICAgICAgaW9hZGRyICsgUENJRGV2aWNlQ29uZmlnKTsKKworI2lmZGVmIFZMQU5fU1VQUE9SVAorCS8qIFNldCBWTEFOIHR5cGUgdG8gODAyLjFxICovCisJd3JpdGVsKEVUSF9QXzgwMjFRLCBpb2FkZHIgKyBWbGFuVHlwZSk7CisjZW5kaWYgLyogVkxBTl9TVVBQT1JUICovCisKKyNpZmRlZiBIQVNfRklSTVdBUkUKKwkvKiBMb2FkIFJ4L1R4IGZpcm13YXJlIGludG8gdGhlIGZyYW1lIHByb2Nlc3NvcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgRklSTVdBUkVfUlhfU0laRSAqIDI7IGkrKykKKwkJd3JpdGVsKGZpcm13YXJlX3J4W2ldLCBpb2FkZHIgKyBSeEdmcE1lbSArIGkgKiA0KTsKKwlmb3IgKGkgPSAwOyBpIDwgRklSTVdBUkVfVFhfU0laRSAqIDI7IGkrKykKKwkJd3JpdGVsKGZpcm13YXJlX3R4W2ldLCBpb2FkZHIgKyBUeEdmcE1lbSArIGkgKiA0KTsKKyNlbmRpZiAvKiBIQVNfRklSTVdBUkUgKi8KKwlpZiAoZW5hYmxlX2h3X2Nrc3VtKQorCQkvKiBFbmFibGUgdGhlIFJ4IGFuZCBUeCB1bml0cywgYW5kIHRoZSBSeC9UeCBmcmFtZSBwcm9jZXNzb3JzLiAqLworCQl3cml0ZWwoVHhFbmFibGV8VHhHRlBFbmFibGV8UnhFbmFibGV8UnhHRlBFbmFibGUsIGlvYWRkciArIEdlbkN0cmwpOworCWVsc2UKKwkJLyogRW5hYmxlIHRoZSBSeCBhbmQgVHggdW5pdHMgb25seS4gKi8KKwkJd3JpdGVsKFR4RW5hYmxlfFJ4RW5hYmxlLCBpb2FkZHIgKyBHZW5DdHJsKTsKKworCWlmIChkZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRG9uZSBuZXRkZXZfb3BlbigpLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBjaGVja19kdXBsZXgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYgcmVnMDsKKwlpbnQgc2lsbHlfY291bnQgPSAxMDAwOworCisJbWRpb193cml0ZShkZXYsIG5wLT5waHlzWzBdLCBNSUlfQURWRVJUSVNFLCBucC0+bWlpX2lmLmFkdmVydGlzaW5nKTsKKwltZGlvX3dyaXRlKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKKwl1ZGVsYXkoNTAwKTsKKwl3aGlsZSAoLS1zaWxseV9jb3VudCAmJiBtZGlvX3JlYWQoZGV2LCBucC0+cGh5c1swXSwgTUlJX0JNQ1IpICYgQk1DUl9SRVNFVCkKKwkJLyogZG8gbm90aGluZyAqLzsKKwlpZiAoIXNpbGx5X2NvdW50KSB7CisJCXByaW50aygiJXM6IE1JSSByZXNldCBmYWlsZWQhXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJcmVnMCA9IG1kaW9fcmVhZChkZXYsIG5wLT5waHlzWzBdLCBNSUlfQk1DUik7CisKKwlpZiAoIW5wLT5taWlfaWYuZm9yY2VfbWVkaWEpIHsKKwkJcmVnMCB8PSBCTUNSX0FORU5BQkxFIHwgQk1DUl9BTlJFU1RBUlQ7CisJfSBlbHNlIHsKKwkJcmVnMCAmPSB+KEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVCk7CisJCWlmIChucC0+c3BlZWQxMDApCisJCQlyZWcwIHw9IEJNQ1JfU1BFRUQxMDA7CisJCWlmIChucC0+bWlpX2lmLmZ1bGxfZHVwbGV4KQorCQkJcmVnMCB8PSBCTUNSX0ZVTExEUExYOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IExpbmsgZm9yY2VkIHRvICVzTWJpdCAlcy1kdXBsZXhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsCisJCSAgICAgICBucC0+c3BlZWQxMDAgPyAiMTAwIiA6ICIxMCIsCisJCSAgICAgICBucC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiKTsKKwl9CisJbWRpb193cml0ZShkZXYsIG5wLT5waHlzWzBdLCBNSUlfQk1DUiwgcmVnMCk7Cit9CisKKworc3RhdGljIHZvaWQgdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2U7CisJaW50IG9sZF9kZWJ1ZzsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlIzguOHgsICIKKwkgICAgICAgInJlc2V0dGluZy4uLlxuIiwgZGV2LT5uYW1lLCAoaW50KSByZWFkbChpb2FkZHIgKyBJbnRyU3RhdHVzKSk7CisKKwkvKiBQZXJoYXBzIHdlIHNob3VsZCByZWluaXRpYWxpemUgdGhlIGhhcmR3YXJlIGhlcmUuICovCisKKwkvKgorCSAqIFN0b3AgYW5kIHJlc3RhcnQgdGhlIGludGVyZmFjZS4KKwkgKiBDaGVhdCBhbmQgaW5jcmVhc2UgdGhlIGRlYnVnIGxldmVsIHRlbXBvcmFyaWx5LgorCSAqLworCW9sZF9kZWJ1ZyA9IGRlYnVnOworCWRlYnVnID0gMjsKKwluZXRkZXZfY2xvc2UoZGV2KTsKKwluZXRkZXZfb3BlbihkZXYpOworCWRlYnVnID0gb2xkX2RlYnVnOworCisJLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgdHJhbnNtaXQgZGVtYW5kLiAqLworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbnAtPnN0YXRzLnR4X2Vycm9ycysrOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworCisvKiBJbml0aWFsaXplIHRoZSBSeCBhbmQgVHggcmluZ3MsIGFsb25nIHdpdGggdmFyaW91cyAnZGV2JyBiaXRzLiAqLworc3RhdGljIHZvaWQgaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwlucC0+Y3VyX3J4ID0gbnAtPmN1cl90eCA9IG5wLT5yZWFwX3R4ID0gMDsKKwlucC0+ZGlydHlfcnggPSBucC0+ZGlydHlfdHggPSBucC0+cnhfZG9uZSA9IG5wLT50eF9kb25lID0gMDsKKworCW5wLT5yeF9idWZfc3ogPSAoZGV2LT5tdHUgPD0gMTUwMCA/IFBLVF9CVUZfU1ogOiBkZXYtPm10dSArIDMyKTsKKworCS8qIEZpbGwgaW4gdGhlIFJ4IGJ1ZmZlcnMuICBIYW5kbGUgYWxsb2NhdGlvbiBmYWlsdXJlIGdyYWNlZnVsbHkuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKG5wLT5yeF9idWZfc3opOworCQlucC0+cnhfaW5mb1tpXS5za2IgPSBza2I7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlucC0+cnhfaW5mb1tpXS5tYXBwaW5nID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsIHNrYi0+dGFpbCwgbnAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJc2tiLT5kZXYgPSBkZXY7CQkJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLworCQkvKiBHcnJyLCB3ZSBjYW5ub3Qgb2Zmc2V0IHRvIGNvcnJlY3RseSBhbGlnbiB0aGUgSVAgaGVhZGVyLiAqLworCQlucC0+cnhfcmluZ1tpXS5yeGFkZHIgPSBjcHVfdG9fZG1hKG5wLT5yeF9pbmZvW2ldLm1hcHBpbmcgfCBSeERlc2NWYWxpZCk7CisJfQorCXdyaXRldyhpIC0gMSwgbnAtPmJhc2UgKyBSeERlc2NRSWR4KTsKKwlucC0+ZGlydHlfcnggPSAodW5zaWduZWQgaW50KShpIC0gUlhfUklOR19TSVpFKTsKKworCS8qIENsZWFyIHRoZSByZW1haW5kZXIgb2YgdGhlIFJ4IGJ1ZmZlciByaW5nLiAqLworCWZvciAoICA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlucC0+cnhfcmluZ1tpXS5yeGFkZHIgPSAwOworCQlucC0+cnhfaW5mb1tpXS5za2IgPSBOVUxMOworCQlucC0+cnhfaW5mb1tpXS5tYXBwaW5nID0gMDsKKwl9CisJLyogTWFyayB0aGUgbGFzdCBlbnRyeSBhcyB3cmFwcGluZyB0aGUgcmluZy4gKi8KKwlucC0+cnhfcmluZ1tSWF9SSU5HX1NJWkUgLSAxXS5yeGFkZHIgfD0gY3B1X3RvX2RtYShSeERlc2NFbmRSaW5nKTsKKworCS8qIENsZWFyIHRoZSBjb21wbGV0aW9uIHJpbmdzLiAqLworCWZvciAoaSA9IDA7IGkgPCBET05FX1FfU0laRTsgaSsrKSB7CisJCW5wLT5yeF9kb25lX3FbaV0uc3RhdHVzID0gMDsKKwkJbnAtPnR4X2RvbmVfcVtpXS5zdGF0dXMgPSAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykKKwkJbWVtc2V0KCZucC0+dHhfaW5mb1tpXSwgMCwgc2l6ZW9mKG5wLT50eF9pbmZvW2ldKSk7CisKKwlyZXR1cm47Cit9CisKKworc3RhdGljIGludCBzdGFydF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBlbnRyeTsKKwl1MzIgc3RhdHVzOworCWludCBpOworCisJa2lja190eF90aW1lcihkZXYsIHR4X3RpbWVvdXQsIFRYX1RJTUVPVVQpOworCisJLyoKKwkgKiBiZSBjYXV0aW91cyBoZXJlLCB3cmFwcGluZyB0aGUgcXVldWUgaGFzIHdlaXJkIHNlbWFudGljcworCSAqIGFuZCB3ZSBtYXkgbm90IGhhdmUgZW5vdWdoIHNsb3RzIGV2ZW4gd2hlbiBpdCBzZWVtcyB3ZSBkby4KKwkgKi8KKwlpZiAoKG5wLT5jdXJfdHggLSBucC0+ZGlydHlfdHgpICsgc2tiX251bV9mcmFncyhza2IpICogMiA+IFRYX1JJTkdfU0laRSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXJldHVybiAxOworCX0KKworI2lmIGRlZmluZWQoWkVST0NPUFkpICYmIGRlZmluZWQoSEFTX0JST0tFTl9GSVJNV0FSRSkKKwl7CisJCWludCBoYXNfYmFkX2xlbmd0aCA9IDA7CisKKwkJaWYgKHNrYl9maXJzdF9mcmFnX2xlbihza2IpID09IDEpCisJCQloYXNfYmFkX2xlbmd0aCA9IDE7CisJCWVsc2UgeworCQkJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykKKwkJCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplID09IDEpIHsKKwkJCQkJaGFzX2JhZF9sZW5ndGggPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCX0KKworCQlpZiAoaGFzX2JhZF9sZW5ndGgpCisJCQlza2JfY2hlY2tzdW1faGVscChza2IpOworCX0KKyNlbmRpZiAvKiBaRVJPQ09QWSAmJiBIQVNfQlJPS0VOX0ZJUk1XQVJFICovCisKKwllbnRyeSA9IG5wLT5jdXJfdHggJSBUWF9SSU5HX1NJWkU7CisJZm9yIChpID0gMDsgaSA8IHNrYl9udW1fZnJhZ3Moc2tiKTsgaSsrKSB7CisJCWludCB3cmFwX3JpbmcgPSAwOworCQlzdGF0dXMgPSBUeERlc2NJRDsKKworCQlpZiAoaSA9PSAwKSB7CisJCQlucC0+dHhfaW5mb1tlbnRyeV0uc2tiID0gc2tiOworCQkJc3RhdHVzIHw9IFR4Q1JDRW47CisJCQlpZiAoZW50cnkgPj0gVFhfUklOR19TSVpFIC0gc2tiX251bV9mcmFncyhza2IpKSB7CisJCQkJc3RhdHVzIHw9IFR4UmluZ1dyYXA7CisJCQkJd3JhcF9yaW5nID0gMTsKKwkJCX0KKwkJCWlmIChucC0+cmVhcF90eCkgeworCQkJCXN0YXR1cyB8PSBUeERlc2NJbnRyOworCQkJCW5wLT5yZWFwX3R4ID0gMDsKKwkJCX0KKwkJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQkJCXN0YXR1cyB8PSBUeENhbFRDUDsKKwkJCQlucC0+c3RhdHMudHhfY29tcHJlc3NlZCsrOworCQkJfQorCQkJc3RhdHVzIHw9IHNrYl9maXJzdF9mcmFnX2xlbihza2IpIHwgKHNrYl9udW1fZnJhZ3Moc2tiKSA8PCAxNik7CisKKwkJCW5wLT50eF9pbmZvW2VudHJ5XS5tYXBwaW5nID0KKwkJCQlwY2lfbWFwX3NpbmdsZShucC0+cGNpX2Rldiwgc2tiLT5kYXRhLCBza2JfZmlyc3RfZnJhZ19sZW4oc2tiKSwgUENJX0RNQV9UT0RFVklDRSk7CisJCX0gZWxzZSB7CisjaWZkZWYgTUFYX1NLQl9GUkFHUworCQkJc2tiX2ZyYWdfdCAqdGhpc19mcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdOworCQkJc3RhdHVzIHw9IHRoaXNfZnJhZy0+c2l6ZTsKKwkJCW5wLT50eF9pbmZvW2VudHJ5XS5tYXBwaW5nID0KKwkJCQlwY2lfbWFwX3NpbmdsZShucC0+cGNpX2RldiwgcGFnZV9hZGRyZXNzKHRoaXNfZnJhZy0+cGFnZSkgKyB0aGlzX2ZyYWctPnBhZ2Vfb2Zmc2V0LCB0aGlzX2ZyYWctPnNpemUsIFBDSV9ETUFfVE9ERVZJQ0UpOworI2VuZGlmIC8qIE1BWF9TS0JfRlJBR1MgKi8KKwkJfQorCisJCW5wLT50eF9yaW5nW2VudHJ5XS5hZGRyID0gY3B1X3RvX2RtYShucC0+dHhfaW5mb1tlbnRyeV0ubWFwcGluZyk7CisJCW5wLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMgPSBjcHVfdG9fbGUzMihzdGF0dXMpOworCQlpZiAoZGVidWcgPiAzKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUeCAjJWQvIyVkIHNsb3QgJWQgc3RhdHVzICUjOC44eC5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBucC0+Y3VyX3R4LCBucC0+ZGlydHlfdHgsCisJCQkgICAgICAgZW50cnksIHN0YXR1cyk7CisJCWlmICh3cmFwX3JpbmcpIHsKKwkJCW5wLT50eF9pbmZvW2VudHJ5XS51c2VkX3Nsb3RzID0gVFhfUklOR19TSVpFIC0gZW50cnk7CisJCQlucC0+Y3VyX3R4ICs9IG5wLT50eF9pbmZvW2VudHJ5XS51c2VkX3Nsb3RzOworCQkJZW50cnkgPSAwOworCQl9IGVsc2UgeworCQkJbnAtPnR4X2luZm9bZW50cnldLnVzZWRfc2xvdHMgPSAxOworCQkJbnAtPmN1cl90eCArPSBucC0+dHhfaW5mb1tlbnRyeV0udXNlZF9zbG90czsKKwkJCWVudHJ5Kys7CisJCX0KKwkJLyogc2NhdmVuZ2UgdGhlIHR4IGRlc2NyaXB0b3JzIHR3aWNlIHBlciBUWF9SSU5HX1NJWkUgKi8KKwkJaWYgKG5wLT5jdXJfdHggJSAoVFhfUklOR19TSVpFIC8gMikgPT0gMCkKKwkJCW5wLT5yZWFwX3R4ID0gMTsKKwl9CisKKwkvKiBOb24teDg2OiBleHBsaWNpdGx5IGZsdXNoIGRlc2NyaXB0b3IgY2FjaGUgbGluZXMgaGVyZS4gKi8KKwkvKiBFbnN1cmUgYWxsIGRlc2NyaXB0b3JzIGFyZSB3cml0dGVuIGJhY2sgYmVmb3JlIHRoZSB0cmFuc21pdCBpcworCSAgIGluaXRpYXRlZC4gLSBKZXMgKi8KKwl3bWIoKTsKKworCS8qIFVwZGF0ZSB0aGUgcHJvZHVjZXIgaW5kZXguICovCisJd3JpdGVsKGVudHJ5ICogKHNpemVvZihzdGFyZmlyZV90eF9kZXNjKSAvIDgpLCBucC0+YmFzZSArIFR4UHJvZHVjZXJJZHgpOworCisJLyogNCBpcyBhcmJpdHJhcnksIGJ1dCBzaG91bGQgYmUgb2sgKi8KKwlpZiAoKG5wLT5jdXJfdHggLSBucC0+ZGlydHlfdHgpICsgNCA+IFRYX1JJTkdfU0laRSkKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgZG9lcyBhbGwgb2YgdGhlIFJ4IHRocmVhZCB3b3JrIGFuZCBjbGVhbnMgdXAKKyAgIGFmdGVyIHRoZSBUeCB0aHJlYWQuICovCitzdGF0aWMgaXJxcmV0dXJuX3QgaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2luc3RhbmNlOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2U7CisJaW50IGJvZ3VzY250ID0gbWF4X2ludGVycnVwdF93b3JrOworCWludCBjb25zdW1lcjsKKwlpbnQgdHhfc3RhdHVzOworCWludCBoYW5kbGVkID0gMDsKKworCWRvIHsKKwkJdTMyIGludHJfc3RhdHVzID0gcmVhZGwoaW9hZGRyICsgSW50ckNsZWFyKTsKKworCQlpZiAoZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJbnRlcnJ1cHQgc3RhdHVzICUjOC44eC5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7CisKKwkJaWYgKGludHJfc3RhdHVzID09IDAgfHwgaW50cl9zdGF0dXMgPT0gKHUzMikgLTEpCisJCQlicmVhazsKKworCQloYW5kbGVkID0gMTsKKworCQlpZiAoaW50cl9zdGF0dXMgJiAoSW50clJ4RG9uZSB8IEludHJSeEVtcHR5KSkKKwkJCW5ldGRldl9yeChkZXYsIGlvYWRkcik7CisKKwkJLyogU2NhdmVuZ2UgdGhlIHNrYnVmZiBsaXN0IGJhc2VkIG9uIHRoZSBUeC1kb25lIHF1ZXVlLgorCQkgICBUaGVyZSBhcmUgcmVkdW5kYW50IGNoZWNrcyBoZXJlIHRoYXQgbWF5IGJlIGNsZWFuZWQgdXAKKwkJICAgYWZ0ZXIgdGhlIGRyaXZlciBoYXMgcHJvdmVuIHRvIGJlIHJlbGlhYmxlLiAqLworCQljb25zdW1lciA9IHJlYWRsKGlvYWRkciArIFR4Q29uc3VtZXJJZHgpOworCQlpZiAoZGVidWcgPiAzKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUeCBDb25zdW1lciBpbmRleCBpcyAlZC5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBjb25zdW1lcik7CisKKwkJd2hpbGUgKCh0eF9zdGF0dXMgPSBsZTMyX3RvX2NwdShucC0+dHhfZG9uZV9xW25wLT50eF9kb25lXS5zdGF0dXMpKSAhPSAwKSB7CisJCQlpZiAoZGVidWcgPiAzKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHggY29tcGxldGlvbiAjJWQgZW50cnkgJWQgaXMgJSM4Ljh4LlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBucC0+ZGlydHlfdHgsIG5wLT50eF9kb25lLCB0eF9zdGF0dXMpOworCQkJaWYgKCh0eF9zdGF0dXMgJiAweGUwMDAwMDAwKSA9PSAweGEwMDAwMDAwKSB7CisJCQkJbnAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCX0gZWxzZSBpZiAoKHR4X3N0YXR1cyAmIDB4ZTAwMDAwMDApID09IDB4ODAwMDAwMDApIHsKKwkJCQl1MTYgZW50cnkgPSAodHhfc3RhdHVzICYgMHg3ZmZmKSAvIHNpemVvZihzdGFyZmlyZV90eF9kZXNjKTsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbnAtPnR4X2luZm9bZW50cnldLnNrYjsKKwkJCQlucC0+dHhfaW5mb1tlbnRyeV0uc2tiID0gTlVMTDsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LAorCQkJCQkJIG5wLT50eF9pbmZvW2VudHJ5XS5tYXBwaW5nLAorCQkJCQkJIHNrYl9maXJzdF9mcmFnX2xlbihza2IpLAorCQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCW5wLT50eF9pbmZvW2VudHJ5XS5tYXBwaW5nID0gMDsKKwkJCQlucC0+ZGlydHlfdHggKz0gbnAtPnR4X2luZm9bZW50cnldLnVzZWRfc2xvdHM7CisJCQkJZW50cnkgPSAoZW50cnkgKyBucC0+dHhfaW5mb1tlbnRyeV0udXNlZF9zbG90cykgJSBUWF9SSU5HX1NJWkU7CisjaWZkZWYgTUFYX1NLQl9GUkFHUworCQkJCXsKKwkJCQkJaW50IGk7CisJCQkJCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspIHsKKwkJCQkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsCisJCQkJCQkJCSBucC0+dHhfaW5mb1tlbnRyeV0ubWFwcGluZywKKwkJCQkJCQkJIHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZSwKKwkJCQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCQkJbnAtPmRpcnR5X3R4Kys7CisJCQkJCQllbnRyeSsrOworCQkJCQl9CisJCQkJfQorI2VuZGlmIC8qIE1BWF9TS0JfRlJBR1MgKi8KKwkJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQkJfQorCQkJbnAtPnR4X2RvbmVfcVtucC0+dHhfZG9uZV0uc3RhdHVzID0gMDsKKwkJCW5wLT50eF9kb25lID0gKG5wLT50eF9kb25lICsgMSkgJSBET05FX1FfU0laRTsKKwkJfQorCQl3cml0ZXcobnAtPnR4X2RvbmUsIGlvYWRkciArIENvbXBsZXRpb25RQ29uc3VtZXJJZHggKyAyKTsKKworCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCisJCSAgICAobnAtPmN1cl90eCAtIG5wLT5kaXJ0eV90eCArIDQgPCBUWF9SSU5HX1NJWkUpKSB7CisJCQkvKiBUaGUgcmluZyBpcyBubyBsb25nZXIgZnVsbCwgd2FrZSB0aGUgcXVldWUuICovCisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0KKworCQkvKiBTdGF0cyBvdmVyZmxvdyAqLworCQlpZiAoaW50cl9zdGF0dXMgJiBJbnRyU3RhdHNNYXgpCisJCQlnZXRfc3RhdHMoZGV2KTsKKworCQkvKiBNZWRpYSBjaGFuZ2UgaW50ZXJydXB0LiAqLworCQlpZiAoaW50cl9zdGF0dXMgJiBJbnRyTGlua0NoYW5nZSkKKwkJCW5ldGRldl9tZWRpYV9jaGFuZ2UoZGV2KTsKKworCQkvKiBBYm5vcm1hbCBlcnJvciBzdW1tYXJ5L3VuY29tbW9uIGV2ZW50cyBoYW5kbGVycy4gKi8KKwkJaWYgKGludHJfc3RhdHVzICYgSW50ckFibm9ybWFsU3VtbWFyeSkKKwkJCW5ldGRldl9lcnJvcihkZXYsIGludHJfc3RhdHVzKTsKKworCQlpZiAoLS1ib2d1c2NudCA8IDApIHsKKwkJCWlmIChkZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRvbyBtdWNoIHdvcmsgYXQgaW50ZXJydXB0LCAiCisJCQkJICAgICAgICJzdGF0dXM9JSM4Ljh4LlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKDEpOworCisJaWYgKGRlYnVnID4gNCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleGl0aW5nIGludGVycnVwdCwgc3RhdHVzPSUjOC44eC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIChpbnQpIHJlYWRsKGlvYWRkciArIEludHJTdGF0dXMpKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCisvKiBUaGlzIHJvdXRpbmUgaXMgbG9naWNhbGx5IHBhcnQgb2YgdGhlIGludGVycnVwdC9wb2xsIGhhbmRsZXIsIGJ1dCBzZXBhcmF0ZWQKKyAgIGZvciBjbGFyaXR5LCBjb2RlIHNoYXJpbmcgYmV0d2VlbiBOQVBJL25vbi1OQVBJLCBhbmQgYmV0dGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24uICovCitzdGF0aWMgaW50IF9fbmV0ZGV2X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqcXVvdGEpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIGRlc2Nfc3RhdHVzOworCWludCByZXRjb2RlID0gMDsKKworCS8qIElmIEVPUCBpcyBzZXQgb24gdGhlIG5leHQgZW50cnksIGl0J3MgYSBuZXcgcGFja2V0LiBTZW5kIGl0IHVwLiAqLworCXdoaWxlICgoZGVzY19zdGF0dXMgPSBsZTMyX3RvX2NwdShucC0+cnhfZG9uZV9xW25wLT5yeF9kb25lXS5zdGF0dXMpKSAhPSAwKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXUxNiBwa3RfbGVuOworCQlpbnQgZW50cnk7CisJCXJ4X2RvbmVfZGVzYyAqZGVzYyA9ICZucC0+cnhfZG9uZV9xW25wLT5yeF9kb25lXTsKKworCQlpZiAoZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgbmV0ZGV2X3J4KCkgc3RhdHVzIG9mICVkIHdhcyAlIzguOHguXG4iLCBucC0+cnhfZG9uZSwgZGVzY19zdGF0dXMpOworCQlpZiAoIShkZXNjX3N0YXR1cyAmIFJ4T0spKSB7CisJCQkvKiBUaGVyZSB3YXMgYSBlcnJvci4gKi8KKwkJCWlmIChkZWJ1ZyA+IDIpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgbmV0ZGV2X3J4KCkgUnggZXJyb3Igd2FzICUjOC44eC5cbiIsIGRlc2Nfc3RhdHVzKTsKKwkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChkZXNjX3N0YXR1cyAmIFJ4RklGT0VycikKKwkJCQlucC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCWdvdG8gbmV4dF9yeDsKKwkJfQorCisJCWlmICgqcXVvdGEgPD0gMCkgewkvKiBvdXQgb2YgcnggcXVvdGEgKi8KKwkJCXJldGNvZGUgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKwkJKCpxdW90YSktLTsKKworCQlwa3RfbGVuID0gZGVzY19zdGF0dXM7CS8qIEltcGxpY2l0bHkgVHJ1bmNhdGUgKi8KKwkJZW50cnkgPSAoZGVzY19zdGF0dXMgPj4gMTYpICYgMHg3ZmY7CisKKwkJaWYgKGRlYnVnID4gNCkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgIG5ldGRldl9yeCgpIG5vcm1hbCBSeCBwa3QgbGVuZ3RoICVkLCBxdW90YSAlZC5cbiIsIHBrdF9sZW4sICpxdW90YSk7CisJCS8qIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgbG9uZyBlbm91Z2ggdG8gYWNjZXB0IHdpdGhvdXQgY29weWluZworCQkgICB0byBhIG1pbmltYWxseS1zaXplZCBza2J1ZmYuICovCisJCWlmIChwa3RfbGVuIDwgcnhfY29weWJyZWFrCisJCSAgICAmJiAoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMikpICE9IE5VTEwpIHsKKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobnAtPnBjaV9kZXYsCisJCQkJCQkgICAgbnAtPnJ4X2luZm9bZW50cnldLm1hcHBpbmcsCisJCQkJCQkgICAgcGt0X2xlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBucC0+cnhfaW5mb1tlbnRyeV0uc2tiLT50YWlsLCBwa3RfbGVuLCAwKTsKKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShucC0+cGNpX2RldiwKKwkJCQkJCSAgICAgICBucC0+cnhfaW5mb1tlbnRyeV0ubWFwcGluZywKKwkJCQkJCSAgICAgICBwa3RfbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQl9IGVsc2UgeworCQkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldiwgbnAtPnJ4X2luZm9bZW50cnldLm1hcHBpbmcsIG5wLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlza2IgPSBucC0+cnhfaW5mb1tlbnRyeV0uc2tiOworCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJbnAtPnJ4X2luZm9bZW50cnldLnNrYiA9IE5VTEw7CisJCQlucC0+cnhfaW5mb1tlbnRyeV0ubWFwcGluZyA9IDA7CisJCX0KKyNpZm5kZWYgZmluYWxfdmVyc2lvbgkJCS8qIFJlbW92ZSBhZnRlciB0ZXN0aW5nLiAqLworCQkvKiBZb3Ugd2lsbCB3YW50IHRoaXMgaW5mbyBmb3IgdGhlIGluaXRpYWwgZGVidWcuICovCisJCWlmIChkZWJ1ZyA+IDUpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiICBSeCBkYXRhICUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4OiIKKwkJCSAgICAgICAiJTIuMnggJTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMnggJTIuMnglMi4yeC5cbiIsCisJCQkgICAgICAgc2tiLT5kYXRhWzBdLCBza2ItPmRhdGFbMV0sIHNrYi0+ZGF0YVsyXSwgc2tiLT5kYXRhWzNdLAorCQkJICAgICAgIHNrYi0+ZGF0YVs0XSwgc2tiLT5kYXRhWzVdLCBza2ItPmRhdGFbNl0sIHNrYi0+ZGF0YVs3XSwKKwkJCSAgICAgICBza2ItPmRhdGFbOF0sIHNrYi0+ZGF0YVs5XSwgc2tiLT5kYXRhWzEwXSwKKwkJCSAgICAgICBza2ItPmRhdGFbMTFdLCBza2ItPmRhdGFbMTJdLCBza2ItPmRhdGFbMTNdKTsKKyNlbmRpZgorCisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisjaWYgZGVmaW5lZChIQVNfRklSTVdBUkUpIHx8IGRlZmluZWQoVkxBTl9TVVBQT1JUKQorCQlpZiAoZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgbmV0ZGV2X3J4KCkgc3RhdHVzMiBvZiAlZCB3YXMgJSM0LjR4LlxuIiwgbnAtPnJ4X2RvbmUsIGxlMTZfdG9fY3B1KGRlc2MtPnN0YXR1czIpKTsKKyNlbmRpZgorI2lmZGVmIEhBU19GSVJNV0FSRQorCQlpZiAobGUxNl90b19jcHUoZGVzYy0+c3RhdHVzMikgJiAweDAxMDApIHsKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCQlucC0+c3RhdHMucnhfY29tcHJlc3NlZCsrOworCQl9CisJCS8qCisJCSAqIFRoaXMgZmVhdHVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgd29ya2luZywgYXQgbGVhc3QKKwkJICogd2l0aCB0aGUgdHdvIGZpcm13YXJlIHZlcnNpb25zIEkgaGF2ZS4gSWYgdGhlIEdGUCBzZWVzCisJCSAqIGFuIElQIGZyYWdtZW50LCBpdCBlaXRoZXIgaWdub3JlcyBpdCBjb21wbGV0ZWx5LCBvciByZXBvcnRzCisJCSAqICJiYWQgY2hlY2tzdW0iIG9uIGl0LgorCQkgKgorCQkgKiBNYXliZSBJIG1pc3NlZCBzb21ldGhpbmcgLS0gY29ycmVjdGlvbnMgYXJlIHdlbGNvbWUuCisJCSAqIFVudGlsIHRoZW4sIHRoZSBwcmludGsgc3RheXMuIDotKSAtSW9uCisJCSAqLworCQllbHNlIGlmIChsZTE2X3RvX2NwdShkZXNjLT5zdGF0dXMyKSAmIDB4MDA0MCkgeworCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9IVzsKKwkJCXNrYi0+Y3N1bSA9IGxlMTZfdG9fY3B1KGRlc2MtPmNzdW0pOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjaGVja3N1bV9odywgc3RhdHVzMiA9ICUjeFxuIiwgZGV2LT5uYW1lLCBsZTE2X3RvX2NwdShkZXNjLT5zdGF0dXMyKSk7CisJCX0KKyNlbmRpZiAvKiBIQVNfRklSTVdBUkUgKi8KKyNpZmRlZiBWTEFOX1NVUFBPUlQKKwkJaWYgKG5wLT52bGdycCAmJiBsZTE2X3RvX2NwdShkZXNjLT5zdGF0dXMyKSAmIDB4MDIwMCkgeworCQkJaWYgKGRlYnVnID4gNCkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiICBuZXRkZXZfcngoKSB2bGFuaWQgPSAlZFxuIiwgbGUxNl90b19jcHUoZGVzYy0+dmxhbmlkKSk7CisJCQkvKiB2bGFuX25ldGRldl9yZWNlaXZlX3NrYigpIGV4cGVjdHMgYSBwYWNrZXQgd2l0aCB0aGUgVkxBTiB0YWcgc3RyaXBwZWQgb3V0ICovCisJCQl2bGFuX25ldGRldl9yZWNlaXZlX3NrYihza2IsIG5wLT52bGdycCwgbGUxNl90b19jcHUoZGVzYy0+dmxhbmlkKSAmIFZMQU5fVklEX01BU0spOworCQl9IGVsc2UKKyNlbmRpZiAvKiBWTEFOX1NVUFBPUlQgKi8KKwkJCW5ldGRldl9yZWNlaXZlX3NrYihza2IpOworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlucC0+c3RhdHMucnhfcGFja2V0cysrOworCisJbmV4dF9yeDoKKwkJbnAtPmN1cl9yeCsrOworCQlkZXNjLT5zdGF0dXMgPSAwOworCQlucC0+cnhfZG9uZSA9IChucC0+cnhfZG9uZSArIDEpICUgRE9ORV9RX1NJWkU7CisJfQorCXdyaXRldyhucC0+cnhfZG9uZSwgbnAtPmJhc2UgKyBDb21wbGV0aW9uUUNvbnN1bWVySWR4KTsKKworIG91dDoKKwlyZWZpbGxfcnhfcmluZyhkZXYpOworCWlmIChkZWJ1ZyA+IDUpCisJCXByaW50ayhLRVJOX0RFQlVHICIgIGV4aXRpbmcgbmV0ZGV2X3J4KCk6ICVkLCBzdGF0dXMgb2YgJWQgd2FzICUjOC44eC5cbiIsCisJCSAgICAgICByZXRjb2RlLCBucC0+cnhfZG9uZSwgZGVzY19zdGF0dXMpOworCXJldHVybiByZXRjb2RlOworfQorCisKKyNpZmRlZiBIQVZFX05FVERFVl9QT0xMCitzdGF0aWMgaW50IG5ldGRldl9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQoreworCXUzMiBpbnRyX3N0YXR1czsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlOworCWludCByZXRjb2RlID0gMCwgcXVvdGEgPSBkZXYtPnF1b3RhOworCisJZG8geworCQl3cml0ZWwoSW50clJ4RG9uZSB8IEludHJSeEVtcHR5LCBpb2FkZHIgKyBJbnRyQ2xlYXIpOworCisJCXJldGNvZGUgPSBfX25ldGRldl9yeChkZXYsICZxdW90YSk7CisJCSpidWRnZXQgLT0gKGRldi0+cXVvdGEgLSBxdW90YSk7CisJCWRldi0+cXVvdGEgPSBxdW90YTsKKwkJaWYgKHJldGNvZGUpCisJCQlnb3RvIG91dDsKKworCQlpbnRyX3N0YXR1cyA9IHJlYWRsKGlvYWRkciArIEludHJTdGF0dXMpOworCX0gd2hpbGUgKGludHJfc3RhdHVzICYgKEludHJSeERvbmUgfCBJbnRyUnhFbXB0eSkpOworCisJbmV0aWZfcnhfY29tcGxldGUoZGV2KTsKKwlpbnRyX3N0YXR1cyA9IHJlYWRsKGlvYWRkciArIEludHJFbmFibGUpOworCWludHJfc3RhdHVzIHw9IEludHJSeERvbmUgfCBJbnRyUnhFbXB0eTsKKwl3cml0ZWwoaW50cl9zdGF0dXMsIGlvYWRkciArIEludHJFbmFibGUpOworCisgb3V0OgorCWlmIChkZWJ1ZyA+IDUpCisJCXByaW50ayhLRVJOX0RFQlVHICIgIGV4aXRpbmcgbmV0ZGV2X3BvbGwoKTogJWQuXG4iLCByZXRjb2RlKTsKKworCS8qIFJlc3RhcnQgUnggZW5naW5lIGlmIHN0b3BwZWQuICovCisJcmV0dXJuIHJldGNvZGU7Cit9CisjZW5kaWYgLyogSEFWRV9ORVRERVZfUE9MTCAqLworCisKK3N0YXRpYyB2b2lkIHJlZmlsbF9yeF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgZW50cnkgPSAtMTsKKworCS8qIFJlZmlsbCB0aGUgUnggcmluZyBidWZmZXJzLiAqLworCWZvciAoOyBucC0+Y3VyX3J4IC0gbnAtPmRpcnR5X3J4ID4gMDsgbnAtPmRpcnR5X3J4KyspIHsKKwkJZW50cnkgPSBucC0+ZGlydHlfcnggJSBSWF9SSU5HX1NJWkU7CisJCWlmIChucC0+cnhfaW5mb1tlbnRyeV0uc2tiID09IE5VTEwpIHsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IobnAtPnJ4X2J1Zl9zeik7CisJCQlucC0+cnhfaW5mb1tlbnRyeV0uc2tiID0gc2tiOworCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJCWJyZWFrOwkvKiBCZXR0ZXIgbHVjayBuZXh0IHJvdW5kLiAqLworCQkJbnAtPnJ4X2luZm9bZW50cnldLm1hcHBpbmcgPQorCQkJCXBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPnRhaWwsIG5wLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlza2ItPmRldiA9IGRldjsJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLworCQkJbnAtPnJ4X3JpbmdbZW50cnldLnJ4YWRkciA9CisJCQkJY3B1X3RvX2RtYShucC0+cnhfaW5mb1tlbnRyeV0ubWFwcGluZyB8IFJ4RGVzY1ZhbGlkKTsKKwkJfQorCQlpZiAoZW50cnkgPT0gUlhfUklOR19TSVpFIC0gMSkKKwkJCW5wLT5yeF9yaW5nW2VudHJ5XS5yeGFkZHIgfD0gY3B1X3RvX2RtYShSeERlc2NFbmRSaW5nKTsKKwl9CisJaWYgKGVudHJ5ID49IDApCisJCXdyaXRldyhlbnRyeSwgbnAtPmJhc2UgKyBSeERlc2NRSWR4KTsKK30KKworCitzdGF0aWMgdm9pZCBuZXRkZXZfbWVkaWFfY2hhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZTsKKwl1MTYgcmVnMCwgcmVnMSwgcmVnNCwgcmVnNTsKKwl1MzIgbmV3X3R4X21vZGU7CisJdTMyIG5ld19pbnRyX3RpbWVyX2N0cmw7CisKKwkvKiByZXNldCBzdGF0dXMgZmlyc3QgKi8KKwltZGlvX3JlYWQoZGV2LCBucC0+cGh5c1swXSwgTUlJX0JNQ1IpOworCW1kaW9fcmVhZChkZXYsIG5wLT5waHlzWzBdLCBNSUlfQk1TUik7CisKKwlyZWcwID0gbWRpb19yZWFkKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9CTUNSKTsKKwlyZWcxID0gbWRpb19yZWFkKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9CTVNSKTsKKworCWlmIChyZWcxICYgQk1TUl9MU1RBVFVTKSB7CisJCS8qIGxpbmsgaXMgdXAgKi8KKwkJaWYgKHJlZzAgJiBCTUNSX0FORU5BQkxFKSB7CisJCQkvKiBhdXRvbmVnb3RpYXRpb24gaXMgZW5hYmxlZCAqLworCQkJcmVnNCA9IG1kaW9fcmVhZChkZXYsIG5wLT5waHlzWzBdLCBNSUlfQURWRVJUSVNFKTsKKwkJCXJlZzUgPSBtZGlvX3JlYWQoZGV2LCBucC0+cGh5c1swXSwgTUlJX0xQQSk7CisJCQlpZiAocmVnNCAmIEFEVkVSVElTRV8xMDBGVUxMICYmIHJlZzUgJiBMUEFfMTAwRlVMTCkgeworCQkJCW5wLT5zcGVlZDEwMCA9IDE7CisJCQkJbnAtPm1paV9pZi5mdWxsX2R1cGxleCA9IDE7CisJCQl9IGVsc2UgaWYgKHJlZzQgJiBBRFZFUlRJU0VfMTAwSEFMRiAmJiByZWc1ICYgTFBBXzEwMEhBTEYpIHsKKwkJCQlucC0+c3BlZWQxMDAgPSAxOworCQkJCW5wLT5taWlfaWYuZnVsbF9kdXBsZXggPSAwOworCQkJfSBlbHNlIGlmIChyZWc0ICYgQURWRVJUSVNFXzEwRlVMTCAmJiByZWc1ICYgTFBBXzEwRlVMTCkgeworCQkJCW5wLT5zcGVlZDEwMCA9IDA7CisJCQkJbnAtPm1paV9pZi5mdWxsX2R1cGxleCA9IDE7CisJCQl9IGVsc2UgeworCQkJCW5wLT5zcGVlZDEwMCA9IDA7CisJCQkJbnAtPm1paV9pZi5mdWxsX2R1cGxleCA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBhdXRvbmVnb3RpYXRpb24gaXMgZGlzYWJsZWQgKi8KKwkJCWlmIChyZWcwICYgQk1DUl9TUEVFRDEwMCkKKwkJCQlucC0+c3BlZWQxMDAgPSAxOworCQkJZWxzZQorCQkJCW5wLT5zcGVlZDEwMCA9IDA7CisJCQlpZiAocmVnMCAmIEJNQ1JfRlVMTERQTFgpCisJCQkJbnAtPm1paV9pZi5mdWxsX2R1cGxleCA9IDE7CisJCQllbHNlCisJCQkJbnAtPm1paV9pZi5mdWxsX2R1cGxleCA9IDA7CisJCX0KKwkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IExpbmsgaXMgdXAsIHJ1bm5pbmcgYXQgJXNNYml0ICVzLWR1cGxleFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwKKwkJICAgICAgIG5wLT5zcGVlZDEwMCA/ICIxMDAiIDogIjEwIiwKKwkJICAgICAgIG5wLT5taWlfaWYuZnVsbF9kdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIpOworCisJCW5ld190eF9tb2RlID0gbnAtPnR4X21vZGUgJiB+RnVsbER1cGxleDsJLyogZHVwbGV4IHNldHRpbmcgKi8KKwkJaWYgKG5wLT5taWlfaWYuZnVsbF9kdXBsZXgpCisJCQluZXdfdHhfbW9kZSB8PSBGdWxsRHVwbGV4OworCQlpZiAobnAtPnR4X21vZGUgIT0gbmV3X3R4X21vZGUpIHsKKwkJCW5wLT50eF9tb2RlID0gbmV3X3R4X21vZGU7CisJCQl3cml0ZWwobnAtPnR4X21vZGUgfCBNaWlTb2Z0UmVzZXQsIGlvYWRkciArIFR4TW9kZSk7CisJCQl1ZGVsYXkoMTAwMCk7CisJCQl3cml0ZWwobnAtPnR4X21vZGUsIGlvYWRkciArIFR4TW9kZSk7CisJCX0KKworCQluZXdfaW50cl90aW1lcl9jdHJsID0gbnAtPmludHJfdGltZXJfY3RybCAmIH5UaW1lcjEwWDsKKwkJaWYgKG5wLT5zcGVlZDEwMCkKKwkJCW5ld19pbnRyX3RpbWVyX2N0cmwgfD0gVGltZXIxMFg7CisJCWlmIChucC0+aW50cl90aW1lcl9jdHJsICE9IG5ld19pbnRyX3RpbWVyX2N0cmwpIHsKKwkJCW5wLT5pbnRyX3RpbWVyX2N0cmwgPSBuZXdfaW50cl90aW1lcl9jdHJsOworCQkJd3JpdGVsKG5ld19pbnRyX3RpbWVyX2N0cmwsIGlvYWRkciArIEludHJUaW1lckN0cmwpOworCQl9CisJfSBlbHNlIHsKKwkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBMaW5rIGlzIGRvd25cbiIsIGRldi0+bmFtZSk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIG5ldGRldl9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW50cl9zdGF0dXMpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBDYW1lIGNsb3NlIHRvIHVuZGVycnVubmluZyB0aGUgVHggRklGTywgaW5jcmVhc2UgdGhyZXNob2xkLiAqLworCWlmIChpbnRyX3N0YXR1cyAmIEludHJUeERhdGFMb3cpIHsKKwkJaWYgKG5wLT50eF90aHJlc2hvbGQgPD0gUEtUX0JVRl9TWiAvIDE2KSB7CisJCQl3cml0ZWwoKytucC0+dHhfdGhyZXNob2xkLCBucC0+YmFzZSArIFR4VGhyZXNob2xkKTsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFBDSSBidXMgY29uZ2VzdGlvbiwgaW5jcmVhc2luZyBUeCBGSUZPIHRocmVzaG9sZCB0byAlZCBieXRlc1xuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIG5wLT50eF90aHJlc2hvbGQgKiAxNik7CisJCX0gZWxzZQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFBDSSBUeCB1bmRlcmZsb3cgLS0gYWRhcHRlciBpcyBwcm9iYWJseSBtYWxmdW5jdGlvbmluZ1xuIiwgZGV2LT5uYW1lKTsKKwl9CisJaWYgKGludHJfc3RhdHVzICYgSW50clJ4R0ZQRGVhZCkgeworCQlucC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOworCX0KKwlpZiAoaW50cl9zdGF0dXMgJiAoSW50ck5vVHhDc3VtIHwgSW50ckRNQUVycikpIHsKKwkJbnAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCW5wLT5zdGF0cy50eF9lcnJvcnMrKzsKKwl9CisJaWYgKChpbnRyX3N0YXR1cyAmIH4oSW50ck5vcm1hbE1hc2sgfCBJbnRyQWJub3JtYWxTdW1tYXJ5IHwgSW50ckxpbmtDaGFuZ2UgfCBJbnRyU3RhdHNNYXggfCBJbnRyVHhEYXRhTG93IHwgSW50clJ4R0ZQRGVhZCB8IEludHJOb1R4Q3N1bSB8IEludHJQQ0lQYWQpKSAmJiBkZWJ1ZykKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogU29tZXRoaW5nIFdpY2tlZCBoYXBwZW5lZCEgJSM4Ljh4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgaW50cl9zdGF0dXMpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZTsKKworCS8qIFRoaXMgYWRhcHRlciBhcmNoaXRlY3R1cmUgbmVlZHMgbm8gU01QIGxvY2tzLiAqLworCW5wLT5zdGF0cy50eF9ieXRlcyA9IHJlYWRsKGlvYWRkciArIDB4NTcwMTApOworCW5wLT5zdGF0cy5yeF9ieXRlcyA9IHJlYWRsKGlvYWRkciArIDB4NTcwNDQpOworCW5wLT5zdGF0cy50eF9wYWNrZXRzID0gcmVhZGwoaW9hZGRyICsgMHg1NzAwMCk7CisJbnAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzID0KKwkJcmVhZGwoaW9hZGRyICsgMHg1NzAyNCkgKyByZWFkbChpb2FkZHIgKyAweDU3MDI4KTsKKwlucC0+c3RhdHMudHhfd2luZG93X2Vycm9ycyA9IHJlYWRsKGlvYWRkciArIDB4NTcwMTgpOworCW5wLT5zdGF0cy5jb2xsaXNpb25zID0KKwkJcmVhZGwoaW9hZGRyICsgMHg1NzAwNCkgKyByZWFkbChpb2FkZHIgKyAweDU3MDA4KTsKKworCS8qIFRoZSBjaGlwIG9ubHkgbmVlZCByZXBvcnQgZnJhbWUgc2lsZW50bHkgZHJvcHBlZC4gKi8KKwlucC0+c3RhdHMucnhfZHJvcHBlZCArPSByZWFkdyhpb2FkZHIgKyBSeERNQVN0YXR1cyk7CisJd3JpdGV3KDAsIGlvYWRkciArIFJ4RE1BU3RhdHVzKTsKKwlucC0+c3RhdHMucnhfY3JjX2Vycm9ycyA9IHJlYWRsKGlvYWRkciArIDB4NTcwM0MpOworCW5wLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgPSByZWFkbChpb2FkZHIgKyAweDU3MDQwKTsKKwlucC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9IHJlYWRsKGlvYWRkciArIDB4NTcwNTgpOworCW5wLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gcmVhZGwoaW9hZGRyICsgMHg1NzA3Qyk7CisKKwlyZXR1cm4gJm5wLT5zdGF0czsKK30KKworCisvKiBDaGlwcyBtYXkgdXNlIHRoZSB1cHBlciBvciBsb3dlciBDUkMgYml0cywgYW5kIG1heSByZXZlcnNlIGFuZC9vciBpbnZlcnQKKyAgIHRoZW0uICBTZWxlY3QgdGhlIGVuZGlhbi1uZXNzIHRoYXQgcmVzdWx0cyBpbiBtaW5pbWFsIGNhbGN1bGF0aW9ucy4KKyovCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2U7CisJdTMyIHJ4X21vZGUgPSBNaW5WTEFOUHJpbzsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwlpbnQgaTsKKyNpZmRlZiBWTEFOX1NVUFBPUlQKKworCXJ4X21vZGUgfD0gVmxhbk1vZGU7CisJaWYgKG5wLT52bGdycCkgeworCQlpbnQgdmxhbl9jb3VudCA9IDA7CisJCXZvaWQgX19pb21lbSAqZmlsdGVyX2FkZHIgPSBpb2FkZHIgKyBIYXNoVGFibGUgKyA4OworCQlmb3IgKGkgPSAwOyBpIDwgVkxBTl9WSURfTUFTSzsgaSsrKSB7CisJCQlpZiAobnAtPnZsZ3JwLT52bGFuX2RldmljZXNbaV0pIHsKKwkJCQlpZiAodmxhbl9jb3VudCA+PSAzMikKKwkJCQkJYnJlYWs7CisJCQkJd3JpdGV3KGNwdV90b19iZTE2KGkpLCBmaWx0ZXJfYWRkcik7CisJCQkJZmlsdGVyX2FkZHIgKz0gMTY7CisJCQkJdmxhbl9jb3VudCsrOworCQkJfQorCQl9CisJCWlmIChpID09IFZMQU5fVklEX01BU0spIHsKKwkJCXJ4X21vZGUgfD0gUGVyZmVjdEZpbHRlclZsYW47CisJCQl3aGlsZSAodmxhbl9jb3VudCA8IDMyKSB7CisJCQkJd3JpdGV3KDAsIGZpbHRlcl9hZGRyKTsKKwkJCQlmaWx0ZXJfYWRkciArPSAxNjsKKwkJCQl2bGFuX2NvdW50Kys7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLyogVkxBTl9TVVBQT1JUICovCisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CS8qIFNldCBwcm9taXNjdW91cy4gKi8KKwkJcnhfbW9kZSB8PSBBY2NlcHRBbGw7CisJfSBlbHNlIGlmICgoZGV2LT5tY19jb3VudCA+IG11bHRpY2FzdF9maWx0ZXJfbGltaXQpCisJCSAgIHx8IChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQkvKiBUb28gbWFueSB0byBtYXRjaCwgb3IgYWNjZXB0IGFsbCBtdWx0aWNhc3RzLiAqLworCQlyeF9tb2RlIHw9IEFjY2VwdEJyb2FkY2FzdHxBY2NlcHRBbGxNdWx0aWNhc3R8UGVyZmVjdEZpbHRlcjsKKwl9IGVsc2UgaWYgKGRldi0+bWNfY291bnQgPD0gMTQpIHsKKwkJLyogVXNlIHRoZSAxNiBlbGVtZW50IHBlcmZlY3QgZmlsdGVyLCBza2lwIGZpcnN0IHR3byBlbnRyaWVzLiAqLworCQl2b2lkIF9faW9tZW0gKmZpbHRlcl9hZGRyID0gaW9hZGRyICsgUGVyZkZpbHRlclRhYmxlICsgMiAqIDE2OworCQl1MTYgKmVhZGRyczsKKwkJZm9yIChpID0gMiwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBtY2xpc3QgJiYgaSA8IGRldi0+bWNfY291bnQgKyAyOworCQkgICAgIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQllYWRkcnMgPSAodTE2ICopbWNsaXN0LT5kbWlfYWRkcjsKKwkJCXdyaXRldyhjcHVfdG9fYmUxNihlYWRkcnNbMl0pLCBmaWx0ZXJfYWRkcik7IGZpbHRlcl9hZGRyICs9IDQ7CisJCQl3cml0ZXcoY3B1X3RvX2JlMTYoZWFkZHJzWzFdKSwgZmlsdGVyX2FkZHIpOyBmaWx0ZXJfYWRkciArPSA0OworCQkJd3JpdGV3KGNwdV90b19iZTE2KGVhZGRyc1swXSksIGZpbHRlcl9hZGRyKTsgZmlsdGVyX2FkZHIgKz0gODsKKwkJfQorCQllYWRkcnMgPSAodTE2ICopZGV2LT5kZXZfYWRkcjsKKwkJd2hpbGUgKGkrKyA8IDE2KSB7CisJCQl3cml0ZXcoY3B1X3RvX2JlMTYoZWFkZHJzWzBdKSwgZmlsdGVyX2FkZHIpOyBmaWx0ZXJfYWRkciArPSA0OworCQkJd3JpdGV3KGNwdV90b19iZTE2KGVhZGRyc1sxXSksIGZpbHRlcl9hZGRyKTsgZmlsdGVyX2FkZHIgKz0gNDsKKwkJCXdyaXRldyhjcHVfdG9fYmUxNihlYWRkcnNbMl0pLCBmaWx0ZXJfYWRkcik7IGZpbHRlcl9hZGRyICs9IDg7CisJCX0KKwkJcnhfbW9kZSB8PSBBY2NlcHRCcm9hZGNhc3R8UGVyZmVjdEZpbHRlcjsKKwl9IGVsc2UgeworCQkvKiBNdXN0IHVzZSBhIG11bHRpY2FzdCBoYXNoIHRhYmxlLiAqLworCQl2b2lkIF9faW9tZW0gKmZpbHRlcl9hZGRyOworCQl1MTYgKmVhZGRyczsKKwkJdTE2IG1jX2ZpbHRlclszMl0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoc2l6ZW9mKGxvbmcpKSkpOwkvKiBNdWx0aWNhc3QgaGFzaCBmaWx0ZXIgKi8KKworCQltZW1zZXQobWNfZmlsdGVyLCAwLCBzaXplb2YobWNfZmlsdGVyKSk7CisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCQkgICAgIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQlpbnQgYml0X25yID0gZXRoZXJfY3JjX2xlKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKSA+PiAyMzsKKwkJCV9fdTMyICpmcHRyID0gKF9fdTMyICopICZtY19maWx0ZXJbKGJpdF9uciA+PiA0KSAmIH4xXTsKKworCQkJKmZwdHIgfD0gY3B1X3RvX2xlMzIoMSA8PCAoYml0X25yICYgMzEpKTsKKwkJfQorCQkvKiBDbGVhciB0aGUgcGVyZmVjdCBmaWx0ZXIgbGlzdCwgc2tpcCBmaXJzdCB0d28gZW50cmllcy4gKi8KKwkJZmlsdGVyX2FkZHIgPSBpb2FkZHIgKyBQZXJmRmlsdGVyVGFibGUgKyAyICogMTY7CisJCWVhZGRycyA9ICh1MTYgKilkZXYtPmRldl9hZGRyOworCQlmb3IgKGkgPSAyOyBpIDwgMTY7IGkrKykgeworCQkJd3JpdGV3KGNwdV90b19iZTE2KGVhZGRyc1swXSksIGZpbHRlcl9hZGRyKTsgZmlsdGVyX2FkZHIgKz0gNDsKKwkJCXdyaXRldyhjcHVfdG9fYmUxNihlYWRkcnNbMV0pLCBmaWx0ZXJfYWRkcik7IGZpbHRlcl9hZGRyICs9IDQ7CisJCQl3cml0ZXcoY3B1X3RvX2JlMTYoZWFkZHJzWzJdKSwgZmlsdGVyX2FkZHIpOyBmaWx0ZXJfYWRkciArPSA4OworCQl9CisJCWZvciAoZmlsdGVyX2FkZHIgPSBpb2FkZHIgKyBIYXNoVGFibGUsIGkgPSAwOyBpIDwgMzI7IGZpbHRlcl9hZGRyKz0gMTYsIGkrKykKKwkJCXdyaXRldyhtY19maWx0ZXJbaV0sIGZpbHRlcl9hZGRyKTsKKwkJcnhfbW9kZSB8PSBBY2NlcHRCcm9hZGNhc3R8UGVyZmVjdEZpbHRlcnxIYXNoRmlsdGVyOworCX0KKwl3cml0ZWwocnhfbW9kZSwgaW9hZGRyICsgUnhGaWx0ZXJNb2RlKTsKK30KKworc3RhdGljIGludCBjaGVja19pZl9ydW5uaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgUENJX1NMT1RfTkFNRShucC0+cGNpX2RldikpOworfQorCitzdGF0aWMgaW50IGdldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCW1paV9ldGh0b29sX2dzZXQoJm5wLT5taWlfaWYsIGVjbWQpOworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJlczsKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJcmVzID0gbWlpX2V0aHRvb2xfc3NldCgmbnAtPm1paV9pZiwgZWNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJY2hlY2tfZHVwbGV4KGRldik7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIG1paV9ud2F5X3Jlc3RhcnQoJm5wLT5taWlfaWYpOworfQorCitzdGF0aWMgdTMyIGdldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIG1paV9saW5rX29rKCZucC0+bWlpX2lmKTsKK30KKworc3RhdGljIHUzMiBnZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGVidWc7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdmFsKQoreworCWRlYnVnID0gdmFsOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzID0geworCS5iZWdpbiA9IGNoZWNrX2lmX3J1bm5pbmcsCisJLmdldF9kcnZpbmZvID0gZ2V0X2RydmluZm8sCisJLmdldF9zZXR0aW5ncyA9IGdldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzID0gc2V0X3NldHRpbmdzLAorCS5ud2F5X3Jlc2V0ID0gbndheV9yZXNldCwKKwkuZ2V0X2xpbmsgPSBnZXRfbGluaywKKwkuZ2V0X21zZ2xldmVsID0gZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwgPSBzZXRfbXNnbGV2ZWwsCit9OworCitzdGF0aWMgaW50IG5ldGRldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShycSk7CisJaW50IHJjOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCXJjID0gZ2VuZXJpY19taWlfaW9jdGwoJm5wLT5taWlfaWYsIGRhdGEsIGNtZCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwlpZiAoKGNtZCA9PSBTSU9DU01JSVJFRykgJiYgKGRhdGEtPnBoeV9pZCA9PSBucC0+cGh5c1swXSkpCisJCWNoZWNrX2R1cGxleChkZXYpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG5ldGRldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2U7CisJaW50IGk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJbmV0aWZfc3RvcF9pZihkZXYpOworCisJaWYgKGRlYnVnID4gMSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLCBJbnRyIHN0YXR1cyAlIzguOHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCAoaW50KSByZWFkbChpb2FkZHIgKyBJbnRyU3RhdHVzKSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUXVldWUgcG9pbnRlcnMgd2VyZSBUeCAlZCAvICVkLCBSeCAlZCAvICVkLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbnAtPmN1cl90eCwgbnAtPmRpcnR5X3R4LAorCQkgICAgICAgbnAtPmN1cl9yeCwgbnAtPmRpcnR5X3J4KTsKKwl9CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYnkgY2xlYXJpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCXdyaXRlbCgwLCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKworCS8qIFN0b3AgdGhlIGNoaXAncyBUeCBhbmQgUnggcHJvY2Vzc2VzLiAqLworCXdyaXRlbCgwLCBpb2FkZHIgKyBHZW5DdHJsKTsKKwlyZWFkbChpb2FkZHIgKyBHZW5DdHJsKTsKKworCWlmIChkZWJ1ZyA+IDUpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUciICBUeCByaW5nIGF0ICUjbGx4OlxuIiwKKwkJICAgICAgIChsb25nIGxvbmcpIG5wLT50eF9yaW5nX2RtYSk7CisJCWZvciAoaSA9IDA7IGkgPCA4IC8qIFRYX1JJTkdfU0laRSBpcyBodWdlISAqLzsgaSsrKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAjJWQgZGVzYy4gJSM4Ljh4ICUjbGx4IC0+ICUjOC44eC5cbiIsCisJCQkgICAgICAgaSwgbGUzMl90b19jcHUobnAtPnR4X3JpbmdbaV0uc3RhdHVzKSwKKwkJCSAgICAgICAobG9uZyBsb25nKSBkbWFfdG9fY3B1KG5wLT50eF9yaW5nW2ldLmFkZHIpLAorCQkJICAgICAgIGxlMzJfdG9fY3B1KG5wLT50eF9kb25lX3FbaV0uc3RhdHVzKSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIgIFJ4IHJpbmcgYXQgJSNsbHggLT4gJXA6XG4iLAorCQkgICAgICAgKGxvbmcgbG9uZykgbnAtPnJ4X3JpbmdfZG1hLCBucC0+cnhfZG9uZV9xKTsKKwkJaWYgKG5wLT5yeF9kb25lX3EpCisJCQlmb3IgKGkgPSAwOyBpIDwgOCAvKiBSWF9SSU5HX1NJWkUgKi87IGkrKykgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICIgIyVkIGRlc2MuICUjbGx4IC0+ICUjOC44eFxuIiwKKwkJCQkgICAgICAgaSwgKGxvbmcgbG9uZykgZG1hX3RvX2NwdShucC0+cnhfcmluZ1tpXS5yeGFkZHIpLCBsZTMyX3RvX2NwdShucC0+cnhfZG9uZV9xW2ldLnN0YXR1cykpOworCQl9CisJfQorCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwkvKiBGcmVlIGFsbCB0aGUgc2tidWZmcyBpbiB0aGUgUnggcXVldWUuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCW5wLT5yeF9yaW5nW2ldLnJ4YWRkciA9IGNwdV90b19kbWEoMHhCQURGMDBEMCk7IC8qIEFuIGludmFsaWQgYWRkcmVzcy4gKi8KKwkJaWYgKG5wLT5yeF9pbmZvW2ldLnNrYiAhPSBOVUxMKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBucC0+cnhfaW5mb1tpXS5tYXBwaW5nLCBucC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihucC0+cnhfaW5mb1tpXS5za2IpOworCQl9CisJCW5wLT5yeF9pbmZvW2ldLnNrYiA9IE5VTEw7CisJCW5wLT5yeF9pbmZvW2ldLm1hcHBpbmcgPSAwOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IG5wLT50eF9pbmZvW2ldLnNrYjsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJY29udGludWU7CisJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsCisJCQkJIG5wLT50eF9pbmZvW2ldLm1hcHBpbmcsCisJCQkJIHNrYl9maXJzdF9mcmFnX2xlbihza2IpLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJbnAtPnR4X2luZm9baV0ubWFwcGluZyA9IDA7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJbnAtPnR4X2luZm9baV0uc2tiID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc3RhcmZpcmVfcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghZGV2KQorCQlCVUcoKTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwlpZiAobnAtPnF1ZXVlX21lbSkKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBucC0+cXVldWVfbWVtX3NpemUsIG5wLT5xdWV1ZV9tZW0sIG5wLT5xdWV1ZV9tZW1fZG1hKTsKKworCisJLyogWFhYOiBhZGQgd2FrZXVwIGNvZGUgLS0gcmVxdWlyZXMgZmlybXdhcmUgZm9yIE1hZ2ljUGFja2V0ICovCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDNob3QpOwkvKiBnbyB0byBzbGVlcCBpbiBEMyBtb2RlICovCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJaW91bm1hcChucC0+YmFzZSk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX25ldGRldihkZXYpOwkJCS8qIFdpbGwgYWxzbyBmcmVlIG5wISEgKi8KK30KKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc3RhcmZpcmVfZHJpdmVyID0geworCS5uYW1lCQk9IERSVl9OQU1FLAorCS5wcm9iZQkJPSBzdGFyZmlyZV9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHN0YXJmaXJlX3JlbW92ZV9vbmUpLAorCS5pZF90YWJsZQk9IHN0YXJmaXJlX3BjaV90YmwsCit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IHN0YXJmaXJlX2luaXQgKHZvaWQpCit7CisvKiB3aGVuIGEgbW9kdWxlLCB0aGlzIGlzIHByaW50ZWQgd2hldGhlciBvciBub3QgZGV2aWNlcyBhcmUgZm91bmQgaW4gcHJvYmUgKi8KKyNpZmRlZiBNT0RVTEUKKwlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKyNpZm5kZWYgQUREUl82NEJJVFMKKwkvKiB3ZSBjYW4gZG8gdGhpcyB0ZXN0IG9ubHkgYXQgcnVuLXRpbWUuLi4gc2lnaCAqLworCWlmIChzaXplb2YoZG1hX2FkZHJfdCkgPT0gc2l6ZW9mKHU2NCkpIHsKKwkJcHJpbnRrKCJUaGlzIGRyaXZlciBoYXMgbm90IGJlZW4gcG9ydGVkIHRvIHRoaXMgNjQtYml0IGFyY2hpdGVjdHVyZSB5ZXRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisjZW5kaWYgLyogbm90IEFERFJfNjRCSVRTICovCisjaWZuZGVmIEhBU19GSVJNV0FSRQorCS8qIHVuY29uZGl0aW9uYWxseSBkaXNhYmxlIGh3IGNrc3VtcyBpZiBmaXJtd2FyZSBpcyBub3QgcHJlc2VudCAqLworCWVuYWJsZV9od19ja3N1bSA9IDA7CisjZW5kaWYgLyogbm90IEhBU19GSVJNV0FSRSAqLworCXJldHVybiBwY2lfbW9kdWxlX2luaXQgKCZzdGFyZmlyZV9kcml2ZXIpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzdGFyZmlyZV9jbGVhbnVwICh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJnN0YXJmaXJlX2RyaXZlcik7Cit9CisKKworbW9kdWxlX2luaXQoc3RhcmZpcmVfaW5pdCk7Cittb2R1bGVfZXhpdChzdGFyZmlyZV9jbGVhbnVwKTsKKworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N0YXJmaXJlX2Zpcm13YXJlLnBsIGIvZHJpdmVycy9uZXQvc3RhcmZpcmVfZmlybXdhcmUucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM4MmI4MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3N0YXJmaXJlX2Zpcm13YXJlLnBsCkBAIC0wLDAgKzEsMzEgQEAKKyMhL3Vzci9iaW4vcGVybAorCisjIFRoaXMgc2NyaXB0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IHN0YXJmaXJlX2Zpcm13YXJlLmgKKyMgZnJvbSBHRlBfUlguREFUIGFuZCBHRlBfVFguREFULCBmaWxlcyBpbmNsdWRlZCB3aXRoIHRoZSBEREsKKyMgYW5kIGFsc28gd2l0aCB0aGUgTm92ZWxsIGRyaXZlcnMuCisKK29wZW4gRlcsICJHRlBfUlguREFUIiB8fCBkaWU7CitvcGVuIEZXSCwgIj5zdGFyZmlyZV9maXJtd2FyZS5oIiB8fCBkaWU7CisKK3ByaW50ZihGV0ggInN0YXRpYyB1MzIgZmlybXdhcmVfcnhbXSA9IHtcbiIpOworJGNvdW50ZXIgPSAwOword2hpbGUgKCRmb28gPSA8Rlc+KSB7CisgIGNob21wOworICBwcmludGYoRldIICIgIDB4JXMsIDB4MDAwMCVzLFxuIiwgc3Vic3RyKCRmb28sIDQsIDgpLCBzdWJzdHIoJGZvbywgMCwgNCkpOworICAkY291bnRlcisrOworfQorCitjbG9zZSBGVzsKK29wZW4gRlcsICJHRlBfVFguREFUIiB8fCBkaWU7CisKK3ByaW50ZihGV0ggIn07XHQvKiAlZCBSeCBpbnN0cnVjdGlvbnMgKi9cbiNkZWZpbmUgRklSTVdBUkVfUlhfU0laRSAlZFxuXG5zdGF0aWMgdTMyIGZpcm13YXJlX3R4W10gPSB7XG4iLCAkY291bnRlciwgJGNvdW50ZXIpOworJGNvdW50ZXIgPSAwOword2hpbGUgKCRmb28gPSA8Rlc+KSB7CisgIGNob21wOworICBwcmludGYoRldIICIgIDB4JXMsIDB4MDAwMCVzLFxuIiwgc3Vic3RyKCRmb28sIDQsIDgpLCBzdWJzdHIoJGZvbywgMCwgNCkpOworICAkY291bnRlcisrOworfQorCitjbG9zZSBGVzsKK3ByaW50ZihGV0ggIn07XHQvKiAlZCBUeCBpbnN0cnVjdGlvbnMgKi9cbiNkZWZpbmUgRklSTVdBUkVfVFhfU0laRSAlZFxuIiwgJGNvdW50ZXIsICRjb3VudGVyKTsKK2Nsb3NlKEZXSCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdG5pYy5jIGIvZHJpdmVycy9uZXQvc3RuaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmRmZGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3RuaWMuYwpAQCAtMCwwICsxLDMyMCBAQAorLyogc3RuaWMuYyA6IEEgU0g3NzUwIHNwZWNpZmljIHBhcnQgb2YgZHJpdmVyIGZvciBOUyBEUDgzOTAyQSBTVC1OSUMuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IGtheiBLb2ppbWEKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zZS9zZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CisjaWZkZWYgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgCisjaW5jbHVkZSA8YXNtL3NoX2Jpb3MuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiODM5MC5oIgorCisjZGVmaW5lIERSVl9OQU1FICJzdG5pYyIKKworI2RlZmluZSBieXRlCXVuc2lnbmVkIGNoYXIKKyNkZWZpbmUgaGFsZgl1bnNpZ25lZCBzaG9ydAorI2RlZmluZSB3b3JkCXVuc2lnbmVkIGludAorI2RlZmluZSB2Ynl0ZQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCisjZGVmaW5lIHZoYWxmCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0CisjZGVmaW5lIHZ3b3JkCXZvbGF0aWxlIHVuc2lnbmVkIGludAorCisjZGVmaW5lIFNUTklDX1JVTgkweDAxCS8qIDEgPT0gUnVuLCAwID09IHJlc2V0LiAqLworCisjZGVmaW5lIFNUQVJUX1BHCTAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKyNkZWZpbmUgU1RPUF9QRwkJMTI4CS8qIExhc3QgcGFnZSArMSBvZiBSWCByaW5nICovCisKKy8qIEFsaWFzICovCisjZGVmaW5lIFNUTklDX0NSCUU4MzkwX0NNRAorI2RlZmluZSBQRzBfUlNBUjAJRU4wX1JTQVJMTworI2RlZmluZSBQRzBfUlNBUjEJRU4wX1JTQVJISQorI2RlZmluZSBQRzBfUkJDUjAJRU4wX1JDTlRMTworI2RlZmluZSBQRzBfUkJDUjEJRU4wX1JDTlRISQorCisjZGVmaW5lIENSX1JSRAkJRTgzOTBfUlJFQUQKKyNkZWZpbmUgQ1JfUldSCQlFODM5MF9SV1JJVEUKKyNkZWZpbmUgQ1JfUEcwCQlFODM5MF9QQUdFMAorI2RlZmluZSBDUl9TVEEJCUU4MzkwX1NUQVJUCisjZGVmaW5lIENSX1JETUEJCUU4MzkwX05PRE1BCisKKy8qIEZJWE1FISBZT1UgTVVTVCBTRVQgWU9VUiBPV04gRVRIRVIgQUREUkVTUy4gICovCitzdGF0aWMgYnl0ZSBzdG5pY19lYWRyWzZdID0KK3sweDAwLCAweGMwLCAweDZlLCAweDAwLCAweDAwLCAweDA3fTsKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpzdG5pY19kZXY7CisKK3N0YXRpYyBpbnQgc3RuaWNfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHN0bmljX2Nsb3NlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHN0bmljX3Jlc2V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHN0bmljX2dldF9oZHIgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsCisJCQkgICBpbnQgcmluZ19wYWdlKTsKK3N0YXRpYyB2b2lkIHN0bmljX2Jsb2NrX2lucHV0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiAsIGludCByaW5nX29mZnNldCk7CitzdGF0aWMgdm9pZCBzdG5pY19ibG9ja19vdXRwdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydF9wYWdlKTsKKworc3RhdGljIHZvaWQgc3RuaWNfaW5pdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIFNINzc1MCBzcGVjaWZpYyByZWFkL3dyaXRlIGlvLiAqLworc3RhdGljIGlubGluZSB2b2lkCitTVE5JQ19ERUxBWSAodm9pZCkKK3sKKyAgdndvcmQgdHJhc2g7CisgIHRyYXNoID0gKih2d29yZCAqKSAweGEwMDAwMDAwOworICB0cmFzaCA9ICoodndvcmQgKikgMHhhMDAwMDAwMDsKKyAgdHJhc2ggPSAqKHZ3b3JkICopIDB4YTAwMDAwMDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgYnl0ZQorU1ROSUNfUkVBRCAoaW50IHJlZykKK3sKKyAgYnl0ZSB2YWw7CisKKyAgdmFsID0gKCoodmhhbGYgKikgKFBBXzgzOTAyICsgKChyZWcpIDw8IDEpKSA+PiA4KSAmIDB4ZmY7CisgIFNUTklDX0RFTEFZICgpOworICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK1NUTklDX1dSSVRFIChpbnQgcmVnLCBieXRlIHZhbCkKK3sKKyAgKih2aGFsZiAqKSAoUEFfODM5MDIgKyAoKHJlZykgPDwgMSkpID0gKChoYWxmKSAodmFsKSA8PCA4KTsKKyAgU1ROSUNfREVMQVkgKCk7Cit9CisMCitzdGF0aWMgaW50IF9faW5pdCBzdG5pY19wcm9iZSh2b2lkKQoreworICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworICBpbnQgaSwgZXJyOworCisgIC8qIElmIHdlIGFyZSBub3QgcnVubmluZyBvbiBhIFNvbHV0aW9uRW5naW5lLCBnaXZlIHVwIG5vdyAqLworICBpZiAoISBNQUNIX1NFKQorICAgIHJldHVybiAtRU5PREVWOworCisgIC8qIE5ldyBzdHlsZSBwcm9iaW5nIEFQSSAqLworICBkZXYgPSBhbGxvY19laV9uZXRkZXYoKTsKKyAgaWYgKCFkZXYpCisgIAlyZXR1cm4gLUVOT01FTTsKKyAgU0VUX01PRFVMRV9PV05FUihkZXYpOworCisjaWZkZWYgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgCisgIHNoX2Jpb3NfZ2V0X25vZGVfYWRkciAoc3RuaWNfZWFkcik7CisjZW5kaWYKKyAgZm9yIChpID0gMDsgaSA8IEVUSEVSX0FERFJfTEVOOyBpKyspCisgICAgZGV2LT5kZXZfYWRkcltpXSA9IHN0bmljX2VhZHJbaV07CisKKyAgLyogU2V0IHRoZSBiYXNlIGFkZHJlc3MgdG8gcG9pbnQgdG8gdGhlIE5JQywgbm90IHRoZSAicmVhbCIgYmFzZSEgKi8KKyAgZGV2LT5iYXNlX2FkZHIgPSAweDEwMDA7CisgIGRldi0+aXJxID0gSVJRX1NUTklDOworICBkZXYtPm9wZW4gPSAmc3RuaWNfb3BlbjsKKyAgZGV2LT5zdG9wID0gJnN0bmljX2Nsb3NlOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisgIGRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKKyNlbmRpZgorCisgIC8qIFNuYXJmIHRoZSBpbnRlcnJ1cHQgbm93LiAgVGhlcmUncyBubyBwb2ludCBpbiB3YWl0aW5nIHNpbmNlIHdlIGNhbm5vdAorICAgICBzaGFyZSBhbmQgdGhlIGJvYXJkIHdpbGwgdXN1YWxseSBiZSBlbmFibGVkLiAqLworICBlcnIgPSByZXF1ZXN0X2lycSAoZGV2LT5pcnEsIGVpX2ludGVycnVwdCwgMCwgRFJWX05BTUUsIGRldik7CisgIGlmIChlcnIpICB7CisgICAgICBwcmludGsgKEtFUk5fRU1FUkcgIiB1bmFibGUgdG8gZ2V0IElSUSAlZC5cbiIsIGRldi0+aXJxKTsKKyAgICAgIGZyZWVfbmV0ZGV2KGRldik7CisgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICBlaV9zdGF0dXMubmFtZSA9IGRldi0+bmFtZTsKKyAgZWlfc3RhdHVzLndvcmQxNiA9IDE7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18gCisgIGVpX3N0YXR1cy5iaWdlbmRpYW4gPSAwOworI2Vsc2UKKyAgZWlfc3RhdHVzLmJpZ2VuZGlhbiA9IDE7CisjZW5kaWYKKyAgZWlfc3RhdHVzLnR4X3N0YXJ0X3BhZ2UgPSBTVEFSVF9QRzsKKyAgZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPSBTVEFSVF9QRyArIFRYX1BBR0VTOworICBlaV9zdGF0dXMuc3RvcF9wYWdlID0gU1RPUF9QRzsKKworICBlaV9zdGF0dXMucmVzZXRfODM5MCA9ICZzdG5pY19yZXNldDsKKyAgZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZzdG5pY19nZXRfaGRyOworICBlaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmc3RuaWNfYmxvY2tfaW5wdXQ7CisgIGVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmc3RuaWNfYmxvY2tfb3V0cHV0OworCisgIHN0bmljX2luaXQgKGRldik7CisKKyAgZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisgIGlmIChlcnIpIHsKKyAgICBmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKyAgICBmcmVlX25ldGRldihkZXYpOworICAgIHJldHVybiBlcnI7CisgIH0KKyAgc3RuaWNfZGV2ID0gZGV2OworCisgIHByaW50ayAoS0VSTl9JTkZPICJOUyBTVC1OSUMgODM5MDJBXG4iKTsKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc3RuaWNfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZiAwCisgIHByaW50ayAoS0VSTl9ERUJVRyAic3RuaWMgb3BlblxuIik7CisjZW5kaWYKKyAgZWlfb3BlbiAoZGV2KTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3N0bmljX2Nsb3NlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICBlaV9jbG9zZSAoZGV2KTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitzdG5pY19yZXNldCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgKih2aGFsZiAqKSBQQV84MzkwMl9SU1QgPSAwOworICB1ZGVsYXkgKDUpOworICBpZiAoZWlfZGVidWcgPiAxKQorICAgIHByaW50ayAoS0VSTl9XQVJOSU5HICI4MzkwIHJlc2V0IGRvbmUgKCVsZCkuXG4iLCBqaWZmaWVzKTsKKyAgKih2aGFsZiAqKSBQQV84MzkwMl9SU1QgPSB+MDsKKyAgdWRlbGF5ICg1KTsKK30KKworc3RhdGljIHZvaWQKK3N0bmljX2dldF9oZHIgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBlODM5MF9wa3RfaGRyICpoZHIsCisJICAgICAgIGludCByaW5nX3BhZ2UpCit7CisgIGhhbGYgYnVmWzJdOworCisgIFNUTklDX1dSSVRFIChQRzBfUlNBUjAsIDApOworICBTVE5JQ19XUklURSAoUEcwX1JTQVIxLCByaW5nX3BhZ2UpOworICBTVE5JQ19XUklURSAoUEcwX1JCQ1IwLCA0KTsKKyAgU1ROSUNfV1JJVEUgKFBHMF9SQkNSMSwgMCk7CisgIFNUTklDX1dSSVRFIChTVE5JQ19DUiwgQ1JfUlJEIHwgQ1JfUEcwIHwgQ1JfU1RBKTsKKworICBidWZbMF0gPSAqKHZoYWxmICopIFBBXzgzOTAyX0lGOworICBTVE5JQ19ERUxBWSAoKTsKKyAgYnVmWzFdID0gKih2aGFsZiAqKSBQQV84MzkwMl9JRjsKKyAgU1ROSUNfREVMQVkgKCk7CisgIGhkci0+bmV4dCA9IGJ1ZlswXSA+PiA4OworICBoZHItPnN0YXR1cyA9IGJ1ZlswXSAmIDB4ZmY7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgaGRyLT5jb3VudCA9IGJ1ZlsxXTsKKyNlbHNlCisgIGhkci0+Y291bnQgPSAoKGJ1ZlsxXSA+PiA4KSAmIDB4ZmYpIHwgKGJ1ZlsxXSA8PCA4KTsKKyNlbmRpZgorCisgIGlmIChlaV9kZWJ1ZyA+IDEpCisgICAgcHJpbnRrIChLRVJOX0RFQlVHICJyaW5nICV4IHN0YXR1cyAlMDJ4IG5leHQgJTAyeCBjb3VudCAlMDR4LlxuIiwKKwkgICAgcmluZ19wYWdlLCBoZHItPnN0YXR1cywgaGRyLT5uZXh0LCBoZHItPmNvdW50KTsKKworICBTVE5JQ19XUklURSAoU1ROSUNfQ1IsIENSX1JETUEgfCBDUl9QRzAgfCBDUl9TVEEpOworfQorCisvKiBCbG9jayBpbnB1dCBhbmQgb3V0cHV0LCBzaW1pbGFyIHRvIHRoZSBDcnlud3IgcGFja2V0IGRyaXZlci4gSWYgeW91IGFyZQorICAgcG9ydGluZyB0byBhIG5ldyBldGhlcmNhcmQgbG9vayBhdCB0aGUgcGFja2V0IGRyaXZlciBzb3VyY2UgZm9yIGhpbnRzLgorICAgVGhlIEhQIExBTiBkb2Vzbid0IHVzZSBzaGFyZWQgbWVtb3J5IC0tIHdlIHB1dCB0aGUgcGFja2V0CisgICBvdXQgdGhyb3VnaCB0aGUgInJlbW90ZSBETUEiIGRhdGFwb3J0LiAqLworCitzdGF0aWMgdm9pZAorc3RuaWNfYmxvY2tfaW5wdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBsZW5ndGgsIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgIGludCBvZmZzZXQpCit7CisgIGNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKKyAgaGFsZiB2YWw7CisKKyAgU1ROSUNfV1JJVEUgKFBHMF9SU0FSMCwgb2Zmc2V0ICYgMHhmZik7CisgIFNUTklDX1dSSVRFIChQRzBfUlNBUjEsIG9mZnNldCA+PiA4KTsKKyAgU1ROSUNfV1JJVEUgKFBHMF9SQkNSMCwgbGVuZ3RoICYgMHhmZik7CisgIFNUTklDX1dSSVRFIChQRzBfUkJDUjEsIGxlbmd0aCA+PiA4KTsKKyAgU1ROSUNfV1JJVEUgKFNUTklDX0NSLCBDUl9SUkQgfCBDUl9QRzAgfCBDUl9TVEEpOworCisgIGlmIChsZW5ndGggJiAxKQorICAgIGxlbmd0aCsrOworCisgIHdoaWxlIChsZW5ndGggPiAwKQorICAgIHsKKyAgICAgIHZhbCA9ICoodmhhbGYgKikgUEFfODM5MDJfSUY7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKyAgICAgICpidWYrKyA9IHZhbCAmIDB4ZmY7CisgICAgICAqYnVmKysgPSB2YWwgPj4gODsKKyNlbHNlCisgICAgICAqYnVmKysgPSB2YWwgPj4gODsKKyAgICAgICpidWYrKyA9IHZhbCAmIDB4ZmY7CisjZW5kaWYKKyAgICAgIFNUTklDX0RFTEFZICgpOworICAgICAgbGVuZ3RoIC09IHNpemVvZiAoaGFsZik7CisgICAgfQorCisgIFNUTklDX1dSSVRFIChTVE5JQ19DUiwgQ1JfUkRNQSB8IENSX1BHMCB8IENSX1NUQSk7Cit9CisKK3N0YXRpYyB2b2lkCitzdG5pY19ibG9ja19vdXRwdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBsZW5ndGgsCisJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBvdXRwdXRfcGFnZSkKK3sKKyAgU1ROSUNfV1JJVEUgKFBHMF9SQkNSMCwgMSk7CS8qIFdyaXRlIG5vbi16ZXJvIHZhbHVlICovCisgIFNUTklDX1dSSVRFIChTVE5JQ19DUiwgQ1JfUlJEIHwgQ1JfUEcwIHwgQ1JfU1RBKTsKKyAgU1ROSUNfREVMQVkgKCk7CisKKyAgU1ROSUNfV1JJVEUgKFBHMF9SQkNSMCwgbGVuZ3RoICYgMHhmZik7CisgIFNUTklDX1dSSVRFIChQRzBfUkJDUjEsIGxlbmd0aCA+PiA4KTsKKyAgU1ROSUNfV1JJVEUgKFBHMF9SU0FSMCwgMCk7CisgIFNUTklDX1dSSVRFIChQRzBfUlNBUjEsIG91dHB1dF9wYWdlKTsKKyAgU1ROSUNfV1JJVEUgKFNUTklDX0NSLCBDUl9SV1IgfCBDUl9QRzAgfCBDUl9TVEEpOworCisgIGlmIChsZW5ndGggJiAxKQorICAgIGxlbmd0aCsrOworCisgIHdoaWxlIChsZW5ndGggPiAwKQorICAgIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworICAgICAgKih2aGFsZiAqKSBQQV84MzkwMl9JRiA9ICgoaGFsZikgYnVmWzFdIDw8IDgpIHwgYnVmWzBdOworI2Vsc2UKKyAgICAgICoodmhhbGYgKikgUEFfODM5MDJfSUYgPSAoKGhhbGYpIGJ1ZlswXSA8PCA4KSB8IGJ1ZlsxXTsKKyNlbmRpZgorICAgICAgU1ROSUNfREVMQVkgKCk7CisgICAgICBidWYgKz0gc2l6ZW9mIChoYWxmKTsKKyAgICAgIGxlbmd0aCAtPSBzaXplb2YgKGhhbGYpOworICAgIH0KKworICBTVE5JQ19XUklURSAoU1ROSUNfQ1IsIENSX1JETUEgfCBDUl9QRzAgfCBDUl9TVEEpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgU1ROSUMgaWYgc29tZXRoaW5nIHNjcmV3cyB1cC4gICovCitzdGF0aWMgdm9pZAorc3RuaWNfaW5pdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgc3RuaWNfcmVzZXQgKGRldik7CisgIE5TODM5MF9pbml0IChkZXYsIDApOworICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzdG5pY19jbGVhbnVwKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9uZXRkZXYoc3RuaWNfZGV2KTsKKwlmcmVlX2lycShzdG5pY19kZXYtPmlycSwgc3RuaWNfZGV2KTsKKwlmcmVlX25ldGRldihzdG5pY19kZXYpOworfQorCittb2R1bGVfaW5pdChzdG5pY19wcm9iZSk7Cittb2R1bGVfZXhpdChzdG5pY19jbGVhbnVwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bjNfODI1ODYuYyBiL2RyaXZlcnMvbmV0L3N1bjNfODI1ODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWE1OGZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3VuM184MjU4Ni5jCkBAIC0wLDAgKzEsMTIxMSBAQAorLyoKKyAqIFN1bjMgaTgyNTg2IEV0aGVybmV0IGRyaXZlcgorICoKKyAqIENsb25lZCBmcm9tIG5pNTIuYyBmb3IgdGhlIFN1bjMgYnkgU2FtIENyZWFzZXkgKHNhbW15QHNhbW15Lm5ldCkKKyAqCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgZm9sbG93czoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogbmV0LTMtZHJpdmVyIGZvciB0aGUgTkk1MjEwIGNhcmQgKGk4MjU4NiBFdGhlcm5ldCBjaGlwKQorICoKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBMaW51eCBvcGVyYXRpbmcgc3lzdGVtLCBhbmQgaXMgY292ZXJlZCBieSB0aGUKKyAqIHNhbWUgR251IFB1YmxpYyBMaWNlbnNlIHRoYXQgY292ZXJzIHRoYXQgd29yay4KKyAqCisgKiBBbHBoYWNvZGUgMC44MiAoOTYvMDkvMjkpIGZvciBMaW51eCAyLjAuMCAob3IgbGF0ZXIpCisgKiBDb3B5cmlnaHRzIChjKSAxOTk0LDE5OTUsMTk5NiBieSBNLkhpcHAgKGhpcHBtQGluZm9ybWF0aWsudW5pLXR1ZWJpbmdlbi5kZSkKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAKKyAqIENvbnN1bHQgbmk1Mi5jIGZvciBmdXJ0aGVyIG5vdGVzIGZyb20gdGhlIG9yaWdpbmFsIGRyaXZlci4KKyAqCisgKiBUaGlzIGluY2FybmF0aW9uIGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgT0JJTyB2ZXJzaW9uIG9mIHRoZSBpODI1ODYgY2hpcCAKKyAqIHVzZWQgaW4gY2VydGFpbiBzdW4zIG1vZGVscy4gIEl0IHNob3VsZCBiZSBmYWlybHkgZG9hYmxlIHRvIGV4cGFuZCB0aGlzCisgKiB0byBzdXBwb3J0IFZNRSBpZiBJIHNob3VsZCBldmVyeSBhY3F1aXJlIHN1Y2ggYSBib2FyZC4KKyAqCisgKi8KKworc3RhdGljIGludCBkZWJ1Z2xldmVsID0gMDsgLyogZGVidWctcHJpbnRrIDA6IG9mZiAxOiBhIGZldyAyOiBtb3JlICovCitzdGF0aWMgaW50IGF1dG9tYXRpY19yZXN1bWUgPSAwOyAvKiBleHBlcmltZW50YWwgLi4gYmV0dGVyIHNob3VsZCBiZSB6ZXJvICovCitzdGF0aWMgaW50IHJmZGFkZCA9IDA7IC8qIHJmZGFkZD0xIG1heSBiZSBiZXR0ZXIgZm9yIDhLIE1FTSBjYXJkcyAqLworc3RhdGljIGludCBmaWZvPTB4ODsJLyogZG9uJ3QgY2hhbmdlICovCisKKy8qICNkZWZpbmUgUkVBTExZX1NMT1dfSU8gKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pZHByb20uaD4KKyNpbmNsdWRlIDxhc20vbWFjaGluZXMuaD4KKyNpbmNsdWRlIDxhc20vc3VuM21tdS5oPgorI2luY2x1ZGUgPGFzbS9kdm1hLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgInN1bjNfODI1ODYuaCIKKworI2RlZmluZSBEUlZfTkFNRSAic3VuM184MjU4NiIKKworI2RlZmluZSBERUJVRyAgICAgICAvKiBkZWJ1ZyBvbiAqLworI2RlZmluZSBTWVNCVVNWQUwgMCAvKiAxNiBCaXQgKi8KKyNkZWZpbmUgU1VOM184MjU4Nl9UT1RBTF9TSVpFCVBBR0VfU0laRQorCisjZGVmaW5lIHN1bjNfYXR0bjU4NigpICB7Kih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKGRldi0+YmFzZV9hZGRyKSB8PSBJRU9CX0FUVEVOOyAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoZGV2LT5iYXNlX2FkZHIpICY9IH5JRU9CX0FUVEVOO30KKyNkZWZpbmUgc3VuM19yZXNldDU4NigpIHsqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoZGV2LT5iYXNlX2FkZHIpID0gMDsgdWRlbGF5KDEwMCk7ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShkZXYtPmJhc2VfYWRkcikgPSBJRU9CX05PUlNFVDt9CisjZGVmaW5lIHN1bjNfZGlzaW50KCkgICB7Kih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKGRldi0+YmFzZV9hZGRyKSAmPSB+SUVPQl9JRU5BQjt9CisjZGVmaW5lIHN1bjNfZW5haW50KCkgICB7Kih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKGRldi0+YmFzZV9hZGRyKSB8PSBJRU9CX0lFTkFCO30KKyNkZWZpbmUgc3VuM19hY3RpdmUoKSAgIHsqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoZGV2LT5iYXNlX2FkZHIpIHw9IChJRU9CX0lFTkFCfElFT0JfT05BSVJ8SUVPQl9OT1JTRVQpO30KKworI2RlZmluZSBtYWtlMzIocHRyMTYpIChwLT5tZW10b3AgKyAoc3dhYjE2KCh1bnNpZ25lZCBzaG9ydCkgKHB0cjE2KSkpICkKKyNkZWZpbmUgbWFrZTI0KHB0cjMyKSAoY2hhciAqKXN3YWIzMigoICgodW5zaWduZWQgbG9uZykgKHB0cjMyKSkgLSBwLT5iYXNlKSkKKyNkZWZpbmUgbWFrZTE2KHB0cjMyKSAoc3dhYjE2KCh1bnNpZ25lZCBzaG9ydCkgKCh1bnNpZ25lZCBsb25nKShwdHIzMikgLSAodW5zaWduZWQgbG9uZykgcC0+bWVtdG9wICkpKQorCisvKioqKioqKioqKioqKioqKioqKiBob3cgdG8gY2FsY3VsYXRlIHRoZSBidWZmZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgKiBJTVBPUlRBTlQgTk9URTogaWYgeW91IGNvbmZpZ3VyZSBvbmx5IG9uZSBOVU1fWE1JVF9CVUZGUywgdGhlIGRyaXZlciB3b3JrcworICAqIC0tLS0tLS0tLS0tLS0tLSBpbiBhIGRpZmZlcmVudCAobW9yZSBzdGFibGU/KSBtb2RlLiBPbmx5IGluIHRoaXMgbW9kZSBpdCdzCisgICogICAgICAgICAgICAgICAgIHBvc3NpYmxlIHRvIGNvbmZpZ3VyZSB0aGUgZHJpdmVyIHdpdGggJ05PX05PUENPTU1BTkRTJworCitzaXplb2Yoc2NwKT0xMjsgc2l6ZW9mKHNjYik9MTY7IHNpemVvZihpc2NwKT04Oworc2l6ZW9mKHNjcCkrc2l6ZW9mKGlzY3ApK3NpemVvZihzY2IpID0gMzYgPSBJTklUCitzaXplb2YocmZkKSA9IDI0OyBzaXplb2YocmJkKSA9IDEyOworc2l6ZW9mKHRiZCkgPSA4OyBzaXplb2YodHJhbnNtaXRfY21kKSA9IDE2Oworc2l6ZW9mKG5vcF9jbWQpID0gODsKKworICAqIGlmIHlvdSBkb24ndCBrbm93IHRoZSBkcml2ZXIsIGJldHRlciBkbyBub3QgY2hhbmdlIHRoZXNlIHZhbHVlczogKi8KKworI2RlZmluZSBSRUNWX0JVRkZfU0laRSAxNTM2IC8qIHNsaWdodGx5IG92ZXJzaXplZCAqLworI2RlZmluZSBYTUlUX0JVRkZfU0laRSAxNTM2IC8qIHNsaWdodGx5IG92ZXJzaXplZCAqLworI2RlZmluZSBOVU1fWE1JVF9CVUZGUyAxICAgIC8qIGNvbmZpZyBmb3IgMzJLIHNobWVtICovCisjZGVmaW5lIE5VTV9SRUNWX0JVRkZTXzggNCAvKiBjb25maWcgZm9yIDMySyBzaGFyZWQgbWVtICovCisjZGVmaW5lIE5VTV9SRUNWX0JVRkZTXzE2IDkgLyogY29uZmlnIGZvciAzMksgc2hhcmVkIG1lbSAqLworI2RlZmluZSBOVU1fUkVDVl9CVUZGU18zMiAxNiAvKiBjb25maWcgZm9yIDMySyBzaGFyZWQgbWVtICovCisjZGVmaW5lIE5PX05PUENPTU1BTkRTICAgICAgLyogb25seSBwb3NzaWJsZSB3aXRoIE5VTV9YTUlUX0JVRkZTPTEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkaWZmZXJlbnQgREVMQVlzICovCisjZGVmaW5lIERFTEFZKHgpIG1kZWxheSgzMiAqIHgpOworI2RlZmluZSBERUxBWV8xNigpOyB7IHVkZWxheSgxNik7IH0KKyNkZWZpbmUgREVMQVlfMTgoKTsgeyB1ZGVsYXkoNCk7IH0KKworLyogd2FpdCBmb3IgY29tbWFuZCB3aXRoIHRpbWVvdXQ6ICovCisjZGVmaW5lIFdBSVRfNF9TQ0JfQ01EKCkgXAoreyBpbnQgaTsgXAorICBmb3IoaT0wO2k8MTYzODQ7aSsrKSB7IFwKKyAgICBpZighcC0+c2NiLT5jbWRfY3VjKSBicmVhazsgXAorICAgIERFTEFZXzE4KCk7IFwKKyAgICBpZihpID09IDE2MzgzKSB7IFwKKyAgICAgIHByaW50aygiJXM6IHNjYl9jbWQgdGltZWQgb3V0OiAlMDR4LCUwNHggLi4gZGlzYWJsaW5nIGk4MjU4NiEhXG4iLGRldi0+bmFtZSxwLT5zY2ItPmNtZF9jdWMscC0+c2NiLT5jdXMpOyBcCisgICAgICAgaWYoIXAtPnJlc2V0ZWQpIHsgcC0+cmVzZXRlZCA9IDE7IHN1bjNfcmVzZXQ1ODYoKTsgfSB9IH0gfQorCisjZGVmaW5lIFdBSVRfNF9TQ0JfQ01EX1JVQygpIHsgaW50IGk7IFwKKyAgZm9yKGk9MDtpPDE2Mzg0O2krKykgeyBcCisgICAgaWYoIXAtPnNjYi0+Y21kX3J1YykgYnJlYWs7IFwKKyAgICBERUxBWV8xOCgpOyBcCisgICAgaWYoaSA9PSAxNjM4MykgeyBcCisgICAgICBwcmludGsoIiVzOiBzY2JfY21kIChydWMpIHRpbWVkIG91dDogJTA0eCwlMDR4IC4uIGRpc2FibGluZyBpODI1ODYhIVxuIixkZXYtPm5hbWUscC0+c2NiLT5jbWRfcnVjLHAtPnNjYi0+cnVzKTsgXAorICAgICAgIGlmKCFwLT5yZXNldGVkKSB7IHAtPnJlc2V0ZWQgPSAxOyBzdW4zX3Jlc2V0NTg2KCk7IH0gfSB9IH0KKworI2RlZmluZSBXQUlUXzRfU1RBVF9DT01QTChhZGRyKSB7IGludCBpOyBcCisgICBmb3IoaT0wO2k8MzI3Njc7aSsrKSB7IFwKKyAgICAgaWYoc3dhYjE2KChhZGRyKS0+Y21kX3N0YXR1cykgJiBTVEFUX0NPTVBMKSBicmVhazsgXAorICAgICBERUxBWV8xNigpOyBERUxBWV8xNigpOyB9IH0KKworc3RhdGljIGludCAgICAgc3VuM184MjU4Nl9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldixpbnQgaW9hZGRyKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBzdW4zXzgyNTg2X2ludGVycnVwdChpbnQgaXJxLHZvaWQgKmRldl9pZCxzdHJ1Y3QgcHRfcmVncyAqcmVnX3B0cik7CitzdGF0aWMgaW50ICAgICBzdW4zXzgyNTg2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBzdW4zXzgyNTg2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgc3VuM184MjU4Nl9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqLHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHN0cnVjdCAgbmV0X2RldmljZV9zdGF0cyAqc3VuM184MjU4Nl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBzdW4zXzgyNTg2X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjaWYgMAorc3RhdGljIHZvaWQgICAgc3VuM184MjU4Nl9kdW1wKHN0cnVjdCBuZXRfZGV2aWNlICosdm9pZCAqKTsKKyNlbmRpZgorCisvKiBoZWxwZXItZnVuY3Rpb25zICovCitzdGF0aWMgaW50ICAgICBpbml0NTg2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgY2hlY2s1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldixjaGFyICp3aGVyZSx1bnNpZ25lZCBzaXplKTsKK3N0YXRpYyB2b2lkICAgIGFsbG9jNTg2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgc3RhcnRyZWN2NTg2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAqYWxsb2NfcmZhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdm9pZCAqcHRyKTsKK3N0YXRpYyB2b2lkICAgIHN1bjNfODI1ODZfcmN2X2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIHN1bjNfODI1ODZfeG10X2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIHN1bjNfODI1ODZfcm5yX2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RydWN0IHByaXYKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisJY2hhciAqbWVtdG9wOworCWxvbmcgaW50IGxvY2s7CisJaW50IHJlc2V0ZWQ7CisJdm9sYXRpbGUgc3RydWN0IHJmZF9zdHJ1Y3QJKnJmZF9sYXN0LCpyZmRfdG9wLCpyZmRfZmlyc3Q7CisJdm9sYXRpbGUgc3RydWN0IHNjcF9zdHJ1Y3QJKnNjcDsJLyogdm9sYXRpbGUgaXMgaW1wb3J0YW50ICovCisJdm9sYXRpbGUgc3RydWN0IGlzY3Bfc3RydWN0CSppc2NwOwkvKiB2b2xhdGlsZSBpcyBpbXBvcnRhbnQgKi8KKwl2b2xhdGlsZSBzdHJ1Y3Qgc2NiX3N0cnVjdAkqc2NiOwkvKiB2b2xhdGlsZSBpcyBpbXBvcnRhbnQgKi8KKwl2b2xhdGlsZSBzdHJ1Y3QgdGJkX3N0cnVjdAkqeG1pdF9idWZmc1tOVU1fWE1JVF9CVUZGU107CisJdm9sYXRpbGUgc3RydWN0IHRyYW5zbWl0X2NtZF9zdHJ1Y3QgKnhtaXRfY21kc1tOVU1fWE1JVF9CVUZGU107CisjaWYgKE5VTV9YTUlUX0JVRkZTID09IDEpCisJdm9sYXRpbGUgc3RydWN0IG5vcF9jbWRfc3RydWN0ICpub3BfY21kc1syXTsKKyNlbHNlCisJdm9sYXRpbGUgc3RydWN0IG5vcF9jbWRfc3RydWN0ICpub3BfY21kc1tOVU1fWE1JVF9CVUZGU107CisjZW5kaWYKKwl2b2xhdGlsZSBpbnQJCW5vcF9wb2ludCxudW1fcmVjdl9idWZmczsKKwl2b2xhdGlsZSBjaGFyCQkqeG1pdF9jYnVmZnNbTlVNX1hNSVRfQlVGRlNdOworCXZvbGF0aWxlIGludAkJeG1pdF9jb3VudCx4bWl0X2xhc3Q7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2xvc2UgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgc3VuM184MjU4Nl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJc3VuM19yZXNldDU4NigpOyAvKiB0aGUgaGFyZCB3YXkgdG8gc3RvcCB0aGUgcmVjZWl2ZXIgKi8KKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogb3BlbiBkZXZpY2UKKyAqLworc3RhdGljIGludCBzdW4zXzgyNTg2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCisJc3VuM19kaXNpbnQoKTsKKwlhbGxvYzU4NihkZXYpOworCWluaXQ1ODYoZGV2KTsKKwlzdGFydHJlY3Y1ODYoZGV2KTsKKwlzdW4zX2VuYWludCgpOworCisJcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZzdW4zXzgyNTg2X2ludGVycnVwdCwwLGRldi0+bmFtZSxkZXYpOworCWlmIChyZXQpCisJeworCQlzdW4zX3Jlc2V0NTg2KCk7CisJCXJldHVybiByZXQ7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOyAvKiBtb3N0IGRvbmUgYnkgaW5pdCAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlJ3MgYW4gODI1ODYgb3V0IHRoZXJlLgorICovCitzdGF0aWMgaW50IGNoZWNrNTg2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsY2hhciAqd2hlcmUsdW5zaWduZWQgc2l6ZSkKK3sKKwlzdHJ1Y3QgcHJpdiBwYjsKKwlzdHJ1Y3QgcHJpdiAqcCA9IC8qIChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXYqLyAmcGI7CisJY2hhciAqaXNjcF9hZGRyOworCWludCBpOworCisJcC0+YmFzZSA9ICh1bnNpZ25lZCBsb25nKSBkdm1hX2J0b3YoMCk7CisJcC0+bWVtdG9wID0gKGNoYXIgKilkdm1hX2J0b3YoKHVuc2lnbmVkIGxvbmcpd2hlcmUpOworCXAtPnNjcCA9IChzdHJ1Y3Qgc2NwX3N0cnVjdCAqKShwLT5iYXNlICsgU0NQX0RFRkFVTFRfQUREUkVTUyk7CisJbWVtc2V0KChjaGFyICopcC0+c2NwLDAsIHNpemVvZihzdHJ1Y3Qgc2NwX3N0cnVjdCkpOworCWZvcihpPTA7aTxzaXplb2Yoc3RydWN0IHNjcF9zdHJ1Y3QpO2krKykgLyogbWVtb3J5IHdhcyB3cml0ZWFibGU/ICovCisJCWlmKCgoY2hhciAqKXAtPnNjcClbaV0pCisJCQlyZXR1cm4gMDsKKwlwLT5zY3AtPnN5c2J1cyA9IFNZU0JVU1ZBTDsJCQkJLyogMSA9IDhCaXQtQnVzLCAwID0gMTYgQml0ICovCisJaWYocC0+c2NwLT5zeXNidXMgIT0gU1lTQlVTVkFMKQorCQlyZXR1cm4gMDsKKworCWlzY3BfYWRkciA9IChjaGFyICopZHZtYV9idG92KCh1bnNpZ25lZCBsb25nKXdoZXJlKTsKKwkKKwlwLT5pc2NwID0gKHN0cnVjdCBpc2NwX3N0cnVjdCAqKSBpc2NwX2FkZHI7CisJbWVtc2V0KChjaGFyICopcC0+aXNjcCwwLCBzaXplb2Yoc3RydWN0IGlzY3Bfc3RydWN0KSk7CisKKwlwLT5zY3AtPmlzY3AgPSBtYWtlMjQocC0+aXNjcCk7CisJcC0+aXNjcC0+YnVzeSA9IDE7CisKKwlzdW4zX3Jlc2V0NTg2KCk7CisJc3VuM19hdHRuNTg2KCk7CisJREVMQVkoMSk7CS8qIHdhaXQgYSB3aGlsZS4uLiAqLworCQorCWlmKHAtPmlzY3AtPmJ1c3kpIC8qIGk4MjU4NiBjbGVhcnMgJ2J1c3knIGFmdGVyIHN1Y2Nlc3NmdWwgaW5pdCAqLworCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzZXQgaXNjcCBhdCB0aGUgcmlnaHQgcGxhY2UsIGNhbGxlZCBieSBzdW4zXzgyNTg2X3Byb2JlMSBhbmQgb3BlbjU4Ni4KKyAqLworc3RhdGljIHZvaWQgYWxsb2M1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHJpdiAqcCA9CShzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwlzdW4zX3Jlc2V0NTg2KCk7CisJREVMQVkoMSk7CisKKwlwLT5zY3AJPSAoc3RydWN0IHNjcF9zdHJ1Y3QgKikJKHAtPmJhc2UgKyBTQ1BfREVGQVVMVF9BRERSRVNTKTsKKwlwLT5pc2NwCT0gKHN0cnVjdCBpc2NwX3N0cnVjdCAqKSBkdm1hX2J0b3YoZGV2LT5tZW1fc3RhcnQpOworCXAtPnNjYiAgPSAoc3RydWN0IHNjYl9zdHJ1Y3QgKikgICgoY2hhciAqKXAtPmlzY3AgKyBzaXplb2Yoc3RydWN0IGlzY3Bfc3RydWN0KSk7CisKKwltZW1zZXQoKGNoYXIgKikgcC0+aXNjcCwwLHNpemVvZihzdHJ1Y3QgaXNjcF9zdHJ1Y3QpKTsKKwltZW1zZXQoKGNoYXIgKikgcC0+c2NwICwwLHNpemVvZihzdHJ1Y3Qgc2NwX3N0cnVjdCkpOworCisJcC0+c2NwLT5pc2NwID0gbWFrZTI0KHAtPmlzY3ApOworCXAtPnNjcC0+c3lzYnVzID0gU1lTQlVTVkFMOworCXAtPmlzY3AtPnNjYl9vZmZzZXQgPSBtYWtlMTYocC0+c2NiKTsKKwlwLT5pc2NwLT5zY2JfYmFzZSA9IG1ha2UyNChkdm1hX2J0b3YoZGV2LT5tZW1fc3RhcnQpKTsKKworCXAtPmlzY3AtPmJ1c3kgPSAxOworCXN1bjNfcmVzZXQ1ODYoKTsKKwlzdW4zX2F0dG41ODYoKTsKKworCURFTEFZKDEpOworCisJaWYocC0+aXNjcC0+YnVzeSkKKwkJcHJpbnRrKCIlczogSW5pdC1Qcm9ibGVtcyAoYWxsb2MpLlxuIixkZXYtPm5hbWUpOworCisJcC0+cmVzZXRlZCA9IDA7CisKKwltZW1zZXQoKGNoYXIgKilwLT5zY2IsMCxzaXplb2Yoc3RydWN0IHNjYl9zdHJ1Y3QpKTsKK30KKworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgc3VuM184MjU4Nl9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXVuc2lnbmVkIGxvbmcgaW9hZGRyOworCXN0YXRpYyBpbnQgZm91bmQgPSAwOworCWludCBlcnIgPSAtRU5PTUVNOworCQorCS8qIGNoZWNrIHRoYXQgdGhpcyBtYWNoaW5lIGhhcyBhbiBvbmJvYXJkIDgyNTg2ICovCisJc3dpdGNoKGlkcHJvbS0+aWRfbWFjaHR5cGUpIHsKKwljYXNlIFNNX1NVTjN8U01fM18xNjA6CisJY2FzZSBTTV9TVU4zfFNNXzNfMjYwOgorCQkvKiB0aGVzZSBtYWNoaW5lcyBoYXZlIDgyNTg2ICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisJfQorCisJaWYgKGZvdW5kKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKwkKKwlpb2FkZHIgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwKElFX09CSU8sIFNVTjNfODI1ODZfVE9UQUxfU0laRSk7CisJaWYgKCFpb2FkZHIpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWZvdW5kID0gMTsKKwkKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHByaXYpKTsKKwlpZiAoIWRldikKKwkJZ290byBvdXQ7CisJaWYgKHVuaXQgPj0gMCkgeworCQlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisJfQorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWRldi0+aXJxID0gSUVfSVJROworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCWVyciA9IHN1bjNfODI1ODZfcHJvYmUxKGRldiwgaW9hZGRyKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQyOworCXJldHVybiBkZXY7CisKK291dDI6CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBTVU4zXzgyNTg2X1RPVEFMX1NJWkUpOworb3V0MToKKwlmcmVlX25ldGRldihkZXYpOworb3V0OgorCWlvdW5tYXAoKHZvaWQgKilpb2FkZHIpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHN1bjNfODI1ODZfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsaW50IGlvYWRkcikKK3sKKwlpbnQgaSwgc2l6ZSwgcmV0dmFsOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIFNVTjNfODI1ODZfVE9UQUxfU0laRSwgRFJWX05BTUUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogY29weSBpbiB0aGUgZXRoZXJuZXQgYWRkcmVzcyBmcm9tIHRoZSBwcm9tICovCisJZm9yKGkgPSAwOyBpIDwgNiA7IGkrKykKKwkgICAgIGRldi0+ZGV2X2FkZHJbaV0gPSBpZHByb20tPmlkX2V0aGFkZHJbaV07CisKKwlwcmludGsoIiVzOiBTVU4zIEludGVsIDgyNTg2IGZvdW5kIGF0ICVseCwgIixkZXYtPm5hbWUsZGV2LT5iYXNlX2FkZHIpOworCisJLyoKKwkgKiBjaGVjayAob3Igc2VhcmNoKSBJTy1NZW1vcnksIDMySworCSAqLworCXNpemUgPSAweDgwMDA7CisKKwlkZXYtPm1lbV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKWR2bWFfbWFsbG9jX2FsaWduKDB4ODAwMCwgMHgxMDAwKTsKKwlkZXYtPm1lbV9lbmQgPSBkZXYtPm1lbV9zdGFydCArIHNpemU7CisKKwlpZihzaXplICE9IDB4MjAwMCAmJiBzaXplICE9IDB4NDAwMCAmJiBzaXplICE9IDB4ODAwMCkgeworCQlwcmludGsoIlxuJXM6IElsbGVnYWwgbWVtb3J5IHNpemUgJWQuIEFsbG93ZWQgaXMgMHgyMDAwIG9yIDB4NDAwMCBvciAweDgwMDAgYnl0ZXMuXG4iLGRldi0+bmFtZSxzaXplKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCWlmKCFjaGVjazU4NihkZXYsKGNoYXIgKikgZGV2LT5tZW1fc3RhcnQsc2l6ZSkpIHsKKwkJcHJpbnRrKCI/bWVtY2hlY2ssIENhbid0IGZpbmQgbWVtb3J5IGF0IDB4JWx4IHdpdGggc2l6ZSAlZCFcbiIsZGV2LT5tZW1fc3RhcnQsc2l6ZSk7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCSgoc3RydWN0IHByaXYgKikgKGRldi0+cHJpdikpLT5tZW10b3AgPSAoY2hhciAqKWR2bWFfYnRvdihkZXYtPm1lbV9zdGFydCk7CisJKChzdHJ1Y3QgcHJpdiAqKSAoZGV2LT5wcml2KSktPmJhc2UgPSAodW5zaWduZWQgbG9uZykgZHZtYV9idG92KDApOworCWFsbG9jNTg2KGRldik7CisKKwkvKiBzZXQgbnVtYmVyIG9mIHJlY2VpdmUtYnVmZnMgYWNjb3JkaW5nIHRvIG1lbXNpemUgKi8KKwlpZihzaXplID09IDB4MjAwMCkKKwkJKChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXYpLT5udW1fcmVjdl9idWZmcyA9IE5VTV9SRUNWX0JVRkZTXzg7CisJZWxzZSBpZihzaXplID09IDB4NDAwMCkKKwkJKChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXYpLT5udW1fcmVjdl9idWZmcyA9IE5VTV9SRUNWX0JVRkZTXzE2OworCWVsc2UKKwkJKChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXYpLT5udW1fcmVjdl9idWZmcyA9IE5VTV9SRUNWX0JVRkZTXzMyOworCisJcHJpbnRrKCJNZW1hZGRyOiAweCVseCwgTWVtc2l6ZTogJWQsIElSUSAlZFxuIixkZXYtPm1lbV9zdGFydCxzaXplLCBkZXYtPmlycSk7CisJCisJZGV2LT5vcGVuCQk9IHN1bjNfODI1ODZfb3BlbjsKKwlkZXYtPnN0b3AJCT0gc3VuM184MjU4Nl9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cwkJPSBzdW4zXzgyNTg2X2dldF9zdGF0czsKKwlkZXYtPnR4X3RpbWVvdXQgCT0gc3VuM184MjU4Nl90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBIWi8yMDsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCAJPSBzdW4zXzgyNTg2X3NlbmRfcGFja2V0OworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gc2V0X211bHRpY2FzdF9saXN0OworCisJZGV2LT5pZl9wb3J0IAkJPSAwOworCXJldHVybiAwOworb3V0OgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgU1VOM184MjU4Nl9UT1RBTF9TSVpFKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisKK3N0YXRpYyBpbnQgaW5pdDU4NihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXZvaWQgKnB0cjsKKwlpbnQgaSxyZXN1bHQ9MDsKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisJdm9sYXRpbGUgc3RydWN0IGNvbmZpZ3VyZV9jbWRfc3RydWN0CSpjZmdfY21kOworCXZvbGF0aWxlIHN0cnVjdCBpYXNldHVwX2NtZF9zdHJ1Y3QgKmlhc19jbWQ7CisJdm9sYXRpbGUgc3RydWN0IHRkcl9jbWRfc3RydWN0ICp0ZHJfY21kOworCXZvbGF0aWxlIHN0cnVjdCBtY3NldHVwX2NtZF9zdHJ1Y3QgKm1jX2NtZDsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaT1kZXYtPm1jX2xpc3Q7CisJaW50IG51bV9hZGRycz1kZXYtPm1jX2NvdW50OworCisJcHRyID0gKHZvaWQgKikgKChjaGFyICopcC0+c2NiICsgc2l6ZW9mKHN0cnVjdCBzY2Jfc3RydWN0KSk7CisKKwljZmdfY21kID0gKHN0cnVjdCBjb25maWd1cmVfY21kX3N0cnVjdCAqKXB0cjsgLyogY29uZmlndXJlLWNvbW1hbmQgKi8KKwljZmdfY21kLT5jbWRfc3RhdHVzCT0gMDsKKwljZmdfY21kLT5jbWRfY21kCT0gc3dhYjE2KENNRF9DT05GSUdVUkUgfCBDTURfTEFTVCk7CisJY2ZnX2NtZC0+Y21kX2xpbmsJPSAweGZmZmY7CisKKwljZmdfY21kLT5ieXRlX2NudAk9IDB4MGE7IC8qIG51bWJlciBvZiBjZmcgYnl0ZXMgKi8KKwljZmdfY21kLT5maWZvCQk9IGZpZm87IC8qIGZpZm8tbGltaXQgKDg9dHg6MzIvcng6NjQpICovCisJY2ZnX2NtZC0+c2F2X2JmCQk9IDB4NDA7IC8qIGhvbGQgb3IgZGlzY2FyZCBiYWQgcmVjdiBmcmFtZXMgKGJpdCA3KSAqLworCWNmZ19jbWQtPmFkcl9sZW4JPSAweDJlOyAvKiBhZGRyX2xlbiB8IXNyY19pbnNlcnQgfHByZS1sZW4gfGxvb3BiYWNrICovCisJY2ZnX2NtZC0+cHJpb3JpdHkJPSAweDAwOworCWNmZ19jbWQtPmlmcwkJPSAweDYwOworCWNmZ19jbWQtPnRpbWVfbG93CT0gMHgwMDsKKwljZmdfY21kLT50aW1lX2hpZ2gJPSAweGYyOworCWNmZ19jbWQtPnByb21pc2MJPSAwOworCWlmKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwkJaW50IGxlbiA9ICgoY2hhciAqKSBwLT5pc2NwIC0gKGNoYXIgKikgcHRyIC0gOCkgLyA2OworCQlpZihudW1fYWRkcnMgPiBsZW4pCXsKKwkJCXByaW50aygiJXM6IHN3aXRjaGluZyB0byBwcm9taXNjLiBtb2RlXG4iLGRldi0+bmFtZSk7CisJCQlkZXYtPmZsYWdzfD1JRkZfUFJPTUlTQzsKKwkJfQorCX0KKwlpZihkZXYtPmZsYWdzJklGRl9QUk9NSVNDKQorCXsKKwkJCSBjZmdfY21kLT5wcm9taXNjPTE7CisJCQkgZGV2LT5mbGFnc3w9SUZGX1BST01JU0M7CisJfQorCWNmZ19jbWQtPmNhcnJfY29sbAk9IDB4MDA7CisKKwlwLT5zY2ItPmNibF9vZmZzZXQJPSBtYWtlMTYoY2ZnX2NtZCk7CisJcC0+c2NiLT5jbWRfcnVjCQk9IDA7CisKKwlwLT5zY2ItPmNtZF9jdWMJCT0gQ1VDX1NUQVJUOyAvKiBjbWQuLXVuaXQgc3RhcnQgKi8KKwlzdW4zX2F0dG41ODYoKTsKKworCVdBSVRfNF9TVEFUX0NPTVBMKGNmZ19jbWQpOworCisJaWYoKHN3YWIxNihjZmdfY21kLT5jbWRfc3RhdHVzKSAmIChTVEFUX09LfFNUQVRfQ09NUEwpKSAhPSAoU1RBVF9DT01QTHxTVEFUX09LKSkKKwl7CisJCXByaW50aygiJXM6IGNvbmZpZ3VyZSBjb21tYW5kIGZhaWxlZDogJXhcbiIsZGV2LT5uYW1lLHN3YWIxNihjZmdfY21kLT5jbWRfc3RhdHVzKSk7CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogaW5kaXZpZHVhbCBhZGRyZXNzIHNldHVwCisJICovCisKKwlpYXNfY21kID0gKHN0cnVjdCBpYXNldHVwX2NtZF9zdHJ1Y3QgKilwdHI7CisKKwlpYXNfY21kLT5jbWRfc3RhdHVzCT0gMDsKKwlpYXNfY21kLT5jbWRfY21kCT0gc3dhYjE2KENNRF9JQVNFVFVQIHwgQ01EX0xBU1QpOworCWlhc19jbWQtPmNtZF9saW5rCT0gMHhmZmZmOworCisJbWVtY3B5KChjaGFyICopJmlhc19jbWQtPmlhZGRyLChjaGFyICopIGRldi0+ZGV2X2FkZHIsRVRIX0FMRU4pOworCisJcC0+c2NiLT5jYmxfb2Zmc2V0ID0gbWFrZTE2KGlhc19jbWQpOworCisJcC0+c2NiLT5jbWRfY3VjID0gQ1VDX1NUQVJUOyAvKiBjbWQuLXVuaXQgc3RhcnQgKi8KKwlzdW4zX2F0dG41ODYoKTsKKworCVdBSVRfNF9TVEFUX0NPTVBMKGlhc19jbWQpOworCisJaWYoKHN3YWIxNihpYXNfY21kLT5jbWRfc3RhdHVzKSAmIChTVEFUX09LfFNUQVRfQ09NUEwpKSAhPSAoU1RBVF9PS3xTVEFUX0NPTVBMKSkgeworCQlwcmludGsoIiVzICg4MjU4Nik6IGluZGl2aWR1YWwgYWRkcmVzcyBzZXR1cCBjb21tYW5kIGZhaWxlZDogJTA0eFxuIixkZXYtPm5hbWUsc3dhYjE2KGlhc19jbWQtPmNtZF9zdGF0dXMpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiBURFIsIHdpcmUgY2hlY2sgLi4gZS5nLiBubyByZXNpc3RvciBlLnQuYworCSAqLworCSAKKwl0ZHJfY21kID0gKHN0cnVjdCB0ZHJfY21kX3N0cnVjdCAqKXB0cjsKKworCXRkcl9jbWQtPmNtZF9zdGF0dXMJPSAwOworCXRkcl9jbWQtPmNtZF9jbWQJPSBzd2FiMTYoQ01EX1REUiB8IENNRF9MQVNUKTsKKwl0ZHJfY21kLT5jbWRfbGluawk9IDB4ZmZmZjsKKwl0ZHJfY21kLT5zdGF0dXMJCT0gMDsKKworCXAtPnNjYi0+Y2JsX29mZnNldCA9IG1ha2UxNih0ZHJfY21kKTsKKwlwLT5zY2ItPmNtZF9jdWMgPSBDVUNfU1RBUlQ7IC8qIGNtZC4tdW5pdCBzdGFydCAqLworCXN1bjNfYXR0bjU4NigpOworCisJV0FJVF80X1NUQVRfQ09NUEwodGRyX2NtZCk7CisKKwlpZighKHN3YWIxNih0ZHJfY21kLT5jbWRfc3RhdHVzKSAmIFNUQVRfQ09NUEwpKQorCXsKKwkJcHJpbnRrKCIlczogUHJvYmxlbXMgd2hpbGUgcnVubmluZyB0aGUgVERSLlxuIixkZXYtPm5hbWUpOworCX0KKwllbHNlCisJeworCQlERUxBWV8xNigpOyAvKiB3YWl0IGZvciByZXN1bHQgKi8KKwkJcmVzdWx0ID0gc3dhYjE2KHRkcl9jbWQtPnN0YXR1cyk7CisKKwkJcC0+c2NiLT5jbWRfY3VjID0gcC0+c2NiLT5jdXMgJiBTVEFUX01BU0s7CisJCXN1bjNfYXR0bjU4NigpOyAvKiBhY2sgdGhlIGludGVycnVwdHMgKi8KKworCQlpZihyZXN1bHQgJiBURFJfTE5LX09LKQorCQkJOworCQllbHNlIGlmKHJlc3VsdCAmIFREUl9YQ1ZSX1BSQikKKwkJCXByaW50aygiJXM6IFREUjogVHJhbnNjZWl2ZXIgcHJvYmxlbS4gQ2hlY2sgdGhlIGNhYmxlKHMpIVxuIixkZXYtPm5hbWUpOworCQllbHNlIGlmKHJlc3VsdCAmIFREUl9FVF9PUE4pCisJCQlwcmludGsoIiVzOiBURFI6IE5vIGNvcnJlY3QgdGVybWluYXRpb24gJWQgY2xvY2tzIGF3YXkuXG4iLGRldi0+bmFtZSxyZXN1bHQgJiBURFJfVElNRU1BU0spOworCQllbHNlIGlmKHJlc3VsdCAmIFREUl9FVF9TUlQpCisJCXsKKwkJCWlmIChyZXN1bHQgJiBURFJfVElNRU1BU0spIC8qIHRpbWUgPT0gMCAtPiBzdHJhbmdlIDotKSAqLworCQkJCXByaW50aygiJXM6IFREUjogRGV0ZWN0ZWQgYSBzaG9ydCBjaXJjdWl0ICVkIGNsb2NrcyBhd2F5LlxuIixkZXYtPm5hbWUscmVzdWx0ICYgVERSX1RJTUVNQVNLKTsKKwkJfQorCQllbHNlCisJCQlwcmludGsoIiVzOiBURFI6IFVua25vd24gc3RhdHVzICUwNHhcbiIsZGV2LT5uYW1lLHJlc3VsdCk7CisJfQorCisJLyoKKwkgKiBNdWx0aWNhc3Qgc2V0dXAKKwkgKi8KKwlpZihudW1fYWRkcnMgJiYgIShkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpICkKKwl7CisJCW1jX2NtZCA9IChzdHJ1Y3QgbWNzZXR1cF9jbWRfc3RydWN0ICopIHB0cjsKKwkJbWNfY21kLT5jbWRfc3RhdHVzID0gMDsKKwkJbWNfY21kLT5jbWRfY21kID0gc3dhYjE2KENNRF9NQ1NFVFVQIHwgQ01EX0xBU1QpOworCQltY19jbWQtPmNtZF9saW5rID0gMHhmZmZmOworCQltY19jbWQtPm1jX2NudCA9IHN3YWIxNihudW1fYWRkcnMgKiA2KTsKKworCQlmb3IoaT0wO2k8bnVtX2FkZHJzO2krKyxkbWk9ZG1pLT5uZXh0KQorCQkJbWVtY3B5KChjaGFyICopIG1jX2NtZC0+bWNfbGlzdFtpXSwgZG1pLT5kbWlfYWRkciw2KTsKKworCQlwLT5zY2ItPmNibF9vZmZzZXQgPSBtYWtlMTYobWNfY21kKTsKKwkJcC0+c2NiLT5jbWRfY3VjID0gQ1VDX1NUQVJUOworCQlzdW4zX2F0dG41ODYoKTsKKworCQlXQUlUXzRfU1RBVF9DT01QTChtY19jbWQpOworCisJCWlmKCAoc3dhYjE2KG1jX2NtZC0+Y21kX3N0YXR1cykgJiAoU1RBVF9DT01QTHxTVEFUX09LKSkgIT0gKFNUQVRfQ09NUEx8U1RBVF9PSykgKQorCQkJcHJpbnRrKCIlczogQ2FuJ3QgYXBwbHkgbXVsdGljYXN0LWFkZHJlc3MtbGlzdC5cbiIsZGV2LT5uYW1lKTsKKwl9CisKKwkvKgorCSAqIGFsbG9jIG5vcC94bWl0LWNtZHMKKwkgKi8KKyNpZiAoTlVNX1hNSVRfQlVGRlMgPT0gMSkKKwlmb3IoaT0wO2k8MjtpKyspCisJeworCQlwLT5ub3BfY21kc1tpXSAJCQk9IChzdHJ1Y3Qgbm9wX2NtZF9zdHJ1Y3QgKilwdHI7CisJCXAtPm5vcF9jbWRzW2ldLT5jbWRfY21kCQk9IHN3YWIxNihDTURfTk9QKTsKKwkJcC0+bm9wX2NtZHNbaV0tPmNtZF9zdGF0dXMgCT0gMDsKKwkJcC0+bm9wX2NtZHNbaV0tPmNtZF9saW5rCT0gbWFrZTE2KChwLT5ub3BfY21kc1tpXSkpOworCQlwdHIgPSAoY2hhciAqKSBwdHIgKyBzaXplb2Yoc3RydWN0IG5vcF9jbWRfc3RydWN0KTsKKwl9CisjZWxzZQorCWZvcihpPTA7aTxOVU1fWE1JVF9CVUZGUztpKyspCisJeworCQlwLT5ub3BfY21kc1tpXQkJCT0gKHN0cnVjdCBub3BfY21kX3N0cnVjdCAqKXB0cjsKKwkJcC0+bm9wX2NtZHNbaV0tPmNtZF9jbWQJCT0gc3dhYjE2KENNRF9OT1ApOworCQlwLT5ub3BfY21kc1tpXS0+Y21kX3N0YXR1cwk9IDA7CisJCXAtPm5vcF9jbWRzW2ldLT5jbWRfbGluawk9IG1ha2UxNigocC0+bm9wX2NtZHNbaV0pKTsKKwkJcHRyID0gKGNoYXIgKikgcHRyICsgc2l6ZW9mKHN0cnVjdCBub3BfY21kX3N0cnVjdCk7CisJfQorI2VuZGlmCisKKwlwdHIgPSBhbGxvY19yZmEoZGV2LCh2b2lkICopcHRyKTsgLyogaW5pdCByZWNlaXZlLWZyYW1lLWFyZWEgKi8KKworCS8qCisJICogYWxsb2MgeG1pdC1idWZmcyAvIGluaXQgeG1pdF9jbWRzCisJICovCisJZm9yKGk9MDtpPE5VTV9YTUlUX0JVRkZTO2krKykKKwl7CisJCXAtPnhtaXRfY21kc1tpXSA9IChzdHJ1Y3QgdHJhbnNtaXRfY21kX3N0cnVjdCAqKXB0cjsgLyp0cmFuc21pdCBjbWQvYnVmZiAwKi8KKwkJcHRyID0gKGNoYXIgKikgcHRyICsgc2l6ZW9mKHN0cnVjdCB0cmFuc21pdF9jbWRfc3RydWN0KTsKKwkJcC0+eG1pdF9jYnVmZnNbaV0gPSAoY2hhciAqKXB0cjsgLyogY2hhci1idWZmcyAqLworCQlwdHIgPSAoY2hhciAqKSBwdHIgKyBYTUlUX0JVRkZfU0laRTsKKwkJcC0+eG1pdF9idWZmc1tpXSA9IChzdHJ1Y3QgdGJkX3N0cnVjdCAqKXB0cjsgLyogVEJEICovCisJCXB0ciA9IChjaGFyICopIHB0ciArIHNpemVvZihzdHJ1Y3QgdGJkX3N0cnVjdCk7CisJCWlmKCh2b2lkICopcHRyID4gKHZvaWQgKilkZXYtPm1lbV9lbmQpCisJCXsKKwkJCXByaW50aygiJXM6IG5vdCBlbm91Z2ggc2hhcmVkLW1lbSBmb3IgeW91ciBjb25maWd1cmF0aW9uIVxuIixkZXYtPm5hbWUpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJbWVtc2V0KChjaGFyICopKHAtPnhtaXRfY21kc1tpXSkgLDAsIHNpemVvZihzdHJ1Y3QgdHJhbnNtaXRfY21kX3N0cnVjdCkpOworCQltZW1zZXQoKGNoYXIgKikocC0+eG1pdF9idWZmc1tpXSksMCwgc2l6ZW9mKHN0cnVjdCB0YmRfc3RydWN0KSk7CisJCXAtPnhtaXRfY21kc1tpXS0+Y21kX2xpbmsgPSBtYWtlMTYocC0+bm9wX2NtZHNbKGkrMSklTlVNX1hNSVRfQlVGRlNdKTsKKwkJcC0+eG1pdF9jbWRzW2ldLT5jbWRfc3RhdHVzID0gc3dhYjE2KFNUQVRfQ09NUEwpOworCQlwLT54bWl0X2NtZHNbaV0tPmNtZF9jbWQgPSBzd2FiMTYoQ01EX1hNSVQgfCBDTURfSU5UKTsKKwkJcC0+eG1pdF9jbWRzW2ldLT50YmRfb2Zmc2V0ID0gbWFrZTE2KChwLT54bWl0X2J1ZmZzW2ldKSk7CisJCXAtPnhtaXRfYnVmZnNbaV0tPm5leHQgPSAweGZmZmY7CisJCXAtPnhtaXRfYnVmZnNbaV0tPmJ1ZmZlciA9IG1ha2UyNCgocC0+eG1pdF9jYnVmZnNbaV0pKTsKKwl9CisKKwlwLT54bWl0X2NvdW50ID0gMDsKKwlwLT54bWl0X2xhc3QJPSAwOworI2lmbmRlZiBOT19OT1BDT01NQU5EUworCXAtPm5vcF9wb2ludAk9IDA7CisjZW5kaWYKKworCSAvKgorCQkqICdzdGFydCB0cmFuc21pdHRlcicKKwkJKi8KKyNpZm5kZWYgTk9fTk9QQ09NTUFORFMKKwlwLT5zY2ItPmNibF9vZmZzZXQgPSBtYWtlMTYocC0+bm9wX2NtZHNbMF0pOworCXAtPnNjYi0+Y21kX2N1YyA9IENVQ19TVEFSVDsKKwlzdW4zX2F0dG41ODYoKTsKKwlXQUlUXzRfU0NCX0NNRCgpOworI2Vsc2UKKwlwLT54bWl0X2NtZHNbMF0tPmNtZF9saW5rID0gbWFrZTE2KHAtPnhtaXRfY21kc1swXSk7CisJcC0+eG1pdF9jbWRzWzBdLT5jbWRfY21kCT0gc3dhYjE2KENNRF9YTUlUIHwgQ01EX1NVU1BFTkQgfCBDTURfSU5UKTsKKyNlbmRpZgorCisJLyoKKwkgKiBhY2suIGludGVycnVwdHMKKwkgKi8KKwlwLT5zY2ItPmNtZF9jdWMgPSBwLT5zY2ItPmN1cyAmIFNUQVRfTUFTSzsKKwlzdW4zX2F0dG41ODYoKTsKKwlERUxBWV8xNigpOworCisJc3VuM19lbmFpbnQoKTsKKwlzdW4zX2FjdGl2ZSgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRoaXMgaXMgYSBoZWxwZXIgcm91dGluZSBmb3Igc3VuM184MjU4Nl9ybnJfaW50KCkgYW5kIGluaXQ1ODYoKS4KKyAqIEl0IHNldHMgdXAgdGhlIFJlY2VpdmUgRnJhbWUgQXJlYSAoUkZBKS4KKyAqLworCitzdGF0aWMgdm9pZCAqYWxsb2NfcmZhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsdm9pZCAqcHRyKQoreworCXZvbGF0aWxlIHN0cnVjdCByZmRfc3RydWN0ICpyZmQgPSAoc3RydWN0IHJmZF9zdHJ1Y3QgKilwdHI7CisJdm9sYXRpbGUgc3RydWN0IHJiZF9zdHJ1Y3QgKnJiZDsKKwlpbnQgaTsKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwltZW1zZXQoKGNoYXIgKikgcmZkLDAsc2l6ZW9mKHN0cnVjdCByZmRfc3RydWN0KSoocC0+bnVtX3JlY3ZfYnVmZnMrcmZkYWRkKSk7CisJcC0+cmZkX2ZpcnN0ID0gcmZkOworCisJZm9yKGkgPSAwOyBpIDwgKHAtPm51bV9yZWN2X2J1ZmZzK3JmZGFkZCk7IGkrKykgeworCQlyZmRbaV0ubmV4dCA9IG1ha2UxNihyZmQgKyAoaSsxKSAlIChwLT5udW1fcmVjdl9idWZmcytyZmRhZGQpICk7CisJCXJmZFtpXS5yYmRfb2Zmc2V0ID0gMHhmZmZmOworCX0KKwlyZmRbcC0+bnVtX3JlY3ZfYnVmZnMtMStyZmRhZGRdLmxhc3QgPSBSRkRfU1VTUDsJIC8qIFJVIHN1c3BlbmQgKi8KKworCXB0ciA9ICh2b2lkICopIChyZmQgKyAocC0+bnVtX3JlY3ZfYnVmZnMgKyByZmRhZGQpICk7CisKKwlyYmQgPSAoc3RydWN0IHJiZF9zdHJ1Y3QgKikgcHRyOworCXB0ciA9ICh2b2lkICopIChyYmQgKyBwLT5udW1fcmVjdl9idWZmcyk7CisKKwkgLyogY2xyIGRlc2NyaXB0b3JzICovCisJbWVtc2V0KChjaGFyICopIHJiZCwwLHNpemVvZihzdHJ1Y3QgcmJkX3N0cnVjdCkqKHAtPm51bV9yZWN2X2J1ZmZzKSk7CisKKwlmb3IoaT0wO2k8cC0+bnVtX3JlY3ZfYnVmZnM7aSsrKQorCXsKKwkJcmJkW2ldLm5leHQgPSBtYWtlMTYoKHJiZCArIChpKzEpICUgcC0+bnVtX3JlY3ZfYnVmZnMpKTsKKwkJcmJkW2ldLnNpemUgPSBzd2FiMTYoUkVDVl9CVUZGX1NJWkUpOworCQlyYmRbaV0uYnVmZmVyID0gbWFrZTI0KHB0cik7CisJCXB0ciA9IChjaGFyICopIHB0ciArIFJFQ1ZfQlVGRl9TSVpFOworCX0KKworCXAtPnJmZF90b3AJPSBwLT5yZmRfZmlyc3Q7CisJcC0+cmZkX2xhc3QgPSBwLT5yZmRfZmlyc3QgKyAocC0+bnVtX3JlY3ZfYnVmZnMgLSAxICsgcmZkYWRkKTsKKworCXAtPnNjYi0+cmZhX29mZnNldAkJPSBtYWtlMTYocC0+cmZkX2ZpcnN0KTsKKwlwLT5yZmRfZmlyc3QtPnJiZF9vZmZzZXQJPSBtYWtlMTYocmJkKTsKKworCXJldHVybiBwdHI7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbnRlcnJ1cHQgSGFuZGxlciAuLi4KKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3VuM184MjU4Nl9pbnRlcnJ1cHQoaW50IGlycSx2b2lkICpkZXZfaWQsc3RydWN0IHB0X3JlZ3MgKnJlZ19wdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwl1bnNpZ25lZCBzaG9ydCBzdGF0OworCWludCBjbnQ9MDsKKwlzdHJ1Y3QgcHJpdiAqcDsKKworCWlmICghZGV2KSB7CisJCXByaW50ayAoInN1bjNfODI1ODYtaW50ZXJydXB0OiBpcnEgJWQgZm9yIHVua25vd24gZGV2aWNlLlxuIixpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCXAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCisJaWYoZGVidWdsZXZlbCA+IDEpCisJCXByaW50aygiSSIpOworCisJV0FJVF80X1NDQl9DTUQoKTsgLyogd2FpdCBmb3IgbGFzdCBjb21tYW5kCSovCisKKwl3aGlsZSgoc3RhdD1wLT5zY2ItPmN1cyAmIFNUQVRfTUFTSykpCisJeworCQlwLT5zY2ItPmNtZF9jdWMgPSBzdGF0OworCQlzdW4zX2F0dG41ODYoKTsKKworCQlpZihzdGF0ICYgU1RBVF9GUikJIC8qIHJlY2VpdmVkIGEgZnJhbWUgKi8KKwkJCXN1bjNfODI1ODZfcmN2X2ludChkZXYpOworCisJCWlmKHN0YXQgJiBTVEFUX1JOUikgLyogUlUgd2VudCAnbm90IHJlYWR5JyAqLworCQl7CisJCQlwcmludGsoIihSKSIpOworCQkJaWYocC0+c2NiLT5ydXMgJiBSVV9TVVNQRU5EKSAvKiBzcGVjaWFsIGNhc2U6IFJVX1NVU1BFTkQgKi8KKwkJCXsKKwkJCQlXQUlUXzRfU0NCX0NNRCgpOworCQkJCXAtPnNjYi0+Y21kX3J1YyA9IFJVQ19SRVNVTUU7CisJCQkJc3VuM19hdHRuNTg2KCk7CisJCQkJV0FJVF80X1NDQl9DTURfUlVDKCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcHJpbnRrKCIlczogUmVjZWl2ZXItVW5pdCB3ZW50ICdOT1QgUkVBRFknOiAlMDR4LyUwMnguXG4iLGRldi0+bmFtZSwoaW50KSBzdGF0LChpbnQpIHAtPnNjYi0+cnVzKTsKKwkJCQlzdW4zXzgyNTg2X3Jucl9pbnQoZGV2KTsKKwkJCX0KKwkJfQorCisJCWlmKHN0YXQgJiBTVEFUX0NYKQkJLyogY29tbWFuZCB3aXRoIEktYml0IHNldCBjb21wbGV0ZSAqLworCQkJIHN1bjNfODI1ODZfeG10X2ludChkZXYpOworCisjaWZuZGVmIE5PX05PUENPTU1BTkRTCisJCWlmKHN0YXQgJiBTVEFUX0NOQSkJLyogQ1Ugd2VudCAnbm90IHJlYWR5JyAqLworCQl7CisJCQlpZihuZXRpZl9ydW5uaW5nKGRldikpCisJCQkJcHJpbnRrKCIlczogb29wcyEgQ1UgaGFzIGxlZnQgYWN0aXZlIHN0YXRlLiBzdGF0OiAlMDR4LyUwMnguXG4iLGRldi0+bmFtZSwoaW50KSBzdGF0LChpbnQpIHAtPnNjYi0+Y3VzKTsKKwkJfQorI2VuZGlmCisKKwkJaWYoZGVidWdsZXZlbCA+IDEpCisJCQlwcmludGsoIiVkIixjbnQrKyk7CisKKwkJV0FJVF80X1NDQl9DTUQoKTsgLyogd2FpdCBmb3IgYWNrLiAoc3VuM184MjU4Nl94bXRfaW50IGNhbiBiZSBmYXN0ZXIgdGhhbiBhY2shISkgKi8KKwkJaWYocC0+c2NiLT5jbWRfY3VjKQkgLyogdGltZWQgb3V0PyAqLworCQl7CisJCQlwcmludGsoIiVzOiBBY2tub3dsZWRnZSB0aW1lZCBvdXQuXG4iLGRldi0+bmFtZSk7CisJCQlzdW4zX2Rpc2ludCgpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZihkZWJ1Z2xldmVsID4gMSkKKwkJcHJpbnRrKCJpIik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcmVjZWl2ZS1pbnRlcnJ1cHQKKyAqLworCitzdGF0aWMgdm9pZCBzdW4zXzgyNTg2X3Jjdl9pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgc3RhdHVzLGNudD0wOworCXVuc2lnbmVkIHNob3J0IHRvdGxlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCByYmRfc3RydWN0ICpyYmQ7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCisJaWYoZGVidWdsZXZlbCA+IDApCisJCXByaW50aygiUiIpOworCisJZm9yKDsoc3RhdHVzID0gcC0+cmZkX3RvcC0+c3RhdF9oaWdoKSAmIFJGRF9DT01QTDspCisJeworCQkJcmJkID0gKHN0cnVjdCByYmRfc3RydWN0ICopIG1ha2UzMihwLT5yZmRfdG9wLT5yYmRfb2Zmc2V0KTsKKworCQkJaWYoc3RhdHVzICYgUkZEX09LKSAvKiBmcmFtZSByZWNlaXZlZCB3aXRob3V0IGVycm9yPyAqLworCQkJeworCQkJCWlmKCAodG90bGVuID0gc3dhYjE2KHJiZC0+c3RhdHVzKSkgJiBSQkRfTEFTVCkgLyogdGhlIGZpcnN0IGFuZCB0aGUgbGFzdCBidWZmZXI/ICovCisJCQkJeworCQkJCQl0b3RsZW4gJj0gUkJEX01BU0s7IC8qIGxlbmd0aCBvZiB0aGlzIGZyYW1lICovCisJCQkJCXJiZC0+c3RhdHVzID0gMDsKKwkJCQkJc2tiID0gKHN0cnVjdCBza19idWZmICopIGRldl9hbGxvY19za2IodG90bGVuKzIpOworCQkJCQlpZihza2IgIT0gTlVMTCkKKwkJCQkJeworCQkJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJCQlza2JfcmVzZXJ2ZShza2IsMik7CisJCQkJCQlza2JfcHV0KHNrYix0b3RsZW4pOworCQkJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsKGNoYXIgKikgcC0+YmFzZStzd2FiMzIoKHVuc2lnbmVkIGxvbmcpIHJiZC0+YnVmZmVyKSx0b3RsZW4sMCk7CisJCQkJCQlza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCQkJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQkJCXAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCQlwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWludCByc3RhdDsKKwkJCQkJCSAvKiBmcmVlIGFsbCBSQkQncyB1bnRpbCBSQkRfTEFTVCBpcyBzZXQgKi8KKwkJCQkJdG90bGVuID0gMDsKKwkJCQkJd2hpbGUoISgocnN0YXQ9c3dhYjE2KHJiZC0+c3RhdHVzKSkgJiBSQkRfTEFTVCkpCisJCQkJCXsKKwkJCQkJCXRvdGxlbiArPSByc3RhdCAmIFJCRF9NQVNLOworCQkJCQkJaWYoIXJzdGF0KQorCQkJCQkJeworCQkJCQkJCXByaW50aygiJXM6IFdob29wcyAuLiBubyBlbmQgbWFyayBpbiBSQkQgbGlzdFxuIixkZXYtPm5hbWUpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJcmJkLT5zdGF0dXMgPSAwOworCQkJCQkJcmJkID0gKHN0cnVjdCByYmRfc3RydWN0ICopIG1ha2UzMihyYmQtPm5leHQpOworCQkJCQl9CisJCQkJCXRvdGxlbiArPSByc3RhdCAmIFJCRF9NQVNLOworCQkJCQlyYmQtPnN0YXR1cyA9IDA7CisJCQkJCXByaW50aygiJXM6IHJlY2VpdmVkIG92ZXJzaXplZCBmcmFtZSEgbGVuZ3RoOiAlZFxuIixkZXYtPm5hbWUsdG90bGVuKTsKKwkJCQkJcC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJIH0KKwkJfQorCQllbHNlIC8qIGZyYW1lICEob2spLCBvbmx5IHdpdGggJ3NhdmUtYmFkLWZyYW1lcycgKi8KKwkJeworCQkJcHJpbnRrKCIlczogb29wcyEgcmZkLWVycm9yLXN0YXR1czogJTA0eFxuIixkZXYtPm5hbWUsc3RhdHVzKTsKKwkJCXAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQl9CisJCXAtPnJmZF90b3AtPnN0YXRfaGlnaCA9IDA7CisJCXAtPnJmZF90b3AtPmxhc3QgPSBSRkRfU1VTUDsgLyogbWF5YmUgZXhjaGFuZ2UgYnkgUkZEX0xBU1QgKi8KKwkJcC0+cmZkX3RvcC0+cmJkX29mZnNldCA9IDB4ZmZmZjsKKwkJcC0+cmZkX2xhc3QtPmxhc3QgPSAwOwkJCQkvKiBkZWxldGUgUkZEX1NVU1AJKi8KKwkJcC0+cmZkX2xhc3QgPSBwLT5yZmRfdG9wOworCQlwLT5yZmRfdG9wID0gKHN0cnVjdCByZmRfc3RydWN0ICopIG1ha2UzMihwLT5yZmRfdG9wLT5uZXh0KTsgLyogc3RlcCB0byBuZXh0IFJGRCAqLworCQlwLT5zY2ItPnJmYV9vZmZzZXQgPSBtYWtlMTYocC0+cmZkX3RvcCk7CisKKwkJaWYoZGVidWdsZXZlbCA+IDApCisJCQlwcmludGsoIiVkIixjbnQrKyk7CisJfQorCisJaWYoYXV0b21hdGljX3Jlc3VtZSkKKwl7CisJCVdBSVRfNF9TQ0JfQ01EKCk7CisJCXAtPnNjYi0+Y21kX3J1YyA9IFJVQ19SRVNVTUU7CisJCXN1bjNfYXR0bjU4NigpOworCQlXQUlUXzRfU0NCX0NNRF9SVUMoKTsKKwl9CisKKyNpZmRlZiBXQUlUXzRfQlVTWQorCXsKKwkJaW50IGk7CisJCWZvcihpPTA7aTwxMDI0O2krKykKKwkJeworCQkJaWYocC0+cmZkX3RvcC0+c3RhdHVzKQorCQkJCWJyZWFrOworCQkJREVMQVlfMTYoKTsKKwkJCWlmKGkgPT0gMTAyMykKKwkJCQlwcmludGsoIiVzOiBSVSBoYXNuJ3QgZmV0Y2hlZCBuZXh0IFJGRCAobm90IGJ1c3kvY29tcGxldGUpXG4iLGRldi0+bmFtZSk7CisJCX0KKwl9CisjZW5kaWYKKworI2lmIDAKKwlpZighYXRfbGVhc3Rfb25lKQorCXsKKwkJaW50IGk7CisJCXZvbGF0aWxlIHN0cnVjdCByZmRfc3RydWN0ICpyZmRzPXAtPnJmZF90b3A7CisJCXZvbGF0aWxlIHN0cnVjdCByYmRfc3RydWN0ICpyYmRzOworCQlwcmludGsoIiVzOiByZWNlaXZlZCBhIEZDIGludHIuIHdpdGhvdXQgaGF2aW5nIGEgZnJhbWU6ICUwNHggJWRcbiIsZGV2LT5uYW1lLHN0YXR1cyxvbGRfYXRfbGVhc3QpOworCQlmb3IoaT0wO2k8IChwLT5udW1fcmVjdl9idWZmcys0KTtpKyspCisJCXsKKwkJCXJiZHMgPSAoc3RydWN0IHJiZF9zdHJ1Y3QgKikgbWFrZTMyKHJmZHMtPnJiZF9vZmZzZXQpOworCQkJcHJpbnRrKCIlMDR4OiUwNHggIixyZmRzLT5zdGF0dXMscmJkcy0+c3RhdHVzKTsKKwkJCXJmZHMgPSAoc3RydWN0IHJmZF9zdHJ1Y3QgKikgbWFrZTMyKHJmZHMtPm5leHQpOworCQl9CisJCXByaW50aygiXG5lcnJzOiAlMDR4ICUwNHggc3RhdDogJTA0eFxuIiwoaW50KXAtPnNjYi0+cnNjX2VycnMsKGludClwLT5zY2ItPm92cm5fZXJycywoaW50KXAtPnNjYi0+c3RhdHVzKTsKKwkJcHJpbnRrKCJcbmVycnM6ICUwNHggJTA0eCBydXM6ICUwMngsIGN1czogJTAyeFxuIiwoaW50KXAtPnNjYi0+cnNjX2VycnMsKGludClwLT5zY2ItPm92cm5fZXJycywoaW50KXAtPnNjYi0+cnVzLChpbnQpcC0+c2NiLT5jdXMpOworCX0KKwlvbGRfYXRfbGVhc3QgPSBhdF9sZWFzdF9vbmU7CisjZW5kaWYKKworCWlmKGRlYnVnbGV2ZWwgPiAwKQorCQlwcmludGsoInIiKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGhhbmRsZSAnUmVjZWl2ZXIgd2VudCBub3QgcmVhZHknLgorICovCisKK3N0YXRpYyB2b2lkIHN1bjNfODI1ODZfcm5yX2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKworCXAtPnN0YXRzLnJ4X2Vycm9ycysrOworCisJV0FJVF80X1NDQl9DTUQoKTsJCS8qIHdhaXQgZm9yIHRoZSBsYXN0IGNtZCwgV0FJVF80X0ZVTExTVEFUPz8gKi8KKwlwLT5zY2ItPmNtZF9ydWMgPSBSVUNfQUJPUlQ7IC8qIHVzdWFsbHkgdGhlIFJVIGlzIGluIHRoZSAnbm8gcmVzb3VyY2UnLXN0YXRlIC4uIGFib3J0IGl0IG5vdy4gKi8KKwlzdW4zX2F0dG41ODYoKTsKKwlXQUlUXzRfU0NCX0NNRF9SVUMoKTsJCS8qIHdhaXQgZm9yIGFjY2VwdCBjbWQuICovCisKKwlhbGxvY19yZmEoZGV2LChjaGFyICopcC0+cmZkX2ZpcnN0KTsKKy8qIG1heWJlIGFkZCBhIGNoZWNrIGhlcmUsIGJlZm9yZSByZXN0YXJ0aW5nIHRoZSBSVSAqLworCXN0YXJ0cmVjdjU4NihkZXYpOyAvKiByZXN0YXJ0IFJVICovCisKKwlwcmludGsoIiVzOiBSZWNlaXZlLVVuaXQgcmVzdGFydGVkLiBTdGF0dXM6ICUwNHhcbiIsZGV2LT5uYW1lLHAtPnNjYi0+cnVzKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaGFuZGxlIHhtaXQgLSBpbnRlcnJ1cHQKKyAqLworCitzdGF0aWMgdm9pZCBzdW4zXzgyNTg2X3htdF9pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBwcml2ICpwID0gKHN0cnVjdCBwcml2ICopIGRldi0+cHJpdjsKKworCWlmKGRlYnVnbGV2ZWwgPiAwKQorCQlwcmludGsoIlgiKTsKKworCXN0YXR1cyA9IHN3YWIxNihwLT54bWl0X2NtZHNbcC0+eG1pdF9sYXN0XS0+Y21kX3N0YXR1cyk7CisJaWYoIShzdGF0dXMgJiBTVEFUX0NPTVBMKSkKKwkJcHJpbnRrKCIlczogc3RyYW5nZSAuLiB4bWl0LWludCB3aXRob3V0IGEgJ0NPTVBMRVRFJ1xuIixkZXYtPm5hbWUpOworCisJaWYoc3RhdHVzICYgU1RBVF9PSykKKwl7CisJCXAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJcC0+c3RhdHMuY29sbGlzaW9ucyArPSAoc3RhdHVzICYgVENNRF9NQVhDT0xMTUFTSyk7CisJfQorCWVsc2UKKwl7CisJCXAtPnN0YXRzLnR4X2Vycm9ycysrOworCQlpZihzdGF0dXMgJiBUQ01EX0xBVEVDT0xMKSB7CisJCQlwcmludGsoIiVzOiBsYXRlIGNvbGxpc2lvbiBkZXRlY3RlZC5cbiIsZGV2LT5uYW1lKTsKKwkJCXAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJfQorCQllbHNlIGlmKHN0YXR1cyAmIFRDTURfTk9DQVJSSUVSKSB7CisJCQlwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJcHJpbnRrKCIlczogbm8gY2FycmllciBkZXRlY3RlZC5cbiIsZGV2LT5uYW1lKTsKKwkJfQorCQllbHNlIGlmKHN0YXR1cyAmIFRDTURfTE9TVENUUykKKwkJCXByaW50aygiJXM6IGxvc3Mgb2YgQ1RTIGRldGVjdGVkLlxuIixkZXYtPm5hbWUpOworCQllbHNlIGlmKHN0YXR1cyAmIFRDTURfVU5ERVJSVU4pIHsKKwkJCXAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQlwcmludGsoIiVzOiBETUEgdW5kZXJydW4gZGV0ZWN0ZWQuXG4iLGRldi0+bmFtZSk7CisJCX0KKwkJZWxzZSBpZihzdGF0dXMgJiBUQ01EX01BWENPTEwpIHsKKwkJCXByaW50aygiJXM6IE1heC4gY29sbGlzaW9ucyBleGNlZWRlZC5cbiIsZGV2LT5uYW1lKTsKKwkJCXAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gMTY7CisJCX0KKwl9CisKKyNpZiAoTlVNX1hNSVRfQlVGRlMgPiAxKQorCWlmKCAoKytwLT54bWl0X2xhc3QpID09IE5VTV9YTUlUX0JVRkZTKQorCQlwLT54bWl0X2xhc3QgPSAwOworI2VuZGlmCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIChyZSlzdGFydCB0aGUgcmVjZWl2ZXIKKyAqLworCitzdGF0aWMgdm9pZCBzdGFydHJlY3Y1ODYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwlXQUlUXzRfU0NCX0NNRCgpOworCVdBSVRfNF9TQ0JfQ01EX1JVQygpOworCXAtPnNjYi0+cmZhX29mZnNldCA9IG1ha2UxNihwLT5yZmRfZmlyc3QpOworCXAtPnNjYi0+Y21kX3J1YyA9IFJVQ19TVEFSVDsKKwlzdW4zX2F0dG41ODYoKTsJCS8qIHN0YXJ0IGNtZC4gKi8KKwlXQUlUXzRfU0NCX0NNRF9SVUMoKTsJLyogd2FpdCBmb3IgYWNjZXB0IGNtZC4gKG5vIHRpbWVvdXQhISkgKi8KK30KKworc3RhdGljIHZvaWQgc3VuM184MjU4Nl90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworI2lmbmRlZiBOT19OT1BDT01NQU5EUworCWlmKHAtPnNjYi0+Y3VzICYgQ1VfQUNUSVZFKSAvKiBDT01NQU5ELVVOSVQgYWN0aXZlPyAqLworCXsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworI2lmZGVmIERFQlVHCisJCXByaW50aygiJXM6IHN0cmFuZ2UgLi4uIHRpbWVvdXQgd2l0aCBDVSBhY3RpdmU/IT9cbiIsZGV2LT5uYW1lKTsKKwkJcHJpbnRrKCIlczogWDA6ICUwNHggTjA6ICUwNHggTjE6ICUwNHggJWRcbiIsZGV2LT5uYW1lLChpbnQpc3dhYjE2KHAtPnhtaXRfY21kc1swXS0+Y21kX3N0YXR1cyksKGludClzd2FiMTYocC0+bm9wX2NtZHNbMF0tPmNtZF9zdGF0dXMpLChpbnQpc3dhYjE2KHAtPm5vcF9jbWRzWzFdLT5jbWRfc3RhdHVzKSwoaW50KXAtPm5vcF9wb2ludCk7CisjZW5kaWYKKwkJcC0+c2NiLT5jbWRfY3VjID0gQ1VDX0FCT1JUOworCQlzdW4zX2F0dG41ODYoKTsKKwkJV0FJVF80X1NDQl9DTUQoKTsKKwkJcC0+c2NiLT5jYmxfb2Zmc2V0ID0gbWFrZTE2KHAtPm5vcF9jbWRzW3AtPm5vcF9wb2ludF0pOworCQlwLT5zY2ItPmNtZF9jdWMgPSBDVUNfU1RBUlQ7CisJCXN1bjNfYXR0bjU4NigpOworCQlXQUlUXzRfU0NCX0NNRCgpOworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisJeworI2lmZGVmIERFQlVHCisJCXByaW50aygiJXM6IHhtaXR0ZXIgdGltZWQgb3V0LCB0cnkgdG8gcmVzdGFydCEgc3RhdDogJTAyeFxuIixkZXYtPm5hbWUscC0+c2NiLT5jdXMpOworCQlwcmludGsoIiVzOiBjb21tYW5kLXN0YXRzOiAlMDR4ICUwNHhcbiIsZGV2LT5uYW1lLHN3YWIxNihwLT54bWl0X2NtZHNbMF0tPmNtZF9zdGF0dXMpLHN3YWIxNihwLT54bWl0X2NtZHNbMV0tPmNtZF9zdGF0dXMpKTsKKwkJcHJpbnRrKCIlczogY2hlY2ssIHdoZXRoZXIgeW91IHNldCB0aGUgcmlnaHQgaW50ZXJydXB0IG51bWJlciFcbiIsZGV2LT5uYW1lKTsKKyNlbmRpZgorCQlzdW4zXzgyNTg2X2Nsb3NlKGRldik7CisJCXN1bjNfODI1ODZfb3BlbihkZXYpOworCX0KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc2VuZCBmcmFtZQorICovCisKK3N0YXRpYyBpbnQgc3VuM184MjU4Nl9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBsZW4saTsKKyNpZm5kZWYgTk9fTk9QQ09NTUFORFMKKwlpbnQgbmV4dF9ub3A7CisjZW5kaWYKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisKKwlpZihza2ItPmxlbiA+IFhNSVRfQlVGRl9TSVpFKQorCXsKKwkJcHJpbnRrKCIlczogU29ycnksIG1heC4gZnJhbWVsZW5ndGggaXMgJWQgYnl0ZXMuIFRoZSBsZW5ndGggb2YgeW91ciBmcmFtZSBpcyAlZCBieXRlcy5cbiIsZGV2LT5uYW1lLFhNSVRfQlVGRl9TSVpFLHNrYi0+bGVuKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisjaWYoTlVNX1hNSVRfQlVGRlMgPiAxKQorCWlmKHRlc3RfYW5kX3NldF9iaXQoMCwodm9pZCAqKSAmcC0+bG9jaykpIHsKKwkJcHJpbnRrKCIlczogUXVldWUgd2FzIGxvY2tlZFxuIixkZXYtPm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisJZWxzZQorI2VuZGlmCisJeworCQlsZW4gPSBza2ItPmxlbjsKKwkJaWYgKGxlbiA8IEVUSF9aTEVOKSB7CisJCQltZW1zZXQoKGNoYXIgKilwLT54bWl0X2NidWZmc1twLT54bWl0X2NvdW50XSwgMCwgRVRIX1pMRU4pOworCQkJbGVuID0gRVRIX1pMRU47CisJCX0KKwkJbWVtY3B5KChjaGFyICopcC0+eG1pdF9jYnVmZnNbcC0+eG1pdF9jb3VudF0sKGNoYXIgKikoc2tiLT5kYXRhKSxza2ItPmxlbik7CisKKyNpZiAoTlVNX1hNSVRfQlVGRlMgPT0gMSkKKyMJaWZkZWYgTk9fTk9QQ09NTUFORFMKKworI2lmZGVmIERFQlVHCisJCWlmKHAtPnNjYi0+Y3VzICYgQ1VfQUNUSVZFKQorCQl7CisJCQlwcmludGsoIiVzOiBIbW1tIC4uIENVIGlzIHN0aWxsIHJ1bm5pbmcgYW5kIHdlIHdhbm5hIHNlbmQgYSBuZXcgcGFja2V0LlxuIixkZXYtPm5hbWUpOworCQkJcHJpbnRrKCIlczogc3RhdDogJTA0eCAlMDR4XG4iLGRldi0+bmFtZSxwLT5zY2ItPmN1cyxzd2FiMTYocC0+eG1pdF9jbWRzWzBdLT5jbWRfc3RhdHVzKSk7CisJCX0KKyNlbmRpZgorCisJCXAtPnhtaXRfYnVmZnNbMF0tPnNpemUgPSBzd2FiMTYoVEJEX0xBU1QgfCBsZW4pOworCQlmb3IoaT0wO2k8MTY7aSsrKQorCQl7CisJCQlwLT54bWl0X2NtZHNbMF0tPmNtZF9zdGF0dXMgPSAwOworCQkJV0FJVF80X1NDQl9DTUQoKTsKKwkJCWlmKCAocC0+c2NiLT5jdXMgJiBDVV9TVEFUVVMpID09IENVX1NVU1BFTkQpCisJCQkJcC0+c2NiLT5jbWRfY3VjID0gQ1VDX1JFU1VNRTsKKwkJCWVsc2UKKwkJCXsKKwkJCQlwLT5zY2ItPmNibF9vZmZzZXQgPSBtYWtlMTYocC0+eG1pdF9jbWRzWzBdKTsKKwkJCQlwLT5zY2ItPmNtZF9jdWMgPSBDVUNfU1RBUlQ7CisJCQl9CisKKwkJCXN1bjNfYXR0bjU4NigpOworCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQlpZighaSkKKwkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlXQUlUXzRfU0NCX0NNRCgpOworCQkJaWYoIChwLT5zY2ItPmN1cyAmIENVX0FDVElWRSkpIC8qIHRlc3QgaXQsIGJlY2F1c2UgQ1Ugc29tZXRpbWVzIGRvZXNuJ3Qgc3RhcnQgaW1tZWRpYXRlbHkgKi8KKwkJCQlicmVhazsKKwkJCWlmKHAtPnhtaXRfY21kc1swXS0+Y21kX3N0YXR1cykKKwkJCQlicmVhazsKKwkJCWlmKGk9PTE1KQorCQkJCXByaW50aygiJXM6IENhbid0IHN0YXJ0IHRyYW5zbWl0LWNvbW1hbmQuXG4iLGRldi0+bmFtZSk7CisJCX0KKyMJZWxzZQorCQluZXh0X25vcCA9IChwLT5ub3BfcG9pbnQgKyAxKSAmIDB4MTsKKwkJcC0+eG1pdF9idWZmc1swXS0+c2l6ZSA9IHN3YWIxNihUQkRfTEFTVCB8IGxlbik7CisKKwkJcC0+eG1pdF9jbWRzWzBdLT5jbWRfbGluawkgPSBwLT5ub3BfY21kc1tuZXh0X25vcF0tPmNtZF9saW5rCisJCQk9IG1ha2UxNigocC0+bm9wX2NtZHNbbmV4dF9ub3BdKSk7CisJCXAtPnhtaXRfY21kc1swXS0+Y21kX3N0YXR1cyA9IHAtPm5vcF9jbWRzW25leHRfbm9wXS0+Y21kX3N0YXR1cyA9IDA7CisKKwkJcC0+bm9wX2NtZHNbcC0+bm9wX3BvaW50XS0+Y21kX2xpbmsgPSBtYWtlMTYoKHAtPnhtaXRfY21kc1swXSkpOworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJcC0+bm9wX3BvaW50ID0gbmV4dF9ub3A7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKyMJZW5kaWYKKyNlbHNlCisJCXAtPnhtaXRfYnVmZnNbcC0+eG1pdF9jb3VudF0tPnNpemUgPSBzd2FiMTYoVEJEX0xBU1QgfCBsZW4pOworCQlpZiggKG5leHRfbm9wID0gcC0+eG1pdF9jb3VudCArIDEpID09IE5VTV9YTUlUX0JVRkZTICkKKwkJCW5leHRfbm9wID0gMDsKKworCQlwLT54bWl0X2NtZHNbcC0+eG1pdF9jb3VudF0tPmNtZF9zdGF0dXMJPSAwOworCQkvKiBsaW5rcG9pbnRlciBvZiB4bWl0LWNvbW1hbmQgYWxyZWFkeSBwb2ludHMgdG8gbmV4dCBub3AgY21kICovCisJCXAtPm5vcF9jbWRzW25leHRfbm9wXS0+Y21kX2xpbmsgPSBtYWtlMTYoKHAtPm5vcF9jbWRzW25leHRfbm9wXSkpOworCQlwLT5ub3BfY21kc1tuZXh0X25vcF0tPmNtZF9zdGF0dXMgPSAwOworCisJCXAtPm5vcF9jbWRzW3AtPnhtaXRfY291bnRdLT5jbWRfbGluayA9IG1ha2UxNigocC0+eG1pdF9jbWRzW3AtPnhtaXRfY291bnRdKSk7CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlwLT54bWl0X2NvdW50ID0gbmV4dF9ub3A7CisKKwkJeworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJCWlmKHAtPnhtaXRfY291bnQgIT0gcC0+eG1pdF9sYXN0KQorCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCXAtPmxvY2sgPSAwOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQl9CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKyNlbmRpZgorCX0KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNvbWVvbmUgd2FubmEgaGF2ZSB0aGUgc3RhdGlzdGljcworICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3VuM184MjU4Nl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcHJpdiAqcCA9IChzdHJ1Y3QgcHJpdiAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgc2hvcnQgY3JjLGFsbixyc2Msb3ZybjsKKworCWNyYyA9IHN3YWIxNihwLT5zY2ItPmNyY19lcnJzKTsgLyogZ2V0IGVycm9yLXN0YXRpc3RpYyBmcm9tIHRoZSBuaTgyNTg2ICovCisJcC0+c2NiLT5jcmNfZXJycyA9IDA7CisJYWxuID0gc3dhYjE2KHAtPnNjYi0+YWxuX2VycnMpOworCXAtPnNjYi0+YWxuX2VycnMgPSAwOworCXJzYyA9IHN3YWIxNihwLT5zY2ItPnJzY19lcnJzKTsKKwlwLT5zY2ItPnJzY19lcnJzID0gMDsKKwlvdnJuID0gc3dhYjE2KHAtPnNjYi0+b3Zybl9lcnJzKTsKKwlwLT5zY2ItPm92cm5fZXJycyA9IDA7CisKKwlwLT5zdGF0cy5yeF9jcmNfZXJyb3JzICs9IGNyYzsKKwlwLT5zdGF0cy5yeF9maWZvX2Vycm9ycyArPSBvdnJuOworCXAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyArPSBhbG47CisJcC0+c3RhdHMucnhfZHJvcHBlZCArPSByc2M7CisKKwlyZXR1cm4gJnAtPnN0YXRzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNldCBNQyBsaXN0IC4uCisgKi8KKworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXN1bjNfZGlzaW50KCk7CisJYWxsb2M1ODYoZGV2KTsKKwlpbml0NTg2KGRldik7CisJc3RhcnRyZWN2NTg2KGRldik7CisJc3VuM19lbmFpbnQoKTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKyNpZmRlZiBNT0RVTEUKKyNlcnJvciBUaGlzIGNvZGUgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgYXMgYSBtb2R1bGUKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X3N1bjNfODI1ODY7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWRldl9zdW4zXzgyNTg2ID0gc3VuM184MjU4Nl9wcm9iZSgtMSk7CisJaWYgKElTX0VSUihkZXZfc3VuM184MjU4NikpCisJCXJldHVybiBQVFJfRVJSKGRldl9zdW4zXzgyNTg2KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2X3N1bjNfODI1ODYtPmJhc2VfYWRkcjsKKwl1bnJlZ2lzdGVyX25ldGRldihkZXZfc3VuM184MjU4Nik7CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBTVU4zXzgyNTg2X1RPVEFMX1NJWkUpOworCWlvdW5tYXAoKHZvaWQgKilpb2FkZHIpOworCWZyZWVfbmV0ZGV2KGRldl9zdW4zXzgyNTg2KTsKK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworI2lmIDAKKy8qCisgKiBEVU1QIC4uIHdlIGV4cGVjdCBhIG5vdCBydW5uaW5nIENNRCB1bml0IGFuZCBlbm91Z2ggc3BhY2UKKyAqLwordm9pZCBzdW4zXzgyNTg2X2R1bXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldix2b2lkICpwdHIpCit7CisJc3RydWN0IHByaXYgKnAgPSAoc3RydWN0IHByaXYgKikgZGV2LT5wcml2OworCXN0cnVjdCBkdW1wX2NtZF9zdHJ1Y3QgKmR1bXBfY21kID0gKHN0cnVjdCBkdW1wX2NtZF9zdHJ1Y3QgKikgcHRyOworCWludCBpOworCisJcC0+c2NiLT5jbWRfY3VjID0gQ1VDX0FCT1JUOworCXN1bjNfYXR0bjU4NigpOworCVdBSVRfNF9TQ0JfQ01EKCk7CisJV0FJVF80X1NDQl9DTURfUlVDKCk7CisKKwlkdW1wX2NtZC0+Y21kX3N0YXR1cyA9IDA7CisJZHVtcF9jbWQtPmNtZF9jbWQgPSBDTURfRFVNUCB8IENNRF9MQVNUOworCWR1bXBfY21kLT5kdW1wX29mZnNldCA9IG1ha2UxNigoZHVtcF9jbWQgKyAxKSk7CisJZHVtcF9jbWQtPmNtZF9saW5rID0gMHhmZmZmOworCisJcC0+c2NiLT5jYmxfb2Zmc2V0ID0gbWFrZTE2KGR1bXBfY21kKTsKKwlwLT5zY2ItPmNtZF9jdWMgPSBDVUNfU1RBUlQ7CisJc3VuM19hdHRuNTg2KCk7CisJV0FJVF80X1NUQVRfQ09NUEwoZHVtcF9jbWQpOworCisJaWYoIChkdW1wX2NtZC0+Y21kX3N0YXR1cyAmIChTVEFUX0NPTVBMfFNUQVRfT0spKSAhPSAoU1RBVF9DT01QTHxTVEFUX09LKSApCisJCQkJcHJpbnRrKCIlczogQ2FuJ3QgZ2V0IGR1bXAgaW5mb3JtYXRpb24uXG4iLGRldi0+bmFtZSk7CisKKwlmb3IoaT0wO2k8MTcwO2krKykgeworCQlwcmludGsoIiUwMnggIiwoaW50KSAoKHVuc2lnbmVkIGNoYXIgKikgKGR1bXBfY21kICsgMSkpW2ldKTsKKwkJaWYoaSAlIDI0ID09IDIzKQorCQkJcHJpbnRrKCJcbiIpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisjZW5kaWYKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuM184MjU4Ni5oIGIvZHJpdmVycy9uZXQvc3VuM184MjU4Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxY2ZiMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdW4zXzgyNTg2LmgKQEAgLTAsMCArMSwzMTggQEAKKy8qCisgKiBJbnRlbCBpODI1ODYgRXRoZXJuZXQgZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiB0byB0aGUgTGludXggb3BlcmF0aW5nIHN5c3RlbSwgYW5kIGlzIGNvdmVyZWQgYnkgdGhlCisgKiBzYW1lIEdudSBQdWJsaWMgTGljZW5zZSB0aGF0IGNvdmVycyB0aGF0IHdvcmsuCisgKgorICogY29weXJpZ2h0cyAoYykgMTk5NCBieSBNaWNoYWVsIEhpcHAgKGhpcHBtQGluZm9ybWF0aWsudW5pLXR1ZWJpbmdlbi5kZSkKKyAqCisgKiBJIGhhdmUgZG9uZSBhIGxvb2sgaW4gdGhlIGZvbGxvd2luZyBzb3VyY2VzOgorICogICBjcnlud3ItcGFja2V0LWRyaXZlciBieSBSdXNzIE5lbHNvbgorICogICBHYXJyZXQgQS4gV29sbG1hbidzIGk4MjU4Ni1kcml2ZXIgZm9yIEJTRAorICovCisKKy8qCisgKiBDbG9uZWQgZnJvbSBuaTUyLmgsIGNvcHlyaWdodCBhcyBhYm92ZS4gIAorICoKKyAqIE1vZGlmaWVkIGZvciBTdW4zIE9CSU8gaTgyNTg2IGJ5IFNhbSBDcmVhc2V5IChzYW1teUBzYW1teS5uZXQpCisgKi8KKworCisvKiBkZWZpbmVzIGZvciB0aGUgb2JpbyBjaGlwIChub3Qgdm1lKSAqLyAKKyNkZWZpbmUgSUVPQl9OT1JTRVQgMHg4MCAgICAgICAgLyogZG9uJ3QgcmVzZXQgdGhlIGJvYXJkICovCisjZGVmaW5lIElFT0JfT05BSVIgIDB4NDAgICAgICAgIC8qIHB1dCB1cyBvbiB0aGUgYWlyICovCisjZGVmaW5lIElFT0JfQVRURU4gIDB4MjAgICAgICAgIC8qIGF0dGVudGlvbiEgKi8KKyNkZWZpbmUgSUVPQl9JRU5BQiAgMHgxMCAgICAgICAgLyogaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBJRU9CX1hYWFhYICAweDA4ICAgICAgICAvKiBmcmVlIGJpdCAqLworI2RlZmluZSBJRU9CX1hDVlJMMiAweDA0ICAgICAgICAvKiBsZXZlbCAyIHRyYW5zY2VpdmVyPyAqLworI2RlZmluZSBJRU9CX0JVU0VSUiAweDAyICAgICAgICAvKiBidXMgZXJyb3IgKi8KKyNkZWZpbmUgSUVPQl9JTlQgICAgMHgwMSAgICAgICAgLyogaW50ZXJydXB0ICovCisKKy8qIHdoZXJlIHRoZSBvYmlvIG9uZSBsaXZlcyAqLworI2RlZmluZSBJRV9PQklPIDB4YzAwMDAKKyNkZWZpbmUgSUVfSVJRIDMKKworLyoKKyAqIHdoZXJlIHRvIGZpbmQgdGhlIFN5c3RlbSBDb25maWd1cmF0aW9uIFBvaW50ZXIgKFNDUCkKKyAqLworI2RlZmluZSBTQ1BfREVGQVVMVF9BRERSRVNTIDB4ZmZmZmY0CisKKworLyoKKyAqIFN5c3RlbSBDb25maWd1cmF0aW9uIFBvaW50ZXIgU3RydWN0CisgKi8KKworc3RydWN0IHNjcF9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgc2hvcnQgemVyb19kdW0wOwkvKiBoYXMgdG8gYmUgemVybyAqLworICB1bnNpZ25lZCBjaGFyICBzeXNidXM7CS8qIDA9MTZCaXQsMT04Qml0ICovCisgIHVuc2lnbmVkIGNoYXIgIHplcm9fZHVtMTsJLyogaGFzIHRvIGJlIHplcm8gZm9yIDU4NiAqLworICB1bnNpZ25lZCBzaG9ydCB6ZXJvX2R1bTI7CisgIHVuc2lnbmVkIHNob3J0IHplcm9fZHVtMzsKKyAgY2hhciAgICAgICAgICAqaXNjcDsJCS8qIHBvaW50ZXIgdG8gdGhlIGlzY3AtYmxvY2sgKi8KK307CisKKworLyoKKyAqIEludGVybWVkaWF0ZSBTeXN0ZW0gQ29uZmlndXJhdGlvbiBQb2ludGVyIChJU0NQKQorICovCitzdHJ1Y3QgaXNjcF9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhciAgYnVzeTsgICAgICAgICAgLyogNTg2IGNsZWFycyBhZnRlciBzdWNjZXNzZnVsIGluaXQgKi8KKyAgdW5zaWduZWQgY2hhciAgemVyb19kdW1teTsgICAgLyogaGFzIHRvIGJlIHplcm8gKi8KKyAgdW5zaWduZWQgc2hvcnQgc2NiX29mZnNldDsgICAgLyogcG9pbnRlcm9mZnNldCB0byB0aGUgc2NiX2Jhc2UgKi8KKyAgY2hhciAgICAgICAgICAqc2NiX2Jhc2U7ICAgICAgLyogYmFzZS1hZGRyZXNzIG9mIGFsbCAxNi1iaXQgb2Zmc2V0cyAqLworfTsKKworLyoKKyAqIFN5c3RlbSBDb250cm9sIEJsb2NrIChTQ0IpCisgKi8KK3N0cnVjdCBzY2Jfc3RydWN0Cit7CisgIHVuc2lnbmVkIGNoYXIgcnVzOworICB1bnNpZ25lZCBjaGFyIGN1czsKKyAgdW5zaWduZWQgY2hhciBjbWRfcnVjOyAgICAgICAgICAgLyogY29tbWFuZCB3b3JkOiBSVSBwYXJ0ICovCisgIHVuc2lnbmVkIGNoYXIgY21kX2N1YzsgICAgICAgICAgIC8qIGNvbW1hbmQgd29yZDogQ1UgcGFydCAmIEFDSyAqLworICB1bnNpZ25lZCBzaG9ydCBjYmxfb2Zmc2V0OyAgICAvKiBwb2ludGVyb2Zmc2V0LCBjb21tYW5kIGJsb2NrIGxpc3QgKi8KKyAgdW5zaWduZWQgc2hvcnQgcmZhX29mZnNldDsgICAgLyogcG9pbnRlcm9mZnNldCwgcmVjZWl2ZSBmcmFtZSBhcmVhICovCisgIHVuc2lnbmVkIHNob3J0IGNyY19lcnJzOyAgICAgIC8qIENSQy1FcnJvciBjb3VudGVyICovCisgIHVuc2lnbmVkIHNob3J0IGFsbl9lcnJzOyAgICAgIC8qIGFsbGlnbm1lbnRlcnJvciBjb3VudGVyICovCisgIHVuc2lnbmVkIHNob3J0IHJzY19lcnJzOyAgICAgIC8qIFJlc291cmNlZXJyb3IgY291bnRlciAqLworICB1bnNpZ25lZCBzaG9ydCBvdnJuX2VycnM7ICAgICAvKiBPVmVycnVuZXJyb3IgY291bnRlciAqLworfTsKKworLyoKKyAqIHBvc3NpYmxlIGNvbW1hbmQgdmFsdWVzIGZvciB0aGUgY29tbWFuZCB3b3JkCisgKi8KKyNkZWZpbmUgUlVDX01BU0sJMHgwMDcwCS8qIG1hc2sgZm9yIFJVIGNvbW1hbmRzICovCisjZGVmaW5lIFJVQ19OT1AJCTB4MDAwMAkvKiBOT1AtY29tbWFuZCAqLworI2RlZmluZSBSVUNfU1RBUlQJMHgwMDEwCS8qIHN0YXJ0IFJVICovCisjZGVmaW5lIFJVQ19SRVNVTUUJMHgwMDIwCS8qIHJlc3VtZSBSVSBhZnRlciBzdXNwZW5kICovCisjZGVmaW5lIFJVQ19TVVNQRU5ECTB4MDAzMAkvKiBzdXNwZW5kIFJVICovCisjZGVmaW5lIFJVQ19BQk9SVAkweDAwNDAJLyogYWJvcnQgcmVjZWl2ZXIgb3BlcmF0aW9uIGltbWVkaWF0ZWx5ICovCisKKyNkZWZpbmUgQ1VDX01BU0sgICAgICAgIDB4MDcgIC8qIG1hc2sgZm9yIENVIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ1VDX05PUCAgICAgICAgIDB4MDAgIC8qIE5PUC1jb21tYW5kICovCisjZGVmaW5lIENVQ19TVEFSVCAgICAgICAweDAxICAvKiBzdGFydCBleGVjdXRpb24gb2YgMS4gY21kIG9uIHRoZSBDQkwgKi8KKyNkZWZpbmUgQ1VDX1JFU1VNRSAgICAgIDB4MDIgIC8qIHJlc3VtZSBhZnRlciBzdXNwZW5kICovCisjZGVmaW5lIENVQ19TVVNQRU5EICAgICAweDAzICAvKiBTdXNwZW5kIENVICovCisjZGVmaW5lIENVQ19BQk9SVCAgICAgICAweDA0ICAvKiBhYm9ydCBjb21tYW5kIG9wZXJhdGlvbiBpbW1lZGlhdGVseSAqLworCisjZGVmaW5lIEFDS19NQVNLICAgICAgICAweGYwICAvKiBtYXNrIGZvciBBQ0sgY29tbWFuZCAqLworI2RlZmluZSBBQ0tfQ1ggICAgICAgICAgMHg4MCAgLyogYWNrbm93bGVkZ2VzIFNUQVRfQ1ggKi8KKyNkZWZpbmUgQUNLX0ZSICAgICAgICAgIDB4NDAgIC8qIGFjay4gU1RBVF9GUiAqLworI2RlZmluZSBBQ0tfQ05BICAgICAgICAgMHgyMCAgLyogYWNrLiBTVEFUX0NOQSAqLworI2RlZmluZSBBQ0tfUk5SICAgICAgICAgMHgxMCAgLyogYWNrLiBTVEFUX1JOUiAqLworCisvKgorICogcG9zc2libGUgc3RhdHVzIHZhbHVlcyBmb3IgdGhlIHN0YXR1cyB3b3JkCisgKi8KKyNkZWZpbmUgU1RBVF9NQVNLICAgICAgIDB4ZjAgIC8qIG1hc2sgZm9yIGNhdXNlIG9mIGludGVycnVwdCAqLworI2RlZmluZSBTVEFUX0NYICAgICAgICAgMHg4MCAgLyogQ1UgZmluaXNoZWQgY21kIHdpdGggaXRzIEkgYml0IHNldCAqLworI2RlZmluZSBTVEFUX0ZSICAgICAgICAgMHg0MCAgLyogUlUgZmluaXNoZWQgcmVjZWl2aW5nIGEgZnJhbWUgKi8KKyNkZWZpbmUgU1RBVF9DTkEgICAgICAgIDB4MjAgIC8qIENVIGxlZnQgYWN0aXZlIHN0YXRlICovCisjZGVmaW5lIFNUQVRfUk5SICAgICAgICAweDEwICAvKiBSVSBsZWZ0IHJlYWR5IHN0YXRlICovCisKKyNkZWZpbmUgQ1VfU1RBVFVTICAgICAgIDB4NyAgIC8qIENVIHN0YXR1cywgMD1pZGxlICovCisjZGVmaW5lIENVX1NVU1BFTkQgICAgICAweDEgICAvKiBDVSBpcyBzdXNwZW5kZWQgKi8KKyNkZWZpbmUgQ1VfQUNUSVZFICAgICAgIDB4MiAgIC8qIENVIGlzIGFjdGl2ZSAqLworCisjZGVmaW5lIFJVX1NUQVRVUwkweDcwCS8qIFJVIHN0YXR1cywgMD1pZGxlICovCisjZGVmaW5lIFJVX1NVU1BFTkQJMHgxMAkvKiBSVSBzdXNwZW5kZWQgKi8KKyNkZWZpbmUgUlVfTk9TUEFDRQkweDIwCS8qIFJVIG5vIHJlc291cmNlcyAqLworI2RlZmluZSBSVV9SRUFEWQkweDQwCS8qIFJVIGlzIHJlYWR5ICovCisKKy8qCisgKiBSZWNlaXZlIEZyYW1lIERlc2NyaXB0b3IgKFJGRCkKKyAqLworc3RydWN0IHJmZF9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgY2hhciAgc3RhdF9sb3c7CS8qIHN0YXR1cyB3b3JkICovCisgIHVuc2lnbmVkIGNoYXIgIHN0YXRfaGlnaDsJLyogc3RhdHVzIHdvcmQgKi8KKyAgdW5zaWduZWQgY2hhciAgcmZkX3NmOwkvKiA4MjU5NiBtb2RlIG9ubHkgKi8KKyAgdW5zaWduZWQgY2hhciAgbGFzdDsJCS8qIEJpdDE1LExhc3QgRnJhbWUgb24gTGlzdCAvIEJpdDE0LHN1c3BlbmQgKi8KKyAgdW5zaWduZWQgc2hvcnQgbmV4dDsJCS8qIGxpbmtvZmZzZXQgdG8gbmV4dCBSRkQgKi8KKyAgdW5zaWduZWQgc2hvcnQgcmJkX29mZnNldDsJLyogcG9pbnRlcm9mZnNldCB0byBSQkQtYnVmZmVyICovCisgIHVuc2lnbmVkIGNoYXIgIGRlc3RbNl07CS8qIGV0aGVybmV0LWFkZHJlc3MsIGRlc3RpbmF0aW9uICovCisgIHVuc2lnbmVkIGNoYXIgIHNvdXJjZVs2XTsJLyogZXRoZXJuZXQtYWRkcmVzcywgc291cmNlICovCisgIHVuc2lnbmVkIHNob3J0IGxlbmd0aDsJLyogODAyLjMgZnJhbWUtbGVuZ3RoICovCisgIHVuc2lnbmVkIHNob3J0IHplcm9fZHVtbXk7CS8qIGR1bW15ICovCit9OworCisjZGVmaW5lIFJGRF9MQVNUICAgICAweDgwCS8qIGxhc3Q6IGxhc3QgcmZkIGluIHRoZSBsaXN0ICovCisjZGVmaW5lIFJGRF9TVVNQICAgICAweDQwCS8qIGxhc3Q6IHN1c3BlbmQgUlUgYWZ0ZXIgICovCisjZGVmaW5lIFJGRF9DT01QTCAgICAweDgwCisjZGVmaW5lIFJGRF9PSyAgICAgICAweDIwCisjZGVmaW5lIFJGRF9CVVNZICAgICAweDQwCisjZGVmaW5lIFJGRF9FUlJfTEVOICAweDEwICAgICAvKiBMZW5ndGggZXJyb3IgKGlmIGVuYWJsZWQgbGVuZ3RoLWNoZWNraW5nICovCisjZGVmaW5lIFJGRF9FUlJfQ1JDICAweDA4ICAgICAvKiBDUkMgZXJyb3IgKi8KKyNkZWZpbmUgUkZEX0VSUl9BTEdOIDB4MDQgICAgIC8qIEFsaWdubWVudCBlcnJvciAqLworI2RlZmluZSBSRkRfRVJSX1JOUiAgMHgwMiAgICAgLyogc3RhdHVzOiByZWNlaXZlciBvdXQgb2YgcmVzb3VyY2VzICovCisjZGVmaW5lIFJGRF9FUlJfT1ZSICAweDAxICAgICAvKiBETUEgT3ZlcnJ1biEgKi8KKworI2RlZmluZSBSRkRfRVJSX0ZUUyAgMHgwMDgwCS8qIEZyYW1lIHRvIHNob3J0ICovCisjZGVmaW5lIFJGRF9FUlJfTkVPUCAweDAwNDAJLyogTm8gRU9QIGZsYWcgKGZvciBiaXRzdHVmZmluZyBvbmx5KSAqLworI2RlZmluZSBSRkRfRVJSX1RSVU4gMHgwMDIwCS8qICg4MjU5NiBvbmx5L1NGIG1vZGUpIGluZGljYXRlcyB0cnVuY2F0ZWQgZnJhbWUgKi8KKyNkZWZpbmUgUkZEX01BVENIQUREIDB4MDAwMiAgICAgLyogc3RhdHVzOiBEZXN0aW5hdGlvbmFkZHJlc3MgIW1hdGNoZXMgSUEgKG9ubHkgODI1OTYpICovCisjZGVmaW5lIFJGRF9DT0xMREVUICAweDAwMDEJLyogRGV0ZWN0ZWQgY29sbGlzaW9uIGR1cmluZyByZWNlcHRpb24gKi8KKworLyoKKyAqIFJlY2VpdmUgQnVmZmVyIERlc2NyaXB0b3IgKFJCRCkKKyAqLworc3RydWN0IHJiZF9zdHJ1Y3QgCit7CisgIHVuc2lnbmVkIHNob3J0IHN0YXR1czsJLyogc3RhdHVzIHdvcmQsbnVtYmVyIG9mIHVzZWQgYnl0ZXMgaW4gYnVmZiAqLworICB1bnNpZ25lZCBzaG9ydCBuZXh0OwkJLyogcG9pbnRlcm9mZnNldCB0byBuZXh0IFJCRCAqLworICBjaGFyICAgICAgICAgICpidWZmZXI7CS8qIHJlY2VpdmUgYnVmZmVyIGFkZHJlc3MgcG9pbnRlciAqLworICB1bnNpZ25lZCBzaG9ydCBzaXplOwkJLyogc2l6ZSBvZiB0aGlzIGJ1ZmZlciAqLworICB1bnNpZ25lZCBzaG9ydCB6ZXJvX2R1bW15OyAgICAvKiBkdW1teSAqLworfTsKKworI2RlZmluZSBSQkRfTEFTVAkweDgwMDAJLyogbGFzdCBidWZmZXIgKi8KKyNkZWZpbmUgUkJEX1VTRUQJMHg0MDAwCS8qIHRoaXMgYnVmZmVyIGhhcyBkYXRhICovCisjZGVmaW5lIFJCRF9NQVNLCTB4M2ZmZgkvKiBzaXplLW1hc2sgZm9yIGxlbmd0aCAqLworCisvKgorICogU3RhdHVzdmFsdWVzIGZvciBDb21tYW5kcy9SRkQKKyAqLworI2RlZmluZSBTVEFUX0NPTVBMICAgMHg4MDAwCS8qIHN0YXR1czogZnJhbWUvY29tbWFuZCBpcyBjb21wbGV0ZSAqLworI2RlZmluZSBTVEFUX0JVU1kgICAgMHg0MDAwCS8qIHN0YXR1czogZnJhbWUvY29tbWFuZCBpcyBidXN5ICovCisjZGVmaW5lIFNUQVRfT0sgICAgICAweDIwMDAJLyogc3RhdHVzOiBmcmFtZS9jb21tYW5kIGlzIG9rICovCisKKy8qCisgKiBBY3Rpb24tQ29tbWFuZHMKKyAqLworI2RlZmluZSBDTURfTk9QCQkweDAwMDAJLyogTk9QICovCisjZGVmaW5lIENNRF9JQVNFVFVQCTB4MDAwMQkvKiBpbml0aWFsIGFkZHJlc3Mgc2V0dXAgY29tbWFuZCAqLworI2RlZmluZSBDTURfQ09ORklHVVJFCTB4MDAwMgkvKiBjb25maWd1cmUgY29tbWFuZCAqLworI2RlZmluZSBDTURfTUNTRVRVUAkweDAwMDMJLyogTUMgc2V0dXAgY29tbWFuZCAqLworI2RlZmluZSBDTURfWE1JVAkweDAwMDQJLyogdHJhbnNtaXQgY29tbWFuZCAqLworI2RlZmluZSBDTURfVERSCQkweDAwMDUJLyogdGltZSBkb21haW4gcmVmbGVjdG9tZXRlciAoVERSKSBjb21tYW5kICovCisjZGVmaW5lIENNRF9EVU1QCTB4MDAwNgkvKiBkdW1wIGNvbW1hbmQgKi8KKyNkZWZpbmUgQ01EX0RJQUdOT1NFCTB4MDAwNwkvKiBkaWFnbm9zZSBjb21tYW5kICovCisKKy8qCisgKiBBY3Rpb24gY29tbWFuZCBiaXRzCisgKi8KKyNkZWZpbmUgQ01EX0xBU1QJMHg4MDAwCS8qIGluZGljYXRlcyBsYXN0IGNvbW1hbmQgaW4gdGhlIENCTCAqLworI2RlZmluZSBDTURfU1VTUEVORAkweDQwMDAJLyogc3VzcGVuZCBDVSBhZnRlciB0aGlzIENCICovCisjZGVmaW5lIENNRF9JTlQJCTB4MjAwMAkvKiBnZW5lcmF0ZSBpbnRlcnJ1cHQgYWZ0ZXIgZXhlY3V0aW9uICovCisKKy8qCisgKiBOT1AgLSBjb21tYW5kCisgKi8KK3N0cnVjdCBub3BfY21kX3N0cnVjdAoreworICB1bnNpZ25lZCBzaG9ydCBjbWRfc3RhdHVzOwkvKiBzdGF0dXMgb2YgdGhpcyBjb21tYW5kICovCisgIHVuc2lnbmVkIHNob3J0IGNtZF9jbWQ7ICAgICAgIC8qIHRoZSBjb21tYW5kIGl0c2VsZiAoK2JpdHMpICovCisgIHVuc2lnbmVkIHNob3J0IGNtZF9saW5rOyAgICAgIC8qIG9mZnNldHBvaW50ZXIgdG8gbmV4dCBjb21tYW5kICovCit9OworCisvKgorICogSUEgU2V0dXAgY29tbWFuZAorICovCitzdHJ1Y3QgaWFzZXR1cF9jbWRfc3RydWN0IAoreworICB1bnNpZ25lZCBzaG9ydCBjbWRfc3RhdHVzOworICB1bnNpZ25lZCBzaG9ydCBjbWRfY21kOworICB1bnNpZ25lZCBzaG9ydCBjbWRfbGluazsKKyAgdW5zaWduZWQgY2hhciAgaWFkZHJbNl07Cit9OworCisvKgorICogQ29uZmlndXJlIGNvbW1hbmQgCisgKi8KK3N0cnVjdCBjb25maWd1cmVfY21kX3N0cnVjdAoreworICB1bnNpZ25lZCBzaG9ydCBjbWRfc3RhdHVzOworICB1bnNpZ25lZCBzaG9ydCBjbWRfY21kOworICB1bnNpZ25lZCBzaG9ydCBjbWRfbGluazsKKyAgdW5zaWduZWQgY2hhciAgYnl0ZV9jbnQ7ICAgLyogc2l6ZSBvZiB0aGUgY29uZmlnLWNtZCAqLworICB1bnNpZ25lZCBjaGFyICBmaWZvOyAgICAgICAvKiBmaWZvL3JlY3YgbW9uaXRvciAqLworICB1bnNpZ25lZCBjaGFyICBzYXZfYmY7ICAgICAvKiBzYXZlIGJhZCBmcmFtZXMgKGJpdDc9MSkqLworICB1bnNpZ25lZCBjaGFyICBhZHJfbGVuOyAgICAvKiBhZHJfbGVuKDAtMiksYWxfbG9jKDMpLHByZWFtKDQtNSksbG9vcGJhayg2LTcpKi8KKyAgdW5zaWduZWQgY2hhciAgcHJpb3JpdHk7ICAgLyogbGluX3ByaW8oMC0yKSxleHBfcHJpbyg0LTYpLGJvZl9tZXRkKDcpICovCisgIHVuc2lnbmVkIGNoYXIgIGlmczsgICAgICAgIC8qIGludGVyIGZyYW1lIHNwYWNpbmcgKi8KKyAgdW5zaWduZWQgY2hhciAgdGltZV9sb3c7ICAgLyogc2xvdCB0aW1lIGxvdyAqLworICB1bnNpZ25lZCBjaGFyICB0aW1lX2hpZ2g7ICAvKiBzbG90IHRpbWUgaGlnaCgwLTIpIGFuZCBtYXguIHJldHJpZXMoNC03KSAqLworICB1bnNpZ25lZCBjaGFyICBwcm9taXNjOyAgICAvKiBwcm9taXNjLW1vZGUoMCkgLCBldCBhbCAoMS03KSAqLworICB1bnNpZ25lZCBjaGFyICBjYXJyX2NvbGw7ICAvKiBjYXJyaWVyKDAtMykvY29sbGlzaW9uKDQtNykgc3R1ZmYgKi8KKyAgdW5zaWduZWQgY2hhciAgZnJhbV9sZW47ICAgLyogbWluaW1hbCBmcmFtZSBsZW4gKi8KKyAgdW5zaWduZWQgY2hhciAgZHVtbXk7CSAgICAgLyogZHVtbXkgKi8KK307CisKKy8qCisgKiBNdWx0aWNhc3QgU2V0dXAgY29tbWFuZCAKKyAqLworc3RydWN0IG1jc2V0dXBfY21kX3N0cnVjdCAKK3sKKyAgdW5zaWduZWQgc2hvcnQgY21kX3N0YXR1czsKKyAgdW5zaWduZWQgc2hvcnQgY21kX2NtZDsKKyAgdW5zaWduZWQgc2hvcnQgY21kX2xpbms7CisgIHVuc2lnbmVkIHNob3J0IG1jX2NudDsJCS8qIG51bWJlciBvZiBieXRlcyBpbiB0aGUgTUMtTGlzdCAqLworICB1bnNpZ25lZCBjaGFyICBtY19saXN0WzBdWzZdOyAgCS8qIHBvaW50ZXIgdG8gNiBieXRlcyBlbnRyaWVzICovCit9OworCisvKgorICogRFVNUCBjb21tYW5kCisgKi8KK3N0cnVjdCBkdW1wX2NtZF9zdHJ1Y3QKK3sKKyAgdW5zaWduZWQgc2hvcnQgY21kX3N0YXR1czsKKyAgdW5zaWduZWQgc2hvcnQgY21kX2NtZDsKKyAgdW5zaWduZWQgc2hvcnQgY21kX2xpbms7CisgIHVuc2lnbmVkIHNob3J0IGR1bXBfb2Zmc2V0OyAgICAvKiBwb2ludGVyb2Zmc2V0IHRvIERVTVAgc3BhY2UgKi8KK307CisKKy8qCisgKiB0cmFuc21pdCBjb21tYW5kIAorICovCitzdHJ1Y3QgdHJhbnNtaXRfY21kX3N0cnVjdCAKK3sKKyAgdW5zaWduZWQgc2hvcnQgY21kX3N0YXR1czsKKyAgdW5zaWduZWQgc2hvcnQgY21kX2NtZDsKKyAgdW5zaWduZWQgc2hvcnQgY21kX2xpbms7CisgIHVuc2lnbmVkIHNob3J0IHRiZF9vZmZzZXQ7CS8qIHBvaW50ZXJvZmZzZXQgdG8gVEJEICovCisgIHVuc2lnbmVkIGNoYXIgIGRlc3RbNl07ICAgICAgIC8qIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIGZyYW1lICovCisgIHVuc2lnbmVkIHNob3J0IGxlbmd0aDsJLyogdXNlciBkZWZpbmVkOiA4MDIuMyBsZW5ndGggLyBFdGhlciB0eXBlICovCit9OworCisjZGVmaW5lIFRDTURfRVJSTUFTSyAgICAgMHgwZmEwCisjZGVmaW5lIFRDTURfTUFYQ09MTE1BU0sgMHgwMDBmCisjZGVmaW5lIFRDTURfTUFYQ09MTCAgICAgMHgwMDIwCisjZGVmaW5lIFRDTURfSEVBUlRCRUFUICAgMHgwMDQwCisjZGVmaW5lIFRDTURfREVGRVJSRUQgICAgMHgwMDgwCisjZGVmaW5lIFRDTURfVU5ERVJSVU4gICAgMHgwMTAwCisjZGVmaW5lIFRDTURfTE9TVENUUyAgICAgMHgwMjAwCisjZGVmaW5lIFRDTURfTk9DQVJSSUVSICAgMHgwNDAwCisjZGVmaW5lIFRDTURfTEFURUNPTEwgICAgMHgwODAwCisKK3N0cnVjdCB0ZHJfY21kX3N0cnVjdAoreworICB1bnNpZ25lZCBzaG9ydCBjbWRfc3RhdHVzOworICB1bnNpZ25lZCBzaG9ydCBjbWRfY21kOworICB1bnNpZ25lZCBzaG9ydCBjbWRfbGluazsKKyAgdW5zaWduZWQgc2hvcnQgc3RhdHVzOworfTsKKworI2RlZmluZSBURFJfTE5LX09LCTB4ODAwMAkvKiBObyBsaW5rIHByb2JsZW0gaWRlbnRpZmllZCAqLworI2RlZmluZSBURFJfWENWUl9QUkIJMHg0MDAwCS8qIGluZGljYXRlcyBhIHRyYW5zY2VpdmVyIHByb2JsZW0gKi8KKyNkZWZpbmUgVERSX0VUX09QTgkweDIwMDAJLyogb3Blbiwgbm8gY29ycmVjdCB0ZXJtaW5hdGlvbiAqLworI2RlZmluZSBURFJfRVRfU1JUCTB4MTAwMAkvKiBURFIgZGV0ZWN0ZWQgYSBzaG9ydCBjaXJjdWl0ICovCisjZGVmaW5lIFREUl9USU1FTUFTSwkweDA3ZmYJLyogbWFzayBmb3IgdGhlIHRpbWUgZmllbGQgKi8KKworLyoKKyAqIFRyYW5zbWl0IEJ1ZmZlciBEZXNjcmlwdG9yIChUQkQpCisgKi8KK3N0cnVjdCB0YmRfc3RydWN0Cit7CisgIHVuc2lnbmVkIHNob3J0IHNpemU7CQkvKiBzaXplICsgRU9GLUZsYWcoMTUpICovCisgIHVuc2lnbmVkIHNob3J0IG5leHQ7ICAgICAgICAgIC8qIHBvaW50ZXJvZmZzZXQgdG8gbmV4dCBUQkQgKi8KKyAgY2hhciAgICAgICAgICAqYnVmZmVyOyAgICAgICAgLyogcG9pbnRlciB0byBidWZmZXIgKi8KK307CisKKyNkZWZpbmUgVEJEX0xBU1QgMHg4MDAwICAgICAgICAgLyogRU9GLUZsYWcsIGluZGljYXRlcyBsYXN0IGJ1ZmZlciBpbiBsaXN0ICovCisKKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bjNsYW5jZS5jIGIvZHJpdmVycy9uZXQvc3VuM2xhbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY0M2JiZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3N1bjNsYW5jZS5jCkBAIC0wLDAgKzEsOTY1IEBACisvKiBzdW4zbGFuY2UuYzogRXRoZXJuZXQgZHJpdmVyIGZvciBTVU4zIExhbmNlIGNoaXAgKi8KKy8qCisKKyAgU3VuMyBMYW5jZSBldGhlcm5ldCBkcml2ZXIsIGJ5IFNhbSBDcmVhc2V5IChzYW1teUB1c2Vycy5xdWFsLm5ldCkuICAKKyAgVGhpcyBkcml2ZXIgaXMgYSBwYXJ0IG9mIHRoZSBsaW51eCBrZXJuZWwsIGFuZCBpcyB0aHVzIGRpc3RyaWJ1dGVkCisgIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAgCisgIFRoZSB2YWx1ZXMgdXNlZCBpbiBMQU5DRV9PQklPIGFuZCBMQU5DRV9JUlEgc2VlbSB0byBiZSBlbXBpcmljYWxseQorICB0cnVlIGZvciB0aGUgY29ycmVjdCBJUlEgYW5kIGFkZHJlc3Mgb2YgdGhlIGxhbmNlIHJlZ2lzdGVycy4gIFRoZXkKKyAgaGF2ZSBub3QgYmVlbiB3aWRlbHkgdGVzdGVkLCBob3dldmVyLiAgV2hhdCB3ZSBwcm9iYWJseSBuZWVkIGlzIGEKKyAgInByb3BlciIgd2F5IHRvIHNlYXJjaCBmb3IgYSBkZXZpY2UgaW4gdGhlIHN1bjMncyBwcm9tLCBidXQsIGFsYXMsCisgIGxpbnV4IGhhcyBubyBzdWNoIHRoaW5nLiAgCisKKyAgVGhpcyBkcml2ZXIgaXMgbGFyZ2VseSBiYXNlZCBvbiBhdGFyaWxhbmNlLmMsIGJ5IFJvbWFuIEhvZGVrLiAgT3RoZXIKKyAgc291cmNlcyBvZiBpbnNwaXJhdGlvbiB3ZXJlIHRoZSBOZXRCU0Qgc3VuMyBhbTc5OTAgZHJpdmVyLCBhbmQgdGhlCisgIGxpbnV4IHNwYXJjIGxhbmNlIGRyaXZlciAoc3VubGFuY2UuYykuICAKKworICBUaGVyZSBhcmUgbW9yZSBhc3N1bXB0aW9ucyBtYWRlIHRocm91Z2hvdXQgdGhpcyBkcml2ZXIsIGl0IGFsbW9zdAorICBjZXJ0YWlubHkgc3RpbGwgbmVlZHMgd29yaywgYnV0IGl0IGRvZXMgd29yayBhdCBsZWFzdCBmb3IgUkFSUC9CT09UUCBhbmQKKyAgbW91bnRpbmcgdGhlIHJvb3QgTkZTIGZpbGVzeXN0ZW0uCisgIAorKi8KKworc3RhdGljIGNoYXIgKnZlcnNpb24gPSAic3VuM2xhbmNlLmM6IHYxLjIgMS8xMi8yMDAxICBTYW0gQ3JlYXNleSAoc2FtbXlAc2FtbXkubmV0KVxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vZHZtYS5oPgorI2luY2x1ZGUgPGFzbS9pZHByb20uaD4KKyNpbmNsdWRlIDxhc20vbWFjaGluZXMuaD4KKworI2lmZGVmIENPTkZJR19TVU4zCisjaW5jbHVkZSA8YXNtL3N1bjNtbXUuaD4KKyNlbHNlCisjaW5jbHVkZSA8YXNtL3N1bjN4cHJvbS5oPgorI2VuZGlmCisKKy8qIHN1bjMvNjAgYWRkci9pcnEgZm9yIHRoZSBsYW5jZSBjaGlwLiAgSWYgeW91ciBzdW4gaXMgZGlmZmVyZW50LAorICAgY2hhbmdlIHRoaXMuICovCisjZGVmaW5lIExBTkNFX09CSU8gMHgxMjAwMDAKKyNkZWZpbmUgTEFOQ0VfSVJRIElSUTMKKworLyogRGVidWcgbGV2ZWw6CisgKiAgMCA9IHNpbGVudCwgcHJpbnQgb25seSBzZXJpb3VzIGVycm9ycworICogIDEgPSBub3JtYWwsIHByaW50IGVycm9yIG1lc3NhZ2VzCisgKiAgMiA9IGRlYnVnLCBwcmludCBkZWJ1ZyBpbmZvcworICogIDMgPSBkZWJ1ZywgcHJpbnQgZXZlbiBtb3JlIGRlYnVnIGluZm9zIChwYWNrZXQgZGF0YSkKKyAqLworCisjZGVmaW5lCUxBTkNFX0RFQlVHCTAKKworI2lmZGVmIExBTkNFX0RFQlVHCitzdGF0aWMgaW50IGxhbmNlX2RlYnVnID0gTEFOQ0VfREVCVUc7CisjZWxzZQorc3RhdGljIGludCBsYW5jZV9kZWJ1ZyA9IDE7CisjZW5kaWYKK01PRFVMRV9QQVJNKGxhbmNlX2RlYnVnLCAiaSIpOworTU9EVUxFX1BBUk1fREVTQyhsYW5jZV9kZWJ1ZywgIlNVTjMgTGFuY2UgZGVidWcgbGV2ZWwgKDAtMykiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZQlEUFJJTlRLKG4sYSkgXAorCWRvIHsgIFwKKwkJaWYgKGxhbmNlX2RlYnVnID49IG4pICBcCisJCQlwcmludGsgYTsgXAorCX0gd2hpbGUoIDAgKQorCisKKy8qIHdlJ3JlIG9ubHkgdXNpbmcgMzJrIG9mIG1lbW9yeSwgc28gd2UgdXNlIDQgVFgKKyAgIGJ1ZmZlcnMgYW5kIDE2IFJYIGJ1ZmZlcnMuICBUaGVzZSB2YWx1ZXMgYXJlIGV4cHJlc3NlZCBhcyBsb2cyLiAqLworCisjZGVmaW5lIFRYX0xPR19SSU5HX1NJWkUJCQkzCisjZGVmaW5lIFJYX0xPR19SSU5HX1NJWkUJCQk1CisKKy8qIFRoZXNlIGFyZSB0aGUgZGVyaXZlZCB2YWx1ZXMgKi8KKworI2RlZmluZSBUWF9SSU5HX1NJWkUJCQkoMSA8PCBUWF9MT0dfUklOR19TSVpFKQorI2RlZmluZSBUWF9SSU5HX0xFTl9CSVRTCQkoVFhfTE9HX1JJTkdfU0laRSA8PCA1KQorI2RlZmluZQlUWF9SSU5HX01PRF9NQVNLCQkoVFhfUklOR19TSVpFIC0gMSkKKworI2RlZmluZSBSWF9SSU5HX1NJWkUJCQkoMSA8PCBSWF9MT0dfUklOR19TSVpFKQorI2RlZmluZSBSWF9SSU5HX0xFTl9CSVRTCQkoUlhfTE9HX1JJTkdfU0laRSA8PCA1KQorI2RlZmluZQlSWF9SSU5HX01PRF9NQVNLCQkoUlhfUklOR19TSVpFIC0gMSkKKworLyogRGVmaW5pdGlvbnMgZm9yIHBhY2tldCBidWZmZXIgYWNjZXNzOiAqLworI2RlZmluZSBQS1RfQlVGX1NaCQkxNTQ0CisKKy8qIEdldCB0aGUgYWRkcmVzcyBvZiBhIHBhY2tldCBidWZmZXIgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIGJ1ZmZlciBoZWFkICovCisjZGVmaW5lCVBLVEJVRl9BRERSKGhlYWQpCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShNRU0pIHwgKGhlYWQpLT5iYXNlKQorCisKKy8qIFRoZSBMQU5DRSBSeCBhbmQgVHggcmluZyBkZXNjcmlwdG9ycy4gKi8KK3N0cnVjdCBsYW5jZV9yeF9oZWFkIHsKKwl1bnNpZ25lZCBzaG9ydAliYXNlOwkJLyogTG93IHdvcmQgb2YgYmFzZSBhZGRyICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhcglmbGFnOworCXVuc2lnbmVkIGNoYXIgIGJhc2VfaGk7CS8qIEhpZ2ggd29yZCBvZiBiYXNlIGFkZHIgKHVudXNlZCkgKi8KKwlzaG9ydCBidWZfbGVuZ3RoOwkvKiBUaGlzIGxlbmd0aCBpcyAycyBjb21wbGVtZW50ISAqLworCXZvbGF0aWxlIHNob3J0IG1zZ19sZW5ndGg7CS8qIFRoaXMgbGVuZ3RoIGlzICJub3JtYWwiLiAqLworfTsKKworc3RydWN0IGxhbmNlX3R4X2hlYWQgeworCXVuc2lnbmVkIHNob3J0IGJhc2U7CQkvKiBMb3cgd29yZCBvZiBiYXNlIGFkZHIgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCWZsYWc7CisJdW5zaWduZWQgY2hhciBiYXNlX2hpOwkvKiBIaWdoIHdvcmQgb2YgYmFzZSBhZGRyICh1bnVzZWQpICovCisJc2hvcnQgbGVuZ3RoOwkJLyogTGVuZ3RoIGlzIDJzIGNvbXBsZW1lbnQhICovCisJdm9sYXRpbGUgc2hvcnQgbWlzYzsKK307CisKKy8qIFRoZSBMQU5DRSBpbml0aWFsaXphdGlvbiBibG9jaywgZGVzY3JpYmVkIGluIGRhdGFib29rLiAqLworc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgeworCXVuc2lnbmVkIHNob3J0CW1vZGU7CQkvKiBQcmUtc2V0IG1vZGUgKi8KKwl1bnNpZ25lZCBjaGFyCWh3YWRkcls2XTsJLyogUGh5c2ljYWwgZXRoZXJuZXQgYWRkcmVzcyAqLworCXVuc2lnbmVkIGludCAgICBmaWx0ZXJbMl07CS8qIE11bHRpY2FzdCBmaWx0ZXIgKHVudXNlZCkuICovCisJLyogUmVjZWl2ZSBhbmQgdHJhbnNtaXQgcmluZyBiYXNlLCBhbG9uZyB3aXRoIGxlbmd0aCBiaXRzLiAqLworCXVuc2lnbmVkIHNob3J0IHJkcmE7CisJdW5zaWduZWQgc2hvcnQgcmxlbjsKKwl1bnNpZ25lZCBzaG9ydCB0ZHJhOworCXVuc2lnbmVkIHNob3J0IHRsZW47CisJdW5zaWduZWQgc2hvcnQgcGFkWzRdOyAvKiBpcyB0aGllIG5lZWRlZD8gKi8KK307CisKKy8qIFRoZSB3aG9sZSBsYXlvdXQgb2YgdGhlIExhbmNlIHNoYXJlZCBtZW1vcnkgKi8KK3N0cnVjdCBsYW5jZV9tZW1vcnkgeworCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrCWluaXQ7CisJc3RydWN0IGxhbmNlX3R4X2hlYWQJdHhfaGVhZFtUWF9SSU5HX1NJWkVdOworCXN0cnVjdCBsYW5jZV9yeF9oZWFkCXJ4X2hlYWRbUlhfUklOR19TSVpFXTsKKwljaGFyICAgcnhfZGF0YVtSWF9SSU5HX1NJWkVdW1BLVF9CVUZfU1pdOworCWNoYXIgICB0eF9kYXRhW1RYX1JJTkdfU0laRV1bUEtUX0JVRl9TWl07Cit9OworCisvKiBUaGUgZHJpdmVyJ3MgcHJpdmF0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisKK3N0cnVjdCBsYW5jZV9wcml2YXRlIHsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydAkqaW9iYXNlOworCXN0cnVjdCBsYW5jZV9tZW1vcnkJKm1lbTsKKyAgICAgCWludCBuZXdfcngsIG5ld190eDsJLyogVGhlIG5leHQgZnJlZSByaW5nIGVudHJ5ICovCisJaW50IG9sZF90eCwgb2xkX3J4OyAgICAgLyogcmluZyBlbnRyeSB0byBiZSBwcm9jZXNzZWQgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKy8qIFRoZXNlIHR3byBtdXN0IGJlIGxvbmdzIGZvciBzZXRfYml0KCkgKi8KKwlsb25nCSAgICB0eF9mdWxsOworCWxvbmcJICAgIGxvY2s7Cit9OworCisvKiBJL08gcmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyAqLworCisjZGVmaW5lCU1FTQlscC0+bWVtCisjZGVmaW5lCURSRUcJbHAtPmlvYmFzZVswXQorI2RlZmluZQlBUkVHCWxwLT5pb2Jhc2VbMV0KKyNkZWZpbmUJUkVHQShhKQkoIEFSRUcgPSAoYSksIERSRUcgKQorCisvKiBEZWZpbml0aW9ucyBmb3IgdGhlIExhbmNlICovCisKKy8qIHR4X2hlYWQgZmxhZ3MgKi8KKyNkZWZpbmUgVE1EMV9FTlAJCTB4MDEJLyogZW5kIG9mIHBhY2tldCAqLworI2RlZmluZSBUTUQxX1NUUAkJMHgwMgkvKiBzdGFydCBvZiBwYWNrZXQgKi8KKyNkZWZpbmUgVE1EMV9ERUYJCTB4MDQJLyogZGVmZXJyZWQgKi8KKyNkZWZpbmUgVE1EMV9PTkUJCTB4MDgJLyogb25lIHJldHJ5IG5lZWRlZCAqLworI2RlZmluZSBUTUQxX01PUkUJCTB4MTAJLyogbW9yZSB0aGFuIG9uZSByZXRyeSBuZWVkZWQgKi8KKyNkZWZpbmUgVE1EMV9FUlIJCTB4NDAJLyogZXJyb3Igc3VtbWFyeSAqLworI2RlZmluZSBUTUQxX09XTiAJCTB4ODAJLyogb3duZXJzaGlwIChzZXQ6IGNoaXAgb3ducykgKi8KKworI2RlZmluZSBUTUQxX09XTl9DSElQCVRNRDFfT1dOCisjZGVmaW5lIFRNRDFfT1dOX0hPU1QJMAorCisvKiB0eF9oZWFkIG1pc2MgZmllbGQgKi8KKyNkZWZpbmUgVE1EM19URFIJCTB4MDNGRgkvKiBUaW1lIERvbWFpbiBSZWZsZWN0b21ldHJ5IGNvdW50ZXIgKi8KKyNkZWZpbmUgVE1EM19SVFJZCQkweDA0MDAJLyogZmFpbGVkIGFmdGVyIDE2IHJldHJpZXMgKi8KKyNkZWZpbmUgVE1EM19MQ0FSCQkweDA4MDAJLyogY2FycmllciBsb3N0ICovCisjZGVmaW5lIFRNRDNfTENPTAkJMHgxMDAwCS8qIGxhdGUgY29sbGlzaW9uICovCisjZGVmaW5lIFRNRDNfVUZMTwkJMHg0MDAwCS8qIHVuZGVyZmxvdyAobGF0ZSBtZW1vcnkpICovCisjZGVmaW5lIFRNRDNfQlVGRgkJMHg4MDAwCS8qIGJ1ZmZlcmluZyBlcnJvciAobm8gRU5QKSAqLworCisvKiByeF9oZWFkIGZsYWdzICovCisjZGVmaW5lIFJNRDFfRU5QCQkweDAxCS8qIGVuZCBvZiBwYWNrZXQgKi8KKyNkZWZpbmUgUk1EMV9TVFAJCTB4MDIJLyogc3RhcnQgb2YgcGFja2V0ICovCisjZGVmaW5lIFJNRDFfQlVGRgkJMHgwNAkvKiBidWZmZXIgZXJyb3IgKi8KKyNkZWZpbmUgUk1EMV9DUkMJCTB4MDgJLyogQ1JDIGVycm9yICovCisjZGVmaW5lIFJNRDFfT0ZMTwkJMHgxMAkvKiBvdmVyZmxvdyAqLworI2RlZmluZSBSTUQxX0ZSQU0JCTB4MjAJLyogZnJhbWluZyBlcnJvciAqLworI2RlZmluZSBSTUQxX0VSUgkJMHg0MAkvKiBlcnJvciBzdW1tYXJ5ICovCisjZGVmaW5lIFJNRDFfT1dOIAkJMHg4MAkvKiBvd25lcnNoaXAgKHNldDogc2hpcCBvd25zKSAqLworCisjZGVmaW5lIFJNRDFfT1dOX0NISVAJUk1EMV9PV04KKyNkZWZpbmUgUk1EMV9PV05fSE9TVAkwCisKKy8qIHJlZ2lzdGVyIG5hbWVzICovCisjZGVmaW5lIENTUjAJMAkJLyogbW9kZS9zdGF0dXMgKi8KKyNkZWZpbmUgQ1NSMQkxCQkvKiBpbml0IGJsb2NrIGFkZHIgKGxvdykgKi8KKyNkZWZpbmUgQ1NSMgkyCQkvKiBpbml0IGJsb2NrIGFkZHIgKGhpZ2gpICovCisjZGVmaW5lIENTUjMJMwkJLyogbWlzYyAqLworI2RlZmluZSBDU1I4CTgJICAJLyogYWRkcmVzcyBmaWx0ZXIgKi8KKyNkZWZpbmUgQ1NSMTUJMTUJCS8qIHByb21pc2N1b3VzIG1vZGUgKi8KKworLyogQ1NSMCAqLworLyogKFI9cmVhZGFibGUsIFc9d3JpdGVhYmxlLCBTPXNldCBvbiB3cml0ZSwgQz1jbGVhciBvbiB3cml0ZSkgKi8KKyNkZWZpbmUgQ1NSMF9JTklUCTB4MDAwMQkJLyogaW5pdGlhbGl6ZSAoUlMpICovCisjZGVmaW5lIENTUjBfU1RSVAkweDAwMDIJCS8qIHN0YXJ0IChSUykgKi8KKyNkZWZpbmUgQ1NSMF9TVE9QCTB4MDAwNAkJLyogc3RvcCAoUlMpICovCisjZGVmaW5lIENTUjBfVERNRAkweDAwMDgJCS8qIHRyYW5zbWl0IGRlbWFuZCAoUlMpICovCisjZGVmaW5lIENTUjBfVFhPTgkweDAwMTAJCS8qIHRyYW5zbWl0dGVyIG9uIChSKSAqLworI2RlZmluZSBDU1IwX1JYT04JMHgwMDIwCQkvKiByZWNlaXZlciBvbiAoUikgKi8KKyNkZWZpbmUgQ1NSMF9JTkVBCTB4MDA0MAkJLyogaW50ZXJydXB0IGVuYWJsZSAoUlcpICovCisjZGVmaW5lIENTUjBfSU5UUgkweDAwODAJCS8qIGludGVycnVwdCBhY3RpdmUgKFIpICovCisjZGVmaW5lIENTUjBfSURPTgkweDAxMDAJCS8qIGluaXRpYWxpemF0aW9uIGRvbmUgKFJDKSAqLworI2RlZmluZSBDU1IwX1RJTlQJMHgwMjAwCQkvKiB0cmFuc21pdHRlciBpbnRlcnJ1cHQgKFJDKSAqLworI2RlZmluZSBDU1IwX1JJTlQJMHgwNDAwCQkvKiByZWNlaXZlciBpbnRlcnJ1cHQgKFJDKSAqLworI2RlZmluZSBDU1IwX01FUlIJMHgwODAwCQkvKiBtZW1vcnkgZXJyb3IgKFJDKSAqLworI2RlZmluZSBDU1IwX01JU1MJMHgxMDAwCQkvKiBtaXNzZWQgZnJhbWUgKFJDKSAqLworI2RlZmluZSBDU1IwX0NFUlIJMHgyMDAwCQkvKiBjYXJyaWVyIGVycm9yIChubyBoZWFydGJlYXQgOi0pIChSQykgKi8KKyNkZWZpbmUgQ1NSMF9CQUJMCTB4NDAwMAkJLyogYmFiYmxlOiB0eC1lZCB0b28gbWFueSBiaXRzIChSQykgKi8KKyNkZWZpbmUgQ1NSMF9FUlIJMHg4MDAwCQkvKiBlcnJvciAoUkMpICovCisKKy8qIENTUjMgKi8KKyNkZWZpbmUgQ1NSM19CQ09OCTB4MDAwMQkJLyogYnl0ZSBjb250cm9sICovCisjZGVmaW5lIENTUjNfQUNPTgkweDAwMDIJCS8qIEFMRSBjb250cm9sICovCisjZGVmaW5lIENTUjNfQlNXUAkweDAwMDQJCS8qIGJ5dGUgc3dhcCAoMT1iaWcgZW5kaWFuKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBsYW5jZV9wcm9iZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGxhbmNlX29wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK3N0YXRpYyB2b2lkIGxhbmNlX2luaXRfcmluZyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworc3RhdGljIGludCBsYW5jZV9zdGFydF94bWl0KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CitzdGF0aWMgaXJxcmV0dXJuX3QgbGFuY2VfaW50ZXJydXB0KCBpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCApOworc3RhdGljIGludCBsYW5jZV9yeCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworc3RhdGljIGludCBsYW5jZV9jbG9zZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpsYW5jZV9nZXRfc3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBFbmQgb2YgUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgc3VuM2xhbmNlX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RhdGljIGludCBmb3VuZDsKKwlpbnQgZXJyID0gLUVOT0RFVjsKKworCS8qIGNoZWNrIHRoYXQgdGhpcyBtYWNoaW5lIGhhcyBhbiBvbmJvYXJkIGxhbmNlICovCisJc3dpdGNoKGlkcHJvbS0+aWRfbWFjaHR5cGUpIHsKKwljYXNlIFNNX1NVTjN8U01fM181MDoKKwljYXNlIFNNX1NVTjN8U01fM182MDoKKwljYXNlIFNNX1NVTjNYfFNNXzNfODA6CisJCS8qIHRoZXNlIG1hY2hpbmVzIGhhdmUgbGFuY2UgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKwl9CisKKwlpZiAoZm91bmQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBsYW5jZV9wcml2YXRlKSk7CisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCX0KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZiAoIWxhbmNlX3Byb2JlKGRldikpCisJCWdvdG8gb3V0OworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCWZvdW5kID0gMTsKKwlyZXR1cm4gZGV2OworCitvdXQxOgorI2lmZGVmIENPTkZJR19TVU4zCisJaW91bm1hcCgodm9pZCAqKWRldi0+YmFzZV9hZGRyKTsKKyNlbmRpZgorb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIGludCBfX2luaXQgbGFuY2VfcHJvYmUoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CQorCXVuc2lnbmVkIGxvbmcgaW9hZGRyOworCQorCXN0cnVjdCBsYW5jZV9wcml2YXRlCSpscDsKKwlpbnQgCQkJaTsKKwlzdGF0aWMgaW50IAkJZGlkX3ZlcnNpb247CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKmlvYWRkcl9wcm9iZTsKKwl1bnNpZ25lZCBzaG9ydCB0bXAxLCB0bXAyOworCisjaWZkZWYgQ09ORklHX1NVTjMKKwlpb2FkZHIgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwKExBTkNFX09CSU8sIFBBR0VfU0laRSk7CisJaWYgKCFpb2FkZHIpCisJCXJldHVybiAwOworI2Vsc2UKKwlpb2FkZHIgPSBTVU4zWF9MQU5DRTsKKyNlbmRpZgorCisJLyogdGVzdCB0byBzZWUgaWYgdGhlcmUncyByZWFsbHkgYSBsYW5jZSBoZXJlICovCisJLyogKENTUk9fSU5JVCBzaG91bGRuJ3QgYmUgcmVhZGFibGUpICovCisJCisJaW9hZGRyX3Byb2JlID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopaW9hZGRyOworCXRtcDEgPSBpb2FkZHJfcHJvYmVbMF07CisJdG1wMiA9IGlvYWRkcl9wcm9iZVsxXTsKKworCWlvYWRkcl9wcm9iZVsxXSA9IENTUjA7CisJaW9hZGRyX3Byb2JlWzBdID0gQ1NSMF9JTklUIHwgQ1NSMF9TVE9QOworCisJaWYoaW9hZGRyX3Byb2JlWzBdICE9IENTUjBfU1RPUCkgeworCQlpb2FkZHJfcHJvYmVbMF0gPSB0bXAxOworCQlpb2FkZHJfcHJvYmVbMV0gPSB0bXAyOworCisjaWZkZWYgQ09ORklHX1NVTjMKKwkJaW91bm1hcCgodm9pZCAqKWlvYWRkcik7CisjZW5kaWYKKwkJcmV0dXJuIDA7CisJfQorCisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogWFhYIC0gbGVhaz8gKi8KKwlNRU0gPSBkdm1hX21hbGxvY19hbGlnbihzaXplb2Yoc3RydWN0IGxhbmNlX21lbW9yeSksIDB4MTAwMDApOworCisJbHAtPmlvYmFzZSA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKWlvYWRkcjsKKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvYWRkcjsgLyogaW5mb3JtYXRpb25hbCBvbmx5ICovCisKKwlSRUdBKENTUjApID0gQ1NSMF9TVE9QOyAKKworCXJlcXVlc3RfaXJxKExBTkNFX0lSUSwgbGFuY2VfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsICJTVU4zIExhbmNlIiwgZGV2KTsKKwlkZXYtPmlycSA9ICh1bnNpZ25lZCBzaG9ydClMQU5DRV9JUlE7CisKKworCXByaW50aygiJXM6IFNVTjMgTGFuY2UgYXQgaW8gJSNseCwgbWVtICUjbHgsIGlycSAlZCwgaHdhZGRyICIsCisJCSAgIGRldi0+bmFtZSwKKwkJICAgKHVuc2lnbmVkIGxvbmcpaW9hZGRyLAorCQkgICAodW5zaWduZWQgbG9uZylNRU0sCisJCSAgIGRldi0+aXJxKTsKKworCS8qIGNvcHkgaW4gdGhlIGV0aGVybmV0IGFkZHJlc3MgZnJvbSB0aGUgcHJvbSAqLworCWZvcihpID0gMDsgaSA8IDYgOyBpKyspCisJICAgICBkZXYtPmRldl9hZGRyW2ldID0gaWRwcm9tLT5pZF9ldGhhZGRyW2ldOworCisJLyogdGVsbCB0aGUgY2FyZCBpdCdzIGV0aGVyIGFkZHJlc3MsIGJ5dGVzIHN3YXBwZWQgKi8KKwlNRU0tPmluaXQuaHdhZGRyWzBdID0gZGV2LT5kZXZfYWRkclsxXTsKKwlNRU0tPmluaXQuaHdhZGRyWzFdID0gZGV2LT5kZXZfYWRkclswXTsKKwlNRU0tPmluaXQuaHdhZGRyWzJdID0gZGV2LT5kZXZfYWRkclszXTsKKwlNRU0tPmluaXQuaHdhZGRyWzNdID0gZGV2LT5kZXZfYWRkclsyXTsKKwlNRU0tPmluaXQuaHdhZGRyWzRdID0gZGV2LT5kZXZfYWRkcls1XTsKKwlNRU0tPmluaXQuaHdhZGRyWzVdID0gZGV2LT5kZXZfYWRkcls0XTsKKworCWZvciggaSA9IDA7IGkgPCA2OyArK2kgKQorCQlwcmludGsoICIlMDJ4JXMiLCBkZXYtPmRldl9hZGRyW2ldLCAoaSA8IDUpID8gIjoiIDogIlxuIiApOworCisJTUVNLT5pbml0Lm1vZGUgPSAweDAwMDA7CisJTUVNLT5pbml0LmZpbHRlclswXSA9IDB4MDAwMDAwMDA7CisJTUVNLT5pbml0LmZpbHRlclsxXSA9IDB4MDAwMDAwMDA7CisJTUVNLT5pbml0LnJkcmEgPSBkdm1hX3Z0b2IoTUVNLT5yeF9oZWFkKTsKKwlNRU0tPmluaXQucmxlbiAgICA9IChSWF9MT0dfUklOR19TSVpFIDw8IDEzKSB8CisJCShkdm1hX3Z0b2IoTUVNLT5yeF9oZWFkKSA+PiAxNik7CisJTUVNLT5pbml0LnRkcmEgPSBkdm1hX3Z0b2IoTUVNLT50eF9oZWFkKTsKKwlNRU0tPmluaXQudGxlbiAgICA9IChUWF9MT0dfUklOR19TSVpFIDw8IDEzKSB8CisJCShkdm1hX3Z0b2IoTUVNLT50eF9oZWFkKSA+PiAxNik7CisKKwlEUFJJTlRLKDIsICgiaW5pdGFkZHI6ICUwOGx4IHJ4X3Jpbmc6ICUwOGx4IHR4X3Jpbmc6ICUwOGx4XG4iLAorCSAgICAgICBkdm1hX3Z0b2IoJihNRU0tPmluaXQpKSwgZHZtYV92dG9iKE1FTS0+cnhfaGVhZCksCisJICAgICAgIChkdm1hX3Z0b2IoTUVNLT50eF9oZWFkKSkpKTsgIAorCisJaWYgKGRpZF92ZXJzaW9uKysgPT0gMCkKKwkJcHJpbnRrKCB2ZXJzaW9uICk7CisKKwkvKiBUaGUgTEFOQ0Utc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSAmbGFuY2Vfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZsYW5jZV9zdGFydF94bWl0OworCWRldi0+c3RvcCA9ICZsYW5jZV9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9ICZsYW5jZV9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+c2V0X21hY19hZGRyZXNzID0gMDsKKy8vCUtMVURHRSAtLSBSRU1PVkUgTUUKKwlzZXRfYml0KF9fTElOS19TVEFURV9QUkVTRU5ULCAmZGV2LT5zdGF0ZSk7CisKKworCW1lbXNldCggJmxwLT5zdGF0cywgMCwgc2l6ZW9mKGxwLT5zdGF0cykgKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGxhbmNlX29wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwlEUFJJTlRLKCAyLCAoICIlczogbGFuY2Vfb3BlbigpXG4iLCBkZXYtPm5hbWUgKSk7CisKKwlSRUdBKENTUjApID0gQ1NSMF9TVE9QOworCisJbGFuY2VfaW5pdF9yaW5nKGRldik7CisKKwkvKiBGcm9tIG5vdyBvbiwgQVJFRyBpcyBrZXB0IHRvIHBvaW50IHRvIENTUjAgKi8KKwlSRUdBKENTUjApID0gQ1NSMF9JTklUOworCisJaSA9IDEwMDAwMDA7CisJd2hpbGUgKC0taSA+IDApCisJCWlmIChEUkVHICYgQ1NSMF9JRE9OKQorCQkJYnJlYWs7CisJaWYgKGkgPCAwIHx8IChEUkVHICYgQ1NSMF9FUlIpKSB7CisJCURQUklOVEsoIDIsICggImxhbmNlX29wZW4oKTogb3BlbmluZyAlcyBmYWlsZWQsIGk9JWQsIGNzcjA9JTA0eFxuIiwKKwkJCQkJICBkZXYtPm5hbWUsIGksIERSRUcgKSk7CisJCURSRUcgPSBDU1IwX1NUT1A7CisJCXJldHVybiggLUVJTyApOworCX0KKworCURSRUcgPSBDU1IwX0lET04gfCBDU1IwX1NUUlQgfCBDU1IwX0lORUE7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQorCURQUklOVEsoIDIsICggIiVzOiBMQU5DRSBpcyBvcGVuLCBjc3IwICUwNHhcbiIsIGRldi0+bmFtZSwgRFJFRyApKTsKKworCXJldHVybiggMCApOworfQorCisKKy8qIEluaXRpYWxpemUgdGhlIExBTkNFIFJ4IGFuZCBUeCByaW5ncy4gKi8KKworc3RhdGljIHZvaWQgbGFuY2VfaW5pdF9yaW5nKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJbHAtPmxvY2sgPSAwOworCWxwLT50eF9mdWxsID0gMDsKKwlscC0+bmV3X3J4ID0gbHAtPm5ld190eCA9IDA7CisJbHAtPm9sZF9yeCA9IGxwLT5vbGRfdHggPSAwOworCisJZm9yKCBpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrICkgeworCQlNRU0tPnR4X2hlYWRbaV0uYmFzZSA9IGR2bWFfdnRvYihNRU0tPnR4X2RhdGFbaV0pOworCQlNRU0tPnR4X2hlYWRbaV0uZmxhZyA9IDA7CisgCQlNRU0tPnR4X2hlYWRbaV0uYmFzZV9oaSA9IAorCQkJKGR2bWFfdnRvYihNRU0tPnR4X2RhdGFbaV0pKSA+PjE2OworCQlNRU0tPnR4X2hlYWRbaV0ubGVuZ3RoID0gMDsKKwkJTUVNLT50eF9oZWFkW2ldLm1pc2MgPSAwOworCX0KKworCWZvciggaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKyApIHsKKwkJTUVNLT5yeF9oZWFkW2ldLmJhc2UgPSBkdm1hX3Z0b2IoTUVNLT5yeF9kYXRhW2ldKTsKKwkJTUVNLT5yeF9oZWFkW2ldLmZsYWcgPSBSTUQxX09XTl9DSElQOworCQlNRU0tPnJ4X2hlYWRbaV0uYmFzZV9oaSA9IAorCQkJKGR2bWFfdnRvYihNRU0tPnJ4X2RhdGFbaV0pKSA+PiAxNjsKKwkJTUVNLT5yeF9oZWFkW2ldLmJ1Zl9sZW5ndGggPSAtUEtUX0JVRl9TWiB8IDB4ZjAwMDsKKwkJTUVNLT5yeF9oZWFkW2ldLm1zZ19sZW5ndGggPSAwOworCX0KKworCS8qIHRlbGwgdGhlIGNhcmQgaXQncyBldGhlciBhZGRyZXNzLCBieXRlcyBzd2FwcGVkICovCisJTUVNLT5pbml0Lmh3YWRkclswXSA9IGRldi0+ZGV2X2FkZHJbMV07CisJTUVNLT5pbml0Lmh3YWRkclsxXSA9IGRldi0+ZGV2X2FkZHJbMF07CisJTUVNLT5pbml0Lmh3YWRkclsyXSA9IGRldi0+ZGV2X2FkZHJbM107CisJTUVNLT5pbml0Lmh3YWRkclszXSA9IGRldi0+ZGV2X2FkZHJbMl07CisJTUVNLT5pbml0Lmh3YWRkcls0XSA9IGRldi0+ZGV2X2FkZHJbNV07CisJTUVNLT5pbml0Lmh3YWRkcls1XSA9IGRldi0+ZGV2X2FkZHJbNF07CisKKwlNRU0tPmluaXQubW9kZSA9IDB4MDAwMDsKKwlNRU0tPmluaXQuZmlsdGVyWzBdID0gMHgwMDAwMDAwMDsKKwlNRU0tPmluaXQuZmlsdGVyWzFdID0gMHgwMDAwMDAwMDsKKwlNRU0tPmluaXQucmRyYSA9IGR2bWFfdnRvYihNRU0tPnJ4X2hlYWQpOworCU1FTS0+aW5pdC5ybGVuICAgID0gKFJYX0xPR19SSU5HX1NJWkUgPDwgMTMpIHwKKwkJKGR2bWFfdnRvYihNRU0tPnJ4X2hlYWQpID4+IDE2KTsKKwlNRU0tPmluaXQudGRyYSA9IGR2bWFfdnRvYihNRU0tPnR4X2hlYWQpOworCU1FTS0+aW5pdC50bGVuICAgID0gKFRYX0xPR19SSU5HX1NJWkUgPDwgMTMpIHwKKwkJKGR2bWFfdnRvYihNRU0tPnR4X2hlYWQpID4+IDE2KTsKKworCisJLyogdGVsbCB0aGUgbGFuY2UgdGhlIGFkZHJlc3Mgb2YgaXRzIGluaXQgYmxvY2sgKi8KKwlSRUdBKENTUjEpID0gZHZtYV92dG9iKCYoTUVNLT5pbml0KSk7CisJUkVHQShDU1IyKSA9IGR2bWFfdnRvYigmKE1FTS0+aW5pdCkpID4+IDE2OworCisjaWZkZWYgQ09ORklHX1NVTjNYCisJUkVHQShDU1IzKSA9IENTUjNfQlNXUCB8IENTUjNfQUNPTiB8IENTUjNfQkNPTjsKKyNlbHNlCisJUkVHQShDU1IzKSA9IENTUjNfQlNXUDsKKyNlbmRpZgorCit9CisKKworc3RhdGljIGludCBsYW5jZV9zdGFydF94bWl0KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlbnRyeSwgbGVuOworCXN0cnVjdCBsYW5jZV90eF9oZWFkICpoZWFkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEUFJJTlRLKCAxLCAoICIlczogdHJhbnNtaXQgc3RhcnQuXG4iLAorCQkgICAgICBkZXYtPm5hbWUpKTsKKworCS8qIFRyYW5zbWl0dGVyIHRpbWVvdXQsIHNlcmlvdXMgcHJvYmxlbXMuICovCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgeworCQlpbnQgdGlja3Nzb2ZhciA9IGppZmZpZXMgLSBkZXYtPnRyYW5zX3N0YXJ0OworCQlpZiAodGlja3Nzb2ZhciA8IDIwKQorCQkJcmV0dXJuKCAxICk7CisKKwkJRFBSSU5USyggMSwgKCAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICUwNHgsIHJlc2V0dGluZy5cbiIsCisJCQkJCSAgZGV2LT5uYW1lLCBEUkVHICkpOworCQlEUkVHID0gQ1NSMF9TVE9QOworCQkvKgorCQkgKiBBbHdheXMgc2V0IEJTV1AgYWZ0ZXIgYSBTVE9QIGFzIFNUT1AgcHV0cyBpdCBiYWNrIGludG8KKwkJICogbGl0dGxlIGVuZGlhbiBtb2RlLgorCQkgKi8KKwkJUkVHQShDU1IzKSA9IENTUjNfQlNXUDsKKwkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCisJCWlmKGxhbmNlX2RlYnVnID49IDIpIHsKKwkJCWludCBpOworCQkJcHJpbnRrKCJSaW5nIGRhdGE6IG9sZF90eCAlZCBuZXdfdHggJWQlcyBuZXdfcnggJWRcbiIsCisJCQkgICAgICAgbHAtPm9sZF90eCwgbHAtPm5ld190eCwKKwkJCSAgICAgICBscC0+dHhfZnVsbCA/ICIgKGZ1bGwpIiA6ICIiLAorCQkJICAgICAgIGxwLT5uZXdfcnggKTsKKwkJCWZvciggaSA9IDAgOyBpIDwgUlhfUklOR19TSVpFOyBpKysgKQorCQkJCXByaW50ayggInJ4ICMlZDogYmFzZT0lMDR4IGJsZW49JTA0eCBtbGVuPSUwNHhcbiIsCisJCQkJCWksIE1FTS0+cnhfaGVhZFtpXS5iYXNlLAorCQkJCQktTUVNLT5yeF9oZWFkW2ldLmJ1Zl9sZW5ndGgsCisJCQkJCU1FTS0+cnhfaGVhZFtpXS5tc2dfbGVuZ3RoKTsKKwkJCWZvciggaSA9IDAgOyBpIDwgVFhfUklOR19TSVpFOyBpKysgKQorCQkJCXByaW50aygidHggIyVkOiBiYXNlPSUwNHggbGVuPSUwNHggbWlzYz0lMDR4XG4iLAorCQkJCSAgICAgICBpLCBNRU0tPnR4X2hlYWRbaV0uYmFzZSwKKwkJCQkgICAgICAgLU1FTS0+dHhfaGVhZFtpXS5sZW5ndGgsCisJCQkJICAgICAgIE1FTS0+dHhfaGVhZFtpXS5taXNjICk7CisJCX0KKworCQlsYW5jZV9pbml0X3JpbmcoZGV2KTsKKwkJUkVHQSggQ1NSMCApID0gQ1NSMF9JTkVBIHwgQ1NSMF9JTklUIHwgQ1NSMF9TVFJUOworCQkKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQorCQlyZXR1cm4gMDsKKwl9CisKKwkKKwkvKiBCbG9jayBhIHRpbWVyLWJhc2VkIHRyYW5zbWl0IGZyb20gb3ZlcmxhcHBpbmcuICBUaGlzIGNvdWxkIGJldHRlciBiZQorCSAgIGRvbmUgd2l0aCBhdG9taWNfc3dhcCgxLCBkZXYtPnRidXN5KSwgYnV0IHNldF9iaXQoKSB3b3JrcyBhcyB3ZWxsLiAqLworCisJLyogQmxvY2sgYSB0aW1lci1iYXNlZCB0cmFuc21pdCBmcm9tIG92ZXJsYXBwaW5nIHdpdGggdXMgYnkKKwkgICBzdG9wcGluZyB0aGUgcXVldWUgZm9yIGEgYml0Li4uICovCisgICAgIAorCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCggMCwgKHZvaWQqKSZscC0+bG9jayApICE9IDApIHsKKwkJcHJpbnRrKCAiJXM6IHR4IHF1ZXVlIGxvY2shLlxuIiwgZGV2LT5uYW1lKTsKKwkJLyogZG9uJ3QgY2xlYXIgZGV2LT50YnVzeSBmbGFnLiAqLworCQlyZXR1cm4gMTsKKwl9CisKKwlBUkVHID0gQ1NSMDsKKyAgCURQUklOVEsoIDIsICggIiVzOiBsYW5jZV9zdGFydF94bWl0KCkgY2FsbGVkLCBjc3IwICU0LjR4LlxuIiwKKyAgCQkJCSAgZGV2LT5uYW1lLCBEUkVHICkpOworCisjaWZkZWYgQ09ORklHX1NVTjNYCisJLyogdGhpcyB3ZWlyZG5lc3MgZG9lc24ndCBhcHBlYXIgb24gc3VuMy4uLiAqLworCWlmKCEoRFJFRyAmIENTUjBfSU5JVCkpIHsKKwkJRFBSSU5USyggMSwgKCJJTklUIG5vdCBzZXQsIHJlaW5pdGlhbGl6aW5nLi4uXG4iKSk7CisJCVJFR0EoIENTUjAgKSA9IENTUjBfU1RPUDsKKwkJbGFuY2VfaW5pdF9yaW5nKGRldik7CisJCVJFR0EoIENTUjAgKSA9IENTUjBfSU5JVCB8IENTUjBfU1RSVDsKKwl9CisjZW5kaWYKKworCS8qIEZpbGwgaW4gYSBUeCByaW5nIGVudHJ5ICovCisjaWYgMAorCWlmIChsYW5jZV9kZWJ1ZyA+PSAyKSB7CisJCXVfY2hhciAqcDsKKwkJaW50IGk7CisJCXByaW50ayggIiVzOiBUWCBwa3QgJWQgdHlwZSAweCUwNHggZnJvbSAiLCBkZXYtPm5hbWUsCisJCQlscC0+bmV3X3R4LCAoKHVfc2hvcnQgKilza2ItPmRhdGEpWzZdKTsKKwkJZm9yKCBwID0gJigodV9jaGFyICopc2tiLT5kYXRhKVs2XSwgaSA9IDA7IGkgPCA2OyBpKysgKQorCQkJcHJpbnRrKCIlMDJ4JXMiLCAqcCsrLCBpICE9IDUgPyAiOiIgOiAiIiApOworCQlwcmludGsoIiB0byAiKTsKKwkJZm9yKCBwID0gKHVfY2hhciAqKXNrYi0+ZGF0YSwgaSA9IDA7IGkgPCA2OyBpKysgKQorCQkJcHJpbnRrKCIlMDJ4JXMiLCAqcCsrLCBpICE9IDUgPyAiOiIgOiAiIiApOworCQlwcmludGsoIiBkYXRhIGF0IDB4JTA4eCBsZW4gJWRcbiIsIChpbnQpc2tiLT5kYXRhLAorCQkgICAgICAgKGludClza2ItPmxlbiApOworCX0KKyNlbmRpZgkKKwkvKiBXZSdyZSBub3QgcHJlcGFyZWQgZm9yIHRoZSBpbnQgdW50aWwgdGhlIGxhc3QgZmxhZ3MgYXJlIHNldC9yZXNldC4KKwkgKiBBbmQgdGhlIGludCBtYXkgaGFwcGVuIGFscmVhZHkgYWZ0ZXIgc2V0dGluZyB0aGUgT1dOX0NISVAuLi4gKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiBNYXNrIHRvIHJpbmcgYnVmZmVyIGJvdW5kYXJ5LiAqLworCWVudHJ5ID0gbHAtPm5ld190eDsKKwloZWFkICA9ICYoTUVNLT50eF9oZWFkW2VudHJ5XSk7CisKKwkvKiBDYXV0aW9uOiB0aGUgd3JpdGUgb3JkZXIgaXMgaW1wb3J0YW50IGhlcmUsIHNldCB0aGUgIm93bmVyc2hpcCIgYml0cworCSAqIGxhc3QuCisJICovCisKKwkvKiB0aGUgc3VuMydzIGxhbmNlIG5lZWRzIGl0J3MgYnVmZmVyIHBhZGRlZCB0byB0aGUgbWluaW11bQorCSAgIHNpemUgKi8KKwlsZW4gPSAoRVRIX1pMRU4gPCBza2ItPmxlbikgPyBza2ItPmxlbiA6IEVUSF9aTEVOOworCisvLwloZWFkLT5sZW5ndGggPSAtbGVuOworCWhlYWQtPmxlbmd0aCA9ICgtbGVuKSB8IDB4ZjAwMDsKKwloZWFkLT5taXNjID0gMDsKKworCW1lbWNweSggUEtUQlVGX0FERFIoaGVhZCksICh2b2lkICopc2tiLT5kYXRhLCBza2ItPmxlbiApOworCWlmIChsZW4gIT0gc2tiLT5sZW4pCisJCW1lbXNldChQS1RCVUZfQUREUihoZWFkKSArIHNrYi0+bGVuLCAwLCBsZW4tc2tiLT5sZW4pOworCisJaGVhZC0+ZmxhZyA9IFRNRDFfT1dOX0NISVAgfCBUTUQxX0VOUCB8IFRNRDFfU1RQOworCWxwLT5uZXdfdHggPSAobHAtPm5ld190eCArIDEpICYgVFhfUklOR19NT0RfTUFTSzsKKwlscC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwkvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSBzZW5kIHBvbGwuICovCisJUkVHQShDU1IwKSA9IENTUjBfSU5FQSB8IENTUjBfVERNRCB8IENTUjBfU1RSVDsKKwlBUkVHID0gQ1NSMDsKKyAgCURQUklOVEsoIDIsICggIiVzOiBsYW5jZV9zdGFydF94bWl0KCkgZXhpdGluZywgY3NyMCAlNC40eC5cbiIsCisgIAkJCQkgIGRldi0+bmFtZSwgRFJFRyApKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlkZXZfa2ZyZWVfc2tiKCBza2IgKTsKKworCWxwLT5sb2NrID0gMDsKKwlpZiAoKE1FTS0+dHhfaGVhZFsoZW50cnkrMSkgJiBUWF9SSU5HX01PRF9NQVNLXS5mbGFnICYgVE1EMV9PV04pID09CisJICAgIFRNRDFfT1dOX0hPU1QpIAorCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBMQU5DRSBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KKworc3RhdGljIGlycXJldHVybl90IGxhbmNlX2ludGVycnVwdCggaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBjc3IwOworCXN0YXRpYyBpbnQgaW5faW50ZXJydXB0OworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCURQUklOVEsoIDEsICggImxhbmNlX2ludGVycnVwdCgpOiBpbnZhbGlkIGRldl9pZFxuIiApKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlmIChpbl9pbnRlcnJ1cHQpCisJCURQUklOVEsoIDIsICggIiVzOiBSZS1lbnRlcmluZyB0aGUgaW50ZXJydXB0IGhhbmRsZXIuXG4iLCBkZXYtPm5hbWUgKSk7CisJaW5faW50ZXJydXB0ID0gMTsKKwkKKyBzdGlsbF9tb3JlOgorCWZsdXNoX2NhY2hlX2FsbCgpOworCQorCUFSRUcgPSBDU1IwOworCWNzcjAgPSBEUkVHOworCisJLyogYWNrIGludGVycnVwdHMgKi8KKwlEUkVHID0gY3NyMCAmIChDU1IwX1RJTlQgfCBDU1IwX1JJTlQgfCBDU1IwX0lET04pOworCisJLyogY2xlYXIgZXJyb3JzICovCisJaWYoY3NyMCAmIENTUjBfRVJSKQorCQlEUkVHID0gQ1NSMF9CQUJMIHwgQ1NSMF9NRVJSIHwgQ1NSMF9DRVJSIHwgQ1NSMF9NSVNTOworCisKKwlEUFJJTlRLKCAyLCAoICIlczogaW50ZXJydXB0ICBjc3IwPSUwNHggbmV3IGNzcj0lMDR4LlxuIiwKKwkJICAgICAgZGV2LT5uYW1lLCBjc3IwLCBEUkVHICkpOworCisJaWYgKGNzcjAgJiBDU1IwX1RJTlQpIHsJCQkvKiBUeC1kb25lIGludGVycnVwdCAqLworCQlpbnQgb2xkX3R4ID0gbHAtPm9sZF90eDsKKworLy8JCWlmKGxhbmNlX2RlYnVnID49IDMpIHsKKy8vCQkJaW50IGk7CisvLwkJCQorLy8JCQlwcmludGsoIiVzOiB0eCBpbnRcbiIsIGRldi0+bmFtZSk7CisvLwkJCQorLy8JCQlmb3IoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykKKy8vCQkJCXByaW50aygicmluZyAlZCBmbGFnPSUwNHhcbiIsIGksCisvLwkJCQkgICAgICAgTUVNLT50eF9oZWFkW2ldLmZsYWcpOworLy8JCX0KKwkJCisJCXdoaWxlKCBvbGRfdHggIT0gbHAtPm5ld190eCkgeworCQkJc3RydWN0IGxhbmNlX3R4X2hlYWQgKmhlYWQgPSAmKE1FTS0+dHhfaGVhZFtvbGRfdHhdKTsgCisJCQkKKwkJCURQUklOVEsoMywgKCJvbiB0eF9yaW5nICVkXG4iLCBvbGRfdHgpKTsKKworCQkJaWYgKGhlYWQtPmZsYWcgJiBUTUQxX09XTl9DSElQKQorCQkJCWJyZWFrOyAvKiBJdCBzdGlsbCBoYXNuJ3QgYmVlbiBUeGVkICovCisJCQkJCisJCQlpZiAoaGVhZC0+ZmxhZyAmIFRNRDFfRVJSKSB7CisJCQkJaW50IHN0YXR1cyA9IGhlYWQtPm1pc2M7CisJCQkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiBUTUQzX1JUUlkpIGxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiBUTUQzX0xDQVIpIGxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiBUTUQzX0xDT0wpIGxwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIChUTUQzX1VGTE8gfCBUTUQzX0JVRkYpKSB7CisJCQkJCWxwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJCQlwcmludGsoIiVzOiBUeCBGSUZPIGVycm9yXG4iLAorCQkJCQkgICAgICAgZGV2LT5uYW1lKTsgCisJCQkJCVJFR0EoQ1NSMCkgPSBDU1IwX1NUT1A7CisJCQkJCVJFR0EoQ1NSMykgPSBDU1IzX0JTV1A7CisJCQkJCWxhbmNlX2luaXRfcmluZyhkZXYpOworCQkJCQlSRUdBKENTUjApID0gQ1NSMF9TVFJUIHwgQ1NSMF9JTkVBOworCQkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQkJfQorCQkJfSBlbHNlIGlmKGhlYWQtPmZsYWcgJiAoVE1EMV9FTlAgfCBUTUQxX1NUUCkpIHsKKwkJCQkKKwkJCQloZWFkLT5mbGFnICY9IH4oVE1EMV9FTlAgfCBUTUQxX1NUUCk7CisJCQkJaWYoaGVhZC0+ZmxhZyAmIChUTUQxX09ORSB8IFRNRDFfTU9SRSkpCisJCQkJCWxwLT5zdGF0cy5jb2xsaXNpb25zKys7CisJCQkJCisJCQkJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCQlEUFJJTlRLKDMsICgiY2xlYXJlZCB0eCByaW5nICVkXG4iLCBvbGRfdHgpKTsKKwkJCX0KKwkJCW9sZF90eCA9IChvbGRfdHggKzEpICYgVFhfUklOR19NT0RfTUFTSzsKKwkJfQorCisJCWxwLT5vbGRfdHggPSBvbGRfdHg7CisJfQorCisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7CisJCS8qIFRoZSByaW5nIGlzIG5vIGxvbmdlciBmdWxsLCBjbGVhciB0YnVzeS4gKi8KKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKworCWlmIChjc3IwICYgQ1NSMF9SSU5UKQkJCS8qIFJ4IGludGVycnVwdCAqLworCQlsYW5jZV9yeCggZGV2ICk7CisJCisJLyogTG9nIG1pc2MgZXJyb3JzLiAqLworCWlmIChjc3IwICYgQ1NSMF9CQUJMKSBscC0+c3RhdHMudHhfZXJyb3JzKys7IC8qIFR4IGJhYmJsZS4gKi8KKwlpZiAoY3NyMCAmIENTUjBfTUlTUykgbHAtPnN0YXRzLnJ4X2Vycm9ycysrOyAvKiBNaXNzZWQgYSBSeCBmcmFtZS4gKi8KKwlpZiAoY3NyMCAmIENTUjBfTUVSUikgeworCQlEUFJJTlRLKCAxLCAoICIlczogQnVzIG1hc3RlciBhcmJpdHJhdGlvbiBmYWlsdXJlICg/IT8pLCAiCisJCQkgICAgICAic3RhdHVzICUwNHguXG4iLCBkZXYtPm5hbWUsIGNzcjAgKSk7CisJCS8qIFJlc3RhcnQgdGhlIGNoaXAuICovCisJCVJFR0EoQ1NSMCkgPSBDU1IwX1NUT1A7CisJCVJFR0EoQ1NSMykgPSBDU1IzX0JTV1A7CisJCWxhbmNlX2luaXRfcmluZyhkZXYpOworCQlSRUdBKENTUjApID0gQ1NSMF9TVFJUIHwgQ1NSMF9JTkVBOworCX0KKworCisgICAgLyogQ2xlYXIgYW55IG90aGVyIGludGVycnVwdCwgYW5kIHNldCBpbnRlcnJ1cHQgZW5hYmxlLiAqLworLy8JRFJFRyA9IENTUjBfQkFCTCB8IENTUjBfQ0VSUiB8IENTUjBfTUlTUyB8IENTUjBfTUVSUiB8CisvLwkJICAgQ1NSMF9JRE9OIHwgQ1NSMF9JTkVBOworCisJUkVHQShDU1IwKSA9IENTUjBfSU5FQTsKKworCWlmKERSRUcgJiAoQ1NSMF9SSU5UIHwgQ1NSMF9USU5UKSkgeworCSAgICAgRFBSSU5USygyLCAoInJlc3RhcnRpbmcgaW50ZXJydXB0LCBjc3IwPSUjMDR4XG4iLCBEUkVHKSk7CisJICAgICBnb3RvIHN0aWxsX21vcmU7CisJfQorCisJRFBSSU5USyggMiwgKCAiJXM6IGV4aXRpbmcgaW50ZXJydXB0LCBjc3IwPSUjMDR4LlxuIiwKKwkJCQkgIGRldi0+bmFtZSwgRFJFRyApKTsKKwlpbl9pbnRlcnJ1cHQgPSAwOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogZ2V0IHBhY2tldCwgdG9zcyBpbnRvIHNrYnVmZiAqLworc3RhdGljIGludCBsYW5jZV9yeCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZW50cnkgPSBscC0+bmV3X3J4OworCisJLyogSWYgd2Ugb3duIHRoZSBuZXh0IGVudHJ5LCBpdCdzIGEgbmV3IHBhY2tldC4gU2VuZCBpdCB1cC4gKi8KKwl3aGlsZSggKE1FTS0+cnhfaGVhZFtlbnRyeV0uZmxhZyAmIFJNRDFfT1dOKSA9PSBSTUQxX09XTl9IT1NUICkgeworCQlzdHJ1Y3QgbGFuY2VfcnhfaGVhZCAqaGVhZCA9ICYoTUVNLT5yeF9oZWFkW2VudHJ5XSk7CisJCWludCBzdGF0dXMgPSBoZWFkLT5mbGFnOworCQkKKwkJaWYgKHN0YXR1cyAhPSAoUk1EMV9FTlB8Uk1EMV9TVFApKSB7ICAvKiBUaGVyZSB3YXMgYW4gZXJyb3IuICovCisJCQkvKiBUaGVyZSBpcyBhIHRyaWNreSBlcnJvciBub3RlZCBieSBKb2huIE11cnBoeSwKKwkJCSAgIDxtdXJmQHBlcmZ0ZWNoLmNvbT4gdG8gUnVzcyBOZWxzb246IEV2ZW4gd2l0aCAKKwkJCSAgIGZ1bGwtc2l6ZWQgYnVmZmVycyBpdCdzIHBvc3NpYmxlIGZvciBhIGphYmJlciBwYWNrZXQgdG8gdXNlIHR3bworCQkJICAgYnVmZmVycywgd2l0aCBvbmx5IHRoZSBsYXN0IGNvcnJlY3RseSBub3RpbmcgdGhlIGVycm9yLiAqLworCQkJaWYgKHN0YXR1cyAmIFJNRDFfRU5QKQkvKiBPbmx5IGNvdW50IGEgZ2VuZXJhbCBlcnJvciBhdCB0aGUgKi8KKwkJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7IC8qIGVuZCBvZiBhIHBhY2tldC4qLworCQkJaWYgKHN0YXR1cyAmIFJNRDFfRlJBTSkgbHAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIFJNRDFfT0ZMTykgbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgUk1EMV9DUkMpIGxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgUk1EMV9CVUZGKSBscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCWhlYWQtPmZsYWcgJj0gKFJNRDFfRU5QfFJNRDFfU1RQKTsKKwkJfSBlbHNlIHsKKwkJCS8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLCBjb21wYXRpYmxlIHdpdGggbmV0LTMuICovCisvLwkJCXNob3J0IHBrdF9sZW4gPSBoZWFkLT5tc2dfbGVuZ3RoOy8vICYgMHhmZmY7CisJCQlzaG9ydCBwa3RfbGVuID0gKGhlYWQtPm1zZ19sZW5ndGggJiAweGZmZikgLSA0OworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJaWYgKHBrdF9sZW4gPCA2MCkgeworCQkJCXByaW50ayggIiVzOiBSdW50IHBhY2tldCFcbiIsIGRldi0+bmFtZSApOworCQkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXNrYiA9IGRldl9hbGxvY19za2IoIHBrdF9sZW4rMiApOworCQkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCQlEUFJJTlRLKCAxLCAoICIlczogTWVtb3J5IHNxdWVlemUsIGRlZmVycmluZyBwYWNrZXQuXG4iLAorCQkJCQkJICAgICAgZGV2LT5uYW1lICkpOworCQkJCQkKKwkJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQkJaGVhZC0+bXNnX2xlbmd0aCA9IDA7CisJCQkJCWhlYWQtPmZsYWcgfD0gUk1EMV9PV05fQ0hJUDsKKwkJCQkJbHAtPm5ld19yeCA9IChscC0+bmV3X3J4KzEpICYKKwkJCQkJICAgICBSWF9SSU5HX01PRF9NQVNLOworCQkJCX0KKworI2lmIDAKKwkJCQlpZiAobGFuY2VfZGVidWcgPj0gMykgeworCQkJCQl1X2NoYXIgKmRhdGEgPSBQS1RCVUZfQUREUihoZWFkKSwgKnA7CisJCQkJCXByaW50ayggIiVzOiBSWCBwa3QgJWQgdHlwZSAweCUwNHggZnJvbSAiLCBkZXYtPm5hbWUsIGVudHJ5LCAoKHVfc2hvcnQgKilkYXRhKVs2XSk7CisJCQkJCWZvciggcCA9ICZkYXRhWzZdLCBpID0gMDsgaSA8IDY7IGkrKyApCisJCQkJCQlwcmludGsoIiUwMnglcyIsICpwKyssIGkgIT0gNSA/ICI6IiA6ICIiICk7CisJCQkJCXByaW50aygiIHRvICIpOworCQkJCQlmb3IoIHAgPSBkYXRhLCBpID0gMDsgaSA8IDY7IGkrKyApCisJCQkJCQlwcmludGsoIiUwMnglcyIsICpwKyssIGkgIT0gNSA/ICI6IiA6ICIiICk7CisJCQkJCXByaW50aygiIGRhdGEgJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICIKKwkJCQkJICAgICAgICJsZW4gJWQgYXQgJTA4eFxuIiwKKwkJCQkJICAgICAgIGRhdGFbMTVdLCBkYXRhWzE2XSwgZGF0YVsxN10sIGRhdGFbMThdLAorCQkJCQkgICAgICAgZGF0YVsxOV0sIGRhdGFbMjBdLCBkYXRhWzIxXSwgZGF0YVsyMl0sCisJCQkJCSAgICAgICBwa3RfbGVuLCBkYXRhKTsKKwkJCQl9CisjZW5kaWYKKwkJCQlpZiAobGFuY2VfZGVidWcgPj0gMykgeworCQkJCQl1X2NoYXIgKmRhdGEgPSBQS1RCVUZfQUREUihoZWFkKTsKKwkJCQkJcHJpbnRrKCAiJXM6IFJYIHBrdCAlZCB0eXBlIDB4JTA0eCBsZW4gJWRcbiAiLCBkZXYtPm5hbWUsIGVudHJ5LCAoKHVfc2hvcnQgKilkYXRhKVs2XSwgcGt0X2xlbik7CisJCQkJfQkJCQkKKworCisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoIHNrYiwgMiApOwkvKiAxNiBieXRlIGFsaWduICovCisJCQkJc2tiX3B1dCggc2tiLCBwa3RfbGVuICk7CS8qIE1ha2Ugcm9vbSAqLworLy8JCQkgICAgICAgIG1lbWNweSggc2tiLT5kYXRhLCBQS1RCVUZfQUREUihoZWFkKSwgcGt0X2xlbiApOworCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLAorCQkJCQkJIFBLVEJVRl9BRERSKGhlYWQpLAorCQkJCQkJIHBrdF9sZW4sIDApOworCisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKCBza2IsIGRldiApOworCQkJCW5ldGlmX3J4KCBza2IgKTsKKwkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCQl9CisJCX0KKworLy8JCWhlYWQtPmJ1Zl9sZW5ndGggPSAtUEtUX0JVRl9TWiB8IDB4ZjAwMDsKKwkJaGVhZC0+bXNnX2xlbmd0aCA9IDA7CisJCWhlYWQtPmZsYWcgPSBSTUQxX09XTl9DSElQOworCisJCWVudHJ5ID0gbHAtPm5ld19yeCA9IChscC0+bmV3X3J4ICsxKSAmIFJYX1JJTkdfTU9EX01BU0s7CisJfQorCisJLyogRnJvbSBsYW5jZS5jIChEb25hbGQgQmVja2VyKTogKi8KKwkvKiBXZSBzaG91bGQgY2hlY2sgdGhhdCBhdCBsZWFzdCB0d28gcmluZyBlbnRyaWVzIGFyZSBmcmVlLgorCSAgIElmIG5vdCwgd2Ugc2hvdWxkIGZyZWUgb25lIGFuZCBtYXJrIHN0YXRzLT5yeF9kcm9wcGVkKysuICovCisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGxhbmNlX2Nsb3NlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJQVJFRyA9IENTUjA7CisKKwlEUFJJTlRLKCAyLCAoICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQsIHN0YXR1cyB3YXMgJTIuMnguXG4iLAorCQkJCSAgZGV2LT5uYW1lLCBEUkVHICkpOworCisJLyogV2Ugc3RvcCB0aGUgTEFOQ0UgaGVyZSAtLSBpdCBvY2Nhc2lvbmFsbHkgcG9sbHMKKwkgICBtZW1vcnkgaWYgd2UgZG9uJ3QuICovCisJRFJFRyA9IENTUjBfU1RPUDsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmxhbmNlX2dldF9zdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiAmbHAtPnN0YXRzOworfQorCisKKy8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICAgbnVtX2FkZHJzID09IC0xCQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisgICBudW1fYWRkcnMgPT0gMAkJTm9ybWFsIG1vZGUsIGNsZWFyIG11bHRpY2FzdCBsaXN0CisgICBudW1fYWRkcnMgPiAwCQlNdWx0aWNhc3QgbW9kZSwgcmVjZWl2ZSBub3JtYWwgYW5kIE1DIHBhY2tldHMsIGFuZCBkbworCQkJCQkJYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgorICovCisKKy8qIGNvbXBsZXRlbHkgdW50ZXN0ZWQgb24gYSBzdW4zICovCitzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3QoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZihuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpCisJCS8qIE9ubHkgcG9zc2libGUgaWYgYm9hcmQgaXMgYWxyZWFkeSBzdGFydGVkICovCisJCXJldHVybjsKKworCS8qIFdlIHRha2UgdGhlIHNpbXBsZSB3YXkgb3V0IGFuZCBhbHdheXMgZW5hYmxlIHByb21pc2N1b3VzIG1vZGUuICovCisJRFJFRyA9IENTUjBfU1RPUDsgLyogVGVtcG9yYXJpbHkgc3RvcCB0aGUgbGFuY2UuICovCisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCS8qIExvZyBhbnkgbmV0IHRhcHMuICovCisJCURQUklOVEsoIDEsICggIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLCBkZXYtPm5hbWUgKSk7CisJCVJFR0EoIENTUjE1ICkgPSAweDgwMDA7IC8qIFNldCBwcm9taXNjdW91cyBtb2RlICovCisJfSBlbHNlIHsKKwkJc2hvcnQgbXVsdGljYXN0X3RhYmxlWzRdOworCQlpbnQgbnVtX2FkZHJzID0gZGV2LT5tY19jb3VudDsKKwkJaW50IGk7CisJCS8qIFdlIGRvbid0IHVzZSB0aGUgbXVsdGljYXN0IHRhYmxlLCBidXQgcmVseSBvbiB1cHBlci1sYXllcgorCQkgKiBmaWx0ZXJpbmcuICovCisJCW1lbXNldCggbXVsdGljYXN0X3RhYmxlLCAobnVtX2FkZHJzID09IDApID8gMCA6IC0xLAorCQkJCXNpemVvZihtdWx0aWNhc3RfdGFibGUpICk7CisJCWZvciggaSA9IDA7IGkgPCA0OyBpKysgKQorCQkJUkVHQSggQ1NSOCtpICkgPSBtdWx0aWNhc3RfdGFibGVbaV07CisJCVJFR0EoIENTUjE1ICkgPSAwOyAvKiBVbnNldCBwcm9taXNjdW91cyBtb2RlICovCisJfQorCisJLyoKKwkgKiBBbHdheXMgc2V0IEJTV1AgYWZ0ZXIgYSBTVE9QIGFzIFNUT1AgcHV0cyBpdCBiYWNrIGludG8KKwkgKiBsaXR0bGUgZW5kaWFuIG1vZGUuCisJICovCisJUkVHQSggQ1NSMyApID0gQ1NSM19CU1dQOworCisJLyogUmVzdW1lIG5vcm1hbCBvcGVyYXRpb24gYW5kIHJlc2V0IEFSRUcgdG8gQ1NSMCAqLworCVJFR0EoIENTUjAgKSA9IENTUjBfSURPTiB8IENTUjBfSU5FQSB8IENTUjBfU1RSVDsKK30KKworCisjaWZkZWYgTU9EVUxFCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqc3VuM2xhbmNlX2RldjsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJc3VuM2xhbmNlX2RldiA9IHN1bjNsYW5jZV9wcm9iZSgtMSk7CisJaWYgKElTX0VSUihzdW4zbGFuY2VfZGV2KSkKKwkJcmV0dXJuIFBUUl9FUlIoc3VuM2xhbmNlX2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihzdW4zbGFuY2VfZGV2KTsKKyNpZmRlZiBDT05GSUdfU1VOMworCWlvdW5tYXAoKHZvaWQgKilzdW4zbGFuY2VfZGV2LT5iYXNlX2FkZHIpOworI2VuZGlmCisJZnJlZV9uZXRkZXYoc3VuM2xhbmNlX2Rldik7Cit9CisKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuYm1hYy5jIGIvZHJpdmVycy9uZXQvc3VuYm1hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNWRjZDg2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3VuYm1hYy5jCkBAIC0wLDAgKzEsMTMyNCBAQAorLyogJElkOiBzdW5ibWFjLmMsdiAxLjMwIDIwMDIvMDEvMTUgMDY6NDg6NTUgZGF2ZW0gRXhwICQKKyAqIHN1bmJtYWMuYzogRHJpdmVyIGZvciBTcGFyYyBCaWdNQUMgMTAwYmFzZVQgZXRoZXJuZXQgYWRhcHRlcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAzIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2F1eGlvLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaWRwcm9tLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL29wZW5wcm9tLmg+CisjaW5jbHVkZSA8YXNtL29wbGliLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vc2J1cy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgInN1bmJtYWMuaCIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPQorICAgICAgICAic3VuYm1hYy5jOnYyLjAgMjQvTm92LzAzIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSlcbiI7CisKKyN1bmRlZiBERUJVR19QUk9CRQorI3VuZGVmIERFQlVHX1RYCisjdW5kZWYgREVCVUdfSVJRCisKKyNpZmRlZiBERUJVR19QUk9CRQorI2RlZmluZSBEUCh4KSAgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIERQKHgpCisjZW5kaWYKKworI2lmZGVmIERFQlVHX1RYCisjZGVmaW5lIERUWCh4KSAgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIERUWCh4KQorI2VuZGlmCisKKyNpZmRlZiBERUJVR19JUlEKKyNkZWZpbmUgRElSUSh4KSAgcHJpbnRrIHgKKyNlbHNlCisjZGVmaW5lIERJUlEoeCkKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGJpZ21hYyAqcm9vdF9iaWdtYWNfZGV2OworCisjZGVmaW5lIERFRkFVTFRfSkFNU0laRSAgICA0IC8qIFRvZSBqYW0gKi8KKworI2RlZmluZSBRRUNfUkVTRVRfVFJJRVMgMjAwCisKK3N0YXRpYyBpbnQgcWVjX2dsb2JhbF9yZXNldCh2b2lkIF9faW9tZW0gKmdyZWdzKQoreworCWludCB0cmllcyA9IFFFQ19SRVNFVF9UUklFUzsKKworCXNidXNfd3JpdGVsKEdMT0JfQ1RSTF9SRVNFVCwgZ3JlZ3MgKyBHTE9CX0NUUkwpOworCXdoaWxlICgtLXRyaWVzKSB7CisJCWlmIChzYnVzX3JlYWRsKGdyZWdzICsgR0xPQl9DVFJMKSAmIEdMT0JfQ1RSTF9SRVNFVCkgeworCQkJdWRlbGF5KDIwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJyZWFrOworCX0KKwlpZiAodHJpZXMpCisJCXJldHVybiAwOworCXByaW50ayhLRVJOX0VSUiAiQmlnTUFDOiBDYW5ub3QgcmVzZXQgdGhlIFFFQy5cbiIpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgcWVjX2luaXQoc3RydWN0IGJpZ21hYyAqYnApCit7CisJdm9pZCBfX2lvbWVtICpncmVncyA9IGJwLT5ncmVnczsKKwlzdHJ1Y3Qgc2J1c19kZXYgKnFlY19zZGV2ID0gYnAtPnFlY19zZGV2OworCXU4IGJzaXplcyA9IGJwLT5iaWdtYWNfYnVyc3RzOworCXUzMiByZWd2YWw7CisKKwkvKiA2NGJ5dGUgYnVyc3RzIGRvIG5vdCB3b3JrIGF0IHRoZSBtb21lbnQsIGRvCisJICogbm90IGV2ZW4gdHJ5IHRvIGVuYWJsZSB0aGVtLiAgLURhdmVNCisJICovCisJaWYgKGJzaXplcyAmIERNQV9CVVJTVDMyKQorCQlyZWd2YWwgPSBHTE9CX0NUUkxfQjMyOworCWVsc2UKKwkJcmVndmFsID0gR0xPQl9DVFJMX0IxNjsKKwlzYnVzX3dyaXRlbChyZWd2YWwgfCBHTE9CX0NUUkxfQk1PREUsIGdyZWdzICsgR0xPQl9DVFJMKTsKKwlzYnVzX3dyaXRlbChHTE9CX1BTSVpFXzIwNDgsIGdyZWdzICsgR0xPQl9QU0laRSk7CisKKwkvKiBBbGwgb2YgbWVtc2l6ZSBpcyBnaXZlbiB0byBiaWdtYWMuICovCisJc2J1c193cml0ZWwocWVjX3NkZXYtPnJlZ19hZGRyc1sxXS5yZWdfc2l6ZSwKKwkJICAgIGdyZWdzICsgR0xPQl9NU0laRSk7CisKKwkvKiBIYWxmIHRvIHRoZSB0cmFuc21pdHRlciwgaGFsZiB0byB0aGUgcmVjZWl2ZXIuICovCisJc2J1c193cml0ZWwocWVjX3NkZXYtPnJlZ19hZGRyc1sxXS5yZWdfc2l6ZSA+PiAxLAorCQkgICAgZ3JlZ3MgKyBHTE9CX1RTSVpFKTsKKwlzYnVzX3dyaXRlbChxZWNfc2Rldi0+cmVnX2FkZHJzWzFdLnJlZ19zaXplID4+IDEsCisJCSAgICBncmVncyArIEdMT0JfUlNJWkUpOworfQorCisjZGVmaW5lIFRYX1JFU0VUX1RSSUVTICAgICAzMgorI2RlZmluZSBSWF9SRVNFVF9UUklFUyAgICAgMzIKKworc3RhdGljIHZvaWQgYmlnbWFjX3R4X3Jlc2V0KHZvaWQgX19pb21lbSAqYnJlZ3MpCit7CisJaW50IHRyaWVzID0gVFhfUkVTRVRfVFJJRVM7CisKKwlzYnVzX3dyaXRlbCgwLCBicmVncyArIEJNQUNfVFhDRkcpOworCisJLyogVGhlIGZpZm8gdGhyZXNob2xkIGJpdCBpcyByZWFkLW9ubHkgYW5kIGRvZXMKKwkgKiBub3QgY2xlYXIuICAtRGF2ZU0KKwkgKi8KKwl3aGlsZSAoKHNidXNfcmVhZGwoYnJlZ3MgKyBCTUFDX1RYQ0ZHKSAmIH4oQklHTUFDX1RYQ0ZHX0ZJRk8pKSAhPSAwICYmCisJICAgICAgIC0tdHJpZXMgIT0gMCkKKwkJdWRlbGF5KDIwKTsKKworCWlmICghdHJpZXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCSUdNQUM6IFRyYW5zbWl0dGVyIHdpbGwgbm90IHJlc2V0LlxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiQklHTUFDOiB0eF9jZmcgaXMgJTA4eFxuIiwKKwkJICAgICAgIHNidXNfcmVhZGwoYnJlZ3MgKyBCTUFDX1RYQ0ZHKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBiaWdtYWNfcnhfcmVzZXQodm9pZCBfX2lvbWVtICpicmVncykKK3sKKwlpbnQgdHJpZXMgPSBSWF9SRVNFVF9UUklFUzsKKworCXNidXNfd3JpdGVsKDAsIGJyZWdzICsgQk1BQ19SWENGRyk7CisJd2hpbGUgKHNidXNfcmVhZGwoYnJlZ3MgKyBCTUFDX1JYQ0ZHKSAmJiAtLXRyaWVzKQorCQl1ZGVsYXkoMjApOworCisJaWYgKCF0cmllcykgeworCQlwcmludGsoS0VSTl9FUlIgIkJJR01BQzogUmVjZWl2ZXIgd2lsbCBub3QgcmVzZXQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJCSUdNQUM6IHJ4X2NmZyBpcyAlMDh4XG4iLAorCQkgICAgICAgc2J1c19yZWFkbChicmVncyArIEJNQUNfUlhDRkcpKTsKKwl9Cit9CisKKy8qIFJlc2V0IHRoZSB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIuICovCitzdGF0aWMgdm9pZCBiaWdtYWNfc3RvcChzdHJ1Y3QgYmlnbWFjICpicCkKK3sKKwliaWdtYWNfdHhfcmVzZXQoYnAtPmJyZWdzKTsKKwliaWdtYWNfcnhfcmVzZXQoYnAtPmJyZWdzKTsKK30KKworc3RhdGljIHZvaWQgYmlnbWFjX2dldF9jb3VudGVycyhzdHJ1Y3QgYmlnbWFjICpicCwgdm9pZCBfX2lvbWVtICpicmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmYnAtPmVuZXRfc3RhdHM7CisKKwlzdGF0cy0+cnhfY3JjX2Vycm9ycyArPSBzYnVzX3JlYWRsKGJyZWdzICsgQk1BQ19SQ1JDRUNUUik7CisJc2J1c193cml0ZWwoMCwgYnJlZ3MgKyBCTUFDX1JDUkNFQ1RSKTsKKworCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMgKz0gc2J1c19yZWFkbChicmVncyArIEJNQUNfVU5BTEVDVFIpOworCXNidXNfd3JpdGVsKDAsIGJyZWdzICsgQk1BQ19VTkFMRUNUUik7CisKKwlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyArPSBzYnVzX3JlYWRsKGJyZWdzICsgQk1BQ19HTEVDVFIpOworCXNidXNfd3JpdGVsKDAsIGJyZWdzICsgQk1BQ19HTEVDVFIpOworCisJc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzICs9IHNidXNfcmVhZGwoYnJlZ3MgKyBCTUFDX0VYQ1RSKTsKKworCXN0YXRzLT5jb2xsaXNpb25zICs9CisJCShzYnVzX3JlYWRsKGJyZWdzICsgQk1BQ19FWENUUikgKworCQkgc2J1c19yZWFkbChicmVncyArIEJNQUNfTFRDVFIpKTsKKwlzYnVzX3dyaXRlbCgwLCBicmVncyArIEJNQUNfRVhDVFIpOworCXNidXNfd3JpdGVsKDAsIGJyZWdzICsgQk1BQ19MVENUUik7Cit9CisKK3N0YXRpYyB2b2lkIGJpZ21hY19jbGVhbl9yaW5ncyhzdHJ1Y3QgYmlnbWFjICpicCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlpZiAoYnAtPnJ4X3NrYnNbaV0gIT0gTlVMTCkgeworCQkJZGV2X2tmcmVlX3NrYl9hbnkoYnAtPnJ4X3NrYnNbaV0pOworCQkJYnAtPnJ4X3NrYnNbaV0gPSBOVUxMOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCWlmIChicC0+dHhfc2tic1tpXSAhPSBOVUxMKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShicC0+dHhfc2tic1tpXSk7CisJCQlicC0+dHhfc2tic1tpXSA9IE5VTEw7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJpZ21hY19pbml0X3JpbmdzKHN0cnVjdCBiaWdtYWMgKmJwLCBpbnQgZnJvbV9pcnEpCit7CisJc3RydWN0IGJtYWNfaW5pdF9ibG9jayAqYmIgPSBicC0+Ym1hY19ibG9jazsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYnAtPmRldjsKKwlpbnQgaSwgZ2ZwX2ZsYWdzID0gR0ZQX0tFUk5FTDsKKworCWlmIChmcm9tX2lycSB8fCBpbl9pbnRlcnJ1cHQoKSkKKwkJZ2ZwX2ZsYWdzID0gR0ZQX0FUT01JQzsKKworCWJwLT5yeF9uZXcgPSBicC0+cnhfb2xkID0gYnAtPnR4X25ldyA9IGJwLT50eF9vbGQgPSAwOworCisJLyogRnJlZSBhbnkgc2tpcHB5IGJ1ZnMgbGVmdCBhcm91bmQgaW4gdGhlIHJpbmdzLiAqLworCWJpZ21hY19jbGVhbl9yaW5ncyhicCk7CisKKwkvKiBOb3cgZ2V0IG5ldyBza2J1ZnMgZm9yIHRoZSByZWNlaXZlIHJpbmcuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJc2tiID0gYmlnX21hY19hbGxvY19za2IoUlhfQlVGX0FMTE9DX1NJWkUsIGdmcF9mbGFncyk7CisJCWlmICghc2tiKQorCQkJY29udGludWU7CisKKwkJYnAtPnJ4X3NrYnNbaV0gPSBza2I7CisJCXNrYi0+ZGV2ID0gZGV2OworCisJCS8qIEJlY2F1c2Ugd2UgcmVzZXJ2ZSBhZnRlcndhcmRzLiAqLworCQlza2JfcHV0KHNrYiwgRVRIX0ZSQU1FX0xFTik7CisJCXNrYl9yZXNlcnZlKHNrYiwgMzQpOworCisJCWJiLT5iZV9yeGRbaV0ucnhfYWRkciA9CisJCQlzYnVzX21hcF9zaW5nbGUoYnAtPmJpZ21hY19zZGV2LCBza2ItPmRhdGEsCisJCQkJCVJYX0JVRl9BTExPQ19TSVpFIC0gMzQsCisJCQkJCVNCVVNfRE1BX0ZST01ERVZJQ0UpOworCQliYi0+YmVfcnhkW2ldLnJ4X2ZsYWdzID0KKwkJCShSWERfT1dOIHwgKChSWF9CVUZfQUxMT0NfU0laRSAtIDM0KSAmIFJYRF9MRU5HVEgpKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCisJCWJiLT5iZV90eGRbaV0udHhfZmxhZ3MgPSBiYi0+YmVfdHhkW2ldLnR4X2FkZHIgPSAwOworfQorCisjZGVmaW5lIE1HTVRfQ0xLT04gIChNR01UX1BBTF9JTlRfTURJT3xNR01UX1BBTF9FWFRfTURJT3xNR01UX1BBTF9PRU5BQnxNR01UX1BBTF9EQ0xPQ0spCisjZGVmaW5lIE1HTVRfQ0xLT0ZGIChNR01UX1BBTF9JTlRfTURJT3xNR01UX1BBTF9FWFRfTURJT3xNR01UX1BBTF9PRU5BQikKKworc3RhdGljIHZvaWQgaWRsZV90cmFuc2NlaXZlcih2b2lkIF9faW9tZW0gKnRyZWdzKQoreworCWludCBpID0gMjA7CisKKwl3aGlsZSAoaS0tKSB7CisJCXNidXNfd3JpdGVsKE1HTVRfQ0xLT0ZGLCB0cmVncyArIFRDVlJfTVBBTCk7CisJCXNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlzYnVzX3dyaXRlbChNR01UX0NMS09OLCB0cmVncyArIFRDVlJfTVBBTCk7CisJCXNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpOworCX0KK30KKworc3RhdGljIHZvaWQgd3JpdGVfdGN2cl9iaXQoc3RydWN0IGJpZ21hYyAqYnAsIHZvaWQgX19pb21lbSAqdHJlZ3MsIGludCBiaXQpCit7CisJaWYgKGJwLT50Y3ZyX3R5cGUgPT0gaW50ZXJuYWwpIHsKKwkJYml0ID0gKGJpdCAmIDEpIDw8IDM7CisJCXNidXNfd3JpdGVsKGJpdCB8IChNR01UX1BBTF9PRU5BQiB8IE1HTVRfUEFMX0VYVF9NRElPKSwKKwkJCSAgICB0cmVncyArIFRDVlJfTVBBTCk7CisJCXNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlzYnVzX3dyaXRlbChiaXQgfCBNR01UX1BBTF9PRU5BQiB8IE1HTVRfUEFMX0VYVF9NRElPIHwgTUdNVF9QQUxfRENMT0NLLAorCQkJICAgIHRyZWdzICsgVENWUl9NUEFMKTsKKwkJc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCk7CisJfSBlbHNlIGlmIChicC0+dGN2cl90eXBlID09IGV4dGVybmFsKSB7CisJCWJpdCA9IChiaXQgJiAxKSA8PCAyOworCQlzYnVzX3dyaXRlbChiaXQgfCBNR01UX1BBTF9JTlRfTURJTyB8IE1HTVRfUEFMX09FTkFCLAorCQkJICAgIHRyZWdzICsgVENWUl9NUEFMKTsKKwkJc2J1c19yZWFkbCh0cmVncyArIFRDVlJfTVBBTCk7CisJCXNidXNfd3JpdGVsKGJpdCB8IE1HTVRfUEFMX0lOVF9NRElPIHwgTUdNVF9QQUxfT0VOQUIgfCBNR01UX1BBTF9EQ0xPQ0ssCisJCQkgICAgdHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIndyaXRlX3RjdnJfYml0OiBObyB0cmFuc2NlaXZlciB0eXBlIGtub3duIVxuIik7CisJfQorfQorCitzdGF0aWMgaW50IHJlYWRfdGN2cl9iaXQoc3RydWN0IGJpZ21hYyAqYnAsIHZvaWQgX19pb21lbSAqdHJlZ3MpCit7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAoYnAtPnRjdnJfdHlwZSA9PSBpbnRlcm5hbCkgeworCQlzYnVzX3dyaXRlbChNR01UX1BBTF9FWFRfTURJTywgdHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKTsKKwkJc2J1c193cml0ZWwoTUdNVF9QQUxfRVhUX01ESU8gfCBNR01UX1BBTF9EQ0xPQ0ssCisJCQkgICAgdHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKTsKKwkJcmV0dmFsID0gKHNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpICYgTUdNVF9QQUxfSU5UX01ESU8pID4+IDM7CisJfSBlbHNlIGlmIChicC0+dGN2cl90eXBlID09IGV4dGVybmFsKSB7CisJCXNidXNfd3JpdGVsKE1HTVRfUEFMX0lOVF9NRElPLCB0cmVncyArIFRDVlJfTVBBTCk7CisJCXNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlzYnVzX3dyaXRlbChNR01UX1BBTF9JTlRfTURJTyB8IE1HTVRfUEFMX0RDTE9DSywgdHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKTsKKwkJcmV0dmFsID0gKHNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpICYgTUdNVF9QQUxfRVhUX01ESU8pID4+IDI7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyZWFkX3RjdnJfYml0OiBObyB0cmFuc2NlaXZlciB0eXBlIGtub3duIVxuIik7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF90Y3ZyX2JpdDIoc3RydWN0IGJpZ21hYyAqYnAsIHZvaWQgX19pb21lbSAqdHJlZ3MpCit7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAoYnAtPnRjdnJfdHlwZSA9PSBpbnRlcm5hbCkgeworCQlzYnVzX3dyaXRlbChNR01UX1BBTF9FWFRfTURJTywgdHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKTsKKwkJcmV0dmFsID0gKHNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpICYgTUdNVF9QQUxfSU5UX01ESU8pID4+IDM7CisJCXNidXNfd3JpdGVsKE1HTVRfUEFMX0VYVF9NRElPIHwgTUdNVF9QQUxfRENMT0NLLCB0cmVncyArIFRDVlJfTVBBTCk7CisJCXNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpOworCX0gZWxzZSBpZiAoYnAtPnRjdnJfdHlwZSA9PSBleHRlcm5hbCkgeworCQlzYnVzX3dyaXRlbChNR01UX1BBTF9JTlRfTURJTywgdHJlZ3MgKyBUQ1ZSX01QQUwpOworCQlzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKTsKKwkJcmV0dmFsID0gKHNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpICYgTUdNVF9QQUxfRVhUX01ESU8pID4+IDI7CisJCXNidXNfd3JpdGVsKE1HTVRfUEFMX0lOVF9NRElPIHwgTUdNVF9QQUxfRENMT0NLLCB0cmVncyArIFRDVlJfTVBBTCk7CisJCXNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAicmVhZF90Y3ZyX2JpdDI6IE5vIHRyYW5zY2VpdmVyIHR5cGUga25vd24hXG4iKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgcHV0X3RjdnJfYnl0ZShzdHJ1Y3QgYmlnbWFjICpicCwKKwkJCSAgdm9pZCBfX2lvbWVtICp0cmVncywKKwkJCSAgdW5zaWduZWQgaW50IGJ5dGUpCit7CisJaW50IHNoaWZ0ID0gNDsKKworCWRvIHsKKwkJd3JpdGVfdGN2cl9iaXQoYnAsIHRyZWdzLCAoKGJ5dGUgPj4gc2hpZnQpICYgMSkpOworCQlzaGlmdCAtPSAxOworCX0gd2hpbGUgKHNoaWZ0ID49IDApOworfQorCitzdGF0aWMgdm9pZCBiaWdtYWNfdGN2cl93cml0ZShzdHJ1Y3QgYmlnbWFjICpicCwgdm9pZCBfX2lvbWVtICp0cmVncywKKwkJCSAgICAgIGludCByZWcsIHVuc2lnbmVkIHNob3J0IHZhbCkKK3sKKwlpbnQgc2hpZnQ7CisKKwlyZWcgJj0gMHhmZjsKKwl2YWwgJj0gMHhmZmZmOworCXN3aXRjaChicC0+dGN2cl90eXBlKSB7CisJY2FzZSBpbnRlcm5hbDoKKwljYXNlIGV4dGVybmFsOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiYmlnbWFjX3RjdnJfcmVhZDogV2hvb3BzLCBubyBrbm93biB0cmFuc2NlaXZlciB0eXBlLlxuIik7CisJCXJldHVybjsKKwl9OworCisJaWRsZV90cmFuc2NlaXZlcih0cmVncyk7CisJd3JpdGVfdGN2cl9iaXQoYnAsIHRyZWdzLCAwKTsKKwl3cml0ZV90Y3ZyX2JpdChicCwgdHJlZ3MsIDEpOworCXdyaXRlX3RjdnJfYml0KGJwLCB0cmVncywgMCk7CisJd3JpdGVfdGN2cl9iaXQoYnAsIHRyZWdzLCAxKTsKKworCXB1dF90Y3ZyX2J5dGUoYnAsIHRyZWdzLAorCQkgICAgICAoKGJwLT50Y3ZyX3R5cGUgPT0gaW50ZXJuYWwpID8KKwkJICAgICAgIEJJR01BQ19QSFlfSU5URVJOQUwgOiBCSUdNQUNfUEhZX0VYVEVSTkFMKSk7CisKKwlwdXRfdGN2cl9ieXRlKGJwLCB0cmVncywgcmVnKTsKKworCXdyaXRlX3RjdnJfYml0KGJwLCB0cmVncywgMSk7CisJd3JpdGVfdGN2cl9iaXQoYnAsIHRyZWdzLCAwKTsKKworCXNoaWZ0ID0gMTU7CisJZG8geworCQl3cml0ZV90Y3ZyX2JpdChicCwgdHJlZ3MsICh2YWwgPj4gc2hpZnQpICYgMSk7CisJCXNoaWZ0IC09IDE7CisJfSB3aGlsZSAoc2hpZnQgPj0gMCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiaWdtYWNfdGN2cl9yZWFkKHN0cnVjdCBiaWdtYWMgKmJwLAorCQkJCSAgICAgICB2b2lkIF9faW9tZW0gKnRyZWdzLAorCQkJCSAgICAgICBpbnQgcmVnKQoreworCXVuc2lnbmVkIHNob3J0IHJldHZhbCA9IDA7CisKKwlyZWcgJj0gMHhmZjsKKwlzd2l0Y2goYnAtPnRjdnJfdHlwZSkgeworCWNhc2UgaW50ZXJuYWw6CisJY2FzZSBleHRlcm5hbDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgImJpZ21hY190Y3ZyX3JlYWQ6IFdob29wcywgbm8ga25vd24gdHJhbnNjZWl2ZXIgdHlwZS5cbiIpOworCQlyZXR1cm4gMHhmZmZmOworCX07CisKKwlpZGxlX3RyYW5zY2VpdmVyKHRyZWdzKTsKKwl3cml0ZV90Y3ZyX2JpdChicCwgdHJlZ3MsIDApOworCXdyaXRlX3RjdnJfYml0KGJwLCB0cmVncywgMSk7CisJd3JpdGVfdGN2cl9iaXQoYnAsIHRyZWdzLCAxKTsKKwl3cml0ZV90Y3ZyX2JpdChicCwgdHJlZ3MsIDApOworCisJcHV0X3RjdnJfYnl0ZShicCwgdHJlZ3MsCisJCSAgICAgICgoYnAtPnRjdnJfdHlwZSA9PSBpbnRlcm5hbCkgPworCQkgICAgICAgQklHTUFDX1BIWV9JTlRFUk5BTCA6IEJJR01BQ19QSFlfRVhURVJOQUwpKTsKKworCXB1dF90Y3ZyX2J5dGUoYnAsIHRyZWdzLCByZWcpOworCisJaWYgKGJwLT50Y3ZyX3R5cGUgPT0gZXh0ZXJuYWwpIHsKKwkJaW50IHNoaWZ0ID0gMTU7CisKKwkJKHZvaWQpIHJlYWRfdGN2cl9iaXQyKGJwLCB0cmVncyk7CisJCSh2b2lkKSByZWFkX3RjdnJfYml0MihicCwgdHJlZ3MpOworCisJCWRvIHsKKwkJCWludCB0bXA7CisKKwkJCXRtcCA9IHJlYWRfdGN2cl9iaXQyKGJwLCB0cmVncyk7CisJCQlyZXR2YWwgfD0gKCh0bXAgJiAxKSA8PCBzaGlmdCk7CisJCQlzaGlmdCAtPSAxOworCQl9IHdoaWxlIChzaGlmdCA+PSAwKTsKKworCQkodm9pZCkgcmVhZF90Y3ZyX2JpdDIoYnAsIHRyZWdzKTsKKwkJKHZvaWQpIHJlYWRfdGN2cl9iaXQyKGJwLCB0cmVncyk7CisJCSh2b2lkKSByZWFkX3RjdnJfYml0MihicCwgdHJlZ3MpOworCX0gZWxzZSB7CisJCWludCBzaGlmdCA9IDE1OworCisJCSh2b2lkKSByZWFkX3RjdnJfYml0KGJwLCB0cmVncyk7CisJCSh2b2lkKSByZWFkX3RjdnJfYml0KGJwLCB0cmVncyk7CisKKwkJZG8geworCQkJaW50IHRtcDsKKworCQkJdG1wID0gcmVhZF90Y3ZyX2JpdChicCwgdHJlZ3MpOworCQkJcmV0dmFsIHw9ICgodG1wICYgMSkgPDwgc2hpZnQpOworCQkJc2hpZnQgLT0gMTsKKwkJfSB3aGlsZSAoc2hpZnQgPj0gMCk7CisKKwkJKHZvaWQpIHJlYWRfdGN2cl9iaXQoYnAsIHRyZWdzKTsKKwkJKHZvaWQpIHJlYWRfdGN2cl9iaXQoYnAsIHRyZWdzKTsKKwkJKHZvaWQpIHJlYWRfdGN2cl9iaXQoYnAsIHRyZWdzKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgYmlnbWFjX3RjdnJfaW5pdChzdHJ1Y3QgYmlnbWFjICpicCkKK3sKKwl2b2lkIF9faW9tZW0gKnRyZWdzID0gYnAtPnRyZWdzOworCXUzMiBtcGFsOworCisJaWRsZV90cmFuc2NlaXZlcih0cmVncyk7CisJc2J1c193cml0ZWwoTUdNVF9QQUxfSU5UX01ESU8gfCBNR01UX1BBTF9FWFRfTURJTyB8IE1HTVRfUEFMX0RDTE9DSywKKwkJICAgIHRyZWdzICsgVENWUl9NUEFMKTsKKwlzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKTsKKworCS8qIE9ubHkgdGhlIGJpdCBmb3IgdGhlIHByZXNlbnQgdHJhbnNjZWl2ZXIgKGludGVybmFsIG9yCisJICogZXh0ZXJuYWwpIHdpbGwgc3RpY2ssIHNldCB0aGVtIGJvdGggYW5kIHNlZSB3aGF0IHN0YXlzLgorCSAqLworCXNidXNfd3JpdGVsKE1HTVRfUEFMX0lOVF9NRElPIHwgTUdNVF9QQUxfRVhUX01ESU8sIHRyZWdzICsgVENWUl9NUEFMKTsKKwlzYnVzX3JlYWRsKHRyZWdzICsgVENWUl9NUEFMKTsKKwl1ZGVsYXkoMjApOworCisJbXBhbCA9IHNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpOworCWlmIChtcGFsICYgTUdNVF9QQUxfRVhUX01ESU8pIHsKKwkJYnAtPnRjdnJfdHlwZSA9IGV4dGVybmFsOworCQlzYnVzX3dyaXRlbCh+KFRDVlJfUEFMX0VYVExCQUNLIHwgVENWUl9QQUxfTVNFTlNFIHwgVENWUl9QQUxfTFRFTkFCTEUpLAorCQkJICAgIHRyZWdzICsgVENWUl9UUEFMKTsKKwkJc2J1c19yZWFkbCh0cmVncyArIFRDVlJfVFBBTCk7CisJfSBlbHNlIGlmIChtcGFsICYgTUdNVF9QQUxfSU5UX01ESU8pIHsKKwkJYnAtPnRjdnJfdHlwZSA9IGludGVybmFsOworCQlzYnVzX3dyaXRlbCh+KFRDVlJfUEFMX1NFUklBTCB8IFRDVlJfUEFMX0VYVExCQUNLIHwKKwkJCSAgICAgIFRDVlJfUEFMX01TRU5TRSB8IFRDVlJfUEFMX0xURU5BQkxFKSwKKwkJCSAgICB0cmVncyArIFRDVlJfVFBBTCk7CisJCXNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX1RQQUwpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiQklHTUFDOiBBSUVFRSwgbmVpdGhlciBpbnRlcm5hbCBub3IgIgorCQkgICAgICAgImV4dGVybmFsIE1ESU8gYXZhaWxhYmxlIVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiQklHTUFDOiBtZ210X3BhbFslMDh4XSB0Y3ZyX3BhbFslMDh4XVxuIiwKKwkJICAgICAgIHNidXNfcmVhZGwodHJlZ3MgKyBUQ1ZSX01QQUwpLAorCQkgICAgICAgc2J1c19yZWFkbCh0cmVncyArIFRDVlJfVFBBTCkpOworCX0KK30KKworc3RhdGljIGludCBiaWdtYWNfaW5pdChzdHJ1Y3QgYmlnbWFjICosIGludCk7CisKK3N0YXRpYyBpbnQgdHJ5X25leHRfcGVybXV0YXRpb24oc3RydWN0IGJpZ21hYyAqYnAsIHZvaWQgX19pb21lbSAqdHJlZ3MpCit7CisJaWYgKGJwLT5zd19ibWNyICYgQk1DUl9TUEVFRDEwMCkgeworCQlpbnQgdGltZW91dDsKKworCQkvKiBSZXNldCB0aGUgUEhZLiAqLworCQlicC0+c3dfYm1jcgk9IChCTUNSX0lTT0xBVEUgfCBCTUNSX1BET1dOIHwgQk1DUl9MT09QQkFDSyk7CisJCWJpZ21hY190Y3ZyX3dyaXRlKGJwLCB0cmVncywgQklHTUFDX0JNQ1IsIGJwLT5zd19ibWNyKTsKKwkJYnAtPnN3X2JtY3IJPSAoQk1DUl9SRVNFVCk7CisJCWJpZ21hY190Y3ZyX3dyaXRlKGJwLCB0cmVncywgQklHTUFDX0JNQ1IsIGJwLT5zd19ibWNyKTsKKworCQl0aW1lb3V0ID0gNjQ7CisJCXdoaWxlICgtLXRpbWVvdXQpIHsKKwkJCWJwLT5zd19ibWNyID0gYmlnbWFjX3RjdnJfcmVhZChicCwgdHJlZ3MsIEJJR01BQ19CTUNSKTsKKwkJCWlmICgoYnAtPnN3X2JtY3IgJiBCTUNSX1JFU0VUKSA9PSAwKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDIwKTsKKwkJfQorCQlpZiAodGltZW91dCA9PSAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUEhZIHJlc2V0IGZhaWxlZC5cbiIsIGJwLT5kZXYtPm5hbWUpOworCisJCWJwLT5zd19ibWNyID0gYmlnbWFjX3RjdnJfcmVhZChicCwgdHJlZ3MsIEJJR01BQ19CTUNSKTsKKworCQkvKiBOb3cgd2UgdHJ5IDEwYmFzZVQuICovCisJCWJwLT5zd19ibWNyICY9IH4oQk1DUl9TUEVFRDEwMCk7CisJCWJpZ21hY190Y3ZyX3dyaXRlKGJwLCB0cmVncywgQklHTUFDX0JNQ1IsIGJwLT5zd19ibWNyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogV2UndmUgdHJpZWQgdGhlbSBhbGwuICovCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBiaWdtYWNfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBiaWdtYWMgKmJwID0gKHN0cnVjdCBiaWdtYWMgKikgZGF0YTsKKwl2b2lkIF9faW9tZW0gKnRyZWdzID0gYnAtPnRyZWdzOworCWludCByZXN0YXJ0X3RpbWVyID0gMDsKKworCWJwLT50aW1lcl90aWNrcysrOworCWlmIChicC0+dGltZXJfc3RhdGUgPT0gbHRyeXdhaXQpIHsKKwkJYnAtPnN3X2Jtc3IgPSBiaWdtYWNfdGN2cl9yZWFkKGJwLCB0cmVncywgQklHTUFDX0JNU1IpOworCQlicC0+c3dfYm1jciA9IGJpZ21hY190Y3ZyX3JlYWQoYnAsIHRyZWdzLCBCSUdNQUNfQk1DUik7CisJCWlmIChicC0+c3dfYm1zciAmIEJNU1JfTFNUQVRVUykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpbmsgaXMgbm93IHVwIGF0ICVzLlxuIiwKKwkJCSAgICAgICBicC0+ZGV2LT5uYW1lLAorCQkJICAgICAgIChicC0+c3dfYm1jciAmIEJNQ1JfU1BFRUQxMDApID8KKwkJCSAgICAgICAiMTAwYmFzZVQiIDogIjEwYmFzZVQiKTsKKwkJCWJwLT50aW1lcl9zdGF0ZSA9IGFzbGVlcDsKKwkJCXJlc3RhcnRfdGltZXIgPSAwOworCQl9IGVsc2UgeworCQkJaWYgKGJwLT50aW1lcl90aWNrcyA+PSA0KSB7CisJCQkJaW50IHJldDsKKworCQkJCXJldCA9IHRyeV9uZXh0X3Blcm11dGF0aW9uKGJwLCB0cmVncyk7CisJCQkJaWYgKHJldCA9PSAtMSkgeworCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBMaW5rIGRvd24sIGNhYmxlIHByb2JsZW0/XG4iLAorCQkJCQkgICAgICAgYnAtPmRldi0+bmFtZSk7CisJCQkJCXJldCA9IGJpZ21hY19pbml0KGJwLCAwKTsKKwkJCQkJaWYgKHJldCkgeworCQkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IsIGNhbm5vdCByZS1pbml0IHRoZSAiCisJCQkJCQkgICAgICAgIkJpZ01BQy5cbiIsIGJwLT5kZXYtPm5hbWUpOworCQkJCQl9CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJYnAtPnRpbWVyX3RpY2tzID0gMDsKKwkJCQlyZXN0YXJ0X3RpbWVyID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJcmVzdGFydF90aW1lciA9IDE7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBDYW4ndCBoYXBwZW5zLi4uLiAqLworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBBaWVlZSwgbGluayB0aW1lciBpcyBhc2xlZXAgYnV0IHdlIGdvdCBvbmUgYW55d2F5cyFcbiIsCisJCSAgICAgICBicC0+ZGV2LT5uYW1lKTsKKwkJcmVzdGFydF90aW1lciA9IDA7CisJCWJwLT50aW1lcl90aWNrcyA9IDA7CisJCWJwLT50aW1lcl9zdGF0ZSA9IGFzbGVlcDsgLyogZm9vIG9uIHlvdSAqLworCX0KKworCWlmIChyZXN0YXJ0X3RpbWVyICE9IDApIHsKKwkJYnAtPmJpZ21hY190aW1lci5leHBpcmVzID0gamlmZmllcyArICgoMTIgKiBIWikvMTApOyAvKiAxLjIgc2VjLiAqLworCQlhZGRfdGltZXIoJmJwLT5iaWdtYWNfdGltZXIpOworCX0KK30KKworLyogV2VsbCwgcmVhbGx5IHdlIGp1c3QgZm9yY2UgdGhlIGNoaXAgaW50byAxMDBiYXNlVCB0aGVuCisgKiAxMGJhc2VULCBlYWNoIHRpbWUgY2hlY2tpbmcgZm9yIGEgbGluayBzdGF0dXMuCisgKi8KK3N0YXRpYyB2b2lkIGJpZ21hY19iZWdpbl9hdXRvX25lZ290aWF0aW9uKHN0cnVjdCBiaWdtYWMgKmJwKQoreworCXZvaWQgX19pb21lbSAqdHJlZ3MgPSBicC0+dHJlZ3M7CisJaW50IHRpbWVvdXQ7CisKKwkvKiBHcmFiIG5ldyBzb2Z0d2FyZSBjb3BpZXMgb2YgUEhZIHJlZ2lzdGVycy4gKi8KKwlicC0+c3dfYm1zcgk9IGJpZ21hY190Y3ZyX3JlYWQoYnAsIHRyZWdzLCBCSUdNQUNfQk1TUik7CisJYnAtPnN3X2JtY3IJPSBiaWdtYWNfdGN2cl9yZWFkKGJwLCB0cmVncywgQklHTUFDX0JNQ1IpOworCisJLyogUmVzZXQgdGhlIFBIWS4gKi8KKwlicC0+c3dfYm1jcgk9IChCTUNSX0lTT0xBVEUgfCBCTUNSX1BET1dOIHwgQk1DUl9MT09QQkFDSyk7CisJYmlnbWFjX3RjdnJfd3JpdGUoYnAsIHRyZWdzLCBCSUdNQUNfQk1DUiwgYnAtPnN3X2JtY3IpOworCWJwLT5zd19ibWNyCT0gKEJNQ1JfUkVTRVQpOworCWJpZ21hY190Y3ZyX3dyaXRlKGJwLCB0cmVncywgQklHTUFDX0JNQ1IsIGJwLT5zd19ibWNyKTsKKworCXRpbWVvdXQgPSA2NDsKKwl3aGlsZSAoLS10aW1lb3V0KSB7CisJCWJwLT5zd19ibWNyID0gYmlnbWFjX3RjdnJfcmVhZChicCwgdHJlZ3MsIEJJR01BQ19CTUNSKTsKKwkJaWYgKChicC0+c3dfYm1jciAmIEJNQ1JfUkVTRVQpID09IDApCisJCQlicmVhazsKKwkJdWRlbGF5KDIwKTsKKwl9CisJaWYgKHRpbWVvdXQgPT0gMCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUEhZIHJlc2V0IGZhaWxlZC5cbiIsIGJwLT5kZXYtPm5hbWUpOworCisJYnAtPnN3X2JtY3IgPSBiaWdtYWNfdGN2cl9yZWFkKGJwLCB0cmVncywgQklHTUFDX0JNQ1IpOworCisJLyogRmlyc3Qgd2UgdHJ5IDEwMGJhc2VULiAqLworCWJwLT5zd19ibWNyIHw9IEJNQ1JfU1BFRUQxMDA7CisJYmlnbWFjX3RjdnJfd3JpdGUoYnAsIHRyZWdzLCBCSUdNQUNfQk1DUiwgYnAtPnN3X2JtY3IpOworCisJYnAtPnRpbWVyX3N0YXRlID0gbHRyeXdhaXQ7CisJYnAtPnRpbWVyX3RpY2tzID0gMDsKKwlicC0+YmlnbWFjX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKDEyICogSFopIC8gMTA7CisJYnAtPmJpZ21hY190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGJwOworCWJwLT5iaWdtYWNfdGltZXIuZnVuY3Rpb24gPSAmYmlnbWFjX3RpbWVyOworCWFkZF90aW1lcigmYnAtPmJpZ21hY190aW1lcik7Cit9CisKK3N0YXRpYyBpbnQgYmlnbWFjX2luaXQoc3RydWN0IGJpZ21hYyAqYnAsIGludCBmcm9tX2lycSkKK3sKKwl2b2lkIF9faW9tZW0gKmdyZWdzICAgICAgICA9IGJwLT5ncmVnczsKKwl2b2lkIF9faW9tZW0gKmNyZWdzICAgICAgICA9IGJwLT5jcmVnOworCXZvaWQgX19pb21lbSAqYnJlZ3MgICAgICAgID0gYnAtPmJyZWdzOworCXVuc2lnbmVkIGNoYXIgKmUgPSAmYnAtPmRldi0+ZGV2X2FkZHJbMF07CisKKwkvKiBMYXRjaCBjdXJyZW50IGNvdW50ZXJzIGludG8gc3RhdGlzdGljcy4gKi8KKwliaWdtYWNfZ2V0X2NvdW50ZXJzKGJwLCBicmVncyk7CisKKwkvKiBSZXNldCBRRUMuICovCisJcWVjX2dsb2JhbF9yZXNldChncmVncyk7CisKKwkvKiBJbml0IFFFQy4gKi8KKwlxZWNfaW5pdChicCk7CisKKwkvKiBBbGxvYyBhbmQgcmVzZXQgdGhlIHR4L3J4IGRlc2NyaXB0b3IgY2hhaW5zLiAqLworCWJpZ21hY19pbml0X3JpbmdzKGJwLCBmcm9tX2lycSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBQSFkuICovCisJYmlnbWFjX3RjdnJfaW5pdChicCk7CisKKwkvKiBTdG9wIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlci4gKi8KKwliaWdtYWNfc3RvcChicCk7CisKKwkvKiBTZXQgaGFyZHdhcmUgZXRoZXJuZXQgYWRkcmVzcy4gKi8KKwlzYnVzX3dyaXRlbCgoKGVbNF0gPDwgOCkgfCBlWzVdKSwgYnJlZ3MgKyBCTUFDX01BQ0FERFIyKTsKKwlzYnVzX3dyaXRlbCgoKGVbMl0gPDwgOCkgfCBlWzNdKSwgYnJlZ3MgKyBCTUFDX01BQ0FERFIxKTsKKwlzYnVzX3dyaXRlbCgoKGVbMF0gPDwgOCkgfCBlWzFdKSwgYnJlZ3MgKyBCTUFDX01BQ0FERFIwKTsKKworCS8qIENsZWFyIHRoZSBoYXNoIHRhYmxlIHVudGlsIG1jIHVwbG9hZCBvY2N1cnMuICovCisJc2J1c193cml0ZWwoMCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTMpOworCXNidXNfd3JpdGVsKDAsIGJyZWdzICsgQk1BQ19IVEFCTEUyKTsKKwlzYnVzX3dyaXRlbCgwLCBicmVncyArIEJNQUNfSFRBQkxFMSk7CisJc2J1c193cml0ZWwoMCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTApOworCisJLyogRW5hYmxlIEJpZyBNYWMgaGFzaCB0YWJsZSBmaWx0ZXIuICovCisJc2J1c193cml0ZWwoQklHTUFDX1JYQ0ZHX0hFTkFCTEUgfCBCSUdNQUNfUlhDRkdfRklGTywKKwkJICAgIGJyZWdzICsgQk1BQ19SWENGRyk7CisJdWRlbGF5KDIwKTsKKworCS8qIE9rLCBjb25maWd1cmUgdGhlIEJpZyBNYWMgdHJhbnNtaXR0ZXIuICovCisJc2J1c193cml0ZWwoQklHTUFDX1RYQ0ZHX0ZJRk8sIGJyZWdzICsgQk1BQ19UWENGRyk7CisKKwkvKiBUaGUgSE1FIGRvY3MgcmVjb21tZW5kIHRvIHVzZSB0aGUgMTBMU0Igb2Ygb3VyIE1BQyBoZXJlLiAqLworCXNidXNfd3JpdGVsKCgoZVs1XSB8IGVbNF0gPDwgOCkgJiAweDNmZiksCisJCSAgICBicmVncyArIEJNQUNfUlNFRUQpOworCisJLyogRW5hYmxlIHRoZSBvdXRwdXQgZHJpdmVycyBubyBtYXR0ZXIgd2hhdC4gKi8KKwlzYnVzX3dyaXRlbChCSUdNQUNfWENGR19PREVOQUJMRSB8IEJJR01BQ19YQ0ZHX1JFU1YsCisJCSAgICBicmVncyArIEJNQUNfWElGQ0ZHKTsKKworCS8qIFRlbGwgdGhlIFFFQyB3aGVyZSB0aGUgcmluZyBkZXNjcmlwdG9ycyBhcmUuICovCisJc2J1c193cml0ZWwoYnAtPmJibG9ja19kdm1hICsgYmliX29mZnNldChiZV9yeGQsIDApLAorCQkgICAgY3JlZ3MgKyBDUkVHX1JYRFMpOworCXNidXNfd3JpdGVsKGJwLT5iYmxvY2tfZHZtYSArIGJpYl9vZmZzZXQoYmVfdHhkLCAwKSwKKwkJICAgIGNyZWdzICsgQ1JFR19UWERTKTsKKworCS8qIFNldHVwIHRoZSBGSUZPIHBvaW50ZXJzIGludG8gUUVDIGxvY2FsIG1lbW9yeS4gKi8KKwlzYnVzX3dyaXRlbCgwLCBjcmVncyArIENSRUdfUlhSQlVGUFRSKTsKKwlzYnVzX3dyaXRlbCgwLCBjcmVncyArIENSRUdfUlhXQlVGUFRSKTsKKwlzYnVzX3dyaXRlbChzYnVzX3JlYWRsKGdyZWdzICsgR0xPQl9SU0laRSksCisJCSAgICBjcmVncyArIENSRUdfVFhSQlVGUFRSKTsKKwlzYnVzX3dyaXRlbChzYnVzX3JlYWRsKGdyZWdzICsgR0xPQl9SU0laRSksCisJCSAgICBjcmVncyArIENSRUdfVFhXQlVGUFRSKTsKKworCS8qIFRlbGwgYmlnbWFjIHdoYXQgaW50ZXJydXB0cyB3ZSBkb24ndCB3YW50IHRvIGhlYXIgYWJvdXQuICovCisJc2J1c193cml0ZWwoQklHTUFDX0lNQVNLX0dPVEZSQU1FIHwgQklHTUFDX0lNQVNLX1NFTlRGUkFNRSwKKwkJICAgIGJyZWdzICsgQk1BQ19JTUFTSyk7CisKKwkvKiBFbmFibGUgdGhlIHZhcmlvdXMgb3RoZXIgaXJxJ3MuICovCisJc2J1c193cml0ZWwoMCwgY3JlZ3MgKyBDUkVHX1JJTUFTSyk7CisJc2J1c193cml0ZWwoMCwgY3JlZ3MgKyBDUkVHX1RJTUFTSyk7CisJc2J1c193cml0ZWwoMCwgY3JlZ3MgKyBDUkVHX1FNQVNLKTsKKwlzYnVzX3dyaXRlbCgwLCBjcmVncyArIENSRUdfQk1BU0spOworCisJLyogU2V0IGphbSBzaXplIHRvIGEgcmVhc29uYWJsZSBkZWZhdWx0LiAqLworCXNidXNfd3JpdGVsKERFRkFVTFRfSkFNU0laRSwgYnJlZ3MgKyBCTUFDX0pTSVpFKTsKKworCS8qIENsZWFyIGNvbGxpc2lvbiBjb3VudGVyLiAqLworCXNidXNfd3JpdGVsKDAsIGNyZWdzICsgQ1JFR19DQ05UKTsKKworCS8qIEVuYWJsZSB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIuICovCisJc2J1c193cml0ZWwoc2J1c19yZWFkbChicmVncyArIEJNQUNfVFhDRkcpIHwgQklHTUFDX1RYQ0ZHX0VOQUJMRSwKKwkJICAgIGJyZWdzICsgQk1BQ19UWENGRyk7CisJc2J1c193cml0ZWwoc2J1c19yZWFkbChicmVncyArIEJNQUNfUlhDRkcpIHwgQklHTUFDX1JYQ0ZHX0VOQUJMRSwKKwkJICAgIGJyZWdzICsgQk1BQ19SWENGRyk7CisKKwkvKiBPaywgc3RhcnQgZGV0ZWN0aW5nIGxpbmsgc3BlZWQvZHVwbGV4LiAqLworCWJpZ21hY19iZWdpbl9hdXRvX25lZ290aWF0aW9uKGJwKTsKKworCS8qIFN1Y2Nlc3MuICovCisJcmV0dXJuIDA7Cit9CisKKy8qIEVycm9yIGludGVycnVwdHMgZ2V0IHNlbnQgaGVyZS4gKi8KK3N0YXRpYyB2b2lkIGJpZ21hY19pc19tZWRpdW1fcmFyZShzdHJ1Y3QgYmlnbWFjICpicCwgdTMyIHFlY19zdGF0dXMsIHUzMiBibWFjX3N0YXR1cykKK3sKKwlwcmludGsoS0VSTl9FUlIgImJpZ21hY19pc19tZWRpdW1fcmFyZTogIik7CisJaWYgKHFlY19zdGF0dXMgJiAoR0xPQl9TVEFUX0VSIHwgR0xPQl9TVEFUX0JNKSkgeworCQlpZiAocWVjX3N0YXR1cyAmIEdMT0JfU1RBVF9FUikKKwkJCXByaW50aygiUUVDX0VSUk9SLCAiKTsKKwkJaWYgKHFlY19zdGF0dXMgJiBHTE9CX1NUQVRfQk0pCisJCQlwcmludGsoIlFFQ19CTUFDX0VSUk9SLCAiKTsKKwl9CisJaWYgKGJtYWNfc3RhdHVzICYgQ1JFR19TVEFUX0VSUk9SUykgeworCQlpZiAoYm1hY19zdGF0dXMgJiBDUkVHX1NUQVRfQkVSUk9SKQorCQkJcHJpbnRrKCJCTUFDX0VSUk9SLCAiKTsKKwkJaWYgKGJtYWNfc3RhdHVzICYgQ1JFR19TVEFUX1RYREVSUk9SKQorCQkJcHJpbnRrKCJUWERfRVJST1IsICIpOworCQlpZiAoYm1hY19zdGF0dXMgJiBDUkVHX1NUQVRfVFhMRVJSKQorCQkJcHJpbnRrKCJUWF9MQVRFX0VSUk9SLCAiKTsKKwkJaWYgKGJtYWNfc3RhdHVzICYgQ1JFR19TVEFUX1RYUEVSUikKKwkJCXByaW50aygiVFhfUEFSSVRZX0VSUk9SLCAiKTsKKwkJaWYgKGJtYWNfc3RhdHVzICYgQ1JFR19TVEFUX1RYU0VSUikKKwkJCXByaW50aygiVFhfU0JVU19FUlJPUiwgIik7CisKKwkJaWYgKGJtYWNfc3RhdHVzICYgQ1JFR19TVEFUX1JYRFJPUCkKKwkJCXByaW50aygiUlhfRFJPUF9FUlJPUiwgIik7CisKKwkJaWYgKGJtYWNfc3RhdHVzICYgQ1JFR19TVEFUX1JYU01BTEwpCisJCQlwcmludGsoIlJYX1NNQUxMX0VSUk9SLCAiKTsKKwkJaWYgKGJtYWNfc3RhdHVzICYgQ1JFR19TVEFUX1JYTEVSUikKKwkJCXByaW50aygiUlhfTEFURV9FUlJPUiwgIik7CisJCWlmIChibWFjX3N0YXR1cyAmIENSRUdfU1RBVF9SWFBFUlIpCisJCQlwcmludGsoIlJYX1BBUklUWV9FUlJPUiwgIik7CisJCWlmIChibWFjX3N0YXR1cyAmIENSRUdfU1RBVF9SWFNFUlIpCisJCQlwcmludGsoIlJYX1NCVVNfRVJST1IsICIpOworCX0KKworCXByaW50aygiIFJFU0VUXG4iKTsKKwliaWdtYWNfaW5pdChicCwgMSk7Cit9CisKKy8qIEJpZ01BQyB0cmFuc21pdCBjb21wbGV0ZSBzZXJ2aWNlIHJvdXRpbmVzLiAqLworc3RhdGljIHZvaWQgYmlnbWFjX3R4KHN0cnVjdCBiaWdtYWMgKmJwKQoreworCXN0cnVjdCBiZV90eGQgKnR4YmFzZSA9ICZicC0+Ym1hY19ibG9jay0+YmVfdHhkWzBdOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBicC0+ZGV2OworCWludCBlbGVtOworCisJc3Bpbl9sb2NrKCZicC0+bG9jayk7CisKKwllbGVtID0gYnAtPnR4X29sZDsKKwlEVFgoKCJiaWdtYWNfdHg6IHR4X29sZFslZF0gIiwgZWxlbSkpOworCXdoaWxlIChlbGVtICE9IGJwLT50eF9uZXcpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJc3RydWN0IGJlX3R4ZCAqdGhpcyA9ICZ0eGJhc2VbZWxlbV07CisKKwkJRFRYKCgidGhpcyglcCkgW2ZsYWdzKCUwOHgpYWRkciglMDh4KV0iLAorCQkgICAgIHRoaXMsIHRoaXMtPnR4X2ZsYWdzLCB0aGlzLT50eF9hZGRyKSk7CisKKwkJaWYgKHRoaXMtPnR4X2ZsYWdzICYgVFhEX09XTikKKwkJCWJyZWFrOworCQlza2IgPSBicC0+dHhfc2tic1tlbGVtXTsKKwkJYnAtPmVuZXRfc3RhdHMudHhfcGFja2V0cysrOworCQlicC0+ZW5ldF9zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJc2J1c191bm1hcF9zaW5nbGUoYnAtPmJpZ21hY19zZGV2LAorCQkJCSAgdGhpcy0+dHhfYWRkciwgc2tiLT5sZW4sCisJCQkJICBTQlVTX0RNQV9UT0RFVklDRSk7CisKKwkJRFRYKCgic2tiKCVwKSAiLCBza2IpKTsKKwkJYnAtPnR4X3NrYnNbZWxlbV0gPSBOVUxMOworCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCisJCWVsZW0gPSBORVhUX1RYKGVsZW0pOworCX0KKwlEVFgoKCIgRE9ORSwgdHhfb2xkPSVkXG4iLCBlbGVtKSk7CisJYnAtPnR4X29sZCA9IGVsZW07CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCisJICAgIFRYX0JVRkZTX0FWQUlMKGJwKSA+IDApCisJCW5ldGlmX3dha2VfcXVldWUoYnAtPmRldik7CisKKwlzcGluX3VubG9jaygmYnAtPmxvY2spOworfQorCisvKiBCaWdNQUMgcmVjZWl2ZSBjb21wbGV0ZSBzZXJ2aWNlIHJvdXRpbmVzLiAqLworc3RhdGljIHZvaWQgYmlnbWFjX3J4KHN0cnVjdCBiaWdtYWMgKmJwKQoreworCXN0cnVjdCBiZV9yeGQgKnJ4YmFzZSA9ICZicC0+Ym1hY19ibG9jay0+YmVfcnhkWzBdOworCXN0cnVjdCBiZV9yeGQgKnRoaXM7CisJaW50IGVsZW0gPSBicC0+cnhfbmV3LCBkcm9wcyA9IDA7CisJdTMyIGZsYWdzOworCisJdGhpcyA9ICZyeGJhc2VbZWxlbV07CisJd2hpbGUgKCEoKGZsYWdzID0gdGhpcy0+cnhfZmxhZ3MpICYgUlhEX09XTikpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJaW50IGxlbiA9IChmbGFncyAmIFJYRF9MRU5HVEgpOyAvKiBGQ1Mgbm90IGluY2x1ZGVkICovCisKKwkJLyogQ2hlY2sgZm9yIGVycm9ycy4gKi8KKwkJaWYgKGxlbiA8IEVUSF9aTEVOKSB7CisJCQlicC0+ZW5ldF9zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWJwLT5lbmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKworCWRyb3BfaXQ6CisJCQkvKiBSZXR1cm4gaXQgdG8gdGhlIEJpZ01BQy4gKi8KKwkJCWJwLT5lbmV0X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCXRoaXMtPnJ4X2ZsYWdzID0KKwkJCQkoUlhEX09XTiB8ICgoUlhfQlVGX0FMTE9DX1NJWkUgLSAzNCkgJiBSWERfTEVOR1RIKSk7CisJCQlnb3RvIG5leHQ7CisJCX0KKwkJc2tiID0gYnAtPnJ4X3NrYnNbZWxlbV07CisJCWlmIChsZW4gPiBSWF9DT1BZX1RIUkVTSE9MRCkgeworCQkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisKKwkJCS8qIE5vdyByZWZpbGwgdGhlIGVudHJ5LCBpZiB3ZSBjYW4uICovCisJCQluZXdfc2tiID0gYmlnX21hY19hbGxvY19za2IoUlhfQlVGX0FMTE9DX1NJWkUsIEdGUF9BVE9NSUMpOworCQkJaWYgKG5ld19za2IgPT0gTlVMTCkgeworCQkJCWRyb3BzKys7CisJCQkJZ290byBkcm9wX2l0OworCQkJfQorCQkJc2J1c191bm1hcF9zaW5nbGUoYnAtPmJpZ21hY19zZGV2LAorCQkJCQkgIHRoaXMtPnJ4X2FkZHIsCisJCQkJCSAgUlhfQlVGX0FMTE9DX1NJWkUgLSAzNCwKKwkJCQkJICBTQlVTX0RNQV9GUk9NREVWSUNFKTsKKwkJCWJwLT5yeF9za2JzW2VsZW1dID0gbmV3X3NrYjsKKwkJCW5ld19za2ItPmRldiA9IGJwLT5kZXY7CisJCQlza2JfcHV0KG5ld19za2IsIEVUSF9GUkFNRV9MRU4pOworCQkJc2tiX3Jlc2VydmUobmV3X3NrYiwgMzQpOworCQkJdGhpcy0+cnhfYWRkciA9IHNidXNfbWFwX3NpbmdsZShicC0+YmlnbWFjX3NkZXYsCisJCQkJCQkJbmV3X3NrYi0+ZGF0YSwKKwkJCQkJCQlSWF9CVUZfQUxMT0NfU0laRSAtIDM0LAorCQkJCQkJCVNCVVNfRE1BX0ZST01ERVZJQ0UpOworCQkJdGhpcy0+cnhfZmxhZ3MgPQorCQkJCShSWERfT1dOIHwgKChSWF9CVUZfQUxMT0NfU0laRSAtIDM0KSAmIFJYRF9MRU5HVEgpKTsKKworCQkJLyogVHJpbSB0aGUgb3JpZ2luYWwgc2tiIGZvciB0aGUgbmV0aWYuICovCisJCQlza2JfdHJpbShza2IsIGxlbik7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqY29weV9za2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDIpOworCisJCQlpZiAoY29weV9za2IgPT0gTlVMTCkgeworCQkJCWRyb3BzKys7CisJCQkJZ290byBkcm9wX2l0OworCQkJfQorCQkJY29weV9za2ItPmRldiA9IGJwLT5kZXY7CisJCQlza2JfcmVzZXJ2ZShjb3B5X3NrYiwgMik7CisJCQlza2JfcHV0KGNvcHlfc2tiLCBsZW4pOworCQkJc2J1c19kbWFfc3luY19zaW5nbGVfZm9yX2NwdShicC0+YmlnbWFjX3NkZXYsCisJCQkJCQkgICAgIHRoaXMtPnJ4X2FkZHIsIGxlbiwKKwkJCQkJCSAgICAgU0JVU19ETUFfRlJPTURFVklDRSk7CisJCQlldGhfY29weV9hbmRfc3VtKGNvcHlfc2tiLCAodW5zaWduZWQgY2hhciAqKXNrYi0+ZGF0YSwgbGVuLCAwKTsKKwkJCXNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoYnAtPmJpZ21hY19zZGV2LAorCQkJCQkJCXRoaXMtPnJ4X2FkZHIsIGxlbiwKKwkJCQkJCQlTQlVTX0RNQV9GUk9NREVWSUNFKTsKKworCQkJLyogUmV1c2Ugb3JpZ2luYWwgcmluZyBidWZmZXIuICovCisJCQl0aGlzLT5yeF9mbGFncyA9CisJCQkJKFJYRF9PV04gfCAoKFJYX0JVRl9BTExPQ19TSVpFIC0gMzQpICYgUlhEX0xFTkdUSCkpOworCisJCQlza2IgPSBjb3B5X3NrYjsKKwkJfQorCisJCS8qIE5vIGNoZWNrc3VtcyBkb25lIGJ5IHRoZSBCaWdNQUMgOy0oICovCisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGJwLT5kZXYpOworCQluZXRpZl9yeChza2IpOworCQlicC0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJYnAtPmVuZXRfc3RhdHMucnhfcGFja2V0cysrOworCQlicC0+ZW5ldF9zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJbmV4dDoKKwkJZWxlbSA9IE5FWFRfUlgoZWxlbSk7CisJCXRoaXMgPSAmcnhiYXNlW2VsZW1dOworCX0KKwlicC0+cnhfbmV3ID0gZWxlbTsKKwlpZiAoZHJvcHMpCisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IE1lbW9yeSBzcXVlZXplLCBkZWZlcnJpbmcgcGFja2V0LlxuIiwgYnAtPmRldi0+bmFtZSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBiaWdtYWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGJpZ21hYyAqYnAgPSAoc3RydWN0IGJpZ21hYyAqKSBkZXZfaWQ7CisJdTMyIHFlY19zdGF0dXMsIGJtYWNfc3RhdHVzOworCisJRElSUSgoImJpZ21hY19pbnRlcnJ1cHQ6ICIpKTsKKworCS8qIExhdGNoIHN0YXR1cyByZWdpc3RlcnMgbm93LiAqLworCWJtYWNfc3RhdHVzID0gc2J1c19yZWFkbChicC0+Y3JlZyArIENSRUdfU1RBVCk7CisJcWVjX3N0YXR1cyA9IHNidXNfcmVhZGwoYnAtPmdyZWdzICsgR0xPQl9TVEFUKTsKKworCURJUlEoKCJxZWNfc3RhdHVzPSUwOHggYm1hY19zdGF0dXM9JTA4eFxuIiwgcWVjX3N0YXR1cywgYm1hY19zdGF0dXMpKTsKKwlpZiAoKHFlY19zdGF0dXMgJiAoR0xPQl9TVEFUX0VSIHwgR0xPQl9TVEFUX0JNKSkgfHwKKwkgICAoYm1hY19zdGF0dXMgJiBDUkVHX1NUQVRfRVJST1JTKSkKKwkJYmlnbWFjX2lzX21lZGl1bV9yYXJlKGJwLCBxZWNfc3RhdHVzLCBibWFjX3N0YXR1cyk7CisKKwlpZiAoYm1hY19zdGF0dXMgJiBDUkVHX1NUQVRfVFhJUlEpCisJCWJpZ21hY190eChicCk7CisKKwlpZiAoYm1hY19zdGF0dXMgJiBDUkVHX1NUQVRfUlhJUlEpCisJCWJpZ21hY19yeChicCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgYmlnbWFjX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmlnbWFjICpicCA9IChzdHJ1Y3QgYmlnbWFjICopIGRldi0+cHJpdjsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZiaWdtYWNfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBicCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIkJJR01BQzogQ2FuJ3Qgb3JkZXIgaXJxICVkIHRvIGdvLlxuIiwgZGV2LT5pcnEpOworCQlyZXR1cm4gcmV0OworCX0KKwlpbml0X3RpbWVyKCZicC0+YmlnbWFjX3RpbWVyKTsKKwlyZXQgPSBiaWdtYWNfaW5pdChicCwgMCk7CisJaWYgKHJldCkKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGJwKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJpZ21hY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBiaWdtYWMgKmJwID0gKHN0cnVjdCBiaWdtYWMgKikgZGV2LT5wcml2OworCisJZGVsX3RpbWVyKCZicC0+YmlnbWFjX3RpbWVyKTsKKwlicC0+dGltZXJfc3RhdGUgPSBhc2xlZXA7CisJYnAtPnRpbWVyX3RpY2tzID0gMDsKKworCWJpZ21hY19zdG9wKGJwKTsKKwliaWdtYWNfY2xlYW5fcmluZ3MoYnApOworCWZyZWVfaXJxKGRldi0+aXJxLCBicCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJpZ21hY190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJpZ21hYyAqYnAgPSAoc3RydWN0IGJpZ21hYyAqKSBkZXYtPnByaXY7CisKKwliaWdtYWNfaW5pdChicCwgMCk7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisvKiBQdXQgYSBwYWNrZXQgb24gdGhlIHdpcmUuICovCitzdGF0aWMgaW50IGJpZ21hY19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJpZ21hYyAqYnAgPSAoc3RydWN0IGJpZ21hYyAqKSBkZXYtPnByaXY7CisJaW50IGxlbiwgZW50cnk7CisJdTMyIG1hcHBpbmc7CisKKwlsZW4gPSBza2ItPmxlbjsKKwltYXBwaW5nID0gc2J1c19tYXBfc2luZ2xlKGJwLT5iaWdtYWNfc2Rldiwgc2tiLT5kYXRhLCBsZW4sIFNCVVNfRE1BX1RPREVWSUNFKTsKKworCS8qIEF2b2lkIGEgcmFjZS4uLiAqLworCXNwaW5fbG9ja19pcnEoJmJwLT5sb2NrKTsKKwllbnRyeSA9IGJwLT50eF9uZXc7CisJRFRYKCgiYmlnbWFjX3N0YXJ0X3htaXQ6IGxlbiglZCkgZW50cnkoJWQpXG4iLCBsZW4sIGVudHJ5KSk7CisJYnAtPmJtYWNfYmxvY2stPmJlX3R4ZFtlbnRyeV0udHhfZmxhZ3MgPSBUWERfVVBEQVRFOworCWJwLT50eF9za2JzW2VudHJ5XSA9IHNrYjsKKwlicC0+Ym1hY19ibG9jay0+YmVfdHhkW2VudHJ5XS50eF9hZGRyID0gbWFwcGluZzsKKwlicC0+Ym1hY19ibG9jay0+YmVfdHhkW2VudHJ5XS50eF9mbGFncyA9CisJCShUWERfT1dOIHwgVFhEX1NPUCB8IFRYRF9FT1AgfCAobGVuICYgVFhEX0xFTkdUSCkpOworCWJwLT50eF9uZXcgPSBORVhUX1RYKGVudHJ5KTsKKwlpZiAoVFhfQlVGRlNfQVZBSUwoYnApIDw9IDApCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlzcGluX3VubG9ja19pcnEoJmJwLT5sb2NrKTsKKworCS8qIEdldCBpdCBnb2luZy4gKi8KKwlzYnVzX3dyaXRlbChDUkVHX0NUUkxfVFdBS0VVUCwgYnAtPmNyZWcgKyBDUkVHX0NUUkwpOworCisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmJpZ21hY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmlnbWFjICpicCA9IChzdHJ1Y3QgYmlnbWFjICopIGRldi0+cHJpdjsKKworCWJpZ21hY19nZXRfY291bnRlcnMoYnAsIGJwLT5icmVncyk7CisJcmV0dXJuICZicC0+ZW5ldF9zdGF0czsKK30KKworc3RhdGljIHZvaWQgYmlnbWFjX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmlnbWFjICpicCA9IChzdHJ1Y3QgYmlnbWFjICopIGRldi0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKmJyZWdzID0gYnAtPmJyZWdzOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pID0gZGV2LT5tY19saXN0OworCWNoYXIgKmFkZHJzOworCWludCBpOworCXUzMiB0bXAsIGNyYzsKKworCS8qIERpc2FibGUgdGhlIHJlY2VpdmVyLiAgVGhlIGJpdCBzZWxmLWNsZWFycyB3aGVuCisJICogdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4KKwkgKi8KKwl0bXAgPSBzYnVzX3JlYWRsKGJyZWdzICsgQk1BQ19SWENGRyk7CisJdG1wICY9IH4oQklHTUFDX1JYQ0ZHX0VOQUJMRSk7CisJc2J1c193cml0ZWwodG1wLCBicmVncyArIEJNQUNfUlhDRkcpOworCXdoaWxlICgoc2J1c19yZWFkbChicmVncyArIEJNQUNfUlhDRkcpICYgQklHTUFDX1JYQ0ZHX0VOQUJMRSkgIT0gMCkKKwkJdWRlbGF5KDIwKTsKKworCWlmICgoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgfHwgKGRldi0+bWNfY291bnQgPiA2NCkpIHsKKwkJc2J1c193cml0ZWwoMHhmZmZmLCBicmVncyArIEJNQUNfSFRBQkxFMCk7CisJCXNidXNfd3JpdGVsKDB4ZmZmZiwgYnJlZ3MgKyBCTUFDX0hUQUJMRTEpOworCQlzYnVzX3dyaXRlbCgweGZmZmYsIGJyZWdzICsgQk1BQ19IVEFCTEUyKTsKKwkJc2J1c193cml0ZWwoMHhmZmZmLCBicmVncyArIEJNQUNfSFRBQkxFMyk7CisJfSBlbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJdG1wID0gc2J1c19yZWFkbChicmVncyArIEJNQUNfUlhDRkcpOworCQl0bXAgfD0gQklHTUFDX1JYQ0ZHX1BNSVNDOworCQlzYnVzX3dyaXRlbCh0bXAsIGJyZWdzICsgQk1BQ19SWENGRyk7CisJfSBlbHNlIHsKKwkJdTE2IGhhc2hfdGFibGVbNF07CisKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCWhhc2hfdGFibGVbaV0gPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyspIHsKKwkJCWFkZHJzID0gZG1pLT5kbWlfYWRkcjsKKwkJCWRtaSA9IGRtaS0+bmV4dDsKKworCQkJaWYgKCEoKmFkZHJzICYgMSkpCisJCQkJY29udGludWU7CisKKwkJCWNyYyA9IGV0aGVyX2NyY19sZSg2LCBhZGRycyk7CisJCQljcmMgPj49IDI2OworCQkJaGFzaF90YWJsZVtjcmMgPj4gNF0gfD0gMSA8PCAoY3JjICYgMHhmKTsKKwkJfQorCQlzYnVzX3dyaXRlbChoYXNoX3RhYmxlWzBdLCBicmVncyArIEJNQUNfSFRBQkxFMCk7CisJCXNidXNfd3JpdGVsKGhhc2hfdGFibGVbMV0sIGJyZWdzICsgQk1BQ19IVEFCTEUxKTsKKwkJc2J1c193cml0ZWwoaGFzaF90YWJsZVsyXSwgYnJlZ3MgKyBCTUFDX0hUQUJMRTIpOworCQlzYnVzX3dyaXRlbChoYXNoX3RhYmxlWzNdLCBicmVncyArIEJNQUNfSFRBQkxFMyk7CisJfQorCisJLyogUmUtZW5hYmxlIHRoZSByZWNlaXZlci4gKi8KKwl0bXAgPSBzYnVzX3JlYWRsKGJyZWdzICsgQk1BQ19SWENGRyk7CisJdG1wIHw9IEJJR01BQ19SWENGR19FTkFCTEU7CisJc2J1c193cml0ZWwodG1wLCBicmVncyArIEJNQUNfUlhDRkcpOworfQorCisvKiBFdGh0b29sIHN1cHBvcnQuLi4gKi8KK3N0YXRpYyB2b2lkIGJpZ21hY19nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBiaWdtYWMgKmJwID0gZGV2LT5wcml2OworCisJc3RyY3B5KGluZm8tPmRyaXZlciwgInN1bmJtYWMiKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgIjIuMCIpOworCXNwcmludGYoaW5mby0+YnVzX2luZm8sICJTQlVTOiVkIiwKKwkJYnAtPnFlY19zZGV2LT5zbG90KTsKK30KKworc3RhdGljIHUzMiBiaWdtYWNfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmlnbWFjICpicCA9IGRldi0+cHJpdjsKKworCXNwaW5fbG9ja19pcnEoJmJwLT5sb2NrKTsKKwlicC0+c3dfYm1zciA9IGJpZ21hY190Y3ZyX3JlYWQoYnAsIGJwLT50cmVncywgQklHTUFDX0JNU1IpOworCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOworCisJcmV0dXJuIChicC0+c3dfYm1zciAmIEJNU1JfTFNUQVRVUyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgYmlnbWFjX2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBiaWdtYWNfZ2V0X2RydmluZm8sCisJLmdldF9saW5rCQk9IGJpZ21hY19nZXRfbGluaywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGJpZ21hY19ldGhlcl9pbml0KHN0cnVjdCBzYnVzX2RldiAqcWVjX3NkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdGF0aWMgaW50IHZlcnNpb25fcHJpbnRlZDsKKwlzdHJ1Y3QgYmlnbWFjICpicDsKKwl1OCBic2l6ZXMsIGJzaXplc19tb3JlOworCWludCBpOworCisJLyogR2V0IGEgbmV3IGRldmljZSBzdHJ1Y3QgZm9yIHRoaXMgaW50ZXJmYWNlLiAqLworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgYmlnbWFjKSk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWlmICh2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworCisJZGV2LT5iYXNlX2FkZHIgPSAobG9uZykgcWVjX3NkZXY7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IGlkcHJvbS0+aWRfZXRoYWRkcltpXTsKKworCS8qIFNldHVwIHNvZnRjLCB3aXRoIGJhY2twb2ludGVycyB0byBRRUMgYW5kIEJpZ01BQyBTQlVTIGRldmljZSBzdHJ1Y3RzLiAqLworCWJwID0gZGV2LT5wcml2OworCWJwLT5xZWNfc2RldiA9IHFlY19zZGV2OworCWJwLT5iaWdtYWNfc2RldiA9IHFlY19zZGV2LT5jaGlsZDsKKworCXNwaW5fbG9ja19pbml0KCZicC0+bG9jayk7CisKKwkvKiBWZXJpZnkgdGhlIHJlZ2lzdGVycyB3ZSBleHBlY3QsIGFyZSBhY3R1YWxseSB0aGVyZS4gKi8KKwlpZiAoKGJwLT5iaWdtYWNfc2Rldi0+bnVtX3JlZ2lzdGVycyAhPSAzKSB8fAorCSAgIChicC0+cWVjX3NkZXYtPm51bV9yZWdpc3RlcnMgIT0gMikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCSUdNQUM6IERldmljZSBkb2VzIG5vdCBoYXZlIDIgYW5kIDMgcmVncywgaXQgaGFzICVkIGFuZCAlZC5cbiIsCisJCSAgICAgICBicC0+cWVjX3NkZXYtPm51bV9yZWdpc3RlcnMsCisJCSAgICAgICBicC0+YmlnbWFjX3NkZXYtPm51bV9yZWdpc3RlcnMpOworCQlwcmludGsoS0VSTl9FUlIgIkJJR01BQzogV291bGQgeW91IGxpa2UgdGhhdCBmb3IgaGVyZSBvciB0byBnbz9cbiIpOworCQlnb3RvIGZhaWxfYW5kX2NsZWFudXA7CisJfQorCisJLyogTWFwIGluIFFFQyBnbG9iYWwgY29udHJvbCByZWdpc3RlcnMuICovCisJYnAtPmdyZWdzID0gc2J1c19pb3JlbWFwKCZicC0+cWVjX3NkZXYtPnJlc291cmNlWzBdLCAwLAorCQkJCSBHTE9CX1JFR19TSVpFLCAiQmlnTUFDIFFFQyBHTG9iYWwgUmVncyIpOworCWlmICghYnAtPmdyZWdzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQklHTUFDOiBDYW5ub3QgbWFwIFFFQyBnbG9iYWwgcmVnaXN0ZXJzLlxuIik7CisJCWdvdG8gZmFpbF9hbmRfY2xlYW51cDsKKwl9CisKKwkvKiBNYWtlIHN1cmUgUUVDIGlzIGluIEJpZ01BQyBtb2RlLiAqLworCWlmICgoc2J1c19yZWFkbChicC0+Z3JlZ3MgKyBHTE9CX0NUUkwpICYgMHhmMDAwMDAwMCkgIT0gR0xPQl9DVFJMX0JNT0RFKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQmlnTUFDOiBBSUVFRSwgUUVDIGlzIG5vdCBpbiBCaWdNQUMgbW9kZSFcbiIpOworCQlnb3RvIGZhaWxfYW5kX2NsZWFudXA7CisJfQorCisJLyogUmVzZXQgdGhlIFFFQy4gKi8KKwlpZiAocWVjX2dsb2JhbF9yZXNldChicC0+Z3JlZ3MpKQorCQlnb3RvIGZhaWxfYW5kX2NsZWFudXA7CisKKwkvKiBHZXQgc3VwcG9ydGVkIFNCVVMgYnVyc3Qgc2l6ZXMuICovCisJYnNpemVzID0gcHJvbV9nZXRpbnRkZWZhdWx0KGJwLT5xZWNfc2Rldi0+cHJvbV9ub2RlLAorCQkJCSAgICAiYnVyc3Qtc2l6ZXMiLAorCQkJCSAgICAweGZmKTsKKworCWJzaXplc19tb3JlID0gcHJvbV9nZXRpbnRkZWZhdWx0KGJwLT5xZWNfc2Rldi0+YnVzLT5wcm9tX25vZGUsCisJCQkJCSAiYnVyc3Qtc2l6ZXMiLAorCQkJCQkgMHhmZik7CisKKwlic2l6ZXMgJj0gMHhmZjsKKwlpZiAoYnNpemVzX21vcmUgIT0gMHhmZikKKwkJYnNpemVzICY9IGJzaXplc19tb3JlOworCWlmIChic2l6ZXMgPT0gMHhmZiB8fCAoYnNpemVzICYgRE1BX0JVUlNUMTYpID09IDAgfHwKKwkgICAgKGJzaXplcyAmIERNQV9CVVJTVDMyKSA9PSAwKQorCQlic2l6ZXMgPSAoRE1BX0JVUlNUMzIgLSAxKTsKKwlicC0+YmlnbWFjX2J1cnN0cyA9IGJzaXplczsKKworCS8qIFBlcmZvcm0gUUVDIGluaXRpYWxpemF0aW9uLiAqLworCXFlY19pbml0KGJwKTsKKworCS8qIE1hcCBpbiB0aGUgQmlnTUFDIGNoYW5uZWwgcmVnaXN0ZXJzLiAqLworCWJwLT5jcmVnID0gc2J1c19pb3JlbWFwKCZicC0+YmlnbWFjX3NkZXYtPnJlc291cmNlWzBdLCAwLAorCQkJCUNSRUdfUkVHX1NJWkUsICJCaWdNQUMgUUVDIENoYW5uZWwgUmVncyIpOworCWlmICghYnAtPmNyZWcpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCSUdNQUM6IENhbm5vdCBtYXAgUUVDIGNoYW5uZWwgcmVnaXN0ZXJzLlxuIik7CisJCWdvdG8gZmFpbF9hbmRfY2xlYW51cDsKKwl9CisKKwkvKiBNYXAgaW4gdGhlIEJpZ01BQyBjb250cm9sIHJlZ2lzdGVycy4gKi8KKwlicC0+YnJlZ3MgPSBzYnVzX2lvcmVtYXAoJmJwLT5iaWdtYWNfc2Rldi0+cmVzb3VyY2VbMV0sIDAsCisJCQkJIEJNQUNfUkVHX1NJWkUsICJCaWdNQUMgUHJpbWFyeSBSZWdzIik7CisJaWYgKCFicC0+YnJlZ3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJCSUdNQUM6IENhbm5vdCBtYXAgQmlnTUFDIHByaW1hcnkgcmVnaXN0ZXJzLlxuIik7CisJCWdvdG8gZmFpbF9hbmRfY2xlYW51cDsKKwl9CisKKwkvKiBNYXAgaW4gdGhlIEJpZ01BQyB0cmFuc2NlaXZlciByZWdpc3RlcnMsIHRoaXMgaXMgaG93IHlvdSBwb2tlIGF0CisJICogdGhlIEJpZ01BQydzIFBIWS4KKwkgKi8KKwlicC0+dHJlZ3MgPSBzYnVzX2lvcmVtYXAoJmJwLT5iaWdtYWNfc2Rldi0+cmVzb3VyY2VbMl0sIDAsCisJCQkJIFRDVlJfUkVHX1NJWkUsICJCaWdNQUMgVHJhbnNjZWl2ZXIgUmVncyIpOworCWlmICghYnAtPnRyZWdzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQklHTUFDOiBDYW5ub3QgbWFwIEJpZ01BQyB0cmFuc2NlaXZlciByZWdpc3RlcnMuXG4iKTsKKwkJZ290byBmYWlsX2FuZF9jbGVhbnVwOworCX0KKworCS8qIFN0b3AgdGhlIEJpZ01BQy4gKi8KKwliaWdtYWNfc3RvcChicCk7CisKKwkvKiBBbGxvY2F0ZSB0cmFuc21pdC9yZWNlaXZlIGRlc2NyaXB0b3IgRFZNQSBibG9jay4gKi8KKwlicC0+Ym1hY19ibG9jayA9IHNidXNfYWxsb2NfY29uc2lzdGVudChicC0+YmlnbWFjX3NkZXYsCisJCQkJCSAgICAgICBQQUdFX1NJWkUsCisJCQkJCSAgICAgICAmYnAtPmJibG9ja19kdm1hKTsKKwlpZiAoYnAtPmJtYWNfYmxvY2sgPT0gTlVMTCB8fCBicC0+YmJsb2NrX2R2bWEgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkJJR01BQzogQ2Fubm90IGFsbG9jYXRlIGNvbnNpc3RlbnQgRE1BLlxuIik7CisJCWdvdG8gZmFpbF9hbmRfY2xlYW51cDsKKwl9CisKKwkvKiBHZXQgdGhlIGJvYXJkIHJldmlzaW9uIG9mIHRoaXMgQmlnTUFDLiAqLworCWJwLT5ib2FyZF9yZXYgPSBwcm9tX2dldGludGRlZmF1bHQoYnAtPmJpZ21hY19zZGV2LT5wcm9tX25vZGUsCisJCQkJCSAgICJib2FyZC12ZXJzaW9uIiwgMSk7CisKKwkvKiBJbml0IGF1dG8tbmVnb3RpYXRpb24gdGltZXIgc3RhdGUuICovCisJaW5pdF90aW1lcigmYnAtPmJpZ21hY190aW1lcik7CisJYnAtPnRpbWVyX3N0YXRlID0gYXNsZWVwOworCWJwLT50aW1lcl90aWNrcyA9IDA7CisKKwkvKiBCYWNrbGluayB0byBnZW5lcmljIG5ldCBkZXZpY2Ugc3RydWN0LiAqLworCWJwLT5kZXYgPSBkZXY7CisKKwkvKiBTZXQgbGlua3MgdG8gb3VyIEJpZ01BQyBvcGVuIGFuZCBjbG9zZSByb3V0aW5lcy4gKi8KKwlkZXYtPm9wZW4gPSAmYmlnbWFjX29wZW47CisJZGV2LT5zdG9wID0gJmJpZ21hY19jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZiaWdtYWNfc3RhcnRfeG1pdDsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJmJpZ21hY19ldGh0b29sX29wczsKKworCS8qIFNldCBsaW5rcyB0byBCaWdNQUMgc3RhdGlzdGljIGFuZCBtdWx0aS1jYXN0IGxvYWRpbmcgY29kZS4gKi8KKwlkZXYtPmdldF9zdGF0cyA9ICZiaWdtYWNfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJmJpZ21hY19zZXRfbXVsdGljYXN0OworCisJZGV2LT50eF90aW1lb3V0ID0gJmJpZ21hY190eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSA1KkhaOworCisJLyogRmluaXNoIG5ldCBkZXZpY2UgcmVnaXN0cmF0aW9uLiAqLworCWRldi0+aXJxID0gYnAtPmJpZ21hY19zZGV2LT5pcnFzWzBdOworCWRldi0+ZG1hID0gMDsKKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIkJJR01BQzogQ2Fubm90IHJlZ2lzdGVyIGRldmljZS5cbiIpOworCQlnb3RvIGZhaWxfYW5kX2NsZWFudXA7CisJfQorCisJLyogUHV0IHVzIGludG8gdGhlIGxpc3Qgb2YgaW5zdGFuY2VzIGF0dGFjaGVkIGZvciBsYXRlciBkcml2ZXIKKwkgKiBleGl0LgorCSAqLworCWJwLT5uZXh0X21vZHVsZSA9IHJvb3RfYmlnbWFjX2RldjsKKwlyb290X2JpZ21hY19kZXYgPSBicDsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBCaWdNQUMgMTAwYmFzZVQgRXRoZXJuZXQgIiwgZGV2LT5uYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiUyLjJ4JWMiLCBkZXYtPmRldl9hZGRyW2ldLAorCQkgICAgICAgaSA9PSA1ID8gJyAnIDogJzonKTsKKwlwcmludGsoIlxuIik7CisKKwlyZXR1cm4gMDsKKworZmFpbF9hbmRfY2xlYW51cDoKKwkvKiBTb21ldGhpbmcgd2VudCB3cm9uZywgdW5kbyB3aGF0ZXZlciB3ZSBkaWQgc28gZmFyLiAqLworCS8qIEZyZWUgcmVnaXN0ZXIgbWFwcGluZ3MgaWYgYW55LiAqLworCWlmIChicC0+Z3JlZ3MpCisJCXNidXNfaW91bm1hcChicC0+Z3JlZ3MsIEdMT0JfUkVHX1NJWkUpOworCWlmIChicC0+Y3JlZykKKwkJc2J1c19pb3VubWFwKGJwLT5jcmVnLCBDUkVHX1JFR19TSVpFKTsKKwlpZiAoYnAtPmJyZWdzKQorCQlzYnVzX2lvdW5tYXAoYnAtPmJyZWdzLCBCTUFDX1JFR19TSVpFKTsKKwlpZiAoYnAtPnRyZWdzKQorCQlzYnVzX2lvdW5tYXAoYnAtPnRyZWdzLCBUQ1ZSX1JFR19TSVpFKTsKKworCWlmIChicC0+Ym1hY19ibG9jaykKKwkJc2J1c19mcmVlX2NvbnNpc3RlbnQoYnAtPmJpZ21hY19zZGV2LAorCQkJCSAgICAgUEFHRV9TSVpFLAorCQkJCSAgICAgYnAtPmJtYWNfYmxvY2ssCisJCQkJICAgICBicC0+YmJsb2NrX2R2bWEpOworCisJLyogVGhpcyBhbHNvIGZyZWVzIHRoZSBjby1sb2NhdGVkICdkZXYtPnByaXYnICovCisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyogUUVDIGNhbiBiZSB0aGUgcGFyZW50IG9mIGVpdGhlciBRdWFkRXRoZXJuZXQgb3IKKyAqIGEgQmlnTUFDLiAgV2Ugd2FudCB0aGUgbGF0dGVyLgorICovCitzdGF0aWMgaW50IF9faW5pdCBiaWdtYWNfbWF0Y2goc3RydWN0IHNidXNfZGV2ICpzZGV2KQoreworCXN0cnVjdCBzYnVzX2RldiAqY2hpbGQgPSBzZGV2LT5jaGlsZDsKKworCWlmIChzdHJjbXAoc2Rldi0+cHJvbV9uYW1lLCAicWVjIikgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY2hpbGQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc3RyY21wKGNoaWxkLT5wcm9tX25hbWUsICJiZSIpICE9IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGJpZ21hY19wcm9iZSh2b2lkKQoreworCXN0cnVjdCBzYnVzX2J1cyAqc2J1czsKKwlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBOVUxMOworCXN0YXRpYyBpbnQgY2FsbGVkOworCWludCBjYXJkcyA9IDAsIHY7CisKKwlyb290X2JpZ21hY19kZXYgPSBOVUxMOworCisJaWYgKGNhbGxlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJY2FsbGVkKys7CisKKwlmb3JfZWFjaF9zYnVzKHNidXMpIHsKKwkJZm9yX2VhY2hfc2J1c2RldihzZGV2LCBzYnVzKSB7CisJCQlpZiAoYmlnbWFjX21hdGNoKHNkZXYpKSB7CisJCQkJY2FyZHMrKzsKKwkJCQlpZiAoKHYgPSBiaWdtYWNfZXRoZXJfaW5pdChzZGV2KSkpCisJCQkJCXJldHVybiB2OworCQkJfQorCQl9CisJfQorCWlmICghY2FyZHMpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYmlnbWFjX2NsZWFudXAodm9pZCkKK3sKKwl3aGlsZSAocm9vdF9iaWdtYWNfZGV2KSB7CisJCXN0cnVjdCBiaWdtYWMgKmJwID0gcm9vdF9iaWdtYWNfZGV2OworCQlzdHJ1Y3QgYmlnbWFjICpicF9ueHQgPSByb290X2JpZ21hY19kZXYtPm5leHRfbW9kdWxlOworCisJCXNidXNfaW91bm1hcChicC0+Z3JlZ3MsIEdMT0JfUkVHX1NJWkUpOworCQlzYnVzX2lvdW5tYXAoYnAtPmNyZWcsIENSRUdfUkVHX1NJWkUpOworCQlzYnVzX2lvdW5tYXAoYnAtPmJyZWdzLCBCTUFDX1JFR19TSVpFKTsKKwkJc2J1c19pb3VubWFwKGJwLT50cmVncywgVENWUl9SRUdfU0laRSk7CisJCXNidXNfZnJlZV9jb25zaXN0ZW50KGJwLT5iaWdtYWNfc2RldiwKKwkJCQkgICAgIFBBR0VfU0laRSwKKwkJCQkgICAgIGJwLT5ibWFjX2Jsb2NrLAorCQkJCSAgICAgYnAtPmJibG9ja19kdm1hKTsKKworCQl1bnJlZ2lzdGVyX25ldGRldihicC0+ZGV2KTsKKwkJZnJlZV9uZXRkZXYoYnAtPmRldik7CisJCXJvb3RfYmlnbWFjX2RldiA9IGJwX254dDsKKwl9Cit9CisKK21vZHVsZV9pbml0KGJpZ21hY19wcm9iZSk7Cittb2R1bGVfZXhpdChiaWdtYWNfY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5ibWFjLmggYi9kcml2ZXJzL25ldC9zdW5ibWFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY3NDAwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3N1bmJtYWMuaApAQCAtMCwwICsxLDM1NiBAQAorLyogJElkOiBzdW5ibWFjLmgsdiAxLjcgMjAwMC8wNy8xMSAyMjozNToyMiBkYXZlbSBFeHAgJAorICogc3VuYm1hYy5oOiBEZWZpbmVzIGZvciB0aGUgU3VuICJCaWcgTUFDIiAxMDBiYXNlVCBldGhlcm5ldCBjYXJkcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQorICovCisKKyNpZm5kZWYgX1NVTkJNQUNfSAorI2RlZmluZSBfU1VOQk1BQ19ICisKKy8qIFFFQyBnbG9iYWwgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBHTE9CX0NUUkwJMHgwMFVMCS8qIENvbnRyb2wgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHTE9CX1NUQVQJMHgwNFVMCS8qIFN0YXR1cyAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHTE9CX1BTSVpFCTB4MDhVTAkvKiBQYWNrZXQgU2l6ZSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR0xPQl9NU0laRQkweDBjVUwJLyogTG9jYWwtbWVtIHNpemUgKDY0SykgICAgICovCisjZGVmaW5lIEdMT0JfUlNJWkUJMHgxMFVMCS8qIFJlY2VpdmUgcGFydGl0aW9uIHNpemUgICAqLworI2RlZmluZSBHTE9CX1RTSVpFCTB4MTRVTAkvKiBUcmFuc21pdCBwYXJ0aXRpb24gc2l6ZSAgKi8KKyNkZWZpbmUgR0xPQl9SRUdfU0laRQkweDE4VUwKKworI2RlZmluZSBHTE9CX0NUUkxfTU1PREUgICAgICAgMHg0MDAwMDAwMCAvKiBNQUNFIHFlYyBtb2RlICAgICAgICAgICAgKi8KKyNkZWZpbmUgR0xPQl9DVFJMX0JNT0RFICAgICAgIDB4MTAwMDAwMDAgLyogQmlnTUFDIHFlYyBtb2RlICAgICAgICAgICovCisjZGVmaW5lIEdMT0JfQ1RSTF9FUEFSICAgICAgICAweDAwMDAwMDIwIC8qIEVuYWJsZSBwYXJpdHkgICAgICAgICAgICAqLworI2RlZmluZSBHTE9CX0NUUkxfQUNOVFJMICAgICAgMHgwMDAwMDAxOCAvKiBTQlVTIGFyYml0cmF0aW9uIGNvbnRyb2wgKi8KKyNkZWZpbmUgR0xPQl9DVFJMX0I2NCAgICAgICAgIDB4MDAwMDAwMDQgLyogNjQgYnl0ZSBkdm1hIGJ1cnN0cyAgICAgICovCisjZGVmaW5lIEdMT0JfQ1RSTF9CMzIgICAgICAgICAweDAwMDAwMDAyIC8qIDMyIGJ5dGUgZHZtYSBidXJzdHMgICAgICAqLworI2RlZmluZSBHTE9CX0NUUkxfQjE2ICAgICAgICAgMHgwMDAwMDAwMCAvKiAxNiBieXRlIGR2bWEgYnVyc3RzICAgICAgKi8KKyNkZWZpbmUgR0xPQl9DVFJMX1JFU0VUICAgICAgIDB4MDAwMDAwMDEgLyogUmVzZXQgdGhlIFFFQyAgICAgICAgICAgICovCisKKyNkZWZpbmUgR0xPQl9TVEFUX1RYICAgICAgICAgIDB4MDAwMDAwMDggLyogQmlnTUFDIFRyYW5zbWl0IElSUSAgICAgICovCisjZGVmaW5lIEdMT0JfU1RBVF9SWCAgICAgICAgICAweDAwMDAwMDA0IC8qIEJpZ01BQyBSZWNlaXZlIElSUSAgICAgICAqLworI2RlZmluZSBHTE9CX1NUQVRfQk0gICAgICAgICAgMHgwMDAwMDAwMiAvKiBCaWdNQUMgR2xvYmFsIElSUSAgICAgICAgKi8KKyNkZWZpbmUgR0xPQl9TVEFUX0VSICAgICAgICAgIDB4MDAwMDAwMDEgLyogQmlnTUFDIEVycm9yIElSUSAgICAgICAgICovCisKKyNkZWZpbmUgR0xPQl9QU0laRV8yMDQ4ICAgICAgIDB4MDAgICAgICAgLyogMmsgcGFja2V0IHNpemUgICAgICAgICAgICovCisjZGVmaW5lIEdMT0JfUFNJWkVfNDA5NiAgICAgICAweDAxICAgICAgIC8qIDRrIHBhY2tldCBzaXplICAgICAgICAgICAqLworI2RlZmluZSBHTE9CX1BTSVpFXzYxNDQgICAgICAgMHgxMCAgICAgICAvKiA2ayBwYWNrZXQgc2l6ZSAgICAgICAgICAgKi8KKyNkZWZpbmUgR0xPQl9QU0laRV84MTkyICAgICAgIDB4MTEgICAgICAgLyogOGsgcGFja2V0IHNpemUgICAgICAgICAgICovCisKKy8qIFFFQyBCaWdNQUMgY2hhbm5lbCByZWdpc3RlcnMuICovCisjZGVmaW5lIENSRUdfQ1RSTAkweDAwVUwJLyogQ29udHJvbCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVQJMHgwNFVMCS8qIFN0YXR1cyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19SWERTCTB4MDhVTAkvKiBSWCBkZXNjcmlwdG9yIHJpbmcgcHRyICAgICovCisjZGVmaW5lIENSRUdfVFhEUwkweDBjVUwJLyogVFggZGVzY3JpcHRvciByaW5nIHB0ciAgICAqLworI2RlZmluZSBDUkVHX1JJTUFTSwkweDEwVUwJLyogUlggSW50ZXJydXB0IE1hc2sgICAgICAgICAqLworI2RlZmluZSBDUkVHX1RJTUFTSwkweDE0VUwJLyogVFggSW50ZXJydXB0IE1hc2sgICAgICAgICAqLworI2RlZmluZSBDUkVHX1FNQVNLCTB4MThVTAkvKiBRRUMgRXJyb3IgSW50ZXJydXB0IE1hc2sgICovCisjZGVmaW5lIENSRUdfQk1BU0sJMHgxY1VMCS8qIEJpZ01BQyBFcnJvciBJbnRlcnJ1cHQgTWFzayovCisjZGVmaW5lIENSRUdfUlhXQlVGUFRSCTB4MjBVTAkvKiBMb2NhbCBtZW1vcnkgcnggd3JpdGUgcHRyICovCisjZGVmaW5lIENSRUdfUlhSQlVGUFRSCTB4MjRVTAkvKiBMb2NhbCBtZW1vcnkgcnggcmVhZCBwdHIgICovCisjZGVmaW5lIENSRUdfVFhXQlVGUFRSCTB4MjhVTAkvKiBMb2NhbCBtZW1vcnkgdHggd3JpdGUgcHRyICovCisjZGVmaW5lIENSRUdfVFhSQlVGUFRSCTB4MmNVTAkvKiBMb2NhbCBtZW1vcnkgdHggcmVhZCBwdHIgICovCisjZGVmaW5lIENSRUdfQ0NOVAkweDMwVUwJLyogQ29sbGlzaW9uIENvdW50ZXIgICAgICAgICAqLworI2RlZmluZSBDUkVHX1JFR19TSVpFCTB4MzRVTAorCisjZGVmaW5lIENSRUdfQ1RSTF9UV0FLRVVQICAgICAweDAwMDAwMDAxICAvKiBUcmFuc21pdHRlciBXYWtldXAsICdnbycuICovCisKKyNkZWZpbmUgQ1JFR19TVEFUX0JFUlJPUiAgICAgIDB4ODAwMDAwMDAgIC8qIEJpZ01BQyBlcnJvciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19TVEFUX1RYSVJRICAgICAgIDB4MDAyMDAwMDAgIC8qIFRyYW5zbWl0IEludGVycnVwdCAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19TVEFUX1RYREVSUk9SICAgIDB4MDAwODAwMDAgIC8qIFRYIERlc2NyaXB0b3IgaXMgYm9ndXMgICAgKi8KKyNkZWZpbmUgQ1JFR19TVEFUX1RYTEVSUiAgICAgIDB4MDAwNDAwMDAgIC8qIExhdGUgVHJhbnNtaXQgRXJyb3IgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19TVEFUX1RYUEVSUiAgICAgIDB4MDAwMjAwMDAgIC8qIFRyYW5zbWl0IFBhcml0eSBFcnJvciAgICAgKi8KKyNkZWZpbmUgQ1JFR19TVEFUX1RYU0VSUiAgICAgIDB4MDAwMTAwMDAgIC8qIFRyYW5zbWl0IFNCVVMgZXJyb3IgYWNrICAgKi8KKyNkZWZpbmUgQ1JFR19TVEFUX1JYSVJRICAgICAgIDB4MDAwMDAwMjAgIC8qIFJlY2VpdmUgSW50ZXJydXB0ICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19TVEFUX1JYRFJPUCAgICAgIDB4MDAwMDAwMTAgIC8qIERyb3BwZWQgYSBSWCdkIHBhY2tldCAgICAgKi8KKyNkZWZpbmUgQ1JFR19TVEFUX1JYU01BTEwgICAgIDB4MDAwMDAwMDggIC8qIFJlY2VpdmUgYnVmZmVyIHRvbyBzbWFsbCAgKi8KKyNkZWZpbmUgQ1JFR19TVEFUX1JYTEVSUiAgICAgIDB4MDAwMDAwMDQgIC8qIFJlY2VpdmUgTGF0ZSBFcnJvciAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19TVEFUX1JYUEVSUiAgICAgIDB4MDAwMDAwMDIgIC8qIFJlY2VpdmUgUGFyaXR5IEVycm9yICAgICAgKi8KKyNkZWZpbmUgQ1JFR19TVEFUX1JYU0VSUiAgICAgIDB4MDAwMDAwMDEgIC8qIFJlY2VpdmUgU0JVUyBFcnJvciBBQ0sgICAgKi8KKworI2RlZmluZSBDUkVHX1NUQVRfRVJST1JTICAgICAgKENSRUdfU1RBVF9CRVJST1J8Q1JFR19TVEFUX1RYREVSUk9SfENSRUdfU1RBVF9UWExFUlJ8ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUdfU1RBVF9UWFBFUlJ8Q1JFR19TVEFUX1RYU0VSUnxDUkVHX1NUQVRfUlhEUk9QfCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUdfU1RBVF9SWFNNQUxMfENSRUdfU1RBVF9SWExFUlJ8Q1JFR19TVEFUX1JYUEVSUnwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUdfU1RBVF9SWFNFUlIpCisKKyNkZWZpbmUgQ1JFR19RTUFTS19UWERFUlJPUiAgIDB4MDAwODAwMDAgIC8qIFRYRCBlcnJvciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19UWExFUlIgICAgIDB4MDAwNDAwMDAgIC8qIFRYIGxhdGUgZXJyb3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19UWFBFUlIgICAgIDB4MDAwMjAwMDAgIC8qIFRYIHBhcml0eSBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19UWFNFUlIgICAgIDB4MDAwMTAwMDAgIC8qIFRYIHNidXMgZXJyb3IgYWNrICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19SWERST1AgICAgIDB4MDAwMDAwMTAgIC8qIFJYIGRyb3AgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19SWEJFUlJPUiAgIDB4MDAwMDAwMDggIC8qIFJYIGJ1ZmZlciBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19SWExFRVJSICAgIDB4MDAwMDAwMDQgIC8qIFJYIGxhdGUgZXJyb3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19SWFBFUlIgICAgIDB4MDAwMDAwMDIgIC8qIFJYIHBhcml0eSBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19SWFNFUlIgICAgIDB4MDAwMDAwMDEgIC8qIFJYIHNidXMgZXJyb3IgYWNrICAgICAgICAgKi8KKworLyogQklHTUFDIGNvcmUgcmVnaXN0ZXJzICovCisjZGVmaW5lIEJNQUNfWElGQ0ZHCTB4MDAwVUwJLyogWElGIGNvbmZpZyByZWdpc3RlciAgICAgICAgICAgICAgICAqLworCS8qIDB4MDA0LS0+MHgwZmMsIHJlc2VydmVkICovCisjZGVmaW5lIEJNQUNfU1RBVFVTCTB4MTAwVUwJLyogU3RhdHVzIHJlZ2lzdGVyLCBjbGVhciBvbiByZWFkICAgICAqLworI2RlZmluZSBCTUFDX0lNQVNLCTB4MTA0VUwJLyogSW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgICAgICAgICAgICAqLworCS8qIDB4MTA4LS0+MHgyMDQsIHJlc2VydmVkICovCisjZGVmaW5lIEJNQUNfVFhTV1JFU0VUCTB4MjA4VUwJLyogVHJhbnNtaXR0ZXIgc29mdHdhcmUgcmVzZXQgICAgICAgICAqLworI2RlZmluZSBCTUFDX1RYQ0ZHCTB4MjBjVUwJLyogVHJhbnNtaXR0ZXIgY29uZmlnIHJlZ2lzdGVyICAgICAgICAqLworI2RlZmluZSBCTUFDX0lHQVAxCTB4MjEwVUwJLyogSW50ZXItcGFja2V0IGdhcCAxICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0lHQVAyCTB4MjE0VUwJLyogSW50ZXItcGFja2V0IGdhcCAyICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0FMSU1JVAkweDIxOFVMCS8qIFRyYW5zbWl0IGF0dGVtcHQgbGltaXQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19TVElNRQkweDIxY1VMCS8qIFRyYW5zbWl0IHNsb3QgdGltZSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19QTEVOCTB4MjIwVUwJLyogU2l6ZSBvZiB0cmFuc21pdCBwcmVhbWJsZSAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1BQQVQJMHgyMjRVTAkvKiBQYXR0ZXJuIGZvciB0cmFuc21pdCBwcmVhbWJsZSAgICAgICovCisjZGVmaW5lIEJNQUNfVFhERUxJTQkweDIyOFVMCS8qIFRyYW5zbWl0IGRlbGltaXRlciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19KU0laRQkweDIyY1VMCS8qIFRvZSBqYW0uLi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19UWFBNQVgJMHgyMzBVTAkvKiBUcmFuc21pdCBtYXggcGt0IHNpemUgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfVFhQTUlOCTB4MjM0VUwJLyogVHJhbnNtaXQgbWluIHBrdCBzaXplICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1BBVFRFTVBUCTB4MjM4VUwJLyogQ291bnQgb2YgdHJhbnNtaXQgcGVhayBhdHRlbXB0cyAgICAqLworI2RlZmluZSBCTUFDX0RUQ1RSCTB4MjNjVUwJLyogVHJhbnNtaXQgZGVmZXIgdGltZXIgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX05DQ1RSCTB4MjQwVUwJLyogVHJhbnNtaXQgbm9ybWFsLWNvbGxpc2lvbiBjb3VudGVyICAqLworI2RlZmluZSBCTUFDX0ZDQ1RSCTB4MjQ0VUwJLyogVHJhbnNtaXQgZmlyc3QtY29sbGlzaW9uIGNvdW50ZXIgICAqLworI2RlZmluZSBCTUFDX0VYQ1RSCTB4MjQ4VUwJLyogVHJhbnNtaXQgZXhjZXNzLWNvbGxpc2lvbiBjb3VudGVyICAqLworI2RlZmluZSBCTUFDX0xUQ1RSCTB4MjRjVUwJLyogVHJhbnNtaXQgbGF0ZS1jb2xsaXNpb24gY291bnRlciAgICAqLworI2RlZmluZSBCTUFDX1JTRUVECTB4MjUwVUwJLyogVHJhbnNtaXQgcmFuZG9tIG51bWJlciBzZWVkICAgICAgICAqLworI2RlZmluZSBCTUFDX1RYU01BQ0hJTkUJMHgyNTRVTCAvKiBUcmFuc21pdCBzdGF0ZSBtYWNoaW5lICAgICAgICAgICAgICovCisJLyogMHgyNTgtLT4weDMwNCwgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQk1BQ19SWFNXUkVTRVQJMHgzMDhVTAkvKiBSZWNlaXZlciBzb2Z0d2FyZSByZXNldCAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfUlhDRkcJMHgzMGNVTAkvKiBSZWNlaXZlciBjb25maWcgcmVnaXN0ZXIgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfUlhQTUFYCTB4MzEwVUwJLyogUmVjZWl2ZSBtYXggcGt0IHNpemUgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1JYUE1JTgkweDMxNFVMCS8qIFJlY2VpdmUgbWluIHBrdCBzaXplICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19NQUNBRERSMgkweDMxOFVMCS8qIEV0aGVyIGFkZHJlc3MgcmVnaXN0ZXIgMiAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19NQUNBRERSMQkweDMxY1VMCS8qIEV0aGVyIGFkZHJlc3MgcmVnaXN0ZXIgMSAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19NQUNBRERSMAkweDMyMFVMCS8qIEV0aGVyIGFkZHJlc3MgcmVnaXN0ZXIgMCAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19GUkNUUgkweDMyNFVMCS8qIFJlY2VpdmUgZnJhbWUgcmVjZWl2ZSBjb3VudGVyICAgICAgKi8KKyNkZWZpbmUgQk1BQ19HTEVDVFIJMHgzMjhVTAkvKiBSZWNlaXZlIGdpYW50LWxlbmd0aCBlcnJvciBjb3VudGVyICovCisjZGVmaW5lIEJNQUNfVU5BTEVDVFIJMHgzMmNVTAkvKiBSZWNlaXZlIHVuYWxpZ25lZCBlcnJvciBjb3VudGVyICAgICovCisjZGVmaW5lIEJNQUNfUkNSQ0VDVFIJMHgzMzBVTAkvKiBSZWNlaXZlIENSQyBlcnJvciBjb3VudGVyICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfUlhTTUFDSElORQkweDMzNFVMCS8qIFJlY2VpdmVyIHN0YXRlIG1hY2hpbmUgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19SWENWQUxJRAkweDMzOFVMCS8qIFJlY2VpdmVyIGNvZGUgdmlvbGF0aW9uICAgICAgICAgICAgKi8KKwkvKiAweDMzYywgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQk1BQ19IVEFCTEUzCTB4MzQwVUwJLyogSGFzaCB0YWJsZSAzICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0hUQUJMRTIJMHgzNDRVTAkvKiBIYXNoIHRhYmxlIDIgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfSFRBQkxFMQkweDM0OFVMCS8qIEhhc2ggdGFibGUgMSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19IVEFCTEUwCTB4MzRjVUwJLyogSGFzaCB0YWJsZSAwICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0FGSUxURVIyCTB4MzUwVUwJLyogQWRkcmVzcyBmaWx0ZXIgMiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0FGSUxURVIxCTB4MzU0VUwJLyogQWRkcmVzcyBmaWx0ZXIgMSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0FGSUxURVIwCTB4MzU4VUwJLyogQWRkcmVzcyBmaWx0ZXIgMCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0FGTUFTSwkweDM1Y1VMCS8qIEFkZHJlc3MgZmlsdGVyIG1hc2sgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19SRUdfU0laRQkweDM2MFVMCisKKy8qIEJpZ01hYyBYSUYgY29uZmlnIHJlZ2lzdGVyLiAqLworI2RlZmluZSBCSUdNQUNfWENGR19PREVOQUJMRSAgIDB4MDAwMDAwMDEgLyogT3V0cHV0IGRyaXZlciBlbmFibGUgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfWENGR19SRVNWICAgICAgIDB4MDAwMDAwMDIgLyogUmVzZXJ2ZWQsIHdyaXRlIGFsd2F5cyBhcyAxICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfWENGR19NTEJBQ0sgICAgIDB4MDAwMDAwMDQgLyogTG9vcGJhY2stbW9kZSBNSUkgZW5hYmxlICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfWENGR19TTU9ERSAgICAgIDB4MDAwMDAwMDggLyogRW5hYmxlIHNlcmlhbCBtb2RlICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBCaWdNQUMgc3RhdHVzIHJlZ2lzdGVyLiAqLworI2RlZmluZSBCSUdNQUNfU1RBVF9HT1RGUkFNRSAgIDB4MDAwMDAwMDEgLyogUmVjZWl2ZWQgYSBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfU1RBVF9SQ05URVhQICAgIDB4MDAwMDAwMDIgLyogUmVjZWl2ZSBmcmFtZSBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfU1RBVF9BQ05URVhQICAgIDB4MDAwMDAwMDQgLyogQWxpZ24tZXJyb3IgY291bnRlciBleHBpcmVkICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfU1RBVF9DQ05URVhQICAgIDB4MDAwMDAwMDggLyogQ1JDLWVycm9yIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfU1RBVF9MQ05URVhQICAgIDB4MDAwMDAwMTAgLyogTGVuZ3RoLWVycm9yIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfU1RBVF9SRklGT1ZGICAgIDB4MDAwMDAwMjAgLyogUmVjZWl2ZSBGSUZPIG92ZXJmbG93ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfU1RBVF9DVkNOVEVYUCAgIDB4MDAwMDAwNDAgLyogQ29kZS12aW9sYXRpb24gY291bnRlciBleHBpcmVkICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfU1RBVF9TRU5URlJBTUUgIDB4MDAwMDAxMDAgLyogVHJhbnNtaXR0ZWQgYSBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfU1RBVF9URklGT19VTkQgIDB4MDAwMDAyMDAgLyogVHJhbnNtaXQgRklGTyB1bmRlcnJ1biAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfU1RBVF9NQVhQS1RFUlIgIDB4MDAwMDA0MDAgLyogTWF4LXBhY2tldCBzaXplIGVycm9yICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfU1RBVF9OQ05URVhQICAgIDB4MDAwMDA4MDAgLyogTm9ybWFsLWNvbGxpc2lvbiBjb3VudGVyIGV4cGlyZWQgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfU1RBVF9FQ05URVhQICAgIDB4MDAwMDEwMDAgLyogRXhjZXNzLWNvbGxpc2lvbiBjb3VudGVyIGV4cGlyZWQgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfU1RBVF9MQ0NOVEVYUCAgIDB4MDAwMDIwMDAgLyogTGF0ZS1jb2xsaXNpb24gY291bnRlciBleHBpcmVkICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfU1RBVF9GQ05URVhQICAgIDB4MDAwMDQwMDAgLyogRmlyc3QtY29sbGlzaW9uIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfU1RBVF9EVElNRVhQICAgIDB4MDAwMDgwMDAgLyogRGVmZXItdGltZXIgZXhwaXJlZCAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBCaWdNQUMgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIuICovCisjZGVmaW5lIEJJR01BQ19JTUFTS19HT1RGUkFNRSAgMHgwMDAwMDAwMSAvKiBSZWNlaXZlZCBhIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19JTUFTS19SQ05URVhQICAgMHgwMDAwMDAwMiAvKiBSZWNlaXZlIGZyYW1lIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19JTUFTS19BQ05URVhQICAgMHgwMDAwMDAwNCAvKiBBbGlnbi1lcnJvciBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19JTUFTS19DQ05URVhQICAgMHgwMDAwMDAwOCAvKiBDUkMtZXJyb3IgY291bnRlciBleHBpcmVkICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19JTUFTS19MQ05URVhQICAgMHgwMDAwMDAxMCAvKiBMZW5ndGgtZXJyb3IgY291bnRlciBleHBpcmVkICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19JTUFTS19SRklGT1ZGICAgMHgwMDAwMDAyMCAvKiBSZWNlaXZlIEZJRk8gb3ZlcmZsb3cgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19JTUFTS19DVkNOVEVYUCAgMHgwMDAwMDA0MCAvKiBDb2RlLXZpb2xhdGlvbiBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19JTUFTS19TRU5URlJBTUUgMHgwMDAwMDEwMCAvKiBUcmFuc21pdHRlZCBhIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19JTUFTS19URklGT19VTkQgMHgwMDAwMDIwMCAvKiBUcmFuc21pdCBGSUZPIHVuZGVycnVuICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19JTUFTS19NQVhQS1RFUlIgMHgwMDAwMDQwMCAvKiBNYXgtcGFja2V0IHNpemUgZXJyb3IgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19JTUFTS19OQ05URVhQICAgMHgwMDAwMDgwMCAvKiBOb3JtYWwtY29sbGlzaW9uIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19JTUFTS19FQ05URVhQICAgMHgwMDAwMTAwMCAvKiBFeGNlc3MtY29sbGlzaW9uIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19JTUFTS19MQ0NOVEVYUCAgMHgwMDAwMjAwMCAvKiBMYXRlLWNvbGxpc2lvbiBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19JTUFTS19GQ05URVhQICAgMHgwMDAwNDAwMCAvKiBGaXJzdC1jb2xsaXNpb24gY291bnRlciBleHBpcmVkICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19JTUFTS19EVElNRVhQICAgMHgwMDAwODAwMCAvKiBEZWZlci10aW1lciBleHBpcmVkICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEJpZ01hYyB0cmFuc21pdCBjb25maWcgcmVnaXN0ZXIuICovCisjZGVmaW5lIEJJR01BQ19UWENGR19FTkFCTEUgICAgMHgwMDAwMDAwMSAvKiBFbmFibGUgdGhlIHRyYW5zbWl0dGVyICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19UWENGR19GSUZPICAgICAgMHgwMDAwMDAxMCAvKiBEZWZhdWx0IHR4IGZ0aHJlc2guLi4gICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19UWENGR19TTU9ERSAgICAgMHgwMDAwMDAyMCAvKiBFbmFibGUgc2xvdyB0cmFuc21pdCBtb2RlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19UWENGR19DSUdOICAgICAgMHgwMDAwMDA0MCAvKiBJZ25vcmUgdHJhbnNtaXQgY29sbGlzaW9ucyAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19UWENGR19GQ1NPRkYgICAgMHgwMDAwMDA4MCAvKiBEbyBub3QgZW1pdCBGQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19UWENGR19EQkFDS09GRiAgMHgwMDAwMDEwMCAvKiBEaXNhYmxlIGJhY2tvZmYgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19UWENGR19GVUxMRFBMWCAgMHgwMDAwMDIwMCAvKiBFbmFibGUgZnVsbC1kdXBsZXggICAgICAgICAgICAgICAgICAgICAgICovCisKKy8qIEJpZ01hYyByZWNlaXZlIGNvbmZpZyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQklHTUFDX1JYQ0ZHX0VOQUJMRSAgICAweDAwMDAwMDAxIC8qIEVuYWJsZSB0aGUgcmVjZWl2ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1JYQ0ZHX0ZJRk8gICAgICAweDAwMDAwMDBlIC8qIERlZmF1bHQgcnggZnRocmVzaC4uLiAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1JYQ0ZHX1BTVFJJUCAgICAweDAwMDAwMDIwIC8qIFBhZCBieXRlIHN0cmlwIGVuYWJsZSAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1JYQ0ZHX1BNSVNDICAgICAweDAwMDAwMDQwIC8qIEVuYWJsZSBwcm9taXNjb3VzIG1vZGUgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1JYQ0ZHX0RFUlIgICAgICAweDAwMDAwMDgwIC8qIERpc2FibGUgZXJyb3IgY2hlY2tpbmcgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1JYQ0ZHX0RDUkNTICAgICAweDAwMDAwMTAwIC8qIERpc2FibGUgQ1JDIHN0cmlwcGluZyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1JYQ0ZHX01FICAgICAgICAweDAwMDAwMjAwIC8qIFJlY2VpdmUgcGFja2V0cyBhZGRyZXNzZWQgdG8gbWUgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1JYQ0ZHX1BHUlAgICAgICAweDAwMDAwNDAwIC8qIEVuYWJsZSBwcm9taXNjIGdyb3VwIG1vZGUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1JYQ0ZHX0hFTkFCTEUgICAweDAwMDAwODAwIC8qIEVuYWJsZSB0aGUgaGFzaCBmaWx0ZXIgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1JYQ0ZHX0FFTkFCTEUgICAweDAwMDAxMDAwIC8qIEVuYWJsZSB0aGUgYWRkcmVzcyBmaWx0ZXIgICAgICAgICAgICAgICAgKi8KKworLyogVGhlIEJpZ01BQyBQSFkgdHJhbnNjZWl2ZXIuICBOb3QgbmVhcmx5IGFzIHNvcGhpc3RpY2F0ZWQgYXMgdGhlIGhhcHB5IG1lYWwKKyAqIG9uZS4gIEJ1dCBpdCBkb2VzIGhhdmUgdGhlICJiaXQgYmFuZ2VyIiwgb2ggYmFieS4KKyAqLworI2RlZmluZSBUQ1ZSX1RQQUwJMHgwMFVMCisjZGVmaW5lIFRDVlJfTVBBTAkweDA0VUwKKyNkZWZpbmUgVENWUl9SRUdfU0laRQkweDA4VUwKKworLyogRnJhbWUgY29tbWFuZHMuICovCisjZGVmaW5lIEZSQU1FX1dSSVRFICAgICAgICAgICAweDUwMDIwMDAwCisjZGVmaW5lIEZSQU1FX1JFQUQgICAgICAgICAgICAweDYwMDIwMDAwCisKKy8qIFRyYW5jZWl2ZXIgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBUQ1ZSX1BBTF9TRVJJQUwgICAgICAgMHgwMDAwMDAwMSAvKiBFbmFibGUgc2VyaWFsIG1vZGUgICAgICAgICAgICAgICovCisjZGVmaW5lIFRDVlJfUEFMX0VYVExCQUNLICAgICAweDAwMDAwMDAyIC8qIEVuYWJsZSBleHRlcm5hbCBsb29wYmFjayAgICAgICAgKi8KKyNkZWZpbmUgVENWUl9QQUxfTVNFTlNFICAgICAgIDB4MDAwMDAwMDQgLyogTWVkaWEgc2Vuc2UgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUQ1ZSX1BBTF9MVEVOQUJMRSAgICAgMHgwMDAwMDAwOCAvKiBMaW5rIHRlc3QgZW5hYmxlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRDVlJfUEFMX0xUU1RBVFVTICAgICAweDAwMDAwMDEwIC8qIExpbmsgdGVzdCBzdGF0dXMgIChQMSBvbmx5KSAgICAgKi8KKworLyogTWFuYWdlbWVudCBQQUwuICovCisjZGVmaW5lIE1HTVRfUEFMX0RDTE9DSyAgICAgICAweDAwMDAwMDAxIC8qIERhdGEgY2xvY2sgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUdNVF9QQUxfT0VOQUIgICAgICAgIDB4MDAwMDAwMDIgLyogT3V0cHV0IGVuYWJsZXIgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNR01UX1BBTF9NRElPICAgICAgICAgMHgwMDAwMDAwNCAvKiBNRElPIERhdGEvYXR0YWNoZWQgICAgICAgICAgICAgICovCisjZGVmaW5lIE1HTVRfUEFMX1RJTUVPICAgICAgICAweDAwMDAwMDA4IC8qIFRyYW5zbWl0IGVuYWJsZSB0aW1lb3V0IGVycm9yICAgKi8KKyNkZWZpbmUgTUdNVF9QQUxfRVhUX01ESU8gICAgIE1HTVRfUEFMX01ESU8KKyNkZWZpbmUgTUdNVF9QQUxfSU5UX01ESU8gICAgIE1HTVRfUEFMX1RJTUVPCisKKy8qIEhlcmUgYXJlIHNvbWUgUEhZIGFkZHJlc3Nlcy4gKi8KKyNkZWZpbmUgQklHTUFDX1BIWV9FWFRFUk5BTCAgIDAgLyogRXh0ZXJuYWwgdHJhbnNjZWl2ZXIgKi8KKyNkZWZpbmUgQklHTUFDX1BIWV9JTlRFUk5BTCAgIDEgLyogSW50ZXJuYWwgdHJhbnNjZWl2ZXIgKi8KKworLyogUEhZIHJlZ2lzdGVycyAqLworI2RlZmluZSBCSUdNQUNfQk1DUiAgICAgICAgICAgMHgwMCAvKiBCYXNpYyBtb2RlIGNvbnRyb2wgcmVnaXN0ZXIJKi8KKyNkZWZpbmUgQklHTUFDX0JNU1IgICAgICAgICAgIDB4MDEgLyogQmFzaWMgbW9kZSBzdGF0dXMgcmVnaXN0ZXIJKi8KKworLyogQk1DUiBiaXRzICovCisjZGVmaW5lIEJNQ1JfSVNPTEFURSAgICAgICAgICAgIDB4MDQwMCAgLyogRGlzY29ubmVjdCBEUDgzODQwIGZyb20gTUlJICovCisjZGVmaW5lIEJNQ1JfUERPV04gICAgICAgICAgICAgIDB4MDgwMCAgLyogUG93ZXJkb3duIHRoZSBEUDgzODQwICAgICAgICovCisjZGVmaW5lIEJNQ1JfQU5FTkFCTEUgICAgICAgICAgIDB4MTAwMCAgLyogRW5hYmxlIGF1dG8gbmVnb3RpYXRpb24gICAgICovCisjZGVmaW5lIEJNQ1JfU1BFRUQxMDAgICAgICAgICAgIDB4MjAwMCAgLyogU2VsZWN0IDEwME1icHMgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQ1JfTE9PUEJBQ0sgICAgICAgICAgIDB4NDAwMCAgLyogVFhEIGxvb3BiYWNrIGJpdHMgICAgICAgICAgICovCisjZGVmaW5lIEJNQ1JfUkVTRVQgICAgICAgICAgICAgIDB4ODAwMCAgLyogUmVzZXQgdGhlIERQODM4NDAgICAgICAgICAgICovCisKKy8qIEJNU1IgYml0cyAqLworI2RlZmluZSBCTVNSX0VSQ0FQICAgICAgICAgICAgICAweDAwMDEgIC8qIEV4dC1yZWcgY2FwYWJpbGl0eSAgICAgICAgICAqLworI2RlZmluZSBCTVNSX0pDRCAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEphYmJlciBkZXRlY3RlZCAgICAgICAgICAgICAqLworI2RlZmluZSBCTVNSX0xTVEFUVVMgICAgICAgICAgICAweDAwMDQgIC8qIExpbmsgc3RhdHVzICAgICAgICAgICAgICAgICAqLworCisvKiBSaW5nIGRlc2NyaXB0b3JzIGFuZCBzdWNoLCBzYW1lIGFzIFF1YWQgRXRoZXJuZXQuICovCitzdHJ1Y3QgYmVfcnhkIHsKKwl1MzIgcnhfZmxhZ3M7CisJdTMyIHJ4X2FkZHI7Cit9OworCisjZGVmaW5lIFJYRF9PV04gICAgICAweDgwMDAwMDAwIC8qIE93bmVyc2hpcC4gICAgICAqLworI2RlZmluZSBSWERfVVBEQVRFICAgMHgxMDAwMDAwMCAvKiBCZWluZyBVcGRhdGVkPyAgKi8KKyNkZWZpbmUgUlhEX0xFTkdUSCAgIDB4MDAwMDA3ZmYgLyogUGFja2V0IExlbmd0aC4gICovCisKK3N0cnVjdCBiZV90eGQgeworCXUzMiB0eF9mbGFnczsKKwl1MzIgdHhfYWRkcjsKK307CisKKyNkZWZpbmUgVFhEX09XTiAgICAgIDB4ODAwMDAwMDAgLyogT3duZXJzaGlwLiAgICAgICovCisjZGVmaW5lIFRYRF9TT1AgICAgICAweDQwMDAwMDAwIC8qIFN0YXJ0IE9mIFBhY2tldCAqLworI2RlZmluZSBUWERfRU9QICAgICAgMHgyMDAwMDAwMCAvKiBFbmQgT2YgUGFja2V0ICAgKi8KKyNkZWZpbmUgVFhEX1VQREFURSAgIDB4MTAwMDAwMDAgLyogQmVpbmcgVXBkYXRlZD8gICovCisjZGVmaW5lIFRYRF9MRU5HVEggICAweDAwMDAwN2ZmIC8qIFBhY2tldCBMZW5ndGguICAqLworCisjZGVmaW5lIFRYX1JJTkdfTUFYU0laRSAgIDI1NgorI2RlZmluZSBSWF9SSU5HX01BWFNJWkUgICAyNTYKKworI2RlZmluZSBUWF9SSU5HX1NJWkUgICAgICAyNTYKKyNkZWZpbmUgUlhfUklOR19TSVpFICAgICAgMjU2CisKKyNkZWZpbmUgTkVYVF9SWChudW0pICAgICAgICgoKG51bSkgKyAxKSAmIChSWF9SSU5HX1NJWkUgLSAxKSkKKyNkZWZpbmUgTkVYVF9UWChudW0pICAgICAgICgoKG51bSkgKyAxKSAmIChUWF9SSU5HX1NJWkUgLSAxKSkKKyNkZWZpbmUgUFJFVl9SWChudW0pICAgICAgICgoKG51bSkgLSAxKSAmIChSWF9SSU5HX1NJWkUgLSAxKSkKKyNkZWZpbmUgUFJFVl9UWChudW0pICAgICAgICgoKG51bSkgLSAxKSAmIChUWF9SSU5HX1NJWkUgLSAxKSkKKworI2RlZmluZSBUWF9CVUZGU19BVkFJTChicCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgoKGJwKS0+dHhfb2xkIDw9IChicCktPnR4X25ldykgPyAgICAgICAgICAgICAgICAgICAgIFwKKwkgIChicCktPnR4X29sZCArIChUWF9SSU5HX1NJWkUgLSAxKSAtIChicCktPnR4X25ldyA6ICBcCisJCQkgICAgKGJwKS0+dHhfb2xkIC0gKGJwKS0+dHhfbmV3IC0gMSkKKworCisjZGVmaW5lIFJYX0NPUFlfVEhSRVNIT0xEICAyNTYKKyNkZWZpbmUgUlhfQlVGX0FMTE9DX1NJWkUgIChFVEhfRlJBTUVfTEVOICsgKDY0ICogMykpCisKK3N0cnVjdCBibWFjX2luaXRfYmxvY2sgeworCXN0cnVjdCBiZV9yeGQgYmVfcnhkW1JYX1JJTkdfTUFYU0laRV07CisJc3RydWN0IGJlX3R4ZCBiZV90eGRbVFhfUklOR19NQVhTSVpFXTsKK307CisKKyNkZWZpbmUgYmliX29mZnNldChtZW0sIGVsZW0pIFwKKygoX191MzIpKCh1bnNpZ25lZCBsb25nKSgmKCgoc3RydWN0IGJtYWNfaW5pdF9ibG9jayAqKTApLT5tZW1bZWxlbV0pKSkpCisKKy8qIE5vdyBzb2Z0d2FyZSBzdGF0ZSBzdHVmZi4gKi8KK2VudW0gYmlnbWFjX3RyYW5zY2VpdmVyIHsKKwlleHRlcm5hbCA9IDAsCisJaW50ZXJuYWwgPSAxLAorCW5vbmUgICAgID0gMiwKK307CisKKy8qIFRpbWVyIHN0YXRlIGVuZ2luZS4gKi8KK2VudW0gYmlnbWFjX3RpbWVyX3N0YXRlIHsKKwlsdHJ5d2FpdCA9IDEsICAvKiBGb3JjaW5nIHRyeSBvZiBhbGwgbW9kZXMsIGZyb20gZmFzdGVzdCB0byBzbG93ZXN0LiAqLworCWFzbGVlcCAgID0gMiwgIC8qIFRpbWVyIGluYWN0aXZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9OworCitzdHJ1Y3QgYmlnbWFjIHsKKwl2b2lkIF9faW9tZW0JKmdyZWdzOwkvKiBRRUMgR2xvYmFsIFJlZ2lzdGVycyAgICAgICAgICAgICAgICovCisJdm9pZCBfX2lvbWVtCSpjcmVnOwkvKiBRRUMgQmlnTUFDIENoYW5uZWwgUmVnaXN0ZXJzICAgICAgICovCisJdm9pZCBfX2lvbWVtCSpicmVnczsJLyogQmlnTUFDIFJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAqLworCXZvaWQgX19pb21lbQkqdHJlZ3M7CS8qIEJpZ01BQyBUcmFuc2NlaXZlciAgICAgICAgICAgICAgICAgKi8KKwlzdHJ1Y3QgYm1hY19pbml0X2Jsb2NrCSpibWFjX2Jsb2NrOwkvKiBSWCBhbmQgVFggZGVzY3JpcHRvcnMgKi8KKwlfX3UzMgkJCSBiYmxvY2tfZHZtYTsJLyogUlggYW5kIFRYIGRlc2NyaXB0b3JzICovCisKKwlzcGlubG9ja190CQlsb2NrOworCisJc3RydWN0IHNrX2J1ZmYJCSpyeF9za2JzW1JYX1JJTkdfU0laRV07CisJc3RydWN0IHNrX2J1ZmYJCSp0eF9za2JzW1RYX1JJTkdfU0laRV07CisKKwlpbnQgcnhfbmV3LCB0eF9uZXcsIHJ4X29sZCwgdHhfb2xkOworCisJaW50IGJvYXJkX3JldjsJCQkJLyogQmlnTUFDIGJvYXJkIHJldmlzaW9uLiAgICAgICAgICAgICAqLworCisJZW51bSBiaWdtYWNfdHJhbnNjZWl2ZXIJdGN2cl90eXBlOworCXVuc2lnbmVkIGludAkJYmlnbWFjX2J1cnN0czsKKwl1bnNpZ25lZCBpbnQJCXBhZGRyOworCXVuc2lnbmVkIHNob3J0CQlzd19ibXNyOyAgICAgICAgIC8qIFNXIGNvcHkgb2YgUEhZIEJNU1IgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIHNob3J0CQlzd19ibWNyOyAgICAgICAgIC8qIFNXIGNvcHkgb2YgUEhZIEJNQ1IgICAgICAgICAgICAgICAqLworCXN0cnVjdCB0aW1lcl9saXN0CWJpZ21hY190aW1lcjsKKwllbnVtIGJpZ21hY190aW1lcl9zdGF0ZQl0aW1lcl9zdGF0ZTsKKwl1bnNpZ25lZCBpbnQJCXRpbWVyX3RpY2tzOworCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJZW5ldF9zdGF0czsKKwlzdHJ1Y3Qgc2J1c19kZXYJCSpxZWNfc2RldjsKKwlzdHJ1Y3Qgc2J1c19kZXYJCSpiaWdtYWNfc2RldjsKKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OworCXN0cnVjdCBiaWdtYWMJCSpuZXh0X21vZHVsZTsKK307CisKKy8qIFdlIHVzZSB0aGlzIHRvIGFjcXVpcmUgcmVjZWl2ZSBza2IncyB0aGF0IHdlIGNhbiBETUEgZGlyZWN0bHkgaW50by4gKi8KKyNkZWZpbmUgQUxJR05FRF9SWF9TS0JfQUREUihhZGRyKSBcCisgICAgICAgICgoKCh1bnNpZ25lZCBsb25nKShhZGRyKSArICg2NCAtIDEpKSAmIH4oNjQgLSAxKSkgLSAodW5zaWduZWQgbG9uZykoYWRkcikpCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmJpZ19tYWNfYWxsb2Nfc2tiKHVuc2lnbmVkIGludCBsZW5ndGgsIGludCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IGFsbG9jX3NrYihsZW5ndGggKyA2NCwgZ2ZwX2ZsYWdzKTsKKwlpZihza2IpIHsKKwkJaW50IG9mZnNldCA9IEFMSUdORURfUlhfU0tCX0FERFIoc2tiLT5kYXRhKTsKKworCQlpZihvZmZzZXQpCisJCQlza2JfcmVzZXJ2ZShza2IsIG9mZnNldCk7CisJfQorCXJldHVybiBza2I7Cit9CisKKyNlbmRpZiAvKiAhKF9TVU5CTUFDX0gpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5kYW5jZS5jIGIvZHJpdmVycy9uZXQvc3VuZGFuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGNiNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3VuZGFuY2UuYwpAQCAtMCwwICsxLDE3ODUgQEAKKy8qIHN1bmRhbmNlLmM6IEEgTGludXggZGV2aWNlIGRyaXZlciBmb3IgdGhlIFN1bmRhbmNlIFNUMjAxICJBbHRhIi4gKi8KKy8qCisJV3JpdHRlbiAxOTk5LTIwMDAgYnkgRG9uYWxkIEJlY2tlci4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKwl0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCURyaXZlcnMgYmFzZWQgb24gb3IgZGVyaXZlZCBmcm9tIHRoaXMgY29kZSBmYWxsIHVuZGVyIHRoZSBHUEwgYW5kIG11c3QKKwlyZXRhaW4gdGhlIGF1dGhvcnNoaXAsIGNvcHlyaWdodCBhbmQgbGljZW5zZSBub3RpY2UuICBUaGlzIGZpbGUgaXMgbm90CisJYSBjb21wbGV0ZSBwcm9ncmFtIGFuZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdGhlIGVudGlyZSBvcGVyYXRpbmcKKwlzeXN0ZW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4KKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisJNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKwlBbm5hcG9saXMgTUQgMjE0MDMKKworCVN1cHBvcnQgYW5kIHVwZGF0ZXMgYXZhaWxhYmxlIGF0CisJaHR0cDovL3d3dy5zY3lsZC5jb20vbmV0d29yay9zdW5kYW5jZS5odG1sCisKKworCVZlcnNpb24gTEsxLjAxYSAoamdhcnppayk6CisJLSBSZXBsYWNlIHNvbWUgTUlJLXJlbGF0ZWQgbWFnaWMgbnVtYmVycyB3aXRoIGNvbnN0YW50cworCisJVmVyc2lvbiBMSzEuMDIgKEQtTGluayk6CisJLSBBZGQgbmV3IGJvYXJkIHRvIFBDSSBJRCBsaXN0CisJLSBGaXggbXVsdGljYXN0IGJ1ZworCisJVmVyc2lvbiBMSzEuMDMgKEQtTGluayk6CisJLSBOZXcgUnggc2NoZW1lLCByZWR1Y2UgUnggY29uZ2VzdGlvbgorCS0gT3B0aW9uIHRvIGRpc2FibGUgZmxvdyBjb250cm9sCisKKwlWZXJzaW9uIExLMS4wNCAoRC1MaW5rKToKKwktIFR4IHRpbWVvdXQgcmVjb3ZlcnkKKwktIE1vcmUgc3VwcG9ydCBmb3IgZXRodG9vbC4KKworCVZlcnNpb24gTEsxLjA0YToKKwktIFJlbW92ZSB1bnVzZWQvY29uc3RhbnQgbWVtYmVycyBmcm9tIHN0cnVjdCBwY2lfaWRfaW5mbworCSh3aGljaCB0aGVuIGFsbG93cyByZW1vdmFsIG9mICdkcnZfZmxhZ3MnIGZyb20gcHJpdmF0ZSBzdHJ1Y3QpCisJKGpnYXJ6aWspCisJLSBJZiBubyBwaHkgaXMgZm91bmQsIGZhaWwgdG8gbG9hZCB0aGF0IGJvYXJkIChqZ2FyemlrKQorCS0gQWx3YXlzIHN0YXJ0IHBoeSBpZCBzY2FuIGF0IGlkIDEgdG8gYXZvaWQgcHJvYmxlbXMgKERvbmFsZCBCZWNrZXIpCisJLSBBdXRvZGV0ZWN0IHdoZXJlIG1paV9wcmVhYmxlX3JlcXVpcmVkIGlzIG5lZWRlZCwKKwlkZWZhdWx0IHRvIG5vdCBuZWVkZWQuICAoRG9uYWxkIEJlY2tlcikKKworCVZlcnNpb24gTEsxLjA0YjoKKwktIFJlbW92ZSBtaWlfcHJlYW1ibGVfcmVxdWlyZWQgbW9kdWxlIHBhcmFtZXRlciAoRG9uYWxkIEJlY2tlcikKKwktIEFkZCBwZXItaW50ZXJmYWNlIG1paV9wcmVhbWJsZV9yZXF1aXJlZCAoc2V0dGluZyBpcyBhdXRvZGV0ZWN0ZWQpCisJICAoRG9uYWxkIEJlY2tlcikKKwktIFJlbW92ZSB1bm5lY2Vzc2FyeSBjYXN0IGZyb20gdm9pZCBwb2ludGVyIChqZ2FyemlrKQorCS0gUmUtYWxpZ24gY29tbWVudHMgaW4gcHJpdmF0ZSBzdHJ1Y3QgKGpnYXJ6aWspCisKKwlWZXJzaW9uIExLMS4wNGMgKGpnYXJ6aWspOgorCS0gU3VwcG9ydCBiaXRtYXBwZWQgbWVzc2FnZSBsZXZlbHMgKE5FVElGX01TR194eHgpLCBhbmQgdGhlCisJICB0d28gZXRodG9vbCBpb2N0bHMgdGhhdCBnZXQvc2V0IHRoZW0KKwktIERvbid0IGhhbmQtY29kZSBNSUkgZXRodG9vbCBzdXBwb3J0LCB1c2Ugc3RhbmRhcmQgQVBJL2xpYgorCisJVmVyc2lvbiBMSzEuMDRkOgorCS0gTWVyZ2UgZnJvbSBEb25hbGQgQmVja2VyJ3Mgc3VuZGFuY2UuYzogKEphc29uIEx1bnopCisJCSogcHJvcGVyIHN1cHBvcnQgZm9yIHZhcmlhYmx5LXNpemVkIE1UVXMKKwkJKiBkZWZhdWx0IHRvIFBJTywgdG8gZml4IGNoaXAgYnVncworCS0gQWRkIG1pc3NpbmcgdW5yZWdpc3Rlcl9uZXRkZXYgKEphc29uIEx1bnopCisJLSBBZGQgQ09ORklHX1NVTkRBTkNFX01NSU8gY29uZmlnIG9wdGlvbiAoamdhcnppaykKKwktIEJldHRlciByeCBidWYgc2l6ZSBjYWxjdWxhdGlvbiAoRG9uYWxkIEJlY2tlcikKKworCVZlcnNpb24gTEsxLjA1IChELUxpbmspOgorCS0gRml4IERGRS01ODBUWCBwYWNrZXQgZHJvcCBpc3N1ZSAoZm9yIERMMTAwNTBDKQorCS0gRml4IHJlc2V0X3R4IGxvZ2ljCisKKwlWZXJzaW9uIExLMS4wNiAoRC1MaW5rKToKKwktIEZpeCBjcmFzaCB3aGlsZSB1bmxvYWRpbmcgZHJpdmVyCisKKwlWZXJzaW4gTEsxLjA2YiAoRC1MaW5rKToKKwktIE5ldyB0eCBzY2hlbWUsIGFkYXB0aXZlIHR4X2NvYWxlc2NlCisJCisJVmVyc2lvbiBMSzEuMDcgKEQtTGluayk6CisJLSBGaXggdHggYnVncyBpbiBiaWctZW5kaWFuIG1hY2hpbmVzCisJLSBSZW1vdmUgdW51c2VkIG1heF9pbnRlcnJ1cHRfd29yayBtb2R1bGUgcGFyYW1ldGVyLCB0aGUgbmV3IAorCSAgTkFQSS1saWtlIHJ4IHNjaGVtZSBkb2Vzbid0IG5lZWQgaXQuCisJLSBSZW1vdmUgcmVkdW5kYW5jeSBnZXRfc3RhdHMoKSBpbiBpbnRyX2hhbmRsZXIoKSwgdGhvc2UgCisJICBJL08gYWNjZXNzIGNvdWxkIGFmZmVjdCBwZXJmb3JtYW5jZSBpbiBBUk0tYmFzZWQgc3lzdGVtCisJLSBBZGQgTGludXggc29mdHdhcmUgVkxBTiBzdXBwb3J0CisJCisJVmVyc2lvbiBMSzEuMDggKEQtTGluayk6CisJLSBGaXggYnVnIG9mIGN1c3RvbSBtYWMgYWRkcmVzcyAKKwkoU3RhdGlvbkFkZHIgcmVnaXN0ZXIgb25seSBhY2NlcHQgd29yZCB3cml0ZSkgCisKKwlWZXJzaW9uIExLMS4wOSAoRC1MaW5rKToKKwktIEZpeCB0aGUgZmxvd2N0cmwgYnVnLgkKKwktIFNldCBQYXVzZSBiaXQgaW4gTUlJIEFOQVIgaWYgZmxvdyBjb250cm9sIGVuYWJsZWQuCQorCisJVmVyc2lvbiBMSzEuMDlhIChJQ1BsdXMpOgorCS0gQWRkIHRoZSBkZWxheSB0aW1lIGluIHJlYWRpbmcgdGhlIGNvbnRlbnRzIG9mIEVFUFJPTQorCisqLworCisjZGVmaW5lIERSVl9OQU1FCSJzdW5kYW5jZSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMDErTEsxLjA5YSIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIjEwLUp1bC0yMDAzIgorCisKKy8qIFRoZSB1c2VyLWNvbmZpZ3VyYWJsZSB2YWx1ZXMuCisgICBUaGVzZSBtYXkgYmUgbW9kaWZpZWQgd2hlbiBhIGRyaXZlciBtb2R1bGUgaXMgbG9hZGVkLiovCitzdGF0aWMgaW50IGRlYnVnID0gMTsJCQkvKiAxIG5vcm1hbCBtZXNzYWdlcywgMCBxdWlldCAuLiA3IHZlcmJvc2UuICovCisvKiBNYXhpbXVtIG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIGZpbHRlciAodnMuIHJ4LWFsbC1tdWx0aWNhc3QpLgorICAgVHlwaWNhbCBpcyBhIDY0IGVsZW1lbnQgaGFzaCB0YWJsZSBiYXNlZCBvbiB0aGUgRXRoZXJuZXQgQ1JDLiAgKi8KK3N0YXRpYyBpbnQgbXVsdGljYXN0X2ZpbHRlcl9saW1pdCA9IDMyOworCisvKiBTZXQgdGhlIGNvcHkgYnJlYWtwb2ludCBmb3IgdGhlIGNvcHktb25seS10aW55LWZyYW1lcyBzY2hlbWUuCisgICBTZXR0aW5nIHRvID4gMTUxOCBlZmZlY3RpdmVseSBkaXNhYmxlcyB0aGlzIGZlYXR1cmUuCisgICBUaGlzIGNoaXAgY2FuIHJlY2VpdmUgaW50byBvZmZzZXQgYnVmZmVycywgc28gdGhlIEFscGhhIGRvZXMgbm90CisgICBuZWVkIGEgY29weS1hbGlnbi4gKi8KK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrOworc3RhdGljIGludCBmbG93Y3RybD0xOworCisvKiBtZWRpYVtdIHNwZWNpZmllcyB0aGUgbWVkaWEgdHlwZSB0aGUgTklDIG9wZXJhdGVzIGF0LgorCQkgYXV0b3NlbnNlCUF1dG9zZW5zaW5nIGFjdGl2ZSBtZWRpYS4KKwkJIDEwbWJwc19oZCAJMTBNYnBzIGhhbGYgZHVwbGV4LgorCQkgMTBtYnBzX2ZkIAkxME1icHMgZnVsbCBkdXBsZXguCisJCSAxMDBtYnBzX2hkIAkxMDBNYnBzIGhhbGYgZHVwbGV4LgorCQkgMTAwbWJwc19mZCAJMTAwTWJwcyBmdWxsIGR1cGxleC4KKwkJIDAJCUF1dG9zZW5zaW5nIGFjdGl2ZSBtZWRpYS4KKwkJIDEJIAkxME1icHMgaGFsZiBkdXBsZXguCisJCSAyCSAJMTBNYnBzIGZ1bGwgZHVwbGV4LgorCQkgMwkgCTEwME1icHMgaGFsZiBkdXBsZXguCisJCSA0CSAJMTAwTWJwcyBmdWxsIGR1cGxleC4KKyovCisjZGVmaW5lIE1BWF9VTklUUyA4CitzdGF0aWMgY2hhciAqbWVkaWFbTUFYX1VOSVRTXTsKKworCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIHNldCBhdCBjb21waWxlIHRpbWUuICovCisKKy8qIEtlZXAgdGhlIHJpbmcgc2l6ZXMgYSBwb3dlciBvZiB0d28gZm9yIGNvbXBpbGUgZWZmaWNpZW5jeS4KKyAgIFRoZSBjb21waWxlciB3aWxsIGNvbnZlcnQgPHVuc2lnbmVkPiclJzwyXk4+IGludG8gYSBiaXQgbWFzay4KKyAgIE1ha2luZyB0aGUgVHggcmluZyB0b28gbGFyZ2UgZGVjcmVhc2VzIHRoZSBlZmZlY3RpdmVuZXNzIG9mIGNoYW5uZWwKKyAgIGJvbmRpbmcgYW5kIHBhY2tldCBwcmlvcml0eSwgYW5kIG1vcmUgdGhhbiAxMjggcmVxdWlyZXMgbW9kaWZ5aW5nIHRoZQorICAgVHggZXJyb3IgcmVjb3ZlcnkuCisgICBMYXJnZSByZWNlaXZlIHJpbmdzIG1lcmVseSB3YXN0ZSBtZW1vcnkuICovCisjZGVmaW5lIFRYX1JJTkdfU0laRQkzMgorI2RlZmluZSBUWF9RVUVVRV9MRU4JKFRYX1JJTkdfU0laRSAtIDEpIC8qIExpbWl0IHJpbmcgZW50cmllcyBhY3R1YWxseSB1c2VkLiAgKi8KKyNkZWZpbmUgUlhfUklOR19TSVpFCTY0CisjZGVmaW5lIFJYX0JVREdFVAkzMgorI2RlZmluZSBUWF9UT1RBTF9TSVpFCVRYX1JJTkdfU0laRSpzaXplb2Yoc3RydWN0IG5ldGRldl9kZXNjKQorI2RlZmluZSBSWF9UT1RBTF9TSVpFCVJYX1JJTkdfU0laRSpzaXplb2Yoc3RydWN0IG5ldGRldl9kZXNjKQorCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgdXN1YWxseSBhcmUgbm90IGNoYW5nZWQuICovCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQgICg0KkhaKQorI2RlZmluZSBQS1RfQlVGX1NaCQkxNTM2CS8qIFNpemUgb2YgZWFjaCB0ZW1wb3JhcnkgUnggYnVmZmVyLiovCisKKy8qIEluY2x1ZGUgZmlsZXMsIGRlc2lnbmVkIHRvIHN1cHBvcnQgbW9zdCBrZXJuZWwgdmVyc2lvbnMgMi4wLjAgYW5kIGxhdGVyLiAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CQkvKiBQcm9jZXNzb3IgdHlwZSBmb3IgY2FjaGUgYWxpZ25tZW50LiAqLworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpZm5kZWYgX0NPTVBBVF9XSVRIX09MRF9LRVJORUwKKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNlbHNlCisjaW5jbHVkZSAiY3JjMzIuaCIKKyNpbmNsdWRlICJldGh0b29sLmgiCisjaW5jbHVkZSAibWlpLmgiCisjaW5jbHVkZSAiY29tcGF0LmgiCisjZW5kaWYKKworLyogVGhlc2UgaWRlbnRpZnkgdGhlIGRyaXZlciBiYXNlIHZlcnNpb24gYW5kIG1heSBub3QgYmUgcmVtb3ZlZC4gKi8KK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KK0tFUk5fSU5GTyBEUlZfTkFNRSAiLmM6diIgRFJWX1ZFUlNJT04gIiAiIERSVl9SRUxEQVRFICIgIFdyaXR0ZW4gYnkgRG9uYWxkIEJlY2tlclxuIgorS0VSTl9JTkZPICIgIGh0dHA6Ly93d3cuc2N5bGQuY29tL25ldHdvcmsvc3VuZGFuY2UuaHRtbFxuIjsKKworTU9EVUxFX0FVVEhPUigiRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VuZGFuY2UgQWx0YSBFdGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJ4X2NvcHlicmVhaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShtZWRpYSwgY2hhcnAsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKGZsb3djdHJsLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlN1bmRhbmNlIEFsdGEgZGVidWcgbGV2ZWwgKDAtNSkiKTsKK01PRFVMRV9QQVJNX0RFU0MocnhfY29weWJyZWFrLCAiU3VuZGFuY2UgQWx0YSBjb3B5IGJyZWFrcG9pbnQgZm9yIGNvcHktb25seS10aW55LWZyYW1lcyIpOworTU9EVUxFX1BBUk1fREVTQyhmbG93Y3RybCwgIlN1bmRhbmNlIEFsdGEgZmxvdyBjb250cm9sIFswfDFdIik7CisKKy8qCisJCQkJVGhlb3J5IG9mIE9wZXJhdGlvbgorCitJLiBCb2FyZCBDb21wYXRpYmlsaXR5CisKK1RoaXMgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciB0aGUgU3VuZGFuY2UgVGVjaG5vbG9naWVzICJBbHRhIiBTVDIwMSBjaGlwLgorCitJSS4gQm9hcmQtc3BlY2lmaWMgc2V0dGluZ3MKKworSUlJLiBEcml2ZXIgb3BlcmF0aW9uCisKK0lJSWEuIFJpbmcgYnVmZmVycworCitUaGlzIGRyaXZlciB1c2VzIHR3byBzdGF0aWNhbGx5IGFsbG9jYXRlZCBmaXhlZC1zaXplIGRlc2NyaXB0b3IgbGlzdHMKK2Zvcm1lZCBpbnRvIHJpbmdzIGJ5IGEgYnJhbmNoIGZyb20gdGhlIGZpbmFsIGRlc2NyaXB0b3IgdG8gdGhlIGJlZ2lubmluZyBvZgordGhlIGxpc3QuICBUaGUgcmluZyBzaXplcyBhcmUgc2V0IGF0IGNvbXBpbGUgdGltZSBieSBSWC9UWF9SSU5HX1NJWkUuCitTb21lIGNoaXBzIGV4cGxpY2l0bHkgdXNlIG9ubHkgMl5OIHNpemVkIHJpbmdzLCB3aGlsZSBvdGhlcnMgdXNlIGEKKyduZXh0IGRlc2NyaXB0b3InIHBvaW50ZXIgdGhhdCB0aGUgZHJpdmVyIGZvcm1zIGludG8gcmluZ3MuCisKK0lJSWIvYy4gVHJhbnNtaXQvUmVjZWl2ZSBTdHJ1Y3R1cmUKKworVGhpcyBkcml2ZXIgdXNlcyBhIHplcm8tY29weSByZWNlaXZlIGFuZCB0cmFuc21pdCBzY2hlbWUuCitUaGUgZHJpdmVyIGFsbG9jYXRlcyBmdWxsIGZyYW1lIHNpemUgc2tidWZmcyBmb3IgdGhlIFJ4IHJpbmcgYnVmZmVycyBhdAorb3BlbigpIHRpbWUgYW5kIHBhc3NlcyB0aGUgc2tiLT5kYXRhIGZpZWxkIHRvIHRoZSBjaGlwIGFzIHJlY2VpdmUgZGF0YQorYnVmZmVycy4gIFdoZW4gYW4gaW5jb21pbmcgZnJhbWUgaXMgbGVzcyB0aGFuIFJYX0NPUFlCUkVBSyBieXRlcyBsb25nLAorYSBmcmVzaCBza2J1ZmYgaXMgYWxsb2NhdGVkIGFuZCB0aGUgZnJhbWUgaXMgY29waWVkIHRvIHRoZSBuZXcgc2tidWZmLgorV2hlbiB0aGUgaW5jb21pbmcgZnJhbWUgaXMgbGFyZ2VyLCB0aGUgc2tidWZmIGlzIHBhc3NlZCBkaXJlY3RseSB1cCB0aGUKK3Byb3RvY29sIHN0YWNrLiAgQnVmZmVycyBjb25zdW1lZCB0aGlzIHdheSBhcmUgcmVwbGFjZWQgYnkgbmV3bHkgYWxsb2NhdGVkCitza2J1ZmZzIGluIGEgbGF0ZXIgcGhhc2Ugb2YgcmVjZWl2ZXMuCisKK1RoZSBSWF9DT1BZQlJFQUsgdmFsdWUgaXMgY2hvc2VuIHRvIHRyYWRlLW9mZiB0aGUgbWVtb3J5IHdhc3RlZCBieQordXNpbmcgYSBmdWxsLXNpemVkIHNrYnVmZiBmb3Igc21hbGwgZnJhbWVzIHZzLiB0aGUgY29weWluZyBjb3N0cyBvZiBsYXJnZXIKK2ZyYW1lcy4gIE5ldyBib2FyZHMgYXJlIHR5cGljYWxseSB1c2VkIGluIGdlbmVyb3VzbHkgY29uZmlndXJlZCBtYWNoaW5lcworYW5kIHRoZSB1bmRlcmZpbGxlZCBidWZmZXJzIGhhdmUgbmVnbGlnaWJsZSBpbXBhY3QgY29tcGFyZWQgdG8gdGhlIGJlbmVmaXQgb2YKK2Egc2luZ2xlIGFsbG9jYXRpb24gc2l6ZSwgc28gdGhlIGRlZmF1bHQgdmFsdWUgb2YgemVybyByZXN1bHRzIGluIG5ldmVyCitjb3B5aW5nIHBhY2tldHMuICBXaGVuIGNvcHlpbmcgaXMgZG9uZSwgdGhlIGNvc3QgaXMgdXN1YWxseSBtaXRpZ2F0ZWQgYnkgdXNpbmcKK2EgY29tYmluZWQgY29weS9jaGVja3N1bSByb3V0aW5lLiAgQ29weWluZyBhbHNvIHByZWxvYWRzIHRoZSBjYWNoZSwgd2hpY2ggaXMKK21vc3QgdXNlZnVsIHdpdGggc21hbGwgZnJhbWVzLgorCitBIHN1YnRsZSBhc3BlY3Qgb2YgdGhlIG9wZXJhdGlvbiBpcyB0aGF0IHRoZSBJUCBoZWFkZXIgYXQgb2Zmc2V0IDE0IGluIGFuCitldGhlcm5ldCBmcmFtZSBpc24ndCBsb25nd29yZCBhbGlnbmVkIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCitVbmFsaWduZWQgYnVmZmVycyBhcmUgcGVybWl0dGVkIGJ5IHRoZSBTdW5kYW5jZSBoYXJkd2FyZSwgc28KK2ZyYW1lcyBhcmUgcmVjZWl2ZWQgaW50byB0aGUgc2tidWZmIGF0IGFuIG9mZnNldCBvZiAiKzIiLCAxNi1ieXRlIGFsaWduaW5nCit0aGUgSVAgaGVhZGVyLgorCitJSUlkLiBTeW5jaHJvbml6YXRpb24KKworVGhlIGRyaXZlciBydW5zIGFzIHR3byBpbmRlcGVuZGVudCwgc2luZ2xlLXRocmVhZGVkIGZsb3dzIG9mIGNvbnRyb2wuICBPbmUKK2lzIHRoZSBzZW5kLXBhY2tldCByb3V0aW5lLCB3aGljaCBlbmZvcmNlcyBzaW5nbGUtdGhyZWFkZWQgdXNlIGJ5IHRoZQorZGV2LT50YnVzeSBmbGFnLiAgVGhlIG90aGVyIHRocmVhZCBpcyB0aGUgaW50ZXJydXB0IGhhbmRsZXIsIHdoaWNoIGlzIHNpbmdsZQordGhyZWFkZWQgYnkgdGhlIGhhcmR3YXJlIGFuZCBpbnRlcnJ1cHQgaGFuZGxpbmcgc29mdHdhcmUuCisKK1RoZSBzZW5kIHBhY2tldCB0aHJlYWQgaGFzIHBhcnRpYWwgY29udHJvbCBvdmVyIHRoZSBUeCByaW5nIGFuZCAnZGV2LT50YnVzeScKK2ZsYWcuICBJdCBzZXRzIHRoZSB0YnVzeSBmbGFnIHdoZW5ldmVyIGl0J3MgcXVldWluZyBhIFR4IHBhY2tldC4gSWYgdGhlIG5leHQKK3F1ZXVlIHNsb3QgaXMgZW1wdHksIGl0IGNsZWFycyB0aGUgdGJ1c3kgZmxhZyB3aGVuIGZpbmlzaGVkIG90aGVyd2lzZSBpdCBzZXRzCit0aGUgJ2xwLT50eF9mdWxsJyBmbGFnLgorCitUaGUgaW50ZXJydXB0IGhhbmRsZXIgaGFzIGV4Y2x1c2l2ZSBjb250cm9sIG92ZXIgdGhlIFJ4IHJpbmcgYW5kIHJlY29yZHMgc3RhdHMKK2Zyb20gdGhlIFR4IHJpbmcuICBBZnRlciByZWFwaW5nIHRoZSBzdGF0cywgaXQgbWFya3MgdGhlIFR4IHF1ZXVlIGVudHJ5IGFzCitlbXB0eSBieSBpbmNyZW1lbnRpbmcgdGhlIGRpcnR5X3R4IG1hcmsuIElmZiB0aGUgJ2xwLT50eF9mdWxsJyBmbGFnIGlzIHNldCwgaXQKK2NsZWFycyBib3RoIHRoZSB0eF9mdWxsIGFuZCB0YnVzeSBmbGFncy4KKworSVYuIE5vdGVzCisKK0lWYi4gUmVmZXJlbmNlcworCitUaGUgU3VuZGFuY2UgU1QyMDEgZGF0YXNoZWV0LCBwcmVsaW1pbmFyeSB2ZXJzaW9uLgoraHR0cDovL2Nlc2Rpcy5nc2ZjLm5hc2EuZ292L2xpbnV4L21pc2MvMTAwbWJwcy5odG1sCitodHRwOi8vY2VzZGlzLmdzZmMubmFzYS5nb3YvbGludXgvbWlzYy9OV2F5Lmh0bWwKKworSVZjLiBFcnJhdGEKKworKi8KKworLyogV29yay1hcm91bmQgZm9yIEtlbmRpbiBjaGlwIGJ1Z3MuICovCisjaWZuZGVmIENPTkZJR19TVU5EQU5DRV9NTUlPCisjZGVmaW5lIFVTRV9JT19PUFMgMQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzdW5kYW5jZV9wY2lfdGJsW10gPSB7CisJezB4MTE4NiwgMHgxMDAyLCAweDExODYsIDB4MTAwMiwgMCwgMCwgMH0sCisJezB4MTE4NiwgMHgxMDAyLCAweDExODYsIDB4MTAwMywgMCwgMCwgMX0sCisJezB4MTE4NiwgMHgxMDAyLCAweDExODYsIDB4MTAxMiwgMCwgMCwgMn0sCisJezB4MTE4NiwgMHgxMDAyLCAweDExODYsIDB4MTA0MCwgMCwgMCwgM30sCisJezB4MTE4NiwgMHgxMDAyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA0fSwKKwl7MHgxM0YwLCAweDAyMDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDV9LAorCXswLH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc3VuZGFuY2VfcGNpX3RibCk7CisKK2VudW0geworCW5ldGRldl9pb19zaXplID0gMTI4Cit9OworCitzdHJ1Y3QgcGNpX2lkX2luZm8geworICAgICAgICBjb25zdCBjaGFyICpuYW1lOworfTsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2lkX2luZm8gcGNpX2lkX3RibFtdID0geworCXsiRC1MaW5rIERGRS01NTBUWCBGQVNUIEV0aGVybmV0IEFkYXB0ZXIifSwKKwl7IkQtTGluayBERkUtNTUwRlggMTAwTWJwcyBGaWJlci1vcHRpY3MgQWRhcHRlciJ9LAorCXsiRC1MaW5rIERGRS01ODBUWCA0IHBvcnQgU2VydmVyIEFkYXB0ZXIifSwKKwl7IkQtTGluayBERkUtNTMwVFhTIEZBU1QgRXRoZXJuZXQgQWRhcHRlciJ9LAorCXsiRC1MaW5rIERMMTAwNTAtYmFzZWQgRkFTVCBFdGhlcm5ldCBBZGFwdGVyIn0sCisJeyJTdW5kYW5jZSBUZWNobm9sb2d5IEFsdGEifSwKKwl7TlVMTCx9LAkJCS8qIDAgdGVybWluYXRlZCBsaXN0LiAqLworfTsKKworLyogVGhpcyBkcml2ZXIgd2FzIHdyaXR0ZW4gdG8gdXNlIFBDSSBtZW1vcnkgc3BhY2UsIGhvd2V2ZXIgeDg2LW9yaWVudGVkCisgICBoYXJkd2FyZSBvZnRlbiB1c2VzIEkvTyBzcGFjZSBhY2Nlc3Nlcy4gKi8KKworLyogT2Zmc2V0cyB0byB0aGUgZGV2aWNlIHJlZ2lzdGVycy4KKyAgIFVubGlrZSBzb2Z0d2FyZS1vbmx5IHN5c3RlbXMsIGRldmljZSBkcml2ZXJzIGludGVyYWN0IHdpdGggY29tcGxleCBoYXJkd2FyZS4KKyAgIEl0J3Mgbm90IHVzZWZ1bCB0byBkZWZpbmUgc3ltYm9saWMgbmFtZXMgZm9yIGV2ZXJ5IHJlZ2lzdGVyIGJpdCBpbiB0aGUKKyAgIGRldmljZS4gIFRoZSBuYW1lIGNhbiBvbmx5IHBhcnRpYWxseSBkb2N1bWVudCB0aGUgc2VtYW50aWNzIGFuZCBtYWtlCisgICB0aGUgZHJpdmVyIGxvbmdlciBhbmQgbW9yZSBkaWZmaWN1bHQgdG8gcmVhZC4KKyAgIEluIGdlbmVyYWwsIG9ubHkgdGhlIGltcG9ydGFudCBjb25maWd1cmF0aW9uIHZhbHVlcyBvciBiaXRzIGNoYW5nZWQKKyAgIG11bHRpcGxlIHRpbWVzIHNob3VsZCBiZSBkZWZpbmVkIHN5bWJvbGljYWxseS4KKyovCitlbnVtIGFsdGFfb2Zmc2V0cyB7CisJRE1BQ3RybCA9IDB4MDAsCisJVHhMaXN0UHRyID0gMHgwNCwKKwlUeERNQUJ1cnN0VGhyZXNoID0gMHgwOCwKKwlUeERNQVVyZ2VudFRocmVzaCA9IDB4MDksCisJVHhETUFQb2xsUGVyaW9kID0gMHgwYSwKKwlSeERNQVN0YXR1cyA9IDB4MGMsCisJUnhMaXN0UHRyID0gMHgxMCwKKwlEZWJ1Z0N0cmwwID0gMHgxYSwKKwlEZWJ1Z0N0cmwxID0gMHgxYywKKwlSeERNQUJ1cnN0VGhyZXNoID0gMHgxNCwKKwlSeERNQVVyZ2VudFRocmVzaCA9IDB4MTUsCisJUnhETUFQb2xsUGVyaW9kID0gMHgxNiwKKwlMRURDdHJsID0gMHgxYSwKKwlBU0lDQ3RybCA9IDB4MzAsCisJRUVEYXRhID0gMHgzNCwKKwlFRUN0cmwgPSAweDM2LAorCVR4U3RhcnRUaHJlc2ggPSAweDNjLAorCVJ4RWFybHlUaHJlc2ggPSAweDNlLAorCUZsYXNoQWRkciA9IDB4NDAsCisJRmxhc2hEYXRhID0gMHg0NCwKKwlUeFN0YXR1cyA9IDB4NDYsCisJVHhGcmFtZUlkID0gMHg0NywKKwlEb3duQ291bnRlciA9IDB4MTgsCisJSW50ckNsZWFyID0gMHg0YSwKKwlJbnRyRW5hYmxlID0gMHg0YywKKwlJbnRyU3RhdHVzID0gMHg0ZSwKKwlNQUNDdHJsMCA9IDB4NTAsCisJTUFDQ3RybDEgPSAweDUyLAorCVN0YXRpb25BZGRyID0gMHg1NCwKKwlNYXhGcmFtZVNpemUgPSAweDVBLAorCVJ4TW9kZSA9IDB4NWMsCisJTUlJQ3RybCA9IDB4NWUsCisJTXVsdGljYXN0RmlsdGVyMCA9IDB4NjAsCisJTXVsdGljYXN0RmlsdGVyMSA9IDB4NjQsCisJUnhPY3RldHNMb3cgPSAweDY4LAorCVJ4T2N0ZXRzSGlnaCA9IDB4NmEsCisJVHhPY3RldHNMb3cgPSAweDZjLAorCVR4T2N0ZXRzSGlnaCA9IDB4NmUsCisJVHhGcmFtZXNPSyA9IDB4NzAsCisJUnhGcmFtZXNPSyA9IDB4NzIsCisJU3RhdHNDYXJyaWVyRXJyb3IgPSAweDc0LAorCVN0YXRzTGF0ZUNvbGwgPSAweDc1LAorCVN0YXRzTXVsdGlDb2xsID0gMHg3NiwKKwlTdGF0c09uZUNvbGwgPSAweDc3LAorCVN0YXRzVHhEZWZlciA9IDB4NzgsCisJUnhNaXNzZWQgPSAweDc5LAorCVN0YXRzVHhYU0RlZmVyID0gMHg3YSwKKwlTdGF0c1R4QWJvcnQgPSAweDdiLAorCVN0YXRzQmNhc3RUeCA9IDB4N2MsCisJU3RhdHNCY2FzdFJ4ID0gMHg3ZCwKKwlTdGF0c01jYXN0VHggPSAweDdlLAorCVN0YXRzTWNhc3RSeCA9IDB4N2YsCisJLyogQWxpYXNlZCBhbmQgYm9ndXMgdmFsdWVzISAqLworCVJ4U3RhdHVzID0gMHgwYywKK307CitlbnVtIEFTSUNDdHJsX0hpV29yZF9iaXQgeworCUdsb2JhbFJlc2V0ID0gMHgwMDAxLAorCVJ4UmVzZXQgPSAweDAwMDIsCisJVHhSZXNldCA9IDB4MDAwNCwKKwlETUFSZXNldCA9IDB4MDAwOCwKKwlGSUZPUmVzZXQgPSAweDAwMTAsCisJTmV0d29ya1Jlc2V0ID0gMHgwMDIwLAorCUhvc3RSZXNldCA9IDB4MDA0MCwKKwlSZXNldEJ1c3kgPSAweDA0MDAsCit9OworCisvKiBCaXRzIGluIHRoZSBpbnRlcnJ1cHQgc3RhdHVzL21hc2sgcmVnaXN0ZXJzLiAqLworZW51bSBpbnRyX3N0YXR1c19iaXRzIHsKKwlJbnRyU3VtbWFyeT0weDAwMDEsIEludHJQQ0lFcnI9MHgwMDAyLCBJbnRyTUFDQ3RybD0weDAwMDgsCisJSW50clR4RG9uZT0weDAwMDQsIEludHJSeERvbmU9MHgwMDEwLCBJbnRyUnhTdGFydD0weDAwMjAsCisJSW50ckRydlJxc3Q9MHgwMDQwLAorCVN0YXRzTWF4PTB4MDA4MCwgTGlua0NoYW5nZT0weDAxMDAsCisJSW50clR4RE1BRG9uZT0weDAyMDAsIEludHJSeERNQURvbmU9MHgwNDAwLAorfTsKKworLyogQml0cyBpbiB0aGUgUnhNb2RlIHJlZ2lzdGVyLiAqLworZW51bSByeF9tb2RlX2JpdHMgeworCUFjY2VwdEFsbElQTXVsdGk9MHgyMCwgQWNjZXB0TXVsdGlIYXNoPTB4MTAsIEFjY2VwdEFsbD0weDA4LAorCUFjY2VwdEJyb2FkY2FzdD0weDA0LCBBY2NlcHRNdWx0aWNhc3Q9MHgwMiwgQWNjZXB0TXlQaHlzPTB4MDEsCit9OworLyogQml0cyBpbiBNQUNDdHJsLiAqLworZW51bSBtYWNfY3RybDBfYml0cyB7CisJRW5iRnVsbER1cGxleD0weDIwLCBFbmJSY3ZMYXJnZUZyYW1lPTB4NDAsCisJRW5iRmxvd0N0cmw9MHgxMDAsIEVuYlBhc3NSeENSQz0weDIwMCwKK307CitlbnVtIG1hY19jdHJsMV9iaXRzIHsKKwlTdGF0c0VuYWJsZT0weDAwMjAsCVN0YXRzRGlzYWJsZT0weDAwNDAsIFN0YXRzRW5hYmxlZD0weDAwODAsCisJVHhFbmFibGU9MHgwMTAwLCBUeERpc2FibGU9MHgwMjAwLCBUeEVuYWJsZWQ9MHgwNDAwLAorCVJ4RW5hYmxlPTB4MDgwMCwgUnhEaXNhYmxlPTB4MTAwMCwgUnhFbmFibGVkPTB4MjAwMCwKK307CisKKy8qIFRoZSBSeCBhbmQgVHggYnVmZmVyIGRlc2NyaXB0b3JzLiAqLworLyogTm90ZSB0aGF0IHVzaW5nIG9ubHkgMzIgYml0IGZpZWxkcyBzaW1wbGlmaWVzIGNvbnZlcnNpb24gdG8gYmlnLWVuZGlhbgorICAgYXJjaGl0ZWN0dXJlcy4gKi8KK3N0cnVjdCBuZXRkZXZfZGVzYyB7CisJdTMyIG5leHRfZGVzYzsKKwl1MzIgc3RhdHVzOworCXN0cnVjdCBkZXNjX2ZyYWcgeyB1MzIgYWRkciwgbGVuZ3RoOyB9IGZyYWdbMV07Cit9OworCisvKiBCaXRzIGluIG5ldGRldl9kZXNjLnN0YXR1cyAqLworZW51bSBkZXNjX3N0YXR1c19iaXRzIHsKKwlEZXNjT3duPTB4ODAwMCwKKwlEZXNjRW5kUGFja2V0PTB4NDAwMCwKKwlEZXNjRW5kUmluZz0weDIwMDAsCisJTGFzdEZyYWc9MHg4MDAwMDAwMCwKKwlEZXNjSW50ck9uVHg9MHg4MDAwLAorCURlc2NJbnRyT25ETUFEb25lPTB4ODAwMDAwMDAsCisJRGlzYWJsZUFsaWduID0gMHgwMDAwMDAwMSwKK307CisKKyNkZWZpbmUgUFJJVl9BTElHTgkxNSAJLyogUmVxdWlyZWQgYWxpZ25tZW50IG1hc2sgKi8KKy8qIFVzZSAgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCAoTDFfQ0FDSEVfQllURVMpKSkgIHRvIG1haW50YWluIGFsaWdubWVudAorICAgd2l0aGluIHRoZSBzdHJ1Y3R1cmUuICovCisjZGVmaW5lIE1JSV9DTlQJCTQKK3N0cnVjdCBuZXRkZXZfcHJpdmF0ZSB7CisJLyogRGVzY3JpcHRvciByaW5ncyBmaXJzdCBmb3IgYWxpZ25tZW50LiAqLworCXN0cnVjdCBuZXRkZXZfZGVzYyAqcnhfcmluZzsKKwlzdHJ1Y3QgbmV0ZGV2X2Rlc2MgKnR4X3Jpbmc7CisJc3RydWN0IHNrX2J1ZmYqIHJ4X3NrYnVmZltSWF9SSU5HX1NJWkVdOworCXN0cnVjdCBza19idWZmKiB0eF9za2J1ZmZbVFhfUklOR19TSVpFXTsKKyAgICAgICAgZG1hX2FkZHJfdCB0eF9yaW5nX2RtYTsKKyAgICAgICAgZG1hX2FkZHJfdCByeF9yaW5nX2RtYTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsJCS8qIE1lZGlhIG1vbml0b3JpbmcgdGltZXIuICovCisJLyogRnJlcXVlbnRseSB1c2VkIHZhbHVlczoga2VlcCBzb21lIGFkamFjZW50IGZvciBjYWNoZSBlZmZlY3QuICovCisJc3BpbmxvY2tfdCBsb2NrOworCXNwaW5sb2NrX3QgcnhfbG9jazsJCQkvKiBHcm91cCB3aXRoIFR4IGNvbnRyb2wgY2FjaGUgbGluZS4gKi8KKwlpbnQgbXNnX2VuYWJsZTsKKwlpbnQgY2hpcF9pZDsKKwl1bnNpZ25lZCBpbnQgY3VyX3J4LCBkaXJ0eV9yeDsJCS8qIFByb2R1Y2VyL2NvbnN1bWVyIHJpbmcgaW5kaWNlcyAqLworCXVuc2lnbmVkIGludCByeF9idWZfc3o7CQkJLyogQmFzZWQgb24gTVRVK3NsYWNrLiAqLworCXN0cnVjdCBuZXRkZXZfZGVzYyAqbGFzdF90eDsJCS8qIExhc3QgVHggZGVzY3JpcHRvciB1c2VkLiAqLworCXVuc2lnbmVkIGludCBjdXJfdHgsIGRpcnR5X3R4OworCS8qIFRoZXNlIHZhbHVlcyBhcmUga2VlcCB0cmFjayBvZiB0aGUgdHJhbnNjZWl2ZXIvbWVkaWEgaW4gdXNlLiAqLworCXVuc2lnbmVkIGludCBmbG93Y3RybDoxOworCXVuc2lnbmVkIGludCBkZWZhdWx0X3BvcnQ6NDsJCS8qIExhc3QgZGV2LT5pZl9wb3J0IHZhbHVlLiAqLworCXVuc2lnbmVkIGludCBhbl9lbmFibGU6MTsKKwl1bnNpZ25lZCBpbnQgc3BlZWQ7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHJ4X3Rhc2tsZXQ7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHR4X3Rhc2tsZXQ7CisJaW50IGJ1ZGdldDsKKwlpbnQgY3VyX3Rhc2s7CisJLyogTXVsdGljYXN0IGFuZCByZWNlaXZlIG1vZGUuICovCisJc3BpbmxvY2tfdCBtY2FzdGxvY2s7CQkJLyogU01QIGxvY2sgbXVsdGljYXN0IHVwZGF0ZXMuICovCisJdTE2IG1jYXN0X2ZpbHRlcls0XTsKKwkvKiBNSUkgdHJhbnNjZWl2ZXIgc2VjdGlvbi4gKi8KKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpX2lmOworCWludCBtaWlfcHJlYW1ibGVfcmVxdWlyZWQ7CisJdW5zaWduZWQgY2hhciBwaHlzW01JSV9DTlRdOwkJLyogTUlJIGRldmljZSBhZGRyZXNzZXMsIG9ubHkgZmlyc3Qgb25lIHVzZWQuICovCisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXVuc2lnbmVkIGNoYXIgcGNpX3Jldl9pZDsKK307CisKKy8qIFRoZSBzdGF0aW9uIGFkZHJlc3MgbG9jYXRpb24gaW4gdGhlIEVFUFJPTS4gKi8KKyNkZWZpbmUgRUVQUk9NX1NBX09GRlNFVAkweDEwCisjZGVmaW5lIERFRkFVTFRfSU5UUiAoSW50clJ4RE1BRG9uZSB8IEludHJQQ0lFcnIgfCBcCisJCQlJbnRyRHJ2UnFzdCB8IEludHJUeERvbmUgfCBTdGF0c01heCB8IFwKKwkJCUxpbmtDaGFuZ2UpCisKK3N0YXRpYyBpbnQgIGNoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpOworc3RhdGljIGludCAgZWVwcm9tX3JlYWQodm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBsb2NhdGlvbik7CitzdGF0aWMgaW50ICBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpOworc3RhdGljIGludCAgbmV0ZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBjaGVja19kdXBsZXgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBuZXRkZXZfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHR4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBpbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICBzdGFydF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcmVzZXRfdHggKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGludHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIHJ4X3BvbGwodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHR4X3BvbGwodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHJlZmlsbF9yeCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBuZXRkZXZfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGludHJfc3RhdHVzKTsKK3N0YXRpYyB2b2lkIG5ldGRldl9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW50cl9zdGF0dXMpOworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IF9fc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpnZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG5ldGRldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgIG5ldGRldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHM7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHN1bmRhbmNlX3Byb2JlMSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnA7CisJc3RhdGljIGludCBjYXJkX2lkeDsKKwlpbnQgY2hpcF9pZHggPSBlbnQtPmRyaXZlcl9kYXRhOworCWludCBpcnE7CisJaW50IGk7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJdTE2IG1paV9jdGw7CisJdm9pZCAqcmluZ19zcGFjZTsKKwlkbWFfYWRkcl90IHJpbmdfZG1hOworI2lmZGVmIFVTRV9JT19PUFMKKwlpbnQgYmFyID0gMDsKKyNlbHNlCisJaW50IGJhciA9IDE7CisjZW5kaWYKKworCisvKiB3aGVuIGJ1aWx0IGludG8gdGhlIGtlcm5lbCwgd2Ugb25seSBwcmludCB2ZXJzaW9uIGlmIGRldmljZSBpcyBmb3VuZCAqLworI2lmbmRlZiBNT0RVTEUKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJcmV0dXJuIC1FSU87CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlpcnEgPSBwZGV2LT5pcnE7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKm5wKSk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpKQorCQlnb3RvIGVycl9vdXRfbmV0ZGV2OworCisJaW9hZGRyID0gcGNpX2lvbWFwKHBkZXYsIGJhciwgbmV0ZGV2X2lvX3NpemUpOworCWlmICghaW9hZGRyKQorCQlnb3RvIGVycl9vdXRfcmVzOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJKCh1MTYgKilkZXYtPmRldl9hZGRyKVtpXSA9CisJCQlsZTE2X3RvX2NwdShlZXByb21fcmVhZChpb2FkZHIsIGkgKyBFRVBST01fU0FfT0ZGU0VUKSk7CisKKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvYWRkcjsKKwlkZXYtPmlycSA9IGlycTsKKworCW5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlucC0+YmFzZSA9IGlvYWRkcjsKKwlucC0+cGNpX2RldiA9IHBkZXY7CisJbnAtPmNoaXBfaWQgPSBjaGlwX2lkeDsKKwlucC0+bXNnX2VuYWJsZSA9ICgxIDw8IGRlYnVnKSAtIDE7CisJc3Bpbl9sb2NrX2luaXQoJm5wLT5sb2NrKTsKKwl0YXNrbGV0X2luaXQoJm5wLT5yeF90YXNrbGV0LCByeF9wb2xsLCAodW5zaWduZWQgbG9uZylkZXYpOworCXRhc2tsZXRfaW5pdCgmbnAtPnR4X3Rhc2tsZXQsIHR4X3BvbGwsICh1bnNpZ25lZCBsb25nKWRldik7CisKKwlyaW5nX3NwYWNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKKwlpZiAoIXJpbmdfc3BhY2UpCisJCWdvdG8gZXJyX291dF9jbGVhcmRldjsKKwlucC0+dHhfcmluZyA9IChzdHJ1Y3QgbmV0ZGV2X2Rlc2MgKilyaW5nX3NwYWNlOworCW5wLT50eF9yaW5nX2RtYSA9IHJpbmdfZG1hOworCisJcmluZ19zcGFjZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFJYX1RPVEFMX1NJWkUsICZyaW5nX2RtYSk7CisJaWYgKCFyaW5nX3NwYWNlKQorCQlnb3RvIGVycl9vdXRfdW5tYXBfdHg7CisJbnAtPnJ4X3JpbmcgPSAoc3RydWN0IG5ldGRldl9kZXNjICopcmluZ19zcGFjZTsKKwlucC0+cnhfcmluZ19kbWEgPSByaW5nX2RtYTsKKworCW5wLT5taWlfaWYuZGV2ID0gZGV2OworCW5wLT5taWlfaWYubWRpb19yZWFkID0gbWRpb19yZWFkOworCW5wLT5taWlfaWYubWRpb193cml0ZSA9IG1kaW9fd3JpdGU7CisJbnAtPm1paV9pZi5waHlfaWRfbWFzayA9IDB4MWY7CisJbnAtPm1paV9pZi5yZWdfbnVtX21hc2sgPSAweDFmOworCisJLyogVGhlIGNoaXAtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSAmbmV0ZGV2X29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmc3RhcnRfdHg7CisJZGV2LT5zdG9wID0gJm5ldGRldl9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9ICZnZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X3J4X21vZGU7CisJZGV2LT5kb19pb2N0bCA9ICZuZXRkZXZfaW9jdGw7CisJU0VUX0VUSFRPT0xfT1BTKGRldiwgJmV0aHRvb2xfb3BzKTsKKwlkZXYtPnR4X3RpbWVvdXQgPSAmdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKwlkZXYtPmNoYW5nZV9tdHUgPSAmY2hhbmdlX210dTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJm5wLT5wY2lfcmV2X2lkKTsKKworCWkgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoaSkKKwkJZ290byBlcnJfb3V0X3VubWFwX3J4OworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGF0ICVwLCAiLAorCQkgICBkZXYtPm5hbWUsIHBjaV9pZF90YmxbY2hpcF9pZHhdLm5hbWUsIGlvYWRkcik7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJCXByaW50aygiJTIuMng6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCIlMi4yeCwgSVJRICVkLlxuIiwgZGV2LT5kZXZfYWRkcltpXSwgaXJxKTsKKworCWlmICgxKSB7CisJCWludCBwaHksIHBoeV9pZHggPSAwOworCQlucC0+cGh5c1swXSA9IDE7CQkvKiBEZWZhdWx0IHNldHRpbmcgKi8KKwkJbnAtPm1paV9wcmVhbWJsZV9yZXF1aXJlZCsrOworCQlmb3IgKHBoeSA9IDE7IHBoeSA8IDMyICYmIHBoeV9pZHggPCBNSUlfQ05UOyBwaHkrKykgeworCQkJaW50IG1paV9zdGF0dXMgPSBtZGlvX3JlYWQoZGV2LCBwaHksIE1JSV9CTVNSKTsKKwkJCWlmIChtaWlfc3RhdHVzICE9IDB4ZmZmZiAgJiYgIG1paV9zdGF0dXMgIT0gMHgwMDAwKSB7CisJCQkJbnAtPnBoeXNbcGh5X2lkeCsrXSA9IHBoeTsKKwkJCQlucC0+bWlpX2lmLmFkdmVydGlzaW5nID0gbWRpb19yZWFkKGRldiwgcGh5LCBNSUlfQURWRVJUSVNFKTsKKwkJCQlpZiAoKG1paV9zdGF0dXMgJiAweDAwNDApID09IDApCisJCQkJCW5wLT5taWlfcHJlYW1ibGVfcmVxdWlyZWQrKzsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTUlJIFBIWSBmb3VuZCBhdCBhZGRyZXNzICVkLCBzdGF0dXMgIgorCQkJCQkgICAiMHglNC40eCBhZHZlcnRpc2luZyAlNC40eC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgcGh5LCBtaWlfc3RhdHVzLCBucC0+bWlpX2lmLmFkdmVydGlzaW5nKTsKKwkJCX0KKwkJfQorCQlucC0+bWlpX3ByZWFtYmxlX3JlcXVpcmVkLS07CisKKwkJaWYgKHBoeV9pZHggPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vIE1JSSB0cmFuc2NlaXZlciBmb3VuZCwgYWJvcnRpbmcuICBBU0lDIHN0YXR1cyAleFxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIGlvcmVhZDMyKGlvYWRkciArIEFTSUNDdHJsKSk7CisJCQlnb3RvIGVycl9vdXRfdW5yZWdpc3RlcjsKKwkJfQorCisJCW5wLT5taWlfaWYucGh5X2lkID0gbnAtPnBoeXNbMF07CisJfQorCisJLyogUGFyc2Ugb3ZlcnJpZGUgY29uZmlndXJhdGlvbiAqLworCW5wLT5hbl9lbmFibGUgPSAxOworCWlmIChjYXJkX2lkeCA8IE1BWF9VTklUUykgeworCQlpZiAobWVkaWFbY2FyZF9pZHhdICE9IE5VTEwpIHsKKwkJCW5wLT5hbl9lbmFibGUgPSAwOworCQkJaWYgKHN0cmNtcCAobWVkaWFbY2FyZF9pZHhdLCAiMTAwbWJwc19mZCIpID09IDAgfHwKKwkJCSAgICBzdHJjbXAgKG1lZGlhW2NhcmRfaWR4XSwgIjQiKSA9PSAwKSB7CisJCQkJbnAtPnNwZWVkID0gMTAwOworCQkJCW5wLT5taWlfaWYuZnVsbF9kdXBsZXggPSAxOworCQkJfSBlbHNlIGlmIChzdHJjbXAgKG1lZGlhW2NhcmRfaWR4XSwgIjEwMG1icHNfaGQiKSA9PSAwCisJCQkJICAgfHwgc3RyY21wIChtZWRpYVtjYXJkX2lkeF0sICIzIikgPT0gMCkgeworCQkJCW5wLT5zcGVlZCA9IDEwMDsKKwkJCQlucC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gMDsKKwkJCX0gZWxzZSBpZiAoc3RyY21wIChtZWRpYVtjYXJkX2lkeF0sICIxMG1icHNfZmQiKSA9PSAwIHx8CisJCQkJICAgc3RyY21wIChtZWRpYVtjYXJkX2lkeF0sICIyIikgPT0gMCkgeworCQkJCW5wLT5zcGVlZCA9IDEwOworCQkJCW5wLT5taWlfaWYuZnVsbF9kdXBsZXggPSAxOworCQkJfSBlbHNlIGlmIChzdHJjbXAgKG1lZGlhW2NhcmRfaWR4XSwgIjEwbWJwc19oZCIpID09IDAgfHwKKwkJCQkgICBzdHJjbXAgKG1lZGlhW2NhcmRfaWR4XSwgIjEiKSA9PSAwKSB7CisJCQkJbnAtPnNwZWVkID0gMTA7CisJCQkJbnAtPm1paV9pZi5mdWxsX2R1cGxleCA9IDA7CisJCQl9IGVsc2UgeworCQkJCW5wLT5hbl9lbmFibGUgPSAxOworCQkJfQorCQl9CisJCWlmIChmbG93Y3RybCA9PSAxKQorCQkJbnAtPmZsb3djdHJsID0gMTsKKwl9CisKKwkvKiBGaWJyZSBQSFk/ICovCisJaWYgKGlvcmVhZDMyIChpb2FkZHIgKyBBU0lDQ3RybCkgJiAweDgwKSB7CisJCS8qIERlZmF1bHQgMTAwTWJwcyBGdWxsICovCisJCWlmIChucC0+YW5fZW5hYmxlKSB7CisJCQlucC0+c3BlZWQgPSAxMDA7CisJCQlucC0+bWlpX2lmLmZ1bGxfZHVwbGV4ID0gMTsKKwkJCW5wLT5hbl9lbmFibGUgPSAwOworCQl9CisJfQorCS8qIFJlc2V0IFBIWSAqLworCW1kaW9fd3JpdGUgKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKKwltZGVsYXkgKDMwMCk7CisJLyogSWYgZmxvdyBjb250cm9sIGVuYWJsZWQsIHdlIG5lZWQgdG8gYWR2ZXJ0aXNlIGl0LiovCisJaWYgKG5wLT5mbG93Y3RybCkKKwkJbWRpb193cml0ZSAoZGV2LCBucC0+cGh5c1swXSwgTUlJX0FEVkVSVElTRSwgbnAtPm1paV9pZi5hZHZlcnRpc2luZyB8IDB4MDQwMCk7CisJbWRpb193cml0ZSAoZGV2LCBucC0+cGh5c1swXSwgTUlJX0JNQ1IsIEJNQ1JfQU5FTkFCTEV8Qk1DUl9BTlJFU1RBUlQpOworCS8qIEZvcmNlIG1lZGlhIHR5cGUgKi8KKwlpZiAoIW5wLT5hbl9lbmFibGUpIHsKKwkJbWlpX2N0bCA9IDA7CisJCW1paV9jdGwgfD0gKG5wLT5zcGVlZCA9PSAxMDApID8gQk1DUl9TUEVFRDEwMCA6IDA7CisJCW1paV9jdGwgfD0gKG5wLT5taWlfaWYuZnVsbF9kdXBsZXgpID8gQk1DUl9GVUxMRFBMWCA6IDA7CisJCW1kaW9fd3JpdGUgKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9CTUNSLCBtaWlfY3RsKTsKKwkJcHJpbnRrIChLRVJOX0lORk8gIk92ZXJyaWRlIHNwZWVkPSVkLCAlcyBkdXBsZXhcbiIsCisJCQlucC0+c3BlZWQsIG5wLT5taWlfaWYuZnVsbF9kdXBsZXggPyAiRnVsbCIgOiAiSGFsZiIpOworCisJfQorCisJLyogUGVyaGFwcyBtb3ZlIHRoZSByZXNldCBoZXJlPyAqLworCS8qIFJlc2V0IHRoZSBjaGlwIHRvIGVyYXNlIHByZXZpb3VzIG1pc2NvbmZpZ3VyYXRpb24uICovCisJaWYgKG5ldGlmX21zZ19odyhucCkpCisJCXByaW50aygiQVNJQyBDb250cm9sIGlzICV4LlxuIiwgaW9yZWFkMzIoaW9hZGRyICsgQVNJQ0N0cmwpKTsKKwlpb3dyaXRlMTYoMHgwMDdmLCBpb2FkZHIgKyBBU0lDQ3RybCArIDIpOworCWlmIChuZXRpZl9tc2dfaHcobnApKQorCQlwcmludGsoIkFTSUMgQ29udHJvbCBpcyBub3cgJXguXG4iLCBpb3JlYWQzMihpb2FkZHIgKyBBU0lDQ3RybCkpOworCisJY2FyZF9pZHgrKzsKKwlyZXR1cm4gMDsKKworZXJyX291dF91bnJlZ2lzdGVyOgorCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CitlcnJfb3V0X3VubWFwX3J4OgorICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFJYX1RPVEFMX1NJWkUsIG5wLT5yeF9yaW5nLCBucC0+cnhfcmluZ19kbWEpOworZXJyX291dF91bm1hcF90eDoKKyAgICAgICAgcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBUWF9UT1RBTF9TSVpFLCBucC0+dHhfcmluZywgbnAtPnR4X3JpbmdfZG1hKTsKK2Vycl9vdXRfY2xlYXJkZXY6CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXBjaV9pb3VubWFwKHBkZXYsIGlvYWRkcik7CitlcnJfb3V0X3JlczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX291dF9uZXRkZXY6CisJZnJlZV9uZXRkZXYgKGRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlpZiAoKG5ld19tdHUgPCA2OCkgfHwgKG5ld19tdHUgPiA4MTkxKSkgLyogU2V0IGJ5IFJ4RE1BRnJhbWVMZW4gKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlkZXYtPm10dSA9IG5ld19tdHU7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgZWVwcm9tX2RlbGF5KGVlX2FkZHIpCWlvcmVhZDMyKGVlX2FkZHIpCisvKiBSZWFkIHRoZSBFRVBST00gYW5kIE1JSSBNYW5hZ2VtZW50IERhdGEgSS9PIChNRElPKSBpbnRlcmZhY2VzLiAqLworc3RhdGljIGludCBfX2RldmluaXQgZWVwcm9tX3JlYWQodm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBsb2NhdGlvbikKK3sKKwlpbnQgYm9ndXNjbnQgPSAxMDAwMDsJCS8qIFR5cGljYWwgMTkwMCB0aWNrcy4gKi8KKwlpb3dyaXRlMTYoMHgwMjAwIHwgKGxvY2F0aW9uICYgMHhmZiksIGlvYWRkciArIEVFQ3RybCk7CisJZG8geworCQllZXByb21fZGVsYXkoaW9hZGRyICsgRUVDdHJsKTsKKwkJaWYgKCEgKGlvcmVhZDE2KGlvYWRkciArIEVFQ3RybCkgJiAweDgwMDApKSB7CisJCQlyZXR1cm4gaW9yZWFkMTYoaW9hZGRyICsgRUVEYXRhKTsKKwkJfQorCX0gd2hpbGUgKC0tYm9ndXNjbnQgPiAwKTsKKwlyZXR1cm4gMDsKK30KKworLyogIE1JSSB0cmFuc2NlaXZlciBjb250cm9sIHNlY3Rpb24uCisJUmVhZCBhbmQgd3JpdGUgdGhlIE1JSSByZWdpc3RlcnMgdXNpbmcgc29mdHdhcmUtZ2VuZXJhdGVkIHNlcmlhbAorCU1ESU8gcHJvdG9jb2wuICBTZWUgdGhlIE1JSSBzcGVjaWZpY2F0aW9ucyBvciBEUDgzODQwQSBkYXRhIHNoZWV0CisJZm9yIGRldGFpbHMuCisKKwlUaGUgbWF4aW11bSBkYXRhIGNsb2NrIHJhdGUgaXMgMi41IE1oei4gIFRoZSBtaW5pbXVtIHRpbWluZyBpcyB1c3VhbGx5CisJbWV0IGJ5IGJhY2stdG8tYmFjayAzM01oeiBQQ0kgY3ljbGVzLiAqLworI2RlZmluZSBtZGlvX2RlbGF5KCkgaW9yZWFkOChtZGlvX2FkZHIpCisKK2VudW0gbWlpX3JlZ19iaXRzIHsKKwlNRElPX1NoaWZ0Q2xrPTB4MDAwMSwgTURJT19EYXRhPTB4MDAwMiwgTURJT19FbmJPdXRwdXQ9MHgwMDA0LAorfTsKKyNkZWZpbmUgTURJT19FbmJJbiAgKDApCisjZGVmaW5lIE1ESU9fV1JJVEUwIChNRElPX0VuYk91dHB1dCkKKyNkZWZpbmUgTURJT19XUklURTEgKE1ESU9fRGF0YSB8IE1ESU9fRW5iT3V0cHV0KQorCisvKiBHZW5lcmF0ZSB0aGUgcHJlYW1ibGUgcmVxdWlyZWQgZm9yIGluaXRpYWwgc3luY2hyb25pemF0aW9uIGFuZAorICAgYSBmZXcgb2xkZXIgdHJhbnNjZWl2ZXJzLiAqLworc3RhdGljIHZvaWQgbWRpb19zeW5jKHZvaWQgX19pb21lbSAqbWRpb19hZGRyKQoreworCWludCBiaXRzID0gMzI7CisKKwkvKiBFc3RhYmxpc2ggc3luYyBieSBzZW5kaW5nIGF0IGxlYXN0IDMyIGxvZ2ljIG9uZXMuICovCisJd2hpbGUgKC0tYml0cyA+PSAwKSB7CisJCWlvd3JpdGU4KE1ESU9fV1JJVEUxLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJCWlvd3JpdGU4KE1ESU9fV1JJVEUxIHwgTURJT19TaGlmdENsaywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KK30KKworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqbWRpb19hZGRyID0gbnAtPmJhc2UgKyBNSUlDdHJsOworCWludCBtaWlfY21kID0gKDB4ZjYgPDwgMTApIHwgKHBoeV9pZCA8PCA1KSB8IGxvY2F0aW9uOworCWludCBpLCByZXR2YWwgPSAwOworCisJaWYgKG5wLT5taWlfcHJlYW1ibGVfcmVxdWlyZWQpCisJCW1kaW9fc3luYyhtZGlvX2FkZHIpOworCisJLyogU2hpZnQgdGhlIHJlYWQgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGRhdGF2YWwgPSAobWlpX2NtZCAmICgxIDw8IGkpKSA/IE1ESU9fV1JJVEUxIDogTURJT19XUklURTA7CisKKwkJaW93cml0ZTgoZGF0YXZhbCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlpb3dyaXRlOChkYXRhdmFsIHwgTURJT19TaGlmdENsaywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwkvKiBSZWFkIHRoZSB0d28gdHJhbnNpdGlvbiwgMTYgZGF0YSwgYW5kIHdpcmUtaWRsZSBiaXRzLiAqLworCWZvciAoaSA9IDE5OyBpID4gMDsgaS0tKSB7CisJCWlvd3JpdGU4KE1ESU9fRW5iSW4sIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW9yZWFkOChtZGlvX2FkZHIpICYgTURJT19EYXRhKSA/IDEgOiAwKTsKKwkJaW93cml0ZTgoTURJT19FbmJJbiB8IE1ESU9fU2hpZnRDbGssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJcmV0dXJuIChyZXR2YWw+PjEpICYgMHhmZmZmOworfQorCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqbWRpb19hZGRyID0gbnAtPmJhc2UgKyBNSUlDdHJsOworCWludCBtaWlfY21kID0gKDB4NTAwMiA8PCAxNikgfCAocGh5X2lkIDw8IDIzKSB8IChsb2NhdGlvbjw8MTgpIHwgdmFsdWU7CisJaW50IGk7CisKKwlpZiAobnAtPm1paV9wcmVhbWJsZV9yZXF1aXJlZCkKKwkJbWRpb19zeW5jKG1kaW9fYWRkcik7CisKKwkvKiBTaGlmdCB0aGUgY29tbWFuZCBiaXRzIG91dC4gKi8KKwlmb3IgKGkgPSAzMTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IGRhdGF2YWwgPSAobWlpX2NtZCAmICgxIDw8IGkpKSA/IE1ESU9fV1JJVEUxIDogTURJT19XUklURTA7CisKKwkJaW93cml0ZTgoZGF0YXZhbCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlpb3dyaXRlOChkYXRhdmFsIHwgTURJT19TaGlmdENsaywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwkvKiBDbGVhciBvdXQgZXh0cmEgYml0cy4gKi8KKwlmb3IgKGkgPSAyOyBpID4gMDsgaS0tKSB7CisJCWlvd3JpdGU4KE1ESU9fRW5iSW4sIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJaW93cml0ZTgoTURJT19FbmJJbiB8IE1ESU9fU2hpZnRDbGssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IG5ldGRldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZTsKKwlpbnQgaTsKKworCS8qIERvIHdlIG5lZWQgdG8gcmVzZXQgdGhlIGNoaXA/Pz8gKi8KKworCWkgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJmludHJfaGFuZGxlciwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAoaSkKKwkJcmV0dXJuIGk7CisKKwlpZiAobmV0aWZfbXNnX2lmdXAobnApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG5ldGRldl9vcGVuKCkgaXJxICVkLlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCWluaXRfcmluZyhkZXYpOworCisJaW93cml0ZTMyKG5wLT5yeF9yaW5nX2RtYSwgaW9hZGRyICsgUnhMaXN0UHRyKTsKKwkvKiBUaGUgVHggbGlzdCBwb2ludGVyIGlzIHdyaXR0ZW4gYXMgcGFja2V0cyBhcmUgcXVldWVkLiAqLworCisJLyogSW5pdGlhbGl6ZSBvdGhlciByZWdpc3RlcnMuICovCisJX19zZXRfbWFjX2FkZHIoZGV2KTsKKyNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKKwlpb3dyaXRlMTYoZGV2LT5tdHUgKyAxOCwgaW9hZGRyICsgTWF4RnJhbWVTaXplKTsKKyNlbHNlCisJaW93cml0ZTE2KGRldi0+bXR1ICsgMTQsIGlvYWRkciArIE1heEZyYW1lU2l6ZSk7CisjZW5kaWYKKwlpZiAoZGV2LT5tdHUgPiAyMDQ3KQorCQlpb3dyaXRlMzIoaW9yZWFkMzIoaW9hZGRyICsgQVNJQ0N0cmwpIHwgMHgwQywgaW9hZGRyICsgQVNJQ0N0cmwpOworCisJLyogQ29uZmlndXJlIHRoZSBQQ0kgYnVzIGJ1cnN0cyBhbmQgRklGTyB0aHJlc2hvbGRzLiAqLworCisJaWYgKGRldi0+aWZfcG9ydCA9PSAwKQorCQlkZXYtPmlmX3BvcnQgPSBucC0+ZGVmYXVsdF9wb3J0OworCisJc3Bpbl9sb2NrX2luaXQoJm5wLT5tY2FzdGxvY2spOworCisJc2V0X3J4X21vZGUoZGV2KTsKKwlpb3dyaXRlMTYoMCwgaW9hZGRyICsgSW50ckVuYWJsZSk7CisJaW93cml0ZTE2KDAsIGlvYWRkciArIERvd25Db3VudGVyKTsKKwkvKiBTZXQgdGhlIGNoaXAgdG8gcG9sbCBldmVyeSBOKjMyMG5zZWMuICovCisJaW93cml0ZTgoMTAwLCBpb2FkZHIgKyBSeERNQVBvbGxQZXJpb2QpOworCWlvd3JpdGU4KDEyNywgaW9hZGRyICsgVHhETUFQb2xsUGVyaW9kKTsKKwkvKiBGaXggREZFLTU4MFRYIHBhY2tldCBkcm9wIGlzc3VlICovCisJaWYgKG5wLT5wY2lfcmV2X2lkID49IDB4MTQpCisJCWlvd3JpdGU4KDB4MDEsIGlvYWRkciArIERlYnVnQ3RybDEpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlpb3dyaXRlMTYgKFN0YXRzRW5hYmxlIHwgUnhFbmFibGUgfCBUeEVuYWJsZSwgaW9hZGRyICsgTUFDQ3RybDEpOworCisJaWYgKG5ldGlmX21zZ19pZnVwKG5wKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBEb25lIG5ldGRldl9vcGVuKCksIHN0YXR1czogUnggJXggVHggJXggIgorCQkJICAgIk1BQyBDb250cm9sICV4LCAlNC40eCAlNC40eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGlvcmVhZDMyKGlvYWRkciArIFJ4U3RhdHVzKSwgaW9yZWFkOChpb2FkZHIgKyBUeFN0YXR1cyksCisJCQkgICBpb3JlYWQzMihpb2FkZHIgKyBNQUNDdHJsMCksCisJCQkgICBpb3JlYWQxNihpb2FkZHIgKyBNQUNDdHJsMSksIGlvcmVhZDE2KGlvYWRkciArIE1BQ0N0cmwwKSk7CisKKwkvKiBTZXQgdGhlIHRpbWVyIHRvIGNoZWNrIGZvciBsaW5rIGJlYXQuICovCisJaW5pdF90aW1lcigmbnAtPnRpbWVyKTsKKwlucC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAzKkhaOworCW5wLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCW5wLT50aW1lci5mdW5jdGlvbiA9ICZuZXRkZXZfdGltZXI7CQkJCS8qIHRpbWVyIGhhbmRsZXIgKi8KKwlhZGRfdGltZXIoJm5wLT50aW1lcik7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBieSBzZXR0aW5nIHRoZSBpbnRlcnJ1cHQgbWFzay4gKi8KKwlpb3dyaXRlMTYoREVGQVVMVF9JTlRSLCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjaGVja19kdXBsZXgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlOworCWludCBtaWlfbHBhID0gbWRpb19yZWFkKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9MUEEpOworCWludCBuZWdvdGlhdGVkID0gbWlpX2xwYSAmIG5wLT5taWlfaWYuYWR2ZXJ0aXNpbmc7CisJaW50IGR1cGxleDsKKworCS8qIEZvcmNlIG1lZGlhICovCisJaWYgKCFucC0+YW5fZW5hYmxlIHx8IG1paV9scGEgPT0gMHhmZmZmKSB7CisJCWlmIChucC0+bWlpX2lmLmZ1bGxfZHVwbGV4KQorCQkJaW93cml0ZTE2IChpb3JlYWQxNiAoaW9hZGRyICsgTUFDQ3RybDApIHwgRW5iRnVsbER1cGxleCwKKwkJCQlpb2FkZHIgKyBNQUNDdHJsMCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBBdXRvbmVnb3RpYXRpb24gKi8KKwlkdXBsZXggPSAobmVnb3RpYXRlZCAmIDB4MDEwMCkgfHwgKG5lZ290aWF0ZWQgJiAweDAxQzApID09IDB4MDA0MDsKKwlpZiAobnAtPm1paV9pZi5mdWxsX2R1cGxleCAhPSBkdXBsZXgpIHsKKwkJbnAtPm1paV9pZi5mdWxsX2R1cGxleCA9IGR1cGxleDsKKwkJaWYgKG5ldGlmX21zZ19saW5rKG5wKSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTZXR0aW5nICVzLWR1cGxleCBiYXNlZCBvbiBNSUkgIyVkICIKKwkJCQkgICAibmVnb3RpYXRlZCBjYXBhYmlsaXR5ICU0LjR4LlxuIiwgZGV2LT5uYW1lLAorCQkJCSAgIGR1cGxleCA/ICJmdWxsIiA6ICJoYWxmIiwgbnAtPnBoeXNbMF0sIG5lZ290aWF0ZWQpOworCQlpb3dyaXRlMTYoaW9yZWFkMTYoaW9hZGRyICsgTUFDQ3RybDApIHwgZHVwbGV4ID8gMHgyMCA6IDAsIGlvYWRkciArIE1BQ0N0cmwwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZTsKKwlpbnQgbmV4dF90aWNrID0gMTAqSFo7CisKKwlpZiAobmV0aWZfbXNnX3RpbWVyKG5wKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1lZGlhIHNlbGVjdGlvbiB0aW1lciB0aWNrLCBpbnRyIHN0YXR1cyAlNC40eCwgIgorCQkJICAgIlR4ICV4IFJ4ICV4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW9yZWFkMTYoaW9hZGRyICsgSW50ckVuYWJsZSksCisJCQkgICBpb3JlYWQ4KGlvYWRkciArIFR4U3RhdHVzKSwgaW9yZWFkMzIoaW9hZGRyICsgUnhTdGF0dXMpKTsKKwl9CisJY2hlY2tfZHVwbGV4KGRldik7CisJbnAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbmV4dF90aWNrOworCWFkZF90aW1lcigmbnAtPnRpbWVyKTsKK30KKworc3RhdGljIHZvaWQgdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2U7CisJdW5zaWduZWQgbG9uZyBmbGFnOworCQorCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl0YXNrbGV0X2Rpc2FibGUoJm5wLT50eF90YXNrbGV0KTsKKwlpb3dyaXRlMTYoMCwgaW9hZGRyICsgSW50ckVuYWJsZSk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRyYW5zbWl0IHRpbWVkIG91dCwgVHhTdGF0dXMgJTIuMnggIgorCQkgICAiVHhGcmFtZUlkICUyLjJ4LCIKKwkJICAgIiByZXNldHRpbmcuLi5cbiIsIGRldi0+bmFtZSwgaW9yZWFkOChpb2FkZHIgKyBUeFN0YXR1cyksCisJCSAgIGlvcmVhZDgoaW9hZGRyICsgVHhGcmFtZUlkKSk7CisKKwl7CisJCWludCBpOworCQlmb3IgKGk9MDsgaTxUWF9SSU5HX1NJWkU7IGkrKykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiUwMnggJTA4bGx4ICUwOHggJTA4eCglMDJ4KSAlMDh4ICUwOHhcbiIsIGksCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykobnAtPnR4X3JpbmdfZG1hICsgaSpzaXplb2YoKm5wLT50eF9yaW5nKSksCisJCQkJbGUzMl90b19jcHUobnAtPnR4X3JpbmdbaV0ubmV4dF9kZXNjKSwKKwkJCQlsZTMyX3RvX2NwdShucC0+dHhfcmluZ1tpXS5zdGF0dXMpLAorCQkJCShsZTMyX3RvX2NwdShucC0+dHhfcmluZ1tpXS5zdGF0dXMpID4+IDIpICYgMHhmZiwKKwkJCQlsZTMyX3RvX2NwdShucC0+dHhfcmluZ1tpXS5mcmFnWzBdLmFkZHIpLCAKKwkJCQlsZTMyX3RvX2NwdShucC0+dHhfcmluZ1tpXS5mcmFnWzBdLmxlbmd0aCkpOworCQl9CisJCXByaW50ayhLRVJOX0RFQlVHICJUeExpc3RQdHI9JTA4eCBuZXRpZl9xdWV1ZV9zdG9wcGVkPSVkXG4iLCAKKwkJCWlvcmVhZDMyKG5wLT5iYXNlICsgVHhMaXN0UHRyKSwgCisJCQluZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpOworCQlwcmludGsoS0VSTl9ERUJVRyAiY3VyX3R4PSVkKCUwMngpIGRpcnR5X3R4PSVkKCUwMngpXG4iLCAKKwkJCW5wLT5jdXJfdHgsIG5wLT5jdXJfdHggJSBUWF9SSU5HX1NJWkUsCisJCQlucC0+ZGlydHlfdHgsIG5wLT5kaXJ0eV90eCAlIFRYX1JJTkdfU0laRSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJjdXJfcng9JWQgZGlydHlfcng9JWRcbiIsIG5wLT5jdXJfcngsIG5wLT5kaXJ0eV9yeCk7CisJCXByaW50ayhLRVJOX0RFQlVHICJjdXJfdGFzaz0lZFxuIiwgbnAtPmN1cl90YXNrKTsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJm5wLT5sb2NrLCBmbGFnKTsKKworCS8qIFN0b3AgYW5kIHJlc3RhcnQgdGhlIGNoaXAncyBUeCBwcm9jZXNzZXMgLiAqLworCXJlc2V0X3R4KGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnAtPmxvY2ssIGZsYWcpOworCisJZGV2LT5pZl9wb3J0ID0gMDsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5wLT5zdGF0cy50eF9lcnJvcnMrKzsKKwlpZiAobnAtPmN1cl90eCAtIG5wLT5kaXJ0eV90eCA8IFRYX1FVRVVFX0xFTiAtIDQpIHsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKwlpb3dyaXRlMTYoREVGQVVMVF9JTlRSLCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKwl0YXNrbGV0X2VuYWJsZSgmbnAtPnR4X3Rhc2tsZXQpOworfQorCisKKy8qIEluaXRpYWxpemUgdGhlIFJ4IGFuZCBUeCByaW5ncywgYWxvbmcgd2l0aCB2YXJpb3VzICdkZXYnIGJpdHMuICovCitzdGF0aWMgdm9pZCBpbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCW5wLT5jdXJfcnggPSBucC0+Y3VyX3R4ID0gMDsKKwlucC0+ZGlydHlfcnggPSBucC0+ZGlydHlfdHggPSAwOworCW5wLT5jdXJfdGFzayA9IDA7CisKKwlucC0+cnhfYnVmX3N6ID0gKGRldi0+bXR1IDw9IDE1MjAgPyBQS1RfQlVGX1NaIDogZGV2LT5tdHUgKyAxNik7CisKKwkvKiBJbml0aWFsaXplIGFsbCBSeCBkZXNjcmlwdG9ycy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJbnAtPnJ4X3JpbmdbaV0ubmV4dF9kZXNjID0gY3B1X3RvX2xlMzIobnAtPnJ4X3JpbmdfZG1hICsKKwkJCSgoaSsxKSVSWF9SSU5HX1NJWkUpKnNpemVvZigqbnAtPnJ4X3JpbmcpKTsKKwkJbnAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gMDsKKwkJbnAtPnJ4X3JpbmdbaV0uZnJhZ1swXS5sZW5ndGggPSAwOworCQlucC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwl9CisKKwkvKiBGaWxsIGluIHRoZSBSeCBidWZmZXJzLiAgSGFuZGxlIGFsbG9jYXRpb24gZmFpbHVyZSBncmFjZWZ1bGx5LiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYihucC0+cnhfYnVmX3N6KTsKKwkJbnAtPnJ4X3NrYnVmZltpXSA9IHNrYjsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJYnJlYWs7CisJCXNrYi0+ZGV2ID0gZGV2OwkJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLworCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIuICovCisJCW5wLT5yeF9yaW5nW2ldLmZyYWdbMF0uYWRkciA9IGNwdV90b19sZTMyKAorCQkJcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsIHNrYi0+dGFpbCwgbnAtPnJ4X2J1Zl9zeiwKKwkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKKwkJbnAtPnJ4X3JpbmdbaV0uZnJhZ1swXS5sZW5ndGggPSBjcHVfdG9fbGUzMihucC0+cnhfYnVmX3N6IHwgTGFzdEZyYWcpOworCX0KKwlucC0+ZGlydHlfcnggPSAodW5zaWduZWQgaW50KShpIC0gUlhfUklOR19TSVpFKTsKKworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlucC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJbnAtPnR4X3JpbmdbaV0uc3RhdHVzID0gMDsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCB0eF9wb2xsICh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaGVhZCA9IG5wLT5jdXJfdGFzayAlIFRYX1JJTkdfU0laRTsKKwlzdHJ1Y3QgbmV0ZGV2X2Rlc2MgKnR4ZGVzYyA9IAorCQkmbnAtPnR4X3JpbmdbKG5wLT5jdXJfdHggLSAxKSAlIFRYX1JJTkdfU0laRV07CisJCisJLyogQ2hhaW4gdGhlIG5leHQgcG9pbnRlciAqLworCWZvciAoOyBucC0+Y3VyX3R4IC0gbnAtPmN1cl90YXNrID4gMDsgbnAtPmN1cl90YXNrKyspIHsKKwkJaW50IGVudHJ5ID0gbnAtPmN1cl90YXNrICUgVFhfUklOR19TSVpFOworCQl0eGRlc2MgPSAmbnAtPnR4X3JpbmdbZW50cnldOworCQlpZiAobnAtPmxhc3RfdHgpIHsKKwkJCW5wLT5sYXN0X3R4LT5uZXh0X2Rlc2MgPSBjcHVfdG9fbGUzMihucC0+dHhfcmluZ19kbWEgKworCQkJCWVudHJ5KnNpemVvZihzdHJ1Y3QgbmV0ZGV2X2Rlc2MpKTsKKwkJfQorCQlucC0+bGFzdF90eCA9IHR4ZGVzYzsKKwl9CisJLyogSW5kaWNhdGUgdGhlIGxhdGVzdCBkZXNjcmlwdG9yIG9mIHR4IHJpbmcgKi8KKwl0eGRlc2MtPnN0YXR1cyB8PSBjcHVfdG9fbGUzMihEZXNjSW50ck9uVHgpOworCisJaWYgKGlvcmVhZDMyIChucC0+YmFzZSArIFR4TGlzdFB0cikgPT0gMCkKKwkJaW93cml0ZTMyIChucC0+dHhfcmluZ19kbWEgKyBoZWFkICogc2l6ZW9mKHN0cnVjdCBuZXRkZXZfZGVzYyksCisJCQlucC0+YmFzZSArIFR4TGlzdFB0cik7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50CitzdGFydF90eCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0ZGV2X2Rlc2MgKnR4ZGVzYzsKKwl1bnNpZ25lZCBlbnRyeTsKKworCS8qIENhbGN1bGF0ZSB0aGUgbmV4dCBUeCBkZXNjcmlwdG9yIGVudHJ5LiAqLworCWVudHJ5ID0gbnAtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKKwlucC0+dHhfc2tidWZmW2VudHJ5XSA9IHNrYjsKKwl0eGRlc2MgPSAmbnAtPnR4X3JpbmdbZW50cnldOworCisJdHhkZXNjLT5uZXh0X2Rlc2MgPSAwOworCXR4ZGVzYy0+c3RhdHVzID0gY3B1X3RvX2xlMzIgKChlbnRyeSA8PCAyKSB8IERpc2FibGVBbGlnbik7CisJdHhkZXNjLT5mcmFnWzBdLmFkZHIgPSBjcHVfdG9fbGUzMiAocGNpX21hcF9zaW5nbGUgKG5wLT5wY2lfZGV2LCBza2ItPmRhdGEsCisJCQkJCQkJc2tiLT5sZW4sCisJCQkJCQkJUENJX0RNQV9UT0RFVklDRSkpOworCXR4ZGVzYy0+ZnJhZ1swXS5sZW5ndGggPSBjcHVfdG9fbGUzMiAoc2tiLT5sZW4gfCBMYXN0RnJhZyk7CisKKwkvKiBJbmNyZW1lbnQgY3VyX3R4IGJlZm9yZSB0YXNrbGV0X3NjaGVkdWxlKCkgKi8KKwlucC0+Y3VyX3R4Kys7CisJbWIoKTsKKwkvKiBTY2hlZHVsZSBhIHR4X3BvbGwoKSB0YXNrICovCisJdGFza2xldF9zY2hlZHVsZSgmbnAtPnR4X3Rhc2tsZXQpOworCisJLyogT24gc29tZSBhcmNoaXRlY3R1cmVzOiBleHBsaWNpdGx5IGZsdXNoIGNhY2hlIGxpbmVzIGhlcmUuICovCisJaWYgKG5wLT5jdXJfdHggLSBucC0+ZGlydHlfdHggPCBUWF9RVUVVRV9MRU4gLSAxCisJCQkmJiAhbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7CisJCS8qIGRvIG5vdGhpbmcgKi8KKwl9IGVsc2UgeworCQluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCX0KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlpZiAobmV0aWZfbXNnX3R4X3F1ZXVlZChucCkpIHsKKwkJcHJpbnRrIChLRVJOX0RFQlVHCisJCQkiJXM6IFRyYW5zbWl0IGZyYW1lICMlZCBxdWV1ZWQgaW4gc2xvdCAlZC5cbiIsCisJCQlkZXYtPm5hbWUsIG5wLT5jdXJfdHgsIGVudHJ5KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFJlc2V0IGhhcmR3YXJlIHR4IGFuZCBmcmVlIGFsbCBvZiB0eCBidWZmZXJzICovCitzdGF0aWMgaW50CityZXNldF90eCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGk7CisJaW50IGlycSA9IGluX2ludGVycnVwdCgpOworCQorCS8qIFJlc2V0IHR4IGxvZ2ljLCBUeExpc3RQdHIgd2lsbCBiZSBjbGVhbmVkICovCisJaW93cml0ZTE2IChUeERpc2FibGUsIGlvYWRkciArIE1BQ0N0cmwxKTsKKwlpb3dyaXRlMTYgKFR4UmVzZXQgfCBETUFSZXNldCB8IEZJRk9SZXNldCB8IE5ldHdvcmtSZXNldCwKKwkJCWlvYWRkciArIEFTSUNDdHJsICsgMik7CisJZm9yIChpPTUwOyBpID4gMDsgaS0tKSB7CisJCWlmICgoaW9yZWFkMTYoaW9hZGRyICsgQVNJQ0N0cmwgKyAyKSAmIFJlc2V0QnVzeSkgPT0gMCkKKwkJCWJyZWFrOworCQltZGVsYXkoMSk7CisJfQorCS8qIGZyZWUgYWxsIHR4IHNrYnVmZiAqLworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlza2IgPSBucC0+dHhfc2tidWZmW2ldOworCQlpZiAoc2tiKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCAKKwkJCQlucC0+dHhfcmluZ1tpXS5mcmFnWzBdLmFkZHIsIHNrYi0+bGVuLAorCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQkJaWYgKGlycSkKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycSAoc2tiKTsKKwkJCWVsc2UKKwkJCQlkZXZfa2ZyZWVfc2tiIChza2IpOworCQkJbnAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJCQlucC0+c3RhdHMudHhfZHJvcHBlZCsrOworCQl9CisJfQorCW5wLT5jdXJfdHggPSBucC0+ZGlydHlfdHggPSAwOworCW5wLT5jdXJfdGFzayA9IDA7CisJaW93cml0ZTE2IChTdGF0c0VuYWJsZSB8IFJ4RW5hYmxlIHwgVHhFbmFibGUsIGlvYWRkciArIE1BQ0N0cmwxKTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIGludGVycnVwdCBoYW5kbGVyIGNsZWFucyB1cCBhZnRlciB0aGUgVHggdGhyZWFkLCAKKyAgIGFuZCBzY2hlZHVsZSBhIFJ4IHRocmVhZCB3b3JrICovCitzdGF0aWMgaXJxcmV0dXJuX3QgaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2luc3RhbmNlOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2U7CisJaW50IGh3X2ZyYW1lX2lkOworCWludCB0eF9jbnQ7CisJaW50IHR4X3N0YXR1czsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKworCWRvIHsKKwkJaW50IGludHJfc3RhdHVzID0gaW9yZWFkMTYoaW9hZGRyICsgSW50clN0YXR1cyk7CisJCWlvd3JpdGUxNihpbnRyX3N0YXR1cywgaW9hZGRyICsgSW50clN0YXR1cyk7CisKKwkJaWYgKG5ldGlmX21zZ19pbnRyKG5wKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogSW50ZXJydXB0LCBzdGF0dXMgJTQuNHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgaW50cl9zdGF0dXMpOworCisJCWlmICghKGludHJfc3RhdHVzICYgREVGQVVMVF9JTlRSKSkKKwkJCWJyZWFrOworCisJCWhhbmRsZWQgPSAxOworCisJCWlmIChpbnRyX3N0YXR1cyAmIChJbnRyUnhETUFEb25lKSkgeworCQkJaW93cml0ZTE2KERFRkFVTFRfSU5UUiAmIH4oSW50clJ4RG9uZXxJbnRyUnhETUFEb25lKSwKKwkJCQkJaW9hZGRyICsgSW50ckVuYWJsZSk7CisJCQlpZiAobnAtPmJ1ZGdldCA8IDApCisJCQkJbnAtPmJ1ZGdldCA9IFJYX0JVREdFVDsKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJm5wLT5yeF90YXNrbGV0KTsKKwkJfQorCQlpZiAoaW50cl9zdGF0dXMgJiAoSW50clR4RG9uZSB8IEludHJEcnZScXN0KSkgeworCQkJdHhfc3RhdHVzID0gaW9yZWFkMTYgKGlvYWRkciArIFR4U3RhdHVzKTsKKwkJCWZvciAodHhfY250PTMyOyB0eF9zdGF0dXMgJiAweDgwOyAtLXR4X2NudCkgeworCQkJCWlmIChuZXRpZl9tc2dfdHhfZG9uZShucCkpCisJCQkJCXByaW50aworCQkJCQkgICAgKCIlczogVHJhbnNtaXQgc3RhdHVzIGlzICUyLjJ4LlxuIiwKKwkJCQkgICAgIAlkZXYtPm5hbWUsIHR4X3N0YXR1cyk7CisJCQkJaWYgKHR4X3N0YXR1cyAmIDB4MWUpIHsKKwkJCQkJbnAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJCQlpZiAodHhfc3RhdHVzICYgMHgxMCkKKwkJCQkJCW5wLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJCQlpZiAodHhfc3RhdHVzICYgMHgwOCkKKwkJCQkJCW5wLT5zdGF0cy5jb2xsaXNpb25zKys7CisJCQkJCWlmICh0eF9zdGF0dXMgJiAweDAyKQorCQkJCQkJbnAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJCQkJLyogVGhpcyByZXNldCBoYXMgbm90IGJlZW4gdmVyaWZpZWQhLiAqLworCQkJCQlpZiAodHhfc3RhdHVzICYgMHgxMCkgewkvKiBSZXNldCB0aGUgVHguICovCisJCQkJCQlucC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQkJCXNwaW5fbG9jaygmbnAtPmxvY2spOworCQkJCQkJcmVzZXRfdHgoZGV2KTsKKwkJCQkJCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7CisJCQkJCX0KKwkJCQkJaWYgKHR4X3N0YXR1cyAmIDB4MWUpCS8qIFJlc3RhcnQgdGhlIFR4LiAqLworCQkJCQkJaW93cml0ZTE2IChUeEVuYWJsZSwKKwkJCQkJCQlpb2FkZHIgKyBNQUNDdHJsMSk7CisJCQkJfQorCQkJCS8qIFl1cCwgdGhpcyBpcyBhIGRvY3VtZW50YXRpb24gYnVnLiAgSXQgY29zdCBtZSAqaG91cnMqLiAqLworCQkJCWlvd3JpdGUxNiAoMCwgaW9hZGRyICsgVHhTdGF0dXMpOworCQkJCWlmICh0eF9jbnQgPCAwKSB7CisJCQkJCWlvd3JpdGUzMig1MDAwLCBpb2FkZHIgKyBEb3duQ291bnRlcik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQl0eF9zdGF0dXMgPSBpb3JlYWQxNiAoaW9hZGRyICsgVHhTdGF0dXMpOworCQkJfQorCQkJaHdfZnJhbWVfaWQgPSAodHhfc3RhdHVzID4+IDgpICYgMHhmZjsKKwkJfSBlbHNlIAl7CisJCQlod19mcmFtZV9pZCA9IGlvcmVhZDgoaW9hZGRyICsgVHhGcmFtZUlkKTsKKwkJfQorCQkJCisJCWlmIChucC0+cGNpX3Jldl9pZCA+PSAweDE0KSB7CQorCQkJc3Bpbl9sb2NrKCZucC0+bG9jayk7CisJCQlmb3IgKDsgbnAtPmN1cl90eCAtIG5wLT5kaXJ0eV90eCA+IDA7IG5wLT5kaXJ0eV90eCsrKSB7CisJCQkJaW50IGVudHJ5ID0gbnAtPmRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworCQkJCXN0cnVjdCBza19idWZmICpza2I7CisJCQkJaW50IHN3X2ZyYW1lX2lkOworCQkJCXN3X2ZyYW1lX2lkID0gKGxlMzJfdG9fY3B1KAorCQkJCQlucC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzKSA+PiAyKSAmIDB4ZmY7CisJCQkJaWYgKHN3X2ZyYW1lX2lkID09IGh3X2ZyYW1lX2lkICYmCisJCQkJCSEobGUzMl90b19jcHUobnAtPnR4X3JpbmdbZW50cnldLnN0YXR1cykKKwkJCQkJJiAweDAwMDEwMDAwKSkKKwkJCQkJCWJyZWFrOworCQkJCWlmIChzd19mcmFtZV9pZCA9PSAoaHdfZnJhbWVfaWQgKyAxKSAlIAorCQkJCQlUWF9SSU5HX1NJWkUpCisJCQkJCQlicmVhazsKKwkJCQlza2IgPSBucC0+dHhfc2tidWZmW2VudHJ5XTsKKwkJCQkvKiBGcmVlIHRoZSBvcmlnaW5hbCBza2IuICovCisJCQkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldiwKKwkJCQkJbnAtPnR4X3JpbmdbZW50cnldLmZyYWdbMF0uYWRkciwKKwkJCQkJc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCWRldl9rZnJlZV9za2JfaXJxIChucC0+dHhfc2tidWZmW2VudHJ5XSk7CisJCQkJbnAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJCW5wLT50eF9yaW5nW2VudHJ5XS5mcmFnWzBdLmFkZHIgPSAwOworCQkJCW5wLT50eF9yaW5nW2VudHJ5XS5mcmFnWzBdLmxlbmd0aCA9IDA7CisJCQl9CisJCQlzcGluX3VubG9jaygmbnAtPmxvY2spOworCQl9IGVsc2UgeworCQkJc3Bpbl9sb2NrKCZucC0+bG9jayk7CisJCQlmb3IgKDsgbnAtPmN1cl90eCAtIG5wLT5kaXJ0eV90eCA+IDA7IG5wLT5kaXJ0eV90eCsrKSB7CisJCQkJaW50IGVudHJ5ID0gbnAtPmRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworCQkJCXN0cnVjdCBza19idWZmICpza2I7CisJCQkJaWYgKCEobGUzMl90b19jcHUobnAtPnR4X3JpbmdbZW50cnldLnN0YXR1cykgCisJCQkJCQkJJiAweDAwMDEwMDAwKSkKKwkJCQkJYnJlYWs7CisJCQkJc2tiID0gbnAtPnR4X3NrYnVmZltlbnRyeV07CisJCQkJLyogRnJlZSB0aGUgb3JpZ2luYWwgc2tiLiAqLworCQkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsCisJCQkJCW5wLT50eF9yaW5nW2VudHJ5XS5mcmFnWzBdLmFkZHIsCisJCQkJCXNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycSAobnAtPnR4X3NrYnVmZltlbnRyeV0pOworCQkJCW5wLT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJCQlucC0+dHhfcmluZ1tlbnRyeV0uZnJhZ1swXS5hZGRyID0gMDsKKwkJCQlucC0+dHhfcmluZ1tlbnRyeV0uZnJhZ1swXS5sZW5ndGggPSAwOworCQkJfQorCQkJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKKwkJfQorCQkKKwkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJgorCQkJbnAtPmN1cl90eCAtIG5wLT5kaXJ0eV90eCA8IFRYX1FVRVVFX0xFTiAtIDQpIHsKKwkJCS8qIFRoZSByaW5nIGlzIG5vIGxvbmdlciBmdWxsLCBjbGVhciBidXN5IGZsYWcuICovCisJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCQl9CisJCS8qIEFibm9ybWFsIGVycm9yIHN1bW1hcnkvdW5jb21tb24gZXZlbnRzIGhhbmRsZXJzLiAqLworCQlpZiAoaW50cl9zdGF0dXMgJiAoSW50clBDSUVyciB8IExpbmtDaGFuZ2UgfCBTdGF0c01heCkpCisJCQluZXRkZXZfZXJyb3IoZGV2LCBpbnRyX3N0YXR1cyk7CisJfSB3aGlsZSAoMCk7CisJaWYgKG5ldGlmX21zZ19pbnRyKG5wKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleGl0aW5nIGludGVycnVwdCwgc3RhdHVzPSUjNC40eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGlvcmVhZDE2KGlvYWRkciArIEludHJTdGF0dXMpKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIHZvaWQgcnhfcG9sbCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5ID0gbnAtPmN1cl9yeCAlIFJYX1JJTkdfU0laRTsKKwlpbnQgYm9ndXNjbnQgPSBucC0+YnVkZ2V0OworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2U7CisJaW50IHJlY2VpdmVkID0gMDsKKworCS8qIElmIEVPUCBpcyBzZXQgb24gdGhlIG5leHQgZW50cnksIGl0J3MgYSBuZXcgcGFja2V0LiBTZW5kIGl0IHVwLiAqLworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBuZXRkZXZfZGVzYyAqZGVzYyA9ICYobnAtPnJ4X3JpbmdbZW50cnldKTsKKwkJdTMyIGZyYW1lX3N0YXR1cyA9IGxlMzJfdG9fY3B1KGRlc2MtPnN0YXR1cyk7CisJCWludCBwa3RfbGVuOworCisJCWlmICgtLWJvZ3VzY250IDwgMCkgeworCQkJZ290byBub3RfZG9uZTsKKwkJfQorCQlpZiAoIShmcmFtZV9zdGF0dXMgJiBEZXNjT3duKSkKKwkJCWJyZWFrOworCQlwa3RfbGVuID0gZnJhbWVfc3RhdHVzICYgMHgxZmZmOwkvKiBDaGlwIG9taXRzIHRoZSBDUkMuICovCisJCWlmIChuZXRpZl9tc2dfcnhfc3RhdHVzKG5wKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgIG5ldGRldl9yeCgpIHN0YXR1cyB3YXMgJTguOHguXG4iLAorCQkJCSAgIGZyYW1lX3N0YXR1cyk7CisJCWlmIChmcmFtZV9zdGF0dXMgJiAweDAwMWY0MDAwKSB7CisJCQkvKiBUaGVyZSB3YXMgYSBlcnJvci4gKi8KKwkJCWlmIChuZXRpZl9tc2dfcnhfZXJyKG5wKSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiICBuZXRkZXZfcngoKSBSeCBlcnJvciB3YXMgJTguOHguXG4iLAorCQkJCQkgICBmcmFtZV9zdGF0dXMpOworCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDAxMDAwMDApIG5wLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpZiAoZnJhbWVfc3RhdHVzICYgMHgwMDAxMDAwMCkgbnAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQlpZiAoZnJhbWVfc3RhdHVzICYgMHgwMDA2MDAwMCkgbnAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDAwODAwMDApIG5wLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAoZnJhbWVfc3RhdHVzICYgMHgwMDEwMDAwMCkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPdmVyc2l6ZWQgRXRoZXJuZXQgZnJhbWUsIgorCQkJCQkgICAiIHN0YXR1cyAlOC44eC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgZnJhbWVfc3RhdHVzKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkJCWlmIChuZXRpZl9tc2dfcnhfc3RhdHVzKG5wKSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiICBuZXRkZXZfcngoKSBub3JtYWwgUnggcGt0IGxlbmd0aCAlZCIKKwkJCQkJICAgIiwgYm9ndXNfY250ICVkLlxuIiwKKwkJCQkJICAgcGt0X2xlbiwgYm9ndXNjbnQpOworI2VuZGlmCisJCQkvKiBDaGVjayBpZiB0aGUgcGFja2V0IGlzIGxvbmcgZW5vdWdoIHRvIGFjY2VwdCB3aXRob3V0IGNvcHlpbmcKKwkJCSAgIHRvIGEgbWluaW1hbGx5LXNpemVkIHNrYnVmZi4gKi8KKwkJCWlmIChwa3RfbGVuIDwgcnhfY29weWJyZWFrCisJCQkJJiYgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSBOVUxMKSB7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KG5wLT5wY2lfZGV2LAorCQkJCQkJCSAgICBkZXNjLT5mcmFnWzBdLmFkZHIsCisJCQkJCQkJICAgIG5wLT5yeF9idWZfc3osCisJCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgbnAtPnJ4X3NrYnVmZltlbnRyeV0tPnRhaWwsIHBrdF9sZW4sIDApOworCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShucC0+cGNpX2RldiwKKwkJCQkJCQkgICAgICAgZGVzYy0+ZnJhZ1swXS5hZGRyLAorCQkJCQkJCSAgICAgICBucC0+cnhfYnVmX3N6LAorCQkJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKwkJCX0gZWxzZSB7CisJCQkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldiwKKwkJCQkJZGVzYy0+ZnJhZ1swXS5hZGRyLAorCQkJCQlucC0+cnhfYnVmX3N6LAorCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCXNrYl9wdXQoc2tiID0gbnAtPnJ4X3NrYnVmZltlbnRyeV0sIHBrdF9sZW4pOworCQkJCW5wLT5yeF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJCX0KKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQkvKiBOb3RlOiBjaGVja3N1bSAtPiBza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOyAqLworCQkJbmV0aWZfcngoc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCX0KKwkJZW50cnkgPSAoZW50cnkgKyAxKSAlIFJYX1JJTkdfU0laRTsKKwkJcmVjZWl2ZWQrKzsKKwl9CisJbnAtPmN1cl9yeCA9IGVudHJ5OworCXJlZmlsbF9yeCAoZGV2KTsKKwlucC0+YnVkZ2V0IC09IHJlY2VpdmVkOworCWlvd3JpdGUxNihERUZBVUxUX0lOVFIsIGlvYWRkciArIEludHJFbmFibGUpOworCXJldHVybjsKKworbm90X2RvbmU6CisJbnAtPmN1cl9yeCA9IGVudHJ5OworCXJlZmlsbF9yeCAoZGV2KTsKKwlpZiAoIXJlY2VpdmVkKQorCQlyZWNlaXZlZCA9IDE7CisJbnAtPmJ1ZGdldCAtPSByZWNlaXZlZDsKKwlpZiAobnAtPmJ1ZGdldCA8PSAwKQorCQlucC0+YnVkZ2V0ID0gUlhfQlVER0VUOworCXRhc2tsZXRfc2NoZWR1bGUoJm5wLT5yeF90YXNrbGV0KTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHJlZmlsbF9yeCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZW50cnk7CisJaW50IGNudCA9IDA7CisKKwkvKiBSZWZpbGwgdGhlIFJ4IHJpbmcgYnVmZmVycy4gKi8KKwlmb3IgKDsobnAtPmN1cl9yeCAtIG5wLT5kaXJ0eV9yeCArIFJYX1JJTkdfU0laRSkgJSBSWF9SSU5HX1NJWkUgPiAwOworCQlucC0+ZGlydHlfcnggPSAobnAtPmRpcnR5X3J4ICsgMSkgJSBSWF9SSU5HX1NJWkUpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJZW50cnkgPSBucC0+ZGlydHlfcnggJSBSWF9SSU5HX1NJWkU7CisJCWlmIChucC0+cnhfc2tidWZmW2VudHJ5XSA9PSBOVUxMKSB7CisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKG5wLT5yeF9idWZfc3opOworCQkJbnAtPnJ4X3NrYnVmZltlbnRyeV0gPSBza2I7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJYnJlYWs7CQkvKiBCZXR0ZXIgbHVjayBuZXh0IHJvdW5kLiAqLworCQkJc2tiLT5kZXYgPSBkZXY7CQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBBbGlnbiBJUCBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KKwkJCW5wLT5yeF9yaW5nW2VudHJ5XS5mcmFnWzBdLmFkZHIgPSBjcHVfdG9fbGUzMigKKwkJCQlwY2lfbWFwX3NpbmdsZShucC0+cGNpX2Rldiwgc2tiLT50YWlsLAorCQkJCQlucC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKKwkJfQorCQkvKiBQZXJoYXBzIHdlIG5lZWQgbm90IHJlc2V0IHRoaXMgZmllbGQuICovCisJCW5wLT5yeF9yaW5nW2VudHJ5XS5mcmFnWzBdLmxlbmd0aCA9CisJCQljcHVfdG9fbGUzMihucC0+cnhfYnVmX3N6IHwgTGFzdEZyYWcpOworCQlucC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzID0gMDsKKwkJY250Kys7CisJfQorCXJldHVybjsKK30KK3N0YXRpYyB2b2lkIG5ldGRldl9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW50cl9zdGF0dXMpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZTsKKwl1MTYgbWlpX2N0bCwgbWlpX2FkdmVydGlzZSwgbWlpX2xwYTsKKwlpbnQgc3BlZWQ7CisKKwlpZiAoaW50cl9zdGF0dXMgJiBMaW5rQ2hhbmdlKSB7CisJCWlmIChucC0+YW5fZW5hYmxlKSB7CisJCQltaWlfYWR2ZXJ0aXNlID0gbWRpb19yZWFkIChkZXYsIG5wLT5waHlzWzBdLCBNSUlfQURWRVJUSVNFKTsKKwkJCW1paV9scGE9IG1kaW9fcmVhZCAoZGV2LCBucC0+cGh5c1swXSwgTUlJX0xQQSk7CisJCQltaWlfYWR2ZXJ0aXNlICY9IG1paV9scGE7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IExpbmsgY2hhbmdlZDogIiwgZGV2LT5uYW1lKTsKKwkJCWlmIChtaWlfYWR2ZXJ0aXNlICYgQURWRVJUSVNFXzEwMEZVTEwpIHsKKwkJCQlucC0+c3BlZWQgPSAxMDA7CisJCQkJcHJpbnRrICgiMTAwTWJwcywgZnVsbCBkdXBsZXhcbiIpOworCQkJfSBlbHNlIGlmIChtaWlfYWR2ZXJ0aXNlICYgQURWRVJUSVNFXzEwMEhBTEYpIHsKKwkJCQlucC0+c3BlZWQgPSAxMDA7CisJCQkJcHJpbnRrICgiMTAwTWJwcywgaGFsZiBkdXBsZXhcbiIpOworCQkJfSBlbHNlIGlmIChtaWlfYWR2ZXJ0aXNlICYgQURWRVJUSVNFXzEwRlVMTCkgeworCQkJCW5wLT5zcGVlZCA9IDEwOworCQkJCXByaW50ayAoIjEwTWJwcywgZnVsbCBkdXBsZXhcbiIpOworCQkJfSBlbHNlIGlmIChtaWlfYWR2ZXJ0aXNlICYgQURWRVJUSVNFXzEwSEFMRikgeworCQkJCW5wLT5zcGVlZCA9IDEwOworCQkJCXByaW50ayAoIjEwTWJwcywgaGFsZiBkdXBsZXhcbiIpOworCQkJfSBlbHNlCisJCQkJcHJpbnRrICgiXG4iKTsKKworCQl9IGVsc2UgeworCQkJbWlpX2N0bCA9IG1kaW9fcmVhZCAoZGV2LCBucC0+cGh5c1swXSwgTUlJX0JNQ1IpOworCQkJc3BlZWQgPSAobWlpX2N0bCAmIEJNQ1JfU1BFRUQxMDApID8gMTAwIDogMTA7CisJCQlucC0+c3BlZWQgPSBzcGVlZDsKKwkJCXByaW50ayAoS0VSTl9JTkZPICIlczogTGluayBjaGFuZ2VkOiAlZE1icHMgLCIsCisJCQkJZGV2LT5uYW1lLCBzcGVlZCk7CisJCQlwcmludGsgKCIlcyBkdXBsZXguXG4iLCAobWlpX2N0bCAmIEJNQ1JfRlVMTERQTFgpID8KKwkJCQkiZnVsbCIgOiAiaGFsZiIpOworCQl9CisJCWNoZWNrX2R1cGxleCAoZGV2KTsKKwkJaWYgKG5wLT5mbG93Y3RybCAmJiBucC0+bWlpX2lmLmZ1bGxfZHVwbGV4KSB7CisJCQlpb3dyaXRlMTYoaW9yZWFkMTYoaW9hZGRyICsgTXVsdGljYXN0RmlsdGVyMSsyKSB8IDB4MDIwMCwKKwkJCQlpb2FkZHIgKyBNdWx0aWNhc3RGaWx0ZXIxKzIpOworCQkJaW93cml0ZTE2KGlvcmVhZDE2KGlvYWRkciArIE1BQ0N0cmwwKSB8IEVuYkZsb3dDdHJsLAorCQkJCWlvYWRkciArIE1BQ0N0cmwwKTsKKwkJfQorCX0KKwlpZiAoaW50cl9zdGF0dXMgJiBTdGF0c01heCkgeworCQlnZXRfc3RhdHMoZGV2KTsKKwl9CisJaWYgKGludHJfc3RhdHVzICYgSW50clBDSUVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBTb21ldGhpbmcgV2lja2VkIGhhcHBlbmVkISAlNC40eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGludHJfc3RhdHVzKTsKKwkJLyogV2UgbXVzdCBkbyBhIGdsb2JhbCByZXNldCBvZiBETUEgdG8gY29udGludWUuICovCisJfQorfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2U7CisJaW50IGk7CisKKwkvKiBXZSBzaG91bGQgbG9jayB0aGlzIHNlZ21lbnQgb2YgY29kZSBmb3IgU01QIGV2ZW50dWFsbHksIGFsdGhvdWdoCisJICAgdGhlIHZ1bG5lcmFiaWxpdHkgd2luZG93IGlzIHZlcnkgc21hbGwgYW5kIHN0YXRpc3RpY3MgYXJlCisJICAgbm9uLWNyaXRpY2FsLiAqLworCS8qIFRoZSBjaGlwIG9ubHkgbmVlZCByZXBvcnQgZnJhbWUgc2lsZW50bHkgZHJvcHBlZC4gKi8KKwlucC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycwkrPSBpb3JlYWQ4KGlvYWRkciArIFJ4TWlzc2VkKTsKKwlucC0+c3RhdHMudHhfcGFja2V0cyArPSBpb3JlYWQxNihpb2FkZHIgKyBUeEZyYW1lc09LKTsKKwlucC0+c3RhdHMucnhfcGFja2V0cyArPSBpb3JlYWQxNihpb2FkZHIgKyBSeEZyYW1lc09LKTsKKwlucC0+c3RhdHMuY29sbGlzaW9ucyArPSBpb3JlYWQ4KGlvYWRkciArIFN0YXRzTGF0ZUNvbGwpOworCW5wLT5zdGF0cy5jb2xsaXNpb25zICs9IGlvcmVhZDgoaW9hZGRyICsgU3RhdHNNdWx0aUNvbGwpOworCW5wLT5zdGF0cy5jb2xsaXNpb25zICs9IGlvcmVhZDgoaW9hZGRyICsgU3RhdHNPbmVDb2xsKTsKKwlucC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMgKz0gaW9yZWFkOChpb2FkZHIgKyBTdGF0c0NhcnJpZXJFcnJvcik7CisJaW9yZWFkOChpb2FkZHIgKyBTdGF0c1R4RGVmZXIpOworCWZvciAoaSA9IFN0YXRzVHhEZWZlcjsgaSA8PSBTdGF0c01jYXN0Ung7IGkrKykKKwkJaW9yZWFkOChpb2FkZHIgKyBpKTsKKwlucC0+c3RhdHMudHhfYnl0ZXMgKz0gaW9yZWFkMTYoaW9hZGRyICsgVHhPY3RldHNMb3cpOworCW5wLT5zdGF0cy50eF9ieXRlcyArPSBpb3JlYWQxNihpb2FkZHIgKyBUeE9jdGV0c0hpZ2gpIDw8IDE2OworCW5wLT5zdGF0cy5yeF9ieXRlcyArPSBpb3JlYWQxNihpb2FkZHIgKyBSeE9jdGV0c0xvdyk7CisJbnAtPnN0YXRzLnJ4X2J5dGVzICs9IGlvcmVhZDE2KGlvYWRkciArIFJ4T2N0ZXRzSGlnaCkgPDwgMTY7CisKKwlyZXR1cm4gJm5wLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlOworCXUxNiBtY19maWx0ZXJbNF07CQkJLyogTXVsdGljYXN0IGhhc2ggZmlsdGVyICovCisJdTMyIHJ4X21vZGU7CisJaW50IGk7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CQkJLyogU2V0IHByb21pc2N1b3VzLiAqLworCQkvKiBVbmNvbmRpdGlvbmFsbHkgbG9nIG5ldCB0YXBzLiAqLworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLCBkZXYtPm5hbWUpOworCQltZW1zZXQobWNfZmlsdGVyLCAweGZmLCBzaXplb2YobWNfZmlsdGVyKSk7CisJCXJ4X21vZGUgPSBBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRNdWx0aWNhc3QgfCBBY2NlcHRBbGwgfCBBY2NlcHRNeVBoeXM7CisJfSBlbHNlIGlmICgoZGV2LT5tY19jb3VudCA+IG11bHRpY2FzdF9maWx0ZXJfbGltaXQpCisJCQkgICB8fCAgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCS8qIFRvbyBtYW55IHRvIG1hdGNoLCBvciBhY2NlcHQgYWxsIG11bHRpY2FzdHMuICovCisJCW1lbXNldChtY19maWx0ZXIsIDB4ZmYsIHNpemVvZihtY19maWx0ZXIpKTsKKwkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdE15UGh5czsKKwl9IGVsc2UgaWYgKGRldi0+bWNfY291bnQpIHsKKwkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJCWludCBiaXQ7CisJCWludCBpbmRleDsKKwkJaW50IGNyYzsKKwkJbWVtc2V0IChtY19maWx0ZXIsIDAsIHNpemVvZiAobWNfZmlsdGVyKSk7CisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCQkgICAgIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQljcmMgPSBldGhlcl9jcmNfbGUgKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKTsKKwkJCWZvciAoaW5kZXg9MCwgYml0PTA7IGJpdCA8IDY7IGJpdCsrLCBjcmMgPDw9IDEpCisJCQkJaWYgKGNyYyAmIDB4ODAwMDAwMDApIGluZGV4IHw9IDEgPDwgYml0OworCQkJbWNfZmlsdGVyW2luZGV4LzE2XSB8PSAoMSA8PCAoaW5kZXggJSAxNikpOworCQl9CisJCXJ4X21vZGUgPSBBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRNdWx0aUhhc2ggfCBBY2NlcHRNeVBoeXM7CisJfSBlbHNlIHsKKwkJaW93cml0ZTgoQWNjZXB0QnJvYWRjYXN0IHwgQWNjZXB0TXlQaHlzLCBpb2FkZHIgKyBSeE1vZGUpOworCQlyZXR1cm47CisJfQorCWlmIChucC0+bWlpX2lmLmZ1bGxfZHVwbGV4ICYmIG5wLT5mbG93Y3RybCkKKwkJbWNfZmlsdGVyWzNdIHw9IDB4MDIwMDsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCWlvd3JpdGUxNihtY19maWx0ZXJbaV0sIGlvYWRkciArIE11bHRpY2FzdEZpbHRlcjAgKyBpKjIpOworCWlvd3JpdGU4KHJ4X21vZGUsIGlvYWRkciArIFJ4TW9kZSk7Cit9CisKK3N0YXRpYyBpbnQgX19zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYgYWRkcjE2OworCisJYWRkcjE2ID0gKGRldi0+ZGV2X2FkZHJbMF0gfCAoZGV2LT5kZXZfYWRkclsxXSA8PCA4KSk7CisJaW93cml0ZTE2KGFkZHIxNiwgbnAtPmJhc2UgKyBTdGF0aW9uQWRkcik7CisJYWRkcjE2ID0gKGRldi0+ZGV2X2FkZHJbMl0gfCAoZGV2LT5kZXZfYWRkclszXSA8PCA4KSk7CisJaW93cml0ZTE2KGFkZHIxNiwgbnAtPmJhc2UgKyBTdGF0aW9uQWRkcisyKTsKKwlhZGRyMTYgPSAoZGV2LT5kZXZfYWRkcls0XSB8IChkZXYtPmRldl9hZGRyWzVdIDw8IDgpKTsKKwlpb3dyaXRlMTYoYWRkcjE2LCBucC0+YmFzZSArIFN0YXRpb25BZGRyKzQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX2lmX3J1bm5pbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworfQorCitzdGF0aWMgaW50IGdldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCW1paV9ldGh0b29sX2dzZXQoJm5wLT5taWlfaWYsIGVjbWQpOworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJlczsKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJcmVzID0gbWlpX2V0aHRvb2xfc3NldCgmbnAtPm1paV9pZiwgZWNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIG1paV9ud2F5X3Jlc3RhcnQoJm5wLT5taWlfaWYpOworfQorCitzdGF0aWMgdTMyIGdldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIG1paV9saW5rX29rKCZucC0+bWlpX2lmKTsKK30KKworc3RhdGljIHUzMiBnZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbnAtPm1zZ19lbmFibGU7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdmFsKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCW5wLT5tc2dfZW5hYmxlID0gdmFsOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzID0geworCS5iZWdpbiA9IGNoZWNrX2lmX3J1bm5pbmcsCisJLmdldF9kcnZpbmZvID0gZ2V0X2RydmluZm8sCisJLmdldF9zZXR0aW5ncyA9IGdldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzID0gc2V0X3NldHRpbmdzLAorCS5ud2F5X3Jlc2V0ID0gbndheV9yZXNldCwKKwkuZ2V0X2xpbmsgPSBnZXRfbGluaywKKwkuZ2V0X21zZ2xldmVsID0gZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwgPSBzZXRfbXNnbGV2ZWwsCit9OworCitzdGF0aWMgaW50IG5ldGRldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2U7CisJaW50IHJjOworCWludCBpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCXJjID0gZ2VuZXJpY19taWlfaW9jdGwoJm5wLT5taWlfaWYsIGlmX21paShycSksIGNtZCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBTSU9DREVWUFJJVkFURToKKwkJZm9yIChpPTA7IGk8VFhfUklOR19TSVpFOyBpKyspIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlMDJ4ICUwOGxseCAlMDh4ICUwOHgoJTAyeCkgJTA4eCAlMDh4XG4iLCBpLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpKG5wLT50eF9yaW5nX2RtYSArIGkqc2l6ZW9mKCpucC0+dHhfcmluZykpLAkKKwkJCQlsZTMyX3RvX2NwdShucC0+dHhfcmluZ1tpXS5uZXh0X2Rlc2MpLAorCQkJCWxlMzJfdG9fY3B1KG5wLT50eF9yaW5nW2ldLnN0YXR1cyksCisJCQkJKGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nW2ldLnN0YXR1cykgPj4gMikgCisJCQkJCSYgMHhmZiwKKwkJCQlsZTMyX3RvX2NwdShucC0+dHhfcmluZ1tpXS5mcmFnWzBdLmFkZHIpLCAKKwkJCQlsZTMyX3RvX2NwdShucC0+dHhfcmluZ1tpXS5mcmFnWzBdLmxlbmd0aCkpOworCQl9CisJCXByaW50ayhLRVJOX0RFQlVHICJUeExpc3RQdHI9JTA4eCBuZXRpZl9xdWV1ZV9zdG9wcGVkPSVkXG4iLCAKKwkJCWlvcmVhZDMyKG5wLT5iYXNlICsgVHhMaXN0UHRyKSwgCisJCQluZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpOworCQlwcmludGsoS0VSTl9ERUJVRyAiY3VyX3R4PSVkKCUwMngpIGRpcnR5X3R4PSVkKCUwMngpXG4iLCAKKwkJCW5wLT5jdXJfdHgsIG5wLT5jdXJfdHggJSBUWF9SSU5HX1NJWkUsCisJCQlucC0+ZGlydHlfdHgsIG5wLT5kaXJ0eV90eCAlIFRYX1JJTkdfU0laRSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJjdXJfcng9JWQgZGlydHlfcng9JWRcbiIsIG5wLT5jdXJfcngsIG5wLT5kaXJ0eV9yeCk7CisJCXByaW50ayhLRVJOX0RFQlVHICJjdXJfdGFzaz0lZFxuIiwgbnAtPmN1cl90YXNrKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlR4U3RhdHVzPSUwNHhcbiIsIGlvcmVhZDE2KGlvYWRkciArIFR4U3RhdHVzKSk7CisJCQlyZXR1cm4gMDsKKwl9CisJCQkJCisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbmV0ZGV2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKG5ldGlmX21zZ19pZmRvd24obnApKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQsIHN0YXR1cyB3YXMgVHggJTIuMnggIgorCQkJICAgIlJ4ICU0LjR4IEludCAlMi4yeC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGlvcmVhZDgoaW9hZGRyICsgVHhTdGF0dXMpLAorCQkJICAgaW9yZWFkMzIoaW9hZGRyICsgUnhTdGF0dXMpLCBpb3JlYWQxNihpb2FkZHIgKyBJbnRyU3RhdHVzKSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUXVldWUgcG9pbnRlcnMgd2VyZSBUeCAlZCAvICVkLCAgUnggJWQgLyAlZC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIG5wLT5jdXJfdHgsIG5wLT5kaXJ0eV90eCwgbnAtPmN1cl9yeCwgbnAtPmRpcnR5X3J4KTsKKwl9CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYnkgY2xlYXJpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCWlvd3JpdGUxNigweDAwMDAsIGlvYWRkciArIEludHJFbmFibGUpOworCisJLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBwcm9jZXNzZXMuICovCisJaW93cml0ZTE2KFR4RGlzYWJsZSB8IFJ4RGlzYWJsZSB8IFN0YXRzRGlzYWJsZSwgaW9hZGRyICsgTUFDQ3RybDEpOworCisJLyogV2FpdCBhbmQga2lsbCB0YXNrbGV0ICovCisJdGFza2xldF9raWxsKCZucC0+cnhfdGFza2xldCk7CisJdGFza2xldF9raWxsKCZucC0+dHhfdGFza2xldCk7CisKKyNpZmRlZiBfX2kzODZfXworCWlmIChuZXRpZl9tc2dfaHcobnApKSB7CisJCXByaW50aygiXG4iS0VSTl9ERUJVRyIgIFR4IHJpbmcgYXQgJTguOHg6XG4iLAorCQkJICAgKGludCkobnAtPnR4X3JpbmdfZG1hKSk7CisJCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykKKwkJCXByaW50aygiICMlZCBkZXNjLiAlNC40eCAlOC44eCAlOC44eC5cbiIsCisJCQkJICAgaSwgbnAtPnR4X3JpbmdbaV0uc3RhdHVzLCBucC0+dHhfcmluZ1tpXS5mcmFnWzBdLmFkZHIsCisJCQkJICAgbnAtPnR4X3JpbmdbaV0uZnJhZ1swXS5sZW5ndGgpOworCQlwcmludGsoIlxuIktFUk5fREVCVUcgIiAgUnggcmluZyAlOC44eDpcbiIsCisJCQkgICAoaW50KShucC0+cnhfcmluZ19kbWEpKTsKKwkJZm9yIChpID0gMDsgaSA8IC8qUlhfUklOR19TSVpFKi80IDsgaSsrKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiICMlZCBkZXNjLiAlNC40eCAlNC40eCAlOC44eFxuIiwKKwkJCQkgICBpLCBucC0+cnhfcmluZ1tpXS5zdGF0dXMsIG5wLT5yeF9yaW5nW2ldLmZyYWdbMF0uYWRkciwKKwkJCQkgICBucC0+cnhfcmluZ1tpXS5mcmFnWzBdLmxlbmd0aCk7CisJCX0KKwl9CisjZW5kaWYgLyogX19pMzg2X18gZGVidWdnaW5nIG9ubHkgKi8KKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJZGVsX3RpbWVyX3N5bmMoJm5wLT50aW1lcik7CisKKwkvKiBGcmVlIGFsbCB0aGUgc2tidWZmcyBpbiB0aGUgUnggcXVldWUuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCW5wLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJCW5wLT5yeF9yaW5nW2ldLmZyYWdbMF0uYWRkciA9IDB4QkFERjAwRDA7IC8qIEFuIGludmFsaWQgYWRkcmVzcy4gKi8KKwkJc2tiID0gbnAtPnJ4X3NrYnVmZltpXTsKKwkJaWYgKHNrYikgeworCQkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldiwKKwkJCQlucC0+cnhfcmluZ1tpXS5mcmFnWzBdLmFkZHIsIG5wLT5yeF9idWZfc3osCisJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCW5wLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlza2IgPSBucC0+dHhfc2tidWZmW2ldOworCQlpZiAoc2tiKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LAorCQkJCW5wLT50eF9yaW5nW2ldLmZyYWdbMF0uYWRkciwgc2tiLT5sZW4sCisJCQkJUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlucC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc3VuZGFuY2VfcmVtb3ZlMSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChkZXYpIHsKKwkJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKyAgICAgICAgCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgbnAtPnJ4X3JpbmcsCisJCQlucC0+cnhfcmluZ19kbWEpOworCSAgICAgICAgcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBUWF9UT1RBTF9TSVpFLCBucC0+dHhfcmluZywKKwkJCW5wLT50eF9yaW5nX2RtYSk7CisJCXBjaV9pb3VubWFwKHBkZXYsIG5wLT5iYXNlKTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHN1bmRhbmNlX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUJPSBzdW5kYW5jZV9wY2lfdGJsLAorCS5wcm9iZQkJPSBzdW5kYW5jZV9wcm9iZTEsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzdW5kYW5jZV9yZW1vdmUxKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHN1bmRhbmNlX2luaXQodm9pZCkKK3sKKy8qIHdoZW4gYSBtb2R1bGUsIHRoaXMgaXMgcHJpbnRlZCB3aGV0aGVyIG9yIG5vdCBkZXZpY2VzIGFyZSBmb3VuZCBpbiBwcm9iZSAqLworI2lmZGVmIE1PRFVMRQorCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnN1bmRhbmNlX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzdW5kYW5jZV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzdW5kYW5jZV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzdW5kYW5jZV9pbml0KTsKK21vZHVsZV9leGl0KHN1bmRhbmNlX2V4aXQpOworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmdlbS5jIGIvZHJpdmVycy9uZXQvc3VuZ2VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkNTBmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3N1bmdlbS5jCkBAIC0wLDAgKzEsMzIwNCBAQAorLyogJElkOiBzdW5nZW0uYyx2IDEuNDQuMi4yMiAyMDAyLzAzLzEzIDAxOjE4OjEyIGRhdmVtIEV4cCAkCisgKiBzdW5nZW0uYzogU3VuIEdFTSBldGhlcm5ldCBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqIAorICogU3VwcG9ydCBmb3IgQXBwbGUgR01BQyBhbmQgYXNzb3J0ZWQgUEhZcywgV09MLCBQb3dlciBNYW5hZ2VtZW50CisgKiAoQykgMjAwMSwyMDAyLDIwMDMgQmVuamFtaW4gSGVycmVuc2NtaWR0IChiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmcpCisgKiAoQykgMjAwNCwyMDA1IEJlbmphbWluIEhlcnJlbnNjbWlkdCwgSUJNIENvcnAuCisgKgorICogTkFQSSBhbmQgTkVUUE9MTCBzdXBwb3J0CisgKiAoQykgMjAwNCBieSBFcmljIExlbW9pbmUgKGVyaWMubGVtb2luZUBnbWFpbC5jb20pCisgKiAKKyAqIFRPRE86IAorICogIC0gTm93IHRoYXQgdGhlIGRyaXZlciB3YXMgc2lnbmlmaWNhbnRseSBzaW1wbGlmaWVkLCBJIG5lZWQgdG8gcmV3b3JrCisgKiAgICB0aGUgbG9ja2luZy4gSSdtIHN1cmUgd2UgZG9uJ3QgbmVlZCBfMl8gc3BpbmxvY2tzLCBhbmQgd2UgcHJvYmFibHkKKyAqICAgIGNhbiBhdm9pZCB0YWtpbmcgbW9zdCBvZiB0aGVtIGZvciBzbyBsb25nIHBlcmlvZCBvZiB0aW1lIChhbmQgc2NoZWR1bGUKKyAqICAgIGluc3RlYWQpLiBUaGUgbWFpbiBpc3N1ZXMgYXQgdGhpcyBwb2ludCBhcmUgY2F1c2VkIGJ5IHRoZSBuZXRkZXYgbGF5ZXIKKyAqICAgIHRob3VnaDoKKyAqICAgIAorICogICAgZ2VtX2NoYW5nZV9tdHUoKSBhbmQgZ2VtX3NldF9tdWx0aWNhc3QoKSBhcmUgY2FsbGVkIHdpdGggYSByZWFkX2xvY2soKQorICogICAgaGVscCBieSBuZXQvY29yZS9kZXYuYywgdGh1cyB0aGV5IGNhbid0IHNjaGVkdWxlLiBUaGF0IG1lYW5zIHRoZXkgY2FuJ3QKKyAqICAgIGNhbGwgbmV0aWZfcG9sbF9kaXNhYmxlKCkgbmVpdGhlciwgdGh1cyBmb3JjZSBnZW1fcG9sbCgpIHRvIGtlZXAgYSBzcGlubG9jaworICogICAgd2hlcmUgaXQgY291bGQgaGF2ZSBiZWVuIGRyb3BwZWQuIGNoYW5nZV9tdHUgZXNwZWNpYWxseSB3b3VsZCBsb3ZlIGFsc28gdG8KKyAqICAgIGJlIGFibGUgdG8gbXNsZWVwIGluc3RlYWQgb2YgaG9ycmlkIGxvY2tlZCBkZWxheXMgd2hlbiByZXNldHRpbmcgdGhlIEhXLAorICogICAgYnV0IHRoYXQgcmVhZF9sb2NrKCkgbWFrZXMgaXQgaW1wb3NzaWJsZSwgdW5sZXNzIEkgZGVmZXIgaXQncyBhY3Rpb24gdG8KKyAqICAgIHRoZSByZXNldCB0YXNrLCB3aGljaCBtZWFucyBpdCdsbCBiZSBhc3luY2hyb25vdXMgKHdvbid0IHRha2UgZWZmZWN0IHVudGlsCisgKiAgICB0aGUgc3lzdGVtIHNjaGVkdWxlcyBhIGJpdCkuCisgKgorICogICAgQWxzbywgaXQgd291bGQgcHJvYmFibHkgYmUgcG9zc2libGUgdG8gYWxzbyByZW1vdmUgbW9zdCBvZiB0aGUgbG9uZy1saWZlCisgKiAgICBsb2NraW5nIGluIG9wZW4vcmVzdW1lIGNvZGUgcGF0aCAoZ2VtX3JlaW5pdF9jaGlwKSBieSBiZWVpbmcgbW9yZSBjYXJlZnVsCisgKiAgICBhYm91dCB3aGVuIHdlIGNhbiBzdGFydCB0YWtpbmcgaW50ZXJydXB0cyBvciBnZXQgeG1pdCgpIGNhbGxlZC4uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpZmRlZiBfX3NwYXJjX18KKyNpbmNsdWRlIDxhc20vaWRwcm9tLmg+CisjaW5jbHVkZSA8YXNtL29wZW5wcm9tLmg+CisjaW5jbHVkZSA8YXNtL29wbGliLmg+CisjaW5jbHVkZSA8YXNtL3BibS5oPgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vcG1hY19mZWF0dXJlLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInN1bmdlbV9waHkuaCIKKyNpbmNsdWRlICJzdW5nZW0uaCIKKworLyogU3RyaXBwaW5nIEZDUyBpcyBjYXVzaW5nIHByb2JsZW1zLCBkaXNhYmxlZCBmb3Igbm93ICovCisjdW5kZWYgU1RSSVBfRkNTCisKKyNkZWZpbmUgREVGQVVMVF9NU0cJKE5FVElGX01TR19EUlYJCXwgXAorCQkJIE5FVElGX01TR19QUk9CRQl8IFwKKwkJCSBORVRJRl9NU0dfTElOSykKKworI2RlZmluZSBBRFZFUlRJU0VfTUFTSwkoU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfCBcCisJCQkgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8IFwKKwkJCSBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpCisKKyNkZWZpbmUgRFJWX05BTUUJInN1bmdlbSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuOTgiCisjZGVmaW5lIERSVl9SRUxEQVRFCSI4LzI0LzAzIgorI2RlZmluZSBEUlZfQVVUSE9SCSJEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pIgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisgICAgICAgIERSVl9OQU1FICIuYzp2IiBEUlZfVkVSU0lPTiAiICIgRFJWX1JFTERBVEUgIiAiIERSVl9BVVRIT1IgIlxuIjsKKworTU9EVUxFX0FVVEhPUihEUlZfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VuIEdFTSBHYml0IGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIEdFTV9NT0RVTEVfTkFNRQkiZ2VtIgorI2RlZmluZSBQRlggR0VNX01PRFVMRV9OQU1FICI6ICIKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGdlbV9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX1NVTiwgUENJX0RFVklDRV9JRF9TVU5fR0VNLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisKKwkvKiBUaGVzZSBtb2RlbHMgb25seSBkaWZmZXIgZnJvbSB0aGUgb3JpZ2luYWwgR0VNIGluCisJICogdGhhdCB0aGVpciB0eC9yeCBmaWZvcyBhcmUgb2YgYSBkaWZmZXJlbnQgc2l6ZSBhbmQKKwkgKiB0aGV5IG9ubHkgc3VwcG9ydCAxMC8xMDAgc3BlZWRzLiAtRGF2ZU0KKwkgKiAKKwkgKiBBcHBsZSdzIEdNQUMgZG9lcyBzdXBwb3J0IGdpZ2FiaXQgb24gbWFjaGluZXMgd2l0aAorCSAqIHRoZSBCQ001NHh4IFBIWXMuIC1CZW5ICisJICovCisJeyBQQ0lfVkVORE9SX0lEX1NVTiwgUENJX0RFVklDRV9JRF9TVU5fUklPX0dFTSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9BUFBMRSwgUENJX0RFVklDRV9JRF9BUFBMRV9VTklfTl9HTUFDLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FQUExFLCBQQ0lfREVWSUNFX0lEX0FQUExFX1VOSV9OX0dNQUNQLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FQUExFLCBQQ0lfREVWSUNFX0lEX0FQUExFX1VOSV9OX0dNQUMyLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FQUExFLCBQQ0lfREVWSUNFX0lEX0FQUExFX0syX0dNQUMsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQVBQTEUsIFBDSV9ERVZJQ0VfSURfQVBQTEVfU0hfU1VOR0VNLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJezAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBnZW1fcGNpX3RibCk7CisKK3N0YXRpYyB1MTYgX19waHlfcmVhZChzdHJ1Y3QgZ2VtICpncCwgaW50IHBoeV9hZGRyLCBpbnQgcmVnKQoreworCXUzMiBjbWQ7CisJaW50IGxpbWl0ID0gMTAwMDA7CisKKwljbWQgID0gKDEgPDwgMzApOworCWNtZCB8PSAoMiA8PCAyOCk7CisJY21kIHw9IChwaHlfYWRkciA8PCAyMykgJiBNSUZfRlJBTUVfUEhZQUQ7CisJY21kIHw9IChyZWcgPDwgMTgpICYgTUlGX0ZSQU1FX1JFR0FEOworCWNtZCB8PSAoTUlGX0ZSQU1FX1RBTVNCKTsKKwl3cml0ZWwoY21kLCBncC0+cmVncyArIE1JRl9GUkFNRSk7CisKKwl3aGlsZSAobGltaXQtLSkgeworCQljbWQgPSByZWFkbChncC0+cmVncyArIE1JRl9GUkFNRSk7CisJCWlmIChjbWQgJiBNSUZfRlJBTUVfVEFMU0IpCisJCQlicmVhazsKKworCQl1ZGVsYXkoMTApOworCX0KKworCWlmICghbGltaXQpCisJCWNtZCA9IDB4ZmZmZjsKKworCXJldHVybiBjbWQgJiBNSUZfRlJBTUVfREFUQTsKK30KKworc3RhdGljIGlubGluZSBpbnQgX3BoeV9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtaWlfaWQsIGludCByZWcpCit7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisJcmV0dXJuIF9fcGh5X3JlYWQoZ3AsIG1paV9pZCwgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB1MTYgcGh5X3JlYWQoc3RydWN0IGdlbSAqZ3AsIGludCByZWcpCit7CisJcmV0dXJuIF9fcGh5X3JlYWQoZ3AsIGdwLT5taWlfcGh5X2FkZHIsIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fcGh5X3dyaXRlKHN0cnVjdCBnZW0gKmdwLCBpbnQgcGh5X2FkZHIsIGludCByZWcsIHUxNiB2YWwpCit7CisJdTMyIGNtZDsKKwlpbnQgbGltaXQgPSAxMDAwMDsKKworCWNtZCAgPSAoMSA8PCAzMCk7CisJY21kIHw9ICgxIDw8IDI4KTsKKwljbWQgfD0gKHBoeV9hZGRyIDw8IDIzKSAmIE1JRl9GUkFNRV9QSFlBRDsKKwljbWQgfD0gKHJlZyA8PCAxOCkgJiBNSUZfRlJBTUVfUkVHQUQ7CisJY21kIHw9IChNSUZfRlJBTUVfVEFNU0IpOworCWNtZCB8PSAodmFsICYgTUlGX0ZSQU1FX0RBVEEpOworCXdyaXRlbChjbWQsIGdwLT5yZWdzICsgTUlGX0ZSQU1FKTsKKworCXdoaWxlIChsaW1pdC0tKSB7CisJCWNtZCA9IHJlYWRsKGdwLT5yZWdzICsgTUlGX0ZSQU1FKTsKKwkJaWYgKGNtZCAmIE1JRl9GUkFNRV9UQUxTQikKKwkJCWJyZWFrOworCisJCXVkZWxheSgxMCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX3BoeV93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnLCBpbnQgdmFsKQoreworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCV9fcGh5X3dyaXRlKGdwLCBtaWlfaWQsIHJlZywgdmFsICYgMHhmZmZmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBoeV93cml0ZShzdHJ1Y3QgZ2VtICpncCwgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlfX3BoeV93cml0ZShncCwgZ3AtPm1paV9waHlfYWRkciwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VtX2VuYWJsZV9pbnRzKHN0cnVjdCBnZW0gKmdwKQoreworCS8qIEVuYWJsZSBhbGwgaW50ZXJydXB0cyBidXQgVFhET05FICovCisJd3JpdGVsKEdSRUdfU1RBVF9UWERPTkUsIGdwLT5yZWdzICsgR1JFR19JTUFTSyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW1fZGlzYWJsZV9pbnRzKHN0cnVjdCBnZW0gKmdwKQoreworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMsIGluY2x1ZGluZyBUWERPTkUgKi8KKwl3cml0ZWwoR1JFR19TVEFUX05BUEkgfCBHUkVHX1NUQVRfVFhET05FLCBncC0+cmVncyArIEdSRUdfSU1BU0spOworfQorCitzdGF0aWMgdm9pZCBnZW1fZ2V0X2NlbGwoc3RydWN0IGdlbSAqZ3ApCit7CisJQlVHX09OKGdwLT5jZWxsX2VuYWJsZWQgPCAwKTsKKwlncC0+Y2VsbF9lbmFibGVkKys7CisjaWZkZWYgQ09ORklHX1BQQ19QTUFDCisJaWYgKGdwLT5jZWxsX2VuYWJsZWQgPT0gMSkgeworCQltYigpOworCQlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9HTUFDX0VOQUJMRSwgZ3AtPm9mX25vZGUsIDAsIDEpOworCQl1ZGVsYXkoMTApOworCX0KKyNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KK30KKworLyogVHVybiBvZmYgdGhlIGNoaXAncyBjbG9jayAqLworc3RhdGljIHZvaWQgZ2VtX3B1dF9jZWxsKHN0cnVjdCBnZW0gKmdwKQoreworCUJVR19PTihncC0+Y2VsbF9lbmFibGVkIDw9IDApOworCWdwLT5jZWxsX2VuYWJsZWQtLTsKKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKKwlpZiAoZ3AtPmNlbGxfZW5hYmxlZCA9PSAwKSB7CisJCW1iKCk7CisJCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX0dNQUNfRU5BQkxFLCBncC0+b2Zfbm9kZSwgMCwgMCk7CisJCXVkZWxheSgxMCk7CisJfQorI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLworfQorCitzdGF0aWMgdm9pZCBnZW1faGFuZGxlX21pZl9ldmVudChzdHJ1Y3QgZ2VtICpncCwgdTMyIHJlZ192YWwsIHUzMiBjaGFuZ2VkX2JpdHMpCit7CisJaWYgKG5ldGlmX21zZ19pbnRyKGdwKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBtaWYgaW50ZXJydXB0XG4iLCBncC0+ZGV2LT5uYW1lKTsKK30KKworc3RhdGljIGludCBnZW1fcGNzX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZ2VtICpncCwgdTMyIGdlbV9zdGF0dXMpCit7CisJdTMyIHBjc19pc3RhdCA9IHJlYWRsKGdwLT5yZWdzICsgUENTX0lTVEFUKTsKKwl1MzIgcGNzX21paXN0YXQ7CisKKwlpZiAobmV0aWZfbXNnX2ludHIoZ3ApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHBjcyBpbnRlcnJ1cHQsIHBjc19pc3RhdDogMHgleFxuIiwKKwkJCWdwLT5kZXYtPm5hbWUsIHBjc19pc3RhdCk7CisKKwlpZiAoIShwY3NfaXN0YXQgJiBQQ1NfSVNUQVRfTFNDKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQQ1MgaXJxIGJ1dCBubyBsaW5rIHN0YXR1cyBjaGFuZ2U/Pz9cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBUaGUgbGluayBzdGF0dXMgYml0IGxhdGNoZXMgb24gemVybywgc28geW91IG11c3QKKwkgKiByZWFkIGl0IHR3aWNlIGluIHN1Y2ggYSBjYXNlIHRvIHNlZSBhIHRyYW5zaXRpb24KKwkgKiB0byB0aGUgbGluayBiZWluZyB1cC4KKwkgKi8KKwlwY3NfbWlpc3RhdCA9IHJlYWRsKGdwLT5yZWdzICsgUENTX01JSVNUQVQpOworCWlmICghKHBjc19taWlzdGF0ICYgUENTX01JSVNUQVRfTFMpKQorCQlwY3NfbWlpc3RhdCB8PQorCQkJKHJlYWRsKGdwLT5yZWdzICsgUENTX01JSVNUQVQpICYKKwkJCSBQQ1NfTUlJU1RBVF9MUyk7CisKKwlpZiAocGNzX21paXN0YXQgJiBQQ1NfTUlJU1RBVF9BTkMpIHsKKwkJLyogVGhlIHJlbW90ZS1mYXVsdCBpbmRpY2F0aW9uIGlzIG9ubHkgdmFsaWQKKwkJICogd2hlbiBhdXRvbmVnIGhhcyBjb21wbGV0ZWQuCisJCSAqLworCQlpZiAocGNzX21paXN0YXQgJiBQQ1NfTUlJU1RBVF9SRikKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQQ1MgQXV0b05FRyBjb21wbGV0ZSwgIgorCQkJICAgICAgICJSZW1vdGVGYXVsdFxuIiwgZGV2LT5uYW1lKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBDUyBBdXRvTkVHIGNvbXBsZXRlLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCX0KKworCWlmIChwY3NfbWlpc3RhdCAmIFBDU19NSUlTVEFUX0xTKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQQ1MgbGluayBpcyBub3cgdXAuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJbmV0aWZfY2Fycmllcl9vbihncC0+ZGV2KTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogUENTIGxpbmsgaXMgbm93IGRvd24uXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJbmV0aWZfY2Fycmllcl9vZmYoZ3AtPmRldik7CisJCS8qIElmIHRoaXMgaGFwcGVucyBhbmQgdGhlIGxpbmsgdGltZXIgaXMgbm90IHJ1bm5pbmcsCisJCSAqIHJlc2V0IHNvIHdlIHJlLW5lZ290aWF0ZS4KKwkJICovCisJCWlmICghdGltZXJfcGVuZGluZygmZ3AtPmxpbmtfdGltZXIpKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VtX3R4bWFjX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZ2VtICpncCwgdTMyIGdlbV9zdGF0dXMpCit7CisJdTMyIHR4bWFjX3N0YXQgPSByZWFkbChncC0+cmVncyArIE1BQ19UWFNUQVQpOworCisJaWYgKG5ldGlmX21zZ19pbnRyKGdwKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0eG1hYyBpbnRlcnJ1cHQsIHR4bWFjX3N0YXQ6IDB4JXhcbiIsCisJCQlncC0+ZGV2LT5uYW1lLCB0eG1hY19zdGF0KTsKKworCS8qIERlZmVyIHRpbWVyIGV4cGlyYXRpb24gaXMgcXVpdGUgbm9ybWFsLAorCSAqIGRvbid0IGV2ZW4gbG9nIHRoZSBldmVudC4KKwkgKi8KKwlpZiAoKHR4bWFjX3N0YXQgJiBNQUNfVFhTVEFUX0RURSkgJiYKKwkgICAgISh0eG1hY19zdGF0ICYgfk1BQ19UWFNUQVRfRFRFKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAodHhtYWNfc3RhdCAmIE1BQ19UWFNUQVRfVVJVTikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUWCBNQUMgeG1pdCB1bmRlcnJ1bi5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlncC0+bmV0X3N0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJfQorCisJaWYgKHR4bWFjX3N0YXQgJiBNQUNfVFhTVEFUX01QRSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUWCBNQUMgbWF4IHBhY2tldCBzaXplIGVycm9yLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWdwLT5uZXRfc3RhdHMudHhfZXJyb3JzKys7CisJfQorCisJLyogVGhlIHJlc3QgYXJlIGFsbCBjYXNlcyBvZiBvbmUgb2YgdGhlIDE2LWJpdCBUWAorCSAqIGNvdW50ZXJzIGV4cGlyaW5nLgorCSAqLworCWlmICh0eG1hY19zdGF0ICYgTUFDX1RYU1RBVF9OQ0UpCisJCWdwLT5uZXRfc3RhdHMuY29sbGlzaW9ucyArPSAweDEwMDAwOworCisJaWYgKHR4bWFjX3N0YXQgJiBNQUNfVFhTVEFUX0VDRSkgeworCQlncC0+bmV0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzICs9IDB4MTAwMDA7CisJCWdwLT5uZXRfc3RhdHMuY29sbGlzaW9ucyArPSAweDEwMDAwOworCX0KKworCWlmICh0eG1hY19zdGF0ICYgTUFDX1RYU1RBVF9MQ0UpIHsKKwkJZ3AtPm5ldF9zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyArPSAweDEwMDAwOworCQlncC0+bmV0X3N0YXRzLmNvbGxpc2lvbnMgKz0gMHgxMDAwMDsKKwl9CisKKwkvKiBXZSBkbyBub3Qga2VlcCB0cmFjayBvZiBNQUNfVFhTVEFUX0ZDRSBhbmQKKwkgKiBNQUNfVFhTVEFUX1BDRSBldmVudHMuCisJICovCisJcmV0dXJuIDA7Cit9CisKKy8qIFdoZW4gd2UgZ2V0IGEgUlggZmlmbyBvdmVyZmxvdywgdGhlIFJYIHVuaXQgaW4gR0VNIGlzIHByb2JhYmx5IGh1bmcKKyAqIHNvIHdlIGRvIHRoZSBmb2xsb3dpbmcuCisgKgorICogSWYgYW55IHBhcnQgb2YgdGhlIHJlc2V0IGdvZXMgd3JvbmcsIHdlIHJldHVybiAxIGFuZCB0aGF0IGNhdXNlcyB0aGUKKyAqIHdob2xlIGNoaXAgdG8gYmUgcmVzZXQuCisgKi8KK3N0YXRpYyBpbnQgZ2VtX3J4bWFjX3Jlc2V0KHN0cnVjdCBnZW0gKmdwKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBncC0+ZGV2OworCWludCBsaW1pdCwgaTsKKwl1NjQgZGVzY19kbWE7CisJdTMyIHZhbDsKKworCS8qIEZpcnN0LCByZXNldCAmIGRpc2FibGUgTUFDIFJYLiAqLworCXdyaXRlbChNQUNfUlhSU1RfQ01ELCBncC0+cmVncyArIE1BQ19SWFJTVCk7CisJZm9yIChsaW1pdCA9IDA7IGxpbWl0IDwgNTAwMDsgbGltaXQrKykgeworCQlpZiAoIShyZWFkbChncC0+cmVncyArIE1BQ19SWFJTVCkgJiBNQUNfUlhSU1RfQ01EKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKwlpZiAobGltaXQgPT0gNTAwMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSWCBNQUMgd2lsbCBub3QgcmVzZXQsIHJlc2V0dGluZyB3aG9sZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJjaGlwLlxuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJd3JpdGVsKGdwLT5tYWNfcnhfY2ZnICYgfk1BQ19SWENGR19FTkFCLAorCSAgICAgICBncC0+cmVncyArIE1BQ19SWENGRyk7CisJZm9yIChsaW1pdCA9IDA7IGxpbWl0IDwgNTAwMDsgbGltaXQrKykgeworCQlpZiAoIShyZWFkbChncC0+cmVncyArIE1BQ19SWENGRykgJiBNQUNfUlhDRkdfRU5BQikpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisJaWYgKGxpbWl0ID09IDUwMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUlggTUFDIHdpbGwgbm90IGRpc2FibGUsIHJlc2V0dGluZyB3aG9sZSAiCisJCSAgICAgICAiY2hpcC5cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCS8qIFNlY29uZCwgZGlzYWJsZSBSWCBETUEuICovCisJd3JpdGVsKDAsIGdwLT5yZWdzICsgUlhETUFfQ0ZHKTsKKwlmb3IgKGxpbWl0ID0gMDsgbGltaXQgPCA1MDAwOyBsaW1pdCsrKSB7CisJCWlmICghKHJlYWRsKGdwLT5yZWdzICsgUlhETUFfQ0ZHKSAmIFJYRE1BX0NGR19FTkFCTEUpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCWlmIChsaW1pdCA9PSA1MDAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJYIERNQSB3aWxsIG5vdCBkaXNhYmxlLCByZXNldHRpbmcgd2hvbGUgIgorCQkgICAgICAgImNoaXAuXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwl1ZGVsYXkoNTAwMCk7CisKKwkvKiBFeGVjdXRlIFJYIHJlc2V0IGNvbW1hbmQuICovCisJd3JpdGVsKGdwLT5zd3JzdF9iYXNlIHwgR1JFR19TV1JTVF9SWFJTVCwKKwkgICAgICAgZ3AtPnJlZ3MgKyBHUkVHX1NXUlNUKTsKKwlmb3IgKGxpbWl0ID0gMDsgbGltaXQgPCA1MDAwOyBsaW1pdCsrKSB7CisJCWlmICghKHJlYWRsKGdwLT5yZWdzICsgR1JFR19TV1JTVCkgJiBHUkVHX1NXUlNUX1JYUlNUKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKwlpZiAobGltaXQgPT0gNTAwMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSWCByZXNldCBjb21tYW5kIHdpbGwgbm90IGV4ZWN1dGUsIHJlc2V0dGluZyAiCisJCSAgICAgICAid2hvbGUgY2hpcC5cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCS8qIFJlZnJlc2ggdGhlIFJYIHJpbmcuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBnZW1fcnhkICpyeGQgPSAmZ3AtPmluaXRfYmxvY2stPnJ4ZFtpXTsKKworCQlpZiAoZ3AtPnJ4X3NrYnNbaV0gPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUGFydHMgb2YgUlggcmluZyBlbXB0eSwgcmVzZXR0aW5nICIKKwkJCSAgICAgICAid2hvbGUgY2hpcC5cbiIsIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCXJ4ZC0+c3RhdHVzX3dvcmQgPSBjcHVfdG9fbGU2NChSWERDVFJMX0ZSRVNIKGdwKSk7CisJfQorCWdwLT5yeF9uZXcgPSBncC0+cnhfb2xkID0gMDsKKworCS8qIE5vdyB3ZSBtdXN0IHJlcHJvZ3JhbSB0aGUgcmVzdCBvZiBSWCB1bml0LiAqLworCWRlc2NfZG1hID0gKHU2NCkgZ3AtPmdibG9ja19kdm1hOworCWRlc2NfZG1hICs9IChJTklUX0JMT0NLX1RYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgZ2VtX3R4ZCkpOworCXdyaXRlbChkZXNjX2RtYSA+PiAzMiwgZ3AtPnJlZ3MgKyBSWERNQV9EQkhJKTsKKwl3cml0ZWwoZGVzY19kbWEgJiAweGZmZmZmZmZmLCBncC0+cmVncyArIFJYRE1BX0RCTE9XKTsKKwl3cml0ZWwoUlhfUklOR19TSVpFIC0gNCwgZ3AtPnJlZ3MgKyBSWERNQV9LSUNLKTsKKwl2YWwgPSAoUlhETUFfQ0ZHX0JBU0UgfCAoUlhfT0ZGU0VUIDw8IDEwKSB8CisJICAgICAgICgoMTQgLyAyKSA8PCAxMykgfCBSWERNQV9DRkdfRlRIUkVTSF8xMjgpOworCXdyaXRlbCh2YWwsIGdwLT5yZWdzICsgUlhETUFfQ0ZHKTsKKwlpZiAocmVhZGwoZ3AtPnJlZ3MgKyBHUkVHX0JJRkNGRykgJiBHUkVHX0JJRkNGR19NNjZFTikKKwkJd3JpdGVsKCgoNSAmIFJYRE1BX0JMQU5LX0lQS1RTKSB8CisJCQkoKDggPDwgMTIpICYgUlhETUFfQkxBTktfSVRJTUUpKSwKKwkJICAgICAgIGdwLT5yZWdzICsgUlhETUFfQkxBTkspOworCWVsc2UKKwkJd3JpdGVsKCgoNSAmIFJYRE1BX0JMQU5LX0lQS1RTKSB8CisJCQkoKDQgPDwgMTIpICYgUlhETUFfQkxBTktfSVRJTUUpKSwKKwkJICAgICAgIGdwLT5yZWdzICsgUlhETUFfQkxBTkspOworCXZhbCAgPSAoKChncC0+cnhfcGF1c2Vfb2ZmIC8gNjQpIDw8IDApICYgUlhETUFfUFRIUkVTSF9PRkYpOworCXZhbCB8PSAoKChncC0+cnhfcGF1c2Vfb24gLyA2NCkgPDwgMTIpICYgUlhETUFfUFRIUkVTSF9PTik7CisJd3JpdGVsKHZhbCwgZ3AtPnJlZ3MgKyBSWERNQV9QVEhSRVNIKTsKKwl2YWwgPSByZWFkbChncC0+cmVncyArIFJYRE1BX0NGRyk7CisJd3JpdGVsKHZhbCB8IFJYRE1BX0NGR19FTkFCTEUsIGdwLT5yZWdzICsgUlhETUFfQ0ZHKTsKKwl3cml0ZWwoTUFDX1JYU1RBVF9SQ1YsIGdwLT5yZWdzICsgTUFDX1JYTUFTSyk7CisJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpOworCXdyaXRlbCh2YWwgfCBNQUNfUlhDRkdfRU5BQiwgZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VtX3J4bWFjX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZ2VtICpncCwgdTMyIGdlbV9zdGF0dXMpCit7CisJdTMyIHJ4bWFjX3N0YXQgPSByZWFkbChncC0+cmVncyArIE1BQ19SWFNUQVQpOworCWludCByZXQgPSAwOworCisJaWYgKG5ldGlmX21zZ19pbnRyKGdwKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByeG1hYyBpbnRlcnJ1cHQsIHJ4bWFjX3N0YXQ6IDB4JXhcbiIsCisJCQlncC0+ZGV2LT5uYW1lLCByeG1hY19zdGF0KTsKKworCWlmIChyeG1hY19zdGF0ICYgTUFDX1JYU1RBVF9PRkxXKSB7CisJCXUzMiBzbWFjID0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfU01BQ0hJTkUpOworCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJYIE1BQyBmaWZvIG92ZXJmbG93IHNtYWNbJTA4eF0uXG4iLAorCQkJCWRldi0+bmFtZSwgc21hYyk7CisJCWdwLT5uZXRfc3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJZ3AtPm5ldF9zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCisJCXJldCA9IGdlbV9yeG1hY19yZXNldChncCk7CisJfQorCisJaWYgKHJ4bWFjX3N0YXQgJiBNQUNfUlhTVEFUX0FDRSkKKwkJZ3AtPm5ldF9zdGF0cy5yeF9mcmFtZV9lcnJvcnMgKz0gMHgxMDAwMDsKKworCWlmIChyeG1hY19zdGF0ICYgTUFDX1JYU1RBVF9DQ0UpCisJCWdwLT5uZXRfc3RhdHMucnhfY3JjX2Vycm9ycyArPSAweDEwMDAwOworCisJaWYgKHJ4bWFjX3N0YXQgJiBNQUNfUlhTVEFUX0xDRSkKKwkJZ3AtPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzICs9IDB4MTAwMDA7CisKKwkvKiBXZSBkbyBub3QgdHJhY2sgTUFDX1JYU1RBVF9GQ0UgYW5kIE1BQ19SWFNUQVRfVkNFCisJICogZXZlbnRzLgorCSAqLworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2VtX21hY19pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGdlbSAqZ3AsIHUzMiBnZW1fc3RhdHVzKQoreworCXUzMiBtYWNfY3N0YXQgPSByZWFkbChncC0+cmVncyArIE1BQ19DU1RBVCk7CisKKwlpZiAobmV0aWZfbXNnX2ludHIoZ3ApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG1hYyBpbnRlcnJ1cHQsIG1hY19jc3RhdDogMHgleFxuIiwKKwkJCWdwLT5kZXYtPm5hbWUsIG1hY19jc3RhdCk7CisKKwkvKiBUaGlzIGludGVycnVwdCBpcyBqdXN0IGZvciBwYXVzZSBmcmFtZSBhbmQgcGF1c2UKKwkgKiB0cmFja2luZy4gIEl0IGlzIHVzZWZ1bCBmb3IgZGlhZ25vc3RpY3MgYW5kIGRlYnVnCisJICogYnV0IHByb2JhYmx5IGJ5IGRlZmF1bHQgd2Ugd2lsbCBtYXNrIHRoZXNlIGV2ZW50cy4KKwkgKi8KKwlpZiAobWFjX2NzdGF0ICYgTUFDX0NTVEFUX1BTKQorCQlncC0+cGF1c2VfZW50ZXJlZCsrOworCisJaWYgKG1hY19jc3RhdCAmIE1BQ19DU1RBVF9QUkNWKQorCQlncC0+cGF1c2VfbGFzdF90aW1lX3JlY3ZkID0gKG1hY19jc3RhdCA+PiAxNik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZW1fbWlmX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZ2VtICpncCwgdTMyIGdlbV9zdGF0dXMpCit7CisJdTMyIG1pZl9zdGF0dXMgPSByZWFkbChncC0+cmVncyArIE1JRl9TVEFUVVMpOworCXUzMiByZWdfdmFsLCBjaGFuZ2VkX2JpdHM7CisKKwlyZWdfdmFsID0gKG1pZl9zdGF0dXMgJiBNSUZfU1RBVFVTX0RBVEEpID4+IDE2OworCWNoYW5nZWRfYml0cyA9IChtaWZfc3RhdHVzICYgTUlGX1NUQVRVU19TVEFUKTsKKworCWdlbV9oYW5kbGVfbWlmX2V2ZW50KGdwLCByZWdfdmFsLCBjaGFuZ2VkX2JpdHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VtX3BjaV9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGdlbSAqZ3AsIHUzMiBnZW1fc3RhdHVzKQoreworCXUzMiBwY2lfZXN0YXQgPSByZWFkbChncC0+cmVncyArIEdSRUdfUENJRVNUQVQpOworCisJaWYgKGdwLT5wZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9TVU4gJiYKKwkgICAgZ3AtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NVTl9HRU0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUENJIGVycm9yIFslMDR4XSAiLAorCQkgICAgICAgZGV2LT5uYW1lLCBwY2lfZXN0YXQpOworCisJCWlmIChwY2lfZXN0YXQgJiBHUkVHX1BDSUVTVEFUX0JBREFDSykKKwkJCXByaW50aygiPE5vIEFDSzY0IyBkdXJpbmcgQUJTNjQgY3ljbGU+ICIpOworCQlpZiAocGNpX2VzdGF0ICYgR1JFR19QQ0lFU1RBVF9EVFJUTykKKwkJCXByaW50aygiPERlbGF5ZWQgdHJhbnNhY3Rpb24gdGltZW91dD4gIik7CisJCWlmIChwY2lfZXN0YXQgJiBHUkVHX1BDSUVTVEFUX09USEVSKQorCQkJcHJpbnRrKCI8b3RoZXI+Iik7CisJCXByaW50aygiXG4iKTsKKwl9IGVsc2UgeworCQlwY2lfZXN0YXQgfD0gR1JFR19QQ0lFU1RBVF9PVEhFUjsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUENJIGVycm9yXG4iLCBkZXYtPm5hbWUpOworCX0KKworCWlmIChwY2lfZXN0YXQgJiBHUkVHX1BDSUVTVEFUX09USEVSKSB7CisJCXUxNiBwY2lfY2ZnX3N0YXQ7CisKKwkJLyogSW50ZXJyb2dhdGUgUENJIGNvbmZpZyBzcGFjZSBmb3IgdGhlCisJCSAqIHRydWUgY2F1c2UuCisJCSAqLworCQlwY2lfcmVhZF9jb25maWdfd29yZChncC0+cGRldiwgUENJX1NUQVRVUywKKwkJCQkgICAgICZwY2lfY2ZnX3N0YXQpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSZWFkIFBDSSBjZmcgc3BhY2Ugc3RhdHVzIFslMDR4XVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcGNpX2NmZ19zdGF0KTsKKwkJaWYgKHBjaV9jZmdfc3RhdCAmIFBDSV9TVEFUVVNfUEFSSVRZKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUENJIHBhcml0eSBlcnJvciBkZXRlY3RlZC5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJaWYgKHBjaV9jZmdfc3RhdCAmIFBDSV9TVEFUVVNfU0lHX1RBUkdFVF9BQk9SVCkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSB0YXJnZXQgYWJvcnQuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCWlmIChwY2lfY2ZnX3N0YXQgJiBQQ0lfU1RBVFVTX1JFQ19UQVJHRVRfQUJPUlQpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQQ0kgbWFzdGVyIGFja3MgdGFyZ2V0IGFib3J0LlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQlpZiAocGNpX2NmZ19zdGF0ICYgUENJX1NUQVRVU19SRUNfTUFTVEVSX0FCT1JUKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUENJIG1hc3RlciBhYm9ydC5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJaWYgKHBjaV9jZmdfc3RhdCAmIFBDSV9TVEFUVVNfU0lHX1NZU1RFTV9FUlJPUikKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSBzeXN0ZW0gZXJyb3IgU0VSUiMuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCWlmIChwY2lfY2ZnX3N0YXQgJiBQQ0lfU1RBVFVTX0RFVEVDVEVEX1BBUklUWSkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSBwYXJpdHkgZXJyb3IuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisKKwkJLyogV3JpdGUgdGhlIGVycm9yIGJpdHMgYmFjayB0byBjbGVhciB0aGVtLiAqLworCQlwY2lfY2ZnX3N0YXQgJj0gKFBDSV9TVEFUVVNfUEFSSVRZIHwKKwkJCQkgUENJX1NUQVRVU19TSUdfVEFSR0VUX0FCT1JUIHwKKwkJCQkgUENJX1NUQVRVU19SRUNfVEFSR0VUX0FCT1JUIHwKKwkJCQkgUENJX1NUQVRVU19SRUNfTUFTVEVSX0FCT1JUIHwKKwkJCQkgUENJX1NUQVRVU19TSUdfU1lTVEVNX0VSUk9SIHwKKwkJCQkgUENJX1NUQVRVU19ERVRFQ1RFRF9QQVJJVFkpOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZ3AtPnBkZXYsCisJCQkJICAgICAgUENJX1NUQVRVUywgcGNpX2NmZ19zdGF0KTsKKwl9CisKKwkvKiBGb3IgYWxsIFBDSSBlcnJvcnMsIHdlIHNob3VsZCByZXNldCB0aGUgY2hpcC4gKi8KKwlyZXR1cm4gMTsKK30KKworLyogQWxsIG5vbi1ub3JtYWwgaW50ZXJydXB0IGNvbmRpdGlvbnMgZ2V0IHNlcnZpY2VkIGhlcmUuCisgKiBSZXR1cm5zIG5vbi16ZXJvIGlmIHdlIHNob3VsZCBqdXN0IGV4aXQgdGhlIGludGVycnVwdAorICogaGFuZGxlciByaWdodCBub3cgKGllLiBpZiB3ZSByZXNldCB0aGUgY2FyZCB3aGljaCBpbnZhbGlkYXRlcworICogYWxsIG9mIHRoZSBvdGhlciBvcmlnaW5hbCBpcnEgc3RhdHVzIGJpdHMpLgorICovCitzdGF0aWMgaW50IGdlbV9hYm5vcm1hbF9pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGdlbSAqZ3AsIHUzMiBnZW1fc3RhdHVzKQoreworCWlmIChnZW1fc3RhdHVzICYgR1JFR19TVEFUX1JYTk9CVUYpIHsKKwkJLyogRnJhbWUgYXJyaXZlZCwgbm8gZnJlZSBSWCBidWZmZXJzIGF2YWlsYWJsZS4gKi8KKwkJaWYgKG5ldGlmX21zZ19yeF9lcnIoZ3ApKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBubyBidWZmZXIgZm9yIHJ4IGZyYW1lXG4iLAorCQkJCWdwLT5kZXYtPm5hbWUpOworCQlncC0+bmV0X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwl9CisKKwlpZiAoZ2VtX3N0YXR1cyAmIEdSRUdfU1RBVF9SWFRBR0VSUikgeworCQkvKiBjb3JydXB0IFJYIHRhZyBmcmFtaW5nICovCisJCWlmIChuZXRpZl9tc2dfcnhfZXJyKGdwKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogY29ycnVwdCByeCB0YWcgZnJhbWluZ1xuIiwKKwkJCQlncC0+ZGV2LT5uYW1lKTsKKwkJZ3AtPm5ldF9zdGF0cy5yeF9lcnJvcnMrKzsKKworCQlnb3RvIGRvX3Jlc2V0OworCX0KKworCWlmIChnZW1fc3RhdHVzICYgR1JFR19TVEFUX1BDUykgeworCQlpZiAoZ2VtX3Bjc19pbnRlcnJ1cHQoZGV2LCBncCwgZ2VtX3N0YXR1cykpCisJCQlnb3RvIGRvX3Jlc2V0OworCX0KKworCWlmIChnZW1fc3RhdHVzICYgR1JFR19TVEFUX1RYTUFDKSB7CisJCWlmIChnZW1fdHhtYWNfaW50ZXJydXB0KGRldiwgZ3AsIGdlbV9zdGF0dXMpKQorCQkJZ290byBkb19yZXNldDsKKwl9CisKKwlpZiAoZ2VtX3N0YXR1cyAmIEdSRUdfU1RBVF9SWE1BQykgeworCQlpZiAoZ2VtX3J4bWFjX2ludGVycnVwdChkZXYsIGdwLCBnZW1fc3RhdHVzKSkKKwkJCWdvdG8gZG9fcmVzZXQ7CisJfQorCisJaWYgKGdlbV9zdGF0dXMgJiBHUkVHX1NUQVRfTUFDKSB7CisJCWlmIChnZW1fbWFjX2ludGVycnVwdChkZXYsIGdwLCBnZW1fc3RhdHVzKSkKKwkJCWdvdG8gZG9fcmVzZXQ7CisJfQorCisJaWYgKGdlbV9zdGF0dXMgJiBHUkVHX1NUQVRfTUlGKSB7CisJCWlmIChnZW1fbWlmX2ludGVycnVwdChkZXYsIGdwLCBnZW1fc3RhdHVzKSkKKwkJCWdvdG8gZG9fcmVzZXQ7CisJfQorCisJaWYgKGdlbV9zdGF0dXMgJiBHUkVHX1NUQVRfUENJRVJSKSB7CisJCWlmIChnZW1fcGNpX2ludGVycnVwdChkZXYsIGdwLCBnZW1fc3RhdHVzKSkKKwkJCWdvdG8gZG9fcmVzZXQ7CisJfQorCisJcmV0dXJuIDA7CisKK2RvX3Jlc2V0OgorCWdwLT5yZXNldF90YXNrX3BlbmRpbmcgPSAxOworCXNjaGVkdWxlX3dvcmsoJmdwLT5yZXNldF90YXNrKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGdlbV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZ2VtICpncCwgdTMyIGdlbV9zdGF0dXMpCit7CisJaW50IGVudHJ5LCBsaW1pdDsKKworCWlmIChuZXRpZl9tc2dfaW50cihncCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHggaW50ZXJydXB0LCBnZW1fc3RhdHVzOiAweCV4XG4iLAorCQkJZ3AtPmRldi0+bmFtZSwgZ2VtX3N0YXR1cyk7CisKKwllbnRyeSA9IGdwLT50eF9vbGQ7CisJbGltaXQgPSAoKGdlbV9zdGF0dXMgJiBHUkVHX1NUQVRfVFhOUikgPj4gR1JFR19TVEFUX1RYTlJfU0hJRlQpOworCXdoaWxlIChlbnRyeSAhPSBsaW1pdCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlzdHJ1Y3QgZ2VtX3R4ZCAqdHhkOworCQlkbWFfYWRkcl90IGRtYV9hZGRyOworCQl1MzIgZG1hX2xlbjsKKwkJaW50IGZyYWc7CisKKwkJaWYgKG5ldGlmX21zZ190eF9kb25lKGdwKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHggZG9uZSwgc2xvdCAlZFxuIiwKKwkJCQlncC0+ZGV2LT5uYW1lLCBlbnRyeSk7CisJCXNrYiA9IGdwLT50eF9za2JzW2VudHJ5XTsKKwkJaWYgKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MpIHsKKwkJCWludCBsYXN0ID0gZW50cnkgKyBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCQkJaW50IHdhbGsgPSBlbnRyeTsKKwkJCWludCBpbmNvbXBsZXRlID0gMDsKKworCQkJbGFzdCAmPSAoVFhfUklOR19TSVpFIC0gMSk7CisJCQlmb3IgKDs7KSB7CisJCQkJd2FsayA9IE5FWFRfVFgod2Fsayk7CisJCQkJaWYgKHdhbGsgPT0gbGltaXQpCisJCQkJCWluY29tcGxldGUgPSAxOworCQkJCWlmICh3YWxrID09IGxhc3QpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGluY29tcGxldGUpCisJCQkJYnJlYWs7CisJCX0KKwkJZ3AtPnR4X3NrYnNbZW50cnldID0gTlVMTDsKKwkJZ3AtPm5ldF9zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCQlmb3IgKGZyYWcgPSAwOyBmcmFnIDw9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGZyYWcrKykgeworCQkJdHhkID0gJmdwLT5pbml0X2Jsb2NrLT50eGRbZW50cnldOworCisJCQlkbWFfYWRkciA9IGxlNjRfdG9fY3B1KHR4ZC0+YnVmZmVyKTsKKwkJCWRtYV9sZW4gPSBsZTY0X3RvX2NwdSh0eGQtPmNvbnRyb2xfd29yZCkgJiBUWERDVFJMX0JVRlNaOworCisJCQlwY2lfdW5tYXBfcGFnZShncC0+cGRldiwgZG1hX2FkZHIsIGRtYV9sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKKwkJfQorCisJCWdwLT5uZXRfc3RhdHMudHhfcGFja2V0cysrOworCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCX0KKwlncC0+dHhfb2xkID0gZW50cnk7CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCisJICAgIFRYX0JVRkZTX0FWQUlMKGdwKSA+IChNQVhfU0tCX0ZSQUdTICsgMSkpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBnZW1fcG9zdF9yeGRzKHN0cnVjdCBnZW0gKmdwLCBpbnQgbGltaXQpCit7CisJaW50IGNsdXN0ZXJfc3RhcnQsIGN1cnIsIGNvdW50LCBraWNrOworCisJY2x1c3Rlcl9zdGFydCA9IGN1cnIgPSAoZ3AtPnJ4X25ldyAmIH4oNCAtIDEpKTsKKwljb3VudCA9IDA7CisJa2ljayA9IC0xOworCXdtYigpOworCXdoaWxlIChjdXJyICE9IGxpbWl0KSB7CisJCWN1cnIgPSBORVhUX1JYKGN1cnIpOworCQlpZiAoKytjb3VudCA9PSA0KSB7CisJCQlzdHJ1Y3QgZ2VtX3J4ZCAqcnhkID0KKwkJCQkmZ3AtPmluaXRfYmxvY2stPnJ4ZFtjbHVzdGVyX3N0YXJ0XTsKKwkJCWZvciAoOzspIHsKKwkJCQlyeGQtPnN0YXR1c193b3JkID0gY3B1X3RvX2xlNjQoUlhEQ1RSTF9GUkVTSChncCkpOworCQkJCXJ4ZCsrOworCQkJCWNsdXN0ZXJfc3RhcnQgPSBORVhUX1JYKGNsdXN0ZXJfc3RhcnQpOworCQkJCWlmIChjbHVzdGVyX3N0YXJ0ID09IGN1cnIpCisJCQkJCWJyZWFrOworCQkJfQorCQkJa2ljayA9IGN1cnI7CisJCQljb3VudCA9IDA7CisJCX0KKwl9CisJaWYgKGtpY2sgPj0gMCkgeworCQltYigpOworCQl3cml0ZWwoa2ljaywgZ3AtPnJlZ3MgKyBSWERNQV9LSUNLKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ2VtX3J4KHN0cnVjdCBnZW0gKmdwLCBpbnQgd29ya190b19kbykKK3sKKwlpbnQgZW50cnksIGRyb3BzLCB3b3JrX2RvbmUgPSAwOworCXUzMiBkb25lOworCisJaWYgKG5ldGlmX21zZ19yeF9zdGF0dXMoZ3ApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJ4IGludGVycnVwdCwgZG9uZTogJWQsIHJ4X25ldzogJWRcbiIsCisJCQlncC0+ZGV2LT5uYW1lLCByZWFkbChncC0+cmVncyArIFJYRE1BX0RPTkUpLCBncC0+cnhfbmV3KTsKKworCWVudHJ5ID0gZ3AtPnJ4X25ldzsKKwlkcm9wcyA9IDA7CisJZG9uZSA9IHJlYWRsKGdwLT5yZWdzICsgUlhETUFfRE9ORSk7CisJZm9yICg7OykgeworCQlzdHJ1Y3QgZ2VtX3J4ZCAqcnhkID0gJmdwLT5pbml0X2Jsb2NrLT5yeGRbZW50cnldOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQl1NjQgc3RhdHVzID0gY3B1X3RvX2xlNjQocnhkLT5zdGF0dXNfd29yZCk7CisJCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJCWludCBsZW47CisKKwkJaWYgKChzdGF0dXMgJiBSWERDVFJMX09XTikgIT0gMCkKKwkJCWJyZWFrOworCisJCWlmICh3b3JrX2RvbmUgPj0gUlhfUklOR19TSVpFIHx8IHdvcmtfZG9uZSA+PSB3b3JrX3RvX2RvKQorCQkJYnJlYWs7CisKKwkJLyogV2hlbiB3cml0aW5nIGJhY2sgUlggZGVzY3JpcHRvciwgR0VNIHdyaXRlcyBzdGF0dXMKKwkJICogdGhlbiBidWZmZXIgYWRkcmVzcywgcG9zc2libHkgaW4gc2VwZXJhdGUgdHJhbnNhY3Rpb25zLgorCQkgKiBJZiB3ZSBkb24ndCB3YWl0IGZvciB0aGUgY2hpcCB0byB3cml0ZSBib3RoLCB3ZSBjb3VsZAorCQkgKiBwb3N0IGEgbmV3IGJ1ZmZlciB0byB0aGlzIGRlc2NyaXB0b3IgdGhlbiBoYXZlIEdFTSBzcGFtCisJCSAqIG9uIHRoZSBidWZmZXIgYWRkcmVzcy4gIFdlIHN5bmMgb24gdGhlIFJYIGNvbXBsZXRpb24KKwkJICogcmVnaXN0ZXIgdG8gcHJldmVudCB0aGlzIGZyb20gaGFwcGVuaW5nLgorCQkgKi8KKwkJaWYgKGVudHJ5ID09IGRvbmUpIHsKKwkJCWRvbmUgPSByZWFkbChncC0+cmVncyArIFJYRE1BX0RPTkUpOworCQkJaWYgKGVudHJ5ID09IGRvbmUpCisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBXZSBjYW4gbm93IGFjY291bnQgZm9yIHRoZSB3b3JrIHdlJ3JlIGFib3V0IHRvIGRvICovCisJCXdvcmtfZG9uZSsrOworCisJCXNrYiA9IGdwLT5yeF9za2JzW2VudHJ5XTsKKworCQlsZW4gPSAoc3RhdHVzICYgUlhEQ1RSTF9CVUZTWikgPj4gMTY7CisJCWlmICgobGVuIDwgRVRIX1pMRU4pIHx8IChzdGF0dXMgJiBSWERDVFJMX0JBRCkpIHsKKwkJCWdwLT5uZXRfc3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAobGVuIDwgRVRIX1pMRU4pCisJCQkJZ3AtPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpZiAobGVuICYgUlhEQ1RSTF9CQUQpCisJCQkJZ3AtPm5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisKKwkJCS8qIFdlJ2xsIGp1c3QgcmV0dXJuIGl0IHRvIEdFTS4gKi8KKwkJZHJvcF9pdDoKKwkJCWdwLT5uZXRfc3RhdHMucnhfZHJvcHBlZCsrOworCQkJZ290byBuZXh0OworCQl9CisKKwkJZG1hX2FkZHIgPSBjcHVfdG9fbGU2NChyeGQtPmJ1ZmZlcik7CisJCWlmIChsZW4gPiBSWF9DT1BZX1RIUkVTSE9MRCkgeworCQkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisKKwkJCW5ld19za2IgPSBnZW1fYWxsb2Nfc2tiKFJYX0JVRl9BTExPQ19TSVpFKGdwKSwgR0ZQX0FUT01JQyk7CisJCQlpZiAobmV3X3NrYiA9PSBOVUxMKSB7CisJCQkJZHJvcHMrKzsKKwkJCQlnb3RvIGRyb3BfaXQ7CisJCQl9CisJCQlwY2lfdW5tYXBfcGFnZShncC0+cGRldiwgZG1hX2FkZHIsCisJCQkJICAgICAgIFJYX0JVRl9BTExPQ19TSVpFKGdwKSwKKwkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWdwLT5yeF9za2JzW2VudHJ5XSA9IG5ld19za2I7CisJCQluZXdfc2tiLT5kZXYgPSBncC0+ZGV2OworCQkJc2tiX3B1dChuZXdfc2tiLCAoZ3AtPnJ4X2J1Zl9zeiArIFJYX09GRlNFVCkpOworCQkJcnhkLT5idWZmZXIgPSBjcHVfdG9fbGU2NChwY2lfbWFwX3BhZ2UoZ3AtPnBkZXYsCisJCQkJCQkJICAgICAgIHZpcnRfdG9fcGFnZShuZXdfc2tiLT5kYXRhKSwKKwkJCQkJCQkgICAgICAgb2Zmc2V0X2luX3BhZ2UobmV3X3NrYi0+ZGF0YSksCisJCQkJCQkJICAgICAgIFJYX0JVRl9BTExPQ19TSVpFKGdwKSwKKwkJCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCBSWF9PRkZTRVQpOworCisJCQkvKiBUcmltIHRoZSBvcmlnaW5hbCBza2IgZm9yIHRoZSBuZXRpZi4gKi8KKwkJCXNrYl90cmltKHNrYiwgbGVuKTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBza19idWZmICpjb3B5X3NrYiA9IGRldl9hbGxvY19za2IobGVuICsgMik7CisKKwkJCWlmIChjb3B5X3NrYiA9PSBOVUxMKSB7CisJCQkJZHJvcHMrKzsKKwkJCQlnb3RvIGRyb3BfaXQ7CisJCQl9CisKKwkJCWNvcHlfc2tiLT5kZXYgPSBncC0+ZGV2OworCQkJc2tiX3Jlc2VydmUoY29weV9za2IsIDIpOworCQkJc2tiX3B1dChjb3B5X3NrYiwgbGVuKTsKKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShncC0+cGRldiwgZG1hX2FkZHIsIGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCW1lbWNweShjb3B5X3NrYi0+ZGF0YSwgc2tiLT5kYXRhLCBsZW4pOworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGdwLT5wZGV2LCBkbWFfYWRkciwgbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQkvKiBXZSdsbCByZXVzZSB0aGUgb3JpZ2luYWwgcmluZyBidWZmZXIuICovCisJCQlza2IgPSBjb3B5X3NrYjsKKwkJfQorCisJCXNrYi0+Y3N1bSA9IG50b2hzKChzdGF0dXMgJiBSWERDVFJMX1RDUENTVU0pIF4gMHhmZmZmKTsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9IVzsKKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZ3AtPmRldik7CisKKwkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKworCQlncC0+bmV0X3N0YXRzLnJ4X3BhY2tldHMrKzsKKwkJZ3AtPm5ldF9zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJCWdwLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCisJbmV4dDoKKwkJZW50cnkgPSBORVhUX1JYKGVudHJ5KTsKKwl9CisKKwlnZW1fcG9zdF9yeGRzKGdwLCBlbnRyeSk7CisKKwlncC0+cnhfbmV3ID0gZW50cnk7CisKKwlpZiAoZHJvcHMpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZGVmZXJyaW5nIHBhY2tldC5cbiIsCisJCSAgICAgICBncC0+ZGV2LT5uYW1lKTsKKworCXJldHVybiB3b3JrX2RvbmU7Cit9CisKK3N0YXRpYyBpbnQgZ2VtX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpCit7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogTkFQSSBsb2NraW5nIG5pZ2h0bWFyZTogU2VlIGNvbW1lbnQgYXQgaGVhZCBvZiBkcml2ZXIgCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwLT5sb2NrLCBmbGFncyk7CisKKwlkbyB7CisJCWludCB3b3JrX3RvX2RvLCB3b3JrX2RvbmU7CisKKwkJLyogSGFuZGxlIGFub21hbGllcyAqLworCQlpZiAoZ3AtPnN0YXR1cyAmIEdSRUdfU1RBVF9BQk5PUk1BTCkgeworCQkJaWYgKGdlbV9hYm5vcm1hbF9pcnEoZGV2LCBncCwgZ3AtPnN0YXR1cykpCisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBSdW4gVFggY29tcGxldGlvbiB0aHJlYWQgKi8KKwkJc3Bpbl9sb2NrKCZncC0+dHhfbG9jayk7CisJCWdlbV90eChkZXYsIGdwLCBncC0+c3RhdHVzKTsKKwkJc3Bpbl91bmxvY2soJmdwLT50eF9sb2NrKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOworCisJCS8qIFJ1biBSWCB0aHJlYWQuIFdlIGRvbid0IHVzZSBhbnkgbG9ja2luZyBoZXJlLCAKKwkJICogY29kZSB3aWxsaW5nIHRvIGRvIGJhZCB0aGluZ3MgLSBsaWtlIGNsZWFuaW5nIHRoZSAKKwkJICogcnggcmluZyAtIG11c3QgY2FsbCBuZXRpZl9wb2xsX2Rpc2FibGUoKSwgd2hpY2gKKwkJICogc2NoZWR1bGVfdGltZW91dCgpJ3MgaWYgcG9sbGluZyBpcyBhbHJlYWR5IGRpc2FibGVkLgorCQkgKi8KKwkJd29ya190b19kbyA9IG1pbigqYnVkZ2V0LCBkZXYtPnF1b3RhKTsKKworCQl3b3JrX2RvbmUgPSBnZW1fcngoZ3AsIHdvcmtfdG9fZG8pOworCisJCSpidWRnZXQgLT0gd29ya19kb25lOworCQlkZXYtPnF1b3RhIC09IHdvcmtfZG9uZTsKKworCQlpZiAod29ya19kb25lID49IHdvcmtfdG9fZG8pCisJCQlyZXR1cm4gMTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKwkJCisJCWdwLT5zdGF0dXMgPSByZWFkbChncC0+cmVncyArIEdSRUdfU1RBVCk7CisJfSB3aGlsZSAoZ3AtPnN0YXR1cyAmIEdSRUdfU1RBVF9OQVBJKTsKKworCV9fbmV0aWZfcnhfY29tcGxldGUoZGV2KTsKKwlnZW1fZW5hYmxlX2ludHMoZ3ApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IGdlbV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBTd2FsbG93IGludGVycnVwdHMgd2hlbiBzaHV0dGluZyB0aGUgY2hpcCBkb3duLCB0aG91Z2gKKwkgKiB0aGF0IHNob3VsZG4ndCBoYXBwZW4sIHdlIHNob3VsZCBoYXZlIGRvbmUgZnJlZV9pcnEoKSBhdAorCSAqIHRoaXMgcG9pbnQuLi4KKwkgKi8KKwlpZiAoIWdwLT5ydW5uaW5nKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKwkKKwlpZiAobmV0aWZfcnhfc2NoZWR1bGVfcHJlcChkZXYpKSB7CisJCXUzMiBnZW1fc3RhdHVzID0gcmVhZGwoZ3AtPnJlZ3MgKyBHUkVHX1NUQVQpOworCisJCWlmIChnZW1fc3RhdHVzID09IDApIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gSVJRX05PTkU7CisJCX0KKwkJZ3AtPnN0YXR1cyA9IGdlbV9zdGF0dXM7CisJCWdlbV9kaXNhYmxlX2ludHMoZ3ApOworCQlfX25ldGlmX3J4X3NjaGVkdWxlKGRldik7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKyAgCisJLyogSWYgcG9sbGluZyB3YXMgZGlzYWJsZWQgYXQgdGhlIHRpbWUgd2UgcmVjZWl2ZWQgdGhhdAorCSAqIGludGVycnVwdCwgd2UgbWF5IHJldHVybiBJUlFfSEFORExFRCBoZXJlIHdoaWxlIHdlIAorCSAqIHNob3VsZCByZXR1cm4gSVJRX05PTkUuIE5vIGJpZyBkZWFsLi4uCisJICovCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIGdlbV9wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBnZW1faW50ZXJydXB0IGlzIHNhZmUgdG8gcmVlbnRyYW5jZSBzbyBubyBuZWVkCisJICogdG8gZGlzYWJsZV9pcnEgaGVyZS4KKwkgKi8KKwlnZW1faW50ZXJydXB0KGRldi0+aXJxLCBkZXYsIE5VTEwpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGdlbV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisKKwlwcmludGsoS0VSTl9FUlIgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHJlc2V0dGluZ1xuIiwgZGV2LT5uYW1lKTsKKwlpZiAoIWdwLT5ydW5uaW5nKSB7CisJCXByaW50aygiJXM6IGhybS4uIGh3IG5vdCBydW5uaW5nICFcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJcHJpbnRrKEtFUk5fRVJSICIlczogVFhfU1RBVEVbJTA4eDolMDh4OiUwOHhdXG4iLAorCSAgICAgICBkZXYtPm5hbWUsCisJICAgICAgIHJlYWRsKGdwLT5yZWdzICsgVFhETUFfQ0ZHKSwKKwkgICAgICAgcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfVFhTVEFUKSwKKwkgICAgICAgcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfVFhDRkcpKTsKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBSWF9TVEFURVslMDh4OiUwOHg6JTA4eF1cbiIsCisJICAgICAgIGRldi0+bmFtZSwKKwkgICAgICAgcmVhZGwoZ3AtPnJlZ3MgKyBSWERNQV9DRkcpLAorCSAgICAgICByZWFkbChncC0+cmVncyArIE1BQ19SWFNUQVQpLAorCSAgICAgICByZWFkbChncC0+cmVncyArIE1BQ19SWENGRykpOworCisJc3Bpbl9sb2NrX2lycSgmZ3AtPmxvY2spOworCXNwaW5fbG9jaygmZ3AtPnR4X2xvY2spOworCisJZ3AtPnJlc2V0X3Rhc2tfcGVuZGluZyA9IDE7CisJc2NoZWR1bGVfd29yaygmZ3AtPnJlc2V0X3Rhc2spOworCisJc3Bpbl91bmxvY2soJmdwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmdwLT5sb2NrKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IGdlbV9pbnRtZShpbnQgZW50cnkpCit7CisJLyogQWxnb3JpdGhtOiBJUlEgZXZlcnkgMS8yIG9mIGRlc2NyaXB0b3JzLiAqLworCWlmICghKGVudHJ5ICYgKChUWF9SSU5HX1NJWkU+PjEpLTEpKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZW1fc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCWludCBlbnRyeTsKKwl1NjQgY3RybDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY3RybCA9IDA7CisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSB7CisJCXU2NCBjc3VtX3N0YXJ0X29mZiwgY3N1bV9zdHVmZl9vZmY7CisKKwkJY3N1bV9zdGFydF9vZmYgPSAodTY0KSAoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSk7CisJCWNzdW1fc3R1ZmZfb2ZmID0gKHU2NCkgKChza2ItPmgucmF3ICsgc2tiLT5jc3VtKSAtIHNrYi0+ZGF0YSk7CisKKwkJY3RybCA9IChUWERDVFJMX0NFTkFCIHwKKwkJCShjc3VtX3N0YXJ0X29mZiA8PCAxNSkgfAorCQkJKGNzdW1fc3R1ZmZfb2ZmIDw8IDIxKSk7CisJfQorCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmICghc3Bpbl90cnlsb2NrKCZncC0+dHhfbG9jaykpIHsKKwkJLyogVGVsbCB1cHBlciBsYXllciB0byByZXF1ZXVlICovCisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9MT0NLRUQ7CisJfQorCS8qIFdlIHJhY2VkIHdpdGggZ2VtX2RvX3N0b3AoKSAqLworCWlmICghZ3AtPnJ1bm5pbmcpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPnR4X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCX0KKworCS8qIFRoaXMgaXMgYSBoYXJkIGVycm9yLCBsb2cgaXQuICovCisJaWYgKFRYX0JVRkZTX0FWQUlMKGdwKSA8PSAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDEpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPnR4X2xvY2ssIGZsYWdzKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEJVRyEgVHggUmluZyBmdWxsIHdoZW4gcXVldWUgYXdha2UhXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCX0KKworCWVudHJ5ID0gZ3AtPnR4X25ldzsKKwlncC0+dHhfc2tic1tlbnRyeV0gPSBza2I7CisKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9PSAwKSB7CisJCXN0cnVjdCBnZW1fdHhkICp0eGQgPSAmZ3AtPmluaXRfYmxvY2stPnR4ZFtlbnRyeV07CisJCWRtYV9hZGRyX3QgbWFwcGluZzsKKwkJdTMyIGxlbjsKKworCQlsZW4gPSBza2ItPmxlbjsKKwkJbWFwcGluZyA9IHBjaV9tYXBfcGFnZShncC0+cGRldiwKKwkJCQkgICAgICAgdmlydF90b19wYWdlKHNrYi0+ZGF0YSksCisJCQkJICAgICAgIG9mZnNldF9pbl9wYWdlKHNrYi0+ZGF0YSksCisJCQkJICAgICAgIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCWN0cmwgfD0gVFhEQ1RSTF9TT0YgfCBUWERDVFJMX0VPRiB8IGxlbjsKKwkJaWYgKGdlbV9pbnRtZShlbnRyeSkpCisJCQljdHJsIHw9IFRYRENUUkxfSU5UTUU7CisJCXR4ZC0+YnVmZmVyID0gY3B1X3RvX2xlNjQobWFwcGluZyk7CisJCXdtYigpOworCQl0eGQtPmNvbnRyb2xfd29yZCA9IGNwdV90b19sZTY0KGN0cmwpOworCQllbnRyeSA9IE5FWFRfVFgoZW50cnkpOworCX0gZWxzZSB7CisJCXN0cnVjdCBnZW1fdHhkICp0eGQ7CisJCXUzMiBmaXJzdF9sZW47CisJCXU2NCBpbnRtZTsKKwkJZG1hX2FkZHJfdCBmaXJzdF9tYXBwaW5nOworCQlpbnQgZnJhZywgZmlyc3RfZW50cnkgPSBlbnRyeTsKKworCQlpbnRtZSA9IDA7CisJCWlmIChnZW1faW50bWUoZW50cnkpKQorCQkJaW50bWUgfD0gVFhEQ1RSTF9JTlRNRTsKKworCQkvKiBXZSBtdXN0IGdpdmUgdGhpcyBpbml0aWFsIGNodW5rIHRvIHRoZSBkZXZpY2UgbGFzdC4KKwkJICogT3RoZXJ3aXNlIHdlIGNvdWxkIHJhY2Ugd2l0aCB0aGUgZGV2aWNlLgorCQkgKi8KKwkJZmlyc3RfbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKKwkJZmlyc3RfbWFwcGluZyA9IHBjaV9tYXBfcGFnZShncC0+cGRldiwgdmlydF90b19wYWdlKHNrYi0+ZGF0YSksCisJCQkJCSAgICAgb2Zmc2V0X2luX3BhZ2Uoc2tiLT5kYXRhKSwKKwkJCQkJICAgICBmaXJzdF9sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQllbnRyeSA9IE5FWFRfVFgoZW50cnkpOworCisJCWZvciAoZnJhZyA9IDA7IGZyYWcgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBmcmFnKyspIHsKKwkJCXNrYl9mcmFnX3QgKnRoaXNfZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ZyYWddOworCQkJdTMyIGxlbjsKKwkJCWRtYV9hZGRyX3QgbWFwcGluZzsKKwkJCXU2NCB0aGlzX2N0cmw7CisKKwkJCWxlbiA9IHRoaXNfZnJhZy0+c2l6ZTsKKwkJCW1hcHBpbmcgPSBwY2lfbWFwX3BhZ2UoZ3AtPnBkZXYsCisJCQkJCSAgICAgICB0aGlzX2ZyYWctPnBhZ2UsCisJCQkJCSAgICAgICB0aGlzX2ZyYWctPnBhZ2Vfb2Zmc2V0LAorCQkJCQkgICAgICAgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCXRoaXNfY3RybCA9IGN0cmw7CisJCQlpZiAoZnJhZyA9PSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzIC0gMSkKKwkJCQl0aGlzX2N0cmwgfD0gVFhEQ1RSTF9FT0Y7CisJCQkKKwkJCXR4ZCA9ICZncC0+aW5pdF9ibG9jay0+dHhkW2VudHJ5XTsKKwkJCXR4ZC0+YnVmZmVyID0gY3B1X3RvX2xlNjQobWFwcGluZyk7CisJCQl3bWIoKTsKKwkJCXR4ZC0+Y29udHJvbF93b3JkID0gY3B1X3RvX2xlNjQodGhpc19jdHJsIHwgbGVuKTsKKworCQkJaWYgKGdlbV9pbnRtZShlbnRyeSkpCisJCQkJaW50bWUgfD0gVFhEQ1RSTF9JTlRNRTsKKworCQkJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKKwkJfQorCQl0eGQgPSAmZ3AtPmluaXRfYmxvY2stPnR4ZFtmaXJzdF9lbnRyeV07CisJCXR4ZC0+YnVmZmVyID0gY3B1X3RvX2xlNjQoZmlyc3RfbWFwcGluZyk7CisJCXdtYigpOworCQl0eGQtPmNvbnRyb2xfd29yZCA9CisJCQljcHVfdG9fbGU2NChjdHJsIHwgVFhEQ1RSTF9TT0YgfCBpbnRtZSB8IGZpcnN0X2xlbik7CisJfQorCisJZ3AtPnR4X25ldyA9IGVudHJ5OworCWlmIChUWF9CVUZGU19BVkFJTChncCkgPD0gKE1BWF9TS0JfRlJBR1MgKyAxKSkKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKG5ldGlmX21zZ190eF9xdWV1ZWQoZ3ApKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR4IHF1ZXVlZCwgc2xvdCAlZCwgc2tibGVuICVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlbnRyeSwgc2tiLT5sZW4pOworCW1iKCk7CisJd3JpdGVsKGdwLT50eF9uZXcsIGdwLT5yZWdzICsgVFhETUFfS0lDSyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPnR4X2xvY2ssIGZsYWdzKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworI2RlZmluZSBTVE9QX1RSSUVTIDMyCisKKy8qIE11c3QgYmUgaW52b2tlZCB1bmRlciBncC0+bG9jayBhbmQgZ3AtPnR4X2xvY2suICovCitzdGF0aWMgdm9pZCBnZW1fcmVzZXQoc3RydWN0IGdlbSAqZ3ApCit7CisJaW50IGxpbWl0OworCXUzMiB2YWw7CisKKwkvKiBNYWtlIHN1cmUgd2Ugd29uJ3QgZ2V0IGFueSBtb3JlIGludGVycnVwdHMgKi8KKwl3cml0ZWwoMHhmZmZmZmZmZiwgZ3AtPnJlZ3MgKyBHUkVHX0lNQVNLKTsKKworCS8qIFJlc2V0IHRoZSBjaGlwICovCisJd3JpdGVsKGdwLT5zd3JzdF9iYXNlIHwgR1JFR19TV1JTVF9UWFJTVCB8IEdSRUdfU1dSU1RfUlhSU1QsCisJICAgICAgIGdwLT5yZWdzICsgR1JFR19TV1JTVCk7CisKKwlsaW1pdCA9IFNUT1BfVFJJRVM7CisKKwlkbyB7CisJCXVkZWxheSgyMCk7CisJCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgR1JFR19TV1JTVCk7CisJCWlmIChsaW1pdC0tIDw9IDApCisJCQlicmVhazsKKwl9IHdoaWxlICh2YWwgJiAoR1JFR19TV1JTVF9UWFJTVCB8IEdSRUdfU1dSU1RfUlhSU1QpKTsKKworCWlmIChsaW1pdCA8PSAwKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBTVyByZXNldCBpcyBnaGV0dG8uXG4iLCBncC0+ZGV2LT5uYW1lKTsKK30KKworLyogTXVzdCBiZSBpbnZva2VkIHVuZGVyIGdwLT5sb2NrIGFuZCBncC0+dHhfbG9jay4gKi8KK3N0YXRpYyB2b2lkIGdlbV9zdGFydF9kbWEoc3RydWN0IGdlbSAqZ3ApCit7CisJdTMyIHZhbDsKKwkKKwkvKiBXZSBhcmUgcmVhZHkgdG8gcm9jaywgdHVybiBldmVyeXRoaW5nIG9uLiAqLworCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgVFhETUFfQ0ZHKTsKKwl3cml0ZWwodmFsIHwgVFhETUFfQ0ZHX0VOQUJMRSwgZ3AtPnJlZ3MgKyBUWERNQV9DRkcpOworCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgUlhETUFfQ0ZHKTsKKwl3cml0ZWwodmFsIHwgUlhETUFfQ0ZHX0VOQUJMRSwgZ3AtPnJlZ3MgKyBSWERNQV9DRkcpOworCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgTUFDX1RYQ0ZHKTsKKwl3cml0ZWwodmFsIHwgTUFDX1RYQ0ZHX0VOQUIsIGdwLT5yZWdzICsgTUFDX1RYQ0ZHKTsKKwl2YWwgPSByZWFkbChncC0+cmVncyArIE1BQ19SWENGRyk7CisJd3JpdGVsKHZhbCB8IE1BQ19SWENGR19FTkFCLCBncC0+cmVncyArIE1BQ19SWENGRyk7CisKKwkodm9pZCkgcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpOworCXVkZWxheSgxMDApOworCisJZ2VtX2VuYWJsZV9pbnRzKGdwKTsKKworCXdyaXRlbChSWF9SSU5HX1NJWkUgLSA0LCBncC0+cmVncyArIFJYRE1BX0tJQ0spOworfQorCisvKiBNdXN0IGJlIGludm9rZWQgdW5kZXIgZ3AtPmxvY2sgYW5kIGdwLT50eF9sb2NrLiBETUEgd29uJ3QgYmUKKyAqIGFjdHVhbGx5IHN0b3BwZWQgYmVmb3JlIGFib3V0IDRtcyB0aG8gLi4uCisgKi8KK3N0YXRpYyB2b2lkIGdlbV9zdG9wX2RtYShzdHJ1Y3QgZ2VtICpncCkKK3sKKwl1MzIgdmFsOworCisJLyogV2UgYXJlIGRvbmUgcm9ja2luZywgdHVybiBldmVyeXRoaW5nIG9mZi4gKi8KKwl2YWwgPSByZWFkbChncC0+cmVncyArIFRYRE1BX0NGRyk7CisJd3JpdGVsKHZhbCAmIH5UWERNQV9DRkdfRU5BQkxFLCBncC0+cmVncyArIFRYRE1BX0NGRyk7CisJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBSWERNQV9DRkcpOworCXdyaXRlbCh2YWwgJiB+UlhETUFfQ0ZHX0VOQUJMRSwgZ3AtPnJlZ3MgKyBSWERNQV9DRkcpOworCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgTUFDX1RYQ0ZHKTsKKwl3cml0ZWwodmFsICYgfk1BQ19UWENGR19FTkFCLCBncC0+cmVncyArIE1BQ19UWENGRyk7CisJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpOworCXdyaXRlbCh2YWwgJiB+TUFDX1JYQ0ZHX0VOQUIsIGdwLT5yZWdzICsgTUFDX1JYQ0ZHKTsKKworCSh2b2lkKSByZWFkbChncC0+cmVncyArIE1BQ19SWENGRyk7CisKKwkvKiBOZWVkIHRvIHdhaXQgYSBiaXQgLi4uIGRvbmUgYnkgdGhlIGNhbGxlciAqLworfQorCisKKy8qIE11c3QgYmUgaW52b2tlZCB1bmRlciBncC0+bG9jayBhbmQgZ3AtPnR4X2xvY2suICovCisvLyBYWFggZGJsIGNoZWNrIHdoYXQgdGhhdCBmdW5jdGlvbiBzaG91bGQgZG8gd2hlbiBjYWxsZWQgb24gUENTIFBIWQorc3RhdGljIHZvaWQgZ2VtX2JlZ2luX2F1dG9fbmVnb3RpYXRpb24oc3RydWN0IGdlbSAqZ3AsIHN0cnVjdCBldGh0b29sX2NtZCAqZXApCit7CisJdTMyIGFkdmVydGlzZSwgZmVhdHVyZXM7CisJaW50IGF1dG9uZWc7CisJaW50IHNwZWVkOworCWludCBkdXBsZXg7CisKKwlpZiAoZ3AtPnBoeV90eXBlICE9IHBoeV9taWlfbWRpbzAgJiYKKyAgICAgCSAgICBncC0+cGh5X3R5cGUgIT0gcGh5X21paV9tZGlvMSkKKyAgICAgCSAgICAJZ290byBub25fbWlpOworCisJLyogU2V0dXAgYWR2ZXJ0aXNlICovCisJaWYgKGZvdW5kX21paV9waHkoZ3ApKQorCQlmZWF0dXJlcyA9IGdwLT5waHlfbWlpLmRlZi0+ZmVhdHVyZXM7CisJZWxzZQorCQlmZWF0dXJlcyA9IDA7CisKKwlhZHZlcnRpc2UgPSBmZWF0dXJlcyAmIEFEVkVSVElTRV9NQVNLOworCWlmIChncC0+cGh5X21paS5hZHZlcnRpc2luZyAhPSAwKQorCQlhZHZlcnRpc2UgJj0gZ3AtPnBoeV9taWkuYWR2ZXJ0aXNpbmc7CisKKwlhdXRvbmVnID0gZ3AtPndhbnRfYXV0b25lZzsKKwlzcGVlZCA9IGdwLT5waHlfbWlpLnNwZWVkOworCWR1cGxleCA9IGdwLT5waHlfbWlpLmR1cGxleDsKKwkKKwkvKiBTZXR1cCBsaW5rIHBhcmFtZXRlcnMgKi8KKwlpZiAoIWVwKQorCQlnb3RvIHN0YXJ0X2FuZWc7CisJaWYgKGVwLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCWFkdmVydGlzZSA9IGVwLT5hZHZlcnRpc2luZzsKKwkJYXV0b25lZyA9IDE7CisJfSBlbHNlIHsKKwkJYXV0b25lZyA9IDA7CisJCXNwZWVkID0gZXAtPnNwZWVkOworCQlkdXBsZXggPSBlcC0+ZHVwbGV4OworCX0KKworc3RhcnRfYW5lZzoKKwkvKiBTYW5pdGl6ZSBzZXR0aW5ncyBiYXNlZCBvbiBQSFkgY2FwYWJpbGl0aWVzICovCisJaWYgKChmZWF0dXJlcyAmIFNVUFBPUlRFRF9BdXRvbmVnKSA9PSAwKQorCQlhdXRvbmVnID0gMDsKKwlpZiAoc3BlZWQgPT0gU1BFRURfMTAwMCAmJgorCSAgICAhKGZlYXR1cmVzICYgKFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCkpKQorCQlzcGVlZCA9IFNQRUVEXzEwMDsKKwlpZiAoc3BlZWQgPT0gU1BFRURfMTAwICYmCisJICAgICEoZmVhdHVyZXMgJiAoU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCkpKQorCQlzcGVlZCA9IFNQRUVEXzEwOworCWlmIChkdXBsZXggPT0gRFVQTEVYX0ZVTEwgJiYKKwkgICAgIShmZWF0dXJlcyAmIChTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfAorCSAgICAJCSAgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfAorCSAgICAJCSAgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCkpKQorCSAgICAJZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJaWYgKHNwZWVkID09IDApCisJCXNwZWVkID0gU1BFRURfMTA7CisJCisJLyogSWYgd2UgYXJlIGFzbGVlcCwgd2UgZG9uJ3QgdHJ5IHRvIGFjdHVhbGx5IHNldHVwIHRoZSBQSFksIHdlCisJICoganVzdCBzdG9yZSB0aGUgc2V0dGluZ3MKKwkgKi8KKwlpZiAoZ3AtPmFzbGVlcCkgeworCQlncC0+cGh5X21paS5hdXRvbmVnID0gZ3AtPndhbnRfYXV0b25lZyA9IGF1dG9uZWc7CisJCWdwLT5waHlfbWlpLnNwZWVkID0gc3BlZWQ7CisJCWdwLT5waHlfbWlpLmR1cGxleCA9IGR1cGxleDsKKwkJcmV0dXJuOworCX0KKworCS8qIENvbmZpZ3VyZSBQSFkgJiBzdGFydCBhbmVnICovCisJZ3AtPndhbnRfYXV0b25lZyA9IGF1dG9uZWc7CisJaWYgKGF1dG9uZWcpIHsKKwkJaWYgKGZvdW5kX21paV9waHkoZ3ApKQorCQkJZ3AtPnBoeV9taWkuZGVmLT5vcHMtPnNldHVwX2FuZWcoJmdwLT5waHlfbWlpLCBhZHZlcnRpc2UpOworCQlncC0+bHN0YXRlID0gbGlua19hbmVnOworCX0gZWxzZSB7CisJCWlmIChmb3VuZF9taWlfcGh5KGdwKSkKKwkJCWdwLT5waHlfbWlpLmRlZi0+b3BzLT5zZXR1cF9mb3JjZWQoJmdwLT5waHlfbWlpLCBzcGVlZCwgZHVwbGV4KTsKKwkJZ3AtPmxzdGF0ZSA9IGxpbmtfZm9yY2Vfb2s7CisJfQorCitub25fbWlpOgorCWdwLT50aW1lcl90aWNrcyA9IDA7CisJbW9kX3RpbWVyKCZncC0+bGlua190aW1lciwgamlmZmllcyArICgoMTIgKiBIWikgLyAxMCkpOworfQorCisvKiBBIGxpbmstdXAgY29uZGl0aW9uIGhhcyBvY2N1cnJlZCwgaW5pdGlhbGl6ZSBhbmQgZW5hYmxlIHRoZQorICogcmVzdCBvZiB0aGUgY2hpcC4KKyAqCisgKiBNdXN0IGJlIGludm9rZWQgdW5kZXIgZ3AtPmxvY2sgYW5kIGdwLT50eF9sb2NrLgorICovCitzdGF0aWMgaW50IGdlbV9zZXRfbGlua19tb2RlcyhzdHJ1Y3QgZ2VtICpncCkKK3sKKwl1MzIgdmFsOworCWludCBmdWxsX2R1cGxleCwgc3BlZWQsIHBhdXNlOworCisJZnVsbF9kdXBsZXggPSAwOworCXNwZWVkID0gU1BFRURfMTA7CisJcGF1c2UgPSAwOworCisJaWYgKGZvdW5kX21paV9waHkoZ3ApKSB7CisJICAgIAlpZiAoZ3AtPnBoeV9taWkuZGVmLT5vcHMtPnJlYWRfbGluaygmZ3AtPnBoeV9taWkpKQorCSAgICAJCXJldHVybiAxOworCQlmdWxsX2R1cGxleCA9IChncC0+cGh5X21paS5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpOworCQlzcGVlZCA9IGdwLT5waHlfbWlpLnNwZWVkOworCQlwYXVzZSA9IGdwLT5waHlfbWlpLnBhdXNlOworCX0gZWxzZSBpZiAoZ3AtPnBoeV90eXBlID09IHBoeV9zZXJpYWxpbmsgfHwKKwkgICAgCSAgIGdwLT5waHlfdHlwZSA9PSBwaHlfc2VyZGVzKSB7CisJCXUzMiBwY3NfbHBhID0gcmVhZGwoZ3AtPnJlZ3MgKyBQQ1NfTUlJTFApOworCisJCWlmIChwY3NfbHBhICYgUENTX01JSUFEVl9GRCkKKwkJCWZ1bGxfZHVwbGV4ID0gMTsKKwkJc3BlZWQgPSBTUEVFRF8xMDAwOworCX0KKworCWlmIChuZXRpZl9tc2dfbGluayhncCkpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rIGlzIHVwIGF0ICVkIE1icHMsICVzLWR1cGxleC5cbiIsCisJCQlncC0+ZGV2LT5uYW1lLCBzcGVlZCwgKGZ1bGxfZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiKSk7CisKKwlpZiAoIWdwLT5ydW5uaW5nKQorCQlyZXR1cm4gMDsKKworCXZhbCA9IChNQUNfVFhDRkdfRUlQRzAgfCBNQUNfVFhDRkdfTkdVKTsKKwlpZiAoZnVsbF9kdXBsZXgpIHsKKwkJdmFsIHw9IChNQUNfVFhDRkdfSUNTIHwgTUFDX1RYQ0ZHX0lDT0xMKTsKKwl9IGVsc2UgeworCQkvKiBNQUNfVFhDRkdfTkJPIG11c3QgYmUgemVyby4gKi8KKwl9CQorCXdyaXRlbCh2YWwsIGdwLT5yZWdzICsgTUFDX1RYQ0ZHKTsKKworCXZhbCA9IChNQUNfWElGQ0ZHX09FIHwgTUFDX1hJRkNGR19MTEVEKTsKKwlpZiAoIWZ1bGxfZHVwbGV4ICYmCisJICAgIChncC0+cGh5X3R5cGUgPT0gcGh5X21paV9tZGlvMCB8fAorCSAgICAgZ3AtPnBoeV90eXBlID09IHBoeV9taWlfbWRpbzEpKSB7CisJCXZhbCB8PSBNQUNfWElGQ0ZHX0RJU0U7CisJfSBlbHNlIGlmIChmdWxsX2R1cGxleCkgeworCQl2YWwgfD0gTUFDX1hJRkNGR19GTEVEOworCX0KKworCWlmIChzcGVlZCA9PSBTUEVFRF8xMDAwKQorCQl2YWwgfD0gKE1BQ19YSUZDRkdfR01JSSk7CisKKwl3cml0ZWwodmFsLCBncC0+cmVncyArIE1BQ19YSUZDRkcpOworCisJLyogSWYgZ2lnYWJpdCBhbmQgaGFsZi1kdXBsZXgsIGVuYWJsZSBjYXJyaWVyIGV4dGVuc2lvbgorCSAqIG1vZGUuICBFbHNlLCBkaXNhYmxlIGl0LgorCSAqLworCWlmIChzcGVlZCA9PSBTUEVFRF8xMDAwICYmICFmdWxsX2R1cGxleCkgeworCQl2YWwgPSByZWFkbChncC0+cmVncyArIE1BQ19UWENGRyk7CisJCXdyaXRlbCh2YWwgfCBNQUNfVFhDRkdfVENFLCBncC0+cmVncyArIE1BQ19UWENGRyk7CisKKwkJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpOworCQl3cml0ZWwodmFsIHwgTUFDX1JYQ0ZHX1JDRSwgZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpOworCX0gZWxzZSB7CisJCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgTUFDX1RYQ0ZHKTsKKwkJd3JpdGVsKHZhbCAmIH5NQUNfVFhDRkdfVENFLCBncC0+cmVncyArIE1BQ19UWENGRyk7CisKKwkJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpOworCQl3cml0ZWwodmFsICYgfk1BQ19SWENGR19SQ0UsIGdwLT5yZWdzICsgTUFDX1JYQ0ZHKTsKKwl9CisKKwlpZiAoZ3AtPnBoeV90eXBlID09IHBoeV9zZXJpYWxpbmsgfHwKKwkgICAgZ3AtPnBoeV90eXBlID09IHBoeV9zZXJkZXMpIHsKKyAJCXUzMiBwY3NfbHBhID0gcmVhZGwoZ3AtPnJlZ3MgKyBQQ1NfTUlJTFApOworCisJCWlmIChwY3NfbHBhICYgKFBDU19NSUlBRFZfU1AgfCBQQ1NfTUlJQURWX0FQKSkKKwkJCXBhdXNlID0gMTsKKwl9CisKKwlpZiAobmV0aWZfbXNnX2xpbmsoZ3ApKSB7CisJCWlmIChwYXVzZSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBhdXNlIGlzIGVuYWJsZWQgIgorCQkJICAgICAgICIocnhmaWZvOiAlZCBvZmY6ICVkIG9uOiAlZClcbiIsCisJCQkgICAgICAgZ3AtPmRldi0+bmFtZSwKKwkJCSAgICAgICBncC0+cnhfZmlmb19zeiwKKwkJCSAgICAgICBncC0+cnhfcGF1c2Vfb2ZmLAorCQkJICAgICAgIGdwLT5yeF9wYXVzZV9vbik7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUGF1c2UgaXMgZGlzYWJsZWRcbiIsCisJCQkgICAgICAgZ3AtPmRldi0+bmFtZSk7CisJCX0KKwl9CisKKwlpZiAoIWZ1bGxfZHVwbGV4KQorCQl3cml0ZWwoNTEyLCBncC0+cmVncyArIE1BQ19TVElNRSk7CisJZWxzZQorCQl3cml0ZWwoNjQsIGdwLT5yZWdzICsgTUFDX1NUSU1FKTsKKwl2YWwgPSByZWFkbChncC0+cmVncyArIE1BQ19NQ0NGRyk7CisJaWYgKHBhdXNlKQorCQl2YWwgfD0gKE1BQ19NQ0NGR19TUEUgfCBNQUNfTUNDRkdfUlBFKTsKKwllbHNlCisJCXZhbCAmPSB+KE1BQ19NQ0NGR19TUEUgfCBNQUNfTUNDRkdfUlBFKTsKKwl3cml0ZWwodmFsLCBncC0+cmVncyArIE1BQ19NQ0NGRyk7CisKKwlnZW1fc3RhcnRfZG1hKGdwKTsKKworCXJldHVybiAwOworfQorCisvKiBNdXN0IGJlIGludm9rZWQgdW5kZXIgZ3AtPmxvY2sgYW5kIGdwLT50eF9sb2NrLiAqLworc3RhdGljIGludCBnZW1fbWRpb19saW5rX25vdF91cChzdHJ1Y3QgZ2VtICpncCkKK3sKKwlzd2l0Y2ggKGdwLT5sc3RhdGUpIHsKKwljYXNlIGxpbmtfZm9yY2VfcmV0OgorCQlpZiAobmV0aWZfbXNnX2xpbmsoZ3ApKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEF1dG9uZWcgZmFpbGVkIGFnYWluLCBrZWVwaW5nIgorCQkJCSIgZm9yY2VkIG1vZGVcbiIsIGdwLT5kZXYtPm5hbWUpOworCQlncC0+cGh5X21paS5kZWYtPm9wcy0+c2V0dXBfZm9yY2VkKCZncC0+cGh5X21paSwKKwkJCWdwLT5sYXN0X2ZvcmNlZF9zcGVlZCwgRFVQTEVYX0hBTEYpOworCQlncC0+dGltZXJfdGlja3MgPSA1OworCQlncC0+bHN0YXRlID0gbGlua19mb3JjZV9vazsKKwkJcmV0dXJuIDA7CisJY2FzZSBsaW5rX2FuZWc6CisJCS8qIFdlIHRyeSBmb3JjZWQgbW9kZXMgYWZ0ZXIgYSBmYWlsZWQgYW5lZyBvbmx5IG9uIFBIWXMgdGhhdCBkb24ndAorCQkgKiBoYXZlICJtYWdpY19hbmVnIiBiaXQgc2V0LCB3aGljaCBtZWFucyB0aGV5IGludGVybmFsbHkgZG8gdGhlCisJCSAqIHdoaWxlIGZvcmNlZC1tb2RlIHRoaW5neS4gT24gdGhlc2UsIHdlIGp1c3QgcmVzdGFydCBhbmVnCisJCSAqLworCQlpZiAoZ3AtPnBoeV9taWkuZGVmLT5tYWdpY19hbmVnKQorCQkJcmV0dXJuIDE7CisJCWlmIChuZXRpZl9tc2dfbGluayhncCkpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogc3dpdGNoaW5nIHRvIGZvcmNlZCAxMDBidFxuIiwKKwkJCQlncC0+ZGV2LT5uYW1lKTsKKwkJLyogVHJ5IGZvcmNlZCBtb2Rlcy4gKi8KKwkJZ3AtPnBoeV9taWkuZGVmLT5vcHMtPnNldHVwX2ZvcmNlZCgmZ3AtPnBoeV9taWksIFNQRUVEXzEwMCwKKwkJCURVUExFWF9IQUxGKTsKKwkJZ3AtPnRpbWVyX3RpY2tzID0gNTsKKwkJZ3AtPmxzdGF0ZSA9IGxpbmtfZm9yY2VfdHJ5OworCQlyZXR1cm4gMDsKKwljYXNlIGxpbmtfZm9yY2VfdHJ5OgorCQkvKiBEb3duZ3JhZGUgZnJvbSAxMDAgdG8gMTAgTWJwcyBpZiBuZWNlc3NhcnkuCisJCSAqIElmIGFscmVhZHkgYXQgMTBNYnBzLCB3YXJuIHVzZXIgYWJvdXQgdGhlCisJCSAqIHNpdHVhdGlvbiBldmVyeSAxMCB0aWNrcy4KKwkJICovCisJCWlmIChncC0+cGh5X21paS5zcGVlZCA9PSBTUEVFRF8xMDApIHsKKwkJCWdwLT5waHlfbWlpLmRlZi0+b3BzLT5zZXR1cF9mb3JjZWQoJmdwLT5waHlfbWlpLCBTUEVFRF8xMCwKKwkJCQlEVVBMRVhfSEFMRik7CisJCQlncC0+dGltZXJfdGlja3MgPSA1OworCQkJaWYgKG5ldGlmX21zZ19saW5rKGdwKSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogc3dpdGNoaW5nIHRvIGZvcmNlZCAxMGJ0XG4iLAorCQkJCQlncC0+ZGV2LT5uYW1lKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIHZvaWQgZ2VtX2xpbmtfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBnZW0gKmdwID0gKHN0cnVjdCBnZW0gKikgZGF0YTsKKwlpbnQgcmVzdGFydF9hbmVnID0gMDsKKwkJCisJaWYgKGdwLT5hc2xlZXApCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnEoJmdwLT5sb2NrKTsKKwlzcGluX2xvY2soJmdwLT50eF9sb2NrKTsKKwlnZW1fZ2V0X2NlbGwoZ3ApOworCisJLyogSWYgdGhlIHJlc2V0IHRhc2sgaXMgc3RpbGwgcGVuZGluZywgd2UganVzdAorCSAqIHJlc2NoZWR1bGUgdGhlIGxpbmsgdGltZXIKKwkgKi8KKwlpZiAoZ3AtPnJlc2V0X3Rhc2tfcGVuZGluZykKKwkJZ290byByZXN0YXJ0OworCSAgICAJCisJaWYgKGdwLT5waHlfdHlwZSA9PSBwaHlfc2VyaWFsaW5rIHx8CisJICAgIGdwLT5waHlfdHlwZSA9PSBwaHlfc2VyZGVzKSB7CisJCXUzMiB2YWwgPSByZWFkbChncC0+cmVncyArIFBDU19NSUlTVEFUKTsKKworCQlpZiAoISh2YWwgJiBQQ1NfTUlJU1RBVF9MUykpCisJCQl2YWwgPSByZWFkbChncC0+cmVncyArIFBDU19NSUlTVEFUKTsKKworCQlpZiAoKHZhbCAmIFBDU19NSUlTVEFUX0xTKSAhPSAwKSB7CisJCQlncC0+bHN0YXRlID0gbGlua191cDsKKwkJCW5ldGlmX2NhcnJpZXJfb24oZ3AtPmRldik7CisJCQkodm9pZClnZW1fc2V0X2xpbmtfbW9kZXMoZ3ApOworCQl9CisJCWdvdG8gcmVzdGFydDsKKwl9CisJaWYgKGZvdW5kX21paV9waHkoZ3ApICYmIGdwLT5waHlfbWlpLmRlZi0+b3BzLT5wb2xsX2xpbmsoJmdwLT5waHlfbWlpKSkgeworCQkvKiBPaywgaGVyZSB3ZSBnb3QgYSBsaW5rLiBJZiB3ZSBoYWQgaXQgZHVlIHRvIGEgZm9yY2VkCisJCSAqIGZhbGxiYWNrLCBhbmQgd2Ugd2VyZSBjb25maWd1cmVkIGZvciBhdXRvbmVnLCB3ZSBkbworCQkgKiByZXRyeSBhIHNob3J0IGF1dG9uZWcgcGFzcy4gSWYgeW91IGtub3cgeW91ciBodWIgaXMKKwkJICogYnJva2VuLCB1c2UgZXRodG9vbCA7KQorCQkgKi8KKwkJaWYgKGdwLT5sc3RhdGUgPT0gbGlua19mb3JjZV90cnkgJiYgZ3AtPndhbnRfYXV0b25lZykgeworCQkJZ3AtPmxzdGF0ZSA9IGxpbmtfZm9yY2VfcmV0OworCQkJZ3AtPmxhc3RfZm9yY2VkX3NwZWVkID0gZ3AtPnBoeV9taWkuc3BlZWQ7CisJCQlncC0+dGltZXJfdGlja3MgPSA1OworCQkJaWYgKG5ldGlmX21zZ19saW5rKGdwKSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogR290IGxpbmsgYWZ0ZXIgZmFsbGJhY2ssIHJldHJ5aW5nIgorCQkJCQkiIGF1dG9uZWcgb25jZS4uLlxuIiwgZ3AtPmRldi0+bmFtZSk7CisJCQlncC0+cGh5X21paS5kZWYtPm9wcy0+c2V0dXBfYW5lZygmZ3AtPnBoeV9taWksIGdwLT5waHlfbWlpLmFkdmVydGlzaW5nKTsKKwkJfSBlbHNlIGlmIChncC0+bHN0YXRlICE9IGxpbmtfdXApIHsKKwkJCWdwLT5sc3RhdGUgPSBsaW5rX3VwOworCQkJbmV0aWZfY2Fycmllcl9vbihncC0+ZGV2KTsKKwkJCWlmIChnZW1fc2V0X2xpbmtfbW9kZXMoZ3ApKQorCQkJCXJlc3RhcnRfYW5lZyA9IDE7CisJCX0KKwl9IGVsc2UgeworCQkvKiBJZiB0aGUgbGluayB3YXMgcHJldmlvdXNseSB1cCwgd2UgcmVzdGFydCB0aGUKKwkJICogd2hvbGUgcHJvY2VzcworCQkgKi8KKwkJaWYgKGdwLT5sc3RhdGUgPT0gbGlua191cCkgeworCQkJZ3AtPmxzdGF0ZSA9IGxpbmtfZG93bjsKKwkJCWlmIChuZXRpZl9tc2dfbGluayhncCkpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpbmsgZG93blxuIiwKKwkJCQkJZ3AtPmRldi0+bmFtZSk7CisJCQluZXRpZl9jYXJyaWVyX29mZihncC0+ZGV2KTsKKwkJCWdwLT5yZXNldF90YXNrX3BlbmRpbmcgPSAxOworCQkJc2NoZWR1bGVfd29yaygmZ3AtPnJlc2V0X3Rhc2spOworCQkJcmVzdGFydF9hbmVnID0gMTsKKwkJfSBlbHNlIGlmICgrK2dwLT50aW1lcl90aWNrcyA+IDEwKSB7CisJCQlpZiAoZm91bmRfbWlpX3BoeShncCkpCisJCQkJcmVzdGFydF9hbmVnID0gZ2VtX21kaW9fbGlua19ub3RfdXAoZ3ApOworCQkJZWxzZQorCQkJCXJlc3RhcnRfYW5lZyA9IDE7CisJCX0KKwl9CisJaWYgKHJlc3RhcnRfYW5lZykgeworCQlnZW1fYmVnaW5fYXV0b19uZWdvdGlhdGlvbihncCwgTlVMTCk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CityZXN0YXJ0OgorCW1vZF90aW1lcigmZ3AtPmxpbmtfdGltZXIsIGppZmZpZXMgKyAoKDEyICogSFopIC8gMTApKTsKK291dF91bmxvY2s6CisJZ2VtX3B1dF9jZWxsKGdwKTsKKwlzcGluX3VubG9jaygmZ3AtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmZ3AtPmxvY2spOworfQorCisvKiBNdXN0IGJlIGludm9rZWQgdW5kZXIgZ3AtPmxvY2sgYW5kIGdwLT50eF9sb2NrLiAqLworc3RhdGljIHZvaWQgZ2VtX2NsZWFuX3JpbmdzKHN0cnVjdCBnZW0gKmdwKQoreworCXN0cnVjdCBnZW1faW5pdF9ibG9jayAqZ2IgPSBncC0+aW5pdF9ibG9jazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBpOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IGdlbV9yeGQgKnJ4ZDsKKworCQlyeGQgPSAmZ2ItPnJ4ZFtpXTsKKwkJaWYgKGdwLT5yeF9za2JzW2ldICE9IE5VTEwpIHsKKwkJCXNrYiA9IGdwLT5yeF9za2JzW2ldOworCQkJZG1hX2FkZHIgPSBsZTY0X3RvX2NwdShyeGQtPmJ1ZmZlcik7CisJCQlwY2lfdW5tYXBfcGFnZShncC0+cGRldiwgZG1hX2FkZHIsCisJCQkJICAgICAgIFJYX0JVRl9BTExPQ19TSVpFKGdwKSwKKwkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQlncC0+cnhfc2tic1tpXSA9IE5VTEw7CisJCX0KKwkJcnhkLT5zdGF0dXNfd29yZCA9IDA7CisJCXdtYigpOworCQlyeGQtPmJ1ZmZlciA9IDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCWlmIChncC0+dHhfc2tic1tpXSAhPSBOVUxMKSB7CisJCQlzdHJ1Y3QgZ2VtX3R4ZCAqdHhkOworCQkJaW50IGZyYWc7CisKKwkJCXNrYiA9IGdwLT50eF9za2JzW2ldOworCQkJZ3AtPnR4X3NrYnNbaV0gPSBOVUxMOworCisJCQlmb3IgKGZyYWcgPSAwOyBmcmFnIDw9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGZyYWcrKykgeworCQkJCWludCBlbnQgPSBpICYgKFRYX1JJTkdfU0laRSAtIDEpOworCisJCQkJdHhkID0gJmdiLT50eGRbZW50XTsKKwkJCQlkbWFfYWRkciA9IGxlNjRfdG9fY3B1KHR4ZC0+YnVmZmVyKTsKKwkJCQlwY2lfdW5tYXBfcGFnZShncC0+cGRldiwgZG1hX2FkZHIsCisJCQkJCSAgICAgICBsZTY0X3RvX2NwdSh0eGQtPmNvbnRyb2xfd29yZCkgJgorCQkJCQkgICAgICAgVFhEQ1RSTF9CVUZTWiwgUENJX0RNQV9UT0RFVklDRSk7CisKKwkJCQlpZiAoZnJhZyAhPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKQorCQkJCQlpKys7CisJCQl9CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQl9CisJfQorfQorCisvKiBNdXN0IGJlIGludm9rZWQgdW5kZXIgZ3AtPmxvY2sgYW5kIGdwLT50eF9sb2NrLiAqLworc3RhdGljIHZvaWQgZ2VtX2luaXRfcmluZ3Moc3RydWN0IGdlbSAqZ3ApCit7CisJc3RydWN0IGdlbV9pbml0X2Jsb2NrICpnYiA9IGdwLT5pbml0X2Jsb2NrOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBncC0+ZGV2OworCWludCBpOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisKKwlncC0+cnhfbmV3ID0gZ3AtPnJ4X29sZCA9IGdwLT50eF9uZXcgPSBncC0+dHhfb2xkID0gMDsKKworCWdlbV9jbGVhbl9yaW5ncyhncCk7CisKKwlncC0+cnhfYnVmX3N6ID0gbWF4KGRldi0+bXR1ICsgRVRIX0hMRU4gKyBWTEFOX0hMRU4sCisJCQkgICAgKHVuc2lnbmVkKVZMQU5fRVRIX0ZSQU1FX0xFTik7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJc3RydWN0IGdlbV9yeGQgKnJ4ZCA9ICZnYi0+cnhkW2ldOworCisJCXNrYiA9IGdlbV9hbGxvY19za2IoUlhfQlVGX0FMTE9DX1NJWkUoZ3ApLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFza2IpIHsKKwkJCXJ4ZC0+YnVmZmVyID0gMDsKKwkJCXJ4ZC0+c3RhdHVzX3dvcmQgPSAwOworCQkJY29udGludWU7CisJCX0KKworCQlncC0+cnhfc2tic1tpXSA9IHNrYjsKKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYl9wdXQoc2tiLCAoZ3AtPnJ4X2J1Zl9zeiArIFJYX09GRlNFVCkpOworCQlkbWFfYWRkciA9IHBjaV9tYXBfcGFnZShncC0+cGRldiwKKwkJCQkJdmlydF90b19wYWdlKHNrYi0+ZGF0YSksCisJCQkJCW9mZnNldF9pbl9wYWdlKHNrYi0+ZGF0YSksCisJCQkJCVJYX0JVRl9BTExPQ19TSVpFKGdwKSwKKwkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJcnhkLT5idWZmZXIgPSBjcHVfdG9fbGU2NChkbWFfYWRkcik7CisJCXdtYigpOworCQlyeGQtPnN0YXR1c193b3JkID0gY3B1X3RvX2xlNjQoUlhEQ1RSTF9GUkVTSChncCkpOworCQlza2JfcmVzZXJ2ZShza2IsIFJYX09GRlNFVCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBnZW1fdHhkICp0eGQgPSAmZ2ItPnR4ZFtpXTsKKworCQl0eGQtPmNvbnRyb2xfd29yZCA9IDA7CisJCXdtYigpOworCQl0eGQtPmJ1ZmZlciA9IDA7CisJfQorCXdtYigpOworfQorCisvKiBJbml0IFBIWSBpbnRlcmZhY2UgYW5kIHN0YXJ0IGxpbmsgcG9sbCBzdGF0ZSBtYWNoaW5lICovCitzdGF0aWMgdm9pZCBnZW1faW5pdF9waHkoc3RydWN0IGdlbSAqZ3ApCit7CisJdTMyIG1pZmNmZzsKKworCS8qIFJldmVydCBNSUYgQ0ZHIHNldHRpbmcgZG9uZSBvbiBzdG9wX3BoeSAqLworCW1pZmNmZyA9IHJlYWRsKGdwLT5yZWdzICsgTUlGX0NGRyk7CisJbWlmY2ZnICY9IH5NSUZfQ0ZHX0JCTU9ERTsKKwl3cml0ZWwobWlmY2ZnLCBncC0+cmVncyArIE1JRl9DRkcpOworCQorCWlmIChncC0+cGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQVBQTEUpIHsKKwkJaW50IGk7CisKKwkJLyogVGhvc2UgZGVsYXkgc3Vja3MsIHRoZSBIVyBzZWVtIHRvIGxvdmUgdGhlbSB0aG91Z2gsIEknbGwKKwkJICogc2VyaXNvdWx5IGNvbnNpZGVyIGJyZWFraW5nIHNvbWUgbG9ja3MgaGVyZSB0byBiZSBhYmxlCisJCSAqIHRvIHNjaGVkdWxlIGluc3RlYWQKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKKwkJCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX0dNQUNfUEhZX1JFU0VULCBncC0+b2Zfbm9kZSwgMCwgMCk7CisJCQltc2xlZXAoMjApOworI2VuZGlmCisJCQkvKiBTb21lIFBIWXMgdXNlZCBieSBhcHBsZSBoYXZlIHByb2JsZW0gZ2V0dGluZyBiYWNrIHRvIHVzLAorCQkJICogd2UgZG8gYW4gYWRkaXRpb25hbCByZXNldCBoZXJlCisJCQkgKi8KKwkJCXBoeV93cml0ZShncCwgTUlJX0JNQ1IsIEJNQ1JfUkVTRVQpOworCQkJbXNsZWVwKDIwKTsKKwkJCWlmIChwaHlfcmVhZChncCwgTUlJX0JNQ1IpICE9IDB4ZmZmZikKKwkJCQlicmVhazsKKwkJCWlmIChpID09IDIpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEdNQUMgUEhZIG5vdCByZXNwb25kaW5nICFcbiIsCisJCQkJICAgICAgIGdwLT5kZXYtPm5hbWUpOworCQl9CisJfQorCisJaWYgKGdwLT5wZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9TVU4gJiYKKwkgICAgZ3AtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NVTl9HRU0pIHsKKwkJdTMyIHZhbDsKKworCQkvKiBJbml0IGRhdGFwYXRoIG1vZGUgcmVnaXN0ZXIuICovCisJCWlmIChncC0+cGh5X3R5cGUgPT0gcGh5X21paV9tZGlvMCB8fAorCQkgICAgZ3AtPnBoeV90eXBlID09IHBoeV9taWlfbWRpbzEpIHsKKwkJCXZhbCA9IFBDU19ETU9ERV9NR007CisJCX0gZWxzZSBpZiAoZ3AtPnBoeV90eXBlID09IHBoeV9zZXJpYWxpbmspIHsKKwkJCXZhbCA9IFBDU19ETU9ERV9TTSB8IFBDU19ETU9ERV9HTU9FOworCQl9IGVsc2UgeworCQkJdmFsID0gUENTX0RNT0RFX0VTTTsKKwkJfQorCisJCXdyaXRlbCh2YWwsIGdwLT5yZWdzICsgUENTX0RNT0RFKTsKKwl9CisKKwlpZiAoZ3AtPnBoeV90eXBlID09IHBoeV9taWlfbWRpbzAgfHwKKwkgICAgZ3AtPnBoeV90eXBlID09IHBoeV9taWlfbWRpbzEpIHsKKwkgICAgCS8vIFhYWCBjaGVjayBmb3IgZXJyb3JzCisJCW1paV9waHlfcHJvYmUoJmdwLT5waHlfbWlpLCBncC0+bWlpX3BoeV9hZGRyKTsKKworCQkvKiBJbml0IFBIWSAqLworCQlpZiAoZ3AtPnBoeV9taWkuZGVmICYmIGdwLT5waHlfbWlpLmRlZi0+b3BzLT5pbml0KQorCQkJZ3AtPnBoeV9taWkuZGVmLT5vcHMtPmluaXQoJmdwLT5waHlfbWlpKTsKKwl9IGVsc2UgeworCQl1MzIgdmFsOworCQlpbnQgbGltaXQ7CisKKwkJLyogUmVzZXQgUENTIHVuaXQuICovCisJCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgUENTX01JSUNUUkwpOworCQl2YWwgfD0gUENTX01JSUNUUkxfUlNUOworCQl3cml0ZWIodmFsLCBncC0+cmVncyArIFBDU19NSUlDVFJMKTsKKworCQlsaW1pdCA9IDMyOworCQl3aGlsZSAocmVhZGwoZ3AtPnJlZ3MgKyBQQ1NfTUlJQ1RSTCkgJiBQQ1NfTUlJQ1RSTF9SU1QpIHsKKwkJCXVkZWxheSgxMDApOworCQkJaWYgKGxpbWl0LS0gPD0gMCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAobGltaXQgPD0gMCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQQ1MgcmVzZXQgYml0IHdvdWxkIG5vdCBjbGVhci5cbiIsCisJCQkgICAgICAgZ3AtPmRldi0+bmFtZSk7CisKKwkJLyogTWFrZSBzdXJlIFBDUyBpcyBkaXNhYmxlZCB3aGlsZSBjaGFuZ2luZyBhZHZlcnRpc2VtZW50CisJCSAqIGNvbmZpZ3VyYXRpb24uCisJCSAqLworCQl2YWwgPSByZWFkbChncC0+cmVncyArIFBDU19DRkcpOworCQl2YWwgJj0gfihQQ1NfQ0ZHX0VOQUJMRSB8IFBDU19DRkdfVE8pOworCQl3cml0ZWwodmFsLCBncC0+cmVncyArIFBDU19DRkcpOworCisJCS8qIEFkdmVydGlzZSBhbGwgY2FwYWJpbGl0aWVzIGV4Y2VwdCBhc3N5bWV0cmljCisJCSAqIHBhdXNlLgorCQkgKi8KKwkJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBQQ1NfTUlJQURWKTsKKwkJdmFsIHw9IChQQ1NfTUlJQURWX0ZEIHwgUENTX01JSUFEVl9IRCB8CisJCQlQQ1NfTUlJQURWX1NQIHwgUENTX01JSUFEVl9BUCk7CisJCXdyaXRlbCh2YWwsIGdwLT5yZWdzICsgUENTX01JSUFEVik7CisKKwkJLyogRW5hYmxlIGFuZCByZXN0YXJ0IGF1dG8tbmVnb3RpYXRpb24sIGRpc2FibGUgd3JhcGJhY2svbG9vcGJhY2ssCisJCSAqIGFuZCByZS1lbmFibGUgUENTLgorCQkgKi8KKwkJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBQQ1NfTUlJQ1RSTCk7CisJCXZhbCB8PSAoUENTX01JSUNUUkxfUkFOIHwgUENTX01JSUNUUkxfQU5FKTsKKwkJdmFsICY9IH5QQ1NfTUlJQ1RSTF9XQjsKKwkJd3JpdGVsKHZhbCwgZ3AtPnJlZ3MgKyBQQ1NfTUlJQ1RSTCk7CisKKwkJdmFsID0gcmVhZGwoZ3AtPnJlZ3MgKyBQQ1NfQ0ZHKTsKKwkJdmFsIHw9IFBDU19DRkdfRU5BQkxFOworCQl3cml0ZWwodmFsLCBncC0+cmVncyArIFBDU19DRkcpOworCisJCS8qIE1ha2Ugc3VyZSBzZXJpYWxpbmsgbG9vcGJhY2sgaXMgb2ZmLiAgVGhlIG1lYW5pbmcKKwkJICogb2YgdGhpcyBiaXQgaXMgbG9naWNhbGx5IGludmVydGVkIGJhc2VkIHVwb24gd2hldGhlcgorCQkgKiB5b3UgYXJlIGluIFNlcmlhbGluayBvciBTRVJERVMgbW9kZS4KKwkJICovCisJCXZhbCA9IHJlYWRsKGdwLT5yZWdzICsgUENTX1NDVFJMKTsKKwkJaWYgKGdwLT5waHlfdHlwZSA9PSBwaHlfc2VyaWFsaW5rKQorCQkJdmFsICY9IH5QQ1NfU0NUUkxfTE9PUDsKKwkJZWxzZQorCQkJdmFsIHw9IFBDU19TQ1RSTF9MT09QOworCQl3cml0ZWwodmFsLCBncC0+cmVncyArIFBDU19TQ1RSTCk7CisJfQorCisJLyogRGVmYXVsdCBhbmVnIHBhcmFtZXRlcnMgKi8KKwlncC0+dGltZXJfdGlja3MgPSAwOworCWdwLT5sc3RhdGUgPSBsaW5rX2Rvd247CisJbmV0aWZfY2Fycmllcl9vZmYoZ3AtPmRldik7CisKKwkvKiBDYW4gSSBhZHZlcnRpc2UgZ2lnYWJpdCBoZXJlID8gSSdkIG5lZWQgQkNNIFBIWSBkb2NzLi4uICovCisJc3Bpbl9sb2NrX2lycSgmZ3AtPmxvY2spOworCWdlbV9iZWdpbl9hdXRvX25lZ290aWF0aW9uKGdwLCBOVUxMKTsKKwlzcGluX3VubG9ja19pcnEoJmdwLT5sb2NrKTsKK30KKworLyogTXVzdCBiZSBpbnZva2VkIHVuZGVyIGdwLT5sb2NrIGFuZCBncC0+dHhfbG9jay4gKi8KK3N0YXRpYyB2b2lkIGdlbV9pbml0X2RtYShzdHJ1Y3QgZ2VtICpncCkKK3sKKwl1NjQgZGVzY19kbWEgPSAodTY0KSBncC0+Z2Jsb2NrX2R2bWE7CisJdTMyIHZhbDsKKworCXZhbCA9IChUWERNQV9DRkdfQkFTRSB8ICgweDdmZiA8PCAxMCkgfCBUWERNQV9DRkdfUE1PREUpOworCXdyaXRlbCh2YWwsIGdwLT5yZWdzICsgVFhETUFfQ0ZHKTsKKworCXdyaXRlbChkZXNjX2RtYSA+PiAzMiwgZ3AtPnJlZ3MgKyBUWERNQV9EQkhJKTsKKwl3cml0ZWwoZGVzY19kbWEgJiAweGZmZmZmZmZmLCBncC0+cmVncyArIFRYRE1BX0RCTE9XKTsKKwlkZXNjX2RtYSArPSAoSU5JVF9CTE9DS19UWF9SSU5HX1NJWkUgKiBzaXplb2Yoc3RydWN0IGdlbV90eGQpKTsKKworCXdyaXRlbCgwLCBncC0+cmVncyArIFRYRE1BX0tJQ0spOworCisJdmFsID0gKFJYRE1BX0NGR19CQVNFIHwgKFJYX09GRlNFVCA8PCAxMCkgfAorCSAgICAgICAoKDE0IC8gMikgPDwgMTMpIHwgUlhETUFfQ0ZHX0ZUSFJFU0hfMTI4KTsKKwl3cml0ZWwodmFsLCBncC0+cmVncyArIFJYRE1BX0NGRyk7CisKKwl3cml0ZWwoZGVzY19kbWEgPj4gMzIsIGdwLT5yZWdzICsgUlhETUFfREJISSk7CisJd3JpdGVsKGRlc2NfZG1hICYgMHhmZmZmZmZmZiwgZ3AtPnJlZ3MgKyBSWERNQV9EQkxPVyk7CisKKwl3cml0ZWwoUlhfUklOR19TSVpFIC0gNCwgZ3AtPnJlZ3MgKyBSWERNQV9LSUNLKTsKKworCXZhbCAgPSAoKChncC0+cnhfcGF1c2Vfb2ZmIC8gNjQpIDw8IDApICYgUlhETUFfUFRIUkVTSF9PRkYpOworCXZhbCB8PSAoKChncC0+cnhfcGF1c2Vfb24gLyA2NCkgPDwgMTIpICYgUlhETUFfUFRIUkVTSF9PTik7CisJd3JpdGVsKHZhbCwgZ3AtPnJlZ3MgKyBSWERNQV9QVEhSRVNIKTsKKworCWlmIChyZWFkbChncC0+cmVncyArIEdSRUdfQklGQ0ZHKSAmIEdSRUdfQklGQ0ZHX002NkVOKQorCQl3cml0ZWwoKCg1ICYgUlhETUFfQkxBTktfSVBLVFMpIHwKKwkJCSgoOCA8PCAxMikgJiBSWERNQV9CTEFOS19JVElNRSkpLAorCQkgICAgICAgZ3AtPnJlZ3MgKyBSWERNQV9CTEFOSyk7CisJZWxzZQorCQl3cml0ZWwoKCg1ICYgUlhETUFfQkxBTktfSVBLVFMpIHwKKwkJCSgoNCA8PCAxMikgJiBSWERNQV9CTEFOS19JVElNRSkpLAorCQkgICAgICAgZ3AtPnJlZ3MgKyBSWERNQV9CTEFOSyk7Cit9CisKKy8qIE11c3QgYmUgaW52b2tlZCB1bmRlciBncC0+bG9jayBhbmQgZ3AtPnR4X2xvY2suICovCitzdGF0aWMgdTMyIGdlbV9zZXR1cF9tdWx0aWNhc3Qoc3RydWN0IGdlbSAqZ3ApCit7CisJdTMyIHJ4Y2ZnID0gMDsKKwlpbnQgaTsKKwkKKwlpZiAoKGdwLT5kZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fAorCSAgICAoZ3AtPmRldi0+bWNfY291bnQgPiAyNTYpKSB7CisJICAgIAlmb3IgKGk9MDsgaTwxNjsgaSsrKQorCQkJd3JpdGVsKDB4ZmZmZiwgZ3AtPnJlZ3MgKyBNQUNfSEFTSDAgKyAoaSA8PCAyKSk7CisJCXJ4Y2ZnIHw9IE1BQ19SWENGR19IRkU7CisJfSBlbHNlIGlmIChncC0+ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCXJ4Y2ZnIHw9IE1BQ19SWENGR19QUk9NOworCX0gZWxzZSB7CisJCXUxNiBoYXNoX3RhYmxlWzE2XTsKKwkJdTMyIGNyYzsKKwkJc3RydWN0IGRldl9tY19saXN0ICpkbWkgPSBncC0+ZGV2LT5tY19saXN0OworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCWhhc2hfdGFibGVbaV0gPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBncC0+ZGV2LT5tY19jb3VudDsgaSsrKSB7CisJCQljaGFyICphZGRycyA9IGRtaS0+ZG1pX2FkZHI7CisKKwkJCWRtaSA9IGRtaS0+bmV4dDsKKworCQkJaWYgKCEoKmFkZHJzICYgMSkpCisJCQkJY29udGludWU7CisKKyAJCQljcmMgPSBldGhlcl9jcmNfbGUoNiwgYWRkcnMpOworCQkJY3JjID4+PSAyNDsKKwkJCWhhc2hfdGFibGVbY3JjID4+IDRdIHw9IDEgPDwgKDE1IC0gKGNyYyAmIDB4ZikpOworCQl9CisJICAgIAlmb3IgKGk9MDsgaTwxNjsgaSsrKQorCQkJd3JpdGVsKGhhc2hfdGFibGVbaV0sIGdwLT5yZWdzICsgTUFDX0hBU0gwICsgKGkgPDwgMikpOworCQlyeGNmZyB8PSBNQUNfUlhDRkdfSEZFOworCX0KKworCXJldHVybiByeGNmZzsKK30KKworLyogTXVzdCBiZSBpbnZva2VkIHVuZGVyIGdwLT5sb2NrIGFuZCBncC0+dHhfbG9jay4gKi8KK3N0YXRpYyB2b2lkIGdlbV9pbml0X21hYyhzdHJ1Y3QgZ2VtICpncCkKK3sKKwl1bnNpZ25lZCBjaGFyICplID0gJmdwLT5kZXYtPmRldl9hZGRyWzBdOworCisJd3JpdGVsKDB4MWJmMCwgZ3AtPnJlZ3MgKyBNQUNfU05EUEFVU0UpOworCisJd3JpdGVsKDB4MDAsIGdwLT5yZWdzICsgTUFDX0lQRzApOworCXdyaXRlbCgweDA4LCBncC0+cmVncyArIE1BQ19JUEcxKTsKKwl3cml0ZWwoMHgwNCwgZ3AtPnJlZ3MgKyBNQUNfSVBHMik7CisJd3JpdGVsKDB4NDAsIGdwLT5yZWdzICsgTUFDX1NUSU1FKTsKKwl3cml0ZWwoMHg0MCwgZ3AtPnJlZ3MgKyBNQUNfTUlORlNaKTsKKworCS8qIEV0aGVybmV0IHBheWxvYWQgKyBoZWFkZXIgKyBGQ1MgKyBvcHRpb25hbCBWTEFOIHRhZy4gKi8KKwl3cml0ZWwoMHgyMDAwMDAwMCB8IChncC0+cnhfYnVmX3N6ICsgNCksIGdwLT5yZWdzICsgTUFDX01BWEZTWik7CisKKwl3cml0ZWwoMHgwNywgZ3AtPnJlZ3MgKyBNQUNfUEFTSVpFKTsKKwl3cml0ZWwoMHgwNCwgZ3AtPnJlZ3MgKyBNQUNfSkFNU0laRSk7CisJd3JpdGVsKDB4MTAsIGdwLT5yZWdzICsgTUFDX0FUVExJTSk7CisJd3JpdGVsKDB4ODgwOCwgZ3AtPnJlZ3MgKyBNQUNfTUNUWVBFKTsKKworCXdyaXRlbCgoZVs1XSB8IChlWzRdIDw8IDgpKSAmIDB4M2ZmLCBncC0+cmVncyArIE1BQ19SQU5EU0VFRCk7CisKKwl3cml0ZWwoKGVbNF0gPDwgOCkgfCBlWzVdLCBncC0+cmVncyArIE1BQ19BRERSMCk7CisJd3JpdGVsKChlWzJdIDw8IDgpIHwgZVszXSwgZ3AtPnJlZ3MgKyBNQUNfQUREUjEpOworCXdyaXRlbCgoZVswXSA8PCA4KSB8IGVbMV0sIGdwLT5yZWdzICsgTUFDX0FERFIyKTsKKworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19BRERSMyk7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0FERFI0KTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfQUREUjUpOworCisJd3JpdGVsKDB4MDAwMSwgZ3AtPnJlZ3MgKyBNQUNfQUREUjYpOworCXdyaXRlbCgweGMyMDAsIGdwLT5yZWdzICsgTUFDX0FERFI3KTsKKwl3cml0ZWwoMHgwMTgwLCBncC0+cmVncyArIE1BQ19BRERSOCk7CisKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfQUZJTFQwKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfQUZJTFQxKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfQUZJTFQyKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfQUYyMU1TSyk7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0FGME1TSyk7CisKKwlncC0+bWFjX3J4X2NmZyA9IGdlbV9zZXR1cF9tdWx0aWNhc3QoZ3ApOworI2lmZGVmIFNUUklQX0ZDUworCWdwLT5tYWNfcnhfY2ZnIHw9IE1BQ19SWENGR19TRkNTOworI2VuZGlmCisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX05DT0xMKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfRkFTVUNDKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfRUNPTEwpOworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19MQ09MTCk7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0RUSU1FUik7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX1BBVE1QUyk7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX1JGQ1RSKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfTEVSUik7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0FFUlIpOworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19GQ1NFUlIpOworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19SWENWRVJSKTsKKworCS8qIENsZWFyIFJYL1RYL01BQy9YSUYgY29uZmlnLCB3ZSB3aWxsIHNldCB0aGVzZSB1cCBhbmQgZW5hYmxlCisJICogdGhlbSBvbmNlIGEgbGluayBpcyBlc3RhYmxpc2hlZC4KKwkgKi8KKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfVFhDRkcpOworCXdyaXRlbChncC0+bWFjX3J4X2NmZywgZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpOworCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19NQ0NGRyk7CisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX1hJRkNGRyk7CisKKwkvKiBTZXR1cCBNQUMgaW50ZXJydXB0cy4gIFdlIHdhbnQgdG8gZ2V0IGFsbCBvZiB0aGUgaW50ZXJlc3RpbmcKKwkgKiBjb3VudGVyIGV4cGlyYXRpb24gZXZlbnRzLCBidXQgd2UgZG8gbm90IHdhbnQgdG8gaGVhciBhYm91dAorCSAqIG5vcm1hbCByeC90eCBhcyB0aGUgRE1BIGVuZ2luZSB0ZWxscyB1cyB0aGF0LgorCSAqLworCXdyaXRlbChNQUNfVFhTVEFUX1hNSVQsIGdwLT5yZWdzICsgTUFDX1RYTUFTSyk7CisJd3JpdGVsKE1BQ19SWFNUQVRfUkNWLCBncC0+cmVncyArIE1BQ19SWE1BU0spOworCisJLyogRG9uJ3QgZW5hYmxlIGV2ZW4gdGhlIFBBVVNFIGludGVycnVwdHMgZm9yIG5vdywgd2UKKwkgKiBtYWtlIG5vIHVzZSBvZiB0aG9zZSBldmVudHMgb3RoZXIgdGhhbiB0byByZWNvcmQgdGhlbS4KKwkgKi8KKwl3cml0ZWwoMHhmZmZmZmZmZiwgZ3AtPnJlZ3MgKyBNQUNfTUNNQVNLKTsKKworCS8qIERvbid0IGVuYWJsZSBHRU0ncyBXT0wgaW4gbm9ybWFsIG9wZXJhdGlvbnMKKwkgKi8KKwlpZiAoZ3AtPmhhc193b2wpCisJCXdyaXRlbCgwLCBncC0+cmVncyArIFdPTF9XQUtFQ1NSKTsKK30KKworLyogTXVzdCBiZSBpbnZva2VkIHVuZGVyIGdwLT5sb2NrIGFuZCBncC0+dHhfbG9jay4gKi8KK3N0YXRpYyB2b2lkIGdlbV9pbml0X3BhdXNlX3RocmVzaG9sZHMoc3RydWN0IGdlbSAqZ3ApCit7CisgICAgICAgCXUzMiBjZmc7CisKKwkvKiBDYWxjdWxhdGUgcGF1c2UgdGhyZXNob2xkcy4gIFNldHRpbmcgdGhlIE9GRiB0aHJlc2hvbGQgdG8gdGhlCisJICogZnVsbCBSWCBmaWZvIHNpemUgZWZmZWN0aXZlbHkgZGlzYWJsZXMgUEFVU0UgZ2VuZXJhdGlvbiB3aGljaAorCSAqIGlzIHdoYXQgd2UgZG8gZm9yIDEwLzEwMCBvbmx5IEdFTXMgd2hpY2ggaGF2ZSBGSUZPcyB0b28gc21hbGwKKwkgKiB0byBtYWtlIHJlYWwgZ2FpbnMgZnJvbSBQQVVTRS4KKwkgKi8KKwlpZiAoZ3AtPnJ4X2ZpZm9fc3ogPD0gKDIgKiAxMDI0KSkgeworCQlncC0+cnhfcGF1c2Vfb2ZmID0gZ3AtPnJ4X3BhdXNlX29uID0gZ3AtPnJ4X2ZpZm9fc3o7CisJfSBlbHNlIHsKKwkJaW50IG1heF9mcmFtZSA9IChncC0+cnhfYnVmX3N6ICsgNCArIDY0KSAmIH42MzsKKwkJaW50IG9mZiA9IChncC0+cnhfZmlmb19zeiAtIChtYXhfZnJhbWUgKiAyKSk7CisJCWludCBvbiA9IG9mZiAtIG1heF9mcmFtZTsKKworCQlncC0+cnhfcGF1c2Vfb2ZmID0gb2ZmOworCQlncC0+cnhfcGF1c2Vfb24gPSBvbjsKKwl9CisKKworCS8qIENvbmZpZ3VyZSB0aGUgY2hpcCAiYnVyc3QiIERNQSBtb2RlICYgZW5hYmxlIHNvbWUKKwkgKiBIVyBidWcgZml4ZXMgb24gQXBwbGUgdmVyc2lvbgorCSAqLworICAgICAgIAljZmcgID0gMDsKKyAgICAgICAJaWYgKGdwLT5wZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9BUFBMRSkKKwkJY2ZnIHw9IEdSRUdfQ0ZHX1JPTlBBVUxCSVQgfCBHUkVHX0NGR19FTkJVRzJGSVg7CisjaWYgIWRlZmluZWQoQ09ORklHX1NQQVJDNjQpICYmICFkZWZpbmVkKENPTkZJR19BTFBIQSkKKyAgICAgICAJY2ZnIHw9IEdSRUdfQ0ZHX0lCVVJTVDsKKyNlbmRpZgorICAgICAgIAljZmcgfD0gKCgzMSA8PCAxKSAmIEdSRUdfQ0ZHX1RYRE1BTElNKTsKKyAgICAgICAJY2ZnIHw9ICgoMzEgPDwgNikgJiBHUkVHX0NGR19SWERNQUxJTSk7CisgICAgICAgCXdyaXRlbChjZmcsIGdwLT5yZWdzICsgR1JFR19DRkcpOworCisJLyogSWYgSW5maW5pdGUgQnVyc3QgZGlkbid0IHN0aWNrLCB0aGVuIHVzZSBkaWZmZXJlbnQKKwkgKiB0aHJlc2hvbGRzIChhbmQgQXBwbGUgYnVnIGZpeGVzIGRvbid0IGV4aXN0KQorCSAqLworCWlmICghKHJlYWRsKGdwLT5yZWdzICsgR1JFR19DRkcpICYgR1JFR19DRkdfSUJVUlNUKSkgeworCQljZmcgPSAoKDIgPDwgMSkgJiBHUkVHX0NGR19UWERNQUxJTSk7CisJCWNmZyB8PSAoKDggPDwgNikgJiBHUkVHX0NGR19SWERNQUxJTSk7CisJCXdyaXRlbChjZmcsIGdwLT5yZWdzICsgR1JFR19DRkcpOworCX0JCit9CisKK3N0YXRpYyBpbnQgZ2VtX2NoZWNrX2ludmFyaWFudHMoc3RydWN0IGdlbSAqZ3ApCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBncC0+cGRldjsKKwl1MzIgbWlmX2NmZzsKKworCS8qIE9uIEFwcGxlJ3Mgc3VuZ2VtLCB3ZSBjYW4ndCByZWx5IG9uIHJlZ2lzdGVycyBhcyB0aGUgY2hpcAorCSAqIHdhcyBiZWVuIHBvd2VyZWQgZG93biBieSB0aGUgZmlybXdhcmUuIFRoZSBQSFkgaXMgbG9va2VkCisJICogdXAgbGF0ZXIgb24uCisJICovCisJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FQUExFKSB7CisJCWdwLT5waHlfdHlwZSA9IHBoeV9taWlfbWRpbzA7CisJCWdwLT50eF9maWZvX3N6ID0gcmVhZGwoZ3AtPnJlZ3MgKyBUWERNQV9GU1opICogNjQ7CisJCWdwLT5yeF9maWZvX3N6ID0gcmVhZGwoZ3AtPnJlZ3MgKyBSWERNQV9GU1opICogNjQ7CisJCWdwLT5zd3JzdF9iYXNlID0gMDsKKworCQltaWZfY2ZnID0gcmVhZGwoZ3AtPnJlZ3MgKyBNSUZfQ0ZHKTsKKwkJbWlmX2NmZyAmPSB+KE1JRl9DRkdfUFNFTEVDVHxNSUZfQ0ZHX1BPTEx8TUlGX0NGR19CQk1PREV8TUlGX0NGR19NREkxKTsKKwkJbWlmX2NmZyB8PSBNSUZfQ0ZHX01ESTA7CisJCXdyaXRlbChtaWZfY2ZnLCBncC0+cmVncyArIE1JRl9DRkcpOworCQl3cml0ZWwoUENTX0RNT0RFX01HTSwgZ3AtPnJlZ3MgKyBQQ1NfRE1PREUpOworCQl3cml0ZWwoTUFDX1hJRkNGR19PRSwgZ3AtPnJlZ3MgKyBNQUNfWElGQ0ZHKTsKKworCQkvKiBXZSBoYXJkLWNvZGUgdGhlIFBIWSBhZGRyZXNzIHNvIHdlIGNhbiBwcm9wZXJseSBicmluZyBpdCBvdXQgb2YKKwkJICogcmVzZXQgbGF0ZXIgb24sIHdlIGNhbid0IHJlYWxseSBwcm9iZSBpdCBhdCB0aGlzIHBvaW50LCB0aG91Z2gKKwkJICogdGhhdCBpc24ndCBhbiBpc3N1ZS4KKwkJICovCisJCWlmIChncC0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQVBQTEVfSzJfR01BQykKKwkJCWdwLT5taWlfcGh5X2FkZHIgPSAxOworCQllbHNlCisJCQlncC0+bWlpX3BoeV9hZGRyID0gMDsKKworCQlyZXR1cm4gMDsKKwl9CisKKwltaWZfY2ZnID0gcmVhZGwoZ3AtPnJlZ3MgKyBNSUZfQ0ZHKTsKKworCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9TVU4gJiYKKwkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU1VOX1JJT19HRU0pIHsKKwkJLyogT25lIG9mIHRoZSBNSUkgUEhZcyBfbXVzdF8gYmUgcHJlc2VudAorCQkgKiBhcyB0aGlzIGNoaXAgaGFzIG5vIGdpZ2FiaXQgUEhZLgorCQkgKi8KKwkJaWYgKChtaWZfY2ZnICYgKE1JRl9DRkdfTURJMCB8IE1JRl9DRkdfTURJMSkpID09IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIlJJTyBHRU0gbGFja3MgTUlJIHBoeSwgbWlmX2NmZ1slMDh4XVxuIiwKKwkJCSAgICAgICBtaWZfY2ZnKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCS8qIERldGVybWluZSBpbml0aWFsIFBIWSBpbnRlcmZhY2UgdHlwZSBndWVzcy4gIE1ESU8xIGlzIHRoZQorCSAqIGV4dGVybmFsIFBIWSBhbmQgdGh1cyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgTURJTzAuCisJICovCisJCisJaWYgKG1pZl9jZmcgJiBNSUZfQ0ZHX01ESTEpIHsKKwkJZ3AtPnBoeV90eXBlID0gcGh5X21paV9tZGlvMTsKKwkJbWlmX2NmZyB8PSBNSUZfQ0ZHX1BTRUxFQ1Q7CisJCXdyaXRlbChtaWZfY2ZnLCBncC0+cmVncyArIE1JRl9DRkcpOworCX0gZWxzZSBpZiAobWlmX2NmZyAmIE1JRl9DRkdfTURJMCkgeworCQlncC0+cGh5X3R5cGUgPSBwaHlfbWlpX21kaW8wOworCQltaWZfY2ZnICY9IH5NSUZfQ0ZHX1BTRUxFQ1Q7CisJCXdyaXRlbChtaWZfY2ZnLCBncC0+cmVncyArIE1JRl9DRkcpOworCX0gZWxzZSB7CisJCWdwLT5waHlfdHlwZSA9IHBoeV9zZXJpYWxpbms7CisJfQorCWlmIChncC0+cGh5X3R5cGUgPT0gcGh5X21paV9tZGlvMSB8fAorCSAgICBncC0+cGh5X3R5cGUgPT0gcGh5X21paV9tZGlvMCkgeworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQkJZ3AtPm1paV9waHlfYWRkciA9IGk7CisJCQlpZiAocGh5X3JlYWQoZ3AsIE1JSV9CTUNSKSAhPSAweGZmZmYpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPT0gMzIpIHsKKwkJCWlmIChwZGV2LT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9TVU5fR0VNKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUklPIE1JSSBwaHkgd2lsbCBub3QgcmVzcG9uZC5cbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWdwLT5waHlfdHlwZSA9IHBoeV9zZXJkZXM7CisJCX0KKwl9CisKKwkvKiBGZXRjaCB0aGUgRklGTyBjb25maWd1cmF0aW9ucyBub3cgdG9vLiAqLworCWdwLT50eF9maWZvX3N6ID0gcmVhZGwoZ3AtPnJlZ3MgKyBUWERNQV9GU1opICogNjQ7CisJZ3AtPnJ4X2ZpZm9fc3ogPSByZWFkbChncC0+cmVncyArIFJYRE1BX0ZTWikgKiA2NDsKKworCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9TVU4pIHsKKwkJaWYgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NVTl9HRU0pIHsKKwkJCWlmIChncC0+dHhfZmlmb19zeiAhPSAoOSAqIDEwMjQpIHx8CisJCQkgICAgZ3AtPnJ4X2ZpZm9fc3ogIT0gKDIwICogMTAyNCkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJHRU0gaGFzIGJvZ3VzIGZpZm8gc2l6ZXMgdHgoJWQpIHJ4KCVkKVxuIiwKKwkJCQkgICAgICAgZ3AtPnR4X2ZpZm9fc3osIGdwLT5yeF9maWZvX3N6KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlncC0+c3dyc3RfYmFzZSA9IDA7CisJCX0gZWxzZSB7CisJCQlpZiAoZ3AtPnR4X2ZpZm9fc3ogIT0gKDIgKiAxMDI0KSB8fAorCQkJICAgIGdwLT5yeF9maWZvX3N6ICE9ICgyICogMTAyNCkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJSSU8gR0VNIGhhcyBib2d1cyBmaWZvIHNpemVzIHR4KCVkKSByeCglZClcbiIsCisJCQkJICAgICAgIGdwLT50eF9maWZvX3N6LCBncC0+cnhfZmlmb19zeik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJZ3AtPnN3cnN0X2Jhc2UgPSAoNjQgLyA0KSA8PCBHUkVHX1NXUlNUX0NBQ0hFX1NISUZUOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIE11c3QgYmUgaW52b2tlZCB1bmRlciBncC0+bG9jayBhbmQgZ3AtPnR4X2xvY2suICovCitzdGF0aWMgdm9pZCBnZW1fcmVpbml0X2NoaXAoc3RydWN0IGdlbSAqZ3ApCit7CisJLyogUmVzZXQgdGhlIGNoaXAgKi8KKwlnZW1fcmVzZXQoZ3ApOworCisJLyogTWFrZSBzdXJlIGludHMgYXJlIGRpc2FibGVkICovCisJZ2VtX2Rpc2FibGVfaW50cyhncCk7CisKKwkvKiBBbGxvY2F0ZSAmIHNldHVwIHJpbmcgYnVmZmVycyAqLworCWdlbV9pbml0X3JpbmdzKGdwKTsKKworCS8qIENvbmZpZ3VyZSBwYXVzZSB0aHJlc2hvbGRzICovCisJZ2VtX2luaXRfcGF1c2VfdGhyZXNob2xkcyhncCk7CisKKwkvKiBJbml0IERNQSAmIE1BQyBlbmdpbmVzICovCisJZ2VtX2luaXRfZG1hKGdwKTsKKwlnZW1faW5pdF9tYWMoZ3ApOworfQorCisKKy8qIE11c3QgYmUgaW52b2tlZCB3aXRoIG5vIGxvY2sgaGVsZC4gKi8KK3N0YXRpYyB2b2lkIGdlbV9zdG9wX3BoeShzdHJ1Y3QgZ2VtICpncCwgaW50IHdvbCkKK3sKKwl1MzIgbWlmY2ZnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBMZXQgdGhlIGNoaXAgc2V0dGxlIGRvd24gYSBiaXQsIGl0IHNlZW1zIHRoYXQgaGVscHMKKwkgKiBmb3Igc2xlZXAgbW9kZSBvbiBzb21lIG1vZGVscworCSAqLworCW1zbGVlcCgxMCk7CisKKwkvKiBNYWtlIHN1cmUgd2UgYXJlbid0IHBvbGxpbmcgUEhZIHN0YXR1cyBjaGFuZ2UuIFdlCisJICogZG9uJ3QgY3VycmVudGx5IHVzZSB0aGF0IGZlYXR1cmUgdGhvdWdoCisJICovCisJbWlmY2ZnID0gcmVhZGwoZ3AtPnJlZ3MgKyBNSUZfQ0ZHKTsKKwltaWZjZmcgJj0gfk1JRl9DRkdfUE9MTDsKKwl3cml0ZWwobWlmY2ZnLCBncC0+cmVncyArIE1JRl9DRkcpOworCisJaWYgKHdvbCAmJiBncC0+aGFzX3dvbCkgeworCQl1bnNpZ25lZCBjaGFyICplID0gJmdwLT5kZXYtPmRldl9hZGRyWzBdOworCQl1MzIgY3NyOworCisJCS8qIFNldHVwIHdha2Utb24tbGFuIGZvciBNQUdJQyBwYWNrZXQgKi8KKwkJd3JpdGVsKE1BQ19SWENGR19IRkUgfCBNQUNfUlhDRkdfU0ZDUyB8IE1BQ19SWENGR19FTkFCLAorCQkgICAgICAgZ3AtPnJlZ3MgKyBNQUNfUlhDRkcpOwkKKwkJd3JpdGVsKChlWzRdIDw8IDgpIHwgZVs1XSwgZ3AtPnJlZ3MgKyBXT0xfTUFUQ0gwKTsKKwkJd3JpdGVsKChlWzJdIDw8IDgpIHwgZVszXSwgZ3AtPnJlZ3MgKyBXT0xfTUFUQ0gxKTsKKwkJd3JpdGVsKChlWzBdIDw8IDgpIHwgZVsxXSwgZ3AtPnJlZ3MgKyBXT0xfTUFUQ0gyKTsKKworCQl3cml0ZWwoV09MX01DT1VOVF9OIHwgV09MX01DT1VOVF9NLCBncC0+cmVncyArIFdPTF9NQ09VTlQpOworCQljc3IgPSBXT0xfV0FLRUNTUl9FTkFCTEU7CisJCWlmICgocmVhZGwoZ3AtPnJlZ3MgKyBNQUNfWElGQ0ZHKSAmIE1BQ19YSUZDRkdfR01JSSkgPT0gMCkKKwkJCWNzciB8PSBXT0xfV0FLRUNTUl9NSUk7CisJCXdyaXRlbChjc3IsIGdwLT5yZWdzICsgV09MX1dBS0VDU1IpOworCX0gZWxzZSB7CisJCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19SWENGRyk7CisJCSh2b2lkKXJlYWRsKGdwLT5yZWdzICsgTUFDX1JYQ0ZHKTsKKwkJLyogTWFjaGluZSBzbGVlcCB3aWxsIGRpZSBpbiBzdHJhbmdlIHdheXMgaWYgd2UKKwkJICogZG9udCB3YWl0IGEgYml0IGhlcmUsIGxvb2tzIGxpa2UgdGhlIGNoaXAgdGFrZXMKKwkJICogc29tZSB0aW1lIHRvIHJlYWxseSBzaHV0IGRvd24KKwkJICovCisJCW1zbGVlcCgxMCk7CisJfQorCisJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX1RYQ0ZHKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfWElGQ0ZHKTsKKwl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBUWERNQV9DRkcpOworCXdyaXRlbCgwLCBncC0+cmVncyArIFJYRE1BX0NGRyk7CisKKwlpZiAoIXdvbCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrKCZncC0+dHhfbG9jayk7CisJCWdlbV9yZXNldChncCk7CisJCXdyaXRlbChNQUNfVFhSU1RfQ01ELCBncC0+cmVncyArIE1BQ19UWFJTVCk7CisJCXdyaXRlbChNQUNfUlhSU1RfQ01ELCBncC0+cmVncyArIE1BQ19SWFJTVCk7CisJCXNwaW5fdW5sb2NrKCZncC0+dHhfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7CisKKwkJLyogTm8gbmVlZCB0byB0YWtlIHRoZSBsb2NrIGhlcmUgKi8KKworCQlpZiAoZm91bmRfbWlpX3BoeShncCkgJiYgZ3AtPnBoeV9taWkuZGVmLT5vcHMtPnN1c3BlbmQpCisJCQlncC0+cGh5X21paS5kZWYtPm9wcy0+c3VzcGVuZCgmZ3AtPnBoeV9taWkpOworCisJCS8qIEFjY29yZGluZyB0byBBcHBsZSwgd2UgbXVzdCBzZXQgdGhlIE1ESU8gcGlucyB0byB0aGlzIGJlZ25pZ24KKwkJICogc3RhdGUgb3Igd2UgbWF5IDEpIGVhdCBtb3JlIGN1cnJlbnQsIDIpIGRhbWFnZSBzb21lIFBIWXMKKwkJICovCisJCXdyaXRlbChtaWZjZmcgfCBNSUZfQ0ZHX0JCTU9ERSwgZ3AtPnJlZ3MgKyBNSUZfQ0ZHKTsKKwkJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUlGX0JCQ0xLKTsKKwkJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUlGX0JCREFUQSk7CisJCXdyaXRlbCgwLCBncC0+cmVncyArIE1JRl9CQk9FTkFCKTsKKwkJd3JpdGVsKE1BQ19YSUZDRkdfR01JSSB8IE1BQ19YSUZDRkdfTEJDSywgZ3AtPnJlZ3MgKyBNQUNfWElGQ0ZHKTsKKwkJKHZvaWQpIHJlYWRsKGdwLT5yZWdzICsgTUFDX1hJRkNGRyk7CisJfQorfQorCisKK3N0YXRpYyBpbnQgZ2VtX2RvX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncC0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9jaygmZ3AtPnR4X2xvY2spOworCisJLyogRW5hYmxlIHRoZSBjZWxsICovCisJZ2VtX2dldF9jZWxsKGdwKTsKKworCS8qIEluaXQgJiBzZXR1cCBjaGlwIGhhcmR3YXJlICovCisJZ2VtX3JlaW5pdF9jaGlwKGdwKTsKKworCWdwLT5ydW5uaW5nID0gMTsKKworCWlmIChncC0+bHN0YXRlID09IGxpbmtfdXApIHsKKwkJbmV0aWZfY2Fycmllcl9vbihncC0+ZGV2KTsKKwkJZ2VtX3NldF9saW5rX21vZGVzKGdwKTsKKwl9CisKKwluZXRpZl93YWtlX3F1ZXVlKGdwLT5kZXYpOworCisJc3Bpbl91bmxvY2soJmdwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHJlcXVlc3RfaXJxKGdwLT5wZGV2LT5pcnEsIGdlbV9pbnRlcnJ1cHQsCisJCQkJICAgU0FfU0hJUlEsIGRldi0+bmFtZSwgKHZvaWQgKilkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZXF1ZXN0IGlycSAhXG4iLCBncC0+ZGV2LT5uYW1lKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrKCZncC0+dHhfbG9jayk7CisKKwkJZ3AtPnJ1bm5pbmcgPSAgMDsKKwkJZ2VtX3Jlc2V0KGdwKTsKKwkJZ2VtX2NsZWFuX3JpbmdzKGdwKTsKKwkJZ2VtX3B1dF9jZWxsKGdwKTsKKwkJCisJCXNwaW5fdW5sb2NrKCZncC0+dHhfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdlbV9kb19zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB3b2wpCit7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncC0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9jaygmZ3AtPnR4X2xvY2spOworCisJZ3AtPnJ1bm5pbmcgPSAwOworCisJLyogU3RvcCBuZXRpZiBxdWV1ZSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIE1ha2Ugc3VyZSBpbnRzIGFyZSBkaXNhYmxlZCAqLworCWdlbV9kaXNhYmxlX2ludHMoZ3ApOworCisJLyogV2UgY2FuIGRyb3AgdGhlIGxvY2sgbm93ICovCisJc3Bpbl91bmxvY2soJmdwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncC0+bG9jaywgZmxhZ3MpOworCisJLyogSWYgd2UgYXJlIGdvaW5nIHRvIHNsZWVwIHdpdGggV09MICovCisJZ2VtX3N0b3BfZG1hKGdwKTsKKwltc2xlZXAoMTApOworCWlmICghd29sKQorCQlnZW1fcmVzZXQoZ3ApOworCW1zbGVlcCgxMCk7CisKKwkvKiBHZXQgcmlkIG9mIHJpbmdzICovCisJZ2VtX2NsZWFuX3JpbmdzKGdwKTsKKworCS8qIE5vIGlycSBuZWVkZWQgYW55bW9yZSAqLworCWZyZWVfaXJxKGdwLT5wZGV2LT5pcnEsICh2b2lkICopIGRldik7CisKKwkvKiBDZWxsIG5vdCBuZWVkZWQgbmVpdGhlciBpZiBubyBXT0wgKi8KKwlpZiAoIXdvbCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKwkJZ2VtX3B1dF9jZWxsKGdwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdlbV9yZXNldF90YXNrKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdlbSAqZ3AgPSAoc3RydWN0IGdlbSAqKSBkYXRhOworCisJZG93bigmZ3AtPnBtX3NlbSk7CisKKwluZXRpZl9wb2xsX2Rpc2FibGUoZ3AtPmRldik7CisKKwlzcGluX2xvY2tfaXJxKCZncC0+bG9jayk7CisJc3Bpbl9sb2NrKCZncC0+dHhfbG9jayk7CisKKwlpZiAoZ3AtPnJ1bm5pbmcgPT0gMCkKKwkJZ290byBub3RfcnVubmluZzsKKworCWlmIChncC0+cnVubmluZykgeworCQluZXRpZl9zdG9wX3F1ZXVlKGdwLT5kZXYpOworCisJCS8qIFJlc2V0IHRoZSBjaGlwICYgcmluZ3MgKi8KKwkJZ2VtX3JlaW5pdF9jaGlwKGdwKTsKKwkJaWYgKGdwLT5sc3RhdGUgPT0gbGlua191cCkKKwkJCWdlbV9zZXRfbGlua19tb2RlcyhncCk7CisJCW5ldGlmX3dha2VfcXVldWUoZ3AtPmRldik7CisJfQorIG5vdF9ydW5uaW5nOgorCWdwLT5yZXNldF90YXNrX3BlbmRpbmcgPSAwOworCisJc3Bpbl91bmxvY2soJmdwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmdwLT5sb2NrKTsKKworCW5ldGlmX3BvbGxfZW5hYmxlKGdwLT5kZXYpOworCisJdXAoJmdwLT5wbV9zZW0pOworfQorCisKK3N0YXRpYyBpbnQgZ2VtX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKwlpbnQgcmMgPSAwOworCisJZG93bigmZ3AtPnBtX3NlbSk7CisKKwkvKiBXZSBuZWVkIHRoZSBjZWxsIGVuYWJsZWQgKi8KKwlpZiAoIWdwLT5hc2xlZXApCisJCXJjID0gZ2VtX2RvX3N0YXJ0KGRldik7CisJZ3AtPm9wZW5lZCA9IChyYyA9PSAwKTsKKworCXVwKCZncC0+cG1fc2VtKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBnZW1fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKworCS8qIE5vdGU6IHdlIGRvbid0IG5lZWQgdG8gY2FsbCBuZXRpZl9wb2xsX2Rpc2FibGUoKSBoZXJlIGJlY2F1c2UKKwkgKiBvdXIgY2FsbGVyIChkZXZfY2xvc2UpIGFscmVhZHkgZGlkIGl0IGZvciB1cworCSAqLworCisJZG93bigmZ3AtPnBtX3NlbSk7CisKKwlncC0+b3BlbmVkID0gMDsJCisJaWYgKCFncC0+YXNsZWVwKQorCQlnZW1fZG9fc3RvcChkZXYsIDApOworCisJdXAoJmdwLT5wbV9zZW0pOworCQorCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGdlbV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZG93bigmZ3AtPnBtX3NlbSk7CisKKwluZXRpZl9wb2xsX2Rpc2FibGUoZGV2KTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBzdXNwZW5kaW5nLCBXYWtlT25MYW4gJXNcbiIsCisJICAgICAgIGRldi0+bmFtZSwKKwkgICAgICAgKGdwLT53YWtlX29uX2xhbiAmJiBncC0+b3BlbmVkKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCQorCS8qIEtlZXAgdGhlIGNlbGwgZW5hYmxlZCBkdXJpbmcgdGhlIGVudGlyZSBvcGVyYXRpb24gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2soJmdwLT50eF9sb2NrKTsKKwlnZW1fZ2V0X2NlbGwoZ3ApOworCXNwaW5fdW5sb2NrKCZncC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKworCS8qIElmIHRoZSBkcml2ZXIgaXMgb3BlbmVkLCB3ZSBzdG9wIHRoZSBNQUMgKi8KKwlpZiAoZ3AtPm9wZW5lZCkgeworCQkvKiBTdG9wIHRyYWZmaWMsIG1hcmsgdXMgY2xvc2VkICovCisJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKworCQkvKiBTd2l0Y2ggb2ZmIE1BQywgcmVtZW1iZXIgV09MIHNldHRpbmcgKi8KKwkJZ3AtPmFzbGVlcF93b2wgPSBncC0+d2FrZV9vbl9sYW47CisJCWdlbV9kb19zdG9wKGRldiwgZ3AtPmFzbGVlcF93b2wpOworCX0gZWxzZQorCQlncC0+YXNsZWVwX3dvbCA9IDA7CisKKwkvKiBNYXJrIHVzIGFzbGVlcCAqLworCWdwLT5hc2xlZXAgPSAxOworCXdtYigpOworCisJLyogU3RvcCB0aGUgbGluayB0aW1lciAqLworCWRlbF90aW1lcl9zeW5jKCZncC0+bGlua190aW1lcik7CisKKwkvKiBOb3cgd2UgcmVsZWFzZSB0aGUgc2VtYXBob3JlIHRvIG5vdCBibG9jayB0aGUgcmVzZXQgdGFzayB3aG8KKwkgKiBjYW4gdGFrZSBpdCB0b28uIFdlIGFyZSBtYXJrZWQgYXNsZWVwLCBzbyB0aGVyZSB3aWxsIGJlIG5vCisJICogY29uZmxpY3QgaGVyZQorCSAqLworCXVwKCZncC0+cG1fc2VtKTsKKworCS8qIFdhaXQgZm9yIGEgcGVuZGluZyByZXNldCB0YXNrIHRvIGNvbXBsZXRlICovCisJd2hpbGUgKGdwLT5yZXNldF90YXNrX3BlbmRpbmcpCisJCXlpZWxkKCk7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCS8qIFNodXQgdGhlIFBIWSBkb3duIGV2ZW50dWFsbHkgYW5kIHNldHVwIFdPTCAqLworCWdlbV9zdG9wX3BoeShncCwgZ3AtPmFzbGVlcF93b2wpOworCisJLyogTWFrZSBzdXJlIGJ1cyBtYXN0ZXIgaXMgZGlzYWJsZWQgKi8KKwlwY2lfZGlzYWJsZV9kZXZpY2UoZ3AtPnBkZXYpOworCisJLyogUmVsZWFzZSB0aGUgY2VsbCwgbm8gbmVlZCB0byB0YWtlIGEgbG9jayBhdCB0aGlzIHBvaW50IHNpbmNlCisJICogbm90aGluZyBlbHNlIGNhbiBoYXBwZW4gbm93CisJICovCisJZ2VtX3B1dF9jZWxsKGdwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlc3VtaW5nXG4iLCBkZXYtPm5hbWUpOworCisJZG93bigmZ3AtPnBtX3NlbSk7CisKKwkvKiBLZWVwIHRoZSBjZWxsIGVuYWJsZWQgZHVyaW5nIHRoZSBlbnRpcmUgb3BlcmF0aW9uLCBubyBuZWVkIHRvCisJICogdGFrZSBhIGxvY2sgaGVyZSB0aG8gc2luY2Ugbm90aGluZyBlbHNlIGNhbiBoYXBwZW4gd2hpbGUgd2UgYXJlCisJICogbWFya2VkIGFzbGVlcAorCSAqLworCWdlbV9nZXRfY2VsbChncCk7CisKKwkvKiBNYWtlIHN1cmUgUENJIGFjY2VzcyBhbmQgYnVzIG1hc3RlciBhcmUgZW5hYmxlZCAqLworCWlmIChwY2lfZW5hYmxlX2RldmljZShncC0+cGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgcmUtZW5hYmxlIGNoaXAgIVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCS8qIFB1dCBjZWxsIGFuZCBmb3JnZXQgaXQgZm9yIG5vdywgaXQgd2lsbCBiZSBjb25zaWRlcmVkIGFzCisJCSAqIHN0aWxsIGFzbGVlcCwgYSBuZXcgc2xlZXAgY3ljbGUgbWF5IGJyaW5nIGl0IGJhY2sKKwkJICovCisJCWdlbV9wdXRfY2VsbChncCk7CisJCXVwKCZncC0+cG1fc2VtKTsKKwkJcmV0dXJuIDA7CisJfQorCXBjaV9zZXRfbWFzdGVyKGdwLT5wZGV2KTsKKworCS8qIFJlc2V0IGV2ZXJ5dGhpbmcgKi8KKwlnZW1fcmVzZXQoZ3ApOworCisJLyogTWFyayB1cyB3b2tlbiB1cCAqLworCWdwLT5hc2xlZXAgPSAwOworCXdtYigpOworCisJLyogQnJpbmcgdGhlIFBIWSBiYWNrLiBBZ2FpbiwgbG9jayBpcyB1c2VsZXNzIGF0IHRoaXMgcG9pbnQgYXMKKwkgKiBub3RoaW5nIGNhbiBiZSBoYXBwZW5pbmcgdW50aWwgd2UgcmVzdGFydCB0aGUgd2hvbGUgdGhpbmcKKwkgKi8KKwlnZW1faW5pdF9waHkoZ3ApOworCisJLyogSWYgd2Ugd2VyZSBvcGVuZWQsIGJyaW5nIGV2ZXJ5dGhpbmcgYmFjayAqLworCWlmIChncC0+b3BlbmVkKSB7CisJCS8qIFJlc3RhcnQgTUFDICovCisJCWdlbV9kb19zdGFydChkZXYpOworCisJCS8qIFJlLWF0dGFjaCBuZXQgZGV2aWNlICovCisJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZncC0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9jaygmZ3AtPnR4X2xvY2spOworCisJLyogSWYgd2UgaGFkIFdPTCBlbmFibGVkLCB0aGUgY2VsbCBjbG9jayB3YXMgbmV2ZXIgdHVybmVkIG9mZiBkdXJpbmcKKwkgKiBzbGVlcCwgc28gd2UgZW5kIHVwIGJlZWluZyB1bmJhbGFuY2VkLiBGaXggdGhhdCBoZXJlCisJICovCisJaWYgKGdwLT5hc2xlZXBfd29sKQorCQlnZW1fcHV0X2NlbGwoZ3ApOworCisJLyogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IG5lZWQgdG8gaG9sZCB0aGUgY2VsbCwgaXQgd2lsbCBiZSBoZWxkIGlmIHRoZQorCSAqIGRyaXZlciBpcyBvcGVuIGJ5IGdlbV9kb19zdGFydCgpLgorCSAqLworCWdlbV9wdXRfY2VsbChncCk7CisKKwlzcGluX3VubG9jaygmZ3AtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7CisKKwluZXRpZl9wb2xsX2VuYWJsZShkZXYpOworCQorCXVwKCZncC0+cG1fc2VtKTsKKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdlbV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmZ3AtPm5ldF9zdGF0czsKKworCXNwaW5fbG9ja19pcnEoJmdwLT5sb2NrKTsKKwlzcGluX2xvY2soJmdwLT50eF9sb2NrKTsKKworCS8qIEkgaGF2ZSBzZWVuIHRoaXMgYmVpbmcgY2FsbGVkIHdoaWxlIHRoZSBQTSB3YXMgaW4gcHJvZ3Jlc3MsCisJICogc28gd2Ugc2hpZWxkIGFnYWluc3QgdGhpcworCSAqLworCWlmIChncC0+cnVubmluZykgeworCQlzdGF0cy0+cnhfY3JjX2Vycm9ycyArPSByZWFkbChncC0+cmVncyArIE1BQ19GQ1NFUlIpOworCQl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfRkNTRVJSKTsKKworCQlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzICs9IHJlYWRsKGdwLT5yZWdzICsgTUFDX0FFUlIpOworCQl3cml0ZWwoMCwgZ3AtPnJlZ3MgKyBNQUNfQUVSUik7CisKKwkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgKz0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfTEVSUik7CisJCXdyaXRlbCgwLCBncC0+cmVncyArIE1BQ19MRVJSKTsKKworCQlzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMgKz0gcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfRUNPTEwpOworCQlzdGF0cy0+Y29sbGlzaW9ucyArPQorCQkJKHJlYWRsKGdwLT5yZWdzICsgTUFDX0VDT0xMKSArCisJCQkgcmVhZGwoZ3AtPnJlZ3MgKyBNQUNfTENPTEwpKTsKKwkJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0VDT0xMKTsKKwkJd3JpdGVsKDAsIGdwLT5yZWdzICsgTUFDX0xDT0xMKTsKKwl9CisKKwlzcGluX3VubG9jaygmZ3AtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmZ3AtPmxvY2spOworCisJcmV0dXJuICZncC0+bmV0X3N0YXRzOworfQorCitzdGF0aWMgdm9pZCBnZW1fc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCXUzMiByeGNmZywgcnhjZmdfbmV3OworCWludCBsaW1pdCA9IDEwMDAwOworCQorCisJc3Bpbl9sb2NrX2lycSgmZ3AtPmxvY2spOworCXNwaW5fbG9jaygmZ3AtPnR4X2xvY2spOworCisJaWYgKCFncC0+cnVubmluZykKKwkJZ290byBiYWlsOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJcnhjZmcgPSByZWFkbChncC0+cmVncyArIE1BQ19SWENGRyk7CisJcnhjZmdfbmV3ID0gZ2VtX3NldHVwX211bHRpY2FzdChncCk7CisjaWZkZWYgU1RSSVBfRkNTCisJcnhjZmdfbmV3IHw9IE1BQ19SWENGR19TRkNTOworI2VuZGlmCisJZ3AtPm1hY19yeF9jZmcgPSByeGNmZ19uZXc7CisJCisJd3JpdGVsKHJ4Y2ZnICYgfk1BQ19SWENGR19FTkFCLCBncC0+cmVncyArIE1BQ19SWENGRyk7CisJd2hpbGUgKHJlYWRsKGdwLT5yZWdzICsgTUFDX1JYQ0ZHKSAmIE1BQ19SWENGR19FTkFCKSB7CisJCWlmICghbGltaXQtLSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKworCXJ4Y2ZnICY9IH4oTUFDX1JYQ0ZHX1BST00gfCBNQUNfUlhDRkdfSEZFKTsKKwlyeGNmZyB8PSByeGNmZ19uZXc7CisKKwl3cml0ZWwocnhjZmcsIGdwLT5yZWdzICsgTUFDX1JYQ0ZHKTsKKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworIGJhaWw6CisJc3Bpbl91bmxvY2soJmdwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmdwLT5sb2NrKTsKK30KKworLyogSnVtYm8tZ3JhbXMgZG9uJ3Qgc2VlbSB0byB3b3JrIDotKCAqLworI2RlZmluZSBHRU1fTUlOX01UVQk2OAorI2lmIDEKKyNkZWZpbmUgR0VNX01BWF9NVFUJMTUwMAorI2Vsc2UKKyNkZWZpbmUgR0VNX01BWF9NVFUJOTAwMAorI2VuZGlmCisKK3N0YXRpYyBpbnQgZ2VtX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisKKwlpZiAobmV3X210dSA8IEdFTV9NSU5fTVRVIHx8IG5ld19tdHUgPiBHRU1fTUFYX01UVSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSB8fCAhbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkgeworCQkvKiBXZSdsbCBqdXN0IGNhdGNoIGl0IGxhdGVyIHdoZW4gdGhlCisJCSAqIGRldmljZSBpcyB1cCdkIG9yIHJlc3VtZWQuCisJCSAqLworCQlkZXYtPm10dSA9IG5ld19tdHU7CisJCXJldHVybiAwOworCX0KKworCWRvd24oJmdwLT5wbV9zZW0pOworCXNwaW5fbG9ja19pcnEoJmdwLT5sb2NrKTsKKwlzcGluX2xvY2soJmdwLT50eF9sb2NrKTsKKwlkZXYtPm10dSA9IG5ld19tdHU7CisJaWYgKGdwLT5ydW5uaW5nKSB7CisJCWdlbV9yZWluaXRfY2hpcChncCk7CisJCWlmIChncC0+bHN0YXRlID09IGxpbmtfdXApCisJCQlnZW1fc2V0X2xpbmtfbW9kZXMoZ3ApOworCX0KKwlzcGluX3VubG9jaygmZ3AtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmZ3AtPmxvY2spOworCXVwKCZncC0+cG1fc2VtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnZW1fZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKyAgCisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShncC0+cGRldikpOworfQorICAKK3N0YXRpYyBpbnQgZ2VtX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKworCWlmIChncC0+cGh5X3R5cGUgPT0gcGh5X21paV9tZGlvMCB8fAorCSAgICBncC0+cGh5X3R5cGUgPT0gcGh5X21paV9tZGlvMSkgeworCQlpZiAoZ3AtPnBoeV9taWkuZGVmKQorCQkJY21kLT5zdXBwb3J0ZWQgPSBncC0+cGh5X21paS5kZWYtPmZlYXR1cmVzOworCQllbHNlCisJCQljbWQtPnN1cHBvcnRlZCA9IChTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkJCQkJICBTVVBQT1JURURfMTBiYXNlVF9GdWxsKTsKKworCQkvKiBYWFggaGFyZGNvZGVkIHN0dWZmIGZvciBub3cgKi8KKwkJY21kLT5wb3J0ID0gUE9SVF9NSUk7CisJCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0VYVEVSTkFMOworCQljbWQtPnBoeV9hZGRyZXNzID0gMDsgLyogWFhYIGZpeGVkIFBIWUFEICovCisKKwkJLyogUmV0dXJuIGN1cnJlbnQgUEhZIHNldHRpbmdzICovCisJCXNwaW5fbG9ja19pcnEoJmdwLT5sb2NrKTsKKwkJY21kLT5hdXRvbmVnID0gZ3AtPndhbnRfYXV0b25lZzsKKwkJY21kLT5zcGVlZCA9IGdwLT5waHlfbWlpLnNwZWVkOworCQljbWQtPmR1cGxleCA9IGdwLT5waHlfbWlpLmR1cGxleDsJCQkKKwkJY21kLT5hZHZlcnRpc2luZyA9IGdwLT5waHlfbWlpLmFkdmVydGlzaW5nOworCisJCS8qIElmIHdlIHN0YXJ0ZWQgd2l0aCBhIGZvcmNlZCBtb2RlLCB3ZSBkb24ndCBoYXZlIGEgZGVmYXVsdAorCQkgKiBhZHZlcnRpc2Ugc2V0LCB3ZSBuZWVkIHRvIHJldHVybiBzb21ldGhpbmcgc2Vuc2libGUgc28KKwkJICogdXNlcmxhbmQgY2FuIHJlLWVuYWJsZSBhdXRvbmVnIHByb3Blcmx5LgorCQkgKi8KKwkJaWYgKGNtZC0+YWR2ZXJ0aXNpbmcgPT0gMCkKKwkJCWNtZC0+YWR2ZXJ0aXNpbmcgPSBjbWQtPnN1cHBvcnRlZDsKKwkJc3Bpbl91bmxvY2tfaXJxKCZncC0+bG9jayk7CisJfSBlbHNlIHsgLy8gWFhYIFBDUyA/CisJCWNtZC0+c3VwcG9ydGVkID0KKwkJCShTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CisJCQkgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8CisJCQkgU1VQUE9SVEVEX0F1dG9uZWcpOworCQljbWQtPmFkdmVydGlzaW5nID0gY21kLT5zdXBwb3J0ZWQ7CisJCWNtZC0+c3BlZWQgPSAwOworCQljbWQtPmR1cGxleCA9IGNtZC0+cG9ydCA9IGNtZC0+cGh5X2FkZHJlc3MgPQorCQkJY21kLT50cmFuc2NlaXZlciA9IGNtZC0+YXV0b25lZyA9IDA7CisJfQorCWNtZC0+bWF4dHhwa3QgPSBjbWQtPm1heHJ4cGt0ID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbV9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisKKwkvKiBWZXJpZnkgdGhlIHNldHRpbmdzIHdlIGNhcmUgYWJvdXQuICovCisJaWYgKGNtZC0+YXV0b25lZyAhPSBBVVRPTkVHX0VOQUJMRSAmJgorCSAgICBjbWQtPmF1dG9uZWcgIT0gQVVUT05FR19ESVNBQkxFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUgJiYKKwkgICAgY21kLT5hZHZlcnRpc2luZyA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFICYmCisJICAgICgoY21kLT5zcGVlZCAhPSBTUEVFRF8xMDAwICYmCisJICAgICAgY21kLT5zcGVlZCAhPSBTUEVFRF8xMDAgJiYKKwkgICAgICBjbWQtPnNwZWVkICE9IFNQRUVEXzEwKSB8fAorCSAgICAgKGNtZC0+ZHVwbGV4ICE9IERVUExFWF9IQUxGICYmCisJICAgICAgY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJICAgICAgCisJLyogQXBwbHkgc2V0dGluZ3MgYW5kIHJlc3RhcnQgbGluayBwcm9jZXNzLiAqLworCXNwaW5fbG9ja19pcnEoJmdwLT5sb2NrKTsKKwlnZW1fZ2V0X2NlbGwoZ3ApOworCWdlbV9iZWdpbl9hdXRvX25lZ290aWF0aW9uKGdwLCBjbWQpOworCWdlbV9wdXRfY2VsbChncCk7CisJc3Bpbl91bmxvY2tfaXJxKCZncC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZW1fbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCisJaWYgKCFncC0+d2FudF9hdXRvbmVnKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFJlc3RhcnQgbGluayBwcm9jZXNzLiAqLworCXNwaW5fbG9ja19pcnEoJmdwLT5sb2NrKTsKKwlnZW1fZ2V0X2NlbGwoZ3ApOworCWdlbV9iZWdpbl9hdXRvX25lZ290aWF0aW9uKGdwLCBOVUxMKTsKKwlnZW1fcHV0X2NlbGwoZ3ApOworCXNwaW5fdW5sb2NrX2lycSgmZ3AtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgZ2VtX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCXJldHVybiBncC0+bXNnX2VuYWJsZTsKK30KKyAgCitzdGF0aWMgdm9pZCBnZW1fc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKwlncC0+bXNnX2VuYWJsZSA9IHZhbHVlOworfQorCisKKy8qIEFkZCBtb3JlIHdoZW4gSSB1bmRlcnN0YW5kIGhvdyB0byBwcm9ncmFtIHRoZSBjaGlwICovCisvKiBsaWtlIFdBS0VfVUNBU1QgfCBXQUtFX01DQVNUIHwgV0FLRV9CQ0FTVCAqLworCisjZGVmaW5lIFdPTF9TVVBQT1JURURfTUFTSwkoV0FLRV9NQUdJQykKKworc3RhdGljIHZvaWQgZ2VtX2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCBnZW0gKmdwID0gZGV2LT5wcml2OworCisJLyogQWRkIG1vcmUgd2hlbiBJIHVuZGVyc3RhbmQgaG93IHRvIHByb2dyYW0gdGhlIGNoaXAgKi8KKwlpZiAoZ3AtPmhhc193b2wpIHsKKwkJd29sLT5zdXBwb3J0ZWQgPSBXT0xfU1VQUE9SVEVEX01BU0s7CisJCXdvbC0+d29sb3B0cyA9IGdwLT53YWtlX29uX2xhbjsKKwl9IGVsc2UgeworCQl3b2wtPnN1cHBvcnRlZCA9IDA7CisJCXdvbC0+d29sb3B0cyA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IGdlbV9zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKworCWlmICghZ3AtPmhhc193b2wpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlncC0+d2FrZV9vbl9sYW4gPSB3b2wtPndvbG9wdHMgJiBXT0xfU1VQUE9SVEVEX01BU0s7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZ2VtX2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBnZW1fZ2V0X2RydmluZm8sCisJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9zZXR0aW5ncwkJPSBnZW1fZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gZ2VtX3NldF9zZXR0aW5ncywKKwkubndheV9yZXNldAkJPSBnZW1fbndheV9yZXNldCwKKwkuZ2V0X21zZ2xldmVsCQk9IGdlbV9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSBnZW1fc2V0X21zZ2xldmVsLAorCS5nZXRfd29sCQk9IGdlbV9nZXRfd29sLAorCS5zZXRfd29sCQk9IGdlbV9zZXRfd29sLAorfTsKKworc3RhdGljIGludCBnZW1faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IGdlbSAqZ3AgPSBkZXYtPnByaXY7CisJc3RydWN0IG1paV9pb2N0bF9kYXRhICpkYXRhID0gaWZfbWlpKGlmcik7CisJaW50IHJjID0gLUVPUE5PVFNVUFA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIEhvbGQgdGhlIFBNIHNlbWFwaG9yZSB3aGlsZSBkb2luZyBpb2N0bCdzIG9yIHdlIG1heSBjb2xsaWRlCisJICogd2l0aCBwb3dlciBtYW5hZ2VtZW50LgorCSAqLworCWRvd24oJmdwLT5wbV9zZW0pOworCQkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKwlnZW1fZ2V0X2NlbGwoZ3ApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0dNSUlQSFk6CQkvKiBHZXQgYWRkcmVzcyBvZiBNSUkgUEhZIGluIHVzZS4gKi8KKwkJZGF0YS0+cGh5X2lkID0gZ3AtPm1paV9waHlfYWRkcjsKKwkJLyogRmFsbHRocm91Z2guLi4gKi8KKworCWNhc2UgU0lPQ0dNSUlSRUc6CQkvKiBSZWFkIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJCWlmICghZ3AtPnJ1bm5pbmcpCisJCQlyYyA9IC1FQUdBSU47CisJCWVsc2UgeworCQkJZGF0YS0+dmFsX291dCA9IF9fcGh5X3JlYWQoZ3AsIGRhdGEtPnBoeV9pZCAmIDB4MWYsCisJCQkJCQkgICBkYXRhLT5yZWdfbnVtICYgMHgxZik7CisJCQlyYyA9IDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTTUlJUkVHOgkJLyogV3JpdGUgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmMgPSAtRVBFUk07CisJCWVsc2UgaWYgKCFncC0+cnVubmluZykKKwkJCXJjID0gLUVBR0FJTjsKKwkJZWxzZSB7CisJCQlfX3BoeV93cml0ZShncCwgZGF0YS0+cGh5X2lkICYgMHgxZiwgZGF0YS0+cmVnX251bSAmIDB4MWYsCisJCQkJICAgIGRhdGEtPnZhbF9pbik7CisJCQlyYyA9IDA7CisJCX0KKwkJYnJlYWs7CisJfTsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3AtPmxvY2ssIGZsYWdzKTsKKwlnZW1fcHV0X2NlbGwoZ3ApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwLT5sb2NrLCBmbGFncyk7CisKKwl1cCgmZ3AtPnBtX3NlbSk7CisJCisJcmV0dXJuIHJjOworfQorCisjaWYgKCFkZWZpbmVkKF9fc3BhcmNfXykgJiYgIWRlZmluZWQoQ09ORklHX1BQQ19QTUFDKSkKKy8qIEZldGNoIE1BQyBhZGRyZXNzIGZyb20gdml0YWwgcHJvZHVjdCBkYXRhIG9mIFBDSSBST00uICovCitzdGF0aWMgdm9pZCBmaW5kX2V0aF9hZGRyX2luX3ZwZCh2b2lkIF9faW9tZW0gKnJvbV9iYXNlLCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpkZXZfYWRkcikKK3sKKwlpbnQgdGhpc19vZmZzZXQ7CisKKwlmb3IgKHRoaXNfb2Zmc2V0ID0gMHgyMDsgdGhpc19vZmZzZXQgPCBsZW47IHRoaXNfb2Zmc2V0KyspIHsKKwkJdm9pZCBfX2lvbWVtICpwID0gcm9tX2Jhc2UgKyB0aGlzX29mZnNldDsKKwkJaW50IGk7CisKKwkJaWYgKHJlYWRiKHAgKyAwKSAhPSAweDkwIHx8CisJCSAgICByZWFkYihwICsgMSkgIT0gMHgwMCB8fAorCQkgICAgcmVhZGIocCArIDIpICE9IDB4MDkgfHwKKwkJICAgIHJlYWRiKHAgKyAzKSAhPSAweDRlIHx8CisJCSAgICByZWFkYihwICsgNCkgIT0gMHg0MSB8fAorCQkgICAgcmVhZGIocCArIDUpICE9IDB4MDYpCisJCQljb250aW51ZTsKKworCQl0aGlzX29mZnNldCArPSA2OworCQlwICs9IDY7CisKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCWRldl9hZGRyW2ldID0gcmVhZGIocCArIGkpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdldF9nZW1fbWFjX25vbm9icChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgY2hhciAqZGV2X2FkZHIpCit7CisJdTMyIHJvbV9yZWdfb3JpZzsKKwl2b2lkIF9faW9tZW0gKnA7CisKKwlpZiAocGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0ucGFyZW50ID09IE5VTEwpIHsKKwkJaWYgKHBjaV9hc3NpZ25fcmVzb3VyY2UocGRldiwgUENJX1JPTV9SRVNPVVJDRSkgPCAwKQorCQkJZ290byB1c2VfcmFuZG9tOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBwZGV2LT5yb21fYmFzZV9yZWcsICZyb21fcmVnX29yaWcpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgcGRldi0+cm9tX2Jhc2VfcmVnLAorCQkJICAgICAgIHJvbV9yZWdfb3JpZyB8IFBDSV9ST01fQUREUkVTU19FTkFCTEUpOworCisJcCA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIFBDSV9ST01fUkVTT1VSQ0UpLCAoNjQgKiAxMDI0KSk7CisJaWYgKHAgIT0gTlVMTCAmJiByZWFkYihwKSA9PSAweDU1ICYmIHJlYWRiKHAgKyAxKSA9PSAweGFhKQorCQlmaW5kX2V0aF9hZGRyX2luX3ZwZChwLCAoNjQgKiAxMDI0KSwgZGV2X2FkZHIpOworCisJaWYgKHAgIT0gTlVMTCkKKwkJaW91bm1hcChwKTsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgcGRldi0+cm9tX2Jhc2VfcmVnLCByb21fcmVnX29yaWcpOworCXJldHVybjsKKwordXNlX3JhbmRvbToKKwkvKiBTdW4gTUFDIHByZWZpeCB0aGVuIDMgcmFuZG9tIGJ5dGVzLiAqLworCWRldl9hZGRyWzBdID0gMHgwODsKKwlkZXZfYWRkclsxXSA9IDB4MDA7CisJZGV2X2FkZHJbMl0gPSAweDIwOworCWdldF9yYW5kb21fYnl0ZXMoZGV2X2FkZHIgKyAzLCAzKTsKKwlyZXR1cm47Cit9CisjZW5kaWYgLyogbm90IFNwYXJjIGFuZCBub3QgUFBDICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGdlbV9nZXRfZGV2aWNlX2FkZHJlc3Moc3RydWN0IGdlbSAqZ3ApCit7CisjaWYgZGVmaW5lZChfX3NwYXJjX18pIHx8IGRlZmluZWQoQ09ORklHX1BQQ19QTUFDKQorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBncC0+ZGV2OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fc3BhcmNfXykKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGdwLT5wZGV2OworCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3AgPSBwZGV2LT5zeXNkYXRhOworCWludCBub2RlID0gLTE7CisKKwlpZiAocGNwICE9IE5VTEwpIHsKKwkJbm9kZSA9IHBjcC0+cHJvbV9ub2RlOworCQlpZiAocHJvbV9nZXRwcm9wbGVuKG5vZGUsICJsb2NhbC1tYWMtYWRkcmVzcyIpID09IDYpCisJCQlwcm9tX2dldHByb3BlcnR5KG5vZGUsICJsb2NhbC1tYWMtYWRkcmVzcyIsCisJCQkJCSBkZXYtPmRldl9hZGRyLCA2KTsKKwkJZWxzZQorCQkJbm9kZSA9IC0xOworCX0KKwlpZiAobm9kZSA9PSAtMSkKKwkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGlkcHJvbS0+aWRfZXRoYWRkciwgNik7CisjZWxpZiBkZWZpbmVkKENPTkZJR19QUENfUE1BQykKKwl1bnNpZ25lZCBjaGFyICphZGRyOworCisJYWRkciA9IGdldF9wcm9wZXJ0eShncC0+b2Zfbm9kZSwgImxvY2FsLW1hYy1hZGRyZXNzIiwgTlVMTCk7CisJaWYgKGFkZHIgPT0gTlVMTCkgeworCQlwcmludGsoIlxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IGdldCBtYWMtYWRkcmVzc1xuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkciwgNik7CisjZWxzZQorCWdldF9nZW1fbWFjX25vbm9icChncC0+cGRldiwgZ3AtPmRldi0+ZGV2X2FkZHIpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBnZW1fcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGRldikgeworCQlzdHJ1Y3QgZ2VtICpncCA9IGRldi0+cHJpdjsKKworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJCS8qIFN0b3AgdGhlIGxpbmsgdGltZXIgKi8KKwkJZGVsX3RpbWVyX3N5bmMoJmdwLT5saW5rX3RpbWVyKTsKKworCQkvKiBXZSBzaG91bGRuJ3QgbmVlZCBhbnkgbG9ja2luZyBoZXJlICovCisJCWdlbV9nZXRfY2VsbChncCk7CisKKwkJLyogV2FpdCBmb3IgYSBwZW5kaW5nIHJlc2V0IHRhc2sgdG8gY29tcGxldGUgKi8KKwkJd2hpbGUgKGdwLT5yZXNldF90YXNrX3BlbmRpbmcpCisJCQl5aWVsZCgpOworCQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJCS8qIFNodXQgdGhlIFBIWSBkb3duICovCisJCWdlbV9zdG9wX3BoeShncCwgMCk7CisKKwkJZ2VtX3B1dF9jZWxsKGdwKTsKKworCQkvKiBNYWtlIHN1cmUgYnVzIG1hc3RlciBpcyBkaXNhYmxlZCAqLworCQlwY2lfZGlzYWJsZV9kZXZpY2UoZ3AtPnBkZXYpOworCisJCS8qIEZyZWUgcmVzb3VyY2VzICovCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBnZW1faW5pdF9ibG9jayksCisJCQkJICAgIGdwLT5pbml0X2Jsb2NrLAorCQkJCSAgICBncC0+Z2Jsb2NrX2R2bWEpOworCQlpb3VubWFwKGdwLT5yZWdzKTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKworCQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJfQorfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBnZW1faW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0YXRpYyBpbnQgZ2VtX3ZlcnNpb25fcHJpbnRlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBnZW1yZWdfYmFzZSwgZ2VtcmVnX2xlbjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBnZW0gKmdwOworCWludCBpLCBlcnIsIHBjaV91c2luZ19kYWM7CisKKwlpZiAoZ2VtX3ZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisKKwkvKiBBcHBsZSBnbWFjIG5vdGU6IGR1cmluZyBwcm9iZSwgdGhlIGNoaXAgaXMgcG93ZXJlZCB1cCBieQorCSAqIHRoZSBhcmNoIGNvZGUgdG8gYWxsb3cgdGhlIGNvZGUgYmVsb3cgdG8gd29yayAoYW5kIHRvIGxldAorCSAqIHRoZSBjaGlwIGJlIHByb2JlZCBvbiB0aGUgY29uZmlnIHNwYWNlLiBJdCB3b24ndCBzdGF5IHBvd2VyZWQKKwkgKiB1cCB1bnRpbCB0aGUgaW50ZXJmYWNlIGlzIGJyb3VnaHQgdXAgaG93ZXZlciwgc28gd2UgY2FuJ3QgcmVseQorCSAqIG9uIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gZG9uZSBhdCB0aGlzIHBvaW50LgorCSAqLworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGVuYWJsZSBNTUlPIG9wZXJhdGlvbiwgIgorCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJLyogQ29uZmlndXJlIERNQSBhdHRyaWJ1dGVzLiAqLworCisJLyogQWxsIG9mIHRoZSBHRU0gZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCA2NC1iaXQgRE1BIGFkZHJlc3NpbmcKKwkgKiBpcyBmdWxseSBzdXBwb3J0ZWQgYW5kIHNob3VsZCB3b3JrIGp1c3QgZmluZS4gIEhvd2V2ZXIgdGhlCisJICogZnJvbnQgZW5kIGZvciBSSU8gYmFzZWQgR0VNcyBpcyBkaWZmZXJlbnQgYW5kIG9ubHkgc3VwcG9ydHMKKwkgKiAzMi1iaXQgYWRkcmVzc2luZy4KKwkgKgorCSAqIEZvciBub3cgd2UgYXNzdW1lIHRoZSB2YXJpb3VzIFBQQyBHRU1zIGFyZSAzMi1iaXQgb25seSBhcyB3ZWxsLgorCSAqLworCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9TVU4gJiYKKwkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU1VOX0dFTSAmJgorCSAgICAhcGNpX3NldF9kbWFfbWFzayhwZGV2LCAodTY0KSAweGZmZmZmZmZmZmZmZmZmZmZVTEwpKSB7CisJCXBjaV91c2luZ19kYWMgPSAxOworCX0gZWxzZSB7CisJCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgKHU2NCkgMHhmZmZmZmZmZik7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIk5vIHVzYWJsZSBETUEgY29uZmlndXJhdGlvbiwgIgorCQkJICAgICAgICJhYm9ydGluZy5cbiIpOworCQkJZ290byBlcnJfZGlzYWJsZV9kZXZpY2U7CisJCX0KKwkJcGNpX3VzaW5nX2RhYyA9IDA7CisJfQorCQorCWdlbXJlZ19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWdlbXJlZ19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOworCisJaWYgKChwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX0lPKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBmaW5kIHByb3BlciBQQ0kgZGV2aWNlICIKKwkJICAgICAgICJiYXNlIGFkZHJlc3MsIGFib3J0aW5nLlxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2Rpc2FibGVfZGV2aWNlOworCX0KKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqZ3ApKTsKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJFdGhlcmRldiBhbGxvYyBmYWlsZWQsIGFib3J0aW5nLlxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2Rpc2FibGVfZGV2aWNlOworCX0KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWdwID0gZGV2LT5wcml2OworCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3Qgb2J0YWluIFBDSSByZXNvdXJjZXMsICIKKwkJICAgICAgICJhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7CisJfQorCisJZ3AtPnBkZXYgPSBwZGV2OworCWRldi0+YmFzZV9hZGRyID0gKGxvbmcpIHBkZXY7CisJZ3AtPmRldiA9IGRldjsKKworCWdwLT5tc2dfZW5hYmxlID0gREVGQVVMVF9NU0c7CisKKwlzcGluX2xvY2tfaW5pdCgmZ3AtPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZncC0+dHhfbG9jayk7CisJaW5pdF9NVVRFWCgmZ3AtPnBtX3NlbSk7CisKKwlpbml0X3RpbWVyKCZncC0+bGlua190aW1lcik7CisJZ3AtPmxpbmtfdGltZXIuZnVuY3Rpb24gPSBnZW1fbGlua190aW1lcjsKKwlncC0+bGlua190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGdwOworCisJSU5JVF9XT1JLKCZncC0+cmVzZXRfdGFzaywgZ2VtX3Jlc2V0X3Rhc2ssIGdwKTsKKwkKKwlncC0+bHN0YXRlID0gbGlua19kb3duOworCWdwLT50aW1lcl90aWNrcyA9IDA7CisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworCWdwLT5yZWdzID0gaW9yZW1hcChnZW1yZWdfYmFzZSwgZ2VtcmVnX2xlbik7CisJaWYgKGdwLT5yZWdzID09IDBVTCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgbWFwIGRldmljZSByZWdpc3RlcnMsICIKKwkJICAgICAgICJhYm9ydGluZy5cbiIpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJfQorCisJLyogT24gQXBwbGUsIHdlIHdhbnQgYSByZWZlcmVuY2UgdG8gdGhlIE9wZW4gRmlybXdhcmUgZGV2aWNlLXRyZWUKKwkgKiBub2RlLiBXZSB1c2UgaXQgZm9yIGNsb2NrIGNvbnRyb2wuCisJICovCisjaWZkZWYgQ09ORklHX1BQQ19QTUFDCisJZ3AtPm9mX25vZGUgPSBwY2lfZGV2aWNlX3RvX09GX25vZGUocGRldik7CisjZW5kaWYKKworCS8qIE9ubHkgQXBwbGUgdmVyc2lvbiBzdXBwb3J0cyBXT0wgYWZhaWsgKi8KKwlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQVBQTEUpCisJCWdwLT5oYXNfd29sID0gMTsKKworCS8qIE1ha2Ugc3VyZSBjZWxsIGlzIGVuYWJsZWQgKi8KKwlnZW1fZ2V0X2NlbGwoZ3ApOworCisJLyogTWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgc3RvcHBlZCBhbmQgaW4gaW5pdCBzdGF0ZSAqLworCWdlbV9yZXNldChncCk7CisKKwkvKiBGaWxsIHVwIHRoZSBtaWlfcGh5IHN0cnVjdHVyZSAoZXZlbiBpZiB3ZSB3b24ndCB1c2UgaXQpICovCisJZ3AtPnBoeV9taWkuZGV2ID0gZGV2OworCWdwLT5waHlfbWlpLm1kaW9fcmVhZCA9IF9waHlfcmVhZDsKKwlncC0+cGh5X21paS5tZGlvX3dyaXRlID0gX3BoeV93cml0ZTsKKworCS8qIEJ5IGRlZmF1bHQsIHdlIHN0YXJ0IHdpdGggYXV0b25lZyAqLworCWdwLT53YW50X2F1dG9uZWcgPSAxOworCisJLyogQ2hlY2sgZmlmbyBzaXplcywgUEhZIHR5cGUsIGV0Yy4uLiAqLworCWlmIChnZW1fY2hlY2tfaW52YXJpYW50cyhncCkpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCisJLyogSXQgaXMgZ3VhcmFudGVlZCB0aGF0IHRoZSByZXR1cm5lZCBidWZmZXIgd2lsbCBiZSBhdCBsZWFzdAorCSAqIFBBR0VfU0laRSBhbGlnbmVkLgorCSAqLworCWdwLT5pbml0X2Jsb2NrID0gKHN0cnVjdCBnZW1faW5pdF9ibG9jayAqKQorCQlwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplb2Yoc3RydWN0IGdlbV9pbml0X2Jsb2NrKSwKKwkJCQkgICAgICZncC0+Z2Jsb2NrX2R2bWEpOworCWlmICghZ3AtPmluaXRfYmxvY2spIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGFsbG9jYXRlIGluaXQgYmxvY2ssICIKKwkJICAgICAgICJhYm9ydGluZy5cbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisKKwlpZiAoZ2VtX2dldF9kZXZpY2VfYWRkcmVzcyhncCkpCisJCWdvdG8gZXJyX291dF9mcmVlX2NvbnNpc3RlbnQ7CisKKwlkZXYtPm9wZW4gPSBnZW1fb3BlbjsKKwlkZXYtPnN0b3AgPSBnZW1fY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBnZW1fc3RhcnRfeG1pdDsKKwlkZXYtPmdldF9zdGF0cyA9IGdlbV9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBnZW1fc2V0X211bHRpY2FzdDsKKwlkZXYtPmRvX2lvY3RsID0gZ2VtX2lvY3RsOworCWRldi0+cG9sbCA9IGdlbV9wb2xsOworCWRldi0+d2VpZ2h0ID0gNjQ7CisJZGV2LT5ldGh0b29sX29wcyA9ICZnZW1fZXRodG9vbF9vcHM7CisJZGV2LT50eF90aW1lb3V0ID0gZ2VtX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IDUgKiBIWjsKKwlkZXYtPmNoYW5nZV9tdHUgPSBnZW1fY2hhbmdlX210dTsKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKwlkZXYtPmRtYSA9IDA7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlciA9IGdlbV9wb2xsX2NvbnRyb2xsZXI7CisjZW5kaWYKKworCS8qIFNldCB0aGF0IG5vdywgaW4gY2FzZSBQTSBraWNrcyBpbiBub3cgKi8KKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCS8qIERldGVjdCAmIGluaXQgUEhZLCBzdGFydCBhdXRvbmVnLCB3ZSByZWxlYXNlIHRoZSBjZWxsIG5vdworCSAqIHRvbywgaXQgd2lsbCBiZSBtYW5hZ2VkIGJ5IHdob2V2ZXIgbmVlZHMgaXQKKwkgKi8KKwlnZW1faW5pdF9waHkoZ3ApOworCisJc3Bpbl9sb2NrX2lycSgmZ3AtPmxvY2spOworCWdlbV9wdXRfY2VsbChncCk7CisJc3Bpbl91bmxvY2tfaXJxKCZncC0+bG9jayk7CisKKwkvKiBSZWdpc3RlciB3aXRoIGtlcm5lbCAqLworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZSwgIgorCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9mcmVlX2NvbnNpc3RlbnQ7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN1biBHRU0gKFBDSSkgMTAvMTAwLzEwMDBCYXNlVCBFdGhlcm5ldCAiLAorCSAgICAgICBkZXYtPm5hbWUpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiJTIuMnglYyIsIGRldi0+ZGV2X2FkZHJbaV0sCisJCSAgICAgICBpID09IDUgPyAnICcgOiAnOicpOworCXByaW50aygiXG4iKTsKKworCWlmIChncC0+cGh5X3R5cGUgPT0gcGh5X21paV9tZGlvMCB8fAorICAgICAJICAgIGdwLT5waHlfdHlwZSA9PSBwaHlfbWlpX21kaW8xKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogRm91bmQgJXMgUEhZXG4iLCBkZXYtPm5hbWUsIAorCQkJZ3AtPnBoeV9taWkuZGVmID8gZ3AtPnBoeV9taWkuZGVmLT5uYW1lIDogIm5vIik7CisKKwkvKiBHRU0gY2FuIGRvIGl0IGFsbC4uLiAqLworCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSFdfQ1NVTSB8IE5FVElGX0ZfTExUWDsKKwlpZiAocGNpX3VzaW5nX2RhYykKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9mcmVlX2NvbnNpc3RlbnQ6CisJZ2VtX3JlbW92ZV9vbmUocGRldik7CitlcnJfb3V0X2lvdW5tYXA6CisJZ2VtX3B1dF9jZWxsKGdwKTsKKwlpb3VubWFwKGdwLT5yZWdzKTsKKworZXJyX291dF9mcmVlX3JlczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCitlcnJfb3V0X2ZyZWVfbmV0ZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CitlcnJfZGlzYWJsZV9kZXZpY2U6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiBlcnI7CisKK30KKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZ2VtX2RyaXZlciA9IHsKKwkubmFtZQkJPSBHRU1fTU9EVUxFX05BTUUsCisJLmlkX3RhYmxlCT0gZ2VtX3BjaV90YmwsCisJLnByb2JlCQk9IGdlbV9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGdlbV9yZW1vdmVfb25lKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IGdlbV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gZ2VtX3Jlc3VtZSwKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KK307CisKK3N0YXRpYyBpbnQgX19pbml0IGdlbV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZ2VtX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBnZW1fY2xlYW51cCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZ2VtX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGdlbV9pbml0KTsKK21vZHVsZV9leGl0KGdlbV9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmdlbS5oIGIvZHJpdmVycy9uZXQvc3VuZ2VtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0M2ZkNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3N1bmdlbS5oCkBAIC0wLDAgKzEsMTA1MSBAQAorLyogJElkOiBzdW5nZW0uaCx2IDEuMTAuMi40IDIwMDIvMDMvMTEgMDg6NTQ6NDggZGF2ZW0gRXhwICQKKyAqIHN1bmdlbS5oOiBEZWZpbml0aW9ucyBmb3IgU3VuIEdFTSBldGhlcm5ldCBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqLworCisjaWZuZGVmIF9TVU5HRU1fSAorI2RlZmluZSBfU1VOR0VNX0gKKworLyogR2xvYmFsIFJlZ2lzdGVycyAqLworI2RlZmluZSBHUkVHX1NFQlNUQVRFCTB4MDAwMFVMCS8qIFNFQiBTdGF0ZSBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgR1JFR19DRkcJMHgwMDA0VUwJLyogQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkqLworI2RlZmluZSBHUkVHX1NUQVQJMHgwMDBDVUwJLyogU3RhdHVzIFJlZ2lzdGVyCQkqLworI2RlZmluZSBHUkVHX0lNQVNLCTB4MDAxMFVMCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyCSovCisjZGVmaW5lIEdSRUdfSUFDSwkweDAwMTRVTAkvKiBJbnRlcnJ1cHQgQUNLIFJlZ2lzdGVyCSovCisjZGVmaW5lIEdSRUdfU1RBVDIJMHgwMDFDVUwJLyogQWxpYXMgb2YgR1JFR19TVEFUCQkqLworI2RlZmluZSBHUkVHX1BDSUVTVEFUCTB4MTAwMFVMCS8qIFBDSSBFcnJvciBTdGF0dXMgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgR1JFR19QQ0lFTUFTSwkweDEwMDRVTAkvKiBQQ0kgRXJyb3IgTWFzayBSZWdpc3RlcgkqLworI2RlZmluZSBHUkVHX0JJRkNGRwkweDEwMDhVTAkvKiBCSUYgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkqLworI2RlZmluZSBHUkVHX0JJRkRJQUcJMHgxMDBDVUwJLyogQklGIERpYWdub3N0aWNzIFJlZ2lzdGVyCSovCisjZGVmaW5lIEdSRUdfU1dSU1QJMHgxMDEwVUwJLyogU29mdHdhcmUgUmVzZXQgUmVnaXN0ZXIJKi8KKworLyogR2xvYmFsIFNFQiBTdGF0ZSBSZWdpc3RlciAqLworI2RlZmluZSBHUkVHX1NFQlNUQVRFX0FSQgkweDAwMDAwMDAzCS8qIFN0YXRlIG9mIEFyYml0ZXIJCSovCisjZGVmaW5lIEdSRUdfU0VCU1RBVEVfUlhXT04JMHgwMDAwMDAwNAkvKiBSWCB3b24gaW50ZXJuYWwgYXJiaXRyYXRpb24JKi8KKworLyogR2xvYmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgR1JFR19DRkdfSUJVUlNUCQkweDAwMDAwMDAxCS8qIEluZmluaXRlIEJ1cnN0CQkqLworI2RlZmluZSBHUkVHX0NGR19UWERNQUxJTQkweDAwMDAwMDNlCS8qIFRYIERNQSBncmFudCBsaW1pdAkJKi8KKyNkZWZpbmUgR1JFR19DRkdfUlhETUFMSU0JMHgwMDAwMDdjMAkvKiBSWCBETUEgZ3JhbnQgbGltaXQJCSovCisjZGVmaW5lIEdSRUdfQ0ZHX1JPTlBBVUxCSVQJMHgwMDAwMDgwMAkvKiBVc2UgbWVtIHJlYWQgbXVsdGlwbGUgZm9yIFBDSSByZWFkCisJCQkJCQkgKiBhZnRlciBpbmZpbml0ZSBidXJzdCAoQXBwbGUpICovCisjZGVmaW5lIEdSRUdfQ0ZHX0VOQlVHMkZJWAkweDAwMDAxMDAwCS8qIEZpeCBSeCBoYW5nIGFmdGVyIG92ZXJmbG93ICovCisKKy8qIEdsb2JhbCBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyLgorICoKKyAqIFJlYWRpbmcgdGhpcyByZWdpc3RlciBhdXRvbWF0aWNhbGx5IGNsZWFycyBiaXRzIDAgdGhyb3VnaCA2LgorICogVGhpcyBhdXRvLWNsZWFyaW5nIGRvZXMgbm90IG9jY3VyIHdoZW4gdGhlIGFsaWFzIGF0IEdSRUdfU1RBVDIKKyAqIGlzIHJlYWQgaW5zdGVhZC4gIFRoZSByZXN0IG9mIHRoZSBpbnRlcnJ1cHQgYml0cyBvbmx5IGNsZWFyIHdoZW4KKyAqIHRoZSBzZWNvbmRhcnkgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciBjb3JyZXNwb25kaW5nIHRvIHRoYXQKKyAqIGJpdCBpcyByZWFkIChpZS4gaWYgR1JFR19TVEFUX1BDUyBpcyBzZXQsIGl0IHdpbGwgYmUgY2xlYXJlZCBieQorICogcmVhZGluZyBQQ1NfSVNUQVQpLgorICovCisjZGVmaW5lIEdSRUdfU1RBVF9UWElOVE1FCTB4MDAwMDAwMDEJLyogVFggSU5UTUUgZnJhbWUgdHJhbnNmZXJyZWQJKi8KKyNkZWZpbmUgR1JFR19TVEFUX1RYQUxMCQkweDAwMDAwMDAyCS8qIEFsbCBUWCBmcmFtZXMgdHJhbnNmZXJyZWQJKi8KKyNkZWZpbmUgR1JFR19TVEFUX1RYRE9ORQkweDAwMDAwMDA0CS8qIE9uZSBUWCBmcmFtZSB0cmFuc2ZlcnJlZAkqLworI2RlZmluZSBHUkVHX1NUQVRfUlhET05FCTB4MDAwMDAwMTAJLyogT25lIFJYIGZyYW1lIGFycml2ZWQJCSovCisjZGVmaW5lIEdSRUdfU1RBVF9SWE5PQlVGCTB4MDAwMDAwMjAJLyogTm8gZnJlZSBSWCBidWZmZXJzIGF2YWlsYWJsZQkqLworI2RlZmluZSBHUkVHX1NUQVRfUlhUQUdFUlIJMHgwMDAwMDA0MAkvKiBSWCB0YWcgZnJhbWluZyBpcyBjb3JydXB0CSovCisjZGVmaW5lIEdSRUdfU1RBVF9QQ1MJCTB4MDAwMDIwMDAJLyogUENTIHNpZ25hbGxlZCBpbnRlcnJ1cHQJKi8KKyNkZWZpbmUgR1JFR19TVEFUX1RYTUFDCQkweDAwMDA0MDAwCS8qIFRYIE1BQyBzaWduYWxsZWQgaW50ZXJydXB0CSovCisjZGVmaW5lIEdSRUdfU1RBVF9SWE1BQwkJMHgwMDAwODAwMAkvKiBSWCBNQUMgc2lnbmFsbGVkIGludGVycnVwdAkqLworI2RlZmluZSBHUkVHX1NUQVRfTUFDCQkweDAwMDEwMDAwCS8qIE1BQyBDb250cm9sIHNpZ25hbGxlZCBpcnEJKi8KKyNkZWZpbmUgR1JFR19TVEFUX01JRgkJMHgwMDAyMDAwMAkvKiBNSUYgc2lnbmFsbGVkIGludGVycnVwdAkqLworI2RlZmluZSBHUkVHX1NUQVRfUENJRVJSCTB4MDAwNDAwMDAJLyogUENJIEVycm9yIGludGVycnVwdAkJKi8KKyNkZWZpbmUgR1JFR19TVEFUX1RYTlIJCTB4ZmZmODAwMDAJLyogPT0gVFhETUFfVFhET05FIHJlZyB2YWwJKi8KKyNkZWZpbmUgR1JFR19TVEFUX1RYTlJfU0hJRlQJMTkKKworI2RlZmluZSBHUkVHX1NUQVRfQUJOT1JNQUwJKEdSRUdfU1RBVF9SWE5PQlVGIHwgR1JFR19TVEFUX1JYVEFHRVJSIHwgXAorCQkJCSBHUkVHX1NUQVRfUENTIHwgR1JFR19TVEFUX1RYTUFDIHwgR1JFR19TVEFUX1JYTUFDIHwgXAorCQkJCSBHUkVHX1NUQVRfTUFDIHwgR1JFR19TVEFUX01JRiB8IEdSRUdfU1RBVF9QQ0lFUlIpCisKKyNkZWZpbmUgR1JFR19TVEFUX05BUEkJCShHUkVHX1NUQVRfVFhBTEwgIHwgR1JFR19TVEFUX1RYSU5UTUUgfCBcCisJCQkJIEdSRUdfU1RBVF9SWERPTkUgfCBHUkVHX1NUQVRfQUJOT1JNQUwpCisKKy8qIFRoZSBsYXlvdXQgb2YgR1JFR19JTUFTSyBhbmQgR1JFR19JQUNLIGlzIGlkZW50aWNhbCB0byBHUkVHX1NUQVQuCisgKiBCaXRzIHNldCBpbiBHUkVHX0lNQVNLIHdpbGwgcHJldmVudCB0aGF0IGludGVycnVwdCB0eXBlIGZyb20gYmVpbmcKKyAqIHNpZ25hbGxlZCB0byB0aGUgY3B1LiAgR1JFR19JQUNLIGNhbiBiZSB1c2VkIHRvIGNsZWFyIHNwZWNpZmljIHRvcC1sZXZlbAorICogaW50ZXJydXB0IGNvbmRpdGlvbnMgaW4gR1JFR19TVEFULCBpZS4gaXQgb25seSB3b3JrcyBmb3IgYml0cyAwIHRocm91Z2ggNi4KKyAqIFNldHRpbmcgdGhlIGJpdCB3aWxsIGNsZWFyIHRoYXQgaW50ZXJydXB0LCBjbGVhciBiaXRzIHdpbGwgaGF2ZSBubyBlZmZlY3QKKyAqIG9uIEdSRUdfU1RBVC4KKyAqLworCisvKiBHbG9iYWwgUENJIEVycm9yIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBHUkVHX1BDSUVTVEFUX0JBREFDSwkweDAwMDAwMDAxCS8qIE5vIEFDSzY0IyBkdXJpbmcgQUJTNjQgY3ljbGUJKi8KKyNkZWZpbmUgR1JFR19QQ0lFU1RBVF9EVFJUTwkweDAwMDAwMDAyCS8qIERlbGF5ZWQgdHJhbnNhY3Rpb24gdGltZW91dAkqLworI2RlZmluZSBHUkVHX1BDSUVTVEFUX09USEVSCTB4MDAwMDAwMDQJLyogT3RoZXIgUENJIGVycm9yLCBjaGVjayBjZmcgc3BhY2UgKi8KKworLyogVGhlIGxheW91dCBvZiB0aGUgR1JFR19QQ0lFTUFTSyBpcyBpZGVudGljYWwgdG8gdGhhdCBvZiBHUkVHX1BDSUVTVEFULgorICogQml0cyBzZXQgaW4gR1JFR19QQ0lFTUFTSyB3aWxsIHByZXZlbnQgdGhhdCBpbnRlcnJ1cHQgdHlwZSBmcm9tIGJlaW5nCisgKiBzaWduYWxsZWQgdG8gdGhlIGNwdS4KKyAqLworCisvKiBHbG9iYWwgQklGIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgR1JFR19CSUZDRkdfU0xPV0NMSwkweDAwMDAwMDAxCS8qIFNldCBpZiBQQ0kgcnVucyA8IDI1TWh6CSovCisjZGVmaW5lIEdSRUdfQklGQ0ZHX0I2NERJUwkweDAwMDAwMDAyCS8qIERpc2FibGUgNjRiaXQgd2lkZSBkYXRhIGN5Y2xlKi8KKyNkZWZpbmUgR1JFR19CSUZDRkdfTTY2RU4JMHgwMDAwMDAwNAkvKiBTZXQgaWYgb24gNjZNaHogUENJIHNlZ21lbnQJKi8KKworLyogR2xvYmFsIEJJRiBEaWFnbm9zdGljcyBSZWdpc3RlciAqLworI2RlZmluZSBHUkVHX0JJRkRJQUdfQlVSU1RTTQkweDAwN2YwMDAwCS8qIFBDSSBCdXJzdCBzdGF0ZSBtYWNoaW5lCSovCisjZGVmaW5lIEdSRUdfQklGRElBR19CSUZTTQkweGZmMDAwMDAwCS8qIEJJRiBzdGF0ZSBtYWNoaW5lCQkqLworCisvKiBHbG9iYWwgU29mdHdhcmUgUmVzZXQgUmVnaXN0ZXIuCisgKgorICogVGhpcyByZWdpc3RlciBpcyB1c2VkIHRvIHBlcmZvcm0gYSBnbG9iYWwgcmVzZXQgb2YgdGhlIFJYIGFuZCBUWCBwb3J0aW9ucworICogb2YgdGhlIEdFTSBhc2ljLiAgU2V0dGluZyB0aGUgUlggb3IgVFggcmVzZXQgYml0IHdpbGwgc3RhcnQgdGhlIHJlc2V0LgorICogVGhlIGRyaXZlciBfTVVTVF8gcG9sbCB0aGVzZSBiaXRzIHVudGlsIHRoZXkgY2xlYXIuICBPbmUgbWF5IG5vdCBhdHRlbXB0CisgKiB0byBwcm9ncmFtIGFueSBvdGhlciBwYXJ0IG9mIEdFTSB1bnRpbCB0aGUgYml0cyBjbGVhci4KKyAqLworI2RlZmluZSBHUkVHX1NXUlNUX1RYUlNUCTB4MDAwMDAwMDEJLyogVFggU29mdHdhcmUgUmVzZXQJCSovCisjZGVmaW5lIEdSRUdfU1dSU1RfUlhSU1QJMHgwMDAwMDAwMgkvKiBSWCBTb2Z0d2FyZSBSZXNldAkJKi8KKyNkZWZpbmUgR1JFR19TV1JTVF9SU1RPVVQJMHgwMDAwMDAwNAkvKiBGb3JjZSBSU1QjIHBpbiBhY3RpdmUJKi8KKyNkZWZpbmUgR1JFR19TV1JTVF9DQUNIRVNJWkUJMHgwMGZmMDAwMAkvKiBSSU8gb25seTogY2FjaGUgbGluZSBzaXplCSovCisjZGVmaW5lIEdSRUdfU1dSU1RfQ0FDSEVfU0hJRlQJMTYKKworLyogVFggRE1BIFJlZ2lzdGVycyAqLworI2RlZmluZSBUWERNQV9LSUNLCTB4MjAwMFVMCS8qIFRYIEtpY2sgUmVnaXN0ZXIJCSovCisjZGVmaW5lIFRYRE1BX0NGRwkweDIwMDRVTAkvKiBUWCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCSovCisjZGVmaW5lIFRYRE1BX0RCTE9XCTB4MjAwOFVMCS8qIFRYIERlc2MuIEJhc2UgTG93CQkqLworI2RlZmluZSBUWERNQV9EQkhJCTB4MjAwQ1VMCS8qIFRYIERlc2MuIEJhc2UgSGlnaAkJKi8KKyNkZWZpbmUgVFhETUFfRldQVFIJMHgyMDE0VUwJLyogVFggRklGTyBXcml0ZSBQb2ludGVyCSovCisjZGVmaW5lIFRYRE1BX0ZTV1BUUgkweDIwMThVTAkvKiBUWCBGSUZPIFNoYWRvdyBXcml0ZSBQb2ludGVyCSovCisjZGVmaW5lIFRYRE1BX0ZSUFRSCTB4MjAxQ1VMCS8qIFRYIEZJRk8gUmVhZCBQb2ludGVyCQkqLworI2RlZmluZSBUWERNQV9GU1JQVFIJMHgyMDIwVUwJLyogVFggRklGTyBTaGFkb3cgUmVhZCBQb2ludGVyCSovCisjZGVmaW5lIFRYRE1BX1BDTlQJMHgyMDI0VUwJLyogVFggRklGTyBQYWNrZXQgQ291bnRlcgkqLworI2RlZmluZSBUWERNQV9TTUFDSElORQkweDIwMjhVTAkvKiBUWCBTdGF0ZSBNYWNoaW5lIFJlZ2lzdGVyCSovCisjZGVmaW5lIFRYRE1BX0RQTE9XCTB4MjAzMFVMCS8qIFRYIERhdGEgUG9pbnRlciBMb3cJCSovCisjZGVmaW5lIFRYRE1BX0RQSEkJMHgyMDM0VUwJLyogVFggRGF0YSBQb2ludGVyIEhpZ2gJCSovCisjZGVmaW5lIFRYRE1BX1RYRE9ORQkweDIxMDBVTAkvKiBUWCBDb21wbGV0aW9uIFJlZ2lzdGVyCSovCisjZGVmaW5lIFRYRE1BX0ZBRERSCTB4MjEwNFVMCS8qIFRYIEZJRk8gQWRkcmVzcwkJKi8KKyNkZWZpbmUgVFhETUFfRlRBRwkweDIxMDhVTAkvKiBUWCBGSUZPIFRhZwkJCSovCisjZGVmaW5lIFRYRE1BX0RMT1cJMHgyMTBDVUwJLyogVFggRklGTyBEYXRhIExvdwkJKi8KKyNkZWZpbmUgVFhETUFfREhJVDEJMHgyMTEwVUwJLyogVFggRklGTyBEYXRhIEhpZ2hUMQkJKi8KKyNkZWZpbmUgVFhETUFfREhJVDAJMHgyMTE0VUwJLyogVFggRklGTyBEYXRhIEhpZ2hUMAkJKi8KKyNkZWZpbmUgVFhETUFfRlNaCTB4MjExOFVMCS8qIFRYIEZJRk8gU2l6ZQkJCSovCisKKy8qIFRYIEtpY2sgUmVnaXN0ZXIuCisgKgorICogVGhpcyAxMy1iaXQgcmVnaXN0ZXIgaXMgcHJvZ3JhbW1lZCBieSB0aGUgZHJpdmVyIHRvIGhvbGQgdGhlIGRlc2NyaXB0b3IKKyAqIGVudHJ5IGluZGV4IHdoaWNoIGZvbGxvd3MgdGhlIGxhc3QgdmFsaWQgdHJhbnNtaXQgZGVzY3JpcHRvci4KKyAqLworCisvKiBUWCBDb21wbGV0aW9uIFJlZ2lzdGVyLgorICoKKyAqIFRoaXMgMTMtYml0IHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgR0VNIHRvIGhvbGQgdG8gZGVzY3JpcHRvciBlbnRyeSBpbmRleAorICogd2hpY2ggZm9sbG93cyB0aGUgbGFzdCBkZXNjcmlwdG9yIGFscmVhZHkgcHJvY2Vzc2VkIGJ5IEdFTS4gIE5vdGUgdGhhdAorICogdGhpcyB2YWx1ZSBpcyBtaXJyb3JlZCBpbiBHUkVHX1NUQVQgd2hpY2ggZWxpbWluYXRlcyB0aGUgbmVlZCB0byBldmVuCisgKiBhY2Nlc3MgdGhpcyByZWdpc3RlciBpbiB0aGUgZHJpdmVyIGR1cmluZyBpbnRlcnJ1cHQgcHJvY2Vzc2luZy4KKyAqLworCisvKiBUWCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLgorICoKKyAqIE5vdGUgdGhhdCBUWERNQV9DRkdfRlRIUkVTSCwgdGhlIFRYIEZJRk8gVGhyZXNob2xkLCBpcyBhbiBvYnNvbGV0ZSBmZWF0dXJlCisgKiB0aGF0IHdhcyBtZWFudCB0byBiZSB1c2VkIHdpdGgganVtYm8gcGFja2V0cy4gIEl0IHNob3VsZCBiZSBzZXQgdG8gdGhlCisgKiBtYXhpbXVtIHZhbHVlIG9mIDB4NGZmLCBlbHNlIG9uZSByaXNrcyBnZXR0aW5nIFRYIE1BQyBVbmRlcnJ1biBlcnJvcnMuCisgKi8KKyNkZWZpbmUgVFhETUFfQ0ZHX0VOQUJMRQkweDAwMDAwMDAxCS8qIEVuYWJsZSBUWCBETUEgY2hhbm5lbAkqLworI2RlZmluZSBUWERNQV9DRkdfUklOR1NaCTB4MDAwMDAwMWUJLyogVFggZGVzY3JpcHRvciByaW5nIHNpemUJKi8KKyNkZWZpbmUgVFhETUFfQ0ZHX1JJTkdTWl8zMgkweDAwMDAwMDAwCS8qIDMyIFRYIGRlc2NyaXB0b3JzCQkqLworI2RlZmluZSBUWERNQV9DRkdfUklOR1NaXzY0CTB4MDAwMDAwMDIJLyogNjQgVFggZGVzY3JpcHRvcnMJCSovCisjZGVmaW5lIFRYRE1BX0NGR19SSU5HU1pfMTI4CTB4MDAwMDAwMDQJLyogMTI4IFRYIGRlc2NyaXB0b3JzCQkqLworI2RlZmluZSBUWERNQV9DRkdfUklOR1NaXzI1NgkweDAwMDAwMDA2CS8qIDI1NiBUWCBkZXNjcmlwdG9ycwkJKi8KKyNkZWZpbmUgVFhETUFfQ0ZHX1JJTkdTWl81MTIJMHgwMDAwMDAwOAkvKiA1MTIgVFggZGVzY3JpcHRvcnMJCSovCisjZGVmaW5lIFRYRE1BX0NGR19SSU5HU1pfMUsJMHgwMDAwMDAwYQkvKiAxMDI0IFRYIGRlc2NyaXB0b3JzCQkqLworI2RlZmluZSBUWERNQV9DRkdfUklOR1NaXzJLCTB4MDAwMDAwMGMJLyogMjA0OCBUWCBkZXNjcmlwdG9ycwkJKi8KKyNkZWZpbmUgVFhETUFfQ0ZHX1JJTkdTWl80SwkweDAwMDAwMDBlCS8qIDQwOTYgVFggZGVzY3JpcHRvcnMJCSovCisjZGVmaW5lIFRYRE1BX0NGR19SSU5HU1pfOEsJMHgwMDAwMDAxMAkvKiA4MTkyIFRYIGRlc2NyaXB0b3JzCQkqLworI2RlZmluZSBUWERNQV9DRkdfUElPU0VMCTB4MDAwMDAwMjAJLyogRW5hYmxlIFRYIEZJRk8gUElPIGZyb20gY3B1CSovCisjZGVmaW5lIFRYRE1BX0NGR19GVEhSRVNICTB4MDAxZmZjMDAJLyogVFggRklGTyBUaHJlc2hvbGQsIG9ic29sZXRlCSovCisjZGVmaW5lIFRYRE1BX0NGR19QTU9ERQkJMHgwMDIwMDAwMAkvKiBUWEFMTCBpcnEgbWVhbnMgVFggRklGTyBlbXB0eSovCisKKy8qIFRYIERlc2NyaXB0b3IgQmFzZSBMb3cvSGlnaC4KKyAqCisgKiBUaGVzZSB0d28gcmVnaXN0ZXJzIHN0b3JlIHRoZSA1MyBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIGJhc2UgYWRkcmVzcworICogb2YgdGhlIFRYIGRlc2NyaXB0b3IgdGFibGUuICBUaGUgMTEgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBhcmUgYWx3YXlzCisgKiB6ZXJvLiAgQXMgYSByZXN1bHQsIHRoZSBUWCBkZXNjcmlwdG9yIHRhYmxlIG11c3QgYmUgMksgYWxpZ25lZC4KKyAqLworCisvKiBUaGUgcmVzdCBvZiB0aGUgVFhETUFfKiByZWdpc3RlcnMgYXJlIGZvciBkaWFnbm9zdGljcyBhbmQgZGVidWcsIEkgd2lsbCBkb2N1bWVudAorICogdGhlbSBsYXRlci4gLURhdmVNCisgKi8KKworLyogV2FrZU9uTGFuIFJlZ2lzdGVycwkqLworI2RlZmluZSBXT0xfTUFUQ0gwCTB4MzAwMFVMCisjZGVmaW5lIFdPTF9NQVRDSDEJMHgzMDA0VUwKKyNkZWZpbmUgV09MX01BVENIMgkweDMwMDhVTAorI2RlZmluZSBXT0xfTUNPVU5UCTB4MzAwQ1VMCisjZGVmaW5lIFdPTF9XQUtFQ1NSCTB4MzAxMFVMCisKKy8qIFdPTCBNYXRjaCBjb3VudCByZWdpc3RlcgorICovCisjZGVmaW5lIFdPTF9NQ09VTlRfTgkJMHgwMDAwMDAxMAorI2RlZmluZSBXT0xfTUNPVU5UX00JCTB4MDAwMDAwMDAgLyogMCA8PCA4ICovCisKKyNkZWZpbmUgV09MX1dBS0VDU1JfRU5BQkxFCTB4MDAwMDAwMDEKKyNkZWZpbmUgV09MX1dBS0VDU1JfTUlJCQkweDAwMDAwMDAyCisjZGVmaW5lIFdPTF9XQUtFQ1NSX1NFRU4JMHgwMDAwMDAwNAorI2RlZmluZSBXT0xfV0FLRUNTUl9GSUxUX1VDQVNUCTB4MDAwMDAwMDgKKyNkZWZpbmUgV09MX1dBS0VDU1JfRklMVF9NQ0FTVAkweDAwMDAwMDEwCisjZGVmaW5lIFdPTF9XQUtFQ1NSX0ZJTFRfQkNBU1QJMHgwMDAwMDAyMAorI2RlZmluZSBXT0xfV0FLRUNTUl9GSUxUX1NFRU4JMHgwMDAwMDA0MAorCisKKy8qIFJlY2VpdmUgRE1BIFJlZ2lzdGVycyAqLworI2RlZmluZSBSWERNQV9DRkcJMHg0MDAwVUwJLyogUlggQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkqLworI2RlZmluZSBSWERNQV9EQkxPVwkweDQwMDRVTAkvKiBSWCBEZXNjcmlwdG9yIEJhc2UgTG93CSovCisjZGVmaW5lIFJYRE1BX0RCSEkJMHg0MDA4VUwJLyogUlggRGVzY3JpcHRvciBCYXNlIEhpZ2gJKi8KKyNkZWZpbmUgUlhETUFfRldQVFIJMHg0MDBDVUwJLyogUlggRklGTyBXcml0ZSBQb2ludGVyCSovCisjZGVmaW5lIFJYRE1BX0ZTV1BUUgkweDQwMTBVTAkvKiBSWCBGSUZPIFNoYWRvdyBXcml0ZSBQb2ludGVyCSovCisjZGVmaW5lIFJYRE1BX0ZSUFRSCTB4NDAxNFVMCS8qIFJYIEZJRk8gUmVhZCBQb2ludGVyCQkqLworI2RlZmluZSBSWERNQV9QQ05UCTB4NDAxOFVMCS8qIFJYIEZJRk8gUGFja2V0IENvdW50ZXIJKi8KKyNkZWZpbmUgUlhETUFfU01BQ0hJTkUJMHg0MDFDVUwJLyogUlggU3RhdGUgTWFjaGluZSBSZWdpc3RlcgkqLworI2RlZmluZSBSWERNQV9QVEhSRVNICTB4NDAyMFVMCS8qIFBhdXNlIFRocmVzaG9sZHMJCSovCisjZGVmaW5lIFJYRE1BX0RQTE9XCTB4NDAyNFVMCS8qIFJYIERhdGEgUG9pbnRlciBMb3cJCSovCisjZGVmaW5lIFJYRE1BX0RQSEkJMHg0MDI4VUwJLyogUlggRGF0YSBQb2ludGVyIEhpZ2gJCSovCisjZGVmaW5lIFJYRE1BX0tJQ0sJMHg0MTAwVUwJLyogUlggS2ljayBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgUlhETUFfRE9ORQkweDQxMDRVTAkvKiBSWCBDb21wbGV0aW9uIFJlZ2lzdGVyCSovCisjZGVmaW5lIFJYRE1BX0JMQU5LCTB4NDEwOFVMCS8qIFJYIEJsYW5raW5nIFJlZ2lzdGVyCQkqLworI2RlZmluZSBSWERNQV9GQUREUgkweDQxMENVTAkvKiBSWCBGSUZPIEFkZHJlc3MJCSovCisjZGVmaW5lIFJYRE1BX0ZUQUcJMHg0MTEwVUwJLyogUlggRklGTyBUYWcJCQkqLworI2RlZmluZSBSWERNQV9ETE9XCTB4NDExNFVMCS8qIFJYIEZJRk8gRGF0YSBMb3cJCSovCisjZGVmaW5lIFJYRE1BX0RISVQxCTB4NDExOFVMCS8qIFJYIEZJRk8gRGF0YSBIaWdoVDAJCSovCisjZGVmaW5lIFJYRE1BX0RISVQwCTB4NDExQ1VMCS8qIFJYIEZJRk8gRGF0YSBIaWdoVDEJCSovCisjZGVmaW5lIFJYRE1BX0ZTWgkweDQxMjBVTAkvKiBSWCBGSUZPIFNpemUJCQkqLworCisvKiBSWCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLiAqLworI2RlZmluZSBSWERNQV9DRkdfRU5BQkxFCTB4MDAwMDAwMDEJLyogRW5hYmxlIFJYIERNQSBjaGFubmVsCSovCisjZGVmaW5lIFJYRE1BX0NGR19SSU5HU1oJMHgwMDAwMDAxZQkvKiBSWCBkZXNjcmlwdG9yIHJpbmcgc2l6ZQkqLworI2RlZmluZSBSWERNQV9DRkdfUklOR1NaXzMyCTB4MDAwMDAwMDAJLyogLSAzMiAgIGVudHJpZXMJCSovCisjZGVmaW5lIFJYRE1BX0NGR19SSU5HU1pfNjQJMHgwMDAwMDAwMgkvKiAtIDY0ICAgZW50cmllcwkJKi8KKyNkZWZpbmUgUlhETUFfQ0ZHX1JJTkdTWl8xMjgJMHgwMDAwMDAwNAkvKiAtIDEyOCAgZW50cmllcwkJKi8KKyNkZWZpbmUgUlhETUFfQ0ZHX1JJTkdTWl8yNTYJMHgwMDAwMDAwNgkvKiAtIDI1NiAgZW50cmllcwkJKi8KKyNkZWZpbmUgUlhETUFfQ0ZHX1JJTkdTWl81MTIJMHgwMDAwMDAwOAkvKiAtIDUxMiAgZW50cmllcwkJKi8KKyNkZWZpbmUgUlhETUFfQ0ZHX1JJTkdTWl8xSwkweDAwMDAwMDBhCS8qIC0gMTAyNCBlbnRyaWVzCQkqLworI2RlZmluZSBSWERNQV9DRkdfUklOR1NaXzJLCTB4MDAwMDAwMGMJLyogLSAyMDQ4IGVudHJpZXMJCSovCisjZGVmaW5lIFJYRE1BX0NGR19SSU5HU1pfNEsJMHgwMDAwMDAwZQkvKiAtIDQwOTYgZW50cmllcwkJKi8KKyNkZWZpbmUgUlhETUFfQ0ZHX1JJTkdTWl84SwkweDAwMDAwMDEwCS8qIC0gODE5MiBlbnRyaWVzCQkqLworI2RlZmluZSBSWERNQV9DRkdfUklOR1NaX0JESVNBQgkweDAwMDAwMDIwCS8qIERpc2FibGUgUlggZGVzYyBiYXRjaGluZwkqLworI2RlZmluZSBSWERNQV9DRkdfRkJPRkYJCTB4MDAwMDFjMDAJLyogT2Zmc2V0IG9mIGZpcnN0IGRhdGEgYnl0ZQkqLworI2RlZmluZSBSWERNQV9DRkdfQ1NVTU9GRgkweDAwMGZlMDAwCS8qIFNraXAgYnl0ZXMgYmVmb3JlIGNzdW0gY2FsYwkqLworI2RlZmluZSBSWERNQV9DRkdfRlRIUkVTSAkweDA3MDAwMDAwCS8qIFJYIEZJRk8gZG1hIHN0YXJ0IHRocmVzaG9sZAkqLworI2RlZmluZSBSWERNQV9DRkdfRlRIUkVTSF82NAkweDAwMDAwMDAwCS8qIC0gNjQgICBieXRlcwkJCSovCisjZGVmaW5lIFJYRE1BX0NGR19GVEhSRVNIXzEyOAkweDAxMDAwMDAwCS8qIC0gMTI4ICBieXRlcwkJCSovCisjZGVmaW5lIFJYRE1BX0NGR19GVEhSRVNIXzI1NgkweDAyMDAwMDAwCS8qIC0gMjU2ICBieXRlcwkJCSovCisjZGVmaW5lIFJYRE1BX0NGR19GVEhSRVNIXzUxMgkweDAzMDAwMDAwCS8qIC0gNTEyICBieXRlcwkJCSovCisjZGVmaW5lIFJYRE1BX0NGR19GVEhSRVNIXzFLCTB4MDQwMDAwMDAJLyogLSAxMDI0IGJ5dGVzCQkJKi8KKyNkZWZpbmUgUlhETUFfQ0ZHX0ZUSFJFU0hfMksJMHgwNTAwMDAwMAkvKiAtIDIwNDggYnl0ZXMJCQkqLworCisvKiBSWCBEZXNjcmlwdG9yIEJhc2UgTG93L0hpZ2guCisgKgorICogVGhlc2UgdHdvIHJlZ2lzdGVycyBzdG9yZSB0aGUgNTMgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBiYXNlIGFkZHJlc3MKKyAqIG9mIHRoZSBSWCBkZXNjcmlwdG9yIHRhYmxlLiAgVGhlIDExIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgYXJlIGFsd2F5cworICogemVyby4gIEFzIGEgcmVzdWx0LCB0aGUgUlggZGVzY3JpcHRvciB0YWJsZSBtdXN0IGJlIDJLIGFsaWduZWQuCisgKi8KKworLyogUlggUEFVU0UgVGhyZXNob2xkcy4KKyAqCisgKiBUaGVzZSB2YWx1ZXMgZGV0ZXJtaW5lIHdoZW4gWE9GRiBhbmQgWE9OIFBBVVNFIGZyYW1lcyBhcmUgZW1pdHRlZCBieQorICogR0VNLiAgVGhlIHRocmVzaG9sZHMgbWVhc3VyZSBSWCBGSUZPIG9jY3VwYW5jeSBpbiB1bml0cyBvZiA2NCBieXRlcy4KKyAqLworI2RlZmluZSBSWERNQV9QVEhSRVNIX09GRgkweDAwMDAwMWZmCS8qIFhPRkYgZW1pdHRlZCB3L0ZJRk8gPiB0aGlzCSovCisjZGVmaW5lIFJYRE1BX1BUSFJFU0hfT04JMHgwMDFmZjAwMAkvKiBYT04gZW1pdHRlZCB3L0ZJRk8gPCB0aGlzCSovCisKKy8qIFJYIEtpY2sgUmVnaXN0ZXIuCisgKgorICogVGhpcyAxMy1iaXQgcmVnaXN0ZXIgaXMgd3JpdHRlbiBieSB0aGUgaG9zdCBDUFUgYW5kIGhvbGRzIHRoZSBsYXN0CisgKiB2YWxpZCBSWCBkZXNjcmlwdG9yIG51bWJlciBwbHVzIG9uZS4gIFRoaXMgaXMsIGlmICdOJyBpcyB3cml0dGVuIHRvCisgKiB0aGlzIHJlZ2lzdGVyLCBpdCBtZWFucyB0aGF0IGFsbCBSWCBkZXNjcmlwdG9ycyB1cCB0byBidXQgZXhjbHVkaW5nCisgKiAnTicgYXJlIHZhbGlkLgorICoKKyAqIFRoZSBoYXJkd2FyZSByZXF1aXJlcyB0aGF0IFJYIGRlc2NyaXB0b3JzIGFyZSBwb3N0ZWQgaW4gaW5jcmVtZW50cworICogb2YgNC4gIFRoaXMgbWVhbnMgJ04nIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBmb3VyLiAgRm9yIHRoZSBiZXN0CisgKiBwZXJmb3JtYW5jZSwgdGhlIGZpcnN0IG5ldyBkZXNjcmlwdG9yIGJlaW5nIHBvc3RlZCBzaG91bGQgYmUgKFBDSSkKKyAqIGNhY2hlIGxpbmUgYWxpZ25lZC4KKyAqLworCisvKiBSWCBDb21wbGV0aW9uIFJlZ2lzdGVyLgorICoKKyAqIFRoaXMgMTMtYml0IHJlZ2lzdGVyIGlzIHVwZGF0ZWQgYnkgR0VNIHRvIGluZGljYXRlIHdoaWNoIFJYIGRlc2NyaXB0b3JzCisgKiBoYXZlIGFscmVhZHkgYmVlbiB1c2VkIGZvciByZWNlaXZlIGZyYW1lcy4gIEFsbCBkZXNjcmlwdG9ycyB1cCB0byBidXQKKyAqIGV4Y2x1ZGluZyB0aGUgdmFsdWUgaW4gdGhpcyByZWdpc3RlciBhcmUgcmVhZHkgdG8gYmUgcHJvY2Vzc2VkLiAgR0VNCisgKiB1cGRhdGVzIHRoaXMgcmVnaXN0ZXIgdmFsdWUgYWZ0ZXIgdGhlIFJYIEZJRk8gZW1wdGllcyBjb21wbGV0ZWx5IGludG8KKyAqIHRoZSBSWCBkZXNjcmlwdG9yJ3MgYnVmZmVyLCBidXQgYmVmb3JlIHRoZSBSWF9ET05FIGJpdCBpcyBzZXQgaW4gdGhlCisgKiBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyLgorICovCisKKy8qIFJYIEJsYW5raW5nIFJlZ2lzdGVyLiAqLworI2RlZmluZSBSWERNQV9CTEFOS19JUEtUUwkweDAwMDAwMWZmCS8qIFJYX0RPTkUgYXNzZXJ0ZWQgYWZ0ZXIgdGhpcworCQkJCQkJICogbWFueSBwYWNrZXRzIHJlY2VpdmVkIHNpbmNlCisJCQkJCQkgKiBwcmV2aW91cyBSWF9ET05FLgorCQkJCQkJICovCisjZGVmaW5lIFJYRE1BX0JMQU5LX0lUSU1FCTB4MDAwZmYwMDAJLyogUlhfRE9ORSBhc3NlcnRlZCBhZnRlciB0aGlzCisJCQkJCQkgKiBtYW55IGNsb2NrcyAobWVhc3VyZWQgaW4gMjA0OAorCQkJCQkJICogUENJIGNsb2Nrcykgd2VyZSBjb3VudGVkIHNpbmNlCisJCQkJCQkgKiB0aGUgcHJldmlvdXMgUlhfRE9ORS4KKwkJCQkJCSAqLworCisvKiBSWCBGSUZPIFNpemUuCisgKgorICogVGhpcyAxMS1iaXQgcmVhZC1vbmx5IHJlZ2lzdGVyIGluZGljYXRlcyBob3cgbGFyZ2UsIGluIHVuaXRzIG9mIDY0LWJ5dGVzLAorICogdGhlIFJYIEZJRk8gaXMuICBUaGUgZHJpdmVyIHVzZXMgdGhpcyB0byBwcm9wZXJseSBjb25maWd1cmUgdGhlIFJYIFBBVVNFCisgKiB0aHJlc2hvbGRzLgorICovCisKKy8qIFRoZSByZXN0IG9mIHRoZSBSWERNQV8qIHJlZ2lzdGVycyBhcmUgZm9yIGRpYWdub3N0aWNzIGFuZCBkZWJ1ZywgSSB3aWxsIGRvY3VtZW50CisgKiB0aGVtIGxhdGVyLiAtRGF2ZU0KKyAqLworCisvKiBNQUMgUmVnaXN0ZXJzICovCisjZGVmaW5lIE1BQ19UWFJTVAkweDYwMDBVTAkvKiBUWCBNQUMgU29mdHdhcmUgUmVzZXQgQ29tbWFuZCovCisjZGVmaW5lIE1BQ19SWFJTVAkweDYwMDRVTAkvKiBSWCBNQUMgU29mdHdhcmUgUmVzZXQgQ29tbWFuZCovCisjZGVmaW5lIE1BQ19TTkRQQVVTRQkweDYwMDhVTAkvKiBTZW5kIFBhdXNlIENvbW1hbmQgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX1RYU1RBVAkweDYwMTBVTAkvKiBUWCBNQUMgU3RhdHVzIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19SWFNUQVQJMHg2MDE0VUwJLyogUlggTUFDIFN0YXR1cyBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfQ1NUQVQJMHg2MDE4VUwJLyogTUFDIENvbnRyb2wgU3RhdHVzIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19UWE1BU0sJMHg2MDIwVUwJLyogVFggTUFDIE1hc2sgUmVnaXN0ZXIJCSovCisjZGVmaW5lIE1BQ19SWE1BU0sJMHg2MDI0VUwJLyogUlggTUFDIE1hc2sgUmVnaXN0ZXIJCSovCisjZGVmaW5lIE1BQ19NQ01BU0sJMHg2MDI4VUwJLyogTUFDIENvbnRyb2wgTWFzayBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfVFhDRkcJMHg2MDMwVUwJLyogVFggTUFDIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIqLworI2RlZmluZSBNQUNfUlhDRkcJMHg2MDM0VUwJLyogUlggTUFDIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIqLworI2RlZmluZSBNQUNfTUNDRkcJMHg2MDM4VUwJLyogTUFDIENvbnRyb2wgQ29uZmlnIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19YSUZDRkcJMHg2MDNDVUwJLyogWElGIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0lQRzAJMHg2MDQwVUwJLyogSW50ZXJQYWNrZXRHYXAwIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19JUEcxCTB4NjA0NFVMCS8qIEludGVyUGFja2V0R2FwMSBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfSVBHMgkweDYwNDhVTAkvKiBJbnRlclBhY2tldEdhcDIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX1NUSU1FCTB4NjA0Q1VMCS8qIFNsb3RUaW1lIFJlZ2lzdGVyCQkqLworI2RlZmluZSBNQUNfTUlORlNaCTB4NjA1MFVMCS8qIE1pbkZyYW1lU2l6ZSBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfTUFYRlNaCTB4NjA1NFVMCS8qIE1heEZyYW1lU2l6ZSBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfUEFTSVpFCTB4NjA1OFVMCS8qIFBBIFNpemUgUmVnaXN0ZXIJCSovCisjZGVmaW5lIE1BQ19KQU1TSVpFCTB4NjA1Q1VMCS8qIEphbVNpemUgUmVnaXN0ZXIJCSovCisjZGVmaW5lIE1BQ19BVFRMSU0JMHg2MDYwVUwJLyogQXR0ZW1wdCBMaW1pdCBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfTUNUWVBFCTB4NjA2NFVMCS8qIE1BQyBDb250cm9sIFR5cGUgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0FERFIwCTB4NjA4MFVMCS8qIE1BQyBBZGRyZXNzIDAgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0FERFIxCTB4NjA4NFVMCS8qIE1BQyBBZGRyZXNzIDEgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0FERFIyCTB4NjA4OFVMCS8qIE1BQyBBZGRyZXNzIDIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0FERFIzCTB4NjA4Q1VMCS8qIE1BQyBBZGRyZXNzIDMgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0FERFI0CTB4NjA5MFVMCS8qIE1BQyBBZGRyZXNzIDQgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0FERFI1CTB4NjA5NFVMCS8qIE1BQyBBZGRyZXNzIDUgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0FERFI2CTB4NjA5OFVMCS8qIE1BQyBBZGRyZXNzIDYgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0FERFI3CTB4NjA5Q1VMCS8qIE1BQyBBZGRyZXNzIDcgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0FERFI4CTB4NjBBMFVMCS8qIE1BQyBBZGRyZXNzIDggUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0FGSUxUMAkweDYwQTRVTAkvKiBBZGRyZXNzIEZpbHRlciAwIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19BRklMVDEJMHg2MEE4VUwJLyogQWRkcmVzcyBGaWx0ZXIgMSBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfQUZJTFQyCTB4NjBBQ1VMCS8qIEFkZHJlc3MgRmlsdGVyIDIgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0FGMjFNU0sJMHg2MEIwVUwJLyogQWRkcmVzcyBGaWx0ZXIgMiYxIE1hc2sgUmVnCSovCisjZGVmaW5lIE1BQ19BRjBNU0sJMHg2MEI0VUwJLyogQWRkcmVzcyBGaWx0ZXIgMCBNYXNrIFJlZwkqLworI2RlZmluZSBNQUNfSEFTSDAJMHg2MEMwVUwJLyogSGFzaCBUYWJsZSAwIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19IQVNIMQkweDYwQzRVTAkvKiBIYXNoIFRhYmxlIDEgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0hBU0gyCTB4NjBDOFVMCS8qIEhhc2ggVGFibGUgMiBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfSEFTSDMJMHg2MENDVUwJLyogSGFzaCBUYWJsZSAzIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19IQVNINAkweDYwRDBVTAkvKiBIYXNoIFRhYmxlIDQgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0hBU0g1CTB4NjBENFVMCS8qIEhhc2ggVGFibGUgNSBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfSEFTSDYJMHg2MEQ4VUwJLyogSGFzaCBUYWJsZSA2IFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19IQVNINwkweDYwRENVTAkvKiBIYXNoIFRhYmxlIDcgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0hBU0g4CTB4NjBFMFVMCS8qIEhhc2ggVGFibGUgOCBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfSEFTSDkJMHg2MEU0VUwJLyogSGFzaCBUYWJsZSA5IFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19IQVNIMTAJMHg2MEU4VUwJLyogSGFzaCBUYWJsZSAxMCBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfSEFTSDExCTB4NjBFQ1VMCS8qIEhhc2ggVGFibGUgMTEgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0hBU0gxMgkweDYwRjBVTAkvKiBIYXNoIFRhYmxlIDEyIFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19IQVNIMTMJMHg2MEY0VUwJLyogSGFzaCBUYWJsZSAxMyBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfSEFTSDE0CTB4NjBGOFVMCS8qIEhhc2ggVGFibGUgMTQgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUFDX0hBU0gxNQkweDYwRkNVTAkvKiBIYXNoIFRhYmxlIDE1IFJlZ2lzdGVyCSovCisjZGVmaW5lIE1BQ19OQ09MTAkweDYxMDBVTAkvKiBOb3JtYWwgQ29sbGlzaW9uIENvdW50ZXIJKi8KKyNkZWZpbmUgTUFDX0ZBU1VDQwkweDYxMDRVTAkvKiBGaXJzdCBBdHRtcHQuIFN1Y2MgQ29sbCBDdHIuCSovCisjZGVmaW5lIE1BQ19FQ09MTAkweDYxMDhVTAkvKiBFeGNlc3NpdmUgQ29sbGlzaW9uIENvdW50ZXIJKi8KKyNkZWZpbmUgTUFDX0xDT0xMCTB4NjEwQ1VMCS8qIExhdGUgQ29sbGlzaW9uIENvdW50ZXIJKi8KKyNkZWZpbmUgTUFDX0RUSU1FUgkweDYxMTBVTAkvKiBEZWZlciBUaW1lcgkJCSovCisjZGVmaW5lIE1BQ19QQVRNUFMJMHg2MTE0VUwJLyogUGVhayBBdHRlbXB0cyBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfUkZDVFIJMHg2MTE4VUwJLyogUmVjZWl2ZSBGcmFtZSBDb3VudGVyCSovCisjZGVmaW5lIE1BQ19MRVJSCTB4NjExQ1VMCS8qIExlbmd0aCBFcnJvciBDb3VudGVyCQkqLworI2RlZmluZSBNQUNfQUVSUgkweDYxMjBVTAkvKiBBbGlnbm1lbnQgRXJyb3IgQ291bnRlcgkqLworI2RlZmluZSBNQUNfRkNTRVJSCTB4NjEyNFVMCS8qIEZDUyBFcnJvciBDb3VudGVyCQkqLworI2RlZmluZSBNQUNfUlhDVkVSUgkweDYxMjhVTAkvKiBSWCBjb2RlIFZpb2xhdGlvbiBFcnJvciBDdHIJKi8KKyNkZWZpbmUgTUFDX1JBTkRTRUVECTB4NjEzMFVMCS8qIFJhbmRvbSBOdW1iZXIgU2VlZCBSZWdpc3RlcgkqLworI2RlZmluZSBNQUNfU01BQ0hJTkUJMHg2MTM0VUwJLyogU3RhdGUgTWFjaGluZSBSZWdpc3RlcgkqLworCisvKiBUWCBNQUMgU29mdHdhcmUgUmVzZXQgQ29tbWFuZC4gKi8KKyNkZWZpbmUgTUFDX1RYUlNUX0NNRAkweDAwMDAwMDAxCS8qIFN0YXJ0IHN3IHJlc2V0LCBzZWxmLWNsZWFycwkqLworCisvKiBSWCBNQUMgU29mdHdhcmUgUmVzZXQgQ29tbWFuZC4gKi8KKyNkZWZpbmUgTUFDX1JYUlNUX0NNRAkweDAwMDAwMDAxCS8qIFN0YXJ0IHN3IHJlc2V0LCBzZWxmLWNsZWFycwkqLworCisvKiBTZW5kIFBhdXNlIENvbW1hbmQuICovCisjZGVmaW5lIE1BQ19TTkRQQVVTRV9UUwkweDAwMDBmZmZmCS8qIFRoZSBwYXVzZV90aW1lIG9wZXJhbmQgdXNlZCBpbgorCQkJCQkgKiBTZW5kX1BhdXNlIGFuZCBmbG93LWNvbnRyb2wKKwkJCQkJICogaGFuZHNoYWtlcy4KKwkJCQkJICovCisjZGVmaW5lIE1BQ19TTkRQQVVTRV9TUAkweDAwMDEwMDAwCS8qIFNldHRpbmcgdGhpcyBiaXQgaW5zdHJ1Y3RzIHRoZSBNQUMKKwkJCQkJICogdG8gc2VuZCBhIFBhdXNlIEZsb3cgQ29udHJvbAorCQkJCQkgKiBmcmFtZSBvbnRvIHRoZSBuZXR3b3JrLgorCQkJCQkgKi8KKworLyogVFggTUFDIFN0YXR1cyBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUFDX1RYU1RBVF9YTUlUCTB4MDAwMDAwMDEJLyogRnJhbWUgVHJhbnNtaXR0ZWQJCSovCisjZGVmaW5lIE1BQ19UWFNUQVRfVVJVTgkweDAwMDAwMDAyCS8qIFRYIFVuZGVycnVuCQkJKi8KKyNkZWZpbmUgTUFDX1RYU1RBVF9NUEUJMHgwMDAwMDAwNAkvKiBNYXggUGFja2V0IFNpemUgRXJyb3IJKi8KKyNkZWZpbmUgTUFDX1RYU1RBVF9OQ0UJMHgwMDAwMDAwOAkvKiBOb3JtYWwgQ29sbGlzaW9uIENudHIgRXhwaXJlCSovCisjZGVmaW5lIE1BQ19UWFNUQVRfRUNFCTB4MDAwMDAwMTAJLyogRXhjZXNzIENvbGxpc2lvbiBDbnRyIEV4cGlyZQkqLworI2RlZmluZSBNQUNfVFhTVEFUX0xDRQkweDAwMDAwMDIwCS8qIExhdGUgQ29sbGlzaW9uIENudHIgRXhwaXJlCSovCisjZGVmaW5lIE1BQ19UWFNUQVRfRkNFCTB4MDAwMDAwNDAJLyogRmlyc3QgQ29sbGlzaW9uIENudHIgRXhwaXJlCSovCisjZGVmaW5lIE1BQ19UWFNUQVRfRFRFCTB4MDAwMDAwODAJLyogRGVmZXIgVGltZXIgRXhwaXJlCQkqLworI2RlZmluZSBNQUNfVFhTVEFUX1BDRQkweDAwMDAwMTAwCS8qIFBlYWsgQXR0ZW1wdHMgQ250ciBFeHBpcmUJKi8KKworLyogUlggTUFDIFN0YXR1cyBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUFDX1JYU1RBVF9SQ1YJMHgwMDAwMDAwMQkvKiBGcmFtZSBSZWNlaXZlZAkJKi8KKyNkZWZpbmUgTUFDX1JYU1RBVF9PRkxXCTB4MDAwMDAwMDIJLyogUmVjZWl2ZSBPdmVyZmxvdwkJKi8KKyNkZWZpbmUgTUFDX1JYU1RBVF9GQ0UJMHgwMDAwMDAwNAkvKiBGcmFtZSBDbnRyIEV4cGlyZQkJKi8KKyNkZWZpbmUgTUFDX1JYU1RBVF9BQ0UJMHgwMDAwMDAwOAkvKiBBbGlnbiBFcnJvciBDbnRyIEV4cGlyZQkqLworI2RlZmluZSBNQUNfUlhTVEFUX0NDRQkweDAwMDAwMDEwCS8qIENSQyBFcnJvciBDbnRyIEV4cGlyZQkqLworI2RlZmluZSBNQUNfUlhTVEFUX0xDRQkweDAwMDAwMDIwCS8qIExlbmd0aCBFcnJvciBDbnRyIEV4cGlyZQkqLworI2RlZmluZSBNQUNfUlhTVEFUX1ZDRQkweDAwMDAwMDQwCS8qIENvZGUgVmlvbGF0aW9uIENudHIgRXhwaXJlCSovCisKKy8qIE1BQyBDb250cm9sIFN0YXR1cyBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgTUFDX0NTVEFUX1BSQ1YJMHgwMDAwMDAwMQkvKiBQYXVzZSBSZWNlaXZlZAkJKi8KKyNkZWZpbmUgTUFDX0NTVEFUX1BTCTB4MDAwMDAwMDIJLyogUGF1c2VkIFN0YXRlCQkJKi8KKyNkZWZpbmUgTUFDX0NTVEFUX05QUwkweDAwMDAwMDA0CS8qIE5vdCBQYXVzZWQgU3RhdGUJCSovCisjZGVmaW5lIE1BQ19DU1RBVF9QVFIJMHhmZmZmMDAwMAkvKiBQYXVzZSBUaW1lIFJlY2VpdmVkCQkqLworCisvKiBUaGUgbGF5b3V0IG9mIHRoZSBNQUNfe1RYLFJYLEN9TUFTSyByZWdpc3RlcnMgaXMgaWRlbnRpY2FsIHRvIHRoYXQKKyAqIG9mIE1BQ197VFgsUlgsQ31TVEFULiAgQml0cyBzZXQgaW4gTUFDX3tUWCxSWCxDfU1BU0sgd2lsbCBwcmV2ZW50CisgKiB0aGF0IGludGVycnVwdCB0eXBlIGZyb20gYmVpbmcgc2lnbmFsbGVkIHRvIGZyb250IGVuZCBvZiBHRU0uICBGb3IKKyAqIHRoZSBpbnRlcnJ1cHQgdG8gYWN0dWFsbHkgZ2V0IHNlbnQgdG8gdGhlIGNwdSwgaXQgaXMgbmVjZXNzYXJ5IHRvCisgKiBwcm9wZXJseSBzZXQgdGhlIGFwcHJvcHJpYXRlIEdSRUdfSU1BU0tfe1RYLFJYLH1NQUMgYml0cyBhcyB3ZWxsLgorICovCisKKy8qIFRYIE1BQyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLgorICoKKyAqIE5PVEU6IFRoZSBUWCBNQUMgRW5hYmxlIGJpdCBtdXN0IGJlIGNsZWFyZWQgYW5kIHBvbGxlZCB1bnRpbAorICoJIHplcm8gYmVmb3JlIGFueSBvdGhlciBiaXRzIGluIHRoaXMgcmVnaXN0ZXIgYXJlIGNoYW5nZWQuCisgKgorICoJIEFsc28sIGVuYWJsaW5nIHRoZSBDYXJyaWVyIEV4dGVuc2lvbiBmZWF0dXJlIG9mIEdFTSBpcworICoJIGEgMyBzdGVwIHByb2Nlc3MgMSkgU2V0IFRYIENhcnJpZXIgRXh0ZW5zaW9uIDIpIFNldAorICoJIFJYIENhcnJpZXIgRXh0ZW5zaW9uIDMpIFNldCBTbG90IFRpbWUgdG8gMHgyMDAuICBUaGlzCisgKgkgbW9kZSBtdXN0IGJlIGVuYWJsZWQgd2hlbiBpbiBoYWxmLWR1cGxleCBhdCAxR2JwcywgZWxzZQorICoJIGl0IG11c3QgYmUgZGlzYWJsZWQuCisgKi8KKyNkZWZpbmUgTUFDX1RYQ0ZHX0VOQUIJMHgwMDAwMDAwMQkvKiBUWCBNQUMgRW5hYmxlCQkqLworI2RlZmluZSBNQUNfVFhDRkdfSUNTCTB4MDAwMDAwMDIJLyogSWdub3JlIENhcnJpZXIgU2Vuc2UJCSovCisjZGVmaW5lIE1BQ19UWENGR19JQ09MTAkweDAwMDAwMDA0CS8qIElnbm9yZSBDb2xsaXNpb25zCQkqLworI2RlZmluZSBNQUNfVFhDRkdfRUlQRzAJMHgwMDAwMDAwOAkvKiBFbmFibGUgSVBHMAkJCSovCisjZGVmaW5lIE1BQ19UWENGR19OR1UJMHgwMDAwMDAxMAkvKiBOZXZlciBHaXZlIFVwCQkqLworI2RlZmluZSBNQUNfVFhDRkdfTkdVTAkweDAwMDAwMDIwCS8qIE5ldmVyIEdpdmUgVXAgTGltaXQJCSovCisjZGVmaW5lIE1BQ19UWENGR19OQk8JMHgwMDAwMDA0MAkvKiBObyBCYWNrb2ZmCQkJKi8KKyNkZWZpbmUgTUFDX1RYQ0ZHX1NECTB4MDAwMDAwODAJLyogU2xvdyBEb3duCQkJKi8KKyNkZWZpbmUgTUFDX1RYQ0ZHX05GQ1MJMHgwMDAwMDEwMAkvKiBObyBGQ1MJCQkqLworI2RlZmluZSBNQUNfVFhDRkdfVENFCTB4MDAwMDAyMDAJLyogVFggQ2FycmllciBFeHRlbnNpb24JCSovCisKKy8qIFJYIE1BQyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLgorICoKKyAqIE5PVEU6IFRoZSBSWCBNQUMgRW5hYmxlIGJpdCBtdXN0IGJlIGNsZWFyZWQgYW5kIHBvbGxlZCB1bnRpbAorICoJIHplcm8gYmVmb3JlIGFueSBvdGhlciBiaXRzIGluIHRoaXMgcmVnaXN0ZXIgYXJlIGNoYW5nZWQuCisgKgorICoJIFNpbWlsYXIgcnVsZXMgYXBwbHkgdG8gdGhlIEhhc2ggRmlsdGVyIEVuYWJsZSBiaXQgd2hlbgorICoJIHByb2dyYW1taW5nIHRoZSBoYXNoIHRhYmxlIHJlZ2lzdGVycywgYW5kIHRoZSBBZGRyZXNzIEZpbHRlcgorICoJIEVuYWJsZSBiaXQgd2hlbiBwcm9ncmFtbWluZyB0aGUgYWRkcmVzcyBmaWx0ZXIgcmVnaXN0ZXJzLgorICovCisjZGVmaW5lIE1BQ19SWENGR19FTkFCCTB4MDAwMDAwMDEJLyogUlggTUFDIEVuYWJsZQkJKi8KKyNkZWZpbmUgTUFDX1JYQ0ZHX1NQQUQJMHgwMDAwMDAwMgkvKiBTdHJpcCBQYWQJCQkqLworI2RlZmluZSBNQUNfUlhDRkdfU0ZDUwkweDAwMDAwMDA0CS8qIFN0cmlwIEZDUwkJCSovCisjZGVmaW5lIE1BQ19SWENGR19QUk9NCTB4MDAwMDAwMDgJLyogUHJvbWlzY3VvdXMgTW9kZQkJKi8KKyNkZWZpbmUgTUFDX1JYQ0ZHX1BHUlAJMHgwMDAwMDAxMAkvKiBQcm9taXNjdW91cyBHcm91cAkJKi8KKyNkZWZpbmUgTUFDX1JYQ0ZHX0hGRQkweDAwMDAwMDIwCS8qIEhhc2ggRmlsdGVyIEVuYWJsZQkJKi8KKyNkZWZpbmUgTUFDX1JYQ0ZHX0FGRQkweDAwMDAwMDQwCS8qIEFkZHJlc3MgRmlsdGVyIEVuYWJsZQkqLworI2RlZmluZSBNQUNfUlhDRkdfRERFCTB4MDAwMDAwODAJLyogRGlzYWJsZSBEaXNjYXJkIG9uIEVycm9yCSovCisjZGVmaW5lIE1BQ19SWENGR19SQ0UJMHgwMDAwMDEwMAkvKiBSWCBDYXJyaWVyIEV4dGVuc2lvbgkJKi8KKworLyogTUFDIENvbnRyb2wgQ29uZmlnIFJlZ2lzdGVyLiAqLworI2RlZmluZSBNQUNfTUNDRkdfU1BFCTB4MDAwMDAwMDEJLyogU2VuZCBQYXVzZSBFbmFibGUJCSovCisjZGVmaW5lIE1BQ19NQ0NGR19SUEUJMHgwMDAwMDAwMgkvKiBSZWNlaXZlIFBhdXNlIEVuYWJsZQkJKi8KKyNkZWZpbmUgTUFDX01DQ0ZHX1BNQwkweDAwMDAwMDA0CS8qIFBhc3MgTUFDIENvbnRyb2wJCSovCisKKy8qIFhJRiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLgorICoKKyAqIE5PVEU6IFdoZW4gbGVhdmluZyBvciBlbnRlcmluZyBsb29wYmFjayBtb2RlLCBhIGdsb2JhbCBoYXJkd2FyZQorICogICAgICAgaW5pdCBvZiBHRU0gc2hvdWxkIGJlIHBlcmZvcm1lZC4KKyAqLworI2RlZmluZSBNQUNfWElGQ0ZHX09FCTB4MDAwMDAwMDEJLyogTUlJIFRYIE91dHB1dCBEcml2ZXIgRW5hYmxlCSovCisjZGVmaW5lIE1BQ19YSUZDRkdfTEJDSwkweDAwMDAwMDAyCS8qIExvb3BiYWNrIFRYIHRvIFJYCQkqLworI2RlZmluZSBNQUNfWElGQ0ZHX0RJU0UJMHgwMDAwMDAwNAkvKiBEaXNhYmxlIFJYIHBhdGggZHVyaW5nIFRYCSovCisjZGVmaW5lIE1BQ19YSUZDRkdfR01JSQkweDAwMDAwMDA4CS8qIFVzZSBHTUlJIGNsb2NrcyArIGRhdGFwYXRoCSovCisjZGVmaW5lIE1BQ19YSUZDRkdfTUJPRQkweDAwMDAwMDEwCS8qIENvbnRyb2xzIE1JSV9CVUZfRU4gcGluCSovCisjZGVmaW5lIE1BQ19YSUZDRkdfTExFRAkweDAwMDAwMDIwCS8qIEZvcmNlIExJTktMRUQjIGFjdGl2ZSAobG93KQkqLworI2RlZmluZSBNQUNfWElGQ0ZHX0ZMRUQJMHgwMDAwMDA0MAkvKiBGb3JjZSBGRFBMWExFRCMgYWN0aXZlIChsb3cpCSovCisKKy8qIEludGVyUGFja2V0R2FwMCBSZWdpc3Rlci4gIFRoaXMgOC1iaXQgdmFsdWUgaXMgdXNlZCBhcyBhbiBleHRlbnNpb24KKyAqIHRvIHRoZSBJbnRlclBhY2tldEdhcDEgUmVnaXN0ZXIuICBTcGVjaWZpY2FsbHkgaXQgY29udHJpYnV0ZXMgdG8gdGhlCisgKiB0aW1pbmcgb2YgdGhlIFJYLXRvLVRYIElQRy4gIFRoaXMgdmFsdWUgaXMgaWdub3JlZCBhbmQgcHJlc3VtZWQgdG8KKyAqIGJlIHplcm8gZm9yIFRYLXRvLVRYIElQRyBjYWxjdWxhdGlvbnMgYW5kL29yIHdoZW4gdGhlIEVuYWJsZSBJUEcwIGJpdAorICogaXMgY2xlYXJlZCBpbiB0aGUgVFggTUFDIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuCisgKgorICogVGhpcyB2YWx1ZSBpbiB0aGlzIHJlZ2lzdGVyIGluIHRlcm1zIG9mIG1lZGlhIGJ5dGUgdGltZS4KKyAqCisgKiBSZWNvbW1lbmRlZCB2YWx1ZTogMHgwMAorICovCisKKy8qIEludGVyUGFja2V0R2FwMSBSZWdpc3Rlci4gIFRoaXMgOC1iaXQgdmFsdWUgZGVmaW5lcyB0aGUgZmlyc3QgMi8zCisgKiBwb3J0aW9uIG9mIHRoZSBJbnRlciBQYWNrZXQgR2FwLgorICoKKyAqIFRoaXMgdmFsdWUgaW4gdGhpcyByZWdpc3RlciBpbiB0ZXJtcyBvZiBtZWRpYSBieXRlIHRpbWUuCisgKgorICogUmVjb21tZW5kZWQgdmFsdWU6IDB4MDgKKyAqLworCisvKiBJbnRlclBhY2tldEdhcDIgUmVnaXN0ZXIuICBUaGlzIDgtYml0IHZhbHVlIGRlZmluZXMgdGhlIHNlY29uZCAxLzMKKyAqIHBvcnRpb24gb2YgdGhlIEludGVyIFBhY2tldCBHYXAuCisgKgorICogVGhpcyB2YWx1ZSBpbiB0aGlzIHJlZ2lzdGVyIGluIHRlcm1zIG9mIG1lZGlhIGJ5dGUgdGltZS4KKyAqCisgKiBSZWNvbW1lbmRlZCB2YWx1ZTogMHgwNAorICovCisKKy8qIFNsb3QgVGltZSBSZWdpc3Rlci4gIFRoaXMgMTAtYml0IHZhbHVlIHNwZWNpZmllcyB0aGUgc2xvdCB0aW1lCisgKiBwYXJhbWV0ZXIgaW4gdW5pdHMgb2YgbWVkaWEgYnl0ZSB0aW1lLiAgSXQgZGV0ZXJtaW5lcyB0aGUgcGh5c2ljYWwKKyAqIHNwYW4gb2YgdGhlIG5ldHdvcmsuCisgKgorICogUmVjb21tZW5kZWQgdmFsdWU6IDB4NDAKKyAqLworCisvKiBNaW5pbXVtIEZyYW1lIFNpemUgUmVnaXN0ZXIuICBUaGlzIDEwLWJpdCByZWdpc3RlciBzcGVjaWZpZXMgdGhlCisgKiBzbWFsbGVzdCBzaXplZCBmcmFtZSB0aGUgVFhNQUMgd2lsbCBzZW5kIG9udG8gdGhlIG1lZGl1bSwgYW5kIHRoZQorICogUlhNQUMgd2lsbCByZWNlaXZlIGZyb20gdGhlIG1lZGl1bS4KKyAqCisgKiBSZWNvbW1lbmRlZCB2YWx1ZTogMHg0MAorICovCisKKy8qIE1heGltdW0gRnJhbWUgYW5kIEJ1cnN0IFNpemUgUmVnaXN0ZXIuCisgKgorICogVGhpcyByZWdpc3RlciBzcGVjaWZpZXMgdHdvIHRoaW5ncy4gIEZpcnN0IGl0IHNwZWNpZmllcyB0aGUgbWF4aW11bQorICogc2l6ZWQgZnJhbWUgdGhlIFRYTUFDIHdpbGwgc2VuZCBhbmQgdGhlIFJYTUFDIHdpbGwgcmVjb2duaXplIGFzCisgKiB2YWxpZC4gIFNlY29uZCwgaXQgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIHJ1biBsZW5ndGggb2YgYSBidXJzdCBvZgorICogcGFja2V0cyBzZW50IGluIGhhbGYtZHVwbGV4IGdpZ2FiaXQgbW9kZXMuCisgKgorICogUmVjb21tZW5kZWQgdmFsdWU6IDB4MjAwMDA1ZWUKKyAqLworI2RlZmluZSBNQUNfTUFYRlNaX01GUwkweDAwMDA3ZmZmCS8qIE1heCBGcmFtZSBTaXplCQkqLworI2RlZmluZSBNQUNfTUFYRlNaX01CUwkweDdmZmYwMDAwCS8qIE1heCBCdXJzdCBTaXplCQkqLworCisvKiBQQSBTaXplIFJlZ2lzdGVyLiAgVGhpcyAxMC1iaXQgcmVnaXN0ZXIgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcHJlYW1ibGUKKyAqIGJ5dGVzIHdoaWNoIHdpbGwgYmUgdHJhbnNtaXR0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGZyYW1lLiAgQQorICogdmFsdWUgb2YgdHdvIG9yIGdyZWF0ZXIgc2hvdWxkIGJlIHByb2dyYW1tZWQgaGVyZS4KKyAqCisgKiBSZWNvbW1lbmRlZCB2YWx1ZTogMHgwNworICovCisKKy8qIEphbSBTaXplIFJlZ2lzdGVyLiAgVGhpcyA0LWJpdCByZWdpc3RlciBzcGVjaWZpZXMgdGhlIGR1cmF0aW9uIG9mCisgKiB0aGUgamFtIGluIHVuaXRzIG9mIG1lZGlhIGJ5dGUgdGltZS4KKyAqCisgKiBSZWNvbW1lbmRlZCB2YWx1ZTogMHgwNAorICovCisKKy8qIEF0dGVtcHRzIExpbWl0IFJlZ2lzdGVyLiAgVGhpcyA4LWJpdCByZWdpc3RlciBzcGVjaWZpZXMgdGhlIG51bWJlcgorICogb2YgYXR0ZW1wdHMgdGhhdCB0aGUgVFhNQUMgd2lsbCBtYWtlIHRvIHRyYW5zbWl0IGEgZnJhbWUsIGJlZm9yZSBpdAorICogcmVzZXRzIGl0cyBBdHRlbXB0cyBDb3VudGVyLiAgQWZ0ZXIgcmVhY2hpbmcgdGhlIEF0dGVtcHRzIExpbWl0IHRoZQorICogVFhNQUMgbWF5IG9yIG1heSBub3QgZHJvcCB0aGUgZnJhbWUsIGFzIGRldGVybWluZWQgYnkgdGhlIE5HVQorICogKE5ldmVyIEdpdmUgVXApIGFuZCBOR1VMIChOZXZlciBHaXZlIFVwIExpbWl0KSBiaXRzIGluIHRoZSBUWE1BQworICogQ29uZmlndXJhdGlvbiBSZWdpc3Rlci4KKyAqCisgKiBSZWNvbW1lbmRlZCB2YWx1ZTogMHgxMAorICovCisKKy8qIE1BWCBDb250cm9sIFR5cGUgUmVnaXN0ZXIuICBUaGlzIDE2LWJpdCByZWdpc3RlciBzcGVjaWZpZXMgdGhlCisgKiAidHlwZSIgZmllbGQgb2YgYSBNQUMgQ29udHJvbCBmcmFtZS4gIFRoZSBUWE1BQyB1c2VzIHRoaXMgZmllbGQgdG8KKyAqIGVuY2Fwc3VsYXRlIHRoZSBNQUMgQ29udHJvbCBmcmFtZSBmb3IgdHJhbnNtaXNzaW9uLCBhbmQgdGhlIFJYTUFDCisgKiB1c2VzIGl0IGZvciBkZWNvZGluZyB2YWxpZCBNQUMgQ29udHJvbCBmcmFtZXMgcmVjZWl2ZWQgZnJvbSB0aGUKKyAqIG5ldHdvcmsuCisgKgorICogUmVjb21tZW5kZWQgdmFsdWU6IDB4ODgwOAorICovCisKKy8qIE1BQyBBZGRyZXNzIFJlZ2lzdGVycy4gIEVhY2ggb2YgdGhlc2UgcmVnaXN0ZXJzIHNwZWNpZnkgdGhlCisgKiBldGhlcm5ldCBNQUMgb2YgdGhlIGludGVyZmFjZSwgMTYtYml0cyBhdCBhIHRpbWUuICBSZWdpc3RlcgorICogMCBzcGVjaWZpZXMgYml0cyBbNDc6MzJdLCByZWdpc3RlciAxIGJpdHMgWzMxOjE2XSwgYW5kIHJlZ2lzdGVyCisgKiAyIGJpdHMgWzE1OjBdLgorICoKKyAqIFJlZ2lzdGVycyAzIHRocm91Z2ggYW5kIGluY2x1ZGluZyA1IHNwZWNpZnkgYW4gYWx0ZXJuYXRlCisgKiBNQUMgYWRkcmVzcyBmb3IgdGhlIGludGVyZmFjZS4KKyAqCisgKiBSZWdpc3RlcnMgNiB0aHJvdWdoIGFuZCBpbmNsdWRpbmcgOCBzcGVjaWZ5IHRoZSBNQUMgQ29udHJvbAorICogQWRkcmVzcywgd2hpY2ggbXVzdCBiZSB0aGUgcmVzZXJ2ZWQgbXVsdGljYXN0IGFkZHJlc3MgZm9yIE1BQworICogQ29udHJvbCBmcmFtZXMuCisgKgorICogRXhhbXBsZTogVG8gcHJvZ3JhbSBwcmltYXJ5IHN0YXRpb24gYWRkcmVzcyBhOmI6YzpkOmU6ZiBpbnRvCisgKgkgICAgdGhlIGNoaXAuCisgKgkJTUFDX0FkZHJlc3NfMiA9IChhIDw8IDgpIHwgYgorICoJCU1BQ19BZGRyZXNzXzEgPSAoYyA8PCA4KSB8IGQKKyAqCQlNQUNfQWRkcmVzc18wID0gKGUgPDwgOCkgfCBmCisgKi8KKworLyogQWRkcmVzcyBGaWx0ZXIgUmVnaXN0ZXJzLiAgUmVnaXN0ZXJzIDAgdGhyb3VnaCAyIHNwZWNpZnkgYml0CisgKiBmaWVsZHMgWzQ3OjMyXSB0aHJvdWdoIFsxNTowXSwgcmVzcGVjdGl2ZWx5LCBvZiB0aGUgYWRkcmVzcworICogZmlsdGVyLiAgVGhlIEFkZHJlc3MgRmlsdGVyIDImMSBNYXNrIFJlZ2lzdGVyIGRlbm90ZXMgdGhlIDgtYml0CisgKiBuaWJibGUgbWFzayBmb3IgQWRkcmVzcyBGaWx0ZXIgUmVnaXN0ZXJzIDIgYW5kIDEuICBUaGUgQWRkcmVzcworICogRmlsdGVyIDAgTWFzayBSZWdpc3RlciBkZW5vdGVzIHRoZSAxNi1iaXQgbWFzayBmb3IgdGhlIEFkZHJlc3MKKyAqIEZpbHRlciBSZWdpc3RlciAwLgorICovCisKKy8qIEhhc2ggVGFibGUgUmVnaXN0ZXJzLiAgUmVnaXN0ZXJzIDAgdGhyb3VnaCAxNSBzcGVjaWZ5IGJpdCBmaWVsZHMKKyAqIFsyNTU6MjQwXSB0aHJvdWdoIFsxNTowXSwgcmVzcGVjdGl2ZWx5LCBvZiB0aGUgaGFzaCB0YWJsZS4KKyAqLworCisvKiBTdGF0aXN0aWNzIFJlZ2lzdGVycy4gIEFsbCBvZiB0aGVzZSByZWdpc3RlcnMgYXJlIDE2LWJpdHMgYW5kCisgKiB0cmFjayBvY2N1cnJlbmNlcyBvZiBhIHNwZWNpZmljIGV2ZW50LiAgR0VNIGNhbiBiZSBjb25maWd1cmVkCisgKiB0byBpbnRlcnJ1cHQgdGhlIGhvc3QgY3B1IHdoZW4gYW55IG9mIHRoZXNlIGNvdW50ZXJzIG92ZXJmbG93LgorICogVGhleSBzaG91bGQgYWxsIGJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgdG8gemVybyB3aGVuIHRoZSBpbnRlcmZhY2UKKyAqIGlzIGJyb3VnaHQgdXAuCisgKi8KKworLyogUmFuZG9tIE51bWJlciBTZWVkIFJlZ2lzdGVyLiAgVGhpcyAxMC1iaXQgdmFsdWUgaXMgdXNlZCBhcyB0aGUKKyAqIFJORyBzZWVkIGluc2lkZSBHRU0gZm9yIHRoZSBDU01BL0NEIGJhY2tvZmYgYWxnb3JpdGhtLiAgSXQgaXMKKyAqIHJlY29tbWVuZGVkIHRvIHByb2dyYW0gdGhpcyByZWdpc3RlciB0byB0aGUgMTAgTFNCIG9mIHRoZQorICogaW50ZXJmYWNlcyBNQUMgYWRkcmVzcy4KKyAqLworCisvKiBQYXVzZSBUaW1lciwgcmVhZC1vbmx5LiAgVGhpcyAxNi1iaXQgdGltZXIgaXMgdXNlZCB0byB0aW1lIHRoZSBwYXVzZQorICogaW50ZXJ2YWwgYXMgaW5kaWNhdGVkIGJ5IGEgcmVjZWl2ZWQgcGF1c2UgZmxvdyBjb250cm9sIGZyYW1lLgorICogQSBub24temVybyB2YWx1ZSBpbiB0aGlzIHRpbWVyIGluZGljYXRlcyB0aGF0IHRoZSBNQUMgaXMgY3VycmVudGx5IGluCisgKiB0aGUgcGF1c2VkIHN0YXRlLgorICovCisKKy8qIE1JRiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUlGX0JCQ0xLCTB4NjIwMFVMCS8qIE1JRiBCaXQtQmFuZyBDbG9jawkJKi8KKyNkZWZpbmUgTUlGX0JCREFUQQkweDYyMDRVTAkvKiBNSUYgQml0LUJhbmQgRGF0YQkJKi8KKyNkZWZpbmUgTUlGX0JCT0VOQUIJMHg2MjA4VUwJLyogTUlGIEJpdC1CYW5nIE91dHB1dCBFbmFibGUJKi8KKyNkZWZpbmUgTUlGX0ZSQU1FCTB4NjIwQ1VMCS8qIE1JRiBGcmFtZS9PdXRwdXQgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUlGX0NGRwkJMHg2MjEwVUwJLyogTUlGIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJKi8KKyNkZWZpbmUgTUlGX01BU0sJMHg2MjE0VUwJLyogTUlGIE1hc2sgUmVnaXN0ZXIJCSovCisjZGVmaW5lIE1JRl9TVEFUVVMJMHg2MjE4VUwJLyogTUlGIFN0YXR1cyBSZWdpc3RlcgkJKi8KKyNkZWZpbmUgTUlGX1NNQUNISU5FCTB4NjIxQ1VMCS8qIE1JRiBTdGF0ZSBNYWNoaW5lIFJlZ2lzdGVyCSovCisKKy8qIE1JRiBCaXQtQmFuZyBDbG9jay4gIFRoaXMgMS1iaXQgcmVnaXN0ZXIgaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUKKyAqIE1EQyBjbG9jayB3YXZlZm9ybSBvbiB0aGUgTUlJIE1hbmFnZW1lbnQgSW50ZXJmYWNlIHdoZW4gdGhlIE1JRiBpcworICogcHJvZ3JhbW1lZCBpbiB0aGUgIkJpdC1CYW5nIiBtb2RlLiAgV3JpdGluZyBhICcxJyBhZnRlciBhICcwJyBpbnRvCisgKiB0aGlzIHJlZ2lzdGVyIHdpbGwgY3JlYXRlIGEgcmlzaW5nIGVkZ2Ugb24gdGhlIE1EQywgd2hpbGUgd3JpdGluZworICogYSAnMCcgYWZ0ZXIgYSAnMScgd2lsbCBjcmVhdGUgYSBmYWxsaW5nIGVkZ2UuICBGb3IgZXZlcnkgYml0IHRoYXQKKyAqIGlzIHRyYW5zZmVycmVkIG9uIHRoZSBtYW5hZ2VtZW50IGludGVyZmFjZSwgYm90aCBlZGdlcyBoYXZlIHRvIGJlCisgKiBnZW5lcmF0ZWQuCisgKi8KKworLyogTUlGIEJpdC1CYW5nIERhdGEuICBUaGlzIDEtYml0IHJlZ2lzdGVyIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlCisgKiBvdXRnb2luZyBkYXRhIChNRE8pIG9uIHRoZSBNSUkgTWFuYWdlbWVudCBJbnRlcmZhY2Ugd2hlbiB0aGUgTUlGCisgKiBpcyBwcm9ncmFtbWVkIGluIHRoZSAiQml0LUJhbmciIG1vZGUuICBUaGUgZGFhIHdpbGwgYmUgc3RlZXJlZCB0byB0aGUKKyAqIGFwcHJvcHJpYXRlIE1ESU8gYmFzZWQgb24gdGhlIHN0YXRlIG9mIHRoZSBQSFlfU2VsZWN0IGJpdCBpbiB0aGUgTUlGCisgKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLgorICovCisKKy8qIE1JRiBCaWctQmFuZCBPdXRwdXQgRW5hYmxlLiAgVEhpcyAxLWJpdCByZWdpc3RlciBpcyB1c2VkIHRvIGVuYWJsZQorICogKCcxJykgb3IgZGlzYWJsZSAoJzAnKSB0aGUgSS1kaXJlY3Rpb25hbCBkcml2ZXIgb24gdGhlIE1JSSB3aGVuIHRoZQorICogTUlGIGlzIHByb2dyYW1tZWQgaW4gdGhlICJCaXQtQmFuZyIgbW9kZS4gIFRoZSBNRElPIHNob3VsZCBiZSBlbmFibGVkCisgKiB3aGVuIGRhdGEgYml0cyBhcmUgdHJhbnNmZXJyZWQgZnJvbSB0aGUgTUlGIHRvIHRoZSB0cmFuc2NlaXZlciwgYW5kIGl0CisgKiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUgaW50ZXJmYWNlIGlzIGlkbGUgb3Igd2hlbiBkYXRhIGJpdHMgYXJlCisgKiB0cmFuc2ZlcnJlZCBmcm9tIHRoZSB0cmFuc2NlaXZlciB0byB0aGUgTUlGIChkYXRhIHBvcnRpb24gb2YgYSByZWFkCisgKiBpbnN0cnVjdGlvbikuICBPbmx5IG9uZSBNRElPIHdpbGwgYmUgZW5hYmxlZCBhdCBhIGdpdmVuIHRpbWUsIGRlcGVuZGluZworICogb24gdGhlIHN0YXRlIG9mIHRoZSBQSFlfU2VsZWN0IGJpdCBpbiB0aGUgTUlGIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuCisgKi8KKworLyogTUlGIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuICBUaGlzIDE1LWJpdCByZWdpc3RlciBjb250cm9scyB0aGUgb3BlcmF0aW9uCisgKiBvZiB0aGUgTUlGLgorICovCisjZGVmaW5lIE1JRl9DRkdfUFNFTEVDVAkweDAwMDAwMDAxCS8qIFhjdnIgc2xjdDogMD1tZGlvMCAxPW1kaW8xCSovCisjZGVmaW5lIE1JRl9DRkdfUE9MTAkweDAwMDAwMDAyCS8qIEVuYWJsZSBwb2xsaW5nIG1lY2hhbmlzbQkqLworI2RlZmluZSBNSUZfQ0ZHX0JCTU9ERQkweDAwMDAwMDA0CS8qIDE9Yml0LWJhbmcgMD1mcmFtZSBtb2RlCSovCisjZGVmaW5lIE1JRl9DRkdfUFJBRERSCTB4MDAwMDAwZjgJLyogWGN2ciBwb2xsIHJlZ2lzdGVyIGFkZHJlc3MJKi8KKyNkZWZpbmUgTUlGX0NGR19NREkwCTB4MDAwMDAxMDAJLyogTURJT18wIHByZXNlbnQgb3IgcmVhZC1iaXQJKi8KKyNkZWZpbmUgTUlGX0NGR19NREkxCTB4MDAwMDAyMDAJLyogTURJT18xIHByZXNlbnQgb3IgcmVhZC1iaXQJKi8KKyNkZWZpbmUgTUlGX0NGR19QUEFERFIJMHgwMDAwN2MwMAkvKiBYY3ZyIHBvbGwgUEhZIGFkZHJlc3MJKi8KKworLyogTUlGIEZyYW1lL091dHB1dCBSZWdpc3Rlci4gIFRoaXMgMzItYml0IHJlZ2lzdGVyIGFsbG93cyB0aGUgaG9zdCB0bworICogY29tbXVuaWNhdGUgd2l0aCBhIHRyYW5zY2VpdmVyIGluIGZyYW1lIG1vZGUgKGFzIG9wcG9zZWQgdG8gYmlnLWJhbmcKKyAqIG1vZGUpLiAgV3JpdGVzIGJ5IHRoZSBob3N0IHNwZWNpZnkgYW4gaW5zdHJ1dGlvbi4gIEFmdGVyIGJlaW5nIGlzc3VlZAorICogdGhlIGhvc3QgbXVzdCBwb2xsIHRoaXMgcmVnaXN0ZXIgZm9yIGNvbXBsZXRpb24uICBBbHNvLCBhZnRlcgorICogY29tcGxldGlvbiB0aGlzIHJlZ2lzdGVyIGhvbGRzIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSB0cmFuc2NlaXZlcgorICogaWYgYXBwbGljYWJsZS4KKyAqLworI2RlZmluZSBNSUZfRlJBTUVfU1QJMHhjMDAwMDAwMAkvKiBTVGFydCBvZiBmcmFtZQkJKi8KKyNkZWZpbmUgTUlGX0ZSQU1FX09QCTB4MzAwMDAwMDAJLyogT1Bjb2RlCQkJKi8KKyNkZWZpbmUgTUlGX0ZSQU1FX1BIWUFECTB4MGY4MDAwMDAJLyogUEhZIEFEZHJlc3MJCQkqLworI2RlZmluZSBNSUZfRlJBTUVfUkVHQUQJMHgwMDdjMDAwMAkvKiBSRUdpc3RlciBBRGRyZXNzCQkqLworI2RlZmluZSBNSUZfRlJBTUVfVEFNU0IJMHgwMDAyMDAwMAkvKiBUdXJuIEFyb3VuZCBNU0IJCSovCisjZGVmaW5lIE1JRl9GUkFNRV9UQUxTQgkweDAwMDEwMDAwCS8qIFR1cm4gQXJvdW5kIExTQgkJKi8KKyNkZWZpbmUgTUlGX0ZSQU1FX0RBVEEJMHgwMDAwZmZmZgkvKiBJbnN0cnVjdGlvbiBQYXlsb2FkCQkqLworCisvKiBNSUYgU3RhdHVzIFJlZ2lzdGVyLiAgVGhpcyByZWdpc3RlciByZXBvcnRzIHN0YXR1cyB3aGVuIHRoZSBNSUYgaXMKKyAqIG9wZXJhdGluZyBpbiB0aGUgcG9sbCBtb2RlLiAgVGhlIHBvbGwgc3RhdHVzIGZpZWxkIGlzIGF1dG8tY2xlYXJpbmcKKyAqIG9uIHJlYWQuCisgKi8KKyNkZWZpbmUgTUlGX1NUQVRVU19EQVRBCTB4ZmZmZjAwMDAJLyogTGl2ZSBpbWFnZSBvZiBYQ1ZSIHJlZwkqLworI2RlZmluZSBNSUZfU1RBVFVTX1NUQVQJMHgwMDAwZmZmZgkvKiBXaGljaCBiaXRzIGhhdmUgY2hhbmdlZAkqLworCisvKiBNSUYgTWFzayBSZWdpc3Rlci4gIFRoaXMgMTYtYml0IHJlZ2lzdGVyIGlzIHVzZWQgd2hlbiBpbiBwb2xsIG1vZGUKKyAqIHRvIHNheSB3aGljaCBiaXRzIG9mIHRoZSBwb2xsZWQgcmVnaXN0ZXIgd2lsbCBjYXVzZSBhbiBpbnRlcnJ1cHQKKyAqIHdoZW4gY2hhbmdlZC4KKyAqLworCisvKiBQQ1MvU2VyaWFsaW5rIFJlZ2lzdGVycyAqLworI2RlZmluZSBQQ1NfTUlJQ1RSTAkweDkwMDBVTAkvKiBQQ1MgTUlJIENvbnRyb2wgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUENTX01JSVNUQVQJMHg5MDA0VUwJLyogUENTIE1JSSBTdGF0dXMgUmVnaXN0ZXIJKi8KKyNkZWZpbmUgUENTX01JSUFEVgkweDkwMDhVTAkvKiBQQ1MgTUlJIEFkdmVydGlzZW1lbnQgUmVnCSovCisjZGVmaW5lIFBDU19NSUlMUAkweDkwMENVTAkvKiBQQ1MgTUlJIExpbmsgUGFydG5lciBBYmlsaXR5CSovCisjZGVmaW5lIFBDU19DRkcJCTB4OTAxMFVMCS8qIFBDUyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBDU19TTUFDSElORQkweDkwMTRVTAkvKiBQQ1MgU3RhdGUgTWFjaGluZSBSZWdpc3RlcgkqLworI2RlZmluZSBQQ1NfSVNUQVQJMHg5MDE4VUwJLyogUENTIEludGVycnVwdCBTdGF0dXMgUmVnCSovCisjZGVmaW5lIFBDU19ETU9ERQkweDkwNTBVTAkvKiBEYXRhcGF0aCBNb2RlIFJlZ2lzdGVyCSovCisjZGVmaW5lIFBDU19TQ1RSTAkweDkwNTRVTAkvKiBTZXJpYWxpbmsgQ29udHJvbCBSZWdpc3RlcgkqLworI2RlZmluZSBQQ1NfU09TCQkweDkwNThVTAkvKiBTaGFyZWQgT3V0cHV0IFNlbGVjdCBSZWcJKi8KKyNkZWZpbmUgUENTX1NTVEFURQkweDkwNUNVTAkvKiBTZXJpYWxpbmsgU3RhdGUgUmVnaXN0ZXIJKi8KKworLyogUENEIE1JSSBDb250cm9sIFJlZ2lzdGVyLiAqLworI2RlZmluZSBQQ1NfTUlJQ1RSTF9TUEQJMHgwMDAwMDA0MAkvKiBSZWFkIGFzIG9uZSwgd3JpdGVzIGlnbm9yZWQJKi8KKyNkZWZpbmUgUENTX01JSUNUUkxfQ1QJMHgwMDAwMDA4MAkvKiBGb3JjZSBDT0wgc2lnbmFsIGFjdGl2ZQkqLworI2RlZmluZSBQQ1NfTUlJQ1RSTF9ETQkweDAwMDAwMTAwCS8qIER1cGxleCBtb2RlLCBmb3JjZWQgbG93CSovCisjZGVmaW5lIFBDU19NSUlDVFJMX1JBTgkweDAwMDAwMjAwCS8qIFJlc3RhcnQgYXV0by1uZWcsIHNlbGYgY2xlYXIJKi8KKyNkZWZpbmUgUENTX01JSUNUUkxfSVNPCTB4MDAwMDA0MDAJLyogUmVhZCBhcyB6ZXJvLCB3cml0ZXMgaWdub3JlZAkqLworI2RlZmluZSBQQ1NfTUlJQ1RSTF9QRAkweDAwMDAwODAwCS8qIFJlYWQgYXMgemVybywgd3JpdGVzIGlnbm9yZWQJKi8KKyNkZWZpbmUgUENTX01JSUNUUkxfQU5FCTB4MDAwMDEwMDAJLyogQXV0by1uZWcgZW5hYmxlCQkqLworI2RlZmluZSBQQ1NfTUlJQ1RSTF9TUwkweDAwMDAyMDAwCS8qIFJlYWQgYXMgemVybywgd3JpdGVzIGlnbm9yZWQJKi8KKyNkZWZpbmUgUENTX01JSUNUUkxfV0IJMHgwMDAwNDAwMAkvKiBXcmFwYmFjaywgbG9vcGJhY2sgYXQgMTAtYml0CisJCQkJCSAqIGlucHV0IHNpZGUgb2YgU2VyaWFsaW5rCisJCQkJCSAqLworI2RlZmluZSBQQ1NfTUlJQ1RSTF9SU1QJMHgwMDAwODAwMAkvKiBSZXNldHMgUENTLCBzZWxmIGNsZWFyaW5nCSovCisKKy8qIFBDUyBNSUkgU3RhdHVzIFJlZ2lzdGVyLiAqLworI2RlZmluZSBQQ1NfTUlJU1RBVF9FQwkweDAwMDAwMDAxCS8qIEV4dCBDYXBhYmlsaXR5OiBSZWFkIGFzIHplcm8JKi8KKyNkZWZpbmUgUENTX01JSVNUQVRfSkQJMHgwMDAwMDAwMgkvKiBKYWJiZXIgRGV0ZWN0OiBSZWFkIGFzIHplcm8JKi8KKyNkZWZpbmUgUENTX01JSVNUQVRfTFMJMHgwMDAwMDAwNAkvKiBMaW5rIFN0YXR1czogMT11cCAwPWRvd24JKi8KKyNkZWZpbmUgUENTX01JSVNUQVRfQU5BCTB4MDAwMDAwMDgJLyogQXV0by1uZWcgQWJpbGl0eSwgYWx3YXlzIDEJKi8KKyNkZWZpbmUgUENTX01JSVNUQVRfUkYJMHgwMDAwMDAxMAkvKiBSZW1vdGUgRmF1bHQJCQkqLworI2RlZmluZSBQQ1NfTUlJU1RBVF9BTkMJMHgwMDAwMDAyMAkvKiBBdXRvLW5lZyBjb21wbGV0ZQkJKi8KKyNkZWZpbmUgUENTX01JSVNUQVRfRVMJMHgwMDAwMDEwMAkvKiBFeHRlbmRlZCBTdGF0dXMsIGFsd2F5cyAxCSovCisKKy8qIFBDUyBNSUkgQWR2ZXJ0aXNlbWVudCBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgUENTX01JSUFEVl9GRAkweDAwMDAwMDIwCS8qIEFkdmVydGlzZSBGdWxsIER1cGxleAkqLworI2RlZmluZSBQQ1NfTUlJQURWX0hECTB4MDAwMDAwNDAJLyogQWR2ZXJ0aXNlIEhhbGYgRHVwbGV4CSovCisjZGVmaW5lIFBDU19NSUlBRFZfU1AJMHgwMDAwMDA4MAkvKiBBZHZlcnRpc2UgU3ltbWV0cmljIFBhdXNlCSovCisjZGVmaW5lIFBDU19NSUlBRFZfQVAJMHgwMDAwMDEwMAkvKiBBZHZlcnRpc2UgQXN5bW1ldHJpYyBQYXVzZQkqLworI2RlZmluZSBQQ1NfTUlJQURWX1JGCTB4MDAwMDMwMDAJLyogUmVtb3RlIEZhdWx0CQkJKi8KKyNkZWZpbmUgUENTX01JSUFEVl9BQ0sJMHgwMDAwNDAwMAkvKiBSZWFkLW9ubHkJCQkqLworI2RlZmluZSBQQ1NfTUlJQURWX05QCTB4MDAwMDgwMDAJLyogTmV4dC1wYWdlLCBmb3JjZWQgbG93CSovCisKKy8qIFBDUyBNSUkgTGluayBQYXJ0bmVyIEFiaWxpdHkgUmVnaXN0ZXIuICAgVGhpcyByZWdpc3RlciBpcyBlcXVpdmFsZW50CisgKiB0byB0aGUgTGluayBQYXJ0bmV0IEFiaWxpdHkgUmVnaXN0ZXIgb2YgdGhlIHN0YW5kYXJkIE1JSSByZWdpc3RlciBzZXQuCisgKiBJdCdzIGxheW91dCBjb3JyZXNwb25kcyB0byB0aGUgUENTIE1JSSBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyLgorICovCisKKy8qIFBDUyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLiAqLworI2RlZmluZSBQQ1NfQ0ZHX0VOQUJMRQkweDAwMDAwMDAxCS8qIE11c3QgYmUgemVybyB3aGlsZSBjaGFuZ2luZworCQkJCQkgKiBQQ1MgTUlJIGFkdmVydGlzZW1lbnQgcmVnLgorCQkJCQkgKi8KKyNkZWZpbmUgUENTX0NGR19TRE8JMHgwMDAwMDAwMgkvKiBTaWduYWwgZGV0ZWN0IG92ZXJyaWRlCSovCisjZGVmaW5lIFBDU19DRkdfU0RMCTB4MDAwMDAwMDQJLyogU2lnbmFsIGRldGVjdCBhY3RpdmUgbG93CSovCisjZGVmaW5lIFBDU19DRkdfSlMJMHgwMDAwMDAxOAkvKiBKaXR0ZXItc3R1ZHk6CisJCQkJCSAqIDAgPSBub3JtYWwgb3BlcmF0aW9uCisJCQkJCSAqIDEgPSBoaWdoLWZyZXF1ZW5jeSB0ZXN0IHBhdHRlcm4KKwkJCQkJICogMiA9IGxvdy1mcmVxdWVuY3kgdGVzdCBwYXR0ZXJuCisJCQkJCSAqIDMgPSByZXNlcnZlZAorCQkJCQkgKi8KKyNkZWZpbmUgUENTX0NGR19UTwkweDAwMDAwMDIwCS8qIDEwbXMgYXV0by1uZWcgdGltZXIgb3ZlcnJpZGUJKi8KKworLyogUENTIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIuICBUaGlzIHJlZ2lzdGVyIGlzIHNlbGYtY2xlYXJpbmcKKyAqIHdoZW4gcmVhZC4KKyAqLworI2RlZmluZSBQQ1NfSVNUQVRfTFNDCTB4MDAwMDAwMDQJLyogTGluayBTdGF0dXMgQ2hhbmdlCQkqLworCisvKiBEYXRhcGF0aCBNb2RlIFJlZ2lzdGVyLiAqLworI2RlZmluZSBQQ1NfRE1PREVfU00JMHgwMDAwMDAwMQkvKiAxID0gdXNlIGludGVybmFsIFNlcmlhbGluawkqLworI2RlZmluZSBQQ1NfRE1PREVfRVNNCTB4MDAwMDAwMDIJLyogRXh0ZXJuYWwgU0VSREVTIG1vZGUJCSovCisjZGVmaW5lIFBDU19ETU9ERV9NR00JMHgwMDAwMDAwNAkvKiBNSUkvR01JSSBtb2RlCQkqLworI2RlZmluZSBQQ1NfRE1PREVfR01PRQkweDAwMDAwMDA4CS8qIEdNSUkgT3V0cHV0IEVuYWJsZQkJKi8KKworLyogU2VyaWFsaW5rIENvbnRyb2wgUmVnaXN0ZXIuCisgKgorICogTk9URTogV2hlbiBpbiBTRVJERVMgbW9kZSwgdGhlIGxvb3BiYWNrIGJpdCBoYXMgaW52ZXJzZSBsb2dpYy4KKyAqLworI2RlZmluZSBQQ1NfU0NUUkxfTE9PUAkweDAwMDAwMDAxCS8qIExvb3BiYWNrIGVuYWJsZQkJKi8KKyNkZWZpbmUgUENTX1NDVFJMX0VTQ0QJMHgwMDAwMDAwMgkvKiBFbmFibGUgc3luYyBjaGFyIGRldGVjdGlvbgkqLworI2RlZmluZSBQQ1NfU0NUUkxfTE9DSwkweDAwMDAwMDA0CS8qIExvY2sgdG8gcmVmZXJlbmNlIGNsb2NrCSovCisjZGVmaW5lIFBDU19TQ1RSTF9FTVAJMHgwMDAwMDAxOAkvKiBPdXRwdXQgZHJpdmVyIGVtcGhhc2lzCSovCisjZGVmaW5lIFBDU19TQ1RSTF9TVEVTVAkweDAwMDAwMWMwCS8qIFNlbGYgdGVzdCBwYXR0ZXJucwkJKi8KKyNkZWZpbmUgUENTX1NDVFJMX1BEV04JMHgwMDAwMDIwMAkvKiBTb2Z0d2FyZSBwb3dlci1kb3duCQkqLworI2RlZmluZSBQQ1NfU0NUUkxfUlhaCTB4MDAwMDBjMDAJLyogUExMIGlucHV0IHRvIFNlcmlhbGluawkqLworI2RlZmluZSBQQ1NfU0NUUkxfUlhQCTB4MDAwMDMwMDAJLyogUExMIGlucHV0IHRvIFNlcmlhbGluawkqLworI2RlZmluZSBQQ1NfU0NUUkxfVFhaCTB4MDAwMGMwMDAJLyogUExMIGlucHV0IHRvIFNlcmlhbGluawkqLworI2RlZmluZSBQQ1NfU0NUUkxfVFhQCTB4MDAwMzAwMDAJLyogUExMIGlucHV0IHRvIFNlcmlhbGluawkqLworCisvKiBTaGFyZWQgT3V0cHV0IFNlbGVjdCBSZWdpc3Rlci4gIEZvciB0ZXN0IGFuZCBkZWJ1ZywgYWxsb3dzIG11bHRpcGxleGluZworICogdGVzdCBvdXRwdXRzIGludG8gdGhlIFBST00gYWRkcmVzcyBwaW5zLiAgU2V0IHRvIHplcm8gZm9yIG5vcm1hbAorICogb3BlcmF0aW9uLgorICovCisjZGVmaW5lIFBDU19TT1NfUEFERFIJMHgwMDAwMDAwMwkvKiBQUk9NIEFkZHJlc3MJCQkqLworCisvKiBQUk9NIEltYWdlIFNwYWNlICovCisjZGVmaW5lIFBST01fU1RBUlQJMHgxMDAwMDBVTAkvKiBFeHBhbnNpb24gUk9NIHJ1biB0aW1lIGFjY2VzcyovCisjZGVmaW5lIFBST01fU0laRQkweDBmZmZmZlVMCS8qIFNpemUgb2YgUk9NCQkJKi8KKyNkZWZpbmUgUFJPTV9FTkQJMHgyMDAwMDBVTAkvKiBFbmQgb2YgUk9NCQkJKi8KKworLyogTUlJIGRlZmluaXRpb25zIG1pc3NpbmcgZnJvbSBtaWkuaCAqLworCisjZGVmaW5lIEJNQ1JfU1BEMgkweDAwNDAJCS8qIEdpZ2FiaXQgZW5hYmxlPyAoYmNtNTQxMSkJKi8KKyNkZWZpbmUgTFBBX1BBVVNFCTB4MDQwMAorCisvKiBNb3JlIFBIWSByZWdpc3RlcnMgKHNwZWNpZmljIHRvIEJyb2FkY29tIG1vZGVscykgKi8KKworLyogTUlJIEJDTTUyMDEgTVVMVElQSFkgaW50ZXJydXB0IHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9CQ001MjAxX0lOVEVSUlVQVAkJCTB4MUEKKyNkZWZpbmUgTUlJX0JDTTUyMDFfSU5URVJSVVBUX0lOVEVOQUJMRQkJMHg0MDAwCisKKyNkZWZpbmUgTUlJX0JDTTUyMDFfQVVYTU9ERTIJCQkweDFCCisjZGVmaW5lIE1JSV9CQ001MjAxX0FVWE1PREUyX0xPV1BPV0VSCQkweDAwMDgKKworI2RlZmluZSBNSUlfQkNNNTIwMV9NVUxUSVBIWSAgICAgICAgICAgICAgICAgICAgMHgxRQorCisvKiBNSUkgQkNNNTIwMSBNVUxUSVBIWSByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIE1JSV9CQ001MjAxX01VTFRJUEhZX1NFUklBTE1PREUgICAgICAgICAweDAwMDIKKyNkZWZpbmUgTUlJX0JDTTUyMDFfTVVMVElQSFlfU1VQRVJJU09MQVRFICAgICAgIDB4MDAwOAorCisvKiBNSUkgQkNNNTQwMCAxMDAwLUJBU0VUIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0JDTTU0MDBfR0JfQ09OVFJPTAkJCTB4MDkKKyNkZWZpbmUgTUlJX0JDTTU0MDBfR0JfQ09OVFJPTF9GVUxMRFVQTEVYQ0FQCTB4MDIwMAorCisvKiBNSUkgQkNNNTQwMCBBVVhDT05UUk9MIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9CQ001NDAwX0FVWENPTlRST0wgICAgICAgICAgICAgICAgICAweDE4CisjZGVmaW5lIE1JSV9CQ001NDAwX0FVWENPTlRST0xfUFdSMTBCQVNFVCAgICAgICAweDAwMDQKKworLyogTUlJIEJDTTU0MDAgQVVYU1RBVFVTIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9CQ001NDAwX0FVWFNUQVRVUyAgICAgICAgICAgICAgICAgICAweDE5CisjZGVmaW5lIE1JSV9CQ001NDAwX0FVWFNUQVRVU19MSU5LTU9ERV9NQVNLICAgICAweDA3MDAKKyNkZWZpbmUgTUlJX0JDTTU0MDBfQVVYU1RBVFVTX0xJTktNT0RFX1NISUZUICAgIDggIAorCisvKiBXaGVuIGl0IGNhbiwgR0VNIGludGVybmFsbHkgY2FjaGVzIDQgYWxpZ25lZCBUWCBkZXNjcmlwdG9ycworICogYXQgYSB0aW1lLCBzbyB0aGF0IGl0IGNhbiB1c2UgZnVsbCBjYWNoZWxpbmUgRE1BIHJlYWRzLgorICoKKyAqIE5vdGUgdGhhdCB1bmxpa2UgSE1FLCB0aGVyZSBpcyBubyBvd25lcnNoaXAgYml0IGluIHRoZSBkZXNjcmlwdG9yCisgKiBjb250cm9sIHdvcmQuICBUaGUgc2FtZSBmdW5jdGlvbmFsaXR5IGlzIG9idGFpbmVkIHZpYSB0aGUgVFgtS2ljaworICogYW5kIFRYLUNvbXBsZXRlIHJlZ2lzdGVycy4gIEFzIGEgcmVzdWx0LCBHRU0gbmVlZCBub3Qgd3JpdGUgYmFjaworICogdXBkYXRlZCB2YWx1ZXMgdG8gdGhlIFRYIGRlc2NyaXB0b3IgcmluZywgaXQgb25seSBwZXJmb3JtcyByZWFkcy4KKyAqCisgKiBTaW5jZSBUWCBkZXNjcmlwdG9ycyBhcmUgbmV2ZXIgbW9kaWZpZWQgYnkgR0VNLCB0aGUgZHJpdmVyIGNhbgorICogdXNlIHRoZSBidWZmZXIgRE1BIGFkZHJlc3MgYXMgYSBwbGFjZSB0byBrZWVwIHRyYWNrIG9mIGFsbG9jYXRlZAorICogRE1BIG1hcHBpbmdzIGZvciBhIHRyYW5zbWl0dGVkIHBhY2tldC4KKyAqLworc3RydWN0IGdlbV90eGQgeworCXU2NAljb250cm9sX3dvcmQ7CisJdTY0CWJ1ZmZlcjsKK307CisKKyNkZWZpbmUgVFhEQ1RSTF9CVUZTWgkweDAwMDAwMDAwMDAwMDdmZmZVTEwJLyogQnVmZmVyIFNpemUJCSovCisjZGVmaW5lIFRYRENUUkxfQ1NUQVJUCTB4MDAwMDAwMDAwMDFmODAwMFVMTAkvKiBDU1VNIFN0YXJ0IE9mZnNldAkqLworI2RlZmluZSBUWERDVFJMX0NPRkYJMHgwMDAwMDAwMDFmZTAwMDAwVUxMCS8qIENTVU0gU3R1ZmYgT2Zmc2V0CSovCisjZGVmaW5lIFRYRENUUkxfQ0VOQUIJMHgwMDAwMDAwMDIwMDAwMDAwVUxMCS8qIENTVU0gRW5hYmxlCQkqLworI2RlZmluZSBUWERDVFJMX0VPRgkweDAwMDAwMDAwNDAwMDAwMDBVTEwJLyogRW5kIG9mIEZyYW1lCQkqLworI2RlZmluZSBUWERDVFJMX1NPRgkweDAwMDAwMDAwODAwMDAwMDBVTEwJLyogU3RhcnQgb2YgRnJhbWUJKi8KKyNkZWZpbmUgVFhEQ1RSTF9JTlRNRQkweDAwMDAwMDAxMDAwMDAwMDBVTEwJLyogIkludGVycnVwdCBNZSIJKi8KKyNkZWZpbmUgVFhEQ1RSTF9OT0NSQwkweDAwMDAwMDAyMDAwMDAwMDBVTEwJLyogTm8gQ1JDIFByZXNlbnQJKi8KKworLyogR0VNIHJlcXVpcmVzIHRoYXQgUlggZGVzY3JpcHRvcnMgYXJlIHByb3ZpZGVkIGZvdXIgYXQgYSB0aW1lLAorICogYWxpZ25lZC4gIEFsc28sIHRoZSBSWCByaW5nIG1heSBub3Qgd3JhcCBhcm91bmQuICBUaGlzIG1lYW5zIHRoYXQKKyAqIHRoZXJlIHdpbGwgYmUgYXQgbGVhc3QgNCB1bnVzZWQgZGVzY2lwdG9yIGVudHJpZXMgaW4gdGhlIG1pZGRsZQorICogb2YgdGhlIFJYIHJpbmcgYXQgYWxsIHRpbWVzLgorICoKKyAqIFNpbWlsYXIgdG8gSE1FLCBHRU0gYXNzdW1lcyB0aGF0IGl0IGNhbiB3cml0ZSBnYXJiYWdlIGJ5dGVzIGJlZm9yZQorICogdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIGFuZCByaWdodCBhZnRlciB0aGUgZW5kIGluIG9yZGVyIHRvIERNQQorICogd2hvbGUgY2FjaGVsaW5lcy4KKyAqCisgKiBVbmxpa2UgZm9yIFRYLCBHRU0gZG9lcyB1cGRhdGUgdGhlIHN0YXR1cyB3b3JkIGluIHRoZSBSWCBkZXNjcmlwdG9ycworICogd2hlbiBwYWNrZXRzIGFycml2ZS4gIFRoZXJlZm9yZSBhbiBvd25lcnNoaXAgYml0IGRvZXMgZXhpc3QgaW4gdGhlCisgKiBSWCBkZXNjcmlwdG9ycy4gIEl0IGlzIGFkdmlzb3J5LCBHRU0gY2xlYXJzIGl0IGJ1dCBkb2VzIG5vdCBjaGVjaworICogaXQgaW4gYW55IHdheS4gIFNvIHdoZW4gYnVmZmVycyBhcmUgcG9zdGVkIHRvIHRoZSBSWCByaW5nICh2aWEgdGhlCisgKiBSWCBLaWNrIHJlZ2lzdGVyKSBieSB0aGUgZHJpdmVyIGl0IG11c3QgbWFrZSBzdXJlIHRoZSBidWZmZXJzIGFyZQorICogdHJ1bHkgcmVhZHkgYW5kIHRoYXQgdGhlIG93bmVyc2hpcCBiaXRzIGFyZSBzZXQgcHJvcGVybHkuCisgKgorICogRXZlbiB0aG91Z2ggR0VNIG1vZGlmaWVzIHRoZSBSWCBkZXNjcmlwdG9ycywgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZQorICogYnVmZmVyIERNQSBhZGRyZXNzIGZpZWxkIHdpbGwgc3RheSB0aGUgc2FtZSB3aGVuIGl0IHBlcmZvcm1zIHRoZXNlCisgKiB1cGRhdGVzLiAgVGhlcmVmb3JlIGl0IGNhbiBiZSB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgRE1BIG1hcHBpbmdzCisgKiBieSB0aGUgaG9zdCBkcml2ZXIganVzdCBhcyBpbiB0aGUgVFggZGVzY3JpcHRvciBjYXNlIGFib3ZlLgorICovCitzdHJ1Y3QgZ2VtX3J4ZCB7CisJdTY0CXN0YXR1c193b3JkOworCXU2NAlidWZmZXI7Cit9OworCisjZGVmaW5lIFJYRENUUkxfVENQQ1NVTQkweDAwMDAwMDAwMDAwMGZmZmZVTEwJLyogVENQIFBzZXVkby1DU1VNCSovCisjZGVmaW5lIFJYRENUUkxfQlVGU1oJMHgwMDAwMDAwMDdmZmYwMDAwVUxMCS8qIEJ1ZmZlciBTaXplCQkqLworI2RlZmluZSBSWERDVFJMX09XTgkweDAwMDAwMDAwODAwMDAwMDBVTEwJLyogR0VNIG93bnMgdGhpcyBlbnRyeQkqLworI2RlZmluZSBSWERDVFJMX0hBU0hWQUwJMHgwZmZmZjAwMDAwMDAwMDAwVUxMCS8qIEhhc2ggVmFsdWUJCSovCisjZGVmaW5lIFJYRENUUkxfSFBBU1MJMHgxMDAwMDAwMDAwMDAwMDAwVUxMCS8qIFBhc3NlZCBIYXNoIEZpbHRlcgkqLworI2RlZmluZSBSWERDVFJMX0FMVE1BQwkweDIwMDAwMDAwMDAwMDAwMDBVTEwJLyogTWF0Y2hlZCBBTFQgTUFDCSovCisjZGVmaW5lIFJYRENUUkxfQkFECTB4NDAwMDAwMDAwMDAwMDAwMFVMTAkvKiBGcmFtZSBoYXMgYmFkIENSQwkqLworCisjZGVmaW5lIFJYRENUUkxfRlJFU0goZ3ApCVwKKwkoKCgoUlhfQlVGX0FMTE9DX1NJWkUoZ3ApIC0gUlhfT0ZGU0VUKSA8PCAxNikgJiBSWERDVFJMX0JVRlNaKSB8IFwKKwkgUlhEQ1RSTF9PV04pCisKKyNkZWZpbmUgVFhfUklOR19TSVpFIDEyOAorI2RlZmluZSBSWF9SSU5HX1NJWkUgMTI4CisKKyNpZiBUWF9SSU5HX1NJWkUgPT0gMzIKKyNkZWZpbmUgVFhETUFfQ0ZHX0JBU0UJVFhETUFfQ0ZHX1JJTkdTWl8zMgorI2VsaWYgVFhfUklOR19TSVpFID09IDY0CisjZGVmaW5lIFRYRE1BX0NGR19CQVNFCVRYRE1BX0NGR19SSU5HU1pfNjQKKyNlbGlmIFRYX1JJTkdfU0laRSA9PSAxMjgKKyNkZWZpbmUgVFhETUFfQ0ZHX0JBU0UJVFhETUFfQ0ZHX1JJTkdTWl8xMjgKKyNlbGlmIFRYX1JJTkdfU0laRSA9PSAyNTYKKyNkZWZpbmUgVFhETUFfQ0ZHX0JBU0UJVFhETUFfQ0ZHX1JJTkdTWl8yNTYKKyNlbGlmIFRYX1JJTkdfU0laRSA9PSA1MTIKKyNkZWZpbmUgVFhETUFfQ0ZHX0JBU0UJVFhETUFfQ0ZHX1JJTkdTWl81MTIKKyNlbGlmIFRYX1JJTkdfU0laRSA9PSAxMDI0CisjZGVmaW5lIFRYRE1BX0NGR19CQVNFCVRYRE1BX0NGR19SSU5HU1pfMUsKKyNlbGlmIFRYX1JJTkdfU0laRSA9PSAyMDQ4CisjZGVmaW5lIFRYRE1BX0NGR19CQVNFCVRYRE1BX0NGR19SSU5HU1pfMksKKyNlbGlmIFRYX1JJTkdfU0laRSA9PSA0MDk2CisjZGVmaW5lIFRYRE1BX0NGR19CQVNFCVRYRE1BX0NGR19SSU5HU1pfNEsKKyNlbGlmIFRYX1JJTkdfU0laRSA9PSA4MTkyCisjZGVmaW5lIFRYRE1BX0NGR19CQVNFCVRYRE1BX0NGR19SSU5HU1pfOEsKKyNlbHNlCisjZXJyb3IgVFhfUklOR19TSVpFIHZhbHVlIGlzIGlsbGVnYWwuLi4KKyNlbmRpZgorCisjaWYgUlhfUklOR19TSVpFID09IDMyCisjZGVmaW5lIFJYRE1BX0NGR19CQVNFCVJYRE1BX0NGR19SSU5HU1pfMzIKKyNlbGlmIFJYX1JJTkdfU0laRSA9PSA2NAorI2RlZmluZSBSWERNQV9DRkdfQkFTRQlSWERNQV9DRkdfUklOR1NaXzY0CisjZWxpZiBSWF9SSU5HX1NJWkUgPT0gMTI4CisjZGVmaW5lIFJYRE1BX0NGR19CQVNFCVJYRE1BX0NGR19SSU5HU1pfMTI4CisjZWxpZiBSWF9SSU5HX1NJWkUgPT0gMjU2CisjZGVmaW5lIFJYRE1BX0NGR19CQVNFCVJYRE1BX0NGR19SSU5HU1pfMjU2CisjZWxpZiBSWF9SSU5HX1NJWkUgPT0gNTEyCisjZGVmaW5lIFJYRE1BX0NGR19CQVNFCVJYRE1BX0NGR19SSU5HU1pfNTEyCisjZWxpZiBSWF9SSU5HX1NJWkUgPT0gMTAyNAorI2RlZmluZSBSWERNQV9DRkdfQkFTRQlSWERNQV9DRkdfUklOR1NaXzFLCisjZWxpZiBSWF9SSU5HX1NJWkUgPT0gMjA0OAorI2RlZmluZSBSWERNQV9DRkdfQkFTRQlSWERNQV9DRkdfUklOR1NaXzJLCisjZWxpZiBSWF9SSU5HX1NJWkUgPT0gNDA5NgorI2RlZmluZSBSWERNQV9DRkdfQkFTRQlSWERNQV9DRkdfUklOR1NaXzRLCisjZWxpZiBSWF9SSU5HX1NJWkUgPT0gODE5MgorI2RlZmluZSBSWERNQV9DRkdfQkFTRQlSWERNQV9DRkdfUklOR1NaXzhLCisjZWxzZQorI2Vycm9yIFJYX1JJTkdfU0laRSBpcyBpbGxlZ2FsLi4uCisjZW5kaWYKKworI2RlZmluZSBORVhUX1RYKE4pCSgoKE4pICsgMSkgJiAoVFhfUklOR19TSVpFIC0gMSkpCisjZGVmaW5lIE5FWFRfUlgoTikJKCgoTikgKyAxKSAmIChSWF9SSU5HX1NJWkUgLSAxKSkKKworI2RlZmluZSBUWF9CVUZGU19BVkFJTChHUCkJCQkJCVwKKwkoKChHUCktPnR4X29sZCA8PSAoR1ApLT50eF9uZXcpID8JCQlcCisJICAoR1ApLT50eF9vbGQgKyAoVFhfUklOR19TSVpFIC0gMSkgLSAoR1ApLT50eF9uZXcgOglcCisJICAoR1ApLT50eF9vbGQgLSAoR1ApLT50eF9uZXcgLSAxKQorCisjZGVmaW5lIFJYX09GRlNFVCAgICAgICAgICAyCisjZGVmaW5lIFJYX0JVRl9BTExPQ19TSVpFKGdwKQkoKGdwKS0+cnhfYnVmX3N6ICsgMjggKyBSWF9PRkZTRVQgKyA2NCkKKworI2RlZmluZSBSWF9DT1BZX1RIUkVTSE9MRCAgMjU2CisKKyNpZiBUWF9SSU5HX1NJWkUgPCAxMjgKKyNkZWZpbmUgSU5JVF9CTE9DS19UWF9SSU5HX1NJWkUJCTEyOAorI2Vsc2UKKyNkZWZpbmUgSU5JVF9CTE9DS19UWF9SSU5HX1NJWkUJCVRYX1JJTkdfU0laRQorI2VuZGlmCisKKyNpZiBSWF9SSU5HX1NJWkUgPCAxMjgKKyNkZWZpbmUgSU5JVF9CTE9DS19SWF9SSU5HX1NJWkUJCTEyOAorI2Vsc2UKKyNkZWZpbmUgSU5JVF9CTE9DS19SWF9SSU5HX1NJWkUJCVJYX1JJTkdfU0laRQorI2VuZGlmCisKK3N0cnVjdCBnZW1faW5pdF9ibG9jayB7CisJc3RydWN0IGdlbV90eGQJdHhkW0lOSVRfQkxPQ0tfVFhfUklOR19TSVpFXTsKKwlzdHJ1Y3QgZ2VtX3J4ZAlyeGRbSU5JVF9CTE9DS19SWF9SSU5HX1NJWkVdOworfTsKKworZW51bSBnZW1fcGh5X3R5cGUgeworCXBoeV9taWlfbWRpbzAsCisJcGh5X21paV9tZGlvMSwKKwlwaHlfc2VyaWFsaW5rLAorCXBoeV9zZXJkZXMsCit9OworCitlbnVtIGxpbmtfc3RhdGUgeworCWxpbmtfZG93biA9IDAsCS8qIE5vIGxpbmssIHdpbGwgcmV0cnkgKi8KKwlsaW5rX2FuZWcsCS8qIEF1dG9uZWcgaW4gcHJvZ3Jlc3MgKi8KKwlsaW5rX2ZvcmNlX3RyeSwJLyogVHJ5IEZvcmNlZCBsaW5rIHNwZWVkICovCisJbGlua19mb3JjZV9yZXQsCS8qIEZvcmNlZCBtb2RlIHdvcmtlZCwgcmV0cnlpbmcgYXV0b25lZyAqLworCWxpbmtfZm9yY2Vfb2ssCS8qIFN0YXkgaW4gZm9yY2VkIG1vZGUgKi8KKwlsaW5rX3VwCQkvKiBMaW5rIGlzIHVwICovCit9OworCitzdHJ1Y3QgZ2VtIHsKKwlzcGlubG9ja190CQlsb2NrOworCXNwaW5sb2NrX3QJCXR4X2xvY2s7CisJdm9pZCBfX2lvbWVtCQkqcmVnczsKKwlpbnQJCQlyeF9uZXcsIHJ4X29sZDsKKwlpbnQJCQl0eF9uZXcsIHR4X29sZDsKKworCXVuc2lnbmVkIGludCBoYXNfd29sIDogMTsJLyogY2hpcCBzdXBwb3J0cyB3YWtlLW9uLWxhbiAqLworCXVuc2lnbmVkIGludCBhc2xlZXAgOiAxOwkvKiBjaGlwIGFzbGVlcCwgcHJvdGVjdGVkIGJ5IHBtX3NlbSAqLworCXVuc2lnbmVkIGludCBhc2xlZXBfd29sIDogMTsJLyogd2FzIGFzbGVlcCB3aXRoIFdPTCBlbmFibGVkICovCisJdW5zaWduZWQgaW50IG9wZW5lZCA6IDE7CS8qIGRyaXZlciBvcGVuZWQsIHByb3RlY3RlZCBieSBwbV9zZW0gKi8KKwl1bnNpZ25lZCBpbnQgcnVubmluZyA6IDE7CS8qIGNoaXAgcnVubmluZywgcHJvdGVjdGVkIGJ5IGxvY2sgKi8KKwkKKwkvKiBjZWxsIGVuYWJsZSBjb3VudCwgcHJvdGVjdGVkIGJ5IGxvY2sgKi8KKwlpbnQJCQljZWxsX2VuYWJsZWQ7ICAKKwkKKwlzdHJ1Y3Qgc2VtYXBob3JlCXBtX3NlbTsKKworCXUzMgkJCW1zZ19lbmFibGU7CisJdTMyCQkJc3RhdHVzOworCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgbmV0X3N0YXRzOworCisJaW50CQkJdHhfZmlmb19zejsKKwlpbnQJCQlyeF9maWZvX3N6OworCWludAkJCXJ4X3BhdXNlX29mZjsKKwlpbnQJCQlyeF9wYXVzZV9vbjsKKwlpbnQJCQlyeF9idWZfc3o7CisJdTY0CQkJcGF1c2VfZW50ZXJlZDsKKwl1MTYJCQlwYXVzZV9sYXN0X3RpbWVfcmVjdmQ7CisJdTMyCQkJbWFjX3J4X2NmZzsKKwl1MzIJCQlzd3JzdF9iYXNlOworCisJaW50CQkJd2FudF9hdXRvbmVnOworCWludAkJCWxhc3RfZm9yY2VkX3NwZWVkOworCWVudW0gbGlua19zdGF0ZQkJbHN0YXRlOworCXN0cnVjdCB0aW1lcl9saXN0CWxpbmtfdGltZXI7CisJaW50CQkJdGltZXJfdGlja3M7CisJaW50CQkJd2FrZV9vbl9sYW47CisJc3RydWN0IHdvcmtfc3RydWN0CXJlc2V0X3Rhc2s7CisJdm9sYXRpbGUgaW50CQlyZXNldF90YXNrX3BlbmRpbmc7CisKKwllbnVtIGdlbV9waHlfdHlwZQlwaHlfdHlwZTsKKwlzdHJ1Y3QgbWlpX3BoeQkJcGh5X21paTsKKwlpbnQJCQltaWlfcGh5X2FkZHI7CisJCQorCXN0cnVjdCBnZW1faW5pdF9ibG9jawkqaW5pdF9ibG9jazsKKwlzdHJ1Y3Qgc2tfYnVmZgkJKnJ4X3NrYnNbUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3Qgc2tfYnVmZgkJKnR4X3NrYnNbUlhfUklOR19TSVpFXTsKKwlkbWFfYWRkcl90CQlnYmxvY2tfZHZtYTsKKworCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OworI2lmZGVmIENPTkZJR19QUENfUE1BQworCXN0cnVjdCBkZXZpY2Vfbm9kZQkqb2Zfbm9kZTsKKyNlbmRpZgorfTsKKworI2RlZmluZSBmb3VuZF9taWlfcGh5KGdwKSAoKGdwLT5waHlfdHlwZSA9PSBwaHlfbWlpX21kaW8wIHx8IGdwLT5waHlfdHlwZSA9PSBwaHlfbWlpX21kaW8xKSBcCisJCQkJJiYgZ3AtPnBoeV9taWkuZGVmICYmIGdwLT5waHlfbWlpLmRlZi0+b3BzKQorCQkJCisjZGVmaW5lIEFMSUdORURfUlhfU0tCX0FERFIoYWRkcikgXAorICAgICAgICAoKCgodW5zaWduZWQgbG9uZykoYWRkcikgKyAoNjRVTCAtIDFVTCkpICYgfig2NFVMIC0gMVVMKSkgLSAodW5zaWduZWQgbG9uZykoYWRkcikpCitzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3Qgc2tfYnVmZiAqZ2VtX2FsbG9jX3NrYihpbnQgc2l6ZSwgaW50IGdmcF9mbGFncykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYWxsb2Nfc2tiKHNpemUgKyA2NCwgZ2ZwX2ZsYWdzKTsKKworCWlmIChza2IpIHsKKwkJaW50IG9mZnNldCA9IChpbnQpIEFMSUdORURfUlhfU0tCX0FERFIoc2tiLT5kYXRhKTsKKwkJaWYgKG9mZnNldCkKKwkJCXNrYl9yZXNlcnZlKHNrYiwgb2Zmc2V0KTsKKwl9CisKKwlyZXR1cm4gc2tiOworfQorCisjZW5kaWYgLyogX1NVTkdFTV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5nZW1fcGh5LmMgYi9kcml2ZXJzL25ldC9zdW5nZW1fcGh5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjYTQxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3N1bmdlbV9waHkuYwpAQCAtMCwwICsxLDg3MiBAQAorLyoKKyAqIFBIWSBkcml2ZXJzIGZvciB0aGUgc3VuZ2VtIGV0aGVybmV0IGRyaXZlci4KKyAqIAorICogVGhpcyBmaWxlIGNvdWxkIGJlIHNoYXJlZCB3aXRoIG90aGVyIGRyaXZlcnMuCisgKiAKKyAqIChjKSAyMDAyLCBCZW5qYW1pbiBIZXJyZW5zY21pZHQgKGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZykKKyAqCisgKiBUT0RPOgorICogIC0gSW1wbGVtZW50IFdPTAorICogIC0gQWRkIHN1cHBvcnQgZm9yIFBIWXMgdGhhdCBwcm92aWRlIGFuIElSUSBsaW5lCisgKiAgLSBFdmVudHVhbGx5IG1vdmVkIHRoZSBlbnRpcmUgcG9sbGluZyBzdGF0ZSBtYWNoaW5lIGluCisgKiAgICB0aGVyZSAob3V0IG9mIHRoZSBldGggZHJpdmVyKSwgc28gdGhhdCBpdCBjYW4gZWFzaWx5IGJlCisgKiAgICBza2lwcGVkIG9uIFBIWXMgdGhhdCBpbXBsZW1lbnQgaXQgaW4gaGFyZHdhcmUuCisgKiAgLSBPbiBMWFQ5NzEgJiBCQ001MjAxLCBBcHBsZSB1c2VzIHNvbWUgY2hpcCBzcGVjaWZpYyByZWdzCisgKiAgICB0byByZWFkIHRoZSBsaW5rIHN0YXR1cy4gRmlndXJlIG91dCB3aHkgYW5kIGlmIGl0IG1ha2VzCisgKiAgICBzZW5zZSB0byBkbyB0aGUgc2FtZSAobWFnaWMgYW5lZyA/KQorICogIC0gQXBwbGUgaGFzIHNvbWUgYWRkaXRpb25hbCBwb3dlciBtYW5hZ2VtZW50IGNvZGUgZm9yIHNvbWUKKyAqICAgIEJyb2FkY29tIFBIWXMgdGhhdCB0aGV5ICJoaWRlIiBmcm9tIHRoZSBPcGVuU291cmNlIHZlcnNpb24KKyAqICAgIG9mIGRhcndpbiwgc3RpbGwgbmVlZCB0byByZXZlcnNlIGVuZ2luZWVyIHRoYXQKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAic3VuZ2VtX3BoeS5oIgorCisvKiBMaW5rIG1vZGVzIG9mIHRoZSBCQ001NDAwIFBIWSAqLworc3RhdGljIGludCBwaHlfQkNNNTQwMF9saW5rX3RhYmxlWzhdWzNdID0geworCXsgMCwgMCwgMCB9LAkvKiBObyBsaW5rICovCisJeyAwLCAwLCAwIH0sCS8qIDEwQlQgSGFsZiBEdXBsZXggKi8KKwl7IDEsIDAsIDAgfSwJLyogMTBCVCBGdWxsIER1cGxleCAqLworCXsgMCwgMSwgMCB9LAkvKiAxMDBCVCBIYWxmIER1cGxleCAqLworCXsgMCwgMSwgMCB9LAkvKiAxMDBCVCBIYWxmIER1cGxleCAqLworCXsgMSwgMSwgMCB9LAkvKiAxMDBCVCBGdWxsIER1cGxleCovCisJeyAxLCAwLCAxIH0sCS8qIDEwMDBCVCAqLworCXsgMSwgMCwgMSB9LAkvKiAxMDAwQlQgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fcGh5X3JlYWQoc3RydWN0IG1paV9waHkqIHBoeSwgaW50IGlkLCBpbnQgcmVnKQoreworCXJldHVybiBwaHktPm1kaW9fcmVhZChwaHktPmRldiwgaWQsIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3BoeV93cml0ZShzdHJ1Y3QgbWlpX3BoeSogcGh5LCBpbnQgaWQsIGludCByZWcsIGludCB2YWwpCit7CisJcGh5LT5tZGlvX3dyaXRlKHBoeS0+ZGV2LCBpZCwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwaHlfcmVhZChzdHJ1Y3QgbWlpX3BoeSogcGh5LCBpbnQgcmVnKQoreworCXJldHVybiBwaHktPm1kaW9fcmVhZChwaHktPmRldiwgcGh5LT5taWlfaWQsIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwaHlfd3JpdGUoc3RydWN0IG1paV9waHkqIHBoeSwgaW50IHJlZywgaW50IHZhbCkKK3sKKwlwaHktPm1kaW9fd3JpdGUocGh5LT5kZXYsIHBoeS0+bWlpX2lkLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgcmVzZXRfb25lX21paV9waHkoc3RydWN0IG1paV9waHkqIHBoeSwgaW50IHBoeV9pZCkKK3sKKwl1MTYgdmFsOworCWludCBsaW1pdCA9IDEwMDAwOworCQorCXZhbCA9IF9fcGh5X3JlYWQocGh5LCBwaHlfaWQsIE1JSV9CTUNSKTsKKwl2YWwgJj0gfihCTUNSX0lTT0xBVEUgfCBCTUNSX1BET1dOKTsKKwl2YWwgfD0gQk1DUl9SRVNFVDsKKwlfX3BoeV93cml0ZShwaHksIHBoeV9pZCwgTUlJX0JNQ1IsIHZhbCk7CisKKwl1ZGVsYXkoMTAwKTsKKworCXdoaWxlIChsaW1pdC0tKSB7CisJCXZhbCA9IF9fcGh5X3JlYWQocGh5LCBwaHlfaWQsIE1JSV9CTUNSKTsKKwkJaWYgKCh2YWwgJiBCTUNSX1JFU0VUKSA9PSAwKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCWlmICgodmFsICYgQk1DUl9JU09MQVRFKSAmJiBsaW1pdCA+IDApCisJCV9fcGh5X3dyaXRlKHBoeSwgcGh5X2lkLCBNSUlfQk1DUiwgdmFsICYgfkJNQ1JfSVNPTEFURSk7CisJCisJcmV0dXJuIChsaW1pdCA8PSAwKTsKK30KKworc3RhdGljIGludCBiY201MjAxX2luaXQoc3RydWN0IG1paV9waHkqIHBoeSkKK3sKKwl1MTYgZGF0YTsKKworCWRhdGEgPSBwaHlfcmVhZChwaHksIE1JSV9CQ001MjAxX01VTFRJUEhZKTsKKwlkYXRhICY9IH5NSUlfQkNNNTIwMV9NVUxUSVBIWV9TVVBFUklTT0xBVEU7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0JDTTUyMDFfTVVMVElQSFksIGRhdGEpOworCisJcGh5X3dyaXRlKHBoeSwgTUlJX0JDTTUyMDFfSU5URVJSVVBULCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTUyMDFfc3VzcGVuZChzdHJ1Y3QgbWlpX3BoeSogcGh5KQoreworCXBoeV93cml0ZShwaHksIE1JSV9CQ001MjAxX0lOVEVSUlVQVCwgMCk7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0JDTTUyMDFfTVVMVElQSFksIE1JSV9CQ001MjAxX01VTFRJUEhZX1NVUEVSSVNPTEFURSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY201MjIxX2luaXQoc3RydWN0IG1paV9waHkqIHBoeSkKK3sKKwl1MTYgZGF0YTsKKworCWRhdGEgPSBwaHlfcmVhZChwaHksIE1JSV9CQ001MjIxX1RFU1QpOworCXBoeV93cml0ZShwaHksIE1JSV9CQ001MjIxX1RFU1QsCisJCWRhdGEgfCBNSUlfQkNNNTIyMV9URVNUX0VOQUJMRV9TSEFET1dTKTsKKworCWRhdGEgPSBwaHlfcmVhZChwaHksIE1JSV9CQ001MjIxX1NIRE9XX0FVWF9TVEFUMik7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0JDTTUyMjFfU0hET1dfQVVYX1NUQVQyLAorCQlkYXRhIHwgTUlJX0JDTTUyMjFfU0hET1dfQVVYX1NUQVQyX0FQRCk7CisKKwlkYXRhID0gcGh5X3JlYWQocGh5LCBNSUlfQkNNNTIyMV9TSERPV19BVVhfTU9ERTQpOworCXBoeV93cml0ZShwaHksIE1JSV9CQ001MjIxX1NIRE9XX0FVWF9NT0RFNCwKKwkJZGF0YSB8IE1JSV9CQ001MjIxX1NIRE9XX0FVWF9NT0RFNF9DTEtMT1BXUik7CisKKwlkYXRhID0gcGh5X3JlYWQocGh5LCBNSUlfQkNNNTIyMV9URVNUKTsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQkNNNTIyMV9URVNULAorCQlkYXRhICYgfk1JSV9CQ001MjIxX1RFU1RfRU5BQkxFX1NIQURPV1MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtNTIyMV9zdXNwZW5kKHN0cnVjdCBtaWlfcGh5KiBwaHkpCit7CisJdTE2IGRhdGE7CisKKwlkYXRhID0gcGh5X3JlYWQocGh5LCBNSUlfQkNNNTIyMV9URVNUKTsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQkNNNTIyMV9URVNULAorCQlkYXRhIHwgTUlJX0JDTTUyMjFfVEVTVF9FTkFCTEVfU0hBRE9XUyk7CisKKwlkYXRhID0gcGh5X3JlYWQocGh5LCBNSUlfQkNNNTIyMV9TSERPV19BVVhfTU9ERTQpOworCXBoeV93cml0ZShwaHksIE1JSV9CQ001MjIxX1NIRE9XX0FVWF9NT0RFNCwKKwkJICBkYXRhIHwgTUlJX0JDTTUyMjFfU0hET1dfQVVYX01PREU0X0lERFFNT0RFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTU0MDBfaW5pdChzdHJ1Y3QgbWlpX3BoeSogcGh5KQoreworCXUxNiBkYXRhOworCisJLyogQ29uZmlndXJlIGZvciBnaWdhYml0IGZ1bGwgZHVwbGV4ICovCisJZGF0YSA9IHBoeV9yZWFkKHBoeSwgTUlJX0JDTTU0MDBfQVVYQ09OVFJPTCk7CisJZGF0YSB8PSBNSUlfQkNNNTQwMF9BVVhDT05UUk9MX1BXUjEwQkFTRVQ7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0JDTTU0MDBfQVVYQ09OVFJPTCwgZGF0YSk7CisJCisJZGF0YSA9IHBoeV9yZWFkKHBoeSwgTUlJX0JDTTU0MDBfR0JfQ09OVFJPTCk7CisJZGF0YSB8PSBNSUlfQkNNNTQwMF9HQl9DT05UUk9MX0ZVTExEVVBMRVhDQVA7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0JDTTU0MDBfR0JfQ09OVFJPTCwgZGF0YSk7CisJCisJdWRlbGF5KDEwMCk7CisKKwkvKiBSZXNldCBhbmQgY29uZmlndXJlIGNhc2NhZGVkIDEwLzEwMCBQSFkgKi8KKwkodm9pZClyZXNldF9vbmVfbWlpX3BoeShwaHksIDB4MWYpOworCQorCWRhdGEgPSBfX3BoeV9yZWFkKHBoeSwgMHgxZiwgTUlJX0JDTTUyMDFfTVVMVElQSFkpOworCWRhdGEgfD0gTUlJX0JDTTUyMDFfTVVMVElQSFlfU0VSSUFMTU9ERTsKKwlfX3BoeV93cml0ZShwaHksIDB4MWYsIE1JSV9CQ001MjAxX01VTFRJUEhZLCBkYXRhKTsKKworCWRhdGEgPSBwaHlfcmVhZChwaHksIE1JSV9CQ001NDAwX0FVWENPTlRST0wpOworCWRhdGEgJj0gfk1JSV9CQ001NDAwX0FVWENPTlRST0xfUFdSMTBCQVNFVDsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQkNNNTQwMF9BVVhDT05UUk9MLCBkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTU0MDBfc3VzcGVuZChzdHJ1Y3QgbWlpX3BoeSogcGh5KQoreworI2lmIDAgLyogQ29tbWVudGVkIG91dCBpbiBEYXJ3aW4uLi4gc29tZW9uZSBoYXMgdGhvc2UgZGF3biBkb2NzID8gKi8KKwlwaHlfd3JpdGUocGh5LCBNSUlfQk1DUiwgQk1DUl9QRE9XTik7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY201NDAxX2luaXQoc3RydWN0IG1paV9waHkqIHBoeSkKK3sKKwl1MTYgZGF0YTsKKwlpbnQgcmV2OworCisJcmV2ID0gcGh5X3JlYWQocGh5LCBNSUlfUEhZU0lEMikgJiAweDAwMGY7CisJaWYgKHJldiA9PSAwIHx8IHJldiA9PSAzKSB7CisJCS8qIFNvbWUgcmV2aXNpb25zIG9mIDU0MDEgYXBwZWFyIHRvIG5lZWQgdGhpcworCQkgKiBpbml0aWFsaXNhdGlvbiBzZXF1ZW5jZSB0byBkaXNhYmxlLCBhY2NvcmRpbmcKKwkJICogdG8gT0YsICJ0YXAgcG93ZXIgbWFuYWdlbWVudCIKKwkJICogCisJCSAqIFdBUk5JTkcgISBPRiBhbmQgRGFyd2luIGRvbid0IGFncmVlIG9uIHRoZQorCQkgKiByZWdpc3RlciBhZGRyZXNzZXMuIE9GIHNlZW0gdG8gaW50ZXJwcmV0IHRoZQorCQkgKiByZWdpc3RlciBudW1iZXJzIGJlbG93IGFzIGRlY2ltYWwKKwkJICoKKwkJICogTm90ZTogVGhpcyBzaG91bGQgKGFuZCBkb2VzKSBtYXRjaCB0ZzNfaW5pdF81NDAxcGh5X2RzcAorCQkgKiAgICAgICBpbiB0aGUgdGczLmMgZHJpdmVyLiAtRGF2ZU0KKwkJICovCisJCXBoeV93cml0ZShwaHksIDB4MTgsIDB4MGMyMCk7CisJCXBoeV93cml0ZShwaHksIDB4MTcsIDB4MDAxMik7CisJCXBoeV93cml0ZShwaHksIDB4MTUsIDB4MTgwNCk7CisJCXBoeV93cml0ZShwaHksIDB4MTcsIDB4MDAxMyk7CisJCXBoeV93cml0ZShwaHksIDB4MTUsIDB4MTIwNCk7CisJCXBoeV93cml0ZShwaHksIDB4MTcsIDB4ODAwNik7CisJCXBoeV93cml0ZShwaHksIDB4MTUsIDB4MDEzMik7CisJCXBoeV93cml0ZShwaHksIDB4MTcsIDB4ODAwNik7CisJCXBoeV93cml0ZShwaHksIDB4MTUsIDB4MDIzMik7CisJCXBoeV93cml0ZShwaHksIDB4MTcsIDB4MjAxZik7CisJCXBoeV93cml0ZShwaHksIDB4MTUsIDB4MGEyMCk7CisJfQorCQorCS8qIENvbmZpZ3VyZSBmb3IgZ2lnYWJpdCBmdWxsIGR1cGxleCAqLworCWRhdGEgPSBwaHlfcmVhZChwaHksIE1JSV9CQ001NDAwX0dCX0NPTlRST0wpOworCWRhdGEgfD0gTUlJX0JDTTU0MDBfR0JfQ09OVFJPTF9GVUxMRFVQTEVYQ0FQOworCXBoeV93cml0ZShwaHksIE1JSV9CQ001NDAwX0dCX0NPTlRST0wsIGRhdGEpOworCisJdWRlbGF5KDEwKTsKKworCS8qIFJlc2V0IGFuZCBjb25maWd1cmUgY2FzY2FkZWQgMTAvMTAwIFBIWSAqLworCSh2b2lkKXJlc2V0X29uZV9taWlfcGh5KHBoeSwgMHgxZik7CisJCisJZGF0YSA9IF9fcGh5X3JlYWQocGh5LCAweDFmLCBNSUlfQkNNNTIwMV9NVUxUSVBIWSk7CisJZGF0YSB8PSBNSUlfQkNNNTIwMV9NVUxUSVBIWV9TRVJJQUxNT0RFOworCV9fcGh5X3dyaXRlKHBoeSwgMHgxZiwgTUlJX0JDTTUyMDFfTVVMVElQSFksIGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtNTQwMV9zdXNwZW5kKHN0cnVjdCBtaWlfcGh5KiBwaHkpCit7CisjaWYgMCAvKiBDb21tZW50ZWQgb3V0IGluIERhcndpbi4uLiBzb21lb25lIGhhcyB0aG9zZSBkYXduIGRvY3MgPyAqLworCXBoeV93cml0ZShwaHksIE1JSV9CTUNSLCBCTUNSX1BET1dOKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTU0MTFfaW5pdChzdHJ1Y3QgbWlpX3BoeSogcGh5KQoreworCXUxNiBkYXRhOworCisJLyogSGVyZSdzIHNvbWUgbW9yZSBBcHBsZSBibGFjayBtYWdpYyB0byBzZXR1cAorCSAqIHNvbWUgdm9sdGFnZSBzdHVmZnMuCisJICovCisJcGh5X3dyaXRlKHBoeSwgMHgxYywgMHg4YzIzKTsKKwlwaHlfd3JpdGUocGh5LCAweDFjLCAweDhjYTMpOworCXBoeV93cml0ZShwaHksIDB4MWMsIDB4OGMyMyk7CisKKwkvKiBIZXJlLCBBcHBsZSBzZWVtcyB0byB3YW50IHRvIHJlc2V0IGl0LCBkbworCSAqIGl0IGFzIHdlbGwKKwkgKi8KKwlwaHlfd3JpdGUocGh5LCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0JNQ1IsIDB4MTM0MCk7CisKKwlkYXRhID0gcGh5X3JlYWQocGh5LCBNSUlfQkNNNTQwMF9HQl9DT05UUk9MKTsKKwlkYXRhIHw9IE1JSV9CQ001NDAwX0dCX0NPTlRST0xfRlVMTERVUExFWENBUDsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQkNNNTQwMF9HQl9DT05UUk9MLCBkYXRhKTsKKworCXVkZWxheSgxMCk7CisKKwkvKiBSZXNldCBhbmQgY29uZmlndXJlIGNhc2NhZGVkIDEwLzEwMCBQSFkgKi8KKwkodm9pZClyZXNldF9vbmVfbWlpX3BoeShwaHksIDB4MWYpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTU0MTFfc3VzcGVuZChzdHJ1Y3QgbWlpX3BoeSogcGh5KQoreworCXBoeV93cml0ZShwaHksIE1JSV9CTUNSLCBCTUNSX1BET1dOKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTU0MjFfaW5pdChzdHJ1Y3QgbWlpX3BoeSogcGh5KQoreworCXUxNiBkYXRhOworCWludCByZXY7CisKKwlyZXYgPSBwaHlfcmVhZChwaHksIE1JSV9QSFlTSUQyKSAmIDB4MDAwZjsKKwlpZiAocmV2ID09IDApIHsKKwkJLyogVGhpcyBpcyBib3Jyb3dlZCBmcm9tIE1hY09TCisJCSAqLworCQlwaHlfd3JpdGUocGh5LCAweDE4LCAweDEwMDcpOworCQlkYXRhID0gcGh5X3JlYWQocGh5LCAweDE4KTsKKwkJcGh5X3dyaXRlKHBoeSwgMHgxOCwgZGF0YSB8IDB4MDQwMCk7CisJCXBoeV93cml0ZShwaHksIDB4MTgsIDB4MDAwNyk7CisJCWRhdGEgPSBwaHlfcmVhZChwaHksIDB4MTgpOworCQlwaHlfd3JpdGUocGh5LCAweDE4LCBkYXRhIHwgMHgwODAwKTsKKwkJcGh5X3dyaXRlKHBoeSwgMHgxNywgMHgwMDBhKTsKKwkJZGF0YSA9IHBoeV9yZWFkKHBoeSwgMHgxNSk7CisJCXBoeV93cml0ZShwaHksIDB4MTUsIGRhdGEgfCAweDAyMDApOworCX0KKyNpZiAwCisJLyogVGhpcyBoYXMgdG8gYmUgdmVyaWZpZWQgYmVmb3JlIEkgZW5hYmxlIGl0ICovCisJLyogRW5hYmxlIGF1dG9tYXRpYyBsb3ctcG93ZXIgKi8KKwlwaHlfd3JpdGUocGh5LCAweDFjLCAweDkwMDIpOworCXBoeV93cml0ZShwaHksIDB4MWMsIDB4YTgyMSk7CisJcGh5X3dyaXRlKHBoeSwgMHgxYywgMHg5NDFkKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTU0MjFrMl9pbml0KHN0cnVjdCBtaWlfcGh5KiBwaHkpCit7CisJLyogSW5pdCBjb2RlIGJvcnJvd2VkIGZyb20gT0YgKi8KKwlwaHlfd3JpdGUocGh5LCA0LCAweDAxZTEpOworCXBoeV93cml0ZShwaHksIDksIDB4MDMwMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY201NHh4X3NldHVwX2FuZWcoc3RydWN0IG1paV9waHkgKnBoeSwgdTMyIGFkdmVydGlzZSkKK3sKKwl1MTYgY3RsLCBhZHY7CisJCisJcGh5LT5hdXRvbmVnID0gMTsKKwlwaHktPnNwZWVkID0gU1BFRURfMTA7CisJcGh5LT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwlwaHktPnBhdXNlID0gMDsKKwlwaHktPmFkdmVydGlzaW5nID0gYWR2ZXJ0aXNlOworCisJLyogU2V0dXAgc3RhbmRhcmQgYWR2ZXJ0aXNlICovCisJYWR2ID0gcGh5X3JlYWQocGh5LCBNSUlfQURWRVJUSVNFKTsKKwlhZHYgJj0gfihBRFZFUlRJU0VfQUxMIHwgQURWRVJUSVNFXzEwMEJBU0U0KTsKKwlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpCisJCWFkdiB8PSBBRFZFUlRJU0VfMTBIQUxGOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkKKwkJYWR2IHw9IEFEVkVSVElTRV8xMEZVTEw7CisJaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZikKKwkJYWR2IHw9IEFEVkVSVElTRV8xMDBIQUxGOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpCisJCWFkdiB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQURWRVJUSVNFLCBhZHYpOworCisJLyogU2V0dXAgMTAwMEJUIGFkdmVydGlzZSAqLworCWFkdiA9IHBoeV9yZWFkKHBoeSwgTUlJXzEwMDBCQVNFVENPTlRST0wpOworCWFkdiAmPSB+KE1JSV8xMDAwQkFTRVRDT05UUk9MX0ZVTExEVVBMRVhDQVB8TUlJXzEwMDBCQVNFVENPTlRST0xfSEFMRkRVUExFWENBUCk7CisJaWYgKGFkdmVydGlzZSAmIFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZikKKwkJYWR2IHw9IE1JSV8xMDAwQkFTRVRDT05UUk9MX0hBTEZEVVBMRVhDQVA7CisJaWYgKGFkdmVydGlzZSAmIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCkKKwkJYWR2IHw9IE1JSV8xMDAwQkFTRVRDT05UUk9MX0ZVTExEVVBMRVhDQVA7CisJcGh5X3dyaXRlKHBoeSwgTUlJXzEwMDBCQVNFVENPTlRST0wsIGFkdik7CisKKwkvKiBTdGFydC9SZXN0YXJ0IGFuZWcgKi8KKwljdGwgPSBwaHlfcmVhZChwaHksIE1JSV9CTUNSKTsKKwljdGwgfD0gKEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVCk7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0JNQ1IsIGN0bCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY201NHh4X3NldHVwX2ZvcmNlZChzdHJ1Y3QgbWlpX3BoeSAqcGh5LCBpbnQgc3BlZWQsIGludCBmZCkKK3sKKwl1MTYgY3RsOworCQorCXBoeS0+YXV0b25lZyA9IDA7CisJcGh5LT5zcGVlZCA9IHNwZWVkOworCXBoeS0+ZHVwbGV4ID0gZmQ7CisJcGh5LT5wYXVzZSA9IDA7CisKKwljdGwgPSBwaHlfcmVhZChwaHksIE1JSV9CTUNSKTsKKwljdGwgJj0gfihCTUNSX0ZVTExEUExYfEJNQ1JfU1BFRUQxMDB8Qk1DUl9TUEQyfEJNQ1JfQU5FTkFCTEUpOworCisJLyogRmlyc3QgcmVzZXQgdGhlIFBIWSAqLworCXBoeV93cml0ZShwaHksIE1JSV9CTUNSLCBjdGwgfCBCTUNSX1JFU0VUKTsKKworCS8qIFNlbGVjdCBzcGVlZCAmIGR1cGxleCAqLworCXN3aXRjaChzcGVlZCkgeworCWNhc2UgU1BFRURfMTA6CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwOgorCQljdGwgfD0gQk1DUl9TUEVFRDEwMDsKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMDAwOgorCQljdGwgfD0gQk1DUl9TUEQyOworCX0KKwlpZiAoZmQgPT0gRFVQTEVYX0ZVTEwpCisJCWN0bCB8PSBCTUNSX0ZVTExEUExYOworCisJLy8gWFhYIFNob3VsZCB3ZSBzZXQgdGhlIHN1bmdlbSB0byBHSUkgbm93IG9uIDEwMDBCVCA/CisJCisJcGh5X3dyaXRlKHBoeSwgTUlJX0JNQ1IsIGN0bCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY201NHh4X3JlYWRfbGluayhzdHJ1Y3QgbWlpX3BoeSAqcGh5KQoreworCWludCBsaW5rX21vZGU7CQorCXUxNiB2YWw7CisJCisJaWYgKHBoeS0+YXV0b25lZykgeworCSAgICAJdmFsID0gcGh5X3JlYWQocGh5LCBNSUlfQkNNNTQwMF9BVVhTVEFUVVMpOworCQlsaW5rX21vZGUgPSAoKHZhbCAmIE1JSV9CQ001NDAwX0FVWFNUQVRVU19MSU5LTU9ERV9NQVNLKSA+PgorCQkJICAgICBNSUlfQkNNNTQwMF9BVVhTVEFUVVNfTElOS01PREVfU0hJRlQpOworCQlwaHktPmR1cGxleCA9IHBoeV9CQ001NDAwX2xpbmtfdGFibGVbbGlua19tb2RlXVswXSA/IERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CisJCXBoeS0+c3BlZWQgPSBwaHlfQkNNNTQwMF9saW5rX3RhYmxlW2xpbmtfbW9kZV1bMl0gPworCQkJCVNQRUVEXzEwMDAgOgorCQkJCShwaHlfQkNNNTQwMF9saW5rX3RhYmxlW2xpbmtfbW9kZV1bMV0gPyBTUEVFRF8xMDAgOiBTUEVFRF8xMCk7CisJCXZhbCA9IHBoeV9yZWFkKHBoeSwgTUlJX0xQQSk7CisJCXBoeS0+cGF1c2UgPSAoKHZhbCAmIExQQV9QQVVTRSkgIT0gMCk7CisJfQorCS8qIE9uIG5vbi1hbmVnLCB3ZSBhc3N1bWUgd2hhdCB3ZSBwdXQgaW4gQk1DUiBpcyB0aGUgc3BlZWQsCisJICogdGhvdWdoIG1hZ2ljLWFuZWcgc2hvdWxkbid0IHByZXZlbnQgdGhpcyBjYXNlIGZyb20gb2NjdXJyaW5nCisJICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXJ2ZWxsX3NldHVwX2FuZWcoc3RydWN0IG1paV9waHkgKnBoeSwgdTMyIGFkdmVydGlzZSkKK3sKKwl1MTYgY3RsLCBhZHY7CisJCisJcGh5LT5hdXRvbmVnID0gMTsKKwlwaHktPnNwZWVkID0gU1BFRURfMTA7CisJcGh5LT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwlwaHktPnBhdXNlID0gMDsKKwlwaHktPmFkdmVydGlzaW5nID0gYWR2ZXJ0aXNlOworCisJLyogU2V0dXAgc3RhbmRhcmQgYWR2ZXJ0aXNlICovCisJYWR2ID0gcGh5X3JlYWQocGh5LCBNSUlfQURWRVJUSVNFKTsKKwlhZHYgJj0gfihBRFZFUlRJU0VfQUxMIHwgQURWRVJUSVNFXzEwMEJBU0U0KTsKKwlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpCisJCWFkdiB8PSBBRFZFUlRJU0VfMTBIQUxGOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkKKwkJYWR2IHw9IEFEVkVSVElTRV8xMEZVTEw7CisJaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZikKKwkJYWR2IHw9IEFEVkVSVElTRV8xMDBIQUxGOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpCisJCWFkdiB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQURWRVJUSVNFLCBhZHYpOworCisJLyogU2V0dXAgMTAwMEJUIGFkdmVydGlzZSAmIGVuYWJsZSBjcm9zc292ZXIgZGV0ZWN0CisJICogWFhYIEhvdyBkbyB3ZSBhZHZlcnRpc2UgMTAwMEJUID8gRGFyd2luIHNvdXJjZSBpcworCSAqIGNvbmZ1c2luZyBoZXJlLCB0aGV5IHJlYWQgZnJvbSBzcGVjaWZpYyBjb250cm9sIGFuZAorCSAqIHdyaXRlIHRvIGNvbnRyb2wuLi4gU29tZW9uZSBoYXMgc3BlY3MgZm9yIHRob3NlCisJICogYmVhc3RzID8KKwkgKi8KKwlhZHYgPSBwaHlfcmVhZChwaHksIE1JSV9NMTAxMV9QSFlfU1BFQ19DT05UUk9MKTsKKwlhZHYgfD0gTUlJX00xMDExX1BIWV9TUEVDX0NPTlRST0xfQVVUT19NRElYOworCWFkdiAmPSB+KE1JSV8xMDAwQkFTRVRDT05UUk9MX0ZVTExEVVBMRVhDQVAgfAorCQkJTUlJXzEwMDBCQVNFVENPTlRST0xfSEFMRkRVUExFWENBUCk7CisJaWYgKGFkdmVydGlzZSAmIFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZikKKwkJYWR2IHw9IE1JSV8xMDAwQkFTRVRDT05UUk9MX0hBTEZEVVBMRVhDQVA7CisJaWYgKGFkdmVydGlzZSAmIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCkKKwkJYWR2IHw9IE1JSV8xMDAwQkFTRVRDT05UUk9MX0ZVTExEVVBMRVhDQVA7CisJcGh5X3dyaXRlKHBoeSwgTUlJXzEwMDBCQVNFVENPTlRST0wsIGFkdik7CisKKwkvKiBTdGFydC9SZXN0YXJ0IGFuZWcgKi8KKwljdGwgPSBwaHlfcmVhZChwaHksIE1JSV9CTUNSKTsKKwljdGwgfD0gKEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVCk7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0JNQ1IsIGN0bCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXJ2ZWxsX3NldHVwX2ZvcmNlZChzdHJ1Y3QgbWlpX3BoeSAqcGh5LCBpbnQgc3BlZWQsIGludCBmZCkKK3sKKwl1MTYgY3RsLCBjdGwyOworCQorCXBoeS0+YXV0b25lZyA9IDA7CisJcGh5LT5zcGVlZCA9IHNwZWVkOworCXBoeS0+ZHVwbGV4ID0gZmQ7CisJcGh5LT5wYXVzZSA9IDA7CisKKwljdGwgPSBwaHlfcmVhZChwaHksIE1JSV9CTUNSKTsKKwljdGwgJj0gfihCTUNSX0ZVTExEUExYfEJNQ1JfU1BFRUQxMDB8Qk1DUl9TUEQyfEJNQ1JfQU5FTkFCTEUpOworCWN0bCB8PSBCTUNSX1JFU0VUOworCisJLyogU2VsZWN0IHNwZWVkICYgZHVwbGV4ICovCisJc3dpdGNoKHNwZWVkKSB7CisJY2FzZSBTUEVFRF8xMDoKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMDA6CisJCWN0bCB8PSBCTUNSX1NQRUVEMTAwOworCQlicmVhazsKKwkvKiBJJ20gbm90IHN1cmUgYWJvdXQgdGhlIG9uZSBiZWxvdywgYWdhaW4sIERhcndpbiBzb3VyY2UgaXMKKwkgKiBxdWl0ZSBjb25mdXNpbmcgYW5kIEkgbGFjayBjaGlwIHNwZWNzCisJICovCisJY2FzZSBTUEVFRF8xMDAwOgorCQljdGwgfD0gQk1DUl9TUEQyOworCX0KKwlpZiAoZmQgPT0gRFVQTEVYX0ZVTEwpCisJCWN0bCB8PSBCTUNSX0ZVTExEUExYOworCisJLyogRGlzYWJsZSBjcm9zc292ZXIuIEFnYWluLCB0aGUgd2F5IEFwcGxlIGRvZXMgaXQgaXMgc3RyYW5nZSwKKwkgKiB0aG91Z2ggSSBkb24ndCBhc3N1bWUgdGhleSBhcmUgd3JvbmcgOykKKwkgKi8KKwljdGwyID0gcGh5X3JlYWQocGh5LCBNSUlfTTEwMTFfUEhZX1NQRUNfQ09OVFJPTCk7CisJY3RsMiAmPSB+KE1JSV9NMTAxMV9QSFlfU1BFQ19DT05UUk9MX01BTlVBTF9NRElYIHwKKwkJTUlJX00xMDExX1BIWV9TUEVDX0NPTlRST0xfQVVUT19NRElYIHwKKwkJTUlJXzEwMDBCQVNFVENPTlRST0xfRlVMTERVUExFWENBUCB8CisJCU1JSV8xMDAwQkFTRVRDT05UUk9MX0hBTEZEVVBMRVhDQVApOworCWlmIChzcGVlZCA9PSBTUEVFRF8xMDAwKQorCQljdGwyIHw9IChmZCA9PSBEVVBMRVhfRlVMTCkgPworCQkJTUlJXzEwMDBCQVNFVENPTlRST0xfRlVMTERVUExFWENBUCA6CisJCQlNSUlfMTAwMEJBU0VUQ09OVFJPTF9IQUxGRFVQTEVYQ0FQOworCXBoeV93cml0ZShwaHksIE1JSV8xMDAwQkFTRVRDT05UUk9MLCBjdGwyKTsKKworCS8vIFhYWCBTaG91bGQgd2Ugc2V0IHRoZSBzdW5nZW0gdG8gR0lJIG5vdyBvbiAxMDAwQlQgPworCQorCXBoeV93cml0ZShwaHksIE1JSV9CTUNSLCBjdGwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFydmVsbF9yZWFkX2xpbmsoc3RydWN0IG1paV9waHkgKnBoeSkKK3sKKwl1MTYgc3RhdHVzOworCisJaWYgKHBoeS0+YXV0b25lZykgeworCQlzdGF0dXMgPSBwaHlfcmVhZChwaHksIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVMpOworCQlpZiAoKHN0YXR1cyAmIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVNfUkVTT0xWRUQpID09IDApCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJaWYgKHN0YXR1cyAmIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVNfMTAwMCkKKwkJCXBoeS0+c3BlZWQgPSBTUEVFRF8xMDAwOworCQllbHNlIGlmIChzdGF0dXMgJiBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTXzEwMCkKKwkJCXBoeS0+c3BlZWQgPSBTUEVFRF8xMDA7CisJCWVsc2UKKwkJCXBoeS0+c3BlZWQgPSBTUEVFRF8xMDsKKwkJaWYgKHN0YXR1cyAmIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVNfRlVMTERVUExFWCkKKwkJCXBoeS0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCWVsc2UKKwkJCXBoeS0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJCXBoeS0+cGF1c2UgPSAwOyAvKiBYWFggQ2hlY2sgYWdhaW5zdCBzcGVjICEgKi8KKwl9CisJLyogT24gbm9uLWFuZWcsIHdlIGFzc3VtZSB3aGF0IHdlIHB1dCBpbiBCTUNSIGlzIHRoZSBzcGVlZCwKKwkgKiB0aG91Z2ggbWFnaWMtYW5lZyBzaG91bGRuJ3QgcHJldmVudCB0aGlzIGNhc2UgZnJvbSBvY2N1cnJpbmcKKwkgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbm1paV9zZXR1cF9hbmVnKHN0cnVjdCBtaWlfcGh5ICpwaHksIHUzMiBhZHZlcnRpc2UpCit7CisJdTE2IGN0bCwgYWR2OworCQorCXBoeS0+YXV0b25lZyA9IDE7CisJcGh5LT5zcGVlZCA9IFNQRUVEXzEwOworCXBoeS0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJcGh5LT5wYXVzZSA9IDA7CisJcGh5LT5hZHZlcnRpc2luZyA9IGFkdmVydGlzZTsKKworCS8qIFNldHVwIHN0YW5kYXJkIGFkdmVydGlzZSAqLworCWFkdiA9IHBoeV9yZWFkKHBoeSwgTUlJX0FEVkVSVElTRSk7CisJYWR2ICY9IH4oQURWRVJUSVNFX0FMTCB8IEFEVkVSVElTRV8xMDBCQVNFNCk7CisJaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmKQorCQlhZHYgfD0gQURWRVJUSVNFXzEwSEFMRjsKKwlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwpCisJCWFkdiB8PSBBRFZFUlRJU0VfMTBGVUxMOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYpCisJCWFkdiB8PSBBRFZFUlRJU0VfMTAwSEFMRjsKKwlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsKQorCQlhZHYgfD0gQURWRVJUSVNFXzEwMEZVTEw7CisJcGh5X3dyaXRlKHBoeSwgTUlJX0FEVkVSVElTRSwgYWR2KTsKKworCS8qIFN0YXJ0L1Jlc3RhcnQgYW5lZyAqLworCWN0bCA9IHBoeV9yZWFkKHBoeSwgTUlJX0JNQ1IpOworCWN0bCB8PSAoQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUKTsKKwlwaHlfd3JpdGUocGh5LCBNSUlfQk1DUiwgY3RsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbm1paV9zZXR1cF9mb3JjZWQoc3RydWN0IG1paV9waHkgKnBoeSwgaW50IHNwZWVkLCBpbnQgZmQpCit7CisJdTE2IGN0bDsKKwkKKwlwaHktPmF1dG9uZWcgPSAwOworCXBoeS0+c3BlZWQgPSBzcGVlZDsKKwlwaHktPmR1cGxleCA9IGZkOworCXBoeS0+cGF1c2UgPSAwOworCisJY3RsID0gcGh5X3JlYWQocGh5LCBNSUlfQk1DUik7CisJY3RsICY9IH4oQk1DUl9GVUxMRFBMWHxCTUNSX1NQRUVEMTAwfEJNQ1JfQU5FTkFCTEUpOworCisJLyogRmlyc3QgcmVzZXQgdGhlIFBIWSAqLworCXBoeV93cml0ZShwaHksIE1JSV9CTUNSLCBjdGwgfCBCTUNSX1JFU0VUKTsKKworCS8qIFNlbGVjdCBzcGVlZCAmIGR1cGxleCAqLworCXN3aXRjaChzcGVlZCkgeworCWNhc2UgU1BFRURfMTA6CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwOgorCQljdGwgfD0gQk1DUl9TUEVFRDEwMDsKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMDAwOgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoZmQgPT0gRFVQTEVYX0ZVTEwpCisJCWN0bCB8PSBCTUNSX0ZVTExEUExYOworCXBoeV93cml0ZShwaHksIE1JSV9CTUNSLCBjdGwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VubWlpX3BvbGxfbGluayhzdHJ1Y3QgbWlpX3BoeSAqcGh5KQoreworCXUxNiBzdGF0dXM7CisJCisJKHZvaWQpcGh5X3JlYWQocGh5LCBNSUlfQk1TUik7CisJc3RhdHVzID0gcGh5X3JlYWQocGh5LCBNSUlfQk1TUik7CisJaWYgKChzdGF0dXMgJiBCTVNSX0xTVEFUVVMpID09IDApCisJCXJldHVybiAwOworCWlmIChwaHktPmF1dG9uZWcgJiYgIShzdGF0dXMgJiBCTVNSX0FORUdDT01QTEVURSkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGdlbm1paV9yZWFkX2xpbmsoc3RydWN0IG1paV9waHkgKnBoeSkKK3sKKwl1MTYgbHBhOworCisJaWYgKHBoeS0+YXV0b25lZykgeworCQlscGEgPSBwaHlfcmVhZChwaHksIE1JSV9MUEEpOworCisJCWlmIChscGEgJiAoTFBBXzEwRlVMTCB8IExQQV8xMDBGVUxMKSkKKwkJCXBoeS0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCWVsc2UKKwkJCXBoeS0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJCWlmIChscGEgJiAoTFBBXzEwMEZVTEwgfCBMUEFfMTAwSEFMRikpCisJCQlwaHktPnNwZWVkID0gU1BFRURfMTAwOworCQllbHNlCisJCQlwaHktPnNwZWVkID0gU1BFRURfMTA7CisJCXBoeS0+cGF1c2UgPSAwOworCX0KKwkvKiBPbiBub24tYW5lZywgd2UgYXNzdW1lIHdoYXQgd2UgcHV0IGluIEJNQ1IgaXMgdGhlIHNwZWVkLAorCSAqIHRob3VnaCBtYWdpYy1hbmVnIHNob3VsZG4ndCBwcmV2ZW50IHRoaXMgY2FzZSBmcm9tIG9jY3VycmluZworCSAqLworCisJIHJldHVybiAwOworfQorCisKKyNkZWZpbmUgTUlJX0JBU0lDX0ZFQVRVUkVTCShTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8IFwKKwkJCQkgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8IFwKKwkJCQkgU1VQUE9SVEVEX0F1dG9uZWcgfCBTVVBQT1JURURfVFAgfCBTVVBQT1JURURfTUlJKQorI2RlZmluZSBNSUlfR0JJVF9GRUFUVVJFUwkoTUlJX0JBU0lDX0ZFQVRVUkVTIHwgXAorCQkJCSBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpCisKKy8qIEJyb2FkY29tIEJDTSA1MjAxICovCitzdGF0aWMgc3RydWN0IG1paV9waHlfb3BzIGJjbTUyMDFfcGh5X29wcyA9IHsKKwkuaW5pdAkJPSBiY201MjAxX2luaXQsCisJLnN1c3BlbmQJPSBiY201MjAxX3N1c3BlbmQsCisJLnNldHVwX2FuZWcJPSBnZW5taWlfc2V0dXBfYW5lZywKKwkuc2V0dXBfZm9yY2VkCT0gZ2VubWlpX3NldHVwX2ZvcmNlZCwKKwkucG9sbF9saW5rCT0gZ2VubWlpX3BvbGxfbGluaywKKwkucmVhZF9saW5rCT0gZ2VubWlpX3JlYWRfbGluaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9kZWYgYmNtNTIwMV9waHlfZGVmID0geworCS5waHlfaWQJCT0gMHgwMDQwNjIxMCwKKwkucGh5X2lkX21hc2sJPSAweGZmZmZmZmYwLAorCS5uYW1lCQk9ICJCQ001MjAxIiwKKwkuZmVhdHVyZXMJPSBNSUlfQkFTSUNfRkVBVFVSRVMsCisJLm1hZ2ljX2FuZWcJPSAxLAorCS5vcHMJCT0gJmJjbTUyMDFfcGh5X29wcworfTsKKworLyogQnJvYWRjb20gQkNNIDUyMjEgKi8KK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9vcHMgYmNtNTIyMV9waHlfb3BzID0geworCS5zdXNwZW5kCT0gYmNtNTIyMV9zdXNwZW5kLAorCS5pbml0CQk9IGJjbTUyMjFfaW5pdCwKKwkuc2V0dXBfYW5lZwk9IGdlbm1paV9zZXR1cF9hbmVnLAorCS5zZXR1cF9mb3JjZWQJPSBnZW5taWlfc2V0dXBfZm9yY2VkLAorCS5wb2xsX2xpbmsJPSBnZW5taWlfcG9sbF9saW5rLAorCS5yZWFkX2xpbmsJPSBnZW5taWlfcmVhZF9saW5rLAorfTsKKworc3RhdGljIHN0cnVjdCBtaWlfcGh5X2RlZiBiY201MjIxX3BoeV9kZWYgPSB7CisJLnBoeV9pZAkJPSAweDAwNDA2MWUwLAorCS5waHlfaWRfbWFzawk9IDB4ZmZmZmZmZjAsCisJLm5hbWUJCT0gIkJDTTUyMjEiLAorCS5mZWF0dXJlcwk9IE1JSV9CQVNJQ19GRUFUVVJFUywKKwkubWFnaWNfYW5lZwk9IDEsCisJLm9wcwkJPSAmYmNtNTIyMV9waHlfb3BzCit9OworCisvKiBCcm9hZGNvbSBCQ00gNTQwMCAqLworc3RhdGljIHN0cnVjdCBtaWlfcGh5X29wcyBiY201NDAwX3BoeV9vcHMgPSB7CisJLmluaXQJCT0gYmNtNTQwMF9pbml0LAorCS5zdXNwZW5kCT0gYmNtNTQwMF9zdXNwZW5kLAorCS5zZXR1cF9hbmVnCT0gYmNtNTR4eF9zZXR1cF9hbmVnLAorCS5zZXR1cF9mb3JjZWQJPSBiY201NHh4X3NldHVwX2ZvcmNlZCwKKwkucG9sbF9saW5rCT0gZ2VubWlpX3BvbGxfbGluaywKKwkucmVhZF9saW5rCT0gYmNtNTR4eF9yZWFkX2xpbmssCit9OworCitzdGF0aWMgc3RydWN0IG1paV9waHlfZGVmIGJjbTU0MDBfcGh5X2RlZiA9IHsKKwkucGh5X2lkCQk9IDB4MDAyMDYwNDAsCisJLnBoeV9pZF9tYXNrCT0gMHhmZmZmZmZmMCwKKwkubmFtZQkJPSAiQkNNNTQwMCIsCisJLmZlYXR1cmVzCT0gTUlJX0dCSVRfRkVBVFVSRVMsCisJLm1hZ2ljX2FuZWcJPSAxLAorCS5vcHMJCT0gJmJjbTU0MDBfcGh5X29wcworfTsKKworLyogQnJvYWRjb20gQkNNIDU0MDEgKi8KK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9vcHMgYmNtNTQwMV9waHlfb3BzID0geworCS5pbml0CQk9IGJjbTU0MDFfaW5pdCwKKwkuc3VzcGVuZAk9IGJjbTU0MDFfc3VzcGVuZCwKKwkuc2V0dXBfYW5lZwk9IGJjbTU0eHhfc2V0dXBfYW5lZywKKwkuc2V0dXBfZm9yY2VkCT0gYmNtNTR4eF9zZXR1cF9mb3JjZWQsCisJLnBvbGxfbGluawk9IGdlbm1paV9wb2xsX2xpbmssCisJLnJlYWRfbGluawk9IGJjbTU0eHhfcmVhZF9saW5rLAorfTsKKworc3RhdGljIHN0cnVjdCBtaWlfcGh5X2RlZiBiY201NDAxX3BoeV9kZWYgPSB7CisJLnBoeV9pZAkJPSAweDAwMjA2MDUwLAorCS5waHlfaWRfbWFzawk9IDB4ZmZmZmZmZjAsCisJLm5hbWUJCT0gIkJDTTU0MDEiLAorCS5mZWF0dXJlcwk9IE1JSV9HQklUX0ZFQVRVUkVTLAorCS5tYWdpY19hbmVnCT0gMSwKKwkub3BzCQk9ICZiY201NDAxX3BoeV9vcHMKK307CisKKy8qIEJyb2FkY29tIEJDTSA1NDExICovCitzdGF0aWMgc3RydWN0IG1paV9waHlfb3BzIGJjbTU0MTFfcGh5X29wcyA9IHsKKwkuaW5pdAkJPSBiY201NDExX2luaXQsCisJLnN1c3BlbmQJPSBiY201NDExX3N1c3BlbmQsCisJLnNldHVwX2FuZWcJPSBiY201NHh4X3NldHVwX2FuZWcsCisJLnNldHVwX2ZvcmNlZAk9IGJjbTU0eHhfc2V0dXBfZm9yY2VkLAorCS5wb2xsX2xpbmsJPSBnZW5taWlfcG9sbF9saW5rLAorCS5yZWFkX2xpbmsJPSBiY201NHh4X3JlYWRfbGluaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9kZWYgYmNtNTQxMV9waHlfZGVmID0geworCS5waHlfaWQJCT0gMHgwMDIwNjA3MCwKKwkucGh5X2lkX21hc2sJPSAweGZmZmZmZmYwLAorCS5uYW1lCQk9ICJCQ001NDExIiwKKwkuZmVhdHVyZXMJPSBNSUlfR0JJVF9GRUFUVVJFUywKKwkubWFnaWNfYW5lZwk9IDEsCisJLm9wcwkJPSAmYmNtNTQxMV9waHlfb3BzCit9OworCisvKiBCcm9hZGNvbSBCQ00gNTQyMSAqLworc3RhdGljIHN0cnVjdCBtaWlfcGh5X29wcyBiY201NDIxX3BoeV9vcHMgPSB7CisJLmluaXQJCT0gYmNtNTQyMV9pbml0LAorCS5zdXNwZW5kCT0gYmNtNTQxMV9zdXNwZW5kLAorCS5zZXR1cF9hbmVnCT0gYmNtNTR4eF9zZXR1cF9hbmVnLAorCS5zZXR1cF9mb3JjZWQJPSBiY201NHh4X3NldHVwX2ZvcmNlZCwKKwkucG9sbF9saW5rCT0gZ2VubWlpX3BvbGxfbGluaywKKwkucmVhZF9saW5rCT0gYmNtNTR4eF9yZWFkX2xpbmssCit9OworCitzdGF0aWMgc3RydWN0IG1paV9waHlfZGVmIGJjbTU0MjFfcGh5X2RlZiA9IHsKKwkucGh5X2lkCQk9IDB4MDAyMDYwZTAsCisJLnBoeV9pZF9tYXNrCT0gMHhmZmZmZmZmMCwKKwkubmFtZQkJPSAiQkNNNTQyMSIsCisJLmZlYXR1cmVzCT0gTUlJX0dCSVRfRkVBVFVSRVMsCisJLm1hZ2ljX2FuZWcJPSAxLAorCS5vcHMJCT0gJmJjbTU0MjFfcGh5X29wcworfTsKKworLyogQnJvYWRjb20gQkNNIDU0MjEgYnVpbHQtaW4gSzIgKi8KK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9vcHMgYmNtNTQyMWsyX3BoeV9vcHMgPSB7CisJLmluaXQJCT0gYmNtNTQyMWsyX2luaXQsCisJLnN1c3BlbmQJPSBiY201NDExX3N1c3BlbmQsCisJLnNldHVwX2FuZWcJPSBiY201NHh4X3NldHVwX2FuZWcsCisJLnNldHVwX2ZvcmNlZAk9IGJjbTU0eHhfc2V0dXBfZm9yY2VkLAorCS5wb2xsX2xpbmsJPSBnZW5taWlfcG9sbF9saW5rLAorCS5yZWFkX2xpbmsJPSBiY201NHh4X3JlYWRfbGluaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9kZWYgYmNtNTQyMWsyX3BoeV9kZWYgPSB7CisJLnBoeV9pZAkJPSAweDAwMjA2MmUwLAorCS5waHlfaWRfbWFzawk9IDB4ZmZmZmZmZjAsCisJLm5hbWUJCT0gIkJDTTU0MjEtSzIiLAorCS5mZWF0dXJlcwk9IE1JSV9HQklUX0ZFQVRVUkVTLAorCS5tYWdpY19hbmVnCT0gMSwKKwkub3BzCQk9ICZiY201NDIxazJfcGh5X29wcworfTsKKworLyogTWFydmVsbCA4OEUxMTAxIChBcHBsZSBzZWVtIHRvIGRlYWwgd2l0aCAyIGRpZmZlcmVudCByZXZzLAorICogSSBtYXNrZWQgb3V0IHRoZSA4IGxhc3QgYml0cyB0byBnZXQgYm90aCwgYnV0IHNvbWUgc3BlY3MKKyAqIHdvdWxkIGJlIHVzZWZ1bCBoZXJlKSAtLUJlbkguCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9vcHMgbWFydmVsbF9waHlfb3BzID0geworCS5zZXR1cF9hbmVnCT0gbWFydmVsbF9zZXR1cF9hbmVnLAorCS5zZXR1cF9mb3JjZWQJPSBtYXJ2ZWxsX3NldHVwX2ZvcmNlZCwKKwkucG9sbF9saW5rCT0gZ2VubWlpX3BvbGxfbGluaywKKwkucmVhZF9saW5rCT0gbWFydmVsbF9yZWFkX2xpbmsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9kZWYgbWFydmVsbF9waHlfZGVmID0geworCS5waHlfaWQJCT0gMHgwMTQxMGMwMCwKKwkucGh5X2lkX21hc2sJPSAweGZmZmZmZjAwLAorCS5uYW1lCQk9ICJNYXJ2ZWxsIDg4RTExMDEiLAorCS5mZWF0dXJlcwk9IE1JSV9HQklUX0ZFQVRVUkVTLAorCS5tYWdpY19hbmVnCT0gMSwKKwkub3BzCQk9ICZtYXJ2ZWxsX3BoeV9vcHMKK307CisKKy8qIEdlbmVyaWMgaW1wbGVtZW50YXRpb24gZm9yIG1vc3QgMTAvMTAwIFBIWXMgKi8KK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9vcHMgZ2VuZXJpY19waHlfb3BzID0geworCS5zZXR1cF9hbmVnCT0gZ2VubWlpX3NldHVwX2FuZWcsCisJLnNldHVwX2ZvcmNlZAk9IGdlbm1paV9zZXR1cF9mb3JjZWQsCisJLnBvbGxfbGluawk9IGdlbm1paV9wb2xsX2xpbmssCisJLnJlYWRfbGluawk9IGdlbm1paV9yZWFkX2xpbmsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlpX3BoeV9kZWYgZ2VubWlpX3BoeV9kZWYgPSB7CisJLnBoeV9pZAkJPSAweDAwMDAwMDAwLAorCS5waHlfaWRfbWFzawk9IDB4MDAwMDAwMDAsCisJLm5hbWUJCT0gIkdlbmVyaWMgTUlJIiwKKwkuZmVhdHVyZXMJPSBNSUlfQkFTSUNfRkVBVFVSRVMsCisJLm1hZ2ljX2FuZWcJPSAwLAorCS5vcHMJCT0gJmdlbmVyaWNfcGh5X29wcworfTsKKworc3RhdGljIHN0cnVjdCBtaWlfcGh5X2RlZiogbWlpX3BoeV90YWJsZVtdID0geworCSZiY201MjAxX3BoeV9kZWYsCisJJmJjbTUyMjFfcGh5X2RlZiwKKwkmYmNtNTQwMF9waHlfZGVmLAorCSZiY201NDAxX3BoeV9kZWYsCisJJmJjbTU0MTFfcGh5X2RlZiwKKwkmYmNtNTQyMV9waHlfZGVmLAorCSZiY201NDIxazJfcGh5X2RlZiwKKwkmbWFydmVsbF9waHlfZGVmLAorCSZnZW5taWlfcGh5X2RlZiwKKwlOVUxMCit9OworCitpbnQgbWlpX3BoeV9wcm9iZShzdHJ1Y3QgbWlpX3BoeSAqcGh5LCBpbnQgbWlpX2lkKQoreworCWludCByYzsKKwl1MzIgaWQ7CisJc3RydWN0IG1paV9waHlfZGVmKiBkZWY7CisJaW50IGk7CisKKwkvKiBXZSBkbyBub3QgcmVzZXQgdGhlIG1paV9waHkgc3RydWN0dXJlIGFzIHRoZSBkcml2ZXIKKwkgKiBtYXkgcmUtcHJvYmUgdGhlIFBIWSByZWd1bGFyeQorCSAqLworCXBoeS0+bWlpX2lkID0gbWlpX2lkOworCQorCS8qIFRha2UgUEhZIG91dCBvZiBpc2xvYXRlIG1vZGUgYW5kIHJlc2V0IGl0LiAqLworCXJjID0gcmVzZXRfb25lX21paV9waHkocGh5LCBtaWlfaWQpOworCWlmIChyYykKKwkJZ290byBmYWlsOworCisJLyogUmVhZCBJRCBhbmQgZmluZCBtYXRjaGluZyBlbnRyeSAqLwkKKwlpZCA9IChwaHlfcmVhZChwaHksIE1JSV9QSFlTSUQxKSA8PCAxNiB8IHBoeV9yZWFkKHBoeSwgTUlJX1BIWVNJRDIpKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiUEhZIElEOiAleCwgYWRkcjogJXhcbiIsIGlkLCBtaWlfaWQpOworCWZvciAoaT0wOyAoZGVmID0gbWlpX3BoeV90YWJsZVtpXSkgIT0gTlVMTDsgaSsrKQorCQlpZiAoKGlkICYgZGVmLT5waHlfaWRfbWFzaykgPT0gZGVmLT5waHlfaWQpCisJCQlicmVhazsKKwkvKiBTaG91bGQgbmV2ZXIgYmUgTlVMTCAod2UgaGF2ZSBhIGdlbmVyaWMgZW50cnkpLCBidXQuLi4gKi8KKwlpZiAoZGVmID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKworCXBoeS0+ZGVmID0gZGVmOworCQorCXJldHVybiAwOworZmFpbDoKKwlwaHktPnNwZWVkID0gMDsKKwlwaHktPmR1cGxleCA9IDA7CisJcGh5LT5wYXVzZSA9IDA7CisJcGh5LT5hZHZlcnRpc2luZyA9IDA7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK0VYUE9SVF9TWU1CT0wobWlpX3BoeV9wcm9iZSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmdlbV9waHkuaCBiL2RyaXZlcnMvbmV0L3N1bmdlbV9waHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjJjYjU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc3VuZ2VtX3BoeS5oCkBAIC0wLDAgKzEsMTE3IEBACisjaWZuZGVmIF9fU1VOR0VNX1BIWV9IX18KKyNkZWZpbmUgX19TVU5HRU1fUEhZX0hfXworCitzdHJ1Y3QgbWlpX3BoeTsKKworLyogT3BlcmF0aW9ucyBzdXBwb3J0ZWQgYnkgYW55IGtpbmQgb2YgUEhZICovCitzdHJ1Y3QgbWlpX3BoeV9vcHMKK3sKKwlpbnQJCSgqaW5pdCkoc3RydWN0IG1paV9waHkgKnBoeSk7CisJaW50CQkoKnN1c3BlbmQpKHN0cnVjdCBtaWlfcGh5ICpwaHkpOworCWludAkJKCpzZXR1cF9hbmVnKShzdHJ1Y3QgbWlpX3BoeSAqcGh5LCB1MzIgYWR2ZXJ0aXNlKTsKKwlpbnQJCSgqc2V0dXBfZm9yY2VkKShzdHJ1Y3QgbWlpX3BoeSAqcGh5LCBpbnQgc3BlZWQsIGludCBmZCk7CisJaW50CQkoKnBvbGxfbGluaykoc3RydWN0IG1paV9waHkgKnBoeSk7CisJaW50CQkoKnJlYWRfbGluaykoc3RydWN0IG1paV9waHkgKnBoeSk7Cit9OworCisvKiBTdHJ1Y3R1cmUgdXNlZCB0byBzdGF0aWNhbGx5IGRlZmluZSBhbiBtaWkvZ2lpIGJhc2VkIFBIWSAqLworc3RydWN0IG1paV9waHlfZGVmCit7CisJdTMyCQkJCXBoeV9pZDsJCS8qIENvbmNhdGVuYXRlZCBJRDEgPDwgMTYgfCBJRDIgKi8KKwl1MzIJCQkJcGh5X2lkX21hc2s7CS8qIFNpZ25pZmljYW50IGJpdHMgKi8KKwl1MzIJCQkJZmVhdHVyZXM7CS8qIEV0aHRvb2wgU1VQUE9SVEVEXyogZGVmaW5lcyAqLworCWludAkJCQltYWdpY19hbmVnOwkvKiBBdXRvbmVnIGRvZXMgYWxsIHNwZWVkIHRlc3QgZm9yIHVzICovCisJY29uc3QgY2hhcioJCQluYW1lOworCWNvbnN0IHN0cnVjdCBtaWlfcGh5X29wcyoJb3BzOworfTsKKworLyogQW4gaW5zdGFuY2Ugb2YgYSBQSFksIHBhcnRpYWxseSBib3Jyb3dlZCBmcm9tIG1paV9pZl9pbmZvICovCitzdHJ1Y3QgbWlpX3BoeQoreworCXN0cnVjdCBtaWlfcGh5X2RlZioJZGVmOworCWludAkJCWFkdmVydGlzaW5nOworCWludAkJCW1paV9pZDsKKworCS8qIDE6IGF1dG9uZWcgZW5hYmxlZCwgMDogZGlzYWJsZWQgKi8KKwlpbnQJCQlhdXRvbmVnOworCisJLyogZm9yY2VkIHNwZWVkICYgZHVwbGV4IChubyBhdXRvbmVnKQorCSAqIHBhcnRuZXIgc3BlZWQgJiBkdXBsZXggJiBwYXVzZSAoYXV0b25lZykKKwkgKi8KKwlpbnQJCQlzcGVlZDsKKwlpbnQJCQlkdXBsZXg7CisJaW50CQkJcGF1c2U7CisKKwkvKiBQcm92aWRlZCBieSBob3N0IGNoaXAgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSoJZGV2OworCWludCAoKm1kaW9fcmVhZCkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtaWlfaWQsIGludCByZWcpOworCXZvaWQgKCptZGlvX3dyaXRlKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1paV9pZCwgaW50IHJlZywgaW50IHZhbCk7Cit9OworCisvKiBQYXNzIGluIGEgc3RydWN0IG1paV9waHkgd2l0aCBkZXYsIG1kaW9fcmVhZCBhbmQgbWRpb193cml0ZQorICogZmlsbGVkLCB0aGUgcmVtYWluaW5nIGZpZWxkcyB3aWxsIGJlIGZpbGxlZCBvbiByZXR1cm4KKyAqLworZXh0ZXJuIGludCBtaWlfcGh5X3Byb2JlKHN0cnVjdCBtaWlfcGh5ICpwaHksIGludCBtaWlfaWQpOworCisKKy8qIE1JSSBkZWZpbml0aW9ucyBtaXNzaW5nIGZyb20gbWlpLmggKi8KKworI2RlZmluZSBCTUNSX1NQRDIJMHgwMDQwCQkvKiBHaWdhYml0IGVuYWJsZSAoYmNtNTR4eCkJKi8KKyNkZWZpbmUgTFBBX1BBVVNFCTB4MDQwMAorCisvKiBNb3JlIFBIWSByZWdpc3RlcnMgKG1vZGVsIHNwZWNpZmljKSAqLworCisvKiBNSUkgQkNNNTIwMSBNVUxUSVBIWSBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX0JDTTUyMDFfSU5URVJSVVBUCQkJMHgxQQorI2RlZmluZSBNSUlfQkNNNTIwMV9JTlRFUlJVUFRfSU5URU5BQkxFCQkweDQwMDAKKworI2RlZmluZSBNSUlfQkNNNTIwMV9BVVhNT0RFMgkJCTB4MUIKKyNkZWZpbmUgTUlJX0JDTTUyMDFfQVVYTU9ERTJfTE9XUE9XRVIJCTB4MDAwOAorCisjZGVmaW5lIE1JSV9CQ001MjAxX01VTFRJUEhZICAgICAgICAgICAgICAgICAgICAweDFFCisKKy8qIE1JSSBCQ001MjAxIE1VTFRJUEhZIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgTUlJX0JDTTUyMDFfTVVMVElQSFlfU0VSSUFMTU9ERSAgICAgICAgIDB4MDAwMgorI2RlZmluZSBNSUlfQkNNNTIwMV9NVUxUSVBIWV9TVVBFUklTT0xBVEUgICAgICAgMHgwMDA4CisKKy8qIE1JSSBCQ001MjIxIEFkZGl0aW9uYWwgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1JSV9CQ001MjIxX1RFU1QJCQkweDFmCisjZGVmaW5lIE1JSV9CQ001MjIxX1RFU1RfRU5BQkxFX1NIQURPV1MJCTB4MDA4MAorI2RlZmluZSBNSUlfQkNNNTIyMV9TSERPV19BVVhfU1RBVDIJCTB4MWIKKyNkZWZpbmUgTUlJX0JDTTUyMjFfU0hET1dfQVVYX1NUQVQyX0FQRAkJMHgwMDIwCisjZGVmaW5lIE1JSV9CQ001MjIxX1NIRE9XX0FVWF9NT0RFNAkJMHgxYQorI2RlZmluZSBNSUlfQkNNNTIyMV9TSERPV19BVVhfTU9ERTRfSUREUU1PREUJMHgwMDAxCisjZGVmaW5lIE1JSV9CQ001MjIxX1NIRE9XX0FVWF9NT0RFNF9DTEtMT1BXUgkweDAwMDQKKworLyogTUlJIEJDTTU0MDAgMTAwMC1CQVNFVCBDb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9CQ001NDAwX0dCX0NPTlRST0wJCQkweDA5CisjZGVmaW5lIE1JSV9CQ001NDAwX0dCX0NPTlRST0xfRlVMTERVUExFWENBUAkweDAyMDAKKworLyogTUlJIEJDTTU0MDAgQVVYQ09OVFJPTCByZWdpc3RlciAqLworI2RlZmluZSBNSUlfQkNNNTQwMF9BVVhDT05UUk9MICAgICAgICAgICAgICAgICAgMHgxOAorI2RlZmluZSBNSUlfQkNNNTQwMF9BVVhDT05UUk9MX1BXUjEwQkFTRVQgICAgICAgMHgwMDA0CisKKy8qIE1JSSBCQ001NDAwIEFVWFNUQVRVUyByZWdpc3RlciAqLworI2RlZmluZSBNSUlfQkNNNTQwMF9BVVhTVEFUVVMgICAgICAgICAgICAgICAgICAgMHgxOQorI2RlZmluZSBNSUlfQkNNNTQwMF9BVVhTVEFUVVNfTElOS01PREVfTUFTSyAgICAgMHgwNzAwCisjZGVmaW5lIE1JSV9CQ001NDAwX0FVWFNUQVRVU19MSU5LTU9ERV9TSElGVCAgICA4ICAKKworLyogMTAwMEJUIGNvbnRyb2wgKE1hcnZlbGwgJiBCQ001NHh4IGF0IGxlYXN0KSAqLworI2RlZmluZSBNSUlfMTAwMEJBU0VUQ09OVFJPTAkJCTB4MDkKKyNkZWZpbmUgTUlJXzEwMDBCQVNFVENPTlRST0xfRlVMTERVUExFWENBUAkweDAyMDAKKyNkZWZpbmUgTUlJXzEwMDBCQVNFVENPTlRST0xfSEFMRkRVUExFWENBUAkweDAxMDAKKworLyogTWFydmVsbCA4OEUxMDExIFBIWSBjb250cm9sICovCisjZGVmaW5lIE1JSV9NMTAxMV9QSFlfU1BFQ19DT05UUk9MCQkweDEwCisjZGVmaW5lIE1JSV9NMTAxMV9QSFlfU1BFQ19DT05UUk9MX01BTlVBTF9NRElYCTB4MjAKKyNkZWZpbmUgTUlJX00xMDExX1BIWV9TUEVDX0NPTlRST0xfQVVUT19NRElYCTB4NDAKKworLyogTWFydmVsbCA4OEUxMDExIFBIWSBzdGF0dXMgKi8KKyNkZWZpbmUgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVUwkJMHgxMQorI2RlZmluZSBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTXzEwMDAJCTB4ODAwMAorI2RlZmluZSBNSUlfTTEwMTFfUEhZX1NQRUNfU1RBVFVTXzEwMAkJMHg0MDAwCisjZGVmaW5lIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVNfU1BEX01BU0sJMHhjMDAwCisjZGVmaW5lIE1JSV9NMTAxMV9QSFlfU1BFQ19TVEFUVVNfRlVMTERVUExFWAkweDIwMDAKKyNkZWZpbmUgTUlJX00xMDExX1BIWV9TUEVDX1NUQVRVU19SRVNPTFZFRAkweDA4MDAKKworI2VuZGlmIC8qIF9fU1VOR0VNX1BIWV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmhtZS5jIGIvZHJpdmVycy9uZXQvc3VuaG1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgzN2IzYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3N1bmhtZS5jCkBAIC0wLDAgKzEsMzQyNiBAQAorLyogJElkOiBzdW5obWUuYyx2IDEuMTI0IDIwMDIvMDEvMTUgMDY6MjU6NTEgZGF2ZW0gRXhwICQKKyAqIHN1bmhtZS5jOiBTcGFyYyBITUUvQmlnTWFjIDEwLzEwMGJhc2VUIGhhbGYvZnVsbCBkdXBsZXggYXV0byBzd2l0Y2hpbmcsCisgKiAgICAgICAgICAgYXV0byBjYXJyaWVyIGRldGVjdGluZyBldGhlcm5ldCBkcml2ZXIuICBBbHNvIGtub3duIGFzIHRoZQorICogICAgICAgICAgICJIYXBweSBNZWFsIEV0aGVybmV0IiBmb3VuZCBvbiBTdW5Td2lmdCBTQlVTIGNhcmRzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMiwgMjAwMyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKgorICogQ2hhbmdlcyA6CisgKiAyMDAwLzExLzExIFdpbGx5IFRhcnJlYXUgPHdpbGx5IEFUIG1ldGEteC5vcmc+CisgKiAgIC0gcG9ydCB0byBub24tc3BhcmMgYXJjaGl0ZWN0dXJlcy4gVGVzdGVkIG9ubHkgb24geDg2IGFuZAorICogICAgIG9ubHkgY3VycmVudGx5IHdvcmtzIHdpdGggUUZFIFBDSSBjYXJkcy4KKyAqICAgLSBhYmlsaXR5IHRvIHNwZWNpZnkgdGhlIE1BQyBhZGRyZXNzIGF0IG1vZHVsZSBsb2FkIHRpbWUgYnkgcGFzc2luZyB0aGlzCisgKiAgICAgYXJndW1lbnQgOiBtYWNhZGRyPTB4MDAsMHgxMCwweDIwLDB4MzAsMHg0MCwweDUwCisgKi8KKworc3RhdGljIGNoYXIgdmVyc2lvbltdID0KKyAgICAgICAgInN1bmhtZS5jOnYyLjAyIDI0L0F1Zy8yMDAzIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSlcbiI7CisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpZmRlZiBfX3NwYXJjX18KKyNpbmNsdWRlIDxhc20vaWRwcm9tLmg+CisjaW5jbHVkZSA8YXNtL3NidXMuaD4KKyNpbmNsdWRlIDxhc20vb3BlbnByb20uaD4KKyNpbmNsdWRlIDxhc20vb3BsaWIuaD4KKyNpbmNsdWRlIDxhc20vYXV4aW8uaD4KKyNpZm5kZWYgX19zcGFyY192OV9fCisjaW5jbHVkZSA8YXNtL2lvLXVuaXQuaD4KKyNlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaWZkZWYgQ09ORklHX1BDSQorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2lmZGVmIF9fc3BhcmNfXworI2luY2x1ZGUgPGFzbS9wYm0uaD4KKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJzdW5obWUuaCIKKworCisjZGVmaW5lIERSVl9OQU1FICJzdW5obWUiCisKK3N0YXRpYyBpbnQgbWFjYWRkcls2XTsKKworLyogYWNjZXB0IE1BQyBhZGRyZXNzIG9mIHRoZSBmb3JtIG1hY2FkZHI9MHgwOCwweDAwLDB4MjAsMHgzMCwweDQwLDB4NTAgKi8KK21vZHVsZV9wYXJhbV9hcnJheShtYWNhZGRyLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYWNhZGRyLCAiSGFwcHkgTWVhbCBNQUMgYWRkcmVzcyB0byBzZXQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHN0cnVjdCBoYXBweV9tZWFsICpyb290X2hhcHB5X2RldjsKKworI2lmZGVmIENPTkZJR19TQlVTCitzdGF0aWMgc3RydWN0IHF1YXR0cm8gKnFmZV9zYnVzX2xpc3Q7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBzdHJ1Y3QgcXVhdHRybyAqcWZlX3BjaV9saXN0OworI2VuZGlmCisKKyN1bmRlZiBITUVERUJVRworI3VuZGVmIFNYREVCVUcKKyN1bmRlZiBSWERFQlVHCisjdW5kZWYgVFhERUJVRworI3VuZGVmIFRYTE9HR0lORworCisjaWZkZWYgVFhMT0dHSU5HCitzdHJ1Y3QgaG1lX3R4X2xvZ2VudCB7CisJdW5zaWduZWQgaW50IHRzdGFtcDsKKwlpbnQgdHhfbmV3LCB0eF9vbGQ7CisJdW5zaWduZWQgaW50IGFjdGlvbjsKKyNkZWZpbmUgVFhMT0dfQUNUSU9OX0lSUQkweDAxCisjZGVmaW5lIFRYTE9HX0FDVElPTl9UWE1JVAkweDAyCisjZGVmaW5lIFRYTE9HX0FDVElPTl9UQlVTWQkweDA0CisjZGVmaW5lIFRYTE9HX0FDVElPTl9OQlVGUwkweDA4CisJdW5zaWduZWQgaW50IHN0YXR1czsKK307CisjZGVmaW5lIFRYX0xPR19MRU4JMTI4CitzdGF0aWMgc3RydWN0IGhtZV90eF9sb2dlbnQgdHhfbG9nW1RYX0xPR19MRU5dOworc3RhdGljIGludCB0eGxvZ19jdXJfZW50cnk7CitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHR4X2FkZF9sb2coc3RydWN0IGhhcHB5X21lYWwgKmhwLCB1bnNpZ25lZCBpbnQgYSwgdW5zaWduZWQgaW50IHMpCit7CisJc3RydWN0IGhtZV90eF9sb2dlbnQgKnRscDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2F2ZV9hbmRfY2xpKGZsYWdzKTsKKwl0bHAgPSAmdHhfbG9nW3R4bG9nX2N1cl9lbnRyeV07CisJdGxwLT50c3RhbXAgPSAodW5zaWduZWQgaW50KWppZmZpZXM7CisJdGxwLT50eF9uZXcgPSBocC0+dHhfbmV3OworCXRscC0+dHhfb2xkID0gaHAtPnR4X29sZDsKKwl0bHAtPmFjdGlvbiA9IGE7CisJdGxwLT5zdGF0dXMgPSBzOworCXR4bG9nX2N1cl9lbnRyeSA9ICh0eGxvZ19jdXJfZW50cnkgKyAxKSAmIChUWF9MT0dfTEVOIC0gMSk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHR4X2R1bXBfbG9nKHZvaWQpCit7CisJaW50IGksIHRoaXM7CisKKwl0aGlzID0gdHhsb2dfY3VyX2VudHJ5OworCWZvciAoaSA9IDA7IGkgPCBUWF9MT0dfTEVOOyBpKyspIHsKKwkJcHJpbnRrKCJUWExPR1slZF06IGpbJTA4eF0gdHhbTiglZClPKCVkKV0gYWN0aW9uWyUwOHhdIHN0YXRbJTA4eF1cbiIsIGksCisJCSAgICAgICB0eF9sb2dbdGhpc10udHN0YW1wLAorCQkgICAgICAgdHhfbG9nW3RoaXNdLnR4X25ldywgdHhfbG9nW3RoaXNdLnR4X29sZCwKKwkJICAgICAgIHR4X2xvZ1t0aGlzXS5hY3Rpb24sIHR4X2xvZ1t0aGlzXS5zdGF0dXMpOworCQl0aGlzID0gKHRoaXMgKyAxKSAmIChUWF9MT0dfTEVOIC0gMSk7CisJfQorfQorc3RhdGljIF9faW5saW5lX18gdm9pZCB0eF9kdW1wX3Jpbmcoc3RydWN0IGhhcHB5X21lYWwgKmhwKQoreworCXN0cnVjdCBobWVhbF9pbml0X2Jsb2NrICpoYiA9IGhwLT5oYXBweV9ibG9jazsKKwlzdHJ1Y3QgaGFwcHlfbWVhbF90eGQgKnRwID0gJmhiLT5oYXBweV9tZWFsX3R4ZFswXTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrPTQpIHsKKwkJcHJpbnRrKCJUWERbJWQuLiVkXTogWyUwOHg6JTA4eF0gWyUwOHg6JTA4eF0gWyUwOHg6JTA4eF0gWyUwOHg6JTA4eF1cbiIsCisJCSAgICAgICBpLCBpICsgNCwKKwkJICAgICAgIGxlMzJfdG9fY3B1KHRwW2ldLnR4X2ZsYWdzKSwgbGUzMl90b19jcHUodHBbaV0udHhfYWRkciksCisJCSAgICAgICBsZTMyX3RvX2NwdSh0cFtpICsgMV0udHhfZmxhZ3MpLCBsZTMyX3RvX2NwdSh0cFtpICsgMV0udHhfYWRkciksCisJCSAgICAgICBsZTMyX3RvX2NwdSh0cFtpICsgMl0udHhfZmxhZ3MpLCBsZTMyX3RvX2NwdSh0cFtpICsgMl0udHhfYWRkciksCisJCSAgICAgICBsZTMyX3RvX2NwdSh0cFtpICsgM10udHhfZmxhZ3MpLCBsZTMyX3RvX2NwdSh0cFtpICsgM10udHhfYWRkcikpOworCX0KK30KKyNlbHNlCisjZGVmaW5lIHR4X2FkZF9sb2coaHAsIGEsIHMpCQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgdHhfZHVtcF9sb2coKQkJCWRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSB0eF9kdW1wX3JpbmcoaHApCQlkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisjaWZkZWYgSE1FREVCVUcKKyNkZWZpbmUgSE1EKHgpICBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgSE1EKHgpCisjZW5kaWYKKworLyogI2RlZmluZSBBVVRPX1NXSVRDSF9ERUJVRyAqLworCisjaWZkZWYgQVVUT19TV0lUQ0hfREVCVUcKKyNkZWZpbmUgQVNEKHgpICBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgQVNEKHgpCisjZW5kaWYKKworI2RlZmluZSBERUZBVUxUX0lQRzAgICAgICAxNiAvKiBGb3IgbGFuY2UtbW9kZSBvbmx5ICovCisjZGVmaW5lIERFRkFVTFRfSVBHMSAgICAgICA4IC8qIEZvciBhbGwgbW9kZXMgKi8KKyNkZWZpbmUgREVGQVVMVF9JUEcyICAgICAgIDQgLyogRm9yIGFsbCBtb2RlcyAqLworI2RlZmluZSBERUZBVUxUX0pBTVNJWkUgICAgNCAvKiBUb2UgamFtICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpICYmIGRlZmluZWQoTU9EVUxFKQorLyogVGhpcyBoYXBweV9wY2lfaWRzIGlzIGRlY2xhcmVkIF9faW5pdGRhdGEgYmVjYXVzZSBpdCBpcyBvbmx5IHVzZWQKKyAgIGFzIGFuIGFkdmlzb3J5IHRvIGRlcG1vZC4gIElmIHRoaXMgaXMgcG9ydGVkIHRvIHRoZSBuZXcgUENJIGludGVyZmFjZQorICAgd2hlcmUgaXQgY291bGQgYmUgcmVmZXJlbmNlZCBhdCBhbnkgdGltZSBkdWUgdG8gaG90IHBsdWdnaW5nLAorICAgdGhlIF9faW5pdGRhdGEgcmVmZXJlbmNlIHNob3VsZCBiZSByZW1vdmVkLiAqLworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaGFwcHltZWFsX3BjaV9pZHNbXSA9IHsKKwl7CisJICAudmVuZG9yCT0gUENJX1ZFTkRPUl9JRF9TVU4sCisJICAuZGV2aWNlCT0gUENJX0RFVklDRV9JRF9TVU5fSEFQUFlNRUFMLAorCSAgLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJICAuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwl9LAorCXsgfQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaGFwcHltZWFsX3BjaV9pZHMpOworCisjZW5kaWYKKworLyogTk9URTogSW4gdGhlIGRlc2NyaXB0b3Igd3JpdGVzIG9uZSBfbXVzdF8gd3JpdGUgdGhlIGFkZHJlc3MKKyAqCSBtZW1iZXIgX2ZpcnN0Xy4gIFRoZSBjYXJkIG11c3Qgbm90IGJlIGFsbG93ZWQgdG8gc2VlCisgKgkgdGhlIHVwZGF0ZWQgZGVzY3JpcHRvciBmbGFncyB1bnRpbCB0aGUgYWRkcmVzcyBpcworICoJIGNvcnJlY3QuICBJJ3ZlIGFkZGVkIGEgd3JpdGUgbWVtb3J5IGJhcnJpZXIgYmV0d2VlbgorICoJIHRoZSB0d28gc3RvcmVzIHNvIHRoYXQgSSBjYW4gc2xlZXAgd2VsbCBhdCBuaWdodC4uLiAtRGF2ZU0KKyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU0JVUykgJiYgZGVmaW5lZChDT05GSUdfUENJKQorc3RhdGljIHZvaWQgc2J1c19obWVfd3JpdGUzMih2b2lkIF9faW9tZW0gKnJlZywgdTMyIHZhbCkKK3sKKwlzYnVzX3dyaXRlbCh2YWwsIHJlZyk7Cit9CisKK3N0YXRpYyB1MzIgc2J1c19obWVfcmVhZDMyKHZvaWQgX19pb21lbSAqcmVnKQoreworCXJldHVybiBzYnVzX3JlYWRsKHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHNidXNfaG1lX3dyaXRlX3J4ZChzdHJ1Y3QgaGFwcHlfbWVhbF9yeGQgKnJ4ZCwgdTMyIGZsYWdzLCB1MzIgYWRkcikKK3sKKwlyeGQtPnJ4X2FkZHIgPSBhZGRyOworCXdtYigpOworCXJ4ZC0+cnhfZmxhZ3MgPSBmbGFnczsKK30KKworc3RhdGljIHZvaWQgc2J1c19obWVfd3JpdGVfdHhkKHN0cnVjdCBoYXBweV9tZWFsX3R4ZCAqdHhkLCB1MzIgZmxhZ3MsIHUzMiBhZGRyKQoreworCXR4ZC0+dHhfYWRkciA9IGFkZHI7CisJd21iKCk7CisJdHhkLT50eF9mbGFncyA9IGZsYWdzOworfQorCitzdGF0aWMgdTMyIHNidXNfaG1lX3JlYWRfZGVzYzMyKHUzMiAqcCkKK3sKKwlyZXR1cm4gKnA7Cit9CisKK3N0YXRpYyB2b2lkIHBjaV9obWVfd3JpdGUzMih2b2lkIF9faW9tZW0gKnJlZywgdTMyIHZhbCkKK3sKKwl3cml0ZWwodmFsLCByZWcpOworfQorCitzdGF0aWMgdTMyIHBjaV9obWVfcmVhZDMyKHZvaWQgX19pb21lbSAqcmVnKQoreworCXJldHVybiByZWFkbChyZWcpOworfQorCitzdGF0aWMgdm9pZCBwY2lfaG1lX3dyaXRlX3J4ZChzdHJ1Y3QgaGFwcHlfbWVhbF9yeGQgKnJ4ZCwgdTMyIGZsYWdzLCB1MzIgYWRkcikKK3sKKwlyeGQtPnJ4X2FkZHIgPSBjcHVfdG9fbGUzMihhZGRyKTsKKwl3bWIoKTsKKwlyeGQtPnJ4X2ZsYWdzID0gY3B1X3RvX2xlMzIoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBwY2lfaG1lX3dyaXRlX3R4ZChzdHJ1Y3QgaGFwcHlfbWVhbF90eGQgKnR4ZCwgdTMyIGZsYWdzLCB1MzIgYWRkcikKK3sKKwl0eGQtPnR4X2FkZHIgPSBjcHVfdG9fbGUzMihhZGRyKTsKKwl3bWIoKTsKKwl0eGQtPnR4X2ZsYWdzID0gY3B1X3RvX2xlMzIoZmxhZ3MpOworfQorCitzdGF0aWMgdTMyIHBjaV9obWVfcmVhZF9kZXNjMzIodTMyICpwKQoreworCXJldHVybiBjcHVfdG9fbGUzMnAocCk7Cit9CisKKyNkZWZpbmUgaG1lX3dyaXRlMzIoX19ocCwgX19yZWcsIF9fdmFsKSBcCisJKChfX2hwKS0+d3JpdGUzMigoX19yZWcpLCAoX192YWwpKSkKKyNkZWZpbmUgaG1lX3JlYWQzMihfX2hwLCBfX3JlZykgXAorCSgoX19ocCktPnJlYWQzMihfX3JlZykpCisjZGVmaW5lIGhtZV93cml0ZV9yeGQoX19ocCwgX19yeGQsIF9fZmxhZ3MsIF9fYWRkcikgXAorCSgoX19ocCktPndyaXRlX3J4ZCgoX19yeGQpLCAoX19mbGFncyksIChfX2FkZHIpKSkKKyNkZWZpbmUgaG1lX3dyaXRlX3R4ZChfX2hwLCBfX3R4ZCwgX19mbGFncywgX19hZGRyKSBcCisJKChfX2hwKS0+d3JpdGVfdHhkKChfX3R4ZCksIChfX2ZsYWdzKSwgKF9fYWRkcikpKQorI2RlZmluZSBobWVfcmVhZF9kZXNjMzIoX19ocCwgX19wKSBcCisJKChfX2hwKS0+cmVhZF9kZXNjMzIoX19wKSkKKyNkZWZpbmUgaG1lX2RtYV9tYXAoX19ocCwgX19wdHIsIF9fc2l6ZSwgX19kaXIpIFwKKwkoKF9faHApLT5kbWFfbWFwKChfX2hwKS0+aGFwcHlfZGV2LCAoX19wdHIpLCAoX19zaXplKSwgKF9fZGlyKSkpCisjZGVmaW5lIGhtZV9kbWFfdW5tYXAoX19ocCwgX19hZGRyLCBfX3NpemUsIF9fZGlyKSBcCisJKChfX2hwKS0+ZG1hX3VubWFwKChfX2hwKS0+aGFwcHlfZGV2LCAoX19hZGRyKSwgKF9fc2l6ZSksIChfX2RpcikpKQorI2RlZmluZSBobWVfZG1hX3N5bmNfZm9yX2NwdShfX2hwLCBfX2FkZHIsIF9fc2l6ZSwgX19kaXIpIFwKKwkoKF9faHApLT5kbWFfc3luY19mb3JfY3B1KChfX2hwKS0+aGFwcHlfZGV2LCAoX19hZGRyKSwgKF9fc2l6ZSksIChfX2RpcikpKQorI2RlZmluZSBobWVfZG1hX3N5bmNfZm9yX2RldmljZShfX2hwLCBfX2FkZHIsIF9fc2l6ZSwgX19kaXIpIFwKKwkoKF9faHApLT5kbWFfc3luY19mb3JfZGV2aWNlKChfX2hwKS0+aGFwcHlfZGV2LCAoX19hZGRyKSwgKF9fc2l6ZSksIChfX2RpcikpKQorI2Vsc2UKKyNpZmRlZiBDT05GSUdfU0JVUworLyogU0JVUyBvbmx5IGNvbXBpbGF0aW9uICovCisjZGVmaW5lIGhtZV93cml0ZTMyKF9faHAsIF9fcmVnLCBfX3ZhbCkgXAorCXNidXNfd3JpdGVsKChfX3ZhbCksIChfX3JlZykpCisjZGVmaW5lIGhtZV9yZWFkMzIoX19ocCwgX19yZWcpIFwKKwlzYnVzX3JlYWRsKF9fcmVnKQorI2RlZmluZSBobWVfd3JpdGVfcnhkKF9faHAsIF9fcnhkLCBfX2ZsYWdzLCBfX2FkZHIpIFwKK2RvIHsJKF9fcnhkKS0+cnhfYWRkciA9IChfX2FkZHIpOyBcCisJd21iKCk7IFwKKwkoX19yeGQpLT5yeF9mbGFncyA9IChfX2ZsYWdzKTsgXAorfSB3aGlsZSgwKQorI2RlZmluZSBobWVfd3JpdGVfdHhkKF9faHAsIF9fdHhkLCBfX2ZsYWdzLCBfX2FkZHIpIFwKK2RvIHsJKF9fdHhkKS0+dHhfYWRkciA9IChfX2FkZHIpOyBcCisJd21iKCk7IFwKKwkoX190eGQpLT50eF9mbGFncyA9IChfX2ZsYWdzKTsgXAorfSB3aGlsZSgwKQorI2RlZmluZSBobWVfcmVhZF9kZXNjMzIoX19ocCwgX19wKQkoKihfX3ApKQorI2RlZmluZSBobWVfZG1hX21hcChfX2hwLCBfX3B0ciwgX19zaXplLCBfX2RpcikgXAorCXNidXNfbWFwX3NpbmdsZSgoX19ocCktPmhhcHB5X2RldiwgKF9fcHRyKSwgKF9fc2l6ZSksIChfX2RpcikpCisjZGVmaW5lIGhtZV9kbWFfdW5tYXAoX19ocCwgX19hZGRyLCBfX3NpemUsIF9fZGlyKSBcCisJc2J1c191bm1hcF9zaW5nbGUoKF9faHApLT5oYXBweV9kZXYsIChfX2FkZHIpLCAoX19zaXplKSwgKF9fZGlyKSkKKyNkZWZpbmUgaG1lX2RtYV9zeW5jX2Zvcl9jcHUoX19ocCwgX19hZGRyLCBfX3NpemUsIF9fZGlyKSBcCisJc2J1c19kbWFfc3luY19zaW5nbGVfZm9yX2NwdSgoX19ocCktPmhhcHB5X2RldiwgKF9fYWRkciksIChfX3NpemUpLCAoX19kaXIpKQorI2RlZmluZSBobWVfZG1hX3N5bmNfZm9yX2RldmljZShfX2hwLCBfX2FkZHIsIF9fc2l6ZSwgX19kaXIpIFwKKwlzYnVzX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKChfX2hwKS0+aGFwcHlfZGV2LCAoX19hZGRyKSwgKF9fc2l6ZSksIChfX2RpcikpCisjZWxzZQorLyogUENJIG9ubHkgY29tcGlsYXRpb24gKi8KKyNkZWZpbmUgaG1lX3dyaXRlMzIoX19ocCwgX19yZWcsIF9fdmFsKSBcCisJd3JpdGVsKChfX3ZhbCksIChfX3JlZykpCisjZGVmaW5lIGhtZV9yZWFkMzIoX19ocCwgX19yZWcpIFwKKwlyZWFkbChfX3JlZykKKyNkZWZpbmUgaG1lX3dyaXRlX3J4ZChfX2hwLCBfX3J4ZCwgX19mbGFncywgX19hZGRyKSBcCitkbyB7CShfX3J4ZCktPnJ4X2FkZHIgPSBjcHVfdG9fbGUzMihfX2FkZHIpOyBcCisJd21iKCk7IFwKKwkoX19yeGQpLT5yeF9mbGFncyA9IGNwdV90b19sZTMyKF9fZmxhZ3MpOyBcCit9IHdoaWxlKDApCisjZGVmaW5lIGhtZV93cml0ZV90eGQoX19ocCwgX190eGQsIF9fZmxhZ3MsIF9fYWRkcikgXAorZG8gewkoX190eGQpLT50eF9hZGRyID0gY3B1X3RvX2xlMzIoX19hZGRyKTsgXAorCXdtYigpOyBcCisJKF9fdHhkKS0+dHhfZmxhZ3MgPSBjcHVfdG9fbGUzMihfX2ZsYWdzKTsgXAorfSB3aGlsZSgwKQorI2RlZmluZSBobWVfcmVhZF9kZXNjMzIoX19ocCwgX19wKQljcHVfdG9fbGUzMnAoX19wKQorI2RlZmluZSBobWVfZG1hX21hcChfX2hwLCBfX3B0ciwgX19zaXplLCBfX2RpcikgXAorCXBjaV9tYXBfc2luZ2xlKChfX2hwKS0+aGFwcHlfZGV2LCAoX19wdHIpLCAoX19zaXplKSwgKF9fZGlyKSkKKyNkZWZpbmUgaG1lX2RtYV91bm1hcChfX2hwLCBfX2FkZHIsIF9fc2l6ZSwgX19kaXIpIFwKKwlwY2lfdW5tYXBfc2luZ2xlKChfX2hwKS0+aGFwcHlfZGV2LCAoX19hZGRyKSwgKF9fc2l6ZSksIChfX2RpcikpCisjZGVmaW5lIGhtZV9kbWFfc3luY19mb3JfY3B1KF9faHAsIF9fYWRkciwgX19zaXplLCBfX2RpcikgXAorCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdSgoX19ocCktPmhhcHB5X2RldiwgKF9fYWRkciksIChfX3NpemUpLCAoX19kaXIpKQorI2RlZmluZSBobWVfZG1hX3N5bmNfZm9yX2RldmljZShfX2hwLCBfX2FkZHIsIF9fc2l6ZSwgX19kaXIpIFwKKwlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoKF9faHApLT5oYXBweV9kZXYsIChfX2FkZHIpLCAoX19zaXplKSwgKF9fZGlyKSkKKyNlbmRpZgorI2VuZGlmCisKKworI2lmZGVmIFNCVVNfRE1BX0JJRElSRUNUSU9OQUwKKyMJZGVmaW5lIERNQV9CSURJUkVDVElPTkFMCVNCVVNfRE1BX0JJRElSRUNUSU9OQUwKKyNlbHNlCisjCWRlZmluZSBETUFfQklESVJFQ1RJT05BTAkwCisjZW5kaWYKKworI2lmZGVmIFNCVVNfRE1BX0ZST01ERVZJQ0UKKyMJZGVmaW5lIERNQV9GUk9NREVWSUNFCQlTQlVTX0RNQV9GUk9NREVWSUNFCisjZWxzZQorIwlkZWZpbmUgRE1BX1RPREVWSUNFCQkxCisjZW5kaWYKKworI2lmZGVmIFNCVVNfRE1BX1RPREVWSUNFCisjCWRlZmluZSBETUFfVE9ERVZJQ0UJCVNCVVNfRE1BX1RPREVWSUNFCisjZWxzZQorIwlkZWZpbmUgRE1BX0ZST01ERVZJQ0UJCTIKKyNlbmRpZgorCisKKy8qIE9oIHllcywgdGhlIE1JRiBCaXRCYW5nIGlzIG1pZ2h0eSBmdW4gdG8gcHJvZ3JhbS4gIEJpdEJ1Y2tldCBpcyBtb3JlIGxpa2UgaXQuICovCitzdGF0aWMgdm9pZCBCQl9QVVRfQklUKHN0cnVjdCBoYXBweV9tZWFsICpocCwgdm9pZCBfX2lvbWVtICp0cmVncywgaW50IGJpdCkKK3sKKwlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0JCREFUQSwgYml0KTsKKwlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0JCQ0xPQ0ssIDApOworCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQkJDTE9DSywgMSk7Cit9CisKKyNpZiAwCitzdGF0aWMgdTMyIEJCX0dFVF9CSVQoc3RydWN0IGhhcHB5X21lYWwgKmhwLCB2b2lkIF9faW9tZW0gKnRyZWdzLCBpbnQgaW50ZXJuYWwpCit7CisJdTMyIHJldDsKKworCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQkJDTE9DSywgMCk7CisJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9CQkNMT0NLLCAxKTsKKwlyZXQgPSBobWVfcmVhZDMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHKTsKKwlpZiAoaW50ZXJuYWwpCisJCXJldCAmPSBUQ1ZfQ0ZHX01ESU8wOworCWVsc2UKKwkJcmV0ICY9IFRDVl9DRkdfTURJTzE7CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKK3N0YXRpYyB1MzIgQkJfR0VUX0JJVDIoc3RydWN0IGhhcHB5X21lYWwgKmhwLCB2b2lkIF9faW9tZW0gKnRyZWdzLCBpbnQgaW50ZXJuYWwpCit7CisJdTMyIHJldHZhbDsKKworCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQkJDTE9DSywgMCk7CisJdWRlbGF5KDEpOworCXJldHZhbCA9IGhtZV9yZWFkMzIoaHAsIHRyZWdzICsgVENWUl9DRkcpOworCWlmIChpbnRlcm5hbCkKKwkJcmV0dmFsICY9IFRDVl9DRkdfTURJTzA7CisJZWxzZQorCQlyZXR2YWwgJj0gVENWX0NGR19NRElPMTsKKwlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0JCQ0xPQ0ssIDEpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworI2RlZmluZSBUQ1ZSX0ZBSUxVUkUgICAgICAweDgwMDAwMDAwICAgICAvKiBJbXBvc3NpYmxlIE1JRiByZWFkIHZhbHVlICovCisKK3N0YXRpYyBpbnQgaGFwcHlfbWVhbF9iYl9yZWFkKHN0cnVjdCBoYXBweV9tZWFsICpocCwKKwkJCSAgICAgIHZvaWQgX19pb21lbSAqdHJlZ3MsIGludCByZWcpCit7CisJdTMyIHRtcDsKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgaTsKKworCUFTRCgoImhhcHB5X21lYWxfYmJfcmVhZDogcmVnPSVkICIsIHJlZykpOworCisJLyogRW5hYmxlIHRoZSBNSUYgQml0QmFuZyBvdXRwdXRzLiAqLworCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQkJPRU5BQiwgMSk7CisKKwkvKiBGb3JjZSBCaXRCYW5nIGludG8gdGhlIGlkbGUgc3RhdGUuICovCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCUJCX1BVVF9CSVQoaHAsIHRyZWdzLCAxKTsKKworCS8qIEdpdmUgaXQgdGhlIHJlYWQgc2VxdWVuY2UuICovCisJQkJfUFVUX0JJVChocCwgdHJlZ3MsIDApOworCUJCX1BVVF9CSVQoaHAsIHRyZWdzLCAxKTsKKwlCQl9QVVRfQklUKGhwLCB0cmVncywgMSk7CisJQkJfUFVUX0JJVChocCwgdHJlZ3MsIDApOworCisJLyogR2l2ZSBpdCB0aGUgUEhZIGFkZHJlc3MuICovCisJdG1wID0gaHAtPnBhZGRyICYgMHhmZjsKKwlmb3IgKGkgPSA0OyBpID49IDA7IGktLSkKKwkJQkJfUFVUX0JJVChocCwgdHJlZ3MsICgodG1wID4+IGkpICYgMSkpOworCisJLyogVGVsbCBpdCB3aGF0IHJlZ2lzdGVyIHdlIHdhbnQgdG8gcmVhZC4gKi8KKwl0bXAgPSAocmVnICYgMHhmZik7CisJZm9yIChpID0gNDsgaSA+PSAwOyBpLS0pCisJCUJCX1BVVF9CSVQoaHAsIHRyZWdzLCAoKHRtcCA+PiBpKSAmIDEpKTsKKworCS8qIENsb3NlIGRvd24gdGhlIE1JRiBCaXRCYW5nIG91dHB1dHMuICovCisJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9CQk9FTkFCLCAwKTsKKworCS8qIE5vdyByZWFkIGluIHRoZSB2YWx1ZS4gKi8KKwkodm9pZCkgQkJfR0VUX0JJVDIoaHAsIHRyZWdzLCAoaHAtPnRjdnJfdHlwZSA9PSBpbnRlcm5hbCkpOworCWZvciAoaSA9IDE1OyBpID49IDA7IGktLSkKKwkJcmV0dmFsIHw9IEJCX0dFVF9CSVQyKGhwLCB0cmVncywgKGhwLT50Y3ZyX3R5cGUgPT0gaW50ZXJuYWwpKTsKKwkodm9pZCkgQkJfR0VUX0JJVDIoaHAsIHRyZWdzLCAoaHAtPnRjdnJfdHlwZSA9PSBpbnRlcm5hbCkpOworCSh2b2lkKSBCQl9HRVRfQklUMihocCwgdHJlZ3MsIChocC0+dGN2cl90eXBlID09IGludGVybmFsKSk7CisJKHZvaWQpIEJCX0dFVF9CSVQyKGhwLCB0cmVncywgKGhwLT50Y3ZyX3R5cGUgPT0gaW50ZXJuYWwpKTsKKwlBU0QoKCJ2YWx1ZT0leFxuIiwgcmV0dmFsKSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgaGFwcHlfbWVhbF9iYl93cml0ZShzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsCisJCQkJdm9pZCBfX2lvbWVtICp0cmVncywgaW50IHJlZywKKwkJCQl1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKK3sKKwl1MzIgdG1wOworCWludCBpOworCisJQVNEKCgiaGFwcHlfbWVhbF9iYl93cml0ZTogcmVnPSVkIHZhbHVlPSV4XG4iLCByZWcsIHZhbHVlKSk7CisKKwkvKiBFbmFibGUgdGhlIE1JRiBCaXRCYW5nIG91dHB1dHMuICovCisJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9CQk9FTkFCLCAxKTsKKworCS8qIEZvcmNlIEJpdEJhbmcgaW50byB0aGUgaWRsZSBzdGF0ZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJQkJfUFVUX0JJVChocCwgdHJlZ3MsIDEpOworCisJLyogR2l2ZSBpdCB3cml0ZSBzZXF1ZW5jZS4gKi8KKwlCQl9QVVRfQklUKGhwLCB0cmVncywgMCk7CisJQkJfUFVUX0JJVChocCwgdHJlZ3MsIDEpOworCUJCX1BVVF9CSVQoaHAsIHRyZWdzLCAwKTsKKwlCQl9QVVRfQklUKGhwLCB0cmVncywgMSk7CisKKwkvKiBHaXZlIGl0IHRoZSBQSFkgYWRkcmVzcy4gKi8KKwl0bXAgPSAoaHAtPnBhZGRyICYgMHhmZik7CisJZm9yIChpID0gNDsgaSA+PSAwOyBpLS0pCisJCUJCX1BVVF9CSVQoaHAsIHRyZWdzLCAoKHRtcCA+PiBpKSAmIDEpKTsKKworCS8qIFRlbGwgaXQgd2hhdCByZWdpc3RlciB3ZSB3aWxsIGJlIHdyaXRpbmcuICovCisJdG1wID0gKHJlZyAmIDB4ZmYpOworCWZvciAoaSA9IDQ7IGkgPj0gMDsgaS0tKQorCQlCQl9QVVRfQklUKGhwLCB0cmVncywgKCh0bXAgPj4gaSkgJiAxKSk7CisKKwkvKiBUZWxsIGl0IHRvIGJlY29tZSByZWFkeSBmb3IgdGhlIGJpdHMuICovCisJQkJfUFVUX0JJVChocCwgdHJlZ3MsIDEpOworCUJCX1BVVF9CSVQoaHAsIHRyZWdzLCAwKTsKKworCWZvciAoaSA9IDE1OyBpID49IDA7IGktLSkKKwkJQkJfUFVUX0JJVChocCwgdHJlZ3MsICgodmFsdWUgPj4gaSkgJiAxKSk7CisKKwkvKiBDbG9zZSBkb3duIHRoZSBNSUYgQml0QmFuZyBvdXRwdXRzLiAqLworCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQkJPRU5BQiwgMCk7Cit9CisKKyNkZWZpbmUgVENWUl9SRUFEX1RSSUVTICAgMTYKKworc3RhdGljIGludCBoYXBweV9tZWFsX3RjdnJfcmVhZChzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsCisJCQkJdm9pZCBfX2lvbWVtICp0cmVncywgaW50IHJlZykKK3sKKwlpbnQgdHJpZXMgPSBUQ1ZSX1JFQURfVFJJRVM7CisJaW50IHJldHZhbDsKKworCUFTRCgoImhhcHB5X21lYWxfdGN2cl9yZWFkOiByZWc9MHglMDJ4ICIsIHJlZykpOworCWlmIChocC0+dGN2cl90eXBlID09IG5vbmUpIHsKKwkJQVNEKCgibm8gdHJhbnNjZWl2ZXIsIHZhbHVlPVRDVlJfRkFJTFVSRVxuIikpOworCQlyZXR1cm4gVENWUl9GQUlMVVJFOworCX0KKworCWlmICghKGhwLT5oYXBweV9mbGFncyAmIEhGTEFHX0ZFTkFCTEUpKSB7CisJCUFTRCgoImRvaW5nIGJpdCBiYW5nXG4iKSk7CisJCXJldHVybiBoYXBweV9tZWFsX2JiX3JlYWQoaHAsIHRyZWdzLCByZWcpOworCX0KKworCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfRlJBTUUsCisJCSAgICAoRlJBTUVfUkVBRCB8IChocC0+cGFkZHIgPDwgMjMpIHwgKChyZWcgJiAweGZmKSA8PCAxOCkpKTsKKwl3aGlsZSAoIShobWVfcmVhZDMyKGhwLCB0cmVncyArIFRDVlJfRlJBTUUpICYgMHgxMDAwMCkgJiYgLS10cmllcykKKwkJdWRlbGF5KDIwKTsKKwlpZiAoIXRyaWVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHkgbWVhbDogQWllZWUsIHRyYW5zY2VpdmVyIE1JRiByZWFkIGJvbGl4ZWRcbiIpOworCQlyZXR1cm4gVENWUl9GQUlMVVJFOworCX0KKwlyZXR2YWwgPSBobWVfcmVhZDMyKGhwLCB0cmVncyArIFRDVlJfRlJBTUUpICYgMHhmZmZmOworCUFTRCgoInZhbHVlPSUwNHhcbiIsIHJldHZhbCkpOworCXJldHVybiByZXR2YWw7Cit9CisKKyNkZWZpbmUgVENWUl9XUklURV9UUklFUyAgMTYKKworc3RhdGljIHZvaWQgaGFwcHlfbWVhbF90Y3ZyX3dyaXRlKHN0cnVjdCBoYXBweV9tZWFsICpocCwKKwkJCQkgIHZvaWQgX19pb21lbSAqdHJlZ3MsIGludCByZWcsCisJCQkJICB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKK3sKKwlpbnQgdHJpZXMgPSBUQ1ZSX1dSSVRFX1RSSUVTOworCQorCUFTRCgoImhhcHB5X21lYWxfdGN2cl93cml0ZTogcmVnPTB4JTAyeCB2YWx1ZT0lMDR4XG4iLCByZWcsIHZhbHVlKSk7CisKKwkvKiBXZWxjb21lIHRvIFN1biBNaWNyb3N5c3RlbXMsIGNhbiBJIHRha2UgeW91ciBvcmRlciBwbGVhc2U/ICovCisJaWYgKCEoaHAtPmhhcHB5X2ZsYWdzICYgSEZMQUdfRkVOQUJMRSkpIHsKKwkJaGFwcHlfbWVhbF9iYl93cml0ZShocCwgdHJlZ3MsIHJlZywgdmFsdWUpOworCQlyZXR1cm47CisJfQorCisJLyogV291bGQgeW91IGxpa2UgZnJpZXMgd2l0aCB0aGF0PyAqLworCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfRlJBTUUsCisJCSAgICAoRlJBTUVfV1JJVEUgfCAoaHAtPnBhZGRyIDw8IDIzKSB8CisJCSAgICAgKChyZWcgJiAweGZmKSA8PCAxOCkgfCAodmFsdWUgJiAweGZmZmYpKSk7CisJd2hpbGUgKCEoaG1lX3JlYWQzMihocCwgdHJlZ3MgKyBUQ1ZSX0ZSQU1FKSAmIDB4MTAwMDApICYmIC0tdHJpZXMpCisJCXVkZWxheSgyMCk7CisKKwkvKiBBbnl0aGluZyBlbHNlPyAqLworCWlmICghdHJpZXMpCisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHkgbWVhbDogQWllZWUsIHRyYW5zY2VpdmVyIE1JRiB3cml0ZSBib2xpeGVkXG4iKTsKKworCS8qIEZpZnR5LXR3byBjZW50cyBpcyB5b3VyIGNoYW5nZSwgaGF2ZSBhIG5pY2UgZGF5LiAqLworfQorCisvKiBBdXRvIG5lZ290aWF0aW9uLiAgVGhlIHNjaGVtZSBpcyB2ZXJ5IHNpbXBsZS4gIFdlIGhhdmUgYSB0aW1lciByb3V0aW5lCisgKiB0aGF0IGtlZXBzIHdhdGNoaW5nIHRoZSBhdXRvIG5lZ290aWF0aW9uIHByb2Nlc3MgYXMgaXQgcHJvZ3Jlc3Nlcy4KKyAqIFRoZSBEUDgzODQwIGlzIGZpcnN0IHRvbGQgdG8gc3RhcnQgZG9pbmcgaXQncyB0aGluZywgd2Ugc2V0IHVwIHRoZSB0aW1lCisgKiBhbmQgcGxhY2UgdGhlIHRpbWVyIHN0YXRlIG1hY2hpbmUgaW4gaXQncyBpbml0aWFsIHN0YXRlLgorICoKKyAqIEhlcmUgdGhlIHRpbWVyIHBlZWtzIGF0IHRoZSBEUDgzODQwIHN0YXR1cyByZWdpc3RlcnMgYXQgZWFjaCBjbGljayB0byBzZWUKKyAqIGlmIHRoZSBhdXRvIG5lZ290aWF0aW9uIGhhcyBjb21wbGV0ZWQsIHdlIGFzc3VtZSBoZXJlIHRoYXQgdGhlIERQODM4NDAgUEhZCisgKiB3aWxsIHRpbWUgb3V0IGF0IHNvbWUgcG9pbnQgYW5kIGp1c3QgdGVsbCB1cyB3aGF0IChkaWRuJ3QpIGhhcHBlbi4gIEZvcgorICogY29tcGxldGUgY292ZXJhZ2Ugd2Ugb25seSBhbGxvdyBzbyBtYW55IG9mIHRoZSB0aWNrcyBhdCB0aGlzIGxldmVsIHRvIHJ1biwKKyAqIHdoZW4gdGhpcyBoYXMgZXhwaXJlZCB3ZSBwcmludCBhIHdhcm5pbmcgbWVzc2FnZSBhbmQgdHJ5IGFub3RoZXIgc3RyYXRlZ3kuCisgKiBUaGlzICJvdGhlciIgc3RyYXRlZ3kgaXMgdG8gZm9yY2UgdGhlIGludGVyZmFjZSBpbnRvIHZhcmlvdXMgc3BlZWQvZHVwbGV4CisgKiBjb25maWd1cmF0aW9ucyBhbmQgd2Ugc3RvcCB3aGVuIHdlIHNlZSBhIGxpbmstdXAgY29uZGl0aW9uIGJlZm9yZSB0aGUKKyAqIG1heGltdW0gbnVtYmVyIG9mICJwZWVrIiB0aWNrcyBoYXZlIG9jY3VycmVkLgorICoKKyAqIE9uY2UgYSB2YWxpZCBsaW5rIHN0YXR1cyBoYXMgYmVlbiBkZXRlY3RlZCB3ZSBjb25maWd1cmUgdGhlIEJpZ01BQyBhbmQKKyAqIHRoZSByZXN0IG9mIHRoZSBIYXBweSBNZWFsIHRvIHNwZWFrIHRoZSBtb3N0IGVmZmljaWVudCBwcm90b2NvbCB3ZSBjb3VsZAorICogZ2V0IGEgY2xlYW4gbGluayBmb3IuICBUaGUgcHJpb3JpdHkgZm9yIGxpbmsgY29uZmlndXJhdGlvbnMsIGhpZ2hlc3QgZmlyc3QKKyAqIGlzOgorICogICAgICAgICAgICAgICAgIDEwMCBCYXNlLVQgRnVsbCBEdXBsZXgKKyAqICAgICAgICAgICAgICAgICAxMDAgQmFzZS1UIEhhbGYgRHVwbGV4CisgKiAgICAgICAgICAgICAgICAgMTAgQmFzZS1UIEZ1bGwgRHVwbGV4CisgKiAgICAgICAgICAgICAgICAgMTAgQmFzZS1UIEhhbGYgRHVwbGV4CisgKgorICogV2Ugc3RhcnQgYSBuZXcgdGltZXIgbm93LCBhZnRlciBhIHN1Y2Nlc3NmdWwgYXV0byBuZWdvdGlhdGlvbiBzdGF0dXMgaGFzCisgKiBiZWVuIGRldGVjdGVkLiAgVGhpcyB0aW1lciBqdXN0IHdhaXRzIGZvciB0aGUgbGluay11cCBiaXQgdG8gZ2V0IHNldCBpbgorICogdGhlIEJNQ1Igb2YgdGhlIERQODM4NDAuICBXaGVuIHRoaXMgb2NjdXJzIHdlIHByaW50IGEga2VybmVsIGxvZyBtZXNzYWdlCisgKiBkZXNjcmliaW5nIHRoZSBsaW5rIHR5cGUgaW4gdXNlIGFuZCB0aGUgZmFjdCB0aGF0IGl0IGlzIHVwLgorICoKKyAqIElmIGEgZmF0YWwgZXJyb3Igb2Ygc29tZSBzb3J0IGlzIHNpZ25hbGxlZCBhbmQgZGV0ZWN0ZWQgaW4gdGhlIGludGVycnVwdAorICogc2VydmljZSByb3V0aW5lLCBhbmQgdGhlIGNoaXAgaXMgcmVzZXQsIG9yIHRoZSBsaW5rIGlzIGlmY29uZmlnJ2QgZG93bgorICogYW5kIHRoZW4gYmFjayB1cCwgdGhpcyBlbnRpcmUgcHJvY2VzcyByZXBlYXRzIGl0c2VsZiBhbGwgb3ZlciBhZ2Fpbi4KKyAqLworc3RhdGljIGludCB0cnlfbmV4dF9wZXJtdXRhdGlvbihzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsIHZvaWQgX19pb21lbSAqdHJlZ3MpCit7CisJaHAtPnN3X2JtY3IgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9CTUNSKTsKKworCS8qIERvd25ncmFkZSBmcm9tIGZ1bGwgdG8gaGFsZiBkdXBsZXguICBPbmx5IHBvc3NpYmxlCisJICogdmlhIGV0aHRvb2wuCisJICovCisJaWYgKGhwLT5zd19ibWNyICYgQk1DUl9GVUxMRFBMWCkgeworCQlocC0+c3dfYm1jciAmPSB+KEJNQ1JfRlVMTERQTFgpOworCQloYXBweV9tZWFsX3RjdnJfd3JpdGUoaHAsIHRyZWdzLCBNSUlfQk1DUiwgaHAtPnN3X2JtY3IpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBEb3duZ3JhZGUgZnJvbSAxMDAgdG8gMTAuICovCisJaWYgKGhwLT5zd19ibWNyICYgQk1DUl9TUEVFRDEwMCkgeworCQlocC0+c3dfYm1jciAmPSB+KEJNQ1JfU1BFRUQxMDApOworCQloYXBweV9tZWFsX3RjdnJfd3JpdGUoaHAsIHRyZWdzLCBNSUlfQk1DUiwgaHAtPnN3X2JtY3IpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBXZSd2ZSB0cmllZCBldmVyeXRoaW5nLiAqLworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgZGlzcGxheV9saW5rX21vZGUoc3RydWN0IGhhcHB5X21lYWwgKmhwLCB2b2lkIF9faW9tZW0gKnRyZWdzKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rIGlzIHVwIHVzaW5nICIsIGhwLT5kZXYtPm5hbWUpOworCWlmIChocC0+dGN2cl90eXBlID09IGV4dGVybmFsKQorCQlwcmludGsoImV4dGVybmFsICIpOworCWVsc2UKKwkJcHJpbnRrKCJpbnRlcm5hbCAiKTsKKwlwcmludGsoInRyYW5zY2VpdmVyIGF0ICIpOworCWhwLT5zd19scGEgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9MUEEpOworCWlmIChocC0+c3dfbHBhICYgKExQQV8xMDBIQUxGIHwgTFBBXzEwMEZVTEwpKSB7CisJCWlmIChocC0+c3dfbHBhICYgTFBBXzEwMEZVTEwpCisJCQlwcmludGsoIjEwME1iL3MsIEZ1bGwgRHVwbGV4LlxuIik7CisJCWVsc2UKKwkJCXByaW50aygiMTAwTWIvcywgSGFsZiBEdXBsZXguXG4iKTsKKwl9IGVsc2UgeworCQlpZiAoaHAtPnN3X2xwYSAmIExQQV8xMEZVTEwpCisJCQlwcmludGsoIjEwTWIvcywgRnVsbCBEdXBsZXguXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKCIxME1iL3MsIEhhbGYgRHVwbGV4LlxuIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBkaXNwbGF5X2ZvcmNlZF9saW5rX21vZGUoc3RydWN0IGhhcHB5X21lYWwgKmhwLCB2b2lkIF9faW9tZW0gKnRyZWdzKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rIGhhcyBiZWVuIGZvcmNlZCB1cCB1c2luZyAiLCBocC0+ZGV2LT5uYW1lKTsKKwlpZiAoaHAtPnRjdnJfdHlwZSA9PSBleHRlcm5hbCkKKwkJcHJpbnRrKCJleHRlcm5hbCAiKTsKKwllbHNlCisJCXByaW50aygiaW50ZXJuYWwgIik7CisJcHJpbnRrKCJ0cmFuc2NlaXZlciBhdCAiKTsKKwlocC0+c3dfYm1jciA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0JNQ1IpOworCWlmIChocC0+c3dfYm1jciAmIEJNQ1JfU1BFRUQxMDApCisJCXByaW50aygiMTAwTWIvcywgIik7CisJZWxzZQorCQlwcmludGsoIjEwTWIvcywgIik7CisJaWYgKGhwLT5zd19ibWNyICYgQk1DUl9GVUxMRFBMWCkKKwkJcHJpbnRrKCJGdWxsIER1cGxleC5cbiIpOworCWVsc2UKKwkJcHJpbnRrKCJIYWxmIER1cGxleC5cbiIpOworfQorCitzdGF0aWMgaW50IHNldF9oYXBweV9saW5rX21vZGVzKHN0cnVjdCBoYXBweV9tZWFsICpocCwgdm9pZCBfX2lvbWVtICp0cmVncykKK3sKKwlpbnQgZnVsbDsKKworCS8qIEFsbCB3ZSBjYXJlIGFib3V0IGlzIG1ha2luZyBzdXJlIHRoZSBiaWdtYWMgdHhfY2ZnIGhhcyBhCisJICogcHJvcGVyIGR1cGxleCBzZXR0aW5nLgorCSAqLworCWlmIChocC0+dGltZXJfc3RhdGUgPT0gYXJid2FpdCkgeworCQlocC0+c3dfbHBhID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfTFBBKTsKKwkJaWYgKCEoaHAtPnN3X2xwYSAmIChMUEFfMTBIQUxGIHwgTFBBXzEwRlVMTCB8IExQQV8xMDBIQUxGIHwgTFBBXzEwMEZVTEwpKSkKKwkJCWdvdG8gbm9fcmVzcG9uc2U7CisJCWlmIChocC0+c3dfbHBhICYgTFBBXzEwMEZVTEwpCisJCQlmdWxsID0gMTsKKwkJZWxzZSBpZiAoaHAtPnN3X2xwYSAmIExQQV8xMDBIQUxGKQorCQkJZnVsbCA9IDA7CisJCWVsc2UgaWYgKGhwLT5zd19scGEgJiBMUEFfMTBGVUxMKQorCQkJZnVsbCA9IDE7CisJCWVsc2UKKwkJCWZ1bGwgPSAwOworCX0gZWxzZSB7CisJCS8qIEZvcmNpbmcgYSBsaW5rIG1vZGUuICovCisJCWhwLT5zd19ibWNyID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfQk1DUik7CisJCWlmIChocC0+c3dfYm1jciAmIEJNQ1JfRlVMTERQTFgpCisJCQlmdWxsID0gMTsKKwkJZWxzZQorCQkJZnVsbCA9IDA7CisJfQorCisJLyogQmVmb3JlIGNoYW5naW5nIG90aGVyIGJpdHMgaW4gdGhlIHR4X2NmZyByZWdpc3RlciwgYW5kIGluCisJICogZ2VuZXJhbCBhbnkgb2Ygb3RoZXIgdGhlIFRYIGNvbmZpZyByZWdpc3RlcnMgdG9vLCB5b3UKKwkgKiBtdXN0OgorCSAqIDEpIENsZWFyIEVuYWJsZQorCSAqIDIpIFBvbGwgd2l0aCByZWFkcyB1bnRpbCB0aGF0IGJpdCByZWFkcyBiYWNrIGFzIHplcm8KKwkgKiAzKSBNYWtlIFRYIGNvbmZpZ3VyYXRpb24gY2hhbmdlcworCSAqIDQpIFNldCBFbmFibGUgb25jZSBtb3JlCisJICovCisJaG1lX3dyaXRlMzIoaHAsIGhwLT5iaWdtYWNyZWdzICsgQk1BQ19UWENGRywKKwkJICAgIGhtZV9yZWFkMzIoaHAsIGhwLT5iaWdtYWNyZWdzICsgQk1BQ19UWENGRykgJgorCQkgICAgfihCSUdNQUNfVFhDRkdfRU5BQkxFKSk7CisJd2hpbGUgKGhtZV9yZWFkMzIoaHAsIGhwLT5iaWdtYWNyZWdzICsgQk1BQ19UWENGRykgJiBCSUdNQUNfVFhDRkdfRU5BQkxFKQorCQliYXJyaWVyKCk7CisJaWYgKGZ1bGwpIHsKKwkJaHAtPmhhcHB5X2ZsYWdzIHw9IEhGTEFHX0ZVTEw7CisJCWhtZV93cml0ZTMyKGhwLCBocC0+YmlnbWFjcmVncyArIEJNQUNfVFhDRkcsCisJCQkgICAgaG1lX3JlYWQzMihocCwgaHAtPmJpZ21hY3JlZ3MgKyBCTUFDX1RYQ0ZHKSB8CisJCQkgICAgQklHTUFDX1RYQ0ZHX0ZVTExEUExYKTsKKwl9IGVsc2UgeworCQlocC0+aGFwcHlfZmxhZ3MgJj0gfihIRkxBR19GVUxMKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGhwLT5iaWdtYWNyZWdzICsgQk1BQ19UWENGRywKKwkJCSAgICBobWVfcmVhZDMyKGhwLCBocC0+YmlnbWFjcmVncyArIEJNQUNfVFhDRkcpICYKKwkJCSAgICB+KEJJR01BQ19UWENGR19GVUxMRFBMWCkpOworCX0KKwlobWVfd3JpdGUzMihocCwgaHAtPmJpZ21hY3JlZ3MgKyBCTUFDX1RYQ0ZHLAorCQkgICAgaG1lX3JlYWQzMihocCwgaHAtPmJpZ21hY3JlZ3MgKyBCTUFDX1RYQ0ZHKSB8CisJCSAgICBCSUdNQUNfVFhDRkdfRU5BQkxFKTsKKwlyZXR1cm4gMDsKK25vX3Jlc3BvbnNlOgorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGhhcHB5X21lYWxfaW5pdChzdHJ1Y3QgaGFwcHlfbWVhbCAqaHApOworCitzdGF0aWMgaW50IGlzX2x1Y2VudF9waHkoc3RydWN0IGhhcHB5X21lYWwgKmhwKQoreworCXZvaWQgX19pb21lbSAqdHJlZ3MgPSBocC0+dGN2cmVnczsKKwl1bnNpZ25lZCBzaG9ydCBtcjIsIG1yMzsKKwlpbnQgcmV0ID0gMDsKKworCW1yMiA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgMik7CisJbXIzID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCAzKTsKKwlpZiAoKG1yMiAmIDB4ZmZmZikgPT0gMHgwMTgwICYmCisJICAgICgobXIzICYgMHhmZmZmKSA+PiAxMCkgPT0gMHgxZCkKKwkJcmV0ID0gMTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGhhcHB5X21lYWxfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBoYXBweV9tZWFsICpocCA9IChzdHJ1Y3QgaGFwcHlfbWVhbCAqKSBkYXRhOworCXZvaWQgX19pb21lbSAqdHJlZ3MgPSBocC0+dGN2cmVnczsKKwlpbnQgcmVzdGFydF90aW1lciA9IDA7CisKKwlzcGluX2xvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisKKwlocC0+dGltZXJfdGlja3MrKzsKKwlzd2l0Y2goaHAtPnRpbWVyX3N0YXRlKSB7CisJY2FzZSBhcmJ3YWl0OgorCQkvKiBPbmx5IGFsbG93IGZvciA1IHRpY2tzLCB0aGF0cyAxMCBzZWNvbmRzIGFuZCBtdWNoIHRvbworCQkgKiBsb25nIHRvIHdhaXQgZm9yIGFyYml0cmF0aW9uIHRvIGNvbXBsZXRlLgorCQkgKi8KKwkJaWYgKGhwLT50aW1lcl90aWNrcyA+PSAxMCkgeworCQkJLyogRW50ZXIgZm9yY2UgbW9kZS4gKi8KKwlkb19mb3JjZV9tb2RlOgorCQkJaHAtPnN3X2JtY3IgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9CTUNSKTsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IEF1dG8tTmVnb3RpYXRpb24gdW5zdWNjZXNzZnVsLCB0cnlpbmcgZm9yY2UgbGluayBtb2RlXG4iLAorCQkJICAgICAgIGhwLT5kZXYtPm5hbWUpOworCQkJaHAtPnN3X2JtY3IgPSBCTUNSX1NQRUVEMTAwOworCQkJaGFwcHlfbWVhbF90Y3ZyX3dyaXRlKGhwLCB0cmVncywgTUlJX0JNQ1IsIGhwLT5zd19ibWNyKTsKKworCQkJaWYgKCFpc19sdWNlbnRfcGh5KGhwKSkgeworCQkJCS8qIE9LLCBzZWVtcyB3ZSBuZWVkIGRvIGRpc2FibGUgdGhlIHRyYW5zY2VpdmVyIGZvciB0aGUgZmlyc3QKKwkJCQkgKiB0aWNrIHRvIG1ha2Ugc3VyZSB3ZSBnZXQgYW4gYWNjdXJhdGUgbGluayBzdGF0ZSBhdCB0aGUKKwkJCQkgKiBzZWNvbmQgdGljay4KKwkJCQkgKi8KKwkJCQlocC0+c3dfY3Njb25maWcgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIERQODM4NDBfQ1NDT05GSUcpOworCQkJCWhwLT5zd19jc2NvbmZpZyAmPSB+KENTQ09ORklHX1RDVkRJU0FCKTsKKwkJCQloYXBweV9tZWFsX3RjdnJfd3JpdGUoaHAsIHRyZWdzLCBEUDgzODQwX0NTQ09ORklHLCBocC0+c3dfY3Njb25maWcpOworCQkJfQorCQkJaHAtPnRpbWVyX3N0YXRlID0gbHRyeXdhaXQ7CisJCQlocC0+dGltZXJfdGlja3MgPSAwOworCQkJcmVzdGFydF90aW1lciA9IDE7CisJCX0gZWxzZSB7CisJCQkvKiBBbnl0aGluZyBpbnRlcmVzdGluZyBoYXBwZW4/ICovCisJCQlocC0+c3dfYm1zciA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0JNU1IpOworCQkJaWYgKGhwLT5zd19ibXNyICYgQk1TUl9BTkVHQ09NUExFVEUpIHsKKwkJCQlpbnQgcmV0OworCisJCQkJLyogSnVzdCB3aGF0IHdlJ3ZlIGJlZW4gd2FpdGluZyBmb3IuLi4gKi8KKwkJCQlyZXQgPSBzZXRfaGFwcHlfbGlua19tb2RlcyhocCwgdHJlZ3MpOworCQkJCWlmIChyZXQpIHsKKwkJCQkJLyogT29vcHMsIHNvbWV0aGluZyBiYWQgaGFwcGVuZWQsIGdvIHRvIGZvcmNlCisJCQkJCSAqIG1vZGUuCisJCQkJCSAqCisJCQkJCSAqIFhYWCBCcm9rZW4gaHVicyB3aGljaCBkb24ndCBzdXBwb3J0IDgwMi4zdQorCQkJCQkgKiBYWFggYXV0by1uZWdvdGlhdGlvbiBtYWtlIHRoaXMgaGFwcGVuIGFzIHdlbGwuCisJCQkJCSAqLworCQkJCQlnb3RvIGRvX2ZvcmNlX21vZGU7CisJCQkJfQorCisJCQkJLyogU3VjY2VzcywgYXQgbGVhc3Qgc28gZmFyLCBhZHZhbmNlIG91ciBzdGF0ZSBlbmdpbmUuICovCisJCQkJaHAtPnRpbWVyX3N0YXRlID0gbHVwd2FpdDsKKwkJCQlyZXN0YXJ0X3RpbWVyID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJcmVzdGFydF90aW1lciA9IDE7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIGx1cHdhaXQ6CisJCS8qIEF1dG8gbmVnb3RpYXRpb24gd2FzIHN1Y2Nlc3NmdWwgYW5kIHdlIGFyZSBhd2FpdGluZyBhCisJCSAqIGxpbmsgdXAgc3RhdHVzLiAgSSBoYXZlIGRlY2lkZWQgdG8gbGV0IHRoaXMgdGltZXIgcnVuCisJCSAqIGZvcmV2ZXIgdW50aWwgc29tZSBzb3J0IG9mIGVycm9yIGlzIHNpZ25hbGxlZCwgcmVwb3J0aW5nCisJCSAqIGEgbWVzc2FnZSB0byB0aGUgdXNlciBhdCAxMCBzZWNvbmQgaW50ZXJ2YWxzLgorCQkgKi8KKwkJaHAtPnN3X2Jtc3IgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9CTVNSKTsKKwkJaWYgKGhwLT5zd19ibXNyICYgQk1TUl9MU1RBVFVTKSB7CisJCQkvKiBXaGVlZSwgaXQncyB1cCwgZGlzcGxheSB0aGUgbGluayBtb2RlIGluIHVzZSBhbmQgcHV0CisJCQkgKiB0aGUgdGltZXIgdG8gc2xlZXAuCisJCQkgKi8KKwkJCWRpc3BsYXlfbGlua19tb2RlKGhwLCB0cmVncyk7CisJCQlocC0+dGltZXJfc3RhdGUgPSBhc2xlZXA7CisJCQlyZXN0YXJ0X3RpbWVyID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChocC0+dGltZXJfdGlja3MgPj0gMTApIHsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBBdXRvIG5lZ290aWF0aW9uIHN1Y2Nlc3NmdWwsIGxpbmsgc3RpbGwgIgorCQkJCSAgICAgICAibm90IGNvbXBsZXRlbHkgdXAuXG4iLCBocC0+ZGV2LT5uYW1lKTsKKwkJCQlocC0+dGltZXJfdGlja3MgPSAwOworCQkJCXJlc3RhcnRfdGltZXIgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlyZXN0YXJ0X3RpbWVyID0gMTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgbHRyeXdhaXQ6CisJCS8qIE1ha2luZyB0aGUgdGltZW91dCBoZXJlIHRvbyBsb25nIGNhbiBtYWtlIGl0IHRha2UKKwkJICogYW5ub3lpbmdseSBsb25nIHRvIGF0dGVtcHQgYWxsIG9mIHRoZSBsaW5rIG1vZGUKKwkJICogcGVybXV0YXRpb25zLCBidXQgdGhlbiBhZ2FpbiB0aGlzIGlzIGVzc2VudGlhbGx5CisJCSAqIGVycm9yIHJlY292ZXJ5IGNvZGUgZm9yIHRoZSBtb3N0IHBhcnQuCisJCSAqLworCQlocC0+c3dfYm1zciA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0JNU1IpOworCQlocC0+c3dfY3Njb25maWcgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIERQODM4NDBfQ1NDT05GSUcpOworCQlpZiAoaHAtPnRpbWVyX3RpY2tzID09IDEpIHsKKwkJCWlmICghaXNfbHVjZW50X3BoeShocCkpIHsKKwkJCQkvKiBSZS1lbmFibGUgdHJhbnNjZWl2ZXIsIHdlJ2xsIHJlLWVuYWJsZSB0aGUgdHJhbnNjZWl2ZXIgbmV4dAorCQkJCSAqIHRpY2ssIHRoZW4gY2hlY2sgbGluayBzdGF0ZSBvbiB0aGUgZm9sbG93aW5nIHRpY2suCisJCQkJICovCisJCQkJaHAtPnN3X2NzY29uZmlnIHw9IENTQ09ORklHX1RDVkRJU0FCOworCQkJCWhhcHB5X21lYWxfdGN2cl93cml0ZShocCwgdHJlZ3MsCisJCQkJCQkgICAgICBEUDgzODQwX0NTQ09ORklHLCBocC0+c3dfY3Njb25maWcpOworCQkJfQorCQkJcmVzdGFydF90aW1lciA9IDE7CisJCQlicmVhazsKKwkJfQorCQlpZiAoaHAtPnRpbWVyX3RpY2tzID09IDIpIHsKKwkJCWlmICghaXNfbHVjZW50X3BoeShocCkpIHsKKwkJCQlocC0+c3dfY3Njb25maWcgJj0gfihDU0NPTkZJR19UQ1ZESVNBQik7CisJCQkJaGFwcHlfbWVhbF90Y3ZyX3dyaXRlKGhwLCB0cmVncywKKwkJCQkJCSAgICAgIERQODM4NDBfQ1NDT05GSUcsIGhwLT5zd19jc2NvbmZpZyk7CisJCQl9CisJCQlyZXN0YXJ0X3RpbWVyID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChocC0+c3dfYm1zciAmIEJNU1JfTFNUQVRVUykgeworCQkJLyogRm9yY2UgbW9kZSBzZWxlY3Rpb24gc3VjY2Vzcy4gKi8KKwkJCWRpc3BsYXlfZm9yY2VkX2xpbmtfbW9kZShocCwgdHJlZ3MpOworCQkJc2V0X2hhcHB5X2xpbmtfbW9kZXMoaHAsIHRyZWdzKTsgLyogWFhYIGVycm9yPyB0aGVuIHdoYXQ/ICovCisJCQlocC0+dGltZXJfc3RhdGUgPSBhc2xlZXA7CisJCQlyZXN0YXJ0X3RpbWVyID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChocC0+dGltZXJfdGlja3MgPj0gNCkgeyAvKiA2IHNlY29uZHMgb3Igc28uLi4gKi8KKwkJCQlpbnQgcmV0OworCisJCQkJcmV0ID0gdHJ5X25leHRfcGVybXV0YXRpb24oaHAsIHRyZWdzKTsKKwkJCQlpZiAocmV0ID09IC0xKSB7CisJCQkJCS8qIEFpZWVlLCB0cmllZCB0aGVtIGFsbCwgcmVzZXQgdGhlCisJCQkJCSAqIGNoaXAgYW5kIHRyeSBhbGwgb3ZlciBhZ2Fpbi4KKwkJCQkJICovCisKKwkJCQkJLyogTGV0IHRoZSB1c2VyIGtub3cuLi4gKi8KKwkJCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogTGluayBkb3duLCBjYWJsZSBwcm9ibGVtP1xuIiwKKwkJCQkJICAgICAgIGhwLT5kZXYtPm5hbWUpOworCisJCQkJCXJldCA9IGhhcHB5X21lYWxfaW5pdChocCk7CisJCQkJCWlmIChyZXQpIHsKKwkJCQkJCS8qIGhvIGh1bS4uLiAqLworCQkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IsIGNhbm5vdCByZS1pbml0IHRoZSAiCisJCQkJCQkgICAgICAgIkhhcHB5IE1lYWwuXG4iLCBocC0+ZGV2LT5uYW1lKTsKKwkJCQkJfQorCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJaWYgKCFpc19sdWNlbnRfcGh5KGhwKSkgeworCQkJCQlocC0+c3dfY3Njb25maWcgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsCisJCQkJCQkJCQkgICAgICAgRFA4Mzg0MF9DU0NPTkZJRyk7CisJCQkJCWhwLT5zd19jc2NvbmZpZyB8PSBDU0NPTkZJR19UQ1ZESVNBQjsKKwkJCQkJaGFwcHlfbWVhbF90Y3ZyX3dyaXRlKGhwLCB0cmVncywKKwkJCQkJCQkgICAgICBEUDgzODQwX0NTQ09ORklHLCBocC0+c3dfY3Njb25maWcpOworCQkJCX0KKwkJCQlocC0+dGltZXJfdGlja3MgPSAwOworCQkJCXJlc3RhcnRfdGltZXIgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlyZXN0YXJ0X3RpbWVyID0gMTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgYXNsZWVwOgorCWRlZmF1bHQ6CisJCS8qIENhbid0IGhhcHBlbnMuLi4uICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEFpZWVlLCBsaW5rIHRpbWVyIGlzIGFzbGVlcCBidXQgd2UgZ290IG9uZSBhbnl3YXlzIVxuIiwKKwkJICAgICAgIGhwLT5kZXYtPm5hbWUpOworCQlyZXN0YXJ0X3RpbWVyID0gMDsKKwkJaHAtPnRpbWVyX3RpY2tzID0gMDsKKwkJaHAtPnRpbWVyX3N0YXRlID0gYXNsZWVwOyAvKiBmb28gb24geW91ICovCisJCWJyZWFrOworCX07CisKKwlpZiAocmVzdGFydF90aW1lcikgeworCQlocC0+aGFwcHlfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoKDEyICogSFopLzEwKTsgLyogMS4yIHNlYy4gKi8KKwkJYWRkX3RpbWVyKCZocC0+aGFwcHlfdGltZXIpOworCX0KKworb3V0OgorCXNwaW5fdW5sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworfQorCisjZGVmaW5lIFRYX1JFU0VUX1RSSUVTICAgICAzMgorI2RlZmluZSBSWF9SRVNFVF9UUklFUyAgICAgMzIKKworLyogaHAtPmhhcHB5X2xvY2sgbXVzdCBiZSBoZWxkICovCitzdGF0aWMgdm9pZCBoYXBweV9tZWFsX3R4X3Jlc2V0KHN0cnVjdCBoYXBweV9tZWFsICpocCwgdm9pZCBfX2lvbWVtICpicmVncykKK3sKKwlpbnQgdHJpZXMgPSBUWF9SRVNFVF9UUklFUzsKKworCUhNRCgoImhhcHB5X21lYWxfdHhfcmVzZXQ6IHJlc2V0LCAiKSk7CisKKwkvKiBXb3VsZCB5b3UgbGlrZSB0byB0cnkgb3VyIFNNQ0MgRGVsdXg/ICovCisJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19UWFNXUkVTRVQsIDApOworCXdoaWxlICgoaG1lX3JlYWQzMihocCwgYnJlZ3MgKyBCTUFDX1RYU1dSRVNFVCkgJiAxKSAmJiAtLXRyaWVzKQorCQl1ZGVsYXkoMjApOworCisJLyogTGV0dHVjZSwgdG9tYXRvLCBidWdneSBoYXJkd2FyZSAobm8gZXh0cmEgY2hhcmdlKT8gKi8KKwlpZiAoIXRyaWVzKQorCQlwcmludGsoS0VSTl9FUlIgImhhcHB5IG1lYWw6IFRyYW5zY2VpdmVyIEJpZ01hYyBBVFRBQ0shIik7CisKKwkvKiBUYWtlIGNhcmUuICovCisJSE1EKCgiZG9uZVxuIikpOworfQorCisvKiBocC0+aGFwcHlfbG9jayBtdXN0IGJlIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGhhcHB5X21lYWxfcnhfcmVzZXQoc3RydWN0IGhhcHB5X21lYWwgKmhwLCB2b2lkIF9faW9tZW0gKmJyZWdzKQoreworCWludCB0cmllcyA9IFJYX1JFU0VUX1RSSUVTOworCisJSE1EKCgiaGFwcHlfbWVhbF9yeF9yZXNldDogcmVzZXQsICIpKTsKKworCS8qIFdlIGhhdmUgYSBzcGVjaWFsIG9uIEdOVS9WaWtpbmcgaGFyZHdhcmUgYnVncyB0b2RheS4gKi8KKwlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX1JYU1dSRVNFVCwgMCk7CisJd2hpbGUgKChobWVfcmVhZDMyKGhwLCBicmVncyArIEJNQUNfUlhTV1JFU0VUKSAmIDEpICYmIC0tdHJpZXMpCisJCXVkZWxheSgyMCk7CisKKwkvKiBXaWxsIHRoYXQgYmUgYWxsPyAqLworCWlmICghdHJpZXMpCisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHkgbWVhbDogUmVjZWl2ZXIgQmlnTWFjIEFUVEFDSyEiKTsKKworCS8qIERvbid0IGZvcmdldCB5b3VyIHZpa18xMTM3MTI1X3dhLiAgSGF2ZSBhIG5pY2UgZGF5LiAqLworCUhNRCgoImRvbmVcbiIpKTsKK30KKworI2RlZmluZSBTVE9QX1RSSUVTICAgICAgICAgMTYKKworLyogaHAtPmhhcHB5X2xvY2sgbXVzdCBiZSBoZWxkICovCitzdGF0aWMgdm9pZCBoYXBweV9tZWFsX3N0b3Aoc3RydWN0IGhhcHB5X21lYWwgKmhwLCB2b2lkIF9faW9tZW0gKmdyZWdzKQoreworCWludCB0cmllcyA9IFNUT1BfVFJJRVM7CisKKwlITUQoKCJoYXBweV9tZWFsX3N0b3A6IHJlc2V0LCAiKSk7CisKKwkvKiBXZSdyZSBjb25zb2xpZGF0aW5nIG91ciBTVEIgcHJvZHVjdHMsIGl0J3MgeW91ciBsdWNreSBkYXkuICovCisJaG1lX3dyaXRlMzIoaHAsIGdyZWdzICsgR1JFR19TV1JFU0VULCBHUkVHX1JFU0VUX0FMTCk7CisJd2hpbGUgKGhtZV9yZWFkMzIoaHAsIGdyZWdzICsgR1JFR19TV1JFU0VUKSAmJiAtLXRyaWVzKQorCQl1ZGVsYXkoMjApOworCisJLyogQ29tZSBiYWNrIG5leHQgd2VlayB3aGVuIHdlIGFyZSAiU3VuIE1pY3JvZWxlY3Ryb25pY3MiLiAqLworCWlmICghdHJpZXMpCisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHkgbWVhbDogRnJ5IGd1eXMuIik7CisKKwkvKiBSZW1lbWJlcjogIkRpZmZlcmVudCBuYW1lLCBzYW1lIG9sZCBidWdneSBhcyBzaGl0IGhhcmR3YXJlLiIgKi8KKwlITUQoKCJkb25lXG4iKSk7Cit9CisKKy8qIGhwLT5oYXBweV9sb2NrIG11c3QgYmUgaGVsZCAqLworc3RhdGljIHZvaWQgaGFwcHlfbWVhbF9nZXRfY291bnRlcnMoc3RydWN0IGhhcHB5X21lYWwgKmhwLCB2b2lkIF9faW9tZW0gKmJyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZocC0+bmV0X3N0YXRzOworCisJc3RhdHMtPnJ4X2NyY19lcnJvcnMgKz0gaG1lX3JlYWQzMihocCwgYnJlZ3MgKyBCTUFDX1JDUkNFQ1RSKTsKKwlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX1JDUkNFQ1RSLCAwKTsKKworCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMgKz0gaG1lX3JlYWQzMihocCwgYnJlZ3MgKyBCTUFDX1VOQUxFQ1RSKTsKKwlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX1VOQUxFQ1RSLCAwKTsKKworCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzICs9IGhtZV9yZWFkMzIoaHAsIGJyZWdzICsgQk1BQ19HTEVDVFIpOworCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfR0xFQ1RSLCAwKTsKKworCXN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycyArPSBobWVfcmVhZDMyKGhwLCBicmVncyArIEJNQUNfRVhDVFIpOworCisJc3RhdHMtPmNvbGxpc2lvbnMgKz0KKwkJKGhtZV9yZWFkMzIoaHAsIGJyZWdzICsgQk1BQ19FWENUUikgKworCQkgaG1lX3JlYWQzMihocCwgYnJlZ3MgKyBCTUFDX0xUQ1RSKSk7CisJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19FWENUUiwgMCk7CisJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19MVENUUiwgMCk7Cit9CisKKy8qIGhwLT5oYXBweV9sb2NrIG11c3QgYmUgaGVsZCAqLworc3RhdGljIHZvaWQgaGFwcHlfbWVhbF9wb2xsX3N0b3Aoc3RydWN0IGhhcHB5X21lYWwgKmhwLCB2b2lkIF9faW9tZW0gKnRyZWdzKQoreworCUFTRCgoImhhcHB5X21lYWxfcG9sbF9zdG9wOiAiKSk7CisKKwkvKiBJZiBwb2xsaW5nIGRpc2FibGVkIG9yIG5vdCBwb2xsaW5nIGFscmVhZHksIG5vdGhpbmcgdG8gZG8uICovCisJaWYgKChocC0+aGFwcHlfZmxhZ3MgJiAoSEZMQUdfUE9MTEVOQUJMRSB8IEhGTEFHX1BPTEwpKSAhPQorCSAgIChIRkxBR19QT0xMRU5BQkxFIHwgSEZMQUdfUE9MTCkpIHsKKwkJSE1EKCgibm90IHBvbGxpbmcsIHJldHVyblxuIikpOworCQlyZXR1cm47CisJfQorCisJLyogU2h1dCB1cCB0aGUgTUlGLiAqLworCUFTRCgoIndlcmUgcG9sbGluZywgbWlmIGludHMgb2ZmLCAiKSk7CisJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9JTUFTSywgMHhmZmZmKTsKKworCS8qIFR1cm4gb2ZmIHBvbGxpbmcuICovCisJQVNEKCgicG9sbGluZyBvZmYsICIpKTsKKwlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRywKKwkJICAgIGhtZV9yZWFkMzIoaHAsIHRyZWdzICsgVENWUl9DRkcpICYgfihUQ1ZfQ0ZHX1BFTkFCTEUpKTsKKworCS8qIFdlIGFyZSBubyBsb25nZXIgcG9sbGluZy4gKi8KKwlocC0+aGFwcHlfZmxhZ3MgJj0gfihIRkxBR19QT0xMKTsKKworCS8qIExldCB0aGUgYml0cyBzZXQuICovCisJdWRlbGF5KDIwMCk7CisJQVNEKCgiZG9uZVxuIikpOworfQorCisvKiBPbmx5IFN1biBjYW4gdGFrZSBzdWNoIG5pY2UgcGFydHMgYW5kIGZ1Y2sgdXAgdGhlIHByb2dyYW1taW5nIGludGVyZmFjZQorICogbGlrZSB0aGlzLiAgR29vZCBqb2IgZ3V5cy4uLgorICovCisjZGVmaW5lIFRDVlJfUkVTRVRfVFJJRVMgICAgICAgMTYgLyogSXQgc2hvdWxkIHJlc2V0IHF1aWNrbHkgICAgICAgICovCisjZGVmaW5lIFRDVlJfVU5JU09MQVRFX1RSSUVTICAgMzIgLyogRGlzLWlzb2xhdGlvbiBjYW4gdGFrZSBsb25nZXIuICovCisKKy8qIGhwLT5oYXBweV9sb2NrIG11c3QgYmUgaGVsZCAqLworc3RhdGljIGludCBoYXBweV9tZWFsX3RjdnJfcmVzZXQoc3RydWN0IGhhcHB5X21lYWwgKmhwLCB2b2lkIF9faW9tZW0gKnRyZWdzKQoreworCXUzMiB0Y29uZmlnOworCWludCByZXN1bHQsIHRyaWVzID0gVENWUl9SRVNFVF9UUklFUzsKKworCXRjb25maWcgPSBobWVfcmVhZDMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHKTsKKwlBU0QoKCJoYXBweV9tZWFsX3RjdnJfcmVzZXQ6IHRjZmc8JTA4bHg+ICIsIHRjb25maWcpKTsKKwlpZiAoaHAtPnRjdnJfdHlwZSA9PSBleHRlcm5hbCkgeworCQlBU0QoKCJleHRlcm5hbDwiKSk7CisJCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHLCB0Y29uZmlnICYgfihUQ1ZfQ0ZHX1BTRUxFQ1QpKTsKKwkJaHAtPnRjdnJfdHlwZSA9IGludGVybmFsOworCQlocC0+cGFkZHIgPSBUQ1ZfUEFERFJfSVRYOworCQlBU0QoKCJJU09MQVRFLCIpKTsKKwkJaGFwcHlfbWVhbF90Y3ZyX3dyaXRlKGhwLCB0cmVncywgTUlJX0JNQ1IsCisJCQkJICAgICAgKEJNQ1JfTE9PUEJBQ0t8Qk1DUl9QRE9XTnxCTUNSX0lTT0xBVEUpKTsKKwkJcmVzdWx0ID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfQk1DUik7CisJCWlmIChyZXN1bHQgPT0gVENWUl9GQUlMVVJFKSB7CisJCQlBU0QoKCJwaHlyZWFkX2ZhaWw+XG4iKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJQVNEKCgicGh5cmVhZF9vayxQU0VMRUNUPiIpKTsKKwkJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9DRkcsIHRjb25maWcgfCBUQ1ZfQ0ZHX1BTRUxFQ1QpOworCQlocC0+dGN2cl90eXBlID0gZXh0ZXJuYWw7CisJCWhwLT5wYWRkciA9IFRDVl9QQUREUl9FVFg7CisJfSBlbHNlIHsKKwkJaWYgKHRjb25maWcgJiBUQ1ZfQ0ZHX01ESU8xKSB7CisJCQlBU0QoKCJpbnRlcm5hbDxQU0VMRUNULCIpKTsKKwkJCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHLCAodGNvbmZpZyB8IFRDVl9DRkdfUFNFTEVDVCkpOworCQkJQVNEKCgiSVNPTEFURSwiKSk7CisJCQloYXBweV9tZWFsX3RjdnJfd3JpdGUoaHAsIHRyZWdzLCBNSUlfQk1DUiwKKwkJCQkJICAgICAgKEJNQ1JfTE9PUEJBQ0t8Qk1DUl9QRE9XTnxCTUNSX0lTT0xBVEUpKTsKKwkJCXJlc3VsdCA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0JNQ1IpOworCQkJaWYgKHJlc3VsdCA9PSBUQ1ZSX0ZBSUxVUkUpIHsKKwkJCQlBU0QoKCJwaHlyZWFkX2ZhaWw+XG4iKSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJQVNEKCgicGh5cmVhZF9vayx+UFNFTEVDVD4iKSk7CisJCQlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRywgKHRjb25maWcgJiB+KFRDVl9DRkdfUFNFTEVDVCkpKTsKKwkJCWhwLT50Y3ZyX3R5cGUgPSBpbnRlcm5hbDsKKwkJCWhwLT5wYWRkciA9IFRDVl9QQUREUl9JVFg7CisJCX0KKwl9CisKKwlBU0QoKCJCTUNSX1JFU0VUICIpKTsKKwloYXBweV9tZWFsX3RjdnJfd3JpdGUoaHAsIHRyZWdzLCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7CisKKwl3aGlsZSAoLS10cmllcykgeworCQlyZXN1bHQgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9CTUNSKTsKKwkJaWYgKHJlc3VsdCA9PSBUQ1ZSX0ZBSUxVUkUpCisJCQlyZXR1cm4gLTE7CisJCWhwLT5zd19ibWNyID0gcmVzdWx0OworCQlpZiAoIShyZXN1bHQgJiBCTUNSX1JFU0VUKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMjApOworCX0KKwlpZiAoIXRyaWVzKSB7CisJCUFTRCgoIkJNQ1IgUkVTRVQgRkFJTEVEIVxuIikpOworCQlyZXR1cm4gLTE7CisJfQorCUFTRCgoIlJFU0VUX09LXG4iKSk7CisKKwkvKiBHZXQgZnJlc2ggY29waWVzIG9mIHRoZSBQSFkgcmVnaXN0ZXJzLiAqLworCWhwLT5zd19ibXNyICAgICAgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9CTVNSKTsKKwlocC0+c3dfcGh5c2lkMSAgID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfUEhZU0lEMSk7CisJaHAtPnN3X3BoeXNpZDIgICA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX1BIWVNJRDIpOworCWhwLT5zd19hZHZlcnRpc2UgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9BRFZFUlRJU0UpOworCisJQVNEKCgiVU5JU09MQVRFIikpOworCWhwLT5zd19ibWNyICY9IH4oQk1DUl9JU09MQVRFKTsKKwloYXBweV9tZWFsX3RjdnJfd3JpdGUoaHAsIHRyZWdzLCBNSUlfQk1DUiwgaHAtPnN3X2JtY3IpOworCisJdHJpZXMgPSBUQ1ZSX1VOSVNPTEFURV9UUklFUzsKKwl3aGlsZSAoLS10cmllcykgeworCQlyZXN1bHQgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9CTUNSKTsKKwkJaWYgKHJlc3VsdCA9PSBUQ1ZSX0ZBSUxVUkUpCisJCQlyZXR1cm4gLTE7CisJCWlmICghKHJlc3VsdCAmIEJNQ1JfSVNPTEFURSkpCisJCQlicmVhazsKKwkJdWRlbGF5KDIwKTsKKwl9CisJaWYgKCF0cmllcykgeworCQlBU0QoKCIgRkFJTEVEIVxuIikpOworCQlyZXR1cm4gLTE7CisJfQorCUFTRCgoIiBTVUNDRVNTIGFuZCBDU0NPTkZJR19ERkJZUEFTU1xuIikpOworCWlmICghaXNfbHVjZW50X3BoeShocCkpIHsKKwkJcmVzdWx0ID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLAorCQkJCQkgICAgICBEUDgzODQwX0NTQ09ORklHKTsKKwkJaGFwcHlfbWVhbF90Y3ZyX3dyaXRlKGhwLCB0cmVncywKKwkJCQkgICAgICBEUDgzODQwX0NTQ09ORklHLCAocmVzdWx0IHwgQ1NDT05GSUdfREZCWVBBU1MpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIEZpZ3VyZSBvdXQgd2hldGhlciB3ZSBoYXZlIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHRyYW5zY2VpdmVyLgorICoKKyAqIGhwLT5oYXBweV9sb2NrIG11c3QgYmUgaGVsZAorICovCitzdGF0aWMgdm9pZCBoYXBweV9tZWFsX3RyYW5zY2VpdmVyX2NoZWNrKHN0cnVjdCBoYXBweV9tZWFsICpocCwgdm9pZCBfX2lvbWVtICp0cmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHRjb25maWcgPSBobWVfcmVhZDMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHKTsKKworCUFTRCgoImhhcHB5X21lYWxfdHJhbnNjZWl2ZXJfY2hlY2s6IHRjZmc9JTA4bHggIiwgdGNvbmZpZykpOworCWlmIChocC0+aGFwcHlfZmxhZ3MgJiBIRkxBR19QT0xMKSB7CisJCS8qIElmIHdlIGFyZSBwb2xsaW5nLCB3ZSBtdXN0IHN0b3AgdG8gZ2V0IHRoZSB0cmFuc2NlaXZlciB0eXBlLiAqLworCQlBU0QoKCI8cG9sbGluZz4gIikpOworCQlpZiAoaHAtPnRjdnJfdHlwZSA9PSBpbnRlcm5hbCkgeworCQkJaWYgKHRjb25maWcgJiBUQ1ZfQ0ZHX01ESU8xKSB7CisJCQkJQVNEKCgiPGludGVybmFsPiA8cG9sbCBzdG9wPiAiKSk7CisJCQkJaGFwcHlfbWVhbF9wb2xsX3N0b3AoaHAsIHRyZWdzKTsKKwkJCQlocC0+cGFkZHIgPSBUQ1ZfUEFERFJfRVRYOworCQkJCWhwLT50Y3ZyX3R5cGUgPSBleHRlcm5hbDsKKwkJCQlBU0QoKCI8ZXh0ZXJuYWw+XG4iKSk7CisJCQkJdGNvbmZpZyAmPSB+KFRDVl9DRkdfUEVOQUJMRSk7CisJCQkJdGNvbmZpZyB8PSBUQ1ZfQ0ZHX1BTRUxFQ1Q7CisJCQkJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9DRkcsIHRjb25maWcpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGhwLT50Y3ZyX3R5cGUgPT0gZXh0ZXJuYWwpIHsKKwkJCQlBU0QoKCI8ZXh0ZXJuYWw+ICIpKTsKKwkJCQlpZiAoIShobWVfcmVhZDMyKGhwLCB0cmVncyArIFRDVlJfU1RBVFVTKSA+PiAxNikpIHsKKwkJCQkJQVNEKCgiPHBvbGwgc3RvcD4gIikpOworCQkJCQloYXBweV9tZWFsX3BvbGxfc3RvcChocCwgdHJlZ3MpOworCQkJCQlocC0+cGFkZHIgPSBUQ1ZfUEFERFJfSVRYOworCQkJCQlocC0+dGN2cl90eXBlID0gaW50ZXJuYWw7CisJCQkJCUFTRCgoIjxpbnRlcm5hbD5cbiIpKTsKKwkJCQkJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9DRkcsCisJCQkJCQkgICAgaG1lX3JlYWQzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRykgJgorCQkJCQkJICAgIH4oVENWX0NGR19QU0VMRUNUKSk7CisJCQkJfQorCQkJCUFTRCgoIlxuIikpOworCQkJfSBlbHNlIHsKKwkJCQlBU0QoKCI8bm9uZT5cbiIpKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXUzMiByZXJlYWQgPSBobWVfcmVhZDMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHKTsKKworCQkvKiBFbHNlIHdlIGNhbiBqdXN0IHdvcmsgb2ZmIG9mIHRoZSBNRElPIGJpdHMuICovCisJCUFTRCgoIjxub3QgcG9sbGluZz4gIikpOworCQlpZiAocmVyZWFkICYgVENWX0NGR19NRElPMSkgeworCQkJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9DRkcsIHRjb25maWcgfCBUQ1ZfQ0ZHX1BTRUxFQ1QpOworCQkJaHAtPnBhZGRyID0gVENWX1BBRERSX0VUWDsKKwkJCWhwLT50Y3ZyX3R5cGUgPSBleHRlcm5hbDsKKwkJCUFTRCgoIjxleHRlcm5hbD5cbiIpKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChyZXJlYWQgJiBUQ1ZfQ0ZHX01ESU8wKSB7CisJCQkJaG1lX3dyaXRlMzIoaHAsIHRyZWdzICsgVENWUl9DRkcsCisJCQkJCSAgICB0Y29uZmlnICYgfihUQ1ZfQ0ZHX1BTRUxFQ1QpKTsKKwkJCQlocC0+cGFkZHIgPSBUQ1ZfUEFERFJfSVRYOworCQkJCWhwLT50Y3ZyX3R5cGUgPSBpbnRlcm5hbDsKKwkJCQlBU0QoKCI8aW50ZXJuYWw+XG4iKSk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX0VSUiAiaGFwcHkgbWVhbDogVHJhbnNjZWl2ZXIgYW5kIGEgY29rZSBwbGVhc2UuIik7CisJCQkJaHAtPnRjdnJfdHlwZSA9IG5vbmU7IC8qIEdycnIuLi4gKi8KKwkJCQlBU0QoKCI8bm9uZT5cbiIpKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyogVGhlIHJlY2VpdmUgcmluZyBidWZmZXJzIGFyZSBhIGJpdCB0cmlja3kgdG8gZ2V0IHJpZ2h0LiAgSGVyZSBnb2VzLi4uCisgKgorICogVGhlIGJ1ZmZlcnMgd2UgZG1hIGludG8gbXVzdCBiZSA2NCBieXRlIGFsaWduZWQuICBTbyB3ZSB1c2UgYSBzcGVjaWFsCisgKiBhbGxvY19za2IoKSByb3V0aW5lIGZvciB0aGUgaGFwcHkgbWVhbCB0byBhbGxvY2F0ZSA2NCBieXRlcyBtb3JlIHRoYW4KKyAqIHdlIHJlYWxseSBuZWVkLgorICoKKyAqIFdlIHVzZSBza2JfcmVzZXJ2ZSgpIHRvIGFsaWduIHRoZSBkYXRhIGJsb2NrIHdlIGdldCBpbiB0aGUgc2tiLiAgV2UKKyAqIGFsc28gcHJvZ3JhbSB0aGUgZXR4cmVncy0+Y2ZnIHJlZ2lzdGVyIHRvIHVzZSBhbiBvZmZzZXQgb2YgMi4gIFRoaXMKKyAqIGltcGVyaWNhbCBjb25zdGFudCBwbHVzIHRoZSBldGhlcm5ldCBoZWFkZXIgc2l6ZSB3aWxsIGFsd2F5cyBsZWF2ZQorICogdXMgd2l0aCBhIG5pY2VseSBhbGlnbmVkIGlwIGhlYWRlciBvbmNlIHdlIHBhc3MgdGhpbmdzIHVwIHRvIHRoZQorICogcHJvdG9jb2wgbGF5ZXJzLgorICoKKyAqIFRoZSBudW1iZXJzIHdvcmsgb3V0IHRvOgorICoKKyAqICAgICAgICAgTWF4IGV0aGVybmV0IGZyYW1lIHNpemUgICAgICAgICAxNTE4CisgKiAgICAgICAgIEV0aGVybmV0IGhlYWRlciBzaXplICAgICAgICAgICAgICAxNAorICogICAgICAgICBIYXBweSBNZWFsIGJhc2Ugb2Zmc2V0ICAgICAgICAgICAgIDIKKyAqCisgKiBTYXkgYSBza2IgZGF0YSBhcmVhIGlzIGF0IDB4ZjAwMWIwMTAsIGFuZCBpdHMgc2l6ZSBhbGxvY2VkIGlzCisgKiAoRVRIX0ZSQU1FX0xFTiArIDY0ICsgMikgPSAoMTUxNCArIDY0ICsgMikgPSAxNTgwIGJ5dGVzLgorICoKKyAqIEZpcnN0IG91ciBhbGxvY19za2IoKSByb3V0aW5lIGFsaWducyB0aGUgZGF0YSBiYXNlIHRvIGEgNjQgYnl0ZQorICogYm91bmRhcnkuICBXZSBub3cgaGF2ZSAweGYwMDFiMDQwIGFzIG91ciBza2IgZGF0YSBhZGRyZXNzLiAgV2UKKyAqIHBsdWcgdGhpcyBpbnRvIHRoZSByZWNlaXZlIGRlc2NyaXB0b3IgYWRkcmVzcy4KKyAqCisgKiBOZXh0LCB3ZSBza2JfcmVzZXJ2ZSgpIDIgYnl0ZXMgdG8gYWNjb3VudCBmb3IgdGhlIEhhcHB5IE1lYWwgb2Zmc2V0LgorICogU28gbm93IHRoZSBkYXRhIHdlIHdpbGwgZW5kIHVwIGxvb2tpbmcgYXQgc3RhcnRzIGF0IDB4ZjAwMWIwNDIuICBXaGVuCisgKiB0aGUgcGFja2V0IGFycml2ZXMsIHdlIHdpbGwgY2hlY2sgb3V0IHRoZSBzaXplIHJlY2VpdmVkIGFuZCBzdWJ0cmFjdAorICogdGhpcyBmcm9tIHRoZSBza2ItPmxlbmd0aC4gIFRoZW4gd2UganVzdCBwYXNzIHRoZSBwYWNrZXQgdXAgdG8gdGhlCisgKiBwcm90b2NvbHMgYXMgaXMsIGFuZCBhbGxvY2F0ZSBhIG5ldyBza2IgdG8gcmVwbGFjZSB0aGlzIHNsb3Qgd2UgaGF2ZQorICoganVzdCByZWNlaXZlZCBmcm9tLgorICoKKyAqIFRoZSBldGhlcm5ldCBsYXllciB3aWxsIHN0cmlwIHRoZSBldGhlciBoZWFkZXIgZnJvbSB0aGUgZnJvbnQgb2YgdGhlCisgKiBza2Igd2UganVzdCBzZW50IHRvIGl0LCB0aGlzIGxlYXZlcyB1cyB3aXRoIHRoZSBpcCBoZWFkZXIgc2l0dGluZworICogbmljZWx5IGFsaWduZWQgYXQgMHhmMDAxYjA1MC4gIEFsc28sIGZvciB0Y3AgYW5kIHVkcCBwYWNrZXRzIHRoZQorICogSGFwcHkgTWVhbCBoYXMgZXZlbiBjaGVja3N1bW1lZCB0aGUgdGNwL3VkcCBkYXRhIGZvciB1cy4gIFRoZSAxNgorICogYml0IGNoZWNrc3VtIGlzIG9idGFpbmVkIGZyb20gdGhlIGxvdyBiaXRzIG9mIHRoZSByZWNlaXZlIGRlc2NyaXB0b3IKKyAqIGZsYWdzLCB0aHVzOgorICoKKyAqIAlza2ItPmNzdW0gPSByeGQtPnJ4X2ZsYWdzICYgMHhmZmZmOworICogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fSFc7CisgKgorICogYmVmb3JlIHNlbmRpbmcgb2ZmIHRoZSBza2IgdG8gdGhlIHByb3RvY29scywgYW5kIHdlIGFyZSBnb29kIGFzIGdvbGQuCisgKi8KK3N0YXRpYyB2b2lkIGhhcHB5X21lYWxfY2xlYW5fcmluZ3Moc3RydWN0IGhhcHB5X21lYWwgKmhwKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCWlmIChocC0+cnhfc2tic1tpXSAhPSBOVUxMKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gaHAtPnJ4X3NrYnNbaV07CisJCQlzdHJ1Y3QgaGFwcHlfbWVhbF9yeGQgKnJ4ZDsKKwkJCXUzMiBkbWFfYWRkcjsKKworCQkJcnhkID0gJmhwLT5oYXBweV9ibG9jay0+aGFwcHlfbWVhbF9yeGRbaV07CisJCQlkbWFfYWRkciA9IGhtZV9yZWFkX2Rlc2MzMihocCwgJnJ4ZC0+cnhfYWRkcik7CisJCQlobWVfZG1hX3VubWFwKGhwLCBkbWFfYWRkciwgUlhfQlVGX0FMTE9DX1NJWkUsIERNQV9GUk9NREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQlocC0+cnhfc2tic1tpXSA9IE5VTEw7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJaWYgKGhwLT50eF9za2JzW2ldICE9IE5VTEwpIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSBocC0+dHhfc2tic1tpXTsKKwkJCXN0cnVjdCBoYXBweV9tZWFsX3R4ZCAqdHhkOworCQkJdTMyIGRtYV9hZGRyOworCQkJaW50IGZyYWc7CisKKwkJCWhwLT50eF9za2JzW2ldID0gTlVMTDsKKworCQkJZm9yIChmcmFnID0gMDsgZnJhZyA8PSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBmcmFnKyspIHsKKwkJCQl0eGQgPSAmaHAtPmhhcHB5X2Jsb2NrLT5oYXBweV9tZWFsX3R4ZFtpXTsKKwkJCQlkbWFfYWRkciA9IGhtZV9yZWFkX2Rlc2MzMihocCwgJnR4ZC0+dHhfYWRkcik7CisJCQkJaG1lX2RtYV91bm1hcChocCwgZG1hX2FkZHIsCisJCQkJCSAgICAgIChobWVfcmVhZF9kZXNjMzIoaHAsICZ0eGQtPnR4X2ZsYWdzKQorCQkJCQkgICAgICAgJiBUWEZMQUdfU0laRSksCisJCQkJCSAgICAgIERNQV9UT0RFVklDRSk7CisKKwkJCQlpZiAoZnJhZyAhPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKQorCQkJCQlpKys7CisJCQl9CisKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCX0KKwl9Cit9CisKKy8qIGhwLT5oYXBweV9sb2NrIG11c3QgYmUgaGVsZCAqLworc3RhdGljIHZvaWQgaGFwcHlfbWVhbF9pbml0X3JpbmdzKHN0cnVjdCBoYXBweV9tZWFsICpocCkKK3sKKwlzdHJ1Y3QgaG1lYWxfaW5pdF9ibG9jayAqaGIgPSBocC0+aGFwcHlfYmxvY2s7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGhwLT5kZXY7CisJaW50IGk7CisKKwlITUQoKCJoYXBweV9tZWFsX2luaXRfcmluZ3M6IGNvdW50ZXJzIHRvIHplcm8sICIpKTsKKwlocC0+cnhfbmV3ID0gaHAtPnJ4X29sZCA9IGhwLT50eF9uZXcgPSBocC0+dHhfb2xkID0gMDsKKworCS8qIEZyZWUgYW55IHNraXBweSBidWZzIGxlZnQgYXJvdW5kIGluIHRoZSByaW5ncy4gKi8KKwlITUQoKCJjbGVhbiwgIikpOworCWhhcHB5X21lYWxfY2xlYW5fcmluZ3MoaHApOworCisJLyogTm93IGdldCBuZXcgc2tpcHB5IGJ1ZnMgZm9yIHRoZSByZWNlaXZlIHJpbmcuICovCisJSE1EKCgiaW5pdCByeHJpbmcsICIpKTsKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlza2IgPSBoYXBweV9tZWFsX2FsbG9jX3NrYihSWF9CVUZfQUxMT0NfU0laRSwgR0ZQX0FUT01JQyk7CisJCWlmICghc2tiKSB7CisJCQlobWVfd3JpdGVfcnhkKGhwLCAmaGItPmhhcHB5X21lYWxfcnhkW2ldLCAwLCAwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWhwLT5yeF9za2JzW2ldID0gc2tiOworCQlza2ItPmRldiA9IGRldjsKKworCQkvKiBCZWNhdXNlIHdlIHJlc2VydmUgYWZ0ZXJ3YXJkcy4gKi8KKwkJc2tiX3B1dChza2IsIChFVEhfRlJBTUVfTEVOICsgUlhfT0ZGU0VUKSk7CisJCWhtZV93cml0ZV9yeGQoaHAsICZoYi0+aGFwcHlfbWVhbF9yeGRbaV0sCisJCQkgICAgICAoUlhGTEFHX09XTiB8ICgoUlhfQlVGX0FMTE9DX1NJWkUgLSBSWF9PRkZTRVQpIDw8IDE2KSksCisJCQkgICAgICBobWVfZG1hX21hcChocCwgc2tiLT5kYXRhLCBSWF9CVUZfQUxMT0NfU0laRSwgRE1BX0ZST01ERVZJQ0UpKTsKKwkJc2tiX3Jlc2VydmUoc2tiLCBSWF9PRkZTRVQpOworCX0KKworCUhNRCgoImluaXQgdHhyaW5nLCAiKSk7CisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCQlobWVfd3JpdGVfdHhkKGhwLCAmaGItPmhhcHB5X21lYWxfdHhkW2ldLCAwLCAwKTsKKworCUhNRCgoImRvbmVcbiIpKTsKK30KKworLyogaHAtPmhhcHB5X2xvY2sgbXVzdCBiZSBoZWxkICovCitzdGF0aWMgdm9pZCBoYXBweV9tZWFsX2JlZ2luX2F1dG9fbmVnb3RpYXRpb24oc3RydWN0IGhhcHB5X21lYWwgKmhwLAorCQkJCQkgICAgICB2b2lkIF9faW9tZW0gKnRyZWdzLAorCQkJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVwKQoreworCWludCB0aW1lb3V0OworCisJLyogUmVhZCBhbGwgb2YgdGhlIHJlZ2lzdGVycyB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBub3cuICovCisJaHAtPnN3X2Jtc3IgICAgICA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0JNU1IpOworCWhwLT5zd19ibWNyICAgICAgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9CTUNSKTsKKwlocC0+c3dfcGh5c2lkMSAgID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfUEhZU0lEMSk7CisJaHAtPnN3X3BoeXNpZDIgICA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX1BIWVNJRDIpOworCisJLyogWFhYIENoZWNrIEJNU1JfQU5FR0NBUEFCTEUsIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IHRob3VnaC4gKi8KKworCWhwLT5zd19hZHZlcnRpc2UgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9BRFZFUlRJU0UpOworCWlmIChlcCA9PSBOVUxMIHx8IGVwLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCS8qIEFkdmVydGlzZSBldmVyeXRoaW5nIHdlIGNhbiBzdXBwb3J0LiAqLworCQlpZiAoaHAtPnN3X2Jtc3IgJiBCTVNSXzEwSEFMRikKKwkJCWhwLT5zd19hZHZlcnRpc2UgfD0gKEFEVkVSVElTRV8xMEhBTEYpOworCQllbHNlCisJCQlocC0+c3dfYWR2ZXJ0aXNlICY9IH4oQURWRVJUSVNFXzEwSEFMRik7CisKKwkJaWYgKGhwLT5zd19ibXNyICYgQk1TUl8xMEZVTEwpCisJCQlocC0+c3dfYWR2ZXJ0aXNlIHw9IChBRFZFUlRJU0VfMTBGVUxMKTsKKwkJZWxzZQorCQkJaHAtPnN3X2FkdmVydGlzZSAmPSB+KEFEVkVSVElTRV8xMEZVTEwpOworCQlpZiAoaHAtPnN3X2Jtc3IgJiBCTVNSXzEwMEhBTEYpCisJCQlocC0+c3dfYWR2ZXJ0aXNlIHw9IChBRFZFUlRJU0VfMTAwSEFMRik7CisJCWVsc2UKKwkJCWhwLT5zd19hZHZlcnRpc2UgJj0gfihBRFZFUlRJU0VfMTAwSEFMRik7CisJCWlmIChocC0+c3dfYm1zciAmIEJNU1JfMTAwRlVMTCkKKwkJCWhwLT5zd19hZHZlcnRpc2UgfD0gKEFEVkVSVElTRV8xMDBGVUxMKTsKKwkJZWxzZQorCQkJaHAtPnN3X2FkdmVydGlzZSAmPSB+KEFEVkVSVElTRV8xMDBGVUxMKTsKKwkJaGFwcHlfbWVhbF90Y3ZyX3dyaXRlKGhwLCB0cmVncywgTUlJX0FEVkVSVElTRSwgaHAtPnN3X2FkdmVydGlzZSk7CisKKwkJLyogWFhYIEN1cnJlbnRseSBubyBIYXBweSBNZWFsIGNhcmRzIEkga25vdyBvZmYgc3VwcG9ydCAxMDBCYXNlVDQsCisJCSAqIFhYWCBhbmQgdGhpcyBpcyBiZWNhdXNlIHRoZSBEUDgzODQwIGRvZXMgbm90IHN1cHBvcnQgaXQsIGNoYW5nZXMKKwkJICogWFhYIHdvdWxkIG5lZWQgdG8gYmUgbWFkZSB0byB0aGUgdHgvcnggbG9naWMgaW4gdGhlIGRyaXZlciBhcyB3ZWxsCisJCSAqIFhYWCBzbyBJIGNvbXBsZXRlbHkgc2tpcCBjaGVja2luZyBmb3IgaXQgaW4gdGhlIEJNU1IgZm9yIG5vdy4KKwkJICovCisKKyNpZmRlZiBBVVRPX1NXSVRDSF9ERUJVRworCQlBU0QoKCIlczogQWR2ZXJ0aXNpbmcgWyAiLCBocC0+ZGV2LT5uYW1lKSk7CisJCWlmIChocC0+c3dfYWR2ZXJ0aXNlICYgQURWRVJUSVNFXzEwSEFMRikKKwkJCUFTRCgoIjEwSCAiKSk7CisJCWlmIChocC0+c3dfYWR2ZXJ0aXNlICYgQURWRVJUSVNFXzEwRlVMTCkKKwkJCUFTRCgoIjEwRiAiKSk7CisJCWlmIChocC0+c3dfYWR2ZXJ0aXNlICYgQURWRVJUSVNFXzEwMEhBTEYpCisJCQlBU0QoKCIxMDBIICIpKTsKKwkJaWYgKGhwLT5zd19hZHZlcnRpc2UgJiBBRFZFUlRJU0VfMTAwRlVMTCkKKwkJCUFTRCgoIjEwMEYgIikpOworI2VuZGlmCisKKwkJLyogRW5hYmxlIEF1dG8tTmVnb3RpYXRpb24sIHRoaXMgaXMgdXN1YWxseSBvbiBhbHJlYWR5Li4uICovCisJCWhwLT5zd19ibWNyIHw9IEJNQ1JfQU5FTkFCTEU7CisJCWhhcHB5X21lYWxfdGN2cl93cml0ZShocCwgdHJlZ3MsIE1JSV9CTUNSLCBocC0+c3dfYm1jcik7CisKKwkJLyogUmVzdGFydCBpdCB0byBtYWtlIHN1cmUgaXQgaXMgZ29pbmcuICovCisJCWhwLT5zd19ibWNyIHw9IEJNQ1JfQU5SRVNUQVJUOworCQloYXBweV9tZWFsX3RjdnJfd3JpdGUoaHAsIHRyZWdzLCBNSUlfQk1DUiwgaHAtPnN3X2JtY3IpOworCisJCS8qIEJNQ1JfQU5SRVNUQVJUIHNlbGYgY2xlYXJzIHdoZW4gdGhlIHByb2Nlc3MgaGFzIGJlZ3VuLiAqLworCisJCXRpbWVvdXQgPSA2NDsgIC8qIE1vcmUgdGhhbiBlbm91Z2guICovCisJCXdoaWxlICgtLXRpbWVvdXQpIHsKKwkJCWhwLT5zd19ibWNyID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfQk1DUik7CisJCQlpZiAoIShocC0+c3dfYm1jciAmIEJNQ1JfQU5SRVNUQVJUKSkKKwkJCQlicmVhazsgLyogZ290IGl0LiAqLworCQkJdWRlbGF5KDEwKTsKKwkJfQorCQlpZiAoIXRpbWVvdXQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEhhcHB5IE1lYWwgd291bGQgbm90IHN0YXJ0IGF1dG8gbmVnb3RpYXRpb24gIgorCQkJICAgICAgICJCTUNSPTB4JTA0eFxuIiwgaHAtPmRldi0+bmFtZSwgaHAtPnN3X2JtY3IpOworCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogUGVyZm9ybWluZyBmb3JjZSBsaW5rIGRldGVjdGlvbi5cbiIsCisJCQkgICAgICAgaHAtPmRldi0+bmFtZSk7CisJCQlnb3RvIGZvcmNlX2xpbms7CisJCX0gZWxzZSB7CisJCQlocC0+dGltZXJfc3RhdGUgPSBhcmJ3YWl0OworCQl9CisJfSBlbHNlIHsKK2ZvcmNlX2xpbms6CisJCS8qIEZvcmNlIHRoZSBsaW5rIHVwLCB0cnlpbmcgZmlyc3QgYSBwYXJ0aWN1bGFyIG1vZGUuCisJCSAqIEVpdGhlciB3ZSBhcmUgaGVyZSBhdCB0aGUgcmVxdWVzdCBvZiBldGh0b29sIG9yCisJCSAqIGJlY2F1c2UgdGhlIEhhcHB5IE1lYWwgd291bGQgbm90IHN0YXJ0IHRvIGF1dG9uZWcuCisJCSAqLworCisJCS8qIERpc2FibGUgYXV0by1uZWdvdGlhdGlvbiBpbiBCTUNSLCBlbmFibGUgdGhlIGR1cGxleCBhbmQKKwkJICogc3BlZWQgc2V0dGluZywgaW5pdCB0aGUgdGltZXIgc3RhdGUgbWFjaGluZSwgYW5kIGZpcmUgaXQgb2ZmLgorCQkgKi8KKwkJaWYgKGVwID09IE5VTEwgfHwgZXAtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJCWhwLT5zd19ibWNyID0gQk1DUl9TUEVFRDEwMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChlcC0+c3BlZWQgPT0gU1BFRURfMTAwKQorCQkJCWhwLT5zd19ibWNyID0gQk1DUl9TUEVFRDEwMDsKKwkJCWVsc2UKKwkJCQlocC0+c3dfYm1jciA9IDA7CisJCQlpZiAoZXAtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCQlocC0+c3dfYm1jciB8PSBCTUNSX0ZVTExEUExYOworCQl9CisJCWhhcHB5X21lYWxfdGN2cl93cml0ZShocCwgdHJlZ3MsIE1JSV9CTUNSLCBocC0+c3dfYm1jcik7CisKKwkJaWYgKCFpc19sdWNlbnRfcGh5KGhwKSkgeworCQkJLyogT0ssIHNlZW1zIHdlIG5lZWQgZG8gZGlzYWJsZSB0aGUgdHJhbnNjZWl2ZXIgZm9yIHRoZSBmaXJzdAorCQkJICogdGljayB0byBtYWtlIHN1cmUgd2UgZ2V0IGFuIGFjY3VyYXRlIGxpbmsgc3RhdGUgYXQgdGhlCisJCQkgKiBzZWNvbmQgdGljay4KKwkJCSAqLworCQkJaHAtPnN3X2NzY29uZmlnID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLAorCQkJCQkJCSAgICAgICBEUDgzODQwX0NTQ09ORklHKTsKKwkJCWhwLT5zd19jc2NvbmZpZyAmPSB+KENTQ09ORklHX1RDVkRJU0FCKTsKKwkJCWhhcHB5X21lYWxfdGN2cl93cml0ZShocCwgdHJlZ3MsIERQODM4NDBfQ1NDT05GSUcsCisJCQkJCSAgICAgIGhwLT5zd19jc2NvbmZpZyk7CisJCX0KKwkJaHAtPnRpbWVyX3N0YXRlID0gbHRyeXdhaXQ7CisJfQorCisJaHAtPnRpbWVyX3RpY2tzID0gMDsKKwlocC0+aGFwcHlfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoMTIgKiBIWikvMTA7ICAvKiAxLjIgc2VjLiAqLworCWhwLT5oYXBweV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGhwOworCWhwLT5oYXBweV90aW1lci5mdW5jdGlvbiA9ICZoYXBweV9tZWFsX3RpbWVyOworCWFkZF90aW1lcigmaHAtPmhhcHB5X3RpbWVyKTsKK30KKworLyogaHAtPmhhcHB5X2xvY2sgbXVzdCBiZSBoZWxkICovCitzdGF0aWMgaW50IGhhcHB5X21lYWxfaW5pdChzdHJ1Y3QgaGFwcHlfbWVhbCAqaHApCit7CisJdm9pZCBfX2lvbWVtICpncmVncyAgICAgICAgPSBocC0+Z3JlZ3M7CisJdm9pZCBfX2lvbWVtICpldHhyZWdzICAgICAgPSBocC0+ZXR4cmVnczsKKwl2b2lkIF9faW9tZW0gKmVyeHJlZ3MgICAgICA9IGhwLT5lcnhyZWdzOworCXZvaWQgX19pb21lbSAqYnJlZ3MgICAgICAgID0gaHAtPmJpZ21hY3JlZ3M7CisJdm9pZCBfX2lvbWVtICp0cmVncyAgICAgICAgPSBocC0+dGN2cmVnczsKKwl1MzIgcmVndG1wLCByeGNmZzsKKwl1bnNpZ25lZCBjaGFyICplID0gJmhwLT5kZXYtPmRldl9hZGRyWzBdOworCisJLyogSWYgYXV0by1uZWdvdGlhdGlvbiB0aW1lciBpcyBydW5uaW5nLCBraWxsIGl0LiAqLworCWRlbF90aW1lcigmaHAtPmhhcHB5X3RpbWVyKTsKKworCUhNRCgoImhhcHB5X21lYWxfaW5pdDogaGFwcHlfZmxhZ3NbJTA4eF0gIiwKKwkgICAgIGhwLT5oYXBweV9mbGFncykpOworCWlmICghKGhwLT5oYXBweV9mbGFncyAmIEhGTEFHX0lOSVQpKSB7CisJCUhNRCgoInNldCBIRkxBR19JTklULCAiKSk7CisJCWhwLT5oYXBweV9mbGFncyB8PSBIRkxBR19JTklUOworCQloYXBweV9tZWFsX2dldF9jb3VudGVycyhocCwgYnJlZ3MpOworCX0KKworCS8qIFN0b3AgcG9sbGluZy4gKi8KKwlITUQoKCJ0byBoYXBweV9tZWFsX3BvbGxfc3RvcFxuIikpOworCWhhcHB5X21lYWxfcG9sbF9zdG9wKGhwLCB0cmVncyk7CisKKwkvKiBTdG9wIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlci4gKi8KKwlITUQoKCJoYXBweV9tZWFsX2luaXQ6IHRvIGhhcHB5X21lYWxfc3RvcFxuIikpOworCWhhcHB5X21lYWxfc3RvcChocCwgZ3JlZ3MpOworCisJLyogQWxsb2MgYW5kIHJlc2V0IHRoZSB0eC9yeCBkZXNjcmlwdG9yIGNoYWlucy4gKi8KKwlITUQoKCJoYXBweV9tZWFsX2luaXQ6IHRvIGhhcHB5X21lYWxfaW5pdF9yaW5nc1xuIikpOworCWhhcHB5X21lYWxfaW5pdF9yaW5ncyhocCk7CisKKwkvKiBTaHV0IHVwIHRoZSBNSUYuICovCisJSE1EKCgiaGFwcHlfbWVhbF9pbml0OiBEaXNhYmxlIGFsbCBNSUYgaXJxcyAob2xkWyUwOHhdKSwgIiwKKwkgICAgIGhtZV9yZWFkMzIoaHAsIHRyZWdzICsgVENWUl9JTUFTSykpKTsKKwlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0lNQVNLLCAweGZmZmYpOworCisJLyogU2VlIGlmIHdlIGNhbiBlbmFibGUgdGhlIE1JRiBmcmFtZSBvbiB0aGlzIGNhcmQgdG8gc3BlYWsgdG8gdGhlIERQODM4NDAuICovCisJaWYgKGhwLT5oYXBweV9mbGFncyAmIEhGTEFHX0ZFTkFCTEUpIHsKKwkJSE1EKCgidXNlIGZyYW1lIG9sZFslMDh4XSwgIiwKKwkJICAgICBobWVfcmVhZDMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHKSkpOworCQlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRywKKwkJCSAgICBobWVfcmVhZDMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHKSAmIH4oVENWX0NGR19CRU5BQkxFKSk7CisJfSBlbHNlIHsKKwkJSE1EKCgidXNlIGJpdGJhbmcgb2xkWyUwOHhdLCAiLAorCQkgICAgIGhtZV9yZWFkMzIoaHAsIHRyZWdzICsgVENWUl9DRkcpKSk7CisJCWhtZV93cml0ZTMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHLAorCQkJICAgIGhtZV9yZWFkMzIoaHAsIHRyZWdzICsgVENWUl9DRkcpIHwgVENWX0NGR19CRU5BQkxFKTsKKwl9CisKKwkvKiBDaGVjayB0aGUgc3RhdGUgb2YgdGhlIHRyYW5zY2VpdmVyLiAqLworCUhNRCgoInRvIGhhcHB5X21lYWxfdHJhbnNjZWl2ZXJfY2hlY2tcbiIpKTsKKwloYXBweV9tZWFsX3RyYW5zY2VpdmVyX2NoZWNrKGhwLCB0cmVncyk7CisKKwkvKiBQdXQgdGhlIEJpZyBNYWMgaW50byBhIHNhbmUgc3RhdGUuICovCisJSE1EKCgiaGFwcHlfbWVhbF9pbml0OiAiKSk7CisJc3dpdGNoKGhwLT50Y3ZyX3R5cGUpIHsKKwljYXNlIG5vbmU6CisJCS8qIENhbm5vdCBvcGVyYXRlIGlmIHdlIGRvbid0IGtub3cgdGhlIHRyYW5zY2VpdmVyIHR5cGUhICovCisJCUhNRCgoIkFBSUVFRSBubyB0cmFuc2NlaXZlciB0eXBlLCBFQUdBSU4iKSk7CisJCXJldHVybiAtRUFHQUlOOworCisJY2FzZSBpbnRlcm5hbDoKKwkJLyogVXNpbmcgdGhlIE1JSSBidWZmZXJzLiAqLworCQlITUQoKCJpbnRlcm5hbCwgdXNpbmcgTUlJLCAiKSk7CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfWElGQ0ZHLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIGV4dGVybmFsOgorCQkvKiBOb3QgdXNpbmcgdGhlIE1JSSwgZGlzYWJsZSBpdC4gKi8KKwkJSE1EKCgiZXh0ZXJuYWwsIGRpc2FibGUgTUlJLCAiKSk7CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfWElGQ0ZHLCBCSUdNQUNfWENGR19NSUlESVNBQik7CisJCWJyZWFrOworCX07CisKKwlpZiAoaGFwcHlfbWVhbF90Y3ZyX3Jlc2V0KGhwLCB0cmVncykpCisJCXJldHVybiAtRUFHQUlOOworCisJLyogUmVzZXQgdGhlIEhhcHB5IE1lYWwgQmlnIE1hYyB0cmFuc2NlaXZlciBhbmQgdGhlIHJlY2VpdmVyLiAqLworCUhNRCgoInR4L3J4IHJlc2V0LCAiKSk7CisJaGFwcHlfbWVhbF90eF9yZXNldChocCwgYnJlZ3MpOworCWhhcHB5X21lYWxfcnhfcmVzZXQoaHAsIGJyZWdzKTsKKworCS8qIFNldCBqYW0gc2l6ZSBhbmQgaW50ZXItcGFja2V0IGdhcHMgdG8gcmVhc29uYWJsZSBkZWZhdWx0cy4gKi8KKwlITUQoKCJqc2l6ZS9pcGcxL2lwZzIsICIpKTsKKwlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0pTSVpFLCBERUZBVUxUX0pBTVNJWkUpOworCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSUdBUDEsIERFRkFVTFRfSVBHMSk7CisJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19JR0FQMiwgREVGQVVMVF9JUEcyKTsKKworCS8qIExvYWQgdXAgdGhlIE1BQyBhZGRyZXNzIGFuZCByYW5kb20gc2VlZC4gKi8KKwlITUQoKCJyc2VlZC9tYWNhZGRyLCAiKSk7CisKKwkvKiBUaGUgZG9jcyByZWNvbW1lbmQgdG8gdXNlIHRoZSAxMExTQiBvZiBvdXIgTUFDIGhlcmUuICovCisJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19SU0VFRCwgKChlWzVdIHwgZVs0XTw8OCkmMHgzZmYpKTsKKworCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfTUFDQUREUjIsICgoZVs0XSA8PCA4KSB8IGVbNV0pKTsKKwlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX01BQ0FERFIxLCAoKGVbMl0gPDwgOCkgfCBlWzNdKSk7CisJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19NQUNBRERSMCwgKChlWzBdIDw8IDgpIHwgZVsxXSkpOworCisJSE1EKCgiaHRhYmxlLCAiKSk7CisJaWYgKChocC0+ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgfHwKKwkgICAgKGhwLT5kZXYtPm1jX2NvdW50ID4gNjQpKSB7CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSFRBQkxFMCwgMHhmZmZmKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19IVEFCTEUxLCAweGZmZmYpOworCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTIsIDB4ZmZmZik7CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSFRBQkxFMywgMHhmZmZmKTsKKwl9IGVsc2UgaWYgKChocC0+ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSA9PSAwKSB7CisJCXUxNiBoYXNoX3RhYmxlWzRdOworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IGhwLT5kZXYtPm1jX2xpc3Q7CisJCWNoYXIgKmFkZHJzOworCQlpbnQgaTsKKwkJdTMyIGNyYzsKKworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJaGFzaF90YWJsZVtpXSA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IGhwLT5kZXYtPm1jX2NvdW50OyBpKyspIHsKKwkJCWFkZHJzID0gZG1pLT5kbWlfYWRkcjsKKwkJCWRtaSA9IGRtaS0+bmV4dDsKKworCQkJaWYgKCEoKmFkZHJzICYgMSkpCisJCQkJY29udGludWU7CisKKwkJCWNyYyA9IGV0aGVyX2NyY19sZSg2LCBhZGRycyk7CisJCQljcmMgPj49IDI2OworCQkJaGFzaF90YWJsZVtjcmMgPj4gNF0gfD0gMSA8PCAoY3JjICYgMHhmKTsKKwkJfQorCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTAsIGhhc2hfdGFibGVbMF0pOworCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTEsIGhhc2hfdGFibGVbMV0pOworCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTIsIGhhc2hfdGFibGVbMl0pOworCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTMsIGhhc2hfdGFibGVbM10pOworCX0gZWxzZSB7CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSFRBQkxFMywgMCk7CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSFRBQkxFMiwgMCk7CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSFRBQkxFMSwgMCk7CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSFRBQkxFMCwgMCk7CisJfQorCisJLyogU2V0IHRoZSBSWCBhbmQgVFggcmluZyBwdHJzLiAqLworCUhNRCgoInJpbmcgcHRycyByeHJbJTA4eF0gdHhyWyUwOHhdXG4iLAorCSAgICAgKChfX3UzMilocC0+aGJsb2NrX2R2bWEgKyBoYmxvY2tfb2Zmc2V0KGhhcHB5X21lYWxfcnhkLCAwKSksCisJICAgICAoKF9fdTMyKWhwLT5oYmxvY2tfZHZtYSArIGhibG9ja19vZmZzZXQoaGFwcHlfbWVhbF90eGQsIDApKSkpOworCWhtZV93cml0ZTMyKGhwLCBlcnhyZWdzICsgRVJYX1JJTkcsCisJCSAgICAoKF9fdTMyKWhwLT5oYmxvY2tfZHZtYSArIGhibG9ja19vZmZzZXQoaGFwcHlfbWVhbF9yeGQsIDApKSk7CisJaG1lX3dyaXRlMzIoaHAsIGV0eHJlZ3MgKyBFVFhfUklORywKKwkJICAgICgoX191MzIpaHAtPmhibG9ja19kdm1hICsgaGJsb2NrX29mZnNldChoYXBweV9tZWFsX3R4ZCwgMCkpKTsKKworCS8qIFBhcml0eSBpc3N1ZXMgaW4gdGhlIEVSWCB1bml0IG9mIHNvbWUgSE1FIHJldmlzaW9ucyBjYW4gY2F1c2Ugc29tZQorCSAqIHJlZ2lzdGVycyB0byBub3QgYmUgd3JpdHRlbiB1bmxlc3MgdGhlaXIgcGFyaXR5IGlzIGV2ZW4uICBEZXRlY3Qgc3VjaAorCSAqIGxvc3Qgd3JpdGVzIGFuZCBzaW1wbHkgcmV3cml0ZSB3aXRoIGEgbG93IGJpdCBzZXQgKHdoaWNoIHdpbGwgYmUgaWdub3JlZAorCSAqIHNpbmNlIHRoZSByeHJpbmcgbmVlZHMgdG8gYmUgMksgYWxpZ25lZCkuCisJICovCisJaWYgKGhtZV9yZWFkMzIoaHAsIGVyeHJlZ3MgKyBFUlhfUklORykgIT0KKwkgICAgKChfX3UzMilocC0+aGJsb2NrX2R2bWEgKyBoYmxvY2tfb2Zmc2V0KGhhcHB5X21lYWxfcnhkLCAwKSkpCisJCWhtZV93cml0ZTMyKGhwLCBlcnhyZWdzICsgRVJYX1JJTkcsCisJCQkgICAgKChfX3UzMilocC0+aGJsb2NrX2R2bWEgKyBoYmxvY2tfb2Zmc2V0KGhhcHB5X21lYWxfcnhkLCAwKSkKKwkJCSAgICB8IDB4NCk7CisKKwkvKiBTZXQgdGhlIHN1cHBvcnRlZCBidXJzdCBzaXplcy4gKi8KKwlITUQoKCJoYXBweV9tZWFsX2luaXQ6IG9sZFslMDh4XSBidXJzdHM8IiwKKwkgICAgIGhtZV9yZWFkMzIoaHAsIGdyZWdzICsgR1JFR19DRkcpKSk7CisKKyNpZm5kZWYgX19zcGFyY19fCisJLyogSXQgaXMgYWx3YXlzIFBDSSBhbmQgY2FuIGhhbmRsZSA2NGJ5dGUgYnVyc3RzLiAqLworCWhtZV93cml0ZTMyKGhwLCBncmVncyArIEdSRUdfQ0ZHLCBHUkVHX0NGR19CVVJTVDY0KTsKKyNlbHNlCisJaWYgKChocC0+aGFwcHlfYnVyc3RzICYgRE1BX0JVUlNUNjQpICYmCisJICAgICgoaHAtPmhhcHB5X2ZsYWdzICYgSEZMQUdfUENJKSAhPSAwCisjaWZkZWYgQ09ORklHX1NCVVMKKwkgICAgIHx8IHNidXNfY2FuX2J1cnN0NjQoaHAtPmhhcHB5X2RldikKKyNlbmRpZgorCSAgICAgfHwgMCkpIHsKKwkJdTMyIGdjZmcgPSBHUkVHX0NGR19CVVJTVDY0OworCisJCS8qIEkgaGF2ZSBubyBpZGVhIGlmIEkgc2hvdWxkIHNldCB0aGUgZXh0ZW5kZWQKKwkJICogdHJhbnNmZXIgbW9kZSBiaXQgZm9yIENoZWVyaW8sIHNvIGZvciBub3cgSQorCQkgKiBkbyBub3QuICAtRGF2ZU0KKwkJICovCisjaWZkZWYgQ09ORklHX1NCVVMKKwkJaWYgKChocC0+aGFwcHlfZmxhZ3MgJiBIRkxBR19QQ0kpID09IDAgJiYKKwkJICAgIHNidXNfY2FuX2RtYV82NGJpdChocC0+aGFwcHlfZGV2KSkgeworCQkJc2J1c19zZXRfc2J1czY0KGhwLT5oYXBweV9kZXYsCisJCQkJCWhwLT5oYXBweV9idXJzdHMpOworCQkJZ2NmZyB8PSBHUkVHX0NGR182NEJJVDsKKwkJfQorI2VuZGlmCisKKwkJSE1EKCgiNjQ+IikpOworCQlobWVfd3JpdGUzMihocCwgZ3JlZ3MgKyBHUkVHX0NGRywgZ2NmZyk7CisJfSBlbHNlIGlmIChocC0+aGFwcHlfYnVyc3RzICYgRE1BX0JVUlNUMzIpIHsKKwkJSE1EKCgiMzI+IikpOworCQlobWVfd3JpdGUzMihocCwgZ3JlZ3MgKyBHUkVHX0NGRywgR1JFR19DRkdfQlVSU1QzMik7CisJfSBlbHNlIGlmIChocC0+aGFwcHlfYnVyc3RzICYgRE1BX0JVUlNUMTYpIHsKKwkJSE1EKCgiMTY+IikpOworCQlobWVfd3JpdGUzMihocCwgZ3JlZ3MgKyBHUkVHX0NGRywgR1JFR19DRkdfQlVSU1QxNik7CisJfSBlbHNlIHsKKwkJSE1EKCgiWFhYPiIpKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGdyZWdzICsgR1JFR19DRkcsIDApOworCX0KKyNlbmRpZiAvKiBfX3NwYXJjX18gKi8KKworCS8qIFR1cm4gb2ZmIGludGVycnVwdHMgd2UgZG8gbm90IHdhbnQgdG8gaGVhci4gKi8KKwlITUQoKCIsIGVuYWJsZSBnbG9iYWwgaW50ZXJydXB0cywgIikpOworCWhtZV93cml0ZTMyKGhwLCBncmVncyArIEdSRUdfSU1BU0ssCisJCSAgICAoR1JFR19JTUFTS19HT1RGUkFNRSB8IEdSRUdfSU1BU0tfUkNOVEVYUCB8CisJCSAgICAgR1JFR19JTUFTS19TRU5URlJBTUUgfCBHUkVHX0lNQVNLX1RYUEVSUikpOworCisJLyogU2V0IHRoZSB0cmFuc21pdCByaW5nIGJ1ZmZlciBzaXplLiAqLworCUhNRCgoInR4IHJzaXplPSVkIG9yZWdbJTA4eF0sICIsIChpbnQpVFhfUklOR19TSVpFLAorCSAgICAgaG1lX3JlYWQzMihocCwgZXR4cmVncyArIEVUWF9SU0laRSkpKTsKKwlobWVfd3JpdGUzMihocCwgZXR4cmVncyArIEVUWF9SU0laRSwgKFRYX1JJTkdfU0laRSA+PiBFVFhfUlNJWkVfU0hJRlQpIC0gMSk7CisKKwkvKiBFbmFibGUgdHJhbnNtaXR0ZXIgRFZNQS4gKi8KKwlITUQoKCJ0eCBkbWEgZW5hYmxlIG9sZFslMDh4XSwgIiwKKwkgICAgIGhtZV9yZWFkMzIoaHAsIGV0eHJlZ3MgKyBFVFhfQ0ZHKSkpOworCWhtZV93cml0ZTMyKGhwLCBldHhyZWdzICsgRVRYX0NGRywKKwkJICAgIGhtZV9yZWFkMzIoaHAsIGV0eHJlZ3MgKyBFVFhfQ0ZHKSB8IEVUWF9DRkdfRE1BRU5BQkxFKTsKKworCS8qIFRoaXMgY2hpcCByZWFsbHkgcm90cywgZm9yIHRoZSByZWNlaXZlciBzb21ldGltZXMgd2hlbiB5b3UKKwkgKiB3cml0ZSB0byBpdHMgY29udHJvbCByZWdpc3RlcnMgbm90IGFsbCB0aGUgYml0cyBnZXQgdGhlcmUKKwkgKiBwcm9wZXJseS4gIEkgY2Fubm90IHRoaW5rIG9mIGEgc2FuZSB3YXkgdG8gcHJvdmlkZSBjb21wbGV0ZQorCSAqIGNvdmVyYWdlIGZvciB0aGlzIGhhcmR3YXJlIGJ1ZyB5ZXQuCisJICovCisJSE1EKCgiZXJ4IHJlZ3MgYnVnIG9sZFslMDh4XVxuIiwKKwkgICAgIGhtZV9yZWFkMzIoaHAsIGVyeHJlZ3MgKyBFUlhfQ0ZHKSkpOworCWhtZV93cml0ZTMyKGhwLCBlcnhyZWdzICsgRVJYX0NGRywgRVJYX0NGR19ERUZBVUxUKFJYX09GRlNFVCkpOworCXJlZ3RtcCA9IGhtZV9yZWFkMzIoaHAsIGVyeHJlZ3MgKyBFUlhfQ0ZHKTsKKwlobWVfd3JpdGUzMihocCwgZXJ4cmVncyArIEVSWF9DRkcsIEVSWF9DRkdfREVGQVVMVChSWF9PRkZTRVQpKTsKKwlpZiAoaG1lX3JlYWQzMihocCwgZXJ4cmVncyArIEVSWF9DRkcpICE9IEVSWF9DRkdfREVGQVVMVChSWF9PRkZTRVQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHkgbWVhbDogRWllZWUsIHJ4IGNvbmZpZyByZWdpc3RlciBnZXRzIGdyZWFzeSBmcmllcy5cbiIpOworCQlwcmludGsoS0VSTl9FUlIgImhhcHB5IG1lYWw6IFRyeWluZyB0byBzZXQgJTA4eCwgcmVyZWFkIGdpdmVzICUwOHhcbiIsCisJCSAgICAgICBFUlhfQ0ZHX0RFRkFVTFQoUlhfT0ZGU0VUKSwgcmVndG1wKTsKKwkJLyogWFhYIFNob3VsZCByZXR1cm4gZmFpbHVyZSBoZXJlLi4uICovCisJfQorCisJLyogRW5hYmxlIEJpZyBNYWMgaGFzaCB0YWJsZSBmaWx0ZXIuICovCisJSE1EKCgiaGFwcHlfbWVhbF9pbml0OiBlbmFibGUgaGFzaCByeF9jZmdfb2xkWyUwOHhdLCAiLAorCSAgICAgaG1lX3JlYWQzMihocCwgYnJlZ3MgKyBCTUFDX1JYQ0ZHKSkpOworCXJ4Y2ZnID0gQklHTUFDX1JYQ0ZHX0hFTkFCTEUgfCBCSUdNQUNfUlhDRkdfUkVKTUU7CisJaWYgKGhwLT5kZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCXJ4Y2ZnIHw9IEJJR01BQ19SWENGR19QTUlTQzsKKwlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX1JYQ0ZHLCByeGNmZyk7CisKKwkvKiBMZXQgdGhlIGJpdHMgc2V0dGxlIGluIHRoZSBjaGlwLiAqLworCXVkZWxheSgxMCk7CisKKwkvKiBPaywgY29uZmlndXJlIHRoZSBCaWcgTWFjIHRyYW5zbWl0dGVyLiAqLworCUhNRCgoIkJJR01BQyBpbml0LCAiKSk7CisJcmVndG1wID0gMDsKKwlpZiAoaHAtPmhhcHB5X2ZsYWdzICYgSEZMQUdfRlVMTCkKKwkJcmVndG1wIHw9IEJJR01BQ19UWENGR19GVUxMRFBMWDsKKworCS8qIERvbid0IHR1cm4gb24gdGhlICJkb24ndCBnaXZlIHVwIiBiaXQgZm9yIG5vdy4gIEl0IGNvdWxkIGNhdXNlIGhtZQorCSAqIHRvIGRlYWRsb2NrIHdpdGggdGhlIFBIWSBpZiBhIEphYmJlciBvY2N1cnMuCisJICovCisJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19UWENGRywgcmVndG1wIC8qfCBCSUdNQUNfVFhDRkdfREdJVkVVUCovKTsKKworCS8qIEdpdmUgdXAgYWZ0ZXIgMTYgVFggYXR0ZW1wdHMuICovCisJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19BTElNSVQsIDE2KTsKKworCS8qIEVuYWJsZSB0aGUgb3V0cHV0IGRyaXZlcnMgbm8gbWF0dGVyIHdoYXQuICovCisJcmVndG1wID0gQklHTUFDX1hDRkdfT0RFTkFCTEU7CisKKwkvKiBJZiBjYXJkIGNhbiBkbyBsYW5jZSBtb2RlLCBlbmFibGUgaXQuICovCisJaWYgKGhwLT5oYXBweV9mbGFncyAmIEhGTEFHX0xBTkNFKQorCQlyZWd0bXAgfD0gKERFRkFVTFRfSVBHMCA8PCA1KSB8IEJJR01BQ19YQ0ZHX0xBTkNFOworCisJLyogRGlzYWJsZSB0aGUgTUlJIGJ1ZmZlcnMgaWYgdXNpbmcgZXh0ZXJuYWwgdHJhbnNjZWl2ZXIuICovCisJaWYgKGhwLT50Y3ZyX3R5cGUgPT0gZXh0ZXJuYWwpCisJCXJlZ3RtcCB8PSBCSUdNQUNfWENGR19NSUlESVNBQjsKKworCUhNRCgoIlhJRiBjb25maWcgb2xkWyUwOHhdLCAiLAorCSAgICAgaG1lX3JlYWQzMihocCwgYnJlZ3MgKyBCTUFDX1hJRkNGRykpKTsKKwlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX1hJRkNGRywgcmVndG1wKTsKKworCS8qIFN0YXJ0IHRoaW5ncyB1cC4gKi8KKwlITUQoKCJ0eCBvbGRbJTA4eF0gYW5kIHJ4IFslMDh4XSBPTiFcbiIsCisJICAgICBobWVfcmVhZDMyKGhwLCBicmVncyArIEJNQUNfVFhDRkcpLAorCSAgICAgaG1lX3JlYWQzMihocCwgYnJlZ3MgKyBCTUFDX1JYQ0ZHKSkpOworCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfVFhDRkcsCisJCSAgICBobWVfcmVhZDMyKGhwLCBicmVncyArIEJNQUNfVFhDRkcpIHwgQklHTUFDX1RYQ0ZHX0VOQUJMRSk7CisJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19SWENGRywKKwkJICAgIGhtZV9yZWFkMzIoaHAsIGJyZWdzICsgQk1BQ19SWENGRykgfCBCSUdNQUNfUlhDRkdfRU5BQkxFKTsKKworCS8qIEdldCB0aGUgYXV0b25lZ290aWF0aW9uIHN0YXJ0ZWQsIGFuZCB0aGUgd2F0Y2ggdGltZXIgdGlja2luZy4gKi8KKwloYXBweV9tZWFsX2JlZ2luX2F1dG9fbmVnb3RpYXRpb24oaHAsIHRyZWdzLCBOVUxMKTsKKworCS8qIFN1Y2Nlc3MuICovCisJcmV0dXJuIDA7Cit9CisKKy8qIGhwLT5oYXBweV9sb2NrIG11c3QgYmUgaGVsZCAqLworc3RhdGljIHZvaWQgaGFwcHlfbWVhbF9zZXRfaW5pdGlhbF9hZHZlcnRpc2VtZW50KHN0cnVjdCBoYXBweV9tZWFsICpocCkKK3sKKwl2b2lkIF9faW9tZW0gKnRyZWdzCT0gaHAtPnRjdnJlZ3M7CisJdm9pZCBfX2lvbWVtICpicmVncwk9IGhwLT5iaWdtYWNyZWdzOworCXZvaWQgX19pb21lbSAqZ3JlZ3MJPSBocC0+Z3JlZ3M7CisKKwloYXBweV9tZWFsX3N0b3AoaHAsIGdyZWdzKTsKKwlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0lNQVNLLCAweGZmZmYpOworCWlmIChocC0+aGFwcHlfZmxhZ3MgJiBIRkxBR19GRU5BQkxFKQorCQlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRywKKwkJCSAgICBobWVfcmVhZDMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHKSAmIH4oVENWX0NGR19CRU5BQkxFKSk7CisJZWxzZQorCQlobWVfd3JpdGUzMihocCwgdHJlZ3MgKyBUQ1ZSX0NGRywKKwkJCSAgICBobWVfcmVhZDMyKGhwLCB0cmVncyArIFRDVlJfQ0ZHKSB8IFRDVl9DRkdfQkVOQUJMRSk7CisJaGFwcHlfbWVhbF90cmFuc2NlaXZlcl9jaGVjayhocCwgdHJlZ3MpOworCXN3aXRjaChocC0+dGN2cl90eXBlKSB7CisJY2FzZSBub25lOgorCQlyZXR1cm47CisJY2FzZSBpbnRlcm5hbDoKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19YSUZDRkcsIDApOworCQlicmVhazsKKwljYXNlIGV4dGVybmFsOgorCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX1hJRkNGRywgQklHTUFDX1hDRkdfTUlJRElTQUIpOworCQlicmVhazsKKwl9OworCWlmIChoYXBweV9tZWFsX3RjdnJfcmVzZXQoaHAsIHRyZWdzKSkKKwkJcmV0dXJuOworCisJLyogTGF0Y2ggUEhZIHJlZ2lzdGVycyBhcyBvZiBub3cuICovCisJaHAtPnN3X2Jtc3IgICAgICA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0JNU1IpOworCWhwLT5zd19hZHZlcnRpc2UgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgdHJlZ3MsIE1JSV9BRFZFUlRJU0UpOworCisJLyogQWR2ZXJ0aXNlIGV2ZXJ5dGhpbmcgd2UgY2FuIHN1cHBvcnQuICovCisJaWYgKGhwLT5zd19ibXNyICYgQk1TUl8xMEhBTEYpCisJCWhwLT5zd19hZHZlcnRpc2UgfD0gKEFEVkVSVElTRV8xMEhBTEYpOworCWVsc2UKKwkJaHAtPnN3X2FkdmVydGlzZSAmPSB+KEFEVkVSVElTRV8xMEhBTEYpOworCisJaWYgKGhwLT5zd19ibXNyICYgQk1TUl8xMEZVTEwpCisJCWhwLT5zd19hZHZlcnRpc2UgfD0gKEFEVkVSVElTRV8xMEZVTEwpOworCWVsc2UKKwkJaHAtPnN3X2FkdmVydGlzZSAmPSB+KEFEVkVSVElTRV8xMEZVTEwpOworCWlmIChocC0+c3dfYm1zciAmIEJNU1JfMTAwSEFMRikKKwkJaHAtPnN3X2FkdmVydGlzZSB8PSAoQURWRVJUSVNFXzEwMEhBTEYpOworCWVsc2UKKwkJaHAtPnN3X2FkdmVydGlzZSAmPSB+KEFEVkVSVElTRV8xMDBIQUxGKTsKKwlpZiAoaHAtPnN3X2Jtc3IgJiBCTVNSXzEwMEZVTEwpCisJCWhwLT5zd19hZHZlcnRpc2UgfD0gKEFEVkVSVElTRV8xMDBGVUxMKTsKKwllbHNlCisJCWhwLT5zd19hZHZlcnRpc2UgJj0gfihBRFZFUlRJU0VfMTAwRlVMTCk7CisKKwkvKiBVcGRhdGUgdGhlIFBIWSBhZHZlcnRpc2VtZW50IHJlZ2lzdGVyLiAqLworCWhhcHB5X21lYWxfdGN2cl93cml0ZShocCwgdHJlZ3MsIE1JSV9BRFZFUlRJU0UsIGhwLT5zd19hZHZlcnRpc2UpOworfQorCisvKiBPbmNlIHN0YXR1cyBpcyBsYXRjaGVkIChieSBoYXBweV9tZWFsX2ludGVycnVwdCkgaXQgaXMgY2xlYXJlZCBieQorICogdGhlIGhhcmR3YXJlLCBzbyB3ZSBjYW5ub3QgcmUtcmVhZCBpdCBhbmQgZ2V0IGEgY29ycmVjdCB2YWx1ZS4KKyAqCisgKiBocC0+aGFwcHlfbG9jayBtdXN0IGJlIGhlbGQKKyAqLworc3RhdGljIGludCBoYXBweV9tZWFsX2lzX25vdF9zb19oYXBweShzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsIHUzMiBzdGF0dXMpCit7CisJaW50IHJlc2V0ID0gMDsKKwkKKwkvKiBPbmx5IHByaW50IG1lc3NhZ2VzIGZvciBub24tY291bnRlciByZWxhdGVkIGludGVycnVwdHMuICovCisJaWYgKHN0YXR1cyAmIChHUkVHX1NUQVRfU1RTVEVSUiB8IEdSRUdfU1RBVF9URklGT19VTkQgfAorCQkgICAgICBHUkVHX1NUQVRfTUFYUEtURVJSIHwgR1JFR19TVEFUX1JYRVJSIHwKKwkJICAgICAgR1JFR19TVEFUX1JYUEVSUiB8IEdSRUdfU1RBVF9SWFRFUlIgfCBHUkVHX1NUQVRfRU9QRVJSIHwKKwkJICAgICAgR1JFR19TVEFUX01JRklSUSB8IEdSRUdfU1RBVF9UWEVBQ0sgfCBHUkVHX1NUQVRfVFhMRVJSIHwKKwkJICAgICAgR1JFR19TVEFUX1RYUEVSUiB8IEdSRUdfU1RBVF9UWFRFUlIgfCBHUkVHX1NUQVRfU0xWRVJSIHwKKwkJICAgICAgR1JFR19TVEFUX1NMVlBFUlIpKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciBpbnRlcnJ1cHQgZm9yIGhhcHB5IG1lYWwsIHN0YXR1cyA9ICUwOHhcbiIsCisJCSAgICAgICBocC0+ZGV2LT5uYW1lLCBzdGF0dXMpOworCisJaWYgKHN0YXR1cyAmIEdSRUdfU1RBVF9SRklGT1ZGKSB7CisJCS8qIFJlY2VpdmUgRklGTyBvdmVyZmxvdyBpcyBoYXJtbGVzcyBhbmQgdGhlIGhhcmR3YXJlIHdpbGwgdGFrZQorCQkgICBjYXJlIG9mIGl0LCBqdXN0IHNvbWUgcGFja2V0cyBhcmUgbG9zdC4gV2hvIGNhcmVzLiAqLworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEhhcHB5IE1lYWwgcmVjZWl2ZSBGSUZPIG92ZXJmbG93LlxuIiwgaHAtPmRldi0+bmFtZSk7CisJfQorCisJaWYgKHN0YXR1cyAmIEdSRUdfU1RBVF9TVFNURVJSKSB7CisJCS8qIEJpZ01BQyBTUUUgbGluayB0ZXN0IGZhaWxlZC4gKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSGFwcHkgTWVhbCBCaWdNQUMgU1FFIHRlc3QgZmFpbGVkLlxuIiwgaHAtPmRldi0+bmFtZSk7CisJCXJlc2V0ID0gMTsKKwl9CisKKwlpZiAoc3RhdHVzICYgR1JFR19TVEFUX1RGSUZPX1VORCkgeworCQkvKiBUcmFuc21pdCBGSUZPIHVuZGVycnVuLCBhZ2FpbiBETUEgZXJyb3IgbGlrZWx5LiAqLworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBIYXBweSBNZWFsIHRyYW5zbWl0dGVyIEZJRk8gdW5kZXJydW4sIERNQSBlcnJvci5cbiIsCisJCSAgICAgICBocC0+ZGV2LT5uYW1lKTsKKwkJcmVzZXQgPSAxOworCX0KKworCWlmIChzdGF0dXMgJiBHUkVHX1NUQVRfTUFYUEtURVJSKSB7CisJCS8qIERyaXZlciBlcnJvciwgdHJpZWQgdG8gdHJhbnNtaXQgc29tZXRoaW5nIGxhcmdlcgorCQkgKiB0aGFuIGV0aGVybmV0IG1heCBtdHUuCisJCSAqLworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBIYXBweSBNZWFsIE1BWCBQYWNrZXQgc2l6ZSBlcnJvci5cbiIsIGhwLT5kZXYtPm5hbWUpOworCQlyZXNldCA9IDE7CisJfQorCisJaWYgKHN0YXR1cyAmIEdSRUdfU1RBVF9OT1JYRCkgeworCQkvKiBUaGlzIGlzIGhhcm1sZXNzLCBpdCBqdXN0IG1lYW5zIHRoZSBzeXN0ZW0gaXMKKwkJICogcXVpdGUgbG9hZGVkIGFuZCB0aGUgaW5jb21pbmcgcGFja2V0IHJhdGUgd2FzCisJCSAqIGZhc3RlciB0aGFuIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBjb3VsZCBrZWVwIHVwCisJCSAqIHdpdGguCisJCSAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogSGFwcHkgTWVhbCBvdXQgb2YgcmVjZWl2ZSAiCisJCSAgICAgICAiZGVzY3JpcHRvcnMsIHBhY2tldCBkcm9wcGVkLlxuIiwKKwkJICAgICAgIGhwLT5kZXYtPm5hbWUpOworCX0KKworCWlmIChzdGF0dXMgJiAoR1JFR19TVEFUX1JYRVJSfEdSRUdfU1RBVF9SWFBFUlJ8R1JFR19TVEFUX1JYVEVSUikpIHsKKwkJLyogQWxsIHNvcnRzIG9mIERNQSByZWNlaXZlIGVycm9ycy4gKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSGFwcHkgTWVhbCByeCBETUEgZXJyb3JzIFsgIiwgaHAtPmRldi0+bmFtZSk7CisJCWlmIChzdGF0dXMgJiBHUkVHX1NUQVRfUlhFUlIpCisJCQlwcmludGsoIkdlbmVyaWNFcnJvciAiKTsKKwkJaWYgKHN0YXR1cyAmIEdSRUdfU1RBVF9SWFBFUlIpCisJCQlwcmludGsoIlBhcml0eUVycm9yICIpOworCQlpZiAoc3RhdHVzICYgR1JFR19TVEFUX1JYVEVSUikKKwkJCXByaW50aygiUnhUYWdCb3RjaCAiKTsKKwkJcHJpbnRrKCJdXG4iKTsKKwkJcmVzZXQgPSAxOworCX0KKworCWlmIChzdGF0dXMgJiBHUkVHX1NUQVRfRU9QRVJSKSB7CisJCS8qIERyaXZlciBidWcsIGRpZG4ndCBzZXQgRU9QIGJpdCBpbiB0eCBkZXNjcmlwdG9yIGdpdmVuCisJCSAqIHRvIHRoZSBoYXBweSBtZWFsLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRU9QIG5vdCBzZXQgaW4gaGFwcHkgbWVhbCB0cmFuc21pdCBkZXNjcmlwdG9yIVxuIiwKKwkJICAgICAgIGhwLT5kZXYtPm5hbWUpOworCQlyZXNldCA9IDE7CisJfQorCisJaWYgKHN0YXR1cyAmIEdSRUdfU1RBVF9NSUZJUlEpIHsKKwkJLyogTUlGIHNpZ25hbGxlZCBhbiBpbnRlcnJ1cHQsIHdlcmUgd2UgcG9sbGluZyBpdD8gKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSGFwcHkgTWVhbCBNSUYgaW50ZXJydXB0LlxuIiwgaHAtPmRldi0+bmFtZSk7CisJfQorCisJaWYgKHN0YXR1cyAmCisJICAgIChHUkVHX1NUQVRfVFhFQUNLfEdSRUdfU1RBVF9UWExFUlJ8R1JFR19TVEFUX1RYUEVSUnxHUkVHX1NUQVRfVFhURVJSKSkgeworCQkvKiBBbGwgc29ydHMgb2YgdHJhbnNtaXQgRE1BIGVycm9ycy4gKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSGFwcHkgTWVhbCB0eCBETUEgZXJyb3JzIFsgIiwgaHAtPmRldi0+bmFtZSk7CisJCWlmIChzdGF0dXMgJiBHUkVHX1NUQVRfVFhFQUNLKQorCQkJcHJpbnRrKCJHZW5lcmljRXJyb3IgIik7CisJCWlmIChzdGF0dXMgJiBHUkVHX1NUQVRfVFhMRVJSKQorCQkJcHJpbnRrKCJMYXRlRXJyb3IgIik7CisJCWlmIChzdGF0dXMgJiBHUkVHX1NUQVRfVFhQRVJSKQorCQkJcHJpbnRrKCJQYXJpdHlFcnJvICIpOworCQlpZiAoc3RhdHVzICYgR1JFR19TVEFUX1RYVEVSUikKKwkJCXByaW50aygiVGFnQm90Y2ggIik7CisJCXByaW50aygiXVxuIik7CisJCXJlc2V0ID0gMTsKKwl9CisKKwlpZiAoc3RhdHVzICYgKEdSRUdfU1RBVF9TTFZFUlJ8R1JFR19TVEFUX1NMVlBFUlIpKSB7CisJCS8qIEJ1cyBvciBwYXJpdHkgZXJyb3Igd2hlbiBjcHUgYWNjZXNzZWQgaGFwcHkgbWVhbCByZWdpc3RlcnMKKwkJICogb3IgaXQncyBpbnRlcm5hbCBGSUZPJ3MuICBTaG91bGQgbmV2ZXIgc2VlIHRoaXMuCisJCSAqLworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBIYXBweSBNZWFsIHJlZ2lzdGVyIGFjY2VzcyBTQlVTIHNsYXZlICglcykgZXJyb3IuXG4iLAorCQkgICAgICAgaHAtPmRldi0+bmFtZSwKKwkJICAgICAgIChzdGF0dXMgJiBHUkVHX1NUQVRfU0xWUEVSUikgPyAicGFyaXR5IiA6ICJnZW5lcmljIik7CisJCXJlc2V0ID0gMTsKKwl9CisKKwlpZiAocmVzZXQpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogUmVzZXR0aW5nLi4uXG4iLCBocC0+ZGV2LT5uYW1lKTsKKwkJaGFwcHlfbWVhbF9pbml0KGhwKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKiBocC0+aGFwcHlfbG9jayBtdXN0IGJlIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGhhcHB5X21lYWxfbWlmX2ludGVycnVwdChzdHJ1Y3QgaGFwcHlfbWVhbCAqaHApCit7CisJdm9pZCBfX2lvbWVtICp0cmVncyA9IGhwLT50Y3ZyZWdzOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpbmsgc3RhdHVzIGNoYW5nZS5cbiIsIGhwLT5kZXYtPm5hbWUpOworCWhwLT5zd19ibWNyID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIHRyZWdzLCBNSUlfQk1DUik7CisJaHAtPnN3X2xwYSA9IGhhcHB5X21lYWxfdGN2cl9yZWFkKGhwLCB0cmVncywgTUlJX0xQQSk7CisKKwkvKiBVc2UgdGhlIGZhc3Rlc3QgdHJhbnNtaXNzaW9uIHByb3RvY29sIHBvc3NpYmxlLiAqLworCWlmIChocC0+c3dfbHBhICYgTFBBXzEwMEZVTEwpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN3aXRjaGluZyB0byAxMDBNYnBzIGF0IGZ1bGwgZHVwbGV4LiIsIGhwLT5kZXYtPm5hbWUpOworCQlocC0+c3dfYm1jciB8PSAoQk1DUl9GVUxMRFBMWCB8IEJNQ1JfU1BFRUQxMDApOworCX0gZWxzZSBpZiAoaHAtPnN3X2xwYSAmIExQQV8xMDBIQUxGKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTd2l0Y2hpbmcgdG8gMTAwTUJwcyBhdCBoYWxmIGR1cGxleC4iLCBocC0+ZGV2LT5uYW1lKTsKKwkJaHAtPnN3X2JtY3IgfD0gQk1DUl9TUEVFRDEwMDsKKwl9IGVsc2UgaWYgKGhwLT5zd19scGEgJiBMUEFfMTBGVUxMKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTd2l0Y2hpbmcgdG8gMTBNQnBzIGF0IGZ1bGwgZHVwbGV4LiIsIGhwLT5kZXYtPm5hbWUpOworCQlocC0+c3dfYm1jciB8PSBCTUNSX0ZVTExEUExYOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVc2luZyAxME1icHMgYXQgaGFsZiBkdXBsZXguIiwgaHAtPmRldi0+bmFtZSk7CisJfQorCWhhcHB5X21lYWxfdGN2cl93cml0ZShocCwgdHJlZ3MsIE1JSV9CTUNSLCBocC0+c3dfYm1jcik7CisKKwkvKiBGaW5hbGx5IHN0b3AgcG9sbGluZyBhbmQgc2h1dCB1cCB0aGUgTUlGLiAqLworCWhhcHB5X21lYWxfcG9sbF9zdG9wKGhwLCB0cmVncyk7Cit9CisKKyNpZmRlZiBUWERFQlVHCisjZGVmaW5lIFRYRCh4KSBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgVFhEKHgpCisjZW5kaWYKKworLyogaHAtPmhhcHB5X2xvY2sgbXVzdCBiZSBoZWxkICovCitzdGF0aWMgdm9pZCBoYXBweV9tZWFsX3R4KHN0cnVjdCBoYXBweV9tZWFsICpocCkKK3sKKwlzdHJ1Y3QgaGFwcHlfbWVhbF90eGQgKnR4YmFzZSA9ICZocC0+aGFwcHlfYmxvY2stPmhhcHB5X21lYWxfdHhkWzBdOworCXN0cnVjdCBoYXBweV9tZWFsX3R4ZCAqdGhpczsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaHAtPmRldjsKKwlpbnQgZWxlbTsKKworCWVsZW0gPSBocC0+dHhfb2xkOworCVRYRCgoIlRYPCIpKTsKKwl3aGlsZSAoZWxlbSAhPSBocC0+dHhfbmV3KSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXUzMiBmbGFncywgZG1hX2FkZHIsIGRtYV9sZW47CisJCWludCBmcmFnOworCisJCVRYRCgoIlslZF0iLCBlbGVtKSk7CisJCXRoaXMgPSAmdHhiYXNlW2VsZW1dOworCQlmbGFncyA9IGhtZV9yZWFkX2Rlc2MzMihocCwgJnRoaXMtPnR4X2ZsYWdzKTsKKwkJaWYgKGZsYWdzICYgVFhGTEFHX09XTikKKwkJCWJyZWFrOworCQlza2IgPSBocC0+dHhfc2tic1tlbGVtXTsKKwkJaWYgKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MpIHsKKwkJCWludCBsYXN0OworCisJCQlsYXN0ID0gZWxlbSArIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJCQlsYXN0ICY9IChUWF9SSU5HX1NJWkUgLSAxKTsKKwkJCWZsYWdzID0gaG1lX3JlYWRfZGVzYzMyKGhwLCAmdHhiYXNlW2xhc3RdLnR4X2ZsYWdzKTsKKwkJCWlmIChmbGFncyAmIFRYRkxBR19PV04pCisJCQkJYnJlYWs7CisJCX0KKwkJaHAtPnR4X3NrYnNbZWxlbV0gPSBOVUxMOworCQlocC0+bmV0X3N0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCisJCWZvciAoZnJhZyA9IDA7IGZyYWcgPD0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgZnJhZysrKSB7CisJCQlkbWFfYWRkciA9IGhtZV9yZWFkX2Rlc2MzMihocCwgJnRoaXMtPnR4X2FkZHIpOworCQkJZG1hX2xlbiA9IGhtZV9yZWFkX2Rlc2MzMihocCwgJnRoaXMtPnR4X2ZsYWdzKTsKKworCQkJZG1hX2xlbiAmPSBUWEZMQUdfU0laRTsKKwkJCWhtZV9kbWFfdW5tYXAoaHAsIGRtYV9hZGRyLCBkbWFfbGVuLCBETUFfVE9ERVZJQ0UpOworCisJCQllbGVtID0gTkVYVF9UWChlbGVtKTsKKwkJCXRoaXMgPSAmdHhiYXNlW2VsZW1dOworCQl9CisKKwkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJaHAtPm5ldF9zdGF0cy50eF9wYWNrZXRzKys7CisJfQorCWhwLT50eF9vbGQgPSBlbGVtOworCVRYRCgoIj4iKSk7CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCisJICAgIFRYX0JVRkZTX0FWQUlMKGhwKSA+IChNQVhfU0tCX0ZSQUdTICsgMSkpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworI2lmZGVmIFJYREVCVUcKKyNkZWZpbmUgUlhEKHgpIHByaW50ayB4CisjZWxzZQorI2RlZmluZSBSWEQoeCkKKyNlbmRpZgorCisvKiBPcmlnaW5hbGx5IEkgdXNlZCB0byBoYW5kbGUgdGhlIGFsbG9jYXRpb24gZmFpbHVyZSBieSBqdXN0IGdpdmluZyBiYWNrIGp1c3QKKyAqIHRoYXQgb25lIHJpbmcgYnVmZmVyIHRvIHRoZSBoYXBweSBtZWFsLiAgUHJvYmxlbSBpcyB0aGF0IHVzdWFsbHkgd2hlbiB0aGF0CisgKiBjb25kaXRpb24gaXMgdHJpZ2dlcmVkLCB0aGUgaGFwcHkgbWVhbCBleHBlY3RzIHlvdSB0byBkbyBzb21ldGhpbmcgcmVhc29uYWJsZQorICogd2l0aCBhbGwgb2YgdGhlIHBhY2tldHMgaXQgaGFzIERNQSdkIGluLiAgU28gbm93IEkganVzdCBkcm9wIHRoZSBlbnRpcmUKKyAqIHJpbmcgd2hlbiB3ZSBjYW5ub3QgZ2V0IGEgbmV3IHNrYiBhbmQgZ2l2ZSB0aGVtIGFsbCBiYWNrIHRvIHRoZSBoYXBweSBtZWFsLAorICogbWF5YmUgdGhpbmdzIHdpbGwgYmUgImhhcHBpZXIiIG5vdy4KKyAqCisgKiBocC0+aGFwcHlfbG9jayBtdXN0IGJlIGhlbGQKKyAqLworc3RhdGljIHZvaWQgaGFwcHlfbWVhbF9yeChzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhhcHB5X21lYWxfcnhkICpyeGJhc2UgPSAmaHAtPmhhcHB5X2Jsb2NrLT5oYXBweV9tZWFsX3J4ZFswXTsKKwlzdHJ1Y3QgaGFwcHlfbWVhbF9yeGQgKnRoaXM7CisJaW50IGVsZW0gPSBocC0+cnhfbmV3LCBkcm9wcyA9IDA7CisJdTMyIGZsYWdzOworCisJUlhEKCgiUlg8IikpOworCXRoaXMgPSAmcnhiYXNlW2VsZW1dOworCXdoaWxlICghKChmbGFncyA9IGhtZV9yZWFkX2Rlc2MzMihocCwgJnRoaXMtPnJ4X2ZsYWdzKSkgJiBSWEZMQUdfT1dOKSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlpbnQgbGVuID0gZmxhZ3MgPj4gMTY7CisJCXUxNiBjc3VtID0gZmxhZ3MgJiBSWEZMQUdfQ1NVTTsKKwkJdTMyIGRtYV9hZGRyID0gaG1lX3JlYWRfZGVzYzMyKGhwLCAmdGhpcy0+cnhfYWRkcik7CisKKwkJUlhEKCgiWyVkICIsIGVsZW0pKTsKKworCQkvKiBDaGVjayBmb3IgZXJyb3JzLiAqLworCQlpZiAoKGxlbiA8IEVUSF9aTEVOKSB8fCAoZmxhZ3MgJiBSWEZMQUdfT1ZFUkZMT1cpKSB7CisJCQlSWEQoKCJFUlIoJTA4eCldIiwgZmxhZ3MpKTsKKwkJCWhwLT5uZXRfc3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAobGVuIDwgRVRIX1pMRU4pCisJCQkJaHAtPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpZiAobGVuICYgKFJYRkxBR19PVkVSRkxPVyA+PiAxNikpIHsKKwkJCQlocC0+bmV0X3N0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQkJaHAtPm5ldF9zdGF0cy5yeF9maWZvX2Vycm9ycysrOworCQkJfQorCisJCQkvKiBSZXR1cm4gaXQgdG8gdGhlIEhhcHB5IG1lYWwuICovCisJZHJvcF9pdDoKKwkJCWhwLT5uZXRfc3RhdHMucnhfZHJvcHBlZCsrOworCQkJaG1lX3dyaXRlX3J4ZChocCwgdGhpcywKKwkJCQkgICAgICAoUlhGTEFHX09XTnwoKFJYX0JVRl9BTExPQ19TSVpFLVJYX09GRlNFVCk8PDE2KSksCisJCQkJICAgICAgZG1hX2FkZHIpOworCQkJZ290byBuZXh0OworCQl9CisJCXNrYiA9IGhwLT5yeF9za2JzW2VsZW1dOworCQlpZiAobGVuID4gUlhfQ09QWV9USFJFU0hPTEQpIHsKKwkJCXN0cnVjdCBza19idWZmICpuZXdfc2tiOworCisJCQkvKiBOb3cgcmVmaWxsIHRoZSBlbnRyeSwgaWYgd2UgY2FuLiAqLworCQkJbmV3X3NrYiA9IGhhcHB5X21lYWxfYWxsb2Nfc2tiKFJYX0JVRl9BTExPQ19TSVpFLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChuZXdfc2tiID09IE5VTEwpIHsKKwkJCQlkcm9wcysrOworCQkJCWdvdG8gZHJvcF9pdDsKKwkJCX0KKwkJCWhtZV9kbWFfdW5tYXAoaHAsIGRtYV9hZGRyLCBSWF9CVUZfQUxMT0NfU0laRSwgRE1BX0ZST01ERVZJQ0UpOworCQkJaHAtPnJ4X3NrYnNbZWxlbV0gPSBuZXdfc2tiOworCQkJbmV3X3NrYi0+ZGV2ID0gZGV2OworCQkJc2tiX3B1dChuZXdfc2tiLCAoRVRIX0ZSQU1FX0xFTiArIFJYX09GRlNFVCkpOworCQkJaG1lX3dyaXRlX3J4ZChocCwgdGhpcywKKwkJCQkgICAgICAoUlhGTEFHX09XTnwoKFJYX0JVRl9BTExPQ19TSVpFLVJYX09GRlNFVCk8PDE2KSksCisJCQkJICAgICAgaG1lX2RtYV9tYXAoaHAsIG5ld19za2ItPmRhdGEsIFJYX0JVRl9BTExPQ19TSVpFLCBETUFfRlJPTURFVklDRSkpOworCQkJc2tiX3Jlc2VydmUobmV3X3NrYiwgUlhfT0ZGU0VUKTsKKworCQkJLyogVHJpbSB0aGUgb3JpZ2luYWwgc2tiIGZvciB0aGUgbmV0aWYuICovCisJCQlza2JfdHJpbShza2IsIGxlbik7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqY29weV9za2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDIpOworCisJCQlpZiAoY29weV9za2IgPT0gTlVMTCkgeworCQkJCWRyb3BzKys7CisJCQkJZ290byBkcm9wX2l0OworCQkJfQorCisJCQljb3B5X3NrYi0+ZGV2ID0gZGV2OworCQkJc2tiX3Jlc2VydmUoY29weV9za2IsIDIpOworCQkJc2tiX3B1dChjb3B5X3NrYiwgbGVuKTsKKwkJCWhtZV9kbWFfc3luY19mb3JfY3B1KGhwLCBkbWFfYWRkciwgbGVuLCBETUFfRlJPTURFVklDRSk7CisJCQltZW1jcHkoY29weV9za2ItPmRhdGEsIHNrYi0+ZGF0YSwgbGVuKTsKKwkJCWhtZV9kbWFfc3luY19mb3JfZGV2aWNlKGhwLCBkbWFfYWRkciwgbGVuLCBETUFfRlJPTURFVklDRSk7CisKKwkJCS8qIFJldXNlIG9yaWdpbmFsIHJpbmcgYnVmZmVyLiAqLworCQkJaG1lX3dyaXRlX3J4ZChocCwgdGhpcywKKwkJCQkgICAgICAoUlhGTEFHX09XTnwoKFJYX0JVRl9BTExPQ19TSVpFLVJYX09GRlNFVCk8PDE2KSksCisJCQkJICAgICAgZG1hX2FkZHIpOworCisJCQlza2IgPSBjb3B5X3NrYjsKKwkJfQorCisJCS8qIFRoaXMgY2FyZCBpcyBfZnVja2luZ18gaG90Li4uICovCisJCXNrYi0+Y3N1bSA9IG50b2hzKGNzdW0gXiAweGZmZmYpOworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0hXOworCisJCVJYRCgoImxlbj0lZCBjc3VtPSU0eF0iLCBsZW4sIGNzdW0pKTsKKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJbmV0aWZfcngoc2tiKTsKKworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlocC0+bmV0X3N0YXRzLnJ4X3BhY2tldHMrKzsKKwkJaHAtPm5ldF9zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJbmV4dDoKKwkJZWxlbSA9IE5FWFRfUlgoZWxlbSk7CisJCXRoaXMgPSAmcnhiYXNlW2VsZW1dOworCX0KKwlocC0+cnhfbmV3ID0gZWxlbTsKKwlpZiAoZHJvcHMpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZGVmZXJyaW5nIHBhY2tldC5cbiIsIGhwLT5kZXYtPm5hbWUpOworCVJYRCgoIj4iKSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBoYXBweV9tZWFsX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCXN0cnVjdCBoYXBweV9tZWFsICpocCAgPSBkZXYtPnByaXY7CisJdTMyIGhhcHB5X3N0YXR1cyAgICAgICA9IGhtZV9yZWFkMzIoaHAsIGhwLT5ncmVncyArIEdSRUdfU1RBVCk7CisKKwlITUQoKCJoYXBweV9tZWFsX2ludGVycnVwdDogc3RhdHVzPSUwOHggIiwgaGFwcHlfc3RhdHVzKSk7CisKKwlzcGluX2xvY2soJmhwLT5oYXBweV9sb2NrKTsKKworCWlmIChoYXBweV9zdGF0dXMgJiBHUkVHX1NUQVRfRVJST1JTKSB7CisJCUhNRCgoIkVSUk9SUyAiKSk7CisJCWlmIChoYXBweV9tZWFsX2lzX25vdF9zb19oYXBweShocCwgLyogdW4tICovIGhhcHB5X3N0YXR1cykpCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaGFwcHlfc3RhdHVzICYgR1JFR19TVEFUX01JRklSUSkgeworCQlITUQoKCJNSUZJUlEgIikpOworCQloYXBweV9tZWFsX21pZl9pbnRlcnJ1cHQoaHApOworCX0KKworCWlmIChoYXBweV9zdGF0dXMgJiBHUkVHX1NUQVRfVFhBTEwpIHsKKwkJSE1EKCgiVFhBTEwgIikpOworCQloYXBweV9tZWFsX3R4KGhwKTsKKwl9CisKKwlpZiAoaGFwcHlfc3RhdHVzICYgR1JFR19TVEFUX1JYVE9IT1NUKSB7CisJCUhNRCgoIlJYVE9IT1NUICIpKTsKKwkJaGFwcHlfbWVhbF9yeChocCwgZGV2KTsKKwl9CisKKwlITUQoKCJkb25lXG4iKSk7CitvdXQ6CisJc3Bpbl91bmxvY2soJmhwLT5oYXBweV9sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworI2lmZGVmIENPTkZJR19TQlVTCitzdGF0aWMgaXJxcmV0dXJuX3QgcXVhdHRyb19zYnVzX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpjb29raWUsIHN0cnVjdCBwdF9yZWdzICpwdHJlZ3MpCit7CisJc3RydWN0IHF1YXR0cm8gKnFwID0gKHN0cnVjdCBxdWF0dHJvICopIGNvb2tpZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHFwLT5oYXBweV9tZWFsc1tpXTsKKwkJc3RydWN0IGhhcHB5X21lYWwgKmhwICA9IGRldi0+cHJpdjsKKwkJdTMyIGhhcHB5X3N0YXR1cyAgICAgICA9IGhtZV9yZWFkMzIoaHAsIGhwLT5ncmVncyArIEdSRUdfU1RBVCk7CisKKwkJSE1EKCgicXVhdHRyb19pbnRlcnJ1cHQ6IHN0YXR1cz0lMDh4ICIsIGhhcHB5X3N0YXR1cykpOworCisJCWlmICghKGhhcHB5X3N0YXR1cyAmIChHUkVHX1NUQVRfRVJST1JTIHwKKwkJCQkgICAgICBHUkVHX1NUQVRfTUlGSVJRIHwKKwkJCQkgICAgICBHUkVHX1NUQVRfVFhBTEwgfAorCQkJCSAgICAgIEdSRUdfU1RBVF9SWFRPSE9TVCkpKQorCQkJY29udGludWU7CisKKwkJc3Bpbl9sb2NrKCZocC0+aGFwcHlfbG9jayk7CisKKwkJaWYgKGhhcHB5X3N0YXR1cyAmIEdSRUdfU1RBVF9FUlJPUlMpIHsKKwkJCUhNRCgoIkVSUk9SUyAiKSk7CisJCQlpZiAoaGFwcHlfbWVhbF9pc19ub3Rfc29faGFwcHkoaHAsIGhhcHB5X3N0YXR1cykpCisJCQkJZ290byBuZXh0OworCQl9CisKKwkJaWYgKGhhcHB5X3N0YXR1cyAmIEdSRUdfU1RBVF9NSUZJUlEpIHsKKwkJCUhNRCgoIk1JRklSUSAiKSk7CisJCQloYXBweV9tZWFsX21pZl9pbnRlcnJ1cHQoaHApOworCQl9CisKKwkJaWYgKGhhcHB5X3N0YXR1cyAmIEdSRUdfU1RBVF9UWEFMTCkgeworCQkJSE1EKCgiVFhBTEwgIikpOworCQkJaGFwcHlfbWVhbF90eChocCk7CisJCX0KKworCQlpZiAoaGFwcHlfc3RhdHVzICYgR1JFR19TVEFUX1JYVE9IT1NUKSB7CisJCQlITUQoKCJSWFRPSE9TVCAiKSk7CisJCQloYXBweV9tZWFsX3J4KGhwLCBkZXYpOworCQl9CisKKwluZXh0OgorCQlzcGluX3VubG9jaygmaHAtPmhhcHB5X2xvY2spOworCX0KKwlITUQoKCJkb25lXG4iKSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBoYXBweV9tZWFsX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAgPSBkZXYtPnByaXY7CisJaW50IHJlczsKKworCUhNRCgoImhhcHB5X21lYWxfb3BlbjogIikpOworCisJLyogT24gU0JVUyBRdWF0dHJvIFFGRSBjYXJkcywgYWxsIGhtZSBpbnRlcnJ1cHRzIGFyZSBjb25jZW50cmF0ZWQKKwkgKiBpbnRvIGEgc2luZ2xlIHNvdXJjZSB3aGljaCB3ZSByZWdpc3RlciBoYW5kbGluZyBhdCBwcm9iZSB0aW1lLgorCSAqLworCWlmICgoaHAtPmhhcHB5X2ZsYWdzICYgKEhGTEFHX1FVQVRUUk98SEZMQUdfUENJKSkgIT0gSEZMQUdfUVVBVFRSTykgeworCQlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICZoYXBweV9tZWFsX2ludGVycnVwdCwKKwkJCQlTQV9TSElSUSwgZGV2LT5uYW1lLCAodm9pZCAqKWRldikpIHsKKwkJCUhNRCgoIkVBR0FJTlxuIikpOworI2lmZGVmIF9fc3BhcmNfXworCQkJcHJpbnRrKEtFUk5fRVJSICJoYXBweV9tZWFsKFNCVVMpOiBDYW4ndCBvcmRlciBpcnEgJXMgdG8gZ28uXG4iLAorCQkJICAgICAgIF9faXJxX2l0b2EoZGV2LT5pcnEpKTsKKyNlbHNlCisJCQlwcmludGsoS0VSTl9FUlIgImhhcHB5X21lYWwoU0JVUyk6IENhbid0IG9yZGVyIGlycSAlZCB0byBnby5cbiIsCisJCQkgICAgICAgZGV2LT5pcnEpOworI2VuZGlmCisKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJfQorCisJSE1EKCgidG8gaGFwcHlfbWVhbF9pbml0XG4iKSk7CisKKwlzcGluX2xvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisJcmVzID0gaGFwcHlfbWVhbF9pbml0KGhwKTsKKwlzcGluX3VubG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKworCWlmIChyZXMgJiYgKChocC0+aGFwcHlfZmxhZ3MgJiAoSEZMQUdfUVVBVFRST3xIRkxBR19QQ0kpKSAhPSBIRkxBR19RVUFUVFJPKSkKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBoYXBweV9tZWFsX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhhcHB5X21lYWwgKmhwID0gZGV2LT5wcml2OworCisJc3Bpbl9sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCWhhcHB5X21lYWxfc3RvcChocCwgaHAtPmdyZWdzKTsKKwloYXBweV9tZWFsX2NsZWFuX3JpbmdzKGhwKTsKKworCS8qIElmIGF1dG8tbmVnb3RpYXRpb24gdGltZXIgaXMgcnVubmluZywga2lsbCBpdC4gKi8KKwlkZWxfdGltZXIoJmhwLT5oYXBweV90aW1lcik7CisKKwlzcGluX3VubG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKworCS8qIE9uIFF1YXR0cm8gUUZFIGNhcmRzLCBhbGwgaG1lIGludGVycnVwdHMgYXJlIGNvbmNlbnRyYXRlZAorCSAqIGludG8gYSBzaW5nbGUgc291cmNlIHdoaWNoIHdlIHJlZ2lzdGVyIGhhbmRsaW5nIGF0IHByb2JlCisJICogdGltZSBhbmQgbmV2ZXIgdW5yZWdpc3Rlci4KKwkgKi8KKwlpZiAoKGhwLT5oYXBweV9mbGFncyAmIChIRkxBR19RVUFUVFJPfEhGTEFHX1BDSSkpICE9IEhGTEFHX1FVQVRUUk8pCisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBTWERFQlVHCisjZGVmaW5lIFNYRCh4KSBwcmludGsgeAorI2Vsc2UKKyNkZWZpbmUgU1hEKHgpCisjZW5kaWYKKworc3RhdGljIHZvaWQgaGFwcHlfbWVhbF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhhcHB5X21lYWwgKmhwID0gZGV2LT5wcml2OworCisJcHJpbnRrIChLRVJOX0VSUiAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgcmVzZXR0aW5nXG4iLCBkZXYtPm5hbWUpOworCXR4X2R1bXBfbG9nKCk7CisJcHJpbnRrIChLRVJOX0VSUiAiJXM6IEhhcHB5IFN0YXR1cyAlMDh4IFRYWyUwOHg6JTA4eF1cbiIsIGRldi0+bmFtZSwKKwkJaG1lX3JlYWQzMihocCwgaHAtPmdyZWdzICsgR1JFR19TVEFUKSwKKwkJaG1lX3JlYWQzMihocCwgaHAtPmV0eHJlZ3MgKyBFVFhfQ0ZHKSwKKwkJaG1lX3JlYWQzMihocCwgaHAtPmJpZ21hY3JlZ3MgKyBCTUFDX1RYQ0ZHKSk7CisKKwlzcGluX2xvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisJaGFwcHlfbWVhbF9pbml0KGhwKTsKKwlzcGluX3VubG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBoYXBweV9tZWFsX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAgPSBkZXYtPnByaXY7CisgCWludCBlbnRyeTsKKyAJdTMyIHR4X2ZsYWdzOworCisJdHhfZmxhZ3MgPSBUWEZMQUdfT1dOOworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQl1MzIgY3N1bV9zdGFydF9vZmYsIGNzdW1fc3R1ZmZfb2ZmOworCisJCWNzdW1fc3RhcnRfb2ZmID0gKHUzMikgKHNrYi0+aC5yYXcgLSBza2ItPmRhdGEpOworCQljc3VtX3N0dWZmX29mZiA9ICh1MzIpICgoc2tiLT5oLnJhdyArIHNrYi0+Y3N1bSkgLSBza2ItPmRhdGEpOworCisJCXR4X2ZsYWdzID0gKFRYRkxBR19PV04gfCBUWEZMQUdfQ1NFTkFCTEUgfAorCQkJICAgICgoY3N1bV9zdGFydF9vZmYgPDwgMTQpICYgVFhGTEFHX0NTQlVGQkVHSU4pIHwKKwkJCSAgICAoKGNzdW1fc3R1ZmZfb2ZmIDw8IDIwKSAmIFRYRkxBR19DU0xPQ0FUSU9OKSk7CisJfQorCisJc3Bpbl9sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCisgCWlmIChUWF9CVUZGU19BVkFJTChocCkgPD0gKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgKyAxKSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXNwaW5fdW5sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBCVUchIFR4IFJpbmcgZnVsbCB3aGVuIHF1ZXVlIGF3YWtlIVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCWVudHJ5ID0gaHAtPnR4X25ldzsKKwlTWEQoKCJTWDxsWyVkXWVbJWRdPiIsIGxlbiwgZW50cnkpKTsKKwlocC0+dHhfc2tic1tlbnRyeV0gPSBza2I7CisKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9PSAwKSB7CisJCXUzMiBtYXBwaW5nLCBsZW47CisKKwkJbGVuID0gc2tiLT5sZW47CisJCW1hcHBpbmcgPSBobWVfZG1hX21hcChocCwgc2tiLT5kYXRhLCBsZW4sIERNQV9UT0RFVklDRSk7CisJCXR4X2ZsYWdzIHw9IChUWEZMQUdfU09QIHwgVFhGTEFHX0VPUCk7CisJCWhtZV93cml0ZV90eGQoaHAsICZocC0+aGFwcHlfYmxvY2stPmhhcHB5X21lYWxfdHhkW2VudHJ5XSwKKwkJCSAgICAgICh0eF9mbGFncyB8IChsZW4gJiBUWEZMQUdfU0laRSkpLAorCQkJICAgICAgbWFwcGluZyk7CisJCWVudHJ5ID0gTkVYVF9UWChlbnRyeSk7CisJfSBlbHNlIHsKKwkJdTMyIGZpcnN0X2xlbiwgZmlyc3RfbWFwcGluZzsKKwkJaW50IGZyYWcsIGZpcnN0X2VudHJ5ID0gZW50cnk7CisKKwkJLyogV2UgbXVzdCBnaXZlIHRoaXMgaW5pdGlhbCBjaHVuayB0byB0aGUgZGV2aWNlIGxhc3QuCisJCSAqIE90aGVyd2lzZSB3ZSBjb3VsZCByYWNlIHdpdGggdGhlIGRldmljZS4KKwkJICovCisJCWZpcnN0X2xlbiA9IHNrYl9oZWFkbGVuKHNrYik7CisJCWZpcnN0X21hcHBpbmcgPSBobWVfZG1hX21hcChocCwgc2tiLT5kYXRhLCBmaXJzdF9sZW4sIERNQV9UT0RFVklDRSk7CisJCWVudHJ5ID0gTkVYVF9UWChlbnRyeSk7CisKKwkJZm9yIChmcmFnID0gMDsgZnJhZyA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGZyYWcrKykgeworCQkJc2tiX2ZyYWdfdCAqdGhpc19mcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbZnJhZ107CisJCQl1MzIgbGVuLCBtYXBwaW5nLCB0aGlzX3R4ZmxhZ3M7CisKKwkJCWxlbiA9IHRoaXNfZnJhZy0+c2l6ZTsKKwkJCW1hcHBpbmcgPSBobWVfZG1hX21hcChocCwKKwkJCQkJICAgICAgKCh2b2lkICopIHBhZ2VfYWRkcmVzcyh0aGlzX2ZyYWctPnBhZ2UpICsKKwkJCQkJICAgICAgIHRoaXNfZnJhZy0+cGFnZV9vZmZzZXQpLAorCQkJCQkgICAgICBsZW4sIERNQV9UT0RFVklDRSk7CisJCQl0aGlzX3R4ZmxhZ3MgPSB0eF9mbGFnczsKKwkJCWlmIChmcmFnID09IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgLSAxKQorCQkJCXRoaXNfdHhmbGFncyB8PSBUWEZMQUdfRU9QOworCQkJaG1lX3dyaXRlX3R4ZChocCwgJmhwLT5oYXBweV9ibG9jay0+aGFwcHlfbWVhbF90eGRbZW50cnldLAorCQkJCSAgICAgICh0aGlzX3R4ZmxhZ3MgfCAobGVuICYgVFhGTEFHX1NJWkUpKSwKKwkJCQkgICAgICBtYXBwaW5nKTsKKwkJCWVudHJ5ID0gTkVYVF9UWChlbnRyeSk7CisJCX0KKwkJaG1lX3dyaXRlX3R4ZChocCwgJmhwLT5oYXBweV9ibG9jay0+aGFwcHlfbWVhbF90eGRbZmlyc3RfZW50cnldLAorCQkJICAgICAgKHR4X2ZsYWdzIHwgVFhGTEFHX1NPUCB8IChmaXJzdF9sZW4gJiBUWEZMQUdfU0laRSkpLAorCQkJICAgICAgZmlyc3RfbWFwcGluZyk7CisJfQorCisJaHAtPnR4X25ldyA9IGVudHJ5OworCisJaWYgKFRYX0JVRkZTX0FWQUlMKGhwKSA8PSAoTUFYX1NLQl9GUkFHUyArIDEpKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBHZXQgaXQgZ29pbmcuICovCisJaG1lX3dyaXRlMzIoaHAsIGhwLT5ldHhyZWdzICsgRVRYX1BFTkRJTkcsIEVUWF9UUF9ETUFXQUtFVVApOworCisJc3Bpbl91bmxvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXR4X2FkZF9sb2coaHAsIFRYTE9HX0FDVElPTl9UWE1JVCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaGFwcHlfbWVhbF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAgPSBkZXYtPnByaXY7CisKKwlzcGluX2xvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisJaGFwcHlfbWVhbF9nZXRfY291bnRlcnMoaHAsIGhwLT5iaWdtYWNyZWdzKTsKKwlzcGluX3VubG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKworCXJldHVybiAmaHAtPm5ldF9zdGF0czsKK30KKworc3RhdGljIHZvaWQgaGFwcHlfbWVhbF9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhhcHB5X21lYWwgKmhwID0gZGV2LT5wcml2OworCXZvaWQgX19pb21lbSAqYnJlZ3MgPSBocC0+YmlnbWFjcmVnczsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IGRldi0+bWNfbGlzdDsKKwljaGFyICphZGRyczsKKwlpbnQgaTsKKwl1MzIgY3JjOworCisJc3Bpbl9sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fCAoZGV2LT5tY19jb3VudCA+IDY0KSkgeworCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTAsIDB4ZmZmZik7CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSFRBQkxFMSwgMHhmZmZmKTsKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19IVEFCTEUyLCAweGZmZmYpOworCQlobWVfd3JpdGUzMihocCwgYnJlZ3MgKyBCTUFDX0hUQUJMRTMsIDB4ZmZmZik7CisJfSBlbHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJaG1lX3dyaXRlMzIoaHAsIGJyZWdzICsgQk1BQ19SWENGRywKKwkJCSAgICBobWVfcmVhZDMyKGhwLCBicmVncyArIEJNQUNfUlhDRkcpIHwgQklHTUFDX1JYQ0ZHX1BNSVNDKTsKKwl9IGVsc2UgeworCQl1MTYgaGFzaF90YWJsZVs0XTsKKworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJaGFzaF90YWJsZVtpXSA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKykgeworCQkJYWRkcnMgPSBkbWktPmRtaV9hZGRyOworCQkJZG1pID0gZG1pLT5uZXh0OworCisJCQlpZiAoISgqYWRkcnMgJiAxKSkKKwkJCQljb250aW51ZTsKKworCQkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGFkZHJzKTsKKwkJCWNyYyA+Pj0gMjY7CisJCQloYXNoX3RhYmxlW2NyYyA+PiA0XSB8PSAxIDw8IChjcmMgJiAweGYpOworCQl9CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSFRBQkxFMCwgaGFzaF90YWJsZVswXSk7CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSFRBQkxFMSwgaGFzaF90YWJsZVsxXSk7CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSFRBQkxFMiwgaGFzaF90YWJsZVsyXSk7CisJCWhtZV93cml0ZTMyKGhwLCBicmVncyArIEJNQUNfSFRBQkxFMywgaGFzaF90YWJsZVszXSk7CisJfQorCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7Cit9CisKKy8qIEV0aHRvb2wgc3VwcG9ydC4uLiAqLworc3RhdGljIGludCBobWVfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBoYXBweV9tZWFsICpocCA9IGRldi0+cHJpdjsKKworCWNtZC0+c3VwcG9ydGVkID0KKwkJKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKKwkJIFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfAorCQkgU1VQUE9SVEVEX0F1dG9uZWcgfCBTVVBQT1JURURfVFAgfCBTVVBQT1JURURfTUlJKTsKKworCS8qIFhYWCBoYXJkY29kZWQgc3R1ZmYgZm9yIG5vdyAqLworCWNtZC0+cG9ydCA9IFBPUlRfVFA7IC8qIFhYWCBubyBNSUkgc3VwcG9ydCAqLworCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOyAvKiBYWFggbm8gZXh0ZXJuYWwgeGN2ciBzdXBwb3J0ICovCisJY21kLT5waHlfYWRkcmVzcyA9IDA7IC8qIFhYWCBmaXhlZCBQSFlBRCAqLworCisJLyogUmVjb3JkIFBIWSBzZXR0aW5ncy4gKi8KKwlzcGluX2xvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisJaHAtPnN3X2JtY3IgPSBoYXBweV9tZWFsX3RjdnJfcmVhZChocCwgaHAtPnRjdnJlZ3MsIE1JSV9CTUNSKTsKKwlocC0+c3dfbHBhID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIGhwLT50Y3ZyZWdzLCBNSUlfTFBBKTsKKwlzcGluX3VubG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKworCWlmIChocC0+c3dfYm1jciAmIEJNQ1JfQU5FTkFCTEUpIHsKKwkJY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJCWNtZC0+c3BlZWQgPQorCQkJKGhwLT5zd19scGEgJiAoTFBBXzEwMEhBTEYgfCBMUEFfMTAwRlVMTCkpID8KKwkJCVNQRUVEXzEwMCA6IFNQRUVEXzEwOworCQlpZiAoY21kLT5zcGVlZCA9PSBTUEVFRF8xMDApCisJCQljbWQtPmR1cGxleCA9CisJCQkJKGhwLT5zd19scGEgJiAoTFBBXzEwMEZVTEwpKSA/CisJCQkJRFVQTEVYX0ZVTEwgOiBEVVBMRVhfSEFMRjsKKwkJZWxzZQorCQkJY21kLT5kdXBsZXggPQorCQkJCShocC0+c3dfbHBhICYgKExQQV8xMEZVTEwpKSA/CisJCQkJRFVQTEVYX0ZVTEwgOiBEVVBMRVhfSEFMRjsKKwl9IGVsc2UgeworCQljbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CisJCWNtZC0+c3BlZWQgPQorCQkJKGhwLT5zd19ibWNyICYgQk1DUl9TUEVFRDEwMCkgPworCQkJU1BFRURfMTAwIDogU1BFRURfMTA7CisJCWNtZC0+ZHVwbGV4ID0KKwkJCShocC0+c3dfYm1jciAmIEJNQ1JfRlVMTERQTFgpID8KKwkJCURVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhtZV9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IGhhcHB5X21lYWwgKmhwID0gZGV2LT5wcml2OworCisJLyogVmVyaWZ5IHRoZSBzZXR0aW5ncyB3ZSBjYXJlIGFib3V0LiAqLworCWlmIChjbWQtPmF1dG9uZWcgIT0gQVVUT05FR19FTkFCTEUgJiYKKwkgICAgY21kLT5hdXRvbmVnICE9IEFVVE9ORUdfRElTQUJMRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUgJiYKKwkgICAgKChjbWQtPnNwZWVkICE9IFNQRUVEXzEwMCAmJgorCSAgICAgIGNtZC0+c3BlZWQgIT0gU1BFRURfMTApIHx8CisJICAgICAoY21kLT5kdXBsZXggIT0gRFVQTEVYX0hBTEYgJiYKKwkgICAgICBjbWQtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE9rLCBkbyBpdCB0byBpdC4gKi8KKwlzcGluX2xvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisJZGVsX3RpbWVyKCZocC0+aGFwcHlfdGltZXIpOworCWhhcHB5X21lYWxfYmVnaW5fYXV0b19uZWdvdGlhdGlvbihocCwgaHAtPnRjdnJlZ3MsIGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaG1lX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IGhhcHB5X21lYWwgKmhwID0gZGV2LT5wcml2OworCisJc3RyY3B5KGluZm8tPmRyaXZlciwgInN1bmhtZSIpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCAiMi4wMiIpOworCWlmIChocC0+aGFwcHlfZmxhZ3MgJiBIRkxBR19QQ0kpIHsKKwkJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBocC0+aGFwcHlfZGV2OworCQlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHBkZXYpKTsKKwl9CisjaWZkZWYgQ09ORklHX1NCVVMKKwllbHNlIHsKKwkJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gaHAtPmhhcHB5X2RldjsKKwkJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIlNCVVM6JWQiLAorCQkJc2Rldi0+c2xvdCk7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB1MzIgaG1lX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhhcHB5X21lYWwgKmhwID0gZGV2LT5wcml2OworCisJc3Bpbl9sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCWhwLT5zd19ibWNyID0gaGFwcHlfbWVhbF90Y3ZyX3JlYWQoaHAsIGhwLT50Y3ZyZWdzLCBNSUlfQk1DUik7CisJc3Bpbl91bmxvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisKKwlyZXR1cm4gKGhwLT5zd19ibXNyICYgQk1TUl9MU1RBVFVTKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBobWVfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncwkJPSBobWVfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gaG1lX3NldF9zZXR0aW5ncywKKwkuZ2V0X2RydmluZm8JCT0gaG1lX2dldF9kcnZpbmZvLAorCS5nZXRfbGluawkJPSBobWVfZ2V0X2xpbmssCit9OworCitzdGF0aWMgaW50IGhtZV92ZXJzaW9uX3ByaW50ZWQ7CisKKyNpZmRlZiBDT05GSUdfU0JVUwordm9pZCBfX2luaXQgcXVhdHRyb19nZXRfcmFuZ2VzKHN0cnVjdCBxdWF0dHJvICpxcCkKK3sKKwlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBxcC0+cXVhdHRyb19kZXY7CisJaW50IGVycjsKKworCWVyciA9IHByb21fZ2V0cHJvcGVydHkoc2Rldi0+cHJvbV9ub2RlLAorCQkJICAgICAgICJyYW5nZXMiLAorCQkJICAgICAgIChjaGFyICopJnFwLT5yYW5nZXNbMF0sCisJCQkgICAgICAgc2l6ZW9mKHFwLT5yYW5nZXMpKTsKKwlpZiAoZXJyID09IDAgfHwgZXJyID09IC0xKSB7CisJCXFwLT5ucmFuZ2VzID0gMDsKKwkJcmV0dXJuOworCX0KKwlxcC0+bnJhbmdlcyA9IChlcnIgLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBxdWF0dHJvX2FwcGx5X3JhbmdlcyhzdHJ1Y3QgcXVhdHRybyAqcXAsIHN0cnVjdCBoYXBweV9tZWFsICpocCkKK3sKKwlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBocC0+aGFwcHlfZGV2OworCWludCBybmc7CisKKwlmb3IgKHJuZyA9IDA7IHJuZyA8IHFwLT5ucmFuZ2VzOyBybmcrKykgeworCQlzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMgKnJuZ3AgPSAmcXAtPnJhbmdlc1tybmddOworCQlpbnQgcmVnOworCisJCWZvciAocmVnID0gMDsgcmVnIDwgNTsgcmVnKyspIHsKKwkJCWlmIChzZGV2LT5yZWdfYWRkcnNbcmVnXS53aGljaF9pbyA9PQorCQkJICAgIHJuZ3AtPm90X2NoaWxkX3NwYWNlKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChyZWcgPT0gNSkKKwkJCWNvbnRpbnVlOworCisJCXNkZXYtPnJlZ19hZGRyc1tyZWddLndoaWNoX2lvID0gcm5ncC0+b3RfcGFyZW50X3NwYWNlOworCQlzZGV2LT5yZWdfYWRkcnNbcmVnXS5waHlzX2FkZHIgKz0gcm5ncC0+b3RfcGFyZW50X2Jhc2U7CisJfQorfQorCisvKiBHaXZlbiBhIGhhcHB5IG1lYWwgc2J1cyBkZXZpY2UsIGZpbmQgaXQncyBxdWF0dHJvIHBhcmVudC4KKyAqIElmIG5vbmUgZXhpc3QsIGFsbG9jYXRlIGFuZCByZXR1cm4gYSBuZXcgb25lLgorICoKKyAqIFJldHVybiBOVUxMIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcXVhdHRybyAqIF9faW5pdCBxdWF0dHJvX3NidXNfZmluZChzdHJ1Y3Qgc2J1c19kZXYgKmdvYWxfc2RldikKK3sKKwlzdHJ1Y3Qgc2J1c19idXMgKnNidXM7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2OworCXN0cnVjdCBxdWF0dHJvICpxcDsKKwlpbnQgaTsKKworCWlmIChxZmVfc2J1c19saXN0ID09IE5VTEwpCisJCWdvdG8gZm91bmQ7CisKKwlmb3IgKHFwID0gcWZlX3NidXNfbGlzdDsgcXAgIT0gTlVMTDsgcXAgPSBxcC0+bmV4dCkgeworCQlmb3IgKGkgPSAwLCBzZGV2ID0gcXAtPnF1YXR0cm9fZGV2OworCQkgICAgIChzZGV2ICE9IE5VTEwpICYmIChpIDwgNCk7CisJCSAgICAgc2RldiA9IHNkZXYtPm5leHQsIGkrKykgeworCQkJaWYgKHNkZXYgPT0gZ29hbF9zZGV2KQorCQkJCXJldHVybiBxcDsKKwkJfQorCX0KKwlmb3JfZWFjaF9zYnVzKHNidXMpIHsKKwkJZm9yX2VhY2hfc2J1c2RldihzZGV2LCBzYnVzKSB7CisJCQlpZiAoc2RldiA9PSBnb2FsX3NkZXYpCisJCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKworCS8qIENhbm5vdCBmaW5kIHF1YXR0cm8gcGFyZW50LCBmYWlsLiAqLworCXJldHVybiBOVUxMOworCitmb3VuZDoKKwlxcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBxdWF0dHJvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHFwICE9IE5VTEwpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCXFwLT5oYXBweV9tZWFsc1tpXSA9IE5VTEw7CisKKwkJcXAtPnF1YXR0cm9fZGV2ID0gZ29hbF9zZGV2OworCQlxcC0+bmV4dCA9IHFmZV9zYnVzX2xpc3Q7CisJCXFmZV9zYnVzX2xpc3QgPSBxcDsKKwkJcXVhdHRyb19nZXRfcmFuZ2VzKHFwKTsKKwl9CisJcmV0dXJuIHFwOworfQorCisvKiBBZnRlciBhbGwgcXVhdHRybyBjYXJkcyBoYXZlIGJlZW4gcHJvYmVkLCB3ZSBjYWxsIHRoZXNlIGZ1bmN0aW9ucworICogdG8gcmVnaXN0ZXIgdGhlIElSUSBoYW5kbGVycy4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHF1YXR0cm9fc2J1c19yZWdpc3Rlcl9pcnFzKHZvaWQpCit7CisJc3RydWN0IHF1YXR0cm8gKnFwOworCisJZm9yIChxcCA9IHFmZV9zYnVzX2xpc3Q7IHFwICE9IE5VTEw7IHFwID0gcXAtPm5leHQpIHsKKwkJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gcXAtPnF1YXR0cm9fZGV2OworCQlpbnQgZXJyOworCisJCWVyciA9IHJlcXVlc3RfaXJxKHNkZXYtPmlycXNbMF0sCisJCQkJICBxdWF0dHJvX3NidXNfaW50ZXJydXB0LAorCQkJCSAgU0FfU0hJUlEsICJRdWF0dHJvIiwKKwkJCQkgIHFwKTsKKwkJaWYgKGVyciAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlF1YXR0cm86IEZhdGFsIElSUSByZWdpc3RlcnkgZXJyb3IgJWQuXG4iLCBlcnIpOworCQkJcGFuaWMoIlFGRSByZXF1ZXN0IGlycSIpOworCQl9CisJfQorfQorI2VuZGlmIC8qIENPTkZJR19TQlVTICovCisKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgc3RydWN0IHF1YXR0cm8gKiBfX2luaXQgcXVhdHRyb19wY2lfZmluZChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqYmRldiA9IHBkZXYtPmJ1cy0+c2VsZjsKKwlzdHJ1Y3QgcXVhdHRybyAqcXA7CisKKwlpZiAoIWJkZXYpIHJldHVybiBOVUxMOworCWZvciAocXAgPSBxZmVfcGNpX2xpc3Q7IHFwICE9IE5VTEw7IHFwID0gcXAtPm5leHQpIHsKKwkJc3RydWN0IHBjaV9kZXYgKnFwZGV2ID0gcXAtPnF1YXR0cm9fZGV2OworCisJCWlmIChxcGRldiA9PSBiZGV2KQorCQkJcmV0dXJuIHFwOworCX0KKwlxcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBxdWF0dHJvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHFwICE9IE5VTEwpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCXFwLT5oYXBweV9tZWFsc1tpXSA9IE5VTEw7CisKKwkJcXAtPnF1YXR0cm9fZGV2ID0gYmRldjsKKwkJcXAtPm5leHQgPSBxZmVfcGNpX2xpc3Q7CisJCXFmZV9wY2lfbGlzdCA9IHFwOworCisJCS8qIE5vIHJhbmdlIHRyaWNrcyBuZWNlc3Nhcnkgb24gUENJLiAqLworCQlxcC0+bnJhbmdlcyA9IDA7CisJfQorCXJldHVybiBxcDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKKyNpZmRlZiBDT05GSUdfU0JVUworc3RhdGljIGludCBfX2luaXQgaGFwcHlfbWVhbF9zYnVzX2luaXQoc3RydWN0IHNidXNfZGV2ICpzZGV2LCBpbnQgaXNfcWZlKQoreworCXN0cnVjdCBxdWF0dHJvICpxcCA9IE5VTEw7CisJc3RydWN0IGhhcHB5X21lYWwgKmhwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGksIHFmZV9zbG90ID0gLTE7CisJaW50IGVyciA9IC1FTk9ERVY7CisKKwlpZiAoaXNfcWZlKSB7CisJCXFwID0gcXVhdHRyb19zYnVzX2ZpbmQoc2Rldik7CisJCWlmIChxcCA9PSBOVUxMKQorCQkJZ290byBlcnJfb3V0OworCQlmb3IgKHFmZV9zbG90ID0gMDsgcWZlX3Nsb3QgPCA0OyBxZmVfc2xvdCsrKQorCQkJaWYgKHFwLT5oYXBweV9tZWFsc1txZmVfc2xvdF0gPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJaWYgKHFmZV9zbG90ID09IDQpCisJCQlnb3RvIGVycl9vdXQ7CisJfQorCisJZXJyID0gLUVOT01FTTsKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGhhcHB5X21lYWwpKTsKKwlpZiAoIWRldikKKwkJZ290byBlcnJfb3V0OworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWlmIChobWVfdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCS8qIElmIHVzZXIgZGlkIG5vdCBzcGVjaWZ5IGEgTUFDIGFkZHJlc3Mgc3BlY2lmaWNhbGx5LCB1c2UKKwkgKiB0aGUgUXVhdHRybyBsb2NhbC1tYWMtYWRkcmVzcyBwcm9wZXJ0eS4uLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJaWYgKG1hY2FkZHJbaV0gIT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA8IDYpIHsgLyogYSBtYWMgYWRkcmVzcyB3YXMgZ2l2ZW4gKi8KKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCWRldi0+ZGV2X2FkZHJbaV0gPSBtYWNhZGRyW2ldOworCQltYWNhZGRyWzVdKys7CisJfSBlbHNlIGlmIChxZmVfc2xvdCAhPSAtMSAmJgorCQkgICBwcm9tX2dldHByb3BsZW4oc2Rldi0+cHJvbV9ub2RlLAorCQkJCSAgICJsb2NhbC1tYWMtYWRkcmVzcyIpID09IDYpIHsKKwkJcHJvbV9nZXRwcm9wZXJ0eShzZGV2LT5wcm9tX25vZGUsICJsb2NhbC1tYWMtYWRkcmVzcyIsCisJCQkJIGRldi0+ZGV2X2FkZHIsIDYpOworCX0gZWxzZSB7CisJCW1lbWNweShkZXYtPmRldl9hZGRyLCBpZHByb20tPmlkX2V0aGFkZHIsIDYpOworCX0KKworCWhwID0gZGV2LT5wcml2OworCisJaHAtPmhhcHB5X2RldiA9IHNkZXY7CisKKwlzcGluX2xvY2tfaW5pdCgmaHAtPmhhcHB5X2xvY2spOworCisJZXJyID0gLUVOT0RFVjsKKwlpZiAoc2Rldi0+bnVtX3JlZ2lzdGVycyAhPSA1KSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHltZWFsOiBEZXZpY2UgZG9lcyBub3QgaGF2ZSA1IHJlZ3MsIGl0IGhhcyAlZC5cbiIsCisJCSAgICAgICBzZGV2LT5udW1fcmVnaXN0ZXJzKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWw6IFdvdWxkIHlvdSBsaWtlIHRoYXQgZm9yIGhlcmUgb3IgdG8gZ28/XG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCX0KKworCWlmIChxcCAhPSBOVUxMKSB7CisJCWhwLT5xZmVfcGFyZW50ID0gcXA7CisJCWhwLT5xZmVfZW50ID0gcWZlX3Nsb3Q7CisJCXFwLT5oYXBweV9tZWFsc1txZmVfc2xvdF0gPSBkZXY7CisJCXF1YXR0cm9fYXBwbHlfcmFuZ2VzKHFwLCBocCk7CisJfQorCisJaHAtPmdyZWdzID0gc2J1c19pb3JlbWFwKCZzZGV2LT5yZXNvdXJjZVswXSwgMCwKKwkJCQkgR1JFR19SRUdfU0laRSwgIkhNRSBHbG9iYWwgUmVncyIpOworCWlmICghaHAtPmdyZWdzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHltZWFsOiBDYW5ub3QgbWFwIEhhcHB5IE1lYWwgZ2xvYmFsIHJlZ2lzdGVycy5cbiIpOworCQlnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7CisJfQorCisJaHAtPmV0eHJlZ3MgPSBzYnVzX2lvcmVtYXAoJnNkZXYtPnJlc291cmNlWzFdLCAwLAorCQkJCSAgIEVUWF9SRUdfU0laRSwgIkhNRSBUWCBSZWdzIik7CisJaWYgKCFocC0+ZXR4cmVncykgeworCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbDogQ2Fubm90IG1hcCBIYXBweSBNZWFsIE1BQyBUcmFuc21pdCByZWdpc3RlcnMuXG4iKTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCisJaHAtPmVyeHJlZ3MgPSBzYnVzX2lvcmVtYXAoJnNkZXYtPnJlc291cmNlWzJdLCAwLAorCQkJCSAgIEVSWF9SRUdfU0laRSwgIkhNRSBSWCBSZWdzIik7CisJaWYgKCFocC0+ZXJ4cmVncykgeworCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbDogQ2Fubm90IG1hcCBIYXBweSBNZWFsIE1BQyBSZWNlaXZlIHJlZ2lzdGVycy5cbiIpOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisKKwlocC0+YmlnbWFjcmVncyA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbM10sIDAsCisJCQkJICAgICAgQk1BQ19SRUdfU0laRSwgIkhNRSBCSUdNQUMgUmVncyIpOworCWlmICghaHAtPmJpZ21hY3JlZ3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWw6IENhbm5vdCBtYXAgSGFwcHkgTWVhbCBCSUdNQUMgcmVnaXN0ZXJzLlxuIik7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCWhwLT50Y3ZyZWdzID0gc2J1c19pb3JlbWFwKCZzZGV2LT5yZXNvdXJjZVs0XSwgMCwKKwkJCQkgICBUQ1ZSX1JFR19TSVpFLCAiSE1FIFRyYW5jZWl2ZXIgUmVncyIpOworCWlmICghaHAtPnRjdnJlZ3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWw6IENhbm5vdCBtYXAgSGFwcHkgTWVhbCBUcmFuY2VpdmVyIHJlZ2lzdGVycy5cbiIpOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisKKwlocC0+aG1fcmV2aXNpb24gPSBwcm9tX2dldGludGRlZmF1bHQoc2Rldi0+cHJvbV9ub2RlLCAiaG0tcmV2IiwgMHhmZik7CisJaWYgKGhwLT5obV9yZXZpc2lvbiA9PSAweGZmKQorCQlocC0+aG1fcmV2aXNpb24gPSAweGEwOworCisJLyogTm93IGVuYWJsZSB0aGUgZmVhdHVyZSBmbGFncyB3ZSBjYW4uICovCisJaWYgKGhwLT5obV9yZXZpc2lvbiA9PSAweDIwIHx8IGhwLT5obV9yZXZpc2lvbiA9PSAweDIxKQorCQlocC0+aGFwcHlfZmxhZ3MgPSBIRkxBR18yMF8yMTsKKwllbHNlIGlmIChocC0+aG1fcmV2aXNpb24gIT0gMHhhMCkKKwkJaHAtPmhhcHB5X2ZsYWdzID0gSEZMQUdfTk9UX0EwOworCisJaWYgKHFwICE9IE5VTEwpCisJCWhwLT5oYXBweV9mbGFncyB8PSBIRkxBR19RVUFUVFJPOworCisJLyogR2V0IHRoZSBzdXBwb3J0ZWQgRFZNQSBidXJzdCBzaXplcyBmcm9tIG91ciBIYXBweSBTQlVTLiAqLworCWhwLT5oYXBweV9idXJzdHMgPSBwcm9tX2dldGludGRlZmF1bHQoc2Rldi0+YnVzLT5wcm9tX25vZGUsCisJCQkJCSAgICAgICJidXJzdC1zaXplcyIsIDB4MDApOworCisJaHAtPmhhcHB5X2Jsb2NrID0gc2J1c19hbGxvY19jb25zaXN0ZW50KGhwLT5oYXBweV9kZXYsCisJCQkJCQlQQUdFX1NJWkUsCisJCQkJCQkmaHAtPmhibG9ja19kdm1hKTsKKwllcnIgPSAtRU5PTUVNOworCWlmICghaHAtPmhhcHB5X2Jsb2NrKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHltZWFsOiBDYW5ub3QgYWxsb2NhdGUgZGVzY3JpcHRvcnMuXG4iKTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCisJLyogRm9yY2UgY2hlY2sgb2YgdGhlIGxpbmsgZmlyc3QgdGltZSB3ZSBhcmUgYnJvdWdodCB1cC4gKi8KKwlocC0+bGlua2NoZWNrID0gMDsKKworCS8qIEZvcmNlIHRpbWVyIHN0YXRlIHRvICdhc2xlZXAnIHdpdGggY291bnQgb2YgemVyby4gKi8KKwlocC0+dGltZXJfc3RhdGUgPSBhc2xlZXA7CisJaHAtPnRpbWVyX3RpY2tzID0gMDsKKworCWluaXRfdGltZXIoJmhwLT5oYXBweV90aW1lcik7CisKKwlocC0+ZGV2ID0gZGV2OworCWRldi0+b3BlbiA9ICZoYXBweV9tZWFsX29wZW47CisJZGV2LT5zdG9wID0gJmhhcHB5X21lYWxfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmaGFwcHlfbWVhbF9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gJmhhcHB5X21lYWxfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJmhhcHB5X21lYWxfc2V0X211bHRpY2FzdDsKKwlkZXYtPnR4X3RpbWVvdXQgPSAmaGFwcHlfbWVhbF90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSA1KkhaOworCWRldi0+ZXRodG9vbF9vcHMgPSAmaG1lX2V0aHRvb2xfb3BzOworCisJLyogSGFwcHkgTWVhbCBjYW4gZG8gaXQgYWxsLi4uIGV4Y2VwdCBWTEFOLiAqLworCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSFdfQ1NVTSB8IE5FVElGX0ZfVkxBTl9DSEFMTEVOR0VEOworCisJZGV2LT5pcnEgPSBzZGV2LT5pcnFzWzBdOworCisjaWYgZGVmaW5lZChDT05GSUdfU0JVUykgJiYgZGVmaW5lZChDT05GSUdfUENJKQorCS8qIEhvb2sgdXAgUENJIHJlZ2lzdGVyL2RtYSBhY2Nlc3NvcnMuICovCisJaHAtPnJlYWRfZGVzYzMyID0gc2J1c19obWVfcmVhZF9kZXNjMzI7CisJaHAtPndyaXRlX3R4ZCA9IHNidXNfaG1lX3dyaXRlX3R4ZDsKKwlocC0+d3JpdGVfcnhkID0gc2J1c19obWVfd3JpdGVfcnhkOworCWhwLT5kbWFfbWFwID0gKHUzMiAoKikodm9pZCAqLCB2b2lkICosIGxvbmcsIGludCkpc2J1c19tYXBfc2luZ2xlOworCWhwLT5kbWFfdW5tYXAgPSAodm9pZCAoKikodm9pZCAqLCB1MzIsIGxvbmcsIGludCkpc2J1c191bm1hcF9zaW5nbGU7CisJaHAtPmRtYV9zeW5jX2Zvcl9jcHUgPSAodm9pZCAoKikodm9pZCAqLCB1MzIsIGxvbmcsIGludCkpCisJCXNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHU7CisJaHAtPmRtYV9zeW5jX2Zvcl9kZXZpY2UgPSAodm9pZCAoKikodm9pZCAqLCB1MzIsIGxvbmcsIGludCkpCisJCXNidXNfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2U7CisJaHAtPnJlYWQzMiA9IHNidXNfaG1lX3JlYWQzMjsKKwlocC0+d3JpdGUzMiA9IHNidXNfaG1lX3dyaXRlMzI7CisjZW5kaWYKKworCS8qIEdycnIsIEhhcHB5IE1lYWwgY29tZXMgdXAgYnkgZGVmYXVsdCBub3QgYWR2ZXJ0aXNpbmcKKwkgKiBmdWxsIGR1cGxleCAxMDBiYXNlVCBjYXBhYmlsaXRpZXMsIGZpeCB0aGlzLgorCSAqLworCXNwaW5fbG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKwloYXBweV9tZWFsX3NldF9pbml0aWFsX2FkdmVydGlzZW1lbnQoaHApOworCXNwaW5fdW5sb2NrX2lycSgmaHAtPmhhcHB5X2xvY2spOworCisJaWYgKHJlZ2lzdGVyX25ldGRldihocC0+ZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbDogQ2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UsICIKKwkJICAgICAgICJhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfZnJlZV9jb25zaXN0ZW50OworCX0KKworCWlmIChxZmVfc2xvdCAhPSAtMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFF1YXR0cm8gSE1FIHNsb3QgJWQgKFNCVVMpIDEwLzEwMGJhc2VUIEV0aGVybmV0ICIsCisJCSAgICAgICBkZXYtPm5hbWUsIHFmZV9zbG90KTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBIQVBQWSBNRUFMIChTQlVTKSAxMC8xMDBiYXNlVCBFdGhlcm5ldCAiLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiJTIuMnglYyIsCisJCSAgICAgICBkZXYtPmRldl9hZGRyW2ldLCBpID09IDUgPyAnICcgOiAnOicpOworCXByaW50aygiXG4iKTsKKworCS8qIFdlIGFyZSBob21lIGZyZWUgYXQgdGhpcyBwb2ludCwgbGluayB1cyBpbiB0byB0aGUgaGFwcHkKKwkgKiBkZXZpY2UgbGlzdC4KKwkgKi8KKwlocC0+bmV4dF9tb2R1bGUgPSByb290X2hhcHB5X2RldjsKKwlyb290X2hhcHB5X2RldiA9IGhwOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZnJlZV9jb25zaXN0ZW50OgorCXNidXNfZnJlZV9jb25zaXN0ZW50KGhwLT5oYXBweV9kZXYsCisJCQkgICAgIFBBR0VfU0laRSwKKwkJCSAgICAgaHAtPmhhcHB5X2Jsb2NrLAorCQkJICAgICBocC0+aGJsb2NrX2R2bWEpOworCitlcnJfb3V0X2lvdW5tYXA6CisJaWYgKGhwLT5ncmVncykKKwkJc2J1c19pb3VubWFwKGhwLT5ncmVncywgR1JFR19SRUdfU0laRSk7CisJaWYgKGhwLT5ldHhyZWdzKQorCQlzYnVzX2lvdW5tYXAoaHAtPmV0eHJlZ3MsIEVUWF9SRUdfU0laRSk7CisJaWYgKGhwLT5lcnhyZWdzKQorCQlzYnVzX2lvdW5tYXAoaHAtPmVyeHJlZ3MsIEVSWF9SRUdfU0laRSk7CisJaWYgKGhwLT5iaWdtYWNyZWdzKQorCQlzYnVzX2lvdW5tYXAoaHAtPmJpZ21hY3JlZ3MsIEJNQUNfUkVHX1NJWkUpOworCWlmIChocC0+dGN2cmVncykKKwkJc2J1c19pb3VubWFwKGhwLT50Y3ZyZWdzLCBUQ1ZSX1JFR19TSVpFKTsKKworZXJyX291dF9mcmVlX25ldGRldjoKKwlmcmVlX25ldGRldihkZXYpOworCitlcnJfb3V0OgorCXJldHVybiBlcnI7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ0kKKyNpZm5kZWYgX19zcGFyY19fCitzdGF0aWMgaW50IGlzX3F1YXR0cm9fcChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqYnVzZGV2ID0gcGRldi0+YnVzLT5zZWxmOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwlpbnQgbl9obWVzOworCisJaWYgKGJ1c2RldiA9PSBOVUxMIHx8CisJICAgIGJ1c2Rldi0+dmVuZG9yICE9IFBDSV9WRU5ET1JfSURfREVDIHx8CisJICAgIGJ1c2Rldi0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfREVDXzIxMTUzKQorCQlyZXR1cm4gMDsKKworCW5faG1lcyA9IDA7CisJdG1wID0gcGRldi0+YnVzLT5kZXZpY2VzLm5leHQ7CisJd2hpbGUgKHRtcCAhPSAmcGRldi0+YnVzLT5kZXZpY2VzKSB7CisJCXN0cnVjdCBwY2lfZGV2ICp0aGlzX3BkZXYgPSBwY2lfZGV2X2IodG1wKTsKKworCQlpZiAodGhpc19wZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9TVU4gJiYKKwkJICAgIHRoaXNfcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU1VOX0hBUFBZTUVBTCkKKwkJCW5faG1lcysrOworCisJCXRtcCA9IHRtcC0+bmV4dDsKKwl9CisKKwlpZiAobl9obWVzICE9IDQpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qIEZldGNoIE1BQyBhZGRyZXNzIGZyb20gdml0YWwgcHJvZHVjdCBkYXRhIG9mIFBDSSBST00uICovCitzdGF0aWMgdm9pZCBmaW5kX2V0aF9hZGRyX2luX3ZwZCh2b2lkIF9faW9tZW0gKnJvbV9iYXNlLCBpbnQgbGVuLCBpbnQgaW5kZXgsIHVuc2lnbmVkIGNoYXIgKmRldl9hZGRyKQoreworCWludCB0aGlzX29mZnNldDsKKworCWZvciAodGhpc19vZmZzZXQgPSAweDIwOyB0aGlzX29mZnNldCA8IGxlbjsgdGhpc19vZmZzZXQrKykgeworCQl2b2lkIF9faW9tZW0gKnAgPSByb21fYmFzZSArIHRoaXNfb2Zmc2V0OworCisJCWlmIChyZWFkYihwICsgMCkgIT0gMHg5MCB8fAorCQkgICAgcmVhZGIocCArIDEpICE9IDB4MDAgfHwKKwkJICAgIHJlYWRiKHAgKyAyKSAhPSAweDA5IHx8CisJCSAgICByZWFkYihwICsgMykgIT0gMHg0ZSB8fAorCQkgICAgcmVhZGIocCArIDQpICE9IDB4NDEgfHwKKwkJICAgIHJlYWRiKHAgKyA1KSAhPSAweDA2KQorCQkJY29udGludWU7CisKKwkJdGhpc19vZmZzZXQgKz0gNjsKKwkJcCArPSA2OworCisJCWlmIChpbmRleCA9PSAwKSB7CisJCQlpbnQgaTsKKworCQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCQlkZXZfYWRkcltpXSA9IHJlYWRiKHAgKyBpKTsKKwkJCWJyZWFrOworCQl9CisJCWluZGV4LS07CisJfQorfQorCitzdGF0aWMgdm9pZCBnZXRfaG1lX21hY19ub25zcGFyYyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgY2hhciAqZGV2X2FkZHIpCit7CisJdTMyIHJvbV9yZWdfb3JpZzsKKwl2b2lkIF9faW9tZW0gKnA7CisJaW50IGluZGV4OworCisJaW5kZXggPSAwOworCWlmIChpc19xdWF0dHJvX3AocGRldikpCisJCWluZGV4ID0gUENJX1NMT1QocGRldi0+ZGV2Zm4pOworCisJaWYgKHBkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLnBhcmVudCA9PSBOVUxMKSB7CisJCWlmIChwY2lfYXNzaWduX3Jlc291cmNlKHBkZXYsIFBDSV9ST01fUkVTT1VSQ0UpIDwgMCkKKwkJCWdvdG8gdXNlX3JhbmRvbTsKKwl9CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgcGRldi0+cm9tX2Jhc2VfcmVnLCAmcm9tX3JlZ19vcmlnKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHBkZXYtPnJvbV9iYXNlX3JlZywKKwkJCSAgICAgICByb21fcmVnX29yaWcgfCBQQ0lfUk9NX0FERFJFU1NfRU5BQkxFKTsKKworCXAgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBQQ0lfUk9NX1JFU09VUkNFKSwgKDY0ICogMTAyNCkpOworCWlmIChwICE9IE5VTEwgJiYgcmVhZGIocCkgPT0gMHg1NSAmJiByZWFkYihwICsgMSkgPT0gMHhhYSkKKwkJZmluZF9ldGhfYWRkcl9pbl92cGQocCwgKDY0ICogMTAyNCksIGluZGV4LCBkZXZfYWRkcik7CisKKwlpZiAocCAhPSBOVUxMKQorCQlpb3VubWFwKHApOworCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBwZGV2LT5yb21fYmFzZV9yZWcsIHJvbV9yZWdfb3JpZyk7CisJcmV0dXJuOworCit1c2VfcmFuZG9tOgorCS8qIFN1biBNQUMgcHJlZml4IHRoZW4gMyByYW5kb20gYnl0ZXMuICovCisJZGV2X2FkZHJbMF0gPSAweDA4OworCWRldl9hZGRyWzFdID0gMHgwMDsKKwlkZXZfYWRkclsyXSA9IDB4MjA7CisJZ2V0X3JhbmRvbV9ieXRlcygmZGV2X2FkZHJbM10sIDMpOworCXJldHVybjsKK30KKyNlbmRpZiAvKiAhKF9fc3BhcmNfXykgKi8KKworc3RhdGljIGludCBfX2luaXQgaGFwcHlfbWVhbF9wY2lfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgcXVhdHRybyAqcXAgPSBOVUxMOworI2lmZGVmIF9fc3BhcmNfXworCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3A7CisJaW50IG5vZGU7CisjZW5kaWYKKwlzdHJ1Y3QgaGFwcHlfbWVhbCAqaHA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl2b2lkIF9faW9tZW0gKmhwcmVnX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBocHJlZ19yZXM7CisJaW50IGksIHFmZV9zbG90ID0gLTE7CisJY2hhciBwcm9tX25hbWVbNjRdOworCWludCBlcnI7CisKKwkvKiBOb3cgbWFrZSBzdXJlIHBjaV9kZXYgY29va2llIGlzIHRoZXJlLiAqLworI2lmZGVmIF9fc3BhcmNfXworCXBjcCA9IHBkZXYtPnN5c2RhdGE7CisJaWYgKHBjcCA9PSBOVUxMIHx8IHBjcC0+cHJvbV9ub2RlID09IC0xKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHltZWFsKFBDSSk6IFNvbWUgUENJIGRldmljZSBpbmZvIG1pc3NpbmdcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJbm9kZSA9IHBjcC0+cHJvbV9ub2RlOworCQorCXByb21fZ2V0c3RyaW5nKG5vZGUsICJuYW1lIiwgcHJvbV9uYW1lLCBzaXplb2YocHJvbV9uYW1lKSk7CisjZWxzZQorCWlmIChpc19xdWF0dHJvX3AocGRldikpCisJCXN0cmNweShwcm9tX25hbWUsICJTVU5XLHFmZSIpOworCWVsc2UKKwkJc3RyY3B5KHByb21fbmFtZSwgIlNVTlcsaG1lIik7CisjZW5kaWYKKworCWVyciA9IC1FTk9ERVY7CisJaWYgKCFzdHJjbXAocHJvbV9uYW1lLCAiU1VOVyxxZmUiKSB8fCAhc3RyY21wKHByb21fbmFtZSwgInFmZSIpKSB7CisJCXFwID0gcXVhdHRyb19wY2lfZmluZChwZGV2KTsKKwkJaWYgKHFwID09IE5VTEwpCisJCQlnb3RvIGVycl9vdXQ7CisJCWZvciAocWZlX3Nsb3QgPSAwOyBxZmVfc2xvdCA8IDQ7IHFmZV9zbG90KyspCisJCQlpZiAocXAtPmhhcHB5X21lYWxzW3FmZV9zbG90XSA9PSBOVUxMKQorCQkJCWJyZWFrOworCQlpZiAocWZlX3Nsb3QgPT0gNCkKKwkJCWdvdG8gZXJyX291dDsKKwl9CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGhhcHB5X21lYWwpKTsKKwllcnIgPSAtRU5PTUVNOworCWlmICghZGV2KQorCQlnb3RvIGVycl9vdXQ7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlpZiAoaG1lX3ZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisKKwlkZXYtPmJhc2VfYWRkciA9IChsb25nKSBwZGV2OworCisJaHAgPSAoc3RydWN0IGhhcHB5X21lYWwgKilkZXYtPnByaXY7CisJbWVtc2V0KGhwLCAwLCBzaXplb2YoKmhwKSk7CisKKwlocC0+aGFwcHlfZGV2ID0gcGRldjsKKworCXNwaW5fbG9ja19pbml0KCZocC0+aGFwcHlfbG9jayk7CisKKwlpZiAocXAgIT0gTlVMTCkgeworCQlocC0+cWZlX3BhcmVudCA9IHFwOworCQlocC0+cWZlX2VudCA9IHFmZV9zbG90OworCQlxcC0+aGFwcHlfbWVhbHNbcWZlX3Nsb3RdID0gZGV2OworCX0JCQorCisJaHByZWdfcmVzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWVyciA9IC1FTk9ERVY7CisJaWYgKChwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX0lPKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHltZWFsKFBDSSk6IENhbm5vdCBmaW5kIHByb3BlciBQQ0kgZGV2aWNlIGJhc2UgYWRkcmVzcy5cbiIpOworCQlnb3RvIGVycl9vdXRfY2xlYXJfcXVhdHRybzsKKwl9CisJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHltZWFsKFBDSSk6IENhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlcywgIgorCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9jbGVhcl9xdWF0dHJvOworCX0KKworCWlmICgoaHByZWdfYmFzZSA9IGlvcmVtYXAoaHByZWdfcmVzLCAweDgwMDApKSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHltZWFsKFBDSSk6IFVuYWJsZSB0byByZW1hcCBjYXJkIG1lbW9yeS5cbiIpOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlpZiAobWFjYWRkcltpXSAhPSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChpIDwgNikgeyAvKiBhIG1hYyBhZGRyZXNzIHdhcyBnaXZlbiAqLworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJZGV2LT5kZXZfYWRkcltpXSA9IG1hY2FkZHJbaV07CisJCW1hY2FkZHJbNV0rKzsKKwl9IGVsc2UgeworI2lmZGVmIF9fc3BhcmNfXworCQlpZiAocWZlX3Nsb3QgIT0gLTEgJiYKKwkJICAgIHByb21fZ2V0cHJvcGxlbihub2RlLCAibG9jYWwtbWFjLWFkZHJlc3MiKSA9PSA2KSB7CisJCQlwcm9tX2dldHByb3BlcnR5KG5vZGUsICJsb2NhbC1tYWMtYWRkcmVzcyIsCisJCQkJCSBkZXYtPmRldl9hZGRyLCA2KTsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweShkZXYtPmRldl9hZGRyLCBpZHByb20tPmlkX2V0aGFkZHIsIDYpOworCQl9CisjZWxzZQorCQlnZXRfaG1lX21hY19ub25zcGFyYyhwZGV2LCAmZGV2LT5kZXZfYWRkclswXSk7CisjZW5kaWYKKwl9CisJCisJLyogTGF5b3V0IHJlZ2lzdGVycy4gKi8KKwlocC0+Z3JlZ3MgICAgICA9IChocHJlZ19iYXNlICsgMHgwMDAwVUwpOworCWhwLT5ldHhyZWdzICAgID0gKGhwcmVnX2Jhc2UgKyAweDIwMDBVTCk7CisJaHAtPmVyeHJlZ3MgICAgPSAoaHByZWdfYmFzZSArIDB4NDAwMFVMKTsKKwlocC0+YmlnbWFjcmVncyA9IChocHJlZ19iYXNlICsgMHg2MDAwVUwpOworCWhwLT50Y3ZyZWdzICAgID0gKGhwcmVnX2Jhc2UgKyAweDcwMDBVTCk7CisKKyNpZmRlZiBfX3NwYXJjX18KKwlocC0+aG1fcmV2aXNpb24gPSBwcm9tX2dldGludGRlZmF1bHQobm9kZSwgImhtLXJldiIsIDB4ZmYpOworCWlmIChocC0+aG1fcmV2aXNpb24gPT0gMHhmZikgeworCQl1bnNpZ25lZCBjaGFyIHByZXY7CisKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmcHJldik7CisJCWhwLT5obV9yZXZpc2lvbiA9IDB4YzAgfCAocHJldiAmIDB4MGYpOworCX0KKyNlbHNlCisJLyogd29ya3Mgd2l0aCB0aGlzIG9uIG5vbi1zcGFyYyBob3N0cyAqLworCWhwLT5obV9yZXZpc2lvbiA9IDB4MjA7CisjZW5kaWYKKworCS8qIE5vdyBlbmFibGUgdGhlIGZlYXR1cmUgZmxhZ3Mgd2UgY2FuLiAqLworCWlmIChocC0+aG1fcmV2aXNpb24gPT0gMHgyMCB8fCBocC0+aG1fcmV2aXNpb24gPT0gMHgyMSkKKwkJaHAtPmhhcHB5X2ZsYWdzID0gSEZMQUdfMjBfMjE7CisJZWxzZSBpZiAoaHAtPmhtX3JldmlzaW9uICE9IDB4YTAgJiYgaHAtPmhtX3JldmlzaW9uICE9IDB4YzApCisJCWhwLT5oYXBweV9mbGFncyA9IEhGTEFHX05PVF9BMDsKKworCWlmIChxcCAhPSBOVUxMKQorCQlocC0+aGFwcHlfZmxhZ3MgfD0gSEZMQUdfUVVBVFRSTzsKKworCS8qIEFuZCBvZiBjb3Vyc2UsIGluZGljYXRlIHRoaXMgaXMgUENJLiAqLworCWhwLT5oYXBweV9mbGFncyB8PSBIRkxBR19QQ0k7CisKKyNpZmRlZiBfX3NwYXJjX18KKwkvKiBBc3N1bWUgUENJIGhhcHB5IG1lYWxzIGNhbiBoYW5kbGUgYWxsIGJ1cnN0IHNpemVzLiAqLworCWhwLT5oYXBweV9idXJzdHMgPSBETUFfQlVSU1RCSVRTOworI2VuZGlmCisKKwlocC0+aGFwcHlfYmxvY2sgPSAoc3RydWN0IGhtZWFsX2luaXRfYmxvY2sgKikKKwkJcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgUEFHRV9TSVpFLCAmaHAtPmhibG9ja19kdm1hKTsKKworCWVyciA9IC1FTk9ERVY7CisJaWYgKCFocC0+aGFwcHlfYmxvY2spIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWwoUENJKTogQ2Fubm90IGdldCBobWUgaW5pdCBibG9jay5cbiIpOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisKKwlocC0+bGlua2NoZWNrID0gMDsKKwlocC0+dGltZXJfc3RhdGUgPSBhc2xlZXA7CisJaHAtPnRpbWVyX3RpY2tzID0gMDsKKworCWluaXRfdGltZXIoJmhwLT5oYXBweV90aW1lcik7CisKKwlocC0+ZGV2ID0gZGV2OworCWRldi0+b3BlbiA9ICZoYXBweV9tZWFsX29wZW47CisJZGV2LT5zdG9wID0gJmhhcHB5X21lYWxfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmaGFwcHlfbWVhbF9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gJmhhcHB5X21lYWxfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJmhhcHB5X21lYWxfc2V0X211bHRpY2FzdDsKKwlkZXYtPnR4X3RpbWVvdXQgPSAmaGFwcHlfbWVhbF90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSA1KkhaOworCWRldi0+ZXRodG9vbF9vcHMgPSAmaG1lX2V0aHRvb2xfb3BzOworCWRldi0+aXJxID0gcGRldi0+aXJxOworCWRldi0+ZG1hID0gMDsKKworCS8qIEhhcHB5IE1lYWwgY2FuIGRvIGl0IGFsbC4uLiAqLworCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSFdfQ1NVTTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NCVVMpICYmIGRlZmluZWQoQ09ORklHX1BDSSkKKwkvKiBIb29rIHVwIFBDSSByZWdpc3Rlci9kbWEgYWNjZXNzb3JzLiAqLworCWhwLT5yZWFkX2Rlc2MzMiA9IHBjaV9obWVfcmVhZF9kZXNjMzI7CisJaHAtPndyaXRlX3R4ZCA9IHBjaV9obWVfd3JpdGVfdHhkOworCWhwLT53cml0ZV9yeGQgPSBwY2lfaG1lX3dyaXRlX3J4ZDsKKwlocC0+ZG1hX21hcCA9ICh1MzIgKCopKHZvaWQgKiwgdm9pZCAqLCBsb25nLCBpbnQpKXBjaV9tYXBfc2luZ2xlOworCWhwLT5kbWFfdW5tYXAgPSAodm9pZCAoKikodm9pZCAqLCB1MzIsIGxvbmcsIGludCkpcGNpX3VubWFwX3NpbmdsZTsKKwlocC0+ZG1hX3N5bmNfZm9yX2NwdSA9ICh2b2lkICgqKSh2b2lkICosIHUzMiwgbG9uZywgaW50KSkKKwkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1OworCWhwLT5kbWFfc3luY19mb3JfZGV2aWNlID0gKHZvaWQgKCopKHZvaWQgKiwgdTMyLCBsb25nLCBpbnQpKQorCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2U7CisJaHAtPnJlYWQzMiA9IHBjaV9obWVfcmVhZDMyOworCWhwLT53cml0ZTMyID0gcGNpX2htZV93cml0ZTMyOworI2VuZGlmCisKKwkvKiBHcnJyLCBIYXBweSBNZWFsIGNvbWVzIHVwIGJ5IGRlZmF1bHQgbm90IGFkdmVydGlzaW5nCisJICogZnVsbCBkdXBsZXggMTAwYmFzZVQgY2FwYWJpbGl0aWVzLCBmaXggdGhpcy4KKwkgKi8KKwlzcGluX2xvY2tfaXJxKCZocC0+aGFwcHlfbG9jayk7CisJaGFwcHlfbWVhbF9zZXRfaW5pdGlhbF9hZHZlcnRpc2VtZW50KGhwKTsKKwlzcGluX3VubG9ja19pcnEoJmhwLT5oYXBweV9sb2NrKTsKKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoaHAtPmRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWwoUENJKTogQ2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UsICIKKwkJICAgICAgICJhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisKKwlpZiAoIXFmZV9zbG90KSB7CisJCXN0cnVjdCBwY2lfZGV2ICpxcGRldiA9IHFwLT5xdWF0dHJvX2RldjsKKworCQlwcm9tX25hbWVbMF0gPSAwOworCQlpZiAoIXN0cm5jbXAoZGV2LT5uYW1lLCAiZXRoIiwgMykpIHsKKwkJCWludCBpID0gc2ltcGxlX3N0cnRvdWwoZGV2LT5uYW1lICsgMywgTlVMTCwgMTApOworCQkJc3ByaW50Zihwcm9tX25hbWUsICItJWQiLCBpICsgMyk7CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMlczogUXVhdHRybyBITUUgKFBDSS9DaGVlcklPKSAxMC8xMDBiYXNlVCBFdGhlcm5ldCAiLCBkZXYtPm5hbWUsIHByb21fbmFtZSk7CisJCWlmIChxcGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfREVDICYmCisJCSAgICBxcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfREVDXzIxMTUzKQorCQkJcHJpbnRrKCJERUMgMjExNTMgUENJIEJyaWRnZVxuIik7CisJCWVsc2UKKwkJCXByaW50aygidW5rbm93biBicmlkZ2UgJTA0eC4lMDR4XG4iLCAKKwkJCQlxcGRldi0+dmVuZG9yLCBxcGRldi0+ZGV2aWNlKTsKKwl9CisKKwlpZiAocWZlX3Nsb3QgIT0gLTEpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBRdWF0dHJvIEhNRSBzbG90ICVkIChQQ0kvQ2hlZXJJTykgMTAvMTAwYmFzZVQgRXRoZXJuZXQgIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcWZlX3Nsb3QpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEhBUFBZIE1FQUwgKFBDSS9DaGVlcklPKSAxMC8xMDBCYXNlVCBFdGhlcm5ldCAiLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiJTIuMnglYyIsIGRldi0+ZGV2X2FkZHJbaV0sIGkgPT0gNSA/ICcgJyA6ICc6Jyk7CisKKwlwcmludGsoIlxuIik7CisKKwkvKiBXZSBhcmUgaG9tZSBmcmVlIGF0IHRoaXMgcG9pbnQsIGxpbmsgdXMgaW4gdG8gdGhlIGhhcHB5CisJICogZGV2aWNlIGxpc3QuCisJICovCisJaHAtPm5leHRfbW9kdWxlID0gcm9vdF9oYXBweV9kZXY7CisJcm9vdF9oYXBweV9kZXYgPSBocDsKKworCXJldHVybiAwOworCitlcnJfb3V0X2lvdW5tYXA6CisJaW91bm1hcChocC0+Z3JlZ3MpOworCitlcnJfb3V0X2ZyZWVfcmVzOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKK2Vycl9vdXRfY2xlYXJfcXVhdHRybzoKKwlpZiAocXAgIT0gTlVMTCkKKwkJcXAtPmhhcHB5X21lYWxzW3FmZV9zbG90XSA9IE5VTEw7CisKKwlmcmVlX25ldGRldihkZXYpOworCitlcnJfb3V0OgorCXJldHVybiBlcnI7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TQlVTCitzdGF0aWMgaW50IF9faW5pdCBoYXBweV9tZWFsX3NidXNfcHJvYmUodm9pZCkKK3sKKwlzdHJ1Y3Qgc2J1c19idXMgKnNidXM7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2OworCWludCBjYXJkcyA9IDA7CisJY2hhciBtb2RlbFsxMjhdOworCisJZm9yX2VhY2hfc2J1cyhzYnVzKSB7CisJCWZvcl9lYWNoX3NidXNkZXYoc2Rldiwgc2J1cykgeworCQkJY2hhciAqbmFtZSA9IHNkZXYtPnByb21fbmFtZTsKKworCQkJaWYgKCFzdHJjbXAobmFtZSwgIlNVTlcsaG1lIikpIHsKKwkJCQljYXJkcysrOworCQkJCXByb21fZ2V0c3RyaW5nKHNkZXYtPnByb21fbm9kZSwgIm1vZGVsIiwKKwkJCQkJICAgICAgIG1vZGVsLCBzaXplb2YobW9kZWwpKTsKKwkJCQlpZiAoIXN0cmNtcChtb2RlbCwgIlNVTlcsc2J1cy1xZmUiKSkKKwkJCQkJaGFwcHlfbWVhbF9zYnVzX2luaXQoc2RldiwgMSk7CisJCQkJZWxzZQorCQkJCQloYXBweV9tZWFsX3NidXNfaW5pdChzZGV2LCAwKTsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAicWZlIikgfHwKKwkJCQkgICAhc3RyY21wKG5hbWUsICJTVU5XLHFmZSIpKSB7CisJCQkJY2FyZHMrKzsKKwkJCQloYXBweV9tZWFsX3NidXNfaW5pdChzZGV2LCAxKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoY2FyZHMgIT0gMCkKKwkJcXVhdHRyb19zYnVzX3JlZ2lzdGVyX2lycXMoKTsKKwlyZXR1cm4gY2FyZHM7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBpbnQgX19pbml0IGhhcHB5X21lYWxfcGNpX3Byb2JlKHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCWludCBjYXJkcyA9IDA7CisKKwl3aGlsZSAoKHBkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9TVU4sCisJCQkJICAgICAgIFBDSV9ERVZJQ0VfSURfU1VOX0hBUFBZTUVBTCwgcGRldikpICE9IE5VTEwpIHsKKwkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQkJY29udGludWU7CisJCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCQljYXJkcysrOworCQloYXBweV9tZWFsX3BjaV9pbml0KHBkZXYpOworCX0KKwlyZXR1cm4gY2FyZHM7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgaGFwcHlfbWVhbF9wcm9iZSh2b2lkKQoreworCXN0YXRpYyBpbnQgY2FsbGVkID0gMDsKKwlpbnQgY2FyZHM7CisKKwlyb290X2hhcHB5X2RldiA9IE5VTEw7CisKKwlpZiAoY2FsbGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKwljYWxsZWQrKzsKKworCWNhcmRzID0gMDsKKyNpZmRlZiBDT05GSUdfU0JVUworCWNhcmRzICs9IGhhcHB5X21lYWxfc2J1c19wcm9iZSgpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1BDSQorCWNhcmRzICs9IGhhcHB5X21lYWxfcGNpX3Byb2JlKCk7CisjZW5kaWYKKwlpZiAoIWNhcmRzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgaGFwcHlfbWVhbF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworI2lmZGVmIENPTkZJR19TQlVTCisJc3RydWN0IHF1YXR0cm8gKmxhc3Rfc2Vlbl9xZmUgPSBOVUxMOworI2VuZGlmCisKKwl3aGlsZSAocm9vdF9oYXBweV9kZXYpIHsKKwkJc3RydWN0IGhhcHB5X21lYWwgKmhwID0gcm9vdF9oYXBweV9kZXY7CisJCXN0cnVjdCBoYXBweV9tZWFsICpuZXh0ID0gcm9vdF9oYXBweV9kZXYtPm5leHRfbW9kdWxlOworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaHAtPmRldjsKKworCQkvKiBVbnJlZ2lzdGVyIG5ldGRldiBiZWZvcmUgdW5tYXBwaW5nIHJlZ2lzdGVycyBhcyB0aGlzCisJCSAqIGNhbGwgY2FuIGVuZCB1cCB0cnlpbmcgdG8gYWNjZXNzIHRob3NlIHJlZ2lzdGVycy4KKwkJICovCisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKyNpZmRlZiBDT05GSUdfU0JVUworCQlpZiAoIShocC0+aGFwcHlfZmxhZ3MgJiBIRkxBR19QQ0kpKSB7CisJCQlpZiAoaHAtPmhhcHB5X2ZsYWdzICYgSEZMQUdfUVVBVFRSTykgeworCQkJCWlmIChocC0+cWZlX3BhcmVudCAhPSBsYXN0X3NlZW5fcWZlKSB7CisJCQkJCWZyZWVfaXJxKGRldi0+aXJxLCBocC0+cWZlX3BhcmVudCk7CisJCQkJCWxhc3Rfc2Vlbl9xZmUgPSBocC0+cWZlX3BhcmVudDsKKwkJCQl9CisJCQl9CisKKwkJCXNidXNfaW91bm1hcChocC0+Z3JlZ3MsIEdSRUdfUkVHX1NJWkUpOworCQkJc2J1c19pb3VubWFwKGhwLT5ldHhyZWdzLCBFVFhfUkVHX1NJWkUpOworCQkJc2J1c19pb3VubWFwKGhwLT5lcnhyZWdzLCBFUlhfUkVHX1NJWkUpOworCQkJc2J1c19pb3VubWFwKGhwLT5iaWdtYWNyZWdzLCBCTUFDX1JFR19TSVpFKTsKKwkJCXNidXNfaW91bm1hcChocC0+dGN2cmVncywgVENWUl9SRUdfU0laRSk7CisJCQlzYnVzX2ZyZWVfY29uc2lzdGVudChocC0+aGFwcHlfZGV2LAorCQkJCQkgICAgIFBBR0VfU0laRSwKKwkJCQkJICAgICBocC0+aGFwcHlfYmxvY2ssCisJCQkJCSAgICAgaHAtPmhibG9ja19kdm1hKTsKKwkJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX1BDSQorCQlpZiAoKGhwLT5oYXBweV9mbGFncyAmIEhGTEFHX1BDSSkpIHsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaHAtPmhhcHB5X2RldiwKKwkJCQkJICAgIFBBR0VfU0laRSwKKwkJCQkJICAgIGhwLT5oYXBweV9ibG9jaywKKwkJCQkJICAgIGhwLT5oYmxvY2tfZHZtYSk7CisJCQlpb3VubWFwKGhwLT5ncmVncyk7CisJCQlwY2lfcmVsZWFzZV9yZWdpb25zKGhwLT5oYXBweV9kZXYpOworCQl9CisjZW5kaWYKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKworCQlyb290X2hhcHB5X2RldiA9IG5leHQ7CisJfQorCisJLyogTm93IGNsZWFudXAgdGhlIHF1YXR0cm8gbGlzdHMuICovCisjaWZkZWYgQ09ORklHX1NCVVMKKwl3aGlsZSAocWZlX3NidXNfbGlzdCkgeworCQlzdHJ1Y3QgcXVhdHRybyAqcWZlID0gcWZlX3NidXNfbGlzdDsKKwkJc3RydWN0IHF1YXR0cm8gKm5leHQgPSBxZmUtPm5leHQ7CisKKwkJa2ZyZWUocWZlKTsKKworCQlxZmVfc2J1c19saXN0ID0gbmV4dDsKKwl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUENJCisJd2hpbGUgKHFmZV9wY2lfbGlzdCkgeworCQlzdHJ1Y3QgcXVhdHRybyAqcWZlID0gcWZlX3BjaV9saXN0OworCQlzdHJ1Y3QgcXVhdHRybyAqbmV4dCA9IHFmZS0+bmV4dDsKKworCQlrZnJlZShxZmUpOworCisJCXFmZV9wY2lfbGlzdCA9IG5leHQ7CisJfQorI2VuZGlmCit9CisKK21vZHVsZV9pbml0KGhhcHB5X21lYWxfcHJvYmUpOworbW9kdWxlX2V4aXQoaGFwcHlfbWVhbF9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5obWUuaCBiL2RyaXZlcnMvbmV0L3N1bmhtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZTlmOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdW5obWUuaApAQCAtMCwwICsxLDUxNSBAQAorLyogJElkOiBzdW5obWUuaCx2IDEuMzMgMjAwMS8wOC8wMyAwNjoyMzowNCBkYXZlbSBFeHAgJAorICogc3VuaG1lLmg6IERlZmluaXRpb25zIGZvciBTcGFyYyBITUUvQmlnTWFjIDEwLzEwMGJhc2VUIGV0aGVybmV0IGRyaXZlci4KKyAqICAgICAgICAgICBBbHNvIGtub3duIGFzIHRoZSAiSGFwcHkgTWVhbCIuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqLworCisjaWZuZGVmIF9TVU5ITUVfSAorI2RlZmluZSBfU1VOSE1FX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisvKiBIYXBweSBNZWFsIGdsb2JhbCByZWdpc3RlcnMuICovCisjZGVmaW5lIEdSRUdfU1dSRVNFVAkweDAwMFVMCS8qIFNvZnR3YXJlIFJlc2V0ICAqLworI2RlZmluZSBHUkVHX0NGRwkweDAwNFVMCS8qIENvbmZpZyBSZWdpc3RlciAqLworI2RlZmluZSBHUkVHX1NUQVQJMHgxMDhVTAkvKiBTdGF0dXMgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19JTUFTSwkweDEwY1VMCS8qIEludGVycnVwdCBNYXNrICAqLworI2RlZmluZSBHUkVHX1JFR19TSVpFCTB4MTEwVUwKKworLyogR2xvYmFsIHJlc2V0IHJlZ2lzdGVyLiAqLworI2RlZmluZSBHUkVHX1JFU0VUX0VUWCAgICAgICAgIDB4MDEKKyNkZWZpbmUgR1JFR19SRVNFVF9FUlggICAgICAgICAweDAyCisjZGVmaW5lIEdSRUdfUkVTRVRfQUxMICAgICAgICAgMHgwMworCisvKiBHbG9iYWwgY29uZmlnIHJlZ2lzdGVyLiAqLworI2RlZmluZSBHUkVHX0NGR19CVVJTVE1TSyAgICAgIDB4MDMKKyNkZWZpbmUgR1JFR19DRkdfQlVSU1QxNiAgICAgICAweDAwCisjZGVmaW5lIEdSRUdfQ0ZHX0JVUlNUMzIgICAgICAgMHgwMQorI2RlZmluZSBHUkVHX0NGR19CVVJTVDY0ICAgICAgIDB4MDIKKyNkZWZpbmUgR1JFR19DRkdfNjRCSVQgICAgICAgICAweDA0CisjZGVmaW5lIEdSRUdfQ0ZHX1BBUklUWSAgICAgICAgMHgwOAorI2RlZmluZSBHUkVHX0NGR19SRVNWICAgICAgICAgIDB4MTAKKworLyogR2xvYmFsIHN0YXR1cyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgR1JFR19TVEFUX0dPVEZSQU1FICAgICAweDAwMDAwMDAxIC8qIFJlY2VpdmVkIGEgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX1JDTlRFWFAgICAgICAweDAwMDAwMDAyIC8qIFJlY2VpdmUgZnJhbWUgY291bnRlciBleHBpcmVkICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX0FDTlRFWFAgICAgICAweDAwMDAwMDA0IC8qIEFsaWduLWVycm9yIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX0NDTlRFWFAgICAgICAweDAwMDAwMDA4IC8qIENSQy1lcnJvciBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX0xDTlRFWFAgICAgICAweDAwMDAwMDEwIC8qIExlbmd0aC1lcnJvciBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX1JGSUZPVkYgICAgICAweDAwMDAwMDIwIC8qIFJlY2VpdmUgRklGTyBvdmVyZmxvdyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX0NWQ05URVhQICAgICAweDAwMDAwMDQwIC8qIENvZGUtdmlvbGF0aW9uIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX1NUU1RFUlIgICAgICAweDAwMDAwMDgwIC8qIFRlc3QgZXJyb3IgaW4gWElGIGZvciBTUUUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX1NFTlRGUkFNRSAgICAweDAwMDAwMTAwIC8qIFRyYW5zbWl0dGVkIGEgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX1RGSUZPX1VORCAgICAweDAwMDAwMjAwIC8qIFRyYW5zbWl0IEZJRk8gdW5kZXJydW4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX01BWFBLVEVSUiAgICAweDAwMDAwNDAwIC8qIE1heC1wYWNrZXQgc2l6ZSBlcnJvciAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX05DTlRFWFAgICAgICAweDAwMDAwODAwIC8qIE5vcm1hbC1jb2xsaXNpb24gY291bnRlciBleHBpcmVkICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX0VDTlRFWFAgICAgICAweDAwMDAxMDAwIC8qIEV4Y2Vzcy1jb2xsaXNpb24gY291bnRlciBleHBpcmVkICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX0xDQ05URVhQICAgICAweDAwMDAyMDAwIC8qIExhdGUtY29sbGlzaW9uIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX0ZDTlRFWFAgICAgICAweDAwMDA0MDAwIC8qIEZpcnN0LWNvbGxpc2lvbiBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX0RUSU1FWFAgICAgICAweDAwMDA4MDAwIC8qIERlZmVyLXRpbWVyIGV4cGlyZWQgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX1JYVE9IT1NUICAgICAweDAwMDEwMDAwIC8qIE1vdmVkIGZyb20gcmVjZWl2ZS1GSUZPIHRvIGhvc3QgbWVtb3J5ICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX05PUlhEICAgICAgICAweDAwMDIwMDAwIC8qIE5vIG1vcmUgcmVjZWl2ZSBkZXNjcmlwdG9ycyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX1JYRVJSICAgICAgICAweDAwMDQwMDAwIC8qIEVycm9yIGR1cmluZyByZWNlaXZlIGRtYSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX1JYTEFURVJSICAgICAweDAwMDgwMDAwIC8qIExhdGUgZXJyb3IgZHVyaW5nIHJlY2VpdmUgZG1hICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX1JYUEVSUiAgICAgICAweDAwMTAwMDAwIC8qIFBhcml0eSBlcnJvciBkdXJpbmcgcmVjZWl2ZSBkbWEgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX1JYVEVSUiAgICAgICAweDAwMjAwMDAwIC8qIFRhZyBlcnJvciBkdXJpbmcgcmVjZWl2ZSBkbWEgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX0VPUEVSUiAgICAgICAweDAwNDAwMDAwIC8qIFRyYW5zbWl0IGRlc2NyaXB0b3IgZGlkIG5vdCBoYXZlIEVPUCBzZXQgKi8KKyNkZWZpbmUgR1JFR19TVEFUX01JRklSUSAgICAgICAweDAwODAwMDAwIC8qIE1JRiBpcyBzaWduYWxpbmcgYW4gaW50ZXJydXB0IGNvbmRpdGlvbiAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX0hPU1RUT1RYICAgICAweDAxMDAwMDAwIC8qIE1vdmVkIGZyb20gaG9zdCBtZW1vcnkgdG8gdHJhbnNtaXQtRklGTyAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX1RYQUxMICAgICAgICAweDAyMDAwMDAwIC8qIFRyYW5zbWl0dGVkIGFsbCBwYWNrZXRzIGluIHRoZSB0eC1maWZvICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX1RYRUFDSyAgICAgICAweDA0MDAwMDAwIC8qIEVycm9yIGR1cmluZyB0cmFuc21pdCBkbWEgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX1RYTEVSUiAgICAgICAweDA4MDAwMDAwIC8qIExhdGUgZXJyb3IgZHVyaW5nIHRyYW5zbWl0IGRtYSAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX1RYUEVSUiAgICAgICAweDEwMDAwMDAwIC8qIFBhcml0eSBlcnJvciBkdXJpbmcgdHJhbnNtaXQgZG1hICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX1RYVEVSUiAgICAgICAweDIwMDAwMDAwIC8qIFRhZyBlcnJvciBkdXJpbmcgdHJhbnNtaXQgZG1hICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX1NMVkVSUiAgICAgICAweDQwMDAwMDAwIC8qIFBJTyBhY2Nlc3MgZ290IGFuIGVycm9yICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR1JFR19TVEFUX1NMVlBFUlIgICAgICAweDgwMDAwMDAwIC8qIFBJTyBhY2Nlc3MgZ290IGEgcGFyaXR5IGVycm9yICAgICAgICAgICAgKi8KKworLyogQWxsIGludGVyZXN0aW5nIGVycm9yIGNvbmRpdGlvbnMuICovCisjZGVmaW5lIEdSRUdfU1RBVF9FUlJPUlMgICAgICAgMHhmYzdlZmVmYworCisvKiBHbG9iYWwgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIuICovCisjZGVmaW5lIEdSRUdfSU1BU0tfR09URlJBTUUgICAgMHgwMDAwMDAwMSAvKiBSZWNlaXZlZCBhIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfUkNOVEVYUCAgICAgMHgwMDAwMDAwMiAvKiBSZWNlaXZlIGZyYW1lIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfQUNOVEVYUCAgICAgMHgwMDAwMDAwNCAvKiBBbGlnbi1lcnJvciBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfQ0NOVEVYUCAgICAgMHgwMDAwMDAwOCAvKiBDUkMtZXJyb3IgY291bnRlciBleHBpcmVkICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfTENOVEVYUCAgICAgMHgwMDAwMDAxMCAvKiBMZW5ndGgtZXJyb3IgY291bnRlciBleHBpcmVkICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfUkZJRk9WRiAgICAgMHgwMDAwMDAyMCAvKiBSZWNlaXZlIEZJRk8gb3ZlcmZsb3cgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfQ1ZDTlRFWFAgICAgMHgwMDAwMDA0MCAvKiBDb2RlLXZpb2xhdGlvbiBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfU1RTVEVSUiAgICAgMHgwMDAwMDA4MCAvKiBUZXN0IGVycm9yIGluIFhJRiBmb3IgU1FFICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfU0VOVEZSQU1FICAgMHgwMDAwMDEwMCAvKiBUcmFuc21pdHRlZCBhIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfVEZJRk9fVU5EICAgMHgwMDAwMDIwMCAvKiBUcmFuc21pdCBGSUZPIHVuZGVycnVuICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfTUFYUEtURVJSICAgMHgwMDAwMDQwMCAvKiBNYXgtcGFja2V0IHNpemUgZXJyb3IgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfTkNOVEVYUCAgICAgMHgwMDAwMDgwMCAvKiBOb3JtYWwtY29sbGlzaW9uIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfRUNOVEVYUCAgICAgMHgwMDAwMTAwMCAvKiBFeGNlc3MtY29sbGlzaW9uIGNvdW50ZXIgZXhwaXJlZCAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfTENDTlRFWFAgICAgMHgwMDAwMjAwMCAvKiBMYXRlLWNvbGxpc2lvbiBjb3VudGVyIGV4cGlyZWQgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfRkNOVEVYUCAgICAgMHgwMDAwNDAwMCAvKiBGaXJzdC1jb2xsaXNpb24gY291bnRlciBleHBpcmVkICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfRFRJTUVYUCAgICAgMHgwMDAwODAwMCAvKiBEZWZlci10aW1lciBleHBpcmVkICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfUlhUT0hPU1QgICAgMHgwMDAxMDAwMCAvKiBNb3ZlZCBmcm9tIHJlY2VpdmUtRklGTyB0byBob3N0IG1lbW9yeSAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfTk9SWEQgICAgICAgMHgwMDAyMDAwMCAvKiBObyBtb3JlIHJlY2VpdmUgZGVzY3JpcHRvcnMgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfUlhFUlIgICAgICAgMHgwMDA0MDAwMCAvKiBFcnJvciBkdXJpbmcgcmVjZWl2ZSBkbWEgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfUlhMQVRFUlIgICAgMHgwMDA4MDAwMCAvKiBMYXRlIGVycm9yIGR1cmluZyByZWNlaXZlIGRtYSAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfUlhQRVJSICAgICAgMHgwMDEwMDAwMCAvKiBQYXJpdHkgZXJyb3IgZHVyaW5nIHJlY2VpdmUgZG1hICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfUlhURVJSICAgICAgMHgwMDIwMDAwMCAvKiBUYWcgZXJyb3IgZHVyaW5nIHJlY2VpdmUgZG1hICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfRU9QRVJSICAgICAgMHgwMDQwMDAwMCAvKiBUcmFuc21pdCBkZXNjcmlwdG9yIGRpZCBub3QgaGF2ZSBFT1Agc2V0ICovCisjZGVmaW5lIEdSRUdfSU1BU0tfTUlGSVJRICAgICAgMHgwMDgwMDAwMCAvKiBNSUYgaXMgc2lnbmFsaW5nIGFuIGludGVycnVwdCBjb25kaXRpb24gICovCisjZGVmaW5lIEdSRUdfSU1BU0tfSE9TVFRPVFggICAgMHgwMTAwMDAwMCAvKiBNb3ZlZCBmcm9tIGhvc3QgbWVtb3J5IHRvIHRyYW5zbWl0LUZJRk8gICovCisjZGVmaW5lIEdSRUdfSU1BU0tfVFhBTEwgICAgICAgMHgwMjAwMDAwMCAvKiBUcmFuc21pdHRlZCBhbGwgcGFja2V0cyBpbiB0aGUgdHgtZmlmbyAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfVFhFQUNLICAgICAgMHgwNDAwMDAwMCAvKiBFcnJvciBkdXJpbmcgdHJhbnNtaXQgZG1hICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfVFhMRVJSICAgICAgMHgwODAwMDAwMCAvKiBMYXRlIGVycm9yIGR1cmluZyB0cmFuc21pdCBkbWEgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfVFhQRVJSICAgICAgMHgxMDAwMDAwMCAvKiBQYXJpdHkgZXJyb3IgZHVyaW5nIHRyYW5zbWl0IGRtYSAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfVFhURVJSICAgICAgMHgyMDAwMDAwMCAvKiBUYWcgZXJyb3IgZHVyaW5nIHRyYW5zbWl0IGRtYSAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfU0xWRVJSICAgICAgMHg0MDAwMDAwMCAvKiBQSU8gYWNjZXNzIGdvdCBhbiBlcnJvciAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEdSRUdfSU1BU0tfU0xWUEVSUiAgICAgMHg4MDAwMDAwMCAvKiBQSU8gYWNjZXNzIGdvdCBhIHBhcml0eSBlcnJvciAgICAgICAgICAgICovCisKKy8qIEhhcHB5IE1lYWwgZXh0ZXJuYWwgdHJhbnNtaXR0ZXIgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBFVFhfUEVORElORwkweDAwVUwJLyogVHJhbnNtaXQgcGVuZGluZy93YWtldXAgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVRYX0NGRwkJMHgwNFVMCS8qIFRyYW5zbWl0IGNvbmZpZyByZWdpc3RlciAgICAgICAgICovCisjZGVmaW5lIEVUWF9SSU5HCTB4MDhVTAkvKiBUcmFuc21pdCByaW5nIHBvaW50ZXIgICAgICAgICAgICAqLworI2RlZmluZSBFVFhfQkJBU0UJMHgwY1VMCS8qIFRyYW5zbWl0IGJ1ZmZlciBiYXNlICAgICAgICAgICAgICovCisjZGVmaW5lIEVUWF9CRElTUAkweDEwVUwJLyogVHJhbnNtaXQgYnVmZmVyIGRpc3BsYWNlbWVudCAgICAgKi8KKyNkZWZpbmUgRVRYX0ZJRk9XUFRSCTB4MTRVTAkvKiBGSUZPIHdyaXRlIHB0ciAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFVFhfRklGT1NXUFRSCTB4MThVTAkvKiBGSUZPIHdyaXRlIHB0ciAoc2hhZG93IHJlZ2lzdGVyKSAqLworI2RlZmluZSBFVFhfRklGT1JQVFIJMHgxY1VMCS8qIEZJRk8gcmVhZCBwdHIgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVUWF9GSUZPU1JQVFIJMHgyMFVMCS8qIEZJRk8gcmVhZCBwdHIgKHNoYWRvdyByZWdpc3RlcikgICovCisjZGVmaW5lIEVUWF9GSUZPUENOVAkweDI0VUwJLyogRklGTyBwYWNrZXQgY291bnRlciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVRYX1NNQUNISU5FCTB4MjhVTAkvKiBUcmFuc21pdHRlciBzdGF0ZSBtYWNoaW5lICAgICAgICAqLworI2RlZmluZSBFVFhfUlNJWkUJMHgyY1VMCS8qIFJpbmcgZGVzY3JpcHRvciBzaXplICAgICAgICAgICAgICovCisjZGVmaW5lIEVUWF9CUFRSCTB4MzBVTAkvKiBUcmFuc21pdCBkYXRhIGJ1ZmZlciBwdHIgICAgICAgICAqLworI2RlZmluZSBFVFhfUkVHX1NJWkUJMHgzNFVMCisKKy8qIEVUWCB0cmFuc21pdCBwZW5kaW5nIHJlZ2lzdGVyLiAqLworI2RlZmluZSBFVFhfVFBfRE1BV0FLRVVQICAgICAgICAgMHgwMDAwMDAwMSAvKiBSZXN0YXJ0IHRyYW5zbWl0IGRtYSAgICAgICAgICAgICAqLworCisvKiBFVFggY29uZmlnIHJlZ2lzdGVyLiAqLworI2RlZmluZSBFVFhfQ0ZHX0RNQUVOQUJMRSAgICAgICAgMHgwMDAwMDAwMSAvKiBFbmFibGUgdHJhbnNtaXQgZG1hICAgICAgICAgICAgICAqLworI2RlZmluZSBFVFhfQ0ZHX0ZJRk9USFJFU0ggICAgICAgMHgwMDAwMDNmZSAvKiBUcmFuc21pdCBGSUZPIHRocmVzaG9sZCAgICAgICAgICAqLworI2RlZmluZSBFVFhfQ0ZHX0lSUURBRlRFUiAgICAgICAgMHgwMDAwMDQwMCAvKiBJbnRlcnJ1cHQgYWZ0ZXIgVFgtRklGTyBkcmFpbmVkICAqLworI2RlZmluZSBFVFhfQ0ZHX0lSUURCRUZPUkUgICAgICAgMHgwMDAwMDAwMCAvKiBJbnRlcnJ1cHQgYmVmb3JlIFRYLUZJRk8gZHJhaW5lZCAqLworCisjZGVmaW5lIEVUWF9SU0laRV9TSElGVCAgICAgICAgICA0CisKKy8qIEhhcHB5IE1lYWwgZXh0ZXJuYWwgcmVjZWl2ZXIgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBFUlhfQ0ZHCQkweDAwVUwJLyogUmVjZWl2ZXIgY29uZmlnIHJlZ2lzdGVyICAgICAgICAgKi8KKyNkZWZpbmUgRVJYX1JJTkcJMHgwNFVMCS8qIFJlY2VpdmVyIHJpbmcgcHRyICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVSWF9CUFRSCTB4MDhVTAkvKiBSZWNlaXZlciBidWZmZXIgcHRyICAgICAgICAgICAgICAqLworI2RlZmluZSBFUlhfRklGT1dQVFIJMHgwY1VMCS8qIEZJRk8gd3JpdGUgcHRyICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVSWF9GSUZPU1dQVFIJMHgxMFVMCS8qIEZJRk8gd3JpdGUgcHRyIChzaGFkb3cgcmVnaXN0ZXIpICovCisjZGVmaW5lIEVSWF9GSUZPUlBUUgkweDE0VUwJLyogRklGTyByZWFkIHB0ciAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVJYX0ZJRk9TUlBUUgkweDE4VUwJLyogRklGTyByZWFkIHB0ciAoc2hhZG93IHJlZ2lzdGVyKSAgKi8KKyNkZWZpbmUgRVJYX1NNQUNISU5FCTB4MWNVTAkvKiBSZWNlaXZlciBzdGF0ZSBtYWNoaW5lICAgICAgICAgICAqLworI2RlZmluZSBFUlhfUkVHX1NJWkUJMHgyMFVMCisKKy8qIEVSWCBjb25maWcgcmVnaXN0ZXIuICovCisjZGVmaW5lIEVSWF9DRkdfRE1BRU5BQkxFICAgIDB4MDAwMDAwMDEgLyogRW5hYmxlIHJlY2VpdmUgRE1BICAgICAgICAqLworI2RlZmluZSBFUlhfQ0ZHX1JFU1YxICAgICAgICAweDAwMDAwMDA2IC8qIFVudXNlZC4uLiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVJYX0NGR19CWVRFT0ZGU0VUICAgMHgwMDAwMDAzOCAvKiBSZWNlaXZlIGZpcnN0IGJ5dGUgb2Zmc2V0ICovCisjZGVmaW5lIEVSWF9DRkdfUkVTVjIgICAgICAgIDB4MDAwMDAxYzAgLyogVW51c2VkLi4uICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBFUlhfQ0ZHX1NJWkUzMiAgICAgICAweDAwMDAwMDAwIC8qIFJlY2VpdmUgcmluZyBzaXplID09IDMyICAgKi8KKyNkZWZpbmUgRVJYX0NGR19TSVpFNjQgICAgICAgMHgwMDAwMDIwMCAvKiBSZWNlaXZlIHJpbmcgc2l6ZSA9PSA2NCAgICovCisjZGVmaW5lIEVSWF9DRkdfU0laRTEyOCAgICAgIDB4MDAwMDA0MDAgLyogUmVjZWl2ZSByaW5nIHNpemUgPT0gMTI4ICAqLworI2RlZmluZSBFUlhfQ0ZHX1NJWkUyNTYgICAgICAweDAwMDAwNjAwIC8qIFJlY2VpdmUgcmluZyBzaXplID09IDI1NiAgKi8KKyNkZWZpbmUgRVJYX0NGR19SRVNWMyAgICAgICAgMHgwMDAwZjgwMCAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEVSWF9DRkdfQ1NVTVNUQVJUICAgIDB4MDA3ZjAwMDAgLyogT2Zmc2V0IG9mIGNoZWNrc3VtIHN0YXJ0LAorCQkJCQkgKiBpbiBoYWxmd29yZHMuICovCisKKy8qIEknZCBsaWtlIGEgQmlnIE1hYywgc21hbGwgZnJpZXMsIHNtYWxsIGNva2UsIGFuZCBTcGFyY0xpbnV4IHBsZWFzZS4gKi8KKyNkZWZpbmUgQk1BQ19YSUZDRkcJMHgwMDAwVUwJLyogWElGIGNvbmZpZyByZWdpc3RlciAgICAgICAgICAgICAgICAqLworCS8qIDB4NC0tPjB4MjA0LCByZXNlcnZlZCAqLworI2RlZmluZSBCTUFDX1RYU1dSRVNFVAkweDIwOFVMCS8qIFRyYW5zbWl0dGVyIHNvZnR3YXJlIHJlc2V0ICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19UWENGRwkweDIwY1VMCS8qIFRyYW5zbWl0dGVyIGNvbmZpZyByZWdpc3RlciAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19JR0FQMQkweDIxMFVMCS8qIEludGVyLXBhY2tldCBnYXAgMSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19JR0FQMgkweDIxNFVMCS8qIEludGVyLXBhY2tldCBnYXAgMiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19BTElNSVQJMHgyMThVTAkvKiBUcmFuc21pdCBhdHRlbXB0IGxpbWl0ICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfU1RJTUUJMHgyMWNVTAkvKiBUcmFuc21pdCBzbG90IHRpbWUgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfUExFTgkweDIyMFVMCS8qIFNpemUgb2YgdHJhbnNtaXQgcHJlYW1ibGUgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19QUEFUCTB4MjI0VUwJLyogUGF0dGVybiBmb3IgdHJhbnNtaXQgcHJlYW1ibGUgICAgICAqLworI2RlZmluZSBCTUFDX1RYU0RFTElNCTB4MjI4VUwJLyogVHJhbnNtaXQgZGVsaW1pdGVyICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0pTSVpFCTB4MjJjVUwJLyogSmFtIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1RYTUFYCTB4MjMwVUwJLyogVHJhbnNtaXQgbWF4IHBrdCBzaXplICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1RYTUlOCTB4MjM0VUwJLyogVHJhbnNtaXQgbWluIHBrdCBzaXplICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1BBVFRFTVBUCTB4MjM4VUwJLyogQ291bnQgb2YgdHJhbnNtaXQgcGVhayBhdHRlbXB0cyAgICAqLworI2RlZmluZSBCTUFDX0RUQ1RSCTB4MjNjVUwJLyogVHJhbnNtaXQgZGVmZXIgdGltZXIgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX05DQ1RSCTB4MjQwVUwJLyogVHJhbnNtaXQgbm9ybWFsLWNvbGxpc2lvbiBjb3VudGVyICAqLworI2RlZmluZSBCTUFDX0ZDQ1RSCTB4MjQ0VUwJLyogVHJhbnNtaXQgZmlyc3QtY29sbGlzaW9uIGNvdW50ZXIgICAqLworI2RlZmluZSBCTUFDX0VYQ1RSCTB4MjQ4VUwJLyogVHJhbnNtaXQgZXhjZXNzLWNvbGxpc2lvbiBjb3VudGVyICAqLworI2RlZmluZSBCTUFDX0xUQ1RSCTB4MjRjVUwJLyogVHJhbnNtaXQgbGF0ZS1jb2xsaXNpb24gY291bnRlciAgICAqLworI2RlZmluZSBCTUFDX1JTRUVECTB4MjUwVUwJLyogVHJhbnNtaXQgcmFuZG9tIG51bWJlciBzZWVkICAgICAgICAqLworI2RlZmluZSBCTUFDX1RYU01BQ0hJTkUJMHgyNTRVTAkvKiBUcmFuc21pdCBzdGF0ZSBtYWNoaW5lICAgICAgICAgICAgICovCisJLyogMHgyNTgtLT4weDMwNCwgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQk1BQ19SWFNXUkVTRVQJMHgzMDhVTAkvKiBSZWNlaXZlciBzb2Z0d2FyZSByZXNldCAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfUlhDRkcJMHgzMGNVTAkvKiBSZWNlaXZlciBjb25maWcgcmVnaXN0ZXIgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfUlhNQVgJMHgzMTBVTAkvKiBSZWNlaXZlIG1heCBwa3Qgc2l6ZSAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfUlhNSU4JMHgzMTRVTAkvKiBSZWNlaXZlIG1pbiBwa3Qgc2l6ZSAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfTUFDQUREUjIJMHgzMThVTAkvKiBFdGhlciBhZGRyZXNzIHJlZ2lzdGVyIDIgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfTUFDQUREUjEJMHgzMWNVTAkvKiBFdGhlciBhZGRyZXNzIHJlZ2lzdGVyIDEgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfTUFDQUREUjAJMHgzMjBVTAkvKiBFdGhlciBhZGRyZXNzIHJlZ2lzdGVyIDAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfRlJDVFIJMHgzMjRVTAkvKiBSZWNlaXZlIGZyYW1lIHJlY2VpdmUgY291bnRlciAgICAgICovCisjZGVmaW5lIEJNQUNfR0xFQ1RSCTB4MzI4VUwJLyogUmVjZWl2ZSBnaWFudC1sZW5ndGggZXJyb3IgY291bnRlciAqLworI2RlZmluZSBCTUFDX1VOQUxFQ1RSCTB4MzJjVUwJLyogUmVjZWl2ZSB1bmFsaWduZWQgZXJyb3IgY291bnRlciAgICAqLworI2RlZmluZSBCTUFDX1JDUkNFQ1RSCTB4MzMwVUwJLyogUmVjZWl2ZSBDUkMgZXJyb3IgY291bnRlciAgICAgICAgICAqLworI2RlZmluZSBCTUFDX1JYU01BQ0hJTkUJMHgzMzRVTAkvKiBSZWNlaXZlciBzdGF0ZSBtYWNoaW5lICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfUlhDVkFMSUQJMHgzMzhVTAkvKiBSZWNlaXZlciBjb2RlIHZpb2xhdGlvbiAgICAgICAgICAgICovCisJLyogMHgzM2MsIHJlc2VydmVkICovCisjZGVmaW5lIEJNQUNfSFRBQkxFMwkweDM0MFVMCS8qIEhhc2ggdGFibGUgMyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19IVEFCTEUyCTB4MzQ0VUwJLyogSGFzaCB0YWJsZSAyICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTUFDX0hUQUJMRTEJMHgzNDhVTAkvKiBIYXNoIHRhYmxlIDEgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfSFRBQkxFMAkweDM0Y1VMCS8qIEhhc2ggdGFibGUgMCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19BRklMVEVSMgkweDM1MFVMCS8qIEFkZHJlc3MgZmlsdGVyIDIgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19BRklMVEVSMQkweDM1NFVMCS8qIEFkZHJlc3MgZmlsdGVyIDEgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19BRklMVEVSMAkweDM1OFVMCS8qIEFkZHJlc3MgZmlsdGVyIDAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQk1BQ19BRk1BU0sJMHgzNWNVTAkvKiBBZGRyZXNzIGZpbHRlciBtYXNrICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJNQUNfUkVHX1NJWkUJMHgzNjBVTAorCisvKiBCaWdNYWMgWElGIGNvbmZpZyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQklHTUFDX1hDRkdfT0RFTkFCTEUgIDB4MDAwMDAwMDEgLyogT3V0cHV0IGRyaXZlciBlbmFibGUgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfWENGR19YTEJBQ0sgICAgMHgwMDAwMDAwMiAvKiBMb29wYmFjay1tb2RlIFhJRiBlbmFibGUgICAgICovCisjZGVmaW5lIEJJR01BQ19YQ0ZHX01MQkFDSyAgICAweDAwMDAwMDA0IC8qIExvb3BiYWNrLW1vZGUgTUlJIGVuYWJsZSAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1hDRkdfTUlJRElTQUIgIDB4MDAwMDAwMDggLyogTUlJIHJlY2VpdmUgYnVmZmVyIGRpc2FibGUgICAqLworI2RlZmluZSBCSUdNQUNfWENGR19TUUVOQUJMRSAgMHgwMDAwMDAxMCAvKiBTUUUgdGVzdCBlbmFibGUgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19YQ0ZHX1NRRVRXSU4gICAweDAwMDAwM2UwIC8qIFNRRSB0aW1lIHdpbmRvdyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1hDRkdfTEFOQ0UgICAgIDB4MDAwMDAwMTAgLyogTGFuY2UgbW9kZSBlbmFibGUgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfWENGR19MSVBHMCAgICAgMHgwMDAwMDNlMCAvKiBMYW5jZSBtb2RlIElQRzAgICAgICAgICAgICAgICovCisKKy8qIEJpZ01hYyB0cmFuc21pdCBjb25maWcgcmVnaXN0ZXIuICovCisjZGVmaW5lIEJJR01BQ19UWENGR19FTkFCTEUgICAweDAwMDAwMDAxIC8qIEVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1RYQ0ZHX1NNT0RFICAgIDB4MDAwMDAwMjAgLyogRW5hYmxlIHNsb3cgdHJhbnNtaXQgbW9kZSAgICAqLworI2RlZmluZSBCSUdNQUNfVFhDRkdfQ0lHTiAgICAgMHgwMDAwMDA0MCAvKiBJZ25vcmUgdHJhbnNtaXQgY29sbGlzaW9ucyAgICovCisjZGVmaW5lIEJJR01BQ19UWENGR19GQ1NPRkYgICAweDAwMDAwMDgwIC8qIERvIG5vdCBlbWl0IEZDUyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1RYQ0ZHX0RCQUNLT0ZGIDB4MDAwMDAxMDAgLyogRGlzYWJsZSBiYWNrb2ZmICAgICAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfVFhDRkdfRlVMTERQTFggMHgwMDAwMDIwMCAvKiBFbmFibGUgZnVsbC1kdXBsZXggICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19UWENGR19ER0lWRVVQICAweDAwMDAwNDAwIC8qIERvbid0IGdpdmUgdXAgb24gdHJhbnNtaXRzICAgKi8KKworLyogQmlnTWFjIHJlY2VpdmUgY29uZmlnIHJlZ2lzdGVyLiAqLworI2RlZmluZSBCSUdNQUNfUlhDRkdfRU5BQkxFICAgMHgwMDAwMDAwMSAvKiBFbmFibGUgdGhlIHJlY2VpdmVyICAgICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19SWENGR19QU1RSSVAgICAweDAwMDAwMDIwIC8qIFBhZCBieXRlIHN0cmlwIGVuYWJsZSAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1JYQ0ZHX1BNSVNDICAgIDB4MDAwMDAwNDAgLyogRW5hYmxlIHByb21pc2NvdXMgbW9kZSAgICAgICAgICAqLworI2RlZmluZSBCSUdNQUNfUlhDRkdfREVSUiAgICAgMHgwMDAwMDA4MCAvKiBEaXNhYmxlIGVycm9yIGNoZWNraW5nICAgICAgICAgICovCisjZGVmaW5lIEJJR01BQ19SWENGR19EQ1JDUyAgICAweDAwMDAwMTAwIC8qIERpc2FibGUgQ1JDIHN0cmlwcGluZyAgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1JYQ0ZHX1JFSk1FICAgIDB4MDAwMDAyMDAgLyogUmVqZWN0IHBhY2tldHMgYWRkcmVzc2VkIHRvIG1lICAqLworI2RlZmluZSBCSUdNQUNfUlhDRkdfUEdSUCAgICAgMHgwMDAwMDQwMCAvKiBFbmFibGUgcHJvbWlzYyBncm91cCBtb2RlICAgICAgICovCisjZGVmaW5lIEJJR01BQ19SWENGR19IRU5BQkxFICAweDAwMDAwODAwIC8qIEVuYWJsZSB0aGUgaGFzaCBmaWx0ZXIgICAgICAgICAgKi8KKyNkZWZpbmUgQklHTUFDX1JYQ0ZHX0FFTkFCTEUgIDB4MDAwMDEwMDAgLyogRW5hYmxlIHRoZSBhZGRyZXNzIGZpbHRlciAgICAgICAqLworCisvKiBUaGVzZSBhcmUgdGhlICJNYW5hZ2VtZW50IEludGVyZmFjZSIgKGllLiBNSUYpIHJlZ2lzdGVycyBvZiB0aGUgdHJhbnNjZWl2ZXIuICovCisjZGVmaW5lIFRDVlJfQkJDTE9DSwkweDAwVUwJLyogQml0IGJhbmcgY2xvY2sgcmVnaXN0ZXIgICAgICAgICAgKi8KKyNkZWZpbmUgVENWUl9CQkRBVEEJMHgwNFVMCS8qIEJpdCBiYW5nIGRhdGEgcmVnaXN0ZXIgICAgICAgICAgICovCisjZGVmaW5lIFRDVlJfQkJPRU5BQgkweDA4VUwJLyogQml0IGJhbmcgb3V0cHV0IGVuYWJsZSAgICAgICAgICAgKi8KKyNkZWZpbmUgVENWUl9GUkFNRQkweDBjVUwJLyogRnJhbWUgY29udHJvbC9kYXRhIHJlZ2lzdGVyICAgICAgKi8KKyNkZWZpbmUgVENWUl9DRkcJMHgxMFVMCS8qIE1JRiBjb25maWcgcmVnaXN0ZXIgICAgICAgICAgICAgICovCisjZGVmaW5lIFRDVlJfSU1BU0sJMHgxNFVMCS8qIE1JRiBpbnRlcnJ1cHQgbWFzayAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRDVlJfU1RBVFVTCTB4MThVTAkvKiBNSUYgc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUQ1ZSX1NNQUNISU5FCTB4MWNVTAkvKiBNSUYgc3RhdGUgbWFjaGluZSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUQ1ZSX1JFR19TSVpFCTB4MjBVTAorCisvKiBGcmFtZSBjb21tYW5kcy4gKi8KKyNkZWZpbmUgRlJBTUVfV1JJVEUgICAgICAgICAgIDB4NTAwMjAwMDAKKyNkZWZpbmUgRlJBTUVfUkVBRCAgICAgICAgICAgIDB4NjAwMjAwMDAKKworLyogVHJhbnNjZWl2ZXIgY29uZmlnIHJlZ2lzdGVyICovCisjZGVmaW5lIFRDVl9DRkdfUFNFTEVDVCAgICAgICAweDAwMDAwMDAxIC8qIFNlbGVjdCBQSFkgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVENWX0NGR19QRU5BQkxFICAgICAgIDB4MDAwMDAwMDIgLyogRW5hYmxlIE1JRiBwb2xsaW5nICAgICAgICAgICAgICAqLworI2RlZmluZSBUQ1ZfQ0ZHX0JFTkFCTEUgICAgICAgMHgwMDAwMDAwNCAvKiBFbmFibGUgdGhlICJiaXQgYmFuZ2VyIiBvaCBiYWJ5ICovCisjZGVmaW5lIFRDVl9DRkdfUFJFR0FERFIgICAgICAweDAwMDAwMGY4IC8qIEFkZHJlc3Mgb2YgcG9sbCByZWdpc3RlciAgICAgICAgKi8KKyNkZWZpbmUgVENWX0NGR19NRElPMCAgICAgICAgIDB4MDAwMDAxMDAgLyogTURJTyB6ZXJvLCBkYXRhL2F0dGFjaGVkICAgICAgICAqLworI2RlZmluZSBUQ1ZfQ0ZHX01ESU8xICAgICAgICAgMHgwMDAwMDIwMCAvKiBNRElPIG9uZSwgIGRhdGEvYXR0YWNoZWQgICAgICAgICovCisjZGVmaW5lIFRDVl9DRkdfUERBRERSICAgICAgICAweDAwMDA3YzAwIC8qIERldmljZSBQSFkgYWRkcmVzcyBwb2xsaW5nICAgICAgKi8KKworLyogSGVyZSBhcmUgc29tZSBQSFkgYWRkcmVzc2VzLiAqLworI2RlZmluZSBUQ1ZfUEFERFJfRVRYICAgICAgICAgMCAgICAgICAgICAvKiBJbnRlcm5hbCB0cmFuc2NlaXZlciAgICAgICAgICAgICovCisjZGVmaW5lIFRDVl9QQUREUl9JVFggICAgICAgICAxICAgICAgICAgIC8qIEV4dGVybmFsIHRyYW5zY2VpdmVyICAgICAgICAgICAgKi8KKworLyogVHJhbnNjZWl2ZXIgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIFRDVl9TVEFUX0JBU0lDICAgICAgICAweGZmZmYwMDAwIC8qIFRoZSAiYmFzaWMiIHBhcnQgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVENWX1NUQVRfTk9STUFMICAgICAgIDB4MDAwMGZmZmYgLyogVGhlICJub24tYmFzaWMiIHBhcnQgICAgICAgICAgICAqLworCisvKiBJbnNpZGUgdGhlIEhhcHB5IE1lYWwgdHJhbnNjZWl2ZXIgaXMgdGhlIHBoeXNpY2FsIGxheWVyLCB0aGV5IHVzZSBhbgorICogaW1wbGVtZW50YXRpb25zIGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yLCBwYXJ0IG51bWJlciBEUDgzODQwVkNFLgorICogWW91IGNhbiByZXRyaWV2ZSB0aGUgZGF0YSBzaGVldHMgYW5kIHByb2dyYW1taW5nIGRvY3MgZm9yIHRoaXMgYmVhc3QKKyAqIGZyb20gaHR0cDovL3d3dy5uYXRpb25hbC5jb20vCisgKgorICogVGhlIERQODM4NDAgaXMgY2FwYWJsZSBvZiBib3RoIDEwIGFuZCAxMDBNYnBzIGV0aGVybmV0LCBpbiBib3RoCisgKiBoYWxmIGFuZCBmdWxsIGR1cGxleCBtb2RlLiAgSXQgYWxzbyBzdXBwb3J0cyBhdXRvIG5lZ290aWF0aW9uLgorICoKKyAqIEJ1dC4uLi4gVEhJUyBUSElORyBJUyBBIFBBSU4gSU4gVEhFIEFTUyBUTyBQUk9HUkFNIQorICogRGVidWdnaW5nIGVlcHJvbSBidXJudCBjb2RlIGlzIG1vcmUgZnVuIHRoYW4gcHJvZ3JhbW1pbmcgdGhpcyBjaGlwIQorICovCisKKy8qIEdlbmVyaWMgTUlJIHJlZ2lzdGVycyBkZWZpbmVkIGluIGxpbnV4L21paS5oLCB0aGVzZSBiZWxvdworICogYXJlIERQODM4NDAgc3BlY2lmaWMuCisgKi8KKyNkZWZpbmUgRFA4Mzg0MF9DU0NPTkZJRyAgICAgICAgMHgxNyAgICAgICAgLyogQ1MgY29uZmlndXJhdGlvbiAgICAgICAgICAgICovCisKKy8qIFRoZSBDYXJyaWVyIFNlbnNlIGNvbmZpZyByZWdpc3Rlci4gKi8KKyNkZWZpbmUgQ1NDT05GSUdfUkVTVjEgICAgICAgICAgMHgwMDAxICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NDT05GSUdfTEVENCAgICAgICAgICAgMHgwMDAyICAvKiBQaW4gZm9yIGZ1bGwtZHBseCBMRUQ0ICAgICAgKi8KKyNkZWZpbmUgQ1NDT05GSUdfTEVEMSAgICAgICAgICAgMHgwMDA0ICAvKiBQaW4gZm9yIGNvbm4tc3RhdHVzIExFRDEgICAgKi8KKyNkZWZpbmUgQ1NDT05GSUdfUkVTVjIgICAgICAgICAgMHgwMDA4ICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NDT05GSUdfVENWRElTQUIgICAgICAgMHgwMDEwICAvKiBUdXJucyBvZmYgdGhlIHRyYW5zY2VpdmVyICAgKi8KKyNkZWZpbmUgQ1NDT05GSUdfREZCWVBBU1MgICAgICAgMHgwMDIwICAvKiBCeXBhc3MgZGlzY29ubmVjdCBmdW5jdGlvbiAgKi8KKyNkZWZpbmUgQ1NDT05GSUdfR0xGT1JDRSAgICAgICAgMHgwMDQwICAvKiBHb29kIGxpbmsgZm9yY2UgZm9yIDEwMG1icHMgKi8KKyNkZWZpbmUgQ1NDT05GSUdfQ0xLVFJJU1RBVEUgICAgMHgwMDgwICAvKiBUcmlzdGF0ZSAyNW0gY2xvY2sgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NDT05GSUdfUkVTVjMgICAgICAgICAgMHgwNzAwICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NDT05GSUdfRU5DT0RFICAgICAgICAgMHgwODAwICAvKiAxPU1MVC0zLCAwPWJpbmFyeSAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NDT05GSUdfUkVOQUJMRSAgICAgICAgMHgxMDAwICAvKiBSZXBlYXRlciBtb2RlIGVuYWJsZSAgICAgICAgKi8KKyNkZWZpbmUgQ1NDT05GSUdfVENESVNBQkxFICAgICAgMHgyMDAwICAvKiBEaXNhYmxlIHRpbWVvdXQgY291bnRlciAgICAgKi8KKyNkZWZpbmUgQ1NDT05GSUdfUkVTVjQgICAgICAgICAgMHg0MDAwICAvKiBVbnVzZWQuLi4gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1NDT05GSUdfTkRJU0FCTEUgICAgICAgMHg4MDAwICAvKiBEaXNhYmxlIE5SWkkgICAgICAgICAgICAgICAgKi8KKworLyogSGFwcHkgTWVhbCBkZXNjcmlwdG9yIHJpbmdzIGFuZCBzdWNoLgorICogQWxsIGRlc2NyaXB0b3IgcmluZ3MgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMksgYm91bmRhcnkuCisgKiBBbGwgcmVjZWl2ZSBidWZmZXJzIG11c3QgYmUgNjQgYnl0ZSBhbGlnbmVkLgorICogQWx3YXlzIHdyaXRlIHRoZSBhZGRyZXNzIGZpcnN0IGJlZm9yZSBzZXR0aW5nIHRoZSBvd25lcnNoaXAKKyAqIGJpdHMgdG8gYXZvaWQgcmFjZXMgd2l0aCB0aGUgaGFyZHdhcmUgc2Nhbm5pbmcgdGhlIHJpbmcuCisgKi8KK3N0cnVjdCBoYXBweV9tZWFsX3J4ZCB7CisJdTMyIHJ4X2ZsYWdzOworCXUzMiByeF9hZGRyOworfTsKKworI2RlZmluZSBSWEZMQUdfT1dOICAgICAgICAgMHg4MDAwMDAwMCAvKiAxID0gaGFyZHdhcmUsIDAgPSBzb2Z0d2FyZSAqLworI2RlZmluZSBSWEZMQUdfT1ZFUkZMT1cgICAgMHg0MDAwMDAwMCAvKiAxID0gYnVmZmVyIG92ZXJmbG93ICAgICAgICAqLworI2RlZmluZSBSWEZMQUdfU0laRSAgICAgICAgMHgzZmZmMDAwMCAvKiBTaXplIG9mIHRoZSBidWZmZXIgICAgICAgICAqLworI2RlZmluZSBSWEZMQUdfQ1NVTSAgICAgICAgMHgwMDAwZmZmZiAvKiBIVyBjb21wdXRlZCBjaGVja3N1bSAgICAgICAqLworCitzdHJ1Y3QgaGFwcHlfbWVhbF90eGQgeworCXUzMiB0eF9mbGFnczsKKwl1MzIgdHhfYWRkcjsKK307CisKKyNkZWZpbmUgVFhGTEFHX09XTiAgICAgICAgIDB4ODAwMDAwMDAgLyogMSA9IGhhcmR3YXJlLCAwID0gc29mdHdhcmUgKi8KKyNkZWZpbmUgVFhGTEFHX1NPUCAgICAgICAgIDB4NDAwMDAwMDAgLyogMSA9IHN0YXJ0IG9mIHBhY2tldCAgICAgICAgKi8KKyNkZWZpbmUgVFhGTEFHX0VPUCAgICAgICAgIDB4MjAwMDAwMDAgLyogMSA9IGVuZCBvZiBwYWNrZXQgICAgICAgICAgKi8KKyNkZWZpbmUgVFhGTEFHX0NTRU5BQkxFICAgIDB4MTAwMDAwMDAgLyogMSA9IGVuYWJsZSBody1jaGVja3N1bXMgICAgKi8KKyNkZWZpbmUgVFhGTEFHX0NTTE9DQVRJT04gIDB4MGZmMDAwMDAgLyogV2hlcmUgdG8gc3RpY2sgdGhlIGNzdW0gICAgKi8KKyNkZWZpbmUgVFhGTEFHX0NTQlVGQkVHSU4gIDB4MDAwZmMwMDAgLyogV2hlcmUgdG8gYmVnaW4gY2hlY2tzdW0gICAgKi8KKyNkZWZpbmUgVFhGTEFHX1NJWkUgICAgICAgIDB4MDAwMDNmZmYgLyogU2l6ZSBvZiB0aGUgcGFja2V0ICAgICAgICAgKi8KKworI2RlZmluZSBUWF9SSU5HX1NJWkUgICAgICAgMzIgICAgICAgICAvKiBNdXN0IGJlID4xNiBhbmQgPDI1NSwgbXVsdGlwbGUgb2YgMTYgICovCisjZGVmaW5lIFJYX1JJTkdfU0laRSAgICAgICAzMiAgICAgICAgIC8qIHNlZSBFUlhfQ0ZHX1NJWkUqIGZvciBwb3NzaWJsZSB2YWx1ZXMgKi8KKworI2lmIChUWF9SSU5HX1NJWkUgPCAxNiB8fCBUWF9SSU5HX1NJWkUgPiAyNTYgfHwgKFRYX1JJTkdfU0laRSAlIDE2KSAhPSAwKQorI2Vycm9yIFRYX1JJTkdfU0laRSBob2xkcyBpbGxlZ2FsIHZhbHVlCisjZW5kaWYKKworI2RlZmluZSBUWF9SSU5HX01BWFNJWkUgICAgMjU2CisjZGVmaW5lIFJYX1JJTkdfTUFYU0laRSAgICAyNTYKKworLyogV2UgdXNlIGEgMTQgYnl0ZSBvZmZzZXQgZm9yIGNoZWNrc3VtIGNvbXB1dGF0aW9uLiAqLworI2lmIChSWF9SSU5HX1NJWkUgPT0gMzIpCisjZGVmaW5lIEVSWF9DRkdfREVGQVVMVChvZmYpIChFUlhfQ0ZHX0RNQUVOQUJMRXwoKG9mZik8PDMpfEVSWF9DRkdfU0laRTMyfCgoMTQvMik8PDE2KSkKKyNlbHNlCisjaWYgKFJYX1JJTkdfU0laRSA9PSA2NCkKKyNkZWZpbmUgRVJYX0NGR19ERUZBVUxUKG9mZikgKEVSWF9DRkdfRE1BRU5BQkxFfCgob2ZmKTw8Myl8RVJYX0NGR19TSVpFNjR8KCgxNC8yKTw8MTYpKQorI2Vsc2UKKyNpZiAoUlhfUklOR19TSVpFID09IDEyOCkKKyNkZWZpbmUgRVJYX0NGR19ERUZBVUxUKG9mZikgKEVSWF9DRkdfRE1BRU5BQkxFfCgob2ZmKTw8Myl8RVJYX0NGR19TSVpFMTI4fCgoMTQvMik8PDE2KSkKKyNlbHNlCisjaWYgKFJYX1JJTkdfU0laRSA9PSAyNTYpCisjZGVmaW5lIEVSWF9DRkdfREVGQVVMVChvZmYpIChFUlhfQ0ZHX0RNQUVOQUJMRXwoKG9mZik8PDMpfEVSWF9DRkdfU0laRTI1NnwoKDE0LzIpPDwxNikpCisjZWxzZQorI2Vycm9yIFJYX1JJTkdfU0laRSBob2xkcyBpbGxlZ2FsIHZhbHVlCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBORVhUX1JYKG51bSkgICAgICAgKCgobnVtKSArIDEpICYgKFJYX1JJTkdfU0laRSAtIDEpKQorI2RlZmluZSBORVhUX1RYKG51bSkgICAgICAgKCgobnVtKSArIDEpICYgKFRYX1JJTkdfU0laRSAtIDEpKQorI2RlZmluZSBQUkVWX1JYKG51bSkgICAgICAgKCgobnVtKSAtIDEpICYgKFJYX1JJTkdfU0laRSAtIDEpKQorI2RlZmluZSBQUkVWX1RYKG51bSkgICAgICAgKCgobnVtKSAtIDEpICYgKFRYX1JJTkdfU0laRSAtIDEpKQorCisjZGVmaW5lIFRYX0JVRkZTX0FWQUlMKGhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCgoaHApLT50eF9vbGQgPD0gKGhwKS0+dHhfbmV3KSA/ICAgICAgICAgICAgICAgICAgICAgXAorCSAgKGhwKS0+dHhfb2xkICsgKFRYX1JJTkdfU0laRSAtIDEpIC0gKGhwKS0+dHhfbmV3IDogIFwKKwkJCSAgICAoaHApLT50eF9vbGQgLSAoaHApLT50eF9uZXcgLSAxKQorCisjZGVmaW5lIFJYX09GRlNFVCAgICAgICAgICAyCisjZGVmaW5lIFJYX0JVRl9BTExPQ19TSVpFICAoMTU0NiArIFJYX09GRlNFVCArIDY0KQorCisjZGVmaW5lIFJYX0NPUFlfVEhSRVNIT0xEICAyNTYKKworc3RydWN0IGhtZWFsX2luaXRfYmxvY2sgeworCXN0cnVjdCBoYXBweV9tZWFsX3J4ZCBoYXBweV9tZWFsX3J4ZFtSWF9SSU5HX01BWFNJWkVdOworCXN0cnVjdCBoYXBweV9tZWFsX3R4ZCBoYXBweV9tZWFsX3R4ZFtUWF9SSU5HX01BWFNJWkVdOworfTsKKworI2RlZmluZSBoYmxvY2tfb2Zmc2V0KG1lbSwgZWxlbSkgXAorKChfX3UzMikoKHVuc2lnbmVkIGxvbmcpKCYoKChzdHJ1Y3QgaG1lYWxfaW5pdF9ibG9jayAqKTApLT5tZW1bZWxlbV0pKSkpCisKKy8qIE5vdyBzb2Z0d2FyZSBzdGF0ZSBzdHVmZi4gKi8KK2VudW0gaGFwcHlfdHJhbnNjZWl2ZXIgeworCWV4dGVybmFsID0gMCwKKwlpbnRlcm5hbCA9IDEsCisJbm9uZSAgICAgPSAyLAorfTsKKworLyogVGltZXIgc3RhdGUgZW5naW5lLiAqLworZW51bSBoYXBweV90aW1lcl9zdGF0ZSB7CisJYXJid2FpdCAgPSAwLCAgLyogV2FpdGluZyBmb3IgYXV0byBuZWdvdGlhdGlvbiB0byBjb21wbGV0ZS4gICAgICAgICAgKi8KKwlsdXB3YWl0ICA9IDEsICAvKiBBdXRvLW5lZyBjb21wbGV0ZSwgYXdhaXRpbmcgbGluay11cCBzdGF0dXMuICAgICAgICAqLworCWx0cnl3YWl0ID0gMiwgIC8qIEZvcmNpbmcgdHJ5IG9mIGFsbCBtb2RlcywgZnJvbSBmYXN0ZXN0IHRvIHNsb3dlc3QuICovCisJYXNsZWVwICAgPSAzLCAgLyogVGltZSBpbmFjdGl2ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK307CisKK3N0cnVjdCBxdWF0dHJvOworCisvKiBIYXBweSBoYXBweSwgam95IGpveSEgKi8KK3N0cnVjdCBoYXBweV9tZWFsIHsKKwl2b2lkIF9faW9tZW0JKmdyZWdzOwkJCS8qIEhhcHB5IG1lYWwgZ2xvYmFsIHJlZ2lzdGVycyAgICAgICAqLworCXN0cnVjdCBobWVhbF9pbml0X2Jsb2NrICAqaGFwcHlfYmxvY2s7CS8qIFJYIGFuZCBUWCBkZXNjcmlwdG9ycyAoQ1BVIGFkZHIpICAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU0JVUykgJiYgZGVmaW5lZChDT05GSUdfUENJKQorCXUzMiAoKnJlYWRfZGVzYzMyKSh1MzIgKik7CisJdm9pZCAoKndyaXRlX3R4ZCkoc3RydWN0IGhhcHB5X21lYWxfdHhkICosIHUzMiwgdTMyKTsKKwl2b2lkICgqd3JpdGVfcnhkKShzdHJ1Y3QgaGFwcHlfbWVhbF9yeGQgKiwgdTMyLCB1MzIpOworCXUzMiAoKmRtYV9tYXApKHZvaWQgKiwgdm9pZCAqLCBsb25nLCBpbnQpOworCXZvaWQgKCpkbWFfdW5tYXApKHZvaWQgKiwgdTMyLCBsb25nLCBpbnQpOworCXZvaWQgKCpkbWFfc3luY19mb3JfY3B1KSh2b2lkICosIHUzMiwgbG9uZywgaW50KTsKKwl2b2lkICgqZG1hX3N5bmNfZm9yX2RldmljZSkodm9pZCAqLCB1MzIsIGxvbmcsIGludCk7CisjZW5kaWYKKworCS8qIFRoaXMgaXMgZWl0aGVyIGEgc2J1c19kZXYgb3IgYSBwY2lfZGV2LiAqLworCXZvaWQJCQkgICpoYXBweV9kZXY7CisKKwlzcGlubG9ja190CQkgIGhhcHB5X2xvY2s7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAgKnJ4X3NrYnNbUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAgKnR4X3NrYnNbVFhfUklOR19TSVpFXTsKKworCWludCByeF9uZXcsIHR4X25ldywgcnhfb2xkLCB0eF9vbGQ7CisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwkgIG5ldF9zdGF0czsgICAgICAvKiBTdGF0aXN0aWNhbCBjb3VudGVycyAgICAgICAgICAgICAgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NCVVMpICYmIGRlZmluZWQoQ09ORklHX1BDSSkKKwl1MzIgKCpyZWFkMzIpKHZvaWQgX19pb21lbSAqKTsKKwl2b2lkICgqd3JpdGUzMikodm9pZCBfX2lvbWVtICosIHUzMik7CisjZW5kaWYKKworCXZvaWQgX19pb21lbQkqZXR4cmVnczsgICAgICAgIC8qIEV4dGVybmFsIHRyYW5zbWl0dGVyIHJlZ3MgICAgICAgICovCisJdm9pZCBfX2lvbWVtCSplcnhyZWdzOyAgICAgICAgLyogRXh0ZXJuYWwgcmVjZWl2ZXIgcmVncyAgICAgICAgICAgKi8KKwl2b2lkIF9faW9tZW0JKmJpZ21hY3JlZ3M7ICAgICAvKiBCSUdNQUMgY29yZSByZWdzCQkgICAgICovCisJdm9pZCBfX2lvbWVtCSp0Y3ZyZWdzOyAgICAgICAgLyogTUlGIHRyYW5zY2VpdmVyIHJlZ3MgICAgICAgICAgICAgKi8KKworCWRtYV9hZGRyX3QgICAgICAgICAgICAgICAgaGJsb2NrX2R2bWE7ICAgIC8qIERWTUEgdmlzaWJsZSBhZGRyZXNzIGhhcHB5IGJsb2NrICAqLworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgaGFwcHlfZmxhZ3M7ICAgIC8qIERyaXZlciBzdGF0ZSBmbGFncyAgICAgICAgICAgICAgICAqLworCWVudW0gaGFwcHlfdHJhbnNjZWl2ZXIgICAgdGN2cl90eXBlOyAgICAgIC8qIEtpbmQgb2YgdHJhbnNjZWl2ZXIgaW4gdXNlICAgICAgICAqLworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgaGFwcHlfYnVyc3RzOyAgIC8qIEdldCB5b3VyIG1pbmQgb3V0IG9mIHRoZSBndXR0ZXIgICAqLworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgcGFkZHI7ICAgICAgICAgIC8qIFBIWSBhZGRyZXNzIGZvciB0cmFuc2NlaXZlciAgICAgICAqLworCXVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgaG1fcmV2aXNpb247ICAgIC8qIEhhcHB5IG1lYWwgcmV2aXNpb24gICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgc3dfYm1jcjsgICAgICAgIC8qIFNXIGNvcHkgb2YgQk1DUiAgICAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgc3dfYm1zcjsgICAgICAgIC8qIFNXIGNvcHkgb2YgQk1TUiAgICAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgc3dfcGh5c2lkMTsgICAgIC8qIFNXIGNvcHkgb2YgUEhZU0lEMSAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgc3dfcGh5c2lkMjsgICAgIC8qIFNXIGNvcHkgb2YgUEhZU0lEMiAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgc3dfYWR2ZXJ0aXNlOyAgIC8qIFNXIGNvcHkgb2YgQURWRVJUSVNFICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgc3dfbHBhOyAgICAgICAgIC8qIFNXIGNvcHkgb2YgTFBBICAgICAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgc3dfZXhwYW5zaW9uOyAgIC8qIFNXIGNvcHkgb2YgRVhQQU5TSU9OICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIHNob3J0ICAgICAgICAgICAgc3dfY3Njb25maWc7ICAgIC8qIFNXIGNvcHkgb2YgQ1NDT05GSUcgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgYXV0b19zcGVlZDsgICAgIC8qIEF1dG8tbmVnbyBsaW5rIHNwZWVkICAgICAgICAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgIGZvcmNlZF9zcGVlZDsgICAvKiBGb3JjZSBtb2RlIGxpbmsgc3BlZWQgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgIHBvbGxfZGF0YTsgICAgICAvKiBNSUYgcG9sbCBkYXRhICAgICAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgIHBvbGxfZmxhZzsgICAgICAvKiBNSUYgcG9sbCBmbGFnICAgICAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgIGxpbmtjaGVjazsgICAgICAvKiBIYXZlIHdlIGNoZWNrZWQgdGhlIGxpbmsgeWV0PyAgICAgKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgIGxua3VwOyAgICAgICAgICAvKiBJcyB0aGUgbGluayB1cCBhcyBmYXIgYXMgd2Uga25vdz8gKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgIGxua2Rvd247ICAgICAgICAvKiBUcnlpbmcgdG8gZm9yY2UgdGhlIGxpbmsgZG93bj8gICAgKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgIGxua2NudDsgICAgICAgICAvKiBDb3VudGVyIGZvciBsaW5rLXVwIGF0dGVtcHRzLiAgICAgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgICAgIGhhcHB5X3RpbWVyOyAgICAvKiBUbyB3YXRjaCB0aGUgbGluayB3aGVuIGNvbWluZyB1cC4gKi8KKwllbnVtIGhhcHB5X3RpbWVyX3N0YXRlICAgIHRpbWVyX3N0YXRlOyAgICAvKiBTdGF0ZSBvZiB0aGUgYXV0by1uZWcgdGltZXIuICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgIHRpbWVyX3RpY2tzOyAgICAvKiBOdW1iZXIgb2YgY2xpY2tzIGF0IGVhY2ggc3RhdGUuICAgKi8KKworCXN0cnVjdCBuZXRfZGV2aWNlCSAqZGV2OwkJLyogQmFja3BvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICovCisJc3RydWN0IHF1YXR0cm8JCSAqcWZlX3BhcmVudDsJLyogRm9yIFF1YXR0cm8gY2FyZHMgICAgICAgICAgICAgICAgICovCisJaW50CQkJICBxZmVfZW50OwkvKiBXaGljaCBpbnN0YW5jZSBvbiBxdWF0dHJvICAgICAgICAgKi8KKwlzdHJ1Y3QgaGFwcHlfbWVhbCAgICAgICAgICpuZXh0X21vZHVsZTsKK307CisKKy8qIEhlcmUgYXJlIHRoZSBoYXBweSBmbGFncy4gKi8KKyNkZWZpbmUgSEZMQUdfUE9MTCAgICAgICAgICAgICAgICAweDAwMDAwMDAxICAgICAgLyogV2UgYXJlIGRvaW5nIE1JRiBwb2xsaW5nICAgICAgICAgICovCisjZGVmaW5lIEhGTEFHX0ZFTkFCTEUgICAgICAgICAgICAgMHgwMDAwMDAwMiAgICAgIC8qIFRoZSBNSUkgZnJhbWUgaXMgZW5hYmxlZCAgICAgICAgICAqLworI2RlZmluZSBIRkxBR19MQU5DRSAgICAgICAgICAgICAgIDB4MDAwMDAwMDQgICAgICAvKiBXZSBhcmUgdXNpbmcgbGFuY2UtbW9kZSAgICAgICAgICAgKi8KKyNkZWZpbmUgSEZMQUdfUlhFTkFCTEUgICAgICAgICAgICAweDAwMDAwMDA4ICAgICAgLyogUmVjZWl2ZXIgaXMgZW5hYmxlZCAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhGTEFHX0FVVE8gICAgICAgICAgICAgICAgMHgwMDAwMDAxMCAgICAgIC8qIFVzaW5nIGF1dG8tbmVnb3RpYXRpb24sIDAgPSBmb3JjZSAqLworI2RlZmluZSBIRkxBR19GVUxMICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAgICAgICAvKiBGdWxsIGR1cGxleCBlbmFibGUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEZMQUdfTUFDRlVMTCAgICAgICAgICAgICAweDAwMDAwMDQwICAgICAgLyogVXNpbmcgZnVsbCBkdXBsZXggaW4gdGhlIE1BQyAgICAgICovCisjZGVmaW5lIEhGTEFHX1BPTExFTkFCTEUgICAgICAgICAgMHgwMDAwMDA4MCAgICAgIC8qIEFjdHVhbGx5IHRyeSBNSUYgcG9sbGluZyAgICAgICAgICAqLworI2RlZmluZSBIRkxBR19SWENWICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAgICAgICAvKiBYWFggUlhDViBFTkFCTEUgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEZMQUdfSU5JVCAgICAgICAgICAgICAgICAweDAwMDAwMjAwICAgICAgLyogSW5pdCBjYWxsZWQgYXQgbGVhc3Qgb25jZSAgICAgICAgICovCisjZGVmaW5lIEhGTEFHX0xJTktVUCAgICAgICAgICAgICAgMHgwMDAwMDQwMCAgICAgIC8qIDEgPSBMaW5rIGlzIHVwICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIRkxBR19QQ0kgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAgICAgICAvKiBQQ0kgYmFzZWQgSGFwcHkgTWVhbCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEZMQUdfUVVBVFRSTwkJICAweDAwMDAxMDAwICAgICAgLyogT24gUUZFL1F1YXR0cm8gY2FyZAkgICAgICAgKi8KKworI2RlZmluZSBIRkxBR18yMF8yMSAgKEhGTEFHX1BPTExFTkFCTEUgfCBIRkxBR19GRU5BQkxFKQorI2RlZmluZSBIRkxBR19OT1RfQTAgKEhGTEFHX1BPTExFTkFCTEUgfCBIRkxBR19GRU5BQkxFIHwgSEZMQUdfTEFOQ0UgfCBIRkxBR19SWENWKQorCisvKiBTdXBwb3J0IGZvciBRRkUvUXVhdHRybyBjYXJkcy4gKi8KK3N0cnVjdCBxdWF0dHJvIHsKKwlzdHJ1Y3QgbmV0X2RldmljZQkqaGFwcHlfbWVhbHNbNF07CisKKwkvKiBUaGlzIGlzIGVpdGhlciBhIHNidXNfZGV2IG9yIGEgcGNpX2Rldi4gKi8KKwl2b2lkCQkJKnF1YXR0cm9fZGV2OworCisJc3RydWN0IHF1YXR0cm8JCSpuZXh0OworCisJLyogUFJPTSByYW5nZXMsIGlmIGFueS4gKi8KKyNpZmRlZiBDT05GSUdfU0JVUworCXN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcyAgcmFuZ2VzWzhdOworI2VuZGlmCisJaW50CQkJICBucmFuZ2VzOworfTsKKworLyogV2UgdXNlIHRoaXMgdG8gYWNxdWlyZSByZWNlaXZlIHNrYidzIHRoYXQgd2UgY2FuIERNQSBkaXJlY3RseSBpbnRvLiAqLworI2RlZmluZSBBTElHTkVEX1JYX1NLQl9BRERSKGFkZHIpIFwKKyAgICAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKGFkZHIpICsgKDY0VUwgLSAxVUwpKSAmIH4oNjRVTCAtIDFVTCkpIC0gKHVuc2lnbmVkIGxvbmcpKGFkZHIpKQorI2RlZmluZSBoYXBweV9tZWFsX2FsbG9jX3NrYihfX2xlbmd0aCwgX19nZnBfZmxhZ3MpIFwKKyh7CXN0cnVjdCBza19idWZmICpfX3NrYjsgXAorCV9fc2tiID0gYWxsb2Nfc2tiKChfX2xlbmd0aCkgKyA2NCwgKF9fZ2ZwX2ZsYWdzKSk7IFwKKwlpZihfX3NrYikgeyBcCisJCWludCBfX29mZnNldCA9IChpbnQpIEFMSUdORURfUlhfU0tCX0FERFIoX19za2ItPmRhdGEpOyBcCisJCWlmKF9fb2Zmc2V0KSBcCisJCQlza2JfcmVzZXJ2ZShfX3NrYiwgX19vZmZzZXQpOyBcCisJfSBcCisJX19za2I7IFwKK30pCisKKyNlbmRpZiAvKiAhKF9TVU5ITUVfSCkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmxhbmNlLmMgYi9kcml2ZXJzL25ldC9zdW5sYW5jZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZDQ2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdW5sYW5jZS5jCkBAIC0wLDAgKzEsMTYxNCBAQAorLyogJElkOiBzdW5sYW5jZS5jLHYgMS4xMTIgMjAwMi8wMS8xNSAwNjo0ODo1NSBkYXZlbSBFeHAgJAorICogbGFuY2UuYzogTGludXgvU3BhcmMvTGFuY2UgZHJpdmVyCisgKgorICoJV3JpdHRlbiAxOTk1LCAxOTk2IGJ5IE1pZ3VlbCBkZSBJY2F6YQorICogU291cmNlczoKKyAqCVRoZSBMaW51eCAgZGVwY2EgZHJpdmVyCisgKglUaGUgTGludXggIGxhbmNlIGRyaXZlci4KKyAqCVRoZSBMaW51eCAgc2tlbGV0b24gZHJpdmVyLgorICoJVGhlIE5ldEJTRCBTcGFyYy9MYW5jZSBkcml2ZXIuCisgKglUaGVvIGRlIFJhYWR0IChkZXJhYWR0QG9wZW5ic2Qub3JnKQorICoJTkNSOTJDOTkwIExhbiBDb250cm9sbGVyIG1hbnVhbAorICoKKyAqIDEuNDoKKyAqCUFkZGVkIHN1cHBvcnQgdG8gcnVuIHdpdGggYSBsZWRtYSBvbiB0aGUgU3VuNG0KKyAqCisgKiAxLjU6CisgKglBZGRlZCBtdWx0aXBsZSBjYXJkIGRldGVjdGlvbi4KKyAqCisgKgkgNC8xNy85NjogQnVyc3Qgc2l6ZXMgYW5kIHRwZSBzZWxlY3Rpb24gb24gc3VuNG0gYnkgRWRkaWUgQy4gRG9zdAorICoJCSAgKGVjZEBza3luZXQuYmUpCisgKgorICoJIDUvMTUvOTY6IGF1dG8gY2FycmllciBkZXRlY3Rpb24gb24gc3VuNG0gYnkgRWRkaWUgQy4gRG9zdAorICoJCSAgKGVjZEBza3luZXQuYmUpCisgKgorICoJIDUvMTcvOTY6IGxlYnVmZmVyIG9uIHNjc2kvZXRoZXIgY2FyZHMgbm93IHdvcmsgRGF2aWQgUy4gTWlsbGVyCisgKgkJICAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKKyAqCisgKgkgNS8yOS85Njogb3ZlcnJpZGUgb3B0aW9uICd0cGUtbGluay10ZXN0PycsIGlmIGl0IGlzICdmYWxzZScsIGFzCisgKgkJICB0aGlzIGRpc2FibGVzIGF1dG8gY2FycmllciBkZXRlY3Rpb24gb24gc3VuNG0uIEVkZGllIEMuIERvc3QKKyAqCQkgIChlY2RAc2t5bmV0LmJlKQorICoKKyAqIDEuNzoKKyAqCSA2LzI2Lzk2OiBCdWcgZml4IGZvciBtdWx0aXBsZSBsZWRtYXMsIG1pZ3VlbC4KKyAqCisgKiAxLjg6CisgKgkJICBTdG9sZSBtdWx0aWNhc3QgY29kZSBmcm9tIGRlcGNhLmMsIGZpeGVkIGxhbmNlX3R4LgorICoKKyAqIDEuOToKKyAqCSA4LzIxLzk2OiBGaXhlZCB0aGUgbXVsdGljYXN0IGNvZGUgKFBlZHJvIFJvcXVlKQorICoKKyAqCSA4LzI4Lzk2OiBTZW5kIGZha2UgcGFja2V0IGluIGxhbmNlX29wZW4oKSBpZiBhdXRvX3NlbGVjdCBpcyB0cnVlLAorICoJCSAgc28gd2UgY2FuIGRldGVjdCB0aGUgY2FycmllciBsb3NzIGNvbmRpdGlvbiBpbiB0aW1lLgorICoJCSAgRWRkaWUgQy4gRG9zdCAoZWNkQHNreW5ldC5iZSkKKyAqCisgKgkgOS8xNS85NjogQWxpZ24gcnhfYnVmIHNvIHRoYXQgZXRoX2NvcHlfYW5kX3N1bSgpIHdvbid0IGNhdXNlIGFuCisgKgkJICBNTkEgdHJhcCBkdXJpbmcgY2hrc3VtX3BhcnRpYWxfY29weSgpLiAoZWNkQHNreW5ldC5iZSkKKyAqCisgKgkxMS8xNy85NjogSGFuZGxlIExFX0MwX01FUlIgaW4gbGFuY2VfaW50ZXJydXB0KCkuIChlY2RAc2t5bmV0LmJlKQorICoKKyAqCTEyLzIyLzk2OiBEb24ndCBsb29wIGZvcmV2ZXIgaW4gbGFuY2VfcngoKSBvbiBpbmNvbXBsZXRlIHBhY2tldHMuCisgKgkJICBUaGlzIHdhcyB0aGUgc3VuNGMga2lsbGVyLiBTaGl0LCBzdHVwaWQgYnVnLgorICoJCSAgKGVjZEBza3luZXQuYmUpCisgKgorICogMS4xMDoKKyAqCSAxLzI2Lzk3OiBNb2R1bGFyaXplIGRyaXZlci4gKGVjZEBza3luZXQuYmUpCisgKgorICogMS4xMToKKyAqCTEyLzI3Lzk3OiBBZGRlZCBzdW40ZCBzdXBwb3J0LiAoampAc3Vuc2l0ZS5tZmYuY3VuaS5jeikKKyAqCisgKiAxLjEyOgorICogCSAxMS8zLzk5OiBGaXhlZCBTTVAgcmFjZSBpbiBsYW5jZV9zdGFydF94bWl0IGZvdW5kIGJ5IGRhdmVtLgorICogCSAgICAgICAgICBBbnRvbiBCbGFuY2hhcmQgKGFudG9uQHByb2dzb2MudXRzLmVkdS5hdSkKKyAqIDIuMDA6IDExLzkvOTk6IE1hc3NpdmUgb3ZlcmhhdWwgYW5kIHBvcnQgdG8gbmV3IFNCVVMgZHJpdmVyIGludGVyZmFjZXMuCisgKgkJICBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKiAyLjAxOgorICogICAgICAxMS8wOC8wMTogVXNlIGxpYnJhcnkgY3JjMzIgZnVuY3Rpb25zIChNYXR0X0RvbXNjaEBkZWxsLmNvbSkKKyAqCQkgIAorICovCisKKyN1bmRlZiBERUJVR19EUklWRVIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdID0KKwkic3VubGFuY2UuYzp2Mi4wMiAyNC9BdWcvMDMgTWlndWVsIGRlIEljYXphIChtaWd1ZWxAbnVjbGVjdS51bmFtLm14KVxuIjsKKworc3RhdGljIGNoYXIgbGFuY2VzdHJbXSA9ICJMQU5DRSI7CisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPiAvKiBVc2VkIGZvciB0aGUgdGVtcG9yYWwgaW5ldCBlbnRyaWVzIGFuZCByb3V0aW5nICovCisjaW5jbHVkZSA8bGludXgvcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CS8qIFVzZWQgYnkgdGhlIGNoZWNrc3VtIHJvdXRpbmVzICovCisjaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9zYnVzLmg+CisjaW5jbHVkZSA8YXNtL29wZW5wcm9tLmg+CisjaW5jbHVkZSA8YXNtL29wbGliLmg+CisjaW5jbHVkZSA8YXNtL2F1eGlvLmg+CQkvKiBGb3IgdHBlLWxpbmstdGVzdD8gc2V0dGluZyAqLworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworLyogRGVmaW5lOiAyXjQgVHggYnVmZmVycyBhbmQgMl40IFJ4IGJ1ZmZlcnMgKi8KKyNpZm5kZWYgTEFOQ0VfTE9HX1RYX0JVRkZFUlMKKyNkZWZpbmUgTEFOQ0VfTE9HX1RYX0JVRkZFUlMgNAorI2RlZmluZSBMQU5DRV9MT0dfUlhfQlVGRkVSUyA0CisjZW5kaWYKKworI2RlZmluZSBMRV9DU1IwIDAKKyNkZWZpbmUgTEVfQ1NSMSAxCisjZGVmaW5lIExFX0NTUjIgMgorI2RlZmluZSBMRV9DU1IzIDMKKworI2RlZmluZSBMRV9NT19QUk9NICAgICAgMHg4MDAwICAvKiBFbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLworCisjZGVmaW5lCUxFX0MwX0VSUgkweDgwMDAJLyogRXJyb3I6IHNldCBpZiBCQUIsIFNRRSwgTUlTUyBvciBNRSBpcyBzZXQgKi8KKyNkZWZpbmUJTEVfQzBfQkFCTAkweDQwMDAJLyogQkFCOiAgQmFiYmxlOiB0eCB0aW1lb3V0LiAqLworI2RlZmluZQlMRV9DMF9DRVJSCTB4MjAwMAkvKiBTUUU6ICBTaWduYWwgcXVhbGl0eSBlcnJvciAqLworI2RlZmluZQlMRV9DMF9NSVNTCTB4MTAwMAkvKiBNSVNTOiBNaXNzZWQgYSBwYWNrZXQgKi8KKyNkZWZpbmUJTEVfQzBfTUVSUgkweDA4MDAJLyogTUU6ICAgTWVtb3J5IGVycm9yICovCisjZGVmaW5lCUxFX0MwX1JJTlQJMHgwNDAwCS8qIFJlY2VpdmVkIGludGVycnVwdCAqLworI2RlZmluZQlMRV9DMF9USU5UCTB4MDIwMAkvKiBUcmFuc21pdHRlciBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUJTEVfQzBfSURPTgkweDAxMDAJLyogSUZJTjogSW5pdCBmaW5pc2hlZC4gKi8KKyNkZWZpbmUJTEVfQzBfSU5UUgkweDAwODAJLyogSW50ZXJydXB0IG9yIGVycm9yICovCisjZGVmaW5lCUxFX0MwX0lORUEJMHgwMDQwCS8qIEludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUJTEVfQzBfUlhPTgkweDAwMjAJLyogUmVjZWl2ZXIgb24gKi8KKyNkZWZpbmUJTEVfQzBfVFhPTgkweDAwMTAJLyogVHJhbnNtaXR0ZXIgb24gKi8KKyNkZWZpbmUJTEVfQzBfVERNRAkweDAwMDgJLyogVHJhbnNtaXR0ZXIgZGVtYW5kICovCisjZGVmaW5lCUxFX0MwX1NUT1AJMHgwMDA0CS8qIFN0b3AgdGhlIGNhcmQgKi8KKyNkZWZpbmUJTEVfQzBfU1RSVAkweDAwMDIJLyogU3RhcnQgdGhlIGNhcmQgKi8KKyNkZWZpbmUJTEVfQzBfSU5JVAkweDAwMDEJLyogSW5pdCB0aGUgY2FyZCAqLworCisjZGVmaW5lCUxFX0MzX0JTV1AJMHg0ICAgICAvKiBTV0FQICovCisjZGVmaW5lCUxFX0MzX0FDT04JMHgyCS8qIEFMRSBDb250cm9sICovCisjZGVmaW5lCUxFX0MzX0JDT04JMHgxCS8qIEJ5dGUgY29udHJvbCAqLworCisvKiBSZWNlaXZlIG1lc3NhZ2UgZGVzY3JpcHRvciAxICovCisjZGVmaW5lIExFX1IxX09XTiAgICAgICAweDgwICAgIC8qIFdobyBvd25zIHRoZSBlbnRyeSAqLworI2RlZmluZSBMRV9SMV9FUlIgICAgICAgMHg0MCAgICAvKiBFcnJvcjogaWYgRlJBLCBPRkwsIENSQyBvciBCVUYgaXMgc2V0ICovCisjZGVmaW5lIExFX1IxX0ZSQSAgICAgICAweDIwICAgIC8qIEZSQTogRnJhbWUgZXJyb3IgKi8KKyNkZWZpbmUgTEVfUjFfT0ZMICAgICAgIDB4MTAgICAgLyogT0ZMOiBGcmFtZSBvdmVyZmxvdyAqLworI2RlZmluZSBMRV9SMV9DUkMgICAgICAgMHgwOCAgICAvKiBDUkMgZXJyb3IgKi8KKyNkZWZpbmUgTEVfUjFfQlVGICAgICAgIDB4MDQgICAgLyogQlVGOiBCdWZmZXIgZXJyb3IgKi8KKyNkZWZpbmUgTEVfUjFfU09QICAgICAgIDB4MDIgICAgLyogU3RhcnQgb2YgcGFja2V0ICovCisjZGVmaW5lIExFX1IxX0VPUCAgICAgICAweDAxICAgIC8qIEVuZCBvZiBwYWNrZXQgKi8KKyNkZWZpbmUgTEVfUjFfUE9LICAgICAgIDB4MDMgICAgLyogUGFja2V0IGlzIGNvbXBsZXRlOiBTT1AgKyBFT1AgKi8KKworI2RlZmluZSBMRV9UMV9PV04gICAgICAgMHg4MCAgICAvKiBMYW5jZSBvd25zIHRoZSBwYWNrZXQgKi8KKyNkZWZpbmUgTEVfVDFfRVJSICAgICAgIDB4NDAgICAgLyogRXJyb3Igc3VtbWFyeSAqLworI2RlZmluZSBMRV9UMV9FTU9SRSAgICAgMHgxMCAgICAvKiBFcnJvcjogbW9yZSB0aGFuIG9uZSByZXRyeSBuZWVkZWQgKi8KKyNkZWZpbmUgTEVfVDFfRU9ORSAgICAgIDB4MDggICAgLyogRXJyb3I6IG9uZSByZXRyeSBuZWVkZWQgKi8KKyNkZWZpbmUgTEVfVDFfRURFRiAgICAgIDB4MDQgICAgLyogRXJyb3I6IGRlZmVycmVkICovCisjZGVmaW5lIExFX1QxX1NPUCAgICAgICAweDAyICAgIC8qIFN0YXJ0IG9mIHBhY2tldCAqLworI2RlZmluZSBMRV9UMV9FT1AgICAgICAgMHgwMSAgICAvKiBFbmQgb2YgcGFja2V0ICovCisjZGVmaW5lIExFX1QxX1BPSwkweDAzCS8qIFBhY2tldCBpcyBjb21wbGV0ZTogU09QICsgRU9QICovCisKKyNkZWZpbmUgTEVfVDNfQlVGICAgICAgIDB4ODAwMCAgLyogQnVmZmVyIGVycm9yICovCisjZGVmaW5lIExFX1QzX1VGTCAgICAgICAweDQwMDAgIC8qIEVycm9yIHVuZGVyZmxvdyAqLworI2RlZmluZSBMRV9UM19MQ09MICAgICAgMHgxMDAwICAvKiBFcnJvciBsYXRlIGNvbGxpc2lvbiAqLworI2RlZmluZSBMRV9UM19DTE9TICAgICAgMHgwODAwICAvKiBFcnJvciBjYXJyaWVyIGxvc3MgKi8KKyNkZWZpbmUgTEVfVDNfUlRZICAgICAgIDB4MDQwMCAgLyogRXJyb3IgcmV0cnkgKi8KKyNkZWZpbmUgTEVfVDNfVERSICAgICAgIDB4MDNmZiAgLyogVGltZSBEb21haW4gUmVmbGVjdG9tZXRyeSBjb3VudGVyICovCisKKyNkZWZpbmUgVFhfUklOR19TSVpFCQkJKDEgPDwgKExBTkNFX0xPR19UWF9CVUZGRVJTKSkKKyNkZWZpbmUgVFhfUklOR19NT0RfTUFTSwkJKFRYX1JJTkdfU0laRSAtIDEpCisjZGVmaW5lIFRYX1JJTkdfTEVOX0JJVFMJCSgoTEFOQ0VfTE9HX1RYX0JVRkZFUlMpIDw8IDI5KQorI2RlZmluZSBUWF9ORVhUKF9feCkJCQkoKChfX3gpKzEpICYgVFhfUklOR19NT0RfTUFTSykKKworI2RlZmluZSBSWF9SSU5HX1NJWkUJCQkoMSA8PCAoTEFOQ0VfTE9HX1JYX0JVRkZFUlMpKQorI2RlZmluZSBSWF9SSU5HX01PRF9NQVNLCQkoUlhfUklOR19TSVpFIC0gMSkKKyNkZWZpbmUgUlhfUklOR19MRU5fQklUUwkJKChMQU5DRV9MT0dfUlhfQlVGRkVSUykgPDwgMjkpCisjZGVmaW5lIFJYX05FWFQoX194KQkJCSgoKF9feCkrMSkgJiBSWF9SSU5HX01PRF9NQVNLKQorCisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1NDQKKyNkZWZpbmUgUlhfQlVGRl9TSVpFICAgICAgICAgICAgUEtUX0JVRl9TWgorI2RlZmluZSBUWF9CVUZGX1NJWkUgICAgICAgICAgICBQS1RfQlVGX1NaCisKK3N0cnVjdCBsYW5jZV9yeF9kZXNjIHsKKwl1MTYJcm1kMDsJCS8qIGxvdyBhZGRyZXNzIG9mIHBhY2tldCAqLworCXU4CXJtZDFfYml0czsJLyogZGVzY3JpcHRvciBiaXRzICovCisJdTgJcm1kMV9oYWRyOwkvKiBoaWdoIGFkZHJlc3Mgb2YgcGFja2V0ICovCisJczE2CWxlbmd0aDsJCS8qIFRoaXMgbGVuZ3RoIGlzIDJzIGNvbXBsZW1lbnQgKG5lZ2F0aXZlKSEKKwkJCQkgKiBCdWZmZXIgbGVuZ3RoCisJCQkJICovCisJdTE2CW1ibGVuZ3RoOwkvKiBUaGlzIGlzIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkICovCit9OworCitzdHJ1Y3QgbGFuY2VfdHhfZGVzYyB7CisJdTE2CXRtZDA7CQkvKiBsb3cgYWRkcmVzcyBvZiBwYWNrZXQgKi8KKwl1OCAJdG1kMV9iaXRzOwkvKiBkZXNjcmlwdG9yIGJpdHMgKi8KKwl1OCAJdG1kMV9oYWRyOwkvKiBoaWdoIGFkZHJlc3Mgb2YgcGFja2V0ICovCisJczE2IAlsZW5ndGg7CQkvKiBMZW5ndGggaXMgMnMgY29tcGxlbWVudCAobmVnYXRpdmUpISAqLworCXUxNiAJbWlzYzsKK307CisJCQorLyogVGhlIExBTkNFIGluaXRpYWxpemF0aW9uIGJsb2NrLCBkZXNjcmliZWQgaW4gZGF0YWJvb2suICovCisvKiBPbiB0aGUgU3BhcmMsIHRoaXMgYmxvY2sgc2hvdWxkIGJlIG9uIGEgRE1BIHJlZ2lvbiAgICAgKi8KK3N0cnVjdCBsYW5jZV9pbml0X2Jsb2NrIHsKKwl1MTYJbW9kZTsJCS8qIFByZS1zZXQgbW9kZSAocmVnLiAxNSkgKi8KKwl1OAlwaHlzX2FkZHJbNl07CS8qIFBoeXNpY2FsIGV0aGVybmV0IGFkZHJlc3MgKi8KKwl1MzIJZmlsdGVyWzJdOwkvKiBNdWx0aWNhc3QgZmlsdGVyLiAqLworCisJLyogUmVjZWl2ZSBhbmQgdHJhbnNtaXQgcmluZyBiYXNlLCBhbG9uZyB3aXRoIGV4dHJhIGJpdHMuICovCisJdTE2CXJ4X3B0cjsJCS8qIHJlY2VpdmUgZGVzY3JpcHRvciBhZGRyICovCisJdTE2CXJ4X2xlbjsJCS8qIHJlY2VpdmUgbGVuIGFuZCBoaWdoIGFkZHIgKi8KKwl1MTYJdHhfcHRyOwkJLyogdHJhbnNtaXQgZGVzY3JpcHRvciBhZGRyICovCisJdTE2CXR4X2xlbjsJCS8qIHRyYW5zbWl0IGxlbiBhbmQgaGlnaCBhZGRyICovCisgICAgCisJLyogVGhlIFR4IGFuZCBSeCByaW5nIGVudHJpZXMgbXVzdCBhbGlnbmVkIG9uIDgtYnl0ZSBib3VuZGFyaWVzLiAqLworCXN0cnVjdCBsYW5jZV9yeF9kZXNjIGJyeF9yaW5nW1JYX1JJTkdfU0laRV07CisJc3RydWN0IGxhbmNlX3R4X2Rlc2MgYnR4X3JpbmdbVFhfUklOR19TSVpFXTsKKyAgICAKKwl1OAl0eF9idWYgW1RYX1JJTkdfU0laRV1bVFhfQlVGRl9TSVpFXTsKKwl1OAlwYWRbMl07CQkvKiBhbGlnbiByeF9idWYgZm9yIGNvcHlfYW5kX3N1bSgpLiAqLworCXU4CXJ4X2J1ZiBbUlhfUklOR19TSVpFXVtSWF9CVUZGX1NJWkVdOworfTsKKworI2RlZmluZSBsaWJkZXNjX29mZnNldChydCwgZWxlbSkgXAorKChfX3UzMikoKCh1bnNpZ25lZCBsb25nKSgmKCgoc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKikwKS0+cnRbZWxlbV0pKSkpKQorCisjZGVmaW5lIGxpYmJ1ZmZfb2Zmc2V0KHJ0LCBlbGVtKSBcCisoKF9fdTMyKSgoKHVuc2lnbmVkIGxvbmcpKCYoKChzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqKTApLT5ydFtlbGVtXVswXSkpKSkpCisKK3N0cnVjdCBsYW5jZV9wcml2YXRlIHsKKwl2b2lkIF9faW9tZW0JKmxyZWdzOwkJLyogTGFuY2UgUkFQL1JEUCByZWdzLgkJKi8KKwl2b2lkIF9faW9tZW0JKmRyZWdzOwkJLyogRE1BIGNvbnRyb2xsZXIgcmVncy4JCSovCisJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgX19pb21lbSAqaW5pdF9ibG9ja19pb21lbTsKKwlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaW5pdF9ibG9ja19tZW07CisgICAgCisJc3BpbmxvY2tfdAlsb2NrOworCisJaW50CQlyeF9uZXcsIHR4X25ldzsKKwlpbnQJCXJ4X29sZCwgdHhfb2xkOworICAgIAorCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOworCXN0cnVjdCBzYnVzX2RtYSAqbGVkbWE7CS8qIElmIHNldCB0aGlzIHBvaW50cyB0byBsZWRtYQkqLworCWNoYXIJCXRwZTsJCS8qIGNhYmxlLXNlbGVjdGlvbiBpcyBUUEUJKi8KKwljaGFyCQlhdXRvX3NlbGVjdDsJLyogY2FibGUtc2VsZWN0aW9uIGJ5IGNhcnJpZXIJKi8KKwljaGFyCQlidXJzdF9zaXplczsJLyogbGVkbWEgU0J1cyBidXJzdCBzaXplcwkqLworCWNoYXIJCXBpb19idWZmZXI7CS8qIGluaXQgYmxvY2sgaW4gUElPIHNwYWNlPwkqLworCisJdW5zaWduZWQgc2hvcnQJYnVzbWFzdGVyX3JlZ3ZhbDsKKworCXZvaWQgKCppbml0X3JpbmcpKHN0cnVjdCBuZXRfZGV2aWNlICopOworCXZvaWQgKCpyeCkoc3RydWN0IG5ldF9kZXZpY2UgKik7CisJdm9pZCAoKnR4KShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKworCWNoYXIJICAgICAgIAkgICAgICAgKm5hbWU7CisJZG1hX2FkZHJfdAkJaW5pdF9ibG9ja19kdm1hOworCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgKmRldjsJCSAgLyogQmFja3BvaW50ZXIJKi8KKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAgICpuZXh0X21vZHVsZTsKKwlzdHJ1Y3Qgc2J1c19kZXYJICAgICAgICpzZGV2OworCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgIG11bHRpY2FzdF90aW1lcjsKK307CisKKyNkZWZpbmUgVFhfQlVGRlNfQVZBSUwgKChscC0+dHhfb2xkPD1scC0+dHhfbmV3KT9cCisJCQlscC0+dHhfb2xkK1RYX1JJTkdfTU9EX01BU0stbHAtPnR4X25ldzpcCisJCQlscC0+dHhfb2xkIC0gbHAtPnR4X25ldy0xKQorCisvKiBMYW5jZSByZWdpc3RlcnMuICovCisjZGVmaW5lIFJEUAkJMHgwMFVMCQkvKiByZWdpc3RlciBkYXRhIHBvcnQJCSovCisjZGVmaW5lIFJBUAkJMHgwMlVMCQkvKiByZWdpc3RlciBhZGRyZXNzIHBvcnQJKi8KKyNkZWZpbmUgTEFOQ0VfUkVHX1NJWkUJMHgwNFVMCisKKyNkZWZpbmUgU1RPUF9MQU5DRShfX2xwKSBcCitkbyB7CXZvaWQgX19pb21lbSAqX19iYXNlID0gKF9fbHApLT5scmVnczsgXAorCXNidXNfd3JpdGV3KExFX0NTUjAsCV9fYmFzZSArIFJBUCk7IFwKKwlzYnVzX3dyaXRldyhMRV9DMF9TVE9QLAlfX2Jhc2UgKyBSRFApOyBcCit9IHdoaWxlICgwKQorCitpbnQgc3BhcmNfbGFuY2VfZGVidWcgPSAyOworCisvKiBUaGUgTGFuY2UgdXNlcyAyNCBiaXQgYWRkcmVzc2VzICovCisvKiBPbiB0aGUgU3VuNGMgdGhlIERWTUEgd2lsbCBwcm92aWRlIHRoZSByZW1haW5pbmcgYnl0ZXMgZm9yIHVzICovCisvKiBPbiB0aGUgU3VuNG0gd2UgaGF2ZSB0byBpbnN0cnVjdCB0aGUgbGVkbWEgdG8gcHJvdmlkZSB0aGVtICAgICovCisvKiBFdmVuIHdvcnNlLCBvbiBzY3NpL2V0aGVyIFNCVVMgY2FyZHMsIHRoZSBpbml0IGJsb2NrIGFuZCB0aGUKKyAqIHRyYW5zbWl0L3JlY2VpdmUgYnVmZmVycyBhcmUgYWRkcmVzc2VzIGFzIG9mZnNldHMgZnJvbSBhYnNvbHV0ZQorICogemVybyBvbiB0aGUgbGVidWZmZXIgUElPIGFyZWEuIC1EYXZlTQorICovCisKKyNkZWZpbmUgTEFOQ0VfQUREUih4KSAoKGxvbmcpKHgpICYgfjB4ZmYwMDAwMDApCisKK3N0YXRpYyBzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqcm9vdF9sYW5jZV9kZXY7CisKKy8qIExvYWQgdGhlIENTUiByZWdpc3RlcnMgKi8KK3N0YXRpYyB2b2lkIGxvYWRfY3NycyhzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHApCit7CisJdTMyIGxlcHRyOworCisJaWYgKGxwLT5waW9fYnVmZmVyKQorCQlsZXB0ciA9IDA7CisJZWxzZQorCQlsZXB0ciA9IExBTkNFX0FERFIobHAtPmluaXRfYmxvY2tfZHZtYSk7CisKKwlzYnVzX3dyaXRldyhMRV9DU1IxLAkJICBscC0+bHJlZ3MgKyBSQVApOworCXNidXNfd3JpdGV3KGxlcHRyICYgMHhmZmZmLAkgIGxwLT5scmVncyArIFJEUCk7CisJc2J1c193cml0ZXcoTEVfQ1NSMiwJCSAgbHAtPmxyZWdzICsgUkFQKTsKKwlzYnVzX3dyaXRldyhsZXB0ciA+PiAxNiwJICBscC0+bHJlZ3MgKyBSRFApOworCXNidXNfd3JpdGV3KExFX0NTUjMsCQkgIGxwLT5scmVncyArIFJBUCk7CisJc2J1c193cml0ZXcobHAtPmJ1c21hc3Rlcl9yZWd2YWwsIGxwLT5scmVncyArIFJEUCk7CisKKwkvKiBQb2ludCBiYWNrIHRvIGNzcjAgKi8KKwlzYnVzX3dyaXRldyhMRV9DU1IwLCBscC0+bHJlZ3MgKyBSQVApOworfQorCisvKiBTZXR1cCB0aGUgTGFuY2UgUnggYW5kIFR4IHJpbmdzICovCitzdGF0aWMgdm9pZCBsYW5jZV9pbml0X3JpbmdfZHZtYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2tfbWVtOworCWRtYV9hZGRyX3QgYWliID0gbHAtPmluaXRfYmxvY2tfZHZtYTsKKwlfX3UzMiBsZXB0cjsKKwlpbnQgaTsKKyAgICAKKwkvKiBMb2NrIG91dCBvdGhlciBwcm9jZXNzZXMgd2hpbGUgc2V0dGluZyB1cCBoYXJkd2FyZSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlscC0+cnhfbmV3ID0gbHAtPnR4X25ldyA9IDA7CisJbHAtPnJ4X29sZCA9IGxwLT50eF9vbGQgPSAwOworCisJLyogQ29weSB0aGUgZXRoZXJuZXQgYWRkcmVzcyB0byB0aGUgbGFuY2UgaW5pdCBibG9jaworCSAqIE5vdGUgdGhhdCBvbiB0aGUgc3BhcmMgeW91IG5lZWQgdG8gc3dhcCB0aGUgZXRoZXJuZXQgYWRkcmVzcy4KKwkgKi8KKwlpYi0+cGh5c19hZGRyIFswXSA9IGRldi0+ZGV2X2FkZHIgWzFdOworCWliLT5waHlzX2FkZHIgWzFdID0gZGV2LT5kZXZfYWRkciBbMF07CisJaWItPnBoeXNfYWRkciBbMl0gPSBkZXYtPmRldl9hZGRyIFszXTsKKwlpYi0+cGh5c19hZGRyIFszXSA9IGRldi0+ZGV2X2FkZHIgWzJdOworCWliLT5waHlzX2FkZHIgWzRdID0gZGV2LT5kZXZfYWRkciBbNV07CisJaWItPnBoeXNfYWRkciBbNV0gPSBkZXYtPmRldl9hZGRyIFs0XTsKKworCS8qIFNldHVwIHRoZSBUeCByaW5nIGVudHJpZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCWxlcHRyID0gTEFOQ0VfQUREUihhaWIgKyBsaWJidWZmX29mZnNldCh0eF9idWYsIGkpKTsKKwkJaWItPmJ0eF9yaW5nIFtpXS50bWQwICAgICAgPSBsZXB0cjsKKwkJaWItPmJ0eF9yaW5nIFtpXS50bWQxX2hhZHIgPSBsZXB0ciA+PiAxNjsKKwkJaWItPmJ0eF9yaW5nIFtpXS50bWQxX2JpdHMgPSAwOworCQlpYi0+YnR4X3JpbmcgW2ldLmxlbmd0aCAgICA9IDB4ZjAwMDsgLyogVGhlIG9uZXMgcmVxdWlyZWQgYnkgdG1kMiAqLworCQlpYi0+YnR4X3JpbmcgW2ldLm1pc2MgICAgICA9IDA7CisJfQorCisJLyogU2V0dXAgdGhlIFJ4IHJpbmcgZW50cmllcyAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlsZXB0ciA9IExBTkNFX0FERFIoYWliICsgbGliYnVmZl9vZmZzZXQocnhfYnVmLCBpKSk7CisKKwkJaWItPmJyeF9yaW5nIFtpXS5ybWQwICAgICAgPSBsZXB0cjsKKwkJaWItPmJyeF9yaW5nIFtpXS5ybWQxX2hhZHIgPSBsZXB0ciA+PiAxNjsKKwkJaWItPmJyeF9yaW5nIFtpXS5ybWQxX2JpdHMgPSBMRV9SMV9PV047CisJCWliLT5icnhfcmluZyBbaV0ubGVuZ3RoICAgID0gLVJYX0JVRkZfU0laRSB8IDB4ZjAwMDsKKwkJaWItPmJyeF9yaW5nIFtpXS5tYmxlbmd0aCAgPSAwOworCX0KKworCS8qIFNldHVwIHRoZSBpbml0aWFsaXphdGlvbiBibG9jayAqLworICAgIAorCS8qIFNldHVwIHJ4IGRlc2NyaXB0b3IgcG9pbnRlciAqLworCWxlcHRyID0gTEFOQ0VfQUREUihhaWIgKyBsaWJkZXNjX29mZnNldChicnhfcmluZywgMCkpOworCWliLT5yeF9sZW4gPSAoTEFOQ0VfTE9HX1JYX0JVRkZFUlMgPDwgMTMpIHwgKGxlcHRyID4+IDE2KTsKKwlpYi0+cnhfcHRyID0gbGVwdHI7CisgICAgCisJLyogU2V0dXAgdHggZGVzY3JpcHRvciBwb2ludGVyICovCisJbGVwdHIgPSBMQU5DRV9BRERSKGFpYiArIGxpYmRlc2Nfb2Zmc2V0KGJ0eF9yaW5nLCAwKSk7CisJaWItPnR4X2xlbiA9IChMQU5DRV9MT0dfVFhfQlVGRkVSUyA8PCAxMykgfCAobGVwdHIgPj4gMTYpOworCWliLT50eF9wdHIgPSBsZXB0cjsKK30KKworc3RhdGljIHZvaWQgbGFuY2VfaW5pdF9yaW5nX3BpbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgX19pb21lbSAqaWIgPSBscC0+aW5pdF9ibG9ja19pb21lbTsKKwl1MzIgbGVwdHI7CisJaW50IGk7CisgICAgCisJLyogTG9jayBvdXQgb3RoZXIgcHJvY2Vzc2VzIHdoaWxlIHNldHRpbmcgdXAgaGFyZHdhcmUgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJbHAtPnJ4X25ldyA9IGxwLT50eF9uZXcgPSAwOworCWxwLT5yeF9vbGQgPSBscC0+dHhfb2xkID0gMDsKKworCS8qIENvcHkgdGhlIGV0aGVybmV0IGFkZHJlc3MgdG8gdGhlIGxhbmNlIGluaXQgYmxvY2sKKwkgKiBOb3RlIHRoYXQgb24gdGhlIHNwYXJjIHlvdSBuZWVkIHRvIHN3YXAgdGhlIGV0aGVybmV0IGFkZHJlc3MuCisJICovCisJc2J1c193cml0ZWIoZGV2LT5kZXZfYWRkclsxXSwgJmliLT5waHlzX2FkZHJbMF0pOworCXNidXNfd3JpdGViKGRldi0+ZGV2X2FkZHJbMF0sICZpYi0+cGh5c19hZGRyWzFdKTsKKwlzYnVzX3dyaXRlYihkZXYtPmRldl9hZGRyWzNdLCAmaWItPnBoeXNfYWRkclsyXSk7CisJc2J1c193cml0ZWIoZGV2LT5kZXZfYWRkclsyXSwgJmliLT5waHlzX2FkZHJbM10pOworCXNidXNfd3JpdGViKGRldi0+ZGV2X2FkZHJbNV0sICZpYi0+cGh5c19hZGRyWzRdKTsKKwlzYnVzX3dyaXRlYihkZXYtPmRldl9hZGRyWzRdLCAmaWItPnBoeXNfYWRkcls1XSk7CisKKwkvKiBTZXR1cCB0aGUgVHggcmluZyBlbnRyaWVzICovCisJZm9yIChpID0gMDsgaSA8PSBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlsZXB0ciA9IGxpYmJ1ZmZfb2Zmc2V0KHR4X2J1ZiwgaSk7CisJCXNidXNfd3JpdGV3KGxlcHRyLAkmaWItPmJ0eF9yaW5nIFtpXS50bWQwKTsKKwkJc2J1c193cml0ZWIobGVwdHIgPj4gMTYsJmliLT5idHhfcmluZyBbaV0udG1kMV9oYWRyKTsKKwkJc2J1c193cml0ZWIoMCwJCSZpYi0+YnR4X3JpbmcgW2ldLnRtZDFfYml0cyk7CisKKwkJLyogVGhlIG9uZXMgcmVxdWlyZWQgYnkgdG1kMiAqLworCQlzYnVzX3dyaXRldygweGYwMDAsCSZpYi0+YnR4X3JpbmcgW2ldLmxlbmd0aCk7CisJCXNidXNfd3JpdGV3KDAsCQkmaWItPmJ0eF9yaW5nIFtpXS5taXNjKTsKKwl9CisKKwkvKiBTZXR1cCB0aGUgUnggcmluZyBlbnRyaWVzICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCWxlcHRyID0gbGliYnVmZl9vZmZzZXQocnhfYnVmLCBpKTsKKworCQlzYnVzX3dyaXRldyhsZXB0ciwJJmliLT5icnhfcmluZyBbaV0ucm1kMCk7CisJCXNidXNfd3JpdGViKGxlcHRyID4+IDE2LCZpYi0+YnJ4X3JpbmcgW2ldLnJtZDFfaGFkcik7CisJCXNidXNfd3JpdGViKExFX1IxX09XTiwJJmliLT5icnhfcmluZyBbaV0ucm1kMV9iaXRzKTsKKwkJc2J1c193cml0ZXcoLVJYX0JVRkZfU0laRXwweGYwMDAsCisJCQkgICAgJmliLT5icnhfcmluZyBbaV0ubGVuZ3RoKTsKKwkJc2J1c193cml0ZXcoMCwJCSZpYi0+YnJ4X3JpbmcgW2ldLm1ibGVuZ3RoKTsKKwl9CisKKwkvKiBTZXR1cCB0aGUgaW5pdGlhbGl6YXRpb24gYmxvY2sgKi8KKyAgICAKKwkvKiBTZXR1cCByeCBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KKwlsZXB0ciA9IGxpYmRlc2Nfb2Zmc2V0KGJyeF9yaW5nLCAwKTsKKwlzYnVzX3dyaXRldygoTEFOQ0VfTE9HX1JYX0JVRkZFUlMgPDwgMTMpIHwgKGxlcHRyID4+IDE2KSwKKwkJICAgICZpYi0+cnhfbGVuKTsKKwlzYnVzX3dyaXRldyhsZXB0ciwgJmliLT5yeF9wdHIpOworICAgIAorCS8qIFNldHVwIHR4IGRlc2NyaXB0b3IgcG9pbnRlciAqLworCWxlcHRyID0gbGliZGVzY19vZmZzZXQoYnR4X3JpbmcsIDApOworCXNidXNfd3JpdGV3KChMQU5DRV9MT0dfVFhfQlVGRkVSUyA8PCAxMykgfCAobGVwdHIgPj4gMTYpLAorCQkgICAgJmliLT50eF9sZW4pOworCXNidXNfd3JpdGV3KGxlcHRyLCAmaWItPnR4X3B0cik7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcmVzdGFydF9sZWRtYShzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHApCit7CisJdTMyIGNzciA9IHNidXNfcmVhZGwobHAtPmRyZWdzICsgRE1BX0NTUik7CisKKwlpZiAoIShjc3IgJiBETUFfSE5ETF9FUlJPUikpIHsKKwkJLyogRS1DYWNoZSBkcmFpbmluZyAqLworCQl3aGlsZSAoc2J1c19yZWFkbChscC0+ZHJlZ3MgKyBETUFfQ1NSKSAmIERNQV9GSUZPX0lTRFJBSU4pCisJCQliYXJyaWVyKCk7CisJfQorCisJY3NyID0gc2J1c19yZWFkbChscC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwljc3IgJj0gfkRNQV9FX0JVUlNUUzsKKwlpZiAobHAtPmJ1cnN0X3NpemVzICYgRE1BX0JVUlNUMzIpCisJCWNzciB8PSBETUFfRV9CVVJTVDMyOworCWVsc2UKKwkJY3NyIHw9IERNQV9FX0JVUlNUMTY7CisKKwljc3IgfD0gKERNQV9EU0JMX1JEX0RSTiB8IERNQV9EU0JMX1dSX0lOViB8IERNQV9GSUZPX0lOVik7CisKKwlpZiAobHAtPnRwZSkKKwkJY3NyIHw9IERNQV9FTl9FTkVUQVVJOworCWVsc2UKKwkJY3NyICY9IH5ETUFfRU5fRU5FVEFVSTsKKwl1ZGVsYXkoMjApOworCXNidXNfd3JpdGVsKGNzciwgbHAtPmRyZWdzICsgRE1BX0NTUik7CisJdWRlbGF5KDIwMCk7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9yZXN0YXJ0X2xhbmNlKHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCkKK3sKKwl1MTYgcmVndmFsID0gMDsKKwlpbnQgaTsKKworCWlmIChscC0+ZHJlZ3MpCisJCWluaXRfcmVzdGFydF9sZWRtYShscCk7CisKKwlzYnVzX3dyaXRldyhMRV9DU1IwLAlscC0+bHJlZ3MgKyBSQVApOworCXNidXNfd3JpdGV3KExFX0MwX0lOSVQsCWxwLT5scmVncyArIFJEUCk7CisKKwkvKiBXYWl0IGZvciB0aGUgbGFuY2UgdG8gY29tcGxldGUgaW5pdGlhbGl6YXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJcmVndmFsID0gc2J1c19yZWFkdyhscC0+bHJlZ3MgKyBSRFApOworCisJCWlmIChyZWd2YWwgJiAoTEVfQzBfRVJSIHwgTEVfQzBfSURPTikpCisJCQlicmVhazsKKwkJYmFycmllcigpOworCX0KKwlpZiAoaSA9PSAxMDAgfHwgKHJlZ3ZhbCAmIExFX0MwX0VSUikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJMQU5DRSB1bm9wZW5lZCBhZnRlciAlZCB0aWNrcywgY3NyMD0lNC40eC5cbiIsCisJCSAgICAgICBpLCByZWd2YWwpOworCQlpZiAobHAtPmRyZWdzKQorCQkJcHJpbnRrKCJkY3NyPSU4Ljh4XG4iLCBzYnVzX3JlYWRsKGxwLT5kcmVncyArIERNQV9DU1IpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIENsZWFyIElET04gYnkgd3JpdGluZyBhICIxIiwgZW5hYmxlIGludGVycnVwdHMgYW5kIHN0YXJ0IGxhbmNlICovCisJc2J1c193cml0ZXcoTEVfQzBfSURPTiwJCQlscC0+bHJlZ3MgKyBSRFApOworCXNidXNfd3JpdGV3KExFX0MwX0lORUEgfCBMRV9DMF9TVFJULAlscC0+bHJlZ3MgKyBSRFApOworCisJaWYgKGxwLT5kcmVncykgeworCQl1MzIgY3NyID0gc2J1c19yZWFkbChscC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKworCQljc3IgfD0gRE1BX0lOVF9FTkFCOworCQlzYnVzX3dyaXRlbChjc3IsIGxwLT5kcmVncyArIERNQV9DU1IpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsYW5jZV9yeF9kdm1hKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWIgPSBscC0+aW5pdF9ibG9ja19tZW07CisJc3RydWN0IGxhbmNlX3J4X2Rlc2MgKnJkOworCXU4IGJpdHM7CisJaW50IGxlbiwgZW50cnkgPSBscC0+cnhfbmV3OworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlmb3IgKHJkID0gJmliLT5icnhfcmluZyBbZW50cnldOworCSAgICAgISgoYml0cyA9IHJkLT5ybWQxX2JpdHMpICYgTEVfUjFfT1dOKTsKKwkgICAgIHJkID0gJmliLT5icnhfcmluZyBbZW50cnldKSB7CisKKwkJLyogV2UgZ290IGFuIGluY29tcGxldGUgZnJhbWU/ICovCisJCWlmICgoYml0cyAmIExFX1IxX1BPSykgIT0gTEVfUjFfUE9LKSB7CisJCQlscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJfSBlbHNlIGlmIChiaXRzICYgTEVfUjFfRVJSKSB7CisJCQkvKiBDb3VudCBvbmx5IHRoZSBlbmQgZnJhbWUgYXMgYSByeCBlcnJvciwKKwkJCSAqIG5vdCB0aGUgYmVnaW5uaW5nCisJCQkgKi8KKwkJCWlmIChiaXRzICYgTEVfUjFfQlVGKSBscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCWlmIChiaXRzICYgTEVfUjFfQ1JDKSBscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJaWYgKGJpdHMgJiBMRV9SMV9PRkwpIGxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJaWYgKGJpdHMgJiBMRV9SMV9GUkEpIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWlmIChiaXRzICYgTEVfUjFfRU9QKSBscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCX0gZWxzZSB7CisJCQlsZW4gPSAocmQtPm1ibGVuZ3RoICYgMHhmZmYpIC0gNDsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgMik7CisKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZGVmZXJyaW5nIHBhY2tldC5cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlyZC0+bWJsZW5ndGggPSAwOworCQkJCXJkLT5ybWQxX2JpdHMgPSBMRV9SMV9PV047CisJCQkJbHAtPnJ4X25ldyA9IFJYX05FWFQoZW50cnkpOworCQkJCXJldHVybjsKKwkJCX0KKwkgICAgCisJCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCisJCQlza2ItPmRldiA9IGRldjsKKwkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CQkvKiAxNiBieXRlIGFsaWduICovCisJCQlza2JfcHV0KHNrYiwgbGVuKTsJCS8qIG1ha2Ugcm9vbSAqLworCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsCisJCQkJCSAodW5zaWduZWQgY2hhciAqKSYoaWItPnJ4X2J1ZiBbZW50cnldWzBdKSwKKwkJCQkJIGxlbiwgMCk7CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJbmV0aWZfcngoc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQlscC0+c3RhdHMucnhfcGFja2V0cysrOworCQl9CisKKwkJLyogUmV0dXJuIHRoZSBwYWNrZXQgdG8gdGhlIHBvb2wgKi8KKwkJcmQtPm1ibGVuZ3RoID0gMDsKKwkJcmQtPnJtZDFfYml0cyA9IExFX1IxX09XTjsKKwkJZW50cnkgPSBSWF9ORVhUKGVudHJ5KTsKKwl9CisKKwlscC0+cnhfbmV3ID0gZW50cnk7Cit9CisKK3N0YXRpYyB2b2lkIGxhbmNlX3R4X2R2bWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYiA9IGxwLT5pbml0X2Jsb2NrX21lbTsKKwlpbnQgaSwgajsKKworCXNwaW5fbG9jaygmbHAtPmxvY2spOworCisJaiA9IGxwLT50eF9vbGQ7CisJZm9yIChpID0gajsgaSAhPSBscC0+dHhfbmV3OyBpID0gaikgeworCQlzdHJ1Y3QgbGFuY2VfdHhfZGVzYyAqdGQgPSAmaWItPmJ0eF9yaW5nIFtpXTsKKwkJdTggYml0cyA9IHRkLT50bWQxX2JpdHM7CisKKwkJLyogSWYgd2UgaGl0IGEgcGFja2V0IG5vdCBvd25lZCBieSB1cywgc3RvcCAqLworCQlpZiAoYml0cyAmIExFX1QxX09XTikKKwkJCWJyZWFrOworCQkKKwkJaWYgKGJpdHMgJiBMRV9UMV9FUlIpIHsKKwkJCXUxNiBzdGF0dXMgPSB0ZC0+bWlzYzsKKwkgICAgCisJCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgTEVfVDNfUlRZKSAgbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgTEVfVDNfTENPTCkgbHAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKworCQkJaWYgKHN0YXR1cyAmIExFX1QzX0NMT1MpIHsKKwkJCQlscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQlpZiAobHAtPmF1dG9fc2VsZWN0KSB7CisJCQkJCWxwLT50cGUgPSAxIC0gbHAtPnRwZTsKKwkJCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogQ2FycmllciBMb3N0LCB0cnlpbmcgJXNcbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUsIGxwLT50cGU/IlRQRSI6IkFVSSIpOworCQkJCQlTVE9QX0xBTkNFKGxwKTsKKwkJCQkJbHAtPmluaXRfcmluZyhkZXYpOworCQkJCQlsb2FkX2NzcnMobHApOworCQkJCQlpbml0X3Jlc3RhcnRfbGFuY2UobHApOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9CisKKwkJCS8qIEJ1ZmZlciBlcnJvcnMgYW5kIHVuZGVyZmxvd3MgdHVybiBvZmYgdGhlCisJCQkgKiB0cmFuc21pdHRlciwgcmVzdGFydCB0aGUgYWRhcHRlci4KKwkJCSAqLworCQkJaWYgKHN0YXR1cyAmIChMRV9UM19CVUZ8TEVfVDNfVUZMKSkgeworCQkJCWxwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVHg6IEVSUl9CVUZ8RVJSX1VGTCwgcmVzdGFydGluZ1xuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCQlTVE9QX0xBTkNFKGxwKTsKKwkJCQlscC0+aW5pdF9yaW5nKGRldik7CisJCQkJbG9hZF9jc3JzKGxwKTsKKwkJCQlpbml0X3Jlc3RhcnRfbGFuY2UobHApOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9IGVsc2UgaWYgKChiaXRzICYgTEVfVDFfUE9LKSA9PSBMRV9UMV9QT0spIHsKKwkJCS8qCisJCQkgKiBTbyB3ZSBkb24ndCBjb3VudCB0aGUgcGFja2V0IG1vcmUgdGhhbiBvbmNlLgorCQkJICovCisJCQl0ZC0+dG1kMV9iaXRzID0gYml0cyAmIH4oTEVfVDFfUE9LKTsKKworCQkJLyogT25lIGNvbGxpc2lvbiBiZWZvcmUgcGFja2V0IHdhcyBzZW50LiAqLworCQkJaWYgKGJpdHMgJiBMRV9UMV9FT05FKQorCQkJCWxwLT5zdGF0cy5jb2xsaXNpb25zKys7CisKKwkJCS8qIE1vcmUgdGhhbiBvbmUgY29sbGlzaW9uLCBiZSBvcHRpbWlzdGljLiAqLworCQkJaWYgKGJpdHMgJiBMRV9UMV9FTU9SRSkKKwkJCQlscC0+c3RhdHMuY29sbGlzaW9ucyArPSAyOworCisJCQlscC0+c3RhdHMudHhfcGFja2V0cysrOworCQl9CisJCisJCWogPSBUWF9ORVhUKGopOworCX0KKwlscC0+dHhfb2xkID0gajsKK291dDoKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCisJICAgIFRYX0JVRkZTX0FWQUlMID4gMCkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgbGFuY2VfcGlvY29weV90b19za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgdm9pZCBfX2lvbWVtICpwaW9idWYsIGludCBsZW4pCit7CisJdTE2ICpwMTYgPSAodTE2ICopIHNrYi0+ZGF0YTsKKwl1MzIgKnAzMjsKKwl1OCAqcDg7CisJdm9pZCBfX2lvbWVtICpwYnVmID0gcGlvYnVmOworCisJLyogV2Uga25vdyBoZXJlIHRoYXQgYm90aCBzcmMgYW5kIGRlc3QgYXJlIG9uIGEgMTZiaXQgYm91bmRhcnkuICovCisJKnAxNisrID0gc2J1c19yZWFkdyhwYnVmKTsKKwlwMzIgPSAodTMyICopIHAxNjsKKwlwYnVmICs9IDI7CisJbGVuIC09IDI7CisKKwl3aGlsZSAobGVuID49IDQpIHsKKwkJKnAzMisrID0gc2J1c19yZWFkbChwYnVmKTsKKwkJcGJ1ZiArPSA0OworCQlsZW4gLT0gNDsKKwl9CisJcDggPSAodTggKikgcDMyOworCWlmIChsZW4gPj0gMikgeworCQlwMTYgPSAodTE2ICopIHAzMjsKKwkJKnAxNisrID0gc2J1c19yZWFkdyhwYnVmKTsKKwkJcGJ1ZiArPSAyOworCQlsZW4gLT0gMjsKKwkJcDggPSAodTggKikgcDE2OworCX0KKwlpZiAobGVuID49IDEpCisJCSpwOCA9IHNidXNfcmVhZGIocGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIGxhbmNlX3J4X3BpbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgX19pb21lbSAqaWIgPSBscC0+aW5pdF9ibG9ja19pb21lbTsKKwlzdHJ1Y3QgbGFuY2VfcnhfZGVzYyBfX2lvbWVtICpyZDsKKwl1bnNpZ25lZCBjaGFyIGJpdHM7CisJaW50IGxlbiwgZW50cnk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWVudHJ5ID0gbHAtPnJ4X25ldzsKKwlmb3IgKHJkID0gJmliLT5icnhfcmluZyBbZW50cnldOworCSAgICAgISgoYml0cyA9IHNidXNfcmVhZGIoJnJkLT5ybWQxX2JpdHMpKSAmIExFX1IxX09XTik7CisJICAgICByZCA9ICZpYi0+YnJ4X3JpbmcgW2VudHJ5XSkgeworCisJCS8qIFdlIGdvdCBhbiBpbmNvbXBsZXRlIGZyYW1lPyAqLworCQlpZiAoKGJpdHMgJiBMRV9SMV9QT0spICE9IExFX1IxX1BPSykgeworCQkJbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCX0gZWxzZSBpZiAoYml0cyAmIExFX1IxX0VSUikgeworCQkJLyogQ291bnQgb25seSB0aGUgZW5kIGZyYW1lIGFzIGEgcnggZXJyb3IsCisJCQkgKiBub3QgdGhlIGJlZ2lubmluZworCQkJICovCisJCQlpZiAoYml0cyAmIExFX1IxX0JVRikgbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQlpZiAoYml0cyAmIExFX1IxX0NSQykgbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChiaXRzICYgTEVfUjFfT0ZMKSBscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCWlmIChiaXRzICYgTEVfUjFfRlJBKSBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAoYml0cyAmIExFX1IxX0VPUCkgbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJbGVuID0gKHNidXNfcmVhZHcoJnJkLT5tYmxlbmd0aCkgJiAweGZmZikgLSA0OworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyAyKTsKKworCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1lbW9yeSBzcXVlZXplLCBkZWZlcnJpbmcgcGFja2V0LlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCXNidXNfd3JpdGV3KDAsICZyZC0+bWJsZW5ndGgpOworCQkJCXNidXNfd3JpdGViKExFX1IxX09XTiwgJnJkLT5ybWQxX2JpdHMpOworCQkJCWxwLT5yeF9uZXcgPSBSWF9ORVhUKGVudHJ5KTsKKwkJCQlyZXR1cm47CisJCQl9CisJICAgIAorCQkJbHAtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKworCQkJc2tiLT5kZXYgPSBkZXY7CisJCQlza2JfcmVzZXJ2ZSAoc2tiLCAyKTsJCS8qIDE2IGJ5dGUgYWxpZ24gKi8KKwkJCXNrYl9wdXQoc2tiLCBsZW4pOwkJLyogbWFrZSByb29tICovCisJCQlsYW5jZV9waW9jb3B5X3RvX3NrYihza2IsICYoaWItPnJ4X2J1ZltlbnRyeV1bMF0pLCBsZW4pOworCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJfQorCisJCS8qIFJldHVybiB0aGUgcGFja2V0IHRvIHRoZSBwb29sICovCisJCXNidXNfd3JpdGV3KDAsICZyZC0+bWJsZW5ndGgpOworCQlzYnVzX3dyaXRlYihMRV9SMV9PV04sICZyZC0+cm1kMV9iaXRzKTsKKwkJZW50cnkgPSBSWF9ORVhUKGVudHJ5KTsKKwl9CisKKwlscC0+cnhfbmV3ID0gZW50cnk7Cit9CisKK3N0YXRpYyB2b2lkIGxhbmNlX3R4X3BpbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgX19pb21lbSAqaWIgPSBscC0+aW5pdF9ibG9ja19pb21lbTsKKwlpbnQgaSwgajsKKworCXNwaW5fbG9jaygmbHAtPmxvY2spOworCisJaiA9IGxwLT50eF9vbGQ7CisJZm9yIChpID0gajsgaSAhPSBscC0+dHhfbmV3OyBpID0gaikgeworCQlzdHJ1Y3QgbGFuY2VfdHhfZGVzYyBfX2lvbWVtICp0ZCA9ICZpYi0+YnR4X3JpbmcgW2ldOworCQl1OCBiaXRzID0gc2J1c19yZWFkYigmdGQtPnRtZDFfYml0cyk7CisKKwkJLyogSWYgd2UgaGl0IGEgcGFja2V0IG5vdCBvd25lZCBieSB1cywgc3RvcCAqLworCQlpZiAoYml0cyAmIExFX1QxX09XTikKKwkJCWJyZWFrOworCQkKKwkJaWYgKGJpdHMgJiBMRV9UMV9FUlIpIHsKKwkJCXUxNiBzdGF0dXMgPSBzYnVzX3JlYWR3KCZ0ZC0+bWlzYyk7CisJICAgIAorCQkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIExFX1QzX1JUWSkgIGxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIExFX1QzX0xDT0wpIGxwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisKKwkJCWlmIChzdGF0dXMgJiBMRV9UM19DTE9TKSB7CisJCQkJbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJaWYgKGxwLT5hdXRvX3NlbGVjdCkgeworCQkJCQlscC0+dHBlID0gMSAtIGxwLT50cGU7CisJCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IENhcnJpZXIgTG9zdCwgdHJ5aW5nICVzXG4iLAorCQkJCQkgICAgICAgZGV2LT5uYW1lLCBscC0+dHBlPyJUUEUiOiJBVUkiKTsKKwkJCQkJU1RPUF9MQU5DRShscCk7CisJCQkJCWxwLT5pbml0X3JpbmcoZGV2KTsKKwkJCQkJbG9hZF9jc3JzKGxwKTsKKwkJCQkJaW5pdF9yZXN0YXJ0X2xhbmNlKGxwKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCisJCQkvKiBCdWZmZXIgZXJyb3JzIGFuZCB1bmRlcmZsb3dzIHR1cm4gb2ZmIHRoZQorCQkJICogdHJhbnNtaXR0ZXIsIHJlc3RhcnQgdGhlIGFkYXB0ZXIuCisJCQkgKi8KKwkJCWlmIChzdGF0dXMgJiAoTEVfVDNfQlVGfExFX1QzX1VGTCkpIHsKKwkJCQlscC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFR4OiBFUlJfQlVGfEVSUl9VRkwsIHJlc3RhcnRpbmdcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJU1RPUF9MQU5DRShscCk7CisJCQkJbHAtPmluaXRfcmluZyhkZXYpOworCQkJCWxvYWRfY3NycyhscCk7CisJCQkJaW5pdF9yZXN0YXJ0X2xhbmNlKGxwKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfSBlbHNlIGlmICgoYml0cyAmIExFX1QxX1BPSykgPT0gTEVfVDFfUE9LKSB7CisJCQkvKgorCQkJICogU28gd2UgZG9uJ3QgY291bnQgdGhlIHBhY2tldCBtb3JlIHRoYW4gb25jZS4KKwkJCSAqLworCQkJc2J1c193cml0ZWIoYml0cyAmIH4oTEVfVDFfUE9LKSwgJnRkLT50bWQxX2JpdHMpOworCisJCQkvKiBPbmUgY29sbGlzaW9uIGJlZm9yZSBwYWNrZXQgd2FzIHNlbnQuICovCisJCQlpZiAoYml0cyAmIExFX1QxX0VPTkUpCisJCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKworCQkJLyogTW9yZSB0aGFuIG9uZSBjb2xsaXNpb24sIGJlIG9wdGltaXN0aWMuICovCisJCQlpZiAoYml0cyAmIExFX1QxX0VNT1JFKQorCQkJCWxwLT5zdGF0cy5jb2xsaXNpb25zICs9IDI7CisKKwkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCX0KKwkKKwkJaiA9IFRYX05FWFQoaik7CisJfQorCWxwLT50eF9vbGQgPSBqOworCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJgorCSAgICBUWF9CVUZGU19BVkFJTCA+IDApCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK291dDoKKwlzcGluX3VubG9jaygmbHAtPmxvY2spOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbGFuY2VfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBjc3IwOworICAgIAorCXNidXNfd3JpdGV3KExFX0NTUjAsIGxwLT5scmVncyArIFJBUCk7CisJY3NyMCA9IHNidXNfcmVhZHcobHAtPmxyZWdzICsgUkRQKTsKKworCS8qIEFja25vd2xlZGdlIGFsbCB0aGUgaW50ZXJydXB0IHNvdXJjZXMgQVNBUCAqLworCXNidXNfd3JpdGV3KGNzcjAgJiAoTEVfQzBfSU5UUiB8IExFX0MwX1RJTlQgfCBMRV9DMF9SSU5UKSwKKwkJICAgIGxwLT5scmVncyArIFJEUCk7CisgICAgCisJaWYgKChjc3IwICYgTEVfQzBfRVJSKSAhPSAwKSB7CisJCS8qIENsZWFyIHRoZSBlcnJvciBjb25kaXRpb24gKi8KKwkJc2J1c193cml0ZXcoKExFX0MwX0JBQkwgfCBMRV9DMF9FUlIgfCBMRV9DMF9NSVNTIHwKKwkJCSAgICAgTEVfQzBfQ0VSUiB8IExFX0MwX01FUlIpLAorCQkJICAgIGxwLT5scmVncyArIFJEUCk7CisJfQorICAgIAorCWlmIChjc3IwICYgTEVfQzBfUklOVCkKKwkJbHAtPnJ4KGRldik7CisgICAgCisJaWYgKGNzcjAgJiBMRV9DMF9USU5UKQorCQlscC0+dHgoZGV2KTsKKyAgICAKKwlpZiAoY3NyMCAmIExFX0MwX0JBQkwpCisJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKworCWlmIChjc3IwICYgTEVfQzBfTUlTUykKKwkJbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCisJaWYgKGNzcjAgJiBMRV9DMF9NRVJSKSB7CisJCWlmIChscC0+ZHJlZ3MpIHsKKwkJCXUzMiBhZGRyID0gc2J1c19yZWFkbChscC0+ZHJlZ3MgKyBETUFfQUREUik7CisKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE1lbW9yeSBlcnJvciwgc3RhdHVzICUwNHgsIGFkZHIgJTA2eFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGNzcjAsIGFkZHIgJiAweGZmZmZmZik7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBNZW1vcnkgZXJyb3IsIHN0YXR1cyAlMDR4XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgY3NyMCk7CisJCX0KKworCQlzYnVzX3dyaXRldyhMRV9DMF9TVE9QLCBscC0+bHJlZ3MgKyBSRFApOworCisJCWlmIChscC0+ZHJlZ3MpIHsKKwkJCXUzMiBkbWFfY3NyID0gc2J1c19yZWFkbChscC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKworCQkJZG1hX2NzciB8PSBETUFfRklGT19JTlY7CisJCQlzYnVzX3dyaXRlbChkbWFfY3NyLCBscC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwkJfQorCisJCWxwLT5pbml0X3JpbmcoZGV2KTsKKwkJbG9hZF9jc3JzKGxwKTsKKwkJaW5pdF9yZXN0YXJ0X2xhbmNlKGxwKTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KKworCXNidXNfd3JpdGV3KExFX0MwX0lORUEsIGxwLT5scmVncyArIFJEUCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIEJ1aWxkIGEgZmFrZSBuZXR3b3JrIHBhY2tldCBhbmQgc2VuZCBpdCB0byBvdXJzZWx2ZXMuICovCitzdGF0aWMgdm9pZCBidWlsZF9mYWtlX3BhY2tldChzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxwLT5kZXY7CisJaW50IGksIGVudHJ5OworCisJZW50cnkgPSBscC0+dHhfbmV3ICYgVFhfUklOR19NT0RfTUFTSzsKKwlpZiAobHAtPnBpb19idWZmZXIpIHsKKwkJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgX19pb21lbSAqaWIgPSBscC0+aW5pdF9ibG9ja19pb21lbTsKKwkJdTE2IF9faW9tZW0gKnBhY2tldCA9ICh1MTYgX19pb21lbSAqKSAmKGliLT50eF9idWZbZW50cnldWzBdKTsKKwkJc3RydWN0IGV0aGhkciBfX2lvbWVtICpldGggPSAoc3RydWN0IGV0aGhkciBfX2lvbWVtICopIHBhY2tldDsKKwkJZm9yIChpID0gMDsgaSA8IChFVEhfWkxFTiAvIHNpemVvZih1MTYpKTsgaSsrKQorCQkJc2J1c193cml0ZXcoMCwgJnBhY2tldFtpXSk7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJCXNidXNfd3JpdGViKGRldi0+ZGV2X2FkZHJbaV0sICZldGgtPmhfZGVzdFtpXSk7CisJCQlzYnVzX3dyaXRlYihkZXYtPmRldl9hZGRyW2ldLCAmZXRoLT5oX3NvdXJjZVtpXSk7CisJCX0KKwkJc2J1c193cml0ZXcoKC1FVEhfWkxFTikgfCAweGYwMDAsICZpYi0+YnR4X3JpbmdbZW50cnldLmxlbmd0aCk7CisJCXNidXNfd3JpdGV3KDAsICZpYi0+YnR4X3JpbmdbZW50cnldLm1pc2MpOworCQlzYnVzX3dyaXRlYihMRV9UMV9QT0t8TEVfVDFfT1dOLCAmaWItPmJ0eF9yaW5nW2VudHJ5XS50bWQxX2JpdHMpOworCX0gZWxzZSB7CisJCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYiA9IGxwLT5pbml0X2Jsb2NrX21lbTsKKwkJdTE2ICpwYWNrZXQgPSAodTE2ICopICYoaWItPnR4X2J1ZltlbnRyeV1bMF0pOworCQlzdHJ1Y3QgZXRoaGRyICpldGggPSAoc3RydWN0IGV0aGhkciAqKSBwYWNrZXQ7CisJCW1lbXNldChwYWNrZXQsIDAsIEVUSF9aTEVOKTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQkJZXRoLT5oX2Rlc3RbaV0gPSBkZXYtPmRldl9hZGRyW2ldOworCQkJZXRoLT5oX3NvdXJjZVtpXSA9IGRldi0+ZGV2X2FkZHJbaV07CisJCX0KKwkJaWItPmJ0eF9yaW5nW2VudHJ5XS5sZW5ndGggPSAoLUVUSF9aTEVOKSB8IDB4ZjAwMDsKKwkJaWItPmJ0eF9yaW5nW2VudHJ5XS5taXNjID0gMDsKKwkJaWItPmJ0eF9yaW5nW2VudHJ5XS50bWQxX2JpdHMgPSAoTEVfVDFfUE9LfExFX1QxX09XTik7CisJfQorCWxwLT50eF9uZXcgPSBUWF9ORVhUKGVudHJ5KTsKK30KKworc3RydWN0IG5ldF9kZXZpY2UgKmxhc3RfZGV2OworCitzdGF0aWMgaW50IGxhbmNlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBzdGF0dXMgPSAwOworCisJbGFzdF9kZXYgPSBkZXY7CisKKwlTVE9QX0xBTkNFKGxwKTsKKworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgJmxhbmNlX2ludGVycnVwdCwgU0FfU0hJUlEsCisJCQlsYW5jZXN0ciwgKHZvaWQgKikgZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIkxhbmNlOiBDYW4ndCBnZXQgaXJxICVzXG4iLCBfX2lycV9pdG9hKGRldi0+aXJxKSk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCS8qIE9uIHRoZSA0bSwgc2V0dXAgdGhlIGxlZG1hIHRvIHByb3ZpZGUgdGhlIHVwcGVyIGJpdHMgZm9yIGJ1ZmZlcnMgKi8KKwlpZiAobHAtPmRyZWdzKSB7CisJCXUzMiByZWd2YWwgPSBscC0+aW5pdF9ibG9ja19kdm1hICYgMHhmZjAwMDAwMDsKKworCQlzYnVzX3dyaXRlbChyZWd2YWwsIGxwLT5kcmVncyArIERNQV9URVNUKTsKKwl9CisKKwkvKiBTZXQgbW9kZSBhbmQgY2xlYXIgbXVsdGljYXN0IGZpbHRlciBvbmx5IGF0IGRldmljZSBvcGVuLAorCSAqIHNvIHRoYXQgbGFuY2VfaW5pdF9yaW5nKCkgY2FsbGVkIGF0IGFueSBlcnJvciB3aWxsIG5vdAorCSAqIGZvcmdldCBtdWx0aWNhc3QgZmlsdGVycy4KKwkgKgorCSAqIEJUVyBpdCBpcyBjb21tb24gYnVnIGluIGFsbCBsYW5jZSBkcml2ZXJzISAtLUFOSworCSAqLworCWlmIChscC0+cGlvX2J1ZmZlcikgeworCQlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayBfX2lvbWVtICppYiA9IGxwLT5pbml0X2Jsb2NrX2lvbWVtOworCQlzYnVzX3dyaXRldygwLCAmaWItPm1vZGUpOworCQlzYnVzX3dyaXRlbCgwLCAmaWItPmZpbHRlclswXSk7CisJCXNidXNfd3JpdGVsKDAsICZpYi0+ZmlsdGVyWzFdKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWIgPSBscC0+aW5pdF9ibG9ja19tZW07CisJCWliLT5tb2RlID0gMDsKKwkJaWItPmZpbHRlciBbMF0gPSAwOworCQlpYi0+ZmlsdGVyIFsxXSA9IDA7CisJfQorCisJbHAtPmluaXRfcmluZyhkZXYpOworCWxvYWRfY3NycyhscCk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJc3RhdHVzID0gaW5pdF9yZXN0YXJ0X2xhbmNlKGxwKTsKKwlpZiAoIXN0YXR1cyAmJiBscC0+YXV0b19zZWxlY3QpIHsKKwkJYnVpbGRfZmFrZV9wYWNrZXQobHApOworCQlzYnVzX3dyaXRldyhMRV9DMF9JTkVBIHwgTEVfQzBfVERNRCwgbHAtPmxyZWdzICsgUkRQKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGxhbmNlX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlkZWxfdGltZXJfc3luYygmbHAtPm11bHRpY2FzdF90aW1lcik7CisKKwlTVE9QX0xBTkNFKGxwKTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCAodm9pZCAqKSBkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhbmNlX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgc3RhdHVzOworICAgIAorCVNUT1BfTEFOQ0UobHApOworCisJLyogT24gdGhlIDRtLCByZXNldCB0aGUgZG1hIHRvbyAqLworCWlmIChscC0+ZHJlZ3MpIHsKKwkJdTMyIGNzciwgYWRkcjsKKworCQlwcmludGsoS0VSTl9FUlIgInJlc2V0dGluZyBsZWRtYVxuIik7CisJCWNzciA9IHNidXNfcmVhZGwobHAtPmRyZWdzICsgRE1BX0NTUik7CisJCXNidXNfd3JpdGVsKGNzciB8IERNQV9SU1RfRU5FVCwgbHAtPmRyZWdzICsgRE1BX0NTUik7CisJCXVkZWxheSgyMDApOworCQlzYnVzX3dyaXRlbChjc3IgJiB+RE1BX1JTVF9FTkVULCBscC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKworCQlhZGRyID0gbHAtPmluaXRfYmxvY2tfZHZtYSAmIDB4ZmYwMDAwMDA7CisJCXNidXNfd3JpdGVsKGFkZHIsIGxwLT5kcmVncyArIERNQV9URVNUKTsKKwl9CisJbHAtPmluaXRfcmluZyhkZXYpOworCWxvYWRfY3NycyhscCk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJc3RhdHVzID0gaW5pdF9yZXN0YXJ0X2xhbmNlKGxwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBsYW5jZV9waW9jb3B5X2Zyb21fc2tiKHZvaWQgX19pb21lbSAqZGVzdCwgdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgbGVuKQoreworCXZvaWQgX19pb21lbSAqcGlvYnVmID0gZGVzdDsKKwl1MzIgKnAzMjsKKwl1MTYgKnAxNjsKKwl1OCAqcDg7CisKKwlzd2l0Y2ggKCh1bnNpZ25lZCBsb25nKXNyYyAmIDB4MykgeworCWNhc2UgMDoKKwkJcDMyID0gKHUzMiAqKSBzcmM7CisJCXdoaWxlIChsZW4gPj0gNCkgeworCQkJc2J1c193cml0ZWwoKnAzMiwgcGlvYnVmKTsKKwkJCXAzMisrOworCQkJcGlvYnVmICs9IDQ7CisJCQlsZW4gLT0gNDsKKwkJfQorCQlzcmMgPSAoY2hhciAqKSBwMzI7CisJCWJyZWFrOworCWNhc2UgMToKKwljYXNlIDM6CisJCXA4ID0gKHU4ICopIHNyYzsKKwkJd2hpbGUgKGxlbiA+PSA0KSB7CisJCQl1MzIgdmFsOworCisJCQl2YWwgID0gcDhbMF0gPDwgMjQ7CisJCQl2YWwgfD0gcDhbMV0gPDwgMTY7CisJCQl2YWwgfD0gcDhbMl0gPDwgODsKKwkJCXZhbCB8PSBwOFszXTsKKwkJCXNidXNfd3JpdGVsKHZhbCwgcGlvYnVmKTsKKwkJCXA4ICs9IDQ7CisJCQlwaW9idWYgKz0gNDsKKwkJCWxlbiAtPSA0OworCQl9CisJCXNyYyA9IChjaGFyICopIHA4OworCQlicmVhazsKKwljYXNlIDI6CisJCXAxNiA9ICh1MTYgKikgc3JjOworCQl3aGlsZSAobGVuID49IDQpIHsKKwkJCXUzMiB2YWwgPSBwMTZbMF08PDE2IHwgcDE2WzFdOworCQkJc2J1c193cml0ZWwodmFsLCBwaW9idWYpOworCQkJcDE2ICs9IDI7CisJCQlwaW9idWYgKz0gNDsKKwkJCWxlbiAtPSA0OworCQl9CisJCXNyYyA9IChjaGFyICopIHAxNjsKKwkJYnJlYWs7CisJfTsKKwlpZiAobGVuID49IDIpIHsKKwkJdTE2IHZhbCA9IHNyY1swXSA8PCA4IHwgc3JjWzFdOworCQlzYnVzX3dyaXRldyh2YWwsIHBpb2J1Zik7CisJCXNyYyArPSAyOworCQlwaW9idWYgKz0gMjsKKwkJbGVuIC09IDI7CisJfQorCWlmIChsZW4gPj0gMSkKKwkJc2J1c193cml0ZWIoc3JjWzBdLCBwaW9idWYpOworfQorCitzdGF0aWMgdm9pZCBsYW5jZV9waW96ZXJvKHZvaWQgX19pb21lbSAqZGVzdCwgaW50IGxlbikKK3sKKwl2b2lkIF9faW9tZW0gKnBpb2J1ZiA9IGRlc3Q7CisKKwlpZiAoKHVuc2lnbmVkIGxvbmcpcGlvYnVmICYgMSkgeworCQlzYnVzX3dyaXRlYigwLCBwaW9idWYpOworCQlwaW9idWYgKz0gMTsKKwkJbGVuIC09IDE7CisJCWlmIChsZW4gPT0gMCkKKwkJCXJldHVybjsKKwl9CisJaWYgKGxlbiA9PSAxKSB7CisJCXNidXNfd3JpdGViKDAsIHBpb2J1Zik7CisJCXJldHVybjsKKwl9CisJaWYgKCh1bnNpZ25lZCBsb25nKXBpb2J1ZiAmIDIpIHsKKwkJc2J1c193cml0ZXcoMCwgcGlvYnVmKTsKKwkJcGlvYnVmICs9IDI7CisJCWxlbiAtPSAyOworCQlpZiAobGVuID09IDApCisJCQlyZXR1cm47CisJfQorCXdoaWxlIChsZW4gPj0gNCkgeworCQlzYnVzX3dyaXRlbCgwLCBwaW9idWYpOworCQlwaW9idWYgKz0gNDsKKwkJbGVuIC09IDQ7CisJfQorCWlmIChsZW4gPj0gMikgeworCQlzYnVzX3dyaXRldygwLCBwaW9idWYpOworCQlwaW9idWYgKz0gMjsKKwkJbGVuIC09IDI7CisJfQorCWlmIChsZW4gPj0gMSkKKwkJc2J1c193cml0ZWIoMCwgcGlvYnVmKTsKK30KKworc3RhdGljIHZvaWQgbGFuY2VfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlwcmludGsoS0VSTl9FUlIgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlMDR4LCByZXNldFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBzYnVzX3JlYWR3KGxwLT5scmVncyArIFJEUCkpOworCWxhbmNlX3Jlc2V0KGRldik7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW50IGxhbmNlX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlbnRyeSwgc2tibGVuLCBsZW47CisKKwlza2JsZW4gPSBza2ItPmxlbjsKKworCWxlbiA9IChza2JsZW4gPD0gRVRIX1pMRU4pID8gRVRIX1pMRU4gOiBza2JsZW47CisKKwlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CisKKwlscC0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuOworCisJZW50cnkgPSBscC0+dHhfbmV3ICYgVFhfUklOR19NT0RfTUFTSzsKKwlpZiAobHAtPnBpb19idWZmZXIpIHsKKwkJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgX19pb21lbSAqaWIgPSBscC0+aW5pdF9ibG9ja19pb21lbTsKKwkJc2J1c193cml0ZXcoKC1sZW4pIHwgMHhmMDAwLCAmaWItPmJ0eF9yaW5nW2VudHJ5XS5sZW5ndGgpOworCQlzYnVzX3dyaXRldygwLCAmaWItPmJ0eF9yaW5nW2VudHJ5XS5taXNjKTsKKwkJbGFuY2VfcGlvY29weV9mcm9tX3NrYigmaWItPnR4X2J1ZltlbnRyeV1bMF0sIHNrYi0+ZGF0YSwgc2tibGVuKTsKKwkJaWYgKGxlbiAhPSBza2JsZW4pCisJCQlsYW5jZV9waW96ZXJvKCZpYi0+dHhfYnVmW2VudHJ5XVtza2JsZW5dLCBsZW4gLSBza2JsZW4pOworCQlzYnVzX3dyaXRlYihMRV9UMV9QT0sgfCBMRV9UMV9PV04sICZpYi0+YnR4X3JpbmdbZW50cnldLnRtZDFfYml0cyk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGxhbmNlX2luaXRfYmxvY2sgKmliID0gbHAtPmluaXRfYmxvY2tfbWVtOworCQlpYi0+YnR4X3JpbmcgW2VudHJ5XS5sZW5ndGggPSAoLWxlbikgfCAweGYwMDA7CisJCWliLT5idHhfcmluZyBbZW50cnldLm1pc2MgPSAwOworCQltZW1jcHkoKGNoYXIgKikmaWItPnR4X2J1ZiBbZW50cnldWzBdLCBza2ItPmRhdGEsIHNrYmxlbik7CisJCWlmIChsZW4gIT0gc2tibGVuKQorCQkJbWVtc2V0KChjaGFyICopICZpYi0+dHhfYnVmIFtlbnRyeV1bc2tibGVuXSwgMCwgbGVuIC0gc2tibGVuKTsKKwkJaWItPmJ0eF9yaW5nIFtlbnRyeV0udG1kMV9iaXRzID0gKExFX1QxX1BPSyB8IExFX1QxX09XTik7CisJfQorCisJbHAtPnR4X25ldyA9IFRYX05FWFQoZW50cnkpOworCisJaWYgKFRYX0JVRkZTX0FWQUlMIDw9IDApCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIEtpY2sgdGhlIGxhbmNlOiB0cmFuc21pdCBub3cgKi8KKwlzYnVzX3dyaXRldyhMRV9DMF9JTkVBIHwgTEVfQzBfVERNRCwgbHAtPmxyZWdzICsgUkRQKTsKKworCS8qIFJlYWQgYmFjayBDU1IgdG8gaW52YWxpZGF0ZSB0aGUgRS1DYWNoZS4KKwkgKiBUaGlzIGlzIG5lZWRlZCwgYmVjYXVzZSBETUFfRFNCTF9XUl9JTlYgaXMgc2V0LgorCSAqLworCWlmIChscC0+ZHJlZ3MpCisJCXNidXNfcmVhZHcobHAtPmxyZWdzICsgUkRQKTsKKworCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJZGV2X2tmcmVlX3NrYihza2IpOworICAgIAorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmxhbmNlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworLyogdGFrZW4gZnJvbSB0aGUgZGVwY2EgZHJpdmVyICovCitzdGF0aWMgdm9pZCBsYW5jZV9sb2FkX211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGRldl9tY19saXN0ICpkbWkgPSBkZXYtPm1jX2xpc3Q7CisJY2hhciAqYWRkcnM7CisJaW50IGk7CisJdTMyIGNyYzsKKwl1MzIgdmFsOworCQorCS8qIHNldCBhbGwgbXVsdGljYXN0IGJpdHMgKi8KKwlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkKKwkJdmFsID0gfjA7CisJZWxzZQorCQl2YWwgPSAwOworCisJaWYgKGxwLT5waW9fYnVmZmVyKSB7CisJCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrIF9faW9tZW0gKmliID0gbHAtPmluaXRfYmxvY2tfaW9tZW07CisJCXNidXNfd3JpdGVsKHZhbCwgJmliLT5maWx0ZXJbMF0pOworCQlzYnVzX3dyaXRlbCh2YWwsICZpYi0+ZmlsdGVyWzFdKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWIgPSBscC0+aW5pdF9ibG9ja19tZW07CisJCWliLT5maWx0ZXIgWzBdID0gdmFsOworCQlpYi0+ZmlsdGVyIFsxXSA9IHZhbDsKKwl9CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkKKwkJcmV0dXJuOworCQorCS8qIEFkZCBhZGRyZXNzZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrKSB7CisJCWFkZHJzID0gZG1pLT5kbWlfYWRkcjsKKwkJZG1pICAgPSBkbWktPm5leHQ7CisKKwkJLyogbXVsdGljYXN0IGFkZHJlc3M/ICovCisJCWlmICghKCphZGRycyAmIDEpKQorCQkJY29udGludWU7CisJCWNyYyA9IGV0aGVyX2NyY19sZSg2LCBhZGRycyk7CisJCWNyYyA9IGNyYyA+PiAyNjsKKwkJaWYgKGxwLT5waW9fYnVmZmVyKSB7CisJCQlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayBfX2lvbWVtICppYiA9IGxwLT5pbml0X2Jsb2NrX2lvbWVtOworCQkJdTE2IF9faW9tZW0gKm1jYXN0X3RhYmxlID0gKHUxNiBfX2lvbWVtICopICZpYi0+ZmlsdGVyOworCQkJdTE2IHRtcCA9IHNidXNfcmVhZHcoJm1jYXN0X3RhYmxlW2NyYz4+NF0pOworCQkJdG1wIHw9IDEgPDwgKGNyYyAmIDB4Zik7CisJCQlzYnVzX3dyaXRldyh0bXAsICZtY2FzdF90YWJsZVtjcmM+PjRdKTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrICppYiA9IGxwLT5pbml0X2Jsb2NrX21lbTsKKwkJCXUxNiAqbWNhc3RfdGFibGUgPSAodTE2ICopICZpYi0+ZmlsdGVyOworCQkJbWNhc3RfdGFibGUgW2NyYyA+PiA0XSB8PSAxIDw8IChjcmMgJiAweGYpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBsYW5jZV9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayAqaWJfbWVtID0gbHAtPmluaXRfYmxvY2tfbWVtOworCXN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrIF9faW9tZW0gKmliX2lvbWVtID0gbHAtPmluaXRfYmxvY2tfaW9tZW07CisJdTE2IG1vZGU7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuOworCisJaWYgKGxwLT50eF9vbGQgIT0gbHAtPnR4X25ldykgeworCQltb2RfdGltZXIoJmxwLT5tdWx0aWNhc3RfdGltZXIsIGppZmZpZXMgKyA0KTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQlyZXR1cm47CisJfQorCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJU1RPUF9MQU5DRShscCk7CisJbHAtPmluaXRfcmluZyhkZXYpOworCisJaWYgKGxwLT5waW9fYnVmZmVyKQorCQltb2RlID0gc2J1c19yZWFkdygmaWJfaW9tZW0tPm1vZGUpOworCWVsc2UKKwkJbW9kZSA9IGliX21lbS0+bW9kZTsKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCW1vZGUgfD0gTEVfTU9fUFJPTTsKKwkJaWYgKGxwLT5waW9fYnVmZmVyKQorCQkJc2J1c193cml0ZXcobW9kZSwgJmliX2lvbWVtLT5tb2RlKTsKKwkJZWxzZQorCQkJaWJfbWVtLT5tb2RlID0gbW9kZTsKKwl9IGVsc2UgeworCQltb2RlICY9IH5MRV9NT19QUk9NOworCQlpZiAobHAtPnBpb19idWZmZXIpCisJCQlzYnVzX3dyaXRldyhtb2RlLCAmaWJfaW9tZW0tPm1vZGUpOworCQllbHNlCisJCQlpYl9tZW0tPm1vZGUgPSBtb2RlOworCQlsYW5jZV9sb2FkX211bHRpY2FzdChkZXYpOworCX0KKwlsb2FkX2NzcnMobHApOworCWluaXRfcmVzdGFydF9sYW5jZShscCk7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgdm9pZCBsYW5jZV9zZXRfbXVsdGljYXN0X3JldHJ5KHVuc2lnbmVkIGxvbmcgX29wYXF1ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIF9vcGFxdWU7CisKKwlsYW5jZV9zZXRfbXVsdGljYXN0KGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGxhbmNlX2ZyZWVfaHdyZXNvdXJjZXMoc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwKQoreworCWlmIChscC0+bHJlZ3MpCisJCXNidXNfaW91bm1hcChscC0+bHJlZ3MsIExBTkNFX1JFR19TSVpFKTsKKwlpZiAobHAtPmluaXRfYmxvY2tfaW9tZW0pIHsKKwkJc2J1c19pb3VubWFwKGxwLT5pbml0X2Jsb2NrX2lvbWVtLAorCQkJICAgICBzaXplb2Yoc3RydWN0IGxhbmNlX2luaXRfYmxvY2spKTsKKwl9IGVsc2UgaWYgKGxwLT5pbml0X2Jsb2NrX21lbSkgeworCQlzYnVzX2ZyZWVfY29uc2lzdGVudChscC0+c2RldiwKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayksCisJCQkJICAgICBscC0+aW5pdF9ibG9ja19tZW0sCisJCQkJICAgICBscC0+aW5pdF9ibG9ja19kdm1hKTsKKwl9Cit9CisKKy8qIEV0aHRvb2wgc3VwcG9ydC4uLiAqLworc3RhdGljIHZvaWQgc3BhcmNfbGFuY2VfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RyY3B5KGluZm8tPmRyaXZlciwgInN1bmxhbmNlIik7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sICIyLjAyIik7CisJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIlNCVVM6JWQiLAorCQlscC0+c2Rldi0+c2xvdCk7Cit9CisKK3N0YXRpYyB1MzIgc3BhcmNfbGFuY2VfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBXZSByZWFsbHkgZG8gbm90IGtlZXAgdHJhY2sgb2YgdGhpcywgYnV0IHRoaXMKKwkgKiBpcyBiZXR0ZXIgdGhhbiBub3QgcmVwb3J0aW5nIGFueXRoaW5nIGF0IGFsbC4KKwkgKi8KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBzcGFyY19sYW5jZV9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gc3BhcmNfbGFuY2VfZ2V0X2RydmluZm8sCisJLmdldF9saW5rCQk9IHNwYXJjX2xhbmNlX2dldF9saW5rLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc3BhcmNfbGFuY2VfaW5pdChzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsCisJCQkJICAgc3RydWN0IHNidXNfZG1hICpsZWRtYSwKKwkJCQkgICBzdHJ1Y3Qgc2J1c19kZXYgKmxlYnVmZmVyKQoreworCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHA7CisJaW50ICAgIGk7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGxhbmNlX3ByaXZhdGUpICsgOCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCW1lbXNldChscCwgMCwgc2l6ZW9mKCpscCkpOworCisJaWYgKHNwYXJjX2xhbmNlX2RlYnVnICYmIHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayAoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOworCisJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKworCS8qIENvcHkgdGhlIElEUFJPTSBldGhlcm5ldCBhZGRyZXNzIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlLCBsYXRlciB3ZQorCSAqIHdpbGwgY29weSB0aGUgYWRkcmVzcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZSB0byB0aGUgbGFuY2UKKwkgKiBpbml0aWFsaXphdGlvbiBibG9jay4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gaWRwcm9tLT5pZF9ldGhhZGRyW2ldOworCisJLyogR2V0IHRoZSBJTyByZWdpb24gKi8KKwlscC0+bHJlZ3MgPSBzYnVzX2lvcmVtYXAoJnNkZXYtPnJlc291cmNlWzBdLCAwLAorCQkJCSBMQU5DRV9SRUdfU0laRSwgbGFuY2VzdHIpOworCWlmICghbHAtPmxyZWdzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU3VuTGFuY2U6IENhbm5vdCBtYXAgcmVnaXN0ZXJzLlxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlscC0+c2RldiA9IHNkZXY7CisJaWYgKGxlYnVmZmVyKSB7CisJCS8qIHNhbml0eSBjaGVjayAqLworCQlpZiAobGVidWZmZXItPnJlc291cmNlWzBdLnN0YXJ0ICYgNykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJTdW5MYW5jZTogRVJST1I6IFJ4IGFuZCBUeCByaW5ncyBub3Qgb24gZXZlbiBib3VuZGFyeS5cbiIpOworCQkJZ290byBmYWlsOworCQl9CisJCWxwLT5pbml0X2Jsb2NrX2lvbWVtID0KKwkJCXNidXNfaW9yZW1hcCgmbGVidWZmZXItPnJlc291cmNlWzBdLCAwLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBsYW5jZV9pbml0X2Jsb2NrKSwgImxlYnVmZmVyIik7CisJCWlmICghbHAtPmluaXRfYmxvY2tfaW9tZW0pIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiU3VuTGFuY2U6IENhbm5vdCBtYXAgUElPIGJ1ZmZlci5cbiIpOworCQkJZ290byBmYWlsOworCQl9CisJCWxwLT5pbml0X2Jsb2NrX2R2bWEgPSAwOworCQlscC0+cGlvX2J1ZmZlciA9IDE7CisJCWxwLT5pbml0X3JpbmcgPSBsYW5jZV9pbml0X3JpbmdfcGlvOworCQlscC0+cnggPSBsYW5jZV9yeF9waW87CisJCWxwLT50eCA9IGxhbmNlX3R4X3BpbzsKKwl9IGVsc2UgeworCQlscC0+aW5pdF9ibG9ja19tZW0gPQorCQkJc2J1c19hbGxvY19jb25zaXN0ZW50KHNkZXYsIHNpemVvZihzdHJ1Y3QgbGFuY2VfaW5pdF9ibG9jayksCisJCQkJCSAgICAgICZscC0+aW5pdF9ibG9ja19kdm1hKTsKKwkJaWYgKCFscC0+aW5pdF9ibG9ja19tZW0gfHwgbHAtPmluaXRfYmxvY2tfZHZtYSA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlN1bkxhbmNlOiBDYW5ub3QgYWxsb2NhdGUgY29uc2lzdGVudCBETUEgbWVtb3J5LlxuIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJbHAtPnBpb19idWZmZXIgPSAwOworCQlscC0+aW5pdF9yaW5nID0gbGFuY2VfaW5pdF9yaW5nX2R2bWE7CisJCWxwLT5yeCA9IGxhbmNlX3J4X2R2bWE7CisJCWxwLT50eCA9IGxhbmNlX3R4X2R2bWE7CisJfQorCWxwLT5idXNtYXN0ZXJfcmVndmFsID0gcHJvbV9nZXRpbnRkZWZhdWx0KHNkZXYtPnByb21fbm9kZSwKKwkJCQkJCSAgImJ1c21hc3Rlci1yZWd2YWwiLAorCQkJCQkJICAoTEVfQzNfQlNXUCB8IExFX0MzX0FDT04gfAorCQkJCQkJICAgTEVfQzNfQkNPTikpOworCisJbHAtPm5hbWUgPSBsYW5jZXN0cjsKKwlscC0+bGVkbWEgPSBsZWRtYTsKKworCWxwLT5idXJzdF9zaXplcyA9IDA7CisJaWYgKGxwLT5sZWRtYSkgeworCQljaGFyIHByb3BbNl07CisJCXVuc2lnbmVkIGludCBzYm1hc2s7CisJCXUzMiBjc3I7CisKKwkJLyogRmluZCBidXJzdC1zaXplIHByb3BlcnR5IGZvciBsZWRtYSAqLworCQlscC0+YnVyc3Rfc2l6ZXMgPSBwcm9tX2dldGludGRlZmF1bHQobGVkbWEtPnNkZXYtPnByb21fbm9kZSwKKwkJCQkJCSAgICAgImJ1cnN0LXNpemVzIiwgMCk7CisKKwkJLyogbGVkbWEgbWF5IGJlIGNhcGFibGUgb2YgZmFzdCBidXJzdHMsIGJ1dCBzYnVzIG1heSBub3QuICovCisJCXNibWFzayA9IHByb21fZ2V0aW50ZGVmYXVsdChsZWRtYS0+c2Rldi0+YnVzLT5wcm9tX25vZGUsCisJCQkJCSAgICAiYnVyc3Qtc2l6ZXMiLCBETUFfQlVSU1RCSVRTKTsKKwkJbHAtPmJ1cnN0X3NpemVzICY9IHNibWFzazsKKworCQkvKiBHZXQgdGhlIGNhYmxlLXNlbGVjdGlvbiBwcm9wZXJ0eSAqLworCQltZW1zZXQocHJvcCwgMCwgc2l6ZW9mKHByb3ApKTsKKwkJcHJvbV9nZXRzdHJpbmcobGVkbWEtPnNkZXYtPnByb21fbm9kZSwgImNhYmxlLXNlbGVjdGlvbiIsCisJCQkgICAgICAgcHJvcCwgc2l6ZW9mKHByb3ApKTsKKwkJaWYgKHByb3BbMF0gPT0gMCkgeworCQkJaW50IHRvcG5kLCBuZDsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiU3VuTGFuY2U6IHVzaW5nIGF1dG8tY2Fycmllci1kZXRlY3Rpb24uXG4iKTsKKworCQkJLyogSXMgdGhpcyBmb3VuZCBhdCAvb3B0aW9ucyAuYXR0cmlidXRlcyBpbiBhbGwKKwkJCSAqIFByb20gdmVyc2lvbnM/IFhYWAorCQkJICovCisJCQl0b3BuZCA9IHByb21fZ2V0Y2hpbGQocHJvbV9yb290X25vZGUpOworCisJCQluZCA9IHByb21fc2VhcmNoc2libGluZ3ModG9wbmQsICJvcHRpb25zIik7CisJCQlpZiAoIW5kKQorCQkJCWdvdG8gbm9fbGlua190ZXN0OworCisJCQlpZiAoIXByb21fbm9kZV9oYXNfcHJvcGVydHkobmQsICJ0cGUtbGluay10ZXN0PyIpKQorCQkJCWdvdG8gbm9fbGlua190ZXN0OworCisJCQltZW1zZXQocHJvcCwgMCwgc2l6ZW9mKHByb3ApKTsKKwkJCXByb21fZ2V0c3RyaW5nKG5kLCAidHBlLWxpbmstdGVzdD8iLCBwcm9wLAorCQkJCSAgICAgICBzaXplb2YocHJvcCkpOworCisJCQlpZiAoc3RyY21wKHByb3AsICJ0cnVlIikpIHsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIlN1bkxhbmNlOiB3YXJuaW5nOiBvdmVycmlkaW5nIG9wdGlvbiAiCisJCQkJICAgICAgICIndHBlLWxpbmstdGVzdD8nXG4iKTsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIlN1bkxhbmNlOiB3YXJuaW5nOiBtYWlsIGFueSBwcm9ibGVtcyAiCisJCQkJICAgICAgICJ0byBlY2RAc2t5bmV0LmJlXG4iKTsKKwkJCQlhdXhpb19zZXRfbHRlKEFVWElPX0xURV9PTik7CisJCQl9Citub19saW5rX3Rlc3Q6CisJCQlscC0+YXV0b19zZWxlY3QgPSAxOworCQkJbHAtPnRwZSA9IDA7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChwcm9wLCAiYXVpIikpIHsKKwkJCWxwLT5hdXRvX3NlbGVjdCA9IDA7CisJCQlscC0+dHBlID0gMDsKKwkJfSBlbHNlIHsKKwkJCWxwLT5hdXRvX3NlbGVjdCA9IDA7CisJCQlscC0+dHBlID0gMTsKKwkJfQorCisJCWxwLT5kcmVncyA9IGxlZG1hLT5yZWdzOworCisJCS8qIFJlc2V0IGxlZG1hICovCisJCWNzciA9IHNidXNfcmVhZGwobHAtPmRyZWdzICsgRE1BX0NTUik7CisJCXNidXNfd3JpdGVsKGNzciB8IERNQV9SU1RfRU5FVCwgbHAtPmRyZWdzICsgRE1BX0NTUik7CisJCXVkZWxheSgyMDApOworCQlzYnVzX3dyaXRlbChjc3IgJiB+RE1BX1JTVF9FTkVULCBscC0+ZHJlZ3MgKyBETUFfQ1NSKTsKKwl9IGVsc2UKKwkJbHAtPmRyZWdzID0gTlVMTDsKKworCWxwLT5kZXYgPSBkZXY7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWRldi0+b3BlbiA9ICZsYW5jZV9vcGVuOworCWRldi0+c3RvcCA9ICZsYW5jZV9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZsYW5jZV9zdGFydF94bWl0OworCWRldi0+dHhfdGltZW91dCA9ICZsYW5jZV90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSA1KkhaOworCWRldi0+Z2V0X3N0YXRzID0gJmxhbmNlX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZsYW5jZV9zZXRfbXVsdGljYXN0OworCWRldi0+ZXRodG9vbF9vcHMgPSAmc3BhcmNfbGFuY2VfZXRodG9vbF9vcHM7CisKKwlkZXYtPmlycSA9IHNkZXYtPmlycXNbMF07CisKKwlkZXYtPmRtYSA9IDA7CisKKwkvKiBXZSBjYW5ub3Qgc2xlZXAgaWYgdGhlIGNoaXAgaXMgYnVzeSBkdXJpbmcgYQorCSAqIG11bHRpY2FzdCBsaXN0IHVwZGF0ZSBldmVudCwgYmVjYXVzZSBzdWNoIGV2ZW50cworCSAqIGNhbiBvY2N1ciBmcm9tIGludGVycnVwdHMgKGV4LiBJUHY2KS4gIFNvIHdlCisJICogdXNlIGEgdGltZXIgdG8gdHJ5IGFnYWluIGxhdGVyIHdoZW4gbmVjZXNzYXJ5LiAtRGF2ZU0KKwkgKi8KKwlpbml0X3RpbWVyKCZscC0+bXVsdGljYXN0X3RpbWVyKTsKKwlscC0+bXVsdGljYXN0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworCWxwLT5tdWx0aWNhc3RfdGltZXIuZnVuY3Rpb24gPSAmbGFuY2Vfc2V0X211bHRpY2FzdF9yZXRyeTsKKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgIlN1bkxhbmNlOiBDYW5ub3QgcmVnaXN0ZXIgZGV2aWNlLlxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlscC0+bmV4dF9tb2R1bGUgPSByb290X2xhbmNlX2RldjsKKwlyb290X2xhbmNlX2RldiA9IGxwOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExBTkNFICIsIGRldi0+bmFtZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiUyLjJ4JWMiLCBkZXYtPmRldl9hZGRyW2ldLAorCQkgICAgICAgaSA9PSA1ID8gJyAnOiAnOicpOworCXByaW50aygiXG4iKTsKKworCXJldHVybiAwOworCitmYWlsOgorCWxhbmNlX2ZyZWVfaHdyZXNvdXJjZXMobHApOworCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qIE9uIDRtLCBmaW5kIHRoZSBhc3NvY2lhdGVkIGRtYSBmb3IgdGhlIGxhbmNlIGNoaXAgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNidXNfZG1hICpmaW5kX2xlZG1hKHN0cnVjdCBzYnVzX2RldiAqc2RldikKK3sKKwlzdHJ1Y3Qgc2J1c19kbWEgKnA7CisKKwlmb3JfZWFjaF9kdm1hKHApIHsKKwkJaWYgKHAtPnNkZXYgPT0gc2RldikKKwkJCXJldHVybiBwOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworI2lmZGVmIENPTkZJR19TVU40CisKKyNpbmNsdWRlIDxhc20vc3VuNHBhZGRyLmg+CisjaW5jbHVkZSA8YXNtL21hY2hpbmVzLmg+CisKKy8qIEZpbmQgYWxsIHRoZSBsYW5jZSBjYXJkcyBvbiB0aGUgc3lzdGVtIGFuZCBpbml0aWFsaXplIHRoZW0gKi8KK3N0YXRpYyBpbnQgX19pbml0IHNwYXJjX2xhbmNlX3Byb2JlKHZvaWQpCit7CisJc3RhdGljIHN0cnVjdCBzYnVzX2RldiBzZGV2OworCXN0YXRpYyBpbnQgY2FsbGVkOworCisJcm9vdF9sYW5jZV9kZXYgPSBOVUxMOworCisJaWYgKGNhbGxlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJY2FsbGVkKys7CisKKwlpZiAoKGlkcHJvbS0+aWRfbWFjaHR5cGUgPT0gKFNNX1NVTjR8U01fNF8zMzApKSB8fAorCSAgICAoaWRwcm9tLT5pZF9tYWNodHlwZSA9PSAoU01fU1VONHxTTV80XzQ3MCkpKSB7CisJCW1lbXNldCgmc2RldiwgMCwgc2l6ZW9mKHNkZXYpKTsKKwkJc2Rldi5yZWdfYWRkcnNbMF0ucGh5c19hZGRyID0gc3VuNF9ldGhfcGh5c2FkZHI7CisJCXNkZXYuaXJxc1swXSA9IDY7CisJCXJldHVybiBzcGFyY19sYW5jZV9pbml0KCZzZGV2LCBOVUxMLCBOVUxMKTsKKwl9CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKyNlbHNlIC8qICFDT05GSUdfU1VONCAqLworCisvKiBGaW5kIGFsbCB0aGUgbGFuY2UgY2FyZHMgb24gdGhlIHN5c3RlbSBhbmQgaW5pdGlhbGl6ZSB0aGVtICovCitzdGF0aWMgaW50IF9faW5pdCBzcGFyY19sYW5jZV9wcm9iZSh2b2lkKQoreworCXN0cnVjdCBzYnVzX2J1cyAqYnVzOworCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IE5VTEw7CisJc3RydWN0IHNidXNfZG1hICpsZWRtYSA9IE5VTEw7CisJc3RhdGljIGludCBjYWxsZWQ7CisJaW50IGNhcmRzID0gMCwgdjsKKworCXJvb3RfbGFuY2VfZGV2ID0gTlVMTDsKKworCWlmIChjYWxsZWQpCisJCXJldHVybiAtRU5PREVWOworCWNhbGxlZCsrOworCisJZm9yX2VhY2hfc2J1cyAoYnVzKSB7CisJCWZvcl9lYWNoX3NidXNkZXYgKHNkZXYsIGJ1cykgeworCQkJaWYgKHN0cmNtcChzZGV2LT5wcm9tX25hbWUsICJsZSIpID09IDApIHsKKwkJCQljYXJkcysrOworCQkJCWlmICgodiA9IHNwYXJjX2xhbmNlX2luaXQoc2RldiwgTlVMTCwgTlVMTCkpKQorCQkJCQlyZXR1cm4gdjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChzdHJjbXAoc2Rldi0+cHJvbV9uYW1lLCAibGVkbWEiKSA9PSAwKSB7CisJCQkJY2FyZHMrKzsKKwkJCQlsZWRtYSA9IGZpbmRfbGVkbWEoc2Rldik7CisJCQkJaWYgKCh2ID0gc3BhcmNfbGFuY2VfaW5pdChzZGV2LT5jaGlsZCwKKwkJCQkJCQkgIGxlZG1hLCBOVUxMKSkpCisJCQkJCXJldHVybiB2OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHN0cmNtcChzZGV2LT5wcm9tX25hbWUsICJsZWJ1ZmZlciIpID09IDApeworCQkJCWNhcmRzKys7CisJCQkJaWYgKCh2ID0gc3BhcmNfbGFuY2VfaW5pdChzZGV2LT5jaGlsZCwKKwkJCQkJCQkgIE5VTEwsIHNkZXYpKSkKKwkJCQkJcmV0dXJuIHY7CisJCQkJY29udGludWU7CisJCQl9CisJCX0gLyogZm9yIGVhY2ggc2J1c2RldiAqLworCX0gLyogZm9yIGVhY2ggc2J1cyAqLworCWlmICghY2FyZHMpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiAwOworfQorI2VuZGlmIC8qICFDT05GSUdfU1VONCAqLworCitzdGF0aWMgdm9pZCBfX2V4aXQgc3BhcmNfbGFuY2VfY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscDsKKworCXdoaWxlIChyb290X2xhbmNlX2RldikgeworCQlscCA9IHJvb3RfbGFuY2VfZGV2LT5uZXh0X21vZHVsZTsKKworCQl1bnJlZ2lzdGVyX25ldGRldihyb290X2xhbmNlX2Rldi0+ZGV2KTsKKwkJbGFuY2VfZnJlZV9od3Jlc291cmNlcyhyb290X2xhbmNlX2Rldik7CisJCWZyZWVfbmV0ZGV2KHJvb3RfbGFuY2VfZGV2LT5kZXYpOworCQlyb290X2xhbmNlX2RldiA9IGxwOworCX0KK30KKworbW9kdWxlX2luaXQoc3BhcmNfbGFuY2VfcHJvYmUpOworbW9kdWxlX2V4aXQoc3BhcmNfbGFuY2VfY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5xZS5jIGIvZHJpdmVycy9uZXQvc3VucWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2VmMWI4MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3N1bnFlLmMKQEAgLTAsMCArMSwxMDQzIEBACisvKiAkSWQ6IHN1bnFlLmMsdiAxLjU1IDIwMDIvMDEvMTUgMDY6NDg6NTUgZGF2ZW0gRXhwICQKKyAqIHN1bnFlLmM6IFNwYXJjIFF1YWRFdGhlcm5ldCAxMGJhc2VUIFNCVVMgY2FyZCBkcml2ZXIuCisgKiAgICAgICAgICBPbmNlIGFnYWluIEkgYW0gb3V0IHRvIHByb3ZlIHRoYXQgZXZlcnkgZXRoZXJuZXQKKyAqICAgICAgICAgIGNvbnRyb2xsZXIgb3V0IHRoZXJlIGNhbiBiZSBtb3N0IGVmZmljaWVudGx5IHByb2dyYW1tZWQKKyAqICAgICAgICAgIGlmIHlvdSBtYWtlIGl0IGxvb2sgbGlrZSBhIExBTkNFLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSwgMjAwMyBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKi8KKworc3RhdGljIGNoYXIgdmVyc2lvbltdID0KKyAgICAgICAgInN1bnFlLmM6djMuMCA4LzI0LzAzIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSlcbiI7CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9zYnVzLmg+CisjaW5jbHVkZSA8YXNtL29wZW5wcm9tLmg+CisjaW5jbHVkZSA8YXNtL29wbGliLmg+CisjaW5jbHVkZSA8YXNtL2F1eGlvLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlICJzdW5xZS5oIgorCitzdGF0aWMgc3RydWN0IHN1bnFlYyAqcm9vdF9xZWNfZGV2OworCitzdGF0aWMgdm9pZCBxZV9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisjZGVmaW5lIFFFQ19SRVNFVF9UUklFUyAyMDAKKworc3RhdGljIGlubGluZSBpbnQgcWVjX2dsb2JhbF9yZXNldCh2b2lkIF9faW9tZW0gKmdyZWdzKQoreworCWludCB0cmllcyA9IFFFQ19SRVNFVF9UUklFUzsKKworCXNidXNfd3JpdGVsKEdMT0JfQ1RSTF9SRVNFVCwgZ3JlZ3MgKyBHTE9CX0NUUkwpOworCXdoaWxlICgtLXRyaWVzKSB7CisJCXUzMiB0bXAgPSBzYnVzX3JlYWRsKGdyZWdzICsgR0xPQl9DVFJMKTsKKwkJaWYgKHRtcCAmIEdMT0JfQ1RSTF9SRVNFVCkgeworCQkJdWRlbGF5KDIwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJyZWFrOworCX0KKwlpZiAodHJpZXMpCisJCXJldHVybiAwOworCXByaW50ayhLRVJOX0VSUiAiUXVhZEV0aGVyOiBBSUVFRSBjYW5ub3QgcmVzZXQgdGhlIFFFQyFcbiIpOworCXJldHVybiAtMTsKK30KKworI2RlZmluZSBNQUNFX1JFU0VUX1JFVFJJRVMgMjAwCisjZGVmaW5lIFFFX1JFU0VUX1JFVFJJRVMgICAyMDAKKworc3RhdGljIGlubGluZSBpbnQgcWVfc3RvcChzdHJ1Y3Qgc3VucWUgKnFlcCkKK3sKKwl2b2lkIF9faW9tZW0gKmNyZWdzID0gcWVwLT5xY3JlZ3M7CisJdm9pZCBfX2lvbWVtICptcmVncyA9IHFlcC0+bXJlZ3M7CisJaW50IHRyaWVzOworCisJLyogUmVzZXQgdGhlIE1BQ0UsIHRoZW4gdGhlIFFFQyBjaGFubmVsLiAqLworCXNidXNfd3JpdGViKE1SRUdTX0JDT05GSUdfUkVTRVQsIG1yZWdzICsgTVJFR1NfQkNPTkZJRyk7CisJdHJpZXMgPSBNQUNFX1JFU0VUX1JFVFJJRVM7CisJd2hpbGUgKC0tdHJpZXMpIHsKKwkJdTggdG1wID0gc2J1c19yZWFkYihtcmVncyArIE1SRUdTX0JDT05GSUcpOworCQlpZiAodG1wICYgTVJFR1NfQkNPTkZJR19SRVNFVCkgeworCQkJdWRlbGF5KDIwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJyZWFrOworCX0KKwlpZiAoIXRyaWVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUXVhZEV0aGVyOiBBSUVFRSBjYW5ub3QgcmVzZXQgdGhlIE1BQ0UhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNidXNfd3JpdGVsKENSRUdfQ1RSTF9SRVNFVCwgY3JlZ3MgKyBDUkVHX0NUUkwpOworCXRyaWVzID0gUUVfUkVTRVRfUkVUUklFUzsKKwl3aGlsZSAoLS10cmllcykgeworCQl1MzIgdG1wID0gc2J1c19yZWFkbChjcmVncyArIENSRUdfQ1RSTCk7CisJCWlmICh0bXAgJiBDUkVHX0NUUkxfUkVTRVQpIHsKKwkJCXVkZWxheSgyMCk7CisJCQljb250aW51ZTsKKwkJfQorCQlicmVhazsKKwl9CisJaWYgKCF0cmllcykgeworCQlwcmludGsoS0VSTl9FUlIgIlF1YWRFdGhlcjogQ2Fubm90IHJlc2V0IFFFIGNoYW5uZWwhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcWVfaW5pdF9yaW5ncyhzdHJ1Y3Qgc3VucWUgKnFlcCkKK3sKKwlzdHJ1Y3QgcWVfaW5pdF9ibG9jayAqcWIgPSBxZXAtPnFlX2Jsb2NrOworCXN0cnVjdCBzdW5xZV9idWZmZXJzICpxYnVmcyA9IHFlcC0+YnVmZmVyczsKKwlfX3UzMiBxYnVmc19kdm1hID0gcWVwLT5idWZmZXJzX2R2bWE7CisJaW50IGk7CisKKwlxZXAtPnJ4X25ldyA9IHFlcC0+cnhfb2xkID0gcWVwLT50eF9uZXcgPSBxZXAtPnR4X29sZCA9IDA7CisJbWVtc2V0KHFiLCAwLCBzaXplb2Yoc3RydWN0IHFlX2luaXRfYmxvY2spKTsKKwltZW1zZXQocWJ1ZnMsIDAsIHNpemVvZihzdHJ1Y3Qgc3VucWVfYnVmZmVycykpOworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlxYi0+cWVfcnhkW2ldLnJ4X2FkZHIgPSBxYnVmc19kdm1hICsgcWVidWZfb2Zmc2V0KHJ4X2J1ZiwgaSk7CisJCXFiLT5xZV9yeGRbaV0ucnhfZmxhZ3MgPQorCQkJKFJYRF9PV04gfCAoKFJYRF9QS1RfU1opICYgUlhEX0xFTkdUSCkpOworCX0KK30KKworc3RhdGljIGludCBxZV9pbml0KHN0cnVjdCBzdW5xZSAqcWVwLCBpbnQgZnJvbV9pcnEpCit7CisJc3RydWN0IHN1bnFlYyAqcWVjcCA9IHFlcC0+cGFyZW50OworCXZvaWQgX19pb21lbSAqY3JlZ3MgPSBxZXAtPnFjcmVnczsKKwl2b2lkIF9faW9tZW0gKm1yZWdzID0gcWVwLT5tcmVnczsKKwl2b2lkIF9faW9tZW0gKmdyZWdzID0gcWVjcC0+Z3JlZ3M7CisJdW5zaWduZWQgY2hhciAqZSA9ICZxZXAtPmRldi0+ZGV2X2FkZHJbMF07CisJdTMyIHRtcDsKKwlpbnQgaTsKKworCS8qIFNodXQgaXQgdXAuICovCisJaWYgKHFlX3N0b3AocWVwKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwkvKiBTZXR1cCBpbml0aWFsIHJ4L3R4IGluaXQgYmxvY2sgcG9pbnRlcnMuICovCisJc2J1c193cml0ZWwocWVwLT5xYmxvY2tfZHZtYSArIHFpYl9vZmZzZXQocWVfcnhkLCAwKSwgY3JlZ3MgKyBDUkVHX1JYRFMpOworCXNidXNfd3JpdGVsKHFlcC0+cWJsb2NrX2R2bWEgKyBxaWJfb2Zmc2V0KHFlX3R4ZCwgMCksIGNyZWdzICsgQ1JFR19UWERTKTsKKworCS8qIEVuYWJsZS9tYXNrIHRoZSB2YXJpb3VzIGlycSdzLiAqLworCXNidXNfd3JpdGVsKDAsIGNyZWdzICsgQ1JFR19SSU1BU0spOworCXNidXNfd3JpdGVsKDEsIGNyZWdzICsgQ1JFR19USU1BU0spOworCisJc2J1c193cml0ZWwoMCwgY3JlZ3MgKyBDUkVHX1FNQVNLKTsKKwlzYnVzX3dyaXRlbChDUkVHX01NQVNLX1JYQ09MTCwgY3JlZ3MgKyBDUkVHX01NQVNLKTsKKworCS8qIFNldHVwIHRoZSBGSUZPIHBvaW50ZXJzIGludG8gUUVDIGxvY2FsIG1lbW9yeS4gKi8KKwl0bXAgPSBxZXAtPmNoYW5uZWwgKiBzYnVzX3JlYWRsKGdyZWdzICsgR0xPQl9NU0laRSk7CisJc2J1c193cml0ZWwodG1wLCBjcmVncyArIENSRUdfUlhSQlVGUFRSKTsKKwlzYnVzX3dyaXRlbCh0bXAsIGNyZWdzICsgQ1JFR19SWFdCVUZQVFIpOworCisJdG1wID0gc2J1c19yZWFkbChjcmVncyArIENSRUdfUlhSQlVGUFRSKSArCisJCXNidXNfcmVhZGwoZ3JlZ3MgKyBHTE9CX1JTSVpFKTsKKwlzYnVzX3dyaXRlbCh0bXAsIGNyZWdzICsgQ1JFR19UWFJCVUZQVFIpOworCXNidXNfd3JpdGVsKHRtcCwgY3JlZ3MgKyBDUkVHX1RYV0JVRlBUUik7CisKKwkvKiBDbGVhciB0aGUgY2hhbm5lbCBjb2xsaXNpb24gY291bnRlci4gKi8KKwlzYnVzX3dyaXRlbCgwLCBjcmVncyArIENSRUdfQ0NOVCk7CisKKwkvKiBGb3IgMTBiYXNlVCwgaW50ZXIgZnJhbWUgc3BhY2Ugbm9yIHRocm90dGxlIHNlZW1zIHRvIGJlIG5lY2Vzc2FyeS4gKi8KKwlzYnVzX3dyaXRlbCgwLCBjcmVncyArIENSRUdfUElQRyk7CisKKwkvKiBOb3cgZG9yayB3aXRoIHRoZSBBTUQgTUFDRS4gKi8KKwlzYnVzX3dyaXRlYihNUkVHU19QSFlDT05GSUdfQVVUTywgbXJlZ3MgKyBNUkVHU19QSFlDT05GSUcpOworCXNidXNfd3JpdGViKE1SRUdTX1RYRkNOVExfQVVUT1BBRCwgbXJlZ3MgKyBNUkVHU19UWEZDTlRMKTsKKwlzYnVzX3dyaXRlYigwLCBtcmVncyArIE1SRUdTX1JYRkNOVEwpOworCisJLyogVGhlIFFFQyBkbWEncyB0aGUgcngnZCBwYWNrZXRzIGZyb20gbG9jYWwgbWVtb3J5IG91dCB0byBtYWluIG1lbW9yeSwKKwkgKiBhbmQgdGhlcmVmb3JlIGl0IGludGVycnVwdHMgd2hlbiB0aGUgcGFja2V0IHJlY2VwdGlvbiBpcyAiY29tcGxldGUiLgorCSAqIFNvIGRvbid0IGxpc3RlbiBmb3IgdGhlIE1BQ0UgdGFsa2luZyBhYm91dCBpdC4KKwkgKi8KKwlzYnVzX3dyaXRlYihNUkVHU19JTUFTS19DT0xMIHwgTVJFR1NfSU1BU0tfUlhJUlEsIG1yZWdzICsgTVJFR1NfSU1BU0spOworCXNidXNfd3JpdGViKE1SRUdTX0JDT05GSUdfQlNXQVAgfCBNUkVHU19CQ09ORklHXzY0VFMsIG1yZWdzICsgTVJFR1NfQkNPTkZJRyk7CisJc2J1c193cml0ZWIoKE1SRUdTX0ZDT05GSUdfVFhGMTYgfCBNUkVHU19GQ09ORklHX1JYRjMyIHwKKwkJICAgICBNUkVHU19GQ09ORklHX1JGV1UgfCBNUkVHU19GQ09ORklHX1RGV1UpLAorCQkgICAgbXJlZ3MgKyBNUkVHU19GQ09ORklHKTsKKworCS8qIE9ubHkgdXNhYmxlIGludGVyZmFjZSBvbiBRdWFkRXRoZXIgaXMgdHdpc3RlZCBwYWlyLiAqLworCXNidXNfd3JpdGViKE1SRUdTX1BMU0NPTkZJR19UUCwgbXJlZ3MgKyBNUkVHU19QTFNDT05GSUcpOworCisJLyogVGVsbCBNQUNFIHdlIGFyZSBjaGFuZ2luZyB0aGUgZXRoZXIgYWRkcmVzcy4gKi8KKwlzYnVzX3dyaXRlYihNUkVHU19JQUNPTkZJR19BQ0hOR0UgfCBNUkVHU19JQUNPTkZJR19QQVJFU0VULAorCQkgICAgbXJlZ3MgKyBNUkVHU19JQUNPTkZJRyk7CisJd2hpbGUgKChzYnVzX3JlYWRiKG1yZWdzICsgTVJFR1NfSUFDT05GSUcpICYgTVJFR1NfSUFDT05GSUdfQUNITkdFKSAhPSAwKQorCQliYXJyaWVyKCk7CisJc2J1c193cml0ZWIoZVswXSwgbXJlZ3MgKyBNUkVHU19FVEhBRERSKTsKKwlzYnVzX3dyaXRlYihlWzFdLCBtcmVncyArIE1SRUdTX0VUSEFERFIpOworCXNidXNfd3JpdGViKGVbMl0sIG1yZWdzICsgTVJFR1NfRVRIQUREUik7CisJc2J1c193cml0ZWIoZVszXSwgbXJlZ3MgKyBNUkVHU19FVEhBRERSKTsKKwlzYnVzX3dyaXRlYihlWzRdLCBtcmVncyArIE1SRUdTX0VUSEFERFIpOworCXNidXNfd3JpdGViKGVbNV0sIG1yZWdzICsgTVJFR1NfRVRIQUREUik7CisKKwkvKiBDbGVhciBvdXQgdGhlIGFkZHJlc3MgZmlsdGVyLiAqLworCXNidXNfd3JpdGViKE1SRUdTX0lBQ09ORklHX0FDSE5HRSB8IE1SRUdTX0lBQ09ORklHX0xBUkVTRVQsCisJCSAgICBtcmVncyArIE1SRUdTX0lBQ09ORklHKTsKKwl3aGlsZSAoKHNidXNfcmVhZGIobXJlZ3MgKyBNUkVHU19JQUNPTkZJRykgJiBNUkVHU19JQUNPTkZJR19BQ0hOR0UpICE9IDApCisJCWJhcnJpZXIoKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlzYnVzX3dyaXRlYigwLCBtcmVncyArIE1SRUdTX0ZJTFRFUik7CisKKwkvKiBBZGRyZXNzIGNoYW5nZXMgYXJlIG5vdyBjb21wbGV0ZS4gKi8KKwlzYnVzX3dyaXRlYigwLCBtcmVncyArIE1SRUdTX0lBQ09ORklHKTsKKworCXFlX2luaXRfcmluZ3MocWVwKTsKKworCS8qIFdhaXQgYSBsaXR0bGUgYml0IGZvciB0aGUgbGluayB0byBjb21lIHVwLi4uICovCisJbWRlbGF5KDUpOworCWlmICghKHNidXNfcmVhZGIobXJlZ3MgKyBNUkVHU19QSFlDT05GSUcpICYgTVJFR1NfUEhZQ09ORklHX0xURVNURElTKSkgeworCQlpbnQgdHJpZXMgPSA1MDsKKworCQl3aGlsZSAodHJpZXMtLSkgeworCQkJdTggdG1wOworCisJCQltZGVsYXkoNSk7CisJCQliYXJyaWVyKCk7CisJCQl0bXAgPSBzYnVzX3JlYWRiKG1yZWdzICsgTVJFR1NfUEhZQ09ORklHKTsKKwkJCWlmICgodG1wICYgTVJFR1NfUEhZQ09ORklHX0xTVEFUKSAhPSAwKQorCQkJCWJyZWFrOworCQl9CisJCWlmICh0cmllcyA9PSAwKQorCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogV2FybmluZywgbGluayBzdGF0ZSBpcyBkb3duLlxuIiwgcWVwLT5kZXYtPm5hbWUpOworCX0KKworCS8qIE1pc3NlZCBwYWNrZXQgY291bnRlciBpcyBjbGVhcmVkIG9uIGEgcmVhZC4gKi8KKwlzYnVzX3JlYWRiKG1yZWdzICsgTVJFR1NfTVBDTlQpOworCisJLyogUmVsb2FkIG11bHRpY2FzdCBpbmZvcm1hdGlvbiwgdGhpcyB3aWxsIGVuYWJsZSB0aGUgcmVjZWl2ZXIKKwkgKiBhbmQgdHJhbnNtaXR0ZXIuCisJICovCisJcWVfc2V0X211bHRpY2FzdChxZXAtPmRldik7CisKKwkvKiBRRUMgc2hvdWxkIG5vdyBzdGFydCB0byBzaG93IGludGVycnVwdHMuICovCisJcmV0dXJuIDA7Cit9CisKKy8qIEdycnIsIGNlcnRhaW4gZXJyb3IgY29uZGl0aW9ucyBjb21wbGV0ZWx5IGxvY2sgdXAgdGhlIEFNRCBNQUNFLAorICogc28gd2hlbiB3ZSBnZXQgdGhlc2Ugd2UgX211c3RfIHJlc2V0IHRoZSBjaGlwLgorICovCitzdGF0aWMgaW50IHFlX2lzX2JvbGl4ZWQoc3RydWN0IHN1bnFlICpxZXAsIHUzMiBxZV9zdGF0dXMpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHFlcC0+ZGV2OworCWludCBtYWNlX2h3YnVnX3dvcmthcm91bmQgPSAwOworCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9FREVGRVIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXhjZXNzaXZlIHRyYW5zbWl0IGRlZmVycy5cbiIsIGRldi0+bmFtZSk7CisJCXFlcC0+bmV0X3N0YXRzLnR4X2Vycm9ycysrOworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfQ0xPU1MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FycmllciBsb3N0LCBsaW5rIGRvd24/XG4iLCBkZXYtPm5hbWUpOworCQlxZXAtPm5ldF9zdGF0cy50eF9lcnJvcnMrKzsKKwkJcWVwLT5uZXRfc3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX0VSRVRSSUVTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEV4Y2Vzc2l2ZSB0cmFuc21pdCByZXRyaWVzIChtb3JlIHRoYW4gMTYpLlxuIiwgZGV2LT5uYW1lKTsKKwkJcWVwLT5uZXRfc3RhdHMudHhfZXJyb3JzKys7CisJCW1hY2VfaHdidWdfd29ya2Fyb3VuZCA9IDE7CisJfQorCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9MQ09MTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBMYXRlIHRyYW5zbWl0IGNvbGxpc2lvbi5cbiIsIGRldi0+bmFtZSk7CisJCXFlcC0+bmV0X3N0YXRzLnR4X2Vycm9ycysrOworCQlxZXAtPm5ldF9zdGF0cy5jb2xsaXNpb25zKys7CisJCW1hY2VfaHdidWdfd29ya2Fyb3VuZCA9IDE7CisJfQorCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9GVUZMT1cpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVHJhbnNtaXQgZmlmbyB1bmRlcmZsb3csIGRyaXZlciBidWcuXG4iLCBkZXYtPm5hbWUpOworCQlxZXAtPm5ldF9zdGF0cy50eF9lcnJvcnMrKzsKKwkJbWFjZV9od2J1Z193b3JrYXJvdW5kID0gMTsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX0pFUlJPUikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBKYWJiZXIgZXJyb3IuXG4iLCBkZXYtPm5hbWUpOworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfQkVSUk9SKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEJhYmJsZSBlcnJvci5cbiIsIGRldi0+bmFtZSk7CisJfQorCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9DQ09GTE9XKSB7CisJCXFlcC0+bmV0X3N0YXRzLnR4X2Vycm9ycyArPSAyNTY7CisJCXFlcC0+bmV0X3N0YXRzLmNvbGxpc2lvbnMgKz0gMjU2OworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfVFhERVJST1IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVHJhbnNtaXQgZGVzY3JpcHRvciBpcyBib2d1cywgZHJpdmVyIGJ1Zy5cbiIsIGRldi0+bmFtZSk7CisJCXFlcC0+bmV0X3N0YXRzLnR4X2Vycm9ycysrOworCQlxZXAtPm5ldF9zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQltYWNlX2h3YnVnX3dvcmthcm91bmQgPSAxOworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfVFhMRVJSKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRyYW5zbWl0IGxhdGUgZXJyb3IuXG4iLCBkZXYtPm5hbWUpOworCQlxZXAtPm5ldF9zdGF0cy50eF9lcnJvcnMrKzsKKwkJbWFjZV9od2J1Z193b3JrYXJvdW5kID0gMTsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX1RYUEVSUikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUcmFuc21pdCBETUEgcGFyaXR5IGVycm9yLlxuIiwgZGV2LT5uYW1lKTsKKwkJcWVwLT5uZXRfc3RhdHMudHhfZXJyb3JzKys7CisJCXFlcC0+bmV0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCW1hY2VfaHdidWdfd29ya2Fyb3VuZCA9IDE7CisJfQorCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9UWFNFUlIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVHJhbnNtaXQgRE1BIHNidXMgZXJyb3IgYWNrLlxuIiwgZGV2LT5uYW1lKTsKKwkJcWVwLT5uZXRfc3RhdHMudHhfZXJyb3JzKys7CisJCXFlcC0+bmV0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCW1hY2VfaHdidWdfd29ya2Fyb3VuZCA9IDE7CisJfQorCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9SQ0NPRkxPVykgeworCQlxZXAtPm5ldF9zdGF0cy5yeF9lcnJvcnMgKz0gMjU2OworCQlxZXAtPm5ldF9zdGF0cy5jb2xsaXNpb25zICs9IDI1NjsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX1JVT0ZMT1cpIHsKKwkJcWVwLT5uZXRfc3RhdHMucnhfZXJyb3JzICs9IDI1NjsKKwkJcWVwLT5uZXRfc3RhdHMucnhfb3Zlcl9lcnJvcnMgKz0gMjU2OworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfTUNPRkxPVykgeworCQlxZXAtPm5ldF9zdGF0cy5yeF9lcnJvcnMgKz0gMjU2OworCQlxZXAtPm5ldF9zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IDI1NjsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX1JYRk9GTE9XKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJlY2VpdmUgZmlmbyBvdmVyZmxvdy5cbiIsIGRldi0+bmFtZSk7CisJCXFlcC0+bmV0X3N0YXRzLnJ4X2Vycm9ycysrOworCQlxZXAtPm5ldF9zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfUkxDT0xMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IExhdGUgcmVjZWl2ZSBjb2xsaXNpb24uXG4iLCBkZXYtPm5hbWUpOworCQlxZXAtPm5ldF9zdGF0cy5yeF9lcnJvcnMrKzsKKwkJcWVwLT5uZXRfc3RhdHMuY29sbGlzaW9ucysrOworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfRkNPRkxPVykgeworCQlxZXAtPm5ldF9zdGF0cy5yeF9lcnJvcnMgKz0gMjU2OworCQlxZXAtPm5ldF9zdGF0cy5yeF9mcmFtZV9lcnJvcnMgKz0gMjU2OworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfQ0VDT0ZMT1cpIHsKKwkJcWVwLT5uZXRfc3RhdHMucnhfZXJyb3JzICs9IDI1NjsKKwkJcWVwLT5uZXRfc3RhdHMucnhfY3JjX2Vycm9ycyArPSAyNTY7CisJfQorCisJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9SWERST1ApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUmVjZWl2ZSBwYWNrZXQgZHJvcHBlZC5cbiIsIGRldi0+bmFtZSk7CisJCXFlcC0+bmV0X3N0YXRzLnJ4X2Vycm9ycysrOworCQlxZXAtPm5ldF9zdGF0cy5yeF9kcm9wcGVkKys7CisJCXFlcC0+bmV0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnMrKzsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX1JYU01BTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUmVjZWl2ZSBidWZmZXIgdG9vIHNtYWxsLCBkcml2ZXIgYnVnLlxuIiwgZGV2LT5uYW1lKTsKKwkJcWVwLT5uZXRfc3RhdHMucnhfZXJyb3JzKys7CisJCXFlcC0+bmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX1JYTEVSUikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSZWNlaXZlIGxhdGUgZXJyb3IuXG4iLCBkZXYtPm5hbWUpOworCQlxZXAtPm5ldF9zdGF0cy5yeF9lcnJvcnMrKzsKKwkJbWFjZV9od2J1Z193b3JrYXJvdW5kID0gMTsKKwl9CisKKwlpZiAocWVfc3RhdHVzICYgQ1JFR19TVEFUX1JYUEVSUikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSZWNlaXZlIERNQSBwYXJpdHkgZXJyb3IuXG4iLCBkZXYtPm5hbWUpOworCQlxZXAtPm5ldF9zdGF0cy5yeF9lcnJvcnMrKzsKKwkJcWVwLT5uZXRfc3RhdHMucnhfbWlzc2VkX2Vycm9ycysrOworCQltYWNlX2h3YnVnX3dvcmthcm91bmQgPSAxOworCX0KKworCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfUlhTRVJSKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJlY2VpdmUgRE1BIHNidXMgZXJyb3IgYWNrLlxuIiwgZGV2LT5uYW1lKTsKKwkJcWVwLT5uZXRfc3RhdHMucnhfZXJyb3JzKys7CisJCXFlcC0+bmV0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnMrKzsKKwkJbWFjZV9od2J1Z193b3JrYXJvdW5kID0gMTsKKwl9CisKKwlpZiAobWFjZV9od2J1Z193b3JrYXJvdW5kKQorCQlxZV9pbml0KHFlcCwgMSk7CisJcmV0dXJuIG1hY2VfaHdidWdfd29ya2Fyb3VuZDsKK30KKworLyogUGVyLVFFIHJlY2VpdmUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4gIEp1c3QgbGlrZSBvbiB0aGUgaGFwcHkgbWVhbAorICogd2UgcmVjZWl2ZSBkaXJlY3RseSBpbnRvIHNrYidzIHdpdGggYSBzbWFsbCBwYWNrZXQgY29weSB3YXRlciBtYXJrLgorICovCitzdGF0aWMgdm9pZCBxZV9yeChzdHJ1Y3Qgc3VucWUgKnFlcCkKK3sKKwlzdHJ1Y3QgcWVfcnhkICpyeGJhc2UgPSAmcWVwLT5xZV9ibG9jay0+cWVfcnhkWzBdOworCXN0cnVjdCBxZV9yeGQgKnRoaXM7CisJc3RydWN0IHN1bnFlX2J1ZmZlcnMgKnFidWZzID0gcWVwLT5idWZmZXJzOworCV9fdTMyIHFidWZzX2R2bWEgPSBxZXAtPmJ1ZmZlcnNfZHZtYTsKKwlpbnQgZWxlbSA9IHFlcC0+cnhfbmV3LCBkcm9wcyA9IDA7CisJdTMyIGZsYWdzOworCisJdGhpcyA9ICZyeGJhc2VbZWxlbV07CisJd2hpbGUgKCEoKGZsYWdzID0gdGhpcy0+cnhfZmxhZ3MpICYgUlhEX09XTikpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdW5zaWduZWQgY2hhciAqdGhpc19xYnVmID0KKwkJCSZxYnVmcy0+cnhfYnVmW2VsZW0gJiAoUlhfUklOR19TSVpFIC0gMSldWzBdOworCQlfX3UzMiB0aGlzX3FidWZfZHZtYSA9IHFidWZzX2R2bWEgKworCQkJcWVidWZfb2Zmc2V0KHJ4X2J1ZiwgKGVsZW0gJiAoUlhfUklOR19TSVpFIC0gMSkpKTsKKwkJc3RydWN0IHFlX3J4ZCAqZW5kX3J4ZCA9CisJCQkmcnhiYXNlWyhlbGVtK1JYX1JJTkdfU0laRSkmKFJYX1JJTkdfTUFYU0laRS0xKV07CisJCWludCBsZW4gPSAoZmxhZ3MgJiBSWERfTEVOR1RIKSAtIDQ7ICAvKiBRRSBhZGRzIGV0aGVyIEZDUyBzaXplIHRvIGxlbiAqLworCisJCS8qIENoZWNrIGZvciBlcnJvcnMuICovCisJCWlmIChsZW4gPCBFVEhfWkxFTikgeworCQkJcWVwLT5uZXRfc3RhdHMucnhfZXJyb3JzKys7CisJCQlxZXAtPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlxZXAtPm5ldF9zdGF0cy5yeF9kcm9wcGVkKys7CisJCX0gZWxzZSB7CisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIDIpOworCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJZHJvcHMrKzsKKwkJCQlxZXAtPm5ldF9zdGF0cy5yeF9kcm9wcGVkKys7CisJCQl9IGVsc2UgeworCQkJCXNrYi0+ZGV2ID0gcWVwLT5kZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkJCQlza2JfcHV0KHNrYiwgbGVuKTsKKwkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgKHVuc2lnbmVkIGNoYXIgKikgdGhpc19xYnVmLAorCQkJCQkJIGxlbiwgMCk7CisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgcWVwLT5kZXYpOworCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJcWVwLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCXFlcC0+bmV0X3N0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlxZXAtPm5ldF9zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJCQl9CisJCX0KKwkJZW5kX3J4ZC0+cnhfYWRkciA9IHRoaXNfcWJ1Zl9kdm1hOworCQllbmRfcnhkLT5yeF9mbGFncyA9IChSWERfT1dOIHwgKChSWERfUEtUX1NaKSAmIFJYRF9MRU5HVEgpKTsKKwkJCisJCWVsZW0gPSBORVhUX1JYKGVsZW0pOworCQl0aGlzID0gJnJ4YmFzZVtlbGVtXTsKKwl9CisJcWVwLT5yeF9uZXcgPSBlbGVtOworCWlmIChkcm9wcykKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogTWVtb3J5IHNxdWVlemUsIGRlZmVycmluZyBwYWNrZXQuXG4iLCBxZXAtPmRldi0+bmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHFlX3R4X3JlY2xhaW0oc3RydWN0IHN1bnFlICpxZXApOworCisvKiBJbnRlcnJ1cHRzIGZvciBhbGwgUUUncyBnZXQgZmlsdGVyZWQgb3V0IHZpYSB0aGUgUUVDIG1hc3RlciBjb250cm9sbGVyLAorICogc28gd2UganVzdCBydW4gdGhyb3VnaCBlYWNoIHFlIGFuZCBjaGVjayB0byBzZWUgd2hvIGlzIHNpZ25hbGluZworICogYW5kIHRodXMgbmVlZHMgdG8gYmUgc2VydmljZWQuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBxZWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHN1bnFlYyAqcWVjcCA9IChzdHJ1Y3Qgc3VucWVjICopIGRldl9pZDsKKwl1MzIgcWVjX3N0YXR1czsKKwlpbnQgY2hhbm5lbCA9IDA7CisKKwkvKiBMYXRjaCB0aGUgc3RhdHVzIG5vdy4gKi8KKwlxZWNfc3RhdHVzID0gc2J1c19yZWFkbChxZWNwLT5ncmVncyArIEdMT0JfU1RBVCk7CisJd2hpbGUgKGNoYW5uZWwgPCA0KSB7CisJCWlmIChxZWNfc3RhdHVzICYgMHhmKSB7CisJCQlzdHJ1Y3Qgc3VucWUgKnFlcCA9IHFlY3AtPnFlc1tjaGFubmVsXTsKKwkJCXUzMiBxZV9zdGF0dXM7CisKKwkJCXFlX3N0YXR1cyA9IHNidXNfcmVhZGwocWVwLT5xY3JlZ3MgKyBDUkVHX1NUQVQpOworCQkJaWYgKHFlX3N0YXR1cyAmIENSRUdfU1RBVF9FUlJPUlMpIHsKKwkJCQlpZiAocWVfaXNfYm9saXhlZChxZXAsIHFlX3N0YXR1cykpCisJCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJCWlmIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfUlhJUlEpCisJCQkJcWVfcngocWVwKTsKKwkJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKHFlcC0+ZGV2KSAmJgorCQkJICAgIChxZV9zdGF0dXMgJiBDUkVHX1NUQVRfVFhJUlEpKSB7CisJCQkJc3Bpbl9sb2NrKCZxZXAtPmxvY2spOworCQkJCXFlX3R4X3JlY2xhaW0ocWVwKTsKKwkJCQlpZiAoVFhfQlVGRlNfQVZBSUwocWVwKSA+IDApIHsKKwkJCQkJLyogV2FrZSBuZXQgcXVldWUgYW5kIHJldHVybiB0bworCQkJCQkgKiBsYXp5IHR4IHJlY2xhaW0uCisJCQkJCSAqLworCQkJCQluZXRpZl93YWtlX3F1ZXVlKHFlcC0+ZGV2KTsKKwkJCQkJc2J1c193cml0ZWwoMSwgcWVwLT5xY3JlZ3MgKyBDUkVHX1RJTUFTSyk7CisJCQkJfQorCQkJCXNwaW5fdW5sb2NrKCZxZXAtPmxvY2spOworCQkJfQorCW5leHQ6CisJCQk7CisJCX0KKwkJcWVjX3N0YXR1cyA+Pj0gNDsKKwkJY2hhbm5lbCsrOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBxZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN1bnFlICpxZXAgPSAoc3RydWN0IHN1bnFlICopIGRldi0+cHJpdjsKKworCXFlcC0+bWNvbmZpZyA9IChNUkVHU19NQ09ORklHX1RYRU5BQiB8CisJCQlNUkVHU19NQ09ORklHX1JYRU5BQiB8CisJCQlNUkVHU19NQ09ORklHX01CQUVOQUIpOworCXJldHVybiBxZV9pbml0KHFlcCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgcWVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3VucWUgKnFlcCA9IChzdHJ1Y3Qgc3VucWUgKikgZGV2LT5wcml2OworCisJcWVfc3RvcChxZXApOworCXJldHVybiAwOworfQorCisvKiBSZWNsYWltIFRYJ2QgZnJhbWVzIGZyb20gdGhlIHJpbmcuICBUaGlzIG11c3QgYWx3YXlzIHJ1biB1bmRlcgorICogdGhlIElSUSBwcm90ZWN0ZWQgcWVwLT5sb2NrLgorICovCitzdGF0aWMgdm9pZCBxZV90eF9yZWNsYWltKHN0cnVjdCBzdW5xZSAqcWVwKQoreworCXN0cnVjdCBxZV90eGQgKnR4YmFzZSA9ICZxZXAtPnFlX2Jsb2NrLT5xZV90eGRbMF07CisJaW50IGVsZW0gPSBxZXAtPnR4X29sZDsKKworCXdoaWxlIChlbGVtICE9IHFlcC0+dHhfbmV3KSB7CisJCXUzMiBmbGFncyA9IHR4YmFzZVtlbGVtXS50eF9mbGFnczsKKworCQlpZiAoZmxhZ3MgJiBUWERfT1dOKQorCQkJYnJlYWs7CisJCWVsZW0gPSBORVhUX1RYKGVsZW0pOworCX0KKwlxZXAtPnR4X29sZCA9IGVsZW07Cit9CisKK3N0YXRpYyB2b2lkIHFlX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3VucWUgKnFlcCA9IChzdHJ1Y3Qgc3VucWUgKikgZGV2LT5wcml2OworCWludCB0eF9mdWxsOworCisJc3Bpbl9sb2NrX2lycSgmcWVwLT5sb2NrKTsKKworCS8qIFRyeSB0byByZWNsYWltLCBpZiB0aGF0IGZyZWVzIHVwIHNvbWUgdHgKKwkgKiBlbnRyaWVzLCB3ZSdyZSBmaW5lLgorCSAqLworCXFlX3R4X3JlY2xhaW0ocWVwKTsKKwl0eF9mdWxsID0gVFhfQlVGRlNfQVZBSUwocWVwKSA8PSAwOworCisJc3Bpbl91bmxvY2tfaXJxKCZxZXAtPmxvY2spOworCisJaWYgKCEgdHhfZnVsbCkKKwkJZ290byBvdXQ7CisKKwlwcmludGsoS0VSTl9FUlIgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHJlc2V0dGluZ1xuIiwgZGV2LT5uYW1lKTsKKwlxZV9pbml0KHFlcCwgMSk7CisKK291dDoKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qIEdldCBhIHBhY2tldCBxdWV1ZWQgdG8gZ28gb250byB0aGUgd2lyZS4gKi8KK3N0YXRpYyBpbnQgcWVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdW5xZSAqcWVwID0gKHN0cnVjdCBzdW5xZSAqKSBkZXYtPnByaXY7CisJc3RydWN0IHN1bnFlX2J1ZmZlcnMgKnFidWZzID0gcWVwLT5idWZmZXJzOworCV9fdTMyIHR4YnVmX2R2bWEsIHFidWZzX2R2bWEgPSBxZXAtPmJ1ZmZlcnNfZHZtYTsKKwl1bnNpZ25lZCBjaGFyICp0eGJ1ZjsKKwlpbnQgbGVuLCBlbnRyeTsKKworCXNwaW5fbG9ja19pcnEoJnFlcC0+bG9jayk7CisKKwlxZV90eF9yZWNsYWltKHFlcCk7CisKKwlsZW4gPSBza2ItPmxlbjsKKwllbnRyeSA9IHFlcC0+dHhfbmV3OworCisJdHhidWYgPSAmcWJ1ZnMtPnR4X2J1ZltlbnRyeSAmIChUWF9SSU5HX1NJWkUgLSAxKV1bMF07CisJdHhidWZfZHZtYSA9IHFidWZzX2R2bWEgKworCQlxZWJ1Zl9vZmZzZXQodHhfYnVmLCAoZW50cnkgJiAoVFhfUklOR19TSVpFIC0gMSkpKTsKKworCS8qIEF2b2lkIGEgcmFjZS4uLiAqLworCXFlcC0+cWVfYmxvY2stPnFlX3R4ZFtlbnRyeV0udHhfZmxhZ3MgPSBUWERfVVBEQVRFOworCisJbWVtY3B5KHR4YnVmLCBza2ItPmRhdGEsIGxlbik7CisKKwlxZXAtPnFlX2Jsb2NrLT5xZV90eGRbZW50cnldLnR4X2FkZHIgPSB0eGJ1Zl9kdm1hOworCXFlcC0+cWVfYmxvY2stPnFlX3R4ZFtlbnRyeV0udHhfZmxhZ3MgPQorCQkoVFhEX09XTiB8IFRYRF9TT1AgfCBUWERfRU9QIHwgKGxlbiAmIFRYRF9MRU5HVEgpKTsKKwlxZXAtPnR4X25ldyA9IE5FWFRfVFgoZW50cnkpOworCisJLyogR2V0IGl0IGdvaW5nLiAqLworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXNidXNfd3JpdGVsKENSRUdfQ1RSTF9UV0FLRVVQLCBxZXAtPnFjcmVncyArIENSRUdfQ1RSTCk7CisKKwlxZXAtPm5ldF9zdGF0cy50eF9wYWNrZXRzKys7CisJcWVwLT5uZXRfc3RhdHMudHhfYnl0ZXMgKz0gbGVuOworCisJaWYgKFRYX0JVRkZTX0FWQUlMKHFlcCkgPD0gMCkgeworCQkvKiBIYWx0IHRoZSBuZXQgcXVldWUgYW5kIGVuYWJsZSB0eCBpbnRlcnJ1cHRzLgorCQkgKiBXaGVuIHRoZSB0eCBxdWV1ZSBlbXB0aWVzIHRoZSB0eCBpcnEgaGFuZGxlcgorCQkgKiB3aWxsIHdha2UgdXAgdGhlIHF1ZXVlIGFuZCByZXR1cm4gdXMgYmFjayB0bworCQkgKiB0aGUgbGF6eSB0eCByZWNsYWltIHNjaGVtZS4KKwkJICovCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc2J1c193cml0ZWwoMCwgcWVwLT5xY3JlZ3MgKyBDUkVHX1RJTUFTSyk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmcWVwLT5sb2NrKTsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnFlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdW5xZSAqcWVwID0gKHN0cnVjdCBzdW5xZSAqKSBkZXYtPnByaXY7CisKKwlyZXR1cm4gJnFlcC0+bmV0X3N0YXRzOworfQorCitzdGF0aWMgdm9pZCBxZV9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN1bnFlICpxZXAgPSAoc3RydWN0IHN1bnFlICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IGRldi0+bWNfbGlzdDsKKwl1OCBuZXdfbWNvbmZpZyA9IHFlcC0+bWNvbmZpZzsKKwljaGFyICphZGRyczsKKwlpbnQgaTsKKwl1MzIgY3JjOworCisJLyogTG9jayBvdXQgb3RoZXJzLiAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmICgoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgfHwgKGRldi0+bWNfY291bnQgPiA2NCkpIHsKKwkJc2J1c193cml0ZWIoTVJFR1NfSUFDT05GSUdfQUNITkdFIHwgTVJFR1NfSUFDT05GSUdfTEFSRVNFVCwKKwkJCSAgICBxZXAtPm1yZWdzICsgTVJFR1NfSUFDT05GSUcpOworCQl3aGlsZSAoKHNidXNfcmVhZGIocWVwLT5tcmVncyArIE1SRUdTX0lBQ09ORklHKSAmIE1SRUdTX0lBQ09ORklHX0FDSE5HRSkgIT0gMCkKKwkJCWJhcnJpZXIoKTsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCXNidXNfd3JpdGViKDB4ZmYsIHFlcC0+bXJlZ3MgKyBNUkVHU19GSUxURVIpOworCQlzYnVzX3dyaXRlYigwLCBxZXAtPm1yZWdzICsgTVJFR1NfSUFDT05GSUcpOworCX0gZWxzZSBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCW5ld19tY29uZmlnIHw9IE1SRUdTX01DT05GSUdfUFJPTUlTQzsKKwl9IGVsc2UgeworCQl1MTYgaGFzaF90YWJsZVs0XTsKKwkJdTggKmhieXRlcyA9ICh1bnNpZ25lZCBjaGFyICopICZoYXNoX3RhYmxlWzBdOworCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQloYXNoX3RhYmxlW2ldID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrKSB7CisJCQlhZGRycyA9IGRtaS0+ZG1pX2FkZHI7CisJCQlkbWkgPSBkbWktPm5leHQ7CisKKwkJCWlmICghKCphZGRycyAmIDEpKQorCQkJCWNvbnRpbnVlOworCQkJY3JjID0gZXRoZXJfY3JjX2xlKDYsIGFkZHJzKTsKKwkJCWNyYyA+Pj0gMjY7CisJCQloYXNoX3RhYmxlW2NyYyA+PiA0XSB8PSAxIDw8IChjcmMgJiAweGYpOworCQl9CisJCS8qIFByb2dyYW0gdGhlIHFlIHdpdGggdGhlIG5ldyBmaWx0ZXIgdmFsdWUuICovCisJCXNidXNfd3JpdGViKE1SRUdTX0lBQ09ORklHX0FDSE5HRSB8IE1SRUdTX0lBQ09ORklHX0xBUkVTRVQsCisJCQkgICAgcWVwLT5tcmVncyArIE1SRUdTX0lBQ09ORklHKTsKKwkJd2hpbGUgKChzYnVzX3JlYWRiKHFlcC0+bXJlZ3MgKyBNUkVHU19JQUNPTkZJRykgJiBNUkVHU19JQUNPTkZJR19BQ0hOR0UpICE9IDApCisJCQliYXJyaWVyKCk7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCXU4IHRtcCA9ICpoYnl0ZXMrKzsKKwkJCXNidXNfd3JpdGViKHRtcCwgcWVwLT5tcmVncyArIE1SRUdTX0ZJTFRFUik7CisJCX0KKwkJc2J1c193cml0ZWIoMCwgcWVwLT5tcmVncyArIE1SRUdTX0lBQ09ORklHKTsKKwl9CisKKwkvKiBBbnkgY2hhbmdlIG9mIHRoZSBsb2dpY2FsIGFkZHJlc3MgZmlsdGVyLCB0aGUgcGh5c2ljYWwgYWRkcmVzcywKKwkgKiBvciBlbmFibGluZy9kaXNhYmxpbmcgcHJvbWlzY3VvdXMgbW9kZSBjYXVzZXMgdGhlIE1BQ0UgdG8gZGlzYWJsZQorCSAqIHRoZSByZWNlaXZlci4gIFNvIHdlIG11c3QgcmUtZW5hYmxlIHRoZW0gaGVyZSBvciBlbHNlIHRoZSBNQUNFCisJICogcmVmdXNlcyB0byBsaXN0ZW4gdG8gYW55dGhpbmcgb24gdGhlIG5ldHdvcmsuICBTaGVlc2gsIHRvb2sKKwkgKiBtZSBhIGRheSBvciB0d28gdG8gZmluZCB0aGlzIGJ1Zy4KKwkgKi8KKwlxZXAtPm1jb25maWcgPSBuZXdfbWNvbmZpZzsKKwlzYnVzX3dyaXRlYihxZXAtPm1jb25maWcsIHFlcC0+bXJlZ3MgKyBNUkVHU19NQ09ORklHKTsKKworCS8qIExldCB1cyBnZXQgZ29pbmcgYWdhaW4uICovCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisvKiBFdGh0b29sIHN1cHBvcnQuLi4gKi8KK3N0YXRpYyB2b2lkIHFlX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IHN1bnFlICpxZXAgPSBkZXYtPnByaXY7CisKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCAic3VucWUiKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgIjMuMCIpOworCXNwcmludGYoaW5mby0+YnVzX2luZm8sICJTQlVTOiVkIiwKKwkJcWVwLT5xZV9zZGV2LT5zbG90KTsKK30KKworc3RhdGljIHUzMiBxZV9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdW5xZSAqcWVwID0gZGV2LT5wcml2OworCXZvaWQgX19pb21lbSAqbXJlZ3MgPSBxZXAtPm1yZWdzOworCXU4IHBoeWNvbmZpZzsKKworCXNwaW5fbG9ja19pcnEoJnFlcC0+bG9jayk7CisJcGh5Y29uZmlnID0gc2J1c19yZWFkYihtcmVncyArIE1SRUdTX1BIWUNPTkZJRyk7CisJc3Bpbl91bmxvY2tfaXJxKCZxZXAtPmxvY2spOworCisJcmV0dXJuIChwaHljb25maWcgJiBNUkVHU19QSFlDT05GSUdfTFNUQVQpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHFlX2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbwkJPSBxZV9nZXRfZHJ2aW5mbywKKwkuZ2V0X2xpbmsJCT0gcWVfZ2V0X2xpbmssCit9OworCisvKiBUaGlzIGlzIG9ubHkgY2FsbGVkIG9uY2UgYXQgYm9vdCB0aW1lIGZvciBlYWNoIGNhcmQgcHJvYmVkLiAqLworc3RhdGljIGlubGluZSB2b2lkIHFlY19pbml0X29uY2Uoc3RydWN0IHN1bnFlYyAqcWVjcCwgc3RydWN0IHNidXNfZGV2ICpxc2RldikKK3sKKwl1OCBic2l6ZXMgPSBxZWNwLT5xZWNfYnVyc3RzOworCisJaWYgKHNidXNfY2FuX2J1cnN0NjQocXNkZXYpICYmIChic2l6ZXMgJiBETUFfQlVSU1Q2NCkpIHsKKwkJc2J1c193cml0ZWwoR0xPQl9DVFJMX0I2NCwgcWVjcC0+Z3JlZ3MgKyBHTE9CX0NUUkwpOworCX0gZWxzZSBpZiAoYnNpemVzICYgRE1BX0JVUlNUMzIpIHsKKwkJc2J1c193cml0ZWwoR0xPQl9DVFJMX0IzMiwgcWVjcC0+Z3JlZ3MgKyBHTE9CX0NUUkwpOworCX0gZWxzZSB7CisJCXNidXNfd3JpdGVsKEdMT0JfQ1RSTF9CMTYsIHFlY3AtPmdyZWdzICsgR0xPQl9DVFJMKTsKKwl9CisKKwkvKiBQYWNrZXRzaXplIG9ubHkgdXNlZCBpbiAxMDBiYXNlVCBCaWdNQUMgY29uZmlndXJhdGlvbnMsCisJICogc2V0IGl0IHRvIHplcm8ganVzdCB0byBiZSBvbiB0aGUgc2FmZSBzaWRlLgorCSAqLworCXNidXNfd3JpdGVsKEdMT0JfUFNJWkVfMjA0OCwgcWVjcC0+Z3JlZ3MgKyBHTE9CX1BTSVpFKTsKKworCS8qIFNldCB0aGUgbG9jYWwgbWVtc2l6ZSByZWdpc3RlciwgZGl2aWRlZCB1cCB0byBvbmUgcGllY2UgcGVyIFFFIGNoYW5uZWwuICovCisJc2J1c193cml0ZWwoKHFzZGV2LT5yZWdfYWRkcnNbMV0ucmVnX3NpemUgPj4gMiksCisJCSAgICBxZWNwLT5ncmVncyArIEdMT0JfTVNJWkUpOworCisJLyogRGl2aWRlIHVwIHRoZSBsb2NhbCBRRUMgbWVtb3J5IGFtb25nc3QgdGhlIDQgUUUgcmVjZWl2ZXIgYW5kCisJICogdHJhbnNtaXR0ZXIgRklGT3MuICBCYXNpY2FsbHkgaXQgaXMgKHRvdGFsIC8gMiAvIG51bV9jaGFubmVscykuCisJICovCisJc2J1c193cml0ZWwoKHFzZGV2LT5yZWdfYWRkcnNbMV0ucmVnX3NpemUgPj4gMikgPj4gMSwKKwkJICAgIHFlY3AtPmdyZWdzICsgR0xPQl9UU0laRSk7CisJc2J1c193cml0ZWwoKHFzZGV2LT5yZWdfYWRkcnNbMV0ucmVnX3NpemUgPj4gMikgPj4gMSwKKwkJICAgIHFlY3AtPmdyZWdzICsgR0xPQl9SU0laRSk7Cit9CisKKy8qIEZvdXIgUUUncyBwZXIgUUVDIGNhcmQuICovCitzdGF0aWMgaW50IF9faW5pdCBxZWNfZXRoZXJfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYpCit7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqcWVfZGV2c1s0XTsKKwlzdHJ1Y3Qgc3VucWUgKnFlcHNbNF07CisJc3RydWN0IHNidXNfZGV2ICpxZXNkZXZzWzRdOworCXN0cnVjdCBzYnVzX2RldiAqY2hpbGQ7CisJc3RydWN0IHN1bnFlYyAqcWVjcCA9IE5VTEw7CisJdTggYnNpemVzLCBic2l6ZXNfbW9yZTsKKwlpbnQgaSwgaiwgcmVzID0gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJcWVfZGV2c1tpXSA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qgc3VucWUpKTsKKwkJaWYgKCFxZV9kZXZzW2ldKQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKHZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXFlcHNbaV0gPSAoc3RydWN0IHN1bnFlICopIHFlX2RldnNbaV0tPnByaXY7CisJCWZvciAoaiA9IDA7IGogPCA2OyBqKyspCisJCQlxZV9kZXZzW2ldLT5kZXZfYWRkcltqXSA9IGlkcHJvbS0+aWRfZXRoYWRkcltqXTsKKwkJcWVwc1tpXS0+Y2hhbm5lbCA9IGk7CisJCXNwaW5fbG9ja19pbml0KCZxZXBzW2ldLT5sb2NrKTsKKwl9CisKKwlxZWNwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHN1bnFlYyksIEdGUF9LRVJORUwpOworCWlmIChxZWNwID09IE5VTEwpCisJCWdvdG8gb3V0MTsKKwlxZWNwLT5xZWNfc2RldiA9IHNkZXY7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXFlY3AtPnFlc1tpXSA9IHFlcHNbaV07CisJCXFlcHNbaV0tPmRldiA9IHFlX2RldnNbaV07CisJCXFlcHNbaV0tPnBhcmVudCA9IHFlY3A7CisJfQorCisJcmVzID0gLUVOT0RFVjsKKworCWZvciAoaSA9IDAsIGNoaWxkID0gc2Rldi0+Y2hpbGQ7IGkgPCA0OyBpKyssIGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKwkJLyogTGluayBpbiBjaGFubmVsICovCisJCWogPSBwcm9tX2dldGludGRlZmF1bHQoY2hpbGQtPnByb21fbm9kZSwgImNoYW5uZWwjIiwgLTEpOworCQlpZiAoaiA9PSAtMSkKKwkJCWdvdG8gb3V0MjsKKwkJcWVzZGV2c1tqXSA9IGNoaWxkOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCXFlcHNbaV0tPnFlX3NkZXYgPSBxZXNkZXZzW2ldOworCisJLyogTm93IG1hcCBpbiB0aGUgcmVnaXN0ZXJzLCBRRUMgZ2xvYmFscyBmaXJzdC4gKi8KKwlxZWNwLT5ncmVncyA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbMF0sIDAsCisJCQkJICAgR0xPQl9SRUdfU0laRSwgIlFFQyBHbG9iYWwgUmVnaXN0ZXJzIik7CisJaWYgKCFxZWNwLT5ncmVncykgeworCQlwcmludGsoS0VSTl9FUlIgIlF1YWRFdGhlcjogQ2Fubm90IG1hcCBRRUMgZ2xvYmFsIHJlZ2lzdGVycy5cbiIpOworCQlnb3RvIG91dDI7CisJfQorCisJLyogTWFrZSBzdXJlIHRoZSBRRUMgaXMgaW4gTUFDRSBtb2RlLiAqLworCWlmICgoc2J1c19yZWFkbChxZWNwLT5ncmVncyArIEdMT0JfQ1RSTCkgJiAweGYwMDAwMDAwKSAhPSBHTE9CX0NUUkxfTU1PREUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJRdWFkRXRoZXI6IEFJRUVFLCBRRUMgaXMgbm90IGluIE1BQ0UgbW9kZSFcbiIpOworCQlnb3RvIG91dDM7CisJfQorCisJLyogUmVzZXQgdGhlIFFFQy4gKi8KKwlpZiAocWVjX2dsb2JhbF9yZXNldChxZWNwLT5ncmVncykpCisJCWdvdG8gb3V0MzsKKworCS8qIEZpbmQgYW5kIHNldCB0aGUgYnVyc3Qgc2l6ZXMgZm9yIHRoZSBRRUMsIHNpbmNlIGl0IGRvZXMKKwkgKiB0aGUgYWN0dWFsIGRtYSBmb3IgYWxsIDQgY2hhbm5lbHMuCisJICovCisJYnNpemVzID0gcHJvbV9nZXRpbnRkZWZhdWx0KHNkZXYtPnByb21fbm9kZSwgImJ1cnN0LXNpemVzIiwgMHhmZik7CisJYnNpemVzICY9IDB4ZmY7CisJYnNpemVzX21vcmUgPSBwcm9tX2dldGludGRlZmF1bHQoc2Rldi0+YnVzLT5wcm9tX25vZGUsICJidXJzdC1zaXplcyIsIDB4ZmYpOworCisJaWYgKGJzaXplc19tb3JlICE9IDB4ZmYpCisJCWJzaXplcyAmPSBic2l6ZXNfbW9yZTsKKwlpZiAoYnNpemVzID09IDB4ZmYgfHwgKGJzaXplcyAmIERNQV9CVVJTVDE2KSA9PSAwIHx8CisJICAgKGJzaXplcyAmIERNQV9CVVJTVDMyKT09MCkKKwkJYnNpemVzID0gKERNQV9CVVJTVDMyIC0gMSk7CisKKwlxZWNwLT5xZWNfYnVyc3RzID0gYnNpemVzOworCisJLyogUGVyZm9ybSBvbmUgdGltZSBRRUMgaW5pdGlhbGl6YXRpb24sIHdlIG5ldmVyIHRvdWNoIHRoZSBRRUMKKwkgKiBnbG9iYWxzIGFnYWluIGFmdGVyIHRoaXMuCisJICovCisJcWVjX2luaXRfb25jZShxZWNwLCBzZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJc3RydWN0IHN1bnFlICpxZSA9IHFlcHNbaV07CisJCS8qIE1hcCBpbiBRRUMgcGVyLWNoYW5uZWwgY29udHJvbCByZWdpc3RlcnMuICovCisJCXFlLT5xY3JlZ3MgPSBzYnVzX2lvcmVtYXAoJnFlLT5xZV9zZGV2LT5yZXNvdXJjZVswXSwgMCwKKwkJCQkgICAgICAgQ1JFR19SRUdfU0laRSwgIlFFQyBDaGFubmVsIFJlZ2lzdGVycyIpOworCQlpZiAoIXFlLT5xY3JlZ3MpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiUXVhZEV0aGVyOiBDYW5ub3QgbWFwIFFFICVkJ3MgY2hhbm5lbCByZWdpc3RlcnMuXG4iLCBpKTsKKwkJCWdvdG8gb3V0NDsKKwkJfQorCisJCS8qIE1hcCBpbiBwZXItY2hhbm5lbCBBTUQgTUFDRSByZWdpc3RlcnMuICovCisJCXFlLT5tcmVncyA9IHNidXNfaW9yZW1hcCgmcWUtPnFlX3NkZXYtPnJlc291cmNlWzFdLCAwLAorCQkJCSAgICAgIE1SRUdTX1JFR19TSVpFLCAiUUUgTUFDRSBSZWdpc3RlcnMiKTsKKwkJaWYgKCFxZS0+bXJlZ3MpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiUXVhZEV0aGVyOiBDYW5ub3QgbWFwIFFFICVkJ3MgTUFDRSByZWdpc3RlcnMuXG4iLCBpKTsKKwkJCWdvdG8gb3V0NDsKKwkJfQorCisJCXFlLT5xZV9ibG9jayA9IHNidXNfYWxsb2NfY29uc2lzdGVudChxZS0+cWVfc2RldiwKKwkJCQkJCSAgUEFHRV9TSVpFLAorCQkJCQkJICAmcWUtPnFibG9ja19kdm1hKTsKKwkJcWUtPmJ1ZmZlcnMgPSBzYnVzX2FsbG9jX2NvbnNpc3RlbnQocWUtPnFlX3NkZXYsCisJCQkJCQkgc2l6ZW9mKHN0cnVjdCBzdW5xZV9idWZmZXJzKSwKKwkJCQkJCSAmcWUtPmJ1ZmZlcnNfZHZtYSk7CisJCWlmIChxZS0+cWVfYmxvY2sgPT0gTlVMTCB8fCBxZS0+cWJsb2NrX2R2bWEgPT0gMCB8fAorCQkgICAgcWUtPmJ1ZmZlcnMgPT0gTlVMTCB8fCBxZS0+YnVmZmVyc19kdm1hID09IDApIHsKKwkJCWdvdG8gb3V0NDsKKwkJfQorCisJCS8qIFN0b3AgdGhpcyBRRS4gKi8KKwkJcWVfc3RvcChxZSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlTRVRfTU9EVUxFX09XTkVSKHFlX2RldnNbaV0pOworCQlxZV9kZXZzW2ldLT5vcGVuID0gcWVfb3BlbjsKKwkJcWVfZGV2c1tpXS0+c3RvcCA9IHFlX2Nsb3NlOworCQlxZV9kZXZzW2ldLT5oYXJkX3N0YXJ0X3htaXQgPSBxZV9zdGFydF94bWl0OworCQlxZV9kZXZzW2ldLT5nZXRfc3RhdHMgPSBxZV9nZXRfc3RhdHM7CisJCXFlX2RldnNbaV0tPnNldF9tdWx0aWNhc3RfbGlzdCA9IHFlX3NldF9tdWx0aWNhc3Q7CisJCXFlX2RldnNbaV0tPnR4X3RpbWVvdXQgPSBxZV90eF90aW1lb3V0OworCQlxZV9kZXZzW2ldLT53YXRjaGRvZ190aW1lbyA9IDUqSFo7CisJCXFlX2RldnNbaV0tPmlycSA9IHNkZXYtPmlycXNbMF07CisJCXFlX2RldnNbaV0tPmRtYSA9IDA7CisJCXFlX2RldnNbaV0tPmV0aHRvb2xfb3BzID0gJnFlX2V0aHRvb2xfb3BzOworCX0KKworCS8qIFFFQyByZWNlaXZlcyBpbnRlcnJ1cHRzIGZyb20gZWFjaCBRRSwgdGhlbiBpdCBzZW5kcyB0aGUgYWN0dWFsCisJICogSVJRIHRvIHRoZSBjcHUgaXRzZWxmLiAgU2luY2UgUUVDIGlzIHRoZSBzaW5nbGUgcG9pbnQgb2YKKwkgKiBpbnRlcnJ1cHQgZm9yIGFsbCBRRSBjaGFubmVscyB3ZSByZWdpc3RlciB0aGUgSVJRIGhhbmRsZXIKKwkgKiBmb3IgaXQgbm93LgorCSAqLworCWlmIChyZXF1ZXN0X2lycShzZGV2LT5pcnFzWzBdLCAmcWVjX2ludGVycnVwdCwKKwkJCVNBX1NISVJRLCAiUXVhZEV0aGVyIiwgKHZvaWQgKikgcWVjcCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJRdWFkRXRoZXI6IENhbid0IHJlZ2lzdGVyIFFFQyBtYXN0ZXIgaXJxIGhhbmRsZXIuXG4iKTsKKwkJcmVzID0gLUVBR0FJTjsKKwkJZ290byBvdXQ0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKHJlZ2lzdGVyX25ldGRldihxZV9kZXZzW2ldKSAhPSAwKQorCQkJZ290byBvdXQ1OworCX0KKworCS8qIFJlcG9ydCB0aGUgUUUgY2hhbm5lbHMuICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogUXVhZEV0aGVybmV0IGNoYW5uZWxbJWRdICIsIHFlX2RldnNbaV0tPm5hbWUsIGkpOworCQlmb3IgKGogPSAwOyBqIDwgNjsgaisrKQorCQkJcHJpbnRrICgiJTIuMnglYyIsCisJCQkJcWVfZGV2c1tpXS0+ZGV2X2FkZHJbal0sCisJCQkJaiA9PSA1ID8gJyAnOiAnOicpOworCQlwcmludGsoIlxuIik7CisJfQorCisJLyogV2UgYXJlIGhvbWUgZnJlZSBhdCB0aGlzIHBvaW50LCBsaW5rIHRoZSBxZSdzIGludG8KKwkgKiB0aGUgbWFzdGVyIGxpc3QgZm9yIGxhdGVyIGRyaXZlciBleGl0LgorCSAqLworCXFlY3AtPm5leHRfbW9kdWxlID0gcm9vdF9xZWNfZGV2OworCXJvb3RfcWVjX2RldiA9IHFlY3A7CisKKwlyZXR1cm4gMDsKKworb3V0NToKKwl3aGlsZSAoaS0tKQorCQl1bnJlZ2lzdGVyX25ldGRldihxZV9kZXZzW2ldKTsKKwlmcmVlX2lycShzZGV2LT5pcnFzWzBdLCAodm9pZCAqKXFlY3ApOworb3V0NDoKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXN0cnVjdCBzdW5xZSAqcWUgPSAoc3RydWN0IHN1bnFlICopcWVfZGV2c1tpXS0+cHJpdjsKKworCQlpZiAocWUtPnFjcmVncykKKwkJCXNidXNfaW91bm1hcChxZS0+cWNyZWdzLCBDUkVHX1JFR19TSVpFKTsKKwkJaWYgKHFlLT5tcmVncykKKwkJCXNidXNfaW91bm1hcChxZS0+bXJlZ3MsIE1SRUdTX1JFR19TSVpFKTsKKwkJaWYgKHFlLT5xZV9ibG9jaykKKwkJCXNidXNfZnJlZV9jb25zaXN0ZW50KHFlLT5xZV9zZGV2LAorCQkJCQkgICAgIFBBR0VfU0laRSwKKwkJCQkJICAgICBxZS0+cWVfYmxvY2ssCisJCQkJCSAgICAgcWUtPnFibG9ja19kdm1hKTsKKwkJaWYgKHFlLT5idWZmZXJzKQorCQkJc2J1c19mcmVlX2NvbnNpc3RlbnQocWUtPnFlX3NkZXYsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzdW5xZV9idWZmZXJzKSwKKwkJCQkJICAgICBxZS0+YnVmZmVycywKKwkJCQkJICAgICBxZS0+YnVmZmVyc19kdm1hKTsKKwl9CitvdXQzOgorCXNidXNfaW91bm1hcChxZWNwLT5ncmVncywgR0xPQl9SRUdfU0laRSk7CitvdXQyOgorCWtmcmVlKHFlY3ApOworb3V0MToKKwlpID0gNDsKK291dDoKKwl3aGlsZSAoaS0tKQorCQlmcmVlX25ldGRldihxZV9kZXZzW2ldKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IF9faW5pdCBxZWNfbWF0Y2goc3RydWN0IHNidXNfZGV2ICpzZGV2KQoreworCXN0cnVjdCBzYnVzX2RldiAqc2libGluZzsKKwlpbnQgaTsKKworCWlmIChzdHJjbXAoc2Rldi0+cHJvbV9uYW1lLCAicWVjIikgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBRRUMgY2FuIGJlIHBhcmVudCBvZiBlaXRoZXIgUXVhZEV0aGVybmV0IG9yIEJpZ01BQworCSAqIGNoaWxkcmVuLiAgRG8gbm90IGNvbmZ1c2UgdGhpcyB3aXRoIHFmZS9TVU5XLHFmZQorCSAqIHdoaWNoIGlzIGEgcXVhZC1oYXBweW1lYWwgY2FyZCBhbmQgaGFuZGxlZCBieQorCSAqIGEgZGlmZmVyZW50IGRyaXZlci4KKwkgKi8KKwlzaWJsaW5nID0gc2Rldi0+Y2hpbGQ7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAoc2libGluZyA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCWlmIChzdHJjbXAoc2libGluZy0+cHJvbV9uYW1lLCAicWUiKSAhPSAwKQorCQkJcmV0dXJuIDA7CisJCXNpYmxpbmcgPSBzaWJsaW5nLT5uZXh0OworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgcWVjX3Byb2JlKHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IHNidXNfYnVzICpidXM7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gTlVMTDsKKwlzdGF0aWMgaW50IGNhbGxlZDsKKwlpbnQgY2FyZHMgPSAwLCB2OworCisJcm9vdF9xZWNfZGV2ID0gTlVMTDsKKworCWlmIChjYWxsZWQpCisJCXJldHVybiAtRU5PREVWOworCWNhbGxlZCsrOworCisJZm9yX2VhY2hfc2J1cyhidXMpIHsKKwkJZm9yX2VhY2hfc2J1c2RldihzZGV2LCBidXMpIHsKKwkJCWlmIChjYXJkcykKKwkJCQlkZXYgPSBOVUxMOworCisJCQlpZiAocWVjX21hdGNoKHNkZXYpKSB7CisJCQkJY2FyZHMrKzsKKwkJCQlpZiAoKHYgPSBxZWNfZXRoZXJfaW5pdChkZXYsIHNkZXYpKSkKKwkJCQkJcmV0dXJuIHY7CisJCQl9CisJCX0KKwl9CisJaWYgKCFjYXJkcykKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBxZWNfY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBzdW5xZWMgKm5leHRfcWVjOworCWludCBpOworCisJd2hpbGUgKHJvb3RfcWVjX2RldikgeworCQluZXh0X3FlYyA9IHJvb3RfcWVjX2Rldi0+bmV4dF9tb2R1bGU7CisKKwkJLyogUmVsZWFzZSBhbGwgZm91ciBRRSBjaGFubmVscywgdGhlbiB0aGUgUUVDIGl0c2VsZi4gKi8KKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYocm9vdF9xZWNfZGV2LT5xZXNbaV0tPmRldik7CisJCQlzYnVzX2lvdW5tYXAocm9vdF9xZWNfZGV2LT5xZXNbaV0tPnFjcmVncywgQ1JFR19SRUdfU0laRSk7CisJCQlzYnVzX2lvdW5tYXAocm9vdF9xZWNfZGV2LT5xZXNbaV0tPm1yZWdzLCBNUkVHU19SRUdfU0laRSk7CisJCQlzYnVzX2ZyZWVfY29uc2lzdGVudChyb290X3FlY19kZXYtPnFlc1tpXS0+cWVfc2RldiwKKwkJCQkJICAgICBQQUdFX1NJWkUsCisJCQkJCSAgICAgcm9vdF9xZWNfZGV2LT5xZXNbaV0tPnFlX2Jsb2NrLAorCQkJCQkgICAgIHJvb3RfcWVjX2Rldi0+cWVzW2ldLT5xYmxvY2tfZHZtYSk7CisJCQlzYnVzX2ZyZWVfY29uc2lzdGVudChyb290X3FlY19kZXYtPnFlc1tpXS0+cWVfc2RldiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IHN1bnFlX2J1ZmZlcnMpLAorCQkJCQkgICAgIHJvb3RfcWVjX2Rldi0+cWVzW2ldLT5idWZmZXJzLAorCQkJCQkgICAgIHJvb3RfcWVjX2Rldi0+cWVzW2ldLT5idWZmZXJzX2R2bWEpOworCQkJZnJlZV9uZXRkZXYocm9vdF9xZWNfZGV2LT5xZXNbaV0tPmRldik7CisJCX0KKwkJZnJlZV9pcnEocm9vdF9xZWNfZGV2LT5xZWNfc2Rldi0+aXJxc1swXSwgKHZvaWQgKilyb290X3FlY19kZXYpOworCQlzYnVzX2lvdW5tYXAocm9vdF9xZWNfZGV2LT5ncmVncywgR0xPQl9SRUdfU0laRSk7CisJCWtmcmVlKHJvb3RfcWVjX2Rldik7CisJCXJvb3RfcWVjX2RldiA9IG5leHRfcWVjOworCX0KK30KKworbW9kdWxlX2luaXQocWVjX3Byb2JlKTsKK21vZHVsZV9leGl0KHFlY19jbGVhbnVwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bnFlLmggYi9kcml2ZXJzL25ldC9zdW5xZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMzRmMzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9zdW5xZS5oCkBAIC0wLDAgKzEsMzUxIEBACisvKiAkSWQ6IHN1bnFlLmgsdiAxLjEzIDIwMDAvMDIvMDkgMTE6MTU6NDIgZGF2ZW0gRXhwICQKKyAqIHN1bnFlLmg6IERlZmluaXRpb25zIGZvciB0aGUgU3VuIFF1YWRFdGhlcm5ldCBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSkKKyAqLworCisjaWZuZGVmIF9TVU5RRV9ICisjZGVmaW5lIF9TVU5RRV9ICisKKy8qIFFFQyBnbG9iYWwgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBHTE9CX0NUUkwJMHgwMFVMCQkvKiBDb250cm9sCQkJKi8KKyNkZWZpbmUgR0xPQl9TVEFUCTB4MDRVTAkJLyogU3RhdHVzCQkJKi8KKyNkZWZpbmUgR0xPQl9QU0laRQkweDA4VUwJCS8qIFBhY2tldCBTaXplCQkJKi8KKyNkZWZpbmUgR0xPQl9NU0laRQkweDBjVUwJCS8qIExvY2FsLW1lbW9yeSBTaXplCQkqLworI2RlZmluZSBHTE9CX1JTSVpFCTB4MTBVTAkJLyogUmVjZWl2ZSBwYXJ0aXRpb24gc2l6ZQkqLworI2RlZmluZSBHTE9CX1RTSVpFCTB4MTRVTAkJLyogVHJhbnNtaXQgcGFydGl0aW9uIHNpemUJKi8KKyNkZWZpbmUgR0xPQl9SRUdfU0laRQkweDE4VUwKKworI2RlZmluZSBHTE9CX0NUUkxfTU1PREUgICAgICAgMHg0MDAwMDAwMCAvKiBNQUNFIHFlYyBtb2RlICAgICAgICAgICAgKi8KKyNkZWZpbmUgR0xPQl9DVFJMX0JNT0RFICAgICAgIDB4MTAwMDAwMDAgLyogQmlnTUFDIHFlYyBtb2RlICAgICAgICAgICovCisjZGVmaW5lIEdMT0JfQ1RSTF9FUEFSICAgICAgICAweDAwMDAwMDIwIC8qIEVuYWJsZSBwYXJpdHkgICAgICAgICAgICAqLworI2RlZmluZSBHTE9CX0NUUkxfQUNOVFJMICAgICAgMHgwMDAwMDAxOCAvKiBTQlVTIGFyYml0cmF0aW9uIGNvbnRyb2wgKi8KKyNkZWZpbmUgR0xPQl9DVFJMX0I2NCAgICAgICAgIDB4MDAwMDAwMDQgLyogNjQgYnl0ZSBkdm1hIGJ1cnN0cyAgICAgICovCisjZGVmaW5lIEdMT0JfQ1RSTF9CMzIgICAgICAgICAweDAwMDAwMDAyIC8qIDMyIGJ5dGUgZHZtYSBidXJzdHMgICAgICAqLworI2RlZmluZSBHTE9CX0NUUkxfQjE2ICAgICAgICAgMHgwMDAwMDAwMCAvKiAxNiBieXRlIGR2bWEgYnVyc3RzICAgICAgKi8KKyNkZWZpbmUgR0xPQl9DVFJMX1JFU0VUICAgICAgIDB4MDAwMDAwMDEgLyogUmVzZXQgdGhlIFFFQyAgICAgICAgICAgICovCisKKyNkZWZpbmUgR0xPQl9TVEFUX1RYICAgICAgICAgIDB4MDAwMDAwMDggLyogQmlnTUFDIFRyYW5zbWl0IElSUSAgICAgICovCisjZGVmaW5lIEdMT0JfU1RBVF9SWCAgICAgICAgICAweDAwMDAwMDA0IC8qIEJpZ01BQyBSZWNlaXZlIElSUSAgICAgICAqLworI2RlZmluZSBHTE9CX1NUQVRfQk0gICAgICAgICAgMHgwMDAwMDAwMiAvKiBCaWdNQUMgR2xvYmFsIElSUSAgICAgICAgKi8KKyNkZWZpbmUgR0xPQl9TVEFUX0VSICAgICAgICAgIDB4MDAwMDAwMDEgLyogQmlnTUFDIEVycm9yIElSUSAgICAgICAgICovCisKKyNkZWZpbmUgR0xPQl9QU0laRV8yMDQ4ICAgICAgIDB4MDAgICAgICAgLyogMmsgcGFja2V0IHNpemUgICAgICAgICAgICovCisjZGVmaW5lIEdMT0JfUFNJWkVfNDA5NiAgICAgICAweDAxICAgICAgIC8qIDRrIHBhY2tldCBzaXplICAgICAgICAgICAqLworI2RlZmluZSBHTE9CX1BTSVpFXzYxNDQgICAgICAgMHgxMCAgICAgICAvKiA2ayBwYWNrZXQgc2l6ZSAgICAgICAgICAgKi8KKyNkZWZpbmUgR0xPQl9QU0laRV84MTkyICAgICAgIDB4MTEgICAgICAgLyogOGsgcGFja2V0IHNpemUgICAgICAgICAgICovCisKKy8qIEluIE1BQ0UgbW9kZSwgdGhlcmUgYXJlIGZvdXIgcWUgY2hhbm5lbHMuICBFYWNoIGNoYW5uZWwgaGFzIGl0J3Mgb3duCisgKiBzdGF0dXMgYml0cyBpbiB0aGUgUUVDIHN0YXR1cyByZWdpc3Rlci4gIFRoaXMgbWFjcm8gcGlja3Mgb3V0IHRoZQorICogb25lcyB5b3Ugd2FudC4KKyAqLworI2RlZmluZSBHTE9CX1NUQVRfUEVSX1FFKHN0YXR1cywgY2hhbm5lbCkgKCgoc3RhdHVzKSA+PiAoKGNoYW5uZWwpICogNCkpICYgMHhmKQorCisvKiBUaGUgZm9sbG93aW5nIHJlZ2lzdGVycyBhcmUgZm9yIHBlci1xZSBjaGFubmVsIGluZm9ybWF0aW9uL3N0YXR1cy4gKi8KKyNkZWZpbmUgQ1JFR19DVFJMCTB4MDBVTAkvKiBDb250cm9sICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfU1RBVAkweDA0VUwJLyogU3RhdHVzICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1JYRFMJMHgwOFVMCS8qIFJYIGRlc2NyaXB0b3IgcmluZyBwdHIgICAgKi8KKyNkZWZpbmUgQ1JFR19UWERTCTB4MGNVTAkvKiBUWCBkZXNjcmlwdG9yIHJpbmcgcHRyICAgICovCisjZGVmaW5lIENSRUdfUklNQVNLCTB4MTBVTAkvKiBSWCBJbnRlcnJ1cHQgTWFzayAgICAgICAgICovCisjZGVmaW5lIENSRUdfVElNQVNLCTB4MTRVTAkvKiBUWCBJbnRlcnJ1cHQgTWFzayAgICAgICAgICovCisjZGVmaW5lIENSRUdfUU1BU0sJMHgxOFVMCS8qIFFFQyBFcnJvciBJbnRlcnJ1cHQgTWFzayAgKi8KKyNkZWZpbmUgQ1JFR19NTUFTSwkweDFjVUwJLyogTUFDRSBFcnJvciBJbnRlcnJ1cHQgTWFzayAqLworI2RlZmluZSBDUkVHX1JYV0JVRlBUUgkweDIwVUwJLyogTG9jYWwgbWVtb3J5IHJ4IHdyaXRlIHB0ciAqLworI2RlZmluZSBDUkVHX1JYUkJVRlBUUgkweDI0VUwJLyogTG9jYWwgbWVtb3J5IHJ4IHJlYWQgcHRyICAqLworI2RlZmluZSBDUkVHX1RYV0JVRlBUUgkweDI4VUwJLyogTG9jYWwgbWVtb3J5IHR4IHdyaXRlIHB0ciAqLworI2RlZmluZSBDUkVHX1RYUkJVRlBUUgkweDJjVUwJLyogTG9jYWwgbWVtb3J5IHR4IHJlYWQgcHRyICAqLworI2RlZmluZSBDUkVHX0NDTlQJMHgzMFVMCS8qIENvbGxpc2lvbiBDb3VudGVyICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19QSVBHCTB4MzRVTAkvKiBJbnRlci1GcmFtZSBHYXAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfUkVHX1NJWkUJMHgzOFVMCisKKyNkZWZpbmUgQ1JFR19DVFJMX1JYT0ZGICAgICAgIDB4MDAwMDAwMDQgIC8qIERpc2FibGUgdGhpcyBxZSdzIHJlY2VpdmVyKi8KKyNkZWZpbmUgQ1JFR19DVFJMX1JFU0VUICAgICAgIDB4MDAwMDAwMDIgIC8qIFJlc2V0IHRoaXMgcWUgY2hhbm5lbCAgICAgKi8KKyNkZWZpbmUgQ1JFR19DVFJMX1RXQUtFVVAgICAgIDB4MDAwMDAwMDEgIC8qIFRyYW5zbWl0dGVyIFdha2V1cCwgJ2dvJy4gKi8KKworI2RlZmluZSBDUkVHX1NUQVRfRURFRkVSICAgICAgMHgxMDAwMDAwMCAgLyogRXhjZXNzaXZlIERlZmVycyAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfQ0xPU1MgICAgICAgMHgwODAwMDAwMCAgLyogQ2FycmllciBMb3NzICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfRVJFVFJJRVMgICAgMHgwNDAwMDAwMCAgLyogTW9yZSB0aGFuIDE2IHJldHJpZXMgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfTENPTEwgICAgICAgMHgwMjAwMDAwMCAgLyogTGF0ZSBUWCBDb2xsaXNpb24gICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfRlVGTE9XICAgICAgMHgwMTAwMDAwMCAgLyogRklGTyBVbmRlcmZsb3cgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfSkVSUk9SICAgICAgMHgwMDgwMDAwMCAgLyogSmFiYmVyIEVycm9yICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfQkVSUk9SICAgICAgMHgwMDQwMDAwMCAgLyogQmFiYmxlIEVycm9yICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfVFhJUlEgICAgICAgMHgwMDIwMDAwMCAgLyogVHJhbnNtaXQgSW50ZXJydXB0ICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfQ0NPRkxPVyAgICAgMHgwMDEwMDAwMCAgLyogVFggQ29sbC1jb3VudGVyIE92ZXJmbG93ICAqLworI2RlZmluZSBDUkVHX1NUQVRfVFhERVJST1IgICAgMHgwMDA4MDAwMCAgLyogVFggRGVzY3JpcHRvciBpcyBib2d1cyAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfVFhMRVJSICAgICAgMHgwMDA0MDAwMCAgLyogTGF0ZSBUcmFuc21pdCBFcnJvciAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfVFhQRVJSICAgICAgMHgwMDAyMDAwMCAgLyogVHJhbnNtaXQgUGFyaXR5IEVycm9yICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfVFhTRVJSICAgICAgMHgwMDAxMDAwMCAgLyogVHJhbnNtaXQgU0JVUyBlcnJvciBhY2sgICAqLworI2RlZmluZSBDUkVHX1NUQVRfUkNDT0ZMT1cgICAgMHgwMDAwMTAwMCAgLyogUlggQ29sbC1jb3VudGVyIE92ZXJmbG93ICAqLworI2RlZmluZSBDUkVHX1NUQVRfUlVPRkxPVyAgICAgMHgwMDAwMDgwMCAgLyogUnVudCBDb3VudGVyIE92ZXJmbG93ICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfTUNPRkxPVyAgICAgMHgwMDAwMDQwMCAgLyogTWlzc2VkIENvdW50ZXIgT3ZlcmZsb3cgICAqLworI2RlZmluZSBDUkVHX1NUQVRfUlhGT0ZMT1cgICAgMHgwMDAwMDIwMCAgLyogUlggRklGTyBPdmVyZmxvdyAgICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfUkxDT0xMICAgICAgMHgwMDAwMDEwMCAgLyogUlggTGF0ZSBDb2xsaXNpb24gICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfRkNPRkxPVyAgICAgMHgwMDAwMDA4MCAgLyogRnJhbWUgQ291bnRlciBPdmVyZmxvdyAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfQ0VDT0ZMT1cgICAgMHgwMDAwMDA0MCAgLyogQ1JDIEVycm9yLWNvdW50ZXIgT3ZlcmZsb3cqLworI2RlZmluZSBDUkVHX1NUQVRfUlhJUlEgICAgICAgMHgwMDAwMDAyMCAgLyogUmVjZWl2ZSBJbnRlcnJ1cHQgICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfUlhEUk9QICAgICAgMHgwMDAwMDAxMCAgLyogRHJvcHBlZCBhIFJYJ2QgcGFja2V0ICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfUlhTTUFMTCAgICAgMHgwMDAwMDAwOCAgLyogUmVjZWl2ZSBidWZmZXIgdG9vIHNtYWxsICAqLworI2RlZmluZSBDUkVHX1NUQVRfUlhMRVJSICAgICAgMHgwMDAwMDAwNCAgLyogUmVjZWl2ZSBMYXRlIEVycm9yICAgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfUlhQRVJSICAgICAgMHgwMDAwMDAwMiAgLyogUmVjZWl2ZSBQYXJpdHkgRXJyb3IgICAgICAqLworI2RlZmluZSBDUkVHX1NUQVRfUlhTRVJSICAgICAgMHgwMDAwMDAwMSAgLyogUmVjZWl2ZSBTQlVTIEVycm9yIEFDSyAgICAqLworCisjZGVmaW5lIENSRUdfU1RBVF9FUlJPUlMgICAgICAoQ1JFR19TVEFUX0VERUZFUnxDUkVHX1NUQVRfQ0xPU1N8Q1JFR19TVEFUX0VSRVRSSUVTfCAgICAgXAorCQkJICAgICAgIENSRUdfU1RBVF9MQ09MTHxDUkVHX1NUQVRfRlVGTE9XfENSRUdfU1RBVF9KRVJST1J8ICAgICAgIFwKKwkJCSAgICAgICBDUkVHX1NUQVRfQkVSUk9SfENSRUdfU1RBVF9DQ09GTE9XfENSRUdfU1RBVF9UWERFUlJPUnwgICBcCisJCQkgICAgICAgQ1JFR19TVEFUX1RYTEVSUnxDUkVHX1NUQVRfVFhQRVJSfENSRUdfU1RBVF9UWFNFUlJ8ICAgICAgXAorCQkJICAgICAgIENSRUdfU1RBVF9SQ0NPRkxPV3xDUkVHX1NUQVRfUlVPRkxPV3xDUkVHX1NUQVRfTUNPRkxPV3wgXAorCQkJICAgICAgIENSRUdfU1RBVF9SWEZPRkxPV3xDUkVHX1NUQVRfUkxDT0xMfENSRUdfU1RBVF9GQ09GTE9XfCAgIFwKKwkJCSAgICAgICBDUkVHX1NUQVRfQ0VDT0ZMT1d8Q1JFR19TVEFUX1JYRFJPUHxDUkVHX1NUQVRfUlhTTUFMTHwgICBcCisJCQkgICAgICAgQ1JFR19TVEFUX1JYTEVSUnxDUkVHX1NUQVRfUlhQRVJSfENSRUdfU1RBVF9SWFNFUlIpCisKKyNkZWZpbmUgQ1JFR19RTUFTS19DT0ZMT1cgICAgIDB4MDAxMDAwMDAgIC8qIENvbGxDbnRyIG92ZXJmbG93ICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19UWERFUlJPUiAgIDB4MDAwODAwMDAgIC8qIFRYRCBlcnJvciAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19UWExFUlIgICAgIDB4MDAwNDAwMDAgIC8qIFRYIGxhdGUgZXJyb3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19UWFBFUlIgICAgIDB4MDAwMjAwMDAgIC8qIFRYIHBhcml0eSBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19UWFNFUlIgICAgIDB4MDAwMTAwMDAgIC8qIFRYIHNidXMgZXJyb3IgYWNrICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19SWERST1AgICAgIDB4MDAwMDAwMTAgIC8qIFJYIGRyb3AgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19SWEJFUlJPUiAgIDB4MDAwMDAwMDggIC8qIFJYIGJ1ZmZlciBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19SWExFRVJSICAgIDB4MDAwMDAwMDQgIC8qIFJYIGxhdGUgZXJyb3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19SWFBFUlIgICAgIDB4MDAwMDAwMDIgIC8qIFJYIHBhcml0eSBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1JFR19RTUFTS19SWFNFUlIgICAgIDB4MDAwMDAwMDEgIC8qIFJYIHNidXMgZXJyb3IgYWNrICAgICAgICAgKi8KKworI2RlZmluZSBDUkVHX01NQVNLX0VERUZFUiAgICAgMHgxMDAwMDAwMCAgLyogRXhjZXNzIGRlZmVyICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX01NQVNLX0NMT1NTICAgICAgMHgwODAwMDAwMCAgLyogQ2FycmllciBsb3NzICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX01NQVNLX0VSRVRSWSAgICAgMHgwNDAwMDAwMCAgLyogRXhjZXNzIHJldHJ5ICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX01NQVNLX0xDT0xMICAgICAgMHgwMjAwMDAwMCAgLyogTGF0ZSBjb2xsaXNpb24gZXJyb3IgICAgICAqLworI2RlZmluZSBDUkVHX01NQVNLX1VGTE9XICAgICAgMHgwMTAwMDAwMCAgLyogVW5kZXJmbG93ICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX01NQVNLX0pBQkJFUiAgICAgMHgwMDgwMDAwMCAgLyogSmFiYmVyIGVycm9yICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX01NQVNLX0JBQkJMRSAgICAgMHgwMDQwMDAwMCAgLyogQmFiYmxlIGVycm9yICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX01NQVNLX09GTE9XICAgICAgMHgwMDAwMDgwMCAgLyogT3ZlcmZsb3cgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDUkVHX01NQVNLX1JYQ09MTCAgICAgMHgwMDAwMDQwMCAgLyogUlggQ29sbC1DbnRyIG92ZXJmbG93ICAgICAqLworI2RlZmluZSBDUkVHX01NQVNLX1JQS1QgICAgICAgMHgwMDAwMDIwMCAgLyogUnVudCBwa3Qgb3ZlcmZsb3cgICAgICAgICAqLworI2RlZmluZSBDUkVHX01NQVNLX01QS1QgICAgICAgMHgwMDAwMDEwMCAgLyogTWlzc2VkIHBrdCBvdmVyZmxvdyAgICAgICAqLworCisjZGVmaW5lIENSRUdfUElQR19URU5BQiAgICAgICAweDAwMDAwMDIwICAvKiBFbmFibGUgVGhyb3R0bGUgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfUElQR19NTU9ERSAgICAgICAweDAwMDAwMDEwICAvKiBNYW51YWwgTW9kZSAgICAgICAgICAgICAgICovCisjZGVmaW5lIENSRUdfUElQR19XTUFTSyAgICAgICAweDAwMDAwMDBmICAvKiBTQlVTIFdhaXQgTWFzayAgICAgICAgICAgICovCisKKy8qIFBlci1jaGFubmVsIEFNRCA3OUM5NDAgTUFDRSByZWdpc3RlcnMuICovCisjZGVmaW5lIE1SRUdTX1JYRklGTwkweDAwVUwJLyogUmVjZWl2ZSBGSUZPICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1RYRklGTwkweDAxVUwJLyogVHJhbnNtaXQgRklGTyAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1RYRkNOVEwJMHgwMlVMCS8qIFRyYW5zbWl0IEZyYW1lIENvbnRyb2wgICAgICAgICAqLworI2RlZmluZSBNUkVHU19UWEZTVEFUCTB4MDNVTAkvKiBUcmFuc21pdCBGcmFtZSBTdGF0dXMgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVFhSQ05UCTB4MDRVTAkvKiBUcmFuc21pdCBSZXRyeSBDb3VudCAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUlhGQ05UTAkweDA1VUwJLyogUmVjZWl2ZSBGcmFtZSBDb250cm9sICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1JYRlNUQVQJMHgwNlVMCS8qIFJlY2VpdmUgRnJhbWUgU3RhdHVzICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19GRkNOVAkweDA3VUwJLyogRklGTyBGcmFtZSBDb3VudCAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0lSRUcJMHgwOFVMCS8qIEludGVycnVwdCBSZWdpc3RlciAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19JTUFTSwkweDA5VUwJLyogSW50ZXJydXB0IE1hc2sgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1BPTEwJMHgwYVVMCS8qIFBPTEwgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19CQ09ORklHCTB4MGJVTAkvKiBCSVUgQ29uZmlnICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfRkNPTkZJRwkweDBjVUwJLyogRklGTyBDb25maWcgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX01DT05GSUcJMHgwZFVMCS8qIE1BQyBDb25maWcgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19QTFNDT05GSUcJMHgwZVVMCS8qIFBMUyBDb25maWcgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19QSFlDT05GSUcJMHgwZlVMCS8qIFBIWSBDb25maWcgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19DSElQSUQxCTB4MTBVTAkvKiBDaGlwLUlELCBsb3cgYml0cyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfQ0hJUElEMgkweDExVUwJLyogQ2hpcC1JRCwgaGlnaCBiaXRzICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0lBQ09ORklHCTB4MTJVTAkvKiBJbnRlcm5hbCBBZGRyZXNzIENvbmZpZyAgICAgICAgKi8KKwkvKiAweDEzVUwsIHJlc2VydmVkICovCisjZGVmaW5lIE1SRUdTX0ZJTFRFUgkweDE0VUwJLyogTG9naWNhbCBBZGRyZXNzIEZpbHRlciAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0VUSEFERFIJMHgxNVVMCS8qIE91ciBFdGhlcm5ldCBBZGRyZXNzICAgICAgICAgICAqLworCS8qIDB4MTZVTCwgcmVzZXJ2ZWQgKi8KKwkvKiAweDE3VUwsIHJlc2VydmVkICovCisjZGVmaW5lIE1SRUdTX01QQ05UCTB4MThVTAkvKiBNaXNzZWQgUGFja2V0IENvdW50ICAgICAgICAgICAgKi8KKwkvKiAweDE5VUwsIHJlc2VydmVkICovCisjZGVmaW5lIE1SRUdTX1JQQ05UCTB4MWFVTAkvKiBSdW50IFBhY2tldCBDb3VudCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUkNDTlQJMHgxYlVMCS8qIFJYIENvbGxpc2lvbiBDb3VudCAgICAgICAgICAgICAqLworCS8qIDB4MWNVTCwgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTVJFR1NfVVRFU1QJMHgxZFVMCS8qIFVzZXIgVGVzdCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19SVEVTVDEJMHgxZVVMCS8qIFJlc2VydmVkIFRlc3QgMSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19SVEVTVDIJMHgxZlVMCS8qIFJlc2VydmVkIFRlc3QgMiAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19SRUdfU0laRQkweDIwVUwKKworI2RlZmluZSBNUkVHU19UWEZDTlRMX0RSRVRSWSAgICAgICAgMHg4MCAvKiBSZXRyeSBkaXNhYmxlICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVFhGQ05UTF9ERkNTICAgICAgICAgIDB4MDggLyogRGlzYWJsZSBUWCBGQ1MgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1RYRkNOVExfQVVUT1BBRCAgICAgICAweDAxIC8qIFRYIGF1dG8gcGFkICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIE1SRUdTX1RYRlNUQVRfVkFMSUQgICAgICAgICAweDgwIC8qIFRYIHZhbGlkICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19UWEZTVEFUX1VOREVSRkxPVyAgICAgMHg0MCAvKiBUWCB1bmRlcmZsb3cgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVFhGU1RBVF9MQ09MTCAgICAgICAgIDB4MjAgLyogVFggbGF0ZSBjb2xsaXNpb24gICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1RYRlNUQVRfTVJFVFJZICAgICAgICAweDEwIC8qIFRYID4gMSByZXRyaWVzICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19UWEZTVEFUX09SRVRSWSAgICAgICAgMHgwOCAvKiBUWCAxIHJldHJ5ICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVFhGU1RBVF9QREVGRVIgICAgICAgIDB4MDQgLyogVFggcGt0IGRlZmVycmVkICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1RYRlNUQVRfQ0xPU1MgICAgICAgICAweDAyIC8qIFRYIGNhcnJpZXIgbG9zdCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19UWEZTVEFUX1JFUlJPUiAgICAgICAgMHgwMSAvKiBUWCByZXRyeSBlcnJvciAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBNUkVHU19UWFJDTlRfRURFRkVSICAgICAgICAgMHg4MCAvKiBUWCBFeGNlc3MgZGVmZXJzICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVFhSQ05UX0NNQVNLICAgICAgICAgIDB4MGYgLyogVFggcmV0cnkgY291bnQgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTVJFR1NfUlhGQ05UTF9MT1dMQVQgICAgICAgIDB4MDggLyogUlggbG93IGxhdGVuY3kgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1JYRkNOVExfQVJFSkVDVCAgICAgICAweDA0IC8qIFJYIGFkZHIgbWF0Y2ggcmVqICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19SWEZDTlRMX0FVVE9TVFJJUCAgICAgMHgwMSAvKiBSWCBhdXRvIHN0cmlwICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBNUkVHU19SWEZTVEFUX09WRVJGTE9XICAgICAgMHg4MCAvKiBSWCBvdmVyZmxvdyAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUlhGU1RBVF9MQ09MTCAgICAgICAgIDB4NDAgLyogUlggbGF0ZSBjb2xsaXNpb24gICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1JYRlNUQVRfRkVSUk9SICAgICAgICAweDIwIC8qIFJYIGZyYW1pbmcgZXJyb3IgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19SWEZTVEFUX0ZDU0VSUk9SICAgICAgMHgxMCAvKiBSWCBGQ1MgZXJyb3IgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUlhGU1RBVF9SQkNOVCAgICAgICAgIDB4MGYgLyogUlggbXNnIGJ5dGUgY291bnQgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTVJFR1NfRkZDTlRfUlggICAgICAgICAgICAgIDB4ZjAgLyogUlggRklGTyBmcmFtZSBjbnQgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0ZGQ05UX1RYICAgICAgICAgICAgICAweDBmIC8qIFRYIEZJRk8gZnJhbWUgY250ICAgICAgICAgICAgICAqLworCisjZGVmaW5lIE1SRUdTX0lSRUdfSkFCQkVSICAgICAgICAgICAweDgwIC8qIElSUSBKYWJiZXIgZXJyb3IgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19JUkVHX0JBQkJMRSAgICAgICAgICAgMHg0MCAvKiBJUlEgQmFiYmxlIGVycm9yICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfSVJFR19DT0xMICAgICAgICAgICAgIDB4MjAgLyogSVJRIENvbGxpc2lvbiBlcnJvciAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0lSRUdfUkNDTyAgICAgICAgICAgICAweDEwIC8qIElSUSBDb2xsaXNpb24gY250IG92ZXJmbG93ICAgICAqLworI2RlZmluZSBNUkVHU19JUkVHX1JQS1RDTyAgICAgICAgICAgMHgwOCAvKiBJUlEgUnVudCBwYWNrZXQgY291bnQgb3ZlcmZsb3cgKi8KKyNkZWZpbmUgTVJFR1NfSVJFR19NUEtUQ08gICAgICAgICAgIDB4MDQgLyogSVJRIG1pc3NlZCBwYWNrZXQgY250IG92ZXJmbG93ICovCisjZGVmaW5lIE1SRUdTX0lSRUdfUlhJUlEgICAgICAgICAgICAweDAyIC8qIElSUSBSWCdkIGEgcGFja2V0ICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19JUkVHX1RYSVJRICAgICAgICAgICAgMHgwMSAvKiBJUlEgVFgnZCBhIHBhY2tldCAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBNUkVHU19JTUFTS19CQUJCTEUgICAgICAgICAgMHg0MCAvKiBJTUFTSyBCYWJibGUgZXJyb3JzICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfSU1BU0tfQ09MTCAgICAgICAgICAgIDB4MjAgLyogSU1BU0sgQ29sbGlzaW9uIGVycm9ycyAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0lNQVNLX01QS1RDTyAgICAgICAgICAweDA0IC8qIElNQVNLIE1pc3NlZCBwa3QgY250IG92ZXJmbG93ICAqLworI2RlZmluZSBNUkVHU19JTUFTS19SWElSUSAgICAgICAgICAgMHgwMiAvKiBJTUFTSyBSWCBpbnRlcnJ1cHRzICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfSU1BU0tfVFhJUlEgICAgICAgICAgIDB4MDEgLyogSU1BU0sgVFggaW50ZXJydXB0cyAgICAgICAgICAgICovCisKKyNkZWZpbmUgTVJFR1NfUE9MTF9UWFZBTElEICAgICAgICAgIDB4ODAgLyogVFggaXMgdmFsaWQgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1BPTExfVERUUiAgICAgICAgICAgICAweDQwIC8qIFRYIGRhdGEgdHJhbnNmZXIgcmVxdWVzdCAgICAgICAqLworI2RlZmluZSBNUkVHU19QT0xMX1JEVFIgICAgICAgICAgICAgMHgyMCAvKiBSWCBkYXRhIHRyYW5zZmVyIHJlcXVlc3QgICAgICAgKi8KKworI2RlZmluZSBNUkVHU19CQ09ORklHX0JTV0FQICAgICAgICAgMHg0MCAvKiBCeXRlIFN3YXAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfQkNPTkZJR180VFMgICAgICAgICAgIDB4MDAgLyogNGJ5dGUgdHJhbnNtaXQgc3RhcnQgcG9pbnQgICAgICovCisjZGVmaW5lIE1SRUdTX0JDT05GSUdfMTZUUyAgICAgICAgICAweDEwIC8qIDE2Ynl0ZSB0cmFuc21pdCBzdGFydCBwb2ludCAgICAqLworI2RlZmluZSBNUkVHU19CQ09ORklHXzY0VFMgICAgICAgICAgMHgyMCAvKiA2NGJ5dGUgdHJhbnNtaXQgc3RhcnQgcG9pbnQgICAgKi8KKyNkZWZpbmUgTVJFR1NfQkNPTkZJR18xMTJUUyAgICAgICAgIDB4MzAgLyogMTEyYnl0ZSB0cmFuc21pdCBzdGFydCBwb2ludCAgICovCisjZGVmaW5lIE1SRUdTX0JDT05GSUdfUkVTRVQgICAgICAgICAweDAxIC8qIFNXLVJlc2V0IHRoZSBNQUNFICAgICAgICAgICAgICAqLworCisjZGVmaW5lIE1SRUdTX0ZDT05GSUdfVFhGOCAgICAgICAgICAweDAwIC8qIFRYIGZpZm8gOCB3cml0ZSBjeWNsZXMgICAgICAgICAqLworI2RlZmluZSBNUkVHU19GQ09ORklHX1RYRjMyICAgICAgICAgMHg4MCAvKiBUWCBmaWZvIDMyIHdyaXRlIGN5Y2xlcyAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfRkNPTkZJR19UWEYxNiAgICAgICAgIDB4NDAgLyogVFggZmlmbyAxNiB3cml0ZSBjeWNsZXMgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0ZDT05GSUdfUlhGNjQgICAgICAgICAweDIwIC8qIFJYIGZpZm8gNjQgd3JpdGUgY3ljbGVzICAgICAgICAqLworI2RlZmluZSBNUkVHU19GQ09ORklHX1JYRjMyICAgICAgICAgMHgxMCAvKiBSWCBmaWZvIDMyIHdyaXRlIGN5Y2xlcyAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfRkNPTkZJR19SWEYxNiAgICAgICAgIDB4MDAgLyogUlggZmlmbyAxNiB3cml0ZSBjeWNsZXMgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0ZDT05GSUdfVEZXVSAgICAgICAgICAweDA4IC8qIFRYIGZpZm8gd2F0ZXJtYXJrIHVwZGF0ZSAgICAgICAqLworI2RlZmluZSBNUkVHU19GQ09ORklHX1JGV1UgICAgICAgICAgMHgwNCAvKiBSWCBmaWZvIHdhdGVybWFyayB1cGRhdGUgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfRkNPTkZJR19UQkVOQUIgICAgICAgIDB4MDIgLyogVFggYnVyc3QgZW5hYmxlICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX0ZDT05GSUdfUkJFTkFCICAgICAgICAweDAxIC8qIFJYIGJ1cnN0IGVuYWJsZSAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIE1SRUdTX01DT05GSUdfUFJPTUlTQyAgICAgICAweDgwIC8qIFByb21pc2N1b3VzIG1vZGUgZW5hYmxlICAgICAgICAqLworI2RlZmluZSBNUkVHU19NQ09ORklHX1RQRERJU0FCICAgICAgMHg0MCAvKiBUWCAycGFydCBkZWZlcnJhbCBlbmFibGUgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfTUNPTkZJR19NQkFFTkFCICAgICAgIDB4MjAgLyogTW9kaWZpZWQgYmFja29mZiBlbmFibGUgICAgICAgICovCisjZGVmaW5lIE1SRUdTX01DT05GSUdfUlBBRElTQUIgICAgICAweDA4IC8qIFJYIHBoeXNpY2FsIGFkZHIgZGlzYWJsZSAgICAgICAqLworI2RlZmluZSBNUkVHU19NQ09ORklHX1JCRElTQUIgICAgICAgMHgwNCAvKiBSWCBicm9hZGNhc3QgZGlzYWJsZSAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfTUNPTkZJR19UWEVOQUIgICAgICAgIDB4MDIgLyogRW5hYmxlIHRyYW5zbWl0dGVyICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX01DT05GSUdfUlhFTkFCICAgICAgICAweDAxIC8qIEVuYWJsZSByZWNlaXZlciAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIE1SRUdTX1BMU0NPTkZJR19UWE1TICAgICAgICAweDA4IC8qIFRYIG1vZGUgc2VsZWN0ICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19QTFNDT05GSUdfR1BTSSAgICAgICAgMHgwNiAvKiBVc2UgR1BTSSBjb25uZWN0b3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUExTQ09ORklHX0RBSSAgICAgICAgIDB4MDQgLyogVXNlIERBSSBjb25uZWN0b3IgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1BMU0NPTkZJR19UUCAgICAgICAgICAweDAyIC8qIFVzZSBUd2lzdGVkUGFpciBjb25uZWN0b3IgICAgICAqLworI2RlZmluZSBNUkVHU19QTFNDT05GSUdfQVVJICAgICAgICAgMHgwMCAvKiBVc2UgQVVJIGNvbm5lY3RvciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUExTQ09ORklHX0lPRU5BQiAgICAgIDB4MDEgLyogUExTIEkvTyBlbmFibGUgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTVJFR1NfUEhZQ09ORklHX0xTVEFUICAgICAgIDB4ODAgLyogTGluayBzdGF0dXMgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1BIWUNPTkZJR19MVEVTVERJUyAgICAweDQwIC8qIERpc2FibGUgbGluayB0ZXN0IGxvZ2ljICAgICAgICAqLworI2RlZmluZSBNUkVHU19QSFlDT05GSUdfUlhQT0xBUklUWSAgMHgyMCAvKiBSWCBwb2xhcml0eSAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUEhZQ09ORklHX0FQQ0RJU0FCICAgIDB4MTAgLyogQXV0b1BvbGFyaXR5Q29ycmVjdCBkaXNhYiAgICAgICovCisjZGVmaW5lIE1SRUdTX1BIWUNPTkZJR19MVEVOQUIgICAgICAweDA4IC8qIFNlbGVjdCBsb3cgdGhyZXNob2xkICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19QSFlDT05GSUdfQVVUTyAgICAgICAgMHgwNCAvKiBDb25uZWN0b3IgcG9ydCBhdXRvLXNlbCAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfUEhZQ09ORklHX1JXVSAgICAgICAgIDB4MDIgLyogUmVtb3RlIFdha2VVcCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1BIWUNPTkZJR19BVyAgICAgICAgICAweDAxIC8qIEF1dG8gV2FrZXVwICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIE1SRUdTX0lBQ09ORklHX0FDSE5HRSAgICAgICAweDgwIC8qIERvIGFkZHJlc3MgY2hhbmdlICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19JQUNPTkZJR19QQVJFU0VUICAgICAgMHgwNCAvKiBQaHlzaWNhbCBhZGRyZXNzIHJlc2V0ICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfSUFDT05GSUdfTEFSRVNFVCAgICAgIDB4MDIgLyogTG9naWNhbCBhZGRyZXNzIHJlc2V0ICAgICAgICAgICovCisKKyNkZWZpbmUgTVJFR1NfVVRFU1RfUlRSRU5BQiAgICAgICAgIDB4ODAgLyogRW5hYmxlIHJlc3YgdGVzdCByZWdpc3RlciAgICAgICovCisjZGVmaW5lIE1SRUdTX1VURVNUX1JUUkRJU0FCICAgICAgICAweDQwIC8qIERpc2FiIHJlc3YgdGVzdCByZWdpc3RlciAgICAgICAqLworI2RlZmluZSBNUkVHU19VVEVTVF9SUEFDQ0VQVCAgICAgICAgMHgyMCAvKiBBY2NlcHQgcnVudCBwYWNrZXRzICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVVRFU1RfRkNPTEwgICAgICAgICAgIDB4MTAgLyogRm9yY2UgY29sbGlzaW9uIHN0YXR1cyAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1VURVNUX0ZDU0VOQUIgICAgICAgICAweDA4IC8qIEVuYWJsZSBGQ1Mgb24gUlggICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19VVEVTVF9JTlRMT09QTSAgICAgICAgMHgwNiAvKiBJbnRlcm4gbHBiYWNrIHcvTUVOREVDICAgICAgICAgKi8KKyNkZWZpbmUgTVJFR1NfVVRFU1RfSU5UTE9PUCAgICAgICAgIDB4MDQgLyogSW50ZXJuIGxwYmFjayAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1SRUdTX1VURVNUX0VYVExPT1AgICAgICAgICAweDAyIC8qIEV4dGVybiBscGJhY2sgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNUkVHU19VVEVTVF9OT0xPT1AgICAgICAgICAgMHgwMCAvKiBObyBsb29wYmFjayAgICAgICAgICAgICAgICAgICAgKi8KKworc3RydWN0IHFlX3J4ZCB7CisJdTMyIHJ4X2ZsYWdzOworCXUzMiByeF9hZGRyOworfTsKKworI2RlZmluZSBSWERfT1dOICAgICAgMHg4MDAwMDAwMCAvKiBPd25lcnNoaXAuICAgICAgKi8KKyNkZWZpbmUgUlhEX1VQREFURSAgIDB4MTAwMDAwMDAgLyogQmVpbmcgVXBkYXRlZD8gICovCisjZGVmaW5lIFJYRF9MRU5HVEggICAweDAwMDAwN2ZmIC8qIFBhY2tldCBMZW5ndGguICAqLworCitzdHJ1Y3QgcWVfdHhkIHsKKwl1MzIgdHhfZmxhZ3M7CisJdTMyIHR4X2FkZHI7Cit9OworCisjZGVmaW5lIFRYRF9PV04gICAgICAweDgwMDAwMDAwIC8qIE93bmVyc2hpcC4gICAgICAqLworI2RlZmluZSBUWERfU09QICAgICAgMHg0MDAwMDAwMCAvKiBTdGFydCBPZiBQYWNrZXQgKi8KKyNkZWZpbmUgVFhEX0VPUCAgICAgIDB4MjAwMDAwMDAgLyogRW5kIE9mIFBhY2tldCAgICovCisjZGVmaW5lIFRYRF9VUERBVEUgICAweDEwMDAwMDAwIC8qIEJlaW5nIFVwZGF0ZWQ/ICAqLworI2RlZmluZSBUWERfTEVOR1RIICAgMHgwMDAwMDdmZiAvKiBQYWNrZXQgTGVuZ3RoLiAgKi8KKworI2RlZmluZSBUWF9SSU5HX01BWFNJWkUgICAyNTYKKyNkZWZpbmUgUlhfUklOR19NQVhTSVpFICAgMjU2CisKKyNkZWZpbmUgVFhfUklOR19TSVpFICAgICAgMTYKKyNkZWZpbmUgUlhfUklOR19TSVpFICAgICAgMTYKKworI2RlZmluZSBORVhUX1JYKG51bSkgICAgICAgKCgobnVtKSArIDEpICYgKFJYX1JJTkdfTUFYU0laRSAtIDEpKQorI2RlZmluZSBORVhUX1RYKG51bSkgICAgICAgKCgobnVtKSArIDEpICYgKFRYX1JJTkdfTUFYU0laRSAtIDEpKQorI2RlZmluZSBQUkVWX1JYKG51bSkgICAgICAgKCgobnVtKSAtIDEpICYgKFJYX1JJTkdfTUFYU0laRSAtIDEpKQorI2RlZmluZSBQUkVWX1RYKG51bSkgICAgICAgKCgobnVtKSAtIDEpICYgKFRYX1JJTkdfTUFYU0laRSAtIDEpKQorCisjZGVmaW5lIFRYX0JVRkZTX0FWQUlMKHFwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCgocXApLT50eF9vbGQgPD0gKHFwKS0+dHhfbmV3KSA/ICAgICAgICAgICAgICAgICAgICAgXAorCSAgKHFwKS0+dHhfb2xkICsgKFRYX1JJTkdfU0laRSAtIDEpIC0gKHFwKS0+dHhfbmV3IDogIFwKKwkJCSAgICAocXApLT50eF9vbGQgLSAocXApLT50eF9uZXcgLSAxKQorCitzdHJ1Y3QgcWVfaW5pdF9ibG9jayB7CisJc3RydWN0IHFlX3J4ZCBxZV9yeGRbUlhfUklOR19NQVhTSVpFXTsKKwlzdHJ1Y3QgcWVfdHhkIHFlX3R4ZFtUWF9SSU5HX01BWFNJWkVdOworfTsKKworI2RlZmluZSBxaWJfb2Zmc2V0KG1lbSwgZWxlbSkgXAorKChfX3UzMikoKHVuc2lnbmVkIGxvbmcpKCYoKChzdHJ1Y3QgcWVfaW5pdF9ibG9jayAqKTApLT5tZW1bZWxlbV0pKSkpCisKK3N0cnVjdCBzdW5xZTsKKworc3RydWN0IHN1bnFlYyB7CisJdm9pZCBfX2lvbWVtCQkqZ3JlZ3M7CQkvKiBRRUMgR2xvYmFsIFJlZ2lzdGVycyAgICAgICAgICovCisJc3RydWN0IHN1bnFlCQkqcWVzWzRdOwkvKiBFYWNoIGNoaWxkIE1BQ0UgICAgICAgICAgICAgICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgcWVjX2J1cnN0czsJLyogU3VwcG9ydCBidXJzdCBzaXplcyAgICAgICAgICAqLworCXN0cnVjdCBzYnVzX2RldgkJKnFlY19zZGV2OwkvKiBRRUMncyBTQlVTIGRldmljZSAgICAgICAgICAgICovCisJc3RydWN0IHN1bnFlYwkJKm5leHRfbW9kdWxlOwkvKiBMaXN0IG9mIGFsbCBRRUNzIGluIHN5c3RlbSAgICovCit9OworCisjZGVmaW5lIFBLVF9CVUZfU1oJMTY2NAorI2RlZmluZSBSWERfUEtUX1NaCTE2NjQKKworc3RydWN0IHN1bnFlX2J1ZmZlcnMgeworCXU4CXR4X2J1ZltUWF9SSU5HX1NJWkVdW1BLVF9CVUZfU1pdOworCXU4CV9fcGFkWzJdOworCXU4CXJ4X2J1ZltSWF9SSU5HX1NJWkVdW1BLVF9CVUZfU1pdOworfTsKKworI2RlZmluZSBxZWJ1Zl9vZmZzZXQobWVtLCBlbGVtKSBcCisoKF9fdTMyKSgodW5zaWduZWQgbG9uZykoJigoKHN0cnVjdCBzdW5xZV9idWZmZXJzICopMCktPm1lbVtlbGVtXVswXSkpKSkKKworc3RydWN0IHN1bnFlIHsKKwl2b2lkIF9faW9tZW0JCQkqcWNyZWdzOwkJLyogUUVDIHBlci1jaGFubmVsIFJlZ2lzdGVycyAgICovCisJdm9pZCBfX2lvbWVtCQkJKm1yZWdzOwkJLyogUGVyLWNoYW5uZWwgTUFDRSBSZWdpc3RlcnMgICovCisJc3RydWN0IHFlX2luaXRfYmxvY2sgICAgICAJKnFlX2Jsb2NrOwkvKiBSWCBhbmQgVFggZGVzY3JpcHRvcnMgICAgICAgKi8KKwlfX3UzMiAgICAgICAgICAgICAgICAgICAgICAJcWJsb2NrX2R2bWE7CS8qIFJYIGFuZCBUWCBkZXNjcmlwdG9ycyAgICAgICAqLworCXNwaW5sb2NrX3QJCQlsb2NrOwkJLyogUHJvdGVjdHMgdHhmdWxsIHN0YXRlICAgICAgICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgCXJ4X25ldywgcnhfb2xkOwkvKiBSWCByaW5nIGV4dGVudHMJICAgICAgICovCisJaW50CQkJICAgCXR4X25ldywgdHhfb2xkOwkvKiBUWCByaW5nIGV4dGVudHMJICAgICAgICovCisJc3RydWN0IHN1bnFlX2J1ZmZlcnMJCSpidWZmZXJzOwkvKiBDUFUgdmlzaWJsZSBhZGRyZXNzLiAgICAgICAgKi8KKwlfX3UzMgkJCQlidWZmZXJzX2R2bWE7CS8qIERWTUEgdmlzaWJsZSBhZGRyZXNzLiAgICAgICAqLworCXN0cnVjdCBzdW5xZWMJCQkqcGFyZW50OworCXU4CQkJCW1jb25maWc7CS8qIEJhc2UgTUFDRSBtY29uZmlnIHZhbHVlICAgICAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCQluZXRfc3RhdHM7CS8qIFN0YXRpc3RpY2FsIGNvdW50ZXJzICAgICAgICAqLworCXN0cnVjdCBzYnVzX2RldgkJCSpxZV9zZGV2OwkvKiBRRSdzIFNCVVMgZGV2aWNlIHN0cnVjdCAgICAgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZQkJKmRldjsJCS8qIFFFJ3MgbmV0ZGV2aWNlIHN0cnVjdCAgICAgICAqLworCWludAkJCQljaGFubmVsOwkvKiBXaG8gYW0gST8gICAgICAgICAgICAgICAgICAgKi8KK307CisKKyNlbmRpZiAvKiAhKF9TVU5RRV9IKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGMzNTgxNS5jIGIvZHJpdmVycy9uZXQvdGMzNTgxNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZWM5ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90YzM1ODE1LmMKQEAgLTAsMCArMSwxNzQ1IEBACisvKiB0YzM1ODE1LmM6IEEgVE9TSElCQSBUQzM1ODE1Q0YgUENJIDEwLzEwME1icHMgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAKKyAqICAgICAgICAgICAgICAgIGFoZW5uZXNzeUBtdmlzdGEuY29tCisgKgorICogQmFzZWQgb24gc2tlbHRvbi5jIGJ5IERvbmFsZCBCZWNrZXIuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBUb3NoaWJhIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQgICBgYEFTICBJUycnIEFORCAgIEFOWSAgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogTk8gIEVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFICAgIExJQUJMRSBGT1IgQU5ZICAgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsICBPUiBQUk9GSVRTOyBPUiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqdmVyc2lvbiA9CisJInRjMzU4MTUuYzp2MC4wMCAyNi8wNy8yMDAwIGJ5IFRvc2hpYmEgQ29ycG9yYXRpb25cbiI7CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKy8qCisgKiBUaGUgbmFtZSBvZiB0aGUgY2FyZC4gSXMgdXNlZCBmb3IgbWVzc2FnZXMgYW5kIGluIHRoZSByZXF1ZXN0cyBmb3IKKyAqIGlvIHJlZ2lvbnMsIGlycXMgYW5kIGRtYSBjaGFubmVscworICovCitzdGF0aWMgY29uc3QgY2hhciogY2FyZG5hbWUgPSAiVEMzNTgxNUNGIjsKKyNkZWZpbmUgVEMzNTgxNV9QUk9DX0VOVFJZICJuZXQvdGMzNTgxNSIKKworI2RlZmluZSBUQzM1ODE1X01PRFVMRV9OQU1FICJUQzM1ODE1Q0YiCisjZGVmaW5lIFRYX1RJTUVPVVQgKDQqSFopCisKKy8qIEZpcnN0LCBhIGZldyBkZWZpbml0aW9ucyB0aGF0IHRoZSBicmF2ZSBtaWdodCBjaGFuZ2UuICovCisKKy8qIHVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sID4yIGZvciBkZWJ1ZyAqLworI2lmbmRlZiBUQzM1ODE1X0RFQlVHCisjZGVmaW5lIFRDMzU4MTVfREVCVUcgMQorI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgaW50IHRjMzU4MTVfZGVidWcgPSBUQzM1ODE1X0RFQlVHOworCisjZGVmaW5lIEdBVEhFUl9UWElOVAkvKiBPbi1EZW1hbmQgVHggSW50ZXJydXB0ICovCisKKyNkZWZpbmUgdnRvbm9jYWNoZShwKQlLU0VHMUFERFIodmlydF90b19waHlzKHApKQorCisvKgorICogUmVnaXN0ZXJzCisgKi8KK3N0cnVjdCB0YzM1ODE1X3JlZ3MgeworCXZvbGF0aWxlIF9fdTMyIERNQV9DdGw7CQkvKiAweDAwICovCisJdm9sYXRpbGUgX191MzIgVHhGcm1QdHI7CisJdm9sYXRpbGUgX191MzIgVHhUaHJzaDsKKwl2b2xhdGlsZSBfX3UzMiBUeFBvbGxDdHI7CisJdm9sYXRpbGUgX191MzIgQkxGcm1QdHI7CisJdm9sYXRpbGUgX191MzIgUnhGcmFnU2l6ZTsKKwl2b2xhdGlsZSBfX3UzMiBJbnRfRW47CisJdm9sYXRpbGUgX191MzIgRkRBX0JhczsKKwl2b2xhdGlsZSBfX3UzMiBGREFfTGltOwkJLyogMHgyMCAqLworCXZvbGF0aWxlIF9fdTMyIEludF9TcmM7CisJdm9sYXRpbGUgX191MzIgdW51c2VkMFsyXTsKKwl2b2xhdGlsZSBfX3UzMiBQYXVzZUNudDsKKwl2b2xhdGlsZSBfX3UzMiBSZW1QYXVDbnQ7CisJdm9sYXRpbGUgX191MzIgVHhDdGxGcm1TdGF0OworCXZvbGF0aWxlIF9fdTMyIHVudXNlZDE7CisJdm9sYXRpbGUgX191MzIgTUFDX0N0bDsJCS8qIDB4NDAgKi8KKwl2b2xhdGlsZSBfX3UzMiBDQU1fQ3RsOworCXZvbGF0aWxlIF9fdTMyIFR4X0N0bDsKKwl2b2xhdGlsZSBfX3UzMiBUeF9TdGF0OworCXZvbGF0aWxlIF9fdTMyIFJ4X0N0bDsKKwl2b2xhdGlsZSBfX3UzMiBSeF9TdGF0OworCXZvbGF0aWxlIF9fdTMyIE1EX0RhdGE7CisJdm9sYXRpbGUgX191MzIgTURfQ0E7CisJdm9sYXRpbGUgX191MzIgQ0FNX0FkcjsJCS8qIDB4NjAgKi8KKwl2b2xhdGlsZSBfX3UzMiBDQU1fRGF0YTsKKwl2b2xhdGlsZSBfX3UzMiBDQU1fRW5hOworCXZvbGF0aWxlIF9fdTMyIFBST01fQ3RsOworCXZvbGF0aWxlIF9fdTMyIFBST01fRGF0YTsKKwl2b2xhdGlsZSBfX3UzMiBBbGduX0NudDsKKwl2b2xhdGlsZSBfX3UzMiBDUkNfQ250OworCXZvbGF0aWxlIF9fdTMyIE1pc3NfQ250OworfTsKKworLyoKKyAqIEJpdCBhc3NpZ25tZW50cworICovCisvKiBETUFfQ3RsIGJpdCBhc2lnbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIERNQV9JbnRNYXNrICAgICAgICAgICAgMHgwMDA0MDAwMCAvKiAxOkludGVydXB0IG1hc2sgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERNQV9TV0ludFJlcSAgICAgICAgICAgMHgwMDAyMDAwMCAvKiAxOlNvZnR3YXJlIEludGVycnVwdCByZXF1ZXN0ICAgICovCisjZGVmaW5lIERNQV9UeFdha2VVcCAgICAgICAgICAgMHgwMDAxMDAwMCAvKiAxOlRyYW5zbWl0IFdha2UgVXAgICAgICAgICAgICAgICovCisjZGVmaW5lIERNQV9SeEJpZ0UgICAgICAgICAgICAgMHgwMDAwODAwMCAvKiAxOlJlY2VpdmUgQmlnIEVuZGlhbiAgICAgICAgICAgICovCisjZGVmaW5lIERNQV9UeEJpZ0UgICAgICAgICAgICAgMHgwMDAwNDAwMCAvKiAxOlRyYW5zbWl0IEJpZyBFbmRpYW4gICAgICAgICAgICovCisjZGVmaW5lIERNQV9UZXN0TW9kZSAgICAgICAgICAgMHgwMDAwMjAwMCAvKiAxOlRlc3QgTW9kZSAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERNQV9Qb3dyTWdtbnQgICAgICAgICAgMHgwMDAwMTAwMCAvKiAxOlBvd2VyIE1hbmFnZW1lbnQgICAgICAgICAgICAgICovCisjZGVmaW5lIERNQV9EbUJ1cnN0X01hc2sgICAgICAgMHgwMDAwMDFmYyAvKiBETUEgQnVyc3Qgc2l6ZSAgICAgICAgICAgICAgICAgICovCisKKy8qIFJ4RnJhZ1NpemUgYml0IGFzaWduIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUnhGcmFnX0VuUGFjayAgICAgICAgICAweDAwMDA4MDAwIC8qIDE6RW5hYmxlIFBhY2tpbmcgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUnhGcmFnX01pbkZyYWdNYXNrICAgICAweDAwMDAwZmZjIC8qIE1pbmltdW0gRnJhZ21lbnQgICAgICAgICAgICAgICAgKi8KKworLyogTUFDX0N0bCBiaXQgYXNpZ24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBNQUNfTGluazEwICAgICAgICAgICAgIDB4MDAwMDgwMDAgLyogMTpMaW5rIFN0YXR1cyAxME1iaXRzICAgICAgICAgICAqLworI2RlZmluZSBNQUNfRW5NaXNzUm9sbCAgICAgICAgIDB4MDAwMDIwMDAgLyogMTpFbmFibGUgTWlzc2VkIFJvbGwgICAgICAgICAgICAqLworI2RlZmluZSBNQUNfTWlzc1JvbGwgICAgICAgICAgIDB4MDAwMDA0MDAgLyogMTpNaXNzZWQgUm9sbCAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQUNfTG9vcDEwICAgICAgICAgICAgIDB4MDAwMDAwODAgLyogMTpMb29wIDEwIE1icHMgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQUNfQ29ubl9BdXRvICAgICAgICAgIDB4MDAwMDAwMDAgLyowMDpDb25uZWN0aW9uIG1vZGUgKEF1dG9tYXRpYykgICAqLworI2RlZmluZSBNQUNfQ29ubl8xME0gICAgICAgICAgIDB4MDAwMDAwMjAgLyowMTogICAgICAgICAgICAgICAgKDEwTWJwcyBlbmRlYykqLworI2RlZmluZSBNQUNfQ29ubl9NbGwgICAgICAgICAgIDB4MDAwMDAwNDAgLyoxMDogICAgICAgICAgICAgICAgKE1sbCBjbG9jaykgICAqLworI2RlZmluZSBNQUNfTWFjTG9vcCAgICAgICAgICAgIDB4MDAwMDAwMTAgLyogMTpNQUMgTG9vcGJhY2sgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQUNfRnVsbER1cCAgICAgICAgICAgIDB4MDAwMDAwMDggLyogMTpGdWxsIER1cGxleCAwOkhhbGYgRHVwbGV4ICAgICAqLworI2RlZmluZSBNQUNfUmVzZXQgICAgICAgICAgICAgIDB4MDAwMDAwMDQgLyogMTpTb2Z0d2FyZSBSZXNldCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQUNfSGFsdEltbSAgICAgICAgICAgIDB4MDAwMDAwMDIgLyogMTpIYWx0IEltbWVkaWF0ZSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNQUNfSGFsdFJlcSAgICAgICAgICAgIDB4MDAwMDAwMDEgLyogMTpIYWx0IHJlcXVlc3QgICAgICAgICAgICAgICAgICAqLworCisvKiBQUk9NX0N0bCBiaXQgYXNpZ24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFBST01fQnVzeSAgICAgICAgICAgICAgMHgwMDAwODAwMCAvKiAxOkJ1c3kgKFN0YXJ0IE9wZXJhdGlvbikgICAgICAgICovCisjZGVmaW5lIFBST01fUmVhZCAgICAgICAgICAgICAgMHgwMDAwNDAwMCAvKjEwOlJlYWQgb3BlcmF0aW9uICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBST01fV3JpdGUgICAgICAgICAgICAgMHgwMDAwMjAwMCAvKjAxOldyaXRlIG9wZXJhdGlvbiAgICAgICAgICAgICAgICovCisjZGVmaW5lIFBST01fRXJhc2UgICAgICAgICAgICAgMHgwMDAwNjAwMCAvKjExOkVyYXNlIG9wZXJhdGlvbiAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjAwOkVuYWJsZSBvciBEaXNhYmxlIFdyaXR0aW5nLCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIGFzIHNwZWNpZmllZCBpbiBQUk9NX0FkZHIuICovCisjZGVmaW5lIFBST01fQWRkcl9FbmEgICAgICAgICAgMHgwMDAwMDAzMCAvKjExeHh4eDpQUk9NIFdyaXRlIGVuYWJsZSAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjAweHh4eDogICAgICAgICAgIGRpc2FibGUgICAgICAgICovCisKKy8qIENBTV9DdGwgYml0IGFzaWduIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgQ0FNX0NvbXBFbiAgICAgICAgICAgICAweDAwMDAwMDEwIC8qIDE6Q0FNIENvbXBhcmUgRW5hYmxlICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FNX05lZ0NBTSAgICAgICAgICAgICAweDAwMDAwMDA4IC8qIDE6UmVqZWN0IHBhY2tldHMgQ0FNIHJlY29nbml6ZXMsKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICBhY2NlcHQgb3RoZXIgKi8KKyNkZWZpbmUgQ0FNX0Jyb2FkQWNjICAgICAgICAgICAweDAwMDAwMDA0IC8qIDE6QnJvYWRjYXN0IGFzc2VwdCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FNX0dyb3VwQWNjICAgICAgICAgICAweDAwMDAwMDAyIC8qIDE6TXVsdGljYXN0IGFzc2VwdCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0FNX1N0YXRpb25BY2MgICAgICAgICAweDAwMDAwMDAxIC8qIDE6dW5pY2FzdCBhY2NlcHQgICAgICAgICAgICAgICAgKi8KKworLyogQ0FNX0VuYSBiaXQgYXNpZ24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBDQU1fRU5UUllfTUFYICAgICAgICAgICAgICAgICAgMjEgICAvKiBDQU0gRGF0YSBlbnRyeSBtYXggY291bnQgICAgICAqLworI2RlZmluZSBDQU1fRW5hX01hc2sgKCgxPDxDQU1fRU5UUllfTUFYKS0xKSAvKiBDQU0gRW5hYmxlIGJpdHMgKE1heCAyMWJpdHMpICAqLworI2RlZmluZSBDQU1fRW5hX0JpdChpbmRleCkgICAgICAgICAoMTw8KGluZGV4KSkKKyNkZWZpbmUgQ0FNX0VOVFJZX0RFU1RJTkFUSU9OCTAKKyNkZWZpbmUgQ0FNX0VOVFJZX1NPVVJDRQkxCisjZGVmaW5lIENBTV9FTlRSWV9NQUNDVEwJMjAKKworLyogVHhfQ3RsIGJpdCBhc2lnbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBUeF9FbiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgLyogMTpUcmFuc21pdCBlbmFibGUgICAgICAgICAgICAgICAqLworI2RlZmluZSBUeF9UeEhhbHQgICAgICAgICAgICAgIDB4MDAwMDAwMDIgLyogMTpUcmFuc21pdCBIYWx0IFJlcXVlc3QgICAgICAgICAqLworI2RlZmluZSBUeF9Ob1BhZCAgICAgICAgICAgICAgIDB4MDAwMDAwMDQgLyogMTpTdXBwcmVzcyBQYWRkaW5nICAgICAgICAgICAgICAqLworI2RlZmluZSBUeF9Ob0NSQyAgICAgICAgICAgICAgIDB4MDAwMDAwMDggLyogMTpTdXBwcmVzcyBQYWRkaW5nICAgICAgICAgICAgICAqLworI2RlZmluZSBUeF9GQmFjayAgICAgICAgICAgICAgIDB4MDAwMDAwMTAgLyogMTpGYXN0IEJhY2stb2ZmICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUeF9FblVuZGVyICAgICAgICAgICAgIDB4MDAwMDAxMDAgLyogMTpFbmFibGUgVW5kZXJydW4gICAgICAgICAgICAgICAqLworI2RlZmluZSBUeF9FbkV4RGVmZXIgICAgICAgICAgIDB4MDAwMDAyMDAgLyogMTpFbmFibGUgRXhjZXNzaXZlIERlZmVycmFsICAgICAqLworI2RlZmluZSBUeF9FbkxDYXJyICAgICAgICAgICAgIDB4MDAwMDA0MDAgLyogMTpFbmFibGUgTG9zdCBDYXJyaWVyICAgICAgICAgICAqLworI2RlZmluZSBUeF9FbkV4Q29sbCAgICAgICAgICAgIDB4MDAwMDA4MDAgLyogMTpFbmFibGUgRXhjZXNzaXZlIENvbGxpc2lvbiAgICAqLworI2RlZmluZSBUeF9FbkxhdGVDb2xsICAgICAgICAgIDB4MDAwMDEwMDAgLyogMTpFbmFibGUgTGF0ZSBDb2xsaXNpb24gICAgICAgICAqLworI2RlZmluZSBUeF9FblR4UGFyICAgICAgICAgICAgIDB4MDAwMDIwMDAgLyogMTpFbmFibGUgVHJhbnNtaXQgUGFyaXR5ICAgICAgICAqLworI2RlZmluZSBUeF9FbkNvbXAgICAgICAgICAgICAgIDB4MDAwMDQwMDAgLyogMTpFbmFibGUgQ29tcGxldGlvbiAgICAgICAgICAgICAqLworCisvKiBUeF9TdGF0IGJpdCBhc2lnbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIFR4X1R4Q29sbF9NQVNLICAgICAgICAgMHgwMDAwMDAwRiAvKiBUeCBDb2xsaXNpb24gQ291bnQgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X0V4Q29sbCAgICAgICAgICAgICAgMHgwMDAwMDAxMCAvKiBFeGNlc3NpdmUgQ29sbGlzaW9uICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X1RYRGVmZXIgICAgICAgICAgICAgMHgwMDAwMDAyMCAvKiBUcmFuc21pdCBEZWZlcmVkICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X1BhdXNlZCAgICAgICAgICAgICAgMHgwMDAwMDA0MCAvKiBUcmFuc21pdCBQYXVzZWQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X0ludFR4ICAgICAgICAgICAgICAgMHgwMDAwMDA4MCAvKiBJbnRlcnJ1cHQgb24gVHggICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X1VuZGVyICAgICAgICAgICAgICAgMHgwMDAwMDEwMCAvKiBVbmRlcnJ1biAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X0RlZmVyICAgICAgICAgICAgICAgMHgwMDAwMDIwMCAvKiBEZWZlcnJhbCAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X05DYXJyICAgICAgICAgICAgICAgMHgwMDAwMDQwMCAvKiBObyBDYXJyaWVyICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4XzEwU3RhdCAgICAgICAgICAgICAgMHgwMDAwMDgwMCAvKiAxME1icHMgU3RhdHVzICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X0xhdGVDb2xsICAgICAgICAgICAgMHgwMDAwMTAwMCAvKiBMYXRlIENvbGxpc2lvbiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X1R4UGFyICAgICAgICAgICAgICAgMHgwMDAwMjAwMCAvKiBUeCBQYXJpdHkgRXJyb3IgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X0NvbXAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMCAvKiBDb21wbGV0aW9uICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X0hhbHRlZCAgICAgICAgICAgICAgMHgwMDAwODAwMCAvKiBUeCBIYWx0ZWQgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFR4X1NRRXJyICAgICAgICAgICAgICAgMHgwMDAxMDAwMCAvKiBTaWduYWwgUXVhbGl0eSBFcnJvcihTUUUpICAgICAgICovCisKKy8qIFJ4X0N0bCBiaXQgYXNpZ24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgUnhfRW5Hb29kICAgICAgICAgICAgICAweDAwMDA0MDAwIC8qIDE6RW5hYmxlIEdvb2QgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUnhfRW5SeFBhciAgICAgICAgICAgICAweDAwMDAyMDAwIC8qIDE6RW5hYmxlIFJlY2VpdmUgUGFyaXR5ICAgICAgICAgKi8KKyNkZWZpbmUgUnhfRW5Mb25nRXJyICAgICAgICAgICAweDAwMDAwODAwIC8qIDE6RW5hYmxlIExvbmcgRXJyb3IgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUnhfRW5PdmVyICAgICAgICAgICAgICAweDAwMDAwNDAwIC8qIDE6RW5hYmxlIE92ZXJGbG93ICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUnhfRW5DUkNFcnIgICAgICAgICAgICAweDAwMDAwMjAwIC8qIDE6RW5hYmxlIENSQyBFcnJvciAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUnhfRW5BbGlnbiAgICAgICAgICAgICAweDAwMDAwMTAwIC8qIDE6RW5hYmxlIEFsaWdubWVudCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUnhfSWdub3JlQ1JDICAgICAgICAgICAweDAwMDAwMDQwIC8qIDE6SWdub3JlIENSQyBWYWx1ZSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUnhfU3RyaXBDUkMgICAgICAgICAgICAweDAwMDAwMDEwIC8qIDE6U3RyaXAgQ1JDIFZhbHVlICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUnhfU2hvcnRFbiAgICAgICAgICAgICAweDAwMDAwMDA4IC8qIDE6U2hvcnQgRW5hYmxlICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUnhfTG9uZ0VuICAgICAgICAgICAgICAweDAwMDAwMDA0IC8qIDE6TG9uZyBFbmFibGUgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUnhfUnhIYWx0ICAgICAgICAgICAgICAweDAwMDAwMDAyIC8qIDE6UmVjZWl2ZSBIYWx0IFJlcXVlc3QgICAgICAgICAgKi8KKyNkZWZpbmUgUnhfUnhFbiAgICAgICAgICAgICAgICAweDAwMDAwMDAxIC8qIDE6UmVjZWl2ZSBJbnRycnVwdCBFbmFibGUgICAgICAgKi8KKworLyogUnhfU3RhdCBiaXQgYXNpZ24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSeF9IYWx0ZWQgICAgICAgICAgICAgIDB4MDAwMDgwMDAgLyogUnggSGFsdGVkICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9Hb29kICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAgLyogUnggR29vZCAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9SeFBhciAgICAgICAgICAgICAgIDB4MDAwMDIwMDAgLyogUnggUGFyaXR5IEVycm9yICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAwMDEwMDAgICAgbm90IHVzZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9Mb25nRXJyICAgICAgICAgICAgIDB4MDAwMDA4MDAgLyogUnggTG9uZyBFcnJvciAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9PdmVyICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAgLyogUnggT3ZlcmZsb3cgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9DUkNFcnIgICAgICAgICAgICAgIDB4MDAwMDAyMDAgLyogUnggQ1JDIEVycm9yICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9BbGlnbiAgICAgICAgICAgICAgIDB4MDAwMDAxMDAgLyogUnggQWxpZ25tZW50IEVycm9yICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF8xMFN0YXQgICAgICAgICAgICAgIDB4MDAwMDAwODAgLyogUnggMTBNYnBzIFN0YXR1cyAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9JbnRSeCAgICAgICAgICAgICAgIDB4MDAwMDAwNDAgLyogUnggSW50ZXJydXB0ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSeF9DdGxSZWNkICAgICAgICAgICAgIDB4MDAwMDAwMjAgLyogUnggQ29udHJvbCBSZWNlaXZlICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFJ4X1N0YXRfTWFzayAgICAgICAgICAgMHgwMDAwRUZDMCAvKiBSeCBBbGwgU3RhdHVzIE1hc2sgICAgICAgICAgICAgICovCisKKy8qIEludF9FbiBiaXQgYXNpZ24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgSW50X05SQWJ0RW4gICAgICAgICAgICAweDAwMDAwODAwIC8qIDE6Tm9uLXJlY292ZXJhYmxlIEFib3J0IEVuYWJsZSAgKi8KKyNkZWZpbmUgSW50X1R4Q3RsQ21wRW4gICAgICAgICAweDAwMDAwNDAwIC8qIDE6VHJhbnNtaXQgQ29udHJvbCBDb21wbGV0ZSBFbmFibGUgKi8KKyNkZWZpbmUgSW50X0RtUGFyRXJyRW4gICAgICAgICAweDAwMDAwMjAwIC8qIDE6RE1BIFBhcml0eSBFcnJvciBFbmFibGUgICAgICAgKi8KKyNkZWZpbmUgSW50X0RQYXJERW4gICAgICAgICAgICAweDAwMDAwMTAwIC8qIDE6RGF0YSBQYXJpdHkgRXJyb3IgRW5hYmxlICAgICAgKi8KKyNkZWZpbmUgSW50X0Vhck5vdEVuICAgICAgICAgICAweDAwMDAwMDgwIC8qIDE6RWFybHkgTm90aWZ5IEVuYWJsZSAgICAgICAgICAgKi8KKyNkZWZpbmUgSW50X0RQYXJFcnJFbiAgICAgICAgICAweDAwMDAwMDQwIC8qIDE6RGV0ZWN0ZWQgUGFyaXR5IEVycm9yIEVuYWJsZSAgKi8KKyNkZWZpbmUgSW50X1NTeXNFcnJFbiAgICAgICAgICAweDAwMDAwMDIwIC8qIDE6U2lnbmFsbGVkIFN5c3RlbSBFcnJvciBFbmFibGUgKi8KKyNkZWZpbmUgSW50X1JNYXNBYnRFbiAgICAgICAgICAweDAwMDAwMDEwIC8qIDE6UmVjZWl2ZWQgTWFzdGVyIEFib3J0IEVuYWJsZSAgKi8KKyNkZWZpbmUgSW50X1JUYXJnQWJ0RW4gICAgICAgICAweDAwMDAwMDA4IC8qIDE6UmVjZWl2ZWQgVGFyZ2V0IEFib3J0IEVuYWJsZSAgKi8KKyNkZWZpbmUgSW50X1NUYXJnQWJ0RW4gICAgICAgICAweDAwMDAwMDA0IC8qIDE6U2lnbmFsbGVkIFRhcmdldCBBYm9ydCBFbmFibGUgKi8KKyNkZWZpbmUgSW50X0JMRXhFbiAgICAgICAgICAgICAweDAwMDAwMDAyIC8qIDE6QnVmZmVyIExpc3QgRXhoYXVzdGVkIEVuYWJsZSAgKi8KKyNkZWZpbmUgSW50X0ZEQUV4RW4gICAgICAgICAgICAweDAwMDAwMDAxIC8qIDE6RnJlZSBEZXNjcmlwdG9yIEFyZWEgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgRXhoYXVzdGVkIEVuYWJsZSAgKi8KKworLyogSW50X1NyYyBiaXQgYXNpZ24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBJbnRfTlJhYnQgICAgICAgICAgICAgIDB4MDAwMDQwMDAgLyogMTpOb24gUmVjb3ZlcmFibGUgZXJyb3IgICAgICAgICAqLworI2RlZmluZSBJbnRfRG1QYXJFcnJTdGF0ICAgICAgIDB4MDAwMDIwMDAgLyogMTpETUEgUGFyaXR5IEVycm9yICYgQ2xlYXIgICAgICAqLworI2RlZmluZSBJbnRfQkxFeCAgICAgICAgICAgICAgIDB4MDAwMDEwMDAgLyogMTpCdWZmZXIgTGlzdCBFbXB0eSAmIENsZWFyICAgICAqLworI2RlZmluZSBJbnRfRkRBRXggICAgICAgICAgICAgIDB4MDAwMDA4MDAgLyogMTpGREEgRW1wdHkgJiBDbGVhciAgICAgICAgICAgICAqLworI2RlZmluZSBJbnRfSW50TlJBYnQgICAgICAgICAgIDB4MDAwMDA0MDAgLyogMTpOb24gUmVjb3ZlcmFibGUgQWJvcnQgICAgICAgICAqLworI2RlZmluZQlJbnRfSW50Q21wICAgICAgICAgICAgIDB4MDAwMDAyMDAgLyogMTpNQUMgY29udHJvbCBwYWNrZXQgY29tcGxldGUgICAqLworI2RlZmluZSBJbnRfSW50RXhCRCAgICAgICAgICAgIDB4MDAwMDAxMDAgLyogMTpJbnRlcnJ1cHQgRXh0cmEgQkQgJiBDbGVhciAgICAqLworI2RlZmluZSBJbnRfRG1QYXJFcnIgICAgICAgICAgIDB4MDAwMDAwODAgLyogMTpETUEgUGFyaXR5IEVycm9yICYgQ2xlYXIgICAgICAqLworI2RlZmluZSBJbnRfSW50RWFyTm90ICAgICAgICAgIDB4MDAwMDAwNDAgLyogMTpSZWNlaXZlIERhdGEgd3JpdGUgJiBDbGVhciAgICAqLworI2RlZmluZSBJbnRfU1dJbnQgICAgICAgICAgICAgIDB4MDAwMDAwMjAgLyogMTpTb2Z0d2FyZSByZXF1ZXN0ICYgQ2xlYXIgICAgICAqLworI2RlZmluZSBJbnRfSW50QkxFeCAgICAgICAgICAgIDB4MDAwMDAwMTAgLyogMTpCdWZmZXIgTGlzdCBFbXB0eSAmIENsZWFyICAgICAqLworI2RlZmluZSBJbnRfSW50RkRBRXggICAgICAgICAgIDB4MDAwMDAwMDggLyogMTpGREEgRW1wdHkgJiBDbGVhciAgICAgICAgICAgICAqLworI2RlZmluZSBJbnRfSW50UENJICAgICAgICAgICAgIDB4MDAwMDAwMDQgLyogMTpQQ0kgY29udHJvbGxlciAmIENsZWFyICAgICAgICAqLworI2RlZmluZSBJbnRfSW50TWFjUnggICAgICAgICAgIDB4MDAwMDAwMDIgLyogMTpSeCBjb250cm9sbGVyICYgQ2xlYXIgICAgICAgICAqLworI2RlZmluZSBJbnRfSW50TWFjVHggICAgICAgICAgIDB4MDAwMDAwMDEgLyogMTpUeCBjb250cm9sbGVyICYgQ2xlYXIgICAgICAgICAqLworCisvKiBNRF9DQSBiaXQgYXNpZ24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIE1EX0NBX1ByZVN1cCAgICAgICAgICAgMHgwMDAwMTAwMCAvKiAxOlByZWFtYmxlIFN1cHJlc3MgICAgICAgICAgICAgICovCisjZGVmaW5lIE1EX0NBX0J1c3kgICAgICAgICAgICAgMHgwMDAwMDgwMCAvKiAxOkJ1c3kgKFN0YXJ0IE9wZXJhdGlvbikgICAgICAgICovCisjZGVmaW5lIE1EX0NBX1dyICAgICAgICAgICAgICAgMHgwMDAwMDQwMCAvKiAxOldyaXRlIDA6UmVhZCAgICAgICAgICAgICAgICAgICovCisKKworLyogTUlJIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgTUlJX0NPTlRST0wgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIE1JSV9TVEFUVVMgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBNSUlfUEhZX0lEMCAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgTUlJX1BIWV9JRDEgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIE1JSV9BTkFSICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBNSUlfQU5MUEFSICAgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgTUlJX0FORVIgICAgICAgICAgICAgICAgMHgwMDA2CisvKiBNSUkgQ29udHJvbCByZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMuICovCisjZGVmaW5lIE1JSUNOVExfRkRYICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBNSUlDTlRMX1JTVF9BVVRPICAgICAgICAweDAyMDAKKyNkZWZpbmUgTUlJQ05UTF9JU09MQVRFICAgICAgICAgMHgwNDAwCisjZGVmaW5lIE1JSUNOVExfUFdSRFdOICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBNSUlDTlRMX0FVVE8gICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgTUlJQ05UTF9TUEVFRCAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIE1JSUNOVExfTFBCSyAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBNSUlDTlRMX1JFU0VUICAgICAgICAgICAweDgwMDAKKy8qIE1JSSBTdGF0dXMgcmVnaXN0ZXIgYml0IHNpZ25pZmljYW5jZS4gKi8KKyNkZWZpbmUgTUlJU1RBVF9FWFQgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1JSVNUQVRfSkFCICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBNSUlTVEFUX0xJTksgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgTUlJU1RBVF9DQU5fQVVUTyAgICAgICAgMHgwMDA4CisjZGVmaW5lIE1JSVNUQVRfRkFVTFQgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBNSUlTVEFUX0FVVE9fRE9ORSAgICAgICAweDAwMjAKKyNkZWZpbmUgTUlJU1RBVF9DQU5fVCAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIE1JSVNUQVRfQ0FOX1RfRkRYICAgICAgIDB4MTAwMAorI2RlZmluZSBNSUlTVEFUX0NBTl9UWCAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgTUlJU1RBVF9DQU5fVFhfRkRYICAgICAgMHg0MDAwCisjZGVmaW5lIE1JSVNUQVRfQ0FOX1Q0ICAgICAgICAgIDB4ODAwMAorLyogTUlJIEF1dG8tTmVnb3RpYXRpb24gRXhwYW5zaW9uL1JlbW90ZUVuZCBSZWdpc3RlciBCaXRzICovCisjZGVmaW5lIE1JSV9BTl9UWF9GRFggICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBNSUlfQU5fVFhfSERYICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgTUlJX0FOXzEwX0ZEWCAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIE1JSV9BTl8xMF9IRFggICAgICAgICAgIDB4MDAyMAorCisKKy8qCisgKiBEZXNjcmlwdG9ycworICovCisKKy8qIEZyYW1lIGRlc2NyaXB0ZXIgKi8KK3N0cnVjdCBGRGVzYyB7CisJdm9sYXRpbGUgX191MzIgRkROZXh0OworCXZvbGF0aWxlIF9fdTMyIEZEU3lzdGVtOworCXZvbGF0aWxlIF9fdTMyIEZEU3RhdDsKKwl2b2xhdGlsZSBfX3UzMiBGREN0bDsKK307CisKKy8qIEJ1ZmZlciBkZXNjcmlwdGVyICovCitzdHJ1Y3QgQkRlc2MgeworCXZvbGF0aWxlIF9fdTMyIEJ1ZmZEYXRhOworCXZvbGF0aWxlIF9fdTMyIEJEQ3RsOworfTsKKworI2RlZmluZSBGRF9BTElHTgkxNgorCisvKiBGcmFtZSBEZXNjcmlwdGVyIGJpdCBhc2lnbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEZEX0ZETGVuZ3RoX01BU0sgICAgICAgMHgwMDAwRkZGRiAvKiBMZW5ndGggTUFTSyAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZEX0JEQ250X01BU0sgICAgICAgICAgMHgwMDFGMDAwMCAvKiBCRCBjb3VudCBNQVNLIGluIEZEICAgICAgICAgICAgICovCisjZGVmaW5lIEZEX0ZybU9wdF9NQVNLICAgICAgICAgMHg3QzAwMDAwMCAvKiBGcmFtZSBvcHRpb24gTUFTSyAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZEX0ZybU9wdF9CaWdFbmRpYW4gICAgMHg0MDAwMDAwMCAvKiBUeC9SeCAqLworI2RlZmluZSBGRF9Gcm1PcHRfSW50VHggICAgICAgIDB4MjAwMDAwMDAgLyogVHggb25seSAqLworI2RlZmluZSBGRF9Gcm1PcHRfTm9DUkMgICAgICAgIDB4MTAwMDAwMDAgLyogVHggb25seSAqLworI2RlZmluZSBGRF9Gcm1PcHRfTm9QYWRkaW5nICAgIDB4MDgwMDAwMDAgLyogVHggb25seSAqLworI2RlZmluZSBGRF9Gcm1PcHRfUGFja2luZyAgICAgIDB4MDQwMDAwMDAgLyogUnggb25seSAqLworI2RlZmluZSBGRF9Db3duc0ZEICAgICAgICAgICAgIDB4ODAwMDAwMDAgLyogRkQgQ29udHJvbGxlciBvd25lciBiaXQgICAgICAgICAqLworI2RlZmluZSBGRF9OZXh0X0VPTCAgICAgICAgICAgIDB4MDAwMDAwMDEgLyogRkQgRU9MIGluZGljYXRvciAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGRF9CRENudF9TSElGVCAgICAgICAgIDE2CisKKy8qIEJ1ZmZlciBEZXNjcmlwdGVyIGJpdCBhc2lnbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgQkRfQnVmZkxlbmd0aF9NQVNLICAgICAweDAwMDBGRkZGIC8qIFJlY2lldmUgRGF0YSBTaXplICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQkRfUnhCRElEX01BU0sgICAgICAgICAweDAwRkYwMDAwIC8qIEJEIElEIE51bWJlciBNQVNLICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQkRfUnhCRFNlcU5fTUFTSyAgICAgICAweDdGMDAwMDAwIC8qIFJ4IEJEIFNlcXVlbmNlIE51bWJlciAgICAgICAgICAgKi8KKyNkZWZpbmUgQkRfQ293bnNCRCAgICAgICAgICAgICAweDgwMDAwMDAwIC8qIEJEIENvbnRyb2xsZXIgb3duZXIgYml0ICAgICAgICAgKi8KKyNkZWZpbmUgQkRfUnhCRElEX1NISUZUICAgICAgICAxNgorI2RlZmluZSBCRF9SeEJEU2VxTl9TSElGVCAgICAgIDI0CisKKworLyogU29tZSB1c2VmdWwgY29uc3RhbnRzLiAqLworI3VuZGVmIE5PX0NIRUNLX0NBUlJJRVIJLyogRG9lcyBub3QgY2hlY2sgTm8tQ2FycmllciB3aXRoIFRQICovCisKKyNpZmRlZiBOT19DSEVDS19DQVJSSUVSCisjZGVmaW5lIFRYX0NUTF9DTUQJKFR4X0VuQ29tcCB8IFR4X0VuVHhQYXIgfCBUeF9FbkxhdGVDb2xsIHwgXAorCVR4X0VuRXhDb2xsIHwgVHhfRW5MQ2FyciB8IFR4X0VuRXhEZWZlciB8IFR4X0VuVW5kZXIgfCBcCisJVHhfRW4pCS8qIG1heWJlICAweDdkMDEgKi8KKyNlbHNlCisjZGVmaW5lIFRYX0NUTF9DTUQJKFR4X0VuQ29tcCB8IFR4X0VuVHhQYXIgfCBUeF9FbkxhdGVDb2xsIHwgXAorCVR4X0VuRXhDb2xsIHwgVHhfRW5FeERlZmVyIHwgVHhfRW5VbmRlciB8IFwKKwlUeF9FbikJLyogbWF5YmUgIDB4N2YwMSAqLworI2VuZGlmCisjZGVmaW5lIFJYX0NUTF9DTUQJKFJ4X0VuR29vZCB8IFJ4X0VuUnhQYXIgfCBSeF9FbkxvbmdFcnIgfCBSeF9Fbk92ZXIgXAorCXwgUnhfRW5DUkNFcnIgfCBSeF9FbkFsaWduIHwgUnhfUnhFbikJLyogbWF5YmUgMHg2ZjAxICovCisKKyNkZWZpbmUgSU5UX0VOX0NNRCAgKEludF9OUkFidEVuIHwgXAorCSBJbnRfRFBhckRFbiB8IEludF9EUGFyRXJyRW4gfCBcCisJSW50X1NTeXNFcnJFbiAgfCBJbnRfUk1hc0FidEVuIHwgSW50X1JUYXJnQWJ0RW4gfCBcCisJSW50X1NUYXJnQWJ0RW4gfCBcCisJSW50X0JMRXhFbiAgfCBJbnRfRkRBRXhFbikgLyogbWF5YmUgMHhiN2YqLworCisvKiBUdW5pbmcgcGFyYW1ldGVycyAqLworI2RlZmluZSBETUFfQlVSU1RfU0laRQkzMgorI2RlZmluZSBUWF9USFJFU0hPTEQJMTAyNAorCisjZGVmaW5lIEZEX1BBR0VfTlVNIDIKKyNkZWZpbmUgRkRfUEFHRV9PUkRFUiAxCisvKiAxNiArIFJYX0JVRl9QQUdFUyAqIDggKyBSWF9GRF9OVU0gKiAxNiArIFRYX0ZEX05VTSAqIDMyIDw9IFBBR0VfU0laRSoyICovCisjZGVmaW5lIFJYX0JVRl9QQUdFUwk4CS8qID49IDIgKi8KKyNkZWZpbmUgUlhfRkRfTlVNCTI1MAkvKiA+PSAzMiAqLworI2RlZmluZSBUWF9GRF9OVU0JMTI4CisKK3N0cnVjdCBUeEZEIHsKKwlzdHJ1Y3QgRkRlc2MgZmQ7CisJc3RydWN0IEJEZXNjIGJkOworCXN0cnVjdCBCRGVzYyB1bnVzZWQ7Cit9OworCitzdHJ1Y3QgUnhGRCB7CisJc3RydWN0IEZEZXNjIGZkOworCXN0cnVjdCBCRGVzYyBiZFswXTsJLyogdmFyaWFibGUgbGVuZ3RoICovCit9OworCitzdHJ1Y3QgRnJGRCB7CisJc3RydWN0IEZEZXNjIGZkOworCXN0cnVjdCBCRGVzYyBiZFtSWF9CVUZfUEFHRVNdOworfTsKKworCitleHRlcm4gdW5zaWduZWQgbG9uZyB0Y19yZWFkbCh2b2xhdGlsZSBfX3UzMiAqYWRkcik7CitleHRlcm4gdm9pZCB0Y193cml0ZWwodW5zaWduZWQgbG9uZyBkYXRhLCB2b2xhdGlsZSBfX3UzMiAqYWRkcik7CisKK2RtYV9hZGRyX3QgcHJpdl9kbWFfaGFuZGxlOworCisvKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4gKi8KK3N0cnVjdCB0YzM1ODE1X2xvY2FsIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV4dF9tb2R1bGU7CisKKwkvKiBzdGF0aXN0aWNzICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IHsKKwkJaW50IG1heF90eF9xbGVuOworCQlpbnQgdHhfaW50czsKKwkJaW50IHJ4X2ludHM7CisJfSBsc3RhdHM7CisKKwlpbnQgdGJ1c3k7CisJaW50IG9wdGlvbjsKKyNkZWZpbmUgVEMzNTgxNV9PUFRfQVVUTwkweDAwCisjZGVmaW5lIFRDMzU4MTVfT1BUXzEwTQkweDAxCisjZGVmaW5lIFRDMzU4MTVfT1BUXzEwME0JMHgwMgorI2RlZmluZSBUQzM1ODE1X09QVF9GVUxMRFVQCTB4MDQKKwlpbnQgbGlua3NwZWVkOwkvKiAxMCBvciAxMDAgKi8KKwlpbnQgZnVsbGR1cGxleDsKKworCS8qCisJICogVHJhbnNtaXR0aW5nOiBCYXRjaCBNb2RlLgorCSAqCTEgQkQgaW4gMSBUeEZELgorCSAqIFJlY2VpdmluZzogUGFja2luZyBNb2RlLgorCSAqCTEgY2lyY3VsYXIgRkQgZm9yIEZyZWUgQnVmZmVyIExpc3QuCisJICoJUlhfQlVHX1BBR0VTIEJEIGluIEZyZWUgQnVmZmVyIEZELgorCSAqCU9uZSBGcmVlIEJ1ZmZlciBCRCBoYXMgUEFHRV9TSVpFIGRhdGEgYnVmZmVyLgorCSAqLworICAgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlkbWFfYWRkcl90IGZkX2J1Zl9kbWFfaGFuZGxlOworCXZvaWQgKiBmZF9idWY7CS8qIGZvciBUeEZELCBUeEZELCBGckZEICovCisJc3RydWN0IFR4RkQgKnRmZF9iYXNlOworCWludCB0ZmRfc3RhcnQ7CisJaW50IHRmZF9lbmQ7CisJc3RydWN0IFJ4RkQgKnJmZF9iYXNlOworCXN0cnVjdCBSeEZEICpyZmRfbGltaXQ7CisJc3RydWN0IFJ4RkQgKnJmZF9jdXI7CisJc3RydWN0IEZyRkQgKmZibF9wdHI7CisJdW5zaWduZWQgY2hhciBmYmxfY3VyaWQ7CisJZG1hX2FkZHJfdCBkYXRhX2J1Zl9kbWFfaGFuZGxlW1JYX0JVRl9QQUdFU107CisJdm9pZCAqIGRhdGFfYnVmW1JYX0JVRl9QQUdFU107CQkvKiBwYWNraW5nICovCisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworLyogSW5kZXggdG8gZnVuY3Rpb25zLCBhcyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0YzM1ODE1X3Byb2JlMShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgaW50IGJhc2VfYWRkciwgdW5zaWduZWQgaW50IGlycSk7CisKK3N0YXRpYyBpbnQJdGMzNTgxNV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludAl0YzM1ODE1X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgIHRjMzU4MTVfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCB0YzM1ODE1X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkCXRjMzU4MTVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAl0YzM1ODE1X3R4ZG9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQJdGMzNTgxNV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QJbmV0X2RldmljZV9zdGF0cyAqdGMzNTgxNV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAl0YzM1ODE1X3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHZvaWQgCXRjMzU4MTVfY2hpcF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIAl0YzM1ODE1X2NoaXBfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIAl0YzM1ODE1X3BoeV9jaGlwX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIEEgbGlzdCBvZiBhbGwgaW5zdGFsbGVkIHRjMzU4MTUgZGV2aWNlcy4gKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqcm9vdF90YzM1ODE1X2RldiA9IE5VTEw7CisKKy8qCisgKiBQQ0kgZGV2aWNlIGlkZW50aWZpZXJzIGZvciAibmV3IHN0eWxlIiBMaW51eCBQQ0kgRGV2aWNlIERyaXZlcnMKKyAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHRjMzU4MTVfcGNpX3RibFtdID0geworICAgIHsgUENJX1ZFTkRPUl9JRF9UT1NISUJBXzIsIFBDSV9ERVZJQ0VfSURfVE9TSElCQV9UQzM1ODE1Q0YsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKyAgICB7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgdGMzNTgxNV9wY2lfdGJsKTsKKworaW50Cit0YzM1ODE1X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWludCBlcnIgPSAwOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBwY2lfbWVtYWRkcjsKKwl1bnNpZ25lZCBpbnQgcGNpX2lycV9saW5lOworCisJcHJpbnRrKEtFUk5fSU5GTyAidGMzNTgxNV9wcm9iZTogZm91bmQgZGV2aWNlICUjMDh4LiUjMDh4XG4iLCBlbnQtPnZlbmRvciwgZW50LT5kZXZpY2UpOworCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworICAgICAgICBwY2lfbWVtYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMSk7CisKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiICAgIHBjaV9tZW1hZGRyPSUjMDhseCAgcmVzb3VyY2VfZmxhZ3M9JSMwOGx4XG4iLCBwY2lfbWVtYWRkciwgcGNpX3Jlc291cmNlX2ZsYWdzIChwZGV2LCAwKSk7CisKKwlpZiAoIXBjaV9tZW1hZGRyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm5vIFBDSSBNRU0gcmVzb3VyY2VzLCBhYm9ydGluZ1xuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisJcGNpX2lycV9saW5lID0gcGRldi0+aXJxOworCS8qIGlycSBkaXNhYmxlZC4gKi8KKwlpZiAocGNpX2lycV9saW5lID09IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibm8gUENJIGlycSwgYWJvcnRpbmdcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJcmV0ID0gIHRjMzU4MTVfcHJvYmUxKHBkZXYsIHBjaV9tZW1hZGRyLCBwY2lfaXJxX2xpbmUpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX291dDsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRjMzU4MTVfcHJvYmUxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1bnNpZ25lZCBpbnQgYmFzZV9hZGRyLCB1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQgPSAwOworCWludCBpLCByZXQ7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwOworCXN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkvKiBBbGxvY2F0ZSBhIG5ldyAnZGV2JyBpZiBuZWVkZWQuICovCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCB0YzM1ODE1X2xvY2FsKSk7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qCisJICogYWxsb2NfZXRoZXJkZXYgYWxsb2NzIGFuZCB6ZXJvcyBkZXYtPnByaXYKKwkgKi8KKwlscCA9IGRldi0+cHJpdjsKKworCWlmICh0YzM1ODE1X2RlYnVnICAmJiAgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIiwgdmVyc2lvbik7CisKKwkvKiBGaWxsIGluIHRoZSAnZGV2JyBmaWVsZHMuICovCisJZGV2LT5pcnEgPSBpcnE7CisJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwKGJhc2VfYWRkciwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgdGMzNTgxNV9yZWdzKSk7CisJaWYgKCFkZXYtPmJhc2VfYWRkcikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCXRyID0gKHN0cnVjdCB0YzM1ODE1X3JlZ3MqKWRldi0+YmFzZV9hZGRyOworCisJdGMzNTgxNV9jaGlwX3Jlc2V0KGRldik7CisKKwkvKiBSZXRyaWV2ZSBhbmQgcHJpbnQgdGhlIGV0aGVybmV0IGFkZHJlc3MuICovCisJd2hpbGUgKHRjX3JlYWRsKCZ0ci0+UFJPTV9DdGwpICYgUFJPTV9CdXN5KQorCQk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkgKz0gMikgeworCQl1bnNpZ25lZCBzaG9ydCBkYXRhOworCQl0Y193cml0ZWwoUFJPTV9CdXN5IHwgUFJPTV9SZWFkIHwgKGkgLyAyICsgMiksICZ0ci0+UFJPTV9DdGwpOworCQl3aGlsZSAodGNfcmVhZGwoJnRyLT5QUk9NX0N0bCkgJiBQUk9NX0J1c3kpCisJCQk7CisJCWRhdGEgPSB0Y19yZWFkbCgmdHItPlBST01fRGF0YSk7CisJCWRldi0+ZGV2X2FkZHJbaV0gPSBkYXRhICYgMHhmZjsKKwkJZGV2LT5kZXZfYWRkcltpKzFdID0gZGF0YSA+PiA4OworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJbHAtPnBkZXYgPSBwZGV2OworCWxwLT5uZXh0X21vZHVsZSA9IHJvb3RfdGMzNTgxNV9kZXY7CisJcm9vdF90YzM1ODE1X2RldiA9IGRldjsKKworCXNwaW5fbG9ja19pbml0KCZscC0+bG9jayk7CisKKwlpZiAoZGV2LT5tZW1fc3RhcnQgPiAwKSB7CisJCWxwLT5vcHRpb24gPSBkZXYtPm1lbV9zdGFydDsKKwkJaWYgKChscC0+b3B0aW9uICYgVEMzNTgxNV9PUFRfMTBNKSAmJgorCQkgICAgKGxwLT5vcHRpb24gJiBUQzM1ODE1X09QVF8xMDBNKSkgeworCQkJLyogaWYgYm90aCBzcGVlZCBzcGVmaWNpZWQsIGF1dG8gc2VsZWN0LiAqLworCQkJbHAtPm9wdGlvbiAmPSB+KFRDMzU4MTVfT1BUXzEwTSB8IFRDMzU4MTVfT1BUXzEwME0pOworCQl9CisJfQorCS8vWFhYIGZpeG1lCisgICAgICAgIGxwLT5vcHRpb24gfD0gVEMzNTgxNV9PUFRfMTBNOworCisJLyogZG8gYXV0byBuZWdvdGlhdGlvbiAqLworCXRjMzU4MTVfcGh5X2NoaXBfaW5pdChkZXYpOworCisJZGV2LT5vcGVuCQk9IHRjMzU4MTVfb3BlbjsKKwlkZXYtPnN0b3AJCT0gdGMzNTgxNV9jbG9zZTsKKwlkZXYtPnR4X3RpbWVvdXQgICAgICAgICA9IHRjMzU4MTVfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvICAgICA9IFRYX1RJTUVPVVQ7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSB0YzM1ODE1X3NlbmRfcGFja2V0OworCWRldi0+Z2V0X3N0YXRzCQk9IHRjMzU4MTVfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gdGMzNTgxNV9zZXRfbXVsdGljYXN0X2xpc3Q7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBmb3VuZCBhdCAlI3gsIGlycSAlZCwgTUFDIiwKKwkgICAgICAgZGV2LT5uYW1lLCBjYXJkbmFtZSwgYmFzZV9hZGRyLCBpcnEpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiICUyLjJ4IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCJcbiIpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rc3BlZWQgJWRNYnBzLCAlcyBEdXBsZXhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgbHAtPmxpbmtzcGVlZCwgbHAtPmZ1bGxkdXBsZXggPyAiRnVsbCIgOiAiSGFsZiIpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfaW91bm1hcDoKKwlpb3VubWFwKCh2b2lkICopIGRldi0+YmFzZV9hZGRyKTsKK2Vycl9vdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQKK3RjMzU4MTVfaW5pdF9xdWV1ZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmZF9hZGRyOworCisJaWYgKCFscC0+ZmRfYnVmKSB7CisJCWlmIChzaXplb2Yoc3RydWN0IEZEZXNjKSArCisJCSAgICBzaXplb2Yoc3RydWN0IEJEZXNjKSAqIFJYX0JVRl9QQUdFUyArCisJCSAgICBzaXplb2Yoc3RydWN0IEZEZXNjKSAqIFJYX0ZEX05VTSArCisJCSAgICBzaXplb2Yoc3RydWN0IFR4RkQpICogVFhfRkRfTlVNID4gUEFHRV9TSVpFICogRkRfUEFHRV9OVU0pIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJbnZhbGlkIFF1ZXVlIFNpemUuXG4iLCBkZXYtPm5hbWUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlpZiAoKGxwLT5mZF9idWYgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgRkRfUEFHRV9PUkRFUikpID09IDApCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX0JVRl9QQUdFUzsgaSsrKSB7CisJCQlpZiAoKGxwLT5kYXRhX2J1ZltpXSA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpKSA9PSAwKSB7CisJCQkJd2hpbGUgKC0taSA+PSAwKSB7CisJCQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylscC0+ZGF0YV9idWZbaV0pOworCQkJCQlscC0+ZGF0YV9idWZbaV0gPSAwOworCQkJCX0KKwkJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpbHAtPmZkX2J1Zik7CisJCQkJbHAtPmZkX2J1ZiA9IDA7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisjaWZkZWYgX19taXBzX18KKwkJCWRtYV9jYWNoZV93YmFja19pbnYoKHVuc2lnbmVkIGxvbmcpbHAtPmRhdGFfYnVmW2ldLCBQQUdFX1NJWkUgKiBGRF9QQUdFX05VTSk7CisjZW5kaWYKKwkJfQorI2lmZGVmIF9fbWlwc19fCisJCWRtYV9jYWNoZV93YmFja19pbnYoKHVuc2lnbmVkIGxvbmcpbHAtPmZkX2J1ZiwgUEFHRV9TSVpFICogRkRfUEFHRV9OVU0pOworI2VuZGlmCisJfSBlbHNlIHsKKwkJY2xlYXJfcGFnZShscC0+ZmRfYnVmKTsKKyNpZmRlZiBfX21pcHNfXworCQlkbWFfY2FjaGVfd2JhY2tfaW52KCh1bnNpZ25lZCBsb25nKWxwLT5mZF9idWYsIFBBR0VfU0laRSAqIEZEX1BBR0VfTlVNKTsKKyNlbmRpZgorCX0KKyNpZmRlZiBfX21pcHNfXworCWZkX2FkZHIgPSAodW5zaWduZWQgbG9uZyl2dG9ub2NhY2hlKGxwLT5mZF9idWYpOyAgCisjZWxzZQorCWZkX2FkZHIgPSAodW5zaWduZWQgbG9uZylscC0+ZmRfYnVmOworI2VuZGlmCisKKwkvKiBGcmVlIERlc2NyaXB0b3JzIChmb3IgUmVjZWl2ZSkgKi8KKwlscC0+cmZkX2Jhc2UgPSAoc3RydWN0IFJ4RkQgKilmZF9hZGRyOworCWZkX2FkZHIgKz0gc2l6ZW9mKHN0cnVjdCBSeEZEKSAqIFJYX0ZEX05VTTsKKwlmb3IgKGkgPSAwOyBpIDwgUlhfRkRfTlVNOyBpKyspIHsKKwkJbHAtPnJmZF9iYXNlW2ldLmZkLkZEQ3RsID0gY3B1X3RvX2xlMzIoRkRfQ293bnNGRCk7CisJfQorCWxwLT5yZmRfY3VyID0gbHAtPnJmZF9iYXNlOworCWxwLT5yZmRfbGltaXQgPSAoc3RydWN0IFJ4RkQgKikoZmRfYWRkciAtCisJCQkJCXNpemVvZihzdHJ1Y3QgRkRlc2MpIC0KKwkJCQkJc2l6ZW9mKHN0cnVjdCBCRGVzYykgKiAzMCk7CisKKwkvKiBUcmFuc21pdCBEZXNjcmlwdG9ycyAqLworCWxwLT50ZmRfYmFzZSA9IChzdHJ1Y3QgVHhGRCAqKWZkX2FkZHI7CisJZmRfYWRkciArPSBzaXplb2Yoc3RydWN0IFR4RkQpICogVFhfRkRfTlVNOworCWZvciAoaSA9IDA7IGkgPCBUWF9GRF9OVU07IGkrKykgeworCQlscC0+dGZkX2Jhc2VbaV0uZmQuRkROZXh0ID0gY3B1X3RvX2xlMzIodmlydF90b19idXMoJmxwLT50ZmRfYmFzZVtpKzFdKSk7CisJCWxwLT50ZmRfYmFzZVtpXS5mZC5GRFN5c3RlbSA9IGNwdV90b19sZTMyKDApOworCQlscC0+dGZkX2Jhc2VbaV0uZmQuRkRDdGwgPSBjcHVfdG9fbGUzMigwKTsKKwl9CisJbHAtPnRmZF9iYXNlW1RYX0ZEX05VTS0xXS5mZC5GRE5leHQgPSBjcHVfdG9fbGUzMih2aXJ0X3RvX2J1cygmbHAtPnRmZF9iYXNlWzBdKSk7CisJbHAtPnRmZF9zdGFydCA9IDA7CisJbHAtPnRmZF9lbmQgPSAwOworCisJLyogQnVmZmVyIExpc3QgKGZvciBSZWNlaXZlKSAqLworCWxwLT5mYmxfcHRyID0gKHN0cnVjdCBGckZEICopZmRfYWRkcjsKKwlscC0+ZmJsX3B0ci0+ZmQuRkROZXh0ID0gY3B1X3RvX2xlMzIodmlydF90b19idXMobHAtPmZibF9wdHIpKTsKKwlscC0+ZmJsX3B0ci0+ZmQuRkRDdGwgPSBjcHVfdG9fbGUzMihSWF9CVUZfUEFHRVMgfCBGRF9Db3duc0ZEKTsKKwlmb3IgKGkgPSAwOyBpIDwgUlhfQlVGX1BBR0VTOyBpKyspIHsKKwkJbHAtPmZibF9wdHItPmJkW2ldLkJ1ZmZEYXRhID0gY3B1X3RvX2xlMzIodmlydF90b19idXMobHAtPmRhdGFfYnVmW2ldKSk7CisJCS8qIEJESUQgaXMgaW5kZXggb2YgRnJGRC5iZFtdICovCisJCWxwLT5mYmxfcHRyLT5iZFtpXS5CREN0bCA9CisJCQljcHVfdG9fbGUzMihCRF9Db3duc0JEIHwgKGkgPDwgQkRfUnhCRElEX1NISUZUKSB8IFBBR0VfU0laRSk7CisJfQorCWxwLT5mYmxfY3VyaWQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit0YzM1ODE1X2NsZWFyX3F1ZXVlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBUWF9GRF9OVU07IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopCisJCQlsZTMyX3RvX2NwdShscC0+dGZkX2Jhc2VbaV0uZmQuRkRTeXN0ZW0pOworCQlpZiAoc2tiKQorCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJbHAtPnRmZF9iYXNlW2ldLmZkLkZEU3lzdGVtID0gY3B1X3RvX2xlMzIoMCk7CisJfQorCisJdGMzNTgxNV9pbml0X3F1ZXVlcyhkZXYpOworfQorCitzdGF0aWMgdm9pZAordGMzNTgxNV9mcmVlX3F1ZXVlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKworCWlmIChscC0+dGZkX2Jhc2UpIHsKKwkJZm9yIChpID0gMDsgaSA8IFRYX0ZEX05VTTsgaSsrKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopCisJCQkJbGUzMl90b19jcHUobHAtPnRmZF9iYXNlW2ldLmZkLkZEU3lzdGVtKTsKKwkJCWlmIChza2IpCisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCWxwLT50ZmRfYmFzZVtpXS5mZC5GRFN5c3RlbSA9IGNwdV90b19sZTMyKDApOworCQl9CisJfQorCisJbHAtPnJmZF9iYXNlID0gTlVMTDsKKwlscC0+cmZkX2Jhc2UgPSBOVUxMOworCWxwLT5yZmRfbGltaXQgPSBOVUxMOworCWxwLT5yZmRfY3VyID0gTlVMTDsKKwlscC0+ZmJsX3B0ciA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfQlVGX1BBR0VTOyBpKyspIHsKKwkJaWYgKGxwLT5kYXRhX2J1ZltpXSkKKwkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylscC0+ZGF0YV9idWZbaV0pOworCQlscC0+ZGF0YV9idWZbaV0gPSAwOworCX0KKwlpZiAobHAtPmZkX2J1ZikKKwkJX19mcmVlX3BhZ2VzKGxwLT5mZF9idWYsIEZEX1BBR0VfT1JERVIpOworCWxwLT5mZF9idWYgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZHVtcF90eGZkKHN0cnVjdCBUeEZEICpmZCkKK3sKKwlwcmludGsoIlR4RkQoJXApOiAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLCBmZCwKKwkgICAgICAgbGUzMl90b19jcHUoZmQtPmZkLkZETmV4dCksCisJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5mZC5GRFN5c3RlbSksCisJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5mZC5GRFN0YXQpLAorCSAgICAgICBsZTMyX3RvX2NwdShmZC0+ZmQuRkRDdGwpKTsKKwlwcmludGsoIkJEOiAiKTsKKwlwcmludGsoIiAlMDh4ICUwOHgiLAorCSAgICAgICBsZTMyX3RvX2NwdShmZC0+YmQuQnVmZkRhdGEpLAorCSAgICAgICBsZTMyX3RvX2NwdShmZC0+YmQuQkRDdGwpKTsKKwlwcmludGsoIlxuIik7Cit9CisKK3N0YXRpYyBpbnQKK2R1bXBfcnhmZChzdHJ1Y3QgUnhGRCAqZmQpCit7CisJaW50IGksIGJkX2NvdW50ID0gKGxlMzJfdG9fY3B1KGZkLT5mZC5GREN0bCkgJiBGRF9CRENudF9NQVNLKSA+PiBGRF9CRENudF9TSElGVDsKKwlpZiAoYmRfY291bnQgPiA4KQorCQliZF9jb3VudCA9IDg7CisJcHJpbnRrKCJSeEZEKCVwKTogJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwgZmQsCisJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5mZC5GRE5leHQpLAorCSAgICAgICBsZTMyX3RvX2NwdShmZC0+ZmQuRkRTeXN0ZW0pLAorCSAgICAgICBsZTMyX3RvX2NwdShmZC0+ZmQuRkRTdGF0KSwKKwkgICAgICAgbGUzMl90b19jcHUoZmQtPmZkLkZEQ3RsKSk7CisJaWYgKGxlMzJfdG9fY3B1KGZkLT5mZC5GREN0bCkgJiBGRF9Db3duc0ZEKQorCSAgICByZXR1cm4gMDsKKwlwcmludGsoIkJEOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgYmRfY291bnQ7IGkrKykKKwkJcHJpbnRrKCIgJTA4eCAlMDh4IiwKKwkJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5iZFtpXS5CdWZmRGF0YSksCisJCSAgICAgICBsZTMyX3RvX2NwdShmZC0+YmRbaV0uQkRDdGwpKTsKKwlwcmludGsoIlxuIik7CisJcmV0dXJuIGJkX2NvdW50OworfQorCitzdGF0aWMgdm9pZAorZHVtcF9mcmZkKHN0cnVjdCBGckZEICpmZCkKK3sKKwlpbnQgaTsKKwlwcmludGsoIkZyRkQoJXApOiAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLCBmZCwKKwkgICAgICAgbGUzMl90b19jcHUoZmQtPmZkLkZETmV4dCksCisJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5mZC5GRFN5c3RlbSksCisJICAgICAgIGxlMzJfdG9fY3B1KGZkLT5mZC5GRFN0YXQpLAorCSAgICAgICBsZTMyX3RvX2NwdShmZC0+ZmQuRkRDdGwpKTsKKwlwcmludGsoIkJEOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgUlhfQlVGX1BBR0VTOyBpKyspCisJCXByaW50aygiICUwOHggJTA4eCIsCisJCSAgICAgICBsZTMyX3RvX2NwdShmZC0+YmRbaV0uQnVmZkRhdGEpLAorCQkgICAgICAgbGUzMl90b19jcHUoZmQtPmJkW2ldLkJEQ3RsKSk7CisJcHJpbnRrKCJcbiIpOworfQorCitzdGF0aWMgdm9pZAorcGFuaWNfcXVldWVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCWludCBpOworCisJcHJpbnRrKCJUeEZEIGJhc2UgJXAsIHN0YXJ0ICVkLCBlbmQgJWRcbiIsCisJICAgICAgIGxwLT50ZmRfYmFzZSwgbHAtPnRmZF9zdGFydCwgbHAtPnRmZF9lbmQpOworCXByaW50aygiUnhGRCBiYXNlICVwIGxpbWl0ICVwIGN1ciAlcFxuIiwKKwkgICAgICAgbHAtPnJmZF9iYXNlLCBscC0+cmZkX2xpbWl0LCBscC0+cmZkX2N1cik7CisJcHJpbnRrKCJGckZEICVwXG4iLCBscC0+ZmJsX3B0cik7CisJZm9yIChpID0gMDsgaSA8IFRYX0ZEX05VTTsgaSsrKQorCQlkdW1wX3R4ZmQoJmxwLT50ZmRfYmFzZVtpXSk7CisJZm9yIChpID0gMDsgaSA8IFJYX0ZEX05VTTsgaSsrKSB7CisJCWludCBiZF9jb3VudCA9IGR1bXBfcnhmZCgmbHAtPnJmZF9iYXNlW2ldKTsKKwkJaSArPSAoYmRfY291bnQgKyAxKSAvIDI7CS8qIHNraXAgQkRzICovCisJfQorCWR1bXBfZnJmZChscC0+ZmJsX3B0cik7CisJcGFuaWMoIiVzOiBJbGxlZ2FsIHF1ZXVlIHN0YXRlLiIsIGRldi0+bmFtZSk7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBwcmludF9idWYoY2hhciAqYWRkLCBpbnQgbGVuZ3RoKQoreworCWludCBpOworCWludCBsZW4gPSBsZW5ndGg7CisKKwlwcmludGsoInByaW50X2J1ZiglMDh4KSgleClcbiIsICh1bnNpZ25lZCBpbnQpIGFkZCxsZW5ndGgpOworCisJaWYgKGxlbiA+IDEwMCkKKwkJbGVuID0gMTAwOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlwcmludGsoIiAlMi4yWCIsICh1bnNpZ25lZCBjaGFyKSBhZGRbaV0pOworCQlpZiAoIShpICUgMTYpKQorCQkJcHJpbnRrKCJcbiIpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgcHJpbnRfZXRoKGNoYXIgKmFkZCkKK3sKKwlpbnQgaTsKKworCXByaW50aygicHJpbnRfZXRoKCUwOHgpXG4iLCAodW5zaWduZWQgaW50KSBhZGQpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiICUyLjJYIiwgKHVuc2lnbmVkIGNoYXIpIGFkZFtpICsgNl0pOworCXByaW50aygiID0+Iik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIgJTIuMlgiLCAodW5zaWduZWQgY2hhcikgYWRkW2ldKTsKKwlwcmludGsoIiA6ICUyLjJYJTIuMlhcbiIsICh1bnNpZ25lZCBjaGFyKSBhZGRbMTJdLCAodW5zaWduZWQgY2hhcikgYWRkWzEzXSk7Cit9CisKKy8qCisgKiBPcGVuL2luaXRpYWxpemUgdGhlIGJvYXJkLiBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQorICogc29tZXRpbWUgYWZ0ZXIgYm9vdGluZyB3aGVuIHRoZSAnaWZjb25maWcnIHByb2dyYW0gaXMgcnVuLgorICoKKyAqIFRoaXMgcm91dGluZSBzaG91bGQgc2V0IGV2ZXJ5dGhpbmcgdXAgYW5ldyBhdCBlYWNoIG9wZW4sIGV2ZW4KKyAqIHJlZ2lzdGVycyB0aGF0ICJzaG91bGQiIG9ubHkgbmVlZCB0byBiZSBzZXQgb25jZSBhdCBib290LCBzbyB0aGF0CisgKiB0aGVyZSBpcyBub24tcmVib290IHdheSB0byByZWNvdmVyIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgorICovCitzdGF0aWMgaW50Cit0YzM1ODE1X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJLyoKKwkgKiBUaGlzIGlzIHVzZWQgaWYgdGhlIGludGVycnVwdCBsaW5lIGNhbiB0dXJuZWQgb2ZmIChzaGFyZWQpLgorCSAqIFNlZSAzYzUwMy5jIGZvciBhbiBleGFtcGxlIG9mIHNlbGVjdGluZyB0aGUgSVJRIGF0IGNvbmZpZy10aW1lLgorCSAqLworCisJaWYgKGRldi0+aXJxID09IDAgIHx8CisJICAgIHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmdGMzNTgxNV9pbnRlcnJ1cHQsIFNBX1NISVJRLCBjYXJkbmFtZSwgZGV2KSkgeworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwl0YzM1ODE1X2NoaXBfcmVzZXQoZGV2KTsKKworCWlmICh0YzM1ODE1X2luaXRfcXVldWVzKGRldikgIT0gMCkgeworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJLyogUmVzZXQgdGhlIGhhcmR3YXJlIGhlcmUuIERvbid0IGZvcmdldCB0byBzZXQgdGhlIHN0YXRpb24gYWRkcmVzcy4gKi8KKwl0YzM1ODE1X2NoaXBfaW5pdChkZXYpOworCisJbHAtPnRidXN5ID0gMDsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRjMzU4MTVfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgdGMzNTgxNV9yZWdzICp0ciA9IChzdHJ1Y3QgdGMzNTgxNV9yZWdzICopZGV2LT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlI2x4XG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHRjX3JlYWRsKCZ0ci0+VHhfU3RhdCkpOworCS8qIFRyeSB0byByZXN0YXJ0IHRoZSBhZGFwdG9yLiAqLworCXRjMzU4MTVfY2hpcF9yZXNldChkZXYpOworCXRjMzU4MTVfY2xlYXJfcXVldWVzKGRldik7CisJdGMzNTgxNV9jaGlwX2luaXQoZGV2KTsKKwlscC0+dGJ1c3k9MDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCB0YzM1ODE1X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyID0gKHN0cnVjdCB0YzM1ODE1X3JlZ3MgKilkZXYtPmJhc2VfYWRkcjsKKworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKKwkJLyoKKwkJICogSWYgd2UgZ2V0IGhlcmUsIHNvbWUgaGlnaGVyIGxldmVsIGhhcyBkZWNpZGVkIHdlIGFyZSBicm9rZW4uCisJCSAqIFRoZXJlIHNob3VsZCByZWFsbHkgYmUgYSAia2ljayBtZSIgZnVuY3Rpb24gY2FsbCBpbnN0ZWFkLgorCQkgKi8KKwkJaW50IHRpY2tzc29mYXIgPSBqaWZmaWVzIC0gZGV2LT50cmFuc19zdGFydDsKKwkJaWYgKHRpY2tzc29mYXIgPCA1KQorCQkJcmV0dXJuIDE7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0cmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlI2x4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCB0Y19yZWFkbCgmdHItPlR4X1N0YXQpKTsKKwkJLyogVHJ5IHRvIHJlc3RhcnQgdGhlIGFkYXB0b3IuICovCisJCXRjMzU4MTVfY2hpcF9yZXNldChkZXYpOworCQl0YzM1ODE1X2NsZWFyX3F1ZXVlcyhkZXYpOworCQl0YzM1ODE1X2NoaXBfaW5pdChkZXYpOworCQlscC0+dGJ1c3k9MDsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisKKwkvKgorCSAqIEJsb2NrIGEgdGltZXItYmFzZWQgdHJhbnNtaXQgZnJvbSBvdmVybGFwcGluZy4gVGhpcyBjb3VsZCBiZXR0ZXIgYmUKKwkgKiBkb25lIHdpdGggYXRvbWljX3N3YXAoMSwgbHAtPnRidXN5KSwgYnV0IHNldF9iaXQoKSB3b3JrcyBhcyB3ZWxsLgorCSAqLworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICh2b2lkKikmbHAtPnRidXN5KSAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmFuc21pdHRlciBhY2Nlc3MgY29uZmxpY3QuXG4iLCBkZXYtPm5hbWUpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX0gZWxzZSB7CisJCXNob3J0IGxlbmd0aCA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOworCQl1bnNpZ25lZCBjaGFyICpidWYgPSBza2ItPmRhdGE7CisJCXN0cnVjdCBUeEZEICp0eGZkID0gJmxwLT50ZmRfYmFzZVtscC0+dGZkX3N0YXJ0XTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJbHAtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCisKKyNpZmRlZiBfX21pcHNfXworCQlkbWFfY2FjaGVfd2JhY2tfaW52KCh1bnNpZ25lZCBsb25nKWJ1ZiwgbGVuZ3RoKTsKKyNlbmRpZgorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJCS8qIGZhaWxzYWZlLi4uICovCisJCWlmIChscC0+dGZkX3N0YXJ0ICE9IGxwLT50ZmRfZW5kKQorCQkJdGMzNTgxNV90eGRvbmUoZGV2KTsKKworCisJCXR4ZmQtPmJkLkJ1ZmZEYXRhID0gY3B1X3RvX2xlMzIodmlydF90b19idXMoYnVmKSk7CisKKwkJdHhmZC0+YmQuQkRDdGwgPSBjcHVfdG9fbGUzMihsZW5ndGgpOworCQl0eGZkLT5mZC5GRFN5c3RlbSA9IGNwdV90b19sZTMyKChfX3UzMilza2IpOworCQl0eGZkLT5mZC5GREN0bCA9IGNwdV90b19sZTMyKEZEX0Nvd25zRkQgfCAoMSA8PCBGRF9CRENudF9TSElGVCkpOworCisJCWlmIChscC0+dGZkX3N0YXJ0ID09IGxwLT50ZmRfZW5kKSB7CisJCQkvKiBTdGFydCBETUEgVHJhbnNtaXR0ZXIuICovCisJCQl0eGZkLT5mZC5GRE5leHQgfD0gY3B1X3RvX2xlMzIoRkRfTmV4dF9FT0wpOworI2lmZGVmIEdBVEhFUl9UWElOVAorCQkJdHhmZC0+ZmQuRkRDdGwgfD0gY3B1X3RvX2xlMzIoRkRfRnJtT3B0X0ludFR4KTsKKyNlbmRpZgorCQkJaWYgKHRjMzU4MTVfZGVidWcgPiAyKSB7CisJCQkJcHJpbnRrKCIlczogc3RhcnRpbmcgVHhGRC5cbiIsIGRldi0+bmFtZSk7CisJCQkJZHVtcF90eGZkKHR4ZmQpOworCQkJCWlmICh0YzM1ODE1X2RlYnVnID4gMykKKwkJCQkJcHJpbnRfZXRoKGJ1Zik7CisJCQl9CisJCQl0Y193cml0ZWwodmlydF90b19idXModHhmZCksICZ0ci0+VHhGcm1QdHIpOworCQl9IGVsc2UgeworCQkJdHhmZC0+ZmQuRkROZXh0ICY9IGNwdV90b19sZTMyKH5GRF9OZXh0X0VPTCk7CisJCQlpZiAodGMzNTgxNV9kZWJ1ZyA+IDIpIHsKKwkJCQlwcmludGsoIiVzOiBxdWV1ZWluZyBUeEZELlxuIiwgZGV2LT5uYW1lKTsKKwkJCQlkdW1wX3R4ZmQodHhmZCk7CisJCQkJaWYgKHRjMzU4MTVfZGVidWcgPiAzKQorCQkJCQlwcmludF9ldGgoYnVmKTsKKwkJCX0KKwkJfQorCQlscC0+dGZkX3N0YXJ0ID0gKGxwLT50ZmRfc3RhcnQgKyAxKSAlIFRYX0ZEX05VTTsKKworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCQlpZiAoKGxwLT50ZmRfc3RhcnQgKyAxKSAlIFRYX0ZEX05VTSAhPSBscC0+dGZkX2VuZCkgeworCQkJLyogd2UgY2FuIHNlbmQgYW5vdGhlciBwYWNrZXQgKi8KKwkJCWxwLT50YnVzeSA9IDA7CisJCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQl9IGVsc2UgeworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJaWYgKHRjMzU4MTVfZGVidWcgPiAxKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUeEZEIEV4aGF1c3RlZC5cbiIsIGRldi0+bmFtZSk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBGQVRBTF9FUlJPUl9JTlQgXAorCShJbnRfSW50UENJIHwgSW50X0RtUGFyRXJyIHwgSW50X0ludE5SQWJ0KQorc3RhdGljIHZvaWQgdGMzNTgxNV9mYXRhbF9lcnJvcl9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXR1cykKK3sKKwlzdGF0aWMgaW50IGNvdW50OworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGYXRhbCBFcnJvciBJbnR0ZXJydXB0ICglI3gpOiIsCisJICAgICAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKworCWlmIChzdGF0dXMgJiBJbnRfSW50UENJKQorCQlwcmludGsoIiBJbnRQQ0kiKTsKKwlpZiAoc3RhdHVzICYgSW50X0RtUGFyRXJyKQorCQlwcmludGsoIiBEbVBhckVyciIpOworCWlmIChzdGF0dXMgJiBJbnRfSW50TlJBYnQpCisJCXByaW50aygiIEludE5SQWJ0Iik7CisJcHJpbnRrKCJcbiIpOworCWlmIChjb3VudCsrID4gMTAwKQorCQlwYW5pYygiJXM6IFRvbyBtYW55IGZhdGFsIGVycm9ycy4iLCBkZXYtPm5hbWUpOworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZXNldHRpbmcgJXMuLi5cbiIsIGRldi0+bmFtZSwgY2FyZG5hbWUpOworCS8qIFRyeSB0byByZXN0YXJ0IHRoZSBhZGFwdG9yLiAqLworCXRjMzU4MTVfY2hpcF9yZXNldChkZXYpOworCXRjMzU4MTVfY2xlYXJfcXVldWVzKGRldik7CisJdGMzNTgxNV9jaGlwX2luaXQoZGV2KTsKK30KKworLyoKKyAqIFRoZSB0eXBpY2FsIHdvcmtsb2FkIG9mIHRoZSBkcml2ZXI6CisgKiAgIEhhbmRsZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaW50ZXJydXB0cy4KKyAqLworc3RhdGljIGlycXJldHVybl90IHRjMzU4MTVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IHRjMzU4MTVfcmVncyAqdHI7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwOworCWludCBzdGF0dXMsIGJvZ3VzY291bnQgPSAwOworCWludCBoYW5kbGVkID0gMDsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGNhcmRuYW1lLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJdHIgPSAoc3RydWN0IHRjMzU4MTVfcmVncyopZGV2LT5iYXNlX2FkZHI7CisJbHAgPSBkZXYtPnByaXY7CisKKwlkbyB7CisJCXN0YXR1cyA9IHRjX3JlYWRsKCZ0ci0+SW50X1NyYyk7CisJCWlmIChzdGF0dXMgPT0gMCkKKwkJCWJyZWFrOworCQloYW5kbGVkID0gMTsKKwkJdGNfd3JpdGVsKHN0YXR1cywgJnRyLT5JbnRfU3JjKTsJLyogd3JpdGUgdG8gY2xlYXIgKi8KKworCQkvKiBGYXRhbCBlcnJvcnMuLi4gKi8KKwkJaWYgKHN0YXR1cyAmIEZBVEFMX0VSUk9SX0lOVCkgeworCQkJdGMzNTgxNV9mYXRhbF9lcnJvcl9pbnRlcnJ1cHQoZGV2LCBzdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKwkJLyogcmVjb3ZlcmFibGUgZXJyb3JzICovCisJCWlmIChzdGF0dXMgJiBJbnRfSW50RkRBRXgpIHsKKwkJCS8qIGRpc2FibGUgRkRBRXggaW50LiAodW50aWwgd2UgbWFrZSByb29tcy4uLikgKi8KKwkJCXRjX3dyaXRlbCh0Y19yZWFkbCgmdHItPkludF9FbikgJiB+SW50X0ZEQUV4RW4sICZ0ci0+SW50X0VuKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXM6IEZyZWUgRGVzY3JpcHRvciBBcmVhIEV4aGF1c3RlZCAoJSN4KS5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJfQorCQlpZiAoc3RhdHVzICYgSW50X0ludEJMRXgpIHsKKwkJCS8qIGRpc2FibGUgQkxFeCBpbnQuICh1bnRpbCB3ZSBtYWtlIHJvb21zLi4uKSAqLworCQkJdGNfd3JpdGVsKHRjX3JlYWRsKCZ0ci0+SW50X0VuKSAmIH5JbnRfQkxFeEVuLCAmdHItPkludF9Fbik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzOiBCdWZmZXIgTGlzdCBFeGhhdXN0ZWQgKCUjeCkuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCX0KKwkJaWYgKHN0YXR1cyAmIEludF9JbnRFeEJEKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzOiBFeGNlc3NpdmUgQnVmZmVyIERlc2NyaXB0aW9ycyAoJSN4KS5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJbHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJfQorCQkvKiBub3JtYWwgbm90aWZpY2F0aW9uICovCisJCWlmIChzdGF0dXMgJiBJbnRfSW50TWFjUngpIHsKKwkJCS8qIEdvdCBhIHBhY2tldChzKS4gKi8KKwkJCWxwLT5sc3RhdHMucnhfaW50cysrOworCQkJdGMzNTgxNV9yeChkZXYpOworCQl9CisJCWlmIChzdGF0dXMgJiBJbnRfSW50TWFjVHgpIHsKKwkJCWxwLT5sc3RhdHMudHhfaW50cysrOworCQkJdGMzNTgxNV90eGRvbmUoZGV2KTsKKwkJfQorCX0gd2hpbGUgKCsrYm9ndXNjb3VudCA8IDIwKSA7CisKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworLyogV2UgaGF2ZSBhIGdvb2QgcGFja2V0KHMpLCBnZXQgaXQvdGhlbSBvdXQgb2YgdGhlIGJ1ZmZlcnMuICovCitzdGF0aWMgdm9pZAordGMzNTgxNV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgdGMzNTgxNV9yZWdzICp0ciA9IChzdHJ1Y3QgdGMzNTgxNV9yZWdzKilkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBpbnQgZmRjdGw7CisJaW50IGk7CisJaW50IGJ1Zl9mcmVlX2NvdW50ID0gMDsKKwlpbnQgZmRfZnJlZV9jb3VudCA9IDA7CisKKwl3aGlsZSAoISgoZmRjdGwgPSBsZTMyX3RvX2NwdShscC0+cmZkX2N1ci0+ZmQuRkRDdGwpKSAmIEZEX0Nvd25zRkQpKSB7CisJCWludCBzdGF0dXMgPSBsZTMyX3RvX2NwdShscC0+cmZkX2N1ci0+ZmQuRkRTdGF0KTsKKwkJaW50IHBrdF9sZW4gPSBmZGN0bCAmIEZEX0ZETGVuZ3RoX01BU0s7CisJCXN0cnVjdCBSeEZEICpuZXh0X3JmZDsKKwkJaW50IGJkX2NvdW50ID0gKGZkY3RsICYgRkRfQkRDbnRfTUFTSykgPj4gRkRfQkRDbnRfU0hJRlQ7CisKKwkJaWYgKHRjMzU4MTVfZGVidWcgPiAyKQorCQkJZHVtcF9yeGZkKGxwLT5yZmRfY3VyKTsKKwkJaWYgKHN0YXR1cyAmIFJ4X0dvb2QpIHsKKwkJCS8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLiAqLworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJCQlpbnQgY3VyX2JkLCBvZmZzZXQ7CisKKwkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQkJCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKTsgLyogKzI6IGZvciByZXNlcnZlICovCisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCQlscC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWJyZWFrOworCQkJfQorCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsgICAvKiAxNiBiaXQgYWxpZ25tZW50ICovCisJCQlza2ItPmRldiA9IGRldjsKKworCQkJZGF0YSA9IHNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKworCQkJLyogY29weSBmcm9tIHJlY2VpdmUgYnVmZmVyICovCisJCQljdXJfYmQgPSAwOworCQkJb2Zmc2V0ID0gMDsKKwkJCXdoaWxlIChvZmZzZXQgPCBwa3RfbGVuICYmIGN1cl9iZCA8IGJkX2NvdW50KSB7CisJCQkJaW50IGxlbiA9IGxlMzJfdG9fY3B1KGxwLT5yZmRfY3VyLT5iZFtjdXJfYmRdLkJEQ3RsKSAmCisJCQkJCUJEX0J1ZmZMZW5ndGhfTUFTSzsKKwkJCQl2b2lkICpyeGJ1ZiA9CisJCQkJCWJ1c190b192aXJ0KGxlMzJfdG9fY3B1KGxwLT5yZmRfY3VyLT5iZFtjdXJfYmRdLkJ1ZmZEYXRhKSk7CisjaWZkZWYgX19taXBzX18KKwkJCQlkbWFfY2FjaGVfaW52KCh1bnNpZ25lZCBsb25nKXJ4YnVmLCBsZW4pOworI2VuZGlmCisJCQkJbWVtY3B5KGRhdGEgKyBvZmZzZXQsIHJ4YnVmLCBsZW4pOworCQkJCW9mZnNldCArPSBsZW47CisJCQkJY3VyX2JkKys7CisJCQl9CisjaWYgMAorCQkJcHJpbnRfYnVmKGRhdGEscGt0X2xlbik7CisjZW5kaWYKKwkJCWlmICh0YzM1ODE1X2RlYnVnID4gMykKKwkJCQlwcmludF9ldGgoZGF0YSk7CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJbmV0aWZfcngoc2tiKTsKKwkJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCX0gZWxzZSB7CisJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkvKiBXT1JLQVJPVU5EOiBMb25nRXJyIGFuZCBDUkNFcnIgbWVhbnMgT3ZlcmZsb3cuICovCisJCQlpZiAoKHN0YXR1cyAmIFJ4X0xvbmdFcnIpICYmIChzdGF0dXMgJiBSeF9DUkNFcnIpKSB7CisJCQkJc3RhdHVzICY9IH4oUnhfTG9uZ0VycnxSeF9DUkNFcnIpOworCQkJCXN0YXR1cyB8PSBSeF9PdmVyOworCQkJfQorCQkJaWYgKHN0YXR1cyAmIFJ4X0xvbmdFcnIpIGxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgUnhfT3ZlcikgbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgUnhfQ1JDRXJyKSBscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJaWYgKHN0YXR1cyAmIFJ4X0FsaWduKSBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCX0KKworCQlpZiAoYmRfY291bnQgPiAwKSB7CisJCQkvKiBwdXQgRnJlZSBCdWZmZXIgYmFjayB0byBjb250cm9sbGVyICovCisJCQlpbnQgYmRjdGwgPSBsZTMyX3RvX2NwdShscC0+cmZkX2N1ci0+YmRbYmRfY291bnQgLSAxXS5CREN0bCk7CisJCQl1bnNpZ25lZCBjaGFyIGlkID0KKwkJCQkoYmRjdGwgJiBCRF9SeEJESURfTUFTSykgPj4gQkRfUnhCRElEX1NISUZUOworCQkJaWYgKGlkID49IFJYX0JVRl9QQUdFUykgeworCQkJCXByaW50aygiJXM6IGludmFsaWQgQkRJRC5cbiIsIGRldi0+bmFtZSk7CisJCQkJcGFuaWNfcXVldWVzKGRldik7CisJCQl9CisJCQkvKiBmcmVlIG9sZCBidWZmZXJzICovCisJCQl3aGlsZSAobHAtPmZibF9jdXJpZCAhPSBpZCkgeworCQkJCWJkY3RsID0gbGUzMl90b19jcHUobHAtPmZibF9wdHItPmJkW2xwLT5mYmxfY3VyaWRdLkJEQ3RsKTsKKwkJCQlpZiAoYmRjdGwgJiBCRF9Db3duc0JEKSB7CisJCQkJCXByaW50aygiJXM6IEZyZWVpbmcgaW52YWxpZCBCRC5cbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJCQlwYW5pY19xdWV1ZXMoZGV2KTsKKwkJCQl9CisJCQkJLyogcGFzcyBCRCB0byBjb250cm9sZXIgKi8KKwkJCQkvKiBOb3RlOiBCRExlbmd0aCB3YXMgbW9kaWZpZWQgYnkgY2hpcC4gKi8KKwkJCQlscC0+ZmJsX3B0ci0+YmRbbHAtPmZibF9jdXJpZF0uQkRDdGwgPQorCQkJCQljcHVfdG9fbGUzMihCRF9Db3duc0JEIHwKKwkJCQkJCSAgICAobHAtPmZibF9jdXJpZCA8PCBCRF9SeEJESURfU0hJRlQpIHwKKwkJCQkJCSAgICBQQUdFX1NJWkUpOworCQkJCWxwLT5mYmxfY3VyaWQgPQorCQkJCQkobHAtPmZibF9jdXJpZCArIDEpICUgUlhfQlVGX1BBR0VTOworCQkJCWlmICh0YzM1ODE1X2RlYnVnID4gMikgeworCQkJCQlwcmludGsoIiVzOiBFbnRlcmluZyBuZXcgRkJEICVkXG4iLAorCQkJCQkgICAgICAgZGV2LT5uYW1lLCBscC0+ZmJsX2N1cmlkKTsKKwkJCQkJZHVtcF9mcmZkKGxwLT5mYmxfcHRyKTsKKwkJCQl9CisJCQkJYnVmX2ZyZWVfY291bnQrKzsKKwkJCX0KKwkJfQorCisJCS8qIHB1dCBSeEZEIGJhY2sgdG8gY29udHJvbGxlciAqLworCQluZXh0X3JmZCA9IGJ1c190b192aXJ0KGxlMzJfdG9fY3B1KGxwLT5yZmRfY3VyLT5mZC5GRE5leHQpKTsKKyNpZmRlZiBfX21pcHNfXworCQluZXh0X3JmZCA9IChzdHJ1Y3QgUnhGRCAqKXZ0b25vY2FjaGUobmV4dF9yZmQpOworI2VuZGlmCisJCWlmIChuZXh0X3JmZCA8IGxwLT5yZmRfYmFzZSB8fCBuZXh0X3JmZCA+IGxwLT5yZmRfbGltaXQpIHsKKwkJCXByaW50aygiJXM6IFJ4RkQgRkROZXh0IGludmFsaWQuXG4iLCBkZXYtPm5hbWUpOworCQkJcGFuaWNfcXVldWVzKGRldik7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IChiZF9jb3VudCArIDEpIC8gMiArIDE7IGkrKykgeworCQkJLyogcGFzcyBGRCB0byBjb250cm9sZXIgKi8KKwkJCWxwLT5yZmRfY3VyLT5mZC5GRE5leHQgPSBjcHVfdG9fbGUzMigweGRlYWRkZWFkKTsJLyogZm9yIGRlYnVnICovCisJCQlscC0+cmZkX2N1ci0+ZmQuRkRDdGwgPSBjcHVfdG9fbGUzMihGRF9Db3duc0ZEKTsKKwkJCWxwLT5yZmRfY3VyKys7CisJCQlmZF9mcmVlX2NvdW50Kys7CisJCX0KKworCQlscC0+cmZkX2N1ciA9IG5leHRfcmZkOworCX0KKworCS8qIHJlLWVuYWJsZSBCTC9GREEgRXhoYXVzdCBpbnRlcnJ1cHRzLiAqLworCWlmIChmZF9mcmVlX2NvdW50KSB7CisJCXRjX3dyaXRlbCh0Y19yZWFkbCgmdHItPkludF9FbikgfCBJbnRfRkRBRXhFbiwgJnRyLT5JbnRfRW4pOworCQlpZiAoYnVmX2ZyZWVfY291bnQpCisJCQl0Y193cml0ZWwodGNfcmVhZGwoJnRyLT5JbnRfRW4pIHwgSW50X0JMRXhFbiwgJnRyLT5JbnRfRW4pOworCX0KK30KKworI2lmZGVmIE5PX0NIRUNLX0NBUlJJRVIKKyNkZWZpbmUgVFhfU1RBX0VSUgkoVHhfRXhDb2xsfFR4X1VuZGVyfFR4X0RlZmVyfFR4X0xhdGVDb2xsfFR4X1R4UGFyfFR4X1NRRXJyKQorI2Vsc2UKKyNkZWZpbmUgVFhfU1RBX0VSUgkoVHhfRXhDb2xsfFR4X1VuZGVyfFR4X0RlZmVyfFR4X05DYXJyfFR4X0xhdGVDb2xsfFR4X1R4UGFyfFR4X1NRRXJyKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCit0YzM1ODE1X2NoZWNrX3R4X3N0YXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXR1cykKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJY29uc3QgY2hhciAqbXNnID0gTlVMTDsKKworCS8qIGNvdW50IGNvbGxpc2lvbnMgKi8KKwlpZiAoc3RhdHVzICYgVHhfRXhDb2xsKQorCQlscC0+c3RhdHMuY29sbGlzaW9ucyArPSAxNjsKKwlpZiAoc3RhdHVzICYgVHhfVHhDb2xsX01BU0spCisJCWxwLT5zdGF0cy5jb2xsaXNpb25zICs9IHN0YXR1cyAmIFR4X1R4Q29sbF9NQVNLOworCisJLyogV09SS0FST1VORDogaWdub3JlIExvc3RDclMgaW4gZnVsbCBkdXBsZXggb3BlcmF0aW9uICovCisJaWYgKGxwLT5mdWxsZHVwbGV4KQorCQlzdGF0dXMgJj0gflR4X05DYXJyOworCisJaWYgKCEoc3RhdHVzICYgVFhfU1RBX0VSUikpIHsKKwkJLyogbm8gZXJyb3IuICovCisJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXJldHVybjsKKwl9CisKKwlscC0+c3RhdHMudHhfZXJyb3JzKys7CisJaWYgKHN0YXR1cyAmIFR4X0V4Q29sbCkgeworCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJbXNnID0gIkV4Y2Vzc2l2ZSBDb2xsaXNpb24uIjsKKwl9CisJaWYgKHN0YXR1cyAmIFR4X1VuZGVyKSB7CisJCWxwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQltc2cgPSAiVHggRklGTyBVbmRlcnJ1bi4iOworCX0KKwlpZiAoc3RhdHVzICYgVHhfRGVmZXIpIHsKKwkJbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCW1zZyA9ICJFeGNlc3NpdmUgRGVmZXJyYWwuIjsKKwl9CisjaWZuZGVmIE5PX0NIRUNLX0NBUlJJRVIKKwlpZiAoc3RhdHVzICYgVHhfTkNhcnIpIHsKKwkJbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCW1zZyA9ICJMb3N0IENhcnJpZXIgU2Vuc2UuIjsKKwl9CisjZW5kaWYKKwlpZiAoc3RhdHVzICYgVHhfTGF0ZUNvbGwpIHsKKwkJbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCW1zZyA9ICJMYXRlIENvbGxpc2lvbi4iOworCX0KKwlpZiAoc3RhdHVzICYgVHhfVHhQYXIpIHsKKwkJbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCW1zZyA9ICJUcmFuc21pdCBQYXJpdHkgRXJyb3IuIjsKKwl9CisJaWYgKHN0YXR1cyAmIFR4X1NRRXJyKSB7CisJCWxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCW1zZyA9ICJTaWduYWwgUXVhbGl0eSBFcnJvci4iOworCX0KKwlpZiAobXNnKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogJXMgKCUjeClcbiIsIGRldi0+bmFtZSwgbXNnLCBzdGF0dXMpOworfQorCitzdGF0aWMgdm9pZAordGMzNTgxNV90eGRvbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IHRjMzU4MTVfcmVncyAqdHIgPSAoc3RydWN0IHRjMzU4MTVfcmVncyopZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IFR4RkQgKnR4ZmQ7CisJdW5zaWduZWQgaW50IGZkY3RsOworCWludCBudW1fZG9uZSA9IDA7CisKKwl0eGZkID0gJmxwLT50ZmRfYmFzZVtscC0+dGZkX2VuZF07CisJd2hpbGUgKGxwLT50ZmRfc3RhcnQgIT0gbHAtPnRmZF9lbmQgJiYKKwkgICAgICAgISgoZmRjdGwgPSBsZTMyX3RvX2NwdSh0eGZkLT5mZC5GREN0bCkpICYgRkRfQ293bnNGRCkpIHsKKwkJaW50IHN0YXR1cyA9IGxlMzJfdG9fY3B1KHR4ZmQtPmZkLkZEU3RhdCk7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXVuc2lnbmVkIGxvbmcgZmRuZXh0ID0gbGUzMl90b19jcHUodHhmZC0+ZmQuRkROZXh0KTsKKworCQlpZiAodGMzNTgxNV9kZWJ1ZyA+IDIpIHsKKwkJCXByaW50aygiJXM6IGNvbXBsZXRlIFR4RkQuXG4iLCBkZXYtPm5hbWUpOworCQkJZHVtcF90eGZkKHR4ZmQpOworCQl9CisJCXRjMzU4MTVfY2hlY2tfdHhfc3RhdChkZXYsIHN0YXR1cyk7CisKKwkJc2tiID0gKHN0cnVjdCBza19idWZmICopbGUzMl90b19jcHUodHhmZC0+ZmQuRkRTeXN0ZW0pOworCQlpZiAoc2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQl9CisJCXR4ZmQtPmZkLkZEU3lzdGVtID0gY3B1X3RvX2xlMzIoMCk7CisKKwkJbnVtX2RvbmUrKzsKKwkJbHAtPnRmZF9lbmQgPSAobHAtPnRmZF9lbmQgKyAxKSAlIFRYX0ZEX05VTTsKKwkJdHhmZCA9ICZscC0+dGZkX2Jhc2VbbHAtPnRmZF9lbmRdOworCQlpZiAoKGZkbmV4dCAmIH5GRF9OZXh0X0VPTCkgIT0gdmlydF90b19idXModHhmZCkpIHsKKwkJCXByaW50aygiJXM6IFR4RkQgRkROZXh0IGludmFsaWQuXG4iLCBkZXYtPm5hbWUpOworCQkJcGFuaWNfcXVldWVzKGRldik7CisJCX0KKwkJaWYgKGZkbmV4dCAmIEZEX05leHRfRU9MKSB7CisJCQkvKiBETUEgVHJhbnNtaXR0ZXIgaGFzIGJlZW4gc3RvcHBpbmcuLi4gKi8KKwkJCWlmIChscC0+dGZkX2VuZCAhPSBscC0+dGZkX3N0YXJ0KSB7CisJCQkJaW50IGhlYWQgPSAobHAtPnRmZF9zdGFydCArIFRYX0ZEX05VTSAtIDEpICUgVFhfRkRfTlVNOworCQkJCXN0cnVjdCBUeEZEKiB0eGhlYWQgPSAmbHAtPnRmZF9iYXNlW2hlYWRdOworCQkJCWludCBxbGVuID0gKGxwLT50ZmRfc3RhcnQgKyBUWF9GRF9OVU0KKwkJCQkJICAgIC0gbHAtPnRmZF9lbmQpICUgVFhfRkRfTlVNOworCisJCQkJaWYgKCEobGUzMl90b19jcHUodHhmZC0+ZmQuRkRDdGwpICYgRkRfQ293bnNGRCkpIHsKKwkJCQkJcHJpbnRrKCIlczogVHhGRCBGREN0bCBpbnZhbGlkLlxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJcGFuaWNfcXVldWVzKGRldik7CisJCQkJfQorCQkJCS8qIGxvZyBtYXggcXVldWUgbGVuZ3RoICovCisJCQkJaWYgKGxwLT5sc3RhdHMubWF4X3R4X3FsZW4gPCBxbGVuKQorCQkJCQlscC0+bHN0YXRzLm1heF90eF9xbGVuID0gcWxlbjsKKworCisJCQkJLyogc3RhcnQgRE1BIFRyYW5zbWl0dGVyIGFnYWluICovCisJCQkJdHhoZWFkLT5mZC5GRE5leHQgfD0gY3B1X3RvX2xlMzIoRkRfTmV4dF9FT0wpOworI2lmZGVmIEdBVEhFUl9UWElOVAorCQkJCXR4aGVhZC0+ZmQuRkRDdGwgfD0gY3B1X3RvX2xlMzIoRkRfRnJtT3B0X0ludFR4KTsKKyNlbmRpZgorCQkJCWlmICh0YzM1ODE1X2RlYnVnID4gMikgeworCQkJCQlwcmludGsoIiVzOiBzdGFydCBUeEZEIG9uIHF1ZXVlLlxuIiwKKwkJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJCWR1bXBfdHhmZCh0eGZkKTsKKwkJCQl9CisJCQkJdGNfd3JpdGVsKHZpcnRfdG9fYnVzKHR4ZmQpLCAmdHItPlR4RnJtUHRyKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKG51bV9kb25lID4gMCAmJiBscC0+dGJ1c3kpIHsKKwkJbHAtPnRidXN5ID0gMDsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwl9Cit9CisKKy8qIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gdGMzNTgxNV9vcGVuKCkuICovCitzdGF0aWMgaW50Cit0YzM1ODE1X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCisJbHAtPnRidXN5ID0gMTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBGbHVzaCB0aGUgVHggYW5kIGRpc2FibGUgUnggaGVyZS4gKi8KKworCXRjMzU4MTVfY2hpcF9yZXNldChkZXYpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJdGMzNTgxNV9mcmVlX3F1ZXVlcyhkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4KKyAqIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IgY2xvc2VkLgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnRjMzU4MTVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyID0gKHN0cnVjdCB0YzM1ODE1X3JlZ3MqKWRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCQkvKiBVcGRhdGUgdGhlIHN0YXRpc3RpY3MgZnJvbSB0aGUgZGV2aWNlIHJlZ2lzdGVycy4gKi8KKwkJbHAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgPSB0Y19yZWFkbCgmdHItPk1pc3NfQ250KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgdGMzNTgxNV9zZXRfY2FtX2VudHJ5KHN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyLCBpbnQgaW5kZXgsIHVuc2lnbmVkIGNoYXIgKmFkZHIpCit7CisJaW50IGNhbV9pbmRleCA9IGluZGV4ICogNjsKKwl1bnNpZ25lZCBsb25nIGNhbV9kYXRhOworCXVuc2lnbmVkIGxvbmcgc2F2ZWRfYWRkcjsKKwlzYXZlZF9hZGRyID0gdGNfcmVhZGwoJnRyLT5DQU1fQWRyKTsKKworCWlmICh0YzM1ODE1X2RlYnVnID4gMSkgeworCQlpbnQgaTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDQU0gJWQ6IiwgY2FyZG5hbWUsIGluZGV4KTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCXByaW50aygiICUwMngiLCBhZGRyW2ldKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKwlpZiAoaW5kZXggJiAxKSB7CisJCS8qIHJlYWQgbW9kaWZ5IHdyaXRlICovCisJCXRjX3dyaXRlbChjYW1faW5kZXggLSAyLCAmdHItPkNBTV9BZHIpOworCQljYW1fZGF0YSA9IHRjX3JlYWRsKCZ0ci0+Q0FNX0RhdGEpICYgMHhmZmZmMDAwMDsKKwkJY2FtX2RhdGEgfD0gYWRkclswXSA8PCA4IHwgYWRkclsxXTsKKwkJdGNfd3JpdGVsKGNhbV9kYXRhLCAmdHItPkNBTV9EYXRhKTsKKwkJLyogd3JpdGUgd2hvbGUgd29yZCAqLworCQl0Y193cml0ZWwoY2FtX2luZGV4ICsgMiwgJnRyLT5DQU1fQWRyKTsKKwkJY2FtX2RhdGEgPSAoYWRkclsyXSA8PCAyNCkgfCAoYWRkclszXSA8PCAxNikgfCAoYWRkcls0XSA8PCA4KSB8IGFkZHJbNV07CisJCXRjX3dyaXRlbChjYW1fZGF0YSwgJnRyLT5DQU1fRGF0YSk7CisJfSBlbHNlIHsKKwkJLyogd3JpdGUgd2hvbGUgd29yZCAqLworCQl0Y193cml0ZWwoY2FtX2luZGV4LCAmdHItPkNBTV9BZHIpOworCQljYW1fZGF0YSA9IChhZGRyWzBdIDw8IDI0KSB8IChhZGRyWzFdIDw8IDE2KSB8IChhZGRyWzJdIDw8IDgpIHwgYWRkclszXTsKKwkJdGNfd3JpdGVsKGNhbV9kYXRhLCAmdHItPkNBTV9EYXRhKTsKKwkJLyogcmVhZCBtb2RpZnkgd3JpdGUgKi8KKwkJdGNfd3JpdGVsKGNhbV9pbmRleCArIDQsICZ0ci0+Q0FNX0Fkcik7CisJCWNhbV9kYXRhID0gdGNfcmVhZGwoJnRyLT5DQU1fRGF0YSkgJiAweDAwMDBmZmZmOworCQljYW1fZGF0YSB8PSBhZGRyWzRdIDw8IDI0IHwgKGFkZHJbNV0gPDwgMTYpOworCQl0Y193cml0ZWwoY2FtX2RhdGEsICZ0ci0+Q0FNX0RhdGEpOworCX0KKworCWlmICh0YzM1ODE1X2RlYnVnID4gMikgeworCQlpbnQgaTsKKwkJZm9yIChpID0gY2FtX2luZGV4IC8gNDsgaSA8IGNhbV9pbmRleCAvIDQgKyAyOyBpKyspIHsKKwkJCXRjX3dyaXRlbChpICogNCwgJnRyLT5DQU1fQWRyKTsKKwkJCXByaW50aygiQ0FNIDB4JXg6ICUwOGx4IiwKKwkJCSAgICAgICBpICogNCwgdGNfcmVhZGwoJnRyLT5DQU1fRGF0YSkpOworCQl9CisJfQorCXRjX3dyaXRlbChzYXZlZF9hZGRyLCAmdHItPkNBTV9BZHIpOworfQorCisKKy8qCisgKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAqIG51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisgKiBudW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKKyAqIG51bV9hZGRycyA+IDAJTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLAorICoJCQlhbmQgZG8gYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgorICovCitzdGF0aWMgdm9pZAordGMzNTgxNV9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9yZWdzICp0ciA9IChzdHJ1Y3QgdGMzNTgxNV9yZWdzKilkZXYtPmJhc2VfYWRkcjsKKworCWlmIChkZXYtPmZsYWdzJklGRl9QUk9NSVNDKQorCXsKKwkJLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKwkJdGNfd3JpdGVsKENBTV9Db21wRW4gfCBDQU1fQnJvYWRBY2MgfCBDQU1fR3JvdXBBY2MgfCBDQU1fU3RhdGlvbkFjYywgJnRyLT5DQU1fQ3RsKTsKKwl9CisJZWxzZSBpZigoZGV2LT5mbGFncyZJRkZfQUxMTVVMVEkpIHx8IGRldi0+bWNfY291bnQgPiBDQU1fRU5UUllfTUFYIC0gMykKKwl7CisJCS8qIENBTSAwLCAxLCAyMCBhcmUgcmVzZXJ2ZWQuICovCisJCS8qIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSwgdXNlIG5vcm1hbCBtb2RlLiAqLworCQl0Y193cml0ZWwoQ0FNX0NvbXBFbiB8IENBTV9Ccm9hZEFjYyB8IENBTV9Hcm91cEFjYywgJnRyLT5DQU1fQ3RsKTsKKwl9CisJZWxzZSBpZihkZXYtPm1jX2NvdW50KQorCXsKKwkJc3RydWN0IGRldl9tY19saXN0KiBjdXJfYWRkciA9IGRldi0+bWNfbGlzdDsKKwkJaW50IGk7CisJCWludCBlbmFfYml0cyA9IENBTV9FbmFfQml0KENBTV9FTlRSWV9TT1VSQ0UpOworCisJCXRjX3dyaXRlbCgwLCAmdHItPkNBTV9DdGwpOworCQkvKiBXYWxrIHRoZSBhZGRyZXNzIGxpc3QsIGFuZCBsb2FkIHRoZSBmaWx0ZXIgKi8KKwkJZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKywgY3VyX2FkZHIgPSBjdXJfYWRkci0+bmV4dCkgeworCQkJaWYgKCFjdXJfYWRkcikKKwkJCQlicmVhazsKKwkJCS8qIGVudHJ5IDAsMSBpcyByZXNlcnZlZC4gKi8KKwkJCXRjMzU4MTVfc2V0X2NhbV9lbnRyeSh0ciwgaSArIDIsIGN1cl9hZGRyLT5kbWlfYWRkcik7CisJCQllbmFfYml0cyB8PSBDQU1fRW5hX0JpdChpICsgMik7CisJCX0KKwkJdGNfd3JpdGVsKGVuYV9iaXRzLCAmdHItPkNBTV9FbmEpOworCQl0Y193cml0ZWwoQ0FNX0NvbXBFbiB8IENBTV9Ccm9hZEFjYywgJnRyLT5DQU1fQ3RsKTsKKwl9CisJZWxzZSB7CisJCXRjX3dyaXRlbChDQU1fRW5hX0JpdChDQU1fRU5UUllfU09VUkNFKSwgJnRyLT5DQU1fRW5hKTsKKwkJdGNfd3JpdGVsKENBTV9Db21wRW4gfCBDQU1fQnJvYWRBY2MsICZ0ci0+Q0FNX0N0bCk7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0Y19waHlfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgdGMzNTgxNV9yZWdzICp0ciwgaW50IHBoeSwgaW50IHBoeV9yZWcpCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJdGNfd3JpdGVsKE1EX0NBX0J1c3kgfCAocGh5IDw8IDUpIHwgcGh5X3JlZywgJnRyLT5NRF9DQSk7CisJd2hpbGUgKHRjX3JlYWRsKCZ0ci0+TURfQ0EpICYgTURfQ0FfQnVzeSkKKwkJOworCWRhdGEgPSB0Y19yZWFkbCgmdHItPk1EX0RhdGEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkIHRjX3BoeV93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGQsIHN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyLCBpbnQgcGh5LCBpbnQgcGh5X3JlZykKK3sKKwlzdHJ1Y3QgdGMzNTgxNV9sb2NhbCAqbHAgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJdGNfd3JpdGVsKGQsICZ0ci0+TURfRGF0YSk7CisJdGNfd3JpdGVsKE1EX0NBX0J1c3kgfCBNRF9DQV9XciB8IChwaHkgPDwgNSkgfCBwaHlfcmVnLCAmdHItPk1EX0NBKTsKKwl3aGlsZSAodGNfcmVhZGwoJnRyLT5NRF9DQSkgJiBNRF9DQV9CdXN5KQorCQk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgdGMzNTgxNV9waHlfY2hpcF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRjMzU4MTVfbG9jYWwgKmxwID0gZGV2LT5wcml2OworCXN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyID0gKHN0cnVjdCB0YzM1ODE1X3JlZ3MqKWRldi0+YmFzZV9hZGRyOworCXN0YXRpYyBpbnQgZmlyc3QgPSAxOworCXVuc2lnbmVkIHNob3J0IGN0bDsKKworCWlmIChmaXJzdCkgeworCQl1bnNpZ25lZCBzaG9ydCBpZDAsIGlkMTsKKwkJaW50IGNvdW50OworCQlmaXJzdCA9IDA7CisKKwkJLyogZmlyc3QgZGF0YSB3cml0dGVuIHRvIHRoZSBQSFkgd2lsbCBiZSBhbiBJRCBudW1iZXIgKi8KKwkJdGNfcGh5X3dyaXRlKGRldiwgMCwgdHIsIDAsIE1JSV9DT05UUk9MKTsJLyogSUQ6MCAqLworI2lmIDAKKwkJdGNfcGh5X3dyaXRlKGRldiwgTUlJQ05UTF9SRVNFVCwgdHIsIDAsIE1JSV9DT05UUk9MKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlc2V0dGluZyBQSFkuLi4iLCBkZXYtPm5hbWUpOworCQl3aGlsZSAodGNfcGh5X3JlYWQoZGV2LCB0ciwgMCwgTUlJX0NPTlRST0wpICYgTUlJQ05UTF9SRVNFVCkKKwkJCTsKKwkJcHJpbnRrKCJcbiIpOworCQl0Y19waHlfd3JpdGUoZGV2LCBNSUlDTlRMX0FVVE98TUlJQ05UTF9TUEVFRHxNSUlDTlRMX0ZEWCwgdHIsIDAsCisJCQkgICAgIE1JSV9DT05UUk9MKTsKKyNlbmRpZgorCQlpZDAgPSB0Y19waHlfcmVhZChkZXYsIHRyLCAwLCBNSUlfUEhZX0lEMCk7CisJCWlkMSA9IHRjX3BoeV9yZWFkKGRldiwgdHIsIDAsIE1JSV9QSFlfSUQxKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBQSFkgSUQgJTA0eCAlMDR4XG4iLCBkZXYtPm5hbWUsCisJCSAgICAgICBpZDAsIGlkMSk7CisJCWlmIChscC0+b3B0aW9uICYgVEMzNTgxNV9PUFRfMTBNKSB7CisJCQlscC0+bGlua3NwZWVkID0gMTA7CisJCQlscC0+ZnVsbGR1cGxleCA9IChscC0+b3B0aW9uICYgVEMzNTgxNV9PUFRfRlVMTERVUCkgIT0gMDsKKwkJfSBlbHNlIGlmIChscC0+b3B0aW9uICYgVEMzNTgxNV9PUFRfMTAwTSkgeworCQkJbHAtPmxpbmtzcGVlZCA9IDEwMDsKKwkJCWxwLT5mdWxsZHVwbGV4ID0gKGxwLT5vcHRpb24gJiBUQzM1ODE1X09QVF9GVUxMRFVQKSAhPSAwOworCQl9IGVsc2UgeworCQkJLyogYXV0byBuZWdvdGlhdGlvbiAqLworCQkJdW5zaWduZWQgbG9uZyBuZWdfcmVzdWx0OworCQkJdGNfcGh5X3dyaXRlKGRldiwgTUlJQ05UTF9BVVRPIHwgTUlJQ05UTF9SU1RfQVVUTywgdHIsIDAsIE1JSV9DT05UUk9MKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBdXRvIE5lZ290aWF0aW9uLi4uIiwgZGV2LT5uYW1lKTsKKwkJCWNvdW50ID0gMDsKKwkJCXdoaWxlICghKHRjX3BoeV9yZWFkKGRldiwgdHIsIDAsIE1JSV9TVEFUVVMpICYgTUlJU1RBVF9BVVRPX0RPTkUpKSB7CisJCQkJaWYgKGNvdW50KysgPiA1MDAwKSB7CisJCQkJCXByaW50aygiIGZhaWxlZC4gQXNzdW1lIDEwTWJwc1xuIik7CisJCQkJCWxwLT5saW5rc3BlZWQgPSAxMDsKKwkJCQkJbHAtPmZ1bGxkdXBsZXggPSAwOworCQkJCQlnb3RvIGRvbmU7CisJCQkJfQorCQkJCWlmIChjb3VudCAlIDUxMiA9PSAwKQorCQkJCQlwcmludGsoIi4iKTsKKwkJCQltZGVsYXkoMSk7CisJCQl9CisJCQlwcmludGsoIiBkb25lLlxuIik7CisJCQluZWdfcmVzdWx0ID0gdGNfcGh5X3JlYWQoZGV2LCB0ciwgMCwgTUlJX0FOTFBBUik7CisJCQlpZiAobmVnX3Jlc3VsdCAmIChNSUlfQU5fVFhfRkRYIHwgTUlJX0FOX1RYX0hEWCkpCisJCQkJbHAtPmxpbmtzcGVlZCA9IDEwMDsKKwkJCWVsc2UKKwkJCQlscC0+bGlua3NwZWVkID0gMTA7CisJCQlpZiAobmVnX3Jlc3VsdCAmIChNSUlfQU5fVFhfRkRYIHwgTUlJX0FOXzEwX0ZEWCkpCisJCQkJbHAtPmZ1bGxkdXBsZXggPSAxOworCQkJZWxzZQorCQkJCWxwLT5mdWxsZHVwbGV4ID0gMDsKKwkJZG9uZToKKwkJCTsKKwkJfQorCX0KKworCWN0bCA9IDA7CisJaWYgKGxwLT5saW5rc3BlZWQgPT0gMTAwKQorCQljdGwgfD0gTUlJQ05UTF9TUEVFRDsKKwlpZiAobHAtPmZ1bGxkdXBsZXgpCisJCWN0bCB8PSBNSUlDTlRMX0ZEWDsKKwl0Y19waHlfd3JpdGUoZGV2LCBjdGwsIHRyLCAwLCBNSUlfQ09OVFJPTCk7CisKKwlpZiAobHAtPmZ1bGxkdXBsZXgpIHsKKwkJdGNfd3JpdGVsKHRjX3JlYWRsKCZ0ci0+TUFDX0N0bCkgfCBNQUNfRnVsbER1cCwgJnRyLT5NQUNfQ3RsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRjMzU4MTVfY2hpcF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X3JlZ3MgKnRyID0gKHN0cnVjdCB0YzM1ODE1X3JlZ3MqKWRldi0+YmFzZV9hZGRyOworCisJLyogcmVzZXQgdGhlIGNvbnRyb2xsZXIgKi8KKwl0Y193cml0ZWwoTUFDX1Jlc2V0LCAmdHItPk1BQ19DdGwpOworCXdoaWxlICh0Y19yZWFkbCgmdHItPk1BQ19DdGwpICYgTUFDX1Jlc2V0KQorCQk7CisKKwl0Y193cml0ZWwoMCwgJnRyLT5NQUNfQ3RsKTsKKworCS8qIGluaXRpYWxpemUgcmVnaXN0ZXJzIHRvIGRlZmF1bHQgdmFsdWUgKi8KKwl0Y193cml0ZWwoMCwgJnRyLT5ETUFfQ3RsKTsKKwl0Y193cml0ZWwoMCwgJnRyLT5UeFRocnNoKTsKKwl0Y193cml0ZWwoMCwgJnRyLT5UeFBvbGxDdHIpOworCXRjX3dyaXRlbCgwLCAmdHItPlJ4RnJhZ1NpemUpOworCXRjX3dyaXRlbCgwLCAmdHItPkludF9Fbik7CisJdGNfd3JpdGVsKDAsICZ0ci0+RkRBX0Jhcyk7CisJdGNfd3JpdGVsKDAsICZ0ci0+RkRBX0xpbSk7CisJdGNfd3JpdGVsKDB4ZmZmZmZmZmYsICZ0ci0+SW50X1NyYyk7CS8qIFdyaXRlIDEgdG8gY2xlYXIgKi8KKwl0Y193cml0ZWwoMCwgJnRyLT5DQU1fQ3RsKTsKKwl0Y193cml0ZWwoMCwgJnRyLT5UeF9DdGwpOworCXRjX3dyaXRlbCgwLCAmdHItPlJ4X0N0bCk7CisJdGNfd3JpdGVsKDAsICZ0ci0+Q0FNX0VuYSk7CisJKHZvaWQpdGNfcmVhZGwoJnRyLT5NaXNzX0NudCk7CS8qIFJlYWQgdG8gY2xlYXIgKi8KKworfQorCitzdGF0aWMgdm9pZCB0YzM1ODE1X2NoaXBfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0YzM1ODE1X2xvY2FsICpscCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgdGMzNTgxNV9yZWdzICp0ciA9IChzdHJ1Y3QgdGMzNTgxNV9yZWdzKilkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdHhjdGwgPSBUWF9DVExfQ01EOworCisJdGMzNTgxNV9waHlfY2hpcF9pbml0KGRldik7CisKKwkvKiBsb2FkIHN0YXRpb24gYWRkcmVzcyB0byBDQU0gKi8KKwl0YzM1ODE1X3NldF9jYW1fZW50cnkodHIsIENBTV9FTlRSWV9TT1VSQ0UsIGRldi0+ZGV2X2FkZHIpOworCisJLyogRW5hYmxlIENBTSAoYnJvYWRjYXN0IGFuZCB1bmljYXN0KSAqLworCXRjX3dyaXRlbChDQU1fRW5hX0JpdChDQU1fRU5UUllfU09VUkNFKSwgJnRyLT5DQU1fRW5hKTsKKwl0Y193cml0ZWwoQ0FNX0NvbXBFbiB8IENBTV9Ccm9hZEFjYywgJnRyLT5DQU1fQ3RsKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCisJdGNfd3JpdGVsKERNQV9CVVJTVF9TSVpFLCAmdHItPkRNQV9DdGwpOworCisJdGNfd3JpdGVsKFJ4RnJhZ19FblBhY2sgfCBFVEhfWkxFTiwgJnRyLT5SeEZyYWdTaXplKTsJLyogUGFja2luZyAqLworCXRjX3dyaXRlbCgwLCAmdHItPlR4UG9sbEN0cik7CS8qIEJhdGNoIG1vZGUgKi8KKwl0Y193cml0ZWwoVFhfVEhSRVNIT0xELCAmdHItPlR4VGhyc2gpOworCXRjX3dyaXRlbChJTlRfRU5fQ01ELCAmdHItPkludF9Fbik7CisKKwkvKiBzZXQgcXVldWVzICovCisJdGNfd3JpdGVsKHZpcnRfdG9fYnVzKGxwLT5yZmRfYmFzZSksICZ0ci0+RkRBX0Jhcyk7CisJdGNfd3JpdGVsKCh1bnNpZ25lZCBsb25nKWxwLT5yZmRfbGltaXQgLSAodW5zaWduZWQgbG9uZylscC0+cmZkX2Jhc2UsCisJCSAgJnRyLT5GREFfTGltKTsKKwkvKgorCSAqIEFjdGl2YXRpb24gbWV0aG9kOgorCSAqIEZpcnN0LCBlbmFibGUgZWh0IE1BQyBUcmFuc21pdHRlciBhbmQgdGhlIERNQSBSZWNlaXZlIGNpcmN1aXRzLgorCSAqIFRoZW4gZW5hYmxlIHRoZSBETUEgVHJhbnNtaXR0ZXIgYW5kIHRoZSBNQUMgUmVjZWl2ZSBjaXJjdWl0cy4KKwkgKi8KKwl0Y193cml0ZWwodmlydF90b19idXMobHAtPmZibF9wdHIpLCAmdHItPkJMRnJtUHRyKTsJLyogc3RhcnQgRE1BIHJlY2VpdmVyICovCisJdGNfd3JpdGVsKFJYX0NUTF9DTUQsICZ0ci0+UnhfQ3RsKTsJLyogc3RhcnQgTUFDIHJlY2VpdmVyICovCisJLyogc3RhcnQgTUFDIHRyYW5zbWl0dGVyICovCisJLyogV09SS0FST1VORDogaWdub3JlIExvc3RDclMgaW4gZnVsbCBkdXBsZXggb3BlcmF0aW9uICovCisJaWYgKGxwLT5mdWxsZHVwbGV4KQorCQl0eGN0bCA9IFRYX0NUTF9DTUQgJiB+VHhfRW5MQ2FycjsKKyNpZmRlZiBHQVRIRVJfVFhJTlQKKwl0eGN0bCAmPSB+VHhfRW5Db21wOwkvKiBkaXNhYmxlIGdsb2JhbCB0eCBjb21wbGV0aW9uIGludC4gKi8KKyNlbmRpZgorCXRjX3dyaXRlbCh0eGN0bCwgJnRyLT5UeF9DdGwpOworI2lmIDAJLyogTm8gbmVlZCB0byBwb2xsaW5nICovCisJdGNfd3JpdGVsKHZpcnRfdG9fYnVzKGxwLT50ZmRfYmFzZSksICZ0ci0+VHhGcm1QdHIpOwkvKiBzdGFydCBETUEgdHJhbnNtaXR0ZXIgKi8KKyNlbmRpZgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIFhYWCAqLwordm9pZAordGMzNTgxNV9raWxsYWxsKHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCWZvciAoZGV2ID0gcm9vdF90YzM1ODE1X2RldjsgZGV2OyBkZXYgPSAoKHN0cnVjdCB0YzM1ODE1X2xvY2FsICopZGV2LT5wcml2KS0+bmV4dF9tb2R1bGUpIHsKKwkJaWYgKGRldi0+ZmxhZ3MmSUZGX1VQKXsKKwkJCWRldi0+c3RvcChkZXYpOworCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdGMzNTgxNV9kcml2ZXIgPSB7CisJLm5hbWUgPSBUQzM1ODE1X01PRFVMRV9OQU1FLAorCS5wcm9iZSA9IHRjMzU4MTVfcHJvYmUsCisJLnJlbW92ZSA9IE5VTEwsCisJLmlkX3RhYmxlID0gdGMzNTgxNV9wY2lfdGJsLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdGMzNTgxNV9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnRjMzU4MTVfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRjMzU4MTVfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV4dF9kZXY7CisKKwl3aGlsZSAocm9vdF90YzM1ODE1X2RldikgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcm9vdF90YzM1ODE1X2RldjsKKwkJbmV4dF9kZXYgPSAoKHN0cnVjdCB0YzM1ODE1X2xvY2FsICopZGV2LT5wcml2KS0+bmV4dF9tb2R1bGU7CisJCWlvdW5tYXAoKHZvaWQgKikoZGV2LT5iYXNlX2FkZHIpKTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcm9vdF90YzM1ODE1X2RldiA9IG5leHRfZGV2OworCX0KK30KK21vZHVsZV9pbml0KHRjMzU4MTVfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQodGMzNTgxNV9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90ZzMuYyBiL2RyaXZlcnMvbmV0L3RnMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZGU4MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90ZzMuYwpAQCAtMCwwICsxLDkwODMgQEAKKy8qCisgKiB0ZzMuYzogQnJvYWRjb20gVGlnb24zIGV0aGVybmV0IGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzIEplZmYgR2FyemlrIChqZ2FyemlrQHBvYm94LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwNCBTdW4gTWljcm9zeXN0ZW1zIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBGaXJtd2FyZSBpczoKKyAqIAlDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMyBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmZGVmIENPTkZJR19TUEFSQzY0CisjaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS9wYm0uaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCisjZGVmaW5lIFRHM19WTEFOX1RBR19VU0VEIDEKKyNlbHNlCisjZGVmaW5lIFRHM19WTEFOX1RBR19VU0VEIDAKKyNlbmRpZgorCisjaWZkZWYgTkVUSUZfRl9UU08KKyNkZWZpbmUgVEczX1RTT19TVVBQT1JUCTEKKyNlbHNlCisjZGVmaW5lIFRHM19UU09fU1VQUE9SVAkwCisjZW5kaWYKKworI2luY2x1ZGUgInRnMy5oIgorCisjZGVmaW5lIERSVl9NT0RVTEVfTkFNRQkJInRnMyIKKyNkZWZpbmUgUEZYIERSVl9NT0RVTEVfTkFNRQkiOiAiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMy4yNSIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJNYXJjaCAyNCwgMjAwNSIKKworI2RlZmluZSBURzNfREVGX01BQ19NT0RFCTAKKyNkZWZpbmUgVEczX0RFRl9SWF9NT0RFCQkwCisjZGVmaW5lIFRHM19ERUZfVFhfTU9ERQkJMAorI2RlZmluZSBURzNfREVGX01TR19FTkFCTEUJICBcCisJKE5FVElGX01TR19EUlYJCXwgXAorCSBORVRJRl9NU0dfUFJPQkUJfCBcCisJIE5FVElGX01TR19MSU5LCQl8IFwKKwkgTkVUSUZfTVNHX1RJTUVSCXwgXAorCSBORVRJRl9NU0dfSUZET1dOCXwgXAorCSBORVRJRl9NU0dfSUZVUAkJfCBcCisJIE5FVElGX01TR19SWF9FUlIJfCBcCisJIE5FVElGX01TR19UWF9FUlIpCisKKy8qIGxlbmd0aCBvZiB0aW1lIGJlZm9yZSB3ZSBkZWNpZGUgdGhlIGhhcmR3YXJlIGlzIGJvcmtlZCwKKyAqIGFuZCBkZXYtPnR4X3RpbWVvdXQoKSBzaG91bGQgYmUgY2FsbGVkIHRvIGZpeCB0aGUgcHJvYmxlbQorICovCisjZGVmaW5lIFRHM19UWF9USU1FT1VUCQkJKDUgKiBIWikKKworLyogaGFyZHdhcmUgbWluaW11bSBhbmQgbWF4aW11bSBmb3IgYSBzaW5nbGUgZnJhbWUncyBkYXRhIHBheWxvYWQgKi8KKyNkZWZpbmUgVEczX01JTl9NVFUJCQk2MAorI2RlZmluZSBURzNfTUFYX01UVSh0cCkJXAorCSgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDUgJiYgXAorCSAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3NTApID8gOTAwMCA6IDE1MDApCisKKy8qIFRoZXNlIG51bWJlcnMgc2VlbSB0byBiZSBoYXJkIGNvZGVkIGluIHRoZSBOSUMgZmlybXdhcmUgc29tZWhvdy4KKyAqIFlvdSBjYW4ndCBjaGFuZ2UgdGhlIHJpbmcgc2l6ZXMsIGJ1dCB5b3UgY2FuIGNoYW5nZSB3aGVyZSB5b3UgcGxhY2UKKyAqIHRoZW0gaW4gdGhlIE5JQyBvbmJvYXJkIG1lbW9yeS4KKyAqLworI2RlZmluZSBURzNfUlhfUklOR19TSVpFCQk1MTIKKyNkZWZpbmUgVEczX0RFRl9SWF9SSU5HX1BFTkRJTkcJCTIwMAorI2RlZmluZSBURzNfUlhfSlVNQk9fUklOR19TSVpFCQkyNTYKKyNkZWZpbmUgVEczX0RFRl9SWF9KVU1CT19SSU5HX1BFTkRJTkcJMTAwCisKKy8qIERvIG5vdCBwbGFjZSB0aGlzIG4tcmluZyBlbnRyaWVzIHZhbHVlIGludG8gdGhlIHRwIHN0cnVjdCBpdHNlbGYsCisgKiB3ZSByZWFsbHkgd2FudCB0byBleHBvc2UgdGhlc2UgY29uc3RhbnRzIHRvIEdDQyBzbyB0aGF0IG1vZHVsbyBldAorICogYWwuICBvcGVyYXRpb25zIGFyZSBkb25lIHdpdGggc2hpZnRzIGFuZCBtYXNrcyBpbnN0ZWFkIG9mIHdpdGgKKyAqIGh3IG11bHRpcGx5L21vZHVsbyBpbnN0cnVjdGlvbnMuICBBbm90aGVyIHNvbHV0aW9uIHdvdWxkIGJlIHRvCisgKiByZXBsYWNlIHRoaW5ncyBsaWtlICclIGZvbycgd2l0aCAnJiAoZm9vIC0gMSknLgorICovCisjZGVmaW5lIFRHM19SWF9SQ0JfUklOR19TSVpFKHRwKQlcCisJKCh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykgPyAgNTEyIDogMTAyNCkKKworI2RlZmluZSBURzNfVFhfUklOR19TSVpFCQk1MTIKKyNkZWZpbmUgVEczX0RFRl9UWF9SSU5HX1BFTkRJTkcJCShURzNfVFhfUklOR19TSVpFIC0gMSkKKworI2RlZmluZSBURzNfUlhfUklOR19CWVRFUwkoc2l6ZW9mKHN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MpICogXAorCQkJCSBURzNfUlhfUklOR19TSVpFKQorI2RlZmluZSBURzNfUlhfSlVNQk9fUklOR19CWVRFUwkoc2l6ZW9mKHN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MpICogXAorCQkJICAgICAgICAgVEczX1JYX0pVTUJPX1JJTkdfU0laRSkKKyNkZWZpbmUgVEczX1JYX1JDQl9SSU5HX0JZVEVTKHRwKSAoc2l6ZW9mKHN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MpICogXAorCQkJICAgICAgICAgICBURzNfUlhfUkNCX1JJTkdfU0laRSh0cCkpCisjZGVmaW5lIFRHM19UWF9SSU5HX0JZVEVTCShzaXplb2Yoc3RydWN0IHRnM190eF9idWZmZXJfZGVzYykgKiBcCisJCQkJIFRHM19UWF9SSU5HX1NJWkUpCisjZGVmaW5lIFRYX1JJTkdfR0FQKFRQKQlcCisJKFRHM19UWF9SSU5HX1NJWkUgLSAoVFApLT50eF9wZW5kaW5nKQorI2RlZmluZSBUWF9CVUZGU19BVkFJTChUUCkJCQkJCQlcCisJKCgoVFApLT50eF9jb25zIDw9IChUUCktPnR4X3Byb2QpID8JCQkJXAorCSAgKFRQKS0+dHhfY29ucyArIChUUCktPnR4X3BlbmRpbmcgLSAoVFApLT50eF9wcm9kIDoJCVwKKwkgIChUUCktPnR4X2NvbnMgLSAoVFApLT50eF9wcm9kIC0gVFhfUklOR19HQVAoVFApKQorI2RlZmluZSBORVhUX1RYKE4pCQkoKChOKSArIDEpICYgKFRHM19UWF9SSU5HX1NJWkUgLSAxKSkKKworI2RlZmluZSBSWF9QS1RfQlVGX1NaCQkoMTUzNiArIHRwLT5yeF9vZmZzZXQgKyA2NCkKKyNkZWZpbmUgUlhfSlVNQk9fUEtUX0JVRl9TWgkoOTA0NiArIHRwLT5yeF9vZmZzZXQgKyA2NCkKKworLyogbWluaW11bSBudW1iZXIgb2YgZnJlZSBUWCBkZXNjcmlwdG9ycyByZXF1aXJlZCB0byB3YWtlIHVwIFRYIHByb2Nlc3MgKi8KKyNkZWZpbmUgVEczX1RYX1dBS0VVUF9USFJFU0gJCShURzNfVFhfUklOR19TSVpFIC8gNCkKKworLyogbnVtYmVyIG9mIEVUSFRPT0xfR1NUQVRTIHU2NCdzICovCisjZGVmaW5lIFRHM19OVU1fU1RBVFMJCShzaXplb2Yoc3RydWN0IHRnM19ldGh0b29sX3N0YXRzKS9zaXplb2YodTY0KSkKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorCURSVl9NT0RVTEVfTkFNRSAiLmM6diIgRFJWX01PRFVMRV9WRVJTSU9OICIgKCIgRFJWX01PRFVMRV9SRUxEQVRFICIpXG4iOworCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pIGFuZCBKZWZmIEdhcnppayAoamdhcnppa0Bwb2JveC5jb20pIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJyb2FkY29tIFRpZ29uMyBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9NT0RVTEVfVkVSU0lPTik7CisKK3N0YXRpYyBpbnQgdGczX2RlYnVnID0gLTE7CS8qIC0xID09IHVzZSBURzNfREVGX01TR19FTkFCTEUgYXMgdmFsdWUgKi8KK21vZHVsZV9wYXJhbSh0ZzNfZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRnM19kZWJ1ZywgIlRpZ29uMyBiaXRtYXBwZWQgZGVidWdnaW5nIG1lc3NhZ2UgZW5hYmxlIHZhbHVlIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0ZzNfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwMCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwMSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwMiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwMywKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwNCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwMkZFLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzA1LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzA1XzIsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDVNLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzA1TV8yLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAyWCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcwM1gsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDRTLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzAyQTMsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDNBMywKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTc4MiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTc4OCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTc4OSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTkwMSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTkwMV8yLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzA0U18yLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzA1RiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcyMCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTcyMSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTc1MCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTc1MSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTc1ME0sCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3NTFNLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzUxRiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTc1MywKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgUENJX0RFVklDRV9JRF9USUdPTjNfNTc1M00sCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwVUwgfSwKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfVElHT04zXzU3NTNGLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCBQQ0lfREVWSUNFX0lEX1RJR09OM181NzgxLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX1NZU0tPTk5FQ1QsIFBDSV9ERVZJQ0VfSURfU1lTS09OTkVDVF85RFhYLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX1NZU0tPTk5FQ1QsIFBDSV9ERVZJQ0VfSURfU1lTS09OTkVDVF85TVhYLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FMVElNQSwgUENJX0RFVklDRV9JRF9BTFRJTUFfQUMxMDAwLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FMVElNQSwgUENJX0RFVklDRV9JRF9BTFRJTUFfQUMxMDAxLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FMVElNQSwgUENJX0RFVklDRV9JRF9BTFRJTUFfQUMxMDAzLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FMVElNQSwgUENJX0RFVklDRV9JRF9BTFRJTUFfQUM5MTAwLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMFVMIH0sCisJeyBQQ0lfVkVORE9SX0lEX0FQUExFLCBQQ0lfREVWSUNFX0lEX0FQUExFX1RJR09OMywKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDBVTCB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHRnM19wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCB7CisJY29uc3QgY2hhciBzdHJpbmdbRVRIX0dTVFJJTkdfTEVOXTsKK30gZXRodG9vbF9zdGF0c19rZXlzW1RHM19OVU1fU1RBVFNdID0geworCXsgInJ4X29jdGV0cyIgfSwKKwl7ICJyeF9mcmFnbWVudHMiIH0sCisJeyAicnhfdWNhc3RfcGFja2V0cyIgfSwKKwl7ICJyeF9tY2FzdF9wYWNrZXRzIiB9LAorCXsgInJ4X2JjYXN0X3BhY2tldHMiIH0sCisJeyAicnhfZmNzX2Vycm9ycyIgfSwKKwl7ICJyeF9hbGlnbl9lcnJvcnMiIH0sCisJeyAicnhfeG9uX3BhdXNlX3JjdmQiIH0sCisJeyAicnhfeG9mZl9wYXVzZV9yY3ZkIiB9LAorCXsgInJ4X21hY19jdHJsX3JjdmQiIH0sCisJeyAicnhfeG9mZl9lbnRlcmVkIiB9LAorCXsgInJ4X2ZyYW1lX3Rvb19sb25nX2Vycm9ycyIgfSwKKwl7ICJyeF9qYWJiZXJzIiB9LAorCXsgInJ4X3VuZGVyc2l6ZV9wYWNrZXRzIiB9LAorCXsgInJ4X2luX2xlbmd0aF9lcnJvcnMiIH0sCisJeyAicnhfb3V0X2xlbmd0aF9lcnJvcnMiIH0sCisJeyAicnhfNjRfb3JfbGVzc19vY3RldF9wYWNrZXRzIiB9LAorCXsgInJ4XzY1X3RvXzEyN19vY3RldF9wYWNrZXRzIiB9LAorCXsgInJ4XzEyOF90b18yNTVfb2N0ZXRfcGFja2V0cyIgfSwKKwl7ICJyeF8yNTZfdG9fNTExX29jdGV0X3BhY2tldHMiIH0sCisJeyAicnhfNTEyX3RvXzEwMjNfb2N0ZXRfcGFja2V0cyIgfSwKKwl7ICJyeF8xMDI0X3RvXzE1MjJfb2N0ZXRfcGFja2V0cyIgfSwKKwl7ICJyeF8xNTIzX3RvXzIwNDdfb2N0ZXRfcGFja2V0cyIgfSwKKwl7ICJyeF8yMDQ4X3RvXzQwOTVfb2N0ZXRfcGFja2V0cyIgfSwKKwl7ICJyeF80MDk2X3RvXzgxOTFfb2N0ZXRfcGFja2V0cyIgfSwKKwl7ICJyeF84MTkyX3RvXzkwMjJfb2N0ZXRfcGFja2V0cyIgfSwKKworCXsgInR4X29jdGV0cyIgfSwKKwl7ICJ0eF9jb2xsaXNpb25zIiB9LAorCisJeyAidHhfeG9uX3NlbnQiIH0sCisJeyAidHhfeG9mZl9zZW50IiB9LAorCXsgInR4X2Zsb3dfY29udHJvbCIgfSwKKwl7ICJ0eF9tYWNfZXJyb3JzIiB9LAorCXsgInR4X3NpbmdsZV9jb2xsaXNpb25zIiB9LAorCXsgInR4X211bHRfY29sbGlzaW9ucyIgfSwKKwl7ICJ0eF9kZWZlcnJlZCIgfSwKKwl7ICJ0eF9leGNlc3NpdmVfY29sbGlzaW9ucyIgfSwKKwl7ICJ0eF9sYXRlX2NvbGxpc2lvbnMiIH0sCisJeyAidHhfY29sbGlkZV8ydGltZXMiIH0sCisJeyAidHhfY29sbGlkZV8zdGltZXMiIH0sCisJeyAidHhfY29sbGlkZV80dGltZXMiIH0sCisJeyAidHhfY29sbGlkZV81dGltZXMiIH0sCisJeyAidHhfY29sbGlkZV82dGltZXMiIH0sCisJeyAidHhfY29sbGlkZV83dGltZXMiIH0sCisJeyAidHhfY29sbGlkZV84dGltZXMiIH0sCisJeyAidHhfY29sbGlkZV85dGltZXMiIH0sCisJeyAidHhfY29sbGlkZV8xMHRpbWVzIiB9LAorCXsgInR4X2NvbGxpZGVfMTF0aW1lcyIgfSwKKwl7ICJ0eF9jb2xsaWRlXzEydGltZXMiIH0sCisJeyAidHhfY29sbGlkZV8xM3RpbWVzIiB9LAorCXsgInR4X2NvbGxpZGVfMTR0aW1lcyIgfSwKKwl7ICJ0eF9jb2xsaWRlXzE1dGltZXMiIH0sCisJeyAidHhfdWNhc3RfcGFja2V0cyIgfSwKKwl7ICJ0eF9tY2FzdF9wYWNrZXRzIiB9LAorCXsgInR4X2JjYXN0X3BhY2tldHMiIH0sCisJeyAidHhfY2Fycmllcl9zZW5zZV9lcnJvcnMiIH0sCisJeyAidHhfZGlzY2FyZHMiIH0sCisJeyAidHhfZXJyb3JzIiB9LAorCisJeyAiZG1hX3dyaXRlcV9mdWxsIiB9LAorCXsgImRtYV93cml0ZV9wcmlvcV9mdWxsIiB9LAorCXsgInJ4YmRzX2VtcHR5IiB9LAorCXsgInJ4X2Rpc2NhcmRzIiB9LAorCXsgInJ4X2Vycm9ycyIgfSwKKwl7ICJyeF90aHJlc2hvbGRfaGl0IiB9LAorCisJeyAiZG1hX3JlYWRxX2Z1bGwiIH0sCisJeyAiZG1hX3JlYWRfcHJpb3FfZnVsbCIgfSwKKwl7ICJ0eF9jb21wX3F1ZXVlX2Z1bGwiIH0sCisKKwl7ICJyaW5nX3NldF9zZW5kX3Byb2RfaW5kZXgiIH0sCisJeyAicmluZ19zdGF0dXNfdXBkYXRlIiB9LAorCXsgIm5pY19pcnFzIiB9LAorCXsgIm5pY19hdm9pZGVkX2lycXMiIH0sCisJeyAibmljX3R4X3RocmVzaG9sZF9oaXQiIH0KK307CisKK3N0YXRpYyB2b2lkIHRnM193cml0ZV9pbmRpcmVjdF9yZWczMihzdHJ1Y3QgdGczICp0cCwgdTMyIG9mZiwgdTMyIHZhbCkKK3sKKwlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX1RBUkdFVF9IV0JVRykgIT0gMCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+aW5kaXJlY3RfbG9jaywgZmxhZ3MpOworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfUkVHX0JBU0VfQUREUiwgb2ZmKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1JFR19EQVRBLCB2YWwpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+aW5kaXJlY3RfbG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCXdyaXRlbCh2YWwsIHRwLT5yZWdzICsgb2ZmKTsKKwkJaWYgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfNTcwMV9SRUdfV1JJVEVfQlVHKSAhPSAwKQorCQkJcmVhZGwodHAtPnJlZ3MgKyBvZmYpOworCX0KK30KKworc3RhdGljIHZvaWQgX3R3MzJfZmx1c2goc3RydWN0IHRnMyAqdHAsIHUzMiBvZmYsIHUzMiB2YWwpCit7CisJaWYgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9UQVJHRVRfSFdCVUcpICE9IDApIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmluZGlyZWN0X2xvY2ssIGZsYWdzKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1JFR19CQVNFX0FERFIsIG9mZik7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9SRUdfREFUQSwgdmFsKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmluZGlyZWN0X2xvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQl2b2lkIF9faW9tZW0gKmRlc3QgPSB0cC0+cmVncyArIG9mZjsKKwkJd3JpdGVsKHZhbCwgZGVzdCk7CisJCXJlYWRsKGRlc3QpOyAgICAvKiBhbHdheXMgZmx1c2ggUENJIHdyaXRlICovCisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX3R3MzJfcnhfbWJveChzdHJ1Y3QgdGczICp0cCwgdTMyIG9mZiwgdTMyIHZhbCkKK3sKKwl2b2lkIF9faW9tZW0gKm1ib3ggPSB0cC0+cmVncyArIG9mZjsKKwl3cml0ZWwodmFsLCBtYm94KTsKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX01CT1hfV1JJVEVfUkVPUkRFUikKKwkJcmVhZGwobWJveCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfdHczMl90eF9tYm94KHN0cnVjdCB0ZzMgKnRwLCB1MzIgb2ZmLCB1MzIgdmFsKQoreworCXZvaWQgX19pb21lbSAqbWJveCA9IHRwLT5yZWdzICsgb2ZmOworCXdyaXRlbCh2YWwsIG1ib3gpOworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfVFhEX01CT1hfSFdCVUcpCisJCXdyaXRlbCh2YWwsIG1ib3gpOworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfTUJPWF9XUklURV9SRU9SREVSKQorCQlyZWFkbChtYm94KTsKK30KKworI2RlZmluZSB0dzMyX21haWxib3gocmVnLCB2YWwpICB3cml0ZWwoKCh2YWwpICYgMHhmZmZmZmZmZiksIHRwLT5yZWdzICsgKHJlZykpCisjZGVmaW5lIHR3MzJfcnhfbWJveChyZWcsIHZhbCkgIF90dzMyX3J4X21ib3godHAsIHJlZywgdmFsKQorI2RlZmluZSB0dzMyX3R4X21ib3gocmVnLCB2YWwpICBfdHczMl90eF9tYm94KHRwLCByZWcsIHZhbCkKKworI2RlZmluZSB0dzMyKHJlZyx2YWwpCQl0ZzNfd3JpdGVfaW5kaXJlY3RfcmVnMzIodHAsKHJlZyksKHZhbCkpCisjZGVmaW5lIHR3MzJfZihyZWcsdmFsKQkJX3R3MzJfZmx1c2godHAsKHJlZyksKHZhbCkpCisjZGVmaW5lIHR3MTYocmVnLHZhbCkJCXdyaXRldygoKHZhbCkgJiAweGZmZmYpLCB0cC0+cmVncyArIChyZWcpKQorI2RlZmluZSB0dzgocmVnLHZhbCkJCXdyaXRlYigoKHZhbCkgJiAweGZmKSwgdHAtPnJlZ3MgKyAocmVnKSkKKyNkZWZpbmUgdHIzMihyZWcpCQlyZWFkbCh0cC0+cmVncyArIChyZWcpKQorI2RlZmluZSB0cjE2KHJlZykJCXJlYWR3KHRwLT5yZWdzICsgKHJlZykpCisjZGVmaW5lIHRyOChyZWcpCQlyZWFkYih0cC0+cmVncyArIChyZWcpKQorCitzdGF0aWMgdm9pZCB0ZzNfd3JpdGVfbWVtKHN0cnVjdCB0ZzMgKnRwLCB1MzIgb2ZmLCB1MzIgdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmluZGlyZWN0X2xvY2ssIGZsYWdzKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfTUVNX1dJTl9CQVNFX0FERFIsIG9mZik7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01FTV9XSU5fREFUQSwgdmFsKTsKKworCS8qIEFsd2F5cyBsZWF2ZSB0aGlzIGFzIHplcm8uICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01FTV9XSU5fQkFTRV9BRERSLCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+aW5kaXJlY3RfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB0ZzNfcmVhZF9tZW0oc3RydWN0IHRnMyAqdHAsIHUzMiBvZmYsIHUzMiAqdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmluZGlyZWN0X2xvY2ssIGZsYWdzKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfTUVNX1dJTl9CQVNFX0FERFIsIG9mZik7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfTUVNX1dJTl9EQVRBLCB2YWwpOworCisJLyogQWx3YXlzIGxlYXZlIHRoaXMgYXMgemVyby4gKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfTUVNX1dJTl9CQVNFX0FERFIsIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5pbmRpcmVjdF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHRnM19kaXNhYmxlX2ludHMoc3RydWN0IHRnMyAqdHApCit7CisJdHczMihURzNQQ0lfTUlTQ19IT1NUX0NUUkwsCisJICAgICAodHAtPm1pc2NfaG9zdF9jdHJsIHwgTUlTQ19IT1NUX0NUUkxfTUFTS19QQ0lfSU5UKSk7CisJdHczMl9tYWlsYm94KE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVywgMHgwMDAwMDAwMSk7CisJdHIzMihNQUlMQk9YX0lOVEVSUlVQVF8wICsgVEczXzY0QklUX1JFR19MT1cpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGczX2NvbmRfaW50KHN0cnVjdCB0ZzMgKnRwKQoreworCWlmICh0cC0+aHdfc3RhdHVzLT5zdGF0dXMgJiBTRF9TVEFUVVNfVVBEQVRFRCkKKwkJdHczMihHUkNfTE9DQUxfQ1RSTCwgdHAtPmdyY19sb2NhbF9jdHJsIHwgR1JDX0xDTENUUkxfU0VUSU5UKTsKK30KKworc3RhdGljIHZvaWQgdGczX2VuYWJsZV9pbnRzKHN0cnVjdCB0ZzMgKnRwKQoreworCXR3MzIoVEczUENJX01JU0NfSE9TVF9DVFJMLAorCSAgICAgKHRwLT5taXNjX2hvc3RfY3RybCAmIH5NSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQpKTsKKwl0dzMyX21haWxib3goTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XLCAweDAwMDAwMDAwKTsKKwl0cjMyKE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVyk7CisKKwl0ZzNfY29uZF9pbnQodHApOworfQorCisvKiB0ZzNfcmVzdGFydF9pbnRzCisgKiAgc2ltaWxhciB0byB0ZzNfZW5hYmxlX2ludHMsIGJ1dCBpdCBjYW4gcmV0dXJuIHdpdGhvdXQgZmx1c2hpbmcgdGhlCisgKiAgUElPIHdyaXRlIHdoaWNoIHJlZW5hYmxlcyBpbnRlcnJ1cHRzCisgKi8KK3N0YXRpYyB2b2lkIHRnM19yZXN0YXJ0X2ludHMoc3RydWN0IHRnMyAqdHApCit7CisJdHczMihURzNQQ0lfTUlTQ19IT1NUX0NUUkwsCisJCSh0cC0+bWlzY19ob3N0X2N0cmwgJiB+TUlTQ19IT1NUX0NUUkxfTUFTS19QQ0lfSU5UKSk7CisJdHczMl9tYWlsYm94KE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVywgMHgwMDAwMDAwMCk7CisJbW1pb3diKCk7CisKKwl0ZzNfY29uZF9pbnQodHApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGczX25ldGlmX3N0b3Aoc3RydWN0IHRnMyAqdHApCit7CisJbmV0aWZfcG9sbF9kaXNhYmxlKHRwLT5kZXYpOworCW5ldGlmX3R4X2Rpc2FibGUodHAtPmRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0ZzNfbmV0aWZfc3RhcnQoc3RydWN0IHRnMyAqdHApCit7CisJbmV0aWZfd2FrZV9xdWV1ZSh0cC0+ZGV2KTsKKwkvKiBOT1RFOiB1bmNvbmRpdGlvbmFsIG5ldGlmX3dha2VfcXVldWUgaXMgb25seSBhcHByb3ByaWF0ZQorCSAqIHNvIGxvbmcgYXMgYWxsIGNhbGxlcnMgYXJlIGFzc3VyZWQgdG8gaGF2ZSBmcmVlIHR4IHNsb3RzCisJICogKHN1Y2ggYXMgYWZ0ZXIgdGczX2luaXRfaHcpCisJICovCisJbmV0aWZfcG9sbF9lbmFibGUodHAtPmRldik7CisJdGczX2NvbmRfaW50KHRwKTsKK30KKworc3RhdGljIHZvaWQgdGczX3N3aXRjaF9jbG9ja3Moc3RydWN0IHRnMyAqdHApCit7CisJdTMyIGNsb2NrX2N0cmwgPSB0cjMyKFRHM1BDSV9DTE9DS19DVFJMKTsKKwl1MzIgb3JpZ19jbG9ja19jdHJsOworCisJb3JpZ19jbG9ja19jdHJsID0gY2xvY2tfY3RybDsKKwljbG9ja19jdHJsICY9IChDTE9DS19DVFJMX0ZPUkNFX0NMS1JVTiB8CisJCSAgICAgICBDTE9DS19DVFJMX0NMS1JVTl9PRU5BQkxFIHwKKwkJICAgICAgIDB4MWYpOworCXRwLT5wY2lfY2xvY2tfY3RybCA9IGNsb2NrX2N0cmw7CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpIHsKKwkJaWYgKG9yaWdfY2xvY2tfY3RybCAmIENMT0NLX0NUUkxfNjI1X0NPUkUpIHsKKwkJCXR3MzJfZihURzNQQ0lfQ0xPQ0tfQ1RSTCwKKwkJCSAgICAgICBjbG9ja19jdHJsIHwgQ0xPQ0tfQ1RSTF82MjVfQ09SRSk7CisJCQl1ZGVsYXkoNDApOworCQl9CisJfSBlbHNlIGlmICgob3JpZ19jbG9ja19jdHJsICYgQ0xPQ0tfQ1RSTF80NE1IWl9DT1JFKSAhPSAwKSB7CisJCXR3MzJfZihURzNQQ0lfQ0xPQ0tfQ1RSTCwKKwkJICAgICBjbG9ja19jdHJsIHwKKwkJICAgICAoQ0xPQ0tfQ1RSTF80NE1IWl9DT1JFIHwgQ0xPQ0tfQ1RSTF9BTFRDTEspKTsKKwkJdWRlbGF5KDQwKTsKKwkJdHczMl9mKFRHM1BDSV9DTE9DS19DVFJMLAorCQkgICAgIGNsb2NrX2N0cmwgfCAoQ0xPQ0tfQ1RSTF9BTFRDTEspKTsKKwkJdWRlbGF5KDQwKTsKKwl9CisJdHczMl9mKFRHM1BDSV9DTE9DS19DVFJMLCBjbG9ja19jdHJsKTsKKwl1ZGVsYXkoNDApOworfQorCisjZGVmaW5lIFBIWV9CVVNZX0xPT1BTCTUwMDAKKworc3RhdGljIGludCB0ZzNfcmVhZHBoeShzdHJ1Y3QgdGczICp0cCwgaW50IHJlZywgdTMyICp2YWwpCit7CisJdTMyIGZyYW1lX3ZhbDsKKwl1bnNpZ25lZCBpbnQgbG9vcHM7CisJaW50IHJldDsKKworCWlmICgodHAtPm1pX21vZGUgJiBNQUNfTUlfTU9ERV9BVVRPX1BPTEwpICE9IDApIHsKKwkJdHczMl9mKE1BQ19NSV9NT0RFLAorCQkgICAgICh0cC0+bWlfbW9kZSAmIH5NQUNfTUlfTU9ERV9BVVRPX1BPTEwpKTsKKwkJdWRlbGF5KDgwKTsKKwl9CisKKwkqdmFsID0gMHgwOworCisJZnJhbWVfdmFsICA9ICgoUEhZX0FERFIgPDwgTUlfQ09NX1BIWV9BRERSX1NISUZUKSAmCisJCSAgICAgIE1JX0NPTV9QSFlfQUREUl9NQVNLKTsKKwlmcmFtZV92YWwgfD0gKChyZWcgPDwgTUlfQ09NX1JFR19BRERSX1NISUZUKSAmCisJCSAgICAgIE1JX0NPTV9SRUdfQUREUl9NQVNLKTsKKwlmcmFtZV92YWwgfD0gKE1JX0NPTV9DTURfUkVBRCB8IE1JX0NPTV9TVEFSVCk7CisJCisJdHczMl9mKE1BQ19NSV9DT00sIGZyYW1lX3ZhbCk7CisKKwlsb29wcyA9IFBIWV9CVVNZX0xPT1BTOworCXdoaWxlIChsb29wcyAhPSAwKSB7CisJCXVkZWxheSgxMCk7CisJCWZyYW1lX3ZhbCA9IHRyMzIoTUFDX01JX0NPTSk7CisKKwkJaWYgKChmcmFtZV92YWwgJiBNSV9DT01fQlVTWSkgPT0gMCkgeworCQkJdWRlbGF5KDUpOworCQkJZnJhbWVfdmFsID0gdHIzMihNQUNfTUlfQ09NKTsKKwkJCWJyZWFrOworCQl9CisJCWxvb3BzIC09IDE7CisJfQorCisJcmV0ID0gLUVCVVNZOworCWlmIChsb29wcyAhPSAwKSB7CisJCSp2YWwgPSBmcmFtZV92YWwgJiBNSV9DT01fREFUQV9NQVNLOworCQlyZXQgPSAwOworCX0KKworCWlmICgodHAtPm1pX21vZGUgJiBNQUNfTUlfTU9ERV9BVVRPX1BPTEwpICE9IDApIHsKKwkJdHczMl9mKE1BQ19NSV9NT0RFLCB0cC0+bWlfbW9kZSk7CisJCXVkZWxheSg4MCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0ZzNfd3JpdGVwaHkoc3RydWN0IHRnMyAqdHAsIGludCByZWcsIHUzMiB2YWwpCit7CisJdTMyIGZyYW1lX3ZhbDsKKwl1bnNpZ25lZCBpbnQgbG9vcHM7CisJaW50IHJldDsKKworCWlmICgodHAtPm1pX21vZGUgJiBNQUNfTUlfTU9ERV9BVVRPX1BPTEwpICE9IDApIHsKKwkJdHczMl9mKE1BQ19NSV9NT0RFLAorCQkgICAgICh0cC0+bWlfbW9kZSAmIH5NQUNfTUlfTU9ERV9BVVRPX1BPTEwpKTsKKwkJdWRlbGF5KDgwKTsKKwl9CisKKwlmcmFtZV92YWwgID0gKChQSFlfQUREUiA8PCBNSV9DT01fUEhZX0FERFJfU0hJRlQpICYKKwkJICAgICAgTUlfQ09NX1BIWV9BRERSX01BU0spOworCWZyYW1lX3ZhbCB8PSAoKHJlZyA8PCBNSV9DT01fUkVHX0FERFJfU0hJRlQpICYKKwkJICAgICAgTUlfQ09NX1JFR19BRERSX01BU0spOworCWZyYW1lX3ZhbCB8PSAodmFsICYgTUlfQ09NX0RBVEFfTUFTSyk7CisJZnJhbWVfdmFsIHw9IChNSV9DT01fQ01EX1dSSVRFIHwgTUlfQ09NX1NUQVJUKTsKKwkKKwl0dzMyX2YoTUFDX01JX0NPTSwgZnJhbWVfdmFsKTsKKworCWxvb3BzID0gUEhZX0JVU1lfTE9PUFM7CisJd2hpbGUgKGxvb3BzICE9IDApIHsKKwkJdWRlbGF5KDEwKTsKKwkJZnJhbWVfdmFsID0gdHIzMihNQUNfTUlfQ09NKTsKKwkJaWYgKChmcmFtZV92YWwgJiBNSV9DT01fQlVTWSkgPT0gMCkgeworCQkJdWRlbGF5KDUpOworCQkJZnJhbWVfdmFsID0gdHIzMihNQUNfTUlfQ09NKTsKKwkJCWJyZWFrOworCQl9CisJCWxvb3BzIC09IDE7CisJfQorCisJcmV0ID0gLUVCVVNZOworCWlmIChsb29wcyAhPSAwKQorCQlyZXQgPSAwOworCisJaWYgKCh0cC0+bWlfbW9kZSAmIE1BQ19NSV9NT0RFX0FVVE9fUE9MTCkgIT0gMCkgeworCQl0dzMyX2YoTUFDX01JX01PREUsIHRwLT5taV9tb2RlKTsKKwkJdWRlbGF5KDgwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB0ZzNfcGh5X3NldF93aXJlc3BlZWQoc3RydWN0IHRnMyAqdHApCit7CisJdTMyIHZhbDsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX05PX0VUSF9XSVJFX1NQRUVEKQorCQlyZXR1cm47CisKKwlpZiAoIXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHg3MDA3KSAmJgorCSAgICAhdGczX3JlYWRwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsICZ2YWwpKQorCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsCisJCQkgICAgICh2YWwgfCAoMSA8PCAxNSkgfCAoMSA8PCA0KSkpOworfQorCitzdGF0aWMgaW50IHRnM19ibWNyX3Jlc2V0KHN0cnVjdCB0ZzMgKnRwKQoreworCXUzMiBwaHlfY29udHJvbDsKKwlpbnQgbGltaXQsIGVycjsKKworCS8qIE9LLCByZXNldCBpdCwgYW5kIHBvbGwgdGhlIEJNQ1JfUkVTRVQgYml0IHVudGlsIGl0CisJICogY2xlYXJzIG9yIHdlIHRpbWUgb3V0LgorCSAqLworCXBoeV9jb250cm9sID0gQk1DUl9SRVNFVDsKKwllcnIgPSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9CTUNSLCBwaHlfY29udHJvbCk7CisJaWYgKGVyciAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJbGltaXQgPSA1MDAwOworCXdoaWxlIChsaW1pdC0tKSB7CisJCWVyciA9IHRnM19yZWFkcGh5KHRwLCBNSUlfQk1DUiwgJnBoeV9jb250cm9sKTsKKwkJaWYgKGVyciAhPSAwKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlpZiAoKHBoeV9jb250cm9sICYgQk1DUl9SRVNFVCkgPT0gMCkgeworCQkJdWRlbGF5KDQwKTsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSgxMCk7CisJfQorCWlmIChsaW1pdCA8PSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGczX3dhaXRfbWFjcm9fZG9uZShzdHJ1Y3QgdGczICp0cCkKK3sKKwlpbnQgbGltaXQgPSAxMDA7CisKKwl3aGlsZSAobGltaXQtLSkgeworCQl1MzIgdG1wMzI7CisKKwkJaWYgKCF0ZzNfcmVhZHBoeSh0cCwgMHgxNiwgJnRtcDMyKSkgeworCQkJaWYgKCh0bXAzMiAmIDB4MTAwMCkgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpZiAobGltaXQgPD0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRnM19waHlfd3JpdGVfYW5kX2NoZWNrX3Rlc3RwYXQoc3RydWN0IHRnMyAqdHAsIGludCAqcmVzZXRwKQoreworCXN0YXRpYyBjb25zdCB1MzIgdGVzdF9wYXRbNF1bNl0gPSB7CisJeyAweDAwMDA1NTU1LCAweDAwMDAwMDA1LCAweDAwMDAyYWFhLCAweDAwMDAwMDBhLCAweDAwMDAzNDU2LCAweDAwMDAwMDAzIH0sCisJeyAweDAwMDAyYWFhLCAweDAwMDAwMDBhLCAweDAwMDAzMzMzLCAweDAwMDAwMDAzLCAweDAwMDA3ODlhLCAweDAwMDAwMDA1IH0sCisJeyAweDAwMDA1YTVhLCAweDAwMDAwMDA1LCAweDAwMDAyYTZhLCAweDAwMDAwMDBhLCAweDAwMDAxYmNkLCAweDAwMDAwMDAzIH0sCisJeyAweDAwMDAyYTVhLCAweDAwMDAwMDBhLCAweDAwMDAzM2MzLCAweDAwMDAwMDAzLCAweDAwMDAyZWYxLCAweDAwMDAwMDA1IH0KKwl9OworCWludCBjaGFuOworCisJZm9yIChjaGFuID0gMDsgY2hhbiA8IDQ7IGNoYW4rKykgeworCQlpbnQgaTsKKworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsCisJCQkgICAgIChjaGFuICogMHgyMDAwKSB8IDB4MDIwMCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwMDAyKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULAorCQkJCSAgICAgdGVzdF9wYXRbY2hhbl1baV0pOworCisJCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwMjAyKTsKKwkJaWYgKHRnM193YWl0X21hY3JvX2RvbmUodHApKSB7CisJCQkqcmVzZXRwID0gMTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsCisJCQkgICAgIChjaGFuICogMHgyMDAwKSB8IDB4MDIwMCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwMDgyKTsKKwkJaWYgKHRnM193YWl0X21hY3JvX2RvbmUodHApKSB7CisJCQkqcmVzZXRwID0gMTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MTYsIDB4MDgwMik7CisJCWlmICh0ZzNfd2FpdF9tYWNyb19kb25lKHRwKSkgeworCQkJKnJlc2V0cCA9IDE7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkgKz0gMikgeworCQkJdTMyIGxvdywgaGlnaDsKKworCQkJaWYgKHRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAmbG93KSB8fAorCQkJICAgIHRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAmaGlnaCkgfHwKKwkJCSAgICB0ZzNfd2FpdF9tYWNyb19kb25lKHRwKSkgeworCQkJCSpyZXNldHAgPSAxOworCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CisJCQlsb3cgJj0gMHg3ZmZmOworCQkJaGlnaCAmPSAweDAwMGY7CisJCQlpZiAobG93ICE9IHRlc3RfcGF0W2NoYW5dW2ldIHx8CisJCQkgICAgaGlnaCAhPSB0ZXN0X3BhdFtjaGFuXVtpKzFdKSB7CisJCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDAwMGIpOworCQkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHg0MDAxKTsKKwkJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4NDAwNSk7CisKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGczX3BoeV9yZXNldF9jaGFucGF0KHN0cnVjdCB0ZzMgKnRwKQoreworCWludCBjaGFuOworCisJZm9yIChjaGFuID0gMDsgY2hhbiA8IDQ7IGNoYW4rKykgeworCQlpbnQgaTsKKworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsCisJCQkgICAgIChjaGFuICogMHgyMDAwKSB8IDB4MDIwMCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHgwMDAyKTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHgwMDApOworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MTYsIDB4MDIwMik7CisJCWlmICh0ZzNfd2FpdF9tYWNyb19kb25lKHRwKSkKKwkJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGczX3BoeV9yZXNldF81NzAzXzRfNShzdHJ1Y3QgdGczICp0cCkKK3sKKwl1MzIgcmVnMzIsIHBoeTlfb3JpZzsKKwlpbnQgcmV0cmllcywgZG9fcGh5X3Jlc2V0LCBlcnI7CisKKwlyZXRyaWVzID0gMTA7CisJZG9fcGh5X3Jlc2V0ID0gMTsKKwlkbyB7CisJCWlmIChkb19waHlfcmVzZXQpIHsKKwkJCWVyciA9IHRnM19ibWNyX3Jlc2V0KHRwKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJCWRvX3BoeV9yZXNldCA9IDA7CisJCX0KKworCQkvKiBEaXNhYmxlIHRyYW5zbWl0dGVyIGFuZCBpbnRlcnJ1cHQuICAqLworCQlpZiAodGczX3JlYWRwaHkodHAsIE1JSV9URzNfRVhUX0NUUkwsICZyZWczMikpCisJCQljb250aW51ZTsKKworCQlyZWczMiB8PSAweDMwMDA7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19FWFRfQ1RSTCwgcmVnMzIpOworCisJCS8qIFNldCBmdWxsLWR1cGxleCwgMTAwMCBtYnBzLiAgKi8KKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQk1DUiwKKwkJCSAgICAgQk1DUl9GVUxMRFBMWCB8IFRHM19CTUNSX1NQRUVEMTAwMCk7CisKKwkJLyogU2V0IHRvIG1hc3RlciBtb2RlLiAgKi8KKwkJaWYgKHRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0NUUkwsICZwaHk5X29yaWcpKQorCQkJY29udGludWU7CisKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0NUUkwsCisJCQkgICAgIChNSUlfVEczX0NUUkxfQVNfTUFTVEVSIHwKKwkJCSAgICAgIE1JSV9URzNfQ1RSTF9FTkFCTEVfQVNfTUFTVEVSKSk7CisKKwkJLyogRW5hYmxlIFNNX0RTUF9DTE9DSyBhbmQgNmRCLiAgKi8KKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDBjMDApOworCisJCS8qIEJsb2NrIHRoZSBQSFkgY29udHJvbCBhY2Nlc3MuICAqLworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsIDB4ODAwNSk7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHgwODAwKTsKKworCQllcnIgPSB0ZzNfcGh5X3dyaXRlX2FuZF9jaGVja190ZXN0cGF0KHRwLCAmZG9fcGh5X3Jlc2V0KTsKKwkJaWYgKCFlcnIpCisJCQlicmVhazsKKwl9IHdoaWxlICgtLXJldHJpZXMpOworCisJZXJyID0gdGczX3BoeV9yZXNldF9jaGFucGF0KHRwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDgwMDUpOworCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHgwMDAwKTsKKworCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHg4MjAwKTsKKwl0ZzNfd3JpdGVwaHkodHAsIDB4MTYsIDB4MDAwMCk7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMgfHwKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQpIHsKKwkJLyogU2V0IEV4dGVuZGVkIHBhY2tldCBsZW5ndGggYml0IGZvciBqdW1ibyBmcmFtZXMgKi8KKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDQ0MDApOworCX0KKwllbHNlIHsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDA0MDApOworCX0KKworCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19DVFJMLCBwaHk5X29yaWcpOworCisJaWYgKCF0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19FWFRfQ1RSTCwgJnJlZzMyKSkgeworCQlyZWczMiAmPSB+MHgzMDAwOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRVhUX0NUUkwsIHJlZzMyKTsKKwl9IGVsc2UgaWYgKCFlcnIpCisJCWVyciA9IC1FQlVTWTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qIFRoaXMgd2lsbCByZXNldCB0aGUgdGlnb24zIFBIWSBpZiB0aGVyZSBpcyBubyB2YWxpZAorICogbGluayB1bmxlc3MgdGhlIEZPUkNFIGFyZ3VtZW50IGlzIG5vbi16ZXJvLgorICovCitzdGF0aWMgaW50IHRnM19waHlfcmVzZXQoc3RydWN0IHRnMyAqdHApCit7CisJdTMyIHBoeV9zdGF0dXM7CisJaW50IGVycjsKKworCWVyciAgPSB0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZwaHlfc3RhdHVzKTsKKwllcnIgfD0gdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmcGh5X3N0YXR1cyk7CisJaWYgKGVyciAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAzIHx8CisJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0IHx8CisJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KSB7CisJCWVyciA9IHRnM19waHlfcmVzZXRfNTcwM180XzUodHApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gdGczX2JtY3JfcmVzZXQodHApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKK291dDoKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfQURDX0JVRykgeworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIDB4MGMwMCk7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHgyMDFmKTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDJhYWEpOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsIDB4MDAwYSk7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHgwMzIzKTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDA0MDApOworCX0KKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfNTcwNF9BMF9CVUcpIHsKKwkJdGczX3dyaXRlcGh5KHRwLCAweDFjLCAweDhkNjgpOworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MWMsIDB4OGQ2OCk7CisJfQorCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9CRVJfQlVHKSB7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHgwYzAwKTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9BRERSRVNTLCAweDAwMGEpOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX1JXX1BPUlQsIDB4MzEwYik7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHgyMDFmKTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDk1MDYpOworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfRFNQX0FERFJFU1MsIDB4NDAxZik7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfUldfUE9SVCwgMHgxNGUyKTsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDA0MDApOworCX0KKwkvKiBTZXQgRXh0ZW5kZWQgcGFja2V0IGxlbmd0aCBiaXQgKGJpdCAxNCkgb24gYWxsIGNoaXBzIHRoYXQgKi8KKwkvKiBzdXBwb3J0IGp1bWJvIGZyYW1lcyAqLworCWlmICgodHAtPnBoeV9pZCAmIFBIWV9JRF9NQVNLKSA9PSBQSFlfSURfQkNNNTQwMSkgeworCQkvKiBDYW5ub3QgZG8gcmVhZC1tb2RpZnktd3JpdGUgb24gNTQwMSAqLworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIDB4NGMyMCk7CisJfSBlbHNlIGlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwNSAmJgorCQkgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTc1MCkgeworCQl1MzIgcGh5X3JlZzsKKworCQkvKiBTZXQgYml0IDE0IHdpdGggcmVhZC1tb2RpZnktd3JpdGUgdG8gcHJlc2VydmUgb3RoZXIgYml0cyAqLworCQlpZiAoIXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHgwMDA3KSAmJgorCQkgICAgIXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAmcGh5X3JlZykpCisJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIHBoeV9yZWcgfCAweDQwMDApOworCX0KKworCS8qIFNldCBwaHkgcmVnaXN0ZXIgMHgxMCBiaXQgMCB0byBoaWdoIGZpZm8gZWxhc3RpY2l0eSB0byBzdXBwb3J0CisJICoganVtYm8gZnJhbWVzIHRyYW5zbWlzc2lvbi4KKwkgKi8KKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDUgJiYKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3NTApIHsKKwkJdTMyIHBoeV9yZWc7CisKKwkJaWYgKCF0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19FWFRfQ1RSTCwgJnBoeV9yZWcpKQorCQkgICAgdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0VYVF9DVFJMLAorCQkJCSBwaHlfcmVnIHwgTUlJX1RHM19FWFRfQ1RSTF9GSUZPX0VMQVNUSUMpOworCX0KKworCXRnM19waHlfc2V0X3dpcmVzcGVlZCh0cCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRnM19mcm9iX2F1eF9wb3dlcihzdHJ1Y3QgdGczICp0cCkKK3sKKwlzdHJ1Y3QgdGczICp0cF9wZWVyID0gdHA7CisKKwlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19FRVBST01fV1JJVEVfUFJPVCkgIT0gMCkKKwkJcmV0dXJuOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0KSB7CisJCXRwX3BlZXIgPSBwY2lfZ2V0X2RydmRhdGEodHAtPnBkZXZfcGVlcik7CisJCWlmICghdHBfcGVlcikKKwkJCUJVRygpOworCX0KKworCisJaWYgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfV09MX0VOQUJMRSkgIT0gMCB8fAorCSAgICAodHBfcGVlci0+dGczX2ZsYWdzICYgVEczX0ZMQUdfV09MX0VOQUJMRSkgIT0gMCkgeworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDAgfHwKKwkJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAxKSB7CisJCQl0dzMyX2YoR1JDX0xPQ0FMX0NUUkwsIHRwLT5ncmNfbG9jYWxfY3RybCB8CisJCQkgICAgIChHUkNfTENMQ1RSTF9HUElPX09FMCB8CisJCQkgICAgICBHUkNfTENMQ1RSTF9HUElPX09FMSB8CisJCQkgICAgICBHUkNfTENMQ1RSTF9HUElPX09FMiB8CisJCQkgICAgICBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDAgfAorCQkJICAgICAgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQxKSk7CisJCQl1ZGVsYXkoMTAwKTsKKwkJfSBlbHNlIHsKKwkJCXUzMiBub19ncGlvMjsKKwkJCXUzMiBncmNfbG9jYWxfY3RybDsKKworCQkJaWYgKHRwX3BlZXIgIT0gdHAgJiYKKwkJCSAgICAodHBfcGVlci0+dGczX2ZsYWdzICYgVEczX0ZMQUdfSU5JVF9DT01QTEVURSkgIT0gMCkKKwkJCQlyZXR1cm47CisKKwkJCS8qIE9uIDU3NTMgYW5kIHZhcmlhbnRzLCBHUElPMiBjYW5ub3QgYmUgdXNlZC4gKi8KKwkJCW5vX2dwaW8yID0gdHAtPm5pY19zcmFtX2RhdGFfY2ZnICYKKwkJCQkgICAgTklDX1NSQU1fREFUQV9DRkdfTk9fR1BJTzI7CisKKwkJCWdyY19sb2NhbF9jdHJsID0gR1JDX0xDTENUUkxfR1BJT19PRTAgfAorCQkJCQkgR1JDX0xDTENUUkxfR1BJT19PRTEgfAorCQkJCQkgR1JDX0xDTENUUkxfR1BJT19PRTIgfAorCQkJCQkgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQxIHwKKwkJCQkJIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMjsKKwkJCWlmIChub19ncGlvMikgeworCQkJCWdyY19sb2NhbF9jdHJsICY9IH4oR1JDX0xDTENUUkxfR1BJT19PRTIgfAorCQkJCQkJICAgIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMik7CisJCQl9CisJCQl0dzMyX2YoR1JDX0xPQ0FMX0NUUkwsIHRwLT5ncmNfbG9jYWxfY3RybCB8CisJCQkJCQlncmNfbG9jYWxfY3RybCk7CisJCQl1ZGVsYXkoMTAwKTsKKworCQkJZ3JjX2xvY2FsX2N0cmwgfD0gR1JDX0xDTENUUkxfR1BJT19PVVRQVVQwOworCisJCQl0dzMyX2YoR1JDX0xPQ0FMX0NUUkwsIHRwLT5ncmNfbG9jYWxfY3RybCB8CisJCQkJCQlncmNfbG9jYWxfY3RybCk7CisJCQl1ZGVsYXkoMTAwKTsKKworCQkJaWYgKCFub19ncGlvMikgeworCQkJCWdyY19sb2NhbF9jdHJsICY9IH5HUkNfTENMQ1RSTF9HUElPX09VVFBVVDI7CisJCQkJdHczMl9mKEdSQ19MT0NBTF9DVFJMLCB0cC0+Z3JjX2xvY2FsX2N0cmwgfAorCQkJCSAgICAgICBncmNfbG9jYWxfY3RybCk7CisJCQkJdWRlbGF5KDEwMCk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDAgJiYKKwkJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzAxKSB7CisJCQlpZiAodHBfcGVlciAhPSB0cCAmJgorCQkJICAgICh0cF9wZWVyLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19JTklUX0NPTVBMRVRFKSAhPSAwKQorCQkJCXJldHVybjsKKworCQkJdHczMl9mKEdSQ19MT0NBTF9DVFJMLCB0cC0+Z3JjX2xvY2FsX2N0cmwgfAorCQkJICAgICAoR1JDX0xDTENUUkxfR1BJT19PRTEgfAorCQkJICAgICAgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQxKSk7CisJCQl1ZGVsYXkoMTAwKTsKKworCQkJdHczMl9mKEdSQ19MT0NBTF9DVFJMLCB0cC0+Z3JjX2xvY2FsX2N0cmwgfAorCQkJICAgICAoR1JDX0xDTENUUkxfR1BJT19PRTEpKTsKKwkJCXVkZWxheSgxMDApOworCisJCQl0dzMyX2YoR1JDX0xPQ0FMX0NUUkwsIHRwLT5ncmNfbG9jYWxfY3RybCB8CisJCQkgICAgIChHUkNfTENMQ1RSTF9HUElPX09FMSB8CisJCQkgICAgICBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDEpKTsKKwkJCXVkZWxheSgxMDApOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHRnM19zZXR1cF9waHkoc3RydWN0IHRnMyAqLCBpbnQpOworCisjZGVmaW5lIFJFU0VUX0tJTkRfU0hVVERPV04JMAorI2RlZmluZSBSRVNFVF9LSU5EX0lOSVQJCTEKKyNkZWZpbmUgUkVTRVRfS0lORF9TVVNQRU5ECTIKKworc3RhdGljIHZvaWQgdGczX3dyaXRlX3NpZ19wb3N0X3Jlc2V0KHN0cnVjdCB0ZzMgKiwgaW50KTsKK3N0YXRpYyBpbnQgdGczX2hhbHRfY3B1KHN0cnVjdCB0ZzMgKiwgdTMyKTsKKworc3RhdGljIGludCB0ZzNfc2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCB0ZzMgKnRwLCBpbnQgc3RhdGUpCit7CisJdTMyIG1pc2NfaG9zdF9jdHJsOworCXUxNiBwb3dlcl9jb250cm9sLCBwb3dlcl9jYXBzOworCWludCBwbSA9IHRwLT5wbV9jYXA7CisKKwkvKiBNYWtlIHN1cmUgcmVnaXN0ZXIgYWNjZXNzZXMgKGluZGlyZWN0IG9yIG90aGVyd2lzZSkKKwkgKiB3aWxsIGZ1bmN0aW9uIGNvcnJlY3RseS4KKwkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LAorCQkJICAgICAgIFRHM1BDSV9NSVNDX0hPU1RfQ1RSTCwKKwkJCSAgICAgICB0cC0+bWlzY19ob3N0X2N0cmwpOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQodHAtPnBkZXYsCisJCQkgICAgIHBtICsgUENJX1BNX0NUUkwsCisJCQkgICAgICZwb3dlcl9jb250cm9sKTsKKwlwb3dlcl9jb250cm9sIHw9IFBDSV9QTV9DVFJMX1BNRV9TVEFUVVM7CisJcG93ZXJfY29udHJvbCAmPSB+KFBDSV9QTV9DVFJMX1NUQVRFX01BU0spOworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIDA6CisJCXBvd2VyX2NvbnRyb2wgfD0gMDsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHRwLT5wZGV2LAorCQkJCSAgICAgIHBtICsgUENJX1BNX0NUUkwsCisJCQkJICAgICAgcG93ZXJfY29udHJvbCk7CisJCXR3MzJfZihHUkNfTE9DQUxfQ1RSTCwgdHAtPmdyY19sb2NhbF9jdHJsKTsKKwkJdWRlbGF5KDEwMCk7CisKKwkJcmV0dXJuIDA7CisKKwljYXNlIDE6CisJCXBvd2VyX2NvbnRyb2wgfD0gMTsKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCXBvd2VyX2NvbnRyb2wgfD0gMjsKKwkJYnJlYWs7CisKKwljYXNlIDM6CisJCXBvd2VyX2NvbnRyb2wgfD0gMzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiJXM6IEludmFsaWQgcG93ZXIgc3RhdGUgKCVkKSAiCisJCSAgICAgICAicmVxdWVzdGVkLlxuIiwKKwkJICAgICAgIHRwLT5kZXYtPm5hbWUsIHN0YXRlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfTsKKworCXBvd2VyX2NvbnRyb2wgfD0gUENJX1BNX0NUUkxfUE1FX0VOQUJMRTsKKworCW1pc2NfaG9zdF9jdHJsID0gdHIzMihURzNQQ0lfTUlTQ19IT1NUX0NUUkwpOworCXR3MzIoVEczUENJX01JU0NfSE9TVF9DVFJMLAorCSAgICAgbWlzY19ob3N0X2N0cmwgfCBNSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQpOworCisJaWYgKHRwLT5saW5rX2NvbmZpZy5waHlfaXNfbG93X3Bvd2VyID09IDApIHsKKwkJdHAtPmxpbmtfY29uZmlnLnBoeV9pc19sb3dfcG93ZXIgPSAxOworCQl0cC0+bGlua19jb25maWcub3JpZ19zcGVlZCA9IHRwLT5saW5rX2NvbmZpZy5zcGVlZDsKKwkJdHAtPmxpbmtfY29uZmlnLm9yaWdfZHVwbGV4ID0gdHAtPmxpbmtfY29uZmlnLmR1cGxleDsKKwkJdHAtPmxpbmtfY29uZmlnLm9yaWdfYXV0b25lZyA9IHRwLT5saW5rX2NvbmZpZy5hdXRvbmVnOworCX0KKworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykpIHsKKwkJdHAtPmxpbmtfY29uZmlnLnNwZWVkID0gU1BFRURfMTA7CisJCXRwLT5saW5rX2NvbmZpZy5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwkJdHAtPmxpbmtfY29uZmlnLmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKKwkJdGczX3NldHVwX3BoeSh0cCwgMCk7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX3dvcmQodHAtPnBkZXYsIHBtICsgUENJX1BNX1BNQywgJnBvd2VyX2NhcHMpOworCisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19XT0xfRU5BQkxFKSB7CisJCXUzMiBtYWNfbW9kZTsKKworCQlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMpKSB7CisJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsIDB4NWEpOworCQkJdWRlbGF5KDQwKTsKKworCQkJbWFjX21vZGUgPSBNQUNfTU9ERV9QT1JUX01PREVfTUlJOworCisJCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDAgfHwKKwkJCSAgICAhKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19XT0xfU1BFRURfMTAwTUIpKQorCQkJCW1hY19tb2RlIHw9IE1BQ19NT0RFX0xJTktfUE9MQVJJVFk7CisJCX0gZWxzZSB7CisJCQltYWNfbW9kZSA9IE1BQ19NT0RFX1BPUlRfTU9ERV9UQkk7CisJCX0KKworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3NTApCisJCQl0dzMyKE1BQ19MRURfQ1RSTCwgdHAtPmxlZF9jdHJsKTsKKworCQlpZiAoKChwb3dlcl9jYXBzICYgUENJX1BNX0NBUF9QTUVfRDNjb2xkKSAmJgorCQkgICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfV09MX0VOQUJMRSkpKQorCQkJbWFjX21vZGUgfD0gTUFDX01PREVfTUFHSUNfUEtUX0VOQUJMRTsKKworCQl0dzMyX2YoTUFDX01PREUsIG1hY19tb2RlKTsKKwkJdWRlbGF5KDEwMCk7CisKKwkJdHczMl9mKE1BQ19SWF9NT0RFLCBSWF9NT0RFX0VOQUJMRSk7CisJCXVkZWxheSgxMCk7CisJfQorCisJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1dPTF9TUEVFRF8xMDBNQikgJiYKKwkgICAgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAwIHx8CisJICAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMSkpIHsKKwkJdTMyIGJhc2VfdmFsOworCisJCWJhc2VfdmFsID0gdHAtPnBjaV9jbG9ja19jdHJsOworCQliYXNlX3ZhbCB8PSAoQ0xPQ0tfQ1RSTF9SWENMS19ESVNBQkxFIHwKKwkJCSAgICAgQ0xPQ0tfQ1RSTF9UWENMS19ESVNBQkxFKTsKKworCQl0dzMyX2YoVEczUENJX0NMT0NLX0NUUkwsIGJhc2VfdmFsIHwKKwkJICAgICBDTE9DS19DVFJMX0FMVENMSyB8CisJCSAgICAgQ0xPQ0tfQ1RSTF9QV1JET1dOX1BMTDEzMyk7CisJCXVkZWxheSg0MCk7CisJfSBlbHNlIGlmICghKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gNTc1MCkgJiYKKwkJICAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VOQUJMRV9BU0YpKSkgeworCQl1MzIgbmV3Yml0czEsIG5ld2JpdHMyOworCisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCB8fAorCQkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDEpIHsKKwkJCW5ld2JpdHMxID0gKENMT0NLX0NUUkxfUlhDTEtfRElTQUJMRSB8CisJCQkJICAgIENMT0NLX0NUUkxfVFhDTEtfRElTQUJMRSB8CisJCQkJICAgIENMT0NLX0NUUkxfQUxUQ0xLKTsKKwkJCW5ld2JpdHMyID0gbmV3Yml0czEgfCBDTE9DS19DVFJMXzQ0TUhaX0NPUkU7CisJCX0gZWxzZSBpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpIHsKKwkJCW5ld2JpdHMxID0gQ0xPQ0tfQ1RSTF82MjVfQ09SRTsKKwkJCW5ld2JpdHMyID0gbmV3Yml0czEgfCBDTE9DS19DVFJMX0FMVENMSzsKKwkJfSBlbHNlIHsKKwkJCW5ld2JpdHMxID0gQ0xPQ0tfQ1RSTF9BTFRDTEs7CisJCQluZXdiaXRzMiA9IG5ld2JpdHMxIHwgQ0xPQ0tfQ1RSTF80NE1IWl9DT1JFOworCQl9CisKKwkJdHczMl9mKFRHM1BDSV9DTE9DS19DVFJMLCB0cC0+cGNpX2Nsb2NrX2N0cmwgfCBuZXdiaXRzMSk7CisJCXVkZWxheSg0MCk7CisKKwkJdHczMl9mKFRHM1BDSV9DTE9DS19DVFJMLCB0cC0+cGNpX2Nsb2NrX2N0cmwgfCBuZXdiaXRzMik7CisJCXVkZWxheSg0MCk7CisKKwkJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpKSB7CisJCQl1MzIgbmV3Yml0czM7CisKKwkJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCB8fAorCQkJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAxKSB7CisJCQkJbmV3Yml0czMgPSAoQ0xPQ0tfQ1RSTF9SWENMS19ESVNBQkxFIHwKKwkJCQkJICAgIENMT0NLX0NUUkxfVFhDTEtfRElTQUJMRSB8CisJCQkJCSAgICBDTE9DS19DVFJMXzQ0TUhaX0NPUkUpOworCQkJfSBlbHNlIHsKKwkJCQluZXdiaXRzMyA9IENMT0NLX0NUUkxfNDRNSFpfQ09SRTsKKwkJCX0KKworCQkJdHczMl9mKFRHM1BDSV9DTE9DS19DVFJMLAorCQkJCQkgdHAtPnBjaV9jbG9ja19jdHJsIHwgbmV3Yml0czMpOworCQkJdWRlbGF5KDQwKTsKKwkJfQorCX0KKworCXRnM19mcm9iX2F1eF9wb3dlcih0cCk7CisKKwkvKiBXb3JrYXJvdW5kIGZvciB1bnN0YWJsZSBQTEwgY2xvY2sgKi8KKwlpZiAoKEdFVF9DSElQX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBDSElQUkVWXzU3NTBfQVgpIHx8CisJICAgIChHRVRfQ0hJUF9SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQ0hJUFJFVl81NzUwX0JYKSkgeworCQl1MzIgdmFsID0gdHIzMigweDdkMDApOworCisJCXZhbCAmPSB+KCgxIDw8IDE2KSB8ICgxIDw8IDQpIHwgKDEgPDwgMikgfCAoMSA8PCAxKSB8IDEpOworCQl0dzMyKDB4N2QwMCwgdmFsKTsKKwkJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VOQUJMRV9BU0YpKQorCQkJdGczX2hhbHRfY3B1KHRwLCBSWF9DUFVfQkFTRSk7CisJfQorCisJLyogRmluYWxseSwgc2V0IHRoZSBuZXcgcG93ZXIgc3RhdGUuICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHRwLT5wZGV2LCBwbSArIFBDSV9QTV9DVFJMLCBwb3dlcl9jb250cm9sKTsKKworCXRnM193cml0ZV9zaWdfcG9zdF9yZXNldCh0cCwgUkVTRVRfS0lORF9TSFVURE9XTik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGczX2xpbmtfcmVwb3J0KHN0cnVjdCB0ZzMgKnRwKQoreworCWlmICghbmV0aWZfY2Fycmllcl9vayh0cC0+ZGV2KSkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6IExpbmsgaXMgZG93bi5cbiIsIHRwLT5kZXYtPm5hbWUpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICIlczogTGluayBpcyB1cCBhdCAlZCBNYnBzLCAlcyBkdXBsZXguXG4iLAorCQkgICAgICAgdHAtPmRldi0+bmFtZSwKKwkJICAgICAgICh0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID09IFNQRUVEXzEwMDAgPworCQkJMTAwMCA6CisJCQkodHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCA9PSBTUEVFRF8xMDAgPworCQkJIDEwMCA6IDEwKSksCisJCSAgICAgICAodHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPT0gRFVQTEVYX0ZVTEwgPworCQkJImZ1bGwiIDogImhhbGYiKSk7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBGbG93IGNvbnRyb2wgaXMgJXMgZm9yIFRYIGFuZCAiCisJCSAgICAgICAiJXMgZm9yIFJYLlxuIiwKKwkJICAgICAgIHRwLT5kZXYtPm5hbWUsCisJCSAgICAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1RYX1BBVVNFKSA/ICJvbiIgOiAib2ZmIiwKKwkJICAgICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUlhfUEFVU0UpID8gIm9uIiA6ICJvZmYiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRnM19zZXR1cF9mbG93X2NvbnRyb2woc3RydWN0IHRnMyAqdHAsIHUzMiBsb2NhbF9hZHYsIHUzMiByZW1vdGVfYWR2KQoreworCXUzMiBuZXdfdGczX2ZsYWdzID0gMDsKKwl1MzIgb2xkX3J4X21vZGUgPSB0cC0+cnhfbW9kZTsKKwl1MzIgb2xkX3R4X21vZGUgPSB0cC0+dHhfbW9kZTsKKworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUEFVU0VfQVVUT05FRykgeworCQlpZiAobG9jYWxfYWR2ICYgQURWRVJUSVNFX1BBVVNFX0NBUCkgeworCQkJaWYgKGxvY2FsX2FkdiAmIEFEVkVSVElTRV9QQVVTRV9BU1lNKSB7CisJCQkJaWYgKHJlbW90ZV9hZHYgJiBMUEFfUEFVU0VfQ0FQKQorCQkJCQluZXdfdGczX2ZsYWdzIHw9CisJCQkJCQkoVEczX0ZMQUdfUlhfUEFVU0UgfAorCQkJCQkgCVRHM19GTEFHX1RYX1BBVVNFKTsKKwkJCQllbHNlIGlmIChyZW1vdGVfYWR2ICYgTFBBX1BBVVNFX0FTWU0pCisJCQkJCW5ld190ZzNfZmxhZ3MgfD0KKwkJCQkJCShURzNfRkxBR19SWF9QQVVTRSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChyZW1vdGVfYWR2ICYgTFBBX1BBVVNFX0NBUCkKKwkJCQkJbmV3X3RnM19mbGFncyB8PQorCQkJCQkJKFRHM19GTEFHX1JYX1BBVVNFIHwKKwkJCQkJIAlURzNfRkxBR19UWF9QQVVTRSk7CisJCQl9CisJCX0gZWxzZSBpZiAobG9jYWxfYWR2ICYgQURWRVJUSVNFX1BBVVNFX0FTWU0pIHsKKwkJCWlmICgocmVtb3RlX2FkdiAmIExQQV9QQVVTRV9DQVApICYmCisJCSAgICAJKHJlbW90ZV9hZHYgJiBMUEFfUEFVU0VfQVNZTSkpCisJCQkJbmV3X3RnM19mbGFncyB8PSBURzNfRkxBR19UWF9QQVVTRTsKKwkJfQorCisJCXRwLT50ZzNfZmxhZ3MgJj0gfihURzNfRkxBR19SWF9QQVVTRSB8IFRHM19GTEFHX1RYX1BBVVNFKTsKKwkJdHAtPnRnM19mbGFncyB8PSBuZXdfdGczX2ZsYWdzOworCX0gZWxzZSB7CisJCW5ld190ZzNfZmxhZ3MgPSB0cC0+dGczX2ZsYWdzOworCX0KKworCWlmIChuZXdfdGczX2ZsYWdzICYgVEczX0ZMQUdfUlhfUEFVU0UpCisJCXRwLT5yeF9tb2RlIHw9IFJYX01PREVfRkxPV19DVFJMX0VOQUJMRTsKKwllbHNlCisJCXRwLT5yeF9tb2RlICY9IH5SWF9NT0RFX0ZMT1dfQ1RSTF9FTkFCTEU7CisKKwlpZiAob2xkX3J4X21vZGUgIT0gdHAtPnJ4X21vZGUpIHsKKwkJdHczMl9mKE1BQ19SWF9NT0RFLCB0cC0+cnhfbW9kZSk7CisJfQorCQorCWlmIChuZXdfdGczX2ZsYWdzICYgVEczX0ZMQUdfVFhfUEFVU0UpCisJCXRwLT50eF9tb2RlIHw9IFRYX01PREVfRkxPV19DVFJMX0VOQUJMRTsKKwllbHNlCisJCXRwLT50eF9tb2RlICY9IH5UWF9NT0RFX0ZMT1dfQ1RSTF9FTkFCTEU7CisKKwlpZiAob2xkX3R4X21vZGUgIT0gdHAtPnR4X21vZGUpIHsKKwkJdHczMl9mKE1BQ19UWF9NT0RFLCB0cC0+dHhfbW9kZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB0ZzNfYXV4X3N0YXRfdG9fc3BlZWRfZHVwbGV4KHN0cnVjdCB0ZzMgKnRwLCB1MzIgdmFsLCB1MTYgKnNwZWVkLCB1OCAqZHVwbGV4KQoreworCXN3aXRjaCAodmFsICYgTUlJX1RHM19BVVhfU1RBVF9TUERNQVNLKSB7CisJY2FzZSBNSUlfVEczX0FVWF9TVEFUXzEwSEFMRjoKKwkJKnNwZWVkID0gU1BFRURfMTA7CisJCSpkdXBsZXggPSBEVVBMRVhfSEFMRjsKKwkJYnJlYWs7CisKKwljYXNlIE1JSV9URzNfQVVYX1NUQVRfMTBGVUxMOgorCQkqc3BlZWQgPSBTUEVFRF8xMDsKKwkJKmR1cGxleCA9IERVUExFWF9GVUxMOworCQlicmVhazsKKworCWNhc2UgTUlJX1RHM19BVVhfU1RBVF8xMDBIQUxGOgorCQkqc3BlZWQgPSBTUEVFRF8xMDA7CisJCSpkdXBsZXggPSBEVVBMRVhfSEFMRjsKKwkJYnJlYWs7CisKKwljYXNlIE1JSV9URzNfQVVYX1NUQVRfMTAwRlVMTDoKKwkJKnNwZWVkID0gU1BFRURfMTAwOworCQkqZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCWJyZWFrOworCisJY2FzZSBNSUlfVEczX0FVWF9TVEFUXzEwMDBIQUxGOgorCQkqc3BlZWQgPSBTUEVFRF8xMDAwOworCQkqZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJCWJyZWFrOworCisJY2FzZSBNSUlfVEczX0FVWF9TVEFUXzEwMDBGVUxMOgorCQkqc3BlZWQgPSBTUEVFRF8xMDAwOworCQkqZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJKnNwZWVkID0gU1BFRURfSU5WQUxJRDsKKwkJKmR1cGxleCA9IERVUExFWF9JTlZBTElEOworCQlicmVhazsKKwl9OworfQorCitzdGF0aWMgdm9pZCB0ZzNfcGh5X2NvcHBlcl9iZWdpbihzdHJ1Y3QgdGczICp0cCkKK3sKKwl1MzIgbmV3X2FkdjsKKwlpbnQgaTsKKworCWlmICh0cC0+bGlua19jb25maWcucGh5X2lzX2xvd19wb3dlcikgeworCQkvKiBFbnRlcmluZyBsb3cgcG93ZXIgbW9kZS4gIERpc2FibGUgZ2lnYWJpdCBhbmQKKwkJICogMTAwYmFzZVQgYWR2ZXJ0aXNlbWVudHMuCisJCSAqLworCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQ1RSTCwgMCk7CisKKwkJbmV3X2FkdiA9IChBRFZFUlRJU0VfMTBIQUxGIHwgQURWRVJUSVNFXzEwRlVMTCB8CisJCQkgICBBRFZFUlRJU0VfQ1NNQSB8IEFEVkVSVElTRV9QQVVTRV9DQVApOworCQlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1dPTF9TUEVFRF8xMDBNQikKKwkJCW5ld19hZHYgfD0gKEFEVkVSVElTRV8xMDBIQUxGIHwgQURWRVJUSVNFXzEwMEZVTEwpOworCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX0FEVkVSVElTRSwgbmV3X2Fkdik7CisJfSBlbHNlIGlmICh0cC0+bGlua19jb25maWcuc3BlZWQgPT0gU1BFRURfSU5WQUxJRCkgeworCQl0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgPQorCQkJKEFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfAorCQkJIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCB8CisJCQkgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwgfAorCQkJIEFEVkVSVElTRURfQXV0b25lZyB8IEFEVkVSVElTRURfTUlJKTsKKworCQlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHXzEwXzEwMF9PTkxZKQorCQkJdHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICY9CisJCQkJfihBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwKKwkJCQkgIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpOworCisJCW5ld19hZHYgPSAoQURWRVJUSVNFX0NTTUEgfCBBRFZFUlRJU0VfUEFVU0VfQ0FQKTsKKwkJaWYgKHRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmKQorCQkJbmV3X2FkdiB8PSBBRFZFUlRJU0VfMTBIQUxGOworCQlpZiAodHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwpCisJCQluZXdfYWR2IHw9IEFEVkVSVElTRV8xMEZVTEw7CisJCWlmICh0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYpCisJCQluZXdfYWR2IHw9IEFEVkVSVElTRV8xMDBIQUxGOworCQlpZiAodHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsKQorCQkJbmV3X2FkdiB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQURWRVJUSVNFLCBuZXdfYWR2KTsKKworCQlpZiAodHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICYKKwkJICAgIChBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkpIHsKKwkJCW5ld19hZHYgPSAwOworCQkJaWYgKHRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYpCisJCQkJbmV3X2FkdiB8PSBNSUlfVEczX0NUUkxfQURWXzEwMDBfSEFMRjsKKwkJCWlmICh0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKQorCQkJCW5ld19hZHYgfD0gTUlJX1RHM19DVFJMX0FEVl8xMDAwX0ZVTEw7CisJCQlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpICYmCisJCQkgICAgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0EwIHx8CisJCQkgICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0IwKSkKKwkJCQluZXdfYWR2IHw9IChNSUlfVEczX0NUUkxfQVNfTUFTVEVSIHwKKwkJCQkJICAgIE1JSV9URzNfQ1RSTF9FTkFCTEVfQVNfTUFTVEVSKTsKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19DVFJMLCBuZXdfYWR2KTsKKwkJfSBlbHNlIHsKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19DVFJMLCAwKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEFza2luZyBmb3IgYSBzcGVjaWZpYyBsaW5rIG1vZGUuICovCisJCWlmICh0cC0+bGlua19jb25maWcuc3BlZWQgPT0gU1BFRURfMTAwMCkgeworCQkJbmV3X2FkdiA9IEFEVkVSVElTRV9DU01BIHwgQURWRVJUSVNFX1BBVVNFX0NBUDsKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX0FEVkVSVElTRSwgbmV3X2Fkdik7CisKKwkJCWlmICh0cC0+bGlua19jb25maWcuZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJCW5ld19hZHYgPSBNSUlfVEczX0NUUkxfQURWXzEwMDBfRlVMTDsKKwkJCWVsc2UKKwkJCQluZXdfYWR2ID0gTUlJX1RHM19DVFJMX0FEVl8xMDAwX0hBTEY7CisJCQlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDFfQTAgfHwKKwkJCSAgICB0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9CMCkKKwkJCQluZXdfYWR2IHw9IChNSUlfVEczX0NUUkxfQVNfTUFTVEVSIHwKKwkJCQkJICAgIE1JSV9URzNfQ1RSTF9FTkFCTEVfQVNfTUFTVEVSKTsKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19DVFJMLCBuZXdfYWR2KTsKKwkJfSBlbHNlIHsKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19DVFJMLCAwKTsKKworCQkJbmV3X2FkdiA9IEFEVkVSVElTRV9DU01BIHwgQURWRVJUSVNFX1BBVVNFX0NBUDsKKwkJCWlmICh0cC0+bGlua19jb25maWcuc3BlZWQgPT0gU1BFRURfMTAwKSB7CisJCQkJaWYgKHRwLT5saW5rX2NvbmZpZy5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQkJCW5ld19hZHYgfD0gQURWRVJUSVNFXzEwMEZVTEw7CisJCQkJZWxzZQorCQkJCQluZXdfYWR2IHw9IEFEVkVSVElTRV8xMDBIQUxGOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodHAtPmxpbmtfY29uZmlnLmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCQkJbmV3X2FkdiB8PSBBRFZFUlRJU0VfMTBGVUxMOworCQkJCWVsc2UKKwkJCQkJbmV3X2FkdiB8PSBBRFZFUlRJU0VfMTBIQUxGOworCQkJfQorCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQURWRVJUSVNFLCBuZXdfYWR2KTsKKwkJfQorCX0KKworCWlmICh0cC0+bGlua19jb25maWcuYXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUgJiYKKwkgICAgdHAtPmxpbmtfY29uZmlnLnNwZWVkICE9IFNQRUVEX0lOVkFMSUQpIHsKKwkJdTMyIGJtY3IsIG9yaWdfYm1jcjsKKworCQl0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID0gdHAtPmxpbmtfY29uZmlnLnNwZWVkOworCQl0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleCA9IHRwLT5saW5rX2NvbmZpZy5kdXBsZXg7CisKKwkJYm1jciA9IDA7CisJCXN3aXRjaCAodHAtPmxpbmtfY29uZmlnLnNwZWVkKSB7CisJCWRlZmF1bHQ6CisJCWNhc2UgU1BFRURfMTA6CisJCQlicmVhazsKKworCQljYXNlIFNQRUVEXzEwMDoKKwkJCWJtY3IgfD0gQk1DUl9TUEVFRDEwMDsKKwkJCWJyZWFrOworCisJCWNhc2UgU1BFRURfMTAwMDoKKwkJCWJtY3IgfD0gVEczX0JNQ1JfU1BFRUQxMDAwOworCQkJYnJlYWs7CisJCX07CisKKwkJaWYgKHRwLT5saW5rX2NvbmZpZy5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQlibWNyIHw9IEJNQ1JfRlVMTERQTFg7CisKKwkJaWYgKCF0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNQ1IsICZvcmlnX2JtY3IpICYmCisJCSAgICAoYm1jciAhPSBvcmlnX2JtY3IpKSB7CisJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9CTUNSLCBCTUNSX0xPT1BCQUNLKTsKKwkJCWZvciAoaSA9IDA7IGkgPCAxNTAwOyBpKyspIHsKKwkJCQl1MzIgdG1wOworCisJCQkJdWRlbGF5KDEwKTsKKwkJCQlpZiAodGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmdG1wKSB8fAorCQkJCSAgICB0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZ0bXApKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoISh0bXAgJiBCTVNSX0xTVEFUVVMpKSB7CisJCQkJCXVkZWxheSg0MCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX0JNQ1IsIGJtY3IpOworCQkJdWRlbGF5KDQwKTsKKwkJfQorCX0gZWxzZSB7CisJCXRnM193cml0ZXBoeSh0cCwgTUlJX0JNQ1IsCisJCQkgICAgIEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVCk7CisJfQorfQorCitzdGF0aWMgaW50IHRnM19pbml0XzU0MDFwaHlfZHNwKHN0cnVjdCB0ZzMgKnRwKQoreworCWludCBlcnI7CisKKwkvKiBUdXJuIG9mZiB0YXAgcG93ZXIgbWFuYWdlbWVudC4gKi8KKwkvKiBTZXQgRXh0ZW5kZWQgcGFja2V0IGxlbmd0aCBiaXQgKi8KKwllcnIgID0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDRjMjApOworCisJZXJyIHw9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHgwMDEyKTsKKwllcnIgfD0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDE4MDQpOworCisJZXJyIHw9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHgwMDEzKTsKKwllcnIgfD0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDEyMDQpOworCisJZXJyIHw9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHg4MDA2KTsKKwllcnIgfD0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDAxMzIpOworCisJZXJyIHw9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHg4MDA2KTsKKwllcnIgfD0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDAyMzIpOworCisJZXJyIHw9IHRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19EU1BfQUREUkVTUywgMHgyMDFmKTsKKwllcnIgfD0gdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0RTUF9SV19QT1JULCAweDBhMjApOworCisJdWRlbGF5KDQwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdGczX2NvcHBlcl9pc19hZHZlcnRpc2luZ19hbGwoc3RydWN0IHRnMyAqdHApCit7CisJdTMyIGFkdl9yZWcsIGFsbF9tYXNrOworCisJaWYgKHRnM19yZWFkcGh5KHRwLCBNSUlfQURWRVJUSVNFLCAmYWR2X3JlZykpCisJCXJldHVybiAwOworCisJYWxsX21hc2sgPSAoQURWRVJUSVNFXzEwSEFMRiB8IEFEVkVSVElTRV8xMEZVTEwgfAorCQkgICAgQURWRVJUSVNFXzEwMEhBTEYgfCBBRFZFUlRJU0VfMTAwRlVMTCk7CisJaWYgKChhZHZfcmVnICYgYWxsX21hc2spICE9IGFsbF9tYXNrKQorCQlyZXR1cm4gMDsKKwlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpKSB7CisJCXUzMiB0ZzNfY3RybDsKKworCQlpZiAodGczX3JlYWRwaHkodHAsIE1JSV9URzNfQ1RSTCwgJnRnM19jdHJsKSkKKwkJCXJldHVybiAwOworCisJCWFsbF9tYXNrID0gKE1JSV9URzNfQ1RSTF9BRFZfMTAwMF9IQUxGIHwKKwkJCSAgICBNSUlfVEczX0NUUkxfQURWXzEwMDBfRlVMTCk7CisJCWlmICgodGczX2N0cmwgJiBhbGxfbWFzaykgIT0gYWxsX21hc2spCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdGczX3NldHVwX2NvcHBlcl9waHkoc3RydWN0IHRnMyAqdHAsIGludCBmb3JjZV9yZXNldCkKK3sKKwlpbnQgY3VycmVudF9saW5rX3VwOworCXUzMiBibXNyLCBkdW1teTsKKwl1MTYgY3VycmVudF9zcGVlZDsKKwl1OCBjdXJyZW50X2R1cGxleDsKKwlpbnQgaSwgZXJyOworCisJdHczMihNQUNfRVZFTlQsIDApOworCisJdHczMl9mKE1BQ19TVEFUVVMsCisJICAgICAoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfAorCSAgICAgIE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQgfAorCSAgICAgIE1BQ19TVEFUVVNfTUlfQ09NUExFVElPTiB8CisJICAgICAgTUFDX1NUQVRVU19MTktTVEFURV9DSEFOR0VEKSk7CisJdWRlbGF5KDQwKTsKKworCXRwLT5taV9tb2RlID0gTUFDX01JX01PREVfQkFTRTsKKwl0dzMyX2YoTUFDX01JX01PREUsIHRwLT5taV9tb2RlKTsKKwl1ZGVsYXkoODApOworCisJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCAweDAyKTsKKworCS8qIFNvbWUgdGhpcmQtcGFydHkgUEhZcyBuZWVkIHRvIGJlIHJlc2V0IG9uIGxpbmsgZ29pbmcKKwkgKiBkb3duLgorCSAqLworCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMgfHwKKwkgICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0IHx8CisJICAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSkgJiYKKwkgICAgbmV0aWZfY2Fycmllcl9vayh0cC0+ZGV2KSkgeworCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZibXNyKTsKKwkJaWYgKCF0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZibXNyKSAmJgorCQkgICAgIShibXNyICYgQk1TUl9MU1RBVFVTKSkKKwkJCWZvcmNlX3Jlc2V0ID0gMTsKKwl9CisJaWYgKGZvcmNlX3Jlc2V0KQorCQl0ZzNfcGh5X3Jlc2V0KHRwKTsKKworCWlmICgodHAtPnBoeV9pZCAmIFBIWV9JRF9NQVNLKSA9PSBQSFlfSURfQkNNNTQwMSkgeworCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZibXNyKTsKKwkJaWYgKHRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpIHx8CisJCSAgICAhKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19JTklUX0NPTVBMRVRFKSkKKwkJCWJtc3IgPSAwOworCisJCWlmICghKGJtc3IgJiBCTVNSX0xTVEFUVVMpKSB7CisJCQllcnIgPSB0ZzNfaW5pdF81NDAxcGh5X2RzcCh0cCk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisKKwkJCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpOworCQkJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQkJCXVkZWxheSgxMCk7CisJCQkJaWYgKCF0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZibXNyKSAmJgorCQkJCSAgICAoYm1zciAmIEJNU1JfTFNUQVRVUykpIHsKKwkJCQkJdWRlbGF5KDQwKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoKHRwLT5waHlfaWQgJiBQSFlfSURfUkVWX01BU0spID09IFBIWV9SRVZfQkNNNTQwMV9CMCAmJgorCQkJICAgICEoYm1zciAmIEJNU1JfTFNUQVRVUykgJiYKKwkJCSAgICB0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID09IFNQRUVEXzEwMDApIHsKKwkJCQllcnIgPSB0ZzNfcGh5X3Jlc2V0KHRwKTsKKwkJCQlpZiAoIWVycikKKwkJCQkJZXJyID0gdGczX2luaXRfNTQwMXBoeV9kc3AodHApOworCQkJCWlmIChlcnIpCisJCQkJCXJldHVybiBlcnI7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0EwIHx8CisJCSAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0IwKSB7CisJCS8qIDU3MDEge0EwLEIwfSBDUkMgYnVnIHdvcmthcm91bmQgKi8KKwkJdGczX3dyaXRlcGh5KHRwLCAweDE1LCAweDBhNzUpOworCQl0ZzNfd3JpdGVwaHkodHAsIDB4MWMsIDB4OGM2OCk7CisJCXRnM193cml0ZXBoeSh0cCwgMHgxYywgMHg4ZDY4KTsKKwkJdGczX3dyaXRlcGh5KHRwLCAweDFjLCAweDhjNjgpOworCX0KKworCS8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0cy4uLiAqLworCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0lTVEFULCAmZHVtbXkpOworCXRnM19yZWFkcGh5KHRwLCBNSUlfVEczX0lTVEFULCAmZHVtbXkpOworCisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19VU0VfTUlfSU5URVJSVVBUKQorCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfSU1BU0ssIH5NSUlfVEczX0lOVF9MSU5LQ0hHKTsKKwllbHNlCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19JTUFTSywgfjApOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAwIHx8CisJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAxKSB7CisJCWlmICh0cC0+bGVkX2N0cmwgPT0gTEVEX0NUUkxfTU9ERV9QSFlfMSkKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19FWFRfQ1RSTCwKKwkJCQkgICAgIE1JSV9URzNfRVhUX0NUUkxfTE5LM19MRURfTU9ERSk7CisJCWVsc2UKKwkJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19FWFRfQ1RSTCwgMCk7CisJfQorCisJY3VycmVudF9saW5rX3VwID0gMDsKKwljdXJyZW50X3NwZWVkID0gU1BFRURfSU5WQUxJRDsKKwljdXJyZW50X2R1cGxleCA9IERVUExFWF9JTlZBTElEOworCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfQ0FQQUNJVElWRV9DT1VQTElORykgeworCQl1MzIgdmFsOworCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX1RHM19BVVhfQ1RSTCwgMHg0MDA3KTsKKwkJdGczX3JlYWRwaHkodHAsIE1JSV9URzNfQVVYX0NUUkwsICZ2YWwpOworCQlpZiAoISh2YWwgJiAoMSA8PCAxMCkpKSB7CisJCQl2YWwgfD0gKDEgPDwgMTApOworCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfVEczX0FVWF9DVFJMLCB2YWwpOworCQkJZ290byByZWxpbms7CisJCX0KKwl9CisKKwlibXNyID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmYm1zcik7CisJCWlmICghdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmYm1zcikgJiYKKwkJICAgIChibXNyICYgQk1TUl9MU1RBVFVTKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoNDApOworCX0KKworCWlmIChibXNyICYgQk1TUl9MU1RBVFVTKSB7CisJCXUzMiBhdXhfc3RhdCwgYm1jcjsKKworCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX1RHM19BVVhfU1RBVCwgJmF1eF9zdGF0KTsKKwkJZm9yIChpID0gMDsgaSA8IDIwMDA7IGkrKykgeworCQkJdWRlbGF5KDEwKTsKKwkJCWlmICghdGczX3JlYWRwaHkodHAsIE1JSV9URzNfQVVYX1NUQVQsICZhdXhfc3RhdCkgJiYKKwkJCSAgICBhdXhfc3RhdCkKKwkJCQlicmVhazsKKwkJfQorCisJCXRnM19hdXhfc3RhdF90b19zcGVlZF9kdXBsZXgodHAsIGF1eF9zdGF0LAorCQkJCQkgICAgICZjdXJyZW50X3NwZWVkLAorCQkJCQkgICAgICZjdXJyZW50X2R1cGxleCk7CisKKwkJYm1jciA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCAyMDA7IGkrKykgeworCQkJdGczX3JlYWRwaHkodHAsIE1JSV9CTUNSLCAmYm1jcik7CisJCQlpZiAodGczX3JlYWRwaHkodHAsIE1JSV9CTUNSLCAmYm1jcikpCisJCQkJY29udGludWU7CisJCQlpZiAoYm1jciAmJiBibWNyICE9IDB4N2ZmZikKKwkJCQlicmVhazsKKwkJCXVkZWxheSgxMCk7CisJCX0KKworCQlpZiAodHAtPmxpbmtfY29uZmlnLmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJCWlmIChibWNyICYgQk1DUl9BTkVOQUJMRSkgeworCQkJCWN1cnJlbnRfbGlua191cCA9IDE7CisKKwkJCQkvKiBGb3JjZSBhdXRvbmVnIHJlc3RhcnQgaWYgd2UgYXJlIGV4aXRpbmcKKwkJCQkgKiBsb3cgcG93ZXIgbW9kZS4KKwkJCQkgKi8KKwkJCQlpZiAoIXRnM19jb3BwZXJfaXNfYWR2ZXJ0aXNpbmdfYWxsKHRwKSkKKwkJCQkJY3VycmVudF9saW5rX3VwID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJY3VycmVudF9saW5rX3VwID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghKGJtY3IgJiBCTUNSX0FORU5BQkxFKSAmJgorCQkJICAgIHRwLT5saW5rX2NvbmZpZy5zcGVlZCA9PSBjdXJyZW50X3NwZWVkICYmCisJCQkgICAgdHAtPmxpbmtfY29uZmlnLmR1cGxleCA9PSBjdXJyZW50X2R1cGxleCkgeworCQkJCWN1cnJlbnRfbGlua191cCA9IDE7CisJCQl9IGVsc2UgeworCQkJCWN1cnJlbnRfbGlua191cCA9IDA7CisJCQl9CisJCX0KKworCQl0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID0gY3VycmVudF9zcGVlZDsKKwkJdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPSBjdXJyZW50X2R1cGxleDsKKwl9CisKKwlpZiAoY3VycmVudF9saW5rX3VwID09IDEgJiYKKwkgICAgKHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4ID09IERVUExFWF9GVUxMKSAmJgorCSAgICAodHAtPmxpbmtfY29uZmlnLmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpKSB7CisJCXUzMiBsb2NhbF9hZHYsIHJlbW90ZV9hZHY7CisKKwkJaWYgKHRnM19yZWFkcGh5KHRwLCBNSUlfQURWRVJUSVNFLCAmbG9jYWxfYWR2KSkKKwkJCWxvY2FsX2FkdiA9IDA7CisJCWxvY2FsX2FkdiAmPSAoQURWRVJUSVNFX1BBVVNFX0NBUCB8IEFEVkVSVElTRV9QQVVTRV9BU1lNKTsKKworCQlpZiAodGczX3JlYWRwaHkodHAsIE1JSV9MUEEsICZyZW1vdGVfYWR2KSkKKwkJCXJlbW90ZV9hZHYgPSAwOworCisJCXJlbW90ZV9hZHYgJj0gKExQQV9QQVVTRV9DQVAgfCBMUEFfUEFVU0VfQVNZTSk7CisKKwkJLyogSWYgd2UgYXJlIG5vdCBhZHZlcnRpc2luZyBmdWxsIHBhdXNlIGNhcGFiaWxpdHksCisJCSAqIHNvbWV0aGluZyBpcyB3cm9uZy4gIEJyaW5nIHRoZSBsaW5rIGRvd24gYW5kIHJlY29uZmlndXJlLgorCQkgKi8KKwkJaWYgKGxvY2FsX2FkdiAhPSBBRFZFUlRJU0VfUEFVU0VfQ0FQKSB7CisJCQljdXJyZW50X2xpbmtfdXAgPSAwOworCQl9IGVsc2UgeworCQkJdGczX3NldHVwX2Zsb3dfY29udHJvbCh0cCwgbG9jYWxfYWR2LCByZW1vdGVfYWR2KTsKKwkJfQorCX0KK3JlbGluazoKKwlpZiAoY3VycmVudF9saW5rX3VwID09IDApIHsKKwkJdTMyIHRtcDsKKworCQl0ZzNfcGh5X2NvcHBlcl9iZWdpbih0cCk7CisKKwkJdGczX3JlYWRwaHkodHAsIE1JSV9CTVNSLCAmdG1wKTsKKwkJaWYgKCF0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZ0bXApICYmCisJCSAgICAodG1wICYgQk1TUl9MU1RBVFVTKSkKKwkJCWN1cnJlbnRfbGlua191cCA9IDE7CisJfQorCisJdHAtPm1hY19tb2RlICY9IH5NQUNfTU9ERV9QT1JUX01PREVfTUFTSzsKKwlpZiAoY3VycmVudF9saW5rX3VwID09IDEpIHsKKwkJaWYgKHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPT0gU1BFRURfMTAwIHx8CisJCSAgICB0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID09IFNQRUVEXzEwKQorCQkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9NSUk7CisJCWVsc2UKKwkJCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9QT1JUX01PREVfR01JSTsKKwl9IGVsc2UKKwkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX1BPUlRfTU9ERV9HTUlJOworCisJdHAtPm1hY19tb2RlICY9IH5NQUNfTU9ERV9IQUxGX0RVUExFWDsKKwlpZiAodHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPT0gRFVQTEVYX0hBTEYpCisJCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9IQUxGX0RVUExFWDsKKworCXRwLT5tYWNfbW9kZSAmPSB+TUFDX01PREVfTElOS19QT0xBUklUWTsKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDApIHsKKwkJaWYgKCh0cC0+bGVkX2N0cmwgPT0gTEVEX0NUUkxfTU9ERV9QSFlfMikgfHwKKwkJICAgIChjdXJyZW50X2xpbmtfdXAgPT0gMSAmJgorCQkgICAgIHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPT0gU1BFRURfMTApKQorCQkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX0xJTktfUE9MQVJJVFk7CisJfSBlbHNlIHsKKwkJaWYgKGN1cnJlbnRfbGlua191cCA9PSAxKQorCQkJdHAtPm1hY19tb2RlIHw9IE1BQ19NT0RFX0xJTktfUE9MQVJJVFk7CisJfQorCisJLyogPz8/IFdpdGhvdXQgdGhpcyBzZXR0aW5nIE5ldGdlYXIgR0EzMDJUIFBIWSBkb2VzIG5vdAorCSAqID8/PyBzZW5kL3JlY2VpdmUgcGFja2V0cy4uLgorCSAqLworCWlmICgodHAtPnBoeV9pZCAmIFBIWV9JRF9NQVNLKSA9PSBQSFlfSURfQkNNNTQxMSAmJgorCSAgICB0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMF9BTFRJTUEpIHsKKwkJdHAtPm1pX21vZGUgfD0gTUFDX01JX01PREVfQVVUT19QT0xMOworCQl0dzMyX2YoTUFDX01JX01PREUsIHRwLT5taV9tb2RlKTsKKwkJdWRlbGF5KDgwKTsKKwl9CisKKwl0dzMyX2YoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisJdWRlbGF5KDQwKTsKKworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfVVNFX0xJTktDSEdfUkVHKSB7CisJCS8qIFBvbGxlZCB2aWEgdGltZXIuICovCisJCXR3MzJfZihNQUNfRVZFTlQsIDApOworCX0gZWxzZSB7CisJCXR3MzJfZihNQUNfRVZFTlQsIE1BQ19FVkVOVF9MTktTVEFURV9DSEFOR0VEKTsKKwl9CisJdWRlbGF5KDQwKTsKKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCAmJgorCSAgICBjdXJyZW50X2xpbmtfdXAgPT0gMSAmJgorCSAgICB0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID09IFNQRUVEXzEwMDAgJiYKKwkgICAgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSB8fAorCSAgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lfSElHSF9TUEVFRCkpKSB7CisJCXVkZWxheSgxMjApOworCQl0dzMyX2YoTUFDX1NUQVRVUywKKwkJICAgICAoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfAorCQkgICAgICBNQUNfU1RBVFVTX0NGR19DSEFOR0VEKSk7CisJCXVkZWxheSg0MCk7CisJCXRnM193cml0ZV9tZW0odHAsCisJCQkgICAgICBOSUNfU1JBTV9GSVJNV0FSRV9NQk9YLAorCQkJICAgICAgTklDX1NSQU1fRklSTVdBUkVfTUJPWF9NQUdJQzIpOworCX0KKworCWlmIChjdXJyZW50X2xpbmtfdXAgIT0gbmV0aWZfY2Fycmllcl9vayh0cC0+ZGV2KSkgeworCQlpZiAoY3VycmVudF9saW5rX3VwKQorCQkJbmV0aWZfY2Fycmllcl9vbih0cC0+ZGV2KTsKKwkJZWxzZQorCQkJbmV0aWZfY2Fycmllcl9vZmYodHAtPmRldik7CisJCXRnM19saW5rX3JlcG9ydCh0cCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB0ZzNfZmliZXJfYW5lZ2luZm8geworCWludCBzdGF0ZTsKKyNkZWZpbmUgQU5FR19TVEFURV9VTktOT1dOCQkwCisjZGVmaW5lIEFORUdfU1RBVEVfQU5fRU5BQkxFCQkxCisjZGVmaW5lIEFORUdfU1RBVEVfUkVTVEFSVF9JTklUCQkyCisjZGVmaW5lIEFORUdfU1RBVEVfUkVTVEFSVAkJMworI2RlZmluZSBBTkVHX1NUQVRFX0RJU0FCTEVfTElOS19PSwk0CisjZGVmaW5lIEFORUdfU1RBVEVfQUJJTElUWV9ERVRFQ1RfSU5JVAk1CisjZGVmaW5lIEFORUdfU1RBVEVfQUJJTElUWV9ERVRFQ1QJNgorI2RlZmluZSBBTkVHX1NUQVRFX0FDS19ERVRFQ1RfSU5JVAk3CisjZGVmaW5lIEFORUdfU1RBVEVfQUNLX0RFVEVDVAkJOAorI2RlZmluZSBBTkVHX1NUQVRFX0NPTVBMRVRFX0FDS19JTklUCTkKKyNkZWZpbmUgQU5FR19TVEFURV9DT01QTEVURV9BQ0sJCTEwCisjZGVmaW5lIEFORUdfU1RBVEVfSURMRV9ERVRFQ1RfSU5JVAkxMQorI2RlZmluZSBBTkVHX1NUQVRFX0lETEVfREVURUNUCQkxMgorI2RlZmluZSBBTkVHX1NUQVRFX0xJTktfT0sJCTEzCisjZGVmaW5lIEFORUdfU1RBVEVfTkVYVF9QQUdFX1dBSVRfSU5JVAkxNAorI2RlZmluZSBBTkVHX1NUQVRFX05FWFRfUEFHRV9XQUlUCTE1CisKKwl1MzIgZmxhZ3M7CisjZGVmaW5lIE1SX0FOX0VOQUJMRQkJMHgwMDAwMDAwMQorI2RlZmluZSBNUl9SRVNUQVJUX0FOCQkweDAwMDAwMDAyCisjZGVmaW5lIE1SX0FOX0NPTVBMRVRFCQkweDAwMDAwMDA0CisjZGVmaW5lIE1SX1BBR0VfUlgJCTB4MDAwMDAwMDgKKyNkZWZpbmUgTVJfTlBfTE9BREVECQkweDAwMDAwMDEwCisjZGVmaW5lIE1SX1RPR0dMRV9UWAkJMHgwMDAwMDAyMAorI2RlZmluZSBNUl9MUF9BRFZfRlVMTF9EVVBMRVgJMHgwMDAwMDA0MAorI2RlZmluZSBNUl9MUF9BRFZfSEFMRl9EVVBMRVgJMHgwMDAwMDA4MAorI2RlZmluZSBNUl9MUF9BRFZfU1lNX1BBVVNFCTB4MDAwMDAxMDAKKyNkZWZpbmUgTVJfTFBfQURWX0FTWU1fUEFVU0UJMHgwMDAwMDIwMAorI2RlZmluZSBNUl9MUF9BRFZfUkVNT1RFX0ZBVUxUMQkweDAwMDAwNDAwCisjZGVmaW5lIE1SX0xQX0FEVl9SRU1PVEVfRkFVTFQyCTB4MDAwMDA4MDAKKyNkZWZpbmUgTVJfTFBfQURWX05FWFRfUEFHRQkweDAwMDAxMDAwCisjZGVmaW5lIE1SX1RPR0dMRV9SWAkJMHgwMDAwMjAwMAorI2RlZmluZSBNUl9OUF9SWAkJMHgwMDAwNDAwMAorCisjZGVmaW5lIE1SX0xJTktfT0sJCTB4ODAwMDAwMDAKKworCXVuc2lnbmVkIGxvbmcgbGlua190aW1lLCBjdXJfdGltZTsKKworCXUzMiBhYmlsaXR5X21hdGNoX2NmZzsKKwlpbnQgYWJpbGl0eV9tYXRjaF9jb3VudDsKKworCWNoYXIgYWJpbGl0eV9tYXRjaCwgaWRsZV9tYXRjaCwgYWNrX21hdGNoOworCisJdTMyIHR4Y29uZmlnLCByeGNvbmZpZzsKKyNkZWZpbmUgQU5FR19DRkdfTlAJCTB4MDAwMDAwODAKKyNkZWZpbmUgQU5FR19DRkdfQUNLCQkweDAwMDAwMDQwCisjZGVmaW5lIEFORUdfQ0ZHX1JGMgkJMHgwMDAwMDAyMAorI2RlZmluZSBBTkVHX0NGR19SRjEJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQU5FR19DRkdfUFMyCQkweDAwMDAwMDAxCisjZGVmaW5lIEFORUdfQ0ZHX1BTMQkJMHgwMDAwODAwMAorI2RlZmluZSBBTkVHX0NGR19IRAkJMHgwMDAwNDAwMAorI2RlZmluZSBBTkVHX0NGR19GRAkJMHgwMDAwMjAwMAorI2RlZmluZSBBTkVHX0NGR19JTlZBTAkJMHgwMDAwMWYwNgorCit9OworI2RlZmluZSBBTkVHX09LCQkwCisjZGVmaW5lIEFORUdfRE9ORQkxCisjZGVmaW5lIEFORUdfVElNRVJfRU5BQgkyCisjZGVmaW5lIEFORUdfRkFJTEVECS0xCisKKyNkZWZpbmUgQU5FR19TVEFURV9TRVRUTEVfVElNRQkxMDAwMAorCitzdGF0aWMgaW50IHRnM19maWJlcl9hbmVnX3NtYWNoaW5lKHN0cnVjdCB0ZzMgKnRwLAorCQkJCSAgIHN0cnVjdCB0ZzNfZmliZXJfYW5lZ2luZm8gKmFwKQoreworCXVuc2lnbmVkIGxvbmcgZGVsdGE7CisJdTMyIHJ4X2NmZ19yZWc7CisJaW50IHJldDsKKworCWlmIChhcC0+c3RhdGUgPT0gQU5FR19TVEFURV9VTktOT1dOKSB7CisJCWFwLT5yeGNvbmZpZyA9IDA7CisJCWFwLT5saW5rX3RpbWUgPSAwOworCQlhcC0+Y3VyX3RpbWUgPSAwOworCQlhcC0+YWJpbGl0eV9tYXRjaF9jZmcgPSAwOworCQlhcC0+YWJpbGl0eV9tYXRjaF9jb3VudCA9IDA7CisJCWFwLT5hYmlsaXR5X21hdGNoID0gMDsKKwkJYXAtPmlkbGVfbWF0Y2ggPSAwOworCQlhcC0+YWNrX21hdGNoID0gMDsKKwl9CisJYXAtPmN1cl90aW1lKys7CisKKwlpZiAodHIzMihNQUNfU1RBVFVTKSAmIE1BQ19TVEFUVVNfUkNWRF9DRkcpIHsKKwkJcnhfY2ZnX3JlZyA9IHRyMzIoTUFDX1JYX0FVVE9fTkVHKTsKKworCQlpZiAocnhfY2ZnX3JlZyAhPSBhcC0+YWJpbGl0eV9tYXRjaF9jZmcpIHsKKwkJCWFwLT5hYmlsaXR5X21hdGNoX2NmZyA9IHJ4X2NmZ19yZWc7CisJCQlhcC0+YWJpbGl0eV9tYXRjaCA9IDA7CisJCQlhcC0+YWJpbGl0eV9tYXRjaF9jb3VudCA9IDA7CisJCX0gZWxzZSB7CisJCQlpZiAoKythcC0+YWJpbGl0eV9tYXRjaF9jb3VudCA+IDEpIHsKKwkJCQlhcC0+YWJpbGl0eV9tYXRjaCA9IDE7CisJCQkJYXAtPmFiaWxpdHlfbWF0Y2hfY2ZnID0gcnhfY2ZnX3JlZzsKKwkJCX0KKwkJfQorCQlpZiAocnhfY2ZnX3JlZyAmIEFORUdfQ0ZHX0FDSykKKwkJCWFwLT5hY2tfbWF0Y2ggPSAxOworCQllbHNlCisJCQlhcC0+YWNrX21hdGNoID0gMDsKKworCQlhcC0+aWRsZV9tYXRjaCA9IDA7CisJfSBlbHNlIHsKKwkJYXAtPmlkbGVfbWF0Y2ggPSAxOworCQlhcC0+YWJpbGl0eV9tYXRjaF9jZmcgPSAwOworCQlhcC0+YWJpbGl0eV9tYXRjaF9jb3VudCA9IDA7CisJCWFwLT5hYmlsaXR5X21hdGNoID0gMDsKKwkJYXAtPmFja19tYXRjaCA9IDA7CisKKwkJcnhfY2ZnX3JlZyA9IDA7CisJfQorCisJYXAtPnJ4Y29uZmlnID0gcnhfY2ZnX3JlZzsKKwlyZXQgPSBBTkVHX09LOworCisJc3dpdGNoKGFwLT5zdGF0ZSkgeworCWNhc2UgQU5FR19TVEFURV9VTktOT1dOOgorCQlpZiAoYXAtPmZsYWdzICYgKE1SX0FOX0VOQUJMRSB8IE1SX1JFU1RBUlRfQU4pKQorCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9BTl9FTkFCTEU7CisKKwkJLyogZmFsbHRocnUgKi8KKwljYXNlIEFORUdfU1RBVEVfQU5fRU5BQkxFOgorCQlhcC0+ZmxhZ3MgJj0gfihNUl9BTl9DT01QTEVURSB8IE1SX1BBR0VfUlgpOworCQlpZiAoYXAtPmZsYWdzICYgTVJfQU5fRU5BQkxFKSB7CisJCQlhcC0+bGlua190aW1lID0gMDsKKwkJCWFwLT5jdXJfdGltZSA9IDA7CisJCQlhcC0+YWJpbGl0eV9tYXRjaF9jZmcgPSAwOworCQkJYXAtPmFiaWxpdHlfbWF0Y2hfY291bnQgPSAwOworCQkJYXAtPmFiaWxpdHlfbWF0Y2ggPSAwOworCQkJYXAtPmlkbGVfbWF0Y2ggPSAwOworCQkJYXAtPmFja19tYXRjaCA9IDA7CisKKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfUkVTVEFSVF9JTklUOworCQl9IGVsc2UgeworCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9ESVNBQkxFX0xJTktfT0s7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfUkVTVEFSVF9JTklUOgorCQlhcC0+bGlua190aW1lID0gYXAtPmN1cl90aW1lOworCQlhcC0+ZmxhZ3MgJj0gfihNUl9OUF9MT0FERUQpOworCQlhcC0+dHhjb25maWcgPSAwOworCQl0dzMyKE1BQ19UWF9BVVRPX05FRywgMCk7CisJCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9TRU5EX0NPTkZJR1M7CisJCXR3MzJfZihNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKwkJdWRlbGF5KDQwKTsKKworCQlyZXQgPSBBTkVHX1RJTUVSX0VOQUI7CisJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfUkVTVEFSVDsKKworCQkvKiBmYWxsdGhydSAqLworCWNhc2UgQU5FR19TVEFURV9SRVNUQVJUOgorCQlkZWx0YSA9IGFwLT5jdXJfdGltZSAtIGFwLT5saW5rX3RpbWU7CisJCWlmIChkZWx0YSA+IEFORUdfU1RBVEVfU0VUVExFX1RJTUUpIHsKKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQUJJTElUWV9ERVRFQ1RfSU5JVDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IEFORUdfVElNRVJfRU5BQjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQU5FR19TVEFURV9ESVNBQkxFX0xJTktfT0s6CisJCXJldCA9IEFORUdfRE9ORTsKKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfQUJJTElUWV9ERVRFQ1RfSU5JVDoKKwkJYXAtPmZsYWdzICY9IH4oTVJfVE9HR0xFX1RYKTsKKwkJYXAtPnR4Y29uZmlnID0gKEFORUdfQ0ZHX0ZEIHwgQU5FR19DRkdfUFMxKTsKKwkJdHczMihNQUNfVFhfQVVUT19ORUcsIGFwLT50eGNvbmZpZyk7CisJCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9TRU5EX0NPTkZJR1M7CisJCXR3MzJfZihNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKwkJdWRlbGF5KDQwKTsKKworCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0FCSUxJVFlfREVURUNUOworCQlicmVhazsKKworCWNhc2UgQU5FR19TVEFURV9BQklMSVRZX0RFVEVDVDoKKwkJaWYgKGFwLT5hYmlsaXR5X21hdGNoICE9IDAgJiYgYXAtPnJ4Y29uZmlnICE9IDApIHsKKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQUNLX0RFVEVDVF9JTklUOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX0FDS19ERVRFQ1RfSU5JVDoKKwkJYXAtPnR4Y29uZmlnIHw9IEFORUdfQ0ZHX0FDSzsKKwkJdHczMihNQUNfVFhfQVVUT19ORUcsIGFwLT50eGNvbmZpZyk7CisJCXRwLT5tYWNfbW9kZSB8PSBNQUNfTU9ERV9TRU5EX0NPTkZJR1M7CisJCXR3MzJfZihNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKwkJdWRlbGF5KDQwKTsKKworCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0FDS19ERVRFQ1Q7CisKKwkJLyogZmFsbHRocnUgKi8KKwljYXNlIEFORUdfU1RBVEVfQUNLX0RFVEVDVDoKKwkJaWYgKGFwLT5hY2tfbWF0Y2ggIT0gMCkgeworCQkJaWYgKChhcC0+cnhjb25maWcgJiB+QU5FR19DRkdfQUNLKSA9PQorCQkJICAgIChhcC0+YWJpbGl0eV9tYXRjaF9jZmcgJiB+QU5FR19DRkdfQUNLKSkgeworCQkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQ09NUExFVEVfQUNLX0lOSVQ7CisJCQl9IGVsc2UgeworCQkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQU5fRU5BQkxFOworCQkJfQorCQl9IGVsc2UgaWYgKGFwLT5hYmlsaXR5X21hdGNoICE9IDAgJiYKKwkJCSAgIGFwLT5yeGNvbmZpZyA9PSAwKSB7CisJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0FOX0VOQUJMRTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQU5FR19TVEFURV9DT01QTEVURV9BQ0tfSU5JVDoKKwkJaWYgKGFwLT5yeGNvbmZpZyAmIEFORUdfQ0ZHX0lOVkFMKSB7CisJCQlyZXQgPSBBTkVHX0ZBSUxFRDsKKwkJCWJyZWFrOworCQl9CisJCWFwLT5mbGFncyAmPSB+KE1SX0xQX0FEVl9GVUxMX0RVUExFWCB8CisJCQkgICAgICAgTVJfTFBfQURWX0hBTEZfRFVQTEVYIHwKKwkJCSAgICAgICBNUl9MUF9BRFZfU1lNX1BBVVNFIHwKKwkJCSAgICAgICBNUl9MUF9BRFZfQVNZTV9QQVVTRSB8CisJCQkgICAgICAgTVJfTFBfQURWX1JFTU9URV9GQVVMVDEgfAorCQkJICAgICAgIE1SX0xQX0FEVl9SRU1PVEVfRkFVTFQyIHwKKwkJCSAgICAgICBNUl9MUF9BRFZfTkVYVF9QQUdFIHwKKwkJCSAgICAgICBNUl9UT0dHTEVfUlggfAorCQkJICAgICAgIE1SX05QX1JYKTsKKwkJaWYgKGFwLT5yeGNvbmZpZyAmIEFORUdfQ0ZHX0ZEKQorCQkJYXAtPmZsYWdzIHw9IE1SX0xQX0FEVl9GVUxMX0RVUExFWDsKKwkJaWYgKGFwLT5yeGNvbmZpZyAmIEFORUdfQ0ZHX0hEKQorCQkJYXAtPmZsYWdzIHw9IE1SX0xQX0FEVl9IQUxGX0RVUExFWDsKKwkJaWYgKGFwLT5yeGNvbmZpZyAmIEFORUdfQ0ZHX1BTMSkKKwkJCWFwLT5mbGFncyB8PSBNUl9MUF9BRFZfU1lNX1BBVVNFOworCQlpZiAoYXAtPnJ4Y29uZmlnICYgQU5FR19DRkdfUFMyKQorCQkJYXAtPmZsYWdzIHw9IE1SX0xQX0FEVl9BU1lNX1BBVVNFOworCQlpZiAoYXAtPnJ4Y29uZmlnICYgQU5FR19DRkdfUkYxKQorCQkJYXAtPmZsYWdzIHw9IE1SX0xQX0FEVl9SRU1PVEVfRkFVTFQxOworCQlpZiAoYXAtPnJ4Y29uZmlnICYgQU5FR19DRkdfUkYyKQorCQkJYXAtPmZsYWdzIHw9IE1SX0xQX0FEVl9SRU1PVEVfRkFVTFQyOworCQlpZiAoYXAtPnJ4Y29uZmlnICYgQU5FR19DRkdfTlApCisJCQlhcC0+ZmxhZ3MgfD0gTVJfTFBfQURWX05FWFRfUEFHRTsKKworCQlhcC0+bGlua190aW1lID0gYXAtPmN1cl90aW1lOworCisJCWFwLT5mbGFncyBePSAoTVJfVE9HR0xFX1RYKTsKKwkJaWYgKGFwLT5yeGNvbmZpZyAmIDB4MDAwOCkKKwkJCWFwLT5mbGFncyB8PSBNUl9UT0dHTEVfUlg7CisJCWlmIChhcC0+cnhjb25maWcgJiBBTkVHX0NGR19OUCkKKwkJCWFwLT5mbGFncyB8PSBNUl9OUF9SWDsKKwkJYXAtPmZsYWdzIHw9IE1SX1BBR0VfUlg7CisKKwkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9DT01QTEVURV9BQ0s7CisJCXJldCA9IEFORUdfVElNRVJfRU5BQjsKKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfQ09NUExFVEVfQUNLOgorCQlpZiAoYXAtPmFiaWxpdHlfbWF0Y2ggIT0gMCAmJgorCQkgICAgYXAtPnJ4Y29uZmlnID09IDApIHsKKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQU5fRU5BQkxFOworCQkJYnJlYWs7CisJCX0KKwkJZGVsdGEgPSBhcC0+Y3VyX3RpbWUgLSBhcC0+bGlua190aW1lOworCQlpZiAoZGVsdGEgPiBBTkVHX1NUQVRFX1NFVFRMRV9USU1FKSB7CisJCQlpZiAoIShhcC0+ZmxhZ3MgJiAoTVJfTFBfQURWX05FWFRfUEFHRSkpKSB7CisJCQkJYXAtPnN0YXRlID0gQU5FR19TVEFURV9JRExFX0RFVEVDVF9JTklUOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoKGFwLT50eGNvbmZpZyAmIEFORUdfQ0ZHX05QKSA9PSAwICYmCisJCQkJICAgICEoYXAtPmZsYWdzICYgTVJfTlBfUlgpKSB7CisJCQkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfSURMRV9ERVRFQ1RfSU5JVDsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXQgPSBBTkVHX0ZBSUxFRDsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfSURMRV9ERVRFQ1RfSU5JVDoKKwkJYXAtPmxpbmtfdGltZSA9IGFwLT5jdXJfdGltZTsKKwkJdHAtPm1hY19tb2RlICY9IH5NQUNfTU9ERV9TRU5EX0NPTkZJR1M7CisJCXR3MzJfZihNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKwkJdWRlbGF5KDQwKTsKKworCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0lETEVfREVURUNUOworCQlyZXQgPSBBTkVHX1RJTUVSX0VOQUI7CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX0lETEVfREVURUNUOgorCQlpZiAoYXAtPmFiaWxpdHlfbWF0Y2ggIT0gMCAmJgorCQkgICAgYXAtPnJ4Y29uZmlnID09IDApIHsKKwkJCWFwLT5zdGF0ZSA9IEFORUdfU1RBVEVfQU5fRU5BQkxFOworCQkJYnJlYWs7CisJCX0KKwkJZGVsdGEgPSBhcC0+Y3VyX3RpbWUgLSBhcC0+bGlua190aW1lOworCQlpZiAoZGVsdGEgPiBBTkVHX1NUQVRFX1NFVFRMRV9USU1FKSB7CisJCQkvKiBYWFggYW5vdGhlciBnZW0gZnJvbSB0aGUgQnJvYWRjb20gZHJpdmVyIDooICovCisJCQlhcC0+c3RhdGUgPSBBTkVHX1NUQVRFX0xJTktfT0s7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFORUdfU1RBVEVfTElOS19PSzoKKwkJYXAtPmZsYWdzIHw9IChNUl9BTl9DT01QTEVURSB8IE1SX0xJTktfT0spOworCQlyZXQgPSBBTkVHX0RPTkU7CisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX05FWFRfUEFHRV9XQUlUX0lOSVQ6CisJCS8qID8/PyB1bmltcGxlbWVudGVkICovCisJCWJyZWFrOworCisJY2FzZSBBTkVHX1NUQVRFX05FWFRfUEFHRV9XQUlUOgorCQkvKiA/Pz8gdW5pbXBsZW1lbnRlZCAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IEFORUdfRkFJTEVEOworCQlicmVhazsKKwl9OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmaWJlcl9hdXRvbmVnKHN0cnVjdCB0ZzMgKnRwLCB1MzIgKmZsYWdzKQoreworCWludCByZXMgPSAwOworCXN0cnVjdCB0ZzNfZmliZXJfYW5lZ2luZm8gYW5pbmZvOworCWludCBzdGF0dXMgPSBBTkVHX0ZBSUxFRDsKKwl1bnNpZ25lZCBpbnQgdGljazsKKwl1MzIgdG1wOworCisJdHczMl9mKE1BQ19UWF9BVVRPX05FRywgMCk7CisKKwl0bXAgPSB0cC0+bWFjX21vZGUgJiB+TUFDX01PREVfUE9SVF9NT0RFX01BU0s7CisJdHczMl9mKE1BQ19NT0RFLCB0bXAgfCBNQUNfTU9ERV9QT1JUX01PREVfR01JSSk7CisJdWRlbGF5KDQwKTsKKworCXR3MzJfZihNQUNfTU9ERSwgdHAtPm1hY19tb2RlIHwgTUFDX01PREVfU0VORF9DT05GSUdTKTsKKwl1ZGVsYXkoNDApOworCisJbWVtc2V0KCZhbmluZm8sIDAsIHNpemVvZihhbmluZm8pKTsKKwlhbmluZm8uZmxhZ3MgfD0gTVJfQU5fRU5BQkxFOworCWFuaW5mby5zdGF0ZSA9IEFORUdfU1RBVEVfVU5LTk9XTjsKKwlhbmluZm8uY3VyX3RpbWUgPSAwOworCXRpY2sgPSAwOworCXdoaWxlICgrK3RpY2sgPCAxOTUwMDApIHsKKwkJc3RhdHVzID0gdGczX2ZpYmVyX2FuZWdfc21hY2hpbmUodHAsICZhbmluZm8pOworCQlpZiAoc3RhdHVzID09IEFORUdfRE9ORSB8fCBzdGF0dXMgPT0gQU5FR19GQUlMRUQpCisJCQlicmVhazsKKworCQl1ZGVsYXkoMSk7CisJfQorCisJdHAtPm1hY19tb2RlICY9IH5NQUNfTU9ERV9TRU5EX0NPTkZJR1M7CisJdHczMl9mKE1BQ19NT0RFLCB0cC0+bWFjX21vZGUpOworCXVkZWxheSg0MCk7CisKKwkqZmxhZ3MgPSBhbmluZm8uZmxhZ3M7CisKKwlpZiAoc3RhdHVzID09IEFORUdfRE9ORSAmJgorCSAgICAoYW5pbmZvLmZsYWdzICYgKE1SX0FOX0NPTVBMRVRFIHwgTVJfTElOS19PSyB8CisJCQkgICAgIE1SX0xQX0FEVl9GVUxMX0RVUExFWCkpKQorCQlyZXMgPSAxOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgdGczX2luaXRfYmNtODAwMihzdHJ1Y3QgdGczICp0cCkKK3sKKwl1MzIgbWFjX3N0YXR1cyA9IHRyMzIoTUFDX1NUQVRVUyk7CisJaW50IGk7CisKKwkvKiBSZXNldCB3aGVuIGluaXR0aW5nIGZpcnN0IHRpbWUgb3Igd2UgaGF2ZSBhIGxpbmsuICovCisJaWYgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfSU5JVF9DT01QTEVURSkgJiYKKwkgICAgIShtYWNfc3RhdHVzICYgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSkKKwkJcmV0dXJuOworCisJLyogU2V0IFBMTCBsb2NrIHJhbmdlLiAqLworCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHg4MDA3KTsKKworCS8qIFNXIHJlc2V0ICovCisJdGczX3dyaXRlcGh5KHRwLCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7CisKKwkvKiBXYWl0IGZvciByZXNldCB0byBjb21wbGV0ZS4gKi8KKwkvKiBYWFggc2NoZWR1bGVfdGltZW91dCgpIC4uLiAqLworCWZvciAoaSA9IDA7IGkgPCA1MDA7IGkrKykKKwkJdWRlbGF5KDEwKTsKKworCS8qIENvbmZpZyBtb2RlOyBzZWxlY3QgUE1BL0NoIDEgcmVncy4gKi8KKwl0ZzNfd3JpdGVwaHkodHAsIDB4MTAsIDB4ODQxMSk7CisKKwkvKiBFbmFibGUgYXV0by1sb2NrIGFuZCBjb21kZXQsIHNlbGVjdCB0eGNsayBmb3IgdHguICovCisJdGczX3dyaXRlcGh5KHRwLCAweDExLCAweDBhMTApOworCisJdGczX3dyaXRlcGh5KHRwLCAweDE4LCAweDAwYTApOworCXRnM193cml0ZXBoeSh0cCwgMHgxNiwgMHg0MWZmKTsKKworCS8qIEFzc2VydCBhbmQgZGVhc3NlcnQgUE9SLiAqLworCXRnM193cml0ZXBoeSh0cCwgMHgxMywgMHgwNDAwKTsKKwl1ZGVsYXkoNDApOworCXRnM193cml0ZXBoeSh0cCwgMHgxMywgMHgwMDAwKTsKKworCXRnM193cml0ZXBoeSh0cCwgMHgxMSwgMHgwYTUwKTsKKwl1ZGVsYXkoNDApOworCXRnM193cml0ZXBoeSh0cCwgMHgxMSwgMHgwYTEwKTsKKworCS8qIFdhaXQgZm9yIHNpZ25hbCB0byBzdGFiaWxpemUgKi8KKwkvKiBYWFggc2NoZWR1bGVfdGltZW91dCgpIC4uLiAqLworCWZvciAoaSA9IDA7IGkgPCAxNTAwMDsgaSsrKQorCQl1ZGVsYXkoMTApOworCisJLyogRGVzZWxlY3QgdGhlIGNoYW5uZWwgcmVnaXN0ZXIgc28gd2UgY2FuIHJlYWQgdGhlIFBIWUlECisJICogbGF0ZXIuCisJICovCisJdGczX3dyaXRlcGh5KHRwLCAweDEwLCAweDgwMTEpOworfQorCitzdGF0aWMgaW50IHRnM19zZXR1cF9maWJlcl9od19hdXRvbmVnKHN0cnVjdCB0ZzMgKnRwLCB1MzIgbWFjX3N0YXR1cykKK3sKKwl1MzIgc2dfZGlnX2N0cmwsIHNnX2RpZ19zdGF0dXM7CisJdTMyIHNlcmRlc19jZmcsIGV4cGVjdGVkX3NnX2RpZ19jdHJsOworCWludCB3b3JrYXJvdW5kLCBwb3J0X2E7CisJaW50IGN1cnJlbnRfbGlua191cDsKKworCXNlcmRlc19jZmcgPSAwOworCWV4cGVjdGVkX3NnX2RpZ19jdHJsID0gMDsKKwl3b3JrYXJvdW5kID0gMDsKKwlwb3J0X2EgPSAxOworCWN1cnJlbnRfbGlua191cCA9IDA7CisKKwlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3MDRfQTAgJiYKKwkgICAgdHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3MDRfQTEpIHsKKwkJd29ya2Fyb3VuZCA9IDE7CisJCWlmICh0cjMyKFRHM1BDSV9EVUFMX01BQ19DVFJMKSAmIERVQUxfTUFDX0NUUkxfSUQpCisJCQlwb3J0X2EgPSAwOworCisJCS8qIHByZXNlcnZlIGJpdHMgMC0xMSwxMywxNCBmb3Igc2lnbmFsIHByZS1lbXBoYXNpcyAqLworCQkvKiBwcmVzZXJ2ZSBiaXRzIDIwLTIzIGZvciB2b2x0YWdlIHJlZ3VsYXRvciAqLworCQlzZXJkZXNfY2ZnID0gdHIzMihNQUNfU0VSREVTX0NGRykgJiAweDAwZjA2ZmZmOworCX0KKworCXNnX2RpZ19jdHJsID0gdHIzMihTR19ESUdfQ1RSTCk7CisKKwlpZiAodHAtPmxpbmtfY29uZmlnLmF1dG9uZWcgIT0gQVVUT05FR19FTkFCTEUpIHsKKwkJaWYgKHNnX2RpZ19jdHJsICYgKDEgPDwgMzEpKSB7CisJCQlpZiAod29ya2Fyb3VuZCkgeworCQkJCXUzMiB2YWwgPSBzZXJkZXNfY2ZnOworCisJCQkJaWYgKHBvcnRfYSkKKwkJCQkJdmFsIHw9IDB4YzAxMDAwMDsKKwkJCQllbHNlCisJCQkJCXZhbCB8PSAweDQwMTAwMDA7CisJCQkJdHczMl9mKE1BQ19TRVJERVNfQ0ZHLCB2YWwpOworCQkJfQorCQkJdHczMl9mKFNHX0RJR19DVFJMLCAweDAxMzg4NDAwKTsKKwkJfQorCQlpZiAobWFjX3N0YXR1cyAmIE1BQ19TVEFUVVNfUENTX1NZTkNFRCkgeworCQkJdGczX3NldHVwX2Zsb3dfY29udHJvbCh0cCwgMCwgMCk7CisJCQljdXJyZW50X2xpbmtfdXAgPSAxOworCQl9CisJCWdvdG8gb3V0OworCX0KKworCS8qIFdhbnQgYXV0by1uZWdvdGlhdGlvbi4gICovCisJZXhwZWN0ZWRfc2dfZGlnX2N0cmwgPSAweDgxMzg4NDAwOworCisJLyogUGF1c2UgY2FwYWJpbGl0eSAqLworCWV4cGVjdGVkX3NnX2RpZ19jdHJsIHw9ICgxIDw8IDExKTsKKworCS8qIEFzeW1ldHRyaWMgcGF1c2UgKi8KKwlleHBlY3RlZF9zZ19kaWdfY3RybCB8PSAoMSA8PCAxMik7CisKKwlpZiAoc2dfZGlnX2N0cmwgIT0gZXhwZWN0ZWRfc2dfZGlnX2N0cmwpIHsKKwkJaWYgKHdvcmthcm91bmQpCisJCQl0dzMyX2YoTUFDX1NFUkRFU19DRkcsIHNlcmRlc19jZmcgfCAweGMwMTEwMDApOworCQl0dzMyX2YoU0dfRElHX0NUUkwsIGV4cGVjdGVkX3NnX2RpZ19jdHJsIHwgKDEgPDwgMzApKTsKKwkJdWRlbGF5KDUpOworCQl0dzMyX2YoU0dfRElHX0NUUkwsIGV4cGVjdGVkX3NnX2RpZ19jdHJsKTsKKworCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9QSFlfSlVTVF9JTklUVEVEOworCX0gZWxzZSBpZiAobWFjX3N0YXR1cyAmIChNQUNfU1RBVFVTX1BDU19TWU5DRUQgfAorCQkJCSBNQUNfU1RBVFVTX1NJR05BTF9ERVQpKSB7CisJCWludCBpOworCisJCS8qIEdpdmVyIHRpbWUgdG8gbmVnb3RpYXRlICh+MjAwbXMpICovCisJCWZvciAoaSA9IDA7IGkgPCA0MDAwMDsgaSsrKSB7CisJCQlzZ19kaWdfc3RhdHVzID0gdHIzMihTR19ESUdfU1RBVFVTKTsKKwkJCWlmIChzZ19kaWdfc3RhdHVzICYgKDB4MykpCisJCQkJYnJlYWs7CisJCQl1ZGVsYXkoNSk7CisJCX0KKwkJbWFjX3N0YXR1cyA9IHRyMzIoTUFDX1NUQVRVUyk7CisKKwkJaWYgKChzZ19kaWdfc3RhdHVzICYgKDEgPDwgMSkpICYmCisJCSAgICAobWFjX3N0YXR1cyAmIE1BQ19TVEFUVVNfUENTX1NZTkNFRCkpIHsKKwkJCXUzMiBsb2NhbF9hZHYsIHJlbW90ZV9hZHY7CisKKwkJCWxvY2FsX2FkdiA9IEFEVkVSVElTRV9QQVVTRV9DQVA7CisJCQlyZW1vdGVfYWR2ID0gMDsKKwkJCWlmIChzZ19kaWdfc3RhdHVzICYgKDEgPDwgMTkpKQorCQkJCXJlbW90ZV9hZHYgfD0gTFBBX1BBVVNFX0NBUDsKKwkJCWlmIChzZ19kaWdfc3RhdHVzICYgKDEgPDwgMjApKQorCQkJCXJlbW90ZV9hZHYgfD0gTFBBX1BBVVNFX0FTWU07CisKKwkJCXRnM19zZXR1cF9mbG93X2NvbnRyb2wodHAsIGxvY2FsX2FkdiwgcmVtb3RlX2Fkdik7CisJCQljdXJyZW50X2xpbmtfdXAgPSAxOworCQkJdHAtPnRnM19mbGFnczIgJj0gflRHM19GTEcyX1BIWV9KVVNUX0lOSVRURUQ7CisJCX0gZWxzZSBpZiAoIShzZ19kaWdfc3RhdHVzICYgKDEgPDwgMSkpKSB7CisJCQlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfSlVTVF9JTklUVEVEKQorCQkJCXRwLT50ZzNfZmxhZ3MyICY9IH5URzNfRkxHMl9QSFlfSlVTVF9JTklUVEVEOworCQkJZWxzZSB7CisJCQkJaWYgKHdvcmthcm91bmQpIHsKKwkJCQkJdTMyIHZhbCA9IHNlcmRlc19jZmc7CisKKwkJCQkJaWYgKHBvcnRfYSkKKwkJCQkJCXZhbCB8PSAweGMwMTAwMDA7CisJCQkJCWVsc2UKKwkJCQkJCXZhbCB8PSAweDQwMTAwMDA7CisKKwkJCQkJdHczMl9mKE1BQ19TRVJERVNfQ0ZHLCB2YWwpOworCQkJCX0KKworCQkJCXR3MzJfZihTR19ESUdfQ1RSTCwgMHgwMTM4ODQwMCk7CisJCQkJdWRlbGF5KDQwKTsKKworCQkJCS8qIExpbmsgcGFyYWxsZWwgZGV0ZWN0aW9uIC0gbGluayBpcyB1cCAqLworCQkJCS8qIG9ubHkgaWYgd2UgaGF2ZSBQQ1NfU1lOQyBhbmQgbm90ICovCisJCQkJLyogcmVjZWl2aW5nIGNvbmZpZyBjb2RlIHdvcmRzICovCisJCQkJbWFjX3N0YXR1cyA9IHRyMzIoTUFDX1NUQVRVUyk7CisJCQkJaWYgKChtYWNfc3RhdHVzICYgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSAmJgorCQkJCSAgICAhKG1hY19zdGF0dXMgJiBNQUNfU1RBVFVTX1JDVkRfQ0ZHKSkgeworCQkJCQl0ZzNfc2V0dXBfZmxvd19jb250cm9sKHRwLCAwLCAwKTsKKwkJCQkJY3VycmVudF9saW5rX3VwID0gMTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKK291dDoKKwlyZXR1cm4gY3VycmVudF9saW5rX3VwOworfQorCitzdGF0aWMgaW50IHRnM19zZXR1cF9maWJlcl9ieV9oYW5kKHN0cnVjdCB0ZzMgKnRwLCB1MzIgbWFjX3N0YXR1cykKK3sKKwlpbnQgY3VycmVudF9saW5rX3VwID0gMDsKKworIAlpZiAoIShtYWNfc3RhdHVzICYgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSkgeworCQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19HT1RfU0VSREVTX0ZMT1dDVEw7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh0cC0+bGlua19jb25maWcuYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQl1MzIgZmxhZ3M7CisJCWludCBpOworICAKKwkJaWYgKGZpYmVyX2F1dG9uZWcodHAsICZmbGFncykpIHsKKwkJCXUzMiBsb2NhbF9hZHYsIHJlbW90ZV9hZHY7CisKKwkJCWxvY2FsX2FkdiA9IEFEVkVSVElTRV9QQVVTRV9DQVA7CisJCQlyZW1vdGVfYWR2ID0gMDsKKwkJCWlmIChmbGFncyAmIE1SX0xQX0FEVl9TWU1fUEFVU0UpCisJCQkJcmVtb3RlX2FkdiB8PSBMUEFfUEFVU0VfQ0FQOworCQkJaWYgKGZsYWdzICYgTVJfTFBfQURWX0FTWU1fUEFVU0UpCisJCQkJcmVtb3RlX2FkdiB8PSBMUEFfUEFVU0VfQVNZTTsKKworCQkJdGczX3NldHVwX2Zsb3dfY29udHJvbCh0cCwgbG9jYWxfYWR2LCByZW1vdGVfYWR2KTsKKworCQkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19HT1RfU0VSREVTX0ZMT1dDVEw7CisJCQljdXJyZW50X2xpbmtfdXAgPSAxOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCAzMDsgaSsrKSB7CisJCQl1ZGVsYXkoMjApOworCQkJdHczMl9mKE1BQ19TVEFUVVMsCisJCQkgICAgICAgKE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwKKwkJCQlNQUNfU1RBVFVTX0NGR19DSEFOR0VEKSk7CisJCQl1ZGVsYXkoNDApOworCQkJaWYgKCh0cjMyKE1BQ19TVEFUVVMpICYKKwkJCSAgICAgKE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwKKwkJCSAgICAgIE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQpKSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJbWFjX3N0YXR1cyA9IHRyMzIoTUFDX1NUQVRVUyk7CisJCWlmIChjdXJyZW50X2xpbmtfdXAgPT0gMCAmJgorCQkgICAgKG1hY19zdGF0dXMgJiBNQUNfU1RBVFVTX1BDU19TWU5DRUQpICYmCisJCSAgICAhKG1hY19zdGF0dXMgJiBNQUNfU1RBVFVTX1JDVkRfQ0ZHKSkKKwkJCWN1cnJlbnRfbGlua191cCA9IDE7CisJfSBlbHNlIHsKKwkJLyogRm9yY2luZyAxMDAwRkQgbGluayB1cC4gKi8KKwkJY3VycmVudF9saW5rX3VwID0gMTsKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19HT1RfU0VSREVTX0ZMT1dDVEw7CisKKwkJdHczMl9mKE1BQ19NT0RFLCAodHAtPm1hY19tb2RlIHwgTUFDX01PREVfU0VORF9DT05GSUdTKSk7CisJCXVkZWxheSg0MCk7CisJfQorCitvdXQ6CisJcmV0dXJuIGN1cnJlbnRfbGlua191cDsKK30KKworc3RhdGljIGludCB0ZzNfc2V0dXBfZmliZXJfcGh5KHN0cnVjdCB0ZzMgKnRwLCBpbnQgZm9yY2VfcmVzZXQpCit7CisJdTMyIG9yaWdfcGF1c2VfY2ZnOworCXUxNiBvcmlnX2FjdGl2ZV9zcGVlZDsKKwl1OCBvcmlnX2FjdGl2ZV9kdXBsZXg7CisJdTMyIG1hY19zdGF0dXM7CisJaW50IGN1cnJlbnRfbGlua191cDsKKwlpbnQgaTsKKworCW9yaWdfcGF1c2VfY2ZnID0KKwkJKHRwLT50ZzNfZmxhZ3MgJiAoVEczX0ZMQUdfUlhfUEFVU0UgfAorCQkJCSAgVEczX0ZMQUdfVFhfUEFVU0UpKTsKKwlvcmlnX2FjdGl2ZV9zcGVlZCA9IHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQ7CisJb3JpZ19hY3RpdmVfZHVwbGV4ID0gdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXg7CisKKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0hXX0FVVE9ORUcpICYmCisJICAgIG5ldGlmX2NhcnJpZXJfb2sodHAtPmRldikgJiYKKwkgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19JTklUX0NPTVBMRVRFKSkgeworCQltYWNfc3RhdHVzID0gdHIzMihNQUNfU1RBVFVTKTsKKwkJbWFjX3N0YXR1cyAmPSAoTUFDX1NUQVRVU19QQ1NfU1lOQ0VEIHwKKwkJCSAgICAgICBNQUNfU1RBVFVTX1NJR05BTF9ERVQgfAorCQkJICAgICAgIE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQgfAorCQkJICAgICAgIE1BQ19TVEFUVVNfUkNWRF9DRkcpOworCQlpZiAobWFjX3N0YXR1cyA9PSAoTUFDX1NUQVRVU19QQ1NfU1lOQ0VEIHwKKwkJCQkgICBNQUNfU1RBVFVTX1NJR05BTF9ERVQpKSB7CisJCQl0dzMyX2YoTUFDX1NUQVRVUywgKE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwKKwkJCQkJICAgIE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJdHczMl9mKE1BQ19UWF9BVVRPX05FRywgMCk7CisKKwl0cC0+bWFjX21vZGUgJj0gfihNQUNfTU9ERV9QT1JUX01PREVfTUFTSyB8IE1BQ19NT0RFX0hBTEZfRFVQTEVYKTsKKwl0cC0+bWFjX21vZGUgfD0gTUFDX01PREVfUE9SVF9NT0RFX1RCSTsKKwl0dzMyX2YoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisJdWRlbGF5KDQwKTsKKworCWlmICh0cC0+cGh5X2lkID09IFBIWV9JRF9CQ004MDAyKQorCQl0ZzNfaW5pdF9iY204MDAyKHRwKTsKKworCS8qIEVuYWJsZSBsaW5rIGNoYW5nZSBldmVudCBldmVuIHdoZW4gc2VyZGVzIHBvbGxpbmcuICAqLworCXR3MzJfZihNQUNfRVZFTlQsIE1BQ19FVkVOVF9MTktTVEFURV9DSEFOR0VEKTsKKwl1ZGVsYXkoNDApOworCisJY3VycmVudF9saW5rX3VwID0gMDsKKwltYWNfc3RhdHVzID0gdHIzMihNQUNfU1RBVFVTKTsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0hXX0FVVE9ORUcpCisJCWN1cnJlbnRfbGlua191cCA9IHRnM19zZXR1cF9maWJlcl9od19hdXRvbmVnKHRwLCBtYWNfc3RhdHVzKTsKKwllbHNlCisJCWN1cnJlbnRfbGlua191cCA9IHRnM19zZXR1cF9maWJlcl9ieV9oYW5kKHRwLCBtYWNfc3RhdHVzKTsKKworCXRwLT5tYWNfbW9kZSAmPSB+TUFDX01PREVfTElOS19QT0xBUklUWTsKKwl0dzMyX2YoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisJdWRlbGF5KDQwKTsKKworCXRwLT5od19zdGF0dXMtPnN0YXR1cyA9CisJCShTRF9TVEFUVVNfVVBEQVRFRCB8CisJCSAodHAtPmh3X3N0YXR1cy0+c3RhdHVzICYgflNEX1NUQVRVU19MSU5LX0NIRykpOworCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCXR3MzJfZihNQUNfU1RBVFVTLCAoTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQgfAorCQkJCSAgICBNQUNfU1RBVFVTX0NGR19DSEFOR0VEKSk7CisJCXVkZWxheSg1KTsKKwkJaWYgKCh0cjMyKE1BQ19TVEFUVVMpICYgKE1BQ19TVEFUVVNfU1lOQ19DSEFOR0VEIHwKKwkJCQkJIE1BQ19TVEFUVVNfQ0ZHX0NIQU5HRUQpKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJbWFjX3N0YXR1cyA9IHRyMzIoTUFDX1NUQVRVUyk7CisJaWYgKChtYWNfc3RhdHVzICYgTUFDX1NUQVRVU19QQ1NfU1lOQ0VEKSA9PSAwKSB7CisJCWN1cnJlbnRfbGlua191cCA9IDA7CisJCWlmICh0cC0+bGlua19jb25maWcuYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQkJdHczMl9mKE1BQ19NT0RFLCAodHAtPm1hY19tb2RlIHwKKwkJCQkJICBNQUNfTU9ERV9TRU5EX0NPTkZJR1MpKTsKKwkJCXVkZWxheSgxKTsKKwkJCXR3MzJfZihNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKwkJfQorCX0KKworCWlmIChjdXJyZW50X2xpbmtfdXAgPT0gMSkgeworCQl0cC0+bGlua19jb25maWcuYWN0aXZlX3NwZWVkID0gU1BFRURfMTAwMDsKKwkJdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJdHczMihNQUNfTEVEX0NUUkwsICh0cC0+bGVkX2N0cmwgfAorCQkJCSAgICBMRURfQ1RSTF9MTktMRURfT1ZFUlJJREUgfAorCQkJCSAgICBMRURfQ1RSTF8xMDAwTUJQU19PTikpOworCX0gZWxzZSB7CisJCXRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPSBTUEVFRF9JTlZBTElEOworCQl0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleCA9IERVUExFWF9JTlZBTElEOworCQl0dzMyKE1BQ19MRURfQ1RSTCwgKHRwLT5sZWRfY3RybCB8CisJCQkJICAgIExFRF9DVFJMX0xOS0xFRF9PVkVSUklERSB8CisJCQkJICAgIExFRF9DVFJMX1RSQUZGSUNfT1ZFUlJJREUpKTsKKwl9CisKKwlpZiAoY3VycmVudF9saW5rX3VwICE9IG5ldGlmX2NhcnJpZXJfb2sodHAtPmRldikpIHsKKwkJaWYgKGN1cnJlbnRfbGlua191cCkKKwkJCW5ldGlmX2NhcnJpZXJfb24odHAtPmRldik7CisJCWVsc2UKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKHRwLT5kZXYpOworCQl0ZzNfbGlua19yZXBvcnQodHApOworCX0gZWxzZSB7CisJCXUzMiBub3dfcGF1c2VfY2ZnID0KKwkJCXRwLT50ZzNfZmxhZ3MgJiAoVEczX0ZMQUdfUlhfUEFVU0UgfAorCQkJCQkgVEczX0ZMQUdfVFhfUEFVU0UpOworCQlpZiAob3JpZ19wYXVzZV9jZmcgIT0gbm93X3BhdXNlX2NmZyB8fAorCQkgICAgb3JpZ19hY3RpdmVfc3BlZWQgIT0gdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCB8fAorCQkgICAgb3JpZ19hY3RpdmVfZHVwbGV4ICE9IHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4KQorCQkJdGczX2xpbmtfcmVwb3J0KHRwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZzNfc2V0dXBfcGh5KHN0cnVjdCB0ZzMgKnRwLCBpbnQgZm9yY2VfcmVzZXQpCit7CisJaW50IGVycjsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMpIHsKKwkJZXJyID0gdGczX3NldHVwX2ZpYmVyX3BoeSh0cCwgZm9yY2VfcmVzZXQpOworCX0gZWxzZSB7CisJCWVyciA9IHRnM19zZXR1cF9jb3BwZXJfcGh5KHRwLCBmb3JjZV9yZXNldCk7CisJfQorCisJaWYgKHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQgPT0gU1BFRURfMTAwMCAmJgorCSAgICB0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleCA9PSBEVVBMRVhfSEFMRikKKwkJdHczMihNQUNfVFhfTEVOR1RIUywKKwkJICAgICAoKDIgPDwgVFhfTEVOR1RIU19JUEdfQ1JTX1NISUZUKSB8CisJCSAgICAgICg2IDw8IFRYX0xFTkdUSFNfSVBHX1NISUZUKSB8CisJCSAgICAgICgweGZmIDw8IFRYX0xFTkdUSFNfU0xPVF9USU1FX1NISUZUKSkpOworCWVsc2UKKwkJdHczMihNQUNfVFhfTEVOR1RIUywKKwkJICAgICAoKDIgPDwgVFhfTEVOR1RIU19JUEdfQ1JTX1NISUZUKSB8CisJCSAgICAgICg2IDw8IFRYX0xFTkdUSFNfSVBHX1NISUZUKSB8CisJCSAgICAgICgzMiA8PCBUWF9MRU5HVEhTX1NMT1RfVElNRV9TSElGVCkpKTsKKworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKSkgeworCQlpZiAobmV0aWZfY2Fycmllcl9vayh0cC0+ZGV2KSkgeworCQkJdHczMihIT1NUQ0NfU1RBVF9DT0FMX1RJQ0tTLAorCQkJICAgICBERUZBVUxUX1NUQVRfQ09BTF9USUNLUyk7CisJCX0gZWxzZSB7CisJCQl0dzMyKEhPU1RDQ19TVEFUX0NPQUxfVElDS1MsIDApOworCQl9CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyogVGlnb24zIG5ldmVyIHJlcG9ydHMgcGFydGlhbCBwYWNrZXQgc2VuZHMuICBTbyB3ZSBkbyBub3QKKyAqIG5lZWQgc3BlY2lhbCBsb2dpYyB0byBoYW5kbGUgU0tCcyB0aGF0IGhhdmUgbm90IGhhZCBhbGwKKyAqIG9mIHRoZWlyIGZyYWdzIHNlbnQgeWV0LCBsaWtlIFN1bkdFTSBkb2VzLgorICovCitzdGF0aWMgdm9pZCB0ZzNfdHgoc3RydWN0IHRnMyAqdHApCit7CisJdTMyIGh3X2lkeCA9IHRwLT5od19zdGF0dXMtPmlkeFswXS50eF9jb25zdW1lcjsKKwl1MzIgc3dfaWR4ID0gdHAtPnR4X2NvbnM7CisKKwl3aGlsZSAoc3dfaWR4ICE9IGh3X2lkeCkgeworCQlzdHJ1Y3QgdHhfcmluZ19pbmZvICpyaSA9ICZ0cC0+dHhfYnVmZmVyc1tzd19pZHhdOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcmktPnNrYjsKKwkJaW50IGk7CisKKwkJaWYgKHVubGlrZWx5KHNrYiA9PSBOVUxMKSkKKwkJCUJVRygpOworCisJCXBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsCisJCQkJIHBjaV91bm1hcF9hZGRyKHJpLCBtYXBwaW5nKSwKKwkJCQkgc2tiX2hlYWRsZW4oc2tiKSwKKwkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisKKwkJcmktPnNrYiA9IE5VTEw7CisKKwkJc3dfaWR4ID0gTkVYVF9UWChzd19pZHgpOworCisJCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspIHsKKwkJCWlmICh1bmxpa2VseShzd19pZHggPT0gaHdfaWR4KSkKKwkJCQlCVUcoKTsKKworCQkJcmkgPSAmdHAtPnR4X2J1ZmZlcnNbc3dfaWR4XTsKKwkJCWlmICh1bmxpa2VseShyaS0+c2tiICE9IE5VTEwpKQorCQkJCUJVRygpOworCisJCQlwY2lfdW5tYXBfcGFnZSh0cC0+cGRldiwKKwkJCQkgICAgICAgcGNpX3VubWFwX2FkZHIocmksIG1hcHBpbmcpLAorCQkJCSAgICAgICBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemUsCisJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCQlzd19pZHggPSBORVhUX1RYKHN3X2lkeCk7CisJCX0KKworCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCX0KKworCXRwLT50eF9jb25zID0gc3dfaWR4OworCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQodHAtPmRldikgJiYKKwkgICAgKFRYX0JVRkZTX0FWQUlMKHRwKSA+IFRHM19UWF9XQUtFVVBfVEhSRVNIKSkKKwkJbmV0aWZfd2FrZV9xdWV1ZSh0cC0+ZGV2KTsKK30KKworLyogUmV0dXJucyBzaXplIG9mIHNrYiBhbGxvY2F0ZWQgb3IgPCAwIG9uIGVycm9yLgorICoKKyAqIFdlIG9ubHkgbmVlZCB0byBmaWxsIGluIHRoZSBhZGRyZXNzIGJlY2F1c2UgdGhlIG90aGVyIG1lbWJlcnMKKyAqIG9mIHRoZSBSWCBkZXNjcmlwdG9yIGFyZSBpbnZhcmlhbnQsIHNlZSB0ZzNfaW5pdF9yaW5ncy4KKyAqCisgKiBOb3RlIHRoZSBwdXJwb3NlZnVsIGFzc3ltZXRyeSBvZiBjcHUgdnMuIGNoaXAgYWNjZXNzZXMuICBGb3IKKyAqIHBvc3RpbmcgYnVmZmVycyB3ZSBvbmx5IGRpcnR5IHRoZSBmaXJzdCBjYWNoZSBsaW5lIG9mIHRoZSBSWAorICogZGVzY3JpcHRvciAoY29udGFpbmluZyB0aGUgYWRkcmVzcykuICBXaGVyZWFzIGZvciB0aGUgUlggc3RhdHVzCisgKiBidWZmZXJzIHRoZSBjcHUgb25seSByZWFkcyB0aGUgbGFzdCBjYWNoZWxpbmUgb2YgdGhlIFJYIGRlc2NyaXB0b3IKKyAqICh0byBmZXRjaCB0aGUgZXJyb3IgZmxhZ3MsIHZsYW4gdGFnLCBjaGVja3N1bSwgYW5kIG9wYXF1ZSBjb29raWUpLgorICovCitzdGF0aWMgaW50IHRnM19hbGxvY19yeF9za2Ioc3RydWN0IHRnMyAqdHAsIHUzMiBvcGFxdWVfa2V5LAorCQkJICAgIGludCBzcmNfaWR4LCB1MzIgZGVzdF9pZHhfdW5tYXNrZWQpCit7CisJc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgcmluZ19pbmZvICptYXAsICpzcmNfbWFwOworCXN0cnVjdCBza19idWZmICpza2I7CisJZG1hX2FkZHJfdCBtYXBwaW5nOworCWludCBza2Jfc2l6ZSwgZGVzdF9pZHg7CisKKwlzcmNfbWFwID0gTlVMTDsKKwlzd2l0Y2ggKG9wYXF1ZV9rZXkpIHsKKwljYXNlIFJYRF9PUEFRVUVfUklOR19TVEQ6CisJCWRlc3RfaWR4ID0gZGVzdF9pZHhfdW5tYXNrZWQgJSBURzNfUlhfUklOR19TSVpFOworCQlkZXNjID0gJnRwLT5yeF9zdGRbZGVzdF9pZHhdOworCQltYXAgPSAmdHAtPnJ4X3N0ZF9idWZmZXJzW2Rlc3RfaWR4XTsKKwkJaWYgKHNyY19pZHggPj0gMCkKKwkJCXNyY19tYXAgPSAmdHAtPnJ4X3N0ZF9idWZmZXJzW3NyY19pZHhdOworCQlza2Jfc2l6ZSA9IFJYX1BLVF9CVUZfU1o7CisJCWJyZWFrOworCisJY2FzZSBSWERfT1BBUVVFX1JJTkdfSlVNQk86CisJCWRlc3RfaWR4ID0gZGVzdF9pZHhfdW5tYXNrZWQgJSBURzNfUlhfSlVNQk9fUklOR19TSVpFOworCQlkZXNjID0gJnRwLT5yeF9qdW1ib1tkZXN0X2lkeF07CisJCW1hcCA9ICZ0cC0+cnhfanVtYm9fYnVmZmVyc1tkZXN0X2lkeF07CisJCWlmIChzcmNfaWR4ID49IDApCisJCQlzcmNfbWFwID0gJnRwLT5yeF9qdW1ib19idWZmZXJzW3NyY19pZHhdOworCQlza2Jfc2l6ZSA9IFJYX0pVTUJPX1BLVF9CVUZfU1o7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfTsKKworCS8qIERvIG5vdCBvdmVyd3JpdGUgYW55IG9mIHRoZSBtYXAgb3IgcnAgaW5mb3JtYXRpb24KKwkgKiB1bnRpbCB3ZSBhcmUgc3VyZSB3ZSBjYW4gY29tbWl0IHRvIGEgbmV3IGJ1ZmZlci4KKwkgKgorCSAqIENhbGxlcnMgZGVwZW5kIHVwb24gdGhpcyBiZWhhdmlvciBhbmQgYXNzdW1lIHRoYXQKKwkgKiB3ZSBsZWF2ZSBldmVyeXRoaW5nIHVuY2hhbmdlZCBpZiB3ZSBmYWlsLgorCSAqLworCXNrYiA9IGRldl9hbGxvY19za2Ioc2tiX3NpemUpOworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlza2ItPmRldiA9IHRwLT5kZXY7CisJc2tiX3Jlc2VydmUoc2tiLCB0cC0+cnhfb2Zmc2V0KTsKKworCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGRldiwgc2tiLT5kYXRhLAorCQkJCSBza2Jfc2l6ZSAtIHRwLT5yeF9vZmZzZXQsCisJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwltYXAtPnNrYiA9IHNrYjsKKwlwY2lfdW5tYXBfYWRkcl9zZXQobWFwLCBtYXBwaW5nLCBtYXBwaW5nKTsKKworCWlmIChzcmNfbWFwICE9IE5VTEwpCisJCXNyY19tYXAtPnNrYiA9IE5VTEw7CisKKwlkZXNjLT5hZGRyX2hpID0gKCh1NjQpbWFwcGluZyA+PiAzMik7CisJZGVzYy0+YWRkcl9sbyA9ICgodTY0KW1hcHBpbmcgJiAweGZmZmZmZmZmKTsKKworCXJldHVybiBza2Jfc2l6ZTsKK30KKworLyogV2Ugb25seSBuZWVkIHRvIG1vdmUgb3ZlciBpbiB0aGUgYWRkcmVzcyBiZWNhdXNlIHRoZSBvdGhlcgorICogbWVtYmVycyBvZiB0aGUgUlggZGVzY3JpcHRvciBhcmUgaW52YXJpYW50LiAgU2VlIG5vdGVzIGFib3ZlCisgKiB0ZzNfYWxsb2Nfcnhfc2tiIGZvciBmdWxsIGRldGFpbHMuCisgKi8KK3N0YXRpYyB2b2lkIHRnM19yZWN5Y2xlX3J4KHN0cnVjdCB0ZzMgKnRwLCB1MzIgb3BhcXVlX2tleSwKKwkJCSAgIGludCBzcmNfaWR4LCB1MzIgZGVzdF9pZHhfdW5tYXNrZWQpCit7CisJc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYyAqc3JjX2Rlc2MsICpkZXN0X2Rlc2M7CisJc3RydWN0IHJpbmdfaW5mbyAqc3JjX21hcCwgKmRlc3RfbWFwOworCWludCBkZXN0X2lkeDsKKworCXN3aXRjaCAob3BhcXVlX2tleSkgeworCWNhc2UgUlhEX09QQVFVRV9SSU5HX1NURDoKKwkJZGVzdF9pZHggPSBkZXN0X2lkeF91bm1hc2tlZCAlIFRHM19SWF9SSU5HX1NJWkU7CisJCWRlc3RfZGVzYyA9ICZ0cC0+cnhfc3RkW2Rlc3RfaWR4XTsKKwkJZGVzdF9tYXAgPSAmdHAtPnJ4X3N0ZF9idWZmZXJzW2Rlc3RfaWR4XTsKKwkJc3JjX2Rlc2MgPSAmdHAtPnJ4X3N0ZFtzcmNfaWR4XTsKKwkJc3JjX21hcCA9ICZ0cC0+cnhfc3RkX2J1ZmZlcnNbc3JjX2lkeF07CisJCWJyZWFrOworCisJY2FzZSBSWERfT1BBUVVFX1JJTkdfSlVNQk86CisJCWRlc3RfaWR4ID0gZGVzdF9pZHhfdW5tYXNrZWQgJSBURzNfUlhfSlVNQk9fUklOR19TSVpFOworCQlkZXN0X2Rlc2MgPSAmdHAtPnJ4X2p1bWJvW2Rlc3RfaWR4XTsKKwkJZGVzdF9tYXAgPSAmdHAtPnJ4X2p1bWJvX2J1ZmZlcnNbZGVzdF9pZHhdOworCQlzcmNfZGVzYyA9ICZ0cC0+cnhfanVtYm9bc3JjX2lkeF07CisJCXNyY19tYXAgPSAmdHAtPnJ4X2p1bWJvX2J1ZmZlcnNbc3JjX2lkeF07CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX07CisKKwlkZXN0X21hcC0+c2tiID0gc3JjX21hcC0+c2tiOworCXBjaV91bm1hcF9hZGRyX3NldChkZXN0X21hcCwgbWFwcGluZywKKwkJCSAgIHBjaV91bm1hcF9hZGRyKHNyY19tYXAsIG1hcHBpbmcpKTsKKwlkZXN0X2Rlc2MtPmFkZHJfaGkgPSBzcmNfZGVzYy0+YWRkcl9oaTsKKwlkZXN0X2Rlc2MtPmFkZHJfbG8gPSBzcmNfZGVzYy0+YWRkcl9sbzsKKworCXNyY19tYXAtPnNrYiA9IE5VTEw7Cit9CisKKyNpZiBURzNfVkxBTl9UQUdfVVNFRAorc3RhdGljIGludCB0ZzNfdmxhbl9yeChzdHJ1Y3QgdGczICp0cCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IHZsYW5fdGFnKQoreworCXJldHVybiB2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc2tiLCB0cC0+dmxncnAsIHZsYW5fdGFnKTsKK30KKyNlbmRpZgorCisvKiBUaGUgUlggcmluZyBzY2hlbWUgaXMgY29tcG9zZWQgb2YgbXVsdGlwbGUgcmluZ3Mgd2hpY2ggcG9zdCBmcmVzaAorICogYnVmZmVycyB0byB0aGUgY2hpcCwgYW5kIG9uZSBzcGVjaWFsIHJpbmcgdGhlIGNoaXAgdXNlcyB0byByZXBvcnQKKyAqIHN0YXR1cyBiYWNrIHRvIHRoZSBob3N0LgorICoKKyAqIFRoZSBzcGVjaWFsIHJpbmcgcmVwb3J0cyB0aGUgc3RhdHVzIG9mIHJlY2VpdmVkIHBhY2tldHMgdG8gdGhlCisgKiBob3N0LiAgVGhlIGNoaXAgZG9lcyBub3Qgd3JpdGUgaW50byB0aGUgb3JpZ2luYWwgZGVzY3JpcHRvciB0aGUKKyAqIFJYIGJ1ZmZlciB3YXMgb2J0YWluZWQgZnJvbS4gIFRoZSBjaGlwIHNpbXBseSB0YWtlcyB0aGUgb3JpZ2luYWwKKyAqIGRlc2NyaXB0b3IgYXMgcHJvdmlkZWQgYnkgdGhlIGhvc3QsIHVwZGF0ZXMgdGhlIHN0YXR1cyBhbmQgbGVuZ3RoCisgKiBmaWVsZCwgdGhlbiB3cml0ZXMgdGhpcyBpbnRvIHRoZSBuZXh0IHN0YXR1cyByaW5nIGVudHJ5LgorICoKKyAqIEVhY2ggcmluZyB0aGUgaG9zdCB1c2VzIHRvIHBvc3QgYnVmZmVycyB0byB0aGUgY2hpcCBpcyBkZXNjcmliZWQKKyAqIGJ5IGEgVEczX0JESU5GTyBlbnRyeSBpbiB0aGUgY2hpcHMgU1JBTSBhcmVhLiAgV2hlbiBhIHBhY2tldCBhcnJpdmVzLAorICogaXQgaXMgZmlyc3QgcGxhY2VkIGludG8gdGhlIG9uLWNoaXAgcmFtLiAgV2hlbiB0aGUgcGFja2V0J3MgbGVuZ3RoCisgKiBpcyBrbm93biwgaXQgd2Fsa3MgZG93biB0aGUgVEczX0JESU5GTyBlbnRyaWVzIHRvIHNlbGVjdCB0aGUgcmluZy4KKyAqIEVhY2ggVEczX0JESU5GTyBzcGVjaWZpZXMgYSBNQVhMRU4gZmllbGQgYW5kIHRoZSBmaXJzdCBURzNfQkRJTkZPCisgKiB3aGljaCBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIHRoZSBuZXcgcGFja2V0J3MgbGVuZ3RoIGlzIGNob3Nlbi4KKyAqCisgKiBUaGUgInNlcGFyYXRlIHJpbmcgZm9yIHJ4IHN0YXR1cyIgc2NoZW1lIG1heSBzb3VuZCBxdWVlciwgYnV0IGl0IG1ha2VzCisgKiBzZW5zZSBmcm9tIGEgY2FjaGUgY29oZXJlbmN5IHBlcnNwZWN0aXZlLiAgSWYgb25seSB0aGUgaG9zdCB3cml0ZXMKKyAqIHRvIHRoZSBidWZmZXIgcG9zdCByaW5ncywgYW5kIG9ubHkgdGhlIGNoaXAgd3JpdGVzIHRvIHRoZSByeCBzdGF0dXMKKyAqIHJpbmdzLCB0aGVuIGNhY2hlIGxpbmVzIG5ldmVyIG1vdmUgYmV5b25kIHNoYXJlZC1tb2RpZmllZCBzdGF0ZS4KKyAqIElmIGJvdGggdGhlIGhvc3QgYW5kIGNoaXAgd2VyZSB0byB3cml0ZSBpbnRvIHRoZSBzYW1lIHJpbmcsIGNhY2hlIGxpbmUKKyAqIGV2aWN0aW9uIGNvdWxkIG9jY3VyIHNpbmNlIGJvdGggZW50aXRpZXMgd2FudCBpdCBpbiBhbiBleGNsdXNpdmUgc3RhdGUuCisgKi8KK3N0YXRpYyBpbnQgdGczX3J4KHN0cnVjdCB0ZzMgKnRwLCBpbnQgYnVkZ2V0KQoreworCXUzMiB3b3JrX21hc2s7CisJdTMyIHJ4X3JjYl9wdHIgPSB0cC0+cnhfcmNiX3B0cjsKKwl1MTYgaHdfaWR4LCBzd19pZHg7CisJaW50IHJlY2VpdmVkOworCisJaHdfaWR4ID0gdHAtPmh3X3N0YXR1cy0+aWR4WzBdLnJ4X3Byb2R1Y2VyOworCS8qCisJICogV2UgbmVlZCB0byBvcmRlciB0aGUgcmVhZCBvZiBod19pZHggYW5kIHRoZSByZWFkIG9mCisJICogdGhlIG9wYXF1ZSBjb29raWUuCisJICovCisJcm1iKCk7CisJc3dfaWR4ID0gcnhfcmNiX3B0ciAlIFRHM19SWF9SQ0JfUklOR19TSVpFKHRwKTsKKwl3b3JrX21hc2sgPSAwOworCXJlY2VpdmVkID0gMDsKKwl3aGlsZSAoc3dfaWR4ICE9IGh3X2lkeCAmJiBidWRnZXQgPiAwKSB7CisJCXN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MgKmRlc2MgPSAmdHAtPnJ4X3JjYltzd19pZHhdOworCQl1bnNpZ25lZCBpbnQgbGVuOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlkbWFfYWRkcl90IGRtYV9hZGRyOworCQl1MzIgb3BhcXVlX2tleSwgZGVzY19pZHgsICpwb3N0X3B0cjsKKworCQlkZXNjX2lkeCA9IGRlc2MtPm9wYXF1ZSAmIFJYRF9PUEFRVUVfSU5ERVhfTUFTSzsKKwkJb3BhcXVlX2tleSA9IGRlc2MtPm9wYXF1ZSAmIFJYRF9PUEFRVUVfUklOR19NQVNLOworCQlpZiAob3BhcXVlX2tleSA9PSBSWERfT1BBUVVFX1JJTkdfU1REKSB7CisJCQlkbWFfYWRkciA9IHBjaV91bm1hcF9hZGRyKCZ0cC0+cnhfc3RkX2J1ZmZlcnNbZGVzY19pZHhdLAorCQkJCQkJICBtYXBwaW5nKTsKKwkJCXNrYiA9IHRwLT5yeF9zdGRfYnVmZmVyc1tkZXNjX2lkeF0uc2tiOworCQkJcG9zdF9wdHIgPSAmdHAtPnJ4X3N0ZF9wdHI7CisJCX0gZWxzZSBpZiAob3BhcXVlX2tleSA9PSBSWERfT1BBUVVFX1JJTkdfSlVNQk8pIHsKKwkJCWRtYV9hZGRyID0gcGNpX3VubWFwX2FkZHIoJnRwLT5yeF9qdW1ib19idWZmZXJzW2Rlc2NfaWR4XSwKKwkJCQkJCSAgbWFwcGluZyk7CisJCQlza2IgPSB0cC0+cnhfanVtYm9fYnVmZmVyc1tkZXNjX2lkeF0uc2tiOworCQkJcG9zdF9wdHIgPSAmdHAtPnJ4X2p1bWJvX3B0cjsKKwkJfQorCQllbHNlIHsKKwkJCWdvdG8gbmV4dF9wa3Rfbm9wb3N0OworCQl9CisKKwkJd29ya19tYXNrIHw9IG9wYXF1ZV9rZXk7CisKKwkJaWYgKChkZXNjLT5lcnJfdmxhbiAmIFJYRF9FUlJfTUFTSykgIT0gMCAmJgorCQkgICAgKGRlc2MtPmVycl92bGFuICE9IFJYRF9FUlJfT0REX05JQkJMRV9SQ1ZEX01JSSkpIHsKKwkJZHJvcF9pdDoKKwkJCXRnM19yZWN5Y2xlX3J4KHRwLCBvcGFxdWVfa2V5LAorCQkJCSAgICAgICBkZXNjX2lkeCwgKnBvc3RfcHRyKTsKKwkJZHJvcF9pdF9ub19yZWN5Y2xlOgorCQkJLyogT3RoZXIgc3RhdGlzdGljcyBrZXB0IHRyYWNrIG9mIGJ5IGNhcmQuICovCisJCQl0cC0+bmV0X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWdvdG8gbmV4dF9wa3Q7CisJCX0KKworCQlsZW4gPSAoKGRlc2MtPmlkeF9sZW4gJiBSWERfTEVOX01BU0spID4+IFJYRF9MRU5fU0hJRlQpIC0gNDsgLyogb21pdCBjcmMgKi8KKworCQlpZiAobGVuID4gUlhfQ09QWV9USFJFU0hPTEQgCisJCQkmJiB0cC0+cnhfb2Zmc2V0ID09IDIKKwkJCS8qIHJ4X29mZnNldCAhPSAyIGlmZiB0aGlzIGlzIGEgNTcwMSBjYXJkIHJ1bm5pbmcKKwkJCSAqIGluIFBDSS1YIG1vZGUgW3NlZSB0ZzNfZ2V0X2ludmFyaWFudHMoKV0gKi8KKwkJKSB7CisJCQlpbnQgc2tiX3NpemU7CisKKwkJCXNrYl9zaXplID0gdGczX2FsbG9jX3J4X3NrYih0cCwgb3BhcXVlX2tleSwKKwkJCQkJCSAgICBkZXNjX2lkeCwgKnBvc3RfcHRyKTsKKwkJCWlmIChza2Jfc2l6ZSA8IDApCisJCQkJZ290byBkcm9wX2l0OworCisJCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCBkbWFfYWRkciwKKwkJCQkJIHNrYl9zaXplIC0gdHAtPnJ4X29mZnNldCwKKwkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJCXNrYl9wdXQoc2tiLCBsZW4pOworCQl9IGVsc2UgeworCQkJc3RydWN0IHNrX2J1ZmYgKmNvcHlfc2tiOworCisJCQl0ZzNfcmVjeWNsZV9yeCh0cCwgb3BhcXVlX2tleSwKKwkJCQkgICAgICAgZGVzY19pZHgsICpwb3N0X3B0cik7CisKKwkJCWNvcHlfc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyAyKTsKKwkJCWlmIChjb3B5X3NrYiA9PSBOVUxMKQorCQkJCWdvdG8gZHJvcF9pdF9ub19yZWN5Y2xlOworCisJCQljb3B5X3NrYi0+ZGV2ID0gdHAtPmRldjsKKwkJCXNrYl9yZXNlcnZlKGNvcHlfc2tiLCAyKTsKKwkJCXNrYl9wdXQoY29weV9za2IsIGxlbik7CisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUodHAtPnBkZXYsIGRtYV9hZGRyLCBsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQltZW1jcHkoY29weV9za2ItPmRhdGEsIHNrYi0+ZGF0YSwgbGVuKTsKKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSh0cC0+cGRldiwgZG1hX2FkZHIsIGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJLyogV2UnbGwgcmV1c2UgdGhlIG9yaWdpbmFsIHJpbmcgYnVmZmVyLiAqLworCQkJc2tiID0gY29weV9za2I7CisJCX0KKworCQlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19SWF9DSEVDS1NVTVMpICYmCisJCSAgICAoZGVzYy0+dHlwZV9mbGFncyAmIFJYRF9GTEFHX1RDUFVEUF9DU1VNKSAmJgorCQkgICAgKCgoZGVzYy0+aXBfdGNwX2NzdW0gJiBSWERfVENQQ1NVTV9NQVNLKQorCQkgICAgICA+PiBSWERfVENQQ1NVTV9TSElGVCkgPT0gMHhmZmZmKSkKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCWVsc2UKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCB0cC0+ZGV2KTsKKyNpZiBURzNfVkxBTl9UQUdfVVNFRAorCQlpZiAodHAtPnZsZ3JwICE9IE5VTEwgJiYKKwkJICAgIGRlc2MtPnR5cGVfZmxhZ3MgJiBSWERfRkxBR19WTEFOKSB7CisJCQl0ZzNfdmxhbl9yeCh0cCwgc2tiLAorCQkJCSAgICBkZXNjLT5lcnJfdmxhbiAmIFJYRF9WTEFOX01BU0spOworCQl9IGVsc2UKKyNlbmRpZgorCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKworCQl0cC0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJcmVjZWl2ZWQrKzsKKwkJYnVkZ2V0LS07CisKK25leHRfcGt0OgorCQkoKnBvc3RfcHRyKSsrOworbmV4dF9wa3Rfbm9wb3N0OgorCQlyeF9yY2JfcHRyKys7CisJCXN3X2lkeCA9IHJ4X3JjYl9wdHIgJSBURzNfUlhfUkNCX1JJTkdfU0laRSh0cCk7CisJfQorCisJLyogQUNLIHRoZSBzdGF0dXMgcmluZy4gKi8KKwl0cC0+cnhfcmNiX3B0ciA9IHJ4X3JjYl9wdHI7CisJdHczMl9yeF9tYm94KE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMCArIFRHM182NEJJVF9SRUdfTE9XLAorCQkgICAgIChyeF9yY2JfcHRyICUgVEczX1JYX1JDQl9SSU5HX1NJWkUodHApKSk7CisKKwkvKiBSZWZpbGwgUlggcmluZyhzKS4gKi8KKwlpZiAod29ya19tYXNrICYgUlhEX09QQVFVRV9SSU5HX1NURCkgeworCQlzd19pZHggPSB0cC0+cnhfc3RkX3B0ciAlIFRHM19SWF9SSU5HX1NJWkU7CisJCXR3MzJfcnhfbWJveChNQUlMQk9YX1JDVl9TVERfUFJPRF9JRFggKyBURzNfNjRCSVRfUkVHX0xPVywKKwkJCSAgICAgc3dfaWR4KTsKKwl9CisJaWYgKHdvcmtfbWFzayAmIFJYRF9PUEFRVUVfUklOR19KVU1CTykgeworCQlzd19pZHggPSB0cC0+cnhfanVtYm9fcHRyICUgVEczX1JYX0pVTUJPX1JJTkdfU0laRTsKKwkJdHczMl9yeF9tYm94KE1BSUxCT1hfUkNWX0pVTUJPX1BST0RfSURYICsgVEczXzY0QklUX1JFR19MT1csCisJCQkgICAgIHN3X2lkeCk7CisJfQorCW1taW93YigpOworCisJcmV0dXJuIHJlY2VpdmVkOworfQorCitzdGF0aWMgaW50IHRnM19wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCAqYnVkZ2V0KQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgdGczX2h3X3N0YXR1cyAqc2JsayA9IHRwLT5od19zdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZG9uZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJLyogaGFuZGxlIGxpbmsgY2hhbmdlIGFuZCBvdGhlciBwaHkgZXZlbnRzICovCisJaWYgKCEodHAtPnRnM19mbGFncyAmCisJICAgICAgKFRHM19GTEFHX1VTRV9MSU5LQ0hHX1JFRyB8CisJICAgICAgIFRHM19GTEFHX1BPTExfU0VSREVTKSkpIHsKKwkJaWYgKHNibGstPnN0YXR1cyAmIFNEX1NUQVRVU19MSU5LX0NIRykgeworCQkJc2Jsay0+c3RhdHVzID0gU0RfU1RBVFVTX1VQREFURUQgfAorCQkJCShzYmxrLT5zdGF0dXMgJiB+U0RfU1RBVFVTX0xJTktfQ0hHKTsKKwkJCXRnM19zZXR1cF9waHkodHAsIDApOworCQl9CisJfQorCisJLyogcnVuIFRYIGNvbXBsZXRpb24gdGhyZWFkICovCisJaWYgKHNibGstPmlkeFswXS50eF9jb25zdW1lciAhPSB0cC0+dHhfY29ucykgeworCQlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKwkJdGczX3R4KHRwKTsKKwkJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJLyogcnVuIFJYIHRocmVhZCwgd2l0aGluIHRoZSBib3VuZHMgc2V0IGJ5IE5BUEkuCisJICogQWxsIFJYICJsb2NraW5nIiBpcyBkb25lIGJ5IGVuc3VyaW5nIG91dHNpZGUKKwkgKiBjb2RlIHN5bmNocm9uaXplcyB3aXRoIGRldi0+cG9sbCgpCisJICovCisJZG9uZSA9IDE7CisJaWYgKHNibGstPmlkeFswXS5yeF9wcm9kdWNlciAhPSB0cC0+cnhfcmNiX3B0cikgeworCQlpbnQgb3JpZ19idWRnZXQgPSAqYnVkZ2V0OworCQlpbnQgd29ya19kb25lOworCisJCWlmIChvcmlnX2J1ZGdldCA+IG5ldGRldi0+cXVvdGEpCisJCQlvcmlnX2J1ZGdldCA9IG5ldGRldi0+cXVvdGE7CisKKwkJd29ya19kb25lID0gdGczX3J4KHRwLCBvcmlnX2J1ZGdldCk7CisKKwkJKmJ1ZGdldCAtPSB3b3JrX2RvbmU7CisJCW5ldGRldi0+cXVvdGEgLT0gd29ya19kb25lOworCisJCWlmICh3b3JrX2RvbmUgPj0gb3JpZ19idWRnZXQpCisJCQlkb25lID0gMDsKKwl9CisKKwkvKiBpZiBubyBtb3JlIHdvcmssIHRlbGwgbmV0IHN0YWNrIGFuZCBOSUMgd2UncmUgZG9uZSAqLworCWlmIChkb25lKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+bG9jaywgZmxhZ3MpOworCQlfX25ldGlmX3J4X2NvbXBsZXRlKG5ldGRldik7CisJCXRnM19yZXN0YXJ0X2ludHModHApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiAoZG9uZSA/IDAgOiAxKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdGczX2hhc193b3JrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB0ZzMgKnRwKQoreworCXN0cnVjdCB0ZzNfaHdfc3RhdHVzICpzYmxrID0gdHAtPmh3X3N0YXR1czsKKwl1bnNpZ25lZCBpbnQgd29ya19leGlzdHMgPSAwOworCisJLyogY2hlY2sgZm9yIHBoeSBldmVudHMgKi8KKwlpZiAoISh0cC0+dGczX2ZsYWdzICYKKwkgICAgICAoVEczX0ZMQUdfVVNFX0xJTktDSEdfUkVHIHwKKwkgICAgICAgVEczX0ZMQUdfUE9MTF9TRVJERVMpKSkgeworCQlpZiAoc2Jsay0+c3RhdHVzICYgU0RfU1RBVFVTX0xJTktfQ0hHKQorCQkJd29ya19leGlzdHMgPSAxOworCX0KKwkvKiBjaGVjayBmb3IgUlgvVFggd29yayB0byBkbyAqLworCWlmIChzYmxrLT5pZHhbMF0udHhfY29uc3VtZXIgIT0gdHAtPnR4X2NvbnMgfHwKKwkgICAgc2Jsay0+aWR4WzBdLnJ4X3Byb2R1Y2VyICE9IHRwLT5yeF9yY2JfcHRyKQorCQl3b3JrX2V4aXN0cyA9IDE7CisKKwlyZXR1cm4gd29ya19leGlzdHM7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB0ZzNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHRnM19od19zdGF0dXMgKnNibGsgPSB0cC0+aHdfc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGhhbmRsZWQgPSAxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBJbiBJTlR4IG1vZGUsIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgaW50ZXJydXB0IHRvIGFycml2ZSBhdAorCSAqIHRoZSBDUFUgYmVmb3JlIHRoZSBzdGF0dXMgYmxvY2sgcG9zdGVkIHByaW9yIHRvIHRoZSBpbnRlcnJ1cHQuCisJICogUmVhZGluZyB0aGUgUENJIFN0YXRlIHJlZ2lzdGVyIHdpbGwgY29uZmlybSB3aGV0aGVyIHRoZQorCSAqIGludGVycnVwdCBpcyBvdXJzIGFuZCB3aWxsIGZsdXNoIHRoZSBzdGF0dXMgYmxvY2suCisJICovCisJaWYgKChzYmxrLT5zdGF0dXMgJiBTRF9TVEFUVVNfVVBEQVRFRCkgfHwKKwkgICAgISh0cjMyKFRHM1BDSV9QQ0lTVEFURSkgJiBQQ0lTVEFURV9JTlRfTk9UX0FDVElWRSkpIHsKKwkJLyoKKwkJICogd3JpdGluZyBhbnkgdmFsdWUgdG8gaW50ci1tYm94LTAgY2xlYXJzIFBDSSBJTlRBIyBhbmQKKwkJICogY2hpcC1pbnRlcm5hbCBpbnRlcnJ1cHQgcGVuZGluZyBldmVudHMuCisJCSAqIHdyaXRpbmcgbm9uLXplcm8gdG8gaW50ci1tYm94LTAgYWRkaXRpb25hbCB0ZWxscyB0aGUKKwkJICogTklDIHRvIHN0b3Agc2VuZGluZyB1cyBpcnFzLCBlbmdhZ2luZyAiaW4taW50ci1oYW5kbGVyIgorCQkgKiBldmVudCBjb2FsZXNjaW5nLgorCQkgKi8KKwkJdHczMl9tYWlsYm94KE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVywKKwkJCSAgICAgMHgwMDAwMDAwMSk7CisJCS8qCisJCSAqIEZsdXNoIFBDSSB3cml0ZS4gIFRoaXMgYWxzbyBndWFyYW50ZWVzIHRoYXQgb3VyCisJCSAqIHN0YXR1cyBibG9jayBoYXMgYmVlbiBmbHVzaGVkIHRvIGhvc3QgbWVtb3J5LgorCQkgKi8KKwkJdHIzMihNQUlMQk9YX0lOVEVSUlVQVF8wICsgVEczXzY0QklUX1JFR19MT1cpOworCQlzYmxrLT5zdGF0dXMgJj0gflNEX1NUQVRVU19VUERBVEVEOworCisJCWlmIChsaWtlbHkodGczX2hhc193b3JrKGRldiwgdHApKSkKKwkJCW5ldGlmX3J4X3NjaGVkdWxlKGRldik7CQkvKiBzY2hlZHVsZSBOQVBJIHBvbGwgKi8KKwkJZWxzZSB7CisJCQkvKiBubyB3b3JrLCBzaGFyZWQgaW50ZXJydXB0IHBlcmhhcHM/ICByZS1lbmFibGUKKwkJCSAqIGludGVycnVwdHMsIGFuZCBmbHVzaCB0aGF0IFBDSSB3cml0ZQorCQkJICovCisJCQl0dzMyX21haWxib3goTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XLAorCQkJICAgICAJMHgwMDAwMDAwMCk7CisJCQl0cjMyKE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVyk7CisJCX0KKwl9IGVsc2UgewkvKiBzaGFyZWQgaW50ZXJydXB0ICovCisJCWhhbmRsZWQgPSAwOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIGludCB0ZzNfaW5pdF9odyhzdHJ1Y3QgdGczICopOworc3RhdGljIGludCB0ZzNfaGFsdChzdHJ1Y3QgdGczICopOworCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIHRnM19wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl0ZzNfaW50ZXJydXB0KGRldi0+aXJxLCBkZXYsIE5VTEwpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHRnM19yZXNldF90YXNrKHZvaWQgKl9kYXRhKQoreworCXN0cnVjdCB0ZzMgKnRwID0gX2RhdGE7CisJdW5zaWduZWQgaW50IHJlc3RhcnRfdGltZXI7CisKKwl0ZzNfbmV0aWZfc3RvcCh0cCk7CisKKwlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisKKwlyZXN0YXJ0X3RpbWVyID0gdHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9SRVNUQVJUX1RJTUVSOworCXRwLT50ZzNfZmxhZ3MyICY9IH5URzNfRkxHMl9SRVNUQVJUX1RJTUVSOworCisJdGczX2hhbHQodHApOworCXRnM19pbml0X2h3KHRwKTsKKworCXRnM19uZXRpZl9zdGFydCh0cCk7CisKKwlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCisJaWYgKHJlc3RhcnRfdGltZXIpCisJCW1vZF90aW1lcigmdHAtPnRpbWVyLCBqaWZmaWVzICsgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHRnM190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgcmVzZXR0aW5nXG4iLAorCSAgICAgICBkZXYtPm5hbWUpOworCisJc2NoZWR1bGVfd29yaygmdHAtPnJlc2V0X3Rhc2spOworfQorCitzdGF0aWMgdm9pZCB0ZzNfc2V0X3R4ZChzdHJ1Y3QgdGczICosIGludCwgZG1hX2FkZHJfdCwgaW50LCB1MzIsIHUzMik7CisKK3N0YXRpYyBpbnQgdGlnb24zXzRnYl9od2J1Z193b3JrYXJvdW5kKHN0cnVjdCB0ZzMgKnRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgICB1MzIgZ3VpbHR5X2VudHJ5LCBpbnQgZ3VpbHR5X2xlbiwKKwkJCQkgICAgICAgdTMyIGxhc3RfcGx1c19vbmUsIHUzMiAqc3RhcnQsIHUzMiBtc3MpCit7CisJc3RydWN0IHNrX2J1ZmYgKm5ld19za2IgPSBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOworCWRtYV9hZGRyX3QgbmV3X2FkZHI7CisJdTMyIGVudHJ5ID0gKnN0YXJ0OworCWludCBpOworCisJaWYgKCFuZXdfc2tiKSB7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIE5ldyBTS0IgaXMgZ3VhcmFudGVlZCB0byBiZSBsaW5lYXIuICovCisJZW50cnkgPSAqc3RhcnQ7CisJbmV3X2FkZHIgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGRldiwgbmV3X3NrYi0+ZGF0YSwgbmV3X3NrYi0+bGVuLAorCQkJCSAgUENJX0RNQV9UT0RFVklDRSk7CisJdGczX3NldF90eGQodHAsIGVudHJ5LCBuZXdfYWRkciwgbmV3X3NrYi0+bGVuLAorCQkgICAgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0hXKSA/CisJCSAgICBUWERfRkxBR19UQ1BVRFBfQ1NVTSA6IDAsIDEgfCAobXNzIDw8IDEpKTsKKwkqc3RhcnQgPSBORVhUX1RYKGVudHJ5KTsKKworCS8qIE5vdyBjbGVhbiB1cCB0aGUgc3cgcmluZyBlbnRyaWVzLiAqLworCWkgPSAwOworCXdoaWxlIChlbnRyeSAhPSBsYXN0X3BsdXNfb25lKSB7CisJCWludCBsZW47CisKKwkJaWYgKGkgPT0gMCkKKwkJCWxlbiA9IHNrYl9oZWFkbGVuKHNrYik7CisJCWVsc2UKKwkJCWxlbiA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaS0xXS5zaXplOworCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LAorCQkJCSBwY2lfdW5tYXBfYWRkcigmdHAtPnR4X2J1ZmZlcnNbZW50cnldLCBtYXBwaW5nKSwKKwkJCQkgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJaWYgKGkgPT0gMCkgeworCQkJdHAtPnR4X2J1ZmZlcnNbZW50cnldLnNrYiA9IG5ld19za2I7CisJCQlwY2lfdW5tYXBfYWRkcl9zZXQoJnRwLT50eF9idWZmZXJzW2VudHJ5XSwgbWFwcGluZywgbmV3X2FkZHIpOworCQl9IGVsc2UgeworCQkJdHAtPnR4X2J1ZmZlcnNbZW50cnldLnNrYiA9IE5VTEw7CisJCX0KKwkJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKKwkJaSsrOworCX0KKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZzNfc2V0X3R4ZChzdHJ1Y3QgdGczICp0cCwgaW50IGVudHJ5LAorCQkJZG1hX2FkZHJfdCBtYXBwaW5nLCBpbnQgbGVuLCB1MzIgZmxhZ3MsCisJCQl1MzIgbXNzX2FuZF9pc19lbmQpCit7CisJc3RydWN0IHRnM190eF9idWZmZXJfZGVzYyAqdHhkID0gJnRwLT50eF9yaW5nW2VudHJ5XTsKKwlpbnQgaXNfZW5kID0gKG1zc19hbmRfaXNfZW5kICYgMHgxKTsKKwl1MzIgbXNzID0gKG1zc19hbmRfaXNfZW5kID4+IDEpOworCXUzMiB2bGFuX3RhZyA9IDA7CisKKwlpZiAoaXNfZW5kKQorCQlmbGFncyB8PSBUWERfRkxBR19FTkQ7CisJaWYgKGZsYWdzICYgVFhEX0ZMQUdfVkxBTikgeworCQl2bGFuX3RhZyA9IGZsYWdzID4+IDE2OworCQlmbGFncyAmPSAweGZmZmY7CisJfQorCXZsYW5fdGFnIHw9IChtc3MgPDwgVFhEX01TU19TSElGVCk7CisKKwl0eGQtPmFkZHJfaGkgPSAoKHU2NCkgbWFwcGluZyA+PiAzMik7CisJdHhkLT5hZGRyX2xvID0gKCh1NjQpIG1hcHBpbmcgJiAweGZmZmZmZmZmKTsKKwl0eGQtPmxlbl9mbGFncyA9IChsZW4gPDwgVFhEX0xFTl9TSElGVCkgfCBmbGFnczsKKwl0eGQtPnZsYW5fdGFnID0gdmxhbl90YWcgPDwgVFhEX1ZMQU5fVEFHX1NISUZUOworfQorCitzdGF0aWMgaW5saW5lIGludCB0ZzNfNGdfb3ZlcmZsb3dfdGVzdChkbWFfYWRkcl90IG1hcHBpbmcsIGludCBsZW4pCit7CisJdTMyIGJhc2UgPSAodTMyKSBtYXBwaW5nICYgMHhmZmZmZmZmZjsKKworCXJldHVybiAoKGJhc2UgPiAweGZmZmZkY2MwKSAmJgorCQkoYmFzZSArIGxlbiArIDggPCBiYXNlKSk7Cit9CisKK3N0YXRpYyBpbnQgdGczX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJZG1hX2FkZHJfdCBtYXBwaW5nOworCXVuc2lnbmVkIGludCBpOworCXUzMiBsZW4sIGVudHJ5LCBiYXNlX2ZsYWdzLCBtc3M7CisJaW50IHdvdWxkX2hpdF9od2J1ZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKKworCS8qIE5vIEJIIGRpc2FibGluZyBmb3IgdHhfbG9jayBoZXJlLiAgV2UgYXJlIHJ1bm5pbmcgaW4gQkggZGlzYWJsZWQKKwkgKiBjb250ZXh0IGFuZCBUWCByZWNsYWltIHJ1bnMgdmlhIHRwLT5wb2xsIGluc2lkZSBvZiBhIHNvZnR3YXJlCisJICogaW50ZXJydXB0LiAgUmVqb2ljZSEKKwkgKgorCSAqIEFjdHVhbGx5LCB0aGluZ3MgYXJlIG5vdCBzbyBzaW1wbGUuICBJZiB3ZSBhcmUgdG8gdGFrZSBhIGh3CisJICogSVJRIGhlcmUsIHdlIGNhbiBkZWFkbG9jaywgY29uc2lkZXI6CisJICoKKwkgKiAgICAgICBDUFUxCQlDUFUyCisJICogICB0ZzNfc3RhcnRfeG1pdAorCSAqICAgdGFrZSB0cC0+dHhfbG9jaworCSAqCQkJdGczX3RpbWVyCisJICoJCQl0YWtlIHRwLT5sb2NrCisJICogICB0ZzNfaW50ZXJydXB0CisJICogICBzcGluIG9uIHRwLT5sb2NrCisJICoJCQlzcGluIG9uIHRwLT50eF9sb2NrCisJICoKKwkgKiBTbyB3ZSByZWFsbHkgZG8gbmVlZCB0byBkaXNhYmxlIGludGVycnVwdHMgd2hlbiB0YWtpbmcKKwkgKiB0eF9sb2NrIGhlcmUuCisJICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmICghc3Bpbl90cnlsb2NrKCZ0cC0+dHhfbG9jaykpIHsgCisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9MT0NLRUQ7IAorCX0gCisKKwkvKiBUaGlzIGlzIGEgaGFyZCBlcnJvciwgbG9nIGl0LiAqLworCWlmICh1bmxpa2VseShUWF9CVUZGU19BVkFJTCh0cCkgPD0gKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgKyAxKSkpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+dHhfbG9jaywgZmxhZ3MpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogQlVHISBUeCBSaW5nIGZ1bGwgd2hlbiBxdWV1ZSBhd2FrZSFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CisJfQorCisJZW50cnkgPSB0cC0+dHhfcHJvZDsKKwliYXNlX2ZsYWdzID0gMDsKKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpCisJCWJhc2VfZmxhZ3MgfD0gVFhEX0ZMQUdfVENQVURQX0NTVU07CisjaWYgVEczX1RTT19TVVBQT1JUICE9IDAKKwltc3MgPSAwOworCWlmIChza2ItPmxlbiA+ICh0cC0+ZGV2LT5tdHUgKyBFVEhfSExFTikgJiYKKwkgICAgKG1zcyA9IHNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemUpICE9IDApIHsKKwkJaW50IHRjcF9vcHRfbGVuLCBpcF90Y3BfbGVuOworCisJCWlmIChza2JfaGVhZGVyX2Nsb25lZChza2IpICYmCisJCSAgICBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgMCwgR0ZQX0FUT01JQykpIHsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCisJCXRjcF9vcHRfbGVuID0gKChza2ItPmgudGgtPmRvZmYgLSA1KSAqIDQpOworCQlpcF90Y3BfbGVuID0gKHNrYi0+bmguaXBoLT5paGwgKiA0KSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKKworCQliYXNlX2ZsYWdzIHw9IChUWERfRkxBR19DUFVfUFJFX0RNQSB8CisJCQkgICAgICAgVFhEX0ZMQUdfQ1BVX1BPU1RfRE1BKTsKKworCQlza2ItPm5oLmlwaC0+Y2hlY2sgPSAwOworCQlza2ItPm5oLmlwaC0+dG90X2xlbiA9IG50b2hzKG1zcyArIGlwX3RjcF9sZW4gKyB0Y3Bfb3B0X2xlbik7CisJCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0hXX1RTTykgeworCQkJc2tiLT5oLnRoLT5jaGVjayA9IDA7CisJCQliYXNlX2ZsYWdzICY9IH5UWERfRkxBR19UQ1BVRFBfQ1NVTTsKKwkJfQorCQllbHNlIHsKKwkJCXNrYi0+aC50aC0+Y2hlY2sgPQorCQkJCX5jc3VtX3RjcHVkcF9tYWdpYyhza2ItPm5oLmlwaC0+c2FkZHIsCisJCQkJCQkgICBza2ItPm5oLmlwaC0+ZGFkZHIsCisJCQkJCQkgICAwLCBJUFBST1RPX1RDUCwgMCk7CisJCX0KKworCQlpZiAoKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSFdfVFNPKSB8fAorCQkgICAgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KSkgeworCQkJaWYgKHRjcF9vcHRfbGVuIHx8IHNrYi0+bmguaXBoLT5paGwgPiA1KSB7CisJCQkJaW50IHRzZmxhZ3M7CisKKwkJCQl0c2ZsYWdzID0gKChza2ItPm5oLmlwaC0+aWhsIC0gNSkgKworCQkJCQkgICAodGNwX29wdF9sZW4gPj4gMikpOworCQkJCW1zcyB8PSAodHNmbGFncyA8PCAxMSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAodGNwX29wdF9sZW4gfHwgc2tiLT5uaC5pcGgtPmlobCA+IDUpIHsKKwkJCQlpbnQgdHNmbGFnczsKKworCQkJCXRzZmxhZ3MgPSAoKHNrYi0+bmguaXBoLT5paGwgLSA1KSArCisJCQkJCSAgICh0Y3Bfb3B0X2xlbiA+PiAyKSk7CisJCQkJYmFzZV9mbGFncyB8PSB0c2ZsYWdzIDw8IDEyOworCQkJfQorCQl9CisJfQorI2Vsc2UKKwltc3MgPSAwOworI2VuZGlmCisjaWYgVEczX1ZMQU5fVEFHX1VTRUQKKwlpZiAodHAtPnZsZ3JwICE9IE5VTEwgJiYgdmxhbl90eF90YWdfcHJlc2VudChza2IpKQorCQliYXNlX2ZsYWdzIHw9IChUWERfRkxBR19WTEFOIHwKKwkJCSAgICAgICAodmxhbl90eF90YWdfZ2V0KHNrYikgPDwgMTYpKTsKKyNlbmRpZgorCisJLyogUXVldWUgc2tiIGRhdGEsIGEuay5hLiB0aGUgbWFpbiBza2IgZnJhZ21lbnQuICovCisJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHRwLT5wZGV2LCBza2ItPmRhdGEsIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisKKwl0cC0+dHhfYnVmZmVyc1tlbnRyeV0uc2tiID0gc2tiOworCXBjaV91bm1hcF9hZGRyX3NldCgmdHAtPnR4X2J1ZmZlcnNbZW50cnldLCBtYXBwaW5nLCBtYXBwaW5nKTsKKworCXdvdWxkX2hpdF9od2J1ZyA9IDA7CisKKwlpZiAodGczXzRnX292ZXJmbG93X3Rlc3QobWFwcGluZywgbGVuKSkKKwkJd291bGRfaGl0X2h3YnVnID0gZW50cnkgKyAxOworCisJdGczX3NldF90eGQodHAsIGVudHJ5LCBtYXBwaW5nLCBsZW4sIGJhc2VfZmxhZ3MsCisJCSAgICAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9PSAwKSB8IChtc3MgPDwgMSkpOworCisJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKKworCS8qIE5vdyBsb29wIHRocm91Z2ggYWRkaXRpb25hbCBkYXRhIGZyYWdtZW50cywgYW5kIHF1ZXVlIHRoZW0uICovCisJaWYgKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPiAwKSB7CisJCXVuc2lnbmVkIGludCBpLCBsYXN0OworCisJCWxhc3QgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzIC0gMTsKKwkJZm9yIChpID0gMDsgaSA8PSBsYXN0OyBpKyspIHsKKwkJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKworCQkJbGVuID0gZnJhZy0+c2l6ZTsKKwkJCW1hcHBpbmcgPSBwY2lfbWFwX3BhZ2UodHAtPnBkZXYsCisJCQkJCSAgICAgICBmcmFnLT5wYWdlLAorCQkJCQkgICAgICAgZnJhZy0+cGFnZV9vZmZzZXQsCisJCQkJCSAgICAgICBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCQl0cC0+dHhfYnVmZmVyc1tlbnRyeV0uc2tiID0gTlVMTDsKKwkJCXBjaV91bm1hcF9hZGRyX3NldCgmdHAtPnR4X2J1ZmZlcnNbZW50cnldLCBtYXBwaW5nLCBtYXBwaW5nKTsKKworCQkJaWYgKHRnM180Z19vdmVyZmxvd190ZXN0KG1hcHBpbmcsIGxlbikpIHsKKwkJCQkvKiBPbmx5IG9uZSBzaG91bGQgbWF0Y2guICovCisJCQkJaWYgKHdvdWxkX2hpdF9od2J1ZykKKwkJCQkJQlVHKCk7CisJCQkJd291bGRfaGl0X2h3YnVnID0gZW50cnkgKyAxOworCQkJfQorCisJCQlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9IV19UU08pCisJCQkJdGczX3NldF90eGQodHAsIGVudHJ5LCBtYXBwaW5nLCBsZW4sCisJCQkJCSAgICBiYXNlX2ZsYWdzLCAoaSA9PSBsYXN0KXwobXNzIDw8IDEpKTsKKwkJCWVsc2UKKwkJCQl0ZzNfc2V0X3R4ZCh0cCwgZW50cnksIG1hcHBpbmcsIGxlbiwKKwkJCQkJICAgIGJhc2VfZmxhZ3MsIChpID09IGxhc3QpKTsKKworCQkJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKKwkJfQorCX0KKworCWlmICh3b3VsZF9oaXRfaHdidWcpIHsKKwkJdTMyIGxhc3RfcGx1c19vbmUgPSBlbnRyeTsKKwkJdTMyIHN0YXJ0OworCQl1bnNpZ25lZCBpbnQgbGVuID0gMDsKKworCQl3b3VsZF9oaXRfaHdidWcgLT0gMTsKKwkJZW50cnkgPSBlbnRyeSAtIDEgLSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCQllbnRyeSAmPSAoVEczX1RYX1JJTkdfU0laRSAtIDEpOworCQlzdGFydCA9IGVudHJ5OworCQlpID0gMDsKKwkJd2hpbGUgKGVudHJ5ICE9IGxhc3RfcGx1c19vbmUpIHsKKwkJCWlmIChpID09IDApCisJCQkJbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKKwkJCWVsc2UKKwkJCQlsZW4gPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ktMV0uc2l6ZTsKKworCQkJaWYgKGVudHJ5ID09IHdvdWxkX2hpdF9od2J1ZykKKwkJCQlicmVhazsKKworCQkJaSsrOworCQkJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKKworCQl9CisKKwkJLyogSWYgdGhlIHdvcmthcm91bmQgZmFpbHMgZHVlIHRvIG1lbW9yeS9tYXBwaW5nCisJCSAqIGZhaWx1cmUsIHNpbGVudGx5IGRyb3AgdGhpcyBwYWNrZXQuCisJCSAqLworCQlpZiAodGlnb24zXzRnYl9od2J1Z193b3JrYXJvdW5kKHRwLCBza2IsCisJCQkJCQllbnRyeSwgbGVuLAorCQkJCQkJbGFzdF9wbHVzX29uZSwKKwkJCQkJCSZzdGFydCwgbXNzKSkKKwkJCWdvdG8gb3V0X3VubG9jazsKKworCQllbnRyeSA9IHN0YXJ0OworCX0KKworCS8qIFBhY2tldHMgYXJlIHJlYWR5LCB1cGRhdGUgVHggcHJvZHVjZXIgaWR4IGxvY2FsIGFuZCBvbiBjYXJkLiAqLworCXR3MzJfdHhfbWJveCgoTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzAgKyBURzNfNjRCSVRfUkVHX0xPVyksIGVudHJ5KTsKKworCXRwLT50eF9wcm9kID0gZW50cnk7CisJaWYgKFRYX0JVRkZTX0FWQUlMKHRwKSA8PSAoTUFYX1NLQl9GUkFHUyArIDEpKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKK291dF91bmxvY2s6CisgICAgCW1taW93YigpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT50eF9sb2NrLCBmbGFncyk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0ZzNfc2V0X210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgdGczICp0cCwKKwkJCSAgICAgICBpbnQgbmV3X210dSkKK3sKKwlkZXYtPm10dSA9IG5ld19tdHU7CisKKwlpZiAobmV3X210dSA+IEVUSF9EQVRBX0xFTikKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19KVU1CT19FTkFCTEU7CisJZWxzZQorCQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19KVU1CT19FTkFCTEU7Cit9CisKK3N0YXRpYyBpbnQgdGczX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKG5ld19tdHUgPCBURzNfTUlOX01UVSB8fCBuZXdfbXR1ID4gVEczX01BWF9NVFUodHApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCS8qIFdlJ2xsIGp1c3QgY2F0Y2ggaXQgbGF0ZXIgd2hlbiB0aGUKKwkJICogZGV2aWNlIGlzIHVwJ2QuCisJCSAqLworCQl0ZzNfc2V0X210dShkZXYsIHRwLCBuZXdfbXR1KTsKKwkJcmV0dXJuIDA7CisJfQorCisJdGczX25ldGlmX3N0b3AodHApOworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKworCXRnM19oYWx0KHRwKTsKKworCXRnM19zZXRfbXR1KGRldiwgdHAsIG5ld19tdHUpOworCisJdGczX2luaXRfaHcodHApOworCisJdGczX25ldGlmX3N0YXJ0KHRwKTsKKworCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyogRnJlZSB1cCBwZW5kaW5nIHBhY2tldHMgaW4gYWxsIHJ4L3R4IHJpbmdzLgorICoKKyAqIFRoZSBjaGlwIGhhcyBiZWVuIHNodXQgZG93biBhbmQgdGhlIGRyaXZlciBkZXRhY2hlZCBmcm9tCisgKiB0aGUgbmV0d29ya2luZywgc28gbm8gaW50ZXJydXB0cyBvciBuZXcgdHggcGFja2V0cyB3aWxsCisgKiBlbmQgdXAgaW4gdGhlIGRyaXZlci4gIHRwLT57dHgsfWxvY2sgaXMgbm90IGhlbGQgYW5kIHdlIGFyZSBub3QKKyAqIGluIGFuIGludGVycnVwdCBjb250ZXh0IGFuZCB0aHVzIG1heSBzbGVlcC4KKyAqLworc3RhdGljIHZvaWQgdGczX2ZyZWVfcmluZ3Moc3RydWN0IHRnMyAqdHApCit7CisJc3RydWN0IHJpbmdfaW5mbyAqcnhwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFRHM19SWF9SSU5HX1NJWkU7IGkrKykgeworCQlyeHAgPSAmdHAtPnJ4X3N0ZF9idWZmZXJzW2ldOworCisJCWlmIChyeHAtPnNrYiA9PSBOVUxMKQorCQkJY29udGludWU7CisJCXBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsCisJCQkJIHBjaV91bm1hcF9hZGRyKHJ4cCwgbWFwcGluZyksCisJCQkJIFJYX1BLVF9CVUZfU1ogLSB0cC0+cnhfb2Zmc2V0LAorCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlkZXZfa2ZyZWVfc2tiX2FueShyeHAtPnNrYik7CisJCXJ4cC0+c2tiID0gTlVMTDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVEczX1JYX0pVTUJPX1JJTkdfU0laRTsgaSsrKSB7CisJCXJ4cCA9ICZ0cC0+cnhfanVtYm9fYnVmZmVyc1tpXTsKKworCQlpZiAocnhwLT5za2IgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LAorCQkJCSBwY2lfdW5tYXBfYWRkcihyeHAsIG1hcHBpbmcpLAorCQkJCSBSWF9KVU1CT19QS1RfQlVGX1NaIC0gdHAtPnJ4X29mZnNldCwKKwkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkocnhwLT5za2IpOworCQlyeHAtPnNrYiA9IE5VTEw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRHM19UWF9SSU5HX1NJWkU7ICkgeworCQlzdHJ1Y3QgdHhfcmluZ19pbmZvICp0eHA7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWludCBqOworCisJCXR4cCA9ICZ0cC0+dHhfYnVmZmVyc1tpXTsKKwkJc2tiID0gdHhwLT5za2I7CisKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQlpKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCXBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsCisJCQkJIHBjaV91bm1hcF9hZGRyKHR4cCwgbWFwcGluZyksCisJCQkJIHNrYl9oZWFkbGVuKHNrYiksCisJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQl0eHAtPnNrYiA9IE5VTEw7CisKKwkJaSsrOworCisJCWZvciAoaiA9IDA7IGogPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBqKyspIHsKKwkJCXR4cCA9ICZ0cC0+dHhfYnVmZmVyc1tpICYgKFRHM19UWF9SSU5HX1NJWkUgLSAxKV07CisJCQlwY2lfdW5tYXBfcGFnZSh0cC0+cGRldiwKKwkJCQkgICAgICAgcGNpX3VubWFwX2FkZHIodHhwLCBtYXBwaW5nKSwKKwkJCQkgICAgICAgc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tqXS5zaXplLAorCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWkrKzsKKwkJfQorCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfQorfQorCisvKiBJbml0aWFsaXplIHR4L3J4IHJpbmdzIGZvciBwYWNrZXQgcHJvY2Vzc2luZy4KKyAqCisgKiBUaGUgY2hpcCBoYXMgYmVlbiBzaHV0IGRvd24gYW5kIHRoZSBkcml2ZXIgZGV0YWNoZWQgZnJvbQorICogdGhlIG5ldHdvcmtpbmcsIHNvIG5vIGludGVycnVwdHMgb3IgbmV3IHR4IHBhY2tldHMgd2lsbAorICogZW5kIHVwIGluIHRoZSBkcml2ZXIuICB0cC0+e3R4LH1sb2NrIGFyZSBoZWxkIGFuZCB0aHVzCisgKiB3ZSBtYXkgbm90IHNsZWVwLgorICovCitzdGF0aWMgdm9pZCB0ZzNfaW5pdF9yaW5ncyhzdHJ1Y3QgdGczICp0cCkKK3sKKwl1MzIgaTsKKworCS8qIEZyZWUgdXAgYWxsIHRoZSBTS0JzLiAqLworCXRnM19mcmVlX3JpbmdzKHRwKTsKKworCS8qIFplcm8gb3V0IGFsbCBkZXNjcmlwdG9ycy4gKi8KKwltZW1zZXQodHAtPnJ4X3N0ZCwgMCwgVEczX1JYX1JJTkdfQllURVMpOworCW1lbXNldCh0cC0+cnhfanVtYm8sIDAsIFRHM19SWF9KVU1CT19SSU5HX0JZVEVTKTsKKwltZW1zZXQodHAtPnJ4X3JjYiwgMCwgVEczX1JYX1JDQl9SSU5HX0JZVEVTKHRwKSk7CisJbWVtc2V0KHRwLT50eF9yaW5nLCAwLCBURzNfVFhfUklOR19CWVRFUyk7CisKKwkvKiBJbml0aWFsaXplIGludmFyaWFudHMgb2YgdGhlIHJpbmdzLCB3ZSBvbmx5IHNldCB0aGlzCisJICogc3R1ZmYgb25jZS4gIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgY2FyZCBkb2VzIG5vdAorCSAqIHdyaXRlIGludG8gdGhlIHJ4IGJ1ZmZlciBwb3N0aW5nIHJpbmdzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBURzNfUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYyAqcnhkOworCisJCXJ4ZCA9ICZ0cC0+cnhfc3RkW2ldOworCQlyeGQtPmlkeF9sZW4gPSAoUlhfUEtUX0JVRl9TWiAtIHRwLT5yeF9vZmZzZXQgLSA2NCkKKwkJCTw8IFJYRF9MRU5fU0hJRlQ7CisJCXJ4ZC0+dHlwZV9mbGFncyA9IChSWERfRkxBR19FTkQgPDwgUlhEX0ZMQUdTX1NISUZUKTsKKwkJcnhkLT5vcGFxdWUgPSAoUlhEX09QQVFVRV9SSU5HX1NURCB8CisJCQkgICAgICAgKGkgPDwgUlhEX09QQVFVRV9JTkRFWF9TSElGVCkpOworCX0KKworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfSlVNQk9fRU5BQkxFKSB7CisJCWZvciAoaSA9IDA7IGkgPCBURzNfUlhfSlVNQk9fUklOR19TSVpFOyBpKyspIHsKKwkJCXN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MgKnJ4ZDsKKworCQkJcnhkID0gJnRwLT5yeF9qdW1ib1tpXTsKKwkJCXJ4ZC0+aWR4X2xlbiA9IChSWF9KVU1CT19QS1RfQlVGX1NaIC0gdHAtPnJ4X29mZnNldCAtIDY0KQorCQkJCTw8IFJYRF9MRU5fU0hJRlQ7CisJCQlyeGQtPnR5cGVfZmxhZ3MgPSAoUlhEX0ZMQUdfRU5EIDw8IFJYRF9GTEFHU19TSElGVCkgfAorCQkJCVJYRF9GTEFHX0pVTUJPOworCQkJcnhkLT5vcGFxdWUgPSAoUlhEX09QQVFVRV9SSU5HX0pVTUJPIHwKKwkJCSAgICAgICAoaSA8PCBSWERfT1BBUVVFX0lOREVYX1NISUZUKSk7CisJCX0KKwl9CisKKwkvKiBOb3cgYWxsb2NhdGUgZnJlc2ggU0tCcyBmb3IgZWFjaCByeCByaW5nLiAqLworCWZvciAoaSA9IDA7IGkgPCB0cC0+cnhfcGVuZGluZzsgaSsrKSB7CisJCWlmICh0ZzNfYWxsb2Nfcnhfc2tiKHRwLCBSWERfT1BBUVVFX1JJTkdfU1RELAorCQkJCSAgICAgLTEsIGkpIDwgMCkKKwkJCWJyZWFrOworCX0KKworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfSlVNQk9fRU5BQkxFKSB7CisJCWZvciAoaSA9IDA7IGkgPCB0cC0+cnhfanVtYm9fcGVuZGluZzsgaSsrKSB7CisJCQlpZiAodGczX2FsbG9jX3J4X3NrYih0cCwgUlhEX09QQVFVRV9SSU5HX0pVTUJPLAorCQkJCQkgICAgIC0xLCBpKSA8IDApCisJCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qCisgKiBNdXN0IG5vdCBiZSBpbnZva2VkIHdpdGggaW50ZXJydXB0IHNvdXJjZXMgZGlzYWJsZWQgYW5kCisgKiB0aGUgaGFyZHdhcmUgc2h1dGRvd24gZG93bi4KKyAqLworc3RhdGljIHZvaWQgdGczX2ZyZWVfY29uc2lzdGVudChzdHJ1Y3QgdGczICp0cCkKK3sKKwlpZiAodHAtPnJ4X3N0ZF9idWZmZXJzKSB7CisJCWtmcmVlKHRwLT5yeF9zdGRfYnVmZmVycyk7CisJCXRwLT5yeF9zdGRfYnVmZmVycyA9IE5VTEw7CisJfQorCWlmICh0cC0+cnhfc3RkKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQodHAtPnBkZXYsIFRHM19SWF9SSU5HX0JZVEVTLAorCQkJCSAgICB0cC0+cnhfc3RkLCB0cC0+cnhfc3RkX21hcHBpbmcpOworCQl0cC0+cnhfc3RkID0gTlVMTDsKKwl9CisJaWYgKHRwLT5yeF9qdW1ibykgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHRwLT5wZGV2LCBURzNfUlhfSlVNQk9fUklOR19CWVRFUywKKwkJCQkgICAgdHAtPnJ4X2p1bWJvLCB0cC0+cnhfanVtYm9fbWFwcGluZyk7CisJCXRwLT5yeF9qdW1ibyA9IE5VTEw7CisJfQorCWlmICh0cC0+cnhfcmNiKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQodHAtPnBkZXYsIFRHM19SWF9SQ0JfUklOR19CWVRFUyh0cCksCisJCQkJICAgIHRwLT5yeF9yY2IsIHRwLT5yeF9yY2JfbWFwcGluZyk7CisJCXRwLT5yeF9yY2IgPSBOVUxMOworCX0KKwlpZiAodHAtPnR4X3JpbmcpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCh0cC0+cGRldiwgVEczX1RYX1JJTkdfQllURVMsCisJCQl0cC0+dHhfcmluZywgdHAtPnR4X2Rlc2NfbWFwcGluZyk7CisJCXRwLT50eF9yaW5nID0gTlVMTDsKKwl9CisJaWYgKHRwLT5od19zdGF0dXMpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCh0cC0+cGRldiwgVEczX0hXX1NUQVRVU19TSVpFLAorCQkJCSAgICB0cC0+aHdfc3RhdHVzLCB0cC0+c3RhdHVzX21hcHBpbmcpOworCQl0cC0+aHdfc3RhdHVzID0gTlVMTDsKKwl9CisJaWYgKHRwLT5od19zdGF0cykgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHRwLT5wZGV2LCBzaXplb2Yoc3RydWN0IHRnM19od19zdGF0cyksCisJCQkJICAgIHRwLT5od19zdGF0cywgdHAtPnN0YXRzX21hcHBpbmcpOworCQl0cC0+aHdfc3RhdHMgPSBOVUxMOworCX0KK30KKworLyoKKyAqIE11c3Qgbm90IGJlIGludm9rZWQgd2l0aCBpbnRlcnJ1cHQgc291cmNlcyBkaXNhYmxlZCBhbmQKKyAqIHRoZSBoYXJkd2FyZSBzaHV0ZG93biBkb3duLiAgQ2FuIHNsZWVwLgorICovCitzdGF0aWMgaW50IHRnM19hbGxvY19jb25zaXN0ZW50KHN0cnVjdCB0ZzMgKnRwKQoreworCXRwLT5yeF9zdGRfYnVmZmVycyA9IGttYWxsb2MoKHNpemVvZihzdHJ1Y3QgcmluZ19pbmZvKSAqCisJCQkJICAgICAgKFRHM19SWF9SSU5HX1NJWkUgKworCQkJCSAgICAgICBURzNfUlhfSlVNQk9fUklOR19TSVpFKSkgKworCQkJCSAgICAgKHNpemVvZihzdHJ1Y3QgdHhfcmluZ19pbmZvKSAqCisJCQkJICAgICAgVEczX1RYX1JJTkdfU0laRSksCisJCQkJICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXRwLT5yeF9zdGRfYnVmZmVycykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQodHAtPnJ4X3N0ZF9idWZmZXJzLCAwLAorCSAgICAgICAoc2l6ZW9mKHN0cnVjdCByaW5nX2luZm8pICoKKwkJKFRHM19SWF9SSU5HX1NJWkUgKworCQkgVEczX1JYX0pVTUJPX1JJTkdfU0laRSkpICsKKwkgICAgICAgKHNpemVvZihzdHJ1Y3QgdHhfcmluZ19pbmZvKSAqCisJCVRHM19UWF9SSU5HX1NJWkUpKTsKKworCXRwLT5yeF9qdW1ib19idWZmZXJzID0gJnRwLT5yeF9zdGRfYnVmZmVyc1tURzNfUlhfUklOR19TSVpFXTsKKwl0cC0+dHhfYnVmZmVycyA9IChzdHJ1Y3QgdHhfcmluZ19pbmZvICopCisJCSZ0cC0+cnhfanVtYm9fYnVmZmVyc1tURzNfUlhfSlVNQk9fUklOR19TSVpFXTsKKworCXRwLT5yeF9zdGQgPSBwY2lfYWxsb2NfY29uc2lzdGVudCh0cC0+cGRldiwgVEczX1JYX1JJTkdfQllURVMsCisJCQkJCSAgJnRwLT5yeF9zdGRfbWFwcGluZyk7CisJaWYgKCF0cC0+cnhfc3RkKQorCQlnb3RvIGVycl9vdXQ7CisKKwl0cC0+cnhfanVtYm8gPSBwY2lfYWxsb2NfY29uc2lzdGVudCh0cC0+cGRldiwgVEczX1JYX0pVTUJPX1JJTkdfQllURVMsCisJCQkJCSAgICAmdHAtPnJ4X2p1bWJvX21hcHBpbmcpOworCisJaWYgKCF0cC0+cnhfanVtYm8pCisJCWdvdG8gZXJyX291dDsKKworCXRwLT5yeF9yY2IgPSBwY2lfYWxsb2NfY29uc2lzdGVudCh0cC0+cGRldiwgVEczX1JYX1JDQl9SSU5HX0JZVEVTKHRwKSwKKwkJCQkJICAmdHAtPnJ4X3JjYl9tYXBwaW5nKTsKKwlpZiAoIXRwLT5yeF9yY2IpCisJCWdvdG8gZXJyX291dDsKKworCXRwLT50eF9yaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQodHAtPnBkZXYsIFRHM19UWF9SSU5HX0JZVEVTLAorCQkJCQkgICAmdHAtPnR4X2Rlc2NfbWFwcGluZyk7CisJaWYgKCF0cC0+dHhfcmluZykKKwkJZ290byBlcnJfb3V0OworCisJdHAtPmh3X3N0YXR1cyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHRwLT5wZGV2LAorCQkJCQkgICAgIFRHM19IV19TVEFUVVNfU0laRSwKKwkJCQkJICAgICAmdHAtPnN0YXR1c19tYXBwaW5nKTsKKwlpZiAoIXRwLT5od19zdGF0dXMpCisJCWdvdG8gZXJyX291dDsKKworCXRwLT5od19zdGF0cyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHRwLT5wZGV2LAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCB0ZzNfaHdfc3RhdHMpLAorCQkJCQkgICAgJnRwLT5zdGF0c19tYXBwaW5nKTsKKwlpZiAoIXRwLT5od19zdGF0cykKKwkJZ290byBlcnJfb3V0OworCisJbWVtc2V0KHRwLT5od19zdGF0dXMsIDAsIFRHM19IV19TVEFUVVNfU0laRSk7CisJbWVtc2V0KHRwLT5od19zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCB0ZzNfaHdfc3RhdHMpKTsKKworCXJldHVybiAwOworCitlcnJfb3V0OgorCXRnM19mcmVlX2NvbnNpc3RlbnQodHApOworCXJldHVybiAtRU5PTUVNOworfQorCisjZGVmaW5lIE1BWF9XQUlUX0NOVCAxMDAwCisKKy8qIFRvIHN0b3AgYSBibG9jaywgY2xlYXIgdGhlIGVuYWJsZSBiaXQgYW5kIHBvbGwgdGlsbCBpdAorICogY2xlYXJzLiAgdHAtPmxvY2sgaXMgaGVsZC4KKyAqLworc3RhdGljIGludCB0ZzNfc3RvcF9ibG9jayhzdHJ1Y3QgdGczICp0cCwgdW5zaWduZWQgbG9uZyBvZnMsIHUzMiBlbmFibGVfYml0KQoreworCXVuc2lnbmVkIGludCBpOworCXUzMiB2YWw7CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpIHsKKwkJc3dpdGNoIChvZnMpIHsKKwkJY2FzZSBSQ1ZMU0NfTU9ERToKKwkJY2FzZSBETUFDX01PREU6CisJCWNhc2UgTUJGUkVFX01PREU6CisJCWNhc2UgQlVGTUdSX01PREU6CisJCWNhc2UgTUVNQVJCX01PREU6CisJCQkvKiBXZSBjYW4ndCBlbmFibGUvZGlzYWJsZSB0aGVzZSBiaXRzIG9mIHRoZQorCQkJICogNTcwNS81NzUwLCBqdXN0IHNheSBzdWNjZXNzLgorCQkJICovCisJCQlyZXR1cm4gMDsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX07CisJfQorCisJdmFsID0gdHIzMihvZnMpOworCXZhbCAmPSB+ZW5hYmxlX2JpdDsKKwl0dzMyX2Yob2ZzLCB2YWwpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9XQUlUX0NOVDsgaSsrKSB7CisJCXVkZWxheSgxMDApOworCQl2YWwgPSB0cjMyKG9mcyk7CisJCWlmICgodmFsICYgZW5hYmxlX2JpdCkgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IE1BWF9XQUlUX0NOVCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ0ZzNfc3RvcF9ibG9jayB0aW1lZCBvdXQsICIKKwkJICAgICAgICJvZnM9JWx4IGVuYWJsZV9iaXQ9JXhcbiIsCisJCSAgICAgICBvZnMsIGVuYWJsZV9iaXQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KK3N0YXRpYyBpbnQgdGczX2Fib3J0X2h3KHN0cnVjdCB0ZzMgKnRwKQoreworCWludCBpLCBlcnI7CisKKwl0ZzNfZGlzYWJsZV9pbnRzKHRwKTsKKworCXRwLT5yeF9tb2RlICY9IH5SWF9NT0RFX0VOQUJMRTsKKwl0dzMyX2YoTUFDX1JYX01PREUsIHRwLT5yeF9tb2RlKTsKKwl1ZGVsYXkoMTApOworCisJZXJyICA9IHRnM19zdG9wX2Jsb2NrKHRwLCBSQ1ZCRElfTU9ERSwgUkNWQkRJX01PREVfRU5BQkxFKTsKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFJDVkxQQ19NT0RFLCBSQ1ZMUENfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgUkNWTFNDX01PREUsIFJDVkxTQ19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBSQ1ZEQkRJX01PREUsIFJDVkRCRElfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgUkNWRENDX01PREUsIFJDVkRDQ19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBSQ1ZDQ19NT0RFLCBSQ1ZDQ19NT0RFX0VOQUJMRSk7CisKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIFNOREJEU19NT0RFLCBTTkRCRFNfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgU05EQkRJX01PREUsIFNOREJESV9NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBTTkREQVRBSV9NT0RFLCBTTkREQVRBSV9NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBSRE1BQ19NT0RFLCBSRE1BQ19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBTTkREQVRBQ19NT0RFLCBTTkREQVRBQ19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBETUFDX01PREUsIERNQUNfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgU05EQkRDX01PREUsIFNOREJEQ19NT0RFX0VOQUJMRSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwl0cC0+bWFjX21vZGUgJj0gfk1BQ19NT0RFX1RERV9FTkFCTEU7CisJdHczMl9mKE1BQ19NT0RFLCB0cC0+bWFjX21vZGUpOworCXVkZWxheSg0MCk7CisKKwl0cC0+dHhfbW9kZSAmPSB+VFhfTU9ERV9FTkFCTEU7CisJdHczMl9mKE1BQ19UWF9NT0RFLCB0cC0+dHhfbW9kZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1dBSVRfQ05UOyBpKyspIHsKKwkJdWRlbGF5KDEwMCk7CisJCWlmICghKHRyMzIoTUFDX1RYX01PREUpICYgVFhfTU9ERV9FTkFCTEUpKQorCQkJYnJlYWs7CisJfQorCWlmIChpID49IE1BWF9XQUlUX0NOVCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ0ZzNfYWJvcnRfaHcgdGltZWQgb3V0IGZvciAlcywgIgorCQkgICAgICAgIlRYX01PREVfRU5BQkxFIHdpbGwgbm90IGNsZWFyIE1BQ19UWF9NT0RFPSUwOHhcbiIsCisJCSAgICAgICB0cC0+ZGV2LT5uYW1lLCB0cjMyKE1BQ19UWF9NT0RFKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWVyciAgPSB0ZzNfc3RvcF9ibG9jayh0cCwgSE9TVENDX01PREUsIEhPU1RDQ19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBXRE1BQ19NT0RFLCBXRE1BQ19NT0RFX0VOQUJMRSk7CisJZXJyIHw9IHRnM19zdG9wX2Jsb2NrKHRwLCBNQkZSRUVfTU9ERSwgTUJGUkVFX01PREVfRU5BQkxFKTsKKworCXR3MzIoRlRRX1JFU0VULCAweGZmZmZmZmZmKTsKKwl0dzMyKEZUUV9SRVNFVCwgMHgwMDAwMDAwMCk7CisKKwllcnIgfD0gdGczX3N0b3BfYmxvY2sodHAsIEJVRk1HUl9NT0RFLCBCVUZNR1JfTU9ERV9FTkFCTEUpOworCWVyciB8PSB0ZzNfc3RvcF9ibG9jayh0cCwgTUVNQVJCX01PREUsIE1FTUFSQl9NT0RFX0VOQUJMRSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlpZiAodHAtPmh3X3N0YXR1cykKKwkJbWVtc2V0KHRwLT5od19zdGF0dXMsIDAsIFRHM19IV19TVEFUVVNfU0laRSk7CisJaWYgKHRwLT5od19zdGF0cykKKwkJbWVtc2V0KHRwLT5od19zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCB0ZzNfaHdfc3RhdHMpKTsKKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qIHRwLT5sb2NrIGlzIGhlbGQuICovCitzdGF0aWMgaW50IHRnM19udnJhbV9sb2NrKHN0cnVjdCB0ZzMgKnRwKQoreworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfTlZSQU0pIHsKKwkJaW50IGk7CisKKwkJdHczMihOVlJBTV9TV0FSQiwgU1dBUkJfUkVRX1NFVDEpOworCQlmb3IgKGkgPSAwOyBpIDwgODAwMDsgaSsrKSB7CisJCQlpZiAodHIzMihOVlJBTV9TV0FSQikgJiBTV0FSQl9HTlQxKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDIwKTsKKwkJfQorCQlpZiAoaSA9PSA4MDAwKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworfQorCisvKiB0cC0+bG9jayBpcyBoZWxkLiAqLworc3RhdGljIHZvaWQgdGczX252cmFtX3VubG9jayhzdHJ1Y3QgdGczICp0cCkKK3sKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX05WUkFNKQorCQl0dzMyX2YoTlZSQU1fU1dBUkIsIFNXQVJCX1JFUV9DTFIxKTsKK30KKworLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KK3N0YXRpYyB2b2lkIHRnM193cml0ZV9zaWdfcHJlX3Jlc2V0KHN0cnVjdCB0ZzMgKnRwLCBpbnQga2luZCkKK3sKKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1NVTl81NzBYKSkKKwkJdGczX3dyaXRlX21lbSh0cCwgTklDX1NSQU1fRklSTVdBUkVfTUJPWCwKKwkJCSAgICAgIE5JQ19TUkFNX0ZJUk1XQVJFX01CT1hfTUFHSUMxKTsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0FTRl9ORVdfSEFORFNIQUtFKSB7CisJCXN3aXRjaCAoa2luZCkgeworCQljYXNlIFJFU0VUX0tJTkRfSU5JVDoKKwkJCXRnM193cml0ZV9tZW0odHAsIE5JQ19TUkFNX0ZXX0RSVl9TVEFURV9NQk9YLAorCQkJCSAgICAgIERSVl9TVEFURV9TVEFSVCk7CisJCQlicmVhazsKKworCQljYXNlIFJFU0VUX0tJTkRfU0hVVERPV046CisJCQl0ZzNfd3JpdGVfbWVtKHRwLCBOSUNfU1JBTV9GV19EUlZfU1RBVEVfTUJPWCwKKwkJCQkgICAgICBEUlZfU1RBVEVfVU5MT0FEKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVTRVRfS0lORF9TVVNQRU5EOgorCQkJdGczX3dyaXRlX21lbSh0cCwgTklDX1NSQU1fRldfRFJWX1NUQVRFX01CT1gsCisJCQkJICAgICAgRFJWX1NUQVRFX1NVU1BFTkQpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9OworCX0KK30KKworLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KK3N0YXRpYyB2b2lkIHRnM193cml0ZV9zaWdfcG9zdF9yZXNldChzdHJ1Y3QgdGczICp0cCwgaW50IGtpbmQpCit7CisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfQVNGX05FV19IQU5EU0hBS0UpIHsKKwkJc3dpdGNoIChraW5kKSB7CisJCWNhc2UgUkVTRVRfS0lORF9JTklUOgorCQkJdGczX3dyaXRlX21lbSh0cCwgTklDX1NSQU1fRldfRFJWX1NUQVRFX01CT1gsCisJCQkJICAgICAgRFJWX1NUQVRFX1NUQVJUX0RPTkUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRVNFVF9LSU5EX1NIVVRET1dOOgorCQkJdGczX3dyaXRlX21lbSh0cCwgTklDX1NSQU1fRldfRFJWX1NUQVRFX01CT1gsCisJCQkJICAgICAgRFJWX1NUQVRFX1VOTE9BRF9ET05FKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfTsKKwl9Cit9CisKKy8qIHRwLT5sb2NrIGlzIGhlbGQuICovCitzdGF0aWMgdm9pZCB0ZzNfd3JpdGVfc2lnX2xlZ2FjeShzdHJ1Y3QgdGczICp0cCwgaW50IGtpbmQpCit7CisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19FTkFCTEVfQVNGKSB7CisJCXN3aXRjaCAoa2luZCkgeworCQljYXNlIFJFU0VUX0tJTkRfSU5JVDoKKwkJCXRnM193cml0ZV9tZW0odHAsIE5JQ19TUkFNX0ZXX0RSVl9TVEFURV9NQk9YLAorCQkJCSAgICAgIERSVl9TVEFURV9TVEFSVCk7CisJCQlicmVhazsKKworCQljYXNlIFJFU0VUX0tJTkRfU0hVVERPV046CisJCQl0ZzNfd3JpdGVfbWVtKHRwLCBOSUNfU1JBTV9GV19EUlZfU1RBVEVfTUJPWCwKKwkJCQkgICAgICBEUlZfU1RBVEVfVU5MT0FEKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVTRVRfS0lORF9TVVNQRU5EOgorCQkJdGczX3dyaXRlX21lbSh0cCwgTklDX1NSQU1fRldfRFJWX1NUQVRFX01CT1gsCisJCQkJICAgICAgRFJWX1NUQVRFX1NVU1BFTkQpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9OworCX0KK30KKworc3RhdGljIHZvaWQgdGczX3N0b3BfZncoc3RydWN0IHRnMyAqKTsKKworLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KK3N0YXRpYyBpbnQgdGczX2NoaXBfcmVzZXQoc3RydWN0IHRnMyAqdHApCit7CisJdTMyIHZhbDsKKwl1MzIgZmxhZ3Nfc2F2ZTsKKwlpbnQgaTsKKworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfU1VOXzU3MFgpKQorCQl0ZzNfbnZyYW1fbG9jayh0cCk7CisKKwkvKgorCSAqIFdlIG11c3QgYXZvaWQgdGhlIHJlYWRsKCkgdGhhdCBub3JtYWxseSB0YWtlcyBwbGFjZS4KKwkgKiBJdCBsb2NrcyBtYWNoaW5lcywgY2F1c2VzIG1hY2hpbmUgY2hlY2tzLCBhbmQgb3RoZXIKKwkgKiBmdW4gdGhpbmdzLiAgU28sIHRlbXBvcmFyaWx5IGRpc2FibGUgdGhlIDU3MDEKKwkgKiBoYXJkd2FyZSB3b3JrYXJvdW5kLCB3aGlsZSB3ZSBkbyB0aGUgcmVzZXQuCisJICovCisJZmxhZ3Nfc2F2ZSA9IHRwLT50ZzNfZmxhZ3M7CisJdHAtPnRnM19mbGFncyAmPSB+VEczX0ZMQUdfNTcwMV9SRUdfV1JJVEVfQlVHOworCisJLyogZG8gdGhlIHJlc2V0ICovCisJdmFsID0gR1JDX01JU0NfQ0ZHX0NPUkVDTEtfUkVTRVQ7CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QQ0lfRVhQUkVTUykgeworCQlpZiAodHIzMigweDdlMmMpID09IDB4NjApIHsKKwkJCXR3MzIoMHg3ZTJjLCAweDIwKTsKKwkJfQorCQlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3NTBfQTApIHsKKwkJCXR3MzIoR1JDX01JU0NfQ0ZHLCAoMSA8PCAyOSkpOworCQkJdmFsIHw9ICgxIDw8IDI5KTsKKwkJfQorCX0KKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykKKwkJdmFsIHw9IEdSQ19NSVNDX0NGR19LRUVQX0dQSFlfUE9XRVI7CisJdHczMihHUkNfTUlTQ19DRkcsIHZhbCk7CisKKwkvKiByZXN0b3JlIDU3MDEgaGFyZHdhcmUgYnVnIHdvcmthcm91bmQgZmxhZyAqLworCXRwLT50ZzNfZmxhZ3MgPSBmbGFnc19zYXZlOworCisJLyogVW5mb3J0dW5hdGVseSwgd2UgaGF2ZSB0byBkZWxheSBiZWZvcmUgdGhlIFBDSSByZWFkIGJhY2suCisJICogU29tZSA1NzVYIGNoaXBzIGV2ZW4gd2lsbCBub3QgcmVzcG9uZCB0byBhIFBDSSBjZmcgYWNjZXNzCisJICogd2hlbiB0aGUgcmVzZXQgY29tbWFuZCBpcyBnaXZlbiB0byB0aGUgY2hpcC4KKwkgKgorCSAqIEhvdyBkbyB0aGVzZSBoYXJkd2FyZSBkZXNpZ25lcnMgZXhwZWN0IHRoaW5ncyB0byB3b3JrCisJICogcHJvcGVybHkgaWYgdGhlIFBDSSB3cml0ZSBpcyBwb3N0ZWQgZm9yIGEgbG9uZyBwZXJpb2QKKwkgKiBvZiB0aW1lPyAgSXQgaXMgYWx3YXlzIG5lY2Vzc2FyeSB0byBoYXZlIHNvbWUgbWV0aG9kIGJ5CisJICogd2hpY2ggYSByZWdpc3RlciByZWFkIGJhY2sgY2FuIG9jY3VyIHRvIHB1c2ggdGhlIHdyaXRlCisJICogb3V0IHdoaWNoIGRvZXMgdGhlIHJlc2V0LgorCSAqCisJICogRm9yIG1vc3QgdGczIHZhcmlhbnRzIHRoZSB0cmljayBiZWxvdyB3YXMgd29ya2luZy4KKwkgKiBIbyBodW0uLi4KKwkgKi8KKwl1ZGVsYXkoMTIwKTsKKworCS8qIEZsdXNoIFBDSSBwb3N0ZWQgd3JpdGVzLiAgVGhlIG5vcm1hbCBNTUlPIHJlZ2lzdGVycworCSAqIGFyZSBpbmFjY2Vzc2libGUgYXQgdGhpcyB0aW1lIHNvIHRoaXMgaXMgdGhlIG9ubHkKKwkgKiB3YXkgdG8gbWFrZSB0aGlzIHJlbGlhYmx5IChhY3R1YWxseSwgdGhpcyBpcyBubyBsb25nZXIKKwkgKiB0aGUgY2FzZSwgc2VlIGFib3ZlKS4gIEkgdHJpZWQgdG8gdXNlIGluZGlyZWN0CisJICogcmVnaXN0ZXIgcmVhZC93cml0ZSBidXQgdGhpcyB1cHNldCBzb21lIDU3MDEgdmFyaWFudHMuCisJICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBQQ0lfQ09NTUFORCwgJnZhbCk7CisKKwl1ZGVsYXkoMTIwKTsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BDSV9FWFBSRVNTKSB7CisJCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTc1MF9BMCkgeworCQkJaW50IGk7CisJCQl1MzIgY2ZnX3ZhbDsKKworCQkJLyogV2FpdCBmb3IgbGluayB0cmFpbmluZyB0byBjb21wbGV0ZS4gICovCisJCQlmb3IgKGkgPSAwOyBpIDwgNTAwMDsgaSsrKQorCQkJCXVkZWxheSgxMDApOworCisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQodHAtPnBkZXYsIDB4YzQsICZjZmdfdmFsKTsKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIDB4YzQsCisJCQkJCSAgICAgICBjZmdfdmFsIHwgKDEgPDwgMTUpKTsKKwkJfQorCQkvKiBTZXQgUENJRSBtYXggcGF5bG9hZCBzaXplIGFuZCBjbGVhciBlcnJvciBzdGF0dXMuICAqLworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCAweGQ4LCAweGY1MDAwKTsKKwl9CisKKwkvKiBSZS1lbmFibGUgaW5kaXJlY3QgcmVnaXN0ZXIgYWNjZXNzZXMuICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01JU0NfSE9TVF9DVFJMLAorCQkJICAgICAgIHRwLT5taXNjX2hvc3RfY3RybCk7CisKKwkvKiBTZXQgTUFYIFBDSSByZXRyeSB0byB6ZXJvLiAqLworCXZhbCA9IChQQ0lTVEFURV9ST01fRU5BQkxFIHwgUENJU1RBVEVfUk9NX1JFVFJZX0VOQUJMRSk7CisJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzA0X0EwICYmCisJICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSkKKwkJdmFsIHw9IFBDSVNUQVRFX1JFVFJZX1NBTUVfRE1BOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9QQ0lTVEFURSwgdmFsKTsKKworCXBjaV9yZXN0b3JlX3N0YXRlKHRwLT5wZGV2KTsKKworCS8qIE1ha2Ugc3VyZSBQQ0ktWCByZWxheGVkIG9yZGVyaW5nIGJpdCBpcyBjbGVhci4gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9YX0NBUFMsICZ2YWwpOworCXZhbCAmPSB+UENJWF9DQVBTX1JFTEFYRURfT1JERVJJTkc7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1hfQ0FQUywgdmFsKTsKKworCXR3MzIoTUVNQVJCX01PREUsIE1FTUFSQl9NT0RFX0VOQUJMRSk7CisKKwlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3NTBfQTMpIHsKKwkJdGczX3N0b3BfZncodHApOworCQl0dzMyKDB4NTAwMCwgMHg0MDApOworCX0KKworCXR3MzIoR1JDX01PREUsIHRwLT5ncmNfbW9kZSk7CisKKwlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDVfQTApIHsKKwkJdTMyIHZhbCA9IHRyMzIoMHhjNCk7CisKKwkJdHczMigweGM0LCB2YWwgfCAoMSA8PCAxNSkpOworCX0KKworCWlmICgodHAtPm5pY19zcmFtX2RhdGFfY2ZnICYgTklDX1NSQU1fREFUQV9DRkdfTUlOSV9QQ0kpICE9IDAgJiYKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUpIHsKKwkJdHAtPnBjaV9jbG9ja19jdHJsIHw9IENMT0NLX0NUUkxfQ0xLUlVOX09FTkFCTEU7CisJCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwNV9BMCkKKwkJCXRwLT5wY2lfY2xvY2tfY3RybCB8PSBDTE9DS19DVFJMX0ZPUkNFX0NMS1JVTjsKKwkJdHczMihURzNQQ0lfQ0xPQ0tfQ1RSTCwgdHAtPnBjaV9jbG9ja19jdHJsKTsKKwl9CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKSB7CisJCXRwLT5tYWNfbW9kZSA9IE1BQ19NT0RFX1BPUlRfTU9ERV9UQkk7CisJCXR3MzJfZihNQUNfTU9ERSwgdHAtPm1hY19tb2RlKTsKKwl9IGVsc2UKKwkJdHczMl9mKE1BQ19NT0RFLCAwKTsKKwl1ZGVsYXkoNDApOworCisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9TVU5fNTcwWCkpIHsKKwkJLyogV2FpdCBmb3IgZmlybXdhcmUgaW5pdGlhbGl6YXRpb24gdG8gY29tcGxldGUuICovCisJCWZvciAoaSA9IDA7IGkgPCAxMDAwMDA7IGkrKykgeworCQkJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9GSVJNV0FSRV9NQk9YLCAmdmFsKTsKKwkJCWlmICh2YWwgPT0gfk5JQ19TUkFNX0ZJUk1XQVJFX01CT1hfTUFHSUMxKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDEwKTsKKwkJfQorCQlpZiAoaSA+PSAxMDAwMDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggInRnM19yZXNldF9odyB0aW1lZCBvdXQgZm9yICVzLCAiCisJCQkgICAgICAgImZpcm13YXJlIHdpbGwgbm90IHJlc3RhcnQgbWFnaWM9JTA4eFxuIiwKKwkJCSAgICAgICB0cC0+ZGV2LT5uYW1lLCB2YWwpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlpZiAoKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUENJX0VYUFJFU1MpICYmCisJICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgIT0gQ0hJUFJFVl9JRF81NzUwX0EwKSB7CisJCXUzMiB2YWwgPSB0cjMyKDB4N2MwMCk7CisKKwkJdHczMigweDdjMDAsIHZhbCB8ICgxIDw8IDI1KSk7CisJfQorCisJLyogUmVwcm9iZSBBU0YgZW5hYmxlIHN0YXRlLiAgKi8KKwl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19FTkFCTEVfQVNGOworCXRwLT50ZzNfZmxhZ3MyICY9IH5URzNfRkxHMl9BU0ZfTkVXX0hBTkRTSEFLRTsKKwl0ZzNfcmVhZF9tZW0odHAsIE5JQ19TUkFNX0RBVEFfU0lHLCAmdmFsKTsKKwlpZiAodmFsID09IE5JQ19TUkFNX0RBVEFfU0lHX01BR0lDKSB7CisJCXUzMiBuaWNfY2ZnOworCisJCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fREFUQV9DRkcsICZuaWNfY2ZnKTsKKwkJaWYgKG5pY19jZmcgJiBOSUNfU1JBTV9EQVRBX0NGR19BU0ZfRU5BQkxFKSB7CisJCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX0VOQUJMRV9BU0Y7CisJCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApCisJCQkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfQVNGX05FV19IQU5EU0hBS0U7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KK3N0YXRpYyB2b2lkIHRnM19zdG9wX2Z3KHN0cnVjdCB0ZzMgKnRwKQoreworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRU5BQkxFX0FTRikgeworCQl1MzIgdmFsOworCQlpbnQgaTsKKworCQl0ZzNfd3JpdGVfbWVtKHRwLCBOSUNfU1JBTV9GV19DTURfTUJPWCwgRldDTURfTklDRFJWX1BBVVNFX0ZXKTsKKwkJdmFsID0gdHIzMihHUkNfUlhfQ1BVX0VWRU5UKTsKKwkJdmFsIHw9ICgxIDw8IDE0KTsKKwkJdHczMihHUkNfUlhfQ1BVX0VWRU5ULCB2YWwpOworCisJCS8qIFdhaXQgZm9yIFJYIGNwdSB0byBBQ0sgdGhlIGV2ZW50LiAgKi8KKwkJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCQlpZiAoISh0cjMyKEdSQ19SWF9DUFVfRVZFTlQpICYgKDEgPDwgMTQpKSkKKwkJCQlicmVhazsKKwkJCXVkZWxheSgxKTsKKwkJfQorCX0KK30KKworLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KK3N0YXRpYyBpbnQgdGczX2hhbHQoc3RydWN0IHRnMyAqdHApCit7CisJaW50IGVycjsKKworCXRnM19zdG9wX2Z3KHRwKTsKKworCXRnM193cml0ZV9zaWdfcHJlX3Jlc2V0KHRwLCBSRVNFVF9LSU5EX1NIVVRET1dOKTsKKworCXRnM19hYm9ydF9odyh0cCk7CisJZXJyID0gdGczX2NoaXBfcmVzZXQodHApOworCisJdGczX3dyaXRlX3NpZ19sZWdhY3kodHAsIFJFU0VUX0tJTkRfU0hVVERPV04pOworCXRnM193cml0ZV9zaWdfcG9zdF9yZXNldCh0cCwgUkVTRVRfS0lORF9TSFVURE9XTik7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgVEczX0ZXX1JFTEVBU0VfTUFKT1IJMHgwCisjZGVmaW5lIFRHM19GV19SRUxBU0VfTUlOT1IJMHgwCisjZGVmaW5lIFRHM19GV19SRUxFQVNFX0ZJWAkweDAKKyNkZWZpbmUgVEczX0ZXX1NUQVJUX0FERFIJMHgwODAwMDAwMAorI2RlZmluZSBURzNfRldfVEVYVF9BRERSCTB4MDgwMDAwMDAKKyNkZWZpbmUgVEczX0ZXX1RFWFRfTEVOCQkweDljMAorI2RlZmluZSBURzNfRldfUk9EQVRBX0FERFIJMHgwODAwMDljMAorI2RlZmluZSBURzNfRldfUk9EQVRBX0xFTgkweDYwCisjZGVmaW5lIFRHM19GV19EQVRBX0FERFIJMHgwODAwMGE0MAorI2RlZmluZSBURzNfRldfREFUQV9MRU4JCTB4MjAKKyNkZWZpbmUgVEczX0ZXX1NCU1NfQUREUgkweDA4MDAwYTYwCisjZGVmaW5lIFRHM19GV19TQlNTX0xFTgkJMHhjCisjZGVmaW5lIFRHM19GV19CU1NfQUREUgkJMHgwODAwMGE3MAorI2RlZmluZSBURzNfRldfQlNTX0xFTgkJMHgxMAorCitzdGF0aWMgdTMyIHRnM0Z3VGV4dFsoVEczX0ZXX1RFWFRfTEVOIC8gc2l6ZW9mKHUzMikpICsgMV0gPSB7CisJMHgwMDAwMDAwMCwgMHgxMDAwMDAwMywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwZCwgMHgwMDAwMDAwZCwgMHgzYzFkMDgwMCwKKwkweDM3YmQzZmZjLCAweDAzYTBmMDIxLCAweDNjMTAwODAwLCAweDI2MTAwMDAwLCAweDBlMDAwMDE4LCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMGQsIDB4M2MxZDA4MDAsIDB4MzdiZDNmZmMsIDB4MDNhMGYwMjEsIDB4M2MxMDA4MDAsIDB4MjYxMDAwMzQsCisJMHgwZTAwMDIxYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwZCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDI3YmRmZmUwLCAweDNjMWNjMDAwLCAweGFmYmYwMDE4LCAweGFmODA2ODBjLCAweDBlMDAwMDRjLCAweDI0MWIyMTA1LAorCTB4OTc4NTAwMDAsIDB4OTc4NzAwMDIsIDB4OTc4MjAwMmMsIDB4OTc4MzAwMmUsIDB4M2MwNDA4MDAsIDB4MjQ4NDA5YzAsCisJMHhhZmEwMDAxNCwgMHgwMDAyMTQwMCwgMHgwMDYyMTgyNSwgMHgwMDA1MmMwMCwgMHhhZmEzMDAxMCwgMHg4Zjg2MDAxMCwKKwkweDAwZTUyODI1LCAweDBlMDAwMDYwLCAweDI0MDcwMTAyLCAweDNjMDJhYzAwLCAweDM0NDIwMTAwLCAweDNjMDNhYzAxLAorCTB4MzQ2MzAxMDAsIDB4YWY4MjA0OTAsIDB4M2MwMmZmZmYsIDB4YWY4MjA0OTQsIDB4YWY4MzA0OTgsIDB4YWY4MjA0OWMsCisJMHgyNDAyMDAwMSwgMHhhZjgyNWNlMCwgMHgwZTAwMDAzZiwgMHhhZjgyNWQwMCwgMHgwZTAwMDE0MCwgMHgwMDAwMDAwMCwKKwkweDhmYmYwMDE4LCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLCAweDI0MDJmZmZmLCAweGFmODI1NDA0LCAweDhmODM1NDAwLAorCTB4MzQ2MzA0MDAsIDB4YWY4MzU0MDAsIDB4YWY4MjU0MDQsIDB4M2MwMjA4MDAsIDB4MjQ0MjAwMzQsIDB4YWY4MjU0MWMsCisJMHgwM2UwMDAwOCwgMHhhZjgwNTQwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzYzAyMDgwMCwgMHgzNDQyMzAwMCwKKwkweDNjMDMwODAwLCAweDM0NjMzMDAwLCAweDNjMDQwODAwLCAweDM0ODQzN2ZmLCAweDNjMDEwODAwLCAweGFjMjIwYTY0LAorCTB4MjQwMjAwNDAsIDB4M2MwMTA4MDAsIDB4YWMyMjBhNjgsIDB4M2MwMTA4MDAsIDB4YWMyMDBhNjAsIDB4YWM2MDAwMDAsCisJMHgyNDYzMDAwNCwgMHgwMDgzMTAyYiwgMHg1MDQwZmZmZCwgMHhhYzYwMDAwMCwgMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwKKwkweDAwODA0ODIxLCAweDhmYWEwMDEwLCAweDNjMDIwODAwLCAweDhjNDIwYTYwLCAweDNjMDQwODAwLCAweDhjODQwYTY4LAorCTB4OGZhYjAwMTQsIDB4MjQ0MzAwMDEsIDB4MDA0NDEwMmIsIDB4M2MwMTA4MDAsIDB4YWMyMzBhNjAsIDB4MTQ0MDAwMDMsCisJMHgwMDAwNDAyMSwgMHgzYzAxMDgwMCwgMHhhYzIwMGE2MCwgMHgzYzAyMDgwMCwgMHg4YzQyMGE2MCwgMHgzYzAzMDgwMCwKKwkweDhjNjMwYTY0LCAweDkxMjQwMDAwLCAweDAwMDIxMTQwLCAweDAwNDMxMDIxLCAweDAwNDgxMDIxLCAweDI1MDgwMDAxLAorCTB4YTA0NDAwMDAsIDB4MjkwMjAwMDgsIDB4MTQ0MGZmZjQsIDB4MjUyOTAwMDEsIDB4M2MwMjA4MDAsIDB4OGM0MjBhNjAsCisJMHgzYzAzMDgwMCwgMHg4YzYzMGE2NCwgMHg4Zjg0NjgwYywgMHgwMDAyMTE0MCwgMHgwMDQzMTAyMSwgMHhhYzQ0MDAwOCwKKwkweGFjNDUwMDBjLCAweGFjNDYwMDEwLCAweGFjNDcwMDE0LCAweGFjNGEwMDE4LCAweDAzZTAwMDA4LCAweGFjNGIwMDFjLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLAorCTB4MDIwMDAwMDgsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4M2MwYTAwMDEsIDB4MGEwMDAxZTMsIDB4M2MwYTAwMDIsCisJMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwKKwkweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDAwMDAwMDAwLAorCTB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsCisJMHgwYTAwMDFlMywgMHgzYzBhMDAwNywgMHgwYTAwMDFlMywgMHgzYzBhMDAwOCwgMHgwYTAwMDFlMywgMHgzYzBhMDAwOSwKKwkweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDNjMGEwMDBiLAorCTB4MGEwMDAxZTMsIDB4M2MwYTAwMGMsIDB4MGEwMDAxZTMsIDB4M2MwYTAwMGQsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsCisJMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgzYzBhMDAwZSwgMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwKKwkweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDAwMDAwMDAwLCAweDBhMDAwMWUzLCAweDAwMDAwMDAwLAorCTB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsIDB4MGEwMDAxZTMsIDB4MDAwMDAwMDAsCisJMHgwYTAwMDFlMywgMHgwMDAwMDAwMCwgMHgwYTAwMDFlMywgMHgzYzBhMDAxMywgMHgwYTAwMDFlMywgMHgzYzBhMDAxNCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkweDI3YmRmZmUwLCAweDAwMDAxODIxLCAweDAwMDAxMDIxLCAweGFmYmYwMDE4LCAweGFmYjEwMDE0LCAweGFmYjAwMDEwLAorCTB4M2MwMTA4MDAsIDB4MDAyMjA4MjEsIDB4YWMyMDBhNzAsIDB4M2MwMTA4MDAsIDB4MDAyMjA4MjEsIDB4YWMyMDBhNzQsCisJMHgzYzAxMDgwMCwgMHgwMDIyMDgyMSwgMHhhYzIwMGE3OCwgMHgyNDYzMDAwMSwgMHgxODYwZmZmNSwgMHgyNDQyMDAwYywKKwkweDI0MTEwMDAxLCAweDhmOTA2ODEwLCAweDMyMDIwMDA0LCAweDE0NDAwMDA1LCAweDI0MDQwMDAxLCAweDNjMDIwODAwLAorCTB4OGM0MjBhNzgsIDB4MTg0MDAwMDMsIDB4MDAwMDIwMjEsIDB4MGUwMDAxODIsIDB4MDAwMDAwMDAsIDB4MzIwMjAwMDEsCisJMHgxMDQwMDAwMywgMHgwMDAwMDAwMCwgMHgwZTAwMDE2OSwgMHgwMDAwMDAwMCwgMHgwYTAwMDE1MywgMHhhZjkxNTAyOCwKKwkweDhmYmYwMDE4LCAweDhmYjEwMDE0LCAweDhmYjAwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLCAweDNjMDUwODAwLAorCTB4OGNhNTBhNzAsIDB4M2MwNjA4MDAsIDB4OGNjNjBhODAsIDB4M2MwNzA4MDAsIDB4OGNlNzBhNzgsIDB4MjdiZGZmZTAsCisJMHgzYzA0MDgwMCwgMHgyNDg0MDlkMCwgMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHgwZTAwMDA2MCwgMHhhZmEwMDAxNCwKKwkweDBlMDAwMTdiLCAweDAwMDAyMDIxLCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLCAweDI0MDIwMDAxLAorCTB4OGY4MzY4MTAsIDB4MDA4MjEwMDQsIDB4MDAwMjEwMjcsIDB4MDA2MjE4MjQsIDB4MDNlMDAwMDgsIDB4YWY4MzY4MTAsCisJMHgyN2JkZmZkOCwgMHhhZmJmMDAyNCwgMHgxMDgwMDAyZSwgMHhhZmIwMDAyMCwgMHg4ZjgyNWNlYywgMHhhZmEyMDAxOCwKKwkweDhmODI1Y2VjLCAweDNjMTAwODAwLCAweDI2MTAwYTc4LCAweGFmYTIwMDFjLCAweDM0MDI4MDAwLCAweGFmODI1Y2VjLAorCTB4OGUwMjAwMDAsIDB4MTg0MDAwMTYsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsIDB4OTQ0MjBhNzQsIDB4OGZhMzAwMWMsCisJMHgwMDAyMjFjMCwgMHhhYzgzMDAwNCwgMHg4ZmEyMDAxYywgMHgzYzAxMDgwMCwgMHgwZTAwMDIwMSwgMHhhYzIyMGE3NCwKKwkweDEwNDAwMDA1LCAweDAwMDAwMDAwLCAweDhlMDIwMDAwLCAweDI0NDIwMDAxLCAweDBhMDAwMWRmLCAweGFlMDIwMDAwLAorCTB4M2MwMjA4MDAsIDB4OGM0MjBhNzAsIDB4MDAwMjFjMDIsIDB4MDAwMzIxYzAsIDB4MGEwMDAxYzUsIDB4YWZhMjAwMWMsCisJMHgwZTAwMDIwMSwgMHgwMDAwMDAwMCwgMHgxMDQwMDAxZiwgMHgwMDAwMDAwMCwgMHg4ZTAyMDAwMCwgMHg4ZmEzMDAxYywKKwkweDI0NDIwMDAxLCAweDNjMDEwODAwLCAweGFjMjMwYTcwLCAweDNjMDEwODAwLCAweGFjMjMwYTc0LCAweDBhMDAwMWRmLAorCTB4YWUwMjAwMDAsIDB4M2MxMDA4MDAsIDB4MjYxMDBhNzgsIDB4OGUwMjAwMDAsIDB4MTg0MDAwMjgsIDB4MDAwMDAwMDAsCisJMHgwZTAwMDIwMSwgMHgwMDAwMDAwMCwgMHgxNDQwMDAyNCwgMHgwMDAwMDAwMCwgMHg4ZTAyMDAwMCwgMHgzYzAzMDgwMCwKKwkweDhjNjMwYTcwLCAweDI0NDJmZmZmLCAweGFmYTMwMDFjLCAweDE4NDAwMDA2LCAweGFlMDIwMDAwLCAweDAwMDMxNDAyLAorCTB4MDAwMjIxYzAsIDB4OGM4MjAwMDQsIDB4M2MwMTA4MDAsIDB4YWMyMjBhNzAsIDB4OTdhMjAwMWUsIDB4MjQ0MmZmMDAsCisJMHgyYzQyMDMwMCwgMHgxNDQwMDAwYiwgMHgyNDAyNDAwMCwgMHgzYzA0MDgwMCwgMHgyNDg0MDlkYywgMHhhZmEwMDAxMCwKKwkweGFmYTAwMDE0LCAweDhmYTYwMDFjLCAweDI0MDUwMDA4LCAweDBlMDAwMDYwLCAweDAwMDAzODIxLCAweDBhMDAwMWRmLAorCTB4MDAwMDAwMDAsIDB4YWY4MjVjZjgsIDB4M2MwMjA4MDAsIDB4OGM0MjBhNDAsIDB4OGZhMzAwMWMsIDB4MjQ0MjAwMDEsCisJMHhhZjgzNWNmOCwgMHgzYzAxMDgwMCwgMHhhYzIyMGE0MCwgMHg4ZmJmMDAyNCwgMHg4ZmIwMDAyMCwgMHgwM2UwMDAwOCwKKwkweDI3YmQwMDI4LCAweDI3YmRmZmUwLCAweDNjMDQwODAwLCAweDI0ODQwOWU4LCAweDAwMDAyODIxLCAweDAwMDAzMDIxLAorCTB4MDAwMDM4MjEsIDB4YWZiZjAwMTgsIDB4YWZhMDAwMTAsIDB4MGUwMDAwNjAsIDB4YWZhMDAwMTQsIDB4OGZiZjAwMTgsCisJMHgwM2UwMDAwOCwgMHgyN2JkMDAyMCwgMHg4ZjgyNjgwYywgMHg4Zjg1NjgwYywgMHgwMDAyMTgyNywgMHgwMDAzMTgyYiwKKwkweDAwMDMxODIzLCAweDAwNDMxMDI0LCAweDAwNDQxMDIxLCAweDAwYTIyODJiLCAweDEwYTAwMDA2LCAweDAwMDAwMDAwLAorCTB4MDA0MDE4MjEsIDB4OGY4MjY4MGMsIDB4MDA0MzEwMmIsIDB4MTQ0MGZmZmQsIDB4MDAwMDAwMDAsIDB4MDNlMDAwMDgsCisJMHgwMDAwMDAwMCwgMHgzYzA0MDgwMCwgMHg4Yzg0MDAwMCwgMHgzYzAzMDgwMCwgMHg4YzYzMGE0MCwgMHgwMDY0MTAyYiwKKwkweDU0NDAwMDAyLCAweDAwODMxMDIzLCAweDAwNjQxMDIzLCAweDJjNDIwMDA4LCAweDAzZTAwMDA4LCAweDM4NDIwMDAxLAorCTB4MjdiZGZmZTAsIDB4MDA4MDI4MjEsIDB4M2MwNDA4MDAsIDB4MjQ4NDBhMDAsIDB4MDAwMDMwMjEsIDB4MDAwMDM4MjEsCisJMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHgwZTAwMDA2MCwgMHhhZmEwMDAxNCwgMHgwYTAwMDIxNiwgMHgwMDAwMDAwMCwKKwkweDhmYmYwMDE4LCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLCAweDAwMDAwMDAwLCAweDI3YmRmZmUwLCAweDNjMWNjMDAwLAorCTB4YWZiZjAwMTgsIDB4MGUwMDAwNGMsIDB4YWY4MDY4MGMsIDB4M2MwNDA4MDAsIDB4MjQ4NDBhMTAsIDB4MDM4MDI4MjEsCisJMHgwMDAwMzAyMSwgMHgwMDAwMzgyMSwgMHhhZmEwMDAxMCwgMHgwZTAwMDA2MCwgMHhhZmEwMDAxNCwgMHgyNDAyZmZmZiwKKwkweGFmODI1NDA0LCAweDNjMDIwMGFhLCAweDBlMDAwMjM0LCAweGFmODI1NDM0LCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LAorCTB4MjdiZDAwMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjdiZGZmZTgsIDB4YWZiMDAwMTAsCisJMHgyNDEwMDAwMSwgMHhhZmJmMDAxNCwgMHgzYzAxYzAwMywgMHhhYzIwMDAwMCwgMHg4ZjgyNjgxMCwgMHgzMDQyMjAwMCwKKwkweDEwNDAwMDAzLCAweDAwMDAwMDAwLCAweDBlMDAwMjQ2LCAweDAwMDAwMDAwLCAweDBhMDAwMjNhLCAweGFmOTA1NDI4LAorCTB4OGZiZjAwMTQsIDB4OGZiMDAwMTAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMTgsIDB4MjdiZGZmZjgsIDB4OGY4NDVkMGMsCisJMHgzYzAyMDBmZiwgMHgzYzAzMDgwMCwgMHg4YzYzMGE1MCwgMHgzNDQyZmZmOCwgMHgwMDgyMTAyNCwgMHgxMDQzMDAxZSwKKwkweDNjMDUwMGZmLCAweDM0YTVmZmY4LCAweDNjMDZjMDAzLCAweDNjMDc0MDAwLCAweDAwODUxODI0LCAweDhjNjIwMDEwLAorCTB4M2MwMTA4MDAsIDB4YWMyMzBhNTAsIDB4MzA0MjAwMDgsIDB4MTA0MDAwMDUsIDB4MDA4NzEwMjUsIDB4OGNjMjAwMDAsCisJMHgyNDQyMDAwMSwgMHhhY2MyMDAwMCwgMHgwMDg3MTAyNSwgMHhhZjgyNWQwYywgMHg4ZmEyMDAwMCwgMHgyNDQyMDAwMSwKKwkweGFmYTIwMDAwLCAweDhmYTIwMDAwLCAweDhmYTIwMDAwLCAweDI0NDIwMDAxLCAweGFmYTIwMDAwLCAweDhmYTIwMDAwLAorCTB4OGY4NDVkMGMsIDB4M2MwMzA4MDAsIDB4OGM2MzBhNTAsIDB4MDA4NTEwMjQsIDB4MTQ0M2ZmZTgsIDB4MDA4NTE4MjQsCisJMHgyN2JkMDAwOCwgMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMAorfTsKKworc3RhdGljIHUzMiB0ZzNGd1JvZGF0YVsoVEczX0ZXX1JPREFUQV9MRU4gLyBzaXplb2YodTMyKSkgKyAxXSA9IHsKKwkweDM1MzczMDMxLCAweDcyNmM3MzQxLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDUzNzc0NTc2LCAweDY1NmU3NDMwLAorCTB4MDAwMDAwMDAsIDB4NzI2YzcwNDUsIDB4NzY2NTZlNzQsIDB4MzEwMDAwMDAsIDB4NTU2ZTZiNmUsIDB4NDU3NjZlNzQsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg2NjYxNzQ2MSwgMHg2YzQ1NzI3MiwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDRkNjE2OTZlLCAweDQzNzA3NTQyLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAKK307CisKKyNpZiAwIC8qIEFsbCB6ZXJvcywgZG9uJ3QgZWF0IHVwIHNwYWNlIHdpdGggaXQuICovCit1MzIgdGczRndEYXRhWyhURzNfRldfREFUQV9MRU4gLyBzaXplb2YodTMyKSkgKyAxXSA9IHsKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAKK307CisjZW5kaWYKKworI2RlZmluZSBSWF9DUFVfU0NSQVRDSF9CQVNFCTB4MzAwMDAKKyNkZWZpbmUgUlhfQ1BVX1NDUkFUQ0hfU0laRQkweDA0MDAwCisjZGVmaW5lIFRYX0NQVV9TQ1JBVENIX0JBU0UJMHgzNDAwMAorI2RlZmluZSBUWF9DUFVfU0NSQVRDSF9TSVpFCTB4MDQwMDAKKworLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KK3N0YXRpYyBpbnQgdGczX2hhbHRfY3B1KHN0cnVjdCB0ZzMgKnRwLCB1MzIgb2Zmc2V0KQoreworCWludCBpOworCisJaWYgKG9mZnNldCA9PSBUWF9DUFVfQkFTRSAmJgorCSAgICAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpKQorCQlCVUcoKTsKKworCWlmIChvZmZzZXQgPT0gUlhfQ1BVX0JBU0UpIHsKKwkJZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKKwkJCXR3MzIob2Zmc2V0ICsgQ1BVX1NUQVRFLCAweGZmZmZmZmZmKTsKKwkJCXR3MzIob2Zmc2V0ICsgQ1BVX01PREUsICBDUFVfTU9ERV9IQUxUKTsKKwkJCWlmICh0cjMyKG9mZnNldCArIENQVV9NT0RFKSAmIENQVV9NT0RFX0hBTFQpCisJCQkJYnJlYWs7CisJCX0KKworCQl0dzMyKG9mZnNldCArIENQVV9TVEFURSwgMHhmZmZmZmZmZik7CisJCXR3MzJfZihvZmZzZXQgKyBDUFVfTU9ERSwgIENQVV9NT0RFX0hBTFQpOworCQl1ZGVsYXkoMTApOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7CisJCQl0dzMyKG9mZnNldCArIENQVV9TVEFURSwgMHhmZmZmZmZmZik7CisJCQl0dzMyKG9mZnNldCArIENQVV9NT0RFLCAgQ1BVX01PREVfSEFMVCk7CisJCQlpZiAodHIzMihvZmZzZXQgKyBDUFVfTU9ERSkgJiBDUFVfTU9ERV9IQUxUKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPj0gMTAwMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidGczX3Jlc2V0X2NwdSB0aW1lZCBvdXQgZm9yICVzLCAiCisJCSAgICAgICAiYW5kICVzIENQVVxuIiwKKwkJICAgICAgIHRwLT5kZXYtPm5hbWUsCisJCSAgICAgICAob2Zmc2V0ID09IFJYX0NQVV9CQVNFID8gIlJYIiA6ICJUWCIpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgZndfaW5mbyB7CisJdW5zaWduZWQgaW50IHRleHRfYmFzZTsKKwl1bnNpZ25lZCBpbnQgdGV4dF9sZW47CisJdTMyICp0ZXh0X2RhdGE7CisJdW5zaWduZWQgaW50IHJvZGF0YV9iYXNlOworCXVuc2lnbmVkIGludCByb2RhdGFfbGVuOworCXUzMiAqcm9kYXRhX2RhdGE7CisJdW5zaWduZWQgaW50IGRhdGFfYmFzZTsKKwl1bnNpZ25lZCBpbnQgZGF0YV9sZW47CisJdTMyICpkYXRhX2RhdGE7Cit9OworCisvKiB0cC0+bG9jayBpcyBoZWxkLiAqLworc3RhdGljIGludCB0ZzNfbG9hZF9maXJtd2FyZV9jcHUoc3RydWN0IHRnMyAqdHAsIHUzMiBjcHVfYmFzZSwgdTMyIGNwdV9zY3JhdGNoX2Jhc2UsCisJCQkJIGludCBjcHVfc2NyYXRjaF9zaXplLCBzdHJ1Y3QgZndfaW5mbyAqaW5mbykKK3sKKwlpbnQgZXJyLCBpOworCXUzMiBvcmlnX3RnM19mbGFncyA9IHRwLT50ZzNfZmxhZ3M7CisJdm9pZCAoKndyaXRlX29wKShzdHJ1Y3QgdGczICosIHUzMiwgdTMyKTsKKworCWlmIChjcHVfYmFzZSA9PSBUWF9DUFVfQkFTRSAmJgorCSAgICAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInRnM19sb2FkX2Zpcm13YXJlX2NwdTogVHJ5aW5nIHRvIGxvYWQgIgorCQkgICAgICAgIlRYIGNwdSBmaXJtd2FyZSBvbiAlcyB3aGljaCBpcyA1NzA1LlxuIiwKKwkJICAgICAgIHRwLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpCisJCXdyaXRlX29wID0gdGczX3dyaXRlX21lbTsKKwllbHNlCisJCXdyaXRlX29wID0gdGczX3dyaXRlX2luZGlyZWN0X3JlZzMyOworCisJLyogRm9yY2UgdXNlIG9mIFBDSSBjb25maWcgc3BhY2UgZm9yIGluZGlyZWN0IHJlZ2lzdGVyCisJICogd3JpdGUgY2FsbHMuCisJICovCisJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19QQ0lYX1RBUkdFVF9IV0JVRzsKKworCWVyciA9IHRnM19oYWx0X2NwdSh0cCwgY3B1X2Jhc2UpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZm9yIChpID0gMDsgaSA8IGNwdV9zY3JhdGNoX3NpemU7IGkgKz0gc2l6ZW9mKHUzMikpCisJCXdyaXRlX29wKHRwLCBjcHVfc2NyYXRjaF9iYXNlICsgaSwgMCk7CisJdHczMihjcHVfYmFzZSArIENQVV9TVEFURSwgMHhmZmZmZmZmZik7CisJdHczMihjcHVfYmFzZSArIENQVV9NT0RFLCB0cjMyKGNwdV9iYXNlK0NQVV9NT0RFKXxDUFVfTU9ERV9IQUxUKTsKKwlmb3IgKGkgPSAwOyBpIDwgKGluZm8tPnRleHRfbGVuIC8gc2l6ZW9mKHUzMikpOyBpKyspCisJCXdyaXRlX29wKHRwLCAoY3B1X3NjcmF0Y2hfYmFzZSArCisJCQkgICAgICAoaW5mby0+dGV4dF9iYXNlICYgMHhmZmZmKSArCisJCQkgICAgICAoaSAqIHNpemVvZih1MzIpKSksCisJCQkgKGluZm8tPnRleHRfZGF0YSA/CisJCQkgIGluZm8tPnRleHRfZGF0YVtpXSA6IDApKTsKKwlmb3IgKGkgPSAwOyBpIDwgKGluZm8tPnJvZGF0YV9sZW4gLyBzaXplb2YodTMyKSk7IGkrKykKKwkJd3JpdGVfb3AodHAsIChjcHVfc2NyYXRjaF9iYXNlICsKKwkJCSAgICAgIChpbmZvLT5yb2RhdGFfYmFzZSAmIDB4ZmZmZikgKworCQkJICAgICAgKGkgKiBzaXplb2YodTMyKSkpLAorCQkJIChpbmZvLT5yb2RhdGFfZGF0YSA/CisJCQkgIGluZm8tPnJvZGF0YV9kYXRhW2ldIDogMCkpOworCWZvciAoaSA9IDA7IGkgPCAoaW5mby0+ZGF0YV9sZW4gLyBzaXplb2YodTMyKSk7IGkrKykKKwkJd3JpdGVfb3AodHAsIChjcHVfc2NyYXRjaF9iYXNlICsKKwkJCSAgICAgIChpbmZvLT5kYXRhX2Jhc2UgJiAweGZmZmYpICsKKwkJCSAgICAgIChpICogc2l6ZW9mKHUzMikpKSwKKwkJCSAoaW5mby0+ZGF0YV9kYXRhID8KKwkJCSAgaW5mby0+ZGF0YV9kYXRhW2ldIDogMCkpOworCisJZXJyID0gMDsKKworb3V0OgorCXRwLT50ZzNfZmxhZ3MgPSBvcmlnX3RnM19mbGFnczsKKwlyZXR1cm4gZXJyOworfQorCisvKiB0cC0+bG9jayBpcyBoZWxkLiAqLworc3RhdGljIGludCB0ZzNfbG9hZF81NzAxX2EwX2Zpcm13YXJlX2ZpeChzdHJ1Y3QgdGczICp0cCkKK3sKKwlzdHJ1Y3QgZndfaW5mbyBpbmZvOworCWludCBlcnIsIGk7CisKKwlpbmZvLnRleHRfYmFzZSA9IFRHM19GV19URVhUX0FERFI7CisJaW5mby50ZXh0X2xlbiA9IFRHM19GV19URVhUX0xFTjsKKwlpbmZvLnRleHRfZGF0YSA9ICZ0ZzNGd1RleHRbMF07CisJaW5mby5yb2RhdGFfYmFzZSA9IFRHM19GV19ST0RBVEFfQUREUjsKKwlpbmZvLnJvZGF0YV9sZW4gPSBURzNfRldfUk9EQVRBX0xFTjsKKwlpbmZvLnJvZGF0YV9kYXRhID0gJnRnM0Z3Um9kYXRhWzBdOworCWluZm8uZGF0YV9iYXNlID0gVEczX0ZXX0RBVEFfQUREUjsKKwlpbmZvLmRhdGFfbGVuID0gVEczX0ZXX0RBVEFfTEVOOworCWluZm8uZGF0YV9kYXRhID0gTlVMTDsKKworCWVyciA9IHRnM19sb2FkX2Zpcm13YXJlX2NwdSh0cCwgUlhfQ1BVX0JBU0UsCisJCQkJICAgIFJYX0NQVV9TQ1JBVENIX0JBU0UsIFJYX0NQVV9TQ1JBVENIX1NJWkUsCisJCQkJICAgICZpbmZvKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gdGczX2xvYWRfZmlybXdhcmVfY3B1KHRwLCBUWF9DUFVfQkFTRSwKKwkJCQkgICAgVFhfQ1BVX1NDUkFUQ0hfQkFTRSwgVFhfQ1BVX1NDUkFUQ0hfU0laRSwKKwkJCQkgICAgJmluZm8pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBOb3cgc3RhcnR1cCBvbmx5IHRoZSBSWCBjcHUuICovCisJdHczMihSWF9DUFVfQkFTRSArIENQVV9TVEFURSwgMHhmZmZmZmZmZik7CisJdHczMl9mKFJYX0NQVV9CQVNFICsgQ1BVX1BDLCAgICBURzNfRldfVEVYVF9BRERSKTsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJaWYgKHRyMzIoUlhfQ1BVX0JBU0UgKyBDUFVfUEMpID09IFRHM19GV19URVhUX0FERFIpCisJCQlicmVhazsKKwkJdHczMihSWF9DUFVfQkFTRSArIENQVV9TVEFURSwgMHhmZmZmZmZmZik7CisJCXR3MzIoUlhfQ1BVX0JBU0UgKyBDUFVfTU9ERSwgIENQVV9NT0RFX0hBTFQpOworCQl0dzMyX2YoUlhfQ1BVX0JBU0UgKyBDUFVfUEMsICAgIFRHM19GV19URVhUX0FERFIpOworCQl1ZGVsYXkoMTAwMCk7CisJfQorCWlmIChpID49IDUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidGczX2xvYWRfZmlybXdhcmUgZmFpbHMgZm9yICVzICIKKwkJICAgICAgICJ0byBzZXQgUlggQ1BVIFBDLCBpcyAlMDh4IHNob3VsZCBiZSAlMDh4XG4iLAorCQkgICAgICAgdHAtPmRldi0+bmFtZSwgdHIzMihSWF9DUFVfQkFTRSArIENQVV9QQyksCisJCSAgICAgICBURzNfRldfVEVYVF9BRERSKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXR3MzIoUlhfQ1BVX0JBU0UgKyBDUFVfU1RBVEUsIDB4ZmZmZmZmZmYpOworCXR3MzJfZihSWF9DUFVfQkFTRSArIENQVV9NT0RFLCAgMHgwMDAwMDAwMCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmIFRHM19UU09fU1VQUE9SVCAhPSAwCisKKyNkZWZpbmUgVEczX1RTT19GV19SRUxFQVNFX01BSk9SCTB4MQorI2RlZmluZSBURzNfVFNPX0ZXX1JFTEFTRV9NSU5PUgkJMHg2CisjZGVmaW5lIFRHM19UU09fRldfUkVMRUFTRV9GSVgJCTB4MAorI2RlZmluZSBURzNfVFNPX0ZXX1NUQVJUX0FERFIJCTB4MDgwMDAwMDAKKyNkZWZpbmUgVEczX1RTT19GV19URVhUX0FERFIJCTB4MDgwMDAwMDAKKyNkZWZpbmUgVEczX1RTT19GV19URVhUX0xFTgkJMHgxYWEwCisjZGVmaW5lIFRHM19UU09fRldfUk9EQVRBX0FERFIJCTB4MDgwMDFhYTAKKyNkZWZpbmUgVEczX1RTT19GV19ST0RBVEFfTEVOCQkweDYwCisjZGVmaW5lIFRHM19UU09fRldfREFUQV9BRERSCQkweDA4MDAxYjIwCisjZGVmaW5lIFRHM19UU09fRldfREFUQV9MRU4JCTB4MzAKKyNkZWZpbmUgVEczX1RTT19GV19TQlNTX0FERFIJCTB4MDgwMDFiNTAKKyNkZWZpbmUgVEczX1RTT19GV19TQlNTX0xFTgkJMHgyYworI2RlZmluZSBURzNfVFNPX0ZXX0JTU19BRERSCQkweDA4MDAxYjgwCisjZGVmaW5lIFRHM19UU09fRldfQlNTX0xFTgkJMHg4OTQKKworc3RhdGljIHUzMiB0ZzNUc29Gd1RleHRbKFRHM19UU09fRldfVEVYVF9MRU4gLyA0KSArIDFdID0geworCTB4MGUwMDAwMDMsIDB4MDAwMDAwMDAsIDB4MDgwMDFiMjQsIDB4MDAwMDAwMDAsIDB4MTAwMDAwMDMsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwZCwgMHgwMDAwMDAwZCwgMHgzYzFkMDgwMCwgMHgzN2JkNDAwMCwgMHgwM2EwZjAyMSwgMHgzYzEwMDgwMCwKKwkweDI2MTAwMDAwLCAweDBlMDAwMDEwLCAweDAwMDAwMDAwLCAweDAwMDAwMDBkLCAweDI3YmRmZmUwLCAweDNjMDRmZWZlLAorCTB4YWZiZjAwMTgsIDB4MGUwMDA1ZDgsIDB4MzQ4NDAwMDIsIDB4MGUwMDA2NjgsIDB4MDAwMDAwMDAsIDB4M2MwMzA4MDAsCisJMHg5MDYzMWI2OCwgMHgyNDAyMDAwMiwgMHgzYzA0MDgwMCwgMHgyNDg0MWFhYywgMHgxNDYyMDAwMywgMHgyNDA1MDAwMSwKKwkweDNjMDQwODAwLCAweDI0ODQxYWEwLCAweDI0MDYwMDA2LCAweDAwMDAzODIxLCAweGFmYTAwMDEwLCAweDBlMDAwNjdjLAorCTB4YWZhMDAwMTQsIDB4OGY2MjVjNTAsIDB4MzQ0MjAwMDEsIDB4YWY2MjVjNTAsIDB4OGY2MjVjOTAsIDB4MzQ0MjAwMDEsCisJMHhhZjYyNWM5MCwgMHgyNDAyZmZmZiwgMHgwZTAwMDAzNCwgMHhhZjYyNTQwNCwgMHg4ZmJmMDAxOCwgMHgwM2UwMDAwOCwKKwkweDI3YmQwMDIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI3YmRmZmUwLCAweGFmYmYwMDFjLAorCTB4YWZiMjAwMTgsIDB4YWZiMTAwMTQsIDB4MGUwMDAwNWIsIDB4YWZiMDAwMTAsIDB4MjQxMjAwMDIsIDB4MjQxMTAwMDEsCisJMHg4ZjcwNjgyMCwgMHgzMjAyMDEwMCwgMHgxMDQwMDAwMywgMHgwMDAwMDAwMCwgMHgwZTAwMDBiYiwgMHgwMDAwMDAwMCwKKwkweDhmNzA2ODIwLCAweDMyMDIyMDAwLCAweDEwNDAwMDA0LCAweDMyMDIwMDAxLCAweDBlMDAwMWYwLCAweDI0MDQwMDAxLAorCTB4MzIwMjAwMDEsIDB4MTA0MDAwMDMsIDB4MDAwMDAwMDAsIDB4MGUwMDAwYTMsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsCisJMHg5MDQyMWI5OCwgMHgxNDUyMDAwMywgMHgwMDAwMDAwMCwgMHgwZTAwMDRjMCwgMHgwMDAwMDAwMCwgMHgwYTAwMDAzYywKKwkweGFmNzE1MDI4LCAweDhmYmYwMDFjLCAweDhmYjIwMDE4LCAweDhmYjEwMDE0LCAweDhmYjAwMDEwLCAweDAzZTAwMDA4LAorCTB4MjdiZDAwMjAsIDB4MjdiZGZmZTAsIDB4M2MwNDA4MDAsIDB4MjQ4NDFhYzAsIDB4MDAwMDI4MjEsIDB4MDAwMDMwMjEsCisJMHgwMDAwMzgyMSwgMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHgwZTAwMDY3YywgMHhhZmEwMDAxNCwgMHgzYzA0MDgwMCwKKwkweDI0ODQyM2Q4LCAweGE0ODAwMDAwLCAweDNjMDEwODAwLCAweGEwMjAxYjk4LCAweDNjMDEwODAwLCAweGFjMjAxYjljLAorCTB4M2MwMTA4MDAsIDB4YWMyMDFiYTAsIDB4M2MwMTA4MDAsIDB4YWMyMDFiYTQsIDB4M2MwMTA4MDAsIDB4YWMyMDFiYWMsCisJMHgzYzAxMDgwMCwgMHhhYzIwMWJiOCwgMHgzYzAxMDgwMCwgMHhhYzIwMWJiYywgMHg4ZjYyNDQzNCwgMHgzYzAxMDgwMCwKKwkweGFjMjIxYjg4LCAweDhmNjI0NDM4LCAweDNjMDEwODAwLCAweGFjMjIxYjhjLCAweDhmNjI0NDEwLCAweGFjODBmN2E4LAorCTB4M2MwMTA4MDAsIDB4YWMyMDFiODQsIDB4M2MwMTA4MDAsIDB4YWMyMDIzZTAsIDB4M2MwMTA4MDAsIDB4YWMyMDIzYzgsCisJMHgzYzAxMDgwMCwgMHhhYzIwMjNjYywgMHgzYzAxMDgwMCwgMHhhYzIwMjQwMCwgMHgzYzAxMDgwMCwgMHhhYzIyMWI5MCwKKwkweDhmNjIwMDY4LCAweDI0MDMwMDA3LCAweDAwMDIxNzAyLCAweDEwNDMwMDA1LCAweDAwMDAwMDAwLCAweDhmNjIwMDY4LAorCTB4MDAwMjE3MDIsIDB4MTQ0MDAwMDQsIDB4MjQwMjAwMDEsIDB4M2MwMTA4MDAsIDB4MGEwMDAwOTcsIDB4YWMyMDI0MGMsCisJMHhhYzgyMDAzNCwgMHgzYzA0MDgwMCwgMHgyNDg0MWFjYywgMHgzYzA1MDgwMCwgMHg4Y2E1MjQwYywgMHgwMDAwMzAyMSwKKwkweDAwMDAzODIxLCAweGFmYTAwMDEwLCAweDBlMDAwNjdjLCAweGFmYTAwMDE0LCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LAorCTB4MjdiZDAwMjAsIDB4MjdiZGZmZTAsIDB4M2MwNDA4MDAsIDB4MjQ4NDFhZDgsIDB4MDAwMDI4MjEsIDB4MDAwMDMwMjEsCisJMHgwMDAwMzgyMSwgMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHgwZTAwMDY3YywgMHhhZmEwMDAxNCwgMHgwZTAwMDA1YiwKKwkweDAwMDAwMDAwLCAweDBlMDAwMGI0LCAweDAwMDAyMDIxLCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLAorCTB4MjQwMjAwMDEsIDB4OGY2MzY4MjAsIDB4MDA4MjEwMDQsIDB4MDAwMjEwMjcsIDB4MDA2MjE4MjQsIDB4MDNlMDAwMDgsCisJMHhhZjYzNjgyMCwgMHgyN2JkZmZkMCwgMHhhZmJmMDAyYywgMHhhZmI2MDAyOCwgMHhhZmI1MDAyNCwgMHhhZmI0MDAyMCwKKwkweGFmYjMwMDFjLCAweGFmYjIwMDE4LCAweGFmYjEwMDE0LCAweGFmYjAwMDEwLCAweDhmNjc1YzVjLCAweDNjMDMwODAwLAorCTB4MjQ2MzFiYmMsIDB4OGM2MjAwMDAsIDB4MTQ0NzAwMDUsIDB4M2MwMjAwZmYsIDB4M2MwMjA4MDAsIDB4OTA0MjFiOTgsCisJMHgxNDQwMDExOSwgMHgzYzAyMDBmZiwgMHgzNDQyZmZmOCwgMHgwMGUyODgyNCwgMHhhYzY3MDAwMCwgMHgwMDExMTkwMiwKKwkweDMwNjMwMGZmLCAweDMwZTIwMDAzLCAweDAwMDIxMWMwLCAweDAwNjIyODI1LCAweDAwYTA0MDIxLCAweDAwMDcxNjAyLAorCTB4M2MwMzA4MDAsIDB4OTA2MzFiOTgsIDB4MzA0NDAwMGYsIDB4MTQ2MDAwMzYsIDB4MDA4MDQ4MjEsIDB4MjQwMjAwMDEsCisJMHgzYzAxMDgwMCwgMHhhMDIyMWI5OCwgMHgwMDA1MTEwMCwgMHgwMDgyMTAyNSwgMHgzYzAxMDgwMCwgMHhhYzIwMWI5YywKKwkweDNjMDEwODAwLCAweGFjMjAxYmEwLCAweDNjMDEwODAwLCAweGFjMjAxYmE0LCAweDNjMDEwODAwLCAweGFjMjAxYmFjLAorCTB4M2MwMTA4MDAsIDB4YWMyMDFiYjgsIDB4M2MwMTA4MDAsIDB4YWMyMDFiYjAsIDB4M2MwMTA4MDAsIDB4YWMyMDFiYjQsCisJMHgzYzAxMDgwMCwgMHhhNDIyMjNkOCwgMHg5NjIyMDAwYywgMHgzMDQzN2ZmZiwgMHgzYzAxMDgwMCwgMHhhNDIyMjQxMCwKKwkweDMwNDI4MDAwLCAweDNjMDEwODAwLCAweGE0MjMxYmM2LCAweDEwNDAwMDA1LCAweDI0MDIwMDAxLCAweDNjMDEwODAwLAorCTB4YWMyMjIzZjQsIDB4MGEwMDAxMDIsIDB4MjQwNjAwM2UsIDB4MjQwNjAwMzYsIDB4M2MwMTA4MDAsIDB4YWMyMDIzZjQsCisJMHg5NjIyMDAwYSwgMHgzYzAzMDgwMCwgMHg5NDYzMWJjNiwgMHgzYzAxMDgwMCwgMHhhYzIwMjNmMCwgMHgzYzAxMDgwMCwKKwkweGFjMjAyM2Y4LCAweDAwMDIxMzAyLCAweDAwMDIxMDgwLCAweDAwYzIxMDIxLCAweDAwNjIxODIxLCAweDNjMDEwODAwLAorCTB4YTQyMjIzZDAsIDB4M2MwMTA4MDAsIDB4MGEwMDAxMTUsIDB4YTQyMzFiOTYsIDB4OTYyMjAwMGMsIDB4M2MwMTA4MDAsCisJMHhhNDIyMjNlYywgMHgzYzA0MDgwMCwgMHgyNDg0MWI5YywgMHg4YzgyMDAwMCwgMHgwMDAyMTEwMCwgMHgzYzAxMDgwMCwKKwkweDAwMjIwODIxLCAweGFjMzExYmM4LCAweDhjODIwMDAwLCAweDAwMDIxMTAwLCAweDNjMDEwODAwLCAweDAwMjIwODIxLAorCTB4YWMyNzFiY2MsIDB4OGM4MjAwMDAsIDB4MjUwMzAwMDEsIDB4MzA2NjAxZmYsIDB4MDAwMjExMDAsIDB4M2MwMTA4MDAsCisJMHgwMDIyMDgyMSwgMHhhYzI2MWJkMCwgMHg4YzgyMDAwMCwgMHgwMDAyMTEwMCwgMHgzYzAxMDgwMCwgMHgwMDIyMDgyMSwKKwkweGFjMjkxYmQ0LCAweDk2MjMwMDA4LCAweDNjMDIwODAwLCAweDhjNDIxYmFjLCAweDAwNDMyODIxLCAweDNjMDEwODAwLAorCTB4YWMyNTFiYWMsIDB4OTYyMjAwMGEsIDB4MzA0MjAwMDQsIDB4MTQ0MDAwMTgsIDB4MDAwNjExMDAsIDB4OGY2MzBjMTQsCisJMHgzMDYzMDAwZiwgMHgyYzYyMDAwMiwgMHgxNDQwMDAwYiwgMHgzYzAyYzAwMCwgMHg4ZjYzMGMxNCwgMHgzYzAyMDgwMCwKKwkweDhjNDIxYjQwLCAweDMwNjMwMDBmLCAweDI0NDIwMDAxLCAweDNjMDEwODAwLCAweGFjMjIxYjQwLCAweDJjNjIwMDAyLAorCTB4MTA0MGZmZjcsIDB4M2MwMmMwMDAsIDB4MDBlMjE4MjUsIDB4YWY2MzVjNWMsIDB4OGY2MjVjNTAsIDB4MzA0MjAwMDIsCisJMHgxMDQwMDAxNCwgMHgwMDAwMDAwMCwgMHgwYTAwMDE0NywgMHgwMDAwMDAwMCwgMHgzYzAzMDgwMCwgMHg4YzYzMWI4MCwKKwkweDNjMDQwODAwLCAweDk0ODQxYjk0LCAweDAxMjIxMDI1LCAweDNjMDEwODAwLCAweGE0MjIyM2RhLCAweDI0MDIwMDAxLAorCTB4M2MwMTA4MDAsIDB4YWMyMjFiYjgsIDB4MjQ2MzAwMDEsIDB4MDA4NTIwMmEsIDB4M2MwMTA4MDAsIDB4MTA4MDAwMDMsCisJMHhhYzIzMWI4MCwgMHgzYzAxMDgwMCwgMHhhNDI1MWI5NCwgMHgzYzA2MDgwMCwgMHgyNGM2MWI5YywgMHg4Y2MyMDAwMCwKKwkweDI0NDIwMDAxLCAweGFjYzIwMDAwLCAweDI4NDIwMDgwLCAweDE0NDAwMDA1LCAweDAwMDAwMDAwLCAweDBlMDAwNjU2LAorCTB4MjQwNDAwMDIsIDB4MGEwMDAxZTYsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsIDB4OGM0MjFiYjgsIDB4MTA0MDAwNzgsCisJMHgyNDAyMDAwMSwgMHgzYzA1MDgwMCwgMHg5MGE1MWI5OCwgMHgxNGEyMDA3MiwgMHgwMDAwMDAwMCwgMHgzYzE1MDgwMCwKKwkweDk2YjUxYjk2LCAweDNjMDQwODAwLCAweDhjODQxYmFjLCAweDMyYTNmZmZmLCAweDAwODMxMDJhLCAweDE0NDAwMDZjLAorCTB4MDAwMDAwMDAsIDB4MTQ4MzAwMDMsIDB4MDAwMDAwMDAsIDB4M2MwMTA4MDAsIDB4YWMyNTIzZjAsIDB4MTA2MDAwNWMsCisJMHgwMDAwOTAyMSwgMHgyNGQ2MDAwNCwgMHgwMDYwYTAyMSwgMHgyNGQzMDAxNCwgMHg4ZWMyMDAwMCwgMHgwMDAyODEwMCwKKwkweDNjMTEwODAwLCAweDAyMzA4ODIxLCAweDBlMDAwNjI1LCAweDhlMzExYmM4LCAweDAwNDAyODIxLCAweDEwYTAwMDU0LAorCTB4MDAwMDAwMDAsIDB4OTYyODAwMGEsIDB4MzEwMjAwNDAsIDB4MTA0MDAwMDUsIDB4MjQwNzE4MGMsIDB4OGUyMjAwMGMsCisJMHgyNDA3MTg4YywgMHgwMDAyMTQwMCwgMHhhY2EyMDAxOCwgMHgzYzAzMDgwMCwgMHgwMDcwMTgyMSwgMHg4YzYzMWJkMCwKKwkweDNjMDIwODAwLCAweDAwNTAxMDIxLCAweDhjNDIxYmQ0LCAweDAwMDMxZDAwLCAweDAwMDIxNDAwLCAweDAwNjIxODI1LAorCTB4YWNhMzAwMTQsIDB4OGVjMzAwMDQsIDB4OTYyMjAwMDgsIDB4MDA0MzIwMjMsIDB4MzI0MmZmZmYsIDB4MzA4M2ZmZmYsCisJMHgwMDQzMTAyMSwgMHgwMjgyMTAyYSwgMHgxNDQwMDAwMiwgMHgwMmIyMzAyMywgMHgwMDgwMzAyMSwgMHg4ZTYyMDAwMCwKKwkweDMwYzRmZmZmLCAweDAwNDQxMDIxLCAweGFlNjIwMDAwLCAweDhlMjIwMDAwLCAweGFjYTIwMDAwLCAweDhlMjIwMDA0LAorCTB4OGU2M2ZmZjQsIDB4MDA0MzEwMjEsIDB4YWNhMjAwMDQsIDB4YTRhNjAwMGUsIDB4OGU2MmZmZjQsIDB4MDA0NDEwMjEsCisJMHhhZTYyZmZmNCwgMHg5NjIzMDAwOCwgMHgwMDQzMTAyYSwgMHgxNDQwMDAwNSwgMHgwMjQ2OTAyMSwgMHg4ZTYyZmZmMCwKKwkweGFlNjBmZmY0LCAweDI0NDIwMDAxLCAweGFlNjJmZmYwLCAweGFjYTAwMDA4LCAweDMyNDJmZmZmLCAweDE0NTQwMDA4LAorCTB4MjQwMjAzMDUsIDB4MzEwMjAwODAsIDB4NTQ0MDAwMDEsIDB4MzRlNzAwMTAsIDB4MjQwMjA5MDUsIDB4YTRhMjAwMGMsCisJMHgwYTAwMDFjYiwgMHgzNGU3MDAyMCwgMHhhNGEyMDAwYywgMHgzYzAyMDgwMCwgMHg4YzQyMjNmMCwgMHgxMDQwMDAwMywKKwkweDNjMDI0YjY1LCAweDBhMDAwMWQzLCAweDM0NDI3NjU0LCAweDNjMDJiNDlhLCAweDM0NDI4OWFiLCAweGFjYTIwMDFjLAorCTB4MzBlMmZmZmYsIDB4YWNhMjAwMTAsIDB4MGUwMDA1YTIsIDB4MDBhMDIwMjEsIDB4MzI0MmZmZmYsIDB4MDA1NDEwMmIsCisJMHgxNDQwZmZhOSwgMHgwMDAwMDAwMCwgMHgyNDAyMDAwMiwgMHgzYzAxMDgwMCwgMHgwYTAwMDFlNiwgMHhhMDIyMWI5OCwKKwkweDhlYzIwODNjLCAweDI0NDIwMDAxLCAweDBhMDAwMWU2LCAweGFlYzIwODNjLCAweDBlMDAwNGMwLCAweDAwMDAwMDAwLAorCTB4OGZiZjAwMmMsIDB4OGZiNjAwMjgsIDB4OGZiNTAwMjQsIDB4OGZiNDAwMjAsIDB4OGZiMzAwMWMsIDB4OGZiMjAwMTgsCisJMHg4ZmIxMDAxNCwgMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAzMCwgMHgyN2JkZmZkMCwgMHhhZmJmMDAyOCwKKwkweGFmYjMwMDI0LCAweGFmYjIwMDIwLCAweGFmYjEwMDFjLCAweGFmYjAwMDE4LCAweDhmNzI1YzljLCAweDNjMDIwMGZmLAorCTB4MzQ0MmZmZjgsIDB4M2MwNzA4MDAsIDB4MjRlNzFiYjQsIDB4MDI0Mjg4MjQsIDB4OTYyMzAwMGUsIDB4OGNlMjAwMDAsCisJMHgwMDQzMTAyMSwgMHhhY2UyMDAwMCwgMHg4ZTIyMDAxMCwgMHgzMDQyMDAyMCwgMHgxNDQwMDAxMSwgMHgwMDgwOTgyMSwKKwkweDBlMDAwNjNiLCAweDAyMjAyMDIxLCAweDNjMDJjMDAwLCAweDAyNDIxODI1LCAweGFmNjM1YzljLCAweDhmNjI1YzkwLAorCTB4MzA0MjAwMDIsIDB4MTA0MDAxMWUsIDB4MDAwMDAwMDAsIDB4YWY2MzVjOWMsIDB4OGY2MjVjOTAsIDB4MzA0MjAwMDIsCisJMHgxMDQwMDExOSwgMHgwMDAwMDAwMCwgMHgwYTAwMDIwZCwgMHgwMDAwMDAwMCwgMHg4ZTI0MDAwOCwgMHg4ZTIzMDAxNCwKKwkweDAwMDQxNDAyLCAweDAwMDIzMWMwLCAweDAwMDMxNTAyLCAweDMwNDIwMWZmLCAweDI0NDJmZmZmLCAweDMwNDIwMDdmLAorCTB4MDAwMzE5NDIsIDB4MzA2Mzc4MDAsIDB4MDAwMjExMDAsIDB4MjQ0MjQwMDAsIDB4MDA2MjQ4MjEsIDB4OTUyMjAwMGEsCisJMHgzMDg0ZmZmZiwgMHgzMDQyMDAwOCwgMHgxMDQwMDBiMCwgMHgwMDA0MjljMCwgMHgzYzAyMDgwMCwgMHg4YzQyMjQwMCwKKwkweDE0NDAwMDI0LCAweDI0YzUwMDA4LCAweDk0YzIwMDE0LCAweDNjMDEwODAwLCAweGE0MjIyM2QwLCAweDhjYzQwMDEwLAorCTB4MDAwNDE0MDIsIDB4M2MwMTA4MDAsIDB4YTQyMjIzZDIsIDB4M2MwMTA4MDAsIDB4YTQyNDIzZDQsIDB4OTRjMjAwMGUsCisJMHgzMDgzZmZmZiwgMHgwMDQzMTAyMywgMHgzYzAxMDgwMCwgMHhhYzIyMjQwOCwgMHg5NGMyMDAxYSwgMHgzYzAxMDgwMCwKKwkweGFjMjYyNDAwLCAweDNjMDEwODAwLCAweGFjMzIyNDA0LCAweDNjMDEwODAwLCAweGFjMjIyM2ZjLCAweDNjMDJjMDAwLAorCTB4MDI0MjE4MjUsIDB4YWY2MzVjOWMsIDB4OGY2MjVjOTAsIDB4MzA0MjAwMDIsIDB4MTA0MDAwZTUsIDB4MDAwMDAwMDAsCisJMHhhZjYzNWM5YywgMHg4ZjYyNWM5MCwgMHgzMDQyMDAwMiwgMHgxMDQwMDBlMCwgMHgwMDAwMDAwMCwgMHgwYTAwMDI0NiwKKwkweDAwMDAwMDAwLCAweDk0YzIwMDBlLCAweDNjMDMwODAwLCAweDk0NjMyM2Q0LCAweDAwNDM0MDIzLCAweDMxMDNmZmZmLAorCTB4MmM2MjAwMDgsIDB4MTA0MDAwMWMsIDB4MDAwMDAwMDAsIDB4OTRjMjAwMTQsIDB4MjQ0MjAwMjgsIDB4MDBhMjI4MjEsCisJMHgwMDAzMTA0MiwgMHgxODQwMDAwYiwgMHgwMDAwMjAyMSwgMHgyNGU2MDg0OCwgMHgwMDQwMzgyMSwgMHg5NGEzMDAwMCwKKwkweDhjYzIwMDAwLCAweDI0ODQwMDAxLCAweDAwNDMxMDIxLCAweGFjYzIwMDAwLCAweDAwODcxMDJhLCAweDE0NDBmZmY5LAorCTB4MjRhNTAwMDIsIDB4MzEwMjAwMDEsIDB4MTA0MDAwMWYsIDB4M2MwMjQwMDAsIDB4M2MwNDA4MDAsIDB4MjQ4NDIzZmMsCisJMHhhMGEwMDAwMSwgMHg5NGEzMDAwMCwgMHg4YzgyMDAwMCwgMHgwMDQzMTAyMSwgMHgwYTAwMDI4NSwgMHhhYzgyMDAwMCwKKwkweDhmNjI2ODAwLCAweDNjMDMwMDEwLCAweDAwNDMxMDI0LCAweDEwNDAwMDA5LCAweDAwMDAwMDAwLCAweDk0YzIwMDFhLAorCTB4M2MwMzA4MDAsIDB4OGM2MzIzZmMsIDB4MDA0MzEwMjEsIDB4M2MwMTA4MDAsIDB4YWMyMjIzZmMsIDB4MGEwMDAyODYsCisJMHgzYzAyNDAwMCwgMHg5NGMyMDAxYSwgMHg5NGM0MDAxYywgMHgzYzAzMDgwMCwgMHg4YzYzMjNmYywgMHgwMDQ0MTAyMywKKwkweDAwNjIxODIxLCAweDNjMDEwODAwLCAweGFjMjMyM2ZjLCAweDNjMDI0MDAwLCAweDAyNDIxODI1LCAweGFmNjM1YzljLAorCTB4OGY2MjVjOTAsIDB4MzA0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MDAwMDAwMDAsIDB4OTUyMjAwMGEsIDB4MzA0MjAwMTAsCisJMHgxMDQwMDA5YiwgMHgwMDAwMDAwMCwgMHgzYzAzMDgwMCwgMHg5NDYzMjNkNCwgMHgzYzA3MDgwMCwgMHgyNGU3MjQwMCwKKwkweDhjZTQwMDAwLCAweDhmNjI2ODAwLCAweDI0NjMwMDMwLCAweDAwODMyODIxLCAweDNjMDMwMDEwLCAweDAwNDMxMDI0LAorCTB4MTQ0MDAwMGEsIDB4MDAwMDAwMDAsIDB4OTRhMjAwMDQsIDB4M2MwNDA4MDAsIDB4OGM4NDI0MDgsIDB4M2MwMzA4MDAsCisJMHg4YzYzMjNmYywgMHgwMDQ0MTAyMywgMHgwMDYyMTgyMSwgMHgzYzAxMDgwMCwgMHhhYzIzMjNmYywgMHgzYzA0MDgwMCwKKwkweDhjODQyM2ZjLCAweDAwMDQxYzAyLCAweDMwODJmZmZmLCAweDAwNjIyMDIxLCAweDAwMDQxNDAyLCAweDAwODIyMDIxLAorCTB4MDAwNDEwMjcsIDB4YTRhMjAwMDYsIDB4M2MwMzA4MDAsIDB4OGM2MzI0MDQsIDB4M2MwMjAwZmYsIDB4MzQ0MmZmZjgsCisJMHgwMDYyODgyNCwgMHg5NjIyMDAwOCwgMHgyNDA1MDAwMSwgMHgyNDAzNDAwMCwgMHgwMDAyMzFjMCwgMHgwMDgwMTAyMSwKKwkweGE0YzIwMDFhLCAweGE0YzAwMDFjLCAweGFjZTAwMDAwLCAweDNjMDEwODAwLCAweGFjMjUxYjYwLCAweGFmNjM1Y2I4LAorCTB4OGY2MjVjYjAsIDB4MzA0MjAwMDIsIDB4MTA0MDAwMDMsIDB4MDAwMDAwMDAsIDB4M2MwMTA4MDAsIDB4YWMyMDFiNjAsCisJMHg4ZTIyMDAwOCwgMHhhZjYyNWNiOCwgMHg4ZjYyNWNiMCwgMHgzMDQyMDAwMiwgMHgxMDQwMDAwMywgMHgwMDAwMDAwMCwKKwkweDNjMDEwODAwLCAweGFjMjAxYjYwLCAweDNjMDIwODAwLCAweDhjNDIxYjYwLCAweDEwNDBmZmVjLCAweDAwMDAwMDAwLAorCTB4M2MwNDA4MDAsIDB4MGUwMDA2M2IsIDB4OGM4NDI0MDQsIDB4MGEwMDAzMmEsIDB4MDAwMDAwMDAsIDB4M2MwMzA4MDAsCisJMHg5MDYzMWI5OCwgMHgyNDAyMDAwMiwgMHgxNDYyMDAwMywgMHgzYzAzNGI2NSwgMHgwYTAwMDJlMSwgMHgwMDAwODAyMSwKKwkweDhlMjIwMDFjLCAweDM0NjM3NjU0LCAweDEwNDMwMDAyLCAweDI0MTAwMDAyLCAweDI0MTAwMDAxLCAweDAwYzAyMDIxLAorCTB4MGUwMDAzNTAsIDB4MDIwMDMwMjEsIDB4MjQwMjAwMDMsIDB4M2MwMTA4MDAsIDB4YTAyMjFiOTgsIDB4MjQwMjAwMDIsCisJMHgxMjAyMDAwYSwgMHgyNDAyMDAwMSwgMHgzYzAzMDgwMCwgMHg4YzYzMjNmMCwgMHgxMDYyMDAwNiwgMHgwMDAwMDAwMCwKKwkweDNjMDIwODAwLCAweDk0NDIyM2Q4LCAweDAwMDIxNDAwLCAweDBhMDAwMzFmLCAweGFlMjIwMDE0LCAweDNjMDQwODAwLAorCTB4MjQ4NDIzZGEsIDB4OTQ4MjAwMDAsIDB4MDAwMjE0MDAsIDB4YWUyMjAwMTQsIDB4M2MwMjA4MDAsIDB4OGM0MjFiYmMsCisJMHgzYzAzYzAwMCwgMHgzYzAxMDgwMCwgMHhhMDIwMWI5OCwgMHgwMDQzMTAyNSwgMHhhZjYyNWM1YywgMHg4ZjYyNWM1MCwKKwkweDMwNDIwMDAyLCAweDEwNDAwMDA5LCAweDAwMDAwMDAwLCAweDI0ODRmN2UyLCAweDhjODIwMDAwLCAweDAwNDMxMDI1LAorCTB4YWY2MjVjNWMsIDB4OGY2MjVjNTAsIDB4MzA0MjAwMDIsIDB4MTQ0MGZmZmEsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsCisJMHgyNDQyMWI4NCwgMHg4YzQzMDAwMCwgMHgyNDYzMDAwMSwgMHhhYzQzMDAwMCwgMHg4ZjYzMGMxNCwgMHgzMDYzMDAwZiwKKwkweDJjNjIwMDAyLCAweDE0NDAwMDBjLCAweDNjMDI0MDAwLCAweDhmNjMwYzE0LCAweDNjMDIwODAwLCAweDhjNDIxYjQwLAorCTB4MzA2MzAwMGYsIDB4MjQ0MjAwMDEsIDB4M2MwMTA4MDAsIDB4YWMyMjFiNDAsIDB4MmM2MjAwMDIsIDB4MTA0MGZmZjcsCisJMHgwMDAwMDAwMCwgMHgzYzAyNDAwMCwgMHgwMjQyMTgyNSwgMHhhZjYzNWM5YywgMHg4ZjYyNWM5MCwgMHgzMDQyMDAwMiwKKwkweDE0NDBmZmZjLCAweDAwMDAwMDAwLCAweDEyNjAwMDAzLCAweDAwMDAwMDAwLCAweDBlMDAwNGMwLCAweDAwMDAwMDAwLAorCTB4OGZiZjAwMjgsIDB4OGZiMzAwMjQsIDB4OGZiMjAwMjAsIDB4OGZiMTAwMWMsIDB4OGZiMDAwMTgsIDB4MDNlMDAwMDgsCisJMHgyN2JkMDAzMCwgMHg4ZjYzNDQ1MCwgMHgzYzA0MDgwMCwgMHgyNDg0MWI4OCwgMHg4YzgyMDAwMCwgMHgwMDAzMWMwMiwKKwkweDAwNDMxMDJiLCAweDE0NDAwMDA3LCAweDNjMDM4MDAwLCAweDhjODQwMDA0LCAweDhmNjI0NDUwLCAweDAwMDIxYzAyLAorCTB4MDA4MzEwMmIsIDB4MTA0MGZmZmMsIDB4M2MwMzgwMDAsIDB4YWY2MzQ0NDQsIDB4OGY2MjQ0NDQsIDB4MDA0MzEwMjQsCisJMHgxNDQwZmZmZCwgMHgwMDAwMDAwMCwgMHg4ZjYyNDQ0OCwgMHgwM2UwMDAwOCwgMHgzMDQyZmZmZiwgMHgzYzAyNDAwMCwKKwkweDAwODIyMDI1LCAweGFmNjQ1YzM4LCAweDhmNjI1YzMwLCAweDMwNDIwMDAyLCAweDE0NDBmZmZjLCAweDAwMDAwMDAwLAorCTB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsIDB4MjdiZGZmZTAsIDB4MDA4MDU4MjEsIDB4MTRjMDAwMTEsIDB4MjU2ZTAwMDgsCisJMHgzYzAyMDgwMCwgMHg4YzQyMjNmNCwgMHgxMDQwMDAwNywgMHgyNDAyMDAxNiwgMHgzYzAxMDgwMCwgMHhhNDIyMjNkMiwKKwkweDI0MDIwMDJhLCAweDNjMDEwODAwLCAweDBhMDAwMzY0LCAweGE0MjIyM2Q0LCAweDhkNjcwMDEwLCAweDAwMDcxNDAyLAorCTB4M2MwMTA4MDAsIDB4YTQyMjIzZDIsIDB4M2MwMTA4MDAsIDB4YTQyNzIzZDQsIDB4M2MwNDA4MDAsIDB4OTQ4NDIzZDQsCisJMHgzYzAzMDgwMCwgMHg5NDYzMjNkMiwgMHg5NWNmMDAwNiwgMHgzYzAyMDgwMCwgMHg5NDQyMjNkMCwgMHgwMDgzMjAyMywKKwkweDAxZTJjMDIzLCAweDMwNjVmZmZmLCAweDI0YTIwMDI4LCAweDAxYzI0ODIxLCAweDMwODJmZmZmLCAweDE0YzAwMDFhLAorCTB4MDEyMjYwMjEsIDB4OTU4MjAwMGMsIDB4MzA0MjAwM2YsIDB4M2MwMTA4MDAsIDB4YTQyMjIzZDYsIDB4OTU4MjAwMDQsCisJMHg5NTgzMDAwNiwgMHgzYzAxMDgwMCwgMHhhYzIwMjNlNCwgMHgzYzAxMDgwMCwgMHhhYzIwMjNlOCwgMHgwMDAyMTQwMCwKKwkweDAwNDMxMDI1LCAweDNjMDEwODAwLCAweGFjMjIxYmMwLCAweDk1MjIwMDA0LCAweDNjMDEwODAwLCAweGE0MjIxYmM0LAorCTB4OTUyMzAwMDIsIDB4MDFlNTEwMjMsIDB4MDA0MzEwMmEsIDB4MTA0MDAwMTAsIDB4MjQwMjAwMDEsIDB4M2MwMTA4MDAsCisJMHgwYTAwMDM5OCwgMHhhYzIyMjNmOCwgMHgzYzAzMDgwMCwgMHg4YzYzMjNlOCwgMHgzYzAyMDgwMCwgMHg5NDQyMWJjNCwKKwkweDAwNDMxMDIxLCAweGE1MjIwMDA0LCAweDNjMDIwODAwLCAweDk0NDIxYmMwLCAweGE1ODIwMDA0LCAweDNjMDIwODAwLAorCTB4OGM0MjFiYzAsIDB4YTU4MjAwMDYsIDB4M2MwMjA4MDAsIDB4OGM0MjIzZjAsIDB4M2MwZDA4MDAsIDB4OGRhZDIzZTQsCisJMHgzYzBhMDgwMCwgMHgxNDQwMDBlNSwgMHg4ZDRhMjNlOCwgMHgzYzAyMDgwMCwgMHg5NDQyMWJjNCwgMHgwMDRhMTgyMSwKKwkweDMwNjNmZmZmLCAweDAwNjIxODJiLCAweDI0MDIwMDAyLCAweDEwYzIwMDBkLCAweDAxNDM1MDIzLCAweDNjMDIwODAwLAorCTB4OTQ0MjIzZDYsIDB4MzA0MjAwMDksIDB4MTA0MDAwMDgsIDB4MDAwMDAwMDAsIDB4OTU4MjAwMGMsIDB4MzA0MmZmZjYsCisJMHhhNTgyMDAwYywgMHgzYzAyMDgwMCwgMHg5NDQyMjNkNiwgMHgzMDQyMDAwOSwgMHgwMWEyNjgyMywgMHgzYzAyMDgwMCwKKwkweDhjNDIyM2Y4LCAweDEwNDAwMDRhLCAweDAxMjAzODIxLCAweDNjMDIwODAwLCAweDk0NDIyM2QyLCAweDAwMDA0MDIxLAorCTB4YTUyMDAwMGEsIDB4MDFlMjEwMjMsIDB4YTUyMjAwMDIsIDB4MzA4MmZmZmYsIDB4MDAwMjEwNDIsIDB4MTg0MDAwMDgsCisJMHgwMDAwMzAyMSwgMHgwMDQwMTgyMSwgMHg5NGUyMDAwMCwgMHgyNTA4MDAwMSwgMHgwMGMyMzAyMSwgMHgwMTAzMTAyYSwKKwkweDE0NDBmZmZiLCAweDI0ZTcwMDAyLCAweDAwMDYxYzAyLCAweDMwYzJmZmZmLCAweDAwNjIzMDIxLCAweDAwMDYxNDAyLAorCTB4MDBjMjMwMjEsIDB4MDBjMDI4MjEsIDB4MDAwNjEwMjcsIDB4YTUyMjAwMGEsIDB4MDAwMDMwMjEsIDB4MjUyNzAwMGMsCisJMHgwMDAwNDAyMSwgMHg5NGUyMDAwMCwgMHgyNTA4MDAwMSwgMHgwMGMyMzAyMSwgMHgyZDAyMDAwNCwgMHgxNDQwZmZmYiwKKwkweDI0ZTcwMDAyLCAweDk1MjIwMDAyLCAweDAwMDA0MDIxLCAweDkxMjMwMDA5LCAweDAwNDQyMDIzLCAweDAxODAzODIxLAorCTB4MzA4MmZmZmYsIDB4YTRlMDAwMTAsIDB4MDA2MjE4MjEsIDB4MDAwMjEwNDIsIDB4MTg0MDAwMTAsIDB4MDBjMzMwMjEsCisJMHgwMDQwNDgyMSwgMHg5NGUyMDAwMCwgMHgyNGU3MDAwMiwgMHgwMGMyMzAyMSwgMHgzMGUyMDA3ZiwgMHgxNDQwMDAwNiwKKwkweDI1MDgwMDAxLCAweDhkNjMwMDAwLCAweDNjMDIwMDdmLCAweDM0NDJmZjgwLCAweDAwNjI1ODI0LCAweDI1NjcwMDA4LAorCTB4MDEwOTEwMmEsIDB4MTQ0MGZmZjMsIDB4MDAwMDAwMDAsIDB4MzA4MjAwMDEsIDB4MTA0MDAwMDUsIDB4MDAwNjFjMDIsCisJMHhhMGUwMDAwMSwgMHg5NGUyMDAwMCwgMHgwMGMyMzAyMSwgMHgwMDA2MWMwMiwgMHgzMGMyZmZmZiwgMHgwMDYyMzAyMSwKKwkweDAwMDYxNDAyLCAweDAwYzIzMDIxLCAweDBhMDAwNDdkLCAweDMwYzZmZmZmLCAweDI0MDIwMDAyLCAweDE0YzIwMDgxLAorCTB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsIDB4OGM0MjI0MGMsIDB4MTQ0MDAwMDcsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsCisJMHg5NDQyMjNkMiwgMHg5NTIzMDAwMiwgMHgwMWUyMTAyMywgMHgxMDYyMDA3NywgMHgwMDAwMDAwMCwgMHgzYzAyMDgwMCwKKwkweDk0NDIyM2QyLCAweDAxZTIxMDIzLCAweGE1MjIwMDAyLCAweDNjMDIwODAwLCAweDhjNDIyNDBjLCAweDEwNDAwMDFhLAorCTB4MzFlM2ZmZmYsIDB4OGRjNzAwMTAsIDB4M2MwMjA4MDAsIDB4OTQ0MjFiOTYsIDB4MDBlMDQwMjEsIDB4MDAwNzJjMDIsCisJMHgwMGFhMjAyMSwgMHgwMDQzMTAyMywgMHgwMDgyMzgyMywgMHgwMDA3MjQwMiwgMHgzMGUyZmZmZiwgMHgwMDgyMzgyMSwKKwkweDAwMDcxMDI3LCAweGE1MjIwMDBhLCAweDMxMDJmZmZmLCAweDNjMDQwODAwLCAweDk0ODQyM2Q0LCAweDAwNDUzMDIzLAorCTB4MDBlMDI4MjEsIDB4MDA2NDE4MjMsIDB4MDA2ZDE4MjEsIDB4MDBjMzMwMjEsIDB4MDAwNjFjMDIsIDB4MzBjMmZmZmYsCisJMHgwYTAwMDQ3ZCwgMHgwMDYyMzAyMSwgMHgwMTIwMzgyMSwgMHgwMDAwNDAyMSwgMHgzMDgyZmZmZiwgMHgwMDAyMTA0MiwKKwkweDE4NDAwMDA4LCAweDAwMDAzMDIxLCAweDAwNDAxODIxLCAweDk0ZTIwMDAwLCAweDI1MDgwMDAxLCAweDAwYzIzMDIxLAorCTB4MDEwMzEwMmEsIDB4MTQ0MGZmZmIsIDB4MjRlNzAwMDIsIDB4MDAwNjFjMDIsIDB4MzBjMmZmZmYsIDB4MDA2MjMwMjEsCisJMHgwMDA2MTQwMiwgMHgwMGMyMzAyMSwgMHgwMGMwMjgyMSwgMHgwMDA2MTAyNywgMHhhNTIyMDAwYSwgMHgwMDAwMzAyMSwKKwkweDI1MjcwMDBjLCAweDAwMDA0MDIxLCAweDk0ZTIwMDAwLCAweDI1MDgwMDAxLCAweDAwYzIzMDIxLCAweDJkMDIwMDA0LAorCTB4MTQ0MGZmZmIsIDB4MjRlNzAwMDIsIDB4OTUyMjAwMDIsIDB4MDAwMDQwMjEsIDB4OTEyMzAwMDksIDB4MDA0NDIwMjMsCisJMHgwMTgwMzgyMSwgMHgzMDgyZmZmZiwgMHhhNGUwMDAxMCwgMHgzYzA0MDgwMCwgMHg5NDg0MjNkNCwgMHgwMDYyMTgyMSwKKwkweDAwYzMzMDIxLCAweDAwMDYxYzAyLCAweDMwYzJmZmZmLCAweDAwNjIzMDIxLCAweDAwMDYxYzAyLCAweDNjMDIwODAwLAorCTB4OTQ0MjIzZDAsIDB4MDBjMzQ4MjEsIDB4MDA0NDEwMjMsIDB4MDAwMjFmYzIsIDB4MDA0MzEwMjEsIDB4MDAwMjEwNDMsCisJMHgxODQwMDAxMCwgMHgwMDAwMzAyMSwgMHgwMDQwMjAyMSwgMHg5NGUyMDAwMCwgMHgyNGU3MDAwMiwgMHgwMGMyMzAyMSwKKwkweDMwZTIwMDdmLCAweDE0NDAwMDA2LCAweDI1MDgwMDAxLCAweDhkNjMwMDAwLCAweDNjMDIwMDdmLCAweDM0NDJmZjgwLAorCTB4MDA2MjU4MjQsIDB4MjU2NzAwMDgsIDB4MDEwNDEwMmEsIDB4MTQ0MGZmZjMsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsCisJMHg5NDQyMjNlYywgMHgwMGMyMzAyMSwgMHgzMTIyZmZmZiwgMHgwMGMyMzAyMSwgMHgwMDA2MWMwMiwgMHgzMGMyZmZmZiwKKwkweDAwNjIzMDIxLCAweDAwMDYxNDAyLCAweDAwYzIzMDIxLCAweDAwYzA0MDIxLCAweDAwMDYxMDI3LCAweGE1ODIwMDEwLAorCTB4YWRjMDAwMTQsIDB4MGEwMDA0OWQsIDB4YWRjMDAwMDAsIDB4OGRjNzAwMTAsIDB4MDBlMDQwMjEsIDB4MTE0MDAwMDcsCisJMHgwMDA3MmMwMiwgMHgwMGFhMzAyMSwgMHgwMDA2MTQwMiwgMHgzMGMzZmZmZiwgMHgwMDQzMzAyMSwgMHgwMDA2MTQwMiwKKwkweDAwYzIyODIxLCAweDAwMDUxMDI3LCAweGE1MjIwMDBhLCAweDNjMDMwODAwLCAweDk0NjMyM2Q0LCAweDMxMDJmZmZmLAorCTB4MDFlMjEwMjEsIDB4MDA0MzMwMjMsIDB4MDBjZDMwMjEsIDB4MDAwNjFjMDIsIDB4MzBjMmZmZmYsIDB4MDA2MjMwMjEsCisJMHgwMDA2MTQwMiwgMHgwMGMyMzAyMSwgMHgwMGMwNDAyMSwgMHgwMDA2MTAyNywgMHhhNTgyMDAxMCwgMHgzMTAyZmZmZiwKKwkweDAwMDUxYzAwLCAweDAwNDMxMDI1LCAweGFkYzIwMDEwLCAweDNjMDIwODAwLCAweDhjNDIyM2Y0LCAweDEwNDAwMDA1LAorCTB4MmRlMjA1ZWIsIDB4MTQ0MDAwMDIsIDB4MjVlMmZmZjIsIDB4MzQwMjg4NzAsIDB4YTVjMjAwMzQsIDB4M2MwMzA4MDAsCisJMHgyNDYzMjNlOCwgMHg4YzYyMDAwMCwgMHgyNDQyMDAwMSwgMHhhYzYyMDAwMCwgMHgzYzA0MDgwMCwgMHg4Yzg0MjNlNCwKKwkweDNjMDIwODAwLCAweDhjNDIxYmMwLCAweDMzMDNmZmZmLCAweDAwODMyMDIxLCAweDAwNDMxODIxLCAweDAwNjIxMDJiLAorCTB4M2MwMTA4MDAsIDB4YWMyNDIzZTQsIDB4MTA0MDAwMDMsIDB4MjQ4MmZmZmYsIDB4M2MwMTA4MDAsIDB4YWMyMjIzZTQsCisJMHgzYzAxMDgwMCwgMHhhYzIzMWJjMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAyMCwgMHgyN2JkZmZiOCwgMHgzYzA1MDgwMCwKKwkweDI0YTUxYjk2LCAweGFmYmYwMDQ0LCAweGFmYmUwMDQwLCAweGFmYjcwMDNjLCAweGFmYjYwMDM4LCAweGFmYjUwMDM0LAorCTB4YWZiNDAwMzAsIDB4YWZiMzAwMmMsIDB4YWZiMjAwMjgsIDB4YWZiMTAwMjQsIDB4YWZiMDAwMjAsIDB4OTRhOTAwMDAsCisJMHgzYzAyMDgwMCwgMHg5NDQyMjNkMCwgMHgzYzAzMDgwMCwgMHg4YzYzMWJiMCwgMHgzYzA0MDgwMCwgMHg4Yzg0MWJhYywKKwkweDAxMjIxMDIzLCAweDAwNjQxODJhLCAweGE3YTkwMDFlLCAweDEwNjAwMGJlLCAweGE3YTIwMDE2LCAweDI0YmUwMDIyLAorCTB4OTdiNjAwMWUsIDB4MjRiMzAwMWEsIDB4MjRiNzAwMTYsIDB4OGZjMjAwMDAsIDB4MTQ0MDAwMDgsIDB4MDAwMDAwMDAsCisJMHg4ZmMyZmZmOCwgMHg5N2EzMDAxNiwgMHg4ZmM0ZmZmNCwgMHgwMDQzMTAyMSwgMHgwMDgyMjAyYSwgMHgxNDgwMDBiMCwKKwkweDAwMDAwMDAwLCAweDk3ZDUwODE4LCAweDMyYTJmZmZmLCAweDEwNDAwMGEzLCAweDAwMDA5MDIxLCAweDAwNDBhMDIxLAorCTB4MDAwMDg4MjEsIDB4MGUwMDA2MjUsIDB4MDAwMDAwMDAsIDB4MDA0MDMwMjEsIDB4MTRjMDAwMDcsIDB4MDAwMDAwMDAsCisJMHgzYzAyMDgwMCwgMHg4YzQyMjNkYywgMHgyNDQyMDAwMSwgMHgzYzAxMDgwMCwgMHgwYTAwMDU5NiwgMHhhYzIyMjNkYywKKwkweDNjMTAwODAwLCAweDAyMTE4MDIxLCAweDhlMTAxYmM4LCAweDk2MDgwMDBhLCAweDMxMDIwMDQwLCAweDEwNDAwMDA1LAorCTB4MjQwNzE4MGMsIDB4OGUwMjAwMGMsIDB4MjQwNzE4OGMsIDB4MDAwMjE0MDAsIDB4YWNjMjAwMTgsIDB4MzEwMjAwODAsCisJMHg1NDQwMDAwMSwgMHgzNGU3MDAxMCwgMHgzYzAyMDgwMCwgMHgwMDUxMTAyMSwgMHg4YzQyMWJkMCwgMHgzYzAzMDgwMCwKKwkweDAwNzExODIxLCAweDhjNjMxYmQ0LCAweDAwMDIxNTAwLCAweDAwMDMxYzAwLCAweDAwNDMxMDI1LCAweGFjYzIwMDE0LAorCTB4OTYwNDAwMDgsIDB4MzI0MmZmZmYsIDB4MDA4MjEwMjEsIDB4MDI4MjEwMmEsIDB4MTQ0MDAwMDIsIDB4MDJiMjI4MjMsCisJMHgwMDgwMjgyMSwgMHg4ZTAyMDAwMCwgMHgwMjQ1OTAyMSwgMHhhY2MyMDAwMCwgMHg4ZTAyMDAwNCwgMHgwMGMwMjAyMSwKKwkweDI2MzEwMDEwLCAweGFjODIwMDA0LCAweDMwZTJmZmZmLCAweGFjODAwMDA4LCAweGE0ODUwMDBlLCAweGFjODIwMDEwLAorCTB4MjQwMjAzMDUsIDB4MGUwMDA1YTIsIDB4YTQ4MjAwMGMsIDB4MzI0MmZmZmYsIDB4MDA1NDEwMmIsIDB4MTQ0MGZmYzUsCisJMHgzMjQyZmZmZiwgMHgwYTAwMDU4ZSwgMHgwMDAwMDAwMCwgMHg4ZTYyMDAwMCwgMHg4ZTYzZmZmYywgMHgwMDQzMTAyYSwKKwkweDEwNDAwMDY3LCAweDAwMDAwMDAwLCAweDhlNjJmZmYwLCAweDAwMDI4OTAwLCAweDNjMTAwODAwLCAweDAyMTE4MDIxLAorCTB4MGUwMDA2MjUsIDB4OGUxMDFiYzgsIDB4MDA0MDMwMjEsIDB4MTRjMDAwMDUsIDB4MDAwMDAwMDAsIDB4OGU2MjA4MmMsCisJMHgyNDQyMDAwMSwgMHgwYTAwMDU5NiwgMHhhZTYyMDgyYywgMHg5NjA4MDAwYSwgMHgzMTAyMDA0MCwgMHgxMDQwMDAwNSwKKwkweDI0MDcxODBjLCAweDhlMDIwMDBjLCAweDI0MDcxODhjLCAweDAwMDIxNDAwLCAweGFjYzIwMDE4LCAweDNjMDIwODAwLAorCTB4MDA1MTEwMjEsIDB4OGM0MjFiZDAsIDB4M2MwMzA4MDAsIDB4MDA3MTE4MjEsIDB4OGM2MzFiZDQsIDB4MDAwMjE1MDAsCisJMHgwMDAzMWMwMCwgMHgwMDQzMTAyNSwgMHhhY2MyMDAxNCwgMHg4ZTYzZmZmNCwgMHg5NjAyMDAwOCwgMHgwMDQzMjAyMywKKwkweDMyNDJmZmZmLCAweDMwODNmZmZmLCAweDAwNDMxMDIxLCAweDAyYzIxMDJhLCAweDEwNDAwMDAzLCAweDAwODAyODIxLAorCTB4OTdhOTAwMWUsIDB4MDEzMjI4MjMsIDB4OGU2MjAwMDAsIDB4MzBhNGZmZmYsIDB4MDA0NDEwMjEsIDB4YWU2MjAwMDAsCisJMHhhNGM1MDAwZSwgMHg4ZTAyMDAwMCwgMHhhY2MyMDAwMCwgMHg4ZTAyMDAwNCwgMHg4ZTYzZmZmNCwgMHgwMDQzMTAyMSwKKwkweGFjYzIwMDA0LCAweDhlNjNmZmY0LCAweDk2MDIwMDA4LCAweDAwNjQxODIxLCAweDAwNjIxMDJhLCAweDE0NDAwMDA2LAorCTB4MDI0NTkwMjEsIDB4OGU2MmZmZjAsIDB4YWU2MGZmZjQsIDB4MjQ0MjAwMDEsIDB4MGEwMDA1NzEsIDB4YWU2MmZmZjAsCisJMHhhZTYzZmZmNCwgMHhhY2MwMDAwOCwgMHgzMjQyZmZmZiwgMHgxMDU2MDAwMywgMHgzMTAyMDAwNCwgMHgxMDQwMDAwNiwKKwkweDI0MDIwMzA1LCAweDMxMDIwMDgwLCAweDU0NDAwMDAxLCAweDM0ZTcwMDEwLCAweDM0ZTcwMDIwLCAweDI0MDIwOTA1LAorCTB4YTRjMjAwMGMsIDB4OGVlMzAwMDAsIDB4OGVlMjAwMDQsIDB4MTQ2MjAwMDcsIDB4M2MwMmI0OWEsIDB4OGVlMjA4NjAsCisJMHg1NDQwMDAwMSwgMHgzNGU3MDQwMCwgMHgzYzAyNGI2NSwgMHgwYTAwMDU4OCwgMHgzNDQyNzY1NCwgMHgzNDQyODlhYiwKKwkweGFjYzIwMDFjLCAweDMwZTJmZmZmLCAweGFjYzIwMDEwLCAweDBlMDAwNWEyLCAweDAwYzAyMDIxLCAweDMyNDJmZmZmLAorCTB4MDA1NjEwMmIsIDB4MTQ0MGZmOWIsIDB4MDAwMDAwMDAsIDB4OGU2MjAwMDAsIDB4OGU2M2ZmZmMsIDB4MDA0MzEwMmEsCisJMHgxNDQwZmY0OCwgMHgwMDAwMDAwMCwgMHg4ZmJmMDA0NCwgMHg4ZmJlMDA0MCwgMHg4ZmI3MDAzYywgMHg4ZmI2MDAzOCwKKwkweDhmYjUwMDM0LCAweDhmYjQwMDMwLCAweDhmYjMwMDJjLCAweDhmYjIwMDI4LCAweDhmYjEwMDI0LCAweDhmYjAwMDIwLAorCTB4MDNlMDAwMDgsIDB4MjdiZDAwNDgsIDB4MjdiZGZmZTgsIDB4YWZiZjAwMTQsIDB4YWZiMDAwMTAsIDB4OGY2MjQ0NTAsCisJMHg4ZjYzNDQxMCwgMHgwYTAwMDViMSwgMHgwMDgwODAyMSwgMHg4ZjYyNjgyMCwgMHgzMDQyMjAwMCwgMHgxMDQwMDAwMywKKwkweDAwMDAwMDAwLCAweDBlMDAwMWYwLCAweDAwMDAyMDIxLCAweDhmNjI0NDUwLCAweDhmNjM0NDEwLCAweDMwNDJmZmZmLAorCTB4MDA0MzEwMmIsIDB4MTQ0MGZmZjUsIDB4MDAwMDAwMDAsIDB4OGY2MzBjMTQsIDB4MzA2MzAwMGYsIDB4MmM2MjAwMDIsCisJMHgxNDQwMDAwYiwgMHgwMDAwMDAwMCwgMHg4ZjYzMGMxNCwgMHgzYzAyMDgwMCwgMHg4YzQyMWI0MCwgMHgzMDYzMDAwZiwKKwkweDI0NDIwMDAxLCAweDNjMDEwODAwLCAweGFjMjIxYjQwLCAweDJjNjIwMDAyLCAweDEwNDBmZmY3LCAweDAwMDAwMDAwLAorCTB4YWY3MDVjMTgsIDB4OGY2MjVjMTAsIDB4MzA0MjAwMDIsIDB4MTA0MDAwMDksIDB4MDAwMDAwMDAsIDB4OGY2MjY4MjAsCisJMHgzMDQyMjAwMCwgMHgxMDQwZmZmOCwgMHgwMDAwMDAwMCwgMHgwZTAwMDFmMCwgMHgwMDAwMjAyMSwgMHgwYTAwMDVjNCwKKwkweDAwMDAwMDAwLCAweDhmYmYwMDE0LCAweDhmYjAwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDE4LCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjdiZGZmZTgsIDB4M2MxYmMwMDAsIDB4YWZiZjAwMTQsIDB4YWZiMDAwMTAsCisJMHhhZjYwNjgwYywgMHg4ZjYyNjgwNCwgMHgzNDQyMDA4MiwgMHhhZjYyNjgwNCwgMHg4ZjYzNDAwMCwgMHgyNDAyMGI1MCwKKwkweDNjMDEwODAwLCAweGFjMjIxYjU0LCAweDI0MDIwYjc4LCAweDNjMDEwODAwLCAweGFjMjIxYjY0LCAweDM0NjMwMDAyLAorCTB4YWY2MzQwMDAsIDB4MGUwMDA2MDUsIDB4MDA4MDgwMjEsIDB4M2MwMTA4MDAsIDB4YTAyMjFiNjgsIDB4MzA0MjAwZmYsCisJMHgyNDAzMDAwMiwgMHgxNDQzMDAwNSwgMHgwMDAwMDAwMCwgMHgzYzAyMDgwMCwgMHg4YzQyMWI1NCwgMHgwYTAwMDVmOCwKKwkweGFjNTAwMGMwLCAweDNjMDIwODAwLCAweDhjNDIxYjU0LCAweGFjNTAwMGJjLCAweDhmNjI0NDM0LCAweDhmNjM0NDM4LAorCTB4OGY2NDQ0MTAsIDB4M2MwMTA4MDAsIDB4YWMyMjFiNWMsIDB4M2MwMTA4MDAsIDB4YWMyMzFiNmMsIDB4M2MwMTA4MDAsCisJMHhhYzI0MWI1OCwgMHg4ZmJmMDAxNCwgMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAxOCwgMHgzYzA0MDgwMCwKKwkweDhjODcwMDAwLCAweDNjMDNhYTU1LCAweDM0NjNhYTU1LCAweDNjMDZjMDAzLCAweGFjODMwMDAwLCAweDhjYzIwMDAwLAorCTB4MTQ0MzAwMDcsIDB4MjQwNTAwMDIsIDB4M2MwMzU1YWEsIDB4MzQ2MzU1YWEsIDB4YWM4MzAwMDAsIDB4OGNjMjAwMDAsCisJMHg1MDQzMDAwMSwgMHgyNDA1MDAwMSwgMHgzYzAyMDgwMCwgMHhhYzQ3MDAwMCwgMHgwM2UwMDAwOCwgMHgwMGEwMTAyMSwKKwkweDI3YmRmZmY4LCAweDE4ODAwMDA5LCAweDAwMDAyODIxLCAweDhmNjM2ODBjLCAweDhmNjI2ODBjLCAweDEwNDNmZmZlLAorCTB4MDAwMDAwMDAsIDB4MjRhNTAwMDEsIDB4MDBhNDEwMmEsIDB4MTQ0MGZmZjksIDB4MDAwMDAwMDAsIDB4MDNlMDAwMDgsCisJMHgyN2JkMDAwOCwgMHg4ZjYzNDQ1MCwgMHgzYzAyMDgwMCwgMHg4YzQyMWI1YywgMHgwMDAzMWMwMiwgMHgwMDQzMTAyYiwKKwkweDE0NDAwMDA4LCAweDNjMDM4MDAwLCAweDNjMDQwODAwLCAweDhjODQxYjZjLCAweDhmNjI0NDUwLCAweDAwMDIxYzAyLAorCTB4MDA4MzEwMmIsIDB4MTA0MGZmZmMsIDB4M2MwMzgwMDAsIDB4YWY2MzQ0NDQsIDB4OGY2MjQ0NDQsIDB4MDA0MzEwMjQsCisJMHgxNDQwZmZmZCwgMHgwMDAwMDAwMCwgMHg4ZjYyNDQ0OCwgMHgwM2UwMDAwOCwgMHgzMDQyZmZmZiwgMHgzMDgyZmZmZiwKKwkweDI0NDJlMDAwLCAweDJjNDIyMDAxLCAweDE0NDAwMDAzLCAweDNjMDI0MDAwLCAweDBhMDAwNjQ4LCAweDI0MDJmZmZmLAorCTB4MDA4MjIwMjUsIDB4YWY2NDVjMzgsIDB4OGY2MjVjMzAsIDB4MzA0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MDAwMDEwMjEsCisJMHgwM2UwMDAwOCwgMHgwMDAwMDAwMCwgMHg4ZjYyNDQ1MCwgMHgzYzAzMDgwMCwgMHg4YzYzMWI1OCwgMHgwYTAwMDY1MSwKKwkweDMwNDJmZmZmLCAweDhmNjI0NDUwLCAweDMwNDJmZmZmLCAweDAwNDMxMDJiLCAweDE0NDBmZmZjLCAweDAwMDAwMDAwLAorCTB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsIDB4MjdiZGZmZTAsIDB4MDA4MDI4MjEsIDB4M2MwNDA4MDAsIDB4MjQ4NDFhZjAsCisJMHgwMDAwMzAyMSwgMHgwMDAwMzgyMSwgMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHgwZTAwMDY3YywgMHhhZmEwMDAxNCwKKwkweDBhMDAwNjYwLCAweDAwMDAwMDAwLCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2MwMjA4MDAsIDB4MzQ0MjMwMDAsIDB4M2MwMzA4MDAsIDB4MzQ2MzMwMDAsCisJMHgzYzA0MDgwMCwgMHgzNDg0MzdmZiwgMHgzYzAxMDgwMCwgMHhhYzIyMWI3NCwgMHgyNDAyMDA0MCwgMHgzYzAxMDgwMCwKKwkweGFjMjIxYjc4LCAweDNjMDEwODAwLCAweGFjMjAxYjcwLCAweGFjNjAwMDAwLCAweDI0NjMwMDA0LCAweDAwODMxMDJiLAorCTB4NTA0MGZmZmQsIDB4YWM2MDAwMDAsIDB4MDNlMDAwMDgsIDB4MDAwMDAwMDAsIDB4MDA4MDQ4MjEsIDB4OGZhYTAwMTAsCisJMHgzYzAyMDgwMCwgMHg4YzQyMWI3MCwgMHgzYzA0MDgwMCwgMHg4Yzg0MWI3OCwgMHg4ZmFiMDAxNCwgMHgyNDQzMDAwMSwKKwkweDAwNDQxMDJiLCAweDNjMDEwODAwLCAweGFjMjMxYjcwLCAweDE0NDAwMDAzLCAweDAwMDA0MDIxLCAweDNjMDEwODAwLAorCTB4YWMyMDFiNzAsIDB4M2MwMjA4MDAsIDB4OGM0MjFiNzAsIDB4M2MwMzA4MDAsIDB4OGM2MzFiNzQsIDB4OTEyNDAwMDAsCisJMHgwMDAyMTE0MCwgMHgwMDQzMTAyMSwgMHgwMDQ4MTAyMSwgMHgyNTA4MDAwMSwgMHhhMDQ0MDAwMCwgMHgyOTAyMDAwOCwKKwkweDE0NDBmZmY0LCAweDI1MjkwMDAxLCAweDNjMDIwODAwLCAweDhjNDIxYjcwLCAweDNjMDMwODAwLCAweDhjNjMxYjc0LAorCTB4OGY2NDY4MGMsIDB4MDAwMjExNDAsIDB4MDA0MzEwMjEsIDB4YWM0NDAwMDgsIDB4YWM0NTAwMGMsIDB4YWM0NjAwMTAsCisJMHhhYzQ3MDAxNCwgMHhhYzRhMDAxOCwgMHgwM2UwMDAwOCwgMHhhYzRiMDAxYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKK307CisKK3N0YXRpYyB1MzIgdGczVHNvRndSb2RhdGFbXSA9IHsKKwkweDRkNjE2OTZlLCAweDQzNzA3NTQyLCAweDAwMDAwMDAwLCAweDRkNjE2OTZlLCAweDQzNzA3NTQxLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NzM3NDZiNmYsIDB4NjY2NjZjNjQsIDB4NDk2ZTAwMDAsIDB4NzM3NDZiNmYsCisJMHg2NjY2MmEyYSwgMHgwMDAwMDAwMCwgMHg1Mzc3NDU3NiwgMHg2NTZlNzQzMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDY2NjE3NDYxLCAweDZjNDU3MjcyLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsCit9OworCitzdGF0aWMgdTMyIHRnM1Rzb0Z3RGF0YVtdID0geworCTB4MDAwMDAwMDAsIDB4NzM3NDZiNmYsIDB4NjY2NjZjNjQsIDB4NWY3NjMxMmUsIDB4MzYyZTMwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLAorfTsKKworLyogNTcwNSBuZWVkcyBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgVFNPIGZpcm13YXJlLiAgKi8KKyNkZWZpbmUgVEczX1RTTzVfRldfUkVMRUFTRV9NQUpPUgkweDEKKyNkZWZpbmUgVEczX1RTTzVfRldfUkVMQVNFX01JTk9SCTB4MgorI2RlZmluZSBURzNfVFNPNV9GV19SRUxFQVNFX0ZJWAkJMHgwCisjZGVmaW5lIFRHM19UU081X0ZXX1NUQVJUX0FERFIJCTB4MDAwMTAwMDAKKyNkZWZpbmUgVEczX1RTTzVfRldfVEVYVF9BRERSCQkweDAwMDEwMDAwCisjZGVmaW5lIFRHM19UU081X0ZXX1RFWFRfTEVOCQkweGU5MAorI2RlZmluZSBURzNfVFNPNV9GV19ST0RBVEFfQUREUgkJMHgwMDAxMGU5MAorI2RlZmluZSBURzNfVFNPNV9GV19ST0RBVEFfTEVOCQkweDUwCisjZGVmaW5lIFRHM19UU081X0ZXX0RBVEFfQUREUgkJMHgwMDAxMGYwMAorI2RlZmluZSBURzNfVFNPNV9GV19EQVRBX0xFTgkJMHgyMAorI2RlZmluZSBURzNfVFNPNV9GV19TQlNTX0FERFIJCTB4MDAwMTBmMjAKKyNkZWZpbmUgVEczX1RTTzVfRldfU0JTU19MRU4JCTB4MjgKKyNkZWZpbmUgVEczX1RTTzVfRldfQlNTX0FERFIJCTB4MDAwMTBmNTAKKyNkZWZpbmUgVEczX1RTTzVfRldfQlNTX0xFTgkJMHg4OAorCitzdGF0aWMgdTMyIHRnM1RzbzVGd1RleHRbKFRHM19UU081X0ZXX1RFWFRfTEVOIC8gNCkgKyAxXSA9IHsKKwkweDBjMDA0MDAzLCAweDAwMDAwMDAwLCAweDAwMDEwZjA0LCAweDAwMDAwMDAwLCAweDEwMDAwMDAzLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMGQsIDB4MDAwMDAwMGQsIDB4M2MxZDAwMDEsIDB4MzdiZGUwMDAsIDB4MDNhMGYwMjEsIDB4M2MxMDAwMDEsCisJMHgyNjEwMDAwMCwgMHgwYzAwNDAxMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwZCwgMHgyN2JkZmZlMCwgMHgzYzA0ZmVmZSwKKwkweGFmYmYwMDE4LCAweDBjMDA0MmU4LCAweDM0ODQwMDAyLCAweDBjMDA0MzY0LCAweDAwMDAwMDAwLCAweDNjMDMwMDAxLAorCTB4OTA2MzBmMzQsIDB4MjQwMjAwMDIsIDB4M2MwNDAwMDEsIDB4MjQ4NDBlOWMsIDB4MTQ2MjAwMDMsIDB4MjQwNTAwMDEsCisJMHgzYzA0MDAwMSwgMHgyNDg0MGU5MCwgMHgyNDA2MDAwMiwgMHgwMDAwMzgyMSwgMHhhZmEwMDAxMCwgMHgwYzAwNDM3OCwKKwkweGFmYTAwMDE0LCAweDBjMDA0MDJjLCAweDAwMDAwMDAwLCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjdiZGZmZTAsIDB4YWZiZjAwMWMsIDB4YWZiMjAwMTgsIDB4YWZiMTAwMTQsCisJMHgwYzAwNDJkNCwgMHhhZmIwMDAxMCwgMHgzYzEyODAwMCwgMHgyNDExMDAwMSwgMHg4ZjcwNjgxMCwgMHgzMjAyMDQwMCwKKwkweDEwNDAwMDA3LCAweDAwMDAwMDAwLCAweDhmNjQxMDA4LCAweDAwOTIxMDI0LCAweDE0NDAwMDAzLCAweDAwMDAwMDAwLAorCTB4MGMwMDQwNjQsIDB4MDAwMDAwMDAsIDB4M2MwMjAwMDEsIDB4OTA0MjBmNTYsIDB4MTA1MTAwMDMsIDB4MzIwMjAyMDAsCisJMHgxMDQwZmZmMSwgMHgwMDAwMDAwMCwgMHgwYzAwNDFiNCwgMHgwMDAwMDAwMCwgMHgwODAwNDAzNCwgMHgwMDAwMDAwMCwKKwkweDhmYmYwMDFjLCAweDhmYjIwMDE4LCAweDhmYjEwMDE0LCAweDhmYjAwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLAorCTB4MjdiZGZmZTAsIDB4M2MwNDAwMDEsIDB4MjQ4NDBlYjAsIDB4MDAwMDI4MjEsIDB4MDAwMDMwMjEsIDB4MDAwMDM4MjEsCisJMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHgwYzAwNDM3OCwgMHhhZmEwMDAxNCwgMHgwMDAwZDAyMSwgMHgyNDAyMDEzMCwKKwkweGFmNjI1MDAwLCAweDNjMDEwMDAxLCAweGE0MjAwZjUwLCAweDNjMDEwMDAxLCAweGEwMjAwZjU3LCAweDhmYmYwMDE4LAorCTB4MDNlMDAwMDgsIDB4MjdiZDAwMjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2MwMzAwMDEsIDB4MjQ2MzBmNjAsCisJMHg5MDYyMDAwMCwgMHgyN2JkZmZmMCwgMHgxNDQwMDAwMywgMHgwMDgwYzAyMSwgMHgwODAwNDA3MywgMHgwMDAwNDgyMSwKKwkweDNjMDIyMDAwLCAweDAzMDIxMDI0LCAweDEwNDAwMDAzLCAweDI0MDkwMDAyLCAweDA4MDA0MDczLCAweGEwNjAwMDAwLAorCTB4MjQwOTAwMDEsIDB4MDAxODEwNDAsIDB4MzA0MzFmODAsIDB4MzQ2ZjgwMDgsIDB4MTUyMDAwNGIsIDB4MjVlYjAwMjgsCisJMHgzYzA0MDAwMSwgMHgwMDgzMjAyMSwgMHg4Yzg0ODAxMCwgMHgzYzA1MDAwMSwgMHgyNGE1MGY3YSwgMHgwMDA0MTQwMiwKKwkweGEwYTIwMDAwLCAweDNjMDEwMDAxLCAweGEwMjQwZjdiLCAweDNjMDIwMDAxLCAweDAwNDMxMDIxLCAweDk0NDI4MDE0LAorCTB4M2MwMTAwMDEsIDB4YTAyMjBmN2MsIDB4M2MwYzAwMDEsIDB4MDE4MzYwMjEsIDB4OGQ4YzgwMTgsIDB4MzA0MjAwZmYsCisJMHgyNDQyMDAwOCwgMHgwMDAyMjBjMywgMHgyNDAyMDAwMSwgMHgzYzAxMDAwMSwgMHhhMDIyMGY2MCwgMHgwMTI0MTAyYiwKKwkweDEwNDAwMDBjLCAweDAwMDAzODIxLCAweDI0YTYwMDBlLCAweDAxNjAyODIxLCAweDhjYTIwMDAwLCAweDhjYTMwMDA0LAorCTB4MjRhNTAwMDgsIDB4MjRlNzAwMDEsIDB4YWNjMjAwMDAsIDB4YWNjMzAwMDQsIDB4MDBlNDEwMmIsIDB4MTQ0MGZmZjgsCisJMHgyNGM2MDAwOCwgMHgwMDAwMzgyMSwgMHgzYzA4MDAwMSwgMHgyNTA4MGY3YiwgMHg5MTA2MDAwMCwgMHgzYzAyMDAwMSwKKwkweDkwNDIwZjdjLCAweDI1MDMwMDBkLCAweDAwYzMyODIxLCAweDAwNDYxMDIzLCAweDAwMDIxZmMyLCAweDAwNDMxMDIxLAorCTB4MDAwMjEwNDMsIDB4MTg0MDAwMGMsIDB4MDAwMDIwMjEsIDB4OTEwMjAwMDEsIDB4MDA0NjEwMjMsIDB4MDAwMjFmYzIsCisJMHgwMDQzMTAyMSwgMHgwMDAyMTg0MywgMHg5NGEyMDAwMCwgMHgyNGU3MDAwMSwgMHgwMDgyMjAyMSwgMHgwMGUzMTAyYSwKKwkweDE0NDBmZmZiLCAweDI0YTUwMDAyLCAweDAwMDQxYzAyLCAweDMwODJmZmZmLCAweDAwNjIyMDIxLCAweDAwMDQxNDAyLAorCTB4MDA4MjIwMjEsIDB4M2MwMmZmZmYsIDB4MDE4MjEwMjQsIDB4MzA4M2ZmZmYsIDB4MDA0MzEwMjUsIDB4M2MwMTAwMDEsCisJMHgwODAwNDBmYSwgMHhhYzIyMGY4MCwgMHgzYzA1MDAwMSwgMHgyNGE1MGY3YywgMHg5MGEyMDAwMCwgMHgzYzBjMDAwMSwKKwkweDAxODM2MDIxLCAweDhkOGM4MDE4LCAweDAwMDIyMGMyLCAweDEwODAwMDBlLCAweDAwMDAzODIxLCAweDAxNjAzMDIxLAorCTB4MjRhNTAwMGMsIDB4OGNhMjAwMDAsIDB4OGNhMzAwMDQsIDB4MjRhNTAwMDgsIDB4MjRlNzAwMDEsIDB4YWNjMjAwMDAsCisJMHhhY2MzMDAwNCwgMHgwMGU0MTAyYiwgMHgxNDQwZmZmOCwgMHgyNGM2MDAwOCwgMHgzYzA1MDAwMSwgMHgyNGE1MGY3YywKKwkweDkwYTIwMDAwLCAweDMwNDMwMDA3LCAweDI0MDIwMDA0LCAweDEwNjIwMDExLCAweDI4NjIwMDA1LCAweDEwNDAwMDA1LAorCTB4MjQwMjAwMDIsIDB4MTA2MjAwMDgsIDB4MDAwNzEwYzAsIDB4MDgwMDQwZmEsIDB4MDAwMDAwMDAsIDB4MjQwMjAwMDYsCisJMHgxMDYyMDAwZSwgMHgwMDA3MTBjMCwgMHgwODAwNDBmYSwgMHgwMDAwMDAwMCwgMHgwMGEyMTgyMSwgMHg5NDYzMDAwYywKKwkweDAwNGIxMDIxLCAweDA4MDA0MGZhLCAweGE0NDMwMDAwLCAweDAwMDcxMGMwLCAweDAwYTIxODIxLCAweDhjNjMwMDBjLAorCTB4MDA0YjEwMjEsIDB4MDgwMDQwZmEsIDB4YWM0MzAwMDAsIDB4MDBhMjE4MjEsIDB4OGM2MzAwMGMsIDB4MDA0YjIwMjEsCisJMHgwMGEyMTAyMSwgMHhhYzgzMDAwMCwgMHg5NDQyMDAxMCwgMHhhNDgyMDAwNCwgMHg5NWU3MDAwNiwgMHgzYzAyMDAwMSwKKwkweDkwNDIwZjdjLCAweDNjMDMwMDAxLCAweDkwNjMwZjdhLCAweDAwZTJjODIzLCAweDNjMDIwMDAxLCAweDkwNDIwZjdiLAorCTB4MjQ2MzAwMjgsIDB4MDFlMzQwMjEsIDB4MjQ0MjAwMjgsIDB4MTUyMDAwMTIsIDB4MDFlMjMwMjEsIDB4OTRjMjAwMGMsCisJMHgzYzAxMDAwMSwgMHhhNDIyMGY3OCwgMHg5NGMyMDAwNCwgMHg5NGMzMDAwNiwgMHgzYzAxMDAwMSwgMHhhNDIwMGY3NiwKKwkweDNjMDEwMDAxLCAweGE0MjAwZjcyLCAweDAwMDIxNDAwLCAweDAwNDMxMDI1LCAweDNjMDEwMDAxLCAweGFjMjIwZjZjLAorCTB4OTUwMjAwMDQsIDB4M2MwMTAwMDEsIDB4MDgwMDQxMjQsIDB4YTQyMjBmNzAsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNzAsCisJMHgzYzAzMDAwMSwgMHg5NDYzMGY3MiwgMHgwMDQzMTAyMSwgMHhhNTAyMDAwNCwgMHgzYzAyMDAwMSwgMHg5NDQyMGY2YywKKwkweGE0YzIwMDA0LCAweDNjMDIwMDAxLCAweDhjNDIwZjZjLCAweGE0YzIwMDA2LCAweDNjMDQwMDAxLCAweDk0ODQwZjcyLAorCTB4M2MwMjAwMDEsIDB4OTQ0MjBmNzAsIDB4M2MwYTAwMDEsIDB4OTU0YTBmNzYsIDB4MDA0NDE4MjEsIDB4MzA2M2ZmZmYsCisJMHgwMDYyMTgyYSwgMHgyNDAyMDAwMiwgMHgxMTIyMDAwYiwgMHgwMDgzMjAyMywgMHgzYzAzMDAwMSwgMHg5NDYzMGY3OCwKKwkweDMwNjIwMDA5LCAweDEwNDAwMDA2LCAweDMwNjJmZmY2LCAweGE0YzIwMDBjLCAweDNjMDIwMDAxLCAweDk0NDIwZjc4LAorCTB4MzA0MjAwMDksIDB4MDE0MjUwMjMsIDB4MjQwMjAwMDEsIDB4MTEyMjAwMWIsIDB4MjkyMjAwMDIsIDB4NTA0MDAwMDUsCisJMHgyNDAyMDAwMiwgMHgxMTIwMDAwNywgMHgzMWEyZmZmZiwgMHgwODAwNDE5NywgMHgwMDAwMDAwMCwgMHgxMTIyMDAxZCwKKwkweDI0MDIwMDE2LCAweDA4MDA0MTk3LCAweDMxYTJmZmZmLCAweDNjMGUwMDAxLCAweDk1Y2UwZjgwLCAweDEwODAwMDA1LAorCTB4MDE4MDY4MjEsIDB4MDFjNDIwMjEsIDB4MDAwNDFjMDIsIDB4MzA4MmZmZmYsIDB4MDA2MjcwMjEsIDB4MDAwZTEwMjcsCisJMHhhNTAyMDAwYSwgMHgzYzAzMDAwMSwgMHg5MDYzMGY3YiwgMHgzMWEyZmZmZiwgMHgwMGUyMTAyMSwgMHgwODAwNDE4ZCwKKwkweDAwNDMyMDIzLCAweDNjMDIwMDAxLCAweDk0NDIwZjgwLCAweDAwNDQyMDIxLCAweDAwMDQxYzAyLCAweDMwODJmZmZmLAorCTB4MDA2MjIwMjEsIDB4MDA4MDcwMjEsIDB4MDAwNDEwMjcsIDB4MDgwMDQxODUsIDB4YTUwMjAwMGEsIDB4M2MwNTAwMDEsCisJMHgyNGE1MGY3YSwgMHg5MGEzMDAwMCwgMHgxNDYyMDAwMiwgMHgyNGUyZmZmMiwgMHhhNWUyMDAzNCwgMHg5MGEyMDAwMCwKKwkweDAwZTIxMDIzLCAweGE1MDIwMDAyLCAweDNjMDMwMDAxLCAweDk0NjMwZjgwLCAweDNjMDIwMDAxLCAweDk0NDIwZjVhLAorCTB4MzBlNWZmZmYsIDB4MDA2NDE4MjEsIDB4MDA0NTEwMjMsIDB4MDA2MjIwMjMsIDB4MDAwNDFjMDIsIDB4MzA4MmZmZmYsCisJMHgwMDYyMjAyMSwgMHgwMDA0MTAyNywgMHhhNTAyMDAwYSwgMHgzYzAzMDAwMSwgMHg5MDYzMGY3YywgMHgyNDYyMDAwMSwKKwkweDE0YTIwMDA1LCAweDAwODA3MDIxLCAweDAxNjMxMDIxLCAweDkwNDIwMDAwLCAweDA4MDA0MTg1LCAweDAwMDI2MjAwLAorCTB4MjQ2MjAwMDIsIDB4MTRhMjAwMDMsIDB4MzA2MjAwZmUsIDB4MDA0YjEwMjEsIDB4OTQ0YzAwMDAsIDB4M2MwMjAwMDEsCisJMHg5NDQyMGY4MiwgMHgzMTgzZmZmZiwgMHgzYzA0MDAwMSwgMHg5MDg0MGY3YiwgMHgwMDQzMTAyMSwgMHgwMGUyMTAyMSwKKwkweDAwNDQyMDIzLCAweDAwOGEyMDIxLCAweDAwMDQxYzAyLCAweDMwODJmZmZmLCAweDAwNjIyMDIxLCAweDAwMDQxNDAyLAorCTB4MDA4MjIwMjEsIDB4MDA4MDY4MjEsIDB4MDAwNDEwMjcsIDB4YTRjMjAwMTAsIDB4MzFhMmZmZmYsIDB4MDAwZTFjMDAsCisJMHgwMDQzMTAyNSwgMHgzYzA0MDAwMSwgMHgyNDg0MGY3MiwgMHhhZGUyMDAxMCwgMHg5NDgyMDAwMCwgMHgzYzA1MDAwMSwKKwkweDk0YTUwZjc2LCAweDNjMDMwMDAxLCAweDhjNjMwZjZjLCAweDI0NDIwMDAxLCAweDAwYjkyODIxLCAweGE0ODIwMDAwLAorCTB4MzMyMmZmZmYsIDB4MDA2MjIwMjEsIDB4MDA4MzE4MmIsIDB4M2MwMTAwMDEsIDB4YTQyNTBmNzYsIDB4MTA2MDAwMDMsCisJMHgyNGEyZmZmZiwgMHgzYzAxMDAwMSwgMHhhNDIyMGY3NiwgMHgzYzAyNDAwMCwgMHgwMzAyMTAyNSwgMHgzYzAxMDAwMSwKKwkweGFjMjQwZjZjLCAweGFmNjIxMDA4LCAweDAzZTAwMDA4LCAweDI3YmQwMDEwLCAweDNjMDMwMDAxLCAweDkwNjMwZjU2LAorCTB4MjdiZGZmZTgsIDB4MjQwMjAwMDEsIDB4YWZiZjAwMTQsIDB4MTA2MjAwMjYsIDB4YWZiMDAwMTAsIDB4OGY2MjBjZjQsCisJMHgyNDQyZmZmZiwgMHgzMDQyMDA3ZiwgMHgwMDAyMTEwMCwgMHg4YzQzNDAwMCwgMHgzYzAxMDAwMSwgMHhhYzIzMGY2NCwKKwkweDhjNDM0MDA4LCAweDI0NDQ0MDAwLCAweDhjNWM0MDA0LCAweDMwNjIwMDQwLCAweDE0NDAwMDAyLCAweDI0MDIwMDg4LAorCTB4MjQwMjAwMDgsIDB4M2MwMTAwMDEsIDB4YTQyMjBmNjgsIDB4MzA2MjAwMDQsIDB4MTA0MDAwMDUsIDB4MjQwMjAwMDEsCisJMHgzYzAxMDAwMSwgMHhhMDIyMGY1NywgMHgwODAwNDFkNSwgMHgwMDAzMTQwMiwgMHgzYzAxMDAwMSwgMHhhMDIwMGY1NywKKwkweDAwMDMxNDAyLCAweDNjMDEwMDAxLCAweGE0MjIwZjU0LCAweDk0ODMwMDBjLCAweDI0MDIwMDAxLCAweDNjMDEwMDAxLAorCTB4YTQyMDBmNTAsIDB4M2MwMTAwMDEsIDB4YTAyMjBmNTYsIDB4M2MwMTAwMDEsIDB4YTQyMzBmNjIsIDB4MjQwMjAwMDEsCisJMHgxMzQyMDAxZSwgMHgwMDAwMDAwMCwgMHgxMzQwMDAwNSwgMHgyNDAyMDAwMywgMHgxMzQyMDA2NywgMHgwMDAwMDAwMCwKKwkweDA4MDA0MmNmLCAweDAwMDAwMDAwLCAweDNjMDIwMDAxLCAweDk0NDIwZjYyLCAweDI0MWEwMDAxLCAweDNjMDEwMDAxLAorCTB4YTQyMDBmNWUsIDB4M2MwMTAwMDEsIDB4YTQyMDBmNTIsIDB4MzA0NDA3ZmYsIDB4MDAwMjFiYzIsIDB4MDAwMzE4MjMsCisJMHgzMDYzMDAzZSwgMHgzNDYzMDAzNiwgMHgwMDAyMTI0MiwgMHgzMDQyMDAzYywgMHgwMDYyMTgyMSwgMHgzYzAxMDAwMSwKKwkweGE0MjQwZjU4LCAweDAwODMyMDIxLCAweDI0NjMwMDMwLCAweDNjMDEwMDAxLCAweGE0MjQwZjVhLCAweDNjMDEwMDAxLAorCTB4YTQyMzBmNWMsIDB4M2MwNjAwMDEsIDB4MjRjNjBmNTIsIDB4OTRjNTAwMDAsIDB4OTRjMzAwMDIsIDB4M2MwNDAwMDEsCisJMHg5NDg0MGY1YSwgMHgwMDY1MTAyMSwgMHgwMDQ0MTAyYSwgMHgxMDQwMDAxMywgMHgzYzEwODAwMCwgMHgwMGEzMTAyMSwKKwkweGE0YzIwMDAwLCAweDNjMDJhMDAwLCAweGFmNjIwY2Y0LCAweDNjMDEwMDAxLCAweGEwMjAwZjU2LCAweDhmNjQxMDA4LAorCTB4MDA5MDEwMjQsIDB4MTQ0MDAwMDMsIDB4MDAwMDAwMDAsIDB4MGMwMDQwNjQsIDB4MDAwMDAwMDAsIDB4OGY2MjBjZjQsCisJMHgwMDUwMTAyNCwgMHgxMDQwMDBiNywgMHgwMDAwMDAwMCwgMHgwODAwNDIwZiwgMHgwMDAwMDAwMCwgMHgzYzAzMDAwMSwKKwkweDk0NjMwZjUwLCAweDAwODUxMDIzLCAweGE0YzQwMDAwLCAweDAwNjIxODIxLCAweDMwNDJmZmZmLCAweDNjMDEwMDAxLAorCTB4YTQyMzBmNTAsIDB4YWY2MjBjZTgsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNjgsIDB4MzQ0MjAwMjQsIDB4YWY2MjBjZWMsCisJMHg5NGMzMDAwMiwgMHgzYzAyMDAwMSwgMHg5NDQyMGY1MCwgMHgxNDYyMDAxMiwgMHgzYzAyODAwMCwgMHgzYzEwODAwMCwKKwkweDNjMDJhMDAwLCAweGFmNjIwY2Y0LCAweDNjMDEwMDAxLCAweGEwMjAwZjU2LCAweDhmNjQxMDA4LCAweDAwOTAxMDI0LAorCTB4MTQ0MDAwMDMsIDB4MDAwMDAwMDAsIDB4MGMwMDQwNjQsIDB4MDAwMDAwMDAsIDB4OGY2MjBjZjQsIDB4MDA1MDEwMjQsCisJMHgxNDQwZmZmNywgMHgwMDAwMDAwMCwgMHgwODAwNDJjZiwgMHgyNDFhMDAwMywgMHhhZjYyMGNmNCwgMHgzYzEwODAwMCwKKwkweDhmNjQxMDA4LCAweDAwOTAxMDI0LCAweDE0NDAwMDAzLCAweDAwMDAwMDAwLCAweDBjMDA0MDY0LCAweDAwMDAwMDAwLAorCTB4OGY2MjBjZjQsIDB4MDA1MDEwMjQsIDB4MTQ0MGZmZjcsIDB4MDAwMDAwMDAsIDB4MDgwMDQyY2YsIDB4MjQxYTAwMDMsCisJMHgzYzA3MDAwMSwgMHgyNGU3MGY1MCwgMHg5NGUyMDAwMCwgMHgwMzgyMTAyMSwgMHhhZjYyMGNlMCwgMHgzYzAyMDAwMSwKKwkweDhjNDIwZjY0LCAweGFmNjIwY2U0LCAweDNjMDUwMDAxLCAweDk0YTUwZjU0LCAweDk0ZTMwMDAwLCAweDNjMDQwMDAxLAorCTB4OTQ4NDBmNTgsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNWUsIDB4MDBhMzI4MjMsIDB4MDA4MjIwMjMsIDB4MzBhNmZmZmYsCisJMHgzMDgzZmZmZiwgMHgwMGMzMTAyYiwgMHgxNDQwMDA0MywgMHgwMDAwMDAwMCwgMHgzYzAyMDAwMSwgMHg5NDQyMGY1YywKKwkweDAwMDIxNDAwLCAweDAwNjIxMDI1LCAweGFmNjIwY2U4LCAweDk0ZTIwMDAwLCAweDNjMDMwMDAxLCAweDk0NjMwZjU0LAorCTB4MDA0NDEwMjEsIDB4YTRlMjAwMDAsIDB4MzA0MmZmZmYsIDB4MTQ0MzAwMjEsIDB4M2MwMjAwMDgsIDB4M2MwMjAwMDEsCisJMHg5MDQyMGY1NywgMHgxMDQwMDAwNiwgMHgzYzAzMDAwYywgMHgzYzAyMDAwMSwgMHg5NDQyMGY2OCwgMHgzNDYzMDYyNCwKKwkweDA4MDA0MjdjLCAweDAwMDBkMDIxLCAweDNjMDIwMDAxLCAweDk0NDIwZjY4LCAweDNjMDMwMDA4LCAweDM0NjMwNjI0LAorCTB4MDA0MzEwMjUsIDB4YWY2MjBjZWMsIDB4M2MxMDgwMDAsIDB4M2MwMmEwMDAsIDB4YWY2MjBjZjQsIDB4M2MwMTAwMDEsCisJMHhhMDIwMGY1NiwgMHg4ZjY0MTAwOCwgMHgwMDkwMTAyNCwgMHgxNDQwMDAwMywgMHgwMDAwMDAwMCwgMHgwYzAwNDA2NCwKKwkweDAwMDAwMDAwLCAweDhmNjIwY2Y0LCAweDAwNTAxMDI0LCAweDEwNDAwMDE1LCAweDAwMDAwMDAwLCAweDA4MDA0MjgzLAorCTB4MDAwMDAwMDAsIDB4M2MwMzAwMDEsIDB4OTQ2MzBmNjgsIDB4MzQ0MjA2MjQsIDB4M2MxMDgwMDAsIDB4MDA2MjE4MjUsCisJMHgzYzAyODAwMCwgMHhhZjYzMGNlYywgMHhhZjYyMGNmNCwgMHg4ZjY0MTAwOCwgMHgwMDkwMTAyNCwgMHgxNDQwMDAwMywKKwkweDAwMDAwMDAwLCAweDBjMDA0MDY0LCAweDAwMDAwMDAwLCAweDhmNjIwY2Y0LCAweDAwNTAxMDI0LCAweDE0NDBmZmY3LAorCTB4MDAwMDAwMDAsIDB4M2MwMTAwMDEsIDB4MDgwMDQyY2YsIDB4YTQyMDBmNWUsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNWMsCisJMHgwMDAyMTQwMCwgMHgwMGMyMTAyNSwgMHhhZjYyMGNlOCwgMHgzYzAyMDAwMSwgMHg5MDQyMGY1NywgMHgxMDQwMDAwOSwKKwkweDNjMDMwMDBjLCAweDNjMDIwMDAxLCAweDk0NDIwZjY4LCAweDM0NjMwNjI0LCAweDAwMDBkMDIxLCAweDAwNDMxMDI1LAorCTB4YWY2MjBjZWMsIDB4MDgwMDQyYzEsIDB4M2MxMDgwMDAsIDB4M2MwMjAwMDEsIDB4OTQ0MjBmNjgsIDB4M2MwMzAwMDgsCisJMHgzNDYzMDYwNCwgMHgwMDQzMTAyNSwgMHhhZjYyMGNlYywgMHgzYzAyMDAwMSwgMHg5NDQyMGY1ZSwgMHgwMDQ1MTAyMSwKKwkweDNjMDEwMDAxLCAweGE0MjIwZjVlLCAweDNjMTA4MDAwLCAweDNjMDJhMDAwLCAweGFmNjIwY2Y0LCAweDNjMDEwMDAxLAorCTB4YTAyMDBmNTYsIDB4OGY2NDEwMDgsIDB4MDA5MDEwMjQsIDB4MTQ0MDAwMDMsIDB4MDAwMDAwMDAsIDB4MGMwMDQwNjQsCisJMHgwMDAwMDAwMCwgMHg4ZjYyMGNmNCwgMHgwMDUwMTAyNCwgMHgxNDQwZmZmNywgMHgwMDAwMDAwMCwgMHg4ZmJmMDAxNCwKKwkweDhmYjAwMDEwLCAweDAzZTAwMDA4LCAweDI3YmQwMDE4LCAweDAwMDAwMDAwLCAweDI3YmRmZmUwLCAweDNjMDQwMDAxLAorCTB4MjQ4NDBlYzAsIDB4MDAwMDI4MjEsIDB4MDAwMDMwMjEsIDB4MDAwMDM4MjEsIDB4YWZiZjAwMTgsIDB4YWZhMDAwMTAsCisJMHgwYzAwNDM3OCwgMHhhZmEwMDAxNCwgMHgwMDAwZDAyMSwgMHgyNDAyMDEzMCwgMHhhZjYyNTAwMCwgMHgzYzAxMDAwMSwKKwkweGE0MjAwZjUwLCAweDNjMDEwMDAxLCAweGEwMjAwZjU3LCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLAorCTB4MjdiZGZmZTgsIDB4M2MxYmMwMDAsIDB4YWZiZjAwMTQsIDB4YWZiMDAwMTAsIDB4YWY2MDY4MGMsIDB4OGY2MjY4MDQsCisJMHgzNDQyMDA4MiwgMHhhZjYyNjgwNCwgMHg4ZjYzNDAwMCwgMHgyNDAyMGI1MCwgMHgzYzAxMDAwMSwgMHhhYzIyMGYyMCwKKwkweDI0MDIwYjc4LCAweDNjMDEwMDAxLCAweGFjMjIwZjMwLCAweDM0NjMwMDAyLCAweGFmNjM0MDAwLCAweDBjMDA0MzE1LAorCTB4MDA4MDgwMjEsIDB4M2MwMTAwMDEsIDB4YTAyMjBmMzQsIDB4MzA0MjAwZmYsIDB4MjQwMzAwMDIsIDB4MTQ0MzAwMDUsCisJMHgwMDAwMDAwMCwgMHgzYzAyMDAwMSwgMHg4YzQyMGYyMCwgMHgwODAwNDMwOCwgMHhhYzUwMDBjMCwgMHgzYzAyMDAwMSwKKwkweDhjNDIwZjIwLCAweGFjNTAwMGJjLCAweDhmNjI0NDM0LCAweDhmNjM0NDM4LCAweDhmNjQ0NDEwLCAweDNjMDEwMDAxLAorCTB4YWMyMjBmMjgsIDB4M2MwMTAwMDEsIDB4YWMyMzBmMzgsIDB4M2MwMTAwMDEsIDB4YWMyNDBmMjQsIDB4OGZiZjAwMTQsCisJMHg4ZmIwMDAxMCwgMHgwM2UwMDAwOCwgMHgyN2JkMDAxOCwgMHgwM2UwMDAwOCwgMHgyNDAyMDAwMSwgMHgyN2JkZmZmOCwKKwkweDE4ODAwMDA5LCAweDAwMDAyODIxLCAweDhmNjM2ODBjLCAweDhmNjI2ODBjLCAweDEwNDNmZmZlLCAweDAwMDAwMDAwLAorCTB4MjRhNTAwMDEsIDB4MDBhNDEwMmEsIDB4MTQ0MGZmZjksIDB4MDAwMDAwMDAsIDB4MDNlMDAwMDgsIDB4MjdiZDAwMDgsCisJMHg4ZjYzNDQ1MCwgMHgzYzAyMDAwMSwgMHg4YzQyMGYyOCwgMHgwMDAzMWMwMiwgMHgwMDQzMTAyYiwgMHgxNDQwMDAwOCwKKwkweDNjMDM4MDAwLCAweDNjMDQwMDAxLCAweDhjODQwZjM4LCAweDhmNjI0NDUwLCAweDAwMDIxYzAyLCAweDAwODMxMDJiLAorCTB4MTA0MGZmZmMsIDB4M2MwMzgwMDAsIDB4YWY2MzQ0NDQsIDB4OGY2MjQ0NDQsIDB4MDA0MzEwMjQsIDB4MTQ0MGZmZmQsCisJMHgwMDAwMDAwMCwgMHg4ZjYyNDQ0OCwgMHgwM2UwMDAwOCwgMHgzMDQyZmZmZiwgMHgzMDgyZmZmZiwgMHgyNDQyZTAwMCwKKwkweDJjNDIyMDAxLCAweDE0NDAwMDAzLCAweDNjMDI0MDAwLCAweDA4MDA0MzQ3LCAweDI0MDJmZmZmLCAweDAwODIyMDI1LAorCTB4YWY2NDVjMzgsIDB4OGY2MjVjMzAsIDB4MzA0MjAwMDIsIDB4MTQ0MGZmZmMsIDB4MDAwMDEwMjEsIDB4MDNlMDAwMDgsCisJMHgwMDAwMDAwMCwgMHg4ZjYyNDQ1MCwgMHgzYzAzMDAwMSwgMHg4YzYzMGYyNCwgMHgwODAwNDM1MCwgMHgzMDQyZmZmZiwKKwkweDhmNjI0NDUwLCAweDMwNDJmZmZmLCAweDAwNDMxMDJiLCAweDE0NDBmZmZjLCAweDAwMDAwMDAwLCAweDAzZTAwMDA4LAorCTB4MDAwMDAwMDAsIDB4MjdiZGZmZTAsIDB4MDA4MDI4MjEsIDB4M2MwNDAwMDEsIDB4MjQ4NDBlZDAsIDB4MDAwMDMwMjEsCisJMHgwMDAwMzgyMSwgMHhhZmJmMDAxOCwgMHhhZmEwMDAxMCwgMHgwYzAwNDM3OCwgMHhhZmEwMDAxNCwgMHgwODAwNDM1ZiwKKwkweDAwMDAwMDAwLCAweDhmYmYwMDE4LCAweDAzZTAwMDA4LCAweDI3YmQwMDIwLCAweDNjMDIwMDAxLCAweDM0NDJkNjAwLAorCTB4M2MwMzAwMDEsIDB4MzQ2M2Q2MDAsIDB4M2MwNDAwMDEsIDB4MzQ4NGRkZmYsIDB4M2MwMTAwMDEsIDB4YWMyMjBmNDAsCisJMHgyNDAyMDA0MCwgMHgzYzAxMDAwMSwgMHhhYzIyMGY0NCwgMHgzYzAxMDAwMSwgMHhhYzIwMGYzYywgMHhhYzYwMDAwMCwKKwkweDI0NjMwMDA0LCAweDAwODMxMDJiLCAweDUwNDBmZmZkLCAweGFjNjAwMDAwLCAweDAzZTAwMDA4LCAweDAwMDAwMDAwLAorCTB4MDA4MDQ4MjEsIDB4OGZhYTAwMTAsIDB4M2MwMjAwMDEsIDB4OGM0MjBmM2MsIDB4M2MwNDAwMDEsIDB4OGM4NDBmNDQsCisJMHg4ZmFiMDAxNCwgMHgyNDQzMDAwMSwgMHgwMDQ0MTAyYiwgMHgzYzAxMDAwMSwgMHhhYzIzMGYzYywgMHgxNDQwMDAwMywKKwkweDAwMDA0MDIxLCAweDNjMDEwMDAxLCAweGFjMjAwZjNjLCAweDNjMDIwMDAxLCAweDhjNDIwZjNjLCAweDNjMDMwMDAxLAorCTB4OGM2MzBmNDAsIDB4OTEyNDAwMDAsIDB4MDAwMjExNDAsIDB4MDA0MzEwMjEsIDB4MDA0ODEwMjEsIDB4MjUwODAwMDEsCisJMHhhMDQ0MDAwMCwgMHgyOTAyMDAwOCwgMHgxNDQwZmZmNCwgMHgyNTI5MDAwMSwgMHgzYzAyMDAwMSwgMHg4YzQyMGYzYywKKwkweDNjMDMwMDAxLCAweDhjNjMwZjQwLCAweDhmNjQ2ODBjLCAweDAwMDIxMTQwLCAweDAwNDMxMDIxLCAweGFjNDQwMDA4LAorCTB4YWM0NTAwMGMsIDB4YWM0NjAwMTAsIDB4YWM0NzAwMTQsIDB4YWM0YTAwMTgsIDB4MDNlMDAwMDgsIDB4YWM0YjAwMWMsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKK307CisKK3N0YXRpYyB1MzIgdGczVHNvNUZ3Um9kYXRhWyhURzNfVFNPNV9GV19ST0RBVEFfTEVOIC8gNCkgKyAxXSA9IHsKKwkweDRkNjE2OTZlLCAweDQzNzA3NTQyLCAweDAwMDAwMDAwLCAweDRkNjE2OTZlLCAweDQzNzA3NTQxLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NzM3NDZiNmYsIDB4NjY2NjZjNjQsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHg3Mzc0NmI2ZiwgMHg2NjY2NmM2NCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg2NjYxNzQ2MSwgMHg2YzQ1NzI3MiwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorfTsKKworc3RhdGljIHUzMiB0ZzNUc281RndEYXRhWyhURzNfVFNPNV9GV19EQVRBX0xFTiAvIDQpICsgMV0gPSB7CisJMHgwMDAwMDAwMCwgMHg3Mzc0NmI2ZiwgMHg2NjY2NmM2NCwgMHg1Zjc2MzEyZSwgMHgzMjJlMzAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorfTsKKworLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KK3N0YXRpYyBpbnQgdGczX2xvYWRfdHNvX2Zpcm13YXJlKHN0cnVjdCB0ZzMgKnRwKQoreworCXN0cnVjdCBmd19pbmZvIGluZm87CisJdW5zaWduZWQgbG9uZyBjcHVfYmFzZSwgY3B1X3NjcmF0Y2hfYmFzZSwgY3B1X3NjcmF0Y2hfc2l6ZTsKKwlpbnQgZXJyLCBpOworCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSFdfVFNPKQorCQlyZXR1cm4gMDsKKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSkgeworCQlpbmZvLnRleHRfYmFzZSA9IFRHM19UU081X0ZXX1RFWFRfQUREUjsKKwkJaW5mby50ZXh0X2xlbiA9IFRHM19UU081X0ZXX1RFWFRfTEVOOworCQlpbmZvLnRleHRfZGF0YSA9ICZ0ZzNUc281RndUZXh0WzBdOworCQlpbmZvLnJvZGF0YV9iYXNlID0gVEczX1RTTzVfRldfUk9EQVRBX0FERFI7CisJCWluZm8ucm9kYXRhX2xlbiA9IFRHM19UU081X0ZXX1JPREFUQV9MRU47CisJCWluZm8ucm9kYXRhX2RhdGEgPSAmdGczVHNvNUZ3Um9kYXRhWzBdOworCQlpbmZvLmRhdGFfYmFzZSA9IFRHM19UU081X0ZXX0RBVEFfQUREUjsKKwkJaW5mby5kYXRhX2xlbiA9IFRHM19UU081X0ZXX0RBVEFfTEVOOworCQlpbmZvLmRhdGFfZGF0YSA9ICZ0ZzNUc281RndEYXRhWzBdOworCQljcHVfYmFzZSA9IFJYX0NQVV9CQVNFOworCQljcHVfc2NyYXRjaF9iYXNlID0gTklDX1NSQU1fTUJVRl9QT09MX0JBU0U1NzA1OworCQljcHVfc2NyYXRjaF9zaXplID0gKGluZm8udGV4dF9sZW4gKworCQkJCSAgICBpbmZvLnJvZGF0YV9sZW4gKworCQkJCSAgICBpbmZvLmRhdGFfbGVuICsKKwkJCQkgICAgVEczX1RTTzVfRldfU0JTU19MRU4gKworCQkJCSAgICBURzNfVFNPNV9GV19CU1NfTEVOKTsKKwl9IGVsc2UgeworCQlpbmZvLnRleHRfYmFzZSA9IFRHM19UU09fRldfVEVYVF9BRERSOworCQlpbmZvLnRleHRfbGVuID0gVEczX1RTT19GV19URVhUX0xFTjsKKwkJaW5mby50ZXh0X2RhdGEgPSAmdGczVHNvRndUZXh0WzBdOworCQlpbmZvLnJvZGF0YV9iYXNlID0gVEczX1RTT19GV19ST0RBVEFfQUREUjsKKwkJaW5mby5yb2RhdGFfbGVuID0gVEczX1RTT19GV19ST0RBVEFfTEVOOworCQlpbmZvLnJvZGF0YV9kYXRhID0gJnRnM1Rzb0Z3Um9kYXRhWzBdOworCQlpbmZvLmRhdGFfYmFzZSA9IFRHM19UU09fRldfREFUQV9BRERSOworCQlpbmZvLmRhdGFfbGVuID0gVEczX1RTT19GV19EQVRBX0xFTjsKKwkJaW5mby5kYXRhX2RhdGEgPSAmdGczVHNvRndEYXRhWzBdOworCQljcHVfYmFzZSA9IFRYX0NQVV9CQVNFOworCQljcHVfc2NyYXRjaF9iYXNlID0gVFhfQ1BVX1NDUkFUQ0hfQkFTRTsKKwkJY3B1X3NjcmF0Y2hfc2l6ZSA9IFRYX0NQVV9TQ1JBVENIX1NJWkU7CisJfQorCisJZXJyID0gdGczX2xvYWRfZmlybXdhcmVfY3B1KHRwLCBjcHVfYmFzZSwKKwkJCQkgICAgY3B1X3NjcmF0Y2hfYmFzZSwgY3B1X3NjcmF0Y2hfc2l6ZSwKKwkJCQkgICAgJmluZm8pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBOb3cgc3RhcnR1cCB0aGUgY3B1LiAqLworCXR3MzIoY3B1X2Jhc2UgKyBDUFVfU1RBVEUsIDB4ZmZmZmZmZmYpOworCXR3MzJfZihjcHVfYmFzZSArIENQVV9QQywgICAgaW5mby50ZXh0X2Jhc2UpOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlpZiAodHIzMihjcHVfYmFzZSArIENQVV9QQykgPT0gaW5mby50ZXh0X2Jhc2UpCisJCQlicmVhazsKKwkJdHczMihjcHVfYmFzZSArIENQVV9TVEFURSwgMHhmZmZmZmZmZik7CisJCXR3MzIoY3B1X2Jhc2UgKyBDUFVfTU9ERSwgIENQVV9NT0RFX0hBTFQpOworCQl0dzMyX2YoY3B1X2Jhc2UgKyBDUFVfUEMsICAgIGluZm8udGV4dF9iYXNlKTsKKwkJdWRlbGF5KDEwMDApOworCX0KKwlpZiAoaSA+PSA1KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInRnM19sb2FkX3Rzb19maXJtd2FyZSBmYWlscyBmb3IgJXMgIgorCQkgICAgICAgInRvIHNldCBDUFUgUEMsIGlzICUwOHggc2hvdWxkIGJlICUwOHhcbiIsCisJCSAgICAgICB0cC0+ZGV2LT5uYW1lLCB0cjMyKGNwdV9iYXNlICsgQ1BVX1BDKSwKKwkJICAgICAgIGluZm8udGV4dF9iYXNlKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXR3MzIoY3B1X2Jhc2UgKyBDUFVfU1RBVEUsIDB4ZmZmZmZmZmYpOworCXR3MzJfZihjcHVfYmFzZSArIENQVV9NT0RFLCAgMHgwMDAwMDAwMCk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBURzNfVFNPX1NVUFBPUlQgIT0gMCAqLworCisvKiB0cC0+bG9jayBpcyBoZWxkLiAqLworc3RhdGljIHZvaWQgX190ZzNfc2V0X21hY19hZGRyKHN0cnVjdCB0ZzMgKnRwKQoreworCXUzMiBhZGRyX2hpZ2gsIGFkZHJfbG93OworCWludCBpOworCisJYWRkcl9oaWdoID0gKCh0cC0+ZGV2LT5kZXZfYWRkclswXSA8PCA4KSB8CisJCSAgICAgdHAtPmRldi0+ZGV2X2FkZHJbMV0pOworCWFkZHJfbG93ID0gKCh0cC0+ZGV2LT5kZXZfYWRkclsyXSA8PCAyNCkgfAorCQkgICAgKHRwLT5kZXYtPmRldl9hZGRyWzNdIDw8IDE2KSB8CisJCSAgICAodHAtPmRldi0+ZGV2X2FkZHJbNF0gPDwgIDgpIHwKKwkJICAgICh0cC0+ZGV2LT5kZXZfYWRkcls1XSA8PCAgMCkpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJdHczMihNQUNfQUREUl8wX0hJR0ggKyAoaSAqIDgpLCBhZGRyX2hpZ2gpOworCQl0dzMyKE1BQ19BRERSXzBfTE9XICsgKGkgKiA4KSwgYWRkcl9sb3cpOworCX0KKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMyB8fAorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCkgeworCQlmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykgeworCQkJdHczMihNQUNfRVhUQUREUl8wX0hJR0ggKyAoaSAqIDgpLCBhZGRyX2hpZ2gpOworCQkJdHczMihNQUNfRVhUQUREUl8wX0xPVyArIChpICogOCksIGFkZHJfbG93KTsKKwkJfQorCX0KKworCWFkZHJfaGlnaCA9ICh0cC0+ZGV2LT5kZXZfYWRkclswXSArCisJCSAgICAgdHAtPmRldi0+ZGV2X2FkZHJbMV0gKworCQkgICAgIHRwLT5kZXYtPmRldl9hZGRyWzJdICsKKwkJICAgICB0cC0+ZGV2LT5kZXZfYWRkclszXSArCisJCSAgICAgdHAtPmRldi0+ZGV2X2FkZHJbNF0gKworCQkgICAgIHRwLT5kZXYtPmRldl9hZGRyWzVdKSAmCisJCVRYX0JBQ0tPRkZfU0VFRF9NQVNLOworCXR3MzIoTUFDX1RYX0JBQ0tPRkZfU0VFRCwgYWRkcl9oaWdoKTsKK30KKworc3RhdGljIGludCB0ZzNfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisKKwlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJX190ZzNfc2V0X21hY19hZGRyKHRwKTsKKwlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKiB0cC0+bG9jayBpcyBoZWxkLiAqLworc3RhdGljIHZvaWQgdGczX3NldF9iZGluZm8oc3RydWN0IHRnMyAqdHAsIHUzMiBiZGluZm9fYWRkciwKKwkJCSAgIGRtYV9hZGRyX3QgbWFwcGluZywgdTMyIG1heGxlbl9mbGFncywKKwkJCSAgIHUzMiBuaWNfYWRkcikKK3sKKwl0ZzNfd3JpdGVfbWVtKHRwLAorCQkgICAgICAoYmRpbmZvX2FkZHIgKyBURzNfQkRJTkZPX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfSElHSCksCisJCSAgICAgICgodTY0KSBtYXBwaW5nID4+IDMyKSk7CisJdGczX3dyaXRlX21lbSh0cCwKKwkJICAgICAgKGJkaW5mb19hZGRyICsgVEczX0JESU5GT19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0xPVyksCisJCSAgICAgICgodTY0KSBtYXBwaW5nICYgMHhmZmZmZmZmZikpOworCXRnM193cml0ZV9tZW0odHAsCisJCSAgICAgIChiZGluZm9fYWRkciArIFRHM19CRElORk9fTUFYTEVOX0ZMQUdTKSwKKwkJICAgICAgIG1heGxlbl9mbGFncyk7CisKKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykpCisJCXRnM193cml0ZV9tZW0odHAsCisJCQkgICAgICAoYmRpbmZvX2FkZHIgKyBURzNfQkRJTkZPX05JQ19BRERSKSwKKwkJCSAgICAgIG5pY19hZGRyKTsKK30KKworc3RhdGljIHZvaWQgX190ZzNfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKik7CisKKy8qIHRwLT5sb2NrIGlzIGhlbGQuICovCitzdGF0aWMgaW50IHRnM19yZXNldF9odyhzdHJ1Y3QgdGczICp0cCkKK3sKKwl1MzIgdmFsLCByZG1hY19tb2RlOworCWludCBpLCBlcnIsIGxpbWl0OworCisJdGczX2Rpc2FibGVfaW50cyh0cCk7CisKKwl0ZzNfc3RvcF9mdyh0cCk7CisKKwl0ZzNfd3JpdGVfc2lnX3ByZV9yZXNldCh0cCwgUkVTRVRfS0lORF9JTklUKTsKKworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfSU5JVF9DT01QTEVURSkgeworCQllcnIgPSB0ZzNfYWJvcnRfaHcodHApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSB0ZzNfY2hpcF9yZXNldCh0cCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXRnM193cml0ZV9zaWdfbGVnYWN5KHRwLCBSRVNFVF9LSU5EX0lOSVQpOworCisJLyogVGhpcyB3b3JrcyBhcm91bmQgYW4gaXNzdWUgd2l0aCBBdGhsb24gY2hpcHNldHMgb24KKwkgKiBCMyB0aWdvbjMgc2lsaWNvbi4gIFRoaXMgYml0IGhhcyBubyBlZmZlY3Qgb24gYW55CisJICogb3RoZXIgcmV2aXNpb24uICBCdXQgZG8gbm90IHNldCB0aGlzIG9uIFBDSSBFeHByZXNzCisJICogY2hpcHMuCisJICovCisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QQ0lfRVhQUkVTUykpCisJCXRwLT5wY2lfY2xvY2tfY3RybCB8PSBDTE9DS19DVFJMX0RFTEFZX1BDSV9HUkFOVDsKKwl0dzMyX2YoVEczUENJX0NMT0NLX0NUUkwsIHRwLT5wY2lfY2xvY2tfY3RybCk7CisKKwlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDRfQTAgJiYKKwkgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX01PREUpKSB7CisJCXZhbCA9IHRyMzIoVEczUENJX1BDSVNUQVRFKTsKKwkJdmFsIHw9IFBDSVNUQVRFX1JFVFJZX1NBTUVfRE1BOworCQl0dzMyKFRHM1BDSV9QQ0lTVEFURSwgdmFsKTsKKwl9CisKKwlpZiAoR0VUX0NISVBfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IENISVBSRVZfNTcwNF9CWCkgeworCQkvKiBFbmFibGUgc29tZSBodyBmaXhlcy4gICovCisJCXZhbCA9IHRyMzIoVEczUENJX01TSV9EQVRBKTsKKwkJdmFsIHw9ICgxIDw8IDI2KSB8ICgxIDw8IDI4KSB8ICgxIDw8IDI5KTsKKwkJdHczMihURzNQQ0lfTVNJX0RBVEEsIHZhbCk7CisJfQorCisJLyogRGVzY3JpcHRvciByaW5nIGluaXQgbWF5IG1ha2UgYWNjZXNzZXMgdG8gdGhlCisJICogTklDIFNSQU0gYXJlYSB0byBzZXR1cCB0aGUgVFggZGVzY3JpcHRvcnMsIHNvIHdlCisJICogY2FuIG9ubHkgZG8gdGhpcyBhZnRlciB0aGUgaGFyZHdhcmUgaGFzIGJlZW4KKwkgKiBzdWNjZXNzZnVsbHkgcmVzZXQuCisJICovCisJdGczX2luaXRfcmluZ3ModHApOworCisJLyogVGhpcyB2YWx1ZSBpcyBkZXRlcm1pbmVkIGR1cmluZyB0aGUgcHJvYmUgdGltZSBETUEKKwkgKiBlbmdpbmUgdGVzdCwgdGczX3Rlc3RfZG1hLgorCSAqLworCXR3MzIoVEczUENJX0RNQV9SV19DVFJMLCB0cC0+ZG1hX3J3Y3RybCk7CisKKwl0cC0+Z3JjX21vZGUgJj0gfihHUkNfTU9ERV9IT1NUX1NFTkRCRFMgfAorCQkJICBHUkNfTU9ERV80WF9OSUNfU0VORF9SSU5HUyB8CisJCQkgIEdSQ19NT0RFX05PX1RYX1BIRFJfQ1NVTSB8CisJCQkgIEdSQ19NT0RFX05PX1JYX1BIRFJfQ1NVTSk7CisJdHAtPmdyY19tb2RlIHw9IEdSQ19NT0RFX0hPU1RfU0VOREJEUzsKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX05PX1RYX1BTRVVET19DU1VNKQorCQl0cC0+Z3JjX21vZGUgfD0gR1JDX01PREVfTk9fVFhfUEhEUl9DU1VNOworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfTk9fUlhfUFNFVURPX0NTVU0pCisJCXRwLT5ncmNfbW9kZSB8PSBHUkNfTU9ERV9OT19SWF9QSERSX0NTVU07CisKKwl0dzMyKEdSQ19NT0RFLAorCSAgICAgdHAtPmdyY19tb2RlIHwKKwkgICAgIChHUkNfTU9ERV9JUlFfT05fTUFDX0FUVE4gfCBHUkNfTU9ERV9IT1NUX1NUQUNLVVApKTsKKworCS8qIFNldHVwIHRoZSB0aW1lciBwcmVzY2FsYXIgcmVnaXN0ZXIuICBDbG9jayBpcyBhbHdheXMgNjZNaHouICovCisJdmFsID0gdHIzMihHUkNfTUlTQ19DRkcpOworCXZhbCAmPSB+MHhmZjsKKwl2YWwgfD0gKDY1IDw8IEdSQ19NSVNDX0NGR19QUkVTQ0FMQVJfU0hJRlQpOworCXR3MzIoR1JDX01JU0NfQ0ZHLCB2YWwpOworCisJLyogSW5pdGlhbGl6ZSBNQlVGL0RFU0MgcG9vbC4gKi8KKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApIHsKKwkJLyogRG8gbm90aGluZy4gICovCisJfSBlbHNlIGlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwNSkgeworCQl0dzMyKEJVRk1HUl9NQl9QT09MX0FERFIsIE5JQ19TUkFNX01CVUZfUE9PTF9CQVNFKTsKKwkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA0KQorCQkJdHczMihCVUZNR1JfTUJfUE9PTF9TSVpFLCBOSUNfU1JBTV9NQlVGX1BPT0xfU0laRTY0KTsKKwkJZWxzZQorCQkJdHczMihCVUZNR1JfTUJfUE9PTF9TSVpFLCBOSUNfU1JBTV9NQlVGX1BPT0xfU0laRTk2KTsKKwkJdHczMihCVUZNR1JfRE1BX0RFU0NfUE9PTF9BRERSLCBOSUNfU1JBTV9ETUFfREVTQ19QT09MX0JBU0UpOworCQl0dzMyKEJVRk1HUl9ETUFfREVTQ19QT09MX1NJWkUsIE5JQ19TUkFNX0RNQV9ERVNDX1BPT0xfU0laRSk7CisJfQorI2lmIFRHM19UU09fU1VQUE9SVCAhPSAwCisJZWxzZSBpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9UU09fQ0FQQUJMRSkgeworCQlpbnQgZndfbGVuOworCisJCWZ3X2xlbiA9IChURzNfVFNPNV9GV19URVhUX0xFTiArCisJCQkgIFRHM19UU081X0ZXX1JPREFUQV9MRU4gKworCQkJICBURzNfVFNPNV9GV19EQVRBX0xFTiArCisJCQkgIFRHM19UU081X0ZXX1NCU1NfTEVOICsKKwkJCSAgVEczX1RTTzVfRldfQlNTX0xFTik7CisJCWZ3X2xlbiA9IChmd19sZW4gKyAoMHg4MCAtIDEpKSAmIH4oMHg4MCAtIDEpOworCQl0dzMyKEJVRk1HUl9NQl9QT09MX0FERFIsCisJCSAgICAgTklDX1NSQU1fTUJVRl9QT09MX0JBU0U1NzA1ICsgZndfbGVuKTsKKwkJdHczMihCVUZNR1JfTUJfUE9PTF9TSVpFLAorCQkgICAgIE5JQ19TUkFNX01CVUZfUE9PTF9TSVpFNTcwNSAtIGZ3X2xlbiAtIDB4YTAwKTsKKwl9CisjZW5kaWYKKworCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19KVU1CT19FTkFCTEUpKSB7CisJCXR3MzIoQlVGTUdSX01CX1JETUFfTE9XX1dBVEVSLAorCQkgICAgIHRwLT5idWZtZ3JfY29uZmlnLm1idWZfcmVhZF9kbWFfbG93X3dhdGVyKTsKKwkJdHczMihCVUZNR1JfTUJfTUFDUlhfTE9XX1dBVEVSLAorCQkgICAgIHRwLT5idWZtZ3JfY29uZmlnLm1idWZfbWFjX3J4X2xvd193YXRlcik7CisJCXR3MzIoQlVGTUdSX01CX0hJR0hfV0FURVIsCisJCSAgICAgdHAtPmJ1Zm1ncl9jb25maWcubWJ1Zl9oaWdoX3dhdGVyKTsKKwl9IGVsc2UgeworCQl0dzMyKEJVRk1HUl9NQl9SRE1BX0xPV19XQVRFUiwKKwkJICAgICB0cC0+YnVmbWdyX2NvbmZpZy5tYnVmX3JlYWRfZG1hX2xvd193YXRlcl9qdW1ibyk7CisJCXR3MzIoQlVGTUdSX01CX01BQ1JYX0xPV19XQVRFUiwKKwkJICAgICB0cC0+YnVmbWdyX2NvbmZpZy5tYnVmX21hY19yeF9sb3dfd2F0ZXJfanVtYm8pOworCQl0dzMyKEJVRk1HUl9NQl9ISUdIX1dBVEVSLAorCQkgICAgIHRwLT5idWZtZ3JfY29uZmlnLm1idWZfaGlnaF93YXRlcl9qdW1ibyk7CisJfQorCXR3MzIoQlVGTUdSX0RNQV9MT1dfV0FURVIsCisJICAgICB0cC0+YnVmbWdyX2NvbmZpZy5kbWFfbG93X3dhdGVyKTsKKwl0dzMyKEJVRk1HUl9ETUFfSElHSF9XQVRFUiwKKwkgICAgIHRwLT5idWZtZ3JfY29uZmlnLmRtYV9oaWdoX3dhdGVyKTsKKworCXR3MzIoQlVGTUdSX01PREUsIEJVRk1HUl9NT0RFX0VOQUJMRSB8IEJVRk1HUl9NT0RFX0FUVE5fRU5BQkxFKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjAwMDsgaSsrKSB7CisJCWlmICh0cjMyKEJVRk1HUl9NT0RFKSAmIEJVRk1HUl9NT0RFX0VOQUJMRSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKwlpZiAoaSA+PSAyMDAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInRnM19yZXNldF9odyBjYW5ub3QgZW5hYmxlIEJVRk1HUiBmb3IgJXMuXG4iLAorCQkgICAgICAgdHAtPmRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFNldHVwIHJlcGxlbmlzaCB0aHJlc2hvbGQuICovCisJdHczMihSQ1ZCRElfU1REX1RIUkVTSCwgdHAtPnJ4X3BlbmRpbmcgLyA4KTsKKworCS8qIEluaXRpYWxpemUgVEczX0JESU5GTydzIGF0OgorCSAqICBSQ1ZEQkRJX1NURF9CRDoJc3RhbmRhcmQgZXRoIHNpemUgcnggcmluZworCSAqICBSQ1ZEQkRJX0pVTUJPX0JEOglqdW1ibyBmcmFtZSByeCByaW5nCisJICogIFJDVkRCRElfTUlOSV9CRDoJc21hbGwgZnJhbWUgcnggcmluZyAoPz8/IGRvZXMgbm90IHdvcmspCisJICoKKwkgKiBsaWtlIHNvOgorCSAqICBURzNfQkRJTkZPX0hPU1RfQUREUjoJaGlnaC9sb3cgcGFydHMgb2YgRE1BIGFkZHJlc3Mgb2YgcmluZworCSAqICBURzNfQkRJTkZPX01BWExFTl9GTEFHUzoJKHJ4IG1heCBidWZmZXIgc2l6ZSA8PCAxNikgfAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmluZyBhdHRyaWJ1dGUgZmxhZ3MKKwkgKiAgVEczX0JESU5GT19OSUNfQUREUjoJbG9jYXRpb24gb2YgZGVzY3JpcHRvcnMgaW4gbmljIFNSQU0KKwkgKgorCSAqIFN0YW5kYXJkIHJlY2VpdmUgcmluZyBAIE5JQ19TUkFNX1JYX0JVRkZFUl9ERVNDLCA1MTIgZW50cmllcy4KKwkgKiBKdW1ibyByZWNlaXZlIHJpbmcgQCBOSUNfU1JBTV9SWF9KVU1CT19CVUZGRVJfREVTQywgMjU2IGVudHJpZXMuCisJICoKKwkgKiBUaGUgc2l6ZSBvZiBlYWNoIHJpbmcgaXMgZml4ZWQgaW4gdGhlIGZpcm13YXJlLCBidXQgdGhlIGxvY2F0aW9uIGlzCisJICogY29uZmlndXJhYmxlLgorCSAqLworCXR3MzIoUkNWREJESV9TVERfQkQgKyBURzNfQkRJTkZPX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfSElHSCwKKwkgICAgICgodTY0KSB0cC0+cnhfc3RkX21hcHBpbmcgPj4gMzIpKTsKKwl0dzMyKFJDVkRCRElfU1REX0JEICsgVEczX0JESU5GT19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0xPVywKKwkgICAgICgodTY0KSB0cC0+cnhfc3RkX21hcHBpbmcgJiAweGZmZmZmZmZmKSk7CisJdHczMihSQ1ZEQkRJX1NURF9CRCArIFRHM19CRElORk9fTklDX0FERFIsCisJICAgICBOSUNfU1JBTV9SWF9CVUZGRVJfREVTQyk7CisKKwkvKiBEb24ndCBldmVuIHRyeSB0byBwcm9ncmFtIHRoZSBKVU1CTy9NSU5JIGJ1ZmZlciBkZXNjcmlwdG9yCisJICogY29uZmlncyBvbiA1NzA1LgorCSAqLworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykgeworCQl0dzMyKFJDVkRCRElfU1REX0JEICsgVEczX0JESU5GT19NQVhMRU5fRkxBR1MsCisJCSAgICAgUlhfU1REX01BWF9TSVpFXzU3MDUgPDwgQkRJTkZPX0ZMQUdTX01BWExFTl9TSElGVCk7CisJfSBlbHNlIHsKKwkJdHczMihSQ1ZEQkRJX1NURF9CRCArIFRHM19CRElORk9fTUFYTEVOX0ZMQUdTLAorCQkgICAgIFJYX1NURF9NQVhfU0laRSA8PCBCRElORk9fRkxBR1NfTUFYTEVOX1NISUZUKTsKKworCQl0dzMyKFJDVkRCRElfTUlOSV9CRCArIFRHM19CRElORk9fTUFYTEVOX0ZMQUdTLAorCQkgICAgIEJESU5GT19GTEFHU19ESVNBQkxFRCk7CisKKwkJLyogU2V0dXAgcmVwbGVuaXNoIHRocmVzaG9sZC4gKi8KKwkJdHczMihSQ1ZCRElfSlVNQk9fVEhSRVNILCB0cC0+cnhfanVtYm9fcGVuZGluZyAvIDgpOworCisJCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfSlVNQk9fRU5BQkxFKSB7CisJCQl0dzMyKFJDVkRCRElfSlVNQk9fQkQgKyBURzNfQkRJTkZPX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfSElHSCwKKwkJCSAgICAgKCh1NjQpIHRwLT5yeF9qdW1ib19tYXBwaW5nID4+IDMyKSk7CisJCQl0dzMyKFJDVkRCRElfSlVNQk9fQkQgKyBURzNfQkRJTkZPX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfTE9XLAorCQkJICAgICAoKHU2NCkgdHAtPnJ4X2p1bWJvX21hcHBpbmcgJiAweGZmZmZmZmZmKSk7CisJCQl0dzMyKFJDVkRCRElfSlVNQk9fQkQgKyBURzNfQkRJTkZPX01BWExFTl9GTEFHUywKKwkJCSAgICAgUlhfSlVNQk9fTUFYX1NJWkUgPDwgQkRJTkZPX0ZMQUdTX01BWExFTl9TSElGVCk7CisJCQl0dzMyKFJDVkRCRElfSlVNQk9fQkQgKyBURzNfQkRJTkZPX05JQ19BRERSLAorCQkJICAgICBOSUNfU1JBTV9SWF9KVU1CT19CVUZGRVJfREVTQyk7CisJCX0gZWxzZSB7CisJCQl0dzMyKFJDVkRCRElfSlVNQk9fQkQgKyBURzNfQkRJTkZPX01BWExFTl9GTEFHUywKKwkJCSAgICAgQkRJTkZPX0ZMQUdTX0RJU0FCTEVEKTsKKwkJfQorCisJfQorCisJLyogVGhlcmUgaXMgb25seSBvbmUgc2VuZCByaW5nIG9uIDU3MDUvNTc1MCwgbm8gbmVlZCB0byBleHBsaWNpdGx5CisJICogZGlzYWJsZSB0aGUgb3RoZXJzLgorCSAqLworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKSkgeworCQkvKiBDbGVhciBvdXQgc2VuZCBSQ0IgcmluZyBpbiBTUkFNLiAqLworCQlmb3IgKGkgPSBOSUNfU1JBTV9TRU5EX1JDQjsgaSA8IE5JQ19TUkFNX1JDVl9SRVRfUkNCOyBpICs9IFRHM19CRElORk9fU0laRSkKKwkJCXRnM193cml0ZV9tZW0odHAsIGkgKyBURzNfQkRJTkZPX01BWExFTl9GTEFHUywKKwkJCQkgICAgICBCRElORk9fRkxBR1NfRElTQUJMRUQpOworCX0KKworCXRwLT50eF9wcm9kID0gMDsKKwl0cC0+dHhfY29ucyA9IDA7CisJdHczMl9tYWlsYm94KE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8wICsgVEczXzY0QklUX1JFR19MT1csIDApOworCXR3MzJfdHhfbWJveChNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8wICsgVEczXzY0QklUX1JFR19MT1csIDApOworCisJdGczX3NldF9iZGluZm8odHAsIE5JQ19TUkFNX1NFTkRfUkNCLAorCQkgICAgICAgdHAtPnR4X2Rlc2NfbWFwcGluZywKKwkJICAgICAgIChURzNfVFhfUklOR19TSVpFIDw8CisJCQlCRElORk9fRkxBR1NfTUFYTEVOX1NISUZUKSwKKwkJICAgICAgIE5JQ19TUkFNX1RYX0JVRkZFUl9ERVNDKTsKKworCS8qIFRoZXJlIGlzIG9ubHkgb25lIHJlY2VpdmUgcmV0dXJuIHJpbmcgb24gNTcwNS81NzUwLCBubyBuZWVkCisJICogdG8gZXhwbGljaXRseSBkaXNhYmxlIHRoZSBvdGhlcnMuCisJICovCisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpKSB7CisJCWZvciAoaSA9IE5JQ19TUkFNX1JDVl9SRVRfUkNCOyBpIDwgTklDX1NSQU1fU1RBVFNfQkxLOworCQkgICAgIGkgKz0gVEczX0JESU5GT19TSVpFKSB7CisJCQl0ZzNfd3JpdGVfbWVtKHRwLCBpICsgVEczX0JESU5GT19NQVhMRU5fRkxBR1MsCisJCQkJICAgICAgQkRJTkZPX0ZMQUdTX0RJU0FCTEVEKTsKKwkJfQorCX0KKworCXRwLT5yeF9yY2JfcHRyID0gMDsKKwl0dzMyX3J4X21ib3goTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8wICsgVEczXzY0QklUX1JFR19MT1csIDApOworCisJdGczX3NldF9iZGluZm8odHAsIE5JQ19TUkFNX1JDVl9SRVRfUkNCLAorCQkgICAgICAgdHAtPnJ4X3JjYl9tYXBwaW5nLAorCQkgICAgICAgKFRHM19SWF9SQ0JfUklOR19TSVpFKHRwKSA8PAorCQkJQkRJTkZPX0ZMQUdTX01BWExFTl9TSElGVCksCisJCSAgICAgICAwKTsKKworCXRwLT5yeF9zdGRfcHRyID0gdHAtPnJ4X3BlbmRpbmc7CisJdHczMl9yeF9tYm94KE1BSUxCT1hfUkNWX1NURF9QUk9EX0lEWCArIFRHM182NEJJVF9SRUdfTE9XLAorCQkgICAgIHRwLT5yeF9zdGRfcHRyKTsKKworCXRwLT5yeF9qdW1ib19wdHIgPSAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0pVTUJPX0VOQUJMRSkgPworCQkJCQkJdHAtPnJ4X2p1bWJvX3BlbmRpbmcgOiAwOworCXR3MzJfcnhfbWJveChNQUlMQk9YX1JDVl9KVU1CT19QUk9EX0lEWCArIFRHM182NEJJVF9SRUdfTE9XLAorCQkgICAgIHRwLT5yeF9qdW1ib19wdHIpOworCisJLyogSW5pdGlhbGl6ZSBNQUMgYWRkcmVzcyBhbmQgYmFja29mZiBzZWVkLiAqLworCV9fdGczX3NldF9tYWNfYWRkcih0cCk7CisKKwkvKiBNVFUgKyBldGhlcm5ldCBoZWFkZXIgKyBGQ1MgKyBvcHRpb25hbCBWTEFOIHRhZyAqLworCXR3MzIoTUFDX1JYX01UVV9TSVpFLCB0cC0+ZGV2LT5tdHUgKyBFVEhfSExFTiArIDgpOworCisJLyogVGhlIHNsb3QgdGltZSBpcyBjaGFuZ2VkIGJ5IHRnM19zZXR1cF9waHkgaWYgd2UKKwkgKiBydW4gYXQgZ2lnYWJpdCB3aXRoIGhhbGYgZHVwbGV4LgorCSAqLworCXR3MzIoTUFDX1RYX0xFTkdUSFMsCisJICAgICAoMiA8PCBUWF9MRU5HVEhTX0lQR19DUlNfU0hJRlQpIHwKKwkgICAgICg2IDw8IFRYX0xFTkdUSFNfSVBHX1NISUZUKSB8CisJICAgICAoMzIgPDwgVFhfTEVOR1RIU19TTE9UX1RJTUVfU0hJRlQpKTsKKworCS8qIFJlY2VpdmUgcnVsZXMuICovCisJdHczMihNQUNfUkNWX1JVTEVfQ0ZHLCBSQ1ZfUlVMRV9DRkdfREVGQVVMVF9DTEFTUyk7CisJdHczMihSQ1ZMUENfQ09ORklHLCAweDAxODEpOworCisJLyogQ2FsY3VsYXRlIFJETUFDX01PREUgc2V0dGluZyBlYXJseSwgd2UgbmVlZCBpdCB0byBkZXRlcm1pbmUKKwkgKiB0aGUgUkNWTFBDX1NUQVRFX0VOQUJMRSBtYXNrLgorCSAqLworCXJkbWFjX21vZGUgPSAoUkRNQUNfTU9ERV9FTkFCTEUgfCBSRE1BQ19NT0RFX1RHVEFCT1JUX0VOQUIgfAorCQkgICAgICBSRE1BQ19NT0RFX01TVEFCT1JUX0VOQUIgfCBSRE1BQ19NT0RFX1BBUklUWUVSUl9FTkFCIHwKKwkJICAgICAgUkRNQUNfTU9ERV9BRERST0ZMT1dfRU5BQiB8IFJETUFDX01PREVfRklGT09GTE9XX0VOQUIgfAorCQkgICAgICBSRE1BQ19NT0RFX0ZJRk9VUlVOX0VOQUIgfCBSRE1BQ19NT0RFX0ZJRk9PUkVBRF9FTkFCIHwKKwkJICAgICAgUkRNQUNfTU9ERV9MTkdSRUFEX0VOQUIpOworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfU1BMSVRfTU9ERSkKKwkJcmRtYWNfbW9kZSB8PSBSRE1BQ19NT0RFX1NQTElUX0VOQUJMRTsKKwlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1ICYmCisJICAgICB0cC0+cGNpX2NoaXBfcmV2X2lkICE9IENISVBSRVZfSURfNTcwNV9BMCkgfHwKKwkgICAgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzUwKSkgeworCQlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9UU09fQ0FQQUJMRSAmJgorCQkgICAgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzA1X0ExIHx8CisJCSAgICAgdHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDVfQTIpKSB7CisJCQlyZG1hY19tb2RlIHw9IFJETUFDX01PREVfRklGT19TSVpFXzEyODsKKwkJfSBlbHNlIGlmICghKHRyMzIoVEczUENJX1BDSVNUQVRFKSAmIFBDSVNUQVRFX0JVU19TUEVFRF9ISUdIKSAmJgorCQkJICAgISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0lTXzU3ODgpKSB7CisJCQlyZG1hY19tb2RlIHw9IFJETUFDX01PREVfRklGT19MT05HX0JVUlNUOworCQl9CisJfQorCisjaWYgVEczX1RTT19TVVBQT1JUICE9IDAKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9IV19UU08pCisJCXJkbWFjX21vZGUgfD0gKDEgPDwgMjcpOworI2VuZGlmCisKKwkvKiBSZWNlaXZlL3NlbmQgc3RhdGlzdGljcy4gKi8KKwlpZiAoKHJkbWFjX21vZGUgJiBSRE1BQ19NT0RFX0ZJRk9fU0laRV8xMjgpICYmCisJICAgICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1RTT19DQVBBQkxFKSkgeworCQl2YWwgPSB0cjMyKFJDVkxQQ19TVEFUU19FTkFCTEUpOworCQl2YWwgJj0gflJDVkxQQ19TVEFUU0VOQUJfTE5HQlJTVF9SRklYOworCQl0dzMyKFJDVkxQQ19TVEFUU19FTkFCTEUsIHZhbCk7CisJfSBlbHNlIHsKKwkJdHczMihSQ1ZMUENfU1RBVFNfRU5BQkxFLCAweGZmZmZmZik7CisJfQorCXR3MzIoUkNWTFBDX1NUQVRTQ1RSTCwgUkNWTFBDX1NUQVRTQ1RSTF9FTkFCTEUpOworCXR3MzIoU05EREFUQUlfU1RBVFNFTkFCLCAweGZmZmZmZik7CisJdHczMihTTkREQVRBSV9TVEFUU0NUUkwsCisJICAgICAoU05EREFUQUlfU0NUUkxfRU5BQkxFIHwKKwkgICAgICBTTkREQVRBSV9TQ1RSTF9GQVNUVVBEKSk7CisKKwkvKiBTZXR1cCBob3N0IGNvYWxlc2NpbmcgZW5naW5lLiAqLworCXR3MzIoSE9TVENDX01PREUsIDApOworCWZvciAoaSA9IDA7IGkgPCAyMDAwOyBpKyspIHsKKwkJaWYgKCEodHIzMihIT1NUQ0NfTU9ERSkgJiBIT1NUQ0NfTU9ERV9FTkFCTEUpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCisJdHczMihIT1NUQ0NfUlhDT0xfVElDS1MsIDApOworCXR3MzIoSE9TVENDX1RYQ09MX1RJQ0tTLCBMT1dfVFhDT0xfVElDS1MpOworCXR3MzIoSE9TVENDX1JYTUFYX0ZSQU1FUywgMSk7CisJdHczMihIT1NUQ0NfVFhNQVhfRlJBTUVTLCBMT1dfUlhNQVhfRlJBTUVTKTsKKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykpIHsKKwkJdHczMihIT1NUQ0NfUlhDT0FMX1RJQ0tfSU5ULCAwKTsKKwkJdHczMihIT1NUQ0NfVFhDT0FMX1RJQ0tfSU5ULCAwKTsKKwl9CisJdHczMihIT1NUQ0NfUlhDT0FMX01BWEZfSU5ULCAxKTsKKwl0dzMyKEhPU1RDQ19UWENPQUxfTUFYRl9JTlQsIDApOworCisJLyogc2V0IHN0YXR1cyBibG9jayBETUEgYWRkcmVzcyAqLworCXR3MzIoSE9TVENDX1NUQVRVU19CTEtfSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19ISUdILAorCSAgICAgKCh1NjQpIHRwLT5zdGF0dXNfbWFwcGluZyA+PiAzMikpOworCXR3MzIoSE9TVENDX1NUQVRVU19CTEtfSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19MT1csCisJICAgICAoKHU2NCkgdHAtPnN0YXR1c19tYXBwaW5nICYgMHhmZmZmZmZmZikpOworCisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpKSB7CisJCS8qIFN0YXR1cy9zdGF0aXN0aWNzIGJsb2NrIGFkZHJlc3MuICBTZWUgdGczX3RpbWVyLAorCQkgKiB0aGUgdGczX3BlcmlvZGljX2ZldGNoX3N0YXRzIGNhbGwgdGhlcmUsIGFuZAorCQkgKiB0ZzNfZ2V0X3N0YXRzIHRvIHNlZSBob3cgdGhpcyB3b3JrcyBmb3IgNTcwNS81NzUwIGNoaXBzLgorCQkgKi8KKwkJdHczMihIT1NUQ0NfU1RBVF9DT0FMX1RJQ0tTLAorCQkgICAgIERFRkFVTFRfU1RBVF9DT0FMX1RJQ0tTKTsKKwkJdHczMihIT1NUQ0NfU1RBVFNfQkxLX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfSElHSCwKKwkJICAgICAoKHU2NCkgdHAtPnN0YXRzX21hcHBpbmcgPj4gMzIpKTsKKwkJdHczMihIT1NUQ0NfU1RBVFNfQkxLX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfTE9XLAorCQkgICAgICgodTY0KSB0cC0+c3RhdHNfbWFwcGluZyAmIDB4ZmZmZmZmZmYpKTsKKwkJdHczMihIT1NUQ0NfU1RBVFNfQkxLX05JQ19BRERSLCBOSUNfU1JBTV9TVEFUU19CTEspOworCQl0dzMyKEhPU1RDQ19TVEFUVVNfQkxLX05JQ19BRERSLCBOSUNfU1JBTV9TVEFUVVNfQkxLKTsKKwl9CisKKwl0dzMyKEhPU1RDQ19NT0RFLCBIT1NUQ0NfTU9ERV9FTkFCTEUgfCB0cC0+Y29hbGVzY2VfbW9kZSk7CisKKwl0dzMyKFJDVkNDX01PREUsIFJDVkNDX01PREVfRU5BQkxFIHwgUkNWQ0NfTU9ERV9BVFROX0VOQUJMRSk7CisJdHczMihSQ1ZMUENfTU9ERSwgUkNWTFBDX01PREVfRU5BQkxFKTsKKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykpCisJCXR3MzIoUkNWTFNDX01PREUsIFJDVkxTQ19NT0RFX0VOQUJMRSB8IFJDVkxTQ19NT0RFX0FUVE5fRU5BQkxFKTsKKworCS8qIENsZWFyIHN0YXRpc3RpY3Mvc3RhdHVzIGJsb2NrIGluIGNoaXAsIGFuZCBzdGF0dXMgYmxvY2sgaW4gcmFtLiAqLworCWZvciAoaSA9IE5JQ19TUkFNX1NUQVRTX0JMSzsKKwkgICAgIGkgPCBOSUNfU1JBTV9TVEFUVVNfQkxLICsgVEczX0hXX1NUQVRVU19TSVpFOworCSAgICAgaSArPSBzaXplb2YodTMyKSkgeworCQl0ZzNfd3JpdGVfbWVtKHRwLCBpLCAwKTsKKwkJdWRlbGF5KDQwKTsKKwl9CisJbWVtc2V0KHRwLT5od19zdGF0dXMsIDAsIFRHM19IV19TVEFUVVNfU0laRSk7CisKKwl0cC0+bWFjX21vZGUgPSBNQUNfTU9ERV9UWFNUQVRfRU5BQkxFIHwgTUFDX01PREVfUlhTVEFUX0VOQUJMRSB8CisJCU1BQ19NT0RFX1RERV9FTkFCTEUgfCBNQUNfTU9ERV9SREVfRU5BQkxFIHwgTUFDX01PREVfRkhERV9FTkFCTEU7CisJdHczMl9mKE1BQ19NT0RFLCB0cC0+bWFjX21vZGUgfCBNQUNfTU9ERV9SWFNUQVRfQ0xFQVIgfCBNQUNfTU9ERV9UWFNUQVRfQ0xFQVIpOworCXVkZWxheSg0MCk7CisKKwl0cC0+Z3JjX2xvY2FsX2N0cmwgPSBHUkNfTENMQ1RSTF9JTlRfT05fQVRUTiB8IEdSQ19MQ0xDVFJMX0FVVE9fU0VFUFJPTTsKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDApCisJCXRwLT5ncmNfbG9jYWxfY3RybCB8PSAoR1JDX0xDTENUUkxfR1BJT19PRTEgfAorCQkJCSAgICAgICBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDEpOworCXR3MzJfZihHUkNfTE9DQUxfQ1RSTCwgdHAtPmdyY19sb2NhbF9jdHJsKTsKKwl1ZGVsYXkoMTAwKTsKKworCXR3MzJfbWFpbGJveChNQUlMQk9YX0lOVEVSUlVQVF8wICsgVEczXzY0QklUX1JFR19MT1csIDApOworCXRyMzIoTUFJTEJPWF9JTlRFUlJVUFRfMCk7CisKKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyXzU3MDVfUExVUykpIHsKKwkJdHczMl9mKERNQUNfTU9ERSwgRE1BQ19NT0RFX0VOQUJMRSk7CisJCXVkZWxheSg0MCk7CisJfQorCisJdmFsID0gKFdETUFDX01PREVfRU5BQkxFIHwgV0RNQUNfTU9ERV9UR1RBQk9SVF9FTkFCIHwKKwkgICAgICAgV0RNQUNfTU9ERV9NU1RBQk9SVF9FTkFCIHwgV0RNQUNfTU9ERV9QQVJJVFlFUlJfRU5BQiB8CisJICAgICAgIFdETUFDX01PREVfQUREUk9GTE9XX0VOQUIgfCBXRE1BQ19NT0RFX0ZJRk9PRkxPV19FTkFCIHwKKwkgICAgICAgV0RNQUNfTU9ERV9GSUZPVVJVTl9FTkFCIHwgV0RNQUNfTU9ERV9GSUZPT1JFQURfRU5BQiB8CisJICAgICAgIFdETUFDX01PREVfTE5HUkVBRF9FTkFCKTsKKworCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUgJiYKKwkgICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgIT0gQ0hJUFJFVl9JRF81NzA1X0EwKSB8fAorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc1MCkgeworCQlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxHMl9UU09fQ0FQQUJMRSkgJiYKKwkJICAgICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwNV9BMSB8fAorCQkgICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzA1X0EyKSkgeworCQkJLyogbm90aGluZyAqLworCQl9IGVsc2UgaWYgKCEodHIzMihURzNQQ0lfUENJU1RBVEUpICYgUENJU1RBVEVfQlVTX1NQRUVEX0hJR0gpICYmCisJCQkgICAhKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSVNfNTc4OCkgJiYKKwkJCSAgICEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QQ0lfRVhQUkVTUykpIHsKKwkJCXZhbCB8PSBXRE1BQ19NT0RFX1JYX0FDQ0VMOworCQl9CisJfQorCisJdHczMl9mKFdETUFDX01PREUsIHZhbCk7CisJdWRlbGF5KDQwKTsKKworCWlmICgodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSVhfTU9ERSkgIT0gMCkgeworCQl2YWwgPSB0cjMyKFRHM1BDSV9YX0NBUFMpOworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMpIHsKKwkJCXZhbCAmPSB+UENJWF9DQVBTX0JVUlNUX01BU0s7CisJCQl2YWwgfD0gKFBDSVhfQ0FQU19NQVhfQlVSU1RfQ1BJT0IgPDwgUENJWF9DQVBTX0JVUlNUX1NISUZUKTsKKwkJfSBlbHNlIGlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCkgeworCQkJdmFsICY9IH4oUENJWF9DQVBTX1NQTElUX01BU0sgfCBQQ0lYX0NBUFNfQlVSU1RfTUFTSyk7CisJCQl2YWwgfD0gKFBDSVhfQ0FQU19NQVhfQlVSU1RfQ1BJT0IgPDwgUENJWF9DQVBTX0JVUlNUX1NISUZUKTsKKwkJCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfU1BMSVRfTU9ERSkKKwkJCQl2YWwgfD0gKHRwLT5zcGxpdF9tb2RlX21heF9yZXFzIDw8CisJCQkJCVBDSVhfQ0FQU19TUExJVF9TSElGVCk7CisJCX0KKwkJdHczMihURzNQQ0lfWF9DQVBTLCB2YWwpOworCX0KKworCXR3MzJfZihSRE1BQ19NT0RFLCByZG1hY19tb2RlKTsKKwl1ZGVsYXkoNDApOworCisJdHczMihSQ1ZEQ0NfTU9ERSwgUkNWRENDX01PREVfRU5BQkxFIHwgUkNWRENDX01PREVfQVRUTl9FTkFCTEUpOworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKSkKKwkJdHczMihNQkZSRUVfTU9ERSwgTUJGUkVFX01PREVfRU5BQkxFKTsKKwl0dzMyKFNORERBVEFDX01PREUsIFNORERBVEFDX01PREVfRU5BQkxFKTsKKwl0dzMyKFNOREJEQ19NT0RFLCBTTkRCRENfTU9ERV9FTkFCTEUgfCBTTkRCRENfTU9ERV9BVFROX0VOQUJMRSk7CisJdHczMihSQ1ZCRElfTU9ERSwgUkNWQkRJX01PREVfRU5BQkxFIHwgUkNWQkRJX01PREVfUkNCX0FUVE5fRU5BQik7CisJdHczMihSQ1ZEQkRJX01PREUsIFJDVkRCRElfTU9ERV9FTkFCTEUgfCBSQ1ZEQkRJX01PREVfSU5WX1JJTkdfU1opOworCXR3MzIoU05EREFUQUlfTU9ERSwgU05EREFUQUlfTU9ERV9FTkFCTEUpOworI2lmIFRHM19UU09fU1VQUE9SVCAhPSAwCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSFdfVFNPKQorCQl0dzMyKFNORERBVEFJX01PREUsIFNORERBVEFJX01PREVfRU5BQkxFIHwgMHg4KTsKKyNlbmRpZgorCXR3MzIoU05EQkRJX01PREUsIFNOREJESV9NT0RFX0VOQUJMRSB8IFNOREJESV9NT0RFX0FUVE5fRU5BQkxFKTsKKwl0dzMyKFNOREJEU19NT0RFLCBTTkRCRFNfTU9ERV9FTkFCTEUgfCBTTkRCRFNfTU9ERV9BVFROX0VOQUJMRSk7CisKKwlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDFfQTApIHsKKwkJZXJyID0gdGczX2xvYWRfNTcwMV9hMF9maXJtd2FyZV9maXgodHApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKyNpZiBURzNfVFNPX1NVUFBPUlQgIT0gMAorCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1RTT19DQVBBQkxFKSB7CisJCWVyciA9IHRnM19sb2FkX3Rzb19maXJtd2FyZSh0cCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKyNlbmRpZgorCisJdHAtPnR4X21vZGUgPSBUWF9NT0RFX0VOQUJMRTsKKwl0dzMyX2YoTUFDX1RYX01PREUsIHRwLT50eF9tb2RlKTsKKwl1ZGVsYXkoMTAwKTsKKworCXRwLT5yeF9tb2RlID0gUlhfTU9ERV9FTkFCTEU7CisJdHczMl9mKE1BQ19SWF9NT0RFLCB0cC0+cnhfbW9kZSk7CisJdWRlbGF5KDEwKTsKKworCWlmICh0cC0+bGlua19jb25maWcucGh5X2lzX2xvd19wb3dlcikgeworCQl0cC0+bGlua19jb25maWcucGh5X2lzX2xvd19wb3dlciA9IDA7CisJCXRwLT5saW5rX2NvbmZpZy5zcGVlZCA9IHRwLT5saW5rX2NvbmZpZy5vcmlnX3NwZWVkOworCQl0cC0+bGlua19jb25maWcuZHVwbGV4ID0gdHAtPmxpbmtfY29uZmlnLm9yaWdfZHVwbGV4OworCQl0cC0+bGlua19jb25maWcuYXV0b25lZyA9IHRwLT5saW5rX2NvbmZpZy5vcmlnX2F1dG9uZWc7CisJfQorCisJdHAtPm1pX21vZGUgPSBNQUNfTUlfTU9ERV9CQVNFOworCXR3MzJfZihNQUNfTUlfTU9ERSwgdHAtPm1pX21vZGUpOworCXVkZWxheSg4MCk7CisKKwl0dzMyKE1BQ19MRURfQ1RSTCwgdHAtPmxlZF9jdHJsKTsKKworCXR3MzIoTUFDX01JX1NUQVQsIE1BQ19NSV9TVEFUX0xOS1NUQVRfQVRUTl9FTkFCKTsKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKSB7CisJCXR3MzJfZihNQUNfUlhfTU9ERSwgUlhfTU9ERV9SRVNFVCk7CisJCXVkZWxheSgxMCk7CisJfQorCXR3MzJfZihNQUNfUlhfTU9ERSwgdHAtPnJ4X21vZGUpOworCXVkZWxheSgxMCk7CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKSB7CisJCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQpICYmCisJCQkhKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfU0VSREVTX1BSRUVNUEhBU0lTKSkgeworCQkJLyogU2V0IGRyaXZlIHRyYW5zbWlzc2lvbiBsZXZlbCB0byAxLjJWICAqLworCQkJLyogb25seSBpZiB0aGUgc2lnbmFsIHByZS1lbXBoYXNpcyBiaXQgaXMgbm90IHNldCAgKi8KKwkJCXZhbCA9IHRyMzIoTUFDX1NFUkRFU19DRkcpOworCQkJdmFsICY9IDB4ZmZmZmYwMDA7CisJCQl2YWwgfD0gMHg4ODA7CisJCQl0dzMyKE1BQ19TRVJERVNfQ0ZHLCB2YWwpOworCQl9CisJCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwM19BMSkKKwkJCXR3MzIoTUFDX1NFUkRFU19DRkcsIDB4NjE2MDAwKTsKKwl9CisKKwkvKiBQcmV2ZW50IGNoaXAgZnJvbSBkcm9wcGluZyBmcmFtZXMgd2hlbiBmbG93IGNvbnRyb2wKKwkgKiBpcyBlbmFibGVkLgorCSAqLworCXR3MzJfZihNQUNfTE9XX1dNQVJLX01BWF9SWF9GUkFNRSwgMik7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQgJiYKKwkgICAgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykpIHsKKwkJLyogVXNlIGhhcmR3YXJlIGxpbmsgYXV0by1uZWdvdGlhdGlvbiAqLworCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9IV19BVVRPTkVHOworCX0KKworCWVyciA9IHRnM19zZXR1cF9waHkodHAsIDEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMpKSB7CisJCXUzMiB0bXA7CisKKwkJLyogQ2xlYXIgQ1JDIHN0YXRzLiAqLworCQlpZiAoIXRnM19yZWFkcGh5KHRwLCAweDFlLCAmdG1wKSkgeworCQkJdGczX3dyaXRlcGh5KHRwLCAweDFlLCB0bXAgfCAweDgwMDApOworCQkJdGczX3JlYWRwaHkodHAsIDB4MTQsICZ0bXApOworCQl9CisJfQorCisJX190ZzNfc2V0X3J4X21vZGUodHAtPmRldik7CisKKwkvKiBJbml0aWFsaXplIHJlY2VpdmUgcnVsZXMuICovCisJdHczMihNQUNfUkNWX1JVTEVfMCwgIDB4YzIwMDAwMDAgJiBSQ1ZfUlVMRV9ESVNBQkxFX01BU0spOworCXR3MzIoTUFDX1JDVl9WQUxVRV8wLCAweGZmZmZmZmZmICYgUkNWX1JVTEVfRElTQUJMRV9NQVNLKTsKKwl0dzMyKE1BQ19SQ1ZfUlVMRV8xLCAgMHg4NjAwMDAwNCAmIFJDVl9SVUxFX0RJU0FCTEVfTUFTSyk7CisJdHczMihNQUNfUkNWX1ZBTFVFXzEsIDB4ZmZmZmZmZmYgJiBSQ1ZfUlVMRV9ESVNBQkxFX01BU0spOworCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKQorCQlsaW1pdCA9IDg7CisJZWxzZQorCQlsaW1pdCA9IDE2OworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRU5BQkxFX0FTRikKKwkJbGltaXQgLT0gNDsKKwlzd2l0Y2ggKGxpbWl0KSB7CisJY2FzZSAxNjoKKwkJdHczMihNQUNfUkNWX1JVTEVfMTUsICAwKTsgdHczMihNQUNfUkNWX1ZBTFVFXzE1LCAgMCk7CisJY2FzZSAxNToKKwkJdHczMihNQUNfUkNWX1JVTEVfMTQsICAwKTsgdHczMihNQUNfUkNWX1ZBTFVFXzE0LCAgMCk7CisJY2FzZSAxNDoKKwkJdHczMihNQUNfUkNWX1JVTEVfMTMsICAwKTsgdHczMihNQUNfUkNWX1ZBTFVFXzEzLCAgMCk7CisJY2FzZSAxMzoKKwkJdHczMihNQUNfUkNWX1JVTEVfMTIsICAwKTsgdHczMihNQUNfUkNWX1ZBTFVFXzEyLCAgMCk7CisJY2FzZSAxMjoKKwkJdHczMihNQUNfUkNWX1JVTEVfMTEsICAwKTsgdHczMihNQUNfUkNWX1ZBTFVFXzExLCAgMCk7CisJY2FzZSAxMToKKwkJdHczMihNQUNfUkNWX1JVTEVfMTAsICAwKTsgdHczMihNQUNfUkNWX1ZBTFVFXzEwLCAgMCk7CisJY2FzZSAxMDoKKwkJdHczMihNQUNfUkNWX1JVTEVfOSwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfOSwgIDApOworCWNhc2UgOToKKwkJdHczMihNQUNfUkNWX1JVTEVfOCwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfOCwgIDApOworCWNhc2UgODoKKwkJdHczMihNQUNfUkNWX1JVTEVfNywgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfNywgIDApOworCWNhc2UgNzoKKwkJdHczMihNQUNfUkNWX1JVTEVfNiwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfNiwgIDApOworCWNhc2UgNjoKKwkJdHczMihNQUNfUkNWX1JVTEVfNSwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfNSwgIDApOworCWNhc2UgNToKKwkJdHczMihNQUNfUkNWX1JVTEVfNCwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfNCwgIDApOworCWNhc2UgNDoKKwkJLyogdHczMihNQUNfUkNWX1JVTEVfMywgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfMywgIDApOyAqLworCWNhc2UgMzoKKwkJLyogdHczMihNQUNfUkNWX1JVTEVfMiwgIDApOyB0dzMyKE1BQ19SQ1ZfVkFMVUVfMiwgIDApOyAqLworCWNhc2UgMjoKKwljYXNlIDE6CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9OworCisJdGczX3dyaXRlX3NpZ19wb3N0X3Jlc2V0KHRwLCBSRVNFVF9LSU5EX0lOSVQpOworCisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19JTklUX0NPTVBMRVRFKQorCQl0ZzNfZW5hYmxlX2ludHModHApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCBhdCBkZXZpY2Ugb3BlbiB0aW1lIHRvIGdldCB0aGUgY2hpcCByZWFkeSBmb3IKKyAqIHBhY2tldCBwcm9jZXNzaW5nLiAgSW52b2tlZCB3aXRoIHRwLT5sb2NrIGhlbGQuCisgKi8KK3N0YXRpYyBpbnQgdGczX2luaXRfaHcoc3RydWN0IHRnMyAqdHApCit7CisJaW50IGVycjsKKworCS8qIEZvcmNlIHRoZSBjaGlwIGludG8gRDAuICovCisJZXJyID0gdGczX3NldF9wb3dlcl9zdGF0ZSh0cCwgMCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwl0ZzNfc3dpdGNoX2Nsb2Nrcyh0cCk7CisKKwl0dzMyKFRHM1BDSV9NRU1fV0lOX0JBU0VfQUREUiwgMCk7CisKKwllcnIgPSB0ZzNfcmVzZXRfaHcodHApOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworI2RlZmluZSBURzNfU1RBVF9BREQzMihQU1RBVCwgUkVHKSBcCitkbyB7CXUzMiBfX3ZhbCA9IHRyMzIoUkVHKTsgXAorCShQU1RBVCktPmxvdyArPSBfX3ZhbDsgXAorCWlmICgoUFNUQVQpLT5sb3cgPCBfX3ZhbCkgXAorCQkoUFNUQVQpLT5oaWdoICs9IDE7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIHRnM19wZXJpb2RpY19mZXRjaF9zdGF0cyhzdHJ1Y3QgdGczICp0cCkKK3sKKwlzdHJ1Y3QgdGczX2h3X3N0YXRzICpzcCA9IHRwLT5od19zdGF0czsKKworCWlmICghbmV0aWZfY2Fycmllcl9vayh0cC0+ZGV2KSkKKwkJcmV0dXJuOworCisJVEczX1NUQVRfQUREMzIoJnNwLT50eF9vY3RldHMsIE1BQ19UWF9TVEFUU19PQ1RFVFMpOworCVRHM19TVEFUX0FERDMyKCZzcC0+dHhfY29sbGlzaW9ucywgTUFDX1RYX1NUQVRTX0NPTExJU0lPTlMpOworCVRHM19TVEFUX0FERDMyKCZzcC0+dHhfeG9uX3NlbnQsIE1BQ19UWF9TVEFUU19YT05fU0VOVCk7CisJVEczX1NUQVRfQUREMzIoJnNwLT50eF94b2ZmX3NlbnQsIE1BQ19UWF9TVEFUU19YT0ZGX1NFTlQpOworCVRHM19TVEFUX0FERDMyKCZzcC0+dHhfbWFjX2Vycm9ycywgTUFDX1RYX1NUQVRTX01BQ19FUlJPUlMpOworCVRHM19TVEFUX0FERDMyKCZzcC0+dHhfc2luZ2xlX2NvbGxpc2lvbnMsIE1BQ19UWF9TVEFUU19TSU5HTEVfQ09MTElTSU9OUyk7CisJVEczX1NUQVRfQUREMzIoJnNwLT50eF9tdWx0X2NvbGxpc2lvbnMsIE1BQ19UWF9TVEFUU19NVUxUX0NPTExJU0lPTlMpOworCVRHM19TVEFUX0FERDMyKCZzcC0+dHhfZGVmZXJyZWQsIE1BQ19UWF9TVEFUU19ERUZFUlJFRCk7CisJVEczX1NUQVRfQUREMzIoJnNwLT50eF9leGNlc3NpdmVfY29sbGlzaW9ucywgTUFDX1RYX1NUQVRTX0VYQ0VTU0lWRV9DT0wpOworCVRHM19TVEFUX0FERDMyKCZzcC0+dHhfbGF0ZV9jb2xsaXNpb25zLCBNQUNfVFhfU1RBVFNfTEFURV9DT0wpOworCVRHM19TVEFUX0FERDMyKCZzcC0+dHhfdWNhc3RfcGFja2V0cywgTUFDX1RYX1NUQVRTX1VDQVNUKTsKKwlURzNfU1RBVF9BREQzMigmc3AtPnR4X21jYXN0X3BhY2tldHMsIE1BQ19UWF9TVEFUU19NQ0FTVCk7CisJVEczX1NUQVRfQUREMzIoJnNwLT50eF9iY2FzdF9wYWNrZXRzLCBNQUNfVFhfU1RBVFNfQkNBU1QpOworCisJVEczX1NUQVRfQUREMzIoJnNwLT5yeF9vY3RldHMsIE1BQ19SWF9TVEFUU19PQ1RFVFMpOworCVRHM19TVEFUX0FERDMyKCZzcC0+cnhfZnJhZ21lbnRzLCBNQUNfUlhfU1RBVFNfRlJBR01FTlRTKTsKKwlURzNfU1RBVF9BREQzMigmc3AtPnJ4X3VjYXN0X3BhY2tldHMsIE1BQ19SWF9TVEFUU19VQ0FTVCk7CisJVEczX1NUQVRfQUREMzIoJnNwLT5yeF9tY2FzdF9wYWNrZXRzLCBNQUNfUlhfU1RBVFNfTUNBU1QpOworCVRHM19TVEFUX0FERDMyKCZzcC0+cnhfYmNhc3RfcGFja2V0cywgTUFDX1JYX1NUQVRTX0JDQVNUKTsKKwlURzNfU1RBVF9BREQzMigmc3AtPnJ4X2Zjc19lcnJvcnMsIE1BQ19SWF9TVEFUU19GQ1NfRVJST1JTKTsKKwlURzNfU1RBVF9BREQzMigmc3AtPnJ4X2FsaWduX2Vycm9ycywgTUFDX1JYX1NUQVRTX0FMSUdOX0VSUk9SUyk7CisJVEczX1NUQVRfQUREMzIoJnNwLT5yeF94b25fcGF1c2VfcmN2ZCwgTUFDX1JYX1NUQVRTX1hPTl9QQVVTRV9SRUNWRCk7CisJVEczX1NUQVRfQUREMzIoJnNwLT5yeF94b2ZmX3BhdXNlX3JjdmQsIE1BQ19SWF9TVEFUU19YT0ZGX1BBVVNFX1JFQ1ZEKTsKKwlURzNfU1RBVF9BREQzMigmc3AtPnJ4X21hY19jdHJsX3JjdmQsIE1BQ19SWF9TVEFUU19NQUNfQ1RSTF9SRUNWRCk7CisJVEczX1NUQVRfQUREMzIoJnNwLT5yeF94b2ZmX2VudGVyZWQsIE1BQ19SWF9TVEFUU19YT0ZGX0VOVEVSRUQpOworCVRHM19TVEFUX0FERDMyKCZzcC0+cnhfZnJhbWVfdG9vX2xvbmdfZXJyb3JzLCBNQUNfUlhfU1RBVFNfRlJBTUVfVE9PX0xPTkcpOworCVRHM19TVEFUX0FERDMyKCZzcC0+cnhfamFiYmVycywgTUFDX1JYX1NUQVRTX0pBQkJFUlMpOworCVRHM19TVEFUX0FERDMyKCZzcC0+cnhfdW5kZXJzaXplX3BhY2tldHMsIE1BQ19SWF9TVEFUU19VTkRFUlNJWkUpOworfQorCitzdGF0aWMgdm9pZCB0ZzNfdGltZXIodW5zaWduZWQgbG9uZyBfX29wYXF1ZSkKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IChzdHJ1Y3QgdGczICopIF9fb3BhcXVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKworCS8qIEFsbCBvZiB0aGlzIGdhcmJhZ2UgaXMgYmVjYXVzZSB3aGVuIHVzaW5nIG5vbi10YWdnZWQKKwkgKiBJUlEgc3RhdHVzIHRoZSBtYWlsYm94L3N0YXR1c19ibG9jayBwcm90b2NvbCB0aGUgY2hpcAorCSAqIHVzZXMgd2l0aCB0aGUgY3B1IGlzIHJhY2UgcHJvbmUuCisJICovCisJaWYgKHRwLT5od19zdGF0dXMtPnN0YXR1cyAmIFNEX1NUQVRVU19VUERBVEVEKSB7CisJCXR3MzIoR1JDX0xPQ0FMX0NUUkwsCisJCSAgICAgdHAtPmdyY19sb2NhbF9jdHJsIHwgR1JDX0xDTENUUkxfU0VUSU5UKTsKKwl9IGVsc2UgeworCQl0dzMyKEhPU1RDQ19NT0RFLCB0cC0+Y29hbGVzY2VfbW9kZSB8CisJCSAgICAgKEhPU1RDQ19NT0RFX0VOQUJMRSB8IEhPU1RDQ19NT0RFX05PVykpOworCX0KKworCWlmICghKHRyMzIoV0RNQUNfTU9ERSkgJiBXRE1BQ19NT0RFX0VOQUJMRSkpIHsKKwkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfUkVTVEFSVF9USU1FUjsKKwkJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKKwkJc2NoZWR1bGVfd29yaygmdHAtPnJlc2V0X3Rhc2spOworCQlyZXR1cm47CisJfQorCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKQorCQl0ZzNfcGVyaW9kaWNfZmV0Y2hfc3RhdHModHApOworCisJLyogVGhpcyBwYXJ0IG9ubHkgcnVucyBvbmNlIHBlciBzZWNvbmQuICovCisJaWYgKCEtLXRwLT50aW1lcl9jb3VudGVyKSB7CisJCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfVVNFX0xJTktDSEdfUkVHKSB7CisJCQl1MzIgbWFjX3N0YXQ7CisJCQlpbnQgcGh5X2V2ZW50OworCisJCQltYWNfc3RhdCA9IHRyMzIoTUFDX1NUQVRVUyk7CisKKwkJCXBoeV9ldmVudCA9IDA7CisJCQlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1VTRV9NSV9JTlRFUlJVUFQpIHsKKwkJCQlpZiAobWFjX3N0YXQgJiBNQUNfU1RBVFVTX01JX0lOVEVSUlVQVCkKKwkJCQkJcGh5X2V2ZW50ID0gMTsKKwkJCX0gZWxzZSBpZiAobWFjX3N0YXQgJiBNQUNfU1RBVFVTX0xOS1NUQVRFX0NIQU5HRUQpCisJCQkJcGh5X2V2ZW50ID0gMTsKKworCQkJaWYgKHBoeV9ldmVudCkKKwkJCQl0ZzNfc2V0dXBfcGh5KHRwLCAwKTsKKwkJfSBlbHNlIGlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUE9MTF9TRVJERVMpIHsKKwkJCXUzMiBtYWNfc3RhdCA9IHRyMzIoTUFDX1NUQVRVUyk7CisJCQlpbnQgbmVlZF9zZXR1cCA9IDA7CisKKwkJCWlmIChuZXRpZl9jYXJyaWVyX29rKHRwLT5kZXYpICYmCisJCQkgICAgKG1hY19zdGF0ICYgTUFDX1NUQVRVU19MTktTVEFURV9DSEFOR0VEKSkgeworCQkJCW5lZWRfc2V0dXAgPSAxOworCQkJfQorCQkJaWYgKCEgbmV0aWZfY2Fycmllcl9vayh0cC0+ZGV2KSAmJgorCQkJICAgIChtYWNfc3RhdCAmIChNQUNfU1RBVFVTX1BDU19TWU5DRUQgfAorCQkJCQkgTUFDX1NUQVRVU19TSUdOQUxfREVUKSkpIHsKKwkJCQluZWVkX3NldHVwID0gMTsKKwkJCX0KKwkJCWlmIChuZWVkX3NldHVwKSB7CisJCQkJdHczMl9mKE1BQ19NT0RFLAorCQkJCSAgICAgKHRwLT5tYWNfbW9kZSAmCisJCQkJICAgICAgfk1BQ19NT0RFX1BPUlRfTU9ERV9NQVNLKSk7CisJCQkJdWRlbGF5KDQwKTsKKwkJCQl0dzMyX2YoTUFDX01PREUsIHRwLT5tYWNfbW9kZSk7CisJCQkJdWRlbGF5KDQwKTsKKwkJCQl0ZzNfc2V0dXBfcGh5KHRwLCAwKTsKKwkJCX0KKwkJfQorCisJCXRwLT50aW1lcl9jb3VudGVyID0gdHAtPnRpbWVyX211bHRpcGxpZXI7CisJfQorCisJLyogSGVhcnRiZWF0IGlzIG9ubHkgc2VudCBvbmNlIGV2ZXJ5IDEyMCBzZWNvbmRzLiAgKi8KKwlpZiAoIS0tdHAtPmFzZl9jb3VudGVyKSB7CisJCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRU5BQkxFX0FTRikgeworCQkJdTMyIHZhbDsKKworCQkJdGczX3dyaXRlX21lbSh0cCwgTklDX1NSQU1fRldfQ01EX01CT1gsIEZXQ01EX05JQ0RSVl9BTElWRSk7CisJCQl0ZzNfd3JpdGVfbWVtKHRwLCBOSUNfU1JBTV9GV19DTURfTEVOX01CT1gsIDQpOworCQkJdGczX3dyaXRlX21lbSh0cCwgTklDX1NSQU1fRldfQ01EX0RBVEFfTUJPWCwgMyk7CisJCQl2YWwgPSB0cjMyKEdSQ19SWF9DUFVfRVZFTlQpOworCQkJdmFsIHw9ICgxIDw8IDE0KTsKKwkJCXR3MzIoR1JDX1JYX0NQVV9FVkVOVCwgdmFsKTsKKwkJfQorCQl0cC0+YXNmX2NvdW50ZXIgPSB0cC0+YXNmX211bHRpcGxpZXI7CisJfQorCisJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJdHAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgdHAtPnRpbWVyX29mZnNldDsKKwlhZGRfdGltZXIoJnRwLT50aW1lcik7Cit9CisKK3N0YXRpYyBpbnQgdGczX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKworCXRnM19kaXNhYmxlX2ludHModHApOworCXRwLT50ZzNfZmxhZ3MgJj0gflRHM19GTEFHX0lOSVRfQ09NUExFVEU7CisKKwlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCisJLyogVGhlIHBsYWNlbWVudCBvZiB0aGlzIGNhbGwgaXMgdGllZAorCSAqIHRvIHRoZSBzZXR1cCBhbmQgdXNlIG9mIEhvc3QgVFggZGVzY3JpcHRvcnMuCisJICovCisJZXJyID0gdGczX2FsbG9jX2NvbnNpc3RlbnQodHApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgdGczX2ludGVycnVwdCwKKwkJCSAgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKKworCWlmIChlcnIpIHsKKwkJdGczX2ZyZWVfY29uc2lzdGVudCh0cCk7CisJCXJldHVybiBlcnI7CisJfQorCisJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCisJZXJyID0gdGczX2luaXRfaHcodHApOworCWlmIChlcnIpIHsKKwkJdGczX2hhbHQodHApOworCQl0ZzNfZnJlZV9yaW5ncyh0cCk7CisJfSBlbHNlIHsKKwkJdHAtPnRpbWVyX29mZnNldCA9IEhaIC8gMTA7CisJCXRwLT50aW1lcl9jb3VudGVyID0gdHAtPnRpbWVyX211bHRpcGxpZXIgPSAxMDsKKwkJdHAtPmFzZl9jb3VudGVyID0gdHAtPmFzZl9tdWx0aXBsaWVyID0gKDEwICogMTIwKTsKKworCQlpbml0X3RpbWVyKCZ0cC0+dGltZXIpOworCQl0cC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyB0cC0+dGltZXJfb2Zmc2V0OworCQl0cC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB0cDsKKwkJdHAtPnRpbWVyLmZ1bmN0aW9uID0gdGczX3RpbWVyOworCQlhZGRfdGltZXIoJnRwLT50aW1lcik7CisKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19JTklUX0NPTVBMRVRFOworCX0KKworCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisKKwlpZiAoZXJyKSB7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQl0ZzNfZnJlZV9jb25zaXN0ZW50KHRwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisKKwl0ZzNfZW5hYmxlX2ludHModHApOworCisJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworI2lmIDAKKy8qc3RhdGljKi8gdm9pZCB0ZzNfZHVtcF9zdGF0ZShzdHJ1Y3QgdGczICp0cCkKK3sKKwl1MzIgdmFsMzIsIHZhbDMyXzIsIHZhbDMyXzMsIHZhbDMyXzQsIHZhbDMyXzU7CisJdTE2IHZhbDE2OworCWludCBpOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQodHAtPnBkZXYsIFBDSV9TVEFUVVMsICZ2YWwxNik7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfUENJU1RBVEUsICZ2YWwzMik7CisJcHJpbnRrKCJERUJVRzogUENJIHN0YXR1cyBbJTA0eF0gVEczUENJIHN0YXRlWyUwOHhdXG4iLAorCSAgICAgICB2YWwxNiwgdmFsMzIpOworCisJLyogTUFDIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogTUFDX01PREVbJTA4eF0gTUFDX1NUQVRVU1slMDh4XVxuIiwKKwkgICAgICAgdHIzMihNQUNfTU9ERSksIHRyMzIoTUFDX1NUQVRVUykpOworCXByaW50aygiICAgICAgIE1BQ19FVkVOVFslMDh4XSBNQUNfTEVEX0NUUkxbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoTUFDX0VWRU5UKSwgdHIzMihNQUNfTEVEX0NUUkwpKTsKKwlwcmludGsoIkRFQlVHOiBNQUNfVFhfTU9ERVslMDh4XSBNQUNfVFhfU1RBVFVTWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKE1BQ19UWF9NT0RFKSwgdHIzMihNQUNfVFhfU1RBVFVTKSk7CisJcHJpbnRrKCIgICAgICAgTUFDX1JYX01PREVbJTA4eF0gTUFDX1JYX1NUQVRVU1slMDh4XVxuIiwKKwkgICAgICAgdHIzMihNQUNfUlhfTU9ERSksIHRyMzIoTUFDX1JYX1NUQVRVUykpOworCisJLyogU2VuZCBkYXRhIGluaXRpYXRvciBjb250cm9sIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogU05EREFUQUlfTU9ERVslMDh4XSBTTkREQVRBSV9TVEFUVVNbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoU05EREFUQUlfTU9ERSksIHRyMzIoU05EREFUQUlfU1RBVFVTKSk7CisJcHJpbnRrKCIgICAgICAgU05EREFUQUlfU1RBVFNDVFJMWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKFNORERBVEFJX1NUQVRTQ1RSTCkpOworCisJLyogU2VuZCBkYXRhIGNvbXBsZXRpb24gY29udHJvbCBibG9jayAqLworCXByaW50aygiREVCVUc6IFNORERBVEFDX01PREVbJTA4eF1cbiIsIHRyMzIoU05EREFUQUNfTU9ERSkpOworCisJLyogU2VuZCBCRCByaW5nIHNlbGVjdG9yIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogU05EQkRTX01PREVbJTA4eF0gU05EQkRTX1NUQVRVU1slMDh4XVxuIiwKKwkgICAgICAgdHIzMihTTkRCRFNfTU9ERSksIHRyMzIoU05EQkRTX1NUQVRVUykpOworCisJLyogU2VuZCBCRCBpbml0aWF0b3IgY29udHJvbCBibG9jayAqLworCXByaW50aygiREVCVUc6IFNOREJESV9NT0RFWyUwOHhdIFNOREJESV9TVEFUVVNbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoU05EQkRJX01PREUpLCB0cjMyKFNOREJESV9TVEFUVVMpKTsKKworCS8qIFNlbmQgQkQgY29tcGxldGlvbiBjb250cm9sIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogU05EQkRDX01PREVbJTA4eF1cbiIsIHRyMzIoU05EQkRDX01PREUpKTsKKworCS8qIFJlY2VpdmUgbGlzdCBwbGFjZW1lbnQgY29udHJvbCBibG9jayAqLworCXByaW50aygiREVCVUc6IFJDVkxQQ19NT0RFWyUwOHhdIFJDVkxQQ19TVEFUVVNbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoUkNWTFBDX01PREUpLCB0cjMyKFJDVkxQQ19TVEFUVVMpKTsKKwlwcmludGsoIiAgICAgICBSQ1ZMUENfU1RBVFNDVFJMWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKFJDVkxQQ19TVEFUU0NUUkwpKTsKKworCS8qIFJlY2VpdmUgZGF0YSBhbmQgcmVjZWl2ZSBCRCBpbml0aWF0b3IgY29udHJvbCBibG9jayAqLworCXByaW50aygiREVCVUc6IFJDVkRCRElfTU9ERVslMDh4XSBSQ1ZEQkRJX1NUQVRVU1slMDh4XVxuIiwKKwkgICAgICAgdHIzMihSQ1ZEQkRJX01PREUpLCB0cjMyKFJDVkRCRElfU1RBVFVTKSk7CisKKwkvKiBSZWNlaXZlIGRhdGEgY29tcGxldGlvbiBjb250cm9sIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogUkNWRENDX01PREVbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoUkNWRENDX01PREUpKTsKKworCS8qIFJlY2VpdmUgQkQgaW5pdGlhdG9yIGNvbnRyb2wgYmxvY2sgKi8KKwlwcmludGsoIkRFQlVHOiBSQ1ZCRElfTU9ERVslMDh4XSBSQ1ZCRElfU1RBVFVTWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKFJDVkJESV9NT0RFKSwgdHIzMihSQ1ZCRElfU1RBVFVTKSk7CisKKwkvKiBSZWNlaXZlIEJEIGNvbXBsZXRpb24gY29udHJvbCBibG9jayAqLworCXByaW50aygiREVCVUc6IFJDVkNDX01PREVbJTA4eF0gUkNWQ0NfU1RBVFVTWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKFJDVkNDX01PREUpLCB0cjMyKFJDVkNDX1NUQVRVUykpOworCisJLyogUmVjZWl2ZSBsaXN0IHNlbGVjdG9yIGNvbnRyb2wgYmxvY2sgKi8KKwlwcmludGsoIkRFQlVHOiBSQ1ZMU0NfTU9ERVslMDh4XSBSQ1ZMU0NfU1RBVFVTWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKFJDVkxTQ19NT0RFKSwgdHIzMihSQ1ZMU0NfU1RBVFVTKSk7CisKKwkvKiBNYnVmIGNsdXN0ZXIgZnJlZSBibG9jayAqLworCXByaW50aygiREVCVUc6IE1CRlJFRV9NT0RFWyUwOHhdIE1CRlJFRV9TVEFUVVNbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoTUJGUkVFX01PREUpLCB0cjMyKE1CRlJFRV9TVEFUVVMpKTsKKworCS8qIEhvc3QgY29hbGVzY2luZyBjb250cm9sIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogSE9TVENDX01PREVbJTA4eF0gSE9TVENDX1NUQVRVU1slMDh4XVxuIiwKKwkgICAgICAgdHIzMihIT1NUQ0NfTU9ERSksIHRyMzIoSE9TVENDX1NUQVRVUykpOworCXByaW50aygiREVCVUc6IEhPU1RDQ19TVEFUU19CTEtfSE9TVF9BRERSWyUwOHglMDh4XVxuIiwKKwkgICAgICAgdHIzMihIT1NUQ0NfU1RBVFNfQkxLX0hPU1RfQUREUiArIFRHM182NEJJVF9SRUdfSElHSCksCisJICAgICAgIHRyMzIoSE9TVENDX1NUQVRTX0JMS19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0xPVykpOworCXByaW50aygiREVCVUc6IEhPU1RDQ19TVEFUVVNfQkxLX0hPU1RfQUREUlslMDh4JTA4eF1cbiIsCisJICAgICAgIHRyMzIoSE9TVENDX1NUQVRVU19CTEtfSE9TVF9BRERSICsgVEczXzY0QklUX1JFR19ISUdIKSwKKwkgICAgICAgdHIzMihIT1NUQ0NfU1RBVFVTX0JMS19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0xPVykpOworCXByaW50aygiREVCVUc6IEhPU1RDQ19TVEFUU19CTEtfTklDX0FERFJbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoSE9TVENDX1NUQVRTX0JMS19OSUNfQUREUikpOworCXByaW50aygiREVCVUc6IEhPU1RDQ19TVEFUVVNfQkxLX05JQ19BRERSWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKEhPU1RDQ19TVEFUVVNfQkxLX05JQ19BRERSKSk7CisKKwkvKiBNZW1vcnkgYXJiaXRlciBjb250cm9sIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogTUVNQVJCX01PREVbJTA4eF0gTUVNQVJCX1NUQVRVU1slMDh4XVxuIiwKKwkgICAgICAgdHIzMihNRU1BUkJfTU9ERSksIHRyMzIoTUVNQVJCX1NUQVRVUykpOworCisJLyogQnVmZmVyIG1hbmFnZXIgY29udHJvbCBibG9jayAqLworCXByaW50aygiREVCVUc6IEJVRk1HUl9NT0RFWyUwOHhdIEJVRk1HUl9TVEFUVVNbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoQlVGTUdSX01PREUpLCB0cjMyKEJVRk1HUl9TVEFUVVMpKTsKKwlwcmludGsoIkRFQlVHOiBCVUZNR1JfTUJfUE9PTF9BRERSWyUwOHhdIEJVRk1HUl9NQl9QT09MX1NJWkVbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoQlVGTUdSX01CX1BPT0xfQUREUiksIHRyMzIoQlVGTUdSX01CX1BPT0xfU0laRSkpOworCXByaW50aygiREVCVUc6IEJVRk1HUl9ETUFfREVTQ19QT09MX0FERFJbJTA4eF0gIgorCSAgICAgICAiQlVGTUdSX0RNQV9ERVNDX1BPT0xfU0laRVslMDh4XVxuIiwKKwkgICAgICAgdHIzMihCVUZNR1JfRE1BX0RFU0NfUE9PTF9BRERSKSwKKwkgICAgICAgdHIzMihCVUZNR1JfRE1BX0RFU0NfUE9PTF9TSVpFKSk7CisKKwkvKiBSZWFkIERNQSBjb250cm9sIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogUkRNQUNfTU9ERVslMDh4XSBSRE1BQ19TVEFUVVNbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoUkRNQUNfTU9ERSksIHRyMzIoUkRNQUNfU1RBVFVTKSk7CisKKwkvKiBXcml0ZSBETUEgY29udHJvbCBibG9jayAqLworCXByaW50aygiREVCVUc6IFdETUFDX01PREVbJTA4eF0gV0RNQUNfU1RBVFVTWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKFdETUFDX01PREUpLCB0cjMyKFdETUFDX1NUQVRVUykpOworCisJLyogRE1BIGNvbXBsZXRpb24gYmxvY2sgKi8KKwlwcmludGsoIkRFQlVHOiBETUFDX01PREVbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoRE1BQ19NT0RFKSk7CisKKwkvKiBHUkMgYmxvY2sgKi8KKwlwcmludGsoIkRFQlVHOiBHUkNfTU9ERVslMDh4XSBHUkNfTUlTQ19DRkdbJTA4eF1cbiIsCisJICAgICAgIHRyMzIoR1JDX01PREUpLCB0cjMyKEdSQ19NSVNDX0NGRykpOworCXByaW50aygiREVCVUc6IEdSQ19MT0NBTF9DVFJMWyUwOHhdXG4iLAorCSAgICAgICB0cjMyKEdSQ19MT0NBTF9DVFJMKSk7CisKKwkvKiBURzNfQkRJTkZPcyAqLworCXByaW50aygiREVCVUc6IFJDVkRCRElfSlVNQk9fQkRbJTA4eCUwOHg6JTA4eDolMDh4XVxuIiwKKwkgICAgICAgdHIzMihSQ1ZEQkRJX0pVTUJPX0JEICsgMHgwKSwKKwkgICAgICAgdHIzMihSQ1ZEQkRJX0pVTUJPX0JEICsgMHg0KSwKKwkgICAgICAgdHIzMihSQ1ZEQkRJX0pVTUJPX0JEICsgMHg4KSwKKwkgICAgICAgdHIzMihSQ1ZEQkRJX0pVTUJPX0JEICsgMHhjKSk7CisJcHJpbnRrKCJERUJVRzogUkNWREJESV9TVERfQkRbJTA4eCUwOHg6JTA4eDolMDh4XVxuIiwKKwkgICAgICAgdHIzMihSQ1ZEQkRJX1NURF9CRCArIDB4MCksCisJICAgICAgIHRyMzIoUkNWREJESV9TVERfQkQgKyAweDQpLAorCSAgICAgICB0cjMyKFJDVkRCRElfU1REX0JEICsgMHg4KSwKKwkgICAgICAgdHIzMihSQ1ZEQkRJX1NURF9CRCArIDB4YykpOworCXByaW50aygiREVCVUc6IFJDVkRCRElfTUlOSV9CRFslMDh4JTA4eDolMDh4OiUwOHhdXG4iLAorCSAgICAgICB0cjMyKFJDVkRCRElfTUlOSV9CRCArIDB4MCksCisJICAgICAgIHRyMzIoUkNWREJESV9NSU5JX0JEICsgMHg0KSwKKwkgICAgICAgdHIzMihSQ1ZEQkRJX01JTklfQkQgKyAweDgpLAorCSAgICAgICB0cjMyKFJDVkRCRElfTUlOSV9CRCArIDB4YykpOworCisJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9TRU5EX1JDQiArIDB4MCwgJnZhbDMyKTsKKwl0ZzNfcmVhZF9tZW0odHAsIE5JQ19TUkFNX1NFTkRfUkNCICsgMHg0LCAmdmFsMzJfMik7CisJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9TRU5EX1JDQiArIDB4OCwgJnZhbDMyXzMpOworCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fU0VORF9SQ0IgKyAweGMsICZ2YWwzMl80KTsKKwlwcmludGsoIkRFQlVHOiBTUkFNX1NFTkRfUkNCXzBbJTA4eCUwOHg6JTA4eDolMDh4XVxuIiwKKwkgICAgICAgdmFsMzIsIHZhbDMyXzIsIHZhbDMyXzMsIHZhbDMyXzQpOworCisJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9SQ1ZfUkVUX1JDQiArIDB4MCwgJnZhbDMyKTsKKwl0ZzNfcmVhZF9tZW0odHAsIE5JQ19TUkFNX1JDVl9SRVRfUkNCICsgMHg0LCAmdmFsMzJfMik7CisJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9SQ1ZfUkVUX1JDQiArIDB4OCwgJnZhbDMyXzMpOworCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fUkNWX1JFVF9SQ0IgKyAweGMsICZ2YWwzMl80KTsKKwlwcmludGsoIkRFQlVHOiBTUkFNX1JDVl9SRVRfUkNCXzBbJTA4eCUwOHg6JTA4eDolMDh4XVxuIiwKKwkgICAgICAgdmFsMzIsIHZhbDMyXzIsIHZhbDMyXzMsIHZhbDMyXzQpOworCisJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9TVEFUVVNfQkxLICsgMHgwLCAmdmFsMzIpOworCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fU1RBVFVTX0JMSyArIDB4NCwgJnZhbDMyXzIpOworCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fU1RBVFVTX0JMSyArIDB4OCwgJnZhbDMyXzMpOworCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fU1RBVFVTX0JMSyArIDB4YywgJnZhbDMyXzQpOworCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fU1RBVFVTX0JMSyArIDB4MTAsICZ2YWwzMl81KTsKKwlwcmludGsoIkRFQlVHOiBTUkFNX1NUQVRVU19CTEtbJTA4eDolMDh4OiUwOHg6JTA4eDolMDh4XVxuIiwKKwkgICAgICAgdmFsMzIsIHZhbDMyXzIsIHZhbDMyXzMsIHZhbDMyXzQsIHZhbDMyXzUpOworCisJLyogU1cgc3RhdHVzIGJsb2NrICovCisJcHJpbnRrKCJERUJVRzogSG9zdCBzdGF0dXMgYmxvY2sgWyUwOHg6JTA4eDooJTA0eDolMDR4OiUwNHgpOiglMDR4OiUwNHgpXVxuIiwKKwkgICAgICAgdHAtPmh3X3N0YXR1cy0+c3RhdHVzLAorCSAgICAgICB0cC0+aHdfc3RhdHVzLT5zdGF0dXNfdGFnLAorCSAgICAgICB0cC0+aHdfc3RhdHVzLT5yeF9qdW1ib19jb25zdW1lciwKKwkgICAgICAgdHAtPmh3X3N0YXR1cy0+cnhfY29uc3VtZXIsCisJICAgICAgIHRwLT5od19zdGF0dXMtPnJ4X21pbmlfY29uc3VtZXIsCisJICAgICAgIHRwLT5od19zdGF0dXMtPmlkeFswXS5yeF9wcm9kdWNlciwKKwkgICAgICAgdHAtPmh3X3N0YXR1cy0+aWR4WzBdLnR4X2NvbnN1bWVyKTsKKworCS8qIFNXIHN0YXRpc3RpY3MgYmxvY2sgKi8KKwlwcmludGsoIkRFQlVHOiBIb3N0IHN0YXRpc3RpY3MgYmxvY2sgWyUwOHg6JTA4eDolMDh4OiUwOHhdXG4iLAorCSAgICAgICAoKHUzMiAqKXRwLT5od19zdGF0cylbMF0sCisJICAgICAgICgodTMyICopdHAtPmh3X3N0YXRzKVsxXSwKKwkgICAgICAgKCh1MzIgKil0cC0+aHdfc3RhdHMpWzJdLAorCSAgICAgICAoKHUzMiAqKXRwLT5od19zdGF0cylbM10pOworCisJLyogTWFpbGJveGVzICovCisJcHJpbnRrKCJERUJVRzogU05ESE9TVF9QUk9EWyUwOHglMDh4XSBTTkROSUNfUFJPRFslMDh4JTA4eF1cbiIsCisJICAgICAgIHRyMzIoTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzAgKyAweDApLAorCSAgICAgICB0cjMyKE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8wICsgMHg0KSwKKwkgICAgICAgdHIzMihNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8wICsgMHgwKSwKKwkgICAgICAgdHIzMihNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8wICsgMHg0KSk7CisKKwkvKiBOSUMgc2lkZSBzZW5kIGRlc2NyaXB0b3JzLiAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyB0eGQ7CisKKwkJdHhkID0gdHAtPnJlZ3MgKyBOSUNfU1JBTV9XSU5fQkFTRSArIE5JQ19TUkFNX1RYX0JVRkZFUl9ERVNDCisJCQkrIChpICogc2l6ZW9mKHN0cnVjdCB0ZzNfdHhfYnVmZmVyX2Rlc2MpKTsKKwkJcHJpbnRrKCJERUJVRzogTklDIFRYRCglZClbJTA4eDolMDh4OiUwOHg6JTA4eF1cbiIsCisJCSAgICAgICBpLAorCQkgICAgICAgcmVhZGwodHhkICsgMHgwKSwgcmVhZGwodHhkICsgMHg0KSwKKwkJICAgICAgIHJlYWRsKHR4ZCArIDB4OCksIHJlYWRsKHR4ZCArIDB4YykpOworCX0KKworCS8qIE5JQyBzaWRlIFJYIGRlc2NyaXB0b3JzLiAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyByeGQ7CisKKwkJcnhkID0gdHAtPnJlZ3MgKyBOSUNfU1JBTV9XSU5fQkFTRSArIE5JQ19TUkFNX1JYX0JVRkZFUl9ERVNDCisJCQkrIChpICogc2l6ZW9mKHN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MpKTsKKwkJcHJpbnRrKCJERUJVRzogTklDIFJYRF9TVEQoJWQpWzBdWyUwOHg6JTA4eDolMDh4OiUwOHhdXG4iLAorCQkgICAgICAgaSwKKwkJICAgICAgIHJlYWRsKHJ4ZCArIDB4MCksIHJlYWRsKHJ4ZCArIDB4NCksCisJCSAgICAgICByZWFkbChyeGQgKyAweDgpLCByZWFkbChyeGQgKyAweGMpKTsKKwkJcnhkICs9ICg0ICogc2l6ZW9mKHUzMikpOworCQlwcmludGsoIkRFQlVHOiBOSUMgUlhEX1NURCglZClbMV1bJTA4eDolMDh4OiUwOHg6JTA4eF1cbiIsCisJCSAgICAgICBpLAorCQkgICAgICAgcmVhZGwocnhkICsgMHgwKSwgcmVhZGwocnhkICsgMHg0KSwKKwkJICAgICAgIHJlYWRsKHJ4ZCArIDB4OCksIHJlYWRsKHJ4ZCArIDB4YykpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyByeGQ7CisKKwkJcnhkID0gdHAtPnJlZ3MgKyBOSUNfU1JBTV9XSU5fQkFTRSArIE5JQ19TUkFNX1JYX0pVTUJPX0JVRkZFUl9ERVNDCisJCQkrIChpICogc2l6ZW9mKHN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MpKTsKKwkJcHJpbnRrKCJERUJVRzogTklDIFJYRF9KVU1CTyglZClbMF1bJTA4eDolMDh4OiUwOHg6JTA4eF1cbiIsCisJCSAgICAgICBpLAorCQkgICAgICAgcmVhZGwocnhkICsgMHgwKSwgcmVhZGwocnhkICsgMHg0KSwKKwkJICAgICAgIHJlYWRsKHJ4ZCArIDB4OCksIHJlYWRsKHJ4ZCArIDB4YykpOworCQlyeGQgKz0gKDQgKiBzaXplb2YodTMyKSk7CisJCXByaW50aygiREVCVUc6IE5JQyBSWERfSlVNQk8oJWQpWzFdWyUwOHg6JTA4eDolMDh4OiUwOHhdXG4iLAorCQkgICAgICAgaSwKKwkJICAgICAgIHJlYWRsKHJ4ZCArIDB4MCksIHJlYWRsKHJ4ZCArIDB4NCksCisJCSAgICAgICByZWFkbChyeGQgKyAweDgpLCByZWFkbChyeGQgKyAweGMpKTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp0ZzNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHN0cnVjdCB0ZzNfZXRodG9vbF9zdGF0cyAqdGczX2dldF9lc3RhdHMoc3RydWN0IHRnMyAqKTsKKworc3RhdGljIGludCB0ZzNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlkZWxfdGltZXJfc3luYygmdHAtPnRpbWVyKTsKKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKyNpZiAwCisJdGczX2R1bXBfc3RhdGUodHApOworI2VuZGlmCisKKwl0ZzNfZGlzYWJsZV9pbnRzKHRwKTsKKworCXRnM19oYWx0KHRwKTsKKwl0ZzNfZnJlZV9yaW5ncyh0cCk7CisJdHAtPnRnM19mbGFncyAmPQorCQl+KFRHM19GTEFHX0lOSVRfQ09NUExFVEUgfAorCQkgIFRHM19GTEFHX0dPVF9TRVJERVNfRkxPV0NUTCk7CisJbmV0aWZfY2Fycmllcl9vZmYodHAtPmRldik7CisKKwlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwltZW1jcHkoJnRwLT5uZXRfc3RhdHNfcHJldiwgdGczX2dldF9zdGF0cyh0cC0+ZGV2KSwKKwkgICAgICAgc2l6ZW9mKHRwLT5uZXRfc3RhdHNfcHJldikpOworCW1lbWNweSgmdHAtPmVzdGF0c19wcmV2LCB0ZzNfZ2V0X2VzdGF0cyh0cCksCisJICAgICAgIHNpemVvZih0cC0+ZXN0YXRzX3ByZXYpKTsKKworCXRnM19mcmVlX2NvbnNpc3RlbnQodHApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfc3RhdDY0KHRnM19zdGF0NjRfdCAqdmFsKQoreworCXVuc2lnbmVkIGxvbmcgcmV0OworCisjaWYgKEJJVFNfUEVSX0xPTkcgPT0gMzIpCisJcmV0ID0gdmFsLT5sb3c7CisjZWxzZQorCXJldCA9ICgodTY0KXZhbC0+aGlnaCA8PCAzMikgfCAoKHU2NCl2YWwtPmxvdyk7CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjYWxjX2NyY19lcnJvcnMoc3RydWN0IHRnMyAqdHApCit7CisJc3RydWN0IHRnM19od19zdGF0cyAqaHdfc3RhdHMgPSB0cC0+aHdfc3RhdHM7CisKKwlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMpICYmCisJICAgIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCB8fAorCSAgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDEpKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXUzMiB2YWw7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CisJCWlmICghdGczX3JlYWRwaHkodHAsIDB4MWUsICZ2YWwpKSB7CisJCQl0ZzNfd3JpdGVwaHkodHAsIDB4MWUsIHZhbCB8IDB4ODAwMCk7CisJCQl0ZzNfcmVhZHBoeSh0cCwgMHgxNCwgJnZhbCk7CisJCX0gZWxzZQorCQkJdmFsID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKKworCQl0cC0+cGh5X2NyY19lcnJvcnMgKz0gdmFsOworCisJCXJldHVybiB0cC0+cGh5X2NyY19lcnJvcnM7CisJfQorCisJcmV0dXJuIGdldF9zdGF0NjQoJmh3X3N0YXRzLT5yeF9mY3NfZXJyb3JzKTsKK30KKworI2RlZmluZSBFU1RBVF9BREQobWVtYmVyKSBcCisJZXN0YXRzLT5tZW1iZXIgPQlvbGRfZXN0YXRzLT5tZW1iZXIgKyBcCisJCQkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPm1lbWJlcikKKworc3RhdGljIHN0cnVjdCB0ZzNfZXRodG9vbF9zdGF0cyAqdGczX2dldF9lc3RhdHMoc3RydWN0IHRnMyAqdHApCit7CisJc3RydWN0IHRnM19ldGh0b29sX3N0YXRzICplc3RhdHMgPSAmdHAtPmVzdGF0czsKKwlzdHJ1Y3QgdGczX2V0aHRvb2xfc3RhdHMgKm9sZF9lc3RhdHMgPSAmdHAtPmVzdGF0c19wcmV2OworCXN0cnVjdCB0ZzNfaHdfc3RhdHMgKmh3X3N0YXRzID0gdHAtPmh3X3N0YXRzOworCisJaWYgKCFod19zdGF0cykKKwkJcmV0dXJuIG9sZF9lc3RhdHM7CisKKwlFU1RBVF9BREQocnhfb2N0ZXRzKTsKKwlFU1RBVF9BREQocnhfZnJhZ21lbnRzKTsKKwlFU1RBVF9BREQocnhfdWNhc3RfcGFja2V0cyk7CisJRVNUQVRfQUREKHJ4X21jYXN0X3BhY2tldHMpOworCUVTVEFUX0FERChyeF9iY2FzdF9wYWNrZXRzKTsKKwlFU1RBVF9BREQocnhfZmNzX2Vycm9ycyk7CisJRVNUQVRfQUREKHJ4X2FsaWduX2Vycm9ycyk7CisJRVNUQVRfQUREKHJ4X3hvbl9wYXVzZV9yY3ZkKTsKKwlFU1RBVF9BREQocnhfeG9mZl9wYXVzZV9yY3ZkKTsKKwlFU1RBVF9BREQocnhfbWFjX2N0cmxfcmN2ZCk7CisJRVNUQVRfQUREKHJ4X3hvZmZfZW50ZXJlZCk7CisJRVNUQVRfQUREKHJ4X2ZyYW1lX3Rvb19sb25nX2Vycm9ycyk7CisJRVNUQVRfQUREKHJ4X2phYmJlcnMpOworCUVTVEFUX0FERChyeF91bmRlcnNpemVfcGFja2V0cyk7CisJRVNUQVRfQUREKHJ4X2luX2xlbmd0aF9lcnJvcnMpOworCUVTVEFUX0FERChyeF9vdXRfbGVuZ3RoX2Vycm9ycyk7CisJRVNUQVRfQUREKHJ4XzY0X29yX2xlc3Nfb2N0ZXRfcGFja2V0cyk7CisJRVNUQVRfQUREKHJ4XzY1X3RvXzEyN19vY3RldF9wYWNrZXRzKTsKKwlFU1RBVF9BREQocnhfMTI4X3RvXzI1NV9vY3RldF9wYWNrZXRzKTsKKwlFU1RBVF9BREQocnhfMjU2X3RvXzUxMV9vY3RldF9wYWNrZXRzKTsKKwlFU1RBVF9BREQocnhfNTEyX3RvXzEwMjNfb2N0ZXRfcGFja2V0cyk7CisJRVNUQVRfQUREKHJ4XzEwMjRfdG9fMTUyMl9vY3RldF9wYWNrZXRzKTsKKwlFU1RBVF9BREQocnhfMTUyM190b18yMDQ3X29jdGV0X3BhY2tldHMpOworCUVTVEFUX0FERChyeF8yMDQ4X3RvXzQwOTVfb2N0ZXRfcGFja2V0cyk7CisJRVNUQVRfQUREKHJ4XzQwOTZfdG9fODE5MV9vY3RldF9wYWNrZXRzKTsKKwlFU1RBVF9BREQocnhfODE5Ml90b185MDIyX29jdGV0X3BhY2tldHMpOworCisJRVNUQVRfQUREKHR4X29jdGV0cyk7CisJRVNUQVRfQUREKHR4X2NvbGxpc2lvbnMpOworCUVTVEFUX0FERCh0eF94b25fc2VudCk7CisJRVNUQVRfQUREKHR4X3hvZmZfc2VudCk7CisJRVNUQVRfQUREKHR4X2Zsb3dfY29udHJvbCk7CisJRVNUQVRfQUREKHR4X21hY19lcnJvcnMpOworCUVTVEFUX0FERCh0eF9zaW5nbGVfY29sbGlzaW9ucyk7CisJRVNUQVRfQUREKHR4X211bHRfY29sbGlzaW9ucyk7CisJRVNUQVRfQUREKHR4X2RlZmVycmVkKTsKKwlFU1RBVF9BREQodHhfZXhjZXNzaXZlX2NvbGxpc2lvbnMpOworCUVTVEFUX0FERCh0eF9sYXRlX2NvbGxpc2lvbnMpOworCUVTVEFUX0FERCh0eF9jb2xsaWRlXzJ0aW1lcyk7CisJRVNUQVRfQUREKHR4X2NvbGxpZGVfM3RpbWVzKTsKKwlFU1RBVF9BREQodHhfY29sbGlkZV80dGltZXMpOworCUVTVEFUX0FERCh0eF9jb2xsaWRlXzV0aW1lcyk7CisJRVNUQVRfQUREKHR4X2NvbGxpZGVfNnRpbWVzKTsKKwlFU1RBVF9BREQodHhfY29sbGlkZV83dGltZXMpOworCUVTVEFUX0FERCh0eF9jb2xsaWRlXzh0aW1lcyk7CisJRVNUQVRfQUREKHR4X2NvbGxpZGVfOXRpbWVzKTsKKwlFU1RBVF9BREQodHhfY29sbGlkZV8xMHRpbWVzKTsKKwlFU1RBVF9BREQodHhfY29sbGlkZV8xMXRpbWVzKTsKKwlFU1RBVF9BREQodHhfY29sbGlkZV8xMnRpbWVzKTsKKwlFU1RBVF9BREQodHhfY29sbGlkZV8xM3RpbWVzKTsKKwlFU1RBVF9BREQodHhfY29sbGlkZV8xNHRpbWVzKTsKKwlFU1RBVF9BREQodHhfY29sbGlkZV8xNXRpbWVzKTsKKwlFU1RBVF9BREQodHhfdWNhc3RfcGFja2V0cyk7CisJRVNUQVRfQUREKHR4X21jYXN0X3BhY2tldHMpOworCUVTVEFUX0FERCh0eF9iY2FzdF9wYWNrZXRzKTsKKwlFU1RBVF9BREQodHhfY2Fycmllcl9zZW5zZV9lcnJvcnMpOworCUVTVEFUX0FERCh0eF9kaXNjYXJkcyk7CisJRVNUQVRfQUREKHR4X2Vycm9ycyk7CisKKwlFU1RBVF9BREQoZG1hX3dyaXRlcV9mdWxsKTsKKwlFU1RBVF9BREQoZG1hX3dyaXRlX3ByaW9xX2Z1bGwpOworCUVTVEFUX0FERChyeGJkc19lbXB0eSk7CisJRVNUQVRfQUREKHJ4X2Rpc2NhcmRzKTsKKwlFU1RBVF9BREQocnhfZXJyb3JzKTsKKwlFU1RBVF9BREQocnhfdGhyZXNob2xkX2hpdCk7CisKKwlFU1RBVF9BREQoZG1hX3JlYWRxX2Z1bGwpOworCUVTVEFUX0FERChkbWFfcmVhZF9wcmlvcV9mdWxsKTsKKwlFU1RBVF9BREQodHhfY29tcF9xdWV1ZV9mdWxsKTsKKworCUVTVEFUX0FERChyaW5nX3NldF9zZW5kX3Byb2RfaW5kZXgpOworCUVTVEFUX0FERChyaW5nX3N0YXR1c191cGRhdGUpOworCUVTVEFUX0FERChuaWNfaXJxcyk7CisJRVNUQVRfQUREKG5pY19hdm9pZGVkX2lycXMpOworCUVTVEFUX0FERChuaWNfdHhfdGhyZXNob2xkX2hpdCk7CisKKwlyZXR1cm4gZXN0YXRzOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnRnM19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnRwLT5uZXRfc3RhdHM7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm9sZF9zdGF0cyA9ICZ0cC0+bmV0X3N0YXRzX3ByZXY7CisJc3RydWN0IHRnM19od19zdGF0cyAqaHdfc3RhdHMgPSB0cC0+aHdfc3RhdHM7CisKKwlpZiAoIWh3X3N0YXRzKQorCQlyZXR1cm4gb2xkX3N0YXRzOworCisJc3RhdHMtPnJ4X3BhY2tldHMgPSBvbGRfc3RhdHMtPnJ4X3BhY2tldHMgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+cnhfdWNhc3RfcGFja2V0cykgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+cnhfbWNhc3RfcGFja2V0cykgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+cnhfYmNhc3RfcGFja2V0cyk7CisJCQorCXN0YXRzLT50eF9wYWNrZXRzID0gb2xkX3N0YXRzLT50eF9wYWNrZXRzICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnR4X3VjYXN0X3BhY2tldHMpICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnR4X21jYXN0X3BhY2tldHMpICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnR4X2JjYXN0X3BhY2tldHMpOworCisJc3RhdHMtPnJ4X2J5dGVzID0gb2xkX3N0YXRzLT5yeF9ieXRlcyArCisJCWdldF9zdGF0NjQoJmh3X3N0YXRzLT5yeF9vY3RldHMpOworCXN0YXRzLT50eF9ieXRlcyA9IG9sZF9zdGF0cy0+dHhfYnl0ZXMgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+dHhfb2N0ZXRzKTsKKworCXN0YXRzLT5yeF9lcnJvcnMgPSBvbGRfc3RhdHMtPnJ4X2Vycm9ycyArCisJCWdldF9zdGF0NjQoJmh3X3N0YXRzLT5yeF9lcnJvcnMpICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnJ4X2Rpc2NhcmRzKTsKKwlzdGF0cy0+dHhfZXJyb3JzID0gb2xkX3N0YXRzLT50eF9lcnJvcnMgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+dHhfZXJyb3JzKSArCisJCWdldF9zdGF0NjQoJmh3X3N0YXRzLT50eF9tYWNfZXJyb3JzKSArCisJCWdldF9zdGF0NjQoJmh3X3N0YXRzLT50eF9jYXJyaWVyX3NlbnNlX2Vycm9ycykgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+dHhfZGlzY2FyZHMpOworCisJc3RhdHMtPm11bHRpY2FzdCA9IG9sZF9zdGF0cy0+bXVsdGljYXN0ICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnJ4X21jYXN0X3BhY2tldHMpOworCXN0YXRzLT5jb2xsaXNpb25zID0gb2xkX3N0YXRzLT5jb2xsaXNpb25zICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnR4X2NvbGxpc2lvbnMpOworCisJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgPSBvbGRfc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+cnhfZnJhbWVfdG9vX2xvbmdfZXJyb3JzKSArCisJCWdldF9zdGF0NjQoJmh3X3N0YXRzLT5yeF91bmRlcnNpemVfcGFja2V0cyk7CisKKwlzdGF0cy0+cnhfb3Zlcl9lcnJvcnMgPSBvbGRfc3RhdHMtPnJ4X292ZXJfZXJyb3JzICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnJ4YmRzX2VtcHR5KTsKKwlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzID0gb2xkX3N0YXRzLT5yeF9mcmFtZV9lcnJvcnMgKworCQlnZXRfc3RhdDY0KCZod19zdGF0cy0+cnhfYWxpZ25fZXJyb3JzKTsKKwlzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMgPSBvbGRfc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnR4X2Rpc2NhcmRzKTsKKwlzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMgPSBvbGRfc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzICsKKwkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPnR4X2NhcnJpZXJfc2Vuc2VfZXJyb3JzKTsKKworCXN0YXRzLT5yeF9jcmNfZXJyb3JzID0gb2xkX3N0YXRzLT5yeF9jcmNfZXJyb3JzICsKKwkJY2FsY19jcmNfZXJyb3JzKHRwKTsKKworCXJldHVybiBzdGF0czsKK30KKworc3RhdGljIGlubGluZSB1MzIgY2FsY19jcmModW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXUzMiByZWc7CisJdTMyIHRtcDsKKwlpbnQgaiwgazsKKworCXJlZyA9IDB4ZmZmZmZmZmY7CisKKwlmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKwkJcmVnIF49IGJ1ZltqXTsKKworCQlmb3IgKGsgPSAwOyBrIDwgODsgaysrKSB7CisJCQl0bXAgPSByZWcgJiAweDAxOworCisJCQlyZWcgPj49IDE7CisKKwkJCWlmICh0bXApIHsKKwkJCQlyZWcgXj0gMHhlZGI4ODMyMDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiB+cmVnOworfQorCitzdGF0aWMgdm9pZCB0ZzNfc2V0X211bHRpKHN0cnVjdCB0ZzMgKnRwLCB1bnNpZ25lZCBpbnQgYWNjZXB0X2FsbCkKK3sKKwkvKiBhY2NlcHQgb3IgcmVqZWN0IGFsbCBtdWx0aWNhc3QgZnJhbWVzICovCisJdHczMihNQUNfSEFTSF9SRUdfMCwgYWNjZXB0X2FsbCA/IDB4ZmZmZmZmZmYgOiAwKTsKKwl0dzMyKE1BQ19IQVNIX1JFR18xLCBhY2NlcHRfYWxsID8gMHhmZmZmZmZmZiA6IDApOworCXR3MzIoTUFDX0hBU0hfUkVHXzIsIGFjY2VwdF9hbGwgPyAweGZmZmZmZmZmIDogMCk7CisJdHczMihNQUNfSEFTSF9SRUdfMywgYWNjZXB0X2FsbCA/IDB4ZmZmZmZmZmYgOiAwKTsKK30KKworc3RhdGljIHZvaWQgX190ZzNfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIHJ4X21vZGU7CisKKwlyeF9tb2RlID0gdHAtPnJ4X21vZGUgJiB+KFJYX01PREVfUFJPTUlTQyB8CisJCQkJICBSWF9NT0RFX0tFRVBfVkxBTl9UQUcpOworCisJLyogV2hlbiBBU0YgaXMgaW4gdXNlLCB3ZSBhbHdheXMga2VlcCB0aGUgUlhfTU9ERV9LRUVQX1ZMQU5fVEFHCisJICogZmxhZyBjbGVhci4KKwkgKi8KKyNpZiBURzNfVkxBTl9UQUdfVVNFRAorCWlmICghdHAtPnZsZ3JwICYmCisJICAgICEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VOQUJMRV9BU0YpKQorCQlyeF9tb2RlIHw9IFJYX01PREVfS0VFUF9WTEFOX1RBRzsKKyNlbHNlCisJLyogQnkgZGVmaW5pdGlvbiwgVkxBTiBpcyBkaXNhYmxlZCBhbHdheXMgaW4gdGhpcworCSAqIGNhc2UuCisJICovCisJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VOQUJMRV9BU0YpKQorCQlyeF9tb2RlIHw9IFJYX01PREVfS0VFUF9WTEFOX1RBRzsKKyNlbmRpZgorCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQkvKiBQcm9taXNjdW91cyBtb2RlLiAqLworCQlyeF9tb2RlIHw9IFJYX01PREVfUFJPTUlTQzsKKwl9IGVsc2UgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKKwkJLyogQWNjZXB0IGFsbCBtdWx0aWNhc3QuICovCisJCXRnM19zZXRfbXVsdGkgKHRwLCAxKTsKKwl9IGVsc2UgaWYgKGRldi0+bWNfY291bnQgPCAxKSB7CisJCS8qIFJlamVjdCBhbGwgbXVsdGljYXN0LiAqLworCQl0ZzNfc2V0X211bHRpICh0cCwgMCk7CisJfSBlbHNlIHsKKwkJLyogQWNjZXB0IG9uZSBvciBtb3JlIG11bHRpY2FzdChzKS4gKi8KKwkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJCXVuc2lnbmVkIGludCBpOworCQl1MzIgbWNfZmlsdGVyWzRdID0geyAwLCB9OworCQl1MzIgcmVnaWR4OworCQl1MzIgYml0OworCQl1MzIgY3JjOworCisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCQkgICAgIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisKKwkJCWNyYyA9IGNhbGNfY3JjIChtY2xpc3QtPmRtaV9hZGRyLCBFVEhfQUxFTik7CisJCQliaXQgPSB+Y3JjICYgMHg3ZjsKKwkJCXJlZ2lkeCA9IChiaXQgJiAweDYwKSA+PiA1OworCQkJYml0ICY9IDB4MWY7CisJCQltY19maWx0ZXJbcmVnaWR4XSB8PSAoMSA8PCBiaXQpOworCQl9CisKKwkJdHczMihNQUNfSEFTSF9SRUdfMCwgbWNfZmlsdGVyWzBdKTsKKwkJdHczMihNQUNfSEFTSF9SRUdfMSwgbWNfZmlsdGVyWzFdKTsKKwkJdHczMihNQUNfSEFTSF9SRUdfMiwgbWNfZmlsdGVyWzJdKTsKKwkJdHczMihNQUNfSEFTSF9SRUdfMywgbWNfZmlsdGVyWzNdKTsKKwl9CisKKwlpZiAocnhfbW9kZSAhPSB0cC0+cnhfbW9kZSkgeworCQl0cC0+cnhfbW9kZSA9IHJ4X21vZGU7CisJCXR3MzJfZihNQUNfUlhfTU9ERSwgcnhfbW9kZSk7CisJCXVkZWxheSgxMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCB0ZzNfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisJX190ZzNfc2V0X3J4X21vZGUoZGV2KTsKKwlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworfQorCisjZGVmaW5lIFRHM19SRUdEVU1QX0xFTgkJKDMyICogMTAyNCkKKworc3RhdGljIGludCB0ZzNfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIFRHM19SRUdEVU1QX0xFTjsKK30KKworc3RhdGljIHZvaWQgdGczX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCXN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsIHZvaWQgKl9wKQoreworCXUzMiAqcCA9IF9wOworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1OCAqb3JpZ19wID0gX3A7CisJaW50IGk7CisKKwlyZWdzLT52ZXJzaW9uID0gMDsKKworCW1lbXNldChwLCAwLCBURzNfUkVHRFVNUF9MRU4pOworCisJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCisjZGVmaW5lIF9fR0VUX1JFRzMyKHJlZykJKCoocCkrKyA9IHRyMzIocmVnKSkKKyNkZWZpbmUgR0VUX1JFRzMyX0xPT1AoYmFzZSxsZW4pCQlcCitkbyB7CXAgPSAodTMyICopKG9yaWdfcCArIChiYXNlKSk7CQlcCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KQkJXAorCQlfX0dFVF9SRUczMigoYmFzZSkgKyBpKTsJXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgR0VUX1JFRzMyXzEocmVnKQkJCVwKK2RvIHsJcCA9ICh1MzIgKikob3JpZ19wICsgKHJlZykpOwkJXAorCV9fR0VUX1JFRzMyKChyZWcpKTsJCQlcCit9IHdoaWxlICgwKQorCisJR0VUX1JFRzMyX0xPT1AoVEczUENJX1ZFTkRPUiwgMHhiMCk7CisJR0VUX1JFRzMyX0xPT1AoTUFJTEJPWF9JTlRFUlJVUFRfMCwgMHgyMDApOworCUdFVF9SRUczMl9MT09QKE1BQ19NT0RFLCAweDRmMCk7CisJR0VUX1JFRzMyX0xPT1AoU05EREFUQUlfTU9ERSwgMHhlMCk7CisJR0VUX1JFRzMyXzEoU05EREFUQUNfTU9ERSk7CisJR0VUX1JFRzMyX0xPT1AoU05EQkRTX01PREUsIDB4ODApOworCUdFVF9SRUczMl9MT09QKFNOREJESV9NT0RFLCAweDQ4KTsKKwlHRVRfUkVHMzJfMShTTkRCRENfTU9ERSk7CisJR0VUX1JFRzMyX0xPT1AoUkNWTFBDX01PREUsIDB4MjApOworCUdFVF9SRUczMl9MT09QKFJDVkxQQ19TRUxMU1RfQkFTRSwgMHgxNWMpOworCUdFVF9SRUczMl9MT09QKFJDVkRCRElfTU9ERSwgMHgwYyk7CisJR0VUX1JFRzMyX0xPT1AoUkNWREJESV9KVU1CT19CRCwgMHgzYyk7CisJR0VUX1JFRzMyX0xPT1AoUkNWREJESV9CRF9QUk9EX0lEWF8wLCAweDQ0KTsKKwlHRVRfUkVHMzJfMShSQ1ZEQ0NfTU9ERSk7CisJR0VUX1JFRzMyX0xPT1AoUkNWQkRJX01PREUsIDB4MjApOworCUdFVF9SRUczMl9MT09QKFJDVkNDX01PREUsIDB4MTQpOworCUdFVF9SRUczMl9MT09QKFJDVkxTQ19NT0RFLCAweDA4KTsKKwlHRVRfUkVHMzJfMShNQkZSRUVfTU9ERSk7CisJR0VUX1JFRzMyX0xPT1AoSE9TVENDX01PREUsIDB4MTAwKTsKKwlHRVRfUkVHMzJfTE9PUChNRU1BUkJfTU9ERSwgMHgxMCk7CisJR0VUX1JFRzMyX0xPT1AoQlVGTUdSX01PREUsIDB4NTgpOworCUdFVF9SRUczMl9MT09QKFJETUFDX01PREUsIDB4MDgpOworCUdFVF9SRUczMl9MT09QKFdETUFDX01PREUsIDB4MDgpOworCUdFVF9SRUczMl9MT09QKFJYX0NQVV9CQVNFLCAweDI4MCk7CisJR0VUX1JFRzMyX0xPT1AoVFhfQ1BVX0JBU0UsIDB4MjgwKTsKKwlHRVRfUkVHMzJfTE9PUChHUkNNQk9YX0lOVEVSUlVQVF8wLCAweDExMCk7CisJR0VUX1JFRzMyX0xPT1AoRlRRX1JFU0VULCAweDEyMCk7CisJR0VUX1JFRzMyX0xPT1AoTVNHSU5UX01PREUsIDB4MGMpOworCUdFVF9SRUczMl8xKERNQUNfTU9ERSk7CisJR0VUX1JFRzMyX0xPT1AoR1JDX01PREUsIDB4NGMpOworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfTlZSQU0pCisJCUdFVF9SRUczMl9MT09QKE5WUkFNX0NNRCwgMHgyNCk7CisKKyN1bmRlZiBfX0dFVF9SRUczMgorI3VuZGVmIEdFVF9SRUczMl9MT09QCisjdW5kZWYgR0VUX1JFRzMyXzEKKworCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgdGczX2dldF9lZXByb21fbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuIHRwLT5udnJhbV9zaXplOworfQorCitzdGF0aWMgaW50IHRnM19udnJhbV9yZWFkKHN0cnVjdCB0ZzMgKnRwLCB1MzIgb2Zmc2V0LCB1MzIgKnZhbCk7CisKK3N0YXRpYyBpbnQgdGczX2dldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpkYXRhKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCXU4ICAqcGQ7CisJdTMyIGksIG9mZnNldCwgbGVuLCB2YWwsIGJfb2Zmc2V0LCBiX2NvdW50OworCisJb2Zmc2V0ID0gZWVwcm9tLT5vZmZzZXQ7CisJbGVuID0gZWVwcm9tLT5sZW47CisJZWVwcm9tLT5sZW4gPSAwOworCisJZWVwcm9tLT5tYWdpYyA9IFRHM19FRVBST01fTUFHSUM7CisKKwlpZiAob2Zmc2V0ICYgMykgeworCQkvKiBhZGp1c3RtZW50cyB0byBzdGFydCBvbiByZXF1aXJlZCA0IGJ5dGUgYm91bmRhcnkgKi8KKwkJYl9vZmZzZXQgPSBvZmZzZXQgJiAzOworCQliX2NvdW50ID0gNCAtIGJfb2Zmc2V0OworCQlpZiAoYl9jb3VudCA+IGxlbikgeworCQkJLyogaS5lLiBvZmZzZXQ9MSBsZW49MiAqLworCQkJYl9jb3VudCA9IGxlbjsKKwkJfQorCQlyZXQgPSB0ZzNfbnZyYW1fcmVhZCh0cCwgb2Zmc2V0LWJfb2Zmc2V0LCAmdmFsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXZhbCA9IGNwdV90b19sZTMyKHZhbCk7CisJCW1lbWNweShkYXRhLCAoKGNoYXIqKSZ2YWwpICsgYl9vZmZzZXQsIGJfY291bnQpOworCQlsZW4gLT0gYl9jb3VudDsKKwkJb2Zmc2V0ICs9IGJfY291bnQ7CisJICAgICAgICBlZXByb20tPmxlbiArPSBiX2NvdW50OworCX0KKworCS8qIHJlYWQgYnl0ZXMgdXB0byB0aGUgbGFzdCA0IGJ5dGUgYm91bmRhcnkgKi8KKwlwZCA9ICZkYXRhW2VlcHJvbS0+bGVuXTsKKwlmb3IgKGkgPSAwOyBpIDwgKGxlbiAtIChsZW4gJiAzKSk7IGkgKz0gNCkgeworCQlyZXQgPSB0ZzNfbnZyYW1fcmVhZCh0cCwgb2Zmc2V0ICsgaSwgJnZhbCk7CisJCWlmIChyZXQpIHsKKwkJCWVlcHJvbS0+bGVuICs9IGk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXZhbCA9IGNwdV90b19sZTMyKHZhbCk7CisJCW1lbWNweShwZCArIGksICZ2YWwsIDQpOworCX0KKwllZXByb20tPmxlbiArPSBpOworCisJaWYgKGxlbiAmIDMpIHsKKwkJLyogcmVhZCBsYXN0IGJ5dGVzIG5vdCBlbmRpbmcgb24gNCBieXRlIGJvdW5kYXJ5ICovCisJCXBkID0gJmRhdGFbZWVwcm9tLT5sZW5dOworCQliX2NvdW50ID0gbGVuICYgMzsKKwkJYl9vZmZzZXQgPSBvZmZzZXQgKyBsZW4gLSBiX2NvdW50OworCQlyZXQgPSB0ZzNfbnZyYW1fcmVhZCh0cCwgYl9vZmZzZXQsICZ2YWwpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJdmFsID0gY3B1X3RvX2xlMzIodmFsKTsKKwkJbWVtY3B5KHBkLCAoKGNoYXIqKSZ2YWwpLCBiX2NvdW50KTsKKwkJZWVwcm9tLT5sZW4gKz0gYl9jb3VudDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGczX252cmFtX3dyaXRlX2Jsb2NrKHN0cnVjdCB0ZzMgKnRwLCB1MzIgb2Zmc2V0LCB1MzIgbGVuLCB1OCAqYnVmKTsgCisKK3N0YXRpYyBpbnQgdGczX3NldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpkYXRhKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCXUzMiBvZmZzZXQsIGxlbiwgYl9vZmZzZXQsIG9kZF9sZW4sIHN0YXJ0LCBlbmQ7CisJdTggKmJ1ZjsKKworCWlmIChlZXByb20tPm1hZ2ljICE9IFRHM19FRVBST01fTUFHSUMpCisJCXJldHVybiAtRUlOVkFMOworCisJb2Zmc2V0ID0gZWVwcm9tLT5vZmZzZXQ7CisJbGVuID0gZWVwcm9tLT5sZW47CisKKwlpZiAoKGJfb2Zmc2V0ID0gKG9mZnNldCAmIDMpKSkgeworCQkvKiBhZGp1c3RtZW50cyB0byBzdGFydCBvbiByZXF1aXJlZCA0IGJ5dGUgYm91bmRhcnkgKi8KKwkJcmV0ID0gdGczX252cmFtX3JlYWQodHAsIG9mZnNldC1iX29mZnNldCwgJnN0YXJ0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXN0YXJ0ID0gY3B1X3RvX2xlMzIoc3RhcnQpOworCQlsZW4gKz0gYl9vZmZzZXQ7CisJCW9mZnNldCAmPSB+MzsKKwl9CisKKwlvZGRfbGVuID0gMDsKKwlpZiAoKGxlbiAmIDMpICYmICgobGVuID4gNCkgfHwgKGJfb2Zmc2V0ID09IDApKSkgeworCQkvKiBhZGp1c3RtZW50cyB0byBlbmQgb24gcmVxdWlyZWQgNCBieXRlIGJvdW5kYXJ5ICovCisJCW9kZF9sZW4gPSAxOworCQlsZW4gPSAobGVuICsgMykgJiB+MzsKKwkJcmV0ID0gdGczX252cmFtX3JlYWQodHAsIG9mZnNldCtsZW4tNCwgJmVuZCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQllbmQgPSBjcHVfdG9fbGUzMihlbmQpOworCX0KKworCWJ1ZiA9IGRhdGE7CisJaWYgKGJfb2Zmc2V0IHx8IG9kZF9sZW4pIHsKKwkJYnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCQlpZiAoYnVmID09IDApCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKGJfb2Zmc2V0KQorCQkJbWVtY3B5KGJ1ZiwgJnN0YXJ0LCA0KTsKKwkJaWYgKG9kZF9sZW4pCisJCQltZW1jcHkoYnVmK2xlbi00LCAmZW5kLCA0KTsKKwkJbWVtY3B5KGJ1ZiArIGJfb2Zmc2V0LCBkYXRhLCBlZXByb20tPmxlbik7CisJfQorCisJcmV0ID0gdGczX252cmFtX3dyaXRlX2Jsb2NrKHRwLCBvZmZzZXQsIGxlbiwgYnVmKTsKKworCWlmIChidWYgIT0gZGF0YSkKKwkJa2ZyZWUoYnVmKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGczX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKyAgCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgCisJY21kLT5zdXBwb3J0ZWQgPSAoU1VQUE9SVEVEX0F1dG9uZWcpOworCisJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHXzEwXzEwMF9PTkxZKSkKKwkJY21kLT5zdXBwb3J0ZWQgfD0gKFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZiB8CisJCQkJICAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsKTsKKworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykpCisJCWNtZC0+c3VwcG9ydGVkIHw9IChTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8CisJCQkJICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8CisJCQkJICBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkJCQkgIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAorCQkJCSAgU1VQUE9SVEVEX01JSSk7CisJZWxzZQorCQljbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfRklCUkU7CisgIAorCWNtZC0+YWR2ZXJ0aXNpbmcgPSB0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmc7CisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQljbWQtPnNwZWVkID0gdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZDsKKwkJY21kLT5kdXBsZXggPSB0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleDsKKwl9CisJY21kLT5wb3J0ID0gMDsKKwljbWQtPnBoeV9hZGRyZXNzID0gUEhZX0FERFI7CisJY21kLT50cmFuc2NlaXZlciA9IDA7CisJY21kLT5hdXRvbmVnID0gdHAtPmxpbmtfY29uZmlnLmF1dG9uZWc7CisJY21kLT5tYXh0eHBrdCA9IDA7CisJY21kLT5tYXhyeHBrdCA9IDA7CisJcmV0dXJuIDA7Cit9CisgIAorc3RhdGljIGludCB0ZzNfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykgeworCQkvKiBUaGVzZSBhcmUgdGhlIG9ubHkgdmFsaWQgYWR2ZXJ0aXNlbWVudCBiaXRzIGFsbG93ZWQuICAqLworCQlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFICYmCisJCSAgICAoY21kLT5hZHZlcnRpc2luZyAmIH4oQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8CisJCQkJCSAgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQkJCSAgQURWRVJUSVNFRF9BdXRvbmVnIHwKKwkJCQkJICBBRFZFUlRJU0VEX0ZJQlJFKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisKKwl0cC0+bGlua19jb25maWcuYXV0b25lZyA9IGNtZC0+YXV0b25lZzsKKwlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCXRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyA9IGNtZC0+YWR2ZXJ0aXNpbmc7CisJCXRwLT5saW5rX2NvbmZpZy5zcGVlZCA9IFNQRUVEX0lOVkFMSUQ7CisJCXRwLT5saW5rX2NvbmZpZy5kdXBsZXggPSBEVVBMRVhfSU5WQUxJRDsKKwl9IGVsc2UgeworCQl0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgPSAwOworCQl0cC0+bGlua19jb25maWcuc3BlZWQgPSBjbWQtPnNwZWVkOworCQl0cC0+bGlua19jb25maWcuZHVwbGV4ID0gY21kLT5kdXBsZXg7CisgIAl9CisgIAorCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXRnM19zZXR1cF9waHkodHAsIDEpOworCisJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKyAgCisJcmV0dXJuIDA7Cit9CisgIAorc3RhdGljIHZvaWQgdGczX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTU9EVUxFX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfTU9EVUxFX1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUodHAtPnBkZXYpKTsKK30KKyAgCitzdGF0aWMgdm9pZCB0ZzNfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAKKwl3b2wtPnN1cHBvcnRlZCA9IFdBS0VfTUFHSUM7CisJd29sLT53b2xvcHRzID0gMDsKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1dPTF9FTkFCTEUpCisJCXdvbC0+d29sb3B0cyA9IFdBS0VfTUFHSUM7CisJbWVtc2V0KCZ3b2wtPnNvcGFzcywgMCwgc2l6ZW9mKHdvbC0+c29wYXNzKSk7Cit9CisgIAorc3RhdGljIGludCB0ZzNfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAKKwlpZiAod29sLT53b2xvcHRzICYgfldBS0VfTUFHSUMpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgod29sLT53b2xvcHRzICYgV0FLRV9NQUdJQykgJiYKKwkgICAgdHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTICYmCisJICAgICEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1NFUkRFU19XT0xfQ0FQKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisgIAorCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlpZiAod29sLT53b2xvcHRzICYgV0FLRV9NQUdJQykKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19XT0xfRU5BQkxFOworCWVsc2UKKwkJdHAtPnRnM19mbGFncyAmPSB+VEczX0ZMQUdfV09MX0VOQUJMRTsKKwlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKyAgCisJcmV0dXJuIDA7Cit9CisgIAorc3RhdGljIHUzMiB0ZzNfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiB0cC0+bXNnX2VuYWJsZTsKK30KKyAgCitzdGF0aWMgdm9pZCB0ZzNfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdHAtPm1zZ19lbmFibGUgPSB2YWx1ZTsKK30KKyAgCisjaWYgVEczX1RTT19TVVBQT1JUICE9IDAKK3N0YXRpYyBpbnQgdGczX3NldF90c28oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbHVlKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfVFNPX0NBUEFCTEUpKSB7CisJCWlmICh2YWx1ZSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGV0aHRvb2xfb3Bfc2V0X3RzbyhkZXYsIHZhbHVlKTsKK30KKyNlbmRpZgorICAKK3N0YXRpYyBpbnQgdGczX253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIGJtY3I7CisJaW50IHI7CisgIAorCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlyID0gLUVJTlZBTDsKKwl0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNQ1IsICZibWNyKTsKKwlpZiAoIXRnM19yZWFkcGh5KHRwLCBNSUlfQk1DUiwgJmJtY3IpICYmCisJICAgIChibWNyICYgQk1DUl9BTkVOQUJMRSkpIHsKKwkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQk1DUiwgYm1jciB8IEJNQ1JfQU5SRVNUQVJUKTsKKwkJciA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworICAKKwlyZXR1cm4gcjsKK30KKyAgCitzdGF0aWMgdm9pZCB0ZzNfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKmVyaW5nKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgCisJZXJpbmctPnJ4X21heF9wZW5kaW5nID0gVEczX1JYX1JJTkdfU0laRSAtIDE7CisJZXJpbmctPnJ4X21pbmlfbWF4X3BlbmRpbmcgPSAwOworCWVyaW5nLT5yeF9qdW1ib19tYXhfcGVuZGluZyA9IFRHM19SWF9KVU1CT19SSU5HX1NJWkUgLSAxOworCisJZXJpbmctPnJ4X3BlbmRpbmcgPSB0cC0+cnhfcGVuZGluZzsKKwllcmluZy0+cnhfbWluaV9wZW5kaW5nID0gMDsKKwllcmluZy0+cnhfanVtYm9fcGVuZGluZyA9IHRwLT5yeF9qdW1ib19wZW5kaW5nOworCWVyaW5nLT50eF9wZW5kaW5nID0gdHAtPnR4X3BlbmRpbmc7Cit9CisgIAorc3RhdGljIGludCB0ZzNfc2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKmVyaW5nKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgCisJaWYgKChlcmluZy0+cnhfcGVuZGluZyA+IFRHM19SWF9SSU5HX1NJWkUgLSAxKSB8fAorCSAgICAoZXJpbmctPnJ4X2p1bWJvX3BlbmRpbmcgPiBURzNfUlhfSlVNQk9fUklOR19TSVpFIC0gMSkgfHwKKwkgICAgKGVyaW5nLT50eF9wZW5kaW5nID4gVEczX1RYX1JJTkdfU0laRSAtIDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKyAgCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJdGczX25ldGlmX3N0b3AodHApOworCisJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworICAKKwl0cC0+cnhfcGVuZGluZyA9IGVyaW5nLT5yeF9wZW5kaW5nOworCisJaWYgKCh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX01BWF9SWFBFTkRfNjQpICYmCisJICAgIHRwLT5yeF9wZW5kaW5nID4gNjMpCisJCXRwLT5yeF9wZW5kaW5nID0gNjM7CisJdHAtPnJ4X2p1bWJvX3BlbmRpbmcgPSBlcmluZy0+cnhfanVtYm9fcGVuZGluZzsKKwl0cC0+dHhfcGVuZGluZyA9IGVyaW5nLT50eF9wZW5kaW5nOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQl0ZzNfaGFsdCh0cCk7CisJCXRnM19pbml0X2h3KHRwKTsKKwkJdGczX25ldGlmX3N0YXJ0KHRwKTsKKwl9CisKKwlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworICAKKwlyZXR1cm4gMDsKK30KKyAgCitzdGF0aWMgdm9pZCB0ZzNfZ2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZXBhdXNlKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgCisJZXBhdXNlLT5hdXRvbmVnID0gKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQVVTRV9BVVRPTkVHKSAhPSAwOworCWVwYXVzZS0+cnhfcGF1c2UgPSAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1JYX1BBVVNFKSAhPSAwOworCWVwYXVzZS0+dHhfcGF1c2UgPSAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1RYX1BBVVNFKSAhPSAwOworfQorICAKK3N0YXRpYyBpbnQgdGczX3NldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKmVwYXVzZSkKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgIAorCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXRnM19uZXRpZl9zdG9wKHRwKTsKKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKwlpZiAoZXBhdXNlLT5hdXRvbmVnKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1BBVVNFX0FVVE9ORUc7CisJZWxzZQorCQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19QQVVTRV9BVVRPTkVHOworCWlmIChlcGF1c2UtPnJ4X3BhdXNlKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1JYX1BBVVNFOworCWVsc2UKKwkJdHAtPnRnM19mbGFncyAmPSB+VEczX0ZMQUdfUlhfUEFVU0U7CisJaWYgKGVwYXVzZS0+dHhfcGF1c2UpCisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfVFhfUEFVU0U7CisJZWxzZQorCQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19UWF9QQVVTRTsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJdGczX2hhbHQodHApOworCQl0ZzNfaW5pdF9odyh0cCk7CisJCXRnM19uZXRpZl9zdGFydCh0cCk7CisJfQorCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisgIAorCXJldHVybiAwOworfQorICAKK3N0YXRpYyB1MzIgdGczX2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1JYX0NIRUNLU1VNUykgIT0gMDsKK30KKyAgCitzdGF0aWMgaW50IHRnM19zZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgIAorCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfQlJPS0VOX0NIRUNLU1VNUykgeworCQlpZiAoZGF0YSAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisgIAkJcmV0dXJuIDA7CisgIAl9CisgIAorCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlpZiAoZGF0YSkKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19SWF9DSEVDS1NVTVM7CisJZWxzZQorCQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19SWF9DSEVDS1NVTVM7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisgIAorCXJldHVybiAwOworfQorICAKK3N0YXRpYyBpbnQgdGczX3NldF90eF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgCisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19CUk9LRU5fQ0hFQ0tTVU1TKSB7CisJCWlmIChkYXRhICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKyAgCQlyZXR1cm4gMDsKKyAgCX0KKyAgCisJaWYgKGRhdGEpCisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNOworCWVsc2UKKwkJZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9JUF9DU1VNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGczX2dldF9zdGF0c19jb3VudCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gVEczX05VTV9TVEFUUzsKK30KKworc3RhdGljIHZvaWQgdGczX2dldF9zdHJpbmdzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqYnVmKQoreworCXN3aXRjaCAoc3RyaW5nc2V0KSB7CisJY2FzZSBFVEhfU1NfU1RBVFM6CisJCW1lbWNweShidWYsICZldGh0b29sX3N0YXRzX2tleXMsIHNpemVvZihldGh0b29sX3N0YXRzX2tleXMpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsJLyogd2UgbmVlZCBhIFdBUk4oKSAqLworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRnM19nZXRfZXRodG9vbF9zdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqZXN0YXRzLCB1NjQgKnRtcF9zdGF0cykKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJbWVtY3B5KHRtcF9zdGF0cywgdGczX2dldF9lc3RhdHModHApLCBzaXplb2YodHAtPmVzdGF0cykpOworfQorCitzdGF0aWMgaW50IHRnM19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkoaWZyKTsKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgorCQlkYXRhLT5waHlfaWQgPSBQSFlfQUREUjsKKworCQkvKiBmYWxsdGhydSAqLworCWNhc2UgU0lPQ0dNSUlSRUc6IHsKKwkJdTMyIG1paV9yZWd2YWw7CisKKwkJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykKKwkJCWJyZWFrOwkJCS8qIFdlIGhhdmUgbm8gUEhZICovCisKKwkJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCQllcnIgPSB0ZzNfcmVhZHBoeSh0cCwgZGF0YS0+cmVnX251bSAmIDB4MWYsICZtaWlfcmVndmFsKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisKKwkJZGF0YS0+dmFsX291dCA9IG1paV9yZWd2YWw7CisKKwkJcmV0dXJuIGVycjsKKwl9CisKKwljYXNlIFNJT0NTTUlJUkVHOgorCQlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKQorCQkJYnJlYWs7CQkJLyogV2UgaGF2ZSBubyBQSFkgKi8KKworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwkJZXJyID0gdGczX3dyaXRlcGh5KHRwLCBkYXRhLT5yZWdfbnVtICYgMHgxZiwgZGF0YS0+dmFsX2luKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisKKwkJcmV0dXJuIGVycjsKKworCWRlZmF1bHQ6CisJCS8qIGRvIG5vdGhpbmcgKi8KKwkJYnJlYWs7CisJfQorCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworI2lmIFRHM19WTEFOX1RBR19VU0VECitzdGF0aWMgdm9pZCB0ZzNfdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKworCXRwLT52bGdycCA9IGdycDsKKworCS8qIFVwZGF0ZSBSWF9NT0RFX0tFRVBfVkxBTl9UQUcgYml0IGluIFJYX01PREUgcmVnaXN0ZXIuICovCisJX190ZzNfc2V0X3J4X21vZGUoZGV2KTsKKworCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHRnM192bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisJaWYgKHRwLT52bGdycCkKKwkJdHAtPnZsZ3JwLT52bGFuX2RldmljZXNbdmlkXSA9IE5VTEw7CisJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHRnM19ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzCQk9IHRnM19nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSB0ZzNfc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbwkJPSB0ZzNfZ2V0X2RydmluZm8sCisJLmdldF9yZWdzX2xlbgkJPSB0ZzNfZ2V0X3JlZ3NfbGVuLAorCS5nZXRfcmVncwkJPSB0ZzNfZ2V0X3JlZ3MsCisJLmdldF93b2wJCT0gdGczX2dldF93b2wsCisJLnNldF93b2wJCT0gdGczX3NldF93b2wsCisJLmdldF9tc2dsZXZlbAkJPSB0ZzNfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gdGczX3NldF9tc2dsZXZlbCwKKwkubndheV9yZXNldAkJPSB0ZzNfbndheV9yZXNldCwKKwkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X2VlcHJvbV9sZW4JCT0gdGczX2dldF9lZXByb21fbGVuLAorCS5nZXRfZWVwcm9tCQk9IHRnM19nZXRfZWVwcm9tLAorCS5zZXRfZWVwcm9tCQk9IHRnM19zZXRfZWVwcm9tLAorCS5nZXRfcmluZ3BhcmFtCQk9IHRnM19nZXRfcmluZ3BhcmFtLAorCS5zZXRfcmluZ3BhcmFtCQk9IHRnM19zZXRfcmluZ3BhcmFtLAorCS5nZXRfcGF1c2VwYXJhbQkJPSB0ZzNfZ2V0X3BhdXNlcGFyYW0sCisJLnNldF9wYXVzZXBhcmFtCQk9IHRnM19zZXRfcGF1c2VwYXJhbSwKKwkuZ2V0X3J4X2NzdW0JCT0gdGczX2dldF9yeF9jc3VtLAorCS5zZXRfcnhfY3N1bQkJPSB0ZzNfc2V0X3J4X2NzdW0sCisJLmdldF90eF9jc3VtCQk9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCisJLnNldF90eF9jc3VtCQk9IHRnM19zZXRfdHhfY3N1bSwKKwkuZ2V0X3NnCQkJPSBldGh0b29sX29wX2dldF9zZywKKwkuc2V0X3NnCQkJPSBldGh0b29sX29wX3NldF9zZywKKyNpZiBURzNfVFNPX1NVUFBPUlQgIT0gMAorCS5nZXRfdHNvCQk9IGV0aHRvb2xfb3BfZ2V0X3RzbywKKwkuc2V0X3RzbwkJPSB0ZzNfc2V0X3RzbywKKyNlbmRpZgorCS5nZXRfc3RyaW5ncwkJPSB0ZzNfZ2V0X3N0cmluZ3MsCisJLmdldF9zdGF0c19jb3VudAk9IHRnM19nZXRfc3RhdHNfY291bnQsCisJLmdldF9ldGh0b29sX3N0YXRzCT0gdGczX2dldF9ldGh0b29sX3N0YXRzLAorfTsKKworc3RhdGljIHZvaWQgX19kZXZpbml0IHRnM19nZXRfZWVwcm9tX3NpemUoc3RydWN0IHRnMyAqdHApCit7CisJdTMyIGN1cnNpemUsIHZhbDsKKworCXRwLT5udnJhbV9zaXplID0gRUVQUk9NX0NISVBfU0laRTsKKworCWlmICh0ZzNfbnZyYW1fcmVhZCh0cCwgMCwgJnZhbCkgIT0gMCkKKwkJcmV0dXJuOworCisJaWYgKHN3YWIzMih2YWwpICE9IFRHM19FRVBST01fTUFHSUMpCisJCXJldHVybjsKKworCS8qCisJICogU2l6ZSB0aGUgY2hpcCBieSByZWFkaW5nIG9mZnNldHMgYXQgaW5jcmVhc2luZyBwb3dlcnMgb2YgdHdvLgorCSAqIFdoZW4gd2UgZW5jb3VudGVyIG91ciB2YWxpZGF0aW9uIHNpZ25hdHVyZSwgd2Uga25vdyB0aGUgYWRkcmVzc2luZworCSAqIGhhcyB3cmFwcGVkIGFyb3VuZCwgYW5kIHRodXMgaGF2ZSBvdXIgY2hpcCBzaXplLgorCSAqLworCWN1cnNpemUgPSAweDgwMDsKKworCXdoaWxlIChjdXJzaXplIDwgdHAtPm52cmFtX3NpemUpIHsKKwkJaWYgKHRnM19udnJhbV9yZWFkKHRwLCBjdXJzaXplLCAmdmFsKSAhPSAwKQorCQkJcmV0dXJuOworCisJCWlmIChzd2FiMzIodmFsKSA9PSBURzNfRUVQUk9NX01BR0lDKQorCQkJYnJlYWs7CisKKwkJY3Vyc2l6ZSA8PD0gMTsKKwl9CisKKwl0cC0+bnZyYW1fc2l6ZSA9IGN1cnNpemU7Cit9CisJCQorc3RhdGljIHZvaWQgX19kZXZpbml0IHRnM19nZXRfbnZyYW1fc2l6ZShzdHJ1Y3QgdGczICp0cCkKK3sKKwl1MzIgdmFsOworCisJaWYgKHRnM19udnJhbV9yZWFkKHRwLCAweGYwLCAmdmFsKSA9PSAwKSB7CisJCWlmICh2YWwgIT0gMCkgeworCQkJdHAtPm52cmFtX3NpemUgPSAodmFsID4+IDE2KSAqIDEwMjQ7CisJCQlyZXR1cm47CisJCX0KKwl9CisJdHAtPm52cmFtX3NpemUgPSAweDIwMDAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdGczX2dldF9udnJhbV9pbmZvKHN0cnVjdCB0ZzMgKnRwKQoreworCXUzMiBudmNmZzE7CisKKwludmNmZzEgPSB0cjMyKE5WUkFNX0NGRzEpOworCWlmIChudmNmZzEgJiBOVlJBTV9DRkcxX0ZMQVNISUZfRU5BQikgeworCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9GTEFTSDsKKwl9CisJZWxzZSB7CisJCW52Y2ZnMSAmPSB+TlZSQU1fQ0ZHMV9DT01QQVRfQllQQVNTOworCQl0dzMyKE5WUkFNX0NGRzEsIG52Y2ZnMSk7CisJfQorCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzUwKSB7CisJCXN3aXRjaCAobnZjZmcxICYgTlZSQU1fQ0ZHMV9WRU5ET1JfTUFTSykgeworCQkJY2FzZSBGTEFTSF9WRU5ET1JfQVRNRUxfRkxBU0hfQlVGRkVSRUQ6CisJCQkJdHAtPm52cmFtX2plZGVjbnVtID0gSkVERUNfQVRNRUw7CisJCQkJdHAtPm52cmFtX3BhZ2VzaXplID0gQVRNRUxfQVQ0NURCMFgxQl9QQUdFX1NJWkU7CisJCQkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19OVlJBTV9CVUZGRVJFRDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRkxBU0hfVkVORE9SX0FUTUVMX0ZMQVNIX1VOQlVGRkVSRUQ6CisJCQkJdHAtPm52cmFtX2plZGVjbnVtID0gSkVERUNfQVRNRUw7CisgICAgICAgICAgICAgICAgICAgICAgICAgCXRwLT5udnJhbV9wYWdlc2l6ZSA9IEFUTUVMX0FUMjVGNTEyX1BBR0VfU0laRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRkxBU0hfVkVORE9SX0FUTUVMX0VFUFJPTToKKwkJCQl0cC0+bnZyYW1famVkZWNudW0gPSBKRURFQ19BVE1FTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAJdHAtPm52cmFtX3BhZ2VzaXplID0gQVRNRUxfQVQyNEM1MTJfQ0hJUF9TSVpFOworCQkJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfTlZSQU1fQlVGRkVSRUQ7CisJCQkJYnJlYWs7CisJCQljYXNlIEZMQVNIX1ZFTkRPUl9TVDoKKwkJCQl0cC0+bnZyYW1famVkZWNudW0gPSBKRURFQ19TVDsKKwkJCQl0cC0+bnZyYW1fcGFnZXNpemUgPSBTVF9NNDVQRVgwX1BBR0VfU0laRTsKKwkJCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX05WUkFNX0JVRkZFUkVEOworCQkJCWJyZWFrOworCQkJY2FzZSBGTEFTSF9WRU5ET1JfU0FJRlVOOgorCQkJCXRwLT5udnJhbV9qZWRlY251bSA9IEpFREVDX1NBSUZVTjsKKwkJCQl0cC0+bnZyYW1fcGFnZXNpemUgPSBTQUlGVU5fU0EyNUYwWFhfUEFHRV9TSVpFOworCQkJCWJyZWFrOworCQkJY2FzZSBGTEFTSF9WRU5ET1JfU1NUX1NNQUxMOgorCQkJY2FzZSBGTEFTSF9WRU5ET1JfU1NUX0xBUkdFOgorCQkJCXRwLT5udnJhbV9qZWRlY251bSA9IEpFREVDX1NTVDsKKwkJCQl0cC0+bnZyYW1fcGFnZXNpemUgPSBTU1RfMjVWRjBYMF9QQUdFX1NJWkU7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJZWxzZSB7CisJCXRwLT5udnJhbV9qZWRlY251bSA9IEpFREVDX0FUTUVMOworCQl0cC0+bnZyYW1fcGFnZXNpemUgPSBBVE1FTF9BVDQ1REIwWDFCX1BBR0VfU0laRTsKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19OVlJBTV9CVUZGRVJFRDsKKwl9Cit9CisKKy8qIENoaXBzIG90aGVyIHRoYW4gNTcwMC81NzAxIHVzZSB0aGUgTlZSQU0gZm9yIGZldGNoaW5nIGluZm8uICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdGczX252cmFtX2luaXQoc3RydWN0IHRnMyAqdHApCit7CisJaW50IGo7CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9TVU5fNTcwWCkKKwkJcmV0dXJuOworCisJdHczMl9mKEdSQ19FRVBST01fQUREUiwKKwkgICAgIChFRVBST01fQUREUl9GU01fUkVTRVQgfAorCSAgICAgIChFRVBST01fREVGQVVMVF9DTE9DS19QRVJJT0QgPDwKKwkgICAgICAgRUVQUk9NX0FERFJfQ0xLUEVSRF9TSElGVCkpKTsKKworCS8qIFhYWCBzY2hlZHVsZV90aW1lb3V0KCkgLi4uICovCisJZm9yIChqID0gMDsgaiA8IDEwMDsgaisrKQorCQl1ZGVsYXkoMTApOworCisJLyogRW5hYmxlIHNlZXByb20gYWNjZXNzZXMuICovCisJdHczMl9mKEdSQ19MT0NBTF9DVFJMLAorCSAgICAgdHIzMihHUkNfTE9DQUxfQ1RSTCkgfCBHUkNfTENMQ1RSTF9BVVRPX1NFRVBST00pOworCXVkZWxheSgxMDApOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzAwICYmCisJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzAxKSB7CisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfTlZSQU07CisKKwkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzUwKSB7CisJCQl1MzIgbnZhY2Nlc3MgPSB0cjMyKE5WUkFNX0FDQ0VTUyk7CisKKwkJCXR3MzIoTlZSQU1fQUNDRVNTLCBudmFjY2VzcyB8IEFDQ0VTU19FTkFCTEUpOworCQl9CisKKwkJdGczX2dldF9udnJhbV9pbmZvKHRwKTsKKwkJdGczX2dldF9udnJhbV9zaXplKHRwKTsKKworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApIHsKKwkJCXUzMiBudmFjY2VzcyA9IHRyMzIoTlZSQU1fQUNDRVNTKTsKKworCQkJdHczMihOVlJBTV9BQ0NFU1MsIG52YWNjZXNzICYgfkFDQ0VTU19FTkFCTEUpOworCQl9CisKKwl9IGVsc2UgeworCQl0cC0+dGczX2ZsYWdzICY9IH4oVEczX0ZMQUdfTlZSQU0gfCBURzNfRkxBR19OVlJBTV9CVUZGRVJFRCk7CisKKwkJdGczX2dldF9lZXByb21fc2l6ZSh0cCk7CisJfQorfQorCitzdGF0aWMgaW50IHRnM19udnJhbV9yZWFkX3VzaW5nX2VlcHJvbShzdHJ1Y3QgdGczICp0cCwKKwkJCQkJdTMyIG9mZnNldCwgdTMyICp2YWwpCit7CisJdTMyIHRtcDsKKwlpbnQgaTsKKworCWlmIChvZmZzZXQgPiBFRVBST01fQUREUl9BRERSX01BU0sgfHwKKwkgICAgKG9mZnNldCAlIDQpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJdG1wID0gdHIzMihHUkNfRUVQUk9NX0FERFIpICYgfihFRVBST01fQUREUl9BRERSX01BU0sgfAorCQkJCQlFRVBST01fQUREUl9ERVZJRF9NQVNLIHwKKwkJCQkJRUVQUk9NX0FERFJfUkVBRCk7CisJdHczMihHUkNfRUVQUk9NX0FERFIsCisJICAgICB0bXAgfAorCSAgICAgKDAgPDwgRUVQUk9NX0FERFJfREVWSURfU0hJRlQpIHwKKwkgICAgICgob2Zmc2V0IDw8IEVFUFJPTV9BRERSX0FERFJfU0hJRlQpICYKKwkgICAgICBFRVBST01fQUREUl9BRERSX01BU0spIHwKKwkgICAgIEVFUFJPTV9BRERSX1JFQUQgfCBFRVBST01fQUREUl9TVEFSVCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgeworCQl0bXAgPSB0cjMyKEdSQ19FRVBST01fQUREUik7CisKKwkJaWYgKHRtcCAmIEVFUFJPTV9BRERSX0NPTVBMRVRFKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMDApOworCX0KKwlpZiAoISh0bXAgJiBFRVBST01fQUREUl9DT01QTEVURSkpCisJCXJldHVybiAtRUJVU1k7CisKKwkqdmFsID0gdHIzMihHUkNfRUVQUk9NX0RBVEEpOworCXJldHVybiAwOworfQorCisjZGVmaW5lIE5WUkFNX0NNRF9USU1FT1VUIDEwMDAwCisKK3N0YXRpYyBpbnQgdGczX252cmFtX2V4ZWNfY21kKHN0cnVjdCB0ZzMgKnRwLCB1MzIgbnZyYW1fY21kKQoreworCWludCBpOworCisJdHczMihOVlJBTV9DTUQsIG52cmFtX2NtZCk7CisJZm9yIChpID0gMDsgaSA8IE5WUkFNX0NNRF9USU1FT1VUOyBpKyspIHsKKwkJdWRlbGF5KDEwKTsKKwkJaWYgKHRyMzIoTlZSQU1fQ01EKSAmIE5WUkFNX0NNRF9ET05FKSB7CisJCQl1ZGVsYXkoMTApOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGkgPT0gTlZSQU1fQ01EX1RJTUVPVVQpIHsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGczX252cmFtX3JlYWQoc3RydWN0IHRnMyAqdHAsIHUzMiBvZmZzZXQsIHUzMiAqdmFsKQoreworCWludCByZXQ7CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9TVU5fNTcwWCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJBdHRlbXB0IHRvIGRvIG52cmFtX3JlYWQgb24gU3VuIDU3MFhcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfTlZSQU0pKQorCQlyZXR1cm4gdGczX252cmFtX3JlYWRfdXNpbmdfZWVwcm9tKHRwLCBvZmZzZXQsIHZhbCk7CisKKwlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19OVlJBTV9CVUZGRVJFRCkgJiYKKwkJKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfRkxBU0gpICYmCisJCSh0cC0+bnZyYW1famVkZWNudW0gPT0gSkVERUNfQVRNRUwpKSB7CisKKwkJb2Zmc2V0ID0gKChvZmZzZXQgLyB0cC0+bnZyYW1fcGFnZXNpemUpIDw8CisJCQkgIEFUTUVMX0FUNDVEQjBYMUJfUEFHRV9QT1MpICsKKwkJCShvZmZzZXQgJSB0cC0+bnZyYW1fcGFnZXNpemUpOworCX0KKworCWlmIChvZmZzZXQgPiBOVlJBTV9BRERSX01TSykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0ZzNfbnZyYW1fbG9jayh0cCk7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApIHsKKwkJdTMyIG52YWNjZXNzID0gdHIzMihOVlJBTV9BQ0NFU1MpOworCisJCXR3MzJfZihOVlJBTV9BQ0NFU1MsIG52YWNjZXNzIHwgQUNDRVNTX0VOQUJMRSk7CisJfQorCisJdHczMihOVlJBTV9BRERSLCBvZmZzZXQpOworCXJldCA9IHRnM19udnJhbV9leGVjX2NtZCh0cCwgTlZSQU1fQ01EX1JEIHwgTlZSQU1fQ01EX0dPIHwKKwkJTlZSQU1fQ01EX0ZJUlNUIHwgTlZSQU1fQ01EX0xBU1QgfCBOVlJBTV9DTURfRE9ORSk7CisKKwlpZiAocmV0ID09IDApCisJCSp2YWwgPSBzd2FiMzIodHIzMihOVlJBTV9SRERBVEEpKTsKKworCXRnM19udnJhbV91bmxvY2sodHApOworCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzUwKSB7CisJCXUzMiBudmFjY2VzcyA9IHRyMzIoTlZSQU1fQUNDRVNTKTsKKworCQl0dzMyX2YoTlZSQU1fQUNDRVNTLCBudmFjY2VzcyAmIH5BQ0NFU1NfRU5BQkxFKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRnM19udnJhbV93cml0ZV9ibG9ja191c2luZ19lZXByb20oc3RydWN0IHRnMyAqdHAsCisJCQkJICAgIHUzMiBvZmZzZXQsIHUzMiBsZW4sIHU4ICpidWYpCit7CisJaW50IGksIGosIHJjID0gMDsKKwl1MzIgdmFsOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7CisJCXUzMiBhZGRyLCBkYXRhOworCisJCWFkZHIgPSBvZmZzZXQgKyBpOworCisJCW1lbWNweSgmZGF0YSwgYnVmICsgaSwgNCk7CisKKwkJdHczMihHUkNfRUVQUk9NX0RBVEEsIGNwdV90b19sZTMyKGRhdGEpKTsKKworCQl2YWwgPSB0cjMyKEdSQ19FRVBST01fQUREUik7CisJCXR3MzIoR1JDX0VFUFJPTV9BRERSLCB2YWwgfCBFRVBST01fQUREUl9DT01QTEVURSk7CisKKwkJdmFsICY9IH4oRUVQUk9NX0FERFJfQUREUl9NQVNLIHwgRUVQUk9NX0FERFJfREVWSURfTUFTSyB8CisJCQlFRVBST01fQUREUl9SRUFEKTsKKwkJdHczMihHUkNfRUVQUk9NX0FERFIsIHZhbCB8CisJCQkoMCA8PCBFRVBST01fQUREUl9ERVZJRF9TSElGVCkgfAorCQkJKGFkZHIgJiBFRVBST01fQUREUl9BRERSX01BU0spIHwKKwkJCUVFUFJPTV9BRERSX1NUQVJUIHwKKwkJCUVFUFJPTV9BRERSX1dSSVRFKTsKKwkJCisJCWZvciAoaiA9IDA7IGogPCAxMDAwMDsgaisrKSB7CisJCQl2YWwgPSB0cjMyKEdSQ19FRVBST01fQUREUik7CisKKwkJCWlmICh2YWwgJiBFRVBST01fQUREUl9DT01QTEVURSkKKwkJCQlicmVhazsKKwkJCXVkZWxheSgxMDApOworCQl9CisJCWlmICghKHZhbCAmIEVFUFJPTV9BRERSX0NPTVBMRVRFKSkgeworCQkJcmMgPSAtRUJVU1k7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByYzsKK30KKworLyogb2Zmc2V0IGFuZCBsZW5ndGggYXJlIGR3b3JkIGFsaWduZWQgKi8KK3N0YXRpYyBpbnQgdGczX252cmFtX3dyaXRlX2Jsb2NrX3VuYnVmZmVyZWQoc3RydWN0IHRnMyAqdHAsIHUzMiBvZmZzZXQsIHUzMiBsZW4sCisJCXU4ICpidWYpCit7CisJaW50IHJldCA9IDA7CisJdTMyIHBhZ2VzaXplID0gdHAtPm52cmFtX3BhZ2VzaXplOworCXUzMiBwYWdlbWFzayA9IHBhZ2VzaXplIC0gMTsKKwl1MzIgbnZyYW1fY21kOworCXU4ICp0bXA7CisKKwl0bXAgPSBrbWFsbG9jKHBhZ2VzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAodG1wID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJd2hpbGUgKGxlbikgeworCQlpbnQgajsKKwkJdTMyIHBoeV9hZGRyLCBwYWdlX29mZiwgc2l6ZSwgbnZhY2Nlc3M7CisKKwkJcGh5X2FkZHIgPSBvZmZzZXQgJiB+cGFnZW1hc2s7CisJCisJCWZvciAoaiA9IDA7IGogPCBwYWdlc2l6ZTsgaiArPSA0KSB7CisJCQlpZiAoKHJldCA9IHRnM19udnJhbV9yZWFkKHRwLCBwaHlfYWRkciArIGosCisJCQkJCQkodTMyICopICh0bXAgKyBqKSkpKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChyZXQpCisJCQlicmVhazsKKworCSAgICAgICAgcGFnZV9vZmYgPSBvZmZzZXQgJiBwYWdlbWFzazsKKwkJc2l6ZSA9IHBhZ2VzaXplOworCQlpZiAobGVuIDwgc2l6ZSkKKwkJCXNpemUgPSBsZW47CisKKwkJbGVuIC09IHNpemU7CisKKwkJbWVtY3B5KHRtcCArIHBhZ2Vfb2ZmLCBidWYsIHNpemUpOworCisJCW9mZnNldCA9IG9mZnNldCArIChwYWdlc2l6ZSAtIHBhZ2Vfb2ZmKTsKKworCQludmFjY2VzcyA9IHRyMzIoTlZSQU1fQUNDRVNTKTsKKwkJdHczMl9mKE5WUkFNX0FDQ0VTUywgbnZhY2Nlc3MgfCBBQ0NFU1NfRU5BQkxFKTsKKworCQkvKgorCQkgKiBCZWZvcmUgd2UgY2FuIGVyYXNlIHRoZSBmbGFzaCBwYWdlLCB3ZSBuZWVkCisJCSAqIHRvIGlzc3VlIGEgc3BlY2lhbCAid3JpdGUgZW5hYmxlIiBjb21tYW5kLgorCQkgKi8KKwkJbnZyYW1fY21kID0gTlZSQU1fQ01EX1dSRU4gfCBOVlJBTV9DTURfR08gfCBOVlJBTV9DTURfRE9ORTsKKworCQlpZiAodGczX252cmFtX2V4ZWNfY21kKHRwLCBudnJhbV9jbWQpKQorCQkJYnJlYWs7CisKKwkJLyogRXJhc2UgdGhlIHRhcmdldCBwYWdlICovCisJCXR3MzIoTlZSQU1fQUREUiwgcGh5X2FkZHIpOworCisJCW52cmFtX2NtZCA9IE5WUkFNX0NNRF9HTyB8IE5WUkFNX0NNRF9ET05FIHwgTlZSQU1fQ01EX1dSIHwKKwkJCU5WUkFNX0NNRF9GSVJTVCB8IE5WUkFNX0NNRF9MQVNUIHwgTlZSQU1fQ01EX0VSQVNFOworCisJICAgICAgICBpZiAodGczX252cmFtX2V4ZWNfY21kKHRwLCBudnJhbV9jbWQpKQorCQkJYnJlYWs7CisKKwkJLyogSXNzdWUgYW5vdGhlciB3cml0ZSBlbmFibGUgdG8gc3RhcnQgdGhlIHdyaXRlLiAqLworCQludnJhbV9jbWQgPSBOVlJBTV9DTURfV1JFTiB8IE5WUkFNX0NNRF9HTyB8IE5WUkFNX0NNRF9ET05FOworCisJCWlmICh0ZzNfbnZyYW1fZXhlY19jbWQodHAsIG52cmFtX2NtZCkpCisJCQlicmVhazsKKworCQlmb3IgKGogPSAwOyBqIDwgcGFnZXNpemU7IGogKz0gNCkgeworCQkJdTMyIGRhdGE7CisKKwkgICAgCQlkYXRhID0gKigodTMyICopICh0bXAgKyBqKSk7CisJCQl0dzMyKE5WUkFNX1dSREFUQSwgY3B1X3RvX2JlMzIoZGF0YSkpOworCisJCQl0dzMyKE5WUkFNX0FERFIsIHBoeV9hZGRyICsgaik7CisKKwkJCW52cmFtX2NtZCA9IE5WUkFNX0NNRF9HTyB8IE5WUkFNX0NNRF9ET05FIHwKKwkJCQlOVlJBTV9DTURfV1I7CisKKwkJCWlmIChqID09IDApCisJCQkJbnZyYW1fY21kIHw9IE5WUkFNX0NNRF9GSVJTVDsKKwkJCWVsc2UgaWYgKGogPT0gKHBhZ2VzaXplIC0gNCkpCisJCQkJbnZyYW1fY21kIHw9IE5WUkFNX0NNRF9MQVNUOworCisJCQlpZiAoKHJldCA9IHRnM19udnJhbV9leGVjX2NtZCh0cCwgbnZyYW1fY21kKSkpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCX0KKworCW52cmFtX2NtZCA9IE5WUkFNX0NNRF9XUkRJIHwgTlZSQU1fQ01EX0dPIHwgTlZSQU1fQ01EX0RPTkU7CisJdGczX252cmFtX2V4ZWNfY21kKHRwLCBudnJhbV9jbWQpOworCisJa2ZyZWUodG1wKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIG9mZnNldCBhbmQgbGVuZ3RoIGFyZSBkd29yZCBhbGlnbmVkICovCitzdGF0aWMgaW50IHRnM19udnJhbV93cml0ZV9ibG9ja19idWZmZXJlZChzdHJ1Y3QgdGczICp0cCwgdTMyIG9mZnNldCwgdTMyIGxlbiwKKwkJdTggKmJ1ZikKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCwgb2Zmc2V0ICs9IDQpIHsKKwkJdTMyIGRhdGEsIHBhZ2Vfb2ZmLCBwaHlfYWRkciwgbnZyYW1fY21kOworCisJCW1lbWNweSgmZGF0YSwgYnVmICsgaSwgNCk7CisJCXR3MzIoTlZSQU1fV1JEQVRBLCBjcHVfdG9fYmUzMihkYXRhKSk7CisKKwkgICAgICAgIHBhZ2Vfb2ZmID0gb2Zmc2V0ICUgdHAtPm52cmFtX3BhZ2VzaXplOworCisJCWlmICgodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9GTEFTSCkgJiYKKwkJCSh0cC0+bnZyYW1famVkZWNudW0gPT0gSkVERUNfQVRNRUwpKSB7CisKKwkJCXBoeV9hZGRyID0gKChvZmZzZXQgLyB0cC0+bnZyYW1fcGFnZXNpemUpIDw8CisJCQkJICAgIEFUTUVMX0FUNDVEQjBYMUJfUEFHRV9QT1MpICsgcGFnZV9vZmY7CisJCX0KKwkJZWxzZSB7CisJCQlwaHlfYWRkciA9IG9mZnNldDsKKwkJfQorCisJCXR3MzIoTlZSQU1fQUREUiwgcGh5X2FkZHIpOworCisJCW52cmFtX2NtZCA9IE5WUkFNX0NNRF9HTyB8IE5WUkFNX0NNRF9ET05FIHwgTlZSQU1fQ01EX1dSOworCisJICAgICAgICBpZiAoKHBhZ2Vfb2ZmID09IDApIHx8IChpID09IDApKQorCQkJbnZyYW1fY21kIHw9IE5WUkFNX0NNRF9GSVJTVDsKKwkJZWxzZSBpZiAocGFnZV9vZmYgPT0gKHRwLT5udnJhbV9wYWdlc2l6ZSAtIDQpKQorCQkJbnZyYW1fY21kIHw9IE5WUkFNX0NNRF9MQVNUOworCisJCWlmIChpID09IChsZW4gLSA0KSkKKwkJCW52cmFtX2NtZCB8PSBOVlJBTV9DTURfTEFTVDsKKworCQlpZiAoKHRwLT5udnJhbV9qZWRlY251bSA9PSBKRURFQ19TVCkgJiYKKwkJCShudnJhbV9jbWQgJiBOVlJBTV9DTURfRklSU1QpKSB7CisKKwkJCWlmICgocmV0ID0gdGczX252cmFtX2V4ZWNfY21kKHRwLAorCQkJCU5WUkFNX0NNRF9XUkVOIHwgTlZSQU1fQ01EX0dPIHwKKwkJCQlOVlJBTV9DTURfRE9ORSkpKQorCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9GTEFTSCkpIHsKKwkJCS8qIFdlIGFsd2F5cyBkbyBjb21wbGV0ZSB3b3JkIHdyaXRlcyB0byBlZXByb20uICovCisJCQludnJhbV9jbWQgfD0gKE5WUkFNX0NNRF9GSVJTVCB8IE5WUkFNX0NNRF9MQVNUKTsKKwkJfQorCisJCWlmICgocmV0ID0gdGczX252cmFtX2V4ZWNfY21kKHRwLCBudnJhbV9jbWQpKSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZHdvcmQgYWxpZ25lZCAqLworc3RhdGljIGludCB0ZzNfbnZyYW1fd3JpdGVfYmxvY2soc3RydWN0IHRnMyAqdHAsIHUzMiBvZmZzZXQsIHUzMiBsZW4sIHU4ICpidWYpCit7CisJaW50IHJldDsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1NVTl81NzBYKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkF0dGVtcHQgdG8gZG8gbnZyYW1fd3JpdGUgb24gU3VuIDU3MFhcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VFUFJPTV9XUklURV9QUk9UKSB7CisJCXR3MzJfZihHUkNfTE9DQUxfQ1RSTCwgdHAtPmdyY19sb2NhbF9jdHJsIHwKKwkJICAgICAgIEdSQ19MQ0xDVFJMX0dQSU9fT0UxKTsKKwkJdWRlbGF5KDQwKTsKKwl9CisKKwlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfTlZSQU0pKSB7CisJCXJldCA9IHRnM19udnJhbV93cml0ZV9ibG9ja191c2luZ19lZXByb20odHAsIG9mZnNldCwgbGVuLCBidWYpOworCX0KKwllbHNlIHsKKwkJdTMyIGdyY19tb2RlOworCisJCXRnM19udnJhbV9sb2NrKHRwKTsKKworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApIHsKKwkJCXUzMiBudmFjY2VzcyA9IHRyMzIoTlZSQU1fQUNDRVNTKTsKKworCQkJdHczMihOVlJBTV9BQ0NFU1MsIG52YWNjZXNzIHwgQUNDRVNTX0VOQUJMRSk7CisKKwkJCXR3MzIoTlZSQU1fV1JJVEUxLCAweDQwNik7CisJCX0KKworCQlncmNfbW9kZSA9IHRyMzIoR1JDX01PREUpOworCQl0dzMyKEdSQ19NT0RFLCBncmNfbW9kZSB8IEdSQ19NT0RFX05WUkFNX1dSX0VOQUJMRSk7CisKKwkJaWYgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfTlZSQU1fQlVGRkVSRUQpIHx8CisJCQkhKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfRkxBU0gpKSB7CisKKwkJCXJldCA9IHRnM19udnJhbV93cml0ZV9ibG9ja19idWZmZXJlZCh0cCwgb2Zmc2V0LCBsZW4sCisJCQkJYnVmKTsKKwkJfQorCQllbHNlIHsKKwkJCXJldCA9IHRnM19udnJhbV93cml0ZV9ibG9ja191bmJ1ZmZlcmVkKHRwLCBvZmZzZXQsIGxlbiwKKwkJCQlidWYpOworCQl9CisKKwkJZ3JjX21vZGUgPSB0cjMyKEdSQ19NT0RFKTsKKwkJdHczMihHUkNfTU9ERSwgZ3JjX21vZGUgJiB+R1JDX01PREVfTlZSQU1fV1JfRU5BQkxFKTsKKworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApIHsKKwkJCXUzMiBudmFjY2VzcyA9IHRyMzIoTlZSQU1fQUNDRVNTKTsKKworCQkJdHczMihOVlJBTV9BQ0NFU1MsIG52YWNjZXNzICYgfkFDQ0VTU19FTkFCTEUpOworCQl9CisJCXRnM19udnJhbV91bmxvY2sodHApOworCX0KKworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRUVQUk9NX1dSSVRFX1BST1QpIHsKKwkJdHczMl9mKEdSQ19MT0NBTF9DVFJMLCB0cC0+Z3JjX2xvY2FsX2N0cmwgfAorCQkgICAgICAgR1JDX0xDTENUUkxfR1BJT19PRTEgfCBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDEpOworCQl1ZGVsYXkoNDApOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBzdWJzeXNfdGJsX2VudCB7CisJdTE2IHN1YnN5c192ZW5kb3IsIHN1YnN5c19kZXZpZDsKKwl1MzIgcGh5X2lkOworfTsKKworc3RhdGljIHN0cnVjdCBzdWJzeXNfdGJsX2VudCBzdWJzeXNfaWRfdG9fcGh5X2lkW10gPSB7CisJLyogQnJvYWRjb20gYm9hcmRzLiAqLworCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHgxNjQ0LCBQSFlfSURfQkNNNTQwMSB9LCAvKiBCQ005NTcwMEE2ICovCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDAwMDEsIFBIWV9JRF9CQ001NzAxIH0sIC8qIEJDTTk1NzAxQTUgKi8KKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4MDAwMiwgUEhZX0lEX0JDTTgwMDIgfSwgLyogQkNNOTU3MDBUNiAqLworCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHgwMDAzLCAwIH0sCQkgICAgLyogQkNNOTU3MDBBOSAqLworCXsgUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHgwMDA1LCBQSFlfSURfQkNNNTcwMSB9LCAvKiBCQ005NTcwMVQxICovCisJeyBQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDAwMDYsIFBIWV9JRF9CQ001NzAxIH0sIC8qIEJDTTk1NzAxVDggKi8KKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4MDAwNywgMCB9LAkJICAgIC8qIEJDTTk1NzAxQTcgKi8KKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4MDAwOCwgUEhZX0lEX0JDTTU3MDEgfSwgLyogQkNNOTU3MDFBMTAgKi8KKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4ODAwOCwgUEhZX0lEX0JDTTU3MDEgfSwgLyogQkNNOTU3MDFBMTIgKi8KKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4MDAwOSwgUEhZX0lEX0JDTTU3MDMgfSwgLyogQkNNOTU3MDNBeDEgKi8KKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4ODAwOSwgUEhZX0lEX0JDTTU3MDMgfSwgLyogQkNNOTU3MDNBeDIgKi8KKworCS8qIDNjb20gYm9hcmRzLiAqLworCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCAweDEwMDAsIFBIWV9JRF9CQ001NDAxIH0sIC8qIDNDOTk2VCAqLworCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCAweDEwMDYsIFBIWV9JRF9CQ001NzAxIH0sIC8qIDNDOTk2QlQgKi8KKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgMHgxMDA0LCAwIH0sCQkvKiAzQzk5NlNYICovCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIDB4MTAwNywgUEhZX0lEX0JDTTU3MDEgfSwgLyogM0MxMDAwVCAqLworCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCAweDEwMDgsIFBIWV9JRF9CQ001NzAxIH0sIC8qIDNDOTQwQlIwMSAqLworCisJLyogREVMTCBib2FyZHMuICovCisJeyBQQ0lfVkVORE9SX0lEX0RFTEwsIDB4MDBkMSwgUEhZX0lEX0JDTTU0MDEgfSwgLyogVklQRVIgKi8KKwl7IFBDSV9WRU5ET1JfSURfREVMTCwgMHgwMTA2LCBQSFlfSURfQkNNNTQwMSB9LCAvKiBKQUdVQVIgKi8KKwl7IFBDSV9WRU5ET1JfSURfREVMTCwgMHgwMTA5LCBQSFlfSURfQkNNNTQxMSB9LCAvKiBNRVJMT1QgKi8KKwl7IFBDSV9WRU5ET1JfSURfREVMTCwgMHgwMTBhLCBQSFlfSURfQkNNNTQxMSB9LCAvKiBTTElNX01FUkxPVCAqLworCisJLyogQ29tcGFxIGJvYXJkcy4gKi8KKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCAweDAwN2MsIFBIWV9JRF9CQ001NzAxIH0sIC8qIEJBTlNIRUUgKi8KKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCAweDAwOWEsIFBIWV9JRF9CQ001NzAxIH0sIC8qIEJBTlNIRUVfMiAqLworCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIDB4MDA3ZCwgMCB9LAkJICAvKiBDSEFOR0VMSU5HICovCisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgMHgwMDg1LCBQSFlfSURfQkNNNTcwMSB9LCAvKiBOQzc3ODAgKi8KKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCAweDAwOTksIFBIWV9JRF9CQ001NzAxIH0sIC8qIE5DNzc4MF8yICovCisKKwkvKiBJQk0gYm9hcmRzLiAqLworCXsgUENJX1ZFTkRPUl9JRF9JQk0sIDB4MDI4MSwgMCB9IC8qIElCTT8/PyAqLworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3Vic3lzX3RibF9lbnQgKmxvb2t1cF9ieV9zdWJzeXMoc3RydWN0IHRnMyAqdHApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdWJzeXNfaWRfdG9fcGh5X2lkKTsgaSsrKSB7CisJCWlmICgoc3Vic3lzX2lkX3RvX3BoeV9pZFtpXS5zdWJzeXNfdmVuZG9yID09CisJCSAgICAgdHAtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IpICYmCisJCSAgICAoc3Vic3lzX2lkX3RvX3BoeV9pZFtpXS5zdWJzeXNfZGV2aWQgPT0KKwkJICAgICB0cC0+cGRldi0+c3Vic3lzdGVtX2RldmljZSkpCisJCQlyZXR1cm4gJnN1YnN5c19pZF90b19waHlfaWRbaV07CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0ZzNfcGh5X3Byb2JlKHN0cnVjdCB0ZzMgKnRwKQoreworCXUzMiBlZXByb21fcGh5X2lkLCBod19waHlfaWRfMSwgaHdfcGh5X2lkXzI7CisJdTMyIGh3X3BoeV9pZCwgaHdfcGh5X2lkX21hc2tlZDsKKwl1MzIgdmFsOworCWludCBlZXByb21fc2lnbmF0dXJlX2ZvdW5kLCBlZXByb21fcGh5X3NlcmRlcywgZXJyOworCisJdHAtPnBoeV9pZCA9IFBIWV9JRF9JTlZBTElEOworCWVlcHJvbV9waHlfaWQgPSBQSFlfSURfSU5WQUxJRDsKKwllZXByb21fcGh5X3NlcmRlcyA9IDA7CisJZWVwcm9tX3NpZ25hdHVyZV9mb3VuZCA9IDA7CisJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9EQVRBX1NJRywgJnZhbCk7CisJaWYgKHZhbCA9PSBOSUNfU1JBTV9EQVRBX1NJR19NQUdJQykgeworCQl1MzIgbmljX2NmZywgbGVkX2NmZzsKKwkJdTMyIG5pY19waHlfaWQsIHZlciwgY2ZnMiA9IDA7CisKKwkJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9EQVRBX0NGRywgJm5pY19jZmcpOworCQl0cC0+bmljX3NyYW1fZGF0YV9jZmcgPSBuaWNfY2ZnOworCisJCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fREFUQV9WRVIsICZ2ZXIpOworCQl2ZXIgPj49IE5JQ19TUkFNX0RBVEFfVkVSX1NISUZUOworCQlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzAwKSAmJgorCQkgICAgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzAxKSAmJgorCQkgICAgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzAzKSAmJgorCQkgICAgKHZlciA+IDApICYmICh2ZXIgPCAweDEwMCkpCisJCQl0ZzNfcmVhZF9tZW0odHAsIE5JQ19TUkFNX0RBVEFfQ0ZHXzIsICZjZmcyKTsKKworCQllZXByb21fc2lnbmF0dXJlX2ZvdW5kID0gMTsKKworCQlpZiAoKG5pY19jZmcgJiBOSUNfU1JBTV9EQVRBX0NGR19QSFlfVFlQRV9NQVNLKSA9PQorCQkgICAgTklDX1NSQU1fREFUQV9DRkdfUEhZX1RZUEVfRklCRVIpCisJCQllZXByb21fcGh5X3NlcmRlcyA9IDE7CisKKwkJdGczX3JlYWRfbWVtKHRwLCBOSUNfU1JBTV9EQVRBX1BIWV9JRCwgJm5pY19waHlfaWQpOworCQlpZiAobmljX3BoeV9pZCAhPSAwKSB7CisJCQl1MzIgaWQxID0gbmljX3BoeV9pZCAmIE5JQ19TUkFNX0RBVEFfUEhZX0lEMV9NQVNLOworCQkJdTMyIGlkMiA9IG5pY19waHlfaWQgJiBOSUNfU1JBTV9EQVRBX1BIWV9JRDJfTUFTSzsKKworCQkJZWVwcm9tX3BoeV9pZCAgPSAoaWQxID4+IDE2KSA8PCAxMDsKKwkJCWVlcHJvbV9waHlfaWQgfD0gKGlkMiAmIDB4ZmMwMCkgPDwgMTY7CisJCQllZXByb21fcGh5X2lkIHw9IChpZDIgJiAweDAzZmYpIDw8ICAwOworCQl9IGVsc2UKKwkJCWVlcHJvbV9waHlfaWQgPSAwOworCisJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc1MCkgeworCQkJbGVkX2NmZyA9IGNmZzIgJiAoTklDX1NSQU1fREFUQV9DRkdfTEVEX01PREVfTUFTSyB8CisJCQkJICAgIFNIQVNUQV9FWFRfTEVEX01PREVfTUFTSyk7CisJCX0gZWxzZQorCQkJbGVkX2NmZyA9IG5pY19jZmcgJiBOSUNfU1JBTV9EQVRBX0NGR19MRURfTU9ERV9NQVNLOworCisJCXN3aXRjaCAobGVkX2NmZykgeworCQlkZWZhdWx0OgorCQljYXNlIE5JQ19TUkFNX0RBVEFfQ0ZHX0xFRF9NT0RFX1BIWV8xOgorCQkJdHAtPmxlZF9jdHJsID0gTEVEX0NUUkxfTU9ERV9QSFlfMTsKKwkJCWJyZWFrOworCisJCWNhc2UgTklDX1NSQU1fREFUQV9DRkdfTEVEX01PREVfUEhZXzI6CisJCQl0cC0+bGVkX2N0cmwgPSBMRURfQ1RSTF9NT0RFX1BIWV8yOworCQkJYnJlYWs7CisKKwkJY2FzZSBOSUNfU1JBTV9EQVRBX0NGR19MRURfTU9ERV9NQUM6CisJCQl0cC0+bGVkX2N0cmwgPSBMRURfQ1RSTF9NT0RFX01BQzsKKwkJCWJyZWFrOworCisJCWNhc2UgU0hBU1RBX0VYVF9MRURfU0hBUkVEOgorCQkJdHAtPmxlZF9jdHJsID0gTEVEX0NUUkxfTU9ERV9TSEFSRUQ7CisJCQlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCAhPSBDSElQUkVWX0lEXzU3NTBfQTAgJiYKKwkJCSAgICB0cC0+cGNpX2NoaXBfcmV2X2lkICE9IENISVBSRVZfSURfNTc1MF9BMSkKKwkJCQl0cC0+bGVkX2N0cmwgfD0gKExFRF9DVFJMX01PREVfUEhZXzEgfAorCQkJCQkJIExFRF9DVFJMX01PREVfUEhZXzIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTSEFTVEFfRVhUX0xFRF9NQUM6CisJCQl0cC0+bGVkX2N0cmwgPSBMRURfQ1RSTF9NT0RFX1NIQVNUQV9NQUM7CisJCQlicmVhazsKKworCQljYXNlIFNIQVNUQV9FWFRfTEVEX0NPTUJPOgorCQkJdHAtPmxlZF9jdHJsID0gTEVEX0NUUkxfTU9ERV9DT01CTzsKKwkJCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkICE9IENISVBSRVZfSURfNTc1MF9BMCkKKwkJCQl0cC0+bGVkX2N0cmwgfD0gKExFRF9DVFJMX01PREVfUEhZXzEgfAorCQkJCQkJIExFRF9DVFJMX01PREVfUEhZXzIpOworCQkJYnJlYWs7CisKKwkJfTsKKworCQlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAwIHx8CisJCSAgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDEpICYmCisJCSAgICB0cC0+cGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0RFTEwpCisJCQl0cC0+bGVkX2N0cmwgPSBMRURfQ1RSTF9NT0RFX1BIWV8yOworCisJCWlmICgoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDApICYmCisJCSAgICAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MDEpICYmCisJCSAgICAobmljX2NmZyAmIE5JQ19TUkFNX0RBVEFfQ0ZHX0VFUFJPTV9XUCkpCisJCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX0VFUFJPTV9XUklURV9QUk9UOworCisJCWlmIChuaWNfY2ZnICYgTklDX1NSQU1fREFUQV9DRkdfQVNGX0VOQUJMRSkgeworCQkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19FTkFCTEVfQVNGOworCQkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzUwKQorCQkJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX0FTRl9ORVdfSEFORFNIQUtFOworCQl9CisJCWlmIChuaWNfY2ZnICYgTklDX1NSQU1fREFUQV9DRkdfRklCRVJfV09MKQorCQkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19TRVJERVNfV09MX0NBUDsKKworCQlpZiAoY2ZnMiAmICgxIDw8IDE3KSkKKwkJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX0NBUEFDSVRJVkVfQ09VUExJTkc7CisKKwkJLyogc2VyZGVzIHNpZ25hbCBwcmUtZW1waGFzaXMgaW4gcmVnaXN0ZXIgMHg1OTAgc2V0IGJ5ICovCisJCS8qIGJvb3Rjb2RlIGlmIGJpdCAxOCBpcyBzZXQgKi8KKwkJaWYgKGNmZzIgJiAoMSA8PCAxOCkpCisJCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9TRVJERVNfUFJFRU1QSEFTSVM7CisJfQorCisJLyogUmVhZGluZyB0aGUgUEhZIElEIHJlZ2lzdGVyIGNhbiBjb25mbGljdCB3aXRoIEFTRgorCSAqIGZpcndtYXJlIGFjY2VzcyB0byB0aGUgUEhZIGhhcmR3YXJlLgorCSAqLworCWVyciA9IDA7CisJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19FTkFCTEVfQVNGKSB7CisJCWh3X3BoeV9pZCA9IGh3X3BoeV9pZF9tYXNrZWQgPSBQSFlfSURfSU5WQUxJRDsKKwl9IGVsc2UgeworCQkvKiBOb3cgcmVhZCB0aGUgcGh5c2ljYWwgUEhZX0lEIGZyb20gdGhlIGNoaXAgYW5kIHZlcmlmeQorCQkgKiB0aGF0IGl0IGlzIHNhbmUuICBJZiBpdCBkb2Vzbid0IGxvb2sgZ29vZCwgd2UgZmFsbCBiYWNrCisJCSAqIHRvIGVpdGhlciB0aGUgaGFyZC1jb2RlZCB0YWJsZSBiYXNlZCBQSFlfSUQgYW5kIGZhaWxpbmcKKwkJICogdGhhdCB0aGUgdmFsdWUgZm91bmQgaW4gdGhlIGVlcHJvbSBhcmVhLgorCQkgKi8KKwkJZXJyIHw9IHRnM19yZWFkcGh5KHRwLCBNSUlfUEhZU0lEMSwgJmh3X3BoeV9pZF8xKTsKKwkJZXJyIHw9IHRnM19yZWFkcGh5KHRwLCBNSUlfUEhZU0lEMiwgJmh3X3BoeV9pZF8yKTsKKworCQlod19waHlfaWQgID0gKGh3X3BoeV9pZF8xICYgMHhmZmZmKSA8PCAxMDsKKwkJaHdfcGh5X2lkIHw9IChod19waHlfaWRfMiAmIDB4ZmMwMCkgPDwgMTY7CisJCWh3X3BoeV9pZCB8PSAoaHdfcGh5X2lkXzIgJiAweDAzZmYpIDw8ICAwOworCisJCWh3X3BoeV9pZF9tYXNrZWQgPSBod19waHlfaWQgJiBQSFlfSURfTUFTSzsKKwl9CisKKwlpZiAoIWVyciAmJiBLTk9XTl9QSFlfSUQoaHdfcGh5X2lkX21hc2tlZCkpIHsKKwkJdHAtPnBoeV9pZCA9IGh3X3BoeV9pZDsKKwkJaWYgKGh3X3BoeV9pZF9tYXNrZWQgPT0gUEhZX0lEX0JDTTgwMDIpCisJCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9QSFlfU0VSREVTOworCX0gZWxzZSB7CisJCWlmIChlZXByb21fc2lnbmF0dXJlX2ZvdW5kKSB7CisJCQl0cC0+cGh5X2lkID0gZWVwcm9tX3BoeV9pZDsKKwkJCWlmIChlZXByb21fcGh5X3NlcmRlcykKKwkJCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9QSFlfU0VSREVTOworCQl9IGVsc2UgeworCQkJc3RydWN0IHN1YnN5c190YmxfZW50ICpwOworCisJCQkvKiBObyBlZXByb20gc2lnbmF0dXJlPyAgVHJ5IHRoZSBoYXJkY29kZWQKKwkJCSAqIHN1YnN5cyBkZXZpY2UgdGFibGUuCisJCQkgKi8KKwkJCXAgPSBsb29rdXBfYnlfc3Vic3lzKHRwKTsKKwkJCWlmICghcCkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKworCQkJdHAtPnBoeV9pZCA9IHAtPnBoeV9pZDsKKwkJCWlmICghdHAtPnBoeV9pZCB8fAorCQkJICAgIHRwLT5waHlfaWQgPT0gUEhZX0lEX0JDTTgwMDIpCisJCQkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfUEhZX1NFUkRFUzsKKwkJfQorCX0KKworCWlmICghKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykgJiYKKwkgICAgISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfRU5BQkxFX0FTRikpIHsKKwkJdTMyIGJtc3IsIGFkdl9yZWcsIHRnM19jdHJsOworCisJCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpOworCQlpZiAoIXRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpICYmCisJCSAgICAoYm1zciAmIEJNU1JfTFNUQVRVUykpCisJCQlnb3RvIHNraXBfcGh5X3Jlc2V0OworCQkgICAgCisJCWVyciA9IHRnM19waHlfcmVzZXQodHApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlhZHZfcmVnID0gKEFEVkVSVElTRV8xMEhBTEYgfCBBRFZFUlRJU0VfMTBGVUxMIHwKKwkJCSAgIEFEVkVSVElTRV8xMDBIQUxGIHwgQURWRVJUSVNFXzEwMEZVTEwgfAorCQkJICAgQURWRVJUSVNFX0NTTUEgfCBBRFZFUlRJU0VfUEFVU0VfQ0FQKTsKKwkJdGczX2N0cmwgPSAwOworCQlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpKSB7CisJCQl0ZzNfY3RybCA9IChNSUlfVEczX0NUUkxfQURWXzEwMDBfSEFMRiB8CisJCQkJICAgIE1JSV9URzNfQ1RSTF9BRFZfMTAwMF9GVUxMKTsKKwkJCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9BMCB8fAorCQkJICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0IwKQorCQkJCXRnM19jdHJsIHw9IChNSUlfVEczX0NUUkxfQVNfTUFTVEVSIHwKKwkJCQkJICAgICBNSUlfVEczX0NUUkxfRU5BQkxFX0FTX01BU1RFUik7CisJCX0KKworCQlpZiAoIXRnM19jb3BwZXJfaXNfYWR2ZXJ0aXNpbmdfYWxsKHRwKSkgeworCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQURWRVJUSVNFLCBhZHZfcmVnKTsKKworCQkJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHXzEwXzEwMF9PTkxZKSkKKwkJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQ1RSTCwgdGczX2N0cmwpOworCisJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9CTUNSLAorCQkJCSAgICAgQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUKTsKKwkJfQorCQl0ZzNfcGh5X3NldF93aXJlc3BlZWQodHApOworCisJCXRnM193cml0ZXBoeSh0cCwgTUlJX0FEVkVSVElTRSwgYWR2X3JlZyk7CisJCWlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR18xMF8xMDBfT05MWSkpCisJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9URzNfQ1RSTCwgdGczX2N0cmwpOworCX0KKworc2tpcF9waHlfcmVzZXQ6CisJaWYgKCh0cC0+cGh5X2lkICYgUEhZX0lEX01BU0spID09IFBIWV9JRF9CQ001NDAxKSB7CisJCWVyciA9IHRnM19pbml0XzU0MDFwaHlfZHNwKHRwKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJaWYgKCFlcnIgJiYgKCh0cC0+cGh5X2lkICYgUEhZX0lEX01BU0spID09IFBIWV9JRF9CQ001NDAxKSkgeworCQllcnIgPSB0ZzNfaW5pdF81NDAxcGh5X2RzcCh0cCk7CisJfQorCisJaWYgKCFlZXByb21fc2lnbmF0dXJlX2ZvdW5kKQorCQl0cC0+bGVkX2N0cmwgPSBMRURfQ1RSTF9NT0RFX1BIWV8xOworCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUEhZX1NFUkRFUykKKwkJdHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nID0KKwkJCShBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwKKwkJCSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsIHwKKwkJCSBBRFZFUlRJU0VEX0F1dG9uZWcgfAorCQkJIEFEVkVSVElTRURfRklCUkUpOworCWlmICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfMTBfMTAwX09OTFkpCisJCXRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyAmPQorCQkJfihBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwKKwkJCSAgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdGczX3JlYWRfcGFydG5vKHN0cnVjdCB0ZzMgKnRwKQoreworCXVuc2lnbmVkIGNoYXIgdnBkX2RhdGFbMjU2XTsKKwlpbnQgaTsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1NVTl81NzBYKSB7CisJCS8qIFN1biBkZWNpZGVkIG5vdCB0byBwdXQgdGhlIG5lY2Vzc2FyeSBiaXRzIGluIHRoZQorCQkgKiBOVlJBTSBvZiB0aGVpciBvbmJvYXJkIHRnMyBwYXJ0cyA6KAorCQkgKi8KKwkJc3RyY3B5KHRwLT5ib2FyZF9wYXJ0X251bWJlciwgIlN1biA1NzBYIik7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpICs9IDQpIHsKKwkJdTMyIHRtcDsKKworCQlpZiAodGczX252cmFtX3JlYWQodHAsIDB4MTAwICsgaSwgJnRtcCkpCisJCQlnb3RvIG91dF9ub3RfZm91bmQ7CisKKwkJdnBkX2RhdGFbaSArIDBdID0gKCh0bXAgPj4gIDApICYgMHhmZik7CisJCXZwZF9kYXRhW2kgKyAxXSA9ICgodG1wID4+ICA4KSAmIDB4ZmYpOworCQl2cGRfZGF0YVtpICsgMl0gPSAoKHRtcCA+PiAxNikgJiAweGZmKTsKKwkJdnBkX2RhdGFbaSArIDNdID0gKCh0bXAgPj4gMjQpICYgMHhmZik7CisJfQorCisJLyogTm93IHBhcnNlIGFuZCBmaW5kIHRoZSBwYXJ0IG51bWJlci4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyApIHsKKwkJdW5zaWduZWQgY2hhciB2YWwgPSB2cGRfZGF0YVtpXTsKKwkJaW50IGJsb2NrX2VuZDsKKworCQlpZiAodmFsID09IDB4ODIgfHwgdmFsID09IDB4OTEpIHsKKwkJCWkgPSAoaSArIDMgKworCQkJICAgICAodnBkX2RhdGFbaSArIDFdICsKKwkJCSAgICAgICh2cGRfZGF0YVtpICsgMl0gPDwgOCkpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHZhbCAhPSAweDkwKQorCQkJZ290byBvdXRfbm90X2ZvdW5kOworCisJCWJsb2NrX2VuZCA9IChpICsgMyArCisJCQkgICAgICh2cGRfZGF0YVtpICsgMV0gKworCQkJICAgICAgKHZwZF9kYXRhW2kgKyAyXSA8PCA4KSkpOworCQlpICs9IDM7CisJCXdoaWxlIChpIDwgYmxvY2tfZW5kKSB7CisJCQlpZiAodnBkX2RhdGFbaSArIDBdID09ICdQJyAmJgorCQkJICAgIHZwZF9kYXRhW2kgKyAxXSA9PSAnTicpIHsKKwkJCQlpbnQgcGFydG5vX2xlbiA9IHZwZF9kYXRhW2kgKyAyXTsKKworCQkJCWlmIChwYXJ0bm9fbGVuID4gMjQpCisJCQkJCWdvdG8gb3V0X25vdF9mb3VuZDsKKworCQkJCW1lbWNweSh0cC0+Ym9hcmRfcGFydF9udW1iZXIsCisJCQkJICAgICAgICZ2cGRfZGF0YVtpICsgM10sCisJCQkJICAgICAgIHBhcnRub19sZW4pOworCisJCQkJLyogU3VjY2Vzcy4gKi8KKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQkvKiBQYXJ0IG51bWJlciBub3QgZm91bmQuICovCisJCWdvdG8gb3V0X25vdF9mb3VuZDsKKwl9CisKK291dF9ub3RfZm91bmQ6CisJc3RyY3B5KHRwLT5ib2FyZF9wYXJ0X251bWJlciwgIm5vbmUiKTsKK30KKworI2lmZGVmIENPTkZJR19TUEFSQzY0CitzdGF0aWMgaW50IF9fZGV2aW5pdCB0ZzNfaXNfc3VuXzU3MFgoc3RydWN0IHRnMyAqdHApCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0cC0+cGRldjsKKwlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwID0gcGRldi0+c3lzZGF0YTsKKworCWlmIChwY3AgIT0gTlVMTCkgeworCQlpbnQgbm9kZSA9IHBjcC0+cHJvbV9ub2RlOworCQl1MzIgdmVuaWQ7CisJCWludCBlcnI7CisKKwkJZXJyID0gcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAic3Vic3lzdGVtLXZlbmRvci1pZCIsCisJCQkJICAgICAgIChjaGFyICopICZ2ZW5pZCwgc2l6ZW9mKHZlbmlkKSk7CisJCWlmIChlcnIgPT0gMCB8fCBlcnIgPT0gLTEpCisJCQlyZXR1cm4gMDsKKwkJaWYgKHZlbmlkID09IFBDSV9WRU5ET1JfSURfU1VOKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRnM19nZXRfaW52YXJpYW50cyhzdHJ1Y3QgdGczICp0cCkKK3sKKwlzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgd3JpdGVfcmVvcmRlcl9jaGlwc2V0c1tdID0geworCQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJICAgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQV84KSB9LAorCQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJICAgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQl84KSB9LAorCQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJICAgICAgICAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV8xMSkgfSwKKwkJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsCisJCSAgICAgICAgICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQkFfNikgfSwKKwkJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELAorCQkgICAgICAgICAgICAgUENJX0RFVklDRV9JRF9BTURfRkVfR0FURV83MDBDKSB9LAorCQl7IH0sCisJfTsKKwl1MzIgbWlzY19jdHJsX3JlZzsKKwl1MzIgY2FjaGVsaW5lX3N6X3JlZzsKKwl1MzIgcGNpX3N0YXRlX3JlZywgZ3JjX21pc2NfY2ZnOworCXUzMiB2YWw7CisJdTE2IHBjaV9jbWQ7CisJaW50IGVycjsKKworI2lmZGVmIENPTkZJR19TUEFSQzY0CisJaWYgKHRnM19pc19zdW5fNTcwWCh0cCkpCisJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX1NVTl81NzBYOworI2VuZGlmCisKKwkvKiBJZiB3ZSBoYXZlIGFuIEFNRCA3NjIgb3IgSW50ZWwgSUNIL0lDSDAvSUNIMiBjaGlwc2V0LCB3cml0ZQorCSAqIHJlb3JkZXJpbmcgdG8gdGhlIG1haWxib3ggcmVnaXN0ZXJzIGRvbmUgYnkgdGhlIGhvc3QKKwkgKiBjb250cm9sbGVyIGNhbiBjYXVzZSBtYWpvciB0cm91Ymxlcy4gIFdlIHJlYWQgYmFjayBmcm9tCisJICogZXZlcnkgbWFpbGJveCByZWdpc3RlciB3cml0ZSB0byBmb3JjZSB0aGUgd3JpdGVzIHRvIGJlCisJICogcG9zdGVkIHRvIHRoZSBjaGlwIGluIG9yZGVyLgorCSAqLworCWlmIChwY2lfZGV2X3ByZXNlbnQod3JpdGVfcmVvcmRlcl9jaGlwc2V0cykpCisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfTUJPWF9XUklURV9SRU9SREVSOworCisJLyogRm9yY2UgbWVtb3J5IHdyaXRlIGludmFsaWRhdGUgb2ZmLiAgSWYgd2UgbGVhdmUgaXQgb24sCisJICogdGhlbiBvbiA1NzAwX0JYIGNoaXBzIHdlIGhhdmUgdG8gZW5hYmxlIGEgd29ya2Fyb3VuZC4KKwkgKiBUaGUgd29ya2Fyb3VuZCBpcyB0byBzZXQgdGhlIFRHM1BDSV9ETUFfUldfQ1RSTCBib3VuZGFyeQorCSAqIHRvIG1hdGNoIHRoZSBjYWNoZWxpbmUgc2l6ZS4gIFRoZSBCcm9hZGNvbSBkcml2ZXIgaGF2ZSB0aGlzCisJICogd29ya2Fyb3VuZCBidXQgdHVybnMgTVdJIG9mZiBhbGwgdGhlIHRpbWVzIHNvIG5ldmVyIHVzZXMKKwkgKiBpdC4gIFRoaXMgc2VlbXMgdG8gc3VnZ2VzdCB0aGF0IHRoZSB3b3JrYXJvdW5kIGlzIGluc3VmZmljaWVudC4KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZCh0cC0+cGRldiwgUENJX0NPTU1BTkQsICZwY2lfY21kKTsKKwlwY2lfY21kICY9IH5QQ0lfQ09NTUFORF9JTlZBTElEQVRFOworCXBjaV93cml0ZV9jb25maWdfd29yZCh0cC0+cGRldiwgUENJX0NPTU1BTkQsIHBjaV9jbWQpOworCisJLyogSXQgaXMgYWJzb2x1dGVseSBjcml0aWNhbCB0aGF0IFRHM1BDSV9NSVNDX0hPU1RfQ1RSTAorCSAqIGhhcyB0aGUgcmVnaXN0ZXIgaW5kaXJlY3Qgd3JpdGUgZW5hYmxlIGJpdCBzZXQgYmVmb3JlCisJICogd2UgdHJ5IHRvIGFjY2VzcyBhbnkgb2YgdGhlIE1NSU8gcmVnaXN0ZXJzLiAgSXQgaXMgYWxzbworCSAqIGNyaXRpY2FsIHRoYXQgdGhlIFBDSS1YIGh3IHdvcmthcm91bmQgc2l0dWF0aW9uIGlzIGRlY2lkZWQKKwkgKiBiZWZvcmUgdGhhdCBhcyB3ZWxsLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01JU0NfSE9TVF9DVFJMLAorCQkJICAgICAgJm1pc2NfY3RybF9yZWcpOworCisJdHAtPnBjaV9jaGlwX3Jldl9pZCA9IChtaXNjX2N0cmxfcmVnID4+CisJCQkgICAgICAgTUlTQ19IT1NUX0NUUkxfQ0hJUFJFVl9TSElGVCk7CisKKwkvKiBJbml0aWFsaXplIG1pc2MgaG9zdCBjb250cm9sIGluIFBDSSBibG9jay4gKi8KKwl0cC0+bWlzY19ob3N0X2N0cmwgfD0gKG1pc2NfY3RybF9yZWcgJgorCQkJICAgICAgIE1JU0NfSE9TVF9DVFJMX0NISVBSRVYpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9NSVNDX0hPU1RfQ1RSTCwKKwkJCSAgICAgICB0cC0+bWlzY19ob3N0X2N0cmwpOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfQ0FDSEVMSU5FU1osCisJCQkgICAgICAmY2FjaGVsaW5lX3N6X3JlZyk7CisKKwl0cC0+cGNpX2NhY2hlbGluZV9zeiA9IChjYWNoZWxpbmVfc3pfcmVnID4+ICAwKSAmIDB4ZmY7CisJdHAtPnBjaV9sYXRfdGltZXIgICAgPSAoY2FjaGVsaW5lX3N6X3JlZyA+PiAgOCkgJiAweGZmOworCXRwLT5wY2lfaGRyX3R5cGUgICAgID0gKGNhY2hlbGluZV9zel9yZWcgPj4gMTYpICYgMHhmZjsKKwl0cC0+cGNpX2Jpc3QgICAgICAgICA9IChjYWNoZWxpbmVfc3pfcmVnID4+IDI0KSAmIDB4ZmY7CisKKwlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KSB8fAorCSAgICAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApKQorCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl81NzA1X1BMVVM7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApCisJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX0hXX1RTTzsKKworCWlmIChwY2lfZmluZF9jYXBhYmlsaXR5KHRwLT5wZGV2LCBQQ0lfQ0FQX0lEX0VYUCkgIT0gMCkKKwkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfUENJX0VYUFJFU1M7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMgJiYKKwkgICAgdHAtPnBjaV9sYXRfdGltZXIgPCA2NCkgeworCQl0cC0+cGNpX2xhdF90aW1lciA9IDY0OworCisJCWNhY2hlbGluZV9zel9yZWcgID0gKCh0cC0+cGNpX2NhY2hlbGluZV9zeiAmIDB4ZmYpIDw8ICAwKTsKKwkJY2FjaGVsaW5lX3N6X3JlZyB8PSAoKHRwLT5wY2lfbGF0X3RpbWVyICAgICYgMHhmZikgPDwgIDgpOworCQljYWNoZWxpbmVfc3pfcmVnIHw9ICgodHAtPnBjaV9oZHJfdHlwZSAgICAgJiAweGZmKSA8PCAxNik7CisJCWNhY2hlbGluZV9zel9yZWcgfD0gKCh0cC0+cGNpX2Jpc3QgICAgICAgICAmIDB4ZmYpIDw8IDI0KTsKKworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfQ0FDSEVMSU5FU1osCisJCQkJICAgICAgIGNhY2hlbGluZV9zel9yZWcpOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1BDSVNUQVRFLAorCQkJICAgICAgJnBjaV9zdGF0ZV9yZWcpOworCisJaWYgKChwY2lfc3RhdGVfcmVnICYgUENJU1RBVEVfQ09OVl9QQ0lfTU9ERSkgPT0gMCkgeworCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1BDSVhfTU9ERTsKKworCQkvKiBJZiB0aGlzIGlzIGEgNTcwMCBCWCBjaGlwc2V0LCBhbmQgd2UgYXJlIGluIFBDSS1YCisJCSAqIG1vZGUsIGVuYWJsZSByZWdpc3RlciB3cml0ZSB3b3JrYXJvdW5kLgorCQkgKgorCQkgKiBUaGUgd29ya2Fyb3VuZCBpcyB0byB1c2UgaW5kaXJlY3QgcmVnaXN0ZXIgYWNjZXNzZXMKKwkJICogZm9yIGFsbCBjaGlwIHdyaXRlcyBub3QgdG8gbWFpbGJveCByZWdpc3RlcnMuCisJCSAqLworCQlpZiAoR0VUX0NISVBfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IENISVBSRVZfNTcwMF9CWCkgeworCQkJdTMyIHBtX3JlZzsKKwkJCXUxNiBwY2lfY21kOworCisJCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1BDSVhfVEFSR0VUX0hXQlVHOworCisJCQkvKiBUaGUgY2hpcCBjYW4gaGF2ZSBpdCdzIHBvd2VyIG1hbmFnZW1lbnQgUENJIGNvbmZpZworCQkJICogc3BhY2UgcmVnaXN0ZXJzIGNsb2JiZXJlZCBkdWUgdG8gdGhpcyBidWcuCisJCQkgKiBTbyBleHBsaWNpdGx5IGZvcmNlIHRoZSBjaGlwIGludG8gRDAgaGVyZS4KKwkJCSAqLworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfUE1fQ1RSTF9TVEFULAorCQkJCQkgICAgICAmcG1fcmVnKTsKKwkJCXBtX3JlZyAmPSB+UENJX1BNX0NUUkxfU1RBVEVfTUFTSzsKKwkJCXBtX3JlZyB8PSBQQ0lfUE1fQ1RSTF9QTUVfRU5BQkxFIHwgMCAvKiBEMCAqLzsKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9QTV9DVFJMX1NUQVQsCisJCQkJCSAgICAgICBwbV9yZWcpOworCisJCQkvKiBBbHNvLCBmb3JjZSBTRVJSIy9QRVJSIyBpbiBQQ0kgY29tbWFuZC4gKi8KKwkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHRwLT5wZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jbWQpOworCQkJcGNpX2NtZCB8PSBQQ0lfQ09NTUFORF9QQVJJVFkgfCBQQ0lfQ09NTUFORF9TRVJSOworCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHRwLT5wZGV2LCBQQ0lfQ09NTUFORCwgcGNpX2NtZCk7CisJCX0KKwl9CisKKwkvKiBCYWNrIHRvIGJhY2sgcmVnaXN0ZXIgd3JpdGVzIGNhbiBjYXVzZSBwcm9ibGVtcyBvbiB0aGlzIGNoaXAsCisJICogdGhlIHdvcmthcm91bmQgaXMgdG8gcmVhZCBiYWNrIGFsbCByZWcgd3JpdGVzIGV4Y2VwdCB0aG9zZSB0bworCSAqIG1haWxib3ggcmVncy4gIFNlZSB0ZzNfd3JpdGVfaW5kaXJlY3RfcmVnMzIoKS4KKwkgKgorCSAqIFBDSSBFeHByZXNzIDU3NTBfQTAgcmV2IGNoaXBzIG5lZWQgdGhpcyB3b3JrYXJvdW5kIHRvby4KKwkgKi8KKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDEgfHwKKwkgICAgKCh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BDSV9FWFBSRVNTKSAmJgorCSAgICAgdHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3NTBfQTApKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHXzU3MDFfUkVHX1dSSVRFX0JVRzsKKworCWlmICgocGNpX3N0YXRlX3JlZyAmIFBDSVNUQVRFX0JVU19TUEVFRF9ISUdIKSAhPSAwKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1BDSV9ISUdIX1NQRUVEOworCWlmICgocGNpX3N0YXRlX3JlZyAmIFBDSVNUQVRFX0JVU18zMkJJVCkgIT0gMCkKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19QQ0lfMzJCSVQ7CisKKwkvKiBDaGlwLXNwZWNpZmljIGZpeHVwIGZyb20gQnJvYWRjb20gZHJpdmVyICovCisJaWYgKCh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwNF9BMCkgJiYKKwkgICAgKCEocGNpX3N0YXRlX3JlZyAmIFBDSVNUQVRFX1JFVFJZX1NBTUVfRE1BKSkpIHsKKwkJcGNpX3N0YXRlX3JlZyB8PSBQQ0lTVEFURV9SRVRSWV9TQU1FX0RNQTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1BDSVNUQVRFLCBwY2lfc3RhdGVfcmVnKTsKKwl9CisKKwkvKiBGb3JjZSB0aGUgY2hpcCBpbnRvIEQwLiAqLworCWVyciA9IHRnM19zZXRfcG93ZXJfc3RhdGUodHAsIDApOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiKCVzKSB0cmFuc2l0aW9uIHRvIEQwIGZhaWxlZFxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHRwLT5wZGV2KSk7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogNTcwMCBCMCBjaGlwcyBkbyBub3Qgc3VwcG9ydCBjaGVja3N1bW1pbmcgY29ycmVjdGx5IGR1ZQorCSAqIHRvIGhhcmR3YXJlIGJ1Z3MuCisJICovCisJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAwX0IwKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX0JST0tFTl9DSEVDS1NVTVM7CisKKwkvKiBQc2V1ZG8taGVhZGVyIGNoZWNrc3VtIGlzIGRvbmUgYnkgaGFyZHdhcmUgbG9naWMgYW5kIG5vdAorCSAqIHRoZSBvZmZsb2FkIHByb2Nlc3NlcnMsIHNvIG1ha2UgdGhlIGNoaXAgZG8gdGhlIHBzZXVkby0KKwkgKiBoZWFkZXIgY2hlY2tzdW1zIG9uIHJlY2VpdmUuICBGb3IgdHJhbnNtaXQgaXQgaXMgbW9yZQorCSAqIGNvbnZlbmllbnQgdG8gZG8gdGhlIHBzZXVkby1oZWFkZXIgY2hlY2tzdW0gaW4gc29mdHdhcmUKKwkgKiBhcyBMaW51eCBkb2VzIHRoYXQgb24gdHJhbnNtaXQgZm9yIHVzIGluIGFsbCBjYXNlcy4KKwkgKi8KKwl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX05PX1RYX1BTRVVET19DU1VNOworCXRwLT50ZzNfZmxhZ3MgJj0gflRHM19GTEFHX05PX1JYX1BTRVVET19DU1VNOworCisJLyogRGVyaXZlIGluaXRpYWwganVtYm8gbW9kZSBmcm9tIE1UVSBhc3NpZ25lZCBpbgorCSAqIGV0aGVyX3NldHVwKCkgdmlhIHRoZSBhbGxvY19ldGhlcmRldigpIGNhbGwKKwkgKi8KKwlpZiAodHAtPmRldi0+bXR1ID4gRVRIX0RBVEFfTEVOKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX0pVTUJPX0VOQUJMRTsKKworCS8qIERldGVybWluZSBXYWtlT25MYW4gc3BlZWQgdG8gdXNlLiAqLworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCB8fAorCSAgICB0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9BMCB8fAorCSAgICB0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9CMCB8fAorCSAgICB0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9CMikgeworCQl0cC0+dGczX2ZsYWdzICY9IH4oVEczX0ZMQUdfV09MX1NQRUVEXzEwME1CKTsKKwl9IGVsc2UgeworCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1dPTF9TUEVFRF8xMDBNQjsKKwl9CisKKwkvKiBBIGZldyBib2FyZHMgZG9uJ3Qgd2FudCBFdGhlcm5ldEBXaXJlU3BlZWQgcGh5IGZlYXR1cmUgKi8KKwlpZiAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAwKSB8fAorCSAgICAoKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1KSAmJgorCSAgICAgKHRwLT5wY2lfY2hpcF9yZXZfaWQgIT0gQ0hJUFJFVl9JRF81NzA1X0EwKSAmJgorCSAgICAgKHRwLT5wY2lfY2hpcF9yZXZfaWQgIT0gQ0hJUFJFVl9JRF81NzA1X0ExKSkpCisJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX05PX0VUSF9XSVJFX1NQRUVEOworCisJaWYgKEdFVF9DSElQX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBDSElQUkVWXzU3MDNfQVggfHwKKwkgICAgR0VUX0NISVBfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IENISVBSRVZfNTcwNF9BWCkKKwkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfUEhZX0FEQ19CVUc7CisJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzA0X0EwKQorCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9QSFlfNTcwNF9BMF9CVUc7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDUgfHwKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTApCisJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX1BIWV9CRVJfQlVHOworCisJLyogT25seSA1NzAxIGFuZCBsYXRlciBzdXBwb3J0IHRhZ2dlZCBpcnEgc3RhdHVzIG1vZGUuCisJICogQWxzbywgNTc4OCBjaGlwcyBjYW5ub3QgdXNlIHRhZ2dlZCBpcnEgc3RhdHVzLgorCSAqCisJICogSG93ZXZlciwgc2luY2Ugd2UgYXJlIHVzaW5nIE5BUEkgYXZvaWQgdGFnZ2VkIGlycSBzdGF0dXMKKwkgKiBiZWNhdXNlIHRoZSBpbnRlcnJ1cHQgY29uZGl0aW9uIGlzIG1vcmUgZGlmZmljdWx0IHRvCisJICogZnVsbHkgY2xlYXIgaW4gdGhhdCBtb2RlLgorCSAqLworCXRwLT5jb2FsZXNjZV9tb2RlID0gMDsKKworCWlmIChHRVRfQ0hJUF9SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQ0hJUFJFVl81NzAwX0FYICYmCisJICAgIEdFVF9DSElQX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBDSElQUkVWXzU3MDBfQlgpCisJCXRwLT5jb2FsZXNjZV9tb2RlIHw9IEhPU1RDQ19NT0RFXzMyQllURTsKKworCS8qIEluaXRpYWxpemUgTUFDIE1JIG1vZGUsIHBvbGxpbmcgZGlzYWJsZWQuICovCisJdHczMl9mKE1BQ19NSV9NT0RFLCB0cC0+bWlfbW9kZSk7CisJdWRlbGF5KDgwKTsKKworCS8qIEluaXRpYWxpemUgZGF0YS9kZXNjcmlwdG9yIGJ5dGUvd29yZCBzd2FwcGluZy4gKi8KKwl2YWwgPSB0cjMyKEdSQ19NT0RFKTsKKwl2YWwgJj0gR1JDX01PREVfSE9TVF9TVEFDS1VQOworCXR3MzIoR1JDX01PREUsIHZhbCB8IHRwLT5ncmNfbW9kZSk7CisKKwl0ZzNfc3dpdGNoX2Nsb2Nrcyh0cCk7CisKKwkvKiBDbGVhciB0aGlzIG91dCBmb3Igc2FuaXR5LiAqLworCXR3MzIoVEczUENJX01FTV9XSU5fQkFTRV9BRERSLCAwKTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1BDSVNUQVRFLAorCQkJICAgICAgJnBjaV9zdGF0ZV9yZWcpOworCWlmICgocGNpX3N0YXRlX3JlZyAmIFBDSVNUQVRFX0NPTlZfUENJX01PREUpID09IDAgJiYKKwkgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX1RBUkdFVF9IV0JVRykgPT0gMCkgeworCQl1MzIgY2hpcHJldmlkID0gR0VUX0NISVBfUkVWX0lEKHRwLT5taXNjX2hvc3RfY3RybCk7CisKKwkJaWYgKGNoaXByZXZpZCA9PSBDSElQUkVWX0lEXzU3MDFfQTAgfHwKKwkJICAgIGNoaXByZXZpZCA9PSBDSElQUkVWX0lEXzU3MDFfQjAgfHwKKwkJICAgIGNoaXByZXZpZCA9PSBDSElQUkVWX0lEXzU3MDFfQjIgfHwKKwkJICAgIGNoaXByZXZpZCA9PSBDSElQUkVWX0lEXzU3MDFfQjUpIHsKKwkJCXZvaWQgX19pb21lbSAqc3JhbV9iYXNlOworCisJCQkvKiBXcml0ZSBzb21lIGR1bW15IHdvcmRzIGludG8gdGhlIFNSQU0gc3RhdHVzIGJsb2NrCisJCQkgKiBhcmVhLCBzZWUgaWYgaXQgcmVhZHMgYmFjayBjb3JyZWN0bHkuICBJZiB0aGUgcmV0dXJuCisJCQkgKiB2YWx1ZSBpcyBiYWQsIGZvcmNlIGVuYWJsZSB0aGUgUENJWCB3b3JrYXJvdW5kLgorCQkJICovCisJCQlzcmFtX2Jhc2UgPSB0cC0+cmVncyArIE5JQ19TUkFNX1dJTl9CQVNFICsgTklDX1NSQU1fU1RBVFNfQkxLOworCisJCQl3cml0ZWwoMHgwMDAwMDAwMCwgc3JhbV9iYXNlKTsKKwkJCXdyaXRlbCgweDAwMDAwMDAwLCBzcmFtX2Jhc2UgKyA0KTsKKwkJCXdyaXRlbCgweGZmZmZmZmZmLCBzcmFtX2Jhc2UgKyA0KTsKKwkJCWlmIChyZWFkbChzcmFtX2Jhc2UpICE9IDB4MDAwMDAwMDApCisJCQkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19QQ0lYX1RBUkdFVF9IV0JVRzsKKwkJfQorCX0KKworCXVkZWxheSg1MCk7CisJdGczX252cmFtX2luaXQodHApOworCisJZ3JjX21pc2NfY2ZnID0gdHIzMihHUkNfTUlTQ19DRkcpOworCWdyY19taXNjX2NmZyAmPSBHUkNfTUlTQ19DRkdfQk9BUkRfSURfTUFTSzsKKworCS8qIEJyb2FkY29tJ3MgZHJpdmVyIHNheXMgdGhhdCBDSU9CRSBtdWx0aXNwbGl0IGhhcyBhIGJ1ZyAqLworI2lmIDAKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQgJiYKKwkgICAgZ3JjX21pc2NfY2ZnID09IEdSQ19NSVNDX0NGR19CT0FSRF9JRF81NzA0Q0lPQkUpIHsKKwkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19TUExJVF9NT0RFOworCQl0cC0+c3BsaXRfbW9kZV9tYXhfcmVxcyA9IFNQTElUX01PREVfNTcwNF9NQVhfUkVROworCX0KKyNlbmRpZgorCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSAmJgorCSAgICAoZ3JjX21pc2NfY2ZnID09IEdSQ19NSVNDX0NGR19CT0FSRF9JRF81Nzg4IHx8CisJICAgICBncmNfbWlzY19jZmcgPT0gR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3ODhNKSkKKwkJdHAtPnRnM19mbGFnczIgfD0gVEczX0ZMRzJfSVNfNTc4ODsKKworCS8qIHRoZXNlIGFyZSBsaW1pdGVkIHRvIDEwLzEwMCBvbmx5ICovCisJaWYgKChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMyAmJgorCSAgICAgKGdyY19taXNjX2NmZyA9PSAweDgwMDAgfHwgZ3JjX21pc2NfY2ZnID09IDB4NDAwMCkpIHx8CisJICAgIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNSAmJgorCSAgICAgdHAtPnBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0JST0FEQ09NICYmCisJICAgICAodHAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1RJR09OM181OTAxIHx8CisJICAgICAgdHAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1RJR09OM181OTAxXzIgfHwKKwkgICAgICB0cC0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVElHT04zXzU3MDVGKSkgfHwKKwkgICAgKHRwLT5wZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9CUk9BRENPTSAmJgorCSAgICAgKHRwLT5wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9USUdPTjNfNTc1MUYgfHwKKwkgICAgICB0cC0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVElHT04zXzU3NTNGKSkpCisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfMTBfMTAwX09OTFk7CisKKwllcnIgPSB0ZzNfcGh5X3Byb2JlKHRwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiglcykgcGh5IHByb2JlIGZhaWxlZCwgZXJyICVkXG4iLAorCQkgICAgICAgcGNpX25hbWUodHAtPnBkZXYpLCBlcnIpOworCQkvKiAuLi4gYnV0IGRvIG5vdCByZXR1cm4gaW1tZWRpYXRlbHkgLi4uICovCisJfQorCisJdGczX3JlYWRfcGFydG5vKHRwKTsKKworCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMpIHsKKwkJdHAtPnRnM19mbGFncyAmPSB+VEczX0ZMQUdfVVNFX01JX0lOVEVSUlVQVDsKKwl9IGVsc2UgeworCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDApCisJCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1VTRV9NSV9JTlRFUlJVUFQ7CisJCWVsc2UKKwkJCXRwLT50ZzNfZmxhZ3MgJj0gflRHM19GTEFHX1VTRV9NSV9JTlRFUlJVUFQ7CisJfQorCisJLyogNTcwMCB7QVgsQlh9IGNoaXBzIGhhdmUgYSBicm9rZW4gc3RhdHVzIGJsb2NrIGxpbmsKKwkgKiBjaGFuZ2UgYml0IGltcGxlbWVudGF0aW9uLCBzbyB3ZSBtdXN0IHVzZSB0aGUKKwkgKiBzdGF0dXMgcmVnaXN0ZXIgaW4gdGhvc2UgY2FzZXMuCisJICovCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAwKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1VTRV9MSU5LQ0hHX1JFRzsKKwllbHNlCisJCXRwLT50ZzNfZmxhZ3MgJj0gflRHM19GTEFHX1VTRV9MSU5LQ0hHX1JFRzsKKworCS8qIFRoZSBsZWRfY3RybCBpcyBzZXQgZHVyaW5nIHRnM19waHlfcHJvYmUsIGhlcmUgd2UgbWlnaHQKKwkgKiBoYXZlIHRvIGZvcmNlIHRoZSBsaW5rIHN0YXR1cyBwb2xsaW5nIG1lY2hhbmlzbSBiYXNlZAorCSAqIHVwb24gc3Vic3lzdGVtIElEcy4KKwkgKi8KKwlpZiAodHAtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9ERUxMICYmCisJICAgICEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKSkgeworCQl0cC0+dGczX2ZsYWdzIHw9IChURzNfRkxBR19VU0VfTUlfSU5URVJSVVBUIHwKKwkJCQkgIFRHM19GTEFHX1VTRV9MSU5LQ0hHX1JFRyk7CisJfQorCisJLyogRm9yIGFsbCBTRVJERVMgd2UgcG9sbCB0aGUgTUFDIHN0YXR1cyByZWdpc3Rlci4gKi8KKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9QSFlfU0VSREVTKQorCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1BPTExfU0VSREVTOworCWVsc2UKKwkJdHAtPnRnM19mbGFncyAmPSB+VEczX0ZMQUdfUE9MTF9TRVJERVM7CisKKwkvKiA1NzAwIEJYIGNoaXBzIG5lZWQgdG8gaGF2ZSB0aGVpciBUWCBwcm9kdWNlciBpbmRleCBtYWlsYm94ZXMKKwkgKiB3cml0dGVuIHR3aWNlIHRvIHdvcmthcm91bmQgYSBidWcuCisJICovCisJaWYgKEdFVF9DSElQX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBDSElQUkVWXzU3MDBfQlgpCisJCXRwLT50ZzNfZmxhZ3MgfD0gVEczX0ZMQUdfVFhEX01CT1hfSFdCVUc7CisJZWxzZQorCQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19UWERfTUJPWF9IV0JVRzsKKworCS8qIEl0IHNlZW1zIGFsbCBjaGlwcyBjYW4gZ2V0IGNvbmZ1c2VkIGlmIFRYIGJ1ZmZlcnMKKwkgKiBzdHJhZGRsZSB0aGUgNEdCIGFkZHJlc3MgYm91bmRhcnkgaW4gc29tZSBjYXNlcy4KKwkgKi8KKwl0cC0+ZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB0ZzNfc3RhcnRfeG1pdDsKKworCXRwLT5yeF9vZmZzZXQgPSAyOworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMSAmJgorCSAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSVhfTU9ERSkgIT0gMCkKKwkJdHAtPnJ4X29mZnNldCA9IDA7CisKKwkvKiBCeSBkZWZhdWx0LCBkaXNhYmxlIHdha2Utb24tbGFuLiAgVXNlciBjYW4gY2hhbmdlIHRoaXMKKwkgKiB1c2luZyBFVEhUT09MX1NXT0wuCisJICovCisJdHAtPnRnM19mbGFncyAmPSB+VEczX0ZMQUdfV09MX0VOQUJMRTsKKworCXJldHVybiBlcnI7Cit9CisKKyNpZmRlZiBDT05GSUdfU1BBUkM2NAorc3RhdGljIGludCBfX2RldmluaXQgdGczX2dldF9tYWNhZGRyX3NwYXJjKHN0cnVjdCB0ZzMgKnRwKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB0cC0+ZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdHAtPnBkZXY7CisJc3RydWN0IHBjaWRldl9jb29raWUgKnBjcCA9IHBkZXYtPnN5c2RhdGE7CisKKwlpZiAocGNwICE9IE5VTEwpIHsKKwkJaW50IG5vZGUgPSBwY3AtPnByb21fbm9kZTsKKworCQlpZiAocHJvbV9nZXRwcm9wbGVuKG5vZGUsICJsb2NhbC1tYWMtYWRkcmVzcyIpID09IDYpIHsKKwkJCXByb21fZ2V0cHJvcGVydHkobm9kZSwgImxvY2FsLW1hYy1hZGRyZXNzIiwKKwkJCQkJIGRldi0+ZGV2X2FkZHIsIDYpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRnM19nZXRfZGVmYXVsdF9tYWNhZGRyX3NwYXJjKHN0cnVjdCB0ZzMgKnRwKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB0cC0+ZGV2OworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGlkcHJvbS0+aWRfZXRoYWRkciwgNik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmluaXQgdGczX2dldF9kZXZpY2VfYWRkcmVzcyhzdHJ1Y3QgdGczICp0cCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdHAtPmRldjsKKwl1MzIgaGksIGxvLCBtYWNfb2Zmc2V0OworCisjaWZkZWYgQ09ORklHX1NQQVJDNjQKKwlpZiAoIXRnM19nZXRfbWFjYWRkcl9zcGFyYyh0cCkpCisJCXJldHVybiAwOworI2VuZGlmCisKKwltYWNfb2Zmc2V0ID0gMHg3YzsKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQgJiYKKwkgICAgISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMRzJfU1VOXzU3MFgpKSB7CisJCWlmICh0cjMyKFRHM1BDSV9EVUFMX01BQ19DVFJMKSAmIERVQUxfTUFDX0NUUkxfSUQpCisJCQltYWNfb2Zmc2V0ID0gMHhjYzsKKwkJaWYgKHRnM19udnJhbV9sb2NrKHRwKSkKKwkJCXR3MzJfZihOVlJBTV9DTUQsIE5WUkFNX0NNRF9SRVNFVCk7CisJCWVsc2UKKwkJCXRnM19udnJhbV91bmxvY2sodHApOworCX0KKworCS8qIEZpcnN0IHRyeSB0byBnZXQgaXQgZnJvbSBNQUMgYWRkcmVzcyBtYWlsYm94LiAqLworCXRnM19yZWFkX21lbSh0cCwgTklDX1NSQU1fTUFDX0FERFJfSElHSF9NQk9YLCAmaGkpOworCWlmICgoaGkgPj4gMTYpID09IDB4NDg0YikgeworCQlkZXYtPmRldl9hZGRyWzBdID0gKGhpID4+ICA4KSAmIDB4ZmY7CisJCWRldi0+ZGV2X2FkZHJbMV0gPSAoaGkgPj4gIDApICYgMHhmZjsKKworCQl0ZzNfcmVhZF9tZW0odHAsIE5JQ19TUkFNX01BQ19BRERSX0xPV19NQk9YLCAmbG8pOworCQlkZXYtPmRldl9hZGRyWzJdID0gKGxvID4+IDI0KSAmIDB4ZmY7CisJCWRldi0+ZGV2X2FkZHJbM10gPSAobG8gPj4gMTYpICYgMHhmZjsKKwkJZGV2LT5kZXZfYWRkcls0XSA9IChsbyA+PiAgOCkgJiAweGZmOworCQlkZXYtPmRldl9hZGRyWzVdID0gKGxvID4+ICAwKSAmIDB4ZmY7CisJfQorCS8qIE5leHQsIHRyeSBOVlJBTS4gKi8KKwllbHNlIGlmICghKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxHMl9TVU5fNTcwWCkgJiYKKwkJICF0ZzNfbnZyYW1fcmVhZCh0cCwgbWFjX29mZnNldCArIDAsICZoaSkgJiYKKwkJICF0ZzNfbnZyYW1fcmVhZCh0cCwgbWFjX29mZnNldCArIDQsICZsbykpIHsKKwkJZGV2LT5kZXZfYWRkclswXSA9ICgoaGkgPj4gMTYpICYgMHhmZik7CisJCWRldi0+ZGV2X2FkZHJbMV0gPSAoKGhpID4+IDI0KSAmIDB4ZmYpOworCQlkZXYtPmRldl9hZGRyWzJdID0gKChsbyA+PiAgMCkgJiAweGZmKTsKKwkJZGV2LT5kZXZfYWRkclszXSA9ICgobG8gPj4gIDgpICYgMHhmZik7CisJCWRldi0+ZGV2X2FkZHJbNF0gPSAoKGxvID4+IDE2KSAmIDB4ZmYpOworCQlkZXYtPmRldl9hZGRyWzVdID0gKChsbyA+PiAyNCkgJiAweGZmKTsKKwl9CisJLyogRmluYWxseSBqdXN0IGZldGNoIGl0IG91dCBvZiB0aGUgTUFDIGNvbnRyb2wgcmVncy4gKi8KKwllbHNlIHsKKwkJaGkgPSB0cjMyKE1BQ19BRERSXzBfSElHSCk7CisJCWxvID0gdHIzMihNQUNfQUREUl8wX0xPVyk7CisKKwkJZGV2LT5kZXZfYWRkcls1XSA9IGxvICYgMHhmZjsKKwkJZGV2LT5kZXZfYWRkcls0XSA9IChsbyA+PiA4KSAmIDB4ZmY7CisJCWRldi0+ZGV2X2FkZHJbM10gPSAobG8gPj4gMTYpICYgMHhmZjsKKwkJZGV2LT5kZXZfYWRkclsyXSA9IChsbyA+PiAyNCkgJiAweGZmOworCQlkZXYtPmRldl9hZGRyWzFdID0gaGkgJiAweGZmOworCQlkZXYtPmRldl9hZGRyWzBdID0gKGhpID4+IDgpICYgMHhmZjsKKwl9CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoJmRldi0+ZGV2X2FkZHJbMF0pKSB7CisjaWZkZWYgQ09ORklHX1NQQVJDNjQKKwkJaWYgKCF0ZzNfZ2V0X2RlZmF1bHRfbWFjYWRkcl9zcGFyYyh0cCkpCisJCQlyZXR1cm4gMDsKKyNlbmRpZgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRnM19kb190ZXN0X2RtYShzdHJ1Y3QgdGczICp0cCwgdTMyICpidWYsIGRtYV9hZGRyX3QgYnVmX2RtYSwgaW50IHNpemUsIGludCB0b19kZXZpY2UpCit7CisJc3RydWN0IHRnM19pbnRlcm5hbF9idWZmZXJfZGVzYyB0ZXN0X2Rlc2M7CisJdTMyIHNyYW1fZG1hX2Rlc2NzOworCWludCBpLCByZXQ7CisKKwlzcmFtX2RtYV9kZXNjcyA9IE5JQ19TUkFNX0RNQV9ERVNDX1BPT0xfQkFTRTsKKworCXR3MzIoRlRRX1JDVkJEX0NPTVBfRklGT19FTlFERVEsIDApOworCXR3MzIoRlRRX1JDVkRBVEFfQ09NUF9GSUZPX0VOUURFUSwgMCk7CisJdHczMihSRE1BQ19TVEFUVVMsIDApOworCXR3MzIoV0RNQUNfU1RBVFVTLCAwKTsKKworCXR3MzIoQlVGTUdSX01PREUsIDApOworCXR3MzIoRlRRX1JFU0VULCAwKTsKKworCXRlc3RfZGVzYy5hZGRyX2hpID0gKCh1NjQpIGJ1Zl9kbWEpID4+IDMyOworCXRlc3RfZGVzYy5hZGRyX2xvID0gYnVmX2RtYSAmIDB4ZmZmZmZmZmY7CisJdGVzdF9kZXNjLm5pY19tYnVmID0gMHgwMDAwMjEwMDsKKwl0ZXN0X2Rlc2MubGVuID0gc2l6ZTsKKworCS8qCisJICogSFAgWlgxIHdhcyBzZWVpbmcgdGVzdCBmYWlsdXJlcyBmb3IgNTcwMSBjYXJkcyBydW5uaW5nIGF0IDMzTWh6CisJICogdGhlICpzZWNvbmQqIHRpbWUgdGhlIHRnMyBkcml2ZXIgd2FzIGdldHRpbmcgbG9hZGVkIGFmdGVyIGFuCisJICogaW5pdGlhbCBzY2FuLgorCSAqCisJICogQnJvYWRjb20gdGVsbHMgbWU6CisJICogICAuLi50aGUgRE1BIGVuZ2luZSBpcyBjb25uZWN0ZWQgdG8gdGhlIEdSQyBibG9jayBhbmQgYSBETUEKKwkgKiAgIHJlc2V0IG1heSBhZmZlY3QgdGhlIEdSQyBibG9jayBpbiBzb21lIHVucHJlZGljdGFibGUgd2F5Li4uCisJICogICBUaGUgYmVoYXZpb3Igb2YgcmVzZXRzIHRvIGluZGl2aWR1YWwgYmxvY2tzIGhhcyBub3QgYmVlbiB0ZXN0ZWQuCisJICoKKwkgKiBCcm9hZGNvbSBub3RlZCB0aGUgR1JDIHJlc2V0IHdpbGwgYWxzbyByZXNldCBhbGwgc3ViLWNvbXBvbmVudHMuCisJICovCisJaWYgKHRvX2RldmljZSkgeworCQl0ZXN0X2Rlc2MuY3FpZF9zcWlkID0gKDEzIDw8IDgpIHwgMjsKKworCQl0dzMyX2YoUkRNQUNfTU9ERSwgUkRNQUNfTU9ERV9FTkFCTEUpOworCQl1ZGVsYXkoNDApOworCX0gZWxzZSB7CisJCXRlc3RfZGVzYy5jcWlkX3NxaWQgPSAoMTYgPDwgOCkgfCA3OworCisJCXR3MzJfZihXRE1BQ19NT0RFLCBXRE1BQ19NT0RFX0VOQUJMRSk7CisJCXVkZWxheSg0MCk7CisJfQorCXRlc3RfZGVzYy5mbGFncyA9IDB4MDAwMDAwMDU7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZih0ZXN0X2Rlc2MpIC8gc2l6ZW9mKHUzMikpOyBpKyspIHsKKwkJdTMyIHZhbDsKKworCQl2YWwgPSAqKCgodTMyICopJnRlc3RfZGVzYykgKyBpKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01FTV9XSU5fQkFTRV9BRERSLAorCQkJCSAgICAgICBzcmFtX2RtYV9kZXNjcyArIChpICogc2l6ZW9mKHUzMikpKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01FTV9XSU5fREFUQSwgdmFsKTsKKwl9CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01FTV9XSU5fQkFTRV9BRERSLCAwKTsKKworCWlmICh0b19kZXZpY2UpIHsKKwkJdHczMihGVFFfRE1BX0hJR0hfUkVBRF9GSUZPX0VOUURFUSwgc3JhbV9kbWFfZGVzY3MpOworCX0gZWxzZSB7CisJCXR3MzIoRlRRX0RNQV9ISUdIX1dSSVRFX0ZJRk9fRU5RREVRLCBzcmFtX2RtYV9kZXNjcyk7CisJfQorCisJcmV0ID0gLUVOT0RFVjsKKwlmb3IgKGkgPSAwOyBpIDwgNDA7IGkrKykgeworCQl1MzIgdmFsOworCisJCWlmICh0b19kZXZpY2UpCisJCQl2YWwgPSB0cjMyKEZUUV9SQ1ZCRF9DT01QX0ZJRk9fRU5RREVRKTsKKwkJZWxzZQorCQkJdmFsID0gdHIzMihGVFFfUkNWREFUQV9DT01QX0ZJRk9fRU5RREVRKTsKKwkJaWYgKCh2YWwgJiAweGZmZmYpID09IHNyYW1fZG1hX2Rlc2NzKSB7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQl1ZGVsYXkoMTAwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFRFU1RfQlVGRkVSX1NJWkUJMHg0MDAKKworc3RhdGljIGludCBfX2RldmluaXQgdGczX3Rlc3RfZG1hKHN0cnVjdCB0ZzMgKnRwKQoreworCWRtYV9hZGRyX3QgYnVmX2RtYTsKKwl1MzIgKmJ1ZjsKKwlpbnQgcmV0OworCisJYnVmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQodHAtPnBkZXYsIFRFU1RfQlVGRkVSX1NJWkUsICZidWZfZG1hKTsKKwlpZiAoIWJ1ZikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9ub2ZyZWU7CisJfQorCisJdHAtPmRtYV9yd2N0cmwgPSAoKDB4NyA8PCBETUFfUldDVFJMX1BDSV9XUklURV9DTURfU0hJRlQpIHwKKwkJCSAgKDB4NiA8PCBETUFfUldDVFJMX1BDSV9SRUFEX0NNRF9TSElGVCkpOworCisjaWZuZGVmIENPTkZJR19YODYKKwl7CisJCXU4IGJ5dGU7CisJCWludCBjYWNoZWxpbmVfc2l6ZTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUodHAtPnBkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsICZieXRlKTsKKworCQlpZiAoYnl0ZSA9PSAwKQorCQkJY2FjaGVsaW5lX3NpemUgPSAxMDI0OworCQllbHNlCisJCQljYWNoZWxpbmVfc2l6ZSA9IChpbnQpIGJ5dGUgKiA0OworCisJCXN3aXRjaCAoY2FjaGVsaW5lX3NpemUpIHsKKwkJY2FzZSAxNjoKKwkJY2FzZSAzMjoKKwkJY2FzZSA2NDoKKwkJY2FzZSAxMjg6CisJCQlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX01PREUpICYmCisJCQkgICAgISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BDSV9FWFBSRVNTKSkgeworCQkJCXRwLT5kbWFfcndjdHJsIHw9CisJCQkJCURNQV9SV0NUUkxfV1JJVEVfQk5EUllfMzg0X1BDSVg7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUENJX0VYUFJFU1MpIHsKKwkJCQl0cC0+ZG1hX3J3Y3RybCAmPQorCQkJCQl+KERNQV9SV0NUUkxfUENJX1dSSVRFX0NNRCk7CisJCQkJdHAtPmRtYV9yd2N0cmwgfD0KKwkJCQkJRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8xMjhfUENJRTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIGZhbGx0aHJvdWdoICovCisJCWNhc2UgMjU2OgorCQkJaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSVhfTU9ERSkgJiYKKwkJCSAgICAhKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUENJX0VYUFJFU1MpKQorCQkJCXRwLT5kbWFfcndjdHJsIHw9CisJCQkJCURNQV9SV0NUUkxfV1JJVEVfQk5EUllfMjU2OworCQkJZWxzZSBpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BDSV9FWFBSRVNTKSkKKwkJCQl0cC0+ZG1hX3J3Y3RybCB8PQorCQkJCQlETUFfUldDVFJMX1dSSVRFX0JORFJZXzI1Nl9QQ0lYOworCQl9OworCX0KKyNlbmRpZgorCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfUENJX0VYUFJFU1MpIHsKKwkJLyogRE1BIHJlYWQgd2F0ZXJtYXJrIG5vdCB1c2VkIG9uIFBDSUUgKi8KKwkJdHAtPmRtYV9yd2N0cmwgfD0gMHgwMDE4MDAwMDsKKwl9IGVsc2UgaWYgKCEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSVhfTU9ERSkpIHsKKwkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzA1IHx8CisJCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc1MCkKKwkJCXRwLT5kbWFfcndjdHJsIHw9IDB4MDAzZjAwMDA7CisJCWVsc2UKKwkJCXRwLT5kbWFfcndjdHJsIHw9IDB4MDAzZjAwMGY7CisJfSBlbHNlIHsKKwkJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAzIHx8CisJCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCkgeworCQkJdTMyIGNjdmFsID0gKHRyMzIoVEczUENJX0NMT0NLX0NUUkwpICYgMHgxZik7CisKKwkJCWlmIChjY3ZhbCA9PSAweDYgfHwgY2N2YWwgPT0gMHg3KQorCQkJCXRwLT5kbWFfcndjdHJsIHw9IERNQV9SV0NUUkxfT05FX0RNQTsKKworCQkJLyogU2V0IGJpdCAyMyB0byByZW5hYmxlIFBDSVggaHcgYnVnIGZpeCAqLworCQkJdHAtPmRtYV9yd2N0cmwgfD0gMHgwMDlmMDAwMDsKKwkJfSBlbHNlIHsKKwkJCXRwLT5kbWFfcndjdHJsIHw9IDB4MDAxYjAwMGY7CisJCX0KKwl9CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDMgfHwKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDQpCisJCXRwLT5kbWFfcndjdHJsICY9IDB4ZmZmZmZmZjA7CisKKwlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDAgfHwKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDEpIHsKKwkJLyogUmVtb3ZlIHRoaXMgaWYgaXQgY2F1c2VzIHByb2JsZW1zIGZvciBzb21lIGJvYXJkcy4gKi8KKwkJdHAtPmRtYV9yd2N0cmwgfD0gRE1BX1JXQ1RSTF9VU0VfTUVNX1JFQURfTVVMVDsKKworCQkvKiBPbiA1NzAwLzU3MDEgY2hpcHMsIHdlIG5lZWQgdG8gc2V0IHRoaXMgYml0LgorCQkgKiBPdGhlcndpc2UgdGhlIGNoaXAgd2lsbCBpc3N1ZSBjYWNoZWxpbmUgdHJhbnNhY3Rpb25zCisJCSAqIHRvIHN0cmVhbWFibGUgRE1BIG1lbW9yeSB3aXRoIG5vdCBhbGwgdGhlIGJ5dGUKKwkJICogZW5hYmxlcyB0dXJuZWQgb24uICBUaGlzIGlzIGFuIGVycm9yIG9uIHNldmVyYWwKKwkJICogUklTQyBQQ0kgY29udHJvbGxlcnMsIGluIHBhcnRpY3VsYXIgc3BhcmM2NC4KKwkJICoKKwkJICogT24gNTcwMy81NzA0IGNoaXBzLCB0aGlzIGJpdCBoYXMgYmVlbiByZWFzc2lnbmVkCisJCSAqIGEgZGlmZmVyZW50IG1lYW5pbmcuICBJbiBwYXJ0aWN1bGFyLCBpdCBpcyB1c2VkCisJCSAqIG9uIHRob3NlIGNoaXBzIHRvIGVuYWJsZSBhIFBDSS1YIHdvcmthcm91bmQuCisJCSAqLworCQl0cC0+ZG1hX3J3Y3RybCB8PSBETUFfUldDVFJMX0FTU0VSVF9BTExfQkU7CisJfQorCisJdHczMihURzNQQ0lfRE1BX1JXX0NUUkwsIHRwLT5kbWFfcndjdHJsKTsKKworI2lmIDAKKwkvKiBVbm5lZWRlZCwgYWxyZWFkeSBkb25lIGJ5IHRnM19nZXRfaW52YXJpYW50cy4gICovCisJdGczX3N3aXRjaF9jbG9ja3ModHApOworI2VuZGlmCisKKwlyZXQgPSAwOworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwMCAmJgorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTcwMSkKKwkJZ290byBvdXQ7CisKKwl3aGlsZSAoMSkgeworCQl1MzIgKnAgPSBidWYsIGk7CisKKwkJZm9yIChpID0gMDsgaSA8IFRFU1RfQlVGRkVSX1NJWkUgLyBzaXplb2YodTMyKTsgaSsrKQorCQkJcFtpXSA9IGk7CisKKwkJLyogU2VuZCB0aGUgYnVmZmVyIHRvIHRoZSBjaGlwLiAqLworCQlyZXQgPSB0ZzNfZG9fdGVzdF9kbWEodHAsIGJ1ZiwgYnVmX2RtYSwgVEVTVF9CVUZGRVJfU0laRSwgMSk7CisJCWlmIChyZXQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAidGczX3Rlc3RfZG1hKCkgV3JpdGUgdGhlIGJ1ZmZlciBmYWlsZWQgJWRcbiIsIHJldCk7CisJCQlicmVhazsKKwkJfQorCisjaWYgMAorCQkvKiB2YWxpZGF0ZSBkYXRhIHJlYWNoZWQgY2FyZCBSQU0gY29ycmVjdGx5LiAqLworCQlmb3IgKGkgPSAwOyBpIDwgVEVTVF9CVUZGRVJfU0laRSAvIHNpemVvZih1MzIpOyBpKyspIHsKKwkJCXUzMiB2YWw7CisJCQl0ZzNfcmVhZF9tZW0odHAsIDB4MjEwMCArIChpKjQpLCAmdmFsKTsKKwkJCWlmIChsZTMyX3RvX2NwdSh2YWwpICE9IHBbaV0pIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiAgdGczX3Rlc3RfZG1hKCkgIENhcmQgYnVmZmVyIGNvcnJ1cHRlZCBvbiB3cml0ZSEgKCVkICE9ICVkKVxuIiwgdmFsLCBpKTsKKwkJCQkvKiByZXQgPSAtRU5PREVWIGhlcmU/ICovCisJCQl9CisJCQlwW2ldID0gMDsKKwkJfQorI2VuZGlmCisJCS8qIE5vdyByZWFkIGl0IGJhY2suICovCisJCXJldCA9IHRnM19kb190ZXN0X2RtYSh0cCwgYnVmLCBidWZfZG1hLCBURVNUX0JVRkZFUl9TSVpFLCAwKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ0ZzNfdGVzdF9kbWEoKSBSZWFkIHRoZSBidWZmZXIgZmFpbGVkICVkXG4iLCByZXQpOworCisJCQlicmVhazsKKwkJfQorCisJCS8qIFZlcmlmeSBpdC4gKi8KKwkJZm9yIChpID0gMDsgaSA8IFRFU1RfQlVGRkVSX1NJWkUgLyBzaXplb2YodTMyKTsgaSsrKSB7CisJCQlpZiAocFtpXSA9PSBpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoKHRwLT5kbWFfcndjdHJsICYgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV9NQVNLKSA9PQorCQkJICAgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfRElTQUIpIHsKKwkJCQl0cC0+ZG1hX3J3Y3RybCB8PSBETUFfUldDVFJMX1dSSVRFX0JORFJZXzE2OworCQkJCXR3MzIoVEczUENJX0RNQV9SV19DVFJMLCB0cC0+ZG1hX3J3Y3RybCk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX0VSUiAidGczX3Rlc3RfZG1hKCkgYnVmZmVyIGNvcnJ1cHRlZCBvbiByZWFkIGJhY2shICglZCAhPSAlZClcbiIsIHBbaV0sIGkpOworCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCQlpZiAoaSA9PSAoVEVTVF9CVUZGRVJfU0laRSAvIHNpemVvZih1MzIpKSkgeworCQkJLyogU3VjY2Vzcy4gKi8KKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworb3V0OgorCXBjaV9mcmVlX2NvbnNpc3RlbnQodHAtPnBkZXYsIFRFU1RfQlVGRkVSX1NJWkUsIGJ1ZiwgYnVmX2RtYSk7CitvdXRfbm9mcmVlOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB0ZzNfaW5pdF9saW5rX2NvbmZpZyhzdHJ1Y3QgdGczICp0cCkKK3sKKwl0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgPQorCQkoQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB8CisJCSBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwgfAorCQkgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwgfAorCQkgQURWRVJUSVNFRF9BdXRvbmVnIHwgQURWRVJUSVNFRF9NSUkpOworCXRwLT5saW5rX2NvbmZpZy5zcGVlZCA9IFNQRUVEX0lOVkFMSUQ7CisJdHAtPmxpbmtfY29uZmlnLmR1cGxleCA9IERVUExFWF9JTlZBTElEOworCXRwLT5saW5rX2NvbmZpZy5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJbmV0aWZfY2Fycmllcl9vZmYodHAtPmRldik7CisJdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCA9IFNQRUVEX0lOVkFMSUQ7CisJdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPSBEVVBMRVhfSU5WQUxJRDsKKwl0cC0+bGlua19jb25maWcucGh5X2lzX2xvd19wb3dlciA9IDA7CisJdHAtPmxpbmtfY29uZmlnLm9yaWdfc3BlZWQgPSBTUEVFRF9JTlZBTElEOworCXRwLT5saW5rX2NvbmZpZy5vcmlnX2R1cGxleCA9IERVUExFWF9JTlZBTElEOworCXRwLT5saW5rX2NvbmZpZy5vcmlnX2F1dG9uZWcgPSBBVVRPTkVHX0lOVkFMSUQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB0ZzNfaW5pdF9idWZtZ3JfY29uZmlnKHN0cnVjdCB0ZzMgKnRwKQoreworCXRwLT5idWZtZ3JfY29uZmlnLm1idWZfcmVhZF9kbWFfbG93X3dhdGVyID0KKwkJREVGQVVMVF9NQl9SRE1BX0xPV19XQVRFUjsKKwl0cC0+YnVmbWdyX2NvbmZpZy5tYnVmX21hY19yeF9sb3dfd2F0ZXIgPQorCQlERUZBVUxUX01CX01BQ1JYX0xPV19XQVRFUjsKKwl0cC0+YnVmbWdyX2NvbmZpZy5tYnVmX2hpZ2hfd2F0ZXIgPQorCQlERUZBVUxUX01CX0hJR0hfV0FURVI7CisKKwl0cC0+YnVmbWdyX2NvbmZpZy5tYnVmX3JlYWRfZG1hX2xvd193YXRlcl9qdW1ibyA9CisJCURFRkFVTFRfTUJfUkRNQV9MT1dfV0FURVJfSlVNQk87CisJdHAtPmJ1Zm1ncl9jb25maWcubWJ1Zl9tYWNfcnhfbG93X3dhdGVyX2p1bWJvID0KKwkJREVGQVVMVF9NQl9NQUNSWF9MT1dfV0FURVJfSlVNQk87CisJdHAtPmJ1Zm1ncl9jb25maWcubWJ1Zl9oaWdoX3dhdGVyX2p1bWJvID0KKwkJREVGQVVMVF9NQl9ISUdIX1dBVEVSX0pVTUJPOworCisJdHAtPmJ1Zm1ncl9jb25maWcuZG1hX2xvd193YXRlciA9IERFRkFVTFRfRE1BX0xPV19XQVRFUjsKKwl0cC0+YnVmbWdyX2NvbmZpZy5kbWFfaGlnaF93YXRlciA9IERFRkFVTFRfRE1BX0hJR0hfV0FURVI7Cit9CisKK3N0YXRpYyBjaGFyICogX19kZXZpbml0IHRnM19waHlfc3RyaW5nKHN0cnVjdCB0ZzMgKnRwKQoreworCXN3aXRjaCAodHAtPnBoeV9pZCAmIFBIWV9JRF9NQVNLKSB7CisJY2FzZSBQSFlfSURfQkNNNTQwMDoJcmV0dXJuICI1NDAwIjsKKwljYXNlIFBIWV9JRF9CQ001NDAxOglyZXR1cm4gIjU0MDEiOworCWNhc2UgUEhZX0lEX0JDTTU0MTE6CXJldHVybiAiNTQxMSI7CisJY2FzZSBQSFlfSURfQkNNNTcwMToJcmV0dXJuICI1NzAxIjsKKwljYXNlIFBIWV9JRF9CQ001NzAzOglyZXR1cm4gIjU3MDMiOworCWNhc2UgUEhZX0lEX0JDTTU3MDQ6CXJldHVybiAiNTcwNCI7CisJY2FzZSBQSFlfSURfQkNNNTcwNToJcmV0dXJuICI1NzA1IjsKKwljYXNlIFBIWV9JRF9CQ001NzUwOglyZXR1cm4gIjU3NTAiOworCWNhc2UgUEhZX0lEX0JDTTgwMDI6CXJldHVybiAiODAwMi9zZXJkZXMiOworCWNhc2UgMDoJCQlyZXR1cm4gInNlcmRlcyI7CisJZGVmYXVsdDoJCXJldHVybiAidW5rbm93biI7CisJfTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2ICogX19kZXZpbml0IHRnM19maW5kXzU3MDRfcGVlcihzdHJ1Y3QgdGczICp0cCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGVlcjsKKwl1bnNpZ25lZCBpbnQgZnVuYywgZGV2bnIgPSB0cC0+cGRldi0+ZGV2Zm4gJiB+NzsKKworCWZvciAoZnVuYyA9IDA7IGZ1bmMgPCA4OyBmdW5jKyspIHsKKwkJcGVlciA9IHBjaV9nZXRfc2xvdCh0cC0+cGRldi0+YnVzLCBkZXZuciB8IGZ1bmMpOworCQlpZiAocGVlciAmJiBwZWVyICE9IHRwLT5wZGV2KQorCQkJYnJlYWs7CisJCXBjaV9kZXZfcHV0KHBlZXIpOworCX0KKwlpZiAoIXBlZXIgfHwgcGVlciA9PSB0cC0+cGRldikKKwkJQlVHKCk7CisKKwkvKgorCSAqIFdlIGRvbid0IG5lZWQgdG8ga2VlcCB0aGUgcmVmY291bnQgZWxldmF0ZWQ7IHRoZXJlJ3Mgbm8gd2F5CisJICogdG8gcmVtb3ZlIG9uZSBoYWxmIG9mIHRoaXMgZGV2aWNlIHdpdGhvdXQgcmVtb3ZpbmcgdGhlIG90aGVyCisJICovCisJcGNpX2Rldl9wdXQocGVlcik7CisKKwlyZXR1cm4gcGVlcjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgdGczX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdGF0aWMgaW50IHRnM192ZXJzaW9uX3ByaW50ZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgdGczcmVnX2Jhc2UsIHRnM3JlZ19sZW47CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgdGczICp0cDsKKwlpbnQgaSwgZXJyLCBwY2lfdXNpbmdfZGFjLCBwbV9jYXA7CisKKwlpZiAodGczX3ZlcnNpb25fcHJpbnRlZCsrID09IDApCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBlbmFibGUgUENJIGRldmljZSwgIgorCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApICYgSU9SRVNPVVJDRV9NRU0pKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBmaW5kIHByb3BlciBQQ0kgZGV2aWNlICIKKwkJICAgICAgICJiYXNlIGFkZHJlc3MsIGFib3J0aW5nLlxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9kaXNhYmxlX3BkZXY7CisJfQorCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTU9EVUxFX05BTUUpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IG9idGFpbiBQQ0kgcmVzb3VyY2VzLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGVfcGRldjsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCS8qIEZpbmQgcG93ZXItbWFuYWdlbWVudCBjYXBhYmlsaXR5LiAqLworCXBtX2NhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9QTSk7CisJaWYgKHBtX2NhcCA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBmaW5kIFBvd2VyTWFuYWdlbWVudCBjYXBhYmlsaXR5LCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCX0KKworCS8qIENvbmZpZ3VyZSBETUEgYXR0cmlidXRlcy4gKi8KKwllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCk7CisJaWYgKCFlcnIpIHsKKwkJcGNpX3VzaW5nX2RhYyA9IDE7CisJCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmZmZmZmZmZmZVTEwpOworCQlpZiAoZXJyIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIG9idGFpbiA2NCBiaXQgRE1BICIKKwkJCSAgICAgICAiZm9yIGNvbnNpc3RlbnQgYWxsb2NhdGlvbnNcbiIpOworCQkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCQl9CisJfSBlbHNlIHsKKwkJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmVUxMKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uLCAiCisJCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJCX0KKwkJcGNpX3VzaW5nX2RhYyA9IDA7CisJfQorCisJdGczcmVnX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJdGczcmVnX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKnRwKSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRXRoZXJkZXYgYWxsb2MgZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlpZiAocGNpX3VzaW5nX2RhYykKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0xMVFg7CisjaWYgVEczX1ZMQU5fVEFHX1VTRUQKKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9UWCB8IE5FVElGX0ZfSFdfVkxBTl9SWDsKKwlkZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPSB0ZzNfdmxhbl9yeF9yZWdpc3RlcjsKKwlkZXYtPnZsYW5fcnhfa2lsbF92aWQgPSB0ZzNfdmxhbl9yeF9raWxsX3ZpZDsKKyNlbmRpZgorCisJdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXRwLT5wZGV2ID0gcGRldjsKKwl0cC0+ZGV2ID0gZGV2OworCXRwLT5wbV9jYXAgPSBwbV9jYXA7CisJdHAtPm1hY19tb2RlID0gVEczX0RFRl9NQUNfTU9ERTsKKwl0cC0+cnhfbW9kZSA9IFRHM19ERUZfUlhfTU9ERTsKKwl0cC0+dHhfbW9kZSA9IFRHM19ERUZfVFhfTU9ERTsKKwl0cC0+bWlfbW9kZSA9IE1BQ19NSV9NT0RFX0JBU0U7CisJaWYgKHRnM19kZWJ1ZyA+IDApCisJCXRwLT5tc2dfZW5hYmxlID0gdGczX2RlYnVnOworCWVsc2UKKwkJdHAtPm1zZ19lbmFibGUgPSBURzNfREVGX01TR19FTkFCTEU7CisKKwkvKiBUaGUgd29yZC9ieXRlIHN3YXAgY29udHJvbHMgaGVyZSBjb250cm9sIHJlZ2lzdGVyIGFjY2VzcyBieXRlCisJICogc3dhcHBpbmcuICBETUEgZGF0YSBieXRlIHN3YXBwaW5nIGlzIGNvbnRyb2xsZWQgaW4gdGhlIEdSQ19NT0RFCisJICogc2V0dGluZyBiZWxvdy4KKwkgKi8KKwl0cC0+bWlzY19ob3N0X2N0cmwgPQorCQlNSVNDX0hPU1RfQ1RSTF9NQVNLX1BDSV9JTlQgfAorCQlNSVNDX0hPU1RfQ1RSTF9XT1JEX1NXQVAgfAorCQlNSVNDX0hPU1RfQ1RSTF9JTkRJUl9BQ0NFU1MgfAorCQlNSVNDX0hPU1RfQ1RSTF9QQ0lTVEFURV9SVzsKKworCS8qIFRoZSBOT05GUk0gKG5vbi1mcmFtZSkgYnl0ZS93b3JkIHN3YXAgY29udHJvbHMgdGFrZSBlZmZlY3QKKwkgKiBvbiBkZXNjcmlwdG9yIGVudHJpZXMsIGFueXRoaW5nIHdoaWNoIGlzbid0IHBhY2tldCBkYXRhLgorCSAqCisJICogVGhlIFN0cm9uZ0FSTSBjaGlwcyBvbiB0aGUgYm9hcmQgKG9uZSBmb3IgdHgsIG9uZSBmb3IgcngpCisJICogYXJlIHJ1bm5pbmcgaW4gYmlnLWVuZGlhbiBtb2RlLgorCSAqLworCXRwLT5ncmNfbW9kZSA9IChHUkNfTU9ERV9XU1dBUF9EQVRBIHwgR1JDX01PREVfQlNXQVBfREFUQSB8CisJCQlHUkNfTU9ERV9XU1dBUF9OT05GUk1fREFUQSk7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJdHAtPmdyY19tb2RlIHw9IEdSQ19NT0RFX0JTV0FQX05PTkZSTV9EQVRBOworI2VuZGlmCisJc3Bpbl9sb2NrX2luaXQoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmdHAtPnR4X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZ0cC0+aW5kaXJlY3RfbG9jayk7CisJSU5JVF9XT1JLKCZ0cC0+cmVzZXRfdGFzaywgdGczX3Jlc2V0X3Rhc2ssIHRwKTsKKworCXRwLT5yZWdzID0gaW9yZW1hcF9ub2NhY2hlKHRnM3JlZ19iYXNlLCB0ZzNyZWdfbGVuKTsKKwlpZiAodHAtPnJlZ3MgPT0gMFVMKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBtYXAgZGV2aWNlIHJlZ2lzdGVycywgIgorCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9mcmVlX2RldjsKKwl9CisKKwl0ZzNfaW5pdF9saW5rX2NvbmZpZyh0cCk7CisKKwl0ZzNfaW5pdF9idWZtZ3JfY29uZmlnKHRwKTsKKworCXRwLT5yeF9wZW5kaW5nID0gVEczX0RFRl9SWF9SSU5HX1BFTkRJTkc7CisJdHAtPnJ4X2p1bWJvX3BlbmRpbmcgPSBURzNfREVGX1JYX0pVTUJPX1JJTkdfUEVORElORzsKKwl0cC0+dHhfcGVuZGluZyA9IFRHM19ERUZfVFhfUklOR19QRU5ESU5HOworCisJZGV2LT5vcGVuID0gdGczX29wZW47CisJZGV2LT5zdG9wID0gdGczX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gdGczX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHRnM19zZXRfcnhfbW9kZTsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IHRnM19zZXRfbWFjX2FkZHI7CisJZGV2LT5kb19pb2N0bCA9IHRnM19pb2N0bDsKKwlkZXYtPnR4X3RpbWVvdXQgPSB0ZzNfdHhfdGltZW91dDsKKwlkZXYtPnBvbGwgPSB0ZzNfcG9sbDsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJnRnM19ldGh0b29sX29wczsKKwlkZXYtPndlaWdodCA9IDY0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBURzNfVFhfVElNRU9VVDsKKwlkZXYtPmNoYW5nZV9tdHUgPSB0ZzNfY2hhbmdlX210dTsKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gdGczX3BvbGxfY29udHJvbGxlcjsKKyNlbmRpZgorCisJZXJyID0gdGczX2dldF9pbnZhcmlhbnRzKHRwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlByb2JsZW0gZmV0Y2hpbmcgaW52YXJpYW50cyBvZiBjaGlwLCAiCisJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKKwkJZ290byBlcnJfb3V0X2lvdW5tYXA7CisJfQorCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfNTcwNV9QTFVTKSB7CisJCXRwLT5idWZtZ3JfY29uZmlnLm1idWZfcmVhZF9kbWFfbG93X3dhdGVyID0KKwkJCURFRkFVTFRfTUJfUkRNQV9MT1dfV0FURVJfNTcwNTsKKwkJdHAtPmJ1Zm1ncl9jb25maWcubWJ1Zl9tYWNfcnhfbG93X3dhdGVyID0KKwkJCURFRkFVTFRfTUJfTUFDUlhfTE9XX1dBVEVSXzU3MDU7CisJCXRwLT5idWZtZ3JfY29uZmlnLm1idWZfaGlnaF93YXRlciA9CisJCQlERUZBVUxUX01CX0hJR0hfV0FURVJfNTcwNTsKKwl9CisKKyNpZiBURzNfVFNPX1NVUFBPUlQgIT0gMAorCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0hXX1RTTykgeworCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9UU09fQ0FQQUJMRTsKKwl9CisJZWxzZSBpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDAgfHwKKwkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDEgfHwKKwkgICAgdHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDVfQTAgfHwKKwkgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19FTkFCTEVfQVNGKSAhPSAwKSB7CisJCXRwLT50ZzNfZmxhZ3MyICY9IH5URzNfRkxHMl9UU09fQ0FQQUJMRTsKKwl9IGVsc2UgeworCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9UU09fQ0FQQUJMRTsKKwl9CisKKwkvKiBUU08gaXMgb2ZmIGJ5IGRlZmF1bHQsIHVzZXIgY2FuIGVuYWJsZSB1c2luZyBldGh0b29sLiAgKi8KKyNpZiAwCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfVFNPX0NBUEFCTEUpCisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087CisjZW5kaWYKKworI2VuZGlmCisKKwlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDVfQTEgJiYKKwkgICAgISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1RTT19DQVBBQkxFKSAmJgorCSAgICAhKHRyMzIoVEczUENJX1BDSVNUQVRFKSAmIFBDSVNUQVRFX0JVU19TUEVFRF9ISUdIKSkgeworCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9NQVhfUlhQRU5EXzY0OworCQl0cC0+cnhfcGVuZGluZyA9IDYzOworCX0KKworCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwNCkKKwkJdHAtPnBkZXZfcGVlciA9IHRnM19maW5kXzU3MDRfcGVlcih0cCk7CisKKwllcnIgPSB0ZzNfZ2V0X2RldmljZV9hZGRyZXNzKHRwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNvdWxkIG5vdCBvYnRhaW4gdmFsaWQgZXRoZXJuZXQgYWRkcmVzcywgIgorCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCS8qCisJICogUmVzZXQgY2hpcCBpbiBjYXNlIFVOREkgb3IgRUZJIGRyaXZlciBkaWQgbm90IHNodXRkb3duCisJICogRE1BIHNlbGYgdGVzdCB3aWxsIGVuYWJsZSBXRE1BQyBhbmQgd2UnbGwgc2VlIChzcHVyaW91cykKKwkgKiBwZW5kaW5nIERNQSBvbiB0aGUgUENJIGJ1cyBhdCB0aGF0IHBvaW50LgorCSAqLworCWlmICgodHIzMihIT1NUQ0NfTU9ERSkgJiBIT1NUQ0NfTU9ERV9FTkFCTEUpIHx8CisJICAgICh0cjMyKFdETUFDX01PREUpICYgV0RNQUNfTU9ERV9FTkFCTEUpKSB7CisJCXBjaV9zYXZlX3N0YXRlKHRwLT5wZGV2KTsKKwkJdHczMihNRU1BUkJfTU9ERSwgTUVNQVJCX01PREVfRU5BQkxFKTsKKwkJdGczX2hhbHQodHApOworCX0KKworCWVyciA9IHRnM190ZXN0X2RtYSh0cCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJETUEgZW5naW5lIHRlc3QgZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKKwl9CisKKwkvKiBUaWdvbjMgY2FuIGRvIGlwdjQgb25seS4uLiBhbmQgc29tZSBjaGlwcyBoYXZlIGJ1Z2d5CisJICogY2hlY2tzdW1taW5nLgorCSAqLworCWlmICgodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0JST0tFTl9DSEVDS1NVTVMpID09IDApIHsKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNOworCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1JYX0NIRUNLU1VNUzsKKwl9IGVsc2UKKwkJdHAtPnRnM19mbGFncyAmPSB+VEczX0ZMQUdfUlhfQ0hFQ0tTVU1TOworCisJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSVNfNTc4OCkKKwkJZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9ISUdIRE1BOworCisJLyogZmxvdyBjb250cm9sIGF1dG9uZWdvdGlhdGlvbiBpcyBkZWZhdWx0IGJlaGF2aW9yICovCisJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19QQVVTRV9BVVRPTkVHOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZSwgIgorCQkgICAgICAgImFib3J0aW5nLlxuIik7CisJCWdvdG8gZXJyX291dF9pb3VubWFwOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJLyogTm93IHRoYXQgd2UgaGF2ZSBmdWxseSBzZXR1cCB0aGUgY2hpcCwgc2F2ZSBhd2F5IGEgc25hcHNob3QKKwkgKiBvZiB0aGUgUENJIGNvbmZpZyBzcGFjZS4gIFdlIG5lZWQgdG8gcmVzdG9yZSB0aGlzIGFmdGVyCisJICogR1JDX01JU0NfQ0ZHIGNvcmUgY2xvY2sgcmVzZXRzIGFuZCBzb21lIHJlc3VtZSBldmVudHMuCisJICovCisJcGNpX3NhdmVfc3RhdGUodHAtPnBkZXYpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRpZ29uMyBbcGFydG5vKCVzKSByZXYgJTA0eCBQSFkoJXMpXSAoUENJJXM6JXM6JXMpICVzQmFzZVQgRXRoZXJuZXQgIiwKKwkgICAgICAgZGV2LT5uYW1lLAorCSAgICAgICB0cC0+Ym9hcmRfcGFydF9udW1iZXIsCisJICAgICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQsCisJICAgICAgIHRnM19waHlfc3RyaW5nKHRwKSwKKwkgICAgICAgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSA/ICJYIiA6ICIiKSwKKwkgICAgICAgKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJX0hJR0hfU1BFRUQpID8KKwkJKCh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUENJWF9NT0RFKSA/ICIxMzNNSHoiIDogIjY2TUh6IikgOgorCQkoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX01PREUpID8gIjEwME1IeiIgOiAiMzNNSHoiKSksCisJICAgICAgICgodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1BDSV8zMkJJVCkgPyAiMzItYml0IiA6ICI2NC1iaXQiKSwKKwkgICAgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR18xMF8xMDBfT05MWSkgPyAiMTAvMTAwIiA6ICIxMC8xMDAvMTAwMCIpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlMi4yeCVjIiwgZGV2LT5kZXZfYWRkcltpXSwKKwkJICAgICAgIGkgPT0gNSA/ICdcbicgOiAnOicpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJYY3N1bXNbJWRdIExpbmtDaGdSRUdbJWRdICIKKwkgICAgICAgIk1JaXJxWyVkXSBBU0ZbJWRdIFNwbGl0WyVkXSBXaXJlU3BlZWRbJWRdICIKKwkgICAgICAgIlRTT2NhcFslZF0gXG4iLAorCSAgICAgICBkZXYtPm5hbWUsCisJICAgICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfUlhfQ0hFQ0tTVU1TKSAhPSAwLAorCSAgICAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1VTRV9MSU5LQ0hHX1JFRykgIT0gMCwKKwkgICAgICAgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19VU0VfTUlfSU5URVJSVVBUKSAhPSAwLAorCSAgICAgICAodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX0VOQUJMRV9BU0YpICE9IDAsCisJICAgICAgICh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfU1BMSVRfTU9ERSkgIT0gMCwKKwkgICAgICAgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfTk9fRVRIX1dJUkVfU1BFRUQpID09IDAsCisJICAgICAgICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1RTT19DQVBBQkxFKSAhPSAwKTsKKworCXJldHVybiAwOworCitlcnJfb3V0X2lvdW5tYXA6CisJaW91bm1hcCh0cC0+cmVncyk7CisKK2Vycl9vdXRfZnJlZV9kZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKKworZXJyX291dF9mcmVlX3JlczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCitlcnJfb3V0X2Rpc2FibGVfcGRldjoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB0ZzNfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGRldikgeworCQlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJaW91bm1hcCh0cC0+cmVncyk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCX0KK30KKworc3RhdGljIGludCB0ZzNfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnI7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIDA7CisKKwl0ZzNfbmV0aWZfc3RvcCh0cCk7CisKKwlkZWxfdGltZXJfc3luYygmdHAtPnRpbWVyKTsKKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKwl0ZzNfZGlzYWJsZV9pbnRzKHRwKTsKKwlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCisJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCXRnM19oYWx0KHRwKTsKKwlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCisJZXJyID0gdGczX3NldF9wb3dlcl9zdGF0ZSh0cCwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOworCWlmIChlcnIpIHsKKwkJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCQlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKworCQl0ZzNfaW5pdF9odyh0cCk7CisKKwkJdHAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgdHAtPnRpbWVyX29mZnNldDsKKwkJYWRkX3RpbWVyKCZ0cC0+dGltZXIpOworCisJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwkJdGczX25ldGlmX3N0YXJ0KHRwKTsKKworCQlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCQlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHRnM19yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gMDsKKworCXBjaV9yZXN0b3JlX3N0YXRlKHRwLT5wZGV2KTsKKworCWVyciA9IHRnM19zZXRfcG93ZXJfc3RhdGUodHAsIDApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisKKwlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisKKwl0ZzNfaW5pdF9odyh0cCk7CisKKwl0cC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyB0cC0+dGltZXJfb2Zmc2V0OworCWFkZF90aW1lcigmdHAtPnRpbWVyKTsKKworCXRnM19lbmFibGVfaW50cyh0cCk7CisKKwl0ZzNfbmV0aWZfc3RhcnQodHApOworCisJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdGczX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUlZfTU9EVUxFX05BTUUsCisJLmlkX3RhYmxlCT0gdGczX3BjaV90YmwsCisJLnByb2JlCQk9IHRnM19pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHRnM19yZW1vdmVfb25lKSwKKwkuc3VzcGVuZAk9IHRnM19zdXNwZW5kLAorCS5yZXN1bWUJCT0gdGczX3Jlc3VtZQorfTsKKworc3RhdGljIGludCBfX2luaXQgdGczX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZ0ZzNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRnM19jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ0ZzNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodGczX2luaXQpOworbW9kdWxlX2V4aXQodGczX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGczLmggYi9kcml2ZXJzL25ldC90ZzMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDg4ODdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdGczLmgKQEAgLTAsMCArMSwyMjA2IEBACisvKiAkSWQ6IHRnMy5oLHYgMS4zNy4yLjMyIDIwMDIvMDMvMTEgMTI6MTg6MTggZGF2ZW0gRXhwICQKKyAqIHRnMy5oOiBEZWZpbml0aW9ucyBmb3IgQnJvYWRjb20gVGlnb24zIGV0aGVybmV0IGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAxIEplZmYgR2FyemlrIChqZ2FyemlrQHBvYm94LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwNCBTdW4gTWljcm9zeXN0ZW1zIEluYy4KKyAqLworCisjaWZuZGVmIF9UM19ICisjZGVmaW5lIF9UM19ICisKKyNkZWZpbmUgVEczXzY0QklUX1JFR19ISUdICQkweDAwVUwKKyNkZWZpbmUgVEczXzY0QklUX1JFR19MT1cJCTB4MDRVTAorCisvKiBEZXNjcmlwdG9yIGJsb2NrIGluZm8uICovCisjZGVmaW5lIFRHM19CRElORk9fSE9TVF9BRERSCQkweDBVTCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgVEczX0JESU5GT19NQVhMRU5fRkxBR1MJCTB4OFVMIC8qIDMyLWJpdCAqLworI2RlZmluZSAgQkRJTkZPX0ZMQUdTX1VTRV9FWFRfUkVDVgkgMHgwMDAwMDAwMSAvKiBleHQgcnhfYnVmZmVyX2Rlc2MgKi8KKyNkZWZpbmUgIEJESU5GT19GTEFHU19ESVNBQkxFRAkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIEJESU5GT19GTEFHU19NQVhMRU5fTUFTSwkgMHhmZmZmMDAwMAorI2RlZmluZSAgQkRJTkZPX0ZMQUdTX01BWExFTl9TSElGVAkgMTYKKyNkZWZpbmUgVEczX0JESU5GT19OSUNfQUREUgkJMHhjVUwgLyogMzItYml0ICovCisjZGVmaW5lIFRHM19CRElORk9fU0laRQkJCTB4MTBVTAorCisjZGVmaW5lIFJYX0NPUFlfVEhSRVNIT0xEICAJCTI1NgorCisjZGVmaW5lIFJYX1NURF9NQVhfU0laRQkJCTE1MzYKKyNkZWZpbmUgUlhfU1REX01BWF9TSVpFXzU3MDUJCTUxMgorI2RlZmluZSBSWF9KVU1CT19NQVhfU0laRQkJMHhkZWFkYmVlZiAvKiBYWFggKi8KKworLyogRmlyc3QgMjU2IGJ5dGVzIGFyZSBhIG1pcnJvciBvZiBQQ0kgY29uZmlnIHNwYWNlLiAqLworI2RlZmluZSBURzNQQ0lfVkVORE9SCQkJMHgwMDAwMDAwMAorI2RlZmluZSAgVEczUENJX1ZFTkRPUl9CUk9BRENPTQkJIDB4MTRlNAorI2RlZmluZSBURzNQQ0lfREVWSUNFCQkJMHgwMDAwMDAwMgorI2RlZmluZSAgVEczUENJX0RFVklDRV9USUdPTjNfMQkJIDB4MTY0NCAvKiBCQ001NzAwICovCisjZGVmaW5lICBURzNQQ0lfREVWSUNFX1RJR09OM18yCQkgMHgxNjQ1IC8qIEJDTTU3MDEgKi8KKyNkZWZpbmUgIFRHM1BDSV9ERVZJQ0VfVElHT04zXzMJCSAweDE2NDYgLyogQkNNNTcwMiAqLworI2RlZmluZSAgVEczUENJX0RFVklDRV9USUdPTjNfNAkJIDB4MTY0NyAvKiBCQ001NzAzICovCisjZGVmaW5lIFRHM1BDSV9DT01NQU5ECQkJMHgwMDAwMDAwNAorI2RlZmluZSBURzNQQ0lfU1RBVFVTCQkJMHgwMDAwMDAwNgorI2RlZmluZSBURzNQQ0lfQ0NSRVZJRAkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgVEczUENJX0NBQ0hFTElORVNaCQkweDAwMDAwMDBjCisjZGVmaW5lIFRHM1BDSV9MQVRUSU1FUgkJCTB4MDAwMDAwMGQKKyNkZWZpbmUgVEczUENJX0hFQURFUlRZUEUJCTB4MDAwMDAwMGUKKyNkZWZpbmUgVEczUENJX0JJU1QJCQkweDAwMDAwMDBmCisjZGVmaW5lIFRHM1BDSV9CQVNFMF9MT1cJCTB4MDAwMDAwMTAKKyNkZWZpbmUgVEczUENJX0JBU0UwX0hJR0gJCTB4MDAwMDAwMTQKKy8qIDB4MTggLS0+IDB4MmMgdW51c2VkICovCisjZGVmaW5lIFRHM1BDSV9TVUJTWVNWRU5JRAkJMHgwMDAwMDAyYworI2RlZmluZSBURzNQQ0lfU1VCU1lTSUQJCQkweDAwMDAwMDJlCisjZGVmaW5lIFRHM1BDSV9ST01BRERSCQkJMHgwMDAwMDAzMAorI2RlZmluZSBURzNQQ0lfQ0FQTElTVAkJCTB4MDAwMDAwMzQKKy8qIDB4MzUgLS0+IDB4M2MgdW51c2VkICovCisjZGVmaW5lIFRHM1BDSV9JUlFfTElORQkJCTB4MDAwMDAwM2MKKyNkZWZpbmUgVEczUENJX0lSUV9QSU4JCQkweDAwMDAwMDNkCisjZGVmaW5lIFRHM1BDSV9NSU5fR05UCQkJMHgwMDAwMDAzZQorI2RlZmluZSBURzNQQ0lfTUFYX0xBVAkJCTB4MDAwMDAwM2YKKyNkZWZpbmUgVEczUENJX1hfQ0FQUwkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgIFBDSVhfQ0FQU19SRUxBWEVEX09SREVSSU5HCSAweDAwMDIwMDAwCisjZGVmaW5lICBQQ0lYX0NBUFNfU1BMSVRfTUFTSwkJIDB4MDA3MDAwMDAKKyNkZWZpbmUgIFBDSVhfQ0FQU19TUExJVF9TSElGVAkJIDIwCisjZGVmaW5lICBQQ0lYX0NBUFNfQlVSU1RfTUFTSwkJIDB4MDAwYzAwMDAKKyNkZWZpbmUgIFBDSVhfQ0FQU19CVVJTVF9TSElGVAkJIDE4CisjZGVmaW5lICBQQ0lYX0NBUFNfTUFYX0JVUlNUX0NQSU9CCSAyCisjZGVmaW5lIFRHM1BDSV9QTV9DQVBfUFRSCQkweDAwMDAwMDQxCisjZGVmaW5lIFRHM1BDSV9YX0NPTU1BTkQJCTB4MDAwMDAwNDIKKyNkZWZpbmUgVEczUENJX1hfU1RBVFVTCQkJMHgwMDAwMDA0NAorI2RlZmluZSBURzNQQ0lfUE1fQ0FQX0lECQkweDAwMDAwMDQ4CisjZGVmaW5lIFRHM1BDSV9WUERfQ0FQX1BUUgkJMHgwMDAwMDA0OQorI2RlZmluZSBURzNQQ0lfUE1fQ0FQUwkJCTB4MDAwMDAwNGEKKyNkZWZpbmUgVEczUENJX1BNX0NUUkxfU1RBVAkJMHgwMDAwMDA0YworI2RlZmluZSBURzNQQ0lfQlJfU1VQUF9FWFQJCTB4MDAwMDAwNGUKKyNkZWZpbmUgVEczUENJX1BNX0RBVEEJCQkweDAwMDAwMDRmCisjZGVmaW5lIFRHM1BDSV9WUERfQ0FQX0lECQkweDAwMDAwMDUwCisjZGVmaW5lIFRHM1BDSV9NU0lfQ0FQX1BUUgkJMHgwMDAwMDA1MQorI2RlZmluZSBURzNQQ0lfVlBEX0FERFJfRkxBRwkJMHgwMDAwMDA1MgorI2RlZmluZSAgVlBEX0FERFJfRkxBR19XUklURQkJMHgwMDAwODAwMAorI2RlZmluZSBURzNQQ0lfVlBEX0RBVEEJCQkweDAwMDAwMDU0CisjZGVmaW5lIFRHM1BDSV9NU0lfQ0FQX0lECQkweDAwMDAwMDU4CisjZGVmaW5lIFRHM1BDSV9OWFRfQ0FQX1BUUgkJMHgwMDAwMDA1OQorI2RlZmluZSBURzNQQ0lfTVNJX0NUUkwJCQkweDAwMDAwMDVhCisjZGVmaW5lIFRHM1BDSV9NU0lfQUREUl9MT1cJCTB4MDAwMDAwNWMKKyNkZWZpbmUgVEczUENJX01TSV9BRERSX0hJR0gJCTB4MDAwMDAwNjAKKyNkZWZpbmUgVEczUENJX01TSV9EQVRBCQkJMHgwMDAwMDA2NAorLyogMHg2NiAtLT4gMHg2OCB1bnVzZWQgKi8KKyNkZWZpbmUgVEczUENJX01JU0NfSE9TVF9DVFJMCQkweDAwMDAwMDY4CisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9DTEVBUl9JTlQJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX01BU0tfUENJX0lOVAkgMHgwMDAwMDAwMgorI2RlZmluZSAgTUlTQ19IT1NUX0NUUkxfQllURV9TV0FQCSAweDAwMDAwMDA0CisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9XT1JEX1NXQVAJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX1BDSVNUQVRFX1JXCSAweDAwMDAwMDEwCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9DTEtSRUdfUlcJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIE1JU0NfSE9TVF9DVFJMX1JFR1dPUkRfU1dBUAkgMHgwMDAwMDA0MAorI2RlZmluZSAgTUlTQ19IT1NUX0NUUkxfSU5ESVJfQUNDRVNTCSAweDAwMDAwMDgwCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9JUlFfTUFTS19NT0RFCSAweDAwMDAwMTAwCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9UQUdHRURfU1RBVFVTCSAweDAwMDAwMjAwCisjZGVmaW5lICBNSVNDX0hPU1RfQ1RSTF9DSElQUkVWCQkgMHhmZmZmMDAwMAorI2RlZmluZSAgTUlTQ19IT1NUX0NUUkxfQ0hJUFJFVl9TSElGVAkgMTYKKyNkZWZpbmUgIEdFVF9DSElQX1JFVl9JRChNSVNDX0hPU1RfQ1RSTCkgXAorCSAoKChNSVNDX0hPU1RfQ1RSTCkgJiBNSVNDX0hPU1RfQ1RSTF9DSElQUkVWKSA+PiBcCisJICBNSVNDX0hPU1RfQ1RSTF9DSElQUkVWX1NISUZUKQorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAwX0EwCQkgMHg3MDAwCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDBfQTEJCSAweDcwMDEKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMF9CMAkJIDB4NzEwMAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAwX0IxCQkgMHg3MTAxCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDBfQjMJCSAweDcxMDIKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMF9BTFRJTUEJCSAweDcxMDQKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMF9DMAkJIDB4NzIwMAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAxX0EwCQkgMHgwMDAwCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDFfQjAJCSAweDAxMDAKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwMV9CMgkJIDB4MDEwMgorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAxX0I1CQkgMHgwMTA1CisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDNfQTAJCSAweDEwMDAKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwM19BMQkJIDB4MTAwMQorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzAzX0EyCQkgMHgxMDAyCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDNfQTMJCSAweDEwMDMKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwNF9BMAkJIDB4MjAwMAorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzA0X0ExCQkgMHgyMDAxCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDRfQTIJCSAweDIwMDIKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwNF9BMwkJIDB4MjAwMworI2RlZmluZSAgQ0hJUFJFVl9JRF81NzA1X0EwCQkgMHgzMDAwCisjZGVmaW5lICBDSElQUkVWX0lEXzU3MDVfQTEJCSAweDMwMDEKKyNkZWZpbmUgIENISVBSRVZfSURfNTcwNV9BMgkJIDB4MzAwMgorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzA1X0EzCQkgMHgzMDAzCisjZGVmaW5lICBDSElQUkVWX0lEXzU3NTBfQTAJCSAweDQwMDAKKyNkZWZpbmUgIENISVBSRVZfSURfNTc1MF9BMQkJIDB4NDAwMQorI2RlZmluZSAgQ0hJUFJFVl9JRF81NzUwX0EzCQkgMHg0MDAzCisjZGVmaW5lICBHRVRfQVNJQ19SRVYoQ0hJUF9SRVZfSUQpCSgoQ0hJUF9SRVZfSUQpID4+IDEyKQorI2RlZmluZSAgIEFTSUNfUkVWXzU3MDAJCQkgMHgwNworI2RlZmluZSAgIEFTSUNfUkVWXzU3MDEJCQkgMHgwMAorI2RlZmluZSAgIEFTSUNfUkVWXzU3MDMJCQkgMHgwMQorI2RlZmluZSAgIEFTSUNfUkVWXzU3MDQJCQkgMHgwMgorI2RlZmluZSAgIEFTSUNfUkVWXzU3MDUJCQkgMHgwMworI2RlZmluZSAgIEFTSUNfUkVWXzU3NTAJCQkgMHgwNAorI2RlZmluZSAgR0VUX0NISVBfUkVWKENISVBfUkVWX0lEKQkoKENISVBfUkVWX0lEKSA+PiA4KQorI2RlZmluZSAgIENISVBSRVZfNTcwMF9BWAkJIDB4NzAKKyNkZWZpbmUgICBDSElQUkVWXzU3MDBfQlgJCSAweDcxCisjZGVmaW5lICAgQ0hJUFJFVl81NzAwX0NYCQkgMHg3MgorI2RlZmluZSAgIENISVBSRVZfNTcwMV9BWAkJIDB4MDAKKyNkZWZpbmUgICBDSElQUkVWXzU3MDNfQVgJCSAweDEwCisjZGVmaW5lICAgQ0hJUFJFVl81NzA0X0FYCQkgMHgyMAorI2RlZmluZSAgIENISVBSRVZfNTcwNF9CWAkJIDB4MjEKKyNkZWZpbmUgICBDSElQUkVWXzU3NTBfQVgJCSAweDQwCisjZGVmaW5lICAgQ0hJUFJFVl81NzUwX0JYCQkgMHg0MQorI2RlZmluZSAgR0VUX01FVEFMX1JFVihDSElQX1JFVl9JRCkJKChDSElQX1JFVl9JRCkgJiAweGZmKQorI2RlZmluZSAgIE1FVEFMX1JFVl9BMAkJCSAweDAwCisjZGVmaW5lICAgTUVUQUxfUkVWX0ExCQkJIDB4MDEKKyNkZWZpbmUgICBNRVRBTF9SRVZfQjAJCQkgMHgwMAorI2RlZmluZSAgIE1FVEFMX1JFVl9CMQkJCSAweDAxCisjZGVmaW5lICAgTUVUQUxfUkVWX0IyCQkJIDB4MDIKKyNkZWZpbmUgVEczUENJX0RNQV9SV19DVFJMCQkweDAwMDAwMDZjCisjZGVmaW5lICBETUFfUldDVFJMX01JTl9ETUEJCSAweDAwMDAwMGZmCisjZGVmaW5lICBETUFfUldDVFJMX01JTl9ETUFfU0hJRlQJIDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV9NQVNLCSAweDAwMDAwNzAwCisjZGVmaW5lICBETUFfUldDVFJMX1JFQURfQk5EUllfRElTQUIJIDB4MDAwMDAwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV8xNgkgMHgwMDAwMDEwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX0JORFJZXzEyOF9QQ0lYCSAweDAwMDAwMTAwCisjZGVmaW5lICBETUFfUldDVFJMX1JFQURfQk5EUllfMzIJIDB4MDAwMDAyMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV8yNTZfUENJWAkgMHgwMDAwMDIwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX0JORFJZXzY0CSAweDAwMDAwMzAwCisjZGVmaW5lICBETUFfUldDVFJMX1JFQURfQk5EUllfMzg0X1BDSVgJIDB4MDAwMDAzMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV8xMjgJIDB4MDAwMDA0MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV8yNTYJIDB4MDAwMDA1MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV81MTIJIDB4MDAwMDA2MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUkVBRF9CTkRSWV8xMDI0CSAweDAwMDAwNzAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZX01BU0sJIDB4MDAwMDM4MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfRElTQUIJIDB4MDAwMDAwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfMTYJIDB4MDAwMDA4MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfMTI4X1BDSVggMHgwMDAwMDgwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8zMgkgMHgwMDAwMTAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV8yNTZfUENJWCAweDAwMDAxMDAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZXzY0CSAweDAwMDAxODAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZXzM4NF9QQ0lYIDB4MDAwMDE4MDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfMTI4CSAweDAwMDAyMDAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZXzI1NgkgMHgwMDAwMjgwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV81MTIJIDB4MDAwMDMwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfMTAyNAkgMHgwMDAwMzgwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9PTkVfRE1BCQkgMHgwMDAwNDAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX1dBVEVSCQkgMHgwMDA3MDAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9SRUFEX1dBVEVSX1NISUZUCSAxNgorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9XQVRFUgkJIDB4MDAzODAwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfV0FURVJfU0hJRlQJIDE5CisjZGVmaW5lICBETUFfUldDVFJMX1VTRV9NRU1fUkVBRF9NVUxUCSAweDAwNDAwMDAwCisjZGVmaW5lICBETUFfUldDVFJMX0FTU0VSVF9BTExfQkUJIDB4MDA4MDAwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfUENJX1JFQURfQ01ECSAweDBmMDAwMDAwCisjZGVmaW5lICBETUFfUldDVFJMX1BDSV9SRUFEX0NNRF9TSElGVAkgMjQKKyNkZWZpbmUgIERNQV9SV0NUUkxfUENJX1dSSVRFX0NNRAkgMHhmMDAwMDAwMAorI2RlZmluZSAgRE1BX1JXQ1RSTF9QQ0lfV1JJVEVfQ01EX1NISUZUCSAyOAorI2RlZmluZSAgRE1BX1JXQ1RSTF9XUklURV9CTkRSWV82NF9QQ0lFCSAweDEwMDAwMDAwCisjZGVmaW5lICBETUFfUldDVFJMX1dSSVRFX0JORFJZXzEyOF9QQ0lFIDB4MzAwMDAwMDAKKyNkZWZpbmUgIERNQV9SV0NUUkxfV1JJVEVfQk5EUllfRElTQUJfUENJRSAweDcwMDAwMDAwCisjZGVmaW5lIFRHM1BDSV9QQ0lTVEFURQkJCTB4MDAwMDAwNzAKKyNkZWZpbmUgIFBDSVNUQVRFX0ZPUkNFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUENJU1RBVEVfSU5UX05PVF9BQ1RJVkUJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFBDSVNUQVRFX0NPTlZfUENJX01PREUJCSAweDAwMDAwMDA0CisjZGVmaW5lICBQQ0lTVEFURV9CVVNfU1BFRURfSElHSAkgMHgwMDAwMDAwOAorI2RlZmluZSAgUENJU1RBVEVfQlVTXzMyQklUCQkgMHgwMDAwMDAxMAorI2RlZmluZSAgUENJU1RBVEVfUk9NX0VOQUJMRQkJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFBDSVNUQVRFX1JPTV9SRVRSWV9FTkFCTEUJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIFBDSVNUQVRFX0ZMQVRfVklFVwkJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIFBDSVNUQVRFX1JFVFJZX1NBTUVfRE1BCSAweDAwMDAyMDAwCisjZGVmaW5lIFRHM1BDSV9DTE9DS19DVFJMCQkweDAwMDAwMDc0CisjZGVmaW5lICBDTE9DS19DVFJMX0NPUkVDTEtfRElTQUJMRQkgMHgwMDAwMDIwMAorI2RlZmluZSAgQ0xPQ0tfQ1RSTF9SWENMS19ESVNBQkxFCSAweDAwMDAwNDAwCisjZGVmaW5lICBDTE9DS19DVFJMX1RYQ0xLX0RJU0FCTEUJIDB4MDAwMDA4MDAKKyNkZWZpbmUgIENMT0NLX0NUUkxfQUxUQ0xLCQkgMHgwMDAwMTAwMAorI2RlZmluZSAgQ0xPQ0tfQ1RSTF9QV1JET1dOX1BMTDEzMwkgMHgwMDAwODAwMAorI2RlZmluZSAgQ0xPQ0tfQ1RSTF80NE1IWl9DT1JFCQkgMHgwMDA0MDAwMAorI2RlZmluZSAgQ0xPQ0tfQ1RSTF82MjVfQ09SRQkJIDB4MDAxMDAwMDAKKyNkZWZpbmUgIENMT0NLX0NUUkxfRk9SQ0VfQ0xLUlVOCSAweDAwMjAwMDAwCisjZGVmaW5lICBDTE9DS19DVFJMX0NMS1JVTl9PRU5BQkxFCSAweDAwNDAwMDAwCisjZGVmaW5lICBDTE9DS19DVFJMX0RFTEFZX1BDSV9HUkFOVAkgMHg4MDAwMDAwMAorI2RlZmluZSBURzNQQ0lfUkVHX0JBU0VfQUREUgkJMHgwMDAwMDA3OAorI2RlZmluZSBURzNQQ0lfTUVNX1dJTl9CQVNFX0FERFIJMHgwMDAwMDA3YworI2RlZmluZSBURzNQQ0lfUkVHX0RBVEEJCQkweDAwMDAwMDgwCisjZGVmaW5lIFRHM1BDSV9NRU1fV0lOX0RBVEEJCTB4MDAwMDAwODQKKyNkZWZpbmUgVEczUENJX01PREVfQ1RSTAkJMHgwMDAwMDA4OAorI2RlZmluZSBURzNQQ0lfTUlTQ19DRkcJCQkweDAwMDAwMDhjCisjZGVmaW5lIFRHM1BDSV9NSVNDX0xPQ0FMX0NUUkwJCTB4MDAwMDAwOTAKKy8qIDB4OTQgLS0+IDB4OTggdW51c2VkICovCisjZGVmaW5lIFRHM1BDSV9TVERfUklOR19QUk9EX0lEWAkweDAwMDAwMDk4IC8qIDY0LWJpdCAqLworI2RlZmluZSBURzNQQ0lfUkNWX1JFVF9SSU5HX0NPTl9JRFgJMHgwMDAwMDBhMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgVEczUENJX1NORF9QUk9EX0lEWAkJMHgwMDAwMDBhOCAvKiA2NC1iaXQgKi8KKy8qIDB4YjAgLS0+IDB4YjggdW51c2VkICovCisjZGVmaW5lIFRHM1BDSV9EVUFMX01BQ19DVFJMCQkweDAwMDAwMGI4CisjZGVmaW5lICBEVUFMX01BQ19DVFJMX0NIX01BU0sJCSAweDAwMDAwMDAzCisjZGVmaW5lICBEVUFMX01BQ19DVFJMX0lECQkgMHgwMDAwMDAwNAorLyogMHhiYyAtLT4gMHgxMDAgdW51c2VkICovCisKKy8qIDB4MTAwIC0tPiAweDIwMCB1bnVzZWQgKi8KKworLyogTWFpbGJveCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUFJTEJPWF9JTlRFUlJVUFRfMAkJMHgwMDAwMDIwMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9JTlRFUlJVUFRfMQkJMHgwMDAwMDIwOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9JTlRFUlJVUFRfMgkJMHgwMDAwMDIxMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9JTlRFUlJVUFRfMwkJMHgwMDAwMDIxOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9HRU5FUkFMXzAJCTB4MDAwMDAyMjAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfR0VORVJBTF8xCQkweDAwMDAwMjI4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX0dFTkVSQUxfMgkJMHgwMDAwMDIzMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9HRU5FUkFMXzMJCTB4MDAwMDAyMzggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfR0VORVJBTF80CQkweDAwMDAwMjQwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX0dFTkVSQUxfNQkJMHgwMDAwMDI0OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9HRU5FUkFMXzYJCTB4MDAwMDAyNTAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfR0VORVJBTF83CQkweDAwMDAwMjU4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JFTE9BRF9TVEFUCQkweDAwMDAwMjYwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVl9TVERfUFJPRF9JRFgJMHgwMDAwMDI2OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZfSlVNQk9fUFJPRF9JRFgJMHgwMDAwMDI3MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZfTUlOSV9QUk9EX0lEWAkweDAwMDAwMjc4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzAJMHgwMDAwMDI4MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8xCTB4MDAwMDAyODggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMgkweDAwMDAwMjkwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzMJMHgwMDAwMDI5OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF80CTB4MDAwMDAyYTAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfNQkweDAwMDAwMmE4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzYJMHgwMDAwMDJiMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF83CTB4MDAwMDAyYjggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfOAkweDAwMDAwMmMwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzkJMHgwMDAwMDJjOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8xMAkweDAwMDAwMmQwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzExCTB4MDAwMDAyZDggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMTIJMHgwMDAwMDJlMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9SQ1ZSRVRfQ09OX0lEWF8xMwkweDAwMDAwMmU4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1JDVlJFVF9DT05fSURYXzE0CTB4MDAwMDAyZjAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfUkNWUkVUX0NPTl9JRFhfMTUJMHgwMDAwMDJmOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzAJMHgwMDAwMDMwMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzEJMHgwMDAwMDMwOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzIJMHgwMDAwMDMxMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzMJMHgwMDAwMDMxOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzQJMHgwMDAwMDMyMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzUJMHgwMDAwMDMyOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzYJMHgwMDAwMDMzMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzcJMHgwMDAwMDMzOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzgJMHgwMDAwMDM0MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzkJMHgwMDAwMDM0OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzEwCTB4MDAwMDAzNTAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8xMQkweDAwMDAwMzU4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMTIJMHgwMDAwMDM2MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkRIT1NUX1BST0RfSURYXzEzCTB4MDAwMDAzNjggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ESE9TVF9QUk9EX0lEWF8xNAkweDAwMDAwMzcwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NOREhPU1RfUFJPRF9JRFhfMTUJMHgwMDAwMDM3OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfMAkweDAwMDAwMzgwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8xCTB4MDAwMDAzODggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzIJMHgwMDAwMDM5MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfMwkweDAwMDAwMzk4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF80CTB4MDAwMDAzYTAgLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzUJMHgwMDAwMDNhOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfNgkweDAwMDAwM2IwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF83CTB4MDAwMDAzYjggLyogNjQtYml0ICovCisjZGVmaW5lIE1BSUxCT1hfU05ETklDX1BST0RfSURYXzgJMHgwMDAwMDNjMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgTUFJTEJPWF9TTkROSUNfUFJPRF9JRFhfOQkweDAwMDAwM2M4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8xMAkweDAwMDAwM2QwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8xMQkweDAwMDAwM2Q4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8xMgkweDAwMDAwM2UwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8xMwkweDAwMDAwM2U4IC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8xNAkweDAwMDAwM2YwIC8qIDY0LWJpdCAqLworI2RlZmluZSBNQUlMQk9YX1NORE5JQ19QUk9EX0lEWF8xNQkweDAwMDAwM2Y4IC8qIDY0LWJpdCAqLworCisvKiBNQUMgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUFDX01PREUJCQkweDAwMDAwNDAwCisjZGVmaW5lICBNQUNfTU9ERV9SRVNFVAkJCSAweDAwMDAwMDAxCisjZGVmaW5lICBNQUNfTU9ERV9IQUxGX0RVUExFWAkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIE1BQ19NT0RFX1BPUlRfTU9ERV9NQVNLCSAweDAwMDAwMDBjCisjZGVmaW5lICBNQUNfTU9ERV9QT1JUX01PREVfVEJJCQkgMHgwMDAwMDAwYworI2RlZmluZSAgTUFDX01PREVfUE9SVF9NT0RFX0dNSUkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIE1BQ19NT0RFX1BPUlRfTU9ERV9NSUkJCSAweDAwMDAwMDA0CisjZGVmaW5lICBNQUNfTU9ERV9QT1JUX01PREVfTk9ORQkgMHgwMDAwMDAwMAorI2RlZmluZSAgTUFDX01PREVfUE9SVF9JTlRfTFBCQUNLCSAweDAwMDAwMDEwCisjZGVmaW5lICBNQUNfTU9ERV9UQUdHRURfTUFDX0NUUkwJIDB4MDAwMDAwODAKKyNkZWZpbmUgIE1BQ19NT0RFX1RYX0JVUlNUSU5HCQkgMHgwMDAwMDEwMAorI2RlZmluZSAgTUFDX01PREVfTUFYX0RFRkVSCQkgMHgwMDAwMDIwMAorI2RlZmluZSAgTUFDX01PREVfTElOS19QT0xBUklUWQkJIDB4MDAwMDA0MDAKKyNkZWZpbmUgIE1BQ19NT0RFX1JYU1RBVF9FTkFCTEUJCSAweDAwMDAwODAwCisjZGVmaW5lICBNQUNfTU9ERV9SWFNUQVRfQ0xFQVIJCSAweDAwMDAxMDAwCisjZGVmaW5lICBNQUNfTU9ERV9SWFNUQVRfRkxVU0gJCSAweDAwMDAyMDAwCisjZGVmaW5lICBNQUNfTU9ERV9UWFNUQVRfRU5BQkxFCQkgMHgwMDAwNDAwMAorI2RlZmluZSAgTUFDX01PREVfVFhTVEFUX0NMRUFSCQkgMHgwMDAwODAwMAorI2RlZmluZSAgTUFDX01PREVfVFhTVEFUX0ZMVVNICQkgMHgwMDAxMDAwMAorI2RlZmluZSAgTUFDX01PREVfU0VORF9DT05GSUdTCQkgMHgwMDAyMDAwMAorI2RlZmluZSAgTUFDX01PREVfTUFHSUNfUEtUX0VOQUJMRQkgMHgwMDA0MDAwMAorI2RlZmluZSAgTUFDX01PREVfQUNQSV9FTkFCTEUJCSAweDAwMDgwMDAwCisjZGVmaW5lICBNQUNfTU9ERV9NSVBfRU5BQkxFCQkgMHgwMDEwMDAwMAorI2RlZmluZSAgTUFDX01PREVfVERFX0VOQUJMRQkJIDB4MDAyMDAwMDAKKyNkZWZpbmUgIE1BQ19NT0RFX1JERV9FTkFCTEUJCSAweDAwNDAwMDAwCisjZGVmaW5lICBNQUNfTU9ERV9GSERFX0VOQUJMRQkJIDB4MDA4MDAwMDAKKyNkZWZpbmUgTUFDX1NUQVRVUwkJCTB4MDAwMDA0MDQKKyNkZWZpbmUgIE1BQ19TVEFUVVNfUENTX1NZTkNFRAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE1BQ19TVEFUVVNfU0lHTkFMX0RFVAkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIE1BQ19TVEFUVVNfUkNWRF9DRkcJCSAweDAwMDAwMDA0CisjZGVmaW5lICBNQUNfU1RBVFVTX0NGR19DSEFOR0VECQkgMHgwMDAwMDAwOAorI2RlZmluZSAgTUFDX1NUQVRVU19TWU5DX0NIQU5HRUQJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIE1BQ19TVEFUVVNfUE9SVF9ERUNfRVJSCSAweDAwMDAwNDAwCisjZGVmaW5lICBNQUNfU1RBVFVTX0xOS1NUQVRFX0NIQU5HRUQJIDB4MDAwMDEwMDAKKyNkZWZpbmUgIE1BQ19TVEFUVVNfTUlfQ09NUExFVElPTgkgMHgwMDQwMDAwMAorI2RlZmluZSAgTUFDX1NUQVRVU19NSV9JTlRFUlJVUFQJIDB4MDA4MDAwMDAKKyNkZWZpbmUgIE1BQ19TVEFUVVNfQVBfRVJST1IJCSAweDAxMDAwMDAwCisjZGVmaW5lICBNQUNfU1RBVFVTX09ESV9FUlJPUgkJIDB4MDIwMDAwMDAKKyNkZWZpbmUgIE1BQ19TVEFUVVNfUlhTVEFUX09WRVJSVU4JIDB4MDQwMDAwMDAKKyNkZWZpbmUgIE1BQ19TVEFUVVNfVFhTVEFUX09WRVJSVU4JIDB4MDgwMDAwMDAKKyNkZWZpbmUgTUFDX0VWRU5UCQkJMHgwMDAwMDQwOAorI2RlZmluZSAgTUFDX0VWRU5UX1BPUlRfREVDT0RFX0VSUgkgMHgwMDAwMDQwMAorI2RlZmluZSAgTUFDX0VWRU5UX0xOS1NUQVRFX0NIQU5HRUQJIDB4MDAwMDEwMDAKKyNkZWZpbmUgIE1BQ19FVkVOVF9NSV9DT01QTEVUSU9OCSAweDAwNDAwMDAwCisjZGVmaW5lICBNQUNfRVZFTlRfTUlfSU5URVJSVVBUCQkgMHgwMDgwMDAwMAorI2RlZmluZSAgTUFDX0VWRU5UX0FQX0VSUk9SCQkgMHgwMTAwMDAwMAorI2RlZmluZSAgTUFDX0VWRU5UX09ESV9FUlJPUgkJIDB4MDIwMDAwMDAKKyNkZWZpbmUgIE1BQ19FVkVOVF9SWFNUQVRfT1ZFUlJVTgkgMHgwNDAwMDAwMAorI2RlZmluZSAgTUFDX0VWRU5UX1RYU1RBVF9PVkVSUlVOCSAweDA4MDAwMDAwCisjZGVmaW5lIE1BQ19MRURfQ1RSTAkJCTB4MDAwMDA0MGMKKyNkZWZpbmUgIExFRF9DVFJMX0xOS0xFRF9PVkVSUklERQkgMHgwMDAwMDAwMQorI2RlZmluZSAgTEVEX0NUUkxfMTAwME1CUFNfT04JCSAweDAwMDAwMDAyCisjZGVmaW5lICBMRURfQ1RSTF8xMDBNQlBTX09OCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgTEVEX0NUUkxfMTBNQlBTX09OCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgTEVEX0NUUkxfVFJBRkZJQ19PVkVSUklERQkgMHgwMDAwMDAxMAorI2RlZmluZSAgTEVEX0NUUkxfVFJBRkZJQ19CTElOSwkJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIExFRF9DVFJMX1RSQUZGSUNfTEVECQkgMHgwMDAwMDA0MAorI2RlZmluZSAgTEVEX0NUUkxfMTAwME1CUFNfU1RBVFVTCSAweDAwMDAwMDgwCisjZGVmaW5lICBMRURfQ1RSTF8xMDBNQlBTX1NUQVRVUwkgMHgwMDAwMDEwMAorI2RlZmluZSAgTEVEX0NUUkxfMTBNQlBTX1NUQVRVUwkJIDB4MDAwMDAyMDAKKyNkZWZpbmUgIExFRF9DVFJMX1RSQUZGSUNfU1RBVFVTCSAweDAwMDAwNDAwCisjZGVmaW5lICBMRURfQ1RSTF9NT0RFX01BQwkJIDB4MDAwMDAwMDAKKyNkZWZpbmUgIExFRF9DVFJMX01PREVfUEhZXzEJCSAweDAwMDAwODAwCisjZGVmaW5lICBMRURfQ1RSTF9NT0RFX1BIWV8yCQkgMHgwMDAwMTAwMAorI2RlZmluZSAgTEVEX0NUUkxfTU9ERV9TSEFTVEFfTUFDCSAweDAwMDAyMDAwCisjZGVmaW5lICBMRURfQ1RSTF9NT0RFX1NIQVJFRAkJIDB4MDAwMDQwMDAKKyNkZWZpbmUgIExFRF9DVFJMX01PREVfQ09NQk8JCSAweDAwMDA4MDAwCisjZGVmaW5lICBMRURfQ1RSTF9CTElOS19SQVRFX01BU0sJIDB4N2ZmODAwMDAKKyNkZWZpbmUgIExFRF9DVFJMX0JMSU5LX1JBVEVfU0hJRlQJIDE5CisjZGVmaW5lICBMRURfQ1RSTF9CTElOS19QRVJfT1ZFUlJJREUJIDB4MDAwODAwMDAKKyNkZWZpbmUgIExFRF9DVFJMX0JMSU5LX1JBVEVfT1ZFUlJJREUJIDB4ODAwMDAwMDAKKyNkZWZpbmUgTUFDX0FERFJfMF9ISUdICQkJMHgwMDAwMDQxMCAvKiB1cHBlciAyIGJ5dGVzICovCisjZGVmaW5lIE1BQ19BRERSXzBfTE9XCQkJMHgwMDAwMDQxNCAvKiBsb3dlciA0IGJ5dGVzICovCisjZGVmaW5lIE1BQ19BRERSXzFfSElHSAkJCTB4MDAwMDA0MTggLyogdXBwZXIgMiBieXRlcyAqLworI2RlZmluZSBNQUNfQUREUl8xX0xPVwkJCTB4MDAwMDA0MWMgLyogbG93ZXIgNCBieXRlcyAqLworI2RlZmluZSBNQUNfQUREUl8yX0hJR0gJCQkweDAwMDAwNDIwIC8qIHVwcGVyIDIgYnl0ZXMgKi8KKyNkZWZpbmUgTUFDX0FERFJfMl9MT1cJCQkweDAwMDAwNDI0IC8qIGxvd2VyIDQgYnl0ZXMgKi8KKyNkZWZpbmUgTUFDX0FERFJfM19ISUdICQkJMHgwMDAwMDQyOCAvKiB1cHBlciAyIGJ5dGVzICovCisjZGVmaW5lIE1BQ19BRERSXzNfTE9XCQkJMHgwMDAwMDQyYyAvKiBsb3dlciA0IGJ5dGVzICovCisjZGVmaW5lIE1BQ19BQ1BJX01CVUZfUFRSCQkweDAwMDAwNDMwCisjZGVmaW5lIE1BQ19BQ1BJX0xFTl9PRkZTRVQJCTB4MDAwMDA0MzQKKyNkZWZpbmUgIEFDUElfTEVOT0ZGX0xFTl9NQVNLCQkgMHgwMDAwZmZmZgorI2RlZmluZSAgQUNQSV9MRU5PRkZfTEVOX1NISUZUCQkgMAorI2RlZmluZSAgQUNQSV9MRU5PRkZfT0ZGX01BU0sJCSAweDBmZmYwMDAwCisjZGVmaW5lICBBQ1BJX0xFTk9GRl9PRkZfU0hJRlQJCSAxNgorI2RlZmluZSBNQUNfVFhfQkFDS09GRl9TRUVECQkweDAwMDAwNDM4CisjZGVmaW5lICBUWF9CQUNLT0ZGX1NFRURfTUFTSwkJIDB4MDAwMDAzZmYKKyNkZWZpbmUgTUFDX1JYX01UVV9TSVpFCQkJMHgwMDAwMDQzYworI2RlZmluZSAgUlhfTVRVX1NJWkVfTUFTSwkJIDB4MDAwMGZmZmYKKyNkZWZpbmUgTUFDX1BDU19URVNUCQkJMHgwMDAwMDQ0MAorI2RlZmluZSAgUENTX1RFU1RfUEFUVEVSTl9NQVNLCQkgMHgwMDBmZmZmZgorI2RlZmluZSAgUENTX1RFU1RfUEFUVEVSTl9TSElGVAkJIDAKKyNkZWZpbmUgIFBDU19URVNUX0VOQUJMRQkJIDB4MDAxMDAwMDAKKyNkZWZpbmUgTUFDX1RYX0FVVE9fTkVHCQkJMHgwMDAwMDQ0NAorI2RlZmluZSAgVFhfQVVUT19ORUdfTUFTSwkJIDB4MDAwMGZmZmYKKyNkZWZpbmUgIFRYX0FVVE9fTkVHX1NISUZUCQkgMAorI2RlZmluZSBNQUNfUlhfQVVUT19ORUcJCQkweDAwMDAwNDQ4CisjZGVmaW5lICBSWF9BVVRPX05FR19NQVNLCQkgMHgwMDAwZmZmZgorI2RlZmluZSAgUlhfQVVUT19ORUdfU0hJRlQJCSAwCisjZGVmaW5lIE1BQ19NSV9DT00JCQkweDAwMDAwNDRjCisjZGVmaW5lICBNSV9DT01fQ01EX01BU0sJCSAweDBjMDAwMDAwCisjZGVmaW5lICBNSV9DT01fQ01EX1dSSVRFCQkgMHgwNDAwMDAwMAorI2RlZmluZSAgTUlfQ09NX0NNRF9SRUFECQkgMHgwODAwMDAwMAorI2RlZmluZSAgTUlfQ09NX1JFQURfRkFJTEVECQkgMHgxMDAwMDAwMAorI2RlZmluZSAgTUlfQ09NX1NUQVJUCQkJIDB4MjAwMDAwMDAKKyNkZWZpbmUgIE1JX0NPTV9CVVNZCQkJIDB4MjAwMDAwMDAKKyNkZWZpbmUgIE1JX0NPTV9QSFlfQUREUl9NQVNLCQkgMHgwM2UwMDAwMAorI2RlZmluZSAgTUlfQ09NX1BIWV9BRERSX1NISUZUCQkgMjEKKyNkZWZpbmUgIE1JX0NPTV9SRUdfQUREUl9NQVNLCQkgMHgwMDFmMDAwMAorI2RlZmluZSAgTUlfQ09NX1JFR19BRERSX1NISUZUCQkgMTYKKyNkZWZpbmUgIE1JX0NPTV9EQVRBX01BU0sJCSAweDAwMDBmZmZmCisjZGVmaW5lIE1BQ19NSV9TVEFUCQkJMHgwMDAwMDQ1MAorI2RlZmluZSAgTUFDX01JX1NUQVRfTE5LU1RBVF9BVFROX0VOQUIJIDB4MDAwMDAwMDEKKyNkZWZpbmUgTUFDX01JX01PREUJCQkweDAwMDAwNDU0CisjZGVmaW5lICBNQUNfTUlfTU9ERV9DTEtfMTBNSFoJCSAweDAwMDAwMDAxCisjZGVmaW5lICBNQUNfTUlfTU9ERV9TSE9SVF9QUkVBTUJMRQkgMHgwMDAwMDAwMgorI2RlZmluZSAgTUFDX01JX01PREVfQVVUT19QT0xMCQkgMHgwMDAwMDAxMAorI2RlZmluZSAgTUFDX01JX01PREVfQ09SRV9DTEtfNjJNSFoJIDB4MDAwMDgwMDAKKyNkZWZpbmUgIE1BQ19NSV9NT0RFX0JBU0UJCSAweDAwMGMwMDAwIC8qIFhYWCBtYWdpYyB2YWx1ZXMgWFhYICovCisjZGVmaW5lIE1BQ19BVVRPX1BPTExfU1RBVFVTCQkweDAwMDAwNDU4CisjZGVmaW5lICBNQUNfQVVUT19QT0xMX0VSUk9SCQkgMHgwMDAwMDAwMQorI2RlZmluZSBNQUNfVFhfTU9ERQkJCTB4MDAwMDA0NWMKKyNkZWZpbmUgIFRYX01PREVfUkVTRVQJCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgVFhfTU9ERV9FTkFCTEUJCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgVFhfTU9ERV9GTE9XX0NUUkxfRU5BQkxFCSAweDAwMDAwMDEwCisjZGVmaW5lICBUWF9NT0RFX0JJR19CQ0tPRkZfRU5BQkxFCSAweDAwMDAwMDIwCisjZGVmaW5lICBUWF9NT0RFX0xPTkdfUEFVU0VfRU5BQkxFCSAweDAwMDAwMDQwCisjZGVmaW5lIE1BQ19UWF9TVEFUVVMJCQkweDAwMDAwNDYwCisjZGVmaW5lICBUWF9TVEFUVVNfWE9GRkVECQkgMHgwMDAwMDAwMQorI2RlZmluZSAgVFhfU1RBVFVTX1NFTlRfWE9GRgkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFRYX1NUQVRVU19TRU5UX1hPTgkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFRYX1NUQVRVU19MSU5LX1VQCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgVFhfU1RBVFVTX09ESV9VTkRFUlJVTgkJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIFRYX1NUQVRVU19PRElfT1ZFUlJVTgkJIDB4MDAwMDAwMjAKKyNkZWZpbmUgTUFDX1RYX0xFTkdUSFMJCQkweDAwMDAwNDY0CisjZGVmaW5lICBUWF9MRU5HVEhTX1NMT1RfVElNRV9NQVNLCSAweDAwMDAwMGZmCisjZGVmaW5lICBUWF9MRU5HVEhTX1NMT1RfVElNRV9TSElGVAkgMAorI2RlZmluZSAgVFhfTEVOR1RIU19JUEdfTUFTSwkJIDB4MDAwMDBmMDAKKyNkZWZpbmUgIFRYX0xFTkdUSFNfSVBHX1NISUZUCQkgOAorI2RlZmluZSAgVFhfTEVOR1RIU19JUEdfQ1JTX01BU0sJIDB4MDAwMDMwMDAKKyNkZWZpbmUgIFRYX0xFTkdUSFNfSVBHX0NSU19TSElGVAkgMTIKKyNkZWZpbmUgTUFDX1JYX01PREUJCQkweDAwMDAwNDY4CisjZGVmaW5lICBSWF9NT0RFX1JFU0VUCQkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFJYX01PREVfRU5BQkxFCQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFJYX01PREVfRkxPV19DVFJMX0VOQUJMRQkgMHgwMDAwMDAwNAorI2RlZmluZSAgUlhfTU9ERV9LRUVQX01BQ19DVFJMCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgUlhfTU9ERV9LRUVQX1BBVVNFCQkgMHgwMDAwMDAxMAorI2RlZmluZSAgUlhfTU9ERV9BQ0NFUFRfT1ZFUlNJWkVECSAweDAwMDAwMDIwCisjZGVmaW5lICBSWF9NT0RFX0FDQ0VQVF9SVU5UUwkJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIFJYX01PREVfTEVOX0NIRUNLCQkgMHgwMDAwMDA4MAorI2RlZmluZSAgUlhfTU9ERV9QUk9NSVNDCQkgMHgwMDAwMDEwMAorI2RlZmluZSAgUlhfTU9ERV9OT19DUkNfQ0hFQ0sJCSAweDAwMDAwMjAwCisjZGVmaW5lICBSWF9NT0RFX0tFRVBfVkxBTl9UQUcJCSAweDAwMDAwNDAwCisjZGVmaW5lIE1BQ19SWF9TVEFUVVMJCQkweDAwMDAwNDZjCisjZGVmaW5lICBSWF9TVEFUVVNfUkVNT1RFX1RYX1hPRkZFRAkgMHgwMDAwMDAwMQorI2RlZmluZSAgUlhfU1RBVFVTX1hPRkZfUkNWRAkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFJYX1NUQVRVU19YT05fUkNWRAkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgTUFDX0hBU0hfUkVHXzAJCQkweDAwMDAwNDcwCisjZGVmaW5lIE1BQ19IQVNIX1JFR18xCQkJMHgwMDAwMDQ3NAorI2RlZmluZSBNQUNfSEFTSF9SRUdfMgkJCTB4MDAwMDA0NzgKKyNkZWZpbmUgTUFDX0hBU0hfUkVHXzMJCQkweDAwMDAwNDdjCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8wCQkJMHgwMDAwMDQ4MAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzAJCQkweDAwMDAwNDg0CisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8xCQkJMHgwMDAwMDQ4OAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzEJCQkweDAwMDAwNDhjCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8yCQkJMHgwMDAwMDQ5MAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzIJCQkweDAwMDAwNDk0CisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8zCQkJMHgwMDAwMDQ5OAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzMJCQkweDAwMDAwNDljCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV80CQkJMHgwMDAwMDRhMAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzQJCQkweDAwMDAwNGE0CisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV81CQkJMHgwMDAwMDRhOAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzUJCQkweDAwMDAwNGFjCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV82CQkJMHgwMDAwMDRiMAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzYJCQkweDAwMDAwNGI0CisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV83CQkJMHgwMDAwMDRiOAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzcJCQkweDAwMDAwNGJjCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV84CQkJMHgwMDAwMDRjMAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzgJCQkweDAwMDAwNGM0CisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV85CQkJMHgwMDAwMDRjOAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzkJCQkweDAwMDAwNGNjCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8xMAkJCTB4MDAwMDA0ZDAKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV8xMAkJMHgwMDAwMDRkNAorI2RlZmluZSBNQUNfUkNWX1JVTEVfMTEJCQkweDAwMDAwNGQ4CisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfMTEJCTB4MDAwMDA0ZGMKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzEyCQkJMHgwMDAwMDRlMAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzEyCQkweDAwMDAwNGU0CisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV8xMwkJCTB4MDAwMDA0ZTgKKyNkZWZpbmUgTUFDX1JDVl9WQUxVRV8xMwkJMHgwMDAwMDRlYworI2RlZmluZSBNQUNfUkNWX1JVTEVfMTQJCQkweDAwMDAwNGYwCisjZGVmaW5lIE1BQ19SQ1ZfVkFMVUVfMTQJCTB4MDAwMDA0ZjQKKyNkZWZpbmUgTUFDX1JDVl9SVUxFXzE1CQkJMHgwMDAwMDRmOAorI2RlZmluZSBNQUNfUkNWX1ZBTFVFXzE1CQkweDAwMDAwNGZjCisjZGVmaW5lICBSQ1ZfUlVMRV9ESVNBQkxFX01BU0sJCSAweDdmZmZmZmZmCisjZGVmaW5lIE1BQ19SQ1ZfUlVMRV9DRkcJCTB4MDAwMDA1MDAKKyNkZWZpbmUgIFJDVl9SVUxFX0NGR19ERUZBVUxUX0NMQVNTCTB4MDAwMDAwMDgKKyNkZWZpbmUgTUFDX0xPV19XTUFSS19NQVhfUlhfRlJBTUUJMHgwMDAwMDUwNAorLyogMHg1MDggLS0+IDB4NTIwIHVudXNlZCAqLworI2RlZmluZSBNQUNfSEFTSFJFR1VfMAkJCTB4MDAwMDA1MjAKKyNkZWZpbmUgTUFDX0hBU0hSRUdVXzEJCQkweDAwMDAwNTI0CisjZGVmaW5lIE1BQ19IQVNIUkVHVV8yCQkJMHgwMDAwMDUyOAorI2RlZmluZSBNQUNfSEFTSFJFR1VfMwkJCTB4MDAwMDA1MmMKKyNkZWZpbmUgTUFDX0VYVEFERFJfMF9ISUdICQkweDAwMDAwNTMwCisjZGVmaW5lIE1BQ19FWFRBRERSXzBfTE9XCQkweDAwMDAwNTM0CisjZGVmaW5lIE1BQ19FWFRBRERSXzFfSElHSAkJMHgwMDAwMDUzOAorI2RlZmluZSBNQUNfRVhUQUREUl8xX0xPVwkJMHgwMDAwMDUzYworI2RlZmluZSBNQUNfRVhUQUREUl8yX0hJR0gJCTB4MDAwMDA1NDAKKyNkZWZpbmUgTUFDX0VYVEFERFJfMl9MT1cJCTB4MDAwMDA1NDQKKyNkZWZpbmUgTUFDX0VYVEFERFJfM19ISUdICQkweDAwMDAwNTQ4CisjZGVmaW5lIE1BQ19FWFRBRERSXzNfTE9XCQkweDAwMDAwNTRjCisjZGVmaW5lIE1BQ19FWFRBRERSXzRfSElHSAkJMHgwMDAwMDU1MAorI2RlZmluZSBNQUNfRVhUQUREUl80X0xPVwkJMHgwMDAwMDU1NAorI2RlZmluZSBNQUNfRVhUQUREUl81X0hJR0gJCTB4MDAwMDA1NTgKKyNkZWZpbmUgTUFDX0VYVEFERFJfNV9MT1cJCTB4MDAwMDA1NWMKKyNkZWZpbmUgTUFDX0VYVEFERFJfNl9ISUdICQkweDAwMDAwNTYwCisjZGVmaW5lIE1BQ19FWFRBRERSXzZfTE9XCQkweDAwMDAwNTY0CisjZGVmaW5lIE1BQ19FWFRBRERSXzdfSElHSAkJMHgwMDAwMDU2OAorI2RlZmluZSBNQUNfRVhUQUREUl83X0xPVwkJMHgwMDAwMDU2YworI2RlZmluZSBNQUNfRVhUQUREUl84X0hJR0gJCTB4MDAwMDA1NzAKKyNkZWZpbmUgTUFDX0VYVEFERFJfOF9MT1cJCTB4MDAwMDA1NzQKKyNkZWZpbmUgTUFDX0VYVEFERFJfOV9ISUdICQkweDAwMDAwNTc4CisjZGVmaW5lIE1BQ19FWFRBRERSXzlfTE9XCQkweDAwMDAwNTdjCisjZGVmaW5lIE1BQ19FWFRBRERSXzEwX0hJR0gJCTB4MDAwMDA1ODAKKyNkZWZpbmUgTUFDX0VYVEFERFJfMTBfTE9XCQkweDAwMDAwNTg0CisjZGVmaW5lIE1BQ19FWFRBRERSXzExX0hJR0gJCTB4MDAwMDA1ODgKKyNkZWZpbmUgTUFDX0VYVEFERFJfMTFfTE9XCQkweDAwMDAwNThjCisjZGVmaW5lIE1BQ19TRVJERVNfQ0ZHCQkJMHgwMDAwMDU5MAorI2RlZmluZSAgTUFDX1NFUkRFU19DRkdfRURHRV9TRUxFQ1QJIDB4MDAwMDEwMDAKKyNkZWZpbmUgTUFDX1NFUkRFU19TVEFUCQkJMHgwMDAwMDU5NAorLyogMHg1OTggLS0+IDB4NWIwIHVudXNlZCAqLworI2RlZmluZSBTR19ESUdfQ1RSTAkJCTB4MDAwMDA1YjAKKyNkZWZpbmUgIFNHX0RJR19VU0lOR19IV19BVVRPTkVHCSAweDgwMDAwMDAwCisjZGVmaW5lICBTR19ESUdfU09GVF9SRVNFVAkJIDB4NDAwMDAwMDAKKyNkZWZpbmUgIFNHX0RJR19ESVNBQkxFX0xJTktSRFkJCSAweDIwMDAwMDAwCisjZGVmaW5lICBTR19ESUdfQ1JDMTZfQ0xFQVJfTgkJIDB4MDEwMDAwMDAKKyNkZWZpbmUgIFNHX0RJR19FTjEwQgkJCSAweDAwODAwMDAwCisjZGVmaW5lICBTR19ESUdfQ0xFQVJfU1RBVFVTCQkgMHgwMDQwMDAwMAorI2RlZmluZSAgU0dfRElHX0xPQ0FMX0RVUExFWF9TVEFUVVMJIDB4MDAyMDAwMDAKKyNkZWZpbmUgIFNHX0RJR19MT0NBTF9MSU5LX1NUQVRVUwkgMHgwMDEwMDAwMAorI2RlZmluZSAgU0dfRElHX1NQRUVEX1NUQVRVU19NQVNLCSAweDAwMGMwMDAwCisjZGVmaW5lICBTR19ESUdfU1BFRURfU1RBVFVTX1NISUZUCSAxOAorI2RlZmluZSAgU0dfRElHX0pVTUJPX1BBQ0tFVF9ESVNBQkxFCSAweDAwMDIwMDAwCisjZGVmaW5lICBTR19ESUdfUkVTVEFSVF9BVVRPTkVHCQkgMHgwMDAxMDAwMAorI2RlZmluZSAgU0dfRElHX0ZJQkVSX01PREUJCSAweDAwMDA4MDAwCisjZGVmaW5lICBTR19ESUdfUkVNT1RFX0ZBVUxUX01BU0sJIDB4MDAwMDYwMDAKKyNkZWZpbmUgIFNHX0RJR19QQVVTRV9NQVNLCQkgMHgwMDAwMTgwMAorI2RlZmluZSAgU0dfRElHX0dCSUNfRU5BQkxFCQkgMHgwMDAwMDQwMAorI2RlZmluZSAgU0dfRElHX0NIRUNLX0VORF9FTkFCTEUJIDB4MDAwMDAyMDAKKyNkZWZpbmUgIFNHX0RJR19TR01JSV9BVVRPTkVHX1RJTUVSCSAweDAwMDAwMTAwCisjZGVmaW5lICBTR19ESUdfQ0xPQ0tfUEhBU0VfU0VMRUNUCSAweDAwMDAwMDgwCisjZGVmaW5lICBTR19ESUdfR01JSV9JTlBVVF9TRUxFQ1QJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIFNHX0RJR19NUkFEVl9DUkMxNl9TRUxFQ1QJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFNHX0RJR19DT01NQV9ERVRFQ1RfRU5BQkxFCSAweDAwMDAwMDEwCisjZGVmaW5lICBTR19ESUdfQVVUT05FR19USU1FUl9SRURVQ0UJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFNHX0RJR19BVVRPTkVHX0xPV19FTkFCTEUJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFNHX0RJR19SRU1PVEVfTE9PUEJBQ0sJCSAweDAwMDAwMDAyCisjZGVmaW5lICBTR19ESUdfTE9PUEJBQ0sJCSAweDAwMDAwMDAxCisjZGVmaW5lIFNHX0RJR19TVEFUVVMJCQkweDAwMDAwNWI0CisjZGVmaW5lICBTR19ESUdfQ1JDMTZfQlVTX01BU0sJCSAweGZmZmYwMDAwCisjZGVmaW5lICBTR19ESUdfUEFSVE5FUl9GQVVMVF9NQVNLCSAweDAwNjAwMDAwIC8qIElmICFNUkFEVl9DUkMxNl9TRUxFQ1QgKi8KKyNkZWZpbmUgIFNHX0RJR19QQVJUTkVSX0FTWU1fUEFVU0UJIDB4MDAxMDAwMDAgLyogSWYgIU1SQURWX0NSQzE2X1NFTEVDVCAqLworI2RlZmluZSAgU0dfRElHX1BBUlRORVJfUEFVU0VfQ0FQQUJMRQkgMHgwMDA4MDAwMCAvKiBJZiAhTVJBRFZfQ1JDMTZfU0VMRUNUICovCisjZGVmaW5lICBTR19ESUdfUEFSVE5FUl9IQUxGX0RVUExFWAkgMHgwMDA0MDAwMCAvKiBJZiAhTVJBRFZfQ1JDMTZfU0VMRUNUICovCisjZGVmaW5lICBTR19ESUdfUEFSVE5FUl9GVUxMX0RVUExFWAkgMHgwMDAyMDAwMCAvKiBJZiAhTVJBRFZfQ1JDMTZfU0VMRUNUICovCisjZGVmaW5lICBTR19ESUdfUEFSVE5FUl9ORVhUX1BBR0UJIDB4MDAwMTAwMDAgLyogSWYgIU1SQURWX0NSQzE2X1NFTEVDVCAqLworI2RlZmluZSAgU0dfRElHX0FVVE9ORUdfU1RBVEVfTUFTSwkgMHgwMDAwMGZmMAorI2RlZmluZSAgU0dfRElHX0NPTU1BX0RFVEVDVE9SCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgU0dfRElHX01BQ19BQ0tfU1RBVFVTCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgU0dfRElHX0FVVE9ORUdfQ09NUExFVEUJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFNHX0RJR19BVVRPTkVHX0VSUk9SCQkgMHgwMDAwMDAwMQorLyogMHg1YjggLS0+IDB4NjAwIHVudXNlZCAqLworI2RlZmluZSBNQUNfVFhfTUFDX1NUQVRFX0JBU0UJCTB4MDAwMDA2MDAgLyogMTYgYnl0ZXMgKi8KKyNkZWZpbmUgTUFDX1JYX01BQ19TVEFURV9CQVNFCQkweDAwMDAwNjEwIC8qIDIwIGJ5dGVzICovCisvKiAweDYyNCAtLT4gMHg4MDAgdW51c2VkICovCisjZGVmaW5lIE1BQ19UWF9TVEFUU19PQ1RFVFMJCTB4MDAwMDA4MDAKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1YxCQkweDAwMDAwODA0CisjZGVmaW5lIE1BQ19UWF9TVEFUU19DT0xMSVNJT05TCQkweDAwMDAwODA4CisjZGVmaW5lIE1BQ19UWF9TVEFUU19YT05fU0VOVAkJMHgwMDAwMDgwYworI2RlZmluZSBNQUNfVFhfU1RBVFNfWE9GRl9TRU5UCQkweDAwMDAwODEwCisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWMgkJMHgwMDAwMDgxNAorI2RlZmluZSBNQUNfVFhfU1RBVFNfTUFDX0VSUk9SUwkJMHgwMDAwMDgxOAorI2RlZmluZSBNQUNfVFhfU1RBVFNfU0lOR0xFX0NPTExJU0lPTlMJMHgwMDAwMDgxYworI2RlZmluZSBNQUNfVFhfU1RBVFNfTVVMVF9DT0xMSVNJT05TCTB4MDAwMDA4MjAKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX0RFRkVSUkVECQkweDAwMDAwODI0CisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWMwkJMHgwMDAwMDgyOAorI2RlZmluZSBNQUNfVFhfU1RBVFNfRVhDRVNTSVZFX0NPTAkweDAwMDAwODJjCisjZGVmaW5lIE1BQ19UWF9TVEFUU19MQVRFX0NPTAkJMHgwMDAwMDgzMAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfMQkJMHgwMDAwMDgzNAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfMgkJMHgwMDAwMDgzOAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfMwkJMHgwMDAwMDgzYworI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfNAkJMHgwMDAwMDg0MAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfNQkJMHgwMDAwMDg0NAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfNgkJMHgwMDAwMDg0OAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfNwkJMHgwMDAwMDg0YworI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfOAkJMHgwMDAwMDg1MAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfOQkJMHgwMDAwMDg1NAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfMTAJCTB4MDAwMDA4NTgKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y0XzExCQkweDAwMDAwODVjCisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNF8xMgkJMHgwMDAwMDg2MAorI2RlZmluZSBNQUNfVFhfU1RBVFNfUkVTVjRfMTMJCTB4MDAwMDA4NjQKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX1JFU1Y0XzE0CQkweDAwMDAwODY4CisjZGVmaW5lIE1BQ19UWF9TVEFUU19VQ0FTVAkJMHgwMDAwMDg2YworI2RlZmluZSBNQUNfVFhfU1RBVFNfTUNBU1QJCTB4MDAwMDA4NzAKKyNkZWZpbmUgTUFDX1RYX1NUQVRTX0JDQVNUCQkweDAwMDAwODc0CisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNV8xCQkweDAwMDAwODc4CisjZGVmaW5lIE1BQ19UWF9TVEFUU19SRVNWNV8yCQkweDAwMDAwODdjCisjZGVmaW5lIE1BQ19SWF9TVEFUU19PQ1RFVFMJCTB4MDAwMDA4ODAKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX1JFU1YxCQkweDAwMDAwODg0CisjZGVmaW5lIE1BQ19SWF9TVEFUU19GUkFHTUVOVFMJCTB4MDAwMDA4ODgKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX1VDQVNUCQkweDAwMDAwODhjCisjZGVmaW5lIE1BQ19SWF9TVEFUU19NQ0FTVAkJMHgwMDAwMDg5MAorI2RlZmluZSBNQUNfUlhfU1RBVFNfQkNBU1QJCTB4MDAwMDA4OTQKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX0ZDU19FUlJPUlMJCTB4MDAwMDA4OTgKKyNkZWZpbmUgTUFDX1JYX1NUQVRTX0FMSUdOX0VSUk9SUwkweDAwMDAwODljCisjZGVmaW5lIE1BQ19SWF9TVEFUU19YT05fUEFVU0VfUkVDVkQJMHgwMDAwMDhhMAorI2RlZmluZSBNQUNfUlhfU1RBVFNfWE9GRl9QQVVTRV9SRUNWRAkweDAwMDAwOGE0CisjZGVmaW5lIE1BQ19SWF9TVEFUU19NQUNfQ1RSTF9SRUNWRAkweDAwMDAwOGE4CisjZGVmaW5lIE1BQ19SWF9TVEFUU19YT0ZGX0VOVEVSRUQJMHgwMDAwMDhhYworI2RlZmluZSBNQUNfUlhfU1RBVFNfRlJBTUVfVE9PX0xPTkcJMHgwMDAwMDhiMAorI2RlZmluZSBNQUNfUlhfU1RBVFNfSkFCQkVSUwkJMHgwMDAwMDhiNAorI2RlZmluZSBNQUNfUlhfU1RBVFNfVU5ERVJTSVpFCQkweDAwMDAwOGI4CisvKiAweDhiYyAtLT4gMHhjMDAgdW51c2VkICovCisKKy8qIFNlbmQgZGF0YSBpbml0aWF0b3IgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU05EREFUQUlfTU9ERQkJCTB4MDAwMDBjMDAKKyNkZWZpbmUgIFNORERBVEFJX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBTTkREQVRBSV9NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFNORERBVEFJX01PREVfU1RBVF9PRkxPV19FTkFCCSAweDAwMDAwMDA0CisjZGVmaW5lIFNORERBVEFJX1NUQVRVUwkJCTB4MDAwMDBjMDQKKyNkZWZpbmUgIFNORERBVEFJX1NUQVRVU19TVEFUX09GTE9XCSAweDAwMDAwMDA0CisjZGVmaW5lIFNORERBVEFJX1NUQVRTQ1RSTAkJMHgwMDAwMGMwOAorI2RlZmluZSAgU05EREFUQUlfU0NUUkxfRU5BQkxFCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgU05EREFUQUlfU0NUUkxfRkFTVFVQRAkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFNORERBVEFJX1NDVFJMX0NMRUFSCQkgMHgwMDAwMDAwNAorI2RlZmluZSAgU05EREFUQUlfU0NUUkxfRkxVU0gJCSAweDAwMDAwMDA4CisjZGVmaW5lICBTTkREQVRBSV9TQ1RSTF9GT1JDRV9aRVJPCSAweDAwMDAwMDEwCisjZGVmaW5lIFNORERBVEFJX1NUQVRTRU5BQgkJMHgwMDAwMGMwYworI2RlZmluZSBTTkREQVRBSV9TVEFUU0lOQ01BU0sJCTB4MDAwMDBjMTAKKy8qIDB4YzE0IC0tPiAweGM4MCB1bnVzZWQgKi8KKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF8wCQkweDAwMDAwYzgwCisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfMQkJMHgwMDAwMGM4NAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzIJCTB4MDAwMDBjODgKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF8zCQkweDAwMDAwYzhjCisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfNAkJMHgwMDAwMGM5MAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzUJCTB4MDAwMDBjOTQKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF82CQkweDAwMDAwYzk4CisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfNwkJMHgwMDAwMGM5YworI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzgJCTB4MDAwMDBjYTAKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF85CQkweDAwMDAwY2E0CisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfMTAJCTB4MDAwMDBjYTgKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF8xMQkJMHgwMDAwMGNhYworI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzEyCQkweDAwMDAwY2IwCisjZGVmaW5lIFNORERBVEFJX0NPU19DTlRfMTMJCTB4MDAwMDBjYjQKKyNkZWZpbmUgU05EREFUQUlfQ09TX0NOVF8xNAkJMHgwMDAwMGNiOAorI2RlZmluZSBTTkREQVRBSV9DT1NfQ05UXzE1CQkweDAwMDAwY2JjCisjZGVmaW5lIFNORERBVEFJX0RNQV9SRFFfRlVMTF9DTlQJMHgwMDAwMGNjMAorI2RlZmluZSBTTkREQVRBSV9ETUFfUFJJT19SRFFfRlVMTF9DTlQJMHgwMDAwMGNjNAorI2RlZmluZSBTTkREQVRBSV9TRENRX0ZVTExfQ05UCQkweDAwMDAwY2M4CisjZGVmaW5lIFNORERBVEFJX05JQ1JOR19TU05EX1BJRFhfQ05UCTB4MDAwMDBjY2MKKyNkZWZpbmUgU05EREFUQUlfU1RBVFNfVVBEQVRFRF9DTlQJMHgwMDAwMGNkMAorI2RlZmluZSBTTkREQVRBSV9JTlRFUlJVUFRTX0NOVAkJMHgwMDAwMGNkNAorI2RlZmluZSBTTkREQVRBSV9BVk9JRF9JTlRFUlJVUFRTX0NOVAkweDAwMDAwY2Q4CisjZGVmaW5lIFNORERBVEFJX1NORF9USFJFU0hfSElUX0NOVAkweDAwMDAwY2RjCisvKiAweGNlMCAtLT4gMHgxMDAwIHVudXNlZCAqLworCisvKiBTZW5kIGRhdGEgY29tcGxldGlvbiBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBTTkREQVRBQ19NT0RFCQkJMHgwMDAwMTAwMAorI2RlZmluZSAgU05EREFUQUNfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFNORERBVEFDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorLyogMHgxMDA0IC0tPiAweDE0MDAgdW51c2VkICovCisKKy8qIFNlbmQgQkQgcmluZyBzZWxlY3RvciAqLworI2RlZmluZSBTTkRCRFNfTU9ERQkJCTB4MDAwMDE0MDAKKyNkZWZpbmUgIFNOREJEU19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgU05EQkRTX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgU05EQkRTX01PREVfQVRUTl9FTkFCTEUJIDB4MDAwMDAwMDQKKyNkZWZpbmUgU05EQkRTX1NUQVRVUwkJCTB4MDAwMDE0MDQKKyNkZWZpbmUgIFNOREJEU19TVEFUVVNfRVJST1JfQVRUTgkgMHgwMDAwMDAwNAorI2RlZmluZSBTTkRCRFNfSFdESUFHCQkJMHgwMDAwMTQwOAorLyogMHgxNDBjIC0tPiAweDE0NDAgKi8KKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzAJCTB4MDAwMDE0NDAKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzEJCTB4MDAwMDE0NDQKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzIJCTB4MDAwMDE0NDgKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzMJCTB4MDAwMDE0NGMKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzQJCTB4MDAwMDE0NTAKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzUJCTB4MDAwMDE0NTQKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzYJCTB4MDAwMDE0NTgKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzcJCTB4MDAwMDE0NWMKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzgJCTB4MDAwMDE0NjAKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzkJCTB4MDAwMDE0NjQKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzEwCQkweDAwMDAxNDY4CisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF8xMQkJMHgwMDAwMTQ2YworI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfMTIJCTB4MDAwMDE0NzAKKyNkZWZpbmUgU05EQkRTX1NFTF9DT05fSURYXzEzCQkweDAwMDAxNDc0CisjZGVmaW5lIFNOREJEU19TRUxfQ09OX0lEWF8xNAkJMHgwMDAwMTQ3OAorI2RlZmluZSBTTkRCRFNfU0VMX0NPTl9JRFhfMTUJCTB4MDAwMDE0N2MKKy8qIDB4MTQ4MCAtLT4gMHgxODAwIHVudXNlZCAqLworCisvKiBTZW5kIEJEIGluaXRpYXRvciBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBTTkRCRElfTU9ERQkJCTB4MDAwMDE4MDAKKyNkZWZpbmUgIFNOREJESV9NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgU05EQkRJX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgU05EQkRJX01PREVfQVRUTl9FTkFCTEUJIDB4MDAwMDAwMDQKKyNkZWZpbmUgU05EQkRJX1NUQVRVUwkJCTB4MDAwMDE4MDQKKyNkZWZpbmUgIFNOREJESV9TVEFUVVNfRVJST1JfQVRUTgkgMHgwMDAwMDAwNAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMAkJMHgwMDAwMTgwOAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMQkJMHgwMDAwMTgwYworI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMgkJMHgwMDAwMTgxMAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMwkJMHgwMDAwMTgxNAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfNAkJMHgwMDAwMTgxOAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfNQkJMHgwMDAwMTgxYworI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfNgkJMHgwMDAwMTgyMAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfNwkJMHgwMDAwMTgyNAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfOAkJMHgwMDAwMTgyOAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfOQkJMHgwMDAwMTgyYworI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMTAJCTB4MDAwMDE4MzAKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzExCQkweDAwMDAxODM0CisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF8xMgkJMHgwMDAwMTgzOAorI2RlZmluZSBTTkRCRElfSU5fUFJPRF9JRFhfMTMJCTB4MDAwMDE4M2MKKyNkZWZpbmUgU05EQkRJX0lOX1BST0RfSURYXzE0CQkweDAwMDAxODQwCisjZGVmaW5lIFNOREJESV9JTl9QUk9EX0lEWF8xNQkJMHgwMDAwMTg0NAorLyogMHgxODQ4IC0tPiAweDFjMDAgdW51c2VkICovCisKKy8qIFNlbmQgQkQgY29tcGxldGlvbiBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBTTkRCRENfTU9ERQkJCTB4MDAwMDFjMDAKKyNkZWZpbmUgU05EQkRDX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lIFNOREJEQ19NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgU05EQkRDX01PREVfQVRUTl9FTkFCTEUJCSAweDAwMDAwMDA0CisvKiAweDFjMDQgLS0+IDB4MjAwMCB1bnVzZWQgKi8KKworLyogUmVjZWl2ZSBsaXN0IHBsYWNlbWVudCBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBSQ1ZMUENfTU9ERQkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgIFJDVkxQQ19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUkNWTFBDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUkNWTFBDX01PREVfQ0xBU1MwX0FUVE5fRU5BQgkgMHgwMDAwMDAwNAorI2RlZmluZSAgUkNWTFBDX01PREVfTUFQT09SX0FBVFROX0VOQUIJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFJDVkxQQ19NT0RFX1NUQVRfT0ZMT1dfRU5BQgkgMHgwMDAwMDAxMAorI2RlZmluZSBSQ1ZMUENfU1RBVFVTCQkJMHgwMDAwMjAwNAorI2RlZmluZSAgUkNWTFBDX1NUQVRVU19DTEFTUzAJCSAweDAwMDAwMDA0CisjZGVmaW5lICBSQ1ZMUENfU1RBVFVTX01BUE9PUgkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFJDVkxQQ19TVEFUVVNfU1RBVF9PRkxPVwkgMHgwMDAwMDAxMAorI2RlZmluZSBSQ1ZMUENfTE9DSwkJCTB4MDAwMDIwMDgKKyNkZWZpbmUgIFJDVkxQQ19MT0NLX1JFUV9NQVNLCQkgMHgwMDAwZmZmZgorI2RlZmluZSAgUkNWTFBDX0xPQ0tfUkVRX1NISUZUCQkgMAorI2RlZmluZSAgUkNWTFBDX0xPQ0tfR1JBTlRfTUFTSwkJIDB4ZmZmZjAwMDAKKyNkZWZpbmUgIFJDVkxQQ19MT0NLX0dSQU5UX1NISUZUCSAxNgorI2RlZmluZSBSQ1ZMUENfTk9OX0VNUFRZX0JJVFMJCTB4MDAwMDIwMGMKKyNkZWZpbmUgIFJDVkxQQ19OT05fRU1QVFlfQklUU19NQVNLCSAweDAwMDBmZmZmCisjZGVmaW5lIFJDVkxQQ19DT05GSUcJCQkweDAwMDAyMDEwCisjZGVmaW5lIFJDVkxQQ19TVEFUU0NUUkwJCTB4MDAwMDIwMTQKKyNkZWZpbmUgIFJDVkxQQ19TVEFUU0NUUkxfRU5BQkxFCSAweDAwMDAwMDAxCisjZGVmaW5lICBSQ1ZMUENfU1RBVFNDVFJMX0ZBU1RVUEQJIDB4MDAwMDAwMDIKKyNkZWZpbmUgUkNWTFBDX1NUQVRTX0VOQUJMRQkJMHgwMDAwMjAxOAorI2RlZmluZSAgUkNWTFBDX1NUQVRTRU5BQl9MTkdCUlNUX1JGSVgJIDB4MDA0MDAwMDAKKyNkZWZpbmUgUkNWTFBDX1NUQVRTX0lOQ01BU0sJCTB4MDAwMDIwMWMKKy8qIDB4MjAyMCAtLT4gMHgyMTAwIHVudXNlZCAqLworI2RlZmluZSBSQ1ZMUENfU0VMTFNUX0JBU0UJCTB4MDAwMDIxMDAgLyogMTYgMTYtYnl0ZSBlbnRyaWVzICovCisjZGVmaW5lICBTRUxMU1RfVEFJTAkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgIFNFTExTVF9DT05UCQkJMHgwMDAwMDAwOAorI2RlZmluZSAgU0VMTFNUX1VOVVNFRAkJCTB4MDAwMDAwMGMKKyNkZWZpbmUgUkNWTFBDX0NPU19DTlRMX0JBU0UJCTB4MDAwMDIyMDAgLyogMTYgNC1ieXRlIGVudHJpZXMgKi8KKyNkZWZpbmUgUkNWTFBDX0RST1BfRklMVEVSX0NOVAkJMHgwMDAwMjI0MAorI2RlZmluZSBSQ1ZMUENfRE1BX1dRX0ZVTExfQ05UCQkweDAwMDAyMjQ0CisjZGVmaW5lIFJDVkxQQ19ETUFfSElQUklPX1dRX0ZVTExfQ05UCTB4MDAwMDIyNDgKKyNkZWZpbmUgUkNWTFBDX05PX1JDVl9CRF9DTlQJCTB4MDAwMDIyNGMKKyNkZWZpbmUgUkNWTFBDX0lOX0RJU0NBUkRTX0NOVAkJMHgwMDAwMjI1MAorI2RlZmluZSBSQ1ZMUENfSU5fRVJST1JTX0NOVAkJMHgwMDAwMjI1NAorI2RlZmluZSBSQ1ZMUENfUkNWX1RIUkVTSF9ISVRfQ05UCTB4MDAwMDIyNTgKKy8qIDB4MjI1YyAtLT4gMHgyNDAwIHVudXNlZCAqLworCisvKiBSZWNlaXZlIERhdGEgYW5kIFJlY2VpdmUgQkQgSW5pdGlhdG9yIENvbnRyb2wgKi8KKyNkZWZpbmUgUkNWREJESV9NT0RFCQkJMHgwMDAwMjQwMAorI2RlZmluZSAgUkNWREJESV9NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUkNWREJESV9NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFJDVkRCRElfTU9ERV9KVU1CT0JEX05FRURFRAkgMHgwMDAwMDAwNAorI2RlZmluZSAgUkNWREJESV9NT0RFX0ZSTV9UT09fQklHCSAweDAwMDAwMDA4CisjZGVmaW5lICBSQ1ZEQkRJX01PREVfSU5WX1JJTkdfU1oJIDB4MDAwMDAwMTAKKyNkZWZpbmUgUkNWREJESV9TVEFUVVMJCQkweDAwMDAyNDA0CisjZGVmaW5lICBSQ1ZEQkRJX1NUQVRVU19KVU1CT0JEX05FRURFRAkgMHgwMDAwMDAwNAorI2RlZmluZSAgUkNWREJESV9TVEFUVVNfRlJNX1RPT19CSUcJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFJDVkRCRElfU1RBVFVTX0lOVl9SSU5HX1NaCSAweDAwMDAwMDEwCisjZGVmaW5lIFJDVkRCRElfU1BMSVRfRlJBTUVfTUlOU1oJMHgwMDAwMjQwOAorLyogMHgyNDBjIC0tPiAweDI0NDAgdW51c2VkICovCisjZGVmaW5lIFJDVkRCRElfSlVNQk9fQkQJCTB4MDAwMDI0NDAgLyogVEczX0JESU5GT18uLi4gKi8KKyNkZWZpbmUgUkNWREJESV9TVERfQkQJCQkweDAwMDAyNDUwIC8qIFRHM19CRElORk9fLi4uICovCisjZGVmaW5lIFJDVkRCRElfTUlOSV9CRAkJCTB4MDAwMDI0NjAgLyogVEczX0JESU5GT18uLi4gKi8KKyNkZWZpbmUgUkNWREJESV9KVU1CT19DT05fSURYCQkweDAwMDAyNDcwCisjZGVmaW5lIFJDVkRCRElfU1REX0NPTl9JRFgJCTB4MDAwMDI0NzQKKyNkZWZpbmUgUkNWREJESV9NSU5JX0NPTl9JRFgJCTB4MDAwMDI0NzgKKy8qIDB4MjQ3YyAtLT4gMHgyNDgwIHVudXNlZCAqLworI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzAJCTB4MDAwMDI0ODAKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF8xCQkweDAwMDAyNDg0CisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfMgkJMHgwMDAwMjQ4OAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzMJCTB4MDAwMDI0OGMKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF80CQkweDAwMDAyNDkwCisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfNQkJMHgwMDAwMjQ5NAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzYJCTB4MDAwMDI0OTgKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF83CQkweDAwMDAyNDljCisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfOAkJMHgwMDAwMjRhMAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzkJCTB4MDAwMDI0YTQKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF8xMAkJMHgwMDAwMjRhOAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzExCQkweDAwMDAyNGFjCisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfMTIJCTB4MDAwMDI0YjAKKyNkZWZpbmUgUkNWREJESV9CRF9QUk9EX0lEWF8xMwkJMHgwMDAwMjRiNAorI2RlZmluZSBSQ1ZEQkRJX0JEX1BST0RfSURYXzE0CQkweDAwMDAyNGI4CisjZGVmaW5lIFJDVkRCRElfQkRfUFJPRF9JRFhfMTUJCTB4MDAwMDI0YmMKKyNkZWZpbmUgUkNWREJESV9IV0RJQUcJCQkweDAwMDAyNGMwCisvKiAweDI0YzQgLS0+IDB4MjgwMCB1bnVzZWQgKi8KKworLyogUmVjZWl2ZSBEYXRhIENvbXBsZXRpb24gQ29udHJvbCAqLworI2RlZmluZSBSQ1ZEQ0NfTU9ERQkJCTB4MDAwMDI4MDAKKyNkZWZpbmUgIFJDVkRDQ19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUkNWRENDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUkNWRENDX01PREVfQVRUTl9FTkFCTEUJIDB4MDAwMDAwMDQKKy8qIDB4MjgwNCAtLT4gMHgyYzAwIHVudXNlZCAqLworCisvKiBSZWNlaXZlIEJEIEluaXRpYXRvciBDb250cm9sIFJlZ2lzdGVycyAqLworI2RlZmluZSBSQ1ZCRElfTU9ERQkJCTB4MDAwMDJjMDAKKyNkZWZpbmUgIFJDVkJESV9NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgUkNWQkRJX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUkNWQkRJX01PREVfUkNCX0FUVE5fRU5BQgkgMHgwMDAwMDAwNAorI2RlZmluZSBSQ1ZCRElfU1RBVFVTCQkJMHgwMDAwMmMwNAorI2RlZmluZSAgUkNWQkRJX1NUQVRVU19SQ0JfQVRUTgkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgUkNWQkRJX0pVTUJPX1BST0RfSURYCQkweDAwMDAyYzA4CisjZGVmaW5lIFJDVkJESV9TVERfUFJPRF9JRFgJCTB4MDAwMDJjMGMKKyNkZWZpbmUgUkNWQkRJX01JTklfUFJPRF9JRFgJCTB4MDAwMDJjMTAKKyNkZWZpbmUgUkNWQkRJX01JTklfVEhSRVNICQkweDAwMDAyYzE0CisjZGVmaW5lIFJDVkJESV9TVERfVEhSRVNICQkweDAwMDAyYzE4CisjZGVmaW5lIFJDVkJESV9KVU1CT19USFJFU0gJCTB4MDAwMDJjMWMKKy8qIDB4MmMyMCAtLT4gMHgzMDAwIHVudXNlZCAqLworCisvKiBSZWNlaXZlIEJEIENvbXBsZXRpb24gQ29udHJvbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUkNWQ0NfTU9ERQkJCTB4MDAwMDMwMDAKKyNkZWZpbmUgIFJDVkNDX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBSQ1ZDQ19NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFJDVkNDX01PREVfQVRUTl9FTkFCTEUJCSAweDAwMDAwMDA0CisjZGVmaW5lIFJDVkNDX1NUQVRVUwkJCTB4MDAwMDMwMDQKKyNkZWZpbmUgIFJDVkNDX1NUQVRVU19FUlJPUl9BVFROCSAweDAwMDAwMDA0CisjZGVmaW5lIFJDVkNDX0pVTVBfUFJPRF9JRFgJCTB4MDAwMDMwMDgKKyNkZWZpbmUgUkNWQ0NfU1REX1BST0RfSURYCQkweDAwMDAzMDBjCisjZGVmaW5lIFJDVkNDX01JTklfUFJPRF9JRFgJCTB4MDAwMDMwMTAKKy8qIDB4MzAxNCAtLT4gMHgzNDAwIHVudXNlZCAqLworCisvKiBSZWNlaXZlIGxpc3Qgc2VsZWN0b3IgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUkNWTFNDX01PREUJCQkweDAwMDAzNDAwCisjZGVmaW5lICBSQ1ZMU0NfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFJDVkxTQ19NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIFJDVkxTQ19NT0RFX0FUVE5fRU5BQkxFCSAweDAwMDAwMDA0CisjZGVmaW5lIFJDVkxTQ19TVEFUVVMJCQkweDAwMDAzNDA0CisjZGVmaW5lICBSQ1ZMU0NfU1RBVFVTX0VSUk9SX0FUVE4JIDB4MDAwMDAwMDQKKy8qIDB4MzQwOCAtLT4gMHgzODAwIHVudXNlZCAqLworCisvKiBNYnVmIGNsdXN0ZXIgZnJlZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTUJGUkVFX01PREUJCQkweDAwMDAzODAwCisjZGVmaW5lICBNQkZSRUVfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIE1CRlJFRV9NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgTUJGUkVFX1NUQVRVUwkJCTB4MDAwMDM4MDQKKy8qIDB4MzgwOCAtLT4gMHgzYzAwIHVudXNlZCAqLworCisvKiBIb3N0IGNvYWxlc2NpbmcgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSE9TVENDX01PREUJCQkweDAwMDAzYzAwCisjZGVmaW5lICBIT1NUQ0NfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIEhPU1RDQ19NT0RFX0VOQUJMRQkJIDB4MDAwMDAwMDIKKyNkZWZpbmUgIEhPU1RDQ19NT0RFX0FUVE4JCSAweDAwMDAwMDA0CisjZGVmaW5lICBIT1NUQ0NfTU9ERV9OT1cJCSAweDAwMDAwMDA4CisjZGVmaW5lICBIT1NUQ0NfTU9ERV9GVUxMX1NUQVRVUwkgMHgwMDAwMDAwMAorI2RlZmluZSAgSE9TVENDX01PREVfNjRCWVRFCQkgMHgwMDAwMDA4MAorI2RlZmluZSAgSE9TVENDX01PREVfMzJCWVRFCQkgMHgwMDAwMDEwMAorI2RlZmluZSAgSE9TVENDX01PREVfQ0xSVElDS19SWEJECSAweDAwMDAwMjAwCisjZGVmaW5lICBIT1NUQ0NfTU9ERV9DTFJUSUNLX1RYQkQJIDB4MDAwMDA0MDAKKyNkZWZpbmUgIEhPU1RDQ19NT0RFX05PSU5UX09OX05PVwkgMHgwMDAwMDgwMAorI2RlZmluZSAgSE9TVENDX01PREVfTk9JTlRfT05fRk9SQ0UJIDB4MDAwMDEwMDAKKyNkZWZpbmUgSE9TVENDX1NUQVRVUwkJCTB4MDAwMDNjMDQKKyNkZWZpbmUgIEhPU1RDQ19TVEFUVVNfRVJST1JfQVRUTgkgMHgwMDAwMDAwNAorI2RlZmluZSBIT1NUQ0NfUlhDT0xfVElDS1MJCTB4MDAwMDNjMDgKKyNkZWZpbmUgIExPV19SWENPTF9USUNLUwkJIDB4MDAwMDAwMzIKKyNkZWZpbmUgIERFRkFVTFRfUlhDT0xfVElDS1MJCSAweDAwMDAwMDQ4CisjZGVmaW5lICBISUdIX1JYQ09MX1RJQ0tTCQkgMHgwMDAwMDA5NgorI2RlZmluZSBIT1NUQ0NfVFhDT0xfVElDS1MJCTB4MDAwMDNjMGMKKyNkZWZpbmUgIExPV19UWENPTF9USUNLUwkJIDB4MDAwMDAwOTYKKyNkZWZpbmUgIERFRkFVTFRfVFhDT0xfVElDS1MJCSAweDAwMDAwMTJjCisjZGVmaW5lICBISUdIX1RYQ09MX1RJQ0tTCQkgMHgwMDAwMDE0NQorI2RlZmluZSBIT1NUQ0NfUlhNQVhfRlJBTUVTCQkweDAwMDAzYzEwCisjZGVmaW5lICBMT1dfUlhNQVhfRlJBTUVTCQkgMHgwMDAwMDAwNQorI2RlZmluZSAgREVGQVVMVF9SWE1BWF9GUkFNRVMJCSAweDAwMDAwMDA4CisjZGVmaW5lICBISUdIX1JYTUFYX0ZSQU1FUwkJIDB4MDAwMDAwMTIKKyNkZWZpbmUgSE9TVENDX1RYTUFYX0ZSQU1FUwkJMHgwMDAwM2MxNAorI2RlZmluZSAgTE9XX1RYTUFYX0ZSQU1FUwkJIDB4MDAwMDAwMzUKKyNkZWZpbmUgIERFRkFVTFRfVFhNQVhfRlJBTUVTCQkgMHgwMDAwMDA0YgorI2RlZmluZSAgSElHSF9UWE1BWF9GUkFNRVMJCSAweDAwMDAwMDUyCisjZGVmaW5lIEhPU1RDQ19SWENPQUxfVElDS19JTlQJCTB4MDAwMDNjMTgKKyNkZWZpbmUgIERFRkFVTFRfUlhDT0FMX1RJQ0tfSU5UCSAweDAwMDAwMDE5CisjZGVmaW5lIEhPU1RDQ19UWENPQUxfVElDS19JTlQJCTB4MDAwMDNjMWMKKyNkZWZpbmUgIERFRkFVTFRfVFhDT0FMX1RJQ0tfSU5UCSAweDAwMDAwMDE5CisjZGVmaW5lIEhPU1RDQ19SWENPQUxfTUFYRl9JTlQJCTB4MDAwMDNjMjAKKyNkZWZpbmUgIERFRkFVTFRfUlhDT0FMX01BWEZfSU5UCSAweDAwMDAwMDA1CisjZGVmaW5lIEhPU1RDQ19UWENPQUxfTUFYRl9JTlQJCTB4MDAwMDNjMjQKKyNkZWZpbmUgIERFRkFVTFRfVFhDT0FMX01BWEZfSU5UCSAweDAwMDAwMDA1CisjZGVmaW5lIEhPU1RDQ19TVEFUX0NPQUxfVElDS1MJCTB4MDAwMDNjMjgKKyNkZWZpbmUgIERFRkFVTFRfU1RBVF9DT0FMX1RJQ0tTCSAweDAwMGY0MjQwCisvKiAweDNjMmMgLS0+IDB4M2MzMCB1bnVzZWQgKi8KKyNkZWZpbmUgSE9TVENDX1NUQVRTX0JMS19IT1NUX0FERFIJMHgwMDAwM2MzMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgSE9TVENDX1NUQVRVU19CTEtfSE9TVF9BRERSCTB4MDAwMDNjMzggLyogNjQtYml0ICovCisjZGVmaW5lIEhPU1RDQ19TVEFUU19CTEtfTklDX0FERFIJMHgwMDAwM2M0MAorI2RlZmluZSBIT1NUQ0NfU1RBVFVTX0JMS19OSUNfQUREUgkweDAwMDAzYzQ0CisjZGVmaW5lIEhPU1RDQ19GTE9XX0FUVE4JCTB4MDAwMDNjNDgKKy8qIDB4M2M0YyAtLT4gMHgzYzUwIHVudXNlZCAqLworI2RlZmluZSBIT1NUQ0NfSlVNQk9fQ09OX0lEWAkJMHgwMDAwM2M1MAorI2RlZmluZSBIT1NUQ0NfU1REX0NPTl9JRFgJCTB4MDAwMDNjNTQKKyNkZWZpbmUgSE9TVENDX01JTklfQ09OX0lEWAkJMHgwMDAwM2M1OAorLyogMHgzYzVjIC0tPiAweDNjODAgdW51c2VkICovCisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfMAkJMHgwMDAwM2M4MAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzEJCTB4MDAwMDNjODQKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF8yCQkweDAwMDAzYzg4CisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfMwkJMHgwMDAwM2M4YworI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzQJCTB4MDAwMDNjOTAKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF81CQkweDAwMDAzYzk0CisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfNgkJMHgwMDAwM2M5OAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzcJCTB4MDAwMDNjOWMKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF84CQkweDAwMDAzY2EwCisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfOQkJMHgwMDAwM2NhNAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzEwCQkweDAwMDAzY2E4CisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfMTEJCTB4MDAwMDNjYWMKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF8xMgkJMHgwMDAwM2NiMAorI2RlZmluZSBIT1NUQ0NfUkVUX1BST0RfSURYXzEzCQkweDAwMDAzY2I0CisjZGVmaW5lIEhPU1RDQ19SRVRfUFJPRF9JRFhfMTQJCTB4MDAwMDNjYjgKKyNkZWZpbmUgSE9TVENDX1JFVF9QUk9EX0lEWF8xNQkJMHgwMDAwM2NiYworI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMAkJMHgwMDAwM2NjMAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMQkJMHgwMDAwM2NjNAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMgkJMHgwMDAwM2NjOAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMwkJMHgwMDAwM2NjYworI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfNAkJMHgwMDAwM2NkMAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfNQkJMHgwMDAwM2NkNAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfNgkJMHgwMDAwM2NkOAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfNwkJMHgwMDAwM2NkYworI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfOAkJMHgwMDAwM2NlMAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfOQkJMHgwMDAwM2NlNAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMTAJCTB4MDAwMDNjZTgKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzExCQkweDAwMDAzY2VjCisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF8xMgkJMHgwMDAwM2NmMAorI2RlZmluZSBIT1NUQ0NfU05EX0NPTl9JRFhfMTMJCTB4MDAwMDNjZjQKKyNkZWZpbmUgSE9TVENDX1NORF9DT05fSURYXzE0CQkweDAwMDAzY2Y4CisjZGVmaW5lIEhPU1RDQ19TTkRfQ09OX0lEWF8xNQkJMHgwMDAwM2NmYworLyogMHgzZDAwIC0tPiAweDQwMDAgdW51c2VkICovCisKKy8qIE1lbW9yeSBhcmJpdGVyIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1FTUFSQl9NT0RFCQkJMHgwMDAwNDAwMAorI2RlZmluZSAgTUVNQVJCX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBNRU1BUkJfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lIE1FTUFSQl9TVEFUVVMJCQkweDAwMDA0MDA0CisjZGVmaW5lIE1FTUFSQl9UUkFQX0FERFJfTE9XCQkweDAwMDA0MDA4CisjZGVmaW5lIE1FTUFSQl9UUkFQX0FERFJfSElHSAkJMHgwMDAwNDAwYworLyogMHg0MDEwIC0tPiAweDQ0MDAgdW51c2VkICovCisKKy8qIEJ1ZmZlciBtYW5hZ2VyIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIEJVRk1HUl9NT0RFCQkJMHgwMDAwNDQwMAorI2RlZmluZSAgQlVGTUdSX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBCVUZNR1JfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBCVUZNR1JfTU9ERV9BVFROX0VOQUJMRQkgMHgwMDAwMDAwNAorI2RlZmluZSAgQlVGTUdSX01PREVfQk1fVEVTVAkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIEJVRk1HUl9NT0RFX01CTE9XX0FUVE5fRU5BQgkgMHgwMDAwMDAxMAorI2RlZmluZSBCVUZNR1JfU1RBVFVTCQkJMHgwMDAwNDQwNAorI2RlZmluZSAgQlVGTUdSX1NUQVRVU19FUlJPUgkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIEJVRk1HUl9TVEFUVVNfTUJMT1cJCSAweDAwMDAwMDEwCisjZGVmaW5lIEJVRk1HUl9NQl9QT09MX0FERFIJCTB4MDAwMDQ0MDgKKyNkZWZpbmUgQlVGTUdSX01CX1BPT0xfU0laRQkJMHgwMDAwNDQwYworI2RlZmluZSBCVUZNR1JfTUJfUkRNQV9MT1dfV0FURVIJMHgwMDAwNDQxMAorI2RlZmluZSAgREVGQVVMVF9NQl9SRE1BX0xPV19XQVRFUgkgMHgwMDAwMDA1MAorI2RlZmluZSAgREVGQVVMVF9NQl9SRE1BX0xPV19XQVRFUl81NzA1CSAweDAwMDAwMDAwCisjZGVmaW5lICBERUZBVUxUX01CX1JETUFfTE9XX1dBVEVSX0pVTUJPIDB4MDAwMDAxMzAKKyNkZWZpbmUgQlVGTUdSX01CX01BQ1JYX0xPV19XQVRFUgkweDAwMDA0NDE0CisjZGVmaW5lICBERUZBVUxUX01CX01BQ1JYX0xPV19XQVRFUgkgIDB4MDAwMDAwMjAKKyNkZWZpbmUgIERFRkFVTFRfTUJfTUFDUlhfTE9XX1dBVEVSXzU3MDUgIDB4MDAwMDAwMTAKKyNkZWZpbmUgIERFRkFVTFRfTUJfTUFDUlhfTE9XX1dBVEVSX0pVTUJPIDB4MDAwMDAwOTgKKyNkZWZpbmUgQlVGTUdSX01CX0hJR0hfV0FURVIJCTB4MDAwMDQ0MTgKKyNkZWZpbmUgIERFRkFVTFRfTUJfSElHSF9XQVRFUgkJIDB4MDAwMDAwNjAKKyNkZWZpbmUgIERFRkFVTFRfTUJfSElHSF9XQVRFUl81NzA1CSAweDAwMDAwMDYwCisjZGVmaW5lICBERUZBVUxUX01CX0hJR0hfV0FURVJfSlVNQk8JIDB4MDAwMDAxN2MKKyNkZWZpbmUgQlVGTUdSX1JYX01CX0FMTE9DX1JFUQkJMHgwMDAwNDQxYworI2RlZmluZSAgQlVGTUdSX01CX0FMTE9DX0JJVAkJIDB4MTAwMDAwMDAKKyNkZWZpbmUgQlVGTUdSX1JYX01CX0FMTE9DX1JFU1AJCTB4MDAwMDQ0MjAKKyNkZWZpbmUgQlVGTUdSX1RYX01CX0FMTE9DX1JFUQkJMHgwMDAwNDQyNAorI2RlZmluZSBCVUZNR1JfVFhfTUJfQUxMT0NfUkVTUAkJMHgwMDAwNDQyOAorI2RlZmluZSBCVUZNR1JfRE1BX0RFU0NfUE9PTF9BRERSCTB4MDAwMDQ0MmMKKyNkZWZpbmUgQlVGTUdSX0RNQV9ERVNDX1BPT0xfU0laRQkweDAwMDA0NDMwCisjZGVmaW5lIEJVRk1HUl9ETUFfTE9XX1dBVEVSCQkweDAwMDA0NDM0CisjZGVmaW5lICBERUZBVUxUX0RNQV9MT1dfV0FURVIJCSAweDAwMDAwMDA1CisjZGVmaW5lIEJVRk1HUl9ETUFfSElHSF9XQVRFUgkJMHgwMDAwNDQzOAorI2RlZmluZSAgREVGQVVMVF9ETUFfSElHSF9XQVRFUgkJIDB4MDAwMDAwMGEKKyNkZWZpbmUgQlVGTUdSX1JYX0RNQV9BTExPQ19SRVEJCTB4MDAwMDQ0M2MKKyNkZWZpbmUgQlVGTUdSX1JYX0RNQV9BTExPQ19SRVNQCTB4MDAwMDQ0NDAKKyNkZWZpbmUgQlVGTUdSX1RYX0RNQV9BTExPQ19SRVEJCTB4MDAwMDQ0NDQKKyNkZWZpbmUgQlVGTUdSX1RYX0RNQV9BTExPQ19SRVNQCTB4MDAwMDQ0NDgKKyNkZWZpbmUgQlVGTUdSX0hXRElBR18wCQkJMHgwMDAwNDQ0YworI2RlZmluZSBCVUZNR1JfSFdESUFHXzEJCQkweDAwMDA0NDUwCisjZGVmaW5lIEJVRk1HUl9IV0RJQUdfMgkJCTB4MDAwMDQ0NTQKKy8qIDB4NDQ1OCAtLT4gMHg0ODAwIHVudXNlZCAqLworCisvKiBSZWFkIERNQSBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBSRE1BQ19NT0RFCQkJMHgwMDAwNDgwMAorI2RlZmluZSAgUkRNQUNfTU9ERV9SRVNFVAkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIFJETUFDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorI2RlZmluZSAgUkRNQUNfTU9ERV9UR1RBQk9SVF9FTkFCCSAweDAwMDAwMDA0CisjZGVmaW5lICBSRE1BQ19NT0RFX01TVEFCT1JUX0VOQUIJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFJETUFDX01PREVfUEFSSVRZRVJSX0VOQUIJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIFJETUFDX01PREVfQUREUk9GTE9XX0VOQUIJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFJETUFDX01PREVfRklGT09GTE9XX0VOQUIJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIFJETUFDX01PREVfRklGT1VSVU5fRU5BQgkgMHgwMDAwMDA4MAorI2RlZmluZSAgUkRNQUNfTU9ERV9GSUZPT1JFQURfRU5BQgkgMHgwMDAwMDEwMAorI2RlZmluZSAgUkRNQUNfTU9ERV9MTkdSRUFEX0VOQUIJIDB4MDAwMDAyMDAKKyNkZWZpbmUgIFJETUFDX01PREVfU1BMSVRfRU5BQkxFCSAweDAwMDAwODAwCisjZGVmaW5lICBSRE1BQ19NT0RFX1NQTElUX1JFU0VUCQkgMHgwMDAwMTAwMAorI2RlZmluZSAgUkRNQUNfTU9ERV9GSUZPX1NJWkVfMTI4CSAweDAwMDIwMDAwCisjZGVmaW5lICBSRE1BQ19NT0RFX0ZJRk9fTE9OR19CVVJTVAkgMHgwMDAzMDAwMAorI2RlZmluZSBSRE1BQ19TVEFUVVMJCQkweDAwMDA0ODA0CisjZGVmaW5lICBSRE1BQ19TVEFUVVNfVEdUQUJPUlQJCSAweDAwMDAwMDA0CisjZGVmaW5lICBSRE1BQ19TVEFUVVNfTVNUQUJPUlQJCSAweDAwMDAwMDA4CisjZGVmaW5lICBSRE1BQ19TVEFUVVNfUEFSSVRZRVJSCQkgMHgwMDAwMDAxMAorI2RlZmluZSAgUkRNQUNfU1RBVFVTX0FERFJPRkxPVwkJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIFJETUFDX1NUQVRVU19GSUZPT0ZMT1cJCSAweDAwMDAwMDQwCisjZGVmaW5lICBSRE1BQ19TVEFUVVNfRklGT1VSVU4JCSAweDAwMDAwMDgwCisjZGVmaW5lICBSRE1BQ19TVEFUVVNfRklGT09SRUFECQkgMHgwMDAwMDEwMAorI2RlZmluZSAgUkRNQUNfU1RBVFVTX0xOR1JFQUQJCSAweDAwMDAwMjAwCisvKiAweDQ4MDggLS0+IDB4NGMwMCB1bnVzZWQgKi8KKworLyogV3JpdGUgRE1BIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFdETUFDX01PREUJCQkweDAwMDA0YzAwCisjZGVmaW5lICBXRE1BQ19NT0RFX1JFU0VUCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgV0RNQUNfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lICBXRE1BQ19NT0RFX1RHVEFCT1JUX0VOQUIJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFdETUFDX01PREVfTVNUQUJPUlRfRU5BQgkgMHgwMDAwMDAwOAorI2RlZmluZSAgV0RNQUNfTU9ERV9QQVJJVFlFUlJfRU5BQgkgMHgwMDAwMDAxMAorI2RlZmluZSAgV0RNQUNfTU9ERV9BRERST0ZMT1dfRU5BQgkgMHgwMDAwMDAyMAorI2RlZmluZSAgV0RNQUNfTU9ERV9GSUZPT0ZMT1dfRU5BQgkgMHgwMDAwMDA0MAorI2RlZmluZSAgV0RNQUNfTU9ERV9GSUZPVVJVTl9FTkFCCSAweDAwMDAwMDgwCisjZGVmaW5lICBXRE1BQ19NT0RFX0ZJRk9PUkVBRF9FTkFCCSAweDAwMDAwMTAwCisjZGVmaW5lICBXRE1BQ19NT0RFX0xOR1JFQURfRU5BQgkgMHgwMDAwMDIwMAorI2RlZmluZSAgV0RNQUNfTU9ERV9SWF9BQ0NFTAkgCSAweDAwMDAwNDAwCisjZGVmaW5lIFdETUFDX1NUQVRVUwkJCTB4MDAwMDRjMDQKKyNkZWZpbmUgIFdETUFDX1NUQVRVU19UR1RBQk9SVAkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIFdETUFDX1NUQVRVU19NU1RBQk9SVAkJIDB4MDAwMDAwMDgKKyNkZWZpbmUgIFdETUFDX1NUQVRVU19QQVJJVFlFUlIJCSAweDAwMDAwMDEwCisjZGVmaW5lICBXRE1BQ19TVEFUVVNfQUREUk9GTE9XCQkgMHgwMDAwMDAyMAorI2RlZmluZSAgV0RNQUNfU1RBVFVTX0ZJRk9PRkxPVwkJIDB4MDAwMDAwNDAKKyNkZWZpbmUgIFdETUFDX1NUQVRVU19GSUZPVVJVTgkJIDB4MDAwMDAwODAKKyNkZWZpbmUgIFdETUFDX1NUQVRVU19GSUZPT1JFQUQJCSAweDAwMDAwMTAwCisjZGVmaW5lICBXRE1BQ19TVEFUVVNfTE5HUkVBRAkJIDB4MDAwMDAyMDAKKy8qIDB4NGMwOCAtLT4gMHg1MDAwIHVudXNlZCAqLworCisvKiBQZXItY3B1IHJlZ2lzdGVyIG9mZnNldHMgKGFybTkpICovCisjZGVmaW5lIENQVV9NT0RFCQkJMHgwMDAwMDAwMAorI2RlZmluZSAgQ1BVX01PREVfUkVTRVQJCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgQ1BVX01PREVfSEFMVAkJCSAweDAwMDAwNDAwCisjZGVmaW5lIENQVV9TVEFURQkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQ1BVX0VWVE1BU0sJCQkweDAwMDAwMDA4CisvKiAweGMgLS0+IDB4MWMgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQ1BVX1BDCQkJCTB4MDAwMDAwMWMKKyNkZWZpbmUgQ1BVX0lOU04JCQkweDAwMDAwMDIwCisjZGVmaW5lIENQVV9TUEFEX1VGTE9XCQkJMHgwMDAwMDAyNAorI2RlZmluZSBDUFVfV0RPR19DTEVBUgkJCTB4MDAwMDAwMjgKKyNkZWZpbmUgQ1BVX1dET0dfVkVDVE9SCQkJMHgwMDAwMDAyYworI2RlZmluZSBDUFVfV0RPR19QQwkJCTB4MDAwMDAwMzAKKyNkZWZpbmUgQ1BVX0hXX0JQCQkJMHgwMDAwMDAzNAorLyogMHgzOCAtLT4gMHg0NCB1bnVzZWQgKi8KKyNkZWZpbmUgQ1BVX1dET0dfU0FWRURfU1RBVEUJCTB4MDAwMDAwNDQKKyNkZWZpbmUgQ1BVX0xBU1RfQlJBTkNIX0FERFIJCTB4MDAwMDAwNDgKKyNkZWZpbmUgQ1BVX1NQQURfVUZMT1dfU0VUCQkweDAwMDAwMDRjCisvKiAweDUwIC0tPiAweDIwMCB1bnVzZWQgKi8KKyNkZWZpbmUgQ1BVX1IwCQkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgQ1BVX1IxCQkJCTB4MDAwMDAyMDQKKyNkZWZpbmUgQ1BVX1IyCQkJCTB4MDAwMDAyMDgKKyNkZWZpbmUgQ1BVX1IzCQkJCTB4MDAwMDAyMGMKKyNkZWZpbmUgQ1BVX1I0CQkJCTB4MDAwMDAyMTAKKyNkZWZpbmUgQ1BVX1I1CQkJCTB4MDAwMDAyMTQKKyNkZWZpbmUgQ1BVX1I2CQkJCTB4MDAwMDAyMTgKKyNkZWZpbmUgQ1BVX1I3CQkJCTB4MDAwMDAyMWMKKyNkZWZpbmUgQ1BVX1I4CQkJCTB4MDAwMDAyMjAKKyNkZWZpbmUgQ1BVX1I5CQkJCTB4MDAwMDAyMjQKKyNkZWZpbmUgQ1BVX1IxMAkJCQkweDAwMDAwMjI4CisjZGVmaW5lIENQVV9SMTEJCQkJMHgwMDAwMDIyYworI2RlZmluZSBDUFVfUjEyCQkJCTB4MDAwMDAyMzAKKyNkZWZpbmUgQ1BVX1IxMwkJCQkweDAwMDAwMjM0CisjZGVmaW5lIENQVV9SMTQJCQkJMHgwMDAwMDIzOAorI2RlZmluZSBDUFVfUjE1CQkJCTB4MDAwMDAyM2MKKyNkZWZpbmUgQ1BVX1IxNgkJCQkweDAwMDAwMjQwCisjZGVmaW5lIENQVV9SMTcJCQkJMHgwMDAwMDI0NAorI2RlZmluZSBDUFVfUjE4CQkJCTB4MDAwMDAyNDgKKyNkZWZpbmUgQ1BVX1IxOQkJCQkweDAwMDAwMjRjCisjZGVmaW5lIENQVV9SMjAJCQkJMHgwMDAwMDI1MAorI2RlZmluZSBDUFVfUjIxCQkJCTB4MDAwMDAyNTQKKyNkZWZpbmUgQ1BVX1IyMgkJCQkweDAwMDAwMjU4CisjZGVmaW5lIENQVV9SMjMJCQkJMHgwMDAwMDI1YworI2RlZmluZSBDUFVfUjI0CQkJCTB4MDAwMDAyNjAKKyNkZWZpbmUgQ1BVX1IyNQkJCQkweDAwMDAwMjY0CisjZGVmaW5lIENQVV9SMjYJCQkJMHgwMDAwMDI2OAorI2RlZmluZSBDUFVfUjI3CQkJCTB4MDAwMDAyNmMKKyNkZWZpbmUgQ1BVX1IyOAkJCQkweDAwMDAwMjcwCisjZGVmaW5lIENQVV9SMjkJCQkJMHgwMDAwMDI3NAorI2RlZmluZSBDUFVfUjMwCQkJCTB4MDAwMDAyNzgKKyNkZWZpbmUgQ1BVX1IzMQkJCQkweDAwMDAwMjdjCisvKiAweDI4MCAtLT4gMHg0MDAgdW51c2VkICovCisKKyNkZWZpbmUgUlhfQ1BVX0JBU0UJCQkweDAwMDA1MDAwCisjZGVmaW5lIFRYX0NQVV9CQVNFCQkJMHgwMDAwNTQwMAorCisvKiBNYWlsYm94ZXMgKi8KKyNkZWZpbmUgR1JDTUJPWF9JTlRFUlJVUFRfMAkJMHgwMDAwNTgwMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9JTlRFUlJVUFRfMQkJMHgwMDAwNTgwOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9JTlRFUlJVUFRfMgkJMHgwMDAwNTgxMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9JTlRFUlJVUFRfMwkJMHgwMDAwNTgxOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9HRU5FUkFMXzAJCTB4MDAwMDU4MjAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfR0VORVJBTF8xCQkweDAwMDA1ODI4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0dFTkVSQUxfMgkJMHgwMDAwNTgzMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9HRU5FUkFMXzMJCTB4MDAwMDU4MzggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfR0VORVJBTF80CQkweDAwMDA1ODQwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX0dFTkVSQUxfNQkJMHgwMDAwNTg0OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9HRU5FUkFMXzYJCTB4MDAwMDU4NTAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfR0VORVJBTF83CQkweDAwMDA1ODU4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JFTE9BRF9TVEFUCQkweDAwMDA1ODYwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlNURF9QUk9EX0lEWAkJMHgwMDAwNTg2OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZKVU1CT19QUk9EX0lEWAkweDAwMDA1ODcwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVk1JTklfUFJPRF9JRFgJMHgwMDAwNTg3OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF8wCTB4MDAwMDU4ODAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfMQkweDAwMDA1ODg4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzIJMHgwMDAwNTg5MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF8zCTB4MDAwMDU4OTggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfNAkweDAwMDA1OGEwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzUJMHgwMDAwNThhOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF82CTB4MDAwMDU4YjAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfNwkweDAwMDA1OGI4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzgJMHgwMDAwNThjMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF85CTB4MDAwMDU4YzggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfMTAJMHgwMDAwNThkMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF8xMQkweDAwMDA1OGQ4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzEyCTB4MDAwMDU4ZTAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfUkNWUkVUX0NPTl9JRFhfMTMJMHgwMDAwNThlOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9SQ1ZSRVRfQ09OX0lEWF8xNAkweDAwMDA1OGYwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1JDVlJFVF9DT05fSURYXzE1CTB4MDAwMDU4ZjggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8wCTB4MDAwMDU5MDAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8xCTB4MDAwMDU5MDggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8yCTB4MDAwMDU5MTAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8zCTB4MDAwMDU5MTggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF80CTB4MDAwMDU5MjAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF81CTB4MDAwMDU5MjggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF82CTB4MDAwMDU5MzAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF83CTB4MDAwMDU5MzggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF84CTB4MDAwMDU5NDAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF85CTB4MDAwMDU5NDggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8xMAkweDAwMDA1OTUwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfMTEJMHgwMDAwNTk1OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzEyCTB4MDAwMDU5NjAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ESE9TVF9QUk9EX0lEWF8xMwkweDAwMDA1OTY4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NOREhPU1RfUFJPRF9JRFhfMTQJMHgwMDAwNTk3MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkRIT1NUX1BST0RfSURYXzE1CTB4MDAwMDU5NzggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzAJMHgwMDAwNTk4MCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMQkweDAwMDA1OTg4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF8yCTB4MDAwMDU5OTAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzMJMHgwMDAwNTk5OCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfNAkweDAwMDA1OWEwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF81CTB4MDAwMDU5YTggLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzYJMHgwMDAwNTliMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfNwkweDAwMDA1OWI4IC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNNQk9YX1NORE5JQ19QUk9EX0lEWF84CTB4MDAwMDU5YzAgLyogNjQtYml0ICovCisjZGVmaW5lIEdSQ01CT1hfU05ETklDX1BST0RfSURYXzkJMHgwMDAwNTljOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMTAJMHgwMDAwNTlkMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMTEJMHgwMDAwNTlkOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMTIJMHgwMDAwNTllMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMTMJMHgwMDAwNTllOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMTQJMHgwMDAwNTlmMCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9TTkROSUNfUFJPRF9JRFhfMTUJMHgwMDAwNTlmOCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgR1JDTUJPWF9ISUdIX1BSSU9fRVZfVkVDVE9SCTB4MDAwMDVhMDAKKyNkZWZpbmUgR1JDTUJPWF9ISUdIX1BSSU9fRVZfTUFTSwkweDAwMDA1YTA0CisjZGVmaW5lIEdSQ01CT1hfTE9XX1BSSU9fRVZfVkVDCQkweDAwMDA1YTA4CisjZGVmaW5lIEdSQ01CT1hfTE9XX1BSSU9fRVZfTUFTSwkweDAwMDA1YTBjCisvKiAweDVhMTAgLS0+IDB4NWMwMCAqLworCisvKiBGbG93IFRocm91Z2ggcXVldWVzICovCisjZGVmaW5lIEZUUV9SRVNFVAkJCTB4MDAwMDVjMDAKKy8qIDB4NWMwNCAtLT4gMHg1YzEwIHVudXNlZCAqLworI2RlZmluZSBGVFFfRE1BX05PUk1fUkVBRF9DVEwJCTB4MDAwMDVjMTAKKyNkZWZpbmUgRlRRX0RNQV9OT1JNX1JFQURfRlVMTF9DTlQJMHgwMDAwNWMxNAorI2RlZmluZSBGVFFfRE1BX05PUk1fUkVBRF9GSUZPX0VOUURFUQkweDAwMDA1YzE4CisjZGVmaW5lIEZUUV9ETUFfTk9STV9SRUFEX1dSSVRFX1BFRUsJMHgwMDAwNWMxYworI2RlZmluZSBGVFFfRE1BX0hJR0hfUkVBRF9DVEwJCTB4MDAwMDVjMjAKKyNkZWZpbmUgRlRRX0RNQV9ISUdIX1JFQURfRlVMTF9DTlQJMHgwMDAwNWMyNAorI2RlZmluZSBGVFFfRE1BX0hJR0hfUkVBRF9GSUZPX0VOUURFUQkweDAwMDA1YzI4CisjZGVmaW5lIEZUUV9ETUFfSElHSF9SRUFEX1dSSVRFX1BFRUsJMHgwMDAwNWMyYworI2RlZmluZSBGVFFfRE1BX0NPTVBfRElTQ19DVEwJCTB4MDAwMDVjMzAKKyNkZWZpbmUgRlRRX0RNQV9DT01QX0RJU0NfRlVMTF9DTlQJMHgwMDAwNWMzNAorI2RlZmluZSBGVFFfRE1BX0NPTVBfRElTQ19GSUZPX0VOUURFUQkweDAwMDA1YzM4CisjZGVmaW5lIEZUUV9ETUFfQ09NUF9ESVNDX1dSSVRFX1BFRUsJMHgwMDAwNWMzYworI2RlZmluZSBGVFFfU0VORF9CRF9DT01QX0NUTAkJMHgwMDAwNWM0MAorI2RlZmluZSBGVFFfU0VORF9CRF9DT01QX0ZVTExfQ05UCTB4MDAwMDVjNDQKKyNkZWZpbmUgRlRRX1NFTkRfQkRfQ09NUF9GSUZPX0VOUURFUQkweDAwMDA1YzQ4CisjZGVmaW5lIEZUUV9TRU5EX0JEX0NPTVBfV1JJVEVfUEVFSwkweDAwMDA1YzRjCisjZGVmaW5lIEZUUV9TRU5EX0RBVEFfSU5JVF9DVEwJCTB4MDAwMDVjNTAKKyNkZWZpbmUgRlRRX1NFTkRfREFUQV9JTklUX0ZVTExfQ05UCTB4MDAwMDVjNTQKKyNkZWZpbmUgRlRRX1NFTkRfREFUQV9JTklUX0ZJRk9fRU5RREVRCTB4MDAwMDVjNTgKKyNkZWZpbmUgRlRRX1NFTkRfREFUQV9JTklUX1dSSVRFX1BFRUsJMHgwMDAwNWM1YworI2RlZmluZSBGVFFfRE1BX05PUk1fV1JJVEVfQ1RMCQkweDAwMDA1YzYwCisjZGVmaW5lIEZUUV9ETUFfTk9STV9XUklURV9GVUxMX0NOVAkweDAwMDA1YzY0CisjZGVmaW5lIEZUUV9ETUFfTk9STV9XUklURV9GSUZPX0VOUURFUQkweDAwMDA1YzY4CisjZGVmaW5lIEZUUV9ETUFfTk9STV9XUklURV9XUklURV9QRUVLCTB4MDAwMDVjNmMKKyNkZWZpbmUgRlRRX0RNQV9ISUdIX1dSSVRFX0NUTAkJMHgwMDAwNWM3MAorI2RlZmluZSBGVFFfRE1BX0hJR0hfV1JJVEVfRlVMTF9DTlQJMHgwMDAwNWM3NAorI2RlZmluZSBGVFFfRE1BX0hJR0hfV1JJVEVfRklGT19FTlFERVEJMHgwMDAwNWM3OAorI2RlZmluZSBGVFFfRE1BX0hJR0hfV1JJVEVfV1JJVEVfUEVFSwkweDAwMDA1YzdjCisjZGVmaW5lIEZUUV9TV1RZUEUxX0NUTAkJCTB4MDAwMDVjODAKKyNkZWZpbmUgRlRRX1NXVFlQRTFfRlVMTF9DTlQJCTB4MDAwMDVjODQKKyNkZWZpbmUgRlRRX1NXVFlQRTFfRklGT19FTlFERVEJCTB4MDAwMDVjODgKKyNkZWZpbmUgRlRRX1NXVFlQRTFfV1JJVEVfUEVFSwkJMHgwMDAwNWM4YworI2RlZmluZSBGVFFfU0VORF9EQVRBX0NPTVBfQ1RMCQkweDAwMDA1YzkwCisjZGVmaW5lIEZUUV9TRU5EX0RBVEFfQ09NUF9GVUxMX0NOVAkweDAwMDA1Yzk0CisjZGVmaW5lIEZUUV9TRU5EX0RBVEFfQ09NUF9GSUZPX0VOUURFUQkweDAwMDA1Yzk4CisjZGVmaW5lIEZUUV9TRU5EX0RBVEFfQ09NUF9XUklURV9QRUVLCTB4MDAwMDVjOWMKKyNkZWZpbmUgRlRRX0hPU1RfQ09BTF9DVEwJCTB4MDAwMDVjYTAKKyNkZWZpbmUgRlRRX0hPU1RfQ09BTF9GVUxMX0NOVAkJMHgwMDAwNWNhNAorI2RlZmluZSBGVFFfSE9TVF9DT0FMX0ZJRk9fRU5RREVRCTB4MDAwMDVjYTgKKyNkZWZpbmUgRlRRX0hPU1RfQ09BTF9XUklURV9QRUVLCTB4MDAwMDVjYWMKKyNkZWZpbmUgRlRRX01BQ19UWF9DVEwJCQkweDAwMDA1Y2IwCisjZGVmaW5lIEZUUV9NQUNfVFhfRlVMTF9DTlQJCTB4MDAwMDVjYjQKKyNkZWZpbmUgRlRRX01BQ19UWF9GSUZPX0VOUURFUQkJMHgwMDAwNWNiOAorI2RlZmluZSBGVFFfTUFDX1RYX1dSSVRFX1BFRUsJCTB4MDAwMDVjYmMKKyNkZWZpbmUgRlRRX01CX0ZSRUVfQ1RMCQkJMHgwMDAwNWNjMAorI2RlZmluZSBGVFFfTUJfRlJFRV9GVUxMX0NOVAkJMHgwMDAwNWNjNAorI2RlZmluZSBGVFFfTUJfRlJFRV9GSUZPX0VOUURFUQkJMHgwMDAwNWNjOAorI2RlZmluZSBGVFFfTUJfRlJFRV9XUklURV9QRUVLCQkweDAwMDA1Y2NjCisjZGVmaW5lIEZUUV9SQ1ZCRF9DT01QX0NUTAkJMHgwMDAwNWNkMAorI2RlZmluZSBGVFFfUkNWQkRfQ09NUF9GVUxMX0NOVAkJMHgwMDAwNWNkNAorI2RlZmluZSBGVFFfUkNWQkRfQ09NUF9GSUZPX0VOUURFUQkweDAwMDA1Y2Q4CisjZGVmaW5lIEZUUV9SQ1ZCRF9DT01QX1dSSVRFX1BFRUsJMHgwMDAwNWNkYworI2RlZmluZSBGVFFfUkNWTFNUX1BMTVRfQ1RMCQkweDAwMDA1Y2UwCisjZGVmaW5lIEZUUV9SQ1ZMU1RfUExNVF9GVUxMX0NOVAkweDAwMDA1Y2U0CisjZGVmaW5lIEZUUV9SQ1ZMU1RfUExNVF9GSUZPX0VOUURFUQkweDAwMDA1Y2U4CisjZGVmaW5lIEZUUV9SQ1ZMU1RfUExNVF9XUklURV9QRUVLCTB4MDAwMDVjZWMKKyNkZWZpbmUgRlRRX1JDVkRBVEFfSU5JX0NUTAkJMHgwMDAwNWNmMAorI2RlZmluZSBGVFFfUkNWREFUQV9JTklfRlVMTF9DTlQJMHgwMDAwNWNmNAorI2RlZmluZSBGVFFfUkNWREFUQV9JTklfRklGT19FTlFERVEJMHgwMDAwNWNmOAorI2RlZmluZSBGVFFfUkNWREFUQV9JTklfV1JJVEVfUEVFSwkweDAwMDA1Y2ZjCisjZGVmaW5lIEZUUV9SQ1ZEQVRBX0NPTVBfQ1RMCQkweDAwMDA1ZDAwCisjZGVmaW5lIEZUUV9SQ1ZEQVRBX0NPTVBfRlVMTF9DTlQJMHgwMDAwNWQwNAorI2RlZmluZSBGVFFfUkNWREFUQV9DT01QX0ZJRk9fRU5RREVRCTB4MDAwMDVkMDgKKyNkZWZpbmUgRlRRX1JDVkRBVEFfQ09NUF9XUklURV9QRUVLCTB4MDAwMDVkMGMKKyNkZWZpbmUgRlRRX1NXVFlQRTJfQ1RMCQkJMHgwMDAwNWQxMAorI2RlZmluZSBGVFFfU1dUWVBFMl9GVUxMX0NOVAkJMHgwMDAwNWQxNAorI2RlZmluZSBGVFFfU1dUWVBFMl9GSUZPX0VOUURFUQkJMHgwMDAwNWQxOAorI2RlZmluZSBGVFFfU1dUWVBFMl9XUklURV9QRUVLCQkweDAwMDA1ZDFjCisvKiAweDVkMjAgLS0+IDB4NjAwMCB1bnVzZWQgKi8KKworLyogTWVzc2FnZSBzaWduYWxlZCBpbnRlcnJ1cHQgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1TR0lOVF9NT0RFCQkJMHgwMDAwNjAwMAorI2RlZmluZSAgTVNHSU5UX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBNU0dJTlRfTU9ERV9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lIE1TR0lOVF9TVEFUVVMJCQkweDAwMDA2MDA0CisjZGVmaW5lIE1TR0lOVF9GSUZPCQkJMHgwMDAwNjAwOAorLyogMHg2MDBjIC0tPiAweDY0MDAgdW51c2VkICovCisKKy8qIERNQSBjb21wbGV0aW9uIHJlZ2lzdGVycyAqLworI2RlZmluZSBETUFDX01PREUJCQkweDAwMDA2NDAwCisjZGVmaW5lICBETUFDX01PREVfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBETUFDX01PREVfRU5BQkxFCQkgMHgwMDAwMDAwMgorLyogMHg2NDA0IC0tPiAweDY4MDAgdW51c2VkICovCisKKy8qIEdSQyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgR1JDX01PREUJCQkweDAwMDA2ODAwCisjZGVmaW5lICBHUkNfTU9ERV9VUERfT05fQ09BTAkJMHgwMDAwMDAwMQorI2RlZmluZSAgR1JDX01PREVfQlNXQVBfTk9ORlJNX0RBVEEJMHgwMDAwMDAwMgorI2RlZmluZSAgR1JDX01PREVfV1NXQVBfTk9ORlJNX0RBVEEJMHgwMDAwMDAwNAorI2RlZmluZSAgR1JDX01PREVfQlNXQVBfREFUQQkJMHgwMDAwMDAxMAorI2RlZmluZSAgR1JDX01PREVfV1NXQVBfREFUQQkJMHgwMDAwMDAyMAorI2RlZmluZSAgR1JDX01PREVfU1BMSVRIRFIJCTB4MDAwMDAxMDAKKyNkZWZpbmUgIEdSQ19NT0RFX05PRlJNX0NSQUNLSU5HCTB4MDAwMDAyMDAKKyNkZWZpbmUgIEdSQ19NT0RFX0lOQ0xfQ1JDCQkweDAwMDAwNDAwCisjZGVmaW5lICBHUkNfTU9ERV9BTExPV19CQURfRlJNUwkweDAwMDAwODAwCisjZGVmaW5lICBHUkNfTU9ERV9OT0lSUV9PTl9TRU5EUwkweDAwMDAyMDAwCisjZGVmaW5lICBHUkNfTU9ERV9OT0lSUV9PTl9SQ1YJCTB4MDAwMDQwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX0ZPUkNFX1BDSTMyQklUCTB4MDAwMDgwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX0hPU1RfU1RBQ0tVUAkJMHgwMDAxMDAwMAorI2RlZmluZSAgR1JDX01PREVfSE9TVF9TRU5EQkRTCQkweDAwMDIwMDAwCisjZGVmaW5lICBHUkNfTU9ERV9OT19UWF9QSERSX0NTVU0JMHgwMDEwMDAwMAorI2RlZmluZSAgR1JDX01PREVfTlZSQU1fV1JfRU5BQkxFCTB4MDAyMDAwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX05PX1JYX1BIRFJfQ1NVTQkweDAwODAwMDAwCisjZGVmaW5lICBHUkNfTU9ERV9JUlFfT05fVFhfQ1BVX0FUVE4JMHgwMTAwMDAwMAorI2RlZmluZSAgR1JDX01PREVfSVJRX09OX1JYX0NQVV9BVFROCTB4MDIwMDAwMDAKKyNkZWZpbmUgIEdSQ19NT0RFX0lSUV9PTl9NQUNfQVRUTgkweDA0MDAwMDAwCisjZGVmaW5lICBHUkNfTU9ERV9JUlFfT05fRE1BX0FUVE4JMHgwODAwMDAwMAorI2RlZmluZSAgR1JDX01PREVfSVJRX09OX0ZMT1dfQVRUTgkweDEwMDAwMDAwCisjZGVmaW5lICBHUkNfTU9ERV80WF9OSUNfU0VORF9SSU5HUwkweDIwMDAwMDAwCisjZGVmaW5lICBHUkNfTU9ERV9NQ0FTVF9GUk1fRU5BQkxFCTB4NDAwMDAwMDAKKyNkZWZpbmUgR1JDX01JU0NfQ0ZHCQkJMHgwMDAwNjgwNAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0NPUkVDTEtfUkVTRVQJMHgwMDAwMDAwMQorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX1BSRVNDQUxBUl9NQVNLCTB4MDAwMDAwZmUKKyNkZWZpbmUgIEdSQ19NSVNDX0NGR19QUkVTQ0FMQVJfU0hJRlQJMQorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEX01BU0sJMHgwMDAxZTAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3MDAJMHgwMDAxZTAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3MDEJMHgwMDAwMDAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3MDJGRQkweDAwMDA0MDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTcwMwkweDAwMDAwMDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTcwM1MJMHgwMDAwMjAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3MDQJMHgwMDAwMDAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEXzU3MDRDSU9CRSAweDAwMDA0MDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTcwNF9BMgkweDAwMDA4MDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTc4OAkweDAwMDEwMDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfQk9BUkRfSURfNTc4OE0JMHgwMDAxODAwMAorI2RlZmluZSAgR1JDX01JU0NfQ0ZHX0JPQVJEX0lEX0FDOTEwMDJBMSAweDAwMDE4MDAwCisjZGVmaW5lICBHUkNfTUlTQ19DRkdfS0VFUF9HUEhZX1BPV0VSCTB4MDQwMDAwMDAKKyNkZWZpbmUgR1JDX0xPQ0FMX0NUUkwJCQkweDAwMDA2ODA4CisjZGVmaW5lICBHUkNfTENMQ1RSTF9JTlRfQUNUSVZFCQkweDAwMDAwMDAxCisjZGVmaW5lICBHUkNfTENMQ1RSTF9DTEVBUklOVAkJMHgwMDAwMDAwMgorI2RlZmluZSAgR1JDX0xDTENUUkxfU0VUSU5UCQkweDAwMDAwMDA0CisjZGVmaW5lICBHUkNfTENMQ1RSTF9JTlRfT05fQVRUTgkweDAwMDAwMDA4CisjZGVmaW5lICBHUkNfTENMQ1RSTF9HUElPX0lOUFVUMAkweDAwMDAwMTAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9HUElPX0lOUFVUMQkweDAwMDAwMjAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9HUElPX0lOUFVUMgkweDAwMDAwNDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9HUElPX09FMAkJMHgwMDAwMDgwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfR1BJT19PRTEJCTB4MDAwMDEwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0dQSU9fT0UyCQkweDAwMDAyMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9HUElPX09VVFBVVDAJMHgwMDAwNDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfR1BJT19PVVRQVVQxCTB4MDAwMDgwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0dQSU9fT1VUUFVUMgkweDAwMDEwMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9FWFRNRU1fRU5BQkxFCTB4MDAwMjAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX01FTVNaX01BU0sJCTB4MDAxYzAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX01FTVNaXzI1NksJCTB4MDAwMDAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX01FTVNaXzUxMksJCTB4MDAwNDAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX01FTVNaXzFNCQkweDAwMDgwMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9NRU1TWl8yTQkJMHgwMDBjMDAwMAorI2RlZmluZSAgR1JDX0xDTENUUkxfTUVNU1pfNE0JCTB4MDAxMDAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX01FTVNaXzhNCQkweDAwMTQwMDAwCisjZGVmaW5lICBHUkNfTENMQ1RSTF9NRU1TWl8xNk0JCTB4MDAxODAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0JBTktfU0VMRUNUCTB4MDAyMDAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX1NTUkFNX1RZUEUJCTB4MDA0MDAwMDAKKyNkZWZpbmUgIEdSQ19MQ0xDVFJMX0FVVE9fU0VFUFJPTQkweDAxMDAwMDAwCisjZGVmaW5lIEdSQ19USU1FUgkJCTB4MDAwMDY4MGMKKyNkZWZpbmUgR1JDX1JYX0NQVV9FVkVOVAkJMHgwMDAwNjgxMAorI2RlZmluZSBHUkNfUlhfVElNRVJfUkVGCQkweDAwMDA2ODE0CisjZGVmaW5lIEdSQ19SWF9DUFVfU0VNCQkJMHgwMDAwNjgxOAorI2RlZmluZSBHUkNfUkVNT1RFX1JYX0NQVV9BVFROCQkweDAwMDA2ODFjCisjZGVmaW5lIEdSQ19UWF9DUFVfRVZFTlQJCTB4MDAwMDY4MjAKKyNkZWZpbmUgR1JDX1RYX1RJTUVSX1JFRgkJMHgwMDAwNjgyNAorI2RlZmluZSBHUkNfVFhfQ1BVX1NFTQkJCTB4MDAwMDY4MjgKKyNkZWZpbmUgR1JDX1JFTU9URV9UWF9DUFVfQVRUTgkJMHgwMDAwNjgyYworI2RlZmluZSBHUkNfTUVNX1BPV0VSX1VQCQkweDAwMDA2ODMwIC8qIDY0LWJpdCAqLworI2RlZmluZSBHUkNfRUVQUk9NX0FERFIJCQkweDAwMDA2ODM4CisjZGVmaW5lICBFRVBST01fQUREUl9XUklURQkJMHgwMDAwMDAwMAorI2RlZmluZSAgRUVQUk9NX0FERFJfUkVBRAkJMHg4MDAwMDAwMAorI2RlZmluZSAgRUVQUk9NX0FERFJfQ09NUExFVEUJCTB4NDAwMDAwMDAKKyNkZWZpbmUgIEVFUFJPTV9BRERSX0ZTTV9SRVNFVAkJMHgyMDAwMDAwMAorI2RlZmluZSAgRUVQUk9NX0FERFJfREVWSURfTUFTSwkJMHgxYzAwMDAwMAorI2RlZmluZSAgRUVQUk9NX0FERFJfREVWSURfU0hJRlQJMjYKKyNkZWZpbmUgIEVFUFJPTV9BRERSX1NUQVJUCQkweDAyMDAwMDAwCisjZGVmaW5lICBFRVBST01fQUREUl9DTEtQRVJEX1NISUZUCTE2CisjZGVmaW5lICBFRVBST01fQUREUl9BRERSX01BU0sJCTB4MDAwMGZmZmYKKyNkZWZpbmUgIEVFUFJPTV9BRERSX0FERFJfU0hJRlQJCTAKKyNkZWZpbmUgIEVFUFJPTV9ERUZBVUxUX0NMT0NLX1BFUklPRAkweDYwCisjZGVmaW5lICBFRVBST01fQ0hJUF9TSVpFCQkoNjQgKiAxMDI0KQorI2RlZmluZSBHUkNfRUVQUk9NX0RBVEEJCQkweDAwMDA2ODNjCisjZGVmaW5lIEdSQ19FRVBST01fQ1RSTAkJCTB4MDAwMDY4NDAKKyNkZWZpbmUgR1JDX01ESV9DVFJMCQkJMHgwMDAwNjg0NAorI2RlZmluZSBHUkNfU0VFUFJPTV9ERUxBWQkJMHgwMDAwNjg0OAorLyogMHg2ODRjIC0tPiAweDZjMDAgdW51c2VkICovCisKKy8qIDB4NmMwMCAtLT4gMHg3MDAwIHVudXNlZCAqLworCisvKiBOVlJBTSBDb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBOVlJBTV9DTUQJCQkweDAwMDA3MDAwCisjZGVmaW5lICBOVlJBTV9DTURfUkVTRVQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBOVlJBTV9DTURfRE9ORQkJCSAweDAwMDAwMDA4CisjZGVmaW5lICBOVlJBTV9DTURfR08JCQkgMHgwMDAwMDAxMAorI2RlZmluZSAgTlZSQU1fQ01EX1dSCQkJIDB4MDAwMDAwMjAKKyNkZWZpbmUgIE5WUkFNX0NNRF9SRAkJCSAweDAwMDAwMDAwCisjZGVmaW5lICBOVlJBTV9DTURfRVJBU0UJCSAweDAwMDAwMDQwCisjZGVmaW5lICBOVlJBTV9DTURfRklSU1QJCSAweDAwMDAwMDgwCisjZGVmaW5lICBOVlJBTV9DTURfTEFTVAkJCSAweDAwMDAwMTAwCisjZGVmaW5lICBOVlJBTV9DTURfV1JFTgkJCSAweDAwMDEwMDAwCisjZGVmaW5lICBOVlJBTV9DTURfV1JESQkJCSAweDAwMDIwMDAwCisjZGVmaW5lIE5WUkFNX1NUQVQJCQkweDAwMDA3MDA0CisjZGVmaW5lIE5WUkFNX1dSREFUQQkJCTB4MDAwMDcwMDgKKyNkZWZpbmUgTlZSQU1fQUREUgkJCTB4MDAwMDcwMGMKKyNkZWZpbmUgIE5WUkFNX0FERFJfTVNLCQkJMHgwMGZmZmZmZgorI2RlZmluZSBOVlJBTV9SRERBVEEJCQkweDAwMDA3MDEwCisjZGVmaW5lIE5WUkFNX0NGRzEJCQkweDAwMDA3MDE0CisjZGVmaW5lICBOVlJBTV9DRkcxX0ZMQVNISUZfRU5BQgkgMHgwMDAwMDAwMQorI2RlZmluZSAgTlZSQU1fQ0ZHMV9CVUZGRVJFRF9NT0RFCSAweDAwMDAwMDAyCisjZGVmaW5lICBOVlJBTV9DRkcxX1BBU1NfVEhSVQkJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIE5WUkFNX0NGRzFfU1RBVFVTX0JJVFMJCSAweDAwMDAwMDcwCisjZGVmaW5lICBOVlJBTV9DRkcxX0JJVF9CQU5HCQkgMHgwMDAwMDAwOAorI2RlZmluZSAgTlZSQU1fQ0ZHMV9GTEFTSF9TSVpFCQkgMHgwMjAwMDAwMAorI2RlZmluZSAgTlZSQU1fQ0ZHMV9DT01QQVRfQllQQVNTCSAweDgwMDAwMDAwCisjZGVmaW5lICBOVlJBTV9DRkcxX1ZFTkRPUl9NQVNLCQkgMHgwMzAwMDAwMworI2RlZmluZSAgRkxBU0hfVkVORE9SX0FUTUVMX0VFUFJPTQkgMHgwMjAwMDAwMAorI2RlZmluZSAgRkxBU0hfVkVORE9SX0FUTUVMX0ZMQVNIX0JVRkZFUkVECSAweDAyMDAwMDAzCisjZGVmaW5lICBGTEFTSF9WRU5ET1JfQVRNRUxfRkxBU0hfVU5CVUZGRVJFRAkgMHgwMDAwMDAwMworI2RlZmluZSAgRkxBU0hfVkVORE9SX1NUCQkJIDB4MDMwMDAwMDEKKyNkZWZpbmUgIEZMQVNIX1ZFTkRPUl9TQUlGVU4JCSAweDAxMDAwMDAzCisjZGVmaW5lICBGTEFTSF9WRU5ET1JfU1NUX1NNQUxMCQkgMHgwMDAwMDAwMQorI2RlZmluZSAgRkxBU0hfVkVORE9SX1NTVF9MQVJHRQkJIDB4MDIwMDAwMDEKKyNkZWZpbmUgTlZSQU1fQ0ZHMgkJCTB4MDAwMDcwMTgKKyNkZWZpbmUgTlZSQU1fQ0ZHMwkJCTB4MDAwMDcwMWMKKyNkZWZpbmUgTlZSQU1fU1dBUkIJCQkweDAwMDA3MDIwCisjZGVmaW5lICBTV0FSQl9SRVFfU0VUMAkJCSAweDAwMDAwMDAxCisjZGVmaW5lICBTV0FSQl9SRVFfU0VUMQkJCSAweDAwMDAwMDAyCisjZGVmaW5lICBTV0FSQl9SRVFfU0VUMgkJCSAweDAwMDAwMDA0CisjZGVmaW5lICBTV0FSQl9SRVFfU0VUMwkJCSAweDAwMDAwMDA4CisjZGVmaW5lICBTV0FSQl9SRVFfQ0xSMAkJCSAweDAwMDAwMDEwCisjZGVmaW5lICBTV0FSQl9SRVFfQ0xSMQkJCSAweDAwMDAwMDIwCisjZGVmaW5lICBTV0FSQl9SRVFfQ0xSMgkJCSAweDAwMDAwMDQwCisjZGVmaW5lICBTV0FSQl9SRVFfQ0xSMwkJCSAweDAwMDAwMDgwCisjZGVmaW5lICBTV0FSQl9HTlQwCQkJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIFNXQVJCX0dOVDEJCQkgMHgwMDAwMDIwMAorI2RlZmluZSAgU1dBUkJfR05UMgkJCSAweDAwMDAwNDAwCisjZGVmaW5lICBTV0FSQl9HTlQzCQkJIDB4MDAwMDA4MDAKKyNkZWZpbmUgIFNXQVJCX1JFUTAJCQkgMHgwMDAwMTAwMAorI2RlZmluZSAgU1dBUkJfUkVRMQkJCSAweDAwMDAyMDAwCisjZGVmaW5lICBTV0FSQl9SRVEyCQkJIDB4MDAwMDQwMDAKKyNkZWZpbmUgIFNXQVJCX1JFUTMJCQkgMHgwMDAwODAwMAorI2RlZmluZSBOVlJBTV9BQ0NFU1MJCQkweDAwMDA3MDI0CisjZGVmaW5lICBBQ0NFU1NfRU5BQkxFCQkJIDB4MDAwMDAwMDEKKyNkZWZpbmUgIEFDQ0VTU19XUl9FTkFCTEUJCSAweDAwMDAwMDAyCisjZGVmaW5lIE5WUkFNX1dSSVRFMQkJCTB4MDAwMDcwMjgKKy8qIDB4NzAyYyAtLT4gMHg3NDAwIHVudXNlZCAqLworCisvKiAweDc0MDAgLS0+IDB4ODAwMCB1bnVzZWQgKi8KKworI2RlZmluZSBURzNfRUVQUk9NX01BR0lDCQkweDY2OTk1NWFhCisKKy8qIDMySyBXaW5kb3cgaW50byBOSUMgaW50ZXJuYWwgbWVtb3J5ICovCisjZGVmaW5lIE5JQ19TUkFNX1dJTl9CQVNFCQkweDAwMDA4MDAwCisKKy8qIE9mZnNldHMgaW50byBmaXJzdCAzMmsgb2YgTklDIGludGVybmFsIG1lbW9yeS4gKi8KKyNkZWZpbmUgTklDX1NSQU1fUEFHRV9aRVJPCQkweDAwMDAwMDAwCisjZGVmaW5lIE5JQ19TUkFNX1NFTkRfUkNCCQkweDAwMDAwMTAwIC8qIDE2ICogVEczX0JESU5GT18uLi4gKi8KKyNkZWZpbmUgTklDX1NSQU1fUkNWX1JFVF9SQ0IJCTB4MDAwMDAyMDAgLyogMTYgKiBURzNfQkRJTkZPXy4uLiAqLworI2RlZmluZSBOSUNfU1JBTV9TVEFUU19CTEsJCTB4MDAwMDAzMDAKKyNkZWZpbmUgTklDX1NSQU1fU1RBVFVTX0JMSwkJMHgwMDAwMGIwMAorCisjZGVmaW5lIE5JQ19TUkFNX0ZJUk1XQVJFX01CT1gJCTB4MDAwMDBiNTAKKyNkZWZpbmUgIE5JQ19TUkFNX0ZJUk1XQVJFX01CT1hfTUFHSUMxCSAweDRCNjU3NjU0CisjZGVmaW5lICBOSUNfU1JBTV9GSVJNV0FSRV9NQk9YX01BR0lDMgkgMHg0ODYxNzY0YiAvKiAhZG1hIG9uIGxpbmtjaGcgKi8KKworI2RlZmluZSBOSUNfU1JBTV9EQVRBX1NJRwkJMHgwMDAwMGI1NAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9TSUdfTUFHSUMJIDB4NGI2NTc2NTQgLyogYXNjaWkgZm9yICdLZXZUJyAqLworCisjZGVmaW5lIE5JQ19TUkFNX0RBVEFfQ0ZHCQkJMHgwMDAwMGI1OAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfTEVEX01PREVfTUFTSwkgMHgwMDAwMDAwYworI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfTEVEX01PREVfTUFDCQkgMHgwMDAwMDAwMAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfTEVEX01PREVfUEhZXzEJIDB4MDAwMDAwMDQKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX0xFRF9NT0RFX1BIWV8yCSAweDAwMDAwMDA4CisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19QSFlfVFlQRV9NQVNLCSAweDAwMDAwMDMwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19QSFlfVFlQRV9VTktOT1dOCSAweDAwMDAwMDAwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19QSFlfVFlQRV9DT1BQRVIJIDB4MDAwMDAwMTAKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX1BIWV9UWVBFX0ZJQkVSCSAweDAwMDAwMDIwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX0NGR19XT0xfRU5BQkxFCQkgMHgwMDAwMDA0MAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfQVNGX0VOQUJMRQkJIDB4MDAwMDAwODAKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX0VFUFJPTV9XUAkJIDB4MDAwMDAxMDAKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfQ0ZHX01JTklfUENJCQkgMHgwMDAwMTAwMAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfRklCRVJfV09MCQkgMHgwMDAwNDAwMAorI2RlZmluZSAgTklDX1NSQU1fREFUQV9DRkdfTk9fR1BJTzIJCSAweDAwMTAwMDAwCisKKyNkZWZpbmUgTklDX1NSQU1fREFUQV9WRVIJCQkweDAwMDAwYjVjCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX1ZFUl9TSElGVAkJIDE2CisKKyNkZWZpbmUgTklDX1NSQU1fREFUQV9QSFlfSUQJCTB4MDAwMDBiNzQKKyNkZWZpbmUgIE5JQ19TUkFNX0RBVEFfUEhZX0lEMV9NQVNLCSAweGZmZmYwMDAwCisjZGVmaW5lICBOSUNfU1JBTV9EQVRBX1BIWV9JRDJfTUFTSwkgMHgwMDAwZmZmZgorCisjZGVmaW5lIE5JQ19TUkFNX0ZXX0NNRF9NQk9YCQkweDAwMDAwYjc4CisjZGVmaW5lICBGV0NNRF9OSUNEUlZfQUxJVkUJCSAweDAwMDAwMDAxCisjZGVmaW5lICBGV0NNRF9OSUNEUlZfUEFVU0VfRlcJCSAweDAwMDAwMDAyCisjZGVmaW5lICBGV0NNRF9OSUNEUlZfSVBWNEFERFJfQ0hHCSAweDAwMDAwMDAzCisjZGVmaW5lICBGV0NNRF9OSUNEUlZfSVBWNkFERFJfQ0hHCSAweDAwMDAwMDA0CisjZGVmaW5lICBGV0NNRF9OSUNEUlZfRklYX0RNQVIJCSAweDAwMDAwMDA1CisjZGVmaW5lICBGV0NNRF9OSUNEUlZfRklYX0RNQVcJCSAweDAwMDAwMDA2CisjZGVmaW5lIE5JQ19TUkFNX0ZXX0NNRF9MRU5fTUJPWAkweDAwMDAwYjdjCisjZGVmaW5lIE5JQ19TUkFNX0ZXX0NNRF9EQVRBX01CT1gJMHgwMDAwMGI4MAorI2RlZmluZSBOSUNfU1JBTV9GV19BU0ZfU1RBVFVTX01CT1gJMHgwMDAwMGMwMAorI2RlZmluZSBOSUNfU1JBTV9GV19EUlZfU1RBVEVfTUJPWAkweDAwMDAwYzA0CisjZGVmaW5lICBEUlZfU1RBVEVfU1RBUlQJCSAweDAwMDAwMDAxCisjZGVmaW5lICBEUlZfU1RBVEVfU1RBUlRfRE9ORQkJIDB4ODAwMDAwMDEKKyNkZWZpbmUgIERSVl9TVEFURV9VTkxPQUQJCSAweDAwMDAwMDAyCisjZGVmaW5lICBEUlZfU1RBVEVfVU5MT0FEX0RPTkUJCSAweDgwMDAwMDAyCisjZGVmaW5lICBEUlZfU1RBVEVfV09MCQkJIDB4MDAwMDAwMDMKKyNkZWZpbmUgIERSVl9TVEFURV9TVVNQRU5ECQkgMHgwMDAwMDAwNAorCisjZGVmaW5lIE5JQ19TUkFNX0ZXX1JFU0VUX1RZUEVfTUJPWAkweDAwMDAwYzA4CisKKyNkZWZpbmUgTklDX1NSQU1fTUFDX0FERFJfSElHSF9NQk9YCTB4MDAwMDBjMTQKKyNkZWZpbmUgTklDX1NSQU1fTUFDX0FERFJfTE9XX01CT1gJMHgwMDAwMGMxOAorCisjZGVmaW5lIE5JQ19TUkFNX0RBVEFfQ0ZHXzIJCTB4MDAwMDBkMzgKKworI2RlZmluZSAgU0hBU1RBX0VYVF9MRURfTU9ERV9NQVNLCSAweDAwMDE4MDAwCisjZGVmaW5lICBTSEFTVEFfRVhUX0xFRF9MRUdBQ1kJCSAweDAwMDAwMDAwCisjZGVmaW5lICBTSEFTVEFfRVhUX0xFRF9TSEFSRUQJCSAweDAwMDA4MDAwCisjZGVmaW5lICBTSEFTVEFfRVhUX0xFRF9NQUMJCSAweDAwMDEwMDAwCisjZGVmaW5lICBTSEFTVEFfRVhUX0xFRF9DT01CTwkJIDB4MDAwMTgwMDAKKworI2RlZmluZSBOSUNfU1JBTV9SWF9NSU5JX0JVRkZFUl9ERVNDCTB4MDAwMDEwMDAKKworI2RlZmluZSBOSUNfU1JBTV9ETUFfREVTQ19QT09MX0JBU0UJMHgwMDAwMjAwMAorI2RlZmluZSAgTklDX1NSQU1fRE1BX0RFU0NfUE9PTF9TSVpFCSAweDAwMDAyMDAwCisjZGVmaW5lIE5JQ19TUkFNX1RYX0JVRkZFUl9ERVNDCQkweDAwMDA0MDAwIC8qIDUxMiBlbnRyaWVzICovCisjZGVmaW5lIE5JQ19TUkFNX1JYX0JVRkZFUl9ERVNDCQkweDAwMDA2MDAwIC8qIDI1NiBlbnRyaWVzICovCisjZGVmaW5lIE5JQ19TUkFNX1JYX0pVTUJPX0JVRkZFUl9ERVNDCTB4MDAwMDcwMDAgLyogMjU2IGVudHJpZXMgKi8KKyNkZWZpbmUgTklDX1NSQU1fTUJVRl9QT09MX0JBU0UJCTB4MDAwMDgwMDAKKyNkZWZpbmUgIE5JQ19TUkFNX01CVUZfUE9PTF9TSVpFOTYJIDB4MDAwMTgwMDAKKyNkZWZpbmUgIE5JQ19TUkFNX01CVUZfUE9PTF9TSVpFNjQJIDB4MDAwMTAwMDAKKyNkZWZpbmUgIE5JQ19TUkFNX01CVUZfUE9PTF9CQVNFNTcwNQkweDAwMDEwMDAwCisjZGVmaW5lICBOSUNfU1JBTV9NQlVGX1BPT0xfU0laRTU3MDUJMHgwMDAwZTAwMAorCisvKiBDdXJyZW50bHkgdGhpcyBpcyBmaXhlZC4gKi8KKyNkZWZpbmUgUEhZX0FERFIJCTB4MDEKKworLyogVGlnb24zIHNwZWNpZmljIFBIWSBNSUkgcmVnaXN0ZXJzLiAqLworI2RlZmluZSAgVEczX0JNQ1JfU1BFRUQxMDAwCQkweDAwNDAKKworI2RlZmluZSBNSUlfVEczX0NUUkwJCQkweDA5IC8qIDEwMDAtYmFzZVQgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSAgTUlJX1RHM19DVFJMX0FEVl8xMDAwX0hBTEYJMHgwMTAwCisjZGVmaW5lICBNSUlfVEczX0NUUkxfQURWXzEwMDBfRlVMTAkweDAyMDAKKyNkZWZpbmUgIE1JSV9URzNfQ1RSTF9BU19NQVNURVIJCTB4MDgwMAorI2RlZmluZSAgTUlJX1RHM19DVFJMX0VOQUJMRV9BU19NQVNURVIJMHgxMDAwCisKKyNkZWZpbmUgTUlJX1RHM19FWFRfQ1RSTAkJMHgxMCAvKiBFeHRlbmRlZCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lICBNSUlfVEczX0VYVF9DVFJMX0ZJRk9fRUxBU1RJQwkweDAwMDEKKyNkZWZpbmUgIE1JSV9URzNfRVhUX0NUUkxfTE5LM19MRURfTU9ERQkweDAwMDIKKyNkZWZpbmUgIE1JSV9URzNfRVhUX0NUUkxfVEJJCQkweDgwMDAKKworI2RlZmluZSBNSUlfVEczX0VYVF9TVEFUCQkweDExIC8qIEV4dGVuZGVkIHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSAgTUlJX1RHM19FWFRfU1RBVF9MUEFTUwkJMHgwMTAwCisKKyNkZWZpbmUgTUlJX1RHM19EU1BfUldfUE9SVAkJMHgxNSAvKiBEU1AgY29lZmZpY2llbnQgcmVhZC93cml0ZSBwb3J0ICovCisKKyNkZWZpbmUgTUlJX1RHM19EU1BfQUREUkVTUwkJMHgxNyAvKiBEU1AgYWRkcmVzcyByZWdpc3RlciAqLworCisjZGVmaW5lIE1JSV9URzNfQVVYX0NUUkwJCTB4MTggLyogYXV4aWxsaWFyeSBjb250cm9sIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgTUlJX1RHM19BVVhfU1RBVAkJMHgxOSAvKiBhdXhpbGxpYXJ5IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUX0xQQVNTCQkweDAwMDQKKyNkZWZpbmUgTUlJX1RHM19BVVhfU1RBVF9TUERNQVNLCTB4MDcwMAorI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUXzEwSEFMRgkJMHgwMTAwCisjZGVmaW5lIE1JSV9URzNfQVVYX1NUQVRfMTBGVUxMCQkweDAyMDAKKyNkZWZpbmUgTUlJX1RHM19BVVhfU1RBVF8xMDBIQUxGCTB4MDMwMAorI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUXzEwMF80CQkweDA0MDAKKyNkZWZpbmUgTUlJX1RHM19BVVhfU1RBVF8xMDBGVUxMCTB4MDUwMAorI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUXzEwMDBIQUxGCTB4MDYwMAorI2RlZmluZSBNSUlfVEczX0FVWF9TVEFUXzEwMDBGVUxMCTB4MDcwMAorCisjZGVmaW5lIE1JSV9URzNfSVNUQVQJCQkweDFhIC8qIElSUSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX1RHM19JTUFTSwkJCTB4MWIgLyogSVJRIG1hc2sgcmVnaXN0ZXIgKi8KKworLyogSVNUQVQvSU1BU0sgZXZlbnQgYml0cyAqLworI2RlZmluZSBNSUlfVEczX0lOVF9MSU5LQ0hHCQkweDAwMDIKKyNkZWZpbmUgTUlJX1RHM19JTlRfU1BFRURDSEcJCTB4MDAwNAorI2RlZmluZSBNSUlfVEczX0lOVF9EVVBMRVhDSEcJCTB4MDAwOAorI2RlZmluZSBNSUlfVEczX0lOVF9BTkVHX1BBR0VfUlgJMHgwNDAwCisKKy8qIFRoZXJlIGFyZSB0d28gd2F5cyB0byBtYW5hZ2UgdGhlIFRYIGRlc2NyaXB0b3JzIG9uIHRoZSB0aWdvbjMuCisgKiBFaXRoZXIgdGhlIGRlc2NyaXB0b3JzIGFyZSBpbiBob3N0IERNQSdhYmxlIG1lbW9yeSwgb3IgdGhleQorICogZXhpc3Qgb25seSBpbiB0aGUgY2FyZHMgb24tY2hpcCBTUkFNLiAgQWxsIDE2IHNlbmQgYmRzIGFyZSB1bmRlcgorICogdGhlIHNhbWUgbW9kZSwgdGhleSBtYXkgbm90IGJlIGNvbmZpZ3VyZWQgaW5kaXZpZHVhbGx5LgorICoKKyAqIFRoaXMgZHJpdmVyIGFsd2F5cyB1c2VzIGhvc3QgbWVtb3J5IFRYIGRlc2NyaXB0b3JzLgorICoKKyAqIFRvIHVzZSBob3N0IG1lbW9yeSBUWCBkZXNjcmlwdG9yczoKKyAqCTEpIFNldCBHUkNfTU9ERV9IT1NUX1NFTkRCRFMgaW4gR1JDX01PREUgcmVnaXN0ZXIuCisgKgkgICBNYWtlIHN1cmUgR1JDX01PREVfNFhfTklDX1NFTkRfUklOR1MgaXMgY2xlYXIuCisgKgkyKSBBbGxvY2F0ZSBETUEnYWJsZSBtZW1vcnkuCisgKgkzKSBJbiBOSUNfU1JBTV9TRU5EX1JDQiAob2YgZGVzaXJlZCBpbmRleCkgb2Ygb24tY2hpcCBTUkFNOgorICoJICAgYSkgU2V0IFRHM19CRElORk9fSE9TVF9BRERSIHRvIERNQSBhZGRyZXNzIG9mIG1lbW9yeQorICoJICAgICAgb2J0YWluZWQgaW4gc3RlcCAyCisgKgkgICBiKSBTZXQgVEczX0JESU5GT19OSUNfQUREUiB0byBOSUNfU1JBTV9UWF9CVUZGRVJfREVTQy4KKyAqCSAgIGMpIFNldCBsZW4gZmllbGQgb2YgVEczX0JESU5GT19NQVhMRU5fRkxBR1MgdG8gbnVtYmVyCisgKiAgICAgICAgICAgIG9mIFRYIGRlc2NyaXB0b3JzLiAgTGVhdmUgZmxhZ3MgZmllbGQgY2xlYXIuCisgKgk0KSBBY2Nlc3MgVFggZGVzY3JpcHRvcnMgdmlhIGhvc3QgbWVtb3J5LiAgVGhlIGNoaXAKKyAqCSAgIHdpbGwgcmVmZXRjaCBpbnRvIGxvY2FsIFNSQU0gYXMgbmVlZGVkIHdoZW4gcHJvZHVjZXIKKyAqCSAgIGluZGV4IG1haWxib3hlcyBhcmUgdXBkYXRlZC4KKyAqCisgKiBUbyB1c2Ugb24tY2hpcCBUWCBkZXNjcmlwdG9yczoKKyAqCTEpIFNldCBHUkNfTU9ERV80WF9OSUNfU0VORF9SSU5HUyBpbiBHUkNfTU9ERSByZWdpc3Rlci4KKyAqCSAgIE1ha2Ugc3VyZSBHUkNfTU9ERV9IT1NUX1NFTkRCRFMgaXMgY2xlYXIuCisgKgkyKSBJbiBOSUNfU1JBTV9TRU5EX1JDQiAob2YgZGVzaXJlZCBpbmRleCkgb2Ygb24tY2hpcCBTUkFNOgorICoJICAgYSkgU2V0IFRHM19CRElORk9fSE9TVF9BRERSIHRvIHplcm8uCisgKgkgICBiKSBTZXQgVEczX0JESU5GT19OSUNfQUREUiB0byBOSUNfU1JBTV9UWF9CVUZGRVJfREVTQworICoJICAgYykgVEczX0JESU5GT19NQVhMRU5fRkxBR1MgaXMgZG9uJ3QgY2FyZS4KKyAqCTMpIEFjY2VzcyBUWCBkZXNjcmlwdG9ycyBkaXJlY3RseSBpbiBvbi1jaGlwIFNSQU0KKyAqCSAgIHVzaW5nIG5vcm1hbCB7cmVhZCx3cml0ZX1sKCkuICAoYW5kIG5vdCB1c2luZworICogICAgICAgICBwb2ludGVyIGRlcmVmZXJlbmNpbmcgb2YgaW9yZW1hcCgpJ2QgbWVtb3J5IGxpa2UKKyAqCSAgIHRoZSBicm9rZW4gQnJvYWRjb20gZHJpdmVyIGRvZXMpCisgKgorICogTm90ZSB0aGF0IEJESU5GT19GTEFHU19ESVNBQkxFRCBzaG91bGQgYmUgc2V0IGluIHRoZSBmbGFncyBmaWVsZCBvZgorICogVEczX0JESU5GT19NQVhMRU5fRkxBR1Mgb2YgYWxsIHVudXNlZCBTRU5EX1JDQiBpbmRpY2VzLgorICovCitzdHJ1Y3QgdGczX3R4X2J1ZmZlcl9kZXNjIHsKKwl1MzIJCQkJYWRkcl9oaTsKKwl1MzIJCQkJYWRkcl9sbzsKKworCXUzMgkJCQlsZW5fZmxhZ3M7CisjZGVmaW5lIFRYRF9GTEFHX1RDUFVEUF9DU1VNCQkweDAwMDEKKyNkZWZpbmUgVFhEX0ZMQUdfSVBfQ1NVTQkJMHgwMDAyCisjZGVmaW5lIFRYRF9GTEFHX0VORAkJCTB4MDAwNAorI2RlZmluZSBUWERfRkxBR19JUF9GUkFHCQkweDAwMDgKKyNkZWZpbmUgVFhEX0ZMQUdfSVBfRlJBR19FTkQJCTB4MDAxMAorI2RlZmluZSBUWERfRkxBR19WTEFOCQkJMHgwMDQwCisjZGVmaW5lIFRYRF9GTEFHX0NPQUxfTk9XCQkweDAwODAKKyNkZWZpbmUgVFhEX0ZMQUdfQ1BVX1BSRV9ETUEJCTB4MDEwMAorI2RlZmluZSBUWERfRkxBR19DUFVfUE9TVF9ETUEJCTB4MDIwMAorI2RlZmluZSBUWERfRkxBR19BRERfU1JDX0FERFIJCTB4MTAwMAorI2RlZmluZSBUWERfRkxBR19DSE9PU0VfU1JDX0FERFIJMHg2MDAwCisjZGVmaW5lIFRYRF9GTEFHX05PX0NSQwkJCTB4ODAwMAorI2RlZmluZSBUWERfTEVOX1NISUZUCQkJMTYKKworCXUzMgkJCQl2bGFuX3RhZzsKKyNkZWZpbmUgVFhEX1ZMQU5fVEFHX1NISUZUCQkwCisjZGVmaW5lIFRYRF9NU1NfU0hJRlQJCQkxNgorfTsKKworI2RlZmluZSBUWERfQUREUgkJCTB4MDBVTCAvKiA2NC1iaXQgKi8KKyNkZWZpbmUgVFhEX0xFTl9GTEFHUwkJCTB4MDhVTCAvKiAzMi1iaXQgKHVwcGVyIDE2LWJpdHMgYXJlIGxlbikgKi8KKyNkZWZpbmUgVFhEX1ZMQU5fVEFHCQkJMHgwY1VMIC8qIDMyLWJpdCAodXBwZXIgMTYtYml0cyBhcmUgdGFnKSAqLworI2RlZmluZSBUWERfU0laRQkJCTB4MTBVTAorCitzdHJ1Y3QgdGczX3J4X2J1ZmZlcl9kZXNjIHsKKwl1MzIJCQkJYWRkcl9oaTsKKwl1MzIJCQkJYWRkcl9sbzsKKworCXUzMgkJCQlpZHhfbGVuOworI2RlZmluZSBSWERfSURYX01BU0sJMHhmZmZmMDAwMAorI2RlZmluZSBSWERfSURYX1NISUZUCTE2CisjZGVmaW5lIFJYRF9MRU5fTUFTSwkweDAwMDBmZmZmCisjZGVmaW5lIFJYRF9MRU5fU0hJRlQJMAorCisJdTMyCQkJCXR5cGVfZmxhZ3M7CisjZGVmaW5lIFJYRF9UWVBFX1NISUZUCTE2CisjZGVmaW5lIFJYRF9GTEFHU19TSElGVAkwCisKKyNkZWZpbmUgUlhEX0ZMQUdfRU5ECQkJMHgwMDA0CisjZGVmaW5lIFJYRF9GTEFHX01JTkkJCQkweDA4MDAKKyNkZWZpbmUgUlhEX0ZMQUdfSlVNQk8JCQkweDAwMjAKKyNkZWZpbmUgUlhEX0ZMQUdfVkxBTgkJCTB4MDA0MAorI2RlZmluZSBSWERfRkxBR19FUlJPUgkJCTB4MDQwMAorI2RlZmluZSBSWERfRkxBR19JUF9DU1VNCQkweDEwMDAKKyNkZWZpbmUgUlhEX0ZMQUdfVENQVURQX0NTVU0JCTB4MjAwMAorI2RlZmluZSBSWERfRkxBR19JU19UQ1AJCQkweDQwMDAKKworCXUzMgkJCQlpcF90Y3BfY3N1bTsKKyNkZWZpbmUgUlhEX0lQQ1NVTV9NQVNLCQkweGZmZmYwMDAwCisjZGVmaW5lIFJYRF9JUENTVU1fU0hJRlQJMTYKKyNkZWZpbmUgUlhEX1RDUENTVU1fTUFTSwkweDAwMDBmZmZmCisjZGVmaW5lIFJYRF9UQ1BDU1VNX1NISUZUCTAKKworCXUzMgkJCQllcnJfdmxhbjsKKworI2RlZmluZSBSWERfVkxBTl9NQVNLCQkJMHgwMDAwZmZmZgorCisjZGVmaW5lIFJYRF9FUlJfQkFEX0NSQwkJCTB4MDAwMTAwMDAKKyNkZWZpbmUgUlhEX0VSUl9DT0xMSVNJT04JCTB4MDAwMjAwMDAKKyNkZWZpbmUgUlhEX0VSUl9MSU5LX0xPU1QJCTB4MDAwNDAwMDAKKyNkZWZpbmUgUlhEX0VSUl9QSFlfREVDT0RFCQkweDAwMDgwMDAwCisjZGVmaW5lIFJYRF9FUlJfT0REX05JQkJMRV9SQ1ZEX01JSQkweDAwMTAwMDAwCisjZGVmaW5lIFJYRF9FUlJfTUFDX0FCUlQJCTB4MDAyMDAwMDAKKyNkZWZpbmUgUlhEX0VSUl9UT09fU01BTEwJCTB4MDA0MDAwMDAKKyNkZWZpbmUgUlhEX0VSUl9OT19SRVNPVVJDRVMJCTB4MDA4MDAwMDAKKyNkZWZpbmUgUlhEX0VSUl9IVUdFX0ZSQU1FCQkweDAxMDAwMDAwCisjZGVmaW5lIFJYRF9FUlJfTUFTSwkJCTB4ZmZmZjAwMDAKKworCXUzMgkJCQlyZXNlcnZlZDsKKwl1MzIJCQkJb3BhcXVlOworI2RlZmluZSBSWERfT1BBUVVFX0lOREVYX01BU0sJCTB4MDAwMGZmZmYKKyNkZWZpbmUgUlhEX09QQVFVRV9JTkRFWF9TSElGVAkJMAorI2RlZmluZSBSWERfT1BBUVVFX1JJTkdfU1RECQkweDAwMDEwMDAwCisjZGVmaW5lIFJYRF9PUEFRVUVfUklOR19KVU1CTwkJMHgwMDAyMDAwMAorI2RlZmluZSBSWERfT1BBUVVFX1JJTkdfTUlOSQkJMHgwMDA0MDAwMAorI2RlZmluZSBSWERfT1BBUVVFX1JJTkdfTUFTSwkJMHgwMDA3MDAwMAorfTsKKworc3RydWN0IHRnM19leHRfcnhfYnVmZmVyX2Rlc2MgeworCXN0cnVjdCB7CisJCXUzMgkJCWFkZHJfaGk7CisJCXUzMgkJCWFkZHJfbG87CisJfQkJCQlhZGRybGlzdFszXTsKKwl1MzIJCQkJbGVuMl9sZW4xOworCXUzMgkJCQlyZXN2X2xlbjM7CisJc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYwlzdGQ7Cit9OworCisvKiBXZSBvbmx5IHVzZSB0aGlzIHdoZW4gdGVzdGluZyBvdXQgdGhlIERNQSBlbmdpbmUKKyAqIGF0IHByb2JlIHRpbWUuICBUaGlzIGlzIHRoZSBpbnRlcm5hbCBmb3JtYXQgb2YgYnVmZmVyCisgKiBkZXNjcmlwdG9ycyB1c2VkIGJ5IHRoZSBjaGlwIGF0IE5JQ19TUkFNX0RNQV9ERVNDUy4KKyAqLworc3RydWN0IHRnM19pbnRlcm5hbF9idWZmZXJfZGVzYyB7CisJdTMyCQkJCWFkZHJfaGk7CisJdTMyCQkJCWFkZHJfbG87CisJdTMyCQkJCW5pY19tYnVmOworCS8qIFhYWCBGSVggVEhJUyAqLworI2lmZGVmIF9fQklHX0VORElBTgorCXUxNgkJCQljcWlkX3NxaWQ7CisJdTE2CQkJCWxlbjsKKyNlbHNlCisJdTE2CQkJCWxlbjsKKwl1MTYJCQkJY3FpZF9zcWlkOworI2VuZGlmCisJdTMyCQkJCWZsYWdzOworCXUzMgkJCQlfX2Nvb2tpZTE7CisJdTMyCQkJCV9fY29va2llMjsKKwl1MzIJCQkJX19jb29raWUzOworfTsKKworI2RlZmluZSBURzNfSFdfU1RBVFVTX1NJWkUJCTB4NTAKK3N0cnVjdCB0ZzNfaHdfc3RhdHVzIHsKKwl1MzIJCQkJc3RhdHVzOworI2RlZmluZSBTRF9TVEFUVVNfVVBEQVRFRAkJMHgwMDAwMDAwMQorI2RlZmluZSBTRF9TVEFUVVNfTElOS19DSEcJCTB4MDAwMDAwMDIKKyNkZWZpbmUgU0RfU1RBVFVTX0VSUk9SCQkJMHgwMDAwMDAwNAorCisJdTMyCQkJCXN0YXR1c190YWc7CisKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwl1MTYJCQkJcnhfY29uc3VtZXI7CisJdTE2CQkJCXJ4X2p1bWJvX2NvbnN1bWVyOworI2Vsc2UKKwl1MTYJCQkJcnhfanVtYm9fY29uc3VtZXI7CisJdTE2CQkJCXJ4X2NvbnN1bWVyOworI2VuZGlmCisKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwl1MTYJCQkJcmVzZXJ2ZWQ7CisJdTE2CQkJCXJ4X21pbmlfY29uc3VtZXI7CisjZWxzZQorCXUxNgkJCQlyeF9taW5pX2NvbnN1bWVyOworCXUxNgkJCQlyZXNlcnZlZDsKKyNlbmRpZgorCXN0cnVjdCB7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJCXUxNgkJCXR4X2NvbnN1bWVyOworCQl1MTYJCQlyeF9wcm9kdWNlcjsKKyNlbHNlCisJCXUxNgkJCXJ4X3Byb2R1Y2VyOworCQl1MTYJCQl0eF9jb25zdW1lcjsKKyNlbmRpZgorCX0JCQkJaWR4WzE2XTsKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgaGlnaCwgbG93OworfSB0ZzNfc3RhdDY0X3Q7CisKK3N0cnVjdCB0ZzNfaHdfc3RhdHMgeworCXU4CQkJCV9fcmVzZXJ2ZWQwWzB4NDAwLTB4MzAwXTsKKworCS8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBSZWNlaXZlIE1BQy4gKi8KKwl0ZzNfc3RhdDY0X3QJCQlyeF9vY3RldHM7CisJdTY0CQkJCV9fcmVzZXJ2ZWQxOworCXRnM19zdGF0NjRfdAkJCXJ4X2ZyYWdtZW50czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF91Y2FzdF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4X21jYXN0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfYmNhc3RfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9mY3NfZXJyb3JzOworCXRnM19zdGF0NjRfdAkJCXJ4X2FsaWduX2Vycm9yczsKKwl0ZzNfc3RhdDY0X3QJCQlyeF94b25fcGF1c2VfcmN2ZDsKKwl0ZzNfc3RhdDY0X3QJCQlyeF94b2ZmX3BhdXNlX3JjdmQ7CisJdGczX3N0YXQ2NF90CQkJcnhfbWFjX2N0cmxfcmN2ZDsKKwl0ZzNfc3RhdDY0X3QJCQlyeF94b2ZmX2VudGVyZWQ7CisJdGczX3N0YXQ2NF90CQkJcnhfZnJhbWVfdG9vX2xvbmdfZXJyb3JzOworCXRnM19zdGF0NjRfdAkJCXJ4X2phYmJlcnM7CisJdGczX3N0YXQ2NF90CQkJcnhfdW5kZXJzaXplX3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfaW5fbGVuZ3RoX2Vycm9yczsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9vdXRfbGVuZ3RoX2Vycm9yczsKKwl0ZzNfc3RhdDY0X3QJCQlyeF82NF9vcl9sZXNzX29jdGV0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfNjVfdG9fMTI3X29jdGV0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJcnhfMTI4X3RvXzI1NV9vY3RldF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4XzI1Nl90b181MTFfb2N0ZXRfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQlyeF81MTJfdG9fMTAyM19vY3RldF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4XzEwMjRfdG9fMTUyMl9vY3RldF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4XzE1MjNfdG9fMjA0N19vY3RldF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4XzIwNDhfdG9fNDA5NV9vY3RldF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4XzQwOTZfdG9fODE5MV9vY3RldF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXJ4XzgxOTJfdG9fOTAyMl9vY3RldF9wYWNrZXRzOworCisJdTY0CQkJCV9fdW51c2VkMFszN107CisKKwkvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgVHJhbnNtaXQgTUFDLiAqLworCXRnM19zdGF0NjRfdAkJCXR4X29jdGV0czsKKwl1NjQJCQkJX19yZXNlcnZlZDI7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlzaW9uczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF94b25fc2VudDsKKwl0ZzNfc3RhdDY0X3QJCQl0eF94b2ZmX3NlbnQ7CisJdGczX3N0YXQ2NF90CQkJdHhfZmxvd19jb250cm9sOworCXRnM19zdGF0NjRfdAkJCXR4X21hY19lcnJvcnM7CisJdGczX3N0YXQ2NF90CQkJdHhfc2luZ2xlX2NvbGxpc2lvbnM7CisJdGczX3N0YXQ2NF90CQkJdHhfbXVsdF9jb2xsaXNpb25zOworCXRnM19zdGF0NjRfdAkJCXR4X2RlZmVycmVkOworCXU2NAkJCQlfX3Jlc2VydmVkMzsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9leGNlc3NpdmVfY29sbGlzaW9uczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9sYXRlX2NvbGxpc2lvbnM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV8ydGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV8zdGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV80dGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV81dGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV82dGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV83dGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV84dGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV85dGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV8xMHRpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfMTF0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzEydGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfY29sbGlkZV8xM3RpbWVzOworCXRnM19zdGF0NjRfdAkJCXR4X2NvbGxpZGVfMTR0aW1lczsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9jb2xsaWRlXzE1dGltZXM7CisJdGczX3N0YXQ2NF90CQkJdHhfdWNhc3RfcGFja2V0czsKKwl0ZzNfc3RhdDY0X3QJCQl0eF9tY2FzdF9wYWNrZXRzOworCXRnM19zdGF0NjRfdAkJCXR4X2JjYXN0X3BhY2tldHM7CisJdGczX3N0YXQ2NF90CQkJdHhfY2Fycmllcl9zZW5zZV9lcnJvcnM7CisJdGczX3N0YXQ2NF90CQkJdHhfZGlzY2FyZHM7CisJdGczX3N0YXQ2NF90CQkJdHhfZXJyb3JzOworCisJdTY0CQkJCV9fdW51c2VkMVszMV07CisKKwkvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgUmVjZWl2ZSBMaXN0IFBsYWNlbWVudC4gKi8KKwl0ZzNfc3RhdDY0X3QJCQlDT1NfcnhfcGFja2V0c1sxNl07CisJdGczX3N0YXQ2NF90CQkJQ09TX3J4X2ZpbHRlcl9kcm9wcGVkOworCXRnM19zdGF0NjRfdAkJCWRtYV93cml0ZXFfZnVsbDsKKwl0ZzNfc3RhdDY0X3QJCQlkbWFfd3JpdGVfcHJpb3FfZnVsbDsKKwl0ZzNfc3RhdDY0X3QJCQlyeGJkc19lbXB0eTsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9kaXNjYXJkczsKKwl0ZzNfc3RhdDY0X3QJCQlyeF9lcnJvcnM7CisJdGczX3N0YXQ2NF90CQkJcnhfdGhyZXNob2xkX2hpdDsKKworCXU2NAkJCQlfX3VudXNlZDJbOV07CisKKwkvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgU2VuZCBEYXRhIEluaXRpYXRvci4gKi8KKwl0ZzNfc3RhdDY0X3QJCQlDT1Nfb3V0X3BhY2tldHNbMTZdOworCXRnM19zdGF0NjRfdAkJCWRtYV9yZWFkcV9mdWxsOworCXRnM19zdGF0NjRfdAkJCWRtYV9yZWFkX3ByaW9xX2Z1bGw7CisJdGczX3N0YXQ2NF90CQkJdHhfY29tcF9xdWV1ZV9mdWxsOworCisJLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IEhvc3QgQ29hbGVzY2luZy4gKi8KKwl0ZzNfc3RhdDY0X3QJCQlyaW5nX3NldF9zZW5kX3Byb2RfaW5kZXg7CisJdGczX3N0YXQ2NF90CQkJcmluZ19zdGF0dXNfdXBkYXRlOworCXRnM19zdGF0NjRfdAkJCW5pY19pcnFzOworCXRnM19zdGF0NjRfdAkJCW5pY19hdm9pZGVkX2lycXM7CisJdGczX3N0YXQ2NF90CQkJbmljX3R4X3RocmVzaG9sZF9oaXQ7CisKKwl1OAkJCQlfX3Jlc2VydmVkNFsweGIwMC0weDljMF07Cit9OworCisvKiAnbWFwcGluZycgaXMgc3VwZXJmbHVvdXMgYXMgdGhlIGNoaXAgZG9lcyBub3Qgd3JpdGUgaW50bworICogdGhlIHR4L3J4IHBvc3QgcmluZ3Mgc28gd2UgY291bGQganVzdCBmZXRjaCBpdCBmcm9tIHRoZXJlLgorICogQnV0IHRoZSBjYWNoZSBiZWhhdmlvciBpcyBiZXR0ZXIgaG93IHdlIGFyZSBkb2luZyBpdCBub3cuCisgKi8KK3N0cnVjdCByaW5nX2luZm8geworCXN0cnVjdCBza19idWZmCQkJKnNrYjsKKwlERUNMQVJFX1BDSV9VTk1BUF9BRERSKG1hcHBpbmcpCit9OworCitzdHJ1Y3QgdHhfcmluZ19pbmZvIHsKKwlzdHJ1Y3Qgc2tfYnVmZgkJCSpza2I7CisJREVDTEFSRV9QQ0lfVU5NQVBfQUREUihtYXBwaW5nKQorCXUzMgkJCQlwcmV2X3ZsYW5fdGFnOworfTsKKworc3RydWN0IHRnM19jb25maWdfaW5mbyB7CisJdTMyCQkJCWZsYWdzOworfTsKKworc3RydWN0IHRnM19saW5rX2NvbmZpZyB7CisJLyogRGVzY3JpYmVzIHdoYXQgd2UncmUgdHJ5aW5nIHRvIGdldC4gKi8KKwl1MzIJCQkJYWR2ZXJ0aXNpbmc7CisJdTE2CQkJCXNwZWVkOworCXU4CQkJCWR1cGxleDsKKwl1OAkJCQlhdXRvbmVnOworCisJLyogRGVzY3JpYmVzIHdoYXQgd2UgYWN0dWFsbHkgaGF2ZS4gKi8KKwl1MTYJCQkJYWN0aXZlX3NwZWVkOworCXU4CQkJCWFjdGl2ZV9kdXBsZXg7CisjZGVmaW5lIFNQRUVEX0lOVkFMSUQJCTB4ZmZmZgorI2RlZmluZSBEVVBMRVhfSU5WQUxJRAkJMHhmZgorI2RlZmluZSBBVVRPTkVHX0lOVkFMSUQJCTB4ZmYKKworCS8qIFdoZW4gd2UgZ28gaW4gYW5kIG91dCBvZiBsb3cgcG93ZXIgbW9kZSB3ZSBuZWVkCisJICogdG8gc3dhcCB3aXRoIHRoaXMgc3RhdGUuCisJICovCisJaW50CQkJCXBoeV9pc19sb3dfcG93ZXI7CisJdTE2CQkJCW9yaWdfc3BlZWQ7CisJdTgJCQkJb3JpZ19kdXBsZXg7CisJdTgJCQkJb3JpZ19hdXRvbmVnOworfTsKKworc3RydWN0IHRnM19idWZtZ3JfY29uZmlnIHsKKwl1MzIJCW1idWZfcmVhZF9kbWFfbG93X3dhdGVyOworCXUzMgkJbWJ1Zl9tYWNfcnhfbG93X3dhdGVyOworCXUzMgkJbWJ1Zl9oaWdoX3dhdGVyOworCisJdTMyCQltYnVmX3JlYWRfZG1hX2xvd193YXRlcl9qdW1ibzsKKwl1MzIJCW1idWZfbWFjX3J4X2xvd193YXRlcl9qdW1ibzsKKwl1MzIJCW1idWZfaGlnaF93YXRlcl9qdW1ibzsKKworCXUzMgkJZG1hX2xvd193YXRlcjsKKwl1MzIJCWRtYV9oaWdoX3dhdGVyOworfTsKKworc3RydWN0IHRnM19ldGh0b29sX3N0YXRzIHsKKwkvKiBTdGF0aXN0aWNzIG1haW50YWluZWQgYnkgUmVjZWl2ZSBNQUMuICovCisJdTY0IAkgICAgCXJ4X29jdGV0czsKKwl1NjQJCXJ4X2ZyYWdtZW50czsKKwl1NjQJCXJ4X3VjYXN0X3BhY2tldHM7CisJdTY0CQlyeF9tY2FzdF9wYWNrZXRzOworCXU2NAkJcnhfYmNhc3RfcGFja2V0czsKKwl1NjQJCXJ4X2Zjc19lcnJvcnM7CisJdTY0CQlyeF9hbGlnbl9lcnJvcnM7CisJdTY0CQlyeF94b25fcGF1c2VfcmN2ZDsKKwl1NjQJCXJ4X3hvZmZfcGF1c2VfcmN2ZDsKKwl1NjQJCXJ4X21hY19jdHJsX3JjdmQ7CisJdTY0CQlyeF94b2ZmX2VudGVyZWQ7CisJdTY0CQlyeF9mcmFtZV90b29fbG9uZ19lcnJvcnM7CisJdTY0CQlyeF9qYWJiZXJzOworCXU2NAkJcnhfdW5kZXJzaXplX3BhY2tldHM7CisJdTY0CQlyeF9pbl9sZW5ndGhfZXJyb3JzOworCXU2NAkJcnhfb3V0X2xlbmd0aF9lcnJvcnM7CisJdTY0CQlyeF82NF9vcl9sZXNzX29jdGV0X3BhY2tldHM7CisJdTY0CQlyeF82NV90b18xMjdfb2N0ZXRfcGFja2V0czsKKwl1NjQJCXJ4XzEyOF90b18yNTVfb2N0ZXRfcGFja2V0czsKKwl1NjQJCXJ4XzI1Nl90b181MTFfb2N0ZXRfcGFja2V0czsKKwl1NjQJCXJ4XzUxMl90b18xMDIzX29jdGV0X3BhY2tldHM7CisJdTY0CQlyeF8xMDI0X3RvXzE1MjJfb2N0ZXRfcGFja2V0czsKKwl1NjQJCXJ4XzE1MjNfdG9fMjA0N19vY3RldF9wYWNrZXRzOworCXU2NAkJcnhfMjA0OF90b180MDk1X29jdGV0X3BhY2tldHM7CisJdTY0CQlyeF80MDk2X3RvXzgxOTFfb2N0ZXRfcGFja2V0czsKKwl1NjQJCXJ4XzgxOTJfdG9fOTAyMl9vY3RldF9wYWNrZXRzOworCisJLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IFRyYW5zbWl0IE1BQy4gKi8KKwl1NjQJCXR4X29jdGV0czsKKwl1NjQJCXR4X2NvbGxpc2lvbnM7CisJdTY0CQl0eF94b25fc2VudDsKKwl1NjQJCXR4X3hvZmZfc2VudDsKKwl1NjQJCXR4X2Zsb3dfY29udHJvbDsKKwl1NjQJCXR4X21hY19lcnJvcnM7CisJdTY0CQl0eF9zaW5nbGVfY29sbGlzaW9uczsKKwl1NjQJCXR4X211bHRfY29sbGlzaW9uczsKKwl1NjQJCXR4X2RlZmVycmVkOworCXU2NAkJdHhfZXhjZXNzaXZlX2NvbGxpc2lvbnM7CisJdTY0CQl0eF9sYXRlX2NvbGxpc2lvbnM7CisJdTY0CQl0eF9jb2xsaWRlXzJ0aW1lczsKKwl1NjQJCXR4X2NvbGxpZGVfM3RpbWVzOworCXU2NAkJdHhfY29sbGlkZV80dGltZXM7CisJdTY0CQl0eF9jb2xsaWRlXzV0aW1lczsKKwl1NjQJCXR4X2NvbGxpZGVfNnRpbWVzOworCXU2NAkJdHhfY29sbGlkZV83dGltZXM7CisJdTY0CQl0eF9jb2xsaWRlXzh0aW1lczsKKwl1NjQJCXR4X2NvbGxpZGVfOXRpbWVzOworCXU2NAkJdHhfY29sbGlkZV8xMHRpbWVzOworCXU2NAkJdHhfY29sbGlkZV8xMXRpbWVzOworCXU2NAkJdHhfY29sbGlkZV8xMnRpbWVzOworCXU2NAkJdHhfY29sbGlkZV8xM3RpbWVzOworCXU2NAkJdHhfY29sbGlkZV8xNHRpbWVzOworCXU2NAkJdHhfY29sbGlkZV8xNXRpbWVzOworCXU2NAkJdHhfdWNhc3RfcGFja2V0czsKKwl1NjQJCXR4X21jYXN0X3BhY2tldHM7CisJdTY0CQl0eF9iY2FzdF9wYWNrZXRzOworCXU2NAkJdHhfY2Fycmllcl9zZW5zZV9lcnJvcnM7CisJdTY0CQl0eF9kaXNjYXJkczsKKwl1NjQJCXR4X2Vycm9yczsKKworCS8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBSZWNlaXZlIExpc3QgUGxhY2VtZW50LiAqLworCXU2NAkJZG1hX3dyaXRlcV9mdWxsOworCXU2NAkJZG1hX3dyaXRlX3ByaW9xX2Z1bGw7CisJdTY0CQlyeGJkc19lbXB0eTsKKwl1NjQJCXJ4X2Rpc2NhcmRzOworCXU2NAkJcnhfZXJyb3JzOworCXU2NAkJcnhfdGhyZXNob2xkX2hpdDsKKworCS8qIFN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBTZW5kIERhdGEgSW5pdGlhdG9yLiAqLworCXU2NAkJZG1hX3JlYWRxX2Z1bGw7CisJdTY0CQlkbWFfcmVhZF9wcmlvcV9mdWxsOworCXU2NAkJdHhfY29tcF9xdWV1ZV9mdWxsOworCisJLyogU3RhdGlzdGljcyBtYWludGFpbmVkIGJ5IEhvc3QgQ29hbGVzY2luZy4gKi8KKwl1NjQJCXJpbmdfc2V0X3NlbmRfcHJvZF9pbmRleDsKKwl1NjQJCXJpbmdfc3RhdHVzX3VwZGF0ZTsKKwl1NjQJCW5pY19pcnFzOworCXU2NAkJbmljX2F2b2lkZWRfaXJxczsKKwl1NjQJCW5pY190eF90aHJlc2hvbGRfaGl0OworfTsKKworc3RydWN0IHRnMyB7CisJLyogYmVnaW4gImdlbmVyYWwsIGZyZXF1ZW50bHktdXNlZCBtZW1iZXJzIiBjYWNoZWxpbmUgc2VjdGlvbiAqLworCisJLyogU01QIGxvY2tpbmcgc3RyYXRlZ3k6CisJICoKKwkgKiBsb2NrOiBIZWxkIGR1cmluZyBhbGwgb3BlcmF0aW9ucyBleGNlcHQgVFggcGFja2V0CisJICogICAgICAgcHJvY2Vzc2luZy4KKwkgKgorCSAqIHR4X2xvY2s6IEhlbGQgZHVyaW5nIHRnM19zdGFydF94bWl0eyxfNGdidWd9IGFuZCB0ZzNfdHgKKwkgKgorCSAqIElmIHlvdSB3YW50IHRvIHNodXQgdXAgYWxsIGFzeW5jaHJvbm91cyBwcm9jZXNzaW5nIHlvdSBtdXN0CisJICogYWNxdWlyZSBib3RoIGxvY2tzLCAnbG9jaycgdGFrZW4gYmVmb3JlICd0eF9sb2NrJy4gIElSUXMgbXVzdAorCSAqIGJlIGRpc2FibGVkIHRvIHRha2UgJ2xvY2snIGJ1dCBvbmx5IHNvZnRpcnEgZGlzYWJsaW5nIGlzCisJICogbmVjZXNzYXJ5IGZvciBhY3F1aXNpdGlvbiBvZiAndHhfbG9jaycuCisJICovCisJc3BpbmxvY2tfdAkJCWxvY2s7CisJc3BpbmxvY2tfdAkJCWluZGlyZWN0X2xvY2s7CisKKwl2b2lkIF9faW9tZW0JCQkqcmVnczsKKwlzdHJ1Y3QgbmV0X2RldmljZQkJKmRldjsKKwlzdHJ1Y3QgcGNpX2RldgkJCSpwZGV2OworCisJc3RydWN0IHRnM19od19zdGF0dXMJCSpod19zdGF0dXM7CisJZG1hX2FkZHJfdAkJCXN0YXR1c19tYXBwaW5nOworCisJdTMyCQkJCW1zZ19lbmFibGU7CisKKwkvKiBiZWdpbiAidHggdGhyZWFkIiBjYWNoZWxpbmUgc2VjdGlvbiAqLworCXUzMgkJCQl0eF9wcm9kOworCXUzMgkJCQl0eF9jb25zOworCXUzMgkJCQl0eF9wZW5kaW5nOworCisJc3BpbmxvY2tfdAkJCXR4X2xvY2s7CisKKwlzdHJ1Y3QgdGczX3R4X2J1ZmZlcl9kZXNjCSp0eF9yaW5nOworCXN0cnVjdCB0eF9yaW5nX2luZm8JCSp0eF9idWZmZXJzOworCWRtYV9hZGRyX3QJCQl0eF9kZXNjX21hcHBpbmc7CisKKwkvKiBiZWdpbiAicnggdGhyZWFkIiBjYWNoZWxpbmUgc2VjdGlvbiAqLworCXUzMgkJCQlyeF9yY2JfcHRyOworCXUzMgkJCQlyeF9zdGRfcHRyOworCXUzMgkJCQlyeF9qdW1ib19wdHI7CisJdTMyCQkJCXJ4X3BlbmRpbmc7CisJdTMyCQkJCXJ4X2p1bWJvX3BlbmRpbmc7CisjaWYgVEczX1ZMQU5fVEFHX1VTRUQKKwlzdHJ1Y3Qgdmxhbl9ncm91cAkJKnZsZ3JwOworI2VuZGlmCisKKwlzdHJ1Y3QgdGczX3J4X2J1ZmZlcl9kZXNjCSpyeF9zdGQ7CisJc3RydWN0IHJpbmdfaW5mbwkJKnJ4X3N0ZF9idWZmZXJzOworCWRtYV9hZGRyX3QJCQlyeF9zdGRfbWFwcGluZzsKKworCXN0cnVjdCB0ZzNfcnhfYnVmZmVyX2Rlc2MJKnJ4X2p1bWJvOworCXN0cnVjdCByaW5nX2luZm8JCSpyeF9qdW1ib19idWZmZXJzOworCWRtYV9hZGRyX3QJCQlyeF9qdW1ib19tYXBwaW5nOworCisJc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYwkqcnhfcmNiOworCWRtYV9hZGRyX3QJCQlyeF9yY2JfbWFwcGluZzsKKworCS8qIGJlZ2luICJldmVyeXRoaW5nIGVsc2UiIGNhY2hlbGluZShzKSBzZWN0aW9uICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJCW5ldF9zdGF0czsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwkJbmV0X3N0YXRzX3ByZXY7CisJc3RydWN0IHRnM19ldGh0b29sX3N0YXRzCWVzdGF0czsKKwlzdHJ1Y3QgdGczX2V0aHRvb2xfc3RhdHMJZXN0YXRzX3ByZXY7CisKKwl1bnNpZ25lZCBsb25nCQkJcGh5X2NyY19lcnJvcnM7CisKKwl1MzIJCQkJcnhfb2Zmc2V0OworCXUzMgkJCQl0ZzNfZmxhZ3M7CisjZGVmaW5lIFRHM19GTEFHX1RYRF9NQk9YX0hXQlVHCQkweDAwMDAwMDAyCisjZGVmaW5lIFRHM19GTEFHX1JYX0NIRUNLU1VNUwkJMHgwMDAwMDAwNAorI2RlZmluZSBURzNfRkxBR19VU0VfTElOS0NIR19SRUcJMHgwMDAwMDAwOAorI2RlZmluZSBURzNfRkxBR19VU0VfTUlfSU5URVJSVVBUCTB4MDAwMDAwMTAKKyNkZWZpbmUgVEczX0ZMQUdfRU5BQkxFX0FTRgkJMHgwMDAwMDAyMAorI2RlZmluZSBURzNfRkxBR181NzAxX1JFR19XUklURV9CVUcJMHgwMDAwMDA0MAorI2RlZmluZSBURzNfRkxBR19QT0xMX1NFUkRFUwkJMHgwMDAwMDA4MAorI2lmIGRlZmluZWQoQ09ORklHX1g4NikKKyNkZWZpbmUgVEczX0ZMQUdfTUJPWF9XUklURV9SRU9SREVSCTB4MDAwMDAxMDAKKyNlbHNlCisjZGVmaW5lIFRHM19GTEFHX01CT1hfV1JJVEVfUkVPUkRFUgkwCS8qIGRpc2FibGVzIGNvZGUgdG9vICovCisjZW5kaWYKKyNkZWZpbmUgVEczX0ZMQUdfUENJWF9UQVJHRVRfSFdCVUcJMHgwMDAwMDIwMAorI2RlZmluZSBURzNfRkxBR19XT0xfU1BFRURfMTAwTUIJMHgwMDAwMDQwMAorI2RlZmluZSBURzNfRkxBR19XT0xfRU5BQkxFCQkweDAwMDAwODAwCisjZGVmaW5lIFRHM19GTEFHX0VFUFJPTV9XUklURV9QUk9UCTB4MDAwMDEwMDAKKyNkZWZpbmUgVEczX0ZMQUdfTlZSQU0JCQkweDAwMDAyMDAwCisjZGVmaW5lIFRHM19GTEFHX05WUkFNX0JVRkZFUkVECQkweDAwMDA0MDAwCisjZGVmaW5lIFRHM19GTEFHX1JYX1BBVVNFCQkweDAwMDA4MDAwCisjZGVmaW5lIFRHM19GTEFHX1RYX1BBVVNFCQkweDAwMDEwMDAwCisjZGVmaW5lIFRHM19GTEFHX1BDSVhfTU9ERQkJMHgwMDAyMDAwMAorI2RlZmluZSBURzNfRkxBR19QQ0lfSElHSF9TUEVFRAkJMHgwMDA0MDAwMAorI2RlZmluZSBURzNfRkxBR19QQ0lfMzJCSVQJCTB4MDAwODAwMDAKKyNkZWZpbmUgVEczX0ZMQUdfTk9fVFhfUFNFVURPX0NTVU0JMHgwMDEwMDAwMAorI2RlZmluZSBURzNfRkxBR19OT19SWF9QU0VVRE9fQ1NVTQkweDAwMjAwMDAwCisjZGVmaW5lIFRHM19GTEFHX1NFUkRFU19XT0xfQ0FQCQkweDAwNDAwMDAwCisjZGVmaW5lIFRHM19GTEFHX0pVTUJPX0VOQUJMRQkJMHgwMDgwMDAwMAorI2RlZmluZSBURzNfRkxBR18xMF8xMDBfT05MWQkJMHgwMTAwMDAwMAorI2RlZmluZSBURzNfRkxBR19QQVVTRV9BVVRPTkVHCQkweDAyMDAwMDAwCisjZGVmaW5lIFRHM19GTEFHX0JST0tFTl9DSEVDS1NVTVMJMHgxMDAwMDAwMAorI2RlZmluZSBURzNfRkxBR19HT1RfU0VSREVTX0ZMT1dDVEwJMHgyMDAwMDAwMAorI2RlZmluZSBURzNfRkxBR19TUExJVF9NT0RFCQkweDQwMDAwMDAwCisjZGVmaW5lIFRHM19GTEFHX0lOSVRfQ09NUExFVEUJCTB4ODAwMDAwMDAKKwl1MzIJCQkJdGczX2ZsYWdzMjsKKyNkZWZpbmUgVEczX0ZMRzJfUkVTVEFSVF9USU1FUgkJMHgwMDAwMDAwMQorI2RlZmluZSBURzNfRkxHMl9TVU5fNTcwWAkJMHgwMDAwMDAwMgorI2RlZmluZSBURzNfRkxHMl9OT19FVEhfV0lSRV9TUEVFRAkweDAwMDAwMDA0CisjZGVmaW5lIFRHM19GTEcyX0lTXzU3ODgJCTB4MDAwMDAwMDgKKyNkZWZpbmUgVEczX0ZMRzJfTUFYX1JYUEVORF82NAkJMHgwMDAwMDAxMAorI2RlZmluZSBURzNfRkxHMl9UU09fQ0FQQUJMRQkJMHgwMDAwMDAyMAorI2RlZmluZSBURzNfRkxHMl9QSFlfQURDX0JVRwkJMHgwMDAwMDA0MAorI2RlZmluZSBURzNfRkxHMl9QSFlfNTcwNF9BMF9CVUcJMHgwMDAwMDA4MAorI2RlZmluZSBURzNfRkxHMl9QSFlfQkVSX0JVRwkJMHgwMDAwMDEwMAorI2RlZmluZSBURzNfRkxHMl9QQ0lfRVhQUkVTUwkJMHgwMDAwMDIwMAorI2RlZmluZSBURzNfRkxHMl9BU0ZfTkVXX0hBTkRTSEFLRQkweDAwMDAwNDAwCisjZGVmaW5lIFRHM19GTEcyX0hXX0FVVE9ORUcJCTB4MDAwMDA4MDAKKyNkZWZpbmUgVEczX0ZMRzJfUEhZX0pVU1RfSU5JVFRFRAkweDAwMDAxMDAwCisjZGVmaW5lIFRHM19GTEcyX1BIWV9TRVJERVMJCTB4MDAwMDIwMDAKKyNkZWZpbmUgVEczX0ZMRzJfQ0FQQUNJVElWRV9DT1VQTElORwkweDAwMDA0MDAwCisjZGVmaW5lIFRHM19GTEcyX0ZMQVNICQkJMHgwMDAwODAwMAorI2RlZmluZSBURzNfRkxHMl9IV19UU08JCQkweDAwMDEwMDAwCisjZGVmaW5lIFRHM19GTEcyX1NFUkRFU19QUkVFTVBIQVNJUwkweDAwMDIwMDAwCisjZGVmaW5lIFRHM19GTEcyXzU3MDVfUExVUwkJMHgwMDA0MDAwMAorCisJdTMyCQkJCXNwbGl0X21vZGVfbWF4X3JlcXM7CisjZGVmaW5lIFNQTElUX01PREVfNTcwNF9NQVhfUkVRCQkzCisKKwlzdHJ1Y3QgdGltZXJfbGlzdAkJdGltZXI7CisJdTE2CQkJCXRpbWVyX2NvdW50ZXI7CisJdTE2CQkJCXRpbWVyX211bHRpcGxpZXI7CisJdTMyCQkJCXRpbWVyX29mZnNldDsKKwl1MTYJCQkJYXNmX2NvdW50ZXI7CisJdTE2CQkJCWFzZl9tdWx0aXBsaWVyOworCisJc3RydWN0IHRnM19saW5rX2NvbmZpZwkJbGlua19jb25maWc7CisJc3RydWN0IHRnM19idWZtZ3JfY29uZmlnCWJ1Zm1ncl9jb25maWc7CisKKwkvKiBjYWNoZSBoL3cgdmFsdWVzLCBvZnRlbiBwYXNzZWQgc3RyYWlnaHQgdG8gaC93ICovCisJdTMyCQkJCXJ4X21vZGU7CisJdTMyCQkJCXR4X21vZGU7CisJdTMyCQkJCW1hY19tb2RlOworCXUzMgkJCQltaV9tb2RlOworCXUzMgkJCQltaXNjX2hvc3RfY3RybDsKKwl1MzIJCQkJZ3JjX21vZGU7CisJdTMyCQkJCWdyY19sb2NhbF9jdHJsOworCXUzMgkJCQlkbWFfcndjdHJsOworCXUzMgkJCQljb2FsZXNjZV9tb2RlOworCisJLyogUENJIGJsb2NrICovCisJdTE2CQkJCXBjaV9jaGlwX3Jldl9pZDsKKwl1OAkJCQlwY2lfY2FjaGVsaW5lX3N6OworCXU4CQkJCXBjaV9sYXRfdGltZXI7CisJdTgJCQkJcGNpX2hkcl90eXBlOworCXU4CQkJCXBjaV9iaXN0OworCisJaW50CQkJCXBtX2NhcDsKKworCS8qIFBIWSBpbmZvICovCisJdTMyCQkJCXBoeV9pZDsKKyNkZWZpbmUgUEhZX0lEX01BU0sJCQkweGZmZmZmZmYwCisjZGVmaW5lIFBIWV9JRF9CQ001NDAwCQkJMHg2MDAwODA0MAorI2RlZmluZSBQSFlfSURfQkNNNTQwMQkJCTB4NjAwMDgwNTAKKyNkZWZpbmUgUEhZX0lEX0JDTTU0MTEJCQkweDYwMDA4MDcwCisjZGVmaW5lIFBIWV9JRF9CQ001NzAxCQkJMHg2MDAwODExMAorI2RlZmluZSBQSFlfSURfQkNNNTcwMwkJCTB4NjAwMDgxNjAKKyNkZWZpbmUgUEhZX0lEX0JDTTU3MDQJCQkweDYwMDA4MTkwCisjZGVmaW5lIFBIWV9JRF9CQ001NzA1CQkJMHg2MDAwODFhMAorI2RlZmluZSBQSFlfSURfQkNNNTc1MAkJCTB4NjAwMDgxODAKKyNkZWZpbmUgUEhZX0lEX0JDTTgwMDIJCQkweDYwMDEwMTQwCisjZGVmaW5lIFBIWV9JRF9JTlZBTElECQkJMHhmZmZmZmZmZgorI2RlZmluZSBQSFlfSURfUkVWX01BU0sJCQkweDAwMDAwMDBmCisjZGVmaW5lIFBIWV9SRVZfQkNNNTQwMV9CMAkJMHgxCisjZGVmaW5lIFBIWV9SRVZfQkNNNTQwMV9CMgkJMHgzCisjZGVmaW5lIFBIWV9SRVZfQkNNNTQwMV9DMAkJMHg2CisjZGVmaW5lIFBIWV9SRVZfQkNNNTQxMV9YMAkJMHgxIC8qIEZvdW5kIG9uIE5ldGdlYXIgR0EzMDJUICovCisKKwl1MzIJCQkJbGVkX2N0cmw7CisKKwljaGFyCQkJCWJvYXJkX3BhcnRfbnVtYmVyWzI0XTsKKwl1MzIJCQkJbmljX3NyYW1fZGF0YV9jZmc7CisJdTMyCQkJCXBjaV9jbG9ja19jdHJsOworCXN0cnVjdCBwY2lfZGV2CQkJKnBkZXZfcGVlcjsKKworCS8qIFRoaXMgbWFjcm8gYXNzdW1lcyB0aGUgcGFzc2VkIFBIWSBJRCBpcyBhbHJlYWR5IG1hc2tlZAorCSAqIHdpdGggUEhZX0lEX01BU0suCisJICovCisjZGVmaW5lIEtOT1dOX1BIWV9JRChYKQkJXAorCSgoWCkgPT0gUEhZX0lEX0JDTTU0MDAgfHwgKFgpID09IFBIWV9JRF9CQ001NDAxIHx8IFwKKwkgKFgpID09IFBIWV9JRF9CQ001NDExIHx8IChYKSA9PSBQSFlfSURfQkNNNTcwMSB8fCBcCisJIChYKSA9PSBQSFlfSURfQkNNNTcwMyB8fCAoWCkgPT0gUEhZX0lEX0JDTTU3MDQgfHwgXAorCSAoWCkgPT0gUEhZX0lEX0JDTTU3MDUgfHwgKFgpID09IFBIWV9JRF9CQ001NzUwIHx8IFwKKwkgKFgpID09IFBIWV9JRF9CQ004MDAyKQorCisJc3RydWN0IHRnM19od19zdGF0cwkJKmh3X3N0YXRzOworCWRtYV9hZGRyX3QJCQlzdGF0c19tYXBwaW5nOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJcmVzZXRfdGFzazsKKworCXUzMgkJCQludnJhbV9zaXplOworCXUzMgkJCQludnJhbV9wYWdlc2l6ZTsKKwl1MzIJCQkJbnZyYW1famVkZWNudW07CisKKyNkZWZpbmUgSkVERUNfQVRNRUwJCQkweDFmCisjZGVmaW5lIEpFREVDX1NUCQkJMHgyMAorI2RlZmluZSBKRURFQ19TQUlGVU4JCQkweDRmCisjZGVmaW5lIEpFREVDX1NTVAkJCTB4YmYKKworI2RlZmluZSBBVE1FTF9BVDI0QzY0X0NISVBfU0laRQkJKDY0ICogMTAyNCkKKyNkZWZpbmUgQVRNRUxfQVQyNEM2NF9QQUdFX1NJWkUJCSgzMikKKworI2RlZmluZSBBVE1FTF9BVDI0QzUxMl9DSElQX1NJWkUJKDUxMiAqIDEwMjQpCisjZGVmaW5lIEFUTUVMX0FUMjRDNTEyX1BBR0VfU0laRQkoMTI4KQorCisjZGVmaW5lIEFUTUVMX0FUNDVEQjBYMUJfUEFHRV9QT1MJOQorI2RlZmluZSBBVE1FTF9BVDQ1REIwWDFCX1BBR0VfU0laRQkyNjQKKworI2RlZmluZSBBVE1FTF9BVDI1RjUxMl9QQUdFX1NJWkUJMjU2CisKKyNkZWZpbmUgU1RfTTQ1UEVYMF9QQUdFX1NJWkUJCTI1NgorCisjZGVmaW5lIFNBSUZVTl9TQTI1RjBYWF9QQUdFX1NJWkUJMjU2CisKKyNkZWZpbmUgU1NUXzI1VkYwWDBfUEFHRV9TSVpFCQk0MDk4CisKKworfTsKKworI2VuZGlmIC8qICEoX1QzX0gpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90bGFuLmMgYi9kcml2ZXJzL25ldC90bGFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdmZmE2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3RsYW4uYwpAQCAtMCwwICsxLDMzMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIExpbnV4IFRodW5kZXJMQU4gRHJpdmVyCisgKgorICogIHRsYW4uYworICogIGJ5IEphbWVzIEJhbmtzCisgKgorICogIChDKSAxOTk3LTE5OTggQ2FsZGVyYSwgSW5jLgorICogIChDKSAxOTk4IEphbWVzIEJhbmtzCisgKiAgKEMpIDE5OTktMjAwMSBUb3JiZW4gTWF0aGlhc2VuCisgKiAgKEMpIDIwMDIgU2FtdWVsIENoZXNzbWFuCisgKgorICogIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqKiBUaGlzIGZpbGUgaXMgYmVzdCB2aWV3ZWQvZWRpdGVkIHdpdGggY29sdW1ucz49MTMyLgorICoKKyAqKiBVc2VmdWwgKGlmIG5vdCByZXF1aXJlZCkgcmVhZGluZzoKKyAqCisgKgkJVGV4YXMgSW5zdHJ1bWVudHMsIFRodW5kZXJMQU4gUHJvZ3JhbW1lcidzIEd1aWRlLAorICoJCQlUSSBMaXRlcmF0dXJlIE51bWJlciBTUFdVMDEzQQorICoJCQlhdmFpbGFibGUgaW4gUERGIGZvcm1hdCBmcm9tIHd3dy50aS5jb20KKyAqCQlMZXZlbCBPbmUsIExYVDkwMSBhbmQgTFhUOTcwIERhdGEgU2hlZXRzCisgKgkJCWF2YWlsYWJsZSBpbiBQREYgZm9ybWF0IGZyb20gd3d3LmxldmVsMS5jb20KKyAqCQlOYXRpb25hbCBTZW1pY29uZHVjdG9yLCBEUDgzODQwQSBEYXRhIFNoZWV0CisgKgkJCWF2YWlsYWJsZSBpbiBQREYgZm9ybWF0IGZyb20gd3d3Lm5hdGlvbmFsLmNvbQorICoJCU1pY3JvY2hpcCBUZWNobm9sb2d5LCAyNEMwMUEvMDJBLzA0QSBEYXRhIFNoZWV0CisgKgkJCWF2YWlsYWJsZSBpbiBQREYgZm9ybWF0IGZyb20gd3d3Lm1pY3JvY2hpcC5jb20KKyAqCisgKiBDaGFuZ2UgSGlzdG9yeQorICoKKyAqCVRpZ3JhbiBBaXZhemlhbiA8dGlncmFuQHNjby5jb20+OglUTGFuX1BjaVByb2JlKCkgbm93IHVzZXMKKyAqCQkJCQkJbmV3IFBDSSBCSU9TIGludGVyZmFjZS4KKyAqCUFsYW4gQ294CTxhbGFuQHJlZGhhdC5jb20+OglGaXhlZCB0aGUgb3V0IG9mIG1lbW9yeQorICoJCQkJCQloYW5kbGluZy4KKyAqICAgICAgCisgKglUb3JiZW4gTWF0aGlhc2VuIDx0b3JiZW4ubWF0aGlhc2VuQGNvbXBhcS5jb20+IE5ldyBNYWludGFpbmVyIQorICoKKyAqCXYxLjEgRGVjIDIwLCAxOTk5ICAgIC0gUmVtb3ZlZCBsaW51eCB2ZXJzaW9uIGNoZWNraW5nCisgKgkJCSAgICAgICBQYXRjaCBmcm9tIFRpZ3JhbiBBaXZhemlhbi4gCisgKgkJCSAgICAgLSB2MS4xIGluY2x1ZGVzIEFsYW4ncyBTTVAgdXBkYXRlcy4KKyAqCQkJICAgICAtIFdlIHN0aWxsIGhhdmUgcHJvYmxlbXMgb24gU01QIHRob3VnaCwKKyAqCQkJICAgICAgIGJ1dCBJJ20gbG9va2luZyBpbnRvIHRoYXQuIAorICoJCQkKKyAqCXYxLjIgSmFuIDAyLCAyMDAwICAgIC0gSG9wZWZ1bGx5IGZpeGVkIHRoZSBTTVAgZGVhZGxvY2suCisgKgkJCSAgICAgLSBSZW1vdmVkIGRlcGVuZGVuY3kgb2YgSFogYmVpbmcgMTAwLgorICoJCQkgICAgIC0gV2Ugbm93IGFsbG93IGhpZ2hlciBwcmlvcml0eSB0aW1lcnMgdG8gCisgKgkJCSAgICAgICBvdmVyd3JpdGUgdGltZXJzIGxpa2UgVExBTl9USU1FUl9BQ1RJVklUWQorICoJCQkgICAgICAgUGF0Y2ggZnJvbSBKb2huIENhZ2xlIDxqb2huLmNhZ2xlQGNvbXBhcS5jb20+LgorICoJCQkgICAgIC0gRml4ZWQgYSBmZXcgY29tcGlsZXIgd2FybmluZ3MuCisgKgorICoJdjEuMyBGZWIgMDQsIDIwMDAgICAgLSBGaXhlZCB0aGUgcmVtYWluaW5nIEhaIGlzc3Vlcy4KKyAqCQkJICAgICAtIFJlbW92ZWQgY2FsbCB0byBwY2lfcHJlc2VudCgpLiAKKyAqCQkJICAgICAtIFJlbW92ZWQgU0FfSU5URVJSVVBUIGZsYWcgZnJvbSBpcnEgaGFuZGxlci4KKyAqCQkJICAgICAtIEFkZGVkIF9faW5pdCBhbmQgX19pbml0ZGF0YSB0byByZWR1Y2UgcmVzaXNkZW50IAorICoJCQkgICAgICAgY29kZSBzaXplLgorICoJCQkgICAgIC0gRHJpdmVyIG5vdyB1c2VzIG1vZHVsZV9pbml0L21vZHVsZV9leGl0LgorICoJCQkgICAgIC0gUmV3cm90ZSBpbml0X21vZHVsZSBhbmQgdGxhbl9wcm9iZSB0bworICoJCQkgICAgICAgc2hhcmUgYSBsb3QgbW9yZSBjb2RlLiBXZSBub3cgdXNlIHRsYW5fcHJvYmUKKyAqCQkJICAgICAgIHdpdGggYnVpbHRpbiBhbmQgbW9kdWxlIGRyaXZlci4KKyAqCQkJICAgICAtIERyaXZlciBwb3J0ZWQgdG8gbmV3IG5ldCBBUEkuIAorICoJCQkgICAgIC0gdGxhbi50eHQgaGFzIGJlZW4gcmV3b3JrZWQgdG8gcmVmbGVjdCBjdXJyZW50IAorICoJCQkgICAgICAgZHJpdmVyIChhbG1vc3QpCisgKgkJCSAgICAgLSBPdGhlciBtaW5vciBzdHVmZgorICoKKyAqCXYxLjQgRmViIDEwLCAyMDAwICAgIC0gVXBkYXRlZCB3aXRoIG1vcmUgY2hhbmdlcyByZXF1aXJlZCBhZnRlciBEYXZlJ3MKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yayBjbGVhbnVwIGluIDIuMy40M3ByZTcgKFRpZ3JhbiAmIG15c2VsZikKKyAqCSAgICAgICAgICAgICAgICAgICAgIC0gTWlub3Igc3R1ZmYuCisgKgorICoJdjEuNSBNYXJjaCAyMiwgMjAwMCAgLSBGaXhlZCBhbm90aGVyIHRpbWVyIGJ1ZyB0aGF0IHdvdWxkIGhhbmcgdGhlIGRyaXZlcgorICoJCQkgICAgICAgaWYgbm8gY2FibGUvbGluayB3ZXJlIHByZXNlbnQuCisgKgkJCSAgICAgLSBDb3NtZXRpYyBjaGFuZ2VzLgorICoJCQkgICAgIC0gVE9ETzogUG9ydCBjb21wbGV0ZWx5IHRvIG5ldyBQQ0kvRE1BIEFQSQorICoJCQkgICAgIAkgICAgIEF1dG8tTmVnIGZhbGxiYWNrLgorICoKKyAqIAl2MS42IEFwcmlsIDA0LCAyMDAwICAtIEZpeGVkIGRyaXZlciBzdXBwb3J0IGZvciBrZXJuZWwtcGFyYW1ldGVycy4gSGF2ZW4ndAorICogCQkJICAgICAgIHRlc3RlZCBpdCB0aG91Z2gsIGFzIHRoZSBrZXJuZWwgc3VwcG9ydCBpcyBjdXJyZW50bHkgCisgKiAJCQkgICAgICAgYnJva2VuICgyLjMuOTlwNHAzKS4KKyAqIAkJCSAgICAgLSBVcGRhdGVkIHRsYW4udHh0IGFjY29yZGluZ2x5LgorICogCQkJICAgICAtIEFkanVzdGVkIG1pbmltdW0vbWF4aW11bSBmcmFtZSBsZW5ndGguCisgKiAJCQkgICAgIC0gVGhlcmUgaXMgbm93IGEgVExBTiB3ZWJzaXRlIHVwIGF0IAorICogCQkJICAgICAgIGh0dHA6Ly90bGFuLmtlcm5lbC5kaworICoKKyAqIAl2MS43IEFwcmlsIDA3LCAyMDAwICAtIFN0YXJ0ZWQgdG8gaW1wbGVtZW50IGN1c3RvbSBpb2N0bHMuIERyaXZlciBub3cKKyAqIAkJCSAgICAgICByZXBvcnRzIFBIWSBpbmZvcm1hdGlvbiB3aGVuIHVzZWQgd2l0aCBEb25hbGQKKyAqIAkJCSAgICAgICBCZWNrZXJzIHVzZXJzcGFjZSBNSUkgZGlhZ25vc3RpY3MgdXRpbGl0eS4KKyAqCisgKiAJdjEuOCBBcHJpbCAyMywgMjAwMCAgLSBGaXhlZCBzdXBwb3J0IGZvciBmb3JjZWQgc3BlZWQvZHVwbGV4IHNldHRpbmdzLgorICogCQkJICAgICAtIEFkZGVkIGxpbmsgaW5mb3JtYXRpb24gdG8gQXV0by1OZWcgYW5kIGZvcmNlZAorICogCQkJICAgICAgIG1vZGVzLiBXaGVuIE5JQyBvcGVyYXRlcyB3aXRoIGF1dG8tbmVnIHRoZSBkcml2ZXIKKyAqIAkJCSAgICAgICB3aWxsIHJlcG9ydCBMaW5rIHNwZWVkICYgZHVwbGV4IG1vZGVzIGFzIHdlbGwgYXMKKyAqIAkJCSAgICAgICBsaW5rIHBhcnRuZXIgYWJpbGl0aWVzLiBXaGVuIGZvcmNlZCBsaW5rIGlzIHVzZWQsCisgKiAJCQkgICAgICAgdGhlIGRyaXZlciB3aWxsIHJlcG9ydCBzdGF0dXMgb2YgdGhlIGVzdGFibGlzaGVkCisgKiAJCQkgICAgICAgbGluay4KKyAqIAkJCSAgICAgICBQbGVhc2UgcmVhZCB0bGFuLnR4dCBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4gCisgKiAJCQkgICAgIC0gUmVtb3ZlZCBjYWxsIHRvIGNoZWNrX3JlZ2lvbigpLCBhbmQgdXNlZCAKKyAqIAkJCSAgICAgICByZXR1cm4gdmFsdWUgb2YgcmVxdWVzdF9yZWdpb24oKSBpbnN0ZWFkLgorICoJCisgKgl2MS44YSBNYXkgMjgsIDIwMDAgICAtIE1pbm9yIHVwZGF0ZXMuCisgKgorICoJdjEuOSBKdWx5IDI1LCAyMDAwICAgLSBGaXhlZCBhIGZldyByZW1haW5pbmcgRnVsbC1EdXBsZXggaXNzdWVzLgorICoJICAgICAgICAgICAgICAgICAgICAgLSBVcGRhdGVkIHdpdGggdGltZXIgZml4ZXMgZnJvbSBBbmRyZXcgTW9ydG9uLgorICoJICAgICAgICAgICAgICAgICAgICAgLSBGaXhlZCBtb2R1bGUgcmFjZSBpbiBUTGFuX09wZW4uCisgKgkgICAgICAgICAgICAgICAgICAgICAtIEFkZGVkIHJvdXRpbmUgdG8gbW9uaXRvciBQSFkgc3RhdHVzLgorICoJICAgICAgICAgICAgICAgICAgICAgLSBBZGRlZCBhY3Rpdml0eSBsZWQgc3VwcG9ydCBmb3IgUHJvbGlhbnQgZGV2aWNlcy4KKyAqCisgKgl2MS4xMCBBdWcgMzAsIDIwMDAgICAtIEFkZGVkIHN1cHBvcnQgZm9yIEVJU0EgYmFzZWQgdGxhbiBjb250cm9sbGVycyAKKyAqCQkJICAgICAgIGxpa2UgdGhlIENvbXBhcSBOZXRGbGV4My9FLiAKKyAqCQkJICAgICAtIFJld3JvdGUgdGxhbl9wcm9iZSB0byBiZXR0ZXIgaGFuZGxlIG11bHRpcGxlCisgKgkJCSAgICAgICBidXMgcHJvYmVzLiBQcm9iaW5nIGFuZCBkZXZpY2Ugc2V0dXAgaXMgbm93CisgKgkJCSAgICAgICBkb25lIHRocm91Z2ggVExhbl9Qcm9iZSBhbmQgVExhbl9pbml0X29uZS4gQWN0dWFsCisgKgkJCSAgICAgICBoYXJkd2FyZSBwcm9iZSBpcyBkb25lIHdpdGgga2VybmVsIEFQSSBhbmQgCisgKgkJCSAgICAgICBUTGFuX0Vpc2FQcm9iZS4KKyAqCQkJICAgICAtIEFkanVzdGVkIGRlYnVnIGluZm9ybWF0aW9uIGZvciBwcm9iaW5nLgorICoJCQkgICAgIC0gRml4ZWQgYnVnIHRoYXQgd291bGQgY2F1c2UgZ2VuZXJhbCBkZWJ1ZyBpbmZvcm1hdGlvbiAKKyAqCQkJICAgICAgIHRvIGJlIHByaW50ZWQgYWZ0ZXIgZHJpdmVyIHJlbW92YWwuIAorICoJCQkgICAgIC0gQWRkZWQgdHJhbnNtaXQgdGltZW91dCBoYW5kbGluZy4KKyAqCQkJICAgICAtIEZpeGVkIE9PTSByZXR1cm4gdmFsdWVzIGluIHRsYW5fcHJvYmUuIAorICoJCQkgICAgIC0gRml4ZWQgcG9zc2libGUgbWVtIGxlYWsgaW4gdGxhbl9leGl0IAorICoJCQkgICAgICAgKG5vdyB0bGFuX3JlbW92ZV9vbmUpLgorICoJCQkgICAgIC0gRml4ZWQgdGltZXIgYnVnIGluIFRMYW5fcGh5TW9uaXRvci4KKyAqCQkJICAgICAtIFRoaXMgZHJpdmVyIHZlcnNpb24gaXMgYWxwaGEgcXVhbGl0eSwgcGxlYXNlCisgKgkJCSAgICAgICBzZW5kIG1lIGFueSBidWcgaXNzdWVzIHlvdSBtYXkgZW5jb3VudGVyLgorICoKKyAqCXYxLjExIEF1ZyAzMSwgMjAwMCAgIC0gRG8gbm90IHRyeSB0byByZWdpc3RlciBpcnEgMCBpZiBubyBpcnEgbGluZSB3YXMgCisgKgkJCSAgICAgICBzZXQgZm9yIEVJU0EgY2FyZHMuCisgKgkJCSAgICAgLSBBZGRlZCBzdXBwb3J0IGZvciBOZXRGbGV4My9FIHdpdGggbmliYmxlLXJhdGUKKyAqCQkJICAgICAgIDEwQmFzZS1UIFBIWS4gVGhpcyBpcyB1bnRlc3RldCBhcyBJIGhhdmVuJ3QgZ290CisgKgkJCSAgICAgICBvbmUgb2YgdGhlc2UgY2FyZHMuCisgKgkJCSAgICAgLSBGaXhlZCB0aW1lciBiZWluZyBhZGRlZCB0d2ljZS4KKyAqCQkJICAgICAtIERpc2FibGVkIFBoeU1vbml0b3JpbmcgYnkgZGVmYXVsdCBhcyB0aGlzIGlzCisgKgkJCSAgICAgICB3b3JrIGluIHByb2dyZXNzLiBEZWZpbmUgTU9OSVRPUiB0byBlbmFibGUgaXQuCisgKgkJCSAgICAgLSBOb3cgd2UgZG9uJ3QgZGlzcGxheSBsaW5rIGluZm8gd2l0aCBQSFlzIHRoYXQKKyAqCQkJICAgICAgIGRvZXNuJ3Qgc3VwcG9ydCBpdCAobGV2ZWwxKS4KKyAqCQkJICAgICAtIEluY3Jlc2VkIHR4X3RpbWVvdXQgYmVhY3VzZSBvZiBhdXRvLW5lZy4KKyAqCQkJICAgICAtIEFkanVzdGVkIHRpbWVycyBmb3IgZm9yY2VkIHNwZWVkcy4KKyAqCisgKgl2MS4xMiBPY3QgMTIsIDIwMDAgICAtIE1pbm9yIGZpeGVzIChtZW1sZWFrLCBpbml0LCBldGMuKQorICoKKyAqIAl2MS4xMyBOb3YgMjgsIDIwMDAgICAtIFN0b3AgZmxvb2RpbmcgY29uc29sZSB3aXRoIGF1dG8tbmVnIGlzc3VlcworICogCQkJICAgICAgIHdoZW4gbGluayBjYW4ndCBiZSBlc3RhYmxpc2hlZC4KKyAqCQkJICAgICAtIEFkZGVkIHRoZSBiYnVmIG9wdGlvbiBhcyBhIGtlcm5lbCBwYXJhbWV0ZXIuCisgKgkJCSAgICAgLSBGaXhlZCBpb2FkZHIgcHJvYmUgYnVnLgorICoJCQkgICAgIC0gRml4ZWQgc3R1cGlkIGRlYWRsb2NrIHdpdGggTUlJIGludGVycnVwdHMuCisgKgkJCSAgICAgLSBBZGRlZCBzdXBwb3J0IGZvciBzcGVlZC9kdXBsZXggc2VsZWN0aW9uIHdpdGggCisgKgkJCSAgICAgICBtdWx0aXBsZSBuaWNzLgorICoJCQkgICAgIC0gQWRkZWQgcGFydGx5IGZpeCBmb3IgVFggQ2hhbm5lbCBsb2NrdXAgd2l0aAorICoJCQkgICAgICAgVExBTiB2MS4wIHNpbGljb24uIFRoaXMgbmVlZHMgdG8gYmUgaW52ZXN0aWdhdGVkCisgKgkJCSAgICAgICBmdXJ0aGVyLgorICoKKyAqIAl2MS4xNCBEZWMgMTYsIDIwMDAgICAtIEFkZGVkIHN1cHBvcnQgZm9yIHNlcnZpY2luZyBtdWx0aXBsZSBmcmFtZXMgcGVyLgorICogCQkJICAgICAgIGludGVycnVwdC4gVGhhbmtzIGdvZXMgdG8KKyAqIAkJCSAgICAgICBBZGFtIEtleXMgPGFkYW1AdGkuY29tPgorICogCQkJICAgICAgIERlbmlzIEJlYXVkb2luIDxkYmVhdWRvaW5AdGkuY29tPgorICogCQkJICAgICAgIGZvciBwcm92aWRpbmcgdGhlIHBhdGNoLgorICogCQkJICAgICAtIEZpeGVkIGF1dG8tbmVnIG91dHB1dCB3aGVuIHVzaW5nIG11bHRpcGxlCisgKiAJCQkgICAgICAgYWRhcHRlcnMuCisgKiAJCQkgICAgIC0gQ29udmVydGVkIHRvIHVzZSBuZXcgdGFza3EgaW50ZXJmYWNlLgorICoKKyAqIAl2MS4xNGEgSmFuIDYsIDIwMDEgICAtIE1pbm9yIGFkanVzdG1lbnRzIChzcGlubG9ja3MsIGV0Yy4pCisgKgorICoJU2FtdWVsIENoZXNzbWFuIDxjaGVzc21hbkB0dXgub3JnPiBOZXcgTWFpbnRhaW5lciEKKyAqCisgKgl2MS4xNSBBcHIgNCwgMjAwMiAgICAtIENvcnJlY3Qgb3BlcmF0aW9uIHdoZW4gYXVpPTEgdG8gYmUKKyAqCSAgICAgICAgICAgICAgICAgICAgICAgMTBUIGhhbGYgZHVwbGV4IG5vIGxvb3BiYWNrCisgKgkgICAgICAgICAgICAgICAgICAgICAgIFRoYW5rcyB0byBHdW5uYXIgRWlrbWFuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9laXNhLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisKKyNpbmNsdWRlICJ0bGFuLmgiCisKK3R5cGVkZWYgdTMyIChUTGFuSW50VmVjdG9yRnVuYykoIHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNiApOworCisKKy8qIEZvciByZW1vdmluZyBFSVNBIGRldmljZXMgKi8KK3N0YXRpYwlzdHJ1Y3QgbmV0X2RldmljZQkqVExhbl9FaXNhX0RldmljZXM7CisKK3N0YXRpYwlpbnQJCVRMYW5EZXZpY2VzSW5zdGFsbGVkOworCisvKiBTZXQgc3BlZWQsIGR1cGxleCBhbmQgYXVpIHNldHRpbmdzICovCitzdGF0aWMgIGludCBhdWlbTUFYX1RMQU5fQk9BUkRTXTsKK3N0YXRpYyAgaW50IGR1cGxleFtNQVhfVExBTl9CT0FSRFNdOworc3RhdGljICBpbnQgc3BlZWRbTUFYX1RMQU5fQk9BUkRTXTsKK3N0YXRpYyAgaW50IGJvYXJkc19mb3VuZDsKKworTU9EVUxFX0FVVEhPUigiTWFpbnRhaW5lcjogU2FtdWVsIENoZXNzbWFuIDxjaGVzc21hbkB0dXgub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIFRJIFRodW5kZXJMQU4gYmFzZWQgZXRoZXJuZXQgUENJIGFkYXB0ZXJzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworLyogRGVmaW5lIHRoaXMgdG8gZW5hYmxlIExpbmsgYmVhdCBtb25pdG9yaW5nICovCisjdW5kZWYgTU9OSVRPUgorCisvKiBUdXJuIG9uIGRlYnVnZ2luZy4gU2VlIERvY3VtZW50YXRpb24vbmV0d29ya2luZy90bGFuLnR4dCBmb3IgZGV0YWlscyAqLworc3RhdGljICBpbnQJCWRlYnVnOworCitzdGF0aWMJaW50CQliYnVmOworc3RhdGljCXU4CQkqVExhblBhZEJ1ZmZlcjsKK3N0YXRpYyAgZG1hX2FkZHJfdAlUTGFuUGFkQnVmZmVyRE1BOworc3RhdGljCWNoYXIJCVRMYW5TaWduYXR1cmVbXSA9ICJUTEFOIjsKK3N0YXRpYyAgY29uc3QgY2hhciB0bGFuX2Jhbm5lcltdID0gIlRodW5kZXJMQU4gZHJpdmVyIHYxLjE1XG4iOworc3RhdGljICBpbnQgdGxhbl9oYXZlX3BjaTsKK3N0YXRpYyAgaW50IHRsYW5faGF2ZV9laXNhOworCitzdGF0aWMgY29uc3QgY2hhciAqbWVkaWFbXSA9IHsKKwkiMTBCYXNlVC1IRCAiLCAiMTBCYXNlVC1GRCAiLCIxMDBiYXNlVHgtSEQgIiwgCisJIjEwMGJhc2VUeC1GRCIsICIxMDBiYXNlVDQiLCBOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGJvYXJkIHsKKwljb25zdCBjaGFyCSpkZXZpY2VMYWJlbDsKKwl1MzIJICAgCWZsYWdzOworCXUxNgkgICAJYWRkck9mczsKK30gYm9hcmRfaW5mb1tdID0geworCXsgIkNvbXBhcSBOZXRlbGxpZ2VudCAxMCBUIFBDSSBVVFAiLCBUTEFOX0FEQVBURVJfQUNUSVZJVFlfTEVELCAweDgzIH0sCisJeyAiQ29tcGFxIE5ldGVsbGlnZW50IDEwLzEwMCBUWCBQQ0kgVVRQIiwgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRCwgMHg4MyB9LAorCXsgIkNvbXBhcSBJbnRlZ3JhdGVkIE5ldEZsZXgtMy9QIiwgVExBTl9BREFQVEVSX05PTkUsIDB4ODMgfSwKKwl7ICJDb21wYXEgTmV0RmxleC0zL1AiLCBUTEFOX0FEQVBURVJfVU5NQU5BR0VEX1BIWSB8IFRMQU5fQURBUFRFUl9CSVRfUkFURV9QSFksIDB4ODMgfSwKKwl7ICJDb21wYXEgTmV0RmxleC0zL1AiLCBUTEFOX0FEQVBURVJfTk9ORSwgMHg4MyB9LAorCXsgIkNvbXBhcSBOZXRlbGxpZ2VudCBJbnRlZ3JhdGVkIDEwLzEwMCBUWCBVVFAiLCBUTEFOX0FEQVBURVJfQUNUSVZJVFlfTEVELCAweDgzIH0sCisJeyAiQ29tcGFxIE5ldGVsbGlnZW50IER1YWwgMTAvMTAwIFRYIFBDSSBVVFAiLCBUTEFOX0FEQVBURVJfTk9ORSwgMHg4MyB9LAorCXsgIkNvbXBhcSBOZXRlbGxpZ2VudCAxMC8xMDAgVFggRW1iZWRkZWQgVVRQIiwgVExBTl9BREFQVEVSX05PTkUsIDB4ODMgfSwKKwl7ICJPbGljb20gT0MtMjE4My8yMTg1IiwgVExBTl9BREFQVEVSX1VTRV9JTlRFUk5fMTAsIDB4ODMgfSwKKwl7ICJPbGljb20gT0MtMjMyNSIsIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZLCAweEY4IH0sCisJeyAiT2xpY29tIE9DLTIzMjYiLCBUTEFOX0FEQVBURVJfVVNFX0lOVEVSTl8xMCwgMHhGOCB9LAorCXsgIkNvbXBhcSBOZXRlbGxpZ2VudCAxMC8xMDAgVFggVVRQIiwgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRCwgMHg4MyB9LAorCXsgIkNvbXBhcSBOZXRlbGxpZ2VudCAxMCBULzIgUENJIFVUUC9Db2F4IiwgVExBTl9BREFQVEVSX05PTkUsIDB4ODMgfSwKKwl7ICJDb21wYXEgTmV0RmxleC0zL0UiLCBUTEFOX0FEQVBURVJfQUNUSVZJVFlfTEVEIHwgCS8qIEVJU0EgY2FyZCAqLworCSAgICAgICAgICAgICAgICAgICAgICAgIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZIHwgVExBTl9BREFQVEVSX0JJVF9SQVRFX1BIWSwgMHg4MyB9LAkKKwl7ICJDb21wYXEgTmV0RmxleC0zL0UiLCBUTEFOX0FEQVBURVJfQUNUSVZJVFlfTEVELCAweDgzIH0sIC8qIEVJU0EgY2FyZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHRsYW5fcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX05FVEVMMTAsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9ORVRFTDEwMCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMSB9LAorCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX05FVEZMRVgzSSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMiB9LAorCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX1RIVU5ERVIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDMgfSwKKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9ORVRGTEVYM0IsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDQgfSwKKwl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9ORVRFTDEwMFBJLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA1IH0sCisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfTkVURUwxMDBELAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA2IH0sCisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfTkVURUwxMDBJLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA3IH0sCisJeyBQQ0lfVkVORE9SX0lEX09MSUNPTSwgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMTgzLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA4IH0sCisJeyBQQ0lfVkVORE9SX0lEX09MSUNPTSwgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI1LAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA5IH0sCisJeyBQQ0lfVkVORE9SX0lEX09MSUNPTSwgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI2LAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfTkVURUxMSUdFTlRfMTBfMTAwX1dTXzUxMDAsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDExIH0sCisJeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9ORVRFTExJR0VOVF8xMF9UMiwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTIgfSwKKwl7IDAsfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB0bGFuX3BjaV90YmwpOwkJCisKK3N0YXRpYyB2b2lkCVRMYW5fRWlzYVByb2JlKCB2b2lkICk7CitzdGF0aWMgdm9pZAlUTGFuX0Vpc2FfQ2xlYW51cCggdm9pZCApOworc3RhdGljIGludCAgICAgIFRMYW5fSW5pdCggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIGludAlUTGFuX09wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK3N0YXRpYyBpbnQJVExhbl9TdGFydFR4KCBzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBUTGFuX0hhbmRsZUludGVycnVwdCggaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIGludAlUTGFuX0Nsb3NlKCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBzdHJ1Y3QJbmV0X2RldmljZV9zdGF0cyAqVExhbl9HZXRTdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgdm9pZAlUTGFuX1NldE11bHRpY2FzdExpc3QoIHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludAlUTGFuX2lvY3RsKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgICAgICBUTGFuX3Byb2JlMSggc3RydWN0IHBjaV9kZXYgKnBkZXYsIGxvbmcgaW9hZGRyLCBpbnQgaXJxLCBpbnQgcmV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKK3N0YXRpYyB2b2lkCVRMYW5fdHhfdGltZW91dCggc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IAl0bGFuX2luaXRfb25lKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CisKK3N0YXRpYyB1MzIJVExhbl9IYW5kbGVJbnZhbGlkKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYgKTsKK3N0YXRpYyB1MzIJVExhbl9IYW5kbGVUeEVPRiggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2ICk7CitzdGF0aWMgdTMyCVRMYW5fSGFuZGxlU3RhdE92ZXJmbG93KCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYgKTsKK3N0YXRpYyB1MzIJVExhbl9IYW5kbGVSeEVPRiggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2ICk7CitzdGF0aWMgdTMyCVRMYW5fSGFuZGxlRHVtbXkoIHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNiApOworc3RhdGljIHUzMglUTGFuX0hhbmRsZVR4RU9DKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYgKTsKK3N0YXRpYyB1MzIJVExhbl9IYW5kbGVTdGF0dXNDaGVjayggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2ICk7CitzdGF0aWMgdTMyCVRMYW5fSGFuZGxlUnhFT0MoIHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNiApOworCitzdGF0aWMgdm9pZAlUTGFuX1RpbWVyKCB1bnNpZ25lZCBsb25nICk7CisKK3N0YXRpYyB2b2lkCVRMYW5fUmVzZXRMaXN0cyggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQJVExhbl9GcmVlTGlzdHMoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB2b2lkCVRMYW5fUHJpbnREaW8oIHUxNiApOworc3RhdGljIHZvaWQJVExhbl9QcmludExpc3QoIFRMYW5MaXN0ICosIGNoYXIgKiwgaW50ICk7CitzdGF0aWMgdm9pZAlUTGFuX1JlYWRBbmRDbGVhclN0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQgKTsKK3N0YXRpYyB2b2lkCVRMYW5fUmVzZXRBZGFwdGVyKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZAlUTGFuX0ZpbmlzaFJlc2V0KCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZAlUTGFuX1NldE1hYyggc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50IGFyZWcsIGNoYXIgKm1hYyApOworCitzdGF0aWMgdm9pZAlUTGFuX1BoeVByaW50KCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZAlUTGFuX1BoeURldGVjdCggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQJVExhbl9QaHlQb3dlckRvd24oIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB2b2lkCVRMYW5fUGh5UG93ZXJVcCggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQJVExhbl9QaHlSZXNldCggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQJVExhbl9QaHlTdGFydExpbmsoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB2b2lkCVRMYW5fUGh5RmluaXNoQXV0b05lZyggc3RydWN0IG5ldF9kZXZpY2UgKiApOworI2lmZGVmIE1PTklUT1IKK3N0YXRpYyB2b2lkICAgICBUTGFuX1BoeU1vbml0b3IoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKKyNlbmRpZgorCisvKgorc3RhdGljIGludAlUTGFuX1BoeU5vcCggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIGludAlUTGFuX1BoeUludGVybmFsQ2hlY2soIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyBpbnQJVExhbl9QaHlJbnRlcm5hbFNlcnZpY2UoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyBpbnQJVExhbl9QaHlEcDgzODQwYUNoZWNrKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CisqLworCitzdGF0aWMgaW50CVRMYW5fTWlpUmVhZFJlZyggc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2LCB1MTYsIHUxNiAqICk7CitzdGF0aWMgdm9pZAlUTGFuX01paVNlbmREYXRhKCB1MTYsIHUzMiwgdW5zaWduZWQgKTsKK3N0YXRpYyB2b2lkCVRMYW5fTWlpU3luYyggdTE2ICk7CitzdGF0aWMgdm9pZAlUTGFuX01paVdyaXRlUmVnKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYsIHUxNiwgdTE2ICk7CisKK3N0YXRpYyB2b2lkCVRMYW5fRWVTZW5kU3RhcnQoIHUxNiApOworc3RhdGljIGludAlUTGFuX0VlU2VuZEJ5dGUoIHUxNiwgdTgsIGludCApOworc3RhdGljIHZvaWQJVExhbl9FZVJlY2VpdmVCeXRlKCB1MTYsIHU4ICosIGludCApOworc3RhdGljIGludAlUTGFuX0VlUmVhZEJ5dGUoIHN0cnVjdCBuZXRfZGV2aWNlICosIHU4LCB1OCAqICk7CisKKworc3RhdGljIHZvaWQgCitUTGFuX1N0b3JlU0tCKCBzdHJ1Y3QgdGxhbl9saXN0X3RhZyAqdGFnLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKXNrYjsKKwl0YWctPmJ1ZmZlcls5XS5hZGRyZXNzID0gKHUzMilhZGRyOworCWFkZHIgPj49IDMxOwkvKiA+Pj0gMzIgaXMgdW5kZWZpbmVkIGZvciAzMmJpdCBhcmNoLCBzdHVwaWQgQyAqLworCWFkZHIgPj49IDE7CisJdGFnLT5idWZmZXJbOF0uYWRkcmVzcyA9ICh1MzIpYWRkcjsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICoKK1RMYW5fR2V0U0tCKCBzdHJ1Y3QgdGxhbl9saXN0X3RhZyAqdGFnKQoreworCXVuc2lnbmVkIGxvbmcgYWRkciA9IHRhZy0+YnVmZmVyWzhdLmFkZHJlc3M7CisJYWRkciA8PD0gMzE7CisJYWRkciA8PD0gMTsKKwlhZGRyIHw9IHRhZy0+YnVmZmVyWzldLmFkZHJlc3M7CisJcmV0dXJuIChzdHJ1Y3Qgc2tfYnVmZiAqKSBhZGRyOworfQorCisKK3N0YXRpYyBUTGFuSW50VmVjdG9yRnVuYyAqVExhbkludFZlY3RvcltUTEFOX0lOVF9OVU1CRVJfT0ZfSU5UU10gPSB7CisJVExhbl9IYW5kbGVJbnZhbGlkLAorCVRMYW5fSGFuZGxlVHhFT0YsCisJVExhbl9IYW5kbGVTdGF0T3ZlcmZsb3csCisJVExhbl9IYW5kbGVSeEVPRiwKKwlUTGFuX0hhbmRsZUR1bW15LAorCVRMYW5fSGFuZGxlVHhFT0MsCisJVExhbl9IYW5kbGVTdGF0dXNDaGVjaywKKwlUTGFuX0hhbmRsZVJ4RU9DCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQKK1RMYW5fU2V0VGltZXIoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB0aWNrcywgdTMyIHR5cGUgKQoreworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJCisJaWYgKCFpbl9pcnEoKSkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIHByaXYtPnRpbWVyLmZ1bmN0aW9uICE9IE5VTEwgJiYKKwkJcHJpdi0+dGltZXJUeXBlICE9IFRMQU5fVElNRVJfQUNUSVZJVFkgKSB7IAorCQlpZiAoIWluX2lycSgpKQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCXByaXYtPnRpbWVyLmZ1bmN0aW9uID0gJlRMYW5fVGltZXI7CisJaWYgKCFpbl9pcnEoKSkKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJcHJpdi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisJcHJpdi0+dGltZXJTZXRBdCA9IGppZmZpZXM7CisJcHJpdi0+dGltZXJUeXBlID0gdHlwZTsKKwltb2RfdGltZXIoJnByaXYtPnRpbWVyLCBqaWZmaWVzICsgdGlja3MpOworCQorfSAvKiBUTGFuX1NldFRpbWVyICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCVRodW5kZXJMQU4gRHJpdmVyIFByaW1hcnkgRnVuY3Rpb25zCisKKwlUaGVzZSBmdW5jdGlvbnMgYXJlIG1vcmUgb3IgbGVzcyBjb21tb24gdG8gYWxsIExpbnV4IG5ldHdvcmsgZHJpdmVycy4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCXRsYW5fcmVtb3ZlX29uZQorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlOb25lCisJICoKKwkgKglHb2VzIHRocm91Z2ggdGhlIFRMYW5EZXZpY2VzIGxpc3QgYW5kIGZyZWVzIHRoZSBkZXZpY2UKKwkgKglzdHJ1Y3RzIGFuZCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGVhY2ggZGV2aWNlIChsaXN0cworCSAqCWFuZCBidWZmZXJzKS4gIEl0IGFsc28gdXJlc2VydmVzIHRoZSBJTyBwb3J0IHJlZ2lvbnMKKwkgKglhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXZpY2UuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IHRsYW5fcmVtb3ZlX29uZSggc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YSggcGRldiApOworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJCisJdW5yZWdpc3Rlcl9uZXRkZXYoIGRldiApOworCisJaWYgKCBwcml2LT5kbWFTdG9yYWdlICkgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHByaXYtPnBjaURldiwgcHJpdi0+ZG1hU2l6ZSwgcHJpdi0+ZG1hU3RvcmFnZSwgcHJpdi0+ZG1hU3RvcmFnZURNQSApOworCX0KKworI2lmZGVmIENPTkZJR19QQ0kKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworI2VuZGlmCisJCisJZnJlZV9uZXRkZXYoIGRldiApOworCQkKKwlwY2lfc2V0X2RydmRhdGEoIHBkZXYsIE5VTEwgKTsKK30gCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB0bGFuX2RyaXZlciA9IHsKKwkubmFtZQkJPSAidGxhbiIsCisJLmlkX3RhYmxlCT0gdGxhbl9wY2lfdGJsLAorCS5wcm9iZQkJPSB0bGFuX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodGxhbl9yZW1vdmVfb25lKSwJCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0bGFuX3Byb2JlKHZvaWQpCit7CisJc3RhdGljIGludAlwYWRfYWxsb2NhdGVkOworCQorCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdGxhbl9iYW5uZXIpOworCQorCVRMYW5QYWRCdWZmZXIgPSAodTggKikgcGNpX2FsbG9jX2NvbnNpc3RlbnQoTlVMTCwgVExBTl9NSU5fRlJBTUVfU0laRSwgJlRMYW5QYWRCdWZmZXJETUEpOworCisJaWYgKFRMYW5QYWRCdWZmZXIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIlRMQU46IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBhZCBidWZmZXIuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KFRMYW5QYWRCdWZmZXIsIDAsIFRMQU5fTUlOX0ZSQU1FX1NJWkUpOworCXBhZF9hbGxvY2F0ZWQgPSAxOworCisJVExBTl9EQkcoVExBTl9ERUJVR19QUk9CRSwgIlN0YXJ0aW5nIFBDSSBQcm9iZS4uLi5cbiIpOworCQorCS8qIFVzZSBuZXcgc3R5bGUgUENJIHByb2JpbmcuIE5vdyB0aGUga2VybmVsIHdpbGwKKwkgICBkbyBtb3N0IG9mIHRoaXMgZm9yIHVzICovCisJcGNpX3JlZ2lzdGVyX2RyaXZlcigmdGxhbl9kcml2ZXIpOworCisJVExBTl9EQkcoVExBTl9ERUJVR19QUk9CRSwgIlN0YXJ0aW5nIEVJU0EgUHJvYmUuLi4uXG4iKTsKKwlUTGFuX0Vpc2FQcm9iZSgpOworCQkKKwlwcmludGsoS0VSTl9JTkZPICJUTEFOOiAlZCBkZXZpY2UlcyBpbnN0YWxsZWQsIFBDSTogJWQgIEVJU0E6ICVkXG4iLCAKKwkJIFRMYW5EZXZpY2VzSW5zdGFsbGVkLCBUTGFuRGV2aWNlc0luc3RhbGxlZCA9PSAxID8gIiIgOiAicyIsCisJCSB0bGFuX2hhdmVfcGNpLCB0bGFuX2hhdmVfZWlzYSk7CisKKwlpZiAoVExhbkRldmljZXNJbnN0YWxsZWQgPT0gMCkgeworCQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnRsYW5fZHJpdmVyKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChOVUxMLCBUTEFOX01JTl9GUkFNRV9TSVpFLCBUTGFuUGFkQnVmZmVyLCBUTGFuUGFkQnVmZmVyRE1BKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworfQorCQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0bGFuX2luaXRfb25lKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlyZXR1cm4gVExhbl9wcm9iZTEoIHBkZXYsIC0xLCAtMSwgMCwgZW50KTsKK30KKworCisvKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCXRsYW5fcHJvYmUxCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQkwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb24gZXJyb3IKKwkgKglQYXJtczogCisJICoJCW5vbmUKKwkgKgorCSAqCVRoZSBuYW1lIGlzIGxvd2VyIGNhc2UgdG8gZml0IGluIHdpdGggYWxsIHRoZSByZXN0IG9mCisJICoJdGhlIG5ldGNhcmRfcHJvYmUgbmFtZXMuICBUaGlzIGZ1bmN0aW9uIGxvb2tzIGZvciAKKwkgKglhbm90aGVyIFRMYW4gYmFzZWQgYWRhcHRlciwgc2V0dGluZyBpdCB1cCB3aXRoIHRoZQorCSAqCWFsbG9jYXRlZCBkZXZpY2Ugc3RydWN0IGlmIG9uZSBpcyBmb3VuZC4KKwkgKgl0bGFuX3Byb2JlIGhhcyBiZWVuIHBvcnRlZCB0byB0aGUgbmV3IG5ldCBBUEkgYW5kCisJICoJbm93IGFsbG9jYXRlcyBpdHMgb3duIGRldmljZSBzdHJ1Y3R1cmUuIFRoaXMgZnVuY3Rpb24KKwkgKglpcyBhbHNvIHVzZWQgYnkgbW9kdWxlcy4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBfX2RldmluaXQgVExhbl9wcm9iZTEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIAorCQkJCWxvbmcgaW9hZGRyLCBpbnQgaXJxLCBpbnQgcmV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50ICkKK3sKKworCXN0cnVjdCBuZXRfZGV2aWNlICAqZGV2OworCVRMYW5Qcml2YXRlSW5mbyAgICAqcHJpdjsKKwl1OAkJICAgcGNpX3JldjsKKwl1MTYJCSAgIGRldmljZV9pZDsKKwlpbnQJCSAgIHJlZywgcmMgPSAtRU5PREVWOworCisJaWYgKHBkZXYpIHsKKwkJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBUTGFuU2lnbmF0dXJlKTsKKwkJaWYgKHJjKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlRMQU46IENvdWxkIG5vdCByZXNlcnZlIElPIHJlZ2lvbnNcbiIpOworCQkJZ290byBlcnJfb3V0OworCQl9CisJfQorCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKFRMYW5Qcml2YXRlSW5mbykpOworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIlRMQU46IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRldmljZS5cbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9yZWdpb25zOworCX0KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKwkKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXByaXYtPnBjaURldiA9IHBkZXY7CisJCisJLyogSXMgdGhpcyBhIFBDSSBkZXZpY2U/ICovCisJaWYgKHBkZXYpIHsKKwkJdTMyIAkJICAgcGNpX2lvX2Jhc2UgPSAwOworCisJCXByaXYtPmFkYXB0ZXIgPSAmYm9hcmRfaW5mb1tlbnQtPmRyaXZlcl9kYXRhXTsKKworCQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhGRkZGRkZGRik7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJUTEFOOiBObyBzdWl0YWJsZSBQQ0kgbWFwcGluZyBhdmFpbGFibGUuXG4iKTsKKwkJCWdvdG8gZXJyX291dF9mcmVlX2RldjsKKwkJfQorCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlICggcGRldiwgUENJX1JFVklTSU9OX0lELCAmcGNpX3Jldik7CisKKwkJZm9yICggcmVnPSAwOyByZWcgPD0gNTsgcmVnICsrICkgeworCQkJaWYgKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCByZWcpICYgSU9SRVNPVVJDRV9JTykgeworCQkJCXBjaV9pb19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIHJlZyk7CisJCQkJVExBTl9EQkcoIFRMQU5fREVCVUdfR05STCwgIklPIG1hcHBpbmcgaXMgYXZhaWxhYmxlIGF0ICV4LlxuIiwKKwkJCQkJCXBjaV9pb19iYXNlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIXBjaV9pb19iYXNlKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlRMQU46IE5vIElPIG1hcHBpbmdzIGF2YWlsYWJsZVxuIik7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIGVycl9vdXRfZnJlZV9kZXY7CisJCX0KKwkJCisJCWRldi0+YmFzZV9hZGRyID0gcGNpX2lvX2Jhc2U7CisJCWRldi0+aXJxID0gcGRldi0+aXJxOworCQlwcml2LT5hZGFwdGVyUmV2ID0gcGNpX3JldjsgCisJCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCQlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCX0gZWxzZQl7ICAgICAvKiBFSVNBIGNhcmQgKi8KKwkJLyogVGhpcyBpcyBhIGhhY2suIFdlIG5lZWQgdG8ga25vdyB3aGljaCBib2FyZCBzdHJ1Y3R1cmUKKwkJICogaXMgc3VpdGVkIGZvciB0aGlzIGFkYXB0ZXIgKi8KKwkJZGV2aWNlX2lkID0gaW53KGlvYWRkciArIEVJU0FfSUQyKTsKKwkJcHJpdi0+aXNfZWlzYSA9IDE7CisJCWlmIChkZXZpY2VfaWQgPT0gMHgyMEYxKSB7CisJCQlwcml2LT5hZGFwdGVyID0gJmJvYXJkX2luZm9bMTNdOyAJLyogTmV0RmxleC0zL0UgKi8KKwkJCXByaXYtPmFkYXB0ZXJSZXYgPSAyMzsJCQkvKiBUTEFOIDIuMyAqLworCQl9IGVsc2UgeworCQkJcHJpdi0+YWRhcHRlciA9ICZib2FyZF9pbmZvWzE0XTsKKwkJCXByaXYtPmFkYXB0ZXJSZXYgPSAxMDsJCQkvKiBUTEFOIDEuMCAqLworCQl9CisJCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCQlkZXYtPmlycSA9IGlycTsKKwl9CisKKwkvKiBLZXJuZWwgcGFyYW1ldGVycyAqLworCWlmIChkZXYtPm1lbV9zdGFydCkgeworCQlwcml2LT5hdWkgICAgPSBkZXYtPm1lbV9zdGFydCAmIDB4MDE7CisJCXByaXYtPmR1cGxleCA9ICgoZGV2LT5tZW1fc3RhcnQgJiAweDA2KSA9PSAweDA2KSA/IDAgOiAoZGV2LT5tZW1fc3RhcnQgJiAweDA2KSA+PiAxOworCQlwcml2LT5zcGVlZCAgPSAoKGRldi0+bWVtX3N0YXJ0ICYgMHgxOCkgPT0gMHgxOCkgPyAwIDogKGRldi0+bWVtX3N0YXJ0ICYgMHgxOCkgPj4gMzsKKwkKKwkJaWYgKHByaXYtPnNwZWVkID09IDB4MSkgeworCQkJcHJpdi0+c3BlZWQgPSBUTEFOX1NQRUVEXzEwOworCQl9IGVsc2UgaWYgKHByaXYtPnNwZWVkID09IDB4MikgeworCQkJcHJpdi0+c3BlZWQgPSBUTEFOX1NQRUVEXzEwMDsKKwkJfQorCQlkZWJ1ZyA9IHByaXYtPmRlYnVnID0gZGV2LT5tZW1fZW5kOworCX0gZWxzZSB7CisJCXByaXYtPmF1aSAgICA9IGF1aVtib2FyZHNfZm91bmRdOworCQlwcml2LT5zcGVlZCAgPSBzcGVlZFtib2FyZHNfZm91bmRdOworCQlwcml2LT5kdXBsZXggPSBkdXBsZXhbYm9hcmRzX2ZvdW5kXTsKKwkJcHJpdi0+ZGVidWcgPSBkZWJ1ZzsKKwl9CisJCisJLyogVGhpcyB3aWxsIGJlIHVzZWQgd2hlbiB3ZSBnZXQgYW4gYWRhcHRlciBlcnJvciBmcm9tCisJICogd2l0aGluIG91ciBpcnEgaGFuZGxlciAqLworCUlOSVRfV09SSygmcHJpdi0+dGxhbl90cXVldWUsICh2b2lkICopKHZvaWQqKVRMYW5fdHhfdGltZW91dCwgZGV2KTsKKworCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKKwkKKwlyYyA9IFRMYW5fSW5pdChkZXYpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIlRMQU46IENvdWxkIG5vdCBzZXQgdXAgZGV2aWNlLlxuIik7CisJCWdvdG8gZXJyX291dF9mcmVlX2RldjsKKwl9CisKKwlyYyA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIlRMQU46IENvdWxkIG5vdCByZWdpc3RlciBkZXZpY2UuXG4iKTsKKwkJZ290byBlcnJfb3V0X3VuaW5pdDsKKwl9CisKKwkKKwlUTGFuRGV2aWNlc0luc3RhbGxlZCsrOworCWJvYXJkc19mb3VuZCsrOworCQorCS8qIHBkZXYgaXMgTlVMTCBpZiB0aGlzIGlzIGFuIEVJU0EgZGV2aWNlICovCisJaWYgKHBkZXYpCisJCXRsYW5faGF2ZV9wY2krKzsKKwllbHNlIHsKKwkJcHJpdi0+bmV4dERldmljZSA9IFRMYW5fRWlzYV9EZXZpY2VzOworCQlUTGFuX0Vpc2FfRGV2aWNlcyA9IGRldjsKKwkJdGxhbl9oYXZlX2Vpc2ErKzsKKwl9CisJCisJcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogJXMgaXJxPSUyZCwgaW89JTA0eCwgJXMsIFJldi4gJWRcbiIsCisJCQlkZXYtPm5hbWUsCisJCQkoaW50KSBkZXYtPmlycSwKKwkJCShpbnQpIGRldi0+YmFzZV9hZGRyLAorCQkJcHJpdi0+YWRhcHRlci0+ZGV2aWNlTGFiZWwsCisJCQlwcml2LT5hZGFwdGVyUmV2KTsKKwlyZXR1cm4gMDsKKworZXJyX291dF91bmluaXQ6CisJcGNpX2ZyZWVfY29uc2lzdGVudChwcml2LT5wY2lEZXYsIHByaXYtPmRtYVNpemUsIHByaXYtPmRtYVN0b3JhZ2UsCisJCQkgICAgcHJpdi0+ZG1hU3RvcmFnZURNQSApOworZXJyX291dF9mcmVlX2RldjoKKwlmcmVlX25ldGRldihkZXYpOworZXJyX291dF9yZWdpb25zOgorI2lmZGVmIENPTkZJR19QQ0kKKwlpZiAocGRldikKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKyNlbmRpZgorZXJyX291dDoKKwlpZiAocGRldikKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgdm9pZCBUTGFuX0Vpc2FfQ2xlYW51cCh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJVExhblByaXZhdGVJbmZvICpwcml2OworCQorCXdoaWxlKCB0bGFuX2hhdmVfZWlzYSApIHsKKwkJZGV2ID0gVExhbl9FaXNhX0RldmljZXM7CisJCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCQlpZiAocHJpdi0+ZG1hU3RvcmFnZSkgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwcml2LT5wY2lEZXYsIHByaXYtPmRtYVNpemUsIHByaXYtPmRtYVN0b3JhZ2UsIHByaXYtPmRtYVN0b3JhZ2VETUEgKTsKKwkJfQorCQlyZWxlYXNlX3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIDB4MTApOworCQl1bnJlZ2lzdGVyX25ldGRldiggZGV2ICk7CisJCVRMYW5fRWlzYV9EZXZpY2VzID0gcHJpdi0+bmV4dERldmljZTsKKwkJZnJlZV9uZXRkZXYoIGRldiApOworCQl0bGFuX2hhdmVfZWlzYS0tOworCX0KK30KKwkKKwkJCitzdGF0aWMgdm9pZCBfX2V4aXQgdGxhbl9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ0bGFuX2RyaXZlcik7CisKKwlpZiAodGxhbl9oYXZlX2Vpc2EpCisJCVRMYW5fRWlzYV9DbGVhbnVwKCk7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KE5VTEwsIFRMQU5fTUlOX0ZSQU1FX1NJWkUsIFRMYW5QYWRCdWZmZXIsIFRMYW5QYWRCdWZmZXJETUEpOworCit9CisKKworLyogTW9kdWxlIGxvYWRpbmcvdW5sb2FkaW5nICovCittb2R1bGVfaW5pdCh0bGFuX3Byb2JlKTsKK21vZHVsZV9leGl0KHRsYW5fZXhpdCk7CisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogCVRMYW5fRWlzYVByb2JlCisJICoKKwkgKiAgCVJldHVybnM6IDAgb24gc3VjY2VzcywgMSBvdGhlcndpc2UKKwkgKgorCSAqICAJUGFybXM6CSBOb25lCisJICoKKwkgKgorCSAqICAJVGhpcyBmdW5jdGlvbnMgcHJvYmVzIGZvciBFSVNBIGRldmljZXMgYW5kIGNhbGxzIAorCSAqICAJVExhbl9wcm9iZTEgd2hlbiBvbmUgaXMgZm91bmQuIAorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkICBfX2luaXQgVExhbl9FaXNhUHJvYmUgKHZvaWQpIAoreworCWxvbmcgCWlvYWRkcjsKKwlpbnQgCXJjID0gLUVOT0RFVjsKKwlpbnQgCWlycTsKKwl1MTYJZGV2aWNlX2lkOworCisJaWYgKCFFSVNBX2J1cykgewkKKwkJVExBTl9EQkcoVExBTl9ERUJVR19QUk9CRSwgIk5vIEVJU0EgYnVzIHByZXNlbnRcbiIpOworCQlyZXR1cm47CisJfQorCQorCS8qIExvb3AgdGhyb3VnaCBhbGwgc2xvdHMgb2YgdGhlIEVJU0EgYnVzICovCisJZm9yIChpb2FkZHIgPSAweDEwMDA7IGlvYWRkciA8IDB4OTAwMDsgaW9hZGRyICs9IDB4MTAwMCkgeworCQkKKwlUTEFOX0RCRyhUTEFOX0RFQlVHX1BST0JFLCJFSVNBX0lEIDB4JTR4OiAweCU0eFxuIiwgKGludCkgaW9hZGRyICsgMHhDODAsIGludyhpb2FkZHIgKyBFSVNBX0lEKSk7CQorCVRMQU5fREJHKFRMQU5fREVCVUdfUFJPQkUsIkVJU0FfSUQgMHglNHg6IDB4JTR4XG4iLCAoaW50KSBpb2FkZHIgKyAweEM4MiwgaW53KGlvYWRkciArIEVJU0FfSUQyKSk7CisKKworCQlUTEFOX0RCRyhUTEFOX0RFQlVHX1BST0JFLCAiUHJvYmluZyBmb3IgRUlTQSBhZGFwdGVyIGF0IElPOiAweCU0eCA6ICIsCisJCQkJICAgCShpbnQpIGlvYWRkcik7CisJCWlmIChyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIDB4MTAsIFRMYW5TaWduYXR1cmUpID09IE5VTEwpIAorCQkJZ290byBvdXQ7CisKKwkJaWYgKGludyhpb2FkZHIgKyBFSVNBX0lEKSAhPSAweDExMEUpIHsJCQorCQkJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCAweDEwKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCQorCQlkZXZpY2VfaWQgPSBpbncoaW9hZGRyICsgRUlTQV9JRDIpOworCQlpZiAoZGV2aWNlX2lkICE9ICAweDIwRjEgJiYgZGV2aWNlX2lkICE9IDB4NDBGMSkgeyAJCQorCQkJcmVsZWFzZV9yZWdpb24gKGlvYWRkciwgMHgxMCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQkKKwkgCWlmIChpbmIoaW9hZGRyICsgRUlTQV9DUikgIT0gMHgxKSB7IAkvKiBDaGVjayBpZiBhZGFwdGVyIGlzIGVuYWJsZWQgKi8KKwkJCXJlbGVhc2VfcmVnaW9uIChpb2FkZHIsIDB4MTApOworCQkJZ290byBvdXQyOworCQl9CisJCQorCQlpZiAoZGVidWcgPT0gMHgxMCkJCQorCQkJcHJpbnRrKCJGb3VuZCBvbmVcbiIpOworCisKKwkJLyogR2V0IGlycSBmcm9tIGJvYXJkICovCisJCXN3aXRjaCAoaW5iKGlvYWRkciArIDB4Q0MwKSkgeworCQkJY2FzZSgweDEwKToKKwkJCQlpcnE9NTsKKwkJCQlicmVhazsKKwkJCWNhc2UoMHgyMCk6CisJCQkJaXJxPTk7CisJCQkJYnJlYWs7CisJCQljYXNlKDB4NDApOgorCQkJCWlycT0xMDsKKwkJCQlicmVhazsKKwkJCWNhc2UoMHg4MCk6CisJCQkJaXJxPTExOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIG91dDsKKwkJfSAgICAgICAgICAgICAgIAorCQkKKwkJCisJCS8qIFNldHVwIHRoZSBuZXdseSBmb3VuZCBlaXNhIGFkYXB0ZXIgKi8KKwkJcmMgPSBUTGFuX3Byb2JlMSggTlVMTCwgaW9hZGRyLCBpcnEsCisJCQkJCTEyLCBOVUxMKTsKKwkJY29udGludWU7CisJCQorCQlvdXQ6CisJCQlpZiAoZGVidWcgPT0gMHgxMCkKKwkJCQlwcmludGsoIk5vbmUgZm91bmRcbiIpOworCQkJY29udGludWU7CisKKwkJb3V0MjoJaWYgKGRlYnVnID09IDB4MTApCisJCQkJcHJpbnRrKCJDYXJkIGZvdW5kIGJ1dCBpdCBpcyBub3QgZW5hYmxlZCwgc2tpcHBpbmdcbiIpOworCQkJY29udGludWU7CisJCQorCX0KKworfSAvKiBUTGFuX0Vpc2FQcm9iZSAqLworCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIFRMYW5fUG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlUTGFuX0hhbmRsZUludGVycnVwdChkZXYtPmlycSwgZGV2LCBOVUxMKTsKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKK30KKyNlbmRpZgorCisJCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX0luaXQKKwkgKgorCSAqCVJldHVybnM6CisJICoJCTAgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2UuCisJICoJUGFybXM6CisJICoJCWRldglUaGUgc3RydWN0dXJlIG9mIHRoZSBkZXZpY2UgdG8gYmUKKwkgKgkJCWluaXQnZWQuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIGNvbXBsZXRlcyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlCisJICoJZGV2aWNlIHN0cnVjdHVyZSBhbmQgZHJpdmVyLiAgSXQgcmVzZXJ2ZXMgdGhlIElPCisJICoJYWRkcmVzc2VzLCBhbGxvY2F0ZXMgbWVtb3J5IGZvciB0aGUgbGlzdHMgYW5kIGJvdW5jZQorCSAqCWJ1ZmZlcnMsIHJldHJpZXZlcyB0aGUgTUFDIGFkZHJlc3MgZnJvbSB0aGUgZWVwcm9tCisJICoJYW5kIGFzc2lnbmVzIHRoZSBkZXZpY2UncyBtZXRob2RzLgorCSAqCQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBUTGFuX0luaXQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCWludAkJZG1hX3NpemU7CisJaW50IAkJZXJyOworCWludAkJaTsKKwlUTGFuUHJpdmF0ZUluZm8JKnByaXY7CisKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwlpZiAoIGJidWYgKSB7CisJCWRtYV9zaXplID0gKCBUTEFOX05VTV9SWF9MSVNUUyArIFRMQU5fTlVNX1RYX0xJU1RTICkKKwkgICAgICAgICAgICogKCBzaXplb2YoVExhbkxpc3QpICsgVExBTl9NQVhfRlJBTUVfU0laRSApOworCX0gZWxzZSB7CisJCWRtYV9zaXplID0gKCBUTEFOX05VTV9SWF9MSVNUUyArIFRMQU5fTlVNX1RYX0xJU1RTICkKKwkgICAgICAgICAgICogKCBzaXplb2YoVExhbkxpc3QpICk7CisJfQorCXByaXYtPmRtYVN0b3JhZ2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwcml2LT5wY2lEZXYsIGRtYV9zaXplLCAmcHJpdi0+ZG1hU3RvcmFnZURNQSk7CisJcHJpdi0+ZG1hU2l6ZSA9IGRtYV9zaXplOworCQorCWlmICggcHJpdi0+ZG1hU3RvcmFnZSA9PSBOVUxMICkgeworCQlwcmludGsoS0VSTl9FUlIgIlRMQU46ICBDb3VsZCBub3QgYWxsb2NhdGUgbGlzdHMgYW5kIGJ1ZmZlcnMgZm9yICVzLlxuIiwKKwkJCWRldi0+bmFtZSApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KCBwcml2LT5kbWFTdG9yYWdlLCAwLCBkbWFfc2l6ZSApOworCXByaXYtPnJ4TGlzdCA9IChUTGFuTGlzdCAqKSAKKwkJICAgICAgICggKCAoICh1MzIpIHByaXYtPmRtYVN0b3JhZ2UgKSArIDcgKSAmIDB4RkZGRkZGRjggKTsKKwlwcml2LT5yeExpc3RETUEgPSAoICggKCAodTMyKSBwcml2LT5kbWFTdG9yYWdlRE1BICkgKyA3ICkgJiAweEZGRkZGRkY4ICk7CisJcHJpdi0+dHhMaXN0ID0gcHJpdi0+cnhMaXN0ICsgVExBTl9OVU1fUlhfTElTVFM7CisJcHJpdi0+dHhMaXN0RE1BID0gcHJpdi0+cnhMaXN0RE1BICsgc2l6ZW9mKFRMYW5MaXN0KSAqIFRMQU5fTlVNX1JYX0xJU1RTOworCWlmICggYmJ1ZiApIHsKKwkJcHJpdi0+cnhCdWZmZXIgPSAodTggKikgKCBwcml2LT50eExpc3QgKyBUTEFOX05VTV9UWF9MSVNUUyApOworCQlwcml2LT5yeEJ1ZmZlckRNQSA9cHJpdi0+dHhMaXN0RE1BICsgc2l6ZW9mKFRMYW5MaXN0KSAqIFRMQU5fTlVNX1RYX0xJU1RTOworCQlwcml2LT50eEJ1ZmZlciA9IHByaXYtPnJ4QnVmZmVyICsgKCBUTEFOX05VTV9SWF9MSVNUUyAqIFRMQU5fTUFYX0ZSQU1FX1NJWkUgKTsKKwkJcHJpdi0+dHhCdWZmZXJETUEgPSBwcml2LT5yeEJ1ZmZlckRNQSArICggVExBTl9OVU1fUlhfTElTVFMgKiBUTEFOX01BWF9GUkFNRV9TSVpFICk7CisJfQorCisJZXJyID0gMDsKKwlmb3IgKCBpID0gMDsgIGkgPCA2IDsgaSsrICkKKwkJZXJyIHw9IFRMYW5fRWVSZWFkQnl0ZSggZGV2LAorCQkJCQkodTgpIHByaXYtPmFkYXB0ZXItPmFkZHJPZnMgKyBpLAorCQkJCQkodTggKikgJmRldi0+ZGV2X2FkZHJbaV0gKTsKKwlpZiAoIGVyciApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJUTEFOOiAlczogRXJyb3IgcmVhZGluZyBNQUMgZnJvbSBlZXByb206ICVkXG4iLAorCQkJZGV2LT5uYW1lLAorCQkJZXJyICk7CisJfQorCWRldi0+YWRkcl9sZW4gPSA2OworCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworCS8qIERldmljZSBtZXRob2RzICovCisJZGV2LT5vcGVuID0gJlRMYW5fT3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZUTGFuX1N0YXJ0VHg7CisJZGV2LT5zdG9wID0gJlRMYW5fQ2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSAmVExhbl9HZXRTdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZUTGFuX1NldE11bHRpY2FzdExpc3Q7CisJZGV2LT5kb19pb2N0bCA9ICZUTGFuX2lvY3RsOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSAmVExhbl9Qb2xsOworI2VuZGlmCisJZGV2LT50eF90aW1lb3V0ID0gJlRMYW5fdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKworCXJldHVybiAwOworCit9IC8qIFRMYW5fSW5pdCAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fT3BlbgorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJMCBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKwkgKglQYXJtczoKKwkgKgkJZGV2CVN0cnVjdHVyZSBvZiBkZXZpY2UgdG8gYmUgb3BlbmVkLgorCSAqCisJICoJVGhpcyByb3V0aW5lIHB1dHMgdGhlIGRyaXZlciBhbmQgVExBTiBhZGFwdGVyIGluIGEKKwkgKglzdGF0ZSB3aGVyZSBpdCBpcyByZWFkeSB0byBzZW5kIGFuZCByZWNlaXZlIHBhY2tldHMuCisJICoJSXQgYWxsb2NhdGVzIHRoZSBJUlEsIHJlc2V0cyBhbmQgYnJpbmdzIHRoZSBhZGFwdGVyCisJICoJb3V0IG9mIHJlc2V0LCBhbmQgYWxsb3dzIGludGVycnVwdHMuICBJdCBhbHNvIGRlbGF5cworCSAqCXRoZSBzdGFydHVwIGZvciBhdXRvbmVnb3RpYXRpb24gb3Igc2VuZHMgYSBSeCBHTworCSAqCWNvbW1hbmQgdG8gdGhlIGFkYXB0ZXIsIGFzIGFwcHJvcHJpYXRlLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IFRMYW5fT3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQJCWVycjsKKwkKKwlwcml2LT50bGFuUmV2ID0gVExhbl9EaW9SZWFkOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fREVGX1JFVklTSU9OICk7CisJZXJyID0gcmVxdWVzdF9pcnEoIGRldi0+aXJxLCBUTGFuX0hhbmRsZUludGVycnVwdCwgU0FfU0hJUlEsIFRMYW5TaWduYXR1cmUsIGRldiApOworCQorCWlmICggZXJyICkgeworCQlwcmludGsoS0VSTl9FUlIgIlRMQU46ICBDYW5ub3Qgb3BlbiAlcyBiZWNhdXNlIElSUSAlZCBpcyBhbHJlYWR5IGluIHVzZS5cbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEgKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJCisJaW5pdF90aW1lcigmcHJpdi0+dGltZXIpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCisJLyogTk9URTogSXQgbWlnaHQgbm90IGJlIG5lY2Vzc2FyeSB0byByZWFkIHRoZSBzdGF0cyBiZWZvcmUgYQorCQkJIHJlc2V0IGlmIHlvdSBkb24ndCBjYXJlIHdoYXQgdGhlIHZhbHVlcyBhcmUuCisJKi8KKwlUTGFuX1Jlc2V0TGlzdHMoIGRldiApOworCVRMYW5fUmVhZEFuZENsZWFyU3RhdHMoIGRldiwgVExBTl9JR05PUkUgKTsKKwlUTGFuX1Jlc2V0QWRhcHRlciggZGV2ICk7CisKKwlUTEFOX0RCRyggVExBTl9ERUJVR19HTlJMLCAiJXM6IE9wZW5lZC4gIFRMQU4gQ2hpcCBSZXY6ICV4XG4iLCBkZXYtPm5hbWUsIHByaXYtPnRsYW5SZXYgKTsKKworCXJldHVybiAwOworCit9IC8qIFRMYW5fT3BlbiAqLworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5faW9jdGwKKwkgKgkKKwkgKglSZXR1cm5zOgorCSAqCQkwIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisJICoJUGFyYW1zOgorCSAqCQlkZXYJc3RydWN0dXJlIG9mIGRldmljZSB0byByZWNlaXZlIGlvY3RsLgorCSAqCQkKKwkgKgkJcnEJaWZyZXEgc3RydWN0dXJlIHRvIGhvbGQgdXNlcnNwYWNlIGRhdGEuCisJICoKKwkgKgkJY21kCWlvY3RsIGNvbW1hbmQuCisJICoKKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IFRMYW5faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlUTGFuUHJpdmF0ZUluZm8gKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShycSk7CisJdTMyIHBoeSAgID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07CisJCisJaWYgKCFwcml2LT5waHlPbmxpbmUpCisJCXJldHVybiAtRUFHQUlOOworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgU0lPQ0dNSUlQSFk6CQkvKiBHZXQgYWRkcmVzcyBvZiBNSUkgUEhZIGluIHVzZS4gKi8KKwkJCWRhdGEtPnBoeV9pZCA9IHBoeTsKKworCisJY2FzZSBTSU9DR01JSVJFRzoJCS8qIFJlYWQgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwkJCVRMYW5fTWlpUmVhZFJlZyhkZXYsIGRhdGEtPnBoeV9pZCAmIDB4MWYsIGRhdGEtPnJlZ19udW0gJiAweDFmLCAmZGF0YS0+dmFsX291dCk7CisJCQlyZXR1cm4gMDsKKwkJCisKKwljYXNlIFNJT0NTTUlJUkVHOgkJLyogV3JpdGUgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwkJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJVExhbl9NaWlXcml0ZVJlZyhkZXYsIGRhdGEtPnBoeV9pZCAmIDB4MWYsIGRhdGEtPnJlZ19udW0gJiAweDFmLCBkYXRhLT52YWxfaW4pOworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfSAvKiB0bGFuX2lvY3RsICovCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiAJVExhbl90eF90aW1lb3V0CisJICoKKwkgKiAJUmV0dXJuczogbm90aGluZworCSAqCisJICogCVBhcmFtczoKKwkgKiAJCWRldglzdHJ1Y3R1cmUgb2YgZGV2aWNlIHdoaWNoIHRpbWVkIG91dCAKKwkgKiAJCQlkdXJpbmcgdHJhbnNtaXQuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIFRMYW5fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCQorCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogVHJhbnNtaXQgdGltZWQgb3V0LlxuIiwgZGV2LT5uYW1lKTsKKwkKKwkvKiBPayBzbyB3ZSB0aW1lZCBvdXQsIGxldHMgc2VlIHdoYXQgd2UgY2FuIGRvIGFib3V0IGl0Li4uKi8KKwlUTGFuX0ZyZWVMaXN0cyggZGV2ICk7CisJVExhbl9SZXNldExpc3RzKCBkZXYgKTsJCQorCVRMYW5fUmVhZEFuZENsZWFyU3RhdHMoIGRldiwgVExBTl9JR05PUkUgKTsKKwlUTGFuX1Jlc2V0QWRhcHRlciggZGV2ICk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZSggZGV2ICk7CQorCit9CisJCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX1N0YXJ0VHgKKwkgKiAgCisJICoJUmV0dXJuczoKKwkgKgkJMCBvbiBzdWNjZXNzLCBub24temVybyBvbiBmYWlsdXJlLgorCSAqCVBhcm1zOgorCSAqCQlza2IJQSBwb2ludGVyIHRvIHRoZSBza19idWZmIGNvbnRhaW5pbmcgdGhlCisJICoJCQlmcmFtZSB0byBiZSBzZW50LgorCSAqCQlkZXYJVGhlIGRldmljZSB0byBzZW5kIHRoZSBkYXRhIG9uLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBhZGRzIGEgZnJhbWUgdG8gdGhlIFR4IGxpc3QgdG8gYmUgc2VudAorCSAqCUFTQVAuICBGaXJzdCBpdAl2ZXJpZmllcyB0aGF0IHRoZSBhZGFwdGVyIGlzIHJlYWR5IGFuZAorCSAqCXRoZXJlIGlzIHJvb20gaW4gdGhlIHF1ZXVlLiAgVGhlbiBpdCBzZXRzIHVwIHRoZSBuZXh0CisJICoJYXZhaWxhYmxlIGxpc3QsIGNvcGllcyB0aGUgZnJhbWUgdG8gdGhlCWNvcnJlc3BvbmRpbmcKKwkgKglidWZmZXIuICBJZiB0aGUgYWRhcHRlciBUeCBjaGFubmVsIGlzIGlkbGUsIGl0IGdpdmVzCisJICoJdGhlIGFkYXB0ZXIgYSBUeCBHbyBjb21tYW5kIG9uIHRoZSBsaXN0LCBvdGhlcndpc2UgaXQKKwkgKglzZXRzIHRoZSBmb3J3YXJkIGFkZHJlc3Mgb2YgdGhlIHByZXZpb3VzIGxpc3QgdG8gcG9pbnQKKwkgKgl0byB0aGlzIG9uZS4gIFRoZW4gaXQgZnJlZXMgdGhlIHNrX2J1ZmYuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgVExhbl9TdGFydFR4KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8gKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCVRMYW5MaXN0CSp0YWlsX2xpc3Q7CisJZG1hX2FkZHJfdAl0YWlsX2xpc3RfcGh5czsKKwl1OAkJKnRhaWxfYnVmZmVyOworCWludAkJcGFkOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpZiAoICEgcHJpdi0+cGh5T25saW5lICkgeworCQlUTEFOX0RCRyggVExBTl9ERUJVR19UWCwgIlRSQU5TTUlUOiAgJXMgUEhZIGlzIG5vdCByZWFkeVxuIiwgZGV2LT5uYW1lICk7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiAwOworCX0KKworCXRhaWxfbGlzdCA9IHByaXYtPnR4TGlzdCArIHByaXYtPnR4VGFpbDsKKwl0YWlsX2xpc3RfcGh5cyA9IHByaXYtPnR4TGlzdERNQSArIHNpemVvZihUTGFuTGlzdCkgKiBwcml2LT50eFRhaWw7CisJCisJaWYgKCB0YWlsX2xpc3QtPmNTdGF0ICE9IFRMQU5fQ1NUQVRfVU5VU0VEICkgeworCQlUTEFOX0RCRyggVExBTl9ERUJVR19UWCwgIlRSQU5TTUlUOiAgJXMgaXMgYnVzeSAoSGVhZD0lZCBUYWlsPSVkKVxuIiwgZGV2LT5uYW1lLCBwcml2LT50eEhlYWQsIHByaXYtPnR4VGFpbCApOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXByaXYtPnR4QnVzeUNvdW50Kys7CisJCXJldHVybiAxOworCX0KKworCXRhaWxfbGlzdC0+Zm9yd2FyZCA9IDA7CisKKwlpZiAoIGJidWYgKSB7CisJCXRhaWxfYnVmZmVyID0gcHJpdi0+dHhCdWZmZXIgKyAoIHByaXYtPnR4VGFpbCAqIFRMQU5fTUFYX0ZSQU1FX1NJWkUgKTsKKwkJbWVtY3B5KCB0YWlsX2J1ZmZlciwgc2tiLT5kYXRhLCBza2ItPmxlbiApOworCX0gZWxzZSB7CisJCXRhaWxfbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wY2lEZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlUTGFuX1N0b3JlU0tCKHRhaWxfbGlzdCwgc2tiKTsKKwl9CisKKwlwYWQgPSBUTEFOX01JTl9GUkFNRV9TSVpFIC0gc2tiLT5sZW47CisKKwlpZiAoIHBhZCA+IDAgKSB7CisJCXRhaWxfbGlzdC0+ZnJhbWVTaXplID0gKHUxNikgc2tiLT5sZW4gKyBwYWQ7CisJCXRhaWxfbGlzdC0+YnVmZmVyWzBdLmNvdW50ID0gKHUzMikgc2tiLT5sZW47CisJCXRhaWxfbGlzdC0+YnVmZmVyWzFdLmNvdW50ID0gVExBTl9MQVNUX0JVRkZFUiB8ICh1MzIpIHBhZDsKKwkJdGFpbF9saXN0LT5idWZmZXJbMV0uYWRkcmVzcyA9IFRMYW5QYWRCdWZmZXJETUE7CisJfSBlbHNlIHsKKwkJdGFpbF9saXN0LT5mcmFtZVNpemUgPSAodTE2KSBza2ItPmxlbjsKKwkJdGFpbF9saXN0LT5idWZmZXJbMF0uY291bnQgPSBUTEFOX0xBU1RfQlVGRkVSIHwgKHUzMikgc2tiLT5sZW47CisJCXRhaWxfbGlzdC0+YnVmZmVyWzFdLmNvdW50ID0gMDsKKwkJdGFpbF9saXN0LT5idWZmZXJbMV0uYWRkcmVzcyA9IDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwl0YWlsX2xpc3QtPmNTdGF0ID0gVExBTl9DU1RBVF9SRUFEWTsKKwlpZiAoICEgcHJpdi0+dHhJblByb2dyZXNzICkgeworCQlwcml2LT50eEluUHJvZ3Jlc3MgPSAxOworCQlUTEFOX0RCRyggVExBTl9ERUJVR19UWCwgIlRSQU5TTUlUOiAgU3RhcnRpbmcgVFggb24gYnVmZmVyICVkXG4iLCBwcml2LT50eFRhaWwgKTsKKwkJb3V0bCggdGFpbF9saXN0X3BoeXMsIGRldi0+YmFzZV9hZGRyICsgVExBTl9DSF9QQVJNICk7CisJCW91dGwoIFRMQU5fSENfR08sIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCApOworCX0gZWxzZSB7CisJCVRMQU5fREJHKCBUTEFOX0RFQlVHX1RYLCAiVFJBTlNNSVQ6ICBBZGRpbmcgYnVmZmVyICVkIHRvIFRYIGNoYW5uZWxcbiIsIHByaXYtPnR4VGFpbCApOworCQlpZiAoIHByaXYtPnR4VGFpbCA9PSAwICkgeworCQkJKCBwcml2LT50eExpc3QgKyAoIFRMQU5fTlVNX1RYX0xJU1RTIC0gMSApICktPmZvcndhcmQgPSB0YWlsX2xpc3RfcGh5czsKKwkJfSBlbHNlIHsKKwkJCSggcHJpdi0+dHhMaXN0ICsgKCBwcml2LT50eFRhaWwgLSAxICkgKS0+Zm9yd2FyZCA9IHRhaWxfbGlzdF9waHlzOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCUNJUkNfSU5DKCBwcml2LT50eFRhaWwsIFRMQU5fTlVNX1RYX0xJU1RTICk7CisKKwlpZiAoIGJidWYgKQorCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlyZXR1cm4gMDsKKworfSAvKiBUTGFuX1N0YXJ0VHggKi8KKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX0hhbmRsZUludGVycnVwdAorCSAqICAKKwkgKglSZXR1cm5zOgkKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlpcnEJVGhlIGxpbmUgb24gd2hpY2ggdGhlIGludGVycnVwdAorCSAqCQkJb2NjdXJyZWQuCisJICoJCWRldl9pZAlBIHBvaW50ZXIgdG8gdGhlIGRldmljZSBhc3NpZ25lZCB0bworCSAqCQkJdGhpcyBpcnEgbGluZS4KKwkgKgkJcmVncwk/Pz8KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhbiBpbnRlcnJ1cHQgZ2VuZXJhdGVkIGJ5IGl0cworCSAqCWFzc2lnbmVkIFRMQU4gYWRhcHRlci4gIFRoZSBmdW5jdGlvbiBkZWFjdGl2YXRlcworCSAqCWludGVycnVwdHMgb24gaXRzIGFkYXB0ZXIsIHJlY29yZHMgdGhlIHR5cGUgb2YKKwkgKglpbnRlcnJ1cHQsIGV4ZWN1dGVzIHRoZSBhcHByb3ByaWF0ZSBzdWJoYW5kbGVyLCBhbmQKKwkgKglhY2tub3dkZ2VzIHRoZSBpbnRlcnJ1cHQgdG8gdGhlIGFkYXB0ZXIgKHRodXMKKwkgKglyZS1lbmFibGluZyBhZGFwdGVyIGludGVycnVwdHMuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBUTGFuX0hhbmRsZUludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXUzMgkJYWNrOworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CisJdTMyCQlob3N0X2NtZDsKKwl1MTYJCWhvc3RfaW50OworCWludAkJdHlwZTsKKwlUTGFuUHJpdmF0ZUluZm8gKnByaXY7CisKKwlkZXYgPSBkZXZfaWQ7CisJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2soJnByaXYtPmxvY2spOworCisJaG9zdF9pbnQgPSBpbncoIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0lOVCApOworCW91dHcoIGhvc3RfaW50LCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9JTlQgKTsKKworCXR5cGUgPSAoIGhvc3RfaW50ICYgVExBTl9ISV9JVF9NQVNLICkgPj4gMjsKKworCWFjayA9IFRMYW5JbnRWZWN0b3JbdHlwZV0oIGRldiwgaG9zdF9pbnQgKTsKKworCWlmICggYWNrICkgeworCQlob3N0X2NtZCA9IFRMQU5fSENfQUNLIHwgYWNrIHwgKCB0eXBlIDw8IDE4ICk7CisJCW91dGwoIGhvc3RfY21kLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQgKTsKKwl9CisKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9IC8qIFRMYW5fSGFuZGxlSW50ZXJydXB0cyAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fQ2xvc2UKKwkgKiAgCisJICogCVJldHVybnM6CisJICoJCUFuIGVycm9yIGNvZGUuCisJICoJUGFybXM6CisJICoJCWRldglUaGUgZGV2aWNlIHN0cnVjdHVyZSBvZiB0aGUgZGV2aWNlIHRvCisJICoJCQljbG9zZS4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gc2h1dHMgZG93biB0aGUgYWRhcHRlci4gIEl0IHJlY29yZHMgYW55CisJICoJc3RhdHMsIHB1dHMgdGhlIGFkYXB0ZXIgaW50byByZXNldCBzdGF0ZSwgZGVhY3RpdmF0ZXMKKwkgKglpdHMgdGltZSBhcyBuZWVkZWQsIGFuZAlmcmVlcyB0aGUgaXJxIGl0IGlzIHVzaW5nLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IFRMYW5fQ2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlUTGFuUHJpdmF0ZUluZm8gKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXByaXYtPm5lZ19iZV92ZXJib3NlID0gMDsKKworCVRMYW5fUmVhZEFuZENsZWFyU3RhdHMoIGRldiwgVExBTl9SRUNPUkQgKTsKKwlvdXRsKCBUTEFOX0hDX0FEX1JTVCwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EICk7CisJaWYgKCBwcml2LT50aW1lci5mdW5jdGlvbiAhPSBOVUxMICkgeworCQlkZWxfdGltZXJfc3luYyggJnByaXYtPnRpbWVyICk7CisJCXByaXYtPnRpbWVyLmZ1bmN0aW9uID0gTlVMTDsKKwl9CisJCisJZnJlZV9pcnEoIGRldi0+aXJxLCBkZXYgKTsKKwlUTGFuX0ZyZWVMaXN0cyggZGV2ICk7CisJVExBTl9EQkcoIFRMQU5fREVCVUdfR05STCwgIkRldmljZSAlcyBjbG9zZWQuXG4iLCBkZXYtPm5hbWUgKTsKKworCXJldHVybiAwOworCit9IC8qIFRMYW5fQ2xvc2UgKi8KKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX0dldFN0YXRzCisJICogIAorCSAqCVJldHVybnM6CisJICoJCUEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3Mgc3RhdGlzdGljcyBzdHJ1Y3R1cmUuCisJICoJUGFybXM6CisJICoJCWRldglUaGUgZGV2aWNlIHN0cnVjdHVyZSB0byByZXR1cm4gdGhlCisJICoJCQlzdGF0cyBmb3IuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIGRldmljZXMgc3RhdGlzdGljcyBieSByZWFkaW5nCisJICoJdGhlIFRMQU4gY2hpcCdzIG9uYm9hcmQgcmVnaXN0ZXJzLiAgVGhlbiBpdCByZXR1cm5zIHRoZQorCSAqCWFkZHJlc3Mgb2YgdGhlIHN0YXRpc3RpY3Mgc3RydWN0dXJlLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKlRMYW5fR2V0U3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwkvKiBTaG91bGQgb25seSByZWFkIHN0YXRzIGlmIG9wZW4gPyAqLworCVRMYW5fUmVhZEFuZENsZWFyU3RhdHMoIGRldiwgVExBTl9SRUNPUkQgKTsKKworCVRMQU5fREJHKCBUTEFOX0RFQlVHX1JYLCAiUkVDRUlWRTogICVzIEVPQyBjb3VudCA9ICVkXG4iLCBkZXYtPm5hbWUsIHByaXYtPnJ4RW9jQ291bnQgKTsKKwlUTEFOX0RCRyggVExBTl9ERUJVR19UWCwgIlRSQU5TTUlUOiAgJXMgQnVzeSBjb3VudCA9ICVkXG4iLCBkZXYtPm5hbWUsIHByaXYtPnR4QnVzeUNvdW50ICk7CisJaWYgKCBkZWJ1ZyAmIFRMQU5fREVCVUdfR05STCApIHsKKwkJVExhbl9QcmludERpbyggZGV2LT5iYXNlX2FkZHIgKTsKKwkJVExhbl9QaHlQcmludCggZGV2ICk7CQkKKwl9CisJaWYgKCBkZWJ1ZyAmIFRMQU5fREVCVUdfTElTVCApIHsKKwkJZm9yICggaSA9IDA7IGkgPCBUTEFOX05VTV9SWF9MSVNUUzsgaSsrICkKKwkJCVRMYW5fUHJpbnRMaXN0KCBwcml2LT5yeExpc3QgKyBpLCAiUlgiLCBpICk7CisJCWZvciAoIGkgPSAwOyBpIDwgVExBTl9OVU1fVFhfTElTVFM7IGkrKyApCisJCQlUTGFuX1ByaW50TGlzdCggcHJpdi0+dHhMaXN0ICsgaSwgIlRYIiwgaSApOworCX0KKwkKKwlyZXR1cm4gKCAmKCAoVExhblByaXZhdGVJbmZvICopIG5ldGRldl9wcml2KGRldikgKS0+c3RhdHMgKTsKKworfSAvKiBUTGFuX0dldFN0YXRzICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9TZXRNdWx0aWNhc3RMaXN0CisJICogIAorCSAqCVJldHVybnM6CisJICoJCU5vdGhpbmcKKwkgKglQYXJtczoKKwkgKgkJZGV2CVRoZSBkZXZpY2Ugc3RydWN0dXJlIHRvIHNldCB0aGUKKwkgKgkJCW11bHRpY2FzdCBsaXN0IGZvci4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgVExBTiBhZGFwdG9yIHRvIHZhcmlvdXMgcmVjZWl2ZQorCSAqCW1vZGVzLiAgSWYgdGhlIElGRl9QUk9NSVNDIGZsYWcgaXMgc2V0LCBwcm9taXNjdW91cworCSAqCW1vZGUgaXMgYWNpdHZpYXRlZC4gIE90aGVyd2lzZSwJcHJvbWlzY3VvdXMgbW9kZSBpcworCSAqCXR1cm5lZCBvZmYuICBJZiB0aGUgSUZGX0FMTE1VTFRJIGZsYWcgaXMgc2V0LCB0aGVuCisJICoJdGhlIGhhc2ggdGFibGUgaXMgc2V0IHRvIHJlY2VpdmUgYWxsIGdyb3VwIGFkZHJlc3Nlcy4KKwkgKglPdGhlcndpc2UsIHRoZSBmaXJzdCB0aHJlZSBtdWx0aWNhc3QgYWRkcmVzc2VzIGFyZQorCSAqCXN0b3JlZCBpbiBBUkVHXzEtMywgYW5kIHRoZSByZXN0IGFyZSBzZWxlY3RlZCB2aWEgdGhlCisJICoJaGFzaCB0YWJsZSwgYXMgbmVjZXNzYXJ5LgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBUTGFuX1NldE11bHRpY2FzdExpc3QoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQorewkKKwlzdHJ1Y3QgZGV2X21jX2xpc3QJKmRtaSA9IGRldi0+bWNfbGlzdDsKKwl1MzIJCQloYXNoMSA9IDA7CisJdTMyCQkJaGFzaDIgPSAwOworCWludAkJCWk7CisJdTMyCQkJb2Zmc2V0OworCXU4CQkJdG1wOworCisJaWYgKCBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MgKSB7CisJCXRtcCA9IFRMYW5fRGlvUmVhZDgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9DTUQgKTsKKwkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9DTUQsIHRtcCB8IFRMQU5fTkVUX0NNRF9DQUYgKTsKKwl9IGVsc2UgeworCQl0bXAgPSBUTGFuX0Rpb1JlYWQ4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfQ01EICk7CisJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfQ01ELCB0bXAgJiB+VExBTl9ORVRfQ01EX0NBRiApOworCQlpZiAoIGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgKSB7CisJCQlmb3IgKCBpID0gMDsgaSA8IDM7IGkrKyApIAorCQkJCVRMYW5fU2V0TWFjKCBkZXYsIGkgKyAxLCBOVUxMICk7CisJCQlUTGFuX0Rpb1dyaXRlMzIoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0hBU0hfMSwgMHhGRkZGRkZGRiApOworCQkJVExhbl9EaW9Xcml0ZTMyKCBkZXYtPmJhc2VfYWRkciwgVExBTl9IQVNIXzIsIDB4RkZGRkZGRkYgKTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoIGkgPSAwOyBpIDwgZGV2LT5tY19jb3VudDsgaSsrICkgeworCQkJCWlmICggaSA8IDMgKSB7CisJCQkJCVRMYW5fU2V0TWFjKCBkZXYsIGkgKyAxLCAoY2hhciAqKSAmZG1pLT5kbWlfYWRkciApOworCQkJCX0gZWxzZSB7CisJCQkJCW9mZnNldCA9IFRMYW5fSGFzaEZ1bmMoICh1OCAqKSAmZG1pLT5kbWlfYWRkciApOworCQkJCQlpZiAoIG9mZnNldCA8IDMyICkgCisJCQkJCQloYXNoMSB8PSAoIDEgPDwgb2Zmc2V0ICk7CisJCQkJCWVsc2UKKwkJCQkJCWhhc2gyIHw9ICggMSA8PCAoIG9mZnNldCAtIDMyICkgKTsKKwkJCQl9CisJCQkJZG1pID0gZG1pLT5uZXh0OworCQkJfQorCQkJZm9yICggOyBpIDwgMzsgaSsrICkgCisJCQkJVExhbl9TZXRNYWMoIGRldiwgaSArIDEsIE5VTEwgKTsKKwkJCVRMYW5fRGlvV3JpdGUzMiggZGV2LT5iYXNlX2FkZHIsIFRMQU5fSEFTSF8xLCBoYXNoMSApOworCQkJVExhbl9EaW9Xcml0ZTMyKCBkZXYtPmJhc2VfYWRkciwgVExBTl9IQVNIXzIsIGhhc2gyICk7CisJCX0KKwl9CisKK30gLyogVExhbl9TZXRNdWx0aWNhc3RMaXN0ICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgIFRodW5kZXJMQU4gRHJpdmVyIEludGVycnVwdCBWZWN0b3JzIGFuZCBUYWJsZQorCisJUGxlYXNlIHNlZSBDaGFwLiA0LCAiSW50ZXJydXB0IEhhbmRsaW5nIiBvZiB0aGUgIlRodW5kZXJMQU4KKwlQcm9ncmFtbWVyJ3MgR3VpZGUiIGZvciBtb3JlIGluZm9ybWF0aW9ucyBvbiBoYW5kbGluZyBpbnRlcnJ1cHRzCisJZ2VuZXJhdGVkIGJ5IFRMQU4gYmFzZWQgYWRhcHRlcnMuICAKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fSGFuZGxlSW52YWxpZAorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJMAorCSAqCVBhcm1zOgorCSAqCQlkZXYJCURldmljZSBhc3NpZ25lZCB0aGUgSVJRIHRoYXQgd2FzCisJICoJCQkJcmFpc2VkLgorCSAqCQlob3N0X2ludAlUaGUgY29udGVudHMgb2YgdGhlIEhPU1RfSU5UCisJICoJCQkJcG9ydC4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyBpbnZhbGlkIGludGVycnVwdHMuICBUaGlzIHNob3VsZAorCSAqCW5ldmVyIGhhcHBlbiB1bmxlc3Mgc29tZSBvdGhlciBhZGFwdGVyIGlzIHRyeWluZyB0byB1c2UKKwkgKgl0aGUgSVJRIGxpbmUgYXNzaWduZWQgdG8gdGhlIGRldmljZS4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTMyIFRMYW5fSGFuZGxlSW52YWxpZCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGhvc3RfaW50ICkKK3sKKwkvKiBwcmludGsoICJUTEFOOiAgSW52YWxpZCBpbnRlcnJ1cHQgb24gJXMuXG4iLCBkZXYtPm5hbWUgKTsgKi8KKwlyZXR1cm4gMDsKKworfSAvKiBUTGFuX0hhbmRsZUludmFsaWQgKi8KKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX0hhbmRsZVR4RU9GCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQkxCisJICoJUGFybXM6CisJICoJCWRldgkJRGV2aWNlIGFzc2lnbmVkIHRoZSBJUlEgdGhhdCB3YXMKKwkgKgkJCQlyYWlzZWQuCisJICoJCWhvc3RfaW50CVRoZSBjb250ZW50cyBvZiB0aGUgSE9TVF9JTlQKKwkgKgkJCQlwb3J0LgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFR4IEVPRiBpbnRlcnJ1cHRzIHdoaWNoIGFyZSByYWlzZWQKKwkgKglieSB0aGUgYWRhcHRlciB3aGVuIGl0IGhhcyBjb21wbGV0ZWQgc2VuZGluZyB0aGUKKwkgKgljb250ZW50cyBvZiBhIGJ1ZmZlci4gIElmIGRldGVtaW5lcyB3aGljaCBsaXN0L2J1ZmZlcgorCSAqCXdhcyBjb21wbGV0ZWQgYW5kIHJlc2V0cyBpdC4gIElmIHRoZSBidWZmZXIgd2FzIHRoZSBsYXN0CisJICoJaW4gdGhlIGNoYW5uZWwgKEVPQyksIHRoZW4gdGhlIGZ1bmN0aW9uIGNoZWNrcyB0byBzZWUgaWYKKwkgKglhbm90aGVyIGJ1ZmZlciBpcyByZWFkeSB0byBzZW5kLCBhbmQgaWYgc28sIHNlbmRzIGEgVHgKKwkgKglHbyBjb21tYW5kLiAgRmluYWxseSwgdGhlIGRyaXZlciBhY3RpdmF0ZXMvY29udGludWVzIHRoZQorCSAqCWFjdGl2aXR5IExFRC4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTMyIFRMYW5fSGFuZGxlVHhFT0YoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBob3N0X2ludCApCit7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQJCWVvYyA9IDA7CisJVExhbkxpc3QJKmhlYWRfbGlzdDsKKwlkbWFfYWRkcl90CWhlYWRfbGlzdF9waHlzOworCXUzMgkJYWNrID0gMDsKKwl1MTYJCXRtcENTdGF0OworCQorCVRMQU5fREJHKCBUTEFOX0RFQlVHX1RYLCAiVFJBTlNNSVQ6ICBIYW5kbGluZyBUWCBFT0YgKEhlYWQ9JWQgVGFpbD0lZClcbiIsIHByaXYtPnR4SGVhZCwgcHJpdi0+dHhUYWlsICk7CisJaGVhZF9saXN0ID0gcHJpdi0+dHhMaXN0ICsgcHJpdi0+dHhIZWFkOworCisJd2hpbGUgKCgodG1wQ1N0YXQgPSBoZWFkX2xpc3QtPmNTdGF0ICkgJiBUTEFOX0NTVEFUX0ZSTV9DTVApICYmIChhY2sgPCAyNTUpKSB7CisJCWFjaysrOworCQlpZiAoICEgYmJ1ZiApIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSBUTGFuX0dldFNLQihoZWFkX2xpc3QpOworCQkJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wY2lEZXYsIGhlYWRfbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MsIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQloZWFkX2xpc3QtPmJ1ZmZlcls4XS5hZGRyZXNzID0gMDsKKwkJCWhlYWRfbGlzdC0+YnVmZmVyWzldLmFkZHJlc3MgPSAwOworCQl9CisJCisJCWlmICggdG1wQ1N0YXQgJiBUTEFOX0NTVEFUX0VPQyApCisJCQllb2MgPSAxOworCQkJCisJCXByaXYtPnN0YXRzLnR4X2J5dGVzICs9IGhlYWRfbGlzdC0+ZnJhbWVTaXplOworCisJCWhlYWRfbGlzdC0+Y1N0YXQgPSBUTEFOX0NTVEFUX1VOVVNFRDsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsJCQorCQlDSVJDX0lOQyggcHJpdi0+dHhIZWFkLCBUTEFOX05VTV9UWF9MSVNUUyApOyAKKwkJaGVhZF9saXN0ID0gcHJpdi0+dHhMaXN0ICsgcHJpdi0+dHhIZWFkOworCX0KKworCWlmICghYWNrKQorCQlwcmludGsoS0VSTl9JTkZPICJUTEFOOiBSZWNlaXZlZCBpbnRlcnJ1cHQgZm9yIHVuY29tcGxldGVkIFRYIGZyYW1lLlxuIik7CisJCisJaWYgKCBlb2MgKSB7CisJCVRMQU5fREJHKCBUTEFOX0RFQlVHX1RYLCAiVFJBTlNNSVQ6ICBIYW5kbGluZyBUWCBFT0MgKEhlYWQ9JWQgVGFpbD0lZClcbiIsIHByaXYtPnR4SGVhZCwgcHJpdi0+dHhUYWlsICk7CisJCWhlYWRfbGlzdCA9IHByaXYtPnR4TGlzdCArIHByaXYtPnR4SGVhZDsKKwkJaGVhZF9saXN0X3BoeXMgPSBwcml2LT50eExpc3RETUEgKyBzaXplb2YoVExhbkxpc3QpICogcHJpdi0+dHhIZWFkOworCQlpZiAoICggaGVhZF9saXN0LT5jU3RhdCAmIFRMQU5fQ1NUQVRfUkVBRFkgKSA9PSBUTEFOX0NTVEFUX1JFQURZICkgeworCQkJb3V0bChoZWFkX2xpc3RfcGh5cywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0NIX1BBUk0gKTsKKwkJCWFjayB8PSBUTEFOX0hDX0dPOworCQl9IGVsc2UgeworCQkJcHJpdi0+dHhJblByb2dyZXNzID0gMDsKKwkJfQorCX0KKwkKKwlpZiAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX0FDVElWSVRZX0xFRCApIHsKKwkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0xFRF9SRUcsIFRMQU5fTEVEX0xJTksgfCBUTEFOX0xFRF9BQ1QgKTsKKwkJaWYgKCBwcml2LT50aW1lci5mdW5jdGlvbiA9PSBOVUxMICkgeworCQkJIHByaXYtPnRpbWVyLmZ1bmN0aW9uID0gJlRMYW5fVGltZXI7CisJCQkgcHJpdi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisJCQkgcHJpdi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBUTEFOX1RJTUVSX0FDVF9ERUxBWTsKKwkJCSBwcml2LT50aW1lclNldEF0ID0gamlmZmllczsKKwkJCSBwcml2LT50aW1lclR5cGUgPSBUTEFOX1RJTUVSX0FDVElWSVRZOworCQkJIGFkZF90aW1lcigmcHJpdi0+dGltZXIpOworCQl9IGVsc2UgaWYgKCBwcml2LT50aW1lclR5cGUgPT0gVExBTl9USU1FUl9BQ1RJVklUWSApIHsKKwkJCXByaXYtPnRpbWVyU2V0QXQgPSBqaWZmaWVzOworCQl9CisJfQorCisJcmV0dXJuIGFjazsKKworfSAvKiBUTGFuX0hhbmRsZVR4RU9GICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9IYW5kbGVTdGF0T3ZlcmZsb3cKKwkgKgorCSAqCVJldHVybnM6CisJICoJCTEKKwkgKglQYXJtczoKKwkgKgkJZGV2CQlEZXZpY2UgYXNzaWduZWQgdGhlIElSUSB0aGF0IHdhcworCSAqCQkJCXJhaXNlZC4KKwkgKgkJaG9zdF9pbnQJVGhlIGNvbnRlbnRzIG9mIHRoZSBIT1NUX0lOVAorCSAqCQkJCXBvcnQuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIFN0YXRpc3RpY3MgT3ZlcmZsb3cgaW50ZXJydXB0CisJICoJd2hpY2ggbWVhbnMgdGhhdCBvbmUgb3IgbW9yZSBvZiB0aGUgVExBTiBzdGF0aXN0aWNzCisJICoJcmVnaXN0ZXJzIGhhcyByZWFjaGVkIDEvMiBjYXBhY2l0eSBhbmQgbmVlZHMgdG8gYmUgcmVhZC4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTMyIFRMYW5fSGFuZGxlU3RhdE92ZXJmbG93KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgaG9zdF9pbnQgKQoreworCVRMYW5fUmVhZEFuZENsZWFyU3RhdHMoIGRldiwgVExBTl9SRUNPUkQgKTsKKworCXJldHVybiAxOworCit9IC8qIFRMYW5fSGFuZGxlU3RhdE92ZXJmbG93ICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9IYW5kbGVSeEVPRgorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJMQorCSAqCVBhcm1zOgorCSAqCQlkZXYJCURldmljZSBhc3NpZ25lZCB0aGUgSVJRIHRoYXQgd2FzCisJICoJCQkJcmFpc2VkLgorCSAqCQlob3N0X2ludAlUaGUgY29udGVudHMgb2YgdGhlIEhPU1RfSU5UCisJICoJCQkJcG9ydC4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgUnggRU9GIGludGVycnVwdCB3aGljaAorCSAqCWluZGljYXRlcyBhIGZyYW1lIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IHRoZSBhZGFwdGVyIGZyb20KKwkgKgl0aGUgbmV0IGFuZCB0aGUgZnJhbWUgaGFzIGJlZW4gdHJhbnNmZXJyZWQgdG8gbWVtb3J5LgorCSAqCVRoZSBmdW5jdGlvbiBkZXRlcm1pbmVzIHRoZSBib3VuY2UgYnVmZmVyIHRoZSBmcmFtZSBoYXMKKwkgKgliZWVuIGxvYWRlZCBpbnRvLCBjcmVhdGVzIGEgbmV3IHNrX2J1ZmYgYmlnIGVub3VnaCB0bworCSAqCWhvbGQgdGhlIGZyYW1lLCBhbmQgc2VuZHMgaXQgdG8gcHJvdG9jb2wgc3RhY2suICBJdAorCSAqCXRoZW4gcmVzZXRzIHRoZSB1c2VkIGJ1ZmZlciBhbmQgYXBwZW5kcyBpdCB0byB0aGUgZW5kCisJICoJb2YgdGhlIGxpc3QuICBJZiB0aGUgZnJhbWUgd2FzIHRoZSBsYXN0IGluIHRoZSBSeAorCSAqCWNoYW5uZWwgKEVPQyksIHRoZSBmdW5jdGlvbiByZXN0YXJ0cyB0aGUgcmVjZWl2ZSBjaGFubmVsCisJICoJYnkgc2VuZGluZyBhbiBSeCBHbyBjb21tYW5kIHRvIHRoZSBhZGFwdGVyLiAgVGhlbiBpdAorCSAqCWFjdGl2YXRlcy9jb250aW51ZXMgdGhlIGFjdGl2aXR5IExFRC4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTMyIFRMYW5fSGFuZGxlUnhFT0YoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBob3N0X2ludCApCit7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIJCWFjayA9IDA7CisJaW50CQllb2MgPSAwOworCXU4CQkqaGVhZF9idWZmZXI7CisJVExhbkxpc3QJKmhlYWRfbGlzdDsKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOworCVRMYW5MaXN0CSp0YWlsX2xpc3Q7CisJdm9pZAkJKnQ7CisJdTMyCQlmcmFtZVNpemU7CisJdTE2CQl0bXBDU3RhdDsKKwlkbWFfYWRkcl90CWhlYWRfbGlzdF9waHlzOworCisJVExBTl9EQkcoIFRMQU5fREVCVUdfUlgsICJSRUNFSVZFOiAgSGFuZGxpbmcgUlggRU9GIChIZWFkPSVkIFRhaWw9JWQpXG4iLCBwcml2LT5yeEhlYWQsIHByaXYtPnJ4VGFpbCApOworCWhlYWRfbGlzdCA9IHByaXYtPnJ4TGlzdCArIHByaXYtPnJ4SGVhZDsKKwloZWFkX2xpc3RfcGh5cyA9IHByaXYtPnJ4TGlzdERNQSArIHNpemVvZihUTGFuTGlzdCkgKiBwcml2LT5yeEhlYWQ7CisJCisJd2hpbGUgKCgodG1wQ1N0YXQgPSBoZWFkX2xpc3QtPmNTdGF0KSAmIFRMQU5fQ1NUQVRfRlJNX0NNUCkgJiYgKGFjayA8IDI1NSkpIHsKKwkJZnJhbWVTaXplID0gaGVhZF9saXN0LT5mcmFtZVNpemU7CisJCWFjaysrOworCQlpZiAodG1wQ1N0YXQgJiBUTEFOX0NTVEFUX0VPQykKKwkJCWVvYyA9IDE7CisJCQorCQlpZiAoYmJ1ZikgeworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihmcmFtZVNpemUgKyA3KTsKKwkJCWlmIChza2IgPT0gTlVMTCkKKwkJCQlwcmludGsoS0VSTl9JTkZPICJUTEFOOiBDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlY2VpdmVkIGRhdGEuXG4iKTsKKwkJCWVsc2UgeworCQkJCWhlYWRfYnVmZmVyID0gcHJpdi0+cnhCdWZmZXIgKyAocHJpdi0+cnhIZWFkICogVExBTl9NQVhfRlJBTUVfU0laRSk7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkJCQl0ID0gKHZvaWQgKikgc2tiX3B1dChza2IsIGZyYW1lU2l6ZSk7CisJCQorCQkJCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IGhlYWRfbGlzdC0+ZnJhbWVTaXplOworCisJCQkJbWVtY3B5KCB0LCBoZWFkX2J1ZmZlciwgZnJhbWVTaXplICk7CisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKCBza2IsIGRldiApOworCQkJCW5ldGlmX3J4KCBza2IgKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBza19idWZmICpuZXdfc2tiOworCQkKKwkJCS8qCisJCSAJICoJSSBjaGFuZ2VkIHRoZSBhbGdvcml0aG0gaGVyZS4gV2hhdCB3ZSBub3cgZG8KKwkJIAkgKglpcyBhbGxvY2F0ZSB0aGUgbmV3IGZyYW1lLiBJZiB0aGlzIGZhaWxzIHdlCisJCSAJICoJc2ltcGx5IHJlY3ljbGUgdGhlIGZyYW1lLgorCQkgCSAqLworCQkKKwkJCW5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKCBUTEFOX01BWF9GUkFNRV9TSVpFICsgNyApOworCQkJCisJCQlpZiAoIG5ld19za2IgIT0gTlVMTCApIHsKKwkJCQlza2IgPSBUTGFuX0dldFNLQihoZWFkX2xpc3QpOworCQkJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGNpRGV2LCBoZWFkX2xpc3QtPmJ1ZmZlclswXS5hZGRyZXNzLCBUTEFOX01BWF9GUkFNRV9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCXNrYl90cmltKCBza2IsIGZyYW1lU2l6ZSApOworCisJCQkJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gZnJhbWVTaXplOworCisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKCBza2IsIGRldiApOworCQkJCW5ldGlmX3J4KCBza2IgKTsKKwkKKwkJCQluZXdfc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoIG5ld19za2IsIDIgKTsKKwkJCQl0ID0gKHZvaWQgKikgc2tiX3B1dCggbmV3X3NrYiwgVExBTl9NQVhfRlJBTUVfU0laRSApOworCQkJCWhlYWRfbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wY2lEZXYsIG5ld19za2ItPmRhdGEsIFRMQU5fTUFYX0ZSQU1FX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJaGVhZF9saXN0LT5idWZmZXJbOF0uYWRkcmVzcyA9ICh1MzIpIHQ7CisJCQkJVExhbl9TdG9yZVNLQihoZWFkX2xpc3QsIG5ld19za2IpOworCQkJfSBlbHNlIAorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlRMQU46ICBDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlY2VpdmVkIGRhdGEuXG4iICk7CisJCX0KKworCQloZWFkX2xpc3QtPmZvcndhcmQgPSAwOworCQloZWFkX2xpc3QtPmNTdGF0ID0gMDsKKwkJdGFpbF9saXN0ID0gcHJpdi0+cnhMaXN0ICsgcHJpdi0+cnhUYWlsOworCQl0YWlsX2xpc3QtPmZvcndhcmQgPSBoZWFkX2xpc3RfcGh5czsKKworCQlDSVJDX0lOQyggcHJpdi0+cnhIZWFkLCBUTEFOX05VTV9SWF9MSVNUUyApOworCQlDSVJDX0lOQyggcHJpdi0+cnhUYWlsLCBUTEFOX05VTV9SWF9MSVNUUyApOworCQloZWFkX2xpc3QgPSBwcml2LT5yeExpc3QgKyBwcml2LT5yeEhlYWQ7CisJCWhlYWRfbGlzdF9waHlzID0gcHJpdi0+cnhMaXN0RE1BICsgc2l6ZW9mKFRMYW5MaXN0KSAqIHByaXYtPnJ4SGVhZDsKKwl9CisKKwlpZiAoIWFjaykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogUmVjZWl2ZWQgaW50ZXJydXB0IGZvciB1bmNvbXBsZXRlZCBSWCBmcmFtZS5cbiIpOworCQorCisKKworCWlmICggZW9jICkgeyAKKwkJVExBTl9EQkcoIFRMQU5fREVCVUdfUlgsICJSRUNFSVZFOiAgSGFuZGxpbmcgUlggRU9DIChIZWFkPSVkIFRhaWw9JWQpXG4iLCBwcml2LT5yeEhlYWQsIHByaXYtPnJ4VGFpbCApOworCQloZWFkX2xpc3QgPSBwcml2LT5yeExpc3QgKyBwcml2LT5yeEhlYWQ7CisJCWhlYWRfbGlzdF9waHlzID0gcHJpdi0+cnhMaXN0RE1BICsgc2l6ZW9mKFRMYW5MaXN0KSAqIHByaXYtPnJ4SGVhZDsKKwkJb3V0bChoZWFkX2xpc3RfcGh5cywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0NIX1BBUk0gKTsKKwkJYWNrIHw9IFRMQU5fSENfR08gfCBUTEFOX0hDX1JUOworCQlwcml2LT5yeEVvY0NvdW50Kys7CisJfQorCisJaWYgKCBwcml2LT5hZGFwdGVyLT5mbGFncyAmIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQgKSB7CisJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9MRURfUkVHLCBUTEFOX0xFRF9MSU5LIHwgVExBTl9MRURfQUNUICk7CisJCWlmICggcHJpdi0+dGltZXIuZnVuY3Rpb24gPT0gTlVMTCApICB7CisJCQlwcml2LT50aW1lci5mdW5jdGlvbiA9ICZUTGFuX1RpbWVyOworCQkJcHJpdi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisJCQlwcml2LT50aW1lci5leHBpcmVzID0gamlmZmllcyArIFRMQU5fVElNRVJfQUNUX0RFTEFZOworCQkJcHJpdi0+dGltZXJTZXRBdCA9IGppZmZpZXM7CisJCQlwcml2LT50aW1lclR5cGUgPSBUTEFOX1RJTUVSX0FDVElWSVRZOworCQkJYWRkX3RpbWVyKCZwcml2LT50aW1lcik7CisJCX0gZWxzZSBpZiAoIHByaXYtPnRpbWVyVHlwZSA9PSBUTEFOX1RJTUVSX0FDVElWSVRZICkgeworCQkJcHJpdi0+dGltZXJTZXRBdCA9IGppZmZpZXM7CisJCX0KKwl9CisKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQorCXJldHVybiBhY2s7CisKK30gLyogVExhbl9IYW5kbGVSeEVPRiAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fSGFuZGxlRHVtbXkKKwkgKgorCSAqCVJldHVybnM6CisJICoJCTEKKwkgKglQYXJtczoKKwkgKgkJZGV2CQlEZXZpY2UgYXNzaWduZWQgdGhlIElSUSB0aGF0IHdhcworCSAqCQkJCXJhaXNlZC4KKwkgKgkJaG9zdF9pbnQJVGhlIGNvbnRlbnRzIG9mIHRoZSBIT1NUX0lOVAorCSAqCQkJCXBvcnQuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIER1bW15IGludGVycnVwdCwgd2hpY2ggaXMKKwkgKglyYWlzZWQgd2hlbmV2ZXIgYSB0ZXN0IGludGVycnVwdCBpcyBnZW5lcmF0ZWQgYnkgc2V0dGluZworCSAqCXRoZSBSZXFfSW50IGJpdCBvZiBIT1NUX0NNRCB0byAxLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1MzIgVExhbl9IYW5kbGVEdW1teSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGhvc3RfaW50ICkKK3sKKwlwcmludGsoICJUTEFOOiAgVGVzdCBpbnRlcnJ1cHQgb24gJXMuXG4iLCBkZXYtPm5hbWUgKTsKKwlyZXR1cm4gMTsKKworfSAvKiBUTGFuX0hhbmRsZUR1bW15ICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9IYW5kbGVUeEVPQworCSAqCisJICoJUmV0dXJuczoKKwkgKgkJMQorCSAqCVBhcm1zOgorCSAqCQlkZXYJCURldmljZSBhc3NpZ25lZCB0aGUgSVJRIHRoYXQgd2FzCisJICoJCQkJcmFpc2VkLgorCSAqCQlob3N0X2ludAlUaGUgY29udGVudHMgb2YgdGhlIEhPU1RfSU5UCisJICoJCQkJcG9ydC4KKwkgKgorCSAqCVRoaXMgZHJpdmVyIGlzIHN0cnVjdHVyZWQgdG8gZGV0ZXJtaW5lIEVPQyBvY2N1cnJlbmNlcyBieQorCSAqCXJlYWRpbmcgdGhlIENTVEFUIG1lbWJlciBvZiB0aGUgbGlzdCBzdHJ1Y3R1cmUuICBUeCBFT0MKKwkgKglpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCB2aWEgdGhlIERJTyBJTlRESVMgcmVnaXN0ZXIuCisJICoJSG93ZXZlciwgVExBTiBjaGlwcyBiZWZvcmUgcmV2aXNpb24gMy4wIGRpZG4ndCBoYXZlIHRoaXMKKwkgKglmdW5jdGlvbmFsaXR5LCBzbyBwcm9jZXNzIEVPQyBldmVudHMgaWYgdGhpcyBpcyB0aGUKKwkgKgljYXNlLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit1MzIgVExhbl9IYW5kbGVUeEVPQyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGhvc3RfaW50ICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCVRMYW5MaXN0CQkqaGVhZF9saXN0OworCWRtYV9hZGRyX3QJCWhlYWRfbGlzdF9waHlzOworCXUzMgkJCWFjayA9IDE7CisJCisJaG9zdF9pbnQgPSAwOworCWlmICggcHJpdi0+dGxhblJldiA8IDB4MzAgKSB7CisJCVRMQU5fREJHKCBUTEFOX0RFQlVHX1RYLCAiVFJBTlNNSVQ6ICBIYW5kbGluZyBUWCBFT0MgKEhlYWQ9JWQgVGFpbD0lZCkgLS0gSVJRXG4iLCBwcml2LT50eEhlYWQsIHByaXYtPnR4VGFpbCApOworCQloZWFkX2xpc3QgPSBwcml2LT50eExpc3QgKyBwcml2LT50eEhlYWQ7CisJCWhlYWRfbGlzdF9waHlzID0gcHJpdi0+dHhMaXN0RE1BICsgc2l6ZW9mKFRMYW5MaXN0KSAqIHByaXYtPnR4SGVhZDsKKwkJaWYgKCAoIGhlYWRfbGlzdC0+Y1N0YXQgJiBUTEFOX0NTVEFUX1JFQURZICkgPT0gVExBTl9DU1RBVF9SRUFEWSApIHsKKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCW91dGwoIGhlYWRfbGlzdF9waHlzLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fQ0hfUEFSTSApOworCQkJYWNrIHw9IFRMQU5fSENfR087CisJCX0gZWxzZSB7CisJCQlwcml2LT50eEluUHJvZ3Jlc3MgPSAwOworCQl9CisJfQorCisJcmV0dXJuIGFjazsKKworfSAvKiBUTGFuX0hhbmRsZVR4RU9DICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9IYW5kbGVTdGF0dXNDaGVjaworCSAqCisJICoJUmV0dXJuczoKKwkgKgkJMCBpZiBBZGFwdGVyIGNoZWNrLCAxIGlmIE5ldHdvcmsgU3RhdHVzIGNoZWNrLgorCSAqCVBhcm1zOgorCSAqCQlkZXYJCURldmljZSBhc3NpZ25lZCB0aGUgSVJRIHRoYXQgd2FzCisJICoJCQkJcmFpc2VkLgorCSAqCQlob3N0X2ludAlUaGUgY29udGVudHMgb2YgdGhlIEhPU1RfSU5UCisJICoJCQkJcG9ydC4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gaGFuZGxlcyBBZGFwdGVyIENoZWNrL05ldHdvcmsgU3RhdHVzCisJICoJaW50ZXJydXB0cyBnZW5lcmF0ZWQgYnkgdGhlIGFkYXB0ZXIuICBJdCBjaGVja3MgdGhlCisJICoJdmVjdG9yIGluIHRoZSBIT1NUX0lOVCByZWdpc3RlciB0byBkZXRlcm1pbmUgaWYgaXQgaXMKKwkgKglhbiBBZGFwdGVyIENoZWNrIGludGVycnVwdC4gIElmIHNvLCBpdCByZXNldHMgdGhlCisJICoJYWRhcHRlci4gIE90aGVyd2lzZSBpdCBjbGVhcnMgdGhlIHN0YXR1cyByZWdpc3RlcnMKKwkgKglhbmQgc2VydmljZXMgdGhlIFBIWS4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTMyIFRMYW5fSGFuZGxlU3RhdHVzQ2hlY2soIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBob3N0X2ludCApCit7CQorCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTMyCQlhY2s7CisJdTMyCQllcnJvcjsKKwl1OAkJbmV0X3N0czsKKwl1MzIJCXBoeTsKKwl1MTYJCXRscGh5X2N0bDsKKwl1MTYJCXRscGh5X3N0czsKKwkKKwlhY2sgPSAxOworCWlmICggaG9zdF9pbnQgJiBUTEFOX0hJX0lWX01BU0sgKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoIGRldiApOworCQllcnJvciA9IGlubCggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0NIX1BBUk0gKTsKKwkJcHJpbnRrKCAiVExBTjogICVzOiBBZGFwdG9yIEVycm9yID0gMHgleFxuIiwgZGV2LT5uYW1lLCBlcnJvciApOworCQlUTGFuX1JlYWRBbmRDbGVhclN0YXRzKCBkZXYsIFRMQU5fUkVDT1JEICk7CisJCW91dGwoIFRMQU5fSENfQURfUlNULCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQgKTsKKworCQlzY2hlZHVsZV93b3JrKCZwcml2LT50bGFuX3RxdWV1ZSk7CisKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQlhY2sgPSAwOworCX0gZWxzZSB7CisJCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogU3RhdHVzIENoZWNrXG4iLCBkZXYtPm5hbWUgKTsKKwkJcGh5ID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07CisKKwkJbmV0X3N0cyA9IFRMYW5fRGlvUmVhZDgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9TVFMgKTsKKwkJaWYgKCBuZXRfc3RzICkgeworCQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9TVFMsIG5ldF9zdHMgKTsKKwkJCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogICAgTmV0X1N0cyA9ICV4XG4iLCBkZXYtPm5hbWUsICh1bnNpZ25lZCkgbmV0X3N0cyApOworCQl9CisJCWlmICggKCBuZXRfc3RzICYgVExBTl9ORVRfU1RTX01JUlEgKSAmJiAgKCBwcml2LT5waHlOdW0gPT0gMCApICkgeworCQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9TVFMsICZ0bHBoeV9zdHMgKTsKKwkJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIFRMQU5fVExQSFlfQ1RMLCAmdGxwaHlfY3RsICk7CisgICAgICAgIAkJaWYgKCAhICggdGxwaHlfc3RzICYgVExBTl9UU19QT0xPSyApICYmICEgKCB0bHBoeV9jdGwgJiBUTEFOX1RDX1NXQVBPTCApICkgeworICAgICAgICAgICAgICAgIAkJdGxwaHlfY3RsIHw9IFRMQU5fVENfU1dBUE9MOworICAgICAgICAgICAgICAgIAkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIFRMQU5fVExQSFlfQ1RMLCB0bHBoeV9jdGwpOworICAgICAgICAJCX0gZWxzZSBpZiAoICggdGxwaHlfc3RzICYgVExBTl9UU19QT0xPSyApICYmICggdGxwaHlfY3RsICYgVExBTl9UQ19TV0FQT0wgKSApIHsKKyAgICAgICAgICAgICAgICAJCXRscGh5X2N0bCAmPSB+VExBTl9UQ19TV0FQT0w7CisgICAgICAgICAgICAgICAgCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9DVEwsIHRscGh5X2N0bCk7CisgICAgICAgIAkJfQorCisJCQlpZiAoZGVidWcpIHsKKwkJCQlUTGFuX1BoeVByaW50KCBkZXYgKTsJCQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGFjazsKKworfSAvKiBUTGFuX0hhbmRsZVN0YXR1c0NoZWNrICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9IYW5kbGVSeEVPQworCSAqCisJICoJUmV0dXJuczoKKwkgKgkJMQorCSAqCVBhcm1zOgorCSAqCQlkZXYJCURldmljZSBhc3NpZ25lZCB0aGUgSVJRIHRoYXQgd2FzCisJICoJCQkJcmFpc2VkLgorCSAqCQlob3N0X2ludAlUaGUgY29udGVudHMgb2YgdGhlIEhPU1RfSU5UCisJICoJCQkJcG9ydC4KKwkgKgorCSAqCVRoaXMgZHJpdmVyIGlzIHN0cnVjdHVyZWQgdG8gZGV0ZXJtaW5lIEVPQyBvY2N1cnJlbmNlcyBieQorCSAqCXJlYWRpbmcgdGhlIENTVEFUIG1lbWJlciBvZiB0aGUgbGlzdCBzdHJ1Y3R1cmUuICBSeCBFT0MKKwkgKglpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCB2aWEgdGhlIERJTyBJTlRESVMgcmVnaXN0ZXIuCisJICoJSG93ZXZlciwgVExBTiBjaGlwcyBiZWZvcmUgcmV2aXNpb24gMy4wIGRpZG4ndCBoYXZlIHRoaXMKKwkgKglDU1RBVCBtZW1iZXIgb3IgYSBJTlRESVMgcmVnaXN0ZXIsIHNvIGlmIHRoaXMgY2hpcCBpcworCSAqCXByZS0zLjAsIHByb2Nlc3MgRU9DIGludGVycnVwdHMgbm9ybWFsbHkuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3UzMiBUTGFuX0hhbmRsZVJ4RU9DKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgaG9zdF9pbnQgKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJZG1hX2FkZHJfdAloZWFkX2xpc3RfcGh5czsKKwl1MzIJCWFjayA9IDE7CisKKwlpZiAoICBwcml2LT50bGFuUmV2IDwgMHgzMCApIHsKKwkJVExBTl9EQkcoIFRMQU5fREVCVUdfUlgsICJSRUNFSVZFOiAgSGFuZGxpbmcgUlggRU9DIChIZWFkPSVkIFRhaWw9JWQpIC0tIElSUVxuIiwgcHJpdi0+cnhIZWFkLCBwcml2LT5yeFRhaWwgKTsKKwkJaGVhZF9saXN0X3BoeXMgPSBwcml2LT5yeExpc3RETUEgKyBzaXplb2YoVExhbkxpc3QpICogcHJpdi0+cnhIZWFkOworCQlvdXRsKCBoZWFkX2xpc3RfcGh5cywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0NIX1BBUk0gKTsKKwkJYWNrIHw9IFRMQU5fSENfR08gfCBUTEFOX0hDX1JUOworCQlwcml2LT5yeEVvY0NvdW50Kys7CisJfQorCisJcmV0dXJuIGFjazsKKworfSAvKiBUTGFuX0hhbmRsZVJ4RU9DICovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlUaHVuZGVyTEFOIERyaXZlciBUaW1lciBGdW5jdGlvbgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9UaW1lcgorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlkYXRhCUEgdmFsdWUgZ2l2ZW4gdG8gYWRkIHRpbWVyIHdoZW4KKwkgKgkJCWFkZF90aW1lciB3YXMgY2FsbGVkLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRpbWVkIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZQorCSAqCVRMQU4gZHJpdmVyLiAgVGhlIHR3byBjdXJyZW50IHRpbWVyIHVzZXMgYXJlIGZvcgorCSAqCWRlbGF5aW5nIGZvciBhdXRvbmVnb3Rpb25hdGlvbiBhbmQgZHJpdmluZyB0aGUgQUNUIExFRC4KKwkgKgktCUF1dG9uZWdvdGlhdGlvbiByZXF1aXJlcyBiZWluZyBhbGxvd2VkIGFib3V0CisJICoJCTIgMS8yIHNlY29uZHMgYmVmb3JlIGF0dGVtcHRpbmcgdG8gdHJhbnNtaXQgYQorCSAqCQlwYWNrZXQuICBJdCB3b3VsZCBiZSBhIHZlcnkgYmFkIHRoaW5nIHRvIGhhbmcKKwkgKgkJdGhlIGtlcm5lbCB0aGlzIGxvbmcsIHNvIHRoZSBkcml2ZXIgZG9lc24ndAorCSAqCQlhbGxvdyB0cmFuc21pc3Npb24gJ3RpbCBhZnRlciB0aGlzIHRpbWUsIGZvcgorCSAqCQljZXJ0YWluIFBIWXMuICBJdCB3b3VsZCBiZSBtdWNoIG5pY2VyIGlmIGFsbAorCSAqCQlQSFlzIHdlcmUgaW50ZXJydXB0LWNhcGFibGUgbGlrZSB0aGUgaW50ZXJuYWwKKwkgKgkJUEhZLgorCSAqCS0JVGhlIEFDVCBMRUQsIHdoaWNoIHNob3dzIGFkYXB0ZXIgYWN0aXZpdHksIGlzCisJICoJCWRyaXZlbiBieSB0aGUgZHJpdmVyLCBhbmQgc28gbXVzdCBiZSBsZWZ0IG9uCisJICoJCWZvciBhIHNob3J0IHBlcmlvZCB0byBwb3dlciB1cCB0aGUgTEVEIHNvIGl0CisJICoJCWNhbiBiZSBzZWVuLiAgVGhpcyBkZWxheSBjYW4gYmUgY2hhbmdlZCBieQorCSAqCQljaGFuZ2luZyB0aGUgVExBTl9USU1FUl9BQ1RfREVMQVkgaW4gdGxhbi5oLAorCSAqCQlpZiBkZXNpcmVkLiAgMTAwIG1zICBwcm9kdWNlcyBhIHNsaWdodGx5CisJICoJCXNsdWdnaXNoIHJlc3BvbnNlLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fVGltZXIoIHVuc2lnbmVkIGxvbmcgZGF0YSApCit7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkYXRhOworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTMyCQllbGFwc2VkOworCXVuc2lnbmVkIGxvbmcJZmxhZ3MgPSAwOworCisJcHJpdi0+dGltZXIuZnVuY3Rpb24gPSBOVUxMOworCisJc3dpdGNoICggcHJpdi0+dGltZXJUeXBlICkgeworI2lmZGVmIE1PTklUT1IJCQorCQljYXNlIFRMQU5fVElNRVJfTElOS19CRUFUOgorCQkJVExhbl9QaHlNb25pdG9yKCBkZXYgKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgVExBTl9USU1FUl9QSFlfUERPV046CisJCQlUTGFuX1BoeVBvd2VyRG93biggZGV2ICk7CisJCQlicmVhazsKKwkJY2FzZSBUTEFOX1RJTUVSX1BIWV9QVVA6CisJCQlUTGFuX1BoeVBvd2VyVXAoIGRldiApOworCQkJYnJlYWs7CisJCWNhc2UgVExBTl9USU1FUl9QSFlfUkVTRVQ6CisJCQlUTGFuX1BoeVJlc2V0KCBkZXYgKTsKKwkJCWJyZWFrOworCQljYXNlIFRMQU5fVElNRVJfUEhZX1NUQVJUX0xJTks6CisJCQlUTGFuX1BoeVN0YXJ0TGluayggZGV2ICk7CisJCQlicmVhazsKKwkJY2FzZSBUTEFOX1RJTUVSX1BIWV9GSU5JU0hfQU46CisJCQlUTGFuX1BoeUZpbmlzaEF1dG9OZWcoIGRldiApOworCQkJYnJlYWs7CisJCWNhc2UgVExBTl9USU1FUl9GSU5JU0hfUkVTRVQ6CisJCQlUTGFuX0ZpbmlzaFJlc2V0KCBkZXYgKTsKKwkJCWJyZWFrOworCQljYXNlIFRMQU5fVElNRVJfQUNUSVZJVFk6CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQkJaWYgKCBwcml2LT50aW1lci5mdW5jdGlvbiA9PSBOVUxMICkgeworCQkJCWVsYXBzZWQgPSBqaWZmaWVzIC0gcHJpdi0+dGltZXJTZXRBdDsKKwkJCQlpZiAoIGVsYXBzZWQgPj0gVExBTl9USU1FUl9BQ1RfREVMQVkgKSB7CisJCQkJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9MRURfUkVHLCBUTEFOX0xFRF9MSU5LICk7CisJCQkJfSBlbHNlICB7CisJCQkJCXByaXYtPnRpbWVyLmZ1bmN0aW9uID0gJlRMYW5fVGltZXI7CisJCQkJCXByaXYtPnRpbWVyLmV4cGlyZXMgPSBwcml2LT50aW1lclNldEF0ICsgVExBTl9USU1FUl9BQ1RfREVMQVk7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJCQkJYWRkX3RpbWVyKCAmcHJpdi0+dGltZXIgKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKK30gLyogVExhbl9UaW1lciAqLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJVGh1bmRlckxBTiBEcml2ZXIgQWRhcHRlciBSZWxhdGVkIFJvdXRpbmVzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX1Jlc2V0TGlzdHMKKwkgKiAgCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlkZXYJVGhlIGRldmljZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgbGlzdAorCSAqCQkJc3R1Y3R1cmVzIHRvIGJlIHJlc2V0LgorCSAqCisJICoJVGhpcyByb3V0aW5lIHNldHMgdGhlIHZhcmlhYmxlcyBhc3NvY2lhdGVkIHdpdGggbWFuYWdpbmcKKwkgKgl0aGUgVExBTiBsaXN0cyB0byB0aGVpciBpbml0aWFsIHZhbHVlcy4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBUTGFuX1Jlc2V0TGlzdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50CQlpOworCVRMYW5MaXN0CSpsaXN0OworCWRtYV9hZGRyX3QJbGlzdF9waHlzOworCXN0cnVjdCBza19idWZmCSpza2I7CisJdm9pZAkJKnQgPSBOVUxMOworCisJcHJpdi0+dHhIZWFkID0gMDsKKwlwcml2LT50eFRhaWwgPSAwOworCWZvciAoIGkgPSAwOyBpIDwgVExBTl9OVU1fVFhfTElTVFM7IGkrKyApIHsKKwkJbGlzdCA9IHByaXYtPnR4TGlzdCArIGk7CisJCWxpc3QtPmNTdGF0ID0gVExBTl9DU1RBVF9VTlVTRUQ7CisJCWlmICggYmJ1ZiApIHsKKwkJCWxpc3QtPmJ1ZmZlclswXS5hZGRyZXNzID0gcHJpdi0+dHhCdWZmZXJETUEgKyAoIGkgKiBUTEFOX01BWF9GUkFNRV9TSVpFICk7CisJCX0gZWxzZSB7CisJCQlsaXN0LT5idWZmZXJbMF0uYWRkcmVzcyA9IDA7CisJCX0KKwkJbGlzdC0+YnVmZmVyWzJdLmNvdW50ID0gMDsKKwkJbGlzdC0+YnVmZmVyWzJdLmFkZHJlc3MgPSAwOworCQlsaXN0LT5idWZmZXJbOF0uYWRkcmVzcyA9IDA7CisJCWxpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzID0gMDsKKwl9CisKKwlwcml2LT5yeEhlYWQgPSAwOworCXByaXYtPnJ4VGFpbCA9IFRMQU5fTlVNX1JYX0xJU1RTIC0gMTsKKwlmb3IgKCBpID0gMDsgaSA8IFRMQU5fTlVNX1JYX0xJU1RTOyBpKysgKSB7CisJCWxpc3QgPSBwcml2LT5yeExpc3QgKyBpOworCQlsaXN0X3BoeXMgPSBwcml2LT5yeExpc3RETUEgKyBzaXplb2YoVExhbkxpc3QpICogaTsKKwkJbGlzdC0+Y1N0YXQgPSBUTEFOX0NTVEFUX1JFQURZOworCQlsaXN0LT5mcmFtZVNpemUgPSBUTEFOX01BWF9GUkFNRV9TSVpFOworCQlsaXN0LT5idWZmZXJbMF0uY291bnQgPSBUTEFOX01BWF9GUkFNRV9TSVpFIHwgVExBTl9MQVNUX0JVRkZFUjsKKwkJaWYgKCBiYnVmICkgeworCQkJbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MgPSBwcml2LT5yeEJ1ZmZlckRNQSArICggaSAqIFRMQU5fTUFYX0ZSQU1FX1NJWkUgKTsKKwkJfSBlbHNlIHsKKwkJCXNrYiA9IGRldl9hbGxvY19za2IoIFRMQU5fTUFYX0ZSQU1FX1NJWkUgKyA3ICk7CisJCQlpZiAoIHNrYiA9PSBOVUxMICkgeworCQkJCXByaW50ayggIlRMQU46ICBDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlY2VpdmVkIGRhdGEuXG4iICk7CisJCQkJLyogSWYgdGhpcyBldmVyIGhhcHBlbmVkIGl0IHdvdWxkIGJlIGEgcHJvYmxlbSAqLworCQkJfSBlbHNlIHsKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2JfcmVzZXJ2ZSggc2tiLCAyICk7CisJCQkJdCA9ICh2b2lkICopIHNrYl9wdXQoIHNrYiwgVExBTl9NQVhfRlJBTUVfU0laRSApOworCQkJfQorCQkJbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wY2lEZXYsIHQsIFRMQU5fTUFYX0ZSQU1FX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlsaXN0LT5idWZmZXJbOF0uYWRkcmVzcyA9ICh1MzIpIHQ7CisJCQlUTGFuX1N0b3JlU0tCKGxpc3QsIHNrYik7CisJCX0KKwkJbGlzdC0+YnVmZmVyWzFdLmNvdW50ID0gMDsKKwkJbGlzdC0+YnVmZmVyWzFdLmFkZHJlc3MgPSAwOworCQlpZiAoIGkgPCBUTEFOX05VTV9SWF9MSVNUUyAtIDEgKQorCQkJbGlzdC0+Zm9yd2FyZCA9IGxpc3RfcGh5cyArIHNpemVvZihUTGFuTGlzdCk7CisJCWVsc2UKKwkJCWxpc3QtPmZvcndhcmQgPSAwOworCX0KKworfSAvKiBUTGFuX1Jlc2V0TGlzdHMgKi8KKworCit2b2lkIFRMYW5fRnJlZUxpc3RzKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8gKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludAkJaTsKKwlUTGFuTGlzdAkqbGlzdDsKKwlzdHJ1Y3Qgc2tfYnVmZgkqc2tiOworCisJaWYgKCAhIGJidWYgKSB7CisJCWZvciAoIGkgPSAwOyBpIDwgVExBTl9OVU1fVFhfTElTVFM7IGkrKyApIHsKKwkJCWxpc3QgPSBwcml2LT50eExpc3QgKyBpOworCQkJc2tiID0gVExhbl9HZXRTS0IobGlzdCk7CisJCQlpZiAoIHNrYiApIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBjaURldiwgbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MsIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueSggc2tiICk7CisJCQkJbGlzdC0+YnVmZmVyWzhdLmFkZHJlc3MgPSAwOworCQkJCWxpc3QtPmJ1ZmZlcls5XS5hZGRyZXNzID0gMDsKKwkJCX0KKwkJfQorCisJCWZvciAoIGkgPSAwOyBpIDwgVExBTl9OVU1fUlhfTElTVFM7IGkrKyApIHsKKwkJCWxpc3QgPSBwcml2LT5yeExpc3QgKyBpOworCQkJc2tiID0gVExhbl9HZXRTS0IobGlzdCk7CisJCQlpZiAoIHNrYiApIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBjaURldiwgbGlzdC0+YnVmZmVyWzBdLmFkZHJlc3MsIFRMQU5fTUFYX0ZSQU1FX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoIHNrYiApOworCQkJCWxpc3QtPmJ1ZmZlcls4XS5hZGRyZXNzID0gMDsKKwkJCQlsaXN0LT5idWZmZXJbOV0uYWRkcmVzcyA9IDA7CisJCQl9CisJCX0KKwl9Cit9IC8qIFRMYW5fRnJlZUxpc3RzICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9QcmludERpbworCSAqICAKKwkgKglSZXR1cm5zOgorCSAqCQlOb3RoaW5nCisJICoJUGFybXM6CisJICoJCWlvX2Jhc2UJCUJhc2UgSU8gcG9ydCBvZiB0aGUgZGV2aWNlIG9mCisJICoJCQkJd2hpY2ggdG8gcHJpbnQgRElPIHJlZ2lzdGVycy4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gcHJpbnRzIG91dCBhbGwgdGhlIGludGVybmFsIChESU8pCisJICoJcmVnaXN0ZXJzIG9mIGEgVExBTiBjaGlwLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fUHJpbnREaW8oIHUxNiBpb19iYXNlICkKK3sKKwl1MzIgZGF0YTAsIGRhdGExOworCWludAlpOworCisJcHJpbnRrKCAiVExBTjogICBDb250ZW50cyBvZiBpbnRlcm5hbCByZWdpc3RlcnMgZm9yIGlvIGJhc2UgMHglMDRoeC5cbiIsIGlvX2Jhc2UgKTsKKwlwcmludGsoICJUTEFOOiAgICAgIE9mZi4gICswICAgICAgICAgKzRcbiIgKTsKKwlmb3IgKCBpID0gMDsgaSA8IDB4NEM7IGkrPSA4ICkgeworCQlkYXRhMCA9IFRMYW5fRGlvUmVhZDMyKCBpb19iYXNlLCBpICk7CisJCWRhdGExID0gVExhbl9EaW9SZWFkMzIoIGlvX2Jhc2UsIGkgKyAweDQgKTsKKwkJcHJpbnRrKCAiVExBTjogICAgICAweCUwMnggIDB4JTA4eCAweCUwOHhcbiIsIGksIGRhdGEwLCBkYXRhMSApOworCX0KKworfSAvKiBUTGFuX1ByaW50RGlvICovCisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICoJVExhbl9QcmludExpc3QKKwkgKiAgCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlsaXN0CUEgcG9pbnRlciB0byB0aGUgVExhbkxpc3Qgc3RydWN0dXJlIHRvCisJICoJCQliZSBwcmludGVkLgorCSAqCQl0eXBlCUEgc3RyaW5nIHRvIGRlc2lnbmF0ZSB0eXBlIG9mIGxpc3QsCisJICoJCQkiUngiIG9yICJUeCIuCisJICoJCW51bQlUaGUgaW5kZXggb2YgdGhlIGxpc3QuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIHByaW50cyBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBsaXN0CisJICoJcG9pbnRlZCB0byBieSB0aGUgbGlzdCBwYXJhbWV0ZXIuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgVExhbl9QcmludExpc3QoIFRMYW5MaXN0ICpsaXN0LCBjaGFyICp0eXBlLCBpbnQgbnVtKQoreworCWludCBpOworCisJcHJpbnRrKCAiVExBTjogICAlcyBMaXN0ICVkIGF0IDB4JTA4eFxuIiwgdHlwZSwgbnVtLCAodTMyKSBsaXN0ICk7CisJcHJpbnRrKCAiVExBTjogICAgICBGb3J3YXJkICAgID0gMHglMDh4XG4iLCAgbGlzdC0+Zm9yd2FyZCApOworCXByaW50ayggIlRMQU46ICAgICAgQ1NUQVQgICAgICA9IDB4JTA0aHhcbiIsIGxpc3QtPmNTdGF0ICk7CisJcHJpbnRrKCAiVExBTjogICAgICBGcmFtZSBTaXplID0gMHglMDRoeFxuIiwgbGlzdC0+ZnJhbWVTaXplICk7CisJLyogZm9yICggaSA9IDA7IGkgPCAxMDsgaSsrICkgeyAqLworCWZvciAoIGkgPSAwOyBpIDwgMjsgaSsrICkgeworCQlwcmludGsoICJUTEFOOiAgICAgIEJ1ZmZlclslZF0uY291bnQsIGFkZHIgPSAweCUwOHgsIDB4JTA4eFxuIiwgaSwgbGlzdC0+YnVmZmVyW2ldLmNvdW50LCBsaXN0LT5idWZmZXJbaV0uYWRkcmVzcyApOworCX0KKworfSAvKiBUTGFuX1ByaW50TGlzdCAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fUmVhZEFuZENsZWFyU3RhdHMKKwkgKgorCSAqCVJldHVybnM6CisJICoJCU5vdGhpbmcKKwkgKglQYXJtczoKKwkgKgkJZGV2CVBvaW50ZXIgdG8gZGV2aWNlIHN0cnVjdHVyZSBvZiBhZGFwdGVyCisJICoJCQl0byB3aGljaCB0byByZWFkIHN0YXRzLgorCSAqCQlyZWNvcmQJRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gYWRkIAorCSAqCisJICoJVGhpcyBmdW5jdGlvbnMgcmVhZHMgYWxsIHRoZSBpbnRlcm5hbCBzdGF0dXMgcmVnaXN0ZXJzCisJICoJb2YgdGhlIFRMQU4gY2hpcCwgd2hpY2ggY2xlYXJzIHRoZW0gYXMgYSBzaWRlIGVmZmVjdC4KKwkgKglJdCB0aGVuIGVpdGhlciBhZGRzIHRoZSB2YWx1ZXMgdG8gdGhlIGRldmljZSdzIHN0YXR1cworCSAqCXN0cnVjdCwgb3IgZGlzY2FyZHMgdGhlbSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgcmVjb3JkCisJICoJaXMgVExBTl9SRUNPUkQgKCE9MCkgIG9yIFRMQU5fSUdOT1JFICg9PTApLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fUmVhZEFuZENsZWFyU3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWNvcmQgKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTMyCQl0eF9nb29kLCB0eF91bmRlcjsKKwl1MzIJCXJ4X2dvb2QsIHJ4X292ZXI7CisJdTMyCQlkZWZfdHgsIGNyYywgY29kZTsKKwl1MzIJCW11bHRpX2NvbCwgc2luZ2xlX2NvbDsKKwl1MzIJCWV4Y2Vzc19jb2wsIGxhdGVfY29sLCBsb3NzOworCisJb3V0dyggVExBTl9HT09EX1RYX0ZSTVMsIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fQURSICk7CisJdHhfZ29vZCAgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSApOworCXR4X2dvb2QgKz0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAxICkgPDwgODsKKwl0eF9nb29kICs9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMiApIDw8IDE2OworCXR4X3VuZGVyID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAzICk7CisKKwlvdXR3KCBUTEFOX0dPT0RfUlhfRlJNUywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIgKTsKKwlyeF9nb29kICA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICk7CisJcnhfZ29vZCArPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDEgKSA8PCA4OworCXJ4X2dvb2QgKz0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAyICkgPDwgMTY7CisJcnhfb3ZlciAgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDMgKTsKKwkJCisJb3V0dyggVExBTl9ERUZFUlJFRF9UWCwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIgKTsKKwlkZWZfdHggID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKTsKKwlkZWZfdHggKz0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAxICkgPDwgODsKKwljcmMgICAgID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAyICk7CisJY29kZSAgICA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMyApOworCQorCW91dHcoIFRMQU5fTVVMVElDT0xfRlJNUywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIgKTsKKwltdWx0aV9jb2wgICA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICk7CisJbXVsdGlfY29sICArPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDEgKSA8PCA4OworCXNpbmdsZV9jb2wgID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAyICk7CisJc2luZ2xlX2NvbCArPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIDMgKSA8PCA4OworCisJb3V0dyggVExBTl9FWENFU1NDT0xfRlJNUywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIgKTsKKwlleGNlc3NfY29sID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKTsKKwlsYXRlX2NvbCAgID0gaW5iKCBkZXYtPmJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEgKyAxICk7CisJbG9zcyAgICAgICA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19EQVRBICsgMiApOworCisJaWYgKCByZWNvcmQgKSB7CisJCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMgKz0gcnhfZ29vZDsKKwkJcHJpdi0+c3RhdHMucnhfZXJyb3JzICArPSByeF9vdmVyICsgY3JjICsgY29kZTsKKwkJcHJpdi0+c3RhdHMudHhfcGFja2V0cyArPSB0eF9nb29kOworCQlwcml2LT5zdGF0cy50eF9lcnJvcnMgICs9IHR4X3VuZGVyICsgbG9zczsKKwkJcHJpdi0+c3RhdHMuY29sbGlzaW9ucyArPSBtdWx0aV9jb2wgKyBzaW5nbGVfY29sICsgZXhjZXNzX2NvbCArIGxhdGVfY29sOworCisJCXByaXYtPnN0YXRzLnJ4X292ZXJfZXJyb3JzICAgICs9IHJ4X292ZXI7CisJCXByaXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMgICAgICs9IGNyYzsKKwkJcHJpdi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzICAgKz0gY29kZTsKKworCQlwcml2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyArPSB0eF91bmRlcjsKKwkJcHJpdi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMgKz0gbG9zczsKKwl9CisJCQkKK30gLyogVExhbl9SZWFkQW5kQ2xlYXJTdGF0cyAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fUmVzZXQKKwkgKgorCSAqCVJldHVybnM6CisJICoJCTAKKwkgKglQYXJtczoKKwkgKgkJZGV2CVBvaW50ZXIgdG8gZGV2aWNlIHN0cnVjdHVyZSBvZiBhZGFwdGVyCisJICoJCQl0byBiZSByZXNldC4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBhZGFwdGVyIGFuZCBpdCdzIHBoeXNpY2FsCisJICoJZGV2aWNlLiAgU2VlIENoYXAuIDMsIHBwLiA5LTEwIG9mIHRoZSAiVGh1bmRlckxBTgorCSAqCVByb2dyYW1tZXIncyBHdWlkZSIgZm9yIGRldGFpbHMuICBUaGUgcm91dGluZSB0cmllcyB0bworCSAqCWltcGxlbWVudCB3aGF0IGlzIGRldGFpbGVkIHRoZXJlLCB0aG91Z2ggYWRqdXN0bWVudHMKKwkgKgloYXZlIGJlZW4gbWFkZS4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorVExhbl9SZXNldEFkYXB0ZXIoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50CQlpOworCXUzMgkJYWRkcjsKKwl1MzIJCWRhdGE7CisJdTgJCWRhdGE4OworCisJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBGQUxTRTsKKwlwcml2LT5waHlPbmxpbmU9MDsKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisvKiAgMS4JQXNzZXJ0IHJlc2V0IGJpdC4gKi8KKworCWRhdGEgPSBpbmwoZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EKTsKKwlkYXRhIHw9IFRMQU5fSENfQURfUlNUOworCW91dGwoZGF0YSwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EKTsKKwkKKwl1ZGVsYXkoMTAwMCk7CisKKy8qICAyLglUdXJuIG9mZiBpbnRlcnJ1cHRzLiAoIFByb2JhYmx5IGlzbid0IG5lY2Vzc2FyeSApICovCisKKwlkYXRhID0gaW5sKGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCk7CisJZGF0YSB8PSBUTEFOX0hDX0lOVF9PRkY7CisJb3V0bChkYXRhLCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQpOworCisvKiAgMy4JQ2xlYXIgQVJFR3MgYW5kIEhBU0hzLiAqLworCisgCWZvciAoIGkgPSBUTEFOX0FSRUdfMDsgaSA8PSBUTEFOX0hBU0hfMjsgaSArPSA0ICkgeworCQlUTGFuX0Rpb1dyaXRlMzIoIGRldi0+YmFzZV9hZGRyLCAodTE2KSBpLCAwICk7CisJfQorCisvKiAgNC4JU2V0dXAgTmV0Q29uZmlnIHJlZ2lzdGVyLiAqLworCisJZGF0YSA9IFRMQU5fTkVUX0NGR18xRlJBRyB8IFRMQU5fTkVUX0NGR18xQ0hBTiB8IFRMQU5fTkVUX0NGR19QSFlfRU47CisJVExhbl9EaW9Xcml0ZTE2KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfQ09ORklHLCAodTE2KSBkYXRhICk7CisKKy8qICA1LglMb2FkIExkX1RtciBhbmQgTGRfVGhyIGluIEhPU1RfQ01ELiAqLworCisgCW91dGwoIFRMQU5fSENfTERfVE1SIHwgMHgzZiwgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0hPU1RfQ01EICk7CisgCW91dGwoIFRMQU5fSENfTERfVEhSIHwgMHg5LCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQgKTsKKworLyogIDYuCVVucmVzZXQgdGhlIE1JSSBieSBzZXR0aW5nIE5NUlNUIChpbiBOZXRTaW8pIHRvIDEuICovCisKKwlvdXR3KCBUTEFOX05FVF9TSU8sIGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fQURSICk7CisJYWRkciA9IGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKwlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX05NUlNULCBhZGRyICk7CisKKy8qICA3LglTZXR1cCB0aGUgcmVtYWluaW5nIHJlZ2lzdGVycy4gKi8KKworCWlmICggcHJpdi0+dGxhblJldiA+PSAweDMwICkgeworCQlkYXRhOCA9IFRMQU5fSURfVFhfRU9DIHwgVExBTl9JRF9SWF9FT0M7CisJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9JTlRfRElTLCBkYXRhOCApOworCX0KKwlUTGFuX1BoeURldGVjdCggZGV2ICk7CisJZGF0YSA9IFRMQU5fTkVUX0NGR18xRlJBRyB8IFRMQU5fTkVUX0NGR18xQ0hBTjsKKwkKKwlpZiAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX0JJVF9SQVRFX1BIWSApIHsKKwkJZGF0YSB8PSBUTEFOX05FVF9DRkdfQklUOworCQlpZiAoIHByaXYtPmF1aSA9PSAxICkgeworCQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0FDT01NSVQsIDB4MGEgKTsKKwkJfSBlbHNlIGlmICggcHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0ZVTEwgKSB7CisJCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fQUNPTU1JVCwgMHgwMCApOworCQkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOworCQl9IGVsc2UgeworCQkJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX0FDT01NSVQsIDB4MDggKTsKKwkJfQorCX0KKworCWlmICggcHJpdi0+cGh5TnVtID09IDAgKSB7CisJCWRhdGEgfD0gVExBTl9ORVRfQ0ZHX1BIWV9FTjsKKwl9CisJVExhbl9EaW9Xcml0ZTE2KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfQ09ORklHLCAodTE2KSBkYXRhICk7CisKKwlpZiAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFkgKSB7CisJCVRMYW5fRmluaXNoUmVzZXQoIGRldiApOworCX0gZWxzZSB7CisJCVRMYW5fUGh5UG93ZXJEb3duKCBkZXYgKTsKKwl9CisKK30gLyogVExhbl9SZXNldEFkYXB0ZXIgKi8KKworCisKKwordm9pZAorVExhbl9GaW5pc2hSZXNldCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1OAkJZGF0YTsKKwl1MzIJCXBoeTsKKwl1OAkJc2lvOworCXUxNgkJc3RhdHVzOworCXUxNgkJcGFydG5lcjsKKwl1MTYJCXRscGh5X2N0bDsKKwl1MTYgCQl0bHBoeV9wYXI7CisJdTE2CQl0bHBoeV9pZDEsIHRscGh5X2lkMjsKKwlpbnQgCQlpOworCisJcGh5ID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07CisKKwlkYXRhID0gVExBTl9ORVRfQ01EX05SRVNFVCB8IFRMQU5fTkVUX0NNRF9OV1JBUDsKKwlpZiAoIHByaXYtPnRsYW5GdWxsRHVwbGV4ICkgeworCQlkYXRhIHw9IFRMQU5fTkVUX0NNRF9EVVBMRVg7CisJfQorCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9ORVRfQ01ELCBkYXRhICk7CisJZGF0YSA9IFRMQU5fTkVUX01BU0tfTUFTSzQgfCBUTEFOX05FVF9NQVNLX01BU0s1OyAKKwlpZiAoIHByaXYtPnBoeU51bSA9PSAwICkgeworCQlkYXRhIHw9IFRMQU5fTkVUX01BU0tfTUFTSzc7IAorCX0KKwlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX01BU0ssIGRhdGEgKTsKKwlUTGFuX0Rpb1dyaXRlMTYoIGRldi0+YmFzZV9hZGRyLCBUTEFOX01BWF9SWCwgKCgxNTM2KSs3KSZ+NyApOworCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fSURfSEksICZ0bHBoeV9pZDEgKTsKKwlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0lEX0xPLCAmdGxwaHlfaWQyICk7CisJCisJaWYgKCAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX1VOTUFOQUdFRF9QSFkgKSB8fCAoIHByaXYtPmF1aSApICkgeworCQlzdGF0dXMgPSBNSUlfR1NfTElOSzsKKwkJcHJpbnRrKCAiVExBTjogICVzOiBMaW5rIGZvcmNlZC5cbiIsIGRldi0+bmFtZSApOworCX0gZWxzZSB7CisJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fU1RTLCAmc3RhdHVzICk7CisJCXVkZWxheSggMTAwMCApOworCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX1NUUywgJnN0YXR1cyApOworCQlpZiAoIChzdGF0dXMgJiBNSUlfR1NfTElOSykgJiYJIC8qIFdlIG9ubHkgc3VwcG9ydCBsaW5rIGluZm8gb24gTmF0LlNlbS4gUEhZJ3MgKi8gCisJCQkodGxwaHlfaWQxID09IE5BVF9TRU1fSUQxKSAmJgorCQkJKHRscGh5X2lkMiA9PSBOQVRfU0VNX0lEMikgKSB7CisJCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfQU5fTFBBLCAmcGFydG5lciApOworCQkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9QQVIsICZ0bHBoeV9wYXIgKTsKKwkJCQorCQkJcHJpbnRrKCAiVExBTjogJXM6IExpbmsgYWN0aXZlIHdpdGggIiwgZGV2LT5uYW1lICk7CisJCQlpZiAoISh0bHBoeV9wYXIgJiBUTEFOX1BIWV9BTl9FTl9TVEFUKSkgeworCQkJICAgICAgCSBwcmludGsoICJmb3JjZWQgMTAlc01icHMgJXMtRHVwbGV4XG4iLCAKKwkJCQkJCXRscGh5X3BhciAmIFRMQU5fUEhZX1NQRUVEXzEwMCA/ICIiIDogIjAiLAorCQkJCQkJdGxwaHlfcGFyICYgVExBTl9QSFlfRFVQTEVYX0ZVTEwgPyAiRnVsbCIgOiAiSGFsZiIpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoICJBdXRvTmVnb3RpYXRpb24gZW5hYmxlZCwgYXQgMTAlc01icHMgJXMtRHVwbGV4XG4iLAorCQkJCQkJdGxwaHlfcGFyICYgVExBTl9QSFlfU1BFRURfMTAwID8gIiIgOiAiMCIsCisJCQkJCQl0bHBoeV9wYXIgJiBUTEFOX1BIWV9EVVBMRVhfRlVMTCA/ICJGdWxsIiA6ICJIYWxmIik7CisJCQkJcHJpbnRrKCJUTEFOOiBQYXJ0bmVyIGNhcGFiaWxpdHk6ICIpOworCQkJCQlmb3IgKGkgPSA1OyBpIDw9IDEwOyBpKyspCisJCQkJCQlpZiAocGFydG5lciAmICgxPDxpKSkKKwkJCQkJCQlwcmludGsoIiVzIixtZWRpYVtpLTVdKTsKKwkJCQlwcmludGsoIlxuIik7CisJCQl9CisKKwkJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9MRURfUkVHLCBUTEFOX0xFRF9MSU5LICk7CisjaWZkZWYgTU9OSVRPUgkJCQorCQkJLyogV2UgaGF2ZSBsaW5rIGJlYXQuLmZvciBub3cgYW55d2F5ICovCisJICAgICAgICAJcHJpdi0+bGluayA9IDE7CisJICAgICAgICAJLypFbmFibGluZyBsaW5rIGJlYXQgbW9uaXRvcmluZyAqLworCQkJVExhbl9TZXRUaW1lciggZGV2LCAoMTAqSFopLCBUTEFOX1RJTUVSX0xJTktfQkVBVCApOworI2VuZGlmIAorCQl9IGVsc2UgaWYgKHN0YXR1cyAmIE1JSV9HU19MSU5LKSAgeworCQkJcHJpbnRrKCAiVExBTjogJXM6IExpbmsgYWN0aXZlXG4iLCBkZXYtPm5hbWUgKTsKKwkJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9MRURfUkVHLCBUTEFOX0xFRF9MSU5LICk7CisJCX0KKwl9CisKKwlpZiAoIHByaXYtPnBoeU51bSA9PSAwICkgeworICAgICAgICAJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9DVEwsICZ0bHBoeV9jdGwgKTsKKyAgICAgICAgCXRscGh5X2N0bCB8PSBUTEFOX1RDX0lOVEVOOworICAgICAgICAJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIFRMQU5fVExQSFlfQ1RMLCB0bHBoeV9jdGwgKTsKKyAgICAgICAgCXNpbyA9IFRMYW5fRGlvUmVhZDgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9TSU8gKTsKKyAgICAgICAgCXNpbyB8PSBUTEFOX05FVF9TSU9fTUlOVEVOOworICAgICAgICAJVExhbl9EaW9Xcml0ZTgoIGRldi0+YmFzZV9hZGRyLCBUTEFOX05FVF9TSU8sIHNpbyApOworCX0KKworCWlmICggc3RhdHVzICYgTUlJX0dTX0xJTksgKSB7CisJCVRMYW5fU2V0TWFjKCBkZXYsIDAsIGRldi0+ZGV2X2FkZHIgKTsKKwkJcHJpdi0+cGh5T25saW5lID0gMTsKKwkJb3V0YiggKCBUTEFOX0hDX0lOVF9PTiA+PiA4ICksIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCArIDEgKTsKKwkJaWYgKCBkZWJ1ZyA+PSAxICYmIGRlYnVnICE9IFRMQU5fREVCVUdfUFJPQkUgKSB7CisJCQlvdXRiKCAoIFRMQU5fSENfUkVRX0lOVCA+PiA4ICksIGRldi0+YmFzZV9hZGRyICsgVExBTl9IT1NUX0NNRCArIDEgKTsKKwkJfQorCQlvdXRsKCBwcml2LT5yeExpc3RETUEsIGRldi0+YmFzZV9hZGRyICsgVExBTl9DSF9QQVJNICk7CisJCW91dGwoIFRMQU5fSENfR08gfCBUTEFOX0hDX1JULCBkZXYtPmJhc2VfYWRkciArIFRMQU5fSE9TVF9DTUQgKTsKKwkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCX0gZWxzZSB7CisJCXByaW50ayggIlRMQU46ICVzOiBMaW5rIGluYWN0aXZlLCB3aWxsIHJldHJ5IGluIDEwIHNlY3MuLi5cbiIsIGRldi0+bmFtZSApOworCQlUTGFuX1NldFRpbWVyKCBkZXYsICgxMCpIWiksIFRMQU5fVElNRVJfRklOSVNIX1JFU0VUICk7CisJCXJldHVybjsKKwl9CisKK30gLyogVExhbl9GaW5pc2hSZXNldCAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fU2V0TWFjCisJICoKKwkgKglSZXR1cm5zOgorCSAqCQlOb3RoaW5nCisJICoJUGFybXM6CisJICoJCWRldglQb2ludGVyIHRvIGRldmljZSBzdHJ1Y3R1cmUgb2YgYWRhcHRlcgorCSAqCQkJb24gd2hpY2ggdG8gY2hhbmdlIHRoZSBBUkVHLgorCSAqCQlhcmVnCVRoZSBBUkVHIHRvIHNldCB0aGUgYWRkcmVzcyBpbiAoMCAtIDMpLgorCSAqCQltYWMJQSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNoYXJzLiAgRWFjaAorCSAqCQkJZWxlbWVudCBzdG9yZXMgb25lIGJ5dGUgb2YgdGhlIGFkZHJlc3MuCisJICoJCQlJRSwgaXQgaXNuJ3QgaW4gYXNjaWkuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIHRyYW5zZmVycyBhIE1BQyBhZGRyZXNzIHRvIG9uZSBvZiB0aGUKKwkgKglUTEFOIEFSRUdzIChhZGRyZXNzIHJlZ2lzdGVycykuICBUaGUgVExBTiBjaGlwIGxvY2tzCisJICoJdGhlIHJlZ2lzdGVyIG9uIHdyaXRpbmcgdG8gb2Zmc2V0IDAgYW5kIHVubG9ja3MgdGhlCisJICoJcmVnaXN0ZXIgYWZ0ZXIgd3JpdGluZyB0byBvZmZzZXQgNS4gIElmIE5VTEwgaXMgcGFzc2VkCisJICoJaW4gbWFjLCB0aGVuIHRoZSBBUkVHIGlzIGZpbGxlZCB3aXRoIDAncy4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBUTGFuX1NldE1hYyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFyZWcsIGNoYXIgKm1hYyApCit7CisJaW50IGk7CisJCQkKKwlhcmVnICo9IDY7CisKKwlpZiAoIG1hYyAhPSBOVUxMICkgeworCQlmb3IgKCBpID0gMDsgaSA8IDY7IGkrKyApCisJCQlUTGFuX0Rpb1dyaXRlOCggZGV2LT5iYXNlX2FkZHIsIFRMQU5fQVJFR18wICsgYXJlZyArIGksIG1hY1tpXSApOworCX0gZWxzZSB7CisJCWZvciAoIGkgPSAwOyBpIDwgNjsgaSsrICkKKwkJCVRMYW5fRGlvV3JpdGU4KCBkZXYtPmJhc2VfYWRkciwgVExBTl9BUkVHXzAgKyBhcmVnICsgaSwgMCApOworCX0KKworfSAvKiBUTGFuX1NldE1hYyAqLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJVGh1bmRlckxBTiBEcml2ZXIgUEhZIExheWVyIFJvdXRpbmVzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fUGh5UHJpbnQKKwkgKgorCSAqCVJldHVybnM6CisJICoJCU5vdGhpbmcKKwkgKglQYXJtczoKKwkgKgkJZGV2CUEgcG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZSBvZiB0aGUKKwkgKgkJCVRMQU4gZGV2aWNlIGhhdmluZyB0aGUgUEhZcyB0byBiZSBkZXRhaWxlZC4KKwkgKgkJCQkKKwkgKglUaGlzIGZ1bmN0aW9uIHByaW50cyB0aGUgcmVnaXN0ZXJzIGEgUEhZIChha2EgdHJhbnNjZWl2ZXIpLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fUGh5UHJpbnQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTE2IGksIGRhdGEwLCBkYXRhMSwgZGF0YTIsIGRhdGEzLCBwaHk7CisKKwlwaHkgPSBwcml2LT5waHlbcHJpdi0+cGh5TnVtXTsKKworCWlmICggcHJpdi0+YWRhcHRlci0+ZmxhZ3MgJiBUTEFOX0FEQVBURVJfVU5NQU5BR0VEX1BIWSApIHsKKwkJcHJpbnRrKCAiVExBTjogICBEZXZpY2UgJXMsIFVubWFuYWdlZCBQSFkuXG4iLCBkZXYtPm5hbWUgKTsKKwl9IGVsc2UgaWYgKCBwaHkgPD0gVExBTl9QSFlfTUFYX0FERFIgKSB7CisJCXByaW50ayggIlRMQU46ICAgRGV2aWNlICVzLCBQSFkgMHglMDJ4LlxuIiwgZGV2LT5uYW1lLCBwaHkgKTsKKwkJcHJpbnRrKCAiVExBTjogICAgICBPZmYuICArMCAgICAgKzEgICAgICsyICAgICArMyBcbiIgKTsKKyAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IDB4MjA7IGkrPSA0ICkgeworCQkJcHJpbnRrKCAiVExBTjogICAgICAweCUwMngiLCBpICk7CisJCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBpLCAmZGF0YTAgKTsKKwkJCXByaW50ayggIiAweCUwNGh4IiwgZGF0YTAgKTsKKwkJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIGkgKyAxLCAmZGF0YTEgKTsKKwkJCXByaW50ayggIiAweCUwNGh4IiwgZGF0YTEgKTsKKwkJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIGkgKyAyLCAmZGF0YTIgKTsKKwkJCXByaW50ayggIiAweCUwNGh4IiwgZGF0YTIgKTsKKwkJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIGkgKyAzLCAmZGF0YTMgKTsKKwkJCXByaW50ayggIiAweCUwNGh4XG4iLCBkYXRhMyApOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKCAiVExBTjogICBEZXZpY2UgJXMsIEludmFsaWQgUEhZLlxuIiwgZGV2LT5uYW1lICk7CisJfQorCit9IC8qIFRMYW5fUGh5UHJpbnQgKi8KKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKglUTGFuX1BoeURldGVjdAorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlkZXYJQSBwb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlIG9mIHRoZSBhZGFwdGVyCisJICoJCQlmb3Igd2hpY2ggdGhlIFBIWSBuZWVkcyBkZXRlcm1pbmVkLgorCSAqCisJICoJU28gZmFyIEkndmUgZm91bmQgdGhhdCBhZGFwdGVycyB3aGljaCBoYXZlIGV4dGVybmFsIFBIWXMKKwkgKgltYXkgYWxzbyB1c2UgdGhlIGludGVybmFsIFBIWSBmb3IgcGFydCBvZiB0aGUgZnVuY3Rpb25hbGl0eS4KKwkgKgkoZWcsIEFVSS9UaGlubmV0KS4gIFRoaXMgZnVuY3Rpb24gZmluZHMgb3V0IGlmIHRoaXMgVExBTgorCSAqCWNoaXAgaGFzIGFuIGludGVybmFsIFBIWSwgYW5kIHRoZW4gZmluZHMgdGhlIGZpcnN0IGV4dGVybmFsCisJICoJUEhZIChzdGFydGluZyBmcm9tIGFkZHJlc3MgMCkgaWYgaXQgZXhpc3RzKS4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBUTGFuX1BoeURldGVjdCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJVExhblByaXZhdGVJbmZvICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYJCWNvbnRyb2w7CisJdTE2CQloaTsKKwl1MTYJCWxvOworCXUzMgkJcGh5OworCisJaWYgKCBwcml2LT5hZGFwdGVyLT5mbGFncyAmIFRMQU5fQURBUFRFUl9VTk1BTkFHRURfUEhZICkgeworCQlwcml2LT5waHlOdW0gPSAweEZGRkY7CisJCXJldHVybjsKKwl9CisKKwlUTGFuX01paVJlYWRSZWcoIGRldiwgVExBTl9QSFlfTUFYX0FERFIsIE1JSV9HRU5fSURfSEksICZoaSApOworCQorCWlmICggaGkgIT0gMHhGRkZGICkgeworCQlwcml2LT5waHlbMF0gPSBUTEFOX1BIWV9NQVhfQUREUjsKKwl9IGVsc2UgeworCQlwcml2LT5waHlbMF0gPSBUTEFOX1BIWV9OT05FOworCX0KKworCXByaXYtPnBoeVsxXSA9IFRMQU5fUEhZX05PTkU7CisJZm9yICggcGh5ID0gMDsgcGh5IDw9IFRMQU5fUEhZX01BWF9BRERSOyBwaHkrKyApIHsKKwkJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsICZjb250cm9sICk7CisJCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fSURfSEksICZoaSApOworCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0lEX0xPLCAmbG8gKTsKKwkJaWYgKCAoIGNvbnRyb2wgIT0gMHhGRkZGICkgfHwgKCBoaSAhPSAweEZGRkYgKSB8fCAoIGxvICE9IDB4RkZGRiApICkgeworCQkJVExBTl9EQkcoIFRMQU5fREVCVUdfR05STCwgIlBIWSBmb3VuZCBhdCAlMDJ4ICUwNHggJTA0eCAlMDR4XG4iLCBwaHksIGNvbnRyb2wsIGhpLCBsbyApOworCQkJaWYgKCAoIHByaXYtPnBoeVsxXSA9PSBUTEFOX1BIWV9OT05FICkgJiYgKCBwaHkgIT0gVExBTl9QSFlfTUFYX0FERFIgKSApIHsKKwkJCQlwcml2LT5waHlbMV0gPSBwaHk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIHByaXYtPnBoeVsxXSAhPSBUTEFOX1BIWV9OT05FICkgeworCQlwcml2LT5waHlOdW0gPSAxOworCX0gZWxzZSBpZiAoIHByaXYtPnBoeVswXSAhPSBUTEFOX1BIWV9OT05FICkgeworCQlwcml2LT5waHlOdW0gPSAwOworCX0gZWxzZSB7CisJCXByaW50ayggIlRMQU46ICBDYW5ub3QgaW5pdGlhbGl6ZSBkZXZpY2UsIG5vIFBIWSB3YXMgZm91bmQhXG4iICk7CisJfQorCit9IC8qIFRMYW5fUGh5RGV0ZWN0ICovCisKKworCisKK3ZvaWQgVExhbl9QaHlQb3dlckRvd24oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTE2CQl2YWx1ZTsKKworCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogUG93ZXJpbmcgZG93biBQSFkocykuXG4iLCBkZXYtPm5hbWUgKTsKKwl2YWx1ZSA9IE1JSV9HQ19QRE9XTiB8IE1JSV9HQ19MT09QQksgfCBNSUlfR0NfSVNPTEFURTsKKwlUTGFuX01paVN5bmMoIGRldi0+YmFzZV9hZGRyICk7CisJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwcml2LT5waHlbcHJpdi0+cGh5TnVtXSwgTUlJX0dFTl9DVEwsIHZhbHVlICk7CisJaWYgKCAoIHByaXYtPnBoeU51bSA9PSAwICkgJiYgKCBwcml2LT5waHlbMV0gIT0gVExBTl9QSFlfTk9ORSApICYmICggISAoIHByaXYtPmFkYXB0ZXItPmZsYWdzICYgVExBTl9BREFQVEVSX1VTRV9JTlRFUk5fMTAgKSApICkgeworCQlUTGFuX01paVN5bmMoIGRldi0+YmFzZV9hZGRyICk7CisJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcHJpdi0+cGh5WzFdLCBNSUlfR0VOX0NUTCwgdmFsdWUgKTsKKwl9CisKKwkvKiBXYWl0IGZvciA1MCBtcyBhbmQgcG93ZXJ1cAorCSAqIFRoaXMgaXMgYWJpdHJhcnkuICBJdCBpcyBpbnRlbmRlZCB0byBtYWtlIHN1cmUgdGhlCisJICogdHJhbnNjZWl2ZXIgc2V0dGxlcy4KKwkgKi8KKwlUTGFuX1NldFRpbWVyKCBkZXYsIChIWi8yMCksIFRMQU5fVElNRVJfUEhZX1BVUCApOworCit9IC8qIFRMYW5fUGh5UG93ZXJEb3duICovCisKKworCisKK3ZvaWQgVExhbl9QaHlQb3dlclVwKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNgkJdmFsdWU7CisKKwlUTEFOX0RCRyggVExBTl9ERUJVR19HTlJMLCAiJXM6IFBvd2VyaW5nIHVwIFBIWS5cbiIsIGRldi0+bmFtZSApOworCVRMYW5fTWlpU3luYyggZGV2LT5iYXNlX2FkZHIgKTsKKwl2YWx1ZSA9IE1JSV9HQ19MT09QQks7CisJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwcml2LT5waHlbcHJpdi0+cGh5TnVtXSwgTUlJX0dFTl9DVEwsIHZhbHVlICk7CisJVExhbl9NaWlTeW5jKGRldi0+YmFzZV9hZGRyKTsKKwkvKiBXYWl0IGZvciA1MDAgbXMgYW5kIHJlc2V0IHRoZQorCSAqIHRyYW5zY2VpdmVyLiAgVGhlIFRMQU4gZG9jcyBzYXkgYm90aCA1MCBtcyBhbmQKKwkgKiA1MDAgbXMsIHNvIGRvIHRoZSBsb25nZXIsIGp1c3QgaW4gY2FzZS4KKwkgKi8KKwlUTGFuX1NldFRpbWVyKCBkZXYsIChIWi8yMCksIFRMQU5fVElNRVJfUEhZX1JFU0VUICk7CisKK30gLyogVExhbl9QaHlQb3dlclVwICovCisKKworCisKK3ZvaWQgVExhbl9QaHlSZXNldCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCit7CisJVExhblByaXZhdGVJbmZvCSpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYJCXBoeTsKKwl1MTYJCXZhbHVlOworCisJcGh5ID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07CisKKwlUTEFOX0RCRyggVExBTl9ERUJVR19HTlJMLCAiJXM6IFJlc2V0aW5nIFBIWS5cbiIsIGRldi0+bmFtZSApOworCVRMYW5fTWlpU3luYyggZGV2LT5iYXNlX2FkZHIgKTsKKwl2YWx1ZSA9IE1JSV9HQ19MT09QQksgfCBNSUlfR0NfUkVTRVQ7CisJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCB2YWx1ZSApOworCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCAmdmFsdWUgKTsKKwl3aGlsZSAoIHZhbHVlICYgTUlJX0dDX1JFU0VUICkgeworCQlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgJnZhbHVlICk7CisJfQorCisJLyogV2FpdCBmb3IgNTAwIG1zIGFuZCBpbml0aWFsaXplLgorCSAqIEkgZG9uJ3QgcmVtZW1iZXIgd2h5IEkgd2FpdCB0aGlzIGxvbmcuCisJICogSSd2ZSBjaGFuZ2VkIHRoaXMgdG8gNTBtcywgYXMgaXQgc2VlbXMgbG9uZyBlbm91Z2guCisJICovCisJVExhbl9TZXRUaW1lciggZGV2LCAoSFovMjApLCBUTEFOX1RJTUVSX1BIWV9TVEFSVF9MSU5LICk7CisKK30gLyogVExhbl9QaHlSZXNldCAqLworCisKKworCit2b2lkIFRMYW5fUGh5U3RhcnRMaW5rKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKK3sKKwlUTGFuUHJpdmF0ZUluZm8JKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNgkJYWJpbGl0eTsKKwl1MTYJCWNvbnRyb2w7CisJdTE2CQlkYXRhOworCXUxNgkJcGh5OworCXUxNgkJc3RhdHVzOworCXUxNgkJdGN0bDsKKworCXBoeSA9IHByaXYtPnBoeVtwcml2LT5waHlOdW1dOworCVRMQU5fREJHKCBUTEFOX0RFQlVHX0dOUkwsICIlczogVHJ5aW5nIHRvIGFjdGl2YXRlIGxpbmsuXG4iLCBkZXYtPm5hbWUgKTsKKwlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBNSUlfR0VOX1NUUywgJnN0YXR1cyApOworCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fU1RTLCAmYWJpbGl0eSApOworCisJaWYgKCAoIHN0YXR1cyAmIE1JSV9HU19BVVRPTkVHICkgJiYgCisJICAgICAoICEgcHJpdi0+YXVpICkgKSB7CisJCWFiaWxpdHkgPSBzdGF0dXMgPj4gMTE7CisJCWlmICggcHJpdi0+c3BlZWQgID09IFRMQU5fU1BFRURfMTAgJiYgCisJCSAgICAgcHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0hBTEYpIHsKKwkJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgMHgwMDAwKTsKKwkJfSBlbHNlIGlmICggcHJpdi0+c3BlZWQgPT0gVExBTl9TUEVFRF8xMCAmJgorCQkJICAgIHByaXYtPmR1cGxleCA9PSBUTEFOX0RVUExFWF9GVUxMKSB7CisJCQlwcml2LT50bGFuRnVsbER1cGxleCA9IFRSVUU7CisJCQlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9DVEwsIDB4MDEwMCk7CisJCX0gZWxzZSBpZiAoIHByaXYtPnNwZWVkID09IFRMQU5fU1BFRURfMTAwICYmCisJCQkgICAgcHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0hBTEYpIHsKKwkJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgMHgyMDAwKTsKKwkJfSBlbHNlIGlmICggcHJpdi0+c3BlZWQgPT0gVExBTl9TUEVFRF8xMDAgJiYKKwkJCSAgICBwcml2LT5kdXBsZXggPT0gVExBTl9EVVBMRVhfRlVMTCkgeworCQkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOworCQkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCAweDIxMDApOworCQl9IGVsc2UgeworCQorCQkJLyogU2V0IEF1dG8tTmVnIGFkdmVydGlzZW1lbnQgKi8KKwkJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBNSUlfQU5fQURWLCAoYWJpbGl0eSA8PCA1KSB8IDEpOworCQkJLyogRW5hYmxlZSBBdXRvLU5lZyAqLworCQkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCAweDEwMDAgKTsKKwkJCS8qIFJlc3RhcnQgQXV0by1OZWcgKi8KKwkJCVRMYW5fTWlpV3JpdGVSZWcoIGRldiwgcGh5LCBNSUlfR0VOX0NUTCwgMHgxMjAwICk7CisJCQkvKiBXYWl0IGZvciA0IHNlYyBmb3IgYXV0b25lZ290aWF0aW9uCisJCSAJKiB0byBjb21wbGV0ZS4gIFRoZSBtYXggc3BlYyB0aW1lIGlzIGxlc3MgdGhhbiB0aGlzCisJCSAJKiBidXQgdGhlIGNhcmQgbmVlZCBhZGRpdGlvbmFsIHRpbWUgdG8gc3RhcnQgQU4uCisJCSAJKiAuNSBzZWMgc2hvdWxkIGJlIHBsZW50eSBleHRyYS4KKwkJIAkqLworCQkJcHJpbnRrKCAiVExBTjogJXM6IFN0YXJ0aW5nIGF1dG9uZWdvdGlhdGlvbi5cbiIsIGRldi0+bmFtZSApOworCQkJVExhbl9TZXRUaW1lciggZGV2LCAoMipIWiksIFRMQU5fVElNRVJfUEhZX0ZJTklTSF9BTiApOworCQkJcmV0dXJuOworCQl9CisJCQorCX0JCisJCisJaWYgKCAoIHByaXYtPmF1aSApICYmICggcHJpdi0+cGh5TnVtICE9IDAgKSApIHsKKwkJcHJpdi0+cGh5TnVtID0gMDsKKwkJZGF0YSA9IFRMQU5fTkVUX0NGR18xRlJBRyB8IFRMQU5fTkVUX0NGR18xQ0hBTiB8IFRMQU5fTkVUX0NGR19QSFlfRU47CisJCVRMYW5fRGlvV3JpdGUxNiggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX0NPTkZJRywgZGF0YSApOworCQlUTGFuX1NldFRpbWVyKCBkZXYsICg0MCpIWi8xMDAwKSwgVExBTl9USU1FUl9QSFlfUERPV04gKTsKKwkJcmV0dXJuOworCX0gIGVsc2UgaWYgKCBwcml2LT5waHlOdW0gPT0gMCApIHsKKwkJY29udHJvbCA9IDA7CisgICAgICAgIAlUTGFuX01paVJlYWRSZWcoIGRldiwgcGh5LCBUTEFOX1RMUEhZX0NUTCwgJnRjdGwgKTsKKwkJaWYgKCBwcml2LT5hdWkgKSB7CisgICAgICAgICAgICAgICAgCXRjdGwgfD0gVExBTl9UQ19BVUlTRUw7CisJCX0gZWxzZSB7IAorICAgICAgICAgICAgICAgIAl0Y3RsICY9IH5UTEFOX1RDX0FVSVNFTDsKKwkJCWlmICggcHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0ZVTEwgKSB7CisJCQkJY29udHJvbCB8PSBNSUlfR0NfRFVQTEVYOworCQkJCXByaXYtPnRsYW5GdWxsRHVwbGV4ID0gVFJVRTsKKwkJCX0KKwkJCWlmICggcHJpdi0+c3BlZWQgPT0gVExBTl9TUEVFRF8xMDAgKSB7CisJCQkJY29udHJvbCB8PSBNSUlfR0NfU1BFRURTRUw7CisJCQl9CisJCX0KKwkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCBjb250cm9sICk7CisgICAgICAgIAlUTGFuX01paVdyaXRlUmVnKCBkZXYsIHBoeSwgVExBTl9UTFBIWV9DVEwsIHRjdGwgKTsKKwl9CisKKwkvKiBXYWl0IGZvciAyIHNlYyB0byBnaXZlIHRoZSB0cmFuc2NlaXZlciB0aW1lCisJICogdG8gZXN0YWJsaXNoIGxpbmsuCisJICovCisJVExhbl9TZXRUaW1lciggZGV2LCAoNCpIWiksIFRMQU5fVElNRVJfRklOSVNIX1JFU0VUICk7CisKK30gLyogVExhbl9QaHlTdGFydExpbmsgKi8KKworCisKKwordm9pZCBUTGFuX1BoeUZpbmlzaEF1dG9OZWcoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbwkqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTE2CQlhbl9hZHY7CisJdTE2CQlhbl9scGE7CisJdTE2CQlkYXRhOworCXUxNgkJbW9kZTsKKwl1MTYJCXBoeTsKKwl1MTYJCXN0YXR1czsKKwkKKwlwaHkgPSBwcml2LT5waHlbcHJpdi0+cGh5TnVtXTsKKworCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9HRU5fU1RTLCAmc3RhdHVzICk7CisJdWRlbGF5KCAxMDAwICk7CisJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9TVFMsICZzdGF0dXMgKTsKKworCWlmICggISAoIHN0YXR1cyAmIE1JSV9HU19BVVRPQ01QTFQgKSApIHsKKwkJLyogV2FpdCBmb3IgOCBzZWMgdG8gZ2l2ZSB0aGUgcHJvY2VzcworCQkgKiBtb3JlIHRpbWUuICBQZXJoYXBzIHdlIHNob3VsZCBmYWlsIGFmdGVyIGEgd2hpbGUuCisJCSAqLworCQkgaWYgKCFwcml2LT5uZWdfYmVfdmVyYm9zZSsrKSB7CisJCQkgcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogIEdpdmluZyBhdXRvbmVnb3RpYXRpb24gbW9yZSB0aW1lLlxuIik7CisJCSAJIHByaW50ayhLRVJOX0lORk8gIlRMQU46ICBQbGVhc2UgY2hlY2sgdGhhdCB5b3VyIGFkYXB0ZXIgaGFzXG4iKTsKKwkJIAkgcHJpbnRrKEtFUk5fSU5GTyAiVExBTjogIGJlZW4gcHJvcGVybHkgY29ubmVjdGVkIHRvIGEgSFVCIG9yIFN3aXRjaC5cbiIpOworCQkJIHByaW50ayhLRVJOX0lORk8gIlRMQU46ICBUcnlpbmcgdG8gZXN0YWJsaXNoIGxpbmsgaW4gdGhlIGJhY2tncm91bmQuLi5cbiIpOworCQkgfQorCQlUTGFuX1NldFRpbWVyKCBkZXYsICg4KkhaKSwgVExBTl9USU1FUl9QSFlfRklOSVNIX0FOICk7CisJCXJldHVybjsKKwl9CisKKwlwcmludGsoICJUTEFOOiAlczogQXV0b25lZ290aWF0aW9uIGNvbXBsZXRlLlxuIiwgZGV2LT5uYW1lICk7CisJVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0FOX0FEViwgJmFuX2FkdiApOworCVRMYW5fTWlpUmVhZFJlZyggZGV2LCBwaHksIE1JSV9BTl9MUEEsICZhbl9scGEgKTsKKwltb2RlID0gYW5fYWR2ICYgYW5fbHBhICYgMHgwM0UwOworCWlmICggbW9kZSAmIDB4MDEwMCApIHsKKwkJcHJpdi0+dGxhbkZ1bGxEdXBsZXggPSBUUlVFOworCX0gZWxzZSBpZiAoICEgKCBtb2RlICYgMHgwMDgwICkgJiYgKCBtb2RlICYgMHgwMDQwICkgKSB7CisJCXByaXYtPnRsYW5GdWxsRHVwbGV4ID0gVFJVRTsKKwl9CisKKwlpZiAoICggISAoIG1vZGUgJiAweDAxODAgKSApICYmICggcHJpdi0+YWRhcHRlci0+ZmxhZ3MgJiBUTEFOX0FEQVBURVJfVVNFX0lOVEVSTl8xMCApICYmICggcHJpdi0+cGh5TnVtICE9IDAgKSApIHsKKwkJcHJpdi0+cGh5TnVtID0gMDsKKwkJZGF0YSA9IFRMQU5fTkVUX0NGR18xRlJBRyB8IFRMQU5fTkVUX0NGR18xQ0hBTiB8IFRMQU5fTkVUX0NGR19QSFlfRU47CisJCVRMYW5fRGlvV3JpdGUxNiggZGV2LT5iYXNlX2FkZHIsIFRMQU5fTkVUX0NPTkZJRywgZGF0YSApOworCQlUTGFuX1NldFRpbWVyKCBkZXYsICg0MDAqSFovMTAwMCksIFRMQU5fVElNRVJfUEhZX1BET1dOICk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIHByaXYtPnBoeU51bSA9PSAwICkgeworCQlpZiAoICggcHJpdi0+ZHVwbGV4ID09IFRMQU5fRFVQTEVYX0ZVTEwgKSB8fCAoIGFuX2FkdiAmIGFuX2xwYSAmIDB4MDA0MCApICkgeworCQkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCBNSUlfR0NfQVVUT0VOQiB8IE1JSV9HQ19EVVBMRVggKTsKKwkJCXByaW50ayggIlRMQU46ICBTdGFydGluZyBpbnRlcm5hbCBQSFkgd2l0aCBGVUxMLURVUExFWFxuIiApOworCQl9IGVsc2UgeworCQkJVExhbl9NaWlXcml0ZVJlZyggZGV2LCBwaHksIE1JSV9HRU5fQ1RMLCBNSUlfR0NfQVVUT0VOQiApOworCQkJcHJpbnRrKCAiVExBTjogIFN0YXJ0aW5nIGludGVybmFsIFBIWSB3aXRoIEhBTEYtRFVQTEVYXG4iICk7CisJCX0KKwl9CisKKwkvKiBXYWl0IGZvciAxMDAgbXMuICBObyByZWFzb24gaW4gcGFydGl0aWN1bGFyLgorCSAqLworCVRMYW5fU2V0VGltZXIoIGRldiwgKEhaLzEwKSwgVExBTl9USU1FUl9GSU5JU0hfUkVTRVQgKTsKKwkJCit9IC8qIFRMYW5fUGh5RmluaXNoQXV0b05lZyAqLworCisjaWZkZWYgTU9OSVRPUgorCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgKgorICAgICAgICAqICAgICAgVExhbl9waHlNb25pdG9yCisgICAgICAgICoKKyAgICAgICAgKiAgICAgIFJldHVybnM6IAorICAgICAgICAqICAgICAgICAgICAgICBOb25lCisgICAgICAgICoKKyAgICAgICAgKiAgICAgIFBhcmFtczoKKyAgICAgICAgKiAgICAgICAgICAgICAgZGV2ICAgICAgICAgICAgIFRoZSBkZXZpY2Ugc3RydWN0dXJlIG9mIHRoaXMgZGV2aWNlLgorICAgICAgICAqCisgICAgICAgICogICAgICAKKyAgICAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gbW9uaXRvcnMgUEhZIGNvbmRpdGlvbiBieSByZWFkaW5nIHRoZSBzdGF0dXMKKyAgICAgICAgKiAgICAgIHJlZ2lzdGVyIHZpYSB0aGUgTUlJIGJ1cy4gVGhpcyBjYW4gYmUgdXNlZCB0byBnaXZlIGluZm8KKyAgICAgICAgKiAgICAgIGFib3V0IGxpbmsgY2hhbmdlcyAodXAvZG93biksIGFuZCBwb3NzaWJsZSBzd2l0Y2ggdG8gYWx0ZXJuYXRlCisgICAgICAgICogICAgICBtZWRpYS4KKyAgICAgICAgKgorICAgICAgICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBUTGFuX1BoeU1vbml0b3IoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdTE2ICAgICBwaHk7CisJdTE2ICAgICBwaHlfc3RhdHVzOworCisJcGh5ID0gcHJpdi0+cGh5W3ByaXYtPnBoeU51bV07CisKKyAgICAgICAgLyogR2V0IFBIWSBzdGF0dXMgcmVnaXN0ZXIgKi8KKyAgICAgICAgVExhbl9NaWlSZWFkUmVnKCBkZXYsIHBoeSwgTUlJX0dFTl9TVFMsICZwaHlfc3RhdHVzICk7CisKKyAgICAgICAgLyogQ2hlY2sgaWYgbGluayBoYXMgYmVlbiBsb3N0ICovCisgICAgICAgIGlmICghKHBoeV9zdGF0dXMgJiBNSUlfR1NfTElOSykpIHsgCisgCSAgICAgICBpZiAocHJpdi0+bGluaykgeworCQkgICAgICBwcml2LT5saW5rID0gMDsKKwkgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJUTEFOOiAlcyBoYXMgbG9zdCBsaW5rXG4iLCBkZXYtPm5hbWUpOworCSAgICAgICAgICAgICAgZGV2LT5mbGFncyAmPSB+SUZGX1JVTk5JTkc7CisJCSAgICAgIFRMYW5fU2V0VGltZXIoIGRldiwgKDIqSFopLCBUTEFOX1RJTUVSX0xJTktfQkVBVCApOworCQkgICAgICByZXR1cm47CisJCX0KKwl9CisKKyAgICAgICAgLyogTGluayByZXN0YWJsaXNoZWQ/ICovCisgICAgICAgIGlmICgocGh5X3N0YXR1cyAmIE1JSV9HU19MSU5LKSAmJiAhcHJpdi0+bGluaykgeworIAkJcHJpdi0+bGluayA9IDE7CisgICAgICAgIAlwcmludGsoS0VSTl9ERUJVRyAiVExBTjogJXMgaGFzIHJlZXN0YWJsaXNoZWQgbGlua1xuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgCWRldi0+ZmxhZ3MgfD0gSUZGX1JVTk5JTkc7CisgICAgICAgIH0KKworCS8qIFNldHVwIGEgbmV3IG1vbml0b3IgKi8KKwlUTGFuX1NldFRpbWVyKCBkZXYsICgyKkhaKSwgVExBTl9USU1FUl9MSU5LX0JFQVQgKTsKK30JCisKKyNlbmRpZiAvKiBNT05JVE9SICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCVRodW5kZXJMQU4gRHJpdmVyIE1JSSBSb3V0aW5lcworCisJVGhlc2Ugcm91dGluZXMgYXJlIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBpbiBDaGFwLiAyIG9mIHRoZQorCSJUaHVuZGVyTEFOIFByb2dyYW1tZXIncyBHdWlkZSIsIHBwLiAxNS0yNC4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fTWlpUmVhZFJlZworCSAqCisJICoJUmV0dXJuczoKKwkgKgkJMAlpZiBhY2sgcmVjZWl2ZWQgb2sKKwkgKgkJMQlvdGhlcndpc2UuCisJICoKKwkgKglQYXJtczoKKwkgKgkJZGV2CQlUaGUgZGV2aWNlIHN0cnVjdHVyZSBjb250YWluaW5nCisJICoJCQkJVGhlIGlvIGFkZHJlc3MgYW5kIGludGVycnVwdCBjb3VudAorCSAqCQkJCWZvciB0aGlzIGRldmljZS4KKwkgKgkJcGh5CQlUaGUgYWRkcmVzcyBvZiB0aGUgUEhZIHRvIGJlIHF1ZXJpZWQuCisJICoJCXJlZwkJVGhlIHJlZ2lzdGVyIHdob3NlIGNvbnRlbnRzIGFyZSB0byBiZQorCSAqCQkJCXJldHJlaXZlZC4KKwkgKgkJdmFsCQlBIHBvaW50ZXIgdG8gYSB2YXJpYWJsZSB0byBzdG9yZSB0aGUKKwkgKgkJCQlyZXRyaWV2ZWQgdmFsdWUuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIFRMQU4ncyBNSUkgYnVzIHRvIHJldHJlaXZlIHRoZSBjb250ZW50cworCSAqCW9mIGEgZ2l2ZW4gcmVnaXN0ZXIgb24gYSBQSFkuICBJdCBzZW5kcyB0aGUgYXBwcm9wcmlhdGUgaW5mbworCSAqCWFuZCB0aGVuIHJlYWRzIHRoZSAxNi1iaXQgcmVnaXN0ZXIgdmFsdWUgZnJvbSB0aGUgTUlJIGJ1cyB2aWEKKwkgKgl0aGUgVExBTiBTSU8gcmVnaXN0ZXIuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBUTGFuX01paVJlYWRSZWcoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBwaHksIHUxNiByZWcsIHUxNiAqdmFsICkKK3sKKwl1OAluYWNrOworCXUxNglzaW8sIHRtcDsKKyAJdTMyCWk7CisJaW50CWVycjsKKwlpbnQJbWludGVuOworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwllcnIgPSBGQUxTRTsKKwlvdXR3KFRMQU5fTkVUX1NJTywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCXNpbyA9IGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKwkKKwlpZiAoIWluX2lycSgpKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJVExhbl9NaWlTeW5jKGRldi0+YmFzZV9hZGRyKTsKKworCW1pbnRlbiA9IFRMYW5fR2V0Qml0KCBUTEFOX05FVF9TSU9fTUlOVEVOLCBzaW8gKTsKKwlpZiAoIG1pbnRlbiApCisJCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01JTlRFTiwgc2lvKTsKKworCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCAweDEsIDIgKTsJLyogU3RhcnQgKCAwMWIgKSAqLworCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCAweDIsIDIgKTsJLyogUmVhZCAgKCAxMGIgKSAqLworCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCBwaHksIDUgKTsJLyogRGV2aWNlICMgICAgICAqLworCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCByZWcsIDUgKTsJLyogUmVnaXN0ZXIgIyAgICAqLworCisKKwlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NVFhFTiwgc2lvKTsJCS8qIENoYW5nZSBkaXJlY3Rpb24gKi8KKworCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CQkvKiBDbG9jayBJZGxlIGJpdCAqLworCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCVRMYW5fQ2xlYXJCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CQkvKiBXYWl0IDMwMG5zICovCisKKwluYWNrID0gVExhbl9HZXRCaXQoVExBTl9ORVRfU0lPX01EQVRBLCBzaW8pOwkvKiBDaGVjayBmb3IgQUNLICovCisJVExhbl9TZXRCaXQoVExBTl9ORVRfU0lPX01DTEssIHNpbyk7CQkvKiBGaW5pc2ggQUNLICovCisJaWYgKG5hY2spIHsJCQkJCS8qIE5vIEFDSywgc28gZmFrZSBpdCAqLworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJVExhbl9DbGVhckJpdChUTEFOX05FVF9TSU9fTUNMSywgc2lvKTsKKwkJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCQl9CisJCXRtcCA9IDB4ZmZmZjsKKwkJZXJyID0gVFJVRTsKKwl9IGVsc2UgewkJCQkJLyogQUNLLCBzbyByZWFkIGRhdGEgKi8KKwkJZm9yICh0bXAgPSAwLCBpID0gMHg4MDAwOyBpOyBpID4+PSAxKSB7CisJCQlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCQkJaWYgKFRMYW5fR2V0Qml0KFRMQU5fTkVUX1NJT19NREFUQSwgc2lvKSkKKwkJCQl0bXAgfD0gaTsKKwkJCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCQl9CisJfQorCisKKwlUTGFuX0NsZWFyQml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOwkJLyogSWRsZSBjeWNsZSAqLworCVRMYW5fU2V0Qml0KFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8pOworCisJaWYgKCBtaW50ZW4gKQorCQlUTGFuX1NldEJpdChUTEFOX05FVF9TSU9fTUlOVEVOLCBzaW8pOworCisJKnZhbCA9IHRtcDsKKwkKKwlpZiAoIWluX2lycSgpKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXJyOworCit9IC8qIFRMYW5fTWlpUmVhZFJlZyAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fTWlpU2VuZERhdGEKKwkgKgorCSAqCVJldHVybnM6CisJICoJCU5vdGhpbmcKKwkgKglQYXJtczoKKwkgKgkJYmFzZV9wb3J0CVRoZSBiYXNlIElPIHBvcnQgb2YgdGhlIGFkYXB0ZXIJaW4KKwkgKgkJCQlxdWVzdGlvbi4KKwkgKgkJZGV2CQlUaGUgYWRkcmVzcyBvZiB0aGUgUEhZIHRvIGJlIHF1ZXJpZWQuCisJICoJCWRhdGEJCVRoZSB2YWx1ZSB0byBiZSBwbGFjZWQgb24gdGhlIE1JSSBidXMuCisJICoJCW51bV9iaXRzCVRoZSBudW1iZXIgb2YgYml0cyBpbiBkYXRhIHRoYXQgYXJlIHRvCisJICoJCQkJYmUgcGxhY2VkIG9uIHRoZSBNSUkgYnVzLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBzZW5kcyBvbiBzZXF1ZW5jZSBvZiBiaXRzIG9uIHRoZSBNSUkKKwkgKgljb25maWd1cmF0aW9uIGJ1cy4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBUTGFuX01paVNlbmREYXRhKCB1MTYgYmFzZV9wb3J0LCB1MzIgZGF0YSwgdW5zaWduZWQgbnVtX2JpdHMgKQoreworCXUxNiBzaW87CisJdTMyIGk7CisKKwlpZiAoIG51bV9iaXRzID09IDAgKQorCQlyZXR1cm47CisKKwlvdXR3KCBUTEFOX05FVF9TSU8sIGJhc2VfcG9ydCArIFRMQU5fRElPX0FEUiApOworCXNpbyA9IGJhc2VfcG9ydCArIFRMQU5fRElPX0RBVEEgKyBUTEFOX05FVF9TSU87CisJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19NVFhFTiwgc2lvICk7CisKKwlmb3IgKCBpID0gKCAweDEgPDwgKCBudW1fYml0cyAtIDEgKSApOyBpOyBpID4+PSAxICkgeworCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fTUNMSywgc2lvICk7CisJCSh2b2lkKSBUTGFuX0dldEJpdCggVExBTl9ORVRfU0lPX01DTEssIHNpbyApOworCQlpZiAoIGRhdGEgJiBpICkKKwkJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fTURBVEEsIHNpbyApOworCQllbHNlCisJCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fTURBVEEsIHNpbyApOworCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX01DTEssIHNpbyApOworCQkodm9pZCkgVExhbl9HZXRCaXQoIFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8gKTsKKwl9CisKK30gLyogVExhbl9NaWlTZW5kRGF0YSAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fTWlpU3luYworCSAqCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQliYXNlX3BvcnQJVGhlIGJhc2UgSU8gcG9ydCBvZiB0aGUgYWRhcHRlciBpbgorCSAqCQkJCXF1ZXN0aW9uLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbnMgc3luY3MgYWxsIFBIWXMgaW4gdGVybXMgb2YgdGhlIE1JSSBjb25maWd1cmF0aW9uCisJICoJYnVzLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fTWlpU3luYyggdTE2IGJhc2VfcG9ydCApCit7CisJaW50IGk7CisJdTE2IHNpbzsKKworCW91dHcoIFRMQU5fTkVUX1NJTywgYmFzZV9wb3J0ICsgVExBTl9ESU9fQURSICk7CisJc2lvID0gYmFzZV9wb3J0ICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKworCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19NVFhFTiwgc2lvICk7CisJZm9yICggaSA9IDA7IGkgPCAzMjsgaSsrICkgeworCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fTUNMSywgc2lvICk7CisJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fTUNMSywgc2lvICk7CisJfQorCit9IC8qIFRMYW5fTWlpU3luYyAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fTWlpV3JpdGVSZWcKKwkgKgorCSAqCVJldHVybnM6CisJICoJCU5vdGhpbmcKKwkgKglQYXJtczoKKwkgKgkJZGV2CQlUaGUgZGV2aWNlIHN0cnVjdHVyZSBmb3IgdGhlIGRldmljZQorCSAqCQkJCXRvIHdyaXRlIHRvLgorCSAqCQlwaHkJCVRoZSBhZGRyZXNzIG9mIHRoZSBQSFkgdG8gYmUgd3JpdHRlbiB0by4KKwkgKgkJcmVnCQlUaGUgcmVnaXN0ZXIgd2hvc2UgY29udGVudHMgYXJlIHRvIGJlCisJICoJCQkJd3JpdHRlbi4KKwkgKgkJdmFsCQlUaGUgdmFsdWUgdG8gYmUgd3JpdHRlbiB0byB0aGUgcmVnaXN0ZXIuCisJICoKKwkgKglUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIFRMQU4ncyBNSUkgYnVzIHRvIHdyaXRlIHRoZSBjb250ZW50cyBvZiBhCisJICoJZ2l2ZW4gcmVnaXN0ZXIgb24gYSBQSFkuICBJdCBzZW5kcyB0aGUgYXBwcm9wcmlhdGUgaW5mbyBhbmQgdGhlbgorCSAqCXdyaXRlcyB0aGUgMTYtYml0IHJlZ2lzdGVyIHZhbHVlIGZyb20gdGhlIE1JSSBjb25maWd1cmF0aW9uIGJ1cworCSAqCXZpYSB0aGUgVExBTiBTSU8gcmVnaXN0ZXIuCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgVExhbl9NaWlXcml0ZVJlZyggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHBoeSwgdTE2IHJlZywgdTE2IHZhbCApCit7CisJdTE2CXNpbzsKKwlpbnQJbWludGVuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCVRMYW5Qcml2YXRlSW5mbyAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlvdXR3KFRMQU5fTkVUX1NJTywgZGV2LT5iYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCXNpbyA9IGRldi0+YmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKwkKKwlpZiAoIWluX2lycSgpKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJVExhbl9NaWlTeW5jKCBkZXYtPmJhc2VfYWRkciApOworCisJbWludGVuID0gVExhbl9HZXRCaXQoIFRMQU5fTkVUX1NJT19NSU5URU4sIHNpbyApOworCWlmICggbWludGVuICkKKwkJVExhbl9DbGVhckJpdCggVExBTl9ORVRfU0lPX01JTlRFTiwgc2lvICk7CisKKwlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgMHgxLCAyICk7CS8qIFN0YXJ0ICggMDFiICkgKi8KKwlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgMHgxLCAyICk7CS8qIFdyaXRlICggMDFiICkgKi8KKwlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgcGh5LCA1ICk7CS8qIERldmljZSAjICAgICAgKi8KKwlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgcmVnLCA1ICk7CS8qIFJlZ2lzdGVyICMgICAgKi8KKworCVRMYW5fTWlpU2VuZERhdGEoIGRldi0+YmFzZV9hZGRyLCAweDIsIDIgKTsJLyogU2VuZCBBQ0sgKi8KKwlUTGFuX01paVNlbmREYXRhKCBkZXYtPmJhc2VfYWRkciwgdmFsLCAxNiApOwkvKiBTZW5kIERhdGEgKi8KKworCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19NQ0xLLCBzaW8gKTsJLyogSWRsZSBjeWNsZSAqLworCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fTUNMSywgc2lvICk7CisKKwlpZiAoIG1pbnRlbiApCisJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fTUlOVEVOLCBzaW8gKTsKKwkKKwlpZiAoIWluX2lycSgpKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKK30gLyogVExhbl9NaWlXcml0ZVJlZyAqLworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJVGh1bmRlckxBTiBEcml2ZXIgRWVwcm9tIHJvdXRpbmVzCisKKwlUaGUgQ29tcGFxIE5ldGVsbGlnZW50IDEwIGFuZCAxMC8xMDAgY2FyZHMgdXNlIGEgTWljcm9jaGlwIDI0QzAyQQorCUVFUFJPTS4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgYmFzZWQgb24gaW5mb3JtYXRpb24gaW4gTWljcm9jaGlwJ3MKKwlkYXRhIHNoZWV0LiAgSSBkb24ndCBrbm93IGhvdyB3ZWxsIHRoaXMgZnVuY3Rpb25zIHdpbGwgd29yayB3aXRoCisJb3RoZXIgRUVQUk9Ncy4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fRWVTZW5kU3RhcnQKKwkgKgorCSAqCVJldHVybnM6CisJICoJCU5vdGhpbmcKKwkgKglQYXJtczoJCisJICoJCWlvX2Jhc2UJCVRoZSBJTyBwb3J0IGJhc2UgYWRkcmVzcyBmb3IgdGhlCisJICoJCQkJVExBTiBkZXZpY2Ugd2l0aCB0aGUgRUVQUk9NIHRvCisJICoJCQkJdXNlLgorCSAqCisJICoJVGhpcyBmdW5jdGlvbiBzZW5kcyBhIHN0YXJ0IGN5Y2xlIHRvIGFuIEVFUFJPTSBhdHRhY2hlZAorCSAqCXRvIGEgVExBTiBjaGlwLgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fRWVTZW5kU3RhcnQoIHUxNiBpb19iYXNlICkKK3sKKwl1MTYJc2lvOworCisJb3V0dyggVExBTl9ORVRfU0lPLCBpb19iYXNlICsgVExBTl9ESU9fQURSICk7CisJc2lvID0gaW9fYmFzZSArIFRMQU5fRElPX0RBVEEgKyBUTEFOX05FVF9TSU87CisKKwlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKKwlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VEQVRBLCBzaW8gKTsKKwlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VUWEVOLCBzaW8gKTsKKwlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOworCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7CisKK30gLyogVExhbl9FZVNlbmRTdGFydCAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fRWVTZW5kQnl0ZQorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJSWYgdGhlIGNvcnJlY3QgYWNrIHdhcyByZWNlaXZlZCwgMCwgb3RoZXJ3aXNlIDEKKwkgKglQYXJtczoJaW9fYmFzZQkJVGhlIElPIHBvcnQgYmFzZSBhZGRyZXNzIGZvciB0aGUKKwkgKgkJCQlUTEFOIGRldmljZSB3aXRoIHRoZSBFRVBST00gdG8KKwkgKgkJCQl1c2UuCisJICoJCWRhdGEJCVRoZSA4IGJpdHMgb2YgaW5mb3JtYXRpb24gdG8KKwkgKgkJCQlzZW5kIHRvIHRoZSBFRVBST00uCisJICoJCXN0b3AJCUlmIFRMQU5fRUVQUk9NX1NUT1AgaXMgcGFzc2VkLCBhCisJICoJCQkJc3RvcCBjeWNsZSBpcyBzZW50IGFmdGVyIHRoZQorCSAqCQkJCWJ5dGUgaXMgc2VudCBhZnRlciB0aGUgYWNrIGlzCisJICoJCQkJcmVhZC4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gc2VuZHMgYSBieXRlIG9uIHRoZSBzZXJpYWwgRUVQUk9NIGxpbmUsCisJICoJZHJpdmluZyB0aGUgY2xvY2sgdG8gc2VuZCBlYWNoIGJpdC4gVGhlIGZ1bmN0aW9uIHRoZW4KKwkgKglyZXZlcnNlcyB0cmFuc21pc3Npb24gZGlyZWN0aW9uIGFuZCByZWFkcyBhbiBhY2tub3dsZWRnZQorCSAqCWJpdC4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IFRMYW5fRWVTZW5kQnl0ZSggdTE2IGlvX2Jhc2UsIHU4IGRhdGEsIGludCBzdG9wICkKK3sKKwlpbnQJZXJyOworCXU4CXBsYWNlOworCXUxNglzaW87CisKKwlvdXR3KCBUTEFOX05FVF9TSU8sIGlvX2Jhc2UgKyBUTEFOX0RJT19BRFIgKTsKKwlzaW8gPSBpb19iYXNlICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKworCS8qIEFzc3VtZSBjbG9jayBpcyBsb3csIHR4IGlzIGVuYWJsZWQ7ICovCisJZm9yICggcGxhY2UgPSAweDgwOyBwbGFjZSAhPSAwOyBwbGFjZSA+Pj0gMSApIHsKKwkJaWYgKCBwbGFjZSAmIGRhdGEgKQorCQkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICk7CisJCWVsc2UKKwkJCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICk7CisJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCX0KKwlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRVRYRU4sIHNpbyApOworCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCWVyciA9IFRMYW5fR2V0Qml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOworCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7CisJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FVFhFTiwgc2lvICk7CisKKwlpZiAoICggISBlcnIgKSAmJiBzdG9wICkgeworCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOwkvKiBTVE9QLCByYWlzZSBkYXRhIHdoaWxlIGNsb2NrIGlzIGhpZ2ggKi8KKwkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7CisJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOworCX0KKworCXJldHVybiAoIGVyciApOworCit9IC8qIFRMYW5fRWVTZW5kQnl0ZSAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fRWVSZWNlaXZlQnl0ZQorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJTm90aGluZworCSAqCVBhcm1zOgorCSAqCQlpb19iYXNlCQlUaGUgSU8gcG9ydCBiYXNlIGFkZHJlc3MgZm9yIHRoZQorCSAqCQkJCVRMQU4gZGV2aWNlIHdpdGggdGhlIEVFUFJPTSB0bworCSAqCQkJCXVzZS4KKwkgKgkJZGF0YQkJQW4gYWRkcmVzcyB0byBhIGNoYXIgdG8gaG9sZCB0aGUKKwkgKgkJCQlkYXRhIHNlbnQgZnJvbSB0aGUgRUVQUk9NLgorCSAqCQlzdG9wCQlJZiBUTEFOX0VFUFJPTV9TVE9QIGlzIHBhc3NlZCwgYQorCSAqCQkJCXN0b3AgY3ljbGUgaXMgc2VudCBhZnRlciB0aGUKKwkgKgkJCQlieXRlIGlzIHJlY2VpdmVkLCBhbmQgbm8gYWNrIGlzCisJICoJCQkJc2VudC4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gcmVjZWl2ZXMgOCBiaXRzIG9mIGRhdGEgZnJvbSB0aGUgRUVQUk9NCisJICoJb3ZlciB0aGUgc2VyaWFsIGxpbmsuICBJdCB0aGVuIHNlbmRzIGFuZCBhY2sgYml0LCBvciBubworCSAqCWFjayBhbmQgYSBzdG9wIGJpdC4gIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXRyaWV2ZQorCSAqCWRhdGEgYWZ0ZXIgdGhlIGFkZHJlc3Mgb2YgYSBieXRlIGluIHRoZSBFRVBST00gaGFzIGJlZW4KKwkgKglzZW50LgorCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFRMYW5fRWVSZWNlaXZlQnl0ZSggdTE2IGlvX2Jhc2UsIHU4ICpkYXRhLCBpbnQgc3RvcCApCit7CisJdTggIHBsYWNlOworCXUxNiBzaW87CisKKwlvdXR3KCBUTEFOX05FVF9TSU8sIGlvX2Jhc2UgKyBUTEFOX0RJT19BRFIgKTsKKwlzaW8gPSBpb19iYXNlICsgVExBTl9ESU9fREFUQSArIFRMQU5fTkVUX1NJTzsKKwkqZGF0YSA9IDA7CisKKwkvKiBBc3N1bWUgY2xvY2sgaXMgbG93LCB0eCBpcyBlbmFibGVkOyAqLworCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FVFhFTiwgc2lvICk7CisJZm9yICggcGxhY2UgPSAweDgwOyBwbGFjZTsgcGxhY2UgPj49IDEgKSB7CisJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCQlpZiAoIFRMYW5fR2V0Qml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApICkKKwkJCSpkYXRhIHw9IHBsYWNlOworCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCX0KKworCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRVRYRU4sIHNpbyApOworCWlmICggISBzdG9wICkgeworCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOwkvKiBBY2sgPSAwICovCisJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCQlUTGFuX0NsZWFyQml0KCBUTEFOX05FVF9TSU9fRUNMT0ssIHNpbyApOworCX0gZWxzZSB7CisJCVRMYW5fU2V0Qml0KCBUTEFOX05FVF9TSU9fRURBVEEsIHNpbyApOwkJLyogTm8gYWNrID0gMSAoPykgKi8KKwkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7CisJCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FQ0xPSywgc2lvICk7CisJCVRMYW5fQ2xlYXJCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICk7CS8qIFNUT1AsIHJhaXNlIGRhdGEgd2hpbGUgY2xvY2sgaXMgaGlnaCAqLworCQlUTGFuX1NldEJpdCggVExBTl9ORVRfU0lPX0VDTE9LLCBzaW8gKTsKKwkJVExhbl9TZXRCaXQoIFRMQU5fTkVUX1NJT19FREFUQSwgc2lvICk7CisJfQorCit9IC8qIFRMYW5fRWVSZWNlaXZlQnl0ZSAqLworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqCVRMYW5fRWVSZWFkQnl0ZQorCSAqCisJICoJUmV0dXJuczoKKwkgKgkJTm8gZXJyb3IgPSAwLCBlbHNlLCB0aGUgc3RhZ2UgYXQgd2hpY2ggdGhlIGVycm9yCisJICoJCW9jY3VycmVkLgorCSAqCVBhcm1zOgorCSAqCQlpb19iYXNlCQlUaGUgSU8gcG9ydCBiYXNlIGFkZHJlc3MgZm9yIHRoZQorCSAqCQkJCVRMQU4gZGV2aWNlIHdpdGggdGhlIEVFUFJPTSB0bworCSAqCQkJCXVzZS4KKwkgKgkJZWVfYWRkcgkJVGhlIGFkZHJlc3Mgb2YgdGhlIGJ5dGUgaW4gdGhlCisJICoJCQkJRUVQUk9NIHdob3NlIGNvbnRlbnRzIGFyZSB0byBiZQorCSAqCQkJCXJldHJpZXZlZC4KKwkgKgkJZGF0YQkJQW4gYWRkcmVzcyB0byBhIGNoYXIgdG8gaG9sZCB0aGUKKwkgKgkJCQlkYXRhIG9idGFpbmVkIGZyb20gdGhlIEVFUFJPTS4KKwkgKgorCSAqCVRoaXMgZnVuY3Rpb24gcmVhZHMgYSBieXRlIG9mIGluZm9ybWF0aW9uIGZyb20gYW4gYnl0ZQorCSAqCWNlbGwgaW4gdGhlIEVFUFJPTS4KKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IFRMYW5fRWVSZWFkQnl0ZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggZWVfYWRkciwgdTggKmRhdGEgKQoreworCWludCBlcnI7CisJVExhblByaXZhdGVJbmZvICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlpbnQgcmV0PTA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJVExhbl9FZVNlbmRTdGFydCggZGV2LT5iYXNlX2FkZHIgKTsKKwllcnIgPSBUTGFuX0VlU2VuZEJ5dGUoIGRldi0+YmFzZV9hZGRyLCAweEEwLCBUTEFOX0VFUFJPTV9BQ0sgKTsKKwlpZiAoZXJyKQorCXsKKwkJcmV0PTE7CisJCWdvdG8gZmFpbDsKKwl9CisJZXJyID0gVExhbl9FZVNlbmRCeXRlKCBkZXYtPmJhc2VfYWRkciwgZWVfYWRkciwgVExBTl9FRVBST01fQUNLICk7CisJaWYgKGVycikKKwl7CisJCXJldD0yOworCQlnb3RvIGZhaWw7CisJfQorCVRMYW5fRWVTZW5kU3RhcnQoIGRldi0+YmFzZV9hZGRyICk7CisJZXJyID0gVExhbl9FZVNlbmRCeXRlKCBkZXYtPmJhc2VfYWRkciwgMHhBMSwgVExBTl9FRVBST01fQUNLICk7CisJaWYgKGVycikKKwl7CisJCXJldD0zOworCQlnb3RvIGZhaWw7CisJfQorCVRMYW5fRWVSZWNlaXZlQnl0ZSggZGV2LT5iYXNlX2FkZHIsIGRhdGEsIFRMQU5fRUVQUk9NX1NUT1AgKTsKK2ZhaWw6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKKworfSAvKiBUTGFuX0VlUmVhZEJ5dGUgKi8KKworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RsYW4uaCBiL2RyaXZlcnMvbmV0L3RsYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDMyYmM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdGxhbi5oCkBAIC0wLDAgKzEsNTQwIEBACisjaWZuZGVmIFRMQU5fSAorI2RlZmluZSBUTEFOX0gKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBMaW51eCBUaHVuZGVyTEFOIERyaXZlcgorICoKKyAqICB0bGFuLmgKKyAqICBieSBKYW1lcyBCYW5rcworICoKKyAqICAoQykgMTk5Ny0xOTk4IENhbGRlcmEsIEluYy4KKyAqICAoQykgMTk5OS0yMDAxIFRvcmJlbiBNYXRoaWFzZW4KKyAqIAorICogIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqKiBUaGlzIGZpbGUgaXMgYmVzdCB2aWV3ZWQvZWRpdGVkIHdpdGggdGFic3RvcD00LCBjb2x1bXM+PTEzMgorICoKKyAqICAKKyAqICBEZWMgMTAsIDE5OTkJVG9yYmVuIE1hdGhpYXNlbiA8dG9yYmVuLm1hdGhpYXNlbkBjb21wYXEuY29tPgorICoJCQlOZXcgTWFpbnRhaW5lcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogVExhbiBEZWZpbml0aW9ucworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRkFMU0UJCQkwCisjZGVmaW5lIFRSVUUJCQkxCisKKyNkZWZpbmUgVExBTl9NSU5fRlJBTUVfU0laRQk2NAorI2RlZmluZSBUTEFOX01BWF9GUkFNRV9TSVpFCTE2MDAKKworI2RlZmluZSBUTEFOX05VTV9SWF9MSVNUUwkzMgorI2RlZmluZSBUTEFOX05VTV9UWF9MSVNUUwk2NAorCisjZGVmaW5lIFRMQU5fSUdOT1JFCQkwCisjZGVmaW5lIFRMQU5fUkVDT1JECQkxCisKKyNkZWZpbmUgVExBTl9EQkcobHZsLCBmb3JtYXQsIGFyZ3MuLi4pCWlmIChkZWJ1ZyZsdmwpIHByaW50ayhLRVJOX0RFQlVHICJUTEFOOiAiIGZvcm1hdCwgIyNhcmdzICk7CisjZGVmaW5lIFRMQU5fREVCVUdfR05STAkJMHgwMDAxCisjZGVmaW5lIFRMQU5fREVCVUdfVFgJCTB4MDAwMgorI2RlZmluZSBUTEFOX0RFQlVHX1JYCQkweDAwMDQgCisjZGVmaW5lIFRMQU5fREVCVUdfTElTVAkJMHgwMDA4CisjZGVmaW5lIFRMQU5fREVCVUdfUFJPQkUJMHgwMDEwCisKKyNkZWZpbmUgVFhfVElNRU9VVAkJKDEwKkhaKQkgLyogV2UgbmVlZCB0aW1lIGZvciBhdXRvLW5lZyAqLworI2RlZmluZSBNQVhfVExBTl9CT0FSRFMJCTgJIC8qIE1heCBudW1iZXIgb2YgYm9hcmRzIGluc3RhbGxlZCBhdCBhIHRpbWUgKi8KKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogRGV2aWNlIElkZW50aWZpY2F0aW9uIERlZmluaXRpb25zCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkJCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVURUxMSUdFTlRfMTBfVDIJCQkweEIwMTIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ORVRFTExJR0VOVF8xMF8xMDBfV1NfNTEwMAkweEIwMzAKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMTgzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjE4MwkJCTB4MDAxMworI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfT0xJQ09NX09DMjMyNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIzMjUJCQkweDAwMTIKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX09MSUNPTV9PQzIzMjYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9PTElDT01fT0MyMzI2CQkJMHgwMDE0CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgdGxhbl9hZGFwdGVyX2VudHJ5IHsKKwl1MTYJdmVuZG9ySWQ7CisJdTE2CWRldmljZUlkOworCWNoYXIJKmRldmljZUxhYmVsOworCXUzMglmbGFnczsKKwl1MTYJYWRkck9mczsKK30gVExhbkFkYXB0ZXJFbnRyeTsKKworI2RlZmluZSBUTEFOX0FEQVBURVJfTk9ORQkJMHgwMDAwMDAwMAorI2RlZmluZSBUTEFOX0FEQVBURVJfVU5NQU5BR0VEX1BIWQkweDAwMDAwMDAxCisjZGVmaW5lIFRMQU5fQURBUFRFUl9CSVRfUkFURV9QSFkJMHgwMDAwMDAwMgorI2RlZmluZSBUTEFOX0FEQVBURVJfVVNFX0lOVEVSTl8xMAkweDAwMDAwMDA0CisjZGVmaW5lIFRMQU5fQURBUFRFUl9BQ1RJVklUWV9MRUQJMHgwMDAwMDAwOAorCisjZGVmaW5lIFRMQU5fU1BFRURfREVGQVVMVAkwCisjZGVmaW5lIFRMQU5fU1BFRURfMTAJCTEwCisjZGVmaW5lIFRMQU5fU1BFRURfMTAwCQkxMDAKKworI2RlZmluZSBUTEFOX0RVUExFWF9ERUZBVUxUCTAKKyNkZWZpbmUgVExBTl9EVVBMRVhfSEFMRgkxCisjZGVmaW5lIFRMQU5fRFVQTEVYX0ZVTEwJMgorCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEVJU0EgRGVmaW5pdGlvbnMKKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEVJU0FfSUQgICAgICAweGM4MCAgIC8qIEVJU0EgSUQgUmVnaXN0ZXJzICovIAorI2RlZmluZSBFSVNBX0lEMCAgICAgMHhjODAgICAvKiBFSVNBIElEIFJlZ2lzdGVyIDAgKi8gCisjZGVmaW5lIEVJU0FfSUQxICAgICAweGM4MSAgIC8qIEVJU0EgSUQgUmVnaXN0ZXIgMSAqLyAKKyNkZWZpbmUgRUlTQV9JRDIgICAgIDB4YzgyICAgLyogRUlTQSBJRCBSZWdpc3RlciAyICovIAorI2RlZmluZSBFSVNBX0lEMyAgICAgMHhjODMgICAvKiBFSVNBIElEIFJlZ2lzdGVyIDMgKi8gCisjZGVmaW5lIEVJU0FfQ1IgICAgICAweGM4NCAgIC8qIEVJU0EgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBFSVNBX1JFRzAgICAgMHhjODggICAvKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMCAqLworI2RlZmluZSBFSVNBX1JFRzEgICAgMHhjODkgICAvKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMSAqLworI2RlZmluZSBFSVNBX1JFRzIgICAgMHhjOGEgICAvKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworI2RlZmluZSBFSVNBX1JFRzMgICAgMHhjOGYgICAvKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMyAqLworI2RlZmluZSBFSVNBX0FQUk9NICAgMHhjOTAgICAvKiBFdGhlcm5ldCBBZGRyZXNzIFBST00gKi8KKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBSeC9UeCBMaXN0IERlZmluaXRpb25zCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUTEFOX0JVRkZFUlNfUEVSX0xJU1QJMTAKKyNkZWZpbmUgVExBTl9MQVNUX0JVRkZFUgkweDgwMDAwMDAwCisjZGVmaW5lIFRMQU5fQ1NUQVRfVU5VU0VECTB4ODAwMAorI2RlZmluZSBUTEFOX0NTVEFUX0ZSTV9DTVAJMHg0MDAwCisjZGVmaW5lIFRMQU5fQ1NUQVRfUkVBRFkJMHgzMDAwCisjZGVmaW5lIFRMQU5fQ1NUQVRfRU9DCQkweDA4MDAKKyNkZWZpbmUgVExBTl9DU1RBVF9SWF9FUlJPUgkweDA0MDAKKyNkZWZpbmUgVExBTl9DU1RBVF9QQVNTX0NSQwkweDAyMDAKKyNkZWZpbmUgVExBTl9DU1RBVF9EUF9QUgkweDAxMDAKKworCit0eXBlZGVmIHN0cnVjdCB0bGFuX2J1ZmZlcl9yZWZfdGFnIHsKKwl1MzIJY291bnQ7CisJdTMyCWFkZHJlc3M7Cit9IFRMYW5CdWZmZXJSZWY7CisKKwordHlwZWRlZiBzdHJ1Y3QgdGxhbl9saXN0X3RhZyB7CisJdTMyCQlmb3J3YXJkOworCXUxNgkJY1N0YXQ7CisJdTE2CQlmcmFtZVNpemU7CisJVExhbkJ1ZmZlclJlZglidWZmZXJbVExBTl9CVUZGRVJTX1BFUl9MSVNUXTsKK30gVExhbkxpc3Q7CisKKwordHlwZWRlZiB1OCBUTGFuQnVmZmVyW1RMQU5fTUFYX0ZSQU1FX1NJWkVdOworCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogUEhZIGRlZmluaXRpb25zCisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUTEFOX1BIWV9NQVhfQUREUgkweDFGCisjZGVmaW5lIFRMQU5fUEhZX05PTkUJCTB4MjAKKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFRMQU4gUHJpdmF0ZSBJbmZvcm1hdGlvbiBTdHJ1Y3R1cmUKKwkgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCB0bGFuX3ByaXZhdGVfdGFnIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAqbmV4dERldmljZTsKKwlzdHJ1Y3QgcGNpX2RldgkJKnBjaURldjsKKwl2b2lkCQkJKmRtYVN0b3JhZ2U7CisJZG1hX2FkZHJfdAkJZG1hU3RvcmFnZURNQTsKKwl1bnNpZ25lZCBpbnQJCWRtYVNpemU7CisJdTgJCQkqcGFkQnVmZmVyOworCVRMYW5MaXN0ICAgICAgICAgICAgICAgICpyeExpc3Q7CisJZG1hX2FkZHJfdAkJcnhMaXN0RE1BOworCXU4CQkJKnJ4QnVmZmVyOworCWRtYV9hZGRyX3QJCXJ4QnVmZmVyRE1BOworCXUzMiAgICAgICAgICAgICAgICAgICAgIHJ4SGVhZDsKKwl1MzIgICAgICAgICAgICAgICAgICAgICByeFRhaWw7CisJdTMyCQkJcnhFb2NDb3VudDsKKwlUTGFuTGlzdCAgICAgICAgICAgICAgICAqdHhMaXN0OworCWRtYV9hZGRyX3QJCXR4TGlzdERNQTsKKwl1OAkJCSp0eEJ1ZmZlcjsKKwlkbWFfYWRkcl90CQl0eEJ1ZmZlckRNQTsKKwl1MzIgICAgICAgICAgICAgICAgICAgICB0eEhlYWQ7CisJdTMyICAgICAgICAgICAgICAgICAgICAgdHhJblByb2dyZXNzOworCXUzMiAgICAgICAgICAgICAgICAgICAgIHR4VGFpbDsKKwl1MzIJCQl0eEJ1c3lDb3VudDsKKwl1MzIgICAgICAgICAgICAgICAgICAgICBwaHlPbmxpbmU7CisJdTMyCQkJdGltZXJTZXRBdDsKKwl1MzIJCQl0aW1lclR5cGU7CisJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CisJc3RydWN0IGJvYXJkCQkqYWRhcHRlcjsKKwl1MzIJCQlhZGFwdGVyUmV2OworCXUzMgkJCWF1aTsKKwl1MzIJCQlkZWJ1ZzsKKwl1MzIJCQlkdXBsZXg7CisJdTMyCQkJcGh5WzJdOworCXUzMgkJCXBoeU51bTsKKwl1MzIJCQlzcGVlZDsKKwl1OAkJCXRsYW5SZXY7CisJdTgJCQl0bGFuRnVsbER1cGxleDsKKwljaGFyICAgICAgICAgICAgICAgICAgICBkZXZOYW1lWzhdOworCXNwaW5sb2NrX3QJCWxvY2s7CisJdTgJCQlsaW5rOworCXU4CQkJaXNfZWlzYTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCQl0bGFuX3RxdWV1ZTsKKwl1OAkJCW5lZ19iZV92ZXJib3NlOworfSBUTGFuUHJpdmF0ZUluZm87CisKKworCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBUTGFuIERyaXZlciBUaW1lciBEZWZpbml0aW9ucworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVExBTl9USU1FUl9MSU5LX0JFQVQJCTEKKyNkZWZpbmUgVExBTl9USU1FUl9BQ1RJVklUWQkJMgorI2RlZmluZSBUTEFOX1RJTUVSX1BIWV9QRE9XTgkJMworI2RlZmluZSBUTEFOX1RJTUVSX1BIWV9QVVAJCTQKKyNkZWZpbmUgVExBTl9USU1FUl9QSFlfUkVTRVQJCTUKKyNkZWZpbmUgVExBTl9USU1FUl9QSFlfU1RBUlRfTElOSwk2CisjZGVmaW5lIFRMQU5fVElNRVJfUEhZX0ZJTklTSF9BTgk3CisjZGVmaW5lIFRMQU5fVElNRVJfRklOSVNIX1JFU0VUCQk4CisKKyNkZWZpbmUgVExBTl9USU1FUl9BQ1RfREVMQVkJCShIWi8xMCkKKworCisKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFRMYW4gRHJpdmVyIEVlcHJvbSBEZWZpbml0aW9ucworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVExBTl9FRVBST01fQUNLCQkwCisjZGVmaW5lIFRMQU5fRUVQUk9NX1NUT1AJMQorCisKKworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogSG9zdCBSZWdpc3RlciBPZmZzZXRzIGFuZCBDb250ZW50cworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVExBTl9IT1NUX0NNRAkJCTB4MDAKKyNkZWZpbmUgCVRMQU5fSENfR08JCTB4ODAwMDAwMDAKKyNkZWZpbmUJCVRMQU5fSENfU1RPUAkJMHg0MDAwMDAwMAorI2RlZmluZQkJVExBTl9IQ19BQ0sJCTB4MjAwMDAwMDAKKyNkZWZpbmUJCVRMQU5fSENfQ1NfTUFTSwkJMHgxRkUwMDAwMAorI2RlZmluZQkJVExBTl9IQ19FT0MJCTB4MDAxMDAwMDAKKyNkZWZpbmUJCVRMQU5fSENfUlQJCTB4MDAwODAwMDAKKyNkZWZpbmUJCVRMQU5fSENfTkVTCQkweDAwMDQwMDAwCisjZGVmaW5lCQlUTEFOX0hDX0FEX1JTVAkJMHgwMDAwODAwMAorI2RlZmluZQkJVExBTl9IQ19MRF9UTVIJCTB4MDAwMDQwMDAKKyNkZWZpbmUJCVRMQU5fSENfTERfVEhSCQkweDAwMDAyMDAwCisjZGVmaW5lCQlUTEFOX0hDX1JFUV9JTlQJCTB4MDAwMDEwMDAKKyNkZWZpbmUJCVRMQU5fSENfSU5UX09GRgkJMHgwMDAwMDgwMAorI2RlZmluZQkJVExBTl9IQ19JTlRfT04JCTB4MDAwMDA0MDAKKyNkZWZpbmUJCVRMQU5fSENfQUNfTUFTSwkJMHgwMDAwMDBGRgorI2RlZmluZSBUTEFOX0NIX1BBUk0JCQkweDA0CisjZGVmaW5lIFRMQU5fRElPX0FEUgkJCTB4MDgKKyNkZWZpbmUJCVRMQU5fREFfQURSX0lOQwkJMHg4MDAwCisjZGVmaW5lCQlUTEFOX0RBX1JBTV9BRFIJCTB4NDAwMAorI2RlZmluZSBUTEFOX0hPU1RfSU5UCQkJMHgwQQorI2RlZmluZQkJVExBTl9ISV9JVl9NQVNLCQkweDFGRTAKKyNkZWZpbmUJCVRMQU5fSElfSVRfTUFTSwkJMHgwMDFDCisjZGVmaW5lIFRMQU5fRElPX0RBVEEJCQkweDBDCisKKworLyogVGh1bmRlckxBTiBJbnRlcm5hbCBSZWdpc3RlciBESU8gT2Zmc2V0cyAqLworCisjZGVmaW5lIFRMQU5fTkVUX0NNRAkJCTB4MDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9OUkVTRVQJMHg4MAorI2RlZmluZQkJVExBTl9ORVRfQ01EX05XUkFQCTB4NDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9DU0YJMHgyMAorI2RlZmluZQkJVExBTl9ORVRfQ01EX0NBRgkweDEwCisjZGVmaW5lCQlUTEFOX05FVF9DTURfTk9CUlgJMHgwOAorI2RlZmluZQkJVExBTl9ORVRfQ01EX0RVUExFWAkweDA0CisjZGVmaW5lCQlUTEFOX05FVF9DTURfVFJGUkFNCTB4MDIKKyNkZWZpbmUJCVRMQU5fTkVUX0NNRF9UWFBBQ0UJMHgwMQorI2RlZmluZSBUTEFOX05FVF9TSU8JCQkweDAxCisjZGVmaW5lIAlUTEFOX05FVF9TSU9fTUlOVEVOCTB4ODAKKyNkZWZpbmUJCVRMQU5fTkVUX1NJT19FQ0xPSwkweDQwCisjZGVmaW5lCQlUTEFOX05FVF9TSU9fRVRYRU4JMHgyMAorI2RlZmluZQkJVExBTl9ORVRfU0lPX0VEQVRBCTB4MTAKKyNkZWZpbmUJCVRMQU5fTkVUX1NJT19OTVJTVAkweDA4CisjZGVmaW5lCQlUTEFOX05FVF9TSU9fTUNMSwkweDA0CisjZGVmaW5lCQlUTEFOX05FVF9TSU9fTVRYRU4JMHgwMgorI2RlZmluZQkJVExBTl9ORVRfU0lPX01EQVRBCTB4MDEKKyNkZWZpbmUgVExBTl9ORVRfU1RTCQkJMHgwMgorI2RlZmluZQkJVExBTl9ORVRfU1RTX01JUlEJMHg4MAorI2RlZmluZQkJVExBTl9ORVRfU1RTX0hCRUFUCTB4NDAKKyNkZWZpbmUJCVRMQU5fTkVUX1NUU19UWFNUT1AJMHgyMAorI2RlZmluZQkJVExBTl9ORVRfU1RTX1JYU1RPUAkweDEwCisjZGVmaW5lCQlUTEFOX05FVF9TVFNfUlNSVkQJMHgwRgorI2RlZmluZSBUTEFOX05FVF9NQVNLCQkJMHgwMworI2RlZmluZQkJVExBTl9ORVRfTUFTS19NQVNLNwkweDgwCisjZGVmaW5lCQlUTEFOX05FVF9NQVNLX01BU0s2CTB4NDAKKyNkZWZpbmUJCVRMQU5fTkVUX01BU0tfTUFTSzUJMHgyMAorI2RlZmluZQkJVExBTl9ORVRfTUFTS19NQVNLNAkweDEwCisjZGVmaW5lCQlUTEFOX05FVF9NQVNLX1JTUlZECTB4MEYKKyNkZWZpbmUgVExBTl9ORVRfQ09ORklHCQkJMHgwNAorI2RlZmluZSAJVExBTl9ORVRfQ0ZHX1JDTEsJMHg4MDAwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfVENMSwkweDQwMDAKKyNkZWZpbmUJCVRMQU5fTkVUX0NGR19CSVQJMHgyMDAwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfUlhDUkMJMHgxMDAwCisjZGVmaW5lCQlUTEFOX05FVF9DRkdfUEVGCTB4MDgwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHXzFGUkFHCTB4MDQwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHXzFDSEFOCTB4MDIwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHX01URVNUCTB4MDEwMAorI2RlZmluZQkJVExBTl9ORVRfQ0ZHX1BIWV9FTgkweDAwODAKKyNkZWZpbmUJCVRMQU5fTkVUX0NGR19NU01BU0sJMHgwMDdGCisjZGVmaW5lIFRMQU5fTUFOX1RFU1QJCQkweDA2CisjZGVmaW5lIFRMQU5fREVGX1ZFTkRPUl9JRAkJMHgwOAorI2RlZmluZSBUTEFOX0RFRl9ERVZJQ0VfSUQJCTB4MEEKKyNkZWZpbmUgVExBTl9ERUZfUkVWSVNJT04JCTB4MEMKKyNkZWZpbmUgVExBTl9ERUZfU1VCQ0xBU1MJCTB4MEQKKyNkZWZpbmUgVExBTl9ERUZfTUlOX0xBVAkJMHgwRQorI2RlZmluZSBUTEFOX0RFRl9NQVhfTEFUCQkweDBGCisjZGVmaW5lIFRMQU5fQVJFR18wCQkJMHgxMAorI2RlZmluZSBUTEFOX0FSRUdfMQkJCTB4MTYKKyNkZWZpbmUgVExBTl9BUkVHXzIJCQkweDFDCisjZGVmaW5lIFRMQU5fQVJFR18zCQkJMHgyMgorI2RlZmluZSBUTEFOX0hBU0hfMQkJCTB4MjgKKyNkZWZpbmUgVExBTl9IQVNIXzIJCQkweDJDCisjZGVmaW5lIFRMQU5fR09PRF9UWF9GUk1TCQkweDMwCisjZGVmaW5lIFRMQU5fVFhfVU5ERVJVTlMJCTB4MzMKKyNkZWZpbmUgVExBTl9HT09EX1JYX0ZSTVMJCTB4MzQKKyNkZWZpbmUgVExBTl9SWF9PVkVSUlVOUwkJMHgzNworI2RlZmluZSBUTEFOX0RFRkVSUkVEX1RYCQkweDM4CisjZGVmaW5lIFRMQU5fQ1JDX0VSUk9SUwkJCTB4M0EKKyNkZWZpbmUgVExBTl9DT0RFX0VSUk9SUwkJMHgzQgorI2RlZmluZSBUTEFOX01VTFRJQ09MX0ZSTVMJCTB4M0MKKyNkZWZpbmUgVExBTl9TSU5HTEVDT0xfRlJNUwkJMHgzRQorI2RlZmluZSBUTEFOX0VYQ0VTU0NPTF9GUk1TCQkweDQwCisjZGVmaW5lIFRMQU5fTEFURV9DT0xTCQkJMHg0MQorI2RlZmluZSBUTEFOX0NBUlJJRVJfTE9TUwkJMHg0MgorI2RlZmluZSBUTEFOX0FDT01NSVQJCQkweDQzCisjZGVmaW5lIFRMQU5fTEVEX1JFRwkJCTB4NDQKKyNkZWZpbmUJCVRMQU5fTEVEX0FDVAkJMHgxMAorI2RlZmluZQkJVExBTl9MRURfTElOSwkJMHgwMQorI2RlZmluZSBUTEFOX0JTSVpFX1JFRwkJCTB4NDUKKyNkZWZpbmUgVExBTl9NQVhfUlgJCQkweDQ2CisjZGVmaW5lIFRMQU5fSU5UX0RJUwkJCTB4NDgKKyNkZWZpbmUJCVRMQU5fSURfVFhfRU9DCQkweDA0CisjZGVmaW5lCQlUTEFOX0lEX1JYX0VPRgkJMHgwMgorI2RlZmluZQkJVExBTl9JRF9SWF9FT0MJCTB4MDEKKworCisKKy8qIFRodW5kZXJMQU4gSW50ZXJydXB0IENvZGVzICovCisKKyNkZWZpbmUgVExBTl9JTlRfTlVNQkVSX09GX0lOVFMJOAorCisjZGVmaW5lIFRMQU5fSU5UX05PTkUJCQkweDAwMDAKKyNkZWZpbmUgVExBTl9JTlRfVFhfRU9GCQkJMHgwMDAxCisjZGVmaW5lIFRMQU5fSU5UX1NUQVRfT1ZFUkZMT1cJCTB4MDAwMgorI2RlZmluZSBUTEFOX0lOVF9SWF9FT0YJCQkweDAwMDMKKyNkZWZpbmUgVExBTl9JTlRfRFVNTVkJCQkweDAwMDQKKyNkZWZpbmUgVExBTl9JTlRfVFhfRU9DCQkJMHgwMDA1CisjZGVmaW5lIFRMQU5fSU5UX1NUQVRVU19DSEVDSwkJMHgwMDA2CisjZGVmaW5lIFRMQU5fSU5UX1JYX0VPQwkJCTB4MDAwNworCisKKworLyogVGh1bmRlckxBTiBNSUkgUmVnaXN0ZXJzICovCisKKy8qIEdlbmVyaWMgTUlJL1BIWSBSZWdpc3RlcnMgKi8KKworI2RlZmluZSBNSUlfR0VOX0NUTAkJCTB4MDAKKyNkZWZpbmUgCU1JSV9HQ19SRVNFVAkJMHg4MDAwCisjZGVmaW5lCQlNSUlfR0NfTE9PUEJLCQkweDQwMDAKKyNkZWZpbmUJCU1JSV9HQ19TUEVFRFNFTAkJMHgyMDAwCisjZGVmaW5lCQlNSUlfR0NfQVVUT0VOQgkJMHgxMDAwCisjZGVmaW5lCQlNSUlfR0NfUERPV04JCTB4MDgwMAorI2RlZmluZQkJTUlJX0dDX0lTT0xBVEUJCTB4MDQwMAorI2RlZmluZQkJTUlJX0dDX0FVVE9SU1JUCQkweDAyMDAKKyNkZWZpbmUJCU1JSV9HQ19EVVBMRVgJCTB4MDEwMAorI2RlZmluZQkJTUlJX0dDX0NPTFRFU1QJCTB4MDA4MAorI2RlZmluZQkJTUlJX0dDX1JFU0VSVkVECQkweDAwN0YKKyNkZWZpbmUgTUlJX0dFTl9TVFMJCQkweDAxCisjZGVmaW5lCQlNSUlfR1NfMTAwQlQ0CQkweDgwMDAKKyNkZWZpbmUJCU1JSV9HU18xMDBCVFhGRAkJMHg0MDAwCisjZGVmaW5lCQlNSUlfR1NfMTAwQlRYSEQJCTB4MjAwMAorI2RlZmluZQkJTUlJX0dTXzEwQlRGRAkJMHgxMDAwCisjZGVmaW5lCQlNSUlfR1NfMTBCVEhECQkweDA4MDAKKyNkZWZpbmUJCU1JSV9HU19SRVNFUlZFRAkJMHgwN0MwCisjZGVmaW5lCQlNSUlfR1NfQVVUT0NNUExUCTB4MDAyMAorI2RlZmluZQkJTUlJX0dTX1JGTFQJCTB4MDAxMAorI2RlZmluZQkJTUlJX0dTX0FVVE9ORUcJCTB4MDAwOAorI2RlZmluZQkJTUlJX0dTX0xJTksJCTB4MDAwNAorI2RlZmluZQkJTUlJX0dTX0pBQkJFUgkJMHgwMDAyCisjZGVmaW5lCQlNSUlfR1NfRVhUQ0FQCQkweDAwMDEKKyNkZWZpbmUgTUlJX0dFTl9JRF9ISQkJCTB4MDIKKyNkZWZpbmUgTUlJX0dFTl9JRF9MTwkJCTB4MDMKKyNkZWZpbmUgCU1JSV9HSUxfT1VJCQkweEZDMDAKKyNkZWZpbmUgCU1JSV9HSUxfTU9ERUwJCTB4MDNGMAorI2RlZmluZSAJTUlJX0dJTF9SRVZJU0lPTgkweDAwMEYKKyNkZWZpbmUgTUlJX0FOX0FEVgkJCTB4MDQKKyNkZWZpbmUgTUlJX0FOX0xQQQkJCTB4MDUKKyNkZWZpbmUgTUlJX0FOX0VYUAkJCTB4MDYKKworLyogVGh1bmRlckxBTiBTcGVjaWZpYyBNSUkvUEhZIFJlZ2lzdGVycyAqLworCisjZGVmaW5lIFRMQU5fVExQSFlfSUQJCQkweDEwCisjZGVmaW5lIFRMQU5fVExQSFlfQ1RMCQkJMHgxMQorI2RlZmluZSAJVExBTl9UQ19JR0xJTksJCTB4ODAwMAorI2RlZmluZQkJVExBTl9UQ19TV0FQT0wJCTB4NDAwMAorI2RlZmluZQkJVExBTl9UQ19BVUlTRUwJCTB4MjAwMAorI2RlZmluZQkJVExBTl9UQ19TUUVFTgkJMHgxMDAwCisjZGVmaW5lCQlUTEFOX1RDX01URVNUCQkweDA4MDAKKyNkZWZpbmUJCVRMQU5fVENfUkVTRVJWRUQJMHgwN0Y4CisjZGVmaW5lCQlUTEFOX1RDX05GRVcJCTB4MDAwNAorI2RlZmluZQkJVExBTl9UQ19JTlRFTgkJMHgwMDAyCisjZGVmaW5lCQlUTEFOX1RDX1RJTlQJCTB4MDAwMQorI2RlZmluZSBUTEFOX1RMUEhZX1NUUwkJCTB4MTIKKyNkZWZpbmUJCVRMQU5fVFNfTUlOVAkJMHg4MDAwCisjZGVmaW5lCQlUTEFOX1RTX1BIT0sJCTB4NDAwMAorI2RlZmluZQkJVExBTl9UU19QT0xPSwkJMHgyMDAwCisjZGVmaW5lCQlUTEFOX1RTX1RQRU5FUkdZCTB4MTAwMAorI2RlZmluZQkJVExBTl9UU19SRVNFUlZFRAkweDBGRkYKKyNkZWZpbmUgVExBTl9UTFBIWV9QQVIJCQkweDE5CisjZGVmaW5lCQlUTEFOX1BIWV9DSU1fU1RBVAkweDAwMjAKKyNkZWZpbmUJCVRMQU5fUEhZX1NQRUVEXzEwMAkweDAwNDAKKyNkZWZpbmUJCVRMQU5fUEhZX0RVUExFWF9GVUxMCTB4MDA4MAorI2RlZmluZQkJVExBTl9QSFlfQU5fRU5fU1RBVCAgICAgMHgwNDAwCisKKy8qIE5hdGlvbmFsIFNlbS4gJiBMZXZlbDEgUEhZIGlkJ3MgKi8KKyNkZWZpbmUgTkFUX1NFTV9JRDEJCQkweDIwMDAKKyNkZWZpbmUgTkFUX1NFTV9JRDIJCQkweDVDMDEKKyNkZWZpbmUgTEVWRUwxX0lEMQkJCTB4NzgxMAorI2RlZmluZSBMRVZFTDFfSUQyCQkJMHgwMDAwCisKKyNkZWZpbmUgQ0lSQ19JTkMoIGEsIGIgKSBpZiAoICsrYSA+PSBiICkgYSA9IDAKKworLyogUm91dGluZXMgdG8gYWNjZXNzIGludGVybmFsIHJlZ2lzdGVycy4gKi8KKworc3RhdGljIGlubGluZSB1OCBUTGFuX0Rpb1JlYWQ4KHUxNiBiYXNlX2FkZHIsIHUxNiBpbnRlcm5hbF9hZGRyKQoreworCW91dHcoaW50ZXJuYWxfYWRkciwgYmFzZV9hZGRyICsgVExBTl9ESU9fQURSKTsKKwlyZXR1cm4gKGluYigoYmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSkgKyAoaW50ZXJuYWxfYWRkciAmIDB4MykpKTsKKwkKK30gLyogVExhbl9EaW9SZWFkOCAqLworCisKKworCitzdGF0aWMgaW5saW5lIHUxNiBUTGFuX0Rpb1JlYWQxNih1MTYgYmFzZV9hZGRyLCB1MTYgaW50ZXJuYWxfYWRkcikKK3sKKwlvdXR3KGludGVybmFsX2FkZHIsIGJhc2VfYWRkciArIFRMQU5fRElPX0FEUik7CisJcmV0dXJuIChpbncoKGJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEpICsgKGludGVybmFsX2FkZHIgJiAweDIpKSk7CisKK30gLyogVExhbl9EaW9SZWFkMTYgKi8KKworCisKKworc3RhdGljIGlubGluZSB1MzIgVExhbl9EaW9SZWFkMzIodTE2IGJhc2VfYWRkciwgdTE2IGludGVybmFsX2FkZHIpCit7CisJb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCXJldHVybiAoaW5sKGJhc2VfYWRkciArIFRMQU5fRElPX0RBVEEpKTsKKworfSAvKiBUTGFuX0Rpb1JlYWQzMiAqLworCisKKworCitzdGF0aWMgaW5saW5lIHZvaWQgVExhbl9EaW9Xcml0ZTgodTE2IGJhc2VfYWRkciwgdTE2IGludGVybmFsX2FkZHIsIHU4IGRhdGEpCit7CisJb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCW91dGIoZGF0YSwgYmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIChpbnRlcm5hbF9hZGRyICYgMHgzKSk7CisKK30KKworCisKKworc3RhdGljIGlubGluZSB2b2lkIFRMYW5fRGlvV3JpdGUxNih1MTYgYmFzZV9hZGRyLCB1MTYgaW50ZXJuYWxfYWRkciwgdTE2IGRhdGEpCit7CisJb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCW91dHcoZGF0YSwgYmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIChpbnRlcm5hbF9hZGRyICYgMHgyKSk7CisKK30KKworCisKKworc3RhdGljIGlubGluZSB2b2lkIFRMYW5fRGlvV3JpdGUzMih1MTYgYmFzZV9hZGRyLCB1MTYgaW50ZXJuYWxfYWRkciwgdTMyIGRhdGEpCit7CisJb3V0dyhpbnRlcm5hbF9hZGRyLCBiYXNlX2FkZHIgKyBUTEFOX0RJT19BRFIpOworCW91dGwoZGF0YSwgYmFzZV9hZGRyICsgVExBTl9ESU9fREFUQSArIChpbnRlcm5hbF9hZGRyICYgMHgyKSk7CisKK30KKworI2RlZmluZSBUTGFuX0NsZWFyQml0KCBiaXQsIHBvcnQgKQlvdXRiX3AoaW5iX3AocG9ydCkgJiB+Yml0LCBwb3J0KQorI2RlZmluZSBUTGFuX0dldEJpdCggYml0LCBwb3J0ICkJKChpbnQpIChpbmJfcChwb3J0KSAmIGJpdCkpCisjZGVmaW5lIFRMYW5fU2V0Qml0KCBiaXQsIHBvcnQgKQlvdXRiX3AoaW5iX3AocG9ydCkgfCBiaXQsIHBvcnQpCisKKy8qCisgKiBnaXZlbiA2IGJ5dGVzLCB2aWV3IHRoZW0gYXMgOCA2LWJpdCBudW1iZXJzIGFuZCByZXR1cm4gdGhlIFhPUiBvZiB0aG9zZSAKKyAqIHRoZSBjb2RlIGJlbG93IGlzIGFib3V0IHNldmVuIHRpbWVzIGFzIGZhc3QgYXMgdGhlIG9yaWdpbmFsIGNvZGUgCisgKgorICogVGhlIG9yaWdpbmFsIGNvZGUgd2FzOgorICoKKyAqIHUzMgl4b3IoIHUzMiBhLCB1MzIgYiApIHsJcmV0dXJuICggKCBhICYmICEgYiApIHx8ICggISBhICYmIGIgKSApOyB9CisgKgorICogI2RlZmluZSBYT1I4KCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoICkJXAorICogCXhvciggYSwgeG9yKCBiLCB4b3IoIGMsIHhvciggZCwgeG9yKCBlLCB4b3IoIGYsIHhvciggZywgaCApICkgKSApICkgKSApCisgKiAjZGVmaW5lIERBKCBhLCBiaXQgKQkJKCAoICh1OCkgYVtiaXQvOF0gKSAmICggKHU4KSAoIDEgPDwgYml0JTggKSApICkKKyAqCisgKiAJaGFzaCAgPSBYT1I4KCBEQShhLDApLCBEQShhLCA2KSwgREEoYSwxMiksIERBKGEsMTgpLCBEQShhLDI0KSwgREEoYSwzMCksIERBKGEsMzYpLCBEQShhLDQyKSApOworICogCWhhc2ggfD0gWE9SOCggREEoYSwxKSwgREEoYSwgNyksIERBKGEsMTMpLCBEQShhLDE5KSwgREEoYSwyNSksIERBKGEsMzEpLCBEQShhLDM3KSwgREEoYSw0MykgKSA8PCAxOworICogCWhhc2ggfD0gWE9SOCggREEoYSwyKSwgREEoYSwgOCksIERBKGEsMTQpLCBEQShhLDIwKSwgREEoYSwyNiksIERBKGEsMzIpLCBEQShhLDM4KSwgREEoYSw0NCkgKSA8PCAyOworICogCWhhc2ggfD0gWE9SOCggREEoYSwzKSwgREEoYSwgOSksIERBKGEsMTUpLCBEQShhLDIxKSwgREEoYSwyNyksIERBKGEsMzMpLCBEQShhLDM5KSwgREEoYSw0NSkgKSA8PCAzOworICogCWhhc2ggfD0gWE9SOCggREEoYSw0KSwgREEoYSwxMCksIERBKGEsMTYpLCBEQShhLDIyKSwgREEoYSwyOCksIERBKGEsMzQpLCBEQShhLDQwKSwgREEoYSw0NikgKSA8PCA0OworICogCWhhc2ggfD0gWE9SOCggREEoYSw1KSwgREEoYSwxMSksIERBKGEsMTcpLCBEQShhLDIzKSwgREEoYSwyOSksIERBKGEsMzUpLCBEQShhLDQxKSwgREEoYSw0NykgKSA8PCA1OworICoKKyAqLworc3RhdGljIGlubGluZSB1MzIgVExhbl9IYXNoRnVuYyggY29uc3QgdTggKmEgKQoreworICAgICAgICB1OCAgICAgaGFzaDsKKworICAgICAgICBoYXNoID0gKGFbMF1eYVszXSk7ICAgICAgICAgICAgIC8qICYgMDc3ICovCisgICAgICAgIGhhc2ggXj0gKChhWzBdXmFbM10pPj42KTsgICAgICAgLyogJiAwMDMgKi8KKyAgICAgICAgaGFzaCBePSAoKGFbMV1eYVs0XSk8PDIpOyAgICAgICAvKiAmIDA3NCAqLworICAgICAgICBoYXNoIF49ICgoYVsxXV5hWzRdKT4+NCk7ICAgICAgIC8qICYgMDE3ICovCisgICAgICAgIGhhc2ggXj0gKChhWzJdXmFbNV0pPDw0KTsgICAgICAgLyogJiAwNjAgKi8KKyAgICAgICAgaGFzaCBePSAoKGFbMl1eYVs1XSk+PjIpOyAgICAgICAvKiAmIDA3NyAqLworCisgICAgICAgIHJldHVybiAoaGFzaCAmIDA3Nyk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OS5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nLzNjMzU5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQxZGNmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OS5jCkBAIC0wLDAgKzEsMTgzMCBAQAorLyoKKyAqICAgM2MzNTkuYyAoYykgMjAwMCBNaWtlIFBoaWxsaXBzIChtaWtlcEBsaW51eHRyLm5ldCkgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICBMaW51eCBkcml2ZXIgZm9yIDNDb20gM2MzNTkgVG9rZW5saW5rIFZlbG9jaXR5IFhMIFBDSSBOSUMKKyAqCisgKiAgQmFzZSBEcml2ZXIgT2x5bXBpYzoKKyAqCVdyaXR0ZW4gMTk5OSBQZXRlciBEZSBTY2hyaWp2ZXIgJiBNaWtlIFBoaWxsaXBzCisgKgorICogIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICogCisgKiAgNy8xNy8wMCAtIENsZWFuIHVwLCB2ZXJzaW9uIG51bWJlciAwLjkuMC4gUmVhZHkgdG8gcmVsZWFzZSB0byB0aGUgd29ybGQuCisgKgorICogIDIvMTYvMDEgLSBQb3J0IHVwIHRvIGtlcm5lbCAyLjQuMiByZWFkeSBmb3Igc3VibWlzc2lvbiBpbnRvIHRoZSBrZXJuZWwuCisgKiAgMy8wNS8wMSAtIExhc3QgY2xlYW4gdXAgc3R1ZmYgYmVmb3JlIHN1Ym1pc3Npb24uCisgKiAgMi8xNS8wMSAtIEZpbmFsbHksIHVwZGF0ZSB0byBuZXcgcGNpIGFwaS4gCisgKgorICogIFRvIERvOgorICovCisKKy8qIAorICoJVGVjaG5pY2FsIENhcmQgRGV0YWlscworICoKKyAqICBBbGwgYWNjZXNzIHRvIGRhdGEgaXMgZG9uZSB3aXRoIDE2LzggYml0IHRyYW5zZmVycy4gIFRoZSB0cmFuc2ZlcgorICogIG1ldGhvZCByZWFsbHkgc3Vja3MuIFlvdSBjYW4gb25seSByZWFkIG9yIHdyaXRlIG9uZSBsb2NhdGlvbiBhdCBhIHRpbWUuCisgKgorICogIEFsc28sIHRoZSBtaWNyb2NvZGUgZm9yIHRoZSBjYXJkIG11c3QgYmUgdXBsb2FkZWQgaWYgdGhlIGNhcmQgZG9lcyBub3QgaGF2ZQorICogIHRoZSBmbGFzaHJvbSBvbiBib2FyZC4gIFRoaXMgaXMgYSAyOEsgYmxvYXQgaW4gdGhlIGRyaXZlciB3aGVuIGNvbXBpbGVkCisgKiAgYXMgYSBtb2R1bGUuCisgKgorICogIFJ4IGlzIHZlcnkgc2ltcGxlLCBzdGF0dXMgaW50byBhIHJpbmcgb2YgZGVzY3JpcHRvcnMsIGRtYSBkYXRhIHRyYW5zZmVyLAorICogIGludGVycnVwdHMgdG8gdGVsbCB1cyB3aGVuIGEgcGFja2V0IGlzIHJlY2VpdmVkLgorICoKKyAqICBUeCBpcyBhIGxpdHRsZSBtb3JlIGludGVyZXN0aW5nLiBTaW1pbGFyIHNjZW5hcmlvLCBkZXNjcmlwdG9yIGFuZCBkbWEgZGF0YQorICogIHRyYW5zZmVycywgYnV0IHdlIGRvbid0IGhhdmUgdG8gaW50ZXJydXB0IHRoZSBjYXJkIHRvIHRlbGwgaXQgYW5vdGhlciBwYWNrZXQKKyAqICBpcyByZWFkeSBmb3IgdHJhbnNtaXNzaW9uLCB3ZSBhcmUganVzdCBkb2luZyBzaW1wbGUgbWVtb3J5IHdyaXRlcywgbm90IGlvIG9yIG1taW8KKyAqICB3cml0ZXMuICBUaGUgY2FyZCBjYW4gYmUgc2V0IHVwIHRvIHNpbXBseSBwb2xsIG9uIHRoZSBuZXh0CisgKiAgZGVzY3JpcHRvciBwb2ludGVyIGFuZCB3aGVuIHRoaXMgdmFsdWUgaXMgbm9uLXplcm8gd2lsbCBhdXRvbWF0aWNhbGx5IGRvd25sb2FkCisgKiAgdGhlIG5leHQgcGFja2V0LiAgVGhlIGNhcmQgdGhlbiBpbnRlcnJ1cHRzIHVzIHdoZW4gdGhlIHBhY2tldCBpcyBkb25lLgorICoKKyAqLworCisjZGVmaW5lIFhMX0RFQlVHIDAKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgIjNjMzU5LmgiCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhICA9IAorIjNjMzU5LmMgdjEuMi4wIDIvMTcvMDEgLSBNaWtlIFBoaWxsaXBzIChtaWtlcEBsaW51eHRyLm5ldCkiIDsgCisKK01PRFVMRV9BVVRIT1IoIk1pa2UgUGhpbGxpcHMgPG1pa2VwQGxpbnV4dHIubmV0PiIpIDsgCitNT0RVTEVfREVTQ1JJUFRJT04oIjNDb20gM0MzNTkgVmVsb2NpdHkgWEwgVG9rZW4gUmluZyBBZGFwdGVyIERyaXZlciBcbiIpIDsKKworLyogTW9kdWxlIHBhcmFtdGVycyAqLworCisvKiBSaW5nIFNwZWVkIDAsNCwxNiAKKyAqIDAgPSBBdXRvc2Vuc2UgICAKKyAqIDQsMTYgPSBTZWxlY3RlZCBzcGVlZCBvbmx5LCBubyBhdXRvc2Vuc2UKKyAqIFRoaXMgYWxsb3dzIHRoZSBjYXJkIHRvIGJlIHRoZSBmaXJzdCBvbiB0aGUgcmluZworICogYW5kIGJlY29tZSB0aGUgYWN0aXZlIG1vbml0b3IuCisgKgorICogV0FSTklORzogU29tZSBodWJzIHdpbGwgYWxsb3cgeW91IHRvIGluc2VydAorICogYXQgdGhlIHdyb25nIHNwZWVkLgorICogCisgKiBUaGUgYWRhcHRlciB3aWxsIF9ub3RfIGZhaWwgdG8gb3BlbiBpZiB0aGVyZSBhcmUgbm8KKyAqIGFjdGl2ZSBtb25pdG9ycyBvbiB0aGUgcmluZywgaXQgd2lsbCBzaW1wbHkgb3BlbiB1cCBpbiAKKyAqIGl0cyBsYXN0IGtub3duIHJpbmdzcGVlZCBpZiBubyByaW5nc3BlZWQgaXMgc3BlY2lmaWVkLgorICovCisKK3N0YXRpYyBpbnQgcmluZ3NwZWVkW1hMX01BWF9BREFQVEVSU10gPSB7MCx9IDsKKworbW9kdWxlX3BhcmFtX2FycmF5KHJpbmdzcGVlZCwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocmluZ3NwZWVkLCIzYzM1OTogUmluZ3NwZWVkIHNlbGVjdGlvbiAtIDQsMTYgb3IgMCIpIDsgCisKKy8qIFBhY2tldCBidWZmZXIgc2l6ZSAqLworCitzdGF0aWMgaW50IHBrdF9idWZfc3pbWExfTUFYX0FEQVBURVJTXSA9IHswLH0gOworIAorbW9kdWxlX3BhcmFtX2FycmF5KHBrdF9idWZfc3osIGludCwgTlVMTCwgMCkgOworTU9EVUxFX1BBUk1fREVTQyhwa3RfYnVmX3N6LCIzYzM1OTogSW5pdGlhbCBidWZmZXIgc2l6ZSIpIDsgCisvKiBNZXNzYWdlIExldmVsICovCisKK3N0YXRpYyBpbnQgbWVzc2FnZV9sZXZlbFtYTF9NQVhfQURBUFRFUlNdID0gezAsfSA7IAorCittb2R1bGVfcGFyYW1fYXJyYXkobWVzc2FnZV9sZXZlbCwgaW50LCBOVUxMLCAwKSA7CitNT0RVTEVfUEFSTV9ERVNDKG1lc3NhZ2VfbGV2ZWwsICIzYzM1OTogTGV2ZWwgb2YgcmVwb3J0ZWQgbWVzc2FnZXMgXG4iKSA7IAorLyogCisgKglUaGlzIGlzIGEgcmVhbCBuYXN0eSB3YXkgb2YgZG9pbmcgdGhpcywgYnV0IG90aGVyd2lzZSB5b3UKKyAqCXdpbGwgYmUgc3R1Y2sgd2l0aCAxNTU1IGxpbmVzIG9mIGhleCAjJ3MgaW4gdGhlIGNvZGUuCisgKi8KKworI2luY2x1ZGUgIjNjMzU5X21pY3JvY29kZS5oIiAKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHhsX3BjaV90YmxbXSA9Cit7CisJe1BDSV9WRU5ET1JfSURfM0NPTSxQQ0lfREVWSUNFX0lEXzNDT01fM0MzNTksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyB9CQkJLyogdGVybWluYXRlIGxpc3QgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSx4bF9wY2lfdGJsKSA7IAorCitzdGF0aWMgaW50IHhsX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHhsX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHhsX29wZW5faHcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgOyAgCitzdGF0aWMgaW50IHhsX2h3X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOyAKK3N0YXRpYyBpbnQgeGxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHhsX2RuX2NvbXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7IAorc3RhdGljIGludCB4bF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHhsX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IHhsX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqIHhsX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgeGxfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpIDsgCitzdGF0aWMgdm9pZCB4bF9hcmJfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgeGxfYXNiX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSA7IAorc3RhdGljIHZvaWQgeGxfc3JiX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3JiX2NtZCkgOyAKK3N0YXRpYyB2b2lkIHhsX3dhaXRfbWlzcl9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSA7IAorc3RhdGljIGludCB4bF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtdHUpOworc3RhdGljIHZvaWQgeGxfc3JiX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIDsgCitzdGF0aWMgdm9pZCB4bF9hc2JfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgOyAKK3N0YXRpYyB2b2lkIHhsX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIDsgIAorc3RhdGljIHZvaWQgeGxfZnJlZW1lbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSA7ICAKKworCisvKiBFRVByb20gQWNjZXNzIEZ1bmN0aW9ucyAqLworc3RhdGljIHUxNiAgeGxfZWVfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZWVfYWRkcikgOyAKK3N0YXRpYyB2b2lkICB4bF9lZV93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZWVfYWRkciwgdTE2IGVlX3ZhbHVlKSA7IAorCisvKiBEZWJ1Z2dpbmcgZnVuY3Rpb25zICovCisjaWYgWExfREVCVUcKK3N0YXRpYyB2b2lkIHByaW50X3R4X3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIDsgCitzdGF0aWMgdm9pZCBwcmludF9yeF9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSA7IAorCitzdGF0aWMgdm9pZCBwcmludF90eF9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXYgPSAoc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXYgOyAKKwlzdHJ1Y3QgeGxfdHhfZGVzYyAqdHhkIDsgCisJdTggX19pb21lbSAqeGxfbW1pbyA9IHhsX3ByaXYtPnhsX21taW8gOyAKKwlpbnQgaSA7IAorCisJcHJpbnRrKCJ0eF9yaW5nX2hlYWQ6ICVkLCB0eF9yaW5nX3RhaWw6ICVkLCBmcmVlX2VudDogJWQgXG4iLHhsX3ByaXYtPnR4X3JpbmdfaGVhZCwgCisJCXhsX3ByaXYtPnR4X3JpbmdfdGFpbCwgeGxfcHJpdi0+ZnJlZV9yaW5nX2VudHJpZXMpIDsgCisJcHJpbnRrKCJSaW5nICAgICwgQWRkcmVzcyAsICAgRlNIICAsIERuTmV4dFB0ciwgQnVmZmVyLCBCdWZmZXJfTGVuIFxuIik7IAorCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCXR4ZCA9ICYoeGxfcHJpdi0+eGxfdHhfcmluZ1tpXSkgOyAKKwkJcHJpbnRrKCIlZCwgJTA4bHgsICUwOHgsICUwOHgsICUwOHgsICUwOHggXG4iLCBpLCB2aXJ0X3RvX2J1cyh0eGQpLCAKKwkJCXR4ZC0+ZnJhbWVzdGFydGhlYWRlciwgdHhkLT5kbm5leHRwdHIsIHR4ZC0+YnVmZmVyLCB0eGQtPmJ1ZmZlcl9sZW5ndGggKSA7IAorCX0KKworCXByaW50aygiRE5MSVNUUFRSID0gJTA0eCBcbiIsIHJlYWRsKHhsX21taW8gKyBNTUlPX0ROTElTVFBUUikgKTsgCisJCisJcHJpbnRrKCJEbWFDdGwgPSAlMDR4IFxuIiwgcmVhZGwoeGxfbW1pbyArIE1NSU9fRE1BX0NUUkwpICk7IAorCXByaW50aygiUXVldWUgc3RhdHVzID0gJTB4IFxuIixuZXRpZl9ydW5uaW5nKGRldikgKSA7IAorfQorCitzdGF0aWMgdm9pZCBwcmludF9yeF9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXYgPSAoc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXYgOyAKKwlzdHJ1Y3QgeGxfcnhfZGVzYyAqcnhkIDsgCisJdTggX19pb21lbSAqeGxfbW1pbyA9IHhsX3ByaXYtPnhsX21taW8gOyAKKwlpbnQgaSA7IAorCisJcHJpbnRrKCJyeF9yaW5nX3RhaWw6ICVkIFxuIiwgeGxfcHJpdi0+cnhfcmluZ190YWlsKSA7IAorCXByaW50aygiUmluZyAgICAsIEFkZHJlc3MgLCAgIEZyYW1lU3RhdGUgICwgVVBOZXh0UHRyLCBGcmFnQWRkciwgRnJhZ19MZW4gXG4iKTsgCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsgCisJCS8qIHJ4ZCA9IChzdHJ1Y3QgeGxfcnhfZGVzYyAqKXhsX3ByaXYtPnJ4X3JpbmdfZG1hX2FkZHIgKyAoaSAqIHNpemVvZihzdHJ1Y3QgeGxfcnhfZGVzYykpIDsgKi8KKwkJcnhkID0gJih4bF9wcml2LT54bF9yeF9yaW5nW2ldKSA7IAorCQlwcmludGsoIiVkLCAlMDhseCwgJTA4eCwgJTA4eCwgJTA4eCwgJTA4eCBcbiIsIGksIHZpcnRfdG9fYnVzKHJ4ZCksIAorCQkJcnhkLT5mcmFtZXN0YXR1cywgcnhkLT51cG5leHRwdHIsIHJ4ZC0+dXBmcmFnYWRkciwgcnhkLT51cGZyYWdsZW4gKSA7IAorCX0KKworCXByaW50aygiVVBMSVNUUFRSID0gJTA0eCBcbiIsIHJlYWRsKHhsX21taW8gKyBNTUlPX1VQTElTVFBUUikgKTsgCisJCisJcHJpbnRrKCJEbWFDdGwgPSAlMDR4IFxuIiwgcmVhZGwoeGxfbW1pbyArIE1NSU9fRE1BX0NUUkwpICk7IAorCXByaW50aygiUXVldWUgc3RhdHVzID0gJTB4IFxuIixuZXRpZl9ydW5uaW5nKGRldikgKSA7Cit9IAorI2VuZGlmCisKKy8qCisgKglSZWFkIHZhbHVlcyBmcm9tIHRoZSBvbi1ib2FyZCBFRVByb20uICBUaGlzIGxvb2tzIHZlcnkgc3RyYW5nZQorICoJYnV0IHlvdSBoYXZlIHRvIHdhaXQgZm9yIHRoZSBFRVByb20gdG8gZ2V0L3NldCB0aGUgdmFsdWUgYmVmb3JlIAorICoJcGFzc2luZy9nZXR0aW5nIHRoZSBuZXh0IHZhbHVlIGZyb20gdGhlIG5pYy4gQXMgd2l0aCBhbGwgcmVxdWVzdHMKKyAqCW9uIHRoaXMgbmljIGl0IGhhcyB0byBiZSBkb25lIGluIHR3byBzdGFnZXMsIGEpIHRlbGwgdGhlIG5pYyB3aGljaAorICoJbWVtb3J5IGFkZHJlc3MgeW91IHdhbnQgdG8gYWNjZXNzIGFuZCBiKSBwYXNzL2dldCB0aGUgdmFsdWUgZnJvbSB0aGUgbmljLgorICoJV2l0aCB0aGUgRUVQcm9tLCB5b3UgaGF2ZSB0byB3YWl0IGJlZm9yZSBhbmQgaW5iZXR3ZWVuIGFjY2VzcyBhKSBhbmQgYikuCisgKglBcyB0aGlzIGlzIG9ubHkgcmVhZCBhdCBpbml0aWFsaXphdGlvbiB0aW1lIGFuZCB0aGUgd2FpdCBwZXJpb2QgaXMgdmVyeSAKKyAqCXNtYWxsIHdlIHNob3VsZG4ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNjaGVkdWxpbmcgaXNzdWVzLgorICovCisKK3N0YXRpYyB1MTYgeGxfZWVfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZWVfYWRkcikKK3sgCisgICAgCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2ID0gKHN0cnVjdCB4bF9wcml2YXRlICopZGV2LT5wcml2IDsKKwl1OCBfX2lvbWVtICp4bF9tbWlvID0geGxfcHJpdi0+eGxfbW1pbyA7IAorCisJLyogV2FpdCBmb3IgRUVQcm9tIHRvIG5vdCBiZSBidXN5ICovCisJd3JpdGVsKElPX1dPUkRfUkVBRCB8IEVFQ09OVFJPTCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd2hpbGUgKCByZWFkdyh4bF9tbWlvICsgTU1JT19NQUNEQVRBKSAmIEVFQlVTWSApIDsKKworCS8qIFRlbGwgRUVQcm9tIHdoYXQgd2Ugd2FudCB0byBkbyBhbmQgd2hlcmUgKi8KKwl3cml0ZWwoSU9fV09SRF9XUklURSB8IEVFQ09OVFJPTCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd3JpdGV3KEVFUkVBRCArIGVlX2FkZHIsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisKKwkvKiBXYWl0IGZvciBFRVByb20gdG8gbm90IGJlIGJ1c3kgKi8KKwl3cml0ZWwoSU9fV09SRF9SRUFEIHwgRUVDT05UUk9MLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3aGlsZSAoIHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpICYgRUVCVVNZICkgOyAKKwkKKwkvKiBUZWxsIEVFUHJvbSB3aGF0IHdlIHdhbnQgdG8gZG8gYW5kIHdoZXJlICovCisJd3JpdGVsKElPX1dPUkRfV1JJVEUgfCBFRUNPTlRST0wgLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3cml0ZXcoRUVSRUFEICsgZWVfYWRkciwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKworCS8qIEZpbmFsbHkgcmVhZCB0aGUgdmFsdWUgZnJvbSB0aGUgRUVQcm9tICovCisJd3JpdGVsKElPX1dPUkRfUkVBRCB8IEVFREFUQSAsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXJldHVybiByZWFkdyh4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorfQorCisvKiAKKyAqCVdyaXRlIHZhbHVlcyB0byB0aGUgb25ib2FyZCBlZXByb20uIEFzIHdpdGggZWVwcm9tIHJlYWQgeW91IG5lZWQgdG8gCisgKglzZXQgd2hpY2ggbG9jYXRpb24gdG8gd3JpdGUsIHdhaXQsIHZhbHVlIHRvIHdyaXRlLCB3YWl0LCB3aXRoIHRoZSAKKyAqCWFkZGVkIHR3aXN0IG9mIGhhdmluZyB0byBlbmFibGUgZWVwcm9tIHdyaXRlcyBhcyB3ZWxsLgorICovCisKK3N0YXRpYyB2b2lkICB4bF9lZV93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZWVfYWRkciwgdTE2IGVlX3ZhbHVlKSAKK3sKKyAgICAJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXYgPSAoc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXYgOworCXU4IF9faW9tZW0gKnhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisKKwkvKiBXYWl0IGZvciBFRVByb20gdG8gbm90IGJlIGJ1c3kgKi8KKwl3cml0ZWwoSU9fV09SRF9SRUFEIHwgRUVDT05UUk9MLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3aGlsZSAoIHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpICYgRUVCVVNZICkgOworCQorCS8qIEVuYWJsZSB3cml0ZS9lcmFzZSAqLworCXdyaXRlbChJT19XT1JEX1dSSVRFIHwgRUVDT05UUk9MLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3cml0ZXcoRUVfRU5BQkxFX1dSSVRFLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCisJLyogV2FpdCBmb3IgRUVQcm9tIHRvIG5vdCBiZSBidXN5ICovCisJd3JpdGVsKElPX1dPUkRfUkVBRCB8IEVFQ09OVFJPTCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd2hpbGUgKCByZWFkdyh4bF9tbWlvICsgTU1JT19NQUNEQVRBKSAmIEVFQlVTWSApIDsKKworCS8qIFB1dCB0aGUgdmFsdWUgd2Ugd2FudCB0byB3cml0ZSBpbnRvIEVFREFUQSAqLyAKKwl3cml0ZWwoSU9fV09SRF9XUklURSB8IEVFREFUQSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd3JpdGV3KGVlX3ZhbHVlLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7CisKKwkvKiBUZWxsIEVFUHJvbSB0byB3cml0ZSBlZXZhbHVlIGludG8gZWVfYWRkciAqLworCXdyaXRlbChJT19XT1JEX1dSSVRFIHwgRUVDT05UUk9MLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3cml0ZXcoRUVXUklURSArIGVlX2FkZHIsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisKKwkvKiBXYWl0IGZvciBFRVByb20gdG8gbm90IGJlIGJ1c3ksIHRvIGVuc3VyZSB3cml0ZSBnZXRzIGRvbmUgKi8KKwl3cml0ZWwoSU9fV09SRF9SRUFEIHwgRUVDT05UUk9MLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3aGlsZSAoIHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpICYgRUVCVVNZICkgOworCQorCXJldHVybiA7IAorfQorIAoraW50IF9fZGV2aW5pdCB4bF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkgCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA7IAorCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2IDsgCisJc3RhdGljIGludCBjYXJkX25vID0gLTEgOworCWludCBpIDsgCisKKwljYXJkX25vKysgOyAKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgeyAKKwkJcmV0dXJuIC1FTk9ERVYgOyAKKwl9IAorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlpZiAoKGkgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIjNjMzU5IikpKSB7IAorCQlyZXR1cm4gaSA7IAorCX0gOyAKKworCS8qIAorCSAqIEFsbG93aW5nIGluaXRfdHJkZXYgdG8gYWxsb2NhdGUgdGhlIGRldi0+cHJpdiBzdHJ1Y3R1cmUgd2lsbCBhbGlnbiB4bF9wcml2YXRlCisgICAJICogb24gYSAzMiBieXRlcyBib3VuZGFyeSB3aGljaCB3ZSBuZWVkIGZvciB0aGUgcngvdHggZGVzY3JpcHRvcnMKKwkgKi8KKworCWRldiA9IGFsbG9jX3RyZGV2KHNpemVvZihzdHJ1Y3QgeGxfcHJpdmF0ZSkpIDsgCisJaWYgKCFkZXYpIHsgCisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldikgOyAKKwkJcmV0dXJuIC1FTk9NRU0gOyAKKwl9IAorCXhsX3ByaXYgPSBkZXYtPnByaXYgOyAKKworI2lmIFhMX0RFQlVHICAKKwlwcmludGsoInBjaV9kZXZpY2U6ICVwLCBkZXY6JXAsIGRldi0+cHJpdjogJXAsIGJhWzBdOiAlMTB4LCBiYVsxXTolMTB4XG4iLCAKKwkJcGRldiwgZGV2LCBkZXYtPnByaXYsICh1bnNpZ25lZCBpbnQpcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsICh1bnNpZ25lZCBpbnQpcGRldi0+cmVzb3VyY2VbMV0uc3RhcnQpIDsgIAorI2VuZGlmIAorCisJZGV2LT5pcnE9cGRldi0+aXJxOworCWRldi0+YmFzZV9hZGRyPXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LDApIDsgCisJeGxfcHJpdi0+eGxfY2FyZF9uYW1lID0gcGNpX25hbWUocGRldik7CisJeGxfcHJpdi0+eGxfbW1pbz1pb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LDEpLCBYTF9JT19TUEFDRSk7CisJeGxfcHJpdi0+cGRldiA9IHBkZXYgOyAKKwkJCisJaWYgKChwa3RfYnVmX3N6W2NhcmRfbm9dIDwgMTAwKSB8fCAocGt0X2J1Zl9zeltjYXJkX25vXSA+IDE4MDAwKSApCisJCXhsX3ByaXYtPnBrdF9idWZfc3ogPSBQS1RfQlVGX1NaIDsgCisJZWxzZQorCQl4bF9wcml2LT5wa3RfYnVmX3N6ID0gcGt0X2J1Zl9zeltjYXJkX25vXSA7IAorCisJZGV2LT5tdHUgPSB4bF9wcml2LT5wa3RfYnVmX3N6IC0gVFJfSExFTiA7IAorCXhsX3ByaXYtPnhsX3Jpbmdfc3BlZWQgPSByaW5nc3BlZWRbY2FyZF9ub10gOyAKKwl4bF9wcml2LT54bF9tZXNzYWdlX2xldmVsID0gbWVzc2FnZV9sZXZlbFtjYXJkX25vXSA7IAorCXhsX3ByaXYtPnhsX2Z1bmN0aW9uYWxfYWRkclswXSA9IHhsX3ByaXYtPnhsX2Z1bmN0aW9uYWxfYWRkclsxXSA9IHhsX3ByaXYtPnhsX2Z1bmN0aW9uYWxfYWRkclsyXSA9IHhsX3ByaXYtPnhsX2Z1bmN0aW9uYWxfYWRkclszXSA9IDAgOyAKKwl4bF9wcml2LT54bF9jb3B5X2FsbF9vcHRpb25zID0gMCA7IAorCQkKKwlpZigoaSA9IHhsX2luaXQoZGV2KSkpIHsKKwkJaW91bm1hcCh4bF9wcml2LT54bF9tbWlvKSA7IAorCQlmcmVlX25ldGRldihkZXYpIDsgCisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldikgOyAKKwkJcmV0dXJuIGkgOyAKKwl9CQkJCQorCisJZGV2LT5vcGVuPSZ4bF9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0PSZ4bF94bWl0OworCWRldi0+Y2hhbmdlX210dT0meGxfY2hhbmdlX210dTsKKwlkZXYtPnN0b3A9JnhsX2Nsb3NlOworCWRldi0+ZG9faW9jdGw9TlVMTDsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdD0meGxfc2V0X3J4X21vZGU7CisJZGV2LT5nZXRfc3RhdHM9JnhsX2dldF9zdGF0cyA7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3M9JnhsX3NldF9tYWNfYWRkcmVzcyA7IAorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsgCisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LGRldikgOyAKKwlpZiAoKGkgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KSkpIHsgCisJCXByaW50ayhLRVJOX0VSUiAiM0MzNTksIHJlZ2lzdGVyIG5ldGRldiBmYWlsZWRcbiIpIDsgIAorCQlwY2lfc2V0X2RydmRhdGEocGRldixOVUxMKSA7IAorCQlpb3VubWFwKHhsX3ByaXYtPnhsX21taW8pIDsgCisJCWZyZWVfbmV0ZGV2KGRldikgOyAKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KSA7IAorCQlyZXR1cm4gaSA7IAorCX0KKyAgIAorCXByaW50ayhLRVJOX0lORk8gIjNDMzU5OiAlcyByZWdpc3RlcmVkIGFzOiAlc1xuIix4bF9wcml2LT54bF9jYXJkX25hbWUsZGV2LT5uYW1lKSA7IAorCisJcmV0dXJuIDA7IAorfQorCisKK3N0YXRpYyBpbnQgX19pbml0IHhsX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisgICAgCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2ID0gKHN0cnVjdCB4bF9wcml2YXRlICopZGV2LT5wcml2IDsKKworCXByaW50ayhLRVJOX0lORk8gIiVzIFxuIiwgdmVyc2lvbik7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEkvTyBhdCAlaHgsIE1NSU8gYXQgJXAsIHVzaW5nIGlycSAlZFxuIiwKKwkJeGxfcHJpdi0+eGxfY2FyZF9uYW1lLCAodW5zaWduZWQgaW50KWRldi0+YmFzZV9hZGRyICx4bF9wcml2LT54bF9tbWlvLCBkZXYtPmlycSk7CisKKwlzcGluX2xvY2tfaW5pdCgmeGxfcHJpdi0+eGxfbG9jaykgOyAKKworCXJldHVybiB4bF9od19yZXNldChkZXYpIDsgCisKK30KKworCisvKiAKKyAqCUhhcmR3YXJlIHJlc2V0LiAgVGhpcyBuZWVkcyB0byBiZSBhIHNlcGFyYXRlIGVudGl0eSBhcyB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBjYXJkCisgKgl3aGVuIHdlIGNoYW5nZSB0aGUgRUVQcm9tIHNldHRpbmdzLgorICovCisKK3N0YXRpYyBpbnQgeGxfaHdfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7IAorICAgIAlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdiA9IChzdHJ1Y3QgeGxfcHJpdmF0ZSAqKWRldi0+cHJpdiA7CisJdTggX19pb21lbSAqeGxfbW1pbyA9IHhsX3ByaXYtPnhsX21taW8gOyAKKwl1bnNpZ25lZCBsb25nIHQgOyAKKwl1MTYgaSA7IAorICAgIAl1MTYgcmVzdWx0XzE2IDsgCisJdTggcmVzdWx0XzggOworCXUxNiBzdGFydCA7IAorCWludCBqIDsKKworCS8qCisJICogIFJlc2V0IHRoZSBjYXJkLiAgSWYgdGhlIGNhcmQgaGFzIGdvdCB0aGUgbWljcm9jb2RlIG9uIGJvYXJkLCB3ZSBoYXZlIAorICAgICAgICAgKiAgbWlzc2VkIHRoZSBpbml0aWFsaXphdGlvbiBpbnRlcnJ1cHQsIHNvIHdlIG11c3QgYWx3YXlzIGRvIHRoaXMuCisJICovCisKKwl3cml0ZXcoIEdMT0JBTF9SRVNFVCwgeGxfbW1pbyArIE1NSU9fQ09NTUFORCApIDsgCisKKwkvKiAKKwkgKiBNdXN0IHdhaXQgZm9yIGNtZEluUHJvZ3Jlc3MgYml0ICgxMikgdG8gY2xlYXIgYmVmb3JlIGNvbnRpbnVpbmcgd2l0aAorCSAqIGNhcmQgY29uZmlndXJhdGlvbi4KKwkgKi8KKworCXQ9amlmZmllczsKKwl3aGlsZSAocmVhZHcoeGxfbW1pbyArIE1NSU9fSU5UU1RBVFVTKSAmIElOVFNUQVRfQ01EX0lOX1BST0dSRVNTKSB7IAorCQlzY2hlZHVsZSgpOwkJCisJCWlmKGppZmZpZXMtdCA+IDQwKkhaKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAzQ09NIDNDMzU5IFZlbG9jaXR5IFhMICBjYXJkIG5vdCByZXNwb25kaW5nIHRvIGdsb2JhbCByZXNldC5cbiIsIGRldi0+bmFtZSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCS8qCisJICogIEVuYWJsZSBwbWJhciBieSBzZXR0aW5nIGJpdCBpbiBDUEF0dGVudGlvbgorCSAqLworCisJd3JpdGVsKCAoSU9fQllURV9SRUFEIHwgQ1BBVFRFTlRJT04pLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOworCXJlc3VsdF84ID0gcmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwlyZXN1bHRfOCA9IHJlc3VsdF84IHwgQ1BBX1BNQkFSVklTIDsgCisJd3JpdGVsKCAoSU9fQllURV9XUklURSB8IENQQVRURU5USU9OKSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd3JpdGViKHJlc3VsdF84LCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQorCS8qCisJICogUmVhZCBjcEhvbGQgYml0IGluIHBtYmFyLCBpZiBjbGVhcmVkIHdlIGhhdmUgZ290IEZsYXNocm9tIG9uIGJvYXJkLgorIAkgKiBJZiBub3QsIHdlIG5lZWQgdG8gdXBsb2FkIHRoZSBtaWNyb2NvZGUgdG8gdGhlIGNhcmQKKwkgKi8KKworCXdyaXRlbCggKElPX1dPUkRfUkVBRCB8IFBNQkFSKSx4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCk7ICAKKworI2lmIFhMX0RFQlVHCisJcHJpbnRrKEtFUk5fSU5GTyAiUmVhZCBmcm9tIFBNQkFSID0gJTA0eCBcbiIsIHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpKSA7IAorI2VuZGlmCisKKwlpZiAoIHJlYWR3KCAoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkpICAmIFBNQl9DUEhPTEQgKSB7IAorCisJCS8qIFNldCBQbUJhciwgcHJpdmF0ZU1lbW9yeUJhc2UgYml0cyAoODoyKSB0byAwICovCisKKwkJd3JpdGVsKCAoSU9fV09SRF9SRUFEIHwgUE1CQVIpLHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKTsgIAorCQlyZXN1bHRfMTYgPSByZWFkdyh4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQlyZXN1bHRfMTYgPSByZXN1bHRfMTYgJiB+KCgweDdGKSA8PCAyKSA7IAorCQl3cml0ZWwoIChJT19XT1JEX1dSSVRFIHwgUE1CQVIpLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJd3JpdGV3KHJlc3VsdF8xNix4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQorCQkvKiBTZXQgQ1BBdHRlbnRpb24sIG1lbVdyRW4gYml0ICovCisKKwkJd3JpdGVsKCAoSU9fQllURV9SRUFEIHwgQ1BBVFRFTlRJT04pLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJcmVzdWx0XzggPSByZWFkYih4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQlyZXN1bHRfOCA9IHJlc3VsdF84IHwgQ1BBX01FTVdSRU4gIDsgCisJCXdyaXRlbCggKElPX0JZVEVfV1JJVEUgfCBDUEFUVEVOVElPTiksIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl3cml0ZWIocmVzdWx0XzgsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisKKwkJLyogCisJCSAqIE5vdyB0byB3cml0ZSB0aGUgbWljcm9jb2RlIGludG8gdGhlIHNoYXJlZCByYW0gCisJIAkgKiBUaGUgbWljcm9jb2RlIG11c3QgZmluaXNoIGF0IHBvc2l0aW9uIDB4RkZGRiwgc28gd2UgbXVzdCBzdWJ0cmFjdAorCQkgKiB0byBnZXQgdGhlIHN0YXJ0IHBvc2l0aW9uIGZvciB0aGUgY29kZQorCQkgKi8KKworCQlzdGFydCA9ICgweEZGRkYgLSAobWNfc2l6ZSkgKyAxICkgOyAvKiBMb29rcyBzdHJhbmdlIGJ1dCBlbnN1cmVzIGNvbXBpbGVyIG9ubHkgdXNlcyAxNiBiaXQgdW5zaWduZWQgaW50IGZvciB0aGlzICovIAorCQkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiM0MzNTk6IFVwbG9hZGluZyBNaWNyb2NvZGU6ICIpOyAKKwkJCisJCWZvciAoaSA9IHN0YXJ0LCBqID0gMDsgaiA8IG1jX3NpemU7IGkrKywgaisrKSB7IAorCQkJd3JpdGVsKE1FTV9CWVRFX1dSSVRFIHwgMFhEMDAwMCB8IGksIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQkJd3JpdGViKG1pY3JvY29kZVtqXSx4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQkJaWYgKGogJSAxMDI0ID09IDApCisJCQkJcHJpbnRrKCIuIik7CisJCX0KKwkJcHJpbnRrKCJcbiIpIDsgCisKKwkJZm9yIChpPTA7aSA8IDE2OyBpKyspIHsgCisJCQl3cml0ZWwoIChNRU1fQllURV9XUklURSB8IDB4REZGRjApICsgaSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCQl3cml0ZWIobWljcm9jb2RlW21jX3NpemUgLSAxNiArIGldLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQl9CisKKwkJLyoKKwkJICogSGF2ZSB0byB3cml0ZSB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgdXBsb2FkIHRvIEZGRjQsIGJ1dAorICAgICAgICAgICAgICAgICAqIHRoZSBhZGRyZXNzIG11c3QgYmUgPj4gNC4gWW91IGRvIG5vdCB3YW50IHRvIGtub3cgaG93IGxvbmcKKyAgICAgICAgICAgICAgICAgKiBpdCB0b29rIG1lIHRvIGRpc2NvdmVyIHRoaXMuCisJCSAqLworCisJCXdyaXRlbChNRU1fV09SRF9XUklURSB8IDB4REZGRjQsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl3cml0ZXcoc3RhcnQgPj4gNCwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSk7CisKKwkJLyogQ2xlYXIgdGhlIENQQXR0ZW50aW9uLCBtZW1XckVuIEJpdCAqLworCQorCQl3cml0ZWwoIChJT19CWVRFX1JFQUQgfCBDUEFUVEVOVElPTiksIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQlyZXN1bHRfOCA9IHJlYWRiKHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCXJlc3VsdF84ID0gcmVzdWx0XzggJiB+Q1BBX01FTVdSRU4gOyAKKwkJd3JpdGVsKCAoSU9fQllURV9XUklURSB8IENQQVRURU5USU9OKSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCXdyaXRlYihyZXN1bHRfOCwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKworCQkvKiBDbGVhciB0aGUgY3BIb2xkIGJpdCBpbiBwbWJhciAqLworCisJCXdyaXRlbCggKElPX1dPUkRfUkVBRCB8IFBNQkFSKSx4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCk7ICAKKwkJcmVzdWx0XzE2ID0gcmVhZHcoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwkJcmVzdWx0XzE2ID0gcmVzdWx0XzE2ICYgflBNQl9DUEhPTEQgOyAKKwkJd3JpdGVsKCAoSU9fV09SRF9XUklURSB8IFBNQkFSKSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCXdyaXRldyhyZXN1bHRfMTYseGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKworCisJfSAvKiBJZiBtaWNyb2NvZGUgdXBsb2FkIHJlcXVpcmVkICovCisKKwkvKiAKKwkgKiBUaGUgY2FyZCBzaG91bGQgbm93IGdvIHRob3VnaCBhIHNlbGYgdGVzdCBwcm9jZWR1cmUgYW5kIGdldCBpdHNlbGYgcmVhZHkKKyAgICAgICAgICogdG8gYmUgb3BlbmVkLCB3ZSBtdXN0IHdhaXQgZm9yIGFuIHNyYiByZXNwb25zZSB3aXRoIHRoZSBpbml0aWFsaXphdGlvbgorICAgICAgICAgKiBpbmZvcm1hdGlvbi4gCisJICovCisKKyNpZiBYTF9ERUJVRworCXByaW50ayhLRVJOX0lORk8gIiVzOiBNaWNyb2NvZGUgdXBsb2FkZWQsIG11c3Qgd2FpdCBmb3IgdGhlIHNlbGYgdGVzdCB0byBjb21wbGV0ZVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJd3JpdGV3KFNFVElOREVOQUJMRSB8IDB4RkZGLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCisJdD1qaWZmaWVzOworCXdoaWxlICggIShyZWFkdyh4bF9tbWlvICsgTU1JT19JTlRTVEFUVVNfQVVUTykgJiBJTlRTVEFUX1NSQikgKSB7IAorCQlzY2hlZHVsZSgpOwkJCisJCWlmKGppZmZpZXMtdCA+IDE1KkhaKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIjNDT00gM0MzNTkgVmVsb2NpdHkgWEwgIGNhcmQgbm90IHJlc3BvbmRpbmcuXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOyAKKwkJfQorCX0KKworCS8qCisJICogV3JpdGUgdGhlIFJ4QnVmQXJlYSB3aXRoIEQwMDAsIFJ4RWFybHlUaHJlc2gsIFR4U3RhcnRUaHJlc2gsIAorIAkgKiBEblByaVJlcVRocmVzaCwgcmVhZCB0aGUgdGVjaCBkb2NzIGlmIHlvdSB3YW50IHRvIGtub3cgd2hhdAorCSAqIHZhbHVlcyB0aGV5IG5lZWQgdG8gYmUuCisJICovCisKKwl3cml0ZWwoTU1JT19XT1JEX1dSSVRFIHwgUlhCVUZBUkVBLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3cml0ZXcoMHhEMDAwLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQorCXdyaXRlbChNTUlPX1dPUkRfV1JJVEUgfCBSWEVBUkxZVEhSRVNILCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3cml0ZXcoMFgwMDIwLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQorCXdyaXRldyggU0VUVFhTVEFSVFRIUkVTSCB8IDB4NDAgLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCisJd3JpdGViKDB4MDQsIHhsX21taW8gKyBNTUlPX0ROQlVSU1RUSFJFU0gpIDsgCisJd3JpdGViKDB4MDQsIHhsX21taW8gKyBETlBSSVJFUVRIUkVTSCkgOworCisJLyoKKwkgKiBSZWFkIFdSQlIgdG8gcHJvdmlkZSB0aGUgbG9jYXRpb24gb2YgdGhlIHNyYiBibG9jaywgaGF2ZSB0byB1c2UgYnl0ZSByZWFkcyBub3Qgd29yZCByZWFkcy4gCisJICogVGVjaCBkb2NzIGhhdmUgdGhpcyB3cm9uZyAhISEhCisJICovCisKKwl3cml0ZWwoTU1JT19CWVRFX1JFQUQgfCBXUkJSLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl4bF9wcml2LT5zcmIgPSByZWFkYih4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA8PCA4IDsgCisJd3JpdGVsKCAoTU1JT19CWVRFX1JFQUQgfCBXUkJSKSArIDEsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXhsX3ByaXYtPnNyYiA9IHhsX3ByaXYtPnNyYiB8IHJlYWRiKHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsKKworI2lmIFhMX0RFQlVHCisJd3JpdGVsKElPX1dPUkRfUkVBRCB8IFNXSVRDSFNFVFRJTkdTLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwlpZiAoIHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpICYgMikgeyAKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRGVmYXVsdCByaW5nIHNwZWVkIDQgbWJwcyBcbiIpIDsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJEZWZhdWx0IHJpbmcgc3BlZWQgMTYgbWJwcyBcbiIpIDsgCisJfSAKKwlwcmludGsoS0VSTl9JTkZPICIlczogeGxfcHJpdi0+c3JiID0gJTA0eFxuIix4bF9wcml2LT54bF9jYXJkX25hbWUsIHhsX3ByaXYtPnNyYik7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhsX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXY9KHN0cnVjdCB4bF9wcml2YXRlICopZGV2LT5wcml2OworCXU4IF9faW9tZW0gKnhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisJdTggaSA7IAorCXUxNiBod2FkZHJbM10gOyAvKiBTaG91bGQgYmUgdThbNl0gYnV0IHdlIGdldCB3b3JkIHJldHVybiB2YWx1ZXMgKi8KKwlpbnQgb3Blbl9lcnIgOworCisJdTE2IHN3aXRjaHNldHRpbmdzLCBzd2l0Y2hzZXR0aW5nc19lZXByb20gIDsKKyAKKwlpZihyZXF1ZXN0X2lycShkZXYtPmlycSwgJnhsX2ludGVycnVwdCwgU0FfU0hJUlEgLCAiM2MzNTkiLCBkZXYpKSB7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCS8qIAorCSAqIFJlYWQgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIEVFUFJPTSB0aGF0IHdlIG5lZWQuIEkga25vdyB3ZQorIAkgKiBzaG91bGQgdXNlIG50b2hzLCBidXQgdGhlIHdvcmQgZ2V0cyBzdG9yZWQgcmV2ZXJzZWQgaW4gdGhlIDE2CisJICogYml0IGZpZWxkIGFueXdheSBhbmQgaXQgYWxsIHdvcmtzIGl0cyBzZWxmIG91dCB3aGVuIHdlIG1lbWNweQorCSAqIGl0IGludG8gZGV2LT5kZXZfYWRkci4gCisJICovCisJCisJaHdhZGRyWzBdID0geGxfZWVfcmVhZChkZXYsMHgxMCkgOyAKKwlod2FkZHJbMV0gPSB4bF9lZV9yZWFkKGRldiwweDExKSA7IAorCWh3YWRkclsyXSA9IHhsX2VlX3JlYWQoZGV2LDB4MTIpIDsgCisKKwkvKiBSaW5nIHNwZWVkICovCisKKwlzd2l0Y2hzZXR0aW5nc19lZXByb20gPSB4bF9lZV9yZWFkKGRldiwweDA4KSA7CisJc3dpdGNoc2V0dGluZ3MgPSBzd2l0Y2hzZXR0aW5nc19lZXByb20gOyAgCisKKwlpZiAoeGxfcHJpdi0+eGxfcmluZ19zcGVlZCAhPSAwKSB7IAorCQlpZiAoeGxfcHJpdi0+eGxfcmluZ19zcGVlZCA9PSA0KSAgCisJCQlzd2l0Y2hzZXR0aW5ncyA9IHN3aXRjaHNldHRpbmdzIHwgMHgwMiA7IAorCQllbHNlIAorCQkJc3dpdGNoc2V0dGluZ3MgPSBzd2l0Y2hzZXR0aW5ncyAmIH4weDAyIDsgCisJfQorCisJLyogT25seSB3cml0ZSBFRVByb20gaWYgdGhlcmUgaGFzIGJlZW4gYSBjaGFuZ2UgKi8KKwlpZiAoc3dpdGNoc2V0dGluZ3MgIT0gc3dpdGNoc2V0dGluZ3NfZWVwcm9tKSB7IAorCQl4bF9lZV93cml0ZShkZXYsMHgwOCxzd2l0Y2hzZXR0aW5ncykgOyAKKwkJLyogSGFyZHdhcmUgcmVzZXQgYWZ0ZXIgY2hhbmdpbmcgRUVQcm9tICovCisJCXhsX2h3X3Jlc2V0KGRldikgOyAKKwl9CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkcixod2FkZHIsZGV2LT5hZGRyX2xlbikgOyAKKwkKKwlvcGVuX2VyciA9IHhsX29wZW5faHcoZGV2KSA7IAorCisJLyogCisJICogVGhpcyByZWFsbHkgbmVlZHMgdG8gYmUgY2xlYW5lZCB1cCB3aXRoIGJldHRlciBlcnJvciByZXBvcnRpbmcuCisJICovCisKKwlpZiAob3Blbl9lcnIgIT0gMCkgeyAvKiBTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSBvcGVuIGNvbW1hbmQgKi8KKwkJaWYgKG9wZW5fZXJyICYgMHgwNykgeyAvKiBXcm9uZyBzcGVlZCwgcmV0cnkgYXQgZGlmZmVyZW50IHNwZWVkICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3BlbiBFcnJvciwgcmV0cnlpbmcgYXQgZGlmZmVyZW50IHJpbmdzcGVlZCBcbiIsIGRldi0+bmFtZSkgOyAKKwkJCXN3aXRjaHNldHRpbmdzID0gc3dpdGNoc2V0dGluZ3MgXiAyIDsgCisJCQl4bF9lZV93cml0ZShkZXYsMHgwOCxzd2l0Y2hzZXR0aW5ncykgOyAKKwkJCXhsX2h3X3Jlc2V0KGRldikgOyAKKwkJCW9wZW5fZXJyID0geGxfb3Blbl9odyhkZXYpIDsgCisJCQlpZiAob3Blbl9lcnIgIT0gMCkgeyAKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3BlbiBlcnJvciByZXR1cm5lZCBhIHNlY29uZCB0aW1lLCB3ZSdyZSBib21iaW5nIG91dCBub3dcbiIsIGRldi0+bmFtZSk7IAorCQkJCWZyZWVfaXJxKGRldi0+aXJxLGRldikgOyAJCQkJCQkKKwkJCQlyZXR1cm4gLUVOT0RFViA7CisJCQl9ICAKKwkJfSBlbHNlIHsgCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3BlbiBFcnJvciA9ICUwNHhcbiIsIGRldi0+bmFtZSwgb3Blbl9lcnIpIDsgCisJCQlmcmVlX2lycShkZXYtPmlycSxkZXYpIDsgCisJCQlyZXR1cm4gLUVOT0RFViA7IAorCQl9CisJfQorCisJLyoKKwkgKiBOb3cgdG8gc2V0IHVwIHRoZSBSeCBhbmQgVHggYnVmZmVyIHN0cnVjdHVyZXMKKwkgKi8KKwkvKiBUaGVzZSBNVVNUIGJlIG9uIDggYnl0ZSBib3VuZGFyaWVzICovCisJeGxfcHJpdi0+eGxfdHhfcmluZyA9IGttYWxsb2MoKHNpemVvZihzdHJ1Y3QgeGxfdHhfZGVzYykgKiBYTF9UWF9SSU5HX1NJWkUpICsgNywgR0ZQX0RNQSB8IEdGUF9LRVJORUwpIDsgCisJaWYgKHhsX3ByaXYtPnhsX3R4X3JpbmcgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgcnggYnVmZmVycy5cbiIsCisJCQkJICAgICBkZXYtPm5hbWUpOworCQlmcmVlX2lycShkZXYtPmlycSxkZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJeGxfcHJpdi0+eGxfcnhfcmluZyA9IGttYWxsb2MoKHNpemVvZihzdHJ1Y3QgeGxfcnhfZGVzYykgKiBYTF9SWF9SSU5HX1NJWkUpICs3LCBHRlBfRE1BIHwgR0ZQX0tFUk5FTCkgOyAKKwlpZiAoeGxfcHJpdi0+eGxfdHhfcmluZyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSByeCBidWZmZXJzLlxuIiwKKwkJCQkgICAgIGRldi0+bmFtZSk7CisJCWZyZWVfaXJxKGRldi0+aXJxLGRldik7CisJCWtmcmVlKHhsX3ByaXYtPnhsX3R4X3JpbmcpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHhsX3ByaXYtPnhsX3R4X3JpbmcsMCxzaXplb2Yoc3RydWN0IHhsX3R4X2Rlc2MpICogWExfVFhfUklOR19TSVpFKSA7IAorCW1lbXNldCh4bF9wcml2LT54bF9yeF9yaW5nLDAsc2l6ZW9mKHN0cnVjdCB4bF9yeF9kZXNjKSAqIFhMX1JYX1JJTkdfU0laRSkgOyAKKworCSAvKiBTZXR1cCBSeCBSaW5nICovCisJIGZvciAoaT0wIDsgaSA8IFhMX1JYX1JJTkdfU0laRSA7IGkrKykgeyAKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA7IAorCisJCXNrYiA9IGRldl9hbGxvY19za2IoeGxfcHJpdi0+cGt0X2J1Zl9zeikgOyAKKwkJaWYgKHNrYj09TlVMTCkgCisJCQlicmVhayA7IAorCisJCXNrYi0+ZGV2ID0gZGV2IDsgCisJCXhsX3ByaXYtPnhsX3J4X3JpbmdbaV0udXBmcmFnYWRkciA9IHBjaV9tYXBfc2luZ2xlKHhsX3ByaXYtPnBkZXYsIHNrYi0+ZGF0YSx4bF9wcml2LT5wa3RfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpIDsgCisJCXhsX3ByaXYtPnhsX3J4X3JpbmdbaV0udXBmcmFnbGVuID0geGxfcHJpdi0+cGt0X2J1Zl9zeiB8IFJYVVBMQVNURlJBRzsKKwkJeGxfcHJpdi0+cnhfcmluZ19za2JbaV0gPSBza2IgOyAJCisJfQorCisJaWYgKGk9PTApIHsgCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSByeCBidWZmZXJzLiBBZGFwdGVyIGRpc2FibGVkIFxuIixkZXYtPm5hbWUpIDsgCisJCWZyZWVfaXJxKGRldi0+aXJxLGRldikgOyAKKwkJcmV0dXJuIC1FSU8gOyAKKwl9IAorCisJeGxfcHJpdi0+cnhfcmluZ19ubyA9IGkgOyAKKwl4bF9wcml2LT5yeF9yaW5nX3RhaWwgPSAwIDsgCisJeGxfcHJpdi0+cnhfcmluZ19kbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHhsX3ByaXYtPnBkZXYseGxfcHJpdi0+eGxfcnhfcmluZywgc2l6ZW9mKHN0cnVjdCB4bF9yeF9kZXNjKSAqIFhMX1JYX1JJTkdfU0laRSwgUENJX0RNQV9UT0RFVklDRSkgOyAKKwlmb3IgKGk9MDtpPCh4bF9wcml2LT5yeF9yaW5nX25vLTEpO2krKykgeyAKKwkJeGxfcHJpdi0+eGxfcnhfcmluZ1tpXS51cG5leHRwdHIgPSB4bF9wcml2LT5yeF9yaW5nX2RtYV9hZGRyICsgKHNpemVvZiAoc3RydWN0IHhsX3J4X2Rlc2MpICogKGkrMSkpIDsgCisJfSAKKwl4bF9wcml2LT54bF9yeF9yaW5nW2ldLnVwbmV4dHB0ciA9IDAgOyAKKworCXdyaXRlbCh4bF9wcml2LT5yeF9yaW5nX2RtYV9hZGRyLCB4bF9tbWlvICsgTU1JT19VUExJU1RQVFIpIDsgCisJCisJLyogU2V0dXAgVHggUmluZyAqLworCQorCXhsX3ByaXYtPnR4X3JpbmdfZG1hX2FkZHIgPSBwY2lfbWFwX3NpbmdsZSh4bF9wcml2LT5wZGV2LHhsX3ByaXYtPnhsX3R4X3JpbmcsIHNpemVvZihzdHJ1Y3QgeGxfdHhfZGVzYykgKiBYTF9UWF9SSU5HX1NJWkUsUENJX0RNQV9UT0RFVklDRSkgOyAKKwkKKwl4bF9wcml2LT50eF9yaW5nX2hlYWQgPSAxIDsgCisJeGxfcHJpdi0+dHhfcmluZ190YWlsID0gMjU1IDsgLyogU3BlY2lhbCBtYXJrZXIgZm9yIGZpcnN0IHBhY2tldCAqLworCXhsX3ByaXYtPmZyZWVfcmluZ19lbnRyaWVzID0gWExfVFhfUklOR19TSVpFIDsgCisKKwkvKgorIAkgKiBTZXR1cCB0aGUgZmlyc3QgZHVtbXkgRFBEIGVudHJ5IGZvciBwb2xsaW5nIHRvIHN0YXJ0IHdvcmtpbmcuCisJICovCisKKwl4bF9wcml2LT54bF90eF9yaW5nWzBdLmZyYW1lc3RhcnRoZWFkZXIgPSBUWERQREVNUFRZIDsgCisJeGxfcHJpdi0+eGxfdHhfcmluZ1swXS5idWZmZXIgPSAwIDsgCisJeGxfcHJpdi0+eGxfdHhfcmluZ1swXS5idWZmZXJfbGVuZ3RoID0gMCA7IAorCXhsX3ByaXYtPnhsX3R4X3JpbmdbMF0uZG5uZXh0cHRyID0gMCA7IAorCisJd3JpdGVsKHhsX3ByaXYtPnR4X3JpbmdfZG1hX2FkZHIsIHhsX21taW8gKyBNTUlPX0ROTElTVFBUUikgOyAKKwl3cml0ZWwoRE5VTlNUQUxMLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCXdyaXRlbChVUFVOU1RBTEwsIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisJd3JpdGVsKERORU5BQkxFLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCXdyaXRlYigweDQwLCB4bF9tbWlvICsgTU1JT19ETlBPTEwpIDsJCisKKwkvKgorCSAqIEVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBjYXJkCisJICovCisKKwl3cml0ZWwoU0VUSU5URU5BQkxFIHwgSU5UX01BU0ssIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisJd3JpdGVsKFNFVElOREVOQUJMRSB8IElOVF9NQVNLLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KSA7IAkKKwlyZXR1cm4gMDsKKwkKK30JCisKK3N0YXRpYyBpbnQgeGxfb3Blbl9odyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sgCisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXY9KHN0cnVjdCB4bF9wcml2YXRlICopZGV2LT5wcml2OworCXU4IF9faW9tZW0gKnhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisJdTE2IHZzb2ZmIDsKKwljaGFyIHZlcl9zdHJbMzNdOyAgCisJaW50IG9wZW5fZXJyIDsgCisJaW50IGkgOyAKKwl1bnNpZ25lZCBsb25nIHQgOyAKKworCS8qCisJICogT2theSwgbGV0J3MgYnVpbGQgdXAgdGhlIE9wZW4uTklDIHNyYiBjb21tYW5kCisJICoKKwkgKi8KKwkJCisJd3JpdGVsKCAoTUVNX0JZVEVfV1JJVEUgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiKSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd3JpdGViKE9QRU5fTklDLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQorCS8qCisJICogVXNlIHRoaXMgYXMgYSB0ZXN0IGJ5dGUsIGlmIGl0IGNvbWVzIGJhY2sgd2l0aCB0aGUgc2FtZSB2YWx1ZSwgdGhlIGNvbW1hbmQgZGlkbid0IHdvcmsKKwkgKi8KKworCXdyaXRlbCggKE1FTV9CWVRFX1dSSVRFIHwgMHhEMDAwMCB8IHhsX3ByaXYtPnNyYikrIDIsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdyaXRlYigweGZmLHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisKKwkvKiBPcGVuIG9wdGlvbnMgKi8KKwl3cml0ZWwoIChNRU1fQllURV9XUklURSB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIpICsgOCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd3JpdGViKDB4MDAsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJd3JpdGVsKCAoTUVNX0JZVEVfV1JJVEUgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiKSArIDksIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdyaXRlYigweDAwLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCisJLyogCisJICogTm9kZSBhZGRyZXNzLCBiZSBjYXJlZnVsIGhlcmUsIHRoZSBkb2NzIHNheSB5b3UgY2FuIGp1c3QgcHV0IHplcm9zIGhlcmUgYW5kIGl0IHdpbGwgdXNlCisJICogdGhlIGhhcmR3YXJlIGFkZHJlc3MsIGl0IGRvZXNuJ3QsIHlvdSBtdXN0IGluY2x1ZGUgdGhlIG5vZGUgYWRkcmVzcyBpbiB0aGUgb3BlbiBjb21tYW5kLgorCSAqLworCisJaWYgKHhsX3ByaXYtPnhsX2xhYVswXSkgeyAgLyogSWYgdXNpbmcgYSBMQUEgYWRkcmVzcyAqLworCQlmb3IgKGk9MTA7aTwxNjtpKyspIHsgCisJCQl3cml0ZWwoIChNRU1fQllURV9XUklURSB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIpICsgaSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCQl3cml0ZWIoeGxfcHJpdi0+eGxfbGFhW2ldLHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCX0KKwkJbWVtY3B5KGRldi0+ZGV2X2FkZHIseGxfcHJpdi0+eGxfbGFhLGRldi0+YWRkcl9sZW4pIDsgCisJfSBlbHNlIHsgLyogUmVndWxhciBoYXJkd2FyZSBhZGRyZXNzICovIAorCQlmb3IgKGk9MTA7aTwxNjtpKyspIHsgCisJCQl3cml0ZWwoIChNRU1fQllURV9XUklURSB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIpICsgaSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCQl3cml0ZWIoZGV2LT5kZXZfYWRkcltpLTEwXSwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwkJfQorCX0KKworCS8qIERlZmF1bHQgZXZlcnl0aGluZyBlbHNlIHRvIDAgKi8KKwlmb3IgKGkgPSAxNjsgaSA8IDM0OyBpKyspIHsKKwkJd3JpdGVsKCAoTUVNX0JZVEVfV1JJVEUgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiKSArIGksIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl3cml0ZWIoMHgwMCx4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCX0KKwkKKwkvKgorCSAqICBTZXQgdGhlIGNzcmIgYml0IGluIHRoZSBNSVNSIHJlZ2lzdGVyCisJICovCisKKwl4bF93YWl0X21pc3JfZmxhZ3MoZGV2KSA7IAorCXdyaXRlbChNRU1fQllURV9XUklURSB8IE1GX0NTUkIsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdyaXRlYigweEZGLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCXdyaXRlbChNTUlPX0JZVEVfV1JJVEUgfCBNSVNSX1NFVCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd3JpdGViKE1JU1JfQ1NSQiAsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisKKwkvKgorCSAqIE5vdyB3YWl0IGZvciB0aGUgY29tbWFuZCB0byBydW4KKwkgKi8KKworCXQ9amlmZmllczsKKwl3aGlsZSAoISAocmVhZHcoeGxfbW1pbyArIE1NSU9fSU5UU1RBVFVTKSAmIElOVFNUQVRfU1JCKSkgeyAKKwkJc2NoZWR1bGUoKTsJCQorCQlpZihqaWZmaWVzLXQgPiA0MCpIWikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIzQ09NIDNDMzU5IFZlbG9jaXR5IFhMICBjYXJkIG5vdCByZXNwb25kaW5nLlxuIik7CisJCQlicmVhayA7IAorCQl9CisJfQorCisJLyoKKwkgKiBMZXQncyBpbnRlcnByZXQgdGhlIG9wZW4gcmVzcG9uc2UKKwkgKi8KKworCXdyaXRlbCggKE1FTV9CWVRFX1JFQUQgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiKSsyLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwlpZiAocmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkhPTApIHsKKwkJb3Blbl9lcnIgPSByZWFkYih4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA8PCA4IDsgCisJCXdyaXRlbCggKE1FTV9CWVRFX1JFQUQgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiKSArIDcsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQlvcGVuX2VyciB8PSByZWFkYih4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQlyZXR1cm4gb3Blbl9lcnIgOyAKKwl9IGVsc2UgeyAKKwkJd3JpdGVsKCAoTUVNX1dPUkRfUkVBRCB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIpICsgOCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCXhsX3ByaXYtPmFzYiA9IG50b2hzKHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpKSA7IAorCQlwcmludGsoS0VSTl9JTkZPICIlczogQWRhcHRlciBPcGVuZWQgRGV0YWlsczogIixkZXYtPm5hbWUpIDsgCisJCXByaW50aygiQVNCOiAlMDR4Iix4bF9wcml2LT5hc2IgKSA7IAorCQl3cml0ZWwoIChNRU1fV09SRF9SRUFEIHwgMHhEMDAwMCB8IHhsX3ByaXYtPnNyYikgKyAxMCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCXByaW50aygiLCBTUkI6ICUwNHgiLG50b2hzKHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpKSApIDsgCisgCisJCXdyaXRlbCggKE1FTV9XT1JEX1JFQUQgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiKSArIDEyLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJeGxfcHJpdi0+YXJiID0gbnRvaHMocmVhZHcoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkpIDsgCisJCXByaW50aygiLCBBUkI6ICUwNHggXG4iLHhsX3ByaXYtPmFyYiApIDsgCisJCXdyaXRlbCggKE1FTV9XT1JEX1JFQUQgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiKSArIDE0LCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJdnNvZmYgPSBudG9ocyhyZWFkdyh4bF9tbWlvICsgTU1JT19NQUNEQVRBKSkgOyAKKworCQkvKiAKKwkJICogSW50ZXJlc3RpbmcsIHNlbmRpbmcgdGhlIGluZGl2aWR1YWwgY2hhcmFjdGVycyBkaXJlY3RseSB0byBwcmludGsgd2FzIGNhdXNpbmcga2xvZ2QgdG8gdXNlCisJCSAqIHVzZSAxMDAlIG9mIHByb2Nlc3NvciB0aW1lLCBzbyB3ZSBidWlsZCB1cCB0aGUgc3RyaW5nIGFuZCBwcmludCB0aGF0IGluc3RlYWQuCisJICAgCSAqLworCisJCWZvciAoaT0wO2k8MHgyMDtpKyspIHsgCisJCQl3cml0ZWwoIChNRU1fQllURV9SRUFEIHwgMHhEMDAwMCB8IHZzb2ZmKSArIGksIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQkJdmVyX3N0cltpXSA9IHJlYWRiKHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCX0KKwkJdmVyX3N0cltpXSA9ICdcMCcgOyAKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1pY3JvY29kZSB2ZXJzaW9uIFN0cmluZzogJXMgXG4iLGRldi0+bmFtZSx2ZXJfc3RyKTsgCisJfSAJCisJCisJLyoKKwkgKiBJc3N1ZSB0aGUgQWNrSW50ZXJydXB0CisJICovCisJd3JpdGV3KEFDS19JTlRFUlJVUFQgfCBTUkJSQUNLIHwgTEFUQ0hfQUNLLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCisJcmV0dXJuIDAgOyAKK30KKworLyoKKyAqCVRoZXJlIGFyZSB0d28gd2F5cyBvZiBpbXBsZW1lbnRpbmcgcnggb24gdGhlIDM1OSBOSUMsIGVpdGhlcgorICogCWludGVycnVwdCBkcml2ZW4gb3IgcG9sbGluZy4gIFdlIGFyZSBnb2luZyB0byB1c2VzIGludGVycnVwdHMsCisgKglpdCBpcyB0aGUgZWFzaWVyIHdheSBvZiBkb2luZyB0aGluZ3MuCisgKgkKKyAqCVRoZSBSeCB3b3JrcyB3aXRoIGEgcmluZyBvZiBSeCBkZXNjcmlwdG9ycy4gIEF0IGluaXRpYWxpc2UgdGltZSB0aGUgcmluZworICoJZW50cmllcyBwb2ludCB0byB0aGUgbmV4dCBlbnRyeSBleGNlcHQgZm9yIHRoZSBsYXN0IGVudHJ5IGluIHRoZSByaW5nIAorICoJd2hpY2ggcG9pbnRzIHRvIDAuICBUaGUgY2FyZCBpcyBwcm9ncmFtbWVkIHdpdGggdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXJzdAorICoJYXZhaWxhYmxlIGRlc2NyaXB0b3IgYW5kIGtlZXBzIHJlYWRpbmcgdGhlIG5leHRfcHRyIHVudGlsIG5leHRfcHRyIGlzIHNldAorICoJdG8gMC4gIEhvcGVmdWxseSB3aXRoIGEgcmluZyBzaXplIG9mIDE2IHRoZSBjYXJkIHdpbGwgbmV2ZXIgZ2V0IHRvIHJlYWQgYSBuZXh0X3B0cgorICoJb2YgMC4gIEFzIHRoZSBSeCBpbnRlcnJ1cHQgaXMgcmVjZWl2ZWQgd2UgY29weSB0aGUgZnJhbWUgdXAgdG8gdGhlIHByb3RvY29sIGxheWVycworICoJYW5kIHRoZW4gcG9pbnQgdGhlIGVuZCBvZiB0aGUgcmluZyB0byBvdXIgY3VycmVudCBwb3NpdGlvbiBhbmQgcG9pbnQgb3VyIGN1cnJlbnQKKyAqCXBvc2l0aW9uIHRvIDAsIHRoZXJlZm9yZSBtYWtpbmcgdGhlIGN1cnJlbnQgcG9zaXRpb24gdGhlIGxhc3QgcG9zaXRpb24gb24gdGhlIHJpbmcuCisgKglUaGUgbGFzdCBwb3NpdGlvbiBvbiB0aGUgcmluZyB0aGVyZWZvcmUgbG9vcHMgY29udGludWFsbHkgbG9vcHMgYXJvdW5kIHRoZSByeCByaW5nLgorICoJCisgKglyeF9yaW5nX3RhaWwgaXMgdGhlIHBvc2l0aW9uIG9uIHRoZSByaW5nIHRvIHByb2Nlc3MgbmV4dC4gKFRoaW5rIG9mIGEgc25ha2UsIHRoZSBoZWFkIAorICoJZXhwYW5kcyBhcyB0aGUgY2FyZCBhZGRzIG5ldyBwYWNrZXRzIGFuZCB3ZSBnbyBhcm91bmQgZWF0aW5nIHRoZSB0YWlsIHByb2Nlc3NpbmcgdGhlCisgKglwYWNrZXRzLikKKyAqCisgKglVbmRvdWJ0YWJseSBpdCBjb3VsZCBiZSBzdHJlYW1saW5lZCBhbmQgaW1wcm92ZWQgdXBvbiwgYnV0IGF0IHRoZSBtb21lbnQgaXQgd29ya3MgCisgKglhbmQgdGhlIGZhc3QgcGF0aCB0aHJvdWdoIHRoZSByb3V0aW5lIGlzIGZpbmUuIAorICoJCisgKglhZHZfcnhfcmluZyBjb3VsZCBiZSBpbmxpbmVkIHRvIGluY3JlYXNlIHBlcmZvcm1hbmNlLCBidXQgaXRzIGNhbGxlZCBhICpsb3QqIG9mIHRpbWVzCisgKglpbiB4bF9yeCBzbyB3b3VsZCBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgZnVuY3Rpb24gc2lnbmlmaWNhbnRseS4gCisgKi8KKworc3RhdGljIHZvaWQgYWR2X3J4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgLyogQWR2YW5jZSByeF9yaW5nLCBjdXQgZG93biBvbiBibG9hdCBpbiB4bF9yeCAqLyAKK3sKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdj0oc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXY7CisJaW50IHByZXZfcmluZ19sb2MgOyAKKworCXByZXZfcmluZ19sb2MgPSAoeGxfcHJpdi0+cnhfcmluZ190YWlsICsgWExfUlhfUklOR19TSVpFIC0gMSkgJiAoWExfUlhfUklOR19TSVpFIC0gMSk7CisJeGxfcHJpdi0+eGxfcnhfcmluZ1twcmV2X3JpbmdfbG9jXS51cG5leHRwdHIgPSB4bF9wcml2LT5yeF9yaW5nX2RtYV9hZGRyICsgKHNpemVvZiAoc3RydWN0IHhsX3J4X2Rlc2MpICogeGxfcHJpdi0+cnhfcmluZ190YWlsKSA7IAorCXhsX3ByaXYtPnhsX3J4X3JpbmdbeGxfcHJpdi0+cnhfcmluZ190YWlsXS5mcmFtZXN0YXR1cyA9IDAgOyAKKwl4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0udXBuZXh0cHRyID0gMCA7IAkKKwl4bF9wcml2LT5yeF9yaW5nX3RhaWwrKyA7IAorCXhsX3ByaXYtPnJ4X3JpbmdfdGFpbCAmPSAoWExfUlhfUklOR19TSVpFLTEpIDsgCisKKwlyZXR1cm4gOyAKK30KKworc3RhdGljIHZvaWQgeGxfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdj0oc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXY7CisJdTggX19pb21lbSAqIHhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnNrYjIgOyAKKwlpbnQgZnJhbWVfbGVuZ3RoID0gMCwgY29weV9sZW4gPSAwICA7IAkKKwlpbnQgdGVtcF9yaW5nX2xvYyA7ICAKKworCS8qCisJICogUmVjZWl2ZSB0aGUgbmV4dCBmcmFtZSwgbG9vcCBhcm91bmQgdGhlIHJpbmcgdW50aWwgYWxsIGZyYW1lcworICAJICogaGF2ZSBiZWVuIHJlY2VpdmVkLgorCSAqLyAJIAorCQorCXdoaWxlICh4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0uZnJhbWVzdGF0dXMgJiAoUlhVUERDT01QTEVURSB8IFJYVVBERlVMTCkgKSB7IC8qIERlc2NyaXB0b3IgdG8gcHJvY2VzcyAqLworCisJCWlmICh4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0uZnJhbWVzdGF0dXMgJiBSWFVQREZVTEwgKSB7IC8qIFVwZEZ1bGwsIE11bHRpcGxlIERlc2NyaXB0b3JzIHVzZWQgZm9yIHRoZSBmcmFtZSAqLworCisJCQkvKiAKKwkJCSAqIFRoaXMgaXMgYSBwYWluLCB5b3UgbmVlZCB0byBnbyB0aHJvdWdoIGFsbCB0aGUgZGVzY3JpcHRvcnMgdW50aWwgdGhlIGxhc3Qgb25lIAorCQkJICogZm9yIHRoaXMgZnJhbWUgdG8gZmluZCB0aGUgZnJhbWVsZW5ndGgKKwkJCSAqLworCisJCQl0ZW1wX3JpbmdfbG9jID0geGxfcHJpdi0+cnhfcmluZ190YWlsIDsgCisKKwkJCXdoaWxlICh4bF9wcml2LT54bF9yeF9yaW5nW3RlbXBfcmluZ19sb2NdLmZyYW1lc3RhdHVzICYgUlhVUERGVUxMICkgeworCQkJCXRlbXBfcmluZ19sb2MrKyA7IAorCQkJCXRlbXBfcmluZ19sb2MgJj0gKFhMX1JYX1JJTkdfU0laRS0xKSA7IAorCQkJfQorCisJCQlmcmFtZV9sZW5ndGggPSB4bF9wcml2LT54bF9yeF9yaW5nW3RlbXBfcmluZ19sb2NdLmZyYW1lc3RhdHVzICYgMHg3RkZGIDsgCisKKwkJCXNrYiA9IGRldl9hbGxvY19za2IoZnJhbWVfbGVuZ3RoKSA7CisgCisJCQlpZiAoc2tiPT1OVUxMKSB7IC8qIE5vIG1lbW9yeSBmb3IgZnJhbWUsIHN0aWxsIG5lZWQgdG8gcm9sbCBmb3J3YXJkIHRoZSByeCByaW5nICovCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRldl9hbGxvY19za2IgZmFpbGVkIC0gbXVsdGkgYnVmZmVyICFcbiIsIGRldi0+bmFtZSkgOyAKKwkJCQl3aGlsZSAoeGxfcHJpdi0+cnhfcmluZ190YWlsICE9IHRlbXBfcmluZ19sb2MpICAKKwkJCQkJYWR2X3J4X3JpbmcoZGV2KSA7IAorCQkJCQorCQkJCWFkdl9yeF9yaW5nKGRldikgOyAvKiBPbmUgbW9yZSB0aW1lIGp1c3QgZm9yIGx1Y2sgOikgKi8gCisJCQkJeGxfcHJpdi0+eGxfc3RhdHMucnhfZHJvcHBlZCsrIDsgCisKKwkJCQl3cml0ZWwoQUNLX0lOVEVSUlVQVCB8IFVQQ09NUEFDSyB8IExBVENIX0FDSyAsIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisJCQkJcmV0dXJuIDsgCQkJCQorCQkJfQorCQorCQkJc2tiLT5kZXYgPSBkZXYgOyAKKworCQkJd2hpbGUgKHhsX3ByaXYtPnJ4X3JpbmdfdGFpbCAhPSB0ZW1wX3JpbmdfbG9jKSB7IAorCQkJCWNvcHlfbGVuID0geGxfcHJpdi0+eGxfcnhfcmluZ1t4bF9wcml2LT5yeF9yaW5nX3RhaWxdLnVwZnJhZ2xlbiAmIDB4N0ZGRiA7IAorCQkJCWZyYW1lX2xlbmd0aCAtPSBjb3B5X2xlbiA7ICAKKwkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoeGxfcHJpdi0+cGRldix4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0udXBmcmFnYWRkcix4bF9wcml2LT5wa3RfYnVmX3N6LFBDSV9ETUFfRlJPTURFVklDRSkgOworCQkJCW1lbWNweShza2JfcHV0KHNrYixjb3B5X2xlbiksIHhsX3ByaXYtPnJ4X3Jpbmdfc2tiW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0tPmRhdGEsIGNvcHlfbGVuKSA7IAorCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSh4bF9wcml2LT5wZGV2LHhsX3ByaXYtPnhsX3J4X3JpbmdbeGxfcHJpdi0+cnhfcmluZ190YWlsXS51cGZyYWdhZGRyLHhsX3ByaXYtPnBrdF9idWZfc3osUENJX0RNQV9GUk9NREVWSUNFKSA7CisJCQkJYWR2X3J4X3JpbmcoZGV2KSA7IAorCQkJfSAKKworCQkJLyogTm93IHdlIGhhdmUgZm91bmQgdGhlIGxhc3QgZnJhZ21lbnQgKi8KKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdSh4bF9wcml2LT5wZGV2LHhsX3ByaXYtPnhsX3J4X3JpbmdbeGxfcHJpdi0+cnhfcmluZ190YWlsXS51cGZyYWdhZGRyLHhsX3ByaXYtPnBrdF9idWZfc3osUENJX0RNQV9GUk9NREVWSUNFKSA7CisJCQltZW1jcHkoc2tiX3B1dChza2IsY29weV9sZW4pLCB4bF9wcml2LT5yeF9yaW5nX3NrYlt4bF9wcml2LT5yeF9yaW5nX3RhaWxdLT5kYXRhLCBmcmFtZV9sZW5ndGgpIDsgCisvKgkJCW1lbWNweShza2JfcHV0KHNrYixmcmFtZV9sZW5ndGgpLCBidXNfdG9fdmlydCh4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0udXBmcmFnYWRkciksIGZyYW1lX2xlbmd0aCkgOyAqLworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHhsX3ByaXYtPnBkZXYseGxfcHJpdi0+eGxfcnhfcmluZ1t4bF9wcml2LT5yeF9yaW5nX3RhaWxdLnVwZnJhZ2FkZHIseGxfcHJpdi0+cGt0X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpIDsKKwkJCWFkdl9yeF9yaW5nKGRldikgOyAKKwkJCXNrYi0+cHJvdG9jb2wgPSB0cl90eXBlX3RyYW5zKHNrYixkZXYpIDsgCisJCQluZXRpZl9yeChza2IpIDsgCisKKwkJfSBlbHNlIHsgLyogU2luZ2xlIERlc2NyaXB0b3IgVXNlZCwgc2ltcGx5IHN3YXAgYnVmZmVycyBvdmVyLCBmYXN0IHBhdGggICovCisKKwkJCWZyYW1lX2xlbmd0aCA9IHhsX3ByaXYtPnhsX3J4X3JpbmdbeGxfcHJpdi0+cnhfcmluZ190YWlsXS5mcmFtZXN0YXR1cyAmIDB4N0ZGRiA7IAorCQkJCisJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHhsX3ByaXYtPnBrdF9idWZfc3opIDsgCisKKwkJCWlmIChza2I9PU5VTEwpIHsgLyogU3RpbGwgbmVlZCB0byBmaXggdGhlIHJ4IHJpbmcgKi8KKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZGV2X2FsbG9jX3NrYiBmYWlsZWQgaW4gcngsIHNpbmdsZSBidWZmZXIgXG4iLGRldi0+bmFtZSkgOyAKKwkJCQlhZHZfcnhfcmluZyhkZXYpIDsgCisJCQkJeGxfcHJpdi0+eGxfc3RhdHMucnhfZHJvcHBlZCsrIDsgCisJCQkJd3JpdGVsKEFDS19JTlRFUlJVUFQgfCBVUENPTVBBQ0sgfCBMQVRDSF9BQ0sgLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCQkJCXJldHVybiA7IAorCQkJfQorCisJCQlza2ItPmRldiA9IGRldiA7IAorCisJCQlza2IyID0geGxfcHJpdi0+cnhfcmluZ19za2JbeGxfcHJpdi0+cnhfcmluZ190YWlsXSA7IAorCQkJcGNpX3VubWFwX3NpbmdsZSh4bF9wcml2LT5wZGV2LCB4bF9wcml2LT54bF9yeF9yaW5nW3hsX3ByaXYtPnJ4X3JpbmdfdGFpbF0udXBmcmFnYWRkciwgeGxfcHJpdi0+cGt0X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpIDsgCisJCQlza2JfcHV0KHNrYjIsIGZyYW1lX2xlbmd0aCkgOyAKKwkJCXNrYjItPnByb3RvY29sID0gdHJfdHlwZV90cmFucyhza2IyLGRldikgOyAKKworCQkJeGxfcHJpdi0+cnhfcmluZ19za2JbeGxfcHJpdi0+cnhfcmluZ190YWlsXSA9IHNrYiA7IAkKKwkJCXhsX3ByaXYtPnhsX3J4X3JpbmdbeGxfcHJpdi0+cnhfcmluZ190YWlsXS51cGZyYWdhZGRyID0gcGNpX21hcF9zaW5nbGUoeGxfcHJpdi0+cGRldixza2ItPmRhdGEseGxfcHJpdi0+cGt0X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKSA7IAorCQkJeGxfcHJpdi0+eGxfcnhfcmluZ1t4bF9wcml2LT5yeF9yaW5nX3RhaWxdLnVwZnJhZ2xlbiA9IHhsX3ByaXYtPnBrdF9idWZfc3ogfCBSWFVQTEFTVEZSQUcgOyAKKwkJCWFkdl9yeF9yaW5nKGRldikgOyAKKwkJCXhsX3ByaXYtPnhsX3N0YXRzLnJ4X3BhY2tldHMrKyA7IAorCQkJeGxfcHJpdi0+eGxfc3RhdHMucnhfYnl0ZXMgKz0gZnJhbWVfbGVuZ3RoIDsgCQorCisJCQluZXRpZl9yeChza2IyKSA7IAkJCisJCSB9IC8qIGlmIG11bHRpcGxlIGJ1ZmZlcnMgKi8KKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllcyA7IAkKKwl9IC8qIHdoaWxlIHBhY2tldCB0byBkbyAqLworCisJLyogQ2xlYXIgdGhlIHVwZENvbXBsZXRlIGludGVycnVwdCAqLworCXdyaXRlbChBQ0tfSU5URVJSVVBUIHwgVVBDT01QQUNLIHwgTEFUQ0hfQUNLICwgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKwlyZXR1cm4gOyAJCit9CisKKy8qCisgKiBUaGlzIGlzIHJ1dGhsZXNzLCBpdCBkb2Vzbid0IGNhcmUgd2hhdCBzdGF0ZSB0aGUgY2FyZCBpcyBpbiBpdCB3aWxsIAorICogY29tcGxldGVseSByZXNldCB0aGUgYWRhcHRlci4KKyAqLworCitzdGF0aWMgdm9pZCB4bF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdj0oc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXY7CisJdTggX19pb21lbSAqIHhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisJdW5zaWduZWQgbG9uZyB0OyAKKworCXdyaXRldyggR0xPQkFMX1JFU0VULCB4bF9tbWlvICsgTU1JT19DT01NQU5EICkgOyAKKworCS8qIAorCSAqIE11c3Qgd2FpdCBmb3IgY21kSW5Qcm9ncmVzcyBiaXQgKDEyKSB0byBjbGVhciBiZWZvcmUgY29udGludWluZyB3aXRoCisJICogY2FyZCBjb25maWd1cmF0aW9uLgorCSAqLworCisJdD1qaWZmaWVzOworCXdoaWxlIChyZWFkdyh4bF9tbWlvICsgTU1JT19JTlRTVEFUVVMpICYgSU5UU1RBVF9DTURfSU5fUFJPR1JFU1MpIHsgCisJCWlmKGppZmZpZXMtdCA+IDQwKkhaKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIjNDT00gM0MzNTkgVmVsb2NpdHkgWEwgIGNhcmQgbm90IHJlc3BvbmRpbmcuXG4iKTsKKwkJCWJyZWFrIDsgCisJCX0KKwl9CisJCit9CisKK3N0YXRpYyB2b2lkIHhsX2ZyZWVtZW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXY9KHN0cnVjdCB4bF9wcml2YXRlICopZGV2LT5wcml2IDsgCisJaW50IGkgOyAKKworCWZvciAoaT0wO2k8WExfUlhfUklOR19TSVpFO2krKykgeworCQlkZXZfa2ZyZWVfc2tiX2lycSh4bF9wcml2LT5yeF9yaW5nX3NrYlt4bF9wcml2LT5yeF9yaW5nX3RhaWxdKSA7IAorCQlwY2lfdW5tYXBfc2luZ2xlKHhsX3ByaXYtPnBkZXYseGxfcHJpdi0+eGxfcnhfcmluZ1t4bF9wcml2LT5yeF9yaW5nX3RhaWxdLnVwZnJhZ2FkZHIseGxfcHJpdi0+cGt0X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKSA7IAorCQl4bF9wcml2LT5yeF9yaW5nX3RhaWwrKyA7IAorCQl4bF9wcml2LT5yeF9yaW5nX3RhaWwgJj0gWExfUlhfUklOR19TSVpFLTE7IAorCX0gCisKKwkvKiB1bm1hcCByaW5nICovCisJcGNpX3VubWFwX3NpbmdsZSh4bF9wcml2LT5wZGV2LHhsX3ByaXYtPnJ4X3JpbmdfZG1hX2FkZHIsIHNpemVvZihzdHJ1Y3QgeGxfcnhfZGVzYykgKiBYTF9SWF9SSU5HX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSkgOyAKKwkKKwlwY2lfdW5tYXBfc2luZ2xlKHhsX3ByaXYtPnBkZXYseGxfcHJpdi0+dHhfcmluZ19kbWFfYWRkciwgc2l6ZW9mKHN0cnVjdCB4bF90eF9kZXNjKSAqIFhMX1RYX1JJTkdfU0laRSwgUENJX0RNQV9UT0RFVklDRSkgOyAKKworCWtmcmVlKHhsX3ByaXYtPnhsX3J4X3JpbmcpIDsgCisJa2ZyZWUoeGxfcHJpdi0+eGxfdHhfcmluZykgOyAKKworCXJldHVybiAgOyAKK30KKworc3RhdGljIGlycXJldHVybl90IHhsX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKSAKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworIAlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdiA9KHN0cnVjdCB4bF9wcml2YXRlICopZGV2LT5wcml2OworCXU4IF9faW9tZW0gKiB4bF9tbWlvID0geGxfcHJpdi0+eGxfbW1pbyA7IAorCXUxNiBpbnRzdGF0dXMsIG1hY3N0YXR1cyAgOworCisJaWYgKCFkZXYpIHsgCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRldmljZSBzdHJ1Y3R1cmUgZGVhZCwgYWFhaGhoaCAhXG4iKSA7CisJCXJldHVybiBJUlFfTk9ORTsgCisJfQorCisJaW50c3RhdHVzID0gcmVhZHcoeGxfbW1pbyArIE1NSU9fSU5UU1RBVFVTKSA7ICAKKworCWlmICghKGludHN0YXR1cyAmIDEpKSAvKiBXZSBkaWRuJ3QgZ2VuZXJhdGUgdGhlIGludGVycnVwdCAqLworCQlyZXR1cm4gSVJRX05PTkU7CisKKwlzcGluX2xvY2soJnhsX3ByaXYtPnhsX2xvY2spIDsgCisKKwkvKgorCSAqIFByb2Nlc3MgdGhlIGludGVycnVwdAorCSAqLworCS8qCisJICogU29tZXRoaW5nIGZpc2h5IGdvaW5nIG9uIGhlcmUsIHdlIHNob3VsZG4ndCBnZXQgMDAwMSBpbnRzLCBub3QgZmF0YWwgdGhvdWdoLgorCSAqLworCWlmIChpbnRzdGF0dXMgPT0gMHgwMDAxKSB7ICAKKwkJd3JpdGVsKEFDS19JTlRFUlJVUFQgfCBMQVRDSF9BQ0ssIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IDAwMDAxIGludCByZWNlaXZlZCBcbiIsZGV2LT5uYW1lKSA7ICAKKwl9IGVsc2UgeyAgCisJCWlmIChpbnRzdGF0dXMgJgkoSE9TVEVSUklOVCB8IFNSQlJJTlQgfCBBUkJDSU5UIHwgVVBDT01QSU5UIHwgRE5DT01QSU5UIHwgSEFSREVSUklOVCB8ICgxPDw4KSB8IFRYVU5ERVJSVU4gfCBBU0JGSU5UKSkgeyAKKwkJCQorCQkJLyogCisJCQkgKiBIb3N0IEVycm9yLgorCQkJICogSXQgbWF5IGJlIHBvc3NpYmxlIHRvIHJlY292ZXIgZnJvbSB0aGlzLCBidXQgdXN1YWxseSBpdCBtZWFucyBzb21ldGhpbmcKKwkJCSAqIGlzIHNlcmlvdXNseSBmdWJhciwgc28gd2UganVzdCBjbG9zZSB0aGUgYWRhcHRlci4KKwkJCSAqLworCisJCQlpZiAoaW50c3RhdHVzICYgSE9TVEVSUklOVCkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBIb3N0IEVycm9yLCBwZXJmb3JtaW5nIGdsb2JhbCByZXNldCwgaW50c3RhdHVzID0gJTA0eCBcbiIsZGV2LT5uYW1lLGludHN0YXR1cykgOyAKKwkJCQl3cml0ZXcoIEdMT0JBTF9SRVNFVCwgeGxfbW1pbyArIE1NSU9fQ09NTUFORCApIDsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVzZXR0aW5nIGhhcmR3YXJlOiBcbiIsIGRldi0+bmFtZSk7IAorCQkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KSA7CisJCQkJeGxfZnJlZW1lbShkZXYpIDsgCisJCQkJZnJlZV9pcnEoZGV2LT5pcnEsZGV2KTsgCQorCQkJCXhsX3Jlc2V0KGRldikgOyAKKwkJCQl3cml0ZWwoQUNLX0lOVEVSUlVQVCB8IExBVENIX0FDSywgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKwkJCQlzcGluX3VubG9jaygmeGxfcHJpdi0+eGxfbG9jaykgOyAKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9IC8qIEhvc3QgRXJyb3IgKi8KKworCQkJaWYgKGludHN0YXR1cyAmIFNSQlJJTlQgKSB7ICAvKiBTcmJjIGludGVycnVwdCAqLworCQkJCXdyaXRlbChBQ0tfSU5URVJSVVBUIHwgU1JCUkFDSyB8IExBVENIX0FDSywgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOworCQkJCWlmICh4bF9wcml2LT5zcmJfcXVldWVkKQorCQkJCQl4bF9zcmJfYmgoZGV2KSA7IAorCQkJfSAvKiBTUkJSIEludGVycnVwdCAqLworCisJCQlpZiAoaW50c3RhdHVzICYgVFhVTkRFUlJVTikgeyAvKiBJc3N1ZSBEblJlc2V0IGNvbW1hbmQgKi8KKwkJCQl3cml0ZWwoRE5SRVNFVCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCQkJd2hpbGUgKHJlYWR3KHhsX21taW8gKyBNTUlPX0lOVFNUQVRVUykgJiBJTlRTVEFUX0NNRF9JTl9QUk9HUkVTUykgeyAvKiBXYWl0IGZvciBjb21tYW5kIHRvIHJ1biAqLworCQkJCQkvKiAhISEgRklYLU1FICEhISEgCisJCQkJCU11c3QgcHV0IGEgdGltZW91dCBjaGVjayBoZXJlICEgKi8KKwkJCQkJLyogRW1wdHkgTG9vcCAqLworCQkJCX0gCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRYIFVuZGVycnVuIHJlY2VpdmVkIFxuIixkZXYtPm5hbWUpIDsKKwkJCQl3cml0ZWwoQUNLX0lOVEVSUlVQVCB8IExBVENIX0FDSywgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKwkJCX0gLyogVHhVbmRlclJ1biAqLworCQorCQkJaWYgKGludHN0YXR1cyAmIEFSQkNJTlQgKSB7IC8qIEFyYmMgaW50ZXJydXB0ICovCisJCQkJeGxfYXJiX2NtZChkZXYpIDsgCisJCQl9IC8qIEFyYmMgKi8KKworCQkJaWYgKGludHN0YXR1cyAmIEFTQkZJTlQpIHsgCisJCQkJaWYgKHhsX3ByaXYtPmFzYl9xdWV1ZWQgPT0gMSkgeworCQkJCQl4bF9hc2JfY21kKGRldikgOyAKKwkJCQl9IGVsc2UgaWYgKHhsX3ByaXYtPmFzYl9xdWV1ZWQgPT0gMikgeworCQkJCQl4bF9hc2JfYmgoZGV2KSA7IAorCQkJCX0gZWxzZSB7IAorCQkJCQl3cml0ZWwoQUNLX0lOVEVSUlVQVCB8IExBVENIX0FDSyB8IEFTQkZBQ0ssIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisJCQkJfSAgCisJCQl9IC8qIEFzYmYgKi8KKworCQkJaWYgKGludHN0YXR1cyAmIFVQQ09NUElOVCApIC8qIFVwQ29tcGxldGUgKi8KKwkJCQl4bF9yeChkZXYpIDsgCisKKwkJCWlmIChpbnRzdGF0dXMgJiBETkNPTVBJTlQgKSAgLyogRG5Db21wbGV0ZSAqLworCQkJCXhsX2RuX2NvbXAoZGV2KSA7IAorCisJCQlpZiAoaW50c3RhdHVzICYgSEFSREVSUklOVCApIHsgLyogSGFyZHdhcmUgZXJyb3IgKi8KKwkJCQl3cml0ZWwoTU1JT19XT1JEX1JFQUQgfCBNQUNTVEFUVVMsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQkJCW1hY3N0YXR1cyA9IHJlYWR3KHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1hY1N0YXR1c0Vycm9yLCBkZXRhaWxzOiAiLCBkZXYtPm5hbWUpOworCQkJCWlmIChtYWNzdGF0dXMgJiAoMTw8MTQpKSAKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidGNoayBlcnJvcjogVW5yZWNvdmVyYWJsZSBlcnJvciBcbiIpIDsgCisJCQkJaWYgKG1hY3N0YXR1cyAmICgxPDwzKSkKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZWludCBlcnJvcjogSW50ZXJuYWwgd2F0Y2hkb2cgdGltZXIgZXhwaXJlZCBcbiIpIDsKKwkJCQlpZiAobWFjc3RhdHVzICYgKDE8PDIpKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhaW50IGVycm9yOiBIb3N0IHRyaWVkIHRvIHBlcmZvcm0gaW52YWxpZCBvcGVyYXRpb24gXG4iKSA7IAorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkluc3RhdHVzID0gJTAyeCwgbWFjc3RhdHVzID0gJTAyeFxuIixpbnRzdGF0dXMsbWFjc3RhdHVzKSA7IAorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZXNldHRpbmcgaGFyZHdhcmU6IFxuIiwgZGV2LT5uYW1lKTsgCisJCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpIDsKKwkJCQl4bF9mcmVlbWVtKGRldikgOyAKKwkJCQlmcmVlX2lycShkZXYtPmlycSxkZXYpOyAKKwkJCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpIDsgCisJCQkJZnJlZV9uZXRkZXYoZGV2KSA7ICAKKwkJCQl4bF9yZXNldChkZXYpIDsgCisJCQkJd3JpdGVsKEFDS19JTlRFUlJVUFQgfCBMQVRDSF9BQ0ssIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisJCQkJc3Bpbl91bmxvY2soJnhsX3ByaXYtPnhsX2xvY2spIDsgCisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJfQorCQl9IGVsc2UgeyAKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZWNlaXZlZCBVbmtub3duIGludGVycnVwdCA6ICUwNHggXG4iLCBkZXYtPm5hbWUsIGludHN0YXR1cykgOworCQkJd3JpdGVsKEFDS19JTlRFUlJVUFQgfCBMQVRDSF9BQ0ssIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCQorCQl9CisJfSAKKworCS8qIFR1cm4gaW50ZXJydXB0cyBiYWNrIG9uICovCisKKwl3cml0ZWwoIFNFVElOREVOQUJMRSB8IElOVF9NQVNLLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCXdyaXRlbCggU0VUSU5URU5BQkxFIHwgSU5UX01BU0ssIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisKKwlzcGluX3VubG9jaygmeGxfcHJpdi0+eGxfbG9jaykgOworCXJldHVybiBJUlFfSEFORExFRDsKK30JCisKKy8qCisgKglUeCAtIFBvbGxpbmcgY29uZmlndXJhdGlvbgorICovCisJCitzdGF0aWMgaW50IHhsX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXY9KHN0cnVjdCB4bF9wcml2YXRlICopZGV2LT5wcml2OworCXN0cnVjdCB4bF90eF9kZXNjICp0eGQgOyAKKwlpbnQgdHhfaGVhZCwgdHhfdGFpbCwgdHhfcHJldiA7IAorCXVuc2lnbmVkIGxvbmcgZmxhZ3MgOyAJCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeGxfcHJpdi0+eGxfbG9jayxmbGFncykgOyAKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KSA7IAorCisJaWYgKHhsX3ByaXYtPmZyZWVfcmluZ19lbnRyaWVzID4gMSApIHsgCQorCQkvKgorCQkgKiBTZXQgdXAgdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBwYWNrZXQgCisJCSAqLworCQl0eF9oZWFkID0geGxfcHJpdi0+dHhfcmluZ19oZWFkIDsgCisJCXR4X3RhaWwgPSB4bF9wcml2LT50eF9yaW5nX3RhaWwgOyAKKworCQl0eGQgPSAmKHhsX3ByaXYtPnhsX3R4X3JpbmdbdHhfaGVhZF0pIDsgCisJCXR4ZC0+ZG5uZXh0cHRyID0gMCA7IAorCQl0eGQtPmZyYW1lc3RhcnRoZWFkZXIgPSBza2ItPmxlbiB8IFRYRE5JTkRJQ0FURSA7IAorCQl0eGQtPmJ1ZmZlciA9IHBjaV9tYXBfc2luZ2xlKHhsX3ByaXYtPnBkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpIDsgCisJCXR4ZC0+YnVmZmVyX2xlbmd0aCA9IHNrYi0+bGVuIHwgVFhETkZSQUdMQVNUICA7IAorCQl4bF9wcml2LT50eF9yaW5nX3NrYlt0eF9oZWFkXSA9IHNrYiA7IAorCQl4bF9wcml2LT54bF9zdGF0cy50eF9wYWNrZXRzKysgOyAKKwkJeGxfcHJpdi0+eGxfc3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW4gOworCisJCS8qIAorCQkgKiBTZXQgdGhlIG5leHRwdHIgb2YgdGhlIHByZXZpb3VzIGRlc2NyaXB0b3IgZXF1YWwgdG8gdGhpcyBkZXNjcmlwdG9yLCBhZGQgWExfVFhfUklOR19TSVpFIC0xIAorCQkgKiB0byBlbnN1cmUgbm8gbmVnYXRpdmUgbnVtYmVycyBpbiB1bnNpZ25lZCBsb2NhdGlvbnMuCisJCSAqLyAKKwkKKwkJdHhfcHJldiA9ICh4bF9wcml2LT50eF9yaW5nX2hlYWQgKyBYTF9UWF9SSU5HX1NJWkUgLSAxKSAmIChYTF9UWF9SSU5HX1NJWkUgLSAxKSA7IAorCisJCXhsX3ByaXYtPnR4X3JpbmdfaGVhZCsrIDsgCisJCXhsX3ByaXYtPnR4X3JpbmdfaGVhZCAmPSAoWExfVFhfUklOR19TSVpFIC0gMSkgOworCQl4bF9wcml2LT5mcmVlX3JpbmdfZW50cmllcy0tIDsgCisKKwkJeGxfcHJpdi0+eGxfdHhfcmluZ1t0eF9wcmV2XS5kbm5leHRwdHIgPSB4bF9wcml2LT50eF9yaW5nX2RtYV9hZGRyICsgKHNpemVvZiAoc3RydWN0IHhsX3R4X2Rlc2MpICogdHhfaGVhZCkgOyAKKworCQkvKiBTbmVha3ksIGJ5IGRvaW5nIGEgcmVhZCBvbiBEbkxpc3RQdHIgd2UgY2FuIGZvcmNlIHRoZSBjYXJkIHRvIHBvbGwgb24gdGhlIERuTmV4dFB0ciAqLworCQkvKiByZWFkbCh4bF9tbWlvICsgTU1JT19ETkxJU1RQVFIpIDsgKi8KKworCQluZXRpZl93YWtlX3F1ZXVlKGRldikgOyAKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4bF9wcml2LT54bF9sb2NrLGZsYWdzKSA7IAorIAorCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4bF9wcml2LT54bF9sb2NrLGZsYWdzKSA7IAorCQlyZXR1cm4gMTsKKwl9CisKK30KKwkKKy8qIAorICogVGhlIE5JQyBoYXMgdG9sZCB1cyB0aGF0IGEgcGFja2V0IGhhcyBiZWVuIGRvd25sb2FkZWQgb250byB0aGUgY2FyZCwgd2UgbXVzdAorICogZmluZCBvdXQgd2hpY2ggcGFja2V0IGl0IGhhcyBkb25lLCBjbGVhciB0aGUgc2tiIGFuZCBpbmZvcm1hdGlvbiBmb3IgdGhlIHBhY2tldAorICogdGhlbiBhZHZhbmNlIGFyb3VuZCB0aGUgcmluZyBmb3IgYWxsIHRyYW5taXR0ZWQgcGFja2V0cworICovCisKK3N0YXRpYyB2b2lkIHhsX2RuX2NvbXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXY9KHN0cnVjdCB4bF9wcml2YXRlICopZGV2LT5wcml2OworCXU4IF9faW9tZW0gKiB4bF9tbWlvID0geGxfcHJpdi0+eGxfbW1pbyA7IAorCXN0cnVjdCB4bF90eF9kZXNjICp0eGQgOyAKKworCisJaWYgKHhsX3ByaXYtPnR4X3JpbmdfdGFpbCA9PSAyNTUpIHsvKiBGaXJzdCB0aW1lICovCisJCXhsX3ByaXYtPnhsX3R4X3JpbmdbMF0uZnJhbWVzdGFydGhlYWRlciA9IDAgOyAKKwkJeGxfcHJpdi0+eGxfdHhfcmluZ1swXS5kbm5leHRwdHIgPSAwIDsgIAorCQl4bF9wcml2LT50eF9yaW5nX3RhaWwgPSAxIDsgCisJfQorCisJd2hpbGUgKHhsX3ByaXYtPnhsX3R4X3JpbmdbeGxfcHJpdi0+dHhfcmluZ190YWlsXS5mcmFtZXN0YXJ0aGVhZGVyICYgVFhETkNPTVBMRVRFICkgeyAKKwkJdHhkID0gJih4bF9wcml2LT54bF90eF9yaW5nW3hsX3ByaXYtPnR4X3JpbmdfdGFpbF0pIDsKKwkJcGNpX3VubWFwX3NpbmdsZSh4bF9wcml2LT5wZGV2LHR4ZC0+YnVmZmVyLCB4bF9wcml2LT50eF9yaW5nX3NrYlt4bF9wcml2LT50eF9yaW5nX3RhaWxdLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpIDsgCisJCXR4ZC0+ZnJhbWVzdGFydGhlYWRlciA9IDAgOyAKKwkJdHhkLT5idWZmZXIgPSAweGRlYWRiZWVmICA7IAorCQl0eGQtPmJ1ZmZlcl9sZW5ndGggID0gMCA7ICAKKwkJZGV2X2tmcmVlX3NrYl9pcnEoeGxfcHJpdi0+dHhfcmluZ19za2JbeGxfcHJpdi0+dHhfcmluZ190YWlsXSkgOworCQl4bF9wcml2LT50eF9yaW5nX3RhaWwrKyA7IAorCQl4bF9wcml2LT50eF9yaW5nX3RhaWwgJj0gKFhMX1RYX1JJTkdfU0laRSAtIDEpIDsgCisJCXhsX3ByaXYtPmZyZWVfcmluZ19lbnRyaWVzKysgOyAKKwl9CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldikgOyAKKworCXdyaXRlbChBQ0tfSU5URVJSVVBUIHwgRE5DT01QQUNLIHwgTEFUQ0hfQUNLICwgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKK30KKworLyoKKyAqIENsb3NlIHRoZSBhZGFwdGVyIHByb3Blcmx5LgorICogVGhpcyBzcmIgcmVwbHkgY2Fubm90IGJlIGhhbmRsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCBhcyB3ZSBoYXZlCisgKiB0byBmcmVlIHRoZSBpbnRlcnJ1cHQgZnJvbSB0aGUgZHJpdmVyLiAKKyAqLworCitzdGF0aWMgaW50IHhsX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreworCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2ID0gKHN0cnVjdCB4bF9wcml2YXRlICopIGRldi0+cHJpdiA7IAorCXU4IF9faW9tZW0gKiB4bF9tbWlvID0geGxfcHJpdi0+eGxfbW1pbyA7IAorCXVuc2lnbmVkIGxvbmcgdCA7IAorCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpIDsgCisKKwkvKgorCSAqIENsb3NlIHRoZSBhZGFwdGVyLCBuZWVkIHRvIHN0YWxsIHRoZSByeCBhbmQgdHggcXVldWVzLgorCSAqLworCisgICAgCXdyaXRldyhETlNUQUxMLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCXQ9amlmZmllczsKKwl3aGlsZSAocmVhZHcoeGxfbW1pbyArIE1NSU9fSU5UU1RBVFVTKSAmIElOVFNUQVRfQ01EX0lOX1BST0dSRVNTKSB7IAorCQlzY2hlZHVsZSgpOwkJCisJCWlmKGppZmZpZXMtdCA+IDEwKkhaKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAzQ09NIDNDMzU5IFZlbG9jaXR5IFhMLUROU1RBTEwgbm90IHJlc3BvbmRpbmcuXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWsgOyAKKwkJfQorCX0KKyAgICAJd3JpdGV3KERORElTQUJMRSwgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKwl0PWppZmZpZXM7CisJd2hpbGUgKHJlYWR3KHhsX21taW8gKyBNTUlPX0lOVFNUQVRVUykgJiBJTlRTVEFUX0NNRF9JTl9QUk9HUkVTUykgeyAKKwkJc2NoZWR1bGUoKTsJCQorCQlpZihqaWZmaWVzLXQgPiAxMCpIWikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogM0NPTSAzQzM1OSBWZWxvY2l0eSBYTC1ETkRJU0FCTEUgbm90IHJlc3BvbmRpbmcuXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWsgOworCQl9CisJfQorICAgIAl3cml0ZXcoVVBTVEFMTCwgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKwl0PWppZmZpZXM7CisJd2hpbGUgKHJlYWR3KHhsX21taW8gKyBNTUlPX0lOVFNUQVRVUykgJiBJTlRTVEFUX0NNRF9JTl9QUk9HUkVTUykgeyAKKwkJc2NoZWR1bGUoKTsJCQorCQlpZihqaWZmaWVzLXQgPiAxMCpIWikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogM0NPTSAzQzM1OSBWZWxvY2l0eSBYTC1VUFNUQUxMIG5vdCByZXNwb25kaW5nLlxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrIDsgCisJCX0KKwl9CisKKwkvKiBUdXJuIG9mZiBpbnRlcnJ1cHRzLCB3ZSB3aWxsIHN0aWxsIGdldCB0aGUgaW5kaWNhdGlvbiB0aG91Z2gKKyAJICogc28gd2UgY2FuIHRyYXAgaXQKKwkgKi8KKworCXdyaXRlbChTRVRJTlRFTkFCTEUsIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisKKwl4bF9zcmJfY21kKGRldixDTE9TRV9OSUMpIDsgCisKKwl0PWppZmZpZXM7CisJd2hpbGUgKCEocmVhZHcoeGxfbW1pbyArIE1NSU9fSU5UU1RBVFVTKSAmIElOVFNUQVRfU1JCKSkgeyAKKwkJc2NoZWR1bGUoKTsJCQorCQlpZihqaWZmaWVzLXQgPiAxMCpIWikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogM0NPTSAzQzM1OSBWZWxvY2l0eSBYTC1DTE9TRU5JQyBub3QgcmVzcG9uZGluZy5cbiIsIGRldi0+bmFtZSk7CisJCQlicmVhayA7IAorCQl9CisJfQorCS8qIFJlYWQgdGhlIHNyYiByZXNwb25zZSBmcm9tIHRoZSBhZGFwdGVyICovCisKKwl3cml0ZWwoTUVNX0JZVEVfUkVBRCB8IDB4ZDAwMDAgfCB4bF9wcml2LT5zcmIsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKTsKKwlpZiAocmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgIT0gQ0xPU0VfTklDKSB7IAorCQlwcmludGsoS0VSTl9JTkZPICIlczogQ0xPU0VfTklDIGRpZCBub3QgZ2V0IGEgQ0xPU0VfTklDIHJlc3BvbnNlIFxuIixkZXYtPm5hbWUpIDsgCisJfSBlbHNlIHsgCisJCXdyaXRlbCgoTUVNX0JZVEVfUkVBRCB8IDB4ZDAwMDAgfCB4bF9wcml2LT5zcmIpICsyLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOworCQlpZiAocmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSk9PTApIHsgCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQWRhcHRlciBoYXMgYmVlbiBjbG9zZWQgXG4iLGRldi0+bmFtZSkgOworCQkJd3JpdGV3KEFDS19JTlRFUlJVUFQgfCBTUkJSQUNLIHwgTEFUQ0hfQUNLLCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCisJCQl4bF9mcmVlbWVtKGRldikgOyAKKwkJCWZyZWVfaXJxKGRldi0+aXJxLGRldikgOyAKKwkJfSBlbHNlIHsgCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ2xvc2UgbmljIGNvbW1hbmQgcmV0dXJuZWQgZXJyb3IgY29kZSAlMDJ4XG4iLGRldi0+bmFtZSwgcmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkpIDsKKwkJfSAKKwl9CisKKwkvKiBSZXNldCB0aGUgdXBsb2FkIGFuZCBkb3dubG9hZCBsb2dpYyAqLworIAorICAgIAl3cml0ZXcoVVBSRVNFVCwgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKwl0PWppZmZpZXM7CisJd2hpbGUgKHJlYWR3KHhsX21taW8gKyBNTUlPX0lOVFNUQVRVUykgJiBJTlRTVEFUX0NNRF9JTl9QUk9HUkVTUykgeyAKKwkJc2NoZWR1bGUoKTsJCQorCQlpZihqaWZmaWVzLXQgPiAxMCpIWikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogM0NPTSAzQzM1OSBWZWxvY2l0eSBYTC1VUFJFU0VUIG5vdCByZXNwb25kaW5nLlxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrIDsgCisJCX0KKwl9CisgICAgCXdyaXRldyhETlJFU0VULCB4bF9tbWlvICsgTU1JT19DT01NQU5EKSA7IAorCXQ9amlmZmllczsKKwl3aGlsZSAocmVhZHcoeGxfbW1pbyArIE1NSU9fSU5UU1RBVFVTKSAmIElOVFNUQVRfQ01EX0lOX1BST0dSRVNTKSB7IAorCQlzY2hlZHVsZSgpOwkJCisJCWlmKGppZmZpZXMtdCA+IDEwKkhaKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAzQ09NIDNDMzU5IFZlbG9jaXR5IFhMLUROUkVTRVQgbm90IHJlc3BvbmRpbmcuXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWsgOyAKKwkJfQorCX0KKwl4bF9od19yZXNldChkZXYpIDsgCisJcmV0dXJuIDAgOworfQorCitzdGF0aWMgdm9pZCB4bF9zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdiA9IChzdHJ1Y3QgeGxfcHJpdmF0ZSAqKSBkZXYtPnByaXYgOyAKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA7IAorCXVuc2lnbmVkIGNoYXIgZGV2X21jX2FkZHJlc3NbNF0gOyAKKwl1MTYgb3B0aW9ucyA7IAorCWludCBpIDsgCisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCQlvcHRpb25zID0gMHgwMDA0IDsgCisJZWxzZQorCQlvcHRpb25zID0gMHgwMDAwIDsgCisKKwlpZiAob3B0aW9ucyBeIHhsX3ByaXYtPnhsX2NvcHlfYWxsX29wdGlvbnMpIHsgLyogQ2hhbmdlZCwgbXVzdCBzZW5kIGNvbW1hbmQgKi8KKwkJeGxfcHJpdi0+eGxfY29weV9hbGxfb3B0aW9ucyA9IG9wdGlvbnMgOyAKKwkJeGxfc3JiX2NtZChkZXYsIFNFVF9SRUNFSVZFX01PREUpIDsKKwkJcmV0dXJuIDsgIAorCX0KKworCWRldl9tY19hZGRyZXNzWzBdID0gZGV2X21jX2FkZHJlc3NbMV0gPSBkZXZfbWNfYWRkcmVzc1syXSA9IGRldl9tY19hZGRyZXNzWzNdID0gMCA7CisKKyAgICAgICAgZm9yIChpPTAsZG1pPWRldi0+bWNfbGlzdDtpIDwgZGV2LT5tY19jb3VudDsgaSsrLGRtaSA9IGRtaS0+bmV4dCkgeworICAgICAgICAgICAgICAgIGRldl9tY19hZGRyZXNzWzBdIHw9IGRtaS0+ZG1pX2FkZHJbMl0gOworICAgICAgICAgICAgICAgIGRldl9tY19hZGRyZXNzWzFdIHw9IGRtaS0+ZG1pX2FkZHJbM10gOworICAgICAgICAgICAgICAgIGRldl9tY19hZGRyZXNzWzJdIHw9IGRtaS0+ZG1pX2FkZHJbNF0gOworICAgICAgICAgICAgICAgIGRldl9tY19hZGRyZXNzWzNdIHw9IGRtaS0+ZG1pX2FkZHJbNV0gOworICAgICAgICB9CisKKwlpZiAobWVtY21wKHhsX3ByaXYtPnhsX2Z1bmN0aW9uYWxfYWRkcixkZXZfbWNfYWRkcmVzcyw0KSAhPSAwKSB7IC8qIE9wdGlvbnMgaGF2ZSBjaGFuZ2VkLCBydW4gdGhlIGNvbW1hbmQgKi8KKwkJbWVtY3B5KHhsX3ByaXYtPnhsX2Z1bmN0aW9uYWxfYWRkciwgZGV2X21jX2FkZHJlc3MsNCkgOyAKKwkJeGxfc3JiX2NtZChkZXYsIFNFVF9GVU5DX0FERFJFU1MpIDsgCisJfQorCXJldHVybiA7IAorfQorCisKKy8qCisgKglXZSBpc3N1ZWQgYW4gc3JiIGNvbW1hbmQgYW5kIG5vdyB3ZSBtdXN0IHJlYWQKKyAqCXRoZSByZXNwb25zZSBmcm9tIHRoZSBjb21wbGV0ZWQgY29tbWFuZC4KKyAqLworCitzdGF0aWMgdm9pZCB4bF9zcmJfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7IAorCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2ID0gKHN0cnVjdCB4bF9wcml2YXRlICopIGRldi0+cHJpdiA7IAorCXU4IF9faW9tZW0gKiB4bF9tbWlvID0geGxfcHJpdi0+eGxfbW1pbyA7IAorCXU4IHNyYl9jbWQsIHJldF9jb2RlIDsgCisJaW50IGkgOyAKKworCXdyaXRlbChNRU1fQllURV9SRUFEIHwgMHhkMDAwMCB8IHhsX3ByaXYtPnNyYiwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsKKwlzcmJfY21kID0gcmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwl3cml0ZWwoKE1FTV9CWVRFX1JFQUQgfCAweGQwMDAwIHwgeGxfcHJpdi0+c3JiKSArMiwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsKKwlyZXRfY29kZSA9IHJlYWRiKHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisKKwkvKiBSZXRfY29kZSBpcyBzdGFuZGFyZCBhY3Jvc3MgYWxsIGNvbW1hbmRzICovCisKKwlzd2l0Y2ggKHJldF9jb2RlKSB7IAorCWNhc2UgMToKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENvbW1hbmQ6ICVkIC0gSW52YWxpZCBDb21tYW5kIGNvZGVcbiIsZGV2LT5uYW1lLHNyYl9jbWQpIDsgCisJCWJyZWFrIDsgCisJY2FzZSA0OgorCQlwcmludGsoS0VSTl9JTkZPICIlczogQ29tbWFuZDogJWQgLSBBZGFwdGVyIGlzIGNsb3NlZCwgbXVzdCBiZSBvcGVuIGZvciB0aGlzIGNvbW1hbmQgXG4iLGRldi0+bmFtZSxzcmJfY21kKSA7IAorCQlicmVhayA7CisJCisJY2FzZSA2OgorCQlwcmludGsoS0VSTl9JTkZPICIlczogQ29tbWFuZDogJWQgLSBPcHRpb25zIEludmFsaWQgZm9yIGNvbW1hbmQgXG4iLGRldi0+bmFtZSxzcmJfY21kKSA7CisJCWJyZWFrIDsKKworCWNhc2UgMDogLyogU3VjY2Vzc2Z1bCBjb21tYW5kIGV4ZWN1dGlvbiAqLyAKKwkJc3dpdGNoIChzcmJfY21kKSB7IAorCQljYXNlIFJFQURfTE9HOiAvKiBSZXR1cm5zIDE0IGJ5dGVzIG9mIGRhdGEgZnJvbSB0aGUgTklDICovCisJCQlpZih4bF9wcml2LT54bF9tZXNzYWdlX2xldmVsKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSRUFELkxPRyAxNCBieXRlcyBvZiBkYXRhICIsZGV2LT5uYW1lKSA7IAorCQkJLyogCisJCQkgKiBXZSBzdGlsbCBoYXZlIHRvIHJlYWQgdGhlIGxvZyBldmVuIGlmIG1lc3NhZ2VfbGV2ZWwgPSAwIGFuZCB3ZSBkb24ndCB3YW50CisJCQkgKiB0byBzZWUgaXQKKwkJCSAqLworCQkJZm9yIChpPTA7aTwxNDtpKyspIHsgCisJCQkJd3JpdGVsKE1FTV9CWVRFX1JFQUQgfCAweGQwMDAwIHwgeGxfcHJpdi0+c3JiIHwgaSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCQkJaWYoeGxfcHJpdi0+eGxfbWVzc2FnZV9sZXZlbCkgCisJCQkJCXByaW50aygiJTAyeDoiLHJlYWRiKHhsX21taW8gKyBNTUlPX01BQ0RBVEEpKSA7IAkKKwkJCX0gCisJCQlwcmludGsoIlxuIikgOyAKKwkJCWJyZWFrIDsgCisJCWNhc2UgU0VUX0ZVTkNfQUREUkVTUzoKKwkJCWlmKHhsX3ByaXYtPnhsX21lc3NhZ2VfbGV2ZWwpIAorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGdW5jdGlvbmFsIEFkZHJlc3MgU2V0IFxuIixkZXYtPm5hbWUpIDsgIAorCQkJYnJlYWsgOyAKKwkJY2FzZSBDTE9TRV9OSUM6CisJCQlpZih4bF9wcml2LT54bF9tZXNzYWdlX2xldmVsKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZWNlaXZlZCBDTE9TRV9OSUMgaW50ZXJydXB0IGluIGludGVycnVwdCBoYW5kbGVyIFxuIixkZXYtPm5hbWUpIDsgCQorCQkJYnJlYWsgOyAKKwkJY2FzZSBTRVRfTVVMVElDQVNUX01PREU6CisJCQlpZih4bF9wcml2LT54bF9tZXNzYWdlX2xldmVsKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNdWx0aWNhc3Qgb3B0aW9ucyBzdWNjZXNzZnVsbHkgY2hhbmdlZFxuIixkZXYtPm5hbWUpIDsgCisJCQlicmVhayA7CisJCWNhc2UgU0VUX1JFQ0VJVkVfTU9ERToKKwkJCWlmKHhsX3ByaXYtPnhsX21lc3NhZ2VfbGV2ZWwpIHsgIAorCQkJCWlmICh4bF9wcml2LT54bF9jb3B5X2FsbF9vcHRpb25zID09IDB4MDAwNCkgCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFbnRlcmluZyBwcm9taXNjdW91cyBtb2RlIFxuIiwgZGV2LT5uYW1lKSA7IAorCQkJCWVsc2UKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVudGVyaW5nIG5vcm1hbCByZWNlaXZlIG1vZGUgXG4iLGRldi0+bmFtZSkgOyAKKwkJCX0KKwkJCWJyZWFrIDsgCisgCisJCX0gLyogc3dpdGNoICovCisJCWJyZWFrIDsgCisJfSAvKiBzd2l0Y2ggKi8KKwlyZXR1cm4gOyAJCit9IAorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiB4bF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdiA9IChzdHJ1Y3QgeGxfcHJpdmF0ZSAqKSBkZXYtPnByaXYgOworCXJldHVybiAoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikgJnhsX3ByaXYtPnhsX3N0YXRzOyAKK30KKworc3RhdGljIGludCB4bF9zZXRfbWFjX2FkZHJlc3MgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpIAoreworCXN0cnVjdCBzb2NrYWRkciAqc2FkZHIgPSBhZGRyIDsgCisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXYgPSAoc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXYgOyAKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsgCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW5ub3Qgc2V0IG1hYy9sYWEgYWRkcmVzcyB3aGlsZSBjYXJkIGlzIG9wZW5cbiIsIGRldi0+bmFtZSkgOyAKKwkJcmV0dXJuIC1FSU8gOyAKKwl9CisKKwltZW1jcHkoeGxfcHJpdi0+eGxfbGFhLCBzYWRkci0+c2FfZGF0YSxkZXYtPmFkZHJfbGVuKSA7IAorCQorCWlmICh4bF9wcml2LT54bF9tZXNzYWdlX2xldmVsKSB7IAorIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1BQy9MQUEgU2V0IHRvICA9ICV4LiV4LiV4LiV4LiV4LiV4XG4iLGRldi0+bmFtZSwgeGxfcHJpdi0+eGxfbGFhWzBdLAorCQl4bF9wcml2LT54bF9sYWFbMV0sIHhsX3ByaXYtPnhsX2xhYVsyXSwKKwkJeGxfcHJpdi0+eGxfbGFhWzNdLCB4bF9wcml2LT54bF9sYWFbNF0sCisJCXhsX3ByaXYtPnhsX2xhYVs1XSk7CisJfSAKKworCXJldHVybiAwIDsgCit9CisKK3N0YXRpYyB2b2lkIHhsX2FyYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdiA9IChzdHJ1Y3QgeGxfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdTggX19pb21lbSAqIHhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisJdTggYXJiX2NtZCA7IAorCXUxNiBsYW5fc3RhdHVzLCBsYW5fc3RhdHVzX2RpZmYgOyAKKworCXdyaXRlbCggKCBNRU1fQllURV9SRUFEIHwgMHhEMDAwMCB8IHhsX3ByaXYtPmFyYiksIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCWFyYl9jbWQgPSByZWFkYih4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQorCWlmIChhcmJfY21kID09IFJJTkdfU1RBVFVTX0NIQU5HRSkgeyAvKiBSaW5nLlN0YXR1cy5DaGFuZ2UgKi8KKwkJd3JpdGVsKCAoIChNRU1fV09SRF9SRUFEIHwgMHhEMDAwMCB8IHhsX3ByaXYtPmFyYikgKyA2KSwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsKKwkJIAorCQlwcmludGsoS0VSTl9JTkZPICIlczogUmluZyBTdGF0dXMgQ2hhbmdlOiBOZXcgU3RhdHVzID0gJTA0eFxuIiwgZGV2LT5uYW1lLCBudG9ocyhyZWFkdyh4bF9tbWlvICsgTU1JT19NQUNEQVRBKSApKSA7IAorCisJCWxhbl9zdGF0dXMgPSBudG9ocyhyZWFkdyh4bF9tbWlvICsgTU1JT19NQUNEQVRBKSk7CisJCisJCS8qIEFja25vd2xlZGdlIGludGVycnVwdCwgdGhpcyB0ZWxscyBuaWMgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYXJiICovCisJCXdyaXRlbChBQ0tfSU5URVJSVVBUIHwgQVJCQ0FDSyB8IExBVENIX0FDSywgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKwkJCQorCQlsYW5fc3RhdHVzX2RpZmYgPSB4bF9wcml2LT54bF9sYW5fc3RhdHVzIF4gbGFuX3N0YXR1cyA7IAorCisJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiAoTFNDX0xXRiB8IExTQ19BUlcgfCBMU0NfRlBFIHwgTFNDX1JSKSApIHsgCisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX0xXRikgCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFNob3J0IGNpcmN1aXQgZGV0ZWN0ZWQgb24gdGhlIGxvYmVcbiIsZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfQVJXKSAKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQXV0byByZW1vdmFsIGVycm9yXG4iLGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX0ZQRSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRkRYIFByb3RvY29sIEVycm9yXG4iLGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1JSKSAKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRm9yY2UgcmVtb3ZlIE1BQyBmcmFtZSByZWNlaXZlZFxuIixkZXYtPm5hbWUpOworCQkKKwkJCS8qIEFkYXB0ZXIgaGFzIGJlZW4gY2xvc2VkIGJ5IHRoZSBoYXJkd2FyZSAqLworCisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQl4bF9mcmVlbWVtKGRldikgOyAKKwkJCWZyZWVfaXJxKGRldi0+aXJxLGRldik7CisJCQkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBZGFwdGVyIGhhcyBiZWVuIGNsb3NlZCBcbiIsIGRldi0+bmFtZSkgOyAKKwkJfSAvKiBJZiBzZXJpb3VzIGVycm9yICovCisJCQorCQlpZiAoeGxfcHJpdi0+eGxfbWVzc2FnZV9sZXZlbCkgeyAKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfU0lHX0xPU1MpIAorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8gcmVjZWl2ZSBzaWduYWwgZGV0ZWN0ZWQgXG4iLCBkZXYtPm5hbWUpIDsgCisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX0hBUkRfRVJSKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQmVhY29uaW5nIFxuIixkZXYtPm5hbWUpOworCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19TT0ZUX0VSUikKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgdHJhbnNtaXR0ZWQgU29mdCBFcnJvciBSZXBvcnQgTWFjIEZyYW1lIFxuIixkZXYtPm5hbWUpOworCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19UUkFOX0JDTikgCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBXZSBhcmUgdHJhbm1pdHRpbmcgdGhlIGJlYWNvbiwgYWFhaFxuIixkZXYtPm5hbWUpOworCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19TUykgCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTaW5nbGUgU3RhdGlvbiBvbiB0aGUgcmluZyBcbiIsIGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1JJTkdfUkVDKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogUmluZyByZWNvdmVyeSBvbmdvaW5nXG4iLGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX0ZEWF9NT0RFKQorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogT3BlcmF0aW5nIGluIEZEWCBtb2RlXG4iLGRldi0+bmFtZSk7CisJCX0gCQorCQkKKwkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19DTykgeyAKKwkJCQlpZiAoeGxfcHJpdi0+eGxfbWVzc2FnZV9sZXZlbCkgCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb3VudGVyIE92ZXJmbG93IFxuIiwgZGV2LT5uYW1lKTsKKwkJCQkvKiBJc3N1ZSBSRUFELkxPRyBjb21tYW5kICovCisJCQkJeGxfc3JiX2NtZChkZXYsIFJFQURfTE9HKSA7IAkKKwkJfQorCisJCS8qIFRoZXJlIGlzIG5vIGNvbW1hbmQgaW4gdGhlIHRlY2ggZG9jcyB0byBpc3N1ZSB0aGUgcmVhZF9zcl9jb3VudGVycyAqLworCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1NSX0NPKSB7IAorCQkJaWYgKHhsX3ByaXYtPnhsX21lc3NhZ2VfbGV2ZWwpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNvdXJjZSByb3V0aW5nIGNvdW50ZXJzIG92ZXJmbG93XG4iLCBkZXYtPm5hbWUpOworCQl9CisKKwkJeGxfcHJpdi0+eGxfbGFuX3N0YXR1cyA9IGxhbl9zdGF0dXMgOyAKKwkKKwl9ICAvKiBMYW4uY2hhbmdlLnN0YXR1cyAqLworCWVsc2UgaWYgKCBhcmJfY21kID09IFJFQ0VJVkVfREFUQSkgeyAvKiBSZWNlaXZlZC5EYXRhICovCisjaWYgWExfREVCVUcKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUmVjZWl2ZWQuRGF0YSBcbiIpIDsgCisjZW5kaWYgCQkKKwkJd3JpdGVsKCAoKE1FTV9XT1JEX1JFQUQgfCAweEQwMDAwIHwgeGxfcHJpdi0+YXJiKSArIDYpLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOworCQl4bF9wcml2LT5tYWNfYnVmZmVyID0gbnRvaHMocmVhZHcoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkpIDsKKwkJCisJCS8qIE5vdyB3ZSBhcmUgZ29pbmcgdG8gYmUgcmVhbGx5IGJhc2ljIGhlcmUgYW5kIG5vdCBkbyBhbnl0aGluZworCQkgKiB3aXRoIHRoZSBkYXRhIGF0IGFsbC4gVGhlIHRlY2ggZG9jcyBkbyBub3QgZ2l2ZSBtZSBlbm91Z2gKKwkJICogaW5mb3JtYXRpb24gdG8gY2FsY3VsYXRlIHRoZSBidWZmZXJzIHByb3Blcmx5IHNvIHdlJ3JlCisJCSAqIGp1c3QgZ29pbmcgdG8gdGVsbCB0aGUgbmljIHRoYXQgd2UndmUgZGVhbHQgd2l0aCB0aGUgZnJhbWUKKwkJICogYW55d2F5LgorCQkgKi8KKworCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzIDsgCisJCS8qIEFja25vd2xlZGdlIGludGVycnVwdCwgdGhpcyB0ZWxscyBuaWMgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYXJiICovCisJCXdyaXRlbChBQ0tfSU5URVJSVVBUIHwgQVJCQ0FDSyB8IExBVENIX0FDSywgeGxfbW1pbyArIE1NSU9fQ09NTUFORCkgOyAKKworCQkvKiBJcyB0aGUgQVNCIGZyZWUgPyAqLyAJCisJCQkKKwkJeGxfcHJpdi0+YXNiX3F1ZXVlZCA9IDAgOyAJCQkKKwkJd3JpdGVsKCAoKE1FTV9CWVRFX1JFQUQgfCAweEQwMDAwIHwgeGxfcHJpdi0+YXNiKSArIDIpLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOworCQlpZiAocmVhZGIoeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgIT0gMHhmZikgeyAKKwkJCXhsX3ByaXYtPmFzYl9xdWV1ZWQgPSAxIDsKKworCQkJeGxfd2FpdF9taXNyX2ZsYWdzKGRldikgOyAgCisKKwkJCXdyaXRlbChNRU1fQllURV9XUklURSB8IE1GX0FTQkZSLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCk7IAorCQkJd3JpdGViKDB4ZmYsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsKKwkJCXdyaXRlbChNTUlPX0JZVEVfV1JJVEUgfCBNSVNSX1NFVCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCQl3cml0ZWIoTUlTUl9BU0JGUiwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwkJCXJldHVybiA7IAkKKwkJCS8qIERyb3Agb3V0IGFuZCB3YWl0IGZvciB0aGUgYm90dG9tIGhhbGYgdG8gYmUgcnVuICovCisJCX0KKwkKKwkJeGxfYXNiX2NtZChkZXYpIDsgCisJCQorCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZWNlaXZlZCB1bmtub3duIGFyYiAoeGxfcHJpdikgY29tbWFuZDogJTAyeCBcbiIsZGV2LT5uYW1lLGFyYl9jbWQpIDsgCisJfQorCisJLyogQWNrbm93bGVkZ2UgdGhlIGFyYiBpbnRlcnJ1cHQgKi8KKworCXdyaXRlbChBQ0tfSU5URVJSVVBUIHwgQVJCQ0FDSyB8IExBVENIX0FDSyAsIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisKKwlyZXR1cm4gOyAKK30KKworCisvKgorICoJVGhlcmUgaXMgb25seSBvbmUgYXNiIGNvbW1hbmQsIGJ1dCB3ZSBjYW4gZ2V0IGNhbGxlZCBmcm9tIGRpZmZlcmVudAorICoJcGxhY2VzLgorICovCisKK3N0YXRpYyB2b2lkIHhsX2FzYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdiA9IChzdHJ1Y3QgeGxfcHJpdmF0ZSAqKSBkZXYtPnByaXYgOyAKKwl1OCBfX2lvbWVtICogeGxfbW1pbyA9IHhsX3ByaXYtPnhsX21taW8gOyAKKworCWlmICh4bF9wcml2LT5hc2JfcXVldWVkID09IDEpIAorCQl3cml0ZWwoQUNLX0lOVEVSUlVQVCB8IExBVENIX0FDSyB8IEFTQkZBQ0ssIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsgCisJCQorCXdyaXRlbChNRU1fQllURV9XUklURSB8IDB4ZDAwMDAgfCB4bF9wcml2LT5hc2IsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdyaXRlYigweDgxLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCisJd3JpdGVsKE1FTV9XT1JEX1dSSVRFIHwgMHhkMDAwMCB8IHhsX3ByaXYtPmFzYiB8IDYsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdyaXRldyhudG9ocyh4bF9wcml2LT5tYWNfYnVmZmVyKSwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKworCXhsX3dhaXRfbWlzcl9mbGFncyhkZXYpIDsgCQorCisJd3JpdGVsKE1FTV9CWVRFX1dSSVRFIHwgTUZfUkFTQiwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpOyAKKwl3cml0ZWIoMHhmZiwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOworCisJd3JpdGVsKE1NSU9fQllURV9XUklURSB8IE1JU1JfU0VULCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwl3cml0ZWIoTUlTUl9SQVNCLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCisJeGxfcHJpdi0+YXNiX3F1ZXVlZCA9IDIgOyAKKworCXJldHVybiA7IAorfQorCisvKgorICogCVRoaXMgd2lsbCBvbmx5IGdldCBjYWxsZWQgaWYgdGhlcmUgd2FzIGFuIGVycm9yCisgKglmcm9tIHRoZSBhc2IgY21kLgorICovCitzdGF0aWMgdm9pZCB4bF9hc2JfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXYgPSAoc3RydWN0IHhsX3ByaXZhdGUgKikgZGV2LT5wcml2IDsgCisJdTggX19pb21lbSAqIHhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisJdTggcmV0X2NvZGUgOyAKKworCXdyaXRlbChNTUlPX0JZVEVfUkVBRCB8IDB4ZDAwMDAgfCB4bF9wcml2LT5hc2IgfCAyLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwlyZXRfY29kZSA9IHJlYWRiKHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJc3dpdGNoIChyZXRfY29kZSkgeyAKKwkJY2FzZSAweDAxOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFTQiBDb21tYW5kLCB1bnJlY29nbml6ZWQgY29tbWFuZCBjb2RlIFxuIixkZXYtPm5hbWUpIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSAweDI2OgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFTQiBDb21tYW5kLCB1bmV4cGVjdGVkIHJlY2VpdmUgYnVmZmVyIFxuIiwgZGV2LT5uYW1lKSA7IAorCQkJYnJlYWsgOyAKKwkJY2FzZSAweDQwOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFTQiBDb21tYW5kLCBJbnZhbGlkIFN0YXRpb24gSUQgXG4iLCBkZXYtPm5hbWUpIDsgCisJCQlicmVhayA7ICAKKwl9CisJeGxfcHJpdi0+YXNiX3F1ZXVlZCA9IDAgOyAKKwl3cml0ZWwoQUNLX0lOVEVSUlVQVCB8IExBVENIX0FDSyB8IEFTQkZBQ0ssIHhsX21taW8gKyBNTUlPX0NPTU1BTkQpIDsKKwlyZXR1cm4gOyAgCit9CisKKy8qIAkKKyAqCUlzc3VlIHNyYiBjb21tYW5kcyB0byB0aGUgbmljIAorICovCisKK3N0YXRpYyB2b2lkIHhsX3NyYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNyYl9jbWQpIAoreworCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2ID0gKHN0cnVjdCB4bF9wcml2YXRlICopIGRldi0+cHJpdiA7IAorCXU4IF9faW9tZW0gKiB4bF9tbWlvID0geGxfcHJpdi0+eGxfbW1pbyA7IAorCisJc3dpdGNoIChzcmJfY21kKSB7IAorCWNhc2UgUkVBRF9MT0c6CisJCXdyaXRlbChNRU1fQllURV9XUklURSB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl3cml0ZWIoUkVBRF9MT0csIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCWJyZWFrOyAKKworCWNhc2UgQ0xPU0VfTklDOgorCQl3cml0ZWwoTUVNX0JZVEVfV1JJVEUgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJd3JpdGViKENMT1NFX05JQywgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwkJYnJlYWsgOworCisJY2FzZSBTRVRfUkVDRUlWRV9NT0RFOgorCQl3cml0ZWwoTUVNX0JZVEVfV1JJVEUgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiLCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJd3JpdGViKFNFVF9SRUNFSVZFX01PREUsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCXdyaXRlbChNRU1fV09SRF9XUklURSB8IDB4RDAwMDAgfCB4bF9wcml2LT5zcmIgfCA0LCB4bF9tbWlvICsgTU1JT19NQUNfQUNDRVNTX0NNRCkgOyAKKwkJd3JpdGV3KHhsX3ByaXYtPnhsX2NvcHlfYWxsX29wdGlvbnMsIHhsX21taW8gKyBNTUlPX01BQ0RBVEEpIDsgCisJCWJyZWFrIDsKKworCWNhc2UgU0VUX0ZVTkNfQUREUkVTUzoKKwkJd3JpdGVsKE1FTV9CWVRFX1dSSVRFIHwgMHhEMDAwMCB8IHhsX3ByaXYtPnNyYiwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJCXdyaXRlYihTRVRfRlVOQ19BRERSRVNTLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQl3cml0ZWwoTUVNX0JZVEVfV1JJVEUgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiIHwgNiAsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl3cml0ZWIoeGxfcHJpdi0+eGxfZnVuY3Rpb25hbF9hZGRyWzBdLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQl3cml0ZWwoTUVNX0JZVEVfV1JJVEUgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiIHwgNyAsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl3cml0ZWIoeGxfcHJpdi0+eGxfZnVuY3Rpb25hbF9hZGRyWzFdLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQl3cml0ZWwoTUVNX0JZVEVfV1JJVEUgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiIHwgOCAsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl3cml0ZWIoeGxfcHJpdi0+eGxfZnVuY3Rpb25hbF9hZGRyWzJdLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCQl3cml0ZWwoTUVNX0JZVEVfV1JJVEUgfCAweEQwMDAwIHwgeGxfcHJpdi0+c3JiIHwgOSAsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQl3cml0ZWIoeGxfcHJpdi0+eGxfZnVuY3Rpb25hbF9hZGRyWzNdLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7CisJCWJyZWFrIDsgIAorCX0gLyogc3dpdGNoICovCisKKworCXhsX3dhaXRfbWlzcl9mbGFncyhkZXYpICA7IAorCisJLyogV3JpdGUgMHhmZiB0byB0aGUgQ1NSQiBmbGFnICovCisJd3JpdGVsKE1FTV9CWVRFX1dSSVRFIHwgTUZfQ1NSQiAsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdyaXRlYigweEZGLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCS8qIFNldCBjc3JiIGJpdCBpbiBNSVNSIHJlZ2lzdGVyIHRvIHByb2Nlc3MgY29tbWFuZCAqLworCXdyaXRlbChNTUlPX0JZVEVfV1JJVEUgfCBNSVNSX1NFVCwgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJd3JpdGViKE1JU1JfQ1NSQiwgeGxfbW1pbyArIE1NSU9fTUFDREFUQSkgOyAKKwl4bF9wcml2LT5zcmJfcXVldWVkID0gMSA7IAorCisJcmV0dXJuIDsgCit9CisKKy8qCisgKiBUaGlzIGlzIG5hc3R5LCB0byB1c2UgdGhlIE1JU1IgY29tbWFuZCB5b3UgaGF2ZSB0byB3YWl0IGZvciA2IG1lbW9yeSBsb2NhdGlvbnMKKyAqIHRvIGJlIHplcm8uIFRoaXMgaXMgdGhlIHdheSB0aGUgZHJpdmVyIGRvZXMgb24gb3RoZXIgT1MnZXMgc28gd2Ugc2hvdWxkIGJlIG9rIHdpdGggCisgKiB0aGUgZW1wdHkgbG9vcC4KKyAqLworCitzdGF0aWMgdm9pZCB4bF93YWl0X21pc3JfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXYgPSAoc3RydWN0IHhsX3ByaXZhdGUgKikgZGV2LT5wcml2IDsgCisJdTggX19pb21lbSAqIHhsX21taW8gPSB4bF9wcml2LT54bF9tbWlvIDsgCisJCisJaW50IGkgIDsgCisJCisJd3JpdGVsKE1NSU9fQllURV9SRUFEIHwgTUlTUl9SVywgeGxfbW1pbyArIE1NSU9fTUFDX0FDQ0VTU19DTUQpIDsgCisJaWYgKHJlYWRiKHhsX21taW8gKyBNTUlPX01BQ0RBVEEpICE9IDApIHsgIC8qIE1pc3Igbm90IGNsZWFyICovCisJCWZvciAoaT0wOyBpPDY7IGkrKykgeyAKKwkJCXdyaXRlbChNRU1fQllURV9SRUFEIHwgMHhERkZFMCB8IGksIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCQkJd2hpbGUgKHJlYWRiKHhsX21taW8gKyBNTUlPX01BQ0RBVEEpICE9IDAgKSB7fSA7IC8qIEVtcHR5IExvb3AgKi8KKwkJfSAKKwl9CisKKwl3cml0ZWwoTU1JT19CWVRFX1dSSVRFIHwgTUlTUl9BTkQsIHhsX21taW8gKyBNTUlPX01BQ19BQ0NFU1NfQ01EKSA7IAorCXdyaXRlYigweDgwLCB4bF9tbWlvICsgTU1JT19NQUNEQVRBKSA7IAorCisJcmV0dXJuIDsgCit9IAorCisvKgorICoJQ2hhbmdlIG10dSBzaXplLCB0aGlzIHNob3VsZCB3b3JrIHRoZSBzYW1lIGFzIG9seW1waWMKKyAqLworCitzdGF0aWMgaW50IHhsX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG10dSkgCit7CisJc3RydWN0IHhsX3ByaXZhdGUgKnhsX3ByaXYgPSAoc3RydWN0IHhsX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXUxNiBtYXhfbXR1IDsgCisKKwlpZiAoeGxfcHJpdi0+eGxfcmluZ19zcGVlZCA9PSA0KQorCQltYXhfbXR1ID0gNDUwMCA7IAorCWVsc2UKKwkJbWF4X210dSA9IDE4MDAwIDsgCisJCisJaWYgKG10dSA+IG1heF9tdHUpCisJCXJldHVybiAtRUlOVkFMIDsgCisJaWYgKG10dSA8IDEwMCkgCisJCXJldHVybiAtRUlOVkFMIDsgCisKKwlkZXYtPm10dSA9IG10dSA7IAorCXhsX3ByaXYtPnBrdF9idWZfc3ogPSBtdHUgKyBUUl9ITEVOIDsgCisKKwlyZXR1cm4gMCA7IAorfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgeGxfcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgeGxfcHJpdmF0ZSAqeGxfcHJpdj0oc3RydWN0IHhsX3ByaXZhdGUgKilkZXYtPnByaXY7CisJCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpb3VubWFwKHhsX3ByaXYtPnhsX21taW8pIDsgCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KSA7IAorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LE5VTEwpIDsgCisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gOyAKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHhsXzNjMzU5X2RyaXZlciA9IHsKKwkubmFtZQkJPSAiM2MzNTkiLAorCS5pZF90YWJsZQk9IHhsX3BjaV90YmwsCisJLnByb2JlCQk9IHhsX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoeGxfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCB4bF9wY2lfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0ICgmeGxfM2MzNTlfZHJpdmVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgeGxfcGNpX2NsZWFudXAgKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmeGxfM2MzNTlfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoeGxfcGNpX2luaXQpOworbW9kdWxlX2V4aXQoeGxfcGNpX2NsZWFudXApOworCitNT0RVTEVfTElDRU5TRSgiR1BMIikgOyAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OS5oIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nLzNjMzU5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjODYwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OS5oCkBAIC0wLDAgKzEsMjkwIEBACisvKgorICogIDNjMzU5LmggKGMpIDIwMDAgTWlrZSBQaGlsbGlwcyAobWlrZXBAbGludXh0ci5uZXQpIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgTGludXggZHJpdmVyIGZvciAzQ29tIDNDMzU5IFRva2VuIExpbmsgUENJIFhMIGNhcmRzLgorICoKKyAqICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciAoYXQgeW91ciBvcHRpb24pIAorICogIGFueSBsYXRlciB2ZXJpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICovCisKKy8qIE1lbW9yeSBBY2Nlc3MgQ29tbWFuZHMgKi8KKyNkZWZpbmUgSU9fQllURV9SRUFEIDB4MjggPDwgMjQKKyNkZWZpbmUgSU9fQllURV9XUklURSAweDE4IDw8IDI0IAorI2RlZmluZSBJT19XT1JEX1JFQUQgMHgyMCA8PCAyNAorI2RlZmluZSBJT19XT1JEX1dSSVRFIDB4MTAgPDwgMjQKKyNkZWZpbmUgTU1JT19CWVRFX1JFQUQgMHg4OCA8PCAyNAorI2RlZmluZSBNTUlPX0JZVEVfV1JJVEUgMHg0OCA8PCAyNAorI2RlZmluZSBNTUlPX1dPUkRfUkVBRCAweDgwIDw8IDI0CisjZGVmaW5lIE1NSU9fV09SRF9XUklURSAweDQwIDw8IDI0CisjZGVmaW5lIE1FTV9CWVRFX1JFQUQgMHg4QyA8PCAyNAorI2RlZmluZSBNRU1fQllURV9XUklURSAweDRDIDw8IDI0CisjZGVmaW5lIE1FTV9XT1JEX1JFQUQgMHg4NCA8PCAyNAorI2RlZmluZSBNRU1fV09SRF9XUklURSAweDQ0IDw8IDI0CisKKyNkZWZpbmUgUE1CQVIgMHgxQzgwCisjZGVmaW5lIFBNQl9DUEhPTEQgKDE8PDEwKQorCisjZGVmaW5lIENQQVRURU5USU9OIDB4MTgwRAorI2RlZmluZSBDUEFfUE1CQVJWSVMgKDE8PDcpCisjZGVmaW5lIENQQV9NRU1XUkVOICgxPDw2KQorCisjZGVmaW5lIFNXSVRDSFNFVFRJTkdTIDB4MUM4OAorI2RlZmluZSBFRUNPTlRST0wgMHgxQzhBCisjZGVmaW5lIEVFREFUQSAweDFDOEMKKyNkZWZpbmUgRUVSRUFEIDB4MDA4MCAKKyNkZWZpbmUgRUVXUklURSAweDAwNDAKKyNkZWZpbmUgRUVFUkFTRSAweDAwNjAKKyNkZWZpbmUgRUVfRU5BQkxFX1dSSVRFIDB4MDAzMAorI2RlZmluZSBFRUJVU1kgKDE8PDE1KQorCisjZGVmaW5lIFdSQlIgMHhDREUwMgorI2RlZmluZSBXV09SIDB4Q0RFMDQKKyNkZWZpbmUgV1dDUiAweENERTA2CisjZGVmaW5lIE1BQ1NUQVRVUyAweENERTA4IAorI2RlZmluZSBNSVNSX1JXIDB4Q0RFMEIKKyNkZWZpbmUgTUlTUl9BTkQgMHhDREUyQgorI2RlZmluZSBNSVNSX1NFVCAweENERTRCCisjZGVmaW5lIFJYQlVGQVJFQSAweENERTEwCisjZGVmaW5lIFJYRUFSTFlUSFJFU0ggMHhDREUxMgorI2RlZmluZSBUWFNUQVJUVEhSRVNIIDB4NTgKKyNkZWZpbmUgRE5QUklSRVFUSFJFU0ggMHgyQworCisjZGVmaW5lIE1JU1JfQ1NSQiAoMTw8NSkKKyNkZWZpbmUgTUlTUl9SQVNCICgxPDw0KQorI2RlZmluZSBNSVNSX1NSQkZSICgxPDwzKQorI2RlZmluZSBNSVNSX0FTQkZSICgxPDwyKQorI2RlZmluZSBNSVNSX0FSQkYgKDE8PDEpIAorCisvKiBNSVNSIEZsYWdzIG1lbW9yeSBsb2NhdGlvbnMgKi8KKyNkZWZpbmUgTUZfU1NCRiAweERGRkUwIAorI2RlZmluZSBNRl9BUkJGIDB4REZGRTEKKyNkZWZpbmUgTUZfQVNCRlIgMHhERkZFMgorI2RlZmluZSBNRl9TUkJGUiAweERGRkUzCisjZGVmaW5lIE1GX1JBU0IgMHhERkZFNAorI2RlZmluZSBNRl9DU1JCIDB4REZGRTUKKworI2RlZmluZSBNTUlPX01BQ0RBVEEgMHgxMCAKKyNkZWZpbmUgTU1JT19NQUNfQUNDRVNTX0NNRCAweDE0CisjZGVmaW5lIE1NSU9fVElNRVIgMHgxQQorI2RlZmluZSBNTUlPX0RNQV9DVFJMIDB4MjAKKyNkZWZpbmUgTU1JT19ETkxJU1RQVFIgMHgyNAorI2RlZmluZSBNTUlPX0hBU0hGSUxURVIgMHgyOAorI2RlZmluZSBNTUlPX0NPTkZJRyAweDI5CisjZGVmaW5lIE1NSU9fRE5QUklSRVFUSFJFU0ggMHgyQworI2RlZmluZSBNTUlPX0ROUE9MTCAweDJECisjZGVmaW5lIE1NSU9fVVBQS1RTVEFUVVMgMHgzMAorI2RlZmluZSBNTUlPX0ZSRUVUSU1FUiAweDM0CisjZGVmaW5lIE1NSU9fQ09VTlRET1dOIDB4MzYKKyNkZWZpbmUgTU1JT19VUExJU1RQVFIgMHgzOAorI2RlZmluZSBNTUlPX1VQUE9MTCAweDNDCisjZGVmaW5lIE1NSU9fVVBCVVJTVFRIUkVTSCAweDQwCisjZGVmaW5lIE1NSU9fRE5CVVJTVFRIUkVTSCAweDQxCisjZGVmaW5lIE1NSU9fSU5UU1RBVFVTX0FVVE8gMHg1NgorI2RlZmluZSBNTUlPX1RYU1RBUlRUSFJFU0ggMHg1OAorI2RlZmluZSBNTUlPX0lOVEVSUlVQVEVOQUJMRSAweDVBCisjZGVmaW5lIE1NSU9fSU5ESUNBVElPTkVOQUJMRSAweDVDCisjZGVmaW5lIE1NSU9fQ09NTUFORCAweDVFICAvKiBUaGVzZSB0d28gYXJlIG1lYW50IHRvIGJlIHRoZSBzYW1lICovCisjZGVmaW5lIE1NSU9fSU5UU1RBVFVTIDB4NUUgLyogTWFrZXMgdGhlIGNvZGUgbW9yZSByZWFkYWJsZSB0aGlzIHdheSAqLworI2RlZmluZSBJTlRTVEFUX0NNRF9JTl9QUk9HUkVTUyAoMTw8MTIpIAorI2RlZmluZSBJTlRTVEFUX1NSQiAoMTw8MTQpCisjZGVmaW5lIElOVFNUQVRfSU5UTEFUQ0ggKDE8PDApCisKKy8qIEluZGljYXRpb24gLyBJbnRlcnJ1cHQgTWFzayAKKyAqIEFubm95aW5nbHkgdGhlIGJpdHMgdG8gYmUgc2V0IGluIHRoZSBpbmRpY2F0aW9uIGFuZCBpbnRlcnJ1cHQgZW5hYmxlCisgKiBkbyBub3QgbWF0Y2ggd2l0aCB0aGUgYWN0dWFsIGJpdHMgcmVjZWl2ZWQgaW4gdGhlIGludGVycnVwdCwgYWx0aG91Z2gKKyAqIHRoZXkgYXJlIGluIHRoZSBzYW1lIG9yZGVyLiAKKyAqIFRoZSBtYXBwaW5nIGZvciB0aGUgaW5kaWNhdGlvbiAvIGludGVycnVwdCBhcmU6CisgKiBCaXQJSW5kaWNhdGlvbiAvIEludGVycnVwdAorICogICAwCUhvc3RFcnJvcgorICogICAxCXR4Y29tcGxldGUKKyAqICAgMgl1cGRuZWVkZWQKKyAqICAgMwlyeGNvbXBsZXRlCisgKiAgIDQJaW50cmVxdWVzdGVkCisgKiAgIDUJbWFjZXJyb3IKKyAqICAgNiAgZG5jb21wbGV0ZQorICogICA3CXVwY29tcGxldGUKKyAqICAgOAl0eHVuZGVycnVuCisgKiAgIDkJYXNiZgorICogIDEwCXNyYnIKKyAqICAxMQlhcmJjCisgKgorICogIFRoZSBvbmx5IG9uZXMgd2UgZG9uJ3Qgd2FudCB0byByZWNlaXZlIGFyZSB0eGNvbXBsZXRlIGFuZCByeGNvbXBsZXRlCisgKiAgd2UgdXNlIGRuY29tcGxldGUgYW5kIHVwY29tcGxldGUgaW5zdGVhZC4KKyAqLworCisjZGVmaW5lIElOVF9NQVNLIDB4RkY1CisKKy8qIE5vdGUgdGhlIHN1YnRsZSBkaWZmZXJlbmNlIGhlcmUsIElORCBhbmQgSU5UICovCisKKyNkZWZpbmUgU0VUSU5ERU5BQkxFICg4PDwxMikKKyNkZWZpbmUgU0VUSU5URU5BQkxFICg3PDwxMikKKyNkZWZpbmUgU1JCQklUICgxPDwxMCkKKyNkZWZpbmUgQVNCQklUICgxPDw5KQorI2RlZmluZSBBUkJCSVQgKDE8PDExKQorCisjZGVmaW5lIFNSQiAweERGRTkwCisjZGVmaW5lIEFTQiAweERGRUQwCisjZGVmaW5lIEFSQiAweEQwMDAwCisjZGVmaW5lIFNDUkFUQ0ggMHhERkVGMAorCisjZGVmaW5lIElOVF9SRVFVRVNUIDB4NjAwMCAvKiAoNiA8PCAxMikgKi8KKyNkZWZpbmUgQUNLX0lOVEVSUlVQVCAweDY4MDAgLyogKDEzIDw8MTEpICovCisjZGVmaW5lIEdMT0JBTF9SRVNFVCAweDAwIAorI2RlZmluZSBETkRJU0FCTEUgMHg1MDAwIAorI2RlZmluZSBETkVOQUJMRSAweDQ4MDAgCisjZGVmaW5lIEROU1RBTEwgMHgzMDAyCisjZGVmaW5lIEROUkVTRVQgMHg1ODAwCisjZGVmaW5lIEROVU5TVEFMTCAweDMwMDMKKyNkZWZpbmUgVVBSRVNFVCAweDI4MDAKKyNkZWZpbmUgVVBTVEFMTCAweDMwMDAKKyNkZWZpbmUgVVBVTlNUQUxMIDB4MzAwMQorI2RlZmluZSBTRVRDT05GSUcgMHg0MDAwCisjZGVmaW5lIFNFVFRYU1RBUlRUSFJFU0ggMHg5ODAwIAorCisvKiBSZWNlaXZlZCBJbnRlcnJ1cHRzICovCisjZGVmaW5lIEFTQkZJTlQgKDE8PDEzKQorI2RlZmluZSBTUkJSSU5UICgxPDwxNCkKKyNkZWZpbmUgQVJCQ0lOVCAoMTw8MTUpCisjZGVmaW5lIFRYVU5ERVJSVU4gKDE8PDExKQorCisjZGVmaW5lIFVQQ09NUElOVCAoMTw8MTApCisjZGVmaW5lIEROQ09NUElOVCAoMTw8OSkKKyNkZWZpbmUgSEFSREVSUklOVCAoMTw8NykKKyNkZWZpbmUgUlhDT01QTEVURSAoMTw8NCkKKyNkZWZpbmUgVFhDT01QSU5UICgxPDwyKQorI2RlZmluZSBIT1NURVJSSU5UICgxPDwxKQorCisvKiBSZWNlaXZlIGRlc2NyaXB0b3IgYml0cyAqLworI2RlZmluZSBSWE9WRVJSVU4gKDE8PDE5KQorI2RlZmluZSBSWEZDICgxPDwyMSkKKyNkZWZpbmUgUlhBUiAoMTw8MjIpCisjZGVmaW5lIFJYVVBEQ09NUExFVEUgKDE8PDIzKQorI2RlZmluZSBSWFVQREZVTEwgKDE8PDI0KQorI2RlZmluZSBSWFVQTEFTVEZSQUcgKDE8PDMxKQorCisvKiBUcmFuc21pdCBkZXNjcmlwdG9yIGJpdHMgKi8KKyNkZWZpbmUgVFhETkNPTVBMRVRFICgxPDwxNikKKyNkZWZpbmUgVFhUWElORElDQVRFICgxPDwyNykKKyNkZWZpbmUgVFhEUERFTVBUWSAoMTw8MjkpCisjZGVmaW5lIFRYRE5JTkRJQ0FURSAoMTw8MzEpCisjZGVmaW5lIFRYRE5GUkFHTEFTVCAoMTw8MzEpCisKKy8qIEludGVycnVwdHMgdG8gQWNrbm93bGVkZ2UgKi8KKyNkZWZpbmUgTEFUQ0hfQUNLIDEgCisjZGVmaW5lIFRYQ09NUEFDSyAoMTw8MSkKKyNkZWZpbmUgSU5UUkVRQUNLICgxPDwyKQorI2RlZmluZSBETkNPTVBBQ0sgKDE8PDMpCisjZGVmaW5lIFVQQ09NUEFDSyAoMTw8NCkKKyNkZWZpbmUgQVNCRkFDSyAoMTw8NSkKKyNkZWZpbmUgU1JCUkFDSyAoMTw8NikKKyNkZWZpbmUgQVJCQ0FDSyAoMTw8NykKKworI2RlZmluZSBYTF9JT19TUEFDRSAxMjgKKyNkZWZpbmUgU1JCX0NPTU1BTkRfU0laRSA1MAorCisvKiBBZGFwdGVyIENvbW1hbmRzICovCisjZGVmaW5lIFJFUVVFU1RfSU5UIDB4MDAKKyNkZWZpbmUgTU9ESUZZX09QRU5fUEFSTVMgMHgwMQorI2RlZmluZSBSRVNUT1JFX09QRU5fUEFSTVMgMHgwMgorI2RlZmluZSBPUEVOX05JQyAweDAzCisjZGVmaW5lIENMT1NFX05JQyAweDA0CisjZGVmaW5lIFNFVF9TTEVFUF9NT0RFIDB4MDUKKyNkZWZpbmUgU0VUX0dST1VQX0FERFJFU1MgMHgwNgorI2RlZmluZSBTRVRfRlVOQ19BRERSRVNTIDB4MDcKKyNkZWZpbmUgUkVBRF9MT0cgMHgwOAorI2RlZmluZSBTRVRfTVVMVElDQVNUX01PREUgMHgwQworI2RlZmluZSBDSEFOR0VfV0FLRVVQX1BBVFRFUk4gMHgwRAorI2RlZmluZSBHRVRfU1RBVElTVElDUyAweDEzCisjZGVmaW5lIFNFVF9SRUNFSVZFX01PREUgMHgxRgorCisvKiBBUkIgQ29tbWFuZHMgKi8KKyNkZWZpbmUgUkVDRUlWRV9EQVRBIDB4ODEKKyNkZWZpbmUgUklOR19TVEFUVVNfQ0hBTkdFIDB4ODQKKworLyogQVNCIENvbW1hbmRzICovCisjZGVmaW5lIEFTQl9SRUNFSVZFX0RBVEUgMHg4MSAKKworLyogRGVmaW5lcyBmb3IgTEFOIFNUQVRVUyBDSEFOR0UgcmVwb3J0cyAqLworI2RlZmluZSBMU0NfU0lHX0xPU1MgMHg4MDAwCisjZGVmaW5lIExTQ19IQVJEX0VSUiAweDQwMDAKKyNkZWZpbmUgTFNDX1NPRlRfRVJSIDB4MjAwMAorI2RlZmluZSBMU0NfVFJBTl9CQ04gMHgxMDAwCisjZGVmaW5lIExTQ19MV0YgICAgICAweDA4MDAKKyNkZWZpbmUgTFNDX0FSVyAgICAgIDB4MDQwMAorI2RlZmluZSBMU0NfRlBFICAgICAgMHgwMjAwCisjZGVmaW5lIExTQ19SUiAgICAgICAweDAxMDAKKyNkZWZpbmUgTFNDX0NPICAgICAgIDB4MDA4MAorI2RlZmluZSBMU0NfU1MgICAgICAgMHgwMDQwCisjZGVmaW5lIExTQ19SSU5HX1JFQyAweDAwMjAKKyNkZWZpbmUgTFNDX1NSX0NPICAgIDB4MDAxMAorI2RlZmluZSBMU0NfRkRYX01PREUgMHgwMDA0CisKKyNkZWZpbmUgWExfTUFYX0FEQVBURVJTIDggLyogMHgwOCBfX01PRFVMRV9TVFJJTkcgY2FuJ3QgaGFuZCAweG5uICovCisKKy8qIDNjMzU5IGRlZmF1bHRzIGZvciBidWZmZXJzICovCisgCisjZGVmaW5lIFhMX1JYX1JJTkdfU0laRSAxNiAvKiBtdXN0IGJlIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBYTF9UWF9SSU5HX1NJWkUgMTYgLyogbXVzdCBiZSBhIHBvd2VyIG9mIDIgKi8KKworI2RlZmluZSBQS1RfQlVGX1NaIDQwOTYgLyogRGVmYXVsdCBwYWNrZXQgc2l6ZSAqLworCisvKiAzYzM1OSBkYXRhIHN0cnVjdHVyZXMgKi8KKworc3RydWN0IHhsX3R4X2Rlc2MgeworCXUzMiBkbm5leHRwdHIgOyAKKwl1MzIgZnJhbWVzdGFydGhlYWRlciA7IAorCXUzMiBidWZmZXIgOworCXUzMiBidWZmZXJfbGVuZ3RoIDsKK307CisKK3N0cnVjdCB4bF9yeF9kZXNjIHsKKwl1MzIgdXBuZXh0cHRyIDsgCisJdTMyIGZyYW1lc3RhdHVzIDsgCisJdTMyIHVwZnJhZ2FkZHIgOyAKKwl1MzIgdXBmcmFnbGVuIDsgCit9OworCitzdHJ1Y3QgeGxfcHJpdmF0ZSB7CisJCisKKwkvKiBUaGVzZSB0d28gc3RydWN0dXJlcyBtdXN0IGJlIGFsaWduZWQgb24gOCBieXRlIGJvdW5kYXJpZXMgKi8KKworCS8qIHN0cnVjdCB4bF9yeF9kZXNjIHhsX3J4X3JpbmdbWExfUlhfUklOR19TSVpFXTsgKi8KKwkvKiBzdHJ1Y3QgeGxfdHhfZGVzYyB4bF90eF9yaW5nW1hMX1RYX1JJTkdfU0laRV07ICovCisJc3RydWN0IHhsX3J4X2Rlc2MgKnhsX3J4X3JpbmcgOyAKKwlzdHJ1Y3QgeGxfdHhfZGVzYyAqeGxfdHhfcmluZyA7IAorCXN0cnVjdCBza19idWZmICp0eF9yaW5nX3NrYltYTF9UWF9SSU5HX1NJWkVdLCAqcnhfcmluZ19za2JbWExfUlhfUklOR19TSVpFXTsJCisJaW50IHR4X3JpbmdfaGVhZCwgdHhfcmluZ190YWlsIDsgIAorCWludCByeF9yaW5nX3RhaWwsIHJ4X3Jpbmdfbm8gOyAKKwlpbnQgZnJlZV9yaW5nX2VudHJpZXMgOyAKKworCXUxNiBzcmI7CisJdTE2IGFyYjsKKwl1MTYgYXNiOworCisJdTggX19pb21lbSAqeGxfbW1pbzsKKwljaGFyICp4bF9jYXJkX25hbWU7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgOyAKKwkKKwlzcGlubG9ja190IHhsX2xvY2sgOyAKKworCXZvbGF0aWxlIGludCBzcmJfcXVldWVkOyAgICAKKwlzdHJ1Y3Qgd2FpdF9xdWV1ZSAqc3JiX3dhaXQ7CisJdm9sYXRpbGUgaW50IGFzYl9xdWV1ZWQ7ICAgCisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyB4bF9zdGF0cyA7CisKKwl1MTYgbWFjX2J1ZmZlciA7IAkKKwl1MTYgeGxfbGFuX3N0YXR1cyA7CisJdTggeGxfcmluZ19zcGVlZCA7CisJdTE2IHBrdF9idWZfc3ogOyAKKwl1OCB4bF9tZXNzYWdlX2xldmVsOyAKKwl1MTYgeGxfY29weV9hbGxfb3B0aW9ucyA7ICAKKwl1bnNpZ25lZCBjaGFyIHhsX2Z1bmN0aW9uYWxfYWRkcls0XSA7IAorCXUxNiB4bF9hZGRyX3RhYmxlX2FkZHIsIHhsX3Bhcm1zX2FkZHIgOyAKKwl1OCB4bF9sYWFbNl0gOyAKKwl1MzIgcnhfcmluZ19kbWFfYWRkciA7IAorCXUzMiB0eF9yaW5nX2RtYV9hZGRyIDsgCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvM2MzNTlfbWljcm9jb2RlLmggYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvM2MzNTlfbWljcm9jb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEzNTRhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OV9taWNyb2NvZGUuaApAQCAtMCwwICsxLDE1ODEgQEAKKworLyoKKyAqIFRoZSBmaXJtd2FyZSB0aGlzIGRyaXZlciBkb3dubG9hZHMgaW50byB0aGUgdG9rZW5yaW5nIGNhcmQgaXMgYQorICogc2VwYXJhdGUgcHJvZ3JhbSBhbmQgaXMgbm90IEdQTCdkIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGUgTGludXgKKyAqIHNpZGUgZHJpdmVyIGFuZCB0aGUgcm91dGluZSB0aGF0IGxvYWRzIHRoaXMgZGF0YSBpbnRvIHRoZSBjYXJkIGFyZS4KKyAqCisgKiBUaGlzIGZpcm13YXJlIGlzIGxpY2Vuc2VkIHRvIHlvdSBzdHJpY3RseSBmb3IgdXNlIGluIGNvbmp1bmN0aW9uCisgKiB3aXRoIHRoZSB1c2Ugb2YgM0NvbSAzQzM1OSBUb2tlblJpbmcgYWRhcHRlcnMuIFRoZXJlIGlzIG5vCisgKiB3YXJhbnR5IGV4cHJlc3NlZCBvciBpbXBsaWVkIGFib3V0IGl0cyBmaXRuZXNzIGZvciBhbnkgcHVycG9zZS4KKyAqLworCisvKiAzYzM1OV9taWNyb2NvZGUubWFjOiAzQ29tIDNDMzU5IFRva2VucmluZyBtaWNyb2NvZGUuCisgKgorICogTm90ZXM6CisgKiAgLSBMb2FkZWQgZnJvbSB4bF9pbml0IHVwb24gYWRhcHRlciBpbml0aWFsaXphdGlvbi4KKyAqCisgKiBBdmFpbGFibGUgZnJvbSAzQ29tIGFzIHBhcnQgb2YgdGhlaXIgc3RhbmRhcmQgM0MzNTkgZHJpdmVyLiAKKyAqCisgKiBtY19zaXplICptdXN0KiBtdXN0IG1hdGNoIHRoZSBtaWNyb2NvZGUgYmVpbmcgdXNlZCwgZWFjaCB2ZXJzaW9uIGlzIGEgCisgKiBkaWZmZXJlbnQgbGVuZ3RoLgorICovCisKK3N0YXRpYyBpbnQgbWNfc2l6ZSA9IDI0ODgwIDsgCisKK3U4IG1pY3JvY29kZVtdID0geyAKKyAweGZlLDB4M2EsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDMzLDB4MmYsMHgzMCwweDMyLDB4MmYsMHgzOSwweDM5LDB4MjAsMHgzMQorLDB4MzcsMHgzYSwweDMxLDB4MzMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwweDM2LDB4MzcsMHgzOCwweDM5LDB4NDEsMHg0MiwweDQzLDB4NDQsMHg0NSwweDQ2CissMHgwMCwweDAwLDB4MDcsMHhmZiwweDAyLDB4MDAsMHhmZSwweDlmLDB4MDYsMHgwMCwweDAwLDB4N2MsMHg0OCwweDAwLDB4MDAsMHg3MAorLDB4ODIsMHgwMCwweGZmLDB4ZmYsMHg4NiwweDAwLDB4ZmYsMHhmZiwweDg4LDB4MDAsMHhmZiwweGZmLDB4OWEsMHgwMCwweGZmLDB4ZmYKKywweGZmLDB4ZmYsMHgxMSwweDAwLDB4YzAsMHgwMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4MTEsMHgyMiwweDMzLDB4NDQsMHg1NSwweDY2CissMHgzMywweDQzLDB4NGYsMHg0ZCwweDIwLDB4NDIsMHg0MSwweDQyLDB4NDUsMHgxMSwweDQwLDB4YzAsMHgwMCwweGZmLDB4ZmYsMHhmZgorLDB4ZmYsMHgxMSwweDIyLDB4MzMsMHg0NCwweDU1LDB4NjYsMHg1MywweDc0LDB4NjEsMHg3MiwweDc0LDB4MjAsMHg2ZiwweDY2LDB4MjAKKywweDRjLDB4NGMsMHg0MywweDIwLDB4NjYsMHg3MiwweDYxLDB4NmQsMHg2NSwweDJlLDB4MjAsMHgyMCwweDU0LDB4NmYsMHg3NCwweDYxCissMHg2YywweDIwLDB4NjQsMHg2MSwweDc0LDB4NjEsMHgyMCwweDczLDB4NjksMHg3YSwweDY1LDB4MjAsMHg2OSwweDczLDB4MjAsMHg3OAorLDB4NzgsMHg3OCwweDIwLDB4MjAsMHgyMCwweDQyLDB4NDEsMHg0MiwweDQ1LDB4ZTgsMHhkMiwweDAxLDB4ODMsMHgzZSwweGY3LDB4MzQKKywweDAwLDB4NzUsMHgyMSwweGU4LDB4NDEsMHgwMCwweDgzLDB4M2UsMHhmNywweDM0LDB4MDAsMHg3NSwweDE3LDB4ZTgsMHg4MiwweDAwCissMHg4MywweDNlLDB4ZjcsMHgzNCwweDAwLDB4NzUsMHgwZCwweGU4LDB4YmYsMHgwMCwweDgzLDB4M2UsMHhmNywweDM0LDB4MDAsMHg3NQorLDB4MDMsMHhlOCwweDQxLDB4MDIsMHhjMywweDFlLDB4YjgsMHgwMCwweGYwLDB4OGUsMHhkOCwweDMzLDB4ZjYsMHhiOSwweDAwLDB4ODAKKywweDMzLDB4ZGIsMHhhZCwweDAzLDB4ZDgsMHhlMiwweGZiLDB4MWYsMHhiOCwweDAwLDB4MDAsMHg4MywweGZiLDB4MDAsMHg3NCwweDAzCissMHhiOCwweDIyLDB4MDAsMHhhMywweGY3LDB4MzQsMHhjMywweGZhLDB4YmEsMHg1NiwweDAwLDB4YjAsMHhmZiwweGVlLDB4MzMsMHhjMAorLDB4OGUsMHhjMCwweDMzLDB4ZjYsMHhiOSwweGZmLDB4N2YsMHg4MywweDNlLDB4ZmYsMHgzNCwweDAwLDB4NzQsMHgwOCwweDhkLDB4M2UKKywweDMwLDB4NjEsMHhkMSwweGVmLDB4MmIsMHhjZiwweDI2LDB4OGIsMHgxYywweDI2LDB4YzcsMHgwNCwweGZmLDB4ZmYsMHgyNiwweDgzCissMHgzYywweGZmLDB4NzUsMHgxNywweDI2LDB4YzcsMHgwNCwweDAwLDB4MDAsMHgyNiwweDgzLDB4M2MsMHgwMCwweDc1LDB4MGMsMHgyNgorLDB4ODksMHgxYywweDQ2LDB4NDYsMHhlMiwweGUwLDB4YjgsMHgwMCwweDAwLDB4ZWIsMHgwMywweGI4LDB4MjQsMHgwMCwweGEzLDB4ZjcKKywweDM0LDB4YzMsMHhmYSwweGI0LDB4ZDcsMHg5ZSwweDczLDB4M2EsMHg3NSwweDM4LDB4NzksMHgzNiwweDdiLDB4MzQsMHg5ZiwweGIxCissMHgwNSwweGQyLDB4ZWMsMHg3MywweDJkLDB4YjAsMHg0MCwweGQwLDB4ZTAsMHg3MSwweDI3LDB4NzksMHgyNSwweGQwLDB4ZTAsMHg3MworLDB4MjEsMHg3YiwweDFmLDB4MzIsMHhjMCwweDc1LDB4MWIsMHgzMiwweGU0LDB4OWUsMHg3MiwweDE2LDB4NzQsMHgxNCwweDc4LDB4MTIKKywweDdhLDB4MTAsMHg5ZiwweGQyLDB4ZWMsMHg3MiwweDBiLDB4ZDAsMHhlNCwweDcwLDB4MDcsMHg3NSwweDA1LDB4YjgsMHgwMCwweDAwCissMHhlYiwweDAzLDB4YjgsMHgyNiwweDAwLDB4YTMsMHhmNywweDM0LDB4YzMsMHhmYSwweGJhLDB4NWEsMHgwMCwweDMzLDB4YzAsMHhlZgorLDB4ZWYsMHhlZiwweGVmLDB4YjAsMHgwMCwweGU2LDB4NTYsMHhiMCwweDAwLDB4ZTYsMHg1NCwweGJhLDB4NTIsMHgwMCwweGI4LDB4MDEKKywweDAxLDB4ZWYsMHhlOCwweGNhLDB4MDAsMHgzYywweDAxLDB4NzUsMHg3ZiwweGU4LDB4ODMsMHgwMCwweGJhLDB4NTIsMHgwMCwweGI4CissMHgwMiwweDAyLDB4ZWYsMHhlOCwweGI5LDB4MDAsMHgzYywweDAyLDB4NzUsMHg2ZSwweGU4LDB4N2EsMHgwMCwweGJhLDB4NTIsMHgwMAorLDB4YjgsMHgwNCwweDA0LDB4ZWYsMHhlOCwweGE4LDB4MDAsMHgzYywweDA0LDB4NzUsMHg1ZCwweGU4LDB4NzEsMHgwMCwweGJhLDB4NTIKKywweDAwLDB4YjgsMHgwOCwweDA4LDB4ZWYsMHhlOCwweDk3LDB4MDAsMHgzYywweDA4LDB4NzUsMHg0YywweGU4LDB4NjgsMHgwMCwweGJhCissMHg1MiwweDAwLDB4YjgsMHgxMCwweDEwLDB4ZWYsMHhlOCwweDg2LDB4MDAsMHgzYywweDEwLDB4NzUsMHgzYiwweGU4LDB4NWYsMHgwMAorLDB4YmEsMHg1MiwweDAwLDB4YjgsMHgyMCwweDIwLDB4ZWYsMHhlOCwweDc1LDB4MDAsMHgzYywweDIwLDB4NzUsMHgyYSwweGU4LDB4NTYKKywweDAwLDB4YmEsMHg1MiwweDAwLDB4YjgsMHg0MCwweDQwLDB4ZWYsMHhlOCwweDY0LDB4MDAsMHgzYywweDQwLDB4NzUsMHgxOSwweGU4CissMHg0ZCwweDAwLDB4YmEsMHg1MiwweDAwLDB4YjgsMHg4MCwweDgwLDB4ZWYsMHhlOCwweDUzLDB4MDAsMHgzYywweDgwLDB4NzUsMHgwOAorLDB4ZTgsMHg0NCwweDAwLDB4YjgsMHgwMCwweDAwLDB4ZWIsMHgwMywweGI4LDB4MjgsMHgwMCwweGEzLDB4ZjcsMHgzNCwweGMzLDB4YmEKKywweDVhLDB4MDAsMHhiOCwweDAwLDB4ODAsMHhlZiwweGMzLDB4YmEsMHg1YSwweDAwLDB4YjgsMHgwMSwweDgwLDB4ZWYsMHhjMywweGJhCissMHg1YSwweDAwLDB4YjgsMHgwMiwweDgwLDB4ZWYsMHhjMywweGJhLDB4NWEsMHgwMCwweGI4LDB4MDMsMHg4MCwweGVmLDB4YzMsMHhiYQorLDB4NWEsMHgwMCwweGI4LDB4MDQsMHg4MCwweGVmLDB4YzMsMHhiYSwweDVhLDB4MDAsMHhiOCwweDA1LDB4ODAsMHhlZiwweGMzLDB4YmEKKywweDVhLDB4MDAsMHhiOCwweDA2LDB4ODAsMHhlZiwweGMzLDB4YmEsMHg1YSwweDAwLDB4YjgsMHgwNywweDgwLDB4ZWYsMHhjMywweGI5CissMHhmZiwweGZmLDB4ZTQsMHg1OCwweGU0LDB4NTQsMHgzYywweDAwLDB4NzUsMHgwMywweDQ5LDB4NzUsMHhmNywweGMzLDB4ZmEsMHgzMgorLDB4YzAsMHhlNiwweDU2LDB4ZTQsMHg1NiwweDNjLDB4MDAsMHg3NCwweDAzLDB4ZTksMHg4MiwweDAwLDB4YjAsMHhmZiwweGU2LDB4NTYKKywweGU0LDB4NTYsMHgzYywweGZmLDB4NzUsMHg3OCwweGJhLDB4NTIsMHgwMCwweGI4LDB4ZmYsMHhmZiwweGVmLDB4ZWQsMHgzYywweGZmCissMHg3NSwweDZjLDB4YjgsMHgwMCwweGZmLDB4ZWYsMHhlZCwweDNjLDB4MDAsMHg3NSwweDYzLDB4YjAsMHhmZiwweGU2LDB4NTQsMHhlNAorLDB4NTQsMHgzYywweGZmLDB4NzUsMHg1OSwweDMyLDB4YzAsMHhlNiwweDU0LDB4ZTQsMHg1NCwweDNjLDB4MDAsMHg3NSwweDRmLDB4YjAKKywweDBmLDB4ZTYsMHg1MCwweGU0LDB4NTAsMHgyNCwweDBmLDB4M2MsMHgwZiwweDc1LDB4NDMsMHhiMCwweDAwLDB4ZTYsMHg1MCwweGU0CissMHg1MCwweDI0LDB4MGYsMHgzYywweDAwLDB4NzUsMHgzNywweDhjLDB4YzgsMHg4ZSwweGMwLDB4YmUsMHg3MCwweDAwLDB4MjYsMHg4YgorLDB4MTQsMHgyNiwweDhiLDB4NWMsMHgwMiwweGI4LDB4MDAsMHgwMCwweGVmLDB4ZWQsMHgyMywweGMzLDB4M2QsMHgwMCwweDAwLDB4NzUKKywweDFkLDB4YjgsMHhmZiwweGZmLDB4MjMsMHhjMywweGVmLDB4OGIsMHhjOCwweGVkLDB4MjMsMHhjMywweDNiLDB4YzEsMHg3NSwweDBlCissMHg4MywweGM2LDB4MDQsMHgyNiwweDgzLDB4M2MsMHhmZiwweDc1LDB4ZDUsMHhiOCwweDAwLDB4MDAsMHhlYiwweDAzLDB4YjgsMHgyYQorLDB4MDAsMHhhMywweGY3LDB4MzQsMHhjMywweGZhLDB4MzMsMHhjMCwweGJmLDB4MDAsMHgyMCwweGI5LDB4MTcsMHgwMCwweGYzLDB4YWIKKywweGJmLDB4MDAsMHgzMCwweGI5LDB4MTcsMHgwMCwweGYzLDB4YWIsMHhiZiwweDAwLDB4MjIsMHhiOSwweDQwLDB4MDAsMHhmMywweGFiCissMHhiZiwweDAwLDB4MzIsMHhiOSwweDQwLDB4MDAsMHhmMywweGFiLDB4ZmMsMHgxZSwweDhjLDB4YzgsMHg4ZSwweGQ4LDB4MzMsMHhjMAorLDB4OGUsMHhjMCwweGJlLDB4OTIsMHgwMCwweGJmLDB4MDAsMHgyMCwweGI5LDB4MTcsMHgwMCwweGYzLDB4YTQsMHhiZSwweGE5LDB4MDAKKywweGJmLDB4MDAsMHgyMiwweGI5LDB4NDAsMHgwMCwweGYzLDB4YTQsMHgxZiwweGM3LDB4MDYsMHhmYiwweDM0LDB4NjQsMHgwMCwweGJhCissMHgwOCwweDAwLDB4YjgsMHgwZiwweDAwLDB4ZWYsMHhlOCwweDgyLDB4MDEsMHhlOCwweDliLDB4MDEsMHg3MiwweDBkLDB4YzcsMHgwNgorLDB4ZjcsMHgzNCwweDJjLDB4MDAsMHhjNywweDA2LDB4ZjksMHgzNCwweDA0LDB4MDAsMHhjMywweGJhLDB4MGEsMHgwMCwweDMzLDB4YzAKKywweGVmLDB4ZTgsMHg5OCwweDAxLDB4ZTgsMHhiNSwweDAxLDB4YjgsMHgxNywweDAwLDB4YmEsMHg5YywweDAwLDB4ZWYsMHhiOCwweDAwCissMHgxMCwweGJhLDB4OWEsMHgwMCwweGVmLDB4YjgsMHgxNywweDAwLDB4YTksMHgwMSwweDAwLDB4NzQsMHgwMSwweDQwLDB4YmEsMHg4YworLDB4MDAsMHhlZiwweGI4LDB4MDAsMHgxOCwweGJhLDB4ODYsMHgwMCwweGVmLDB4YjgsMHgwYywweDAwLDB4YmEsMHg4MiwweDAwLDB4ZWYKKywweGJhLDB4MDIsMHgwMCwweGVkLDB4MjUsMHhmOSwweGZmLDB4MGQsMHgwMiwweDAwLDB4ZWYsMHhiYSwweDA2LDB4MDAsMHgzMywweGMwCissMHhlZiwweGJhLDB4MDQsMHgwMCwweGI4LDB4NjAsMHgwMCwweGVmLDB4YmEsMHgwMCwweDAwLDB4YjgsMHgxOCwweDAwLDB4ZWYsMHhiYQorLDB4ODAsMHgwMCwweGI5LDB4ZmYsMHhmZiwweGVkLDB4YTksMHgwMSwweDAwLDB4NzUsMHgwNCwweGUyLDB4ZjgsMHhlYiwweDNlLDB4YmEKKywweDBhLDB4MDAsMHhlZCwweGE5LDB4MDAsMHg0MCwweDc0LDB4MzUsMHhhOSwweDAwLDB4MjAsMHg3NCwweDMwLDB4MzMsMHhjMCwweGVmCissMHg1MSwweGI5LDB4YzgsMHgwMCwweGUyLDB4ZmUsMHg1OSwweDFlLDB4MDYsMHgxZiwweDI2LDB4OGIsMHgwZSwweDAyLDB4MzAsMHg4MworLDB4ZjksMHgxNywweDc1LDB4MTgsMHg0OSwweDQ5LDB4YmUsMHgwMiwweDIwLDB4YmYsMHgwNiwweDMwLDB4ZjMsMHhhNiwweDFmLDB4MjMKKywweGM5LDB4NzUsMHgwYSwweGZmLDB4MGUsMHhmYiwweDM0LDB4NzQsMHgxMiwweGU5LDB4NGQsMHhmZiwweDFmLDB4YjgsMHgyYywweDAwCissMHhiYiwweDAwLDB4MDAsMHhhMywweGY3LDB4MzQsMHg4OSwweDFlLDB4ZjksMHgzNCwweGMzLDB4YzcsMHgwNiwweGZiLDB4MzQsMHg2NAorLDB4MDAsMHhlOCwweGQzLDB4MDAsMHg3MiwweDBkLDB4YzcsMHgwNiwweGY3LDB4MzQsMHgyYywweDAwLDB4YzcsMHgwNiwweGY5LDB4MzQKKywweDA0LDB4MDAsMHhjMywweGU4LDB4ZDYsMHgwMCwweGU4LDB4ZjMsMHgwMCwweGI4LDB4MDMsMHgwMCwweGJhLDB4ODIsMHgwMCwweGVmCissMHhiOCwweDQwLDB4ODAsMHhiYSwweDk4LDB4MDAsMHhlZiwweGI4LDB4MDAsMHgxMSwweGJhLDB4OTYsMHgwMCwweGVmLDB4YjgsMHg0MAorLDB4MDAsMHhhOSwweDAxLDB4MDAsMHg3NCwweDAxLDB4NDAsMHhiYSwweDkyLDB4MDAsMHhlZiwweGI4LDB4MDAsMHgxOSwweGJhLDB4OGUKKywweDAwLDB4ZWYsMHhiYSwweDAyLDB4MDAsMHhlZCwweDI1LDB4ZjksMHhmZiwweDBkLDB4MDYsMHgwMCwweGVmLDB4YmEsMHgwNiwweDAwCissMHgzMywweGMwLDB4ZWYsMHhiYSwweDAwLDB4MDAsMHhiOCwweDE4LDB4MDAsMHhlZiwweGJhLDB4ODAsMHgwMCwweGI5LDB4ZmYsMHhmZgorLDB4ZWQsMHhhOSwweDIwLDB4MDAsMHg3NSwweDA0LDB4ZTIsMHhmOCwweGViLDB4NDMsMHhiYSwweDBhLDB4MDAsMHhlZCwweGE5LDB4MDAKKywweDQwLDB4NzQsMHgzYSwweGE5LDB4MDAsMHgyMCwweDc0LDB4MzUsMHgzMywweGMwLDB4ZWYsMHg1MSwweGI5LDB4YzgsMHgwMCwweGUyCissMHhmZSwweDU5LDB4MWUsMHgwNiwweDFmLDB4MjYsMHg4YiwweDBlLDB4MDIsMHgzMiwweDgzLDB4ZjksMHg0MCwweDc1LDB4MWQsMHg0OQorLDB4NDksMHhiZSwweDAyLDB4MjIsMHhiZiwweDA2LDB4MzIsMHhmMywweGE2LDB4MWYsMHgyMywweGM5LDB4NzUsMHgwZiwweGZmLDB4MGUKKywweGZiLDB4MzQsMHg3NCwweDAzLDB4ZTksMHg1YSwweGZmLDB4YjgsMHgwMCwweDAwLDB4ZWIsMHgwYiwweDFmLDB4YjgsMHgyYywweDAwCissMHhiYiwweDAyLDB4MDAsMHg4OSwweDFlLDB4ZjksMHgzNCwweGEzLDB4ZjcsMHgzNCwweGMzLDB4YmEsMHgwMiwweDAwLDB4YjgsMHgwMAorLDB4OWMsMHhlZiwweGJhLDB4MDAsMHgwMCwweGI4LDB4MDAsMHg4NCwweGVmLDB4MzMsMHhjMCwweGVmLDB4YmEsMHgwYSwweDAwLDB4ZWYKKywweGJhLDB4MGUsMHgwMCwweDMzLDB4YzAsMHhlZiwweGMzLDB4YmEsMHgwYSwweDAwLDB4YjksMHhmZiwweGZmLDB4ZWQsMHgyNSwweDAwCissMHg2MCwweDNkLDB4MDAsMHg2MCwweDc0LDB4MDQsMHhlMiwweGY1LDB4ZjgsMHhjMywweGY5LDB4YzMsMHhiMCwweDAwLDB4ZTYsMHg1NgorLDB4YjgsMHgwMCwweGZmLDB4YmEsMHg1MiwweDAwLDB4ZWYsMHhiOSwweGZmLDB4ZmYsMHhiYSwweDU4LDB4MDAsMHhlZCwweDI1LDB4ZWYKKywweDAwLDB4NzQsMHgwOCwweGJhLDB4NWEsMHgwMCwweDMzLDB4YzAsMHhlZiwweGUyLDB4ZWYsMHhjMywweGJhLDB4ODAsMHgwMCwweGVkCissMHhiYSwweDg0LDB4MDAsMHhlZiwweGJhLDB4ODAsMHgwMCwweGVkLDB4YzMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4YzYsMHgwNiwweGVjLDB4MzQsMHgxNSwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4OGUsMHhjMCwweDFlLDB4OGMsMHhjOCwweGJlLDB4NDAKKywweDU0LDB4YmYsMHg2MCwweGZlLDB4OGUsMHhkOCwweGI5LDB4MTAsMHgwMCwweGYzLDB4YTQsMHgxZiwweGM3LDB4MDYsMHg4MCwweDM2CissMHgxMCwweDM1LDB4YzcsMHgwNiwweDhjLDB4MzYsMHgzMCwweDM1LDB4OGQsMHgwNiwweDM4LDB4MzUsMHhhMywweDMwLDB4MzUsMHhhMworLDB4MzIsMHgzNSwweDA1LDB4MzMsMHgwMSwweGEzLDB4MzQsMHgzNSwweGM3LDB4MDYsMHgzNiwweDM1LDB4NTAsMHgwMSwweGM3LDB4MDYKKywweDg0LDB4MzYsMHg4MCwweGZlLDB4YzcsMHgwNiwweDg4LDB4MzYsMHhjMCwweGZlLDB4YzYsMHgwNiwweGMyLDB4ZmUsMHhmZiwweGM2CissMHgwNiwweDkzLDB4MzYsMHg4MCwweGM2LDB4MDYsMHg5MiwweDM2LDB4MDAsMHhjNiwweDA2LDB4ODAsMHhmZSwweDgwLDB4YzcsMHgwNgorLDB4ODIsMHhmZSwweDU0LDB4NTAsMHhjNywweDA2LDB4ODQsMHhmZSwweDJiLDB4NGQsMHhlNSwweGNlLDB4YTksMHgwMiwweDAwLDB4NzUKKywweDA4LDB4YzYsMHgwNiwweDgxLDB4ZmUsMHgyMywweGU5LDB4MDUsMHgwMCwweGM2LDB4MDYsMHg4MSwweGZlLDB4MjIsMHhhMSwweGY3CissMHgzNCwweGEzLDB4ODYsMHhmZSwweGI4LDB4NDgsMHgzNCwweDg2LDB4ZTAsMHhhMywweDg4LDB4ZmUsMHg4ZCwweDA2LDB4NGUsMHgzNAorLDB4ODYsMHhlMCwweGEzLDB4OGEsMHhmZSwweGI4LDB4NTgsMHgzNCwweDg2LDB4ZTAsMHhhMywweDhjLDB4ZmUsMHhiOCwweDljLDB4MzQKKywweDg2LDB4ZTAsMHhhMywweDhlLDB4ZmUsMHg4ZCwweDA2LDB4MjAsMHgwMywweDg2LDB4ZTAsMHhhMywweDkwLDB4ZmUsMHgzMywweGMwCissMHhiYSwweDcyLDB4MDAsMHhlZiwweDMzLDB4YzAsMHhiYSwweDc0LDB4MDAsMHhlZiwweGJhLDB4NzYsMHgwMCwweGVmLDB4YjgsMHg4MAorLDB4ZmUsMHg4NiwweGUwLDB4YmEsMHg3MiwweDAwLDB4ZWYsMHhlOCwweGJmLDB4MDcsMHhiYSwweDBjLDB4MDEsMHhiOCwweDQwLDB4NDAKKywweGVmLDB4ZWQsMHhiYSwweDZhLDB4MDAsMHhiOCwweDAzLDB4MDAsMHhjMSwweGUwLDB4MDgsMHgwZCwweDAzLDB4MDAsMHhlZiwweGI5CissMHgwYSwweDAwLDB4ZTgsMHg5NCwweDAwLDB4YmEsMHg2YSwweDAwLDB4YjgsMHgwMywweDAwLDB4YzEsMHhlMCwweDA4LDB4ZWYsMHhhMQorLDB4MzIsMHgzNCwweGEzLDB4YTIsMHgzMywweGM3LDB4MDYsMHhhNiwweDMzLDB4MDQsMHgwMCwweDhkLDB4MDYsMHhhMCwweDMzLDB4YzEKKywweGU4LDB4MDQsMHhjZCwweDM5LDB4YzcsMHgwNiwweDkwLDB4MzYsMHhmZiwweGZmLDB4ZTksMHhlMywweDAwLDB4NjMsMHgwZCwweDY2CissMHgwZCwweDY2LDB4MGQsMHg4YSwweDBkLDB4ZTYsMHgwZSwweDc1LDB4MTIsMHgyZSwweDBmLDB4MDMsMHgwZiwweDUwLDB4MGYsMHg2MAorLDB4MGQsMHg2MCwweDBkLDB4NjAsMHgwZCwweGVkLDB4MGYsMHhlOSwweDEyLDB4NjAsMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4NjAKKywweDBkLDB4NjAsMHgwZCwweDIyLDB4MTAsMHg2MCwweDBkLDB4NjAsMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4ZmUsMHgxMCwweDYwCissMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4NjAsMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4YWYsMHgwZiwweDMyLDB4MTAsMHgzNworLDB4MGQsMHg2MCwweDBkLDB4NjAsMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4NjAsMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4NjAKKywweDBkLDB4NjAsMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4NjAsMHgwZCwweDYwLDB4MGQsMHg2MCwweDBkLDB4NjAsMHgwZCwweDYwCissMHgwZCwweDY0LDB4MGUsMHgwMCwweDBmLDB4OTUsMHgwOSwweDYwLDB4MGEsMHg0OSwweGJiLDB4ZmYsMHhmZiwweGJhLDB4NmEsMHgwMAorLDB4ZWQsMHhhOSwweDAwLDB4MjAsMHg3NCwweDM4LDB4ODAsMHgzZSwweDgwLDB4ZmUsMHgxMiwweDc1LDB4MzEsMHhlOCwweDRhLDB4MDAKKywweGExLDB4MzIsMHgzNCwweGEzLDB4YTIsMHgzMywweGM3LDB4MDYsMHhhNiwweDMzLDB4MDQsMHgwMCwweDhkLDB4MDYsMHhhMCwweDMzCissMHhjMSwweGU4LDB4MDQsMHhjZCwweDM5LDB4ZTgsMHgyMiwweDAwLDB4YzcsMHgwNiwweGYzLDB4MzQsMHg0NiwweDAwLDB4YzcsMHgwNgorLDB4ZjUsMHgzNCwweGZmLDB4ZmYsMHhjNywweDA2LDB4OTAsMHgzNiwweGZmLDB4ZmYsMHg1OCwweGU5LDB4MzIsMHgwMCwweDRiLDB4ODMKKywweGZiLDB4MDAsMHg3NSwweGI5LDB4ODMsMHhmOSwweDAwLDB4NzUsMHhiMCwweGMzLDB4NTIsMHhiYSwweDZhLDB4MDAsMHhiOCwweDAzCissMHgwMCwweGMxLDB4ZTAsMHgwOCwweDBkLDB4MDMsMHgwMCwweGVmLDB4NWEsMHhjMywweDUyLDB4YmEsMHg2YSwweDAwLDB4YjgsMHgwMworLDB4MDAsMHhjMSwweGUwLDB4MDgsMHhlZiwweDVhLDB4YzMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDY4LDB4ODAsMHgwNywweGExLDB4OTAsMHgzNiwweGNkLDB4MzUsMHg4YiwweDM2LDB4MjQsMHgwMiwweDJlLDB4ZmYsMHhhNCwweDM1CissMHgwYSwweGZhLDB4OGEsMHgyNiwweDk0LDB4MzYsMHg4OCwweDI2LDB4ZTgsMHgzNCwweGM2LDB4MDYsMHg5NCwweDM2LDB4MDAsMHhmYgorLDB4MjIsMHhlNCwweDc1LDB4MDEsMHhjMywweGY2LDB4YzQsMHgyMCwweDc0LDB4N2QsMHhmNiwweGM0LDB4MDgsMHg3NCwweDA1LDB4ODAKKywweDBlLDB4OTIsMHgzNiwweDA0LDB4ODAsMHgyNiwweGU4LDB4MzQsMHhkNywweGM0LDB4MWUsMHg4NCwweDM2LDB4MjYsMHg4YiwweDM3CissMHg4MSwweGU2LDB4ZmYsMHgwMCwweDgzLDB4ZmUsMHgyMCwweDc2LDB4MDUsMHhiMCwweDAxLDB4ZTksMHgyOCwweDAwLDB4NTMsMHgwNgorLDB4ZDEsMHhlNiwweDJlLDB4ZmYsMHg5NCwweDlkLDB4MDYsMHgwNywweDViLDB4MjYsMHg4OCwweDQ3LDB4MDIsMHgzYywweGZmLDB4NzQKKywweDA3LDB4M2MsMHhmZSwweDc1LDB4MTEsMHhlOSwweDNiLDB4MDAsMHhmNiwweDA2LDB4OTIsMHgzNiwweDA4LDB4NzUsMHgzNCwweGY2CissMHgwNiwweDkyLDB4MzYsMHgwNCwweDc0LDB4MmQsMHg4MCwweDI2LDB4OTIsMHgzNiwweGYzLDB4ODAsMHgzZSwweDk1LDB4MzYsMHgwMAorLDB4NzUsMHgyMSwweDI2LDB4ODAsMHgzZiwweDA1LDB4NzUsMHgxMywweGM2LDB4MDYsMHg5NSwweDM2LDB4MDAsMHgyNiwweDgwLDB4N2YKKywweDA2LDB4MDAsMHg3NCwweDA3LDB4MjYsMHg4YiwweDQ3LDB4MDQsMHhhMiwweDk1LDB4MzYsMHhiYSwweDBjLDB4MDEsMHhiOCwweDQwCissMHg0MCwweGVmLDB4ZWQsMHg4YSwweDI2LDB4ZTgsMHgzNCwweGY2LDB4YzQsMHgxMCwweDc1LDB4MDMsMHhlOSwweDViLDB4MDAsMHhmNgorLDB4YzQsMHgwNCwweDc0LDB4MDUsMHg4MCwweDBlLDB4OTIsMHgzNiwweDAxLDB4ODAsMHgyNiwweGU4LDB4MzQsMHhlYiwweGM0LDB4M2UKKywweDg4LDB4MzYsMHgyNiwweDhiLDB4MzUsMHg4MywweGU2LDB4N2YsMHg4MywweGZlLDB4MTIsMHg3MiwweDA4LDB4MjYsMHhjNiwweDQ1CissMHgwMiwweDAxLDB4ZTksMHgyNCwweDAwLDB4ODMsMHhjNiwweDIwLDB4ZDEsMHhlNiwweDJlLDB4ZmYsMHg5NCwweDlkLDB4MDYsMHhjNAorLDB4M2UsMHg4OCwweDM2LDB4MjYsMHg4OCwweDQ1LDB4MDIsMHgzYywweGZmLDB4NzUsMHgwZSwweGY2LDB4MDYsMHg5MiwweDM2LDB4MDEKKywweDc0LDB4MTQsMHhmNiwweDA2LDB4OTIsMHgzNiwweDAyLDB4NzUsMHgwZCwweDgwLDB4MjYsMHg5MiwweDM2LDB4ZmMsMHhiYSwweDBjCissMHgwMSwweGI4LDB4MjAsMHgyMCwweGVmLDB4ZWQsMHg4YSwweDI2LDB4ZTgsMHgzNCwweGY2LDB4YzQsMHgwOCwweDc0LDB4MjIsMHg4MAorLDB4MjYsMHhlOCwweDM0LDB4ZjcsMHg4MCwweDBlLDB4OTIsMHgzNiwweDA0LDB4ZjYsMHgwNiwweDkyLDB4MzYsMHgwOCwweDc0LDB4MTEKKywweDgwLDB4MjYsMHg5MiwweDM2LDB4ZjMsMHhiYSwweDBjLDB4MDEsMHhiOCwweDQwLDB4NDAsMHhlZiwweGVkLDB4OGEsMHgyNiwweGU4CissMHgzNCwweGY2LDB4YzQsMHgwNCwweDc0LDB4MjIsMHg4MCwweDI2LDB4ZTgsMHgzNCwweGZiLDB4ODAsMHgwZSwweDkyLDB4MzYsMHgwMQorLDB4ZjYsMHgwNiwweDkyLDB4MzYsMHgwMiwweDc1LDB4MTEsMHg4MCwweDI2LDB4OTIsMHgzNiwweGZlLDB4YmEsMHgwYywweDAxLDB4YjgKKywweDIwLDB4MjAsMHhlZiwweGVkLDB4OGEsMHgyNiwweGU4LDB4MzQsMHhmNiwweGM0LDB4MDEsMHg3NCwweDY3LDB4ODAsMHgyNiwweGU4CissMHgzNCwweGZlLDB4ODAsMHgzZSwweGU4LDB4ZmYsMHgwMCwweDc0LDB4MzksMHg4MCwweDNlLDB4ZTgsMHhmZiwweDA0LDB4NzQsMHgzMgorLDB4ODAsMHgzZSwweGU4LDB4ZmYsMHgwMSwweDc1LDB4MjEsMHhlNSwweDgwLDB4YTksMHgwMCwweDA3LDB4NzQsMHgwYSwweGJhLDB4OWUKKywweDAwLDB4YjgsMHgwMCwweDAyLDB4ZWYsMHhlOSwweGVmLDB4ZmYsMHhjNiwweDA2LDB4ZTgsMHhmZiwweDAzLDB4YmEsMHgwYywweDAxCissMHhiOCwweDA4LDB4MDgsMHhlZiwweGVkLDB4ZTksMHgyOCwweDAwLDB4ODAsMHgzZSwweGU4LDB4ZmYsMHgwMywweDc0LDB4MDYsMHhlOQorLDB4MWUsMHgwMCwweGU5LDB4MDAsMHgwMCwweGJhLDB4MTAsMHgwMSwweGI4LDB4MDIsMHgwMiwweGVmLDB4ZWQsMHhlNSwweDAwLDB4MGQKKywweDE4LDB4MDAsMHhlNywweDAwLDB4ZTUsMHg4MiwweDBkLDB4MDIsMHgwMCwweGU3LDB4ODIsMHhjNiwweDA2LDB4ZTgsMHhmZiwweDA0CissMHg4YSwweDI2LDB4ZTgsMHgzNCwweGY2LDB4YzQsMHgwMiwweDc0LDB4MGQsMHg4MCwweDI2LDB4ZTgsMHgzNCwweGZkLDB4ODAsMHgyNgorLDB4OTIsMHgzNiwweGJmLDB4ZTgsMHg0ZiwweDBiLDB4ZmEsMHhhMCwweGU4LDB4MzQsMHgwOCwweDA2LDB4OTQsMHgzNiwweGM2LDB4MDYKKywweGU4LDB4MzQsMHgwMCwweGZiLDB4YzMsMHhlOCwweGU3LDB4MGYsMHhjNCwweDFlLDB4ODQsMHgzNiwweDJlLDB4ZmYsMHgxNiwweDAxCissMHgwNywweDI2LDB4ODgsMHg0NywweDAyLDB4ZTksMHg3ZSwweGZlLDB4ZTgsMHgyZCwweDEwLDB4YzQsMHgxZSwweDg0LDB4MzYsMHgyZQorLDB4ZmYsMHgxNiwweDAzLDB4MDcsMHgyNiwweDg4LDB4NDcsMHgwMiwweGU5LDB4NmIsMHhmZSwweDhlLDB4MDYsMHgyNiwweDAyLDB4MmUKKywweGZmLDB4MTYsMHgwNywweDA3LDB4YzMsMHhjMywweDgzLDB4M2UsMHhmNSwweDM0LDB4MDAsMHg3NCwweDBmLDB4ZmYsMHgwZSwweGYzCissMHgzNCwweDc1LDB4MDksMHhlOCwweGM0LDB4ZmQsMHhjNywweDA2LDB4ZjUsMHgzNCwweDAwLDB4MDAsMHhmNiwweDA2LDB4OTMsMHgzNgorLDB4MjAsMHg3NCwweDMwLDB4YTEsMHhjMiwweDM0LDB4M2IsMHgwNiwweGU5LDB4MzQsMHhhMywweGU5LDB4MzQsMHg3NCwweDI0LDB4ODAKKywweDNlLDB4OTUsMHgzNiwweDAwLDB4NzUsMHgxZCwweGY3LDB4MDYsMHhlNiwweDM0LDB4MjAsMHgwMCwweDc0LDB4MTIsMHhhOSwweDIwCissMHgwMCwweDc0LDB4MGQsMHg4MywweDI2LDB4YzIsMHgzNCwweGRmLDB4ODMsMHgyNiwweGU5LDB4MzQsMHhkZiwweGU5LDB4MDMsMHgwMAorLDB4ZTgsMHhkZCwweDA5LDB4YmEsMHgwNiwweDAxLDB4ZWQsMHg4YiwweGQwLDB4ODEsMHhlMiwweDAwLDB4YzAsMHhjMSwweGVhLDB4MGUKKywweDAzLDB4MTYsMHg3NCwweDM0LDB4YzEsMHhlMCwweDAyLDB4MTEsMHgwNiwweDcyLDB4MzQsMHg3MywweDA0LDB4ZmYsMHgwNiwweDc0CissMHgzNCwweGJhLDB4MDIsMHgwMSwweGVkLDB4OGIsMHhkMCwweDgxLDB4ZTIsMHgwMCwweGMwLDB4YzEsMHhlYSwweDBlLDB4MDMsMHgxNgorLDB4NzAsMHgzNCwweGMxLDB4ZTAsMHgwMiwweDExLDB4MDYsMHg2ZSwweDM0LDB4NzMsMHgwNCwweGZmLDB4MDYsMHg3MCwweDM0LDB4YzcKKywweDA2LDB4YTYsMHgzMywweDA0LDB4MDAsMHhjNywweDA2LDB4YWEsMHgzMywweDAwLDB4MDAsMHg4ZCwweDA2LDB4YTAsMHgzMywweGMxCissMHhlOCwweDA0LDB4Y2QsMHgzOSwweGMzLDB4OTUsMHgwOSwweDk1LDB4MDksMHg2NSwweDA5LDB4NzgsMHgwOSwweDk1LDB4MDksMHg5NQorLDB4MDksMHg5MSwweDA3LDB4OTUsMHgwOSwweDk2LDB4MDksMHg4YiwweDA5LDB4OTUsMHgwOSwweDk1LDB4MDksMHg5NSwweDA5LDB4OTUKKywweDA5LDB4OTUsMHgwOSwweDk1LDB4MDksMHg4YiwweGMwLDB4OGIsMHhjMCwweDhiLDB4YzAsMHg4YiwweGMwLDB4OGIsMHhjMCwweDkwCissMHhmNiwweDA2LDB4OTMsMHgzNiwweDIwLDB4NzUsMHgwMywweGU5LDB4Y2MsMHgwMCwweDhjLDB4YzAsMHg0MCwweDhlLDB4YzAsMHgyNgorLDB4OGIsMHgwZSwweDA2LDB4MDAsMHg4NiwweGU5LDB4MjYsMHg4OSwweDBlLDB4MDYsMHgwMCwweDhjLDB4YzIsMHhjMSwweGUyLDB4MDQKKywweGJlLDB4MGUsMHgwMCwweDI2LDB4YTEsMHgwNCwweDAwLDB4ZDAsMHhlMCwweDI0LDB4YzAsMHg4YSwweGUwLDB4YzAsMHhlYywweDA0CissMHgwYSwweGM0LDB4MjYsMHhhMiwweDA1LDB4MDAsMHgyNiwweGExLDB4MDgsMHgwMCwweGE5LDB4MDAsMHhjMCwweDc0LDB4MDMsMHhlOQorLDB4OWUsMHgwMCwweDI2LDB4ZjYsMHgwNiwweDEwLDB4MDAsMHg4MCwweDc1LDB4MDMsMHhlOSwweDBhLDB4MDAsMHgyNiwweGEwLDB4MTYKKywweDAwLDB4MjQsMHgxZiwweDMyLDB4ZTQsMHgwMywweGYwLDB4ODAsMHgzZSwweGVjLDB4MzQsMHgwNiwweDcyLDB4NWMsMHg4MCwweDNlCissMHg5NSwweDM2LDB4MDAsMHg3NSwweDY2LDB4OGIsMHhmYSwweDMzLDB4ZGIsMHg4ZSwweGMzLDB4MjYsMHg4OSwweDFkLDB4MjYsMHg4OAorLDB4NWQsMHgwNCwweDUxLDB4NTAsMHhjNCwweDFlLDB4OGMsMHgzNiwweGI5LDB4MGYsMHgwMCwweDMzLDB4YzAsMHhlOCwweDIxLDB4MDkKKywweDU4LDB4NTksMHgwYiwweGRiLDB4NzQsMHgzNCwweGZlLDB4MGUsMHhlNiwweDNhLDB4MjYsMHhjNiwweDA3LDB4ODEsMHgyNiwweGM2CissMHg0NywweDAxLDB4MDAsMHgyNiwweGM2LDB4NDcsMHgwMiwweGZmLDB4MjYsMHhjNywweDQ3LDB4MDQsMHgwMCwweDAwLDB4MjYsMHg4OQorLDB4NGYsMHgwYSwweDg2LDB4ZjIsMHgyNiwweDg5LDB4NTcsMHgwNiwweDI2LDB4ODksMHg3NywweDA4LDB4MjYsMHhjNiwweDQ3LDB4MDkKKywweDAwLDB4MjYsMHhjNiwweDQ3LDB4MGMsMHgwMiwweGU4LDB4OGMsMHgwOSwweGMzLDB4ZmYsMHgwNiwweGVjLDB4MzMsMHg4YywweGMwCissMHg0OCwweDhlLDB4YzAsMHhmYSwweGU4LDB4OTcsMHgxMCwweGZiLDB4ZTksMHhlYiwweGZmLDB4OGMsMHhjMCwweDQ4LDB4OGUsMHhjMAorLDB4ZmEsMHhlOCwweDhhLDB4MTAsMHhmYiwweGMzLDB4OGMsMHhjMCwweDhlLDB4YzAsMHhmYSwweGU4LDB4ODAsMHgxMCwweGZiLDB4YzMKKywweDgwLDB4M2UsMHg5NSwweDM2LDB4MDAsMHg3NSwweDAzLDB4ZTksMHhjMiwweDAwLDB4YmYsMHgwOCwweDAwLDB4MjYsMHhmNiwweDA2CissMHgxMCwweDAwLDB4ODAsMHg3NSwweDA1LDB4MDMsMHhmZSwweGU5LDB4MGMsMHgwMCwweDI2LDB4YTAsMHgxNiwweDAwLDB4MjQsMHgxZgorLDB4MzIsMHhlNCwweDAzLDB4ZjAsMHgwMywweGZlLDB4YTAsMHg5NSwweDM2LDB4M2MsMHgwMCwweDc1LDB4MDMsMHhlOSwweDljLDB4MDAKKywweDNjLDB4MDEsMHg3NCwweDBiLDB4M2MsMHgwMiwweDc0LDB4MTQsMHgzYywweDAzLDB4NzQsMHgxZCwweGU5LDB4OGQsMHgwMCwweGM2CissMHgwNiwweDk2LDB4MzYsMHgwMSwweGU4LDB4M2MsMHgwMSwweDcyLDB4MjcsMHhlOSwweDgwLDB4MDAsMHhjNiwweDA2LDB4OTYsMHgzNgorLDB4MDIsMHhlOCwweDgzLDB4MDAsMHg3MiwweDFhLDB4ZTksMHg3MywweDAwLDB4YzYsMHgwNiwweDk2LDB4MzYsMHgwMSwweGU4LDB4MjIKKywweDAxLDB4NzIsMHgwZCwweGM2LDB4MDYsMHg5NiwweDM2LDB4MDIsMHhlOCwweDZjLDB4MDAsMHg3MiwweDAzLDB4ZTksMHg1YywweDAwCissMHg1MywweDA2LDB4NTAsMHhjNCwweDFlLDB4OGMsMHgzNiwweGI5LDB4MGIsMHgwMCwweDMzLDB4YzAsMHhlOCwweDQyLDB4MDgsMHg1OAorLDB4MjYsMHhjNiwweDA3LDB4ODIsMHgyNiwweGM2LDB4NDcsMHgwMiwweGZmLDB4OGQsMHgwNiwweGUwLDB4ZmUsMHg4NiwweGM0LDB4MjYKKywweDg5LDB4NDcsMHgwNiwweGEwLDB4OTYsMHgzNiwweDI2LDB4ODgsMHg0NywweDA4LDB4ZTgsMHhjOCwweDA4LDB4MDcsMHg1YiwweDgzCissMHgyNiwweGFkLDB4MzYsMHhmZSwweGExLDB4YWQsMHgzNiwweGU3LDB4MDQsMHhiYSwweDEwLDB4MDEsMHhiOCwweDgwLDB4ODAsMHhlZgorLDB4ZWQsMHhiYSwweDEwLDB4MDEsMHhiOCwweDAyLDB4MDIsMHhlZiwweGVkLDB4NTIsMHhiYSwweGUwLDB4MDAsMHhiOCwweDQxLDB4MTAKKywweGVmLDB4NWEsMHhiOCwweDljLDB4MDMsMHhjZCwweDM5LDB4YzYsMHgwNiwweDk1LDB4MzYsMHgwMCwweDhjLDB4YzAsMHg0OCwweDhlCissMHhjMCwweGZhLDB4ZTgsMHhhOSwweDBmLDB4ZmIsMHhjMywweDFlLDB4MDYsMHgxZiwweDA2LDB4MzMsMHhjMCwweDhlLDB4YzAsMHg4YgorLDB4ZjAsMHg4ZCwweDNlLDB4MjAsMHhmMywweDUxLDB4YjEsMHgwYSwweDI2LDB4ODMsMHg3ZCwweDBjLDB4MDEsMHg3NSwweDJhLDB4NTcKKywweDI2LDB4ODMsMHg3ZCwweDBlLDB4MDAsMHg3NCwweDA2LDB4ZTgsMHgyZiwweDAwLDB4ZTksMHgwMywweDAwLDB4ZTgsMHg2NiwweDA3CissMHg1ZiwweDczLDB4MTYsMHgzMywweGMwLDB4OGUsMHhkOCwweDI2LDB4OGIsMHg0ZCwweDEyLDB4OGQsMHg3NSwweDIwLDB4OGQsMHgzZQorLDB4ZTAsMHhmZSwweGYzLDB4YTQsMHg1OSwweDA3LDB4MWYsMHhmOSwweGMzLDB4ZmUsMHhjOSwweDc0LDB4MDcsMHg4MSwweGM3LDB4MjAKKywweDAxLDB4ZTksMHhjNCwweGZmLDB4NTksMHgwNywweDFmLDB4ZjgsMHhjMywweDUxLDB4NTAsMHg1MywweDU2LDB4NTIsMHg1NywweDMzCissMHhkYiwweDI2LDB4OGEsMHg1ZCwweDBlLDB4MjYsMHg4YiwweDRkLDB4MTIsMHg4ZCwweDdkLDB4MjAsMHg1YSwweDg3LDB4ZDcsMHgyNgorLDB4OGEsMHg0NSwweDE0LDB4ODcsMHhkNywweDQyLDB4MzIsMHhmZiwweDgwLDB4ZmYsMHgwOCwweDc1LDB4MDgsMHhmZSwweGNiLDB4MjIKKywweGRiLDB4NzUsMHhlYSwweDMzLDB4ZGIsMHgyMywweGRiLDB4NzQsMHgwNiwweGZlLDB4YzcsMHhkMCwweGM4LDB4NzMsMHgwYywweDUwCissMHgyNiwweDhhLDB4MDUsMHgzOCwweDA0LDB4NTgsMHg3NCwweDAzLDB4ZTksMHgwYSwweDAwLDB4NDksMHg0NiwweDQ3LDB4MjMsMHhjOQorLDB4NzQsMHgwYSwweGU5LDB4ZDMsMHhmZiwweDVhLDB4NWUsMHg1YiwweDU4LDB4NTksMHhmOCwweGMzLDB4NWEsMHg1ZSwweDViLDB4NTgKKywweDU5LDB4ZjksMHhjMywweDFlLDB4MDYsMHgxZiwweDA2LDB4MzMsMHhjMCwweDhlLDB4YzAsMHg4NiwweGNkLDB4MmIsMHhjZSwweDhiCissMHhmNywweDhiLDB4YzEsMHgzMywweGM5LDB4ODAsMHgzYywweGZmLDB4NzQsMHgxNiwweDgwLDB4ZjksMHgwNiwweDczLDB4MDksMHgzMgorLDB4YzksMHg0NiwweDQ4LDB4NzQsMHgyZSwweGU5LDB4ZWQsMHhmZiwweDNkLDB4NjAsMHgwMCwweDczLDB4MGMsMHhlOSwweDIzLDB4MDAKKywweGZlLDB4YzEsMHg0NiwweDQ4LDB4NzQsMHgxZCwweGU5LDB4ZGMsMHhmZiwweGI4LDB4MTAsMHgwMCwweDhkLDB4M2UsMHgxOCwweDM0CissMHgzMiwweGVkLDB4YjEsMHgwNiwweGYzLDB4YTYsMHg3NCwweDAzLDB4ZTksMHgwOCwweDAwLDB4NDgsMHgyMywweGMwLDB4NzQsMHgwNworLDB4ZTksMHhlOSwweGZmLDB4MDcsMHgxZiwweGY4LDB4YzMsMHg4ZCwweDM2LDB4MTgsMHgzNCwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4OGQKKywweDNlLDB4ZTAsMHhmZSwweGI4LDB4MTAsMHgwMCwweGI5LDB4MDYsMHgwMCwweDU2LDB4ZjMsMHhhNCwweDVlLDB4NDgsMHgzZCwweDAwCissMHgwMCwweDc1LDB4ZjMsMHgwNywweDFmLDB4ZjksMHhjMywweGZmLDB4MDYsMHhlNCwweDMzLDB4YzYsMHgwNiwweGViLDB4MzQsMHgwMAorLDB4MjYsMHg4YiwweDQ1LDB4MDYsMHg4NiwweGUwLDB4YzEsMHhlOCwweDA0LDB4NDgsMHgwNiwweDhlLDB4YzAsMHhmZSwweDA2LDB4ZTYKKywweDNhLDB4ZmEsMHhlOCwweDY5LDB4MGUsMHhmYiwweDA3LDB4YjAsMHhmZiwweGMzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHhiMCwweDAxLDB4YzMsMHhiMCwweDAwLDB4YzMsMHhmNiwweDA2LDB4OTMsMHgzNiwweDIwLDB4NzUsMHgwMywweGIwLDB4MDQsMHhjMworLDB4OGIsMHgwZSwweDk3LDB4MzYsMHg4MSwweGUxLDB4ODAsMHgzMCwweDI2LDB4OGIsMHg0NywweDA0LDB4MjUsMHg3ZiwweGNmLDB4MGIKKywweGMxLDB4YTMsMHg5NywweDM2LDB4YTMsMHhlNiwweDM0LDB4YjAsMHgwMCwweGMzLDB4ZjYsMHgwNiwweDkzLDB4MzYsMHgyMCwweDc0CissMHgwMywweGIwLDB4MDMsMHhjMywweDI2LDB4OGIsMHg0NywweDA4LDB4YTMsMHg5NywweDM2LDB4YTMsMHhlNiwweDM0LDB4MjYsMHg4YQorLDB4NDcsMHgyMCwweGEyLDB4ZmQsMHgzNCwweDNjLDB4MDEsMHg3NSwweDA2LDB4YzcsMHgwNiwweGExLDB4MzYsMHgwMCwweDAwLDB4MjYKKywweDhhLDB4NDcsMHgyMSwweGEyLDB4ZmUsMHgzNCwweDI2LDB4OGIsMHg0NywweDBhLDB4YTMsMHgxOCwweDM0LDB4YTMsMHg1OCwweDM0CissMHgyNiwweDhiLDB4NDcsMHgwYywweGEzLDB4MWEsMHgzNCwweGEzLDB4NWEsMHgzNCwweDI2LDB4OGIsMHg0NywweDBlLDB4YTMsMHgxYworLDB4MzQsMHhhMywweDVjLDB4MzQsMHhjNiwweDA2LDB4MmEsMHgzNCwweGMwLDB4MjYsMHg4YiwweDQ3LDB4MTQsMHgyNSwweDdmLDB4ZmYKKywweDA5LDB4MDYsMHgyYywweDM0LDB4MjYsMHg4YiwweDQ3LDB4MTYsMHgyNSwweGZmLDB4ZmUsMHgyNSwweGZmLDB4ZmMsMHgwOSwweDA2CissMHgyZSwweDM0LDB4YzYsMHgwNiwweDAwLDB4MzQsMHhjMCwweDI2LDB4OGIsMHg0NywweDEwLDB4YTMsMHgwMiwweDM0LDB4MjYsMHg4YgorLDB4NDcsMHgxMiwweGEzLDB4MDQsMHgzNCwweDA2LDB4NTMsMHhlOCwweDg0LDB4MGEsMHg1YiwweDA3LDB4M2QsMHgwMCwweDAwLDB4NzUKKywweDA3LDB4ODAsMHgwZSwweDkyLDB4MzYsMHgwOCwweGIwLDB4ZmUsMHhjMywweGI5LDB4MDAsMHgwMSwweGExLDB4YWMsMHgzMywweDMzCissMHhkMiwweGY3LDB4ZjksMHhhMywweGFlLDB4MzMsMHg5MSwweDQ5LDB4MzMsMHhkMiwweGY3LDB4ZTksMHgwNSwweDAwLDB4M2IsMHhhMworLDB4NDYsMHgzNCwweGJmLDB4MDAsMHgzYiwweDg5LDB4M2UsMHg0NCwweDM0LDB4YmEsMHg2OCwweDAwLDB4YjgsMHhlMCwweGUwLDB4ZWYKKywweGExLDB4YWUsMHgzMywweGU3LDB4NjIsMHhhMSwweGFlLDB4MzMsMHhiYSwweDA4LDB4MDEsMHhlZiwweGExLDB4NDQsMHgzNCwweGU3CissMHg2NCwweGExLDB4NDQsMHgzNCwweGJhLDB4MGEsMHgwMSwweGVmLDB4YjgsMHgwMCwweDAxLDB4MmQsMHgwNCwweDAwLDB4MGQsMHgwMAorLDB4MTAsMHhlNywweDkyLDB4YzMsMHgzZCwweDAwLDB4MDAsMHg3NCwweDBhLDB4MjYsMHg4OSwweDQ3LDB4MDcsMHhlOCwweDgzLDB4M2EKKywweGIwLDB4MDcsMHhjMywweGExLDB4YWUsMHgzMywweDI2LDB4ODksMHg0NywweDJiLDB4YTEsMHg0NCwweDM0LDB4MjYsMHg4OSwweDQ3CissMHgyZCwweGExLDB4NDYsMHgzNCwweDI2LDB4ODksMHg0NywweDJmLDB4ODAsMHgwZSwweDkzLDB4MzYsMHgyMCwweGExLDB4ODgsMHgzNgorLDB4ODYsMHhlMCwweDI2LDB4ODksMHg0NywweDA4LDB4YTEsMHg4NCwweDM2LDB4ODYsMHhlMCwweDI2LDB4ODksMHg0NywweDBhLDB4YTEKKywweDgwLDB4MzYsMHg4NiwweGUwLDB4MjYsMHg4OSwweDQ3LDB4MGMsMHhiOCwweDYwLDB4ZmUsMHg4NiwweGUwLDB4MjYsMHg4OSwweDQ3CissMHgwZSwweGEwLDB4YTEsMHgzNiwweDI2LDB4ODgsMHg0NywweDEwLDB4OGIsMHgzNiwweDg4LDB4MzYsMHgyNiwweGM2LDB4NDQsMHgwMgorLDB4ZmYsMHhlNSwweDllLDB4YTksMHgwMCwweDA4LDB4NzQsMHgwYywweGJhLDB4ODQsMHgwMCwweGVkLDB4MGQsMHgwOCwweDAwLDB4ZWYKKywweGJhLDB4OGUsMHgwMCwweGVmLDB4ZTUsMHgwMiwweDI1LDB4ZjksMHhmZiwweGU3LDB4MDIsMHhiYSwweDEwLDB4MDEsMHhiOCwweDAyCissMHgwMiwweGVmLDB4ZWQsMHhiMCwweDAwLDB4YzMsMHhmNiwweDA2LDB4OTMsMHgzNiwweDIwLDB4NzUsMHgwMywweGIwLDB4MDEsMHhjMworLDB4ODAsMHgyNiwweDkzLDB4MzYsMHg5ZiwweGU4LDB4OGQsMHgwYSwweDgwLDB4MGUsMHg5MiwweDM2LDB4MDgsMHhiMCwweGZlLDB4YzMKKywweGIwLDB4MDAsMHhjMywweGY2LDB4MDYsMHg5MywweDM2LDB4MjAsMHg3NSwweDAzLDB4YjAsMHgwNCwweGMzLDB4YzYsMHgwNiwweDJhCissMHgzNCwweGMwLDB4MjYsMHg4YiwweDQ3LDB4MDYsMHgyNSwweDdmLDB4ZmYsMHhhMywweDJjLDB4MzQsMHgyNiwweDhiLDB4NDcsMHgwOAorLDB4MjUsMHhmZiwweGZlLDB4MjUsMHhmZiwweGZjLDB4YTMsMHgyZSwweDM0LDB4Y2QsMHg1MiwweGIwLDB4MDAsMHhjMywweGY2LDB4MDYKKywweDkzLDB4MzYsMHgyMCwweDc1LDB4MDMsMHhiMCwweDA0LDB4YzMsMHhjNiwweDA2LDB4MDAsMHgzNCwweGMwLDB4MjYsMHg4YiwweDQ3CissMHgwNiwweGEzLDB4MDIsMHgzNCwweDI2LDB4OGIsMHg0NywweDA4LDB4YTMsMHgwNCwweDM0LDB4Y2QsMHg1MiwweGIwLDB4MDAsMHhjMworLDB4ZjYsMHgwNiwweDkzLDB4MzYsMHgyMCwweDc1LDB4MDMsMHhiMCwweDA0LDB4YzMsMHg1NywweDhkLDB4N2YsMHgwNiwweDUxLDB4YjkKKywweDA3LDB4MDAsMHgzMywweGMwLDB4ZjMsMHhhYiwweDU5LDB4OGQsMHg3ZiwweDA2LDB4YTEsMHg3YSwweDM0LDB4MDMsMHgwNiwweDM5CissMHgzNywweDI2LDB4ODgsMHgwNSwweGExLDB4OTUsMHgzNywweDI2LDB4ODgsMHg0NSwweDAyLDB4YTEsMHg4MCwweDM0LDB4MDMsMHgwNgorLDB4NzYsMHgzNCwweDI2LDB4ODgsMHg0NSwweDA3LDB4YTEsMHhjNiwweDM0LDB4MjYsMHg4OCwweDQ1LDB4MDksMHhhMSwweGQ4LDB4MzMKKywweDI2LDB4ODgsMHg0NSwweDBhLDB4MzMsMHhjMCwweGEzLDB4N2EsMHgzNCwweGEzLDB4MzksMHgzNywweGEzLDB4OTUsMHgzNywweGEzCissMHg4MCwweDM0LDB4YTMsMHg3NiwweDM0LDB4YTMsMHhjNiwweDM0LDB4YTMsMHhkOCwweDMzLDB4NWYsMHhiMCwweDAwLDB4YzMsMHhmNgorLDB4MDYsMHg5MywweDM2LDB4MjAsMHg3NSwweDAzLDB4YjAsMHgwNCwweGMzLDB4MjYsMHg4YiwweDRmLDB4MDQsMHg4MywweGY5LDB4MDYKKywweDc0LDB4MTIsMHg4MywweGY5LDB4MDQsMHg3NCwweDBkLDB4ODMsMHhmOSwweDAwLDB4NzQsMHgwOCwweDgzLDB4ZjksMHgwMiwweDc0CissMHgwMywweGIwLDB4MDEsMHhjMywweDg5LDB4MGUsMHhlOCwweDNhLDB4ODMsMHgyNiwweGFiLDB4MzYsMHhmOSwweDA5LDB4MGUsMHhhYgorLDB4MzYsMHhlNSwweDAyLDB4MjUsMHhmOSwweGZmLDB4MGIsMHhjMSwweGU3LDB4MDIsMHhiMCwweDAwLDB4YzMsMHhmNiwweDA2LDB4OTMKKywweDM2LDB4MjAsMHg3NSwweDAzLDB4YjAsMHgwNCwweGMzLDB4MjYsMHg4YiwweDRmLDB4MDQsMHg4MCwweGY5LDB4ZmYsMHg3NCwweDA4CissMHg4MCwweGY5LDB4MDAsMHg3NCwweDEwLDB4YjAsMHgwMSwweGMzLDB4ODMsMHgwZSwweGFkLDB4MzYsMHgwMiwweGExLDB4YWQsMHgzNgorLDB4ZTcsMHgwNCwweGU5LDB4MGEsMHgwMCwweDgzLDB4MjYsMHhhZCwweDM2LDB4ZmQsMHhhMSwweGFkLDB4MzYsMHhlNywweDA0LDB4YjAKKywweDAwLDB4YzMsMHhmNiwweDA2LDB4OTMsMHgzNiwweDIwLDB4NzUsMHgwMywweGIwLDB4MDQsMHhjMywweGU4LDB4ZDUsMHgwNCwweGIwCissMHgwMCwweGMzLDB4ZjYsMHgwNiwweDkzLDB4MzYsMHg4MCwweDc1LDB4MDMsMHhiMCwweDAxLDB4YzMsMHgyNiwweDgzLDB4N2YsMHgwNgorLDB4MDUsMHg3NSwweDAzLDB4ZTksMHg5ZCwweDAwLDB4MjYsMHg4YiwweDU3LDB4MDQsMHgyNiwweDhiLDB4NDcsMHgwOCwweDI2LDB4ODEKKywweDdmLDB4MDYsMHgwMCwweDgwLDB4NzUsMHgwOCwweGVkLDB4MjYsMHg4OSwweDQ3LDB4MGEsMHhlOSwweDlkLDB4MDAsMHgyNiwweDgzCissMHg3ZiwweDA2LDB4MDEsMHg3NSwweDA0LDB4ZWYsMHhlOSwweDkyLDB4MDAsMHgyNiwweDgxLDB4N2YsMHgwNiwweDAxLDB4ODAsMHg3NQorLDB4MDksMHhlZiwweGVkLDB4MjYsMHg4OSwweDQ3LDB4MGEsMHhlOSwweDgxLDB4MDAsMHgyNiwweDgzLDB4N2YsMHgwNiwweDAyLDB4NzUKKywweDA3LDB4MjYsMHgyMSwweDQ3LDB4MDQsMHhlOSwweDczLDB4MDAsMHgyNiwweDgxLDB4N2YsMHgwNiwweDAyLDB4ODAsMHg3NSwweDBjCissMHgyNiwweDIxLDB4NDcsMHgwNCwweGVkLDB4MjYsMHg4OSwweDQ3LDB4MGEsMHhlOSwweDVmLDB4MDAsMHgyNiwweDgzLDB4N2YsMHgwNgorLDB4MDMsMHg3NSwweDA3LDB4MjYsMHgwOSwweDQ3LDB4MDQsMHhlOSwweDUxLDB4MDAsMHgyNiwweDgxLDB4N2YsMHgwNiwweDAzLDB4ODAKKywweDc1LDB4MGMsMHgyNiwweDA5LDB4NDcsMHgwNCwweGVkLDB4MjYsMHg4OSwweDQ3LDB4MGEsMHhlOSwweDNkLDB4MDAsMHgyNiwweDgzCissMHg3ZiwweDA2LDB4MDQsMHg3NSwweDA3LDB4MjYsMHgzMSwweDQ3LDB4MDQsMHhlOSwweDJmLDB4MDAsMHgyNiwweDgxLDB4N2YsMHgwNgorLDB4MDQsMHg4MCwweDc1LDB4MGMsMHgyNiwweDMxLDB4NDcsMHgwNCwweGVkLDB4MjYsMHg4OSwweDQ3LDB4MGEsMHhlOSwweDFiLDB4MDAKKywweGIwLDB4MDEsMHhjMywweGZhLDB4NTMsMHgyNiwweDhiLDB4NGYsMHgwOCwweDBiLDB4YzksMHg3NCwweDBjLDB4OGQsMHgxZSwweGUwCissMHhmZSwweGU4LDB4NTIsMHhmZiwweDgzLDB4YzMsMHgwOCwweGUyLDB4ZjgsMHg1YiwweGZiLDB4YjAsMHgwMCwweGMzLDB4ZjYsMHgwNgorLDB4OTMsMHgzNiwweDgwLDB4NzUsMHgwYSwweGY2LDB4MDYsMHg5MywweDM2LDB4MjAsMHg3NSwweDAzLDB4YjAsMHgwMSwweGMzLDB4OGQKKywweDNlLDB4ZTAsMHhmZSwweGU1LDB4MDAsMHgyNiwweDg5LDB4MDUsMHhlNSwweDAyLDB4MjYsMHg4OSwweDQ1LDB4MDIsMHhhMSwweGFkCissMHgzNiwweDI2LDB4ODksMHg0NSwweDA0LDB4ZTUsMHgwNiwweDI2LDB4ODksMHg0NSwweDA2LDB4ZTUsMHgwOCwweDI2LDB4ODksMHg0NQorLDB4MDgsMHhlNSwweDBhLDB4MjYsMHg4OSwweDQ1LDB4MGEsMHhlNSwweDBlLDB4MjYsMHg4OSwweDQ1LDB4MGMsMHhlNSwweDQ4LDB4MjYKKywweDg5LDB4NDUsMHgwZSwweGU1LDB4NGEsMHgyNiwweDg5LDB4NDUsMHgxMCwweGU1LDB4NGMsMHgyNiwweDg5LDB4NDUsMHgxMiwweGExCissMHhiNywweDM2LDB4MjYsMHg4OSwweDQ1LDB4MTQsMHhlNSwweDUwLDB4MjYsMHg4OSwweDQ1LDB4MTYsMHhlNSwweDUyLDB4MjYsMHg4OQorLDB4NDUsMHgxOCwweGU1LDB4NTQsMHgyNiwweDg5LDB4NDUsMHgxYSwweGU1LDB4NTYsMHgyNiwweDg5LDB4NDUsMHgxYywweGU1LDB4NTgKKywweDI2LDB4ODksMHg0NSwweDFlLDB4ZTUsMHg2MiwweDI2LDB4ODksMHg0NSwweDIwLDB4ZTUsMHg2NCwweDI2LDB4ODksMHg0NSwweDIyCissMHhlNSwweDY2LDB4MjYsMHg4OSwweDQ1LDB4MjQsMHhlNSwweDY4LDB4MjYsMHg4OSwweDQ1LDB4MjYsMHhlNSwweDZhLDB4MjYsMHg4OQorLDB4NDUsMHgyOCwweGU1LDB4NmMsMHgyNiwweDg5LDB4NDUsMHgyYSwweGU1LDB4NzAsMHgyNiwweDg5LDB4NDUsMHgyYywweGU1LDB4NzIKKywweDI2LDB4ODksMHg0NSwweDJlLDB4ZTUsMHg3NCwweDI2LDB4ODksMHg0NSwweDMwLDB4ZTUsMHg3NiwweDI2LDB4ODksMHg0NSwweDMyCissMHhlNSwweDdjLDB4MjYsMHg4OSwweDQ1LDB4MzQsMHhlNSwweDdlLDB4MjYsMHg4OSwweDQ1LDB4MzYsMHhlNSwweDgwLDB4MjYsMHg4OQorLDB4NDUsMHgzOCwweGU1LDB4ODIsMHgyNiwweDg5LDB4NDUsMHgzYSwweGU1LDB4ODYsMHgyNiwweDg5LDB4NDUsMHgzYywweGU1LDB4ODgKKywweDI2LDB4ODksMHg0NSwweDNlLDB4ZTUsMHg5YSwweDI2LDB4ODksMHg0NSwweDQwLDB4ZTUsMHg5ZSwweDI2LDB4ODksMHg0NSwweDQyCissMHhlNSwweGNjLDB4MjYsMHg4OSwweDQ1LDB4NDQsMHhlNSwweGNlLDB4MjYsMHg4OSwweDQ1LDB4NDYsMHhlNSwweGQwLDB4MjYsMHg4OQorLDB4NDUsMHg0OCwweGU1LDB4ZDIsMHgyNiwweDg5LDB4NDUsMHg0YSwweGJhLDB4MDAsMHgwMSwweGVkLDB4MTEsMHgwNiwweDY2LDB4MzQKKywweDczLDB4MDQsMHhmZiwweDA2LDB4NjgsMHgzNCwweDI2LDB4ODksMHg0NSwweDRjLDB4YmEsMHgwMiwweDAxLDB4ZWQsMHhjMSwweGUwCissMHgwMiwweDExLDB4MDYsMHg2ZSwweDM0LDB4NzMsMHgwNCwweGZmLDB4MDYsMHg3MCwweDM0LDB4MjYsMHg4OSwweDQ1LDB4NGUsMHhiYQorLDB4MDQsMHgwMSwweGVkLDB4MTEsMHgwNiwweDZhLDB4MzQsMHg3MywweDA0LDB4ZmYsMHgwNiwweDZjLDB4MzQsMHgyNiwweDg5LDB4NDUKKywweDUwLDB4YmEsMHgwNiwweDAxLDB4ZWQsMHhjMSwweGUwLDB4MDIsMHgxMSwweDA2LDB4NzIsMHgzNCwweDczLDB4MDQsMHhmZiwweDA2CissMHg3NCwweDM0LDB4MjYsMHg4OSwweDQ1LDB4NTIsMHhiYSwweDA4LDB4MDEsMHhlZCwweDI2LDB4ODksMHg0NSwweDU0LDB4YmEsMHgwYQorLDB4MDEsMHhlZCwweDI2LDB4ODksMHg0NSwweDU2LDB4YmEsMHgwYywweDAxLDB4ZWQsMHgyNiwweDg5LDB4NDUsMHg1OCwweGJhLDB4MGUKKywweDAxLDB4ZWQsMHgwMSwweDA2LDB4N2EsMHgzNCwweDI2LDB4ODksMHg0NSwweDVlLDB4YmEsMHgxMCwweDAxLDB4ZWQsMHgyNiwweDg5CissMHg0NSwweDVjLDB4YjAsMHgwMCwweGMzLDB4ZjYsMHgwNiwweDkzLDB4MzYsMHg4MCwweDc0LDB4MDcsMHhmNiwweDA2LDB4OTMsMHgzNgorLDB4MjAsMHg3NSwweDAzLDB4YjAsMHgwMSwweGMzLDB4MjYsMHg4MCwweDdmLDB4MDYsMHgwMCwweDc1LDB4MzAsMHg4MCwweDNlLDB4OTUKKywweDM2LDB4MDAsMHg3NCwweDUyLDB4YzYsMHgwNiwweDk1LDB4MzYsMHgwMCwweDgzLDB4MjYsMHhhZCwweDM2LDB4ZmUsMHhhMSwweGFkCissMHgzNiwweGU3LDB4MDQsMHhiYSwweDEwLDB4MDEsMHhiOCwweDgwLDB4ODAsMHhlZiwweGVkLDB4YmEsMHgxMCwweDAxLDB4YjgsMHgwMgorLDB4MDIsMHhlZiwweGVkLDB4YmEsMHhlMCwweDAwLDB4YjgsMHgwMCwweDEwLDB4ZWYsMHhiMCwweDAwLDB4YzMsMHgyNiwweDhiLDB4NDcKKywweDA0LDB4M2QsMHgwMCwweDAwLDB4NzQsMHgyMCwweDNkLDB4MDMsMHgwMCwweDc3LDB4MWIsMHhiYSwweDEwLDB4MDEsMHhiOCwweDAyCissMHgwMCwweGVmLDB4YmEsMHhlMCwweDAwLDB4YjgsMHgwMSwweDEwLDB4ZWYsMHg4MywweDBlLDB4YWQsMHgzNiwweDAxLDB4YTEsMHhhZAorLDB4MzYsMHhlNywweDA0LDB4YjAsMHgwMCwweGMzLDB4YjAsMHgwNiwweGMzLDB4ZjYsMHgwNiwweDkzLDB4MzYsMHg4MCwweDc1LDB4MDMKKywweGIwLDB4MDEsMHhjMywweDI2LDB4ODMsMHg3ZiwweDA0LDB4MDEsMHg3NCwweDBhLDB4MjYsMHg4MywweDdmLDB4MDQsMHgwMiwweDc0CissMHgxOSwweGIwLDB4MDYsMHhjMywweDI2LDB4ODMsMHg3ZiwweDA2LDB4MGMsMHg3NywweGY2LDB4MjYsMHg4MywweDdmLDB4MGEsMHg2MAorLDB4NzcsMHhlZiwweGU4LDB4MTAsMHgwMCwweDcyLDB4MGIsMHhiMCwweDQ2LDB4YzMsMHhlOCwweDRlLDB4MDAsMHg3MiwweDAzLDB4YjAKKywweDQ2LDB4YzMsMHhiMCwweDAwLDB4YzMsMHg1MSwweGIxLDB4MGEsMHg4YiwweDNlLDB4MjAsMHhmMywweDI2LDB4ODMsMHg3ZCwweDBjCissMHgwMiwweDc1LDB4MDMsMHhlOSwweDBlLDB4MDAsMHhmZSwweGM5LDB4NzQsMHgwNywweDgxLDB4YzcsMHgyMCwweDAxLDB4ZTksMHhlYgorLDB4ZmYsMHg1OSwweGY4LDB4YzMsMHg1NywweDhkLDB4N2QsMHgwZSwweDhkLDB4NzcsMHgwNiwweGI5LDB4MTIsMHgwMCwweGYzLDB4YTQKKywweDhkLDB4N2QsMHgyMCwweDhkLDB4MzYsMHhlMCwweGZlLDB4MjYsMHg4YiwweDRkLDB4MTIsMHhmMywweGE0LDB4ZmYsMHgwNiwweDAxCissMHgzNSwweDVmLDB4MjYsMHhjNywweDQ1LDB4MGMsMHgwMSwweDAwLDB4NTksMHhmOSwweGMzLDB4NTEsMHhiMSwweDBhLDB4OGQsMHgzZQorLDB4MjAsMHhmMywweDhkLDB4MzYsMHhlMCwweGZlLDB4MjYsMHg4MywweDdkLDB4MGMsMHgwMSwweDc1LDB4MWIsMHg1NywweGU4LDB4MjUKKywweDAwLDB4NWYsMHg3MywweDE0LDB4MzMsMHhjMCwweGI5LDB4MjAsMHgwMSwweGYzLDB4YWEsMHgyNiwweGM3LDB4NDUsMHgwYywweDAyCissMHgwMCwweGZmLDB4MGUsMHgwMSwweDM1LDB4NTksMHhmOSwweGMzLDB4ZmUsMHhjOSwweDc0LDB4MDcsMHg4MSwweGM3LDB4MjAsMHgwMQorLDB4ZTksMHhkMywweGZmLDB4NTksMHhmOCwweGMzLDB4NTEsMHgyNiwweDhiLDB4NGQsMHgxMiwweDhkLDB4N2QsMHgyMCwweGYzLDB4YTYKKywweDc0LDB4MDMsMHg1OSwweGY4LDB4YzMsMHg1OSwweGY5LDB4YzMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHg4MCwweDNlLDB4ZWMsMHgzNCwweDA2LDB4NzIsMHgzMywweGZmLDB4MDYsMHhmMCwweDMzLDB4NTAsMHhjNCwweDFlLDB4OGMsMHgzNgorLDB4YjksMHgwZiwweDAwLDB4MzMsMHhjMCwweGU4LDB4MjksMHgwMCwweDU4LDB4ODEsMHgyNiwweGMyLDB4MzQsMHhkZiwweDdmLDB4ODEKKywweDI2LDB4ZTksMHgzNCwweGRmLDB4N2YsMHgwYiwweGRiLDB4NzQsMHgxMSwweDI2LDB4YzYsMHgwNywweDg0LDB4MjYsMHhjNiwweDQ3CissMHgwMiwweGZmLDB4MjYsMHg4OSwweDQ3LDB4MDYsMHhlOCwweGFjLDB4MDAsMHhjMywweGZmLDB4MDYsMHhlYSwweDMzLDB4ZTksMHhmNQorLDB4ZmYsMHg1NywweDI2LDB4OGIsMHgzZiwweDAzLDB4ZjksMHgyNiwweDNiLDB4N2YsMHgwMiwweDc0LDB4MTYsMHgyNiwweDNiLDB4N2YKKywweDA0LDB4N2MsMHgyYSwweDNkLDB4MDAsMHgwMCwweDc1LDB4MTMsMHg4ZCwweDdmLDB4MDgsMHgwMywweGY5LDB4MjYsMHgzYiwweDdmCissMHgwMiwweDdjLDB4MTQsMHhmZiwweDA2LDB4ZGUsMHgzMywweDMzLDB4ZGIsMHg1ZiwweGMzLDB4MjYsMHg4YiwweDdmLDB4MDIsMHgyNgorLDB4ODksMHgzZiwweDAzLDB4ZjksMHhlOSwweDA2LDB4MDAsMHgyNiwweDg5LDB4M2YsMHgyNiwweDI5LDB4MGYsMHgyNiwweGM3LDB4MDUKKywweGZmLDB4ZmYsMHgyNiwweDg3LDB4M2YsMHgyNiwweDg5LDB4MGQsMHg4ZCwweDVkLDB4MDIsMHg1MCwweDhiLDB4ZmIsMHg4MywweGU5CissMHgwMiwweDMzLDB4YzAsMHhmMywweGFhLDB4NTgsMHhmZSwweDBlLDB4ZWMsMHgzNCwweDVmLDB4YzMsMHg4YiwweDdjLDB4MDIsMHgzYgorLDB4M2MsMHg3NCwweDJmLDB4ODMsMHgzZCwweGZmLDB4NzUsMHgwYiwweDhkLDB4N2MsMHgwOCwweDg5LDB4N2MsMHgwMiwweDgzLDB4M2QKKywweGZmLDB4NzQsMHgxZSwweDhhLDB4NDUsMHgwMiwweDNjLDB4ODEsMHg3NSwweDBjLDB4ODAsMHgzZSwweGViLDB4MzQsMHgwMCwweDc0CissMHgwNSwweDMzLDB4YzAsMHhlOSwweDBiLDB4MDAsMHg4YiwweDBkLDB4MDEsMHg0YywweDAyLDB4OGQsMHg3NSwweDAyLDB4ODMsMHhlOQorLDB4MDIsMHhjMywweDgwLDB4M2UsMHhlYywweDM0LDB4MDYsMHg3MiwweDA1LDB4MzMsMHhjMCwweGU5LDB4ZjMsMHhmZiwweGZmLDB4MDYKKywweGVlLDB4MzMsMHhlOSwweGJlLDB4ZmYsMHhmNiwweDA2LDB4OTIsMHgzNiwweDQwLDB4NzQsMHgwMSwweGMzLDB4NTcsMHg1NiwweDUxCissMHg1MiwweDhiLDB4MzYsMHg4YywweDM2LDB4ZTgsMHhhNCwweGZmLDB4NzUsMHgwMywweGU5LDB4MWEsMHgwMCwweGU5LDB4MWMsMHgwMAorLDB4ZmUsMHgwNiwweGVjLDB4MzQsMHhjNCwweDNlLDB4ODAsMHgzNiwweGYzLDB4YTQsMHg4MCwweDBlLDB4OTIsMHgzNiwweDQwLDB4YmEKKywweDBjLDB4MDEsMHhiOCwweDgwLDB4ODAsMHhlZiwweGVkLDB4NWEsMHg1OSwweDVlLDB4NWYsMHhjMywweGZmLDB4MDYsMHhlMCwweDMzCissMHg4MCwweDNjLDB4ODEsMHg3NSwweDBjLDB4ZmYsMHgwNiwweGUyLDB4MzMsMHhjNiwweDA2LDB4ZWIsMHgzNCwweDAxLDB4ZTksMHhjZgorLDB4ZmYsMHg4MCwweDNjLDB4ODQsMHg3NSwweDA3LDB4ZmYsMHgwNiwweGU2LDB4MzMsMHhlOSwweGMzLDB4ZmYsMHhmZiwweDA2LDB4ZTgKKywweDMzLDB4ZTksMHhiYywweGZmLDB4OGQsMHgzZSwweGUwLDB4ZmUsMHhhMSwweDcyLDB4MzQsMHhjNywweDA2LDB4NzIsMHgzNCwweDAwCissMHgwMCwweDg5LDB4MDUsMHhhMSwweDc0LDB4MzQsMHhjNywweDA2LDB4NzQsMHgzNCwweDAwLDB4MDAsMHg4OSwweDQ1LDB4MDIsMHhiYQorLDB4MDQsMHgwMSwweGVkLDB4ODksMHg0NSwweDA0LDB4YzcsMHg0NSwweDA2LDB4MDAsMHgwMCwweGExLDB4NmUsMHgzNCwweGM3LDB4MDYKKywweDZlLDB4MzQsMHgwMCwweDAwLDB4ODksMHg0NSwweDA4LDB4YTEsMHg3MCwweDM0LDB4YzcsMHgwNiwweDcwLDB4MzQsMHgwMCwweDAwCissMHg4OSwweDQ1LDB4MGEsMHhiYSwweDAwLDB4MDEsMHhlZCwweDg5LDB4NDUsMHgwYywweGM3LDB4NDUsMHgwZSwweDAwLDB4MDAsMHgzMgorLDB4ZTQsMHhiYSwweDBlLDB4MDEsMHhlYywweDg5LDB4NDUsMHgxMCwweGExLDB4N2UsMHgzNCwweGM3LDB4MDYsMHg3ZSwweDM0LDB4MDAKKywweDAwLDB4ODksMHg0NSwweDEyLDB4YTEsMHg4YywweDM0LDB4YzcsMHgwNiwweDhjLDB4MzQsMHgwMCwweDAwLDB4ODksMHg0NSwweDE0CissMHhhMSwweDhhLDB4MzQsMHhjNywweDA2LDB4OGEsMHgzNCwweDAwLDB4MDAsMHg4OSwweDQ1LDB4MTYsMHhhMSwweDdjLDB4MzQsMHhjNworLDB4MDYsMHg3YywweDM0LDB4MDAsMHgwMCwweDg5LDB4NDUsMHgxOCwweGExLDB4ODgsMHgzNCwweGM3LDB4MDYsMHg4OCwweDM0LDB4MDAKKywweDAwLDB4ODksMHg0NSwweDFhLDB4YTEsMHhjYSwweDMzLDB4YzcsMHgwNiwweGNhLDB4MzMsMHgwMCwweDAwLDB4ODksMHg0NSwweDFjCissMHhhMSwweDc4LDB4MzQsMHhjNywweDA2LDB4NzgsMHgzNCwweDAwLDB4MDAsMHg4OSwweDQ1LDB4MWUsMHhhMSwweGM2LDB4MzQsMHhjNworLDB4MDYsMHhjNiwweDM0LDB4MDAsMHgwMCwweDg5LDB4NDUsMHgyMCwweGMzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweGZhLDB4MzMsMHhjMCwweDhlLDB4ZDgsMHg4ZSwweGMwLDB4YjgsMHhhMCwweDAxLDB4YzEsMHhlOCwweDA0LDB4OGUsMHhkMCwweDhkCissMHgyNiwweDgwLDB4MDAsMHhlOCwweDAwLDB4MDEsMHhlOCwweDEwLDB4ZWIsMHg4YiwweDFlLDB4ZjcsMHgzNCwweDhiLDB4MTYsMHhmOQorLDB4MzQsMHg4YiwweDM2LDB4ZmYsMHgzNCwweDMzLDB4YzAsMHhiOSwweGVmLDB4ZmYsMHg4ZCwweDNlLDB4MTQsMHgwMCwweDJiLDB4Y2YKKywweDJiLDB4Y2UsMHhkMSwweGU5LDB4ZjMsMHhhYiwweDg5LDB4MWUsMHhmNywweDM0LDB4ODksMHgxNiwweGY5LDB4MzQsMHg4MywweGZlCissMHgwMCwweDc0LDB4MGMsMHhiOSwweGVmLDB4ZmYsMHhiZiwweDgwLDB4ZmUsMHgyYiwweGNmLDB4ZDEsMHhlOSwweGYzLDB4YWIsMHhiOQorLDB4ZmYsMHhmZiwweDgxLDB4ZTksMHgwMCwweDNiLDB4ODMsMHhmZSwweDAwLDB4NzQsMHgwMywweGU5LDB4MWIsMHgwMCwweDUxLDB4MWUKKywweGI4LDB4MDAsMHhlMCwweDhlLDB4ZDgsMHgzMywweGY2LDB4OGQsMHgzZSwweDAwLDB4ZDgsMHhiOSwweDAwLDB4MGMsMHhmMywweGE1CissMHgxZiwweDU5LDB4YmUsMHhmZiwweGZmLDB4ODEsMHhlZSwweDAwLDB4ZDgsMHgyYiwweGNlLDB4ODEsMHhlMSwweDAwLDB4ZmYsMHg4OQorLDB4MGUsMHhhYywweDMzLDB4OGQsMHgwNiwweDIwLDB4MDIsMHhjMSwweGU4LDB4MDQsMHhhMywweDMyLDB4MzQsMHg4ZSwweGQwLDB4MzYKKywweGM3LDB4MDYsMHgxZSwweDAwLDB4ODAsMHgxOCwweDM2LDB4YzcsMHgwNiwweDIyLDB4MDAsMHhmZiwweDdmLDB4MzYsMHhjNywweDA2CissMHgwYSwweDAwLDB4ZmYsMHhmZiwweDM2LDB4YzcsMHgwNiwweDFjLDB4MDAsMHg4MCwweDAwLDB4OGQsMHgwNiwweGEwLDB4MDIsMHhjMQorLDB4ZTgsMHgwNCwweGEzLDB4MzAsMHgzNCwweDhlLDB4ZDAsMHgzNiwweGM3LDB4MDYsMHgxZSwweDAwLDB4NTAsMHgyOCwweDM2LDB4YzcKKywweDA2LDB4MGEsMHgwMCwweGZmLDB4ZmYsMHgzNiwweGM3LDB4MDYsMHgxYywweDAwLDB4ODAsMHgwMCwweGI4LDB4YTAsMHgwMSwweGMxCissMHhlOCwweDA0LDB4YTMsMHgzNCwweDM0LDB4YTMsMHhmMiwweDMzLDB4OGUsMHhkMCwweDhkLDB4MjYsMHg4MCwweDAwLDB4YjgsMHgwMAorLDB4OTAsMHhlNywweDAyLDB4OGQsMHgzZSwweDcwLDB4MDEsMHg4YiwweGM3LDB4YzEsMHhlOCwweDA0LDB4YjksMHgwMywweDAwLDB4ODkKKywweDQ1LDB4MGUsMHg4OSwweDQ1LDB4MDIsMHhjNywweDA1LDB4ZmYsMHhmZiwweDgzLDB4YzcsMHgxMCwweDA1LDB4MDEsMHgwMCwweGUyCissMHhlZSwweGU4LDB4NWIsMHgwMSwweGU1LDB4Y2UsMHhhMywweGI1LDB4MzYsMHhlOCwweDIxLDB4MDAsMHhlOCwweDQ1LDB4MDEsMHhhMQorLDB4MzIsMHgzNCwweDhjLDB4Y2IsMHhjZCwweDM3LDB4MGUsMHg1OCwweGE5LDB4MDAsMHhmMCwweDc0LDB4MDcsMHgzMywweGY2LDB4ODkKKywweDM2LDB4ZmYsMHgzNCwweGMzLDB4OGQsMHgzNiwweDMwLDB4NjEsMHg4OSwweDM2LDB4ZmYsMHgzNCwweGMzLDB4MzMsMHhjMCwweDhiCissMHhkMCwweDhiLDB4ZjIsMHhiOSwweDY4LDB4MDAsMHgyZSwweDgwLDB4YmMsMHhhYywweDE3LDB4ODAsMHg3NSwweDAxLDB4ZWYsMHg4MworLDB4YzIsMHgwMiwweDQ2LDB4ZTIsMHhmMSwweGI4LDB4MDIsMHgwMCwweGU3LDB4NTAsMHhiOSwweDVhLDB4MDAsMHgzMywweGZmLDB4YzcKKywweDA1LDB4NjUsMHgxOCwweDhjLDB4NGQsMHgwMiwweDgzLDB4YzcsMHgwNCwweGUyLDB4ZjQsMHgzMywweGMwLDB4OGUsMHhjMCwweDhjCissMHhjOCwweDhlLDB4ZDgsMHg4ZCwweDNlLDB4ODAsMHgwMCwweDhkLDB4MzYsMHg5YywweDE3LDB4YjksMHgwOCwweDAwLDB4ZTgsMHgzNworLDB4MDAsMHg4ZCwweDM2LDB4MjAsMHgyMSwweDhkLDB4M2UsMHhjMCwweDAwLDB4YjksMHgwZCwweDAwLDB4ZTgsMHgyOSwweDAwLDB4OGQKKywweDNlLDB4NDAsMHgwMSwweGI5LDB4MGEsMHgwMCwweGU4LDB4MWYsMHgwMCwweGU4LDB4NGIsMHgwZSwweDMzLDB4YzAsMHg4ZSwweGQ4CissMHhjNywweDA2LDB4NGUsMHgzNywweDZmLDB4MTcsMHhlNywweDQ4LDB4ZTcsMHg0YywweGI4LDB4NDAsMHg5YywweGU3LDB4NGEsMHhlNQorLDB4NDgsMHg5MCwweGI4LDB4MDAsMHg3MCwweGU3LDB4NDgsMHhjMywweGE1LDB4ODMsMHhjNywweDAyLDB4ZTIsMHhmYSwweGMzLDB4ZTUKKywweDRjLDB4YzMsMHg1MCwweDUxLDB4NTYsMHg1NywweDUyLDB4MDYsMHgxZSwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4ZTUsMHg1OCwweGQxCissMHhlMCwweDczLDB4MTEsMHg4YiwweGYwLDB4ZDEsMHhlNiwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4OGIsMHhiNCwweDgwLDB4MDAsMHg4MworLDB4YzYsMHgwYiwweGZmLDB4ZTYsMHgxZiwweDA3LDB4NWEsMHg1ZiwweDVlLDB4NTksMHg1OCwweGNmLDB4NTgsMHgxYywweGU0LDB4MWMKKywweDZjLDB4MWMsMHg4ZSwweDFhLDB4YzAsMHgxZiwweDQwLDB4MWEsMHg0NCwweDFjLDB4NjUsMHgxOCwweDgwLDB4ODAsMHg4MCwweGZmCissMHg4MCwweDAzLDB4MDIsMHg4MCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZgorLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYKKywweDgwLDB4MDMsMHgwMywweDQzLDB4ODAsMHg4MCwweDAyLDB4ODAsMHg0MiwweDAzLDB4MDIsMHhmZiwweDAzLDB4MDEsMHgwMywweDAxCissMHgwMSwweDAzLDB4MDIsMHgwMywweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHgwMiwweDAzLDB4MDEsMHgwMworLDB4MDMsMHhmZiwweDAxLDB4MDEsMHhmZiwweDAxLDB4ZmYsMHgwMSwweDAxLDB4MDMsMHgwMywweDAzLDB4ZmYsMHhmZiwweGZmLDB4ZmYKKywweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmCissMHhmZiwweGZmLDB4ZmYsMHgwMiwweGI4LDB4MGYsMHgwMCwweGU3LDB4ODQsMHhiOCwweDBmLDB4ZjgsMHhlNywweDgyLDB4YzMsMHhiOQorLDB4MDgsMHgwMCwweDg5LDB4MGUsMHhlNiwweDNhLDB4OGQsMHgwNiwweDIwLDB4MDMsMHg4YiwweGQwLDB4YzEsMHhlOCwweDA0LDB4YTMKKywweDkwLDB4MDEsMHg4YiwweGMyLDB4OGIsMHhkOCwweGMxLDB4ZTgsMHgwNCwweDhlLDB4YzAsMHgwNSwweDYxLDB4MDAsMHgyNiwweGEzCissMHgwMCwweDAwLDB4YTEsMHgzMCwweDM0LDB4MjYsMHhhMywweDAyLDB4MDAsMHg4MywweGMzLDB4MTQsMHhkMSwweGViLDB4MjYsMHg4OQorLDB4MWUsMHgwOCwweDAwLDB4ODEsMHhjMiwweDEwLDB4MDYsMHhlMiwweGQ5LDB4MjYsMHhjNywweDA2LDB4MDAsMHgwMCwweGZmLDB4ZmYKKywweDhjLDB4MDYsMHg5MiwweDAxLDB4YzMsMHg1MCwweDUxLDB4NTYsMHg1NywweDUyLDB4MDYsMHgxZSwweDMzLDB4YzAsMHg4ZSwweGQ4CissMHhlNywweDVhLDB4ZmYsMHgwNiwweGJlLDB4MzMsMHhiYSwweGQyLDB4MDAsMHhlZCwweGNmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4OGMsMHhjYiwweGExLDB4MzAsMHgzNCwweGNkLDB4MzcsMHhlOSwweDA2LDB4ZWQsMHhiOCwweDMyLDB4MDAsMHhjMywweGU4LDB4OGMKKywweDAxLDB4ZmUsMHgwNiwweGUyLDB4MzQsMHhlOCwweDIxLDB4MDEsMHg3NSwweGYwLDB4ZTgsMHg1MywweDBlLDB4ODEsMHgwZSwweGFmCissMHgzNiwweDAwLDB4YzAsMHhjNywweDA2LDB4YWQsMHgzNiwweDYwLDB4MDAsMHhmNywweDA2LDB4ZTYsMHgzNCwweDgwLDB4MDAsMHg3NQorLDB4MWEsMHhmNywweDA2LDB4ZTYsMHgzNCwweDAwLDB4MDgsMHg3NCwweDA5LDB4YzcsMHgwNiwweGFiLDB4MzYsMHgwYiwweDAwLDB4ZTkKKywweDBmLDB4MDAsMHhjNywweDA2LDB4YWIsMHgzNiwweDAzLDB4MDAsMHhlOSwweDA2LDB4MDAsMHhjNywweDA2LDB4YWIsMHgzNiwweDExCissMHg5YywweGM3LDB4MDYsMHhhOSwweDM2LDB4MTgsMHgwMCwweGY3LDB4MDYsMHhlNiwweDM0LDB4ODAsMHgwMCwweDc1LDB4MGQsMHhmNworLDB4MDYsMHhiNSwweDM2LDB4MDIsMHgwMCwweDc0LDB4MDUsMHg4MywweDBlLDB4YTksMHgzNiwweDIwLDB4YTEsMHhhOSwweDM2LDB4ZTcKKywweDAwLDB4YTEsMHhhYiwweDM2LDB4ZTcsMHgwMiwweGY3LDB4MDYsMHhlNiwweDM0LDB4ODAsMHgwMCwweDc0LDB4MmUsMHhlOCwweGYyCissMHgyZiwweDMzLDB4YzAsMHgwZCwweDQxLDB4MDAsMHhlNywweDU2LDB4YTEsMHhiMSwweDM2LDB4MGQsMHgwMCwweDEwLDB4ZTcsMHgwOAorLDB4YTEsMHhiMywweDM2LDB4ZTcsMHgwYSwweGExLDB4YWYsMHgzNiwweGU3LDB4MDYsMHhiOCwweDQwLDB4MDAsMHhlNywweDRlLDB4MzMKKywweGMwLDB4ZTcsMHgwZSwweGM3LDB4MDYsMHgyNiwweDAyLDB4MDAsMHgwMCwweGU5LDB4MjMsMHgwMCwweGM3LDB4MDYsMHg0ZSwweDM3CissMHgzZiwweDIwLDB4OGUsMHgwNiwweDMwLDB4MzQsMHgyNiwweGY3LDB4MDYsMHgwYSwweDAwLDB4MDAsMHg4MCwweDc0LDB4MDcsMHgyNgorLDB4ODEsMHgwZSwweDA4LDB4MDAsMHgwMCwweDgwLDB4YzYsMHgwNiwweGUwLDB4MzQsMHgwMSwweGI4LDB4MDAsMHgwMCwweGMzLDB4ZmUKKywweDA2LDB4ZTEsMHgzNCwweGM2LDB4MDYsMHhlMCwweDM0LDB4MDAsMHhhMSwweDI2LDB4MDIsMHgwYiwweGMwLDB4NzQsMHgwMSwweGMzCissMHhlOCwweDA0LDB4MDAsMHhiOCwweDAwLDB4MDAsMHhjMywweGExLDB4YTksMHgzNiwweGU3LDB4MDAsMHg4YiwweDFlLDB4YWIsMHgzNgorLDB4ODMsMHhlMywweDA2LDB4ZTUsMHgwMiwweDI1LDB4ZjksMHhmZiwweDBiLDB4YzMsMHgwZCwweDEwLDB4MDAsMHhlNywweDAyLDB4YTEKKywweGFkLDB4MzYsMHhlNywweDA0LDB4YzMsMHhiOCwweDBhLDB4MDAsMHhlNywweDg0LDB4ZmUsMHgwNiwweGU1LDB4MzQsMHhjNiwweDA2CissMHhlMywweDM0LDB4MDEsMHg4ZSwweDA2LDB4MzAsMHgzNCwweDI2LDB4ZjcsMHgwNiwweDBhLDB4MDAsMHgwMCwweDQwLDB4NzQsMHgwNworLDB4MjYsMHg4MSwweDBlLDB4MDgsMHgwMCwweDAwLDB4NDAsMHhjMywweGM3LDB4MDYsMHg0ZSwweDM3LDB4NmYsMHgxNywweGZlLDB4MDYKKywweGU0LDB4MzQsMHhjNiwweDA2LDB4ZTMsMHgzNCwweDAwLDB4YzMsMHhjMywweGY2LDB4MDYsMHgxOCwweDM0LDB4ODAsMHg3NSwweDBkCissMHhhMSwweDE4LDB4MzQsMHgwYiwweDA2LDB4MWEsMHgzNCwweDBiLDB4MDYsMHgxYywweDM0LDB4NzUsMHgwMSwweGMzLDB4YTEsMHgyZQorLDB4MzQsMHgyNSwweGZmLDB4ZmUsMHg4YiwweDE2LDB4ZTcsMHgzNiwweDgxLDB4ZTIsMHgwMCwweDAxLDB4MGIsMHhjMiwweGEzLDB4MmUKKywweDM0LDB4OGQsMHgxNiwweDEwLDB4MDAsMHhiZiwweDAwLDB4MDAsMHhiOSwweDA4LDB4MDAsMHg4YiwweDg1LDB4MDAsMHgzNCwweGVmCissMHg4MywweGMyLDB4MTAsMHg4YiwweDg1LDB4MDIsMHgzNCwweGVmLDB4ODMsMHhjMiwweDEwLDB4OGIsMHg4NSwweDA0LDB4MzQsMHhlZgorLDB4ODMsMHhjMiwweGUyLDB4ODMsMHhjNywweDA2LDB4NDksMHg3NSwweGUyLDB4YjgsMHgwMCwweDAwLDB4OGUsMHhjMCwweGJlLDB4MDAKKywweDM0LDB4YmYsMHhiOSwweDM2LDB4YjksMHgxOCwweDAwLDB4ZjMsMHhhNSwweGI4LDB4MDAsMHgwMCwweGMzLDB4MzMsMHhjMCwweDhlCissMHhjMCwweDhkLDB4M2UsMHhiMCwweDMzLDB4YjksMHgwOCwweDAwLDB4ZjMsMHhhYiwweDhkLDB4M2UsMHgzZSwweDM0LDB4YjksMHgwMworLDB4MDAsMHhmMywweGFiLDB4YzMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDUwLDB4NTEsMHg1NiwweDU3LDB4NTIsMHgwNiwweDFlLDB4MzMsMHhjMCwweDhlLDB4ZDgsMHhlNywweDVhLDB4ZmYsMHgwNiwweGJhCissMHgzMywweGU1LDB4NTYsMHgwZCwweDIwLDB4MDAsMHhlNywweDU2LDB4YmEsMHg3YSwweDAwLDB4ZWQsMHgwOCwweDI2LDB4OTQsMHgzNgorLDB4MzMsMHhjMCwweGIxLDB4MDgsMHgzMiwweGVkLDB4MDYsMHg4ZSwweGMwLDB4OGQsMHgzZSwweGUwLDB4ZmYsMHhmMywweGFhLDB4OGUKKywweDA2LDB4MzIsMHgzNCwweDI2LDB4ODEsMHgwZSwweDA4LDB4MDAsMHgwMCwweDAyLDB4MDcsMHhlNSwweDU2LDB4MjUsMHhkZiwweGZmCissMHhlNywweDU2LDB4ZTksMHhmOCwweGZjLDB4MDAsMHhiZCwweDFiLDB4MTAsMHgxYiwweGQ5LDB4MWEsMHhmMywweDFhLDB4NTAsMHg1MQorLDB4NTYsMHg1NywweDUyLDB4MDYsMHgxZSwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4ZTcsMHg1YSwweGZmLDB4MDYsMHhiNiwweDMzLDB4NTMKKywweDA2LDB4NTEsMHhlNSwweDgwLDB4YTMsMHhiNCwweDMzLDB4OGIsMHhkOCwweDhiLDB4YzgsMHgyNSwweDEwLDB4MDAsMHhhMywweGVkCissMHgzNCwweDBiLDB4YzAsMHg3NCwweDE0LDB4ZmYsMHgwNiwweDgwLDB4MzQsMHg4MCwweDNlLDB4ZmUsMHgzNCwweDAwLDB4NzQsMHgwMworLDB4ZTksMHgwNiwweDAwLDB4YjgsMHg4MCwweDAwLDB4ZTgsMHg5ZCwweDA0LDB4ODMsMHhlMywweDAzLDB4ZDEsMHhlMywweDJlLDB4ZmYKKywweDk3LDB4ODYsMHgxYSwweDU5LDB4MDcsMHg1YiwweGU5LDB4YTQsMHhmYywweGJhLDB4MjAsMHgwMCwweDhlLDB4MDYsMHgzYywweDM0CissMHg4MywweDNlLDB4M2MsMHgzNCwweDAwLDB4NzUsMHgwMywweGU5LDB4ZjAsMHgwMCwweGM3LDB4MDYsMHgzYywweDM0LDB4MDAsMHgwMAorLDB4ZTksMHgyYSwweDAwLDB4YmEsMHgxMCwweDAwLDB4OGUsMHgwNiwweDNhLDB4MzQsMHg4MywweDNlLDB4M2EsMHgzNCwweDAwLDB4NzUKKywweDAzLDB4ZTksMHhkNSwweGZmLDB4YzcsMHgwNiwweDNhLDB4MzQsMHgwMCwweDAwLDB4ZTgsMHgxMCwweDAwLDB4ZTksMHhjOSwweGZmCissMHhiYSwweDEwLDB4MDAsMHg4ZSwweDA2LDB4M2EsMHgzNCwweGM3LDB4MDYsMHgzYSwweDM0LDB4MDAsMHgwMCwweDI2LDB4YTEsMHgxNAorLDB4MDAsMHgyNiwweGEzLDB4MGMsMHgwMCwweDI2LDB4YTEsMHgxNiwweDAwLDB4MjYsMHhhMywweDBlLDB4MDAsMHgyNiwweGM2LDB4MDYKKywweDBhLDB4MDAsMHgwMCwweGMxLDB4ZWEsMHgwMiwweDIzLDB4ZDEsMHg3NCwweDFjLDB4YmEsMHgyMCwweDAwLDB4MjYsMHhjNywweDA2CissMHgwZSwweDAwLDB4ZWEsMHgwNSwweDI2LDB4MGIsMHgxNiwweDBjLDB4MDAsMHgyNiwweDg5LDB4MTYsMHgwYywweDAwLDB4ZmYsMHgwNgorLDB4ODYsMHgzNCwweGZmLDB4MDYsMHhkYywweDMzLDB4MjYsMHhhMSwweDBjLDB4MDAsMHhhOSwweDAwLDB4MzcsMHg3NCwweDE2LDB4MjYKKywweGM2LDB4MDYsMHgwYSwweDAwLDB4MDIsMHhhOSwweDAwLDB4MzAsMHg3NCwweDA0LDB4ZmYsMHgwNiwweDdhLDB4MzQsMHhmZiwweDA2CissMHhkYSwweDMzLDB4ZTksMHg0OSwweDAwLDB4YzAsMHhlYywweDA3LDB4ODMsMHgxNiwweDhhLDB4MzQsMHgwMCwweDI0LDB4MDcsMHgzYworLDB4MDcsMHg3NSwweDA0LDB4ZmYsMHgwNiwweDhjLDB4MzQsMHhmZiwweDA2LDB4N2UsMHgzNCwweGExLDB4MzAsMHgzNCwweDhjLDB4YzMKKywweDhlLDB4YzAsMHg4ZSwweGRiLDB4MjYsMHg4MywweDBlLDB4MDgsMHgwMCwweDQwLDB4OGMsMHhkOCwweDI2LDB4ODcsMHgwNiwweDE2CissMHgwMCwweDI2LDB4ODMsMHgzZSwweDE0LDB4MDAsMHhmZiwweDc0LDB4MGEsMHg4ZSwweGMwLDB4MjYsMHg4YywweDFlLDB4MDAsMHgwMAorLDB4ZTksMHgwNSwweDAwLDB4MjYsMHg4YywweDFlLDB4MTQsMHgwMCwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4YzMsMHhjMywweDhjLDB4YzAKKywweDg3LDB4MDYsMHg5MiwweDAxLDB4M2QsMHhmZiwweGZmLDB4NzQsMHgwZCwweDhlLDB4ZDgsMHg4YywweDA2LDB4MDAsMHgwMCwweDMzCissMHhjMCwweDhlLDB4ZDgsMHhlOSwweDA0LDB4MDAsMHg4YywweDA2LDB4OTAsMHgwMSwweGU4LDB4MDEsMHgwMCwweGMzLDB4MDYsMHg4MworLDB4M2UsMHg5MCwweDAxLDB4ZmYsMHg3NCwweDI5LDB4ODMsMHgzZSwweDNhLDB4MzQsMHgwMCwweDc1LDB4MTEsMHhiYSwweDg2LDB4MDAKKywweGU4LDB4MWUsMHgwMCwweDhjLDB4MDYsMHgzYSwweDM0LDB4ODMsMHgzZSwweDkwLDB4MDEsMHhmZiwweDc0LDB4MTEsMHg4MywweDNlCissMHgzYywweDM0LDB4MDAsMHg3NSwweDBhLDB4YmEsMHg4OCwweDAwLDB4ZTgsMHgwNiwweDAwLDB4OGMsMHgwNiwweDNjLDB4MzQsMHgwNworLDB4YzMsMHhhMSwweDkwLDB4MDEsMHg4ZSwweGMwLDB4MjYsMHhhMSwweDA4LDB4MDAsMHhlZiwweDI2LDB4YTEsMHgwMCwweDAwLDB4MjYKKywweGM3LDB4MDYsMHgwMCwweDAwLDB4ZmYsMHhmZiwweGEzLDB4OTAsMHgwMSwweDNkLDB4ZmYsMHhmZiwweDc1LDB4MDMsMHhhMywweDkyCissMHgwMSwweDgzLDB4M2UsMHhlZCwweDM0LDB4MDAsMHg3NCwweDBiLDB4YjgsMHgxMCwweDAwLDB4ZTcsMHg4NCwweGM3LDB4MDYsMHhlZAorLDB4MzQsMHgwMCwweDAwLDB4YzMsMHg1MCwweDUxLDB4NTYsMHg1NywweDUyLDB4MDYsMHgxZSwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4ZTcKKywweDVhLDB4ZmYsMHgwNiwweGJjLDB4MzMsMHhlOSwweDI1LDB4ZmIsMHg1MCwweDUxLDB4NTYsMHg1NywweDUyLDB4MDYsMHgxZSwweDMzCissMHhjMCwweDhlLDB4ZDgsMHhlNywweDVhLDB4ZmYsMHgwNiwweGIwLDB4MzMsMHhlOSwweDExLDB4ZmIsMHg1MCwweDUxLDB4NTYsMHg1NworLDB4NTIsMHgwNiwweDFlLDB4MzMsMHhjMCwweDhlLDB4ZDgsMHhlNywweDVhLDB4ZmYsMHgwNiwweGI0LDB4MzMsMHgwNiwweGZmLDB4MDYKKywweDc2LDB4MzQsMHg4MCwweDNlLDB4ZmUsMHgzNCwweDAwLDB4NzQsMHgwNCwweDA3LDB4ZTksMHhmMCwweGZhLDB4YjgsMHg4MCwweDAwCissMHhlOCwweGQzLDB4MDIsMHgwNywweGU5LDB4ZTYsMHhmYSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4YzYsMHgxZCwweDA4LDB4MWQsMHg5MSwweDFlLDB4NWQsMHgxZSwweDczLDB4MWUsMHg4OSwweDFlLDB4OTEsMHgxZSwweGE4LDB4MWQKKywweDkxLDB4MWUsMHg5MSwweDFlLDB4YWYsMHgxZSwweGFmLDB4MWUsMHgxNSwweDFkLDB4MTUsMHgxZCwweDkxLDB4MWUsMHg5OSwweDFmCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MDAsMHgwMAorLDB4MDAsMHgwMSwweDAwLDB4MTAsMHgwMCwweDAxLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAKKywweDA3LDB4ZTksMHg5OSwweGZhLDB4NTAsMHg1MSwweDU2LDB4NTcsMHg1MiwweDA2LDB4MWUsMHgzMywweGMwLDB4OGUsMHhkOCwweGU3CissMHg1YSwweGZmLDB4MDYsMHhiMiwweDMzLDB4MDYsMHg2OCwweGY2LDB4MWMsMHhlNSwweDA2LDB4YTMsMHhiMiwweDMzLDB4OGIsMHhmMAorLDB4ODMsMHhlNiwweDFlLDB4MmUsMHhmZiwweGE0LDB4YTAsMHgxYywweGU1LDB4MGMsMHhhOSwweDgwLDB4MDAsMHg3NCwweDA2LDB4ZTgKKywweGE0LDB4MDEsMHhlNSwweDA2LDB4YzMsMHg1MywweGU1LDB4MGMsMHg4YiwweGQ4LDB4YTksMHgwMSwweDAwLDB4NzQsMHgxNCwweDgzCissMHgzZSwweGUwLDB4M2EsMHgwMCwweDc0LDB4MGQsMHg4ZSwweDA2LDB4MzgsMHgzNCwweGU4LDB4YmYsMHgwNiwweGM3LDB4MDYsMHhlMAorLDB4M2EsMHgwMCwweDAwLDB4ZTUsMHgwMCwweDBkLDB4MTgsMHgwMCwweGU3LDB4MDAsMHhlNSwweDAyLDB4MGQsMHgxMSwweDAwLDB4ZTcKKywweDAyLDB4OGIsMHhjMywweDViLDB4YTksMHgwMSwweDAwLDB4NzQsMHgwMSwweGMzLDB4OGIsMHhkMCwweGI4LDB4MDAsMHgwOCwweGU3CissMHg4NCwweDhiLDB4YzIsMHg4ZSwweDA2LDB4MzgsMHgzNCwweDI2LDB4YTMsMHgwYywweDAwLDB4OGIsMHhkMCwweGMxLDB4ZTAsMHgwMworLDB4ODMsMHgxNiwweDg4LDB4MzQsMHgwMCwweGZmLDB4MDYsMHg3YywweDM0LDB4MjYsMHg4MywweDNlLDB4MDYsMHgwMCwweDBhLDB4NzUKKywweDIxLDB4OGIsMHhjMiwweDI1LDB4NDAsMHgxOCwweDNkLDB4NDAsMHgwMCwweDc0LDB4MGMsMHgzZCwweDAwLDB4MTAsMHg3NSwweDEyCissMHgyNiwweGZlLDB4MGUsMHgwYSwweDAwLDB4NzQsMHgwYiwweGY3LDB4MDYsMHhlZiwweDM0LDB4MjAsMHgwMCwweDc1LDB4MDMsMHhlOQorLDB4NWEsMHgwNiwweDhjLDB4YzAsMHgyNiwweDhlLDB4MDYsMHgwMiwweDAwLDB4MjYsMHg4MywweDBlLDB4MDgsMHgwMCwweDIwLDB4MjYKKywweGEzLDB4MTIsMHgwMCwweDI2LDB4YTMsMHgxMCwweDAwLDB4YzMsMHhmZiwweDA2LDB4YzQsMHgzMywweGU1LDB4MGMsMHhhOSwweDAxCissMHgwMCwweDc1LDB4MDEsMHhjMywweGE5LDB4ZjAsMHgwNywweDc0LDB4MDEsMHhjMywweGZmLDB4MDYsMHhkNCwweDMzLDB4ZTUsMHgwMAorLDB4MGQsMHgxOCwweDAwLDB4ZTcsMHgwMCwweGMzLDB4ZmYsMHgwNiwweGNhLDB4MzMsMHg4MCwweDNlLDB4YTAsMHgzNiwweDA4LDB4NzUKKywweDE0LDB4OGUsMHgwNiwweDMwLDB4MzQsMHgyNiwweGY3LDB4MDYsMHgwYSwweDAwLDB4MDAsMHgwOCwweDc0LDB4MDcsMHgyNiwweDgxCissMHgwZSwweDA4LDB4MDAsMHgwMCwweDA4LDB4ZTUsMHg4MiwweDI1LDB4ZmQsMHhmZiwweGU3LDB4ODIsMHhlNSwweDBjLDB4NTAsMHhlNQorLDB4ODAsMHgyNSwweDAwLDB4MDcsMHhhMywweGU0LDB4M2EsMHhlNSwweDhjLDB4MjUsMHgwMCwweDgwLDB4YTMsMHhlMiwweDNhLDB4NTgKKywweGE5LDB4MDIsMHgwMCwweDc1LDB4MjUsMHg4MywweDNlLDB4ZTIsMHgzYSwweDAwLDB4NzUsMHgxZSwweDgzLDB4M2UsMHhlNCwweDNhCissMHgwMCwweDc1LDB4MTcsMHhlNSwweDA4LDB4MGQsMHgwMCwweDA0LDB4MjUsMHhmZiwweDA0LDB4ZTcsMHgwOCwweGU4LDB4NmEsMHgwMQorLDB4ZTUsMHg4MiwweDBkLDB4MDIsMHgwMCwweGU3LDB4ODIsMHhlOSwweDIxLDB4MDAsMHhlOCwweDFhLDB4MDYsMHg4MCwweDNlLDB4ZTgKKywweGZmLDB4MDAsMHg3NCwweDBhLDB4ODAsMHgzZSwweGU4LDB4ZmYsMHgwNCwweDc0LDB4MDMsMHhlOSwweDBkLDB4MDAsMHhjNiwweDA2CissMHhlOCwweGZmLDB4MDEsMHhiYSwweDBjLDB4MDEsMHhiOCwweDA4LDB4MDgsMHhlZiwweGVkLDB4ODAsMHgzZSwweDlmLDB4MzYsMHgwNgorLDB4NzUsMHgwNSwweDgzLDB4MGUsMHg5OSwweDM2LDB4NDAsMHhiOCwweDAwLDB4MDEsMHhlOSwweDA5LDB4MDEsMHhmZiwweDA2LDB4Y2MKKywweDMzLDB4ODEsMHgyNiwweGFmLDB4MzYsMHhmZiwweGY3LDB4YTEsMHhhZiwweDM2LDB4ZTcsMHgwNiwweGZmLDB4MDYsMHhjNiwweDM0CissMHhlOSwweDFlLDB4MDAsMHhmZiwweDA2LDB4Y2UsMHgzMywweGZmLDB4MDYsMHg5NSwweDM3LDB4ODEsMHgyNiwweGFmLDB4MzYsMHhmZgorLDB4ZWYsMHhhMSwweGFmLDB4MzYsMHhlNywweDA2LDB4ZTksMHgwOCwweDAwLDB4ZmYsMHgwNiwweGQwLDB4MzMsMHhmZiwweDA2LDB4N2EKKywweDM0LDB4ZmYsMHgwNiwweGQyLDB4MzMsMHhkMSwweGU2LDB4OGUsMHgwNiwweDMwLDB4MzQsMHgyZSwweDhiLDB4ODQsMHhjMCwweDFjCissMHgyNiwweDA5LDB4MDYsMHgwOCwweDAwLDB4MmUsMHg4YiwweDg0LDB4YzIsMHgxYywweDA5LDB4MDYsMHg2NiwweDM3LDB4YzMsMHhlNQorLDB4MGMsMHhhOSwweDgwLDB4MDAsMHg3NCwweDU2LDB4NTAsMHhlOCwweGYwLDB4MDAsMHg1OCwweGE5LDB4MDAsMHgwMSwweDc1LDB4MDcKKywweGZmLDB4MDYsMHhjNiwweDMzLDB4ZTksMHgwOCwweDAwLDB4ZmYsMHgwNiwweDc4LDB4MzQsMHhmZiwweDA2LDB4YzgsMHgzMywweGU1CissMHg4MiwweDI1LDB4ZmQsMHhmZiwweGU3LDB4ODIsMHhlOCwweDZlLDB4MDUsMHhiYSwweDEwLDB4MDEsMHhlZCwweDgwLDB4M2UsMHhlOAorLDB4ZmYsMHgwMCwweDc0LDB4MGEsMHg4MCwweDNlLDB4ZTgsMHhmZiwweDA0LDB4NzQsMHgwMywweGU5LDB4MWQsMHgwMCwweGM2LDB4MDYKKywweGU4LDB4ZmYsMHgwMSwweGJhLDB4MGMsMHgwMSwweGI4LDB4MDgsMHgwOCwweGVmLDB4ZWQsMHhlOSwweDBkLDB4MDAsMHhjNiwweDA2CissMHhlOCwweGZmLDB4MDMsMHhiYSwweDBjLDB4MDEsMHhiOCwweDA4LDB4MDgsMHhlZiwweGVkLDB4YzMsMHhhOSwweDAxLDB4MDAsMHg3NAorLDB4MWMsMHhlOCwweDJjLDB4MDAsMHg4MywweDNlLDB4ZTAsMHgzYSwweDAwLDB4NzQsMHgwZiwweDA2LDB4OGUsMHgwNiwweDM4LDB4MzQKKywweGU4LDB4YzksMHgwNCwweGM3LDB4MDYsMHhlMCwweDNhLDB4MDAsMHgwMCwweDA3LDB4ZTksMHg1ZCwweDAwLDB4OGIsMHhkMCwweDhlCissMHgwNiwweDM4LDB4MzQsMHgyNiwweGEzLDB4MGMsMHgwMCwweGU4LDB4MDYsMHgwMCwweDY4LDB4NjksMHgxZCwweGU5LDB4NGEsMHgwMAorLDB4YTksMHgwMCwweDA0LDB4NzQsMHgwYSwweGI4LDB4MDAsMHgwNCwweGZmLDB4MDYsMHhkOCwweDMzLDB4ZTksMHgxNywweDAwLDB4YTkKKywweDAwLDB4MDEsMHg3NCwweDBhLDB4ZmYsMHgwNiwweDM5LDB4MzcsMHhiOCwweDAwLDB4MDEsMHhlOSwweDA4LDB4MDAsMHhhOSwweDEwCissMHgwMCwweGI4LDB4MTAsMHgwMCwweDc0LDB4MWQsMHgwOSwweDA2LDB4NjYsMHgzNywweDhjLDB4YzAsMHg4ZSwweDA2LDB4MzAsMHgzNAorLDB4MjYsMHhmNywweDA2LDB4MGEsMHgwMCwweDAwLDB4MDEsMHg3NCwweDA3LDB4MjYsMHg4MSwweDBlLDB4MDgsMHgwMCwweDAwLDB4MDEKKywweDhlLDB4YzAsMHhjMywweGZmLDB4MDYsMHhjMiwweDMzLDB4ZTksMHhmOCwweGZmLDB4ZTUsMHgwMCwweDBkLDB4MTgsMHgwMCwweGU3CissMHgwMCwweGU1LDB4MDIsMHgwZCwweDExLDB4MDAsMHhlNywweDAyLDB4YzMsMHg1OCwweGU5LDB4NDMsMHhmZCwweGU1LDB4MDgsMHgwZAorLDB4MDAsMHgwNCwweDI1LDB4ZmYsMHgwNCwweGU3LDB4MDgsMHhlOSwweGUwLDB4ZmYsMHhlNSwweDBlLDB4YTksMHgwMCwweDA4LDB4NzUKKywweDAxLDB4YzMsMHhlOSwweGY1LDB4ZmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHg1MCwweDUxLDB4NTYsMHg1NywweDUyLDB4MDYsMHgxZSwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4ZTcsMHg1YSwweGZmLDB4MDYsMHhiOAorLDB4MzMsMHhlNSwweDQ4LDB4MDYsMHg1MywweDU3LDB4ZmYsMHgxNiwweDRlLDB4MzcsMHg1ZiwweDViLDB4ODMsMHgzZSwweDgwLDB4MDEKKywweGZmLDB4NzQsMHg1OCwweDhlLDB4MDYsMHg4MCwweDAxLDB4MjYsMHhmZiwweDBlLDB4MDgsMHgwMCwweDc1LDB4NGQsMHgyNiwweGExCissMHgwMCwweDAwLDB4YTMsMHg4MCwweDAxLDB4MjYsMHhjNywweDA2LDB4MDAsMHgwMCwweGZmLDB4ZmYsMHg4YywweGMwLDB4MjYsMHg4ZQorLDB4MDYsMHgwMiwweDAwLDB4MjYsMHg4MSwweDBlLDB4MDgsMHgwMCwweDgwLDB4MDAsMHg4YiwweGQwLDB4MjYsMHg4NywweDA2LDB4MWEKKywweDAwLDB4MjYsMHg4MywweDNlLDB4MTgsMHgwMCwweGZmLDB4NzQsMHgwYSwweDhlLDB4YzAsMHgyNiwweDg5LDB4MTYsMHgwMCwweDAwCissMHhlOSwweDA1LDB4MDAsMHgyNiwweDg5LDB4MTYsMHgxOCwweDAwLDB4ODMsMHgzZSwweDgwLDB4MDEsMHhmZiwweDc0LDB4MGMsMHg4ZQorLDB4MDYsMHg4MCwweDAxLDB4MjYsMHg4MywweDNlLDB4MDgsMHgwMCwweDAwLDB4NzQsMHhiMywweDA3LDB4ZTksMHgzZSwweGY3LDB4ZTUKKywweDRjLDB4OTAsMHhlNSwweDAyLDB4YTksMHgwMCwweDIwLDB4NzQsMHgwZCwweDI1LDB4ZmYsMHhkZiwweDBkLDB4MDEsMHgwMCwweGU3CissMHgwMiwweDBkLDB4MDAsMHgyMCwweGU3LDB4MDIsMHhlNSwweDBhLDB4OGIsMHhkOCwweGEzLDB4ZjQsMHgzMywweDI1LDB4YzMsMHg1NworLDB4MGQsMHgwMCwweDEwLDB4ZTcsMHgwYSwweGY3LDB4MDYsMHg5YiwweDM2LDB4MDAsMHg4MCwweDc0LDB4MzcsMHhmNywweGMzLDB4MDAKKywweDgwLDB4NzQsMHgwNiwweGY3LDB4YzMsMHgwMCwweDA4LDB4NzQsMHg1ZCwweDgxLDB4MjYsMHhjMiwweDM0LDB4N2YsMHhmZiwweGM3CissMHgwNiwweDM1LDB4MzcsMHgwNSwweDAwLDB4YjgsMHg4MCwweDAzLDB4Y2QsMHgzOSwweDgxLDB4MjYsMHg5YiwweDM2LDB4ZmYsMHg3ZgorLDB4YzcsMHgwNiwweDBmLDB4MzcsMHgwNCwweDAwLDB4ZjcsMHgwNiwweDliLDB4MzYsMHg0MCwweDAwLDB4NzUsMHgwNiwweGM3LDB4MDYKKywweDBmLDB4MzcsMHgwMywweDAwLDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDIwLDB4NzQsMHgyYSwweGY3LDB4YzMsMHgwMCwweDA4CissMHg3NCwweDI0LDB4ODAsMHgzZSwweDlkLDB4MzYsMHgwNiwweDdjLDB4MWQsMHhmZiwweDA2LDB4OTQsMHgzNCwweDgzLDB4MGUsMHg2NgorLDB4MzcsMHgyMCwweDhlLDB4MDYsMHgzMCwweDM0LDB4MjYsMHhmNywweDA2LDB4MGEsMHgwMCwweDAwLDB4MDEsMHg3NCwweDA3LDB4MjYKKywweDgxLDB4MGUsMHgwOCwweDAwLDB4MDAsMHgwMSwweGY3LDB4YzMsMHgwMCwweDIwLDB4NzUsMHgzYiwweGY3LDB4MDYsMHg5YSwweDM3CissMHg4MCwweDAwLDB4NzQsMHgwYiwweGZmLDB4MDYsMHg4OSwweDM3LDB4MzMsMHhjMCwweGU3LDB4MGUsMHhlOSwweDA0LDB4MDAsMHhmZgorLDB4MDYsMHgzYiwweDM3LDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDIwLDB4NzQsMHgxYywweDgwLDB4MjYsMHg5ZSwweDM2LDB4ZmYKKywweDc1LDB4MTUsMHg4ZSwweDA2LDB4MzAsMHgzNCwweDI2LDB4ZjcsMHgwNiwweDBhLDB4MDAsMHgwMCwweDA4LDB4NzQsMHgwNywweDI2CissMHg4MSwweDBlLDB4MDgsMHgwMCwweDAwLDB4MDgsMHhjMywweGMzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDIsMHgyMywweDAyLDB4MjMsMHgwMiwweDIzLDB4MDIsMHgyMywweDAzLDB4MjMsMHhkZCwweDIyLDB4MDIsMHgyMywweGZkLDB4MjEKKywweDAyLDB4MjMsMHhhNCwweDI0LDB4ZjMsMHgyNCwweDAyLDB4MjMsMHg4ZCwweDIyLDB4N2EsMHgyMywweDAyLDB4MjMsMHg5NywweDI0CissMHgxYiwweDI0LDB4NzUsMHgyNCwweDAyLDB4MjMsMHgwMiwweDIzLDB4OGUsMHgyNSwweGZiLDB4OGUsMHgwNiwweDdlLDB4MDEsMHhmYgorLDB4MjYsMHg4MywweDNlLDB4MDAsMHgwMCwweGZmLDB4NzQsMHhmMiwweDI2LDB4OGUsMHgwNiwweDAwLDB4MDAsMHhmYSwweDI2LDB4OGIKKywweDFlLDB4MDgsMHgwMCwweDI2LDB4MjMsMHgxZSwweDBhLDB4MDAsMHg3NCwweGU1LDB4OGMsMHhjMCwweDhlLDB4ZDAsMHgyNiwweDhiCissMHgyNiwweDAyLDB4MDAsMHg4YywweDE2LDB4ZjIsMHgzMywweDIyLDB4ZmYsMHg3NSwweDZhLDB4MjYsMHhhMSwweDFjLDB4MDAsMHg4YQorLDB4ZTMsMHg4YSwweGRjLDB4MjIsMHhkOCwweDc1LDB4MGQsMHhkMCwweGU4LDB4MjQsMHhmOCwweDBhLDB4YzAsMHg3NSwweGYyLDB4YjAKKywweDgwLDB4ZTksMHhlZCwweGZmLDB4ZDAsMHhlOCwweDI0LDB4ZjgsMHgwYSwweGMwLDB4NzUsMHgwMiwweGIwLDB4ODAsMHgzMiwweGU0CissMHgyNiwweGEzLDB4MWMsMHgwMCwweGY3LDB4YzMsMHgwOCwweDAwLDB4NzUsMHg0NywweDJlLDB4OGEsMHg5ZiwweGM1LDB4MjUsMHgyZQorLDB4OGIsMHhiZiwweGM1LDB4MjYsMHg4MCwweGMzLDB4MTAsMHgyNiwweDhlLDB4MWQsMHgyNiwweDhjLDB4MWUsMHgwNiwweDAwLDB4OGIKKywweDE2LDB4MDAsMHgwMCwweGM3LDB4MDYsMHgwMCwweDAwLDB4ZmYsMHhmZiwweDI2LDB4ODksMHgxNSwweDgzLDB4ZmEsMHhmZiwweDc1CissMHgwYSwweDJlLDB4OGIsMHg5NywweGNkLDB4MjYsMHgyNiwweDIxLDB4MTYsMHgwOCwweDAwLDB4MzMsMHhjMCwweDhlLDB4ZDgsMHgyNgorLDB4ODksMHgxZSwweDA0LDB4MDAsMHhjMywweDhhLDB4ZGYsMHhiNywweDAwLDB4MmUsMHg4YSwweDlmLDB4YzUsMHgyNSwweGU5LDB4ZTAKKywweGZmLDB4MjYsMHg4MywweDI2LDB4MDgsMHgwMCwweGY3LDB4ODMsMHhjMywweDEwLDB4ZTksMHhkZSwweGZmLDB4NjAsMHgwNiwweDFlCissMHg2OCwweDg3LDB4MjUsMHg2YSwweDAwLDB4MWYsMHg4ZSwweDA2LDB4ZjIsMHgzMywweDhiLDB4MGUsMHgzNCwweDM0LDB4MzksMHgwZQorLDB4ZjIsMHgzMywweDc0LDB4MGUsMHgyNiwweDgxLDB4MGUsMHgwYSwweDAwLDB4MDAsMHgwMiwweDI2LDB4ODEsMHgwZSwweDA4LDB4MDAKKywweDAwLDB4MDIsMHgyNiwweDg5LDB4MjYsMHgwMiwweDAwLDB4YTMsMHhmMiwweDMzLDB4OGUsMHhkMCwweDhkLDB4MjYsMHg4MCwweDAwCissMHgzNiwweDg5LDB4MjYsMHgwMiwweDAwLDB4MzYsMHg4OSwweDFlLDB4MjAsMHgwMCwweDM2LDB4YzcsMHgwNiwweDA4LDB4MDAsMHgwMAorLDB4MDAsMHhiOSwweDA0LDB4MDAsMHhiZSwweDAwLDB4MDAsMHgyZSwweDhiLDB4YmMsMHhjNSwweDI2LDB4MzYsMHhjNywweDA1LDB4ZmYKKywweGZmLDB4MzYsMHhjNywweDQ1LDB4MDIsMHhmZiwweGZmLDB4ODMsMHhjNiwweDAyLDB4ZTIsMHhlYiwweDhlLDB4MDYsMHg3ZSwweDAxCissMHgzNiwweDhiLDB4MGUsMHgyMiwweDAwLDB4OGMsMHhjMCwweDI2LDB4ODMsMHgzZSwweDAwLDB4MDAsMHhmZiwweDI2LDB4OGUsMHgwNgorLDB4MDAsMHgwMCwweDc0LDB4MDcsMHgyNiwweDNiLDB4MGUsMHgyMiwweDAwLDB4N2QsMHhlYSwweDM2LDB4OGMsMHgwNiwweDAwLDB4MDAKKywweDhlLDB4YzAsMHgyNiwweDhjLDB4MTYsMHgwMCwweDAwLDB4ZmIsMHgzNiwweGZmLDB4MmUsMHgxZSwweDAwLDB4MDYsMHgxZSwweDY4CissMHg4YiwweDI1LDB4NmEsMHgwMCwweDFmLDB4MjYsMHgwOSwweDM2LDB4MDgsMHgwMCwweGY3LDB4YzYsMHgwMCwweGZmLDB4NzQsMHgwMQorLDB4YzMsMHg1NiwweDUyLDB4MmUsMHg4YiwweGI0LDB4YzUsMHgyNSwweDgxLDB4ZTYsMHhmZiwweDAwLDB4MmUsMHg4YiwweGI0LDB4YzUKKywweDI2LDB4OGMsMHhjMiwweDhlLDB4YzAsMHgyNiwweGM3LDB4MDYsMHgwMCwweDAwLDB4ZmYsMHhmZiwweDhlLDB4YzIsMHgyNiwweDgzCissMHgzYywweGZmLDB4NzQsMHgwZiwweDhiLDB4ZDAsMHgyNiwweDg3LDB4NTQsMHgwMiwweDhlLDB4YzIsMHgyNiwweGEzLDB4MDAsMHgwMAorLDB4ZTksMHgwNywweDAwLDB4MjYsMHg4OSwweDQ0LDB4MDIsMHgyNiwweDg5LDB4MDQsMHg1YSwweDVlLDB4YzMsMHgwNiwweDFlLDB4NjgKKywweDhiLDB4MjUsMHg2YSwweDAwLDB4MWYsMHg4ZSwweDA2LDB4ZjIsMHgzMywweDI2LDB4YTMsMHgwYSwweDAwLDB4MjYsMHg4OSwweDI2CissMHgwMiwweDAwLDB4YTEsMHgzNCwweDM0LDB4OGUsMHhkMCwweDhkLDB4MjYsMHg4MCwweDAwLDB4OGMsMHgxNiwweGYyLDB4MzMsMHhlOQorLDB4NGQsMHhmZSwweGNmLDB4NTAsMHgxZSwweDUyLDB4NTMsMHgzMywweGMwLDB4OGUsMHhkOCwweDI2LDB4ODMsMHgzZSwweDA0LDB4MDAKKywweGZmLDB4MjYsMHhjNywweDA2LDB4MDQsMHgwMCwweDAwLDB4MDAsMHg3NCwweDAzLDB4ZTksMHgxYSwweDAwLDB4ODMsMHgzZSwweGU2CissMHgzYSwweDAyLDB4NzYsMHgxMywweGZmLDB4MDYsMHhkNiwweDMzLDB4OGMsMHhjMCwweDhlLDB4MDYsMHgzMiwweDM0LDB4YmUsMHg0MAorLDB4MDAsMHg2OCwweDNhLDB4MjMsMHhlOSwweDVlLDB4ZmYsMHhlOCwweDg0LDB4ZjgsMHg1YiwweDVhLDB4MWYsMHg1OCwweGNmLDB4ZTgKKywweGUxLDB4MDAsMHgyNiwweGM2LDB4MDYsMHgxOCwweDAwLDB4MTAsMHgyNiwweDhhLDB4MWUsMHgyOSwweDAwLDB4ODgsMHgxZSwweDFiCissMHgzNywweDI2LDB4YzcsMHgwNiwweDBjLDB4MDAsMHhmZiwweDdmLDB4MjYsMHhhMSwweDBlLDB4MDAsMHhlNywweDljLDB4MjYsMHhhMQorLDB4MDgsMHgwMCwweGU3LDB4OWEsMHhlNSwweDAwLDB4ODAsMHhmYiwweDA4LDB4NzQsMHgwOSwweDBkLDB4MTgsMHhhYywweGU3LDB4MDAKKywweDA3LDB4MWYsMHg1OCwweGNmLDB4MGQsMHgxOCwweDAwLDB4ZTksMHhmNCwweGZmLDB4NTAsMHgxZSwweDA2LDB4MzMsMHhjMCwweDhlCissMHhkOCwweDgzLDB4M2UsMHhhMSwweDM2LDB4MDAsMHg3NSwweGI3LDB4MjYsMHg4YiwweDM2LDB4MDYsMHgwMCwweDJlLDB4ZmYsMHg5NAorLDB4ZGMsMHgyMywweDA3LDB4MWYsMHg1OCwweGNmLDB4ZTgsMHg4YSwweDAwLDB4ZTUsMHgwMCwweDBkLDB4MTgsMHgwMCwweGU3LDB4MDAKKywweGU4LDB4NDksMHgwMCwweGMzLDB4NTMsMHhmNywweDA2LDB4ZWYsMHgzNCwweDIwLDB4MDAsMHg3NSwweDJkLDB4ZTUsMHg4YywweDI1CissMHgwMCwweDcwLDB4OGIsMHhkOCwweGU1LDB4OGMsMHgyNSwweDAwLDB4NzAsMHgzYiwweGMzLDB4NzQsMHgwNSwweDhiLDB4ZDgsMHhlOQorLDB4ZjIsMHhmZiwweDNkLDB4MDAsMHgzMCwweDc1LDB4MTAsMHhlNSwweDAyLDB4MjUsMHhlZiwweGZmLDB4ZTcsMHgwMiwweGM3LDB4MDYKKywweGUwLDB4M2EsMHhmZiwweGZmLDB4ZTksMHgwMywweDAwLDB4ZTgsMHgxMiwweDAwLDB4NWIsMHhjMywweGEzLDB4MjMsMHg5NiwweDIzCissMHhhNCwweDIzLDB4YTQsMHgyMywweDk2LDB4MjMsMHhhNCwweDIzLDB4OTYsMHgyMywweDk2LDB4MjMsMHgyNiwweGEwLDB4MjksMHgwMAorLDB4YTIsMHgxYiwweDM3LDB4MjYsMHhjNywweDA2LDB4MGMsMHgwMCwweGZmLDB4N2YsMHgyNiwweGExLDB4MGUsMHgwMCwweGU3LDB4OWMKKywweDI2LDB4YTEsMHgwOCwweDAwLDB4ZTcsMHg5YSwweGU1LDB4MDAsMHgyNSwweGZmLDB4NTMsMHgyNiwweDhiLDB4MzYsMHgwNiwweDAwCissMHg4MywweGU2LDB4MGUsMHgyZSwweDBiLDB4ODQsMHhhZCwweDI1LDB4ZTcsMHgwMCwweGMzLDB4MDYsMHgxZSwweDY4LDB4OGIsMHgyNQorLDB4NmEsMHgwMCwweDFmLDB4ODMsMHgwZSwweGVmLDB4MzQsMHgyMCwweDgzLDB4MGUsMHg5YiwweDM2LDB4MDgsMHhlNSwweDAwLDB4MjUKKywweGVmLDB4ZmYsMHgwZCwweDA4LDB4MDAsMHhlNywweDAwLDB4ZTUsMHgwMCwweGE5LDB4MTAsMHgwMCwweDc1LDB4MDEsMHhjMywweGU1CissMHgwMCwweGE5LDB4MTAsMHgwMCwweDc1LDB4ZjksMHhjMywweDUwLDB4NTMsMHg1MSwweDU2LDB4MDYsMHgxZSwweDMzLDB4YzAsMHg4ZQorLDB4ZDgsMHhiOCwweDA1LDB4MDAsMHhlNywweDg0LDB4ZTUsMHgwOCwweDBkLDB4MDAsMHgwNCwweDI1LDB4ZmYsMHgwNCwweGU3LDB4MDgKKywweGU1LDB4MDAsMHgwZCwweDE4LDB4MDAsMHhlNywweDAwLDB4ZTUsMHgwMiwweDBkLDB4MTEsMHgwMCwweGU3LDB4MDIsMHgxZiwweDA3CissMHg1ZSwweDU5LDB4NWIsMHg1OCwweGMzLDB4NTAsMHgxZSwweDMzLDB4YzAsMHg4ZSwweGQ4LDB4YzcsMHgwNiwweGVmLDB4MzQsMHgwMAorLDB4MDAsMHg4MywweDI2LDB4OWIsMHgzNiwweGY3LDB4ZTUsMHgwMCwweDBkLDB4MTgsMHgwMCwweGU3LDB4MDAsMHhlNSwweDAyLDB4MGQKKywweDExLDB4MDAsMHhlNywweDAyLDB4MWYsMHg1OCwweGNmLDB4NjAsMHgwNiwweDFlLDB4NjgsMHg4NywweDI1LDB4NmEsMHgwMCwweDFmCissMHhlOCwweDE2LDB4ZjUsMHhjMywweDA2LDB4MWUsMHg2OCwweDhiLDB4MjUsMHg2YSwweDAwLDB4MWYsMHg4ZSwweGMwLDB4MjYsMHg4MworLDB4M2UsMHgwYSwweDAwLDB4MDAsMHg3NCwweDAzLDB4ZTgsMHg0MywweDAwLDB4MjYsMHhjNywweDA2LDB4MGEsMHgwMCwweGZmLDB4ZmYKKywweDI2LDB4OGIsMHgxNiwweDA2LDB4MDAsMHg4ZSwweDFlLDB4OGUsMHgwMSwweDhjLDB4ZDgsMHg4YiwweGNhLDB4ODMsMHgzZSwweDAwCissMHgwMCwweGZmLDB4OGUsMHgxZSwweDAwLDB4MDAsMHg3NCwweDBhLDB4MmIsMHgxNiwweDA4LDB4MDAsMHg3MywweGViLDB4MjksMHgwZQorLDB4MDgsMHgwMCwweDI2LDB4ODksMHgwZSwweDA4LDB4MDAsMHgyNiwweDhjLDB4MWUsMHgwMCwweDAwLDB4OGUsMHhkOCwweDhjLDB4MDYKKywweDAwLDB4MDAsMHhjMywweDYwLDB4MDYsMHgxZSwweDY4LDB4ODcsMHgyNSwweDZhLDB4MDAsMHgxZiwweDhlLDB4YzAsMHg4YiwweGM4CissMHg4ZSwweDFlLDB4OGUsMHgwMSwweDI2LDB4YzcsMHgwNiwweDBhLDB4MDAsMHgwMCwweDAwLDB4OGMsMHhkOCwweDgzLDB4M2UsMHgwMAorLDB4MDAsMHhmZiwweDc0LDB4MjUsMHgzYiwweDBlLDB4MDAsMHgwMCwweDhlLDB4MWUsMHgwMCwweDAwLDB4NzUsMHhlZCwweDhlLDB4ZDgKKywweDI2LDB4YTEsMHgwMCwweDAwLDB4YTMsMHgwMCwweDAwLDB4M2QsMHhmZiwweGZmLDB4NzQsMHg1NiwweDhlLDB4ZDgsMHgyNiwweGExCissMHgwOCwweDAwLDB4MDEsMHgwNiwweDA4LDB4MDAsMHhlOSwweDQ5LDB4MDAsMHgyNiwweDhlLDB4MWUsMHgwMiwweDAwLDB4YmUsMHgxOAorLDB4MDAsMHg4MywweDNjLDB4ZmYsMHg3NCwweDNjLDB4MzksMHgwYywweDc0LDB4MTksMHg4ZSwweDFjLDB4YmUsMHgwMCwweDAwLDB4ODMKKywweDNlLDB4MDAsMHgwMCwweGZmLDB4NzQsMHgyYywweDM5LDB4MGUsMHgwMCwweDAwLDB4NzQsMHgwNywweDhlLDB4MWUsMHgwMCwweDAwCissMHhlOSwweGVjLDB4ZmYsMHgyNiwweGExLDB4MDAsMHgwMCwweDg5LDB4MDQsMHgzMywweGM5LDB4OGUsMHhkOSwweDNkLDB4ZmYsMHhmZgorLDB4NzUsMHgxMCwweDgzLDB4ZmUsMHgxOCwweDc1LDB4MGIsMHgyNiwweDhlLDB4MWUsMHgwMiwweDAwLDB4ODEsMHgyNiwweDA4LDB4MDAKKywweDdmLDB4ZmYsMHgzMywweGMwLDB4OGUsMHhkOCwweGMzLDB4MWYsMHgwNywweDYxLDB4Y2YsMHgxZiwweDA3LDB4Y2YsMHg2MCwweDA2CissMHgxZSwweDY4LDB4ODcsMHgyNSwweDZhLDB4MDAsMHgxZiwweGU1LDB4MDYsMHgyNSwweDFlLDB4MDAsMHgzZCwweDFlLDB4MDAsMHg3NQorLDB4ZjYsMHhiOSwweDA4LDB4MDAsMHhlNSwweDU4LDB4ZTcsMHg1YSwweDIzLDB4YzAsMHhlMCwweGY4LDB4YzMsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGFjLDB4MDAsMHgwMCwweDAwLDB4YTgsMHgwMCwweDhjLDB4MDIsMHgwNCwweDAwCissMHgwMCwweDA4LDB4MTAsMHgyMCwweDAwLDB4ZmYsMHgwZSwweDBjLDB4MGMsMHgwYSwweDBhLDB4MGEsMHgwYSwweDA4LDB4MDgsMHgwOAorLDB4MDgsMHgwOCwweDA4LDB4MDgsMHgwOCwweDA2LDB4MDYsMHgwNiwweDA2LDB4MDYsMHgwNiwweDA2LDB4MDYsMHgwNiwweDA2LDB4MDYKKywweDA2LDB4MDYsMHgwNiwweDA2LDB4MDYsMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0CissMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwNAorLDB4MDQsMHgwNCwweDA0LDB4MDQsMHgwNCwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIKKywweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyCissMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMgorLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIKKywweDAyLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MDAsMHgxNCwweDAwLDB4MTAsMHgwMCwweDBjLDB4MDAsMHhmZiwweDdmLDB4ZmYKKywweGJmLDB4ZmYsMHhkZiwweGZmLDB4ZWYsMHhmZiwweGY3LDB4ZmYsMHhmYiwweGZmLDB4ZmQsMHhmZiwweGZlLDB4N2YsMHhmZiwweGJmCissMHhmZiwweGRmLDB4ZmYsMHhlZiwweGZmLDB4ZjcsMHhmZiwweGZiLDB4ZmYsMHhmZCwweGZmLDB4ZmUsMHhmZiwweDAwLDB4MDAsMHgwMAorLDB4ODAsMHgzZSwweGUyLDB4MzQsMHgwMSwweDc2LDB4MDMsMHhlOSwweGE1LDB4MDAsMHhiOCwweDAwLDB4MDAsMHhlNywweDRlLDB4YjkKKywweDI4LDB4MDAsMHhlMiwweGZlLDB4YzYsMHgwNiwweDQ1LDB4MzcsMHgwMiwweGJmLDB4M2YsMHgyOCwweDJlLDB4OGIsMHg0NSwweDA4CissMHhlNywweDRlLDB4YjksMHgyOCwweDAwLDB4ZTIsMHhmZSwweDJlLDB4OGIsMHgxZCwweGM3LDB4MDYsMHhiMywweDM2LDB4NDAsMHgxMQorLDB4YzcsMHgwNiwweGIxLDB4MzYsMHgyNywweDAwLDB4YzcsMHgwNiwweDQ2LDB4MzcsMHgwMiwweDAwLDB4YzcsMHgwNiwweDQ4LDB4MzcKKywweDY0LDB4MDAsMHhmNywweDA2LDB4YjUsMHgzNiwweDAyLDB4MDAsMHg3NSwweDFjLDB4MmUsMHgwYiwweDVkLDB4MDIsMHg4MSwweDI2CissMHhiMywweDM2LDB4ZmYsMHhmZSwweGM3LDB4MDYsMHhiMSwweDM2LDB4OWMsMHgwMCwweGM3LDB4MDYsMHg0NiwweDM3LDB4MDgsMHgwMAorLDB4YzcsMHgwNiwweDQ4LDB4MzcsMHg5MCwweDAxLDB4ODksMHgxZSwweGI3LDB4MzYsMHg4OSwweDFlLDB4ZmUsMHgzMywweGJlLDB4MjAKKywweDAwLDB4OGIsMHhjMywweGU3LDB4NGUsMHhiOSwweDI4LDB4MDAsMHhlMiwweGZlLDB4MmUsMHg4YiwweDQ1LDB4MDQsMHhlNywweDRlCissMHhiOSwweDI4LDB4MDAsMHhlMiwweGZlLDB4ZTUsMHg0ZSwweDhiLDB4Y2IsMHgyZSwweDIzLDB4NDUsMHgwNiwweDJlLDB4MjMsMHg0ZAorLDB4MDYsMHgzYSwweGMxLDB4NzQsMHgzNiwweDRlLDB4NzUsMHhkOSwweDgwLDB4M2UsMHg0NSwweDM3LDB4MDAsMHg3NCwweDBiLDB4YzYKKywweDA2LDB4NDUsMHgzNywweDAwLDB4YmYsMHgyZiwweDI4LDB4ZTksMHg3MiwweGZmLDB4YzYsMHgwNiwweDQ1LDB4MzcsMHgwMSwweGY3CissMHgwNiwweGI1LDB4MzYsMHgwMiwweDAwLDB4NzQsMHgxNCwweGU1LDB4Y2UsMHgyNSwweGZkLDB4ZmYsMHhlNywweGNlLDB4ZTgsMHg0MworLDB4MDAsMHhlNSwweGNlLDB4MGQsMHgwMiwweDAwLDB4ZTcsMHhjZSwweGU4LDB4MzksMHgwMCwweDgwLDB4M2UsMHhlMiwweDM0LDB4MDEKKywweDc2LDB4MDEsMHhjMywweGI4LDB4ZWEsMHgwNSwweGU3LDB4OGMsMHhmYSwweGU4LDB4MTIsMHhmNCwweGZiLDB4OGQsMHgwNiwweGQwCissMHgzOSwweDhiLDB4ZDgsMHhjMSwweGU4LDB4MDQsMHhhMywweDM4LDB4MzQsMHg4ZSwweGMwLDB4YTEsMHgzMCwweDM0LDB4MjYsMHhhMworLDB4MDIsMHgwMCwweDI2LDB4YzcsMHgwNiwweDAwLDB4MDAsMHhmZiwweGZmLDB4ODMsMHhjMywweDE4LDB4ZDEsMHhlYiwweDI2LDB4ODkKKywweDFlLDB4MDgsMHgwMCwweGMzLDB4ZTUsMHgwMiwweDBkLDB4MDAsMHg0MCwweGU3LDB4MDIsMHhlNSwweDAwLDB4MGQsMHgwNCwweDAwCissMHhlNywweDAwLDB4YjgsMHgwMCwweDAwLDB4ZTcsMHgwYSwweGU1LDB4MGEsMHhhOSwweDAwLDB4ODAsMHg3NSwweDE0LDB4ZTUsMHgwOAorLDB4MGQsMHgwMCwweDEwLDB4ZTcsMHgwOCwweGU1LDB4MGEsMHgwZCwweDAwLDB4MDgsMHhiOSwweDA1LDB4MDAsMHhlNywweDBhLDB4ZTIKKywweGZjLDB4YzMsMHhlNSwweDA4LDB4MGQsMHgwMCwweDEwLDB4YjksMHgwNSwweDAwLDB4ZTcsMHgwOCwweGUyLDB4ZmMsMHhjMywweDA0CissMHgwYywweDIwLDB4MDAsMHgwMSwweDBjLDB4N2UsMHhmZiwweDAwLDB4MGMsMHgwMiwweDAwLDB4MTAsMHgwMCwweDQwLDB4MDAsMHgwYworLDB4YzYsMHgwMSwweDAwLDB4MDAsMHhjMCwweGY3LDB4ZmYsMHgwMCwweGMwLDB4MDIsMHgwMCwweDEwLDB4MDAsMHg0MCwweDAwLDB4MDAKKywweDMzLDB4YzAsMHg4ZSwweGQ4LDB4OGQsMHgzZSwweDcyLDB4NDksMHg4ZCwweDM2LDB4YjAsMHgzNywweGI5LDB4MTQsMHgwMCwweDhiCissMHgxZSwweDMwLDB4MzQsMHg4OSwweDVjLDB4MDIsMHgyZSwweDhiLDB4NDUsMHgwMiwweDg5LDB4NDQsMHgwNiwweDJlLDB4OGIsMHgwNQorLDB4ODksMHg0NCwweDA0LDB4ODMsMHhjNywweDA0LDB4ODMsMHhjNiwweDEwLDB4ZTIsMHhlOCwweGM2LDB4MDYsMHg5ZSwweDM2LDB4MGUKKywweGU4LDB4ZmQsMHgyNiwweDY4LDB4ODMsMHgyOCwweGExLDB4YWEsMHgwMiwweGNkLDB4MzUsMHg4MywweDNlLDB4YTEsMHgzNiwweDAwCissMHg3NCwweDAzLDB4ZTksMHgzYiwweDI3LDB4MzMsMHhmZiwweDhlLDB4MDYsMHhhNiwweDAyLDB4OGIsMHgzNiwweGE0LDB4MDIsMHgyZQorLDB4ZmYsMHhhNCwweDJlLDB4MzAsMHg4MywweDBlLDB4OTksMHgzNiwweDA0LDB4YzcsMHgwNiwweDM3LDB4MzcsMHgwMSwweDAwLDB4YzYKKywweDA2LDB4Y2EsMHgzNCwweDAxLDB4ZTksMHg3ZCwweDE5LDB4ODAsMHgzZSwweGEwLDB4MzYsMHgwOCwweDc0LDB4ZTYsMHg4MCwweDI2CissMHg5ZSwweDM2LDB4ZmYsMHg3NSwweDFhLDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDIwLDB4NzQsMHgxMiwweGY3LDB4MDYsMHg5YgorLDB4MzYsMHgwMywweDAwLDB4NzUsMHgwYSwweDgzLDB4MGUsMHg2NiwweDM3LDB4MTAsMHhjNiwweDA2LDB4YTAsMHgzNiwweDA4LDB4ZTkKKywweGZiLDB4MDEsMHg4MCwweDNlLDB4OWUsMHgzNiwweDAyLDB4NzUsMHhjZSwweGM2LDB4MDYsMHhhMCwweDM2LDB4MDYsMHhlOSwweGVjCissMHgwMSwweGMzLDB4ZTksMHhlOCwweDAxLDB4MjYsMHhjNywweDA2LDB4MGEsMHgwMCwweDAwLDB4MDAsMHgyNiwweGZmLDB4MjYsMHgwNAorLDB4MDAsMHhhMSwweGQxLDB4MzYsMHgyNiwweDM5LDB4MDYsMHgxYSwweDAwLDB4NzUsMHgyMiwweGExLDB4ZDMsMHgzNiwweDI2LDB4MzkKKywweDA2LDB4MWMsMHgwMCwweDc1LDB4MTgsMHhhMSwweGQ1LDB4MzYsMHgyNiwweDM5LDB4MDYsMHgxZSwweDAwLDB4NzUsMHgwZSwweDI2CissMHhmNywweDA2LDB4MGMsMHgwMCwweDQwLDB4MDAsMHg3NCwweDA1LDB4ODMsMHgwZSwweDY2LDB4MzcsMHg0MCwweDgxLDB4MGUsMHhhZgorLDB4MzYsMHgwMCwweDEwLDB4YTEsMHhhZiwweDM2LDB4ZTcsMHgwNiwweDgwLDB4M2UsMHg5ZCwweDM2LDB4MDIsMHg3NSwweDA2LDB4Y2QKKywweDM0LDB4ZTksMHhhMiwweDFhLDB4YzMsMHhmNywweDA2LDB4OWIsMHgzNiwweDEwLDB4MDAsMHg3NSwweDU0LDB4MjYsMHhmNiwweDA2CissMHgwYSwweDAwLDB4ZmYsMHg3NSwweDRjLDB4MjYsMHhhMCwweDE5LDB4MDAsMHgyNCwweGMwLDB4M2MsMHg0MCwweDc1LDB4MTEsMHg4MAorLDB4M2UsMHg5NSwweDM2LDB4MDAsMHg3NCwweDNiLDB4MjYsMHhjNywweDA2LDB4MDQsMHgwMCwweGZmLDB4ZmYsMHhlOSwweDMxLDB4MDAKKywweGU4LDB4ZjEsMHgwNCwweGY3LDB4MDYsMHg5YiwweDM2LDB4MDMsMHgwMCwweDc0LDB4MmYsMHg4YiwweGQ4LDB4YjgsMHg3ZCwweDAzCissMHhjZCwweDNhLDB4OGIsMHhjMywweGM2LDB4MDYsMHhhMCwweDM2LDB4MDYsMHhmNywweDA2LDB4OWIsMHgzNiwweDAyLDB4MDAsMHg3NQorLDB4MDUsMHhjNiwweDA2LDB4YTAsMHgzNiwweDA0LDB4ODEsMHgwZSwweDliLDB4MzYsMHg4MCwweDAwLDB4ODMsMHgyNiwweDliLDB4MzYKKywweGZjLDB4ZTksMHgyMywweDAxLDB4ZTgsMHg4NywweDFkLDB4ZTksMHgzMywweDAxLDB4NTAsMHgyNiwweGExLDB4MGMsMHgwMCwweDI1CissMHgwNywweDAwLDB4M2QsMHgwNywweDAwLDB4NzUsMHgwMywweGU5LDB4ODQsMHgwMCwweDNkLDB4MDUsMHgwMCwweDc1LDB4MDMsMHhlOQorLDB4N2MsMHgwMCwweDgzLDB4M2UsMHhlOCwweDNhLDB4MDQsMHg3NCwweDc1LDB4ODMsMHgzZSwweGU4LDB4M2EsMHgwMiwweDc0LDB4NmUKKywweGY3LDB4MDYsMHhlNiwweDM0LDB4MTgsMHg4MCwweDc1LDB4MDMsMHhlOSwweDZhLDB4MDAsMHhmNywweDA2LDB4ZTYsMHgzNCwweDAwCissMHg4MCwweDc0LDB4MzUsMHgyNiwweDgwLDB4M2UsMHgyOSwweDAwLDB4MDIsMHg3NSwweDJkLDB4NTEsMHg1NiwweDU3LDB4OGQsMHgzNgorLDB4M2UsMHgzNCwweDhkLDB4M2UsMHgyMCwweDAwLDB4YjksMHgwNiwweDAwLDB4ZjMsMHhhNiwweDVmLDB4NWUsMHg1OSwweDc0LDB4NDUKKywweDI2LDB4YTEsMHgyMCwweDAwLDB4YTMsMHgzZSwweDM0LDB4MjYsMHhhMSwweDIyLDB4MDAsMHhhMywweDQwLDB4MzQsMHgyNiwweGExCissMHgyNCwweDAwLDB4YTMsMHg0MiwweDM0LDB4ZTksMHgyNiwweDAwLDB4ZjcsMHgwNiwweGU2LDB4MzQsMHgwOCwweDAwLDB4NzQsMHgwYgorLDB4MjYsMHg4MCwweDNlLDB4MTksMHgwMCwweDAwLDB4NzQsMHgwMywweGU5LDB4MTMsMHgwMCwweGY3LDB4MDYsMHhlNiwweDM0LDB4MTAKKywweDAwLDB4NzQsMHgxMiwweDI2LDB4YTAsMHgyOCwweDAwLDB4YzAsMHhlOCwweDA0LDB4MjIsMHhjMCwweDc0LDB4MDcsMHgyNiwweGM3CissMHgwNiwweDA0LDB4MDAsMHhmZiwweGZmLDB4NTgsMHgyMywweGMwLDB4NzQsMHgwMywweGU5LDB4NTcsMHhmZiwweDgxLDB4MjYsMHg5YgorLDB4MzYsMHhmZiwweGZlLDB4ODMsMHhmZSwweDA2LDB4N2YsMHgyNCwweDI2LDB4YTEsMHgyMCwweDAwLDB4M2IsMHgwNiwweGQxLDB4MzYKKywweDc1LDB4MWEsMHgyNiwweGExLDB4MjIsMHgwMCwweDNiLDB4MDYsMHhkMywweDM2LDB4NzUsMHgxMCwweDI2LDB4YTEsMHgyNCwweDAwCissMHgzYiwweDA2LDB4ZDUsMHgzNiwweDc1LDB4MDYsMHg4MSwweDBlLDB4OWIsMHgzNiwweDAwLDB4MDEsMHgyNiwweGExLDB4MjAsMHgwMAorLDB4MjUsMHg3ZiwweGZmLDB4YTMsMHhiOCwweDM0LDB4MjYsMHhhMSwweDIyLDB4MDAsMHhhMywweGJhLDB4MzQsMHgyNiwweGExLDB4MjQKKywweDAwLDB4YTMsMHhiYywweDM0LDB4OGIsMHhjNiwweDg2LDB4YzQsMHhhMywweGMwLDB4MzQsMHhkMSwweGU2LDB4ODAsMHhmYywweDA5CissMHg3NCwweDAzLDB4ZTgsMHhhYSwweDFjLDB4OGIsMHhjNiwweDJlLDB4ZmYsMHhhNCwweDMwLDB4NDksMHgyNiwweGExLDB4MGMsMHgwMAorLDB4M2QsMHhmZiwweDdmLDB4NzQsMHgwZiwweDI2LDB4ZmYsMHgyNiwweDA0LDB4MDAsMHg4ZSwweDA2LDB4MzgsMHgzNCwweGU4LDB4MzYKKywweDA2LDB4Y2QsMHg1MCwweGMzLDB4ZTksMHgxNiwweDAwLDB4Y2QsMHgzNCwweGU5LDB4MTEsMHgwMCwweGNkLDB4MzQsMHg4OSwweDM2CissMHgzZCwweDM3LDB4YTEsMHg5ZCwweDM2LDB4YTMsMHgzZiwweDM3LDB4YzYsMHgwNiwweGEwLDB4MzYsMHgwYywweGU4LDB4OGUsMHgwMAorLDB4YTEsMHg5ZiwweDM2LDB4MjIsMHhlNCwweDc1LDB4MzIsMHhmNywweDA2LDB4NGMsMHgzNywweDAxLDB4MDAsMHg3NSwweDJhLDB4ZjYKKywweDA2LDB4OWQsMHgzNiwweDgwLDB4NzQsMHgwNywweDg4LDB4MjYsMHg5ZSwweDM2LDB4ZTksMHgzMSwweDAwLDB4M2EsMHgwNiwweDlkCissMHgzNiwweGEzLDB4OWQsMHgzNiwweDc0LDB4MjgsMHg4YiwweGYwLDB4MmUsMHhmZiwweGE0LDB4MGQsMHgyYiwweDQ0LDB4MjksMHhlZQorLDB4NDIsMHgxOSwweDQ0LDB4Y2QsMHg0NCwweDJmLDB4NDUsMHg1YSwweDQ1LDB4M2EsMHgyNiwweDllLDB4MzYsMHg3NSwweDAxLDB4YzMKKywweDMyLDB4YzAsMHg4NiwweGM0LDB4OGIsMHhmMCwweGEyLDB4OWUsMHgzNiwweDJlLDB4ZmYsMHhhNCwweDIwLDB4NDksMHg4YiwweDJlCissMHg5OSwweDM2LDB4MjMsMHhlZCwweDc1LDB4MDEsMHhjMywweGJmLDB4MDEsMHgwMCwweGJlLDB4MDAsMHgwMCwweDg1LDB4ZmQsMHg3NQorLDB4MWEsMHg0NiwweGQxLDB4ZTcsMHhlOSwweGY2LDB4ZmYsMHgyYSwweDAwLDB4MjksMHgwMCwweDI4LDB4MDAsMHgyNywweDAwLDB4MjUKKywweDAwLDB4MDUsMHgwMCwweDA3LDB4MDAsMHgyNiwweDAwLDB4MDYsMHgwMCwweDIwLDB4MDAsMHhmNywweGQ3LDB4MjEsMHgzZSwweDk5CissMHgzNiwweGQxLDB4ZTYsMHgyZSwweDhiLDB4YjQsMHg0NywweDJiLDB4ZTksMHg0ZiwweGZmLDB4ZTksMHg1NiwweGZmLDB4ODAsMHgyNgorLDB4OWUsMHgzNiwweGZmLDB4NzUsMHgxNywweGY3LDB4MDYsMHg0YywweDM3LDB4MDEsMHgwMCwweDc1LDB4MGYsMHhmNiwweDA2LDB4OWQKKywweDM2LDB4ODAsMHg3NCwweDA4LDB4ZjcsMHgwNiwweDY2LDB4MzcsMHhmZiwweGZmLDB4NzUsMHgwNywweGM3LDB4MDYsMHg2NiwweDM3CissMHgwMCwweDAwLDB4YzMsMHhmNywweDA2LDB4NDEsMHgzNywweDAxLDB4MDAsMHg3NSwweDBiLDB4YjgsMHg3ZiwweDAzLDB4Y2QsMHgzOQorLDB4YzcsMHgwNiwweDQxLDB4MzcsMHgwMSwweDAwLDB4MzMsMHhmNiwweGI4LDB4MDAsMHg0MCwweDg1LDB4MDYsMHg2NiwweDM3LDB4NzQKKywweDIxLDB4ODAsMHhiYywweDU0LDB4MzcsMHhmZiwweDc0LDB4MDQsMHhmZSwweDg0LDB4NTQsMHgzNywweDgwLDB4YmMsMHg5NiwweDM0CissMHhmZiwweDc0LDB4MDQsMHhmZSwweDg0LDB4OTYsMHgzNCwweDMxLDB4MDYsMHg2NiwweDM3LDB4ODMsMHgzZSwweDY2LDB4MzcsMHgwMAorLDB4NzQsMHgwNSwweDQ2LDB4ZDEsMHhlOCwweDczLDB4ZDQsMHhjMywweGExLDB4ZjQsMHgzMywweGE5LDB4MDAsMHg4OCwweDc0LDB4MGIKKywweGE5LDB4MDAsMHgxMCwweDc1LDB4MDksMHg4YiwweDFlLDB4NDMsMHgzNywweGZmLDB4ZTMsMHhlOSwweGQ3LDB4MDAsMHhjNywweDA2CissMHgzNSwweDM3LDB4MDUsMHgwMCwweGM3LDB4MDYsMHg0MywweDM3LDB4MWUsMHgyYywweGY3LDB4MDYsMHhmNCwweDMzLDB4MDAsMHgwOAorLDB4NzQsMHgwNiwweGM3LDB4MDYsMHg0MywweDM3LDB4MTAsMHgyYywweGI4LDB4ODAsMHgwMywweGNkLDB4MzksMHhlOSwweGNkLDB4ZmUKKywweGE5LDB4MDAsMHgwOCwweDc0LDB4ZDksMHhmZiwweDBlLDB4MzUsMHgzNywweDc1LDB4ZWQsMHhlOSwweDY2LDB4MDAsMHhhOSwweDAwCissMHgwOCwweDc1LDB4Y2IsMHhmZiwweDBlLDB4MzUsMHgzNywweDc1LDB4ZGYsMHg4MSwweDBlLDB4YzIsMHgzNCwweGMwLDB4MDAsMHhmNgorLDB4MDYsMHg5ZCwweDM2LDB4ODAsMHg3NCwweDQ4LDB4ODEsMHgwZSwweDliLDB4MzYsMHgwMCwweDgwLDB4ZjcsMHgwNiwweDliLDB4MzYKKywweDAxLDB4MDAsMHg3NCwweDFlLDB4YjgsMHg3ZCwweDAzLDB4Y2QsMHgzYSwweDgxLDB4MGUsMHg5YiwweDM2LDB4ODAsMHgwMCwweDgzCissMHgyNiwweDliLDB4MzYsMHhmZSwweGM3LDB4MDYsMHgwZiwweDM3LDB4MDIsMHgwMCwweGM2LDB4MDYsMHhhMCwweDM2LDB4MDQsMHhlOQorLDB4N2IsMHhmZSwweDgwLDB4M2UsMHhhMCwweDM2LDB4MDQsMHg3NSwweDA3LDB4ODMsMHgzZSwweDBmLDB4MzcsMHgwMSwweDc1LDB4MDUKKywweGM2LDB4MDYsMHhhMCwweDM2LDB4MDYsMHhjNywweDA2LDB4MGYsMHgzNywweDAyLDB4MDAsMHhlOSwweDVmLDB4ZmUsMHhiZSwweDAyCissMHgwMCwweGU5LDB4NGEsMHhmZSwweDgwLDB4MjYsMHg5ZSwweDM2LDB4ZmYsMHg3NSwweDNhLDB4ZjYsMHgwNiwweDlkLDB4MzYsMHg4MAorLDB4NzQsMHgyZCwweGY3LDB4MDYsMHg5YiwweDM2LDB4MDAsMHgyMCwweDc1LDB4MmIsMHhjNiwweDA2LDB4YTAsMHgzNiwweDA2LDB4ZmYKKywweDA2LDB4OTQsMHgzNCwweDgzLDB4MGUsMHg2NiwweDM3LDB4MjAsMHg4ZSwweDA2LDB4MzAsMHgzNCwweDI2LDB4ZjcsMHgwNiwweDBhCissMHgwMCwweDAwLDB4MDEsMHg3NCwweDA3LDB4MjYsMHg4MSwweDBlLDB4MDgsMHgwMCwweDAwLDB4MDEsMHhlOSwweDA2LDB4MDAsMHhiZQorLDB4MDQsMHgwMCwweGU5LDB4MDksMHhmZSwweDgxLDB4MGUsMHhhZiwweDM2LDB4MDAsMHgwOCwweGExLDB4YWYsMHgzNiwweGU3LDB4MDYKKywweGU1LDB4MGEsMHhhOSwweDAwLDB4ODAsMHg3NCwweDBlLDB4ODEsMHgyNiwweGFmLDB4MzYsMHhmZiwweGY3LDB4YTEsMHhhZiwweDM2CissMHhlNywweDA2LDB4ZTksMHgwOSwweGZmLDB4ZTksMHhmNSwweGZkLDB4YzcsMHgwNiwweDQxLDB4MzcsMHgwMCwweDAwLDB4ODMsMHgwZQorLDB4OTksMHgzNiwweDAyLDB4ZTksMHhlNywweGZkLDB4ODAsMHgyNiwweDllLDB4MzYsMHhmZiwweDc1LDB4MWQsMHhmNywweDA2LDB4OWIKKywweDM2LDB4MDAsMHg0MCwweDc1LDB4MDUsMHg4MywweDBlLDB4OTksMHgzNiwweDA4LDB4ODMsMHgwZSwweDk5LDB4MzYsMHgyMCwweDgxCissMHgyNiwweDliLDB4MzYsMHhmZiwweGJmLDB4YjgsMHg4NSwweDAzLDB4Y2QsMHgzOSwweGU5LDB4YzAsMHhmZCwweDgwLDB4M2UsMHg5ZQorLDB4MzYsMHgwNiwweDc0LDB4MDcsMHg4MCwweDNlLDB4OWUsMHgzNiwweDBhLDB4NzUsMHgzNCwweGY2LDB4MDYsMHg5ZCwweDM2LDB4ODAKKywweDc1LDB4MDYsMHhiZSwweDA3LDB4MDAsMHhlOSwweDk2LDB4ZmQsMHhjNiwweDA2LDB4YTAsMHgzNiwweDA0LDB4ODMsMHgzZSwweDBmCissMHgzNywweDAyLDB4NzQsMHgxYiwweGM3LDB4MDYsMHgwZiwweDM3LDB4MDQsMHgwMCwweDgwLDB4M2UsMHg5ZSwweDM2LDB4MDYsMHg3NQorLDB4MGUsMHhmNywweDA2LDB4OWIsMHgzNiwweDQwLDB4MDAsMHg3NSwweDA2LDB4YzcsMHgwNiwweDBmLDB4MzcsMHgwMywweDAwLDB4ZTkKKywweDdiLDB4ZmQsMHg4MCwweDNlLDB4OWQsMHgzNiwweDA0LDB4NzUsMHgxMiwweDgxLDB4MGUsMHhjMiwweDM0LDB4MDAsMHg0MCwweGZmCissMHgwNiwweDkyLDB4MzQsMHhjNiwweDA2LDB4YTAsMHgzNiwweDA2LDB4ZTksMHg2MiwweGZkLDB4YmUsMHgwNSwweDAwLDB4ZTksMHg0ZAorLDB4ZmQsMHhmNiwweDA2LDB4OWQsMHgzNiwweDgwLDB4NzUsMHgxOSwweDgzLDB4MGUsMHhjMiwweDM0LDB4MDQsMHhiZSwweDA2LDB4MDAKKywweGU5LDB4M2IsMHhmZCwweDgwLDB4MjYsMHg5ZSwweDM2LDB4ZmYsMHg3NSwweGM1LDB4ZmYsMHgwNiwweDMxLDB4MzcsMHhlOSwweDAwCissMHgwMCwweDgzLDB4MjYsMHhjMiwweDM0LDB4YmYsMHhjNiwweDA2LDB4YTAsMHgzNiwweDA2LDB4ZTksMHgyZiwweGZkLDB4ZTUsMHgwYQorLDB4NTAsMHgyNSwweGMzLDB4YmYsMHhlNywweDBhLDB4NTgsMHg4MCwweDI2LDB4OWUsMHgzNiwweGZmLDB4NzUsMHgwZCwweGE5LDB4MDAKKywweDQwLDB4NzUsMHgwOCwweGM2LDB4MDYsMHhhMCwweDM2LDB4MDYsMHhlOSwweDEyLDB4ZmQsMHhiOCwweDgzLDB4MDMsMHhjZCwweDM5CissMHhjMywweGI4LDB4N2MsMHgwMywweGNkLDB4MzksMHhmNywweDA2LDB4ZjQsMHgzMywweDAwLDB4MTAsMHg3NSwweDA5LDB4YzcsMHgwNgorLDB4MzMsMHgzNywweDAyLDB4MDAsMHhlOSwweGY2LDB4ZmMsMHhmZiwweDBlLDB4MzMsMHgzNywweDc0LDB4MDMsMHhlOSwweGVkLDB4ZmMKKywweGZmLDB4MDYsMHg4ZSwweDM0LDB4ZTgsMHhmNywweDE5LDB4ODMsMHgwZSwweGMyLDB4MzQsMHgwOCwweGJlLDB4MDMsMHgwMCwweGU5CissMHhjYywweGZjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDA0LDB4MDQsMHgwNQorLDB4MDQsMHgwNCwweDA0LDB4MDAsMHgwMywweDAwLDB4MDMsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDQsMHgwMCwweDA4LDB4MDgsMHgwNSwweDA4LDB4MDgsMHgwOCwweDAwLDB4MDMsMHgwMCwweDAzLDB4MDMsMHgwMCwweDAwCissMHgwMiwweDA0LDB4MDQsMHgwNCwweDA0LDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDBhLDB4MTQsMHgwMCwweDAwLDB4MWEsMHgwMAorLDB4MWMsMHgwMCwweDFlLDB4MjAsMHgwMCwweDAwLDB4MDQsMHg0MSwweDA2LDB4MGIsMHgwOCwweGMyLDB4ZmYsMHhlNywweDA0LDB4MDMKKywweDA2LDB4MDQsMHgwNCwweDA1LDB4MDQsMHgwNiwweDA0LDB4ODcsMHgwNCwweDAzLDB4MDYsMHgwNCwweDA0LDB4ODUsMHg0ZSwweGEyCissMHgwNCwweGNmLDB4MDQsMHhjZCwweGM3LDB4MDYsMHhhMiwweDM3LDB4MDAsMHgwMCwweGM3LDB4MDYsMHhhNiwweDM3LDB4MDAsMHgwMAorLDB4MjYsMHhhMSwweDIwLDB4MDAsMHgyNSwweDdmLDB4ZmYsMHhhMywweGY1LDB4MzYsMHgyNiwweGExLDB4MjIsMHgwMCwweGEzLDB4ZjcKKywweDM2LDB4MjYsMHhhMSwweDI0LDB4MDAsMHhhMywweGY5LDB4MzYsMHhlOCwweDNiLDB4MTksMHg4YiwweGYwLDB4MjYsMHg4YiwweDBlCissMHgwZSwweDAwLDB4MmIsMHhjOCwweDgzLDB4ZTksMHgwZSwweGI4LDB4MDEsMHg4MCwweDgzLDB4ZjksMHgwNCwweDdjLDB4NTEsMHgyNgorLDB4OGEsMHg1NCwweDI4LDB4ODgsMHgxNiwweDFjLDB4MzcsMHg0MCwweDI2LDB4OGIsMHg2YywweDI2LDB4ODYsMHhjZCwweDNiLDB4Y2QKKywweDg2LDB4Y2QsMHg4OSwweDBlLDB4YTQsMHgzNywweDc1LDB4MzgsMHg0MCwweDMyLDB4ZmYsMHgyNiwweDhhLDB4NWMsMHgyOSwweDgwCissMHhmYiwweDE1LDB4NzcsMHgyNSwweDgwLDB4ZmIsMHgwYSwweDc0LDB4MjAsMHg4MCwweGZiLDB4MDEsMHg3NCwweDFiLDB4YjgsMHgwNAorLDB4ODAsMHgyZSwweDNhLDB4OTcsMHgwMiwweDJlLDB4NzQsMHgwNywweDJlLDB4M2EsMHg5NywweDE4LDB4MmUsMHg3NSwweDExLDB4MzMKKywweGMwLDB4ODAsMHhmYiwweDA5LDB4NzUsMHg0ZiwweDhiLDB4ZjMsMHhjMywweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHhmZiwweGZmCissMHg1MCwweDUyLDB4YTEsMHhhNCwweDM3LDB4ODYsMHhjNCwweDI2LDB4M2IsMHgwNiwweDI2LDB4MDAsMHg3YywweDMyLDB4MjYsMHg4MQorLDB4M2UsMHgyNiwweDAwLDB4MDAsMHgwNCwweDdlLDB4MjksMHg4ZCwweDc0LDB4MmEsMHgyNiwweDhiLDB4MTQsMHgyMiwweGQyLDB4NzQKKywweDFmLDB4ODAsMHhlNiwweGJmLDB4ODAsMHhmZSwweDA5LDB4NzUsMHgxNywweGM3LDB4MDYsMHhhMiwweDM3LDB4MDEsMHgwMCwweDgwCissMHhmYSwweDA0LDB4NzUsMHgwYywweDI2LDB4OGIsMHg0NCwweDAyLDB4YTMsMHgwMywweDM3LDB4ODYsMHhjNCwweGEzLDB4ZDAsMHgzNAorLDB4NWEsMHg1OCwweGU5LDB4YjEsMHhmZiwweGJkLDB4NzIsMHgzNywweDJlLDB4OGEsMHg4NywweDJlLDB4MmUsMHgyMiwweGMwLDB4NzQKKywweDE2LDB4MDUsMHg0NCwweDJlLDB4OGIsMHhmOCwweDJlLDB4OGIsMHgwNSwweDNlLDB4ODksMHg0NiwweDAwLDB4ODMsMHhjNSwweDAyCissMHg4MywweGM3LDB4MDIsMHgyMiwweGU0LDB4N2QsMHhlZiwweDhkLDB4NzQsMHgyYSwweDgzLDB4ZTksMHgwNCwweDc1LDB4MDMsMHhlOQorLDB4YTEsMHgwMCwweDI2LDB4OGIsMHgxNCwweDIyLDB4ZDIsMHg3NSwweDAzLDB4ZTksMHg3YywweDAwLDB4YzcsMHgwNiwweGE2LDB4MzcKKywweDAxLDB4MDAsMHhiZiwweDcyLDB4MzcsMHg4YiwweDA1LDB4ODMsMHhjNywweDAyLDB4ODAsMHhlNiwweGJmLDB4ODAsMHhlNCwweDNmCissMHg4MCwweGZlLDB4MDksMHg3NSwweDIyLDB4ODAsMHhmYSwweDA0LDB4NzUsMHg1ZSwweGM3LDB4MDYsMHhhMiwweDM3LDB4MDEsMHgwMAorLDB4MjYsMHg4YiwweDQ0LDB4MDIsMHhhMywweDAzLDB4MzcsMHg4NiwweGM0LDB4YTMsMHhkMCwweDM0LDB4ODYsMHhjNCwweGM3LDB4MDYKKywweGE2LDB4MzcsMHgwMCwweDAwLDB4ZTksMHg0NywweDAwLDB4M2IsMHhmZCwweDdlLDB4MTUsMHgyNiwweDhiLDB4MDQsMHhhOCwweDQwCissMHg3NCwweDA2LDB4YjgsMHgwNywweDgwLDB4ZTksMHgzOCwweGZmLDB4MzIsMHhjMCwweDI2LDB4OGIsMHgwNCwweGU5LDB4MmUsMHgwMAorLDB4M2EsMHhmNCwweDc1LDB4YjEsMHhjNywweDQ1LDB4ZmUsMHgwMCwweDAwLDB4ODAsMHhmZSwweDIyLDB4NzUsMHgwZCwweDNhLDB4ZDAKKywweDc3LDB4MTYsMHhjNywweDA2LDB4YTYsMHgzNywweDAwLDB4MDAsMHhlOSwweDEzLDB4MDAsMHgzYSwweGQwLDB4NzUsMHgwOSwweGM3CissMHgwNiwweGE2LDB4MzcsMHgwMCwweDAwLDB4ZTksMHgwNiwweDAwLDB4YjgsMHgwNSwweDgwLDB4ZTksMHgwMiwweGZmLDB4MzIsMHhmNgorLDB4MDMsMHhmMiwweDJiLDB4Y2EsMHhiOCwweDA1LDB4ODAsMHgyMywweGM5LDB4NzYsMHgwMywweGU5LDB4NjQsMHhmZiwweDc0LDB4MDMKKywweGU5LDB4ZWQsMHhmZSwweDMzLDB4YzAsMHhiZiwweDcyLDB4MzcsMHg4YiwweDE1LDB4NDcsMHg0NywweDNiLDB4ZmQsMHg3ZiwweDFiCissMHhmNiwweGM2LDB4ODAsMHg3NCwweDE2LDB4ZjcsMHgwNiwweGE2LDB4MzcsMHgwMSwweDAwLDB4NzQsMHgwNiwweGI4LDB4MDgsMHg4MAorLDB4ZTksMHhjMywweGZlLDB4ZjYsMHhjNiwweDQwLDB4NzQsMHhlMCwweGI4LDB4MDcsMHg4MCwweGU5LDB4YjgsMHhmZSwweDdkLDB4NDIKKywweGEzLDB4NDUsMHg0NCwweDI5LDB4NDQsMHgyOSwweGI3LDB4MjgsMHhlMiwweDI4LDB4ZWUsMHgyYiwweGYyLDB4MjgsMHhmNSwweDI4CissMHgwMSwweDI5LDB4YWMsMHgyYSwweDQ0LDB4MjksMHg0NCwweDI5LDB4NDQsMHgyOSwweDQ0LDB4MjksMHg0NCwweDI5LDB4MDAsMHgwMAorLDB4NzMsMHgzNiwweDAwLDB4MDAsMHgwMywweDM2LDB4YzUsMHgzNSwweDgzLDB4MzUsMHg0NSwweDM1LDB4MDcsMHgzNSwweGQyLDB4MzQKKywweDQ1LDB4MzQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4YTYsMHgzOCwweDAwLDB4MDAsMHhlMCwweDM4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweGYyLDB4MzMsMHgwMCwweDAwLDB4YTYsMHgzMywweDYwLDB4MzMsMHhmZCwweDMyLDB4YmMsMHgzMiwweDc3LDB4MzIsMHgzYywweDMyCissMHhmYiwweDMxLDB4NmEsMHgzMSwweDBhLDB4MzEsMHhlMCwweGUwLDB4MTAsMHgxMCwweDEwLDB4ZTAsMHhlMCwweGUwLDB4ZTAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGUwLDB4MDAsMHhlMCwweGUwLDB4ZTAsMHhlMCwweGUwLDB4ZTAsMHhlMCwweGUwCissMHhlMCwweDMzLDB4ZmYsMHgyNiwweGY2LDB4MDYsMHgxYSwweDAwLDB4ODAsMHg3NCwweDFiLDB4MjYsMHg4MCwweDI2LDB4MWEsMHgwMAorLDB4N2YsMHgyNiwweDhiLDB4M2UsMHgyNiwweDAwLDB4ODMsMHhlNywweDFmLDB4NzQsMHgwYiwweDI2LDB4ODAsMHgwZSwweDIwLDB4MDAKKywweDgwLDB4MjYsMHgwMSwweDNlLDB4MGUsMHgwMCwweGMzLDB4NjAsMHgyZSwweDhiLDB4ODQsMHhhNiwweDMwLDB4MjYsMHhhMywweDE4CissMHgwMCwweGQxLDB4ZTYsMHgyZSwweGZmLDB4OTQsMHg1MCwweDMwLDB4NjEsMHhjMywweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHhjNAorLDB4MmEsMHgyNiwweGM3LDB4MDYsMHgwZSwweDAwLDB4MTYsMHgwMCwweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwNiwweDAwLDB4MjYKKywweGM2LDB4MDYsMHgxOSwweDAwLDB4MDAsMHhlOCwweGJmLDB4MDUsMHhlOCwweDk4LDB4MDUsMHgyNiwweGM3LDB4MDYsMHgyNiwweDAwCissMHgwMCwweDA4LDB4MjYsMHhjNiwweDA2LDB4MjgsMHgwMCwweDQwLDB4MjYsMHhjNiwweDA2LDB4MjksMHgwMCwweDJhLDB4YmYsMHgyYQorLDB4MDAsMHgyNiwweGM2LDB4MDUsMHgwNCwweDI2LDB4YzYsMHg0NSwweDAxLDB4MmEsMHhhMSwweDkzLDB4MzcsMHgzMywweGRiLDB4YTkKKywweDQwLDB4MDAsMHg3NSwweDAyLDB4YjMsMHgwMSwweGE5LDB4MDAsMHgxMCwweDc0LDB4MDIsMHhiNywweDg4LDB4YTksMHgwMCwweDA4CissMHg3NCwweDAzLDB4ODAsMHhjZiwweDQ0LDB4MjYsMHg4OSwweDVkLDB4MDIsMHhjMywweDgzLDB4MGUsMHhjMiwweDM0LDB4MjAsMHgyNgorLDB4YzcsMHgwNiwweDA0LDB4MDAsMHg2YiwweDJiLDB4MjYsMHhjNywweDA2LDB4MGUsMHgwMCwweDMwLDB4MDAsMHgyNiwweGM3LDB4MDYKKywweDA2LDB4MDAsMHgwYSwweDAwLDB4MjYsMHhjNywweDA2LDB4MGEsMHgwMCwweDA0LDB4MDAsMHgyNiwweGM2LDB4MDYsMHgxOSwweDAwCissMHgwMCwweGU4LDB4NjksMHgwNSwweGU4LDB4MmMsMHgwNSwweDI2LDB4YzcsMHgwNiwweDI2LDB4MDAsMHgwMCwweDIyLDB4MjYsMHhjNgorLDB4MDYsMHgyOCwweDAwLDB4NjAsMHgyNiwweGM2LDB4MDYsMHgyOSwweDAwLDB4MjksMHhiZiwweDJhLDB4MDAsMHgyNiwweGM2LDB4MDUKKywweDA4LDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgyZCwweDhkLDB4N2QsMHgwMiwweGJlLDB4NTQsMHgzNywweGI5LDB4MDMsMHgwMCwweGYzCissMHhhNSwweDI2LDB4YzYsMHgwNSwweDA4LDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgyZSwweDhkLDB4N2QsMHgwMiwweGJlLDB4NWEsMHgzNworLDB4YjksMHgwMywweDAwLDB4ZjMsMHhhNSwweGU4LDB4ZDQsMHgwNSwweGU4LDB4NjQsMHgwNSwweGI5LDB4MDYsMHgwMCwweGJlLDB4NTQKKywweDM3LDB4OGQsMHgyZSwweDJjLDB4MDAsMHgyNiwweDhiLDB4NDYsMHgwMCwweDI5LDB4MDQsMHg4MywweGM2LDB4MDIsMHg4MywweGM1CissMHgwMiwweDgzLDB4ZjksMHgwNCwweDc1LDB4MDIsMHg0NSwweDQ1LDB4ZTIsMHhlYiwweGMzLDB4MjYsMHhjNywweDA2LDB4MDQsMHgwMAorLDB4YzQsMHgyYSwweDI2LDB4YzcsMHgwNiwweDBlLDB4MDAsMHgyNCwweDAwLDB4MjYsMHhjNywweDA2LDB4MDYsMHgwMCwweDA2LDB4MDAKKywweDI2LDB4YzYsMHgwNiwweDE5LDB4MDAsMHgwMCwweGU4LDB4ZTQsMHgwNCwweGU4LDB4YTcsMHgwNCwweDI2LDB4YzcsMHgwNiwweDI2CissMHgwMCwweDAwLDB4MTYsMHgyNiwweGM2LDB4MDYsMHgyOCwweDAwLDB4NjAsMHgyNiwweGM2LDB4MDYsMHgyOSwweDAwLDB4MjgsMHhiZgorLDB4MmEsMHgwMCwweGU4LDB4NWIsMHgwNiwweGU4LDB4NzQsMHgwNSwweGU4LDB4MDQsMHgwNSwweGMzLDB4MjYsMHhjNywweDA2LDB4MDQKKywweDAwLDB4YzQsMHgyYSwweDI2LDB4YzcsMHgwNiwweDBlLDB4MDAsMHgxYSwweDAwLDB4MjYsMHhjNywweDA2LDB4MDYsMHgwMCwweDA2CissMHgwMCwweDI2LDB4YzYsMHgwNiwweDE5LDB4MDAsMHgwMCwweGU4LDB4YTMsMHgwNCwweGU4LDB4NjYsMHgwNCwweDI2LDB4YzcsMHgwNgorLDB4MjYsMHgwMCwweDAwLDB4MGMsMHgyNiwweGM2LDB4MDYsMHgyOCwweDAwLDB4NjAsMHgyNiwweGM2LDB4MDYsMHgyOSwweDAwLDB4MjcKKywweGJmLDB4MmEsMHgwMCwweGU4LDB4MjEsMHgwNSwweGMzLDB4MjYsMHhjNywweDA2LDB4MDQsMHgwMCwweGM0LDB4MmEsMHgyNiwweGM3CissMHgwNiwweDBlLDB4MDAsMHgyMCwweDAwLDB4MjYsMHhjNywweDA2LDB4MDYsMHgwMCwweDBhLDB4MDAsMHgyNiwweGM3LDB4MDYsMHgwYQorLDB4MDAsMHgwNCwweDAwLDB4MjYsMHhjNiwweDA2LDB4MTksMHgwMCwweDAwLDB4ZTgsMHg0YiwweDA0LDB4ZTgsMHgyNCwweDA0LDB4MjYKKywweGM3LDB4MDYsMHgyNiwweDAwLDB4MDAsMHgxMiwweDI2LDB4YzYsMHgwNiwweDI4LDB4MDAsMHg0MCwweDI2LDB4YzYsMHgwNiwweDI5CissMHgwMCwweDI2LDB4YmYsMHgyYSwweDAwLDB4ZTgsMHhmNCwweDA0LDB4ZTgsMHg4NCwweDA0LDB4YzMsMHgyNiwweGM3LDB4MDYsMHgwNAorLDB4MDAsMHhjNCwweDJhLDB4MjYsMHhjNywweDA2LDB4MGUsMHgwMCwweDM0LDB4MDAsMHgyNiwweGM3LDB4MDYsMHgwNiwweDAwLDB4MDYKKywweDAwLDB4MjYsMHhjNiwweDA2LDB4MTksMHgwMCwweDAwLDB4ZTgsMHgwZCwweDA0LDB4ZTgsMHhlNiwweDAzLDB4MjYsMHhjNywweDA2CissMHgyNiwweDAwLDB4MDAsMHgyNiwweDI2LDB4YzYsMHgwNiwweDI4LDB4MDAsMHg0MCwweDI2LDB4YzYsMHgwNiwweDI5LDB4MDAsMHgyNQorLDB4YmYsMHgyYSwweDAwLDB4ZTgsMHhiNiwweDA0LDB4ZTgsMHg0NiwweDA0LDB4ZTgsMHhmYSwweDA0LDB4YzMsMHgyNiwweGM3LDB4MDYKKywweDA0LDB4MDAsMHhjNCwweDJhLDB4MjYsMHhjNywweDA2LDB4MGUsMHgwMCwweDM4LDB4MDAsMHhhMSwweGEyLDB4MzcsMHg1MCwweDBiCissMHhjMCwweDc1LDB4MDcsMHgyNiwweGM3LDB4MDYsMHgwZSwweDAwLDB4MzQsMHgwMCwweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwNgorLDB4MDAsMHgyNiwweGM2LDB4MDYsMHgxOSwweDAwLDB4MDAsMHhlOCwweDk5LDB4MDMsMHhlOCwweGE0LDB4ZmQsMHgyNiwweGM3LDB4NDUKKywweDI2LDB4MDAsMHgyYSwweDU4LDB4MGIsMHhjMCwweDc1LDB4MDYsMHgyNiwweGM3LDB4NDUsMHgyNiwweDAwLDB4MjYsMHhhMSwweDFjCissMHgzNywweGMxLDB4ZTAsMHgwNCwweDI2LDB4ODgsMHg0NSwweDI4LDB4MjYsMHhjNiwweDQ1LDB4MjksMHgyNCwweDgzLDB4YzcsMHgyYQorLDB4ZTgsMHgyOSwweDA0LDB4ZTgsMHhhMCwweDA0LDB4ZTgsMHgyMiwweDA1LDB4ZTgsMHhmOCwweDAzLDB4ZTgsMHgwOSwweDA0LDB4YzMKKywweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHhjNCwweDJhLDB4MjYsMHhjNywweDA2LDB4MGUsMHgwMCwweDMyLDB4MDAsMHgyNiwweGM3CissMHgwNiwweDA2LDB4MDAsMHgwNiwweDAwLDB4MjYsMHhjNiwweDA2LDB4MTksMHgwMCwweDAwLDB4ZTgsMHg0NSwweDAzLDB4ZTgsMHg1MAorLDB4ZmQsMHgyNiwweGM3LDB4NDUsMHgyNiwweDAwLDB4MjQsMHhhMSwweDFjLDB4MzcsMHhjMSwweGUwLDB4MDQsMHgyNiwweDg4LDB4NDUKKywweDI4LDB4MjYsMHhjNiwweDQ1LDB4MjksMHgyMywweDgzLDB4YzcsMHgyYSwweGU4LDB4ZTAsMHgwMywweGU4LDB4NmMsMHgwNCwweGU4CissMHg4YSwweDA0LDB4ZTgsMHg5YywweDA0LDB4YzMsMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4YzQsMHgyYSwweDI2LDB4YzcsMHgwNgorLDB4MGUsMHgwMCwweDM0LDB4MDAsMHgyNiwweGM3LDB4MDYsMHgwNiwweDAwLDB4MDYsMHgwMCwweDI2LDB4YzYsMHgwNiwweDE5LDB4MDAKKywweDAwLDB4ZTgsMHhmZiwweDAyLDB4ZTgsMHgwYSwweGZkLDB4MjYsMHhjNywweDQ1LDB4MjYsMHgwMCwweDI2LDB4YTEsMHgxYywweDM3CissMHhjMSwweGUwLDB4MDQsMHgyNiwweDg4LDB4NDUsMHgyOCwweDI2LDB4YzYsMHg0NSwweDI5LDB4MjIsMHg4MywweGM3LDB4MmEsMHhlOAorLDB4OWEsMHgwMywweGU4LDB4YzcsMHgwMywweGU4LDB4NTcsMHgwMywweGU4LDB4ZjgsMHgwMywweGU4LDB4NzgsMHgwNCwweGU4LDB4OGEKKywweDA0LDB4YzMsMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4NzQsMHg0NSwweDI2LDB4YzcsMHgwNiwweDBlLDB4MDAsMHgzZSwweDAwCissMHgyNiwweGM3LDB4MDYsMHgwNiwweDAwLDB4MDYsMHgwMCwweDI2LDB4YzcsMHgwNiwweDBhLDB4MDAsMHgwNCwweDAwLDB4MjYsMHhjNgorLDB4MDYsMHgxOSwweDAwLDB4MDAsMHhlOCwweGZjLDB4MDIsMHhlOCwweGE5LDB4MDIsMHg4MywweDNlLDB4OGQsMHgzNywweDAzLDB4NzUKKywweDAxLDB4OTAsMHgyNiwweGM3LDB4MDYsMHgyNiwweDAwLDB4MDAsMHgzMCwweDI2LDB4YzYsMHgwNiwweDI4LDB4MDAsMHg1MCwweDI2CissMHhjNiwweDA2LDB4MjksMHgwMCwweDIwLDB4YmYsMHgyYSwweDAwLDB4ZTgsMHhkMCwweDAzLDB4ZTgsMHgwMSwweDAzLDB4ZTgsMHhiNQorLDB4MDMsMHhlOCwweDlmLDB4MDMsMHhjMywweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHg2MSwweDQzLDB4YjksMHhmMCwweDAwLDB4ODMKKywweGU5LDB4MDIsMHgyNiwweDg5LDB4MGUsMHgwZSwweDAwLDB4MjYsMHhjNywweDA2LDB4MDYsMHgwMCwweDAyLDB4MDAsMHgyNiwweGM2CissMHgwNiwweDE5LDB4MDAsMHgwMCwweDI2LDB4YzcsMHgwNiwweDFhLDB4MDAsMHgwMCwweDAwLDB4MjYsMHhjNywweDA2LDB4MWMsMHgwMAorLDB4MDAsMHgwMCwweDI2LDB4YzcsMHgwNiwweDFlLDB4MDAsMHgwMCwweDAwLDB4ZTgsMHg0NywweDAyLDB4ODMsMHhlOSwweDBlLDB4ODYKKywweGNkLDB4MjYsMHg4OSwweDBlLDB4MjYsMHgwMCwweDg2LDB4Y2QsMHgyNiwweGM2LDB4MDYsMHgyOCwweDAwLDB4MDAsMHgyNiwweGM2CissMHgwNiwweDI5LDB4MDAsMHgwOCwweGJmLDB4MmEsMHgwMCwweDgzLDB4ZTksMHgwNCwweDI2LDB4ODksMHgwZCwweDI2LDB4YzYsMHg0NQorLDB4MDEsMHgyNiwweDhkLDB4N2QsMHgwMiwweDgzLDB4ZTksMHgwMiwweGJiLDB4MDEsMHgwMCwweGI4LDB4MzAsMHgzMCwweDRiLDB4NzUKKywweDE3LDB4YmIsMHgwYSwweDAwLDB4OGEsMHhjNCwweDI2LDB4ODgsMHgwNSwweGIwLDB4MzEsMHg4MCwweGM0LDB4MDEsMHg4MCwweGZjCissMHgzYSwweDc1LDB4MGEsMHhiNCwweDYxLDB4ZTksMHgwNSwweDAwLDB4MjYsMHg4OCwweDA1LDB4MDQsMHgwMSwweDQ3LDB4NDksMHg3NQorLDB4ZGQsMHhjMywweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHgwNCwweDQ1LDB4MjYsMHhjNywweDA2LDB4MGUsMHgwMCwweDEyLDB4MDAKKywweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwNiwweDAwLDB4MjYsMHhjNiwweDA2LDB4MTksMHgwMCwweDAxLDB4ZTgsMHhlNSwweDAxCissMHhlOCwweGQwLDB4MDEsMHgyNiwweGM3LDB4MDYsMHgyNiwweDAwLDB4MDAsMHgwNCwweDI2LDB4YzYsMHgwNiwweDI4LDB4MDAsMHgwMAorLDB4MjYsMHhjNiwweDA2LDB4MjksMHgwMCwweDA3LDB4YzMsMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4YzQsMHgyYSwweDI2LDB4YzcKKywweDA2LDB4MGUsMHgwMCwweDIwLDB4MDAsMHgyNiwweGM3LDB4MDYsMHgwNiwweDAwLDB4MDYsMHgwMCwweDI2LDB4YzYsMHgwNiwweDE5CissMHgwMCwweDA2LDB4ZTgsMHgwNCwweDAyLDB4ZTgsMHg5YiwweDAxLDB4MjYsMHhjNywweDA2LDB4MjYsMHgwMCwweDAwLDB4MTIsMHgyNgorLDB4YzYsMHgwNiwweDI4LDB4MDAsMHgwMCwweDI2LDB4YzYsMHgwNiwweDI5LDB4MDAsMHgwNiwweGJmLDB4MmEsMHgwMCwweGU4LDB4NmIKKywweDAyLDB4ZTgsMHhmYiwweDAxLDB4YzMsMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4YzQsMHgyYSwweDI2LDB4YzcsMHgwNiwweDBlCissMHgwMCwweDIwLDB4MDAsMHgyNiwweGM3LDB4MDYsMHgwNiwweDAwLDB4MDYsMHgwMCwweDI2LDB4YzYsMHgwNiwweDE5LDB4MDAsMHgwNQorLDB4ZTgsMHhjNiwweDAxLDB4ZTgsMHg1ZCwweDAxLDB4MjYsMHhjNywweDA2LDB4MjYsMHgwMCwweDAwLDB4MTIsMHgyNiwweGM2LDB4MDYKKywweDI4LDB4MDAsMHgwMCwweDI2LDB4YzYsMHgwNiwweDI5LDB4MDAsMHgwNSwweGJmLDB4MmEsMHgwMCwweGU4LDB4MmQsMHgwMiwweGU4CissMHhiZCwweDAxLDB4YzMsMHhmZiwweDA2LDB4ODIsMHgzNCwweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHgzZCwweDQxLDB4MjYsMHhjNworLDB4MDYsMHgwZSwweDAwLDB4MjAsMHgwMCwweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwZSwweDAwLDB4MjYsMHhjNiwweDA2LDB4MTkKKywweDAwLDB4MDQsMHhlOCwweDg0LDB4MDEsMHhlOCwweDFiLDB4MDEsMHgyNiwweGM3LDB4MDYsMHgyNiwweDAwLDB4MDAsMHgxMiwweDI2CissMHhjNiwweDA2LDB4MjgsMHgwMCwweDAwLDB4MjYsMHhjNiwweDA2LDB4MjksMHgwMCwweDA0LDB4YmYsMHgyYSwweDAwLDB4ZTgsMHhlYgorLDB4MDEsMHhlOCwweDdiLDB4MDEsMHhjMywweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHg2NywweDQyLDB4MjYsMHhjNywweDA2LDB4MGUKKywweDAwLDB4MjAsMHgwMCwweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwOCwweDAwLDB4MjYsMHhjNiwweDA2LDB4MTksMHgwMCwweDAzCissMHhlOCwweDQ2LDB4MDEsMHhlOCwweGRkLDB4MDAsMHgyNiwweGM3LDB4MDYsMHgyNiwweDAwLDB4MDAsMHgxMiwweDI2LDB4YzYsMHgwNgorLDB4MjgsMHgwMCwweDAwLDB4MjYsMHhjNiwweDA2LDB4MjksMHgwMCwweDAzLDB4YmYsMHgyYSwweDAwLDB4ZTgsMHhhZCwweDAxLDB4ZTgKKywweDNkLDB4MDEsMHhjMywweGZmLDB4MDYsMHg4NCwweDM0LDB4MjYsMHhjNywweDA2LDB4MDQsMHgwMCwweDY3LDB4NDIsMHgyNiwweGM3CissMHgwNiwweDBlLDB4MDAsMHgyNCwweDAwLDB4MjYsMHhjNywweDA2LDB4MDYsMHgwMCwweDA4LDB4MDAsMHgyNiwweGM2LDB4MDYsMHgxOQorLDB4MDAsMHgwMiwweGU4LDB4MDQsMHgwMSwweGU4LDB4OWIsMHgwMCwweDI2LDB4YzcsMHgwNiwweDI2LDB4MDAsMHgwMCwweDE2LDB4MjYKKywweGM2LDB4MDYsMHgyOCwweDAwLDB4MDAsMHgyNiwweGM2LDB4MDYsMHgyOSwweDAwLDB4MDIsMHhiZiwweDJhLDB4MDAsMHgyNiwweGM2CissMHgwNSwweDA0LDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgwMSwweGExLDB4MGYsMHgzNywweDg2LDB4ZTAsMHhmNiwweDA2LDB4NmYsMHgzNworLDB4MDEsMHg3NSwweDBmLDB4MzksMHgwNiwweGNjLDB4MzQsMHg3NCwweDA5LDB4OGIsMHhkOCwweGI4LDB4ODksMHgwMywweGNkLDB4MzkKKywweDhiLDB4YzMsMHhhMywweGNjLDB4MzQsMHgyNiwweDg5LDB4NDUsMHgwMiwweDhkLDB4N2QsMHgwNCwweGU4LDB4M2QsMHgwMSwweGU4CissMHhjZCwweDAwLDB4YzMsMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4YzQsMHgyYSwweDI2LDB4YzcsMHgwNiwweDBlLDB4MDAsMHgxYworLDB4MDAsMHhhMSwweGEyLDB4MzcsMHg1MCwweDBiLDB4YzAsMHg3NSwweDA3LDB4MjYsMHhjNywweDA2LDB4MGUsMHgwMCwweDE4LDB4MDAKKywweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwNiwweDAwLDB4MjYsMHhjNiwweDA2LDB4MTksMHgwMCwweDAwLDB4ZTgsMHgyMywweDAwCissMHhlOCwweDJlLDB4ZmEsMHgyNiwweGM3LDB4NDUsMHgyNiwweDAwLDB4MGUsMHg1OCwweDBiLDB4YzAsMHg3NSwweDA2LDB4MjYsMHhjNworLDB4NDUsMHgyNiwweDAwLDB4MGEsMHgyNiwweGM2LDB4NDUsMHgyOSwweDAwLDB4ODMsMHhjNywweDJhLDB4ZTgsMHhiZCwweDAwLDB4ZTgKKywweGZmLDB4MDAsMHhjMywweDU2LDB4NTcsMHg1MSwweGI5LDB4MDMsMHgwMCwweGJlLDB4ZDEsMHgzNiwweGJmLDB4MjAsMHgwMCwweGYzCissMHhhNSwweDU5LDB4NWYsMHg1ZSwweGMzLDB4NTYsMHg1NywweDUxLDB4YjksMHgwMywweDAwLDB4YmUsMHhkMSwweDM2LDB4YmYsMHgxYQorLDB4MDAsMHhmMywweGE1LDB4NTksMHg1ZiwweDVlLDB4YzMsMHgyNiwweGM3LDB4MDYsMHgxYSwweDAwLDB4YzAsMHgwMCwweDI2LDB4YzcKKywweDA2LDB4MWMsMHgwMCwweDAwLDB4MDAsMHgyNiwweGM3LDB4MDYsMHgxZSwweDAwLDB4MDAsMHgxMCwweGMzLDB4MjYsMHhjNywweDA2CissMHgxYSwweDAwLDB4YzAsMHgwMCwweDI2LDB4YzcsMHgwNiwweDFjLDB4MDAsMHgwMCwweDAwLDB4MjYsMHhjNywweDA2LDB4MWUsMHgwMAorLDB4MDAsMHgwOCwweGMzLDB4MjYsMHhjNywweDA2LDB4MWEsMHgwMCwweGMwLDB4MDAsMHgyNiwweGM3LDB4MDYsMHgxYywweDAwLDB4MDAKKywweDAwLDB4MjYsMHhjNywweDA2LDB4MWUsMHgwMCwweDAwLDB4MDIsMHhjMywweDI2LDB4YzcsMHgwNiwweDFhLDB4MDAsMHhjMCwweDAwCissMHgyNiwweGM3LDB4MDYsMHgxYywweDAwLDB4ZmYsMHhmZiwweDI2LDB4YzcsMHgwNiwweDFlLDB4MDAsMHhmZiwweGZmLDB4YzMsMHgyNgorLDB4YzYsMHgwNSwweDA4LDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgwMiwweDhkLDB4N2QsMHgwMiwweGJlLDB4MDUsMHgzNywweGI5LDB4MDMKKywweDAwLDB4ZjMsMHhhNSwweGMzLDB4MjYsMHhjNiwweDA1LDB4MDQsMHgyNiwweGM2LDB4NDUsMHgwMSwweDA2LDB4YTEsMHgwZCwweDM3CissMHgyNiwweDg5LDB4NDUsMHgwMiwweDhkLDB4N2QsMHgwNCwweGMzLDB4MjYsMHhjNiwweDA1LDB4MDQsMHgyNiwweGM2LDB4NDUsMHgwMQorLDB4MDcsMHhhMSwweDBiLDB4MzcsMHgyNiwweDg5LDB4NDUsMHgwMiwweDgzLDB4YzcsMHgwNCwweGMzLDB4YTEsMHhhMiwweDM3LDB4MGIKKywweGMwLDB4NzQsMHgxMywweDI2LDB4YzYsMHgwNSwweDA0LDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgwOSwweGExLDB4MDMsMHgzNywweDI2CissMHg4OSwweDQ1LDB4MDIsMHg4MywweGM3LDB4MDQsMHhjMywweDI2LDB4YzYsMHgwNSwweDA4LDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgwMgorLDB4OGQsMHg3ZCwweDAyLDB4YmUsMHgwNSwweDM3LDB4YjksMHgwMywweDAwLDB4ZjMsMHhhNSwweGMzLDB4MjYsMHhjNiwweDA1LDB4MDYKKywweDI2LDB4YzYsMHg0NSwweDAxLDB4MGIsMHg4ZCwweDdkLDB4MDIsMHhiZSwweGVmLDB4MzYsMHhiOSwweDAyLDB4MDAsMHhmMywweGE1CissMHhjMywweDI2LDB4YzYsMHgwNSwweDA2LDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgyMCwweGExLDB4NjgsMHgzNywweDI2LDB4ODksMHg0NQorLDB4MDIsMHhhMSwweDZhLDB4MzcsMHgyNiwweDg4LDB4NjUsMHgwNSwweGMxLDB4ZTAsMHgwNCwweDI2LDB4ODgsMHg0NSwweDA0LDB4ODMKKywweGM3LDB4MDYsMHhjMywweDI2LDB4YzYsMHgwNSwweDA0LDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgyMSwweDI2LDB4YzcsMHg0NSwweDAyCissMHgwMCwweDAwLDB4ODMsMHhjNywweDA0LDB4YzMsMHgyNiwweGM2LDB4MDUsMHgxNCwweDI2LDB4YzYsMHg0NSwweDAxLDB4MjIsMHg4ZAorLDB4N2QsMHgwMiwweGJlLDB4MWYsMHgzNywweGI5LDB4MDksMHgwMCwweGYzLDB4YTUsMHhjMywweDI2LDB4YzYsMHgwNSwweDBjLDB4MjYKKywweGM2LDB4NDUsMHgwMSwweDIzLDB4OGQsMHg3ZCwweDAyLDB4MWUsMHgwZSwweDFmLDB4OGQsMHgzNiwweDQwLDB4NTQsMHhiOSwweDAzCissMHgwMCwweGYzLDB4YTUsMHgzMywweGMwLDB4YjksMHgwMiwweDAwLDB4ZjMsMHhhYiwweDFmLDB4YzMsMHgyNiwweGM2LDB4MDUsMHgwOAorLDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgyOCwweDhkLDB4N2QsMHgwMiwweGJlLDB4ZDEsMHgzNiwweGI5LDB4MDMsMHgwMCwweGYzLDB4YTUKKywweGMzLDB4MjYsMHhjNiwweDA1LDB4MDgsMHgyNiwweGM2LDB4NDUsMHgwMSwweDI5LDB4YTEsMHhjMiwweDM0LDB4ODYsMHhlMCwweDI2CissMHg4OSwweDQ1LDB4MDIsMHhhMSwweDliLDB4MzYsMHgyNiwweDg5LDB4NDUsMHgwNCwweDI2LDB4ODgsMHg0NSwweDA2LDB4MjYsMHg4OAorLDB4NDUsMHgwNywweDhkLDB4N2QsMHgwOCwweGMzLDB4MjYsMHhjNiwweDA1LDB4MDYsMHgyNiwweGM2LDB4NDUsMHgwMSwweDJiLDB4OGQKKywweDdkLDB4MDIsMHhiZSwweGJiLDB4MzYsMHhiOSwweDAyLDB4MDAsMHhmMywweGE1LDB4YzMsMHgyNiwweGM2LDB4MDUsMHgwNiwweDI2CissMHhjNiwweDQ1LDB4MDEsMHgyYywweDhkLDB4N2QsMHgwMiwweGJlLDB4ZTUsMHgzNiwweGI5LDB4MDIsMHgwMCwweGYzLDB4YTUsMHhjMworLDB4MjYsMHhjNiwweDA1LDB4MDQsMHgyNiwweGM2LDB4NDUsMHgwMSwweDMwLDB4YTEsMHgzNywweDM3LDB4ODYsMHhlMCwweDI2LDB4ODkKKywweDQ1LDB4MDIsMHg4ZCwweDdkLDB4MDQsMHhjMywweDI2LDB4YzcsMHgwNiwweDBlLDB4MDAsMHgxZSwweDAwLDB4MjYsMHhjNywweDA2CissMHgwNiwweDAwLDB4MDIsMHgwMCwweDI2LDB4YzYsMHgwNiwweDE5LDB4MDAsMHgwMCwweGU4LDB4NmMsMHhmZSwweGU4LDB4MDMsMHhmZQorLDB4MjYsMHhjNywweDA2LDB4MjYsMHgwMCwweDAwLDB4MTAsMHgyNiwweGM2LDB4MDYsMHgyOCwweDAwLDB4MzAsMHgyNiwweGM2LDB4MDYKKywweDI5LDB4MDAsMHgxMSwweGJmLDB4MmEsMHgwMCwweGU4LDB4MzUsMHgwMCwweGU4LDB4NDUsMHgwMCwweGU4LDB4NTUsMHgwMCwweGMzCissMHgyNiwweGM3LDB4MDYsMHgwZSwweDAwLDB4MTIsMHgwMCwweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwMiwweDAwLDB4MjYsMHhjNgorLDB4MDYsMHgxOSwweDAwLDB4MDAsMHhlOCwweDMyLDB4ZmUsMHhlOCwweGM5LDB4ZmQsMHgyNiwweGM3LDB4MDYsMHgyNiwweDAwLDB4MDAKKywweDA0LDB4MjYsMHhjNiwweDA2LDB4MjgsMHgwMCwweDMwLDB4MjYsMHhjNiwweDA2LDB4MjksMHgwMCwweDEzLDB4YzMsMHgyNiwweGM2CissMHgwNSwweDA0LDB4MjYsMHhjNiwweDQ1LDB4MDEsMHgwYywweDI2LDB4YzcsMHg0NSwweDAyLDB4MDAsMHgwMSwweDgzLDB4YzcsMHgwNAorLDB4YzMsMHgyNiwweGM2LDB4MDUsMHgwNCwweDI2LDB4YzYsMHg0NSwweDAxLDB4MGUsMHgyNiwweGM3LDB4NDUsMHgwMiwweDAwLDB4MDIKKywweDgzLDB4YzcsMHgwNCwweGMzLDB4MjYsMHhjNiwweDA1LDB4MDQsMHgyNiwweGM2LDB4NDUsMHgwMSwweDIxLDB4MjYsMHhjNywweDQ1CissMHgwMiwweDAwLDB4MDAsMHg4MywweGM3LDB4MDQsMHhjMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4YjMsMHgzOSwweGM5LDB4MzksMHg4MywweDNhLDB4YjMsMHgzOSwweGIzLDB4MzksMHhiMywweDM5LDB4MWMsMHgzYSwweDFjLDB4M2EKKywweGEzLDB4YjYsMHgzNCwweGExLDB4ZTksMHgzNiwweGEzLDB4MTEsMHgzNywweGEzLDB4ZDIsMHgzNCwweGExLDB4ZWIsMHgzNiwweGEzCissMHgxMywweDM3LDB4YTMsMHhkNCwweDM0LDB4YTEsMHhlZCwweDM2LDB4YTMsMHgxNSwweDM3LDB4YTMsMHhkNiwweDM0LDB4YTEsMHgwMQorLDB4MzcsMHhhMywweGNlLDB4MzQsMHhhMSwweGY3LDB4MzYsMHhhMywweDE3LDB4MzcsMHhhMywweGRjLDB4MzQsMHhhMSwweGY5LDB4MzYKKywweGEzLDB4MTksMHgzNywweGEzLDB4ZGUsMHgzNCwweGY3LDB4MDYsMHg5YiwweDM2LDB4MDIsMHgwMCwweDc1LDB4MGMsMHgzMywweGMwCissMHhhMCwweDllLDB4MzYsMHg4YiwweGYwLDB4MmUsMHhmZiwweGE0LDB4NTAsMHgzOSwweGU5LDB4MGYsMHgwMSwweGJlLDB4MDcsMHgwMAorLDB4ZTksMHgxOSwweGYxLDB4ZjYsMHgwNiwweDlkLDB4MzYsMHg4MCwweDc0LDB4ZjMsMHhjNiwweDA2LDB4YTAsMHgzNiwweDAyLDB4YzYKKywweDA2LDB4NmUsMHgzNywweDA4LDB4YzYsMHgwNiwweDcwLDB4MzcsMHgwMiwweGI4LDB4ODgsMHgwMywweGNkLDB4MzksMHhmNiwweDA2CissMHg2ZiwweDM3LDB4MDEsMHg3NSwweDRhLDB4YTEsMHhkMSwweDM2LDB4M2EsMHgwNiwweGU5LDB4MzYsMHg3NSwweDQxLDB4M2EsMHgyNgorLDB4ZWEsMHgzNiwweDc1LDB4M2IsMHhhMSwweGQzLDB4MzYsMHgzYSwweDA2LDB4ZWIsMHgzNiwweDc1LDB4MzIsMHgzYSwweDI2LDB4ZWMKKywweDM2LDB4NzUsMHgyYywweGExLDB4ZDUsMHgzNiwweDNhLDB4MDYsMHhlZCwweDM2LDB4NzUsMHgyMywweDNhLDB4MjYsMHhlZSwweDM2CissMHg3NSwweDFkLDB4YzYsMHgwNiwweDcwLDB4MzcsMHgwMiwweGZlLDB4MGUsMHg2ZSwweDM3LDB4NzUsMHgwZiwweGI4LDB4ODgsMHgwMworLDB4Y2QsMHgzYSwweDgzLDB4MGUsMHg5YiwweDM2LDB4MTIsMHhjNiwweDA2LDB4YTAsMHgzNiwweDBjLDB4ZTksMHhhOCwweGYwLDB4YTEKKywweDA1LDB4MzcsMHgyNiwweDNiLDB4MDYsMHgyMCwweDAwLDB4NzUsMHg0MCwweGExLDB4MDcsMHgzNywweDI2LDB4M2IsMHgwNiwweDIyCissMHgwMCwweDc1LDB4MzYsMHhhMSwweDA5LDB4MzcsMHgyNiwweDNiLDB4MDYsMHgyNCwweDAwLDB4NzUsMHgyYywweGEwLDB4OWUsMHgzNgorLDB4M2MsMHgwMiwweDc1LDB4MDgsMHgyNiwweGY2LDB4MDYsMHgxOCwweDAwLDB4MDgsMHg3NSwweDQ3LDB4YzYsMHgwNiwweDZlLDB4MzcKKywweDA4LDB4ZmUsMHgwZSwweDcwLDB4MzcsMHg3NSwweDFjLDB4YzYsMHgwNiwweDcwLDB4MzcsMHgwMiwweGU1LDB4MDIsMHgwZCwweDAxCissMHgwNCwweDI1LDB4ZWYsMHhmZiwweGU3LDB4MDIsMHhlOSwweDVlLDB4ZjAsMHhjNiwweDA2LDB4NzAsMHgzNywweDAyLDB4YzYsMHgwNgorLDB4NmUsMHgzNywweDA4LDB4ZTUsMHgwMiwweDI1LDB4ZmYsMHhmYiwweDBkLDB4MDEsMHgwMCwweDI1LDB4ZWYsMHhmZiwweGU3LDB4MDIKKywweGU5LDB4NDQsMHhmMCwweGY3LDB4MDYsMHg5YiwweDM2LDB4MDAsMHgwMSwweDc0LDB4MjUsMHgyNiwweGY2LDB4MDYsMHgxOCwweDAwCissMHgwOCwweDc1LDB4ZWQsMHg4MSwweDI2LDB4OWIsMHgzNiwweDdmLDB4ZmYsMHhiOCwweDg5LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4NAorLDB4MDMsMHhjZCwweDNhLDB4YzYsMHgwNiwweGEwLDB4MzYsMHgwNiwweDgzLDB4MjYsMHhjMiwweDM0LDB4YWYsMHhlOSwweDE3LDB4ZjAKKywweGExLDB4MDEsMHgzNywweDNhLDB4MjYsMHgwZiwweDM3LDB4N2YsMHhjNywweGU5LDB4ZjcsMHhmZSwweDgzLDB4MjYsMHg5YiwweDM2CissMHhlYywweGU4LDB4MmEsMHgwZCwweDgxLDB4MGUsMHg5YiwweDM2LDB4ODAsMHgwMCwweGJiLDB4ZmYsMHg3ZiwweGNkLDB4NTMsMHhjNgorLDB4MDYsMHhhMCwweDM2LDB4MDIsMHhlOSwweGYwLDB4ZWYsMHg4MywweDBlLDB4OWIsMHgzNiwweDExLDB4YzYsMHgwNiwweGEwLDB4MzYKKywweDBjLDB4ZTksMHhmOSwweGVmLDB4NDQsMHgzYiwweDJjLDB4M2IsMHhjNywweDJhLDB4NmIsMHgzYiwweDQ0LDB4M2IsMHhjNywweDJhCissMHhjNywweDJhLDB4YzcsMHgyYSwweGEzLDB4YjYsMHgzNCwweDgxLDB4MGUsMHhjMiwweDM0LDB4MDAsMHgyMCwweGY3LDB4MDYsMHg0MQorLDB4MzcsMHgwMSwweDAwLDB4NzQsMHgxYiwweDhjLDB4YzMsMHhjNywweDA2LDB4NDEsMHgzNywweDAwLDB4MDAsMHhiOCwweDdmLDB4MDMKKywweGNkLDB4M2EsMHgzMywweGMwLDB4OGUsMHhjMCwweGJmLDB4NTQsMHgzNywweGI5LDB4MDYsMHgwMCwweGYzLDB4YWIsMHg4ZSwweGMzCissMHgzMywweGMwLDB4YTAsMHg5ZSwweDM2LDB4OGIsMHhmMCwweDJlLDB4ZmYsMHhhNCwweGU0LDB4M2EsMHhmNywweDA2LDB4OWIsMHgzNgorLDB4MDAsMHgwMSwweDc1LDB4MjEsMHg4MywweDI2LDB4YzIsMHgzNCwweGJmLDB4YTEsMHhhOSwweDM2LDB4ZTcsMHgwMCwweGExLDB4OWIKKywweDM2LDB4ZTksMHgwOSwweDAwLDB4YTEsMHg5YiwweDM2LDB4ODEsMHgyNiwweDliLDB4MzYsMHhmZiwweGRmLDB4YTksMHgwMCwweDIwCissMHg3NSwweDA2LDB4ZTksMHg2ZSwweDAwLDB4ZTksMHg2ZiwweGVmLDB4ODMsMHgwZSwweDk5LDB4MzYsMHgwNCwweGM3LDB4MDYsMHgzNworLDB4MzcsMHgwMSwweDAwLDB4YzYsMHgwNiwweGNhLDB4MzQsMHgwMSwweGU5LDB4NTgsMHgwMCwweDgzLDB4MGUsMHg5YiwweDM2LDB4NDAKKywweGU4LDB4NTgsMHgwMCwweGExLDB4MDUsMHgzNywweDNiLDB4MDYsMHhlOSwweDM2LDB4NzUsMHgzNywweGExLDB4MDcsMHgzNywweDNiCissMHgwNiwweGViLDB4MzYsMHg3NSwweDJlLDB4YTEsMHgwOSwweDM3LDB4M2IsMHgwNiwweGVkLDB4MzYsMHg3NSwweDI1LDB4ZmUsMHgwZQorLDB4NzEsMHgzNywweDc1LDB4MWMsMHhiOCwweDg3LDB4MDMsMHhjZCwweDNhLDB4ODMsMHgwZSwweDk5LDB4MzYsMHgxMCwweGExLDB4NTAKKywweDM3LDB4YzcsMHgwNiwweDUwLDB4MzcsMHgwMCwweDAwLDB4MDksMHgwNiwweDk5LDB4MzYsMHhjNiwweDA2LDB4YTAsMHgzNiwweDA4CissMHhlOSwweDE0LDB4ZWYsMHg4MywweDBlLDB4OTksMHgzNiwweDA0LDB4YzcsMHgwNiwweDM3LDB4MzcsMHgwMywweDAwLDB4YzYsMHgwNgorLDB4Y2EsMHgzNCwweDAzLDB4YzYsMHgwNiwweGEwLDB4MzYsMHgwYSwweGU5LDB4ZmMsMHhlZSwweGExLDB4ZDEsMHgzNiwweDI2LDB4M2IKKywweDA2LDB4MjAsMHgwMCwweDc1LDB4MTUsMHhhMSwweGQzLDB4MzYsMHgyNiwweDNiLDB4MDYsMHgyMiwweDAwLDB4NzUsMHgxMiwweGExCissMHhkNSwweDM2LDB4MjYsMHgzYiwweDA2LDB4MjQsMHgwMCwweDc1LDB4MGYsMHhjMywweDhkLDB4MzYsMHgyMCwweDAwLDB4ZTksMHgwYgorLDB4MDAsMHg4ZCwweDM2LDB4MjIsMHgwMCwweGU5LDB4MDQsMHgwMCwweDhkLDB4MzYsMHgyNCwweDAwLDB4ODMsMHhjNCwweDAyLDB4ZjcKKywweDA2LDB4ZTYsMHgzNCwweDAxLDB4MDAsMHg3NCwweDE1LDB4MjYsMHgzYSwweDA0LDB4NzcsMHgwOCwweDcyLDB4MGUsMHgyNiwweDNhCissMHg2NCwweDAxLDB4NzIsMHgwOCwweGM2LDB4MDYsMHhhMCwweDM2LDB4MDYsMHhlOSwweGFiLDB4ZWUsMHhlOCwweDdjLDB4MGEsMHg4YworLDB4YzAsMHgzZCwweGZmLDB4ZmYsMHg3NCwweDFiLDB4MjYsMHhjNiwweDA2LDB4MTgsMHgwMCwweDEwLDB4MjYsMHhjNywweDA2LDB4MDQKKywweDAwLDB4NDksMHgzYywweDI2LDB4YzcsMHgwNiwweDA2LDB4MDAsMHgwYywweDAwLDB4Y2QsMHg1MCwweGI5LDB4NGUsMHgwMCwweGUyCissMHhmZSwweGM2LDB4MDYsMHhhMCwweDM2LDB4MGEsMHhlOSwweDk0LDB4ZWUsMHhlOSwweDdiLDB4ZWUsMHg4ZiwweDNjLDB4MDYsMHgzZAorLDB4MDYsMHgzZCwweDA2LDB4M2QsMHhkMiwweDNjLDB4ZWEsMHgzYywweDA2LDB4M2QsMHgwNiwweDNkLDB4YTMsMHhiNiwweDM0LDB4ODEKKywweDI2LDB4YzIsMHgzNCwweGFmLDB4ZGYsMHhjNywweDA2LDB4NGMsMHgzNywweDAwLDB4MDAsMHhiOCwweDhhLDB4MDMsMHhjZCwweDNhCissMHg4MCwweDNlLDB4OWQsMHgzNiwweDA0LDB4NzUsMHgwYywweDgwLDB4M2UsMHg5ZSwweDM2LDB4MDYsMHg3NCwweDA1LDB4YzYsMHgwNgorLDB4OWYsMHgzNiwweDA2LDB4MzMsMHhjMCwweGEwLDB4OWUsMHgzNiwweDhiLDB4ZjAsMHgyZSwweGZmLDB4YTQsMHg0YywweDNjLDB4ZjcKKywweDA2LDB4OWIsMHgzNiwweDAwLDB4MjAsMHg3NSwweDBlLDB4ODEsMHgyNiwweDliLDB4MzYsMHhmZiwweGJmLDB4YjgsMHg4YiwweDAzCissMHhjZCwweDNhLDB4ZTksMHg1NCwweDAwLDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDAxLDB4NzQsMHgwMywweGU5LDB4MTcsMHhlZQorLDB4YzcsMHgwNiwweDM3LDB4MzcsMHgwMiwweDAwLDB4YzYsMHgwNiwweGNhLDB4MzQsMHgwMiwweDgzLDB4MGUsMHg5OSwweDM2LDB4MDQKKywweDgzLDB4MGUsMHg1MCwweDM3LDB4MDQsMHhmNiwweDA2LDB4OWQsMHgzNiwweDgwLDB4NzUsMHgyYSwweGU4LDB4MWYsMHgwYiwweGU5CissMHgyNywweDAwLDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDAxLDB4NzUsMHhkMywweGM3LDB4MDYsMHgzNywweDM3LDB4MDIsMHgwMAorLDB4YzYsMHgwNiwweGNhLDB4MzQsMHgwMiwweDgzLDB4MGUsMHg5OSwweDM2LDB4MDQsMHhjNiwweDA2LDB4YTAsMHgzNiwweDAwLDB4ZjYKKywweDA2LDB4OWQsMHgzNiwweDgwLDB4NzQsMHgwMywweGU4LDB4ZGUsMHgwYSwweDgxLDB4MjYsMHg5YiwweDM2LDB4N2MsMHhmZiwweGJiCissMHhmZiwweGZmLDB4Y2QsMHg1MywweGNkLDB4NTQsMHhlOSwweGJlLDB4ZWQsMHhhMywweGI2LDB4MzQsMHhlOCwweGFkLDB4MDEsMHhiOAorLDB4ODYsMHgwMywweGNkLDB4MzksMHhjNywweDA2LDB4NGMsMHgzNywweDAwLDB4MDAsMHg4MSwweDI2LDB4YzIsMHgzNCwweGFmLDB4ZGYKKywweGY2LDB4MDYsMHg5ZCwweDM2LDB4ODAsMHg3NCwweDM0LDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDIwLDB4NzQsMHg1NiwweGY3CissMHgwNiwweDliLDB4MzYsMHgwMCwweDAxLDB4NzQsMHgyNywweGU4LDB4MzUsMHgwMSwweDcyLDB4MWMsMHhiZSwweDAwLDB4NDAsMHg4NQorLDB4MzYsMHhjMiwweDM0LDB4NzUsMHgwOCwweDA5LDB4MzYsMHhjMiwweDM0LDB4ZmYsMHgwNiwweDkyLDB4MzQsMHhlOCwweDhiLDB4MDEKKywweDczLDB4MDYsMHg4MSwweDBlLDB4OTksMHgzNiwweDgwLDB4MDAsMHhlOSwweDZjLDB4ZWQsMHhlOSwweGI1LDB4MDAsMHhjNywweDA2CissMHgzNywweDM3LDB4MDIsMHgwMCwweGM2LDB4MDYsMHhjYSwweDM0LDB4MDIsMHg4MywweDBlLDB4OTksMHgzNiwweDA0LDB4ODMsMHgwZQorLDB4NTAsMHgzNywweDA0LDB4ODAsMHgzZSwweDllLDB4MzYsMHgwOCwweDc0LDB4MDMsMHhlOCwweDVhLDB4MGEsMHhlOCwweGVmLDB4MDAKKywweDcyLDB4ZDYsMHhlOSwweGM4LDB4ZmYsMHg4MCwweDNlLDB4OWUsMHgzNiwweDBhLDB4NzUsMHgxMiwweGM2LDB4MDYsMHhhMCwweDM2CissMHgwMCwweGY3LDB4MDYsMHg5YiwweDM2LDB4MDgsMHgwMCwweDc0LDB4MDIsMHhjZCwweDU0LDB4ZTgsMHgzOSwweDBhLDB4ODEsMHgyNgorLDB4OWIsMHgzNiwweGZmLDB4YmYsMHhlOCwweGM4LDB4MDAsMHg3MiwweGFmLDB4YjgsMHg4YiwweDAzLDB4Y2QsMHgzOSwweGU5LDB4OWMKKywweGZmLDB4ZjYsMHgwNiwweDllLDB4MzYsMHhmZiwweDc1LDB4NTgsMHhhMywweGI2LDB4MzQsMHhlOCwweGZlLDB4MDAsMHg4MSwweDI2CissMHhjMiwweDM0LDB4ZmYsMHhiZiwweGY2LDB4MDYsMHg5ZCwweDM2LDB4ODAsMHg3NCwweDQ4LDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMAorLDB4MjAsMHg3NCwweDIyLDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDQwLDB4NzUsMHgwOCwweGU4LDB4OTEsMHgwMCwweDcyLDB4MzAKKywweGU5LDB4MjIsMHgwMCwweDI2LDB4YTEsMHgwYywweDAwLDB4YTksMHg2MCwweDAwLDB4NzUsMHgyNCwweDgxLDB4MGUsMHg2NiwweDM3CissMHgwMCwweDA4LDB4ZTksMHhkMiwweGVjLDB4YzcsMHgwNiwweDRjLDB4MzcsMHgwMCwweDAwLDB4ZTgsMHg3MSwweDAwLDB4NzIsMHgxMAorLDB4YjgsMHg4YiwweDAzLDB4Y2QsMHgzOSwweGU4LDB4ZDMsMHgwMCwweDczLDB4MDYsMHg4MSwweDBlLDB4OTksMHgzNiwweDgwLDB4MDAKKywweGU5LDB4YjQsMHhlYywweDgwLDB4M2UsMHg5ZCwweDM2LDB4MDQsMHg3NSwweDBjLDB4ODAsMHgzZSwweDllLDB4MzYsMHgwNiwweDc0CissMHg0NiwweGM2LDB4MDYsMHg5ZiwweDM2LDB4MDYsMHhmNywweDA2LDB4OWIsMHgzNiwweDAwLDB4MDEsMHg3NCwweDBjLDB4ODAsMHgzZQorLDB4OWQsMHgzNiwweDA4LDB4NzUsMHgwNSwweGM2LDB4MDYsMHg5ZiwweDM2LDB4MGEsMHhlOCwweDMyLDB4MDAsMHg3MiwweGQxLDB4ZTgKKywweDk5LDB4MDAsMHg4MCwweDNlLDB4OWQsMHgzNiwweDA4LDB4NzUsMHgxMywweDgxLDB4MGUsMHg5OSwweDM2LDB4ODAsMHgwMCwweGY3CissMHgwNiwweDliLDB4MzYsMHgwMCwweDIwLDB4NzUsMHgwOCwweGI4LDB4OGIsMHgwMywweGNkLDB4MzksMHhlOSwweDY4LDB4ZWMsMHhjNgorLDB4MDYsMHg5ZiwweDM2LDB4MGEsMHhlOSwweDYwLDB4ZWMsMHhiOCwweDg2LDB4MDMsMHhjZCwweDNhLDB4ZTksMHg1OCwweGVjLDB4MjYKKywweGExLDB4MGMsMHgwMCwweGE5LDB4NjAsMHgwMCwweDc0LDB4MDgsMHg4MSwweDI2LDB4YzIsMHgzNCwweGZmLDB4YmYsMHhmOSwweGMzCissMHhmNywweDA2LDB4OWIsMHgzNiwweDAwLDB4NDAsMHg3NCwweDEzLDB4ODEsMHgwZSwweDY2LDB4MzcsMHgwMCwweDA4LDB4ZTgsMHg0YQorLDB4MDAsMHg3MywweDA2LDB4ODEsMHgwZSwweDk5LDB4MzYsMHg4MCwweDAwLDB4ZjksMHhjMywweDgxLDB4MGUsMHg5YiwweDM2LDB4MDAKKywweDQwLDB4ODAsMHgyNiwweDZmLDB4MzcsMHhmZSwweDgxLDB4MjYsMHg5YiwweDM2LDB4N2YsMHhmZiwweGM2LDB4MDYsMHhhMCwweDM2CissMHgwMCwweGY4LDB4YzMsMHg4MSwweDBlLDB4OTksMHgzNiwweDAwLDB4MDEsMHhlOSwweDIxLDB4ZWMsMHgyNiwweGExLDB4MjAsMHgwMAorLDB4YTMsMHhmYiwweDM2LDB4YTMsMHhhYSwweDM0LDB4MjYsMHhhMSwweDIyLDB4MDAsMHhhMywweGZkLDB4MzYsMHhhMywweGFjLDB4MzQKKywweDI2LDB4YTEsMHgyNCwweDAwLDB4YTMsMHhmZiwweDM2LDB4YTMsMHhhZSwweDM0LDB4YzMsMHhhMSwweDA1LDB4MzcsMHgyNiwweDNiCissMHgwNiwweDIwLDB4MDAsMHg3NSwweDE5LDB4YTEsMHgwNywweDM3LDB4MjYsMHgzYiwweDA2LDB4MjIsMHgwMCwweDc1LDB4MGYsMHhhMQorLDB4MDksMHgzNywweDI2LDB4M2IsMHgwNiwweDI0LDB4MDAsMHg3NSwweDA1LDB4ZTgsMHgwMiwweDAwLDB4ZjgsMHhjMywweDUxLDB4MWUKKywweDA2LDB4OGIsMHhjNywweDhkLDB4MzYsMHgyMCwweDAwLDB4YmYsMHgwNSwweDM3LDB4YjksMHgwMywweDAwLDB4MWUsMHgwNiwweDFmCissMHgwNywweGYzLDB4YTUsMHg4YiwweGY4LDB4OGQsMHgzNiwweDIwLDB4MDAsMHhiZiwweGEwLDB4MzQsMHhiOSwweDAzLDB4MDAsMHhmMworLDB4YTUsMHgwNywweDFmLDB4NTksMHg4YiwweGY4LDB4YTEsMHgwNywweDM3LDB4YTMsMHhhNiwweDM0LDB4YTEsMHgwOSwweDM3LDB4YTMKKywweGE4LDB4MzQsMHhmOSwweGMzLDB4YzYsMHgwNiwweGI2LDB4MzQsMHgwMSwweGU5LDB4OGIsMHhlYiwweGU4LDB4ODcsMHgwOCwweDhiCissMHhmMCwweDA1LDB4MTIsMHgwMCwweDI2LDB4MjksMHgwNiwweDBlLDB4MDAsMHgyNiwweDhiLDB4NDQsMHgyYSwweDI2LDB4M2EsMHgwNgorLDB4MGUsMHgwMCwweDc1LDB4NWIsMHgyNiwweDgzLDB4MmUsMHgwZSwweDAwLDB4MDIsMHg4MCwweGZjLDB4MjcsMHg3NSwweDUwLDB4MjYKKywweDhiLDB4NDQsMHgyYywweGE5LDB4ZmYsMHhmZiwweDc1LDB4NDcsMHg4YiwweGZlLDB4MzMsMHhjMCwweDI2LDB4ZjYsMHg0NSwweDNjCissMHg4MCwweDc0LDB4MDYsMHgyNiwweDhhLDB4NDUsMHgzYSwweDI0LDB4MWYsMHgwMywweGY4LDB4MjYsMHg4MCwweDdkLDB4NDUsMHgwOQorLDB4NzUsMHgyZCwweDhjLDB4YzIsMHg4ZSwweDA2LDB4MzgsMHgzNCwweDhlLDB4ZGEsMHg4YiwweDBlLDB4MGUsMHgwMCwweDI2LDB4ODkKKywweDBlLDB4MGUsMHgwMCwweDhkLDB4NzQsMHgyYywweGJmLDB4MTgsMHgwMCwweGYzLDB4YTQsMHgzMywweGMwLDB4OGUsMHhkOCwweDI2CissMHhjNywweDA2LDB4MDQsMHgwMCwweGI1LDB4M2YsMHgyNiwweGM3LDB4MDYsMHgwNiwweDAwLDB4MDYsMHgwMCwweGNkLDB4NTAsMHhiOAorLDB4MDYsMHg4MCwweGU5LDB4ZWYsMHhlOSwweDI2LDB4YTEsMHgwYywweDAwLDB4YTMsMHg5MywweDM3LDB4ODMsMHgwZSwweDk5LDB4MzYKKywweDAxLDB4ZTksMHgwMCwweGViLDB4MjYsMHg4MCwweDNlLDB4MWMsMHgwMCwweGZmLDB4NzUsMHgyZiwweDI2LDB4ODAsMHgzZSwweDFlCissMHgwMCwweGZmLDB4NzUsMHgyNywweDI2LDB4ZjcsMHgwNiwweDBjLDB4MDAsMHg0MCwweDAwLDB4NzUsMHgxYiwweGExLDB4ZDEsMHgzNgorLDB4MjYsMHhhMywweDFhLDB4MDAsMHhhMSwweGQzLDB4MzYsMHgyNiwweGEzLDB4MWMsMHgwMCwweGExLDB4ZDUsMHgzNiwweDI2LDB4YTMKKywweDFlLDB4MDAsMHhiOCwweDBhLDB4ODAsMHhlOCwweDM2LDB4MDcsMHhlOSwweGUyLDB4ZWEsMHhmZiwweDA2LDB4OTAsMHgzNCwweGJlCissMHgwYSwweDAwLDB4YzYsMHgwNiwweGI2LDB4MzQsMHgwMSwweGY2LDB4MDYsMHg5ZCwweDM2LDB4ODAsMHg3NSwweDA1LDB4ODMsMHgwZQorLDB4YzIsMHgzNCwweDAxLDB4ZTksMHhiNiwweGVhLDB4ODAsMHgzZSwweDlkLDB4MzYsMHgwYSwweDc1LDB4MGYsMHgyNiwweGExLDB4MGMKKywweDAwLDB4MjUsMHgwNywweDAwLDB4M2QsMHgwNCwweDAwLDB4NzUsMHgwMywweGU4LDB4NzksMHgwMCwweGExLDB4ZjMsMHgzNiwweDg2CissMHhlMCwweGU3LDB4MWUsMHhhMywweGUzLDB4MzYsMHg4MSwweDI2LDB4MGIsMHgzNywweDAwLDB4MDMsMHg4MSwweDI2LDB4MGQsMHgzNworLDB4N2IsMHg3ZiwweDgzLDB4MGUsMHgwZCwweDM3LDB4NDgsMHhlOCwweDFlLDB4MDAsMHgyNiwweGExLDB4MGMsMHgwMCwweDI1LDB4MDcKKywweDAwLDB4M2QsMHgwNCwweDAwLDB4NzQsMHgwOSwweDI2LDB4ZjcsMHgwNiwweDBjLDB4MDAsMHgyMCwweDAwLDB4NzUsMHgwNiwweGI4CissMHgwMSwweDAwLDB4ZTksMHgzZiwweGU5LDB4ZTksMHg1ZiwweGVhLDB4YzcsMHgwNiwweDQxLDB4MzcsMHgwMCwweDAwLDB4YjgsMHg3ZgorLDB4MDMsMHhjZCwweDNhLDB4YTEsMHgxZCwweDM3LDB4YTMsMHhjNCwweDM0LDB4ODYsMHhlMCwweDY4LDB4N2YsMHgwMywweDFmLDB4YTMKKywweDA2LDB4MDAsMHgzMywweGMwLDB4OGUsMHhkOCwweGExLDB4MGIsMHgzNywweGEzLDB4YjIsMHgzNCwweGExLDB4MGQsMHgzNywweGEzCissMHhiNCwweDM0LDB4YTEsMHhmMywweDM2LDB4YTMsMHhjOCwweDM0LDB4YTEsMHhlZiwweDM2LDB4YTMsMHg5YywweDM0LDB4YTEsMHhmMQorLDB4MzYsMHhhMywweDllLDB4MzQsMHhjMywweDgwLDB4MGUsMHg5ZCwweDM2LDB4ODAsMHhiZSwweDAwLDB4MDAsMHhlOCwweGI0LDB4MDcKKywweGI4LDB4N2IsMHgwMywweGNkLDB4M2EsMHhiOCwweDdjLDB4MDMsMHhjZCwweDM5LDB4YzcsMHgwNiwweDMzLDB4MzcsMHgwMiwweDAwCissMHhhMSwweGU1LDB4MzYsMHhlNywweDJlLDB4YTEsMHhlNywweDM2LDB4ZTcsMHgzZSwweGI4LDB4ODIsMHgwMywweGNkLDB4M2EsMHhmNworLDB4MDYsMHg5YiwweDM2LDB4MDAsMHgyMCwweDc1LDB4MDMsMHhlOCwweGZkLDB4MDYsMHhhMSwweGQzLDB4MzYsMHhhMywweGVmLDB4MzYKKywweGEzLDB4OWMsMHgzNCwweGExLDB4ZDUsMHgzNiwweGEzLDB4ZjEsMHgzNiwweGEzLDB4OWUsMHgzNCwweGMzLDB4ZjYsMHgwNiwweDlkCissMHgzNiwweDgwLDB4NzQsMHgzMSwweGJlLDB4MjIsMHgwMCwweGU5LDB4MTcsMHgwMCwweGY2LDB4MDYsMHg5ZCwweDM2LDB4ODAsMHg3NAorLDB4MjQsMHhiZSwweDIzLDB4MDAsMHhlOSwweDBhLDB4MDAsMHhmNiwweDA2LDB4OWQsMHgzNiwweDgwLDB4NzQsMHgxNywweGJlLDB4MjQKKywweDAwLDB4NTYsMHhlOCwweGE4LDB4MDUsMHg4YywweGMwLDB4M2QsMHhmZiwweGZmLDB4NWUsMHg3NCwweDA1LDB4ZTgsMHhkNywweGVmCissMHhjZCwweDUwLDB4ZTksMHgxZiwweGU4LDB4ZTksMHg5ZiwweGU5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4YjgsMHg4NCwweDAzLDB4Y2QsMHgzYSwweGI4LDB4OGEsMHgwMywweGNkLDB4MzksMHhlOSwweGY3LDB4MDAsMHg4MCwweDNlLDB4YTAKKywweDM2LDB4MDgsMHg3NSwweDJlLDB4YTksMHhkMCwweDA3LDB4NzUsMHgyYywweGExLDB4YjEsMHgzNiwweDBkLDB4MDAsMHgwNCwweGU3CissMHgwOCwweGU1LDB4MDAsMHgyNSwweGZmLDB4NzMsMHhlNywweDAwLDB4YjgsMHg4YSwweDAzLDB4Y2QsMHgzYSwweGU4LDB4YzMsMHgwNgorLDB4MzMsMHhjMCwweGU3LDB4MGUsMHhlNSwweDBhLDB4MjUsMHhjMywweDE3LDB4ZTcsMHgwYSwweGNkLDB4NTQsMHhjNiwweDA2LDB4YTAKKywweDM2LDB4MDAsMHhlOSwweDY4LDB4ZTksMHhiZSwweDA0LDB4MDAsMHhlOSwweDNmLDB4ZTksMHg4MywweDI2LDB4OWIsMHgzNiwweGJmCissMHhjNiwweDA2LDB4NzEsMHgzNywweDAzLDB4YjgsMHg4NiwweDAzLDB4Y2QsMHgzYSwweGI4LDB4ODgsMHgwMywweGNkLDB4M2EsMHhiOAorLDB4ODMsMHgwMywweGNkLDB4M2EsMHhiOCwweDg3LDB4MDMsMHhjZCwweDM5LDB4ODEsMHgwZSwweGMyLDB4MzQsMHgwMCwweDIwLDB4ZTkKKywweDkyLDB4MDAsMHhlOCwweDQ5LDB4MDYsMHhiOCwweDg3LDB4MDMsMHhjZCwweDM5LDB4YmIsMHhmZiwweDdmLDB4Y2QsMHg1MywweGI4CissMHg4NCwweDAzLDB4Y2QsMHgzYSwweGI4LDB4ODgsMHgwMywweGNkLDB4M2EsMHhiOCwweDhiLDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4MworLDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4NiwweDAzLDB4Y2QsMHgzYSwweGI4LDB4ODUsMHgwMywweGNkLDB4M2EsMHhjMywweGU1LDB4MDAKKywweDI1LDB4ZmYsMHg1MywweGU3LDB4MDAsMHg4MywweDBlLDB4YzIsMHgzNCwweDQwLDB4ODMsMHgyNiwweGMyLDB4MzQsMHhlZiwweGU4CissMHgwYywweDA2LDB4YmIsMHhmZiwweDdmLDB4Y2QsMHg1MywweGI4LDB4OGEsMHgwMywweGNkLDB4M2EsMHhiOCwweDg1LDB4MDMsMHhjZAorLDB4M2EsMHhiOCwweDg2LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4MywweDAzLDB4Y2QsMHgzYSwweGI4LDB4ODcsMHgwMywweGNkLDB4M2EKKywweGI4LDB4OGIsMHgwMywweGNkLDB4M2EsMHhiOCwweDg0LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4OSwweDAzLDB4Y2QsMHgzYSwweGMzCissMHg4MywweDBlLDB4YzIsMHgzNCwweDUwLDB4ZTgsMHgxOCwweDA0LDB4ZTgsMHhkMywweDA1LDB4ZjYsMHgwNiwweDZmLDB4MzcsMHgwMQorLDB4NzUsMHgxMiwweGI4LDB4ODksMHgwMywweGNkLDB4MzksMHg4MywweDNlLDB4MGYsMHgzNywweDAwLDB4NzUsMHgwNiwweGM3LDB4MDYKKywweDBmLDB4MzcsMHgwNCwweDAwLDB4YTEsMHg5ZCwweDM2LDB4ODAsMHhmYywweDA4LDB4NzQsMHgwNSwweGI4LDB4ODQsMHgwMywweGNkCissMHgzOSwweGU1LDB4MDIsMHgwZCwweDAxLDB4MDgsMHgyNSwweGVmLDB4ZmYsMHhlNywweDAyLDB4YTEsMHg5ZCwweDM2LDB4ODYsMHhlMAorLDB4MzIsMHhlNCwweDhiLDB4ZjAsMHhkMSwweGVlLDB4MzMsMHhjMCwweDBkLDB4MjAsMHgwMCwweDA5LDB4MDYsMHhhZCwweDM2LDB4YTEKKywweGFkLDB4MzYsMHhlNywweDA0LDB4ZTksMHg1MywweGU4LDB4ZTksMHg1YSwweGU4LDB4MzMsMHhjMCwweGEwLDB4MWIsMHgzNywweGQxCissMHhlMCwweDNhLDB4MDYsMHhhMCwweDM2LDB4NzUsMHgwMywweGU5LDB4YmEsMHhmZiwweGU5LDB4NjAsMHhlOCwweGM3LDB4MDYsMHg0MQorLDB4MzcsMHgwMCwweDAwLDB4ZTgsMHhjMSwweGUxLDB4ZTgsMHg2YSwweDA2LDB4MzMsMHhjMCwweDBkLDB4NDEsMHgwMCwweGU3LDB4NTYKKywweGExLDB4YjEsMHgzNiwweDBkLDB4MDAsMHgxMCwweGU3LDB4MDgsMHhlNSwweDAyLDB4MjUsMHhmOSwweGZmLDB4MGQsMHgwMywweDAwCissMHhlNywweDAyLDB4YTEsMHhiMywweDM2LDB4ZTcsMHgwYSwweGExLDB4YWYsMHgzNiwweGU3LDB4MDYsMHhhMSwweGFkLDB4MzYsMHhlNworLDB4MDQsMHhlOCwweDdjLDB4MDMsMHhlOCwweDlmLDB4MDMsMHhjNywweDA2LDB4MWQsMHgzNywweDAwLDB4YzgsMHhjNywweDA2LDB4MGIKKywweDM3LDB4MDAsMHgwMywweGM3LDB4MDYsMHgwZCwweDM3LDB4N2IsMHg3ZiwweDMzLDB4YzAsMHhhMywweDk5LDB4MzYsMHhhMywweDliCissMHgzNiwweGEzLDB4OWQsMHgzNiwweGEzLDB4OWYsMHgzNiwweGEzLDB4NGMsMHgzNywweGEzLDB4ZjMsMHgzNiwweGEzLDB4ZWYsMHgzNgorLDB4YTMsMHhmMSwweDM2LDB4ZTgsMHg4MiwweGZkLDB4YzYsMHgwNiwweDlmLDB4MzYsMHgwMiwweGU5LDB4ZWYsMHhlNywweGU1LDB4MDIKKywweDBkLDB4MDEsMHg4OCwweDI1LDB4ZWYsMHhmZiwweDBkLDB4MDAsMHg0MCwweDBkLDB4MDAsMHgwNCwweGU3LDB4MDIsMHhlOCwweGYyCissMHgwNSwweGU1LDB4MGEsMHgwZCwweDQwLDB4MDAsMHhlNywweDBhLDB4MzMsMHhjMCwweGEzLDB4ODEsMHgzNywweGEzLDB4ODUsMHgzNworLDB4YTMsMHg4MywweDM3LDB4YTMsMHg4NywweDM3LDB4YTMsMHg4OSwweDM3LDB4ZTUsMHgwMCwweDBkLDB4MDAsMHg4NCwweGU3LDB4MDAKKywweGI4LDB4OGMsMHgwMywweGNkLDB4MzksMHhiOCwweDgwLDB4MDAsMHhjZCwweDM1LDB4YzcsMHgwNiwweGFhLDB4MDIsMHhmZiwweGZmCissMHhlNSwweDAwLDB4MjUsMHhmZiwweDdiLDB4ZTcsMHgwMCwweDgxLDB4MGUsMHg5YSwweDM3LDB4ODAsMHgwMCwweGI4LDB4N2UsMHgwMworLDB4Y2QsMHgzOSwweDMzLDB4YzAsMHhlNywweDBlLDB4YmUsMHgwOCwweDAwLDB4OGUsMHgwNiwweDM4LDB4MzQsMHhlOCwweGE3LDB4ZWQKKywweDgzLDB4MjYsMHhlZiwweDM0LDB4ZGYsMHhmZiwweDA2LDB4ODEsMHgzNywweGNkLDB4NTAsMHg4MywweDBlLDB4ZWYsMHgzNCwweDIwCissMHhjMywweGY3LDB4MDYsMHg5YSwweDM3LDB4ODAsMHgwMCwweDc0LDB4M2QsMHhhOSwweGQwLDB4MDcsMHg3NCwweDEwLDB4YTksMHgwMAorLDB4MDQsMHg3NCwweDEyLDB4MzMsMHhjMCwweGU3LDB4MGUsMHhmZiwweDA2LDB4ODcsMHgzNywweGU5LDB4ZDIsMHhmZiwweGZmLDB4MDYKKywweDg1LDB4MzcsMHhlOSwweGNiLDB4ZmYsMHhmZiwweDA2LDB4ODMsMHgzNywweGU5LDB4YzQsMHhmZiwweDgzLDB4MjYsMHg5YSwweDM3CissMHg3ZiwweGExLDB4ODksMHgzNywweDAzLDB4MDYsMHg4NywweDM3LDB4M2QsMHgwNSwweDAwLDB4N2YsMHgwMSwweGMzLDB4YmIsMHhmZgorLDB4N2YsMHhjZCwweDUzLDB4ZTksMHgwMCwweDAwLDB4ZTUsMHgwMiwweDI1LDB4ZmYsMHhmYiwweDI1LDB4ZWYsMHhmZiwweDBkLDB4MDEKKywweDAwLDB4ZTcsMHgwMiwweGExLDB4ODMsMHgzNywweDNiLDB4MDYsMHg0NiwweDM3LDB4N2YsMHgyYSwweGExLDB4ODUsMHgzNywweDNiCissMHgwNiwweDQ4LDB4MzcsMHg3YywweDIxLDB4YTEsMHg4OSwweDM3LDB4MDMsMHgwNiwweDg3LDB4MzcsMHgzZCwweDA1LDB4MDAsMHg3ZgorLDB4MTUsMHhjNiwweDA2LDB4OWYsMHgzNiwweDA0LDB4ZTUsMHgwMiwweDI1LDB4ZmYsMHhmNywweDBkLDB4MDEsMHgwMCwweDI1LDB4ZWYKKywweGZmLDB4ZTcsMHgwMiwweGU5LDB4ZjcsMHhlNiwweGJlLDB4MDEsMHgwMCwweGY3LDB4MDYsMHg5YiwweDM2LDB4MDMsMHgwMCwweDc0CissMHgwYSwweDgzLDB4MjYsMHg5YiwweDM2LDB4ZmMsMHg4MywweDBlLDB4YzIsMHgzNCwweDA0LDB4ZTksMHhkMCwweGU2LDB4YjgsMHg3YgorLDB4MDMsMHhjZCwweDM5LDB4ZTUsMHgwMiwweDBkLDB4MDEsMHg2MCwweDI1LDB4ZWYsMHhmZiwweGU3LDB4MDIsMHhjNywweDA2LDB4ZjEKKywweDM0LDB4MjAsMHgwMywweGI4LDB4OGUsMHgwMywweGNkLDB4MzksMHhjMywweDgxLDB4MjYsMHhjMiwweDM0LDB4N2YsMHhmZiwweDgwCissMHgwZSwweDZmLDB4MzcsMHgwMSwweGY3LDB4MDYsMHg5YiwweDM2LDB4MDMsMHgwMCwweDc0LDB4ZDIsMHhiOCwweDdiLDB4MDMsMHhjZAorLDB4M2EsMHhiOCwweDdkLDB4MDMsMHhjZCwweDM5LDB4ODMsMHgyNiwweDliLDB4MzYsMHhlZiwweDMzLDB4YzAsMHhiMCwweDhhLDB4YTIKKywweDlmLDB4MzYsMHhhMiwweDlkLDB4MzYsMHhjNywweDA2LDB4NGMsMHgzNywweDAxLDB4MDAsMHhjNywweDA2LDB4MGYsMHgzNywweDA0CissMHgwMCwweGY3LDB4MDYsMHg5YiwweDM2LDB4NDAsMHgwMCwweDc1LDB4MDYsMHhjNywweDA2LDB4MGYsMHgzNywweDAzLDB4MDAsMHhiOAorLDB4OGQsMHgwMywweGNkLDB4MzksMHhlOCwweDAwLDB4ZDUsMHhlNSwweDAyLDB4MGQsMHgwMSwweDQwLDB4MjUsMHhlZiwweGZmLDB4OGIKKywweGQ4LDB4YjgsMHg3YywweDAzLDB4Y2QsMHgzOSwweGM3LDB4MDYsMHgzMywweDM3LDB4MDIsMHgwMCwweDhiLDB4YzMsMHgwZCwweDAwCissMHgyMCwweDI1LDB4ZjksMHhmZiwweDBiLDB4MDYsMHhlOCwweDNhLDB4ZTcsMHgwMiwweGMzLDB4ZmYsMHgwZSwweGYxLDB4MzQsMHg3NQorLDB4MDEsMHhjMywweGU1LDB4NGUsMHhhOSwweDAxLDB4MDAsMHg3NSwweDEyLDB4ZTUsMHgwMCwweGE5LDB4MDAsMHgwNCwweDc1LDB4MDUKKywweDBkLDB4MDAsMHgwNCwweGU3LDB4MDAsMHhiOCwweDhlLDB4MDMsMHhjZCwweDM5LDB4YzMsMHhlNSwweDAwLDB4YTksMHgwMCwweDA0CissMHg3NCwweGYzLDB4MjUsMHhmZiwweGZiLDB4ZTcsMHgwMCwweGU5LDB4ZWIsMHhmZiwweGM2LDB4MDYsMHhhMCwweDM2LDB4MDQsMHg4MworLDB4MjYsMHg5YiwweDM2LDB4ZmMsMHg4MSwweDBlLDB4OWIsMHgzNiwweDgwLDB4MDAsMHhlOSwweDEwLDB4ZTYsMHhiOCwweDhlLDB4MDMKKywweGNkLDB4M2EsMHhjZCwweDU0LDB4ODEsMHgwZSwweGFmLDB4MzYsMHgwMCwweDE4LDB4YTEsMHhhZiwweDM2LDB4ZTcsMHgwNiwweGI4CissMHg3YiwweDAzLDB4Y2QsMHgzOSwweGExLDB4ZDMsMHgzNiwweGEzLDB4OGYsMHgzNywweGExLDB4ZDUsMHgzNiwweGEzLDB4OTEsMHgzNworLDB4YzcsMHgwNiwweDhiLDB4MzcsMHgwMiwweDAwLDB4YzcsMHgwNiwweDhkLDB4MzcsMHgwMiwweDAwLDB4ODMsMHgwZSwweDk5LDB4MzYKKywweDQwLDB4ZTksMHhkOSwweGU1LDB4ODAsMHgzZSwweDlmLDB4MzYsMHgwNiwweDc1LDB4MTUsMHhhOSwweGQwLDB4MDcsMHg3NSwweGVjCissMHgyNSwweDAwLDB4MTgsMHg3NSwweDBlLDB4ZmYsMHgwZSwweDhiLDB4MzcsMHg3NSwweGUxLDB4YzYsMHgwNiwweDlmLDB4MzYsMHgwOAorLDB4ZTksMHhiYSwweGU1LDB4ZmYsMHgwZSwweDhkLDB4MzcsMHg3NSwweGQzLDB4YmUsMHgwOCwweDAwLDB4ZTksMHg5ZiwweGU1LDB4YjgKKywweDdiLDB4MDMsMHhjZCwweDM5LDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDIwLDB4NzQsMHgwOCwweGM2LDB4MDYsMHg5ZiwweDM2CissMHgwYSwweGU5LDB4MGQsMHgwMCwweGY3LDB4MDYsMHg5YiwweDM2LDB4MDAsMHg0MCwweDc0LDB4MGIsMHhiOCwweDhiLDB4MDMsMHhjZAorLDB4MzksMHg4MSwweDBlLDB4OTksMHgzNiwweDgwLDB4MDAsMHhlOSwweDgzLDB4ZTUsMHhiOCwweDdiLDB4MDMsMHhjZCwweDM5LDB4YzcKKywweDA2LDB4OGIsMHgzNywweDA0LDB4MDAsMHhjNywweDA2LDB4OGQsMHgzNywweDA0LDB4MDAsMHg4MSwweDBlLDB4OTksMHgzNiwweDAwCissMHgwMiwweGU5LDB4NjksMHhlNSwweGY2LDB4MDYsMHg5ZCwweDM2LDB4ODAsMHg3NSwweDFiLDB4YTksMHhkMCwweDA3LDB4NzUsMHhlYgorLDB4YTksMHgwMCwweDE4LDB4NzUsMHgwYywweGZmLDB4MGUsMHg4ZCwweDM3LDB4NzUsMHhlMCwweGU4LDB4MTcsMHhmYiwweGU5LDB4NGMKKywweGU1LDB4YjgsMHg4MiwweDAzLDB4Y2QsMHgzOSwweGMzLDB4ZmYsMHgwZSwweDhiLDB4MzcsMHg3NSwweGNlLDB4YmUsMHgwOSwweDAwCissMHhlOSwweDJiLDB4ZTUsMHhjNywweDA2LDB4M2QsMHgzNywweDAwLDB4MDAsMHhjNywweDA2LDB4OWIsMHgzNiwweDAwLDB4MDAsMHhlOAorLDB4M2MsMHgwMiwweDgxLDB4MjYsMHhhZiwweDM2LDB4ZmYsMHhlNywweGExLDB4YWYsMHgzNiwweGU3LDB4MDYsMHg4MSwweDI2LDB4OWIKKywweDM2LDB4ZmYsMHg3ZiwweGU1LDB4MDIsMHgwZCwweDAxLDB4MDAsMHgyNSwweGVmLDB4ZmYsMHgyNSwweGZmLDB4ZGYsMHhlNywweDAyCissMHhiYiwweGZmLDB4N2YsMHhjZCwweDUzLDB4MzMsMHhjMCwweGEzLDB4OWQsMHgzNiwweGEzLDB4OWYsMHgzNiwweGU4LDB4NTAsMHgwMAorLDB4ZTgsMHg3MywweDAwLDB4YjgsMHg4MSwweDAzLDB4Y2QsMHgzOSwweGMzLDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMywweDAwLDB4NzQKKywweDBkLDB4YzYsMHgwNiwweDlmLDB4MzYsMHgwMiwweGM2LDB4MDYsMHhhMCwweDM2LDB4MDAsMHhlOSwweGRmLDB4ZTQsMHg4MywweDBlCissMHg5YiwweDM2LDB4MTAsMHhjNywweDA2LDB4OTksMHgzNiwweDAwLDB4MDAsMHhlOCwweGU3LDB4MDIsMHhlNSwweDU2LDB4MGQsMHgwMgorLDB4MDAsMHhlNywweDU2LDB4YzcsMHgwNiwweGE4LDB4MDIsMHgwMCwweDAwLDB4OGIsMHgzNiwweDNkLDB4MzcsMHhlOCwweDQ0LDB4MDIKKywweGM2LDB4MDYsMHhhMCwweDM2LDB4MGUsMHhlOSwweGI1LDB4ZTQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwNiwweGI4LDB4OGEsMHgwMywweGNkLDB4M2EsMHhiOCwweDg1LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4NiwweDAzLDB4Y2QsMHgzYQorLDB4YjgsMHg4MywweDAzLDB4Y2QsMHgzYSwweGI4LDB4ODcsMHgwMywweGNkLDB4M2EsMHhiOCwweDhiLDB4MDMsMHhjZCwweDNhLDB4YjgKKywweDg4LDB4MDMsMHhjZCwweDNhLDB4MDcsMHhjMywweDA2LDB4YjgsMHg4OCwweDAzLDB4Y2QsMHgzYSwweGI4LDB4N2IsMHgwMywweGNkCissMHgzYSwweGI4LDB4ODIsMHgwMywweGNkLDB4M2EsMHhiOCwweDdmLDB4MDMsMHhjZCwweDNhLDB4YjgsMHg3YywweDAzLDB4Y2QsMHgzYQorLDB4YjgsMHg3ZSwweDAzLDB4Y2QsMHgzYSwweGI4LDB4ODAsMHgwMywweGNkLDB4M2EsMHhiOCwweDgxLDB4MDMsMHhjZCwweDNhLDB4YjgKKywweDg0LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4OSwweDAzLDB4Y2QsMHgzYSwweGI4LDB4N2QsMHgwMywweGNkLDB4M2EsMHhiOCwweDhkCissMHgwMywweGNkLDB4M2EsMHhjNywweDA2LDB4NDEsMHgzNywweDAwLDB4MDAsMHgwNywweGMzLDB4MDYsMHg4ZSwweDA2LDB4MzgsMHgzNAorLDB4MWYsMHg4YiwweDBlLDB4MGUsMHgwMCwweDI2LDB4ODksMHgwZSwweDBlLDB4MDAsMHhiZSwweDE4LDB4MDAsMHhiZiwweDE4LDB4MDAKKywweGYzLDB4YTQsMHgwNiwweDFlLDB4MDcsMHhjZCwweDM0LDB4MDcsMHgzMywweGMwLDB4OGUsMHhkOCwweGMzLDB4MjYsMHhmNiwweDA2CissMHgyMCwweDAwLDB4ODAsMHg3NCwweDQ0LDB4MzMsMHhjMCwweDI2LDB4YTAsMHgyNiwweDAwLDB4MjQsMHgxZiwweDhiLDB4ZjAsMHgyNgorLDB4OGIsMHg1YywweDI4LDB4ODksMHgxZSwweDZhLDB4MzcsMHgwNiwweDhlLDB4MDYsMHgzOCwweDM0LDB4MWYsMHhjMCwweGUzLDB4MDQKKywweDI2LDB4ODgsMHg1YywweDI4LDB4OGIsMHhjNiwweGI5LDB4MDYsMHgwMCwweGJlLDB4MjAsMHgwMCwweGJmLDB4MWEsMHgwMCwweGYzCissMHhhNCwweDhiLDB4YzgsMHg4MywweGM3LDB4MDYsMHhmMywweGE0LDB4MjYsMHg4MSwweDI2LDB4MjYsMHgwMCwweDFmLDB4ODAsMHgyNgorLDB4ODEsMHgzNiwweDI2LDB4MDAsMHgwMCwweDgwLDB4ZTksMHhhOSwweGZmLDB4MjYsMHg4YiwweDFlLDB4MjgsMHgwMCwweDg5LDB4MWUKKywweDZhLDB4MzcsMHgwNiwweDhlLDB4MDYsMHgzOCwweDM0LDB4MWYsMHhjMCwweGUzLDB4MDQsMHgyNiwweDg4LDB4MWUsMHgyOCwweDAwCissMHhiOSwweDA2LDB4MDAsMHhiZSwweDIwLDB4MDAsMHhiZiwweDFhLDB4MDAsMHhmMywweGE0LDB4ZTksMHg4NCwweGZmLDB4ODYsMHhjNAorLDB4YTMsMHg2OCwweDM3LDB4ZTgsMHg4NywweGZmLDB4ZjcsMHgwNiwweDZhLDB4MzcsMHgwZiwweDAwLDB4NzQsMHgxMCwweDgwLDB4M2UKKywweDllLDB4MzYsMHgwMCwweDc1LDB4MDksMHhiZSwweDAwLDB4MDAsMHhlOCwweGFjLDB4ZTksMHhjZCwweDUwLDB4YzMsMHhjMywweDUwCissMHg1NiwweDA2LDB4MzMsMHhjMCwweDI2LDB4ZjYsMHgwNiwweDIwLDB4MDAsMHg4MCwweDc0LDB4MDYsMHgyNiwweGEwLDB4MjYsMHgwMAorLDB4MjQsMHgxZiwweDhiLDB4ZjAsMHgyNiwweDhiLDB4NWMsMHgyNiwweDg2LDB4ZmIsMHg4MywweGViLDB4MDQsMHg3NCwweDRmLDB4ODMKKywweGM2LDB4MmEsMHg4YywweGMwLDB4OGUsMHhkOCwweGI5LDB4MDcsMHgwMCwweDMzLDB4YzAsMHg4ZSwweGMwLDB4YmYsMHg3MiwweDM3CissMHhmMywweGFiLDB4MzMsMHhjOSwweDhhLDB4MGMsMHg4MCwweGY5LDB4MDAsMHg3NSwweDAzLDB4ZTksMHgzMCwweDAwLDB4M2IsMHhkOQorLDB4NzMsMHgwMywweGU5LDB4MjksMHgwMCwweDJiLDB4ZDksMHg4YSwweDQ0LDB4MDEsMHgyNSwweDNmLDB4MDAsMHg3NCwweDE5LDB4M2QKKywweDBiLDB4MDAsMHg3ZCwweDE0LDB4ZDEsMHhlMCwweDhiLDB4ZjgsMHgyZSwweDhiLDB4YmQsMHg1YywweDQ5LDB4OGQsMHg3NCwweDAyCissMHg4MywweGU5LDB4MDIsMHhmMywweGE0LDB4ZTksMHgwMiwweDAwLDB4MDMsMHhmMSwweDIzLDB4ZGIsMHg3NSwweGM0LDB4MzMsMHhjMAorLDB4OGUsMHhkOCwweDA3LDB4NWUsMHg1OCwweGMzLDB4MzMsMHhjMCwweDI2LDB4ZjYsMHgwNiwweDIwLDB4MDAsMHg4MCwweDc0LDB4MDYKKywweDI2LDB4YTAsMHgyNiwweDAwLDB4MjQsMHgxZiwweGMzLDB4ZTUsMHgwYSwweDI1LDB4YzMsMHhiZiwweGU3LDB4MGEsMHhiOCwweDg2CissMHgwMywweGNkLDB4MzksMHhiOCwweDgzLDB4MDMsMHhjZCwweDM5LDB4ODEsMHgyNiwweDliLDB4MzYsMHg3YywweGRmLDB4YjgsMHg4NQorLDB4MDMsMHhjZCwweDNhLDB4ZTUsMHgwMiwweDI1LDB4ZmYsMHhmMywweDBkLDB4MDEsMHgwMCwweDI1LDB4ZWYsMHhmZiwweGU3LDB4MDIKKywweGU1LDB4MDAsMHgyNSwweGZmLDB4NTMsMHhlNywweDAwLDB4YTEsMHhlNywweDM2LDB4MjUsMHhmZiwweGZlLDB4YTMsMHhlNywweDM2CissMHhlNywweDNlLDB4ODMsMHgyNiwweDk5LDB4MzYsMHhjZiwweDgxLDB4MGUsMHhhZiwweDM2LDB4MDAsMHgxMCwweGExLDB4YWYsMHgzNgorLDB4ZTcsMHgwNiwweGMzLDB4ZTUsMHgwMiwweDBkLDB4MDEsMHgwYywweDI1LDB4ZWYsMHhmZiwweGU3LDB4MDIsMHhhMSwweGU3LDB4MzYKKywweDBkLDB4MDAsMHgwMSwweGU3LDB4M2UsMHhhMywweGU3LDB4MzYsMHg4MSwweDBlLDB4OWIsMHgzNiwweDAwLDB4MjAsMHg4MywweDBlCissMHg5OSwweDM2LDB4MjAsMHg4MSwweDI2LDB4OWIsMHgzNiwweDdjLDB4YmYsMHg4MSwweDBlLDB4YWYsMHgzNiwweDAwLDB4MTAsMHhhMQorLDB4YWYsMHgzNiwweGU3LDB4MDYsMHhiOCwweDg2LDB4MDMsMHhjZCwweDM5LDB4YjgsMHg4NSwweDAzLDB4Y2QsMHgzOSwweGI4LDB4ODMKKywweDAzLDB4Y2QsMHgzYSwweGMzLDB4MGIsMHhmNiwweDc1LDB4NDksMHgwNiwweDhlLDB4MDYsMHgzMiwweDM0LDB4ODAsMHgzZSwweGUwCissMHgzNCwweDAxLDB4NzUsMHgxYiwweDI2LDB4ODksMHgzNiwweDA2LDB4MDAsMHg4ZSwweDA2LDB4MzIsMHgzNCwweDI2LDB4ZjcsMHgwNgorLDB4MGEsMHgwMCwweDAwLDB4MjAsMHg3NCwweDA3LDB4MjYsMHg4MSwweDBlLDB4MDgsMHgwMCwweDAwLDB4MjAsMHgwNywweGMzLDB4ODAKKywweDNlLDB4ZTMsMHgzNCwweDAxLDB4NzUsMHgxOSwweDI2LDB4ODksMHgzNiwweDA2LDB4MDAsMHg4ZSwweDA2LDB4MzIsMHgzNCwweDI2CissMHhmNywweDA2LDB4MGEsMHgwMCwweDAwLDB4MTAsMHg3NCwweDA3LDB4MjYsMHg4MSwweDBlLDB4MDgsMHgwMCwweDAwLDB4MTAsMHgwNworLDB4YzMsMHhlOSwweGI0LDB4ZmYsMHg1MCwweDUxLDB4NTcsMHgzMywweGMwLDB4YjksMHgwNiwweDAwLDB4OGUsMHhjMCwweGJmLDB4ZDEKKywweDM2LDB4ZjMsMHhhZSwweDVmLDB4NzQsMHgwYywweDI2LDB4ZjYsMHgwNiwweDAwLDB4MDAsMHhjMCwweDc1LDB4MDQsMHhmOCwweDU5CissMHg1OCwweGMzLDB4ZjksMHhlOSwweGY5LDB4ZmYsMHg4YiwweDA1LDB4MGIsMHg0NSwweDAyLDB4MGIsMHg0NSwweDA0LDB4YzMsMHg1MgorLDB4NTAsMHhlNSwweDA2LDB4MjUsMHgxZSwweDAwLDB4M2QsMHgxZSwweDAwLDB4NzUsMHhmNiwweGI4LDB4MDEsMHg4MCwweGU3LDB4NWEKKywweDU4LDB4NWEsMHhjMywweGU4LDB4ZTksMHhmZiwweDUwLDB4ZTUsMHgwMiwweDI1LDB4ZmYsMHg3ZiwweDBkLDB4MDEsMHgwMCwweDI1CissMHhlZiwweGZmLDB4ZTcsMHgwMiwweDBkLDB4MDAsMHg4MCwweGU3LDB4MDIsMHhhMSwweGFkLDB4MzYsMHhlNywweDA0LDB4YTEsMHhhZgorLDB4MzYsMHhlNywweDA2LDB4NTgsMHhjMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDJlLDB4MmIsMHhjZSwweDQxLDB4MTAsMHg0MiwweDdiLDB4NDEsMHgzMCwweDQxLDB4YTIsMHg0MSwweGFmLDB4NDUsMHg0NCwweDI5CissMHhjNywweDJhLDB4YzcsMHgyYSwweDYwLDB4MzksMHhmNCwweDNhLDB4NWMsMHgzYywweDA5LDB4M2QsMHhiMSwweDNkLDB4MzQsMHgzZgorLDB4YzcsMHgyYSwweDNjLDB4M2YsMHhjNywweDJhLDB4YzQsMHgzZiwweDE2LDB4NDAsMHgxNiwweDQwLDB4ZWQsMHg0MCwweGZhLDB4NDAKKywweDA3LDB4NDEsMHhjNywweDJhLDB4YzcsMHgyYSwweGM3LDB4MmEsMHhjNywweDJhLDB4ZDYsMHg1MiwweDAwLDB4MDAsMHgwMSwweDM3CissMHhlOSwweDM2LDB4ZjMsMHgzNiwweGVmLDB4MzYsMHgxZCwweDM3LDB4MGQsMHgzNywweDBiLDB4MzcsMHg5YywweDM3LDB4MDMsMHgzNworLDB4ZmIsMHgzNiwweDYyLDB4MmQsMHg0MCwweDA2LDB4ZDEsMHgyZCwweGY0LDB4MDEsMHhiYSwweDQ0LDB4NDAsMHgwNiwweDhjLDB4NDMKKywweDY0LDB4MDAsMHhlOCwweDJjLDB4YzgsMHgwMCwweGQ4LDB4MmIsMHgwNSwweDAwLDB4ZTksMHg0NSwweDUwLDB4MDAsMHg5NywweDQ1CissMHhmYSwweDAwLDB4YWUsMHgyZCwweDA0LDB4MDEsMHg2YSwweDQyLDB4MDIsMHgwMCwweGY2LDB4MmMsMHhiYywweDAyLDB4OTMsMHgyZAorLDB4ZGMsMHgwNSwweDFkLDB4MmQsMHg2NCwweDAwLDB4YTEsMHgyZCwweDE0LDB4MDAsMHhkNywweDNhLDB4MDgsMHgwNywweDgxLDB4MmQKKywweDY0LDB4MDAsMHhiMywweDNlLDB4MDIsMHgwMCwweDMwLDB4NDMsMHg2NCwweDAwLDB4YzUsMHgyYywweGY0LDB4MDEsMHg4YiwweDQ0CissMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4ODAsMHgzZSwweGZkLDB4MzQsMHgwMiwweDc0LDB4MGMsMHhlOCwweDIwLDB4MDUsMHhjNywweDA2LDB4YTEsMHgzNiwweDAwLDB4MDAKKywweGU5LDB4OWEsMHhmOCwweGZmLDB4MDYsMHhjMCwweDMzLDB4ZTgsMHgxMCwweDA1LDB4OGIsMHgzNiwweDNkLDB4MzcsMHhlOCwweDczCissMHhmZSwweGMzLDB4Y2QsMHgzNCwweGU5LDB4ZTgsMHgwNSwweGM3LDB4MDYsMHhhMywweDM2LDB4MDAsMHgwMCwweGM3LDB4MDYsMHg0MQorLDB4MzcsMHgwMCwweDAwLDB4ZTgsMHhlZCwweGZlLDB4MzMsMHhjMCwweDBkLDB4NDEsMHgwMCwweGU3LDB4NTYsMHhhMSwweGIxLDB4MzYKKywweDBkLDB4MDAsMHgxMCwweGU3LDB4MDgsMHhhMSwweGIzLDB4MzYsMHhlNywweDBhLDB4YTEsMHhhZiwweDM2LDB4ZTcsMHgwNiwweGExCissMHhhZCwweDM2LDB4ZTcsMHgwNCwweGU4LDB4MmIsMHgwOSwweGM3LDB4MDYsMHgxZCwweDM3LDB4MDAsMHhjOCwweGM3LDB4MDYsMHgwYgorLDB4MzcsMHgwMCwweDAzLDB4YzcsMHgwNiwweDBkLDB4MzcsMHg3YiwweDdmLDB4MzMsMHhjMCwweGEzLDB4OWIsMHgzNiwweGEzLDB4OWQKKywweDM2LDB4YzcsMHgwNiwweDRjLDB4MzcsMHgwMSwweDAwLDB4YzYsMHgwNiwweDllLDB4MzYsMHhmZiwweGM3LDB4MDYsMHgwNSwweDM3CissMHgwMCwweDAwLDB4YzcsMHgwNiwweDA3LDB4MzcsMHgwMCwweDAwLDB4YzcsMHgwNiwweDA5LDB4MzcsMHgwMCwweDAwLDB4YTMsMHhmMworLDB4MzYsMHhhMywweGVmLDB4MzYsMHhhMywweGYxLDB4MzYsMHhlOCwweGZlLDB4ZjUsMHhlNSwweDAyLDB4MjUsMHhmOSwweGZmLDB4MGQKKywweDAzLDB4MDAsMHgwZCwweDAwLDB4ODgsMHgyNSwweGVmLDB4ZmYsMHgwZCwweDAwLDB4NDAsMHgwZCwweDAwLDB4MDQsMHhlNywweDAyCissMHhiOCwweDhmLDB4MDMsMHhjZCwweDM5LDB4YjgsMHg4MCwweDAwLDB4Y2QsMHgzNSwweGM3LDB4MDYsMHhhYSwweDAyLDB4ZmYsMHhmZgorLDB4YTEsMHhhOSwweDM2LDB4YTMsMHhhNywweDM2LDB4MGQsMHgwMCwweGE0LDB4MGQsMHgwMCwweDA4LDB4ZTcsMHgwMCwweGEzLDB4YTkKKywweDM2LDB4YzcsMHgwNiwweGEzLDB4MzYsMHgwMSwweDAwLDB4YzcsMHgwNiwweGE1LDB4MzYsMHgwYywweDAwLDB4ODMsMHgzZSwweGE1CissMHgzNiwweDAwLDB4NzUsMHgwOSwweGM3LDB4MDYsMHgzZCwweDM3LDB4MDUsMHgwMCwweGU5LDB4MTMsMHhmZiwweGZmLDB4MGUsMHhhNQorLDB4MzYsMHhiZSwweDExLDB4MDAsMHhlOCwweDIyLDB4MDUsMHhiOCwweDkwLDB4MDMsMHhjZCwweDM5LDB4YzMsMHg4MywweDNlLDB4YTMKKywweDM2LDB4MDEsMHg3NCwweGQ5LDB4YzMsMHhiOCwweDkwLDB4MDMsMHhjZCwweDNhLDB4MjYsMHhhMCwweDJiLDB4MDAsMHgyNiwweDhiCissMHgxZSwweDJjLDB4MDAsMHhjZCwweDM0LDB4ODMsMHgzZSwweGEzLDB4MzYsMHgwMSwweDc0LDB4MDMsMHhlOSwweGYwLDB4MDQsMHgzYworLDB4MGYsMHg3NSwweDFlLDB4ODEsMHhmYiwweDAwLDB4MDIsMHg3NSwweDE4LDB4MjYsMHhhMSwweDIwLDB4MDAsMHhhMywweDA1LDB4MzcKKywweDI2LDB4YTEsMHgyMiwweDAwLDB4YTMsMHgwNywweDM3LDB4MjYsMHhhMSwweDI0LDB4MDAsMHhhMywweDA5LDB4MzcsMHhlOSwweDA5CissMHgwMCwweGM3LDB4MDYsMHgzZCwweDM3LDB4MDEsMHgwMCwweGU5LDB4YjYsMHhmZSwweGM3LDB4MDYsMHhhMywweDM2LDB4MDIsMHgwMAorLDB4YzYsMHgwNiwweDllLDB4MzYsMHhmZiwweGU4LDB4Y2IsMHhmZCwweGU4LDB4MWMsMHhkOSwweDMzLDB4YzAsMHhhMywweDg1LDB4MzcKKywweGEzLDB4ODMsMHgzNywweGEzLDB4ODcsMHgzNywweGEzLDB4ODksMHgzNywweGI4LDB4OTEsMHgwMywweGNkLDB4MzksMHhiOCwweDgwCissMHgwMCwweGNkLDB4MzUsMHhjNywweDA2LDB4YWEsMHgwMiwweGZmLDB4ZmYsMHhlNSwweDAwLDB4MjUsMHhmZiwweDUzLDB4ZTcsMHgwMAorLDB4ODEsMHgwZSwweDlhLDB4MzcsMHg4MCwweDAwLDB4YjgsMHg5MiwweDAzLDB4Y2QsMHgzOSwweDMzLDB4YzAsMHhlNywweDBlLDB4YmUKKywweDA4LDB4MDAsMHg4ZSwweDA2LDB4MzgsMHgzNCwweGU4LDB4OGUsMHhlNSwweDI2LDB4YzcsMHgwNiwweDA0LDB4MDAsMHg3ZCwweDRiCissMHg4MywweDI2LDB4ZWYsMHgzNCwweGRmLDB4Y2QsMHg1MCwweDgzLDB4MGUsMHhlZiwweDM0LDB4MjAsMHhjMywweGY3LDB4MDYsMHg5YQorLDB4MzcsMHg4MCwweDAwLDB4NzQsMHgzMiwweGE5LDB4ZDAsMHgwNywweDc0LDB4MGMsMHhhOSwweDAwLDB4MDQsMHg3NCwweDBlLDB4MzMKKywweGMwLDB4ZTcsMHgwZSwweGU5LDB4ZGEsMHhmZiwweGZmLDB4MDYsMHg4NSwweDM3LDB4ZTksMHhkMywweGZmLDB4ZmYsMHgwNiwweDgzCissMHgzNywweGU5LDB4Y2MsMHhmZiwweGM3LDB4MDYsMHgzZCwweDM3LDB4MDEsMHgwMCwweGU5LDB4MzYsMHhmZSwweDgzLDB4MjYsMHg5YQorLDB4MzcsMHg3ZiwweGJiLDB4ZmYsMHg3ZiwweGNkLDB4NTMsMHhlNSwweDAwLDB4MGQsMHgwMCwweGFjLDB4ZTcsMHgwMCwweGU1LDB4MDIKKywweDI1LDB4ZmYsMHhmYiwweDI1LDB4ZWYsMHhmZiwweDI1LDB4ZmYsMHhmNywweDBkLDB4MDEsMHgwMCwweGU3LDB4MDIsMHhhMSwweDgzCissMHgzNywweDNiLDB4MDYsMHg0NiwweDM3LDB4N2YsMHhjZCwweGExLDB4ODUsMHgzNywweDNiLDB4MDYsMHg0OCwweDM3LDB4N2MsMHhjNAorLDB4YzcsMHgwNiwweGEzLDB4MzYsMHgwMywweDAwLDB4YmUsMHgxMywweDAwLDB4ZTgsMHhmZCwweDAzLDB4YjgsMHg5MywweDAzLDB4Y2QKKywweDM5LDB4YjgsMHg5NCwweDAzLDB4Y2QsMHgzOSwweGI4LDB4OTYsMHgwMywweGNkLDB4MzksMHhiOCwweDk1LDB4MDMsMHhjZCwweDM5CissMHhiZSwweDA2LDB4MDAsMHhlOCwweGUzLDB4MDMsMHhlOSwweGQ2LDB4MDMsMHg4MywweDNlLDB4YTMsMHgzNiwweDAzLDB4NzQsMHgwMQorLDB4YzMsMHhiZSwweDEzLDB4MDAsMHhlOCwweGQyLDB4MDMsMHhiOCwweDk0LDB4MDMsMHhjZCwweDM5LDB4YzMsMHhiOCwweDk0LDB4MDMKKywweGNkLDB4M2EsMHgyNiwweGEwLDB4MmIsMHgwMCwweDI2LDB4OGIsMHgxZSwweDJjLDB4MDAsMHhjZCwweDM0LDB4ODMsMHgzZSwweGEzCissMHgzNiwweDAzLDB4NzQsMHgwMywweGU5LDB4YTgsMHgwMywweDNjLDB4MGQsMHg3NSwweDNlLDB4ODMsMHhmYiwweDAwLDB4NzUsMHgzOQorLDB4ZTUsMHgwMiwweDBkLDB4MDAsMHgyMCwweGU3LDB4MDIsMHhiOCwweDkzLDB4MDMsMHhjZCwweDNhLDB4YzcsMHgwNiwweGEzLDB4MzYKKywweDA0LDB4MDAsMHhiZSwweDAwLDB4MDAsMHhlOCwweDBjLDB4ZmMsMHhjNiwweDA2LDB4OWQsMHgzNiwweDgwLDB4YzYsMHgwNiwweDllCissMHgzNiwweDAwLDB4YzcsMHgwNiwweDMzLDB4MzcsMHgwMiwweDAwLDB4YjgsMHg5YSwweDAzLDB4Y2QsMHgzOSwweGU4LDB4ZmMsMHgwMAorLDB4YzcsMHgwNiwweDRjLDB4MzcsMHgwMCwweDAwLDB4ZTksMHg2NiwweDAzLDB4YzcsMHgwNiwweDNkLDB4MzcsMHgwOCwweDAwLDB4ZTkKKywweDYxLDB4ZmQsMHg4MywweDNlLDB4YTMsMHgzNiwweDAzLDB4NzUsMHgwOSwweGM3LDB4MDYsMHgzZCwweDM3LDB4MDUsMHgwMCwweGU5CissMHg1MSwweGZkLDB4ZTksMHg0YSwweDAzLDB4ODMsMHgzZSwweGEzLDB4MzYsMHgwNCwweDc0LDB4MTIsMHg4MywweDNlLDB4YTMsMHgzNgorLDB4MDUsMHg3NCwweDBiLDB4Y2QsMHgzNCwweGM3LDB4MDYsMHgzZCwweDM3LDB4MDcsMHgwMCwweGU5LDB4MzUsMHhmZCwweGM3LDB4MDYKKywweGEzLDB4MzYsMHgwNiwweDAwLDB4YzYsMHgwNiwweDllLDB4MzYsMHhmZiwweGI4LDB4OWEsMHgwMywweGNkLDB4M2EsMHhiOCwweDk5CissMHgwMywweGNkLDB4M2EsMHhiOCwweDk2LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg5NywweDAzLDB4Y2QsMHgzOSwweGI4LDB4OTgsMHgwMworLDB4Y2QsMHgzOSwweGI4LDB4OWIsMHgwMywweGNkLDB4MzksMHhlOSwweDE4LDB4ZmQsMHhjZCwweDM0LDB4ODMsMHgzZSwweGEzLDB4MzYKKywweDA0LDB4NzcsMHgxOCwweDgzLDB4M2UsMHhhMywweDM2LDB4MDMsMHg3NSwweDA4LDB4ZjcsMHgwNiwweDliLDB4MzYsMHgwMCwweDAxCissMHg3NSwweDA5LDB4YzcsMHgwNiwweDNkLDB4MzcsMHgwMSwweDAwLDB4ZTksMHhlOCwweGZjLDB4ZTksMHhlMSwweDAyLDB4Y2QsMHgzNAorLDB4ODMsMHgzZSwweGEzLDB4MzYsMHgwMiwweDc3LDB4MDksMHhjNywweDA2LDB4M2QsMHgzNywweDAxLDB4MDAsMHhlOSwweGQzLDB4ZmMKKywweDgzLDB4M2UsMHhhMywweDM2LDB4MDQsMHg3NywweDA1LDB4YjgsMHg5NiwweDAzLDB4Y2QsMHgzOSwweGU5LDB4YzAsMHgwMiwweDgzCissMHgzZSwweGEzLDB4MzYsMHgwMywweDc1LDB4MTAsMHgyNiwweGExLDB4MGMsMHgwMCwweDI1LDB4MDcsMHgwMCwweDUwLDB4M2QsMHgwNAorLDB4MDAsMHg3NSwweDAzLDB4ZTgsMHgzNiwweDAwLDB4YTEsMHhmMywweDM2LDB4ODYsMHhlMCwweGU3LDB4MWUsMHhhMywweGUzLDB4MzYKKywweDgxLDB4MjYsMHgwYiwweDM3LDB4MDAsMHgwMywweDgxLDB4MjYsMHgwZCwweDM3LDB4N2IsMHg3ZiwweDgzLDB4MGUsMHgwZCwweDM3CissMHg0OCwweGU4LDB4MTQsMHhmMywweDU4LDB4M2QsMHgwNCwweDAwLDB4NzQsMHgwOSwweDI2LDB4ZjcsMHgwNiwweDBjLDB4MDAsMHgyMAorLDB4MDAsMHg3NSwweDA2LDB4YjgsMHgwMSwweDAwLDB4ZTksMHg3YSwweDAyLDB4ZTksMHg4NiwweGZjLDB4YTEsMHhlNSwweDM2LDB4ZTcKKywweDJlLDB4YTEsMHhlNywweDM2LDB4ZTcsMHgzZSwweGExLDB4ZDMsMHgzNiwweGEzLDB4OWMsMHgzNCwweGExLDB4ZDUsMHgzNiwweGEzCissMHg5ZSwweDM0LDB4YzMsMHgyNiwweDgwLDB4M2UsMHgxYywweDAwLDB4ZmYsMHg3NSwweDJmLDB4MjYsMHg4MCwweDNlLDB4MWUsMHgwMAorLDB4ZmYsMHg3NSwweDI3LDB4MjYsMHhmNywweDA2LDB4MGMsMHgwMCwweDQwLDB4MDAsMHg3NSwweDFiLDB4YTEsMHhkMSwweDM2LDB4MjYKKywweGEzLDB4MWEsMHgwMCwweGExLDB4ZDMsMHgzNiwweDI2LDB4YTMsMHgxYywweDAwLDB4YTEsMHhkNSwweDM2LDB4MjYsMHhhMywweDFlCissMHgwMCwweGI4LDB4MGEsMHg4MCwweGU5LDB4MmMsMHgwMiwweGU5LDB4MzgsMHhmYywweGZmLDB4MDYsMHg5MCwweDM0LDB4YmUsMHgwYQorLDB4MDAsMHhjNiwweDA2LDB4YjYsMHgzNCwweDAxLDB4ZjYsMHgwNiwweDlkLDB4MzYsMHg4MCwweDc1LDB4MDUsMHg4MywweDBlLDB4YzIKKywweDM0LDB4MDEsMHhjZCwweDM0LDB4ZTksMHgwYywweGZjLDB4ODMsMHgzZSwweGEzLDB4MzYsMHgwMywweDc1LDB4MDksMHhjNywweDA2CissMHgzZCwweDM3LDB4MDUsMHgwMCwweGU5LDB4ZmMsMHhmYiwweGU1LDB4MDIsMHgwZCwweDAzLDB4MDAsMHgwZCwweDAwLDB4ODgsMHgwZAorLDB4MDAsMHg0MCwweDBkLDB4MDAsMHgwNCwweGU3LDB4MDIsMHhjNywweDA2LDB4YTMsMHgzNiwweDA1LDB4MDAsMHhjNiwweDA2LDB4OWUKKywweDM2LDB4ZmYsMHhiZSwweDAyLDB4MDAsMHhlOCwweGUxLDB4MDEsMHhiOCwweDg5LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg5YSwweDAzCissMHhjZCwweDNhLDB4YjgsMHg5OSwweDAzLDB4Y2QsMHgzOSwweGI4LDB4OTcsMHgwMywweGNkLDB4MzksMHhiOCwweDk4LDB4MDMsMHhjZAorLDB4MzksMHhlOSwweGJiLDB4MDEsMHg4MywweDNlLDB4YTMsMHgzNiwweDAzLDB4NzQsMHgwYSwweDgzLDB4M2UsMHhhMywweDM2LDB4MDQKKywweDc0LDB4MDMsMHhlOSwweGFhLDB4MDEsMHhiZSwweDA2LDB4MDAsMHhlOCwweGFlLDB4MDEsMHhiOCwweDk1LDB4MDMsMHhjZCwweDM5CissMHhlOSwweDljLDB4MDEsMHg4MywweDNlLDB4YTMsMHgzNiwweDA1LDB4NzQsMHgwMywweGU5LDB4OTIsMHgwMSwweGJlLDB4MDIsMHgwMAorLDB4ZTgsMHg5NiwweDAxLDB4YjgsMHg5OSwweDAzLDB4Y2QsMHgzOSwweGU5LDB4ODQsMHgwMSwweGM3LDB4MDYsMHgwZiwweDM3LDB4MDUKKywweDAwLDB4ZTksMHg3YiwweDAxLDB4ZTUsMHgwMiwweDI1LDB4ZmYsMHhkZiwweGU3LDB4MDIsMHhjNywweDA2LDB4YTMsMHgzNiwweDA3CissMHgwMCwweGM3LDB4MDYsMHgwZiwweDM3LDB4MDUsMHgwMCwweGU5LDB4NjUsMHgwMSwweGU4LDB4ZDUsMHgwNCwweGM2LDB4MDYsMHg5ZAorLDB4MzYsMHgwMCwweGM3LDB4MDYsMHg5YiwweDM2LDB4MDAsMHgwMCwweGM3LDB4MDYsMHgwZiwweDM3LDB4MDUsMHgwMCwweGM3LDB4MDYKKywweGE4LDB4MDIsMHgwMCwweDAwLDB4YzcsMHgwNiwweDRjLDB4MzcsMHgwMSwweDAwLDB4ZTUsMHgwMiwweDI1LDB4ZjksMHhmZiwweDBkCissMHgwMywweDAwLDB4MGQsMHgwMCwweDg4LDB4MjUsMHhlZiwweGZmLDB4MGQsMHgwMCwweDQwLDB4MGQsMHgwMCwweDA0LDB4ZTcsMHgwMgorLDB4ZTksMHg2NywweGZjLDB4YjgsMHg5YSwweDAzLDB4Y2QsMHgzOSwweGY3LDB4MDYsMHhmNCwweDMzLDB4MDAsMHgxMCwweDc1LDB4MDkKKywweGM3LDB4MDYsMHgzMywweDM3LDB4MDIsMHgwMCwweGU5LDB4MTYsMHgwMSwweGZmLDB4MGUsMHgzMywweDM3LDB4NzQsMHgwMywweGU5CissMHgwZCwweDAxLDB4ZmYsMHgwNiwweDhlLDB4MzQsMHg4MywweDBlLDB4YzIsMHgzNCwweDA4LDB4YzcsMHgwNiwweDNkLDB4MzcsMHgwMworLDB4MDAsMHhlOSwweGZmLDB4ZmEsMHhjMywweDUyLDB4NTAsMHhiYSwweGUwLDB4MDAsMHhiOCwweDAwLDB4MTAsMHhlZiwweDU4LDB4NWEKKywweGMzLDB4YzcsMHgwNiwweDNkLDB4MzcsMHgwMCwweDAwLDB4ZTksMHhlOSwweGZhLDB4ZmEsMHhlOCwweDU0LDB4MDQsMHhiOCwweDgwCissMHgwMywweDhlLDB4YzAsMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4ZDgsMHgyYiwweGI4LDB4N2YsMHgwMywweDhlLDB4YzAsMHgyNgorLDB4YzcsMHgwNiwweDA0LDB4MDAsMHhlOCwweDJjLDB4MzMsMHhjMCwweDhlLDB4YzAsMHhhMSwweGE3LDB4MzYsMHhhMywweGE5LDB4MzYKKywweGExLDB4YTksMHgzNiwweGU3LDB4MDAsMHhhMSwweGFiLDB4MzYsMHhlNywweDAyLDB4YzcsMHgwNiwweDA1LDB4MzcsMHgwMCwweDAwCissMHhjNywweDA2LDB4MDcsMHgzNywweDAwLDB4MDAsMHhjNywweDA2LDB4MDksMHgzNywweDAwLDB4MDAsMHhjNiwweDA2LDB4OWQsMHgzNgorLDB4MDAsMHhjNiwweDA2LDB4OWUsMHgzNiwweGZmLDB4YzcsMHgwNiwweDliLDB4MzYsMHgwMCwweDAwLDB4YzcsMHgwNiwweGEzLDB4MzYKKywweDAwLDB4MDAsMHhjNywweDA2LDB4MGYsMHgzNywweDAwLDB4MDAsMHhjNywweDA2LDB4YTgsMHgwMiwweDAwLDB4MDAsMHhjNywweDA2CissMHg0YywweDM3LDB4MDEsMHgwMCwweDgxLDB4MjYsMHhhZiwweDM2LDB4ZmYsMHhlNywweGExLDB4YWYsMHgzNiwweGU3LDB4MDYsMHhiYgorLDB4ZmYsMHg3ZiwweGNkLDB4NTMsMHhlOCwweDdjLDB4ZjksMHhlNSwweDU2LDB4MGQsMHgwMiwweDAwLDB4ZTcsMHg1NiwweGZiLDB4YzMKKywweDhkLDB4M2UsMHhjMCwweDUzLDB4OGQsMHgzNiwweGYwLDB4MzgsMHhiOSwweDBlLDB4MDAsMHg4YiwweDFlLDB4MzAsMHgzNCwweDg5CissMHg1YywweDAyLDB4MmUsMHg4YiwweDQ1LDB4MDIsMHg4OSwweDQ0LDB4MDYsMHgyZSwweDhiLDB4MDUsMHg4OSwweDQ0LDB4MDQsMHg4MworLDB4YzcsMHgwNCwweDgzLDB4YzYsMHgxMCwweGUyLDB4ZTgsMHhiOCwweDgwLDB4MDMsMHg4ZSwweGMwLDB4MjYsMHhjNywweDA2LDB4MDQKKywweDAwLDB4ZTIsMHg1MSwweGI4LDB4N2YsMHgwMywweDhlLDB4YzAsMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4YjIsMHg1MiwweDMzCissMHhjMCwweDhlLDB4YzAsMHhjNywweDA2LDB4YTEsMHgzNiwweDAxLDB4MDAsMHhjNywweDA2LDB4MGYsMHgzNywweDA1LDB4MDAsMHhjMworLDB4MzMsMHhmZiwweDhlLDB4MDYsMHhhNiwweDAyLDB4OGIsMHgzNiwweGE0LDB4MDIsMHgyZSwweGZmLDB4YTQsMHhhMCwweDUzLDB4ZTgKKywweDhjLDB4ZGIsMHhjMywweGU4LDB4NDgsMHhmNywweGU5LDB4ZjYsMHhmZiwweDhlLDB4MDYsMHgzOCwweDM0LDB4ZTgsMHgwNywweGUxCissMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4ZGYsMHg0ZiwweGNkLDB4NTAsMHhjMywweDI2LDB4YzcsMHgwNiwweDBhLDB4MDAsMHgwMAorLDB4MDAsMHgyNiwweGZmLDB4MjYsMHgwNCwweDAwLDB4Y2QsMHgzNCwweGU5LDB4ZDQsMHhmZiwweGExLDB4ZDEsMHgzNiwweDI2LDB4MzkKKywweDA2LDB4MWEsMHgwMCwweDc1LDB4MjIsMHhhMSwweGQzLDB4MzYsMHgyNiwweDM5LDB4MDYsMHgxYywweDAwLDB4NzUsMHgxOCwweGExCissMHhkNSwweDM2LDB4MjYsMHgzOSwweDA2LDB4MWUsMHgwMCwweDc1LDB4MGUsMHgyNiwweGY3LDB4MDYsMHgwYywweDAwLDB4NDAsMHgwMAorLDB4NzQsMHgwNSwweDgzLDB4MGUsMHg2NiwweDM3LDB4NDAsMHg4MSwweDBlLDB4YWYsMHgzNiwweDAwLDB4MTAsMHhhMSwweGFmLDB4MzYKKywweGU3LDB4MDYsMHg4MywweDNlLDB4YTMsMHgzNiwweDAyLDB4NzUsMHgwNSwweGNkLDB4MzQsMHhlOSwweDU2LDB4ZmIsMHg4MywweDNlCissMHhhMywweDM2LDB4MDAsMHg3NCwweGIxLDB4ODMsMHgzZSwweGEzLDB4MzYsMHgwNSwweDc3LDB4YWEsMHgyNiwweGY2LDB4MDYsMHgwYQorLDB4MDAsMHhmZiwweDc1LDB4YTIsMHhlOCwweGZkLDB4ZGQsMHg1MCwweGY2LDB4MDYsMHg5MywweDM2LDB4MjAsMHg3NSwweDAzLDB4ZTkKKywweDhjLDB4MDAsMHgyNiwweGExLDB4MGMsMHgwMCwweDI1LDB4MDcsMHgwMCwweDNkLDB4MDcsMHgwMCwweDc1LDB4MDMsMHhlOSwweDc2CissMHgwMCwweDNkLDB4MDUsMHgwMCwweDc1LDB4MDMsMHhlOSwweDZlLDB4MDAsMHhmNywweDA2LDB4ZTYsMHgzNCwweDE4LDB4ODAsMHg3NQorLDB4MDMsMHhlOSwweDZhLDB4MDAsMHhmNywweDA2LDB4ZTYsMHgzNCwweDAwLDB4ODAsMHg3NCwweDM1LDB4MjYsMHg4MCwweDNlLDB4MjkKKywweDAwLDB4MDIsMHg3NSwweDJkLDB4NTEsMHg1NiwweDU3LDB4OGQsMHgzNiwweDNlLDB4MzQsMHg4ZCwweDNlLDB4MjAsMHgwMCwweGI5CissMHgwNiwweDAwLDB4ZjMsMHhhNiwweDVmLDB4NWUsMHg1OSwweDc1LDB4NDUsMHgyNiwweGExLDB4MjAsMHgwMCwweGEzLDB4M2UsMHgzNAorLDB4MjYsMHhhMSwweDIyLDB4MDAsMHhhMywweDQwLDB4MzQsMHgyNiwweGExLDB4MjQsMHgwMCwweGEzLDB4NDIsMHgzNCwweGU5LDB4MjYKKywweDAwLDB4ZjcsMHgwNiwweGU2LDB4MzQsMHgwOCwweDAwLDB4NzQsMHgwYiwweDI2LDB4ODAsMHgzZSwweDE5LDB4MDAsMHgwMCwweDc0CissMHgwMywweGU5LDB4MTMsMHgwMCwweGY3LDB4MDYsMHhlNiwweDM0LDB4MTAsMHgwMCwweDc0LDB4MTIsMHgyNiwweGEwLDB4MjgsMHgwMAorLDB4YzAsMHhlOCwweDA0LDB4MjIsMHhjMCwweDc0LDB4MDcsMHgyNiwweGM3LDB4MDYsMHgwNCwweDAwLDB4ZmYsMHhmZiwweDU4LDB4MjMKKywweGMwLDB4NzQsMHgwMywweGU5LDB4ZGQsMHhmZSwweDgxLDB4MjYsMHg5YiwweDM2LDB4ZmYsMHhmZSwweDI2LDB4YTEsMHgyMCwweDAwCissMHgzYiwweDA2LDB4ZDEsMHgzNiwweDc1LDB4MWEsMHgyNiwweGExLDB4MjIsMHgwMCwweDNiLDB4MDYsMHhkMywweDM2LDB4NzUsMHgxMAorLDB4MjYsMHhhMSwweDI0LDB4MDAsMHgzYiwweDA2LDB4ZDUsMHgzNiwweDc1LDB4MDYsMHg4MSwweDBlLDB4OWIsMHgzNiwweDAwLDB4MDEKKywweDI2LDB4YTEsMHgyMCwweDAwLDB4MjUsMHg3ZiwweGZmLDB4YTMsMHhiOCwweDM0LDB4MjYsMHhhMSwweDIyLDB4MDAsMHhhMywweGJhCissMHgzNCwweDI2LDB4YTEsMHgyNCwweDAwLDB4YTMsMHhiYywweDM0LDB4OGIsMHhjNiwweDg2LDB4YzQsMHhhMywweGMwLDB4MzQsMHhkMQorLDB4ZTYsMHg4MCwweGZjLDB4MDksMHg3NCwweDAzLDB4ZTgsMHhmNiwweGY1LDB4YTEsMHgwNSwweDM3LDB4MGIsMHgwNiwweDA3LDB4MzcKKywweDBiLDB4MDYsMHgwOSwweDM3LDB4NzQsMHgzZSwweDI2LDB4YTEsMHgyMCwweDAwLDB4M2IsMHgwNiwweDA1LDB4MzcsMHg3NSwweDE3CissMHgyNiwweGExLDB4MjIsMHgwMCwweDNiLDB4MDYsMHgwNywweDM3LDB4NzUsMHgwZCwweDI2LDB4YTEsMHgyNCwweDAwLDB4M2IsMHgwNgorLDB4MDksMHgzNywweDc1LDB4MDMsMHhlOSwweDFkLDB4MDAsMHgyNiwweGEwLDB4MjgsMHgwMCwweDI0LDB4MGYsMHgzYywweDAzLDB4NzQKKywweDFiLDB4M2MsMHgwMCwweDc1LDB4MGYsMHg4MywweDNlLDB4YTMsMHgzNiwweDA0LDB4NzQsMHgxMCwweGY3LDB4MDYsMHg5YiwweDM2CissMHgwMCwweDAxLDB4NzQsMHgwOCwweDJlLDB4ZmYsMHg5NCwweGY4LDB4NTMsMHhlOSwweDMzLDB4ZmUsMHhjZCwweDM0LDB4YzcsMHgwNgorLDB4M2QsMHgzNywweDAxLDB4MDAsMHhlOSwweDJjLDB4ZjgsMHg4MywweDNlLDB4YTMsMHgzNiwweDA1LDB4NzQsMHgxMCwweDgzLDB4M2UKKywweGEzLDB4MzYsMHgwMSwweDdlLDB4MDksMHg4MywweGVlLDB4MTYsMHgyZSwweGZmLDB4OTQsMHgyNCwweDU0LDB4YzMsMHhjZCwweDM0CissMHhjMywweDI2LDB4YTEsMHgwYywweDAwLDB4M2QsMHhmZiwweDdmLDB4NzQsMHgwNSwweDI2LDB4ZmYsMHgyNiwweDA0LDB4MDAsMHhlOQorLDB4ZmQsMHhmZCwweGExLDB4ZjQsMHgzMywweGE5LDB4MDAsMHg4OCwweDc0LDB4MGIsMHhhOSwweDAwLDB4MTAsMHg3NSwweDA5LDB4OGIKKywweDFlLDB4NDMsMHgzNywweGZmLDB4ZTMsMHhlOSwweDk3LDB4MDAsMHhjNywweDA2LDB4MzUsMHgzNywweDA1LDB4MDAsMHhjNywweDA2CissMHg0MywweDM3LDB4MjgsMHg1MiwweGY3LDB4MDYsMHhmNCwweDMzLDB4MDAsMHgwOCwweDc0LDB4MDYsMHhjNywweDA2LDB4NDMsMHgzNworLDB4MWEsMHg1MiwweGI4LDB4ODAsMHgwMywweGNkLDB4MzksMHhlOSwweGM1LDB4ZmQsMHhhOSwweDAwLDB4MDgsMHg3NCwweGQ5LDB4ZmYKKywweDBlLDB4MzUsMHgzNywweDc1LDB4ZWQsMHhlOSwweDMwLDB4MDAsMHhhOSwweDAwLDB4MDgsMHg3NSwweGNiLDB4ZmYsMHgwZSwweDM1CissMHgzNywweDc1LDB4ZGYsMHg4MSwweDBlLDB4YzIsMHgzNCwweGMwLDB4MDAsMHhmNiwweDA2LDB4OWQsMHgzNiwweDgwLDB4NzQsMHgwZgorLDB4ODEsMHgwZSwweDliLDB4MzYsMHgwMCwweDgwLDB4YzcsMHgwNiwweDBmLDB4MzcsMHgwMiwweDAwLDB4ZTksMHg5MCwweGZkLDB4YzcKKywweDA2LDB4M2QsMHgzNywweDAyLDB4MDAsMHhlOSwweDhiLDB4ZjcsMHg4MCwweDI2LDB4OWUsMHgzNiwweGZmLDB4NzUsMHgzMCwweGY2CissMHgwNiwweDlkLDB4MzYsMHg4MCwweDc0LDB4MjAsMHhmZiwweDA2LDB4OTQsMHgzNCwweDgzLDB4MGUsMHg2NiwweDM3LDB4MjAsMHg4ZQorLDB4MDYsMHgzMCwweDM0LDB4MjYsMHhmNywweDA2LDB4MGEsMHgwMCwweDAwLDB4MDEsMHg3NCwweDA3LDB4MjYsMHg4MSwweDBlLDB4MDgKKywweDAwLDB4MDAsMHgwMSwweGU5LDB4MDksMHgwMCwweGM3LDB4MDYsMHgzZCwweDM3LDB4MDQsMHgwMCwweGU5LDB4NTQsMHhmNywweDgxCissMHgwZSwweGFmLDB4MzYsMHgwMCwweDA4LDB4YTEsMHhhZiwweDM2LDB4ZTcsMHgwNiwweGU1LDB4MGEsMHhhOSwweDAwLDB4ODAsMHg3NAorLDB4MGUsMHg4MSwweDI2LDB4YWYsMHgzNiwweGZmLDB4ZjcsMHhhMSwweGFmLDB4MzYsMHhlNywweDA2LDB4ZTksMHg0OSwweGZmLDB4ZTkKKywweDJkLDB4ZmQsMHhjNywweDA2LDB4NDEsMHgzNywweDAwLDB4MDAsMHhiZSwweDI5LDB4MDAsMHhlOCwweDJiLDB4ZmQsMHhlOSwweDFlCissMHhmZCwweGNkLDB4MzQsMHg4MywweDNlLDB4YTMsMHgzNiwweDA0LDB4NzcsMHgwOSwweGM3LDB4MDYsMHgzZCwweDM3LDB4MDEsMHgwMAorLDB4ZTksMHgxMCwweGY3LDB4ZTksMHgwOSwweGZkLDB4Y2QsMHgzNCwweGMzLDB4YzcsMHgwNiwweDliLDB4MzYsMHgwMCwweDAwLDB4ZTgKKywweDBjLDB4ZjUsMHg4MSwweDI2LDB4YWYsMHgzNiwweGZmLDB4ZTcsMHhhMSwweGFmLDB4MzYsMHhlNywweDA2LDB4ODEsMHgyNiwweDliCissMHgzNiwweGZmLDB4N2YsMHhlNSwweDAyLDB4MGQsMHgwMSwweDAwLDB4MjUsMHhlZiwweGZmLDB4MjUsMHhmZiwweGRmLDB4ZTcsMHgwMgorLDB4YmIsMHhmZiwweDdmLDB4Y2QsMHg1MywweDMzLDB4YzAsMHhhMywweDlkLDB4MzYsMHhhMywweDlmLDB4MzYsMHhlOCwweDIwLDB4ZjMKKywweGU4LDB4NDMsMHhmMywweDgzLDB4MGUsMHg5YiwweDM2LDB4MTAsMHhjNywweDA2LDB4OTksMHgzNiwweDAwLDB4MDAsMHhlOCwweGQyCissMHhmNSwweGU1LDB4NTYsMHgwZCwweDAyLDB4MDAsMHhlNywweDU2LDB4YzcsMHgwNiwweGE4LDB4MDIsMHgwMCwweDAwLDB4YmUsMHgwMAorLDB4MDAsMHhlOCwweDMwLDB4ZjUsMHhjNiwweDA2LDB4YTAsMHgzNiwweDBlLDB4YjgsMHg5YywweDAzLDB4Y2QsMHgzOSwweGI4LDB4ODAKKywweDAwLDB4Y2QsMHgzNSwweGM3LDB4MDYsMHhhYSwweDAyLDB4ZmYsMHhmZiwweGM3LDB4MDYsMHhhMSwweDM2LDB4MDEsMHgwMCwweGU5CissMHhhNSwweGY2LDB4MDYsMHhiOCwweDhmLDB4MDMsMHhjZCwweDNhLDB4YjgsMHg5MCwweDAzLDB4Y2QsMHgzYSwweGI4LDB4OTEsMHgwMworLDB4Y2QsMHgzYSwweGI4LDB4OTIsMHgwMywweGNkLDB4M2EsMHhiOCwweDkzLDB4MDMsMHhjZCwweDNhLDB4YjgsMHg5NCwweDAzLDB4Y2QKKywweDNhLDB4YjgsMHg5NSwweDAzLDB4Y2QsMHgzYSwweGI4LDB4OTYsMHgwMywweGNkLDB4M2EsMHhiOCwweDk3LDB4MDMsMHhjZCwweDNhCissMHhiOCwweDk4LDB4MDMsMHhjZCwweDNhLDB4YjgsMHg5OSwweDAzLDB4Y2QsMHgzYSwweGI4LDB4OWEsMHgwMywweGNkLDB4M2EsMHhiOAorLDB4OWIsMHgwMywweGNkLDB4M2EsMHhiOCwweDdmLDB4MDMsMHhjZCwweDNhLDB4YjgsMHg4MCwweDAzLDB4Y2QsMHgzYSwweDA3LDB4YzMKKywweGY3LDB4NDksMHhmMSwweDRlLDB4ZGYsMHg0ZiwweGRmLDB4NGYsMHhkZiwweDRmLDB4ZGYsMHg0ZiwweGY4LDB4NTEsMHhkZiwweDRmCissMHhmYSwweDRmLDB4MGIsMHg1MCwweGQxLDB4NTEsMHhkZiwweDRmLDB4ZGYsMHg0ZiwweGRmLDB4NGYsMHhkZiwweDRmLDB4ZGYsMHg0ZgorLDB4ZTQsMHg0ZSwweDA2LDB4MDAsMHhjZCwweDRhLDB4MDQsMHgwMCwweGU0LDB4NGUsMHgxOSwweDAwLDB4YWQsMHg0YiwweGZhLDB4MDAKKywweDgyLDB4NGMsMHgwOCwweDA3LDB4MDksMHg0YywweDE0LDB4MDAsMHgyNCwweDRlLDB4NjQsMHgwMCwweGQ3LDB4NGQsMHhmNCwweDAxCissMHg2NCwweDRlLDB4YmMsMHgwMiwweDdhLDB4NGUsMHhlOCwweDAzLDB4NDMsMHg0ZSwweDAyLDB4MDAsMHhiMywweDRlLDB4ZjQsMHgwMQorLDB4NWIsMHg0ZSwweGY0LDB4MDEsMHhlNSwweDRlLDB4MTQsMHgwMCwweDA2LDB4NTAsMHgwNiwweDUwLDB4OTUsMHg0YywweGMxLDB4NTIKKywweGMxLDB4NTIsMHhmZSwweDRjLDB4ZGEsMHg0YywweDA2LDB4NTAsMHgwNiwweDUwLDB4MDYsMHg1MCwweDA2LDB4NTAsMHhiNywweDUxCissMHhiNywweDUxLDB4YjcsMHg1MSwweGI3LDB4NTEsMHhiNywweDUxLDB4YjcsMHg1MSwweDA2LDB4NTAsMHhkNSwweDRhLDB4MDYsMHg1MAorLDB4MWQsMHg0YywweDA2LDB4NTAsMHg4MywweDRkLDB4MWYsMHg0ZCwweDFmLDB4NGQsMHhlZCwweDQwLDB4ZmEsMHg0MCwweDA3LDB4NDEKKywweDM3LDB4MzcsMHgyZSwweDM3LDB4MzcsMHgyMCwweDIwLDB4NzksMHg3OSwweDJmLDB4NzksMHg3OSwweDJmLDB4NzksMHg3OSwweDIwCissMHgzMCwweDMxLDB4MmUsMHgzOSwweDMwLDB4MjAsMHgyMCwweDMwLDB4MzIsMHgyZiwweDMxLDB4MzcsMHgyZiwweDM5LDB4MzksMHgyMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCissMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMAorLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKKywweDkwLDB4ZWEsMHhjMCwweDE1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMywweDA2Cit9IDsgIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL0tjb25maWcgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2QwZmE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL0tjb25maWcKQEAgLTAsMCArMSwxODYgQEAKKyMKKyMgVG9rZW4gUmluZyBkcml2ZXIgY29uZmlndXJhdGlvbgorIworCittZW51ICJUb2tlbiBSaW5nIGRldmljZXMiCisJZGVwZW5kcyBvbiBORVRERVZJQ0VTCisKKyMgU28gZmFyLCB3ZSBvbmx5IGhhdmUgUENJLCBJU0EsIGFuZCBNQ0EgdG9rZW4gcmluZyBkZXZpY2VzCitjb25maWcgVFIKKwlib29sICJUb2tlbiBSaW5nIGRyaXZlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gKFBDSSB8fCBJU0EgfHwgTUNBIHx8IENDVykKKwlzZWxlY3QgTExDCisJaGVscAorCSAgVG9rZW4gUmluZyBpcyBJQk0ncyB3YXkgb2YgY29tbXVuaWNhdGlvbiBvbiBhIGxvY2FsIG5ldHdvcms7IHRoZQorCSAgcmVzdCBvZiB0aGUgd29ybGQgdXNlcyBFdGhlcm5ldC4gVG8gcGFydGljaXBhdGUgb24gYSBUb2tlbiBSaW5nCisJICBuZXR3b3JrLCB5b3UgbmVlZCBhIHNwZWNpYWwgVG9rZW4gcmluZyBuZXR3b3JrIGNhcmQuIElmIHlvdSBhcmUKKwkgIGNvbm5lY3RlZCB0byBzdWNoIGEgVG9rZW4gUmluZyBuZXR3b3JrIGFuZCB3YW50IHRvIHVzZSB5b3VyIFRva2VuCisJICBSaW5nIGNhcmQgdW5kZXIgTGludXgsIHNheSBZIGhlcmUgYW5kIHRvIHRoZSBkcml2ZXIgZm9yIHlvdXIKKwkgIHBhcnRpY3VsYXIgY2FyZCBiZWxvdyBhbmQgcmVhZCB0aGUgVG9rZW4tUmluZyBtaW5pLUhPV1RPLCBhdmFpbGFibGUKKwkgIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gTW9zdCBwZW9wbGUgY2FuCisJICBzYXkgTiBoZXJlLgorCitjb25maWcgSUJNVFIKKwl0cmlzdGF0ZSAiSUJNIFRyb3BpYyBjaGlwc2V0IGJhc2VkIGFkYXB0ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFRSICYmIChJU0EgfHwgTUNBKQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgYWxsIElCTSBUb2tlbiBSaW5nIGNhcmRzIHRoYXQgZG9uJ3QgdXNlIERNQS4gSWYKKwkgIHlvdSBoYXZlIHN1Y2ggYSBiZWFzdCwgc2F5IFkgYW5kIHJlYWQgdGhlIFRva2VuLVJpbmcgbWluaS1IT1dUTywKKwkgIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFdhcm5pbmc6IHRoaXMgZHJpdmVyIHdpbGwgYWxtb3N0IGRlZmluaXRlbHkgZmFpbCBpZiBtb3JlIHRoYW4gb25lCisJICBhY3RpdmUgVG9rZW4gUmluZyBjYXJkIGlzIHByZXNlbnQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGlibXRyLgorCitjb25maWcgSUJNT0wKKwl0cmlzdGF0ZSAiSUJNIE9seW1waWMgY2hpcHNldCBQQ0kgYWRhcHRlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gVFIgJiYgUENJCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciBhbGwgbm9uLUxhbnN0cmVhbWVyIElCTSBQQ0kgVG9rZW4gUmluZyBDYXJkcy4KKwkgIFNwZWNpZmljYWxseSB0aGlzIGlzIGFsbCBJQk0gUENJLCBQQ0kgV2FrZSBPbiBMYW4sIFBDSSBJSSwgUENJIElJCisJICBXYWtlIE9uIExhbiwgYW5kIFBDSSAxMDAvMTYvNCBhZGFwdGVycy4KKworCSAgSWYgeW91IGhhdmUgc3VjaCBhbiBhZGFwdGVyLCBzYXkgWSBhbmQgcmVhZCB0aGUgVG9rZW4tUmluZworCSAgbWluaS1IT1dUTywgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgb2x5bXBpYy4KKworCSAgQWxzbyByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9vbHltcGljLnR4dD4gb3IgY2hlY2sgdGhlCisJICBMaW51eCBUb2tlbiBSaW5nIFByb2plY3Qgc2l0ZSBmb3IgdGhlIGxhdGVzdCBpbmZvcm1hdGlvbiBhdAorCSAgPGh0dHA6Ly93d3cubGludXh0ci5uZXQvPi4KKworY29uZmlnIElCTUxTCisJdHJpc3RhdGUgIklCTSBMYW5zdHJlYW1lciBjaGlwc2V0IFBDSSBhZGFwdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBUUiAmJiBQQ0kgJiYgITY0QklUCisJaGVscAorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciBJQk0gTGFuc3RyZWFtZXIgUENJIFRva2VuIFJpbmcgQ2FyZHMuCisKKwkgIElmIHlvdSBoYXZlIHN1Y2ggYW4gYWRhcHRlciwgc2F5IFkgYW5kIHJlYWQgdGhlIFRva2VuLVJpbmcKKwkgIG1pbmktSE9XVE8sIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGxhbnN0cmVhbWVyLgorCitjb25maWcgM0MzNTkKKwl0cmlzdGF0ZSAiM0NvbSAzQzM1OSBUb2tlbiBMaW5rIFZlbG9jaXR5IFhMIGFkYXB0ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFRSICYmIFBDSQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgdGhlIDNDb20gUENJIFZlbG9jaXR5IFhMIGNhcmRzLCBzcGVjaWZpY2FsbHkKKwkgIHRoZSAzQ29tIDNDMzU5LCBwbGVhc2Ugbm90ZSB0aGlzIGlzIG5vdCBmb3IgdGhlIDNDMzM5IGNhcmRzLCB5b3UKKwkgIHNob3VsZCB1c2UgdGhlIHRtczM4MCBkcml2ZXIgaW5zdGVhZC4KKworCSAgSWYgeW91IGhhdmUgc3VjaCBhbiBhZGFwdGVyLCBzYXkgWSBhbmQgcmVhZCB0aGUgVG9rZW4tUmluZworCSAgbWluaS1IT1dUTywgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgM2MzNTkuCisKKwkgIEFsc28gcmVhZCB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvM2MzNTkudHh0PiBvciBjaGVjayB0aGUgCisJICBMaW51eCBUb2tlbiBSaW5nIFByb2plY3Qgc2l0ZSBmb3IgdGhlIGxhdGVzdCBpbmZvcm1hdGlvbiBhdAorCSAgPGh0dHA6Ly93d3cubGludXh0ci5uZXQ+CisKK2NvbmZpZyBUTVMzODBUUgorCXRyaXN0YXRlICJHZW5lcmljIFRNUzM4MCBUb2tlbiBSaW5nIElTQS9QQ0kgYWRhcHRlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gVFIgJiYgKFBDSSB8fCBJU0EpCisJc2VsZWN0IEZXX0xPQURFUgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGdlbmVyaWMgc3VwcG9ydCBmb3IgdG9rZW4gcmluZyBhZGFwdGVycworCSAgYmFzZWQgb24gdGhlIFRleGFzIEluc3RydW1lbnRzIFRNUzM4MCBzZXJpZXMgY2hpcHNldHMuICBUaGlzCisJICBpbmNsdWRlcyB0aGUgU3lzS29ubmVjdCBUUjQvMTYoKykgSVNBIChTSy00MTkwKSwgU3lzS29ubmVjdAorCSAgVFI0LzE2KCspIFBDSSAoU0stNDU5MCksIFN5c0tvbm5lY3QgVFI0LzE2IFBDSSAoU0stNDU5MSksCisJICBDb21wYXEgNC8xNiBQQ0ksIFRob21hcy1Db25yYWQgVEM0MDQ4IDQvMTYgUENJLCBhbmQgc2V2ZXJhbAorCSAgTWFkZ2UgYWRhcHRlcnMuICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgYmUgYXNrZWQgdG8gc2VsZWN0CisJICB3aGljaCBjYXJkcyB0byBzdXBwb3J0IGJlbG93LiAgSWYgeW91J3JlIHVzaW5nIG1vZHVsZXMsIGVhY2gKKwkgIGNsYXNzIG9mIGNhcmQgd2lsbCBiZSBzdXBwb3J0ZWQgYnkgYSBzZXBhcmF0ZSBtb2R1bGUuCisKKwkgIElmIHlvdSBoYXZlIHN1Y2ggYW4gYWRhcHRlciBhbmQgd291bGQgbGlrZSB0byB1c2UgaXQsIHNheSBZIGFuZAorCSAgcmVhZCB0aGUgVG9rZW4tUmluZyBtaW5pLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgQWxzbyByZWFkIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy90bXMzODB0ci50eHQ+IG9yCisJICBjaGVjayA8aHR0cDovL3d3dy5hdWsuY3gvdG1zMzgwdHIvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgdG1zMzgwdHIuCisKK2NvbmZpZyBUTVNQQ0kKKwl0cmlzdGF0ZSAiR2VuZXJpYyBUTVMzODAgUENJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBUUiAmJiBUTVMzODBUUiAmJiBQQ0kKKwktLS1oZWxwLS0tCisJICBUaGlzIHRtczM4MCBtb2R1bGUgc3VwcG9ydHMgZ2VuZXJpYyBUTVMzODAtYmFzZWQgUENJIGNhcmRzLgorCisJICBUaGVzZSBjYXJkcyBhcmUga25vd24gdG8gd29yazoKKwkgIC0gQ29tcGFxIDQvMTYgVFIgUENJCisJICAtIFN5c0tvbm5lY3QgVFI0LzE2IFBDSSAoU0stNDU5MC9TSy00NTkxKQorCSAgLSBUaG9tYXMtQ29ucmFkIFRDNDA0OCBQQ0kgNC8xNgorCSAgLSAzQ29tIFRva2VuIExpbmsgVmVsb2NpdHkKKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgdG1zcGNpLgorCitjb25maWcgU0tJU0EKKwl0cmlzdGF0ZSAiU3lzS29ubmVjdCBUUjQvMTYgSVNBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBUUiAmJiBUTVMzODBUUiAmJiBJU0EKKwloZWxwCisJICBUaGlzIHRtczM4MCBtb2R1bGUgc3VwcG9ydHMgU3lzS29ubmVjdCBUUjQvMTYgSVNBIGNhcmRzLgorCisJICBUaGVzZSBjYXJkcyBhcmUga25vd24gdG8gd29yazoKKwkgIC0gU3lzS29ubmVjdCBUUjQvMTYgSVNBIChTSy00MTkwKQorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBza2lzYS4KKworY29uZmlnIFBST1RFT04KKwl0cmlzdGF0ZSAiUHJvdGVvbiBJU0Egc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFRSICYmIFRNUzM4MFRSICYmIElTQQorCWhlbHAKKwkgIFRoaXMgdG1zMzgwIG1vZHVsZSBzdXBwb3J0cyBQcm90ZW9uIElTQSBjYXJkcy4KKworCSAgVGhlc2UgY2FyZHMgYXJlIGtub3duIHRvIHdvcms6CisJICAtIFByb3Rlb24gMTM5MgorCSAgLSBQcm90ZW9uIDEzOTIgcGx1cworCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBwcm90ZW9uLgorCitjb25maWcgQUJZU1MKKwl0cmlzdGF0ZSAiTWFkZ2UgU21hcnQgMTYvNCBQQ0kgTWsyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBUUiAmJiBUTVMzODBUUiAmJiBQQ0kKKwloZWxwCisJICBUaGlzIHRtczM4MCBtb2R1bGUgc3VwcG9ydHMgdGhlIE1hZGdlIFNtYXJ0IDE2LzQgUENJIE1rMgorCSAgY2FyZHMgKDUxLTAyKS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgYWJ5c3MuCisKK2NvbmZpZyBNQURHRU1DCisJdHJpc3RhdGUgIk1hZGdlIFNtYXJ0IDE2LzQgUmluZ25vZGUgTWljcm9DaGFubmVsIgorCWRlcGVuZHMgb24gVFIgJiYgVE1TMzgwVFIgJiYgTUNBX0xFR0FDWQorCWhlbHAKKwkgIFRoaXMgdG1zMzgwIG1vZHVsZSBzdXBwb3J0cyB0aGUgTWFkZ2UgU21hcnQgMTYvNCBNQzE2IGFuZCBNQzMyCisJICBNaWNyb0NoYW5uZWwgYWRhcHRlcnMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIG1hZGdlbWMuCisKK2NvbmZpZyBTTUNUUgorCXRyaXN0YXRlICJTTUMgSVNBL01DQSBhZGFwdGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBUUiAmJiAoSVNBIHx8IE1DQV9MRUdBQ1kpICYmIChCUk9LRU4gfHwgITY0QklUKQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgdGhlIElTQSBhbmQgTUNBIFNNQyBUb2tlbiBSaW5nIGNhcmRzLAorCSAgc3BlY2lmaWNhbGx5IFNNQyBUb2tlbkNhcmQgRWxpdGUgKDgxMTVUKSBhbmQgU01DIFRva2VuQ2FyZCBFbGl0ZS9BCisJICAoODExNVQvQSkgYWRhcHRlcnMuCisKKwkgIElmIHlvdSBoYXZlIHN1Y2ggYW4gYWRhcHRlciBhbmQgd291bGQgbGlrZSB0byB1c2UgaXQsIHNheSBZIG9yIE0gYW5kCisJICByZWFkIHRoZSBUb2tlbi1SaW5nIG1pbmktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+IGFuZCB0aGUgZmlsZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3NtY3RyLnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHNtY3RyLgorCitlbmRtZW51CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODhiMGE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIGRyaXZlcnMvbmV0L3Rva2VucmluZworIworCitvYmotJChDT05GSUdfSUJNVFIpIAkrPSBpYm10ci5vCitvYmotJChDT05GSUdfSUJNT0wpIAkrPSBvbHltcGljLm8KK29iai0kKENPTkZJR19JQk1MUykgCSs9IGxhbnN0cmVhbWVyLm8KK29iai0kKENPTkZJR19UTVMzODBUUikgCSs9IHRtczM4MHRyLm8KK29iai0kKENPTkZJR19BQllTUykgCSs9IGFieXNzLm8KK29iai0kKENPTkZJR19NQURHRU1DKSAJKz0gbWFkZ2VtYy5vCitvYmotJChDT05GSUdfUFJPVEVPTikgCSs9IHByb3Rlb24ubworb2JqLSQoQ09ORklHX1RNU1BDSSkgCSs9IHRtc3BjaS5vCitvYmotJChDT05GSUdfU0tJU0EpIAkrPSBza2lzYS5vCitvYmotJChDT05GSUdfU01DVFIpIAkrPSBzbWN0ci5vCitvYmotJChDT05GSUdfM0MzNTkpCSs9IDNjMzU5Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9hYnlzcy5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2FieXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0YTJiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9hYnlzcy5jCkBAIC0wLDAgKzEsNDgxIEBACisvKgorICogIGFieXNzLmM6IE5ldHdvcmsgZHJpdmVyIGZvciB0aGUgTWFkZ2UgU21hcnQgMTYvNCBQQ0kgTWsyIHRva2VuIHJpbmcgY2FyZC4KKyAqCisgKiAgV3JpdHRlbiAxOTk5LTIwMDAgYnkgQWRhbSBGcml0emxlcgorICoKKyAqICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAgVGhpcyBkcml2ZXIgbW9kdWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY2FyZHM6CisgKiAgICAgIC0gTWFkZ2UgU21hcnQgMTYvNCBQQ0kgTWsyCisgKgorICogIE1haW50YWluZXIocyk6CisgKiAgICBBRglBZGFtIEZyaXR6bGVyCQltaWRAYXVrLmN4CisgKgorICogIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgorICoJMzAtRGVjLTk5CUFGCVNwbGl0IG9mZiBmcm9tIHRoZSB0bXMzODB0ciBkcml2ZXIuCisgKgkyMi1KYW4tMDAJQUYJVXBkYXRlZCB0byB1c2UgaW5kaXJlY3QgcmVhZC93cml0ZXMgCisgKgkyMy1Ob3YtMDAJSkcJTmV3IFBDSSBBUEksIGNsZWFudXBzCisgKgorICoKKyAqICBUT0RPOgorICoJMS4gU2VlIGlmIHdlIGNhbiB1c2UgTU1JTyBpbnN0ZWFkIG9mIGluYi9vdXRiL2ludy9vdXR3CisgKgkyLiBBZGQgc3VwcG9ydCBmb3IgTWsxIChoYXMgQVQyNCBhdHRhY2hlZCB0byB0aGUgUENJCisgKgkJY29uZmlnIHJlZ2lzdGVycykKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RyZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSAidG1zMzgwdHIuaCIKKyNpbmNsdWRlICJhYnlzcy5oIiAgICAgICAgICAgIC8qIE1hZGdlLXNwZWNpZmljIGNvbnN0YW50cyAqLworCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisiYWJ5c3MuYzogdjEuMDIgMjMvMTEvMjAwMCBieSBBZGFtIEZyaXR6bGVyXG4iOworCisjZGVmaW5lIEFCWVNTX0lPX0VYVEVOVCA2NAorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYWJ5c3NfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9NQURHRSwgUENJX0RFVklDRV9JRF9NQURHRV9NSzIsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQ0xBU1NfTkVUV09SS19UT0tFTl9SSU5HIDw8IDgsIDB4MDBmZmZmZmYsIH0sCisJeyB9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWJ5c3NfcGNpX3RibCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBhYnlzc19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBhYnlzc19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGFieXNzX2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYWJ5c3NfY2hpcHNldF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgYWJ5c3NfcmVhZF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYWJ5c3Nfc2V0bnNlbG91dF9waW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZCBhdDI0X3dyaXRlZGF0YWJ5dGUodW5zaWduZWQgbG9uZyByZWdhZGRyLCB1bnNpZ25lZCBjaGFyIGJ5dGUpOworc3RhdGljIGludCBhdDI0X3NlbmRmdWxsY21kKHVuc2lnbmVkIGxvbmcgcmVnYWRkciwgdW5zaWduZWQgY2hhciBjbWQsIHVuc2lnbmVkIGNoYXIgYWRkcik7CitzdGF0aWMgaW50IGF0MjRfc2VuZGNtZCh1bnNpZ25lZCBsb25nIHJlZ2FkZHIsIHVuc2lnbmVkIGNoYXIgY21kKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF0MjRfcmVhZGRhdGFiaXQodW5zaWduZWQgbG9uZyByZWdhZGRyKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF0MjRfcmVhZGRhdGFieXRlKHVuc2lnbmVkIGxvbmcgcmVnYWRkcik7CitzdGF0aWMgaW50IGF0MjRfd2FpdGZvcmFjayh1bnNpZ25lZCBsb25nIHJlZ2FkZHIpOworc3RhdGljIGludCBhdDI0X3dhaXRmb3JuYWNrKHVuc2lnbmVkIGxvbmcgcmVnYWRkcik7CitzdGF0aWMgdm9pZCBhdDI0X3NldGxpbmVzKHVuc2lnbmVkIGxvbmcgcmVnYWRkciwgdW5zaWduZWQgY2hhciBjbG9jaywgdW5zaWduZWQgY2hhciBkYXRhKTsKK3N0YXRpYyB2b2lkIGF0MjRfc3RhcnQodW5zaWduZWQgbG9uZyByZWdhZGRyKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF0MjRfcmVhZGIodW5zaWduZWQgbG9uZyByZWdhZGRyLCB1bnNpZ25lZCBjaGFyIGFkZHIpOworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYWJ5c3Nfc2lmcmVhZGIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCXJldHVybiBpbmIoZGV2LT5iYXNlX2FkZHIgKyByZWcpOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYWJ5c3Nfc2lmcmVhZHcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCXJldHVybiBpbncoZGV2LT5iYXNlX2FkZHIgKyByZWcpOworfQorCitzdGF0aWMgdm9pZCBhYnlzc19zaWZ3cml0ZWIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmFsLCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJb3V0Yih2YWwsIGRldi0+YmFzZV9hZGRyICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgYWJ5c3Nfc2lmd3JpdGV3KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZhbCwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCW91dHcodmFsLCBkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFieXNzX2F0dGFjaChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sJCisJc3RhdGljIGludCB2ZXJzaW9ucHJpbnRlZDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBuZXRfbG9jYWwgKnRwOworCWludCBpLCByZXQsIHBjaV9pcnFfbGluZTsKKwl1bnNpZ25lZCBsb25nIHBjaV9pb2FkZHI7CisJCisJaWYgKHZlcnNpb25wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKCIlcyIsIHZlcnNpb24pOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIFJlbW92ZSBJL08gc3BhY2UgbWFya2VyIGluIGJpdCAwLiAqLworCXBjaV9pcnFfbGluZSA9IHBkZXYtPmlycTsKKwlwY2lfaW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAwKTsKKwkJCisJLyogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGZvdW5kIGEgdmFsaWQgY2FyZC4gKi8KKwkJCisJZGV2ID0gYWxsb2NfdHJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHBjaV9pb2FkZHIsIEFCWVNTX0lPX0VYVEVOVCwgZGV2LT5uYW1lKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyX291dF90cmRldjsKKwl9CisJCQorCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgdG1zMzgwdHJfaW50ZXJydXB0LCBTQV9TSElSUSwKKwkJCSAgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX291dF9yZWdpb247CisJCQorCWRldi0+YmFzZV9hZGRyCT0gcGNpX2lvYWRkcjsKKwlkZXYtPmlycQk9IHBjaV9pcnFfbGluZTsKKwkJCisJcHJpbnRrKCIlczogTWFkZ2UgU21hcnQgMTYvNCBQQ0kgTWsyIChBYnlzcylcbiIsIGRldi0+bmFtZSk7CisJcHJpbnRrKCIlczogICAgSU86ICUjNGx4ICBJUlE6ICVkXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHBjaV9pb2FkZHIsIGRldi0+aXJxKTsKKwkvKgorCSAqIFRoZSBUTVMgU0lGIHJlZ2lzdGVycyBsYXkgMHgxMCBhYm92ZSB0aGUgY2FyZCBiYXNlIGFkZHJlc3MuCisJICovCisJZGV2LT5iYXNlX2FkZHIgKz0gMHgxMDsKKwkJCisJcmV0ID0gdG1zZGV2X2luaXQoZGV2LCBQQ0lfTUFYX0FERFJFU1MsIHBkZXYpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKCIlczogdW5hYmxlIHRvIGdldCBtZW1vcnkgZm9yIGRldi0+cHJpdi5cbiIsIAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byBlcnJfb3V0X2lycTsKKwl9CisKKwlhYnlzc19yZWFkX2VlcHJvbShkZXYpOworCQkKKwlwcmludGsoIiVzOiAgICBSaW5nIFN0YXRpb24gQWRkcmVzczogIiwgZGV2LT5uYW1lKTsKKwlwcmludGsoIiUyLjJ4IiwgZGV2LT5kZXZfYWRkclswXSk7CisJZm9yIChpID0gMTsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCI6JTIuMngiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIlxuIik7CisKKwl0cCA9IG5ldGRldl9wcml2KGRldik7CisJdHAtPnNldG5zZWxvdXQgPSBhYnlzc19zZXRuc2Vsb3V0X3BpbnM7CisJdHAtPnNpZnJlYWRiID0gYWJ5c3Nfc2lmcmVhZGI7CisJdHAtPnNpZnJlYWR3ID0gYWJ5c3Nfc2lmcmVhZHc7CisJdHAtPnNpZndyaXRlYiA9IGFieXNzX3NpZndyaXRlYjsKKwl0cC0+c2lmd3JpdGV3ID0gYWJ5c3Nfc2lmd3JpdGV3OworCisJbWVtY3B5KHRwLT5Qcm9kdWN0SUQsICJNYWRnZSBQQ0kgMTYvNCBNazIiLCBQUk9EX0lEX1NJWkUgKyAxKTsKKwkJCisJZGV2LT5vcGVuID0gYWJ5c3Nfb3BlbjsKKwlkZXYtPnN0b3AgPSBhYnlzc19jbG9zZTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9vdXRfdG1zZGV2OworCXJldHVybiAwOworCitlcnJfb3V0X3Rtc2RldjoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJdG1zZGV2X3Rlcm0oZGV2KTsKK2Vycl9vdXRfaXJxOgorCWZyZWVfaXJxKHBkZXYtPmlycSwgZGV2KTsKK2Vycl9vdXRfcmVnaW9uOgorCXJlbGVhc2VfcmVnaW9uKHBjaV9pb2FkZHIsIEFCWVNTX0lPX0VYVEVOVCk7CitlcnJfb3V0X3RyZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGFieXNzX3NldG5zZWxvdXRfcGlucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIHNob3J0IHZhbCA9IDA7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCWlmKHRwLT5EYXRhUmF0ZSA9PSBTUEVFRF80KQorCQl2YWwgfD0gMHgwMTsgIC8qIFNldCA0TWJwcyAqLworCWVsc2UKKwkJdmFsIHw9IDB4MDA7ICAvKiBTZXQgMTZNYnBzICovCisJCisJcmV0dXJuIHZhbDsKK30KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgTWFkZ2UgYm9hcmRzIHNob3VsZCB1c2UgdGhpcyBjb2RlOgorICogICAtIFNtYXJ0IDE2LzQgUENJIE1rMiAoQWJ5c3MpCisgKiAgIC0gU21hcnQgMTYvNCBQQ0kgTWsxIChQQ0kgVCkKKyAqICAgLSBTbWFydCAxNi80IENsaWVudCBQbHVzIFBuUCAoQmlnIEFwcGxlKQorICogICAtIFNtYXJ0IDE2LzQgQ2FyZGJ1cyBNazIKKyAqCisgKiBUaGVzZSBhY2Nlc3MgYW4gQXRtZWwgQVQyNCBTRUVQUk9NIHVzaW5nIHRoZWlyIGdsdWUgY2hpcCByZWdpc3RlcnMuIAorICoKKyAqLworc3RhdGljIHZvaWQgYXQyNF93cml0ZWRhdGFieXRlKHVuc2lnbmVkIGxvbmcgcmVnYWRkciwgdW5zaWduZWQgY2hhciBieXRlKQoreworCWludCBpOworCQorCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJYXQyNF9zZXRsaW5lcyhyZWdhZGRyLCAwLCAoYnl0ZSA+PiAoNy1pKSkmMHgwMSk7CisJCWF0MjRfc2V0bGluZXMocmVnYWRkciwgMSwgKGJ5dGUgPj4gKDctaSkpJjB4MDEpOworCQlhdDI0X3NldGxpbmVzKHJlZ2FkZHIsIDAsIChieXRlID4+ICg3LWkpKSYweDAxKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXQyNF9zZW5kZnVsbGNtZCh1bnNpZ25lZCBsb25nIHJlZ2FkZHIsIHVuc2lnbmVkIGNoYXIgY21kLCB1bnNpZ25lZCBjaGFyIGFkZHIpCit7CisJaWYgKGF0MjRfc2VuZGNtZChyZWdhZGRyLCBjbWQpKSB7CisJCWF0MjRfd3JpdGVkYXRhYnl0ZShyZWdhZGRyLCBhZGRyKTsKKwkJcmV0dXJuIGF0MjRfd2FpdGZvcmFjayhyZWdhZGRyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQyNF9zZW5kY21kKHVuc2lnbmVkIGxvbmcgcmVnYWRkciwgdW5zaWduZWQgY2hhciBjbWQpCit7CisJaW50IGk7CisJCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJYXQyNF9zdGFydChyZWdhZGRyKTsKKwkJYXQyNF93cml0ZWRhdGFieXRlKHJlZ2FkZHIsIGNtZCk7CisJCWlmIChhdDI0X3dhaXRmb3JhY2socmVnYWRkcikpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF0MjRfcmVhZGRhdGFiaXQodW5zaWduZWQgbG9uZyByZWdhZGRyKQoreworCXVuc2lnbmVkIGNoYXIgdmFsOworCisJYXQyNF9zZXRsaW5lcyhyZWdhZGRyLCAwLCAxKTsKKwlhdDI0X3NldGxpbmVzKHJlZ2FkZHIsIDEsIDEpOworCXZhbCA9IChpbmIocmVnYWRkcikgJiBBVDI0X0RBVEEpPzE6MDsKKwlhdDI0X3NldGxpbmVzKHJlZ2FkZHIsIDEsIDEpOworCWF0MjRfc2V0bGluZXMocmVnYWRkciwgMCwgMSk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXQyNF9yZWFkZGF0YWJ5dGUodW5zaWduZWQgbG9uZyByZWdhZGRyKQoreworCXVuc2lnbmVkIGNoYXIgZGF0YSA9IDA7CisJaW50IGk7CisJCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlkYXRhIDw8PSAxOworCQlkYXRhIHw9IGF0MjRfcmVhZGRhdGFiaXQocmVnYWRkcik7CisJfQorCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgYXQyNF93YWl0Zm9yYWNrKHVuc2lnbmVkIGxvbmcgcmVnYWRkcikKK3sKKwlpbnQgaTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQlpZiAoKGF0MjRfcmVhZGRhdGFiaXQocmVnYWRkcikgJiAweDAxKSA9PSAweDAwKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0MjRfd2FpdGZvcm5hY2sodW5zaWduZWQgbG9uZyByZWdhZGRyKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCWlmICgoYXQyNF9yZWFkZGF0YWJpdChyZWdhZGRyKSAmIDB4MDEpID09IDB4MDEpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF0MjRfc2V0bGluZXModW5zaWduZWQgbG9uZyByZWdhZGRyLCB1bnNpZ25lZCBjaGFyIGNsb2NrLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJdW5zaWduZWQgY2hhciB2YWwgPSBBVDI0X0VOQUJMRTsKKwlpZiAoY2xvY2spCisJCXZhbCB8PSBBVDI0X0NMT0NLOworCWlmIChkYXRhKQorCQl2YWwgfD0gQVQyNF9EQVRBOworCisJb3V0Yih2YWwsIHJlZ2FkZHIpOyAKKwl0bXMzODB0cl93YWl0KDIwKTsgLyogVmVyeSBuZWNlc3NhcnkuICovCit9CisKK3N0YXRpYyB2b2lkIGF0MjRfc3RhcnQodW5zaWduZWQgbG9uZyByZWdhZGRyKQoreworCWF0MjRfc2V0bGluZXMocmVnYWRkciwgMCwgMSk7CisJYXQyNF9zZXRsaW5lcyhyZWdhZGRyLCAxLCAxKTsKKwlhdDI0X3NldGxpbmVzKHJlZ2FkZHIsIDEsIDApOworCWF0MjRfc2V0bGluZXMocmVnYWRkciwgMCwgMSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGF0MjRfcmVhZGIodW5zaWduZWQgbG9uZyByZWdhZGRyLCB1bnNpZ25lZCBjaGFyIGFkZHIpCit7CisJdW5zaWduZWQgY2hhciBkYXRhID0gMHhmZjsKKwkKKwlpZiAoYXQyNF9zZW5kZnVsbGNtZChyZWdhZGRyLCBBVDI0X1dSSVRFLCBhZGRyKSkgeworCQlpZiAoYXQyNF9zZW5kY21kKHJlZ2FkZHIsIEFUMjRfUkVBRCkpIHsKKwkJCWRhdGEgPSBhdDI0X3JlYWRkYXRhYnl0ZShyZWdhZGRyKTsKKwkJCWlmICghYXQyNF93YWl0Zm9ybmFjayhyZWdhZGRyKSkKKwkJCQlkYXRhID0gMHhmZjsKKwkJfQorCX0KKwlyZXR1cm4gZGF0YTsKK30KKworCisvKgorICogRW5hYmxlIGJhc2ljIGZ1bmN0aW9ucyBvZiB0aGUgTWFkZ2UgY2hpcHNldCBuZWVkZWQKKyAqIGZvciBpbml0aWFsaXphdGlvbi4KKyAqLworc3RhdGljIHZvaWQgYWJ5c3NfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgY2hhciByZXNldF9yZWc7CisJdW5zaWduZWQgbG9uZyBpb2FkZHI7CisJCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJcmVzZXRfcmVnID0gaW5iKGlvYWRkciArIFBDSUJNMl9SRVNFVF9SRUcpOworCXJlc2V0X3JlZyB8PSBQQ0lCTTJfUkVTRVRfUkVHX0NISVBfTlJFUzsKKwlvdXRiKHJlc2V0X3JlZywgaW9hZGRyICsgUENJQk0yX1JFU0VUX1JFRyk7CisJdG1zMzgwdHJfd2FpdCgxMDApOworfQorCisvKgorICogRW5hYmxlIHRoZSBmdW5jdGlvbnMgb2YgdGhlIE1hZGdlIGNoaXBzZXQgbmVlZGVkIGZvcgorICogZnVsbCB3b3JraW5nIG9yZGVyLiAKKyAqLworc3RhdGljIGludCBhYnlzc19jaGlwc2V0X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBjaGFyIHJlc2V0X3JlZzsKKwl1bnNpZ25lZCBsb25nIGlvYWRkcjsKKwkKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwkKKwlyZXNldF9yZWcgPSBpbmIoaW9hZGRyICsgUENJQk0yX1JFU0VUX1JFRyk7CisJCisJcmVzZXRfcmVnIHw9IFBDSUJNMl9SRVNFVF9SRUdfQ0hJUF9OUkVTOworCW91dGIocmVzZXRfcmVnLCBpb2FkZHIgKyBQQ0lCTTJfUkVTRVRfUkVHKTsKKwkKKwlyZXNldF9yZWcgJj0gfihQQ0lCTTJfUkVTRVRfUkVHX0NISVBfTlJFUyB8CisJCSAgICAgICBQQ0lCTTJfUkVTRVRfUkVHX0ZJRk9fTlJFUyB8IAorCQkgICAgICAgUENJQk0yX1JFU0VUX1JFR19TSUZfTlJFUyk7CisJb3V0YihyZXNldF9yZWcsIGlvYWRkciArIFBDSUJNMl9SRVNFVF9SRUcpOworCQorCXRtczM4MHRyX3dhaXQoMTAwKTsKKwkKKwlyZXNldF9yZWcgfD0gUENJQk0yX1JFU0VUX1JFR19DSElQX05SRVM7CisJb3V0YihyZXNldF9yZWcsIGlvYWRkciArIFBDSUJNMl9SRVNFVF9SRUcpOworCQorCXJlc2V0X3JlZyB8PSBQQ0lCTTJfUkVTRVRfUkVHX1NJRl9OUkVTOworCW91dGIocmVzZXRfcmVnLCBpb2FkZHIgKyBQQ0lCTTJfUkVTRVRfUkVHKTsKKworCXJlc2V0X3JlZyB8PSBQQ0lCTTJfUkVTRVRfUkVHX0ZJRk9fTlJFUzsKKwlvdXRiKHJlc2V0X3JlZywgaW9hZGRyICsgUENJQk0yX1JFU0VUX1JFRyk7CisKKwlvdXRiKFBDSUJNMl9JTlRfQ09OVFJPTF9SRUdfU0lOVEVOIHwgCisJICAgICBQQ0lCTTJfSU5UX0NPTlRST0xfUkVHX1BDSV9FUlJfRU5BQkxFLCAKKwkgICAgIGlvYWRkciArIFBDSUJNMl9JTlRfQ09OVFJPTF9SRUcpOworICAKKwlvdXRiKDMwLCBpb2FkZHIgKyBQQ0lCTTJfRklGT19USFJFU0hPTEQpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWJ5c3NfY2hpcHNldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyOworCQorCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW91dGIoMCwgaW9hZGRyICsgUENJQk0yX1JFU0VUX1JFRyk7Cit9CisKKy8qCisgKiBSZWFkIGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIHRoZSBBVDI0IFNFRVBST00gb24gTWFkZ2UgY2FyZHMuCisgKgorICovCitzdGF0aWMgdm9pZCBhYnlzc19yZWFkX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwOworCXVuc2lnbmVkIGxvbmcgaW9hZGRyOworCXVuc2lnbmVkIHNob3J0IHZhbDsKKwlpbnQgaTsKKwkKKwl0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJCisJLyogTXVzdCBlbmFibGUgZ2x1ZSBjaGlwIGZpcnN0ICovCisJYWJ5c3NfZW5hYmxlKGRldik7CisJCisJdmFsID0gYXQyNF9yZWFkYihpb2FkZHIgKyBQQ0lCTTJfU0VFUFJPTV9SRUcsIAorCQkJIFBDSUJNMl9TRUVQUk9NX1JJTkdfU1BFRUQpOworCXRwLT5EYXRhUmF0ZSA9IHZhbD9TUEVFRF80OlNQRUVEXzE2OyAvKiBzZXQgb3BlbiBzcGVlZCAqLworCXByaW50aygiJXM6ICAgIFNFRVBST006IHJpbmcgc3BlZWQ6ICVkTWIvc2VjXG4iLCBkZXYtPm5hbWUsIHRwLT5EYXRhUmF0ZSk7CisJCisJdmFsID0gYXQyNF9yZWFkYihpb2FkZHIgKyBQQ0lCTTJfU0VFUFJPTV9SRUcsCisJCQkgUENJQk0yX1NFRVBST01fUkFNX1NJWkUpICogMTI4OworCXByaW50aygiJXM6ICAgIFNFRVBST006IGFkYXB0ZXIgUkFNOiAlZGtiXG4iLCBkZXYtPm5hbWUsIHZhbCk7CisJCisJZGV2LT5hZGRyX2xlbiA9IDY7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgCisJCWRldi0+ZGV2X2FkZHJbaV0gPSBhdDI0X3JlYWRiKGlvYWRkciArIFBDSUJNMl9TRUVQUk9NX1JFRywgCisJCQkJCSAgICAgIFBDSUJNMl9TRUVQUk9NX0JJQStpKTsKK30KKworc3RhdGljIGludCBhYnlzc19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7ICAKKwlhYnlzc19jaGlwc2V0X2luaXQoZGV2KTsKKwl0bXMzODB0cl9vcGVuKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWJ5c3NfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl0bXMzODB0cl9jbG9zZShkZXYpOworCWFieXNzX2NoaXBzZXRfY2xvc2UoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGFieXNzX2RldGFjaCAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwkKKwlpZiAoIWRldikKKwkJQlVHKCk7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkci0weDEwLCBBQllTU19JT19FWFRFTlQpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXRtc2Rldl90ZXJtKGRldik7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhYnlzc19kcml2ZXIgPSB7CisJLm5hbWUJCT0gImFieXNzIiwKKwkuaWRfdGFibGUJPSBhYnlzc19wY2lfdGJsLAorCS5wcm9iZQkJPSBhYnlzc19hdHRhY2gsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhYnlzc19kZXRhY2gpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWJ5c3NfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYWJ5c3NfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFieXNzX3JtbW9kICh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJmFieXNzX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFieXNzX2luaXQpOworbW9kdWxlX2V4aXQoYWJ5c3Nfcm1tb2QpOworCisMCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFZFUlNJT05TICAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUkvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC90b2tlbnJpbmcvIC1jIGFieXNzLmMiCisgKiAgYWx0LWNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUkvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC90b2tlbnJpbmcvIC1jIGFieXNzLmMiCisgKiAgYy1zZXQtc3R5bGUgIksmUiIKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9hYnlzcy5oIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2FieXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlNmU0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9hYnlzcy5oCkBAIC0wLDAgKzEsNTggQEAKKy8qIAorICogYWJ5c3MuaDogSGVhZGVyIGZvciB0aGUgYWJ5c3MgdG1zMzgwdHIgbW9kdWxlCisgKgorICogQXV0aG9yczoKKyAqIC0gQWRhbSBGcml0emxlciA8bWlkQGF1ay5jeD4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfTUFER0VUUl9ICisjZGVmaW5lIF9fTElOVVhfTUFER0VUUl9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qCisgKiBGb3IgTWFkZ2UgU21hcnQgMTYvNCBQQ0kgTWsyLiAgU2luY2Ugd2UgaW5jcmVtZW50IHRoZSBiYXNlIGFkZHJlc3MKKyAqIHRvIGdldCBldmVyeXRoaW5nIGNvcnJlY3QgZm9yIHRoZSBUTVMgU0lGLCB3ZSBkbyB0aGVzZSBhcyBuZWdhdGl2ZXMKKyAqIGFzIHRoZXkgZmFsbCBiZWxvdyB0aGUgU0lGIGluIGFkZHJlc3NpbmcuCisgKi8KKyNkZWZpbmUgUENJQk0yX0lOVF9TVEFUVVNfUkVHICAgICAgICAgICgoc2hvcnQpLTE1KS8qIDB4MDEgKi8KKyNkZWZpbmUgUENJQk0yX0lOVF9DT05UUk9MX1JFRyAgICAgICAgICgoc2hvcnQpLTE0KS8qIDB4MDIgKi8KKyNkZWZpbmUgUENJQk0yX1JFU0VUX1JFRyAgICAgICAgICAgICAgICgoc2hvcnQpLTEyKS8qIDB4MDQgKi8KKyNkZWZpbmUgUENJQk0yX1NFRVBST01fUkVHICAgICAgICAgICAgICgoc2hvcnQpLTkpIC8qIDB4MDcgKi8KKworI2RlZmluZSBQQ0lCTTJfSU5UX0NPTlRST0xfUkVHX1NJTlRFTiAgICAgICAgICAgMHgwMgorI2RlZmluZSBQQ0lCTTJfSU5UX0NPTlRST0xfUkVHX1BDSV9FUlJfRU5BQkxFICAgMHg4MAorI2RlZmluZSBQQ0lCTTJfSU5UX1NUQVRVU19SRUdfUENJX0VSUiAgICAgICAgICAgMHg4MAorCisjZGVmaW5lIFBDSUJNMl9SRVNFVF9SRUdfQ0hJUF9OUkVTICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFBDSUJNMl9SRVNFVF9SRUdfRklGT19OUkVTICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFBDSUJNMl9SRVNFVF9SRUdfU0lGX05SRVMgICAgICAgICAgICAgICAweDA0CisKKyNkZWZpbmUgUENJQk0yX0ZJRk9fVEhSRVNIT0xEICAgMHgyMQorI2RlZmluZSBQQ0lCTTJfQlVSU1RfTEVOR1RIICAgICAweDIyCisKKy8qCisgKiBCaXRzIGluIFBDSUJNMl9TRUVQUk9NX1JFRy4KKyAqLworI2RlZmluZSBBVDI0X0VOQUJMRSAgICAgICAgICAgICAweDA0CisjZGVmaW5lIEFUMjRfREFUQSAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQVQyNF9DTE9DSyAgICAgICAgICAgICAgMHgwMQorCisvKgorICogQVQyNCBDb21tYW5kcy4KKyAqLworI2RlZmluZSBBVDI0X1dSSVRFICAgICAgICAgICAgICAweEEwCisjZGVmaW5lIEFUMjRfUkVBRCAgICAgICAgICAgICAgIDB4QTEKKworLyoKKyAqIEFkZHJlc3NlcyBpbiBBVDI0IFNFRVBST00uCisgKi8KKyNkZWZpbmUgUENJQk0yX1NFRVBST01fQklBICAgICAgICAgIDB4MTIKKyNkZWZpbmUgUENJQk0yX1NFRVBST01fUklOR19TUEVFRCAgIDB4MTgKKyNkZWZpbmUgUENJQk0yX1NFRVBST01fUkFNX1NJWkUgICAgIDB4MUEKKyNkZWZpbmUgUENJQk0yX1NFRVBST01fSFdGMSAgICAgICAgIDB4MUMKKyNkZWZpbmUgUENJQk0yX1NFRVBST01fSFdGMiAgICAgICAgIDB4MUUKKworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9fTElOVVhfTUFER0VUUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvaWJtdHIuYyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9pYm10ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOTg4NjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvaWJtdHIuYwpAQCAtMCwwICsxLDE5ODcgQEAKKy8qIGlibXRyLmM6ICBBIHNoYXJlZC1tZW1vcnkgSUJNIFRva2VuIFJpbmcgMTYvNCBkcml2ZXIgZm9yIGxpbnV4CisgKgorICoJV3JpdHRlbiAxOTkzIGJ5IE1hcmsgU3dhbnNvbiBhbmQgUGV0ZXIgRGUgU2NocmlqdmVyLgorICoJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICoJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKglUaGlzIGRldmljZSBkcml2ZXIgc2hvdWxkIHdvcmsgd2l0aCBBbnkgSUJNIFRva2VuIFJpbmcgQ2FyZCB0aGF0IGRvZXMKKyAqCW5vdCB1c2UgRE1BLgorICoKKyAqCUkgdXNlZCBEb25hbGQgQmVja2VyJ3MgKGJlY2tlckBzY3lsZC5jb20pIGRldmljZSBkcml2ZXIgd29yaworICoJYXMgYSBiYXNlIGZvciBtb3N0IG9mIG15IGluaXRpYWwgd29yay4KKyAqCisgKglDaGFuZ2VzIGJ5IFBldGVyIERlIFNjaHJpanZlcgorICoJCShQZXRlci5EZXNjaHJpanZlckBsaW51eC5jYy5rdWxldXZlbi5hYy5iZSkgOgorICoKKyAqCSsgY2hhbmdlZCBuYW1lIHRvIGlibXRyLmMgaW4gYW50aWNpcGF0aW9uIG9mIG90aGVyIHRyIGJvYXJkcy4KKyAqCSsgY2hhbmdlZCByZXNldCBjb2RlIGFuZCBhZGFwdGVyIG9wZW4gY29kZS4KKyAqCSsgYWRkZWQgU0FQIG9wZW4gY29kZS4KKyAqCSsgYSBmaXJzdCBhdHRlbXB0IHRvIHdyaXRlIGludGVycnVwdCwgdHJhbnNtaXQgYW5kIHJlY2VpdmUgcm91dGluZXMuCisgKgorICoJQ2hhbmdlcyBieSBEYXZpZCBXLiBNb3JyaXMgKGR3bUBzaGVsbC5wb3J0YWwuY29tKSA6CisgKgk5NDEwMDMgZHdtOiAtIFJlc3RydWN0dXJlIHRva19wcm9iZSBmb3IgbXVsdGlwbGUgYWRhcHRlcnMsIGRldmljZXMuCisgKgkrIEFkZCBjb21tZW50cywgbWlzYyByZW9yZyBmb3IgY2xhcml0eS4KKyAqCSsgRmxhdHRlbiBpbnRlcnJ1cHQgaGFuZGxlciBsZXZlbHMuCisgKgorICoJQ2hhbmdlcyBieSBGYXJ6YWQgRmFyaWQgKGZhcnp5QHplbi52aWEuZWNwLmZyKQorICoJYW5kIFBhc2NhbCBBbmRyZSAoYW5kcmVAY2hpbWF5LnZpYS5lY3AuZnIpIChNYXJjaCA5IDE5OTUpIDoKKyAqCSsgbXVsdGkgcmluZyBzdXBwb3J0IGNsZWFuIHVwLgorICoJKyBSRkMxMDQyIGNvbXBsaWFuY2UgZW5oYW5jZWQuCisgKgorICoJQ2hhbmdlcyBieSBQYXNjYWwgQW5kcmUgKGFuZHJlQGNoaW1heS52aWEuZWNwLmZyKSAoU2VwdGVtYmVyIDcgMTk5NSkgOgorICoJKyBidWcgY29ycmVjdGlvbiBpbiB0cl90eAorICoJKyByZW1vdmVkIHJlZHVuZGFudCBpbmZvcm1hdGlvbiBkaXNwbGF5CisgKgkrIHNvbWUgY29kZSByZXdvcmtpbmcKKyAqCisgKglDaGFuZ2VzIGJ5IE1pY2hlbCBMZXNwaW5hc3NlICh3YWxrZW5AdmlhLmVjcC5mciksCisgKglZYW5uIERvdXNzb3QgKGRvdXNzb3RAdmlhLmVjcC5mcikgYW5kIFBhc2NhbCBBbmRyZSAoYW5kcmVAdmlhLmVjcC5mcikKKyAqCShGZWJydWFyeSAxOCwgMTk5NikgOgorICoJKyBtb2RpZmllZCBzaGFyZWQgbWVtb3J5IGFuZCBtbWlvIGFjY2VzcyBwb3J0IHRoZSBkcml2ZXIgdG8KKyAqCSAgYWxwaGEgcGxhdGZvcm0gKHN0cnVjdHVyZSBhY2Nlc3MgLT4gcmVhZGIvd3JpdGViKQorICoKKyAqCUNoYW5nZXMgYnkgU3RldmUgS2lwaXN6IChidW5neUBpYm0ubmV0IG9yIGtpcGlzekB2bmV0LmlibS5jb20pCisgKgkoSmFudWFyeSAxOCAxOTk2KToKKyAqCSsgc3dhcHBlZCBXV09SIGFuZCBXV0NSIGluIGlibXRyLmgKKyAqCSsgbW92ZWQgc29tZSBpbml0IGNvZGUgZnJvbSB0b2tfcHJvYmUgaW50byB0cmRldl9pbml0LiAgVGhlCisgKgkgIFBDTUNJQSBjb2RlIGNhbiBjYWxsIHRyZGV2X2luaXQgdG8gY29tcGxldGUgaW5pdGlhbGl6aW5nCisgKgkgIHRoZSBkcml2ZXIuCisgKgkrIGFkZGVkIC1EUENNQ0lBIHRvIHN1cHBvcnQgUENNQ0lBCisgKgkrIGRldGVjdGluZyBQQ01DSUEgQ2FyZCBSZW1vdmFsIGluIGludGVycnVwdCBoYW5kbGVyLiAgSWYKKyAqCSAgSVNSUCBpcyBGRiwgdGhlbiBhIFBDTUNJQSBjYXJkIGhhcyBiZWVuIHJlbW92ZWQKKyAqICAgICAgICAxMC8yMDAwIEJ1cnQgbmVlZGVkIGEgbmV3IG1ldGhvZCB0byBhdm9pZCBjcmFzaGluZyB0aGUgT1MKKyAqCisgKglDaGFuZ2VzIGJ5IFBhdWwgTm9ydG9uIChwbm9ydG9uQGN0cy5jb20pIDoKKyAqCSsgcmVzdHJ1Y3R1cmVkIHRoZSBSRUFELkxPRyBsb2dpYyB0byBwcmV2ZW50IHRoZSB0cmFuc21pdCBTUkIKKyAqCSAgZnJvbSBiZWluZyBydWRlbHkgb3ZlcndyaXR0ZW4gYmVmb3JlIHRoZSB0cmFuc21pdCBjeWNsZSBpcworICoJICBjb21wbGV0ZS4gKEF1Z3VzdCAxNSAxOTk2KQorICoJKyBjb21wbGV0ZWQgbXVsdGlwbGUgYWRhcHRlciBzdXBwb3J0LiAoTm92ZW1iZXIgMjAgMTk5NikKKyAqCSsgaW1wbGVtZW50ZWQgY3N1bV9wYXJ0aWFsX2NvcHkgaW4gdHJfcnggYW5kIGluY3JlYXNlZCByZWNlaXZlIAorICogICAgICAgIGJ1ZmZlciBzaXplIGFuZCBjb3VudC4gTWlub3IgZml4ZXMuIChNYXJjaCAxNSwgMTk5NykKKyAqCisgKglDaGFuZ2VzIGJ5IENocmlzdG9waGVyIFR1cmNrc2luIDx3YWJiaXRAcnRmYy5kZW1vbi5jby51az4KKyAqCSsgTm93IGNvbXBpbGVzIG9rIGFzIGEgbW9kdWxlIGFnYWluLgorICoKKyAqCUNoYW5nZXMgYnkgUGF1bCBOb3J0b24gKHBub3J0b25AaWVlZS5vcmcpIDoKKyAqICAgICAgKyBtb3ZlZCB0aGUgaGVhZGVyIG1hbmlwdWxhdGlvbiBjb2RlIGluIHRyX3R4IGFuZCB0cl9yeCB0bworICogICAgICAgIG5ldC84MDIvdHIuYy4gKEp1bHkgMTIgMTk5NykKKyAqICAgICAgKyBhZGQgcmV0cnkgYW5kIHRpbWVvdXQgb24gb3BlbiBpZiBjYWJsZSBkaXNjb25uZWN0ZWQuIChNYXkgNSAxOTk4KQorICogICAgICArIGxpZnRlZCAyMDAwIGJ5dGUgbXR1IGxpbWl0LiBub3cgZGVwZW5kcyBvbiBzaGFyZWQtUkFNIHNpemUuCisgKiAgICAgICAgTWF5IDI1IDE5OTgpCisgKiAgICAgICsgY2FuJ3QgYWxsb2NhdGUgMmsgcmVjdiBidWZmIGF0IDhrIHNoYXJlZC1SQU0uICgyMCBPY3RvYmVyIDE5OTgpCisgKgorICogICAgICBDaGFuZ2VzIGJ5IEpvZWwgU2xvYW4gKGpqc0BjLW1lLmNvbSkgOgorICogICAgICArIGRpc2FibGUgdmVyYm9zZSBkZWJ1ZyBtZXNzYWdlcyBieSBkZWZhdWx0IC0gdG8gZW5hYmxlIHZlcmJvc2UKKyAqCSAgZGVidWdnaW5nLCBlZGl0IHRoZSBJQk1UUl9ERUJVR19NRVNTQUdFUyBkZWZpbmUgYmVsb3cgCisgKgkKKyAqCUNoYW5nZXMgYnkgTWlrZSBQaGlsbGlwcyA8cGhpbGxpbUBhbXRyYWsuY29tPiA6CisgKgkrIEFkZGVkIGV4dHJhICNpZmRlZidzIHRvIHdvcmsgd2l0aCBuZXcgUENNQ0lBIFRva2VuIFJpbmcgQ29kZS4KKyAqCSAgVGhlIFBDTUNJQSBjb2RlIG5vdyBqdXN0IHNldHMgdXAgdGhlIGNhcmQgc28gaXQgY2FuIGJlIHJlY29nbml6ZWQKKyAqICAgICAgICBieSBpYm10cl9wcm9iZS4gQWxzbyBjaGVja3MgYWxsb2NhdGVkIG1lbW9yeSB2cy4gb24tYm9hcmQgbWVtb3J5CisgKgkgIGZvciBjb3JyZWN0IGZpZ3VyZSB0byB1c2UuCisgKgorICoJQ2hhbmdlcyBieSBUaW0gSG9ja2luICh0aG9ja2luQGlzdW5peC5pdC5pbHN0dS5lZHUpIDoKKyAqCSsgYWRkZWQgc3BpbmxvY2tzIGZvciBTTVAgc2FuaXR5ICgxMCBNYXJjaCAxOTk5KQorICoKKyAqICAgICAgQ2hhbmdlcyBieSBKb2NoZW4gRnJpZWRyaWNoIHRvIGVuYWJsZSBSRkMxNDY5IE9wdGlvbiAyIG11bHRpY2FzdGluZworICogICAgICBpLmUuIHVzaW5nIGZ1bmN0aW9uYWwgYWRkcmVzcyBDMCAwMCAwMCAwNCAwMCAwMCB0byB0cmFuc21pdCBhbmQgCisgKiAgICAgIHJlY2VpdmUgbXVsdGljYXN0IHBhY2tldHMuCisgKgorICogICAgICBDaGFuZ2VzIGJ5IE1pa2UgU3VsbGl2YW4gKGJhc2VkIG9uIG9yaWdpbmFsIHNyYW0gcGF0Y2ggYnkgRGF2ZSBHcm90aGUKKyAqICAgICAgdG8gc3VwcG9ydCB3aW5kb3dpbmcgaW50byBvbiBhZGFwdGVyIHNoYXJlZCByYW0uCisgKiAgICAgIGkuZS4gVXNlIExBTkFJRCB0byBzZXR1cCBhIFBuUCBjb25maWd1cmF0aW9uIHdpdGggMTZLIFJBTS4gUGFnaW5nCisgKiAgICAgIHdpbGwgc2hpZnQgdGhpcyAxNksgd2luZG93IG92ZXIgdGhlIGVudGlyZSBhdmFpbGFibGUgc2hhcmVkIFJBTS4KKyAqCisgKiAgICAgIENoYW5nZXMgYnkgUGV0ZXIgRGUgU2NocmlqdmVyIChwMkBtaW5kLmJlKSA6CisgKiAgICAgICsgZml4ZWQgYSBwcm9ibGVtIHdpdGggUENNQ0lBIGNhcmQgcmVtb3ZhbAorICoKKyAqICAgICAgQ2hhbmdlIGJ5IE1pa2UgU3VsbGl2YW4gZXQgYWwuOgorICogICAgICArIGFkZGVkIHR1cmJvIGNhcmQgc3VwcG9ydC4gTm8gbmVlZCB0byB1c2UgbGFuYWlkIHRvIGNvbmZpZ3VyZQorICogICAgICB0aGUgYWRhcHRlciBpbnRvIGlzYSBjb21wYXRpYmxpdHkgbW9kZS4KKyAqCisgKiAgICAgIENoYW5nZXMgYnkgQnVydCBTaWx2ZXJtYW4gdG8gYWxsb3cgdGhlIGNvbXB1dGVyIHRvIGJlaGF2ZSBuaWNlbHkgd2hlbgorICoJYSBjYWJsZSBpcyBwdWxsZWQgb3Igbm90IGluIHBsYWNlLCBvciBhIFBDTUNJQSBjYXJkIGlzIHJlbW92ZWQgaG90LgorICovCisKKy8qIGNoYW5nZSB0aGUgZGVmaW5lIG9mIElCTVRSX0RFQlVHX01FU1NBR0VTIHRvIGEgbm9uemVybyB2YWx1ZSAKK2luIHRoZSBldmVudCB0aGF0IGNoYXR0eSBkZWJ1ZyBtZXNzYWdlcyBhcmUgZGVzaXJlZCAtIGpqcyAxMi8zMC85OCAqLworCisjZGVmaW5lIElCTVRSX0RFQlVHX01FU1NBR0VTIDAKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaWZkZWYgUENNQ0lBCQkvKiByZXF1aXJlZCBmb3IgaWJtdHJfY3MuYyB0byBidWlsZCAqLworI3VuZGVmIE1PRFVMRQkJLyogeWVzLCByZWFsbHkgKi8KKyN1bmRlZiBFTkFCTEVfUEFHSU5HCisjZWxzZQorI2RlZmluZSBFTkFCTEVfUEFHSU5HIDEJCQorI2VuZGlmCisKKyNkZWZpbmUgRkFMU0UgMAorI2RlZmluZSBUUlVFICghRkFMU0UpCisKKy8qIGNoYW5nZXMgdGhlIG91dHB1dCBmb3JtYXQgb2YgZHJpdmVyIGluaXRpYWxpemF0aW9uICovCisjZGVmaW5lIFRSX1ZFUkJPU0UJMAorCisvKiBzb21lIDk1IE9TIHNlbmQgbWFueSBub24gVUkgZnJhbWU7IHRoaXMgYWxsb3cgcmVtb3ZpbmcgdGhlIHdhcm5pbmcgKi8KKyNkZWZpbmUgVFJfRklMVEVSTk9OVUkJMQorCisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90cmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2libXRyLmg+CisKKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIERQUklOVEsoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoIiVzOiAiIGZvcm1hdCwgZGV2LT5uYW1lICwgIyMgYXJncykKKyNkZWZpbmUgRFBSSU5URChmb3JtYXQsIGFyZ3MuLi4pIER1bW15Q2FsbCgiJXM6ICIgZm9ybWF0LCBkZXYtPm5hbWUgLCAjIyBhcmdzKQorCisvKiB2ZXJzaW9uIGFuZCBjcmVkaXRzICovCisjaWZuZGVmIFBDTUNJQQorc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPQorICAgICJcbmlibXRyLmM6IHYxLjMuNTcgICA4LyA3Lzk0IFBldGVyIERlIFNjaHJpanZlciBhbmQgTWFyayBTd2Fuc29uXG4iCisgICAgIiAgICAgICAgIHYyLjEuMTI1IDEwLzIwLzk4IFBhdWwgTm9ydG9uICAgIDxwbm9ydG9uQGllZWUub3JnPlxuIgorICAgICIgICAgICAgICB2Mi4yLjAgICAxMi8zMC85OCBKb2VsIFNsb2FuICAgICA8ampzQGMtbWUuY29tPlxuIgorICAgICIgICAgICAgICB2Mi4yLjEgICAwMi8wOC8wMCBNaWtlIFN1bGxpdmFuICA8c3VsbGl2YW1AdXMuaWJtLmNvbT5cbiIgCisgICAgIiAgICAgICAgIHYyLjIuMiAgIDA3LzI3LzAwIEJ1cnQgU2lsdmVybWFuIDxidXJ0c0B1cy5pYm0uY29tPlxuIiAKKyAgICAiICAgICAgICAgdjIuNC4wICAgMDMvMDEvMDEgTWlrZSBTdWxsaXZhbiA8c3VsbGl2YW5AdXMuaWJtLmNvbT5cbiI7CisjZW5kaWYKKworLyogdGhpcyBhbGxvd3MgZGlzcGxheWluZyBmdWxsIGFkYXB0ZXIgaW5mb3JtYXRpb24gKi8KKworY2hhciAqY2hhbm5lbF9kZWZbXSBfX2RldmluaXRkYXRhID0geyAiSVNBIiwgIk1DQSIsICJJU0EgUCZQIiB9OworCitzdGF0aWMgY2hhciBwY2NoYW5uZWxpZFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJMHgwNSwgMHgwMCwgMHgwNCwgMHgwOSwKKwkweDA0LCAweDAzLCAweDA0LCAweDBmLAorCTB4MDMsIDB4MDYsIDB4MDMsIDB4MDEsCisJMHgwMywgMHgwMSwgMHgwMywgMHgwMCwKKwkweDAzLCAweDA5LCAweDAzLCAweDA5LAorCTB4MDMsIDB4MDAsIDB4MDIsIDB4MDAKK307CisKK3N0YXRpYyBjaGFyIG1jY2hhbm5lbGlkW10gX19kZXZpbml0ZGF0YSA9ICB7CisJMHgwNCwgMHgwZCwgMHgwNCwgMHgwMSwKKwkweDA1LCAweDAyLCAweDA1LCAweDAzLAorCTB4MDMsIDB4MDYsIDB4MDMsIDB4MDMsCisJMHgwNSwgMHgwOCwgMHgwMywgMHgwNCwKKwkweDAzLCAweDA1LCAweDAzLCAweDAxLAorCTB4MDMsIDB4MDgsIDB4MDIsIDB4MDAKK307CisKK2NoYXIgX19kZXZpbml0ICphZGFwdGVyX2RlZihjaGFyIHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSAweEY6IHJldHVybiAiUEMgQWRhcHRlciB8IFBDIEFkYXB0ZXIgSUkgfCBBZGFwdGVyL0EiOworCWNhc2UgMHhFOiByZXR1cm4gIjE2LzQgQWRhcHRlciB8IDE2LzQgQWRhcHRlci9BIChsb25nKSI7CisJY2FzZSAweEQ6IHJldHVybiAiMTYvNCBBZGFwdGVyL0EgKHNob3J0KSB8IDE2LzQgSVNBLTE2IEFkYXB0ZXIiOworCWNhc2UgMHhDOiByZXR1cm4gIkF1dG8gMTYvNCBBZGFwdGVyIjsKKwlkZWZhdWx0OiByZXR1cm4gImFkYXB0ZXIgKHVua25vd24gdHlwZSkiOworCX07Cit9OworCisjZGVmaW5lIFRSQ19JTklUIDB4MDEJCS8qICBUcmFjZSBpbml0aWFsaXphdGlvbiAmIFBST0JFcyAqLworI2RlZmluZSBUUkNfSU5JVFYgMHgwMgkJLyogIHZlcmJvc2UgaW5pdCB0cmFjZSBwb2ludHMgICAgICovCit1bnNpZ25lZCBjaGFyIGlibXRyX2RlYnVnX3RyYWNlID0gMDsKKworc3RhdGljIGludCAJaWJtdHJfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CWlibXRyX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGdldF9zcmFtX3NpemUoc3RydWN0IHRva19pbmZvICphZGFwdF9pbmZvKTsKK3N0YXRpYyBpbnQgCXRyZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IAl0b2tfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgCXRva19pbml0X2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIAkJdG9rX29wZW5fYWRhcHRlcih1bnNpZ25lZCBsb25nIGRldl9hZGRyKTsKK3N0YXRpYyB2b2lkIAlvcGVuX3NhcCh1bnNpZ25lZCBjaGFyIHR5cGUsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgCXRva19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IAl0b2tfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IAl0b2tfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpcnFyZXR1cm5fdCB0b2tfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgCWluaXRpYWxfdG9rX2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIAl0cl90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIAl0cl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgCQlpYm10cl9yZXNldF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCp0bXIsc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAl0b2tfcmVydW4odW5zaWduZWQgbG9uZyBkZXZfYWRkcik7Cit2b2lkIAkJaWJtdHJfcmVhZGxvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgCW5ldF9kZXZpY2Vfc3RhdHMgKnRva19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgCQlpYm10cl9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtdHUpOworc3RhdGljIHZvaWQJZmluZF90dXJib19hZGFwdGVycyhpbnQgKmlvbGlzdCk7CisKK3N0YXRpYyBpbnQgaWJtdHJfcG9ydGxpc3RbSUJNVFJfTUFYX0FEQVBURVJTKzFdIF9fZGV2aW5pdGRhdGEgPSB7CisJMHhhMjAsIDB4YTI0LCAwLCAwLCAwCit9Oworc3RhdGljIGludCBfX2RldmluaXRkYXRhIHR1cmJvX2lvW0lCTVRSX01BWF9BREFQVEVSU10gPSB7MH07CitzdGF0aWMgaW50IF9fZGV2aW5pdGRhdGEgdHVyYm9faXJxW0lCTVRSX01BWF9BREFQVEVSU10gPSB7MH07CitzdGF0aWMgaW50IF9fZGV2aW5pdGRhdGEgdHVyYm9fc2VhcmNoZWQgPSAwOworCisjaWZuZGVmIFBDTUNJQQorc3RhdGljIF9fdTMyIGlibXRyX21lbV9iYXNlIF9faW5pdGRhdGEgPSAweGQwMDAwOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBQcnRDaGFuSUQoY2hhciAqcGNpZCwgc2hvcnQgc3RyaWRlKQoreworCXNob3J0IGksIGo7CisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCAyNDsgaSsrLCBqICs9IHN0cmlkZSkKKwkJcHJpbnRrKCIlMXgiLCAoKGludCkgcGNpZFtqXSkgJiAweDBmKTsKKwlwcmludGsoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBIV1BydENoYW5JRCh2b2lkIF9faW9tZW0gKnBjaWQsIHNob3J0IHN0cmlkZSkKK3sKKwlzaG9ydCBpLCBqOworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgMjQ7IGkrKywgaiArPSBzdHJpZGUpCisJCXByaW50aygiJTF4IiwgKChpbnQpIHJlYWRiKHBjaWQgKyBqKSkgJiAweDBmKTsKKwlwcmludGsoIlxuIik7Cit9CisKKy8qIFdlIGhhdmUgdG8gaW9yZW1hcCBldmVyeSBjaGVja2VkIGFkZHJlc3MsIGJlY2F1c2UgaXNhX3JlYWRiIGlzIAorICogZ29pbmcgYXdheS4gCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGZpbmRfdHVyYm9fYWRhcHRlcnMoaW50ICppb2xpc3QpCit7CisJaW50IHJhbV9hZGRyOworCWludCBpbmRleD0wOworCXZvaWQgX19pb21lbSAqY2hhbmlkOworCWludCBmb3VuZF90dXJibz0wOworCXVuc2lnbmVkIGNoYXIgKnRjaGFuaWQsIGN0ZW1wOworCWludCBpLCBqOworCXVuc2lnbmVkIGxvbmcgamlmOworCXZvaWQgX19pb21lbSAqcmFtX21hcHBlZCA7ICAgCisKKwlpZiAodHVyYm9fc2VhcmNoZWQgPT0gMSkgcmV0dXJuOworCXR1cmJvX3NlYXJjaGVkPTE7CisJZm9yIChyYW1fYWRkcj0weEMwMDAwOyByYW1fYWRkciA8IDB4RTAwMDA7IHJhbV9hZGRyKz0weDIwMDApIHsKKworCQlfX3UzMiBpbnRmX3RibD0wOworCisJCWZvdW5kX3R1cmJvPTE7CisJCXJhbV9tYXBwZWQgPSBpb3JlbWFwKCh1MzIpcmFtX2FkZHIsMHgxZmZmKSA7IAorCQlpZiAocmFtX21hcHBlZD09TlVMTCkgCisgCQkJY29udGludWUgOyAKKwkJY2hhbmlkPShDSEFOTkVMX0lEICsgcmFtX21hcHBlZCk7CisJCXRjaGFuaWQ9cGNjaGFubmVsaWQ7CisJCWN0ZW1wPXJlYWRiKGNoYW5pZCkgJiAweDBmOworCQlpZiAoY3RlbXAgIT0gKnRjaGFuaWQpIGNvbnRpbnVlOworCQlmb3IgKGk9MixqPTE7IGk8PTQ2OyBpPWkrMixqKyspIHsKKwkJCWlmICgocmVhZGIoY2hhbmlkK2kpICYgMHgwZikgIT0gdGNoYW5pZFtqXSl7CisJCQkJZm91bmRfdHVyYm89MDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIWZvdW5kX3R1cmJvKSBjb250aW51ZTsKKworCQl3cml0ZWIoMHg5MCwgcmFtX21hcHBlZCsweDFFMDEpOworCQlmb3IoaT0yOyBpPDB4MGY7IGkrKykgeworCQkJd3JpdGViKDB4MDAsIHJhbV9tYXBwZWQrMHgxRTAxK2kpOworCQl9CisJCXdyaXRlYigweDAwLCByYW1fbWFwcGVkKzB4MUUwMSk7CisJCWZvcihqaWY9amlmZmllcytUUl9CVVNZX0lOVEVSVkFMOyB0aW1lX2JlZm9yZV9lcShqaWZmaWVzLGppZik7KTsKKwkJaW50Zl90Ymw9bnRvaHMocmVhZHcocmFtX21hcHBlZCtBQ0FfT0ZGU0VUK0FDQV9SVytXUkJSX0VWRU4pKTsKKwkJaWYgKGludGZfdGJsKSB7CisjaWYgSUJNVFJfREVCVUdfTUVTU0FHRVMKKwkJCXByaW50aygiaWJtdHI6OmZpbmRfdHVyYm9fYWRhcHRlcnMsIFR1cmJvIGZvdW5kIGF0ICIKKwkJCQkicmFtX2FkZHIgJXhcbiIscmFtX2FkZHIpOworCQkJcHJpbnRrKCJpYm10cjo6ZmluZF90dXJib19hZGFwdGVycywgaW50ZXJmYWNlX3RhYmxlICIpOworCQkJZm9yKGk9MDsgaTw2OyBpKyspIHsKKwkJCQlwcmludGsoIiV4OiIscmVhZGIocmFtX2FkZHIraW50Zl90YmwraSkpOworCQkJfQorCQkJcHJpbnRrKCJcbiIpOworI2VuZGlmCisJCQl0dXJib19pb1tpbmRleF09bnRvaHMocmVhZHcocmFtX21hcHBlZCtpbnRmX3RibCs0KSk7CisJCQl0dXJib19pcnFbaW5kZXhdPXJlYWRiKHJhbV9tYXBwZWQraW50Zl90YmwrMyk7CisJCQlvdXRiKDAsIHR1cmJvX2lvW2luZGV4XSArIEFEQVBUUkVTRVQpOworCQkJZm9yKGppZj1qaWZmaWVzK1RSX1JTVF9USU1FO3RpbWVfYmVmb3JlX2VxKGppZmZpZXMsamlmKTspOworCQkJb3V0YigwLCB0dXJib19pb1tpbmRleF0gKyBBREFQVFJFU0VUUkVMKTsKKwkJCWluZGV4Kys7CisJCQljb250aW51ZTsKKwkJfQorI2lmIElCTVRSX0RFQlVHX01FU1NBR0VTIAorCQlwcmludGsoImlibXRyOjpmaW5kX3R1cmJvX2FkYXB0ZXJzLCBpYm10ciBjYXJkIGZvdW5kIGF0IgorCQkJIiAleCBidXQgbm90IGEgVHVyYm8gbW9kZWxcbiIscmFtX2FkZHIpOworI2VuZGlmCisJaW91bm1hcChyYW1fbWFwcGVkKSA7IAkKKwl9IC8qIGZvciAqLworCWZvcihpPTA7IGk8SUJNVFJfTUFYX0FEQVBURVJTOyBpKyspIHsKKwkJaWYoIXR1cmJvX2lvW2ldKSBicmVhazsKKwkJZm9yIChqPTA7IGo8SUJNVFJfTUFYX0FEQVBURVJTOyBqKyspIHsKKwkJCWlmICggaW9saXN0W2pdICYmIGlvbGlzdFtqXSAhPSB0dXJib19pb1tpXSkgY29udGludWU7CisJCQlpb2xpc3Rbal09dHVyYm9faW9baV07CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaWJtdHJfY2xlYW51cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+YmFzZV9hZGRyKSB7CisJCW91dGIoMCxkZXYtPmJhc2VfYWRkcitBREFQVFJFU0VUKTsKKwkJCisJCXNjaGVkdWxlX3RpbWVvdXQoVFJfUlNUX1RJTUUpOyAvKiB3YWl0IDUwbXMgKi8KKworCQlvdXRiKDAsZGV2LT5iYXNlX2FkZHIrQURBUFRSRVNFVFJFTCk7CisJfQorCisjaWZuZGVmIFBDTUNJQQorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBJQk1UUl9JT19FWFRFTlQpOworCisJeyAKKwkJc3RydWN0IHRva19pbmZvICp0aSA9IChzdHJ1Y3QgdG9rX2luZm8gKikgZGV2LT5wcml2OworCQlpb3VubWFwKHRpLT5tbWlvKTsKKwkJaW91bm1hcCh0aS0+c3JhbV92aXJ0KTsKKwl9CisjZW5kaWYJCQorfQorCitpbnQgaWJtdHJfcHJvYmVfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBlcnIgPSBpYm10cl9wcm9iZShkZXYpOworCWlmICghZXJyKSB7CisJCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCQlpZiAoZXJyKQorCQkJaWJtdHJfY2xlYW51cF9jYXJkKGRldik7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglpYm10cl9wcm9iZSgpOiAgUm91dGluZSBzcGVjaWZpZWQgaW4gdGhlIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQorICoJdG8gcHJvYmUgZm9yIGFuIElCTSBUb2tlbiBSaW5nIEFkYXB0ZXIuICBSb3V0aW5lIG91dGxpbmU6CisgKglJLiAgICBJbnRlcnJvZ2F0ZSBoYXJkd2FyZSB0byBkZXRlcm1pbmUgaWYgYW4gYWRhcHRlciBleGlzdHMKKyAqCSAgICAgIGFuZCB3aGF0IHRoZSBzcGVlZHMgYW5kIGZlZWRzIGFyZQorICoJSUkuICAgU2V0dXAgZGF0YSBzdHJ1Y3R1cmVzIHRvIGNvbnRyb2wgZXhlY3V0aW9uIGJhc2VkIHVwb24KKyAqCSAgICAgIGFkYXB0ZXIgY2hhcmFjdGVyaXN0aWNzLgorICoKKyAqCVdlIGV4cGVjdCBpYm10cl9wcm9iZSB0byBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBkZXZpY2UgZW50cnkKKyAqCXdoaWNoIHJlZmVyZW5jZXMgaXQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBpYm10cl9wcm9iZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCWludCBiYXNlX2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWlmIChiYXNlX2FkZHIgJiYgYmFzZV9hZGRyIDw9IDB4MWZmKSAvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCXJldHVybiAtRU5YSU87CisJaWYgKGJhc2VfYWRkciA+IDB4MWZmKSB7IC8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gICovCisJCWlmICghaWJtdHJfcHJvYmUxKGRldiwgYmFzZV9hZGRyKSkgcmV0dXJuIDA7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlmaW5kX3R1cmJvX2FkYXB0ZXJzKGlibXRyX3BvcnRsaXN0KTsKKwlmb3IgKGkgPSAwOyBpYm10cl9wb3J0bGlzdFtpXTsgaSsrKSB7CisJCWludCBpb2FkZHIgPSBpYm10cl9wb3J0bGlzdFtpXTsKKworCQlpZiAoIWlibXRyX3Byb2JlMShkZXYsIGlvYWRkcikpIHJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpYm10cl9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IFBJT2FkZHIpCit7CisKKwl1bnNpZ25lZCBjaGFyIHNlZ21lbnQsIGludHI9MCwgaXJxPTAsIGksIGosIGNhcmRwcmVzZW50PU5PVE9LLCB0ZW1wPTA7CisJdm9pZCBfX2lvbWVtICogdF9tbWlvID0gTlVMTDsKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpID0gZGV2LT5wcml2OworCXZvaWQgX19pb21lbSAqY2RfY2hhbmlkOworCXVuc2lnbmVkIGNoYXIgKnRjaGFuaWQsIGN0ZW1wOworI2lmbmRlZiBQQ01DSUEKKwl1bnNpZ25lZCBjaGFyIHRfaXJxPTA7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlzdGF0aWMgaW50IHZlcnNpb25fcHJpbnRlZDsKKyNlbmRpZgorCisJLyogICAgUXVlcnkgdGhlIGFkYXB0ZXIgUElPIGJhc2UgcG9ydCB3aGljaCB3aWxsIHJldHVybgorCSAqICAgIGluZGljYXRpb24gb2Ygd2hlcmUgTU1JTyB3YXMgcGxhY2VkLiBXZSBhbHNvIGhhdmUgYQorCSAqICAgIGNvZGVkIGludGVycnVwdCBudW1iZXIuCisJICovCisJc2VnbWVudCA9IGluYihQSU9hZGRyKTsKKwlpZiAoc2VnbWVudCA8IDB4NDAgfHwgc2VnbWVudCA+IDB4ZTApIHsKKwkJLyogT3V0IG9mIHJhbmdlIHZhbHVlcyBzbyB3ZSdsbCBhc3N1bWUgbm9uLWV4aXN0ZW50IElPIGRldmljZQorCQkgKiBidXQgdGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgYSBwcm9ibGVtLCBlc3AgaWYgYSB0dXJibworCQkgKiBhZGFwdGVyIGlzIGJlaW5nIHVzZWQuICAqLworI2lmIElCTVRSX0RFQlVHX01FU1NBR0VTCisJCURQUklOVEsoImlibXRyX3Byb2JlMSgpOiB1bmhhcHB5IHRoYXQgaW5iKDB4JVgpID09IDB4JVgsICIKKwkJCSJIYXJkd2FyZSBQcm9ibGVtP1xuIixQSU9hZGRyLHNlZ21lbnQpOworI2VuZGlmCisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKgorCSAqICAgIENvbXB1dGUgdGhlIGxpbmVhciBiYXNlIGFkZHJlc3Mgb2YgdGhlIE1NSU8gYXJlYQorCSAqICAgIGFzIExJTlVYIGRvZXNuJ3QgY2FyZSBhYm91dCBzZWdtZW50cworCSAqLworCXRfbW1pbyA9IGlvcmVtYXAoKChfX3UzMikgKHNlZ21lbnQgJiAweGZjKSA8PCAxMSkgKyAweDgwMDAwLDIwNDgpOworCWlmICghdF9tbWlvKSB7IAorCQlEUFJJTlRLKCJDYW5ub3QgcmVtYXAgbW1pb2Jhc2UgbWVtb3J5IGFyZWEiKSA7IAorCQlyZXR1cm4gLUVOT0RFViA7IAorCX0gCisJaW50ciA9IHNlZ21lbnQgJiAweDAzOwkvKiBsb3cgYml0cyBpcyBjb2RlZCBpbnRlcnJ1cHQgIyAqLworCWlmIChpYm10cl9kZWJ1Z190cmFjZSAmIFRSQ19JTklUKQorCQlEUFJJTlRLKCJQSU9hZGRyOiAlNGh4IHNlZy9pbnRyOiAlMnggbW1pbyBiYXNlOiAlcCBpbnRyOiAlZFxuIgorCQkJCSwgUElPYWRkciwgKGludCkgc2VnbWVudCwgdF9tbWlvLCAoaW50KSBpbnRyKTsKKworCS8qCisJICogICAgTm93IHdlIHdpbGwgY29tcGFyZSBleHBlY3RlZCAnY2hhbm5lbGlkJyBzdHJpbmdzIHdpdGgKKwkgKiAgICB3aGF0IHdlIGlzIHRoZXJlIHRvIGxlYXJuIG9mIElTQS9NQ0Egb3Igbm90IFRSIGNhcmQKKwkgKi8KKyNpZmRlZiBQQ01DSUEKKwlpb3VubWFwKHRfbW1pbyk7CisJdF9tbWlvID0gdGktPm1taW87CS8qQk1TIHRvIGdldCB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlpcnEgPSB0aS0+aXJxOwkJLypCTVMgdG8gZGlzcGxheSB0aGUgaXJxISAgICovCisjZW5kaWYKKwljZF9jaGFuaWQgPSAoQ0hBTk5FTF9JRCArIHRfbW1pbyk7CS8qIGZvciBlZmZpY2llbmN5ICovCisJdGNoYW5pZCA9IHBjY2hhbm5lbGlkOworCWNhcmRwcmVzZW50ID0gVFJfSVNBOwkvKiB0cnkgSVNBICovCisKKwkvKiAgICBTdWJvcHRpbWl6ZSBrbm93aW5nIGZpcnN0IGJ5dGUgZGlmZmVyZW50ICovCisJY3RlbXAgPSByZWFkYihjZF9jaGFuaWQpICYgMHgwZjsKKwlpZiAoY3RlbXAgIT0gKnRjaGFuaWQpIHsJLyogTk9UIElTQSBjYXJkLCB0cnkgTUNBICovCisJCXRjaGFuaWQgPSBtY2NoYW5uZWxpZDsKKwkJY2FyZHByZXNlbnQgPSBUUl9NQ0E7CisJCWlmIChjdGVtcCAhPSAqdGNoYW5pZCkJLyogTmVpdGhlciBJU0Egbm9yIE1DQSAqLworCQkJY2FyZHByZXNlbnQgPSBOT1RPSzsKKwl9CisJaWYgKGNhcmRwcmVzZW50ICE9IE5PVE9LKSB7CisJCS8qICAgICAgIEtub3cgcHJlc3VtZWQgdHlwZSwgdHJ5IHJlc3Qgb2YgSUQgKi8KKwkJZm9yIChpID0gMiwgaiA9IDE7IGkgPD0gNDY7IGkgPSBpICsgMiwgaisrKSB7CisJCQlpZiggKHJlYWRiKGNkX2NoYW5pZCtpKSYweDBmKSA9PSB0Y2hhbmlkW2pdKSBjb250aW51ZTsKKwkJCS8qIG1hdGNoIGZhaWxlZCwgbm90IFRSIGNhcmQgKi8KKwkJCWNhcmRwcmVzZW50ID0gTk9UT0s7CisJCQlicmVhazsKKwkJfQorCX0KKwkvKiAKKwkgKiAgICBJZiB3ZSBoYXZlIGFuIElTQSBib2FyZCBjaGVjayBmb3IgdGhlIElTQSBQJlAgdmVyc2lvbiwKKwkgKiAgICBhcyBpdCBoYXMgZGlmZmVyZW50IElSUSBzZXR0aW5ncyAKKwkgKi8KKwlpZiAoY2FyZHByZXNlbnQgPT0gVFJfSVNBICYmIChyZWFkYihBSVBGSUQgKyB0X21taW8pID09IDB4MGUpKQorCQljYXJkcHJlc2VudCA9IFRSX0lTQVBOUDsKKwlpZiAoY2FyZHByZXNlbnQgPT0gTk9UT0spIHsJLyogImNoYW5uZWxfaWQiIGRpZCBub3QgbWF0Y2gsIHJlcG9ydCAqLworCQlpZiAoIShpYm10cl9kZWJ1Z190cmFjZSAmIFRSQ19JTklUKSkgeworI2lmbmRlZiBQQ01DSUEKKwkJCWlvdW5tYXAodF9tbWlvKTsKKyNlbmRpZgorCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJRFBSSU5USyggIkNoYW5uZWwgSUQgc3RyaW5nIG5vdCBmb3VuZCBmb3IgUElPYWRkcjogJTRoeFxuIiwKKwkJCQkJCQkJUElPYWRkcik7CisJCURQUklOVEsoIkV4cGVjdGVkIGZvciBJU0E6ICIpOworCQlQcnRDaGFuSUQocGNjaGFubmVsaWQsIDEpOworCQlEUFJJTlRLKCIgICAgICAgICAgIGZvdW5kOiAiKTsKKy8qIEJNUyBOb3RlIHRoYXQgdGhpcyBjYW4gYmUgbWlzbGVhZGluZywgd2hlbiBoYXJkd2FyZSBpcyBmbGFreSwgYmVjYXVzZSB5b3UKKyAgIGFyZSByZWFkaW5nIGl0IGEgc2Vjb25kIHRpbWUgaGVyZS4gU28gd2l0aCBteSBmbGFreSBoYXJkd2FyZSwgSSdsbCBzZWUgbXktCisgICBzZWxmIGluIHRoaXMgYmxvY2ssIHdpdGggdGhlIEhXIElEIG1hdGNoaW5nIHRoZSBJU0EgSUQgZXhhY3RseSEgKi8KKwkJSFdQcnRDaGFuSUQoY2RfY2hhbmlkLCAyKTsKKwkJRFBSSU5USygiRXhwZWN0ZWQgZm9yIE1DQTogIik7CisJCVBydENoYW5JRChtY2NoYW5uZWxpZCwgMSk7CisJfQorCS8qIE5vdywgc2V0dXAgc29tZSBvZiB0aGUgcGwwIGJ1ZmZlcnMgZm9yIHRoaXMgZHJpdmVyLi4gKi8KKwkvKiBJZiBjYWxsZWQgZnJvbSBQQ01DSUEsIGl0IGlzIGFscmVhZHkgc2V0IHVwLCBzbyBubyBuZWVkIHRvIAorCSAgIHdhc3RlIHRoZSBtZW1vcnksIGp1c3QgdXNlIHRoZSBleGlzdGluZyBzdHJ1Y3R1cmUgKi8KKyNpZm5kZWYgUENNQ0lBCisJdGktPm1taW8gPSB0X21taW87CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBJQk1UUl9NQVhfQURBUFRFUlM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICh0dXJib19pb1tpXSAhPSBQSU9hZGRyKQorCQkJY29udGludWU7CisjaWYgSUJNVFJfREVCVUdfTUVTU0FHRVMgCisJCXByaW50aygiaWJtdHI6OnRyX3Byb2JlMSwgc2V0dGluZyBQSU9hZGRyICV4IHRvIFR1cmJvXG4iLAorCQkgICAgICAgUElPYWRkcik7CisjZW5kaWYKKwkJdGktPnR1cmJvID0gMTsKKwkJdF9pcnEgPSB0dXJib19pcnFbaV07CisgICAgICAgIH0KKyNlbmRpZiAvKiAhUENNQ0lBICovCisJdGktPnJlYWRsb2dfcGVuZGluZyA9IDA7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdGktPndhaXRfZm9yX3Jlc2V0KTsKKworCS8qIGlmIFBDTUNJQSwgdGhlIGNhcmQgY2FuIGJlIHJlY29nbml6ZWQgYXMgZWl0aGVyIFRSX0lTQSBvciBUUl9JU0FQTlAKKwkgKiBkZXBlbmRpbmcgd2hpY2ggY2FyZCBpcyBpbnNlcnRlZC4JKi8KKwkKKyNpZm5kZWYgUENNQ0lBCisJc3dpdGNoIChjYXJkcHJlc2VudCkgeworCWNhc2UgVFJfSVNBOgorCQlpZiAoaW50ciA9PSAwKSBpcnEgPSA5OwkvKiBpcnEyIHJlYWxseSBpcyBpcnE5ICovCisJCWlmIChpbnRyID09IDEpIGlycSA9IDM7CisJCWlmIChpbnRyID09IDIpIGlycSA9IDY7CisJCWlmIChpbnRyID09IDMpIGlycSA9IDc7CisJCXRpLT5hZGFwdGVyX2ludF9lbmFibGUgPSBQSU9hZGRyICsgQURBUFRJTlRSRUw7CisJCWJyZWFrOworCWNhc2UgVFJfTUNBOgorCQlpZiAoaW50ciA9PSAwKSBpcnEgPSA5OworCQlpZiAoaW50ciA9PSAxKSBpcnEgPSAzOworCQlpZiAoaW50ciA9PSAyKSBpcnEgPSAxMDsKKwkJaWYgKGludHIgPT0gMykgaXJxID0gMTE7CisJCXRpLT5nbG9iYWxfaW50X2VuYWJsZSA9IDA7CisJCXRpLT5hZGFwdGVyX2ludF9lbmFibGUgPSAwOworCQl0aS0+c3JhbV9waHlzPShfX3UzMikoaW5iKFBJT2FkZHIrQURBUFRSRVNFVFJFTCkgJiAweGZlKSA8PCAxMjsKKwkJYnJlYWs7CisJY2FzZSBUUl9JU0FQTlA6CisJCWlmICghdF9pcnEpIHsKKwkJCWlmIChpbnRyID09IDApIGlycSA9IDk7CisJCQlpZiAoaW50ciA9PSAxKSBpcnEgPSAzOworCQkJaWYgKGludHIgPT0gMikgaXJxID0gMTA7CisJCQlpZiAoaW50ciA9PSAzKSBpcnEgPSAxMTsKKwkJfSBlbHNlCisJCQlpcnE9dF9pcnE7CisJCXRpbWVvdXQgPSBqaWZmaWVzICsgVFJfU1BJTl9JTlRFUlZBTDsKKwkJd2hpbGUgKCFyZWFkYih0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfUlcgKyBSUlJfRVZFTikpeworCQkJaWYgKCF0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSBjb250aW51ZTsKKwkJCURQUklOVEsoICJIYXJkd2FyZSB0aW1lb3V0IGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiIpOworCQkJaW91bm1hcCh0X21taW8pOworCQkJa2ZyZWUodGkpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJdGktPnNyYW1fcGh5cyA9CisJCSAgICAgKChfX3UzMilyZWFkYih0aS0+bW1pbytBQ0FfT0ZGU0VUK0FDQV9SVytSUlJfRVZFTik8PDEyKTsKKwkJdGktPmFkYXB0ZXJfaW50X2VuYWJsZSA9IFBJT2FkZHIgKyBBREFQVElOVFJFTDsKKwkJYnJlYWs7CisJfSAvKmVuZCBzd2l0Y2ggKGNhcmRwcmVzZW50KSAqLworI2VuZGlmCS8qbm90IFBDTUNJQSAqLworCisJaWYgKGlibXRyX2RlYnVnX3RyYWNlICYgVFJDX0lOSVQpIHsJLyoganVzdCByZXBvcnQgaW50ICovCisJCURQUklOVEsoImlycT0lZCIsIGlycSk7CisJCXByaW50aygiLCBzcmFtX3BoeXM9MHgleCIsIHRpLT5zcmFtX3BoeXMpOworCQlpZihpYm10cl9kZWJ1Z190cmFjZSZUUkNfSU5JVFYpeyAvKiBmdWxsIGNoYXQgaW4gdmVyYm9zZSBvbmx5ICovCisJCQlEUFJJTlRLKCIsIHRpLT5tbWlvPSVwIiwgdGktPm1taW8pOworCQkJcHJpbnRrKCIsIHNlZ21lbnQ9JTAyWCIsIHNlZ21lbnQpOworCQl9CisJCXByaW50aygiLlxuIik7CisJfQorCisJLyogR2V0IGh3IGFkZHJlc3Mgb2YgdG9rZW4gcmluZyBjYXJkICovCisJaiA9IDA7CisJZm9yIChpID0gMDsgaSA8IDB4MTg7IGkgPSBpICsgMikgeworCQkvKiB0ZWNobmljYWwgcmVmZXJlbmNlIHN0YXRlcyB0byBkbyB0aGlzICovCisJCXRlbXAgPSByZWFkYih0aS0+bW1pbyArIEFJUCArIGkpICYgMHgwZjsKKwkJdGktPmh3X2FkZHJlc3Nbal0gPSB0ZW1wOworCQlpZiAoaiAmIDEpCisJCQlkZXYtPmRldl9hZGRyWyhqIC8gMildID0KKwkJCQl0aS0+aHdfYWRkcmVzc1tqXSsgKHRpLT5od19hZGRyZXNzW2ogLSAxXSA8PCA0KTsKKwkJKytqOworCX0KKwkvKiBnZXQgQWRhcHRlciB0eXBlOiAgJ0YnID0gQWRhcHRlci9BLCAnRScgPSAxNi80IEFkYXB0ZXIgSUksLi4uICovCisJdGktPmFkYXB0ZXJfdHlwZSA9IHJlYWRiKHRpLT5tbWlvICsgQUlQQURBUFRZUEUpOworCisJLyogZ2V0IERhdGEgUmF0ZTogIEY9NE1iLCBFPTE2TWIsIEQ9NE1iICYgMTZNYiA/PyAqLworCXRpLT5kYXRhX3JhdGUgPSByZWFkYih0aS0+bW1pbyArIEFJUERBVEFSQVRFKTsKKworCS8qIEdldCBFYXJseSBUb2tlbiBSZWxlYXNlIHN1cHBvcnQ/OiBGPW5vLCBFPTRNYiwgRD0xNk1iLCBDPTQmMTZNYiAqLworCXRpLT50b2tlbl9yZWxlYXNlID0gcmVhZGIodGktPm1taW8gKyBBSVBFQVJMWVRPS0VOKTsKKworCS8qIEhvdyBtdWNoIHNoYXJlZCBSQU0gaXMgb24gYWRhcHRlciA/ICovCisJaWYgKHRpLT50dXJibykgeworCQl0aS0+YXZhaWxfc2hhcmVkX3JhbT0xMjc7CisJfSBlbHNlIHsKKwkJdGktPmF2YWlsX3NoYXJlZF9yYW0gPSBnZXRfc3JhbV9zaXplKHRpKTsvKmluIDUxMiBieXRlIHVuaXRzICovCisJfQorCS8qIFdlIG5lZWQgdG8gc2V0IG9yIGRvIGEgYnVuY2ggb2Ygd29yayBoZXJlIGJhc2VkIG9uIHByZXZpb3VzIHJlc3VsdHMqLworCS8qIFN1cHBvcnQgcGFnaW5nPyAgV2hhdCBzaXplcz86ICBGPW5vLCBFPTE2aywgRD0zMmssIEM9MTYgJiAzMmsgKi8KKwl0aS0+c2hhcmVkX3JhbV9wYWdpbmcgPSByZWFkYih0aS0+bW1pbyArIEFJUFNIUkFNUEFHRSk7CisKKwkvKiBBdmFpbGFibGUgREhCICA0TWIgc2l6ZTogICBGPTIwNDgsIEU9NDA5NiwgRD00NDY0ICovCisJc3dpdGNoIChyZWFkYih0aS0+bW1pbyArIEFJUDRNQkRIQikpIHsKKwljYXNlIDB4ZTogdGktPmRoYl9zaXplNG1iID0gNDA5NjsgYnJlYWs7CisJY2FzZSAweGQ6IHRpLT5kaGJfc2l6ZTRtYiA9IDQ0NjQ7IGJyZWFrOworCWRlZmF1bHQ6ICB0aS0+ZGhiX3NpemU0bWIgPSAyMDQ4OyBicmVhazsKKwl9CisKKwkvKiBBdmFpbGFibGUgREhCIDE2TWIgc2l6ZTogIEY9MjA0OCwgRT00MDk2LCBEPTgxOTIsIEM9MTYzODQsIEI9MTc5NjAgKi8KKwlzd2l0Y2ggKHJlYWRiKHRpLT5tbWlvICsgQUlQMTZNQkRIQikpIHsKKwljYXNlIDB4ZTogdGktPmRoYl9zaXplMTZtYiA9IDQwOTY7IGJyZWFrOworCWNhc2UgMHhkOiB0aS0+ZGhiX3NpemUxNm1iID0gODE5MjsgYnJlYWs7CisJY2FzZSAweGM6IHRpLT5kaGJfc2l6ZTE2bWIgPSAxNjM4NDsgYnJlYWs7CisJY2FzZSAweGI6IHRpLT5kaGJfc2l6ZTE2bWIgPSAxNzk2MDsgYnJlYWs7CisJZGVmYXVsdDogIHRpLT5kaGJfc2l6ZTE2bWIgPSAyMDQ4OyBicmVhazsKKwl9CisKKwkvKiAgICBXZSBtdXN0IGZpZ3VyZSBvdXQgaG93IG11Y2ggc2hhcmVkIG1lbW9yeSBzcGFjZSB0aGlzIGFkYXB0ZXIKKwkgKiAgICB3aWxsIG9jY3VweSBzbyB0aGF0IGlmIHRoZXJlIGFyZSB0d28gYWRhcHRlcnMgd2UgY2FuIGZpdCBib3RoCisJICogICAgaW4uICBHaXZlbiBhIGNob2ljZSwgd2Ugd2lsbCBsaW1pdCB0aGlzIGFkYXB0ZXIgdG8gMzJLLiAgVGhlCisJICogICAgbWF4aW11bSBzcGFjZSB3aWxsIHdpbGwgdXNlIGZvciB0d28gYWRhcHRlcnMgaXMgNjRLIHNvIGlmIHRoZQorCSAqICAgIGFkYXB0ZXIgd2UgYXJlIHdvcmtpbmcgb24gZGVtYW5kcyA2NEsgKGl0IGFsc28gZG9lc24ndCBzdXBwb3J0CisJICogICAgcGFnaW5nKSwgdGhlbiBvbmx5IG9uZSBhZGFwdGVyIGNhbiBiZSBzdXBwb3J0ZWQuICAKKwkgKi8KKworCS8qCisJICogICAgZGV0ZXJtaW5lIGhvdyBtdWNoIG9mIHRvdGFsIFJBTSBpcyBtYXBwZWQgaW50byBQQyBzcGFjZSAKKwkgKi8KKwl0aS0+bWFwcGVkX3JhbV9zaXplPSAvKnNpeHRlZW4gdG8gb25laHVuZHJlZHR3ZW50eWVpZ2h0IDUxMmJ5dGUgYmxvY2tzKi8KKwkgICAgMTw8ICgocmVhZGIodGktPm1taW8rQUNBX09GRlNFVCtBQ0FfUlcrUlJSX09ERCkgPj4gMiAmIDB4MDMpICsgNCk7CisJdGktPnBhZ2VfbWFzayA9IDA7CisJaWYgKHRpLT50dXJibykgIHRpLT5wYWdlX21hc2s9MHhmMDsKKwllbHNlIGlmICh0aS0+c2hhcmVkX3JhbV9wYWdpbmcgPT0gMHhmKTsgIC8qIE5vIHBhZ2luZyBpbiBhZGFwdGVyICovCisJZWxzZSB7CisjaWZkZWYgRU5BQkxFX1BBR0lORworCQl1bnNpZ25lZCBjaGFyIHBnX3NpemUgPSAwOworCQkvKiBCTVM6ICAgcGFnZSBzaXplOiBQQ01DSUEsIHVzZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyOworCQkgICBJU0FQTlAsIHVzZSBMQU5BSURDIGNvbmZpZyB0b29sIGZyb20gd3d3LmlibS5jb20gICovCisJCXN3aXRjaCAodGktPnNoYXJlZF9yYW1fcGFnaW5nKSB7CisJCWNhc2UgMHhmOgorCQkJYnJlYWs7CisJCWNhc2UgMHhlOgorCQkJdGktPnBhZ2VfbWFzayA9ICh0aS0+bWFwcGVkX3JhbV9zaXplID09IDMyKSA/IDB4YzAgOiAwOworCQkJcGdfc2l6ZSA9IDMyOwkvKiAxNktCIHBhZ2Ugc2l6ZSAqLworCQkJYnJlYWs7CisJCWNhc2UgMHhkOgorCQkJdGktPnBhZ2VfbWFzayA9ICh0aS0+bWFwcGVkX3JhbV9zaXplID09IDY0KSA/IDB4ODAgOiAwOworCQkJcGdfc2l6ZSA9IDY0OwkvKiAzMktCIHBhZ2Ugc2l6ZSAqLworCQkJYnJlYWs7CisJCWNhc2UgMHhjOgorCQkJc3dpdGNoICh0aS0+bWFwcGVkX3JhbV9zaXplKSB7CisJCQljYXNlIDMyOgorCQkJCXRpLT5wYWdlX21hc2sgPSAweGMwOworCQkJCXBnX3NpemUgPSAzMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgNjQ6CisJCQkJdGktPnBhZ2VfbWFzayA9IDB4ODA7CisJCQkJcGdfc2l6ZSA9IDY0OworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEUFJJTlRLKCJVbmtub3duIHNoYXJlZCByYW0gcGFnaW5nIGluZm8gJTAxWFxuIiwKKwkJCQkJCQl0aS0+c2hhcmVkX3JhbV9wYWdpbmcpOworCQkJaW91bm1hcCh0X21taW8pOyAKKwkJCWtmcmVlKHRpKTsKKwkJCXJldHVybiAtRU5PREVWOworCQkJYnJlYWs7CisJCX0gLyplbmQgc3dpdGNoIHNoYXJlZF9yYW1fcGFnaW5nICovCisKKwkJaWYgKGlibXRyX2RlYnVnX3RyYWNlICYgVFJDX0lOSVQpCisJCQlEUFJJTlRLKCJTaGFyZWQgUkFNIHBhZ2luZyBjb2RlOiAlMDJYLCAiCisJCQkJIm1hcHBlZCBSQU0gc2l6ZTogJWRLLCBzaGFyZWQgUkFNIHNpemU6ICVkSywgIgorCQkJCSJwYWdlIG1hc2s6ICUwMlhcbjoiLAorCQkJCXRpLT5zaGFyZWRfcmFtX3BhZ2luZywgdGktPm1hcHBlZF9yYW1fc2l6ZSAvIDIsCisJCQkJdGktPmF2YWlsX3NoYXJlZF9yYW0gLyAyLCB0aS0+cGFnZV9tYXNrKTsKKyNlbmRpZgkvKkVOQUJMRV9QQUdJTkcgKi8KKwl9CisKKyNpZm5kZWYgUENNQ0lBCisJLyogZmluaXNoIGZpZ3VyaW5nIHRoZSBzaGFyZWQgUkFNIGFkZHJlc3MgKi8KKwlpZiAoY2FyZHByZXNlbnQgPT0gVFJfSVNBKSB7CisJCXN0YXRpYyBfX3UzMiByYW1fYm5kcnlfbWFza1tdID0KKwkJCXsgMHhmZmZmZTAwMCwgMHhmZmZmYzAwMCwgMHhmZmZmODAwMCwgMHhmZmZmMDAwMCB9OworCQlfX3UzMiBuZXdfYmFzZSwgcnJyXzMyLCBjaGtfYmFzZSwgcmJtOworCisJCXJycl8zMj1yZWFkYih0aS0+bW1pbytBQ0FfT0ZGU0VUK0FDQV9SVytSUlJfT0REKSA+PiAyICYgMHgwMzsKKwkJcmJtID0gcmFtX2JuZHJ5X21hc2tbcnJyXzMyXTsKKwkJbmV3X2Jhc2UgPSAoaWJtdHJfbWVtX2Jhc2UgKyAofnJibSkpICYgcmJtOy8qIHVwIHRvIGJvdW5kYXJ5ICovCisJCWNoa19iYXNlID0gbmV3X2Jhc2UgKyAodGktPm1hcHBlZF9yYW1fc2l6ZSA8PCA5KTsKKwkJaWYgKGNoa19iYXNlID4gKGlibXRyX21lbV9iYXNlICsgSUJNVFJfU0hBUkVEX1JBTV9TSVpFKSkgeworCQkJRFBSSU5USygiU2hhcmVkIFJBTSBmb3IgdGhpcyBhZGFwdGVyICglMDV4KSBleGNlZWRzICIKKwkJCSJkcml2ZXIgbGltaXQgKCUwNXgpLCBhZGFwdGVyIG5vdCBzdGFydGVkLlxuIiwKKwkJCWNoa19iYXNlLCBpYm10cl9tZW1fYmFzZSArIElCTVRSX1NIQVJFRF9SQU1fU0laRSk7CisJCQlpb3VubWFwKHRfbW1pbyk7CisJCQlrZnJlZSh0aSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfSBlbHNlIHsgLyogc2VlbXMgY29vbCwgcmVjb3JkIHdoYXQgd2UgaGF2ZSBmaWd1cmVkIG91dCAqLworCQkJdGktPnNyYW1fYmFzZSA9IG5ld19iYXNlID4+IDEyOworCQkJaWJtdHJfbWVtX2Jhc2UgPSBjaGtfYmFzZTsKKwkJfQorCX0KKwllbHNlICB0aS0+c3JhbV9iYXNlID0gdGktPnNyYW1fcGh5cyA+PiAxMjsKKworCS8qIFRoZSBQQ01DSUEgaGFzIGFscmVhZHkgZ290IHRoZSBpbnRlcnJ1cHQgbGluZSBhbmQgdGhlIGlvIHBvcnQsIAorCSAgIHNvIG5vIGNoYW5jZSBvZiBhbnlib2R5IGVsc2UgZ2V0dGluZyBpdCAtIE1MUCAqLworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSA9IGlycSwgJnRva19pbnRlcnJ1cHQsIDAsICJpYm10ciIsIGRldikgIT0gMCkgeworCQlEUFJJTlRLKCJDb3VsZCBub3QgZ3JhYiBpcnEgJWQuICBIYWx0aW5nIFRva2VuIFJpbmcgZHJpdmVyLlxuIiwKKwkJCQkJaXJxKTsKKwkJaW91bm1hcCh0X21taW8pOworCQlrZnJlZSh0aSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKj8/IE5vdywgYWxsb2NhdGUgc29tZSBvZiB0aGUgUElPIFBPUlRzIGZvciB0aGlzIGRyaXZlci4uICovCisJLyogcmVjb3JkIFBJT2FkZHIgcmFuZ2UgYXMgYnVzeSAqLworCWlmICghcmVxdWVzdF9yZWdpb24oUElPYWRkciwgSUJNVFJfSU9fRVhURU5ULCAiaWJtdHIiKSkgeworCQlEUFJJTlRLKCJDb3VsZCBub3QgZ3JhYiBQSU8gcmFuZ2UuIEhhbHRpbmcgZHJpdmVyLlxuIik7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlpb3VubWFwKHRfbW1pbyk7CisJCWtmcmVlKHRpKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoIXZlcnNpb25fcHJpbnRlZCsrKSB7CisJCXByaW50ayh2ZXJzaW9uKTsKKwl9CisjZW5kaWYgLyogIVBDTUNJQSAqLworCURQUklOVEsoIiVzICVzIGZvdW5kXG4iLAorCQljaGFubmVsX2RlZltjYXJkcHJlc2VudCAtIDFdLCBhZGFwdGVyX2RlZih0aS0+YWRhcHRlcl90eXBlKSk7CisJRFBSSU5USygidXNpbmcgaXJxICVkLCBQSU9hZGRyICVoeCwgJWRLIHNoYXJlZCBSQU0uXG4iLAorCQkJaXJxLCBQSU9hZGRyLCB0aS0+bWFwcGVkX3JhbV9zaXplIC8gMik7CisJRFBSSU5USygiSGFyZHdhcmUgYWRkcmVzcyA6ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCQlkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLCBkZXYtPmRldl9hZGRyWzJdLAorCQlkZXYtPmRldl9hZGRyWzNdLCBkZXYtPmRldl9hZGRyWzRdLCBkZXYtPmRldl9hZGRyWzVdKTsKKwlpZiAodGktPnBhZ2VfbWFzaykKKwkJRFBSSU5USygiU2hhcmVkIFJBTSBwYWdpbmcgZW5hYmxlZC4gIgorCQkJIlBhZ2Ugc2l6ZTogJXVLIFNoYXJlZCBSYW0gc2l6ZSAlZEtcbiIsCisJCQkoKHRpLT5wYWdlX21hc2teMHhmZikrMSkgPj4yLCB0aS0+YXZhaWxfc2hhcmVkX3JhbSAvIDIpOworCWVsc2UKKwkJRFBSSU5USygiU2hhcmVkIFJBTSBwYWdpbmcgZGlzYWJsZWQuIHRpLT5wYWdlX21hc2sgJXhcbiIsCisJCQkJCQkJCXRpLT5wYWdlX21hc2spOworCisJLyogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIERIQiB3ZSBjYW4gdXNlICovCisJLyogdHdvIGNhc2VzIHdoZXJlIGF2YWlsX3NoYXJlZF9yYW0gZG9lc24ndCBlcXVhbCBtYXBwZWRfcmFtX3NpemU6CisJICAgIDEuIGF2YWlsX3NoYXJlZF9yYW0gaXMgMTI3IGJ1dCBtYXBwZWRfcmFtX3NpemUgaXMgMTI4ICh0eXBpY2FsKQorCSAgICAyLiB1c2VyIGhhcyBjb25maWd1cmVkIGFkYXB0ZXIgZm9yIGxlc3MgdGhhbiBhdmFpbF9zaGFyZWRfcmFtCisJICAgICAgIGJ1dCBpcyBub3QgdXNpbmcgcGFnaW5nIChzaGUgc2hvdWxkIHVzZSBwYWdpbmcsIEkgYmVsaWV2ZSkKKwkqLworCWlmICghdGktPnBhZ2VfbWFzaykgeworCQl0aS0+YXZhaWxfc2hhcmVkX3JhbT0KKwkJCQltaW4odGktPm1hcHBlZF9yYW1fc2l6ZSx0aS0+YXZhaWxfc2hhcmVkX3JhbSk7CisJfQorCisJc3dpdGNoICh0aS0+YXZhaWxfc2hhcmVkX3JhbSkgeworCWNhc2UgMTY6CQkvKiA4S0Igc2hhcmVkIFJBTSAqLworCQl0aS0+ZGhiX3NpemU0bWIgPSBtaW4odGktPmRoYl9zaXplNG1iLCAodW5zaWduZWQgc2hvcnQpMjA0OCk7CisJCXRpLT5yYnVmX2xlbjQgPSAxMDMyOworCQl0aS0+cmJ1Zl9jbnQ0PTI7CisJCXRpLT5kaGJfc2l6ZTE2bWIgPSBtaW4odGktPmRoYl9zaXplMTZtYiwgKHVuc2lnbmVkIHNob3J0KTIwNDgpOworCQl0aS0+cmJ1Zl9sZW4xNiA9IDEwMzI7CisJCXRpLT5yYnVmX2NudDE2PTI7CisJCWJyZWFrOworCWNhc2UgMzI6CQkvKiAxNktCIHNoYXJlZCBSQU0gKi8KKwkJdGktPmRoYl9zaXplNG1iID0gbWluKHRpLT5kaGJfc2l6ZTRtYiwgKHVuc2lnbmVkIHNob3J0KTQ0NjQpOworCQl0aS0+cmJ1Zl9sZW40ID0gMTAzMjsKKwkJdGktPnJidWZfY250ND00OworCQl0aS0+ZGhiX3NpemUxNm1iID0gbWluKHRpLT5kaGJfc2l6ZTE2bWIsICh1bnNpZ25lZCBzaG9ydCk0MDk2KTsKKwkJdGktPnJidWZfbGVuMTYgPSAxMDMyOwkvKjEwMjQgdXNhYmxlICovCisJCXRpLT5yYnVmX2NudDE2PTQ7CisJCWJyZWFrOworCWNhc2UgNjQ6CQkvKiAzMktCIHNoYXJlZCBSQU0gKi8KKwkJdGktPmRoYl9zaXplNG1iID0gbWluKHRpLT5kaGJfc2l6ZTRtYiwgKHVuc2lnbmVkIHNob3J0KTQ0NjQpOworCQl0aS0+cmJ1Zl9sZW40ID0gMTAzMjsKKwkJdGktPnJidWZfY250ND02OworCQl0aS0+ZGhiX3NpemUxNm1iID0gbWluKHRpLT5kaGJfc2l6ZTE2bWIsICh1bnNpZ25lZCBzaG9ydCkxMDI0MCk7CisJCXRpLT5yYnVmX2xlbjE2ID0gMTAzMjsKKwkJdGktPnJidWZfY250MTY9NjsKKwkJYnJlYWs7CisJY2FzZSAxMjc6CQkvKiA2My41S0Igc2hhcmVkIFJBTSAqLworCQl0aS0+ZGhiX3NpemU0bWIgPSBtaW4odGktPmRoYl9zaXplNG1iLCAodW5zaWduZWQgc2hvcnQpNDQ2NCk7CisJCXRpLT5yYnVmX2xlbjQgPSAxMDMyOworCQl0aS0+cmJ1Zl9jbnQ0PTY7CisJCXRpLT5kaGJfc2l6ZTE2bWIgPSBtaW4odGktPmRoYl9zaXplMTZtYiwgKHVuc2lnbmVkIHNob3J0KTE2Mzg0KTsKKwkJdGktPnJidWZfbGVuMTYgPSAxMDMyOworCQl0aS0+cmJ1Zl9jbnQxNj0xNjsKKwkJYnJlYWs7CisJY2FzZSAxMjg6CQkvKiA2NEtCICAgc2hhcmVkIFJBTSAqLworCQl0aS0+ZGhiX3NpemU0bWIgPSBtaW4odGktPmRoYl9zaXplNG1iLCAodW5zaWduZWQgc2hvcnQpNDQ2NCk7CisJCXRpLT5yYnVmX2xlbjQgPSAxMDMyOworCQl0aS0+cmJ1Zl9jbnQ0PTY7CisJCXRpLT5kaGJfc2l6ZTE2bWIgPSBtaW4odGktPmRoYl9zaXplMTZtYiwgKHVuc2lnbmVkIHNob3J0KTE3OTYwKTsKKwkJdGktPnJidWZfbGVuMTYgPSAxMDMyOworCQl0aS0+cmJ1Zl9jbnQxNj0xNjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdGktPmRoYl9zaXplNG1iID0gMjA0ODsKKwkJdGktPnJidWZfbGVuNCA9IDEwMzI7CisJCXRpLT5yYnVmX2NudDQ9MjsKKwkJdGktPmRoYl9zaXplMTZtYiA9IDIwNDg7CisJCXRpLT5yYnVmX2xlbjE2ID0gMTAzMjsKKwkJdGktPnJidWZfY250MTY9MjsKKwkJYnJlYWs7CisJfQorCS8qIHRoaXMgZm9ybXVsYSBpcyBub3Qgc21hcnQgZW5vdWdoIGZvciB0aGUgcGFnaW5nIGNhc2UKKwl0aS0+cmJ1Zl9jbnQ8eD4gPSAodGktPmF2YWlsX3NoYXJlZF9yYW0gKiBCTE9DS1NaIC0gQURBUFRfUFJJVkFURSAtCisJCQlBUkJMRU5HVEggLSBTU0JMRU5HVEggLSBETENfTUFYX1NBUCAqIFNBUExFTkdUSCAtCisJCQlETENfTUFYX1NUQSAqIFNUQUxFTkdUSCAtIHRpLT5kaGJfc2l6ZTx4Pm1iICogTlVNX0RIQiAtCisJCQlTUkJMRU5HVEggLSBBU0JMRU5HVEgpIC8gdGktPnJidWZfbGVuPHg+OworCSovCisJdGktPm1heG10dTE2ID0gKHRpLT5yYnVmX2xlbjE2IC0gOCkgKiB0aS0+cmJ1Zl9jbnQxNiAgLSBUUl9ITEVOOworCXRpLT5tYXhtdHU0ID0gKHRpLT5yYnVmX2xlbjQgLSA4KSAqIHRpLT5yYnVmX2NudDQgLSBUUl9ITEVOOworCS8qQk1TIGFzc3VtaW5nIDE4IGJ5dGVzIG9mIFJvdXRpbmcgSW5mb3JtYXRpb24gKHVzdWFsbHkgd29ya3MpICovCisJRFBSSU5USygiTWF4aW11bSBSZWNlaXZlIEludGVybmV0IFByb3RvY29sIE1UVSAxNk1icHM6ICVkLCA0TWJwczogJWRcbiIsCisJCQkJCQkgICAgIHRpLT5tYXhtdHUxNiwgdGktPm1heG10dTQpOworCisJZGV2LT5iYXNlX2FkZHIgPSBQSU9hZGRyOwkvKiBzZXQgdGhlIHZhbHVlIGZvciBkZXZpY2UgKi8KKwlkZXYtPm1lbV9zdGFydCA9IHRpLT5zcmFtX2Jhc2UgPDwgMTI7CisJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyAodGktPm1hcHBlZF9yYW1fc2l6ZSA8PCA5KSAtIDE7CisJdHJkZXZfaW5pdChkZXYpOworCXJldHVybiAwOyAgIC8qIFJldHVybiAwIHRvIGluZGljYXRlIHdlIGhhdmUgZm91bmQgYSBUb2tlbiBSaW5nIGNhcmQuICovCit9CQkJCS8qaWJtdHJfcHJvYmUxKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBxdWVyeSB0aGUgYWRhcHRlciBmb3IgdGhlIHNpemUgb2Ygc2hhcmVkIFJBTSAgKi8KKy8qIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBSQU0gc2l6ZSBpbiB1bml0cyBvZiA1MTIgYnl0ZXMgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgX19kZXZpbml0IGdldF9zcmFtX3NpemUoc3RydWN0IHRva19pbmZvICphZGFwdF9pbmZvKQoreworCXVuc2lnbmVkIGNoYXIgYXZhaWxfc3JhbV9jb2RlOworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNpemVfY29kZVtdID0geyAwLCAxNiwgMzIsIDY0LCAxMjcsIDEyOCB9OworCS8qIEFkYXB0ZXIgZ2l2ZXMKKwkgICAnRicgLS0gdXNlIFJSUiBiaXRzIDMsMgorCSAgICdFJyAtLSA4a2IgICAnRCcgLS0gMTZrYgorCSAgICdDJyAtLSAzMmtiICAnQScgLS0gNjRLQgorCSAgICdCJyAtIDY0S0IgbGVzcyA1MTIgYnl0ZXMgYXQgdG9wCisJICAgKFdBUk5JTkcgLi4uIG11c3QgemVybyB0b3AgYnl0ZXMgaW4gSU5JVCAqLworCisJYXZhaWxfc3JhbV9jb2RlID0gMHhmIC0gcmVhZGIoYWRhcHRfaW5mby0+bW1pbyArIEFJUEFWQUlMU0hSQU0pOworCWlmIChhdmFpbF9zcmFtX2NvZGUpIHJldHVybiBzaXplX2NvZGVbYXZhaWxfc3JhbV9jb2RlXTsKKwllbHNlCQkvKiBmb3IgY29kZSAnRicsIG11c3QgY29tcHV0ZSBzaXplIGZyb20gUlJSKDMsMikgYml0cyAqLworCQlyZXR1cm4gMSA8PAorCQkgKChyZWFkYihhZGFwdF9pbmZvLT5tbWlvK0FDQV9PRkZTRVQrQUNBX1JXK1JSUl9PREQpPj4yJjMpKzQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRyZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CisKKwlTRVRfUEFHRSh0aS0+c3JiX3BhZ2UpOworICAgICAgICB0aS0+b3Blbl9mYWlsdXJlID0gTk8gICAgOworCWRldi0+b3BlbiA9IHRva19vcGVuOworCWRldi0+c3RvcCA9IHRva19jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHRva19zZW5kX3BhY2tldDsKKwlkZXYtPmdldF9zdGF0cyA9IHRva19nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSB0b2tfc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+Y2hhbmdlX210dSA9IGlibXRyX2NoYW5nZV9tdHU7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHRva19pbml0X2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpOworCXNob3J0IFBJT2FkZHI7CisJdW5zaWduZWQgbG9uZyBpOworCisJUElPYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXRpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CisJLyogU3BlY2lhbCBwcm9jZXNzaW5nIGZvciBmaXJzdCBpbnRlcnJ1cHQgYWZ0ZXIgcmVzZXQgKi8KKwl0aS0+ZG9fdG9rX2ludCA9IEZJUlNUX0lOVDsKKwkvKiBSZXNldCBhZGFwdGVyICovCisJd3JpdGViKH5JTlRfRU5BQkxFLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfUkVTRVQgKyBJU1JQX0VWRU4pOworCW91dGIoMCwgUElPYWRkciArIEFEQVBUUkVTRVQpOworCisJY3VycmVudC0+c3RhdGU9VEFTS19VTklOVEVSUlVQVElCTEU7CisJc2NoZWR1bGVfdGltZW91dChUUl9SU1RfVElNRSk7IC8qIHdhaXQgNTBtcyAqLworCisJb3V0YigwLCBQSU9hZGRyICsgQURBUFRSRVNFVFJFTCk7CisjaWZkZWYgRU5BQkxFX1BBR0lORworCWlmICh0aS0+cGFnZV9tYXNrKQorCQl3cml0ZWIoU1JQUl9FTkFCTEVfUEFHSU5HLHRpLT5tbWlvK0FDQV9PRkZTRVQrQUNBX1JXK1NSUFJfRVZFTik7CisjZW5kaWYKKwl3cml0ZWIoSU5UX0VOQUJMRSwgdGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1NFVCArIElTUlBfRVZFTik7CisJaSA9IHNsZWVwX29uX3RpbWVvdXQoJnRpLT53YWl0X2Zvcl9yZXNldCwgNCAqIEhaKTsKKwlyZXR1cm4gaT8gMCA6IC1FQUdBSU47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgdG9rX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CisJaW50IGk7CisKKwkvKnRoZSBjYXNlIHdlIHdlcmUgbGVmdCBpbiBhIGZhaWx1cmUgc3RhdGUgZHVyaW5nIGEgcHJldmlvdXMgb3BlbiAqLworCWlmICh0aS0+b3Blbl9mYWlsdXJlID09IFlFUykgeworCQlEUFJJTlRLKCJMYXN0IHRpbWUgeW91IHdlcmUgZGlzY29ubmVjdGVkLCBob3cgYWJvdXQgbm93P1xuIik7CisJCXByaW50aygiWW91IGNhbid0IGluc2VydCB3aXRoIGFuIElDUyBjb25uZWN0b3IgaGFsZi1jb2NrZWQuXG4iKTsKKwl9CisKKwl0aS0+b3Blbl9zdGF0dXMgID0gQ0xPU0VEOyAvKiBDTE9TRUQgb3IgT1BFTiAgICAgICovCisJdGktPnNhcF9zdGF0dXMgICA9IENMT1NFRDsgLyogQ0xPU0VEIG9yIE9QRU4gICAgICAqLworCXRpLT5vcGVuX2ZhaWx1cmUgPSAgICAgTk87IC8qIE5PICAgICBvciBZRVMgICAgICAgKi8KKwl0aS0+b3Blbl9tb2RlICAgID0gTUFOVUFMOyAvKiBNQU5VQUwgb3IgQVVUT01BVElDICovCisJLyogMTIvMjAwMCBub3QgdHlwaWNhbCBMaW51eCwgYnV0IHdlIGNhbiB1c2UgUlVOTklORyB0byBsZXQgdXMga25vdyB3aGVuCisJdGhlIG5ldHdvcmsgaGFzIGNyYXBwZWQgb3V0IG9yIGNhYmxlcyBhcmUgZGlzY29ubmVjdGVkLiBVc2VmdWwgYmVjYXVzZQorCXRoZSBJRkZfVVAgZmxhZyBzdGF5cyB1cCB0aGUgd2hvbGUgdGltZSwgdW50aWwgaWZjb25maWcgdHIwIGRvd24uCisJKi8KKwlkZXYtPmZsYWdzICY9IH5JRkZfUlVOTklORzsKKworCXRpLT5zcmFtX3BoeXMgJj0gfjE7IC8qIHRvIHJldmVyc2Ugd2hhdCB3ZSBkbyBpbiB0b2tfY2xvc2UgKi8KKwkvKiBpbml0IHRoZSBzcGlubG9jayAqLworCXNwaW5fbG9ja19pbml0KCZ0aS0+bG9jayk7CisJaW5pdF90aW1lcigmdGktPnRyX3RpbWVyKTsKKwkKKwlpID0gdG9rX2luaXRfY2FyZChkZXYpOworCWlmIChpKSByZXR1cm4gaTsKKworCXdoaWxlICgxKXsKKwkJdG9rX29wZW5fYWRhcHRlcigodW5zaWduZWQgbG9uZykgZGV2KTsKKwkJaT0gaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZ0aS0+d2FpdF9mb3JfcmVzZXQsIDI1ICogSFopOworCQkvKiBzaWcgY2F0Y2g6IGVzdGltYXRlIG9wZW5pbmcgYWRhcHRlciB0YWtlcyBtb3JlIHRoYW4gLjUgc2VjKi8KKwkJaWYgKGk+KDI0NSpIWikvMTApIGJyZWFrOyAvKiBmYW5jaWVyIHRoYW4gaWYgKGk9PTI1KkhaKSAqLworCQlpZiAoaT09MCkgYnJlYWs7CisJCWlmICh0aS0+b3Blbl9zdGF0dXMgPT0gT1BFTiAmJiB0aS0+c2FwX3N0YXR1cz09T1BFTikgeworCQkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJCURQUklOVEsoIkFkYXB0ZXIgaXMgdXAgYW5kIHJ1bm5pbmdcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY3VycmVudC0+c3RhdGU9VEFTS19JTlRFUlJVUFRJQkxFOworCQlpPXNjaGVkdWxlX3RpbWVvdXQoVFJfUkVUUllfSU5URVJWQUwpOyAvKiB3YWl0IDMwIHNlY29uZHMgKi8KKwkJaWYoaSE9MCkgYnJlYWs7IC8qcHJvYi4gYSBzaWduYWwsIGxpa2UgdGhlIGk+MjQqSFogY2FzZSBhYm92ZSAqLworCX0KKwlvdXRiKDAsIGRldi0+YmFzZV9hZGRyICsgQURBUFRSRVNFVCk7Lyoga2lsbCBwZW5kaW5nIGludGVycnVwdHMqLworCURQUklOVEsoIlRFUk1JTkFURUQgdmlhIHNpZ25hbFxuIik7CS8qQk1TIHVzZWZ1bCAqLworCXJldHVybiAtRUFHQUlOOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ09NTUFORF9PRlNUICAgICAgICAgICAgIDAKKyNkZWZpbmUgT1BFTl9PUFRJT05TX09GU1QgICAgICAgIDgKKyNkZWZpbmUgTlVNX1JDVl9CVUZfT0ZTVCAgICAgICAgMjQKKyNkZWZpbmUgUkNWX0JVRl9MRU5fT0ZTVCAgICAgICAgMjYKKyNkZWZpbmUgREhCX0xFTkdUSF9PRlNUICAgICAgICAgMjgKKyNkZWZpbmUgTlVNX0RIQl9PRlNUICAgICAgICAgICAgMzAKKyNkZWZpbmUgRExDX01BWF9TQVBfT0ZTVCAgICAgICAgMzIKKyNkZWZpbmUgRExDX01BWF9TVEFfT0ZTVCAgICAgICAgMzMKKwordm9pZCB0b2tfb3Blbl9hZGFwdGVyKHVuc2lnbmVkIGxvbmcgZGV2X2FkZHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfYWRkcjsKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpOworCWludCBpOworCisJdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKKwlTRVRfUEFHRSh0aS0+aW5pdF9zcmJfcGFnZSk7IAorCXdyaXRlYih+U1JCX1JFU1BfSU5ULCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfUkVTRVQgKyBJU1JQX09ERCk7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3QgZGlyX29wZW5fYWRhcHRlcik7IGkrKykKKwkJd3JpdGViKDAsIHRpLT5pbml0X3NyYiArIGkpOworCXdyaXRlYihESVJfT1BFTl9BREFQVEVSLCB0aS0+aW5pdF9zcmIgKyBDT01NQU5EX09GU1QpOworCXdyaXRldyhodG9ucyhPUEVOX1BBU1NfQkNPTl9NQUMpLCB0aS0+aW5pdF9zcmIgKyBPUEVOX09QVElPTlNfT0ZTVCk7CisJaWYgKHRpLT5yaW5nX3NwZWVkID09IDE2KSB7CisJCXdyaXRldyhodG9ucyh0aS0+ZGhiX3NpemUxNm1iKSwgdGktPmluaXRfc3JiICsgREhCX0xFTkdUSF9PRlNUKTsKKwkJd3JpdGV3KGh0b25zKHRpLT5yYnVmX2NudDE2KSwgdGktPmluaXRfc3JiICsgTlVNX1JDVl9CVUZfT0ZTVCk7CisJCXdyaXRldyhodG9ucyh0aS0+cmJ1Zl9sZW4xNiksIHRpLT5pbml0X3NyYiArIFJDVl9CVUZfTEVOX09GU1QpOworCX0gZWxzZSB7CisJCXdyaXRldyhodG9ucyh0aS0+ZGhiX3NpemU0bWIpLCB0aS0+aW5pdF9zcmIgKyBESEJfTEVOR1RIX09GU1QpOworCQl3cml0ZXcoaHRvbnModGktPnJidWZfY250NCksIHRpLT5pbml0X3NyYiArIE5VTV9SQ1ZfQlVGX09GU1QpOworCQl3cml0ZXcoaHRvbnModGktPnJidWZfbGVuNCksIHRpLT5pbml0X3NyYiArIFJDVl9CVUZfTEVOX09GU1QpOworCX0KKwl3cml0ZWIoTlVNX0RIQiwJCS8qIGFsd2F5cyAyICovIHRpLT5pbml0X3NyYiArIE5VTV9ESEJfT0ZTVCk7CisJd3JpdGViKERMQ19NQVhfU0FQLCB0aS0+aW5pdF9zcmIgKyBETENfTUFYX1NBUF9PRlNUKTsKKwl3cml0ZWIoRExDX01BWF9TVEEsIHRpLT5pbml0X3NyYiArIERMQ19NQVhfU1RBX09GU1QpOworCXRpLT5zcmIgPSB0aS0+aW5pdF9zcmI7CS8qIFdlIHVzZSB0aGlzIG9uZSBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwl0aS0+c3JiX3BhZ2UgPSB0aS0+aW5pdF9zcmJfcGFnZTsKKwlEUFJJTlRLKCJPcGVuaW5nIGFkYXB0ZXI6IFhtaXQgYmZyczogJWQgWCAlZCwgUmN2IGJmcnM6ICVkIFggJWRcbiIsCisJCXJlYWRiKHRpLT5pbml0X3NyYiArIE5VTV9ESEJfT0ZTVCksCisJCW50b2hzKHJlYWR3KHRpLT5pbml0X3NyYiArIERIQl9MRU5HVEhfT0ZTVCkpLAorCQludG9ocyhyZWFkdyh0aS0+aW5pdF9zcmIgKyBOVU1fUkNWX0JVRl9PRlNUKSksCisJCW50b2hzKHJlYWR3KHRpLT5pbml0X3NyYiArIFJDVl9CVUZfTEVOX09GU1QpKSk7CisJd3JpdGViKElOVF9FTkFCTEUsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9TRVQgKyBJU1JQX0VWRU4pOworCXdyaXRlYihDTURfSU5fU1JCLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfU0VUICsgSVNSQV9PREQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIG9wZW5fc2FwKHVuc2lnbmVkIGNoYXIgdHlwZSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CisKKwlTRVRfUEFHRSh0aS0+c3JiX3BhZ2UpOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc3RydWN0IGRsY19vcGVuX3NhcCk7IGkrKykKKwkJd3JpdGViKDAsIHRpLT5zcmIgKyBpKTsKKworI2RlZmluZSBNQVhfSV9GSUVMRF9PRlNUICAgICAgICAxNAorI2RlZmluZSBTQVBfVkFMVUVfT0ZTVCAgICAgICAgICAxNgorI2RlZmluZSBTQVBfT1BUSU9OU19PRlNUICAgICAgICAxNworI2RlZmluZSBTVEFUSU9OX0NPVU5UX09GU1QgICAgICAxOAorCisJd3JpdGViKERMQ19PUEVOX1NBUCwgdGktPnNyYiArIENPTU1BTkRfT0ZTVCk7CisJd3JpdGV3KGh0b25zKE1BWF9JX0ZJRUxEKSwgdGktPnNyYiArIE1BWF9JX0ZJRUxEX09GU1QpOworCXdyaXRlYihTQVBfT1BFTl9JTkRfU0FQIHwgU0FQX09QRU5fUFJJT1JJVFksIHRpLT5zcmIrIFNBUF9PUFRJT05TX09GU1QpOworCXdyaXRlYihTQVBfT1BFTl9TVEFUSU9OX0NOVCwgdGktPnNyYiArIFNUQVRJT05fQ09VTlRfT0ZTVCk7CisJd3JpdGViKHR5cGUsIHRpLT5zcmIgKyBTQVBfVkFMVUVfT0ZTVCk7CisJd3JpdGViKENNRF9JTl9TUkIsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9TRVQgKyBJU1JBX09ERCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCB0b2tfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRva19pbmZvICp0aSA9IChzdHJ1Y3QgdG9rX2luZm8gKikgZGV2LT5wcml2OworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCXVuc2lnbmVkIGNoYXIgYWRkcmVzc1s0XTsKKworCWludCBpOworCisJLypCTVMgdGhlIG5leHQgbGluZSBpcyBDUlVDSUFMIG9yIHlvdSBtYXkgYmUgc2FkIHdoZW4geW91ICovCisJLypCTVMgaWZjb25maWcgdHIgZG93biBvciBob3QgdW5wbHVnIGEgUENNQ0lBIGNhcmQgPz9ob3dub3dicm93bmNvdyovCisJaWYgKC8qQk1TSEVMUGRldi0+c3RhcnQgPT0gMCB8fCovIHRpLT5vcGVuX3N0YXR1cyAhPSBPUEVOKSByZXR1cm47CisJYWRkcmVzc1swXSA9IGFkZHJlc3NbMV0gPSBhZGRyZXNzWzJdID0gYWRkcmVzc1szXSA9IDA7CisJbWNsaXN0ID0gZGV2LT5tY19saXN0OworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm1jX2NvdW50OyBpKyspIHsKKwkJYWRkcmVzc1swXSB8PSBtY2xpc3QtPmRtaV9hZGRyWzJdOworCQlhZGRyZXNzWzFdIHw9IG1jbGlzdC0+ZG1pX2FkZHJbM107CisJCWFkZHJlc3NbMl0gfD0gbWNsaXN0LT5kbWlfYWRkcls0XTsKKwkJYWRkcmVzc1szXSB8PSBtY2xpc3QtPmRtaV9hZGRyWzVdOworCQltY2xpc3QgPSBtY2xpc3QtPm5leHQ7CisJfQorCVNFVF9QQUdFKHRpLT5zcmJfcGFnZSk7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3Qgc3JiX3NldF9mdW5jdF9hZGRyKTsgaSsrKQorCQl3cml0ZWIoMCwgdGktPnNyYiArIGkpOworCisjZGVmaW5lIEZVTkNUX0FERFJFU1NfT0ZTVCA2CisKKwl3cml0ZWIoRElSX1NFVF9GVU5DX0FERFIsIHRpLT5zcmIgKyBDT01NQU5EX09GU1QpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIAorCQl3cml0ZWIoYWRkcmVzc1tpXSwgdGktPnNyYiArIEZVTkNUX0FERFJFU1NfT0ZTVCArIGkpOworCXdyaXRlYihDTURfSU5fU1JCLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfU0VUICsgSVNSQV9PREQpOworI2lmIFRSX1ZFUkJPU0UKKwlEUFJJTlRLKCJTZXR0aW5nIGZ1bmN0aW9uYWwgYWRkcmVzczogIik7CisJZm9yIChpPTA7aTw0O2krKykgIHByaW50aygiJTAyWCAiLCBhZGRyZXNzW2ldKTsKKwlwcmludGsoIlxuIik7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFNUQVRJT05fSURfT0ZTVCA0CisKK3N0YXRpYyBpbnQgdG9rX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRva19pbmZvICp0aTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXRpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CisKKyAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogbG9jayBhZ2FpbnN0IG90aGVyIENQVXMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmKHRpLT5sb2NrKSwgZmxhZ3MpOworCisJLyogU2F2ZSBza2I7IHdlJ2xsIG5lZWQgaXQgd2hlbiB0aGUgYWRhcHRlciBhc2tzIGZvciB0aGUgZGF0YSAqLworCXRpLT5jdXJyZW50X3NrYiA9IHNrYjsKKwlTRVRfUEFHRSh0aS0+c3JiX3BhZ2UpOworCXdyaXRlYihYTUlUX1VJX0ZSQU1FLCB0aS0+c3JiICsgQ09NTUFORF9PRlNUKTsKKwl3cml0ZXcodGktPmV4c2FwX3N0YXRpb25faWQsIHRpLT5zcmIgKyBTVEFUSU9OX0lEX09GU1QpOworCXdyaXRlYihDTURfSU5fU1JCLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfU0VUICsgSVNSQV9PREQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJih0aS0+bG9jayksIGZsYWdzKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHRva19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0b2tfaW5mbyAqdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKKworCS8qIEltcG9ydGFudCBmb3IgUENNQ0lBIGhvdCB1bnBsdWcsIG90aGVyd2lzZSwgd2UnbGwgcHVsbCB0aGUgY2FyZCwgKi8KKwkvKiB1bmxvYWRpbmcgdGhlIG1vZHVsZSBmcm9tIG1lbW9yeSwgYW5kIHRoZW4gaWYgYSB0aW1lciBwb3BzLCBvdWNoICovCisJZGVsX3RpbWVyX3N5bmMoJnRpLT50cl90aW1lcik7CisJb3V0YigwLCBkZXYtPmJhc2VfYWRkciArIEFEQVBUUkVTRVQpOworCXRpLT5zcmFtX3BoeXMgfD0gMTsKKwl0aS0+b3Blbl9zdGF0dXMgPSBDTE9TRUQ7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJRFBSSU5USygiQWRhcHRlciBpcyBjbG9zZWQuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFJFVENPREVfT0ZTVAkJMgorI2RlZmluZSBPUEVOX0VSUk9SX0NPREVfT0ZTVAk2CisjZGVmaW5lIEFTQl9BRERSRVNTX09GU1QgICAgICAgIDgKKyNkZWZpbmUgU1JCX0FERFJFU1NfT0ZTVCAgICAgICAgMTAKKyNkZWZpbmUgQVJCX0FERFJFU1NfT0ZTVCAgICAgICAgMTIKKyNkZWZpbmUgU1NCX0FERFJFU1NfT0ZTVCAgICAgICAgMTQKKworc3RhdGljIGNoYXIgKnByaW50cGhhc2VbXT0geyJMb2JlIG1lZGlhIHRlc3QiLCJQaHlzaWNhbCBpbnNlcnRpb24iLAorCSAgICAgICJBZGRyZXNzIHZlcmlmaWNhdGlvbiIsIlJvbGwgY2FsbCBwb2xsIiwiUmVxdWVzdCBQYXJhbWV0ZXJzIn07CitzdGF0aWMgY2hhciAqcHJpbnRlcnJvcltdPXsiRnVuY3Rpb24gZmFpbHVyZSIsIlNpZ25hbCBsb3NzIiwiUmVzZXJ2ZWQiLAorCQkiRnJlcXVlbmN5IGVycm9yIiwiVGltZW91dCIsIlJpbmcgZmFpbHVyZSIsIlJpbmcgYmVhY29uaW5nIiwKKwkJIkR1cGxpY2F0ZSBub2RlIGFkZHJlc3MiLAorCQkiUGFyYW1ldGVyIHJlcXVlc3QtcmV0cnkgY291bnQgZXhjZWVkZWQiLCJSZW1vdmUgcmVjZWl2ZWQiLAorCQkiSU1QTCBmb3JjZSByZWNlaXZlZCIsIkR1cGxpY2F0ZSBtb2RpZmllciIsCisJCSJObyBtb25pdG9yIGRldGVjdGVkIiwiTW9uaXRvciBjb250ZW50aW9uIGZhaWxlZCBmb3IgUlBMIn07CisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm1hcF9hZGRyZXNzKHN0cnVjdCB0b2tfaW5mbyAqdGksIHVuc2lnbmVkIGluZGV4LCBfX3U4ICpwYWdlKQoreworCWlmICh0aS0+cGFnZV9tYXNrKSB7CisJCSpwYWdlID0gKGluZGV4ID4+IDgpICYgdGktPnBhZ2VfbWFzazsKKwkJaW5kZXggJj0gfih0aS0+cGFnZV9tYXNrIDw8IDgpOworCX0KKwlyZXR1cm4gdGktPnNyYW1fdmlydCArIGluZGV4OworfQorCit2b2lkIGRpcl9vcGVuX2FkYXB0ZXIgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCB0b2tfaW5mbyAqdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKKyAgICAgICAgdW5zaWduZWQgY2hhciByZXRfY29kZTsKKyAgICAgICAgX191MTYgZXJyOworCisgICAgICAgIHRpLT5zcmIgPSBtYXBfYWRkcmVzcyh0aSwKKwkJbnRvaHMocmVhZHcodGktPmluaXRfc3JiICsgU1JCX0FERFJFU1NfT0ZTVCkpLAorCQkmdGktPnNyYl9wYWdlKTsKKyAgICAgICAgdGktPnNzYiA9IG1hcF9hZGRyZXNzKHRpLAorCQludG9ocyhyZWFkdyh0aS0+aW5pdF9zcmIgKyBTU0JfQUREUkVTU19PRlNUKSksCisJCSZ0aS0+c3NiX3BhZ2UpOworICAgICAgICB0aS0+YXJiID0gbWFwX2FkZHJlc3ModGksCisJCW50b2hzKHJlYWR3KHRpLT5pbml0X3NyYiArIEFSQl9BRERSRVNTX09GU1QpKSwKKwkJJnRpLT5hcmJfcGFnZSk7CisgICAgICAgIHRpLT5hc2IgPSBtYXBfYWRkcmVzcyh0aSwKKwkJbnRvaHMocmVhZHcodGktPmluaXRfc3JiICsgQVNCX0FERFJFU1NfT0ZTVCkpLAorCQkmdGktPmFzYl9wYWdlKTsKKyAgICAgICAgdGktPmN1cnJlbnRfc2tiID0gTlVMTDsKKyAgICAgICAgcmV0X2NvZGUgPSByZWFkYih0aS0+aW5pdF9zcmIgKyBSRVRDT0RFX09GU1QpOworICAgICAgICBlcnIgPSBudG9ocyhyZWFkdyh0aS0+aW5pdF9zcmIgKyBPUEVOX0VSUk9SX0NPREVfT0ZTVCkpOworICAgICAgICBpZiAoIXJldF9jb2RlKSB7CisJCXRpLT5vcGVuX3N0YXR1cyA9IE9QRU47IC8qIFRSIGFkYXB0ZXIgaXMgbm93IGF2YWlsYWJsZSAqLworICAgICAgICAgICAgICAgIGlmICh0aS0+b3Blbl9tb2RlID09IEFVVE9NQVRJQykgeworCQkJRFBSSU5USygiQWRhcHRlciByZW9wZW5lZC5cbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZWIoflNSQl9SRVNQX0lOVCwgdGktPm1taW8rQUNBX09GRlNFVCtBQ0FfUkVTRVQrSVNSUF9PREQpOworICAgICAgICAgICAgICAgIG9wZW5fc2FwKEVYVEVOREVEX1NBUCwgZGV2KTsKKwkJcmV0dXJuOworCX0KKwl0aS0+b3Blbl9mYWlsdXJlID0gWUVTOworCWlmIChyZXRfY29kZSA9PSA3KXsKKyAgICAgICAgICAgICAgIGlmIChlcnIgPT0gMHgyNCkgeworCQkJaWYgKCF0aS0+YXV0b19zcGVlZHNhdmUpIHsKKwkJCQlEUFJJTlRLKCJPcGVuIGZhaWxlZDogQWRhcHRlciBzcGVlZCBtdXN0IG1hdGNoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyaW5nIHNwZWVkIGlmIEF1dG9tYXRpYyBSaW5nIFNwZWVkIFNhdmUgaXMgIgorCQkJCSAiZGlzYWJsZWQuXG4iKTsKKwkJCQl0aS0+b3Blbl9hY3Rpb24gPSBGQUlMOworCQkJfWVsc2UKKwkJCQlEUFJJTlRLKCJSZXRyeWluZyBvcGVuIHRvIGFkanVzdCB0byAiCisJCQkJCSJyaW5nIHNwZWVkLCAiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSAweDJkKSB7CisJCQlEUFJJTlRLKCJQaHlzaWNhbCBJbnNlcnRpb246IE5vIE1vbml0b3IgRGV0ZWN0ZWQsICIpOworCQkJcHJpbnRrKCJyZXRyeWluZyBhZnRlciAlZHMgZGVsYXkuLi5cbiIsCisJCQkJCVRSX1JFVFJZX0lOVEVSVkFML0haKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSAweDExKSB7CisJCQlEUFJJTlRLKCJMb2JlIE1lZGlhIEZ1bmN0aW9uIEZhaWx1cmUgKDB4MTEpLCAiKTsKKwkJCXByaW50aygiIHJldHJ5aW5nIGFmdGVyICVkcyBkZWxheS4uLlxuIiwKKwkJCQkJVFJfUkVUUllfSU5URVJWQUwvSFopOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisJCQljaGFyICoqcHJwaGFzZSA9IHByaW50cGhhc2U7CisJCQljaGFyICoqcHJlcnJvciA9IHByaW50ZXJyb3I7CisJCQlEUFJJTlRLKCJUUiBBZGFwdGVyIG1pc2Mgb3BlbiBmYWlsdXJlLCBlcnJvciBjb2RlID0gIik7CisJCQlwcmludGsoIjB4JXgsIFBoYXNlOiAlcywgRXJyb3I6ICVzXG4iLAorCQkJCWVyciwgcHJwaGFzZVtlcnIvMTYgLTFdLCBwcmVycm9yW2VyciUxNiAtMV0pOworCQkJcHJpbnRrKCIgcmV0cnlpbmcgYWZ0ZXIgJWRzIGRlbGF5Li4uXG4iLAorCQkJCQlUUl9SRVRSWV9JTlRFUlZBTC9IWik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgRFBSSU5USygib3BlbiBmYWlsZWQ6IHJldF9jb2RlID0gJTAyWC4uLiwgIiwgcmV0X2NvZGUpOworCWlmICh0aS0+b3Blbl9hY3Rpb24gIT0gRkFJTCkgeworCQlpZiAodGktPm9wZW5fbW9kZT09QVVUT01BVElDKXsKKwkJCXRpLT5vcGVuX2FjdGlvbiA9IFJFT1BFTjsKKwkJCWlibXRyX3Jlc2V0X3RpbWVyKCYodGktPnRyX3RpbWVyKSwgZGV2KTsKKwkJCXJldHVybjsKKwkJfQorCQl3YWtlX3VwKCZ0aS0+d2FpdF9mb3JfcmVzZXQpOworCQlyZXR1cm47CisJfQorCURQUklOVEsoIkZBSUxVUkUsIENBUFVUXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaXJxcmV0dXJuX3QgdG9rX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGNoYXIgc3RhdHVzOworCS8qICB1bnNpZ25lZCBjaGFyIHN0YXR1c19ldmVuIDsgKi8KKwlzdHJ1Y3QgdG9rX2luZm8gKnRpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisjaWZkZWYgRU5BQkxFX1BBR0lORworCXVuc2lnbmVkIGNoYXIgc2F2ZV9zcnByOworI2VuZGlmCisKKwlkZXYgPSBkZXZfaWQ7CisjaWYgVFJfVkVSQk9TRQorCURQUklOVEsoIkludCBmcm9tIHRva19kcml2ZXIsIGRldiA6ICVwIGlycSVkIHJlZ3M9JXBcbiIsIGRldixpcnEscmVncyk7CisjZW5kaWYKKwl0aSA9IChzdHJ1Y3QgdG9rX2luZm8gKikgZGV2LT5wcml2OworCWlmICh0aS0+c3JhbV9waHlzICYgMSkKKwkJcmV0dXJuIElSUV9OT05FOyAgICAgICAgIC8qIFBDTUNJQSBjYXJkIGV4dHJhY3Rpb24gZmxhZyAqLworCXNwaW5fbG9jaygmKHRpLT5sb2NrKSk7CisjaWZkZWYgRU5BQkxFX1BBR0lORworCXNhdmVfc3JwciA9IHJlYWRiKHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9SVyArIFNSUFJfRVZFTik7CisjZW5kaWYKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyB0aWxsIHByb2Nlc3NpbmcgaXMgZmluaXNoZWQgKi8KKwl3cml0ZWIoKH5JTlRfRU5BQkxFKSwgdGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1JFU0VUICsgSVNSUF9FVkVOKTsKKworCS8qIFJlc2V0IGludGVycnVwdCBmb3IgSVNBIGJvYXJkcyAqLworCWlmICh0aS0+YWRhcHRlcl9pbnRfZW5hYmxlKQorCQlvdXRiKDAsIHRpLT5hZGFwdGVyX2ludF9lbmFibGUpOworCWVsc2UgLyogdXNlZCBmb3IgUENNQ0lBIGNhcmRzICovCisJCW91dGIoMCwgdGktPmdsb2JhbF9pbnRfZW5hYmxlKTsKKyAgICAgICAgaWYgKHRpLT5kb190b2tfaW50ID09IEZJUlNUX0lOVCl7CisgICAgICAgICAgICAgICAgaW5pdGlhbF90b2tfaW50KGRldik7CisjaWZkZWYgRU5BQkxFX1BBR0lORworICAgICAgICAgICAgICAgIHdyaXRlYihzYXZlX3NycHIsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9SVyArIFNSUFJfRVZFTik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBzcGluX3VubG9jaygmKHRpLT5sb2NrKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOworICAgICAgICB9CisJLyogIEJlZ2luIGludGVycnVwdCBoYW5kbGVyIEhFUkUgaW5saW5lIHRvIGF2b2lkIHRoZSBleHRyYQorCSAgICBsZXZlbHMgb2YgbG9naWMgYW5kIGNhbGwgZGVwdGggZm9yIHRoZSBvcmlnaW5hbCBzb2x1dGlvbi4gKi8KKwlzdGF0dXMgPSByZWFkYih0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfUlcgKyBJU1JQX09ERCk7CisJLypCTVNzdGF0dXNfZXZlbiA9IHJlYWRiICh0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfUlcgKyBJU1JQX0VWRU4pICovCisJLypCTVNkZWJ1Z3ByaW50aygidG9rX2ludGVycnVwdDogSVNSUF9PREQgPSAweCV4IElTUlBfRVZFTiA9IDB4JXhcbiIsICovCisJLypCTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsc3RhdHVzX2V2ZW4pOyAgICAgICovCisKKwlpZiAoc3RhdHVzICYgQURBUF9DSEtfSU5UKSB7CisJCWludCBpOworCQl2b2lkIF9faW9tZW0gKmNoZWNrX3JlYXNvbjsKKwkJX191OCBjaGVja19yZWFzb25fcGFnZSA9IDA7CisJCWNoZWNrX3JlYXNvbiA9IG1hcF9hZGRyZXNzKHRpLAorCQkJbnRvaHMocmVhZHcodGktPm1taW8rIEFDQV9PRkZTRVQrQUNBX1JXICsgV1dDUl9FVkVOKSksCisJCQkmY2hlY2tfcmVhc29uX3BhZ2UpOworCQlTRVRfUEFHRShjaGVja19yZWFzb25fcGFnZSk7CisKKwkJRFBSSU5USygiQWRhcHRlciBjaGVjayBpbnRlcnJ1cHRcbiIpOworCQlEUFJJTlRLKCI4IHJlYXNvbiBieXRlcyBmb2xsb3c6ICIpOworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCBjaGVja19yZWFzb24rKykKKwkJCXByaW50aygiJTAyWCAiLCAoaW50KSByZWFkYihjaGVja19yZWFzb24pKTsKKwkJcHJpbnRrKCJcbiIpOworCQl3cml0ZWIofkFEQVBfQ0hLX0lOVCwgdGktPm1taW8rIEFDQV9PRkZTRVQrQUNBX1JFU0VUKyBJU1JQX09ERCk7CisJCXN0YXR1cyA9IHJlYWRiKHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9SVyArIElTUkFfRVZFTik7CisJCURQUklOVEsoIklTUkFfRVZFTiA9PSAweDAyJXhcbiIsc3RhdHVzKTsKKwkJdGktPm9wZW5fc3RhdHVzID0gQ0xPU0VEOworCQl0aS0+c2FwX3N0YXR1cyAgPSBDTE9TRUQ7CisJCXRpLT5vcGVuX21vZGUgICA9IEFVVE9NQVRJQzsKKwkJZGV2LT5mbGFncyAmPSB+SUZGX1JVTk5JTkc7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJdGktPm9wZW5fYWN0aW9uID0gUkVTVEFSVDsKKwkJb3V0YigwLCBkZXYtPmJhc2VfYWRkciArIEFEQVBUUkVTRVQpOworCQlpYm10cl9yZXNldF90aW1lcigmKHRpLT50cl90aW1lciksIGRldik7LypCTVMgdHJ5IHRvIHJlb3BlbiovCisJCXNwaW5fdW5sb2NrKCYodGktPmxvY2spKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwlpZiAocmVhZGIodGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1JXICsgSVNSUF9FVkVOKQorCQkmIChUQ1JfSU5UIHwgRVJSX0lOVCB8IEFDQ0VTU19JTlQpKSB7CisJCURQUklOVEsoImFkYXB0ZXIgZXJyb3I6IElTUlBfRVZFTiA6ICUwMnhcbiIsCisJCQkoaW50KXJlYWRiKHRpLT5tbWlvKyBBQ0FfT0ZGU0VUICsgQUNBX1JXICsgSVNSUF9FVkVOKSk7CisJCXdyaXRlYih+KFRDUl9JTlQgfCBFUlJfSU5UIHwgQUNDRVNTX0lOVCksCisJCQl0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfUkVTRVQgKyBJU1JQX0VWRU4pOworCQlzdGF0dXM9IHJlYWRiKHRpLT5tbWlvKyBBQ0FfT0ZGU0VUICsgQUNBX1JXICsgSVNSQV9FVkVOKTsvKkJNUyovCisJCURQUklOVEsoIklTUkFfRVZFTiA9PSAweDAyJXhcbiIsc3RhdHVzKTsvKkJNUyovCisgICAgICAgICAgICAgICAgd3JpdGViKElOVF9FTkFCTEUsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9TRVQgKyBJU1JQX0VWRU4pOworI2lmZGVmIEVOQUJMRV9QQUdJTkcKKyAgICAgICAgICAgICAgICB3cml0ZWIoc2F2ZV9zcnByLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfUlcgKyBTUlBSX0VWRU4pOworI2VuZGlmCisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soJih0aS0+bG9jaykpOworICAgICAgICAgICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKKyAgICAgICAgfQorCWlmIChzdGF0dXMgJiBTUkJfUkVTUF9JTlQpIHsJLyogU1JCIHJlc3BvbnNlICovCisJCVNFVF9QQUdFKHRpLT5zcmJfcGFnZSk7CisjaWYgVFJfVkVSQk9TRQorCQlEUFJJTlRLKCJTUkIgcmVzcDogY21kPSUwMlggcnNwPSUwMlhcbiIsCisJCQkJcmVhZGIodGktPnNyYiksIHJlYWRiKHRpLT5zcmIgKyBSRVRDT0RFX09GU1QpKTsKKyNlbmRpZgorCQlzd2l0Y2ggKHJlYWRiKHRpLT5zcmIpKSB7CS8qIFNSQiBjb21tYW5kIGNoZWNrICovCisJCWNhc2UgWE1JVF9ESVJfRlJBTUU6eworCQkJdW5zaWduZWQgY2hhciB4bWl0X3JldF9jb2RlOworCQkJeG1pdF9yZXRfY29kZSA9IHJlYWRiKHRpLT5zcmIgKyBSRVRDT0RFX09GU1QpOworCQkJaWYgKHhtaXRfcmV0X2NvZGUgPT0gMHhmZikgYnJlYWs7CisJCQlEUFJJTlRLKCJlcnJvciBvbiB4bWl0X2Rpcl9mcmFtZSByZXF1ZXN0OiAlMDJYXG4iLAorCQkJCQkJCQl4bWl0X3JldF9jb2RlKTsKKwkJCWlmICh0aS0+Y3VycmVudF9za2IpIHsKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycSh0aS0+Y3VycmVudF9za2IpOworCQkJCXRpLT5jdXJyZW50X3NrYiA9IE5VTEw7CisJCQl9CisJCQkvKmRldi0+dGJ1c3kgPSAwOyovCisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQlpZiAodGktPnJlYWRsb2dfcGVuZGluZykKKwkJCQlpYm10cl9yZWFkbG9nKGRldik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIFhNSVRfVUlfRlJBTUU6eworCQkJdW5zaWduZWQgY2hhciB4bWl0X3JldF9jb2RlOworCisJCQl4bWl0X3JldF9jb2RlID0gcmVhZGIodGktPnNyYiArIFJFVENPREVfT0ZTVCk7CisJCQlpZiAoeG1pdF9yZXRfY29kZSA9PSAweGZmKSBicmVhazsKKwkJCURQUklOVEsoImVycm9yIG9uIHhtaXRfdWlfZnJhbWUgcmVxdWVzdDogJTAyWFxuIiwKKwkJCQkJCQkJeG1pdF9yZXRfY29kZSk7CisJCQlpZiAodGktPmN1cnJlbnRfc2tiKSB7CisJCQkJZGV2X2tmcmVlX3NrYl9pcnEodGktPmN1cnJlbnRfc2tiKTsKKwkJCQl0aS0+Y3VycmVudF9za2IgPSBOVUxMOworCQkJfQorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJaWYgKHRpLT5yZWFkbG9nX3BlbmRpbmcpCisJCQkJaWJtdHJfcmVhZGxvZyhkZXYpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBESVJfT1BFTl9BREFQVEVSOgorCQkJZGlyX29wZW5fYWRhcHRlcihkZXYpOworCQkJYnJlYWs7CisJCWNhc2UgRExDX09QRU5fU0FQOgorCQkJaWYgKHJlYWRiKHRpLT5zcmIgKyBSRVRDT0RFX09GU1QpKSB7CisJCQkJRFBSSU5USygib3Blbl9zYXAgZmFpbGVkOiByZXRfY29kZSA9ICUwMlgsICIKKwkJCQkJInJldHJ5aW5nXG4iLAorCQkJCQkoaW50KSByZWFkYih0aS0+c3JiICsgUkVUQ09ERV9PRlNUKSk7CisJCQkJdGktPm9wZW5fYWN0aW9uID0gUkVPUEVOOworCQkJCWlibXRyX3Jlc2V0X3RpbWVyKCYodGktPnRyX3RpbWVyKSwgZGV2KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXRpLT5leHNhcF9zdGF0aW9uX2lkID0gcmVhZHcodGktPnNyYiArIFNUQVRJT05fSURfT0ZTVCk7CisJCQl0aS0+c2FwX3N0YXR1cyA9IE9QRU47LyogVFIgYWRhcHRlciBpcyBub3cgYXZhaWxhYmxlICovCisJCQlpZiAodGktPm9wZW5fbW9kZT09TUFOVUFMKXsKKwkJCQl3YWtlX3VwKCZ0aS0+d2FpdF9mb3JfcmVzZXQpOworCQkJCWJyZWFrOworCQkJfQorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJZGV2LT5mbGFncyB8PSBJRkZfUlVOTklORzsvKkJNUyAxMi8yMDAwKi8KKwkJCWJyZWFrOworCQljYXNlIERJUl9JTlRFUlJVUFQ6CisJCWNhc2UgRElSX01PRF9PUEVOX1BBUkFNUzoKKwkJY2FzZSBESVJfU0VUX0dSUF9BRERSOgorCQljYXNlIERJUl9TRVRfRlVOQ19BRERSOgorCQljYXNlIERMQ19DTE9TRV9TQVA6CisJCQlpZiAocmVhZGIodGktPnNyYiArIFJFVENPREVfT0ZTVCkpCisJCQkJRFBSSU5USygiZXJyb3Igb24gJTAyWDogJTAyWFxuIiwKKwkJCQkJKGludCkgcmVhZGIodGktPnNyYiArIENPTU1BTkRfT0ZTVCksCisJCQkJCShpbnQpIHJlYWRiKHRpLT5zcmIgKyBSRVRDT0RFX09GU1QpKTsKKwkJCWJyZWFrOworCQljYXNlIERJUl9SRUFEX0xPRzoKKwkJCWlmIChyZWFkYih0aS0+c3JiICsgUkVUQ09ERV9PRlNUKSl7CisJCQkJRFBSSU5USygiZXJyb3Igb24gZGlyX3JlYWRfbG9nOiAlMDJYXG4iLAorCQkJCQkoaW50KSByZWFkYih0aS0+c3JiICsgUkVUQ09ERV9PRlNUKSk7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJCWJyZWFrOworCQkJfQorI2lmIElCTVRSX0RFQlVHX01FU1NBR0VTCisKKyNkZWZpbmUgTElORV9FUlJPUlNfT0ZTVCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRFUk5BTF9FUlJPUlNfT0ZTVCAgICAgICAgICAgICAxCisjZGVmaW5lIEJVUlNUX0VSUk9SU19PRlNUICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQUNfRVJST1JTX09GU1QgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBBQk9SVF9ERUxJTUlURVJTX09GU1QgICAgICAgICAgICA0CisjZGVmaW5lIExPU1RfRlJBTUVTX09GU1QgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgUkVDVl9DT05HRVNUX0NPVU5UX09GU1QgICAgICAgICAgNworI2RlZmluZSBGUkFNRV9DT1BJRURfRVJST1JTX09GU1QgICAgICAgICA4CisjZGVmaW5lIEZSRVFVRU5DWV9FUlJPUlNfT0ZTVCAgICAgICAgICAgIDkKKyNkZWZpbmUgVE9LRU5fRVJST1JTX09GU1QgICAgICAgICAgICAgICAxMAorCisJCQlEUFJJTlRLKCJMaW5lIGVycm9ycyAlMDJYLCBJbnRlcm5hbCBlcnJvcnMgJTAyWCwgIgorCQkJIkJ1cnN0IGVycm9ycyAlMDJYXG4iICJBL0MgZXJyb3JzICUwMlgsICIKKwkJCSJBYm9ydCBkZWxpbWl0ZXJzICUwMlgsIExvc3QgZnJhbWVzICUwMlhcbiIKKwkJCSJSZWNlaXZlIGNvbmdlc3Rpb24gY291bnQgJTAyWCwgIgorCQkJIkZyYW1lIGNvcGllZCBlcnJvcnMgJTAyWFxuRnJlcXVlbmN5IGVycm9ycyAlMDJYLCAiCisJCQkiVG9rZW4gZXJyb3JzICUwMlhcbiIsCisJCQkoaW50KSByZWFkYih0aS0+c3JiICsgTElORV9FUlJPUlNfT0ZTVCksCisJCQkoaW50KSByZWFkYih0aS0+c3JiICsgSU5URVJOQUxfRVJST1JTX09GU1QpLAorCQkJKGludCkgcmVhZGIodGktPnNyYiArIEJVUlNUX0VSUk9SU19PRlNUKSwKKwkJCShpbnQpIHJlYWRiKHRpLT5zcmIgKyBBQ19FUlJPUlNfT0ZTVCksCisJCQkoaW50KSByZWFkYih0aS0+c3JiICsgQUJPUlRfREVMSU1JVEVSU19PRlNUKSwKKwkJCShpbnQpIHJlYWRiKHRpLT5zcmIgKyBMT1NUX0ZSQU1FU19PRlNUKSwKKwkJCShpbnQpIHJlYWRiKHRpLT5zcmIgKyBSRUNWX0NPTkdFU1RfQ09VTlRfT0ZTVCksCisJCQkoaW50KSByZWFkYih0aS0+c3JiICsgRlJBTUVfQ09QSUVEX0VSUk9SU19PRlNUKSwKKwkJCShpbnQpIHJlYWRiKHRpLT5zcmIgKyBGUkVRVUVOQ1lfRVJST1JTX09GU1QpLAorCQkJKGludCkgcmVhZGIodGktPnNyYiArIFRPS0VOX0VSUk9SU19PRlNUKSk7CisjZW5kaWYKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRFBSSU5USygiVW5rbm93biBjb21tYW5kICUwMlggZW5jb3VudGVyZWRcbiIsCisJCQkJCQkoaW50KSByZWFkYih0aS0+c3JiKSk7CisgICAgICAgIAl9CS8qIGVuZCBzd2l0Y2ggU1JCIGNvbW1hbmQgY2hlY2sgKi8KKwkJd3JpdGViKH5TUkJfUkVTUF9JTlQsIHRpLT5tbWlvKyBBQ0FfT0ZGU0VUK0FDQV9SRVNFVCsgSVNSUF9PREQpOworCX0JLyogaWYgU1JCIHJlc3BvbnNlICovCisJaWYgKHN0YXR1cyAmIEFTQl9GUkVFX0lOVCkgewkvKiBBU0IgcmVzcG9uc2UgKi8KKwkJU0VUX1BBR0UodGktPmFzYl9wYWdlKTsKKyNpZiBUUl9WRVJCT1NFCisJCURQUklOVEsoIkFTQiByZXNwOiBjbWQ9JTAyWFxuIiwgcmVhZGIodGktPmFzYikpOworI2VuZGlmCisKKwkJc3dpdGNoIChyZWFkYih0aS0+YXNiKSkgewkvKiBBU0IgY29tbWFuZCBjaGVjayAqLworCQljYXNlIFJFQ19EQVRBOgorCQljYXNlIFhNSVRfVUlfRlJBTUU6CisJCWNhc2UgWE1JVF9ESVJfRlJBTUU6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURQUklOVEsoInVua25vd24gY29tbWFuZCBpbiBhc2IgJTAyWFxuIiwKKwkJCQkJCShpbnQpIHJlYWRiKHRpLT5hc2IpKTsKKwkJfQkvKiBzd2l0Y2ggQVNCIGNvbW1hbmQgY2hlY2sgKi8KKwkJaWYgKHJlYWRiKHRpLT5hc2IgKyAyKSAhPSAweGZmKQkvKiBjaGVja3MgcmV0X2NvZGUgKi8KKwkJCURQUklOVEsoIkFTQiBlcnJvciAlMDJYIGluIGNtZCAlMDJYXG4iLAorCQkJCShpbnQpIHJlYWRiKHRpLT5hc2IgKyAyKSwgKGludCkgcmVhZGIodGktPmFzYikpOworCQl3cml0ZWIofkFTQl9GUkVFX0lOVCwgdGktPm1taW8rIEFDQV9PRkZTRVQrQUNBX1JFU0VUKyBJU1JQX09ERCk7CisJfQkvKiBpZiBBU0IgcmVzcG9uc2UgKi8KKworI2RlZmluZSBTVEFUVVNfT0ZTVCAgICAgICAgICAgICA2CisjZGVmaW5lIE5FVFdfU1RBVFVTX09GU1QgICAgICAgIDYKKworCWlmIChzdGF0dXMgJiBBUkJfQ01EX0lOVCkgewkvKiBBUkIgcmVzcG9uc2UgKi8KKwkJU0VUX1BBR0UodGktPmFyYl9wYWdlKTsKKyNpZiBUUl9WRVJCT1NFCisJCURQUklOVEsoIkFSQiByZXNwOiBjbWQ9JTAyWFxuIiwgcmVhZGIodGktPmFyYikpOworI2VuZGlmCisKKwkJc3dpdGNoIChyZWFkYih0aS0+YXJiKSkgewkvKiBBUkIgY29tbWFuZCBjaGVjayAqLworCQljYXNlIERMQ19TVEFUVVM6CisJCQlEUFJJTlRLKCJETENfU1RBVFVTIG5ldyBzdGF0dXM6ICUwMlggb24gc3RhdGlvbiAlMDJYXG4iLAorCQkJCW50b2hzKHJlYWR3KHRpLT5hcmIgKyBTVEFUVVNfT0ZTVCkpLAorCQkJCW50b2hzKHJlYWR3KHRpLT5hcmIrIFNUQVRJT05fSURfT0ZTVCkpKTsKKwkJCWJyZWFrOworCQljYXNlIFJFQ19EQVRBOgorCQkJdHJfcngoZGV2KTsKKwkJCWJyZWFrOworCQljYXNlIFJJTkdfU1RBVF9DSEFOR0U6eworCQkJdW5zaWduZWQgc2hvcnQgcmluZ19zdGF0dXM7CisJCQlyaW5nX3N0YXR1cz0gbnRvaHMocmVhZHcodGktPmFyYiArIE5FVFdfU1RBVFVTX09GU1QpKTsKKwkJCWlmIChpYm10cl9kZWJ1Z190cmFjZSAmIFRSQ19JTklUKQorCQkJCURQUklOVEsoIlJpbmcgU3RhdHVzIENoYW5nZS4uLigweCV4KVxuIiwKKwkJCQkJCQkJcmluZ19zdGF0dXMpOworCQkJaWYocmluZ19zdGF0dXMmIChSRU1PVkVfUkVDVnxBVVRPX1JFTU9WQUx8TE9CRV9GQVVMVCkpeworCQkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCQlkZXYtPmZsYWdzICY9IH5JRkZfUlVOTklORzsvKm5vdCB0eXBpY2FsIExpbnV4Ki8KKwkJCQlEUFJJTlRLKCJSZW1vdmUgcmVjZWl2ZWQsIG9yIEF1dG8tcmVtb3ZhbCBlcnJvciIKKwkJCQkJIiwgb3IgTG9iZSBmYXVsdFxuIik7CisJCQkJRFBSSU5USygiV2UnbGwgdHJ5IHRvIHJlb3BlbiB0aGUgY2xvc2VkIGFkYXB0ZXIiCisJCQkJCSIgYWZ0ZXIgYSAlZCBzZWNvbmQgZGVsYXkuXG4iLAorCQkJCQkJVFJfUkVUUllfSU5URVJWQUwvSFopOworCQkJCS8qSSB3YXMgY29uZnVzZWQ6IEkgc2F3IHRoZSBUUiByZW9wZW5pbmcgYnV0ICovCisJCQkJLypmb3Jnb3Q6d2l0aCBhbiBSSjQ1IGluIGFuIFJKNDUvSUNTIGFkYXB0ZXIgKi8KKwkJCQkvKmJ1dCBhZGFwdGVyIG5vdCBpbiB0aGUgcmluZywgdGhlIFRSIHdpbGwgICAqLworCQkJCS8qIG9wZW4sIGFuZCB0aGVuIHNvb24gY2xvc2UgYW5kIGNvbWUgaGVyZS4gICovCisJCQkJdGktPm9wZW5fbW9kZSA9IEFVVE9NQVRJQzsKKwkJCQl0aS0+b3Blbl9zdGF0dXMgPSBDTE9TRUQ7IC8qMTIvMjAwMCBCTVMqLworCQkJCXRpLT5vcGVuX2FjdGlvbiA9IFJFT1BFTjsKKwkJCQlpYm10cl9yZXNldF90aW1lcigmKHRpLT50cl90aW1lciksIGRldik7CisJCQl9IGVsc2UgaWYgKHJpbmdfc3RhdHVzICYgTE9HX09WRVJGTE9XKSB7CisJCQkJaWYobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQorCQkJCQl0aS0+cmVhZGxvZ19wZW5kaW5nID0gMTsKKwkJCQllbHNlCisJCQkJCWlibXRyX3JlYWRsb2coZGV2KTsKKwkJCX0KKwkJCWJyZWFrOworICAgICAgICAgIAl9CisJCWNhc2UgWE1JVF9EQVRBX1JFUToKKwkJCXRyX3R4KGRldik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURQUklOVEsoIlVua25vd24gY29tbWFuZCAlMDJYIGluIGFyYlxuIiwKKwkJCQkJCShpbnQpIHJlYWRiKHRpLT5hcmIpKTsKKwkJCWJyZWFrOworCQl9CS8qIHN3aXRjaCBBUkIgY29tbWFuZCBjaGVjayAqLworCQl3cml0ZWIofkFSQl9DTURfSU5ULCB0aS0+bW1pbysgQUNBX09GRlNFVCtBQ0FfUkVTRVQgKyBJU1JQX09ERCk7CisJCXdyaXRlYihBUkJfRlJFRSwgdGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1NFVCArIElTUkFfT0REKTsKKwl9CS8qIGlmIEFSQiByZXNwb25zZSAqLworCWlmIChzdGF0dXMgJiBTU0JfUkVTUF9JTlQpIHsJLyogU1NCIHJlc3BvbnNlICovCisJCXVuc2lnbmVkIGNoYXIgcmV0Y29kZTsKKwkJU0VUX1BBR0UodGktPnNzYl9wYWdlKTsKKyNpZiBUUl9WRVJCT1NFCisJCURQUklOVEsoIlNTQiByZXNwOiBjbWQ9JTAyWCByc3A9JTAyWFxuIiwKKwkJCQlyZWFkYih0aS0+c3NiKSwgcmVhZGIodGktPnNzYiArIDIpKTsKKyNlbmRpZgorCisJCXN3aXRjaCAocmVhZGIodGktPnNzYikpIHsJLyogU1NCIGNvbW1hbmQgY2hlY2sgKi8KKwkJY2FzZSBYTUlUX0RJUl9GUkFNRToKKwkJY2FzZSBYTUlUX1VJX0ZSQU1FOgorCQkJcmV0Y29kZSA9IHJlYWRiKHRpLT5zc2IgKyAyKTsKKwkJCWlmIChyZXRjb2RlICYmIChyZXRjb2RlICE9IDB4MjIpKS8qIGNoZWNrcyByZXRfY29kZSAqLworCQkJCURQUklOVEsoInhtaXQgcmV0X2NvZGU6ICUwMlggeG1pdCBlcnJvciBjb2RlOiAiCisJCQkJCSIlMDJYXG4iLAorCQkJCQkoaW50KXJldGNvZGUsIChpbnQpcmVhZGIodGktPnNzYiArIDYpKTsKKwkJCWVsc2UKKwkJCQl0aS0+dHJfc3RhdHMudHhfcGFja2V0cysrOworCQkJYnJlYWs7CisJCWNhc2UgWE1JVF9YSURfQ01EOgorCQkJRFBSSU5USygieG1pdCB4aWQgcmV0X2NvZGU6ICUwMlhcbiIsCisJCQkJCQkoaW50KSByZWFkYih0aS0+c3NiICsgMikpOworCQlkZWZhdWx0OgorCQkJRFBSSU5USygiVW5rbm93biBjb21tYW5kICUwMlggaW4gc3NiXG4iLAorCQkJCQkJKGludCkgcmVhZGIodGktPnNzYikpOworCQl9CS8qIFNTQiBjb21tYW5kIGNoZWNrICovCisJCXdyaXRlYih+U1NCX1JFU1BfSU5ULCB0aS0+bW1pbysgQUNBX09GRlNFVCtBQ0FfUkVTRVQrIElTUlBfT0REKTsKKwkJd3JpdGViKFNTQl9GUkVFLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfU0VUICsgSVNSQV9PREQpOworCX0JLyogaWYgU1NCIHJlc3BvbnNlICovCisjaWZkZWYgRU5BQkxFX1BBR0lORworCXdyaXRlYihzYXZlX3NycHIsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9SVyArIFNSUFJfRVZFTik7CisjZW5kaWYKKwl3cml0ZWIoSU5UX0VOQUJMRSwgdGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1NFVCArIElTUlBfRVZFTik7CisJc3Bpbl91bmxvY2soJih0aS0+bG9jaykpOworCXJldHVybiBJUlFfSEFORExFRDsKK30JCQkJLyp0b2tfaW50ZXJydXB0ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJTklUX1NUQVRVU19PRlNUICAgICAgICAxCisjZGVmaW5lIElOSVRfU1RBVFVTXzJfT0ZTVCAgICAgIDIKKyNkZWZpbmUgRU5DT0RFRF9BRERSRVNTX09GU1QgICAgOAorCitzdGF0aWMgdm9pZCBpbml0aWFsX3Rva19pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCV9fdTMyIGVuY29kZWRfYWRkciwgaHdfZW5jb2RlZF9hZGRyOworCXN0cnVjdCB0b2tfaW5mbyAqdGk7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgaW5pdF9zdGF0dXM7IC8qQk1TIDEyLzIwMDAqLworCisJdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKKworCXRpLT5kb190b2tfaW50ID0gTk9UX0ZJUlNUOworCisJLyogd2UgYXNzaWduIHRoZSBzaGFyZWQtcmFtIGFkZHJlc3MgZm9yIElTQSBkZXZpY2VzICovCisJd3JpdGViKHRpLT5zcmFtX2Jhc2UsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9SVyArIFJSUl9FVkVOKTsKKyNpZm5kZWYgUENNQ0lBCisgICAgICAgIHRpLT5zcmFtX3ZpcnQgPSBpb3JlbWFwKCgoX191MzIpdGktPnNyYW1fYmFzZSA8PCAxMiksIHRpLT5hdmFpbF9zaGFyZWRfcmFtKTsKKyNlbmRpZgorCXRpLT5pbml0X3NyYiA9IG1hcF9hZGRyZXNzKHRpLAorCQludG9ocyhyZWFkdyh0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBXUkJSX0VWRU4pKSwKKwkJJnRpLT5pbml0X3NyYl9wYWdlKTsKKwlpZiAodGktPnBhZ2VfbWFzayAmJiB0aS0+YXZhaWxfc2hhcmVkX3JhbSA9PSAxMjcpIHsKKwkJdm9pZCBfX2lvbWVtICpsYXN0XzUxMjsKKwkJX191OCBsYXN0XzUxMl9wYWdlPTA7CisJCWludCBpOworCQlsYXN0XzUxMiA9IG1hcF9hZGRyZXNzKHRpLCAweGZlMDAsICZsYXN0XzUxMl9wYWdlKTsKKwkJLyogaW5pdGlhbGl6ZSBoaWdoIHNlY3Rpb24gb2YgcmFtIChpZiBuZWNlc3NhcnkpICovCisJCVNFVF9QQUdFKGxhc3RfNTEyX3BhZ2UpOworCQlmb3IgKGkgPSAwOyBpIDwgNTEyOyBpKyspCisJCQl3cml0ZWIoMCwgbGFzdF81MTIgKyBpKTsKKwl9CisJU0VUX1BBR0UodGktPmluaXRfc3JiX3BhZ2UpOworCisjaWYgVFJfVkVSQk9TRQorCXsKKwlpbnQgaTsKKworCURQUklOVEsoInRpLT5pbml0X3NyYl9wYWdlPTB4JXhcbiIsIHRpLT5pbml0X3NyYl9wYWdlKTsKKwlEUFJJTlRLKCJpbml0X3NyYiglcCk6IiwgdGktPmluaXRfc3JiICk7CisJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspCisJCXByaW50aygiJTAyWCAiLCAoaW50KSByZWFkYih0aS0+aW5pdF9zcmIgKyBpKSk7CisJcHJpbnRrKCJcbiIpOworCX0KKyNlbmRpZgorCisJaHdfZW5jb2RlZF9hZGRyID0gcmVhZHcodGktPmluaXRfc3JiICsgRU5DT0RFRF9BRERSRVNTX09GU1QpOworCWVuY29kZWRfYWRkciA9IG50b2hzKGh3X2VuY29kZWRfYWRkcik7CisgICAgICAgIGluaXRfc3RhdHVzPSAvKkJNUyAxMi8yMDAwIGNoZWNrIGZvciBzaGFsbG93IG1vZGUgcG9zc2liaWxpdHkgKFR1cmJvKSovCisJcmVhZGIodGktPmluaXRfc3JiK29mZnNldG9mKHN0cnVjdCBzcmJfaW5pdF9yZXNwb25zZSxpbml0X3N0YXR1cykpOworCS8qcHJpbnRrKCJJbml0aWFsIGludGVycnVwdDogaW5pdF9zdGF0dXM9IDB4JTAyeFxuIixpbml0X3N0YXR1cyk7Ki8KKwl0aS0+cmluZ19zcGVlZCA9IGluaXRfc3RhdHVzICYgMHgwMSA/IDE2IDogNDsKKwlEUFJJTlRLKCJJbml0aWFsIGludGVycnVwdCA6ICVkIE1icHMsIHNoYXJlZCBSQU0gYmFzZSAlMDh4LlxuIiwKKwkJCQl0aS0+cmluZ19zcGVlZCwgKHVuc2lnbmVkIGludClkZXYtPm1lbV9zdGFydCk7CisJdGktPmF1dG9fc3BlZWRzYXZlPXJlYWRiKHRpLT5pbml0X3NyYitJTklUX1NUQVRVU18yX09GU1QpJjQ/VFJVRTpGQUxTRTsKKworICAgICAgICBpZiAodGktPm9wZW5fbW9kZSA9PSBNQU5VQUwpCXdha2VfdXAoJnRpLT53YWl0X2Zvcl9yZXNldCk7CisJZWxzZQkJCQl0b2tfb3Blbl9hZGFwdGVyKCh1bnNpZ25lZCBsb25nKWRldik7CisgICAgICAgIAorfSAvKmluaXRpYWxfdG9rX2ludCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDTURfQ09SUkVMQVRFX09GU1QgICAgICAxCisjZGVmaW5lIERIQl9BRERSRVNTX09GU1QgICAgICAgIDYKKworI2RlZmluZSBGUkFNRV9MRU5HVEhfT0ZTVCAgICAgICA2CisjZGVmaW5lIEhFQURFUl9MRU5HVEhfT0ZTVCAgICAgIDgKKyNkZWZpbmUgUlNBUF9WQUxVRV9PRlNUICAgICAgICAgOQorCitzdGF0aWMgdm9pZCB0cl90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0b2tfaW5mbyAqdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgdHJoX2hkciAqdHJoZHIgPSAoc3RydWN0IHRyaF9oZHIgKikgdGktPmN1cnJlbnRfc2tiLT5kYXRhOworCXVuc2lnbmVkIGludCBoZHJfbGVuOworCV9fdTMyIGRoYj0wLGRoYl9iYXNlOworCXZvaWQgX19pb21lbSAqZGhidWYgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgeG1pdF9jb21tYW5kOworCWludCBpLGRoYl9sZW49MHg0MDAwLHNyY19sZW4sc3JjX29mZnNldDsKKwlzdHJ1Y3QgdHJsbGMgKmxsYzsKKwlzdHJ1Y3Qgc3JiX3htaXQgeHNyYjsKKwlfX3U4IGRoYl9wYWdlID0gMDsKKwlfX3U4IGxsY19zc2FwOworCisJU0VUX1BBR0UodGktPmFzYl9wYWdlKTsKKworCWlmIChyZWFkYih0aS0+YXNiK1JFVENPREVfT0ZTVCkgIT0gMHhGRikgRFBSSU5USygiQVNCIG5vdCBmcmVlICEhIVxuIik7CisKKwkvKiBpbiBwcm92aWRpbmcgdGhlIHRyYW5zbWl0IGludGVycnVwdHMsIGlzIHRlbGxpbmcgdXMgaXQgaXMgcmVhZHkgZm9yCisJICAgZGF0YSBhbmQgcHJvdmlkaW5nIGEgc2hhcmVkIG1lbW9yeSBhZGRyZXNzIGZvciB1cyB0byBzdHVmZiB3aXRoIGRhdGEuCisJICAgSGVyZSB3ZSBjb21wdXRlIHRoZSBlZmZlY3RpdmUgYWRkcmVzcyB3aGVyZSB3ZSB3aWxsIHBsYWNlIGRhdGEuCisJKi8KKwlTRVRfUEFHRSh0aS0+YXJiX3BhZ2UpOworCWRoYj1kaGJfYmFzZT1udG9ocyhyZWFkdyh0aS0+YXJiICsgREhCX0FERFJFU1NfT0ZTVCkpOworCWlmICh0aS0+cGFnZV9tYXNrKSB7CisJCWRoYl9wYWdlID0gKGRoYl9iYXNlID4+IDgpICYgdGktPnBhZ2VfbWFzazsKKwkJZGhiPWRoYl9iYXNlICYgfih0aS0+cGFnZV9tYXNrIDw8IDgpOworCX0KKwlkaGJ1ZiA9IHRpLT5zcmFtX3ZpcnQgKyBkaGI7CisKKwkvKiBGaWd1cmUgb3V0IHRoZSBzaXplIG9mIHRoZSA4MDIuNSBoZWFkZXIgKi8KKwlpZiAoISh0cmhkci0+c2FkZHJbMF0gJiAweDgwKSkJLyogUklGIHByZXNlbnQ/ICovCisJCWhkcl9sZW4gPSBzaXplb2Yoc3RydWN0IHRyaF9oZHIpIC0gVFJfTUFYUklGTEVOOworCWVsc2UKKwkJaGRyX2xlbiA9ICgobnRvaHModHJoZHItPnJjZikgJiBUUl9SQ0ZfTEVOX01BU0spID4+IDgpCisJCSAgICArIHNpemVvZihzdHJ1Y3QgdHJoX2hkcikgLSBUUl9NQVhSSUZMRU47CisKKwlsbGMgPSAoc3RydWN0IHRybGxjICopICh0aS0+Y3VycmVudF9za2ItPmRhdGEgKyBoZHJfbGVuKTsKKworCWxsY19zc2FwID0gbGxjLT5zc2FwOworCVNFVF9QQUdFKHRpLT5zcmJfcGFnZSk7CisJbWVtY3B5X2Zyb21pbygmeHNyYiwgdGktPnNyYiwgc2l6ZW9mKHhzcmIpKTsKKwlTRVRfUEFHRSh0aS0+YXNiX3BhZ2UpOworCXhtaXRfY29tbWFuZCA9IHhzcmIuY29tbWFuZDsKKworCXdyaXRlYih4bWl0X2NvbW1hbmQsIHRpLT5hc2IgKyBDT01NQU5EX09GU1QpOworCXdyaXRldyh4c3JiLnN0YXRpb25faWQsIHRpLT5hc2IgKyBTVEFUSU9OX0lEX09GU1QpOworCXdyaXRlYihsbGNfc3NhcCwgdGktPmFzYiArIFJTQVBfVkFMVUVfT0ZTVCk7CisJd3JpdGViKHhzcmIuY21kX2NvcnIsIHRpLT5hc2IgKyBDTURfQ09SUkVMQVRFX09GU1QpOworCXdyaXRlYigwLCB0aS0+YXNiICsgUkVUQ09ERV9PRlNUKTsKKwlpZiAoKHhtaXRfY29tbWFuZCA9PSBYTUlUX1hJRF9DTUQpIHx8ICh4bWl0X2NvbW1hbmQgPT0gWE1JVF9URVNUX0NNRCkpIHsKKwkJd3JpdGV3KGh0b25zKDB4MTEpLCB0aS0+YXNiICsgRlJBTUVfTEVOR1RIX09GU1QpOworCQl3cml0ZWIoMHgwZSwgdGktPmFzYiArIEhFQURFUl9MRU5HVEhfT0ZTVCk7CisJCVNFVF9QQUdFKGRoYl9wYWdlKTsKKwkJd3JpdGViKEFDLCBkaGJ1Zik7CisJCXdyaXRlYihMTENfRlJBTUUsIGRoYnVmICsgMSk7CisJCWZvciAoaSA9IDA7IGkgPCBUUl9BTEVOOyBpKyspCisJCQl3cml0ZWIoKGludCkgMHgwRkYsIGRoYnVmICsgaSArIDIpOworCQlmb3IgKGkgPSAwOyBpIDwgVFJfQUxFTjsgaSsrKQorCQkJd3JpdGViKDAsIGRoYnVmICsgaSArIFRSX0FMRU4gKyAyKTsKKwkJd3JpdGViKFJFU1BfSU5fQVNCLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfU0VUICsgSVNSQV9PREQpOworCQlyZXR1cm47CisJfQorCS8qCisJICogICAgdGhlIHRva2VuIHJpbmcgcGFja2V0IGlzIGNvcGllZCBmcm9tIHNrX2J1ZmYgdG8gdGhlIGFkYXB0ZXIKKwkgKiAgICBidWZmZXIgaWRlbnRpZmllZCBpbiB0aGUgY29tbWFuZCBkYXRhIHJlY2VpdmVkIHdpdGggdGhlIGludGVycnVwdC4KKwkgKi8KKwl3cml0ZWIoaGRyX2xlbiwgdGktPmFzYiArIEhFQURFUl9MRU5HVEhfT0ZTVCk7CisJd3JpdGV3KGh0b25zKHRpLT5jdXJyZW50X3NrYi0+bGVuKSwgdGktPmFzYiArIEZSQU1FX0xFTkdUSF9PRlNUKTsKKwlzcmNfbGVuPXRpLT5jdXJyZW50X3NrYi0+bGVuOworCXNyY19vZmZzZXQ9MDsKKwlkaGI9ZGhiX2Jhc2U7CisJd2hpbGUoMSkgeworCQlpZiAodGktPnBhZ2VfbWFzaykgeworCQkJZGhiX3BhZ2U9KGRoYiA+PiA4KSAmIHRpLT5wYWdlX21hc2s7CisJCQlkaGI9ZGhiICYgfih0aS0+cGFnZV9tYXNrIDw8IDgpOworCQkJZGhiX2xlbj0weDQwMDAtZGhiOyAvKiByZW1haW5pbmcgc2l6ZSBvZiB0aGlzIHBhZ2UgKi8KKwkJfQorCQlkaGJ1ZiA9IHRpLT5zcmFtX3ZpcnQgKyBkaGI7CisJCVNFVF9QQUdFKGRoYl9wYWdlKTsKKwkJaWYgKHNyY19sZW4gPiBkaGJfbGVuKSB7CisJCQltZW1jcHlfdG9pbyhkaGJ1ZiwmdGktPmN1cnJlbnRfc2tiLT5kYXRhW3NyY19vZmZzZXRdLAorCQkJCQlkaGJfbGVuKTsKKwkJCXNyY19sZW4gLT0gZGhiX2xlbjsKKwkJCXNyY19vZmZzZXQgKz0gZGhiX2xlbjsKKwkJCWRoYl9iYXNlKz1kaGJfbGVuOworCQkJZGhiPWRoYl9iYXNlOworCQkJY29udGludWU7CisJCX0KKwkJbWVtY3B5X3RvaW8oZGhidWYsICZ0aS0+Y3VycmVudF9za2ItPmRhdGFbc3JjX29mZnNldF0sIHNyY19sZW4pOworCQlicmVhazsKKwl9CisJd3JpdGViKFJFU1BfSU5fQVNCLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfU0VUICsgSVNSQV9PREQpOworCXRpLT50cl9zdGF0cy50eF9ieXRlcyArPSB0aS0+Y3VycmVudF9za2ItPmxlbjsKKwlkZXZfa2ZyZWVfc2tiX2lycSh0aS0+Y3VycmVudF9za2IpOworCXRpLT5jdXJyZW50X3NrYiA9IE5VTEw7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCWlmICh0aS0+cmVhZGxvZ19wZW5kaW5nKQorCQlpYm10cl9yZWFkbG9nKGRldik7Cit9CQkJCS8qdHJfdHggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNkZWZpbmUgUkVDRUlWRV9CVUZGRVJfT0ZTVCAgICAgNgorI2RlZmluZSBMQU5fSERSX0xFTkdUSF9PRlNUICAgICA4CisjZGVmaW5lIERMQ19IRFJfTEVOR1RIX09GU1QgICAgIDkKKworI2RlZmluZSBEU0FQX09GU1QgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNTQVBfT0ZTVCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTExDX09GU1QgICAgICAgICAgICAgICAgMgorI2RlZmluZSBQUk9USURfT0ZTVCAgICAgICAgICAgICAzCisjZGVmaW5lIEVUSEVSVFlQRV9PRlNUICAgICAgICAgIDYKKworc3RhdGljIHZvaWQgdHJfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CisJX191MzIgcmJ1ZmZlcjsKKwl2b2lkIF9faW9tZW0gKnJidWYsICpyYnVmZGF0YSwgKmxsYzsKKwlfX3U4IHJidWZmZXJfcGFnZSA9IDA7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwl1bnNpZ25lZCBpbnQgcmJ1ZmZlcl9sZW4sIGxhbl9oZHJfbGVuLCBoZHJfbGVuLCBpcF9sZW4sIGxlbmd0aDsKKwl1bnNpZ25lZCBjaGFyIGRsY19oZHJfbGVuOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgaW50IHNrYl9zaXplID0gMDsKKwlpbnQgSVB2NF9wID0gMDsKKwl1bnNpZ25lZCBpbnQgY2hrc3VtID0gMDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwlzdHJ1Y3QgYXJiX3JlY19yZXEgcmFyYjsKKworCVNFVF9QQUdFKHRpLT5hcmJfcGFnZSk7CisJbWVtY3B5X2Zyb21pbygmcmFyYiwgdGktPmFyYiwgc2l6ZW9mKHJhcmIpKTsKKwlyYnVmZmVyID0gbnRvaHMocmFyYi5yZWNfYnVmX2FkZHIpIDsKKwlyYnVmID0gbWFwX2FkZHJlc3ModGksIHJidWZmZXIsICZyYnVmZmVyX3BhZ2UpOworCisJU0VUX1BBR0UodGktPmFzYl9wYWdlKTsKKworCWlmIChyZWFkYih0aS0+YXNiICsgUkVUQ09ERV9PRlNUKSAhPTB4RkYpIERQUklOVEsoIkFTQiBub3QgZnJlZSAhISFcbiIpOworCisJd3JpdGViKFJFQ19EQVRBLCB0aS0+YXNiICsgQ09NTUFORF9PRlNUKTsKKwl3cml0ZXcocmFyYi5zdGF0aW9uX2lkLCB0aS0+YXNiICsgU1RBVElPTl9JRF9PRlNUKTsKKwl3cml0ZXcocmFyYi5yZWNfYnVmX2FkZHIsIHRpLT5hc2IgKyBSRUNFSVZFX0JVRkZFUl9PRlNUKTsKKworCWxhbl9oZHJfbGVuID0gcmFyYi5sYW5faGRyX2xlbjsKKwlpZiAobGFuX2hkcl9sZW4gPiBzaXplb2Yoc3RydWN0IHRyaF9oZHIpKSB7CisJCURQUklOVEsoIkxpbnV4IGNhbm5vdCBoYW5kbGUgZ3JlYXRlciB0aGFuIDE4IGJ5dGVzIFJJRlxuIik7CisJCXJldHVybjsKKwl9CQkJLypCTVMgSSBhZGRlZCB0aGlzIGFib3ZlIGp1c3QgdG8gYmUgdmVyeSBzYWZlICovCisJZGxjX2hkcl9sZW4gPSByZWFkYih0aS0+YXJiICsgRExDX0hEUl9MRU5HVEhfT0ZTVCk7CisJaGRyX2xlbiA9IGxhbl9oZHJfbGVuICsgc2l6ZW9mKHN0cnVjdCB0cmxsYykgKyBzaXplb2Yoc3RydWN0IGlwaGRyKTsKKworCVNFVF9QQUdFKHJidWZmZXJfcGFnZSk7CisJbGxjID0gcmJ1ZiArIG9mZnNldG9mKHN0cnVjdCByZWNfYnVmLCBkYXRhKSArIGxhbl9oZHJfbGVuOworCisjaWYgVFJfVkVSQk9TRQorCURQUklOVEsoIm9mZnNldG9mIGRhdGE6ICUwMlggbGFuX2hkcl9sZW46ICUwMlhcbiIsCisJKF9fdTMyKSBvZmZzZXRvZihzdHJ1Y3QgcmVjX2J1ZiwgZGF0YSksICh1bnNpZ25lZCBpbnQpIGxhbl9oZHJfbGVuKTsKKwlEUFJJTlRLKCJsbGM6ICUwOFggcmVjX2J1Zl9hZGRyOiAlMDRYIGRldi0+bWVtX3N0YXJ0OiAlbFhcbiIsCisJCWxsYywgbnRvaHMocmFyYi5yZWNfYnVmX2FkZHIpLCBkZXYtPm1lbV9zdGFydCk7CisJRFBSSU5USygiZHNhcDogJTAyWCwgc3NhcDogJTAyWCwgbGxjOiAlMDJYLCBwcm90aWQ6ICUwMlglMDJYJTAyWCwgIgorCQkiZXRoZXJ0eXBlOiAlMDRYXG4iLAorCQkoaW50KSByZWFkYihsbGMgKyBEU0FQX09GU1QpLCAoaW50KSByZWFkYihsbGMgKyBTU0FQX09GU1QpLAorCQkoaW50KSByZWFkYihsbGMgKyBMTENfT0ZTVCksIChpbnQpIHJlYWRiKGxsYyArIFBST1RJRF9PRlNUKSwKKwkJKGludCkgcmVhZGIobGxjK1BST1RJRF9PRlNUKzEpLChpbnQpcmVhZGIobGxjK1BST1RJRF9PRlNUICsgMiksCisJCShpbnQpIG50b2hzKHJlYWR3KGxsYyArIEVUSEVSVFlQRV9PRlNUKSkpOworI2VuZGlmCisJaWYgKHJlYWRiKGxsYyArIG9mZnNldG9mKHN0cnVjdCB0cmxsYywgbGxjKSkgIT0gVUlfQ01EKSB7CisJCVNFVF9QQUdFKHRpLT5hc2JfcGFnZSk7CisJCXdyaXRlYihEQVRBX0xPU1QsIHRpLT5hc2IgKyBSRVRDT0RFX09GU1QpOworCQl0aS0+dHJfc3RhdHMucnhfZHJvcHBlZCsrOworCQl3cml0ZWIoUkVTUF9JTl9BU0IsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9TRVQgKyBJU1JBX09ERCk7CisJCXJldHVybjsKKwl9CisJbGVuZ3RoID0gbnRvaHMocmFyYi5mcmFtZV9sZW4pOworCWlmIChyZWFkYihsbGMgKyBEU0FQX09GU1QpID09IEVYVEVOREVEX1NBUCAmJgorCSAgIHJlYWRiKGxsYyArIFNTQVBfT0ZTVCkgPT0gRVhURU5ERURfU0FQICYmCisJCWxlbmd0aCA+PSBoZHJfbGVuKQlJUHY0X3AgPSAxOworI2lmIFRSX1ZFUkJPU0UKKyNkZWZpbmUgU0FERFJfT0ZTVAk4CisjZGVmaW5lIERBRERSX09GU1QJMgorCisJaWYgKCFJUHY0X3ApIHsKKworCQl2b2lkIF9faW9tZW0gKnRyaGhkciA9IHJidWYgKyBvZmZzZXRvZihzdHJ1Y3QgcmVjX2J1ZiwgZGF0YSk7CisKKwkJRFBSSU5USygiUHJvYmFibHkgbm9uLUlQIGZyYW1lIHJlY2VpdmVkLlxuIik7CisJCURQUklOVEsoInNzYXA6ICUwMlggZHNhcDogJTAyWCAiCisJCQkic2FkZHI6ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYICIKKwkJCSJkYWRkcjogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJCQlyZWFkYihsbGMgKyBTU0FQX09GU1QpLCByZWFkYihsbGMgKyBEU0FQX09GU1QpLAorCQkJcmVhZGIodHJoaGRyK1NBRERSX09GU1QpLCByZWFkYih0cmhoZHIrIFNBRERSX09GU1QrMSksCisJCQlyZWFkYih0cmhoZHIrU0FERFJfT0ZTVCsyKSwgcmVhZGIodHJoaGRyK1NBRERSX09GU1QrMyksCisJCQlyZWFkYih0cmhoZHIrU0FERFJfT0ZTVCs0KSwgcmVhZGIodHJoaGRyK1NBRERSX09GU1QrNSksCisJCQlyZWFkYih0cmhoZHIrREFERFJfT0ZTVCksIHJlYWRiKHRyaGhkcitEQUREUl9PRlNUICsgMSksCisJCQlyZWFkYih0cmhoZHIrREFERFJfT0ZTVCsyKSwgcmVhZGIodHJoaGRyK0RBRERSX09GU1QrMyksCisJCQlyZWFkYih0cmhoZHIrREFERFJfT0ZTVCs0KSwgcmVhZGIodHJoaGRyK0RBRERSX09GU1QrNSkpOworCX0KKyNlbmRpZgorCisJLypCTVMgaGFuZGxlIHRoZSBjYXNlIHNoZSBjb21lcyBpbiB3aXRoIGZldyBob3BzIGJ1dCBsZWF2ZXMgd2l0aCBtYW55ICovCisgICAgICAgIHNrYl9zaXplPWxlbmd0aC1sYW5faGRyX2xlbitzaXplb2Yoc3RydWN0IHRyaF9oZHIpK3NpemVvZihzdHJ1Y3QgdHJsbGMpOworCisJaWYgKCEoc2tiID0gZGV2X2FsbG9jX3NrYihza2Jfc2l6ZSkpKSB7CisJCURQUklOVEsoIm91dCBvZiBtZW1vcnkuIGZyYW1lIGRyb3BwZWQuXG4iKTsKKwkJdGktPnRyX3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJU0VUX1BBR0UodGktPmFzYl9wYWdlKTsKKwkJd3JpdGViKERBVEFfTE9TVCwgdGktPmFzYiArIG9mZnNldG9mKHN0cnVjdCBhc2JfcmVjLCByZXRfY29kZSkpOworCQl3cml0ZWIoUkVTUF9JTl9BU0IsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9TRVQgKyBJU1JBX09ERCk7CisJCXJldHVybjsKKwl9CisJLypCTVMgYWdhaW4sIGlmIHNoZSBjb21lcyBpbiB3aXRoIGZldyBidXQgbGVhdmVzIHdpdGggbWFueSAqLworCXNrYl9yZXNlcnZlKHNrYiwgc2l6ZW9mKHN0cnVjdCB0cmhfaGRyKSAtIGxhbl9oZHJfbGVuKTsKKwlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKKwlza2ItPmRldiA9IGRldjsKKwlkYXRhID0gc2tiLT5kYXRhOworCXJidWZmZXJfbGVuID0gbnRvaHMocmVhZHcocmJ1ZiArIG9mZnNldG9mKHN0cnVjdCByZWNfYnVmLCBidWZfbGVuKSkpOworCXJidWZkYXRhID0gcmJ1ZiArIG9mZnNldG9mKHN0cnVjdCByZWNfYnVmLCBkYXRhKTsKKworCWlmIChJUHY0X3ApIHsKKwkJLyogQ29weSB0aGUgaGVhZGVycyB3aXRob3V0IGNoZWNrc3VtbWluZyAqLworCQltZW1jcHlfZnJvbWlvKGRhdGEsIHJidWZkYXRhLCBoZHJfbGVuKTsKKworCQkvKiBXYXRjaCBmb3IgcGFkZGVkIHBhY2tldHMgYW5kIGJvZ29ucyAqLworCQlpcGg9IChzdHJ1Y3QgaXBoZHIgKikoZGF0YSsgbGFuX2hkcl9sZW4gKyBzaXplb2Yoc3RydWN0IHRybGxjKSk7CisJCWlwX2xlbiA9IG50b2hzKGlwaC0+dG90X2xlbikgLSBzaXplb2Yoc3RydWN0IGlwaGRyKTsKKwkJbGVuZ3RoIC09IGhkcl9sZW47CisJCWlmICgoaXBfbGVuIDw9IGxlbmd0aCkgJiYgKGlwX2xlbiA+IDcpKQorCQkJbGVuZ3RoID0gaXBfbGVuOworCQlkYXRhICs9IGhkcl9sZW47CisJCXJidWZmZXJfbGVuIC09IGhkcl9sZW47CisJCXJidWZkYXRhICs9IGhkcl9sZW47CisJfQorCS8qIENvcHkgdGhlIHBheWxvYWQuLi4gKi8KKyNkZWZpbmUgQlVGRkVSX1BPSU5URVJfT0ZTVAkyCisjZGVmaW5lIEJVRkZFUl9MRU5HVEhfT0ZTVCAgICAgIDYKKwlmb3IgKDs7KSB7CisJCWlmIChpYm10cl9kZWJ1Z190cmFjZSZUUkNfSU5JVFYgJiYgbGVuZ3RoIDwgcmJ1ZmZlcl9sZW4pCisJCQlEUFJJTlRLKCJDVVJJT1VTLCBsZW5ndGg9JWQgPCByYnVmZmVyX2xlbj0lZFxuIiwKKwkJCQkJCWxlbmd0aCxyYnVmZmVyX2xlbik7CisJCWlmIChJUHY0X3ApCisJCQljaGtzdW09Y3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjaygodm9pZCopcmJ1ZmRhdGEsCisJCQkgICAgZGF0YSxsZW5ndGg8cmJ1ZmZlcl9sZW4/bGVuZ3RoOnJidWZmZXJfbGVuLGNoa3N1bSk7CisJCWVsc2UKKwkJCW1lbWNweV9mcm9taW8oZGF0YSwgcmJ1ZmRhdGEsIHJidWZmZXJfbGVuKTsKKwkJcmJ1ZmZlciA9IG50b2hzKHJlYWR3KHJidWYrQlVGRkVSX1BPSU5URVJfT0ZTVCkpIDsKKwkJaWYgKCFyYnVmZmVyKQorCQkJYnJlYWs7CisJCXJidWZmZXIgLT0gMjsKKwkJbGVuZ3RoIC09IHJidWZmZXJfbGVuOworCQlkYXRhICs9IHJidWZmZXJfbGVuOworCQlyYnVmID0gbWFwX2FkZHJlc3ModGksIHJidWZmZXIsICZyYnVmZmVyX3BhZ2UpOworCQlTRVRfUEFHRShyYnVmZmVyX3BhZ2UpOworCQlyYnVmZmVyX2xlbiA9IG50b2hzKHJlYWR3KHJidWYgKyBCVUZGRVJfTEVOR1RIX09GU1QpKTsKKwkJcmJ1ZmRhdGEgPSByYnVmICsgb2Zmc2V0b2Yoc3RydWN0IHJlY19idWYsIGRhdGEpOworCX0KKworCVNFVF9QQUdFKHRpLT5hc2JfcGFnZSk7CisJd3JpdGViKDAsIHRpLT5hc2IgKyBvZmZzZXRvZihzdHJ1Y3QgYXNiX3JlYywgcmV0X2NvZGUpKTsKKworCXdyaXRlYihSRVNQX0lOX0FTQiwgdGktPm1taW8gKyBBQ0FfT0ZGU0VUICsgQUNBX1NFVCArIElTUkFfT0REKTsKKworCXRpLT50cl9zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwl0aS0+dHJfc3RhdHMucnhfcGFja2V0cysrOworCisJc2tiLT5wcm90b2NvbCA9IHRyX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCWlmIChJUHY0X3ApIHsKKwkJc2tiLT5jc3VtID0gY2hrc3VtOworCQlza2ItPmlwX3N1bW1lZCA9IDE7CisJfQorCW5ldGlmX3J4KHNrYik7CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKK30JCQkJLyp0cl9yeCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgaWJtdHJfcmVzZXRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRtciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl0bXItPmV4cGlyZXMgPSBqaWZmaWVzICsgVFJfUkVUUllfSU5URVJWQUw7CisJdG1yLT5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKwl0bXItPmZ1bmN0aW9uID0gdG9rX3JlcnVuOworCWluaXRfdGltZXIodG1yKTsKKwlhZGRfdGltZXIodG1yKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHRva19yZXJ1bih1bnNpZ25lZCBsb25nIGRldl9hZGRyKXsKKworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfYWRkcjsKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CisKKwlpZiAoIHRpLT5vcGVuX2FjdGlvbiA9PSBSRVNUQVJUKXsKKwkJdGktPmRvX3Rva19pbnQgPSBGSVJTVF9JTlQ7CisJCW91dGIoMCwgZGV2LT5iYXNlX2FkZHIgKyBBREFQVFJFU0VUUkVMKTsKKyNpZmRlZiBFTkFCTEVfUEFHSU5HCisJCWlmICh0aS0+cGFnZV9tYXNrKQorCQkJd3JpdGViKFNSUFJfRU5BQkxFX1BBR0lORywKKwkJCQl0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfUlcgKyBTUlBSX0VWRU4pOworI2VuZGlmCisKKwkJd3JpdGViKElOVF9FTkFCTEUsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9TRVQgKyBJU1JQX0VWRU4pOworCX0gZWxzZQorCQl0b2tfb3Blbl9hZGFwdGVyKGRldl9hZGRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGlibXRyX3JlYWRsb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpOworCisJdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKKworCXRpLT5yZWFkbG9nX3BlbmRpbmcgPSAwOworCVNFVF9QQUdFKHRpLT5zcmJfcGFnZSk7CisJd3JpdGViKERJUl9SRUFEX0xPRywgdGktPnNyYik7CisJd3JpdGViKElOVF9FTkFCTEUsIHRpLT5tbWlvICsgQUNBX09GRlNFVCArIEFDQV9TRVQgKyBJU1JQX0VWRU4pOworCXdyaXRlYihDTURfSU5fU1JCLCB0aS0+bW1pbyArIEFDQV9PRkZTRVQgKyBBQ0FfU0VUICsgSVNSQV9PREQpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogdG9rX2dldF9zdGF0cygpOiAgQmFzaWNhbGx5IGEgc2NhZmZvbGQgcm91dGluZSB3aGljaCB3aWxsIHJldHVybgorICAgdGhlIGFkZHJlc3Mgb2YgdGhlIHRyX3N0YXRpc3RpY3Mgc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aAorICAgdGhpcyBkZXZpY2UgLS0gdGhlIHRyLi4uLiBzdHJ1Y3R1cmUgaXMgYW4gZXRobmV0IGxvb2stYWxpa2UKKyAgIHNvIGF0IGxlYXN0IGZvciB0aGlzIGl0ZXJhdGlvbiBtYXkgc3VmZmljZS4gICAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnRva19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCXN0cnVjdCB0b2tfaW5mbyAqdG9raTsKKwl0b2tpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CisJcmV0dXJuIChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKSAmdG9raS0+dHJfc3RhdHM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IGlibXRyX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG10dSkKK3sKKwlzdHJ1Y3QgdG9rX2luZm8gKnRpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CisKKwlpZiAodGktPnJpbmdfc3BlZWQgPT0gMTYgJiYgbXR1ID4gdGktPm1heG10dTE2KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodGktPnJpbmdfc3BlZWQgPT0gNCAmJiBtdHUgPiB0aS0+bWF4bXR1NCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGV2LT5tdHUgPSBtdHU7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBNT0RVTEUKKworLyogM0NPTSAzQzYxOUMgc3VwcG9ydHMgOCBpbnRlcnJ1cHRzLCAzMiBJL08gcG9ydHMgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X2libXRyW0lCTVRSX01BWF9BREFQVEVSU107CitzdGF0aWMgaW50IGlvW0lCTVRSX01BWF9BREFQVEVSU10gPSB7IDB4YTIwLCAweGEyNCB9Oworc3RhdGljIGludCBpcnFbSUJNVFJfTUFYX0FEQVBURVJTXTsKK3N0YXRpYyBpbnQgbWVtW0lCTVRSX01BWF9BREFQVEVSU107CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShtZW0sIGludCwgTlVMTCwgMCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGlibXRyX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgY291bnQ9MDsKKworCWZpbmRfdHVyYm9fYWRhcHRlcnMoaW8pOworCisJZm9yIChpID0gMDsgaW9baV0gJiYgKGkgPCBJQk1UUl9NQVhfQURBUFRFUlMpOyBpKyspIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwkJaXJxW2ldID0gMDsKKwkJbWVtW2ldID0gMDsKKwkJZGV2ID0gYWxsb2NfdHJkZXYoc2l6ZW9mKHN0cnVjdCB0b2tfaW5mbykpOworCQlpZiAoZGV2ID09IE5VTEwpIHsgCisJCQlpZiAoaSA9PSAwKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKwkJZGV2LT5iYXNlX2FkZHIgPSBpb1tpXTsKKwkJZGV2LT5pcnEgPSBpcnFbaV07CisJCWRldi0+bWVtX3N0YXJ0ID0gbWVtW2ldOworCisJCWlmIChpYm10cl9wcm9iZV9jYXJkKGRldikpIHsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQljb250aW51ZTsKKwkJfQorCQlkZXZfaWJtdHJbaV0gPSBkZXY7CisJCWNvdW50Kys7CisJfQorCWlmIChjb3VudCkgcmV0dXJuIDA7CisJcHJpbnRrKCJpYm10cjogcmVnaXN0ZXJfbmV0ZGV2KCkgcmV0dXJuZWQgbm9uLXplcm8uXG4iKTsKKwlyZXR1cm4gLUVJTzsKK30KK21vZHVsZV9pbml0KGlibXRyX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgaWJtdHJfY2xlYW51cCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IElCTVRSX01BWF9BREFQVEVSUzsgaSsrKXsKKwkJaWYgKCFkZXZfaWJtdHJbaV0pCisJCQljb250aW51ZTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2X2libXRyW2ldKTsKKwkJaWJtdHJfY2xlYW51cF9jYXJkKGRldl9pYm10cltpXSk7CisJCWZyZWVfbmV0ZGV2KGRldl9pYm10cltpXSk7CisJfQorfQorbW9kdWxlX2V4aXQoaWJtdHJfY2xlYW51cCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9sYW5zdHJlYW1lci5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2xhbnN0cmVhbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTllMGIwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9sYW5zdHJlYW1lci5jCkBAIC0wLDAgKzEsMjAxMSBAQAorLyoKKyAqICAgbGFuc3RyZWFtZXIuYyAtLSBkcml2ZXIgZm9yIHRoZSBJQk0gQXV0byBMQU5TdHJlYW1lciBQQ0kgQWRhcHRlcgorICoKKyAqICBXcml0dGVuIEJ5OiBNaWtlIFN1bGxpdmFuLCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqICBMaW51eCBkcml2ZXIgZm9yIElCTSBQQ0kgdG9rZW5yaW5nIGNhcmRzIGJhc2VkIG9uIHRoZSBMYW5TdHJlYW1lciBNUEMKKyAqICBjaGlwc2V0LiAKKyAqCisgKiAgVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gdGhlIG9seW1waWMgZHJpdmVyIGZvciBJQk0gUENJIFRva2VuUmluZyBjYXJkcyAoUGl0L1BpdC1QaHkvT2x5bXBpYworICogIGNoaXBzZXRzKSB3cml0dGVuICBieToKKyAqICAgICAgMTk5OSBQZXRlciBEZSBTY2hyaWp2ZXIgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoJMTk5OSBNaWtlIFBoaWxsaXBzIChwaGlsbGltQGFtdHJhay5jb20pCisgKgorICogIEJhc2UgRHJpdmVyIFNrZWxldG9uOgorICogICAgICBXcml0dGVuIDE5OTMtOTQgYnkgRG9uYWxkIEJlY2tlci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKyAqICAgICAgRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAgIAorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgICAKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICAgCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICAgCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAgIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgICAKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogTk8gV0FSUkFOVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAgICAgICAgCisgKiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCAgICAgIAorICogTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgICAgICAKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgICAgCisgKiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kICAgICAgIAorICogZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzICAgICAgICAKKyAqIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byAgICAgCisgKiB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCAgICAgICAgIAorICogcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBESVNDTEFJTUVSIE9GIExJQUJJTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgICAKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCAgICAgICAgCisgKiBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCAgIAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICAgICAKKyAqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgICAgCisgKiBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgIAorICogSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUyAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAgIAorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgICAKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCisgKiAgMTIvMTAvOTkgLSBBbHBoYSBSZWxlYXNlIDAuMS4wCisgKiAgICAgICAgICAgIEZpcnN0IHJlbGVhc2UgdG8gdGhlIHB1YmxpYworICogIDAzLzAzLzAwIC0gTWVyZ2VkIHRvIGtlcm5lbCwgaW5kZW50ZWQgLWtyIC1pOCAtYnJpMCwgZml4ZWQgc29tZSBtaXNzaW5nCisgKgkJbWFsbG9jIGZyZWUgY2hlY2tzLCByZXZpZXdlZCBjb2RlLiA8YWxhbkByZWRoYXQuY29tPgorICogIDAzLzEzLzAwIC0gQWRkZWQgc3BpbmxvY2tzIGZvciBzbXAKKyAqICAwMy8wOC8wMSAtIEFkZGVkIHN1cHBvcnQgZm9yIG1vZHVsZV9pbml0KCkgYW5kIG1vZHVsZV9leGl0KCkKKyAqICAwOC8xNS8wMSAtIEFkZGVkIGlvY3RsKCkgZnVuY3Rpb25hbGl0eSBmb3IgZGVidWdnaW5nLCBjaGFuZ2VkIG5ldGlmXypfcXVldWUKKyAqICAgICAgICAgICAgIGNhbGxzIGFuZCBvdGhlciBpbmNvcnJlY3RuZXNzIC0gS2VudCBZb2RlciA8eW9kZXIxQHVzLmlibS5jb20+CisgKiAgMTEvMDUvMDEgLSBSZXN0cnVjdHVyZWQgdGhlIGludGVycnVwdCBmdW5jdGlvbiwgYWRkZWQgZGVsYXlzLCByZWR1Y2VkIHRoZSAKKyAqICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgVFggZGVzY3JpcHRvcnMgdG8gMSwgd2hpY2ggdG9nZXRoZXIgY2FuIHByZXZlbnQgCisgKiAgICAgICAgICAgICB0aGUgY2FyZCBmcm9tIGxvY2tpbmcgdXAgdGhlIGJveCAtIDx5b2RlcjFAdXMuaWJtLmNvbT4KKyAqICAwOS8yNy8wMiAtIE5ldyBQQ0kgaW50ZXJmYWNlICsgYnVnIGZpeC4gLSA8eW9kZXIxQHVzLmlibS5jb20+CisgKiAgMTEvMTMvMDIgLSBSZW1vdmVkIGZyZWVfaXJxIGNhbGxzIHdoaWNoIGNvdWxkIGNhdXNlIGEgaGFuZywgYWRkZWQKKyAqCSAgICAgICBuZXRpZl9jYXJyaWVyX3tvbnxvZmZ9IC0gPHlvZGVyMUB1cy5pYm0uY29tPgorICogIAorICogIFRvIERvOgorICoKKyAqCisgKiAgSWYgUHJvYmxlbXMgZG8gT2NjdXIKKyAqICBNb3N0IHByb2JsZW1zIGNhbiBiZSByZWN0aWZpZWQgYnkgZWl0aGVyIGNsb3NpbmcgYW5kIG9wZW5pbmcgdGhlIGludGVyZmFjZQorICogIChpZmNvbmZpZyBkb3duIGFuZCB1cCkgb3Igcm1tb2QgYW5kIGluc21vZCdpbmcgdGhlIGRyaXZlciAoYSBiaXQgZGlmZmljdWx0CisgKiAgaWYgY29tcGlsZWQgaW50byB0aGUga2VybmVsKS4KKyAqLworCisvKiBDaGFuZ2UgU1RSRUFNRVJfREVCVUcgdG8gMSB0byBnZXQgdmVyYm9zZSwgYW5kIEkgbWVhbiByZWFsbHkgdmVyYm9zZSwgbWVzc2FnZXMgKi8KKworI2RlZmluZSBTVFJFQU1FUl9ERUJVRyAwCisjZGVmaW5lIFNUUkVBTUVSX0RFQlVHX1BBQ0tFVFMgMAorCisvKiBDaGFuZ2UgU1RSRUFNRVJfTkVUV09SS19NT05JVE9SIHRvIHJlY2VpdmUgbWFjIGZyYW1lcyB0aHJvdWdoIHRoZSBhcmIgY2hhbm5lbC4KKyAqIFdpbGwgYWxzbyBjcmVhdGUgYSAvcHJvYy9uZXQvc3RyZWFtZXJfdHIgZW50cnkgaWYgcHJvY19mcyBpcyBjb21waWxlZCBpbnRvIHRoZQorICoga2VybmVsLgorICogSW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjcmVhdGUgYSByaW5nLWVycm9yIHJlcG9ydGluZyBuZXR3b3JrIG1vZHVsZSAKKyAqIGkuZS4gaXQgd2lsbCBnaXZlIHlvdSB0aGUgc291cmNlIGFkZHJlc3Mgb2YgYmVhY29uZXJzIG9uIHRoZSByaW5nIAorICovCisKKyNkZWZpbmUgU1RSRUFNRVJfTkVUV09SS19NT05JVE9SIDAKKworLyogI2RlZmluZSBDT05GSUdfUFJPQ19GUyAqLworCisvKgorICogIEFsbG93IG9yIGRpc2FsbG93IGlvY3RsJ3MgZm9yIGRlYnVnZ2luZworICovCisKKyNkZWZpbmUgU1RSRUFNRVJfSU9DVEwgMAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdHJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgImxhbnN0cmVhbWVyLmgiCisKKyNpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkKKyNlcnJvciBicm9rZW4gb24gNjQtYml0OiBzdG9yZXMgcG9pbnRlciB0byByeF9yaW5nLT5idWZmZXIgaW4gMzItYml0IGludAorI2VuZGlmCisKKworLyogSSd2ZSBnb3QgdG8gcHV0IHNvbWUgaW50ZWxsaWdlbmNlIGludG8gdGhlIHZlcnNpb24gbnVtYmVyIHNvIHRoYXQgUGV0ZXIgYW5kIEkga25vdworICogd2hpY2ggdmVyc2lvbiBvZiB0aGUgY29kZSBzb21lYm9keSBoYXMgZ290LiAKKyAqIFZlcnNpb24gTnVtYmVyID0gYS5iLmMuZCAgd2hlcmUgYS5iLmMgaXMgdGhlIGxldmVsIG9mIGNvZGUgYW5kIGQgaXMgdGhlIGxhdGVzdCBhdXRob3IuCisgKiBTbyAwLjAuMS5wZHMgPSBQZXRlciwgMC4wLjEubWxwID0gTWlrZQorICogCisgKiBPZmZpY2lhbCByZWxlYXNlcyB3aWxsIG9ubHkgaGF2ZSBhbiBhLmIuYyB2ZXJzaW9uIG51bWJlciBmb3JtYXQuCisgKi8KKworc3RhdGljIGNoYXIgdmVyc2lvbltdID0gIkxhblN0cmVhbWVyLmMgdjAuNC4wIDAzLzA4LzAxIC0gTWlrZSBTdWxsaXZhblxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgdjAuNS4zIDExLzEzLzAyIC0gS2VudCBZb2RlciI7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzdHJlYW1lcl9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0lCTSwgUENJX0RFVklDRV9JRF9JQk1fVFIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwKKwl7fQkvKiB0ZXJtaW5hdGluZyBlbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLHN0cmVhbWVyX3BjaV90YmwpOworCisKK3N0YXRpYyBjaGFyICpvcGVuX21hal9lcnJvcltdID0geworCSJObyBlcnJvciIsICJMb2JlIE1lZGlhIFRlc3QiLCAiUGh5c2ljYWwgSW5zZXJ0aW9uIiwKKwkiQWRkcmVzcyBWZXJpZmljYXRpb24iLCAiTmVpZ2hib3IgTm90aWZpY2F0aW9uIChSaW5nIFBvbGwpIiwKKwkiUmVxdWVzdCBQYXJhbWV0ZXJzIiwgIkZEWCBSZWdpc3RyYXRpb24gUmVxdWVzdCIsCisJIkZEWCBMb2JlIE1lZGlhIFRlc3QiLCAiRkRYIER1cGxpY2F0ZSBBZGRyZXNzIENoZWNrIiwKKwkiVW5rbm93biBzdGFnZSIKK307CisKK3N0YXRpYyBjaGFyICpvcGVuX21pbl9lcnJvcltdID0geworCSJObyBlcnJvciIsICJGdW5jdGlvbiBGYWlsdXJlIiwgIlNpZ25hbCBMb3N0IiwgIldpcmUgRmF1bHQiLAorCSJSaW5nIFNwZWVkIE1pc21hdGNoIiwgIlRpbWVvdXQiLCAiUmluZyBGYWlsdXJlIiwgIlJpbmcgQmVhY29uaW5nIiwKKwkiRHVwbGljYXRlIE5vZGUgQWRkcmVzcyIsICJSZXF1ZXN0IFBhcmFtZXRlcnMiLCAiUmVtb3ZlIFJlY2VpdmVkIiwKKwkiUmVzZXJ2ZWQiLCAiUmVzZXJ2ZWQiLCAiTm8gTW9uaXRvciBEZXRlY3RlZCBmb3IgUlBMIiwKKwkiTW9uaXRvciBDb250ZW50aW9uIGZhaWxlciBmb3IgUlBMIiwgIkZEWCBQcm90b2NvbCBFcnJvciIKK307CisKKy8qIE1vZHVsZSBwYXJhbXRlcnMgKi8KKworLyogUmluZyBTcGVlZCAwLDQsMTYKKyAqIDAgPSBBdXRvc2Vuc2UgICAgICAgICAKKyAqIDQsMTYgPSBTZWxlY3RlZCBzcGVlZCBvbmx5LCBubyBhdXRvc2Vuc2UKKyAqIFRoaXMgYWxsb3dzIHRoZSBjYXJkIHRvIGJlIHRoZSBmaXJzdCBvbiB0aGUgcmluZworICogYW5kIGJlY29tZSB0aGUgYWN0aXZlIG1vbml0b3IuCisgKgorICogV0FSTklORzogU29tZSBodWJzIHdpbGwgYWxsb3cgeW91IHRvIGluc2VydAorICogYXQgdGhlIHdyb25nIHNwZWVkCisgKi8KKworc3RhdGljIGludCByaW5nc3BlZWRbU1RSRUFNRVJfTUFYX0FEQVBURVJTXSA9IHsgMCwgfTsKKworbW9kdWxlX3BhcmFtX2FycmF5KHJpbmdzcGVlZCwgaW50LCBOVUxMLCAwKTsKKworLyogUGFja2V0IGJ1ZmZlciBzaXplICovCisKK3N0YXRpYyBpbnQgcGt0X2J1Zl9zeltTVFJFQU1FUl9NQVhfQURBUFRFUlNdID0geyAwLCB9OworCittb2R1bGVfcGFyYW1fYXJyYXkocGt0X2J1Zl9zeiwgaW50LCBOVUxMLCAwKTsKKworLyogTWVzc2FnZSBMZXZlbCAqLworCitzdGF0aWMgaW50IG1lc3NhZ2VfbGV2ZWxbU1RSRUFNRVJfTUFYX0FEQVBURVJTXSA9IHsgMSwgfTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG1lc3NhZ2VfbGV2ZWwsIGludCwgTlVMTCwgMCk7CisKKyNpZiBTVFJFQU1FUl9JT0NUTAorc3RhdGljIGludCBzdHJlYW1lcl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgaWZyZXEgKiwgaW50KTsKKyNlbmRpZgorCitzdGF0aWMgaW50IHN0cmVhbWVyX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzdHJlYW1lcl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzdHJlYW1lcl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzdHJlYW1lcl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHN0cmVhbWVyX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IHN0cmVhbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdHJlYW1lcl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHN0cmVhbWVyX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKTsKK3N0YXRpYyB2b2lkIHN0cmVhbWVyX2FyYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHN0cmVhbWVyX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG10dSk7CitzdGF0aWMgdm9pZCBzdHJlYW1lcl9zcmJfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzdHJlYW1lcl9hc2JfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjaWYgU1RSRUFNRVJfTkVUV09SS19NT05JVE9SCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyBpbnQgc3RyZWFtZXJfcHJvY19pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkgICAgICBpbnQgbGVuZ3RoLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50IHNwcmludGZfaW5mbyhjaGFyICpidWZmZXIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKmRldl9zdHJlYW1lcj1OVUxMOworI2VuZGlmCisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmluaXQgc3RyZWFtZXJfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqc3RyZWFtZXJfcHJpdjsKKwl1bnNpZ25lZCBsb25nIHBpb19zdGFydCwgcGlvX2VuZCwgcGlvX2ZsYWdzLCBwaW9fbGVuOworCXVuc2lnbmVkIGxvbmcgbW1pb19zdGFydCwgbW1pb19lbmQsIG1taW9fZmxhZ3MsIG1taW9fbGVuOworCWludCByYyA9IDA7CisJc3RhdGljIGludCBjYXJkX25vPS0xOworCXUxNiBwY3I7CisKKyNpZiBTVFJFQU1FUl9ERUJVRworCXByaW50aygibGFuc3RyZWFtZXI6OnN0cmVhbWVyX2luaXRfb25lLCBlbnRyeSBwZGV2ICVwXG4iLHBkZXYpOworI2VuZGlmCisKKwljYXJkX25vKys7CisJZGV2ID0gYWxsb2NfdHJkZXYoc2l6ZW9mKCpzdHJlYW1lcl9wcml2KSk7CisJaWYgKGRldj09TlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImxhbnN0cmVhbWVyOiBvdXQgb2YgbWVtb3J5LlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlzdHJlYW1lcl9wcml2ID0gZGV2LT5wcml2OworCisjaWYgU1RSRUFNRVJfTkVUV09SS19NT05JVE9SCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlpZiAoIWRldl9zdHJlYW1lcikKKwkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgibmV0L3N0cmVhbWVyX3RyIiwgMCwgMCwKKwkJCQkJc3RyZWFtZXJfcHJvY19pbmZvLCBOVUxMKTsgCisJc3RyZWFtZXJfcHJpdi0+bmV4dCA9IGRldl9zdHJlYW1lcjsKKwlkZXZfc3RyZWFtZXIgPSBzdHJlYW1lcl9wcml2OworI2VuZGlmCisjZW5kaWYKKworCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweEZGRkZGRkZGVUxMKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogTm8gc3VpdGFibGUgUENJIG1hcHBpbmcgYXZhaWxhYmxlLlxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgImxhbnN0cmVhbWVyOiB1bmFibGUgdG8gZW5hYmxlIHBjaSBkZXZpY2VcbiIpOworCQlyYz0tRUlPOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlyYyA9IHBjaV9zZXRfbXdpKHBkZXYpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgImxhbnN0cmVhbWVyOiB1bmFibGUgdG8gZW5hYmxlIE1XSSBvbiBwY2kgZGV2aWNlXG4iKTsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGU7CisJfQorCisJcGlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCXBpb19lbmQgPSBwY2lfcmVzb3VyY2VfZW5kKHBkZXYsIDApOworCXBpb19mbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKTsKKwlwaW9fbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKKworCW1taW9fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisJbW1pb19lbmQgPSBwY2lfcmVzb3VyY2VfZW5kKHBkZXYsIDEpOworCW1taW9fZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMSk7CisJbW1pb19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpOworCisjaWYgU1RSRUFNRVJfREVCVUcKKwlwcmludGsoImxhbnN0cmVhbWVyOiBwaW9fc3RhcnQgJXggcGlvX2VuZCAleCBwaW9fbGVuICV4IHBpb19mbGFncyAleFxuIiwKKwkJcGlvX3N0YXJ0LCBwaW9fZW5kLCBwaW9fbGVuLCBwaW9fZmxhZ3MpOworCXByaW50aygibGFuc3RyZWFtZXI6IG1taW9fc3RhcnQgJXggbW1pb19lbmQgJXggbW1pb19sZW4gJXggbW1pb19mbGFncyAleFxuIiwKKwkJbW1pb19zdGFydCwgbW1pb19lbmQsIG1taW9fZmxhZ3MsIG1taW9fbGVuKTsKKyNlbmRpZgorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihwaW9fc3RhcnQsIHBpb19sZW4sICJsYW5zdHJlYW1lciIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibGFuc3RyZWFtZXI6IHVuYWJsZSB0byBnZXQgcGNpIGlvIGFkZHIgJWx4XG4iLAorCQkJcGlvX3N0YXJ0KTsKKwkJcmM9IC1FQlVTWTsKKwkJZ290byBlcnJfb3V0X213aTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihtbWlvX3N0YXJ0LCBtbWlvX2xlbiwgImxhbnN0cmVhbWVyIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsYW5zdHJlYW1lcjogdW5hYmxlIHRvIGdldCBwY2kgbW1pbyBhZGRyICVseFxuIiwKKwkJCW1taW9fc3RhcnQpOworCQlyYz0gLUVCVVNZOworCQlnb3RvIGVycl9vdXRfZnJlZV9waW87CisJfQorCisJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbW1pbz1pb3JlbWFwKG1taW9fc3RhcnQsIG1taW9fbGVuKTsKKwlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbW1pbyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAibGFuc3RyZWFtZXI6IHVuYWJsZSB0byByZW1hcCBNTUlPICVseFxuIiwKKwkJCW1taW9fc3RhcnQpOworCQlyYz0gLUVJTzsKKwkJZ290byBlcnJfb3V0X2ZyZWVfbW1pbzsKKwl9CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzdHJlYW1lcl9wcml2LT5zcmJfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmc3RyZWFtZXJfcHJpdi0+dHJiX3dhaXQpOworCisJZGV2LT5vcGVuID0gJnN0cmVhbWVyX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmc3RyZWFtZXJfeG1pdDsKKwlkZXYtPmNoYW5nZV9tdHUgPSAmc3RyZWFtZXJfY2hhbmdlX210dTsKKwlkZXYtPnN0b3AgPSAmc3RyZWFtZXJfY2xvc2U7CisjaWYgU1RSRUFNRVJfSU9DVEwKKwlkZXYtPmRvX2lvY3RsID0gJnN0cmVhbWVyX2lvY3RsOworI2Vsc2UKKwlkZXYtPmRvX2lvY3RsID0gTlVMTDsKKyNlbmRpZgorCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnN0cmVhbWVyX3NldF9yeF9tb2RlOworCWRldi0+Z2V0X3N0YXRzID0gJnN0cmVhbWVyX2dldF9zdGF0czsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9ICZzdHJlYW1lcl9zZXRfbWFjX2FkZHJlc3M7CisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJZGV2LT5iYXNlX2FkZHI9cGlvX3N0YXJ0OworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9jYXJkX25hbWUgPSAoY2hhciAqKXBkZXYtPnJlc291cmNlWzBdLm5hbWU7CisJc3RyZWFtZXJfcHJpdi0+cGNpX2RldiA9IHBkZXY7CisKKwlpZiAoKHBrdF9idWZfc3pbY2FyZF9ub10gPCAxMDApIHx8IChwa3RfYnVmX3N6W2NhcmRfbm9dID4gMTgwMDApKQorCQlzdHJlYW1lcl9wcml2LT5wa3RfYnVmX3N6ID0gUEtUX0JVRl9TWjsKKwllbHNlCisJCXN0cmVhbWVyX3ByaXYtPnBrdF9idWZfc3ogPSBwa3RfYnVmX3N6W2NhcmRfbm9dOworCisJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcmluZ19zcGVlZCA9IHJpbmdzcGVlZFtjYXJkX25vXTsKKwlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tZXNzYWdlX2xldmVsID0gbWVzc2FnZV9sZXZlbFtjYXJkX25vXTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJc3Bpbl9sb2NrX2luaXQoJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xvY2spOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQgKHBkZXYsIFBDSV9DT01NQU5ELCAmcGNyKTsKKwlwY3IgfD0gUENJX0NPTU1BTkRfU0VSUjsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQgKHBkZXYsIFBDSV9DT01NQU5ELCBwY3IpOworCisJcHJpbnRrKCIlcyBcbiIsIHZlcnNpb24pOworCXByaW50aygiJXM6ICVzLiBJL08gYXQgJWh4LCBNTUlPIGF0ICVwLCB1c2luZyBpcnEgJWRcbiIsZGV2LT5uYW1lLAorCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9jYXJkX25hbWUsCisJCSh1bnNpZ25lZCBpbnQpIGRldi0+YmFzZV9hZGRyLAorCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvLCAKKwkJZGV2LT5pcnEpOworCisJaWYgKHN0cmVhbWVyX3Jlc2V0KGRldikpCisJCWdvdG8gZXJyX291dF91bm1hcDsKKworCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfdW5tYXA7CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfdW5tYXA6CisJaW91bm1hcChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvKTsKK2Vycl9vdXRfZnJlZV9tbWlvOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihtbWlvX3N0YXJ0LCBtbWlvX2xlbik7CitlcnJfb3V0X2ZyZWVfcGlvOgorCXJlbGVhc2VfcmVnaW9uKHBpb19zdGFydCwgcGlvX2xlbik7CitlcnJfb3V0X213aToKKwlwY2lfY2xlYXJfbXdpKHBkZXYpOworZXJyX291dF9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK2Vycl9vdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKyNpZiBTVFJFQU1FUl9ERUJVRworCXByaW50aygibGFuc3RyZWFtZXI6IEV4aXQgZXJyb3IgJXhcbiIscmMpOworI2VuZGlmCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc3RyZWFtZXJfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2PXBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqc3RyZWFtZXJfcHJpdjsKKworI2lmIFNUUkVBTUVSX0RFQlVHCisJcHJpbnRrKCJsYW5zdHJlYW1lcjo6c3RyZWFtZXJfcmVtb3ZlX29uZSBlbnRyeSBwZGV2ICVwXG4iLHBkZXYpOworI2VuZGlmCisKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsYW5zdHJlYW1lcjo6c3RyZWFtZXJfcmVtb3ZlX29uZSwgRVJST1IgZGV2IGlzIE5VTExcbiIpOworCQlyZXR1cm47CisJfQorCisJc3RyZWFtZXJfcHJpdj1kZXYtPnByaXY7CisJaWYgKHN0cmVhbWVyX3ByaXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImxhbnN0cmVhbWVyOjpzdHJlYW1lcl9yZW1vdmVfb25lLCBFUlJPUiBkZXYtPnByaXYgaXMgTlVMTFxuIik7CisJCXJldHVybjsKKwl9CisKKyNpZiBTVFJFQU1FUl9ORVRXT1JLX01PTklUT1IKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXsKKwkJc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKipwLCAqKm5leHQ7CisKKwkJZm9yIChwID0gJmRldl9zdHJlYW1lcjsgKnA7IHAgPSBuZXh0KSB7CisJCQluZXh0ID0gJigqcCktPm5leHQ7CisJCQlpZiAoKnAgPT0gc3RyZWFtZXJfcHJpdikgeworCQkJCSpwID0gKm5leHQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCFkZXZfc3RyZWFtZXIpCisJCQlyZW1vdmVfcHJvY19lbnRyeSgibmV0L3N0cmVhbWVyX3RyIiwgTlVMTCk7CisJfQorI2VuZGlmCisjZW5kaWYKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaW91bm1hcChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsMSkpOworCXJlbGVhc2VfcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LDApKTsKKwlwY2lfY2xlYXJfbXdpKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlmcmVlX25ldGRldihkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKK30KKworCitzdGF0aWMgaW50IHN0cmVhbWVyX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKnN0cmVhbWVyX3ByaXY7CisJX191OCBfX2lvbWVtICpzdHJlYW1lcl9tbWlvOworCXVuc2lnbmVkIGxvbmcgdDsKKwl1bnNpZ25lZCBpbnQgdWFhX2FkZHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJX191MTYgbWlzcjsKKworCXN0cmVhbWVyX3ByaXYgPSAoc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXN0cmVhbWVyX21taW8gPSBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvOworCisJd3JpdGV3KHJlYWR3KHN0cmVhbWVyX21taW8gKyBCQ1RMKSB8IEJDVExfU09GVFJFU0VULCBzdHJlYW1lcl9tbWlvICsgQkNUTCk7CisJdCA9IGppZmZpZXM7CisJLyogSG9sZCBzb2Z0IHJlc2V0IGJpdCBmb3IgYSB3aGlsZSAqLworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19VTklOVEVSUlVQVElCTEU7CisJc2NoZWR1bGVfdGltZW91dChIWik7CisJCisJd3JpdGV3KHJlYWR3KHN0cmVhbWVyX21taW8gKyBCQ1RMKSAmIH5CQ1RMX1NPRlRSRVNFVCwKKwkgICAgICAgc3RyZWFtZXJfbW1pbyArIEJDVEwpOworCisjaWYgU1RSRUFNRVJfREVCVUcKKwlwcmludGsoIkJDVEw6ICV4XG4iLCByZWFkdyhzdHJlYW1lcl9tbWlvICsgQkNUTCkpOworCXByaW50aygiR1BSOiAleFxuIiwgcmVhZHcoc3RyZWFtZXJfbW1pbyArIEdQUikpOworCXByaW50aygiU0lTUk1BU0s6ICV4XG4iLCByZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUl9NQVNLKSk7CisjZW5kaWYKKwl3cml0ZXcocmVhZHcoc3RyZWFtZXJfbW1pbyArIEJDVEwpIHwgKEJDVExfUlhfRklGT184IHwgQkNUTF9UWF9GSUZPXzgpLCBzdHJlYW1lcl9tbWlvICsgQkNUTCApOworCisJaWYgKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3Jpbmdfc3BlZWQgPT0gMCkgewkvKiBBdXRvc2Vuc2UgKi8KKwkJd3JpdGV3KHJlYWR3KHN0cmVhbWVyX21taW8gKyBHUFIpIHwgR1BSX0FVVE9TRU5TRSwKKwkJICAgICAgIHN0cmVhbWVyX21taW8gKyBHUFIpOworCQlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbWVzc2FnZV9sZXZlbCkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSaW5nc3BlZWQgYXV0b3NlbnNlIG1vZGUgb25cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwl9IGVsc2UgaWYgKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3Jpbmdfc3BlZWQgPT0gMTYpIHsKKwkJaWYgKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21lc3NhZ2VfbGV2ZWwpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVHJ5aW5nIHRvIG9wZW4gYXQgMTYgTWJwcyBhcyByZXF1ZXN0ZWRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJd3JpdGV3KEdQUl8xNk1CUFMsIHN0cmVhbWVyX21taW8gKyBHUFIpOworCX0gZWxzZSBpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcmluZ19zcGVlZCA9PSA0KSB7CisJCWlmIChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tZXNzYWdlX2xldmVsKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRyeWluZyB0byBvcGVuIGF0IDQgTWJwcyBhcyByZXF1ZXN0ZWRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJd3JpdGV3KDAsIHN0cmVhbWVyX21taW8gKyBHUFIpOworCX0KKworCXNrYiA9IGRldl9hbGxvY19za2Ioc3RyZWFtZXJfcHJpdi0+cGt0X2J1Zl9zeik7CisJaWYgKCFza2IpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNrYiBhbGxvY2F0aW9uIGZvciBkaWFnbm9zdGljcyBmYWlsZWQuLi5wcm9jZWVkaW5nXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwl9IGVsc2UgeworCSAgICAgICAgc3RydWN0IHN0cmVhbWVyX3J4X2Rlc2MgKnJ4X3Jpbmc7CisgICAgICAgICAgICAgICAgdTggKmRhdGE7CisKKwkJcnhfcmluZz0oc3RydWN0IHN0cmVhbWVyX3J4X2Rlc2MgKilza2ItPmRhdGE7CisJCWRhdGE9KCh1OCAqKXNrYi0+ZGF0YSkrc2l6ZW9mKHN0cnVjdCBzdHJlYW1lcl9yeF9kZXNjKTsKKwkJcnhfcmluZy0+Zm9yd2FyZD0wOworCQlyeF9yaW5nLT5zdGF0dXM9MDsKKwkJcnhfcmluZy0+YnVmZmVyPWNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHN0cmVhbWVyX3ByaXYtPnBjaV9kZXYsIGRhdGEsIAorCQkJCQkJCTUxMiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCXJ4X3JpbmctPmZyYW1lbGVuX2J1Zmxlbj01MTI7IAorCQl3cml0ZWwoY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoc3RyZWFtZXJfcHJpdi0+cGNpX2RldiwgcnhfcmluZywgNTEyLCBQQ0lfRE1BX0ZST01ERVZJQ0UpKSwKKwkJCXN0cmVhbWVyX21taW8rUlhCREEpOworCX0KKworI2lmIFNUUkVBTUVSX0RFQlVHCisJcHJpbnRrKCJHUFIgPSAleFxuIiwgcmVhZHcoc3RyZWFtZXJfbW1pbyArIEdQUikpOworI2VuZGlmCisJLyogc3RhcnQgc29sbyBpbml0ICovCisJd3JpdGV3KFNJU1JfTUksIHN0cmVhbWVyX21taW8gKyBTSVNSX01BU0tfU1VNKTsKKworCXdoaWxlICghKChyZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUikpICYgU0lTUl9TUkJfUkVQTFkpKSB7CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQlzY2hlZHVsZV90aW1lb3V0KEhaLzEwKTsKKwkJaWYgKGppZmZpZXMgLSB0ID4gNDAgKiBIWikgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIklCTSBQQ0kgdG9rZW5yaW5nIGNhcmQgbm90IHJlc3BvbmRpbmdcbiIpOworCQkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFNUUkVBTUVSX0lPX1NQQUNFKTsKKwkJCWlmIChza2IpCisJCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXdyaXRldyh+U0lTUl9TUkJfUkVQTFksIHN0cmVhbWVyX21taW8gKyBTSVNSX1JVTSk7CisJbWlzciA9IHJlYWR3KHN0cmVhbWVyX21taW8gKyBNSVNSX1JVTSk7CisJd3JpdGV3KH5taXNyLCBzdHJlYW1lcl9tbWlvICsgTUlTUl9SVU0pOworCisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOwkvKiByZWxlYXNlIHNrYiB1c2VkIGZvciBkaWFnbm9zdGljcyAqLworCisjaWYgU1RSRUFNRVJfREVCVUcKKwlwcmludGsoIkxBUFdXTzogJXgsIExBUEE6ICV4IExBUEU6ICAleFxuIiwKKwkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUFdXTyksIHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBBKSwKKwkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUEUpKTsKKyNlbmRpZgorCisjaWYgU1RSRUFNRVJfREVCVUcKKwl7CisJCWludCBpOworCQl3cml0ZXcocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUFdXTyksCisJCSAgICAgICBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJCXByaW50aygiaW5pdGlhbGl6YXRpb24gcmVzcG9uc2Ugc3JiIGR1bXA6ICIpOworCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKwkJCXByaW50aygiJXg6IiwKKwkJCSAgICAgICBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKyNlbmRpZgorCisJd3JpdGV3KHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBXV08pICsgNiwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCWlmIChyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidG9rZW5yaW5nIGNhcmQgaW5pdGlhbGl6YXRpb24gZmFpbGVkLiBlcnJvcmNvZGUgOiAleFxuIiwKKwkJICAgICAgIG50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBEKSkpOworCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgU1RSRUFNRVJfSU9fU1BBQ0UpOworCQlyZXR1cm4gLTE7CisJfQorCisJd3JpdGV3KHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBXV08pICsgOCwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCXVhYV9hZGRyID0gbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKTsKKwlyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQyk7CS8qIHNraXAgb3ZlciBMZXZlbC5BZGRyIGZpZWxkICovCisJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfYWRkcl90YWJsZV9hZGRyID0gbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKTsKKwlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9wYXJtc19hZGRyID0gbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKTsKKworI2lmIFNUUkVBTUVSX0RFQlVHCisJcHJpbnRrKCJVQUEgcmVzaWRlcyBhdCAleFxuIiwgdWFhX2FkZHIpOworI2VuZGlmCisKKwkvKiBzZXR1cCB1YWEgYXJlYSBmb3IgYWNjZXNzIHdpdGggTEFQRCAqLworCXsKKwkJaW50IGk7CisJCV9fdTE2IGFkZHI7CisJCXdyaXRldyh1YWFfYWRkciwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSArPSAyKSB7CisJCSAgICAgICAgYWRkcj1udG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvK0xBUERJTkMpKTsKKwkJCWRldi0+ZGV2X2FkZHJbaV09IChhZGRyID4+IDgpICYgMHhmZjsKKwkJCWRldi0+ZGV2X2FkZHJbaSsxXT0gYWRkciAmIDB4ZmY7CisJCX0KKyNpZiBTVFJFQU1FUl9ERUJVRworCQlwcmludGsoIkFkYXB0ZXIgYWRkcmVzczogIik7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJCXByaW50aygiJTAyeDoiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisjZW5kaWYKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RyZWFtZXJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICpzdHJlYW1lcl9wcml2ID0gKHN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICopIGRldi0+cHJpdjsKKwlfX3U4IF9faW9tZW0gKnN0cmVhbWVyX21taW8gPSBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY2hhciBvcGVuX2Vycm9yWzI1NV07CisJaW50IGksIG9wZW5fZmluaXNoZWQgPSAxOworCV9fdTE2IHNyYl93b3JkOworCV9fdTE2IHNyYl9vcGVuOworCWludCByYzsKKworCWlmIChyZWFkdyhzdHJlYW1lcl9tbWlvK0JNQ1RMX1NVTSkgJiBCTUNUTF9SWF9FTkFCTEVEKSB7CisJICAgICAgICByYz1zdHJlYW1lcl9yZXNldChkZXYpOworCX0KKworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgJnN0cmVhbWVyX2ludGVycnVwdCwgU0FfU0hJUlEsICJsYW5zdHJlYW1lciIsIGRldikpIHsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorI2lmIFNUUkVBTUVSX0RFQlVHCisJcHJpbnRrKCJCTUNUTDogJXhcbiIsIHJlYWR3KHN0cmVhbWVyX21taW8gKyBCTUNUTF9TVU0pKTsKKwlwcmludGsoInBlbmRpbmcgaW50czogJXhcbiIsIHJlYWR3KHN0cmVhbWVyX21taW8gKyBTSVNSKSk7CisjZW5kaWYKKworCXdyaXRldyhTSVNSX01JIHwgU0lTUl9TUkJfUkVQTFksIHN0cmVhbWVyX21taW8gKyBTSVNSX01BU0spOwkvKiBtb3JlIGludHMgbGF0ZXIsIGRvZXNuJ3Qgc3RvcCBhcmIgY21kIGludGVycnVwdCAqLworCXdyaXRldyhMSVNSX0xJRSwgc3RyZWFtZXJfbW1pbyArIExJU1IpOwkvKiBtb3JlIGludHMgbGF0ZXIgKi8KKworCS8qIGFkYXB0ZXIgaXMgY2xvc2VkLCBzbyBTUkIgaXMgcG9pbnRlZCB0byBieSBMQVBXV08gKi8KKwl3cml0ZXcocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUFdXTyksIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKworI2lmIFNUUkVBTUVSX0RFQlVHCisJcHJpbnRrKCJMQVBXV086ICV4LCBMQVBBOiAleFxuIiwgcmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUFdXTyksCisJICAgICAgIHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBBKSk7CisJcHJpbnRrKCJMQVBFOiAleFxuIiwgcmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUEUpKTsKKwlwcmludGsoIlNJU1IgTWFzayA9ICUwNHhcbiIsIHJlYWR3KHN0cmVhbWVyX21taW8gKyBTSVNSX01BU0spKTsKKyNlbmRpZgorCWRvIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IFNSQl9DT01NQU5EX1NJWkU7IGkgKz0gMikgeworCQkJd3JpdGV3KDAsIHN0cmVhbWVyX21taW8gKyBMQVBESU5DKTsKKwkJfQorCisJCXdyaXRldyhyZWFkdyhzdHJlYW1lcl9tbWlvK0xBUFdXTyksc3RyZWFtZXJfbW1pbytMQVBBKTsKKwkJd3JpdGV3KGh0b25zKFNSQl9PUEVOX0FEQVBURVI8PDgpLHN0cmVhbWVyX21taW8rTEFQRElOQykgOyAJLyogb3BlbiAqLworCQl3cml0ZXcoaHRvbnMoU1RSRUFNRVJfQ0xFQVJfUkVUX0NPREU8PDgpLHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJCXdyaXRldyhTVFJFQU1FUl9DTEVBUl9SRVRfQ09ERSwgc3RyZWFtZXJfbW1pbyArIExBUERJTkMpOworCisJCXdyaXRldyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQV1dPKSArIDgsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKyNpZiBTVFJFQU1FUl9ORVRXT1JLX01PTklUT1IKKwkJLyogSWYgTmV0d29yayBNb25pdG9yLCBpbnN0cnVjdCBjYXJkIHRvIGNvcHkgTUFDIGZyYW1lcyB0aHJvdWdoIHRoZSBBUkIgKi8KKwkJd3JpdGV3KGh0b25zKE9QRU5fQURBUFRFUl9FTkFCTEVfRkRYIHwgT1BFTl9BREFQVEVSX1BBU1NfQURDX01BQyB8IE9QRU5fQURBUFRFUl9QQVNTX0FUVF9NQUMgfCBPUEVOX0FEQVBURVJfUEFTU19CRUFDT04pLCBzdHJlYW1lcl9tbWlvICsgTEFQRElOQyk7CS8qIG9mZnNldCA4IHdvcmQgY29udGFpbnMgb3BlbiBvcHRpb25zICovCisjZWxzZQorCQl3cml0ZXcoaHRvbnMoT1BFTl9BREFQVEVSX0VOQUJMRV9GRFgpLCBzdHJlYW1lcl9tbWlvICsgTEFQRElOQyk7CS8qIE9mZnNldCA4IHdvcmQgY29udGFpbnMgT3Blbi5PcHRpb25zICovCisjZW5kaWYKKworCQlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbGFhWzBdKSB7CisJCQl3cml0ZXcocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUFdXTykgKyAxMiwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCQkJd3JpdGV3KGh0b25zKChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sYWFbMF0gPDwgOCkgfCAKKwkJCQkgICAgIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhYVsxXSksc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKwkJCXdyaXRldyhodG9ucygoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbGFhWzJdIDw8IDgpIHwgCisJCQkJICAgICBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sYWFbM10pLHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJCQl3cml0ZXcoaHRvbnMoKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhYVs0XSA8PCA4KSB8IAorCQkJCSAgICAgc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbGFhWzVdKSxzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhYSwgZGV2LT5hZGRyX2xlbik7CisJCX0KKworCQkvKiBzYXZlIG9mZiBzcmIgb3BlbiBvZmZzZXQgKi8KKwkJc3JiX29wZW4gPSByZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQV1dPKTsKKyNpZiBTVFJFQU1FUl9ERUJVRworCQl3cml0ZXcocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUFdXTyksCisJCSAgICAgICBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJCXByaW50aygic3JiIG9wZW4gcmVxdWVzdDogXG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCXByaW50aygiJXg6IiwgbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKSk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworI2VuZGlmCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sb2NrLCBmbGFncyk7CisJCXN0cmVhbWVyX3ByaXYtPnNyYl9xdWV1ZWQgPSAxOworCisJCS8qIHNpZ25hbCBzb2xvIHRoYXQgU1JCIGNvbW1hbmQgaGFzIGJlZW4gaXNzdWVkICovCisJCXdyaXRldyhMSVNSX1NSQl9DTUQsIHN0cmVhbWVyX21taW8gKyBMSVNSX1NVTSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xvY2ssIGZsYWdzKTsKKworCQl3aGlsZSAoc3RyZWFtZXJfcHJpdi0+c3JiX3F1ZXVlZCkgeworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZzdHJlYW1lcl9wcml2LT5zcmJfd2FpdCwgNSAqIEhaKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBTUkIgdGltZWQgb3V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTSVNSPSV4IE1JU1I9JXgsIExJU1I9JXhcbiIsCisJCQkJICAgICAgIHJlYWR3KHN0cmVhbWVyX21taW8gKyBTSVNSKSwKKwkJCQkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIE1JU1JfUlVNKSwKKwkJCQkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIExJU1IpKTsKKwkJCQlzdHJlYW1lcl9wcml2LT5zcmJfcXVldWVkID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisjaWYgU1RSRUFNRVJfREVCVUcKKwkJcHJpbnRrKCJTSVNSX01BU0s6ICV4XG4iLCByZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUl9NQVNLKSk7CisJCXByaW50aygic3JiIG9wZW4gcmVzcG9uc2U6XG4iKTsKKwkJd3JpdGV3KHNyYl9vcGVuLCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCQlwcmludGsoIiV4OiIsCisJCQkgICAgICAgbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKSk7CisJCX0KKyNlbmRpZgorCisJCS8qIElmIHdlIGdldCB0aGUgc2FtZSByZXR1cm4gcmVzcG9uc2UgYXMgd2Ugc2V0LCB0aGUgaW50ZXJydXB0IHdhc24ndCByYWlzZWQgYW5kIHRoZSBvcGVuCisJCSAqIHRpbWVkIG91dC4KKwkJICovCisJCXdyaXRldyhzcmJfb3BlbiArIDIsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwkJc3JiX3dvcmQgPSBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRCkpID4+IDg7CisJCWlmIChzcmJfd29yZCA9PSBTVFJFQU1FUl9DTEVBUl9SRVRfQ09ERSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgT3BlbiB0aW1lIG91dCBvciBlcnJvci5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJaWYgKHNyYl93b3JkICE9IDApIHsKKwkJCWlmIChzcmJfd29yZCA9PSAweDA3KSB7CisJCQkJaWYgKCFzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yaW5nX3NwZWVkICYmIG9wZW5fZmluaXNoZWQpIHsJLyogQXV0b3NlbnNlICwgZmlyc3QgdGltZSBhcm91bmQgKi8KKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJldHJ5aW5nIGF0IGRpZmZlcmVudCByaW5nIHNwZWVkIFxuIiwKKwkJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJCW9wZW5fZmluaXNoZWQgPSAwOworCQkJCX0gZWxzZSB7CisJCQkJCV9fdTE2IGVycm9yX2NvZGU7CisKKwkJCQkJd3JpdGV3KHNyYl9vcGVuICsgNiwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCQkJCQllcnJvcl9jb2RlID0gbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUEQpKTsKKwkJCQkJc3RyY3B5KG9wZW5fZXJyb3IsIG9wZW5fbWFqX2Vycm9yWyhlcnJvcl9jb2RlICYgMHhmMCkgPj4gNF0pOworCQkJCQlzdHJjYXQob3Blbl9lcnJvciwgIiAtICIpOworCQkJCQlzdHJjYXQob3Blbl9lcnJvciwgb3Blbl9taW5fZXJyb3JbKGVycm9yX2NvZGUgJiAweDBmKV0pOworCisJCQkJCWlmICghc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcmluZ19zcGVlZAorCQkJCQkgICAgJiYgKChlcnJvcl9jb2RlICYgMHgwZikgPT0gMHgwZCkpIAorCQkJCQl7CisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHJpZWQgdG8gYXV0b3NlbnNlIHJpbmcgc3BlZWQgd2l0aCBubyBtb25pdG9ycyBwcmVzZW50XG4iLCBkZXYtPm5hbWUpOworCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFBsZWFzZSB0cnkgYWdhaW4gd2l0aCBhIHNwZWNpZmllZCByaW5nIHNwZWVkIFxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQkJCQkJcmV0dXJuIC1FSU87CisJCQkJCX0KKworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogJXNcbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUsIG9wZW5fZXJyb3IpOworCQkJCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJCQkJcmV0dXJuIC1FSU87CisKKwkJCQl9CS8qIGlmIGF1dG9zZW5zZSAmJiBvcGVuX2ZpbmlzaGVkICovCisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBCYWQgT1BFTiByZXNwb25zZTogJXhcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgc3JiX3dvcmQpOworCQkJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9IGVsc2UKKwkJCW9wZW5fZmluaXNoZWQgPSAxOworCX0gd2hpbGUgKCEob3Blbl9maW5pc2hlZCkpOwkvKiBXaWxsIG9ubHkgbG9vcCBpZiByaW5nIHNwZWVkIG1pc21hdGNoIHJlLW9wZW4gYXR0ZW1wdGVkICYmIGF1dG9zZW5zZSBpcyBvbiAqLworCisJd3JpdGV3KHNyYl9vcGVuICsgMTgsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwlzcmJfd29yZD1udG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvK0xBUEQpKSA+PiA4OworCWlmIChzcmJfd29yZCAmICgxIDw8IDMpKQorCQlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbWVzc2FnZV9sZXZlbCkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBPcGVuZWQgaW4gRkRYIE1vZGVcbiIsIGRldi0+bmFtZSk7CisKKwlpZiAoc3JiX3dvcmQgJiAxKQorCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yaW5nX3NwZWVkID0gMTY7CisJZWxzZQorCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yaW5nX3NwZWVkID0gNDsKKworCWlmIChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tZXNzYWdlX2xldmVsKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogT3BlbmVkIGluICVkIE1icHMgbW9kZVxuIiwgCisJCQlkZXYtPm5hbWUsCisJCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yaW5nX3NwZWVkKTsKKworCXdyaXRldyhzcmJfb3BlbiArIDgsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwlzdHJlYW1lcl9wcml2LT5hc2IgPSBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpOworCXN0cmVhbWVyX3ByaXYtPnNyYiA9IG50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSk7CisJc3RyZWFtZXJfcHJpdi0+YXJiID0gbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKTsKKwlyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQyk7CS8qIG9mZnNldCAxNCB3b3JkIGlzIHJzdmQgKi8KKwlzdHJlYW1lcl9wcml2LT50cmIgPSBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpOworCisJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcmVjZWl2ZV9vcHRpb25zID0gMHgwMDsKKwlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9jb3B5X2FsbF9vcHRpb25zID0gMDsKKworCS8qIHNldHVwIHJ4IHJpbmcgKi8KKwkvKiBlbmFibGUgcnggY2hhbm5lbCAqLworCXdyaXRldyh+Qk1DVExfUlhfRElTLCBzdHJlYW1lcl9tbWlvICsgQk1DVExfUlVNKTsKKworCS8qIHNldHVwIHJ4IGRlc2NyaXB0b3JzICovCisJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZz0KKwkgICAga21hbGxvYyggc2l6ZW9mKHN0cnVjdCBzdHJlYW1lcl9yeF9kZXNjKSoKKwkJICAgICBTVFJFQU1FUl9SWF9SSU5HX1NJWkUsR0ZQX0tFUk5FTCk7CisJaWYgKCFzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nKSB7CisJICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzIEFMTE9DIG9mIHN0cmVhbWVyIHJ4IHJpbmcgRkFJTEVEISFcbiIsZGV2LT5uYW1lKTsKKwkgICAgcmV0dXJuIC1FSU87CisJfQorCisJZm9yIChpID0gMDsgaSA8IFNUUkVBTUVSX1JYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihzdHJlYW1lcl9wcml2LT5wa3RfYnVmX3N6KTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJc2tiLT5kZXYgPSBkZXY7CisKKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1tpXS5mb3J3YXJkID0gCisJCQljcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShzdHJlYW1lcl9wcml2LT5wY2lfZGV2LCAmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1tpICsgMV0sCisJCQkJCXNpemVvZihzdHJ1Y3Qgc3RyZWFtZXJfcnhfZGVzYyksIFBDSV9ETUFfRlJPTURFVklDRSkpOworCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbaV0uYnVmZmVyID0gCisJCQljcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShzdHJlYW1lcl9wcml2LT5wY2lfZGV2LCBza2ItPmRhdGEsCisJCQkJCSAgICAgIHN0cmVhbWVyX3ByaXYtPnBrdF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSkpOworCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nW2ldLmZyYW1lbGVuX2J1ZmxlbiA9IHN0cmVhbWVyX3ByaXYtPnBrdF9idWZfc3o7CisJCXN0cmVhbWVyX3ByaXYtPnJ4X3Jpbmdfc2tiW2ldID0gc2tiOworCX0KKwlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nW1NUUkVBTUVSX1JYX1JJTkdfU0laRSAtIDFdLmZvcndhcmQgPQorCQkJCWNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHN0cmVhbWVyX3ByaXYtPnBjaV9kZXYsICZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nWzBdLAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBzdHJlYW1lcl9yeF9kZXNjKSwgUENJX0RNQV9GUk9NREVWSUNFKSk7CisKKwlpZiAoaSA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSByeCBidWZmZXJzLiBBZGFwdGVyIGRpc2FibGVkXG4iLCBkZXYtPm5hbWUpOworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJc3RyZWFtZXJfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkID0gU1RSRUFNRVJfUlhfUklOR19TSVpFIC0gMTsJLyogbGFzdCBwcm9jZXNzZWQgcnggc3RhdHVzICovCisKKwl3cml0ZWwoY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoc3RyZWFtZXJfcHJpdi0+cGNpX2RldiwgJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbMF0sCisJCQkJc2l6ZW9mKHN0cnVjdCBzdHJlYW1lcl9yeF9kZXNjKSwgUENJX0RNQV9UT0RFVklDRSkpLCAKKwkJc3RyZWFtZXJfbW1pbyArIFJYQkRBKTsKKwl3cml0ZWwoY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoc3RyZWFtZXJfcHJpdi0+cGNpX2RldiwgJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbU1RSRUFNRVJfUlhfUklOR19TSVpFIC0gMV0sCisJCQkJc2l6ZW9mKHN0cnVjdCBzdHJlYW1lcl9yeF9kZXNjKSwgUENJX0RNQV9UT0RFVklDRSkpLCAKKwkJc3RyZWFtZXJfbW1pbyArIFJYTEJEQSk7CisKKwkvKiBzZXQgYnVzIG1hc3RlciBpbnRlcnJ1cHQgZXZlbnQgbWFzayAqLworCXdyaXRldyhNSVNSX1JYX05PQlVGIHwgTUlTUl9SWF9FT0YsIHN0cmVhbWVyX21taW8gKyBNSVNSX01BU0spOworCisKKwkvKiBzZXR1cCB0eCByaW5nICovCisJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZz1rbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RyZWFtZXJfdHhfZGVzYykqCisJCQkJCQlTVFJFQU1FUl9UWF9SSU5HX1NJWkUsR0ZQX0tFUk5FTCk7CisJaWYgKCFzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nKSB7CisJICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzIEFMTE9DIG9mIHN0cmVhbWVyX3R4X3JpbmcgRkFJTEVEXG4iLGRldi0+bmFtZSk7CisJICAgIHJldHVybiAtRUlPOworCX0KKworCXdyaXRldyh+Qk1DVExfVFgyX0RJUywgc3RyZWFtZXJfbW1pbyArIEJNQ1RMX1JVTSk7CS8qIEVuYWJsZXMgVFggY2hhbm5lbCAyICovCisJZm9yIChpID0gMDsgaSA8IFNUUkVBTUVSX1RYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3JpbmdbaV0uZm9yd2FyZCA9IGNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHN0cmVhbWVyX3ByaXYtPnBjaV9kZXYsIAorCQkJCQkJCQkJCSZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW2kgKyAxXSwKKwkJCQkJCQkJCQlzaXplb2Yoc3RydWN0IHN0cmVhbWVyX3R4X2Rlc2MpLAorCQkJCQkJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpKTsKKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tpXS5zdGF0dXMgPSAwOworCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW2ldLmJ1ZmNudF9mcmFtZWxlbiA9IDA7CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3JpbmdbaV0uYnVmZmVyID0gMDsKKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tpXS5idWZsZW4gPSAwOworCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW2ldLnJzdmQxID0gMDsKKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tpXS5yc3ZkMiA9IDA7CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3JpbmdbaV0ucnN2ZDMgPSAwOworCX0KKwlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW1NUUkVBTUVSX1RYX1JJTkdfU0laRSAtIDFdLmZvcndhcmQgPQorCQkJCQljcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShzdHJlYW1lcl9wcml2LT5wY2lfZGV2LCAmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1swXSwKKwkJCQkJCQlzaXplb2Yoc3RydWN0IHN0cmVhbWVyX3R4X2Rlc2MpLCBQQ0lfRE1BX1RPREVWSUNFKSk7CisKKwlzdHJlYW1lcl9wcml2LT5mcmVlX3R4X3JpbmdfZW50cmllcyA9IFNUUkVBTUVSX1RYX1JJTkdfU0laRTsKKwlzdHJlYW1lcl9wcml2LT50eF9yaW5nX2ZyZWUgPSAwOwkvKiBuZXh0IGVudHJ5IGluIHR4IHJpbmcgdG8gdXNlICovCisJc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1cyA9IFNUUkVBTUVSX1RYX1JJTkdfU0laRSAtIDE7CisKKwkvKiBzZXQgQnVzbWFzdGVyIGludGVycnVwdCBldmVudCBtYXNrIChoYW5kbGUgcmVjZWl2ZXMgb24gaW50ZXJydXB0IG9ubHkgKi8KKwl3cml0ZXcoTUlTUl9UWDJfRU9GIHwgTUlTUl9SWF9OT0JVRiB8IE1JU1JfUlhfRU9GLCBzdHJlYW1lcl9tbWlvICsgTUlTUl9NQVNLKTsKKwkvKiBzZXQgc3lzdGVtIGV2ZW50IGludGVycnVwdCBtYXNrICovCisJd3JpdGV3KFNJU1JfQURBUFRFUl9DSEVDSyB8IFNJU1JfQVJCX0NNRCB8IFNJU1JfVFJCX1JFUExZIHwgU0lTUl9BU0JfRlJFRSwgc3RyZWFtZXJfbW1pbyArIFNJU1JfTUFTS19TVU0pOworCisjaWYgU1RSRUFNRVJfREVCVUcKKwlwcmludGsoIkJNQ1RMOiAleFxuIiwgcmVhZHcoc3RyZWFtZXJfbW1pbyArIEJNQ1RMX1NVTSkpOworCXByaW50aygiU0lTUiBNQVNLOiAleFxuIiwgcmVhZHcoc3RyZWFtZXJfbW1pbyArIFNJU1JfTUFTSykpOworI2VuZGlmCisKKyNpZiBTVFJFQU1FUl9ORVRXT1JLX01PTklUT1IKKworCXdyaXRldyhzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9hZGRyX3RhYmxlX2FkZHIsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwlwcmludGsoIiVzOiBOb2RlIEFkZHJlc3M6ICUwNHg6JTA0eDolMDR4XG4iLCBkZXYtPm5hbWUsCisJCW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSksCisJCW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSksCisJCW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSkpOworCXJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKTsKKwlyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQyk7CisJcHJpbnRrKCIlczogRnVuY3Rpb25hbCBBZGRyZXNzOiAlMDR4OiUwNHhcbiIsIGRldi0+bmFtZSwKKwkJbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKSwKKwkJbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKSk7CisKKwl3cml0ZXcoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcGFybXNfYWRkciArIDQsCisJCXN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwlwcmludGsoIiVzOiBOQVVOIEFkZHJlc3M6ICUwNHg6JTA0eDolMDR4XG4iLCBkZXYtPm5hbWUsCisJCW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSksCisJCW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSksCisJCW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSkpOworI2VuZGlmCisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVdoZW4gd2UgZW50ZXIgdGhlIHJ4IHJvdXRpbmUgd2UgZG8gbm90IGtub3cgaG93IG1hbnkgZnJhbWVzIGhhdmUgYmVlbiAKKyAqCXF1ZXVlZCBvbiB0aGUgcnggY2hhbm5lbC4gIFRoZXJlZm9yZSB3ZSBzdGFydCBhdCB0aGUgbmV4dCByeCBzdGF0dXMKKyAqCXBvc2l0aW9uIGFuZCB0cmF2ZWwgYXJvdW5kIHRoZSByZWNlaXZlIHJpbmcgdW50aWwgd2UgaGF2ZSBjb21wbGV0ZWQKKyAqCWFsbCB0aGUgZnJhbWVzLgorICoKKyAqCVRoaXMgbWVhbnMgdGhhdCB3ZSBtYXkgcHJvY2VzcyB0aGUgZnJhbWUgYmVmb3JlIHdlIHJlY2VpdmUgdGhlIGVuZAorICoJb2YgZnJhbWUgaW50ZXJydXB0LiBUaGlzIGlzIHdoeSB3ZSBhbHdheXMgdGVzdCB0aGUgc3RhdHVzIGluc3RlYWQKKyAqCW9mIGJsaW5kbHkgcHJvY2Vzc2luZyB0aGUgbmV4dCBmcmFtZS4KKyAqCQorICovCitzdGF0aWMgdm9pZCBzdHJlYW1lcl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICpzdHJlYW1lcl9wcml2ID0KKwkgICAgKHN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICopIGRldi0+cHJpdjsKKwlfX3U4IF9faW9tZW0gKnN0cmVhbWVyX21taW8gPSBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvOworCXN0cnVjdCBzdHJlYW1lcl9yeF9kZXNjICpyeF9kZXNjOworCWludCByeF9yaW5nX2xhc3RfcmVjZWl2ZWQsIGxlbmd0aCwgZnJhbWVfbGVuZ3RoLCBidWZmZXJfY250ID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqc2tiMjsKKworCS8qIHNldHVwIHRoZSBuZXh0IHJ4IGRlc2NyaXB0b3IgdG8gYmUgcmVjZWl2ZWQgKi8KKwlyeF9kZXNjID0gJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbKHN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCArIDEpICYgKFNUUkVBTUVSX1JYX1JJTkdfU0laRSAtIDEpXTsKKwlyeF9yaW5nX2xhc3RfcmVjZWl2ZWQgPSBzdHJlYW1lcl9wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQ7CisKKwl3aGlsZSAocnhfZGVzYy0+c3RhdHVzICYgMHgwMTAwMDAwMCkgewkvKiBXaGlsZSBwcm9jZXNzZWQgZGVzY3JpcHRvcnMgYXJlIGF2YWlsYWJsZSAqLworCQlpZiAocnhfcmluZ19sYXN0X3JlY2VpdmVkICE9IHN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCkgCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJYIEVycm9yIDEgcnhfcmluZ19sYXN0X3JlY2VpdmVkIG5vdCB0aGUgc2FtZSAleCAleFxuIiwKKwkJCQlyeF9yaW5nX2xhc3RfcmVjZWl2ZWQsIHN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCk7CisJCX0KKwkJc3RyZWFtZXJfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkID0gKHN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCArIDEpICYgKFNUUkVBTUVSX1JYX1JJTkdfU0laRSAtIDEpOworCQlyeF9yaW5nX2xhc3RfcmVjZWl2ZWQgPSBzdHJlYW1lcl9wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQ7CisKKwkJbGVuZ3RoID0gcnhfZGVzYy0+ZnJhbWVsZW5fYnVmbGVuICYgMHhmZmZmOwkvKiBidWZmZXIgbGVuZ3RoICovCisJCWZyYW1lX2xlbmd0aCA9IChyeF9kZXNjLT5mcmFtZWxlbl9idWZsZW4gPj4gMTYpICYgMHhmZmZmOworCisJCWlmIChyeF9kZXNjLT5zdGF0dXMgJiAweDdFODMwMDAwKSB7CS8qIGVycm9ycyAqLworCQkJaWYgKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21lc3NhZ2VfbGV2ZWwpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUnggRXJyb3IgJXggXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIHJ4X2Rlc2MtPnN0YXR1cyk7CisJCQl9CisJCX0gZWxzZSB7CS8qIHJlY2VpdmVkIHdpdGhvdXQgZXJyb3JzICovCisJCQlpZiAocnhfZGVzYy0+c3RhdHVzICYgMHg4MDAwMDAwMCkgewkvKiBmcmFtZSBjb21wbGV0ZSAqLworCQkJCWJ1ZmZlcl9jbnQgPSAxOworCQkJCXNrYiA9IGRldl9hbGxvY19za2Ioc3RyZWFtZXJfcHJpdi0+cGt0X2J1Zl9zeik7CisJCQl9IGVsc2UgeworCQkJCXNrYiA9IGRldl9hbGxvY19za2IoZnJhbWVfbGVuZ3RoKTsKKwkJCX0KKworCQkJaWYgKHNrYiA9PSBOVUxMKSAKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm90IGVub3VnaCBtZW1vcnkgdG8gY29weSBwYWNrZXQgdG8gdXBwZXIgbGF5ZXJzLiBcbiIsCWRldi0+bmFtZSk7CisJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfc3RhdHMucnhfZHJvcHBlZCsrOworCQkJfSBlbHNlIHsJLyogd2UgYWxsb2NhdGVkIGFuIHNrYiBPSyAqLworCQkJCXNrYi0+ZGV2ID0gZGV2OworCisJCQkJaWYgKGJ1ZmZlcl9jbnQgPT0gMSkgeworCQkJCQkvKiByZWxlYXNlIHRoZSBETUEgbWFwcGluZyAqLworCQkJCQlwY2lfdW5tYXBfc2luZ2xlKHN0cmVhbWVyX3ByaXYtPnBjaV9kZXYsIAorCQkJCQkJbGUzMl90b19jcHUoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1tyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLmJ1ZmZlciksCisJCQkJCQlzdHJlYW1lcl9wcml2LT5wa3RfYnVmX3N6LCAKKwkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJCXNrYjIgPSBzdHJlYW1lcl9wcml2LT5yeF9yaW5nX3NrYltyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdOworI2lmIFNUUkVBTUVSX0RFQlVHX1BBQ0tFVFMKKwkJCQkJeworCQkJCQkJaW50IGk7CisJCQkJCQlwcmludGsoInN0cmVhbWVyX3J4IHBhY2tldCBwcmludDogc2tiLT5kYXRhMiAlcCAgc2tiLT5oZWFkICVwXG4iLCBza2IyLT5kYXRhLCBza2IyLT5oZWFkKTsKKwkJCQkJCWZvciAoaSA9IDA7IGkgPCBmcmFtZV9sZW5ndGg7IGkrKykgCisJCQkJCQl7CisJCQkJCQkJcHJpbnRrKCIleDoiLCBza2IyLT5kYXRhW2ldKTsKKwkJCQkJCQlpZiAoKChpICsgMSkgJSAxNikgPT0gMCkKKwkJCQkJCQkJcHJpbnRrKCJcbiIpOworCQkJCQkJfQorCQkJCQkJcHJpbnRrKCJcbiIpOworCQkJCQl9CisjZW5kaWYKKwkJCQkJc2tiX3B1dChza2IyLCBsZW5ndGgpOworCQkJCQlza2IyLT5wcm90b2NvbCA9IHRyX3R5cGVfdHJhbnMoc2tiMiwgZGV2KTsKKwkJCQkJLyogcmVjeWNsZSB0aGlzIGRlc2NyaXB0b3IgKi8KKwkJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1tyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLnN0YXR1cyA9IDA7CisJCQkJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbcnhfcmluZ19sYXN0X3JlY2VpdmVkXS5mcmFtZWxlbl9idWZsZW4gPSBzdHJlYW1lcl9wcml2LT5wa3RfYnVmX3N6OworCQkJCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0uYnVmZmVyID0gCisJCQkJCQljcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShzdHJlYW1lcl9wcml2LT5wY2lfZGV2LCBza2ItPmRhdGEsIHN0cmVhbWVyX3ByaXYtPnBrdF9idWZfc3osCisJCQkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSkpOworCQkJCQlzdHJlYW1lcl9wcml2LT5yeF9yaW5nX3NrYltyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdID0gc2tiOworCQkJCQkvKiBwbGFjZSByZWN5Y2xlZCBkZXNjcmlwdG9yIGJhY2sgb24gdGhlIGFkYXB0ZXIgKi8KKwkJCQkJd3JpdGVsKGNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHN0cmVhbWVyX3ByaXYtPnBjaV9kZXYsIAorCQkJCQkJCQkJJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbcnhfcmluZ19sYXN0X3JlY2VpdmVkXSwKKwkJCQkJCQkJCXNpemVvZihzdHJ1Y3Qgc3RyZWFtZXJfcnhfZGVzYyksIFBDSV9ETUFfRlJPTURFVklDRSkpLAorCQkJCQkJc3RyZWFtZXJfbW1pbyArIFJYTEJEQSk7CisJCQkJCS8qIHBhc3MgdGhlIHJlY2VpdmVkIHNrYiB1cCB0byB0aGUgcHJvdG9jb2wgKi8KKwkJCQkJbmV0aWZfcngoc2tiMik7CisJCQkJfSBlbHNlIHsKKwkJCQkJZG8gewkvKiBXYWxrIHRoZSBidWZmZXJzICovCisJCQkJCQlwY2lfdW5tYXBfc2luZ2xlKHN0cmVhbWVyX3ByaXYtPnBjaV9kZXYsIGxlMzJfdG9fY3B1KHJ4X2Rlc2MtPmJ1ZmZlciksIGxlbmd0aCwgUENJX0RNQV9GUk9NREVWSUNFKSwgCisJCQkJCQltZW1jcHkoc2tiX3B1dChza2IsIGxlbmd0aCksICh2b2lkICopcnhfZGVzYy0+YnVmZmVyLCBsZW5ndGgpOwkvKiBjb3B5IHRoaXMgZnJhZ21lbnQgKi8KKwkJCQkJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbcnhfcmluZ19sYXN0X3JlY2VpdmVkXS5zdGF0dXMgPSAwOworCQkJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1tyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLmZyYW1lbGVuX2J1ZmxlbiA9IHN0cmVhbWVyX3ByaXYtPnBrdF9idWZfc3o7CisJCQkJCQkKKwkJCQkJCS8qIGdpdmUgZGVzY3JpcHRvciBiYWNrIHRvIHRoZSBhZGFwdGVyICovCisJCQkJCQl3cml0ZWwoY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoc3RyZWFtZXJfcHJpdi0+cGNpX2RldiwgCisJCQkJCQkJCQkmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1tyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLAorCQkJCQkJCQkJbGVuZ3RoLCBQQ0lfRE1BX0ZST01ERVZJQ0UpKSwgCisJCQkJCQkJc3RyZWFtZXJfbW1pbyArIFJYTEJEQSk7CisKKwkJCQkJCWlmIChyeF9kZXNjLT5zdGF0dXMgJiAweDgwMDAwMDAwKQorCQkJCQkJCWJyZWFrOwkvKiB0aGlzIGRlc2NyaXB0b3IgY29tcGxldGVzIHRoZSBmcmFtZSAqLworCisJCQkJCQkvKiBlbHNlIGdldCB0aGUgbmV4dCBwZW5kaW5nIGRlc2NyaXB0b3IgKi8KKwkJCQkJCWlmIChyeF9yaW5nX2xhc3RfcmVjZWl2ZWQhPSBzdHJlYW1lcl9wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQpCisJCQkJCQl7CisJCQkJCQkJcHJpbnRrKCJSWCBFcnJvciByeF9yaW5nX2xhc3RfcmVjZWl2ZWQgbm90IHRoZSBzYW1lICV4ICV4XG4iLAorCQkJCQkJCQlyeF9yaW5nX2xhc3RfcmVjZWl2ZWQsCisJCQkJCQkJCXN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCk7CisJCQkJCQl9CisJCQkJCQlyeF9kZXNjID0gJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3J4X3JpbmdbKHN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCsxKSAmIChTVFJFQU1FUl9SWF9SSU5HX1NJWkUtMSldOworCisJCQkJCQlsZW5ndGggPSByeF9kZXNjLT5mcmFtZWxlbl9idWZsZW4gJiAweGZmZmY7CS8qIGJ1ZmZlciBsZW5ndGggKi8KKwkJCQkJCXN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCA9CShzdHJlYW1lcl9wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQrMSkgJiAoU1RSRUFNRVJfUlhfUklOR19TSVpFIC0gMSk7CisJCQkJCQlyeF9yaW5nX2xhc3RfcmVjZWl2ZWQgPSBzdHJlYW1lcl9wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQ7CisJCQkJCX0gd2hpbGUgKDEpOworCisJCQkJCXNrYi0+cHJvdG9jb2wgPSB0cl90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCQkJLyogc2VuZCB1cCB0byB0aGUgcHJvdG9jb2wgKi8KKwkJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQl9CisJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfc3RhdHMucnhfYnl0ZXMgKz0gbGVuZ3RoOworCQkJfQkvKiBpZiBza2IgPT0gbnVsbCAqLworCQl9CQkvKiBlbmQgcmVjZWl2ZWQgd2l0aG91dCBlcnJvcnMgKi8KKworCQkvKiB0cnkgdGhlIG5leHQgb25lICovCisJCXJ4X2Rlc2MgPSAmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfcnhfcmluZ1socnhfcmluZ19sYXN0X3JlY2VpdmVkICsgMSkgJiAoU1RSRUFNRVJfUlhfUklOR19TSVpFIC0gMSldOworCX0JCQkvKiBlbmQgZm9yIGFsbCBjb21wbGV0ZWQgcnggZGVzY3JpcHRvcnMgKi8KK30KKworc3RhdGljIGlycXJldHVybl90IHN0cmVhbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCXN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICpzdHJlYW1lcl9wcml2ID0KKwkgICAgKHN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICopIGRldi0+cHJpdjsKKwlfX3U4IF9faW9tZW0gKnN0cmVhbWVyX21taW8gPSBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvOworCV9fdTE2IHNpc3I7CisJX191MTYgbWlzcjsKKwl1OCBtYXhfaW50ciA9IE1BWF9JTlRSOworCisJc3Bpbl9sb2NrKCZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sb2NrKTsKKwlzaXNyID0gcmVhZHcoc3RyZWFtZXJfbW1pbyArIFNJU1IpOworCisJd2hpbGUoKHNpc3IgJiAoU0lTUl9NSSB8IFNJU1JfU1JCX1JFUExZIHwgU0lTUl9BREFQVEVSX0NIRUNLIHwgU0lTUl9BU0JfRlJFRSB8IAorCQkgICAgICAgU0lTUl9BUkJfQ01EIHwgU0lTUl9UUkJfUkVQTFkgfCBTSVNSX1BBUl9FUlIgfCBTSVNSX1NFUlJfRVJSKSkKKyAgICAgICAgICAgICAgICYmIChtYXhfaW50ciA+IDApKSB7CisKKwkJaWYoc2lzciAmIFNJU1JfUEFSX0VSUikgeworCQkJd3JpdGV3KH5TSVNSX1BBUl9FUlIsIHN0cmVhbWVyX21taW8gKyBTSVNSX1JVTSk7CisJCQkodm9pZClyZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUl9SVU0pOworCQl9CisKKwkJZWxzZSBpZihzaXNyICYgU0lTUl9TRVJSX0VSUikgeworCQkJd3JpdGV3KH5TSVNSX1NFUlJfRVJSLCBzdHJlYW1lcl9tbWlvICsgU0lTUl9SVU0pOworCQkJKHZvaWQpcmVhZHcoc3RyZWFtZXJfbW1pbyArIFNJU1JfUlVNKTsKKwkJfQorCisJCWVsc2UgaWYoc2lzciAmIFNJU1JfTUkpIHsKKwkJCW1pc3IgPSByZWFkdyhzdHJlYW1lcl9tbWlvICsgTUlTUl9SVU0pOworCisJCWlmIChtaXNyICYgTUlTUl9UWDJfRU9GKSB7CisJCQkJd2hpbGUoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1soc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1cyArIDEpICYgKFNUUkVBTUVSX1RYX1JJTkdfU0laRSAtIDEpXS5zdGF0dXMpIHsKKwkJCQlzdHJlYW1lcl9wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzID0gKHN0cmVhbWVyX3ByaXYtPnR4X3JpbmdfbGFzdF9zdGF0dXMgKyAxKSAmIChTVFJFQU1FUl9UWF9SSU5HX1NJWkUgLSAxKTsKKwkJCQlzdHJlYW1lcl9wcml2LT5mcmVlX3R4X3JpbmdfZW50cmllcysrOworCQkJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3N0YXRzLnR4X2J5dGVzICs9IHN0cmVhbWVyX3ByaXYtPnR4X3Jpbmdfc2tiW3N0cmVhbWVyX3ByaXYtPnR4X3JpbmdfbGFzdF9zdGF0dXNdLT5sZW47CisJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfc3RhdHMudHhfcGFja2V0cysrOworCQkJCWRldl9rZnJlZV9za2JfaXJxKHN0cmVhbWVyX3ByaXYtPnR4X3Jpbmdfc2tiW3N0cmVhbWVyX3ByaXYtPnR4X3JpbmdfbGFzdF9zdGF0dXNdKTsKKwkJCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW3N0cmVhbWVyX3ByaXYtPnR4X3JpbmdfbGFzdF9zdGF0dXNdLmJ1ZmZlciA9IDB4ZGVhZGJlZWY7CisJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tzdHJlYW1lcl9wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzXS5zdGF0dXMgPSAwOworCQkJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3Jpbmdbc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1c10uYnVmY250X2ZyYW1lbGVuID0gMDsKKwkJCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW3N0cmVhbWVyX3ByaXYtPnR4X3JpbmdfbGFzdF9zdGF0dXNdLmJ1ZmxlbiA9IDA7CisJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tzdHJlYW1lcl9wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzXS5yc3ZkMSA9IDA7CisJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tzdHJlYW1lcl9wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzXS5yc3ZkMiA9IDA7CisJCQkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tzdHJlYW1lcl9wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzXS5yc3ZkMyA9IDA7CisJCQl9CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0KKworCQlpZiAobWlzciAmIE1JU1JfUlhfRU9GKSB7CisJCQlzdHJlYW1lcl9yeChkZXYpOworCQl9CisJCS8qIE1JU1JfUlhfRU9GICovCisKKwkJCWlmIChtaXNyICYgTUlTUl9SWF9OT0JVRikgeworCQkJCS8qIEFjY29yZGluZyB0byB0aGUgZG9jdW1lbnRhdGlvbiwgd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZywgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBidXQgdHJhcHBpbmcgaXQga2VlcHMgaXQgb3V0IG9mIC92YXIvbG9nL21lc3NhZ2VzLiAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQkJfQkJLyogU0lTUl9SWF9OT0JVRiAqLworCisJCQl3cml0ZXcofm1pc3IsIHN0cmVhbWVyX21taW8gKyBNSVNSX1JVTSk7CisJCQkodm9pZClyZWFkdyhzdHJlYW1lcl9tbWlvICsgTUlTUl9SVU0pOworCQl9CisKKwkJZWxzZSBpZiAoc2lzciAmIFNJU1JfU1JCX1JFUExZKSB7CisJCQlpZiAoc3RyZWFtZXJfcHJpdi0+c3JiX3F1ZXVlZCA9PSAxKSB7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzdHJlYW1lcl9wcml2LT5zcmJfd2FpdCk7CisJCQl9IGVsc2UgaWYgKHN0cmVhbWVyX3ByaXYtPnNyYl9xdWV1ZWQgPT0gMikgeworCQkJCXN0cmVhbWVyX3NyYl9iaChkZXYpOworCQkJfQorCQkJc3RyZWFtZXJfcHJpdi0+c3JiX3F1ZXVlZCA9IDA7CisKKwkJCXdyaXRldyh+U0lTUl9TUkJfUkVQTFksIHN0cmVhbWVyX21taW8gKyBTSVNSX1JVTSk7CisJCQkodm9pZClyZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUl9SVU0pOworCQl9CisKKwkJZWxzZSBpZiAoc2lzciAmIFNJU1JfQURBUFRFUl9DSEVDSykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgQ2hlY2sgSW50ZXJydXB0IFJhaXNlZCwgOCBieXRlcyBvZiBpbmZvcm1hdGlvbiBmb2xsb3c6XG4iLCBkZXYtPm5hbWUpOworCQkJd3JpdGVsKHJlYWRsKHN0cmVhbWVyX21taW8gKyBMQVBXV08pLCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogV29yZHMgJXg6JXg6JXg6JXg6XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgcmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpLAorCQkJICAgICAgIG50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSksCisJCQkgICAgICAgbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKSwKKwkJCSAgICAgICBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpKTsKKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciBtdXN0IGJlIG1hbnVhbGx5IHJlc2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCisJCS8qIFNJU1JfQURBUFRFUl9DSEVDSyAqLworCQllbHNlIGlmIChzaXNyICYgU0lTUl9BU0JfRlJFRSkgeworCQkJLyogV2FrZSB1cCBhbnl0aGluZyB0aGF0IGlzIHdhaXRpbmcgZm9yIHRoZSBhc2IgcmVzcG9uc2UgKi8KKwkJCWlmIChzdHJlYW1lcl9wcml2LT5hc2JfcXVldWVkKSB7CisJCQkJc3RyZWFtZXJfYXNiX2JoKGRldik7CisJCQl9CisJCQl3cml0ZXcoflNJU1JfQVNCX0ZSRUUsIHN0cmVhbWVyX21taW8gKyBTSVNSX1JVTSk7CisJCQkodm9pZClyZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUl9SVU0pOworCQl9CisJCS8qIFNJU1JfQVNCX0ZSRUUgKi8KKwkJZWxzZSBpZiAoc2lzciAmIFNJU1JfQVJCX0NNRCkgeworCQkJc3RyZWFtZXJfYXJiX2NtZChkZXYpOworCQkJd3JpdGV3KH5TSVNSX0FSQl9DTUQsIHN0cmVhbWVyX21taW8gKyBTSVNSX1JVTSk7CisJCQkodm9pZClyZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUl9SVU0pOworCQl9CisJCS8qIFNJU1JfQVJCX0NNRCAqLworCQllbHNlIGlmIChzaXNyICYgU0lTUl9UUkJfUkVQTFkpIHsKKwkJCS8qIFdha2UgdXAgYW55dGhpbmcgdGhhdCBpcyB3YWl0aW5nIGZvciB0aGUgdHJiIHJlc3BvbnNlICovCisJCQlpZiAoc3RyZWFtZXJfcHJpdi0+dHJiX3F1ZXVlZCkgeworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc3RyZWFtZXJfcHJpdi0+CisJCQkJCQkgICAgICB0cmJfd2FpdCk7CisJCQl9CisJCQlzdHJlYW1lcl9wcml2LT50cmJfcXVldWVkID0gMDsKKwkJCXdyaXRldyh+U0lTUl9UUkJfUkVQTFksIHN0cmVhbWVyX21taW8gKyBTSVNSX1JVTSk7CisJCQkodm9pZClyZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUl9SVU0pOworCQl9CisJCS8qIFNJU1JfVFJCX1JFUExZICovCisKKwkJc2lzciA9IHJlYWR3KHN0cmVhbWVyX21taW8gKyBTSVNSKTsKKwkJbWF4X2ludHItLTsKKwl9IC8qIHdoaWxlKCkgKi8JCQorCisJc3Bpbl91bmxvY2soJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xvY2spIDsgCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHN0cmVhbWVyX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqc3RyZWFtZXJfcHJpdiA9CisJICAgIChzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJX191OCBfX2lvbWVtICpzdHJlYW1lcl9tbWlvID0gc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbW1pbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzIDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sb2NrLCBmbGFncyk7CisKKwlpZiAoc3RyZWFtZXJfcHJpdi0+ZnJlZV90eF9yaW5nX2VudHJpZXMpIHsKKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tzdHJlYW1lcl9wcml2LT50eF9yaW5nX2ZyZWVdLnN0YXR1cyA9IDA7CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3Jpbmdbc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19mcmVlXS5idWZjbnRfZnJhbWVsZW4gPSAweDAwMDIwMDAwIHwgc2tiLT5sZW47CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3Jpbmdbc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19mcmVlXS5idWZmZXIgPSAKKwkJCWNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHN0cmVhbWVyX3ByaXYtPnBjaV9kZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpKTsKKwkJc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tzdHJlYW1lcl9wcml2LT50eF9yaW5nX2ZyZWVdLnJzdmQxID0gc2tiLT5sZW47CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3Jpbmdbc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19mcmVlXS5yc3ZkMiA9IDA7CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3Jpbmdbc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19mcmVlXS5yc3ZkMyA9IDA7CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3R4X3Jpbmdbc3RyZWFtZXJfcHJpdi0+dHhfcmluZ19mcmVlXS5idWZsZW4gPSBza2ItPmxlbjsKKworCQlzdHJlYW1lcl9wcml2LT50eF9yaW5nX3NrYltzdHJlYW1lcl9wcml2LT50eF9yaW5nX2ZyZWVdID0gc2tiOworCQlzdHJlYW1lcl9wcml2LT5mcmVlX3R4X3JpbmdfZW50cmllcy0tOworI2lmIFNUUkVBTUVSX0RFQlVHX1BBQ0tFVFMKKwkJeworCQkJaW50IGk7CisJCQlwcmludGsoInN0cmVhbWVyX3htaXQgcGFja2V0IHByaW50OlxuIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2tiLT5sZW47IGkrKykgeworCQkJCXByaW50aygiJXg6Iiwgc2tiLT5kYXRhW2ldKTsKKwkJCQlpZiAoKChpICsgMSkgJSAxNikgPT0gMCkKKwkJCQkJcHJpbnRrKCJcbiIpOworCQkJfQorCQkJcHJpbnRrKCJcbiIpOworCQl9CisjZW5kaWYKKworCQl3cml0ZWwoY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoc3RyZWFtZXJfcHJpdi0+cGNpX2RldiwgCisJCQkJCSZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl90eF9yaW5nW3N0cmVhbWVyX3ByaXYtPnR4X3JpbmdfZnJlZV0sCisJCQkJCXNpemVvZihzdHJ1Y3Qgc3RyZWFtZXJfdHhfZGVzYyksIFBDSV9ETUFfVE9ERVZJQ0UpKSwKKwkJCXN0cmVhbWVyX21taW8gKyBUWDJMRkRBKTsKKwkJKHZvaWQpcmVhZGwoc3RyZWFtZXJfbW1pbyArIFRYMkxGREEpOworCisJCXN0cmVhbWVyX3ByaXYtPnR4X3JpbmdfZnJlZSA9IChzdHJlYW1lcl9wcml2LT50eF9yaW5nX2ZyZWUgKyAxKSAmIChTVFJFQU1FUl9UWF9SSU5HX1NJWkUgLSAxKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbG9jayxmbGFncyk7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sb2NrLGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorfQorCisKK3N0YXRpYyBpbnQgc3RyZWFtZXJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqc3RyZWFtZXJfcHJpdiA9CisJICAgIChzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJX191OCBfX2lvbWVtICpzdHJlYW1lcl9tbWlvID0gc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbW1pbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJd3JpdGV3KHN0cmVhbWVyX3ByaXYtPnNyYiwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCXdyaXRldyhodG9ucyhTUkJfQ0xPU0VfQURBUFRFUiA8PCA4KSxzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCXdyaXRldyhodG9ucyhTVFJFQU1FUl9DTEVBUl9SRVRfQ09ERSA8PCA4KSwgc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sb2NrLCBmbGFncyk7CisKKwlzdHJlYW1lcl9wcml2LT5zcmJfcXVldWVkID0gMTsKKwl3cml0ZXcoTElTUl9TUkJfQ01ELCBzdHJlYW1lcl9tbWlvICsgTElTUl9TVU0pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbG9jaywgZmxhZ3MpOworCisJd2hpbGUgKHN0cmVhbWVyX3ByaXYtPnNyYl9xdWV1ZWQpIAorCXsKKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZzdHJlYW1lcl9wcml2LT5zcmJfd2FpdCwKKwkJCQkJICAgICAgIGppZmZpZXMgKyA2MCAqIEhaKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSAKKwkJeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFNSQiB0aW1lZCBvdXQuXG4iLCBkZXYtPm5hbWUpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU0lTUj0leCBNSVNSPSV4IExJU1I9JXhcbiIsCisJCQkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIFNJU1IpLAorCQkJICAgICAgIHJlYWR3KHN0cmVhbWVyX21taW8gKyBNSVNSX1JVTSksCisJCQkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIExJU1IpKTsKKwkJCXN0cmVhbWVyX3ByaXYtPnNyYl9xdWV1ZWQgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlzdHJlYW1lcl9wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQgPSAoc3RyZWFtZXJfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkICsgMSkgJiAoU1RSRUFNRVJfUlhfUklOR19TSVpFIC0gMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU1RSRUFNRVJfUlhfUklOR19TSVpFOyBpKyspIHsKKwkgICAgICAgIGlmIChzdHJlYW1lcl9wcml2LT5yeF9yaW5nX3NrYltzdHJlYW1lcl9wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWRdKSB7CisJCSAgICAgICAgZGV2X2tmcmVlX3NrYihzdHJlYW1lcl9wcml2LT5yeF9yaW5nX3NrYltzdHJlYW1lcl9wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWRdKTsKKwkJfSAKKwkJc3RyZWFtZXJfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkID0gKHN0cmVhbWVyX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCArIDEpICYgKFNUUkVBTUVSX1JYX1JJTkdfU0laRSAtIDEpOworCX0KKworCS8qIHJlc2V0IHR4L3J4IGZpZm8ncyBhbmQgYnVzbWFzdGVyIGxvZ2ljICovCisKKwkvKiBUQkQuIEFkZCBncmFjZWZ1bCB3YXkgdG8gcmVzZXQgdGhlIExMQyBjaGFubmVsIHdpdGhvdXQgZG9pbmcgYSBzb2Z0IHJlc2V0LiAKKwkgICB3cml0ZWwocmVhZGwoc3RyZWFtZXJfbW1pbytCQ1RMKXwoMzw8MTMpLHN0cmVhbWVyX21taW8rQkNUTCk7CisJICAgdWRlbGF5KDEpOworCSAgIHdyaXRlbChyZWFkbChzdHJlYW1lcl9tbWlvK0JDVEwpJn4oMzw8MTMpLHN0cmVhbWVyX21taW8rQkNUTCk7CisJICovCisKKyNpZiBTVFJFQU1FUl9ERUJVRworCXdyaXRldyhzdHJlYW1lcl9wcml2LT5zcmIsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwlwcmludGsoInNyYik6ICIpOworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJcHJpbnRrKCIleCAiLCBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpKTsKKwl9CisJcHJpbnRrKCJcbiIpOworI2VuZGlmCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN0cmVhbWVyX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKnN0cmVhbWVyX3ByaXYgPQorCSAgICAoc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKikgZGV2LT5wcml2OworCV9fdTggX19pb21lbSAqc3RyZWFtZXJfbW1pbyA9IHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW87CisJX191OCBvcHRpb25zID0gMDsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaTsKKwl1bnNpZ25lZCBjaGFyIGRldl9tY19hZGRyZXNzWzVdOworCWludCBpOworCisJd3JpdGVsKHN0cmVhbWVyX3ByaXYtPnNyYiwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCW9wdGlvbnMgPSBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9jb3B5X2FsbF9vcHRpb25zOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJb3B0aW9ucyB8PSAoMyA8PCA1KTsJLyogQWxsIExMQyBhbmQgTUFDIGZyYW1lcywgYWxsIHRocm91Z2ggdGhlIG1haW4gcnggY2hhbm5lbCAqLworCWVsc2UKKwkJb3B0aW9ucyAmPSB+KDMgPDwgNSk7CisKKwkvKiBPbmx5IGlzc3VlIHRoZSBzcmIgaWYgdGhlcmUgaXMgYSBjaGFuZ2UgaW4gb3B0aW9ucyAqLworCisJaWYgKChvcHRpb25zIF4gc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfY29weV9hbGxfb3B0aW9ucykpIAorCXsKKwkJLyogTm93IHRvIGlzc3VlIHRoZSBzcmIgY29tbWFuZCB0byBhbHRlciB0aGUgY29weS5hbGwub3B0aW9ucyAqLworCQl3cml0ZXcoaHRvbnMoU1JCX01PRElGWV9SRUNFSVZFX09QVElPTlMgPDwgOCksIHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJCXdyaXRldyhodG9ucyhTVFJFQU1FUl9DTEVBUl9SRVRfQ09ERSA8PCA4KSwgc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKwkJd3JpdGV3KGh0b25zKChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yZWNlaXZlX29wdGlvbnMgPDwgOCkgfCBvcHRpb25zKSxzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCQl3cml0ZXcoaHRvbnMoMHg0YTQxKSxzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCQl3cml0ZXcoaHRvbnMoMHg0ZDQ1KSxzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCQl3cml0ZXcoaHRvbnMoMHg1MzIwKSxzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCQl3cml0ZXcoMHgyMDIwLCBzdHJlYW1lcl9tbWlvICsgTEFQRElOQyk7CisKKwkJc3RyZWFtZXJfcHJpdi0+c3JiX3F1ZXVlZCA9IDI7CS8qIENhbid0IHNsZWVwLCB1c2Ugc3JiX2JoICovCisKKwkJd3JpdGVsKExJU1JfU1JCX0NNRCwgc3RyZWFtZXJfbW1pbyArIExJU1JfU1VNKTsKKworCQlzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9jb3B5X2FsbF9vcHRpb25zID0gb3B0aW9uczsKKwkJcmV0dXJuOworCX0KKworCS8qIFNldCB0aGUgZnVuY3Rpb25hbCBhZGRyZXNzZXMgd2UgbmVlZCBmb3IgbXVsdGljYXN0ICovCisJd3JpdGVsKHN0cmVhbWVyX3ByaXYtPnNyYixzdHJlYW1lcl9tbWlvK0xBUEEpOworCWRldl9tY19hZGRyZXNzWzBdID0gZGV2X21jX2FkZHJlc3NbMV0gPSBkZXZfbWNfYWRkcmVzc1syXSA9IGRldl9tY19hZGRyZXNzWzNdID0gMCA7IAorICAKKwlmb3IgKGk9MCxkbWk9ZGV2LT5tY19saXN0O2kgPCBkZXYtPm1jX2NvdW50OyBpKyssZG1pID0gZG1pLT5uZXh0KSAKKwl7IAorICAgCSAgICAgICAgZGV2X21jX2FkZHJlc3NbMF0gfD0gZG1pLT5kbWlfYWRkclsyXSA7IAorCQlkZXZfbWNfYWRkcmVzc1sxXSB8PSBkbWktPmRtaV9hZGRyWzNdIDsgCisJCWRldl9tY19hZGRyZXNzWzJdIHw9IGRtaS0+ZG1pX2FkZHJbNF0gOyAKKwkJZGV2X21jX2FkZHJlc3NbM10gfD0gZG1pLT5kbWlfYWRkcls1XSA7IAorCX0KKyAgCisJd3JpdGV3KGh0b25zKFNSQl9TRVRfRlVOQ19BRERSRVNTIDw8IDgpLHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJd3JpdGV3KGh0b25zKFNUUkVBTUVSX0NMRUFSX1JFVF9DT0RFIDw8IDgpLCBzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCXdyaXRldygwLHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJd3JpdGV3KGh0b25zKCAoZGV2X21jX2FkZHJlc3NbMF0gPDwgOCkgfCBkZXZfbWNfYWRkcmVzc1sxXSksc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKwl3cml0ZXcoaHRvbnMoIChkZXZfbWNfYWRkcmVzc1syXSA8PCA4KSB8IGRldl9tY19hZGRyZXNzWzNdKSxzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCXN0cmVhbWVyX3ByaXYtPnNyYl9xdWV1ZWQgPSAyIDsgCisJd3JpdGVsKExJU1JfU1JCX0NNRCxzdHJlYW1lcl9tbWlvK0xJU1JfU1VNKTsKK30KKworc3RhdGljIHZvaWQgc3RyZWFtZXJfc3JiX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKnN0cmVhbWVyX3ByaXYgPSAoc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKikgZGV2LT5wcml2OworCV9fdTggX19pb21lbSAqc3RyZWFtZXJfbW1pbyA9IHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW87CisJX191MTYgc3JiX3dvcmQ7CisKKwl3cml0ZXcoc3RyZWFtZXJfcHJpdi0+c3JiLCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJc3JiX3dvcmQ9bnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbytMQVBESU5DKSkgPj4gODsKKworCXN3aXRjaCAoc3JiX3dvcmQpIHsKKworCQkvKiBTUkJfTU9ESUZZX1JFQ0VJVkVfT1BUSU9OUyBpLmUuIHNldF9tdWx0aWNhc3RfbGlzdCBvcHRpb25zIChwcm9taXNjdW91cykgCisJCSAqIEF0IHNvbWUgcG9pbnQgd2Ugc2hvdWxkIGRvIHNvbWV0aGluZyBpZiB3ZSBnZXQgYW4gZXJyb3IsIHN1Y2ggYXMKKwkJICogcmVzZXR0aW5nIHRoZSBJRkZfUFJPTUlTQyBmbGFnIGluIGRldgorCQkgKi8KKworCWNhc2UgU1JCX01PRElGWV9SRUNFSVZFX09QVElPTlM6CisJICAgICAgICBzcmJfd29yZD1udG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvK0xBUERJTkMpKSA+PiA4OworCisJCXN3aXRjaCAoc3JiX3dvcmQpIHsKKwkJY2FzZSAweDAxOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBzcmIgY29tbWFuZFxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciBtdXN0IGJlIG9wZW4gZm9yIHRoaXMgb3BlcmF0aW9uLCBkb2ghIVxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21lc3NhZ2VfbGV2ZWwpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlY2VpdmUgT3B0aW9ucyBNb2RpZmllZCB0byAleCwleFxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLAorCQkJCSAgICAgICBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9jb3B5X2FsbF9vcHRpb25zLAorCQkJCSAgICAgICBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yZWNlaXZlX29wdGlvbnMpOworCQkJYnJlYWs7CisJCX0JCS8qIHN3aXRjaCBzcmJbMl0gKi8KKwkJYnJlYWs7CisKKworCQkvKiBTUkJfU0VUX0dST1VQX0FERFJFU1MgLSBNdWx0aWNhc3QgZ3JvdXAgc2V0dGluZyAKKwkJICovCisJY2FzZSBTUkJfU0VUX0dST1VQX0FERFJFU1M6CisJICAgICAgICBzcmJfd29yZD1udG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvK0xBUERJTkMpKSA+PiA4OworCQlzd2l0Y2ggKHNyYl93b3JkKSB7CisJCWNhc2UgMHgwMDoKKwkJICAgICAgICBicmVhazsKKwkJY2FzZSAweDAxOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBzcmIgY29tbWFuZCBcbiIsZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciBtdXN0IGJlIG9wZW4gZm9yIHRoaXMgb3BlcmF0aW9uLCBkb2ghIVxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIDB4M2M6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogR3JvdXAvRnVuY3Rpb25hbCBhZGRyZXNzIGluZGljYXRvciBiaXRzIG5vdCBzZXQgY29ycmVjdGx5XG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMHgzZToJLyogSWYgd2UgZXZlciBpbXBsZW1lbnQgaW5kaXZpZHVhbCBtdWx0aWNhc3QgYWRkcmVzc2VzLCB3aWxsIG5lZWQgdG8gZGVhbCB3aXRoIHRoaXMgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBHcm91cCBhZGRyZXNzIHJlZ2lzdGVycyBmdWxsXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMHg1NToKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBHcm91cCBBZGRyZXNzIGFscmVhZHkgc2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0JCS8qIHN3aXRjaCBzcmJbMl0gKi8KKwkJYnJlYWs7CisKKworCQkvKiBTUkJfUkVTRVRfR1JPVVBfQUREUkVTUyAtIFJlbW92ZSBhIG11bHRpY2FzdCBhZGRyZXNzIGZyb20gZ3JvdXAgbGlzdAorCQkgKi8KKwljYXNlIFNSQl9SRVNFVF9HUk9VUF9BRERSRVNTOgorCSAgICAgICAgc3JiX3dvcmQ9bnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbytMQVBESU5DKSkgPj4gODsKKwkJc3dpdGNoIChzcmJfd29yZCkgeworCQljYXNlIDB4MDA6CisJCSAgICAgICAgYnJlYWs7CisJCWNhc2UgMHgwMToKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbnJlY29nbml6ZWQgc3JiIGNvbW1hbmQgXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwNDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBZGFwdGVyIG11c3QgYmUgb3BlbiBmb3IgdGhpcyBvcGVyYXRpb24sIGRvaCEhXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMHgzOToJLyogTXVzdCBkZWFsIHdpdGggdGhpcyBpZiBpbmRpdmlkdWFsIG11bHRpY2FzdCBhZGRyZXNzZXMgdXNlZCAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdyb3VwIGFkZHJlc3Mgbm90IGZvdW5kIFxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0JCS8qIHN3aXRjaCBzcmJbMl0gKi8KKwkJYnJlYWs7CisKKworCQkvKiBTUkJfU0VUX0ZVTkNfQUREUkVTUyAtIENhbGxlZCBieSB0aGUgc2V0X3J4X21vZGUgCisJCSAqLworCisJY2FzZSBTUkJfU0VUX0ZVTkNfQUREUkVTUzoKKwkgICAgICAgIHNyYl93b3JkPW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8rTEFQRElOQykpID4+IDg7CisJCXN3aXRjaCAoc3JiX3dvcmQpIHsKKwkJY2FzZSAweDAwOgorCQkJaWYgKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21lc3NhZ2VfbGV2ZWwpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZ1bmN0aW9uYWwgQWRkcmVzcyBNYXNrIFNldCBcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSAweDAxOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBzcmIgY29tbWFuZCBcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSAweDA0OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgbXVzdCBiZSBvcGVuIGZvciB0aGlzIG9wZXJhdGlvbiwgZG9oISFcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CQkvKiBzd2l0Y2ggc3JiWzJdICovCisJCWJyZWFrOworCisJCS8qIFNSQl9SRUFEX0xPRyAtIFJlYWQgYW5kIHJlc2V0IHRoZSBhZGFwdGVyIGVycm9yIGNvdW50ZXJzCisJCSAqLworCisJY2FzZSBTUkJfUkVBRF9MT0c6CisJICAgICAgICBzcmJfd29yZD1udG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvK0xBUERJTkMpKSA+PiA4OworCQlzd2l0Y2ggKHNyYl93b3JkKSB7CisJCWNhc2UgMHgwMDoKKwkJCXsKKwkJCQlpbnQgaTsKKwkJCQlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbWVzc2FnZV9sZXZlbCkKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlYWQgTG9nIGNvbW1hbmQgY29tcGxldGVcbiIsIGRldi0+bmFtZSk7CisJCQkJcHJpbnRrKCJSZWFkIExvZyBzdGF0aXN0aWNzOiAiKTsKKwkJCQl3cml0ZXcoc3RyZWFtZXJfcHJpdi0+c3JiICsgNiwKKwkJCQkgICAgICAgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCQkJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJCQkJcHJpbnRrKCIleDoiLCBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpKTsKKwkJCQl9CisJCQkJcHJpbnRrKCJcbiIpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMHgwMToKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbnJlY29nbml6ZWQgc3JiIGNvbW1hbmQgXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwNDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBZGFwdGVyIG11c3QgYmUgb3BlbiBmb3IgdGhpcyBvcGVyYXRpb24sIGRvaCEhXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisKKwkJfQkJLyogc3dpdGNoIHNyYlsyXSAqLworCQlicmVhazsKKworCQkvKiBTUkJfUkVBRF9TUl9DT1VOVEVSUyAtIFJlYWQgYW5kIHJlc2V0IHRoZSBzb3VyY2Ugcm91dGluZyBicmlkZ2UgcmVsYXRlZCBjb3VudGVycyAqLworCisJY2FzZSBTUkJfUkVBRF9TUl9DT1VOVEVSUzoKKwkgICAgICAgIHNyYl93b3JkPW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8rTEFQRElOQykpID4+IDg7CisJCXN3aXRjaCAoc3JiX3dvcmQpIHsKKwkJY2FzZSAweDAwOgorCQkJaWYgKHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21lc3NhZ2VfbGV2ZWwpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlYWQgU291cmNlIFJvdXRpbmcgQ291bnRlcnMgaXNzdWVkXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMToKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbnJlY29nbml6ZWQgc3JiIGNvbW1hbmQgXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMHgwNDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBZGFwdGVyIG11c3QgYmUgb3BlbiBmb3IgdGhpcyBvcGVyYXRpb24sIGRvaCEhXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQkJLyogc3dpdGNoIHNyYlsyXSAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbnJlY29nbml6ZWQgc3JiIGJoIHJldHVybiB2YWx1ZS5cbiIsIGRldi0+bmFtZSk7CisJCWJyZWFrOworCX0JCQkvKiBzd2l0Y2ggc3JiWzBdICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RyZWFtZXJfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKnN0cmVhbWVyX3ByaXY7CisJc3RyZWFtZXJfcHJpdiA9IChzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJcmV0dXJuIChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKSAmc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfc3RhdHM7Cit9CisKK3N0YXRpYyBpbnQgc3RyZWFtZXJfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisJc3RydWN0IHNvY2thZGRyICpzYWRkciA9IGFkZHI7CisJc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKnN0cmVhbWVyX3ByaXYgPSAoc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKikgZGV2LT5wcml2OworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2Fubm90IHNldCBtYWMvbGFhIGFkZHJlc3Mgd2hpbGUgY2FyZCBpcyBvcGVuXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltZW1jcHkoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbGFhLCBzYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisKKwlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbWVzc2FnZV9sZXZlbCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogTUFDL0xBQSBTZXQgdG8gID0gJXguJXguJXguJXguJXguJXhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhYVswXSwKKwkJICAgICAgIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhYVsxXSwKKwkJICAgICAgIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhYVsyXSwKKwkJICAgICAgIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhYVszXSwKKwkJICAgICAgIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhYVs0XSwKKwkJICAgICAgIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhYVs1XSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdHJlYW1lcl9hcmJfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKnN0cmVhbWVyX3ByaXYgPQorCSAgICAoc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKikgZGV2LT5wcml2OworCV9fdTggX19pb21lbSAqc3RyZWFtZXJfbW1pbyA9IHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW87CisJX191OCBoZWFkZXJfbGVuOworCV9fdTE2IGZyYW1lX2xlbiwgYnVmZmVyX2xlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbWFjX2ZyYW1lOworCV9fdTggZnJhbWVfZGF0YVsyNTZdOworCV9fdTE2IGJ1ZmZfb2ZmOworCV9fdTE2IGxhbl9zdGF0dXMgPSAwLCBsYW5fc3RhdHVzX2RpZmY7CS8qIEluaXRpYWxpemUgdG8gc3RvcCBjb21waWxlciB3YXJuaW5nICovCisJX191OCBmZHhfcHJvdF9lcnJvcjsKKwlfX3UxNiBuZXh0X3B0cjsKKwlfX3UxNiBhcmJfd29yZDsKKworI2lmIFNUUkVBTUVSX05FVFdPUktfTU9OSVRPUgorCXN0cnVjdCB0cmhfaGRyICptYWNfaGRyOworI2VuZGlmCisKKwl3cml0ZXcoc3RyZWFtZXJfcHJpdi0+YXJiLCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJYXJiX3dvcmQ9bnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbytMQVBEKSkgPj4gODsKKwkKKwlpZiAoYXJiX3dvcmQgPT0gQVJCX1JFQ0VJVkVfREFUQSkgewkvKiBSZWNlaXZlLmRhdGEsIE1BQyBmcmFtZXMgKi8KKwkJd3JpdGV3KHN0cmVhbWVyX3ByaXYtPmFyYiArIDYsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwkJc3RyZWFtZXJfcHJpdi0+bWFjX3J4X2J1ZmZlciA9IGJ1ZmZfb2ZmID0gbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKTsKKwkJaGVhZGVyX2xlbj1udG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvK0xBUERJTkMpKSA+PiA4OyAvKiA4MDIuNSBUb2tlbi1SaW5nIEhlYWRlciBMZW5ndGggKi8KKwkJZnJhbWVfbGVuID0gbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKTsKKworI2lmIFNUUkVBTUVSX0RFQlVHCisJCXsKKwkJCWludCBpOworCQkJX191MTYgbmV4dDsKKwkJCV9fdTggc3RhdHVzOworCQkJX191MTYgbGVuOworCisJCQl3cml0ZXcobnRvaHMoYnVmZl9vZmYpLCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CS8qc2V0dXAgd2luZG93IHRvIGZyYW1lIGRhdGEgKi8KKwkJCW5leHQgPSBodG9ucyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpOworCQkJc3RhdHVzID0KKwkJCSAgICBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpICYgMHhmZjsKKwkJCWxlbiA9IG50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSk7CisKKwkJCS8qIHByaW50IG91dCAxc3QgMTQgYnl0ZXMgb2YgZnJhbWUgZGF0YSAqLworCQkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQkJCXByaW50aygiTG9jICVkID0gJTA0eFxuIiwgaSwKKwkJCQkgICAgICAgbnRvaHMocmVhZHcKKwkJCQkJICAgICAoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpKSk7CisJCQl9CisKKwkJCXByaW50aygibmV4dCAlMDR4LCBmcyAlMDJ4LCBsZW4gJTA0eCBcbiIsIG5leHQsCisJCQkgICAgICAgc3RhdHVzLCBsZW4pOworCQl9CisjZW5kaWYKKwkJaWYgKCEobWFjX2ZyYW1lID0gZGV2X2FsbG9jX3NrYihmcmFtZV9sZW4pKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBmcmFtZS5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWdvdG8gZHJvcF9mcmFtZTsKKwkJfQorCQkvKiBXYWxrIHRoZSBidWZmZXIgY2hhaW4sIGNyZWF0aW5nIHRoZSBmcmFtZSAqLworCisJCWRvIHsKKwkJCWludCBpOworCQkJX191MTYgcnhfd29yZDsKKworCQkJd3JpdGV3KGh0b25zKGJ1ZmZfb2ZmKSwgc3RyZWFtZXJfbW1pbyArIExBUEEpOwkvKiBzZXR1cCB3aW5kb3cgdG8gZnJhbWUgZGF0YSAqLworCQkJbmV4dF9wdHIgPSBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpOworCQkJcmVhZHcoc3RyZWFtZXJfbW1pbyArIExBUERJTkMpOwkvKiByZWFkIHRocnUgc3RhdHVzIHdvcmQgKi8KKwkJCWJ1ZmZlcl9sZW4gPSBudG9ocyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgTEFQRElOQykpOworCisJCQlpZiAoYnVmZmVyX2xlbiA+IDI1NikKKwkJCQlicmVhazsKKworCQkJaSA9IDA7CisJCQl3aGlsZSAoaSA8IGJ1ZmZlcl9sZW4pIHsKKwkJCQlyeF93b3JkPW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8rTEFQRElOQykpOworCQkJCWZyYW1lX2RhdGFbaV09cnhfd29yZCA+PiA4OworCQkJCWZyYW1lX2RhdGFbaSsxXT1yeF93b3JkICYgMHhmZjsKKwkJCQlpICs9IDI7CisJCQl9CisKKwkJCW1lbWNweShza2JfcHV0KG1hY19mcmFtZSwgYnVmZmVyX2xlbiksCisJCQkJICAgICAgZnJhbWVfZGF0YSwgYnVmZmVyX2xlbik7CisJCX0gd2hpbGUgKG5leHRfcHRyICYmIChidWZmX29mZiA9IG5leHRfcHRyKSk7CisKKyNpZiBTVFJFQU1FUl9ORVRXT1JLX01PTklUT1IKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlY2VpdmVkIE1BQyBGcmFtZSwgZGV0YWlsczogXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJbWFjX2hkciA9IChzdHJ1Y3QgdHJoX2hkciAqKSBtYWNfZnJhbWUtPmRhdGE7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIlczogTUFDIEZyYW1lIERlc3QuIEFkZHI6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbWFjX2hkci0+ZGFkZHJbMF0sIG1hY19oZHItPmRhZGRyWzFdLAorCQkgICAgICAgbWFjX2hkci0+ZGFkZHJbMl0sIG1hY19oZHItPmRhZGRyWzNdLAorCQkgICAgICAgbWFjX2hkci0+ZGFkZHJbNF0sIG1hY19oZHItPmRhZGRyWzVdKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiVzOiBNQUMgRnJhbWUgU3JjZS4gQWRkcjogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBtYWNfaGRyLT5zYWRkclswXSwgbWFjX2hkci0+c2FkZHJbMV0sCisJCSAgICAgICBtYWNfaGRyLT5zYWRkclsyXSwgbWFjX2hkci0+c2FkZHJbM10sCisJCSAgICAgICBtYWNfaGRyLT5zYWRkcls0XSwgbWFjX2hkci0+c2FkZHJbNV0pOworI2VuZGlmCisJCW1hY19mcmFtZS0+ZGV2ID0gZGV2OworCQltYWNfZnJhbWUtPnByb3RvY29sID0gdHJfdHlwZV90cmFucyhtYWNfZnJhbWUsIGRldik7CisJCW5ldGlmX3J4KG1hY19mcmFtZSk7CisKKwkJLyogTm93IHRlbGwgdGhlIGNhcmQgd2UgaGF2ZSBkZWFsdCB3aXRoIHRoZSByZWNlaXZlZCBmcmFtZSAqLworZHJvcF9mcmFtZToKKwkJLyogU2V0IExJU1IgQml0IDEgKi8KKwkJd3JpdGVsKExJU1JfQVJCX0ZSRUUsIHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW8gKyBMSVNSX1NVTSk7CisKKwkJLyogSXMgdGhlIEFTQiBmcmVlID8gKi8KKworCQlpZiAoIShyZWFkbChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvICsgU0lTUikgJiBTSVNSX0FTQl9GUkVFKSkgCisJCXsKKwkJCXN0cmVhbWVyX3ByaXYtPmFzYl9xdWV1ZWQgPSAxOworCQkJd3JpdGVsKExJU1JfQVNCX0ZSRUVfUkVRLCBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvICsgTElTUl9TVU0pOworCQkJcmV0dXJuOworCQkJLyogRHJvcCBvdXQgYW5kIHdhaXQgZm9yIHRoZSBib3R0b20gaGFsZiB0byBiZSBydW4gKi8KKwkJfQorCisKKwkJd3JpdGV3KHN0cmVhbWVyX3ByaXYtPmFzYiwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCQl3cml0ZXcoaHRvbnMoQVNCX1JFQ0VJVkVfREFUQSA8PCA4KSwgc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKwkJd3JpdGV3KGh0b25zKFNUUkVBTUVSX0NMRUFSX1JFVF9DT0RFIDw8IDgpLCBzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCQl3cml0ZXcoMCwgc3RyZWFtZXJfbW1pbyArIExBUERJTkMpOworCQl3cml0ZXcoaHRvbnMoc3RyZWFtZXJfcHJpdi0+bWFjX3J4X2J1ZmZlciksIHN0cmVhbWVyX21taW8gKyBMQVBEKTsKKworCQl3cml0ZWwoTElTUl9BU0JfUkVQTFkgfCBMSVNSX0FTQl9GUkVFX1JFUSwgc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbW1pbyArIExJU1JfU1VNKTsKKworCQlzdHJlYW1lcl9wcml2LT5hc2JfcXVldWVkID0gMjsKKwkJcmV0dXJuOworCisJfSBlbHNlIGlmIChhcmJfd29yZCA9PSBBUkJfTEFOX0NIQU5HRV9TVEFUVVMpIHsJLyogTGFuLmNoYW5nZS5zdGF0dXMgKi8KKwkJd3JpdGV3KHN0cmVhbWVyX3ByaXYtPmFyYiArIDYsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwkJbGFuX3N0YXR1cyA9IG50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8gKyBMQVBESU5DKSk7CisJCWZkeF9wcm90X2Vycm9yID0gbnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbytMQVBEKSkgPj4gODsKKwkJCisJCS8qIElzc3VlIEFSQiBGcmVlICovCisJCXdyaXRldyhMSVNSX0FSQl9GUkVFLCBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tbWlvICsgTElTUl9TVU0pOworCisJCWxhbl9zdGF0dXNfZGlmZiA9IChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sYW5fc3RhdHVzIF4gbGFuX3N0YXR1cykgJiAKKwkJICAgIGxhbl9zdGF0dXM7IAorCisJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiAoTFNDX0xXRiB8IExTQ19BUlcgfCBMU0NfRlBFIHwgTFNDX1JSKSkgCisJCXsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfTFdGKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBTaG9ydCBjaXJjdWl0IGRldGVjdGVkIG9uIHRoZSBsb2JlXG4iLCBkZXYtPm5hbWUpOworCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19BUlcpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEF1dG8gcmVtb3ZhbCBlcnJvclxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfRlBFKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGRFggUHJvdG9jb2wgRXJyb3JcbiIsIGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1JSKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGb3JjZSByZW1vdmUgTUFDIGZyYW1lIHJlY2VpdmVkXG4iLCBkZXYtPm5hbWUpOworCisJCQkvKiBBZGFwdGVyIGhhcyBiZWVuIGNsb3NlZCBieSB0aGUgaGFyZHdhcmUgKi8KKworCQkJLyogcmVzZXQgdHgvcnggZmlmbydzIGFuZCBidXNtYXN0ZXIgbG9naWMgKi8KKworCQkJLyogQFRCRC4gbm8gbGxjIHJlc2V0IG9uIGF1dG9zdHJlYW1lciB3cml0ZWwocmVhZGwoc3RyZWFtZXJfbW1pbytCQ1RMKXwoMzw8MTMpLHN0cmVhbWVyX21taW8rQkNUTCk7CisJCQkgICB1ZGVsYXkoMSk7CisJCQkgICB3cml0ZWwocmVhZGwoc3RyZWFtZXJfbW1pbytCQ1RMKSZ+KDM8PDEzKSxzdHJlYW1lcl9tbWlvK0JDVEwpOyAqLworCisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgbXVzdCBiZSBtYW51YWxseSByZXNldC5cbiIsIGRldi0+bmFtZSk7CisJCX0KKwkJLyogSWYgc2VyaW91cyBlcnJvciAqLworCQlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbWVzc2FnZV9sZXZlbCkgeworCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19TSUdfTE9TUykKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8gcmVjZWl2ZSBzaWduYWwgZGV0ZWN0ZWQgXG4iLCBkZXYtPm5hbWUpOworCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19IQVJEX0VSUikgCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJlYWNvbmluZyBcbiIsIGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1NPRlRfRVJSKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBZGFwdGVyIHRyYW5zbWl0dGVkIFNvZnQgRXJyb3IgUmVwb3J0IE1hYyBGcmFtZSBcbiIsIGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1RSQU5fQkNOKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBXZSBhcmUgdHJhbm1pdHRpbmcgdGhlIGJlYWNvbiwgYWFhaFxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfU1MpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNpbmdsZSBTdGF0aW9uIG9uIHRoZSByaW5nIFxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfUklOR19SRUMpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJpbmcgcmVjb3Zlcnkgb25nb2luZ1xuIiwgZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfRkRYX01PREUpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE9wZXJhdGluZyBpbiBGRFggbW9kZVxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCisJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfQ08pIHsKKwkJCWlmIChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9tZXNzYWdlX2xldmVsKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb3VudGVyIE92ZXJmbG93IFxuIiwgZGV2LT5uYW1lKTsKKworCQkJLyogSXNzdWUgUkVBRC5MT0cgY29tbWFuZCAqLworCisJCQl3cml0ZXcoc3RyZWFtZXJfcHJpdi0+c3JiLCBzdHJlYW1lcl9tbWlvICsgTEFQQSk7CisJCQl3cml0ZXcoaHRvbnMoU1JCX1JFQURfTE9HIDw8IDgpLHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJCQl3cml0ZXcoaHRvbnMoU1RSRUFNRVJfQ0xFQVJfUkVUX0NPREUgPDwgOCksIHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJCQl3cml0ZXcoMCwgc3RyZWFtZXJfbW1pbyArIExBUERJTkMpOworCQkJc3RyZWFtZXJfcHJpdi0+c3JiX3F1ZXVlZCA9IDI7CS8qIENhbid0IHNsZWVwLCB1c2Ugc3JiX2JoICovCisKKwkJCXdyaXRldyhMSVNSX1NSQl9DTUQsIHN0cmVhbWVyX21taW8gKyBMSVNSX1NVTSk7CisJCX0KKworCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1NSX0NPKSB7CisJCQlpZiAoc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbWVzc2FnZV9sZXZlbCkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogU291cmNlIHJvdXRpbmcgY291bnRlcnMgb3ZlcmZsb3dcbiIsIGRldi0+bmFtZSk7CisKKwkJCS8qIElzc3VlIGEgUkVBRC5TUi5DT1VOVEVSUyAqLworCQkJd3JpdGV3KHN0cmVhbWVyX3ByaXYtPnNyYiwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCQkJd3JpdGV3KGh0b25zKFNSQl9SRUFEX1NSX0NPVU5URVJTIDw8IDgpLAorCQkJICAgICAgIHN0cmVhbWVyX21taW8rTEFQRElOQyk7CisJCQl3cml0ZXcoaHRvbnMoU1RSRUFNRVJfQ0xFQVJfUkVUX0NPREUgPDwgOCksCisJCQkgICAgICAgc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKwkJCXN0cmVhbWVyX3ByaXYtPnNyYl9xdWV1ZWQgPSAyOwkvKiBDYW4ndCBzbGVlcCwgdXNlIHNyYl9iaCAqLworCQkJd3JpdGV3KExJU1JfU1JCX0NNRCwgc3RyZWFtZXJfbW1pbyArIExJU1JfU1VNKTsKKworCQl9CisJCXN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xhbl9zdGF0dXMgPSBsYW5fc3RhdHVzOworCX0gLyogTGFuLmNoYW5nZS5zdGF0dXMgKi8KKwllbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmtub3duIGFyYiBjb21tYW5kIFxuIiwgZGV2LT5uYW1lKTsKK30KKworc3RhdGljIHZvaWQgc3RyZWFtZXJfYXNiX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKnN0cmVhbWVyX3ByaXYgPQorCSAgICAoc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgKikgZGV2LT5wcml2OworCV9fdTggX19pb21lbSAqc3RyZWFtZXJfbW1pbyA9IHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW87CisKKwlpZiAoc3RyZWFtZXJfcHJpdi0+YXNiX3F1ZXVlZCA9PSAxKSAKKwl7CisJCS8qIERyb3BwZWQgdGhyb3VnaCB0aGUgZmlyc3QgdGltZSAqLworCisJCXdyaXRldyhzdHJlYW1lcl9wcml2LT5hc2IsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwkJd3JpdGV3KGh0b25zKEFTQl9SRUNFSVZFX0RBVEEgPDwgOCksc3RyZWFtZXJfbW1pbytMQVBESU5DKTsKKwkJd3JpdGV3KGh0b25zKFNUUkVBTUVSX0NMRUFSX1JFVF9DT0RFIDw8IDgpLCBzdHJlYW1lcl9tbWlvK0xBUERJTkMpOworCQl3cml0ZXcoMCwgc3RyZWFtZXJfbW1pbyArIExBUERJTkMpOworCQl3cml0ZXcoaHRvbnMoc3RyZWFtZXJfcHJpdi0+bWFjX3J4X2J1ZmZlciksIHN0cmVhbWVyX21taW8gKyBMQVBEKTsKKworCQl3cml0ZWwoTElTUl9BU0JfUkVQTFkgfCBMSVNSX0FTQl9GUkVFX1JFUSwgc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbW1pbyArIExJU1JfU1VNKTsKKwkJc3RyZWFtZXJfcHJpdi0+YXNiX3F1ZXVlZCA9IDI7CisKKwkJcmV0dXJuOworCX0KKworCWlmIChzdHJlYW1lcl9wcml2LT5hc2JfcXVldWVkID09IDIpIHsKKwkJX191OCByYzsKKwkJd3JpdGV3KHN0cmVhbWVyX3ByaXYtPmFzYiArIDIsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwkJcmM9bnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbytMQVBEKSkgPj4gODsKKwkJc3dpdGNoIChyYykgeworCQljYXNlIDB4MDE6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5yZWNvZ25pemVkIGNvbW1hbmQgY29kZSBcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSAweDI2OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBidWZmZXIgYWRkcmVzcyBcbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSAweEZGOgorCQkJLyogVmFsaWQgcmVzcG9uc2UsIGV2ZXJ5dGhpbmcgc2hvdWxkIGJlIG9rIGFnYWluICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJbnZhbGlkIHJldHVybiBjb2RlIGluIGFzYlxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXN0cmVhbWVyX3ByaXYtPmFzYl9xdWV1ZWQgPSAwOworfQorCitzdGF0aWMgaW50IHN0cmVhbWVyX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG10dSkKK3sKKwlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqc3RyZWFtZXJfcHJpdiA9CisJICAgIChzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJX191MTYgbWF4X210dTsKKworCWlmIChzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yaW5nX3NwZWVkID09IDQpCisJCW1heF9tdHUgPSA0NTAwOworCWVsc2UKKwkJbWF4X210dSA9IDE4MDAwOworCisJaWYgKG10dSA+IG1heF9tdHUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChtdHUgPCAxMDApCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2LT5tdHUgPSBtdHU7CisJc3RyZWFtZXJfcHJpdi0+cGt0X2J1Zl9zeiA9IG10dSArIFRSX0hMRU47CisKKwlyZXR1cm4gMDsKK30KKworI2lmIFNUUkVBTUVSX05FVFdPUktfTU9OSVRPUgorI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgaW50IHN0cmVhbWVyX3Byb2NfaW5mbyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJICAgICAgaW50IGxlbmd0aCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisgIHN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICpzZGV2PU5VTEw7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXZpY2UgPSBOVUxMOworCWludCBsZW4gPSAwOworCW9mZl90IGJlZ2luID0gMDsKKwlvZmZfdCBwb3MgPSAwOworCWludCBzaXplOworCisgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlzaXplID0gc3ByaW50ZihidWZmZXIsICJJQk0gTGFuU3RyZWFtZXIvTVBDIENoaXBzZXQgVG9rZW4gUmluZyBBZGFwdGVyc1xuIik7CisKKwlwb3MgKz0gc2l6ZTsKKwlsZW4gKz0gc2l6ZTsKKworICBmb3Ioc2Rldj1kZXZfc3RyZWFtZXI7IHNkZXY7IHNkZXY9c2Rldi0+bmV4dCkgeworICAgIHBjaV9kZXZpY2U9c2Rldi0+cGNpX2RldjsKKyAgICBkZXY9cGNpX2dldF9kcnZkYXRhKHBjaV9kZXZpY2UpOworCisJCQkJc2l6ZSA9IHNwcmludGZfaW5mbyhidWZmZXIgKyBsZW4sIGRldik7CisJCQkJbGVuICs9IHNpemU7CisJCQkJcG9zID0gYmVnaW4gKyBsZW47CisKKwkJCQlpZiAocG9zIDwgb2Zmc2V0KSB7CisJCQkJCWxlbiA9IDA7CisJCQkJCWJlZ2luID0gcG9zOworCQkJCX0KKwkJCQlpZiAocG9zID4gb2Zmc2V0ICsgbGVuZ3RoKQorCQkJCQlicmVhazsKKwkJfQkJLyogZm9yICovCisKKwkqc3RhcnQgPSBidWZmZXIgKyAob2Zmc2V0IC0gYmVnaW4pOwkvKiBTdGFydCBvZiB3YW50ZWQgZGF0YSAqLworCWxlbiAtPSAob2Zmc2V0IC0gYmVnaW4pOwkvKiBTdGFydCBzbG9wICovCisJaWYgKGxlbiA+IGxlbmd0aCkKKwkJbGVuID0gbGVuZ3RoOwkvKiBFbmRpbmcgc2xvcCAqLworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgc3ByaW50Zl9pbmZvKGNoYXIgKmJ1ZmZlciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqc3RyZWFtZXJfcHJpdiA9CisJICAgIChzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJX191OCBfX2lvbWVtICpzdHJlYW1lcl9tbWlvID0gc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfbW1pbzsKKwlzdHJ1Y3Qgc3RyZWFtZXJfYWRhcHRlcl9hZGRyX3RhYmxlIHNhdDsKKwlzdHJ1Y3Qgc3RyZWFtZXJfcGFyYW1ldGVyc190YWJsZSBzcHQ7CisJaW50IHNpemUgPSAwOworCWludCBpOworCisJd3JpdGV3KHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2FkZHJfdGFibGVfYWRkciwgc3RyZWFtZXJfbW1pbyArIExBUEEpOworCWZvciAoaSA9IDA7IGkgPCAxNDsgaSArPSAyKSB7CisJCV9fdTE2IGlvX3dvcmQ7CisJCV9fdTggKmRhdGFwID0gKF9fdTggKikgJiBzYXQ7CisJCWlvX3dvcmQ9bnRvaHMocmVhZHcoc3RyZWFtZXJfbW1pbytMQVBESU5DKSk7CisJCWRhdGFwW3NpemVdPWlvX3dvcmQgPj4gODsKKwkJZGF0YXBbc2l6ZSsxXT1pb193b3JkICYgMHhmZjsKKwl9CisJd3JpdGV3KHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX3Bhcm1zX2FkZHIsIHN0cmVhbWVyX21taW8gKyBMQVBBKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjg7IGkgKz0gMikgeworCQlfX3UxNiBpb193b3JkOworCQlfX3U4ICpkYXRhcCA9IChfX3U4ICopICYgc3B0OworCQlpb193b3JkPW50b2hzKHJlYWR3KHN0cmVhbWVyX21taW8rTEFQRElOQykpOworCQlkYXRhcFtzaXplXT1pb193b3JkID4+IDg7CisJCWRhdGFwW3NpemUrMV09aW9fd29yZCAmIDB4ZmY7CisJfQorCisKKwlzaXplID0gc3ByaW50ZihidWZmZXIsICJcbiU2czogQWRhcHRlciBBZGRyZXNzICAgOiBOb2RlIEFkZHJlc3MgICAgICA6IEZ1bmN0aW9uYWwgQWRkclxuIiwgZGV2LT5uYW1lKTsKKworCXNpemUgKz0gc3ByaW50ZihidWZmZXIgKyBzaXplLAorCQkgICAgIiU2czogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCA6ICUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCSAgICBkZXYtPm5hbWUsIGRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sCisJCSAgICBkZXYtPmRldl9hZGRyWzJdLCBkZXYtPmRldl9hZGRyWzNdLCBkZXYtPmRldl9hZGRyWzRdLAorCQkgICAgZGV2LT5kZXZfYWRkcls1XSwgc2F0Lm5vZGVfYWRkclswXSwgc2F0Lm5vZGVfYWRkclsxXSwKKwkJICAgIHNhdC5ub2RlX2FkZHJbMl0sIHNhdC5ub2RlX2FkZHJbM10sIHNhdC5ub2RlX2FkZHJbNF0sCisJCSAgICBzYXQubm9kZV9hZGRyWzVdLCBzYXQuZnVuY19hZGRyWzBdLCBzYXQuZnVuY19hZGRyWzFdLAorCQkgICAgc2F0LmZ1bmNfYWRkclsyXSwgc2F0LmZ1bmNfYWRkclszXSk7CisKKwlzaXplICs9IHNwcmludGYoYnVmZmVyICsgc2l6ZSwgIlxuJTZzOiBUb2tlbiBSaW5nIFBhcmFtZXRlcnMgVGFibGU6XG4iLCBkZXYtPm5hbWUpOworCisJc2l6ZSArPSBzcHJpbnRmKGJ1ZmZlciArIHNpemUsICIlNnM6IFBoeXNpY2FsIEFkZHIgOiBVcCBOb2RlIEFkZHJlc3MgICA6IFBvbGwgQWRkcmVzcyAgICAgIDogQWNjUHJpIDogQXV0aCBTcmMgOiBBdHQgQ29kZSA6XG4iLCBkZXYtPm5hbWUpOworCisJc2l6ZSArPSBzcHJpbnRmKGJ1ZmZlciArIHNpemUsCisJCSAgICAiJTZzOiAlMDJ4OiUwMng6JTAyeDolMDJ4ICAgOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCA6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IDogJTA0eCAgIDogJTA0eCAgICAgOiAgJTA0eCAgICA6XG4iLAorCQkgICAgZGV2LT5uYW1lLCBzcHQucGh5c19hZGRyWzBdLCBzcHQucGh5c19hZGRyWzFdLAorCQkgICAgc3B0LnBoeXNfYWRkclsyXSwgc3B0LnBoeXNfYWRkclszXSwKKwkJICAgIHNwdC51cF9ub2RlX2FkZHJbMF0sIHNwdC51cF9ub2RlX2FkZHJbMV0sCisJCSAgICBzcHQudXBfbm9kZV9hZGRyWzJdLCBzcHQudXBfbm9kZV9hZGRyWzNdLAorCQkgICAgc3B0LnVwX25vZGVfYWRkcls0XSwgc3B0LnVwX25vZGVfYWRkcls0XSwKKwkJICAgIHNwdC5wb2xsX2FkZHJbMF0sIHNwdC5wb2xsX2FkZHJbMV0sIHNwdC5wb2xsX2FkZHJbMl0sCisJCSAgICBzcHQucG9sbF9hZGRyWzNdLCBzcHQucG9sbF9hZGRyWzRdLCBzcHQucG9sbF9hZGRyWzVdLAorCQkgICAgbnRvaHMoc3B0LmFjY19wcmlvcml0eSksIG50b2hzKHNwdC5hdXRoX3NvdXJjZV9jbGFzcyksCisJCSAgICBudG9ocyhzcHQuYXR0X2NvZGUpKTsKKworCXNpemUgKz0gc3ByaW50ZihidWZmZXIgKyBzaXplLCAiJTZzOiBTb3VyY2UgQWRkcmVzcyAgICA6IEJjbiBUIDogTWFqLiBWIDogTGFuIFN0IDogTGNsIFJnIDogTW9uIEVyciA6IEZyYW1lIENvcnJlbCA6IFxuIiwgZGV2LT5uYW1lKTsKKworCXNpemUgKz0gc3ByaW50ZihidWZmZXIgKyBzaXplLAorCQkgICAgIiU2czogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggOiAlMDR4ICA6ICUwNHggICA6ICUwNHggICA6ICUwNHggICA6ICUwNHggICAgOiAgICAgJTA0eCAgICAgOiBcbiIsCisJCSAgICBkZXYtPm5hbWUsIHNwdC5zb3VyY2VfYWRkclswXSwgc3B0LnNvdXJjZV9hZGRyWzFdLAorCQkgICAgc3B0LnNvdXJjZV9hZGRyWzJdLCBzcHQuc291cmNlX2FkZHJbM10sCisJCSAgICBzcHQuc291cmNlX2FkZHJbNF0sIHNwdC5zb3VyY2VfYWRkcls1XSwKKwkJICAgIG50b2hzKHNwdC5iZWFjb25fdHlwZSksIG50b2hzKHNwdC5tYWpvcl92ZWN0b3IpLAorCQkgICAgbnRvaHMoc3B0Lmxhbl9zdGF0dXMpLCBudG9ocyhzcHQubG9jYWxfcmluZyksCisJCSAgICBudG9ocyhzcHQubW9uX2Vycm9yKSwgbnRvaHMoc3B0LmZyYW1lX2NvcnJlbCkpOworCisJc2l6ZSArPSBzcHJpbnRmKGJ1ZmZlciArIHNpemUsICIlNnM6IEJlYWNvbiBEZXRhaWxzIDogIFR4ICA6ICBSeCAgOiBOQVVOIE5vZGUgQWRkcmVzcyA6IE5BVU4gTm9kZSBQaHlzIDogXG4iLAorCQkgICAgZGV2LT5uYW1lKTsKKworCXNpemUgKz0gc3ByaW50ZihidWZmZXIgKyBzaXplLAorCQkgICAgIiU2czogICAgICAgICAgICAgICAgOiAgJTAyeCAgOiAgJTAyeCAgOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCA6ICUwMng6JTAyeDolMDJ4OiUwMnggICAgOiBcbiIsCisJCSAgICBkZXYtPm5hbWUsIG50b2hzKHNwdC5iZWFjb25fdHJhbnNtaXQpLAorCQkgICAgbnRvaHMoc3B0LmJlYWNvbl9yZWNlaXZlKSwgc3B0LmJlYWNvbl9uYXVuWzBdLAorCQkgICAgc3B0LmJlYWNvbl9uYXVuWzFdLCBzcHQuYmVhY29uX25hdW5bMl0sCisJCSAgICBzcHQuYmVhY29uX25hdW5bM10sIHNwdC5iZWFjb25fbmF1bls0XSwKKwkJICAgIHNwdC5iZWFjb25fbmF1bls1XSwgc3B0LmJlYWNvbl9waHlzWzBdLAorCQkgICAgc3B0LmJlYWNvbl9waHlzWzFdLCBzcHQuYmVhY29uX3BoeXNbMl0sCisJCSAgICBzcHQuYmVhY29uX3BoeXNbM10pOworCXJldHVybiBzaXplOworfQorI2VuZGlmCisjZW5kaWYKKworI2lmIFNUUkVBTUVSX0lPQ1RMICYmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCitzdGF0aWMgaW50IHN0cmVhbWVyX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworICAgICAgICBpbnQgaTsKKwlzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqc3RyZWFtZXJfcHJpdiA9IChzdHJ1Y3Qgc3RyZWFtZXJfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CisJdTggX19pb21lbSAqc3RyZWFtZXJfbW1pbyA9IHN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX21taW87CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBJT0NUTF9TSVNSX01BU0s6CisJCXdyaXRldyhTSVNSX01JLCBzdHJlYW1lcl9tbWlvICsgU0lTUl9NQVNLX1NVTSk7CisJCWJyZWFrOworCWNhc2UgSU9DVExfU1BJTl9MT0NLX1RFU1Q6CisJICAgICAgICBwcmludGsoS0VSTl9JTkZPICJzcGluX2xvY2soKSBjYWxsZWQuXG4iKTsKKwkJc3Bpbl9sb2NrKCZzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJnN0cmVhbWVyX3ByaXYtPnN0cmVhbWVyX2xvY2spOworCQlwcmludGsoS0VSTl9JTkZPICJzcGluX3VubG9jaygpIGZpbmlzaGVkLlxuIik7CisJCWJyZWFrOworCWNhc2UgSU9DVExfUFJJTlRfQkRBUzoKKwkgICAgICAgIHByaW50ayhLRVJOX0lORk8gImJkYXM6IFJYQkRBOiAleCBSWExCREE6ICV4IFRYMkZEQTogJXggVFgyTEZEQTogJXhcbiIsCisJCSAgICAgICByZWFkdyhzdHJlYW1lcl9tbWlvICsgUlhCREEpLAorCQkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIFJYTEJEQSksCisJCSAgICAgICByZWFkdyhzdHJlYW1lcl9tbWlvICsgVFgyRkRBKSwKKwkJICAgICAgIHJlYWR3KHN0cmVhbWVyX21taW8gKyBUWDJMRkRBKSk7CisJCWJyZWFrOworCWNhc2UgSU9DVExfUFJJTlRfUkVHSVNURVJTOgorCSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAicmVnaXN0ZXJzOlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIlNJU1I6ICUwNHggTUlTUjogJTA0eCBMSVNSOiAlMDR4IEJDVEw6ICUwNHggQk1DVEw6ICUwNHhcbm1hc2sgICUwNHggbWFzayAgJTA0eFxuIiwgCisJCSAgICAgICByZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUiksCisJCSAgICAgICByZWFkdyhzdHJlYW1lcl9tbWlvICsgTUlTUl9SVU0pLAorCQkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIExJU1IpLAorCQkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIEJDVEwpLAorCQkgICAgICAgcmVhZHcoc3RyZWFtZXJfbW1pbyArIEJNQ1RMX1NVTSksCisJCSAgICAgICByZWFkdyhzdHJlYW1lcl9tbWlvICsgU0lTUl9NQVNLKSwKKwkJICAgICAgIHJlYWR3KHN0cmVhbWVyX21taW8gKyBNSVNSX01BU0spKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NUTF9QUklOVF9SWF9CVUZTOgorCSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiUHJpbnQgcnggYnVmczpcbiIpOworCQlmb3IoaT0wOyBpPFNUUkVBTUVSX1JYX1JJTkdfU0laRTsgaSsrKQorCQkgICAgICAgIHByaW50ayhLRVJOX0lORk8gInJ4X3JpbmcgJWQgc3RhdHVzOiAweCV4XG4iLCBpLCAKKwkJCSAgICAgICBzdHJlYW1lcl9wcml2LT5zdHJlYW1lcl9yeF9yaW5nW2ldLnN0YXR1cyk7CisJCWJyZWFrOworCWNhc2UgSU9DVExfUFJJTlRfVFhfQlVGUzoKKwkgICAgICAgIHByaW50ayhLRVJOX0lORk8gIlByaW50IHR4IGJ1ZnM6XG4iKTsKKwkJZm9yKGk9MDsgaTxTVFJFQU1FUl9UWF9SSU5HX1NJWkU7IGkrKykKKwkJICAgICAgICBwcmludGsoS0VSTl9JTkZPICJ0eF9yaW5nICVkIHN0YXR1czogMHgleFxuIiwgaSwgCisJCQkgICAgICAgc3RyZWFtZXJfcHJpdi0+c3RyZWFtZXJfdHhfcmluZ1tpXS5zdGF0dXMpOworCQlicmVhazsKKwljYXNlIElPQ1RMX1JYX0NNRDoKKwkgICAgICAgIHN0cmVhbWVyX3J4KGRldik7CisJCXByaW50ayhLRVJOX0lORk8gIlNlbnQgcnggY29tbWFuZC5cbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiQmFkIGlvY3RsIVxuIik7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzdHJlYW1lcl9wY2lfZHJpdmVyID0geworICAubmFtZSAgICAgPSAibGFuc3RyZWFtZXIiLAorICAuaWRfdGFibGUgPSBzdHJlYW1lcl9wY2lfdGJsLAorICAucHJvYmUgICAgPSBzdHJlYW1lcl9pbml0X29uZSwKKyAgLnJlbW92ZSAgID0gX19kZXZleGl0X3Aoc3RyZWFtZXJfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzdHJlYW1lcl9pbml0X21vZHVsZSh2b2lkKSB7CisgIHJldHVybiBwY2lfbW9kdWxlX2luaXQoJnN0cmVhbWVyX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc3RyZWFtZXJfY2xlYW51cF9tb2R1bGUodm9pZCkgeworICBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnN0cmVhbWVyX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzdHJlYW1lcl9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChzdHJlYW1lcl9jbGVhbnVwX21vZHVsZSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvbGFuc3RyZWFtZXIuaCBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9sYW5zdHJlYW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NTdkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvbGFuc3RyZWFtZXIuaApAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAqICAgbGFuc3RyZWFtZXIuaCAtLSBkcml2ZXIgZm9yIHRoZSBJQk0gQXV0byBMQU5TdHJlYW1lciBQQ0kgQWRhcHRlcgorICoKKyAqICBXcml0dGVuIEJ5OiBNaWtlIFN1bGxpdmFuLCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqICBMaW51eCBkcml2ZXIgZm9yIElCTSBQQ0kgdG9rZW5yaW5nIGNhcmRzIGJhc2VkIG9uIHRoZSBMYW5TdHJlYW1lciBNUEMKKyAqICBjaGlwc2V0LiAKKyAqCisgKiAgVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gdGhlIG9seW1waWMgZHJpdmVyIGZvciBJQk0gUENJIFRva2VuUmluZyBjYXJkcyAoUGl0L1BpdC1QaHkvT2x5bXBpYworICogIGNoaXBzZXRzKSB3cml0dGVuICBieToKKyAqICAgICAgMTk5OSBQZXRlciBEZSBTY2hyaWp2ZXIgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoJMTk5OSBNaWtlIFBoaWxsaXBzIChwaGlsbGltQGFtdHJhay5jb20pCisgKgorICogIEJhc2UgRHJpdmVyIFNrZWxldG9uOgorICogICAgICBXcml0dGVuIDE5OTMtOTQgYnkgRG9uYWxkIEJlY2tlci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAxOTkzIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKKyAqICAgICAgRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAgIAorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgICAKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICAgCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICAgCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAgIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgICAKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogTk8gV0FSUkFOVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiAgICAgICAgCisgKiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCAgICAgIAorICogTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgICAgICAKKyAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgICAgCisgKiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kICAgICAgIAorICogZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzICAgICAgICAKKyAqIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byAgICAgCisgKiB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCAgICAgICAgIAorICogcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBESVNDTEFJTUVSIE9GIExJQUJJTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgICAKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCAgICAgICAgCisgKiBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCAgIAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SICAgICAKKyAqIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgICAgCisgKiBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgIAorICogSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUyAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAgIAorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgICAgICAgICAgICAgICAKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCisgKiAgMTIvMTAvOTkgLSBBbHBoYSBSZWxlYXNlIDAuMS4wCisgKiAgICAgICAgICAgIEZpcnN0IHJlbGVhc2UgdG8gdGhlIHB1YmxpYworICogIDA4LzE1LzAxIC0gQWRkZWQgaW9jdGwoKSBkZWZpbml0aW9ucyBhbmQgb3RoZXJzIC0gS2VudCBZb2RlciA8eW9kZXIxQHVzLmlibS5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpZiBTVFJFQU1FUl9JT0NUTCAmJiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgorI2RlZmluZSBJT0NUTF9QUklOVF9SWF9CVUZTICAgU0lPQ0RFVlBSSVZBVEUKKyNkZWZpbmUgSU9DVExfUFJJTlRfVFhfQlVGUyAgIFNJT0NERVZQUklWQVRFKzEKKyNkZWZpbmUgSU9DVExfUlhfQ01EICAgICAgICAgIFNJT0NERVZQUklWQVRFKzIKKyNkZWZpbmUgSU9DVExfVFhfQ01EICAgICAgICAgIFNJT0NERVZQUklWQVRFKzMKKyNkZWZpbmUgSU9DVExfUFJJTlRfUkVHSVNURVJTIFNJT0NERVZQUklWQVRFKzQKKyNkZWZpbmUgSU9DVExfUFJJTlRfQkRBUyAgICAgIFNJT0NERVZQUklWQVRFKzUKKyNkZWZpbmUgSU9DVExfU1BJTl9MT0NLX1RFU1QgIFNJT0NERVZQUklWQVRFKzYKKyNkZWZpbmUgSU9DVExfU0lTUl9NQVNLICAgICAgIFNJT0NERVZQUklWQVRFKzcKKyNlbmRpZgorCisvKiBNQVhfSU5UUiAtIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB3ZSBjYW4gbG9vcAorICogaW5zaWRlIHRoZSBpbnRlcnJ1cHQgZnVuY3Rpb24gYmVmb3JlIHJldHVybmluZworICogY29udHJvbCB0byB0aGUgT1MgKG1heGltdW0gdmFsdWUgaXMgMjU2KQorICovCisjZGVmaW5lIE1BWF9JTlRSIDUKKworI2RlZmluZSBDTFMgMHgwQworI2RlZmluZSBNTFIgMHg4NgorI2RlZmluZSBMVFIgMHgwRAorCisjZGVmaW5lIEJDVEwgMHg2MAorI2RlZmluZSBCQ1RMX1NPRlRSRVNFVCAoMTw8MTUpCisjZGVmaW5lIEJDVExfUlhfRklGT184ICgxPDwxKQorI2RlZmluZSBCQ1RMX1RYX0ZJRk9fOCAoMTw8MykKKworI2RlZmluZSBHUFIgMHg0YQorI2RlZmluZSBHUFJfQVVUT1NFTlNFICgxPDwyKQorI2RlZmluZSBHUFJfMTZNQlBTICgxPDwzKQorCisjZGVmaW5lIExJU1IgMHgxMAorI2RlZmluZSBMSVNSX1NVTSAweDEyCisjZGVmaW5lIExJU1JfUlVNIDB4MTQKKworI2RlZmluZSBMSVNSX0xJRSAoMTw8MTUpCisjZGVmaW5lIExJU1JfU0xJTSAoMTw8MTMpCisjZGVmaW5lIExJU1JfU0xJICgxPDwxMikKKyNkZWZpbmUgTElTUl9CUEVJICgxPDw5KQorI2RlZmluZSBMSVNSX0JQRSAoMTw8OCkKKyNkZWZpbmUgTElTUl9TUkJfQ01EICgxPDw1KQorI2RlZmluZSBMSVNSX0FTQl9SRVBMWSAoMTw8NCkKKyNkZWZpbmUgTElTUl9BU0JfRlJFRV9SRVEgKDE8PDIpCisjZGVmaW5lIExJU1JfQVJCX0ZSRUUgKDE8PDEpCisjZGVmaW5lIExJU1JfVFJCX0ZSQU1FICgxPDwwKQorCisjZGVmaW5lIFNJU1IgMHgxNgorI2RlZmluZSBTSVNSX1NVTSAweDE4CisjZGVmaW5lIFNJU1JfUlVNIDB4MUEKKyNkZWZpbmUgU0lTUl9NQVNLIDB4NTQKKyNkZWZpbmUgU0lTUl9NQVNLX1NVTSAweDU2CisjZGVmaW5lIFNJU1JfTUFTS19SVU0gMHg1OAorCisjZGVmaW5lIFNJU1JfTUkgKDE8PDE1KQorI2RlZmluZSBTSVNSX1NFUlJfRVJSICgxPDwxNCkKKyNkZWZpbmUgU0lTUl9USU1FUiAoMTw8MTEpCisjZGVmaW5lIFNJU1JfTEFQX1BBUl9FUlIgKDE8PDEwKQorI2RlZmluZSBTSVNSX0xBUF9BQ0NfRVJSICgxPDw5KQorI2RlZmluZSBTSVNSX1BBUl9FUlIgKDE8PDgpCisjZGVmaW5lIFNJU1JfQURBUFRFUl9DSEVDSyAoMTw8NikKKyNkZWZpbmUgU0lTUl9TUkJfUkVQTFkgKDE8PDUpCisjZGVmaW5lIFNJU1JfQVNCX0ZSRUUgKDE8PDQpCisjZGVmaW5lIFNJU1JfQVJCX0NNRCAoMTw8MykKKyNkZWZpbmUgU0lTUl9UUkJfUkVQTFkgKDE8PDIpCisKKyNkZWZpbmUgTUlTUl9SVU0gMHg1QQorI2RlZmluZSBNSVNSX01BU0sgMHg1QworI2RlZmluZSBNSVNSX01BU0tfUlVNIDB4NUUKKworI2RlZmluZSBNSVNSX1RYMl9JRExFICgxPDwxNSkKKyNkZWZpbmUgTUlTUl9UWDJfTk9fU1RBVFVTICgxPDwxNCkKKyNkZWZpbmUgTUlTUl9UWDJfSEFMVCAoMTw8MTMpCisjZGVmaW5lIE1JU1JfVFgyX0VPRiAoMTw8MTIpCisjZGVmaW5lIE1JU1JfVFgxX0lETEUgKDE8PDExKQorI2RlZmluZSBNSVNSX1RYMV9OT19TVEFUVVMgKDE8PDEwKQorI2RlZmluZSBNSVNSX1RYMV9IQUxUICgxPDw5KQorI2RlZmluZSBNSVNSX1RYMV9FT0YgKDE8PDgpCisjZGVmaW5lIE1JU1JfUlhfTk9CVUYgKDE8PDUpCisjZGVmaW5lIE1JU1JfUlhfRU9CICgxPDw0KQorI2RlZmluZSBNSVNSX1JYX05PX1NUQVRVUyAoMTw8MikKKyNkZWZpbmUgTUlTUl9SWF9IQUxUICgxPDwxKQorI2RlZmluZSBNSVNSX1JYX0VPRiAoMTw8MCkKKworI2RlZmluZSBMQVBBIDB4NjIKKyNkZWZpbmUgTEFQRSAweDY0CisjZGVmaW5lIExBUEQgMHg2NgorI2RlZmluZSBMQVBESU5DIDB4NjgKKyNkZWZpbmUgTEFQV1dPIDB4NkEKKyNkZWZpbmUgTEFQV1dDIDB4NkMKKyNkZWZpbmUgTEFQQ1RMIDB4NkUKKworI2RlZmluZSBUSU1FUiAweDRFNAorCisjZGVmaW5lIEJNQ1RMX1NVTSAweDUwCisjZGVmaW5lIEJNQ1RMX1JVTSAweDUyCisjZGVmaW5lIEJNQ1RMX1RYMV9ESVMgKDE8PDE0KQorI2RlZmluZSBCTUNUTF9UWDJfRElTICgxPDwxMCkKKyNkZWZpbmUgQk1DVExfUlhfRElTICgxPDw2KQorI2RlZmluZSBCTUNUTF9SWF9FTkFCTEVEICAoMTw8NSkKKworI2RlZmluZSBSWExCREEgIDB4OTAKKyNkZWZpbmUgUlhCREEgICAweDk0CisjZGVmaW5lIFJYU1RBVCAgMHg5OAorI2RlZmluZSBSWERCQSAgIDB4OUMKKworI2RlZmluZSBUWDFMRkRBIDB4QTAKKyNkZWZpbmUgVFgxRkRBICAweEE0CisjZGVmaW5lIFRYMVNUQVQgMHhBOAorI2RlZmluZSBUWDFEQkEgIDB4QUMKKyNkZWZpbmUgVFgyTEZEQSAweEIwCisjZGVmaW5lIFRYMkZEQSAgMHhCNAorI2RlZmluZSBUWDJTVEFUIDB4QjgKKyNkZWZpbmUgVFgyREJBICAweEJDCisKKyNkZWZpbmUgU1RSRUFNRVJfSU9fU1BBQ0UgMjU2CisKKyNkZWZpbmUgU1JCX0NPTU1BTkRfU0laRSA1MAorCisjZGVmaW5lIFNUUkVBTUVSX01BWF9BREFQVEVSUyA4CS8qIDB4MDggX19NT0RVTEVfU1RSSU5HIGNhbid0IGhhbmQgMHhubiAqLworCisvKiBEZWZpbmVzIGZvciBMQU4gU1RBVFVTIENIQU5HRSByZXBvcnRzICovCisjZGVmaW5lIExTQ19TSUdfTE9TUyAweDgwMDAKKyNkZWZpbmUgTFNDX0hBUkRfRVJSIDB4NDAwMAorI2RlZmluZSBMU0NfU09GVF9FUlIgMHgyMDAwCisjZGVmaW5lIExTQ19UUkFOX0JDTiAweDEwMDAKKyNkZWZpbmUgTFNDX0xXRiAgICAgIDB4MDgwMAorI2RlZmluZSBMU0NfQVJXICAgICAgMHgwNDAwCisjZGVmaW5lIExTQ19GUEUgICAgICAweDAyMDAKKyNkZWZpbmUgTFNDX1JSICAgICAgIDB4MDEwMAorI2RlZmluZSBMU0NfQ08gICAgICAgMHgwMDgwCisjZGVmaW5lIExTQ19TUyAgICAgICAweDAwNDAKKyNkZWZpbmUgTFNDX1JJTkdfUkVDIDB4MDAyMAorI2RlZmluZSBMU0NfU1JfQ08gICAgMHgwMDEwCisjZGVmaW5lIExTQ19GRFhfTU9ERSAweDAwMDQKKworLyogRGVmaW5lcyBmb3IgT1BFTiBBREFQVEVSIGNvbW1hbmQgKi8KKworI2RlZmluZSBPUEVOX0FEQVBURVJfRVhUX1dSQVAgKDE8PDE1KQorI2RlZmluZSBPUEVOX0FEQVBURVJfRElTX0hBUkRFRSAoMTw8MTQpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9ESVNfU09GVEVSUiAoMTw8MTMpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9QQVNTX0FEQ19NQUMgKDE8PDEyKQorI2RlZmluZSBPUEVOX0FEQVBURVJfUEFTU19BVFRfTUFDICgxPDwxMSkKKyNkZWZpbmUgT1BFTl9BREFQVEVSX0VOQUJMRV9FQyAoMTw8MTApCisjZGVmaW5lIE9QRU5fQURBUFRFUl9DT05URU5ERVIgKDE8PDgpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9QQVNTX0JFQUNPTiAoMTw8NykKKyNkZWZpbmUgT1BFTl9BREFQVEVSX0VOQUJMRV9GRFggKDE8PDYpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9FTkFCTEVfUlBMICgxPDw1KQorI2RlZmluZSBPUEVOX0FEQVBURVJfSU5ISUJJVF9FVFIgKDE8PDQpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9JTlRFUk5BTF9XUkFQICgxPDwzKQorCisKKy8qIERlZmluZXMgZm9yIFNSQiBDb21tYW5kcyAqLworI2RlZmluZSBTUkJfQ0xPU0VfQURBUFRFUiAweDA0CisjZGVmaW5lIFNSQl9DT05GSUdVUkVfQlJJREdFIDB4MGMKKyNkZWZpbmUgU1JCX0NPTkZJR1VSRV9IUF9DSEFOTkVMIDB4MTMKKyNkZWZpbmUgU1JCX01PRElGWV9CUklER0VfUEFSTVMgMHgxNQorI2RlZmluZSBTUkJfTU9ESUZZX09QRU5fT1BUSU9OUyAweDAxCisjZGVmaW5lIFNSQl9NT0RJRllfUkVDRUlWRV9PUFRJT05TIDB4MTcKKyNkZWZpbmUgU1JCX05PX09QRVJBVElPTiAweDAwCisjZGVmaW5lIFNSQl9PUEVOX0FEQVBURVIgMHgwMworI2RlZmluZSBTUkJfUkVBRF9MT0cgMHgwOAorI2RlZmluZSBTUkJfUkVBRF9TUl9DT1VOVEVSUyAweDE2CisjZGVmaW5lIFNSQl9SRVNFVF9HUk9VUF9BRERSRVNTIDB4MDIKKyNkZWZpbmUgU1JCX1JFU0VUX1RBUkdFVF9TRUdNRVROIDB4MTQKKyNkZWZpbmUgU1JCX1NBVkVfQ09ORklHVVJBVElPTiAweDFiCisjZGVmaW5lIFNSQl9TRVRfQlJJREdFX1BBUk1TIDB4MDkKKyNkZWZpbmUgU1JCX1NFVF9GVU5DX0FERFJFU1MgMHgwNworI2RlZmluZSBTUkJfU0VUX0dST1VQX0FERFJFU1MgMHgwNgorI2RlZmluZSBTUkJfU0VUX1RBUkdFVF9TRUdNRU5UIDB4MDUKKworLyogQ2xlYXIgcmV0dXJuIGNvZGUgKi8KKyNkZWZpbmUgU1RSRUFNRVJfQ0xFQVJfUkVUX0NPREUgMHhmZQorCisvKiBBUkIgQ29tbWFuZHMgKi8KKyNkZWZpbmUgQVJCX1JFQ0VJVkVfREFUQSAweDgxCisjZGVmaW5lIEFSQl9MQU5fQ0hBTkdFX1NUQVRVUyAweDg0CisKKy8qIEFTQiBSZXNwb25zZSBjb21tYW5kcyAqLworI2RlZmluZSBBU0JfUkVDRUlWRV9EQVRBIDB4ODEKKworCisvKiBTdHJlYW1lciBkZWZhdWx0cyBmb3IgYnVmZmVycyAqLworCisjZGVmaW5lIFNUUkVBTUVSX1JYX1JJTkdfU0laRSAxNgkvKiBzaG91bGQgYmUgYSBwb3dlciBvZiAyICovCisvKiBTZXR0aW5nIHRoZSBudW1iZXIgb2YgVFggZGVzY3JpcHRvcnMgdG8gMSBpcyBhIHdvcmthcm91bmQgZm9yIGFuCisgKiB1bmRvY3VtZW50ZWQgaGFyZHdhcmUgcHJvYmxlbSB3aXRoIHRoZSBsYW5zdHJlYW1lciBib2FyZC4gU2V0dGluZworICogdGhpcyB0byBzb21ldGhpbmcgaGlnaGVyIG1heSBzbGlnaHRseSBpbmNyZWFzZSB0aGUgdGhyb3VnaHB1dCB5b3UKKyAqIGNhbiBnZXQgZnJvbSB0aGUgY2FyZCwgYnV0IGF0IHRoZSByaXNrIG9mIGxvY2tpbmcgdXAgdGhlIGJveC4gLSAKKyAqIDx5b2RlcjFAdXMuaWJtLmNvbT4KKyAqLworI2RlZmluZSBTVFJFQU1FUl9UWF9SSU5HX1NJWkUgMQkvKiBzaG91bGQgYmUgYSBwb3dlciBvZiAyICovCisKKyNkZWZpbmUgUEtUX0JVRl9TWiA0MDk2CQkvKiBEZWZhdWx0IHBhY2tldCBzaXplICovCisKKy8qIFN0cmVhbWVyIGRhdGEgc3RydWN0dXJlcyAqLworCitzdHJ1Y3Qgc3RyZWFtZXJfdHhfZGVzYyB7CisJX191MzIgZm9yd2FyZDsKKwlfX3UzMiBzdGF0dXM7CisJX191MzIgYnVmY250X2ZyYW1lbGVuOworCV9fdTMyIGJ1ZmZlcjsKKwlfX3UzMiBidWZsZW47CisJX191MzIgcnN2ZDE7CisJX191MzIgcnN2ZDI7CisJX191MzIgcnN2ZDM7Cit9OworCitzdHJ1Y3Qgc3RyZWFtZXJfcnhfZGVzYyB7CisJX191MzIgZm9yd2FyZDsKKwlfX3UzMiBzdGF0dXM7CisJX191MzIgYnVmZmVyOworCV9fdTMyIGZyYW1lbGVuX2J1ZmxlbjsKK307CisKK3N0cnVjdCBtYWNfcmVjZWl2ZV9idWZmZXIgeworCV9fdTE2IG5leHQ7CisJX191OCBwYWRkaW5nOworCV9fdTggZnJhbWVfc3RhdHVzOworCV9fdTE2IGJ1ZmZlcl9sZW5ndGg7CisJX191OCBmcmFtZV9kYXRhOworfTsKKworc3RydWN0IHN0cmVhbWVyX3ByaXZhdGUgeworCisJX191MTYgc3JiOworCV9fdTE2IHRyYjsKKwlfX3UxNiBhcmI7CisJX191MTYgYXNiOworCisgICAgICAgIHN0cnVjdCBzdHJlYW1lcl9wcml2YXRlICpuZXh0OworICAgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKwlfX3U4IF9faW9tZW0gKnN0cmVhbWVyX21taW87CisgICAgICAgIGNoYXIgKnN0cmVhbWVyX2NhcmRfbmFtZTsKKyAKKyAgICAgICAgc3BpbmxvY2tfdCBzdHJlYW1lcl9sb2NrOworCisJdm9sYXRpbGUgaW50IHNyYl9xdWV1ZWQ7CS8qIFRydWUgaWYgYW4gU1JCIGlzIHN0aWxsIHBvc3RlZCAqLworCXdhaXRfcXVldWVfaGVhZF90IHNyYl93YWl0OworCisJdm9sYXRpbGUgaW50IGFzYl9xdWV1ZWQ7CS8qIFRydWUgaWYgYW4gQVNCIGlzIHBvc3RlZCAqLworCisJdm9sYXRpbGUgaW50IHRyYl9xdWV1ZWQ7CS8qIFRydWUgaWYgYSBUUkIgaXMgcG9zdGVkICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgdHJiX3dhaXQ7CisKKwlzdHJ1Y3Qgc3RyZWFtZXJfcnhfZGVzYyAqc3RyZWFtZXJfcnhfcmluZzsKKwlzdHJ1Y3Qgc3RyZWFtZXJfdHhfZGVzYyAqc3RyZWFtZXJfdHhfcmluZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfcmluZ19za2JbU1RSRUFNRVJfVFhfUklOR19TSVpFXSwKKwkgICAgKnJ4X3Jpbmdfc2tiW1NUUkVBTUVSX1JYX1JJTkdfU0laRV07CisJaW50IHR4X3JpbmdfZnJlZSwgdHhfcmluZ19sYXN0X3N0YXR1cywgcnhfcmluZ19sYXN0X3JlY2VpdmVkLAorCSAgICBmcmVlX3R4X3JpbmdfZW50cmllczsKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0cmVhbWVyX3N0YXRzOworCV9fdTE2IHN0cmVhbWVyX2xhbl9zdGF0dXM7CisJX191OCBzdHJlYW1lcl9yaW5nX3NwZWVkOworCV9fdTE2IHBrdF9idWZfc3o7CisJX191OCBzdHJlYW1lcl9yZWNlaXZlX29wdGlvbnMsIHN0cmVhbWVyX2NvcHlfYWxsX29wdGlvbnMsCisJICAgIHN0cmVhbWVyX21lc3NhZ2VfbGV2ZWw7CisJX191MTYgc3RyZWFtZXJfYWRkcl90YWJsZV9hZGRyLCBzdHJlYW1lcl9wYXJtc19hZGRyOworCV9fdTE2IG1hY19yeF9idWZmZXI7CisJX191OCBzdHJlYW1lcl9sYWFbNl07Cit9OworCitzdHJ1Y3Qgc3RyZWFtZXJfYWRhcHRlcl9hZGRyX3RhYmxlIHsKKworCV9fdTggbm9kZV9hZGRyWzZdOworCV9fdTggcmVzZXJ2ZWRbNF07CisJX191OCBmdW5jX2FkZHJbNF07Cit9OworCitzdHJ1Y3Qgc3RyZWFtZXJfcGFyYW1ldGVyc190YWJsZSB7CisKKwlfX3U4IHBoeXNfYWRkcls0XTsKKwlfX3U4IHVwX25vZGVfYWRkcls2XTsKKwlfX3U4IHVwX3BoeXNfYWRkcls0XTsKKwlfX3U4IHBvbGxfYWRkcls2XTsKKwlfX3UxNiByZXNlcnZlZDsKKwlfX3UxNiBhY2NfcHJpb3JpdHk7CisJX191MTYgYXV0aF9zb3VyY2VfY2xhc3M7CisJX191MTYgYXR0X2NvZGU7CisJX191OCBzb3VyY2VfYWRkcls2XTsKKwlfX3UxNiBiZWFjb25fdHlwZTsKKwlfX3UxNiBtYWpvcl92ZWN0b3I7CisJX191MTYgbGFuX3N0YXR1czsKKwlfX3UxNiBzb2Z0X2Vycm9yX3RpbWU7CisJX191MTYgcmVzZXJ2ZWQxOworCV9fdTE2IGxvY2FsX3Jpbmc7CisJX191MTYgbW9uX2Vycm9yOworCV9fdTE2IGJlYWNvbl90cmFuc21pdDsKKwlfX3UxNiBiZWFjb25fcmVjZWl2ZTsKKwlfX3UxNiBmcmFtZV9jb3JyZWw7CisJX191OCBiZWFjb25fbmF1bls2XTsKKwlfX3UzMiByZXNlcnZlZDI7CisJX191OCBiZWFjb25fcGh5c1s0XTsKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvbWFkZ2VtYy5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL21hZGdlbWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmFlMmJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL21hZGdlbWMuYwpAQCAtMCwwICsxLDgwMCBAQAorLyoKKyAqICBtYWRnZW1jLmM6IERyaXZlciBmb3IgdGhlIE1hZGdlIFNtYXJ0IDE2LzQgTUMxNiBNQ0EgdG9rZW4gcmluZyBjYXJkLgorICoKKyAqICBXcml0dGVuIDIwMDAgYnkgQWRhbSBGcml0emxlcgorICoKKyAqICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAgVGhpcyBkcml2ZXIgbW9kdWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY2FyZHM6CisgKiAgICAgIC0gTWFkZ2UgU21hcnQgMTYvNCBSaW5nbm9kZSBNQzE2CisgKgktIE1hZGdlIFNtYXJ0IDE2LzQgUmluZ25vZGUgTUMzMiAoPz8pCisgKgorICogIE1haW50YWluZXIocyk6CisgKiAgICBBRglBZGFtIEZyaXR6bGVyCQltaWRAYXVrLmN4CisgKgorICogIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgorICoJMTYtSmFuLTAwCUFGCUNyZWF0ZWQKKyAqCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9ICJtYWRnZW1jLmM6IHYwLjkxIDIzLzAxLzIwMDAgYnkgQWRhbSBGcml0emxlclxuIjsKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS1sZWdhY3kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90cmRldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgInRtczM4MHRyLmgiCisjaW5jbHVkZSAibWFkZ2VtYy5oIiAgICAgICAgICAgIC8qIE1hZGdlLXNwZWNpZmljIGNvbnN0YW50cyAqLworCisjZGVmaW5lIE1BREdFTUNfSU9fRVhURU5UIDMyCisjZGVmaW5lIE1BREdFTUNfU0lGX09GRlNFVCAweDA4CisKK3N0cnVjdCBtYWRnZW1jX2NhcmQgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkvKgorCSAqIFRoZXNlIGFyZSByZWFkIGZyb20gdGhlIEJJQSBST00uCisJICovCisJdW5zaWduZWQgaW50IG1hbmlkOworCXVuc2lnbmVkIGludCBjYXJkdHlwZTsKKwl1bnNpZ25lZCBpbnQgY2FyZHJldjsKKwl1bnNpZ25lZCBpbnQgcmFtc2l6ZTsKKwkKKwkvKgorCSAqIFRoZXNlIGFyZSByZWFkIGZyb20gdGhlIE1DQSBQT1MgcmVnaXN0ZXJzLiAgCisJICovCisJdW5zaWduZWQgaW50IGJ1cnN0bW9kZToyOworCXVuc2lnbmVkIGludCBmYWlybmVzczoxOyAvKiAwID0gRmFpciwgMSA9IFVuZmFpciAqLworCXVuc2lnbmVkIGludCBhcmJsZXZlbDo0OworCXVuc2lnbmVkIGludCByaW5nc3BlZWQ6MjsgLyogMCA9IDRtYiwgMSA9IDE2LCAyID0gQXV0by9ub25lICovCisJdW5zaWduZWQgaW50IGNhYmxldHlwZToxOyAvKiAwID0gUko0NSwgMSA9IERCOSAqLworCisJc3RydWN0IG1hZGdlbWNfY2FyZCAqbmV4dDsKK307CitzdGF0aWMgc3RydWN0IG1hZGdlbWNfY2FyZCAqbWFkZ2VtY19jYXJkX2xpc3Q7CisKKworc3RhdGljIGludCBtYWRnZW1jX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG1hZGdlbWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG1hZGdlbWNfY2hpcHNldF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgbWFkZ2VtY19yZWFkX3JvbShzdHJ1Y3QgbWFkZ2VtY19jYXJkICpjYXJkKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBtYWRnZW1jX3NldG5zZWxvdXRfcGlucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG1hZGdlbWNfc2V0Y2FibGV0eXBlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB0eXBlKTsKKworc3RhdGljIGludCBtYWRnZW1jX21jYXByb2MoY2hhciAqYnVmLCBpbnQgc2xvdCwgdm9pZCAqZCk7CisKK3N0YXRpYyB2b2lkIG1hZGdlbWNfc2V0cmVncGFnZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGFnZSk7CitzdGF0aWMgdm9pZCBtYWRnZW1jX3NldHNpZnNlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmFsKTsKK3N0YXRpYyB2b2lkIG1hZGdlbWNfc2V0aW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2YWwpOworCitzdGF0aWMgaXJxcmV0dXJuX3QgbWFkZ2VtY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKy8qCisgKiBUaGVzZSB3b3JrIGFyb3VuZCBwYWdpbmcsIGhvd2V2ZXIgdGhleSBkb24ndCBndWFyZW50ZWUgeW91J3JlIG9uIHRoZQorICogcmlnaHQgcGFnZS4KKyAqLworI2RlZmluZSBTSUZSRUFEQihyZWcpIChpbmIoZGV2LT5iYXNlX2FkZHIgKyAoKHJlZzwweDgpP3JlZzpyZWctMHg4KSkpCisjZGVmaW5lIFNJRldSSVRFQih2YWwsIHJlZykgKG91dGIodmFsLCBkZXYtPmJhc2VfYWRkciArICgocmVnPDB4OCk/cmVnOnJlZy0weDgpKSkKKyNkZWZpbmUgU0lGUkVBRFcocmVnKSAoaW53KGRldi0+YmFzZV9hZGRyICsgKChyZWc8MHg4KT9yZWc6cmVnLTB4OCkpKQorI2RlZmluZSBTSUZXUklURVcodmFsLCByZWcpIChvdXR3KHZhbCwgZGV2LT5iYXNlX2FkZHIgKyAoKHJlZzwweDgpP3JlZzpyZWctMHg4KSkpCisKKy8qCisgKiBSZWFkIGEgYnl0ZS1sZW5ndGggdmFsdWUgZnJvbSB0aGUgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBtYWRnZW1jX3NpZnJlYWRiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwl1bnNpZ25lZCBzaG9ydCByZXQ7CisJaWYgKHJlZzwweDgpCQorCQlyZXQgPSBTSUZSRUFEQihyZWcpOworCWVsc2UgeworCQltYWRnZW1jX3NldHJlZ3BhZ2UoZGV2LCAxKTsJCisJCXJldCA9IFNJRlJFQURCKHJlZyk7CisJCW1hZGdlbWNfc2V0cmVncGFnZShkZXYsIDApOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogV3JpdGUgYSBieXRlLWxlbmd0aCB2YWx1ZSB0byBhIHJlZ2lzdGVyLgorICovCitzdGF0aWMgdm9pZCBtYWRnZW1jX3NpZndyaXRlYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2YWwsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwlpZiAocmVnPDB4OCkKKwkJU0lGV1JJVEVCKHZhbCwgcmVnKTsKKwllbHNlIHsKKwkJbWFkZ2VtY19zZXRyZWdwYWdlKGRldiwgMSk7CisJCVNJRldSSVRFQih2YWwsIHJlZyk7CisJCW1hZGdlbWNfc2V0cmVncGFnZShkZXYsIDApOworCX0KKwlyZXR1cm47Cit9CisKKy8qCisgKiBSZWFkIGEgd29yZC1sZW5ndGggdmFsdWUgZnJvbSBhIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBtYWRnZW1jX3NpZnJlYWR3KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwl1bnNpZ25lZCBzaG9ydCByZXQ7CisJaWYgKHJlZzwweDgpCQorCQlyZXQgPSBTSUZSRUFEVyhyZWcpOworCWVsc2UgeworCQltYWRnZW1jX3NldHJlZ3BhZ2UoZGV2LCAxKTsJCisJCXJldCA9IFNJRlJFQURXKHJlZyk7CisJCW1hZGdlbWNfc2V0cmVncGFnZShkZXYsIDApOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogV3JpdGUgYSB3b3JkLWxlbmd0aCB2YWx1ZSB0byBhIHJlZ2lzdGVyLgorICovCitzdGF0aWMgdm9pZCBtYWRnZW1jX3NpZndyaXRldyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2YWwsIHVuc2lnbmVkIHNob3J0IHJlZykKK3sKKwlpZiAocmVnPDB4OCkKKwkJU0lGV1JJVEVXKHZhbCwgcmVnKTsKKwllbHNlIHsKKwkJbWFkZ2VtY19zZXRyZWdwYWdlKGRldiwgMSk7CisJCVNJRldSSVRFVyh2YWwsIHJlZyk7CisJCW1hZGdlbWNfc2V0cmVncGFnZShkZXYsIDApOworCX0KKwlyZXR1cm47Cit9CisKKworCitzdGF0aWMgaW50IF9faW5pdCBtYWRnZW1jX3Byb2JlKHZvaWQpCit7CQorCXN0YXRpYyBpbnQgdmVyc2lvbnByaW50ZWQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cDsKKwlzdHJ1Y3QgbWFkZ2VtY19jYXJkICpjYXJkOworCWludCBpLHNsb3QgPSAwOworCV9fdTggcG9zcmVnWzRdOworCisJaWYgKCFNQ0FfYnVzKQorCQlyZXR1cm4gLTE7CQorIAorCXdoaWxlIChzbG90ICE9IE1DQV9OT1RGT1VORCkgeworCQkvKgorCQkgKiBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IHRoZSBNQzE2LzMyIChNQ0EgSUQgMDAyZCkKKwkJICovCisJCXNsb3QgPSBtY2FfZmluZF91bnVzZWRfYWRhcHRlcigweDAwMmQsIHNsb3QpOworCQlpZiAoc2xvdCA9PSBNQ0FfTk9URk9VTkQpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBJZiB3ZSBnZXQgaGVyZSwgd2UgaGF2ZSBhbiBhZGFwdGVyLgorCQkgKi8KKwkJaWYgKHZlcnNpb25wcmludGVkKysgPT0gMCkKKwkJCXByaW50aygiJXMiLCB2ZXJzaW9uKTsKKworCQlkZXYgPSBhbGxvY190cmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCQlpZiAoZGV2ID09IE5VTEwpIHsKKwkJCXByaW50aygibWFkZ2VtYzogdW5hYmxlIHRvIGFsbG9jYXRlIGRldiBzcGFjZVxuIik7CisJCQlpZiAobWFkZ2VtY19jYXJkX2xpc3QpCisJCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJCWRldi0+ZG1hID0gMDsKKworCQkvKgorCQkgKiBGZXRjaCBNQ0EgY29uZmlnIHJlZ2lzdGVycworCQkgKi8KKwkJZm9yKGk9MDtpPDQ7aSsrKQorCQkJcG9zcmVnW2ldID0gbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCBpKzIpOworCQkKKwkJY2FyZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtYWRnZW1jX2NhcmQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGNhcmQ9PU5VTEwpIHsKKwkJCXByaW50aygibWFkZ2VtYzogdW5hYmxlIHRvIGFsbG9jYXRlIGNhcmQgc3RydWN0XG4iKTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQlpZiAobWFkZ2VtY19jYXJkX2xpc3QpCisJCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJY2FyZC0+ZGV2ID0gZGV2OworCisJCS8qCisJCSAqIFBhcnNlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uICBUaGlzIGFsbCBjb21lcworCQkgKiBkaXJlY3RseSBmcm9tIHRoZSBwdWJsaWNseSBhdmFpbGFibGUgQDAwMmQuQURGLgorCQkgKiBHZXQgaXQgZnJvbSBNYWRnZSBvciB5b3VyIGxvY2FsIEFERiBsaWJyYXJ5LgorCQkgKi8KKworCQkvKgorCQkgKiBCYXNlIGFkZHJlc3MgCisJCSAqLworCQlkZXYtPmJhc2VfYWRkciA9IDB4MGEyMCArIAorCQkJKChwb3NyZWdbMl0gJiBNQzE2X1BPUzJfQUREUjIpPzB4MDQwMDowKSArCisJCQkoKHBvc3JlZ1swXSAmIE1DMTZfUE9TMF9BRERSMSk/MHgxMDAwOjApICsKKwkJCSgocG9zcmVnWzNdICYgTUMxNl9QT1MzX0FERFIzKT8weDIwMDA6MCk7CisKKwkJLyoKKwkJICogSW50ZXJydXB0IGxpbmUKKwkJICovCisJCXN3aXRjaChwb3NyZWdbMF0gPj4gNikgeyAvKiB1cHBlciB0d28gYml0cyAqLworCQljYXNlIDB4MTogZGV2LT5pcnEgPSAzOyBicmVhazsKKwkJY2FzZSAweDI6IGRldi0+aXJxID0gOTsgYnJlYWs7IC8qIElSUSAyID0gSVJRIDkgKi8KKwkJY2FzZSAweDM6IGRldi0+aXJxID0gMTA7IGJyZWFrOworCQlkZWZhdWx0OiBkZXYtPmlycSA9IDA7IGJyZWFrOworCQl9CisKKwkJaWYgKGRldi0+aXJxID09IDApIHsKKwkJCXByaW50aygiJXM6IGludmFsaWQgSVJRXG4iLCBkZXYtPm5hbWUpOworCQkJZ290byBnZXRvdXQxOworCQl9CisKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTUFER0VNQ19JT19FWFRFTlQsIAorCQkJCSAgICJtYWRnZW1jIikpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIm1hZGdlbWM6IHVuYWJsZSB0byBzZXR1cCBTbWFydCBNQyBpbiBzbG90ICVkIGJlY2F1c2Ugb2YgSS9PIGJhc2UgY29uZmxpY3QgYXQgMHglMDRseFxuIiwgc2xvdCwgZGV2LT5iYXNlX2FkZHIpOworCQkJZGV2LT5iYXNlX2FkZHIgKz0gTUFER0VNQ19TSUZfT0ZGU0VUOworCQkJZ290byBnZXRvdXQxOworCQl9CisJCWRldi0+YmFzZV9hZGRyICs9IE1BREdFTUNfU0lGX09GRlNFVDsKKwkJCisJCS8qCisJCSAqIEFyYml0cmF0aW9uIExldmVsCisJCSAqLworCQljYXJkLT5hcmJsZXZlbCA9ICgocG9zcmVnWzBdID4+IDEpICYgMHg3KSArIDg7CisKKwkJLyoKKwkJICogQnVyc3QgbW9kZSBhbmQgRmFpcm5lc3MKKwkJICovCisJCWNhcmQtPmJ1cnN0bW9kZSA9ICgocG9zcmVnWzJdID4+IDYpICYgMHgzKTsKKwkJY2FyZC0+ZmFpcm5lc3MgPSAoKHBvc3JlZ1syXSA+PiA0KSAmIDB4MSk7CisKKwkJLyoKKwkJICogUmluZyBTcGVlZAorCQkgKi8KKwkJaWYgKChwb3NyZWdbMV0gPj4gMikmMHgxKQorCQkJY2FyZC0+cmluZ3NwZWVkID0gMjsgLyogbm90IHNlbGVjdGVkICovCisJCWVsc2UgaWYgKChwb3NyZWdbMl0gPj4gNSkgJiAweDEpCisJCQljYXJkLT5yaW5nc3BlZWQgPSAxOyAvKiAxNk1iICovCisJCWVsc2UKKwkJCWNhcmQtPnJpbmdzcGVlZCA9IDA7IC8qIDRNYiAqLworCisJCS8qIAorCQkgKiBDYWJsZSB0eXBlCisJCSAqLworCQlpZiAoKHBvc3JlZ1sxXSA+PiA2KSYweDEpCisJCQljYXJkLT5jYWJsZXR5cGUgPSAxOyAvKiBTVFAvREI5ICovCisJCWVsc2UKKwkJCWNhcmQtPmNhYmxldHlwZSA9IDA7IC8qIFVUUC9SSi00NSAqLworCisKKwkJLyogCisJCSAqIFJPTSBJbmZvLiBUaGlzIHJlcXVpcmVzIHVzIHRvIGFjdHVhbGx5IHR3aWRkbGUKKwkJICogYml0cyBvbiB0aGUgY2FyZCwgc28gd2UgbXVzdCBlbnN1cmUgYWJvdmUgdGhhdCAKKwkJICogdGhlIGJhc2UgYWRkcmVzcyBpcyBmcmVlIG9mIGNvbmZsaWN0IChyZXF1ZXN0X3JlZ2lvbiBhYm92ZSkuCisJCSAqLworCQltYWRnZW1jX3JlYWRfcm9tKGNhcmQpOworCQkKKwkJaWYgKGNhcmQtPm1hbmlkICE9IDB4NGQpIHsgLyogc29tZXRoaW5nIHdlbnQgd3JvbmcgKi8KKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNYWRnZSBNQyBST00gcmVhZCBmYWlsZWQgKHVua25vd24gbWFudWZhY3R1cmVyIElEICUwMngpXG4iLCBkZXYtPm5hbWUsIGNhcmQtPm1hbmlkKTsKKwkJCWdvdG8gZ2V0b3V0OworCQl9CisJCQorCQlpZiAoKGNhcmQtPmNhcmR0eXBlICE9IDB4MDgpICYmIChjYXJkLT5jYXJkdHlwZSAhPSAweDBkKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1hZGdlIE1DIFJPTSByZWFkIGZhaWxlZCAodW5rbm93biBjYXJkIElEICUwMngpXG4iLCBkZXYtPm5hbWUsIGNhcmQtPmNhcmR0eXBlKTsKKwkJCWdvdG8gZ2V0b3V0OworCQl9CisJICAgICAgIAorCQkvKiBBbGwgY2FyZHMgZXhjZXB0IFJldiAwIGFuZCAxIE1DMTYncyBoYXZlIDI1NmtiIG9mIFJBTSAqLworCQlpZiAoKGNhcmQtPmNhcmR0eXBlID09IDB4MDgpICYmIChjYXJkLT5jYXJkcmV2IDw9IDB4MDEpKQorCQkJY2FyZC0+cmFtc2l6ZSA9IDEyODsKKwkJZWxzZQorCQkJY2FyZC0+cmFtc2l6ZSA9IDI1NjsKKworCQlwcmludGsoIiVzOiAlcyBSZXYgJWQgYXQgMHglMDRseCBJUlEgJWRcbiIsIAorCQkgICAgICAgZGV2LT5uYW1lLCAKKwkJICAgICAgIChjYXJkLT5jYXJkdHlwZSA9PSAweDA4KT9NQURHRU1DMTZfQ0FSRE5BTUU6CisJCSAgICAgICBNQURHRU1DMzJfQ0FSRE5BTUUsIGNhcmQtPmNhcmRyZXYsIAorCQkgICAgICAgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKworCQlpZiAoY2FyZC0+Y2FyZHR5cGUgPT0gMHgwZCkKKwkJCXByaW50aygiJXM6ICAgICBXYXJuaW5nOiBNQzMyIHN1cHBvcnQgaXMgZXhwZXJpbWVudGFsIGFuZCBoaWdobHkgdW50ZXN0ZWRcbiIsIGRldi0+bmFtZSk7CisJCQorCQlpZiAoY2FyZC0+cmluZ3NwZWVkPT0yKSB7IC8qIFVua25vd24gKi8KKwkJCXByaW50aygiJXM6ICAgICBXYXJuaW5nOiBSaW5nIHNwZWVkIG5vdCBzZXQgaW4gUE9TIC0tIFBsZWFzZSBydW4gdGhlIHJlZmVyZW5jZSBkaXNrIGFuZCBzZXQgaXQhXG4iLCBkZXYtPm5hbWUpOworCQkJY2FyZC0+cmluZ3NwZWVkID0gMTsgLyogZGVmYXVsdCB0byAxNm1iICovCisJCX0KKwkJCisJCXByaW50aygiJXM6ICAgICBSQU0gU2l6ZTogJWRLQlxuIiwgZGV2LT5uYW1lLCBjYXJkLT5yYW1zaXplKTsKKworCQlwcmludGsoIiVzOiAgICAgUmluZyBTcGVlZDogJWRNYi9zZWMgb24gJXNcbiIsIGRldi0+bmFtZSwgCisJCSAgICAgICAoY2FyZC0+cmluZ3NwZWVkKT8xNjo0LCAKKwkJICAgICAgIGNhcmQtPmNhYmxldHlwZT8iU1RQL0RCOSI6IlVUUC9SSi00NSIpOworCQlwcmludGsoIiVzOiAgICAgQXJiaXRyYXRpb24gTGV2ZWw6ICVkXG4iLCBkZXYtPm5hbWUsIAorCQkgICAgICAgY2FyZC0+YXJibGV2ZWwpOworCisJCXByaW50aygiJXM6ICAgICBCdXJzdCBNb2RlOiAiLCBkZXYtPm5hbWUpOworCQlzd2l0Y2goY2FyZC0+YnVyc3Rtb2RlKSB7CisJCWNhc2UgMDogcHJpbnRrKCJDeWNsZSBzdGVhbCIpOyBicmVhazsKKwkJY2FzZSAxOiBwcmludGsoIkxpbWl0ZWQgYnVyc3QiKTsgYnJlYWs7CisJCWNhc2UgMjogcHJpbnRrKCJEZWxheWVkIHJlbGVhc2UiKTsgYnJlYWs7CisJCWNhc2UgMzogcHJpbnRrKCJJbW1lZGlhdGUgcmVsZWFzZSIpOyBicmVhazsKKwkJfQorCQlwcmludGsoIiAoJXMpXG4iLCAoY2FyZC0+ZmFpcm5lc3MpPyJVbmZhaXIiOiJGYWlyIik7CisKKworCQkvKiAKKwkJICogRW5hYmxlIFNJRiBiZWZvcmUgd2UgYXNzaWduIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwKKwkJICoganVzdCBpbiBjYXNlIHdlIGdldCBzcHVyaW91cyBpbnRlcnJ1cHRzIHRoYXQgbmVlZAorCQkgKiBoYW5kbGluZy4KKwkJICovIAorCQlvdXRiKDAsIGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcwKTsgLyogc2FuaXR5ICovCisJCW1hZGdlbWNfc2V0c2lmc2VsKGRldiwgMSk7CisJCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgbWFkZ2VtY19pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJICAgICAgICJtYWRnZW1jIiwgZGV2KSkgCisJCQlnb3RvIGdldG91dDsKKwkJCisJCW1hZGdlbWNfY2hpcHNldF9pbml0KGRldik7IC8qIGVuYWJsZXMgaW50ZXJydXB0cyEgKi8KKwkJbWFkZ2VtY19zZXRjYWJsZXR5cGUoZGV2LCBjYXJkLT5jYWJsZXR5cGUpOworCisJCS8qIFNldHVwIE1DQSBzdHJ1Y3R1cmVzICovCisJCW1jYV9zZXRfYWRhcHRlcl9uYW1lKHNsb3QsIChjYXJkLT5jYXJkdHlwZSA9PSAweDA4KT9NQURHRU1DMTZfQ0FSRE5BTUU6TUFER0VNQzMyX0NBUkROQU1FKTsKKwkJbWNhX3NldF9hZGFwdGVyX3Byb2NmbihzbG90LCBtYWRnZW1jX21jYXByb2MsIGRldik7CisJCW1jYV9tYXJrX2FzX3VzZWQoc2xvdCk7CisKKwkJcHJpbnRrKCIlczogICAgIFJpbmcgU3RhdGlvbiBBZGRyZXNzOiAiLCBkZXYtPm5hbWUpOworCQlwcmludGsoIiUyLjJ4IiwgZGV2LT5kZXZfYWRkclswXSk7CisJCWZvciAoaSA9IDE7IGkgPCA2OyBpKyspCisJCQlwcmludGsoIjolMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0pOworCQlwcmludGsoIlxuIik7CisKKwkJLyogWFhYIGlzIElTQV9NQVhfQUREUkVTUyBjb3JyZWN0IGhlcmU/ICovCisJCWlmICh0bXNkZXZfaW5pdChkZXYsIElTQV9NQVhfQUREUkVTUywgTlVMTCkpIHsKKwkJCXByaW50aygiJXM6IHVuYWJsZSB0byBnZXQgbWVtb3J5IGZvciBkZXYtPnByaXYuXG4iLCAKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHItTUFER0VNQ19TSUZfT0ZGU0VULCAKKwkJCSAgICAgICBNQURHRU1DX0lPX0VYVEVOVCk7IAorCQkJCisJCQlrZnJlZShjYXJkKTsKKwkJCXRtc2Rldl90ZXJtKGRldik7CisJCQlmcmVlX25ldGRldihkZXYpOworCQkJaWYgKG1hZGdlbWNfY2FyZF9saXN0KQorCQkJCXJldHVybiAwOworCQkJcmV0dXJuIC0xOworCQl9CisJCXRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCQkvKiAKKwkJICogVGhlIE1DMTYgaXMgcGh5c2ljYWxseSBhIDMyYml0IGNhcmQuICBIb3dldmVyLCBNYWRnZQorCQkgKiBpbnNpc3RzIG9uIGNhbGxpbmcgaXQgMTZiaXQsIHNvIEknbGwgYXNzdW1lIGhlcmUgdGhhdAorCQkgKiB0aGV5IGtub3cgd2hhdCB0aGV5J3JlIHRhbGtpbmcgYWJvdXQuICBDdXQgb2ZmIERNQQorCQkgKiBhdCAxNm1iLgorCQkgKi8KKwkJdHAtPnNldG5zZWxvdXQgPSBtYWRnZW1jX3NldG5zZWxvdXRfcGluczsKKwkJdHAtPnNpZndyaXRlYiA9IG1hZGdlbWNfc2lmd3JpdGViOworCQl0cC0+c2lmcmVhZGIgPSBtYWRnZW1jX3NpZnJlYWRiOworCQl0cC0+c2lmd3JpdGV3ID0gbWFkZ2VtY19zaWZ3cml0ZXc7CisJCXRwLT5zaWZyZWFkdyA9IG1hZGdlbWNfc2lmcmVhZHc7CisJCXRwLT5EYXRhUmF0ZSA9IChjYXJkLT5yaW5nc3BlZWQpP1NQRUVEXzE2OlNQRUVEXzQ7CisKKwkJbWVtY3B5KHRwLT5Qcm9kdWN0SUQsICJNYWRnZSBNQ0EgMTYvNCAgICAiLCBQUk9EX0lEX1NJWkUgKyAxKTsKKworCQlkZXYtPm9wZW4gPSBtYWRnZW1jX29wZW47CisJCWRldi0+c3RvcCA9IG1hZGdlbWNfY2xvc2U7CisKKwkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKKwkJCS8qIEVubGlzdCBpbiB0aGUgY2FyZCBsaXN0ICovCisJCQljYXJkLT5uZXh0ID0gbWFkZ2VtY19jYXJkX2xpc3Q7CisJCQltYWRnZW1jX2NhcmRfbGlzdCA9IGNhcmQ7CisJCQlzbG90Kys7CisJCQljb250aW51ZTsgLyogc3VjY2Vzc2Z1bCwgdHJ5IHRvIGZpbmQgYW5vdGhlciAqLworCQl9CisJCQorCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlnZXRvdXQ6CisJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLU1BREdFTUNfU0lGX09GRlNFVCwgCisJCQkgICAgICAgTUFER0VNQ19JT19FWFRFTlQpOyAKKwlnZXRvdXQxOgorCQlrZnJlZShjYXJkKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJc2xvdCsrOworCX0KKworCWlmIChtYWRnZW1jX2NhcmRfbGlzdCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC0xOworfQorCisvKgorICogSGFuZGxlIGludGVycnVwdHMgZ2VuZXJhdGVkIGJ5IHRoZSBjYXJkCisgKgorICogVGhlIE1pY3JvQ2hhbm5lbCBNYWRnZSBjYXJkcyBuZWVkIHNsaWdodGx5IG1vcmUgaGFuZGxpbmcKKyAqIGFmdGVyIGFuIGludGVycnVwdCB0aGFuIG90aGVyIFRNUzM4MCBjYXJkcyBkby4KKyAqCisgKiBGaXJzdCB3ZSBtdXN0IG1ha2Ugc3VyZSBpdCB3YXMgdGhpcyBjYXJkIHRoYXQgZ2VuZXJhdGVkIHRoZQorICogaW50ZXJydXB0IChzaW5jZSBpbnRlcnJ1cHQgc2hhcmluZyBpcyBhbGxvd2VkKS4gIFRoZW4sCisgKiBiZWNhdXNlIHdlJ3JlIHVzaW5nIGxldmVsLXRyaWdnZXJlZCBpbnRlcnJ1cHRzIChhcyBpcworICogc3RhbmRhcmQgb24gTUNBKSwgd2UgbXVzdCB0b2dnbGUgdGhlIGludGVycnVwdCBsaW5lCisgKiBvbiB0aGUgY2FyZCBpbiBvcmRlciB0byBjbGFpbSBhbmQgYWNrbm93bGVkZ2UgdGhlIGludGVycnVwdC4KKyAqIE9uY2UgdGhhdCBpcyBkb25lLCB0aGUgaW50ZXJydXB0IHNob3VsZCBiZSBoYW5kbGFibGUgaW4KKyAqIHRoZSBub3JtYWwgdG1zMzgwdHJfaW50ZXJydXB0KCkgcm91dGluZS4KKyAqCisgKiBUaGVyZSdzIHR3byB3YXlzIHdlIGNhbiBjaGVjayB0byBzZWUgaWYgdGhlIGludGVycnVwdCBpcyBvdXJzLAorICogYm90aCB3aXRoIHRoZWlyIG93biBkaXNhZHZhbnRhZ2VzLi4uCisgKgorICogMSkgIAlSZWFkIGluIHRoZSBTSUZTVFMgcmVnaXN0ZXIgZnJvbSB0aGUgVE1TIGNvbnRyb2xsZXIuICBUaGlzCisgKglpcyBndWFyZW50ZWVkIHRvIGJlIGFjY3VyYXRlLCBob3dldmVyLCB0aGVyZSdzIGEgZmFpcmx5CisgKglsYXJnZSBwZXJmb3JtYW5jZSBwZW5hbHR5IGZvciBkb2luZyBzbzogdGhlIE1hZGdlIGNoaXBzCisgKgltdXN0IHJlcXVlc3QgdGhlIHJlZ2lzdGVyIGZyb20gdGhlIEVhZ2xlLCB0aGUgRWFnbGUgbXVzdAorICoJcmVhZCB0aGVtIGZyb20gaXRzIGludGVybmFsIGJ1cywgYW5kIHRoZW4gdGFrZSB0aGUgcm91dGUKKyAqCWJhY2sgb3V0IGFnYWluLCBmb3IgYSAxNmJpdCByZWFkLiAgCisgKgorICogMikJVXNlIHRoZSBNQ19DT05UUk9MX1JFRzBfU0lOVFIgYml0IGZyb20gdGhlIE1hZGdlIEFTSUNzLgorICoJVGhlIG1ham9yIGRpc2FkdmFudGFnZSBoZXJlIGlzIHRoYXQgdGhlIGFjY3VyYWN5IG9mIHRoZQorICoJYml0IGlzIGluIHF1ZXN0aW9uLiAgSG93ZXZlciwgaXQgY3V0cyBvdXQgdGhlIGV4dHJhIHJlYWQKKyAqCWN5Y2xlcyBpdCB0YWtlcyB0byByZWFkIHRoZSBFYWdsZSdzIFNJRiwgYXMgaXRzIG9ubHkgYW4KKyAqCThiaXQgcmVhZCwgYW5kIHRoZW9yZXRpY2FsbHkgdGhlIE1hZGdlIGJpdCBpcyBkaXJlY3RseQorICoJY29ubmVjdGVkIHRvIHRoZSBpbnRlcnJ1cHQgbGF0Y2ggY29taW5nIG91dCBvZiB0aGUgRWFnbGUKKyAqCWhhcmR3YXJlICh0aGF0IHN0YXRlbWVudCBpcyBub3QgdmVyaWZpZWQpLiAgCisgKgorICogSSBjYW4ndCBkZXRlcm1pbmUgd2hpY2ggb2YgdGhlc2UgbWV0aG9kcyBoYXMgdGhlIGJlc3Qgd2luLiAgRm9yIG5vdywKKyAqIHdlIG1ha2UgYSBjb21wcm9taXNlLiAgVXNlIHRoZSBNYWRnZSB3YXkgZm9yIHRoZSBmaXJzdCBpbnRlcnJ1cHQsCisgKiB3aGljaCBzaG91bGQgYmUgdGhlIGZhc3QtcGF0aCwgYW5kIHRoZW4gb25jZSB3ZSBoaXQgdGhlIGZpcnN0IAorICogaW50ZXJydXB0LCBrZWVwIG9uIHRyeWluZyB1c2luZyB0aGUgU0lGIG1ldGhvZCB1bnRpbCB3ZSd2ZQorICogZXhoYXVzdGVkIGFsbCBjb250aWd1b3VzIGludGVycnVwdHMuCisgKgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbWFkZ2VtY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgcGVuZGluZyxyZWcxOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlpZiAoIWRldl9pZCkgeworCQlwcmludGsoIm1hZGdlbWNfaW50ZXJydXB0OiB3YXMgbm90IHBhc3NlZCBhIGRldl9pZCFcbiIpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCisJLyogTWFrZSBzdXJlIGl0cyByZWFsbHkgdXMuIC0tIHRoZSBNYWRnZSB3YXkgKi8KKwlwZW5kaW5nID0gaW5iKGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcwKTsKKwlpZiAoIShwZW5kaW5nICYgTUNfQ09OVFJPTF9SRUcwX1NJTlRSKSkKKwkJcmV0dXJuIElSUV9OT05FOyAvKiBub3Qgb3VyIGludGVycnVwdCAqLworCisJLyoKKwkgKiBTaW5jZSB3ZSdyZSBsZXZlbC10cmlnZ2VyZWQsIHdlIG1heSBtaXNzIHRoZSByaXNpbmcgZWRnZQorCSAqIG9mIHRoZSBuZXh0IGludGVycnVwdCB3aGlsZSB3ZSdyZSBvZmYgaGFuZGxpbmcgdGhpcyBvbmUsCisJICogc28ga2VlcCBjaGVja2luZyB1bnRpbCB0aGUgU0lGIHZlcmlmaWVzIHRoYXQgaXQgaGFzIG5vdGhpbmcKKwkgKiBsZWZ0IGZvciB1cyB0byBkby4KKwkgKi8KKwlwZW5kaW5nID0gU1RTX1NZU1RFTV9JUlE7CisJZG8geworCQlpZiAocGVuZGluZyAmIFNUU19TWVNURU1fSVJRKSB7CisKKwkJCS8qIFRvZ2dsZSB0aGUgaW50ZXJydXB0IHRvIHJlc2V0IHRoZSBsYXRjaCBvbiBjYXJkICovCisJCQlyZWcxID0gaW5iKGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcxKTsKKwkJCW91dGIocmVnMSBeIE1DX0NPTlRST0xfUkVHMV9TSU5URU4sIAorCQkJICAgICBkZXYtPmJhc2VfYWRkciArIE1DX0NPTlRST0xfUkVHMSk7CisJCQlvdXRiKHJlZzEsIGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcxKTsKKworCQkJLyogQ29udGludWUgaGFuZGxpbmcgYXMgbm9ybWFsICovCisJCQl0bXMzODB0cl9pbnRlcnJ1cHQoaXJxLCBkZXZfaWQsIHJlZ3MpOworCisJCQlwZW5kaW5nID0gU0lGUkVBRFcoU0lGU1RTKTsgLyogcmVzdGFydCAtIHRoZSBTSUYgd2F5ICovCisKKwkJfSBlbHNlCisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7IAorCX0gd2hpbGUgKDEpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOyAvKiBub3QgcmVhY2hhYmxlICovCit9CisKKy8qCisgKiBTZXQgdGhlIGNhcmQgdG8gdGhlIHByZWZlcmVkIHJpbmcgc3BlZWQuCisgKgorICogVW5saWtlIG5ld2VyIGNhcmRzLCB0aGUgTUMxNi8zMiBoYXZlIHRoZWlyIHNwZWVkIHNlbGVjdGlvbgorICogY2lyY3VpdCBjb25uZWN0ZWQgdG8gdGhlIE1hZGdlIEFTSUNzIGFuZCBub3QgdG8gdGhlIFRNUzM4MAorICogTlNFTE9VVCBwaW5zLiBTZXQgdGhlIEFTSUMgYml0cyBjb3JyZWN0bHkgaGVyZSwgYW5kIHJldHVybiAKKyAqIHplcm8gdG8gbGVhdmUgdGhlIFRNUyBOU0VMT1VUIGJpdHMgdW5hZmZlY3RlZC4KKyAqCisgKi8KK3Vuc2lnbmVkIHNob3J0IG1hZGdlbWNfc2V0bnNlbG91dF9waW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgY2hhciByZWcxOworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwlyZWcxID0gaW5iKGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcxKTsKKworCWlmKHRwLT5EYXRhUmF0ZSA9PSBTUEVFRF8xNikKKwkJcmVnMSB8PSBNQ19DT05UUk9MX1JFRzFfU1BFRURfU0VMOyAvKiBhZGQgZm9yIDE2bWIgKi8KKwllbHNlIGlmIChyZWcxICYgTUNfQ09OVFJPTF9SRUcxX1NQRUVEX1NFTCkKKwkJcmVnMSBePSBNQ19DT05UUk9MX1JFRzFfU1BFRURfU0VMOyAvKiByZW1vdmUgZm9yIDRtYiAqLworCW91dGIocmVnMSwgZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzEpOworCisJcmV0dXJuIDA7IC8qIG5vIGNoYW5nZSAqLworfQorCisvKgorICogU2V0IHRoZSByZWdpc3RlciBwYWdlLiAgVGhpcyBlcXVhdGVzIHRvIHRoZSBTUlNYIGxpbmUKKyAqIG9uIHRoZSBUTVMzODBDeDYuCisgKgorICogUmVnaXN0ZXIgc2VsZWN0aW9uIGlzIG5vcm1hbGx5IGRvbmUgdmlhIHRocmVlIGNvbnRpZ3VvdXMKKyAqIGJpdHMuICBIb3dldmVyLCBzb21lIGJvYXJkcyAoc3VjaCBhcyB0aGUgTUMxNi8zMikgdXNlIG9ubHkKKyAqIHR3byBiaXRzLCBwbHVzIGEgc2VwYXJhdGUgYml0IGluIHRoZSBnbHVlIGNoaXAuICBUaGlzCisgKiBzZXRzIHRoZSBTUlNYIGJpdCAodGhlIHRvcCBiaXQpLiAgU2VlIHBhZ2UgNC0xNyBpbiB0aGUKKyAqIFllbGxvdyBCb29rIGZvciB3aGljaCByZWdpc3RlcnMgYXJlIGFmZmVjdGVkLgorICoKKyAqLworc3RhdGljIHZvaWQgbWFkZ2VtY19zZXRyZWdwYWdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwYWdlKQorewkKKwlzdGF0aWMgaW50IHJlZzE7CisKKwlyZWcxID0gaW5iKGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcxKTsKKwlpZiAoKHBhZ2UgPT0gMCkgJiYgKHJlZzEgJiBNQ19DT05UUk9MX1JFRzFfU1JTWCkpIHsKKwkJb3V0YihyZWcxIF4gTUNfQ09OVFJPTF9SRUcxX1NSU1gsIAorCQkgICAgIGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcxKTsKKwl9CisJZWxzZSBpZiAocGFnZSA9PSAxKSB7CisJCW91dGIocmVnMSB8IE1DX0NPTlRST0xfUkVHMV9TUlNYLCAKKwkJICAgICBkZXYtPmJhc2VfYWRkciArIE1DX0NPTlRST0xfUkVHMSk7CisJfQorCXJlZzEgPSBpbmIoZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzEpOworCisJcmV0dXJuOworfQorCisvKgorICogVGhlIFNJRiByZWdpc3RlcnMgYXJlIG5vdCBtYXBwZWQgaW50byByZWdpc3RlciBzcGFjZSBieSBkZWZhdWx0CisgKiBTZXQgdGhpcyB0byAxIHRvIG1hcCB0aGVtLCAwIHRvIG1hcCB0aGUgQklBIFJPTS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIG1hZGdlbWNfc2V0c2lmc2VsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2YWwpCit7CisJdW5zaWduZWQgaW50IHJlZzA7CisKKwlyZWcwID0gaW5iKGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcwKTsKKwlpZiAoKHZhbCA9PSAwKSAmJiAocmVnMCAmIE1DX0NPTlRST0xfUkVHMF9TSUZTRUwpKSB7CisJCW91dGIocmVnMCBeIE1DX0NPTlRST0xfUkVHMF9TSUZTRUwsIAorCQkgICAgIGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcwKTsKKwl9IGVsc2UgaWYgKHZhbCA9PSAxKSB7CisJCW91dGIocmVnMCB8IE1DX0NPTlRST0xfUkVHMF9TSUZTRUwsIAorCQkgICAgIGRldi0+YmFzZV9hZGRyICsgTUNfQ09OVFJPTF9SRUcwKTsKKwl9CQorCXJlZzAgPSBpbmIoZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzApOworCisJcmV0dXJuOworfQorCisvKgorICogRW5hYmxlIFNJRiBpbnRlcnJ1cHRzCisgKgorICogVGhpcyBkb2VzIG5vdCBlbmFibGUgaW50ZXJydXB0cyBpbiB0aGUgU0lGLCBidXQgcmF0aGVyCisgKiBlbmFibGVzIFNJRiBpbnRlcnJ1cHRzIHRvIGJlIHBhc3NlZCBvbnRvIHRoZSBob3N0LgorICoKKyAqLworc3RhdGljIHZvaWQgbWFkZ2VtY19zZXRpbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnMTsKKworCXJlZzEgPSBpbmIoZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzEpOworCWlmICgodmFsID09IDApICYmIChyZWcxICYgTUNfQ09OVFJPTF9SRUcxX1NJTlRFTikpIHsKKwkJb3V0YihyZWcxIF4gTUNfQ09OVFJPTF9SRUcxX1NJTlRFTiwgCisJCSAgICAgZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzEpOworCX0gZWxzZSBpZiAodmFsID09IDEpIHsKKwkJb3V0YihyZWcxIHwgTUNfQ09OVFJPTF9SRUcxX1NJTlRFTiwgCisJCSAgICAgZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzEpOworCX0KKworCXJldHVybjsKK30KKworLyoKKyAqIENhYmxlIHR5cGUgaXMgc2V0IHZpYSBjb250cm9sIHJlZ2lzdGVyIDcuIEJpdCB6ZXJvIGhpZ2gKKyAqIGZvciBVVFAsIGxvdyBmb3IgU1RQLgorICovCitzdGF0aWMgdm9pZCBtYWRnZW1jX3NldGNhYmxldHlwZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdHlwZSkKK3sKKwlvdXRiKCh0eXBlPT0wKT9NQ19DT05UUk9MX1JFRzdfQ0FCTEVVVFA6TUNfQ09OVFJPTF9SRUc3X0NBQkxFU1RQLAorCSAgICAgZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzcpOworfQorCisvKgorICogRW5hYmxlIHRoZSBmdW5jdGlvbnMgb2YgdGhlIE1hZGdlIGNoaXBzZXQgbmVlZGVkIGZvcgorICogZnVsbCB3b3JraW5nIG9yZGVyLiAKKyAqLworc3RhdGljIGludCBtYWRnZW1jX2NoaXBzZXRfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW91dGIoMCwgZGV2LT5iYXNlX2FkZHIgKyBNQ19DT05UUk9MX1JFRzEpOyAvKiBwdWxsIFNSRVNFVCBsb3cgKi8KKwl0bXMzODB0cl93YWl0KDEwMCk7IC8qIHdhaXQgZm9yIGNhcmQgdG8gcmVzZXQgKi8KKworCS8qIGJyaW5nIGJhY2sgaW50byBub3JtYWwgb3BlcmF0aW5nIG1vZGUgKi8KKwlvdXRiKE1DX0NPTlRST0xfUkVHMV9OU1JFU0VULCBkZXYtPmJhc2VfYWRkciArIE1DX0NPTlRST0xfUkVHMSk7CisKKwkvKiBtYXAgU0lGIHJlZ2lzdGVycyAqLworCW1hZGdlbWNfc2V0c2lmc2VsKGRldiwgMSk7CisKKwkvKiBlbmFibGUgU0lGIGludGVycnVwdHMgKi8KKwltYWRnZW1jX3NldGludChkZXYsIDEpOyAKKworCXJldHVybiAwOworfQorCisvKgorICogRGlzYWJsZSB0aGUgYm9hcmQsIGFuZCBwdXQgYmFjayBpbnRvIHBvd2VyLXVwIHN0YXRlLgorICovCit2b2lkIG1hZGdlbWNfY2hpcHNldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCW1hZGdlbWNfc2V0aW50KGRldiwgMCk7CisJLyogdW5tYXAgU0lGIHJlZ2lzdGVycyAqLworCW1hZGdlbWNfc2V0c2lmc2VsKGRldiwgMCk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBSZWFkIHRoZSBjYXJkIHR5cGUgKE1DMTYgb3IgTUMzMikgZnJvbSB0aGUgY2FyZC4KKyAqCisgKiBUaGUgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgYXJlIHN0b3JlZCBpbiB0d28gc2VwYXJhdGUKKyAqIHBhZ2VzLiAgUGFnZXMgYXJlIGZsaXBwZWQgYnkgY2xlYXJpbmcgYml0IDMgb2YgQ09OVFJPTF9SRUcwIChQQUdFKQorICogZm9yIHBhZ2UgemVybywgb3Igc2V0dGluZyBiaXQgMyBmb3IgcGFnZSBvbmUuCisgKgorICogUGFnZSB6ZXJvIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZGF0YToKKyAqCUJ5dGUgMDogTWFudWZhY3R1cmVyIElEICgweDREIC0tIEFTQ0lJICJNIikKKyAqCUJ5dGUgMTogQ2FyZCB0eXBlOgorICoJCQkweDA4IGZvciBNQzE2CisgKgkJCTB4MEQgZm9yIE1DMzIKKyAqCUJ5dGUgMjogQ2FyZCByZXZpc2lvbgorICoJQnl0ZSAzOiBNaXJyb3Igb2YgUE9TIGNvbmZpZyByZWdpc3RlciAwCisgKglCeXRlIDQ6IE1pcnJvciBvZiBQT1MgMQorICoJQnl0ZSA1OiBNaXJyb3Igb2YgUE9TIDIKKyAqCisgKiBQYWdlIG9uZSBjb250YWlucyB0aGUgZm9sbG93aW5nIGRhdGE6CisgKglCeXRlIDA6IFVudXNlZAorICoJQnl0ZSAxLTY6IEJJQSwgTVNCIHRvIExTQi4KKyAqCisgKiBOb3RlIHRoYXQgdG8gcmVhZCB0aGUgQklBLCB3ZSBtdXN0IHVubWFwIHRoZSBTSUYgcmVnaXN0ZXJzCisgKiBieSBjbGVhcmluZyBiaXQgMiBvZiBDT05UUk9MX1JFRzAgKFNJRlNFTCksIGFzIHRoZSBkYXRhCisgKiB3aWxsIHJlc2lkZSBpbiB0aGUgc2FtZSBsb2dpY2FsIGxvY2F0aW9uLiAgRm9yIHRoaXMgcmVhc29uLAorICogX25ldmVyXyByZWFkIHRoZSBCSUEgd2hpbGUgdGhlIEVhZ2xlIHByb2Nlc3NvciBpcyBydW5uaW5nIQorICogVGhlIFNJRiB3aWxsIGJlIGNvbXBsZXRlbHkgaW5hY2Nlc3NpYmxlIHVudGlsIHRoZSBCSUEgb3BlcmF0aW9uCisgKiBpcyBjb21wbGV0ZS4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIG1hZGdlbWNfcmVhZF9yb20oc3RydWN0IG1hZGdlbWNfY2FyZCAqY2FyZCkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkcjsKKwl1bnNpZ25lZCBjaGFyIHJlZzAsIHJlZzEsIHRtcHJlZzAsIGk7CisKKwlpb2FkZHIgPSBjYXJkLT5kZXYtPmJhc2VfYWRkcjsKKworCXJlZzAgPSBpbmIoaW9hZGRyICsgTUNfQ09OVFJPTF9SRUcwKTsKKwlyZWcxID0gaW5iKGlvYWRkciArIE1DX0NPTlRST0xfUkVHMSk7CisKKwkvKiBTd2l0Y2ggdG8gcGFnZSB6ZXJvIGFuZCB1bm1hcCBTSUYgKi8KKwl0bXByZWcwID0gcmVnMCAmIH4oTUNfQ09OVFJPTF9SRUcwX1BBR0UgKyBNQ19DT05UUk9MX1JFRzBfU0lGU0VMKTsKKwlvdXRiKHRtcHJlZzAsIGlvYWRkciArIE1DX0NPTlRST0xfUkVHMCk7CisJCisJY2FyZC0+bWFuaWQgPSBpbmIoaW9hZGRyICsgTUNfUk9NX01BTlVGQUNUVVJFUklEKTsKKwljYXJkLT5jYXJkdHlwZSA9IGluYihpb2FkZHIgKyBNQ19ST01fQURBUFRFUklEKTsKKwljYXJkLT5jYXJkcmV2ID0gaW5iKGlvYWRkciArIE1DX1JPTV9SRVZJU0lPTik7CisKKwkvKiBTd2l0Y2ggdG8gcm9tIHBhZ2Ugb25lICovCisJb3V0Yih0bXByZWcwIHwgTUNfQ09OVFJPTF9SRUcwX1BBR0UsIGlvYWRkciArIE1DX0NPTlRST0xfUkVHMCk7CisKKwkvKiBSZWFkIEJJQSAqLworCWNhcmQtPmRldi0+YWRkcl9sZW4gPSA2OworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWNhcmQtPmRldi0+ZGV2X2FkZHJbaV0gPSBpbmIoaW9hZGRyICsgTUNfUk9NX0JJQV9TVEFSVCArIGkpOworCQorCS8qIFJlc3RvcmUgb3JpZ2luYWwgcmVnaXN0ZXIgdmFsdWVzICovCisJb3V0YihyZWcwLCBpb2FkZHIgKyBNQ19DT05UUk9MX1JFRzApOworCW91dGIocmVnMSwgaW9hZGRyICsgTUNfQ09OVFJPTF9SRUcxKTsKKwkKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgbWFkZ2VtY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7ICAKKwkvKgorCSAqIEdvIGFoZWFkIGFuZCByZWluaXRpYWxpemUgdGhlIGNoaXBzZXQgYWdhaW4sIGp1c3QgdG8gCisJICogbWFrZSBzdXJlIHdlIGRpZG4ndCBnZXQgbGVmdCBpbiBhIGJhZCBzdGF0ZS4KKwkgKi8KKwltYWRnZW1jX2NoaXBzZXRfaW5pdChkZXYpOworCXRtczM4MHRyX29wZW4oZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWRnZW1jX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdG1zMzgwdHJfY2xvc2UoZGV2KTsKKwltYWRnZW1jX2NoaXBzZXRfY2xvc2UoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdpdmUgc29tZSBkZXRhaWxzIGF2YWlsYWJsZSBmcm9tIC9wcm9jL21jYS9zbG90WAorICovCitzdGF0aWMgaW50IG1hZGdlbWNfbWNhcHJvYyhjaGFyICpidWYsIGludCBzbG90LCB2b2lkICpkKSAKK3sJCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWQ7CisJc3RydWN0IG1hZGdlbWNfY2FyZCAqY3VyY2FyZCA9IG1hZGdlbWNfY2FyZF9saXN0OworCWludCBsZW4gPSAwOworCQorCXdoaWxlIChjdXJjYXJkKSB7IC8qIHNlYXJjaCBmb3IgY2FyZCBzdHJ1Y3QgKi8KKwkJaWYgKGN1cmNhcmQtPmRldiA9PSBkZXYpCisJCQlicmVhazsKKwkJY3VyY2FyZCA9IGN1cmNhcmQtPm5leHQ7CisJfQorCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICItLS0tLS0tXG4iKTsKKwlpZiAoY3VyY2FyZCkgeworCQlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJCWludCBpOworCQkKKwkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIkNhcmQgUmV2aXNpb246ICVkXG4iLCBjdXJjYXJkLT5jYXJkcmV2KTsKKwkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIlJBTSBTaXplOiAlZGtiXG4iLCBjdXJjYXJkLT5yYW1zaXplKTsKKwkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIkNhYmxlIHR5cGU6ICVzXG4iLCAoY3VyY2FyZC0+Y2FibGV0eXBlKT8iU1RQL0RCOSI6IlVUUC9SSi00NSIpOworCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiQ29uZmlndXJlZCByaW5nIHNwZWVkOiAlZE1iL3NlY1xuIiwgKGN1cmNhcmQtPnJpbmdzcGVlZCk/MTY6NCk7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJSdW5uaW5nIHJpbmcgc3BlZWQ6ICVkTWIvc2VjXG4iLCAodHAtPkRhdGFSYXRlPT1TUEVFRF8xNik/MTY6NCk7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJEZXZpY2U6ICVzXG4iLCBkZXYtPm5hbWUpOworCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiSU8gUG9ydDogMHglMDRseFxuIiwgZGV2LT5iYXNlX2FkZHIpOworCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiSVJROiAlZFxuIiwgZGV2LT5pcnEpOworCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiQXJiaXRyYXRpb24gTGV2ZWw6ICVkXG4iLCBjdXJjYXJkLT5hcmJsZXZlbCk7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJCdXJzdCBNb2RlOiAiKTsKKwkJc3dpdGNoKGN1cmNhcmQtPmJ1cnN0bW9kZSkgeworCQljYXNlIDA6IGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJDeWNsZSBzdGVhbCIpOyBicmVhazsKKwkJY2FzZSAxOiBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiTGltaXRlZCBidXJzdCIpOyBicmVhazsKKwkJY2FzZSAyOiBsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiRGVsYXllZCByZWxlYXNlIik7IGJyZWFrOworCQljYXNlIDM6IGxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJJbW1lZGlhdGUgcmVsZWFzZSIpOyBicmVhazsKKwkJfQorCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiICglcylcbiIsIChjdXJjYXJkLT5mYWlybmVzcyk/IlVuZmFpciI6IkZhaXIiKTsKKwkJCisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJSaW5nIFN0YXRpb24gQWRkcmVzczogIik7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIlMi4yeCIsIGRldi0+ZGV2X2FkZHJbMF0pOworCQlmb3IgKGkgPSAxOyBpIDwgNjsgaSsrKQorCQkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIiAlMi4yeCIsIGRldi0+ZGV2X2FkZHJbaV0pOworCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiXG4iKTsKKwl9IGVsc2UgCisJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJDYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtYWRnZW1jX2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBtYWRnZW1jX2NhcmQgKnRoaXNfY2FyZDsKKwkKKwl3aGlsZSAobWFkZ2VtY19jYXJkX2xpc3QpIHsKKwkJZGV2ID0gbWFkZ2VtY19jYXJkX2xpc3QtPmRldjsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHItTUFER0VNQ19TSUZfT0ZGU0VULCBNQURHRU1DX0lPX0VYVEVOVCk7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQl0bXNkZXZfdGVybShkZXYpOworCQlmcmVlX25ldGRldihkZXYpOworCQl0aGlzX2NhcmQgPSBtYWRnZW1jX2NhcmRfbGlzdDsKKwkJbWFkZ2VtY19jYXJkX2xpc3QgPSB0aGlzX2NhcmQtPm5leHQ7CisJCWtmcmVlKHRoaXNfY2FyZCk7CisJfQorfQorCittb2R1bGVfaW5pdChtYWRnZW1jX3Byb2JlKTsKK21vZHVsZV9leGl0KG1hZGdlbWNfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworDAorLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RWRVJTSU9OUyAgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1mb21pdC1mcmFtZS1wb2ludGVyIC1JL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQvdG9rZW5yaW5nLyAtYyBtYWRnZW1jLmMiCisgKiAgYWx0LWNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUkvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC90b2tlbnJpbmcvIC1jIG1hZGdlbWMuYyIKKyAqICBjLXNldC1zdHlsZSAiSyZSIgorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvbWFkZ2VtYy5oIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL21hZGdlbWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGQ4MjIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL21hZGdlbWMuaApAQCAtMCwwICsxLDcwIEBACisvKiAKKyAqIG1hZGdlbWMuaDogSGVhZGVyIGZvciB0aGUgbWFkZ2VtYyB0bXMzODB0ciBtb2R1bGUKKyAqCisgKiBBdXRob3JzOgorICogLSBBZGFtIEZyaXR6bGVyIDxtaWRAYXVrLmN4PgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NQURHRU1DX0gKKyNkZWZpbmUgX19MSU5VWF9NQURHRU1DX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNQURHRU1DMTZfQ0FSRE5BTUUgIk1hZGdlIFNtYXJ0IDE2LzQgTUMxNiBSaW5nbm9kZSIKKyNkZWZpbmUgTUFER0VNQzMyX0NBUkROQU1FICJNYWRnZSBTbWFydCAxNi80IE1DMzIgUmluZ25vZGUiCisKKy8qIAorICogQml0IGRlZmluaXRpb25zIGZvciB0aGUgUE9TIGNvbmZpZyByZWdpc3RlcnMKKyAqLworI2RlZmluZSBNQzE2X1BPUzBfQUREUjEgMHgyMAorI2RlZmluZSBNQzE2X1BPUzJfQUREUjIgMHgwNAorI2RlZmluZSBNQzE2X1BPUzNfQUREUjMgMHgyMAorCisjZGVmaW5lIE1DX0NPTlRST0xfUkVHMAkJKChsb25nKS04KSAvKiAweDAwICovCisjZGVmaW5lIE1DX0NPTlRST0xfUkVHMQkJKChsb25nKS03KSAvKiAweDAxICovCisjZGVmaW5lIE1DX0FEQVBURVJfUE9TX1JFRzAJKChsb25nKS02KSAvKiAweDAyICovCisjZGVmaW5lIE1DX0FEQVBURVJfUE9TX1JFRzEJKChsb25nKS01KSAvKiAweDAzICovCisjZGVmaW5lIE1DX0FEQVBURVJfUE9TX1JFRzIJKChsb25nKS00KSAvKiAweDA0ICovCisjZGVmaW5lIE1DX0FEQVBURVJfUkVHNV9VTlVTRUQJKChsb25nKS0zKSAvKiAweDA1ICovCisjZGVmaW5lIE1DX0FEQVBURVJfUkVHNl9VTlVTRUQJKChsb25nKS0yKSAvKiAweDA2ICovCisjZGVmaW5lIE1DX0NPTlRST0xfUkVHNwkJKChsb25nKS0xKSAvKiAweDA3ICovCisKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUcwX1VOS05PV04xCTB4MDEKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUcwX1VOS05PV04yCTB4MDIKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUcwX1NJRlNFTAkJMHgwNAorI2RlZmluZSBNQ19DT05UUk9MX1JFRzBfUEFHRQkJMHgwOAorI2RlZmluZSBNQ19DT05UUk9MX1JFRzBfVEVTVElOVEVSUlVQVAkweDEwCisjZGVmaW5lIE1DX0NPTlRST0xfUkVHMF9VTktOT1dOMjAJMHgyMAorI2RlZmluZSBNQ19DT05UUk9MX1JFRzBfU0lOVFIJCTB4NDAKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUcwX1VOS05PV044MAkweDgwCisKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUcxX1NJTlRFTgkJMHgwMQorI2RlZmluZSBNQ19DT05UUk9MX1JFRzFfQklUT0ZERUFUSAkweDAyCisjZGVmaW5lIE1DX0NPTlRST0xfUkVHMV9OU1JFU0VUCQkweDA0CisjZGVmaW5lIE1DX0NPTlRST0xfUkVHMV9VTktOT1dOOAkweDA4CisjZGVmaW5lIE1DX0NPTlRST0xfUkVHMV9VTktOT1dOMTAJMHgxMAorI2RlZmluZSBNQ19DT05UUk9MX1JFRzFfVU5LTk9XTjIwCTB4MjAKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUcxX1NSU1gJCTB4NDAKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUcxX1NQRUVEX1NFTAkweDgwCisKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUc3X0NBQkxFU1RQCTB4MDAKKyNkZWZpbmUgTUNfQ09OVFJPTF9SRUc3X0NBQkxFVVRQCTB4MDEKKworLyoKKyAqIFJPTSBQYWdlIFplcm8KKyAqLworI2RlZmluZSBNQ19ST01fTUFOVUZBQ1RVUkVSSUQJCTB4MDAKKyNkZWZpbmUgTUNfUk9NX0FEQVBURVJJRAkJMHgwMQorI2RlZmluZSBNQ19ST01fUkVWSVNJT04JCQkweDAyCisjZGVmaW5lIE1DX1JPTV9DT05GSUcwCQkJMHgwMworI2RlZmluZSBNQ19ST01fQ09ORklHMQkJCTB4MDQKKyNkZWZpbmUgTUNfUk9NX0NPTkZJRzIJCQkweDA1CisKKy8qCisgKiBST00gUGFnZSBPbmUKKyAqLworI2RlZmluZSBNQ19ST01fVU5VU0VEX0JZVEUJCTB4MDAKKyNkZWZpbmUgTUNfUk9NX0JJQV9TVEFSVAkJMHgwMQorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9fTElOVVhfTUFER0VNQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvb2x5bXBpYy5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL29seW1waWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTc5MjMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL29seW1waWMuYwpAQCAtMCwwICsxLDE3ODYgQEAKKy8qCisgKiAgIG9seW1waWMuYyAoYykgMTk5OSBQZXRlciBEZSBTY2hyaWp2ZXIgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoJCSAgIDE5OTkvMjAwMCBNaWtlIFBoaWxsaXBzIChtaWtlcEBsaW51eHRyLm5ldCkKKyAqCisgKiAgTGludXggZHJpdmVyIGZvciBJQk0gUENJIHRva2VucmluZyBjYXJkcyBiYXNlZCBvbiB0aGUgUGl0L1BpdC1QaHkvT2x5bXBpYworICogIGNoaXBzZXQuIAorICoKKyAqICBCYXNlIERyaXZlciBTa2VsZXRvbjoKKyAqICAgICAgV3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgKiAgICAgIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCisgKgorICogIFRoYW5rcyB0byBFcmlrIERlIENvY2ssIEFkcmlhbiBCcmlkZ2V0dCBhbmQgRnJhbmsgRmllbmUgZm9yIHRoZWlyIAorICogIGFzc2lzdGFuY2UgYW5kIHBlcnNlcnZlcmFuY2Ugd2l0aCB0aGUgdGVzdGluZyBvZiB0aGlzIGRyaXZlci4KKyAqCisgKiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKiAKKyAqICA0LzI3Lzk5IC0gQWxwaGEgUmVsZWFzZSAwLjEuMAorICogICAgICAgICAgICBGaXJzdCByZWxlYXNlIHRvIHRoZSBwdWJsaWMKKyAqCisgKiAgNi84Lzk5ICAtIE9mZmljaWFsIFJlbGVhc2UgMC4yLjAgICAKKyAqICAgICAgICAgICAgTWVyZ2VkIGludG8gdGhlIGtlcm5lbCBjb2RlIAorICogIDgvMTgvOTkgLSBVcGRhdGVkIGRyaXZlciBmb3IgMi4zLjEzIGtlcm5lbCB0byB1c2UgbmV3IHBjaQorICoJICAgICAgcmVzb3VyY2UuIERyaXZlciBhbHNvIHJlcG9ydHMgdGhlIGNhcmQgbmFtZSByZXR1cm5lZCBieQorICogICAgICAgICAgICB0aGUgcGNpIHJlc291cmNlLgorICogIDEvMTEvMDAgLSBBZGRlZCBzcGlubG9ja3MgZm9yIHNtcAorICogIDIvMjMvMDAgLSBVcGRhdGVkIHRvIGRldl9rZnJlZV9pcnEgCisgKiAgMy8xMC8wMCAtIEZpeGVkIEZEWCBlbmFibGUgd2hpY2ggdHJpZ2dlcmVkIG90aGVyIGJ1Z3MgYWxzbyAKKyAqICAgICAgICAgICAgc3F1YXNoZWQuCisgKiAgNS8yMC8wMCAtIENoYW5nZXMgdG8gaGFuZGxlIE9seW1waWMgb24gTGludXhQUEMuIEVuZGlhbiBjaGFuZ2VzLgorICogICAgICAgICAgICBUaGUgb2RkIHRoaW5nIGFib3V0IHRoZSBjaGFuZ2VzIGlzIHRoYXQgdGhlIGZpeCBmb3IKKyAqICAgICAgICAgICAgZW5kaWFuIGlzc3VlcyB3aXRoIHRoZSBiaWctZW5kaWFuIGRhdGEgaW4gdGhlIGFyYiwgYXNiLi4uCisgKiAgICAgICAgICAgIHdhcyB0byBhbHdheXMgc3dhYigpIHRoZSBieXRlcywgbm8gbWF0dGVyIHdoYXQgQ1BVLgorICogICAgICAgICAgICBUaGF0J3MgYmVjYXVzZSB0aGUgcmVhZFt3bF0oKSBmdW5jdGlvbnMgYWx3YXlzIHN3YXAgdGhlCisgKiAgICAgICAgICAgIGJ5dGVzIG9uIHRoZSB3YXkgaW4gb24gUFBDLgorICogICAgICAgICAgICBGaXhpbmcgdGhlIGhhcmR3YXJlIGRlc2NyaXB0b3JzIHdhcyBhbm90aGVyIG1hdHRlciwKKyAqICAgICAgICAgICAgYmVjYXVzZSB0aGV5IHdlcmVuJ3QgZ29pbmcgdGhyb3VnaCByZWFkW3dsXSgpLCB0aGVyZSBhbGwKKyAqICAgICAgICAgICAgdGhlIHJlc3VsdHMgaGFkIHRvIGJlIGluIG1lbW9yeSBpbiBsZTMyIHZhbHVlcy4ga2RhYWtlcgorICoKKyAqIDEyLzIzLzAwIC0gQWRkZWQgbWluaW1hbCBDYXJkYnVzIHN1cHBvcnQgKFRoYW5rcyBEb25hbGQpLgorICoKKyAqIDAzLzA5LzAxIC0gQWRkIG5ldyBwY2kgYXBpLCBkZXZfYmFzZV9sb2NrLCBnZW5lcmFsIGNsZWFuIHVwLiAKKyAqCisgKiAwMy8yNy8wMSAtIEFkZCBuZXcgZG1hIHBjaSAoVGhhbmtzIHRvIEt5bGUgTHVja2UpIGFuZCBhbGxvY190cmRldgorICoJICAgICAgQ2hhbmdlIHByb2NfZnMgYmVoYXZpb3VyLCBub3cgb25lIGVudHJ5IHBlciBhZGFwdGVyLgorICoKKyAqIDA0LzA5LzAxIC0gQ291cGxlIG9mIGJ1ZyBmaXhlcyB0byB0aGUgZG1hIHVubWFwcyBhbmQgZWplY3RpbmcgdGhlCisgKgkgICAgICBhZGFwdGVyIHdoZW4gbGl2ZSBkb2VzIG5vdCB0YWtlIHRoZSBzeXN0ZW0gZG93biB3aXRoIGl0LgorICogCisgKiAwNi8wMi8wMSAtIENsZWFuIHVwLCBjb3B5IHNrYiBmb3Igc21hbGwgcGFja2V0cworICogCisgKiAwNi8yMi8wMSAtIEFkZCBFSVNSIGVycm9yIGhhbmRsaW5nIHJvdXRpbmVzIAorICoKKyAqIDA3LzE5LzAxIC0gSW1wcm92ZSBiYWQgTEFBIHJlcG9ydGluZywgc3RyaXAgb3V0IGZyZWVtZW0KKyAqCSAgICAgIGludG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiwgaXRzIGNhbGxlZCBmcm9tIDMgCisgKgkgICAgICBkaWZmZXJlbnQgcGxhY2VzIG5vdy4gCisgKiAwMi8wOS8wMiAtIFJlcGxhY2VkIHNsZWVwX29uLiAKKyAqIDAzLzAxLzAyIC0gUmVwbGFjZSBhY2Nlc3MgdG8gc2V2ZXJhbCByZWdpc3RlcnMgZnJvbSAzMiBiaXQgdG8gCisgKiAJICAgICAgMTYgYml0LiBGaXhlcyBhbGlnbm1lbnQgZXJyb3JzIG9uIFBQQyA2NCBiaXQgbWFjaGluZXMuCisgKiAJICAgICAgVGhhbmtzIHRvIEFsIFRyYXV0bWFuIGZvciB0aGlzIG9uZS4KKyAqIDAzLzEwLzAyIC0gRml4IEJVRyBpbiBhcmJfY21kLiBCdWcgd2FzIHRoZXJlIGFsbCBhbG9uZyBidXQgd2FzCisgKiAJICAgICAgc2lsZW50bHkgaWdub3JlZCB1bnRpbCB0aGUgZXJyb3IgY2hlY2tpbmcgY29kZSAKKyAqIAkgICAgICB3ZW50IGludG8gdmVyc2lvbiAxLjAuMCAKKyAqIDA2LzA0LzAyIC0gQWRkIGNvcnJlY3Qgc3RhcnQgdXAgc2VxdWVuY2UgZm9yIHRoZSBjYXJkYnVzIGFkYXB0ZXJzLgorICogCSAgICAgIFJlcXVpcmVkIGZvciBzdHJpY3QgY29tcGxpYW5jZSB3aXRoIHBjaSBwb3dlciBtZ210IHNwZWNzLgorICogIFRvIERvOgorICoKKyAqCSAgICAgV2FrZSBvbiBsYW4JCisgKiAKKyAqICBJZiBQcm9ibGVtcyBkbyBPY2N1cgorICogIE1vc3QgcHJvYmxlbXMgY2FuIGJlIHJlY3RpZmllZCBieSBlaXRoZXIgY2xvc2luZyBhbmQgb3BlbmluZyB0aGUgaW50ZXJmYWNlCisgKiAgKGlmY29uZmlnIGRvd24gYW5kIHVwKSBvciBybW1vZCBhbmQgaW5zbW9kJ2luZyB0aGUgZHJpdmVyIChhIGJpdCBkaWZmaWN1bHQKKyAqICBpZiBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwpLgorICovCisKKy8qIENoYW5nZSBPTFlNUElDX0RFQlVHIHRvIDEgdG8gZ2V0IHZlcmJvc2UsIGFuZCBJIG1lYW4gcmVhbGx5IHZlcmJvc2UsIG1lc3NhZ2VzICovCisKKyNkZWZpbmUgT0xZTVBJQ19ERUJVRyAwCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgIm9seW1waWMuaCIKKworLyogSSd2ZSBnb3QgdG8gcHV0IHNvbWUgaW50ZWxsaWdlbmNlIGludG8gdGhlIHZlcnNpb24gbnVtYmVyIHNvIHRoYXQgUGV0ZXIgYW5kIEkga25vdworICogd2hpY2ggdmVyc2lvbiBvZiB0aGUgY29kZSBzb21lYm9keSBoYXMgZ290LiAKKyAqIFZlcnNpb24gTnVtYmVyID0gYS5iLmMuZCAgd2hlcmUgYS5iLmMgaXMgdGhlIGxldmVsIG9mIGNvZGUgYW5kIGQgaXMgdGhlIGxhdGVzdCBhdXRob3IuCisgKiBTbyAwLjAuMS5wZHMgPSBQZXRlciwgMC4wLjEubWxwID0gTWlrZQorICogCisgKiBPZmZpY2lhbCByZWxlYXNlcyB3aWxsIG9ubHkgaGF2ZSBhbiBhLmIuYyB2ZXJzaW9uIG51bWJlciBmb3JtYXQuIAorICovCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0gCisiT2x5bXBpYy5jIHYxLjAuNSA2LzA0LzAyIC0gUGV0ZXIgRGUgU2NocmlqdmVyICYgTWlrZSBQaGlsbGlwcyIgOyAKKworc3RhdGljIGNoYXIgKm9wZW5fbWFqX2Vycm9yW10gID0geyJObyBlcnJvciIsICJMb2JlIE1lZGlhIFRlc3QiLCAiUGh5c2ljYWwgSW5zZXJ0aW9uIiwKKwkJCQkgICAiQWRkcmVzcyBWZXJpZmljYXRpb24iLCAiTmVpZ2hib3IgTm90aWZpY2F0aW9uIChSaW5nIFBvbGwpIiwKKwkJCQkgICAiUmVxdWVzdCBQYXJhbWV0ZXJzIiwiRkRYIFJlZ2lzdHJhdGlvbiBSZXF1ZXN0IiwKKwkJCQkgICAiRkRYIER1cGxpY2F0ZSBBZGRyZXNzIENoZWNrIiwgIlN0YXRpb24gcmVnaXN0cmF0aW9uIFF1ZXJ5IFdhaXQiLAorCQkJCSAgICJVbmtub3duIHN0YWdlIn07CisKK3N0YXRpYyBjaGFyICpvcGVuX21pbl9lcnJvcltdID0geyJObyBlcnJvciIsICJGdW5jdGlvbiBGYWlsdXJlIiwgIlNpZ25hbCBMb3N0IiwgIldpcmUgRmF1bHQiLAorCQkJCSAgICJSaW5nIFNwZWVkIE1pc21hdGNoIiwgIlRpbWVvdXQiLCJSaW5nIEZhaWx1cmUiLCJSaW5nIEJlYWNvbmluZyIsCisJCQkJICAgIkR1cGxpY2F0ZSBOb2RlIEFkZHJlc3MiLCJSZXF1ZXN0IFBhcmFtZXRlcnMiLCJSZW1vdmUgUmVjZWl2ZWQiLAorCQkJCSAgICJSZXNlcnZlZCIsICJSZXNlcnZlZCIsICJObyBNb25pdG9yIERldGVjdGVkIGZvciBSUEwiLCAKKwkJCQkgICAiTW9uaXRvciBDb250ZW50aW9uIGZhaWxlciBmb3IgUlBMIiwgIkZEWCBQcm90b2NvbCBFcnJvciJ9OworCisvKiBNb2R1bGUgcGFyYW10ZXJzICovCisKK01PRFVMRV9BVVRIT1IoIk1pa2UgUGhpbGxpcHMgPG1pa2VwQGxpbnV4dHIubmV0PiIpIDsgCitNT0RVTEVfREVTQ1JJUFRJT04oIk9seW1waWMgUENJL0NhcmRidXMgQ2hpcHNldCBEcml2ZXIiKSA7IAorCisvKiBSaW5nIFNwZWVkIDAsNCwxNiwxMDAgCisgKiAwID0gQXV0b3NlbnNlICAgICAgICAgCisgKiA0LDE2ID0gU2VsZWN0ZWQgc3BlZWQgb25seSwgbm8gYXV0b3NlbnNlCisgKiBUaGlzIGFsbG93cyB0aGUgY2FyZCB0byBiZSB0aGUgZmlyc3Qgb24gdGhlIHJpbmcKKyAqIGFuZCBiZWNvbWUgdGhlIGFjdGl2ZSBtb25pdG9yLgorICogMTAwID0gTm90aGluZyBhdCBwcmVzZW50LCAxMDBtYnBzIGlzIGF1dG9kZXRlY3RlZAorICogaWYgRkRYIGlzIHR1cm5lZCBvbi4gTWF5IGJlIGltcGxlbWVudGVkIGluIHRoZSBmdXR1cmUgdG8gCisgKiBmYWlsIGlmIDEwMG1wYnMgaXMgbm90IGRldGVjdGVkLgorICoKKyAqIFdBUk5JTkc6IFNvbWUgaHVicyB3aWxsIGFsbG93IHlvdSB0byBpbnNlcnQKKyAqIGF0IHRoZSB3cm9uZyBzcGVlZAorICovCisKK3N0YXRpYyBpbnQgcmluZ3NwZWVkW09MWU1QSUNfTUFYX0FEQVBURVJTXSA9IHswLH0gOworbW9kdWxlX3BhcmFtX2FycmF5KHJpbmdzcGVlZCwgaW50LCBOVUxMLCAwKTsKKworLyogUGFja2V0IGJ1ZmZlciBzaXplICovCisKK3N0YXRpYyBpbnQgcGt0X2J1Zl9zeltPTFlNUElDX01BWF9BREFQVEVSU10gPSB7MCx9IDsKK21vZHVsZV9wYXJhbV9hcnJheShwa3RfYnVmX3N6LCBpbnQsIE5VTEwsIDApIDsKKworLyogTWVzc2FnZSBMZXZlbCAqLworCitzdGF0aWMgaW50IG1lc3NhZ2VfbGV2ZWxbT0xZTVBJQ19NQVhfQURBUFRFUlNdID0gezAsfSA7IAorbW9kdWxlX3BhcmFtX2FycmF5KG1lc3NhZ2VfbGV2ZWwsIGludCwgTlVMTCwgMCkgOworCisvKiBDaGFuZ2UgbmV0d29ya19tb25pdG9yIHRvIHJlY2VpdmUgbWFjIGZyYW1lcyB0aHJvdWdoIHRoZSBhcmIgY2hhbm5lbC4KKyAqIFdpbGwgYWxzbyBjcmVhdGUgYSAvcHJvYy9uZXQvb2x5bXBpY190ciVkIGVudHJ5LCB3aGVyZSAlZCBpcyB0aGUgdHIKKyAqIGRldmljZSwgaS5lLiB0cjAsIHRyMSBldGMuIAorICogSW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjcmVhdGUgYSByaW5nLWVycm9yIHJlcG9ydGluZyBuZXR3b3JrIG1vZHVsZSAKKyAqIGkuZS4gaXQgd2lsbCBnaXZlIHlvdSB0aGUgc291cmNlIGFkZHJlc3Mgb2YgYmVhY29uZXJzIG9uIHRoZSByaW5nIAorICovCitzdGF0aWMgaW50IG5ldHdvcmtfbW9uaXRvcltPTFlNUElDX01BWF9BREFQVEVSU10gPSB7MCx9OworbW9kdWxlX3BhcmFtX2FycmF5KG5ldHdvcmtfbW9uaXRvciwgaW50LCBOVUxMLCAwKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG9seW1waWNfcGNpX3RibFtdID0geworCXtQQ0lfVkVORE9SX0lEX0lCTSxQQ0lfREVWSUNFX0lEX0lCTV9UUl9XQUtFLFBDSV9BTllfSUQsUENJX0FOWV9JRCx9LAorCXsgfSAJLyogVGVybWluYXRpbmcgRW50cnkgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSxvbHltcGljX3BjaV90YmwpIDsgCisKKworc3RhdGljIGludCBvbHltcGljX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsgCitzdGF0aWMgaW50IG9seW1waWNfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgb2x5bXBpY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBvbHltcGljX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG9seW1waWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBvbHltcGljX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgb2x5bXBpY19mcmVlbWVtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIDsgIAorc3RhdGljIGlycXJldHVybl90IG9seW1waWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogb2x5bXBpY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG9seW1waWNfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpIDsgCitzdGF0aWMgdm9pZCBvbHltcGljX2FyYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG9seW1waWNfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbXR1KTsKK3N0YXRpYyB2b2lkIG9seW1waWNfc3JiX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIDsgCitzdGF0aWMgdm9pZCBvbHltcGljX2FzYl9iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSA7IAorc3RhdGljIGludCBvbHltcGljX3Byb2NfaW5mbyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkgOyAKKworc3RhdGljIGludCBfX2RldmluaXQgb2x5bXBpY19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2IDsgCisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2OworCXN0YXRpYyBpbnQgY2FyZF9ubyA9IC0xIDsKKwlpbnQgaSA7IAorCisJY2FyZF9ubysrIDsgCisKKwlpZiAoKGkgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkpIHsKKwkJcmV0dXJuIGkgOyAKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlmICgoaSA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwib2x5bXBpYyIpKSkgeyAKKwkJZ290byBvcF9kaXNhYmxlX2RldjsKKwl9CisgCisJZGV2ID0gYWxsb2NfdHJkZXYoc2l6ZW9mKHN0cnVjdCBvbHltcGljX3ByaXZhdGUpKSA7IAorCWlmICghZGV2KSB7CisJCWkgPSAtRU5PTUVNOyAKKwkJZ290byBvcF9mcmVlX2RldjsKKwl9CisKKwlvbHltcGljX3ByaXYgPSBkZXYtPnByaXYgOworCQorCXNwaW5fbG9ja19pbml0KCZvbHltcGljX3ByaXYtPm9seW1waWNfbG9jaykgOyAKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm9seW1waWNfcHJpdi0+c3JiX3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm9seW1waWNfcHJpdi0+dHJiX3dhaXQpOworI2lmIE9MWU1QSUNfREVCVUcgIAorCXByaW50ayhLRVJOX0lORk8gInBjaV9kZXZpY2U6ICVwLCBkZXY6JXAsIGRldi0+cHJpdjogJXBcbiIsIHBkZXYsIGRldiwgZGV2LT5wcml2KTsKKyNlbmRpZgorCWRldi0+aXJxPXBkZXYtPmlycTsKKwlkZXYtPmJhc2VfYWRkcj1wY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJb2x5bXBpY19wcml2LT5vbHltcGljX2NhcmRfbmFtZSA9IHBjaV9uYW1lKHBkZXYpOworCW9seW1waWNfcHJpdi0+cGRldiA9IHBkZXY7IAorCW9seW1waWNfcHJpdi0+b2x5bXBpY19tbWlvID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwxKSwyNTYpOworCW9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LDIpLDIwNDgpOworCWlmICghb2x5bXBpY19wcml2LT5vbHltcGljX21taW8gfHwgIW9seW1waWNfcHJpdi0+b2x5bXBpY19sYXApIHsKKwkJZ290byBvcF9mcmVlX2lvbWFwOworCX0KKwkJCQkKKwlpZiAoKHBrdF9idWZfc3pbY2FyZF9ub10gPCAxMDApIHx8IChwa3RfYnVmX3N6W2NhcmRfbm9dID4gMTgwMDApICkKKwkJb2x5bXBpY19wcml2LT5wa3RfYnVmX3N6ID0gUEtUX0JVRl9TWiA7IAorCWVsc2UKKwkJb2x5bXBpY19wcml2LT5wa3RfYnVmX3N6ID0gcGt0X2J1Zl9zeltjYXJkX25vXSA7IAorCisJZGV2LT5tdHUgPSBvbHltcGljX3ByaXYtPnBrdF9idWZfc3ogLSBUUl9ITEVOIDsgCisJb2x5bXBpY19wcml2LT5vbHltcGljX3Jpbmdfc3BlZWQgPSByaW5nc3BlZWRbY2FyZF9ub10gOyAKKwlvbHltcGljX3ByaXYtPm9seW1waWNfbWVzc2FnZV9sZXZlbCA9IG1lc3NhZ2VfbGV2ZWxbY2FyZF9ub10gOyAKKwlvbHltcGljX3ByaXYtPm9seW1waWNfbmV0d29ya19tb25pdG9yID0gbmV0d29ya19tb25pdG9yW2NhcmRfbm9dOworCQorCWlmICgoaSA9IG9seW1waWNfaW5pdChkZXYpKSkgeworCQlnb3RvIG9wX2ZyZWVfaW9tYXA7CisJfQkJCQkKKworCWRldi0+b3Blbj0mb2x5bXBpY19vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0PSZvbHltcGljX3htaXQ7CisJZGV2LT5jaGFuZ2VfbXR1PSZvbHltcGljX2NoYW5nZV9tdHU7CisJZGV2LT5zdG9wPSZvbHltcGljX2Nsb3NlOworCWRldi0+ZG9faW9jdGw9TlVMTDsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdD0mb2x5bXBpY19zZXRfcnhfbW9kZTsKKwlkZXYtPmdldF9zdGF0cz0mb2x5bXBpY19nZXRfc3RhdHMgOworCWRldi0+c2V0X21hY19hZGRyZXNzPSZvbHltcGljX3NldF9tYWNfYWRkcmVzcyA7ICAKKwlTRVRfTU9EVUxFX09XTkVSKGRldikgOyAKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsZGV2KSA7IAorCXJlZ2lzdGVyX25ldGRldihkZXYpIDsgCisJcHJpbnRrKCJPbHltcGljOiAlcyByZWdpc3RlcmVkIGFzOiAlc1xuIixvbHltcGljX3ByaXYtPm9seW1waWNfY2FyZF9uYW1lLGRldi0+bmFtZSk7CisJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19uZXR3b3JrX21vbml0b3IpIHsgLyogTXVzdCBnbyBhZnRlciByZWdpc3Rlcl9uZXRkZXYgYXMgd2UgbmVlZCB0aGUgZGV2aWNlIG5hbWUgKi8gCisJCWNoYXIgcHJvY19uYW1lWzIwXSA7IAorCQlzdHJjcHkocHJvY19uYW1lLCJuZXQvb2x5bXBpY18iKSA7IAorCQlzdHJjYXQocHJvY19uYW1lLGRldi0+bmFtZSkgOyAKKwkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeShwcm9jX25hbWUsMCxOVUxMLG9seW1waWNfcHJvY19pbmZvLCh2b2lkICopZGV2KSA7IAorCQlwcmludGsoIk9seW1waWM6IE5ldHdvcmsgTW9uaXRvciBpbmZvcm1hdGlvbjogL3Byb2MvJXNcbiIscHJvY19uYW1lKTsgCisJfQorCXJldHVybiAgMCA7CisKK29wX2ZyZWVfaW9tYXA6CisJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19tbWlvKQorCQlpb3VubWFwKG9seW1waWNfcHJpdi0+b2x5bXBpY19tbWlvKTsgCisJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYXApCisJCWlvdW5tYXAob2x5bXBpY19wcml2LT5vbHltcGljX2xhcCk7CisKK29wX2ZyZWVfZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsgCisKK29wX2Rpc2FibGVfZGV2OgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgb2x5bXBpY19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgCXN0cnVjdCBvbHltcGljX3ByaXZhdGUgKm9seW1waWNfcHJpdjsKKwl1OCBfX2lvbWVtICpvbHltcGljX21taW8sICppbml0X3NyYiwqYWRhcHRlcl9hZGRyOworCXVuc2lnbmVkIGxvbmcgdDsgCisJdW5zaWduZWQgaW50IHVhYV9hZGRyOworCisgICAgCW9seW1waWNfcHJpdj0oc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwlvbHltcGljX21taW89b2x5bXBpY19wcml2LT5vbHltcGljX21taW87CisKKwlwcmludGsoIiVzIFxuIiwgdmVyc2lvbik7CisJcHJpbnRrKCIlcy4gSS9PIGF0ICVoeCwgTU1JTyBhdCAlcCwgTEFQIGF0ICVwLCB1c2luZyBpcnEgJWRcbiIsIG9seW1waWNfcHJpdi0+b2x5bXBpY19jYXJkX25hbWUsICh1bnNpZ25lZCBpbnQpIGRldi0+YmFzZV9hZGRyLG9seW1waWNfcHJpdi0+b2x5bXBpY19tbWlvLCBvbHltcGljX3ByaXYtPm9seW1waWNfbGFwLCBkZXYtPmlycSk7CisKKwl3cml0ZWwocmVhZGwob2x5bXBpY19tbWlvK0JDVEwpIHwgQkNUTF9TT0ZUUkVTRVQsb2x5bXBpY19tbWlvK0JDVEwpOworCXQ9amlmZmllczsKKwl3aGlsZSgocmVhZGwob2x5bXBpY19tbWlvK0JDVEwpKSAmIEJDVExfU09GVFJFU0VUKSB7CisJCXNjaGVkdWxlKCk7CQkKKwkJaWYoamlmZmllcy10ID4gNDAqSFopIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiSUJNIFBDSSB0b2tlbnJpbmcgY2FyZCBub3QgcmVzcG9uZGluZy5cbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKworCS8qIE5lZWRlZCBmb3IgY2FyZGJ1cyAqLworCWlmKCEocmVhZGwob2x5bXBpY19tbWlvK0JDVEwpICYgQkNUTF9NT0RFX0lORElDQVRPUikpIHsKKwkJd3JpdGVsKHJlYWRsKG9seW1waWNfcHJpdi0+b2x5bXBpY19tbWlvK0ZFUk1BU0spfEZFUk1BU0tfSU5UX0JJVCwgb2x5bXBpY19tbWlvK0ZFUk1BU0spOworCX0KKwkKKyNpZiBPTFlNUElDX0RFQlVHCisJcHJpbnRrKCJCQ1RMOiAleFxuIixyZWFkbChvbHltcGljX21taW8rQkNUTCkpOworCXByaW50aygiR1BSOiAleFxuIixyZWFkdyhvbHltcGljX21taW8rR1BSKSk7CisJcHJpbnRrKCJTSVNSTUFTSzogJXhcbiIscmVhZGwob2x5bXBpY19tbWlvK1NJU1JfTUFTSykpOworI2VuZGlmCisJLyogQWFhYWhoaCwgWW91IGhhdmUgZ290IHRvIGJlIHJlYWwgY2FyZWZ1bCBzZXR0aW5nIEdQUiwgdGhlIGNhcmQKKwkgICBob2xkcyB0aGUgcHJldmlvdXMgdmFsdWVzIGZyb20gZmxhc2ggbWVtb3J5LCBpbmNsdWRpbmcgYXV0b3NlbnNlIAorICAgICAgICAgICBhbmQgcmluZyBzcGVlZCAqLworCisJd3JpdGVsKHJlYWRsKG9seW1waWNfbW1pbytCQ1RMKXxCQ1RMX01JTVJFQixvbHltcGljX21taW8rQkNUTCk7CisJCisJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19yaW5nX3NwZWVkICA9PSAwKSB7IC8qIEF1dG9zZW5zZSAqLworCQl3cml0ZXcocmVhZHcob2x5bXBpY19tbWlvK0dQUil8R1BSX0FVVE9TRU5TRSxvbHltcGljX21taW8rR1BSKTsKKwkJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19tZXNzYWdlX2xldmVsKSAKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSaW5nc3BlZWQgYXV0b3NlbnNlIG1vZGUgb25cbiIsb2x5bXBpY19wcml2LT5vbHltcGljX2NhcmRfbmFtZSk7CisJfSBlbHNlIGlmIChvbHltcGljX3ByaXYtPm9seW1waWNfcmluZ19zcGVlZCA9PSAxNikgeworCQlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX21lc3NhZ2VfbGV2ZWwpIAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRyeWluZyB0byBvcGVuIGF0IDE2IE1icHMgYXMgcmVxdWVzdGVkXG4iLCBvbHltcGljX3ByaXYtPm9seW1waWNfY2FyZF9uYW1lKTsKKwkJd3JpdGV3KEdQUl8xNk1CUFMsIG9seW1waWNfbW1pbytHUFIpOworCX0gZWxzZSBpZiAob2x5bXBpY19wcml2LT5vbHltcGljX3Jpbmdfc3BlZWQgPT0gNCkgeworCQlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX21lc3NhZ2VfbGV2ZWwpIAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRyeWluZyB0byBvcGVuIGF0IDQgTWJwcyBhcyByZXF1ZXN0ZWRcbiIsIG9seW1waWNfcHJpdi0+b2x5bXBpY19jYXJkX25hbWUpIDsgCisJCXdyaXRldygwLCBvbHltcGljX21taW8rR1BSKTsKKwl9IAorCQorCXdyaXRldyhyZWFkdyhvbHltcGljX21taW8rR1BSKXxHUFJfTkVQVFVORV9CRixvbHltcGljX21taW8rR1BSKTsKKworI2lmIE9MWU1QSUNfREVCVUcKKwlwcmludGsoIkdQUiA9ICV4XG4iLHJlYWR3KG9seW1waWNfbW1pbyArIEdQUikgKSA7IAorI2VuZGlmCisJLyogU29sbyBoYXMgYmVlbiBwYXVzZWQgdG8gbWVldCB0aGUgQ2FyZGJ1cyBwb3dlcgorCSAqIHNwZWNzIGlmIHRoZSBhZGFwdGVyIGlzIGNhcmRidXMuIENoZWNrIHRvIAorCSAqIHNlZSBpdHMgYmVlbiBwYXVzZWQgYW5kIHRoZW4gcmVzdGFydCBzb2xvLiBUaGUKKwkgKiBhZGFwdGVyIHNob3VsZCBzZXQgdGhlIHBhdXNlIGJpdCB3aXRoaW4gMSBzZWNvbmQuCisJICovCisKKwlpZighKHJlYWRsKG9seW1waWNfbW1pbytCQ1RMKSAmIEJDVExfTU9ERV9JTkRJQ0FUT1IpKSB7IAorCQl0PWppZmZpZXM7CisJCXdoaWxlICghcmVhZGwob2x5bXBpY19tbWlvK0NMS0NUTCkgJiBDTEtDVExfUEFVU0UpIHsgCisJCQlzY2hlZHVsZSgpIDsgCisJCQlpZihqaWZmaWVzLXQgPiAyKkhaKSB7IAorCQkJCXByaW50ayhLRVJOX0VSUiAiSUJNIENhcmRidXMgdG9rZW5yaW5nIGFkYXB0ZXIgbm90IHJlc3BvbnNpbmcuXG4iKSA7IAorCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCQl9CisJCXdyaXRlbChyZWFkbChvbHltcGljX21taW8rQ0xLQ1RMKSAmIH5DTEtDVExfUEFVU0UsIG9seW1waWNfbW1pbytDTEtDVEwpIDsgCisJfQorCQorCS8qIHN0YXJ0IHNvbG8gaW5pdCAqLworCXdyaXRlbCgoMTw8MTUpLG9seW1waWNfbW1pbytTSVNSX01BU0tfU1VNKTsKKworCXQ9amlmZmllczsKKwl3aGlsZSghKChyZWFkbChvbHltcGljX21taW8rU0lTUl9SUikpICYgU0lTUl9TUkJfUkVQTFkpKSB7CisJCXNjaGVkdWxlKCk7CQkKKwkJaWYoamlmZmllcy10ID4gMTUqSFopIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiSUJNIFBDSSB0b2tlbnJpbmcgY2FyZCBub3QgcmVzcG9uZGluZy5cbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisJCisJd3JpdGVsKHJlYWR3KG9seW1waWNfbW1pbytMQVBXV08pLG9seW1waWNfbW1pbytMQVBBKTsKKworI2lmIE9MWU1QSUNfREVCVUcKKwlwcmludGsoIkxBUFdXTzogJXgsIExBUEE6ICV4XG4iLHJlYWRsKG9seW1waWNfbW1pbytMQVBXV08pLCByZWFkbChvbHltcGljX21taW8rTEFQQSkpOworI2VuZGlmCisKKwlpbml0X3NyYj1vbHltcGljX3ByaXYtPm9seW1waWNfbGFwICsgKChyZWFkdyhvbHltcGljX21taW8rTEFQV1dPKSkgJiAofjB4ZjgwMCkpOworCisjaWYgT0xZTVBJQ19ERUJVRwkJCit7CisJaW50IGk7CisJcHJpbnRrKCJpbml0X3NyYiglcCk6ICIsaW5pdF9zcmIpOworCWZvcihpPTA7aTwyMDtpKyspCisJCXByaW50aygiJXggIixyZWFkYihpbml0X3NyYitpKSk7CisJcHJpbnRrKCJcbiIpOworfQorI2VuZGlmCQorCWlmKHJlYWR3KGluaXRfc3JiKzYpKSB7CisJCXByaW50ayhLRVJOX0lORk8gInRva2VucmluZyBjYXJkIGluaXRpYWxpemF0aW9uIGZhaWxlZC4gZXJyb3Jjb2RlIDogJXhcbiIscmVhZHcoaW5pdF9zcmIrNikpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX21lc3NhZ2VfbGV2ZWwpIHsKKwkJaWYgKCByZWFkYihpbml0X3NyYiArMikgJiAweDQwKSB7IAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiT2x5bXBpYzogQWRhcHRlciBpcyBGRFggY2FwYWJsZS5cbiIpIDsKKwkJfSBlbHNlIHsgCisJCQlwcmludGsoS0VSTl9JTkZPICJPbHltcGljOiBBZGFwdGVyIGNhbm5vdCBkbyBGRFguXG4iKTsKKwkJfQorCX0KKyAgCisJdWFhX2FkZHI9c3dhYjE2KHJlYWR3KGluaXRfc3JiKzgpKTsKKworI2lmIE9MWU1QSUNfREVCVUcKKwlwcmludGsoIlVBQSByZXNpZGVzIGF0ICV4XG4iLHVhYV9hZGRyKTsKKyNlbmRpZgorCisJd3JpdGVsKHVhYV9hZGRyLG9seW1waWNfbW1pbytMQVBBKTsKKwlhZGFwdGVyX2FkZHI9b2x5bXBpY19wcml2LT5vbHltcGljX2xhcCArICh1YWFfYWRkciAmICh+MHhmODAwKSk7CisKKyNpZiBPTFlNUElDX0RFQlVHCisJcHJpbnRrKCJhZGFwdGVyIGFkZHJlc3M6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJcmVhZGIoYWRhcHRlcl9hZGRyKSwgcmVhZGIoYWRhcHRlcl9hZGRyKzEpLHJlYWRiKGFkYXB0ZXJfYWRkcisyKSwKKwkJCXJlYWRiKGFkYXB0ZXJfYWRkciszKSxyZWFkYihhZGFwdGVyX2FkZHIrNCkscmVhZGIoYWRhcHRlcl9hZGRyKzUpKTsKKyNlbmRpZgorCisJbWVtY3B5X2Zyb21pbygmZGV2LT5kZXZfYWRkclswXSwgYWRhcHRlcl9hZGRyLDYpOworCisJb2x5bXBpY19wcml2LT5vbHltcGljX2FkZHJfdGFibGVfYWRkciA9IHN3YWIxNihyZWFkdyhpbml0X3NyYiArIDEyKSk7IAorCW9seW1waWNfcHJpdi0+b2x5bXBpY19wYXJtc19hZGRyID0gc3dhYjE2KHJlYWR3KGluaXRfc3JiICsgMTQpKTsgCisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IG9seW1waWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICpvbHltcGljX3ByaXY9KHN0cnVjdCBvbHltcGljX3ByaXZhdGUgKilkZXYtPnByaXY7CisJdTggX19pb21lbSAqb2x5bXBpY19tbWlvPW9seW1waWNfcHJpdi0+b2x5bXBpY19tbWlvLCppbml0X3NyYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCB0OworCWludCBpLCBvcGVuX2ZpbmlzaGVkID0gMSA7CisJdTggcmVzcCwgZXJyOworCisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCxjdXJyZW50KSA7IAorCisJb2x5bXBpY19pbml0KGRldik7CisKKwlpZihyZXF1ZXN0X2lycShkZXYtPmlycSwgJm9seW1waWNfaW50ZXJydXB0LCBTQV9TSElSUSAsICJvbHltcGljIiwgZGV2KSkgeworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKyNpZiBPTFlNUElDX0RFQlVHCisJcHJpbnRrKCJCTUNUTDogJXhcbiIscmVhZGwob2x5bXBpY19tbWlvK0JNQ1RMX1NVTSkpOworCXByaW50aygicGVuZGluZyBpbnRzOiAleFxuIixyZWFkbChvbHltcGljX21taW8rU0lTUl9SUikpOworI2VuZGlmCisKKwl3cml0ZWwoU0lTUl9NSSxvbHltcGljX21taW8rU0lTUl9NQVNLX1NVTSk7CisKKwl3cml0ZWwoU0lTUl9NSSB8IFNJU1JfU1JCX1JFUExZLCBvbHltcGljX21taW8rU0lTUl9NQVNLKTsgLyogbW9yZSBpbnRzIGxhdGVyLCBkb2Vzbid0IHN0b3AgYXJiIGNtZCBpbnRlcnJ1cHQgKi8KKworCXdyaXRlbChMSVNSX0xJRSxvbHltcGljX21taW8rTElTUik7IC8qIG1vcmUgaW50cyBsYXRlciAqLworCisJLyogYWRhcHRlciBpcyBjbG9zZWQsIHNvIFNSQiBpcyBwb2ludGVkIHRvIGJ5IExBUFdXTyAqLworCisJd3JpdGVsKHJlYWR3KG9seW1waWNfbW1pbytMQVBXV08pLG9seW1waWNfbW1pbytMQVBBKTsKKwlpbml0X3NyYj1vbHltcGljX3ByaXYtPm9seW1waWNfbGFwICsgKChyZWFkdyhvbHltcGljX21taW8rTEFQV1dPKSkgJiAofjB4ZjgwMCkpOworCQorI2lmIE9MWU1QSUNfREVCVUcKKwlwcmludGsoIkxBUFdXTzogJXgsIExBUEE6ICV4XG4iLHJlYWR3KG9seW1waWNfbW1pbytMQVBXV08pLCByZWFkbChvbHltcGljX21taW8rTEFQQSkpOworCXByaW50aygiU0lTUiBNYXNrID0gJTA0eFxuIiwgcmVhZGwob2x5bXBpY19tbWlvK1NJU1JfTUFTSykpOworCXByaW50aygiQmVmb3JlIHRoZSBvcGVuIGNvbW1hbmQgXG4iKTsKKyNlbmRpZgkKKwlkbyB7CisJCW1lbXNldF9pbyhpbml0X3NyYiwwLFNSQl9DT01NQU5EX1NJWkUpOworCisJCXdyaXRlYihTUkJfT1BFTl9BREFQVEVSLGluaXRfc3JiKSA7IAkvKiBvcGVuICovCisJCXdyaXRlYihPTFlNUElDX0NMRUFSX1JFVF9DT0RFLGluaXRfc3JiKzIpOworCisJCS8qIElmIE5ldHdvcmsgTW9uaXRvciwgaW5zdHJ1Y3QgY2FyZCB0byBjb3B5IE1BQyBmcmFtZXMgdGhyb3VnaCB0aGUgQVJCICovCisJCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbmV0d29ya19tb25pdG9yKSAKKwkJCXdyaXRldyhzd2FiMTYoT1BFTl9BREFQVEVSX0VOQUJMRV9GRFggfCBPUEVOX0FEQVBURVJfUEFTU19BRENfTUFDIHwgT1BFTl9BREFQVEVSX1BBU1NfQVRUX01BQyB8IE9QRU5fQURBUFRFUl9QQVNTX0JFQUNPTiksIGluaXRfc3JiKzgpOworCQllbHNlCisJCQl3cml0ZXcoc3dhYjE2KE9QRU5fQURBUFRFUl9FTkFCTEVfRkRYKSwgaW5pdF9zcmIrOCk7CisJCisJCS8qIFRlc3QgT1Igb2YgZmlyc3QgMyBieXRlcyBhcyBpdHMgdG90YWxseSBwb3NzaWJsZSBmb3IgCisJCSAqIHNvbWVvbmUgdG8gc2V0IHRoZSBmaXJzdCAyIGJ5dGVzIHRvIGJlIHplcm8sIGFsdGhvdWdoIHRoaXMgCisJCSAqIGlzIGFuIGVycm9yLCB0aGUgZmlyc3QgYnl0ZSBtdXN0IGhhdmUgYml0IDYgc2V0IHRvIDEgICovCisKKwkJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbMF0gfCBvbHltcGljX3ByaXYtPm9seW1waWNfbGFhWzFdIHwgb2x5bXBpY19wcml2LT5vbHltcGljX2xhYVsyXSkgeworCQkJd3JpdGViKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbMF0saW5pdF9zcmIrMTIpOworCQkJd3JpdGViKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbMV0saW5pdF9zcmIrMTMpOworCQkJd3JpdGViKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbMl0saW5pdF9zcmIrMTQpOworCQkJd3JpdGViKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbM10saW5pdF9zcmIrMTUpOworCQkJd3JpdGViKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbNF0saW5pdF9zcmIrMTYpOworCQkJd3JpdGViKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbNV0saW5pdF9zcmIrMTcpOworCQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsb2x5bXBpY19wcml2LT5vbHltcGljX2xhYSxkZXYtPmFkZHJfbGVuKSA7ICAKKwkJfSAJCisJCXdyaXRlYigxLGluaXRfc3JiKzMwKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmb2x5bXBpY19wcml2LT5vbHltcGljX2xvY2ssZmxhZ3MpOwkKKwkJb2x5bXBpY19wcml2LT5zcmJfcXVldWVkPTE7CisKKwkJd3JpdGVsKExJU1JfU1JCX0NNRCxvbHltcGljX21taW8rTElTUl9TVU0pOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvbHltcGljX3ByaXYtPm9seW1waWNfbG9jayxmbGFncyk7CisKKwkJdCA9IGppZmZpZXMgOyAKKwkKKwkJYWRkX3dhaXRfcXVldWUoJm9seW1waWNfcHJpdi0+c3JiX3dhaXQsJndhaXQpIDsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKSA7IAorIAorIAkJd2hpbGUob2x5bXBpY19wcml2LT5zcmJfcXVldWVkKSB7ICAgICAgICAKKwkJCXNjaGVkdWxlKCkgOyAKKyAgICAgICAgCQlpZihzaWduYWxfcGVuZGluZyhjdXJyZW50KSkJeyAgICAgICAgICAgIAorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBTaWduYWwgcmVjZWl2ZWQgaW4gb3Blbi5cbiIsCisgICAgICAgICAgICAgICAgCQkJZGV2LT5uYW1lKTsKKyAgICAgICAgICAgIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNJU1I9JXggTElTUj0leFxuIiwKKyAgICAgICAgICAgICAgICAJCQlyZWFkbChvbHltcGljX21taW8rU0lTUiksCisgICAgICAgICAgICAgICAgCQkJcmVhZGwob2x5bXBpY19tbWlvK0xJU1IpKTsKKyAgICAgICAgICAgIAkJCW9seW1waWNfcHJpdi0+c3JiX3F1ZXVlZD0wOworICAgICAgICAgICAgCQkJYnJlYWs7CisgICAgICAgIAkJfQorCQkJaWYgKChqaWZmaWVzLXQpID4gMTAqSFopIHsgCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFNSQiB0aW1lZCBvdXQuIFxuIixkZXYtPm5hbWUpIDsgCisJCQkJb2x5bXBpY19wcml2LT5zcmJfcXVldWVkPTA7CisJCQkJYnJlYWsgOyAKKwkJCX0gCisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpIDsgCisgICAgCQl9CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZvbHltcGljX3ByaXYtPnNyYl93YWl0LCZ3YWl0KSA7IAorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpIDsgCisJCW9seW1waWNfcHJpdi0+c3JiX3F1ZXVlZCA9IDAgOyAKKyNpZiBPTFlNUElDX0RFQlVHCisJCXByaW50aygiaW5pdF9zcmIoJXApOiAiLGluaXRfc3JiKTsKKwkJZm9yKGk9MDtpPDIwO2krKykKKwkJCXByaW50aygiJTAyeCAiLHJlYWRiKGluaXRfc3JiK2kpKTsKKwkJcHJpbnRrKCJcbiIpOworI2VuZGlmCisJCQorCQkvKiBJZiB3ZSBnZXQgdGhlIHNhbWUgcmV0dXJuIHJlc3BvbnNlIGFzIHdlIHNldCwgdGhlIGludGVycnVwdCB3YXNuJ3QgcmFpc2VkIGFuZCB0aGUgb3BlbgorICAgICAgICAgICAgICAgICAqIHRpbWVkIG91dC4KKwkJICovCisKKwkJc3dpdGNoIChyZXNwID0gcmVhZGIoaW5pdF9zcmIrMikpIHsKKwkJY2FzZSBPTFlNUElDX0NMRUFSX1JFVF9DT0RFOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgT3BlbiB0aW1lIG91dCBvciBlcnJvci5cbiIsIGRldi0+bmFtZSkgOyAKKwkJCWdvdG8gb3V0OworCQljYXNlIDA6CisJCQlvcGVuX2ZpbmlzaGVkID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDc6CisJCQlpZiAoIW9seW1waWNfcHJpdi0+b2x5bXBpY19yaW5nX3NwZWVkICYmIG9wZW5fZmluaXNoZWQpIHsgLyogQXV0b3NlbnNlICwgZmlyc3QgdGltZSBhcm91bmQgKi8KKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmV0cnlpbmcgYXQgZGlmZmVyZW50IHJpbmcgc3BlZWQgXG4iLCBkZXYtPm5hbWUpOyAKKwkJCQlvcGVuX2ZpbmlzaGVkID0gMCA7ICAKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZXJyID0gcmVhZGIoaW5pdF9zcmIrNyk7CisKKwkJCWlmICghb2x5bXBpY19wcml2LT5vbHltcGljX3Jpbmdfc3BlZWQgJiYgKChlcnIgJiAweDBmKSA9PSAweDBkKSkgeyAKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHJpZWQgdG8gYXV0b3NlbnNlIHJpbmcgc3BlZWQgd2l0aCBubyBtb25pdG9ycyBwcmVzZW50XG4iLGRldi0+bmFtZSk7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFBsZWFzZSB0cnkgYWdhaW4gd2l0aCBhIHNwZWNpZmllZCByaW5nIHNwZWVkIFxuIixkZXYtPm5hbWUpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogJXMgLSAlc1xuIiwgZGV2LT5uYW1lLAorCQkJCQlvcGVuX21hal9lcnJvclsoZXJyICYgMHhmMCkgPj4gNF0sCisJCQkJCW9wZW5fbWluX2Vycm9yWyhlcnIgJiAweDBmKV0pOworCQkJfQorCQkJZ290byBvdXQ7CisKKwkJY2FzZSAweDMyOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEludmFsaWQgTEFBOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCQlkZXYtPm5hbWUsIAorCQkJCW9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbMF0sCisJCQkJb2x5bXBpY19wcml2LT5vbHltcGljX2xhYVsxXSwKKwkJCQlvbHltcGljX3ByaXYtPm9seW1waWNfbGFhWzJdLAorCQkJCW9seW1waWNfcHJpdi0+b2x5bXBpY19sYWFbM10sCisJCQkJb2x5bXBpY19wcml2LT5vbHltcGljX2xhYVs0XSwKKwkJCQlvbHltcGljX3ByaXYtPm9seW1waWNfbGFhWzVdKSA7IAorCQkJZ290byBvdXQ7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBCYWQgT1BFTiByZXNwb25zZTogJXhcbiIsIGRldi0+bmFtZSwgcmVzcCk7CisJCQlnb3RvIG91dDsKKworCQl9CisJfSB3aGlsZSAoIShvcGVuX2ZpbmlzaGVkKSkgOyAvKiBXaWxsIG9ubHkgbG9vcCBpZiByaW5nIHNwZWVkIG1pc21hdGNoIHJlLW9wZW4gYXR0ZW1wdGVkICYmIGF1dG9zZW5zZSBpcyBvbiAqLwkKKworCWlmIChyZWFkYihpbml0X3NyYisxOCkgJiAoMTw8MykpIAorCQlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX21lc3NhZ2VfbGV2ZWwpIAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE9wZW5lZCBpbiBGRFggTW9kZVxuIixkZXYtPm5hbWUpOworCisJaWYgKHJlYWRiKGluaXRfc3JiKzE4KSAmICgxPDwxKSkKKwkJb2x5bXBpY19wcml2LT5vbHltcGljX3Jpbmdfc3BlZWQgPSAxMDAgOyAKKwllbHNlIGlmIChyZWFkYihpbml0X3NyYisxOCkgJiAxKQorCQlvbHltcGljX3ByaXYtPm9seW1waWNfcmluZ19zcGVlZCA9IDE2IDsgCisJZWxzZQorCQlvbHltcGljX3ByaXYtPm9seW1waWNfcmluZ19zcGVlZCA9IDQgOyAKKworCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbWVzc2FnZV9sZXZlbCkgCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBPcGVuZWQgaW4gJWQgTWJwcyBtb2RlXG4iLGRldi0+bmFtZSwgb2x5bXBpY19wcml2LT5vbHltcGljX3Jpbmdfc3BlZWQpOworCisJb2x5bXBpY19wcml2LT5hc2IgPSBzd2FiMTYocmVhZHcoaW5pdF9zcmIrOCkpOworCW9seW1waWNfcHJpdi0+c3JiID0gc3dhYjE2KHJlYWR3KGluaXRfc3JiKzEwKSk7CisJb2x5bXBpY19wcml2LT5hcmIgPSBzd2FiMTYocmVhZHcoaW5pdF9zcmIrMTIpKTsKKwlvbHltcGljX3ByaXYtPnRyYiA9IHN3YWIxNihyZWFkdyhpbml0X3NyYisxNikpOworCisJb2x5bXBpY19wcml2LT5vbHltcGljX3JlY2VpdmVfb3B0aW9ucyA9IDB4MDEgOyAKKwlvbHltcGljX3ByaXYtPm9seW1waWNfY29weV9hbGxfb3B0aW9ucyA9IDAgOyAKKwkKKwkvKiBzZXR1cCByeCByaW5nICovCisJCisJd3JpdGVsKCgzPDwxNiksb2x5bXBpY19tbWlvK0JNQ1RMX1JXTSk7IC8qIEVuc3VyZSBlbmQgb2YgZnJhbWUgZ2VuZXJhdGVkIGludGVycnVwdHMgKi8gCisKKwl3cml0ZWwoQk1DVExfUlhfRElTfDMsb2x5bXBpY19tbWlvK0JNQ1RMX1JXTSk7IC8qIFllcywgdGhpcyB0aGUgZW5hYmxlcyBSWCBjaGFubmVsICovCisKKwlmb3IoaT0wO2k8T0xZTVBJQ19SWF9SSU5HX1NJWkU7aSsrKSB7CisKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCisJCXNrYj1kZXZfYWxsb2Nfc2tiKG9seW1waWNfcHJpdi0+cGt0X2J1Zl9zeik7CisJCWlmKHNrYiA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJc2tiLT5kZXYgPSBkZXY7CisKKwkJb2x5bXBpY19wcml2LT5vbHltcGljX3J4X3JpbmdbaV0uYnVmZmVyID0gY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUob2x5bXBpY19wcml2LT5wZGV2LCAKKwkJCQkJCQkgIHNrYi0+ZGF0YSxvbHltcGljX3ByaXYtPnBrdF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSkpIDsgCisJCW9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9yaW5nW2ldLnJlc19sZW5ndGggPSBjcHVfdG9fbGUzMihvbHltcGljX3ByaXYtPnBrdF9idWZfc3opOyAKKwkJb2x5bXBpY19wcml2LT5yeF9yaW5nX3NrYltpXT1za2I7CisJfQorCisJaWYgKGk9PTApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHJ4IGJ1ZmZlcnMuIEFkYXB0ZXIgZGlzYWJsZWRcbiIsZGV2LT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJb2x5bXBpY19wcml2LT5yeF9yaW5nX2RtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUob2x5bXBpY19wcml2LT5wZGV2LG9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9yaW5nLCAKKwkJCQkJIHNpemVvZihzdHJ1Y3Qgb2x5bXBpY19yeF9kZXNjKSAqIE9MWU1QSUNfUlhfUklOR19TSVpFLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwl3cml0ZWwob2x5bXBpY19wcml2LT5yeF9yaW5nX2RtYV9hZGRyLCBvbHltcGljX21taW8rUlhERVNDUSk7CisJd3JpdGVsKG9seW1waWNfcHJpdi0+cnhfcmluZ19kbWFfYWRkciwgb2x5bXBpY19tbWlvK1JYQ0RBKTsKKwl3cml0ZXcoaSwgb2x5bXBpY19tbWlvK1JYREVTQ1FDTlQpOworCQkKKwlvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19yaW5nX2RtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUob2x5bXBpY19wcml2LT5wZGV2LCBvbHltcGljX3ByaXYtPm9seW1waWNfcnhfc3RhdHVzX3JpbmcsIAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBvbHltcGljX3J4X3N0YXR1cykgKiBPTFlNUElDX1JYX1JJTkdfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwl3cml0ZWwob2x5bXBpY19wcml2LT5yeF9zdGF0dXNfcmluZ19kbWFfYWRkciwgb2x5bXBpY19tbWlvK1JYU1RBVFEpOworCXdyaXRlbChvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19yaW5nX2RtYV9hZGRyLCBvbHltcGljX21taW8rUlhDU0EpOworCQorIAlvbHltcGljX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCA9IE9MWU1QSUNfUlhfUklOR19TSVpFIC0gMTsJLyogbGFzdCBwcm9jZXNzZWQgcnggc3RhdHVzICovCisJb2x5bXBpY19wcml2LT5yeF9zdGF0dXNfbGFzdF9yZWNlaXZlZCA9IE9MWU1QSUNfUlhfUklOR19TSVpFIC0gMTsgIAorCisJd3JpdGV3KGksIG9seW1waWNfbW1pbytSWFNUQVRRQ05UKTsKKworI2lmIE9MWU1QSUNfREVCVUcgCisJcHJpbnRrKCIjIG9mIHJ4IGJ1ZmZlcnM6ICVkLCBSWEVOUTogJXhcbiIsaSwgcmVhZHcob2x5bXBpY19tbWlvK1JYRU5RKSk7CisJcHJpbnRrKCJSWENTQTogJXgsIHJ4X3N0YXR1c19yaW5nWzBdOiAlcFxuIixyZWFkbChvbHltcGljX21taW8rUlhDU0EpLCZvbHltcGljX3ByaXYtPm9seW1waWNfcnhfc3RhdHVzX3JpbmdbMF0pOworCXByaW50aygiIHN0YXRfcmluZ1sxXTogJXAsIHN0YXRfcmluZ1syXTogJXAsIHN0YXRfcmluZ1szXTogJXBcbiIsICYob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3N0YXR1c19yaW5nWzFdKSwgJihvbHltcGljX3ByaXYtPm9seW1waWNfcnhfc3RhdHVzX3JpbmdbMl0pLCAmKG9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9zdGF0dXNfcmluZ1szXSkgKTsKKwlwcmludGsoIiBzdGF0X3JpbmdbNF06ICVwLCBzdGF0X3JpbmdbNV06ICVwLCBzdGF0X3JpbmdbNl06ICVwXG4iLCAmKG9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9zdGF0dXNfcmluZ1s0XSksICYob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3N0YXR1c19yaW5nWzVdKSwgJihvbHltcGljX3ByaXYtPm9seW1waWNfcnhfc3RhdHVzX3JpbmdbNl0pICk7CisJcHJpbnRrKCIgc3RhdF9yaW5nWzddOiAlcFxuIiwgJihvbHltcGljX3ByaXYtPm9seW1waWNfcnhfc3RhdHVzX3JpbmdbN10pICApOworCisJcHJpbnRrKCJSWENEQTogJXgsIHJ4X3JpbmdbMF06ICVwXG4iLHJlYWRsKG9seW1waWNfbW1pbytSWENEQSksJm9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9yaW5nWzBdKTsKKwlwcmludGsoIlJ4X3JpbmdfZG1hX2FkZHIgPSAlMDh4LCByeF9zdGF0dXNfZG1hX2FkZHIgPSAlMDh4XG4iLAorCQlvbHltcGljX3ByaXYtPnJ4X3JpbmdfZG1hX2FkZHIsb2x5bXBpY19wcml2LT5yeF9zdGF0dXNfcmluZ19kbWFfYWRkcikgOyAKKyNlbmRpZgorCisJd3JpdGV3KCgoKHJlYWR3KG9seW1waWNfbW1pbytSWEVOUSkpICYgMHg4MDAwKSBeIDB4ODAwMCkgfCBpLG9seW1waWNfbW1pbytSWEVOUSk7CisKKyNpZiBPTFlNUElDX0RFQlVHIAorCXByaW50aygiIyBvZiByeCBidWZmZXJzOiAlZCwgUlhFTlE6ICV4XG4iLGksIHJlYWR3KG9seW1waWNfbW1pbytSWEVOUSkpOworCXByaW50aygiUlhDU0E6ICV4LCByeF9yaW5nWzBdOiAlcFxuIixyZWFkbChvbHltcGljX21taW8rUlhDU0EpLCZvbHltcGljX3ByaXYtPm9seW1waWNfcnhfc3RhdHVzX3JpbmdbMF0pOworCXByaW50aygiUlhDREE6ICV4LCByeF9yaW5nWzBdOiAlcFxuIixyZWFkbChvbHltcGljX21taW8rUlhDREEpLCZvbHltcGljX3ByaXYtPm9seW1waWNfcnhfcmluZ1swXSk7CisjZW5kaWYgCisKKwl3cml0ZWwoU0lTUl9SWF9TVEFUVVMgfCBTSVNSX1JYX05PQlVGLG9seW1waWNfbW1pbytTSVNSX01BU0tfU1VNKTsKKworCS8qIHNldHVwIHR4IHJpbmcgKi8KKworCXdyaXRlbChCTUNUTF9UWDFfRElTLG9seW1waWNfbW1pbytCTUNUTF9SV00pOyAvKiBZZXMsIHRoaXMgZW5hYmxlcyBUWCBjaGFubmVsIDEgKi8KKwlmb3IoaT0wO2k8T0xZTVBJQ19UWF9SSU5HX1NJWkU7aSsrKSAKKwkJb2x5bXBpY19wcml2LT5vbHltcGljX3R4X3JpbmdbaV0uYnVmZmVyPTB4ZGVhZGJlZWY7CisKKwlvbHltcGljX3ByaXYtPmZyZWVfdHhfcmluZ19lbnRyaWVzPU9MWU1QSUNfVFhfUklOR19TSVpFOworCW9seW1waWNfcHJpdi0+dHhfcmluZ19kbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKG9seW1waWNfcHJpdi0+cGRldixvbHltcGljX3ByaXYtPm9seW1waWNfdHhfcmluZywKKwkJCQkJIHNpemVvZihzdHJ1Y3Qgb2x5bXBpY190eF9kZXNjKSAqIE9MWU1QSUNfVFhfUklOR19TSVpFLFBDSV9ETUFfVE9ERVZJQ0UpIDsgCisJd3JpdGVsKG9seW1waWNfcHJpdi0+dHhfcmluZ19kbWFfYWRkciwgb2x5bXBpY19tbWlvK1RYREVTQ1FfMSk7CisJd3JpdGVsKG9seW1waWNfcHJpdi0+dHhfcmluZ19kbWFfYWRkciwgb2x5bXBpY19tbWlvK1RYQ0RBXzEpOworCXdyaXRldyhPTFlNUElDX1RYX1JJTkdfU0laRSwgb2x5bXBpY19tbWlvK1RYREVTQ1FDTlRfMSk7CisJCisJb2x5bXBpY19wcml2LT50eF9zdGF0dXNfcmluZ19kbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKG9seW1waWNfcHJpdi0+cGRldiwgb2x5bXBpY19wcml2LT5vbHltcGljX3R4X3N0YXR1c19yaW5nLAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBvbHltcGljX3R4X3N0YXR1cykgKiBPTFlNUElDX1RYX1JJTkdfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwl3cml0ZWwob2x5bXBpY19wcml2LT50eF9zdGF0dXNfcmluZ19kbWFfYWRkcixvbHltcGljX21taW8rVFhTVEFUUV8xKTsKKwl3cml0ZWwob2x5bXBpY19wcml2LT50eF9zdGF0dXNfcmluZ19kbWFfYWRkcixvbHltcGljX21taW8rVFhDU0FfMSk7CisJd3JpdGV3KE9MWU1QSUNfVFhfUklOR19TSVpFLG9seW1waWNfbW1pbytUWFNUQVRRQ05UXzEpOworCQkKKwlvbHltcGljX3ByaXYtPnR4X3JpbmdfZnJlZT0wOyAvKiBuZXh0IGVudHJ5IGluIHR4IHJpbmcgdG8gdXNlICovCisJb2x5bXBpY19wcml2LT50eF9yaW5nX2xhc3Rfc3RhdHVzPU9MWU1QSUNfVFhfUklOR19TSVpFLTE7IC8qIGxhc3QgcHJvY2Vzc2VkIHR4IHN0YXR1cyAqLworCisJd3JpdGVsKDB4ZmZmZmZmZmYsIG9seW1waWNfbW1pbytFSVNSX1JXTSkgOyAvKiBjbGVhbiB0aGUgZWlzciAqLworCXdyaXRlbCgwLG9seW1waWNfbW1pbytFSVNSKSA7IAorCXdyaXRlbChFSVNSX01BU0tfT1BUSU9OUyxvbHltcGljX21taW8rRUlTUl9NQVNLKSA7IC8qIGVuYWJsZXMgbW9zdCBvZiB0aGUgVFggZXJyb3IgaW50ZXJydXB0cyAqLworCXdyaXRlbChTSVNSX1RYMV9FT0YgfCBTSVNSX0FEQVBURVJfQ0hFQ0sgfCBTSVNSX0FSQl9DTUQgfCBTSVNSX1RSQl9SRVBMWSB8IFNJU1JfQVNCX0ZSRUUgfCBTSVNSX0VSUixvbHltcGljX21taW8rU0lTUl9NQVNLX1NVTSk7CisKKyNpZiBPTFlNUElDX0RFQlVHIAorCXByaW50aygiQk1DVEw6ICV4XG4iLHJlYWRsKG9seW1waWNfbW1pbytCTUNUTF9TVU0pKTsKKwlwcmludGsoIlNJU1IgTUFTSzogJXhcbiIscmVhZGwob2x5bXBpY19tbWlvK1NJU1JfTUFTSykpOworI2VuZGlmCisKKwlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX25ldHdvcmtfbW9uaXRvcikgeyAKKwkJdTggX19pb21lbSAqb2F0IDsgCisJCXU4IF9faW9tZW0gKm9wdCA7IAorCQlvYXQgPSAob2x5bXBpY19wcml2LT5vbHltcGljX2xhcCArIG9seW1waWNfcHJpdi0+b2x5bXBpY19hZGRyX3RhYmxlX2FkZHIpIDsgCisJCW9wdCA9IChvbHltcGljX3ByaXYtPm9seW1waWNfbGFwICsgb2x5bXBpY19wcml2LT5vbHltcGljX3Bhcm1zX2FkZHIpIDsgCisKKwkJcHJpbnRrKCIlczogTm9kZSBBZGRyZXNzOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIixkZXYtPm5hbWUsIAorCQkJcmVhZGIob2F0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSxub2RlX2FkZHIpKSwgCisJCQlyZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLG5vZGVfYWRkcikrMSksCisJCQlyZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLG5vZGVfYWRkcikrMiksCisJCQlyZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLG5vZGVfYWRkcikrMyksCisJCQlyZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLG5vZGVfYWRkcikrNCksCisJCQlyZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLG5vZGVfYWRkcikrNSkpOworCQlwcmludGsoIiVzOiBGdW5jdGlvbmFsIEFkZHJlc3M6ICUwMng6JTAyeDolMDJ4OiUwMnhcbiIsZGV2LT5uYW1lLCAKKwkJCXJlYWRiKG9hdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19hZGFwdGVyX2FkZHJfdGFibGUsZnVuY19hZGRyKSksIAorCQkJcmVhZGIob2F0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSxmdW5jX2FkZHIpKzEpLAorCQkJcmVhZGIob2F0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSxmdW5jX2FkZHIpKzIpLAorCQkJcmVhZGIob2F0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSxmdW5jX2FkZHIpKzMpKTsKKwkJcHJpbnRrKCIlczogTkFVTiBBZGRyZXNzOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIixkZXYtPm5hbWUsIAorCQkJcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHVwX25vZGVfYWRkcikpLAorCQkJcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHVwX25vZGVfYWRkcikrMSksCisJCQlyZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgdXBfbm9kZV9hZGRyKSsyKSwKKwkJCXJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCB1cF9ub2RlX2FkZHIpKzMpLAorCQkJcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHVwX25vZGVfYWRkcikrNCksCisJCQlyZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgdXBfbm9kZV9hZGRyKSs1KSk7CisJfQorCQorCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7CisKK291dDoKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZXR1cm4gLUVJTzsKK30JCisKKy8qCisgKglXaGVuIHdlIGVudGVyIHRoZSByeCByb3V0aW5lIHdlIGRvIG5vdCBrbm93IGhvdyBtYW55IGZyYW1lcyBoYXZlIGJlZW4gCisgKglxdWV1ZWQgb24gdGhlIHJ4IGNoYW5uZWwuICBUaGVyZWZvcmUgd2Ugc3RhcnQgYXQgdGhlIG5leHQgcnggc3RhdHVzCisgKglwb3NpdGlvbiBhbmQgdHJhdmVsIGFyb3VuZCB0aGUgcmVjZWl2ZSByaW5nIHVudGlsIHdlIGhhdmUgY29tcGxldGVkCisgKglhbGwgdGhlIGZyYW1lcy4KKyAqCisgKglUaGlzIG1lYW5zIHRoYXQgd2UgbWF5IHByb2Nlc3MgdGhlIGZyYW1lIGJlZm9yZSB3ZSByZWNlaXZlIHRoZSBlbmQKKyAqCW9mIGZyYW1lIGludGVycnVwdC4gVGhpcyBpcyB3aHkgd2UgYWx3YXlzIHRlc3QgdGhlIHN0YXR1cyBpbnN0ZWFkCisgKglvZiBibGluZGx5IHByb2Nlc3NpbmcgdGhlIG5leHQgZnJhbWUuCisgKgorICoJV2UgYWxzbyByZW1vdmUgdGhlIGxhc3QgNCBieXRlcyBmcm9tIHRoZSBwYWNrZXQgYXMgd2VsbCwgdGhlc2UgYXJlCisgKglqdXN0IHRva2VuIHJpbmcgdHJhaWxlciBpbmZvIGFuZCB1cHNldCBwcm90b2NvbHMgdGhhdCBkb24ndCBjaGVjayAKKyAqCXRoZWlyIG93biBsZW5ndGgsIGkuZS4gU05BLiAKKyAqCQorICovCitzdGF0aWMgdm9pZCBvbHltcGljX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2PShzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICopZGV2LT5wcml2OworCXU4IF9faW9tZW0gKm9seW1waWNfbW1pbz1vbHltcGljX3ByaXYtPm9seW1waWNfbW1pbzsKKwlzdHJ1Y3Qgb2x5bXBpY19yeF9zdGF0dXMgKnJ4X3N0YXR1czsKKwlzdHJ1Y3Qgb2x5bXBpY19yeF9kZXNjICpyeF9kZXNjIDsgCisJaW50IHJ4X3JpbmdfbGFzdF9yZWNlaXZlZCxsZW5ndGgsIGJ1ZmZlcl9jbnQsIGNweV9sZW5ndGgsIGZyYWdfbGVuOworCXN0cnVjdCBza19idWZmICpza2IsICpza2IyOworCWludCBpOworCisJcnhfc3RhdHVzPSYob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3N0YXR1c19yaW5nWyhvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19sYXN0X3JlY2VpdmVkICsgMSkgJiAoT0xZTVBJQ19SWF9SSU5HX1NJWkUgLSAxKV0pIDsgCisgCisJd2hpbGUgKHJ4X3N0YXR1cy0+c3RhdHVzX2J1ZmZlcmNudCkgeyAKKyAgICAgICAgICAgICAgICB1MzIgbF9zdGF0dXNfYnVmZmVyY250OworCisJCW9seW1waWNfcHJpdi0+cnhfc3RhdHVzX2xhc3RfcmVjZWl2ZWQrKyA7CisJCW9seW1waWNfcHJpdi0+cnhfc3RhdHVzX2xhc3RfcmVjZWl2ZWQgJj0gKE9MWU1QSUNfUlhfUklOR19TSVpFIC0xKTsKKyNpZiBPTFlNUElDX0RFQlVHCisJCXByaW50aygicnggc3RhdHVzOiAleCByeCBsZW46ICV4IFxuIiwgbGUzMl90b19jcHUocnhfc3RhdHVzLT5zdGF0dXNfYnVmZmVyY250KSwgbGUzMl90b19jcHUocnhfc3RhdHVzLT5mcmFnbWVudGNudF9mcmFtZWxlbikpOworI2VuZGlmCisJCWxlbmd0aCA9IGxlMzJfdG9fY3B1KHJ4X3N0YXR1cy0+ZnJhZ21lbnRjbnRfZnJhbWVsZW4pICYgMHhmZmZmOworCQlidWZmZXJfY250ID0gbGUzMl90b19jcHUocnhfc3RhdHVzLT5zdGF0dXNfYnVmZmVyY250KSAmIDB4ZmZmZjsgCisJCWkgPSBidWZmZXJfY250IDsgLyogTmVlZCBidWZmZXJfY250IGxhdGVyIGZvciByeGVucSB1cGRhdGUgKi8gCisJCWZyYWdfbGVuID0gbGUzMl90b19jcHUocnhfc3RhdHVzLT5mcmFnbWVudGNudF9mcmFtZWxlbikgPj4gMTY7IAorCisjaWYgT0xZTVBJQ19ERUJVRyAKKwkJcHJpbnRrKCJsZW5ndGg6ICV4LCBmcmFnX2xlbjogJXgsIGJ1ZmZlcl9jbnQ6ICV4XG4iLCBsZW5ndGgsIGZyYWdfbGVuLCBidWZmZXJfY250KTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGxfc3RhdHVzX2J1ZmZlcmNudCA9IGxlMzJfdG9fY3B1KHJ4X3N0YXR1cy0+c3RhdHVzX2J1ZmZlcmNudCk7CisJCWlmKGxfc3RhdHVzX2J1ZmZlcmNudCAmIDB4QzAwMDAwMDApIHsKKwkJCWlmIChsX3N0YXR1c19idWZmZXJjbnQgJiAweDNCMDAwMDAwKSB7CisJCQkJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19tZXNzYWdlX2xldmVsKSB7CisJCQkJCWlmIChsX3N0YXR1c19idWZmZXJjbnQgJiAoMTw8MjkpKSAgLyogUnggRnJhbWUgVHJ1bmNhdGVkICovCisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUnggRnJhbWUgVHJ1bmNhdGVkIFxuIixkZXYtPm5hbWUpOworCQkJCQlpZiAobF9zdGF0dXNfYnVmZmVyY250ICYgKDE8PDI4KSkgLypSeCByZWNlaXZlIG92ZXJydW4gKi8KKwkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSeCBGcmFtZSBSZWNlaXZlIG92ZXJydW4gXG4iLGRldi0+bmFtZSk7CisJCQkJCWlmIChsX3N0YXR1c19idWZmZXJjbnQgJiAoMTw8MjcpKSAvKiBObyByZWNlaXZlIGJ1ZmZlcnMgKi8KKwkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBObyByZWNlaXZlIGJ1ZmZlcnMgXG4iLGRldi0+bmFtZSk7CisJCQkJCWlmIChsX3N0YXR1c19idWZmZXJjbnQgJiAoMTw8MjUpKSAvKiBSZWNlaXZlIGZyYW1lIGVycm9yIGRldGVjdCAqLworCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlY2VpdmUgZnJhbWUgZXJyb3IgZGV0ZWN0IFxuIixkZXYtPm5hbWUpOworCQkJCQlpZiAobF9zdGF0dXNfYnVmZmVyY250ICYgKDE8PDI0KSkgLyogUmVjZWl2ZWQgRXJyb3IgRGV0ZWN0ICovCisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZWQgRXJyb3IgRGV0ZWN0IFxuIixkZXYtPm5hbWUpOworCQkJCX0gCisJCQkJb2x5bXBpY19wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQgKz0gaSA7IAorCQkJCW9seW1waWNfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkICY9IChPTFlNUElDX1JYX1JJTkdfU0laRSAtMSkgOyAKKwkJCQlvbHltcGljX3ByaXYtPm9seW1waWNfc3RhdHMucnhfZXJyb3JzKys7CSAKKwkJCX0gZWxzZSB7CQorCQkJCisJCQkJaWYgKGJ1ZmZlcl9jbnQgPT0gMSkgeworCQkJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKG1heF90KGludCwgb2x5bXBpY19wcml2LT5wa3RfYnVmX3N6LGxlbmd0aCkpIDsgCisJCQkJfSBlbHNlIHsKKwkJCQkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW5ndGgpIDsgCisJCQkJfQorCisJCQkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBOb3QgZW5vdWdoIG1lbW9yeSB0byBjb3B5IHBhY2tldCB0byB1cHBlciBsYXllcnMuIFxuIixkZXYtPm5hbWUpIDsKKwkJCQkJb2x5bXBpY19wcml2LT5vbHltcGljX3N0YXRzLnJ4X2Ryb3BwZWQrKyA7IAorCQkJCQkvKiBVcGRhdGUgY291bnRlcnMgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgdHJhbnNmZXIgdGhlIGZyYW1lICovCisJCQkJCW9seW1waWNfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkICs9IGkgOyAKKwkJCQkJb2x5bXBpY19wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQgJj0gKE9MWU1QSUNfUlhfUklOR19TSVpFIC0xKSA7ICAKKwkJCQl9IGVsc2UgIHsKKwkJCQkJc2tiLT5kZXYgPSBkZXYgOyAKKworCQkJCQkvKiBPcHRpbWlzZSBiYXNlZCB1cG9uIG51bWJlciBvZiBidWZmZXJzIHVzZWQuIAorCQkJICAgCSAgIAkgICBJZiBvbmx5IG9uZSBidWZmZXIgaXMgdXNlZCB3ZSBjYW4gc2ltcGx5IHN3YXAgdGhlIGJ1ZmZlcnMgYXJvdW5kLgorCQkJICAgCSAgIAkgICBJZiBtb3JlIHRoYW4gb25lIHRoZW4gd2UgbXVzdCB1c2UgdGhlIG5ldyBidWZmZXIgYW5kIGNvcHkgdGhlIGluZm9ybWF0aW9uCisJCQkgICAJICAgCSAgIGZpcnN0LiBJZGVhbGx5IGFsbCBmcmFtZXMgd291bGQgYmUgaW4gYSBzaW5nbGUgYnVmZmVyLCB0aGlzIGNhbiBiZSB0dW5lZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAJICAgYWx0ZXJpbmcgdGhlIGJ1ZmZlciBzaXplLiBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgaXMgbGVzcyB0aGFuCisJCQkJCSAgIDE1MDAgYnl0ZXMgd2UncmUgZ29pbmcgdG8gY29weSBpdCBvdmVyIGFueXdheSB0byBzdG9wIHBhY2tldHMgZ2V0dGluZworCQkJCQkgICBkcm9wcGVkIGZyb20gc29ja2V0cyB3aXRoIGJ1ZmZlcnMgc21hbGxlciB0aGFuIG91ciBwa3RfYnVmX3N6LiAqLworCQkJCQorIAkJCQkJaWYgKGJ1ZmZlcl9jbnQ9PTEpIHsKKwkJCQkJCW9seW1waWNfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkKysgOyAKKwkJCQkJCW9seW1waWNfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkICY9IChPTFlNUElDX1JYX1JJTkdfU0laRSAtMSk7CisJCQkJCQlyeF9yaW5nX2xhc3RfcmVjZWl2ZWQgPSBvbHltcGljX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCA7CisJCQkJCQlpZiAobGVuZ3RoID4gMTUwMCkgeyAKKwkJCQkJCQlza2IyPW9seW1waWNfcHJpdi0+cnhfcmluZ19za2JbcnhfcmluZ19sYXN0X3JlY2VpdmVkXSA7IAorCQkJCQkJCS8qIHVubWFwIGJ1ZmZlciAqLworCQkJCQkJCXBjaV91bm1hcF9zaW5nbGUob2x5bXBpY19wcml2LT5wZGV2LAorCQkJCQkJCQlsZTMyX3RvX2NwdShvbHltcGljX3ByaXYtPm9seW1waWNfcnhfcmluZ1tyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLmJ1ZmZlciksIAorCQkJCQkJCQlvbHltcGljX3ByaXYtPnBrdF9idWZfc3osUENJX0RNQV9GUk9NREVWSUNFKSA7IAorCQkJCQkJCXNrYl9wdXQoc2tiMixsZW5ndGgtNCk7CisJCQkJCQkJc2tiMi0+cHJvdG9jb2wgPSB0cl90eXBlX3RyYW5zKHNrYjIsZGV2KTsKKwkJCQkJCQlvbHltcGljX3ByaXYtPm9seW1waWNfcnhfcmluZ1tyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLmJ1ZmZlciA9IAorCQkJCQkJCQljcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShvbHltcGljX3ByaXYtPnBkZXYsIHNrYi0+ZGF0YSwgCisJCQkJCQkJCW9seW1waWNfcHJpdi0+cGt0X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCQkJCQkJb2x5bXBpY19wcml2LT5vbHltcGljX3J4X3JpbmdbcnhfcmluZ19sYXN0X3JlY2VpdmVkXS5yZXNfbGVuZ3RoID0gCisJCQkJCQkJCWNwdV90b19sZTMyKG9seW1waWNfcHJpdi0+cGt0X2J1Zl9zeik7IAorCQkJCQkJCW9seW1waWNfcHJpdi0+cnhfcmluZ19za2JbcnhfcmluZ19sYXN0X3JlY2VpdmVkXSA9IHNrYiA7IAorCQkJCQkJCW5ldGlmX3J4KHNrYjIpIDsgCisJCQkJCQl9IGVsc2UgeyAKKwkJCQkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUob2x5bXBpY19wcml2LT5wZGV2LAorCQkJCQkJCQlsZTMyX3RvX2NwdShvbHltcGljX3ByaXYtPm9seW1waWNfcnhfcmluZ1tyeF9yaW5nX2xhc3RfcmVjZWl2ZWRdLmJ1ZmZlciksCisJCQkJCQkJCW9seW1waWNfcHJpdi0+cGt0X2J1Zl9zeixQQ0lfRE1BX0ZST01ERVZJQ0UpIDsgCisJCQkJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLGxlbmd0aC00KSxvbHltcGljX3ByaXYtPnJ4X3Jpbmdfc2tiW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0tPmRhdGEsbGVuZ3RoLTQpIDsgCisJCQkJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG9seW1waWNfcHJpdi0+cGRldiwKKwkJCQkJCQkJbGUzMl90b19jcHUob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3JpbmdbcnhfcmluZ19sYXN0X3JlY2VpdmVkXS5idWZmZXIpLAorCQkJCQkJCQlvbHltcGljX3ByaXYtPnBrdF9idWZfc3osUENJX0RNQV9GUk9NREVWSUNFKSA7CisJCQkJCQkJc2tiLT5wcm90b2NvbCA9IHRyX3R5cGVfdHJhbnMoc2tiLGRldikgOyAKKwkJCQkJCQluZXRpZl9yeChza2IpIDsgCisJCQkJCQl9IAorCQkJCQl9IGVsc2UgeworCQkJCQkJZG8geyAvKiBXYWxrIHRoZSBidWZmZXJzICovIAorCQkJCQkJCW9seW1waWNfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkKysgOyAKKwkJCQkJCQlvbHltcGljX3ByaXYtPnJ4X3JpbmdfbGFzdF9yZWNlaXZlZCAmPSAoT0xZTVBJQ19SWF9SSU5HX1NJWkUgLTEpOworCQkJCQkJCXJ4X3JpbmdfbGFzdF9yZWNlaXZlZCA9IG9seW1waWNfcHJpdi0+cnhfcmluZ19sYXN0X3JlY2VpdmVkIDsgCisJCQkJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KG9seW1waWNfcHJpdi0+cGRldiwKKwkJCQkJCQkJbGUzMl90b19jcHUob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3JpbmdbcnhfcmluZ19sYXN0X3JlY2VpdmVkXS5idWZmZXIpLAorCQkJCQkJCQlvbHltcGljX3ByaXYtPnBrdF9idWZfc3osUENJX0RNQV9GUk9NREVWSUNFKSA7IAorCQkJCQkJCXJ4X2Rlc2MgPSAmKG9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9yaW5nW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0pOworCQkJCQkJCWNweV9sZW5ndGggPSAoaSA9PSAxID8gZnJhZ19sZW4gOiBsZTMyX3RvX2NwdShyeF9kZXNjLT5yZXNfbGVuZ3RoKSk7IAorCQkJCQkJCW1lbWNweShza2JfcHV0KHNrYiwgY3B5X2xlbmd0aCksIG9seW1waWNfcHJpdi0+cnhfcmluZ19za2JbcnhfcmluZ19sYXN0X3JlY2VpdmVkXS0+ZGF0YSwgY3B5X2xlbmd0aCkgOworCQkJCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShvbHltcGljX3ByaXYtPnBkZXYsCisJCQkJCQkJCWxlMzJfdG9fY3B1KG9seW1waWNfcHJpdi0+b2x5bXBpY19yeF9yaW5nW3J4X3JpbmdfbGFzdF9yZWNlaXZlZF0uYnVmZmVyKSwKKwkJCQkJCQkJb2x5bXBpY19wcml2LT5wa3RfYnVmX3N6LFBDSV9ETUFfRlJPTURFVklDRSkgOworCQkJCQkJfSB3aGlsZSAoLS1pKSA7IAorCQkJCQkJc2tiX3RyaW0oc2tiLHNrYi0+bGVuLTQpIDsgCisJCQkJCQlza2ItPnByb3RvY29sID0gdHJfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJCQkJCW5ldGlmX3J4KHNrYikgOyAKKwkJCQkJfSAKKwkJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllcyA7IAorCQkJCQlvbHltcGljX3ByaXYtPm9seW1waWNfc3RhdHMucnhfcGFja2V0cysrIDsgCisJCQkJCW9seW1waWNfcHJpdi0+b2x5bXBpY19zdGF0cy5yeF9ieXRlcyArPSBsZW5ndGggOyAKKwkJCQl9IC8qIGlmIHNrYiA9PSBudWxsICovCisJCQl9IC8qIElmIHN0YXR1cyAmIDB4M2IgKi8KKworCQl9IGVsc2UgeyAvKmlmIGJ1ZmZlcmNudCAmIDB4QyAqLworCQkJb2x5bXBpY19wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQgKz0gaSA7IAorCQkJb2x5bXBpY19wcml2LT5yeF9yaW5nX2xhc3RfcmVjZWl2ZWQgJj0gKE9MWU1QSUNfUlhfUklOR19TSVpFIC0gMSkgOyAKKwkJfSAKKworCQlyeF9zdGF0dXMtPmZyYWdtZW50Y250X2ZyYW1lbGVuID0gMCA7IAorCQlyeF9zdGF0dXMtPnN0YXR1c19idWZmZXJjbnQgPSAwIDsgCisJCXJ4X3N0YXR1cyA9ICYob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3N0YXR1c19yaW5nWyhvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19sYXN0X3JlY2VpdmVkKzEpICYgKE9MWU1QSUNfUlhfUklOR19TSVpFIC0xKSBdKTsKKworCQl3cml0ZXcoKCgocmVhZHcob2x5bXBpY19tbWlvK1JYRU5RKSkgJiAweDgwMDApIF4gMHg4MDAwKSB8ICBidWZmZXJfY250ICwgb2x5bXBpY19tbWlvK1JYRU5RKTsgCisJfSAvKiB3aGlsZSAqLworCit9CisKK3N0YXRpYyB2b2lkIG9seW1waWNfZnJlZW1lbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sgCisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2PShzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICopZGV2LT5wcml2OworCWludCBpOworCQkJCisJZm9yKGk9MDtpPE9MWU1QSUNfUlhfUklOR19TSVpFO2krKykgeworCQlpZiAob2x5bXBpY19wcml2LT5yeF9yaW5nX3NrYltvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19sYXN0X3JlY2VpdmVkXSAhPSBOVUxMKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShvbHltcGljX3ByaXYtPnJ4X3Jpbmdfc2tiW29seW1waWNfcHJpdi0+cnhfc3RhdHVzX2xhc3RfcmVjZWl2ZWRdKTsKKwkJCW9seW1waWNfcHJpdi0+cnhfcmluZ19za2Jbb2x5bXBpY19wcml2LT5yeF9zdGF0dXNfbGFzdF9yZWNlaXZlZF0gPSBOVUxMOworCQl9CisJCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfcnhfcmluZ1tvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19sYXN0X3JlY2VpdmVkXS5idWZmZXIgIT0gMHhkZWFkYmVlZikgeworCQkJcGNpX3VubWFwX3NpbmdsZShvbHltcGljX3ByaXYtPnBkZXYsIAorCQkJbGUzMl90b19jcHUob2x5bXBpY19wcml2LT5vbHltcGljX3J4X3Jpbmdbb2x5bXBpY19wcml2LT5yeF9zdGF0dXNfbGFzdF9yZWNlaXZlZF0uYnVmZmVyKSwKKwkJCW9seW1waWNfcHJpdi0+cGt0X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJfQorCQlvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19sYXN0X3JlY2VpdmVkKys7CisJCW9seW1waWNfcHJpdi0+cnhfc3RhdHVzX2xhc3RfcmVjZWl2ZWQmPU9MWU1QSUNfUlhfUklOR19TSVpFLTE7CisJfQorCS8qIHVubWFwIHJpbmdzICovCisJcGNpX3VubWFwX3NpbmdsZShvbHltcGljX3ByaXYtPnBkZXYsIG9seW1waWNfcHJpdi0+cnhfc3RhdHVzX3JpbmdfZG1hX2FkZHIsIAorCQlzaXplb2Yoc3RydWN0IG9seW1waWNfcnhfc3RhdHVzKSAqIE9MWU1QSUNfUlhfUklOR19TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCXBjaV91bm1hcF9zaW5nbGUob2x5bXBpY19wcml2LT5wZGV2LCBvbHltcGljX3ByaXYtPnJ4X3JpbmdfZG1hX2FkZHIsCisJCXNpemVvZihzdHJ1Y3Qgb2x5bXBpY19yeF9kZXNjKSAqIE9MWU1QSUNfUlhfUklOR19TSVpFLCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCXBjaV91bm1hcF9zaW5nbGUob2x5bXBpY19wcml2LT5wZGV2LCBvbHltcGljX3ByaXYtPnR4X3N0YXR1c19yaW5nX2RtYV9hZGRyLCAKKwkJc2l6ZW9mKHN0cnVjdCBvbHltcGljX3R4X3N0YXR1cykgKiBPTFlNUElDX1RYX1JJTkdfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlwY2lfdW5tYXBfc2luZ2xlKG9seW1waWNfcHJpdi0+cGRldiwgb2x5bXBpY19wcml2LT50eF9yaW5nX2RtYV9hZGRyLCAKKwkJc2l6ZW9mKHN0cnVjdCBvbHltcGljX3R4X2Rlc2MpICogT0xZTVBJQ19UWF9SSU5HX1NJWkUsIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJcmV0dXJuIDsgCit9CisgCitzdGF0aWMgaXJxcmV0dXJuX3Qgb2x5bXBpY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykgCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldj0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCXN0cnVjdCBvbHltcGljX3ByaXZhdGUgKm9seW1waWNfcHJpdj0oc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqKWRldi0+cHJpdjsKKwl1OCBfX2lvbWVtICpvbHltcGljX21taW89b2x5bXBpY19wcml2LT5vbHltcGljX21taW87CisJdTMyIHNpc3I7CisJdTggX19pb21lbSAqYWRhcHRlcl9jaGVja19hcmVhIDsgCisJCisJLyogCisJICogIFJlYWQgc2lzciBidXQgZG9uJ3QgcmVzZXQgaXQgeWV0LiAKKwkgKiAgVGhlIGluZGljYXRpb24gYml0IG1heSBoYXZlIGJlZW4gc2V0IGJ1dCB0aGUgaW50ZXJydXB0IGxhdGNoCisJICogIGJpdCBtYXkgbm90IGJlIHNldCwgc28gd2UnZCBsb3NlIHRoZSBpbnRlcnJ1cHQgbGF0ZXIuIAorCSAqLyAKKwlzaXNyPXJlYWRsKG9seW1waWNfbW1pbytTSVNSKSA7IAorCWlmICghKHNpc3IgJiBTSVNSX01JKSkgLyogSW50ZXJydXB0IGlzbid0IGZvciB1cyAqLyAKKwkJcmV0dXJuIElSUV9OT05FOworCXNpc3I9cmVhZGwob2x5bXBpY19tbWlvK1NJU1JfUlIpIDsgIC8qIFJlYWQgJiBSZXNldCBzaXNyICovIAorCisJc3Bpbl9sb2NrKCZvbHltcGljX3ByaXYtPm9seW1waWNfbG9jayk7CisKKwkvKiBIb3Rzd2FwIGdpdmVzIHVzIHRoaXMgb24gcmVtb3ZhbCAqLworCWlmIChzaXNyID09IDB4ZmZmZmZmZmYpIHsgCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBIb3Rzd2FwIGFkYXB0ZXIgcmVtb3ZhbC5cbiIsZGV2LT5uYW1lKSA7IAorCQlzcGluX3VubG9jaygmb2x5bXBpY19wcml2LT5vbHltcGljX2xvY2spIDsgCisJCXJldHVybiBJUlFfTk9ORTsKKwl9IAorCQkKKwlpZiAoc2lzciAmIChTSVNSX1NSQl9SRVBMWSB8IFNJU1JfVFgxX0VPRiB8IFNJU1JfUlhfU1RBVFVTIHwgU0lTUl9BREFQVEVSX0NIRUNLIHwgIAorCQkJU0lTUl9BU0JfRlJFRSB8IFNJU1JfQVJCX0NNRCB8IFNJU1JfVFJCX1JFUExZIHwgU0lTUl9SWF9OT0JVRiB8IFNJU1JfRVJSKSkgeyAgCisJCisJCS8qIElmIHdlIGV2ZXIgZ2V0IHRoaXMgdGhlIGFkYXB0ZXIgaXMgc2VyaW91c2x5IGRlYWQuIE9ubHkgYSByZXNldCBpcyBnb2luZyB0byAKKwkJICogYnJpbmcgaXQgYmFjayB0byBsaWZlLiBXZSdyZSB0YWxraW5nIHBjaSBidXMgZXJyb3JzIGFuZCBzdWNoIGxpa2UgOiggKi8gCisJCWlmKChzaXNyICYgU0lTUl9FUlIpICYmIChyZWFkbChvbHltcGljX21taW8rRUlTUikgJiBFSVNSX01BU0tfT1BUSU9OUykpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiT2x5bXBpYzogRUlTUiBFcnJvciwgRUlTUj0lMDh4XG4iLHJlYWRsKG9seW1waWNfbW1pbytFSVNSKSkgOyAKKwkJCXByaW50ayhLRVJOX0VSUiAiVGhlIGFkYXB0ZXIgbXVzdCBiZSByZXNldCB0byBjbGVhciB0aGlzIGNvbmRpdGlvbi5cbiIpIDsgCisJCQlwcmludGsoS0VSTl9FUlIgIlBsZWFzZSByZXBvcnQgdGhpcyBlcnJvciB0byB0aGUgZHJpdmVyIG1haW50YWluZXIgYW5kL1xuIikgOyAKKwkJCXByaW50ayhLRVJOX0VSUiAib3IgdGhlIGxpbnV4LXRyIG1haWxpbmcgbGlzdC5cbiIpIDsgCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm9seW1waWNfcHJpdi0+c3JiX3dhaXQpOworCQkJc3Bpbl91bmxvY2soJm9seW1waWNfcHJpdi0+b2x5bXBpY19sb2NrKSA7IAorCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9IC8qIFNJU1JfRVJSICovCisKKwkJaWYoc2lzciAmIFNJU1JfU1JCX1JFUExZKSB7CisJCQlpZihvbHltcGljX3ByaXYtPnNyYl9xdWV1ZWQ9PTEpIHsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm9seW1waWNfcHJpdi0+c3JiX3dhaXQpOworCQkJfSBlbHNlIGlmIChvbHltcGljX3ByaXYtPnNyYl9xdWV1ZWQ9PTIpIHsgCisJCQkJb2x5bXBpY19zcmJfYmgoZGV2KSA7IAorCQkJfQorCQkJb2x5bXBpY19wcml2LT5zcmJfcXVldWVkPTA7CisJCX0gLyogU0lTUl9TUkJfUkVQTFkgKi8KKworCQkvKiBXZSBzaG91bGRuJ3QgZXZlciBtaXNzIHRoZSBUeCBpbnRlcnJ1cHQsIGJ1dCB0aGUgeW91IG5ldmVyIGtub3csIGhlbmNlIHRoZSBsb29wIHRvIGVuc3VyZQorCQkgICB3ZSBnZXQgYWxsIHR4IGNvbXBsZXRpb25zLiAqLworCQlpZiAoc2lzciAmIFNJU1JfVFgxX0VPRikgeworCQkJd2hpbGUob2x5bXBpY19wcml2LT5vbHltcGljX3R4X3N0YXR1c19yaW5nWyhvbHltcGljX3ByaXYtPnR4X3JpbmdfbGFzdF9zdGF0dXMgKyAxKSAmIChPTFlNUElDX1RYX1JJTkdfU0laRS0xKV0uc3RhdHVzKSB7IAorCQkJCW9seW1waWNfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1cysrOworCQkJCW9seW1waWNfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1cyAmPSAoT0xZTVBJQ19UWF9SSU5HX1NJWkUtMSk7CisJCQkJb2x5bXBpY19wcml2LT5mcmVlX3R4X3JpbmdfZW50cmllcysrOworCQkJCW9seW1waWNfcHJpdi0+b2x5bXBpY19zdGF0cy50eF9ieXRlcyArPSBvbHltcGljX3ByaXYtPnR4X3Jpbmdfc2tiW29seW1waWNfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1c10tPmxlbjsKKwkJCQlvbHltcGljX3ByaXYtPm9seW1waWNfc3RhdHMudHhfcGFja2V0cysrIDsgCisJCQkJcGNpX3VubWFwX3NpbmdsZShvbHltcGljX3ByaXYtPnBkZXYsIAorCQkJCQlsZTMyX3RvX2NwdShvbHltcGljX3ByaXYtPm9seW1waWNfdHhfcmluZ1tvbHltcGljX3ByaXYtPnR4X3JpbmdfbGFzdF9zdGF0dXNdLmJ1ZmZlciksIAorCQkJCQlvbHltcGljX3ByaXYtPnR4X3Jpbmdfc2tiW29seW1waWNfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1c10tPmxlbixQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycShvbHltcGljX3ByaXYtPnR4X3Jpbmdfc2tiW29seW1waWNfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1c10pOworCQkJCW9seW1waWNfcHJpdi0+b2x5bXBpY190eF9yaW5nW29seW1waWNfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1c10uYnVmZmVyPTB4ZGVhZGJlZWY7CisJCQkJb2x5bXBpY19wcml2LT5vbHltcGljX3R4X3N0YXR1c19yaW5nW29seW1waWNfcHJpdi0+dHhfcmluZ19sYXN0X3N0YXR1c10uc3RhdHVzPTA7CisJCQl9CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0gLyogU0lTUl9UWDFfRU9GICovCisJCisJCWlmIChzaXNyICYgU0lTUl9SWF9TVEFUVVMpIHsKKwkJCW9seW1waWNfcngoZGV2KTsKKwkJfSAvKiBTSVNSX1JYX1NUQVRVUyAqLworCQorCQlpZiAoc2lzciAmIFNJU1JfQURBUFRFUl9DSEVDSykgeworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgQ2hlY2sgSW50ZXJydXB0IFJhaXNlZCwgOCBieXRlcyBvZiBpbmZvcm1hdGlvbiBmb2xsb3c6XG4iLCBkZXYtPm5hbWUpOworCQkJd3JpdGVsKHJlYWRsKG9seW1waWNfbW1pbytMQVBXV0MpLG9seW1waWNfbW1pbytMQVBBKTsKKwkJCWFkYXB0ZXJfY2hlY2tfYXJlYSA9IG9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgKyAoKHJlYWRsKG9seW1waWNfbW1pbytMQVBXV0MpKSAmICh+MHhmODAwKSkgOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEJ5dGVzICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIixkZXYtPm5hbWUsIHJlYWRiKGFkYXB0ZXJfY2hlY2tfYXJlYSswKSwgcmVhZGIoYWRhcHRlcl9jaGVja19hcmVhKzEpLCByZWFkYihhZGFwdGVyX2NoZWNrX2FyZWErMiksIHJlYWRiKGFkYXB0ZXJfY2hlY2tfYXJlYSszKSwgcmVhZGIoYWRhcHRlcl9jaGVja19hcmVhKzQpLCByZWFkYihhZGFwdGVyX2NoZWNrX2FyZWErNSksIHJlYWRiKGFkYXB0ZXJfY2hlY2tfYXJlYSs2KSwgcmVhZGIoYWRhcHRlcl9jaGVja19hcmVhKzcpKSA7IAorCQkJc3Bpbl91bmxvY2soJm9seW1waWNfcHJpdi0+b2x5bXBpY19sb2NrKSA7IAorCQkJcmV0dXJuIElSUV9IQU5ETEVEOyAKKwkJfSAvKiBTSVNSX0FEQVBURVJfQ0hFQ0sgKi8KKwkKKwkJaWYgKHNpc3IgJiBTSVNSX0FTQl9GUkVFKSB7CisJCQkvKiBXYWtlIHVwIGFueXRoaW5nIHRoYXQgaXMgd2FpdGluZyBmb3IgdGhlIGFzYiByZXNwb25zZSAqLyAgCisJCQlpZiAob2x5bXBpY19wcml2LT5hc2JfcXVldWVkKSB7CisJCQkJb2x5bXBpY19hc2JfYmgoZGV2KSA7IAorCQkJfQorCQl9IC8qIFNJU1JfQVNCX0ZSRUUgKi8KKwkKKwkJaWYgKHNpc3IgJiBTSVNSX0FSQl9DTUQpIHsKKwkJCW9seW1waWNfYXJiX2NtZChkZXYpIDsgCisJCX0gLyogU0lTUl9BUkJfQ01EICovCisJCisJCWlmIChzaXNyICYgU0lTUl9UUkJfUkVQTFkpIHsKKwkJCS8qIFdha2UgdXAgYW55dGhpbmcgdGhhdCBpcyB3YWl0aW5nIGZvciB0aGUgdHJiIHJlc3BvbnNlICovCisJCQlpZiAob2x5bXBpY19wcml2LT50cmJfcXVldWVkKSB7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZvbHltcGljX3ByaXYtPnRyYl93YWl0KTsKKwkJCX0KKwkJCW9seW1waWNfcHJpdi0+dHJiX3F1ZXVlZCA9IDAgOyAKKwkJfSAvKiBTSVNSX1RSQl9SRVBMWSAqLwkKKwkKKwkJaWYgKHNpc3IgJiBTSVNSX1JYX05PQlVGKSB7CisJCQkvKiBBY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50YXRpb24sIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcsIGJ1dCB0cmFwcGluZyBpdCBrZWVwcyBpdCBvdXQgb2YKKyAgICAgICAgICAgICAgICAgIAkgICAJICAgL3Zhci9sb2cvbWVzc2FnZXMuICAqLworCQl9IC8qIFNJU1JfUlhfTk9CVUYgKi8KKwl9IGVsc2UgeyAKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuZXhwZWN0ZWQgaW50ZXJydXB0OiAleFxuIixkZXYtPm5hbWUsIHNpc3IpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogU0lTUl9NQVNLOiAleFxuIixkZXYtPm5hbWUsIHJlYWRsKG9seW1waWNfbW1pbytTSVNSX01BU0spKSA7CisJfSAvKiBPbmUgaWYgdGhlIGludGVycnVwdHMgd2Ugd2FudCAqLworCXdyaXRlbChTSVNSX01JLG9seW1waWNfbW1pbytTSVNSX01BU0tfU1VNKTsKKwkKKwlzcGluX3VubG9jaygmb2x5bXBpY19wcml2LT5vbHltcGljX2xvY2spIDsgCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQkKKworc3RhdGljIGludCBvbHltcGljX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikgCit7CisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2PShzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICopZGV2LT5wcml2OworCXU4IF9faW9tZW0gKm9seW1waWNfbW1pbz1vbHltcGljX3ByaXYtPm9seW1waWNfbW1pbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzIDsgCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb2x5bXBpY19wcml2LT5vbHltcGljX2xvY2ssIGZsYWdzKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwlpZihvbHltcGljX3ByaXYtPmZyZWVfdHhfcmluZ19lbnRyaWVzKSB7CisJCW9seW1waWNfcHJpdi0+b2x5bXBpY190eF9yaW5nW29seW1waWNfcHJpdi0+dHhfcmluZ19mcmVlXS5idWZmZXIgPSAKKwkJCWNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKG9seW1waWNfcHJpdi0+cGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbixQQ0lfRE1BX1RPREVWSUNFKSk7CisJCW9seW1waWNfcHJpdi0+b2x5bXBpY190eF9yaW5nW29seW1waWNfcHJpdi0+dHhfcmluZ19mcmVlXS5zdGF0dXNfbGVuZ3RoID0gY3B1X3RvX2xlMzIoc2tiLT5sZW4gfCAoMHg4MDAwMDAwMCkpOworCQlvbHltcGljX3ByaXYtPnR4X3Jpbmdfc2tiW29seW1waWNfcHJpdi0+dHhfcmluZ19mcmVlXT1za2I7CisJCW9seW1waWNfcHJpdi0+ZnJlZV90eF9yaW5nX2VudHJpZXMtLTsKKworICAgICAgICAJb2x5bXBpY19wcml2LT50eF9yaW5nX2ZyZWUrKzsKKyAgICAgICAgCW9seW1waWNfcHJpdi0+dHhfcmluZ19mcmVlICY9IChPTFlNUElDX1RYX1JJTkdfU0laRS0xKTsKKwkJd3JpdGV3KCgoKHJlYWR3KG9seW1waWNfbW1pbytUWEVOUV8xKSkgJiAweDgwMDApIF4gMHg4MDAwKSB8IDEsb2x5bXBpY19tbWlvK1RYRU5RXzEpOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9seW1waWNfcHJpdi0+b2x5bXBpY19sb2NrLGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2x5bXBpY19wcml2LT5vbHltcGljX2xvY2ssZmxhZ3MpOworCQlyZXR1cm4gMTsKKwl9IAorCit9CisJCisKK3N0YXRpYyBpbnQgb2x5bXBpY19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICpvbHltcGljX3ByaXY9KHN0cnVjdCBvbHltcGljX3ByaXZhdGUgKilkZXYtPnByaXY7CisJdTggX19pb21lbSAqb2x5bXBpY19tbWlvPW9seW1waWNfcHJpdi0+b2x5bXBpY19tbWlvLCpzcmI7CisJdW5zaWduZWQgbG9uZyB0LGZsYWdzOworCisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCxjdXJyZW50KSA7IAorCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCXdyaXRlbChvbHltcGljX3ByaXYtPnNyYixvbHltcGljX21taW8rTEFQQSk7CisJc3JiPW9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgKyAob2x5bXBpY19wcml2LT5zcmIgJiAofjB4ZjgwMCkpOworCQorICAgIAl3cml0ZWIoU1JCX0NMT1NFX0FEQVBURVIsc3JiKzApOworCXdyaXRlYigwLHNyYisxKTsKKwl3cml0ZWIoT0xZTVBJQ19DTEVBUl9SRVRfQ09ERSxzcmIrMik7CisKKwlhZGRfd2FpdF9xdWV1ZSgmb2x5bXBpY19wcml2LT5zcmJfd2FpdCwmd2FpdCkgOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSkgOyAKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvbHltcGljX3ByaXYtPm9seW1waWNfbG9jayxmbGFncyk7CisJb2x5bXBpY19wcml2LT5zcmJfcXVldWVkPTE7CisKKwl3cml0ZWwoTElTUl9TUkJfQ01ELG9seW1waWNfbW1pbytMSVNSX1NVTSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2x5bXBpY19wcml2LT5vbHltcGljX2xvY2ssZmxhZ3MpOworCisJd2hpbGUob2x5bXBpY19wcml2LT5zcmJfcXVldWVkKSB7CisKKwkJdCA9IHNjaGVkdWxlX3RpbWVvdXQoNjAqSFopOyAKKworICAgICAgICAJaWYoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCXsgICAgICAgICAgICAKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBTUkIgdGltZWQgb3V0LlxuIixkZXYtPm5hbWUpOworICAgICAgICAgICAgCQlwcmludGsoS0VSTl9XQVJOSU5HICJTSVNSPSV4IE1JU1I9JXhcbiIscmVhZGwob2x5bXBpY19tbWlvK1NJU1IpLHJlYWRsKG9seW1waWNfbW1pbytMSVNSKSk7CisgICAgICAgICAgICAJCW9seW1waWNfcHJpdi0+c3JiX3F1ZXVlZD0wOworICAgICAgICAgICAgCQlicmVhazsKKyAgICAgICAgCX0KKworCQlpZiAodCA9PSAwKSB7IAorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFNSQiB0aW1lZCBvdXQuIE1heSBub3QgYmUgZmF0YWwuIFxuIixkZXYtPm5hbWUpIDsgCisJCX0gCisJCW9seW1waWNfcHJpdi0+c3JiX3F1ZXVlZD0wOworICAgIAl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJm9seW1waWNfcHJpdi0+c3JiX3dhaXQsJndhaXQpIDsgCisKKwlvbHltcGljX3ByaXYtPnJ4X3N0YXR1c19sYXN0X3JlY2VpdmVkKys7CisJb2x5bXBpY19wcml2LT5yeF9zdGF0dXNfbGFzdF9yZWNlaXZlZCY9T0xZTVBJQ19SWF9SSU5HX1NJWkUtMTsKKworCW9seW1waWNfZnJlZW1lbShkZXYpIDsgCQorCisJLyogcmVzZXQgdHgvcnggZmlmbydzIGFuZCBidXNtYXN0ZXIgbG9naWMgKi8KKworCXdyaXRlbChyZWFkbChvbHltcGljX21taW8rQkNUTCl8KDM8PDEzKSxvbHltcGljX21taW8rQkNUTCk7CisJdWRlbGF5KDEpOworCXdyaXRlbChyZWFkbChvbHltcGljX21taW8rQkNUTCkmfigzPDwxMyksb2x5bXBpY19tbWlvK0JDVEwpOworCisjaWYgT0xZTVBJQ19ERUJVRworCXsKKwlpbnQgaSA7IAorCXByaW50aygic3JiKCVwKTogIixzcmIpOworCWZvcihpPTA7aTw0O2krKykKKwkJcHJpbnRrKCIleCAiLHJlYWRiKHNyYitpKSk7CisJcHJpbnRrKCJcbiIpOworCX0KKyNlbmRpZgorCWZyZWVfaXJxKGRldi0+aXJxLGRldik7CisKKwlyZXR1cm4gMDsKKwkKK30KKworc3RhdGljIHZvaWQgb2x5bXBpY19zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sKKwlzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICpvbHltcGljX3ByaXYgPSAoc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqKSBkZXYtPnByaXYgOyAKKyAgIAl1OCBfX2lvbWVtICpvbHltcGljX21taW8gPSBvbHltcGljX3ByaXYtPm9seW1waWNfbW1pbyA7IAorCXU4IG9wdGlvbnMgPSAwOyAKKwl1OCBfX2lvbWVtICpzcmI7CisJc3RydWN0IGRldl9tY19saXN0ICpkbWkgOyAKKwl1bnNpZ25lZCBjaGFyIGRldl9tY19hZGRyZXNzWzRdIDsgCisJaW50IGkgOyAKKworCXdyaXRlbChvbHltcGljX3ByaXYtPnNyYixvbHltcGljX21taW8rTEFQQSk7CisJc3JiPW9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgKyAob2x5bXBpY19wcml2LT5zcmIgJiAofjB4ZjgwMCkpOworCW9wdGlvbnMgPSBvbHltcGljX3ByaXYtPm9seW1waWNfY29weV9hbGxfb3B0aW9uczsgCisKKwlpZiAoZGV2LT5mbGFncyZJRkZfUFJPTUlTQykgIAorCQlvcHRpb25zIHw9IDB4NjEgOworCWVsc2UKKwkJb3B0aW9ucyAmPSB+MHg2MSA7IAorCisJLyogT25seSBpc3N1ZSB0aGUgc3JiIGlmIHRoZXJlIGlzIGEgY2hhbmdlIGluIG9wdGlvbnMgKi8KKworCWlmICgob3B0aW9ucyBeIG9seW1waWNfcHJpdi0+b2x5bXBpY19jb3B5X2FsbF9vcHRpb25zKSkgeyAKKwkKKwkJLyogTm93IHRvIGlzc3VlIHRoZSBzcmIgY29tbWFuZCB0byBhbHRlciB0aGUgY29weS5hbGwub3B0aW9ucyAqLworCQorCQl3cml0ZWIoU1JCX01PRElGWV9SRUNFSVZFX09QVElPTlMsc3JiKTsKKwkJd3JpdGViKDAsc3JiKzEpOworCQl3cml0ZWIoT0xZTVBJQ19DTEVBUl9SRVRfQ09ERSxzcmIrMik7CisJCXdyaXRlYigwLHNyYiszKTsKKwkJd3JpdGViKG9seW1waWNfcHJpdi0+b2x5bXBpY19yZWNlaXZlX29wdGlvbnMsc3JiKzQpOworCQl3cml0ZWIob3B0aW9ucyxzcmIrNSk7CisKKwkJb2x5bXBpY19wcml2LT5zcmJfcXVldWVkPTI7IC8qIENhbid0IHNsZWVwLCB1c2Ugc3JiX2JoICovCisKKwkJd3JpdGVsKExJU1JfU1JCX0NNRCxvbHltcGljX21taW8rTElTUl9TVU0pOworCisJCW9seW1waWNfcHJpdi0+b2x5bXBpY19jb3B5X2FsbF9vcHRpb25zID0gb3B0aW9ucyA7CisJCQorCQlyZXR1cm4gOyAgCisJfSAKKworCS8qIFNldCB0aGUgZnVuY3Rpb25hbCBhZGRyZXNzZXMgd2UgbmVlZCBmb3IgbXVsdGljYXN0ICovCisKKwlkZXZfbWNfYWRkcmVzc1swXSA9IGRldl9tY19hZGRyZXNzWzFdID0gZGV2X21jX2FkZHJlc3NbMl0gPSBkZXZfbWNfYWRkcmVzc1szXSA9IDAgOyAKKworCWZvciAoaT0wLGRtaT1kZXYtPm1jX2xpc3Q7aSA8IGRldi0+bWNfY291bnQ7IGkrKyxkbWkgPSBkbWktPm5leHQpIHsgCisJCWRldl9tY19hZGRyZXNzWzBdIHw9IGRtaS0+ZG1pX2FkZHJbMl0gOyAKKwkJZGV2X21jX2FkZHJlc3NbMV0gfD0gZG1pLT5kbWlfYWRkclszXSA7IAorCQlkZXZfbWNfYWRkcmVzc1syXSB8PSBkbWktPmRtaV9hZGRyWzRdIDsgCisJCWRldl9tY19hZGRyZXNzWzNdIHw9IGRtaS0+ZG1pX2FkZHJbNV0gOyAKKwl9CisKKwl3cml0ZWIoU1JCX1NFVF9GVU5DX0FERFJFU1Msc3JiKzApOworCXdyaXRlYigwLHNyYisxKTsKKwl3cml0ZWIoT0xZTVBJQ19DTEVBUl9SRVRfQ09ERSxzcmIrMik7CisJd3JpdGViKDAsc3JiKzMpOworCXdyaXRlYigwLHNyYis0KTsKKwl3cml0ZWIoMCxzcmIrNSk7CisJd3JpdGViKGRldl9tY19hZGRyZXNzWzBdLHNyYis2KTsKKwl3cml0ZWIoZGV2X21jX2FkZHJlc3NbMV0sc3JiKzcpOworCXdyaXRlYihkZXZfbWNfYWRkcmVzc1syXSxzcmIrOCk7CisJd3JpdGViKGRldl9tY19hZGRyZXNzWzNdLHNyYis5KTsKKworCW9seW1waWNfcHJpdi0+c3JiX3F1ZXVlZCA9IDIgOworCXdyaXRlbChMSVNSX1NSQl9DTUQsb2x5bXBpY19tbWlvK0xJU1JfU1VNKTsKKworfQorCitzdGF0aWMgdm9pZCBvbHltcGljX3NyYl9iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAKK3sgCisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2ID0gKHN0cnVjdCBvbHltcGljX3ByaXZhdGUgKikgZGV2LT5wcml2IDsgCisgICAJdTggX19pb21lbSAqb2x5bXBpY19tbWlvID0gb2x5bXBpY19wcml2LT5vbHltcGljX21taW8gOyAKKwl1OCBfX2lvbWVtICpzcmI7CisKKwl3cml0ZWwob2x5bXBpY19wcml2LT5zcmIsb2x5bXBpY19tbWlvK0xBUEEpOworCXNyYj1vbHltcGljX3ByaXYtPm9seW1waWNfbGFwICsgKG9seW1waWNfcHJpdi0+c3JiICYgKH4weGY4MDApKTsKKworCXN3aXRjaCAocmVhZGIoc3JiKSkgeyAKKworCQkvKiBTUkJfTU9ESUZZX1JFQ0VJVkVfT1BUSU9OUyBpLmUuIHNldF9tdWx0aWNhc3RfbGlzdCBvcHRpb25zIChwcm9taXNjdW91cykgCisgICAgICAgICAgICAgICAgICogQXQgc29tZSBwb2ludCB3ZSBzaG91bGQgZG8gc29tZXRoaW5nIGlmIHdlIGdldCBhbiBlcnJvciwgc3VjaCBhcworICAgICAgICAgICAgICAgICAqIHJlc2V0dGluZyB0aGUgSUZGX1BST01JU0MgZmxhZyBpbiBkZXYKKwkJICovCisKKwkJY2FzZSBTUkJfTU9ESUZZX1JFQ0VJVkVfT1BUSU9OUzoKKwkJCXN3aXRjaCAocmVhZGIoc3JiKzIpKSB7IAorCQkJCWNhc2UgMHgwMToKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBzcmIgY29tbWFuZFxuIixkZXYtPm5hbWUpIDsgCisJCQkJCWJyZWFrIDsgCisJCQkJY2FzZSAweDA0OgorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciBtdXN0IGJlIG9wZW4gZm9yIHRoaXMgb3BlcmF0aW9uLCBkb2ghIVxuIixkZXYtPm5hbWUpOworCQkJCQlicmVhayA7IAorCQkJCWRlZmF1bHQ6CisJCQkJCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbWVzc2FnZV9sZXZlbCkgCisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZSBPcHRpb25zIE1vZGlmaWVkIHRvICV4LCV4XG4iLGRldi0+bmFtZSxvbHltcGljX3ByaXYtPm9seW1waWNfY29weV9hbGxfb3B0aW9ucywgb2x5bXBpY19wcml2LT5vbHltcGljX3JlY2VpdmVfb3B0aW9ucykgOyAKKwkJCQkJYnJlYWsgOyAJCisJCQl9IC8qIHN3aXRjaCBzcmJbMl0gKi8gCisJCQlicmVhayA7CisJCQorCQkvKiBTUkJfU0VUX0dST1VQX0FERFJFU1MgLSBNdWx0aWNhc3QgZ3JvdXAgc2V0dGluZyAKKyAgICAgICAgICAgICAgICAgKi8KKworCQljYXNlIFNSQl9TRVRfR1JPVVBfQUREUkVTUzoKKwkJCXN3aXRjaCAocmVhZGIoc3JiKzIpKSB7IAorCQkJCWNhc2UgMHgwMDoKKwkJCQkJYnJlYWsgOyAKKwkJCQljYXNlIDB4MDE6CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbnJlY29nbml6ZWQgc3JiIGNvbW1hbmQgXG4iLGRldi0+bmFtZSkgOyAKKwkJCQkJYnJlYWsgOworCQkJCWNhc2UgMHgwNDoKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgbXVzdCBiZSBvcGVuIGZvciB0aGlzIG9wZXJhdGlvbiwgZG9oISFcbiIsZGV2LT5uYW1lKTsgCisJCQkJCWJyZWFrIDsKKwkJCQljYXNlIDB4M2M6CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBHcm91cC9GdW5jdGlvbmFsIGFkZHJlc3MgaW5kaWNhdG9yIGJpdHMgbm90IHNldCBjb3JyZWN0bHlcbiIsZGV2LT5uYW1lKSA7IAorCQkJCQlicmVhayA7CisJCQkJY2FzZSAweDNlOiAvKiBJZiB3ZSBldmVyIGltcGxlbWVudCBpbmRpdmlkdWFsIG11bHRpY2FzdCBhZGRyZXNzZXMsIHdpbGwgbmVlZCB0byBkZWFsIHdpdGggdGhpcyAqLworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogR3JvdXAgYWRkcmVzcyByZWdpc3RlcnMgZnVsbFxuIixkZXYtPm5hbWUpIDsgCisJCQkJCWJyZWFrIDsgIAorCQkJCWNhc2UgMHg1NToKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdyb3VwIEFkZHJlc3MgYWxyZWFkeSBzZXQuXG4iLGRldi0+bmFtZSkgOyAKKwkJCQkJYnJlYWsgOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrIDsgCisJCQl9IC8qIHN3aXRjaCBzcmJbMl0gKi8gCisJCQlicmVhayA7IAorCisJCS8qIFNSQl9SRVNFVF9HUk9VUF9BRERSRVNTIC0gUmVtb3ZlIGEgbXVsdGljYXN0IGFkZHJlc3MgZnJvbSBncm91cCBsaXN0CisgCQkgKi8KKworCQljYXNlIFNSQl9SRVNFVF9HUk9VUF9BRERSRVNTOgorCQkJc3dpdGNoIChyZWFkYihzcmIrMikpIHsgCisJCQkJY2FzZSAweDAwOgorCQkJCQlicmVhayA7IAorCQkJCWNhc2UgMHgwMToKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBzcmIgY29tbWFuZCBcbiIsZGV2LT5uYW1lKSA7IAorCQkJCQlicmVhayA7IAorCQkJCWNhc2UgMHgwNDoKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgbXVzdCBiZSBvcGVuIGZvciB0aGlzIG9wZXJhdGlvbiwgZG9oISFcbiIsZGV2LT5uYW1lKSA7IAorCQkJCQlicmVhayA7IAorCQkJCWNhc2UgMHgzOTogLyogTXVzdCBkZWFsIHdpdGggdGhpcyBpZiBpbmRpdmlkdWFsIG11bHRpY2FzdCBhZGRyZXNzZXMgdXNlZCAqLworCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogR3JvdXAgYWRkcmVzcyBub3QgZm91bmQgXG4iLGRldi0+bmFtZSk7IAorCQkJCQlicmVhayA7CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWsgOyAKKwkJCX0gLyogc3dpdGNoIHNyYlsyXSAqLworCQkJYnJlYWsgOyAKKworCQkKKwkJLyogU1JCX1NFVF9GVU5DX0FERFJFU1MgLSBDYWxsZWQgYnkgdGhlIHNldF9yeF9tb2RlIAorCQkgKi8KKworCQljYXNlIFNSQl9TRVRfRlVOQ19BRERSRVNTOgorCQkJc3dpdGNoIChyZWFkYihzcmIrMikpIHsgCisJCQkJY2FzZSAweDAwOgorCQkJCQlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX21lc3NhZ2VfbGV2ZWwpCisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogRnVuY3Rpb25hbCBBZGRyZXNzIE1hc2sgU2V0IFxuIixkZXYtPm5hbWUpIDsgCisJCQkJCWJyZWFrIDsKKwkJCQljYXNlIDB4MDE6CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbnJlY29nbml6ZWQgc3JiIGNvbW1hbmQgXG4iLGRldi0+bmFtZSkgOyAKKwkJCQkJYnJlYWsgOyAKKwkJCQljYXNlIDB4MDQ6CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBZGFwdGVyIG11c3QgYmUgb3BlbiBmb3IgdGhpcyBvcGVyYXRpb24sIGRvaCEhXG4iLGRldi0+bmFtZSkgOyAKKwkJCQkJYnJlYWsgOyAKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhayA7IAorCQkJfSAvKiBzd2l0Y2ggc3JiWzJdICovCisJCQlicmVhayA7IAorCQorCQkvKiBTUkJfUkVBRF9MT0cgLSBSZWFkIGFuZCByZXNldCB0aGUgYWRhcHRlciBlcnJvciBjb3VudGVycworIAkJICovCisKKwkJY2FzZSBTUkJfUkVBRF9MT0c6CisJCQlzd2l0Y2ggKHJlYWRiKHNyYisyKSkgeyAKKwkJCQljYXNlIDB4MDA6IAorCQkJCQlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX21lc3NhZ2VfbGV2ZWwpIAorCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlYWQgTG9nIGlzc3VlZFxuIixkZXYtPm5hbWUpIDsgCisJCQkJCWJyZWFrIDsgCisJCQkJY2FzZSAweDAxOgorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5yZWNvZ25pemVkIHNyYiBjb21tYW5kIFxuIixkZXYtPm5hbWUpIDsgCisJCQkJCWJyZWFrIDsgCisJCQkJY2FzZSAweDA0OgorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciBtdXN0IGJlIG9wZW4gZm9yIHRoaXMgb3BlcmF0aW9uLCBkb2ghIVxuIixkZXYtPm5hbWUpIDsgCisJCQkJCWJyZWFrIDsgCisJCQkKKwkJCX0gLyogc3dpdGNoIHNyYlsyXSAqLworCQkJYnJlYWsgOyAKKwkJCisJCS8qIFNSQl9SRUFEX1NSX0NPVU5URVJTIC0gUmVhZCBhbmQgcmVzZXQgdGhlIHNvdXJjZSByb3V0aW5nIGJyaWRnZSByZWxhdGVkIGNvdW50ZXJzICovCisKKwkJY2FzZSBTUkJfUkVBRF9TUl9DT1VOVEVSUzoKKwkJCXN3aXRjaCAocmVhZGIoc3JiKzIpKSB7IAorCQkJCWNhc2UgMHgwMDogCisJCQkJCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbWVzc2FnZV9sZXZlbCkgCisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVhZCBTb3VyY2UgUm91dGluZyBDb3VudGVycyBpc3N1ZWRcbiIsZGV2LT5uYW1lKSA7IAorCQkJCQlicmVhayA7IAorCQkJCWNhc2UgMHgwMToKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBzcmIgY29tbWFuZCBcbiIsZGV2LT5uYW1lKSA7IAorCQkJCQlicmVhayA7IAorCQkJCWNhc2UgMHgwNDoKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEFkYXB0ZXIgbXVzdCBiZSBvcGVuIGZvciB0aGlzIG9wZXJhdGlvbiwgZG9oISFcbiIsZGV2LT5uYW1lKSA7IAorCQkJCQlicmVhayA7IAorCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrIDsgCisJCQl9IC8qIHN3aXRjaCBzcmJbMl0gKi8KKwkJCWJyZWFrIDsKKyAKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbnJlY29nbml6ZWQgc3JiIGJoIHJldHVybiB2YWx1ZS5cbiIsZGV2LT5uYW1lKTsKKwkJCWJyZWFrIDsgCisJfSAvKiBzd2l0Y2ggc3JiWzBdICovCisKK30gCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqIG9seW1waWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2IDsKKwlvbHltcGljX3ByaXY9KHN0cnVjdCBvbHltcGljX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXJldHVybiAoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikgJm9seW1waWNfcHJpdi0+b2x5bXBpY19zdGF0czsgCit9CisKK3N0YXRpYyBpbnQgb2x5bXBpY19zZXRfbWFjX2FkZHJlc3MgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpIAoreworCXN0cnVjdCBzb2NrYWRkciAqc2FkZHIgPSBhZGRyIDsgCisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2ID0gKHN0cnVjdCBvbHltcGljX3ByaXZhdGUgKilkZXYtPnByaXYgOyAKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsgCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW5ub3Qgc2V0IG1hYy9sYWEgYWRkcmVzcyB3aGlsZSBjYXJkIGlzIG9wZW5cbiIsIGRldi0+bmFtZSkgOyAKKwkJcmV0dXJuIC1FSU8gOyAKKwl9CisKKwltZW1jcHkob2x5bXBpY19wcml2LT5vbHltcGljX2xhYSwgc2FkZHItPnNhX2RhdGEsZGV2LT5hZGRyX2xlbikgOyAKKwkKKwlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX21lc3NhZ2VfbGV2ZWwpIHsgCisgCQlwcmludGsoS0VSTl9JTkZPICIlczogTUFDL0xBQSBTZXQgdG8gID0gJXguJXguJXguJXguJXguJXhcbiIsZGV2LT5uYW1lLCBvbHltcGljX3ByaXYtPm9seW1waWNfbGFhWzBdLAorCQlvbHltcGljX3ByaXYtPm9seW1waWNfbGFhWzFdLCBvbHltcGljX3ByaXYtPm9seW1waWNfbGFhWzJdLAorCQlvbHltcGljX3ByaXYtPm9seW1waWNfbGFhWzNdLCBvbHltcGljX3ByaXYtPm9seW1waWNfbGFhWzRdLAorCQlvbHltcGljX3ByaXYtPm9seW1waWNfbGFhWzVdKTsKKwl9IAorCisJcmV0dXJuIDAgOyAKK30KKworc3RhdGljIHZvaWQgb2x5bXBpY19hcmJfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2ID0gKHN0cnVjdCBvbHltcGljX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXU4IF9faW9tZW0gKm9seW1waWNfbW1pbz1vbHltcGljX3ByaXYtPm9seW1waWNfbW1pbzsKKwl1OCBfX2lvbWVtICphcmJfYmxvY2ssICphc2JfYmxvY2ssICpzcmIgIDsgCisJdTggaGVhZGVyX2xlbiA7IAorCXUxNiBmcmFtZV9sZW4sIGJ1ZmZlcl9sZW4gOworCXN0cnVjdCBza19idWZmICptYWNfZnJhbWUgOyAgCisJdTggX19pb21lbSAqYnVmX3B0ciA7CisJdTggX19pb21lbSAqZnJhbWVfZGF0YSA7ICAKKwl1MTYgYnVmZl9vZmYgOyAKKwl1MTYgbGFuX3N0YXR1cyA9IDAsIGxhbl9zdGF0dXNfZGlmZiAgOyAvKiBJbml0aWFsaXplIHRvIHN0b3AgY29tcGlsZXIgd2FybmluZyAqLworCXU4IGZkeF9wcm90X2Vycm9yIDsgCisJdTE2IG5leHRfcHRyOworCisJYXJiX2Jsb2NrID0gKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgKyBvbHltcGljX3ByaXYtPmFyYikgOyAKKwlhc2JfYmxvY2sgPSAob2x5bXBpY19wcml2LT5vbHltcGljX2xhcCArIG9seW1waWNfcHJpdi0+YXNiKSA7IAorCXNyYiA9IChvbHltcGljX3ByaXYtPm9seW1waWNfbGFwICsgb2x5bXBpY19wcml2LT5zcmIpIDsgCisJCisJaWYgKHJlYWRiKGFyYl9ibG9jayswKSA9PSBBUkJfUkVDRUlWRV9EQVRBKSB7IC8qIFJlY2VpdmUuZGF0YSwgTUFDIGZyYW1lcyAqLworCisJCWhlYWRlcl9sZW4gPSByZWFkYihhcmJfYmxvY2srOCkgOyAvKiA4MDIuNSBUb2tlbi1SaW5nIEhlYWRlciBMZW5ndGggKi8JCisJCWZyYW1lX2xlbiA9IHN3YWIxNihyZWFkdyhhcmJfYmxvY2sgKyAxMCkpIDsgCisKKwkJYnVmZl9vZmYgPSBzd2FiMTYocmVhZHcoYXJiX2Jsb2NrICsgNikpIDsKKwkJCisJCWJ1Zl9wdHIgPSBvbHltcGljX3ByaXYtPm9seW1waWNfbGFwICsgYnVmZl9vZmYgOyAKKworI2lmIE9MWU1QSUNfREVCVUcKK3sKKwkJaW50IGk7CisJCWZyYW1lX2RhdGEgPSBidWZfcHRyK29mZnNldG9mKHN0cnVjdCBtYWNfcmVjZWl2ZV9idWZmZXIsZnJhbWVfZGF0YSkgOyAKKworCQlmb3IgKGk9MCA7ICBpIDwgMTQgOyBpKyspIHsgCisJCQlwcmludGsoIkxvYyAlZCA9ICUwMnhcbiIsaSxyZWFkYihmcmFtZV9kYXRhICsgaSkpOyAKKwkJfQorCisJCXByaW50aygibmV4dCAlMDR4LCBmcyAlMDJ4LCBsZW4gJTA0eCBcbiIscmVhZHcoYnVmX3B0citvZmZzZXRvZihzdHJ1Y3QgbWFjX3JlY2VpdmVfYnVmZmVyLG5leHQpKSwgcmVhZGIoYnVmX3B0citvZmZzZXRvZihzdHJ1Y3QgbWFjX3JlY2VpdmVfYnVmZmVyLGZyYW1lX3N0YXR1cykpLCByZWFkdyhidWZfcHRyK29mZnNldG9mKHN0cnVjdCBtYWNfcmVjZWl2ZV9idWZmZXIsYnVmZmVyX2xlbmd0aCkpKTsgCit9CisjZW5kaWYgCisJCW1hY19mcmFtZSA9IGRldl9hbGxvY19za2IoZnJhbWVfbGVuKSA7IAorCQlpZiAoIW1hY19mcmFtZSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBmcmFtZS5cbiIsIGRldi0+bmFtZSk7CisJCQlnb3RvIGRyb3BfZnJhbWU7CisJCX0KKworCQkvKiBXYWxrIHRoZSBidWZmZXIgY2hhaW4sIGNyZWF0aW5nIHRoZSBmcmFtZSAqLworCisJCWRvIHsKKwkJCWZyYW1lX2RhdGEgPSBidWZfcHRyK29mZnNldG9mKHN0cnVjdCBtYWNfcmVjZWl2ZV9idWZmZXIsZnJhbWVfZGF0YSkgOyAKKwkJCWJ1ZmZlcl9sZW4gPSBzd2FiMTYocmVhZHcoYnVmX3B0citvZmZzZXRvZihzdHJ1Y3QgbWFjX3JlY2VpdmVfYnVmZmVyLGJ1ZmZlcl9sZW5ndGgpKSk7IAorCQkJbWVtY3B5X2Zyb21pbyhza2JfcHV0KG1hY19mcmFtZSwgYnVmZmVyX2xlbiksIGZyYW1lX2RhdGEgLCBidWZmZXJfbGVuICkgOworCQkJbmV4dF9wdHI9cmVhZHcoYnVmX3B0citvZmZzZXRvZihzdHJ1Y3QgbWFjX3JlY2VpdmVfYnVmZmVyLG5leHQpKTsgCisJCX0gd2hpbGUgKG5leHRfcHRyICYmIChidWZfcHRyPW9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgKyBudG9ocyhuZXh0X3B0cikpKTsKKworCQlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX25ldHdvcmtfbW9uaXRvcikgeyAKKwkJCXN0cnVjdCB0cmhfaGRyICptYWNfaGRyIDsgCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZWQgTUFDIEZyYW1lLCBkZXRhaWxzOiBcbiIsZGV2LT5uYW1lKSA7CisJCQltYWNfaGRyID0gKHN0cnVjdCB0cmhfaGRyICopbWFjX2ZyYW1lLT5kYXRhIDsgCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTUFDIEZyYW1lIERlc3QuIEFkZHI6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IFxuIiwgZGV2LT5uYW1lICwgbWFjX2hkci0+ZGFkZHJbMF0sIG1hY19oZHItPmRhZGRyWzFdLCBtYWNfaGRyLT5kYWRkclsyXSwgbWFjX2hkci0+ZGFkZHJbM10sIG1hY19oZHItPmRhZGRyWzRdLCBtYWNfaGRyLT5kYWRkcls1XSkgOyAKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNQUMgRnJhbWUgU3JjZS4gQWRkcjogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggXG4iLCBkZXYtPm5hbWUgLCBtYWNfaGRyLT5zYWRkclswXSwgbWFjX2hkci0+c2FkZHJbMV0sIG1hY19oZHItPnNhZGRyWzJdLCBtYWNfaGRyLT5zYWRkclszXSwgbWFjX2hkci0+c2FkZHJbNF0sIG1hY19oZHItPnNhZGRyWzVdKSA7IAorCQl9CisJCW1hY19mcmFtZS0+ZGV2ID0gZGV2IDsgCisJCW1hY19mcmFtZS0+cHJvdG9jb2wgPSB0cl90eXBlX3RyYW5zKG1hY19mcmFtZSxkZXYpOworCQluZXRpZl9yeChtYWNfZnJhbWUpIDsgCQorCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCitkcm9wX2ZyYW1lOgorCQkvKiBOb3cgdGVsbCB0aGUgY2FyZCB3ZSBoYXZlIGRlYWx0IHdpdGggdGhlIHJlY2VpdmVkIGZyYW1lICovCisKKwkJLyogU2V0IExJU1IgQml0IDEgKi8KKwkJd3JpdGVsKExJU1JfQVJCX0ZSRUUsb2x5bXBpY19wcml2LT5vbHltcGljX21taW8gKyBMSVNSX1NVTSk7CisKKwkJLyogSXMgdGhlIEFTQiBmcmVlID8gKi8gCQorCQkKKwkJaWYgKHJlYWRiKGFzYl9ibG9jayArIDIpICE9IDB4ZmYpIHsgCisJCQlvbHltcGljX3ByaXYtPmFzYl9xdWV1ZWQgPSAxIDsgCisJCQl3cml0ZWwoTElTUl9BU0JfRlJFRV9SRVEsb2x5bXBpY19wcml2LT5vbHltcGljX21taW8rTElTUl9TVU0pOyAKKwkJCXJldHVybiA7IAkKKwkJCS8qIERyb3Agb3V0IGFuZCB3YWl0IGZvciB0aGUgYm90dG9tIGhhbGYgdG8gYmUgcnVuICovCisJCX0KKwkJCisJCXdyaXRlYihBU0JfUkVDRUlWRV9EQVRBLGFzYl9ibG9jayk7IC8qIFJlY2VpdmUgZGF0YSAqLworCQl3cml0ZWIoT0xZTVBJQ19DTEVBUl9SRVRfQ09ERSxhc2JfYmxvY2srMik7IC8qIE5lY2Vzc2FyeSA/PyAqLworCQl3cml0ZWIocmVhZGIoYXJiX2Jsb2NrKzYpLGFzYl9ibG9jays2KTsgLyogTXVzdCBzZW5kIHRoZSBhZGRyZXNzIGJhY2sgdG8gdGhlIGFkYXB0ZXIgKi8KKwkJd3JpdGViKHJlYWRiKGFyYl9ibG9jays3KSxhc2JfYmxvY2srNyk7IC8qIFRvIGxldCBpdCBrbm93IHdlIGhhdmUgZGVhbHQgd2l0aCB0aGUgZGF0YSAqLwkJCisKKwkJd3JpdGVsKExJU1JfQVNCX1JFUExZIHwgTElTUl9BU0JfRlJFRV9SRVEsb2x5bXBpY19wcml2LT5vbHltcGljX21taW8rTElTUl9TVU0pOworCQkKKwkJb2x5bXBpY19wcml2LT5hc2JfcXVldWVkID0gMiA7IAorCQorCQlyZXR1cm4gOyAJCisJCQorCX0gZWxzZSBpZiAocmVhZGIoYXJiX2Jsb2NrKSA9PSBBUkJfTEFOX0NIQU5HRV9TVEFUVVMpIHsgLyogTGFuLmNoYW5nZS5zdGF0dXMgKi8KKwkJbGFuX3N0YXR1cyA9IHN3YWIxNihyZWFkdyhhcmJfYmxvY2srNikpOworCQlmZHhfcHJvdF9lcnJvciA9IHJlYWRiKGFyYl9ibG9jays4KSA7IAorCQkKKwkJLyogSXNzdWUgQVJCIEZyZWUgKi8KKwkJd3JpdGVsKExJU1JfQVJCX0ZSRUUsb2x5bXBpY19wcml2LT5vbHltcGljX21taW8rTElTUl9TVU0pOworCisJCWxhbl9zdGF0dXNfZGlmZiA9IG9seW1waWNfcHJpdi0+b2x5bXBpY19sYW5fc3RhdHVzIF4gbGFuX3N0YXR1cyA7IAorCisJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiAoTFNDX0xXRiB8IExTQ19BUlcgfCBMU0NfRlBFIHwgTFNDX1JSKSApIHsgCisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX0xXRikgCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBTaG9ydCBjaXJjdWl0IGRldGVjdGVkIG9uIHRoZSBsb2JlXG4iLGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX0FSVykgCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBdXRvIHJlbW92YWwgZXJyb3JcbiIsZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfRlBFKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRkRYIFByb3RvY29sIEVycm9yXG4iLGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1JSKSAKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEZvcmNlIHJlbW92ZSBNQUMgZnJhbWUgcmVjZWl2ZWRcbiIsZGV2LT5uYW1lKTsKKwkJCisJCQkvKiBBZGFwdGVyIGhhcyBiZWVuIGNsb3NlZCBieSB0aGUgaGFyZHdhcmUgKi8KKwkJCisJCQkvKiByZXNldCB0eC9yeCBmaWZvJ3MgYW5kIGJ1c21hc3RlciBsb2dpYyAqLworCisJCQl3cml0ZWwocmVhZGwob2x5bXBpY19tbWlvK0JDVEwpfCgzPDwxMyksb2x5bXBpY19tbWlvK0JDVEwpOworCQkJdWRlbGF5KDEpOworCQkJd3JpdGVsKHJlYWRsKG9seW1waWNfbW1pbytCQ1RMKSZ+KDM8PDEzKSxvbHltcGljX21taW8rQkNUTCk7CisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQlvbHltcGljX3ByaXYtPnNyYiA9IHJlYWR3KG9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgKyBMQVBXV08pIDsgCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciBoYXMgYmVlbiBjbG9zZWQgXG4iLCBkZXYtPm5hbWUpIDsgCisJCX0gLyogSWYgc2VyaW91cyBlcnJvciAqLworCQkKKwkJaWYgKG9seW1waWNfcHJpdi0+b2x5bXBpY19tZXNzYWdlX2xldmVsKSB7IAorCQkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19TSUdfTE9TUykgCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBObyByZWNlaXZlIHNpZ25hbCBkZXRlY3RlZCBcbiIsIGRldi0+bmFtZSkgOyAKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfSEFSRF9FUlIpCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBCZWFjb25pbmcgXG4iLGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1NPRlRfRVJSKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQWRhcHRlciB0cmFuc21pdHRlZCBTb2Z0IEVycm9yIFJlcG9ydCBNYWMgRnJhbWUgXG4iLGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1RSQU5fQkNOKSAKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFdlIGFyZSB0cmFubWl0dGluZyB0aGUgYmVhY29uLCBhYWFoXG4iLGRldi0+bmFtZSk7CisJCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX1NTKSAKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNpbmdsZSBTdGF0aW9uIG9uIHRoZSByaW5nIFxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfUklOR19SRUMpCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSaW5nIHJlY292ZXJ5IG9uZ29pbmdcbiIsZGV2LT5uYW1lKTsKKwkJCWlmIChsYW5fc3RhdHVzX2RpZmYgJiBMU0NfRkRYX01PREUpCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBPcGVyYXRpbmcgaW4gRkRYIG1vZGVcbiIsZGV2LT5uYW1lKTsKKwkJfSAJCisJCQorCQlpZiAobGFuX3N0YXR1c19kaWZmICYgTFNDX0NPKSB7IAorCQkJCQkKKwkJCQlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX21lc3NhZ2VfbGV2ZWwpIAorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ291bnRlciBPdmVyZmxvdyBcbiIsIGRldi0+bmFtZSk7CisJCQkJCQorCQkJCS8qIElzc3VlIFJFQUQuTE9HIGNvbW1hbmQgKi8KKworCQkJCXdyaXRlYihTUkJfUkVBRF9MT0csIHNyYik7CisJCQkJd3JpdGViKDAsc3JiKzEpOworCQkJCXdyaXRlYihPTFlNUElDX0NMRUFSX1JFVF9DT0RFLHNyYisyKTsKKwkJCQl3cml0ZWIoMCxzcmIrMyk7CisJCQkJd3JpdGViKDAsc3JiKzQpOworCQkJCXdyaXRlYigwLHNyYis1KTsKKwkJCQkJCisJCQkJb2x5bXBpY19wcml2LT5zcmJfcXVldWVkPTI7IC8qIENhbid0IHNsZWVwLCB1c2Ugc3JiX2JoICovCisKKwkJCQl3cml0ZWwoTElTUl9TUkJfQ01ELG9seW1waWNfbW1pbytMSVNSX1NVTSk7CisJCQkJCQorCQl9CisKKwkJaWYgKGxhbl9zdGF0dXNfZGlmZiAmIExTQ19TUl9DTykgeyAKKworCQkJCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbWVzc2FnZV9sZXZlbCkKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNvdXJjZSByb3V0aW5nIGNvdW50ZXJzIG92ZXJmbG93XG4iLCBkZXYtPm5hbWUpOworCisJCQkJLyogSXNzdWUgYSBSRUFELlNSLkNPVU5URVJTICovCisJCQkJCisJCQkJd3JpdGViKFNSQl9SRUFEX1NSX0NPVU5URVJTLHNyYik7CisJCQkJd3JpdGViKDAsc3JiKzEpOworCQkJCXdyaXRlYihPTFlNUElDX0NMRUFSX1JFVF9DT0RFLHNyYisyKTsKKwkJCQl3cml0ZWIoMCxzcmIrMyk7CisJCQkJCisJCQkJb2x5bXBpY19wcml2LT5zcmJfcXVldWVkPTI7IC8qIENhbid0IHNsZWVwLCB1c2Ugc3JiX2JoICovCisKKwkJCQl3cml0ZWwoTElTUl9TUkJfQ01ELG9seW1waWNfbW1pbytMSVNSX1NVTSk7CisKKwkJfQorCisJCW9seW1waWNfcHJpdi0+b2x5bXBpY19sYW5fc3RhdHVzID0gbGFuX3N0YXR1cyA7IAorCQorCX0gIC8qIExhbi5jaGFuZ2Uuc3RhdHVzICovCisJZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5rbm93biBhcmIgY29tbWFuZCBcbiIsIGRldi0+bmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIG9seW1waWNfYXNiX2JoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreworCXN0cnVjdCBvbHltcGljX3ByaXZhdGUgKm9seW1waWNfcHJpdiA9IChzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICopIGRldi0+cHJpdiA7IAorCXU4IF9faW9tZW0gKmFyYl9ibG9jaywgKmFzYl9ibG9jayA7IAorCisJYXJiX2Jsb2NrID0gKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYXAgKyBvbHltcGljX3ByaXYtPmFyYikgOyAKKwlhc2JfYmxvY2sgPSAob2x5bXBpY19wcml2LT5vbHltcGljX2xhcCArIG9seW1waWNfcHJpdi0+YXNiKSA7IAorCisJaWYgKG9seW1waWNfcHJpdi0+YXNiX3F1ZXVlZCA9PSAxKSB7ICAgLyogRHJvcHBlZCB0aHJvdWdoIHRoZSBmaXJzdCB0aW1lICovCisKKwkJd3JpdGViKEFTQl9SRUNFSVZFX0RBVEEsYXNiX2Jsb2NrKTsgLyogUmVjZWl2ZSBkYXRhICovCisJCXdyaXRlYihPTFlNUElDX0NMRUFSX1JFVF9DT0RFLGFzYl9ibG9jaysyKTsgLyogTmVjZXNzYXJ5ID8/ICovCisJCXdyaXRlYihyZWFkYihhcmJfYmxvY2srNiksYXNiX2Jsb2NrKzYpOyAvKiBNdXN0IHNlbmQgdGhlIGFkZHJlc3MgYmFjayB0byB0aGUgYWRhcHRlciAqLworCQl3cml0ZWIocmVhZGIoYXJiX2Jsb2NrKzcpLGFzYl9ibG9jays3KTsgLyogVG8gbGV0IGl0IGtub3cgd2UgaGF2ZSBkZWFsdCB3aXRoIHRoZSBkYXRhICovCQkKKworCQl3cml0ZWwoTElTUl9BU0JfUkVQTFkgfCBMSVNSX0FTQl9GUkVFX1JFUSxvbHltcGljX3ByaXYtPm9seW1waWNfbW1pbytMSVNSX1NVTSk7CisJCW9seW1waWNfcHJpdi0+YXNiX3F1ZXVlZCA9IDIgOyAKKworCQlyZXR1cm4gOyAKKwl9CisKKwlpZiAob2x5bXBpY19wcml2LT5hc2JfcXVldWVkID09IDIpIHsgCisJCXN3aXRjaCAocmVhZGIoYXNiX2Jsb2NrKzIpKSB7CisJCQljYXNlIDB4MDE6CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVucmVjb2duaXplZCBjb21tYW5kIGNvZGUgXG4iLCBkZXYtPm5hbWUpOworCQkJCWJyZWFrIDsKKwkJCWNhc2UgMHgyNjoKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5yZWNvZ25pemVkIGJ1ZmZlciBhZGRyZXNzIFxuIiwgZGV2LT5uYW1lKTsKKwkJCQlicmVhayA7CisJCQljYXNlIDB4RkY6CisJCQkJLyogVmFsaWQgcmVzcG9uc2UsIGV2ZXJ5dGhpbmcgc2hvdWxkIGJlIG9rIGFnYWluICovCisJCQkJYnJlYWsgOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSW52YWxpZCByZXR1cm4gY29kZSBpbiBhc2JcbiIsZGV2LT5uYW1lKTsKKwkJCQlicmVhayA7CisJCX0KKwl9CisJb2x5bXBpY19wcml2LT5hc2JfcXVldWVkID0gMCA7IAorfQorIAorc3RhdGljIGludCBvbHltcGljX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG10dSkgCit7CisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2ID0gKHN0cnVjdCBvbHltcGljX3ByaXZhdGUgKikgZGV2LT5wcml2OworCXUxNiBtYXhfbXR1IDsgCisKKwlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX3Jpbmdfc3BlZWQgPT0gNCkKKwkJbWF4X210dSA9IDQ1MDAgOyAKKwllbHNlCisJCW1heF9tdHUgPSAxODAwMCA7IAorCQorCWlmIChtdHUgPiBtYXhfbXR1KQorCQlyZXR1cm4gLUVJTlZBTCA7IAorCWlmIChtdHUgPCAxMDApIAorCQlyZXR1cm4gLUVJTlZBTCA7IAorCisJZGV2LT5tdHUgPSBtdHUgOyAKKwlvbHltcGljX3ByaXYtPnBrdF9idWZfc3ogPSBtdHUgKyBUUl9ITEVOIDsgCisKKwlyZXR1cm4gMCA7IAorfQorCitzdGF0aWMgaW50IG9seW1waWNfcHJvY19pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhIDsgCisJc3RydWN0IG9seW1waWNfcHJpdmF0ZSAqb2x5bXBpY19wcml2PShzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICopZGV2LT5wcml2OworCXU4IF9faW9tZW0gKm9hdCA9IChvbHltcGljX3ByaXYtPm9seW1waWNfbGFwICsgb2x5bXBpY19wcml2LT5vbHltcGljX2FkZHJfdGFibGVfYWRkcikgOyAKKwl1OCBfX2lvbWVtICpvcHQgPSAob2x5bXBpY19wcml2LT5vbHltcGljX2xhcCArIG9seW1waWNfcHJpdi0+b2x5bXBpY19wYXJtc19hZGRyKSA7IAorCWludCBzaXplID0gMCA7IAorCWludCBsZW49MDsKKwlvZmZfdCBiZWdpbj0wOworCW9mZl90IHBvcz0wOworCQorCXNpemUgPSBzcHJpbnRmKGJ1ZmZlciwgCisJCSJJQk0gUGl0L1BpdC1QaHkvT2x5bXBpYyBDaGlwc2V0IFRva2VuIFJpbmcgQWRhcHRlciAlc1xuIixkZXYtPm5hbWUpOworCXNpemUgKz0gc3ByaW50ZihidWZmZXIrc2l6ZSwgIlxuJTZzOiBBZGFwdGVyIEFkZHJlc3MgICA6IE5vZGUgQWRkcmVzcyAgICAgIDogRnVuY3Rpb25hbCBBZGRyXG4iLAorIAkgICBkZXYtPm5hbWUpOyAKKworCXNpemUgKz0gc3ByaW50ZihidWZmZXIrc2l6ZSwgIiU2czogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCA6ICUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJICAgZGV2LT5uYW1lLAorICAgICAgICAgICBkZXYtPmRldl9hZGRyWzBdLAorCSAgIGRldi0+ZGV2X2FkZHJbMV0sCisJICAgZGV2LT5kZXZfYWRkclsyXSwKKyAJICAgZGV2LT5kZXZfYWRkclszXSwKKwkgICBkZXYtPmRldl9hZGRyWzRdLAorCSAgIGRldi0+ZGV2X2FkZHJbNV0sCisJICAgcmVhZGIob2F0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSxub2RlX2FkZHIpKSwgCisJICAgcmVhZGIob2F0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSxub2RlX2FkZHIpKzEpLAorCSAgIHJlYWRiKG9hdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19hZGFwdGVyX2FkZHJfdGFibGUsbm9kZV9hZGRyKSsyKSwKKwkgICByZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLG5vZGVfYWRkcikrMyksCisJICAgcmVhZGIob2F0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSxub2RlX2FkZHIpKzQpLAorCSAgIHJlYWRiKG9hdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19hZGFwdGVyX2FkZHJfdGFibGUsbm9kZV9hZGRyKSs1KSwKKwkgICByZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLGZ1bmNfYWRkcikpLCAKKwkgICByZWFkYihvYXQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfYWRhcHRlcl9hZGRyX3RhYmxlLGZ1bmNfYWRkcikrMSksCisJICAgcmVhZGIob2F0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSxmdW5jX2FkZHIpKzIpLAorCSAgIHJlYWRiKG9hdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19hZGFwdGVyX2FkZHJfdGFibGUsZnVuY19hZGRyKSszKSk7CisJIAorCXNpemUgKz0gc3ByaW50ZihidWZmZXIrc2l6ZSwgIlxuJTZzOiBUb2tlbiBSaW5nIFBhcmFtZXRlcnMgVGFibGU6XG4iLCBkZXYtPm5hbWUpOworCisJc2l6ZSArPSBzcHJpbnRmKGJ1ZmZlcitzaXplLCAiJTZzOiBQaHlzaWNhbCBBZGRyIDogVXAgTm9kZSBBZGRyZXNzICAgOiBQb2xsIEFkZHJlc3MgICAgICA6IEFjY1ByaSA6IEF1dGggU3JjIDogQXR0IENvZGUgOlxuIiwKKwkgIGRldi0+bmFtZSkgOyAKKwkgICAKKwlzaXplICs9IHNwcmludGYoYnVmZmVyK3NpemUsICIlNnM6ICUwMng6JTAyeDolMDJ4OiUwMnggICA6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IDogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggOiAlMDR4ICAgOiAlMDR4ICAgICA6ICAlMDR4ICAgIDpcbiIsCisJICBkZXYtPm5hbWUsCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgcGh5c19hZGRyKSksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgcGh5c19hZGRyKSsxKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBwaHlzX2FkZHIpKzIpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHBoeXNfYWRkcikrMyksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgdXBfbm9kZV9hZGRyKSksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgdXBfbm9kZV9hZGRyKSsxKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCB1cF9ub2RlX2FkZHIpKzIpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHVwX25vZGVfYWRkcikrMyksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgdXBfbm9kZV9hZGRyKSs0KSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCB1cF9ub2RlX2FkZHIpKzUpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHBvbGxfYWRkcikpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHBvbGxfYWRkcikrMSksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgcG9sbF9hZGRyKSsyKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBwb2xsX2FkZHIpKzMpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHBvbGxfYWRkcikrNCksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgcG9sbF9hZGRyKSs1KSwKKwkgIHN3YWIxNihyZWFkdyhvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgYWNjX3ByaW9yaXR5KSkpLAorCSAgc3dhYjE2KHJlYWR3KG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBhdXRoX3NvdXJjZV9jbGFzcykpKSwKKwkgIHN3YWIxNihyZWFkdyhvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgYXR0X2NvZGUpKSkpOworCisJc2l6ZSArPSBzcHJpbnRmKGJ1ZmZlcitzaXplLCAiJTZzOiBTb3VyY2UgQWRkcmVzcyAgICA6IEJjbiBUIDogTWFqLiBWIDogTGFuIFN0IDogTGNsIFJnIDogTW9uIEVyciA6IEZyYW1lIENvcnJlbCA6IFxuIiwKKwkgIGRldi0+bmFtZSkgOyAKKwkKKwlzaXplICs9IHNwcmludGYoYnVmZmVyK3NpemUsICIlNnM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IDogJTA0eCAgOiAlMDR4ICAgOiAlMDR4ICAgOiAlMDR4ICAgOiAlMDR4ICAgIDogICAgICUwNHggICAgIDogXG4iLAorCSAgZGV2LT5uYW1lLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHNvdXJjZV9hZGRyKSksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgc291cmNlX2FkZHIpKzEpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHNvdXJjZV9hZGRyKSsyKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBzb3VyY2VfYWRkcikrMyksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgc291cmNlX2FkZHIpKzQpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIHNvdXJjZV9hZGRyKSs1KSwKKwkgIHN3YWIxNihyZWFkdyhvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgYmVhY29uX3R5cGUpKSksCisJICBzd2FiMTYocmVhZHcob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIG1ham9yX3ZlY3RvcikpKSwKKwkgIHN3YWIxNihyZWFkdyhvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgbGFuX3N0YXR1cykpKSwKKwkgIHN3YWIxNihyZWFkdyhvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgbG9jYWxfcmluZykpKSwKKwkgIHN3YWIxNihyZWFkdyhvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgbW9uX2Vycm9yKSkpLAorCSAgc3dhYjE2KHJlYWR3KG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBmcmFtZV9jb3JyZWwpKSkpOworCisJc2l6ZSArPSBzcHJpbnRmKGJ1ZmZlcitzaXplLCAiJTZzOiBCZWFjb24gRGV0YWlscyA6ICBUeCAgOiAgUnggIDogTkFVTiBOb2RlIEFkZHJlc3MgOiBOQVVOIE5vZGUgUGh5cyA6IFxuIiwKKwkgIGRldi0+bmFtZSkgOyAKKworCXNpemUgKz0gc3ByaW50ZihidWZmZXIrc2l6ZSwgIiU2czogICAgICAgICAgICAgICAgOiAgJTAyeCAgOiAgJTAyeCAgOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCA6ICUwMng6JTAyeDolMDJ4OiUwMnggICAgOiBcbiIsCisJICBkZXYtPm5hbWUsCisJICBzd2FiMTYocmVhZHcob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIGJlYWNvbl90cmFuc21pdCkpKSwKKwkgIHN3YWIxNihyZWFkdyhvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgYmVhY29uX3JlY2VpdmUpKSksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgYmVhY29uX25hdW4pKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBiZWFjb25fbmF1bikrMSksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgYmVhY29uX25hdW4pKzIpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIGJlYWNvbl9uYXVuKSszKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBiZWFjb25fbmF1bikrNCksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgYmVhY29uX25hdW4pKzUpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIGJlYWNvbl9waHlzKSksCisJICByZWFkYihvcHQrb2Zmc2V0b2Yoc3RydWN0IG9seW1waWNfcGFyYW1ldGVyc190YWJsZSwgYmVhY29uX3BoeXMpKzEpLAorCSAgcmVhZGIob3B0K29mZnNldG9mKHN0cnVjdCBvbHltcGljX3BhcmFtZXRlcnNfdGFibGUsIGJlYWNvbl9waHlzKSsyKSwKKwkgIHJlYWRiKG9wdCtvZmZzZXRvZihzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlLCBiZWFjb25fcGh5cykrMykpOworCisJbGVuPXNpemU7CisJcG9zPWJlZ2luK3NpemU7CisJaWYgKHBvczxvZmZzZXQpIHsKKwkJbGVuPTA7CisJCWJlZ2luPXBvczsKKwl9CisJKnN0YXJ0PWJ1ZmZlcisob2Zmc2V0LWJlZ2luKTsJLyogU3RhcnQgb2Ygd2FudGVkIGRhdGEgKi8KKwlsZW4tPShvZmZzZXQtYmVnaW4pOwkJLyogU3RhcnQgc2xvcCAqLworCWlmKGxlbj5sZW5ndGgpCisJCWxlbj1sZW5ndGg7CQkvKiBFbmRpbmcgc2xvcCAqLworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBvbHltcGljX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpIAoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldikgOyAKKwlzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlICpvbHltcGljX3ByaXY9KHN0cnVjdCBvbHltcGljX3ByaXZhdGUgKilkZXYtPnByaXY7CisKKwlpZiAob2x5bXBpY19wcml2LT5vbHltcGljX25ldHdvcmtfbW9uaXRvcikgeyAKKwkJY2hhciBwcm9jX25hbWVbMjBdIDsgCisJCXN0cmNweShwcm9jX25hbWUsIm5ldC9vbHltcGljXyIpIDsgCisJCXN0cmNhdChwcm9jX25hbWUsZGV2LT5uYW1lKSA7CisJCXJlbW92ZV9wcm9jX2VudHJ5KHByb2NfbmFtZSxOVUxMKTsgCisJfQorCXVucmVnaXN0ZXJfbmV0ZGV2KGRldikgOyAKKwlpb3VubWFwKG9seW1waWNfcHJpdi0+b2x5bXBpY19tbWlvKSA7IAorCWlvdW5tYXAob2x5bXBpY19wcml2LT5vbHltcGljX2xhcCkgOyAKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpIDsKKwlwY2lfc2V0X2RydmRhdGEocGRldixOVUxMKSA7ICAJCisJZnJlZV9uZXRkZXYoZGV2KSA7IAorfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgb2x5bXBpY19kcml2ZXIgPSB7IAorCS5uYW1lCQk9ICJvbHltcGljIiwKKwkuaWRfdGFibGUJPSBvbHltcGljX3BjaV90YmwsCisJLnByb2JlCQk9IG9seW1waWNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChvbHltcGljX3JlbW92ZV9vbmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgb2x5bXBpY19wY2lfaW5pdCh2b2lkKSAKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0ICgmb2x5bXBpY19kcml2ZXIpIDsgCit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvbHltcGljX3BjaV9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZvbHltcGljX2RyaXZlcikgOyAKK30JCisKKworbW9kdWxlX2luaXQob2x5bXBpY19wY2lfaW5pdCkgOyAKK21vZHVsZV9leGl0KG9seW1waWNfcGNpX2NsZWFudXApIDsgCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9vbHltcGljLmggYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvb2x5bXBpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYzU5YzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvb2x5bXBpYy5oCkBAIC0wLDAgKzEsMzIyIEBACisvKgorICogIG9seW1waWMuaCAoYykgMTk5OSBQZXRlciBEZSBTY2hyaWp2ZXIgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICAgICAgICAgICAgICAgMTk5OSwyMDAwIE1pa2UgUGhpbGxpcHMgKG1pa2VwQGxpbnV4dHIubmV0KQorICoKKyAqICBMaW51eCBkcml2ZXIgZm9yIElCTSBQQ0kgdG9rZW5yaW5nIGNhcmRzIGJhc2VkIG9uIHRoZSBvbHltcGljIGFuZCB0aGUgUElUL1BIWSBjaGlwc2V0LgorICoKKyAqICBCYXNlIERyaXZlciBTa2VsZXRvbjoKKyAqICAgICAgV3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgKiAgICAgIERpcmVjdG9yLCBOYXRpb25hbCBTZWN1cml0eSBBZ2VuY3kuCisgKgorICogIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICovCisKKyNkZWZpbmUgQ0lEIDB4NGUKKworI2RlZmluZSBCQ1RMIDB4NzAKKyNkZWZpbmUgQkNUTF9TT0ZUUkVTRVQgKDE8PDE1KQorI2RlZmluZSBCQ1RMX01JTVJFQiAoMTw8NikKKyNkZWZpbmUgQkNUTF9NT0RFX0lORElDQVRPUiAoMTw8NSkKKworI2RlZmluZSBHUFIgMHg0YQorI2RlZmluZSBHUFJfT1BUSV9CRiAoMTw8NikKKyNkZWZpbmUgR1BSX05FUFRVTkVfQkYgKDE8PDQpIAorI2RlZmluZSBHUFJfQVVUT1NFTlNFICgxPDwyKQorI2RlZmluZSBHUFJfMTZNQlBTICgxPDwzKSAKKworI2RlZmluZSBQQUcgMHg4NQorI2RlZmluZSBMQkMgMHg4ZQorCisjZGVmaW5lIExJU1IgMHgxMAorI2RlZmluZSBMSVNSX1NVTSAweDE0CisjZGVmaW5lIExJU1JfUldNIDB4MTgKKworI2RlZmluZSBMSVNSX0xJRSAoMTw8MTUpCisjZGVmaW5lIExJU1JfU0xJTSAoMTw8MTMpCisjZGVmaW5lIExJU1JfU0xJICgxPDwxMikKKyNkZWZpbmUgTElTUl9QQ01TUk1BU0sgKDE8PDExKQorI2RlZmluZSBMSVNSX1BDTVNSSU5UICgxPDwxMCkKKyNkZWZpbmUgTElTUl9XT0xNQVNLICgxPDw5KQorI2RlZmluZSBMSVNSX1dPTCAoMTw8OCkKKyNkZWZpbmUgTElTUl9TUkJfQ01EICgxPDw1KQorI2RlZmluZSBMSVNSX0FTQl9SRVBMWSAoMTw8NCkKKyNkZWZpbmUgTElTUl9BU0JfRlJFRV9SRVEgKDE8PDIpCisjZGVmaW5lIExJU1JfQVJCX0ZSRUUgKDE8PDEpCisjZGVmaW5lIExJU1JfVFJCX0ZSQU1FICgxPDwwKQorCisjZGVmaW5lIFNJU1IgMHgyMAorI2RlZmluZSBTSVNSX1NVTSAweDI0CisjZGVmaW5lIFNJU1JfUldNIDB4MjgKKyNkZWZpbmUgU0lTUl9SUiAweDJDCisjZGVmaW5lIFNJU1JfUkVTTUFTSyAweDMwCisjZGVmaW5lIFNJU1JfTUFTSyAweDU0CisjZGVmaW5lIFNJU1JfTUFTS19TVU0gMHg1OAorI2RlZmluZSBTSVNSX01BU0tfUldNIDB4NUMKKworI2RlZmluZSBTSVNSX1RYMl9JRExFICgxPDwzMSkKKyNkZWZpbmUgU0lTUl9UWDJfSEFMVCAoMTw8MjkpCisjZGVmaW5lIFNJU1JfVFgyX0VPRiAoMTw8MjgpCisjZGVmaW5lIFNJU1JfVFgxX0lETEUgKDE8PDI3KQorI2RlZmluZSBTSVNSX1RYMV9IQUxUICgxPDwyNSkKKyNkZWZpbmUgU0lTUl9UWDFfRU9GICgxPDwyNCkKKyNkZWZpbmUgU0lTUl9USU1FT1VUICgxPDwyMykKKyNkZWZpbmUgU0lTUl9SWF9OT0JVRiAoMTw8MjIpCisjZGVmaW5lIFNJU1JfUlhfU1RBVFVTICgxPDwyMSkKKyNkZWZpbmUgU0lTUl9SWF9IQUxUICgxPDwxOCkKKyNkZWZpbmUgU0lTUl9SWF9FT0ZfRUFSTFkgKDE8PDE2KQorI2RlZmluZSBTSVNSX01JICgxPDwxNSkKKyNkZWZpbmUgU0lTUl9QSSAoMTw8MTMpCisjZGVmaW5lIFNJU1JfRVJSICgxPDw5KQorI2RlZmluZSBTSVNSX0FEQVBURVJfQ0hFQ0sgKDE8PDYpCisjZGVmaW5lIFNJU1JfU1JCX1JFUExZICgxPDw1KQorI2RlZmluZSBTSVNSX0FTQl9GUkVFICgxPDw0KQorI2RlZmluZSBTSVNSX0FSQl9DTUQgKDE8PDMpCisjZGVmaW5lIFNJU1JfVFJCX1JFUExZICgxPDwyKQorCisjZGVmaW5lIEVJU1IgMHgzNAorI2RlZmluZSBFSVNSX1JXTSAweDM4CisjZGVmaW5lIEVJU1JfTUFTSyAweDNjCisjZGVmaW5lIEVJU1JfTUFTS19PUFRJT05TIDB4MDAxRkZGN0YKKworI2RlZmluZSBMQVBBIDB4NjAKKyNkZWZpbmUgTEFQV1dPIDB4NjQKKyNkZWZpbmUgTEFQV1dDIDB4NjgKKyNkZWZpbmUgTEFQQ1RMIDB4NkMKKyNkZWZpbmUgTEFJUEQgMHg3OAorI2RlZmluZSBMQUlQRERJTkMgMHg3QworCisjZGVmaW5lIFRJTUVSIDB4NTAKKworI2RlZmluZSBDTEtDVEwgMHg3NAorI2RlZmluZSBDTEtDVExfUEFVU0UgKDE8PDE1KSAKKworI2RlZmluZSBQTV9DT04gMHg0CisKKyNkZWZpbmUgQk1DVExfU1VNIDB4NDAKKyNkZWZpbmUgQk1DVExfUldNIDB4NDQKKyNkZWZpbmUgQk1DVExfVFgyX0RJUyAoMTw8MzApIAorI2RlZmluZSBCTUNUTF9UWDFfRElTICgxPDwyNikgCisjZGVmaW5lIEJNQ1RMX1JYX0RJUyAoMTw8MjIpIAorCisjZGVmaW5lIEJNQVNSIDB4Y2MKKworI2RlZmluZSBSWERFU0NRIDB4OTAKKyNkZWZpbmUgUlhERVNDUUNOVCAweDk0CisjZGVmaW5lIFJYQ0RBIDB4OTgKKyNkZWZpbmUgUlhFTlEgMHg5QworI2RlZmluZSBSWFNUQVRRIDB4QTAKKyNkZWZpbmUgUlhTVEFUUUNOVCAweEE0CisjZGVmaW5lIFJYQ1NBIDB4QTgKKyNkZWZpbmUgUlhDTEVOIDB4QUMKKyNkZWZpbmUgUlhITEVOIDB4QUUKKworI2RlZmluZSBUWERFU0NRXzEgMHhiMAorI2RlZmluZSBUWERFU0NRXzIgMHhkMAorI2RlZmluZSBUWERFU0NRQ05UXzEgMHhiNAorI2RlZmluZSBUWERFU0NRQ05UXzIgMHhkNAorI2RlZmluZSBUWENEQV8xIDB4YjgKKyNkZWZpbmUgVFhDREFfMiAweGQ4CisjZGVmaW5lIFRYRU5RXzEgMHhiYworI2RlZmluZSBUWEVOUV8yIDB4ZGMKKyNkZWZpbmUgVFhTVEFUUV8xIDB4YzAKKyNkZWZpbmUgVFhTVEFUUV8yIDB4ZTAKKyNkZWZpbmUgVFhTVEFUUUNOVF8xIDB4YzQKKyNkZWZpbmUgVFhTVEFUUUNOVF8yIDB4ZTQKKyNkZWZpbmUgVFhDU0FfMSAweGM4CisjZGVmaW5lIFRYQ1NBXzIgMHhlOAorLyogQ2FyZGJ1cyAqLworI2RlZmluZSBGRVJNQVNLIDB4ZjQKKyNkZWZpbmUgRkVSTUFTS19JTlRfQklUICgxPDwxNSkKKworI2RlZmluZSBPTFlNUElDX0lPX1NQQUNFIDI1NgorCisjZGVmaW5lIFNSQl9DT01NQU5EX1NJWkUgNTAKKworI2RlZmluZSBPTFlNUElDX01BWF9BREFQVEVSUyA4IC8qIDB4MDggX19NT0RVTEVfU1RSSU5HIGNhbid0IGhhbmQgMHhubiAqLworCisvKiBEZWZpbmVzIGZvciBMQU4gU1RBVFVTIENIQU5HRSByZXBvcnRzICovCisjZGVmaW5lIExTQ19TSUdfTE9TUyAweDgwMDAKKyNkZWZpbmUgTFNDX0hBUkRfRVJSIDB4NDAwMAorI2RlZmluZSBMU0NfU09GVF9FUlIgMHgyMDAwCisjZGVmaW5lIExTQ19UUkFOX0JDTiAweDEwMDAKKyNkZWZpbmUgTFNDX0xXRiAgICAgIDB4MDgwMAorI2RlZmluZSBMU0NfQVJXICAgICAgMHgwNDAwCisjZGVmaW5lIExTQ19GUEUgICAgICAweDAyMDAKKyNkZWZpbmUgTFNDX1JSICAgICAgIDB4MDEwMAorI2RlZmluZSBMU0NfQ08gICAgICAgMHgwMDgwCisjZGVmaW5lIExTQ19TUyAgICAgICAweDAwNDAKKyNkZWZpbmUgTFNDX1JJTkdfUkVDIDB4MDAyMAorI2RlZmluZSBMU0NfU1JfQ08gICAgMHgwMDEwCisjZGVmaW5lIExTQ19GRFhfTU9ERSAweDAwMDQKKworLyogRGVmaW5lcyBmb3IgT1BFTiBBREFQVEVSIGNvbW1hbmQgKi8KKworI2RlZmluZSBPUEVOX0FEQVBURVJfRVhUX1dSQVAgKDE8PDE1KQorI2RlZmluZSBPUEVOX0FEQVBURVJfRElTX0hBUkRFRSAoMTw8MTQpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9ESVNfU09GVEVSUiAoMTw8MTMpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9QQVNTX0FEQ19NQUMgKDE8PDEyKQorI2RlZmluZSBPUEVOX0FEQVBURVJfUEFTU19BVFRfTUFDICgxPDwxMSkKKyNkZWZpbmUgT1BFTl9BREFQVEVSX0VOQUJMRV9FQyAoMTw8MTApCisjZGVmaW5lIE9QRU5fQURBUFRFUl9DT05URU5ERVIgKDE8PDgpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9QQVNTX0JFQUNPTiAoMTw8NykKKyNkZWZpbmUgT1BFTl9BREFQVEVSX0VOQUJMRV9GRFggKDE8PDYpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9FTkFCTEVfUlBMICgxPDw1KQorI2RlZmluZSBPUEVOX0FEQVBURVJfSU5ISUJJVF9FVFIgKDE8PDQpCisjZGVmaW5lIE9QRU5fQURBUFRFUl9JTlRFUk5BTF9XUkFQICgxPDwzKQorI2RlZmluZSBPUEVOX0FEQVBURVJfVVNFX09QVFMyICgxPDwwKQorCisjZGVmaW5lIE9QRU5fQURBUFRFUl8yX0VOQUJMRV9PTk5PVyAoMTw8MTUpCisKKy8qIERlZmluZXMgZm9yIFNSQiBDb21tYW5kcyAqLworCisjZGVmaW5lIFNSQl9BQ0NFU1NfUkVHSVNURVIgMHgxZgorI2RlZmluZSBTUkJfQ0xPU0VfQURBUFRFUiAweDA0CisjZGVmaW5lIFNSQl9DT05GSUdVUkVfQlJJREdFIDB4MGMKKyNkZWZpbmUgU1JCX0NPTkZJR1VSRV9XQUtFVVBfRVZFTlQgMHgxYQorI2RlZmluZSBTUkJfTU9ESUZZX0JSSURHRV9QQVJNUyAweDE1CisjZGVmaW5lIFNSQl9NT0RJRllfT1BFTl9PUFRJT05TIDB4MDEKKyNkZWZpbmUgU1JCX01PRElGWV9SRUNFSVZFX09QVElPTlMgMHgxNworI2RlZmluZSBTUkJfTk9fT1BFUkFUSU9OIDB4MDAKKyNkZWZpbmUgU1JCX09QRU5fQURBUFRFUiAweDAzCisjZGVmaW5lIFNSQl9SRUFEX0xPRyAweDA4CisjZGVmaW5lIFNSQl9SRUFEX1NSX0NPVU5URVJTIDB4MTYKKyNkZWZpbmUgU1JCX1JFU0VUX0dST1VQX0FERFJFU1MgMHgwMgorI2RlZmluZSBTUkJfU0FWRV9DT05GSUdVUkFUSU9OIDB4MWIKKyNkZWZpbmUgU1JCX1NFVF9CUklER0VfUEFSTVMgMHgwOQorI2RlZmluZSBTUkJfU0VUX0JSSURHRV9UQVJHRVRTIDB4MTAKKyNkZWZpbmUgU1JCX1NFVF9GVU5DX0FERFJFU1MgMHgwNworI2RlZmluZSBTUkJfU0VUX0dST1VQX0FERFJFU1MgMHgwNgorI2RlZmluZSBTUkJfU0VUX0dST1VQX0FERFJfT1BUSU9OUyAweDExCisjZGVmaW5lIFNSQl9VUERBVEVfV0FLRVVQX1BBVFRFUk4gMHgxOQorCisvKiBDbGVhciByZXR1cm4gY29kZSAqLworCisjZGVmaW5lIE9MWU1QSUNfQ0xFQVJfUkVUX0NPREUgMHhmZSAKKworLyogQVJCIENvbW1hbmRzICovCisjZGVmaW5lIEFSQl9SRUNFSVZFX0RBVEEgMHg4MQorI2RlZmluZSBBUkJfTEFOX0NIQU5HRV9TVEFUVVMgMHg4NAorLyogQVNCIFJlc3BvbnNlIGNvbW1hbmRzICovCisKKyNkZWZpbmUgQVNCX1JFQ0VJVkVfREFUQSAweDgxCisKKworLyogT2x5bXBpYyBkZWZhdWx0cyBmb3IgYnVmZmVycyAqLworIAorI2RlZmluZSBPTFlNUElDX1JYX1JJTkdfU0laRSAxNiAvKiBzaG91bGQgYmUgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIE9MWU1QSUNfVFhfUklOR19TSVpFIDggLyogc2hvdWxkIGJlIGEgcG93ZXIgb2YgMiAqLworCisjZGVmaW5lIFBLVF9CVUZfU1ogNDA5NiAvKiBEZWZhdWx0IHBhY2tldCBzaXplICovCisKKy8qIE9seW1waWMgZGF0YSBzdHJ1Y3R1cmVzICovCisKKy8qIHh4eHggVGhlc2Ugc3RydWN0dXJlcyBhcmUgYWxsIGxpdHRsZSBlbmRpYW4gaW4gaGFyZHdhcmUuICovCisKK3N0cnVjdCBvbHltcGljX3R4X2Rlc2MgeworCXUzMiBidWZmZXI7CisJdTMyIHN0YXR1c19sZW5ndGg7Cit9OworCitzdHJ1Y3Qgb2x5bXBpY190eF9zdGF0dXMgeworCXUzMiBzdGF0dXM7Cit9OworCitzdHJ1Y3Qgb2x5bXBpY19yeF9kZXNjIHsKKwl1MzIgYnVmZmVyOworCXUzMiByZXNfbGVuZ3RoOyAKK307CisKK3N0cnVjdCBvbHltcGljX3J4X3N0YXR1cyB7CisJdTMyIGZyYWdtZW50Y250X2ZyYW1lbGVuOworCXUzMiBzdGF0dXNfYnVmZmVyY250OworfTsKKy8qIHh4eHggRU5EIFRoZXNlIHN0cnVjdHVyZXMgYXJlIGFsbCBsaXR0bGUgZW5kaWFuIGluIGhhcmR3YXJlLiAqLworLyogeHh4eCBUaGVyZSBtYXkgYmUgbW9yZSwgYnV0IEknbSBwcmV0dHkgc3VyZSBhYm91dCB0aGVzZSAqLworCitzdHJ1Y3QgbWFjX3JlY2VpdmVfYnVmZmVyIHsKKwl1MTYgbmV4dCA7IAorCXU4IHBhZGRpbmcgOyAKKwl1OCBmcmFtZV9zdGF0dXMgOworCXUxNiBidWZmZXJfbGVuZ3RoIDsgCisJdTggZnJhbWVfZGF0YSA7IAorfTsKKworc3RydWN0IG9seW1waWNfcHJpdmF0ZSB7CisJCisJdTE2IHNyYjsgICAgICAvKiBiZTE2ICovCisJdTE2IHRyYjsgICAgICAvKiBiZTE2ICovCisJdTE2IGFyYjsgICAgICAvKiBiZTE2ICovCisJdTE2IGFzYjsgICAgICAvKiBiZTE2ICovCisKKwl1OCBfX2lvbWVtICpvbHltcGljX21taW87CisJdTggX19pb21lbSAqb2x5bXBpY19sYXA7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgOyAKKwljaGFyICpvbHltcGljX2NhcmRfbmFtZSA7IAorCisJc3BpbmxvY2tfdCBvbHltcGljX2xvY2sgOyAKKworCXZvbGF0aWxlIGludCBzcmJfcXVldWVkOyAgICAvKiBUcnVlIGlmIGFuIFNSQiBpcyBzdGlsbCBwb3N0ZWQgKi8JCisJd2FpdF9xdWV1ZV9oZWFkX3Qgc3JiX3dhaXQ7CisKKwl2b2xhdGlsZSBpbnQgYXNiX3F1ZXVlZDsgICAgLyogVHJ1ZSBpZiBhbiBBU0IgaXMgcG9zdGVkICovCisKKwl2b2xhdGlsZSBpbnQgdHJiX3F1ZXVlZDsgICAvKiBUcnVlIGlmIGEgVFJCIGlzIHBvc3RlZCAqLworCXdhaXRfcXVldWVfaGVhZF90IHRyYl93YWl0IDsgCisKKwkvKiBUaGVzZSBtdXN0IGJlIG9uIGEgNCBieXRlIGJvdW5kYXJ5LiAqLworCXN0cnVjdCBvbHltcGljX3J4X2Rlc2Mgb2x5bXBpY19yeF9yaW5nW09MWU1QSUNfUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3Qgb2x5bXBpY190eF9kZXNjIG9seW1waWNfdHhfcmluZ1tPTFlNUElDX1RYX1JJTkdfU0laRV07CisJc3RydWN0IG9seW1waWNfcnhfc3RhdHVzIG9seW1waWNfcnhfc3RhdHVzX3JpbmdbT0xZTVBJQ19SWF9SSU5HX1NJWkVdOwkKKwlzdHJ1Y3Qgb2x5bXBpY190eF9zdGF0dXMgb2x5bXBpY190eF9zdGF0dXNfcmluZ1tPTFlNUElDX1RYX1JJTkdfU0laRV07CQorCisJc3RydWN0IHNrX2J1ZmYgKnR4X3Jpbmdfc2tiW09MWU1QSUNfVFhfUklOR19TSVpFXSwgKnJ4X3Jpbmdfc2tiW09MWU1QSUNfUlhfUklOR19TSVpFXTsJCisJaW50IHR4X3JpbmdfZnJlZSwgdHhfcmluZ19sYXN0X3N0YXR1cywgcnhfcmluZ19sYXN0X3JlY2VpdmVkLHJ4X3N0YXR1c19sYXN0X3JlY2VpdmVkLCBmcmVlX3R4X3JpbmdfZW50cmllczsKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG9seW1waWNfc3RhdHMgOworCXUxNiBvbHltcGljX2xhbl9zdGF0dXMgOworCXU4IG9seW1waWNfcmluZ19zcGVlZCA7CisJdTE2IHBrdF9idWZfc3ogOyAKKwl1OCBvbHltcGljX3JlY2VpdmVfb3B0aW9ucywgb2x5bXBpY19jb3B5X2FsbF9vcHRpb25zLG9seW1waWNfbWVzc2FnZV9sZXZlbCwgb2x5bXBpY19uZXR3b3JrX21vbml0b3I7ICAKKwl1MTYgb2x5bXBpY19hZGRyX3RhYmxlX2FkZHIsIG9seW1waWNfcGFybXNfYWRkciA7IAorCXU4IG9seW1waWNfbGFhWzZdIDsgCisJdTMyIHJ4X3JpbmdfZG1hX2FkZHI7CisJdTMyIHJ4X3N0YXR1c19yaW5nX2RtYV9hZGRyOworCXUzMiB0eF9yaW5nX2RtYV9hZGRyOworCXUzMiB0eF9zdGF0dXNfcmluZ19kbWFfYWRkcjsKK307CisKK3N0cnVjdCBvbHltcGljX2FkYXB0ZXJfYWRkcl90YWJsZSB7CisKKwl1OCBub2RlX2FkZHJbNl0gOyAKKwl1OCByZXNlcnZlZFs0XSA7IAorCXU4IGZ1bmNfYWRkcls0XSA7IAorfSA7IAorCitzdHJ1Y3Qgb2x5bXBpY19wYXJhbWV0ZXJzX3RhYmxlIHsgCisJCisJdTggIHBoeXNfYWRkcls0XSA7IAorCXU4ICB1cF9ub2RlX2FkZHJbNl0gOyAKKwl1OCAgdXBfcGh5c19hZGRyWzRdIDsgCisJdTggIHBvbGxfYWRkcls2XSA7IAorCXUxNiByZXNlcnZlZCA7IAorCXUxNiBhY2NfcHJpb3JpdHkgOyAKKwl1MTYgYXV0aF9zb3VyY2VfY2xhc3MgOyAKKwl1MTYgYXR0X2NvZGUgOyAKKwl1OCAgc291cmNlX2FkZHJbNl0gOyAKKwl1MTYgYmVhY29uX3R5cGUgOyAKKwl1MTYgbWFqb3JfdmVjdG9yIDsgCisJdTE2IGxhbl9zdGF0dXMgOyAKKwl1MTYgc29mdF9lcnJvcl90aW1lIDsgCisgCXUxNiByZXNlcnZlZDEgOyAKKwl1MTYgbG9jYWxfcmluZyA7IAorCXUxNiBtb25fZXJyb3IgOyAKKwl1MTYgYmVhY29uX3RyYW5zbWl0IDsgCisJdTE2IGJlYWNvbl9yZWNlaXZlIDsgCisJdTE2IGZyYW1lX2NvcnJlbCA7IAorCXU4ICBiZWFjb25fbmF1bls2XSA7IAorCXUzMiByZXNlcnZlZDIgOyAKKwl1OCAgYmVhY29uX3BoeXNbNF0gOyAJCit9OyAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9wcm90ZW9uLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvcHJvdGVvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NWIwNjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvcHJvdGVvbi5jCkBAIC0wLDAgKzEsNDMyIEBACisvKgorICogIHByb3Rlb24uYzogQSBuZXR3b3JrIGRyaXZlciBmb3IgUHJvdGVvbiBJU0EgdG9rZW4gcmluZyBjYXJkcy4KKyAqCisgKiAgQmFzZWQgb24gdG1zcGNpIHdyaXR0ZW4gMTk5OSBieSBBZGFtIEZyaXR6bGVyCisgKiAgCisgKiAgV3JpdHRlbiAyMDAzIGJ5IEpvY2hlbiBGcmllZHJpY2gKKyAqCisgKiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogIFRoaXMgZHJpdmVyIG1vZHVsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNhcmRzOgorICoJLSBQcm90ZW9uIDEzOTIsIDEzOTIrCisgKgorICogIE1haW50YWluZXIocyk6CisgKiAgICBBRiAgICAgICAgQWRhbSBGcml0emxlciAgICAgICAgICAgbWlkQGF1ay5jeAorICogICAgSkYJSm9jaGVuIEZyaWVkcmljaAlqb2NoZW5Ac2NyYW0uZGUKKyAqCisgKiAgTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CisgKgkwMi1KYW4tMDMJSkYJQ3JlYXRlZAorICoKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0gInByb3Rlb24uYzogdjEuMDAgMDIvMDEvMjAwMyBieSBKb2NoZW4gRnJpZWRyaWNoXG4iOworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90cmRldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vcGNpLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisjaW5jbHVkZSAidG1zMzgwdHIuaCIKKworI2RlZmluZSBQUk9URU9OX0lPX0VYVEVOVCAzMgorCisvKiBBIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIEkvTyBhZGRyZXNzZXMgdG8gYmUgcHJvYmVkLiAqLworc3RhdGljIHVuc2lnbmVkIGludCBwb3J0bGlzdFtdIF9faW5pdGRhdGEgPSB7CisJMHgwQTIwLCAweDBFMjAsIDB4MUEyMCwgMHgxRTIwLCAweDJBMjAsIDB4MkUyMCwgMHgzQTIwLCAweDNFMjAsLy8gUHJvdC4KKwkweDRBMjAsIDB4NEUyMCwgMHg1QTIwLCAweDVFMjAsIDB4NkEyMCwgMHg2RTIwLCAweDdBMjAsIDB4N0UyMCwvLyBQcm90LgorCTB4OEEyMCwgMHg4RTIwLCAweDlBMjAsIDB4OUUyMCwgMHhBQTIwLCAweEFFMjAsIDB4QkEyMCwgMHhCRTIwLC8vIFByb3QuCisJMHhDQTIwLCAweENFMjAsIDB4REEyMCwgMHhERTIwLCAweEVBMjAsIDB4RUUyMCwgMHhGQTIwLCAweEZFMjAsLy8gUHJvdC4KKwkwCit9OworCisvKiBBIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIElSUXMgdG8gYmUgcHJvYmVkLiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGlycWxpc3RbXSA9IHsKKwk3LCA2LCA1LCA0LCAzLCAxMiwgMTEsIDEwLCA5LAorCTAKK307CisKKy8qIEEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgRE1BcyB0byBiZSBwcm9iZWQuICovCitzdGF0aWMgaW50IGRtYWxpc3RbXSBfX2luaXRkYXRhID0geworCTUsIDYsIDcsCisJMAorfTsKKworc3RhdGljIGNoYXIgY2FyZG5hbWVbXSA9ICJQcm90ZW9uIDEzOTJcMCI7CisKK3N0cnVjdCBuZXRfZGV2aWNlICpwcm90ZW9uX3Byb2JlKGludCB1bml0KTsKK3N0YXRpYyBpbnQgcHJvdGVvbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcHJvdGVvbl9yZWFkX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwcm90ZW9uX3NldG5zZWxvdXRfcGlucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHByb3Rlb25fc2lmcmVhZGIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCXJldHVybiBpbmIoZGV2LT5iYXNlX2FkZHIgKyByZWcpOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcHJvdGVvbl9zaWZyZWFkdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJcmV0dXJuIGludyhkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHByb3Rlb25fc2lmd3JpdGViKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZhbCwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCW91dGIodmFsLCBkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHByb3Rlb25fc2lmd3JpdGV3KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZhbCwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCW91dHcodmFsLCBkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHByb3Rlb25fcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpCit7CisJdW5zaWduZWQgY2hhciBjaGsxLCBjaGsyOworCWludCBpOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIFBST1RFT05fSU9fRVhURU5ULCBjYXJkbmFtZSkpCisJCXJldHVybiAtRU5PREVWOworCQkKKworCWNoazEgPSBpbmIoaW9hZGRyICsgMHgxZik7ICAgICAgLyogR2V0IFByb3Rlb24gSUQgcmVnIDEgKi8KKwlpZiAoY2hrMSAhPSAweDFmKSAKKwkJZ290byBub2RldjsKKworCWNoazEgPSBpbmIoaW9hZGRyICsgMHgxZSkgJiAweDA3OyAgICAgICAvKiBHZXQgUHJvdGVvbiBJRCByZWcgMCAqLworCWZvciAoaT0wOyBpPDE2OyBpKyspIHsKKwkJY2hrMiA9IGluYihpb2FkZHIgKyAweDFlKSAmIDB4MDc7CisJCWlmICgoKGNoazEgKyAxKSAmIDB4MDcpICE9IGNoazIpCisJCQlnb3RvIG5vZGV2OworCQljaGsxID0gY2hrMjsKKwl9CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwlyZXR1cm4gKDApOworbm9kZXY6CisJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBQUk9URU9OX0lPX0VYVEVOVCk7IAorCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHA7CisgICAgICAgIHN0YXRpYyBpbnQgdmVyc2lvbnByaW50ZWQ7CisJY29uc3QgdW5zaWduZWQgKnBvcnQ7CisJaW50IGosZXJyID0gMDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlpZiAoZGV2LT5iYXNlX2FkZHIpCS8qIHByb2JlIHNwZWNpZmljIGxvY2F0aW9uICovCisJCWVyciA9IHByb3Rlb25fcHJvYmUxKGRldiwgZGV2LT5iYXNlX2FkZHIpOworCWVsc2UgeworCQlmb3IgKHBvcnQgPSBwb3J0bGlzdDsgKnBvcnQ7IHBvcnQrKykgeworCQkJZXJyID0gcHJvdGVvbl9wcm9iZTEoZGV2LCAqcG9ydCk7CisJCQlpZiAoIWVycikKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoZXJyKQorCQlnb3RvIG91dDQ7CisKKwkvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgZm91bmQgYSB2YWxpZCBjYXJkLiAqLworCisJaWYgKHZlcnNpb25wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIiwgdmVyc2lvbik7CisKKwllcnIgPSAtRUlPOworCWlmICh0bXNkZXZfaW5pdChkZXYsIElTQV9NQVhfQUREUkVTUywgTlVMTCkpCisJCWdvdG8gb3V0NDsKKworCWRldi0+YmFzZV9hZGRyICY9IH4zOyAKKwkJCisJcHJvdGVvbl9yZWFkX2VlcHJvbShkZXYpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAgICBSaW5nIFN0YXRpb24gQWRkcmVzczogIiwgZGV2LT5uYW1lKTsKKwlwcmludGsoIiUyLjJ4IiwgZGV2LT5kZXZfYWRkclswXSk7CisJZm9yIChqID0gMTsgaiA8IDY7IGorKykKKwkJcHJpbnRrKCI6JTIuMngiLCBkZXYtPmRldl9hZGRyW2pdKTsKKwlwcmludGsoIlxuIik7CisJCQorCXRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl0cC0+c2V0bnNlbG91dCA9IHByb3Rlb25fc2V0bnNlbG91dF9waW5zOworCQkKKwl0cC0+c2lmcmVhZGIgPSBwcm90ZW9uX3NpZnJlYWRiOworCXRwLT5zaWZyZWFkdyA9IHByb3Rlb25fc2lmcmVhZHc7CisJdHAtPnNpZndyaXRlYiA9IHByb3Rlb25fc2lmd3JpdGViOworCXRwLT5zaWZ3cml0ZXcgPSBwcm90ZW9uX3NpZndyaXRldzsKKwkKKwltZW1jcHkodHAtPlByb2R1Y3RJRCwgY2FyZG5hbWUsIFBST0RfSURfU0laRSArIDEpOworCisJdHAtPnRtc3ByaXYgPSBOVUxMOworCisJZGV2LT5vcGVuID0gcHJvdGVvbl9vcGVuOworCWRldi0+c3RvcCA9IHRtczM4MHRyX2Nsb3NlOworCisJaWYgKGRldi0+aXJxID09IDApCisJeworCQlmb3IoaiA9IDA7IGlycWxpc3Rbal0gIT0gMDsgaisrKQorCQl7CisJCQlkZXYtPmlycSA9IGlycWxpc3Rbal07CisJCQlpZiAoIXJlcXVlc3RfaXJxKGRldi0+aXJxLCB0bXMzODB0cl9pbnRlcnJ1cHQsIDAsIAorCQkJCWNhcmRuYW1lLCBkZXYpKQorCQkJCWJyZWFrOworICAgICAgICAgICAgICAgIH0KKwkJCisgICAgICAgICAgICAgICAgaWYoaXJxbGlzdFtqXSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBBdXRvU2VsZWN0IG5vIElSUSBhdmFpbGFibGVcbiIsIGRldi0+bmFtZSk7CisJCQlnb3RvIG91dDM7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJZm9yKGogPSAwOyBpcnFsaXN0W2pdICE9IDA7IGorKykKKwkJCWlmIChpcnFsaXN0W2pdID09IGRldi0+aXJxKQorCQkJCWJyZWFrOworCQlpZiAoaXJxbGlzdFtqXSA9PSAwKQorCQl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSWxsZWdhbCBJUlEgJWQgc3BlY2lmaWVkXG4iLAorCQkJCWRldi0+bmFtZSwgZGV2LT5pcnEpOworCQkJZ290byBvdXQzOworCQl9CisJCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgdG1zMzgwdHJfaW50ZXJydXB0LCAwLCAKKwkJCWNhcmRuYW1lLCBkZXYpKQorCQl7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogU2VsZWN0ZWQgSVJRICVkIG5vdCBhdmFpbGFibGVcbiIsIAorCQkJCWRldi0+bmFtZSwgZGV2LT5pcnEpOworCQkJZ290byBvdXQzOworCQl9CisJfQorCisJaWYgKGRldi0+ZG1hID09IDApCisJeworCQlmb3IoaiA9IDA7IGRtYWxpc3Rbal0gIT0gMDsgaisrKQorCQl7CisJCQlkZXYtPmRtYSA9IGRtYWxpc3Rbal07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3RfZG1hKGRldi0+ZG1hLCBjYXJkbmFtZSkpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZihkbWFsaXN0W2pdID09IDApCisJCXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBdXRvU2VsZWN0IG5vIERNQSBhdmFpbGFibGVcbiIsIGRldi0+bmFtZSk7CisJCQlnb3RvIG91dDI7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJZm9yKGogPSAwOyBkbWFsaXN0W2pdICE9IDA7IGorKykKKwkJCWlmIChkbWFsaXN0W2pdID09IGRldi0+ZG1hKQorCQkJCWJyZWFrOworCQlpZiAoZG1hbGlzdFtqXSA9PSAwKQorCQl7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogSWxsZWdhbCBETUEgJWQgc3BlY2lmaWVkXG4iLCAKKwkJCQlkZXYtPm5hbWUsIGRldi0+ZG1hKTsKKwkJCWdvdG8gb3V0MjsKKwkJfQorCQlpZiAocmVxdWVzdF9kbWEoZGV2LT5kbWEsIGNhcmRuYW1lKSkKKwkJeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNlbGVjdGVkIERNQSAlZCBub3QgYXZhaWxhYmxlXG4iLCAKKwkJCQlkZXYtPm5hbWUsIGRldi0+ZG1hKTsKKwkJCWdvdG8gb3V0MjsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX0RFQlVHICIlczogICAgSU86ICUjNGx4ICBJUlE6ICVkICBETUE6ICVkXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwgZGV2LT5kbWEpOworCQkKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXJldHVybiAwOworb3V0OgorCWZyZWVfZG1hKGRldi0+ZG1hKTsKK291dDI6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CitvdXQzOgorCXRtc2Rldl90ZXJtKGRldik7CitvdXQ0OgorCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBQUk9URU9OX0lPX0VYVEVOVCk7IAorCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IHByb3Rlb25fcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX3RyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAodW5pdCA+PSAwKSB7CisJCXNwcmludGYoZGV2LT5uYW1lLCAidHIlZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCX0KKworCWVyciA9IHNldHVwX2NhcmQoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXJldHVybiBkZXY7CisKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qCisgKiBSZWFkcyBNQUMgYWRkcmVzcyBmcm9tIGFkYXB0ZXIgUkFNLCB3aGljaCBzaG91bGQndmUgcmVhZCBpdCBmcm9tCisgKiB0aGUgb25ib2FyZCBST00uICAKKyAqCisgKiBDYWxsaW5nIHRoaXMgb24gYSBib2FyZCB0aGF0IGRvZXMgbm90IHN1cHBvcnQgaXQgY2FuIGJlIGEgdmVyeQorICogZGFuZ2Vyb3VzIHRoaW5nLiAgVGhlIE1hZGdlIGJvYXJkLCBmb3IgaW5zdGFuY2UsIHdpbGwgbG9jayB5b3VyCisgKiBtYWNoaW5lIGhhcmQgd2hlbiB0aGlzIGlzIGNhbGxlZC4gIEx1Y2tpbHksIGl0cyBzdXBwb3J0ZWQgaW4gYQorICogc2VwYXJhdGUgZHJpdmVyLiAgLS1BU0YKKyAqLworc3RhdGljIHZvaWQgcHJvdGVvbl9yZWFkX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCQorCS8qIEFkZHJlc3M6IDAwMDA6MDAwMCAqLworCXByb3Rlb25fc2lmd3JpdGV3KGRldiwgMCwgU0lGQURYKTsKKwlwcm90ZW9uX3NpZndyaXRldyhkZXYsIDAsIFNJRkFEUik7CQorCQorCS8qIFJlYWQgc2l4IGJ5dGUgTUFDIGFkZHJlc3MgZGF0YSAqLworCWRldi0+YWRkcl9sZW4gPSA2OworCWZvcihpID0gMDsgaSA8IDY7IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IHByb3Rlb25fc2lmcmVhZHcoZGV2LCBTSUZJTkMpID4+IDg7Cit9CisKK3Vuc2lnbmVkIHNob3J0IHByb3Rlb25fc2V0bnNlbG91dF9waW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvdGVvbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7ICAKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgc2hvcnQgdmFsID0gMDsKKwlpbnQgaTsKKworCS8qIFByb3Rlb24gcmVzZXQgc2VxdWVuY2UgKi8KKwlvdXRiKDAsIGRldi0+YmFzZV9hZGRyICsgMHgxMSk7CisJbWRlbGF5KDIwKTsKKwlvdXRiKDB4MDQsIGRldi0+YmFzZV9hZGRyICsgMHgxMSk7CisJbWRlbGF5KDIwKTsKKwlvdXRiKDAsIGRldi0+YmFzZV9hZGRyICsgMHgxMSk7CisJbWRlbGF5KDEwMCk7CisKKwkvKiBzZXQgY29udHJvbC9zdGF0dXMgcmVnICovCisJdmFsID0gaW5iKGRldi0+YmFzZV9hZGRyICsgMHgxMSk7CisJdmFsIHw9IDB4Nzg7CisJdmFsICY9IDB4Zjk7CisJaWYodHAtPkRhdGFSYXRlID09IFNQRUVEXzQpCisJCXZhbCB8PSAweDIwOworCWVsc2UKKwkJdmFsICY9IH4weDIwOworCisJb3V0Yih2YWwsIGRldi0+YmFzZV9hZGRyICsgMHgxMSk7CisJb3V0YigweGZmLCBkZXYtPmJhc2VfYWRkciArIDB4MTIpOworCWZvcihpID0gMDsgaXJxbGlzdFtpXSAhPSAwOyBpKyspCisJeworCQlpZihpcnFsaXN0W2ldID09IGRldi0+aXJxKQorCQkJYnJlYWs7CisJfQorCXZhbCA9IGk7CisJaSA9ICg3IC0gZGV2LT5kbWEpIDw8IDQ7CisJdmFsIHw9IGk7CisJb3V0Yih2YWwsIGRldi0+YmFzZV9hZGRyICsgMHgxMyk7CisKKwlyZXR1cm4gdG1zMzgwdHJfb3BlbihkZXYpOworfQorCisjaWZkZWYgTU9EVUxFCisKKyNkZWZpbmUgSVNBVFJfTUFYX0FEQVBURVJTIDMKKworc3RhdGljIGludCBpb1tJU0FUUl9NQVhfQURBUFRFUlNdOworc3RhdGljIGludCBpcnFbSVNBVFJfTUFYX0FEQVBURVJTXTsKK3N0YXRpYyBpbnQgZG1hW0lTQVRSX01BWF9BREFQVEVSU107CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShkbWEsIGludCwgTlVMTCwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqcHJvdGVvbl9kZXZbSVNBVFJfTUFYX0FEQVBURVJTXTsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaSwgbnVtID0gMCwgZXJyID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBJU0FUUl9NQVhfQURBUFRFUlMgOyBpKyspIHsKKwkJZGV2ID0gYWxsb2NfdHJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwkJaWYgKCFkZXYpCisJCQljb250aW51ZTsKKworCQlkZXYtPmJhc2VfYWRkciA9IGlvW2ldOworCQlkZXYtPmlycSA9IGlycVtpXTsKKwkJZGV2LT5kbWEgPSBkbWFbaV07CisJCWVyciA9IHNldHVwX2NhcmQoZGV2KTsKKwkJaWYgKCFlcnIpIHsKKwkJCXByb3Rlb25fZGV2W2ldID0gZGV2OworCQkJKytudW07CisJCX0gZWxzZSB7CisJCQlmcmVlX25ldGRldihkZXYpOworCQl9CisJfQorCisJcHJpbnRrKEtFUk5fTk9USUNFICJwcm90ZW9uLmM6ICVkIGNhcmRzIGZvdW5kLlxuIiwgbnVtKTsKKwkvKiBQcm9iZSBmb3IgY2FyZHMuICovCisJaWYgKG51bSA9PSAwKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAicHJvdGVvbi5jOiBObyBjYXJkcyBmb3VuZC5cbiIpOworCQlyZXR1cm4gKC1FTk9ERVYpOworCX0KKwlyZXR1cm4gKDApOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSVNBVFJfTUFYX0FEQVBURVJTIDsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcm90ZW9uX2RldltpXTsKKwkJCisJCWlmICghZGV2KSAKKwkJCWNvbnRpbnVlOworCQkKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFBST1RFT05fSU9fRVhURU5UKTsKKwkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJCWZyZWVfZG1hKGRldi0+ZG1hKTsKKwkJdG1zZGV2X3Rlcm0oZGV2KTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwl9Cit9CisjZW5kaWYgLyogTU9EVUxFICovCisKKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVkVSU0lPTlMgIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgcHJvdGVvbi5jIgorICogIGFsdC1jb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1mb21pdC1mcmFtZS1wb2ludGVyIC1JL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQvdG9rZW5yaW5nLyAtYyBwcm90ZW9uLmMiCisgKiAgYy1zZXQtc3R5bGUgIksmUiIKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9za2lzYS5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NraXNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhYjU0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9za2lzYS5jCkBAIC0wLDAgKzEsNDQyIEBACisvKgorICogIHNraXNhLmM6IEEgbmV0d29yayBkcml2ZXIgZm9yIFNLLU5FVCBUTVMzODAtYmFzZWQgSVNBIHRva2VuIHJpbmcgY2FyZHMuCisgKgorICogIEJhc2VkIG9uIHRtc3BjaSB3cml0dGVuIDE5OTkgYnkgQWRhbSBGcml0emxlcgorICogIAorICogIFdyaXR0ZW4gMjAwMCBieSBKb2NoZW4gRnJpZWRyaWNoCisgKiAgRGVkaWNhdGVkIHRvIG15IGdpcmxmcmllbmQgU3RlZmZpIEJvcHAKKyAqCisgKiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogIFRoaXMgZHJpdmVyIG1vZHVsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNhcmRzOgorICoJLSBTeXNLb25uZWN0IFRSNC8xNigrKSBJU0EJKFNLLTQxOTApCisgKgorICogIE1haW50YWluZXIocyk6CisgKiAgICBBRiAgICAgICAgQWRhbSBGcml0emxlciAgICAgICAgICAgbWlkQGF1ay5jeAorICogICAgSkYJSm9jaGVuIEZyaWVkcmljaAlqb2NoZW5Ac2NyYW0uZGUKKyAqCisgKiAgTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CisgKgkxNC1KYW4tMDEJSkYJQ3JlYXRlZAorICoJMjgtT2N0LTAyCUpGCUZpeGVkIHByb2JlIG9mIGNhcmQgZm9yIHN0YXRpYyBjb21waWxhdGlvbi4KKyAqCQkJCUZpeGVkIG1vZHVsZSBpbml0IHRvIG5vdCBtYWtlIGhvdHBsdWcgZ28gd2lsZC4KKyAqCTA5LU5vdi0wMglKRglGaXhlZCBlYXJseSBiYWlsIG91dCBvbiBvdXQgb2YgbWVtb3J5CisgKgkJCQlzaXR1YXRpb25zIGlmIG11bHRpcGxlIGNhcmRzIGFyZSBmb3VuZC4KKyAqCQkJCUNsZWFuZWQgdXAgc29tZSB1bm5lY2Vzc2FyeSBjb25zb2xlIFNQQU0uCisgKgkwOS1EZWMtMDIJSkYJRml4ZWQgbW9kdWxlIHJlZmVyZW5jZSBjb3VudGluZy4KKyAqCTAyLUphbi0wMwlKRglSZW5hbWVkIHRvIHNraXNhLmMKKyAqCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9ICJza2lzYS5jOiB2MS4wMyAwOS8xMi8yMDAyIGJ5IEpvY2hlbiBGcmllZHJpY2hcbiI7CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90cmRldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vcGNpLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisjaW5jbHVkZSAidG1zMzgwdHIuaCIKKworI2RlZmluZSBTS19JU0FfSU9fRVhURU5UIDMyCisKKy8qIEEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgSS9PIGFkZHJlc3NlcyB0byBiZSBwcm9iZWQuICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBvcnRsaXN0W10gX19pbml0ZGF0YSA9IHsKKwkweDBBMjAsIDB4MUEyMCwgMHgwQjIwLCAweDFCMjAsIDB4MDk4MCwgMHgxOTgwLCAweDA5MDAsIDB4MTkwMCwvLyBTSworCTAKK307CisKKy8qIEEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgSVJRcyB0byBiZSBwcm9iZWQuIAorICogVXNlZCBhZ2FpbiBhZnRlciBpbml0aWFsIHByb2JlIGZvciBza3RyX2NoaXBzZXRfaW5pdCwgY2FsbGVkIGZyb20gc2t0cl9vcGVuLgorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgaXJxbGlzdFtdID0geworCTMsIDUsIDksIDEwLCAxMSwgMTIsIDE1LAorCTAKK307CisKKy8qIEEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgRE1BcyB0byBiZSBwcm9iZWQuICovCitzdGF0aWMgaW50IGRtYWxpc3RbXSBfX2luaXRkYXRhID0geworCTUsIDYsIDcsCisJMAorfTsKKworc3RhdGljIGNoYXIgaXNhX2NhcmRuYW1lW10gPSAiU0sgTkVUIFRSIDQvMTYgSVNBXDAiOworCitzdHJ1Y3QgbmV0X2RldmljZSAqc2tfaXNhX3Byb2JlKGludCB1bml0KTsKK3N0YXRpYyBpbnQgc2tfaXNhX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBza19pc2FfcmVhZF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc2tfaXNhX3NldG5zZWxvdXRfcGlucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHNrX2lzYV9zaWZyZWFkYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJcmV0dXJuIGluYihkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBza19pc2Ffc2lmcmVhZHcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCXJldHVybiBpbncoZGV2LT5iYXNlX2FkZHIgKyByZWcpOworfQorCitzdGF0aWMgdm9pZCBza19pc2Ffc2lmd3JpdGViKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZhbCwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCW91dGIodmFsLCBkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHNrX2lzYV9zaWZ3cml0ZXcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmFsLCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJb3V0dyh2YWwsIGRldi0+YmFzZV9hZGRyICsgcmVnKTsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBza19pc2FfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpCit7CisJdW5zaWduZWQgY2hhciBvbGQsIGNoazEsIGNoazI7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgU0tfSVNBX0lPX0VYVEVOVCwgaXNhX2NhcmRuYW1lKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlvbGQgPSBpbmIoaW9hZGRyICsgU0lGQURSKTsJLyogR2V0IHRoZSBvbGQgU0lGQURSIHZhbHVlICovCisKKwljaGsxID0gMDsJLyogQmVnaW4gd2l0aCBjaGVjayB2YWx1ZSAwICovCisJZG8geworCQkvKiBXcml0ZSBuZXcgU0lGQURSIHZhbHVlICovCisJCW91dGIoY2hrMSwgaW9hZGRyICsgU0lGQURSKTsKKworCQkvKiBSZWFkLCBpbnZlcnQgYW5kIHdyaXRlICovCisJCWNoazIgPSBpbmIoaW9hZGRyICsgU0lGQUREKTsKKwkJY2hrMiBePSAweDBGRTsKKwkJb3V0YihjaGsyLCBpb2FkZHIgKyBTSUZBRFIpOworCisJCS8qIFJlYWQsIGludmVydCBhbmQgY29tcGFyZSAqLworCQljaGsyID0gaW5iKGlvYWRkciArIFNJRkFERCk7CisJCWNoazIgXj0gMHgwRkU7CisKKwkJaWYoY2hrMSAhPSBjaGsyKSB7CisJCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIFNLX0lTQV9JT19FWFRFTlQpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQljaGsxIC09IDI7CisJfSB3aGlsZShjaGsxICE9IDApOwkvKiBSZXBlYXQgMTI4IHRpbWVzIChhbGwgYnl0ZSB2YWx1ZXMpICovCisKKyAgICAJLyogUmVzdG9yZSB0aGUgU0lGQURSIHZhbHVlICovCisJb3V0YihvbGQsIGlvYWRkciArIFNJRkFEUik7CisKKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgc2V0dXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwOworICAgICAgICBzdGF0aWMgaW50IHZlcnNpb25wcmludGVkOworCWNvbnN0IHVuc2lnbmVkICpwb3J0OworCWludCBqLCBlcnIgPSAwOworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWlmIChkZXYtPmJhc2VfYWRkcikJLyogcHJvYmUgc3BlY2lmaWMgbG9jYXRpb24gKi8KKwkJZXJyID0gc2tfaXNhX3Byb2JlMShkZXYsIGRldi0+YmFzZV9hZGRyKTsKKwllbHNlIHsKKwkJZm9yIChwb3J0ID0gcG9ydGxpc3Q7ICpwb3J0OyBwb3J0KyspIHsKKwkJCWVyciA9IHNrX2lzYV9wcm9iZTEoZGV2LCAqcG9ydCk7CisJCQlpZiAoIWVycikKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoZXJyKQorCQlnb3RvIG91dDQ7CisKKwkvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgZm91bmQgYSB2YWxpZCBjYXJkLiAqLworCisJaWYgKHZlcnNpb25wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIiwgdmVyc2lvbik7CisKKwllcnIgPSAtRUlPOworCWlmICh0bXNkZXZfaW5pdChkZXYsIElTQV9NQVhfQUREUkVTUywgTlVMTCkpCisJCWdvdG8gb3V0NDsKKworCWRldi0+YmFzZV9hZGRyICY9IH4zOyAKKwkJCisJc2tfaXNhX3JlYWRfZWVwcm9tKGRldik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICAgIFJpbmcgU3RhdGlvbiBBZGRyZXNzOiAiLCBkZXYtPm5hbWUpOworCXByaW50aygiJTIuMngiLCBkZXYtPmRldl9hZGRyWzBdKTsKKwlmb3IgKGogPSAxOyBqIDwgNjsgaisrKQorCQlwcmludGsoIjolMi4yeCIsIGRldi0+ZGV2X2FkZHJbal0pOworCXByaW50aygiXG4iKTsKKwkJCisJdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXRwLT5zZXRuc2Vsb3V0ID0gc2tfaXNhX3NldG5zZWxvdXRfcGluczsKKwkJCisJdHAtPnNpZnJlYWRiID0gc2tfaXNhX3NpZnJlYWRiOworCXRwLT5zaWZyZWFkdyA9IHNrX2lzYV9zaWZyZWFkdzsKKwl0cC0+c2lmd3JpdGViID0gc2tfaXNhX3NpZndyaXRlYjsKKwl0cC0+c2lmd3JpdGV3ID0gc2tfaXNhX3NpZndyaXRldzsKKwkKKwltZW1jcHkodHAtPlByb2R1Y3RJRCwgaXNhX2NhcmRuYW1lLCBQUk9EX0lEX1NJWkUgKyAxKTsKKworCXRwLT50bXNwcml2ID0gTlVMTDsKKworCWRldi0+b3BlbiA9IHNrX2lzYV9vcGVuOworCWRldi0+c3RvcCA9IHRtczM4MHRyX2Nsb3NlOworCisJaWYgKGRldi0+aXJxID09IDApCisJeworCQlmb3IoaiA9IDA7IGlycWxpc3Rbal0gIT0gMDsgaisrKQorCQl7CisJCQlkZXYtPmlycSA9IGlycWxpc3Rbal07CisJCQlpZiAoIXJlcXVlc3RfaXJxKGRldi0+aXJxLCB0bXMzODB0cl9pbnRlcnJ1cHQsIDAsIAorCQkJCWlzYV9jYXJkbmFtZSwgZGV2KSkKKwkJCQlicmVhazsKKyAgICAgICAgICAgICAgICB9CisJCQorICAgICAgICAgICAgICAgIGlmKGlycWxpc3Rbal0gPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogQXV0b1NlbGVjdCBubyBJUlEgYXZhaWxhYmxlXG4iLCBkZXYtPm5hbWUpOworCQkJZ290byBvdXQzOworCQl9CisJfQorCWVsc2UKKwl7CisJCWZvcihqID0gMDsgaXJxbGlzdFtqXSAhPSAwOyBqKyspCisJCQlpZiAoaXJxbGlzdFtqXSA9PSBkZXYtPmlycSkKKwkJCQlicmVhazsKKwkJaWYgKGlycWxpc3Rbal0gPT0gMCkKKwkJeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElsbGVnYWwgSVJRICVkIHNwZWNpZmllZFxuIiwKKwkJCQlkZXYtPm5hbWUsIGRldi0+aXJxKTsKKwkJCWdvdG8gb3V0MzsKKwkJfQorCQlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIHRtczM4MHRyX2ludGVycnVwdCwgMCwgCisJCQlpc2FfY2FyZG5hbWUsIGRldikpCisJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBTZWxlY3RlZCBJUlEgJWQgbm90IGF2YWlsYWJsZVxuIiwgCisJCQkJZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCQlnb3RvIG91dDM7CisJCX0KKwl9CisKKwlpZiAoZGV2LT5kbWEgPT0gMCkKKwl7CisJCWZvcihqID0gMDsgZG1hbGlzdFtqXSAhPSAwOyBqKyspCisJCXsKKwkJCWRldi0+ZG1hID0gZG1hbGlzdFtqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVxdWVzdF9kbWEoZGV2LT5kbWEsIGlzYV9jYXJkbmFtZSkpCisJCQkJYnJlYWs7CisJCX0KKworCQlpZihkbWFsaXN0W2pdID09IDApCisJCXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBdXRvU2VsZWN0IG5vIERNQSBhdmFpbGFibGVcbiIsIGRldi0+bmFtZSk7CisJCQlnb3RvIG91dDI7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJZm9yKGogPSAwOyBkbWFsaXN0W2pdICE9IDA7IGorKykKKwkJCWlmIChkbWFsaXN0W2pdID09IGRldi0+ZG1hKQorCQkJCWJyZWFrOworCQlpZiAoZG1hbGlzdFtqXSA9PSAwKQorCQl7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogSWxsZWdhbCBETUEgJWQgc3BlY2lmaWVkXG4iLCAKKwkJCQlkZXYtPm5hbWUsIGRldi0+ZG1hKTsKKwkJCWdvdG8gb3V0MjsKKwkJfQorCQlpZiAocmVxdWVzdF9kbWEoZGV2LT5kbWEsIGlzYV9jYXJkbmFtZSkpCisJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBTZWxlY3RlZCBETUEgJWQgbm90IGF2YWlsYWJsZVxuIiwgCisJCQkJZGV2LT5uYW1lLCBkZXYtPmRtYSk7CisJCQlnb3RvIG91dDI7CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICAgIElPOiAlIzRseCAgSVJROiAlZCAgRE1BOiAlZFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEsIGRldi0+ZG1hKTsKKwkJCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlyZXR1cm4gMDsKK291dDoKKwlmcmVlX2RtYShkZXYtPmRtYSk7CitvdXQyOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworb3V0MzoKKwl0bXNkZXZfdGVybShkZXYpOworb3V0NDoKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgU0tfSVNBX0lPX0VYVEVOVCk7IAorCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IHNrX2lzYV9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfdHJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwlpbnQgZXJyID0gMDsKKworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJ0ciVkIiwgdW5pdCk7CisJCW5ldGRldl9ib290X3NldHVwX2NoZWNrKGRldik7CisJfQorCisJZXJyID0gc2V0dXBfY2FyZChkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJcmV0dXJuIGRldjsKK291dDoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qCisgKiBSZWFkcyBNQUMgYWRkcmVzcyBmcm9tIGFkYXB0ZXIgUkFNLCB3aGljaCBzaG91bGQndmUgcmVhZCBpdCBmcm9tCisgKiB0aGUgb25ib2FyZCBST00uICAKKyAqCisgKiBDYWxsaW5nIHRoaXMgb24gYSBib2FyZCB0aGF0IGRvZXMgbm90IHN1cHBvcnQgaXQgY2FuIGJlIGEgdmVyeQorICogZGFuZ2Vyb3VzIHRoaW5nLiAgVGhlIE1hZGdlIGJvYXJkLCBmb3IgaW5zdGFuY2UsIHdpbGwgbG9jayB5b3VyCisgKiBtYWNoaW5lIGhhcmQgd2hlbiB0aGlzIGlzIGNhbGxlZC4gIEx1Y2tpbHksIGl0cyBzdXBwb3J0ZWQgaW4gYQorICogc2VwYXJhdGUgZHJpdmVyLiAgLS1BU0YKKyAqLworc3RhdGljIHZvaWQgc2tfaXNhX3JlYWRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJCisJLyogQWRkcmVzczogMDAwMDowMDAwICovCisJc2tfaXNhX3NpZndyaXRldyhkZXYsIDAsIFNJRkFEWCk7CisJc2tfaXNhX3NpZndyaXRldyhkZXYsIDAsIFNJRkFEUik7CQorCQorCS8qIFJlYWQgc2l4IGJ5dGUgTUFDIGFkZHJlc3MgZGF0YSAqLworCWRldi0+YWRkcl9sZW4gPSA2OworCWZvcihpID0gMDsgaSA8IDY7IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IHNrX2lzYV9zaWZyZWFkdyhkZXYsIFNJRklOQykgPj4gODsKK30KKwordW5zaWduZWQgc2hvcnQgc2tfaXNhX3NldG5zZWxvdXRfcGlucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNrX2lzYV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7ICAKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgc2hvcnQgdmFsID0gMDsKKwl1bnNpZ25lZCBzaG9ydCBvbGR2YWw7CisJaW50IGk7CisKKwl2YWwgPSAwOworCWZvcihpID0gMDsgaXJxbGlzdFtpXSAhPSAwOyBpKyspCisJeworCQlpZihpcnFsaXN0W2ldID09IGRldi0+aXJxKQorCQkJYnJlYWs7CisJfQorCisJdmFsIHw9IENZQ0xFX1RJTUUgPDwgMjsKKwl2YWwgfD0gaSA8PCA0OworCWkgPSBkZXYtPmRtYSAtIDU7CisJdmFsIHw9IGk7CisJaWYodHAtPkRhdGFSYXRlID09IFNQRUVEXzQpCisJCXZhbCB8PSBMSU5FX1NQRUVEX0JJVDsKKwllbHNlCisJCXZhbCAmPSB+TElORV9TUEVFRF9CSVQ7CisJb2xkdmFsID0gc2tfaXNhX3NpZnJlYWRiKGRldiwgUE9TUkVHKTsKKwkvKiBMZWF2ZSBjeWNsZSBiaXRzIGFsb25lICovCisJb2xkdmFsIHw9IDB4ZjM7CisJdmFsICY9IG9sZHZhbDsKKwlza19pc2Ffc2lmd3JpdGViKGRldiwgdmFsLCBQT1NSRUcpOworCisJcmV0dXJuIHRtczM4MHRyX29wZW4oZGV2KTsKK30KKworI2lmZGVmIE1PRFVMRQorCisjZGVmaW5lIElTQVRSX01BWF9BREFQVEVSUyAzCisKK3N0YXRpYyBpbnQgaW9bSVNBVFJfTUFYX0FEQVBURVJTXTsKK3N0YXRpYyBpbnQgaXJxW0lTQVRSX01BWF9BREFQVEVSU107CitzdGF0aWMgaW50IGRtYVtJU0FUUl9NQVhfQURBUFRFUlNdOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZG1hLCBpbnQsIE5VTEwsIDApOworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnNrX2lzYV9kZXZbSVNBVFJfTUFYX0FEQVBURVJTXTsKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaSwgbnVtID0gMCwgZXJyID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBJU0FUUl9NQVhfQURBUFRFUlMgOyBpKyspIHsKKwkJZGV2ID0gYWxsb2NfdHJkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwkJaWYgKCFkZXYpCisJCQljb250aW51ZTsKKworCQlkZXYtPmJhc2VfYWRkciA9IGlvW2ldOworCQlkZXYtPmlycSA9IGlycVtpXTsKKwkJZGV2LT5kbWEgPSBkbWFbaV07CisJCWVyciA9IHNldHVwX2NhcmQoZGV2KTsKKworCQlpZiAoIWVycikgeworCQkJc2tfaXNhX2RldltpXSA9IGRldjsKKwkJCSsrbnVtOworCQl9IGVsc2UgeworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX05PVElDRSAic2tpc2EuYzogJWQgY2FyZHMgZm91bmQuXG4iLCBudW0pOworCS8qIFByb2JlIGZvciBjYXJkcy4gKi8KKwlpZiAobnVtID09IDApIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJza2lzYS5jOiBObyBjYXJkcyBmb3VuZC5cbiIpOworCQlyZXR1cm4gKC1FTk9ERVYpOworCX0KKwlyZXR1cm4gKDApOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSVNBVFJfTUFYX0FEQVBURVJTIDsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza19pc2FfZGV2W2ldOworCisJCWlmICghZGV2KSAKKwkJCWNvbnRpbnVlOworCQkKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFNLX0lTQV9JT19FWFRFTlQpOworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJZnJlZV9kbWEoZGV2LT5kbWEpOworCQl0bXNkZXZfdGVybShkZXYpOworCQlmcmVlX25ldGRldihkZXYpOworCX0KK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworDAorLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RWRVJTSU9OUyAgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1mb21pdC1mcmFtZS1wb2ludGVyIC1JL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQvdG9rZW5yaW5nLyAtYyBza2lzYS5jIgorICogIGFsdC1jb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1mb21pdC1mcmFtZS1wb2ludGVyIC1JL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQvdG9rZW5yaW5nLyAtYyBza2lzYS5jIgorICogIGMtc2V0LXN0eWxlICJLJlIiCisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9zbWN0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOGFlYWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHIuYwpAQCAtMCwwICsxLDU3NDIgQEAKKy8qCisgKiAgc21jdHIuYzogQSBuZXR3b3JrIGRyaXZlciBmb3IgdGhlIFNNQyBUb2tlbiBSaW5nIEFkYXB0ZXJzLgorICoKKyAqICBXcml0dGVuIGJ5IEpheSBTY2h1bGlzdCA8anNjaGxzdEBzYW1iYS5vcmc+CisgKgorICogIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqICBUaGlzIGRldmljZSBkcml2ZXIgd29ya3Mgd2l0aCB0aGUgZm9sbG93aW5nIFNNQyBhZGFwdGVyczoKKyAqICAgICAgLSBTTUMgVG9rZW5DYXJkIEVsaXRlICAgKDgxMTVULCBjaGlwcyA4MjUvNTg0KQorICogICAgICAtIFNNQyBUb2tlbkNhcmQgRWxpdGUvQSBNQ0EgKDgxMTVUL0EsIGNoaXBzIDgyNS81OTQpCisgKgorICogIFNvdXJjZShzKToKKyAqICAJLSBTTUMgVG9rZW5DYXJkIFNESy4KKyAqCisgKiAgTWFpbnRhaW5lcihzKToKKyAqICAgIEpTICAgICAgICBKYXkgU2NodWxpc3QgPGpzY2hsc3RAc2FtYmEub3JnPgorICoKKyAqIENoYW5nZXM6CisgKiAgICAwNzEwMjAwMCAgICAgICAgICBKUyAgICAgIEZpeGVkIGEgdGltaW5nIHByb2JsZW0gaW4gc21jdHJfd2FpdF9jbWQoKTsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxzbyBhZGRlZCBhIGJpdCBtb3JlIGRpc2NyaXB0aXZlIGVycm9yIG1zZ3MuCisgKiAgICAwNzEyMjAwMCAgICAgICAgICBKUyAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBkZXRlY3RpbmcgYSBjYXJkIHdpdGgKKyAqCQkJCW1vZHVsZSBpby9pcnEvbWVtIHNwZWNpZmllZC4KKyAqCisgKiAgVG8gZG86CisgKiAgICAxLiBNdWx0aWNhc3Qgc3VwcG9ydC4KKyAqCisgKiAgSW5pdGlhbCAyLjUgY2xlYW51cCBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiAgMjAwMi8xMC8yOAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS1sZWdhY3kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdHJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaWYgQklUU19QRVJfTE9ORyA9PSA2NAorI2Vycm9yIEZJWE1FOiBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCA2NC1iaXQgcGxhdGZvcm1zCisjZW5kaWYKKworI2luY2x1ZGUgInNtY3RyLmgiICAgICAgICAgICAgICAgLyogT3VyIFN0dWZmICovCisjaW5jbHVkZSAic21jdHJfZmlybXdhcmUuaCIgICAgICAvKiBTTUMgYWRhcHRlciBmaXJtd2FyZSAqLworCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9IEtFUk5fSU5GTyAic21jdHIuYzogdjEuNCA3LzEyLzAwIGJ5IGpzY2hsc3RAc2FtYmEub3JnXG4iOworc3RhdGljIGNvbnN0IGNoYXIgY2FyZG5hbWVbXSA9ICJzbWN0ciI7CisKKworI2RlZmluZSBTTUNUUl9JT19FWFRFTlQgICAyMAorCisjaWZkZWYgQ09ORklHX01DQV9MRUdBQ1kKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc21jdHJfcG9zaWQgPSAweDZlYzY7CisjZW5kaWYKKworc3RhdGljIGludCByaW5nc3BlZWQ7CisKKy8qIFNNQyBOYW1lIG9mIHRoZSBBZGFwdGVyLiAqLworc3RhdGljIGNoYXIgc21jdHJfbmFtZVtdID0gIlNNQyBUb2tlbkNhcmQiOworY2hhciAqc21jdHJfbW9kZWwgPSAiVW5rbm93biI7CisKKy8qIFVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sIDIgZm9yIGRlYnVnLCBhbmQKKyAqIDMgZm9yIHZlcnkgdmVyYm9zZSBkZWJ1Zy4KKyAqLworI2lmbmRlZiBTTUNUUl9ERUJVRworI2RlZmluZSBTTUNUUl9ERUJVRyAxCisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc21jdHJfZGVidWcgPSBTTUNUUl9ERUJVRzsKKworLyogc21jdHIuYyBwcm90b3R5cGVzIGFuZCBmdW5jdGlvbnMgYXJlIGFycmFuZ2VkIGFscGhhYmV0aWNseSAKKyAqIGZvciBjbGVhcml0eSwgbWFpbnRhaW5hYmlsaXR5IGFuZCBwdXJlIG9sZCBmYXNoaW9uIGZ1bi4gCisgKi8KKy8qIEEgKi8KK3N0YXRpYyBpbnQgc21jdHJfYWxsb2Nfc2hhcmVkX21lbW9yeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogQiAqLworc3RhdGljIGludCBzbWN0cl9ieXBhc3Nfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIEMgKi8KK3N0YXRpYyBpbnQgc21jdHJfY2hlY2tzdW1fZmlybXdhcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IF9faW5pdCBzbWN0cl9jaGtfaXNhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9jaGdfcnhfbWFzayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfY2xlYXJfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9jbGVhcl90cmNfcmVzZXQoaW50IGlvYWRkcik7CitzdGF0aWMgaW50IHNtY3RyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBEICovCitzdGF0aWMgaW50IHNtY3RyX2RlY29kZV9maXJtd2FyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfZGlzYWJsZV8xNmJpdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfZGlzYWJsZV9hZGFwdGVyX2N0cmxfc3RvcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2Rpc2FibGVfYmljX2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogRSAqLworc3RhdGljIGludCBzbWN0cl9lbmFibGVfMTZiaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2VuYWJsZV9hZGFwdGVyX2N0cmxfc3RvcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2VuYWJsZV9hZGFwdGVyX3JhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfZW5hYmxlX2JpY19pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIEcgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNtY3RyX2dldF9ib2FyZGlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtY2EpOworc3RhdGljIGludCBzbWN0cl9nZXRfZ3JvdXBfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfZ2V0X2Z1bmN0aW9uYWxfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc21jdHJfZ2V0X251bV9yeF9iZGJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9nZXRfcGh5c2ljYWxfZHJvcF9udW1iZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgX191OCAqc21jdHJfZ2V0X3J4X3BvaW50ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgcXVldWUpOworc3RhdGljIGludCBzbWN0cl9nZXRfc3RhdGlvbl9pZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc21jdHJfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIEZDQmxvY2sgKnNtY3RyX2dldF90eF9mY2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgcXVldWUsCisgICAgICAgIF9fdTE2IGJ5dGVzX2NvdW50KTsKK3N0YXRpYyBpbnQgc21jdHJfZ2V0X3Vwc3RyZWFtX25laWdoYm9yX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIEggKi8KK3N0YXRpYyBpbnQgc21jdHJfaGFyZHdhcmVfc2VuZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHApOworLyogSSAqLworc3RhdGljIGludCBzbWN0cl9pbml0X2FjYnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2luaXRfYWRhcHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaW5pdF9jYXJkX3JlYWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2luaXRfcnhfYmRicyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaW5pdF9yeF9mY2JzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9pbml0X3NoYXJlZF9tZW1vcnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2luaXRfdHhfYmRicyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaW5pdF90eF9mY2JzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9pbnRlcm5hbF9zZWxmX3Rlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3Qgc21jdHJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9lbmFibGVfaW50X2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBfX3UxNiBpbnRlcnJ1cHRfZW5hYmxlX21hc2spOworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9pbnRfYWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IGlhY2tfY29kZSwKKyAgICAgICAgX191MTYgaWJpdHMpOworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9pbml0X3RpbWVyc19jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX2luaXRfdHhyeF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX2luc2VydF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3JlYWRfcmluZ19zdGF0dXNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9yZWFkX3dvcmRfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IGF3b3JkX2NudCk7CitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3JlbW92ZV9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3Jlc3VtZV9hY2JfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9yZXN1bWVfcnhfYmRiX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3UxNiBxdWV1ZSk7CitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3Jlc3VtZV9yeF9mY2JfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IHF1ZXVlKTsKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfcmVzdW1lX3R4X2ZjYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgcXVldWUpOworc3RhdGljIGludCBzbWN0cl9pc3N1ZV90ZXN0X2ludGVybmFsX3JvbV9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3Rlc3RfaGljX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfdGVzdF9tYWNfcmVnX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfdHJjX2xvb3BiYWNrX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfdHJpX2xvb3BiYWNrX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfd3JpdGVfYnl0ZV9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgc2hvcnQgYXdvcmRfY250LCB2b2lkICpieXRlKTsKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfd3JpdGVfd29yZF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgc2hvcnQgYXdvcmRfY250LCB2b2lkICp3b3JkKTsKKworLyogSiAqLworc3RhdGljIGludCBzbWN0cl9qb2luX2NvbXBsZXRlX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBMICovCitzdGF0aWMgaW50IHNtY3RyX2xpbmtfdHhfZmNic190b19iZGJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9sb2FkX2Zpcm13YXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9sb2FkX25vZGVfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfbG9iZV9tZWRpYV90ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9sb2JlX21lZGlhX3Rlc3RfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9sb2JlX21lZGlhX3Rlc3Rfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIE0gKi8KK3N0YXRpYyBpbnQgc21jdHJfbWFrZV84MDI1X2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfSEVBREVSICpybWYsIE1BQ19IRUFERVIgKnRtZiwgX191MTYgYWNfZmMpOworc3RhdGljIGludCBzbWN0cl9tYWtlX2FjY2Vzc19wcmkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdik7CitzdGF0aWMgaW50IHNtY3RyX21ha2VfYWRkcl9tb2Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX1NVQl9WRUNUT1IgKnRzdik7CitzdGF0aWMgaW50IHNtY3RyX21ha2VfYXV0aF9mdW5jdF9jbGFzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2KTsKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9jb3JyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19TVUJfVkVDVE9SICp0c3YsIF9fdTE2IGNvcnJlbGF0b3IpOworc3RhdGljIGludCBzbWN0cl9tYWtlX2Z1bmN0X2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdik7CitzdGF0aWMgaW50IHNtY3RyX21ha2VfZ3JvdXBfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2KTsKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9waHlfZHJvcF9udW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdik7CitzdGF0aWMgaW50IHNtY3RyX21ha2VfcHJvZHVjdF9pZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfU1VCX1ZFQ1RPUiAqdHN2KTsKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9zdGF0aW9uX2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19TVUJfVkVDVE9SICp0c3YpOworc3RhdGljIGludCBzbWN0cl9tYWtlX3Jpbmdfc3RhdGlvbl9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdik7CitzdGF0aWMgaW50IHNtY3RyX21ha2VfcmluZ19zdGF0aW9uX3ZlcnNpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdik7CitzdGF0aWMgaW50IHNtY3RyX21ha2VfdHhfc3RhdHVzX2NvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdiwgX191MTYgdHhfZnN0YXR1cyk7CitzdGF0aWMgaW50IHNtY3RyX21ha2VfdXBzdHJlYW1fbmVpZ2hib3JfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2KTsKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV93cmFwX2RhdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdik7CisKKy8qIE8gKi8KK3N0YXRpYyBpbnQgc21jdHJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfb3Blbl90cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogUCAqLworc3RydWN0IG5ldF9kZXZpY2UgKnNtY3RyX3Byb2JlKGludCB1bml0KTsKK3N0YXRpYyBpbnQgX19pbml0IHNtY3RyX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKTsKK3N0YXRpYyBpbnQgc21jdHJfcHJvY2Vzc19yeF9wYWNrZXQoTUFDX0hFQURFUiAqcm1mLCBfX3UxNiBzaXplLAorICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3UxNiByeF9zdGF0dXMpOworCisvKiBSICovCitzdGF0aWMgaW50IHNtY3RyX3JhbV9tZW1vcnlfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfcmN2X2NoZ19wYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2ICpjb3JyZWxhdG9yKTsKK3N0YXRpYyBpbnQgc21jdHJfcmN2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX0hFQURFUiAqcm1mLAorICAgICAgICBfX3UxNiAqY29ycmVsYXRvcik7CitzdGF0aWMgaW50IHNtY3RyX3Jjdl90eF9mb3J3YXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19IRUFERVIgKnJtZik7CitzdGF0aWMgaW50IHNtY3RyX3Jjdl9ycV9hZGRyX3N0YXRlX2F0dGNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19IRUFERVIgKnJtZiwgX191MTYgKmNvcnJlbGF0b3IpOworc3RhdGljIGludCBzbWN0cl9yY3ZfdW5rbm93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2ICpjb3JyZWxhdG9yKTsKK3N0YXRpYyBpbnQgc21jdHJfcmVzZXRfYWRhcHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfcmVzdGFydF90eF9jaGFpbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBxdWV1ZSk7CitzdGF0aWMgaW50IHNtY3RyX3Jpbmdfc3RhdHVzX2NoZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfcnhfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIFMgKi8KK3N0YXRpYyBpbnQgc21jdHJfc2VuZF9kYXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9zZW5kX2xvYmVfbWVkaWFfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfc2VuZF9ycHRfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2IGNvcnJlbGF0b3IpOworc3RhdGljIGludCBzbWN0cl9zZW5kX3JwdF9hdHRjaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2IGNvcnJlbGF0b3IpOworc3RhdGljIGludCBzbWN0cl9zZW5kX3JwdF9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2IGNvcnJlbGF0b3IpOworc3RhdGljIGludCBzbWN0cl9zZW5kX3JwdF90eF9mb3J3YXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19IRUFERVIgKnJtZiwgX191MTYgdHhfZnN0YXR1cyk7CitzdGF0aWMgaW50IHNtY3RyX3NlbmRfcnNwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19IRUFERVIgKnJtZiwKKyAgICAgICAgX191MTYgcmNvZGUsIF9fdTE2IGNvcnJlbGF0b3IpOworc3RhdGljIGludCBzbWN0cl9zZW5kX3JxX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHNtY3RyX3NlbmRfdHhfZm9yd2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2ICp0eF9mc3RhdHVzKTsKK3N0YXRpYyBpbnQgc21jdHJfc2V0X2F1dGhfYWNjZXNzX3ByaShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqcnN2KTsKK3N0YXRpYyBpbnQgc21jdHJfc2V0X2F1dGhfZnVuY3RfY2xhc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnJzdik7CitzdGF0aWMgaW50IHNtY3RyX3NldF9jb3JyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19TVUJfVkVDVE9SICpyc3YsCisJX191MTYgKmNvcnJlbGF0b3IpOworc3RhdGljIGludCBzbWN0cl9zZXRfZXJyb3JfdGltZXJfdmFsdWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnJzdik7CitzdGF0aWMgaW50IHNtY3RyX3NldF9mcmFtZV9mb3J3YXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19TVUJfVkVDVE9SICpyc3YsIF9fdTggZGNfc2MpOworc3RhdGljIGludCBzbWN0cl9zZXRfbG9jYWxfcmluZ19udW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnJzdik7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc21jdHJfc2V0X2N0cmxfYXR0ZW50aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgc21jdHJfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9zZXRfcGFnZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3U4ICpidWYpOworc3RhdGljIGludCBzbWN0cl9zZXRfcGh5X2Ryb3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnJzdik7CitzdGF0aWMgaW50IHNtY3RyX3NldF9yaW5nX3NwZWVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl9zZXRfcnhfbG9va19haGVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfc2V0X3RyY19yZXNldChpbnQgaW9hZGRyKTsKK3N0YXRpYyBpbnQgc21jdHJfc2V0dXBfc2luZ2xlX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBfX3UxNiBjb21tYW5kLCBfX3UxNiBzdWJjb21tYW5kKTsKK3N0YXRpYyBpbnQgc21jdHJfc2V0dXBfc2luZ2xlX2NtZF93X2RhdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgX191MTYgY29tbWFuZCwgX191MTYgc3ViY29tbWFuZCk7CitzdGF0aWMgY2hhciAqc21jdHJfbWFsbG9jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IHNpemUpOworc3RhdGljIGludCBzbWN0cl9zdGF0dXNfY2hnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBUICovCitzdGF0aWMgdm9pZCBzbWN0cl90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl90cmNfc2VuZF9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgRkNCbG9jayAqZmNiLAorICAgICAgICBfX3UxNiBxdWV1ZSk7CitzdGF0aWMgX191MTYgc21jdHJfdHhfY29tcGxldGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgcXVldWUpOworc3RhdGljIHVuc2lnbmVkIHNob3J0IHNtY3RyX3R4X21vdmVfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgX191OCAqcGJ1ZmYsIHVuc2lnbmVkIGludCBieXRlcyk7CisKKy8qIFUgKi8KK3N0YXRpYyBpbnQgc21jdHJfdXBkYXRlX2Vycl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc21jdHJfdXBkYXRlX3J4X2NoYWluKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IHF1ZXVlKTsKK3N0YXRpYyBpbnQgc21jdHJfdXBkYXRlX3R4X2NoYWluKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIEZDQmxvY2sgKmZjYiwKKyAgICAgICAgX191MTYgcXVldWUpOworCisvKiBXICovCitzdGF0aWMgaW50IHNtY3RyX3dhaXRfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBzbWN0cl93YWl0X3doaWxlX2NidXN5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisjZGVmaW5lIFRPXzI1Nl9CWVRFX0JPVU5EUlkoWCkgICgoKFggKyAweGZmKSAmIDB4ZmYwMCkgLSBYKQorI2RlZmluZSBUT19QQVJBR1JBUEhfQk9VTkRSWShYKSAoKChYICsgMHgwZikgJiAweGZmZjApIC0gWCkKKyNkZWZpbmUgUEFSQUdSQVBIX0JPVU5EUlkoWCkgICAgc21jdHJfbWFsbG9jKGRldiwgVE9fUEFSQUdSQVBIX0JPVU5EUlkoWCkpCisKKy8qIEFsbG9jYXRlIEFkYXB0ZXIgU2hhcmVkIE1lbW9yeS4KKyAqIElNUE9SVEFOVCBOT1RFOiBBbnkgY2hhbmdlcyB0byB0aGlzIGZ1bmN0aW9uIE1VU1QgYmUgbWlycm9yZWQgaW4gdGhlCisgKiBmdW5jdGlvbiAiZ2V0X251bV9yeF9iZGJzIiBiZWxvdyEhIQorICoKKyAqIE9yZGVyIG9mIG1lbW9yeSBhbGxvY2F0aW9uOgorICoKKyAqICAgICAgIDAuIEluaXRpYWwgU3lzdGVtIENvbmZpZ3VyYXRpb24gQmxvY2sgUG9pbnRlcgorICogICAgICAgMS4gU3lzdGVtIENvbmZpZ3VyYXRpb24gQmxvY2sKKyAqICAgICAgIDIuIFN5c3RlbSBDb250cm9sIEJsb2NrCisgKiAgICAgICAzLiBBY3Rpb24gQ29tbWFuZCBCbG9jaworICogICAgICAgNC4gSW50ZXJydXB0IFN0YXR1cyBCbG9jaworICoKKyAqICAgICAgIDUuIE1BQyBUWCBGQ0InUworICogICAgICAgNi4gTk9OLU1BQyBUWCBGQ0InUworICogICAgICAgNy4gTUFDIFRYIEJEQidTCisgKiAgICAgICA4LiBOT04tTUFDIFRYIEJEQidTCisgKiAgICAgICA5LiBNQUMgUlggRkNCJ1MKKyAqICAgICAgMTAuIE5PTi1NQUMgUlggRkNCJ1MKKyAqICAgICAgMTEuIE1BQyBSWCBCREInUworICogICAgICAxMi4gTk9OLU1BQyBSWCBCREInUworICogICAgICAxMy4gTUFDIFRYIERhdGEgQnVmZmVyKCAxLCAyNTYgYnl0ZSBidWZmZXIpCisgKiAgICAgIDE0LiBNQUMgUlggRGF0YSBCdWZmZXIoIDEsIDI1NiBieXRlIGJ1ZmZlcikKKyAqCisgKiAgICAgIDE1LiBOT04tTUFDIFRYIERhdGEgQnVmZmVyCisgKiAgICAgIDE2LiBOT04tTUFDIFJYIERhdGEgQnVmZmVyCisgKi8KK3N0YXRpYyBpbnQgc21jdHJfYWxsb2Nfc2hhcmVkX21lbW9yeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2FsbG9jX3NoYXJlZF9tZW1vcnlcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgLyogQWxsb2NhdGUgaW5pdGlhbCBTeXN0ZW0gQ29udHJvbCBCbG9jayBwb2ludGVyLgorICAgICAgICAgKiBUaGlzIHBvaW50ZXIgaXMgbG9jYXRlZCBpbiB0aGUgbGFzdCBwYWdlLCBsYXN0IG9mZnNldCAtIDQuCisgICAgICAgICAqLworICAgICAgICB0cC0+aXNjcGJfcHRyID0gKElTQ1BCbG9jayAqKSh0cC0+cmFtX2FjY2VzcyArICgoX191MzIpNjQgKiAweDQwMCkKKyAgICAgICAgICAgICAgICAtIChsb25nKUlTQ1BfQkxPQ0tfU0laRSk7CisKKyAgICAgICAgLyogQWxsb2NhdGUgU3lzdGVtIENvbnRyb2wgQmxvY2tzLiAqLworICAgICAgICB0cC0+c2NnYl9wdHIgPSAoU0NHQmxvY2sgKilzbWN0cl9tYWxsb2MoZGV2LCBzaXplb2YoU0NHQmxvY2spKTsKKyAgICAgICAgUEFSQUdSQVBIX0JPVU5EUlkodHAtPnNoX21lbV91c2VkKTsKKworICAgICAgICB0cC0+c2NsYl9wdHIgPSAoU0NMQmxvY2sgKilzbWN0cl9tYWxsb2MoZGV2LCBzaXplb2YoU0NMQmxvY2spKTsKKyAgICAgICAgUEFSQUdSQVBIX0JPVU5EUlkodHAtPnNoX21lbV91c2VkKTsKKworICAgICAgICB0cC0+YWNiX2hlYWQgPSAoQUNCbG9jayAqKXNtY3RyX21hbGxvYyhkZXYsCisgICAgICAgICAgICAgICAgc2l6ZW9mKEFDQmxvY2spKnRwLT5udW1fYWNicyk7CisgICAgICAgIFBBUkFHUkFQSF9CT1VORFJZKHRwLT5zaF9tZW1fdXNlZCk7CisKKyAgICAgICAgdHAtPmlzYl9wdHIgPSAoSVNCbG9jayAqKXNtY3RyX21hbGxvYyhkZXYsIHNpemVvZihJU0Jsb2NrKSk7CisgICAgICAgIFBBUkFHUkFQSF9CT1VORFJZKHRwLT5zaF9tZW1fdXNlZCk7CisKKyAgICAgICAgdHAtPm1pc2NfY29tbWFuZF9kYXRhID0gKF9fdTE2ICopc21jdHJfbWFsbG9jKGRldiwgTUlTQ19EQVRBX1NJWkUpOworICAgICAgICBQQVJBR1JBUEhfQk9VTkRSWSh0cC0+c2hfbWVtX3VzZWQpOworCisgICAgICAgIC8qIEFsbG9jYXRlIHRyYW5zbWl0IEZDQnMuICovCisgICAgICAgIHRwLT50eF9mY2JfaGVhZFtNQUNfUVVFVUVdID0gKEZDQmxvY2sgKilzbWN0cl9tYWxsb2MoZGV2LAorICAgICAgICAgICAgICAgIHNpemVvZihGQ0Jsb2NrKSAqIHRwLT5udW1fdHhfZmNic1tNQUNfUVVFVUVdKTsKKworICAgICAgICB0cC0+dHhfZmNiX2hlYWRbTk9OX01BQ19RVUVVRV0gPSAoRkNCbG9jayAqKXNtY3RyX21hbGxvYyhkZXYsCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZDQmxvY2spICogdHAtPm51bV90eF9mY2JzW05PTl9NQUNfUVVFVUVdKTsKKworICAgICAgICB0cC0+dHhfZmNiX2hlYWRbQlVHX1FVRVVFXSA9IChGQ0Jsb2NrICopc21jdHJfbWFsbG9jKGRldiwKKyAgICAgICAgICAgICAgICBzaXplb2YoRkNCbG9jaykgKiB0cC0+bnVtX3R4X2ZjYnNbQlVHX1FVRVVFXSk7CisKKyAgICAgICAgLyogQWxsb2NhdGUgdHJhbnNtaXQgQkRCcy4gKi8KKyAgICAgICAgdHAtPnR4X2JkYl9oZWFkW01BQ19RVUVVRV0gPSAoQkRCbG9jayAqKXNtY3RyX21hbGxvYyhkZXYsCisgICAgICAgICAgICAgICAgc2l6ZW9mKEJEQmxvY2spICogdHAtPm51bV90eF9iZGJzW01BQ19RVUVVRV0pOworCisgICAgICAgIHRwLT50eF9iZGJfaGVhZFtOT05fTUFDX1FVRVVFXSA9IChCREJsb2NrICopc21jdHJfbWFsbG9jKGRldiwKKyAgICAgICAgICAgICAgICBzaXplb2YoQkRCbG9jaykgKiB0cC0+bnVtX3R4X2JkYnNbTk9OX01BQ19RVUVVRV0pOworCisgICAgICAgIHRwLT50eF9iZGJfaGVhZFtCVUdfUVVFVUVdID0gKEJEQmxvY2sgKilzbWN0cl9tYWxsb2MoZGV2LAorICAgICAgICAgICAgICAgIHNpemVvZihCREJsb2NrKSAqIHRwLT5udW1fdHhfYmRic1tCVUdfUVVFVUVdKTsKKworICAgICAgICAvKiBBbGxvY2F0ZSByZWNlaXZlIEZDQnMuICovCisgICAgICAgIHRwLT5yeF9mY2JfaGVhZFtNQUNfUVVFVUVdID0gKEZDQmxvY2sgKilzbWN0cl9tYWxsb2MoZGV2LAorICAgICAgICAgICAgICAgIHNpemVvZihGQ0Jsb2NrKSAqIHRwLT5udW1fcnhfZmNic1tNQUNfUVVFVUVdKTsKKworICAgICAgICB0cC0+cnhfZmNiX2hlYWRbTk9OX01BQ19RVUVVRV0gPSAoRkNCbG9jayAqKXNtY3RyX21hbGxvYyhkZXYsCisgICAgICAgICAgICAgICAgc2l6ZW9mKEZDQmxvY2spICogdHAtPm51bV9yeF9mY2JzW05PTl9NQUNfUVVFVUVdKTsKKworICAgICAgICAvKiBBbGxvY2F0ZSByZWNlaXZlIEJEQnMuICovCisgICAgICAgIHRwLT5yeF9iZGJfaGVhZFtNQUNfUVVFVUVdID0gKEJEQmxvY2sgKilzbWN0cl9tYWxsb2MoZGV2LAorICAgICAgICAgICAgICAgIHNpemVvZihCREJsb2NrKSAqIHRwLT5udW1fcnhfYmRic1tNQUNfUVVFVUVdKTsKKworICAgICAgICB0cC0+cnhfYmRiX2VuZFtNQUNfUVVFVUVdID0gKEJEQmxvY2sgKilzbWN0cl9tYWxsb2MoZGV2LCAwKTsKKworICAgICAgICB0cC0+cnhfYmRiX2hlYWRbTk9OX01BQ19RVUVVRV0gPSAoQkRCbG9jayAqKXNtY3RyX21hbGxvYyhkZXYsCisgICAgICAgICAgICAgICAgc2l6ZW9mKEJEQmxvY2spICogdHAtPm51bV9yeF9iZGJzW05PTl9NQUNfUVVFVUVdKTsKKworICAgICAgICB0cC0+cnhfYmRiX2VuZFtOT05fTUFDX1FVRVVFXSA9IChCREJsb2NrICopc21jdHJfbWFsbG9jKGRldiwgMCk7CisKKyAgICAgICAgLyogQWxsb2NhdGUgTUFDIHRyYW5zbWl0IGJ1ZmZlcnMuCisgICAgICAgICAqIE1BQyBUeCBCdWZmZXJzIGRvZW4ndCBoYXZlIHRvIGJlIG9uIGFuIE9ERCBCb3VuZHJ5LgorICAgICAgICAgKi8KKyAgICAgICAgdHAtPnR4X2J1ZmZfaGVhZFtNQUNfUVVFVUVdCisgICAgICAgICAgICAgICAgPSAoX191MTYgKilzbWN0cl9tYWxsb2MoZGV2LCB0cC0+dHhfYnVmZl9zaXplW01BQ19RVUVVRV0pOworICAgICAgICB0cC0+dHhfYnVmZl9jdXJyW01BQ19RVUVVRV0gPSB0cC0+dHhfYnVmZl9oZWFkW01BQ19RVUVVRV07CisgICAgICAgIHRwLT50eF9idWZmX2VuZCBbTUFDX1FVRVVFXSA9IChfX3UxNiAqKXNtY3RyX21hbGxvYyhkZXYsIDApOworCisgICAgICAgIC8qIEFsbG9jYXRlIEJVRyB0cmFuc21pdCBidWZmZXJzLiAqLworICAgICAgICB0cC0+dHhfYnVmZl9oZWFkW0JVR19RVUVVRV0KKyAgICAgICAgICAgICAgICA9IChfX3UxNiAqKXNtY3RyX21hbGxvYyhkZXYsIHRwLT50eF9idWZmX3NpemVbQlVHX1FVRVVFXSk7CisgICAgICAgIHRwLT50eF9idWZmX2N1cnJbQlVHX1FVRVVFXSA9IHRwLT50eF9idWZmX2hlYWRbQlVHX1FVRVVFXTsKKyAgICAgICAgdHAtPnR4X2J1ZmZfZW5kW0JVR19RVUVVRV0gPSAoX191MTYgKilzbWN0cl9tYWxsb2MoZGV2LCAwKTsKKworICAgICAgICAvKiBBbGxvY2F0ZSBNQUMgcmVjZWl2ZSBkYXRhIGJ1ZmZlcnMuCisgICAgICAgICAqIE1BQyBSeCBidWZmZXIgZG9lc24ndCBoYXZlIHRvIGJlIG9uIGEgMjU2IGJ5dGUgYm91bmRhcnkuCisgICAgICAgICAqLworICAgICAgICB0cC0+cnhfYnVmZl9oZWFkW01BQ19RVUVVRV0gPSAoX191MTYgKilzbWN0cl9tYWxsb2MoZGV2LAorICAgICAgICAgICAgICAgIFJYX0RBVEFfQlVGRkVSX1NJWkUgKiB0cC0+bnVtX3J4X2JkYnNbTUFDX1FVRVVFXSk7CisgICAgICAgIHRwLT5yeF9idWZmX2VuZFtNQUNfUVVFVUVdID0gKF9fdTE2ICopc21jdHJfbWFsbG9jKGRldiwgMCk7CisKKyAgICAgICAgLyogQWxsb2NhdGUgTm9uLU1BQyB0cmFuc21pdCBidWZmZXJzLgorICAgICAgICAgKiA/PyBGb3IgbWF4aW11bSBOZXR3YXJlIHBlcmZvcm1hbmNlLCBwdXQgVHggQnVmZmVycyBvbgorICAgICAgICAgKiBPREQgQm91bmRyeSBhbmQgdGhlbiByZXN0b3JlIG1hbGxvYyB0byBFdmVuIEJvdW5kcnlzLgorICAgICAgICAgKi8KKyAgICAgICAgc21jdHJfbWFsbG9jKGRldiwgMUwpOworICAgICAgICB0cC0+dHhfYnVmZl9oZWFkW05PTl9NQUNfUVVFVUVdCisgICAgICAgICAgICAgICAgPSAoX191MTYgKilzbWN0cl9tYWxsb2MoZGV2LCB0cC0+dHhfYnVmZl9zaXplW05PTl9NQUNfUVVFVUVdKTsKKyAgICAgICAgdHAtPnR4X2J1ZmZfY3VycltOT05fTUFDX1FVRVVFXSA9IHRwLT50eF9idWZmX2hlYWRbTk9OX01BQ19RVUVVRV07CisgICAgICAgIHRwLT50eF9idWZmX2VuZCBbTk9OX01BQ19RVUVVRV0gPSAoX191MTYgKilzbWN0cl9tYWxsb2MoZGV2LCAwKTsKKyAgICAgICAgc21jdHJfbWFsbG9jKGRldiwgMUwpOworCisgICAgICAgIC8qIEFsbG9jYXRlIE5vbi1NQUMgcmVjZWl2ZSBkYXRhIGJ1ZmZlcnMuCisgICAgICAgICAqIFRvIGd1YXJhbnRlZSBhIG1pbmltdW0gb2YgMjU2IGNvbnRpZ291cyBtZW1vcnkgdG8KKyAgICAgICAgICogVU1fUmVjZWl2ZV9QYWNrZXQncyBsb29rYWhlYWQgcG9pbnRlciwgYmVmb3JlIGEgcGFnZQorICAgICAgICAgKiBjaGFuZ2Ugb3IgcmluZyBlbmQgaXMgZW5jb3VudGVyZWQsIHBsYWNlIGVhY2ggcnggYnVmZmVyIG9uCisgICAgICAgICAqIGEgMjU2IGJ5dGUgYm91bmRhcnkuCisgICAgICAgICAqLworICAgICAgICBzbWN0cl9tYWxsb2MoZGV2LCBUT18yNTZfQllURV9CT1VORFJZKHRwLT5zaF9tZW1fdXNlZCkpOworICAgICAgICB0cC0+cnhfYnVmZl9oZWFkW05PTl9NQUNfUVVFVUVdID0gKF9fdTE2ICopc21jdHJfbWFsbG9jKGRldiwKKyAgICAgICAgICAgICAgICBSWF9EQVRBX0JVRkZFUl9TSVpFICogdHAtPm51bV9yeF9iZGJzW05PTl9NQUNfUVVFVUVdKTsKKyAgICAgICAgdHAtPnJ4X2J1ZmZfZW5kW05PTl9NQUNfUVVFVUVdID0gKF9fdTE2ICopc21jdHJfbWFsbG9jKGRldiwgMCk7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworLyogRW50ZXIgQnlwYXNzIHN0YXRlLiAqLworc3RhdGljIGludCBzbWN0cl9ieXBhc3Nfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgaW50IGVycjsKKworCWlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgIAlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2J5cGFzc19zdGF0ZVxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBlcnIgPSBzbWN0cl9zZXR1cF9zaW5nbGVfY21kKGRldiwgQUNCX0NNRF9DSEFOR0VfSk9JTl9TVEFURSwgSlNfQllQQVNTX1NUQVRFKTsKKworICAgICAgICByZXR1cm4gKGVycik7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfY2hlY2tzdW1fZmlybXdhcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBfX3UxNiBpLCBjaGVja3N1bSA9IDA7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2NoZWNrc3VtX2Zpcm13YXJlXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIHNtY3RyX2VuYWJsZV9hZGFwdGVyX2N0cmxfc3RvcmUoZGV2KTsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCBDU19SQU1fU0laRTsgaSArPSAyKQorICAgICAgICAgICAgICAgIGNoZWNrc3VtICs9ICooKF9fdTE2ICopKHRwLT5yYW1fYWNjZXNzICsgaSkpOworCisgICAgICAgIHRwLT5taWNyb2NvZGVfdmVyc2lvbiA9ICooX191MTYgKikodHAtPnJhbV9hY2Nlc3MKKyAgICAgICAgICAgICAgICArIENTX1JBTV9WRVJTSU9OX09GRlNFVCk7CisgICAgICAgIHRwLT5taWNyb2NvZGVfdmVyc2lvbiA+Pj0gODsKKworICAgICAgICBzbWN0cl9kaXNhYmxlX2FkYXB0ZXJfY3RybF9zdG9yZShkZXYpOworCisgICAgICAgIGlmKGNoZWNrc3VtKQorICAgICAgICAgICAgICAgIHJldHVybiAoY2hlY2tzdW0pOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNtY3RyX2Noa19tY2Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZmRlZiBDT05GSUdfTUNBX0xFR0FDWQorCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgY3VycmVudF9zbG90OworCV9fdTggcjEsIHIyLCByMywgcjQsIHI1OworCisJY3VycmVudF9zbG90ID0gbWNhX2ZpbmRfdW51c2VkX2FkYXB0ZXIoc21jdHJfcG9zaWQsIDApOworCWlmKGN1cnJlbnRfc2xvdCA9PSBNQ0FfTk9URk9VTkQpCisJCXJldHVybiAoLUVOT0RFVik7CisKKwltY2Ffc2V0X2FkYXB0ZXJfbmFtZShjdXJyZW50X3Nsb3QsIHNtY3RyX25hbWUpOworCW1jYV9tYXJrX2FzX3VzZWQoY3VycmVudF9zbG90KTsKKwl0cC0+c2xvdF9udW0gPSBjdXJyZW50X3Nsb3Q7CisKKwlyMSA9IG1jYV9yZWFkX3N0b3JlZF9wb3ModHAtPnNsb3RfbnVtLCAyKTsKKwlyMiA9IG1jYV9yZWFkX3N0b3JlZF9wb3ModHAtPnNsb3RfbnVtLCAzKTsKKworCWlmKHRwLT5zbG90X251bSkKKwkJb3V0YihDTkZHX1BPU19DT05UUk9MX1JFRywgKF9fdTgpKCh0cC0+c2xvdF9udW0gLSAxKSB8IENORkdfU0xPVF9FTkFCTEVfQklUKSk7CisJZWxzZQorCQlvdXRiKENORkdfUE9TX0NPTlRST0xfUkVHLCAoX191OCkoKHRwLT5zbG90X251bSkgfCBDTkZHX1NMT1RfRU5BQkxFX0JJVCkpOworCisJcjEgPSBpbmIoQ05GR19QT1NfUkVHMSk7CisJcjIgPSBpbmIoQ05GR19QT1NfUkVHMCk7CisKKwl0cC0+YmljX3R5cGUgPSBCSUNfNTk0X0NISVA7CisKKwkvKiBJTyAqLworCXIyID0gbWNhX3JlYWRfc3RvcmVkX3Bvcyh0cC0+c2xvdF9udW0sIDIpOworCXIyICY9IDB4RjA7CisJZGV2LT5iYXNlX2FkZHIgPSAoKF9fdTE2KXIyIDw8IDgpICsgKF9fdTE2KTB4ODAwOworCXJlcXVlc3RfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBTTUNUUl9JT19FWFRFTlQsIHNtY3RyX25hbWUpOworCisJLyogSVJRICovCisJcjUgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHRwLT5zbG90X251bSwgNSk7CisJcjUgJj0gMHhDOworICAgICAgICBzd2l0Y2gocjUpCisJeworICAgICAgICAgICAgCWNhc2UgMDoKKwkJCWRldi0+aXJxID0gMzsKKyAgICAgICAgICAgICAgIAkJYnJlYWs7CisKKyAgICAgICAgICAgIAljYXNlIDB4NDoKKwkJCWRldi0+aXJxID0gNDsKKyAgICAgICAgICAgICAgIAkJYnJlYWs7CisKKyAgICAgICAgICAgIAljYXNlIDB4ODoKKwkJCWRldi0+aXJxID0gMTA7CisgICAgICAgICAgICAgICAJCWJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdDoKKwkJCWRldi0+aXJxID0gMTU7CisgICAgICAgICAgICAgICAJCWJyZWFrOworCX0KKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIHNtY3RyX2ludGVycnVwdCwgU0FfU0hJUlEsIHNtY3RyX25hbWUsIGRldikpIHsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFNNQ1RSX0lPX0VYVEVOVCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEdldCBSQU0gYmFzZSAqLworCXIzID0gbWNhX3JlYWRfc3RvcmVkX3Bvcyh0cC0+c2xvdF9udW0sIDMpOworCXRwLT5yYW1fYmFzZSA9ICgoX191MzIpKHIzICYgMHg3KSA8PCAxMykgKyAweDBDMDAwMDsKKwlpZiAocjMgJiAweDgpCisJCXRwLT5yYW1fYmFzZSArPSAweDAxMDAwMDsKKwlpZiAocjMgJiAweDgwKQorCQl0cC0+cmFtX2Jhc2UgKz0gMHhGMDAwMDA7CisKKwkvKiBHZXQgUmFtIFNpemUgKi8KKwlyMyAmPSAweDMwOworCXIzID4+PSA0OworCisJdHAtPnJhbV91c2FibGUgPSAoX191MTYpQ05GR19TSVpFXzhLQiA8PCByMzsKKwl0cC0+cmFtX3NpemUgPSAoX191MTYpQ05GR19TSVpFXzY0S0I7CisJdHAtPmJvYXJkX2lkIHw9IFRPS0VOX01FRElBOworCisJcjQgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHRwLT5zbG90X251bSwgNCk7CisJdHAtPnJvbV9iYXNlID0gKChfX3UzMikocjQgJiAweDcpIDw8IDEzKSArIDB4MEMwMDAwOworCWlmIChyNCAmIDB4OCkKKwkJdHAtPnJvbV9iYXNlICs9IDB4MDEwMDAwOworCisJLyogR2V0IFJPTSBzaXplLiAqLworCXI0ID4+PSA0OworCXN3aXRjaCAocjQpIHsKKwkJY2FzZSAwOgorCQkJdHAtPnJvbV9zaXplID0gQ05GR19TSVpFXzhLQjsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQl0cC0+cm9tX3NpemUgPSBDTkZHX1NJWkVfMTZLQjsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQl0cC0+cm9tX3NpemUgPSBDTkZHX1NJWkVfMzJLQjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdHAtPnJvbV9zaXplID0gUk9NX0RJU0FCTEU7CisJfQorCisJLyogR2V0IE1lZGlhIFR5cGUuICovCisJcjUgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHRwLT5zbG90X251bSwgNSk7CisJcjUgJj0gQ05GR19NRURJQV9UWVBFX01BU0s7CisJc3dpdGNoKHI1KQorCXsKKwkJY2FzZSAoMCk6CisJCQl0cC0+bWVkaWFfdHlwZSA9IE1FRElBX1NUUF80OworCQkJYnJlYWs7CisKKwkJY2FzZSAoMSk6CisJCQl0cC0+bWVkaWFfdHlwZSA9IE1FRElBX1NUUF8xNjsKKwkJCWJyZWFrOworCisJCWNhc2UgKDMpOgorCQkJdHAtPm1lZGlhX3R5cGUgPSBNRURJQV9VVFBfMTY7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJdHAtPm1lZGlhX3R5cGUgPSBNRURJQV9VVFBfNDsKKwkJCWJyZWFrOworCX0KKwl0cC0+bWVkaWFfbWVudSA9IDE0OworCisJcjIgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHRwLT5zbG90X251bSwgMik7CisJaWYoIShyMiAmIDB4MDIpKQorCQl0cC0+bW9kZV9iaXRzIHw9IEVBUkxZX1RPS0VOX1JFTDsKKworCS8qIERpc2FibGUgc2xvdCAqLworCW91dGIoQ05GR19QT1NfQ09OVFJPTF9SRUcsIDApOworCisJdHAtPmJvYXJkX2lkID0gc21jdHJfZ2V0X2JvYXJkaWQoZGV2LCAxKTsKKwlzd2l0Y2godHAtPmJvYXJkX2lkICYgMHhmZmZmKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBXRDgxMTVUQToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX21vZGVsID0gIjgxMTVUL0EiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFdEODExNVQ6CisJCQlpZih0cC0+ZXh0cmFfaW5mbyAmIENISVBfUkVWX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX21vZGVsID0gIjgxMTVUIHJldiBYRSI7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX21vZGVsID0gIjgxMTVUIHJldiBYRCI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9tb2RlbCA9ICJVbmtub3duIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKwlyZXR1cm4gKDApOworI2Vsc2UKKwlyZXR1cm4gKC0xKTsKKyNlbmRpZiAvKiBDT05GSUdfTUNBX0xFR0FDWSAqLworfQorCitzdGF0aWMgaW50IHNtY3RyX2NoZ19yeF9tYXNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGVyciA9IDA7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9jaGdfcnhfbWFza1xuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBzbWN0cl9lbmFibGVfMTZiaXQoZGV2KTsKKyAgICAgICAgc21jdHJfc2V0X3BhZ2UoZGV2LCAoX191OCAqKXRwLT5yYW1fYWNjZXNzKTsKKworICAgICAgICBpZih0cC0+bW9kZV9iaXRzICYgTE9PUElOR19NT0RFX01BU0spCisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMCB8PSBSWF9PV05fQklUOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMCAmPSB+UlhfT1dOX0JJVDsKKworICAgICAgICBpZih0cC0+cmVjZWl2ZV9tYXNrICYgUFJPTUlTQ1VPVVNfTU9ERSkKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQwIHw9IFBST01JU0NVT1VTX0JJVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDAgJj0gflBST01JU0NVT1VTX0JJVDsKKworICAgICAgICBpZih0cC0+cmVjZWl2ZV9tYXNrICYgQUNDRVBUX0VSUl9QQUNLRVRTKQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDAgfD0gU0FWQkFEX0JJVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDAgJj0gflNBVkJBRF9CSVQ7CisKKyAgICAgICAgaWYodHAtPnJlY2VpdmVfbWFzayAmIEFDQ0VQVF9BVFRfTUFDX0ZSQU1FUykKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQwIHw9IFJYQVRNQUM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQwICY9IH5SWEFUTUFDOworCisgICAgICAgIGlmKHRwLT5yZWNlaXZlX21hc2sgJiBBQ0NFUFRfTVVMVElfUFJPTSkKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQxIHw9IE1VTFRJQ0FTVF9BRERSRVNTX0JJVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDEgJj0gfk1VTFRJQ0FTVF9BRERSRVNTX0JJVDsKKworICAgICAgICBpZih0cC0+cmVjZWl2ZV9tYXNrICYgQUNDRVBUX1NPVVJDRV9ST1VUSU5HX1NQQU5OSU5HKQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDEgfD0gU09VUkNFX1JPVVRJTkdfU1BBTk5JTkdfQklUUzsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYodHAtPnJlY2VpdmVfbWFzayAmIEFDQ0VQVF9TT1VSQ0VfUk9VVElORykKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDEgfD0gU09VUkNFX1JPVVRJTkdfRVhQTE9SRVJfQklUOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDEgJj0gflNPVVJDRV9ST1VUSU5HX1NQQU5OSU5HX0JJVFM7CisgICAgICAgIH0KKworICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfd3JpdGVfd29yZF9jbWQoZGV2LCBSV19DT05GSUdfUkVHSVNURVJfMCwKKyAgICAgICAgICAgICAgICAmdHAtPmNvbmZpZ193b3JkMCkpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworICAgICAgICB9CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX2lzc3VlX3dyaXRlX3dvcmRfY21kKGRldiwgUldfQ09ORklHX1JFR0lTVEVSXzEsCisgICAgICAgICAgICAgICAgJnRwLT5jb25maWdfd29yZDEpKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKyAgICAgICAgfQorCisgICAgICAgIHNtY3RyX2Rpc2FibGVfMTZiaXQoZGV2KTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2NsZWFyX2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgb3V0YigodHAtPnRyY19tYXNrIHwgQ1NSX0NMUlRJTlQpLCBkZXYtPmJhc2VfYWRkciArIENTUik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9jbGVhcl90cmNfcmVzZXQoaW50IGlvYWRkcikKK3sKKyAgICAgICAgX191OCByOworCisgICAgICAgIHIgPSBpbmIoaW9hZGRyICsgTVNSKTsKKyAgICAgICAgb3V0Yih+TVNSX1JTVCAmIHIsIGlvYWRkciArIE1TUik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFRoZSBpbnZlcnNlIHJvdXRpbmUgdG8gc21jdHJfb3BlbigpLgorICovCitzdGF0aWMgaW50IHNtY3RyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKyAgICAgICAgaW50IGVycjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwl0cC0+Y2xlYW51cCA9IDE7CisKKyAgICAgICAgLyogQ2hlY2sgdG8gc2VlIGlmIGFkYXB0ZXIgaXMgYWxyZWFkeSBpbiBhIGNsb3NlZCBzdGF0ZS4gKi8KKyAgICAgICAgaWYodHAtPnN0YXR1cyAhPSBPUEVOKQorICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisKKyAgICAgICAgc21jdHJfZW5hYmxlXzE2Yml0KGRldik7CisgICAgICAgIHNtY3RyX3NldF9wYWdlKGRldiwgKF9fdTggKil0cC0+cmFtX2FjY2Vzcyk7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX2lzc3VlX3JlbW92ZV9jbWQoZGV2KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbWN0cl9kaXNhYmxlXzE2Yml0KGRldik7CisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworICAgICAgICB9CisKKyAgICAgICAgZm9yKDs7KQorICAgICAgICB7CisgICAgICAgICAgICAgICAgc2tiID0gc2tiX2RlcXVldWUoJnRwLT5TZW5kU2tiUXVldWUpOworICAgICAgICAgICAgICAgIGlmKHNrYiA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgdHAtPlF1ZXVlU2tiKys7CisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYihza2IpOworICAgICAgICB9CisKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2RlY29kZV9maXJtd2FyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHNob3J0IGJpdCA9IDB4ODAsIHNoaWZ0ID0gMTI7CisgICAgICAgIERFQ09ERV9UUkVFX05PREUgKnRyZWU7CisgICAgICAgIHNob3J0IGJyYW5jaCwgdHNpemU7CisgICAgICAgIF9fdTE2IGJ1ZmYgPSAwOworICAgICAgICBsb25nIHdlaWdodDsKKyAgICAgICAgX191OCAqdWNvZGU7CisgICAgICAgIF9fdTE2ICptZW07CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2RlY29kZV9maXJtd2FyZVxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICB3ZWlnaHQgID0gKihsb25nICopKHRwLT5wdHJfdWNvZGUgKyBXRUlHSFRfT0ZGU0VUKTsKKyAgICAgICAgdHNpemUgICA9ICooX191OCAqKSh0cC0+cHRyX3Vjb2RlICsgVFJFRV9TSVpFX09GRlNFVCk7CisgICAgICAgIHRyZWUgICAgPSAoREVDT0RFX1RSRUVfTk9ERSAqKSh0cC0+cHRyX3Vjb2RlICsgVFJFRV9PRkZTRVQpOworICAgICAgICB1Y29kZSAgID0gKF9fdTggKikodHAtPnB0cl91Y29kZSArIFRSRUVfT0ZGU0VUCisgICAgICAgICAgICAgICAgICAgICAgICArICh0c2l6ZSAqIHNpemVvZihERUNPREVfVFJFRV9OT0RFKSkpOworICAgICAgICBtZW0gICAgID0gKF9fdTE2ICopKHRwLT5yYW1fYWNjZXNzKTsKKworICAgICAgICB3aGlsZSh3ZWlnaHQpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmFuY2ggPSBST09UOworICAgICAgICAgICAgICAgIHdoaWxlKCh0cmVlICsgYnJhbmNoKS0+dGFnICE9IExFQUYgJiYgd2VpZ2h0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5jaCA9ICp1Y29kZSAmIGJpdCA/ICh0cmVlICsgYnJhbmNoKS0+bGxpbmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAodHJlZSArIGJyYW5jaCktPnJsaW5rOworCisgICAgICAgICAgICAgICAgICAgICAgICBiaXQgPj49IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQtLTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoYml0ID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdCA9IDB4ODA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjb2RlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnVmZiB8PSAodHJlZSArIGJyYW5jaCktPmluZm8gPDwgc2hpZnQ7CisgICAgICAgICAgICAgICAgc2hpZnQgLT0gNDsKKworICAgICAgICAgICAgICAgIGlmKHNoaWZ0IDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAqKG1lbSsrKSA9IFNXQVBfQllURVMoYnVmZik7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmICAgID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ICAgPSAxMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBUaGUgZm9sbG93aW5nIGFzc3VtZXMgdGhlIENvbnRyb2wgU3RvcmUgTWVtb3J5IGhhcworICAgICAgICAgKiBiZWVuIGluaXRpYWxpemVkIHRvIHplcm8uIElmIHRoZSBsYXN0IHBhcnRpYWwgd29yZAorICAgICAgICAgKiBpcyB6ZXJvLCBpdCB3aWxsIG5vdCBiZSB3cml0dGVuLgorICAgICAgICAgKi8KKyAgICAgICAgaWYoYnVmZikKKyAgICAgICAgICAgICAgICAqKG1lbSsrKSA9IFNXQVBfQllURVMoYnVmZik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9kaXNhYmxlXzE2Yml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHJldHVybiAoMCk7Cit9CisKKy8qCisgKiBPbiBFeGl0LCBBZGFwdGVyIGlzOgorICogMS4gVFJDIGlzIGluIGEgcmVzZXQgc3RhdGUgYW5kIHVuLWluaXRpYWxpemVkLgorICogMi4gQWRhcHRlciBtZW1vcnkgaXMgZW5hYmxlZC4KKyAqIDMuIENvbnRyb2wgU3RvcmUgbWVtb3J5IGlzIG91dCBvZiBjb250ZXh0ICgtV0NTUyBpcyAxKS4KKyAqLworc3RhdGljIGludCBzbWN0cl9kaXNhYmxlX2FkYXB0ZXJfY3RybF9zdG9yZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfZGlzYWJsZV9hZGFwdGVyX2N0cmxfc3RvcmVcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgdHAtPnRyY19tYXNrIHw9IENTUl9XQ1NTOworICAgICAgICBvdXRiKHRwLT50cmNfbWFzaywgaW9hZGRyICsgQ1NSKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2Rpc2FibGVfYmljX2ludChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgICAgICB0cC0+dHJjX21hc2sgPSBDU1JfTVNLX0FMTCB8IENTUl9NU0tDQlVTWQorCSAgICAgICAgfCBDU1JfTVNLVElOVCB8IENTUl9XQ1NTOworICAgICAgICBvdXRiKHRwLT50cmNfbWFzaywgaW9hZGRyICsgQ1NSKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2VuYWJsZV8xNmJpdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIF9fdTggICAgcjsKKworICAgICAgICBpZih0cC0+YWRhcHRlcl9idXMgPT0gQlVTX0lTQTE2X1RZUEUpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByID0gaW5iKGRldi0+YmFzZV9hZGRyICsgTEFBUik7CisgICAgICAgICAgICAgICAgb3V0YigociB8IExBQVJfTUVNMTZFTkIpLCBkZXYtPmJhc2VfYWRkciArIExBQVIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFRvIGVuYWJsZSB0aGUgYWRhcHRlciBjb250cm9sIHN0b3JlIG1lbW9yeToKKyAqIDEuIEFkYXB0ZXIgbXVzdCBiZSBpbiBhIFJFU0VUIHN0YXRlLgorICogMi4gQWRhcHRlciBtZW1vcnkgbXVzdCBiZSBlbmFibGVkLgorICogMy4gQ29udHJvbCBTdG9yZSBNZW1vcnkgaXMgaW4gY29udGV4dCAoLVdDU1MgaXMgMCkuCisgKi8KK3N0YXRpYyBpbnQgc21jdHJfZW5hYmxlX2FkYXB0ZXJfY3RybF9zdG9yZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfZW5hYmxlX2FkYXB0ZXJfY3RybF9zdG9yZVxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBzbWN0cl9zZXRfdHJjX3Jlc2V0KGlvYWRkcik7CisgICAgICAgIHNtY3RyX2VuYWJsZV9hZGFwdGVyX3JhbShkZXYpOworCisgICAgICAgIHRwLT50cmNfbWFzayAmPSB+Q1NSX1dDU1M7CisgICAgICAgIG91dGIodHAtPnRyY19tYXNrLCBpb2FkZHIgKyBDU1IpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfZW5hYmxlX2FkYXB0ZXJfcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAgICAgX191OCByOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9lbmFibGVfYWRhcHRlcl9yYW1cbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgciA9IGluYihpb2FkZHIgKyBNU1IpOworICAgICAgICBvdXRiKE1TUl9NRU1CIHwgciwgaW9hZGRyICsgTVNSKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2VuYWJsZV9iaWNfaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgICAgICBfX3U4IHI7CisKKyAgICAgICAgc3dpdGNoKHRwLT5iaWNfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgKEJJQ181ODRfQ0hJUCk6CisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+dHJjX21hc2sgPSBDU1JfTVNLQ0JVU1kgfCBDU1JfV0NTUzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dGIodHAtPnRyY19tYXNrLCBpb2FkZHIgKyBDU1IpOworICAgICAgICAgICAgICAgICAgICAgICAgciA9IGluYihpb2FkZHIgKyBJUlIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0YihyIHwgSVJSX0lFTiwgaW9hZGRyICsgSVJSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAoQklDXzU5NF9DSElQKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT50cmNfbWFzayA9IENTUl9NU0tDQlVTWSB8IENTUl9XQ1NTOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0Yih0cC0+dHJjX21hc2ssIGlvYWRkciArIENTUik7CisgICAgICAgICAgICAgICAgICAgICAgICByID0gaW5iKGlvYWRkciArIElNQ0NSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dGIociB8IElNQ0NSX0VJTCwgaW9hZGRyICsgSU1DQ1IpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzbWN0cl9jaGtfaXNhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgICAgICBfX3U4IHIxLCByMiwgYiwgY2hrc3VtID0gMDsKKyAgICAgICAgX191MTYgcjsKKwlpbnQgaTsKKwlpbnQgZXJyID0gLUVOT0RFVjsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfY2hrX2lzYSAlIzR4XG4iLCBkZXYtPm5hbWUsIGlvYWRkcik7CisKKwlpZigoaW9hZGRyICYgMHgxRikgIT0gMCkKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICAvKiBHcmFiIHRoZSByZWdpb24gc28gdGhhdCBubyBvbmUgZWxzZSB0cmllcyB0byBwcm9iZSBvdXIgaW9wb3J0cy4gKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgU01DVFJfSU9fRVhURU5ULCBzbWN0cl9uYW1lKSkgeworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworICAgICAgICAvKiBDaGVja3N1bSBTTUMgbm9kZSBhZGRyZXNzICovCisgICAgICAgIGZvcihpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGIgPSBpbmIoaW9hZGRyICsgTEFSMCArIGkpOworICAgICAgICAgICAgICAgIGNoa3N1bSArPSBiOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNoa3N1bSAhPSBOT0RFX0FERFJfQ0tTVU0pCisgICAgICAgICAgICAgICAgZ290byBvdXQyOworCisgICAgICAgIGIgPSBpbmIoaW9hZGRyICsgQkRJRCk7CisJaWYoYiAhPSBCUkRfSURfODExNVQpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBUaGUgYWRhcHRlciBmb3VuZCBpcyBub3Qgc3VwcG9ydGVkXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgIGdvdG8gb3V0MjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIGZvciA4MTE1VCBCb2FyZCBJRCAqLworICAgICAgICByMiA9IDA7CisgICAgICAgIGZvcihyID0gMDsgciA8IDg7IHIrKykKKyAgICAgICAgeworICAgICAgICAgICAgcjEgPSBpbmIoaW9hZGRyICsgMHg4ICsgcik7CisgICAgICAgICAgICByMiArPSByMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHZhbHVlIG9mIFJlZ0YgYWRkcyB1cCB0aGUgc3VtIHRvIDB4RkYgKi8KKyAgICAgICAgaWYoKHIyICE9IDB4RkYpICYmIChyMiAhPSAweEVFKSkKKyAgICAgICAgICAgICAgICBnb3RvIG91dDI7CisKKyAgICAgICAgLyogR2V0IGFkYXB0ZXIgSUQgKi8KKyAgICAgICAgdHAtPmJvYXJkX2lkID0gc21jdHJfZ2V0X2JvYXJkaWQoZGV2LCAwKTsKKyAgICAgICAgc3dpdGNoKHRwLT5ib2FyZF9pZCAmIDB4ZmZmZikKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgV0Q4MTE1VEE6CisgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9tb2RlbCA9ICI4MTE1VC9BIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBXRDgxMTVUOgorCQkJaWYodHAtPmV4dHJhX2luZm8gJiBDSElQX1JFVl9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9tb2RlbCA9ICI4MTE1VCByZXYgWEUiOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9tb2RlbCA9ICI4MTE1VCByZXYgWEQiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfbW9kZWwgPSAiVW5rbm93biI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFN0b3JlIEJJQyB0eXBlLiAqLworICAgICAgICB0cC0+YmljX3R5cGUgPSBCSUNfNTg0X0NISVA7CisgICAgICAgIHRwLT5uaWNfdHlwZSA9IE5JQ184MjVfQ0hJUDsKKworICAgICAgICAvKiBDb3B5IFJhbSBTaXplICovCisgICAgICAgIHRwLT5yYW1fdXNhYmxlICA9IENORkdfU0laRV8xNktCOworICAgICAgICB0cC0+cmFtX3NpemUgICAgPSBDTkZHX1NJWkVfNjRLQjsKKworICAgICAgICAvKiBHZXQgNTh4IFJhbSBCYXNlICovCisgICAgICAgIHIxID0gaW5iKGlvYWRkcik7CisgICAgICAgIHIxICY9IDB4M0Y7CisKKyAgICAgICAgcjIgPSBpbmIoaW9hZGRyICsgQ05GR19MQUFSXzU4NCk7CisgICAgICAgIHIyICY9IENORkdfTEFBUl9NQVNLOworICAgICAgICByMiA8PD0gMzsKKyAgICAgICAgcjIgfD0gKChyMSAmIDB4MzgpID4+IDMpOworCisgICAgICAgIHRwLT5yYW1fYmFzZSA9ICgoX191MzIpcjIgPDwgMTYpICsgKCgoX191MzIpKHIxICYgMHg3KSkgPDwgMTMpOworCisgICAgICAgIC8qIEdldCA1ODQgSXJxICovCisgICAgICAgIHIxID0gMDsKKyAgICAgICAgcjEgPSBpbmIoaW9hZGRyICsgQ05GR19JQ1JfNTgzKTsKKyAgICAgICAgcjEgJj0gQ05GR19JQ1JfSVIyXzU4NDsKKworICAgICAgICByMiA9IGluYihpb2FkZHIgKyBDTkZHX0lSUl81ODMpOworICAgICAgICByMiAmPSBDTkZHX0lSUl9JUlFTOyAgICAgLyogMHg2MCAqLworICAgICAgICByMiA+Pj0gNTsKKworICAgICAgICBzd2l0Y2gocjIpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBpZihyMSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmlycSA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+aXJxID0gMTA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHIxID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+aXJxID0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5pcnEgPSAxMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYocjEgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHAtPmV4dHJhX2luZm8gJiBBTFRFUk5BVEVfSVJRX0JJVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmlycSA9IDU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmlycSA9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+aXJxID0gMTU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHIxID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+aXJxID0gNzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5pcnEgPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogTm8gSVJRIGZvdW5kIGFib3J0aW5nXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQyOworICAgICAgICAgfQorCisgICAgICAgIGlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgc21jdHJfaW50ZXJydXB0LCBTQV9TSElSUSwgc21jdHJfbmFtZSwgZGV2KSkKKyAgICAgICAgICAgICAgICBnb3RvIG91dDI7CisKKyAgICAgICAgLyogR2V0IDU4eCBSb20gQmFzZSAqLworICAgICAgICByMSA9IGluYihpb2FkZHIgKyBDTkZHX0JJT181ODMpOworICAgICAgICByMSAmPSAweDNFOworICAgICAgICByMSB8PSAweDQwOworCisgICAgICAgIHRwLT5yb21fYmFzZSA9IChfX3UzMilyMSA8PCAxMzsKKworICAgICAgICAvKiBHZXQgNTh4IFJvbSBTaXplICovCisgICAgICAgIHIxID0gaW5iKGlvYWRkciArIENORkdfQklPXzU4Myk7CisgICAgICAgIHIxICY9IDB4QzA7CisgICAgICAgIGlmKHIxID09IDApCisgICAgICAgICAgICAgICAgdHAtPnJvbV9zaXplID0gUk9NX0RJU0FCTEU7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHIxID4+PSA2OworICAgICAgICAgICAgICAgIHRwLT5yb21fc2l6ZSA9IChfX3UxNilDTkZHX1NJWkVfOEtCIDw8IHIxOworICAgICAgICB9CisKKyAgICAgICAgLyogR2V0IDU4eCBCb290IFN0YXR1cyAqLworICAgICAgICByMSA9IGluYihpb2FkZHIgKyBDTkZHX0dQMik7CisKKyAgICAgICAgdHAtPm1vZGVfYml0cyAmPSAofkJPT1RfU1RBVFVTX01BU0spOworCisgICAgICAgIGlmKHIxICYgQ05GR19HUDJfQk9PVF9OSUJCTEUpCisgICAgICAgICAgICAgICAgdHAtPm1vZGVfYml0cyB8PSBCT09UX1RZUEVfMTsKKworICAgICAgICAvKiBHZXQgNTh4IFplcm8gV2FpdCBTdGF0ZSAqLworICAgICAgICB0cC0+bW9kZV9iaXRzICY9ICh+WkVST19XQUlUX1NUQVRFX01BU0spOworCisgICAgICAgIHIxID0gaW5iKGlvYWRkciArIENORkdfSVJSXzU4Myk7CisKKyAgICAgICAgaWYocjEgJiBDTkZHX0lSUl9aV1MpCisgICAgICAgICAgICAgICAgIHRwLT5tb2RlX2JpdHMgfD0gWkVST19XQUlUX1NUQVRFXzhfQklUOworCisgICAgICAgIGlmKHRwLT5ib2FyZF9pZCAmIEJPQVJEXzE2QklUKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcjEgPSBpbmIoaW9hZGRyICsgQ05GR19MQUFSXzU4NCk7CisKKyAgICAgICAgICAgICAgICBpZihyMSAmIENORkdfTEFBUl9aV1MpCisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bW9kZV9iaXRzIHw9IFpFUk9fV0FJVF9TVEFURV8xNl9CSVQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBHZXQgNTg0IE1lZGlhIE1lbnUgKi8KKyAgICAgICAgdHAtPm1lZGlhX21lbnUgPSAxNDsKKyAgICAgICAgcjEgPSBpbmIoaW9hZGRyICsgQ05GR19JUlJfNTgzKTsKKworICAgICAgICB0cC0+bW9kZV9iaXRzICY9IDB4ZjhmZjsgICAgICAgLyogKH5DTkZHX0lOVEVSRkFDRV9UWVBFX01BU0spICovCisgICAgICAgIGlmKCh0cC0+Ym9hcmRfaWQgJiBUT0tFTl9NRURJQSkgPT0gVE9LRU5fTUVESUEpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBHZXQgQWR2YW5jZWQgRmVhdHVyZXMgKi8KKyAgICAgICAgICAgICAgICBpZigoKHIxICYgMHg2KSA+PiAxKSA9PSAweDMpCisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bWVkaWFfdHlwZSB8PSBNRURJQV9VVFBfMTY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgocjEgJiAweDYpID4+IDEpID09IDB4MikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1lZGlhX3R5cGUgfD0gTUVESUFfU1RQXzE2OworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoKHIxICYgMHg2KSA+PiAxKSA9PSAweDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1lZGlhX3R5cGUgfD0gTUVESUFfVVRQXzQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5tZWRpYV90eXBlIHw9IE1FRElBX1NUUF80OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHIxID0gaW5iKGlvYWRkciArIENORkdfR1AyKTsKKyAgICAgICAgICAgICAgICBpZighKHIxICYgMHgyKSApICAgICAgICAgICAvKiBHUDJfRVRSRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1vZGVfYml0cyB8PSBFQVJMWV9UT0tFTl9SRUw7CisKKyAgICAgICAgICAgICAgICAvKiBzZWUgaWYgdGhlIGNoaXAgaXMgY29ycnVwdGVkCisgICAgICAgICAgICAgICAgaWYoc21jdHJfcmVhZF81ODRfY2hrc3VtKGlvYWRkcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogRUVQUk9NIENoZWNrc3VtIEZhaWx1cmVcbiIsIGRldi0+bmFtZSk7CisJCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0MjsKKyAgICAgICAgICAgICAgICB9CisJCSovCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKDApOworCitvdXQyOgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgU01DVFJfSU9fRVhURU5UKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzbWN0cl9nZXRfYm9hcmRpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWNhKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAgICAgX191OCByLCByMSwgSWRCeXRlOworICAgICAgICBfX3UxNiBCb2FyZElkTWFzazsKKworICAgICAgICB0cC0+Ym9hcmRfaWQgPSBCb2FyZElkTWFzayA9IDA7CisKKwlpZihtY2EpCisJeworCQlCb2FyZElkTWFzayB8PSAoTUlDUk9DSEFOTkVMK0lOVEVSRkFDRV9DSElQK1RPS0VOX01FRElBK1BBR0VEX1JBTStCT0FSRF8xNkJJVCk7CisJCXRwLT5leHRyYV9pbmZvIHw9IChJTlRFUkZBQ0VfNTk0X0NISVArUkFNX1NJWkVfNjRLK05JQ184MjVfQklUK0FMVEVSTkFURV9JUlFfQklUK1NMT1RfMTZCSVQpOworCX0KKwllbHNlCisJeworICAgICAgICAJQm9hcmRJZE1hc2t8PShJTlRFUkZBQ0VfQ0hJUCtUT0tFTl9NRURJQStQQUdFRF9SQU0rQk9BUkRfMTZCSVQpOworICAgICAgICAJdHAtPmV4dHJhX2luZm8gfD0gKElOVEVSRkFDRV81ODRfQ0hJUCArIFJBTV9TSVpFXzY0SworICAgICAgICAJICAgICAgICArIE5JQ184MjVfQklUICsgQUxURVJOQVRFX0lSUV9CSVQpOworCX0KKworCWlmKCFtY2EpCisJeworICAgICAgICAJciA9IGluYihpb2FkZHIgKyBCSURfUkVHXzEpOworICAgICAgICAJciAmPSAweDBjOworICAgICAgIAkJb3V0YihyLCBpb2FkZHIgKyBCSURfUkVHXzEpOworICAgICAgICAJciA9IGluYihpb2FkZHIgKyBCSURfUkVHXzEpOworCisgICAgICAgIAlpZihyICYgQklEX1NJWFRFRU5fQklUX0JJVCkKKyAgICAgICAgCXsKKyAgICAgICAgCSAgICAgICAgdHAtPmV4dHJhX2luZm8gfD0gU0xPVF8xNkJJVDsKKyAgICAgICAgCSAgICAgICAgdHAtPmFkYXB0ZXJfYnVzID0gQlVTX0lTQTE2X1RZUEU7CisgICAgICAgIAl9CisgICAgICAgIAllbHNlCisgICAgICAgIAkgICAgICAgIHRwLT5hZGFwdGVyX2J1cyA9IEJVU19JU0E4X1RZUEU7CisJfQorCWVsc2UKKwkJdHAtPmFkYXB0ZXJfYnVzID0gQlVTX01DQV9UWVBFOworCisgICAgICAgIC8qIEdldCBCb2FyZCBJZCBCeXRlICovCisgICAgICAgIElkQnl0ZSA9IGluYihpb2FkZHIgKyBCSURfQk9BUkRfSURfQllURSk7CisKKyAgICAgICAgLyogaWYgTWFqb3IgdmVyc2lvbiA+IDEuMCB0aGVuCisgICAgICAgICAqICAgICAgcmV0dXJuOworICAgICAgICAgKi8KKyAgICAgICAgaWYoSWRCeXRlICYgMHhGOCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKworICAgICAgICByMSA9IGluYihpb2FkZHIgKyBCSURfUkVHXzEpOworICAgICAgICByMSAmPSBCSURfSUNSX01BU0s7CisgICAgICAgIHIxIHw9IEJJRF9PVEhFUl9CSVQ7CisKKyAgICAgICAgb3V0YihyMSwgaW9hZGRyICsgQklEX1JFR18xKTsKKyAgICAgICAgcjEgPSBpbmIoaW9hZGRyICsgQklEX1JFR18zKTsKKworICAgICAgICByMSAmPSBCSURfRUFSX01BU0s7CisgICAgICAgIHIxIHw9IEJJRF9FTkdSX1BBR0U7CisKKyAgICAgICAgb3V0YihyMSwgaW9hZGRyICsgQklEX1JFR18zKTsKKyAgICAgICAgcjEgPSBpbmIoaW9hZGRyICsgQklEX1JFR18xKTsKKyAgICAgICAgcjEgJj0gQklEX0lDUl9NQVNLOworICAgICAgICByMSB8PSAoQklEX1JMQSB8IEJJRF9PVEhFUl9CSVQpOworCisgICAgICAgIG91dGIocjEsIGlvYWRkciArIEJJRF9SRUdfMSk7CisKKyAgICAgICAgcjEgPSBpbmIoaW9hZGRyICsgQklEX1JFR18xKTsKKyAgICAgICAgd2hpbGUocjEgJiBCSURfUkVDQUxMX0RPTkVfTUFTSykKKyAgICAgICAgICAgICAgICByMSA9IGluYihpb2FkZHIgKyBCSURfUkVHXzEpOworCisgICAgICAgIHIgPSBpbmIoaW9hZGRyICsgQklEX0xBUl8wICsgQklEX1JFR182KTsKKworICAgICAgICAvKiBjbGVhciBjaGlwIHJldiBiaXRzICovCisgICAgICAgIHRwLT5leHRyYV9pbmZvICY9IH5DSElQX1JFVl9NQVNLOworICAgICAgICB0cC0+ZXh0cmFfaW5mbyB8PSAoKHIgJiBCSURfRUVQUk9NX0NISVBfUkVWX01BU0spIDw8IDYpOworCisgICAgICAgIHIxID0gaW5iKGlvYWRkciArIEJJRF9SRUdfMSk7CisgICAgICAgIHIxICY9IEJJRF9JQ1JfTUFTSzsKKyAgICAgICAgcjEgfD0gQklEX09USEVSX0JJVDsKKworICAgICAgICBvdXRiKHIxLCBpb2FkZHIgKyBCSURfUkVHXzEpOworICAgICAgICByMSA9IGluYihpb2FkZHIgKyBCSURfUkVHXzMpOworCisgICAgICAgIHIxICY9IEJJRF9FQVJfTUFTSzsKKyAgICAgICAgcjEgfD0gQklEX0VBNjsKKworICAgICAgICBvdXRiKHIxLCBpb2FkZHIgKyBCSURfUkVHXzMpOworICAgICAgICByMSA9IGluYihpb2FkZHIgKyBCSURfUkVHXzEpOworCisgICAgICAgIHIxICY9IEJJRF9JQ1JfTUFTSzsKKyAgICAgICAgcjEgfD0gQklEX1JMQTsKKworICAgICAgICBvdXRiKHIxLCBpb2FkZHIgKyBCSURfUkVHXzEpOworICAgICAgICByMSA9IGluYihpb2FkZHIgKyBCSURfUkVHXzEpOworCisgICAgICAgIHdoaWxlKHIxICYgQklEX1JFQ0FMTF9ET05FX01BU0spCisgICAgICAgICAgICAgICAgcjEgPSBpbmIoaW9hZGRyICsgQklEX1JFR18xKTsKKworICAgICAgICByZXR1cm4gKEJvYXJkSWRNYXNrKTsKK30KKworc3RhdGljIGludCBzbWN0cl9nZXRfZ3JvdXBfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzbWN0cl9pc3N1ZV9yZWFkX3dvcmRfY21kKGRldiwgUldfSU5ESVZJRFVBTF9HUk9VUF9BRERSKTsKKworICAgICAgICByZXR1cm4oc21jdHJfd2FpdF9jbWQoZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfZ2V0X2Z1bmN0aW9uYWxfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzbWN0cl9pc3N1ZV9yZWFkX3dvcmRfY21kKGRldiwgUldfRlVOQ1RJT05BTF9BRERSKTsKKworICAgICAgICByZXR1cm4oc21jdHJfd2FpdF9jbWQoZGV2KSk7Cit9CisKKy8qIENhbGN1bGF0ZSBudW1iZXIgb2YgTm9uLU1BQyByZWNlaXZlIEJEQidzIGFuZCBkYXRhIGJ1ZmZlcnMuCisgKiBUaGlzIGZ1bmN0aW9uIG11c3Qgc2ltdWxhdGUgYWxsb2NhdGVpbmcgc2hhcmVkIG1lbW9yeSBleGFjdGx5CisgKiBhcyB0aGUgYWxsb2NhdGVfc2hhcmVkX21lbW9yeSBmdW5jdGlvbiBhYm92ZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBzbWN0cl9nZXRfbnVtX3J4X2JkYnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBpbnQgbWVtX3VzZWQgPSAwOworCisgICAgICAgIC8qIEFsbG9jYXRlIFN5c3RlbSBDb250cm9sIEJsb2Nrcy4gKi8KKyAgICAgICAgbWVtX3VzZWQgKz0gc2l6ZW9mKFNDR0Jsb2NrKTsKKworICAgICAgICBtZW1fdXNlZCArPSBUT19QQVJBR1JBUEhfQk9VTkRSWShtZW1fdXNlZCk7CisgICAgICAgIG1lbV91c2VkICs9IHNpemVvZihTQ0xCbG9jayk7CisKKyAgICAgICAgbWVtX3VzZWQgKz0gVE9fUEFSQUdSQVBIX0JPVU5EUlkobWVtX3VzZWQpOworICAgICAgICBtZW1fdXNlZCArPSBzaXplb2YoQUNCbG9jaykgKiB0cC0+bnVtX2FjYnM7CisKKyAgICAgICAgbWVtX3VzZWQgKz0gVE9fUEFSQUdSQVBIX0JPVU5EUlkobWVtX3VzZWQpOworICAgICAgICBtZW1fdXNlZCArPSBzaXplb2YoSVNCbG9jayk7CisKKyAgICAgICAgbWVtX3VzZWQgKz0gVE9fUEFSQUdSQVBIX0JPVU5EUlkobWVtX3VzZWQpOworICAgICAgICBtZW1fdXNlZCArPSBNSVNDX0RBVEFfU0laRTsKKworICAgICAgICAvKiBBbGxvY2F0ZSB0cmFuc21pdCBGQ0Incy4gKi8KKyAgICAgICAgbWVtX3VzZWQgKz0gVE9fUEFSQUdSQVBIX0JPVU5EUlkobWVtX3VzZWQpOworCisgICAgICAgIG1lbV91c2VkICs9IHNpemVvZihGQ0Jsb2NrKSAqIHRwLT5udW1fdHhfZmNic1tNQUNfUVVFVUVdOworICAgICAgICBtZW1fdXNlZCArPSBzaXplb2YoRkNCbG9jaykgKiB0cC0+bnVtX3R4X2ZjYnNbTk9OX01BQ19RVUVVRV07CisgICAgICAgIG1lbV91c2VkICs9IHNpemVvZihGQ0Jsb2NrKSAqIHRwLT5udW1fdHhfZmNic1tCVUdfUVVFVUVdOworCisgICAgICAgIC8qIEFsbG9jYXRlIHRyYW5zbWl0IEJEQnMuICovCisgICAgICAgIG1lbV91c2VkICs9IHNpemVvZihCREJsb2NrKSAqIHRwLT5udW1fdHhfYmRic1tNQUNfUVVFVUVdOworICAgICAgICBtZW1fdXNlZCArPSBzaXplb2YoQkRCbG9jaykgKiB0cC0+bnVtX3R4X2JkYnNbTk9OX01BQ19RVUVVRV07CisgICAgICAgIG1lbV91c2VkICs9IHNpemVvZihCREJsb2NrKSAqIHRwLT5udW1fdHhfYmRic1tCVUdfUVVFVUVdOworCisgICAgICAgIC8qIEFsbG9jYXRlIHJlY2VpdmUgRkNCcy4gKi8KKyAgICAgICAgbWVtX3VzZWQgKz0gc2l6ZW9mKEZDQmxvY2spICogdHAtPm51bV9yeF9mY2JzW01BQ19RVUVVRV07CisgICAgICAgIG1lbV91c2VkICs9IHNpemVvZihGQ0Jsb2NrKSAqIHRwLT5udW1fcnhfZmNic1tOT05fTUFDX1FVRVVFXTsKKworICAgICAgICAvKiBBbGxvY2F0ZSByZWNlaXZlIEJEQnMuICovCisgICAgICAgIG1lbV91c2VkICs9IHNpemVvZihCREJsb2NrKSAqIHRwLT5udW1fcnhfYmRic1tNQUNfUVVFVUVdOworCisgICAgICAgIC8qIEFsbG9jYXRlIE1BQyB0cmFuc21pdCBidWZmZXJzLgorICAgICAgICAgKiBNQUMgdHJhbnNtaXQgYnVmZmVycyBkb24ndCBoYXZlIHRvIGJlIG9uIGFuIE9ERCBCb3VuZHJ5LgorICAgICAgICAgKi8KKyAgICAgICAgbWVtX3VzZWQgKz0gdHAtPnR4X2J1ZmZfc2l6ZVtNQUNfUVVFVUVdOworCisgICAgICAgIC8qIEFsbG9jYXRlIEJVRyB0cmFuc21pdCBidWZmZXJzLiAqLworICAgICAgICBtZW1fdXNlZCArPSB0cC0+dHhfYnVmZl9zaXplW0JVR19RVUVVRV07CisKKyAgICAgICAgLyogQWxsb2NhdGUgTUFDIHJlY2VpdmUgZGF0YSBidWZmZXJzLgorICAgICAgICAgKiBNQUMgcmVjZWl2ZSBidWZmZXJzIGRvbid0IGhhdmUgdG8gYmUgb24gYSAyNTYgYnl0ZSBib3VuZGFyeS4KKyAgICAgICAgICovCisgICAgICAgIG1lbV91c2VkICs9IFJYX0RBVEFfQlVGRkVSX1NJWkUgKiB0cC0+bnVtX3J4X2JkYnNbTUFDX1FVRVVFXTsKKworICAgICAgICAvKiBBbGxvY2F0ZSBOb24tTUFDIHRyYW5zbWl0IGJ1ZmZlcnMuCisgICAgICAgICAqIEZvciBtYXhpbXVtIE5ldHdhcmUgcGVyZm9ybWFuY2UsIHB1dCBUeCBCdWZmZXJzIG9uCisgICAgICAgICAqIE9ERCBCb3VuZHJ5LGFuZCB0aGVuIHJlc3RvcmUgbWFsbG9jIHRvIEV2ZW4gQm91bmRyeXMuCisgICAgICAgICAqLworICAgICAgICBtZW1fdXNlZCArPSAxTDsKKyAgICAgICAgbWVtX3VzZWQgKz0gdHAtPnR4X2J1ZmZfc2l6ZVtOT05fTUFDX1FVRVVFXTsKKyAgICAgICAgbWVtX3VzZWQgKz0gMUw7CisKKyAgICAgICAgLyogQ0FMQ1VMQVRFIE5VTUJFUiBPRiBOT04tTUFDIFJYIEJEQidTCisgICAgICAgICAqIEFORCBOT04tTUFDIFJYIERBVEEgQlVGRkVSUworICAgICAgICAgKgorICAgICAgICAgKiBNYWtlIHN1cmUgdGhlIG1lbV91c2VkIG9mZnNldCBhdCB0aGlzIHBvaW50IGlzIHRoZQorICAgICAgICAgKiBzYW1lIGFzIGluIGFsbG9jYXRlX3NoYXJlZCBtZW1vcnkgb3IgdGhlIGZvbGxvd2luZworICAgICAgICAgKiBib3VuZGFyeSBhZGp1c3RtZW50IHdpbGwgYmUgaW5jb3JyZWN0IChpLmUuIG5vdCBhbGxvY2F0aW5nCisgICAgICAgICAqIHRoZSBub24tbWFjIHJlY2VpdmUgYnVmZmVycyBhYm92ZSBjYW5ub3QgY2hhbmdlIHRoZSAyNTYKKyAgICAgICAgICogYnl0ZSBvZmZzZXQpLgorICAgICAgICAgKgorICAgICAgICAgKiBTaW5jZSB0aGlzIGNhbm5vdCBiZSBndWFyYW50ZWVkLCBhZGRpbmcgdGhlIGZ1bGwgMjU2IGJ5dGVzCisgICAgICAgICAqIHRvIHRoZSBhbW91bnQgb2Ygc2hhcmVkIG1lbW9yeSB1c2VkIGF0IHRoaXMgcG9pbnQgd2lsbCBndWFyYW50ZWVkCisgICAgICAgICAqIHRoYXQgdGhlIHJ4IGRhdGEgYnVmZmVycyBkbyBub3Qgb3ZlcmZsb3cgc2hhcmVkIG1lbW9yeS4KKyAgICAgICAgICovCisgICAgICAgIG1lbV91c2VkICs9IDB4MTAwOworCisgICAgICAgIHJldHVybigoMHhmZmZmIC0gbWVtX3VzZWQpIC8gKFJYX0RBVEFfQlVGRkVSX1NJWkUgKyBzaXplb2YoQkRCbG9jaykpKTsKK30KKworc3RhdGljIGludCBzbWN0cl9nZXRfcGh5c2ljYWxfZHJvcF9udW1iZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc21jdHJfaXNzdWVfcmVhZF93b3JkX2NtZChkZXYsIFJXX1BIWVNJQ0FMX0RST1BfTlVNQkVSKTsKKworICAgICAgICByZXR1cm4oc21jdHJfd2FpdF9jbWQoZGV2KSk7Cit9CisKK3N0YXRpYyBfX3U4ICogc21jdHJfZ2V0X3J4X3BvaW50ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgcXVldWUpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgQkRCbG9jayAqYmRiOworCisgICAgICAgIGJkYiA9IChCREJsb2NrICopKChfX3UzMil0cC0+cmFtX2FjY2VzcworICAgICAgICAgICAgICAgICsgKF9fdTMyKSh0cC0+cnhfZmNiX2N1cnJbcXVldWVdLT50cmNfYmRiX3B0cikpOworCisgICAgICAgIHRwLT5yeF9mY2JfY3VycltxdWV1ZV0tPmJkYl9wdHIgPSBiZGI7CisKKyAgICAgICAgcmV0dXJuICgoX191OCAqKWJkYi0+ZGF0YV9ibG9ja19wdHIpOworfQorCitzdGF0aWMgaW50IHNtY3RyX2dldF9zdGF0aW9uX2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHNtY3RyX2lzc3VlX3JlYWRfd29yZF9jbWQoZGV2LCBSV19JTkRJVklEVUFMX01BQ19BRERSRVNTKTsKKworICAgICAgICByZXR1cm4oc21jdHJfd2FpdF9jbWQoZGV2KSk7Cit9CisKKy8qCisgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4gVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbgorICogb3IgY2xvc2VkLgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNtY3RyX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgcmV0dXJuICgoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikmdHAtPk1hY1N0YXQpOworfQorCitzdGF0aWMgRkNCbG9jayAqc21jdHJfZ2V0X3R4X2ZjYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3UxNiBxdWV1ZSwKKyAgICAgICAgX191MTYgYnl0ZXNfY291bnQpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgRkNCbG9jayAqcEZDQjsKKyAgICAgICAgQkRCbG9jayAqcGJkYjsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgYWxsb2Nfc2l6ZTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgKnRlbXA7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAyMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAic21jdHJfZ2V0X3R4X2ZjYlxuIik7CisKKyAgICAgICAgLyogY2hlY2sgaWYgdGhlcmUgaXMgZW5vdWdoIEZDQiBibG9ja3MgKi8KKyAgICAgICAgaWYodHAtPm51bV90eF9mY2JzX3VzZWRbcXVldWVdID49IHRwLT5udW1fdHhfZmNic1txdWV1ZV0pCisgICAgICAgICAgICAgICAgcmV0dXJuICgoRkNCbG9jayAqKSgtMUwpKTsKKworICAgICAgICAvKiByb3VuZCBvZmYgdGhlIGlucHV0IHBrdCBzaXplIHRvIHRoZSBuZWFyZXN0IGV2ZW4gbnVtYmVyICovCisgICAgICAgIGFsbG9jX3NpemUgPSAoYnl0ZXNfY291bnQgKyAxKSAmIDB4ZmZmZTsKKworICAgICAgICAvKiBjaGVjayBpZiBlbm91Z2ggbWVtICovCisgICAgICAgIGlmKCh0cC0+dHhfYnVmZl91c2VkW3F1ZXVlXSArIGFsbG9jX3NpemUpID4gdHAtPnR4X2J1ZmZfc2l6ZVtxdWV1ZV0pCisgICAgICAgICAgICAgICAgcmV0dXJuICgoRkNCbG9jayAqKSgtMUwpKTsKKworICAgICAgICAvKiBjaGVjayBpZiBwYXN0IHRoZSBlbmQgOworICAgICAgICAgKiBpZiBleGFjdGx5IGVub3VnaCBtZW0gdG8gZW5kIG9mIHJpbmcsIGFsbG9jIGZyb20gZnJvbnQuCisgICAgICAgICAqIHRoaXMgYXZvaWRzIHVwZGF0ZSBvZiBjdXJyIHdoZW4gY3VyciA9IGVuZAorICAgICAgICAgKi8KKyAgICAgICAgaWYoKCh1bnNpZ25lZCBsb25nKSh0cC0+dHhfYnVmZl9jdXJyW3F1ZXVlXSkgKyBhbGxvY19zaXplKQorICAgICAgICAgICAgICAgID49ICh1bnNpZ25lZCBsb25nKSh0cC0+dHhfYnVmZl9lbmRbcXVldWVdKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGNoZWNrIGlmIGVub3VnaCBtZW1vcnkgZnJvbSByaW5nIGhlYWQgKi8KKyAgICAgICAgICAgICAgICBhbGxvY19zaXplID0gYWxsb2Nfc2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAoX191MTYpKChfX3UzMil0cC0+dHhfYnVmZl9lbmRbcXVldWVdCisgICAgICAgICAgICAgICAgICAgICAgICAtIChfX3UzMil0cC0+dHhfYnVmZl9jdXJyW3F1ZXVlXSk7CisKKyAgICAgICAgICAgICAgICBpZigodHAtPnR4X2J1ZmZfdXNlZFtxdWV1ZV0gKyBhbGxvY19zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgPiB0cC0+dHhfYnVmZl9zaXplW3F1ZXVlXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChGQ0Jsb2NrICopKC0xTCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIHJpbmcgd3JhcCAqLworICAgICAgICAgICAgICAgIHRwLT50eF9idWZmX2N1cnJbcXVldWVdID0gdHAtPnR4X2J1ZmZfaGVhZFtxdWV1ZV07CisgICAgICAgIH0KKworICAgICAgICB0cC0+dHhfYnVmZl91c2VkW3F1ZXVlXSArPSBhbGxvY19zaXplOworICAgICAgICB0cC0+bnVtX3R4X2ZjYnNfdXNlZFtxdWV1ZV0rKzsKKyAgICAgICAgdHAtPnR4X2ZjYl9jdXJyW3F1ZXVlXS0+ZnJhbWVfbGVuZ3RoID0gYnl0ZXNfY291bnQ7CisgICAgICAgIHRwLT50eF9mY2JfY3VycltxdWV1ZV0tPm1lbW9yeV9hbGxvYyA9IGFsbG9jX3NpemU7CisgICAgICAgIHRlbXAgPSB0cC0+dHhfYnVmZl9jdXJyW3F1ZXVlXTsKKyAgICAgICAgdHAtPnR4X2J1ZmZfY3VycltxdWV1ZV0KKyAgICAgICAgICAgICAgICA9IChfX3UxNiAqKSgoX191MzIpdGVtcCArIChfX3UzMikoKGJ5dGVzX2NvdW50ICsgMSkgJiAweGZmZmUpKTsKKworICAgICAgICBwYmRiID0gdHAtPnR4X2ZjYl9jdXJyW3F1ZXVlXS0+YmRiX3B0cjsKKyAgICAgICAgcGJkYi0+YnVmZmVyX2xlbmd0aCA9IGJ5dGVzX2NvdW50OworICAgICAgICBwYmRiLT5kYXRhX2Jsb2NrX3B0ciA9IHRlbXA7CisgICAgICAgIHBiZGItPnRyY19kYXRhX2Jsb2NrX3B0ciA9IFRSQ19QT0lOVEVSKHRlbXApOworCisgICAgICAgIHBGQ0IgPSB0cC0+dHhfZmNiX2N1cnJbcXVldWVdOworICAgICAgICB0cC0+dHhfZmNiX2N1cnJbcXVldWVdID0gdHAtPnR4X2ZjYl9jdXJyW3F1ZXVlXS0+bmV4dF9wdHI7CisKKyAgICAgICAgcmV0dXJuIChwRkNCKTsKK30KKworc3RhdGljIGludCBzbWN0cl9nZXRfdXBzdHJlYW1fbmVpZ2hib3JfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzbWN0cl9pc3N1ZV9yZWFkX3dvcmRfY21kKGRldiwgUldfVVBTVFJFQU1fTkVJR0hCT1JfQUREUkVTUyk7CisKKyAgICAgICAgcmV0dXJuKHNtY3RyX3dhaXRfY21kKGRldikpOworfQorCitzdGF0aWMgaW50IHNtY3RyX2hhcmR3YXJlX3NlbmRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwKQoreworICAgICAgICBzdHJ1Y3QgdHJfc3RhdGlzdGljcyAqdHN0YXQgPSAmdHAtPk1hY1N0YXQ7CisgICAgICAgIHN0cnVjdCBza19idWZmICpza2I7CisgICAgICAgIEZDQmxvY2sgKmZjYjsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHIiVzOiBzbWN0cl9oYXJkd2FyZV9zZW5kX3BhY2tldFxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBpZih0cC0+c3RhdHVzICE9IE9QRU4pCisgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CisKKyAgICAgICAgaWYodHAtPm1vbml0b3Jfc3RhdGVfcmVhZHkgIT0gMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKworICAgICAgICBmb3IoOzspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTZW5kIGZpcnN0IGJ1ZmZlciBmcm9tIHF1ZXVlICovCisgICAgICAgICAgICAgICAgc2tiID0gc2tiX2RlcXVldWUoJnRwLT5TZW5kU2tiUXVldWUpOworICAgICAgICAgICAgICAgIGlmKHNrYiA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CisKKyAgICAgICAgICAgICAgICB0cC0+UXVldWVTa2IrKzsKKworICAgICAgICAgICAgICAgIGlmKHNrYi0+bGVuIDwgU01DX0hFQURFUl9TSVpFIHx8IHNrYi0+bGVuID4gdHAtPm1heF9wYWNrZXRfc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKworICAgICAgICAgICAgICAgIHNtY3RyX2VuYWJsZV8xNmJpdChkZXYpOworICAgICAgICAgICAgICAgIHNtY3RyX3NldF9wYWdlKGRldiwgKF9fdTggKil0cC0+cmFtX2FjY2Vzcyk7CisKKyAgICAgICAgICAgICAgICBpZigoZmNiID0gc21jdHJfZ2V0X3R4X2ZjYihkZXYsIE5PTl9NQUNfUVVFVUUsIHNrYi0+bGVuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgID09IChGQ0Jsb2NrICopKC0xTCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfZGlzYWJsZV8xNmJpdChkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc21jdHJfdHhfbW92ZV9mcmFtZShkZXYsIHNrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfX3U4ICopZmNiLT5iZGJfcHRyLT5kYXRhX2Jsb2NrX3B0ciwgc2tiLT5sZW4pOworCisgICAgICAgICAgICAgICAgc21jdHJfc2V0X3BhZ2UoZGV2LCAoX191OCAqKWZjYik7CisKKyAgICAgICAgICAgICAgICBzbWN0cl90cmNfc2VuZF9wYWNrZXQoZGV2LCBmY2IsIE5PTl9NQUNfUVVFVUUpOworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKKworICAgICAgICAgICAgICAgIHRzdGF0LT50eF9wYWNrZXRzKys7CisKKyAgICAgICAgICAgICAgICBzbWN0cl9kaXNhYmxlXzE2Yml0KGRldik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2luaXRfYWNicyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgICBBQ0Jsb2NrICphY2I7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2luaXRfYWNic1xuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBhY2IgICAgICAgICAgICAgICAgICAgICA9IHRwLT5hY2JfaGVhZDsKKyAgICAgICAgYWNiLT5jbWRfZG9uZV9zdGF0dXMgICAgPSAoQUNCX0NPTU1BTkRfRE9ORSB8IEFDQl9DT01NQU5EX1NVQ0NFU1NGVUwpOworICAgICAgICBhY2ItPmNtZF9pbmZvICAgICAgICAgICA9IEFDQl9DSEFJTl9FTkQ7CisgICAgICAgIGFjYi0+Y21kICAgICAgICAgICAgICAgID0gMDsKKyAgICAgICAgYWNiLT5zdWJjbWQgICAgICAgICAgICAgPSAwOworICAgICAgICBhY2ItPmRhdGFfb2Zmc2V0X2xvICAgICA9IDA7CisgICAgICAgIGFjYi0+ZGF0YV9vZmZzZXRfaGkgICAgID0gMDsKKyAgICAgICAgYWNiLT5uZXh0X3B0cgorICAgICAgICAgICAgICAgID0gKEFDQmxvY2sgKikoKChjaGFyICopYWNiKSArIHNpemVvZihBQ0Jsb2NrKSk7CisgICAgICAgIGFjYi0+dHJjX25leHRfcHRyICAgICAgID0gVFJDX1BPSU5URVIoYWNiLT5uZXh0X3B0cik7CisKKyAgICAgICAgZm9yKGkgPSAxOyBpIDwgdHAtPm51bV9hY2JzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhY2IgICAgICAgICAgICAgPSBhY2ItPm5leHRfcHRyOworICAgICAgICAgICAgICAgIGFjYi0+Y21kX2RvbmVfc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICA9IChBQ0JfQ09NTUFORF9ET05FIHwgQUNCX0NPTU1BTkRfU1VDQ0VTU0ZVTCk7CisgICAgICAgICAgICAgICAgYWNiLT5jbWRfaW5mbyA9IEFDQl9DSEFJTl9FTkQ7CisgICAgICAgICAgICAgICAgYWNiLT5jbWQgICAgICAgID0gMDsKKyAgICAgICAgICAgICAgICBhY2ItPnN1YmNtZCAgICAgPSAwOworICAgICAgICAgICAgICAgIGFjYi0+ZGF0YV9vZmZzZXRfbG8gPSAwOworICAgICAgICAgICAgICAgIGFjYi0+ZGF0YV9vZmZzZXRfaGkgPSAwOworICAgICAgICAgICAgICAgIGFjYi0+bmV4dF9wdHIKKyAgICAgICAgICAgICAgICAgICAgICAgID0gKEFDQmxvY2sgKikoKChjaGFyICopYWNiKSArIHNpemVvZihBQ0Jsb2NrKSk7CisgICAgICAgICAgICAgICAgYWNiLT50cmNfbmV4dF9wdHIgPSBUUkNfUE9JTlRFUihhY2ItPm5leHRfcHRyKTsKKyAgICAgICAgfQorCisgICAgICAgIGFjYi0+bmV4dF9wdHIgICAgICAgICAgID0gdHAtPmFjYl9oZWFkOworICAgICAgICBhY2ItPnRyY19uZXh0X3B0ciAgICAgICA9IFRSQ19QT0lOVEVSKHRwLT5hY2JfaGVhZCk7CisgICAgICAgIHRwLT5hY2JfbmV4dCAgICAgICAgICAgID0gdHAtPmFjYl9oZWFkLT5uZXh0X3B0cjsKKyAgICAgICAgdHAtPmFjYl9jdXJyICAgICAgICAgICAgPSB0cC0+YWNiX2hlYWQtPm5leHRfcHRyOworICAgICAgICB0cC0+bnVtX2FjYnNfdXNlZCAgICAgICA9IDA7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pbml0X2FkYXB0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9pbml0X2FkYXB0ZXJcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgdHAtPnN0YXR1cyAgICAgICAgICAgICAgPSBDTE9TRUQ7CisgICAgICAgIHRwLT5wYWdlX29mZnNldF9tYXNrICAgID0gKHRwLT5yYW1fdXNhYmxlICogMTAyNCkgLSAxOworICAgICAgICBza2JfcXVldWVfaGVhZF9pbml0KCZ0cC0+U2VuZFNrYlF1ZXVlKTsKKyAgICAgICAgdHAtPlF1ZXVlU2tiID0gTUFYX1RYX1FVRVVFOworCisgICAgICAgIGlmKCEodHAtPmdyb3VwX2FkZHJlc3NfMCAmIDB4MDA4MCkpCisgICAgICAgICAgICAgICAgdHAtPmdyb3VwX2FkZHJlc3NfMCB8PSAweDAwQzA7CisKKyAgICAgICAgaWYoISh0cC0+ZnVuY3Rpb25hbF9hZGRyZXNzXzAgJiAweDAwQzApKQorICAgICAgICAgICAgICAgIHRwLT5mdW5jdGlvbmFsX2FkZHJlc3NfMCB8PSAweDAwQzA7CisKKyAgICAgICAgdHAtPmZ1bmN0aW9uYWxfYWRkcmVzc1swXSAmPSAweEZGN0Y7CisKKyAgICAgICAgaWYodHAtPmF1dGhvcml6ZWRfZnVuY3Rpb25fY2xhc3NlcyA9PSAwKQorICAgICAgICAgICAgICAgIHRwLT5hdXRob3JpemVkX2Z1bmN0aW9uX2NsYXNzZXMgPSAweDdGRkY7CisKKyAgICAgICAgaWYodHAtPmF1dGhvcml6ZWRfYWNjZXNzX3ByaW9yaXR5ID09IDApCisgICAgICAgICAgICAgICAgdHAtPmF1dGhvcml6ZWRfYWNjZXNzX3ByaW9yaXR5ID0gMHgwNjsKKworICAgICAgICBzbWN0cl9kaXNhYmxlX2JpY19pbnQoZGV2KTsKKyAgICAgICAgc21jdHJfc2V0X3RyY19yZXNldChkZXYtPmJhc2VfYWRkcik7CisKKyAgICAgICAgc21jdHJfZW5hYmxlXzE2Yml0KGRldik7CisgICAgICAgIHNtY3RyX3NldF9wYWdlKGRldiwgKF9fdTggKil0cC0+cmFtX2FjY2Vzcyk7CisKKyAgICAgICAgaWYoc21jdHJfY2hlY2tzdW1fZmlybXdhcmUoZGV2KSkKKwl7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogUHJldmlvdXNseSBsb2FkZWQgZmlybXdhcmUgaXMgbWlzc2luZ1xuIixkZXYtPm5hbWUpOyAgICAgICAgICAgICAgICByZXR1cm4gKC1FTk9FTlQpOworICAgICAgICB9CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3JhbV9tZW1vcnlfdGVzdChkZXYpKSkKKwl7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogUkFNIG1lbW9yeSB0ZXN0IGZhaWxlZC5cbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuICgtRUlPKTsKKyAgICAgICAgfQorCisJc21jdHJfc2V0X3J4X2xvb2tfYWhlYWQoZGV2KTsKKyAgICAgICAgc21jdHJfbG9hZF9ub2RlX2FkZHIoZGV2KTsKKworICAgICAgICAvKiBJbml0aWFsaXplIGFkYXB0ZXIgZm9yIEludGVybmFsIFNlbGYgVGVzdC4gKi8KKyAgICAgICAgc21jdHJfcmVzZXRfYWRhcHRlcihkZXYpOworICAgICAgICBpZigoZXJyID0gc21jdHJfaW5pdF9jYXJkX3JlYWwoZGV2KSkpCisJeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJXM6IEluaXRpYWxpemF0aW9uIG9mIGNhcmQgZmFpbGVkICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuICgtRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRoaXMgcm91dGluZSBjbG9iYmVycyB0aGUgVFJDJ3MgaW50ZXJuYWwgcmVnaXN0ZXJzLiAqLworICAgICAgICBpZigoZXJyID0gc21jdHJfaW50ZXJuYWxfc2VsZl90ZXN0KGRldikpKQorCXsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBDYXJkIGZhaWxlZCBpbnRlcm5hbCBzZWxmIHRlc3QgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKC1FSU5WQUwpOworICAgICAgICB9CisKKyAgICAgICAgLyogUmUtSW5pdGlhbGl6ZSBhZGFwdGVyJ3MgaW50ZXJuYWwgcmVnaXN0ZXJzICovCisgICAgICAgIHNtY3RyX3Jlc2V0X2FkYXB0ZXIoZGV2KTsKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX2luaXRfY2FyZF9yZWFsKGRldikpKQorCXsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBJbml0aWFsaXphdGlvbiBvZiBjYXJkIGZhaWxlZCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiAoLUVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICBzbWN0cl9lbmFibGVfYmljX2ludChkZXYpOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl9pc3N1ZV9lbmFibGVfaW50X2NtZChkZXYsIFRSQ19JTlRFUlJVUFRfRU5BQkxFX01BU0spKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgc21jdHJfZGlzYWJsZV8xNmJpdChkZXYpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaW5pdF9jYXJkX3JlYWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgZXJyID0gMDsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfaW5pdF9jYXJkX3JlYWxcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgdHAtPnNoX21lbV91c2VkID0gMDsKKyAgICAgICAgdHAtPm51bV9hY2JzICAgID0gTlVNX09GX0FDQlM7CisKKyAgICAgICAgLyogUmFuZ2UgQ2hlY2sgTWF4IFBhY2tldCBTaXplICovCisgICAgICAgIGlmKHRwLT5tYXhfcGFja2V0X3NpemUgPCAyNTYpCisgICAgICAgICAgICAgICAgdHAtPm1heF9wYWNrZXRfc2l6ZSA9IDI1NjsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYodHAtPm1heF9wYWNrZXRfc2l6ZSA+IE5PTl9NQUNfVFhfQlVGRkVSX01FTU9SWSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5tYXhfcGFja2V0X3NpemUgPSBOT05fTUFDX1RYX0JVRkZFUl9NRU1PUlk7CisgICAgICAgIH0KKworICAgICAgICB0cC0+bnVtX29mX3R4X2J1ZmZzID0gKE5PTl9NQUNfVFhfQlVGRkVSX01FTU9SWQorICAgICAgICAgICAgICAgIC8gdHAtPm1heF9wYWNrZXRfc2l6ZSkgLSAxOworCisgICAgICAgIGlmKHRwLT5udW1fb2ZfdHhfYnVmZnMgPiBOVU1fTk9OX01BQ19UWF9GQ0JTKQorICAgICAgICAgICAgICAgIHRwLT5udW1fb2ZfdHhfYnVmZnMgPSBOVU1fTk9OX01BQ19UWF9GQ0JTOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZih0cC0+bnVtX29mX3R4X2J1ZmZzID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bnVtX29mX3R4X2J1ZmZzID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFR4IHF1ZXVlIGNvbnN0YW50cyAqLworICAgICAgICB0cC0+bnVtX3R4X2ZjYnMgICAgICAgIFtCVUdfUVVFVUVdICAgICA9IE5VTV9CVUdfVFhfRkNCUzsKKyAgICAgICAgdHAtPm51bV90eF9iZGJzICAgICAgICBbQlVHX1FVRVVFXSAgICAgPSBOVU1fQlVHX1RYX0JEQlM7CisgICAgICAgIHRwLT50eF9idWZmX3NpemUgICAgICAgW0JVR19RVUVVRV0gICAgID0gQlVHX1RYX0JVRkZFUl9NRU1PUlk7CisgICAgICAgIHRwLT50eF9idWZmX3VzZWQgICAgICAgW0JVR19RVUVVRV0gICAgID0gMDsKKyAgICAgICAgdHAtPnR4X3F1ZXVlX3N0YXR1cyAgICBbQlVHX1FVRVVFXSAgICAgPSBOT1RfVFJBTlNNSVRJTkc7CisKKyAgICAgICAgdHAtPm51bV90eF9mY2JzICAgICAgICBbTUFDX1FVRVVFXSAgICAgPSBOVU1fTUFDX1RYX0ZDQlM7CisgICAgICAgIHRwLT5udW1fdHhfYmRicyAgICAgICAgW01BQ19RVUVVRV0gICAgID0gTlVNX01BQ19UWF9CREJTOworICAgICAgICB0cC0+dHhfYnVmZl9zaXplICAgICAgIFtNQUNfUVVFVUVdICAgICA9IE1BQ19UWF9CVUZGRVJfTUVNT1JZOworICAgICAgICB0cC0+dHhfYnVmZl91c2VkICAgICAgIFtNQUNfUVVFVUVdICAgICA9IDA7CisgICAgICAgIHRwLT50eF9xdWV1ZV9zdGF0dXMgICAgW01BQ19RVUVVRV0gICAgID0gTk9UX1RSQU5TTUlUSU5HOworCisgICAgICAgIHRwLT5udW1fdHhfZmNicyAgICAgICAgW05PTl9NQUNfUVVFVUVdID0gTlVNX05PTl9NQUNfVFhfRkNCUzsKKyAgICAgICAgdHAtPm51bV90eF9iZGJzICAgICAgICBbTk9OX01BQ19RVUVVRV0gPSBOVU1fTk9OX01BQ19UWF9CREJTOworICAgICAgICB0cC0+dHhfYnVmZl9zaXplICAgICAgIFtOT05fTUFDX1FVRVVFXSA9IE5PTl9NQUNfVFhfQlVGRkVSX01FTU9SWTsKKyAgICAgICAgdHAtPnR4X2J1ZmZfdXNlZCAgICAgICBbTk9OX01BQ19RVUVVRV0gPSAwOworICAgICAgICB0cC0+dHhfcXVldWVfc3RhdHVzICAgIFtOT05fTUFDX1FVRVVFXSA9IE5PVF9UUkFOU01JVElORzsKKworICAgICAgICAvKiBSZWNlaXZlIFF1ZXVlIENvbnN0YW50cyAqLworICAgICAgICB0cC0+bnVtX3J4X2ZjYnNbTUFDX1FVRVVFXSA9IE5VTV9NQUNfUlhfRkNCUzsKKyAgICAgICAgdHAtPm51bV9yeF9iZGJzW01BQ19RVUVVRV0gPSBOVU1fTUFDX1JYX0JEQlM7CisKKyAgICAgICAgaWYodHAtPmV4dHJhX2luZm8gJiBDSElQX1JFVl9NQVNLKQorICAgICAgICAgICAgICAgIHRwLT5udW1fcnhfZmNic1tOT05fTUFDX1FVRVVFXSA9IDc4OyAgICAvKiA4MjUgUmV2LiBYRSAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHAtPm51bV9yeF9mY2JzW05PTl9NQUNfUVVFVUVdID0gNzsgICAgIC8qIDgyNSBSZXYuIFhEICovCisKKyAgICAgICAgdHAtPm51bV9yeF9iZGJzW05PTl9NQUNfUVVFVUVdID0gc21jdHJfZ2V0X251bV9yeF9iZGJzKGRldik7CisKKyAgICAgICAgc21jdHJfYWxsb2Nfc2hhcmVkX21lbW9yeShkZXYpOworICAgICAgICBzbWN0cl9pbml0X3NoYXJlZF9tZW1vcnkoZGV2KTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfaW5pdF90aW1lcnNfY21kKGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfaW5pdF90eHJ4X2NtZChkZXYpKSkKKwl7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogSGFyZHdhcmUgZmFpbHVyZVxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2luaXRfcnhfYmRicyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCBpLCBqOworICAgICAgICBCREJsb2NrICpiZGI7CisgICAgICAgIF9fdTE2ICpidWY7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2luaXRfcnhfYmRic1xuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCBOVU1fUlhfUVNfVVNFRDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgYmRiID0gdHAtPnJ4X2JkYl9oZWFkW2ldOworICAgICAgICAgICAgICAgIGJ1ZiA9IHRwLT5yeF9idWZmX2hlYWRbaV07CisgICAgICAgICAgICAgICAgYmRiLT5pbmZvID0gKEJEQl9DSEFJTl9FTkQgfCBCREJfTk9fV0FSTklORyk7CisgICAgICAgICAgICAgICAgYmRiLT5idWZmZXJfbGVuZ3RoID0gUlhfREFUQV9CVUZGRVJfU0laRTsKKyAgICAgICAgICAgICAgICBiZGItPm5leHRfcHRyID0gKEJEQmxvY2sgKikoKChjaGFyICopYmRiKSArIHNpemVvZihCREJsb2NrKSk7CisgICAgICAgICAgICAgICAgYmRiLT5kYXRhX2Jsb2NrX3B0ciA9IGJ1ZjsKKyAgICAgICAgICAgICAgICBiZGItPnRyY19uZXh0X3B0ciA9IFRSQ19QT0lOVEVSKGJkYi0+bmV4dF9wdHIpOworCisgICAgICAgICAgICAgICAgaWYoaSA9PSBOT05fTUFDX1FVRVVFKQorICAgICAgICAgICAgICAgICAgICAgICAgYmRiLT50cmNfZGF0YV9ibG9ja19wdHIgPSBSWF9CVUZGX1RSQ19QT0lOVEVSKGJ1Zik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYmRiLT50cmNfZGF0YV9ibG9ja19wdHIgPSBUUkNfUE9JTlRFUihidWYpOworCisgICAgICAgICAgICAgICAgZm9yKGogPSAxOyBqIDwgdHAtPm51bV9yeF9iZGJzW2ldOyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmRiLT5uZXh0X3B0ci0+YmFja19wdHIgPSBiZGI7CisgICAgICAgICAgICAgICAgICAgICAgICBiZGIgPSBiZGItPm5leHRfcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gKF9fdTE2ICopKChjaGFyICopYnVmICsgUlhfREFUQV9CVUZGRVJfU0laRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBiZGItPmluZm8gPSAoQkRCX05PVF9DSEFJTl9FTkQgfCBCREJfTk9fV0FSTklORyk7CisgICAgICAgICAgICAgICAgICAgICAgICBiZGItPmJ1ZmZlcl9sZW5ndGggPSBSWF9EQVRBX0JVRkZFUl9TSVpFOworICAgICAgICAgICAgICAgICAgICAgICAgYmRiLT5uZXh0X3B0ciA9IChCREJsb2NrICopKCgoY2hhciAqKWJkYikgKyBzaXplb2YoQkRCbG9jaykpOworICAgICAgICAgICAgICAgICAgICAgICAgYmRiLT5kYXRhX2Jsb2NrX3B0ciA9IGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJkYi0+dHJjX25leHRfcHRyID0gVFJDX1BPSU5URVIoYmRiLT5uZXh0X3B0cik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGkgPT0gTk9OX01BQ19RVUVVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmRiLT50cmNfZGF0YV9ibG9ja19wdHIgPSBSWF9CVUZGX1RSQ19QT0lOVEVSKGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJkYi0+dHJjX2RhdGFfYmxvY2tfcHRyID0gVFJDX1BPSU5URVIoYnVmKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBiZGItPm5leHRfcHRyICAgICAgICAgICA9IHRwLT5yeF9iZGJfaGVhZFtpXTsKKyAgICAgICAgICAgICAgICBiZGItPnRyY19uZXh0X3B0ciAgICAgICA9IFRSQ19QT0lOVEVSKHRwLT5yeF9iZGJfaGVhZFtpXSk7CisKKyAgICAgICAgICAgICAgICB0cC0+cnhfYmRiX2hlYWRbaV0tPmJhY2tfcHRyICAgID0gYmRiOworICAgICAgICAgICAgICAgIHRwLT5yeF9iZGJfY3VycltpXSAgICAgICAgICAgICAgPSB0cC0+cnhfYmRiX2hlYWRbaV0tPm5leHRfcHRyOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pbml0X3J4X2ZjYnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBpbnQgaSwgajsKKyAgICAgICAgRkNCbG9jayAqZmNiOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IE5VTV9SWF9RU19VU0VEOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmY2IgICAgICAgICAgICAgICA9IHRwLT5yeF9mY2JfaGVhZFtpXTsKKyAgICAgICAgICAgICAgICBmY2ItPmZyYW1lX3N0YXR1cyA9IDA7CisgICAgICAgICAgICAgICAgZmNiLT5mcmFtZV9sZW5ndGggPSAwOworICAgICAgICAgICAgICAgIGZjYi0+aW5mbyAgICAgICAgID0gRkNCX0NIQUlOX0VORDsKKyAgICAgICAgICAgICAgICBmY2ItPm5leHRfcHRyICAgICA9IChGQ0Jsb2NrICopKCgoY2hhciopZmNiKSArIHNpemVvZihGQ0Jsb2NrKSk7CisgICAgICAgICAgICAgICAgaWYoaSA9PSBOT05fTUFDX1FVRVVFKQorICAgICAgICAgICAgICAgICAgICAgICAgZmNiLT50cmNfbmV4dF9wdHIgPSBSWF9GQ0JfVFJDX1BPSU5URVIoZmNiLT5uZXh0X3B0cik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZmNiLT50cmNfbmV4dF9wdHIgPSBUUkNfUE9JTlRFUihmY2ItPm5leHRfcHRyKTsKKworICAgICAgICAgICAgICAgIGZvcihqID0gMTsgaiA8IHRwLT5udW1fcnhfZmNic1tpXTsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjYi0+bmV4dF9wdHItPmJhY2tfcHRyID0gZmNiOworICAgICAgICAgICAgICAgICAgICAgICAgZmNiICAgICAgICAgICAgICAgICAgICAgPSBmY2ItPm5leHRfcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgZmNiLT5mcmFtZV9zdGF0dXMgICAgICAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZmNiLT5mcmFtZV9sZW5ndGggICAgICAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZmNiLT5pbmZvICAgICAgICAgICAgICAgPSBGQ0JfV0FSTklORzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjYi0+bmV4dF9wdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoRkNCbG9jayAqKSgoKGNoYXIgKilmY2IpICsgc2l6ZW9mKEZDQmxvY2spKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoaSA9PSBOT05fTUFDX1FVRVVFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY2ItPnRyY19uZXh0X3B0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gUlhfRkNCX1RSQ19QT0lOVEVSKGZjYi0+bmV4dF9wdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY2ItPnRyY19uZXh0X3B0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gVFJDX1BPSU5URVIoZmNiLT5uZXh0X3B0cik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZmNiLT5uZXh0X3B0ciA9IHRwLT5yeF9mY2JfaGVhZFtpXTsKKworICAgICAgICAgICAgICAgIGlmKGkgPT0gTk9OX01BQ19RVUVVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjYi0+dHJjX25leHRfcHRyID0gUlhfRkNCX1RSQ19QT0lOVEVSKGZjYi0+bmV4dF9wdHIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjYi0+dHJjX25leHRfcHRyID0gVFJDX1BPSU5URVIoZmNiLT5uZXh0X3B0cik7CisKKyAgICAgICAgICAgICAgICB0cC0+cnhfZmNiX2hlYWRbaV0tPmJhY2tfcHRyICAgID0gZmNiOworICAgICAgICAgICAgICAgIHRwLT5yeF9mY2JfY3VycltpXSAgICAgICAgICAgICAgPSB0cC0+cnhfZmNiX2hlYWRbaV0tPm5leHRfcHRyOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2luaXRfc2hhcmVkX21lbW9yeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgICBfX3UzMiAqaXNjcGI7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2luaXRfc2hhcmVkX21lbW9yeVxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBzbWN0cl9zZXRfcGFnZShkZXYsIChfX3U4ICopKHVuc2lnbmVkIGludCl0cC0+aXNjcGJfcHRyKTsKKworICAgICAgICAvKiBJbml0aWFsaXplIEluaXRpYWwgU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnQuIChJU0NQKSAqLworICAgICAgICBpc2NwYiA9IChfX3UzMiAqKVBBR0VfUE9JTlRFUigmdHAtPmlzY3BiX3B0ci0+dHJjX3NjZ2JfcHRyKTsKKyAgICAgICAgKmlzY3BiID0gKF9fdTMyKShTV0FQX1dPUkRTKFRSQ19QT0lOVEVSKHRwLT5zY2diX3B0cikpKTsKKworICAgICAgICBzbWN0cl9zZXRfcGFnZShkZXYsIChfX3U4ICopdHAtPnJhbV9hY2Nlc3MpOworCisgICAgICAgIC8qIEluaXRpYWxpemUgU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlcnMuIChTQ1ApICovCisgICAgICAgIHRwLT5zY2diX3B0ci0+Y29uZmlnID0gKFNDR0JfQUREUkVTU19QT0lOVEVSX0ZPUk1BVAorICAgICAgICAgICAgICAgIHwgU0NHQl9NVUxUSV9XT1JEX0NPTlRST0wgfCBTQ0dCX0RBVEFfRk9STUFUCisgICAgICAgICAgICAgICAgfCBTQ0dCX0JVUlNUX0xFTkdUSCk7CisKKyAgICAgICAgdHAtPnNjZ2JfcHRyLT50cmNfc2NsYl9wdHIgICAgICA9IFRSQ19QT0lOVEVSKHRwLT5zY2xiX3B0cik7CisgICAgICAgIHRwLT5zY2diX3B0ci0+dHJjX2FjYl9wdHIgICAgICAgPSBUUkNfUE9JTlRFUih0cC0+YWNiX2hlYWQpOworICAgICAgICB0cC0+c2NnYl9wdHItPnRyY19pc2JfcHRyICAgICAgID0gVFJDX1BPSU5URVIodHAtPmlzYl9wdHIpOworICAgICAgICB0cC0+c2NnYl9wdHItPmlzYnNpeiAgICAgICAgICAgID0gKHNpemVvZihJU0Jsb2NrKSkgLSAyOworCisgICAgICAgIC8qIEluaXRpYWxpemUgU3lzdGVtIENvbnRyb2wgQmxvY2suIChTQ0IpICovCisgICAgICAgIHRwLT5zY2xiX3B0ci0+dmFsaWRfY29tbWFuZCAgICA9IFNDTEJfVkFMSUQgfCBTQ0xCX0NNRF9OT1A7CisgICAgICAgIHRwLT5zY2xiX3B0ci0+aWFja19jb2RlICAgICAgICA9IDA7CisgICAgICAgIHRwLT5zY2xiX3B0ci0+cmVzdW1lX2NvbnRyb2wgICA9IDA7CisgICAgICAgIHRwLT5zY2xiX3B0ci0+aW50X21hc2tfY29udHJvbCA9IDA7CisgICAgICAgIHRwLT5zY2xiX3B0ci0+aW50X21hc2tfc3RhdGUgICA9IDA7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBJbnRlcnJ1cHQgU3RhdHVzIEJsb2NrLiAoSVNCKSAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCBOVU1fT0ZfSU5URVJSVVBUUzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgdHAtPmlzYl9wdHItPklTdGF0dXNbaV0uSVR5cGUgPSAweGYwOworICAgICAgICAgICAgICAgIHRwLT5pc2JfcHRyLT5JU3RhdHVzW2ldLklTdWJ0eXBlID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHRwLT5jdXJyZW50X2lzYl9pbmRleCA9IDA7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBBY3Rpb24gQ29tbWFuZCBCbG9jay4gKEFDQikgKi8KKyAgICAgICAgc21jdHJfaW5pdF9hY2JzKGRldik7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSB0cmFuc21pdCBGQ0IncyBhbmQgQkRCJ3MuICovCisgICAgICAgIHNtY3RyX2xpbmtfdHhfZmNic190b19iZGJzKGRldik7CisgICAgICAgIHNtY3RyX2luaXRfdHhfYmRicyhkZXYpOworICAgICAgICBzbWN0cl9pbml0X3R4X2ZjYnMoZGV2KTsKKworICAgICAgICAvKiBJbml0aWFsaXplIHJlY2VpdmUgRkNCJ3MgYW5kIEJEQidzLiAqLworICAgICAgICBzbWN0cl9pbml0X3J4X2JkYnMoZGV2KTsKKyAgICAgICAgc21jdHJfaW5pdF9yeF9mY2JzKGRldik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pbml0X3R4X2JkYnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBpbnQgaSwgajsKKyAgICAgICAgQkRCbG9jayAqYmRiOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IE5VTV9UWF9RU19VU0VEOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiZGIgPSB0cC0+dHhfYmRiX2hlYWRbaV07CisgICAgICAgICAgICAgICAgYmRiLT5pbmZvID0gKEJEQl9OT1RfQ0hBSU5fRU5EIHwgQkRCX05PX1dBUk5JTkcpOworICAgICAgICAgICAgICAgIGJkYi0+bmV4dF9wdHIgPSAoQkRCbG9jayAqKSgoKGNoYXIgKiliZGIpICsgc2l6ZW9mKEJEQmxvY2spKTsKKyAgICAgICAgICAgICAgICBiZGItPnRyY19uZXh0X3B0ciA9IFRSQ19QT0lOVEVSKGJkYi0+bmV4dF9wdHIpOworCisgICAgICAgICAgICAgICAgZm9yKGogPSAxOyBqIDwgdHAtPm51bV90eF9iZGJzW2ldOyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYmRiLT5uZXh0X3B0ci0+YmFja19wdHIgPSBiZGI7CisgICAgICAgICAgICAgICAgICAgICAgICBiZGIgPSBiZGItPm5leHRfcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgYmRiLT5pbmZvID0gKEJEQl9OT1RfQ0hBSU5fRU5EIHwgQkRCX05PX1dBUk5JTkcpOworICAgICAgICAgICAgICAgICAgICAgICAgYmRiLT5uZXh0X3B0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChCREJsb2NrICopKCgoY2hhciAqKWJkYikgKyBzaXplb2YoIEJEQmxvY2spKTsgICAgICAgICAgICAgICAgICAgICAgICBiZGItPnRyY19uZXh0X3B0ciA9IFRSQ19QT0lOVEVSKGJkYi0+bmV4dF9wdHIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJkYi0+bmV4dF9wdHIgPSB0cC0+dHhfYmRiX2hlYWRbaV07CisgICAgICAgICAgICAgICAgYmRiLT50cmNfbmV4dF9wdHIgPSBUUkNfUE9JTlRFUih0cC0+dHhfYmRiX2hlYWRbaV0pOworICAgICAgICAgICAgICAgIHRwLT50eF9iZGJfaGVhZFtpXS0+YmFja19wdHIgPSBiZGI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2luaXRfdHhfZmNicyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCBpLCBqOworICAgICAgICBGQ0Jsb2NrICpmY2I7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgTlVNX1RYX1FTX1VTRUQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGZjYiAgICAgICAgICAgICAgID0gdHAtPnR4X2ZjYl9oZWFkW2ldOworICAgICAgICAgICAgICAgIGZjYi0+ZnJhbWVfc3RhdHVzID0gMDsKKyAgICAgICAgICAgICAgICBmY2ItPmZyYW1lX2xlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgZmNiLT5pbmZvICAgICAgICAgPSBGQ0JfQ0hBSU5fRU5EOworICAgICAgICAgICAgICAgIGZjYi0+bmV4dF9wdHIgPSAoRkNCbG9jayAqKSgoKGNoYXIgKilmY2IpICsgc2l6ZW9mKEZDQmxvY2spKTsKKyAgICAgICAgICAgICAgICBmY2ItPnRyY19uZXh0X3B0ciA9IFRSQ19QT0lOVEVSKGZjYi0+bmV4dF9wdHIpOworCisgICAgICAgICAgICAgICAgZm9yKGogPSAxOyBqIDwgdHAtPm51bV90eF9mY2JzW2ldOyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmNiLT5uZXh0X3B0ci0+YmFja19wdHIgPSBmY2I7CisgICAgICAgICAgICAgICAgICAgICAgICBmY2IgICAgICAgICAgICAgICAgICAgICA9IGZjYi0+bmV4dF9wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBmY2ItPmZyYW1lX3N0YXR1cyAgICAgICA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmY2ItPmZyYW1lX2xlbmd0aCAgICAgICA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmY2ItPmluZm8gICAgICAgICAgICAgICA9IEZDQl9DSEFJTl9FTkQ7CisgICAgICAgICAgICAgICAgICAgICAgICBmY2ItPm5leHRfcHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKEZDQmxvY2sgKikoKChjaGFyICopZmNiKSArIHNpemVvZihGQ0Jsb2NrKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmY2ItPnRyY19uZXh0X3B0ciA9IFRSQ19QT0lOVEVSKGZjYi0+bmV4dF9wdHIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZjYi0+bmV4dF9wdHIgICAgICAgICAgID0gdHAtPnR4X2ZjYl9oZWFkW2ldOworICAgICAgICAgICAgICAgIGZjYi0+dHJjX25leHRfcHRyICAgICAgID0gVFJDX1BPSU5URVIodHAtPnR4X2ZjYl9oZWFkW2ldKTsKKworICAgICAgICAgICAgICAgIHRwLT50eF9mY2JfaGVhZFtpXS0+YmFja19wdHIgICAgPSBmY2I7CisgICAgICAgICAgICAgICAgdHAtPnR4X2ZjYl9lbmRbaV0gICAgICAgICAgICAgICA9IHRwLT50eF9mY2JfaGVhZFtpXS0+bmV4dF9wdHI7CisgICAgICAgICAgICAgICAgdHAtPnR4X2ZjYl9jdXJyW2ldICAgICAgICAgICAgICA9IHRwLT50eF9mY2JfaGVhZFtpXS0+bmV4dF9wdHI7CisgICAgICAgICAgICAgICAgdHAtPm51bV90eF9mY2JzX3VzZWRbaV0gICAgICAgICA9IDA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2ludGVybmFsX3NlbGZfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX2lzc3VlX3Rlc3RfaW50ZXJuYWxfcm9tX2NtZChkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfY21kKGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICBpZih0cC0+YWNiX2hlYWQtPmNtZF9kb25lX3N0YXR1cyAmIDB4ZmYpCisgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX2lzc3VlX3Rlc3RfaGljX2NtZChkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfY21kKGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICBpZih0cC0+YWNiX2hlYWQtPmNtZF9kb25lX3N0YXR1cyAmIDB4ZmYpCisgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX2lzc3VlX3Rlc3RfbWFjX3JlZ19jbWQoZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl93YWl0X2NtZChkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgaWYodHAtPmFjYl9oZWFkLT5jbWRfZG9uZV9zdGF0dXMgJiAweGZmKQorICAgICAgICAgICAgICAgIHJldHVybiAoLTEpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKKy8qCisgKiBUaGUgdHlwaWNhbCB3b3JrbG9hZCBvZiB0aGUgZHJpdmVyOiBIYW5kbGUgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGludGVycnVwdHMuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBzbWN0cl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHA7CisgICAgICAgIGludCBpb2FkZHI7CisgICAgICAgIF9fdTE2IGludGVycnVwdF91bm1hc2tfYml0cyA9IDAsIGludGVycnVwdF9hY2tfY29kZSA9IDB4ZmYwMDsKKyAgICAgICAgX191MTYgZXJyMSwgZXJyID0gTk9UX01ZX0lOVEVSUlVQVDsKKyAgICAgICAgX191OCBpc2JfdHlwZSwgaXNiX3N1YnR5cGU7CisgICAgICAgIF9fdTE2IGlzYl9pbmRleDsKKworICAgICAgICBpZihkZXYgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0NSSVQgIiVzOiBpcnEgJWQgZm9yIHVua25vd24gZGV2aWNlLlxuIiwgZGV2LT5uYW1lLCBpcnEpOworICAgICAgICAgICAgICAgIHJldHVybiBJUlFfTk9ORTsKKyAgICAgICAgfQorCisgICAgICAgIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworICAgICAgICB0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIAorCisgICAgICAgIGlmKHRwLT5zdGF0dXMgPT0gTk9UX0lOSVRJQUxJWkVEKQorICAgICAgICAgICAgICAgIHJldHVybiBJUlFfTk9ORTsKKworICAgICAgICBzcGluX2xvY2soJnRwLT5sb2NrKTsKKyAgICAgICAgCisgICAgICAgIHNtY3RyX2Rpc2FibGVfYmljX2ludChkZXYpOworICAgICAgICBzbWN0cl9lbmFibGVfMTZiaXQoZGV2KTsKKworICAgICAgICBzbWN0cl9jbGVhcl9pbnQoZGV2KTsKKworICAgICAgICAvKiBGaXJzdCByZWFkIHRoZSBMU0IgKi8KKyAgICAgICAgd2hpbGUoKHRwLT5pc2JfcHRyLT5JU3RhdHVzW3RwLT5jdXJyZW50X2lzYl9pbmRleF0uSVR5cGUgJiAweGYwKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaXNiX2luZGV4ICAgICAgID0gdHAtPmN1cnJlbnRfaXNiX2luZGV4OworICAgICAgICAgICAgICAgIGlzYl90eXBlICAgICAgICA9IHRwLT5pc2JfcHRyLT5JU3RhdHVzW2lzYl9pbmRleF0uSVR5cGU7CisgICAgICAgICAgICAgICAgaXNiX3N1YnR5cGUgICAgID0gdHAtPmlzYl9wdHItPklTdGF0dXNbaXNiX2luZGV4XS5JU3VidHlwZTsKKworICAgICAgICAgICAgICAgICh0cC0+Y3VycmVudF9pc2JfaW5kZXgpKys7CisgICAgICAgICAgICAgICAgaWYodHAtPmN1cnJlbnRfaXNiX2luZGV4ID09IE5VTV9PRl9JTlRFUlJVUFRTKQorICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmN1cnJlbnRfaXNiX2luZGV4ID0gMDsKKworICAgICAgICAgICAgICAgIGlmKGlzYl90eXBlID49IDB4MTApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfZGlzYWJsZV8xNmJpdChkZXYpOworCQkgICAgICAgIHNwaW5fdW5sb2NrKCZ0cC0+bG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZXJyID0gSEFSRFdBUkVfRkFJTEVEOworICAgICAgICAgICAgICAgIGludGVycnVwdF9hY2tfY29kZSA9IGlzYl9pbmRleDsKKyAgICAgICAgICAgICAgICB0cC0+aXNiX3B0ci0+SVN0YXR1c1tpc2JfaW5kZXhdLklUeXBlIHw9IDB4ZjA7CisKKyAgICAgICAgICAgICAgICBpbnRlcnJ1cHRfdW5tYXNrX2JpdHMgfD0gKDEgPDwgKF9fdTE2KWlzYl90eXBlKTsKKworICAgICAgICAgICAgICAgIHN3aXRjaChpc2JfdHlwZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElTQl9JTUNfTUFDX1RZUEVfMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfZGlzYWJsZV8xNmJpdChkZXYpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChpc2Jfc3VidHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5tb25pdG9yX3N0YXRlID0gTVNfTU9OSVRPUl9GU01fSU5BQ1RJVkU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1vbml0b3Jfc3RhdGUgPSBNU19SRVBFQVRfQkVBQ09OX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bW9uaXRvcl9zdGF0ZSA9IE1TX1JFUEVBVF9DTEFJTV9UT0tFTl9TVEFURTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1vbml0b3Jfc3RhdGUgPSBNU19UUkFOU01JVF9DTEFJTV9UT0tFTl9TVEFURTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5tb25pdG9yX3N0YXRlID0gTVNfU1RBTkRCWV9NT05JVE9SX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bW9uaXRvcl9zdGF0ZSA9IE1TX1RSQU5TTUlUX0JFQUNPTl9TVEFURTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1vbml0b3Jfc3RhdGUgPSBNU19BQ1RJVkVfTU9OSVRPUl9TVEFURTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1vbml0b3Jfc3RhdGUgPSBNU19UUkFOU01JVF9SSU5HX1BVUkdFX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6ICAgLyogZGlhZ25vc3RpYyBzdGF0ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bW9uaXRvcl9zdGF0ZSA9IE1TX0JFQUNPTl9URVNUX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc21jdHJfbG9iZV9tZWRpYV90ZXN0KGRldikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5yaW5nX3N0YXR1c19mbGFncyA9IFJJTkdfU1RBVFVTX0NIQU5HRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5yaW5nX3N0YXR1cyA9IEFVVE9fUkVNT1ZBTF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfcmluZ19zdGF0dXNfY2hnKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX2J5cGFzc19zdGF0ZShkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9pc3N1ZV9pbnNlcnRfY21kKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhc2UgMHgwYS0weGZmLCBpbGxlZ2FsIHN0YXRlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5yaW5nX3N0YXR1c19mbGFncyA9IE1PTklUT1JfU1RBVEVfQ0hBTkdFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc21jdHJfcmluZ19zdGF0dXNfY2hnKGRldik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfZW5hYmxlXzE2Yml0KGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIDB4MDIgLSBNQUMgRXJyb3IgQ291bnRlcnMgSW50ZXJydXB0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBPbmUgb3IgbW9yZSBNQUMgRXJyb3IgQ291bnRlciBpcyBoYWxmIGZ1bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgTUFDIEVycm9yIENvdW50ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgIExvc3RfRlJfRXJyb3JfQ291bnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICBSQ1ZfQ29uZ2VzdGlvbl9Db3VudGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgIEZSX2NvcGllZF9FcnJvcl9Db3VudGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgIEZSRVFfRXJyb3JfQ291bnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICBUb2tlbl9FcnJvcl9Db3VudGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgIExpbmVfRXJyb3JfQ291bnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICBJbnRlcm5hbF9FcnJvcl9Db3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElTQl9JTUNfTUFDX0VSUk9SX0NPVU5URVJTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIDgwMi41IEVycm9yIENvdW50ZXJzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHNtY3RyX2lzc3VlX3JlYWRfcmluZ19zdGF0dXNfY21kKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIDB4MDQgLSBNQUMgVHlwZSAyIEludGVycnVwdAorICAgICAgICAgICAgICAgICAgICAgICAgICogSE9TVCBuZWVkcyB0byBlbnF1ZXVlIE1BQyBGcmFtZSBmb3IgdHJhbnNtaXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBTdWJUeXBlIEJpdCAxNSAtIFJRX0lOSVRfUERVKCBSZXF1ZXN0IEluaXRpYWxpemF0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAqIENoYW5nZWQgZnJvbSBSUV9JTklUX1BEVSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICogVFJDX1N0YXR1c19DaGFuZ2VkX0luZGljYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVNCX0lNQ19NQUNfVFlQRV8yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBzbWN0cl9pc3N1ZV9yZWFkX3Jpbmdfc3RhdHVzX2NtZChkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIDB4MDUgLSBUWCBGcmFtZSBJbnRlcnJ1cHQgKEZJKS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVNCX0lNQ19UWF9GUkFNRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQlVHIFFVRVVFIGZvciBUUkMgc3R1Y2sgcmVjZWl2ZSBCVUcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNiX3N1YnR5cGUgJiBUWF9QRU5ESU5HX1BSSU9SSVRZXzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfdHhfY29tcGxldGUoZGV2LCBCVUdfUVVFVUUpKSAhPSBTVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOT04tTUFDIGZyYW1lcyBvbmx5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzYl9zdWJ0eXBlICYgVFhfUEVORElOR19QUklPUklUWV8xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX3R4X2NvbXBsZXRlKGRldiwgTk9OX01BQ19RVUVVRSkpICE9IFNVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1BQyBmcmFtZXMgb25seSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc2Jfc3VidHlwZSAmIFRYX1BFTkRJTkdfUFJJT1JJVFlfMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBzbWN0cl90eF9jb21wbGV0ZShkZXYsIE1BQ19RVUVVRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSAweDA2IC0gVFggRU5EIE9GIFFVRVVFIChGRSkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVNCX0lNQ19FTkRfT0ZfVFhfUVVFVUU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJVRyBxdWV1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc2Jfc3VidHlwZSAmIFRYX1BFTkRJTkdfUFJJT1JJVFlfMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9rIHRvIGNsZWFyIFJlY2VpdmUgRklGTyBvdmVycnVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW1hc2sgc2VuZF9CVUcgbm93IGNvbXBsZXRlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRfdW5tYXNrX2JpdHMgfD0gMHg4MDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+dHhfcXVldWVfc3RhdHVzW0JVR19RVUVVRV0gPSBOT1RfVFJBTlNNSVRJTkc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX3R4X2NvbXBsZXRlKGRldiwgQlVHX1FVRVVFKSkgIT0gU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChlcnIgPSBzbWN0cl9yZXN0YXJ0X3R4X2NoYWluKGRldiwgQlVHX1FVRVVFKSkgIT0gU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTk9OLU1BQyBxdWV1ZSBvbmx5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzYl9zdWJ0eXBlICYgVFhfUEVORElOR19QUklPUklUWV8xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnR4X3F1ZXVlX3N0YXR1c1tOT05fTUFDX1FVRVVFXSA9IE5PVF9UUkFOU01JVElORzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfdHhfY29tcGxldGUoZGV2LCBOT05fTUFDX1FVRVVFKSkgIT0gU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChlcnIgPSBzbWN0cl9yZXN0YXJ0X3R4X2NoYWluKGRldiwgTk9OX01BQ19RVUVVRSkpICE9IFNVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1BQyBxdWV1ZSBvbmx5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzYl9zdWJ0eXBlICYgVFhfUEVORElOR19QUklPUklUWV8wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnR4X3F1ZXVlX3N0YXR1c1tNQUNfUVVFVUVdID0gTk9UX1RSQU5TTUlUSU5HOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChlcnIgPSBzbWN0cl90eF9jb21wbGV0ZShkZXYsIE1BQ19RVUVVRSkpICE9IFNVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHNtY3RyX3Jlc3RhcnRfdHhfY2hhaW4oZGV2LCBNQUNfUVVFVUUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIDB4MDcgLSBOT04tTUFDIFJYIFJlc291cmNlIEludGVycnVwdAorICAgICAgICAgICAgICAgICAgICAgICAgICogICBTdWJ0eXBlIGJpdCAxMiAtIChCVykgQkRCIHdhcm5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAqICAgU3VidHlwZSBiaXQgMTMgLSAoRlcpIEZDQiB3YXJuaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIFN1YnR5cGUgYml0IDE0IC0gKEJFKSBCREIgRW5kIG9mIGNoYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIFN1YnR5cGUgYml0IDE1IC0gKEZFKSBGQ0IgRW5kIG9mIGNoYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVNCX0lNQ19OT05fTUFDX1JYX1JFU09VUkNFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+cnhfZmlmb19vdmVycnVuX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnJlY2VpdmVfcXVldWVfbnVtYmVyID0gTk9OX01BQ19RVUVVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyMSA9IHNtY3RyX3J4X2ZyYW1lKGRldik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNiX3N1YnR5cGUgJiBOT05fTUFDX1JYX1JFU09VUkNFX0ZFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX2lzc3VlX3Jlc3VtZV9yeF9mY2JfY21kKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldiwgTk9OX01BQ19RVUVVRSkpICE9IFNVQ0NFU1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0cC0+cHRyX3J4X2ZjYl9vdmVycnVucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqdHAtPnB0cl9yeF9mY2Jfb3ZlcnJ1bnMpKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc2Jfc3VidHlwZSAmIE5PTl9NQUNfUlhfUkVTT1VSQ0VfQkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfcmVzdW1lX3J4X2JkYl9jbWQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LCBOT05fTUFDX1FVRVVFKSkgIT0gU1VDQ0VTUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRwLT5wdHJfcnhfYmRiX292ZXJydW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCp0cC0+cHRyX3J4X2JkYl9vdmVycnVucykrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBlcnIxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSAweDA4IC0gTUFDIFJYIFJlc291cmNlIEludGVycnVwdAorICAgICAgICAgICAgICAgICAgICAgICAgICogICBTdWJ0eXBlIGJpdCAxMiAtIChCVykgQkRCIHdhcm5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAqICAgU3VidHlwZSBiaXQgMTMgLSAoRlcpIEZDQiB3YXJuaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIFN1YnR5cGUgYml0IDE0IC0gKEJFKSBCREIgRW5kIG9mIGNoYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIFN1YnR5cGUgYml0IDE1IC0gKEZFKSBGQ0IgRW5kIG9mIGNoYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVNCX0lNQ19NQUNfUlhfUkVTT1VSQ0U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5yZWNlaXZlX3F1ZXVlX251bWJlciA9IE1BQ19RVUVVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyMSA9IHNtY3RyX3J4X2ZyYW1lKGRldik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNiX3N1YnR5cGUgJiBNQUNfUlhfUkVTT1VSQ0VfRkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfcmVzdW1lX3J4X2ZjYl9jbWQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LCBNQUNfUVVFVUUpKSAhPSBTVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0cC0+cHRyX3J4X2ZjYl9vdmVycnVucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqdHAtPnB0cl9yeF9mY2Jfb3ZlcnJ1bnMpKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpc2Jfc3VidHlwZSAmIE1BQ19SWF9SRVNPVVJDRV9CRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChlcnIgPSBzbWN0cl9pc3N1ZV9yZXN1bWVfcnhfYmRiX2NtZCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYsIE1BQ19RVUVVRSkpICE9IFNVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRwLT5wdHJfcnhfYmRiX292ZXJydW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCp0cC0+cHRyX3J4X2JkYl9vdmVycnVucykrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBlcnIxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSAweDA5IC0gTk9OX01BQyBSWCBGcmFtZSBJbnRlcnJ1cHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVNCX0lNQ19OT05fTUFDX1JYX0ZSQU1FOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+cnhfZmlmb19vdmVycnVuX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnJlY2VpdmVfcXVldWVfbnVtYmVyID0gTk9OX01BQ19RVUVVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc21jdHJfcnhfZnJhbWUoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgMHgwQSAtIE1BQyBSWCBGcmFtZSBJbnRlcnJ1cHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVNCX0lNQ19NQUNfUlhfRlJBTUU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5yZWNlaXZlX3F1ZXVlX251bWJlciA9IE1BQ19RVUVVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc21jdHJfcnhfZnJhbWUoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgMHgwQiAtIFRSQyBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFRSQyBoYXMgZW5jb3VudGVyZWQgYW4gZXJyb3IgY29uZGl0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdWJ0eXBlIGJpdCAxNCAtIHRyYW5zbWl0IEZJRk8gdW5kZXJydW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHN1YnR5cGUgYml0IDE1IC0gcmVjZWl2ZSBGSUZPIG92ZXJydW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJU0JfSU1DX1RSQ19GSUZPX1NUQVRVUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNiX3N1YnR5cGUgJiBUUkNfRklGT19TVEFUVVNfVFhfVU5ERVJSVU4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0cC0+cHRyX3R4X2ZpZm9fdW5kZXJydW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCp0cC0+cHRyX3R4X2ZpZm9fdW5kZXJydW5zKSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNiX3N1YnR5cGUgJiBUUkNfRklGT19TVEFUVVNfUlhfT1ZFUlJVTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBvdmVycnVuIHN0dWNrIHJlY2VpdmUgY291bnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGlmID49IDMsIGhhcyB0byBjbGVhciBpdCBieSBzZW5kaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmFjayB0byBiYWNrIGZyYW1lcy4gV2UgcGljaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIERBVChkdXBsaWNhdGUgYWRkcmVzcyBNQUMgZnJhbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnJ4X2ZpZm9fb3ZlcnJ1bl9jb3VudCsrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHAtPnJ4X2ZpZm9fb3ZlcnJ1bl9jb3VudCA+PSAzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5yeF9maWZvX292ZXJydW5fY291bnQgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWxheSBjbGVhcmluZyBmaWZvIG92ZXJydW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGltYXNrIHRpbGwgc2VuZF9CVUcgdHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvbXBsZXRlIHBvc3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRfdW5tYXNrX2JpdHMgJj0gKH4weDgwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9DUklUICJKYXkgcGxlYXNlIHNlbmQgYnVnXG4iKTsvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9zZW5kX2J1ZyhkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRwLT5wdHJfcnhfZmlmb19vdmVycnVucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqdHAtPnB0cl9yeF9maWZvX292ZXJydW5zKSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgMHgwQyAtIEFjdGlvbiBDb21tYW5kIFN0YXR1cyBJbnRlcnJ1cHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFN1YnR5cGUgYml0IDE0IC0gQ0IgZW5kIG9mIGNvbW1hbmQgY2hhaW4gKENFKQorICAgICAgICAgICAgICAgICAgICAgICAgICogU3VidHlwZSBiaXQgMTUgLSBDQiBjb21tYW5kIGludGVycnVwdCAoQ0kpCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVNCX0lNQ19DT01NQU5EX1NUQVRVUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHAtPmFjYl9oZWFkLT5jbWQgPT0gQUNCX0NNRF9ISUNfTk9QKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJpMVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfZGlzYWJsZV8xNmJpdChkZXYpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWFhYWFhYWFhYWFhYWFhYWFggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICBlcnIgPSBVTV9JbnRlcnJ1cHQoZGV2KTsgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX2VuYWJsZV8xNmJpdChkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCh0cC0+YWNiX2hlYWQtPmNtZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gQUNCX0NNRF9SRUFEX1RSQ19TVEFUVVMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAodHAtPmFjYl9oZWFkLT5zdWJjbWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IFJXX1RSQ19TVEFUVVNfQkxPQ0spKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRwLT5wdHJfYmNuX3R5cGUgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih0cC0+cHRyX2Jjbl90eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKF9fdTMyKSgoU0Jsb2NrICopdHAtPm1pc2NfY29tbWFuZF9kYXRhKS0+QkNOX1R5cGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgoU0Jsb2NrICopdHAtPm1pc2NfY29tbWFuZF9kYXRhKS0+U3RhdHVzX0NIR19JbmRpY2F0ZSAmIEVSUk9SX0NPVU5URVJTX0NIQU5HRUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX3VwZGF0ZV9lcnJfc3RhdHMoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKChTQmxvY2sgKil0cC0+bWlzY19jb21tYW5kX2RhdGEpLT5TdGF0dXNfQ0hHX0luZGljYXRlICYgVElfTkRJU19SSU5HX1NUQVRVU19DSEFOR0VEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+cmluZ19zdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICgoU0Jsb2NrKil0cC0+bWlzY19jb21tYW5kX2RhdGEpLT5USV9ORElTX1JpbmdfU3RhdHVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9kaXNhYmxlXzE2Yml0KGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHNtY3RyX3Jpbmdfc3RhdHVzX2NoZyhkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9lbmFibGVfMTZiaXQoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHRwLT5yaW5nX3N0YXR1cyAmIFJFTU9WRV9SRUNFSVZFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAodHAtPmNvbmZpZ193b3JkMCAmIE5PX0FVVE9SRU1PVkUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfaXNzdWVfcmVtb3ZlX2NtZChkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXJyICE9IFNVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+YWNiX3BlbmRpbmcgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCgoU0Jsb2NrICopdHAtPm1pc2NfY29tbWFuZF9kYXRhKS0+U3RhdHVzX0NIR19JbmRpY2F0ZSAmIFVOQV9DSEFOR0VEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0cC0+cHRyX3VuYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5wdHJfdW5hWzBdID0gU1dBUF9CWVRFUygoKFNCbG9jayAqKXRwLT5taXNjX2NvbW1hbmRfZGF0YSktPlVOQVswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnB0cl91bmFbMV0gPSBTV0FQX0JZVEVTKCgoU0Jsb2NrICopdHAtPm1pc2NfY29tbWFuZF9kYXRhKS0+VU5BWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+cHRyX3VuYVsyXSA9IFNXQVBfQllURVMoKChTQmxvY2sgKil0cC0+bWlzY19jb21tYW5kX2RhdGEpLT5VTkFbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKChTQmxvY2sgKil0cC0+bWlzY19jb21tYW5kX2RhdGEpLT5TdGF0dXNfQ0hHX0luZGljYXRlICYgUkVBRFlfVE9fU0VORF9SUV9JTklUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc21jdHJfc2VuZF9ycV9pbml0KGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmFjYl9wZW5kaW5nID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgMHgwRCAtIE1BQyBUeXBlIDEgaW50ZXJydXB0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBTdWJ0eXBlIC0tIDAwIEZSX0JDTiByZWNlaXZlZCBhdCBTMTIKKyAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgMDEgRlJfQkNOIHJlY2VpdmVkIGF0IFMyMQorICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAwMiBGUl9EQVQoREE9TUEsIEE8PjApIHJlY2VpdmVkIGF0IFMyMQorICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAwMyBUU01fRVhQIGF0IFMyMQorICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAwNCBGUl9SRU1PVkUgcmVjZWl2ZWQgYXQgUzQyCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgIDA1IFRCUl9FWFAsIEJSX0ZMQUdfU0VUIGF0IFM0MgorICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAwNiBUQlRfRVhQIGF0IFM1MworICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElTQl9JTUNfTUFDX1RZUEVfMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNiX3N1YnR5cGUgPiA4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gSEFSRFdBUkVfRkFJTEVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGlzYl9zdWJ0eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmpvaW5fc3RhdGUgPSBKU19CWVBBU1NfU1RBVEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0cC0+c3RhdHVzICE9IENMT1NFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnN0YXR1cyA9IENMT1NFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc21jdHJfc3RhdHVzX2NoZyhkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+am9pbl9zdGF0ZSA9IEpTX0xPQkVfVEVTVF9TVEFURTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmpvaW5fc3RhdGUgPSBKU19ERVRFQ1RfTU9OSVRPUl9QUkVTRU5UX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+am9pbl9zdGF0ZSA9IEpTX0FXQUlUX05FV19NT05JVE9SX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+am9pbl9zdGF0ZSA9IEpTX0RVUExJQ0FURV9BRERSRVNTX1RFU1RfU1RBVEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5qb2luX3N0YXRlID0gSlNfTkVJR0hCT1JfTk9USUZJQ0FUSU9OX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+am9pbl9zdGF0ZSA9IEpTX1JFUVVFU1RfSU5JVElBTElaQVRJT05fU1RBVEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5qb2luX3N0YXRlID0gSlNfSk9JTl9DT01QTEVURV9TVEFURTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5zdGF0dXMgPSBPUEVOOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc21jdHJfc3RhdHVzX2NoZyhkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+am9pbl9zdGF0ZSA9IEpTX0JZUEFTU19XQUlUX1NUQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIDB4MEUgLSBUUkMgSW5pdGlhbGl6YXRpb24gU2VxdWVuY2UgSW50ZXJydXB0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBTdWJ0eXBlIC0tIDAwLUZGIEluaXRpYWxpemF0aW4gc2VxdWVuY2UgY29tcGxldGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJU0JfSU1DX1RSQ19JTlRSTkxfVFNUX1NUQVRVUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnN0YXR1cyA9IElOSVRJQUxJWkVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9kaXNhYmxlXzE2Yml0KGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHNtY3RyX3N0YXR1c19jaGcoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfZW5hYmxlXzE2Yml0KGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdGhlciBpbnRlcnJ1cHQgdHlwZXMsIGlsbGVnYWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKGVyciAhPSBTVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBDaGVja2luZyB0aGUgYWNrIGNvZGUgaW5zdGVhZCBvZiB0aGUgdW5tYXNrIGJpdHMgaGVyZSBpcyBiZWNhdXNlIDoKKyAgICAgICAgICogd2hpbGUgZml4aW5nIHRoZSBzdHVjayByZWNlaXZlLCBEQVQgZnJhbWUgYXJlIHNlbnQgYW5kIG1hc2sgb2ZmCisgICAgICAgICAqIEZJRk8gb3ZlcnJ1biBpbnRlcnJ1cHQgdGVtcG9yYXJpbHkgKGludGVycnVwdF91bm1hc2tfYml0cyA9IDApCisgICAgICAgICAqIGJ1dCB3ZSBzdGlsbCB3YW50IHRvIGlzc3VlIGFjayB0byBJU0IKKyAgICAgICAgICovCisgICAgICAgIGlmKCEoaW50ZXJydXB0X2Fja19jb2RlICYgMHhmZjAwKSkKKyAgICAgICAgICAgICAgICBzbWN0cl9pc3N1ZV9pbnRfYWNrKGRldiwgaW50ZXJydXB0X2Fja19jb2RlLCBpbnRlcnJ1cHRfdW5tYXNrX2JpdHMpOworCisgICAgICAgIHNtY3RyX2Rpc2FibGVfMTZiaXQoZGV2KTsKKyAgICAgICAgc21jdHJfZW5hYmxlX2JpY19pbnQoZGV2KTsKKyAgICAgICAgc3Bpbl91bmxvY2soJnRwLT5sb2NrKTsKKworICAgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfZW5hYmxlX2ludF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgX191MTYgaW50ZXJydXB0X2VuYWJsZV9tYXNrKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfd2hpbGVfY2J1c3koZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIHRwLT5zY2xiX3B0ci0+aW50X21hc2tfY29udHJvbCAgPSBpbnRlcnJ1cHRfZW5hYmxlX21hc2s7CisgICAgICAgIHRwLT5zY2xiX3B0ci0+dmFsaWRfY29tbWFuZCAgICAgPSBTQ0xCX1ZBTElEIHwgU0NMQl9DTURfQ0xFQVJfSU5URVJSVVBUX01BU0s7CisKKyAgICAgICAgc21jdHJfc2V0X2N0cmxfYXR0ZW50aW9uKGRldik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9pbnRfYWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IGlhY2tfY29kZSwgX191MTYgaWJpdHMpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICBpZihzbWN0cl93YWl0X3doaWxlX2NidXN5KGRldikpCisgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CisKKyAgICAgICAgdHAtPnNjbGJfcHRyLT5pbnRfbWFza19jb250cm9sID0gaWJpdHM7CisgICAgICAgIHRwLT5zY2xiX3B0ci0+aWFja19jb2RlID0gaWFja19jb2RlIDw8IDE7IC8qIHVzZSB0aGUgb2Zmc2V0IGZyb20gYmFzZSAqLyAgICAgICAgdHAtPnNjbGJfcHRyLT5yZXN1bWVfY29udHJvbCA9IDA7CisgICAgICAgIHRwLT5zY2xiX3B0ci0+dmFsaWRfY29tbWFuZCA9IFNDTEJfVkFMSUQgfCBTQ0xCX0lBQ0tfQ09ERV9WQUxJRCB8IFNDTEJfQ01EX0NMRUFSX0lOVEVSUlVQVF9NQVNLOworCisgICAgICAgIHNtY3RyX3NldF9jdHJsX2F0dGVudGlvbihkZXYpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfaW5pdF90aW1lcnNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgaW50IGk7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIF9fdTE2ICpwVGltZXJfU3RydWMgPSAoX191MTYgKil0cC0+bWlzY19jb21tYW5kX2RhdGE7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfd2hpbGVfY2J1c3koZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl93YWl0X2NtZChkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgdHAtPmNvbmZpZ193b3JkMCA9IFRIRFJFTiB8IERNQV9UUklHR0VSIHwgVVNFVFBUIHwgTk9fQVVUT1JFTU9WRTsKKyAgICAgICAgdHAtPmNvbmZpZ193b3JkMSA9IDA7CisKKyAgICAgICAgaWYoKHRwLT5tZWRpYV90eXBlID09IE1FRElBX1NUUF8xNikKKyAgICAgICAgICAgICAgICB8fCAodHAtPm1lZGlhX3R5cGUgPT0gTUVESUFfVVRQXzE2KQorICAgICAgICAgICAgICAgIHx8ICh0cC0+bWVkaWFfdHlwZSA9PSBNRURJQV9TVFBfMTZfVVRQXzE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDAgfD0gRlJFUV8xNk1CX0JJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHRwLT5tb2RlX2JpdHMgJiBFQVJMWV9UT0tFTl9SRUwpCisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMCB8PSBFVFJFTjsKKworICAgICAgICBpZih0cC0+bW9kZV9iaXRzICYgTE9PUElOR19NT0RFX01BU0spCisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMCB8PSBSWF9PV05fQklUOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMCAmPSB+UlhfT1dOX0JJVDsKKworICAgICAgICBpZih0cC0+cmVjZWl2ZV9tYXNrICYgUFJPTUlTQ1VPVVNfTU9ERSkKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQwIHw9IFBST01JU0NVT1VTX0JJVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDAgJj0gflBST01JU0NVT1VTX0JJVDsKKworICAgICAgICBpZih0cC0+cmVjZWl2ZV9tYXNrICYgQUNDRVBUX0VSUl9QQUNLRVRTKQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDAgfD0gU0FWQkFEX0JJVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDAgJj0gflNBVkJBRF9CSVQ7CisKKyAgICAgICAgaWYodHAtPnJlY2VpdmVfbWFzayAmIEFDQ0VQVF9BVFRfTUFDX0ZSQU1FUykKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQwIHw9IFJYQVRNQUM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQwICY9IH5SWEFUTUFDOworCisgICAgICAgIGlmKHRwLT5yZWNlaXZlX21hc2sgJiBBQ0NFUFRfTVVMVElfUFJPTSkKKyAgICAgICAgICAgICAgICB0cC0+Y29uZmlnX3dvcmQxIHw9IE1VTFRJQ0FTVF9BRERSRVNTX0JJVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDEgJj0gfk1VTFRJQ0FTVF9BRERSRVNTX0JJVDsKKworICAgICAgICBpZih0cC0+cmVjZWl2ZV9tYXNrICYgQUNDRVBUX1NPVVJDRV9ST1VUSU5HX1NQQU5OSU5HKQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDEgfD0gU09VUkNFX1JPVVRJTkdfU1BBTk5JTkdfQklUUzsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYodHAtPnJlY2VpdmVfbWFzayAmIEFDQ0VQVF9TT1VSQ0VfUk9VVElORykKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDEgfD0gU09VUkNFX1JPVVRJTkdfRVhQTE9SRVJfQklUOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDEgJj0gflNPVVJDRV9ST1VUSU5HX1NQQU5OSU5HX0JJVFM7CisgICAgICAgIH0KKworICAgICAgICBpZigodHAtPm1lZGlhX3R5cGUgPT0gTUVESUFfU1RQXzE2KQorICAgICAgICAgICAgICAgIHx8ICh0cC0+bWVkaWFfdHlwZSA9PSBNRURJQV9VVFBfMTYpCisgICAgICAgICAgICAgICAgfHwgKHRwLT5tZWRpYV90eXBlID09IE1FRElBX1NUUF8xNl9VVFBfMTYpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgdHAtPmNvbmZpZ193b3JkMSB8PSBJTlRFUkZSQU1FX1NQQUNJTkdfMTY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRwLT5jb25maWdfd29yZDEgfD0gSU5URVJGUkFNRV9TUEFDSU5HXzQ7CisKKyAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gdHAtPmNvbmZpZ193b3JkMDsKKyAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gdHAtPmNvbmZpZ193b3JkMTsKKworICAgICAgICBpZigodHAtPm1lZGlhX3R5cGUgPT0gTUVESUFfU1RQXzQpCisgICAgICAgICAgICAgICAgfHwgKHRwLT5tZWRpYV90eXBlID09IE1FRElBX1VUUF80KQorICAgICAgICAgICAgICAgIHx8ICh0cC0+bWVkaWFfdHlwZSA9PSBNRURJQV9TVFBfNF9VVFBfNCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDAwRkE7ICAgICAgIC8qIHByZXNjYWxlICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgyNzEwOyAgICAgICAvKiBUUFRfbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDI3MTA7ICAgICAgIC8qIFRRUF9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4MEEyODsgICAgICAgLyogVE5UX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgzRTgwOyAgICAgICAvKiBUQlRfbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDNBOTg7ICAgICAgIC8qIFRTTV9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4MUI1ODsgICAgICAgLyogVEFNX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgwMEM4OyAgICAgICAvKiBUQlJfbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDA3RDA7ICAgICAgIC8qIFRFUl9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4MDAwQTsgICAgICAgLyogVEdUX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgxMTYyOyAgICAgICAvKiBUSFRfbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDA3RDA7ICAgICAgIC8qIFRSUl9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4MTM4ODsgICAgICAgLyogVFZYX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgwMDAwOyAgICAgICAvKiByZXNlcnZlZCAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4MDNFODsgICAgICAgLyogcHJlc2NhbGUgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDlDNDA7ICAgICAgIC8qIFRQVF9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4OUM0MDsgICAgICAgLyogVFFQX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgwQTI4OyAgICAgICAvKiBUTlRfbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDNFODA7ICAgICAgIC8qIFRCVF9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4M0E5ODsgICAgICAgLyogVFNNX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgxQjU4OyAgICAgICAvKiBUQU1fbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDAwQzg7ICAgICAgIC8qIFRCUl9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4MDdEMDsgICAgICAgLyogVEVSX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHgwMDBBOyAgICAgICAvKiBUR1RfbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDQ1ODg7ICAgICAgIC8qIFRIVF9saW1pdCAqLworICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9IDB4MUY0MDsgICAgICAgLyogVFJSX2xpbWl0ICovCisgICAgICAgICAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gMHg0RTIwOyAgICAgICAvKiBUVlhfbGltaXQgKi8KKyAgICAgICAgICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAweDAwMDA7ICAgICAgIC8qIHJlc2VydmVkICovCisgICAgICAgIH0KKworICAgICAgICAvKiBTZXQgbm9kZSBhZGRyZXNzLiAqLworICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSBkZXYtPmRldl9hZGRyWzBdIDw8IDgKKyAgICAgICAgICAgICAgICB8IChkZXYtPmRldl9hZGRyWzFdICYgMHhGRik7CisgICAgICAgICpwVGltZXJfU3RydWMrKyA9IGRldi0+ZGV2X2FkZHJbMl0gPDwgOAorICAgICAgICAgICAgICAgIHwgKGRldi0+ZGV2X2FkZHJbM10gJiAweEZGKTsKKyAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gZGV2LT5kZXZfYWRkcls0XSA8PCA4CisgICAgICAgICAgICAgICAgfCAoZGV2LT5kZXZfYWRkcls1XSAmIDB4RkYpOworCisgICAgICAgIC8qIFNldCBncm91cCBhZGRyZXNzLiAqLworICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSB0cC0+Z3JvdXBfYWRkcmVzc18wIDw8IDgKKyAgICAgICAgICAgICAgICB8IHRwLT5ncm91cF9hZGRyZXNzXzAgPj4gODsKKyAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gdHAtPmdyb3VwX2FkZHJlc3NbMF0gPDwgOAorICAgICAgICAgICAgICAgIHwgdHAtPmdyb3VwX2FkZHJlc3NbMF0gPj4gODsKKyAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gdHAtPmdyb3VwX2FkZHJlc3NbMV0gPDwgOAorICAgICAgICAgICAgICAgIHwgdHAtPmdyb3VwX2FkZHJlc3NbMV0gPj4gODsKKworICAgICAgICAvKiBTZXQgZnVuY3Rpb25hbCBhZGRyZXNzLiAqLworICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSB0cC0+ZnVuY3Rpb25hbF9hZGRyZXNzXzAgPDwgOAorICAgICAgICAgICAgICAgIHwgdHAtPmZ1bmN0aW9uYWxfYWRkcmVzc18wID4+IDg7CisgICAgICAgICpwVGltZXJfU3RydWMrKyA9IHRwLT5mdW5jdGlvbmFsX2FkZHJlc3NbMF0gPDwgOAorICAgICAgICAgICAgICAgIHwgdHAtPmZ1bmN0aW9uYWxfYWRkcmVzc1swXSA+PiA4OworICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSB0cC0+ZnVuY3Rpb25hbF9hZGRyZXNzWzFdIDw8IDgKKyAgICAgICAgICAgICAgICB8IHRwLT5mdW5jdGlvbmFsX2FkZHJlc3NbMV0gPj4gODsKKworICAgICAgICAvKiBTZXQgQml0LVdpc2UgZ3JvdXAgYWRkcmVzcy4gKi8KKyAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gdHAtPmJpdHdpc2VfZ3JvdXBfYWRkcmVzc1swXSA8PCA4CisgICAgICAgICAgICAgICAgfCB0cC0+Yml0d2lzZV9ncm91cF9hZGRyZXNzWzBdID4+IDg7CisgICAgICAgICpwVGltZXJfU3RydWMrKyA9IHRwLT5iaXR3aXNlX2dyb3VwX2FkZHJlc3NbMV0gPDwgOAorICAgICAgICAgICAgICAgIHwgdHAtPmJpdHdpc2VfZ3JvdXBfYWRkcmVzc1sxXSA+PiA4OworCisgICAgICAgIC8qIFNldCByaW5nIG51bWJlciBhZGRyZXNzLiAqLworICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSB0cC0+c291cmNlX3JpbmdfbnVtYmVyOworICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSB0cC0+dGFyZ2V0X3JpbmdfbnVtYmVyOworCisgICAgICAgIC8qIFBoeXNpY2FsIGRyb3AgbnVtYmVyLiAqLworICAgICAgICAqcFRpbWVyX1N0cnVjKysgPSAodW5zaWduZWQgc2hvcnQpMDsKKyAgICAgICAgKnBUaW1lcl9TdHJ1YysrID0gKHVuc2lnbmVkIHNob3J0KTA7CisKKyAgICAgICAgLyogUHJvZHVjdCBpbnN0YW5jZSBJRC4gKi8KKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgOTsgaSsrKQorICAgICAgICAgICAgICAgICpwVGltZXJfU3RydWMrKyA9ICh1bnNpZ25lZCBzaG9ydCkwOworCisgICAgICAgIGVyciA9IHNtY3RyX3NldHVwX3NpbmdsZV9jbWRfd19kYXRhKGRldiwgQUNCX0NNRF9JTklUX1RSQ19USU1FUlMsIDApOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9pbml0X3R4cnhfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgaW50IGk7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIHZvaWQgKip0eHJ4X3B0cnMgPSAodm9pZCAqKXRwLT5taXNjX2NvbW1hbmRfZGF0YTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfd2FpdF93aGlsZV9jYnVzeShkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfY21kKGRldikpKQorCXsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBIYXJkd2FyZSBmYWlsdXJlXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEluaXRpYWxpemUgVHJhbnNtaXQgUXVldWUgUG9pbnRlcnMgdGhhdCBhcmUgdXNlZCwgdG8gcG9pbnQgdG8KKyAgICAgICAgICogYSBzaW5nbGUgRkNCLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgTlVNX1RYX1FTX1VTRUQ7IGkrKykKKyAgICAgICAgICAgICAgICAqdHhyeF9wdHJzKysgPSAodm9pZCAqKVRSQ19QT0lOVEVSKHRwLT50eF9mY2JfaGVhZFtpXSk7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBUcmFuc21pdCBRdWV1ZSBQb2ludGVycyB0aGF0IGFyZSBOT1QgdXNlZCB0byBaRVJPLiAqLworICAgICAgICBmb3IoOyBpIDwgTUFYX1RYX1FTOyBpKyspCisgICAgICAgICAgICAgICAgKnR4cnhfcHRycysrID0gKHZvaWQgKikwOworCisgICAgICAgIC8qIEluaXRpYWxpemUgUmVjZWl2ZSBRdWV1ZSBQb2ludGVycyAoTUFDIGFuZCBOb24tTUFDKSB0aGF0IGFyZQorICAgICAgICAgKiB1c2VkLCB0byBwb2ludCB0byBhIHNpbmdsZSBGQ0IgYW5kIGEgQkRCIGNoYWluIG9mIGJ1ZmZlcnMuCisgICAgICAgICAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCBOVU1fUlhfUVNfVVNFRDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgKnR4cnhfcHRycysrID0gKHZvaWQgKilUUkNfUE9JTlRFUih0cC0+cnhfZmNiX2hlYWRbaV0pOworICAgICAgICAgICAgICAgICp0eHJ4X3B0cnMrKyA9ICh2b2lkICopVFJDX1BPSU5URVIodHAtPnJ4X2JkYl9oZWFkW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEluaXRpYWxpemUgUmVjZWl2ZSBRdWV1ZSBQb2ludGVycyB0aGF0IGFyZSBOT1QgdXNlZCB0byBaRVJPLiAqLworICAgICAgICBmb3IoOyBpIDwgTUFYX1JYX1FTOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqdHhyeF9wdHJzKysgPSAodm9pZCAqKTA7CisgICAgICAgICAgICAgICAgKnR4cnhfcHRycysrID0gKHZvaWQgKikwOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gc21jdHJfc2V0dXBfc2luZ2xlX2NtZF93X2RhdGEoZGV2LCBBQ0JfQ01EX0lOSVRfVFhfUlgsIDApOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9pbnNlcnRfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgZXJyID0gc21jdHJfc2V0dXBfc2luZ2xlX2NtZChkZXYsIEFDQl9DTURfSU5TRVJULCBBQ0JfU1VCX0NNRF9OT1ApOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9yZWFkX3Jpbmdfc3RhdHVzX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl93YWl0X3doaWxlX2NidXN5KGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfd2FpdF9jbWQoZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIGVyciA9IHNtY3RyX3NldHVwX3NpbmdsZV9jbWRfd19kYXRhKGRldiwgQUNCX0NNRF9SRUFEX1RSQ19TVEFUVVMsCisgICAgICAgICAgICAgICAgUldfVFJDX1NUQVRVU19CTE9DSyk7CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3JlYWRfd29yZF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgYXdvcmRfY250KQoreworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl93YWl0X3doaWxlX2NidXN5KGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfd2FpdF9jbWQoZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIGVyciA9IHNtY3RyX3NldHVwX3NpbmdsZV9jbWRfd19kYXRhKGRldiwgQUNCX0NNRF9NQ1RfUkVBRF9WQUxVRSwKKyAgICAgICAgICAgICAgICBhd29yZF9jbnQpOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV9yZW1vdmVfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGVycjsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfd2FpdF93aGlsZV9jYnVzeShkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgdHAtPnNjbGJfcHRyLT5yZXN1bWVfY29udHJvbCAgICA9IDA7CisgICAgICAgIHRwLT5zY2xiX3B0ci0+dmFsaWRfY29tbWFuZCAgICAgPSBTQ0xCX1ZBTElEIHwgU0NMQl9DTURfUkVNT1ZFOworCisgICAgICAgIHNtY3RyX3NldF9jdHJsX2F0dGVudGlvbihkZXYpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfcmVzdW1lX2FjYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl93YWl0X3doaWxlX2NidXN5KGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICB0cC0+c2NsYl9wdHItPnJlc3VtZV9jb250cm9sID0gU0NMQl9SQ19BQ0I7CisgICAgICAgIHRwLT5zY2xiX3B0ci0+dmFsaWRfY29tbWFuZCAgPSBTQ0xCX1ZBTElEIHwgU0NMQl9SRVNVTUVfQ09OVFJPTF9WQUxJRDsKKworICAgICAgICB0cC0+YWNiX3BlbmRpbmcgPSAxOworCisgICAgICAgIHNtY3RyX3NldF9jdHJsX2F0dGVudGlvbihkZXYpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfcmVzdW1lX3J4X2JkYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgcXVldWUpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGVycjsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfd2FpdF93aGlsZV9jYnVzeShkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgaWYocXVldWUgPT0gTUFDX1FVRVVFKQorICAgICAgICAgICAgICAgIHRwLT5zY2xiX3B0ci0+cmVzdW1lX2NvbnRyb2wgPSBTQ0xCX1JDX1JYX01BQ19CREI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0cC0+c2NsYl9wdHItPnJlc3VtZV9jb250cm9sID0gU0NMQl9SQ19SWF9OT05fTUFDX0JEQjsKKworICAgICAgICB0cC0+c2NsYl9wdHItPnZhbGlkX2NvbW1hbmQgPSBTQ0xCX1ZBTElEIHwgU0NMQl9SRVNVTUVfQ09OVFJPTF9WQUxJRDsKKworICAgICAgICBzbWN0cl9zZXRfY3RybF9hdHRlbnRpb24oZGV2KTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX2lzc3VlX3Jlc3VtZV9yeF9mY2JfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IHF1ZXVlKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2lzc3VlX3Jlc3VtZV9yeF9mY2JfY21kXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIGlmKHNtY3RyX3dhaXRfd2hpbGVfY2J1c3koZGV2KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKC0xKTsKKworICAgICAgICBpZihxdWV1ZSA9PSBNQUNfUVVFVUUpCisgICAgICAgICAgICAgICAgdHAtPnNjbGJfcHRyLT5yZXN1bWVfY29udHJvbCA9IFNDTEJfUkNfUlhfTUFDX0ZDQjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRwLT5zY2xiX3B0ci0+cmVzdW1lX2NvbnRyb2wgPSBTQ0xCX1JDX1JYX05PTl9NQUNfRkNCOworCisgICAgICAgIHRwLT5zY2xiX3B0ci0+dmFsaWRfY29tbWFuZCA9IFNDTEJfVkFMSUQgfCBTQ0xCX1JFU1VNRV9DT05UUk9MX1ZBTElEOworCisgICAgICAgIHNtY3RyX3NldF9jdHJsX2F0dGVudGlvbihkZXYpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfcmVzdW1lX3R4X2ZjYl9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgcXVldWUpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfaXNzdWVfcmVzdW1lX3R4X2ZjYl9jbWRcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgaWYoc21jdHJfd2FpdF93aGlsZV9jYnVzeShkZXYpKQorICAgICAgICAgICAgICAgIHJldHVybiAoLTEpOworCisgICAgICAgIHRwLT5zY2xiX3B0ci0+cmVzdW1lX2NvbnRyb2wgPSAoU0NMQl9SQ19URkNCMCA8PCBxdWV1ZSk7CisgICAgICAgIHRwLT5zY2xiX3B0ci0+dmFsaWRfY29tbWFuZCA9IFNDTEJfUkVTVU1FX0NPTlRST0xfVkFMSUQgfCBTQ0xCX1ZBTElEOworCisgICAgICAgIHNtY3RyX3NldF9jdHJsX2F0dGVudGlvbihkZXYpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfdGVzdF9pbnRlcm5hbF9yb21fY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgZXJyID0gc21jdHJfc2V0dXBfc2luZ2xlX2NtZChkZXYsIEFDQl9DTURfTUNUX1RFU1QsCisgICAgICAgICAgICAgICAgVFJDX0lOVEVSTkFMX1JPTV9URVNUKTsKKworICAgICAgICByZXR1cm4gKGVycik7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfdGVzdF9oaWNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgZXJyID0gc21jdHJfc2V0dXBfc2luZ2xlX2NtZChkZXYsIEFDQl9DTURfSElDX1RFU1QsCisgICAgICAgICAgICAgICAgVFJDX0hPU1RfSU5URVJGQUNFX1JFR19URVNUKTsKKworICAgICAgICByZXR1cm4gKGVycik7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfdGVzdF9tYWNfcmVnX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGVyciA9IHNtY3RyX3NldHVwX3NpbmdsZV9jbWQoZGV2LCBBQ0JfQ01EX01DVF9URVNULAorICAgICAgICAgICAgICAgIFRSQ19NQUNfUkVHSVNURVJTX1RFU1QpOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV90cmNfbG9vcGJhY2tfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgZXJyID0gc21jdHJfc2V0dXBfc2luZ2xlX2NtZChkZXYsIEFDQl9DTURfTUNUX1RFU1QsCisgICAgICAgICAgICAgICAgVFJDX0lOVEVSTkFMX0xPT1BCQUNLKTsKKworICAgICAgICByZXR1cm4gKGVycik7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfaXNzdWVfdHJpX2xvb3BiYWNrX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGVyciA9IHNtY3RyX3NldHVwX3NpbmdsZV9jbWQoZGV2LCBBQ0JfQ01EX01DVF9URVNULAorICAgICAgICAgICAgICAgIFRSQ19UUklfTE9PUEJBQ0spOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV93cml0ZV9ieXRlX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBzaG9ydCBhd29yZF9jbnQsIHZvaWQgKmJ5dGUpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBpbnQgaXdvcmQsIGlieXRlOworCWludCBlcnI7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfd2hpbGVfY2J1c3koZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl93YWl0X2NtZChkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgZm9yKGl3b3JkID0gMCwgaWJ5dGUgPSAwOyBpd29yZCA8ICh1bnNpZ25lZCBpbnQpKGF3b3JkX2NudCAmIDB4ZmYpOworICAgICAgICAJaXdvcmQrKywgaWJ5dGUgKz0gMikKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHRwLT5taXNjX2NvbW1hbmRfZGF0YVtpd29yZF0gPSAoKigoX191OCAqKWJ5dGUgKyBpYnl0ZSkgPDwgOCkKKwkJCXwgKCooKF9fdTggKilieXRlICsgaWJ5dGUgKyAxKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHNtY3RyX3NldHVwX3NpbmdsZV9jbWRfd19kYXRhKGRldiwgQUNCX0NNRF9NQ1RfV1JJVEVfVkFMVUUsIAorCQlhd29yZF9jbnQpKTsKK30KKworc3RhdGljIGludCBzbWN0cl9pc3N1ZV93cml0ZV93b3JkX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBzaG9ydCBhd29yZF9jbnQsIHZvaWQgKndvcmQpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgaW50IGksIGVycjsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfd2FpdF93aGlsZV9jYnVzeShkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfY21kKGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCAodW5zaWduZWQgaW50KShhd29yZF9jbnQgJiAweGZmKTsgaSsrKQorICAgICAgICAgICAgICAgIHRwLT5taXNjX2NvbW1hbmRfZGF0YVtpXSA9ICooKF9fdTE2ICopd29yZCArIGkpOworCisgICAgICAgIGVyciA9IHNtY3RyX3NldHVwX3NpbmdsZV9jbWRfd19kYXRhKGRldiwgQUNCX0NNRF9NQ1RfV1JJVEVfVkFMVUUsCisgICAgICAgICAgICAgICAgYXdvcmRfY250KTsKKworICAgICAgICByZXR1cm4gKGVycik7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfam9pbl9jb21wbGV0ZV9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGVyciA9IHNtY3RyX3NldHVwX3NpbmdsZV9jbWQoZGV2LCBBQ0JfQ01EX0NIQU5HRV9KT0lOX1NUQVRFLAorICAgICAgICAgICAgICAgIEpTX0pPSU5fQ09NUExFVEVfU1RBVEUpOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9saW5rX3R4X2ZjYnNfdG9fYmRicyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCBpLCBqOworICAgICAgICBGQ0Jsb2NrICpmY2I7CisgICAgICAgIEJEQmxvY2sgKmJkYjsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCBOVU1fVFhfUVNfVVNFRDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgZmNiID0gdHAtPnR4X2ZjYl9oZWFkW2ldOworICAgICAgICAgICAgICAgIGJkYiA9IHRwLT50eF9iZGJfaGVhZFtpXTsKKworICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IHRwLT5udW1fdHhfZmNic1tpXTsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjYi0+YmRiX3B0ciAgICAgICAgICAgID0gYmRiOworICAgICAgICAgICAgICAgICAgICAgICAgZmNiLT50cmNfYmRiX3B0ciAgICAgICAgPSBUUkNfUE9JTlRFUihiZGIpOworICAgICAgICAgICAgICAgICAgICAgICAgZmNiID0gKEZDQmxvY2sgKikoKGNoYXIgKilmY2IgKyBzaXplb2YoRkNCbG9jaykpOworICAgICAgICAgICAgICAgICAgICAgICAgYmRiID0gKEJEQmxvY2sgKikoKGNoYXIgKiliZGIgKyBzaXplb2YoQkRCbG9jaykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfbG9hZF9maXJtd2FyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIF9fdTE2IGksIGNoZWNrc3VtID0gMDsKKyAgICAgICAgaW50IGVyciA9IDA7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2xvYWRfZmlybXdhcmVcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgdHAtPnB0cl91Y29kZSAgICAgICAgICAgPSBzbWN0cl9jb2RlOworICAgICAgICB0cC0+bnVtX29mX3R4X2J1ZmZzICAgICA9IDQ7CisgICAgICAgIHRwLT5tb2RlX2JpdHMgICAgICAgICAgfD0gVU1BQzsKKyAgICAgICAgdHAtPnJlY2VpdmVfbWFzayAgICAgICAgPSAwOworICAgICAgICB0cC0+bWF4X3BhY2tldF9zaXplICAgICA9IDQxNzc7CisKKyAgICAgICAgLyogQ2FuIG9ubHkgdXBsb2FkIHRoZSBmaXJtd2FyZSBvbmNlIHBlciBhZGFwdGVyIHJlc2V0LiAqLworICAgICAgICBpZih0cC0+bWljcm9jb2RlX3ZlcnNpb24gIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKFVDT0RFX1BSRVNFTlQpOworCisgICAgICAgIC8qIFZlcmlmeSB0aGUgZmlybXdhcmUgZXhpc3RzIGFuZCBpcyB0aGVyZSBpbiB0aGUgcmlnaHQgYW1vdW50LiAqLworICAgICAgICBpZigodHAtPnB0cl91Y29kZSA9PSAwTCkKKyAgICAgICAgICAgICAgICB8fCAoKih0cC0+cHRyX3Vjb2RlICsgVUNPREVfVkVSU0lPTl9PRkZTRVQpIDwgVUNPREVfVkVSU0lPTikpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKFVDT0RFX05PVF9QUkVTRU5UKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFVDT0RFX1NJWkUgaXMgbm90IGluY2x1ZGVkIGluIENoZWNrc3VtLiAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCAqKChfX3UxNiAqKSh0cC0+cHRyX3Vjb2RlICsgVUNPREVfU0laRV9PRkZTRVQpKTsgaSArPSAyKQorICAgICAgICAgICAgICAgIGNoZWNrc3VtICs9ICooKF9fdTE2ICopKHRwLT5wdHJfdWNvZGUgKyAyICsgaSkpOworICAgICAgICBpZihjaGVja3N1bSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKFVDT0RFX05PVF9QUkVTRU5UKTsKKworICAgICAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYSB2YWxpZCBmaXJtd2FyZSBpbWFnZSwgbGV0cyBraWNrIGl0IG9uIHVwLiAqLworICAgICAgICBzbWN0cl9lbmFibGVfYWRhcHRlcl9yYW0oZGV2KTsKKyAgICAgICAgc21jdHJfZW5hYmxlXzE2Yml0KGRldik7CisgICAgICAgIHNtY3RyX3NldF9wYWdlKGRldiwgKF9fdTggKil0cC0+cmFtX2FjY2Vzcyk7CisKKyAgICAgICAgaWYoKHNtY3RyX2NoZWNrc3VtX2Zpcm13YXJlKGRldikpCisgICAgICAgICAgICAgICAgfHwgKCoodHAtPnB0cl91Y29kZSArIFVDT0RFX1ZFUlNJT05fT0ZGU0VUKQorICAgICAgICAgICAgICAgID4gdHAtPm1pY3JvY29kZV92ZXJzaW9uKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHNtY3RyX2VuYWJsZV9hZGFwdGVyX2N0cmxfc3RvcmUoZGV2KTsKKworICAgICAgICAgICAgICAgIC8qIFplcm8gb3V0IHJhbSBzcGFjZSBmb3IgZmlybXdhcmUuICovCisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgQ1NfUkFNX1NJWkU7IGkgKz0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICooKF9fdTE2ICopKHRwLT5yYW1fYWNjZXNzICsgaSkpID0gMDsKKworICAgICAgICAgICAgICAgIHNtY3RyX2RlY29kZV9maXJtd2FyZShkZXYpOworCisgICAgICAgICAgICAgICAgdHAtPm1pY3JvY29kZV92ZXJzaW9uID0gKih0cC0+cHRyX3Vjb2RlICsgVUNPREVfVkVSU0lPTl9PRkZTRVQpOyAgICAgICAgICAgICAgICAqKChfX3UxNiAqKSh0cC0+cmFtX2FjY2VzcyArIENTX1JBTV9WRVJTSU9OX09GRlNFVCkpCisgICAgICAgICAgICAgICAgICAgICAgICA9ICh0cC0+bWljcm9jb2RlX3ZlcnNpb24gPDwgOCk7CisgICAgICAgICAgICAgICAgKigoX191MTYgKikodHAtPnJhbV9hY2Nlc3MgKyBDU19SQU1fQ0hFQ0tTVU1fT0ZGU0VUKSkKKyAgICAgICAgICAgICAgICAgICAgICAgID0gfih0cC0+bWljcm9jb2RlX3ZlcnNpb24gPDwgOCkgKyAxOworCisgICAgICAgICAgICAgICAgc21jdHJfZGlzYWJsZV9hZGFwdGVyX2N0cmxfc3RvcmUoZGV2KTsKKworICAgICAgICAgICAgICAgIGlmKHNtY3RyX2NoZWNrc3VtX2Zpcm13YXJlKGRldikpCisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBIQVJEV0FSRV9GQUlMRUQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVyciA9IFVDT0RFX1BSRVNFTlQ7CisKKyAgICAgICAgc21jdHJfZGlzYWJsZV8xNmJpdChkZXYpOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9sb2FkX25vZGVfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgICBfX3U4IHI7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgciA9IGluYihpb2FkZHIgKyBMQVIwICsgaSk7CisgICAgICAgICAgICAgICAgZGV2LT5kZXZfYWRkcltpXSA9IChjaGFyKXI7CisgICAgICAgIH0KKyAgICAgICAgZGV2LT5hZGRyX2xlbiA9IDY7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworLyogTG9iZSBNZWRpYSBUZXN0LgorICogRHVyaW5nIHRoZSB0cmFuc21pc3Npb24gb2YgdGhlIGluaXRpYWwgMTUwMCBsb2JlIG1lZGlhIE1BQyBmcmFtZXMsCisgKiB0aGUgcGhhc2UgbG9jayBsb29wIGluIHRoZSA4MDUgY2hpcCBtYXkgbG9jaywgYW5kIHRoZW4gdW4tbG9jaywgY2F1c2luZworICogdGhlIDgyNSB0byBnbyBpbnRvIGEgUFVSR0Ugc3RhdGUuIFdoZW4gcGVyZm9ybWluZyBhIFBVUkdFLCB0aGUgTUNUCisgKiBtaWNyb2NvZGUgd2lsbCBub3QgdHJhbnNtaXQgYW55IGZyYW1lcyBnaXZlbiB0byBpdCBieSB0aGUgaG9zdCwgYW5kCisgKiB3aWxsIGNvbnNlcXVlbnRseSBjYXVzZSBhIHRpbWVvdXQuCisgKgorICogTk9URSAxOiBJZiB0aGUgbW9uaXRvcl9zdGF0ZSBpcyBNU19CRUFDT05fVEVTVF9TVEFURSwgYWxsIHRyYW5zbWl0CisgKiBxdWV1ZXMgb3RoZXIgdGhlbiB0aGUgb25lIHVzZWQgZm9yIHRoZSBsb2JlX21lZGlhX3Rlc3Qgc2hvdWxkIGJlCisgKiBkaXNhYmxlZC4hPworICoKKyAqIE5PVEUgMjogSWYgdGhlIG1vbml0b3Jfc3RhdGUgaXMgTVNfQkVBQ09OX1RFU1RfU1RBVEUgYW5kIHRoZSByZWNlaXZlX21hc2sKKyAqIGhhcyBhbnkgbXVsdGktY2FzdCBvciBwcm9taXNjb3VzIGJpdHMgc2V0LCB0aGUgcmVjZWl2ZV9tYXNrIG5lZWRzIHRvCisgKiBiZSBjaGFuZ2VkIHRvIGNsZWFyIHRoZSBtdWx0aS1jYXN0IG9yIHByb21pc2NvdXMgbW9kZSBiaXRzLCB0aGUgbG9iZV90ZXN0CisgKiBydW4sIGFuZCB0aGVuIHRoZSByZWNlaXZlIG1hc2sgc2V0IGJhY2sgdG8gaXRzIG9yaWdpbmFsIHZhbHVlIGlmIHRoZSB0ZXN0CisgKiBpcyBzdWNjZXNzZnVsLgorICovCitzdGF0aWMgaW50IHNtY3RyX2xvYmVfbWVkaWFfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCBpLCBwZXJyb3IgPSAwOworICAgICAgICB1bnNpZ25lZCBzaG9ydCBzYXZlZF9yY3ZfbWFzazsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfbG9iZV9tZWRpYV90ZXN0XG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIC8qIENsZWFyIHJlY2VpdmUgbWFzayBmb3IgbG9iZSB0ZXN0LiAqLworICAgICAgICBzYXZlZF9yY3ZfbWFzayAgICAgICAgICA9IHRwLT5yZWNlaXZlX21hc2s7CisgICAgICAgIHRwLT5yZWNlaXZlX21hc2sgICAgICAgID0gMDsKKworICAgICAgICBzbWN0cl9jaGdfcnhfbWFzayhkZXYpOworCisgICAgICAgIC8qIFNldHVwIHRoZSBsb2JlIG1lZGlhIHRlc3QuICovCisgICAgICAgIHNtY3RyX2xvYmVfbWVkaWFfdGVzdF9jbWQoZGV2KTsKKyAgICAgICAgaWYoc21jdHJfd2FpdF9jbWQoZGV2KSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHNtY3RyX3Jlc2V0X2FkYXB0ZXIoZGV2KTsKKyAgICAgICAgICAgICAgICB0cC0+c3RhdHVzID0gQ0xPU0VEOworICAgICAgICAgICAgICAgIHJldHVybiAoTE9CRV9NRURJQV9URVNUX0ZBSUxFRCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBUeCBsb2JlIG1lZGlhIHRlc3QgZnJhbWVzLiAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCAxNTAwOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihzbWN0cl9zZW5kX2xvYmVfbWVkaWFfdGVzdChkZXYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBlcnJvcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfcmVzZXRfYWRhcHRlcihkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+c3RhdGUgPSBDTE9TRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTE9CRV9NRURJQV9URVNUX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnJvciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNtY3RyX2xvYmVfbWVkaWFfdGVzdF9jbWQoZGV2KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX3Jlc2V0X2FkYXB0ZXIoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+c3RhdGUgPSBDTE9TRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChMT0JFX01FRElBX1RFU1RfRkFJTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKHNtY3RyX3NlbmRfZGF0KGRldikpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihzbWN0cl9zZW5kX2RhdChkZXYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtY3RyX3Jlc2V0X2FkYXB0ZXIoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5zdGF0ZSA9IENMT1NFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTE9CRV9NRURJQV9URVNUX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgaWYgYW55IGZyYW1lcyByZWNlaXZlZCBkdXJpbmcgdGVzdC4gKi8KKyAgICAgICAgaWYoKHRwLT5yeF9mY2JfY3VycltNQUNfUVVFVUVdLT5mcmFtZV9zdGF0dXMpCisgICAgICAgICAgICAgICAgfHwgKHRwLT5yeF9mY2JfY3VycltOT05fTUFDX1FVRVVFXS0+ZnJhbWVfc3RhdHVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHNtY3RyX3Jlc2V0X2FkYXB0ZXIoZGV2KTsKKyAgICAgICAgICAgICAgICB0cC0+c3RhdGUgPSBDTE9TRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIChMT0JFX01FRElBX1RFU1RfRkFJTEVEKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNldCByZWNlaXZlIG1hc2sgdG8gIlByb21pc2MiIG1vZGUuICovCisgICAgICAgIHRwLT5yZWNlaXZlX21hc2sgPSBzYXZlZF9yY3ZfbWFzazsKKworICAgICAgICBzbWN0cl9jaGdfcnhfbWFzayhkZXYpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfbG9iZV9tZWRpYV90ZXN0X2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX2xvYmVfbWVkaWFfdGVzdF9jbWRcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgLyogQ2hhbmdlIHRvIGxvYmUgbWVkaWEgdGVzdCBzdGF0ZS4gKi8KKyAgICAgICAgaWYodHAtPm1vbml0b3Jfc3RhdGUgIT0gTVNfQkVBQ09OX1RFU1RfU1RBVEUpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbWN0cl9sb2JlX21lZGlhX3Rlc3Rfc3RhdGUoZGV2KTsKKyAgICAgICAgICAgICAgICBpZihzbWN0cl93YWl0X2NtZChkZXYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiTG9iZSBGYWlsZWQgdGVzdCBzdGF0ZVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKExPQkVfTUVESUFfVEVTVF9GQUlMRUQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IHNtY3RyX3NldHVwX3NpbmdsZV9jbWQoZGV2LCBBQ0JfQ01EX01DVF9URVNULAorICAgICAgICAgICAgICAgIFRSQ19MT0JFX01FRElBX1RFU1QpOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9sb2JlX21lZGlhX3Rlc3Rfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgaW50IGVycjsKKworICAgICAgICBlcnIgPSBzbWN0cl9zZXR1cF9zaW5nbGVfY21kKGRldiwgQUNCX0NNRF9DSEFOR0VfSk9JTl9TVEFURSwKKyAgICAgICAgICAgICAgICBKU19MT0JFX1RFU1RfU1RBVEUpOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9tYWtlXzgwMjVfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19IRUFERVIgKnJtZiwgTUFDX0hFQURFUiAqdG1mLCBfX3UxNiBhY19mYykKK3sKKyAgICAgICAgdG1mLT5hYyA9IE1TQihhY19mYyk7ICAgICAgICAgICAgICAgICAvKiBtc2IgaXMgYWNjZXNzIGNvbnRyb2wgKi8KKyAgICAgICAgdG1mLT5mYyA9IExTQihhY19mYyk7ICAgICAgICAgICAgICAgICAvKiBsc2IgaXMgZnJhbWUgY29udHJvbCAqLworCisgICAgICAgIHRtZi0+c2FbMF0gPSBkZXYtPmRldl9hZGRyWzBdOworICAgICAgICB0bWYtPnNhWzFdID0gZGV2LT5kZXZfYWRkclsxXTsKKyAgICAgICAgdG1mLT5zYVsyXSA9IGRldi0+ZGV2X2FkZHJbMl07CisgICAgICAgIHRtZi0+c2FbM10gPSBkZXYtPmRldl9hZGRyWzNdOworICAgICAgICB0bWYtPnNhWzRdID0gZGV2LT5kZXZfYWRkcls0XTsKKyAgICAgICAgdG1mLT5zYVs1XSA9IGRldi0+ZGV2X2FkZHJbNV07CisKKyAgICAgICAgc3dpdGNoKHRtZi0+dmMpCisgICAgICAgIHsKKwkJLyogU2VuZCBSUV9JTklUIHRvIFJQUyAqLworICAgICAgICAgICAgICAgIGNhc2UgUlFfSU5JVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtZi0+ZGFbMF0gPSAweGMwOworICAgICAgICAgICAgICAgICAgICAgICAgdG1mLT5kYVsxXSA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0bWYtPmRhWzJdID0gMHgwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtZi0+ZGFbM10gPSAweDAwOworICAgICAgICAgICAgICAgICAgICAgICAgdG1mLT5kYVs0XSA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0bWYtPmRhWzVdID0gMHgwMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisJCS8qIFNlbmQgUlBUX1RYX0ZPUldBUkQgdG8gQ1JTICovCisgICAgICAgICAgICAgICAgY2FzZSBSUFRfVFhfRk9SV0FSRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtZi0+ZGFbMF0gPSAweGMwOworICAgICAgICAgICAgICAgICAgICAgICAgdG1mLT5kYVsxXSA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0bWYtPmRhWzJdID0gMHgwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtZi0+ZGFbM10gPSAweDAwOworICAgICAgICAgICAgICAgICAgICAgICAgdG1mLT5kYVs0XSA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0bWYtPmRhWzVdID0gMHgxMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisJCS8qIEV2ZXJ5dGhpbmcgZWxzZSBnb2VzIHRvIHNlbmRlciAqLworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB0bWYtPmRhWzBdID0gcm1mLT5zYVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtZi0+ZGFbMV0gPSBybWYtPnNhWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgdG1mLT5kYVsyXSA9IHJtZi0+c2FbMl07CisgICAgICAgICAgICAgICAgICAgICAgICB0bWYtPmRhWzNdID0gcm1mLT5zYVszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtZi0+ZGFbNF0gPSBybWYtPnNhWzRdOworICAgICAgICAgICAgICAgICAgICAgICAgdG1mLT5kYVs1XSA9IHJtZi0+c2FbNV07CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9hY2Nlc3NfcHJpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19TVUJfVkVDVE9SICp0c3YpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICB0c3YtPnN2aSA9IEFVVEhPUklaRURfQUNDRVNTX1BSSU9SSVRZOworICAgICAgICB0c3YtPnN2bCA9IFNfQVVUSE9SSVpFRF9BQ0NFU1NfUFJJT1JJVFk7CisKKyAgICAgICAgdHN2LT5zdnZbMF0gPSBNU0IodHAtPmF1dGhvcml6ZWRfYWNjZXNzX3ByaW9yaXR5KTsKKyAgICAgICAgdHN2LT5zdnZbMV0gPSBMU0IodHAtPmF1dGhvcml6ZWRfYWNjZXNzX3ByaW9yaXR5KTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9hZGRyX21vZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfU1VCX1ZFQ1RPUiAqdHN2KQoreworICAgICAgICB0c3YtPnN2aSA9IEFERFJFU1NfTU9ESUZFUjsKKyAgICAgICAgdHN2LT5zdmwgPSBTX0FERFJFU1NfTU9ESUZFUjsKKworICAgICAgICB0c3YtPnN2dlswXSA9IDA7CisgICAgICAgIHRzdi0+c3Z2WzFdID0gMDsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX21ha2VfYXV0aF9mdW5jdF9jbGFzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgdHN2LT5zdmkgPSBBVVRIT1JJWkVEX0ZVTkNUSU9OX0NMQVNTOworICAgICAgICB0c3YtPnN2bCA9IFNfQVVUSE9SSVpFRF9GVU5DVElPTl9DTEFTUzsKKworICAgICAgICB0c3YtPnN2dlswXSA9IE1TQih0cC0+YXV0aG9yaXplZF9mdW5jdGlvbl9jbGFzc2VzKTsKKyAgICAgICAgdHN2LT5zdnZbMV0gPSBMU0IodHAtPmF1dGhvcml6ZWRfZnVuY3Rpb25fY2xhc3Nlcyk7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9tYWtlX2NvcnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdiwgX191MTYgY29ycmVsYXRvcikKK3sKKyAgICAgICAgdHN2LT5zdmkgPSBDT1JSRUxBVE9SOworICAgICAgICB0c3YtPnN2bCA9IFNfQ09SUkVMQVRPUjsKKworICAgICAgICB0c3YtPnN2dlswXSA9IE1TQihjb3JyZWxhdG9yKTsKKyAgICAgICAgdHN2LT5zdnZbMV0gPSBMU0IoY29ycmVsYXRvcik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9tYWtlX2Z1bmN0X2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX1NVQl9WRUNUT1IgKnRzdikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIHNtY3RyX2dldF9mdW5jdGlvbmFsX2FkZHJlc3MoZGV2KTsKKworICAgICAgICB0c3YtPnN2aSA9IEZVTkNUSU9OQUxfQUREUkVTUzsKKyAgICAgICAgdHN2LT5zdmwgPSBTX0ZVTkNUSU9OQUxfQUREUkVTUzsKKworICAgICAgICB0c3YtPnN2dlswXSA9IE1TQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMF0pOworICAgICAgICB0c3YtPnN2dlsxXSA9IExTQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMF0pOworCisgICAgICAgIHRzdi0+c3Z2WzJdID0gTVNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVsxXSk7CisgICAgICAgIHRzdi0+c3Z2WzNdID0gTFNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVsxXSk7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9tYWtlX2dyb3VwX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX1NVQl9WRUNUT1IgKnRzdikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIHNtY3RyX2dldF9ncm91cF9hZGRyZXNzKGRldik7CisKKyAgICAgICAgdHN2LT5zdmkgPSBHUk9VUF9BRERSRVNTOworICAgICAgICB0c3YtPnN2bCA9IFNfR1JPVVBfQUREUkVTUzsKKworICAgICAgICB0c3YtPnN2dlswXSA9IE1TQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMF0pOworICAgICAgICB0c3YtPnN2dlsxXSA9IExTQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMF0pOworCisgICAgICAgIHRzdi0+c3Z2WzJdID0gTVNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVsxXSk7CisgICAgICAgIHRzdi0+c3Z2WzNdID0gTFNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVsxXSk7CisKKyAgICAgICAgLyogU2V0IEdyb3VwIEFkZHJlc3MgU3ViLXZlY3RvciB0byBhbGwgemVyb3MgaWYgb25seSB0aGUKKyAgICAgICAgICogR3JvdXAgQWRkcmVzcy9GdW5jdGlvbmFsIEFkZHJlc3MgSW5kaWNhdG9yIGlzIHNldC4KKyAgICAgICAgICovCisgICAgICAgIGlmKHRzdi0+c3Z2WzBdID09IDB4ODAgJiYgdHN2LT5zdnZbMV0gPT0gMHgwMAorICAgICAgICAJJiYgdHN2LT5zdnZbMl0gPT0gMHgwMCAmJiB0c3YtPnN2dlszXSA9PSAweDAwKQorICAgICAgICAgICAgICAgIHRzdi0+c3Z2WzBdID0gMHgwMDsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX21ha2VfcGh5X2Ryb3BfbnVtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19TVUJfVkVDVE9SICp0c3YpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICBzbWN0cl9nZXRfcGh5c2ljYWxfZHJvcF9udW1iZXIoZGV2KTsKKworICAgICAgICB0c3YtPnN2aSA9IFBIWVNJQ0FMX0RST1A7CisgICAgICAgIHRzdi0+c3ZsID0gU19QSFlTSUNBTF9EUk9QOworCisgICAgICAgIHRzdi0+c3Z2WzBdID0gTVNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVswXSk7CisgICAgICAgIHRzdi0+c3Z2WzFdID0gTFNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVswXSk7CisKKyAgICAgICAgdHN2LT5zdnZbMl0gPSBNU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzFdKTsKKyAgICAgICAgdHN2LT5zdnZbM10gPSBMU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzFdKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX21ha2VfcHJvZHVjdF9pZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfU1VCX1ZFQ1RPUiAqdHN2KQoreworICAgICAgICBpbnQgaTsKKworICAgICAgICB0c3YtPnN2aSA9IFBST0RVQ1RfSU5TVEFOQ0VfSUQ7CisgICAgICAgIHRzdi0+c3ZsID0gU19QUk9EVUNUX0lOU1RBTkNFX0lEOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IDE4OyBpKyspCisgICAgICAgICAgICAgICAgdHN2LT5zdnZbaV0gPSAweEYwOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9zdGF0aW9uX2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19TVUJfVkVDVE9SICp0c3YpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICBzbWN0cl9nZXRfc3RhdGlvbl9pZChkZXYpOworCisgICAgICAgIHRzdi0+c3ZpID0gU1RBVElPTl9JREVOVElGRVI7CisgICAgICAgIHRzdi0+c3ZsID0gU19TVEFUSU9OX0lERU5USUZFUjsKKworICAgICAgICB0c3YtPnN2dlswXSA9IE1TQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMF0pOworICAgICAgICB0c3YtPnN2dlsxXSA9IExTQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMF0pOworCisgICAgICAgIHRzdi0+c3Z2WzJdID0gTVNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVsxXSk7CisgICAgICAgIHRzdi0+c3Z2WzNdID0gTFNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVsxXSk7CisKKyAgICAgICAgdHN2LT5zdnZbNF0gPSBNU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzJdKTsKKyAgICAgICAgdHN2LT5zdnZbNV0gPSBMU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzJdKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX21ha2VfcmluZ19zdGF0aW9uX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqIHRzdikKK3sKKyAgICAgICAgdHN2LT5zdmkgPSBSSU5HX1NUQVRJT05fU1RBVFVTOworICAgICAgICB0c3YtPnN2bCA9IFNfUklOR19TVEFUSU9OX1NUQVRVUzsKKworICAgICAgICB0c3YtPnN2dlswXSA9IDA7CisgICAgICAgIHRzdi0+c3Z2WzFdID0gMDsKKyAgICAgICAgdHN2LT5zdnZbMl0gPSAwOworICAgICAgICB0c3YtPnN2dlszXSA9IDA7CisgICAgICAgIHRzdi0+c3Z2WzRdID0gMDsKKyAgICAgICAgdHN2LT5zdnZbNV0gPSAwOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV9yaW5nX3N0YXRpb25fdmVyc2lvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgdHN2LT5zdmkgPSBSSU5HX1NUQVRJT05fVkVSU0lPTl9OVU1CRVI7CisgICAgICAgIHRzdi0+c3ZsID0gU19SSU5HX1NUQVRJT05fVkVSU0lPTl9OVU1CRVI7CisKKyAgICAgICAgdHN2LT5zdnZbMF0gPSAweGUyOyAgICAgICAgICAgIC8qIEVCQ0RJQyAtIFMgKi8KKyAgICAgICAgdHN2LT5zdnZbMV0gPSAweGQ0OyAgICAgICAgICAgIC8qIEVCQ0RJQyAtIE0gKi8KKyAgICAgICAgdHN2LT5zdnZbMl0gPSAweGMzOyAgICAgICAgICAgIC8qIEVCQ0RJQyAtIEMgKi8KKyAgICAgICAgdHN2LT5zdnZbM10gPSAweDQwOyAgICAgICAgICAgIC8qIEVCQ0RJQyAtICAgKi8KKyAgICAgICAgdHN2LT5zdnZbNF0gPSAweGU1OyAgICAgICAgICAgIC8qIEVCQ0RJQyAtIFYgKi8KKyAgICAgICAgdHN2LT5zdnZbNV0gPSAweEYwICsgKHRwLT5taWNyb2NvZGVfdmVyc2lvbiA+PiA0KTsKKyAgICAgICAgdHN2LT5zdnZbNl0gPSAweEYwICsgKHRwLT5taWNyb2NvZGVfdmVyc2lvbiAmIDB4MGYpOworICAgICAgICB0c3YtPnN2dls3XSA9IDB4NDA7ICAgICAgICAgICAgLyogRUJDRElDIC0gICAqLworICAgICAgICB0c3YtPnN2dls4XSA9IDB4ZTc7ICAgICAgICAgICAgLyogRUJDRElDIC0gWCAqLworCisgICAgICAgIGlmKHRwLT5leHRyYV9pbmZvICYgQ0hJUF9SRVZfTUFTSykKKyAgICAgICAgICAgICAgICB0c3YtPnN2dls5XSA9IDB4YzU7ICAgIC8qIEVCQ0RJQyAtIEUgKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRzdi0+c3Z2WzldID0gMHhjNDsgICAgLyogRUJDRElDIC0gRCAqLworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV90eF9zdGF0dXNfY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2LCBfX3UxNiB0eF9mc3RhdHVzKQoreworICAgICAgICB0c3YtPnN2aSA9IFRSQU5TTUlUX1NUQVRVU19DT0RFOworICAgICAgICB0c3YtPnN2bCA9IFNfVFJBTlNNSVRfU1RBVFVTX0NPREU7CisKKyAgICAgICAgdHN2LT5zdnZbMF0gPSAoKHR4X2ZzdGF0dXMgJiAweDAxMDAgPj4gNikgfHwgSUJNX1BBU1NfU09VUkNFX0FERFIpOworCisgICAgICAgIC8qIFN0cmlwcGVkIGZyYW1lIHN0YXR1cyBvZiBUcmFuc21pdHRlZCBGcmFtZSAqLworICAgICAgICB0c3YtPnN2dlsxXSA9IHR4X2ZzdGF0dXMgJiAweGZmOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfbWFrZV91cHN0cmVhbV9uZWlnaGJvcl9hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19TVUJfVkVDVE9SICp0c3YpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICBzbWN0cl9nZXRfdXBzdHJlYW1fbmVpZ2hib3JfYWRkcihkZXYpOworCisgICAgICAgIHRzdi0+c3ZpID0gVVBTVFJFQU1fTkVJR0hCT1JfQUREUkVTUzsKKyAgICAgICAgdHN2LT5zdmwgPSBTX1VQU1RSRUFNX05FSUdIQk9SX0FERFJFU1M7CisKKyAgICAgICAgdHN2LT5zdnZbMF0gPSBNU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzBdKTsKKyAgICAgICAgdHN2LT5zdnZbMV0gPSBMU0IodHAtPm1pc2NfY29tbWFuZF9kYXRhWzBdKTsKKworICAgICAgICB0c3YtPnN2dlsyXSA9IE1TQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMV0pOworICAgICAgICB0c3YtPnN2dlszXSA9IExTQih0cC0+bWlzY19jb21tYW5kX2RhdGFbMV0pOworCisgICAgICAgIHRzdi0+c3Z2WzRdID0gTVNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVsyXSk7CisgICAgICAgIHRzdi0+c3Z2WzVdID0gTFNCKHRwLT5taXNjX2NvbW1hbmRfZGF0YVsyXSk7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9tYWtlX3dyYXBfZGF0YShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfU1VCX1ZFQ1RPUiAqdHN2KQoreworICAgICAgICB0c3YtPnN2aSA9IFdSQVBfREFUQTsKKyAgICAgICAgdHN2LT5zdmwgPSBTX1dSQVBfREFUQTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCisvKgorICogT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4gVGhpcyBpcyBjYWxsZWQgc29tZXRpbWUgYWZ0ZXIKKyAqIGJvb3Rpbmcgd2hlbiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KKyAqCisgKiBUaGlzIHJvdXRpbmUgc2hvdWxkIHNldCBldmVyeXRoaW5nIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuCisgKiByZWdpc3RlcnMgdGhhdCAic2hvdWxkIiBvbmx5IG5lZWQgdG8gYmUgc2V0IG9uY2UgYXQgYm9vdCwgc28gdGhhdAorICogdGhlcmUgaXMgbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAqLworc3RhdGljIGludCBzbWN0cl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX29wZW5cbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgZXJyID0gc21jdHJfaW5pdF9hZGFwdGVyKGRldik7CisgICAgICAgIGlmKGVyciA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworLyogSW50ZXJydXB0IGRyaXZlbiBvcGVuIG9mIFRva2VuIGNhcmQuICovCitzdGF0aWMgaW50IHNtY3RyX29wZW5fdHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9vcGVuX3RyXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIC8qIE5vdyB3ZSBjYW4gYWN0dWFsbHkgb3BlbiB0aGUgYWRhcHRlci4gKi8KKyAgICAgICAgaWYodHAtPnN0YXR1cyA9PSBPUEVOKQorICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIGlmKHRwLT5zdGF0dXMgIT0gSU5JVElBTElaRUQpCisgICAgICAgICAgICAgICAgcmV0dXJuICgtMSk7CisKKwkvKiBGSVhNRTogaXQgd291bGQgd29yayBhIGxvdCBiZXR0ZXIgaWYgd2UgbWFza2VkIHRoZSBpcnEgc291cmNlcworCSAgIG9uIHRoZSBjYXJkIGhlcmUsIHRoZW4gd2UgY291bGQgc2tpcCB0aGUgbG9ja2luZyBhbmQgcG9sbCBuaWNlbHkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKKwkKKyAgICAgICAgc21jdHJfc2V0X3BhZ2UoZGV2LCAoX191OCAqKXRwLT5yYW1fYWNjZXNzKTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfcmVzdW1lX3J4X2ZjYl9jbWQoZGV2LCAoc2hvcnQpTUFDX1FVRVVFKSkpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX2lzc3VlX3Jlc3VtZV9yeF9iZGJfY21kKGRldiwgKHNob3J0KU1BQ19RVUVVRSkpKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl9pc3N1ZV9yZXN1bWVfcnhfZmNiX2NtZChkZXYsIChzaG9ydClOT05fTUFDX1FVRVVFKSkpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX2lzc3VlX3Jlc3VtZV9yeF9iZGJfY21kKGRldiwgKHNob3J0KU5PTl9NQUNfUVVFVUUpKSkKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKworICAgICAgICB0cC0+c3RhdHVzID0gQ0xPU0VEOworCisgICAgICAgIC8qIEluc2VydCBpbnRvIHRoZSBSaW5nIG9yIEVudGVyIExvb3BiYWNrIE1vZGUuICovCisgICAgICAgIGlmKCh0cC0+bW9kZV9iaXRzICYgTE9PUElOR19NT0RFX01BU0spID09IExPT1BCQUNLX01PREVfMSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHRwLT5zdGF0dXMgPSBDTE9TRUQ7CisKKyAgICAgICAgICAgICAgICBpZighKGVyciA9IHNtY3RyX2lzc3VlX3RyY19sb29wYmFja19jbWQoZGV2KSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShlcnIgPSBzbWN0cl93YWl0X2NtZChkZXYpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnN0YXR1cyA9IE9QRU47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc21jdHJfc3RhdHVzX2NoZyhkZXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCh0cC0+bW9kZV9iaXRzICYgTE9PUElOR19NT0RFX01BU0spID09IExPT1BCQUNLX01PREVfMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+c3RhdHVzID0gQ0xPU0VEOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShlcnIgPSBzbWN0cl9pc3N1ZV90cmlfbG9vcGJhY2tfY21kKGRldikpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighKGVyciA9IHNtY3RyX3dhaXRfY21kKGRldikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5zdGF0dXMgPSBPUEVOOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9zdGF0dXNfY2hnKGRldik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZigodHAtPm1vZGVfYml0cyAmIExPT1BJTkdfTU9ERV9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBMT09QQkFDS19NT0RFXzMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5zdGF0dXMgPSBDTE9TRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoZXJyID0gc21jdHJfbG9iZV9tZWRpYV90ZXN0X2NtZChkZXYpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoZXJyID0gc21jdHJfd2FpdF9jbWQoZGV2KSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+c3RhdHVzID0gT1BFTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9zdGF0dXNfY2hnKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoZXJyID0gc21jdHJfbG9iZV9tZWRpYV90ZXN0KGRldikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHNtY3RyX2lzc3VlX2luc2VydF9jbWQoZGV2KTsKKwkJCQllbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlcnIgPT0gTE9CRV9NRURJQV9URVNUX0ZBSUxFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBMb2JlIE1lZGlhIFRlc3QgRmFpbHVyZSAtIENoZWNrIGNhYmxlP1xuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCitvdXQ6CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCisvKiBDaGVjayBmb3IgYSBuZXR3b3JrIGFkYXB0ZXIgb2YgdGhpcyB0eXBlLCAKKyAqIGFuZCByZXR1cm4gZGV2aWNlIHN0cnVjdHVyZSBpZiBvbmUgZXhpc3RzLgorICovCitzdHJ1Y3QgbmV0X2RldmljZSBfX2luaXQgKnNtY3RyX3Byb2JlKGludCB1bml0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY190cmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBwb3J0c1tdID0geworCQkweDIwMCwgMHgyMjAsIDB4MjQwLCAweDI2MCwgMHgyODAsIDB4MkEwLCAweDJDMCwgMHgyRTAsIDB4MzAwLAorCQkweDMyMCwgMHgzNDAsIDB4MzYwLCAweDM4MCwgMAorCX07CisJY29uc3QgdW5zaWduZWQgKnBvcnQ7CisgICAgICAgIGludCBlcnIgPSAwOworCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaWYgKHVuaXQgPj0gMCkgeworCQlzcHJpbnRmKGRldi0+bmFtZSwgInRyJWQiLCB1bml0KTsKKwkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKwl9CisKKyAgICAgICAgaWYgKGRldi0+YmFzZV9hZGRyID4gMHgxZmYpICAgIC8qIENoZWNrIGEgc2luZ2xlIHNwZWNpZmllZCBsb2NhdGlvbi4gKi8KKwkJZXJyID0gc21jdHJfcHJvYmUxKGRldiwgZGV2LT5iYXNlX2FkZHIpOworICAgICAgICBlbHNlIGlmKGRldi0+YmFzZV9hZGRyICE9IDApICAvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisgICAgICAgICAgICAgICAgZXJyID0tRU5YSU87CisJZWxzZSB7CisJCWZvciAocG9ydCA9IHBvcnRzOyAqcG9ydDsgcG9ydCsrKSB7CisJCQllcnIgPSBzbWN0cl9wcm9iZTEoZGV2LCAqcG9ydCk7CisJCQlpZiAoIWVycikKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisjaWZkZWYgQ09ORklHX01DQV9MRUdBQ1kKKwl7IHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkgIGlmICh0cC0+c2xvdF9udW0pCisJCW1jYV9tYXJrX2FzX3VudXNlZCh0cC0+c2xvdF9udW0pOworCX0KKyNlbmRpZgorCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBTTUNUUl9JT19FWFRFTlQpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBzbWN0cl9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBpbnQgZXJyOworICAgICAgICBfX3UzMiAqcmFtOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnICYmIHZlcnNpb25fcHJpbnRlZCsrID09IDApCisgICAgICAgICAgICAgICAgcHJpbnRrKHZlcnNpb24pOworCisgICAgICAgIHNwaW5fbG9ja19pbml0KCZ0cC0+bG9jayk7CisgICAgICAgIGRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCisJLyogQWN0dWFsbHkgZGV0ZWN0IGFuIGFkYXB0ZXIgbm93LiAqLworICAgICAgICBlcnIgPSBzbWN0cl9jaGtfaXNhKGRldik7CisgICAgICAgIGlmKGVyciA8IDApCisgICAgICAgIHsKKwkJaWYgKChlcnIgPSBzbWN0cl9jaGtfbWNhKGRldikpIDwgMCkgeworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0OworCQl9CisgICAgICAgIH0KKworICAgICAgICB0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGRldi0+bWVtX3N0YXJ0ID0gdHAtPnJhbV9iYXNlOworICAgICAgICBkZXYtPm1lbV9lbmQgPSBkZXYtPm1lbV9zdGFydCArIDB4MTAwMDA7CisgICAgICAgIHJhbSA9IChfX3UzMiAqKXBoeXNfdG9fdmlydChkZXYtPm1lbV9zdGFydCk7CisgICAgICAgIHRwLT5yYW1fYWNjZXNzID0gKihfX3UzMiAqKSZyYW07CisJdHAtPnN0YXR1cyA9IE5PVF9JTklUSUFMSVpFRDsKKworICAgICAgICBlcnIgPSBzbWN0cl9sb2FkX2Zpcm13YXJlKGRldik7CisgICAgICAgIGlmKGVyciAhPSBVQ09ERV9QUkVTRU5UICYmIGVyciAhPSBTVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogRmlybXdhcmUgbG9hZCBmYWlsZWQgKCVkKVxuIiwgZGV2LT5uYW1lLCBlcnIpOworCQllcnIgPSAtRUlPOworCQlnb3RvIG91dDsKKyAgICAgICAgfQorCisJLyogQWxsb3cgdXNlciB0byBzcGVjaWZ5IHJpbmcgc3BlZWQgb24gbW9kdWxlIGluc2VydC4gKi8KKwlpZihyaW5nc3BlZWQgPT0gNCkKKwkJdHAtPm1lZGlhX3R5cGUgPSBNRURJQV9VVFBfNDsKKwllbHNlCisJCXRwLT5tZWRpYV90eXBlID0gTUVESUFfVVRQXzE2OworCisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiAlcyAlcyBhdCBJbyAlIzR4LCBJcnEgJWQsIFJvbSAlIzR4LCBSYW0gJSM0eC5cbiIsCisgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBzbWN0cl9uYW1lLCBzbWN0cl9tb2RlbCwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWRldi0+YmFzZV9hZGRyLAorICAgICAgICAgICAgICAgIGRldi0+aXJxLCB0cC0+cm9tX2Jhc2UsIHRwLT5yYW1fYmFzZSk7CisKKyAgICAgICAgZGV2LT5vcGVuICAgICAgICAgICAgICAgPSBzbWN0cl9vcGVuOworICAgICAgICBkZXYtPnN0b3AgICAgICAgICAgICAgICA9IHNtY3RyX2Nsb3NlOworICAgICAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCAgICA9IHNtY3RyX3NlbmRfcGFja2V0OworICAgICAgICBkZXYtPnR4X3RpbWVvdXQJCT0gc21jdHJfdGltZW91dDsKKyAgICAgICAgZGV2LT53YXRjaGRvZ190aW1lbwk9IEhaOworICAgICAgICBkZXYtPmdldF9zdGF0cyAgICAgICAgICA9IHNtY3RyX2dldF9zdGF0czsKKyAgICAgICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc21jdHJfc2V0X211bHRpY2FzdF9saXN0OworICAgICAgICByZXR1cm4gKDApOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzbWN0cl9wcm9jZXNzX3J4X3BhY2tldChNQUNfSEVBREVSICpybWYsIF9fdTE2IHNpemUsCisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IHJ4X3N0YXR1cykKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworICAgICAgICBfX3UxNiByY29kZSwgY29ycmVsYXRvcjsKKyAgICAgICAgaW50IGVyciA9IDA7CisgICAgICAgIF9fdTggeGZyYW1lID0gMTsKKyAgICAgICAgX191MTYgdHhfZnN0YXR1czsKKworICAgICAgICBybWYtPnZsID0gU1dBUF9CWVRFUyhybWYtPnZsKTsKKyAgICAgICAgaWYocnhfc3RhdHVzICYgRkNCX1JYX1NUQVRVU19EQV9NQVRDSEVEKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoKHJtZi0+dmMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVjZWl2ZWQgTUFDIEZyYW1lcyBQcm9jZXNzZWQgYnkgUlMuICovCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElOSVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChyY29kZSA9IHNtY3RyX3Jjdl9pbml0KGRldiwgcm1mLCAmY29ycmVsYXRvcikpID09IEhBUkRXQVJFX0ZBSUxFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmNvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX3NlbmRfcnNwKGRldiwgcm1mLCByY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdG9yKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ0hHX1BBUk06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChyY29kZSA9IHNtY3RyX3Jjdl9jaGdfcGFyYW0oZGV2LCBybWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcnJlbGF0b3IpKSA9PUhBUkRXQVJFX0ZBSUxFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmNvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX3NlbmRfcnNwKGRldiwgcm1mLCByY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdG9yKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlFfQUREUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHJjb2RlID0gc21jdHJfcmN2X3JxX2FkZHJfc3RhdGVfYXR0Y2goZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtZiwgJmNvcnJlbGF0b3IpKSAhPSBQT1NJVElWRV9BQ0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyY29kZSA9PSBIQVJEV0FSRV9GQUlMRUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJjb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHNtY3RyX3NlbmRfcnNwKGRldiwgcm1mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY29kZSwgY29ycmVsYXRvcikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX3NlbmRfcnB0X2FkZHIoZGV2LCBybWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRvcikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJRX0FUVENIOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigocmNvZGUgPSBzbWN0cl9yY3ZfcnFfYWRkcl9zdGF0ZV9hdHRjaChkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1mLCAmY29ycmVsYXRvcikpICE9IFBPU0lUSVZFX0FDSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJjb2RlID09IEhBUkRXQVJFX0ZBSUxFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmNvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc21jdHJfc2VuZF9yc3AoZGV2LCBybWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdG9yKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfc2VuZF9ycHRfYXR0Y2goZGV2LCBybWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRvcikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJRX1NUQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigocmNvZGUgPSBzbWN0cl9yY3ZfcnFfYWRkcl9zdGF0ZV9hdHRjaChkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1mLCAmY29ycmVsYXRvcikpICE9IFBPU0lUSVZFX0FDSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJjb2RlID09IEhBUkRXQVJFX0ZBSUxFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmNvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc21jdHJfc2VuZF9yc3AoZGV2LCBybWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdG9yKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfc2VuZF9ycHRfc3RhdGUoZGV2LCBybWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRvcikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRYX0ZPUldBUkQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChyY29kZSA9IHNtY3RyX3Jjdl90eF9mb3J3YXJkKGRldiwgcm1mKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBQT1NJVElWRV9BQ0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyY29kZSA9PSBIQVJEV0FSRV9GQUlMRUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJjb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHNtY3RyX3NlbmRfcnNwKGRldiwgcm1mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRvcikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX3NlbmRfdHhfZm9yd2FyZChkZXYsIHJtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHhfZnN0YXR1cykpID09IEhBUkRXQVJFX0ZBSUxFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVyciA9PSBBX0ZSQU1FX1dBU19GT1JXQVJERUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfc2VuZF9ycHRfdHhfZm9yd2FyZChkZXYsCisJCQkJCQlybWYsIHR4X2ZzdGF0dXMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gSEFSRFdBUkVfRkFJTEVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlY2VpdmVkIE1BQyBGcmFtZXMgUHJvY2Vzc2VkIGJ5IENSUy9SRU0vUlBTLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSU1A6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJRX0lOSVQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJQVF9ORVdfTU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUFRfU1VBX0NIRzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlBUX0FDVElWRV9FUlI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJQVF9OTl9JTkNNUDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlBUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUFRfQVRUQ0g6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJQVF9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlBUX0FERFI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBSY3ZkIEF0dC4gTUFDIEZyYW1lIChpZiBSWEFUTUFDIHNldCkgb3IgVU5LTk9XTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGZyYW1lID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoISh0cC0+cmVjZWl2ZV9tYXNrICYgQUNDRVBUX0FUVF9NQUNfRlJBTUVTKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gc21jdHJfcmN2X3Vua25vd24oZGV2LCBybWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ycmVsYXRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX3NlbmRfcnNwKGRldiwgcm1mLHJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRvcikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogMS4gREEgZG9lc24ndCBtYXRjaCAoUHJvbWlzY3VvdXMgTW9kZSkuCisgICAgICAgICAgICAgICAgICogMi4gUGFyc2UgZm9yIEV4dGVuZGVkIE1BQyBGcmFtZSBUeXBlLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHN3aXRjaChybWYtPnZjKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlNQOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJTklUOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUV9JTklUOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUV9BRERSOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUV9BVFRDSDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlFfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENIR19QQVJNOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUFRfQUREUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlBUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUFRfQVRUQ0g6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJQVF9TVEFURToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUlBUX05FV19NT046CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJQVF9TVUFfQ0hHOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSUFRfTk5fSU5DTVA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJQVF9BQ1RJVkVfRVJSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGZyYW1lID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogTk9URTogVU5LTk9XTiBNQUMgZnJhbWVzIHdpbGwgTk9UIGJlIHBhc3NlZCB1cCB1bmxlc3MKKyAgICAgICAgICogQUNDRVBUX0FUVF9NQUNfRlJBTUVTIGlzIHNldC4KKyAgICAgICAgICovCisgICAgICAgIGlmKCgodHAtPnJlY2VpdmVfbWFzayAmIEFDQ0VQVF9BVFRfTUFDX0ZSQU1FUykKKyAgICAgICAgICAgICAgICAmJiAoeGZyYW1lID09IChfX3U4KTApKQorICAgICAgICAgICAgICAgIHx8ICgodHAtPnJlY2VpdmVfbWFzayAmIEFDQ0VQVF9FWFRfTUFDX0ZSQU1FUykKKyAgICAgICAgICAgICAgICAmJiAoeGZyYW1lID09IChfX3U4KTEpKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJtZi0+dmwgPSBTV0FQX0JZVEVTKHJtZi0+dmwpOworCisgICAgICAgICAgICAgICAgaWYgKCEoc2tiID0gZGV2X2FsbG9jX3NrYihzaXplKSkpCisJCQlyZXR1cm4gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBza2ItPmxlbiA9IHNpemU7CisKKyAgICAgICAgICAgICAgICAvKiBTbGlkZSBkYXRhIGludG8gYSBzbGVlayBza2IuICovCisgICAgICAgICAgICAgICAgc2tiX3B1dChza2IsIHNrYi0+bGVuKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoc2tiLT5kYXRhLCBybWYsIHNrYi0+bGVuKTsKKworICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBDb3VudGVycyAqLworICAgICAgICAgICAgICAgIHRwLT5NYWNTdGF0LnJ4X3BhY2tldHMrKzsKKyAgICAgICAgICAgICAgICB0cC0+TWFjU3RhdC5yeF9ieXRlcyArPSBza2ItPmxlbjsKKworICAgICAgICAgICAgICAgIC8qIEtpY2sgdGhlIHBhY2tldCBvbiB1cC4gKi8KKyAgICAgICAgICAgICAgICBza2ItPmRldiA9IGRldjsKKyAgICAgICAgICAgICAgICBza2ItPnByb3RvY29sID0gdHJfdHlwZV90cmFucyhza2IsIGRldik7CisgICAgICAgICAgICAgICAgbmV0aWZfcngoc2tiKTsKKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKyAgICAgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCisvKiBBZGFwdGVyIFJBTSB0ZXN0LiBJbmNyZW1lbnRhbCB3b3JkIE9ERCBib3VuZGFyeSBkYXRhIHRlc3QuICovCitzdGF0aWMgaW50IHNtY3RyX3JhbV9tZW1vcnlfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIF9fdTE2IHBhZ2UsIHBhZ2VzX29mX3JhbSwgc3RhcnRfcGF0dGVybiA9IDAsIHdvcmRfcGF0dGVybiA9IDAsCisgICAgICAgICAgICAgICAgd29yZF9yZWFkID0gMCwgZXJyX3dvcmQgPSAwLCBlcnJfcGF0dGVybiA9IDA7CisgICAgICAgIHVuc2lnbmVkIGludCBlcnJfb2Zmc2V0OworICAgICAgICBfX3UzMiBqLCBwd29yZDsKKyAgICAgICAgX191OCBlcnIgPSAwOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9yYW1fbWVtb3J5X3Rlc3RcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgc3RhcnRfcGF0dGVybiAgID0gMHgwMDAxOworICAgICAgICBwYWdlc19vZl9yYW0gICAgPSB0cC0+cmFtX3NpemUgLyB0cC0+cmFtX3VzYWJsZTsKKyAgICAgICAgcHdvcmQgICAgICAgICAgID0gdHAtPnJhbV9hY2Nlc3M7CisKKyAgICAgICAgLyogSW5jcmVtZW50YWwgd29yZCBPREQgYm91bmRhcnkgdGVzdC4gKi8KKyAgICAgICAgZm9yKHBhZ2UgPSAwOyAocGFnZSA8IHBhZ2VzX29mX3JhbSkgJiYgKH5lcnIpOworICAgICAgICAgICAgICAgIHBhZ2UrKywgc3RhcnRfcGF0dGVybiArPSAweDgwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbWN0cl9zZXRfcGFnZShkZXYsIChfX3U4ICopKHRwLT5yYW1fYWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICArIChwYWdlICogdHAtPnJhbV91c2FibGUgKiAxMDI0KSArIDEpKTsKKyAgICAgICAgICAgICAgICB3b3JkX3BhdHRlcm4gPSBzdGFydF9wYXR0ZXJuOworCisgICAgICAgICAgICAgICAgZm9yKGogPSAxOyBqIDwgKF9fdTMyKSh0cC0+cmFtX3VzYWJsZSAqIDEwMjQpIC0gMTsgaiArPSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgKihfX3UxNiAqKShwd29yZCArIGopID0gd29yZF9wYXR0ZXJuKys7CisKKyAgICAgICAgICAgICAgICB3b3JkX3BhdHRlcm4gPSBzdGFydF9wYXR0ZXJuOworCisgICAgICAgICAgICAgICAgZm9yKGogPSAxOyBqIDwgKF9fdTMyKSh0cC0+cmFtX3VzYWJsZSAqIDEwMjQpIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKH5lcnIpOyBqICs9IDIsIHdvcmRfcGF0dGVybisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRfcmVhZCA9ICooX191MTYgKikocHdvcmQgKyBqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdvcmRfcmVhZCAhPSB3b3JkX3BhdHRlcm4pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciAgICAgICAgICAgICA9IChfX3U4KTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycl9vZmZzZXQgICAgICA9IGo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycl93b3JkICAgICAgICA9IHdvcmRfcmVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyX3BhdHRlcm4gICAgID0gd29yZF9wYXR0ZXJuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFJBTV9URVNUX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogWmVybyBvdXQgbWVtb3J5LiAqLworICAgICAgICBmb3IocGFnZSA9IDA7IHBhZ2UgPCBwYWdlc19vZl9yYW0gJiYgKH5lcnIpOyBwYWdlKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbWN0cl9zZXRfcGFnZShkZXYsIChfX3U4ICopKHRwLT5yYW1fYWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICArIChwYWdlICogdHAtPnJhbV91c2FibGUgKiAxMDI0KSkpOworICAgICAgICAgICAgICAgIHdvcmRfcGF0dGVybiA9IDA7CisKKyAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCAoX191MzIpdHAtPnJhbV91c2FibGUgKiAxMDI0OyBqICs9MikKKyAgICAgICAgICAgICAgICAgICAgICAgICooX191MTYgKikocHdvcmQgKyBqKSA9IHdvcmRfcGF0dGVybjsKKworICAgICAgICAgICAgICAgIGZvcihqID0wOyBqIDwgKF9fdTMyKXRwLT5yYW1fdXNhYmxlICogMTAyNAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKH5lcnIpOyBqICs9IDIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd29yZF9yZWFkID0gKihfX3UxNiAqKShwd29yZCArIGopOworICAgICAgICAgICAgICAgICAgICAgICAgaWYod29yZF9yZWFkICE9IHdvcmRfcGF0dGVybikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyICAgICAgICAgICAgID0gKF9fdTgpMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyX29mZnNldCAgICAgID0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyX3dvcmQgICAgICAgID0gd29yZF9yZWFkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJfcGF0dGVybiAgICAgPSB3b3JkX3BhdHRlcm47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoUkFNX1RFU1RfRkFJTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzbWN0cl9zZXRfcGFnZShkZXYsIChfX3U4ICopdHAtPnJhbV9hY2Nlc3MpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfcmN2X2NoZ19wYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2ICpjb3JyZWxhdG9yKQoreworICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqcnN2OworICAgICAgICBzaWduZWQgc2hvcnQgdmxlbjsKKyAgICAgICAgX191MTYgcmNvZGUgPSBQT1NJVElWRV9BQ0s7CisgICAgICAgIHVuc2lnbmVkIGludCBzdmVjdG9ycyA9IEZfTk9fU1VCX1ZFQ1RPUlNfRk9VTkQ7CisKKyAgICAgICAgLyogVGhpcyBGcmFtZSBjYW4gb25seSBjb21lIGZyb20gYSBDUlMgKi8KKyAgICAgICAgaWYoKHJtZi0+ZGNfc2MgJiBTQ19NQVNLKSAhPSBTQ19DUlMpCisgICAgICAgICAgICAgICAgcmV0dXJuKEVfSU5BUFBST1BSSUFURV9TT1VSQ0VfQ0xBU1MpOworCisgICAgICAgIC8qIFJlbW92ZSBNVklEIExlbmd0aCBmcm9tIHRvdGFsIGxlbmd0aC4gKi8KKyAgICAgICAgdmxlbiA9IChzaWduZWQgc2hvcnQpcm1mLT52bCAtIDQ7CisKKyAgICAgICAgLyogUG9pbnQgdG8gRmlyc3QgU1ZJRCAqLworICAgICAgICByc3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXJtZiArIHNpemVvZihNQUNfSEVBREVSKSk7CisKKyAgICAgICAgLyogU2VhcmNoIGZvciBBcHByb3ByaWF0ZSBTVklEJ3MuICovCisgICAgICAgIHdoaWxlKCh2bGVuID4gMCkgJiYgKHJjb2RlID09IFBPU0lUSVZFX0FDSykpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2gocnN2LT5zdmkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT1JSRUxBVE9SOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmVjdG9ycyB8PSBGX0NPUlJFTEFUT1I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gc21jdHJfc2V0X2NvcnIoZGV2LCByc3YsIGNvcnJlbGF0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMT0NBTF9SSU5HX05VTUJFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZlY3RvcnMgfD0gRl9MT0NBTF9SSU5HX05VTUJFUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBzbWN0cl9zZXRfbG9jYWxfcmluZ19udW0oZGV2LCByc3YpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBU1NJR05fUEhZU0lDQUxfRFJPUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZlY3RvcnMgfD0gRl9BU1NJR05fUEhZU0lDQUxfRFJPUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBzbWN0cl9zZXRfcGh5X2Ryb3AoZGV2LCByc3YpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUlJPUl9USU1FUl9WQUxVRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZlY3RvcnMgfD0gRl9FUlJPUl9USU1FUl9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBzbWN0cl9zZXRfZXJyb3JfdGltZXJfdmFsdWUoZGV2LCByc3YpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVVRIT1JJWkVEX0ZVTkNUSU9OX0NMQVNTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmVjdG9ycyB8PSBGX0FVVEhPUklaRURfRlVOQ1RJT05fQ0xBU1M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gc21jdHJfc2V0X2F1dGhfZnVuY3RfY2xhc3MoZGV2LCByc3YpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVVRIT1JJWkVEX0FDQ0VTU19QUklPUklUWToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZlY3RvcnMgfD0gRl9BVVRIT1JJWkVEX0FDQ0VTU19QUklPUklUWTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBzbWN0cl9zZXRfYXV0aF9hY2Nlc3NfcHJpKGRldiwgcnN2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gRV9TVUJfVkVDVE9SX1VOS05PV047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIExldCBTZW5kZXIgS25vdyBpZiBTVU0gb2YgU1YgbGVuZ3RoJ3MgaXMKKyAgICAgICAgICAgICAgICAgKiBsYXJnZXIgdGhlbiBsZW5ndGggaW4gTVZJRCBsZW5ndGggZmllbGQKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZigodmxlbiAtPSByc3YtPnN2bCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBFX1ZFQ1RPUl9MRU5HVEhfRVJST1I7CisKKyAgICAgICAgICAgICAgICByc3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXJzdiArIHJzdi0+c3ZsKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHJjb2RlID09IFBPU0lUSVZFX0FDSykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIExldCBTZW5kZXIgS25vdyBpZiBNVklEIGxlbmd0aCBmaWVsZAorICAgICAgICAgICAgICAgICAqIGlzIGxhcmdlciB0aGVuIFNVTSBvZiBTViBsZW5ndGgncworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmKHZsZW4gIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gRV9WRUNUT1JfTEVOR1RIX0VSUk9SOworICAgICAgICAgICAgICAgIGVsc2UKKwkJeworICAgICAgICAgICAgICAgIAkvKiBMZXQgU2VuZGVyIEtub3cgaWYgRXhwZWN0ZWQgU1ZJRCBNaXNzaW5nICovCisgICAgICAgICAgICAgICAgCWlmKChzdmVjdG9ycyAmIFJfQ0hHX1BBUk0pIF4gUl9DSEdfUEFSTSkKKyAgICAgICAgICAgICAgICAgICAgICAgIAlyY29kZSA9IEVfTUlTU0lOR19TVUJfVkVDVE9SOworCQl9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHJjb2RlKTsKK30KKworc3RhdGljIGludCBzbWN0cl9yY3ZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2ICpjb3JyZWxhdG9yKQoreworICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqcnN2OworICAgICAgICBzaWduZWQgc2hvcnQgdmxlbjsKKyAgICAgICAgX191MTYgcmNvZGUgPSBQT1NJVElWRV9BQ0s7CisgICAgICAgIHVuc2lnbmVkIGludCBzdmVjdG9ycyA9IEZfTk9fU1VCX1ZFQ1RPUlNfRk9VTkQ7CisKKyAgICAgICAgLyogVGhpcyBGcmFtZSBjYW4gb25seSBjb21lIGZyb20gYSBSUFMgKi8KKyAgICAgICAgaWYoKHJtZi0+ZGNfc2MgJiBTQ19NQVNLKSAhPSBTQ19SUFMpCisgICAgICAgICAgICAgICAgcmV0dXJuIChFX0lOQVBQUk9QUklBVEVfU09VUkNFX0NMQVNTKTsKKworICAgICAgICAvKiBSZW1vdmUgTVZJRCBMZW5ndGggZnJvbSB0b3RhbCBsZW5ndGguICovCisgICAgICAgIHZsZW4gPSAoc2lnbmVkIHNob3J0KXJtZi0+dmwgLSA0OworCisgICAgICAgIC8qIFBvaW50IHRvIEZpcnN0IFNWSUQgKi8KKyAgICAgICAgcnN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMilybWYgKyBzaXplb2YoTUFDX0hFQURFUikpOworCisgICAgICAgIC8qIFNlYXJjaCBmb3IgQXBwcm9wcmlhdGUgU1ZJRCdzICovCisgICAgICAgIHdoaWxlKCh2bGVuID4gMCkgJiYgKHJjb2RlID09IFBPU0lUSVZFX0FDSykpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2gocnN2LT5zdmkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT1JSRUxBVE9SOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmVjdG9ycyB8PSBGX0NPUlJFTEFUT1I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gc21jdHJfc2V0X2NvcnIoZGV2LCByc3YsIGNvcnJlbGF0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMT0NBTF9SSU5HX05VTUJFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZlY3RvcnMgfD0gRl9MT0NBTF9SSU5HX05VTUJFUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBzbWN0cl9zZXRfbG9jYWxfcmluZ19udW0oZGV2LCByc3YpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBU1NJR05fUEhZU0lDQUxfRFJPUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZlY3RvcnMgfD0gRl9BU1NJR05fUEhZU0lDQUxfRFJPUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBzbWN0cl9zZXRfcGh5X2Ryb3AoZGV2LCByc3YpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFUlJPUl9USU1FUl9WQUxVRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZlY3RvcnMgfD0gRl9FUlJPUl9USU1FUl9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBzbWN0cl9zZXRfZXJyb3JfdGltZXJfdmFsdWUoZGV2LCByc3YpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBFX1NVQl9WRUNUT1JfVU5LTk9XTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogTGV0IFNlbmRlciBLbm93IGlmIFNVTSBvZiBTViBsZW5ndGgncyBpcworICAgICAgICAgICAgICAgICAqIGxhcmdlciB0aGVuIGxlbmd0aCBpbiBNVklEIGxlbmd0aCBmaWVsZAorCQkgKi8KKyAgICAgICAgICAgICAgICBpZigodmxlbiAtPSByc3YtPnN2bCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBFX1ZFQ1RPUl9MRU5HVEhfRVJST1I7CisKKyAgICAgICAgICAgICAgICByc3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXJzdiArIHJzdi0+c3ZsKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHJjb2RlID09IFBPU0lUSVZFX0FDSykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIExldCBTZW5kZXIgS25vdyBpZiBNVklEIGxlbmd0aCBmaWVsZAorICAgICAgICAgICAgICAgICAqIGlzIGxhcmdlciB0aGVuIFNVTSBvZiBTViBsZW5ndGgncworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmKHZsZW4gIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gRV9WRUNUT1JfTEVOR1RIX0VSUk9SOworICAgICAgICAgICAgICAgIGVsc2UKKwkJeworICAgICAgICAgICAgICAgIAkvKiBMZXQgU2VuZGVyIEtub3cgaWYgRXhwZWN0ZWQgU1YgTWlzc2luZyAqLworICAgICAgICAgICAgICAgIAlpZigoc3ZlY3RvcnMgJiBSX0lOSVQpIF4gUl9JTklUKQorICAgICAgICAgICAgICAgICAgICAgICAgCXJjb2RlID0gRV9NSVNTSU5HX1NVQl9WRUNUT1I7CisJCX0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAocmNvZGUpOworfQorCitzdGF0aWMgaW50IHNtY3RyX3Jjdl90eF9mb3J3YXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19IRUFERVIgKnJtZikKK3sKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnJzdjsKKyAgICAgICAgc2lnbmVkIHNob3J0IHZsZW47CisgICAgICAgIF9fdTE2IHJjb2RlID0gUE9TSVRJVkVfQUNLOworICAgICAgICB1bnNpZ25lZCBpbnQgc3ZlY3RvcnMgPSBGX05PX1NVQl9WRUNUT1JTX0ZPVU5EOworCisgICAgICAgIC8qIFRoaXMgRnJhbWUgY2FuIG9ubHkgY29tZSBmcm9tIGEgQ1JTICovCisgICAgICAgIGlmKChybWYtPmRjX3NjICYgU0NfTUFTSykgIT0gU0NfQ1JTKQorICAgICAgICAgICAgICAgIHJldHVybiAoRV9JTkFQUFJPUFJJQVRFX1NPVVJDRV9DTEFTUyk7CisKKyAgICAgICAgLyogUmVtb3ZlIE1WSUQgTGVuZ3RoIGZyb20gdG90YWwgbGVuZ3RoICovCisgICAgICAgIHZsZW4gPSAoc2lnbmVkIHNob3J0KXJtZi0+dmwgLSA0OworCisgICAgICAgIC8qIFBvaW50IHRvIEZpcnN0IFNWSUQgKi8KKyAgICAgICAgcnN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMilybWYgKyBzaXplb2YoTUFDX0hFQURFUikpOworCisgICAgICAgIC8qIFNlYXJjaCBmb3IgQXBwcm9wcmlhdGUgU1ZJRCdzICovCisgICAgICAgIHdoaWxlKCh2bGVuID4gMCkgJiYgKHJjb2RlID09IFBPU0lUSVZFX0FDSykpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2gocnN2LT5zdmkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGUkFNRV9GT1JXQVJEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmVjdG9ycyB8PSBGX0ZSQU1FX0ZPUldBUkQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gc21jdHJfc2V0X2ZyYW1lX2ZvcndhcmQoZGV2LCByc3YsIAorCQkJCQlybWYtPmRjX3NjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gRV9TVUJfVkVDVE9SX1VOS05PV047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIExldCBTZW5kZXIgS25vdyBpZiBTVU0gb2YgU1YgbGVuZ3RoJ3MgaXMKKyAgICAgICAgICAgICAgICAgKiBsYXJnZXIgdGhlbiBsZW5ndGggaW4gTVZJRCBsZW5ndGggZmllbGQKKwkJICovCisgICAgICAgICAgICAgICAgaWYoKHZsZW4gLT0gcnN2LT5zdmwpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gRV9WRUNUT1JfTEVOR1RIX0VSUk9SOworCisgICAgICAgICAgICAgICAgcnN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMilyc3YgKyByc3YtPnN2bCk7CisgICAgICAgIH0KKworICAgICAgICBpZihyY29kZSA9PSBQT1NJVElWRV9BQ0spCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBMZXQgU2VuZGVyIEtub3cgaWYgTVZJRCBsZW5ndGggZmllbGQKKyAgICAgICAgICAgICAgICAgKiBpcyBsYXJnZXIgdGhlbiBTVU0gb2YgU1YgbGVuZ3RoJ3MKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZih2bGVuICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICByY29kZSA9IEVfVkVDVE9SX0xFTkdUSF9FUlJPUjsKKyAgICAgICAgICAgICAgICBlbHNlCisJCXsKKyAgICAgICAgICAgICAgICAJLyogTGV0IFNlbmRlciBLbm93IGlmIEV4cGVjdGVkIFNWIE1pc3NpbmcgKi8KKyAgICAgICAgICAgICAgICAJaWYoKHN2ZWN0b3JzICYgUl9UWF9GT1JXQVJEKSBeIFJfVFhfRk9SV0FSRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIAlyY29kZSA9IEVfTUlTU0lOR19TVUJfVkVDVE9SOworCQl9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHJjb2RlKTsKK30KKworc3RhdGljIGludCBzbWN0cl9yY3ZfcnFfYWRkcl9zdGF0ZV9hdHRjaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfSEVBREVSICpybWYsIF9fdTE2ICpjb3JyZWxhdG9yKQoreworICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqcnN2OworICAgICAgICBzaWduZWQgc2hvcnQgdmxlbjsKKyAgICAgICAgX191MTYgcmNvZGUgPSBQT1NJVElWRV9BQ0s7CisgICAgICAgIHVuc2lnbmVkIGludCBzdmVjdG9ycyA9IEZfTk9fU1VCX1ZFQ1RPUlNfRk9VTkQ7CisKKyAgICAgICAgLyogUmVtb3ZlIE1WSUQgTGVuZ3RoIGZyb20gdG90YWwgbGVuZ3RoICovCisgICAgICAgIHZsZW4gPSAoc2lnbmVkIHNob3J0KXJtZi0+dmwgLSA0OworCisgICAgICAgIC8qIFBvaW50IHRvIEZpcnN0IFNWSUQgKi8KKyAgICAgICAgcnN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMilybWYgKyBzaXplb2YoTUFDX0hFQURFUikpOworCisgICAgICAgIC8qIFNlYXJjaCBmb3IgQXBwcm9wcmlhdGUgU1ZJRCdzICovCisgICAgICAgIHdoaWxlKCh2bGVuID4gMCkgJiYgKHJjb2RlID09IFBPU0lUSVZFX0FDSykpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2gocnN2LT5zdmkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT1JSRUxBVE9SOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmVjdG9ycyB8PSBGX0NPUlJFTEFUT1I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjb2RlID0gc21jdHJfc2V0X2NvcnIoZGV2LCByc3YsIGNvcnJlbGF0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBFX1NVQl9WRUNUT1JfVU5LTk9XTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogTGV0IFNlbmRlciBLbm93IGlmIFNVTSBvZiBTViBsZW5ndGgncyBpcworICAgICAgICAgICAgICAgICAqIGxhcmdlciB0aGVuIGxlbmd0aCBpbiBNVklEIGxlbmd0aCBmaWVsZAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmKCh2bGVuIC09IHJzdi0+c3ZsKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByY29kZSA9IEVfVkVDVE9SX0xFTkdUSF9FUlJPUjsKKworICAgICAgICAgICAgICAgIHJzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpcnN2ICsgcnN2LT5zdmwpOworICAgICAgICB9CisKKyAgICAgICAgaWYocmNvZGUgPT0gUE9TSVRJVkVfQUNLKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogTGV0IFNlbmRlciBLbm93IGlmIE1WSUQgbGVuZ3RoIGZpZWxkCisgICAgICAgICAgICAgICAgICogaXMgbGFyZ2VyIHRoZW4gU1VNIG9mIFNWIGxlbmd0aCdzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYodmxlbiAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmNvZGUgPSBFX1ZFQ1RPUl9MRU5HVEhfRVJST1I7CisgICAgICAgICAgICAgICAgZWxzZQorCQl7CisgICAgICAgICAgICAgICAgCS8qIExldCBTZW5kZXIgS25vdyBpZiBFeHBlY3RlZCBTVklEIE1pc3NpbmcgKi8KKyAgICAgICAgICAgICAgICAJaWYoKHN2ZWN0b3JzICYgUl9SUV9BVFRDSF9TVEFURV9BRERSKSAKKwkJCQleIFJfUlFfQVRUQ0hfU1RBVEVfQUREUikKKyAgICAgICAgICAgICAgICAgICAgICAgIAlyY29kZSA9IEVfTUlTU0lOR19TVUJfVkVDVE9SOworCQkJfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChyY29kZSk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfcmN2X3Vua25vd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX0hFQURFUiAqcm1mLAorICAgICAgICBfX3UxNiAqY29ycmVsYXRvcikKK3sKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnJzdjsKKyAgICAgICAgc2lnbmVkIHNob3J0IHZsZW47CisKKyAgICAgICAgKmNvcnJlbGF0b3IgPSAwOworCisgICAgICAgIC8qIFJlbW92ZSBNVklEIExlbmd0aCBmcm9tIHRvdGFsIGxlbmd0aCAqLworICAgICAgICB2bGVuID0gKHNpZ25lZCBzaG9ydClybWYtPnZsIC0gNDsKKworICAgICAgICAvKiBQb2ludCB0byBGaXJzdCBTVklEICovCisgICAgICAgIHJzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpcm1mICsgc2l6ZW9mKE1BQ19IRUFERVIpKTsKKworICAgICAgICAvKiBTZWFyY2ggZm9yIENPUlJFTEFUT1IgZm9yIFJTUCB0byBVTktOT1dOICovCisgICAgICAgIHdoaWxlKCh2bGVuID4gMCkgJiYgKCpjb3JyZWxhdG9yID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoKHJzdi0+c3ZpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09SUkVMQVRPUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfc2V0X2NvcnIoZGV2LCByc3YsIGNvcnJlbGF0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmxlbiAtPSByc3YtPnN2bDsKKyAgICAgICAgICAgICAgICByc3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXJzdiArIHJzdi0+c3ZsKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoRV9VTlJFQ09HTklaRURfVkVDVE9SX0lEKTsKK30KKworLyoKKyAqIFJlc2V0IHRoZSA4MjUgTklDIGFuZCBleGl0IHc6CisgKiAxLiBUaGUgTklDIHJlc2V0IGNsZWFyZWQgKG5vbi1yZXNldCBzdGF0ZSksIGhhbHRlZCBhbmQgdW4taW5pdGlhbGl6ZWQuCisgKiAyLiBUSU5UIG1hc2tlZC4KKyAqIDMuIENCVVNZIG1hc2tlZC4KKyAqIDQuIFRJTlQgY2xlYXIuCisgKiA1LiBDQlVTWSBjbGVhci4KKyAqLworc3RhdGljIGludCBzbWN0cl9yZXNldF9hZGFwdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgICAgICAgIC8qIFJlc2V0aW5nIHRoZSBOSUMgd2lsbCBwdXQgaXQgaW4gYSBoYWx0ZWQgYW5kIHVuLWluaXRpYWxpemVkIHN0YXRlLiAqLyAgICAgICAgc21jdHJfc2V0X3RyY19yZXNldChpb2FkZHIpOworICAgICAgICBtZGVsYXkoMjAwKTsgLyogfjIgbXMgKi8KKworICAgICAgICBzbWN0cl9jbGVhcl90cmNfcmVzZXQoaW9hZGRyKTsKKyAgICAgICAgbWRlbGF5KDIwMCk7IC8qIH4yIG1zICovCisKKyAgICAgICAgLyogUmVtb3ZlIGFueSBsYXRjaGVkIGludGVycnVwdHMgdGhhdCBvY2N1cnJlZCBwcmlvciB0byByZXNldGluZyB0aGUKKyAgICAgICAgICogYWRhcHRlciBvciBwb3NzaWJpbHkgY2F1c2VkIGJ5IGxpbmUgZ2xpdGNoZXMgZHVlIHRvIHRoZSByZXNldC4KKyAgICAgICAgICovCisgICAgICAgIG91dGIodHAtPnRyY19tYXNrIHwgQ1NSX0NMUlRJTlQgfCBDU1JfQ0xSQ0JVU1ksIGlvYWRkciArIENTUik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9yZXN0YXJ0X3R4X2NoYWluKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IHF1ZXVlKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBlcnIgPSAwOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9yZXN0YXJ0X3R4X2NoYWluXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIGlmKHRwLT5udW1fdHhfZmNic191c2VkW3F1ZXVlXSAhPSAwCisgICAgICAgICAgICAgICAgJiYgdHAtPnR4X3F1ZXVlX3N0YXR1c1txdWV1ZV0gPT0gTk9UX1RSQU5TTUlUSU5HKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgdHAtPnR4X3F1ZXVlX3N0YXR1c1txdWV1ZV0gPSBUUkFOU01JVElORzsKKyAgICAgICAgICAgICAgICBlcnIgPSBzbWN0cl9pc3N1ZV9yZXN1bWVfdHhfZmNiX2NtZChkZXYsIHF1ZXVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIGludCBzbWN0cl9yaW5nX3N0YXR1c19jaGcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9yaW5nX3N0YXR1c19jaGdcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgLyogQ2hlY2sgZm9yIHJpbmdfc3RhdHVzX2ZsYWc6IHdoZW5ldmVyIE1PTklUT1JfU1RBVEVfQklUCisgICAgICAgICAqIEJpdCBpcyBzZXQsIGNoZWNrIHZhbHVlIG9mIG1vbml0b3Jfc3RhdGUsIG9ubHkgdGhlbiB3ZQorICAgICAgICAgKiBlbmFibGUgYW5kIHN0YXJ0IHRyYW5zbWl0L3JlY2VpdmUgdGltZW91dCAoaWYgYW5kIG9ubHkKKyAgICAgICAgICogaWYgaXQgaXMgTVNfQUNUSVZFX01PTklUT1JfU1RBVEUgb3IgTVNfU1RBTkRCWV9NT05JVE9SX1NUQVRFKQorICAgICAgICAgKi8KKyAgICAgICAgaWYodHAtPnJpbmdfc3RhdHVzX2ZsYWdzID09IE1PTklUT1JfU1RBVEVfQ0hBTkdFRCkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCh0cC0+bW9uaXRvcl9zdGF0ZSA9PSBNU19BQ1RJVkVfTU9OSVRPUl9TVEFURSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICh0cC0+bW9uaXRvcl9zdGF0ZSA9PSBNU19TVEFOREJZX01PTklUT1JfU1RBVEUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5tb25pdG9yX3N0YXRlX3JlYWR5ID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIGFkYXB0ZXIgaXMgTk9UIGluIGVpdGhlciBhY3RpdmUgbW9uaXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICogb3Igc3RhbmRieSBtb25pdG9yIHN0YXRlID0+IERpc2FibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRyYW5zbWl0L3JlY2VpdmUgdGltZW91dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1vbml0b3Jfc3RhdGVfcmVhZHkgPSAwOworCisJCQkvKiBSaW5nIHNwZWVkIHByb2JsZW0sIHN3aXRjaGluZyB0byBhdXRvIG1vZGUuICovCisJCQlpZih0cC0+bW9uaXRvcl9zdGF0ZSA9PSBNU19NT05JVE9SX0ZTTV9JTkFDVElWRQorCQkJCSYmICF0cC0+Y2xlYW51cCkKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogSW5jb3JyZWN0IHJpbmcgc3BlZWQgc3dpdGNoaW5nLlxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkJCQlzbWN0cl9zZXRfcmluZ19zcGVlZChkZXYpOworCQkJfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKCEodHAtPnJpbmdfc3RhdHVzX2ZsYWdzICYgUklOR19TVEFUVVNfQ0hBTkdFRCkpCisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKworICAgICAgICBzd2l0Y2godHAtPnJpbmdfc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBSSU5HX1JFQ09WRVJZOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJpbmcgUmVjb3ZlcnlcbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+Y3VycmVudF9yaW5nX3N0YXR1cyB8PSBSSU5HX1JFQ09WRVJZOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNJTkdMRV9TVEFUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNpbmdsZSBTdGF0aW5vblxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jdXJyZW50X3Jpbmdfc3RhdHVzIHw9IFNJTkdMRV9TVEFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIENPVU5URVJfT1ZFUkZMT1c6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogQ291bnRlciBPdmVyZmxvd1xuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jdXJyZW50X3Jpbmdfc3RhdHVzIHw9IENPVU5URVJfT1ZFUkZMT1c7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgUkVNT1ZFX1JFQ0VJVkVEOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlbW92ZSBSZWNlaXZlZFxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jdXJyZW50X3Jpbmdfc3RhdHVzIHw9IFJFTU9WRV9SRUNFSVZFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBBVVRPX1JFTU9WQUxfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogQXV0byBSZW1vdmUgRXJyb3JcbiIsIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+Y3VycmVudF9yaW5nX3N0YXR1cyB8PSBBVVRPX1JFTU9WQUxfRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTE9CRV9XSVJFX0ZBVUxUOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExvYmUgV2lyZSBGYXVsdFxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jdXJyZW50X3Jpbmdfc3RhdHVzIHw9IExPQkVfV0lSRV9GQVVMVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBUUkFOU01JVF9CRUFDT046CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogVHJhbnNtaXQgQmVhY29uXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmN1cnJlbnRfcmluZ19zdGF0dXMgfD0gVFJBTlNNSVRfQkVBQ09OOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNPRlRfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogU29mdCBFcnJvclxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jdXJyZW50X3Jpbmdfc3RhdHVzIHw9IFNPRlRfRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgSEFSRF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBIYXJkIEVycm9yXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmN1cnJlbnRfcmluZ19zdGF0dXMgfD0gSEFSRF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTSUdOQUxfTE9TUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBTaWduYWwgTG9zc1xuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5jdXJyZW50X3Jpbmdfc3RhdHVzIHw9IFNJR05BTF9MT1NTOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVua25vd24gcmluZyBzdGF0dXMgY2hhbmdlXG4iLAorCQkJCWRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfcnhfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBfX3UxNiBxdWV1ZSwgc3RhdHVzLCByeF9zaXplLCBlcnIgPSAwOworICAgICAgICBfX3U4ICpwYnVmZjsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfcnhfZnJhbWVcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgcXVldWUgPSB0cC0+cmVjZWl2ZV9xdWV1ZV9udW1iZXI7CisKKyAgICAgICAgd2hpbGUoKHN0YXR1cyA9IHRwLT5yeF9mY2JfY3VycltxdWV1ZV0tPmZyYW1lX3N0YXR1cykgIT0gU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGVyciA9IEhBUkRXQVJFX0ZBSUxFRDsKKworICAgICAgICAgICAgICAgIGlmKCgoc3RhdHVzICYgMHgwMDdmKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCh0cC0+cmVjZWl2ZV9tYXNrICYgQUNDRVBUX0VSUl9QQUNLRVRTKSAhPSAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBmcmFtZSBsZW5ndGggbGVzcyB0aGUgQ1JDICg0IGJ5dGVzKSArIEZTICgxIGJ5dGUpICovCisgICAgICAgICAgICAgICAgICAgICAgICByeF9zaXplID0gdHAtPnJ4X2ZjYl9jdXJyW3F1ZXVlXS0+ZnJhbWVfbGVuZ3RoIC0gNTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcGJ1ZmYgPSBzbWN0cl9nZXRfcnhfcG9pbnRlcihkZXYsIHF1ZXVlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc21jdHJfc2V0X3BhZ2UoZGV2LCBwYnVmZik7CisgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9kaXNhYmxlXzE2Yml0KGRldik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBidWZmIHBvaW50cyB0byBhZGRyIHdpdGhpbiBvbmUgcGFnZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgcGJ1ZmYgPSAoX191OCAqKVBBR0VfUE9JTlRFUihwYnVmZik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHF1ZXVlID09IE5PTl9NQUNfUVVFVUUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2I7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiID0gZGV2X2FsbG9jX3NrYihyeF9zaXplKTsKKwkJCQlpZiAoc2tiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlza2JfcHV0KHNrYiwgcnhfc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCW1lbWNweShza2ItPmRhdGEsIHBidWZmLCByeF9zaXplKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogVXBkYXRlIENvdW50ZXJzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAl0cC0+TWFjU3RhdC5yeF9wYWNrZXRzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAl0cC0+TWFjU3RhdC5yeF9ieXRlcyArPSBza2ItPmxlbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogS2ljayB0aGUgcGFja2V0IG9uIHVwLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJc2tiLT5kZXYgPSBkZXY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlza2ItPnByb3RvY29sID0gdHJfdHlwZV90cmFucyhza2IsIGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXRpZl9yeChza2IpOworCQkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJCX0gZWxzZSB7CisJCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9wcm9jZXNzX3J4X3BhY2tldCgoTUFDX0hFQURFUiAqKXBidWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4X3NpemUsIGRldiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzbWN0cl9lbmFibGVfMTZiaXQoZGV2KTsKKyAgICAgICAgICAgICAgICBzbWN0cl9zZXRfcGFnZShkZXYsIChfX3U4ICopdHAtPnJhbV9hY2Nlc3MpOworICAgICAgICAgICAgICAgIHNtY3RyX3VwZGF0ZV9yeF9jaGFpbihkZXYsIHF1ZXVlKTsKKworICAgICAgICAgICAgICAgIGlmKGVyciAhPSBTVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKGVycik7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2VuZF9kYXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBpbnQgaSwgZXJyOworICAgICAgICBNQUNfSEVBREVSICp0bWY7CisgICAgICAgIEZDQmxvY2sgKmZjYjsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfc2VuZF9kYXRcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgaWYoKGZjYiA9IHNtY3RyX2dldF90eF9mY2IoZGV2LCBNQUNfUVVFVUUsCisgICAgICAgICAgICAgICAgc2l6ZW9mKE1BQ19IRUFERVIpKSkgPT0gKEZDQmxvY2sgKikoLTFMKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoT1VUX09GX1JFU09VUkNFUyk7CisgICAgICAgIH0KKworICAgICAgICAvKiBJbml0aWFsaXplIERBVCBEYXRhIEZpZWxkcy4gKi8KKyAgICAgICAgdG1mID0gKE1BQ19IRUFERVIgKilmY2ItPmJkYl9wdHItPmRhdGFfYmxvY2tfcHRyOworICAgICAgICB0bWYtPmFjID0gTVNCKEFDX0ZDX0RBVCk7CisgICAgICAgIHRtZi0+ZmMgPSBMU0IoQUNfRkNfREFUKTsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bWYtPnNhW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKyAgICAgICAgICAgICAgICB0bWYtPmRhW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKworICAgICAgICB9CisKKyAgICAgICAgdG1mLT52YyAgICAgICAgPSBEQVQ7CisgICAgICAgIHRtZi0+ZGNfc2MgICAgID0gRENfUlMgfCBTQ19SUzsKKyAgICAgICAgdG1mLT52bCAgICAgICAgPSA0OworICAgICAgICB0bWYtPnZsICAgICAgICA9IFNXQVBfQllURVModG1mLT52bCk7CisKKyAgICAgICAgLyogU3RhcnQgVHJhbnNtaXQuICovCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl90cmNfc2VuZF9wYWNrZXQoZGV2LCBmY2IsIE1BQ19RVUVVRSkpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICAvKiBXYWl0IGZvciBUcmFuc21pdCB0byBDb21wbGV0ZSAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoZmNiLT5mcmFtZV9zdGF0dXMgJiBGQ0JfQ09NTUFORF9ET05FKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgbWRlbGF5KDEpOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgaWYgR09PRCBmcmFtZSBUeCdlZC4gKi8KKyAgICAgICAgaWYoIShmY2ItPmZyYW1lX3N0YXR1cyAmICBGQ0JfQ09NTUFORF9ET05FKQorICAgICAgICAgICAgICAgIHx8IGZjYi0+ZnJhbWVfc3RhdHVzICYgKEZDQl9UWF9TVEFUVVNfRSB8IEZDQl9UWF9BQ19CSVRTKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoSU5JVElBTElaRV9GQUlMRUQpOworICAgICAgICB9CisKKyAgICAgICAgLyogRGUtYWxsb2NhdGVkIFR4IEZDQiBhbmQgRnJhbWUgQnVmZmVyCisgICAgICAgICAqIFRoZSBGQ0IgbXVzdCBiZSBkZS1hbGxvY2F0ZWQgbWFudWFsbHkgaWYgZXhlY3V0aW5nIHdpdGgKKyAgICAgICAgICogaW50ZXJydXB0cyBkaXNhYmxlZCwgb3RoZXIgd2lzZSB0aGUgSVNSIChMTV9TZXJ2aWNlX0V2ZW50cykKKyAgICAgICAgICogd2lsbCBkZS1hbGxvY2F0ZSBpdCB3aGVuIHRoZSBpbnRlcnJ1cHQgb2NjdXJzLgorICAgICAgICAgKi8KKyAgICAgICAgdHAtPnR4X3F1ZXVlX3N0YXR1c1tNQUNfUVVFVUVdID0gTk9UX1RSQU5TTUlUSU5HOworICAgICAgICBzbWN0cl91cGRhdGVfdHhfY2hhaW4oZGV2LCBmY2IsIE1BQ19RVUVVRSk7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQgc21jdHJfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qCisgICAgICAgICAqIElmIHdlIGdldCBoZXJlLCBzb21lIGhpZ2hlciBsZXZlbCBoYXMgZGVjaWRlZCB3ZSBhcmUgYnJva2VuLgorICAgICAgICAgKiBUaGVyZSBzaG91bGQgcmVhbGx5IGJlIGEgImtpY2sgbWUiIGZ1bmN0aW9uIGNhbGwgaW5zdGVhZC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmVzZXR0aW5nIHRoZSB0b2tlbiByaW5nIGFkYXB0ZXIgdGFrZXMgYSBsb25nIHRpbWUgc28ganVzdAorICAgICAgICAgKiBmYWtlIHRyYW5zbWlzc2lvbiB0aW1lIGFuZCBnbyBvbiB0cnlpbmcuIE91ciBvd24gdGltZW91dAorICAgICAgICAgKiByb3V0aW5lIGlzIGluIHNrdHJfdGltZXJfY2hrKCkKKyAgICAgICAgICovCisgICAgICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qCisgKiBHZXRzIHNrYiBmcm9tIHN5c3RlbSwgcXVldWVzIGl0IGFuZCBjaGVja3MgaWYgaXQgY2FuIGJlIHNlbnQKKyAqLworc3RhdGljIGludCBzbWN0cl9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX3NlbmRfcGFja2V0XG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEJsb2NrIGEgdHJhbnNtaXQgb3ZlcmxhcAorICAgICAgICAgKi8KKyAgICAgICAgIAorICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgICAgICAgaWYodHAtPlF1ZXVlU2tiID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuICgxKTsgICAgIC8qIFJldHVybiB3aXRoIHRidXN5IHNldDogcXVldWUgZnVsbCAqLworCisgICAgICAgIHRwLT5RdWV1ZVNrYi0tOworICAgICAgICBza2JfcXVldWVfdGFpbCgmdHAtPlNlbmRTa2JRdWV1ZSwgc2tiKTsKKyAgICAgICAgc21jdHJfaGFyZHdhcmVfc2VuZF9wYWNrZXQoZGV2LCB0cCk7CisgICAgICAgIGlmKHRwLT5RdWV1ZVNrYiA+IDApCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2VuZF9sb2JlX21lZGlhX3Rlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCU1BQ19TVUJfVkVDVE9SICp0c3Y7CisJTUFDX0hFQURFUiAqdG1mOworICAgICAgICBGQ0Jsb2NrICpmY2I7CisJX191MzIgaTsKKwlpbnQgZXJyOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTUpCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9zZW5kX2xvYmVfbWVkaWFfdGVzdFxuIiwgZGV2LT5uYW1lKTsKKworICAgICAgICBpZigoZmNiID0gc21jdHJfZ2V0X3R4X2ZjYihkZXYsIE1BQ19RVUVVRSwgc2l6ZW9mKHN0cnVjdCB0cmhfaGRyKQorICAgICAgICAgICAgICAgICsgU19XUkFQX0RBVEEgKyBTX1dSQVBfREFUQSkpID09IChGQ0Jsb2NrICopKC0xTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKE9VVF9PRl9SRVNPVVJDRVMpOworICAgICAgICB9CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBEQVQgRGF0YSBGaWVsZHMuICovCisgICAgICAgIHRtZiA9IChNQUNfSEVBREVSICopZmNiLT5iZGJfcHRyLT5kYXRhX2Jsb2NrX3B0cjsKKyAgICAgICAgdG1mLT5hYyA9IE1TQihBQ19GQ19MT0JFX01FRElBX1RFU1QpOworICAgICAgICB0bWYtPmZjID0gTFNCKEFDX0ZDX0xPQkVfTUVESUFfVEVTVCk7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1mLT5kYVtpXSA9IDA7CisgICAgICAgICAgICAgICAgdG1mLT5zYVtpXSA9IGRldi0+ZGV2X2FkZHJbaV07CisgICAgICAgIH0KKworICAgICAgICB0bWYtPnZjICAgICAgICA9IExPQkVfTUVESUFfVEVTVDsKKyAgICAgICAgdG1mLT5kY19zYyAgICAgPSBEQ19SUyB8IFNDX1JTOworICAgICAgICB0bWYtPnZsICAgICAgICA9IDQ7CisKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0bWYgKyBzaXplb2YoTUFDX0hFQURFUikpOworICAgICAgICBzbWN0cl9tYWtlX3dyYXBfZGF0YShkZXYsIHRzdik7CisgICAgICAgIHRtZi0+dmwgKz0gdHN2LT5zdmw7CisKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgIHNtY3RyX21ha2Vfd3JhcF9kYXRhKGRldiwgdHN2KTsKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKworICAgICAgICAvKiBTdGFydCBUcmFuc21pdC4gKi8KKyAgICAgICAgdG1mLT52bCA9IFNXQVBfQllURVModG1mLT52bCk7CisgICAgICAgIGlmKChlcnIgPSBzbWN0cl90cmNfc2VuZF9wYWNrZXQoZGV2LCBmY2IsIE1BQ19RVUVVRSkpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICAvKiBXYWl0IGZvciBUcmFuc21pdCB0byBDb21wbGV0ZS4gKDEwIG1zKS4gKi8KKyAgICAgICAgZm9yKGk9MDsgaSA8IDEwMDAwOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihmY2ItPmZyYW1lX3N0YXR1cyAmIEZDQl9DT01NQU5EX0RPTkUpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBtZGVsYXkoMSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBDaGVjayBpZiBHT09EIGZyYW1lIFR4J2VkICovCisgICAgICAgIGlmKCEoZmNiLT5mcmFtZV9zdGF0dXMgJiBGQ0JfQ09NTUFORF9ET05FKQorICAgICAgICAgICAgICAgIHx8IGZjYi0+ZnJhbWVfc3RhdHVzICYgKEZDQl9UWF9TVEFUVVNfRSB8IEZDQl9UWF9BQ19CSVRTKSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoTE9CRV9NRURJQV9URVNUX0ZBSUxFRCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBEZS1hbGxvY2F0ZWQgVHggRkNCIGFuZCBGcmFtZSBCdWZmZXIKKyAgICAgICAgICogVGhlIEZDQiBtdXN0IGJlIGRlLWFsbG9jYXRlZCBtYW51YWxseSBpZiBleGVjdXRpbmcgd2l0aAorICAgICAgICAgKiBpbnRlcnJ1cHRzIGRpc2FibGVkLCBvdGhlciB3aXNlIHRoZSBJU1IgKExNX1NlcnZpY2VfRXZlbnRzKQorICAgICAgICAgKiB3aWxsIGRlLWFsbG9jYXRlIGl0IHdoZW4gdGhlIGludGVycnVwdCBvY2N1cnMuCisgICAgICAgICAqLworICAgICAgICB0cC0+dHhfcXVldWVfc3RhdHVzW01BQ19RVUVVRV0gPSBOT1RfVFJBTlNNSVRJTkc7CisgICAgICAgIHNtY3RyX3VwZGF0ZV90eF9jaGFpbihkZXYsIGZjYiwgTUFDX1FVRVVFKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NlbmRfcnB0X2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX0hFQURFUiAqcm1mLAorICAgICAgICBfX3UxNiBjb3JyZWxhdG9yKQoreworICAgICAgICBNQUNfSEVBREVSICp0bWY7CisgICAgICAgIE1BQ19TVUJfVkVDVE9SICp0c3Y7CisgICAgICAgIEZDQmxvY2sgKmZjYjsKKworICAgICAgICBpZigoZmNiID0gc21jdHJfZ2V0X3R4X2ZjYihkZXYsIE1BQ19RVUVVRSwgc2l6ZW9mKE1BQ19IRUFERVIpCisJCSsgU19DT1JSRUxBVE9SICsgU19QSFlTSUNBTF9EUk9QICsgU19VUFNUUkVBTV9ORUlHSEJPUl9BRERSRVNTCisJCSsgU19BRERSRVNTX01PRElGRVIgKyBTX0dST1VQX0FERFJFU1MgKyBTX0ZVTkNUSU9OQUxfQUREUkVTUykpCisJCT09IChGQ0Jsb2NrICopKC0xTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisKKyAgICAgICAgdG1mIAkJPSAoTUFDX0hFQURFUiAqKWZjYi0+YmRiX3B0ci0+ZGF0YV9ibG9ja19wdHI7CisgICAgICAgIHRtZi0+dmMgICAgCT0gUlBUX0FERFI7CisgICAgICAgIHRtZi0+ZGNfc2MgCT0gKHJtZi0+ZGNfc2MgJiBTQ19NQVNLKSA8PCA0OworICAgICAgICB0bWYtPnZsICAgIAk9IDQ7CisKKyAgICAgICAgc21jdHJfbWFrZV84MDI1X2hkcihkZXYsIHJtZiwgdG1mLCBBQ19GQ19SUFRfQUREUik7CisKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0bWYgKyBzaXplb2YoTUFDX0hFQURFUikpOworICAgICAgICBzbWN0cl9tYWtlX2NvcnIoZGV2LCB0c3YsIGNvcnJlbGF0b3IpOworCisgICAgICAgIHRtZi0+dmwgKz0gdHN2LT5zdmw7CisgICAgICAgIHRzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpdHN2ICsgdHN2LT5zdmwpOworICAgICAgICBzbWN0cl9tYWtlX3BoeV9kcm9wX251bShkZXYsIHRzdik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgIHNtY3RyX21ha2VfdXBzdHJlYW1fbmVpZ2hib3JfYWRkcihkZXYsIHRzdik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgIHNtY3RyX21ha2VfYWRkcl9tb2QoZGV2LCB0c3YpOworCisgICAgICAgIHRtZi0+dmwgKz0gdHN2LT5zdmw7CisgICAgICAgIHRzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpdHN2ICsgdHN2LT5zdmwpOworICAgICAgICBzbWN0cl9tYWtlX2dyb3VwX2FkZHIoZGV2LCB0c3YpOworCisgICAgICAgIHRtZi0+dmwgKz0gdHN2LT5zdmw7CisgICAgICAgIHRzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpdHN2ICsgdHN2LT5zdmwpOworICAgICAgICBzbWN0cl9tYWtlX2Z1bmN0X2FkZHIoZGV2LCB0c3YpOworCisgICAgICAgIHRtZi0+dmwgKz0gdHN2LT5zdmw7CisKKyAgICAgICAgLyogU3VidHJhY3Qgb3V0IE1WSUQgYW5kIE1WTCB3aGljaCBpcworICAgICAgICAgKiBpbmNsdWRlIGluIGJvdGggdmwgYW5kIE1BQ19IRUFERVIKKyAgICAgICAgICovCisvKiAgICAgIGZjYi0+ZnJhbWVfbGVuZ3RoICAgICAgICAgICA9IHRtZi0+dmwgKyBzaXplb2YoTUFDX0hFQURFUikgLSA0OworICAgICAgICBmY2ItPmJkYl9wdHItPmJ1ZmZlcl9sZW5ndGggPSB0bWYtPnZsICsgc2l6ZW9mKE1BQ19IRUFERVIpIC0gNDsKKyovCisgICAgICAgIHRtZi0+dmwgPSBTV0FQX0JZVEVTKHRtZi0+dmwpOworCisgICAgICAgIHJldHVybiAoc21jdHJfdHJjX3NlbmRfcGFja2V0KGRldiwgZmNiLCBNQUNfUVVFVUUpKTsKK30KKworc3RhdGljIGludCBzbWN0cl9zZW5kX3JwdF9hdHRjaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2IGNvcnJlbGF0b3IpCit7CisgICAgICAgIE1BQ19IRUFERVIgKnRtZjsKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdjsKKyAgICAgICAgRkNCbG9jayAqZmNiOworCisgICAgICAgIGlmKChmY2IgPSBzbWN0cl9nZXRfdHhfZmNiKGRldiwgTUFDX1FVRVVFLCBzaXplb2YoTUFDX0hFQURFUikKKwkJKyBTX0NPUlJFTEFUT1IgKyBTX1BST0RVQ1RfSU5TVEFOQ0VfSUQgKyBTX0ZVTkNUSU9OQUxfQUREUkVTUworCQkrIFNfQVVUSE9SSVpFRF9GVU5DVElPTl9DTEFTUyArIFNfQVVUSE9SSVpFRF9BQ0NFU1NfUFJJT1JJVFkpKQorCQk9PSAoRkNCbG9jayAqKSgtMUwpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgfQorCisgICAgICAgIHRtZiAJICAgPSAoTUFDX0hFQURFUiAqKWZjYi0+YmRiX3B0ci0+ZGF0YV9ibG9ja19wdHI7CisgICAgICAgIHRtZi0+dmMgICAgPSBSUFRfQVRUQ0g7CisgICAgICAgIHRtZi0+ZGNfc2MgPSAocm1mLT5kY19zYyAmIFNDX01BU0spIDw8IDQ7CisgICAgICAgIHRtZi0+dmwgICAgPSA0OworCisgICAgICAgIHNtY3RyX21ha2VfODAyNV9oZHIoZGV2LCBybWYsIHRtZiwgQUNfRkNfUlBUX0FUVENIKTsKKworICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRtZiArIHNpemVvZihNQUNfSEVBREVSKSk7CisgICAgICAgIHNtY3RyX21ha2VfY29ycihkZXYsIHRzdiwgY29ycmVsYXRvcik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgIHNtY3RyX21ha2VfcHJvZHVjdF9pZChkZXYsIHRzdik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgIHNtY3RyX21ha2VfZnVuY3RfYWRkcihkZXYsIHRzdik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgIHNtY3RyX21ha2VfYXV0aF9mdW5jdF9jbGFzcyhkZXYsIHRzdik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgIHNtY3RyX21ha2VfYWNjZXNzX3ByaShkZXYsIHRzdik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKworICAgICAgICAvKiBTdWJ0cmFjdCBvdXQgTVZJRCBhbmQgTVZMIHdoaWNoIGlzCisgICAgICAgICAqIGluY2x1ZGUgaW4gYm90aCB2bCBhbmQgTUFDX0hFQURFUgorICAgICAgICAgKi8KKy8qICAgICAgZmNiLT5mcmFtZV9sZW5ndGggICAgICAgICAgID0gdG1mLT52bCArIHNpemVvZihNQUNfSEVBREVSKSAtIDQ7CisgICAgICAgIGZjYi0+YmRiX3B0ci0+YnVmZmVyX2xlbmd0aCA9IHRtZi0+dmwgKyBzaXplb2YoTUFDX0hFQURFUikgLSA0OworKi8KKyAgICAgICAgdG1mLT52bCA9IFNXQVBfQllURVModG1mLT52bCk7CisKKyAgICAgICAgcmV0dXJuIChzbWN0cl90cmNfc2VuZF9wYWNrZXQoZGV2LCBmY2IsIE1BQ19RVUVVRSkpOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NlbmRfcnB0X3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19IRUFERVIgKnJtZiwKKyAgICAgICAgX191MTYgY29ycmVsYXRvcikKK3sKKyAgICAgICAgTUFDX0hFQURFUiAqdG1mOworICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqdHN2OworICAgICAgICBGQ0Jsb2NrICpmY2I7CisKKyAgICAgICAgaWYoKGZjYiA9IHNtY3RyX2dldF90eF9mY2IoZGV2LCBNQUNfUVVFVUUsIHNpemVvZihNQUNfSEVBREVSKQorCQkrIFNfQ09SUkVMQVRPUiArIFNfUklOR19TVEFUSU9OX1ZFUlNJT05fTlVNQkVSCisJCSsgU19SSU5HX1NUQVRJT05fU1RBVFVTICsgU19TVEFUSU9OX0lERU5USUZFUikpCisJCT09IChGQ0Jsb2NrICopKC0xTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisKKyAgICAgICAgdG1mIAkgICA9IChNQUNfSEVBREVSICopZmNiLT5iZGJfcHRyLT5kYXRhX2Jsb2NrX3B0cjsKKyAgICAgICAgdG1mLT52YyAgICA9IFJQVF9TVEFURTsKKyAgICAgICAgdG1mLT5kY19zYyA9IChybWYtPmRjX3NjICYgU0NfTUFTSykgPDwgNDsKKyAgICAgICAgdG1mLT52bCAgICA9IDQ7CisKKyAgICAgICAgc21jdHJfbWFrZV84MDI1X2hkcihkZXYsIHJtZiwgdG1mLCBBQ19GQ19SUFRfU1RBVEUpOworCisgICAgICAgIHRzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpdG1mICsgc2l6ZW9mKE1BQ19IRUFERVIpKTsKKyAgICAgICAgc21jdHJfbWFrZV9jb3JyKGRldiwgdHN2LCBjb3JyZWxhdG9yKTsKKworICAgICAgICB0bWYtPnZsICs9IHRzdi0+c3ZsOworICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRzdiArIHRzdi0+c3ZsKTsKKyAgICAgICAgc21jdHJfbWFrZV9yaW5nX3N0YXRpb25fdmVyc2lvbihkZXYsIHRzdik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgIHNtY3RyX21ha2VfcmluZ19zdGF0aW9uX3N0YXR1cyhkZXYsIHRzdik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKyAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgIHNtY3RyX21ha2Vfc3RhdGlvbl9pZChkZXYsIHRzdik7CisKKyAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKworICAgICAgICAvKiBTdWJ0cmFjdCBvdXQgTVZJRCBhbmQgTVZMIHdoaWNoIGlzCisgICAgICAgICAqIGluY2x1ZGUgaW4gYm90aCB2bCBhbmQgTUFDX0hFQURFUgorICAgICAgICAgKi8KKy8qICAgICAgZmNiLT5mcmFtZV9sZW5ndGggICAgICAgICAgID0gdG1mLT52bCArIHNpemVvZihNQUNfSEVBREVSKSAtIDQ7CisgICAgICAgIGZjYi0+YmRiX3B0ci0+YnVmZmVyX2xlbmd0aCA9IHRtZi0+dmwgKyBzaXplb2YoTUFDX0hFQURFUikgLSA0OworKi8KKyAgICAgICAgdG1mLT52bCA9IFNXQVBfQllURVModG1mLT52bCk7CisKKyAgICAgICAgcmV0dXJuIChzbWN0cl90cmNfc2VuZF9wYWNrZXQoZGV2LCBmY2IsIE1BQ19RVUVVRSkpOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NlbmRfcnB0X3R4X2ZvcndhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX0hFQURFUiAqcm1mLCBfX3UxNiB0eF9mc3RhdHVzKQoreworICAgICAgICBNQUNfSEVBREVSICp0bWY7CisgICAgICAgIE1BQ19TVUJfVkVDVE9SICp0c3Y7CisgICAgICAgIEZDQmxvY2sgKmZjYjsKKworICAgICAgICBpZigoZmNiID0gc21jdHJfZ2V0X3R4X2ZjYihkZXYsIE1BQ19RVUVVRSwgc2l6ZW9mKE1BQ19IRUFERVIpCisJCSsgU19UUkFOU01JVF9TVEFUVVNfQ09ERSkpID09IChGQ0Jsb2NrICopKC0xTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisKKyAgICAgICAgdG1mIAkgICA9IChNQUNfSEVBREVSICopZmNiLT5iZGJfcHRyLT5kYXRhX2Jsb2NrX3B0cjsKKyAgICAgICAgdG1mLT52YyAgICA9IFJQVF9UWF9GT1JXQVJEOworICAgICAgICB0bWYtPmRjX3NjID0gKHJtZi0+ZGNfc2MgJiBTQ19NQVNLKSA8PCA0OworICAgICAgICB0bWYtPnZsICAgID0gNDsKKworICAgICAgICBzbWN0cl9tYWtlXzgwMjVfaGRyKGRldiwgcm1mLCB0bWYsIEFDX0ZDX1JQVF9UWF9GT1JXQVJEKTsKKworICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRtZiArIHNpemVvZihNQUNfSEVBREVSKSk7CisgICAgICAgIHNtY3RyX21ha2VfdHhfc3RhdHVzX2NvZGUoZGV2LCB0c3YsIHR4X2ZzdGF0dXMpOworCisgICAgICAgIHRtZi0+dmwgKz0gdHN2LT5zdmw7CisKKyAgICAgICAgLyogU3VidHJhY3Qgb3V0IE1WSUQgYW5kIE1WTCB3aGljaCBpcworICAgICAgICAgKiBpbmNsdWRlIGluIGJvdGggdmwgYW5kIE1BQ19IRUFERVIKKyAgICAgICAgICovCisvKiAgICAgIGZjYi0+ZnJhbWVfbGVuZ3RoICAgICAgICAgICA9IHRtZi0+dmwgKyBzaXplb2YoTUFDX0hFQURFUikgLSA0OworICAgICAgICBmY2ItPmJkYl9wdHItPmJ1ZmZlcl9sZW5ndGggPSB0bWYtPnZsICsgc2l6ZW9mKE1BQ19IRUFERVIpIC0gNDsKKyovCisgICAgICAgIHRtZi0+dmwgPSBTV0FQX0JZVEVTKHRtZi0+dmwpOworCisgICAgICAgIHJldHVybihzbWN0cl90cmNfc2VuZF9wYWNrZXQoZGV2LCBmY2IsIE1BQ19RVUVVRSkpOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NlbmRfcnNwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIE1BQ19IRUFERVIgKnJtZiwKKyAgICAgICAgX191MTYgcmNvZGUsIF9fdTE2IGNvcnJlbGF0b3IpCit7CisgICAgICAgIE1BQ19IRUFERVIgKnRtZjsKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnRzdjsKKyAgICAgICAgRkNCbG9jayAqZmNiOworCisgICAgICAgIGlmKChmY2IgPSBzbWN0cl9nZXRfdHhfZmNiKGRldiwgTUFDX1FVRVVFLCBzaXplb2YoTUFDX0hFQURFUikKKwkJKyBTX0NPUlJFTEFUT1IgKyBTX1JFU1BPTlNFX0NPREUpKSA9PSAoRkNCbG9jayAqKSgtMUwpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgfQorCisgICAgICAgIHRtZiAJICAgPSAoTUFDX0hFQURFUiAqKWZjYi0+YmRiX3B0ci0+ZGF0YV9ibG9ja19wdHI7CisgICAgICAgIHRtZi0+dmMgICAgPSBSU1A7CisgICAgICAgIHRtZi0+ZGNfc2MgPSAocm1mLT5kY19zYyAmIFNDX01BU0spIDw8IDQ7CisgICAgICAgIHRtZi0+dmwgICAgPSA0OworCisgICAgICAgIHNtY3RyX21ha2VfODAyNV9oZHIoZGV2LCBybWYsIHRtZiwgQUNfRkNfUlNQKTsKKworICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRtZiArIHNpemVvZihNQUNfSEVBREVSKSk7CisgICAgICAgIHNtY3RyX21ha2VfY29ycihkZXYsIHRzdiwgY29ycmVsYXRvcik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl9zZW5kX3JxX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBNQUNfSEVBREVSICp0bWY7CisgICAgICAgIE1BQ19TVUJfVkVDVE9SICp0c3Y7CisgICAgICAgIEZDQmxvY2sgKmZjYjsKKwl1bnNpZ25lZCBpbnQgaSwgY291bnQgPSAwOworCV9fdTE2IGZzdGF0dXM7CisJaW50IGVycjsKKworICAgICAgICBkbyB7CisgICAgICAgIAlpZigoKGZjYiA9IHNtY3RyX2dldF90eF9mY2IoZGV2LCBNQUNfUVVFVUUsIHNpemVvZihNQUNfSEVBREVSKQorCQkJKyBTX1BST0RVQ1RfSU5TVEFOQ0VfSUQgKyBTX1VQU1RSRUFNX05FSUdIQk9SX0FERFJFU1MKKwkJCSsgU19SSU5HX1NUQVRJT05fVkVSU0lPTl9OVU1CRVIgKyBTX0FERFJFU1NfTU9ESUZFUikpCisJCQk9PSAoRkNCbG9jayAqKSgtMUwpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRtZiAJICAgPSAoTUFDX0hFQURFUiAqKWZjYi0+YmRiX3B0ci0+ZGF0YV9ibG9ja19wdHI7CisgICAgICAgICAgICAgICAgdG1mLT52YyAgICA9IFJRX0lOSVQ7CisgICAgICAgICAgICAgICAgdG1mLT5kY19zYyA9IERDX1JQUyB8IFNDX1JTOworICAgICAgICAgICAgICAgIHRtZi0+dmwgICAgPSA0OworCisgICAgICAgICAgICAgICAgc21jdHJfbWFrZV84MDI1X2hkcihkZXYsIE5VTEwsIHRtZiwgQUNfRkNfUlFfSU5JVCk7CisKKyAgICAgICAgICAgICAgICB0c3YgPSAoTUFDX1NVQl9WRUNUT1IgKikoKF9fdTMyKXRtZiArIHNpemVvZihNQUNfSEVBREVSKSk7CisgICAgICAgICAgICAgICAgc21jdHJfbWFrZV9wcm9kdWN0X2lkKGRldiwgdHN2KTsKKworICAgICAgICAgICAgICAgIHRtZi0+dmwgKz0gdHN2LT5zdmw7CisgICAgICAgICAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgICAgICAgICAgc21jdHJfbWFrZV91cHN0cmVhbV9uZWlnaGJvcl9hZGRyKGRldiwgdHN2KTsKKworICAgICAgICAgICAgICAgIHRtZi0+dmwgKz0gdHN2LT5zdmw7CisgICAgICAgICAgICAgICAgdHN2ID0gKE1BQ19TVUJfVkVDVE9SICopKChfX3UzMil0c3YgKyB0c3YtPnN2bCk7CisgICAgICAgICAgICAgICAgc21jdHJfbWFrZV9yaW5nX3N0YXRpb25fdmVyc2lvbihkZXYsIHRzdik7CisKKyAgICAgICAgICAgICAgICB0bWYtPnZsICs9IHRzdi0+c3ZsOworICAgICAgICAgICAgICAgIHRzdiA9IChNQUNfU1VCX1ZFQ1RPUiAqKSgoX191MzIpdHN2ICsgdHN2LT5zdmwpOworICAgICAgICAgICAgICAgIHNtY3RyX21ha2VfYWRkcl9tb2QoZGV2LCB0c3YpOworCisgICAgICAgICAgICAgICAgdG1mLT52bCArPSB0c3YtPnN2bDsKKworICAgICAgICAgICAgICAgIC8qIFN1YnRyYWN0IG91dCBNVklEIGFuZCBNVkwgd2hpY2ggaXMKKyAgICAgICAgICAgICAgICAgKiBpbmNsdWRlIGluIGJvdGggdmwgYW5kIE1BQ19IRUFERVIKKyAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICBmY2ItPmZyYW1lX2xlbmd0aCAgICAgICAgICAgPSB0bWYtPnZsICsgc2l6ZW9mKE1BQ19IRUFERVIpIC0gNDsKKyAgICAgICAgICAgICAgICBmY2ItPmJkYl9wdHItPmJ1ZmZlcl9sZW5ndGggPSB0bWYtPnZsICsgc2l6ZW9mKE1BQ19IRUFERVIpIC0gNDsKKyovCisgICAgICAgICAgICAgICAgdG1mLT52bCA9IFNXQVBfQllURVModG1mLT52bCk7CisKKyAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfdHJjX3NlbmRfcGFja2V0KGRldiwgZmNiLCBNQUNfUVVFVUUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICAgICAgICAgIC8qIFdhaXQgZm9yIFRyYW5zbWl0IHRvIENvbXBsZXRlICovCisgICAgICAJCWZvcihpID0gMDsgaSA8IDEwMDAwOyBpKyspIAorCQl7CisgICAgICAgICAgCQlpZihmY2ItPmZyYW1lX3N0YXR1cyAmIEZDQl9DT01NQU5EX0RPTkUpCisgICAgICAgICAgICAgIAkJCWJyZWFrOworICAgICAgICAgIAkJbWRlbGF5KDEpOworICAgICAgCQl9CisKKyAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiBHT09EIGZyYW1lIFR4J2VkICovCisgICAgICAgICAgICAgICAgZnN0YXR1cyA9IGZjYi0+ZnJhbWVfc3RhdHVzOworCisgICAgICAgICAgICAgICAgaWYoIShmc3RhdHVzICYgRkNCX0NPTU1BTkRfRE9ORSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEhBUkRXQVJFX0ZBSUxFRCk7CisKKyAgICAgICAgICAgICAgICBpZighKGZzdGF0dXMgJiBGQ0JfVFhfU1RBVFVTX0UpKQorICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKworICAgICAgICAgICAgICAgIC8qIERlLWFsbG9jYXRlZCBUeCBGQ0IgYW5kIEZyYW1lIEJ1ZmZlcgorICAgICAgICAgICAgICAgICAqIFRoZSBGQ0IgbXVzdCBiZSBkZS1hbGxvY2F0ZWQgbWFudWFsbHkgaWYgZXhlY3V0aW5nIHdpdGgKKyAgICAgICAgICAgICAgICAgKiBpbnRlcnJ1cHRzIGRpc2FibGVkLCBvdGhlciB3aXNlIHRoZSBJU1IgKExNX1NlcnZpY2VfRXZlbnRzKQorICAgICAgICAgICAgICAgICAqIHdpbGwgZGUtYWxsb2NhdGUgaXQgd2hlbiB0aGUgaW50ZXJydXB0IG9jY3Vycy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICB0cC0+dHhfcXVldWVfc3RhdHVzW01BQ19RVUVVRV0gPSBOT1RfVFJBTlNNSVRJTkc7CisgICAgICAgICAgICAgICAgc21jdHJfdXBkYXRlX3R4X2NoYWluKGRldiwgZmNiLCBNQUNfUVVFVUUpOworICAgICAgICB9IHdoaWxlKGNvdW50IDwgNCAmJiAoKGZzdGF0dXMgJiBGQ0JfVFhfQUNfQklUUykgXiBGQ0JfVFhfQUNfQklUUykpOworCisJcmV0dXJuIChzbWN0cl9qb2luX2NvbXBsZXRlX3N0YXRlKGRldikpOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NlbmRfdHhfZm9yd2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfSEVBREVSICpybWYsCisgICAgICAgIF9fdTE2ICp0eF9mc3RhdHVzKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIEZDQmxvY2sgKmZjYjsKKyAgICAgICAgdW5zaWduZWQgaW50IGk7CisJaW50IGVycjsKKworICAgICAgICAvKiBDaGVjayBpZiB0aGlzIGlzIHRoZSBFTkQgUE9JTlQgb2YgdGhlIFRyYW5zbWl0IEZvcndhcmQgQ2hhaW4uICovCisgICAgICAgIGlmKHJtZi0+dmwgPD0gMTgpCisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKworICAgICAgICAvKiBBbGxvY2F0ZSBUcmFuc21pdCBGQ0Igb25seSBieSByZXF1ZXN0aW5nIDAgYnl0ZXMKKyAgICAgICAgICogb2YgZGF0YSBidWZmZXIuCisgICAgICAgICAqLworICAgICAgICBpZigoZmNiID0gc21jdHJfZ2V0X3R4X2ZjYihkZXYsIE1BQ19RVUVVRSwgMCkpID09IChGQ0Jsb2NrICopKC0xTCkpCisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKworICAgICAgICAvKiBTZXQgcG9pbnRlciB0byBUcmFuc21pdCBGcmFtZSBCdWZmZXIgdG8gdGhlIGRhdGEKKyAgICAgICAgICogcG9ydGlvbiBvZiB0aGUgcmVjZWl2ZWQgVFggRm9yd2FyZCBmcmFtZSwgbWFraW5nCisgICAgICAgICAqIHN1cmUgdG8gc2tpcCBvdmVyIHRoZSBWZWN0b3IgQ29kZSAodmMpIGFuZCBWZWN0b3IKKyAgICAgICAgICogbGVuZ3RoICh2bCkuCisgICAgICAgICAqLworICAgICAgICBmY2ItPmJkYl9wdHItPnRyY19kYXRhX2Jsb2NrX3B0ciA9IFRSQ19QT0lOVEVSKChfX3UzMilybWYgCisJCSsgc2l6ZW9mKE1BQ19IRUFERVIpICsgMik7CisgICAgICAgIGZjYi0+YmRiX3B0ci0+ZGF0YV9ibG9ja19wdHIgICAgID0gKF9fdTE2ICopKChfX3UzMilybWYgCisJCSsgc2l6ZW9mKE1BQ19IRUFERVIpICsgMik7CisKKyAgICAgICAgZmNiLT5mcmFtZV9sZW5ndGggICAgICAgICAgICAgICAgPSBybWYtPnZsIC0gNCAtIDI7CisgICAgICAgIGZjYi0+YmRiX3B0ci0+YnVmZmVyX2xlbmd0aCAgICAgID0gcm1mLT52bCAtIDQgLSAyOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl90cmNfc2VuZF9wYWNrZXQoZGV2LCBmY2IsIE1BQ19RVUVVRSkpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICAvKiBXYWl0IGZvciBUcmFuc21pdCB0byBDb21wbGV0ZSAqLworICAgCWZvcihpID0gMDsgaSA8IDEwMDAwOyBpKyspIAorCXsKKyAgICAgICAJCWlmKGZjYi0+ZnJhbWVfc3RhdHVzICYgRkNCX0NPTU1BTkRfRE9ORSkKKyAgICAgICAgICAgCQlicmVhazsKKyAgICAgICAgCW1kZWxheSgxKTsKKyAgIAl9CisKKyAgICAgICAgLyogQ2hlY2sgaWYgR09PRCBmcmFtZSBUeCdlZCAqLworICAgICAgICBpZighKGZjYi0+ZnJhbWVfc3RhdHVzICYgRkNCX0NPTU1BTkRfRE9ORSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfcmVzdW1lX3R4X2ZjYl9jbWQoZGV2LCBNQUNfUVVFVUUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgCQlmb3IoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSAKKwkJeworICAgICAgICAgIAkJaWYoZmNiLT5mcmFtZV9zdGF0dXMgJiBGQ0JfQ09NTUFORF9ET05FKQorICAgICAgICAgICAgICAJCQlicmVhazsKKyAgICAgICAgCQltZGVsYXkoMSk7CisgICAgICAJCX0KKworICAgICAgICAgICAgICAgIGlmKCEoZmNiLT5mcmFtZV9zdGF0dXMgJiBGQ0JfQ09NTUFORF9ET05FKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoSEFSRFdBUkVfRkFJTEVEKTsKKyAgICAgICAgfQorCisgICAgICAgICp0eF9mc3RhdHVzID0gZmNiLT5mcmFtZV9zdGF0dXM7CisKKyAgICAgICAgcmV0dXJuIChBX0ZSQU1FX1dBU19GT1JXQVJERUQpOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NldF9hdXRoX2FjY2Vzc19wcmkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnJzdikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIGlmKHJzdi0+c3ZsICE9IFNfQVVUSE9SSVpFRF9BQ0NFU1NfUFJJT1JJVFkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChFX1NVQl9WRUNUT1JfTEVOR1RIX0VSUk9SKTsKKworICAgICAgICB0cC0+YXV0aG9yaXplZF9hY2Nlc3NfcHJpb3JpdHkgPSAocnN2LT5zdnZbMF0gPDwgOCB8IHJzdi0+c3Z2WzFdKTsKKworICAgICAgICByZXR1cm4gKFBPU0lUSVZFX0FDSyk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2V0X2F1dGhfZnVuY3RfY2xhc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgTUFDX1NVQl9WRUNUT1IgKnJzdikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIGlmKHJzdi0+c3ZsICE9IFNfQVVUSE9SSVpFRF9GVU5DVElPTl9DTEFTUykKKyAgICAgICAgICAgICAgICByZXR1cm4gKEVfU1VCX1ZFQ1RPUl9MRU5HVEhfRVJST1IpOworCisgICAgICAgIHRwLT5hdXRob3JpemVkX2Z1bmN0aW9uX2NsYXNzZXMgPSAocnN2LT5zdnZbMF0gPDwgOCB8IHJzdi0+c3Z2WzFdKTsKKworICAgICAgICByZXR1cm4gKFBPU0lUSVZFX0FDSyk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2V0X2NvcnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgTUFDX1NVQl9WRUNUT1IgKnJzdiwKKyAgICAgICAgX191MTYgKmNvcnJlbGF0b3IpCit7CisgICAgICAgIGlmKHJzdi0+c3ZsICE9IFNfQ09SUkVMQVRPUikKKyAgICAgICAgICAgICAgICByZXR1cm4gKEVfU1VCX1ZFQ1RPUl9MRU5HVEhfRVJST1IpOworCisgICAgICAgICpjb3JyZWxhdG9yID0gKHJzdi0+c3Z2WzBdIDw8IDggfCByc3YtPnN2dlsxXSk7CisKKyAgICAgICAgcmV0dXJuIChQT1NJVElWRV9BQ0spOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NldF9lcnJvcl90aW1lcl92YWx1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqcnN2KQoreworCV9fdTE2IGVycl90dmFsOworCWludCBlcnI7CisKKyAgICAgICAgaWYocnN2LT5zdmwgIT0gU19FUlJPUl9USU1FUl9WQUxVRSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKEVfU1VCX1ZFQ1RPUl9MRU5HVEhfRVJST1IpOworCisgICAgICAgIGVycl90dmFsID0gKHJzdi0+c3Z2WzBdIDw8IDggfCByc3YtPnN2dlsxXSkqMTA7CisKKyAgICAgICAgc21jdHJfaXNzdWVfd3JpdGVfd29yZF9jbWQoZGV2LCBSV19URVJfVEhSRVNIT0xELCAmZXJyX3R2YWwpOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl93YWl0X2NtZChkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgcmV0dXJuIChQT1NJVElWRV9BQ0spOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NldF9mcmFtZV9mb3J3YXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgICAgICAgIE1BQ19TVUJfVkVDVE9SICpyc3YsIF9fdTggZGNfc2MpCit7CisgICAgICAgIGlmKChyc3YtPnN2bCA8IDIpIHx8IChyc3YtPnN2bCA+IFNfRlJBTUVfRk9SV0FSRCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChFX1NVQl9WRUNUT1JfTEVOR1RIX0VSUk9SKTsKKworICAgICAgICBpZigoZGNfc2MgJiBEQ19NQVNLKSAhPSBEQ19DUlMpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihyc3YtPnN2bCA+PSAyICYmIHJzdi0+c3ZsIDwgMjApCisgICAgICAgICAgICAgICAgCXJldHVybiAoRV9UUkFOU01JVF9GT1JXQVJEX0lOVkFMSUQpOworCisgICAgICAgICAgICAgICAgaWYoKHJzdi0+c3Z2WzBdICE9IDApIHx8IChyc3YtPnN2dlsxXSAhPSAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRV9UUkFOU01JVF9GT1JXQVJEX0lOVkFMSUQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChQT1NJVElWRV9BQ0spOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NldF9sb2NhbF9yaW5nX251bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBNQUNfU1VCX1ZFQ1RPUiAqcnN2KQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICAgICAgaWYocnN2LT5zdmwgIT0gU19MT0NBTF9SSU5HX05VTUJFUikKKyAgICAgICAgICAgICAgICByZXR1cm4gKEVfU1VCX1ZFQ1RPUl9MRU5HVEhfRVJST1IpOworCisgICAgICAgIGlmKHRwLT5wdHJfbG9jYWxfcmluZ19udW0pCisgICAgICAgICAgICAgICAgKihfX3UxNiAqKSh0cC0+cHRyX2xvY2FsX3JpbmdfbnVtKSAKKwkJCT0gKHJzdi0+c3Z2WzBdIDw8IDggfCByc3YtPnN2dlsxXSk7CisKKyAgICAgICAgcmV0dXJuIChQT1NJVElWRV9BQ0spOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc21jdHJfc2V0X2N0cmxfYXR0ZW50aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisgICAgICAgIGlmKHRwLT5iaWNfdHlwZSA9PSBCSUNfNTg1X0NISVApCisgICAgICAgICAgICAgICAgb3V0YigodHAtPnRyY19tYXNrIHwgSFdSX0NBKSwgaW9hZGRyICsgSFdSKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0YigodHAtPnRyY19tYXNrIHwgQ1NSX0NBKSwgaW9hZGRyICsgQ1NSKTsKKyAgICAgICAgICAgICAgICBvdXRiKHRwLT50cmNfbWFzaywgaW9hZGRyICsgQ1NSKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNtY3RyX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDEwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogc21jdHJfc2V0X211bHRpY2FzdF9saXN0XG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIHJldHVybjsKK30KKworc3RhdGljIGludCBzbWN0cl9zZXRfcGFnZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3U4ICpidWYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgX191OCBhbWFzazsKKyAgICAgICAgX191MzIgdHB0cjsKKworICAgICAgICB0cHRyID0gKF9fdTMyKWJ1ZiAtIChfX3UzMil0cC0+cmFtX2FjY2VzczsKKyAgICAgICAgYW1hc2sgPSAoX191OCkoKHRwdHIgJiBQUl9QQUdFX01BU0spID4+IDgpOworICAgICAgICBvdXRiKGFtYXNrLCBkZXYtPmJhc2VfYWRkciArIFBSKTsKKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX3NldF9waHlfZHJvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBNQUNfU1VCX1ZFQ1RPUiAqcnN2KQoreworCWludCBlcnI7CisKKyAgICAgICAgaWYocnN2LT5zdmwgIT0gU19QSFlTSUNBTF9EUk9QKQorICAgICAgICAgICAgICAgIHJldHVybiAoRV9TVUJfVkVDVE9SX0xFTkdUSF9FUlJPUik7CisKKyAgICAgICAgc21jdHJfaXNzdWVfd3JpdGVfYnl0ZV9jbWQoZGV2LCBSV19QSFlTSUNBTF9EUk9QX05VTUJFUiwgJnJzdi0+c3Z2WzBdKTsKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfY21kKGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICByZXR1cm4gKFBPU0lUSVZFX0FDSyk7Cit9CisKKy8qIFJlc2V0IHRoZSByaW5nIHNwZWVkIHRvIHRoZSBvcHBvc2l0ZSBvZiB3aGF0IGl0IHdhcy4gVGhpcyBhdXRvLXBpbG90CisgKiBtb2RlIHJlcXVpcmVzIGEgY29tcGxldGUgcmVzZXQgYW5kIHJlLWluaXQgb2YgdGhlIGFkYXB0ZXIuCisgKi8KK3N0YXRpYyBpbnQgc21jdHJfc2V0X3Jpbmdfc3BlZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnI7CisKKyAgICAgICAgaWYodHAtPm1lZGlhX3R5cGUgPT0gTUVESUFfVVRQXzE2KQorICAgICAgICAgICAgICAgIHRwLT5tZWRpYV90eXBlID0gTUVESUFfVVRQXzQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0cC0+bWVkaWFfdHlwZSA9IE1FRElBX1VUUF8xNjsKKworICAgICAgICBzbWN0cl9lbmFibGVfMTZiaXQoZGV2KTsKKworICAgICAgICAvKiBSZS1Jbml0aWFsaXplIGFkYXB0ZXIncyBpbnRlcm5hbCByZWdpc3RlcnMgKi8KKyAgICAgICAgc21jdHJfcmVzZXRfYWRhcHRlcihkZXYpOworCisgICAgICAgIGlmKChlcnIgPSBzbWN0cl9pbml0X2NhcmRfcmVhbChkZXYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycik7CisKKyAgICAgICAgc21jdHJfZW5hYmxlX2JpY19pbnQoZGV2KTsKKworICAgICAgICBpZigoZXJyID0gc21jdHJfaXNzdWVfZW5hYmxlX2ludF9jbWQoZGV2LCBUUkNfSU5URVJSVVBUX0VOQUJMRV9NQVNLKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIHNtY3RyX2Rpc2FibGVfMTZiaXQoZGV2KTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2V0X3J4X2xvb2tfYWhlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBfX3UxNiBzd29yZCwgcndvcmQ7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX3NldF9yeF9sb29rX2FoZWFkX2ZsYWdcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgdHAtPmFkYXB0ZXJfZmxhZ3MgJj0gfihGT1JDRURfMTZCSVRfTU9ERSk7CisgICAgICAgIHRwLT5hZGFwdGVyX2ZsYWdzIHw9IFJYX1ZBTElEX0xPT0tBSEVBRDsKKworICAgICAgICBpZih0cC0+YWRhcHRlcl9idXMgPT0gQlVTX0lTQTE2X1RZUEUpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd29yZCA9ICooKF9fdTE2ICopKHRwLT5yYW1fYWNjZXNzKSk7CisgICAgICAgICAgICAgICAgKigoX191MTYgKikodHAtPnJhbV9hY2Nlc3MpKSA9IDB4MTIzNDsKKworICAgICAgICAgICAgICAgIHNtY3RyX2Rpc2FibGVfMTZiaXQoZGV2KTsKKyAgICAgICAgICAgICAgICByd29yZCA9ICooKF9fdTE2ICopKHRwLT5yYW1fYWNjZXNzKSk7CisgICAgICAgICAgICAgICAgc21jdHJfZW5hYmxlXzE2Yml0KGRldik7CisKKyAgICAgICAgICAgICAgICBpZihyd29yZCAhPSAweDEyMzQpCisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+YWRhcHRlcl9mbGFncyB8PSBGT1JDRURfMTZCSVRfTU9ERTsKKworICAgICAgICAgICAgICAgICooKF9fdTE2ICopKHRwLT5yYW1fYWNjZXNzKSkgPSBzd29yZDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfc2V0X3RyY19yZXNldChpbnQgaW9hZGRyKQoreworICAgICAgICBfX3U4IHI7CisKKyAgICAgICAgciA9IGluYihpb2FkZHIgKyBNU1IpOworICAgICAgICBvdXRiKE1TUl9SU1QgfCByLCBpb2FkZHIgKyBNU1IpOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgaWYgdGhlIGFkYXB0ZXIgaXMgYnVzeSBvciBub3QuCisgKi8KK3N0YXRpYyBpbnQgc21jdHJfc2V0dXBfc2luZ2xlX2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBfX3UxNiBjb21tYW5kLCBfX3UxNiBzdWJjb21tYW5kKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCBlcnI7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX3NldHVwX3NpbmdsZV9jbWRcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgaWYoKGVyciA9IHNtY3RyX3dhaXRfd2hpbGVfY2J1c3koZGV2KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnIpOworCisgICAgICAgIGlmKChlcnIgPSAodW5zaWduZWQgaW50KXNtY3RyX3dhaXRfY21kKGRldikpKQorICAgICAgICAgICAgICAgIHJldHVybiAoZXJyKTsKKworICAgICAgICB0cC0+YWNiX2hlYWQtPmNtZF9kb25lX3N0YXR1cyAgID0gMDsKKyAgICAgICAgdHAtPmFjYl9oZWFkLT5jbWQgICAgICAgICAgICAgICA9IGNvbW1hbmQ7CisgICAgICAgIHRwLT5hY2JfaGVhZC0+c3ViY21kICAgICAgICAgICAgPSBzdWJjb21tYW5kOworCisgICAgICAgIGVyciA9IHNtY3RyX2lzc3VlX3Jlc3VtZV9hY2JfY21kKGRldik7CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBjYW4gbm90IGJlIGNhbGxlZCB3aXRoIHRoZSBhZGFwdGVyIGJ1c3kuCisgKi8KK3N0YXRpYyBpbnQgc21jdHJfc2V0dXBfc2luZ2xlX2NtZF93X2RhdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgX191MTYgY29tbWFuZCwgX191MTYgc3ViY29tbWFuZCkKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIHRwLT5hY2JfaGVhZC0+Y21kX2RvbmVfc3RhdHVzICAgPSBBQ0JfQ09NTUFORF9OT1RfRE9ORTsKKyAgICAgICAgdHAtPmFjYl9oZWFkLT5jbWQgICAgICAgICAgICAgICA9IGNvbW1hbmQ7CisgICAgICAgIHRwLT5hY2JfaGVhZC0+c3ViY21kICAgICAgICAgICAgPSBzdWJjb21tYW5kOworICAgICAgICB0cC0+YWNiX2hlYWQtPmRhdGFfb2Zmc2V0X2xvCisgICAgICAgICAgICAgICAgPSAoX191MTYpVFJDX1BPSU5URVIodHAtPm1pc2NfY29tbWFuZF9kYXRhKTsKKworICAgICAgICByZXR1cm4oc21jdHJfaXNzdWVfcmVzdW1lX2FjYl9jbWQoZGV2KSk7Cit9CisKK3N0YXRpYyBjaGFyICpzbWN0cl9tYWxsb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgc2l6ZSkKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBjaGFyICptOworCisgICAgICAgIG0gPSAoY2hhciAqKSh0cC0+cmFtX2FjY2VzcyArIHRwLT5zaF9tZW1fdXNlZCk7CisgICAgICAgIHRwLT5zaF9tZW1fdXNlZCArPSAoX191MzIpc2l6ZTsKKworICAgICAgICByZXR1cm4gKG0pOworfQorCitzdGF0aWMgaW50IHNtY3RyX3N0YXR1c19jaGcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl9zdGF0dXNfY2hnXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIHN3aXRjaCh0cC0+c3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBPUEVOOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIENMT1NFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLyogSW50ZXJydXB0IGRyaXZlbiBvcGVuKCkgY29tcGxldGlvbi4gWFhYICovCisgICAgICAgICAgICAgICAgY2FzZSBJTklUSUFMSVpFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5ncm91cF9hZGRyZXNzXzAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmdyb3VwX2FkZHJlc3NbMF0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmdyb3VwX2FkZHJlc3NbMV0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmZ1bmN0aW9uYWxfYWRkcmVzc18wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5mdW5jdGlvbmFsX2FkZHJlc3NbMF0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdHAtPmZ1bmN0aW9uYWxfYWRkcmVzc1sxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBzbWN0cl9vcGVuX3RyKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogc3RhdHVzIGNoYW5nZSB1bmtub3duICV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIHRwLT5zdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IHNtY3RyX3RyY19zZW5kX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBGQ0Jsb2NrICpmY2IsCisgICAgICAgIF9fdTE2IHF1ZXVlKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIGludCBlcnIgPSAwOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl90cmNfc2VuZF9wYWNrZXRcbiIsIGRldi0+bmFtZSk7CisKKyAgICAgICAgZmNiLT5pbmZvID0gRkNCX0NIQUlOX0VORCB8IEZDQl9FTkFCTEVfVEZTOworICAgICAgICBpZih0cC0+bnVtX3R4X2ZjYnNbcXVldWVdICE9IDEpCisgICAgICAgICAgICAgICAgZmNiLT5iYWNrX3B0ci0+aW5mbyA9IEZDQl9JTlRFUlJVUFRfRU5BQkxFIHwgRkNCX0VOQUJMRV9URlM7CisKKyAgICAgICAgaWYodHAtPnR4X3F1ZXVlX3N0YXR1c1txdWV1ZV0gPT0gTk9UX1RSQU5TTUlUSU5HKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgdHAtPnR4X3F1ZXVlX3N0YXR1c1txdWV1ZV0gPSBUUkFOU01JVElORzsKKyAgICAgICAgICAgICAgICBlcnIgPSBzbWN0cl9pc3N1ZV9yZXN1bWVfdHhfZmNiX2NtZChkZXYsIHF1ZXVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoZXJyKTsKK30KKworc3RhdGljIF9fdTE2IHNtY3RyX3R4X2NvbXBsZXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IHF1ZXVlKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIF9fdTE2IHN0YXR1cywgZXJyID0gMDsKKyAgICAgICAgaW50IGNzdGF0dXM7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX3R4X2NvbXBsZXRlXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIHdoaWxlKChzdGF0dXMgPSB0cC0+dHhfZmNiX2VuZFtxdWV1ZV0tPmZyYW1lX3N0YXR1cykgIT0gU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHN0YXR1cyAmIDB4N2UwMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gSEFSRFdBUkVfRkFJTEVEOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoKGVyciA9IHNtY3RyX3VwZGF0ZV90eF9jaGFpbihkZXYsIHRwLT50eF9mY2JfZW5kW3F1ZXVlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlKSkgIT0gU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgc21jdHJfZGlzYWJsZV8xNmJpdChkZXYpOworCisgICAgICAgICAgICAgICAgaWYodHAtPm1vZGVfYml0cyAmIFVNQUMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShzdGF0dXMgJiAoRkNCX1RYX1NUQVRVU19BUjEgfCBGQ0JfVFhfU1RBVFVTX0FSMikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RhdHVzID0gTk9fU1VDSF9ERVNUSU5BVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShzdGF0dXMgJiAoRkNCX1RYX1NUQVRVU19DUjEgfCBGQ0JfVFhfU1RBVFVTX0NSMikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdGF0dXMgPSBERVNUX09VVF9PRl9SRVNPVVJDRVM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0YXR1cyAmIEZDQl9UWF9TVEFUVVNfRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdGF0dXMgPSBNQVhfQ09MTElTSU9OUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RhdHVzID0gU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjc3RhdHVzID0gU1VDQ0VTUzsKKworICAgICAgICAgICAgICAgIGlmKHF1ZXVlID09IEJVR19RVUVVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IFNVQ0NFU1M7CisKKyAgICAgICAgICAgICAgICBzbWN0cl9lbmFibGVfMTZiaXQoZGV2KTsKKyAgICAgICAgICAgICAgICBpZihlcnIgIT0gU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChlcnIpOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc21jdHJfdHhfbW92ZV9mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX3U4ICpwYnVmZiwgdW5zaWduZWQgaW50IGJ5dGVzKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHVuc2lnbmVkIGludCByYW1fdXNhYmxlOworICAgICAgICBfX3UzMiBmbGVuLCBsZW4sIG9mZnNldCA9IDA7CisgICAgICAgIF9fdTggKmZyYWcsICpwYWdlOworCisgICAgICAgIGlmKHNtY3RyX2RlYnVnID4gMTApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzbWN0cl90eF9tb3ZlX2ZyYW1lXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIHJhbV91c2FibGUgPSAoKHVuc2lnbmVkIGludCl0cC0+cmFtX3VzYWJsZSkgPDwgMTA7CisgICAgICAgIGZyYWcgICAgICAgPSBza2ItPmRhdGE7CisgICAgICAgIGZsZW4gICAgICAgPSBza2ItPmxlbjsKKworICAgICAgICB3aGlsZShmbGVuID4gMCAmJiBieXRlcyA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbWN0cl9zZXRfcGFnZShkZXYsIHBidWZmKTsKKworICAgICAgICAgICAgICAgIG9mZnNldCA9IFNNQ19QQUdFX09GRlNFVChwYnVmZik7CisKKyAgICAgICAgICAgICAgICBpZihvZmZzZXQgKyBmbGVuID4gcmFtX3VzYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHJhbV91c2FibGUgLSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gZmxlbjsKKworICAgICAgICAgICAgICAgIGlmKGxlbiA+IGJ5dGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gYnl0ZXM7CisKKyAgICAgICAgICAgICAgICBwYWdlID0gKGNoYXIgKikgKG9mZnNldCArIHRwLT5yYW1fYWNjZXNzKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocGFnZSwgZnJhZywgbGVuKTsKKworICAgICAgICAgICAgICAgIGZsZW4gLT1sZW47CisgICAgICAgICAgICAgICAgYnl0ZXMgLT0gbGVuOworICAgICAgICAgICAgICAgIGZyYWcgKz0gbGVuOworICAgICAgICAgICAgICAgIHBidWZmICs9IGxlbjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKKy8qIFVwZGF0ZSB0aGUgZXJyb3Igc3RhdGlzdGljIGNvdW50ZXJzIGZvciB0aGlzIGFkYXB0ZXIuICovCitzdGF0aWMgaW50IHNtY3RyX3VwZGF0ZV9lcnJfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICBzdHJ1Y3QgdHJfc3RhdGlzdGljcyAqdHN0YXQgPSAmdHAtPk1hY1N0YXQ7CisKKyAgICAgICAgaWYodHN0YXQtPmludGVybmFsX2Vycm9ycykKKyAgICAgICAgICAgICAgICB0c3RhdC0+aW50ZXJuYWxfZXJyb3JzCisgICAgICAgICAgICAgICAgICAgICAgICArPSAqKHRwLT5taXNjX2NvbW1hbmRfZGF0YSArIDApICYgMHgwMGZmOworCisgICAgICAgIGlmKHRzdGF0LT5saW5lX2Vycm9ycykKKyAgICAgICAgICAgICAgICB0c3RhdC0+bGluZV9lcnJvcnMgKz0gKih0cC0+bWlzY19jb21tYW5kX2RhdGEgKyAwKSA+PiA4OworCisgICAgICAgIGlmKHRzdGF0LT5BX0NfZXJyb3JzKQorICAgICAgICAgICAgICAgIHRzdGF0LT5BX0NfZXJyb3JzICs9ICoodHAtPm1pc2NfY29tbWFuZF9kYXRhICsgMSkgJiAweDAwZmY7CisKKyAgICAgICAgaWYodHN0YXQtPmJ1cnN0X2Vycm9ycykKKyAgICAgICAgICAgICAgICB0c3RhdC0+YnVyc3RfZXJyb3JzICs9ICoodHAtPm1pc2NfY29tbWFuZF9kYXRhICsgMSkgPj4gODsKKworICAgICAgICBpZih0c3RhdC0+YWJvcnRfZGVsaW1pdGVycykKKyAgICAgICAgICAgICAgICB0c3RhdC0+YWJvcnRfZGVsaW1pdGVycyArPSAqKHRwLT5taXNjX2NvbW1hbmRfZGF0YSArIDIpID4+IDg7CisKKyAgICAgICAgaWYodHN0YXQtPnJlY3ZfY29uZ2VzdF9jb3VudCkKKyAgICAgICAgICAgICAgICB0c3RhdC0+cmVjdl9jb25nZXN0X2NvdW50CisgICAgICAgICAgICAgICAgICAgICAgICArPSAqKHRwLT5taXNjX2NvbW1hbmRfZGF0YSArIDMpICYgMHgwMGZmOworCisgICAgICAgIGlmKHRzdGF0LT5sb3N0X2ZyYW1lcykKKyAgICAgICAgICAgICAgICB0c3RhdC0+bG9zdF9mcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICs9ICoodHAtPm1pc2NfY29tbWFuZF9kYXRhICsgMykgPj4gODsKKworICAgICAgICBpZih0c3RhdC0+ZnJlcXVlbmN5X2Vycm9ycykKKyAgICAgICAgICAgICAgICB0c3RhdC0+ZnJlcXVlbmN5X2Vycm9ycyArPSAqKHRwLT5taXNjX2NvbW1hbmRfZGF0YSArIDQpICYgMHgwMGZmOworCisgICAgICAgIGlmKHRzdGF0LT5mcmFtZV9jb3BpZWRfZXJyb3JzKQorICAgICAgICAgICAgICAgICB0c3RhdC0+ZnJhbWVfY29waWVkX2Vycm9ycworICAgICAgICAgICAgICAgICAgICAgICAgKz0gKih0cC0+bWlzY19jb21tYW5kX2RhdGEgKyA0KSA+PiA4OworCisgICAgICAgIGlmKHRzdGF0LT50b2tlbl9lcnJvcnMpCisgICAgICAgICAgICAgICAgdHN0YXQtPnRva2VuX2Vycm9ycyArPSAqKHRwLT5taXNjX2NvbW1hbmRfZGF0YSArIDUpID4+IDg7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl91cGRhdGVfcnhfY2hhaW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MTYgcXVldWUpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgRkNCbG9jayAqZmNiOworICAgICAgICBCREJsb2NrICpiZGI7CisgICAgICAgIF9fdTE2IHNpemUsIGxlbjsKKworICAgICAgICBmY2IgPSB0cC0+cnhfZmNiX2N1cnJbcXVldWVdOworICAgICAgICBsZW4gPSBmY2ItPmZyYW1lX2xlbmd0aDsKKworICAgICAgICBmY2ItPmZyYW1lX3N0YXR1cyA9IDA7CisgICAgICAgIGZjYi0+aW5mbyA9IEZDQl9DSEFJTl9FTkQ7CisgICAgICAgIGZjYi0+YmFja19wdHItPmluZm8gPSBGQ0JfV0FSTklORzsKKworICAgICAgICB0cC0+cnhfZmNiX2N1cnJbcXVldWVdID0gdHAtPnJ4X2ZjYl9jdXJyW3F1ZXVlXS0+bmV4dF9wdHI7CisKKyAgICAgICAgLyogdXBkYXRlIFJYIEJEQnMgKi8KKyAgICAgICAgc2l6ZSA9IChsZW4gPj4gUlhfQkRCX1NJWkVfU0hJRlQpOworICAgICAgICBpZihsZW4gJiBSWF9EQVRBX0JVRkZFUl9TSVpFX01BU0spCisgICAgICAgICAgICAgICAgc2l6ZSArPSBzaXplb2YoQkRCbG9jayk7CisgICAgICAgIHNpemUgJj0gKH5SWF9CREJfU0laRV9NQVNLKTsKKworICAgICAgICAvKiBjaGVjayBpZiB3cmFwIGFyb3VuZCAqLworICAgICAgICBiZGIgPSAoQkRCbG9jayAqKSgoX191MzIpKHRwLT5yeF9iZGJfY3VycltxdWV1ZV0pICsgKF9fdTMyKShzaXplKSk7CisgICAgICAgIGlmKChfX3UzMiliZGIgPj0gKF9fdTMyKXRwLT5yeF9iZGJfZW5kW3F1ZXVlXSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIGJkYiA9IChCREJsb2NrICopKChfX3UzMikodHAtPnJ4X2JkYl9oZWFkW3F1ZXVlXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKF9fdTMyKShiZGIpIC0gKF9fdTMyKSh0cC0+cnhfYmRiX2VuZFtxdWV1ZV0pKTsKKyAgICAgICAgfQorCisgICAgICAgIGJkYi0+YmFja19wdHItPmluZm8gPSBCREJfQ0hBSU5fRU5EOworICAgICAgICB0cC0+cnhfYmRiX2N1cnJbcXVldWVdLT5iYWNrX3B0ci0+aW5mbyA9IEJEQl9OT1RfQ0hBSU5fRU5EOworICAgICAgICB0cC0+cnhfYmRiX2N1cnJbcXVldWVdID0gYmRiOworCisgICAgICAgIHJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfdXBkYXRlX3R4X2NoYWluKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIEZDQmxvY2sgKmZjYiwKKyAgICAgICAgX191MTYgcXVldWUpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgICAgICBpZihzbWN0cl9kZWJ1ZyA+IDIwKQorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJzbWN0cl91cGRhdGVfdHhfY2hhaW5cbiIpOworCisgICAgICAgIGlmKHRwLT5udW1fdHhfZmNic191c2VkW3F1ZXVlXSA8PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAoSEFSRFdBUkVfRkFJTEVEKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYodHAtPnR4X2J1ZmZfdXNlZFtxdWV1ZV0gPCBmY2ItPm1lbW9yeV9hbGxvYykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+dHhfYnVmZl91c2VkW3F1ZXVlXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEhBUkRXQVJFX0ZBSUxFRCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdHAtPnR4X2J1ZmZfdXNlZFtxdWV1ZV0gLT0gZmNiLT5tZW1vcnlfYWxsb2M7CisKKyAgICAgICAgICAgICAgICAvKiBpZiBhbGwgdHJhbnNtaXQgYnVmZmVyIGFyZSBjbGVhcmVkCisgICAgICAgICAgICAgICAgICogbmVlZCB0byBzZXQgdGhlIHR4X2J1ZmZfY3VycltdIHRvIHR4X2J1ZmZfaGVhZFtdCisgICAgICAgICAgICAgICAgICogb3RoZXJ3aXNlLCB0eCBidWZmZXIgd2lsbCBiZSBzZWdyZWdhdGUgYW5kIGNhbm5vdAorICAgICAgICAgICAgICAgICAqIGFjY29tbW9kYXRlIGFuZCBidWZmZXIgZ3JlYXRlciB0aGFuIChjdXJyIC0gaGVhZCkgYW5kCisgICAgICAgICAgICAgICAgICogKGVuZCAtIGN1cnIpIHNpbmNlIHdlIGRvIG5vdCBhbGxvdyB3cmFwIGFyb3VuZCBhbGxvY2F0aW9uLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmKHRwLT50eF9idWZmX3VzZWRbcXVldWVdID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB0cC0+dHhfYnVmZl9jdXJyW3F1ZXVlXSA9IHRwLT50eF9idWZmX2hlYWRbcXVldWVdOworCisgICAgICAgICAgICAgICAgdHAtPm51bV90eF9mY2JzX3VzZWRbcXVldWVdLS07CisgICAgICAgICAgICAgICAgZmNiLT5mcmFtZV9zdGF0dXMgPSAwOworICAgICAgICAgICAgICAgIHRwLT50eF9mY2JfZW5kW3F1ZXVlXSA9IGZjYi0+bmV4dF9wdHI7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9Cit9CisKK3N0YXRpYyBpbnQgc21jdHJfd2FpdF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgICAgICB1bnNpZ25lZCBpbnQgbG9vcF9jb3VudCA9IDB4MjAwMDA7CisKKyAgICAgICAgaWYoc21jdHJfZGVidWcgPiAxMCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHNtY3RyX3dhaXRfY21kXG4iLCBkZXYtPm5hbWUpOworCisgICAgICAgIHdoaWxlKGxvb3BfY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZih0cC0+YWNiX2hlYWQtPmNtZF9kb25lX3N0YXR1cyAmIEFDQl9DT01NQU5EX0RPTkUpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJdWRlbGF5KDEpOworICAgICAgICAgICAgICAgIGxvb3BfY291bnQtLTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGxvb3BfY291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4oSEFSRFdBUkVfRkFJTEVEKTsKKworICAgICAgICBpZih0cC0+YWNiX2hlYWQtPmNtZF9kb25lX3N0YXR1cyAmIDB4ZmYpCisgICAgICAgICAgICAgICAgcmV0dXJuKEhBUkRXQVJFX0ZBSUxFRCk7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBzbWN0cl93YWl0X3doaWxlX2NidXN5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgdW5zaWduZWQgaW50IHRpbWVvdXQgPSAweDIwMDAwOworICAgICAgICBpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisgICAgICAgIF9fdTggcjsKKworICAgICAgICBpZih0cC0+YmljX3R5cGUgPT0gQklDXzU4NV9DSElQKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUodGltZW91dCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByID0gaW5iKGlvYWRkciArIEhXUik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZigociAmIEhXUl9DQlVTWSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlKHRpbWVvdXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgciA9IGluYihpb2FkZHIgKyBDU1IpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHIgJiBDU1JfQ0JVU1kpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKHRpbWVvdXQpCisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAoSEFSRFdBUkVfRkFJTEVEKTsKK30KKworI2lmZGVmIE1PRFVMRQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UqIGRldl9zbWN0cltTTUNUUl9NQVhfQURBUFRFUlNdOworc3RhdGljIGludCBpb1tTTUNUUl9NQVhfQURBUFRFUlNdOworc3RhdGljIGludCBpcnFbU01DVFJfTUFYX0FEQVBURVJTXTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtKHJpbmdzcGVlZCwgaW50LCAwKTsKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpzZXR1cF9jYXJkKGludCBuKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY190cmRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCkpOworCWludCBlcnI7CisJCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZGV2LT5pcnEgPSBpcnFbbl07CisJZXJyID0gc21jdHJfcHJvYmUxKGRldiwgaW9bbl0pOworCWlmIChlcnIpIAorCQlnb3RvIG91dDsKKwkJCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7Cisgb3V0MToKKyNpZmRlZiBDT05GSUdfTUNBX0xFR0FDWQorCXsgc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCSAgaWYgKHRwLT5zbG90X251bSkKKwkJbWNhX21hcmtfYXNfdW51c2VkKHRwLT5zbG90X251bSk7CisJfQorI2VuZGlmCisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIFNNQ1RSX0lPX0VYVEVOVCk7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CitvdXQ6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCQkJCisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworICAgICAgICBpbnQgaSwgZm91bmQgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgU01DVFJfTUFYX0FEQVBURVJTOyBpKyspIHsKKwkJZGV2ID0gaW9bMF0/IHNldHVwX2NhcmQoaSkgOiBzbWN0cl9wcm9iZSgtMSk7CisJCWlmICghSVNfRVJSKGRldikpIHsKKwkJCSsrZm91bmQ7CisJCQlkZXZfc21jdHJbaV0gPSBkZXY7CisJCX0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmb3VuZCA/IDAgOiAtRU5PREVWOworfQorCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IFNNQ1RSX01BWF9BREFQVEVSUzsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfc21jdHJbaV07CisKKwkJaWYgKGRldikgeworCisJCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworI2lmZGVmIENPTkZJR19NQ0FfTEVHQUNZCisJCQl7IHN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJCWlmICh0cC0+c2xvdF9udW0pCisJCQkJbWNhX21hcmtfYXNfdW51c2VkKHRwLT5zbG90X251bSk7CisJCQl9CisjZW5kaWYKKwkJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBTTUNUUl9JT19FWFRFTlQpOworCQkJaWYgKGRldi0+aXJxKQorCQkJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJCQlmcmVlX25ldGRldihkZXYpOworCQl9CisgICAgICAgIH0KK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9zbWN0ci5oIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMwNmM3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9zbWN0ci5oCkBAIC0wLDAgKzEsMTU4OCBAQAorLyogc21jdHIuaDogU01DIFRva2VuIFJpbmcgZHJpdmVyIGhlYWRlciBmb3IgTGludXgKKyAqCisgKiBBdXRob3JzOgorICogIC0gSmF5IFNjaHVsaXN0IDxqc2NobHN0QHNhbWJhLm9yZz4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfU01DVFJfSAorI2RlZmluZSBfX0xJTlVYX1NNQ1RSX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2RlZmluZSBNQVhfVFhfUVVFVUUgMTAKKworI2RlZmluZSBTTUNfSEVBREVSX1NJWkUgMTQKKworI2RlZmluZSBTTUNfUEFHRV9PRkZTRVQoWCkgICAgICAgICAgKCgodW5zaWduZWQgbG9uZykoWCkgLSB0cC0+cmFtX2FjY2VzcykgJiB0cC0+cGFnZV9vZmZzZXRfbWFzaykKKworI2RlZmluZSBJTklUICAgICAgICAgICAgMHgwRAorI2RlZmluZSBSUV9BVFRDSCAgICAgICAgMHgxMAorI2RlZmluZSBSUV9TVEFURSAgICAgICAgMHgwRgorI2RlZmluZSBSUV9BRERSICAgICAgICAgMHgwRQorI2RlZmluZSBDSEdfUEFSTSAgICAgICAgMHgwQworI2RlZmluZSBSU1AgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBUWF9GT1JXQVJEICAgICAgMHgwOQorCisjZGVmaW5lIEFDX0ZDX0RBVAkoKDM8PDEzKSB8IDEpCisjZGVmaW5lICAgICAgREFUICAgICAgICAgICAgIDB4MDcKKworI2RlZmluZSBSUFRfTkVXX01PTiAgICAgMHgyNQorI2RlZmluZSBSUFRfU1VBX0NIRyAgICAgMHgyNgorI2RlZmluZSBSUFRfQUNUSVZFX0VSUiAgMHgyOAorI2RlZmluZSBSUFRfTk5fSU5DTVAgICAgMHgyNworI2RlZmluZSBSUFRfRVJST1IgICAgICAgMHgyOQorCisjZGVmaW5lIFJRX0lOSVQgICAgICAgICAweDIwCisjZGVmaW5lIFJQVF9BVFRDSCAgICAgICAweDI0CisjZGVmaW5lIFJQVF9TVEFURSAgICAgICAweDIzCisjZGVmaW5lIFJQVF9BRERSICAgICAgICAweDIyCisKKyNkZWZpbmUgUE9TSVRJVkVfQUNLICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgQV9GUkFNRV9XQVNfRk9SV0FSREVEICAgICAgICAgICAweDg4ODgKKworI2RlZmluZSAgICAgIEdST1VQX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMHgyQgorI2RlZmluZSAgICAgIFBIWVNJQ0FMX0RST1AgICAgICAgICAgICAgICAgICAgMHgwQgorI2RlZmluZSAgICAgIEFVVEhPUklaRURfQUNDRVNTX1BSSU9SSVRZICAgICAgMHgwNworI2RlZmluZSAgICAgIEFVVEhPUklaRURfRlVOQ1RJT05fQ0xBU1MgICAgICAgMHgwNgorI2RlZmluZSAgICAgIEZVTkNUSU9OQUxfQUREUkVTUyAgICAgICAgICAgICAgMHgyQworI2RlZmluZSAgICAgIFJJTkdfU1RBVElPTl9TVEFUVVMgICAgICAgICAgICAgMHgyOQorI2RlZmluZSAgICAgIFRSQU5TTUlUX1NUQVRVU19DT0RFICAgICAgICAgICAgMHgyQQorI2RlZmluZSAgICAgIElCTV9QQVNTX1NPVVJDRV9BRERSICAgIDB4MDEKKyNkZWZpbmUgICAgICBBQ19GQ19SUFRfVFhfRk9SV0FSRCAgICAgICAgICAgICgoMDw8MTMpIHwgMCkKKyNkZWZpbmUgICAgICBBQ19GQ19SUFRfU1RBVEUgICAgICAgICAgICAgICAgICgoMDw8MTMpIHwgMCkKKyNkZWZpbmUgICAgICBBQ19GQ19SUFRfQUREUiAgICAgICAgICAgICAgICAgICgoMDw8MTMpIHwgMCkKKyNkZWZpbmUgICAgICBDT1JSRUxBVE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDkKKworI2RlZmluZSBQT1NJVElWRV9BQ0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgICAgICAgICAvKiAgICAgICAgICAgICAqLworI2RlZmluZSBFX01BQ19EQVRBX0lOQ09NUExFVEUgICAgICAgICAgIDB4ODAwMSAgICAgICAgICAvKiBub3QgdXNlZCAgICAqLworI2RlZmluZSBFX1ZFQ1RPUl9MRU5HVEhfRVJST1IgICAgICAgICAgIDB4ODAwMiAgICAgICAgICAvKiAgICAgICAgICAgICAqLworI2RlZmluZSBFX1VOUkVDT0dOSVpFRF9WRUNUT1JfSUQgICAgICAgIDB4ODAwMyAgICAgICAgICAvKiAgICAgICAgICAgICAqLworI2RlZmluZSBFX0lOQVBQUk9QUklBVEVfU09VUkNFX0NMQVNTICAgIDB4ODAwNCAgICAgICAgICAvKiAgICAgICAgICAgICAqLworI2RlZmluZSBFX1NVQl9WRUNUT1JfTEVOR1RIX0VSUk9SICAgICAgIDB4ODAwNSAgICAgICAgICAvKiAgICAgICAgICAgICAqLworI2RlZmluZSBFX1RSQU5TTUlUX0ZPUldBUkRfSU5WQUxJRCAgICAgIDB4ODAwNiAgICAgICAgICAvKiBkZWYuIGJ5IElCTSAqLworI2RlZmluZSBFX01JU1NJTkdfU1VCX1ZFQ1RPUiAgICAgICAgICAgIDB4ODAwNyAgICAgICAgICAvKiAgICAgICAgICAgICAqLworI2RlZmluZSBFX1NVQl9WRUNUT1JfVU5LTk9XTiAgICAgICAgICAgIDB4ODAwOCAgICAgICAgICAvKiAgICAgICAgICAgICAqLworI2RlZmluZSBFX01BQ19IRUFERVJfVE9PX0xPTkcgICAgICAgICAgIDB4ODAwOSAgICAgICAgICAvKiAgICAgICAgICAgICAqLworI2RlZmluZSBFX0ZVTkNUSU9OX0RJU0FCTEVEICAgICAgICAgICAgIDB4ODAwQSAgICAgICAgICAvKiBub3QgdXNlZCAgICAqLworCisjZGVmaW5lIEFfRlJBTUVfV0FTX0ZPUldBUkRFRCAgICAgICAgICAgMHg4ODg4ICAgICAgICAgIC8qIHVzZWQgYnkgc2VuZF9UWF9GT1JXQVJEICovCisKKyNkZWZpbmUgVVBTVFJFQU1fTkVJR0hCT1JfQUREUkVTUyAgICAgICAweDAyCisjZGVmaW5lIExPQ0FMX1JJTkdfTlVNQkVSICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBBU1NJR05fUEhZU0lDQUxfRFJPUCAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgRVJST1JfVElNRVJfVkFMVUUgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIEFVVEhPUklaRURfRlVOQ1RJT05fQ0xBU1MgICAgICAgMHgwNgorI2RlZmluZSBBVVRIT1JJWkVEX0FDQ0VTU19QUklPUklUWSAgICAgIDB4MDcKKyNkZWZpbmUgQ09SUkVMQVRPUiAgICAgICAgICAgICAgICAgICAgICAweDA5CisjZGVmaW5lIFBIWVNJQ0FMX0RST1AgICAgICAgICAgICAgICAgICAgMHgwQgorI2RlZmluZSBSRVNQT05TRV9DT0RFICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgQUREUkVTU19NT0RJRkVSICAgICAgICAgICAgICAgICAweDIxCisjZGVmaW5lIFBST0RVQ1RfSU5TVEFOQ0VfSUQgICAgICAgICAgICAgMHgyMgorI2RlZmluZSBSSU5HX1NUQVRJT05fVkVSU0lPTl9OVU1CRVIgICAgIDB4MjMKKyNkZWZpbmUgV1JBUF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAweDI2CisjZGVmaW5lIEZSQU1FX0ZPUldBUkQgICAgICAgICAgICAgICAgICAgMHgyNworI2RlZmluZSBTVEFUSU9OX0lERU5USUZFUiAgICAgICAgICAgICAgIDB4MjgKKyNkZWZpbmUgUklOR19TVEFUSU9OX1NUQVRVUyAgICAgICAgICAgICAweDI5CisjZGVmaW5lIFRSQU5TTUlUX1NUQVRVU19DT0RFICAgICAgICAgICAgMHgyQQorI2RlZmluZSBHUk9VUF9BRERSRVNTICAgICAgICAgICAgICAgICAgIDB4MkIKKyNkZWZpbmUgRlVOQ1RJT05BTF9BRERSRVNTICAgICAgICAgICAgICAweDJDCisKKyNkZWZpbmUgRl9OT19TVUJfVkVDVE9SU19GT1VORCAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBGX1VQU1RSRUFNX05FSUdIQk9SX0FERFJFU1MgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEZfTE9DQUxfUklOR19OVU1CRVIgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgRl9BU1NJR05fUEhZU0lDQUxfRFJPUCAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBGX0VSUk9SX1RJTUVSX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIEZfQVVUSE9SSVpFRF9GVU5DVElPTl9DTEFTUyAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgRl9BVVRIT1JJWkVEX0FDQ0VTU19QUklPUklUWSAgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBGX0NPUlJFTEFUT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIEZfUEhZU0lDQUxfRFJPUCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgRl9SRVNQT05TRV9DT0RFICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBGX1BST0RVQ1RfSU5TVEFOQ0VfSUQgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIEZfUklOR19TVEFUSU9OX1ZFUlNJT05fTlVNQkVSICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgRl9TVEFUSU9OX0lERU5USUZFUiAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBGX1JJTkdfU1RBVElPTl9TVEFUVVMgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIEZfR1JPVVBfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKKyNkZWZpbmUgRl9GVU5DVElPTkFMX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBGX0ZSQU1FX0ZPUldBUkQgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisKKyNkZWZpbmUgUl9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUl9SUV9BVFRDSF9TVEFURV9BRERSICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUl9DSEdfUEFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUl9UWF9GT1JXQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZfRlJBTUVfRk9SV0FSRAorCisKKyNkZWZpbmUgICAgICBVUFNUUkVBTV9ORUlHSEJPUl9BRERSRVNTICAgICAgIDB4MDIKKyNkZWZpbmUgICAgICBBRERSRVNTX01PRElGRVIgICAgICAgICAgICAgICAgIDB4MjEKKyNkZWZpbmUgICAgICBSSU5HX1NUQVRJT05fVkVSU0lPTl9OVU1CRVIgICAgIDB4MjMKKyNkZWZpbmUgICAgICBQUk9EVUNUX0lOU1RBTkNFX0lEICAgICAgICAgICAgIDB4MjIKKworI2RlZmluZSAgICAgIFJQVF9UWF9GT1JXQVJEICAweDJBCisKKyNkZWZpbmUgQUNfRkNfSU5JVCAgICAgICAgICAgICAgICAgICAgICAoMzw8MTMpIHwgMCAvKiAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFDX0ZDX1JRX0lOSVQgICAgICAgICAgICAgICAgICAgKCgzPDwxMykgfCAwKSAvKiAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFDX0ZDX1JRX0FUVENIICAgICAgICAgICAgICAgICAgKDM8PDEzKSB8IDAgLyogREMgPSBTQyBvZiByeCBmcmFtZSAqLworI2RlZmluZSBBQ19GQ19SUV9TVEFURSAgICAgICAgICAgICAgICAgICgzPDwxMykgfCAwIC8qIERDID0gU0Mgb2YgcnggZnJhbWUgKi8KKyNkZWZpbmUgQUNfRkNfUlFfQUREUiAgICAgICAgICAgICAgICAgICAoMzw8MTMpIHwgMCAvKiBEQyA9IFNDIG9mIHJ4IGZyYW1lICovCisjZGVmaW5lIEFDX0ZDX0NIR19QQVJNICAgICAgICAgICAgICAgICAgKDM8PDEzKSB8IDAgLyogICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBQ19GQ19SU1AgICAgICAgICAgICAgICAgICAgICAgICgwPDwxMykgfCAwIC8qIERDID0gU0Mgb2YgcnggZnJhbWUgKi8KKyNkZWZpbmUgQUNfRkNfUlBUX0FUVENIICAgICAgICAgICAgICAgICAoMDw8MTMpIHwgMAorCisjZGVmaW5lIFNfVVBTVFJFQU1fTkVJR0hCT1JfQUREUkVTUyAgICAgICAgICAgICAgIDYgKyAyCisjZGVmaW5lIFNfTE9DQUxfUklOR19OVU1CRVIgICAgICAgICAgICAgICAgICAgICAgIDIgKyAyCisjZGVmaW5lIFNfQVNTSUdOX1BIWVNJQ0FMX0RST1AgICAgICAgICAgICAgICAgICAgIDQgKyAyCisjZGVmaW5lIFNfRVJST1JfVElNRVJfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgIDIgKyAyCisjZGVmaW5lIFNfQVVUSE9SSVpFRF9GVU5DVElPTl9DTEFTUyAgICAgICAgICAgICAgIDIgKyAyCisjZGVmaW5lIFNfQVVUSE9SSVpFRF9BQ0NFU1NfUFJJT1JJVFkgICAgICAgICAgICAgIDIgKyAyCisjZGVmaW5lIFNfQ09SUkVMQVRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKyAyCisjZGVmaW5lIFNfUEhZU0lDQUxfRFJPUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKyAyCisjZGVmaW5lIFNfUkVTUE9OU0VfQ09ERSAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKyAyCisjZGVmaW5lIFNfQUREUkVTU19NT0RJRkVSICAgICAgICAgICAgICAgICAgICAgICAgIDIgKyAyCisjZGVmaW5lIFNfUFJPRFVDVF9JTlNUQU5DRV9JRCAgICAgICAgICAgICAgICAgICAgMTggKyAyCisjZGVmaW5lIFNfUklOR19TVEFUSU9OX1ZFUlNJT05fTlVNQkVSICAgICAgICAgICAgMTAgKyAyCisjZGVmaW5lIFNfU1RBVElPTl9JREVOVElGRVIgICAgICAgICAgICAgICAgICAgICAgIDYgKyAyCisjZGVmaW5lIFNfUklOR19TVEFUSU9OX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgIDYgKyAyCisjZGVmaW5lIFNfR1JPVVBfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgKyAyCisjZGVmaW5lIFNfRlVOQ1RJT05BTF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgIDQgKyAyCisjZGVmaW5lIFNfRlJBTUVfRk9SV0FSRCAgICAgICAgICAgICAgICAgICAgICAgICAyNTIgKyAyCisjZGVmaW5lIFNfVFJBTlNNSVRfU1RBVFVTX0NPREUgICAgICAgICAgICAgICAgICAgIDIgKyAyCisKKyNkZWZpbmUgSVNCX0lNQ19SRVMwICAgICAgICAgICAgICAgICAgICAweDAwMDAgIC8qICovCisjZGVmaW5lIElTQl9JTUNfTUFDX1RZUEVfMyAgICAgICAgICAgICAgMHgwMDAxICAvKiBNQUNfQVJDX0lORElDQVRFICovCisjZGVmaW5lIElTQl9JTUNfTUFDX0VSUk9SX0NPVU5URVJTICAgICAgMHgwMDAyICAvKiAqLworI2RlZmluZSBJU0JfSU1DX1JFUzEgICAgICAgICAgICAgICAgICAgIDB4MDAwMyAgLyogKi8KKyNkZWZpbmUgSVNCX0lNQ19NQUNfVFlQRV8yICAgICAgICAgICAgICAweDAwMDQgIC8qIFFVRV9NQUNfSU5ESUNBVEUgKi8KKyNkZWZpbmUgSVNCX0lNQ19UWF9GUkFNRSAgICAgICAgICAgICAgICAweDAwMDUgIC8qICovCisjZGVmaW5lIElTQl9JTUNfRU5EX09GX1RYX1FVRVVFICAgICAgICAgMHgwMDA2ICAvKiAqLworI2RlZmluZSBJU0JfSU1DX05PTl9NQUNfUlhfUkVTT1VSQ0UgICAgIDB4MDAwNyAgLyogKi8KKyNkZWZpbmUgSVNCX0lNQ19NQUNfUlhfUkVTT1VSQ0UgICAgICAgICAweDAwMDggIC8qICovCisjZGVmaW5lIElTQl9JTUNfTk9OX01BQ19SWF9GUkFNRSAgICAgICAgMHgwMDA5ICAvKiAqLworI2RlZmluZSBJU0JfSU1DX01BQ19SWF9GUkFNRSAgICAgICAgICAgIDB4MDAwQSAgLyogKi8KKyNkZWZpbmUgSVNCX0lNQ19UUkNfRklGT19TVEFUVVMgICAgICAgICAweDAwMEIgIC8qICovCisjZGVmaW5lIElTQl9JTUNfQ09NTUFORF9TVEFUVVMgICAgICAgICAgMHgwMDBDICAvKiAqLworI2RlZmluZSBJU0JfSU1DX01BQ19UWVBFXzEgICAgICAgICAgICAgIDB4MDAwRCAgLyogU2VsZiBSZW1vdmVkICovCisjZGVmaW5lIElTQl9JTUNfVFJDX0lOVFJOTF9UU1RfU1RBVFVTICAgMHgwMDBFICAvKiAqLworI2RlZmluZSBJU0JfSU1DX1JFUzIgICAgICAgICAgICAgICAgICAgIDB4MDAwRiAgLyogKi8KKworI2RlZmluZSBOT05fTUFDX1JYX1JFU09VUkNFX0JXICAgICAgICAgIDB4MTAgICAgLyogc2hpZnRlZCByaWdodCA4IGJpdHMgKi8KKyNkZWZpbmUgTk9OX01BQ19SWF9SRVNPVVJDRV9GVyAgICAgICAgICAweDIwICAgIC8qIHNoaWZ0ZWQgcmlnaHQgOCBiaXRzICovCisjZGVmaW5lIE5PTl9NQUNfUlhfUkVTT1VSQ0VfQkUgICAgICAgICAgMHg0MCAgICAvKiBzaGlmdGVkIHJpZ2h0IDggYml0cyAqLworI2RlZmluZSBOT05fTUFDX1JYX1JFU09VUkNFX0ZFICAgICAgICAgIDB4ODAgICAgLyogc2hpZnRlZCByaWdodCA4IGJpdHMgKi8KKyNkZWZpbmUgUkFXX05PTl9NQUNfUlhfUkVTT1VSQ0VfQlcgICAgICAweDEwMDAgIC8qICovCisjZGVmaW5lIFJBV19OT05fTUFDX1JYX1JFU09VUkNFX0ZXICAgICAgMHgyMDAwICAvKiAqLworI2RlZmluZSBSQVdfTk9OX01BQ19SWF9SRVNPVVJDRV9CRSAgICAgIDB4NDAwMCAgLyogKi8KKyNkZWZpbmUgUkFXX05PTl9NQUNfUlhfUkVTT1VSQ0VfRkUgICAgICAweDgwMDAgIC8qICovCisKKyNkZWZpbmUgTUFDX1JYX1JFU09VUkNFX0JXICAgICAgICAgICAgICAweDEwICAgIC8qIHNoaWZ0ZWQgcmlnaHQgOCBiaXRzICovCisjZGVmaW5lIE1BQ19SWF9SRVNPVVJDRV9GVyAgICAgICAgICAgICAgMHgyMCAgICAvKiBzaGlmdGVkIHJpZ2h0IDggYml0cyAqLworI2RlZmluZSBNQUNfUlhfUkVTT1VSQ0VfQkUgICAgICAgICAgICAgIDB4NDAgICAgLyogc2hpZnRlZCByaWdodCA4IGJpdHMgKi8KKyNkZWZpbmUgTUFDX1JYX1JFU09VUkNFX0ZFICAgICAgICAgICAgICAweDgwICAgIC8qIHNoaWZ0ZWQgcmlnaHQgOCBiaXRzICovCisjZGVmaW5lIFJBV19NQUNfUlhfUkVTT1VSQ0VfQlcgICAgICAgICAgMHgxMDAwICAvKiAqLworI2RlZmluZSBSQVdfTUFDX1JYX1JFU09VUkNFX0ZXICAgICAgICAgIDB4MjAwMCAgLyogKi8KKyNkZWZpbmUgUkFXX01BQ19SWF9SRVNPVVJDRV9CRSAgICAgICAgICAweDQwMDAgIC8qICovCisjZGVmaW5lIFJBV19NQUNfUlhfUkVTT1VSQ0VfRkUgICAgICAgICAgMHg4MDAwICAvKiAqLworCisjZGVmaW5lIFRSQ19GSUZPX1NUQVRVU19UWF9VTkRFUlJVTiAgICAgMHg0MCAgICAvKiBzaGlmdGVkIHJpZ2h0IDggYml0cyAqLworI2RlZmluZSBUUkNfRklGT19TVEFUVVNfUlhfT1ZFUlJVTiAgICAgIDB4ODAgICAgLyogc2hpZnRlZCByaWdodCA4IGJpdHMgKi8KKyNkZWZpbmUgUkFXX1RSQ19GSUZPX1NUQVRVU19UWF9VTkRFUlJVTiAweDQwMDAgIC8qICovCisjZGVmaW5lIFJBV19UUkNfRklGT19TVEFUVVNfUlhfT1ZFUlJVTiAgMHg4MDAwICAvKiAqLworCisjZGVmaW5lICAgICAgIENTUl9DTFJUSU5UICAgICAgICAgICAgIDB4MDgKKworI2RlZmluZSBNU0IoWCkgICAgICAgICAgICAgICAgICAoKF9fdTgpKChfX3UxNikgWCA+PiA4KSkKKyNkZWZpbmUgTFNCKFgpICAgICAgICAgICAgICAgICAgKChfX3U4KSgoX191MTYpIFggJiAgMHhmZikpCisKKyNkZWZpbmUgQUNfRkNfTE9CRV9NRURJQV9URVNUICAgICAgICAgICAoKDM8PDEzKSB8IDApCisjZGVmaW5lIFNfV1JBUF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDggKyAyIC8qIDUwMCArIDIgKi8KKyNkZWZpbmUgICAgICBXUkFQX0RBVEEgICAgICAgICAgICAgICAgICAgICAgIDB4MjYKKyNkZWZpbmUgTE9CRV9NRURJQV9URVNUIDB4MDgKKworLyogRGVzdGluYXRpb24gQ2xhc3MgKGRjKSAqLworCisjZGVmaW5lIERDX01BU0sgICAgICAgICAweEYwCisjZGVmaW5lIERDX1JTICAgICAgICAgICAweDAwCisjZGVmaW5lIERDX0NSUyAgICAgICAgICAweDQwCisjZGVmaW5lIERDX1JQUyAgICAgICAgICAweDUwCisjZGVmaW5lIERDX1JFTSAgICAgICAgICAweDYwCisKKy8qIFNvdXJjZSBDbGFzc2VzIChzYykgKi8KKworI2RlZmluZSBTQ19NQVNLICAgICAgICAgMHgwRgorI2RlZmluZSBTQ19SUyAgICAgICAgICAgMHgwMAorI2RlZmluZSBTQ19DUlMgICAgICAgICAgMHgwNAorI2RlZmluZSBTQ19SUFMgICAgICAgICAgMHgwNQorI2RlZmluZSBTQ19SRU0gICAgICAgICAgMHgwNgorCisjZGVmaW5lIFBSCQkweDExCisjZGVmaW5lIFBSX1BBR0VfTUFTSwkweDBDMDAwCisKKyNkZWZpbmUgTUlDUk9DSEFOTkVMCTB4MDAwOAorI2RlZmluZSBJTlRFUkZBQ0VfQ0hJUAkweDAwMTAKKyNkZWZpbmUgQk9BUkRfMTZCSVQJMHgwMDQwCisjZGVmaW5lIFBBR0VEX1JBTQkweDAwODAKKyNkZWZpbmUgV0Q4MTE1VEEJKFRPS0VOX01FRElBIHwgTUlDUk9DSEFOTkVMIHwgSU5URVJGQUNFX0NISVAgfCBQQUdFRF9SQU0pCisjZGVmaW5lIFdEODExNVQJCShUT0tFTl9NRURJQSB8IElOVEVSRkFDRV9DSElQIHwgQk9BUkRfMTZCSVQgfCBQQUdFRF9SQU0pCisKKyNkZWZpbmUgQlJEX0lEXzgzMTYJMHg1MAorCisjZGVmaW5lIHI1ODdfU0VSCTB4MDAxCisjZGVmaW5lIFNFUl9ESU4JCTB4ODAKKyNkZWZpbmUgU0VSX0RPVVQJMHg0MAorI2RlZmluZSBTRVJfQ0xLCQkweDIwCisjZGVmaW5lIFNFUl9FQ1MJCTB4MTAKKyNkZWZpbmUgU0VSX0U4MDYJMHgwOAorI2RlZmluZSBTRVJfUE5QCQkweDA0CisjZGVmaW5lIFNFUl9CSU8JCTB4MDIKKyNkZWZpbmUgU0VSXzE2QgkJMHgwMQorCisjZGVmaW5lIHI1ODdfSURSCTB4MDA0CisjZGVmaW5lIElEUl9JUlFfTUFTSwkweDBGMAorI2RlZmluZSBJRFJfRENTX01BU0sJMHgwMDcKKyNkZWZpbmUgSURSX1JXUwkJMHgwMDgKKworCisjZGVmaW5lIHI1ODdfQklPCTB4MDAzCisjZGVmaW5lIEJJT19FTkIJCTB4MDgwCisjZGVmaW5lIEJJT19NQVNLCTB4MDNGCisKKyNkZWZpbmUgcjU4N19QQ1IJMHgwMDUKKyNkZWZpbmUgUENSX1JBTVMJMHgwNDAKKworCisKKyNkZWZpbmUgTlVNX0FERFJfQklUUwk4CisKKyNkZWZpbmUgSVNBX01BWF9BRERSRVNTCQkweDAwZmZmZmZmCisKKyNkZWZpbmUgU01DVFJfTUFYX0FEQVBURVJTCTcKKworI2RlZmluZSBNQ19UQUJMRV9FTlRSSUVTICAgICAgMTYKKworI2RlZmluZSBNQVhGUkFHTUVOVFMgICAgICAgICAgMzIKKworI2RlZmluZSBDSElQX1JFVl9NQVNLICAgICAgICAgMHgzMDAwCisKKyNkZWZpbmUgTUFYX1RYX1FTICAgICAgICAgICAgIDgKKyNkZWZpbmUgTlVNX1RYX1FTX1VTRUQgICAgICAgIDMKKworI2RlZmluZSBNQVhfUlhfUVMgICAgICAgICAgICAgMgorI2RlZmluZSBOVU1fUlhfUVNfVVNFRCAgICAgICAgMgorCisjZGVmaW5lIElOVEVMX0RBVEFfRk9STUFUCTB4NDAwMAorI2RlZmluZSBJTlRFTF9BRERSRVNTX1BPSU5URVJfRk9STUFUCTB4ODAwMAorI2RlZmluZSBQQUdFX1BPSU5URVIoWCkJCSgoKCh1bnNpZ25lZCBsb25nKShYKSAtIHRwLT5yYW1fYWNjZXNzKSAmIHRwLT5wYWdlX29mZnNldF9tYXNrKSArIHRwLT5yYW1fYWNjZXNzKQorI2RlZmluZSBTV0FQX1dPUkRTKFgpCQkoKChYICYgMHhGRkZGKSA8PCAxNikgfCAoWCA+PiAxNikpCisKKyNkZWZpbmUgSU5URVJGQUNFX0NISVAgICAgICAgICAgMHgwMDEwICAgICAgICAgIC8qIFNvZnQgQ29uZmlnIEFkYXB0ZXIgKi8KKyNkZWZpbmUgQURWQU5DRURfRkVBVFVSRVMgICAgICAgMHgwMDIwICAgICAgICAgIC8qIEFkdi4gbmV0dy4gaW50ZXJmYWNlIGZlYXR1cmVzICovCisjZGVmaW5lIEJPQVJEXzE2QklUICAgICAgICAgICAgIDB4MDA0MCAgICAgICAgICAvKiAxNiBiaXQgY2FwYWJpbGl0eSAqLworI2RlZmluZSBQQUdFRF9SQU0gICAgICAgICAgICAgICAweDAwODAgICAgICAgICAgLyogQWRhcHRlciBoYXMgcGFnZWQgUkFNICovCisKKyNkZWZpbmUgUEFHRURfUk9NICAgICAgICAgICAgICAgMHgwMTAwICAgICAgICAgIC8qIEFkYXB0ZXIgaGFzIHBhZ2VkIFJPTSAqLworCisjZGVmaW5lIFJBTV9TSVpFX1VOS05PV04gICAgICAgIDB4MDAwMCAgICAgICAgICAvKiBVbmtub3duIFJBTSBzaXplICovCisjZGVmaW5lIFJBTV9TSVpFXzBLICAgICAgICAgICAgIDB4MDAwMSAgICAgICAgICAvKiAwSyAgUkFNICovCisjZGVmaW5lIFJBTV9TSVpFXzhLICAgICAgICAgICAgIDB4MDAwMiAgICAgICAgICAvKiA4ayAgUkFNICovCisjZGVmaW5lIFJBTV9TSVpFXzE2SyAgICAgICAgICAgIDB4MDAwMyAgICAgICAgICAvKiAxNmsgUkFNICovCisjZGVmaW5lIFJBTV9TSVpFXzMySyAgICAgICAgICAgIDB4MDAwNCAgICAgICAgICAvKiAzMmsgUkFNICovCisjZGVmaW5lIFJBTV9TSVpFXzY0SyAgICAgICAgICAgIDB4MDAwNSAgICAgICAgICAvKiA2NGsgUkFNICovCisjZGVmaW5lIFJBTV9TSVpFX1JFU0VSVkVEXzYgICAgIDB4MDAwNiAgICAgICAgICAvKiBSZXNlcnZlZCBSQU0gc2l6ZSAqLworI2RlZmluZSBSQU1fU0laRV9SRVNFUlZFRF83ICAgICAweDAwMDcgICAgICAgICAgLyogUmVzZXJ2ZWQgUkFNIHNpemUgKi8KKyNkZWZpbmUgUkFNX1NJWkVfTUFTSyAgICAgICAgICAgMHgwMDA3ICAgICAgICAgIC8qIElzb2xhdGVzIFJBTSBTaXplICovCisKKyNkZWZpbmUgVE9LRU5fTUVESUEgICAgICAgICAgIDB4MDAwNQorCisjZGVmaW5lIEJJRF9SRUdfMCAgICAgICAweDAwCisjZGVmaW5lIEJJRF9SRUdfMSAgICAgICAweDAxCisjZGVmaW5lIEJJRF9SRUdfMiAgICAgICAweDAyCisjZGVmaW5lIEJJRF9SRUdfMyAgICAgICAweDAzCisjZGVmaW5lIEJJRF9SRUdfNCAgICAgICAweDA0CisjZGVmaW5lIEJJRF9SRUdfNSAgICAgICAweDA1CisjZGVmaW5lIEJJRF9SRUdfNiAgICAgICAweDA2CisjZGVmaW5lIEJJRF9SRUdfNyAgICAgICAweDA3CisjZGVmaW5lIEJJRF9MQVJfMCAgICAgICAweDA4CisjZGVmaW5lIEJJRF9MQVJfMSAgICAgICAweDA5CisjZGVmaW5lIEJJRF9MQVJfMiAgICAgICAweDBBCisjZGVmaW5lIEJJRF9MQVJfMyAgICAgICAweDBCCisjZGVmaW5lIEJJRF9MQVJfNCAgICAgICAweDBDCisjZGVmaW5lIEJJRF9MQVJfNSAgICAgICAweDBECisKKyNkZWZpbmUgQklEX0JPQVJEX0lEX0JZVEUgICAgICAgMHgwRQorI2RlZmluZSBCSURfQ0hDS1NNX0JZVEUgICAgICAgICAweDBGCisjZGVmaW5lIEJJRF9MQVJfT0ZGU0VUICAgICAgICAgIDB4MDggIAorCisjZGVmaW5lIEJJRF9NU1pfNTgzX0JJVCAgICAgICAgIDB4MDgKKyNkZWZpbmUgQklEX1NJWFRFRU5fQklUX0JJVCAgICAgMHgwMQorCisjZGVmaW5lIEJJRF9CT0FSRF9SRVZfTUFTSyAgICAgIDB4MUUKKworI2RlZmluZSBCSURfTUVESUFfVFlQRV9CSVQgICAgICAweDAxCisjZGVmaW5lIEJJRF9TT0ZUX0NPTkZJR19CSVQgICAgIDB4MjAKKyNkZWZpbmUgQklEX1JBTV9TSVpFX0JJVCAgICAgICAgMHg0MAorI2RlZmluZSBCSURfQlVTX1RZUEVfQklUICAgICAgICAweDgwCisKKyNkZWZpbmUgQklEX0NSICAgICAgICAgIDB4MTAKKworI2RlZmluZSBCSURfVFhQICAgICAgICAgMHgwNCAgICAgICAgICAgIC8qIFRyYW5zbWl0IFBhY2tldCBDb21tYW5kICovCisKKyNkZWZpbmUgQklEX1RDUl9ESUZGICAgIDB4MEQgICAgLyogVHJhbnNtaXQgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworCisjZGVmaW5lIEJJRF9UQ1JfVkFMICAgICAweDE4ICAgICAgICAgICAgLyogVmFsdWUgdG8gVGVzdCA4MzkwIG9yIDY5MCAqLworI2RlZmluZSBCSURfUFMwICAgICAgICAgMHgwMCAgICAgICAgICAgIC8qIFJlZ2lzdGVyIFBhZ2UgU2VsZWN0IDAgKi8KKyNkZWZpbmUgQklEX1BTMSAgICAgICAgIDB4NDAgICAgICAgICAgICAvKiBSZWdpc3RlciBQYWdlIFNlbGVjdCAxICovCisjZGVmaW5lIEJJRF9QUzIgICAgICAgICAweDgwICAgICAgICAgICAgLyogUmVnaXN0ZXIgUGFnZSBTZWxlY3QgMiAqLworI2RlZmluZSBCSURfUFNfTUFTSyAgICAgMHgzRiAgICAgICAgICAgIC8qIEZvciBNYXNraW5nIE9mZiBQYWdlIFNlbGVjdCBCaXRzICovCisKKyNkZWZpbmUgQklEX0VFUFJPTV8wICAgICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIEJJRF9FRVBST01fMSAgICAgICAgICAgICAgICAgICAgMHgwOQorI2RlZmluZSBCSURfRUVQUk9NXzIgICAgICAgICAgICAgICAgICAgIDB4MEEKKyNkZWZpbmUgQklEX0VFUFJPTV8zICAgICAgICAgICAgICAgICAgICAweDBCCisjZGVmaW5lIEJJRF9FRVBST01fNCAgICAgICAgICAgICAgICAgICAgMHgwQworI2RlZmluZSBCSURfRUVQUk9NXzUgICAgICAgICAgICAgICAgICAgIDB4MEQKKyNkZWZpbmUgQklEX0VFUFJPTV82ICAgICAgICAgICAgICAgICAgICAweDBFCisjZGVmaW5lIEJJRF9FRVBST01fNyAgICAgICAgICAgICAgICAgICAgMHgwRgorCisjZGVmaW5lIEJJRF9PVEhFUl9CSVQgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBCSURfSUNSX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MEMKKyNkZWZpbmUgQklEX0VBUl9NQVNLICAgICAgICAgICAgICAgICAgICAweDBGCisjZGVmaW5lIEJJRF9FTkdSX1BBR0UgICAgICAgICAgICAgICAgICAgMHgwQTAKKyNkZWZpbmUgQklEX1JMQSAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIEJJRF9FQTYgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBCSURfUkVDQUxMX0RPTkVfTUFTSyAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQklEX0JJRF9FRVBST01fT1ZFUlJJREUgICAgICAgICAweEZGQjAKKyNkZWZpbmUgQklEX0VYVFJBX0VFUFJPTV9PVkVSUklERSAgICAgICAweEZGRDAKKyNkZWZpbmUgQklEX0VFUFJPTV9NRURJQV9NQVNLICAgICAgICAgICAweDA3CisjZGVmaW5lIEJJRF9TVEFSTEFOX1RZUEUgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBCSURfRVRIRVJORVRfVFlQRSAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQklEX1RQX1RZUEUgICAgICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEJJRF9FV19UWVBFICAgICAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBCSURfVE9LRU5fUklOR19UWVBFICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgQklEX1VUUDJfVFlQRSAgICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIEJJRF9FRVBST01fSVJRX01BU0sgICAgICAgICAgICAgMHgxOAorI2RlZmluZSBCSURfUFJJTUFSWV9JUlEgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQklEX0FMVEVSTkFURV9JUlFfMSAgICAgICAgICAgICAweDA4CisjZGVmaW5lIEJJRF9BTFRFUk5BVEVfSVJRXzIgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBCSURfQUxURVJOQVRFX0lSUV8zICAgICAgICAgICAgIDB4MTgKKyNkZWZpbmUgQklEX0VFUFJPTV9SQU1fU0laRV9NQVNLICAgICAgICAweEUwCisjZGVmaW5lIEJJRF9FRVBST01fUkFNX1NJWkVfUkVTMSAgICAgICAgMHgwMAorI2RlZmluZSBCSURfRUVQUk9NX1JBTV9TSVpFX1JFUzIgICAgICAgIDB4MjAKKyNkZWZpbmUgQklEX0VFUFJPTV9SQU1fU0laRV84SyAgICAgICAgICAweDQwCisjZGVmaW5lIEJJRF9FRVBST01fUkFNX1NJWkVfMTZLICAgICAgICAgMHg2MAorI2RlZmluZSBCSURfRUVQUk9NX1JBTV9TSVpFXzMySyAgICAgICAgIDB4ODAKKyNkZWZpbmUgQklEX0VFUFJPTV9SQU1fU0laRV82NEsgICAgICAgICAweEEwCisjZGVmaW5lIEJJRF9FRVBST01fUkFNX1NJWkVfUkVTMyAgICAgICAgMHhDMAorI2RlZmluZSBCSURfRUVQUk9NX1JBTV9TSVpFX1JFUzQgICAgICAgIDB4RTAKKyNkZWZpbmUgQklEX0VFUFJPTV9CVVNfVFlQRV9NQVNLICAgICAgICAweDA3CisjZGVmaW5lIEJJRF9FRVBST01fQlVTX1RZUEVfQVQgICAgICAgICAgMHgwMAorI2RlZmluZSBCSURfRUVQUk9NX0JVU19UWVBFX01DQSAgICAgICAgIDB4MDEKKyNkZWZpbmUgQklEX0VFUFJPTV9CVVNfVFlQRV9FSVNBICAgICAgICAweDAyCisjZGVmaW5lIEJJRF9FRVBST01fQlVTX1RZUEVfTkVDICAgICAgICAgMHgwMworI2RlZmluZSBCSURfRUVQUk9NX0JVU19TSVpFX01BU0sgICAgICAgIDB4MTgKKyNkZWZpbmUgQklEX0VFUFJPTV9CVVNfU0laRV84QklUICAgICAgICAweDAwCisjZGVmaW5lIEJJRF9FRVBST01fQlVTX1NJWkVfMTZCSVQgICAgICAgMHgwOAorI2RlZmluZSBCSURfRUVQUk9NX0JVU19TSVpFXzMyQklUICAgICAgIDB4MTAKKyNkZWZpbmUgQklEX0VFUFJPTV9CVVNfU0laRV82NEJJVCAgICAgICAweDE4CisjZGVmaW5lIEJJRF9FRVBST01fQlVTX01BU1RFUiAgICAgICAgICAgMHgyMAorI2RlZmluZSBCSURfRUVQUk9NX1JBTV9QQUdJTkcgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgQklEX0VFUFJPTV9ST01fUEFHSU5HICAgICAgICAgICAweDgwCisjZGVmaW5lIEJJRF9FRVBST01fUEFHSU5HX01BU0sgICAgICAgICAgMHhDMAorI2RlZmluZSBCSURfRUVQUk9NX0xPV19DT1NUICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQklEX0VFUFJPTV9JT19NQVBQRUQgICAgICAgICAgICAweDEwCisjZGVmaW5lIEJJRF9FRVBST01fSE1JICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBCSURfRUVQUk9NX0FVVE9fTUVESUFfREVURUNUICAgIDB4MDEKKyNkZWZpbmUgQklEX0VFUFJPTV9DSElQX1JFVl9NQVNLICAgICAgICAweDBDCisKKyNkZWZpbmUgQklEX0VFUFJPTV9MQU5fQUREUiAgICAgICAgICAgICAweDMwCisKKyNkZWZpbmUgQklEX0VFUFJPTV9NRURJQV9PUFRJT04gICAgICAgICAweDU0CisjZGVmaW5lIEJJRF9FRVBST01fTUVESUFfVVRQICAgICAgICAgICAgMHgwMQorI2RlZmluZSBCSURfRUVQUk9NXzRNQl9SSU5HICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQklEX0VFUFJPTV8xNk1CX1JJTkcgICAgICAgICAgICAweDEwCisjZGVmaW5lIEJJRF9FRVBST01fTUVESUFfU1RQICAgICAgICAgICAgMHg0MAorCisjZGVmaW5lIEJJRF9FRVBST01fTUlTQ19EQVRBICAgICAgICAgICAgMHg1NgorI2RlZmluZSBCSURfRUVQUk9NX0VBUkxZX1RPS0VOX1JFTEVBU0UgIDB4MDIKKworI2RlZmluZSBDTkZHX0lEXzgwMDNFICAgICAgICAgICAweDZmYzAKKyNkZWZpbmUgQ05GR19JRF84MDAzUyAgICAgICAgICAgMHg2ZmMxCisjZGVmaW5lIENORkdfSURfODAwM1cgICAgICAgICAgIDB4NmZjMgorI2RlZmluZSBDTkZHX0lEXzgxMTVUUkEgICAgICAgICAweDZlYzYKKyNkZWZpbmUgQ05GR19JRF84MDEzRSAgICAgICAgICAgMHg2MUM4CisjZGVmaW5lIENORkdfSURfODAxM1cgICAgICAgICAgIDB4NjFDOQorI2RlZmluZSBDTkZHX0lEX0JJU1RSTzAzRSAgICAgICAweEVGRTUKKyNkZWZpbmUgQ05GR19JRF9CSVNUUk8xM0UgICAgICAgMHhFRkQ1CisjZGVmaW5lIENORkdfSURfQklTVFJPMTNXICAgICAgIDB4RUZENAorI2RlZmluZSBDTkZHX01TUl81ODMgICAgMHgwCisjZGVmaW5lIENORkdfSUNSXzU4MyAgICAweDEKKyNkZWZpbmUgQ05GR19JQVJfNTgzICAgIDB4MgorI2RlZmluZSBDTkZHX0JJT181ODMgICAgMHgzCisjZGVmaW5lIENORkdfRUFSXzU4MyAgICAweDMKKyNkZWZpbmUgQ05GR19JUlJfNTgzICAgIDB4NAorI2RlZmluZSBDTkZHX0xBQVJfNTg0ICAgMHg1CisjZGVmaW5lIENORkdfR1AyICAgICAgICAgICAgICAgIDB4NworI2RlZmluZSBDTkZHX0xBQVJfTUFTSyAgICAgICAgICAweDFGCisjZGVmaW5lIENORkdfTEFBUl9aV1MgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgQ05GR19MQUFSX0wxNkUgICAgICAgICAgMHg0MAorI2RlZmluZSBDTkZHX0lDUl9JUjJfNTg0ICAgICAgICAweDA0CisjZGVmaW5lIENORkdfSUNSX01BU0sgICAgICAgMHgwOAorI2RlZmluZSBDTkZHX0lDUl9NU1ogICAgICAgIDB4MDgKKyNkZWZpbmUgQ05GR19JQ1JfUkxBICAgICAgICAweDEwCisjZGVmaW5lIENORkdfSUNSX1NUTyAgICAgICAgMHg4MAorI2RlZmluZSBDTkZHX0lSUl9JUlFTICAgICAgICAgICAweDYwCisjZGVmaW5lIENORkdfSVJSX0lFTiAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgQ05GR19JUlJfWldTICAgICAgICAgICAgMHgwMQorI2RlZmluZSBDTkZHX0dQMl9CT09UX05JQkJMRSAgICAweDBGCisjZGVmaW5lIENORkdfSVJSX09VVDIgICAgICAgMHgwNAorI2RlZmluZSBDTkZHX0lSUl9PVVQxICAgICAgIDB4MDIKKworI2RlZmluZSBDTkZHX1NJWkVfOEtCICAgICAgICAgICA4CisjZGVmaW5lIENORkdfU0laRV8xNktCICAgICAgICAgIDE2CisjZGVmaW5lIENORkdfU0laRV8zMktCICAgICAgICAgIDMyCisjZGVmaW5lIENORkdfU0laRV82NEtCICAgICAgICAgIDY0CisjZGVmaW5lIENORkdfU0laRV8xMjhLQiAgICAgMTI4CisjZGVmaW5lIENORkdfU0laRV8yNTZLQiAgICAgMjU2CisjZGVmaW5lIFJPTV9ESVNBQkxFICAgICAgICAgICAgIDB4MAorCisjZGVmaW5lIENORkdfU0xPVF9FTkFCTEVfQklUICAgIDB4MDgKKworI2RlZmluZSBDTkZHX1BPU19DT05UUk9MX1JFRyAgICAweDA5NgorI2RlZmluZSBDTkZHX1BPU19SRUcwICAgICAgICAgICAweDEwMAorI2RlZmluZSBDTkZHX1BPU19SRUcxICAgICAgICAgICAweDEwMQorI2RlZmluZSBDTkZHX1BPU19SRUcyICAgICAgICAgICAweDEwMgorI2RlZmluZSBDTkZHX1BPU19SRUczICAgICAgICAgICAweDEwMworI2RlZmluZSBDTkZHX1BPU19SRUc0ICAgICAgICAgICAweDEwNAorI2RlZmluZSBDTkZHX1BPU19SRUc1ICAgICAgICAgICAweDEwNQorCisjZGVmaW5lIENORkdfQURBUFRFUl9UWVBFX01BU0sgIDB4MGUKKworI2RlZmluZSBTTE9UXzE2QklUICAgICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgSU5URVJGQUNFXzVYM19DSElQICAgICAgMHgwMDAwICAgICAgICAgIC8qIDAwMDAgPSA1ODMgb3IgNTkzIGNoaXBzICovCisjZGVmaW5lIE5JQ182OTBfQklUICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICAgICAgICAgIC8qIE5JQyBpcyA2OTAgKi8KKyNkZWZpbmUgQUxURVJOQVRFX0lSUV9CSVQgICAgICAgMHgwMDIwICAgICAgICAgIC8qIEFsdGVybmF0ZSBJUlEgaXMgdXNlZCAqLworI2RlZmluZSBJTlRFUkZBQ0VfNTg0X0NISVAgICAgICAweDAwNDAgICAgICAgICAgLyogMDAwMSA9IDU4NCBjaGlwICovCisjZGVmaW5lIElOVEVSRkFDRV81OTRfQ0hJUCAgICAgIDB4MDA4MCAgICAgICAgICAvKiAwMDEwID0gNTk0IGNoaXAgKi8KKyNkZWZpbmUgSU5URVJGQUNFXzU4NV9DSElQICAgICAgMHgwMTAwICAgICAgICAgIC8qIDAxMDAgPSA1ODUvNzkwIGNoaXAgKi8KKyNkZWZpbmUgSU5URVJGQUNFX0NISVBfTUFTSyAgICAgMHgwM0MwICAgICAgICAgIC8qIElzb2xhdGVzIEludGZjIENoaXAgVHlwZSAqLworCisjZGVmaW5lIEJPQVJEXzE2QklUICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBOT0RFX0FERFJfQ0tTVU0gCTB4RUUKKyNkZWZpbmUgQlJEX0lEXzgxMTVUICAgIAkweDA0CisKKyNkZWZpbmUgTklDXzgyNV9CSVQgICAgICAgICAgICAgMHgwNDAwICAgICAgICAgIC8qIFRSQyA4M0M4MjUgTklDICovCisjZGVmaW5lIE5JQ183OTBfQklUICAgICAgICAgICAgIDB4MDgwMCAgICAgICAgICAvKiBOSUMgaXMgODNDNzkwIEV0aGVybmV0ICovCisKKyNkZWZpbmUgQ0hJUF9SRVZfTUFTSyAgICAgICAgICAgMHgzMDAwCisKKyNkZWZpbmUgSFdSX0NCVVNZCQkJMHgwMgorI2RlZmluZSBIV1JfQ0EJCQkJMHgwMQorCisjZGVmaW5lIE1BQ19RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBOT05fTUFDX1FVRVVFICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQlVHX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgIC8qIE5PIFJFQ0VJVkUgUVVFVUUsIE9OTFkgVFggKi8KKworI2RlZmluZSBOVU1fTUFDX1RYX0ZDQlMgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgTlVNX01BQ19UWF9CREJTICAgICAgICAgICAgICAgICBOVU1fTUFDX1RYX0ZDQlMKKyNkZWZpbmUgTlVNX01BQ19SWF9GQ0JTICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIE5VTV9NQUNfUlhfQkRCUyAgICAgICAgICAgICAgICAgOAorCisjZGVmaW5lIE5VTV9OT05fTUFDX1RYX0ZDQlMgICAgICAgICAgICAgNgorI2RlZmluZSBOVU1fTk9OX01BQ19UWF9CREJTICAgICAgICAgICAgIE5VTV9OT05fTUFDX1RYX0ZDQlMKKworI2RlZmluZSBOVU1fTk9OX01BQ19SWF9CREJTICAgICAgICAgICAgIDAgICAgICAgLyogQ0FMQ1VMQVRFRCBEWU5BTUlDQUxMWSAqLworCisjZGVmaW5lIE5VTV9CVUdfVFhfRkNCUyAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBOVU1fQlVHX1RYX0JEQlMgICAgICAgICAgICAgICAgIE5VTV9CVUdfVFhfRkNCUworCisjZGVmaW5lIE1BQ19UWF9CVUZGRVJfTUVNT1JZICAgICAgICAgICAgMTAyNAorI2RlZmluZSBOT05fTUFDX1RYX0JVRkZFUl9NRU1PUlkgICAgICAgICgyMCAqIDEwMjQpCisjZGVmaW5lIEJVR19UWF9CVUZGRVJfTUVNT1JZICAgICAgICAgICAgKE5VTV9CVUdfVFhfRkNCUyAqIDMyKQorCisjZGVmaW5lIFJYX0JVRkZFUl9NRU1PUlkgICAgICAgICAgICAgICAgMCAgICAgICAvKiBDQUxDVUxBVEVEIERZTkFNSUNBTExZICovCisjZGVmaW5lIFJYX0RBVEFfQlVGRkVSX1NJWkUgICAgICAgICAgICAgMjU2CisjZGVmaW5lIFJYX0JEQl9TSVpFX1NISUZUICAgICAgICAgICAgICAgMyAgICAgICAvKiBsb2cyKFJYX0RBVEFfQlVGRkVSX1NJWkUpLWxvZzIoc2l6ZW9mKEJEQmxvY2spKSAqLworI2RlZmluZSBSWF9CREJfU0laRV9NQVNLICAgICAgICAgICAgICAgIChzaXplb2YoQkRCbG9jaykgLSAxKQorI2RlZmluZSBSWF9EQVRBX0JVRkZFUl9TSVpFX01BU0sgICAgICAgIChSWF9EQVRBX0JVRkZFUl9TSVpFLTEpCisKKyNkZWZpbmUgTlVNX09GX0lOVEVSUlVQVFMgICAgICAgICAgICAgICAweDIwCisKKyNkZWZpbmUgTk9UX1RSQU5TTUlUSU5HICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFRSQU5TTUlUSU5HCQkJMQorCisjZGVmaW5lIFRSQ19JTlRFUlJVUFRfRU5BQkxFX01BU0sgICAgICAgMHg3RkY2CisKKyNkZWZpbmUgVUNPREVfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAweDU4CisKKyNkZWZpbmUgVUNPREVfU0laRV9PRkZTRVQgICAgICAgICAgICAgICAweDAwMDAgIC8qIFdPUkQgKi8KKyNkZWZpbmUgVUNPREVfQ0hFQ0tTVU1fT0ZGU0VUICAgICAgICAgICAweDAwMDIgIC8qIFdPUkQgKi8KKyNkZWZpbmUgVUNPREVfVkVSU0lPTl9PRkZTRVQgICAgICAgICAgICAweDAwMDQgIC8qIEJZVEUgKi8KKworI2RlZmluZSBDU19SQU1fU0laRSAgICAgICAgICAgICAgICAgICAgIDBYMjAwMAorI2RlZmluZSBDU19SQU1fQ0hFQ0tTVU1fT0ZGU0VUICAgICAgICAgIDB4MUZGRSAgLyogV09SRCAxRkZFKE1TQiktMUZGRihMU0IpKi8KKyNkZWZpbmUgQ1NfUkFNX1ZFUlNJT05fT0ZGU0VUICAgICAgICAgICAweDFGRkMgIC8qIFdPUkQgMUZGQyhNU0IpLTFGRkQoTFNCKSovCisKKyNkZWZpbmUgTUlTQ19EQVRBX1NJWkUgICAgICAgICAgICAgICAgICAxMjgKKyNkZWZpbmUgTlVNX09GX0FDQlMgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgQUNCX0NPTU1BTkRfTk9UX0RPTkUgICAgICAgICAgICAweDAwMDAgIC8qIEluaXQsIGNvbW1hbmQgbm90IGRvbmUgKi8KKyNkZWZpbmUgQUNCX0NPTU1BTkRfRE9ORSAgICAgICAgICAgICAgICAweDgwMDAgIC8qIFRSQyBzYXlzIGNvbW1hbmQgZG9uZSAqLworI2RlZmluZSBBQ0JfQ09NTUFORF9TVEFUVVNfTUFTSyAgICAgICAgIDB4MDBGRiAgLyogbG93IGJ5dGUgaXMgc3RhdHVzICovCisjZGVmaW5lIEFDQl9DT01NQU5EX1NVQ0NFU1NGVUwgICAgICAgICAgMHgwMDAwICAvKiBtZWFucyBjbWQgd2FzIHN1Y2Nlc3NmdWwgKi8KKyNkZWZpbmUgQUNCX05PVF9DSEFJTl9FTkQgICAgICAgICAgICAgICAweDAwMDAgIC8qIHRlbGwgVFJDIG1vcmUgQ0JzIGluIGNoYWluICovCisjZGVmaW5lIEFDQl9DSEFJTl9FTkQgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiB0ZWxsIFRSQyBsYXN0IENCIGluIGNoYWluICovCisjZGVmaW5lIEFDQl9DT01NQU5EX05PX0lOVEVSUlVQVCAgICAgICAgMHgwMDAwICAvKiB0ZWxsIFRSQyBubyBJTlQgYWZ0ZXIgQ0IgKi8KKyNkZWZpbmUgQUNCX0NPTU1BTkRfSU5URVJSVVBUICAgICAgICAgICAweDIwMDAgIC8qIHRlbGwgVFJDIHRvIElOVCBhZnRlciBDQiAqLworI2RlZmluZSBBQ0JfU1VCX0NNRF9OT1AgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBBQ0JfQ01EX0hJQ19OT1AgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBBQ0JfQ01EX01DVF9OT1AgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBBQ0JfQ01EX01DVF9URVNUICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBBQ0JfQ01EX0hJQ19URVNUICAgICAgICAgICAgICAgIDB4MDA4MQorI2RlZmluZSBBQ0JfQ01EX0lOU0VSVCAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBBQ0JfQ01EX1JFTU9WRSAgICAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBBQ0JfQ01EX01DVF9XUklURV9WQUxVRSAgICAgICAgIDB4MDAwNAorI2RlZmluZSBBQ0JfQ01EX0hJQ19XUklURV9WQUxVRSAgICAgICAgIDB4MDA4NAorI2RlZmluZSBBQ0JfQ01EX01DVF9SRUFEX1ZBTFVFICAgICAgICAgIDB4MDAwNQorI2RlZmluZSBBQ0JfQ01EX0hJQ19SRUFEX1ZBTFVFICAgICAgICAgIDB4MDA4NQorI2RlZmluZSBBQ0JfQ01EX0lOSVRfVFhfUlggICAgICAgICAgICAgIDB4MDA4NgorI2RlZmluZSBBQ0JfQ01EX0lOSVRfVFJDX1RJTUVSUyAgICAgICAgIDB4MDAwNgorI2RlZmluZSBBQ0JfQ01EX1JFQURfVFJDX1NUQVRVUyAgICAgICAgIDB4MDAwNworI2RlZmluZSBBQ0JfQ01EX0NIQU5HRV9KT0lOX1NUQVRFICAgICAgIDB4MDAwOAorI2RlZmluZSBBQ0JfQ01EX1JFU0VSVkVEXzkgICAgICAgICAgICAgIDB4MDAwOQorI2RlZmluZSBBQ0JfQ01EX1JFU0VSVkVEX0EgICAgICAgICAgICAgIDB4MDAwQQorI2RlZmluZSBBQ0JfQ01EX1JFU0VSVkVEX0IgICAgICAgICAgICAgIDB4MDAwQgorI2RlZmluZSBBQ0JfQ01EX1JFU0VSVkVEX0MgICAgICAgICAgICAgIDB4MDAwQworI2RlZmluZSBBQ0JfQ01EX1JFU0VSVkVEX0QgICAgICAgICAgICAgIDB4MDAwRAorI2RlZmluZSBBQ0JfQ01EX1JFU0VSVkVEX0UgICAgICAgICAgICAgIDB4MDAwRQorI2RlZmluZSBBQ0JfQ01EX1JFU0VSVkVEX0YgICAgICAgICAgICAgIDB4MDAwRgorCisjZGVmaW5lIFRSQ19NQUNfUkVHSVNURVJTX1RFU1QgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIFRSQ19JTlRFUk5BTF9MT09QQkFDSyAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFRSQ19UUklfTE9PUEJBQ0sgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFRSQ19JTlRFUk5BTF9ST01fVEVTVCAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIFRSQ19MT0JFX01FRElBX1RFU1QgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFRSQ19BTkFMT0dfVEVTVCAgICAgICAgICAgICAgICAgMHgwMDA1CisjZGVmaW5lIFRSQ19IT1NUX0lOVEVSRkFDRV9SRUdfVEVTVCAgICAgMHgwMDAzCisKKyNkZWZpbmUgVEVTVF9ETUFfMSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgVEVTVF9ETUFfMiAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgVEVTVF9NQ1RfUk9NICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgSElDX0lOVEVSTkFMX0RJQUcgICAgICAgICAgICAgICAweDAwMDMKKworI2RlZmluZSBBQk9SVF9UUkFOU01JVF9QUklPUklUWV8wICAgICAgIDB4MDAwMQorI2RlZmluZSBBQk9SVF9UUkFOU01JVF9QUklPUklUWV8xICAgICAgIDB4MDAwMgorI2RlZmluZSBBQk9SVF9UUkFOU01JVF9QUklPUklUWV8yICAgICAgIDB4MDAwNAorI2RlZmluZSBBQk9SVF9UUkFOU01JVF9QUklPUklUWV8zICAgICAgIDB4MDAwOAorI2RlZmluZSBBQk9SVF9UUkFOU01JVF9QUklPUklUWV80ICAgICAgIDB4MDAxMAorI2RlZmluZSBBQk9SVF9UUkFOU01JVF9QUklPUklUWV81ICAgICAgIDB4MDAyMAorI2RlZmluZSBBQk9SVF9UUkFOU01JVF9QUklPUklUWV82ICAgICAgIDB4MDA0MAorI2RlZmluZSBBQk9SVF9UUkFOU01JVF9QUklPUklUWV83ICAgICAgIDB4MDA4MAorCisjZGVmaW5lIFRYX1BFTkRJTkdfUFJJT1JJVFlfMCAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFRYX1BFTkRJTkdfUFJJT1JJVFlfMSAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFRYX1BFTkRJTkdfUFJJT1JJVFlfMiAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFRYX1BFTkRJTkdfUFJJT1JJVFlfMyAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFRYX1BFTkRJTkdfUFJJT1JJVFlfNCAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFRYX1BFTkRJTkdfUFJJT1JJVFlfNSAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFRYX1BFTkRJTkdfUFJJT1JJVFlfNiAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFRYX1BFTkRJTkdfUFJJT1JJVFlfNyAgICAgICAgICAgMHgwMDgwCisKKyNkZWZpbmUgRkNCX0ZSQU1FX0xFTkdUSCAgICAgICAgICAgICAgICAweDEwMAorI2RlZmluZSBGQ0JfQ09NTUFORF9ET05FICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogRkNCIFdvcmQgMCAqLworI2RlZmluZSBGQ0JfTk9UX0NIQUlOX0VORCAgICAgICAgICAgICAgIDB4MDAwMCAgLyogRkNCIFdvcmQgMSAqLworI2RlZmluZSBGQ0JfQ0hBSU5fRU5EICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBGQ0JfTk9fV0FSTklORyAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBGQ0JfV0FSTklORyAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBGQ0JfSU5URVJSVVBUX0RJU0FCTEUgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBGQ0JfSU5URVJSVVBUX0VOQUJMRSAgICAgICAgICAgIDB4MjAwMAorCisjZGVmaW5lIEZDQl9FTkFCTEVfSU1BICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIEZDQl9FTkFCTEVfVEVTICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBHdWFyYW50ZWUgVHggYmVmb3JlIEludCAqLworI2RlZmluZSBGQ0JfRU5BQkxFX1RGUyAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogUG9zdCBUeCBGcmFtZSBTdGF0dXMgKi8KKyNkZWZpbmUgRkNCX0VOQUJMRV9OVEMgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIE5vIFR4IENSQyAqLworCisjZGVmaW5lIEZDQl9UWF9TVEFUVVNfQ1IyICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEZDQl9UWF9TVEFUVVNfQVIyICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIEZDQl9UWF9TVEFUVVNfQ1IxICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIEZDQl9UWF9TVEFUVVNfQVIxICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIEZDQl9UWF9BQ19CSVRTICAgICAgICAgICAgICAgICAgKEZDQl9UWF9TVEFUVVNfQVIxK0ZDQl9UWF9TVEFUVVNfQVIyK0ZDQl9UWF9TVEFUVVNfQ1IxK0ZDQl9UWF9TVEFUVVNfQ1IyKQorI2RlZmluZSBGQ0JfVFhfU1RBVFVTX0UgICAgICAgICAgICAgICAgIDB4MDEwMAorCisjZGVmaW5lIEZDQl9SWF9TVEFUVVNfQU5ZX0VSUk9SICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEZDQl9SWF9TVEFUVVNfRkNTX0VSUk9SICAgICAgICAgMHgwMDAyCisKKyNkZWZpbmUgRkNCX1JYX1NUQVRVU19JQV9NQVRDSEVEICAgICAgICAweDA0MDAKKyNkZWZpbmUgRkNCX1JYX1NUQVRVU19JR0FfQlNHQV9NQVRDSEVEICAweDA1MDAKKyNkZWZpbmUgRkNCX1JYX1NUQVRVU19GQV9NQVRDSEVEICAgICAgICAweDA2MDAKKyNkZWZpbmUgRkNCX1JYX1NUQVRVU19CQV9NQVRDSEVEICAgICAgICAweDA3MDAKKyNkZWZpbmUgRkNCX1JYX1NUQVRVU19EQV9NQVRDSEVEICAgICAgICAweDA0MDAKKyNkZWZpbmUgRkNCX1JYX1NUQVRVU19TT1VSQ0VfUk9VVElORyAgICAweDA4MDAKKworI2RlZmluZSBCREJfQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgIDB4MTAwCisjZGVmaW5lIEJEQl9OT1RfQ0hBSU5fRU5EICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEJEQl9DSEFJTl9FTkQgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIEJEQl9OT19XQVJOSU5HICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEJEQl9XQVJOSU5HICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisKKyNkZWZpbmUgRVJST1JfQ09VTlRFUlNfQ0hBTkdFRCAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgVElfTkRJU19SSU5HX1NUQVRVU19DSEFOR0VEICAgICAweDAwMDIKKyNkZWZpbmUgVU5BX0NIQU5HRUQgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgUkVBRFlfVE9fU0VORF9SUV9JTklUICAgICAgICAgICAweDAwMDgKKworI2RlZmluZSBTQ0dCX0FERFJFU1NfUE9JTlRFUl9GT1JNQVQgICAgIElOVEVMX0FERFJFU1NfUE9JTlRFUl9GT1JNQVQKKyNkZWZpbmUgU0NHQl9EQVRBX0ZPUk1BVCAgICAgICAgICAgICAgICBJTlRFTF9EQVRBX0ZPUk1BVAorI2RlZmluZSBTQ0dCX01VTFRJX1dPUkRfQ09OVFJPTCAgICAgICAgIDAKKyNkZWZpbmUgU0NHQl9CVVJTVF9MRU5HVEggICAgICAgICAgICAgICAweDAwMEUgIC8qIERNQSBCdXJzdCBMZW5ndGggKi8KKworI2RlZmluZSBTQ0dCX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgIChJTlRFTF9BRERSRVNTX1BPSU5URVJfRk9STUFUK0lOVEVMX0RBVEFfRk9STUFUK1NDR0JfQlVSU1RfTEVOR1RIKQorCisjZGVmaW5lIElTQ1BfQkxPQ0tfU0laRSAgICAgICAgICAgICAgICAgMHgwQQorI2RlZmluZSBSQU1fU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAKKyNkZWZpbmUgSU5JVF9TWVNfQ09ORklHX1BUUl9PRkZTRVQgICAgICAoUkFNX1NJWkUtSVNDUF9CTE9DS19TSVpFKQorI2RlZmluZSBTQ0dQX0JMT0NLX09GRlNFVCAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBTQ0xCX05PVF9WQUxJRCAgICAgICAgICAgICAgICAgIDB4MDAwMCAgLyogSW5pdGlhbGx5LCBTQ0xCIG5vdCB2YWxpZCAqLworI2RlZmluZSBTQ0xCX1ZBTElEICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogSG9zdCB0ZWxscyBUUkMgU0NMQiB2YWxpZCAqLworI2RlZmluZSBTQ0xCX1BST0NFU1NFRCAgICAgICAgICAgICAgICAgIDB4MDAwMCAgLyogVFJDIHNheXMgU0NMQiBwcm9jZXNzZWQgKi8KKyNkZWZpbmUgU0NMQl9SRVNVTUVfQ09OVFJPTF9OT1RfVkFMSUQgICAweDAwMDAgIC8qIEluaXRpYWxseSwgUkMgbm90IHZhbGlkICovCisjZGVmaW5lIFNDTEJfUkVTVU1FX0NPTlRST0xfVkFMSUQgICAgICAgMHg0MDAwICAvKiBIb3N0IHRlbGxzIFRSQyBSQyB2YWxpZCAqLworI2RlZmluZSBTQ0xCX0lBQ0tfQ09ERV9OT1RfVkFMSUQgICAgICAgIDB4MDAwMCAgLyogSW5pdGlhbGx5LCBJQUNLIG5vdCB2YWxpZCAqLworI2RlZmluZSBTQ0xCX0lBQ0tfQ09ERV9WQUxJRCAgICAgICAgICAgIDB4MjAwMCAgLyogSG9zdCB0ZWxscyBUUkMgSUFDSyB2YWxpZCAqLworI2RlZmluZSBTQ0xCX0NNRF9OT1AgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBTQ0xCX0NNRF9SRU1PVkUgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBTQ0xCX0NNRF9TVVNQRU5EX0FDQl9DSEFJTiAgICAgIDB4MDAwMgorI2RlZmluZSBTQ0xCX0NNRF9TRVRfSU5URVJSVVBUX01BU0sgICAgIDB4MDAwMworI2RlZmluZSBTQ0xCX0NNRF9DTEVBUl9JTlRFUlJVUFRfTUFTSyAgIDB4MDAwNAorI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF81ICAgICAgICAgICAgIDB4MDAwNQorI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF82ICAgICAgICAgICAgIDB4MDAwNgorI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF83ICAgICAgICAgICAgIDB4MDAwNworI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF84ICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF85ICAgICAgICAgICAgIDB4MDAwOQorI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF9BICAgICAgICAgICAgIDB4MDAwQQorI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF9CICAgICAgICAgICAgIDB4MDAwQgorI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF9DICAgICAgICAgICAgIDB4MDAwQworI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF9EICAgICAgICAgICAgIDB4MDAwRAorI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF9FICAgICAgICAgICAgIDB4MDAwRQorI2RlZmluZSBTQ0xCX0NNRF9SRVNFUlZFRF9GICAgICAgICAgICAgIDB4MDAwRgorCisjZGVmaW5lIFNDTEJfUkNfQUNCICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBBY3Rpb24gQ29tbWFuZCBCbG9jayBDaGFpbiAqLworI2RlZmluZSBTQ0xCX1JDX1JFUzAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogQWx3YXlzIFplcm8gKi8KKyNkZWZpbmUgU0NMQl9SQ19SRVMxICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEFsd2F5cyBaZXJvICovCisjZGVmaW5lIFNDTEJfUkNfUkVTMiAgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiBBbHdheXMgWmVybyAqLworI2RlZmluZSBTQ0xCX1JDX1JYX01BQ19GQ0IgICAgICAgICAgICAgIDB4MDAxMCAgLyogUlhfTUFDX0ZDQiBDaGFpbiAqLworI2RlZmluZSBTQ0xCX1JDX1JYX01BQ19CREIgICAgICAgICAgICAgIDB4MDAyMCAgLyogUlhfTUFDX0JEQiBDaGFpbiAqLworI2RlZmluZSBTQ0xCX1JDX1JYX05PTl9NQUNfRkNCICAgICAgICAgIDB4MDA0MCAgLyogUlhfTk9OX01BQ19GQ0IgQ2hhaW4gKi8KKyNkZWZpbmUgU0NMQl9SQ19SWF9OT05fTUFDX0JEQiAgICAgICAgICAweDAwODAgIC8qIFJYX05PTl9NQUNfQkRCIENoYWluICovCisjZGVmaW5lIFNDTEJfUkNfVEZDQjAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBUWCBQcmlvcml0eSAwIEZDQiBDaGFpbiAqLworI2RlZmluZSBTQ0xCX1JDX1RGQ0IxICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogVFggUHJpb3JpdHkgMSBGQ0IgQ2hhaW4gKi8KKyNkZWZpbmUgU0NMQl9SQ19URkNCMiAgICAgICAgICAgICAgICAgICAweDA0MDAgIC8qIFRYIFByaW9yaXR5IDIgRkNCIENoYWluICovCisjZGVmaW5lIFNDTEJfUkNfVEZDQjMgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBUWCBQcmlvcml0eSAzIEZDQiBDaGFpbiAqLworI2RlZmluZSBTQ0xCX1JDX1RGQ0I0ICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogVFggUHJpb3JpdHkgNCBGQ0IgQ2hhaW4gKi8KKyNkZWZpbmUgU0NMQl9SQ19URkNCNSAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIFRYIFByaW9yaXR5IDUgRkNCIENoYWluICovCisjZGVmaW5lIFNDTEJfUkNfVEZDQjYgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBUWCBQcmlvcml0eSA2IEZDQiBDaGFpbiAqLworI2RlZmluZSBTQ0xCX1JDX1RGQ0I3ICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogVFggUHJpb3JpdHkgNyBGQ0IgQ2hhaW4gKi8KKworI2RlZmluZSBTQ0xCX0lNQ19SRVMwICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogKi8KKyNkZWZpbmUgU0NMQl9JTUNfTUFDX1RZUEVfMyAgICAgICAgICAgICAweDAwMDIgIC8qIE1BQ19BUkNfSU5ESUNBVEUgKi8KKyNkZWZpbmUgU0NMQl9JTUNfTUFDX0VSUk9SX0NPVU5URVJTICAgICAweDAwMDQgIC8qICovCisjZGVmaW5lIFNDTEJfSU1DX1JFUzEgICAgICAgICAgICAgICAgICAgMHgwMDA4ICAvKiAqLworI2RlZmluZSBTQ0xCX0lNQ19NQUNfVFlQRV8yICAgICAgICAgICAgIDB4MDAxMCAgLyogUVVFX01BQ19JTkRJQ0FURSAqLworI2RlZmluZSBTQ0xCX0lNQ19UWF9GUkFNRSAgICAgICAgICAgICAgIDB4MDAyMCAgLyogKi8KKyNkZWZpbmUgU0NMQl9JTUNfRU5EX09GX1RYX1FVRVVFICAgICAgICAweDAwNDAgIC8qICovCisjZGVmaW5lIFNDTEJfSU1DX05PTl9NQUNfUlhfUkVTT1VSQ0UgICAgMHgwMDgwICAvKiAqLworI2RlZmluZSBTQ0xCX0lNQ19NQUNfUlhfUkVTT1VSQ0UgICAgICAgIDB4MDEwMCAgLyogKi8KKyNkZWZpbmUgU0NMQl9JTUNfTk9OX01BQ19SWF9GUkFNRSAgICAgICAweDAyMDAgIC8qICovCisjZGVmaW5lIFNDTEJfSU1DX01BQ19SWF9GUkFNRSAgICAgICAgICAgMHgwNDAwICAvKiAqLworI2RlZmluZSBTQ0xCX0lNQ19UUkNfRklGT19TVEFUVVMgICAgICAgIDB4MDgwMCAgLyogKi8KKyNkZWZpbmUgU0NMQl9JTUNfQ09NTUFORF9TVEFUVVMgICAgICAgICAweDEwMDAgIC8qICovCisjZGVmaW5lIFNDTEJfSU1DX01BQ19UWVBFXzEgICAgICAgICAgICAgMHgyMDAwICAvKiBTZWxmIFJlbW92ZWQgKi8KKyNkZWZpbmUgU0NMQl9JTUNfVFJDX0lOVFJOTF9UU1RfU1RBVFVTICAweDQwMDAgIC8qICovCisjZGVmaW5lIFNDTEJfSU1DX1JFUzIgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiAqLworCisjZGVmaW5lIERNQV9UUklHR0VSICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEZSRVFfMTZNQl9CSVQgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIFRIRFJFTiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIENGRzBfUlNWMSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIENGRzBfUlNWMiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIEVUUkVOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFJYX09XTl9CSVQgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCisjZGVmaW5lIFJYQVRNQUMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFBST01JU0NVT1VTX0JJVCAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIFVTRVRQVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFNBVkJBRF9CSVQgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIE9ORVFVRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIE5PX0FVVE9SRU1PVkUgICAgICAgICAgICAgICAgICAgMHg4MDAwCisKKyNkZWZpbmUgUlhfRkNCX0FSRUFfODMxNiAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBSWF9CVUZGX0FSRUFfODMxNiAgICAgICAweDAwMDAwMDAwCisKKyNkZWZpbmUgVFJDX1BPSU5URVIoWCkgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKShYKSAtIHRwLT5yYW1fYWNjZXNzKQorI2RlZmluZSBSWF9GQ0JfVFJDX1BPSU5URVIoWCkgICAoKHVuc2lnbmVkIGxvbmcpKFgpIC0gdHAtPnJhbV9hY2Nlc3MgKyBSWF9GQ0JfQVJFQV84MzE2KQorI2RlZmluZSBSWF9CVUZGX1RSQ19QT0lOVEVSKFgpICgodW5zaWduZWQgbG9uZykoWCkgLSB0cC0+cmFtX2FjY2VzcyArIFJYX0JVRkZfQVJFQV84MzE2KQorCisvLyBPZmZzZXQgMDogTVNSIC0gTWVtb3J5IFNlbGVjdCBSZWdpc3RlcgorLy8KKyNkZWZpbmUgcjU4N19NU1IgICAgICAgIDB4MDAwICAgLy8gUmVnaXN0ZXIgT2Zmc2V0CisvLyNkZWZpbmUgICAgICAgTVNSX1JTVCAgICAgICAgIDB4MDgwICAgLy8gTEFOIENvbnRyb2xsZXIgUmVzZXQKKyNkZWZpbmUgTVNSX01FTkIgICAgICAgIDB4MDQwICAgLy8gU2hhcmVkIE1lbW9yeSBFbmFibGUKKyNkZWZpbmUgTVNSX1JBMTggICAgICAgIDB4MDIwICAgLy8gUmFtIEFkZHJlc3MgYml0IDE4ICAgKDU4MywgNTg0LCA1ODcpCisjZGVmaW5lIE1TUl9SQTE3ICAgICAgICAweDAxMCAgIC8vIFJhbSBBZGRyZXNzIGJpdCAxNyAgICg1ODMsIDU4NCwgNTg1Lzc5MCkKKyNkZWZpbmUgTVNSX1JBMTYgICAgICAgIDB4MDA4ICAgLy8gUmFtIEFkZHJlc3MgYml0IDE2ICAgKDU4MywgNTg0LCA1ODUvNzkwKQorI2RlZmluZSBNU1JfUkExNSAgICAgICAgMHgwMDQgICAvLyBSYW0gQWRkcmVzcyBiaXQgMTUgICAoNTgzLCA1ODQsIDU4NS83OTApCisjZGVmaW5lIE1TUl9SQTE0ICAgICAgICAweDAwMiAgIC8vIFJhbSBBZGRyZXNzIGJpdCAxNCAgICg1ODMsIDU4NCwgNTg1Lzc5MCkKKyNkZWZpbmUgTVNSX1JBMTMgICAgICAgIDB4MDAxICAgLy8gUmFtIEFkZHJlc3MgYml0IDEzICAgKDU4MywgNTg0LCA1ODUvNzkwKQorCisjZGVmaW5lIE1TUl9NQVNLICAgICAgICAweDAzRiAgIC8vIE1hc2sgZm9yIEFkZHJlc3MgYml0cyBSQTE4LVJBMTMgKDU4MywgNTg0LCA1ODcpCisKKyNkZWZpbmUgTVNSICAgICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBJUlIgICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIEhXUiAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgTEFBUiAgICAgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBJTUNDUiAgICAgICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIExBUjAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQkRJRCAgICAgICAgICAgICAgICAgICAgMHgwRSAgICAvLyBBZGFwdGVyIElEIGJ5dGUgcmVnaXN0ZXIgb2Zmc2V0CisjZGVmaW5lIENTUiAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgUFIgICAgICAgICAgICAgICAgICAgICAgMHgxMQorCisjZGVmaW5lIE1TUl9SU1QgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgTVNSX01FTUIgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBNU1JfMFdTICAgICAgICAgICAgICAgICAweDIwCisKKyNkZWZpbmUgRk9SQ0VEXzE2QklUX01PREUgICAgICAgMHgwMDAyCisKKyNkZWZpbmUgSU5URVJGUkFNRV9TUEFDSU5HXzE2ICAgICAgICAgICAweDAwMDMgIC8qIDYgYnl0ZXMgKi8KKyNkZWZpbmUgSU5URVJGUkFNRV9TUEFDSU5HXzQgICAgICAgICAgICAweDAwMDEgIC8qIDIgYnl0ZXMgKi8KKyNkZWZpbmUgTVVMVElDQVNUX0FERFJFU1NfQklUICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgTk9OX1NSQ19ST1VUSU5HX0JJVCAgICAgICAgICAgICAweDAwMjAKKworI2RlZmluZSBMT09QSU5HX01PREVfTUFTSyAgICAgICAweDAwMDcKKworLyoKKyAqIERlY29kZSBmaXJtd2FyZSBkZWZpbmVzLgorICovCisjZGVmaW5lIFNXQVBfQllURVMoWCkJCSgoWCAmIDB4ZmYpIDw8IDgpIHwgKFggPj4gOCkKKyNkZWZpbmUgV0VJR0hUX09GRlNFVAkJNQorI2RlZmluZSBUUkVFX1NJWkVfT0ZGU0VUCTkKKyNkZWZpbmUgVFJFRV9PRkZTRVQJCTExCisKKy8qIFRoZSBIdWZmbWFuIEVuY29kaW5nIFRyZWUgaXMgY29uc3RydWN0ZWQgb2YgdGhlc2Ugbm9kZXMuICovCit0eXBlZGVmIHN0cnVjdCB7CisJX191OAlsbGluazsJLyogU2hvcnQgdmVyc2lvbiBvZiBhYm92ZSBub2RlLiAqLworCV9fdTgJdGFnOworCV9fdTgJaW5mbzsJLyogVGhpcyBub2RlIGlzIHVzZWQgb24gZGVjb2Rlcy4gKi8KKwlfX3U4CXJsaW5rOworfSBERUNPREVfVFJFRV9OT0RFOworCisjZGVmaW5lIFJPT1QJMAkvKiBCcmFuY2ggdmFsdWUuICovCisjZGVmaW5lIExFQUYJMAkvKiBUYWcgZmllbGQgdmFsdWUuICovCisjZGVmaW5lIEJSQU5DSAkxCS8qIFRhZyBmaWVsZCB2YWx1ZS4gKi8KKworLyoKKyAqIE11bHRpY2FzdCBUYWJsZSBTdHJ1Y3R1cmUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBfX3U4ICAgIGFkZHJlc3NbNl07CisgICAgICAgIF9fdTggICAgaW5zdGFuY2VfY291bnQ7Cit9IE1jVGFibGU7CisKKy8qCisgKiBGcmFnbWVudCBEZXNjcmlwdG9yIERlZmluaXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBfX3U4ICAqZnJhZ21lbnRfcHRyOworICAgICAgICBfX3UzMiAgIGZyYWdtZW50X2xlbmd0aDsKK30gRnJhZ21lbnRTdHJ1Y3R1cmU7CisKKy8qCisgKiBEYXRhIEJ1ZmZlciBTdHJ1Y3R1cmUgRGVmaW5pdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIF9fdTMyIGZyYWdtZW50X2NvdW50OworICAgICAgICBGcmFnbWVudFN0cnVjdHVyZSAgICAgICBmcmFnbWVudF9saXN0W01BWEZSQUdNRU5UU107Cit9IERhdGFCdWZmZXJTdHJ1Y3R1cmU7CisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICAgICAgICAgIF9fdTggICAgSVR5cGU7CisgICAgICAgICAgICAgICAgX191OCAgICBJU3VidHlwZTsKK30gSW50ZXJydXB0X1N0YXR1c19Xb3JkOworCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IEJEQmxvY2tUeXBlIHsKKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBpbmZvOyAgICAgICAgICAgICAgICAgICAvKiAwMiAqLworICAgICAgICAgICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHRyY19uZXh0X3B0cjsgICAgICAgICAgIC8qIDA2ICovCisgICAgICAgICAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgdHJjX2RhdGFfYmxvY2tfcHRyOyAgICAgLyogMTAgKi8KKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBidWZmZXJfbGVuZ3RoOyAgICAgICAgICAvKiAxMiAqLworCisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgKmRhdGFfYmxvY2tfcHRyOyAgICAgICAgLyogMTYgKi8KKyAgICAgICAgICAgICAgICBzdHJ1Y3QgIEJEQmxvY2tUeXBlICAgICAqbmV4dF9wdHI7ICAgICAgICAgICAgICAvKiAyMCAqLworICAgICAgICAgICAgICAgIHN0cnVjdCAgQkRCbG9ja1R5cGUgICAgICpiYWNrX3B0cjsgICAgICAgICAgICAgIC8qIDI0ICovCisgICAgICAgICAgICAgICAgX191OCAgICAgICAgICAgICAgICAgICAgZmlsbGVyWzhdOyAgICAgICAgICAgICAgLyogMzIgKi8KK30gQkRCbG9jazsKKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCBGQ0Jsb2NrVHlwZSB7CisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgZnJhbWVfc3RhdHVzOyAgICAgICAgICAgLyogMDIgKi8KKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBpbmZvOyAgICAgICAgICAgICAgICAgICAvKiAwNCAqLworICAgICAgICAgICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHRyY19uZXh0X3B0cjsgICAgICAgICAgIC8qIDA4ICovCisgICAgICAgICAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgdHJjX2JkYl9wdHI7ICAgICAgICAgICAgLyogMTIgKi8KKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBmcmFtZV9sZW5ndGg7ICAgICAgICAgICAvKiAxNCAqLworCisgICAgICAgICAgICAgICAgQkRCbG9jayAgICAgICAgICAgICAgICAgKmJkYl9wdHI7ICAgICAgICAgICAgICAgLyogMTggKi8KKyAgICAgICAgICAgICAgICBzdHJ1Y3QgIEZDQmxvY2tUeXBlICAgICAqbmV4dF9wdHI7ICAgICAgICAgICAgICAvKiAyMiAqLworICAgICAgICAgICAgICAgIHN0cnVjdCAgRkNCbG9ja1R5cGUgICAgICpiYWNrX3B0cjsgICAgICAgICAgICAgIC8qIDI2ICovCisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgbWVtb3J5X2FsbG9jOyAgICAgICAgICAgLyogMjggKi8KKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICBmaWxsZXJbNF07ICAgICAgICAgICAgICAvKiAzMiAqLworCit9IEZDQmxvY2s7CisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgU0Jsb2NrVHlwZXsKKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJuYWxfRXJyb3JfQ291bnQ7CisgICAgICAgICAgICAgICAgX191OCAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVfRXJyb3JfQ291bnQ7CisgICAgICAgICAgICAgICAgX191OCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDX0Vycm9yX0NvdW50OworICAgICAgICAgICAgICAgIF9fdTggICAgICAgICAgICAgICAgICAgICAgICAgICBCdXJzdF9FcnJvcl9Db3VudDsKKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFU0VSVkVEX0NPVU5URVJfMDsKKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEX1RSQU5TX0NvdW50OworICAgICAgICAgICAgICAgIF9fdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgUkNWX0Nvbmdlc3Rpb25fQ291bnQ7CisgICAgICAgICAgICAgICAgX191OCAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb3N0X0ZSX0Vycm9yX0NvdW50OworICAgICAgICAgICAgICAgIF9fdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJFUV9FcnJvcl9Db3VudDsKKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSX0NvcGllZF9FcnJvcl9Db3VudDsKKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFU0VSVkVEX0NPVU5URVJfMTsKKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuX0Vycm9yX0NvdW50OworCisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgICAgICAgICBUSV9ORElTX1JpbmdfU3RhdHVzOworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNOX1R5cGU7CisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcl9Db2RlOworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgU0Ffb2ZfTGFzdF9BTVBfU01QWzNdOworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5BWzNdOworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgVWNvZGVfVmVyc2lvbl9OdW1iZXI7CisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNfQ0hHX0luZGljYXRlOworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVTRVJWRURfU1RBVFVTXzA7Cit9IFNCbG9jazsKKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCBBQ0Jsb2NrVHlwZSB7CisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgY21kX2RvbmVfc3RhdHVzOyAgICAvKiAwMiAqLworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgIGNtZF9pbmZvOyAgICAgICAgICAgLyogMDQgKi8KKyAgICAgICAgICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICB0cmNfbmV4dF9wdHI7ICAgICAgICAgICAvKiAwOCAqLworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgIGNtZDsgICAgICAgICAgICAgICAgLyogMTAgKi8KKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBzdWJjbWQ7ICAgICAgICAgICAgIC8qIDEyICovCisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXRfbG87ICAgICAgICAgLyogMTQgKi8KKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldF9oaTsgICAgICAgICAvKiAxNiAqLworCisgICAgICAgICAgICAgICAgc3RydWN0ICBBQ0Jsb2NrVHlwZSAgICAgKm5leHRfcHRyOyAgICAgICAgICAgICAgLyogMjAgKi8KKworICAgICAgICAgICAgICAgIF9fdTggICAgICAgICAgICAgICAgICAgIGZpbGxlclsxMl07ICAgICAgICAgICAgIC8qIDMyICovCit9IEFDQmxvY2s7CisKKyNkZWZpbmUgTlVNX09GX0lOVEVSUlVQVFMgICAgICAgICAgICAgICAweDIwCisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICAgICAgICAgIEludGVycnVwdF9TdGF0dXNfV29yZCAgIElTdGF0dXNbTlVNX09GX0lOVEVSUlVQVFNdOworfSBJU0Jsb2NrOworCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICB2YWxpZF9jb21tYW5kOyAgICAgICAgICAvKiAwMiAqLworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgIGlhY2tfY29kZTsgICAgICAgICAgICAgIC8qIDA0ICovCisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgcmVzdW1lX2NvbnRyb2w7ICAgICAgICAgLyogMDYgKi8KKyAgICAgICAgICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBpbnRfbWFza19jb250cm9sOyAgICAgICAvKiAwOCAqLworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgIGludF9tYXNrX3N0YXRlOyAgICAgICAgIC8qIDEwICovCisKKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICBmaWxsZXJbNl07ICAgICAgICAgICAgICAvKiAxNiAqLworfSBTQ0xCbG9jazsKKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdAoreworICAgICAgICAgICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgIGNvbmZpZzsgICAgICAgICAgICAgICAgIC8qIDAyICovCisgICAgICAgICAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgdHJjX3NjbGJfcHRyOyAgICAgICAgICAgLyogMDYgKi8KKyAgICAgICAgICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICB0cmNfYWNiX3B0cjsgICAgICAgICAgICAvKiAxMCAqLworICAgICAgICAgICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHRyY19pc2JfcHRyOyAgICAgICAgICAgIC8qIDE0ICovCisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgaXNic2l6OyAgICAgICAgICAgICAgICAgLyogMTYgKi8KKworICAgICAgICAgICAgICAgIFNDTEJsb2NrICAgICAgICAgICAgICAgICpzY2xiX3B0cjsgICAgICAgICAgICAgIC8qIDIwICovCisgICAgICAgICAgICAgICAgQUNCbG9jayAgICAgICAgICAgICAgICAgKmFjYl9wdHI7ICAgICAgICAgICAgICAgLyogMjQgKi8KKyAgICAgICAgICAgICAgICBJU0Jsb2NrICAgICAgICAgICAgICAgICAqaXNiX3B0cjsgICAgICAgICAgICAgICAvKiAyOCAqLworCisgICAgICAgICAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgTm9uX01hY19SeF9CZGJzOyAgICAgICAgLyogMzAgREVCVUcgKi8KKyAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICBmaWxsZXJbMl07ICAgICAgICAgICAgICAvKiAzMiAqLworCit9IFNDR0Jsb2NrOworCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0Cit7CisJX191MzIJCXRyY19zY2diX3B0cjsKKwlTQ0dCbG9jawkqc2NnYl9wdHI7Cit9IElTQ1BCbG9jazsKKyNwcmFnbWEgcGFjaygpCisKK3R5cGVkZWYgc3RydWN0IG5ldF9sb2NhbCB7CisJSVNDUEJsb2NrICAgICAgICppc2NwYl9wdHI7CisgICAgICAgIFNDR0Jsb2NrICAgICAgICAqc2NnYl9wdHI7CisgICAgICAgIFNDTEJsb2NrICAgICAgICAqc2NsYl9wdHI7CisgICAgICAgIElTQmxvY2sgICAgICAgICAqaXNiX3B0cjsKKworCUFDQmxvY2sgICAgICAgICAqYWNiX2hlYWQ7CisgICAgICAgIEFDQmxvY2sgICAgICAgICAqYWNiX2N1cnI7CisgICAgICAgIEFDQmxvY2sgICAgICAgICAqYWNiX25leHQ7CisKKwlfX3U4CQlhZGFwdGVyX25hbWVbMTJdOworCisJX191MTYJCW51bV9yeF9iZGJzCVtOVU1fUlhfUVNfVVNFRF07CisJX191MTYJCW51bV9yeF9mY2JzCVtOVU1fUlhfUVNfVVNFRF07CisKKwlfX3UxNgkJbnVtX3R4X2JkYnMJW05VTV9UWF9RU19VU0VEXTsKKwlfX3UxNgkJbnVtX3R4X2ZjYnMJW05VTV9UWF9RU19VU0VEXTsKKworCV9fdTE2CQludW1fb2ZfdHhfYnVmZnM7CisKKwlfX3UxNgkJdHhfYnVmZl9zaXplCVtOVU1fVFhfUVNfVVNFRF07CisJX191MTYJCXR4X2J1ZmZfdXNlZAlbTlVNX1RYX1FTX1VTRURdOworCV9fdTE2CQl0eF9xdWV1ZV9zdGF0dXMJW05VTV9UWF9RU19VU0VEXTsKKworCUZDQmxvY2sJCSp0eF9mY2JfaGVhZFtOVU1fVFhfUVNfVVNFRF07CisJRkNCbG9jawkJKnR4X2ZjYl9jdXJyW05VTV9UWF9RU19VU0VEXTsKKwlGQ0Jsb2NrCQkqdHhfZmNiX2VuZFtOVU1fVFhfUVNfVVNFRF07CisJQkRCbG9jawkJKnR4X2JkYl9oZWFkW05VTV9UWF9RU19VU0VEXTsKKwlfX3UxNgkJKnR4X2J1ZmZfaGVhZFtOVU1fVFhfUVNfVVNFRF07CisJX191MTYJCSp0eF9idWZmX2VuZFtOVU1fVFhfUVNfVVNFRF07CisJX191MTYJCSp0eF9idWZmX2N1cnJbTlVNX1RYX1FTX1VTRURdOworCV9fdTE2CQludW1fdHhfZmNic191c2VkW05VTV9UWF9RU19VU0VEXTsKKworCUZDQmxvY2sJCSpyeF9mY2JfaGVhZFtOVU1fUlhfUVNfVVNFRF07CisJRkNCbG9jawkJKnJ4X2ZjYl9jdXJyW05VTV9SWF9RU19VU0VEXTsKKwlCREJsb2NrCQkqcnhfYmRiX2hlYWRbTlVNX1JYX1FTX1VTRURdOworCUJEQmxvY2sJCSpyeF9iZGJfY3VycltOVU1fUlhfUVNfVVNFRF07CisJQkRCbG9jawkJKnJ4X2JkYl9lbmRbTlVNX1JYX1FTX1VTRURdOworCV9fdTE2CQkqcnhfYnVmZl9oZWFkW05VTV9SWF9RU19VU0VEXTsKKwlfX3UxNgkJKnJ4X2J1ZmZfZW5kW05VTV9SWF9RU19VU0VEXTsKKworCV9fdTMyCQkqcHRyX2xvY2FsX3JpbmdfbnVtOworCisJX191MzIJCXNoX21lbV91c2VkOworCisJX191MTYJCXBhZ2Vfb2Zmc2V0X21hc2s7CisKKwlfX3UxNgkJYXV0aG9yaXplZF9mdW5jdGlvbl9jbGFzc2VzOworCV9fdTE2CQlhdXRob3JpemVkX2FjY2Vzc19wcmlvcml0eTsKKworICAgICAgICBfX3UxNiAgICAgICAgICAgIG51bV9hY2JzOworICAgICAgICBfX3UxNiAgICAgICAgICAgIG51bV9hY2JzX3VzZWQ7CisgICAgICAgIF9fdTE2ICAgICAgICAgICAgYWNiX3BlbmRpbmc7CisKKwlfX3UxNgkJY3VycmVudF9pc2JfaW5kZXg7CisKKwlfX3U4ICAgICAgICAgICAgbW9uaXRvcl9zdGF0ZTsKKwlfX3U4CQltb25pdG9yX3N0YXRlX3JlYWR5OworCV9fdTE2CQlyaW5nX3N0YXR1czsKKwlfX3U4CQlyaW5nX3N0YXR1c19mbGFnczsKKwlfX3U4CQljdXJyZW50X3Jpbmdfc3RhdHVzOworCV9fdTgJCXN0YXRlOworCisJX191OAkJam9pbl9zdGF0ZTsKKworCV9fdTgJCXNsb3RfbnVtOworCV9fdTE2CQlwb3NfaWQ7CisKKwlfX3UzMgkJKnB0cl91bmE7CisJX191MzIJCSpwdHJfYmNuX3R5cGU7CisJX191MzIJCSpwdHJfdHhfZmlmb191bmRlcnJ1bnM7CisJX191MzIJCSpwdHJfcnhfZmlmb191bmRlcnJ1bnM7CisJX191MzIJCSpwdHJfcnhfZmlmb19vdmVycnVuczsKKwlfX3UzMgkJKnB0cl90eF9maWZvX292ZXJydW5zOworCV9fdTMyCQkqcHRyX3R4X2ZjYl9vdmVycnVuczsKKwlfX3UzMgkJKnB0cl9yeF9mY2Jfb3ZlcnJ1bnM7CisJX191MzIJCSpwdHJfdHhfYmRiX292ZXJydW5zOworCV9fdTMyCQkqcHRyX3J4X2JkYl9vdmVycnVuczsKKworCV9fdTE2CQlyZWNlaXZlX3F1ZXVlX251bWJlcjsKKworCV9fdTgJCXJ4X2ZpZm9fb3ZlcnJ1bl9jb3VudDsKKwlfX3U4CQl0eF9maWZvX292ZXJydW5fY291bnQ7CisKKwlfX3UxNiAgICAgICAgICAgIGFkYXB0ZXJfZmxhZ3M7CisJX191MTYJCWFkYXB0ZXJfZmxhZ3MxOworCV9fdTE2ICAgICAgICAgICAgKm1pc2NfY29tbWFuZF9kYXRhOworCV9fdTE2ICAgICAgICAgICAgbWF4X3BhY2tldF9zaXplOworCisJX191MTYgICAgICAgICAgICBjb25maWdfd29yZDA7CisgICAgICAgIF9fdTE2ICAgICAgICAgICAgY29uZmlnX3dvcmQxOworCisJX191OCAgICAgICAgICAgIHRyY19tYXNrOworCisJX191MTYgICAgICAgICAgICBzb3VyY2VfcmluZ19udW1iZXI7CisgICAgICAgIF9fdTE2ICAgICAgICAgICAgdGFyZ2V0X3JpbmdfbnVtYmVyOworCisJX191MTYJCW1pY3JvY29kZV92ZXJzaW9uOworCisJX191MTYgICAgICAgICAgICBiaWNfdHlwZTsKKyAgICAgICAgX191MTYgICAgICAgICAgICBuaWNfdHlwZTsKKyAgICAgICAgX191MTYgICAgICAgICAgICBib2FyZF9pZDsKKworCV9fdTE2ICAgICAgICAgICAgcm9tX3NpemU7CisJX191MzIJCXJvbV9iYXNlOworICAgICAgICBfX3UxNiAgICAgICAgICAgIHJhbV9zaXplOworICAgICAgICBfX3UxNiAgICAgICAgICAgIHJhbV91c2FibGU7CisJX191MzIJCXJhbV9iYXNlOworCV9fdTMyCQlyYW1fYWNjZXNzOworCisJX191MTYgICAgICAgICAgICBleHRyYV9pbmZvOworICAgICAgICBfX3UxNiAgICAgICAgICAgIG1vZGVfYml0czsKKwlfX3UxNgkJbWVkaWFfbWVudTsKKwlfX3UxNgkJbWVkaWFfdHlwZTsKKwlfX3UxNgkJYWRhcHRlcl9idXM7CisKKwlfX3UxNgkJc3RhdHVzOworCV9fdTE2ICAgICAgICAgICAgcmVjZWl2ZV9tYXNrOworCisJX191MTYgICAgICAgICAgICBncm91cF9hZGRyZXNzXzA7CisgICAgICAgIF9fdTE2ICAgICAgICAgICAgZ3JvdXBfYWRkcmVzc1syXTsKKyAgICAgICAgX191MTYgICAgICAgICAgICBmdW5jdGlvbmFsX2FkZHJlc3NfMDsKKyAgICAgICAgX191MTYgICAgICAgICAgICBmdW5jdGlvbmFsX2FkZHJlc3NbMl07CisgICAgICAgIF9fdTE2ICAgICAgICAgICAgYml0d2lzZV9ncm91cF9hZGRyZXNzWzJdOworCisJX191OCAgICAgICAgICAgICpwdHJfdWNvZGU7CisKKwlfX3U4CQljbGVhbnVwOworCisJc3RydWN0IHNrX2J1ZmZfaGVhZCBTZW5kU2tiUXVldWU7CisgICAgICAgIF9fdTE2IFF1ZXVlU2tiOworCisJc3RydWN0IHRyX3N0YXRpc3RpY3MgTWFjU3RhdDsgICAvKiBNQUMgc3RhdGlzdGljcyBzdHJ1Y3R1cmUgKi8KKwkKKwlzcGlubG9ja190CWxvY2s7Cit9IE5FVF9MT0NBTDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU05NUC1PTi1CT0FSRCBBZ2VudCBMaW5rIFN0cnVjdHVyZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBfX3U4ICAgICAgICAgICBMbmtTaWdTdHJbMTJdOyAvKiBzaWduYXR1cmUgc3RyaW5nICJTbWNMaW5rVGFibGUiICovCisgICAgICAgIF9fdTggICAgICAgICAgIExua0RydlR5cDsgICAgIC8qIDE9UmVkYm94IE9ESSwgMj1PREkgRE9TLCAzPU9ESSBPUy8yLCA0PU5ESVMgRE9TICovCisgICAgICAgIF9fdTggICAgICAgICAgIExua0ZsZzsgICAgICAgIC8qIDAgaWYgbm8gYWdlbnQgbGlua2VkLCAxIGlmIGFnZW50IGxpbmtlZCAqLworICAgICAgICB2b2lkICAgICAgICAgICAqTG5rTmZvOyAgICAgICAvKiByb3V0aW5lIHdoaWNoIHJldHVybnMgcG9pbnRlciB0byBOSUMgaW5mbyAqLworICAgICAgICB2b2lkICAgICAgICAgICAqTG5rQWd0UmN2OyAgICAvKiBwb2ludGVyIHRvIGFnZW50IHJlY2VpdmUgdHJhcCBlbnRyeSAqLworICAgICAgICB2b2lkICAgICAgICAgICAqTG5rQWd0WG10OyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYWdlbnQgdHJhbnNtaXQgdHJhcAorZW50cnkgICovCit2b2lkICAgICAgICAgICAqTG5rR2V0OyAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gTklDIHJlY2VpdmUgZGF0YQorY29weSByb3V0aW5lICovCisgICAgICAgIHZvaWQgICAgICAgICAgICpMbmtTbmQ7ICAgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBOSUMgc2VuZCByb3V0aW5lCisqLworICAgICAgICB2b2lkICAgICAgICAgICAqTG5rUnN0OyAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gTklDIGRyaXZlciByZXNldAorcm91dGluZSAqLworICAgICAgICB2b2lkICAgICAgICAgICAqTG5rTWliOyAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gTUlCIGRhdGEgYmFzZSAqLworICAgICAgICB2b2lkICAgICAgICAgICAqTG5rTWliQWN0OyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gTUlCIGFjdGlvbiByb3V0aW5lIGxpc3QgKi8KKyAgICAgICAgX191MTYgICAgICAgICAgIExua0NudE9mZnNldDsgIC8qIG9mZnNldCB0byBlcnJvciBjb3VudGVycyAqLworICAgICAgICBfX3UxNiAgICAgICAgICAgTG5rQ250TnVtOyAgICAgLyogbnVtYmVyIG9mIGVycm9yIGNvdW50ZXJzICovCisgICAgICAgIF9fdTE2ICAgICAgICAgICBMbmtDbnRTaXplOyAgICAvKiBzaXplIG9mIGVycm9yIGNvdW50ZXJzIGkuZS4gMzIgPSAzMiBiaXRzICovCisgICAgICAgIHZvaWQgICAgICAgICAgICpMbmtJU1I7ICAgICAgIC8qIHBvaW50ZXIgdG8gaW50ZXJydXB0IHZlY3RvciAqLworICAgICAgICBfX3U4ICAgICAgICAgICBMbmtGcm1UeXA7ICAgICAvKiAxPUV0aGVybmV0LCAyPVRva2VuIFJpbmcgKi8KKyAgICAgICAgX191OCAgICAgICAgICAgTG5rRHJ2VmVyMSA7ICAgLyogZHJpdmVyIG1ham9yIHZlcnNpb24gKi8KKyAgICAgICAgX191OCAgICAgICAgICAgTG5rRHJ2VmVyMiA7ICAgLyogZHJpdmVyIG1pbm9yIHZlcnNpb24gKi8KK30gQWdlbnRMaW5rOworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIHBjbV9jYXJkX2ZsYWdzKGJpdF9tYXBwZWQpCisgKi8KKyNkZWZpbmUgUkVHX0NPTVBMRVRFICAgMHgwMDAxCisjZGVmaW5lIElOU0VSVEVEICAgICAgIDB4MDAwMgorI2RlZmluZSBQQ0NfSU5TRVJURUQgICAweDAwMDQgICAgICAgICAvKiAxPWN1cnJlbnRseSBpbnNlcnRlZCwgMD1jdXIgcmVtb3ZlZCAqLworCisvKgorICogQWRhcHRlciBSQU0gdGVzdCBwYXR0ZXJucworICovCisjZGVmaW5lIFJBTV9QQVRURVJOXzEgIDB4NTVBQQorI2RlZmluZSBSQU1fUEFUVEVSTl8yICAweDkyNDkKKyNkZWZpbmUgUkFNX1BBVFRFUk5fMyAgMHhEQjZECisKKy8qCisgKiBkZWZpbml0aW9ucyBmb3IgUkFNIHRlc3QKKyAqLworI2RlZmluZSBST01fU0lHTkFUVVJFICAweEFBNTUKKyNkZWZpbmUgTUlOX1JPTV9TSVpFICAgMHgyMDAwCisKKy8qCisgKiBSZXR1cm4gQ29kZXMKKyAqLworI2RlZmluZSBTVUNDRVNTICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgQURBUFRFUl9BTkRfQ09ORklHICAgICAgMHgwMDAxCisjZGVmaW5lIEFEQVBURVJfTk9fQ09ORklHICAgICAgIDB4MDAwMgorI2RlZmluZSBOT1RfTVlfSU5URVJSVVBUICAgICAgICAweDAwMDMKKyNkZWZpbmUgRlJBTUVfUkVKRUNURUQgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEVWRU5UU19ESVNBQkxFRCAgICAgICAgIDB4MDAwNQorI2RlZmluZSBPVVRfT0ZfUkVTT1VSQ0VTICAgICAgICAweDAwMDYKKyNkZWZpbmUgSU5WQUxJRF9QQVJBTUVURVIgICAgICAgMHgwMDA3CisjZGVmaW5lIElOVkFMSURfRlVOQ1RJT04gICAgICAgIDB4MDAwOAorI2RlZmluZSBJTklUSUFMSVpFX0ZBSUxFRCAgICAgICAweDAwMDkKKyNkZWZpbmUgQ0xPU0VfRkFJTEVEICAgICAgICAgICAgMHgwMDBBCisjZGVmaW5lIE1BWF9DT0xMSVNJT05TICAgICAgICAgIDB4MDAwQgorI2RlZmluZSBOT19TVUNIX0RFU1RJTkFUSU9OICAgICAweDAwMEMKKyNkZWZpbmUgQlVGRkVSX1RPT19TTUFMTF9FUlJPUiAgMHgwMDBECisjZGVmaW5lIEFEQVBURVJfQ0xPU0VEICAgICAgICAgIDB4MDAwRQorI2RlZmluZSBVQ09ERV9OT1RfUFJFU0VOVCAgICAgICAweDAwMEYKKyNkZWZpbmUgRklGT19VTkRFUlJVTiAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIERFU1RfT1VUX09GX1JFU09VUkNFUyAgIDB4MDAxMQorI2RlZmluZSBBREFQVEVSX05PVF9JTklUSUFMSVpFRCAweDAwMTIKKyNkZWZpbmUgUEVORElORyAgICAgICAgICAgICAgICAgMHgwMDEzCisjZGVmaW5lIFVDT0RFX1BSRVNFTlQgICAgICAgICAgIDB4MDAxNAorI2RlZmluZSBOT1RfSU5JVF9CWV9CUklER0UgICAgICAweDAwMTUKKworI2RlZmluZSBPUEVOX0ZBSUxFRCAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgSEFSRFdBUkVfRkFJTEVEICAgICAgICAgMHgwMDgxCisjZGVmaW5lIFNFTEZfVEVTVF9GQUlMRUQgICAgICAgIDB4MDA4MgorI2RlZmluZSBSQU1fVEVTVF9GQUlMRUQgICAgICAgICAweDAwODMKKyNkZWZpbmUgUkFNX0NPTkZMSUNUICAgICAgICAgICAgMHgwMDg0CisjZGVmaW5lIFJPTV9DT05GTElDVCAgICAgICAgICAgIDB4MDA4NQorI2RlZmluZSBVTktOT1dOX0FEQVBURVIgICAgICAgICAweDAwODYKKyNkZWZpbmUgQ09ORklHX0VSUk9SICAgICAgICAgICAgMHgwMDg3CisjZGVmaW5lIENPTkZJR19XQVJOSU5HICAgICAgICAgIDB4MDA4OAorI2RlZmluZSBOT19GSVhFRF9DTkZHICAgICAgICAgICAweDAwODkKKyNkZWZpbmUgRUVST01fQ0tTVU1fRVJST1IgICAgICAgMHgwMDhBCisjZGVmaW5lIFJPTV9TSUdOQVRVUkVfRVJST1IgICAgIDB4MDA4QgorI2RlZmluZSBST01fQ0hFQ0tTVU1fRVJST1IgICAgICAweDAwOEMKKyNkZWZpbmUgUk9NX1NJWkVfRVJST1IgICAgICAgICAgMHgwMDhECisjZGVmaW5lIFVOU1VQUE9SVEVEX05JQ19DSElQICAgIDB4MDA4RQorI2RlZmluZSBOSUNfUkVHX0VSUk9SICAgICAgICAgICAweDAwOEYKKyNkZWZpbmUgQklDX1JFR19FUlJPUiAgICAgICAgICAgMHgwMDkwCisjZGVmaW5lIE1JQ1JPQ09ERV9URVNUX0VSUk9SICAgIDB4MDA5MQorI2RlZmluZSBMT0JFX01FRElBX1RFU1RfRkFJTEVEICAweDAwOTIKKworI2RlZmluZSBBREFQVEVSX0ZPVU5EX0xBTl9DT1JSVVBUIDB4MDA5QgorCisjZGVmaW5lIEFEQVBURVJfTk9UX0ZPVU5EICAgICAgIDB4RkZGRgorCisjZGVmaW5lIElMTEVHQUxfRlVOQ1RJT04gICAgICAgIElOVkFMSURfRlVOQ1RJT04KKworLyogRXJyb3JzICovCisjZGVmaW5lIElPX0JBU0VfSU5WQUxJRCAgICAgICAgIDB4MDAwMQorI2RlZmluZSBJT19CQVNFX1JBTkdFICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgSVJRX0lOVkFMSUQgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIElSUV9SQU5HRSAgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBSQU1fQkFTRV9JTlZBTElEICAgICAgICAweDAwMTAKKyNkZWZpbmUgUkFNX0JBU0VfUkFOR0UgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIFJBTV9TSVpFX1JBTkdFICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBNRURJQV9JTlZBTElEICAgICAgICAgICAweDA4MDAKKworLyogV2FybmluZ3MgKi8KKyNkZWZpbmUgSVJRX01JU01BVENIICAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFJBTV9CQVNFX01JU01BVENIICAgICAgIDB4MDEwMAorI2RlZmluZSBSQU1fU0laRV9NSVNNQVRDSCAgICAgICAweDAyMDAKKyNkZWZpbmUgQlVTX01PREVfTUlTTUFUQ0ggICAgICAgMHgwNDAwCisKKyNkZWZpbmUgUlhfQ1JDX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUlhfQUxJR05NRU5UX0VSUk9SICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFJYX0hXX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIGZpZWxkIFJJTkdfU1RBVFVTX0ZMQUdTCisgKi8KKyNkZWZpbmUgUklOR19TVEFUVVNfQ0hBTkdFRCAgICAgICAgICAgICAgICAgICAgIDBYMDEKKyNkZWZpbmUgTU9OSVRPUl9TVEFURV9DSEFOR0VEICAgICAgICAgICAgICAgICAgIDBYMDIKKyNkZWZpbmUgSk9JTl9TVEFURV9DSEFOR0VEICAgICAgICAgICAgICAgICAgICAgIDBYMDQKKworLyoKKyAqIERlZmluaXRpb25zIGZvciB0aGUgZmllbGQgSk9JTl9TVEFURQorICovCisjZGVmaW5lIEpTX0JZUEFTU19TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEpTX0xPQkVfVEVTVF9TVEFURSAgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEpTX0RFVEVDVF9NT05JVE9SX1BSRVNFTlRfU1RBVEUgICAgICAgICAweDAyCisjZGVmaW5lIEpTX0FXQUlUX05FV19NT05JVE9SX1NUQVRFICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIEpTX0RVUExJQ0FURV9BRERSRVNTX1RFU1RfU1RBVEUgICAgICAgICAweDA0CisjZGVmaW5lIEpTX05FSUdIQk9SX05PVElGSUNBVElPTl9TVEFURSAgICAgICAgICAweDA1CisjZGVmaW5lIEpTX1JFUVVFU1RfSU5JVElBTElaQVRJT05fU1RBVEUgICAgICAgICAweDA2CisjZGVmaW5lIEpTX0pPSU5fQ09NUExFVEVfU1RBVEUgICAgICAgICAgICAgICAgICAweDA3CisjZGVmaW5lIEpTX0JZUEFTU19XQUlUX1NUQVRFICAgICAgICAgICAgICAgICAgICAweDA4CisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIGZpZWxkIE1PTklUT1JfU1RBVEUKKyAqLworI2RlZmluZSBNU19NT05JVE9SX0ZTTV9JTkFDVElWRSAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBNU19SRVBFQVRfQkVBQ09OX1NUQVRFICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBNU19SRVBFQVRfQ0xBSU1fVE9LRU5fU1RBVEUgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBNU19UUkFOU01JVF9DTEFJTV9UT0tFTl9TVEFURSAgICAgICAgICAgMHgwMworI2RlZmluZSBNU19TVEFOREJZX01PTklUT1JfU1RBVEUgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBNU19UUkFOU01JVF9CRUFDT05fU1RBVEUgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSBNU19BQ1RJVkVfTU9OSVRPUl9TVEFURSAgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBNU19UUkFOU01JVF9SSU5HX1BVUkdFX1NUQVRFICAgICAgICAgICAgMHgwNworI2RlZmluZSBNU19CRUFDT05fVEVTVF9TVEFURSAgICAgICAgICAgICAgICAgICAgMHgwOQorCisvKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBiaXQtZmllbGQgUklOR19TVEFUVVMKKyAqLworI2RlZmluZSBTSUdOQUxfTE9TUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIEhBUkRfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgU09GVF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBUUkFOU01JVF9CRUFDT04gICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIExPQkVfV0lSRV9GQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgQVVUT19SRU1PVkFMX0VSUk9SICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBSRU1PVkVfUkVDRUlWRUQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIENPVU5URVJfT1ZFUkZMT1cgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgU0lOR0xFX1NUQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBSSU5HX1JFQ09WRVJZICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIGZpZWxkIEJVU19UWVBFCisgKi8KKyNkZWZpbmUgQVRfQlVTICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBNQ0FfQlVTICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEVJU0FfQlVTICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgUENJX0JVUyAgICAgICAgICAgICAgICAgMHgwMworI2RlZmluZSBQQ01DSUFfQlVTICAgICAgICAgICAgICAweDA0CisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgYWRhcHRlcl9mbGFncworICovCisjZGVmaW5lIFJYX1ZBTElEX0xPT0tBSEVBRCAgICAgIDB4MDAwMQorI2RlZmluZSBGT1JDRURfMTZCSVRfTU9ERSAgICAgICAweDAwMDIKKyNkZWZpbmUgQURBUFRFUl9ESVNBQkxFRCAgICAgICAgMHgwMDA0CisjZGVmaW5lIFRSQU5TTUlUX0NIQUlOX0lOVCAgICAgIDB4MDAwOAorI2RlZmluZSBFQVJMWV9SWF9GUkFNRSAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgRUFSTFlfVFggICAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIEVBUkxZX1JYX0NPUFkgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBVU0VTX1BIWVNJQ0FMX0FERFIgICAgICAweDAwODAJCS8qIFJzdmQgZm9yIERFQyBQQ0kgYW5kIDkyMzIgKi8KKyNkZWZpbmUgTkVFRFNfUEhZU0lDQUxfQUREUiAgCTB4MDEwMCAgICAgICAJLyogUmVzZXJ2ZWQqLworI2RlZmluZSBSWF9TVEFUVVNfUEVORElORyAgICAgICAweDAyMDAKKyNkZWZpbmUgRVJYX0RJU0FCTEVEICAgICAgICAgCTB4MDQwMCAgICAgICAJLyogRUFSTFlfUlhfRU5BQkxFIHJjdl9tYXNrICovCisjZGVmaW5lIEVOQUJMRV9UWF9QRU5ESU5HICAgICAgIDB4MDgwMAorI2RlZmluZSBFTkFCTEVfUlhfUEVORElORyAgICAgICAweDEwMDAKKyNkZWZpbmUgUEVSTV9DTE9TRSAgICAgICAgICAgICAgMHgyMDAwICAKKyNkZWZpbmUgSU9fTUFQUEVEICAgICAgICAgICAgICAgMHg0MDAwICAJLyogSU9tYXBwZWQgYnVzIGludGVyZmFjZSA3OTUgKi8KKyNkZWZpbmUgRVRYX0RJU0FCTEVEICAgICAgICAgICAgMHg4MDAwCisKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBhZGFwdGVyX2ZsYWdzMQorICovCisjZGVmaW5lIFRYX1BIWV9SWF9WSVJUICAgICAgICAgIDB4MDAwMSAKKyNkZWZpbmUgTkVFRFNfSE9TVF9SQU0gICAgICAgICAgMHgwMDAyCisjZGVmaW5lIE5FRURTX01FRElBX1RZUEUgICAgICAgIDB4MDAwNAorI2RlZmluZSBFQVJMWV9SWF9ET05FICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgUE5QX0JPT1RfQklUICAgICAgICAgICAgMHgwMDEwICAvKiBhY3RpdmF0ZXMgUG5QICYgY29uZmlnIG9uIHBvd2VyLXVwICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgPT4gcmVndWxhciBQblAgb3BlcmF0aW9uICovCisjZGVmaW5lIFBOUF9FTkFCTEUgICAgICAgICAgICAgIDB4MDAyMCAgLyogcmVndWxhciBQblAgb3BlcmF0aW9uIGNsZWFyID0+ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gUG5QLCBvdmVycmlkZXMgUE5QX0JPT1RfQklUICovCisjZGVmaW5lIFNBVFVSTl9FTkFCTEUgICAgICAgICAgIDB4MDA0MAorCisjZGVmaW5lIEFEQVBURVJfUkVNT1ZBQkxFICAgICAgIDB4MDA4MCAJLyogYWRhcHRlciBpcyBob3Qgc3dhcHBhYmxlICovCisjZGVmaW5lIFRYX1BIWSAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogVXNlcyBwaHlzaWNhbCBhZGRyZXNzIGZvciB0eCBidWZzICovCisjZGVmaW5lIFJYX1BIWSAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogVXNlcyBwaHlzaWNhbCBhZGRyZXNzIGZvciByeCBidWZzICovCisjZGVmaW5lIFRYX1ZJUlQgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogVXNlcyB2aXJ0dWFsIGFkZHIgZm9yIHR4IGJ1ZnMgKi8KKyNkZWZpbmUgUlhfVklSVCAgICAgICAgICAgICAgICAgMHgwODAwIAorI2RlZmluZSBORUVEU19TRVJWSUNFICAgICAgICAgICAweDEwMDAgCisKKy8qCisgKiBBZGFwdGVyIFN0YXR1cyBDb2RlcworICovCisjZGVmaW5lIE9QRU4gICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBJTklUSUFMSVpFRCAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgQ0xPU0VEICAgICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIEZBSUxFRCAgICAgICAgICAgICAgICAgIDB4MDAwNQorI2RlZmluZSBOT1RfSU5JVElBTElaRUQgICAgICAgICAweDAwMDYKKyNkZWZpbmUgSU9fQ09ORkxJQ1QgICAgICAgICAgICAgMHgwMDA3CisjZGVmaW5lIENBUkRfUkVNT1ZFRCAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBDQVJEX0lOU0VSVEVEICAgICAgICAgICAweDAwMDkKKworLyoKKyAqIE1vZGUgQml0IERlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgSU5URVJSVVBUX1NUQVRVU19CSVQgICAgMHg4MDAwICAvKiBQQyBJbnRlcnJ1cHQgTGluZTogMCA9IE5vdCBFbmFibGVkICovCisjZGVmaW5lIEJPT1RfU1RBVFVTX01BU0sgICAgICAgIDB4NjAwMCAgLyogTWFzayB0byBpc29sYXRlIEJPT1RfU1RBVFVTICovCisjZGVmaW5lIEJPT1RfSU5ISUJJVCAgICAgICAgICAgIDB4MDAwMCAgLyogQk9PVF9TVEFUVVMgaXMgJ2luaGliaXRlZCcgKi8KKyNkZWZpbmUgQk9PVF9UWVBFXzEgICAgICAgICAgICAgMHgyMDAwICAvKiBVbnVzZWQgQk9PVF9TVEFUVVMgdmFsdWUgKi8KKyNkZWZpbmUgQk9PVF9UWVBFXzIgICAgICAgICAgICAgMHg0MDAwICAvKiBVbnVzZWQgQk9PVF9TVEFUVVMgdmFsdWUgKi8KKyNkZWZpbmUgQk9PVF9UWVBFXzMgICAgICAgICAgICAgMHg2MDAwICAvKiBVbnVzZWQgQk9PVF9TVEFUVVMgdmFsdWUgKi8KKyNkZWZpbmUgWkVST19XQUlUX1NUQVRFX01BU0sgICAgMHgxODAwICAvKiBNYXNrIHRvIGlzb2xhdGUgV2FpdCBTdGF0ZSBmbGFncyAqLworI2RlZmluZSBaRVJPX1dBSVRfU1RBVEVfOF9CSVQgICAweDEwMDAgIC8qIDAgPSBEaXNhYmxlZCAoSW5zZXJ0cyBXYWl0IFN0YXRlcykgKi8KKyNkZWZpbmUgWkVST19XQUlUX1NUQVRFXzE2X0JJVCAgMHgwODAwICAvKiAwID0gRGlzYWJsZWQgKEluc2VydHMgV2FpdCBTdGF0ZXMpICovCisjZGVmaW5lIExPT1BJTkdfTU9ERV9NQVNLICAgICAgIDB4MDAwNworI2RlZmluZSBMT09QQkFDS19NT0RFXzAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgTE9PUEJBQ0tfTU9ERV8xICAgICAgICAgMHgwMDAxCisjZGVmaW5lIExPT1BCQUNLX01PREVfMiAgICAgICAgIDB4MDAwMgorI2RlZmluZSBMT09QQkFDS19NT0RFXzMgICAgICAgICAweDAwMDMKKyNkZWZpbmUgTE9PUEJBQ0tfTU9ERV80ICAgICAgICAgMHgwMDA0CisjZGVmaW5lIExPT1BCQUNLX01PREVfNSAgICAgICAgIDB4MDAwNQorI2RlZmluZSBMT09QQkFDS19NT0RFXzYgICAgICAgICAweDAwMDYKKyNkZWZpbmUgTE9PUEJBQ0tfTU9ERV83ICAgICAgICAgMHgwMDA3CisjZGVmaW5lIEFVVE9fTUVESUFfREVURUNUICAgICAgIDB4MDAwOAorI2RlZmluZSBNQU5VQUxfQ1JDICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgRUFSTFlfVE9LRU5fUkVMICAgICAgICAgMHgwMDIwICAvKiBFYXJseSBUb2tlbiBSZWxlYXNlIGZvciBUb2tlbiBSaW5nICovCisjZGVmaW5lIFVNQUMgICAgICAgICAgICAgICAweDAwNDAgCisjZGVmaW5lIFVUUDJfUE9SVCAgICAgICAgICAgICAgIDB4MDA4MCAgLyogRm9yIDgyMTZUMiwgMD1wb3J0IEEsIDE9UG9ydCBCLiAqLworI2RlZmluZSBCTkNfMTBCVF9JTlRFUkZBQ0UgICAgICAweDA2MDAgIC8qIEJOQyBhbmQgVVRQIGN1cnJlbnQgbWVkaWEgc2V0ICovCisjZGVmaW5lIFVUUF9JTlRFUkZBQ0UgICAgICAgICAgIDB4MDUwMCAgLyogRXRoZXJuZXQgVVRQIE9ubHkuICovCisjZGVmaW5lIEJOQ19JTlRFUkZBQ0UgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBBVUlfSU5URVJGQUNFICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgQVVJXzEwQlRfSU5URVJGQUNFICAgICAgMHgwMjAwCisjZGVmaW5lIFNUQVJMQU5fMTBfSU5URVJGQUNFICAgIDB4MDEwMAorI2RlZmluZSBJTlRFUkZBQ0VfVFlQRV9NQVNLICAgICAweDA3MDAKKworLyoKKyAqIE1lZGlhIFR5cGUgQml0IERlZmluaXRpb25zCisgKgorICogbGVnZW5kOiAgICAgIFRQID0gVHdpc3RlZCBQYWlyCisgKiAgICAgICAgICAgICAgU1RQID0gU2hpZWxkZWQgdHdpc3RlZCBwYWlyCisgKiAgICAgICAgICAgICAgVVRQID0gVW5zaGllbGRlZCB0d2lzdGVkIHBhaXIKKyAqLworCisjZGVmaW5lIENORkdfTUVESUFfVFlQRV9NQVNLICAgIDB4MDAxZSAgLyogUE9TIFJlZ2lzdGVyIDMgTWFzayAgICAgICAgICovCisKKyNkZWZpbmUgTUVESUFfUzEwICAgICAgICAgICAgICAgMHgwMDAwICAvKiBFdGhlcm5ldCBhZGFwdGVyLCBUUC4gICAgICAgICovCisjZGVmaW5lIE1FRElBX0FVSV9VVFAgICAgICAgICAgIDB4MDAwMSAgLyogRXRoZXJuZXQgYWRhcHRlciwgQVVJL1VUUCBtZWRpYSAqLworI2RlZmluZSBNRURJQV9CTkMgICAgICAgICAgICAgICAweDAwMDIgIC8qIEV0aGVybmV0IGFkYXB0ZXIsIEJOQyBtZWRpYS4gKi8KKyNkZWZpbmUgTUVESUFfQVVJICAgICAgICAgICAgICAgMHgwMDAzICAvKiBFdGhlcm5ldCBBZGFwdGVyLCBBVUkgbWVkaWEuICovCisjZGVmaW5lIE1FRElBX1NUUF8xNiAgICAgICAgICAgIDB4MDAwNCAgLyogVG9rZW5SaW5nIGFkYXAsIDE2TWJpdCBTVFAuICAqLworI2RlZmluZSBNRURJQV9TVFBfNCAgICAgICAgICAgICAweDAwMDUgIC8qIFRva2VuUmluZyBhZGFwLCA0TWJpdCBTVFAuICAgKi8KKyNkZWZpbmUgTUVESUFfVVRQXzE2ICAgICAgICAgICAgMHgwMDA2ICAvKiBUb2tlblJpbmcgYWRhcCwgMTZNYml0IFVUUC4gICovCisjZGVmaW5lIE1FRElBX1VUUF80ICAgICAgICAgICAgIDB4MDAwNyAgLyogVG9rZW5SaW5nIGFkYXAsIDRNYml0IFVUUC4gICAqLworI2RlZmluZSBNRURJQV9VVFAgICAgICAgICAgICAgICAweDAwMDggIC8qIEV0aGVybmV0IGFkYXB0ZXIsIFVUUCBtZWRpYSAobm8gQVVJKQorKi8KKyNkZWZpbmUgTUVESUFfQk5DX1VUUCAgICAgICAgICAgMHgwMDEwICAvKiBFdGhlcm5ldCBhZGFwdGVyLCBCTkMvVVRQIG1lZGlhICovCisjZGVmaW5lIE1FRElBX1VUUEZEICAgICAgICAgICAgIDB4MDAxMSAgLyogRXRoZXJuZXQgYWRhcHRlciwgVFAgZnVsbCBkdXBsZXggKi8KKyNkZWZpbmUgTUVESUFfVVRQTkwgICAgICAgICAgICAgMHgwMDEyICAvKiBFdGhlcm5ldCBhZGFwdGVyLCBUUCB3aXRoIGxpbmsgaW50ZWdyaXR5IHRlc3QgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTUVESUFfQVVJX0JOQyAgICAgICAgICAgMHgwMDEzICAvKiBFdGhlcm5ldCBhZGFwdGVyLCBBVUkvQk5DIG1lZGlhICovCisjZGVmaW5lIE1FRElBX0FVSV9CTkNfVVRQICAgICAgIDB4MDAxNCAgLyogRXRoZXJuZXQgYWRhcHRlciwgQVVJX0JOQy9VVFAgKi8KKyNkZWZpbmUgTUVESUFfVVRQQSAgICAgICAgICAgICAgMHgwMDE1ICAvKiBFdGhlcm5ldCBVVFAtMTBNYnBzIFBvcnRzIEEgKi8KKyNkZWZpbmUgTUVESUFfVVRQQiAgICAgICAgICAgICAgMHgwMDE2ICAvKiBFdGhlcm5ldCBVVFAtMTBNYnBzIFBvcnRzIEIgKi8KKyNkZWZpbmUgTUVESUFfU1RQXzE2X1VUUF8xNiAgICAgMHgwMDE3ICAvKiBUb2tlbiBSaW5nIFNUUC0xNk1icHMvVVRQLTE2TWJwcyAqLworI2RlZmluZSBNRURJQV9TVFBfNF9VVFBfNCAgICAgICAweDAwMTggIC8qIFRva2VuIFJpbmcgU1RQLTRNYnBzL1VUUC00TWJwcyAqLworCisjZGVmaW5lIE1FRElBX1NUUDEwMF9VVFAxMDAgICAgIDB4MDAyMCAgLyogRXRoZXJuZXQgU1RQLTEwME1icHMvVVRQLTEwME1icHMgKi8KKyNkZWZpbmUgTUVESUFfVVRQMTAwRkQgICAgICAgICAgMHgwMDIxICAvKiBFdGhlcm5ldCBVVFAtMTAwTWJwcywgZnVsbCBkdXBsZXggKi8KKyNkZWZpbmUgTUVESUFfVVRQMTAwICAgICAgICAgICAgMHgwMDIyICAvKiBFdGhlcm5ldCBVVFAtMTAwTWJwcyAqLworCisKKyNkZWZpbmUgTUVESUFfVU5LTk9XTiAgICAgICAgICAgMHhGRkZGICAvKiBVbmtub3duIGFkYXB0ZXIvbWVkaWEgdHlwZSAgICovCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIGZpZWxkOgorICogbWVkaWFfdHlwZTIKKyAqLworI2RlZmluZSBNRURJQV9UWVBFX01JSSAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIE1FRElBX1RZUEVfVVRQICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgTUVESUFfVFlQRV9CTkMgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBNRURJQV9UWVBFX0FVSSAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIE1FRElBX1RZUEVfUzEwICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgTUVESUFfVFlQRV9BVVRPX1NFTlNFICAgICAgIDB4MTAwMAorI2RlZmluZSBNRURJQV9UWVBFX0FVVE9fREVURUNUICAgICAgMHg0MDAwCisjZGVmaW5lIE1FRElBX1RZUEVfQVVUT19ORUdPVElBVEUgICAweDgwMDAKKworLyoKKyAqIERlZmluaXRpb25zIGZvciB0aGUgZmllbGQ6CisgKiBsaW5lX3NwZWVkCisgKi8KKyNkZWZpbmUgTElORV9TUEVFRF9VTktOT1dOICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBMSU5FX1NQRUVEXzQgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIExJTkVfU1BFRURfMTAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgTElORV9TUEVFRF8xNiAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBMSU5FX1NQRUVEXzEwMCAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIExJTkVfU1BFRURfVDQgICAgICAgICAgICAgICAweDAwMDggIC8qIDEwMEJhc2VUNCBhbGlhc2VkIGZvciA5MzMyQlZUICovCisjZGVmaW5lIExJTkVfU1BFRURfRlVMTF9EVVBMRVggICAgICAweDgwMDAKKworLyoKKyAqIERlZmluaXRpb25zIGZvciB0aGUgZmllbGQ6CisgKiBiaWNfdHlwZSAoQnVzIGludGVyZmFjZSBjaGlwIHR5cGUpCisgKi8KKyNkZWZpbmUgQklDX05PX0NISVAgICAgICAgICAgICAgMHgwMDAwICAvKiBCdXMgaW50ZXJmYWNlIGNoaXAgbm90IGltcGxlbWVudGVkICovCisjZGVmaW5lIEJJQ181ODNfQ0hJUCAgICAgICAgICAgIDB4MDAwMSAgLyogODNDNTgzIGJ1cyBpbnRlcmZhY2UgY2hpcCAqLworI2RlZmluZSBCSUNfNTg0X0NISVAgICAgICAgICAgICAweDAwMDIgIC8qIDgzQzU4NCBidXMgaW50ZXJmYWNlIGNoaXAgKi8KKyNkZWZpbmUgQklDXzU4NV9DSElQICAgICAgICAgICAgMHgwMDAzICAvKiA4M0M1ODUgYnVzIGludGVyZmFjZSBjaGlwICovCisjZGVmaW5lIEJJQ181OTNfQ0hJUCAgICAgICAgICAgIDB4MDAwNCAgLyogODNDNTkzIGJ1cyBpbnRlcmZhY2UgY2hpcCAqLworI2RlZmluZSBCSUNfNTk0X0NISVAgICAgICAgICAgICAweDAwMDUgIC8qIDgzQzU5NCBidXMgaW50ZXJmYWNlIGNoaXAgKi8KKyNkZWZpbmUgQklDXzU2NF9DSElQICAgICAgICAgICAgMHgwMDA2ICAvKiBQQ01DSUEgQnVzIGludGVyZmFjZSBjaGlwICovCisjZGVmaW5lIEJJQ183OTBfQ0hJUCAgICAgICAgICAgIDB4MDAwNyAgLyogODNDNzkwIGJ1cyBpLWZhY2UvRXRoZXJuZXQgTklDIGNoaXAgKi8KKyNkZWZpbmUgQklDXzU3MV9DSElQICAgICAgICAgICAgMHgwMDA4ICAvKiA4M0M1NzEgRUlTQSBidXMgbWFzdGVyIGktZmFjZSAqLworI2RlZmluZSBCSUNfNTg3X0NISVAgICAgICAgICAgICAweDAwMDkgIC8qIFRva2VuIFJpbmcgQVQgYnVzIG1hc3RlciBpLWZhY2UgKi8KKyNkZWZpbmUgQklDXzU3NF9DSElQICAgICAgICAgICAgMHgwMDEwICAvKiBGRUFTVCBidXMgaW50ZXJmYWNlIGNoaXAgKi8KKyNkZWZpbmUgQklDXzg0MzJfQ0hJUCAgICAgICAgICAgMHgwMDExICAvKiA4NDMyIGJ1cyBpLWZhY2UvRXRoZXJuZXQgTklDKERFQyBQQ0kpICovCisjZGVmaW5lIEJJQ185MzMyX0NISVAgICAgICAgICAgIDB4MDAxMiAgLyogOTMzMiBidXMgaS1mYWNlLzEwME1icHMgRXRoZXIgTklDKERFQyBQQ0kpICovCisjZGVmaW5lIEJJQ184NDMyRV9DSElQICAgICAgICAgIDB4MDAxMyAgLyogODQzMiBFbmhhbmNlZCBidXMgaWZhY2UvRXRoZXJuZXQgTklDKERFQykgKi8KKyNkZWZpbmUgQklDX0VQSUMxMDBfQ0hJUCAgICAgICAgMHgwMDE0ICAvKiBFUElDLzEwMCAxMC8xMDAgTWJwcyBFdGhlcm5ldCBCSUMvTklDICovCisjZGVmaW5lIEJJQ19DOTRfQ0hJUCAgICAgICAgICAgIDB4MDAxNSAgLyogOTFDOTQgYnVzIGktZmFjZSBpbiBQQ01DSUEgbW9kZSAqLworI2RlZmluZSBCSUNfWDgwMjBfQ0hJUCAgICAgICAgICAweDAwMTYgIC8qIFhpbGlueCBQQ01DSUEgbXVsdGktZnVuYyBpLWZhY2UgKi8KKworLyoKKyAqIERlZmluaXRpb25zIGZvciB0aGUgZmllbGQ6CisgKiBuaWNfdHlwZSAoQnVzIGludGVyZmFjZSBjaGlwIHR5cGUpCisgKi8KKyNkZWZpbmUgTklDX1VOS19DSElQICAgICAgICAgICAgMHgwMDAwICAvKiBVbmtub3duIE5JQyBjaGlwICAgICAgKi8KKyNkZWZpbmUgTklDXzgzOTBfQ0hJUCAgICAgICAgICAgMHgwMDAxICAvKiBEUDgzOTAgRXRoZXJuZXQgTklDICAgKi8KKyNkZWZpbmUgTklDXzY5MF9DSElQICAgICAgICAgICAgMHgwMDAyICAvKiA4M0M2OTAgRXRoZXJuZXQgTklDICAgKi8KKyNkZWZpbmUgTklDXzgyNV9DSElQICAgICAgICAgICAgMHgwMDAzICAvKiA4M0M4MjUgVG9rZW4gUmluZyBOSUMgKi8KKy8qICAgICAgI2RlZmluZSBOSUNfPz8/X0NISVAgICAgMHgwMDA0ICAqLyAvKiBOb3QgdXNlZCAgICAgICAgICAgKi8KKy8qICAgICAgI2RlZmluZSBOSUNfPz8/X0NISVAgICAgMHgwMDA1ICAqLyAvKiBOb3QgdXNlZCAgICAgICAgICAgKi8KKy8qICAgICAgI2RlZmluZSBOSUNfPz8/X0NISVAgICAgMHgwMDA2ICAqLyAvKiBOb3QgdXNlZCAgICAgICAgICAgKi8KKyNkZWZpbmUgTklDXzc5MF9DSElQICAgICAgICAgICAgMHgwMDA3ICAvKiA4M0M3OTAgYnVzIGktZmFjZS9FdGhlcm5ldCBOSUMgY2hpcCAqLworI2RlZmluZSBOSUNfQzEwMF9DSElQICAgICAgICAgICAweDAwMTAgIC8qIEZFQVNUIDEwME1icHMgRXRoZXJuZXQgTklDICovCisjZGVmaW5lIE5JQ184NDMyX0NISVAgICAgICAgICAgIDB4MDAxMSAgLyogODQzMiBidXMgaS1mYWNlL0V0aGVybmV0IE5JQyhERUMgUENJKSAqLworI2RlZmluZSBOSUNfOTMzMl9DSElQICAgICAgICAgICAweDAwMTIgIC8qIDkzMzIgYnVzIGktZmFjZS8xMDBNYnBzIEV0aGVyIE5JQyhERUMgUENJKSAqLworI2RlZmluZSBOSUNfODQzMkVfQ0hJUCAgICAgICAgICAweDAwMTMgIC8qIDg0MzIgZW5oYW5jZWQgYnVzIGlmYWNlL0V0aGVybmV0IE5JQyhERUMpICovCisjZGVmaW5lIE5JQ19FUElDMTAwX0NISVAgICAgICAgIDB4MDAxNCAgIC8qIEVQSUMvMTAwIDEwLzEwMCBNYnBzIEV0aGVybmV0IEJJQy9OSUMgKi8KKyNkZWZpbmUgTklDX0M5NF9DSElQICAgICAgICAgICAgMHgwMDE1ICAvKiA5MUM5NCBQQyBDYXJkIHdpdGggbXVsdGkgZnVuYyAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBmaWVsZDoKKyAqIGFkYXB0ZXJfdHlwZSBUaGUgYWRhcHRlcl90eXBlIGZpZWxkIGRlc2NyaWJlcyB0aGUgYWRhcHRlci9idXMKKyAqICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLgorICovCisjZGVmaW5lIEJVU19JU0ExNl9UWVBFICAgICAgICAgIDB4MDAwMSAgLyogMTYgYml0IGFkYXAgaW4gMTYgYml0IChFKUlTQSBzbG90ICAqLworI2RlZmluZSBCVVNfSVNBOF9UWVBFICAgICAgICAgICAweDAwMDIgIC8qIDgvMTZiIGFkYXAgaW4gOCBiaXQgWFQvKEUpSVNBIHNsb3QgKi8KKyNkZWZpbmUgQlVTX01DQV9UWVBFICAgICAgICAgICAgMHgwMDAzICAvKiBNaWNybyBDaGFubmVsIGFkYXB0ZXIgICAgICAgICAgICAgICovCisKKy8qCisgKiBSZWNlaXZlIE1hc2sgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBBQ0NFUFRfTVVMVElDQVNUICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBBQ0NFUFRfQlJPQURDQVNUICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBQUk9NSVNDVU9VU19NT0RFICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBBQ0NFUFRfU09VUkNFX1JPVVRJTkcgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBBQ0NFUFRfRVJSX1BBQ0tFVFMgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBBQ0NFUFRfQVRUX01BQ19GUkFNRVMgICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBBQ0NFUFRfTVVMVElfUFJPTSAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBUUkFOU01JVF9PTkxZICAgICAgICAgICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBBQ0NFUFRfRVhUX01BQ19GUkFNRVMgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBFQVJMWV9SWF9FTkFCTEUgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBQS1RfU0laRV9OT1RfTkVFREVEICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBBQ0NFUFRfU09VUkNFX1JPVVRJTkdfU1BBTk5JTkcgIDB4MDgwOAorCisjZGVmaW5lIEFDQ0VQVF9BTExfTUFDX0ZSQU1FUyAgICAgICAgICAgMHgwMTIwCisKKy8qCisgKiBjb25maWdfbW9kZSBkZWZzCisgKi8KKyNkZWZpbmUgU1RPUkVfRUVST00gICAgICAgICAgICAgMHgwMDAxICAvKiBTdG9yZSBjb25maWcgaW4gRUVST00uICovCisjZGVmaW5lIFNUT1JFX1JFR1MgICAgICAgICAgICAgIDB4MDAwMiAgLyogU3RvcmUgY29uZmlnIGluIHJlZ2lzdGVyIHNldC4gKi8KKworLyoKKyAqIGVxdWF0ZXMgZm9yIGxtYWNfZmxhZ3MgaW4gYWRhcHRlciBzdHJ1Y3R1cmUgKEV0aGVybmV0KQorICovCisjZGVmaW5lICAgICAgICAgTUVNX0RJU0FCTEUgICAgIDB4MDAwMQorI2RlZmluZSAgICAgICAgIFJYX1NUQVRVU19QT0xMICAweDAwMDIKKyNkZWZpbmUgICAgICAgICBVU0VfUkVfQklUICAgICAgMHgwMDA0CisvKiNkZWZpbmUgICAgICAgUkVTRVJWRUQgICAgICAgIDB4MDAwOCAqLworLyojZGVmaW5lICAgICAgIFJFU0VSVkVEICAgICAgICAweDAwMTAgKi8KKy8qI2RlZmluZSAgICAgICBSRVNFUlZFRCAgICAgICAgMHgwMDIwICovCisvKiNkZWZpbmUgICAgICAgUkVTRVJWRUQgICAgICAgIDB4MDA0MCAqLworLyojZGVmaW5lICAgICAgIFJFU0VSVkVEICAgICAgICAweDAwODAgKi8KKy8qI2RlZmluZSAgICAgICBSRVNFUlZFRCAgICAgICAgMHgwMTAwICovCisvKiNkZWZpbmUgICAgICAgUkVTRVJWRUQgICAgICAgIDB4MDIwMCAqLworLyojZGVmaW5lICAgICAgIFJFU0VSVkVEICAgICAgICAweDA0MDAgKi8KKy8qI2RlZmluZSAgICAgICBSRVNFUlZFRCAgICAgICAgMHgwODAwICovCisvKiNkZWZpbmUgICAgICAgUkVTRVJWRUQgICAgICAgIDB4MTAwMCAqLworLyojZGVmaW5lICAgICAgIFJFU0VSVkVEICAgICAgICAweDIwMDAgKi8KKy8qI2RlZmluZSAgICAgICBSRVNFUlZFRCAgICAgICAgMHg0MDAwICovCisvKiNkZWZpbmUgICAgICAgUkVTRVJWRUQgICAgICAgIDB4ODAwMCAqLworCisvKiBtZWRpYV9vcHRzICYgbWVkaWFfc2V0IEZpZWxkcyBiaXQgZGVmcyBmb3IgRXRoZXJuZXQgLi4uICovCisjZGVmaW5lICAgICAgICAgTUVEX09QVF9CTkMgICAgIDB4MDEKKyNkZWZpbmUgICAgICAgICBNRURfT1BUX1VUUCAgICAgMHgwMgorI2RlZmluZSAgICAgICAgIE1FRF9PUFRfQVVJICAgICAweDA0CisjZGVmaW5lICAgICAgICAgTUVEX09QVF8xME1CICAgIDB4MDgKKyNkZWZpbmUgICAgICAgICBNRURfT1BUXzEwME1CICAgMHgxMAorI2RlZmluZSAgICAgICAgIE1FRF9PUFRfUzEwICAgICAweDIwCisKKy8qIG1lZGlhX29wdHMgJiBtZWRpYV9zZXQgRmllbGRzIGJpdCBkZWZzIGZvciBUb2tlbiBSaW5nIC4uLiAqLworI2RlZmluZSAgICAgICAgIE1FRF9PUFRfNE1CICAgICAweDA4CisjZGVmaW5lICAgICAgICAgTUVEX09QVF8xNk1CICAgIDB4MTAKKyNkZWZpbmUgICAgICAgICBNRURfT1BUX1NUUCAgICAgMHg0MAorCisjZGVmaW5lIE1BWF84MDIzX1NJWkUgICAgICAgICAgIDE1MDAgICAgLyogTWF4IDgwMi4zIHNpemUgb2YgZnJhbWUuICovCisjZGVmaW5lIERFRkFVTFRfRVJYX1ZBTFVFICAgICAgIDQgICAgICAgLyogTnVtYmVyIG9mIDE2LWJ5dGUgYmxvY2tzIGZvciA3OTBCIGVhcmx5IFJ4LiAqLworI2RlZmluZSBERUZBVUxUX0VUWF9WQUxVRSAgICAgICAzMiAgICAgIC8qIE51bWJlciBvZiBieXRlcyBmb3IgNzkwQiBlYXJseSBUeC4gKi8KKyNkZWZpbmUgREVGQVVMVF9UWF9SRVRSSUVTICAgICAgMyAgICAgICAvKiBOdW1iZXIgb2YgdHJhbnNtaXQgcmV0cmllcyAqLworI2RlZmluZSBMUEJLX0ZSQU1FX1NJWkUgICAgICAgICAxMDI0ICAgIC8qIERlZmF1bHQgbG9vcGJhY2sgZnJhbWUgZm9yIFJ4IGNhbGlicmF0aW9uIHRlc3QuICovCisjZGVmaW5lIE1BWF9MT09LQUhFQURfU0laRSAgICAgIDI1MiAgICAgLyogTWF4IGxvb2thaGVhZCBzaXplIGZvciBldGhlcm5ldC4gKi8KKworI2RlZmluZSBSV19NQUNfU1RBVEUgICAgICAgICAgICAgICAgICAgIDB4MTEwMQorI2RlZmluZSBSV19TQV9PRl9MQVNUX0FNUF9PUl9TTVAgICAgICAgIDB4MjgwMworI2RlZmluZSBSV19QSFlTSUNBTF9EUk9QX05VTUJFUiAgICAgICAgIDB4M0IwMgorI2RlZmluZSBSV19VUFNUUkVBTV9ORUlHSEJPUl9BRERSRVNTICAgIDB4M0UwMworI2RlZmluZSBSV19QUk9EVUNUX0lOU1RBTkNFX0lEICAgICAgICAgIDB4NEIwOQorCisjZGVmaW5lIFJXX1RSQ19TVEFUVVNfQkxPQ0sgICAgICAgICAgICAgMHg1NDEyCisKKyNkZWZpbmUgUldfTUFDX0VSUk9SX0NPVU5URVJTX05PX0NMRUFSICAweDgwMDYKKyNkZWZpbmUgUldfTUFDX0VSUk9SX0NPVU5URVJfQ0xFQVIgICAgICAweDdBMDYKKyNkZWZpbmUgUldfQ09ORklHX1JFR0lTVEVSXzAgICAgICAgICAgICAweEEwMDEKKyNkZWZpbmUgUldfQ09ORklHX1JFR0lTVEVSXzEgICAgICAgICAgICAweEExMDEKKyNkZWZpbmUgUldfUFJFU0NBTEVfVElNRVJfVEhSRVNIT0xEICAgICAweEEyMDEKKyNkZWZpbmUgUldfVFBUX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEEzMDEKKyNkZWZpbmUgUldfVFFQX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEE0MDEKKyNkZWZpbmUgUldfVE5UX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEE1MDEKKyNkZWZpbmUgUldfVEJUX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEE2MDEKKyNkZWZpbmUgUldfVFNNX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEE3MDEKKyNkZWZpbmUgUldfVEFNX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEE4MDEKKyNkZWZpbmUgUldfVEJSX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEE5MDEKKyNkZWZpbmUgUldfVEVSX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEFBMDEKKyNkZWZpbmUgUldfVEdUX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEFCMDEKKyNkZWZpbmUgUldfVEhUX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEFDMDEKKyNkZWZpbmUgUldfVFJSX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEFEMDEKKyNkZWZpbmUgUldfVFZYX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAweEFFMDEKKyNkZWZpbmUgUldfSU5ESVZJRFVBTF9NQUNfQUREUkVTUyAgICAgICAweEIwMDMKKworI2RlZmluZSBSV19JTkRJVklEVUFMX0dST1VQX0FERFJFU1MgICAgIDB4QjMwMyAgLyogYWxsIG9mIGdyb3VwIGFkZHIgKi8KKyNkZWZpbmUgUldfSU5ESVZJRFVBTF9HUk9VUF9BRERSX1dPUkRfMCAweEIzMDEgIC8qIDFzdCB3b3JkIG9mIGdyb3VwIGFkZHIgKi8KKyNkZWZpbmUgUldfSU5ESVZJRFVBTF9HUk9VUF9BRERSICAgICAgICAweEI0MDIgIC8qIDJuZC0zcmQgd29yZCBvZiBncm91cCBhZGRyICovCisjZGVmaW5lIFJXX0ZVTkNUSU9OQUxfQUREUkVTUyAgICAgICAgICAgMHhCNjAzICAvKiBhbGwgb2YgZnVuY3Rpb25hbCBhZGRyICovCisjZGVmaW5lIFJXX0ZVTkNUSU9OQUxfQUREUl9XT1JEXzAgICAgICAgMHhCNjAxICAvKiAxc3Qgd29yZCBvZiBmdW5jICBhZGRyICovCisjZGVmaW5lIFJXX0ZVTkNUSU9OQUxfQUREUiAgICAgICAgICAgICAgMHhCNzAyICAvKiAybmQtM3JkIHdvcmQgZnVuYyBhZGRyICovCisKKyNkZWZpbmUgUldfQklUX1NJR05JRklDQU5UX0dST1VQX0FERFIgICAweEI5MDIKKyNkZWZpbmUgUldfU09VUkNFX1JJTkdfQlJJREdFX05VTUJFUiAgICAweEJCMDEKKyNkZWZpbmUgUldfVEFSR0VUX1JJTkdfTlVNQkVSICAgICAgICAgICAweEJDMDEKKworI2RlZmluZSBSV19ISUNfSU5URVJSVVBUX01BU0sgICAgICAgICAgIDB4QzYwMQorCisjZGVmaW5lIFNPVVJDRV9ST1VUSU5HX1NQQU5OSU5HX0JJVFMgICAgMHgwMEMwICAvKiBTcGFubmluZyBUcmVlIEZyYW1lcyAqLworI2RlZmluZSBTT1VSQ0VfUk9VVElOR19FWFBMT1JFUl9CSVQgICAgIDB4MDA0MCAgLyogRXhwbG9yZXIgYW5kIFNpbmdsZSBSb3V0ZSAqLworCisgICAgICAgIC8qIHdyaXRlICovCisKKyNkZWZpbmUgQ1NSX01TS19BTEwgICAgICAgICAgICAgMHg4MCAgICAvLyBCaWMgNTg3IE9ubHkKKyNkZWZpbmUgQ1NSX01TS1RJTlQgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBDU1JfTVNLQ0JVU1kgICAgICAgICAgICAweDEwCisjZGVmaW5lIENTUl9DTFJUSU5UICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQ1NSX0NMUkNCVVNZICAgICAgICAgICAgMHgwNAorI2RlZmluZSBDU1JfV0NTUyAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIENTUl9DQSAgICAgICAgICAgICAgICAgIDB4MDEKKworICAgICAgICAvKiByZWFkICovCisKKyNkZWZpbmUgQ1NSX1RJTlQgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBDU1JfQ0lOVCAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIENTUl9UU1RBVCAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQ1NSX0NTVEFUICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBDU1JfRkFVTFQgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIENTUl9DQlVTWSAgICAgICAgICAgICAgIDB4MDEKKworI2RlZmluZSBMQUFSX01FTTE2RU5CICAgICAgICAgICAweDgwCisjZGVmaW5lIFp3czE2ICAgICAgICAgICAgICAgICAgIDB4MjAKKworI2RlZmluZSBJUlJfSUVOICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIFp3czggICAgICAgICAgICAgICAgICAgIDB4MDEKKworI2RlZmluZSBJTUNDUl9FSUwgICAgICAgICAgICAgICAweDA0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgX191OCAgICAgICAgICAgIGFjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWNjZXNzIENvbnRyb2wgKi8KKyAgICAgICAgX191OCAgICAgICAgICAgIGZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJhbWUgQ29udHJvbCAqLworICAgICAgICBfX3U4ICAgICAgICAgICAgZGFbNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0IEFkZHIgKi8KKyAgICAgICAgX191OCAgICAgICAgICAgIHNhWzZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlIEFkZHIgKi8KKworICAgICAgICBfX3UxNiAgICAgICAgICAgIHZsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVjdG9yIExlbmd0aCAqLworICAgICAgICBfX3U4ICAgICAgICAgICAgZGNfc2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0L1NvdXJjZSBDbGFzcyAqLworICAgICAgICBfX3U4ICAgICAgICAgICAgdmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWZWN0b3IgQ29kZSAqLworICAgICAgICB9IE1BQ19IRUFERVI7CisKKyNkZWZpbmUgTUFYX1NVQl9WRUNUT1JfSU5GTyAgICAgKFJYX0RBVEFfQlVGRkVSX1NJWkUgLSBzaXplb2YoTUFDX0hFQURFUikgLSAyKQorCit0eXBlZGVmIHN0cnVjdAorICAgICAgICB7CisgICAgICAgIF9fdTggICAgICAgICAgICBzdmw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1Yi12ZWN0b3IgTGVuZ3RoICovCisgICAgICAgIF9fdTggICAgICAgICAgICBzdmk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1Yi12ZWN0b3IgQ29kZSAqLworICAgICAgICBfX3U4ICAgICAgICAgICAgc3Z2W01BWF9TVUJfVkVDVE9SX0lORk9dOyAgICAgICAvKiBTdWItdmVjdG9yIEluZm8gKi8KKyAgICAgICAgfSBNQUNfU1VCX1ZFQ1RPUjsKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgkvKiBfX0xJTlVYX1NNQ1RSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9zbWN0cl9maXJtd2FyZS5oIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyX2Zpcm13YXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmMmNiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9zbWN0cl9maXJtd2FyZS5oCkBAIC0wLDAgKzEsOTc5IEBACisvKgorICogVGhlIGZpcm13YXJlIHRoaXMgZHJpdmVyIGRvd25sb2FkcyBpbnRvIHRoZSB0b2tlbnJpbmcgY2FyZCBpcyBhCisgKiBzZXBhcmF0ZSBwcm9ncmFtIGFuZCBpcyBub3QgR1BMJ2Qgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoZSBMaW51eAorICogc2lkZSBkcml2ZXIgYW5kIHRoZSByb3V0aW5lIHRoYXQgbG9hZHMgdGhpcyBkYXRhIGludG8gdGhlIGNhcmQgYXJlLgorICoKKyAqIFRoaXMgZmlybXdhcmUgaXMgbGljZW5zZWQgdG8geW91IHN0cmljdGx5IGZvciB1c2UgaW4gY29uanVuY3Rpb24KKyAqIHdpdGggdGhlIHVzZSBvZiBTTUMgVG9rZW5SaW5nIGFkYXB0ZXJzLiBUaGVyZSBpcyBubyB3YXJhbnR5CisgKiBleHByZXNzZWQgb3IgaW1wbGllZCBhYm91dCBpdHMgZml0bmVzcyBmb3IgYW55IHB1cnBvc2UuCisgKi8KKworLyogc21jdHJfZmlybXdhcmUuaDogU01DIFRva2VuUmluZyBkcml2ZXIgZmlybXdhcmUgZHVtcCBmb3IgTGludXguCisgKgorICogTm90ZXM6CisgKiAgLSBUaGlzIGlzIGFuIDhLIGJpbmFyeSBpbWFnZS4gKE1DVC5CSU4gdjYuM0MxIDAzLzAxLzk1KQorICoKKyAqIEF1dGhvcnM6CisgKiAgLSBKYXkgU2NodWxpc3QgPGpzY2hsc3RAc2FtYmEub3JnPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1NNQ1RSKSB8fCBkZWZpbmVkKENPTkZJR19TTUNUUl9NT0RVTEUpCisKK3Vuc2lnbmVkIGNoYXIgc21jdHJfY29kZVtdID0geworCTB4MEJDLCAweDAxRCwgMHgwMTIsIDB4MDNCLCAweDA2MywgMHgwQjQsIDB4MEU5LCAweDAwMCwKKwkweDAwMCwgMHgwMUYsIDB4MDAwLCAweDAwMSwgMHgwMDEsIDB4MDAwLCAweDAwMiwgMHgwMDUsCisJMHgwMDEsIDB4MDAwLCAweDAwNiwgMHgwMDMsIDB4MDAxLCAweDAwMCwgMHgwMDQsIDB4MDA5LAorCTB4MDAxLCAweDAwMCwgMHgwMEEsIDB4MDA3LCAweDAwMSwgMHgwMDAsIDB4MDA4LCAweDAwQiwKKwkweDAwMSwgMHgwMDAsIDB4MDBDLCAweDAwMCwgMHgwMDAsIDB4MDAwLCAweDAwMCwgMHgwMEYsCisJMHgwMDEsIDB4MDAwLCAweDAxMCwgMHgwMEQsIDB4MDAxLCAweDAwMCwgMHgwMEUsIDB4MDEzLAorCTB4MDAxLCAweDAwMCwgMHgwMTQsIDB4MDExLCAweDAwMSwgMHgwMDAsIDB4MDEyLCAweDAwMCwKKwkweDAwMCwgMHgwMDUsIDB4MDAwLCAweDAxNSwgMHgwMDEsIDB4MDAwLCAweDAxNiwgMHgwMTksCisJMHgwMDEsIDB4MDAwLCAweDAxQSwgMHgwMTcsIDB4MDAxLCAweDAwMCwgMHgwMTgsIDB4MDAwLAorCTB4MDAwLCAweDAwRSwgMHgwMDAsIDB4MDAwLCAweDAwMCwgMHgwMDEsIDB4MDAwLCAweDAwMCwKKwkweDAwMCwgMHgwMDQsIDB4MDAwLCAweDAxQiwgMHgwMDEsIDB4MDAwLCAweDAxQywgMHgwMDAsCisJMHgwMDAsIDB4MDA3LCAweDAwMCwgMHgwMDAsIDB4MDAwLCAweDAwRiwgMHgwMDAsIDB4MDAwLAorCTB4MDAwLCAweDAwQiwgMHgwMDAsIDB4MDFELCAweDAwMSwgMHgwMDAsIDB4MDFFLCAweDAwMCwKKwkweDAwMCwgMHgwMDgsIDB4MDAwLCAweDAwMCwgMHgwMDAsIDB4MDAyLCAweDAwMCwgMHgwMDAsCisJMHgwMDAsIDB4MDBDLCAweDAwMCwgMHgwMDAsIDB4MDAwLCAweDAwNiwgMHgwMDAsIDB4MDAwLAorCTB4MDAwLCAweDAwRCwgMHgwMDAsIDB4MDAwLCAweDAwMCwgMHgwMDMsIDB4MDAwLCAweDAwMCwKKwkweDAwMCwgMHgwMEEsIDB4MDAwLCAweDAwMCwgMHgwMDAsIDB4MDA5LCAweDAwMCwgMHgwMDQsCisJMHgwNzgsIDB4MEM2LCAweDBCQywgMHgwMDEsIDB4MDk0LCAweDAwNCwgMHgwOTMsIDB4MDgwLAorCTB4MEM4LCAweDA0MCwgMHgwNjIsIDB4MEU5LCAweDBEQSwgMHgwMUMsIDB4MDJDLCAweDAxNSwKKwkweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTgsCisJMHgwMEIsIDB4MEU5LCAweDBFNSwgMHgwRDUsIDB4MDk1LCAweDBDMSwgMHgwOUQsIDB4MDc3LAorCTB4MENFLCAweDBCQiwgMHgwQTAsIDB4MDZFLCAweDAxQywgMHgwMDUsIDB4MEY2LCAweDA3NywKKwkweDBDNiwgMHgwMDIsIDB4MEZBLCAweDA5NiwgMHgwNzAsIDB4MEU4LCAweDAxRCwgMHgwQzAsCisJMHgwMTcsIDB4MDBFLCAweDAwMiwgMHgwRkEsIDB4MDU4LCAweDA3RCwgMHgwQzAsIDB4MDVGLAorCTB4MDcyLCAweDBDRSwgMHgwRUMsIDB4MEE0LCAweDBDMywgMHgwODQsIDB4MDkwLCAweDA3QSwKKwkweDAzMCwgMHgwQ0QsIDB4MDhELCAweDA3OSwgMHgwMTksIDB4MEU3LCAweDA2QywgMHgwMjQsCisJMHgwMjcsIDB4MDlDLCAweDAwOCwgMHgwMzksIDB4MDA3LCAweDAzOCwgMHgwQTgsIDB4MDRBLAorCTB4MDRDLCAweDBFQSwgMHgwNEQsIDB4MDk4LCAweDA5QiwgMHgwMjQsIDB4MDRDLCAweDBDMCwKKwkweDAyNiwgMHgwRDMsIDB4MEU3LCAweDA1NCwgMHgwNUEsIDB4MDRELCAweDBGMiwgMHgwNEMsCisJMHgwMEMsIDB4MDEzLCAweDAyMywgMHgwNDksIDB4MDkwLCAweDAzMiwgMHgwNkUsIDB4MEE0LAorCTB4MERGLCAweDA5MywgMHgwNzEsIDB4MDEzLCAweDA3NywgMHgwMjYsIDB4MEUxLCAweDAyNiwKKwkweDBGOCwgMHgwMjYsIDB4MDBDLCAweDA0QywgMHgwMTIsIDB4MDI2LCAweDAwOCwgMHgwMDksCisJMHgwODIsIDB4MDgyLCAweDA2MCwgMHgwQTksIDB4MDMwLCAweDA3OSwgMHgwMzYsIDB4MEIwLAorCTB4MEIyLCAweDBBOCwgMHgwQTcsIDB4MDcyLCAweDA2NCwgMHgwOEYsIDB4MDlCLCAweDAzMywKKwkweDAzMywgMHgwRjksIDB4MEI4LCAweDAzOSwgMHgwRDUsIDB4MDExLCAweDA3MywgMHgwQUEsCisJMHgwNzUsIDB4MDI2LCAweDA1RCwgMHgwMjYsIDB4MDUxLCAweDA5MywgMHgwMkEsIDB4MDQ5LAorCTB4MDk0LCAweDBDOSwgMHgwOTUsIDB4MDg5LCAweDBCQywgMHgwNEQsIDB4MEM4LCAweDA5QiwKKwkweDA4MCwgMHgwOUIsIDB4MEEwLCAweDA5OSwgMHgwMDYsIDB4MDRDLCAweDA4NiwgMHgwMjYsCisJMHgwNTgsIDB4MDlCLCAweDBBNCwgMHgwOUIsIDB4MDk5LCAweDAzNywgMHgwNjIsIDB4MDZDLAorCTB4MDY3LCAweDA5QiwgMHgwMzMsIDB4MDMwLCAweDBCRiwgMHgwMzYsIDB4MDY2LCAweDA2MSwKKwkweDBCRiwgMHgwMzYsIDB4MEVDLCAweDBDNSwgMHgwQkQsIDB4MDY2LCAweDA4MiwgMHgwNUEsCisJMHgwNTAsIDB4MDMxLCAweDBENSwgMHgwOUQsIDB4MDk4LCAweDAxOCwgMHgwMjksIDB4MDNDLAorCTB4MDk4LCAweDA4NiwgMHgwNEMsIDB4MDE3LCAweDAyNiwgMHgwM0UsIDB4MDJDLCAweDBCOCwKKwkweDA2OSwgMHgwM0IsIDB4MDQ5LCAweDAyRSwgMHgwQjQsIDB4MDA4LCAweDA0MywgMHgwMUEsCisJMHgwQTQsIDB4MEY5LCAweDBCMywgMHgwNTEsIDB4MEYxLCAweDAxMCwgMHgwRjMsIDB4MDQzLAorCTB4MENELCAweDAwOCwgMHgwNkYsIDB4MDYzLCAweDA3OSwgMHgwQjMsIDB4MDMzLCAweDAwRSwKKwkweDAxMywgMHgwOTgsIDB4MDQ5LCAweDA5OCwgMHgwMDQsIDB4MERBLCAweDA3QywgMHgwRTAsCisJMHgwNTIsIDB4MDc5LCAweDAzMSwgMHgwMEMsIDB4MDk4LCAweDAyRSwgMHgwNEQsIDB4MEFDLAorCTB4MDJDLCAweDA4NCwgMHgwMTQsIDB4MEVFLCAweDA0QywgMHgwRkUsIDB4MDY3LCAweDA1RSwKKwkweDBFNCwgMHgwOUEsIDB4MDc1LCAweDAyOSwgMHgwRDcsIDB4MEE5LCAweDAzNSwgMHgwM0EsCisJMHgwOTQsIDB4MDVCLCAweDBENSwgMHgwOUIsIDB4MDU4LCAweDBCNCwgMHgwQUYsIDB4MDc1LAorCTB4MDY2LCAweDBBRiwgMHgwMTQsIDB4MEE5LCAweDBFRiwgMHgwNDAsIDB4MDk1LCAweDAyNSwKKwkweDAwOCwgMHgwQjksIDB4MEFELCAweDA0MiwgMHgwRkMsIDB4MEQ4LCAweDBEOSwgMHgwOEMsCisJMHgwMzMsIDB4MDBFLCAweDAxMywgMHgwOTgsIDB4MDY2LCAweDAxRSwgMHgwNDUsIDB4MEFDLAorCTB4MEIwLCAweDAwQywgMHgwNDIsIDB4MEQzLCAweDBDQywgMHgwQTYsIDB4MDEyLCAweDA2MiwKKwkweDBERSwgMHgwQjQsIDB4MEIxLCAweDA4MCwgMHgwNDksIDB4MDdELCAweDBBMiwgMHgwREUsCisJMHgwQjQsIDB4MDE4LCAweDBDMCwgMHgwMjQsIDB4MDg0LCAweDBFNiwgMHgwNTQsIDB4MEY1LAorCTB4MDgzLCAweDA0NiwgMHgwMDEsIDB4MDY4LCAweDAxQSwgMHgwNjMsIDB4MDBDLCAweDBDNiwKKwkweDAxMiwgMHgwNjQsIDB4MEZBLCAweDA0QywgMHgwMzUsIDB4MDFDLCAweDAyQywgMHgwMEUsCisJMHgwQUEsIDB4MEFBLCAweDBBQSwgMHgwQUEsIDB4MEFBLCAweDBBQSwgMHgwQUEsIDB4MEFBLAorCTB4MEFBLCAweDBBQSwgMHgwQUEsIDB4MEFBLCAweDBBQSwgMHgwQUQsIDB4MEQ3LCAweDAwMiwKKwkweDA3MCwgMHgwRTAsIDB4MDRDLCAweDBGMywgMHgwQTEsIDB4MEMxLCAweDBENSwgMHgwQzAsCisJMHgwM0MsIDB4MEI5LCAweDA2OSwgMHgwMzksIDB4MDYwLCAweDA0RSwgMHgwNTgsIDB4MDc3LAorCTB4MDAyLCAweDA2NywgMHgwOTMsIDB4MDNDLCAweDA5OSwgMHgwRTQsIDB4MENGLCAweDAzOCwKKwkweDAxQywgMHgwOTcsIDB4MDJFLCAweDA0MCwgMHgwMUIsIDB4MDkwLCAweDAzMSwgMHgwNDYsCisJMHgwQTMsIDB4MDVFLCAweDAwRSwgMHgwODgsIDB4MDM0LCAweDA2QSwgMHgwMzUsIDB4MEUwLAorCTB4MEU4LCAweDBBQSwgMHgwMzUsIDB4MDFBLCAweDBBOSwgMHgwRjUsIDB4MDE1LCAweDA0NiwKKwkweDBBMywgMHgwRUEsIDB4MDdELCAweDA0QSwgMHgwQTMsIDB4MDUxLCAweDBBQSwgMHgwOUYsCisJMHgwNzAsIDB4MDU0LCAweDBBNiwgMHgwNTcsIDB4MDJFLCAweDBCNCwgMHgwQ0QsIDB4MEM4LAorCTB4MEEzLCAweDAwQywgMHgwQzEsIDB4MERBLCAweDBDNiwgMHgwRTEsIDB4MENCLCAweDA3QSwKKwkweDBENCwgMHgwMUMsIDB4MDY4LCAweDBGRiwgMHgwQ0YsIDB4MDU1LCAweDBBOCwgMHgwQzAsCisJMHgwMkQsIDB4MDg1LCAweDAxMSwgMHgwMTcsIDB4MDQ0LCAweDAyQSwgMHgwMzAsIDB4MDBCLAorCTB4MDRBLCAweDA4OCwgMHgwQzIsIDB4MDRELCAweDBCNSwgMHgwMjAsIDB4MEQ1LCAweDAyNiwKKwkweDAwMSwgMHgwNjksIDB4MDUxLCAweDA2OSwgMHgwNTIsIDB4MDE5LCAweDA1MiwgMHgwNjAsCisJMHgwMTYsIDB4MDk1LCAweDAxNiwgMHgwODIsIDB4MDk2LCAweDA1NCwgMHgwOTgsIDB4MDA1LAorCTB4MEE1LCAweDA0NSwgMHgwRjMsIDB4MERELCAweDA2QSwgMHgwRjksIDB4MDI4LCAweDAxOCwKKwkweDBFRiwgMHgwMDAsIDB4MDMwLCAweDAzMCwgMHgwNTEsIDB4MDRFLCAweDA0NCwgMHgwNUQsCisJMHgwMTIsIDB4MEQxLCAweDA0MywgMHgwRTYsIDB4MDEyLCAweDA2RiwgMHgwOUUsIDB4MEJBLAorCTB4MENDLCAweDBERiwgMHgwMjUsIDB4MDAzLCAweDAxRCwgMHgwRTAsIDB4MDA2LCAweDAwNiwKKwkweDAwQSwgMHgwMzAsIDB4MENDLCAweDBBOSwgMHgwRUIsIDB4MDJELCAweDAwMCwgMHgwODYsCisJMHgwQTYsIDB4MDEyLCAweDA2NSwgMHgwNEYsIDB4MDU2LCAweDBENiwgMHgwNjUsIDB4MDQ5LAorCTB4MDVGLCAweDAzRCwgMHgwRTgsIDB4MDM3LCAweDBDOSwgMHgwNDAsIDB4MEM3LCAweDA3OCwKKwkweDAwMSwgMHgwODEsIDB4MDgyLCAweDA4QywgMHgwMzMsIDB4MDE4LCAweDA0OSwgMHgwODAsCisJMHgwQUUsIDB4MDQwLCAweDBDNSwgMHgwMTgsIDB4MDA1LCAweDA5QywgMHgwNkQsIDB4MDE4LAorCTB4MDY2LCAweDAwRSwgMHgwRjMsIDB4MEEwLCAweDBDNiwgMHgwMTIsIDB4MDYyLCAweDBERSwKKwkweDBGNSwgMHgwMDQsIDB4MEI0LCAweDBBQywgMHgwNkIsIDB4MEM2LCAweDAxOSwgMHgwOTEsCisJMHgwNzMsIDB4MDA1LCAweDA0OCwgMHgwMkUsIDB4MDcyLCAweDA5NCwgMHgwODAsIDB4MDczLAorCTB4MEExLCAweDBDOCwgMHgwNDcsIDB4MDM2LCAweDA2NiwgMHgwNjQsIDB4MDJGLCAweDAzNiwKKwkweDA2NiwgMHgwNjQsIDB4MDA3LCAweDA5OSwgMHgwMDIsIDB4MDkxLCAweDA4RSwgMHgwNzIsCisJMHgwRDEsIDB4MDBGLCAweDA5RCwgMHgwMDYsIDB4MDMxLCAweDA3MywgMHgwQTAsIDB4MEMzLAorCTB4MDUxLCAweDA2QSwgMHgwMUEsIDB4MDIwLCAweDBCRiwgMHgwM0EsIDB4MDBDLCAweDAyQywKKwkweDA3MywgMHgwODcsIDB4MDQzLCAweDA1RSwgMHgwNjAsIDB4MDAyLCAweDAyMywgMHgwRkMsCisJMHgwRTAsIDB4MEQ2LCAweDAzNSwgMHgwRUYsIDB4MDlFLCAweDBGNSwgMHgwRUYsIDB4MDkyLAorCTB4MDgxLCAweDA4RSwgMHgwRjAsIDB4MDAzLCAweDAwMywgMHgwMDUsIDB4MDE4LCAweDA2NiwKKwkweDA0NSwgMHgwQ0MsIDB4MDBCLCAweDA0OCwgMHgwMkUsIDB4MDcwLCAweDAwQSwgMHgwNDAsCisJMHgwMzksIDB4MEQwLCAweDBFNCwgMHgwMjMsIDB4MDlCLCAweDAzMywgMHgwMzIsIDB4MDE3LAorCTB4MDlCLCAweDAzMywgMHgwMzIsIDB4MDAzLCAweDBDQywgMHgwODUsIDB4MDQ4LCAweDBDNywKKwkweDAzOCwgMHgwMTQsIDB4MEE1LCAweDBDRSwgMHgwMjksIDB4MDdFLCAweDBEMiwgMHgwODAsCisJMHgwQTEsIDB4MEE4LCAweDBCNCwgMHgwNDgsIDB4MDg4LCAweDAyRiwgMHgwQ0UsIDB4MDgzLAorCTB4MDBCLCAweDAxQywgMHgwRTEsIDB4MEQwLCAweDBENywgMHgwOTgsIDB4MDA0LCAweDA4OCwKKwkweDA4NywgMHgwQ0UsIDB4MDk2LCAweDAzMSwgMHgwNzMsIDB4MEE1LCAweDA4RiwgMHgwRjMsCisJMHgwODMsIDB4MDU4LCAweDBENywgMHgwQkUsIDB4MDdCLCAweDA4MiwgMHgwQUYsIDB4MDkyLAorCTB4MDgxLCAweDA4RSwgMHgwRjAsIDB4MDAzLCAweDAwMywgMHgwMDUsIDB4MDE4LCAweDA2NiwKKwkweDA0NSwgMHgwQ0MsIDB4MDE1LCAweDAyMCwgMHgwQjksIDB4MEM4LCAweDAyOSwgMHgwMDAsCisJMHgwRTcsIDB4MDQzLCAweDA5MCwgMHgwOEUsIDB4MDZDLCAweDBDQywgMHgwQzgsIDB4MDVFLAorCTB4MDZDLCAweDBDQywgMHgwQzgsIDB4MDBGLCAweDAzMiwgMHgwMDUsIDB4MDIzLCAweDAxQywKKwkweDBFNCwgMHgwNTAsIDB4MEQ0LCAweDA1QSwgMHgwMTcsIDB4MDg4LCAweDAyRiwgMHgwQ0UsCisJMHgwODMsIDB4MDEwLCAweDBGOSwgMHgwRDAsIDB4MDIzLCAweDAxNywgMHgwM0EsIDB4MDA0LAorCTB4MDM1LCAweDBFNiwgMHgwMDAsIDB4MDIyLCAweDAxNiwgMHgwMzksIDB4MEMzLCAweDBBMywKKwkweDBGQywgMHgwRTAsIDB4MEQ2LCAweDAzNSwgMHgwRTAsIDB4MEJGLCAweDBGNCwgMHgwMTgsCisJMHgwRjIsIDB4MDJELCAweDA0RCwgMHgwNDMsIDB4MDUxLCAweDA2RSwgMHgwNUEsIDB4MDIyLAorCTB4MDFGLCAweDAzMCwgMHgwRDQsIDB4MDE3LCAweDBFNywgMHgwNDEsIDB4MDkxLCAweDA3MywKKwkweDAwNSwgMHgwNDgsIDB4MDJFLCAweDA3NywgMHgwNjksIDB4MDAwLCAweDBFNywgMHgwNDMsCisJMHgwOTAsIDB4MDhFLCAweDA2QywgMHgwQ0MsIDB4MEM4LCAweDA1RSwgMHgwNkMsIDB4MENDLAorCTB4MEM4LCAweDAwRiwgMHgwMzIsIDB4MDA1LCAweDAyMywgMHgwMUMsIDB4MEVGLCAweDA0QywKKwkweDA0RSwgMHgwMDYsIDB4MDA0LCAweDBDOSwgMHgwOUUsIDB4MDBCLCAweDBGRiwgMHgwNDEsCisJMHgwOEYsIDB4MDIyLCAweDBENCwgMHgwRDQsIDB4MDM1LCAweDAxNiwgMHgwRTUsIDB4MEEyLAorCTB4MDIxLCAweDBGMywgMHgwNUEsIDB4MDgyLCAweDBGQywgMHgwRTgsIDB4MDMyLCAweDAyRSwKKwkweDA2MCwgMHgwQTksIDB4MDA1LCAweDBDRSwgMHgwMTMsIDB4MDQ4LCAweDAwNywgMHgwM0EsCisJMHgwMUMsIDB4MDg0LCAweDA3MywgMHgwNjYsIDB4MDY2LCAweDA0MiwgMHgwRjMsIDB4MDY2LAorCTB4MDY2LCAweDA0MCwgMHgwNzksIDB4MDkwLCAweDAyOSwgMHgwMTgsIDB4MEU3LCAweDAwQSwKKwkweDA5OCwgMHgwOUMsIDB4MDBBLCAweDA5RSwgMHgwQjUsIDB4MDEyLCAweDA1QywgMHgwN0MsCisJMHgwQzMsIDB4MDMxLCAweDA4QiwgMHgwOTgsIDB4MDJBLCAweDA3QywgMHgwRDMsIDB4MEVELAorCTB4MDM4LCAweDBFOSwgMHgwRDMsIDB4MDRFLCAweDA3NCwgMHgwRUQsIDB4MDQ5LCAweDA5RSwKKwkweDAwQiwgMHgwRkYsIDB4MDQxLCAweDA4RiwgMHgwMjIsIDB4MEQ0LCAweDBENCwgMHgwMzUsCisJMHgwMTYsIDB4MEU1LCAweDBBMiwgMHgwMkQsIDB4MEVCLCAweDA0NSwgMHgwMzMsIDB4MDhGLAorCTB4MEZDLCAweDBGNywgMHgwQTAsIDB4MDVGLCAweDAyNSwgMHgwMDMsIDB4MDFELCAweDBFNCwKKwkweDAwRSwgMHgwMDYsIDB4MDBBLCAweDAzMCwgMHgwQ0MsIDB4MDBDLCAweDBGMywgMHgwRUIsCisJMHgwNDAsIDB4MERFLCAweDA2MSwgMHgwQTgsIDB4MDcwLCAweDA5MiwgMHgwMEEsIDB4MDAwLAorCTB4MEUxLCAweDAyNCwgMHgwMUUsIDB4MDAwLCAweDBFMSwgMHgwMjQsIDB4MDFFLCAweDAwMCwKKwkweDBFMSwgMHgwMjQsIDB4MDFFLCAweDAwMCwgMHgwRTEsIDB4MDI0LCAweDAxRSwgMHgwMDAsCisJMHgwRTEsIDB4MDI0LCAweDAxRSwgMHgwMDEsIDB4MDBGLCAweDA5OCwgMHgwMkEsIDB4MDBCLAorCTB4MEYzLCAweDBBMCwgMHgwQzgsIDB4MEI5LCAweDBBMiwgMHgwQTQsIDB4MDE3LCAweDAzQSwKKwkweDA2OSwgMHgwMDAsIDB4MEU3LCAweDA0MywgMHgwOTAsIDB4MDhFLCAweDA3NSwgMHgwNDgsCisJMHgwNUUsIDB4MDcwLCAweDA2OSwgMHgwMDEsIDB4MEU2LCAweDAwMCwgMHgwNTIsIDB4MDMxLAorCTB4MENDLCAweDAxOCwgMHgwMTQsIDB4MEE1LCAweDBDQywgMHgwMDksIDB4MDgyLCAweDA5NCwKKwkweDA3MywgMHgwMEMsIDB4MEEwLCAweDA5MSwgMHgwRjUsIDB4MDI1LCAweDBDQywgMHgwMDcsCisJMHgwMDYsIDB4MDg0LCAweDA4NCwgMHgwOUYsIDB4MDMwLCAweDBBMiwgMHgwQTQsIDB4MDdELAorCTB4MDUwLCAweDA3NSwgMHgwQTYsIDB4MDY1LCAweDAwMSwgMHgwNEEsIDB4MDhFLCAweDBCNCwKKwkweDBDQywgMHgwQzQsIDB4MDM1LCAweDA1NCwgMHgwNzUsIDB4MDY2LCAweDBBNCwgMHgwOTcsCisJMHgwN0EsIDB4MDg5LCAweDA1MCwgMHgwNTMsIDB4MDEzLCAweDA4MCwgMHgwMTksIDB4MEUzLAorCTB4MDQ5LCAweDA1QywgMHgwNkQsIDB4MENFLCAweDBBOSwgMHgwNDAsIDB4MDM1LCAweDAwNiwKKwkweDA3OCwgMHgwRDIsIDB4MDU3LCAweDAwNiwgMHgwRjEsIDB4MEIzLCAweDAyQSwgMHgwOEQsCisJMHgwOTcsIDB4MDIzLCAweDA2MiwgMHgwOTIsIDB4MDVELCAweDA2OSwgMHgwOTksIDB4MDFDLAorCTB4MDZBLCAweDAzNiwgMHgwRTYsIDB4MENELCAweDA0NiwgMHgwMTIsIDB4MDZGLCAweDA5RSwKKwkweDBFMSwgMHgwQUIsIDB4MEU0LCAweDBBMywgMHgwMEMsIDB4MEMwLCAweDBERSwgMHgwQUMsCisJMHgwRDQsIDB4MDBELCAweDAyOCwgMHgwMUIsIDB4MEQwLCAweDAxMiwgMHgwQTUsIDB4MDAwLAorCTB4MEY4LCAweDA0QiwgMHgwQUQsIDB4MDMzLCAweDAyOCwgMHgwMDYsIDB4MEEwLCAweDBERSwKKwkweDAxNCwgMHgwOTcsIDB4MDNBLCAweDA4OSwgMHgwNUQsIDB4MEMwLCAweDAwRCwgMHgwRTMsCisJMHgwMDYsIDB4MDkwLCAweDA5MiwgMHgwNUQsIDB4MDY5LCAweDA5OCwgMHgwNjYsIDB4MEI5LAorCTB4MDE5LCAweDA5NSwgMHgwRTQsIDB4MEE4LCAweDBDRiwgMHgwOUQsIDB4MDMzLCAweDAxOCwKKwkweDA0OSwgMHgwQkUsIDB4MDdCLCAweDA4NiwgMHgwQUYsIDB4MDkyLCAweDA4QywgMHgwMzMsCisJMHgwMjQsIDB4MDE0LCAweDAwQywgMHgwRjQsIDB4MDgzLCAweDAyNCwgMHgwMjEsIDB4MEMyLAorCTB4MDcwLCAweDBCRiwgMHgwRjQsIDB4MDE4LCAweDBGMiwgMHgwMkQsIDB4MDRELCAweDA0MywKKwkweDA1MSwgMHgwNkUsIDB4MDVBLCAweDAyMiwgMHgwMUYsIDB4MDMyLCAweDBBOCwgMHgwMkYsCisJMHgwQ0UsIDB4MDgzLCAweDAyMiwgMHgwRTYsIDB4MDA1LCAweDBBNCwgMHgwMTcsIDB4MDNBLAorCTB4MDY5LCAweDAwMCwgMHgwRTcsIDB4MDQzLCAweDA5MCwgMHgwOEUsIDB4MDc1LCAweDA0OCwKKwkweDA1RSwgMHgwNzAsIDB4MDY5LCAweDAwMSwgMHgwRTYsIDB4MDQyLCAweDBBNCwgMHgwNjMsCisJMHgwOTgsIDB4MDAyLCAweDAyOSwgMHgwNEIsIDB4MDlBLCAweDAyOSwgMHgwNzgsIDB4MEU5LAorCTB4MDQwLCAweDA1MywgMHgwMTMsIDB4MDgxLCAweDA4MSwgMHgwMzIsIDB4MDY3LCAweDA4MiwKKwkweDBGRiwgMHgwRDAsIDB4MDYzLCAweDBDOCwgMHgwQjUsIDB4MDM1LCAweDAwRCwgMHgwNDUsCisJMHgwQUUsIDB4MDUwLCAweDAwOCwgMHgwN0MsIDB4MEUwLCAweDBEMCwgMHgwNUYsIDB4MDlELAorCTB4MDA2LCAweDA0NSwgMHgwQ0MsIDB4MDAxLCAweDBBNCwgMHgwMTcsIDB4MDNBLCAweDA2OSwKKwkweDAwMCwgMHgwRTcsIDB4MDQzLCAweDA5MCwgMHgwOEUsIDB4MDc1LCAweDA0OCwgMHgwNUUsCisJMHgwNzAsIDB4MDY5LCAweDAwMSwgMHgwRTYsIDB4MDU5LCAweDBBNCwgMHgwNjMsIDB4MDk4LAorCTB4MDFDLCAweDA1MiwgMHgwOTcsIDB4MDNCLCAweDAzMCwgMHgwNTIsIDB4MDhFLCAweDA3RCwKKwkweDAyQSwgMHgwMDksIDB4MDFGLCAweDA1MSwgMHgwRUIsIDB4MEE0LCAweDBBNCwgMHgwMEEsCisJMHgwQjksIDB4MDk0LCAweDA4NywgMHgwQUUsIDB4MEM1LCAweDAzMSwgMHgwMzgsIDB4MDAyLAorCTB4MEZGLCAweDBEMCwgMHgwNjMsIDB4MEM4LCAweDBCNSwgMHgwMzUsIDB4MDBELCAweDA0NSwKKwkweDBBRSwgMHgwNTAsIDB4MDA4LCAweDA3QywgMHgwRUEsIDB4MDIwLCAweDBCRiwgMHgwM0EsCisJMHgwMEMsIDB4MDhCLCAweDA5QSwgMHgwMTYsIDB4MDkwLCAweDA1QywgMHgwRTksIDB4MEE0LAorCTB4MDAzLCAweDA5RCwgMHgwMEUsIDB4MDQyLCAweDAzOSwgMHgwRDUsIDB4MDIxLCAweDA3OSwKKwkweDA5NSwgMHgwNDgsIDB4MDBGLCAweDAzMCwgMHgwMEEsIDB4MDkxLCAweDA4RSwgMHgwNjAsCisJMHgwRUIsIDB4MDI5LCAweDA3MywgMHgwMDAsIDB4MDA5LCAweDA1NCwgMHgwMDQsIDB4MENBLAorCTB4MDgyLCAweDA2NSwgMHgwNTIsIDB4MDY1LCAweDBFNCwgMHgwQ0EsIDB4MDIyLCAweDA2NSwKKwkweDA3MiwgMHgwNjUsIDB4MDA5LCAweDAzMiwgMHgwRTAsIDB4MDk5LCAweDA3MiwgMHgwNEMsCisJMHgwQzQsIDB4MEUwLCAweDAwQiwgMHgwRkYsIDB4MDQxLCAweDA4RiwgMHgwMjIsIDB4MEQ0LAorCTB4MEQ0LCAweDAzNSwgMHgwMTYsIDB4MEI5LCAweDA0MCwgMHgwMjEsIDB4MEYzLCAweDA4QSwKKwkweDA4MiwgMHgwRkMsIDB4MEU4LCAweDAzMiwgMHgwMkUsIDB4MDYwLCAweDBBOSwgMHgwMDUsCisJMHgwQ0UsIDB4MDlBLCAweDA0MCwgMHgwMzksIDB4MEQwLCAweDBFNCwgMHgwMjMsIDB4MDlELAorCTB4MDUyLCAweDAxNywgMHgwOTksIDB4MDU0LCAweDA2MSwgMHgwOTksIDB4MDAxLCAweDBFNiwKKwkweDA0MCwgMHgwQTQsIDB4MDYzLCAweDA5OCwgMHgwMDQsIDB4MEIxLCAweDA4NCwgMHgwOTgsCisJMHgwMTgsIDB4MEVGLCAweDAyRCwgMHgwMDMsIDB4MDA1LCAweDAzMSwgMHgwMzgsIDB4MDAyLAorCTB4MEZGLCAweDBEMCwgMHgwNjMsIDB4MEM4LCAweDBCNSwgMHgwMzUsIDB4MDBELCAweDA0NSwKKwkweDBCOSwgMHgwNjgsIDB4MDg4LCAweDA3QywgMHgwRTAsIDB4MDUwLCAweDA1RiwgMHgwOUQsCisJMHgwMDYsIDB4MDQ1LCAweDBDQywgMHgwODEsIDB4MDQ4LCAweDAyRSwgMHgwNzEsIDB4MDM0LAorCTB4MDhGLCAweDA0OCwgMHgwMDEsIDB4MDQ4LCAweDAxNSwgMHgwMjEsIDB4MDA1LCAweDAyMSwKKwkweDBFOSwgMHgwMEEsIDB4MDUyLCAweDAwMywgMHgwQ0UsIDB4MDVBLCAweDA0NiwgMHgwMzksCisJMHgwQ0YsIDB4MDQ3LCAweDA4RSwgMHgwNjAsIDB4MEFCLCAweDAxQSwgMHgwRjMsIDB4MDUzLAorCTB4MDQzLCAweDBFQiwgMHgwMzUsIDB4MDI0LCAweDBCOCwgMHgwMUIsIDB4MDMwLCAweDAwNywKKwkweDAwOSwgMHgwOEEsIDB4MDc0LCAweDAyRiwgMHgwN0UsIDB4MDQxLCAweDA3NCwgMHgwMUUsCisJMHgwMUQsIDB4MDBELCAweDA4NywgMHgwNDYsIDB4MDQ5LCAweDBENSwgMHgwOTUsIDB4MEQxLAorCTB4MEQ1LCAweDBENSwgMHgwQkIsIDB4MEE5LCAweDA0RSwgMHgwODIsIDB4MDlELCAweDAwNSwKKwkweDAzQSwgMHgwMEEsIDB4MDc0LCAweDAxNCwgMHgwRTgsIDB4MDI5LCAweDBEMCwgMHgwNDIsCisJMHgwNzQsIDB4MDVCLCAweDBDRSwgMHgwNTAsIDB4MEM0LCAweDAwNywgMHgwNDUsIDB4MEJDLAorCTB4MEUyLCAweDAwQywgMHgwNDAsIDB4MDc0LCAweDA1QiwgMHgwQ0UsIDB4MDgzLCAweDAwNCwKKwkweDBGOSwgMHgwOTUsIDB4MDRELCAweDAxMywgMHgwNjMsIDB4MDVFLCAweDA2RiwgMHgwMzEsCisJMHgwM0IsIDB4MEEwLCAweDA4QiwgMHgwQTIsIDB4MEM1LCAweDAzOSwgMHgwOEQsIDB4MDc4LAorCTB4MDNBLCAweDAyMiwgMHgwQTAsIDB4MDAwLCAweDA2QiwgMHgwQzEsIDB4MEQxLCAweDA1NCwKKwkweDA2MCwgMHgwMTYsIDB4MEQ5LCAweDA5MSwgMHgwQTIsIDB4MEU3LCAweDA0MywgMHgwOEMsCisJMHgwMjQsIDB4MERDLCAweDAxQywgMHgwRTAsIDB4MDUxLCAweDAxNywgMHgwMzksIDB4MDZCLAorCTB4MDNCLCAweDBDQywgMHgwNEIsIDB4MDQyLCAweDAyRSwgMHgwNkIsIDB4MDUwLCAweDBCRiwKKwkweDAzNiwgMHgwMzYsIDB4MDY1LCAweDA0RiwgMHgwN0EsIDB4MDE4LCAweDA1NSwgMHgwMjUsCisJMHgwNzgsIDB4MDk4LCAweDAyMywgMHgwRTcsIDB4MDUwLCAweDAzRSwgMHgwRjMsIDB4MDgxLAorCTB4MDRDLCAweDAwMiwgMHgwNkQsIDB4MDNFLCAweDA3MSwgMHgwNTMsIDB4MEFGLCAweDA3OCwKKwkweDBBOSwgMHgwRDQsIDB4MEE2LCAweDAyOSwgMHgwQjEsIDB4MEJDLCAweDBEOSwgMHgwOTksCisJMHgwQjIsIDB4MDhFLCAweDA2MiwgMHgwOEYsIDB4MDIyLCAweDAyRSwgMHgwNzUsIDB4MDE2LAorCTB4MEIwLCAweDBCMiwgMHgwQUIsIDB4MDIzLCAweDAyOCwgMHgwMTYsIDB4MDU0LCAweDA1MiwKKwkweDAzMSwgMHgwQkMsIDB4MEQ5LCAweDA5OSwgMHgwQjIsIDB4MDhFLCAweDA2NiwgMHgwMTksCisJMHgwMDIsIDB4MDJFLCAweDA3NSwgMHgwMTYsIDB4MDUwLCAweDAyQywgMHgwQTksIDB4MEM4LAorCTB4MEM2LCAweDBGNSwgMHgwMjAsIDB4MEQzLCAweDBFNCwgMHgwN0YsIDB4MDRGLCAweDA5QywKKwkweDAwQSwgMHgwRDYsIDB4MDE2LCAweDA3RiwgMHgwOTAsIDB4MEVFLCAweDA0QywgMHgwRUIsCisJMHgwQ0YsIDB4MEUyLCAweDA4OCwgMHgwQkEsIDB4MDJGLCAweDA0MiwgMHgwODYsIDB4MEFFLAorCTB4MEJELCAweDBFNSwgMHgwQTcsIDB4MDUyLCAweDA5RiwgMHgwOTMsIDB4MDYzLCAweDA3OSwKKwkweDBFQiwgMHgwMzMsIDB4MDA4LCAweDBGOSwgMHgwOTQsIDB4MDUyLCAweDA0NywgMHgwQ0QsCisJMHgwOTksIDB4MDI1LCAweDA2RiwgMHgwM0EsIDB4MDBDLCAweDAxMywgMHgwRTYsIDB4MDU1LAorCTB4MDM0LCAweDA0QywgMHgwNUEsIDB4MDRELCAweDBCNSwgMHgwMjMsIDB4MDk1LCAweDBBNSwKKwkweDA0OCwgMHgwMTEsIDB4MDVBLCAweDAwQSwgMHgwNDMsIDB4MDk1LCAweDBBQywgMHgwMkMsCisJMHgwQkEsIDB4MDI0LCAweDAwNSwgMHgwNDksIDB4MEIxLCAweDBCQywgMHgwQ0EsIDB4MEE3LAorCTB4MDcyLCAweDA2QywgMHgwNkIsIDB4MEM1LCAweDBCRCwgMHgwRTgsIDB4MDMxLCAweDA2OSwKKwkweDA1MiwgMHgwNUQsIDB4MDA2LCAweDAxMiwgMHgwNjUsIDB4MDNFLCAweDBCMSwgMHgwNTAsCisJMHgwNEMsIDB4MDdELCAweDA0RiwgMHgwQUMsIDB4MDBBLCAweDAzMCwgMHgwMEIsIDB4MDM2LAorCTB4MDY0LCAweDAxMSwgMHgwNzMsIDB4MDhBLCAweDA4MywgMHgwOEUsIDB4MDc1LCAweDAxMiwKKwkweDA5RiwgMHgwN0IsIDB4MEQyLCAweDA5OSwgMHgwNTgsIDB4MEVFLCAweDA4MiwgMHgwMkUsCisJMHgwNzcsIDB4MEEwLCAweDBFMywgMHgwOUQsIDB4MDVELCAweDA0RiwgMHgwQkMsIDB4MDJBLAorCTB4MDUzLCAweDAyOSwgMHgwNTMsIDB4MERFLCAweDA5MywgMHgwMjQsIDB4MEJBLCAweDBCMywKKwkweDAzNiwgMHgwQUEsIDB4MDRBLCAweDBDNiwgMHgwNzksIDB4MEQ0LCAweDBCOSwgMHgwREUsCisJMHgwNjIsIDB4MDVBLCAweDAxMSwgMHgwNzMsIDB4MDUwLCAweDA1MCwgMHgwQkYsIDB4MDM3LAorCTB4MDM2LCAweDA2RiwgMHgwMTMsIDB4MDIzLCAweDBCQSwgMHgwMEMsIDB4MDI0LCAweDBDRSwKKwkweDBCRCwgMHgwRTIsIDB4MEE3LCAweDA1MiwgMHgwQjIsIDB4MDhFLCAweDA2QiwgMHgwNjAsCisJMHgwNjIsIDB4MDJFLCAweDA3NSwgMHgwMTMsIDB4MDMwLCAweDBBQywgMHgwQTAsIDB4MDU5LAorCTB4MENBLCAweDA2NCwgMHgwNjMsIDB4MDc5LCAweDBCMywgMHgwMzMsIDB4MDY1LCAweDAxQywKKwkweDBDQywgMHgwMzIsIDB4MDA0LCAweDA1QywgMHgwRUEsIDB4MDJDLCAweDBBMCwgMHgwNTksCisJMHgwREYsIDB4MDIzLCAweDAxQiwgMHgwRDQsIDB4MDgzLCAweDA1MiwgMHgwNDcsIDB4MERELAorCTB4MDc5LCAweDA5NiwgMHgwRDQsIDB4MDlFLCAweDBCMywgMHgwNTIsIDB4MDRCLCAweDBBMiwKKwkweDA1QSwgMHgwMUEsIDB4MDhELCAweDA1RCwgMHgwN0IsIDB4MDgyLCAweDBBNywgMHgwNTIsCisJMHgwQjIsIDB4MDhFLCAweDA2NiwgMHgwMTksIDB4MDAyLCAweDAyRSwgMHgwNzUsIDB4MDE2LAorCTB4MDUwLCAweDAyQywgMHgwOEMsIDB4MDMyLCAweDAxRCwgMHgwN0IsIDB4MDhFLCAweDBBNywKKwkweDA1MiwgMHgwQjEsIDB4MEJDLCAweDBEOSwgMHgwOTksIDB4MDk4LCAweDAwNCwgMHgwREEsCisJMHgwN0MsIDB4MEUyLCAweDBBQywgMHgwRkUsIDB4MDY2LCAweDAxOSwgMHgwMDIsIDB4MDJFLAorCTB4MDY1LCAweDA1MCwgMHgwQkYsIDB4MDMzLCAweDA2NiwgMHgwNjQsIDB4MEZFLCAweDA3NCwKKwkweDAxOCwgMHgwODYsIDB4MDRDLCAweDAxNywgMHgwMjYsIDB4MEQ2LCAweDAxNiwgMHgwNTIsCisJMHgwMzksIDB4MDE4LCAweDBERSwgMHgwN0EsIDB4MENDLCAweDBDMiwgMHgwM0UsIDB4MDY1LAorCTB4MDE0LCAweDA5MSwgMHgwRjMsIDB4MDY2LCAweDA0OSwgMHgwMDgsIDB4MDZFLCAweDA4MywKKwkweDAwOSwgMHgwMzMsIDB4MEFGLCAweDAzMSwgMHgwRUQsIDB4MDBELCAweDA5RCwgMHgwMDYsCisJMHgwMTIsIDB4MDYyLCAweDAyQSwgMHgwMzEsIDB4MDhELCAweDA2RCwgMHgwRTcsIDB4MDQxLAorCTB4MDgyLCAweDA3QywgMHgwQ0EsIDB4MEE2LCAweDA4OSwgMHgwODcsIDB4MDA5LCAweDAyRSwKKwkweDAyOSwgMHgwQjEsIDB4MEFGLCAweDAxMCwgMHgwMzksIDB4MEQ2LCAweDA2NCwgMHgwOTcsCisJMHgwMzAsIDB4MDFELCAweDA0MiwgMHgwNzUsIDB4MDkzLCAweDA0NCwgMHgwMDIsIDB4MDhDLAorCTB4MDI0LCAweDBEMiwgMHgwN0EsIDB4MEIzLCAweDA1MCwgMHgwRjYsIDB4MDg5LCAweDAwNSwKKwkweDA0MywgMHgwNUUsIDB4MDYxLCAweDA5OCwgMHgwQzAsIDB4MDJDLCAweDA5MiwgMHgwMjUsCisJMHgwM0MsIDB4MDhCLCAweDAyNCwgMHgwODksIDB4MDQ5LCAweDAwNSwgMHgwNDksIDB4MEU3LAorCTB4MDBDLCAweDBCOSwgMHgwODQsIDB4MDk4LCAweDBCNywgMHgwQUQsIDB4MDMzLCAweDA0NCwKKwkweDBBRSwgMHgwNUEsIDB4MDUxLCAweDA4NiwgMHgwNjAsIDB4MDlGLCAweDAzOCwgMHgwQTksCisJMHgwQTIsIDB4MDZDLCAweDA2QiwgMHgwQzQsIDB4MDhFLCAweDBGNCwgMHgwNUUsIDB4MDQ5LAorCTB4MDQ2LCAweDAxMiwgMHgwNjIsIDB4MERFLCAweDBCNCwgMHgwQ0QsIDB4MDIxLCAweDA1QywKKwkweDBCNCwgMHgwQTMsIDB4MDBDLCAweDBDMSwgMHgwM0UsIDB4MDcyLCAweDAyOSwgMHgwQTIsCisJMHgwNkMsIDB4MDZCLCAweDBDNiwgMHgwMTIsIDB4MDYyLCAweDA0NywgMHgwRjAsIDB4MEU4LAorCTB4MEMzLCAweDAzMiwgMHgwMDQsIDB4MDM1LCAweDA0MCwgMHgwOTIsIDB4MEE0LCAweDA4MiwKKwkweDA4OCwgMHgwMTAsIDB4MDkyLCAweDA3QywgMHgwQ0IsIDB4MEQ0LCAweDAyRiwgMHgwQTQsCisJMHgwMDIsIDB4MDExLCAweDA4NCwgMHgwOTgsIDB4MEI3LCAweDBBRCwgMHgwMzMsIDB4MDQ0LAorCTB4MEFFLCAweDA1QSwgMHgwNTEsIDB4MDg2LCAweDA2MCwgMHgwOUYsIDB4MDM4LCAweDBBOSwKKwkweDBBMiwgMHgwNkMsIDB4MDZCLCAweDBDNCwgMHgwOEUsIDB4MEY0LCAweDA1RSwgMHgwNDksCisJMHgwNDQsIDB4MDA4LCAweDA0OSwgMHgwM0UsIDB4MDY1LCAweDBFQSwgMHgwMTcsIDB4MEQyLAorCTB4MDAxLCAweDAwOCwgMHgwQzIsIDB4MDRDLCAweDA1QiwgMHgwRDYsIDB4MDk5LCAweDBBNCwKKwkweDAyQiwgMHgwOTYsIDB4MDk0LCAweDA2MSwgMHgwOTgsIDB4MDI3LCAweDBDRSwgMHgwNDUsCisJMHgwMzQsIDB4MDRELCAweDA4RCwgMHgwNzgsIDB4MDgxLCAweDAwOSwgMHgwMjcsIDB4MENDLAorCTB4MEJELCAweDAxMiwgMHgwMjgsIDB4MDZDLCAweDA1OCwgMHgwQUYsIDB4MEI2LCAweDBGMywKKwkweDBBMCwgMHgwQzEsIDB4MDNFLCAweDA2NSwgMHgwNTMsIDB4MDQ0LCAweDBEOCwgMHgwRDcsCisJMHgwOTIsIDB4MDhFLCAweDA3RCwgMHgwNEIsIDB4MEMyLCAweDBGQSwgMHgwNjEsIDB4MDI2LAorCTB4MDA2LCAweDAzQSwgMHgwQjMsIDB4MDZCLCAweDAwMywgMHgwMDUsIDB4MDQ5LCAweDBFNywKKwkweDAwQywgMHgwQjksIDB4MDZGLCAweDA1QSwgMHgwNjYsIDB4MDk1LCAweDA1QywgMHgwQjQsCisJMHgwQTMsIDB4MDBDLCAweDBDMSwgMHgwM0UsIDB4MDcwLCAweDAyOSwgMHgwQTIsIDB4MDZFLAorCTB4MEE0LCAweDBERiwgMHgwOTMsIDB4MDcxLCAweDAxMywgMHgwNzcsIDB4MDI2LCAweDBFMSwKKwkweDAyNiwgMHgwRjgsIDB4MDI2LCAweDBDNiwgMHgwQkMsIDB4MDk0LCAweDA3MywgMHgwRjksCisJMHgwMkYsIDB4MDBCLCAweDBFOSwgMHgwODQsIDB4MDk4LCAweDAxOCwgMHgwRUEsIDB4MENDLAorCTB4MEVDLCAweDAwQywgMHgwMTUsIDB4MDI3LCAweDA5QywgMHgwMzIsIDB4MEZGLCAweDAzRCwKKwkweDA1NiwgMHgwQUYsIDB4MDkyLCAweDA4QiwgMHgwN0EsIDB4MEQzLCAweDAzNSwgMHgwRDUsCisJMHgwQ0IsIDB4MDRBLCAweDAzMCwgMHgwQ0MsIDB4MDEzLCAweDBFNywgMHgwMDIsIDB4MDlBLAorCTB4MDI2LCAweDBDNiwgMHgwQkMsIDB4MDk0LCAweDA3MywgMHgwNDEsIDB4MDk3LCAweDA5MSwKKwkweDBGNCwgMHgwODMsIDB4MENFLCAweDAwNCwgMHgwMjAsIDB4MDYyLCAweDA4QiwgMHgwMDUsCisJMHgwMTYsIDB4MDQ5LCAweDA4QywgMHgwMjQsIDB4MEMwLCAweDBDNywgMHgwNTYsIDB4MDkwLAorCTB4MEMwLCAweDBDMSwgMHgwNTIsIDB4MDc5LCAweDBDMywgMHgwMkUsIDB4MDVCLCAweDBENSwKKwkweDBBNiwgMHgwNzIsIDB4MEQyLCAweDA5NCwgMHgwRkEsIDB4MEFELCAweDA1OCwgMHgwQzgsCisJMHgwRkEsIDB4MDlGLCAweDA1NCwgMHgwQjMsIDB4MDMyLCAweDA0QiwgMHgwQjksIDB4MDU0LAorCTB4MEE2LCAweDA1MSwgMHgwODYsIDB4MDZCLCAweDA3OSwgMHgwRDAsIDB4MDYwLCAweDA5RiwKKwkweDAzMiwgMHgwMDUsIDB4MDM0LCAweDA0RCwgMHgwOEQsIDB4MDdBLCAweDA0RCwgMHgwMUUsCisJMHgwN0EsIDB4MEIzLCAweDA1MSwgMHgwMDAsIDB4MEE5LCAweDAzRCwgMHgwNTksIDB4MEE4LAorCTB4MDdCLCAweDA0NCwgMHgwODIsIDB4MEExLCAweDBBRiwgMHgwNEEsIDB4MDhELCAweDA1MiwKKwkweDBBOSwgMHgwNTIsIDB4MDQxLCAweDA0OSwgMHgwNEYsIDB4MDNBLCAweDAyRSwgMHgwNDAsCisJMHgwQTQsIDB4MDk5LCAweDA1MCwgMHgwQkUsIDB4MDkwLCAweDAwOCwgMHgwNTIsIDB4MDc5LAorCTB4MEMzLCAweDAyRSwgMHgwNjEsIDB4MDI2LCAweDAyRCwgMHgwRUIsIDB4MDRDLCAweDBEMCwKKwkweDAxNSwgMHgwQ0IsIDB4MDRBLCAweDAzMCwgMHgwQ0MsIDB4MDEzLCAweDBFNywgMHgwMDIsCisJMHgwOUEsIDB4MDI2LCAweDBDNiwgMHgwQkMsIDB4MDQ4LCAweDBGRSwgMHgwMUQsIDB4MDI1LAorCTB4MDQ2LCAweDBBOSwgMHgwNTQsIDB4MEE5LCAweDAyMCwgMHgwQTQsIDB4MEE3LCAweDA5RCwKKwkweDAxNywgMHgwMjAsIDB4MDUyLCAweDA0QywgMHgwQTgsIDB4MDVGLCAweDA0OCwgMHgwMDQsCisJMHgwMjMsIDB4MDA5LCAweDAzMSwgMHgwNkYsIDB4MDVBLCAweDA2NiwgMHgwODAsIDB4MEFFLAorCTB4MDVBLCAweDA1MSwgMHgwODYsIDB4MDYwLCAweDA5RiwgMHgwMzgsIDB4MDE0LCAweDBEMSwKKwkweDAzNiwgMHgwMzUsIDB4MEU0LCAweDBBNywgMHgwOUQsIDB4MDE3LCAweDAyMCwgMHgwNTIsCisJMHgwNEMsIDB4MEEyLCAweDA0NSwgMHgwMEQsIDB4MDhCLCAweDAxNSwgMHgwRjQsIDB4MDkxLAorCTB4MERFLCAweDA4QiwgMHgwQzksIDB4MDI4LCAweDBDMiwgMHgwNEMsIDB4MDVCLCAweDBENiwKKwkweDA5OSwgMHgwQTksIDB4MDVDLCAweDBCNCwgMHgwQTMsIDB4MDBDLCAweDBENiwgMHgwRjMsCisJMHgwQTAsIDB4MEMxLCAweDAzRSwgMHgwNjQsIDB4MDBBLCAweDA2OCwgMHgwOUIsIDB4MDFBLAorCTB4MEYxLCAweDA2RCwgMHgwNEMsIDB4MEFBLCAweDA5MiwgMHgwRTAsIDB4MDM2LCAweDA5NCwKKwkweDA3MCwgMHgwOUIsIDB4MDI5LCAweDA3OCwgMHgwMTMsIDB4MEFFLCAweDBCMywgMHgwQUEsCisJMHgwODUsIDB4MEQ0LCAweDA0MywgMHgwNzUsIDB4MDA5LCAweDAzQSwgMHgwQzksIDB4MEVCLAorCTB4MDM1LCAweDAyNCwgMHgwQjgsIDB4MDFCLCAweDAzMiwgMHgwOEUsIDB4MDEzLCAweDA0OCwKKwkweDA3RSwgMHgwNEUsIDB4MEZELCAweDA0MCwgMHgwRkQsIDB4MDQwLCAweDBGRCwgMHgwNDAsCisJMHgwRkQsIDB4MDQwLCAweDBGRCwgMHgwNDAsIDB4MEZDLCAweDAxMywgMHgwRjQsIDB4MDIxLAorCTB4MEY5LCAweDAxNywgMHgwNDUsIDB4MDhBLCAweDAzMCwgMHgwMEIsIDB4MDMzLCAweDA1RiwKKwkweDA4MywgMHgwQTIsIDB4MDJBLCAweDAzMCwgMHgwMEIsIDB4MDMzLCAweDA1RiwgMHgwODMsCisJMHgwQTIsIDB4MEE4LCAweDBDMCwgMHgwMkQsIDB4MEIzLCAweDAyMCwgMHgwNzAsIDB4MDkyLAorCTB4MDEzLCAweDA5QSwgMHgwREUsIDB4MDc0LCAweDAxOCwgMHgwMjcsIDB4MENDLCAweDBBQSwKKwkweDA2OCwgMHgwOUIsIDB4MDFBLCAweDBGNywgMHgwMDcsIDB4MDQ1LCAweDA1MSwgMHgwODAsCisJMHgwNUIsIDB4MDY2LCAweDA0NywgMHgwMDcsIDB4MDM4LCAweDBBOCwgMHgwMjMsIDB4MEU3LAorCTB4MDUxLCAweDAxMSwgMHgwM0YsIDB4MEUwLCAweDBFOCwgMHgwODUsIDB4MDQ2LCAweDAwMSwKKwkweDA2RCwgMHgwOTksIDB4MDA2LCAweDAxMiwgMHgwNjUsIDB4MDRGLCAweDA3QSwgMHgwMjAsCisJMHgwMjQsIDB4MEJBLCAweDBCMywgMHgwMzIsIDB4MDE1LCAweDAyNSwgMHgwN0IsIDB4MEFELAorCTB4MDMzLCAweDA3OCwgMHgwQUUsIDB4MDBFLCAweDA3MywgMHgwRDAsIDB4MDQ3LCAweDBDRSwKKwkweDBBNywgMHgwMzAsIDB4MENDLCAweDA0NCwgMHgwRkYsIDB4MDgzLCAweDBBMiwgMHgwQTgsCisJMHgwQzAsIDB4MDJDLCAweDBEOSwgMHgwOTEsIDB4MEMxLCAweDBEMSwgMHgwMTUsIDB4MDE4LAorCTB4MDA1LCAweDA5QiwgMHgwMzIsIDB4MDA4LCAweDBCQSwgMHgwMkMsIDB4MDUxLCAweDA4MCwKKwkweDA1OSwgMHgwQjMsIDB4MDIwLCAweDA3MCwgMHgwOTIsIDB4MEUyLCAweDA5OCwgMHgwODksCisJMHgwRkQsIDB4MEJDLCAweDBFRSwgMHgwMTgsIDB4MDkwLCAweDBGQywgMHgwOEIsIDB4MEEyLAorCTB4MEM1LCAweDAyQiwgMHgwMEQsIDB4MDc4LCAweDAzQSwgMHgwMjIsIDB4MEE1LCAweDA2MSwKKwkweDBBRiwgMHgwMDcsIDB4MDQ1LCAweDA1MSwgMHgwODAsIDB4MDVCLCAweDA2NiwgMHgwNDQsCisJMHgwOUUsIDB4MEIzLCAweDA1MiwgMHgwNEIsIDB4MDgzLCAweDBBRCwgMHgwQzcsIDB4MDA5LAorCTB4MEJFLCAweDAxRiwgMHgwOUYsIDB4MDc0LCAweDA2NSwgMHgwNUQsIDB4MDBBLCAweDAxNywKKwkweDA3QywgMHgwQUIsIDB4MEEwLCAweDBDMiwgMHgwNEMsIDB4MDM4LCAweDA0OSwgMHgwMTIsCisJMHgwMkUsIDB4MDM4LCAweDA0OSwgMHgwMDcsIDB4MEEzLCAweDAwQywgMHgwQzEsIDB4MDNFLAorCTB4MDY1LCAweDA1MywgMHgwNDQsIDB4MEQ4LCAweDBENywgMHgwQUQsIDB4MEU3LCAweDAwMCwKKwkweDAzMiwgMHgwNEIsIDB4MDlCLCAweDAzMywgMHgwMzQsIDB4MDRBLCAweDAwMywgMHgwMDAsCisJMHgwOUQsIDB4MDI1LCAweDBDRSwgMHgwODMsIDB4MDI0LCAweDBCOCwgMHgwMTksIDB4MDk5LAorCTB4MDhDLCAweDAwMiwgMHgwMTIsIDB4MDRCLCAweDBBMSwgMHgwOTksIDB4MEQ4LCAweDBDMCwKKwkweDAyNywgMHgwNDksIDB4MDczLCAweDBDRiwgMHgwRjksIDB4MDNDLCAweDBGNCwgMHgwN0MsCisJMHgwRTcsIDB4MDk4LCAweDAwNCwgMHgwRTksIDB4MDJFLCAweDA3RiwgMHgwMzksIDB4MEUzLAorCTB4MDRGLCAweDA0NiwgMHgwNTMsIDB4MEMwLCAweDA2MCwgMHgwMTMsIDB4MEE0LCAweDBCOSwKKwkweDBFNSwgMHgwM0MsIDB4MDAzLCAweDBERSwgMHgwOEYsIDB4MDlDLCAweDBGMywgMHgwMDAsCisJMHgwOUMsIDB4MDZGLCAweDBDRiwgMHgwM0UsIDB4MDg1LCAweDBGOSwgMHgwQTMsIDB4MDM2LAorCTB4MDAyLCAweDAxRSwgMHgwNjAsIDB4MDM4LCAweDA5MiwgMHgwM0UsIDB4MDYzLCAweDAxQSwKKwkweDAxMCwgMHgwOUYsIDB4MENGLCAweDAxOCwgMHgwMTAsIDB4MDkyLCAweDBCQywgMHgwRDAsCisJMHgwQTQsIDB4MDBDLCAweDBEQywgMHgwQzAsIDB4MDBGLCAweDA5QywgMHgwOTcsIDB4MDM0LAorCTB4MDYyLCAweDBCNiwgMHgwRTcsIDB4MEYzLCAweDBGMywgMHgwQTUsIDB4MENGLCAweDAxOCwKKwkweDA0MiwgMHgwMzQsIDB4MDFDLCAweDBDMiwgMHgwQ0EsIDB4MEZBLCAweDA4RSwgMHgwNjgsCisJMHgwNTIsIDB4MDA2LCAweDBBRiwgMHgwM0MsIDB4MEEzLCAweDAwRCwgMHgwQkYsIDB4MDlFLAorCTB4MDUwLCAweDBFMSwgMHgwRDEsIDB4MDczLCAweDBDQSwgMHgwRTAsIDB4MDNBLCAweDBGQywKKwkweDBDMSwgMHgwMDksIDB4MDFBLCAweDAxRSwgMHgwNkEsIDB4MDVDLCAweDA1QiwgMHgwOEUsCisJMHgwNjMsIDB4MDRFLCAweDA3NywgMHgwNzMsIDB4MENDLCAweDA2MSwgMHgwNjcsIDB4MERELAorCTB4MEU2LCAweDA2QywgMHgwNDgsIDB4MEQxLCAweDBGMywgMHgwMUIsIDB4MDI0LCAweDA2OSwKKwkweDA1MSwgMHgwMDgsIDB4MEQ0LCAweDA0MiwgMHgwMUIsIDB4MEY0LCAweDA2NywgMHgwRDEsCisJMHgwODAsIDB4MDRFLCAweDAyRiwgMHgwRDAsIDB4MDhDLCAweDBEOCwgMHgwMzAsIDB4MDA5LAorCTB4MEMyLCAweDAxRSwgMHgwODAsIDB4MDFDLCAweDA0NiwgMHgwMDEsIDB4MDNBLCAweDA0NywKKwkweDBEMCwgMHgwMzEsIDB4MEExLCAweDAwNiwgMHgwMDEsIDB4MDNBLCAweDA3RiwgMHgwNDYsCisJMHgwMzAsIDB4MDIxLCAweDAxOCwgMHgwMDQsIDB4MEU5LCAweDA1RSwgMHgwODQsIDB4MDI5LAorCTB4MDAwLCAweDBDMCwgMHgwMjcsIDB4MENELCAweDBEMCwgMHgwMDAsIDB4MDdDLCAweDA5OCwKKwkweDAwNCwgMHgwRjksIDB4MDJFLCAweDA4NCwgMHgwNjIsIDB4MDhDLCAweDAwMiwgMHgwN0QsCisJMHgwQkEsIDB4MDNFLCAweDA3RSwgMHgwNEMsIDB4MDAyLCAweDA3RCwgMHgwMkUsIDB4MDhDLAorCTB4MDYxLCAweDAwOCwgMHgwMzAsIDB4MDA5LCAweDBGNCwgMHgwMUQsIDB4MDAxLCAweDA2NSwKKwkweDA3MywgMHgwMDAsIDB4MDlGLCAweDA1MSwgMHgwRDAsIDB4MDg1LCAweDAyMCwgMHgwMTgsCisJMHgwMDQsIDB4MEZBLCAweDBCRCwgMHgwMTksIDB4MDQ2LCAweDAxOCwgMHgwQzAsIDB4MDI3LAorCTB4MERGLCAweDBEMSwgMHgwOTQsIDB4MDM4LCAweDA0QywgMHgwMDIsIDB4MDdELCAweDAxNywKKwkweDA0NiwgMHgwNTcsIDB4MDAxLCAweDAzMCwgMHgwMDksIDB4MEY1LCAweDBGQSwgMHgwMDEsCisJMHgwMDksIDB4MDA2LCAweDAwMSwgMHgwM0UsIDB4MDg3LCAweDBBMSwgMHgwNEIsIDB4MDg4LAorCTB4MEMwLCAweDAyNywgMHgwREMsIDB4MDc0LCAweDAwRCwgMHgwMzksIDB4MEQzLCAweDAwMCwKKwkweDA5RiwgMHgwNzMsIDB4MEQwLCAweDAzMCwgMHgwQjMsIDB4MDk4LCAweDAwNCwgMHgwRkIsCisJMHgwQkQsIDB4MDA2LCAweDBDNCwgMHgwODMsIDB4MDAwLCAweDA5RiwgMHgwNDcsIDB4MEQwLAorCTB4MDM2LCAweDA0OCwgMHgwQ0MsIDB4MDAyLCAweDA3MSwgMHgwQkYsIDB4MDNGLCAweDA5QSwKKwkweDAxNywgMHgwRTYsIDB4MDNGLCAweDAwOCwgMHgwMjEsIDB4MEU2LCAweDA5MiwgMHgwQTQsCisJMHgwOEYsIDB4MDlBLCAweDAxMCwgMHgwMzEsIDB4MEE3LCAweDBGMywgMHgwMTAsIDB4MEIxLAorCTB4MDg0LCAweDBBRiwgMHgwM0EsIDB4MEFDLCAweDBEQywgMHgwRjcsIDB4MDczLCAweDBGMiwKKwkweDA1QywgMHgwQzYsIDB4MDJBLCAweDBEQiwgMHgwOUUsIDB4MDdFLCAweDA3RSwgMHgwOTcsCisJMHgwMzEsIDB4MDA4LCAweDA2MywgMHgwRDAsIDB4MDczLCAweDA3QiwgMHgwNDMsIDB4MEE4LAorCTB4MEU2LCAweDAzRCwgMHgwMzQsIDB4MEVBLCAweDBGMywgMHgwRTMsIDB4MDE1LCAweDBCRiwKKwkweDA5RiwgMHgwMTgsIDB4MDVGLCAweDA0NSwgMHgwQ0YsIDB4MEU4LCAweDA5RiwgMHgwNUYsCisJMHgwOUEsIDB4MDVCLCAweDAwMywgMHgwRDAsIDB4MEYzLCAweDBEMywgMHgwQ0UsIDB4MDM3LAorCTB4MDFDLCAweDBEMCwgMHgwMEYsIDB4MEJCLCAweDA5RSwgMHgwNjgsIDB4MDc4LCAweDAzQiwKKwkweDBCQywgMHgwQ0EsIDB4MDMxLCAweDBFOCwgMHgwRjksIDB4MEEyLCAweDAwMiwgMHgwMTIsCisJMHgwQTIsIDB4MDczLCAweDA1MSwgMHgwMDgsIDB4MDZGLCAweDBEMSwgMHgwRjMsIDB4MDQ2LAorCTB4MDAxLCAweDAzOCwgMHgwQkYsIDB4MDQwLCAweDBGQywgMHgwMjMsIDB4MDAwLCAweDA5QywKKwkweDAyMSwgMHgwRTgsIDB4MDQ5LCAweDA1MSwgMHgwODAsIDB4MDRFLCAweDA5MSwgMHgwRjQsCisJMHgwMjEsIDB4MDAzLCAweDAxOSwgMHgwODAsIDB4MDRFLCAweDA5RiwgMHgwRDAsIDB4MDIxLAorCTB4MDYzLCAweDAwNiwgMHgwMDEsIDB4MDNBLCAweDA1NiwgMHgwOEMsIDB4MDAyLCAweDA3NCwKKwkweDBGRSwgMHgwNzUsIDB4MDQ5LCAweDA1RSwgMHgwNjMsIDB4MEQzLCAweDA0QSwgMHgwNTQsCisJMHgwNDIsIDB4MDM1LCAweDAxMywgMHgwQTcsIDB4MEQxLCAweDA4MCwgMHgwNEUsIDB4MDk1LAorCTB4MEU4LCAweDAxRSwgMHgwOUEsIDB4MDRDLCAweDAwMiwgMHgwN0MsIDB4MERELCAweDAxQiwKKwkweDBCOSwgMHgwRTYsIDB4MDAxLCAweDAzRSwgMHgwNEIsIDB4MEEwLCAweDA2MiwgMHgwQTMsCisJMHgwMDAsIDB4MDlGLCAweDA2RSwgMHgwOEMsIDB4MEZDLCAweDBGMywgMHgwMDAsIDB4MDlGLAorCTB4MDRCLCAweDBBMCwgMHgwNDIsIDB4MDE4LCAweDBDQywgMHgwMDIsIDB4MDdELCAweDAwNywKKwkweDA0MywgMHgwREEsIDB4MDEzLCAweDAwMCwgMHgwOUYsIDB4MDUxLCAweDBEMCwgMHgwM0QsCisJMHgwMzQsIDB4MDk4LCAweDAwNCwgMHgwRkEsIDB4MEJELCAweDAxQywgMHgwNjIsIDB4MDhDLAorCTB4MDAyLCAweDA3RCwgMHgwRkQsIDB4MDFDLCAweDA2MSwgMHgwNzMsIDB4MDAwLCAweDA5RiwKKwkweDA0NSwgMHgwRDEsIDB4MEY0LCAweDA0RSwgMHgwNjAsIDB4MDEzLCAweDBFQiwgMHgwRjQsCisJMHgwMjUsIDB4MEIwLCAweDAzMywgMHgwMDAsIDB4MDlGLCAweDA0MywgMHgwRDEsIDB4MEE3LAorCTB4MDlDLCAweDAxOCwgMHgwMDQsIDB4MEZCLCAweDA4RSwgMHgwODQsIDB4MDAzLCAweDBFOSwKKwkweDA4MCwgMHgwNEYsIDB4MEI5LCAweDBFOCwgMHgwNDMsIDB4MEMxLCAweDAzMCwgMHgwMDksCisJMHgwRjcsIDB4MDdBLCAweDAwQSwgMHgwMzEsIDB4MDk4LCAweDAwNCwgMHgwRkEsIDB4MDNFLAorCTB4MDg0LCAweDA0MCwgMHgwNDEsIDB4MDgwLCAweDA0RSwgMHgwODIsIDB4MEU3LCAweDA0MSwKKwkweDA4NywgMHgwMDksIDB4MDIzLCAweDAwNCwgMHgwMjMsIDB4MDAwLCAweDA5RCwgMHgwMDUsCisJMHgwQ0UsIDB4MDk2LCAweDAxQywgMHgwMjQsIDB4MDhDLCAweDAxMCwgMHgwOEMsIDB4MDAyLAorCTB4MDc0LCAweDAxNywgMHgwM0EsIDB4MDA0LCAweDAzOCwgMHgwNDksIDB4MDE4LCAweDAyMSwKKwkweDAxOCwgMHgwMDQsIDB4MEU4LCAweDAyRSwgMHgwNzQsIDB4MDUwLCAweDBFMSwgMHgwMjQsCisJMHgwNjAsIDB4MDg0LCAweDA2MCwgMHgwMTMsIDB4MEEwLCAweDBCOSwgMHgwRDQsIDB4MDExLAorCTB4MEMyLCAweDA0OCwgMHgwQzEsIDB4MDA4LCAweDBDMCwgMHgwMjcsIDB4MDQxLCAweDA3MywKKwkweDBBOCwgMHgwMjMsIDB4MDg0LCAweDA5MSwgMHgwODIsIDB4MDExLCAweDA4MCwgMHgwNEUsCisJMHgwODIsIDB4MEU3LCAweDA1MiwgMHgwOEUsIDB4MDEyLCAweDA0NiwgMHgwMDgsIDB4MDQ2LAorCTB4MDAxLCAweDAzQSwgMHgwMEIsIDB4MDlELCAweDA0MCwgMHgwMUMsIDB4MDI0LCAweDA4QywKKwkweDAxMCwgMHgwOEMsIDB4MDAyLCAweDA3NCwgMHgwMTcsIDB4MDNBLCAweDAwOSwgMHgwMEUsCisJMHgwMTIsIDB4MDQ2LCAweDAwOCwgMHgwNDYsIDB4MDAxLCAweDAzQSwgMHgwMEIsIDB4MDk4LAorCTB4MDZBLCAweDAxQywgMHgwMjQsIDB4MEIwLCAweDBFMSwgMHgwMTgsIDB4MDA0LCAweDBFOCwKKwkweDAyRSwgMHgwNkIsIDB4MDUwLCAweDBFMSwgMHgwMjUsIDB4MDg3LCAweDAwOCwgMHgwQzAsCisJMHgwMjcsIDB4MDQxLCAweDA3MywgMHgwMDUsIDB4MDQzLCAweDA4NCwgMHgwOTYsIDB4MDFDLAorCTB4MDIzLCAweDAwMCwgMHgwOUQsIDB4MDA1LCAweDBDQywgMHgwQUEsIDB4MDFDLCAweDAyNCwKKwkweDBCMCwgMHgwRTEsIDB4MDE4LCAweDAwNCwgMHgwRTgsIDB4MDJFLCAweDA3MCwgMHgwNjgsCisJMHgwNzAsIDB4MDkyLCAweDBDMywgMHgwODQsIDB4MDYwLCAweDAxMywgMHgwRTUsIDB4MDQ0LAorCTB4MEY5LCAweDA0MCwgMHgwOUQsIDB4MDA1LCAweDBDRSwgMHgwNUEsIDB4MDFDLCAweDAyNCwKKwkweDBCMCwgMHgwRTEsIDB4MDE4LCAweDAwNCwgMHgwRjksIDB4MEQxLCAweDAzRSwgMHgwNzAsCisJMHgwMjcsIDB4MENGLCAweDAxMywgMHgwRTUsIDB4MDQ0LCAweDAyQywgMHgwQTAsIDB4MDQyLAorCTB4MENCLCAweDA4OSwgMHgwRjIsIDB4MDIxLCAweDAzQSwgMHgwMEIsIDB4MDlDLCAweDAwQSwKKwkweDAxQywgMHgwMjQsIDB4MEIwLCAweDBFMSwgMHgwMTgsIDB4MDA0LCAweDBGOSwgMHgwRDEsCisJMHgwMEIsIDB4MDM4LCAweDAxMCwgMHgwQjMsIDB4MEM0LCAweDAyMSwgMHgwMzksIDB4MDM2LAorCTB4MDVDLCAweDA0MiwgMHgwQzgsIDB4MDg0LCAweDAyQiwgMHgwNzksIDB4MEQwLCAweDA2MSwKKwkweDBDMiwgMHgwNzQsIDB4MDE1LCAweDAyNCwgMHgwQkEsIDB4MEQzLCAweDAzMSwgMHgwRTUsCisJMHgwNTksIDB4MDA4LCAweDAyOSwgMHgwMDgsIDB4MEUwLCAweDA2NiwgMHgwNjMsIDB4MDQyLAorCTB4MDk1LCAweDAxMiwgMHgwODEsIDB4MDAwLCAweDAyOSwgMHgwMEIsIDB4MEMxLCAweDA1MSwKKwkweDAyNCwgMHgwQjgsIDB4MDE5LCAweDA5OSwgMHgwOTAsIDB4MDIyLCAweDA5MCwgMHgwQjQsCisJMHgwMTgsIDB4MEEwLCAweDA5MSwgMHgwNDEsIDB4MDAxLCAweDA0MSwgMHgwNDEsIDB4MDQxLAorCTB4MDUyLCAweDA4MywgMHgwQ0EsIDB4MDQwLCAweDAyOCwgMHgwNjgsIDB4MDI5LCAweDAwOCwKKwkweDBCQSwgMHgwMTYsIDB4MDEwLCAweDA5QywgMHgwOTksIDB4MDBCLCAweDA1NiwgMHgwOTQsCisJMHgwOTAsIDB4MDUyLCAweDAxNSwgMHgwNzQsIDB4MEMwLCAweDAyNywgMHgwMUEsIDB4MDJBLAorCTB4MEQyLCAweDA5MCwgMHgwMjUsIDB4MEQzLCAweDAwMCwgMHgwOUQsIDB4MDI4LCAweDBBQiwKKwkweDA0QSwgMHgwNDIsIDB4MDE3LCAweDA0QywgMHgwMDIsIDB4MDcwLCAweDBENCwgMHgwODQsCisJMHgwMkUsIDB4MDk4LCAweDAwNCwgMHgwRTEsIDB4MDJBLCAweDA0MiwgMHgwMTcsIDB4MDRDLAorCTB4MDAyLCAweDA3MCwgMHgwODIsIDB4MDkwLCAweDA0QiwgMHgwQTYsIDB4MDAxLCAweDAzOCwKKwkweDA1MSwgMHgwNDgsIDB4MDQyLCAweDBFOSwgMHgwODAsIDB4MDRFLCAweDAxNSwgMHgwQTQsCisJMHgwMjEsIDB4MDc0LCAweDBDMCwgMHgwMjcsIDB4MDBGLCAweDBBNCwgMHgwMTIsIDB4MEU5LAorCTB4MDgwLCAweDA0RSwgMHgwODIsIDB4MEFDLCAweDA4MCwgMHgwQUMsIDB4MEEwLCAweDBBQywKKwkweDBBOSwgMHgwNTksIDB4MEU1LCAweDA2NCwgMHgwNDUsIDB4MDY1LCAweDBDQSwgMHgwQzgsCisJMHgwNEEsIDB4MENFLCAweDAwQSwgMHgwQ0UsIDB4MDRBLCAweDBDRSwgMHgwOTUsIDB4MDkxLAorCTB4MDk1LCAweDA5NCwgMHgwOTUsIDB4MDkzLCAweDAyOSwgMHgwMjUsIDB4MEMwLCAweDBDQywKKwkweDBDQywgMHgwODgsIDB4MEE0LCAweDA5NywgMHgwNTYsIDB4MDM2LCAweDA2NCwgMHgwNzIsCisJMHgwOTAsIDB4MDU0LCAweDA4QSwgMHgwOUMsIDB4MDQ1LCAweDAwOCwgMHgwQjksIDB4MEI3LAorCTB4MDY2LCAweDAxMiwgMHgwOTMsIDB4MDA5LCAweDBDOSwgMHgwQjIsIDB4MDc0LCAweDA4RSwKKwkweDBCQSwgMHgwNjAsIDB4MDEzLCAweDBFNSwgMHgwMzQsIDB4MDhFLCAweDBCQSwgMHgwNjAsCisJMHgwMTMsIDB4MEU0LCAweDA3NCwgMHgwOEUsIDB4MEJBLCAweDA2MCwgMHgwMTMsIDB4MEU1LAorCTB4MDY5LCAweDAxRCwgMHgwNzQsIDB4MEMwLCAweDAyNywgMHgwQ0EsIDB4MDI5LCAweDAxRCwKKwkweDA3NCwgMHgwQzAsIDB4MDI3LCAweDBDRSwgMHgwRDIsIDB4MDI1LCAweDBEMywgMHgwMDAsCisJMHgwOUYsIDB4MDM4LCAweDBBNCwgMHgwNEIsIDB4MEE2LCAweDAwMSwgMHgwM0UsIDB4MDVFLAorCTB4MDkxLCAweDAyRSwgMHgwOTgsIDB4MDA0LCAweDBGOSwgMHgwMTUsIDB4MDIyLCAweDA1RCwKKwkweDAzMCwgMHgwMDksIDB4MEYzLCAweDBFOSwgMHgwMTIsIDB4MEU5LCAweDA4MCwgMHgwNEYsCisJMHgwOTAsIDB4MDUyLCAweDAyNSwgMHgwRDMsIDB4MDAwLCAweDA5RCwgMHgwQzUsIDB4MDQ4LAorCTB4MDI1LCAweDBEMywgMHgwMDAsIDB4MDlDLCAweDA0NSwgMHgwQ0UsIDB4MENELCAweDAwOSwKKwkweDBDOSwgMHgwQjIsIDB4MDFBLCAweDA0NCwgMHgwQkEsIDB4MDYwLCAweDAxMywgMHgwRTcsCisJMHgwMzQsIDB4MDg5LCAweDA3NCwgMHgwQzAsIDB4MDI3LCAweDAxQywgMHgwMjcsIDB4MEI3LAorCTB4MDlDLCAweDA4MCwgMHgwQzIsIDB4MEQ3LCAweDA3NiwgMHgwNTksIDB4MDlCLCAweDA5MywKKwkweDAwQywgMHgwNjQsIDB4MEMzLCAweDAxRCwgMHgwMUIsIDB4MEY0LCAweDA0NSwgMHgwNEIsCisJMHgwQzcsIDB4MEM2LCAweDAzQSwgMHgwMzcsIDB4MEU4LCAweDA4MSwgMHgwNEIsIDB4MEM3LAorCTB4MEM2LCAweDAzQSwgMHgwMzcsIDB4MEU4LCAweDA5MSwgMHgwNEIsIDB4MEM3LCAweDBDNiwKKwkweDAzMiwgMHgwNjEsIDB4MDhFLCAweDBCMywgMHgwQkMsIDB4MEMzLCAweDA0QSwgMHgwMjIsCisJMHgwRTYsIDB4MEI1LCAweDAyNCwgMHgwOTcsIDB4MDcxLCAweDBDOSwgMHgwODcsIDB4MEI0LAorCTB4MDMxLCAweDBBRSwgMHgwNzMsIDB4MEEyLCAweDBDRiwgMHgwMzksIDB4MEQyLCAweDA1RCwKKwkweDAwNCwgMHgwNDQsIDB4MDQyLCAweDBDMCwgMHgwRDYsIDB4MERFLCAweDA3MSwgMHgwMDYsCisJMHgwMTYsIDB4MEJCLCAweDBEQiwgMHgwQ0UsIDB4MDgzLCAweDAwQywgMHgwNjQsIDB4MEMzLAorCTB4MDFELCAweDAzMSwgMHgwMTMsIDB4MDA0LCAweDBGOSwgMHgwOTUsIDB4MDRELCAweDAxMywKKwkweDAzMiwgMHgwOTMsIDB4MDYzLCAweDA1RSwgMHgwNjYsIDB4MDE0LCAweDBDQywgMHgwMjksCisJMHgwMkEsIDB4MDUzLCAweDAzMCwgMHgwQTYsIDB4MDYxLCAweDA0QywgMHgwQzIsIDB4MDk5LAorCTB4MDg1LCAweDAzQSwgMHgwNzIsIDB4MENDLCAweDBDMiwgMHgwOTksIDB4MDg1LCAweDAwNiwKKwkweDAxQiwgMHgwQjMsIDB4MDBBLCAweDA2NiwgMHgwMTQsIDB4MDE0LCAweDAyNCwgMHgwOTksCisJMHgwODUsIDB4MDMzLCAweDAwQSwgMHgwMDgsIDB4MEIxLCAweDA4NiwgMHgwNjEsIDB4MDRDLAorCTB4MEMyLCAweDA4NCwgMHgwMjEsIDB4MDY4LCAweDA3MywgMHgwM0IsIDB4MDMwLCAweDBBNiwKKwkweDA2MSwgMHgwNDEsIDB4MDRFLCAweDBBNSwgMHgwOTgsIDB4MDUzLCAweDAzMCwgMHgwQUMsCisJMHgwNTksIDB4MDc2LCAweDA2MSwgMHgwNEMsIDB4MEMyLCAweDBCMCwgMHgwOEQsIDB4MEQ2LAorCTB4MDYxLCAweDA0QywgMHgwQzIsIDB4MEIwLCAweDAyQywgMHgwRjYsIDB4MDYxLCAweDA0QywKKwkweDBDMiwgMHgwQjEsIDB4MDhDLCAweDBBNSwgMHgwOTgsIDB4MDUzLCAweDAzMCwgMHgwQUMsCisJMHgwMEYsIDB4MDI0LCAweDBDQywgMHgwMjksIDB4MDk4LCAweDA1NiwgMHgwMEYsIDB4MDI4LAorCTB4MDY2LCAweDAxNSwgMHgwOTIsIDB4MDFBLCAweDAxOSwgMHgwODUsIDB4MDMzLCAweDAwQSwKKwkweDBDQSwgMHgwODUsIDB4MDBDLCAweDBDMiwgMHgwOTksIDB4MDg1LCAweDA2NSwgMHgwQzMsCisJMHgwRDksIDB4MDg1LCAweDAzMywgMHgwMEEsIDB4MENFLCAweDA3MCwgMHgwODYsIDB4MDYxLAorCTB4MDRDLCAweDBDMiwgMHgwQjMsIDB4MDk3LCAweDA3MSwgMHgwMEMsIDB4MDk5LCAweDAzQiwKKwkweDBDQywgMHgwODMsIDB4MDU4LCAweDAwQiwgMHgwRUEsIDB4MDc3LCAweDA5RCwgMHgwMDYsCisJMHgwNEEsIDB4MEJFLCAweDAwNCwgMHgwNzQsIDB4MDYwLCAweDBFMCwgMHgwRDEsIDB4MDRFLAorCTB4MDM4LCAweDA0QywgMHgwM0UsIDB4MEVFLCAweDAzRSwgMHgwRUUsIDB4MDNFLCAweDBFRSwKKwkweDAzRSwgMHgwRUUsIDB4MDMwLCAweDBCQiwgMHgwQ0EsIDB4MEUxLCAweDAxRiwgMHgwNzcsCisJMHgwMUYsIDB4MDc3LCAweDAxRiwgMHgwNzcsIDB4MDFGLCAweDA3NywgMHgwMjcsIDB4MDcwLAorCTB4MDhGLCAweDBCQiwgMHgwODAsIDB4MDBFLCAweDAxMSwgMHgwRjcsIDB4MDcxLCAweDBGNywKKwkweDA3QywgMHgwNkYsIDB4MDNDLCAweDBCMywgMHgwMzYsIDB4MDAyLCAweDBGQiwgMHgwOEQsCisJMHgwRTYsIDB4MDU1LCAweDA3MCwgMHgwN0YsIDB4MDJELCAweDAyNCwgMHgwNjksIDB4MDU1LAorCTB4MDRGLCAweDA1OCwgMHgwQTksIDB4MDIzLCAweDAxRiwgMHgwNTQsIDB4MEY3LCAweDA4QSwKKwkweDA5NSwgMHgwMjUsIDB4MDJCLCAweDA3NSwgMHgwMEMsIDB4MENDLCAweDBBQywgMHgwNTYsCisJMHgwNTEsIDB4MENDLCAweDA1MSwgMHgwRTQsIDB4MDQ1LCAweDBDRSwgMHgwQTIsIDB4MDEyLAorCTB4MDM5LCAweDBDMCwgMHgwQTAsIDB4MEFGLCAweDA1NiwgMHgwNkEsIDB4MDQ5LCAweDA3RiwKKwkweDAwMiwgMHgwOEMsIDB4MDA5LCAweDBGOCwgMHgwMEIsIDB4MEVCLCAweDBBRiwgMHgwNTYsCisJMHgwNzYsIDB4MDY3LCAweDA1MiwgMHgwQjIsIDB4MDhFLCAweDA2OSwgMHgwQTcsIDB4MDExLAorCTB4MDczLCAweDBBOCwgMHgwQjEsIDB4MEJDLCAweDBDQSwgMHgwQTAsIDB4MEE5LCAweDAzNiwKKwkweDA1MCwgMHgwMkMsIDB4MDk4LCAweDBFNywgMHgwMEEsIDB4MEY1LCAweDA2NiwgMHgwQTQsCisJMHgwOTcsIDB4MEUyLCAweDA1QSwgMHgwMzAsIDB4MDI3LCAweDBCQSwgMHgwRjcsIDB4MDgzLAorCTB4MDRFLCAweDBBNSwgMHgwMzMsIDB4MDBBLCAweDA2NiwgMHgwMTUsIDB4MDhELCAweDBFNiwKKwkweDA1NSwgMHgwMzksIDB4MEQyLCAweDBBNywgMHgwQUMsIDB4MDU0LCAweDA2MCwgMHgwMTYsCisJMHgwNzAsIDB4MDFCLCAweDA3MiwgMHgwOEUsIDB4MDYyLCAweDA4RiwgMHgwMjIsIDB4MDJFLAorCTB4MDc1LCAweDAxNiwgMHgwMDIsIDB4MEZCLCAweDA4RCwgMHgwRTYsIDB4MDBBLCAweDA5NSwKKwkweDAzRCwgMHgwNjIsIDB4MEEzLCAweDAwMCwgMHgwQjcsIDB4MDAxLCAweDBCNSwgMHgwNTMsCisJMHgwREUsIDB4MDJBLCAweDA1NCwgMHgwOTQsIDB4MEFELCAweDBENCwgMHgwMzMsIDB4MDMyLAorCTB4MEIxLCAweDA1OSwgMHgwNDcsIDB4MDMxLCAweDA0NywgMHgwOTEsIDB4MDE3LCAweDAzQSwKKwkweDA4OCwgMHgwNDgsIDB4MEU3LCAweDAwMiwgMHgwQjAsIDB4MDE3LCAweDBEQywgMHgwNjcsCisJMHgwOUQsIDB4MDRCLCAweDA4RCwgMHgwRTcsIDB4MDUyLCAweDBBQSwgMHgwN0IsIDB4MEQ0LAorCTB4MEFBLCAweDA5MiwgMHgwQkQsIDB4MEQ2LCAweDA5OSwgMHgwQkMsIDB4MDU2LCAweDAwMiwKKwkweDBGQiwgMHgwOEMsIDB4MEYzLCAweDA2NiwgMHgwNjYsIDB4MEM2LCAweDBGMywgMHgwNjYsCisJMHgwNjYsIDB4MDYyLCAweDA5OSwgMHgwMkEsIDB4MEY4LCAweDAxOCwgMHgwNjgsIDB4MDcwLAorCTB4MEIwLCAweDA4QSwgMHgwMEQsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1MiwKKwkweDAzMiwgMHgwRTEsIDB4MDQwLCAweDA1QywgMHgwMzgsIDB4MDBCLCAweDBFQSwgMHgwOUIsCisJMHgwODcsIDB4MDAxLCAweDA3RCwgMHgwQzAsIDB4MDVGLCAweDA3MCwgMHgwMTcsIDB4MERDLAorCTB4MDA1LCAweDBGNSwgMHgwREMsIDB4MDlCLCAweDAwMSwgMHgwN0QsIDB4MDYxLCAweDA0RCwKKwkweDA4MCwgMHgwQkUsIDB4MEE3LCAweDA3OSwgMHgwODIsIDB4MEEyLCAweDAxRiwgMHgwNTAsCisJMHgwMTUsIDB4MDJBLCAweDA4RiwgMHgwOEIsIDB4MDFDLCAweDBFNSwgMHgwQTUsIDB4MDEzLAorCTB4MDg0LCAweDA1OCwgMHgwRTcsIDB4MDAyLCAweDA5MSwgMHgwNTQsIDB4MDA1LCAweDAwMiwKKwkweDA0QiwgMHgwQkQsIDB4MDIyLCAweDAxQSwgMHgwOTQsIDB4MDdGLCAweDA5QywgMHgwMUEsCisJMHgwQzAsIDB4MDVGLCAweDA0MiwgMHgwMUEsIDB4MDIxLCAweDBEMSwgMHgwODAsIDB4MDU5LAorCTB4MEMwLCAweDA2RCwgMHgwMUMsIDB4MDJDLCAweDAwQSwgMHgwODMsIDB4MDU1LCAweDA1NSwKKwkweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsCisJMHgwNTUsIDB4MDU0LCAweDAxQywgMHgwQjgsIDB4MDVDLCAweDA2RSwgMHgwMTcsIDB4MDlDLAorCTB4MDJGLCAweDAzOCwgMHgwNUUsIDB4MDcwLCAweDBFNywgMHgwQjgsIDB4MDVFLCAweDA3MCwKKwkweDBCQywgMHgwRTEsIDB4MDc5LCAweDBDMiwgMHgwRjMsIDB4MDg1LCAweDBFNywgMHgwMEIsCisJMHgwQ0UsIDB4MDE3LCAweDA5QywgMHgwMjksIDB4MDlDLCAweDAyOSwgMHgwOUMsIDB4MDI5LAorCTB4MDlDLCAweDAyMywgMHgwMEYsIDB4MDU4LCAweDAxNCwgMHgwRUUsIDB4MDM1LCAweDA3NywKKwkweDAyNiwgMHgwMjEsIDB4MDkzLCAweDAwNSwgMHgwQzksIDB4MEIwLCAweDAxNywgMHgwRDIsCisJMHgwMUQsIDB4MDE4LCAweDA4QSwgMHgwMjEsIDB4MDkzLCAweDAwNSwgMHgwQzksIDB4MEIwLAorCTB4MDE3LCAweDBEMSwgMHgwODcsIDB4MEFDLCAweDAwQSwgMHgwNzQsIDB4MDBGLCAweDBBRSwKKwkweDBGNSwgMHgwNUEsIDB4MDgyLCAweDBBMywgMHgwRTQsIDB4MDNBLCAweDAzMSwgMHgwMTQsCisJMHgwQkIsIDB4MEQ3LCAweDA1OSwgMHgwOTksIDB4MDc0LCAweDBBMiwgMHgwMTksIDB4MDMwLAorCTB4MDVDLCAweDA5QiwgMHgwMDEsIDB4MDdELCAweDAxOCwgMHgwN0EsIDB4MEMwLCAweDBBNywKKwkweDA0MCwgMHgwRjgsIDB4MDQzLCAweDBENCwgMHgwNjMsIDB4MDg5LCAweDAyNSwgMHgwRDAsCisJMHgwMTAsIDB4MEQ2LCAweDAxQywgMHgwNkEsIDB4MDEwLCAweDBGNSwgMHgwNTUsIDB4MDg5LAorCTB4MDI1LCAweDBEMSwgMHgwNTEsIDB4MDY2LCAweDAxRiwgMHgwNTEsIDB4MEY1LCAweDA5MSwKKwkweDA0OSwgMHgwMkUsIDB4MDg5LCAweDAxNSwgMHgwOTgsIDB4MDZBLCAweDBBMywgMHgwRTAsCisJMHgwOEEsIDB4MDk0LCAweDA2NSwgMHgwNjQsIDB4MDBFLCAweDAxMywgMHgwMTcsIDB4MDM4LAorCTB4MEE4LCAweDA4NiwgMHgwNEMsIDB4MDE3LCAweDAyNiwgMHgwQzAsIDB4MDVGLCAweDA0NiwKKwkweDAxRSwgMHgwQjAsIDB4MDI4LCAweDA2MywgMHgwMUYsIDB4MDA4LCAweDA3QSwgMHgwOEMsCisJMHgwNzEsIDB4MDI0LCAweDBCQSwgMHgwMDIsIDB4MDFBLCAweDBEMCwgMHgwMEQsIDB4MDQyLAorCTB4MDFFLCAweDBBQSwgMHgwQjEsIDB4MDI0LCAweDBCQSwgMHgwMkEsIDB4MDJELCAweDAzMSwKKwkweDBGNSwgMHgwMUYsIDB4MDU4LCAweDA3NCwgMHgwOTIsIDB4MEU4LCAweDA4NywgMHgwNUEsCisJMHgwNjMsIDB4MDUyLCAweDBERSwgMHgwRjQsIDB4MDUxLCAweDA2OSwgMHgwNEEsIDB4MDNFLAorCTB4MDA5LCAweDA2OSwgMHgwNDYsIDB4MDUwLCAweDBGMCwgMHgwRTEsIDB4MDMxLCAweDA3MywKKwkweDAwNSwgMHgwNDUsIDB4MEJELCAweDA1OSwgMHgwOEQsIDB4MDhCLCAweDA0QSwgMHgwN0MsCisJMHgwRDMsIDB4MEVELCAweDAzOCwgMHgwRTksIDB4MEQzLCAweDA0RSwgMHgwNzQsIDB4MEVELAorCTB4MDQ0LCAweDAzMiwgMHgwNjAsIDB4MEI5LCAweDAzNiwgMHgwMDIsIDB4MEZBLCAweDA1QiwKKwkweDBERSwgMHgwOEEsIDB4MDJELCAweDAyOSwgMHgwRDAsIDB4MEUxLCAweDAyMSwgMHgwRjUsCisJMHgwQTMsIDB4MDkyLCAweDAyMSwgMHgwRjIsIDB4MDE5LCAweDAzMCwgMHgwNUMsIDB4MDlCLAorCTB4MDAxLCAweDA3RCwgMHgwMjEsIDB4MEY1LCAweDBBMCwgMHgwQzYsIDB4MDAxLCAweDA2NywKKwkweDAwMSwgMHgwQjQsIDB4MDQ1LCAweDBDRSwgMHgwQTUsIDB4MDEyLCAweDAzOSwgMHgwRDQsCisJMHgwMUMsIDB4MDA1LCAweDBGNCwgMHgwNDAsIDB4MEExLCAweDBDMiwgMHgwQzMsIDB4MDUwLAorCTB4MDZBLCAweDBBQSwgMHgwQUEsIDB4MEFBLCAweDBBQSwgMHgwQUEsIDB4MEFBLCAweDBBQSwKKwkweDBBQSwgMHgwQUEsIDB4MEFBLCAweDBBQSwgMHgwQUEsIDB4MEFBLCAweDA4MSwgMHgwQUYsCisJMHgwODYsIDB4MDlGLCAweDAxOSwgMHgwMUIsIDB4MEU3LCAweDA4MSwgMHgwRjMsIDB4MDY1LAorCTB4MEYyLCAweDA4MCwgMHgwQkUsIDB4MDcwLCAweDAxNywgMHgwREYsIDB4MERGLCAweDAzOCwKKwkweDAwQiwgMHgwRUIsIDB4MDBELCAweDBDMywgMHgwODAsIDB4MEJFLCAweDBBNywgMHgwMEYsCisJMHgwOTUsIDB4MDRGLCAweDA1QSwgMHgwOTQsIDB4MEMwLCAweDAyQywgMHgwRDgsIDB4MEIxLAorCTB4MEE3LCAweDBDRSwgMHgwNUEsIDB4MDExLCAweDA3MywgMHgwQTgsIDB4MDNBLCAweDBDMiwKKwkweDBDQywgMHgwQjYsIDB4MDMwLCAweDAxNywgMHgwREMsIDB4MDZGLCAweDAzNSwgMHgwQTksCisJMHgwODAsIDB4MDRELCAweDBBNywgMHgwQ0UsIDB4MDJBLCAweDAxOCwgMHgwNzksIDB4MEM1LAorCTB4MDQ5LCAweDBERSwgMHgwNjEsIDB4MEE4LCAweDAyMiwgMHgwRTcsIDB4MDUwLCAweDAzMywKKwkweDBGOSwgMHgwOTgsIDB4MDY0LCAweDAwOCwgMHgwQjksIDB4MDk1LCAweDA0MiwgMHgwRkMsCisJMHgwQ0MsIDB4MEQ5LCAweDA5NSwgMHgwM0QsIDB4MDYyLCAweDBBMiwgMHgwNDgsIDB4MEQ0LAorCTB4MDQ4LCAweDBFNywgMHgwMDIsIDB4MDg4LCAweDBCOSwgMHgwQzEsIDB4MEEwLCAweDBFMywKKwkweDA5RCwgMHgwNEUsIDB4MDYyLCAweDBFNiwgMHgwQ0MsIDB4MEM2LCAweDA2QiwgMHgwQ0UsCisJMHgwODMsIDB4MDEwLCAweDBDOSwgMHgwODIsIDB4MEU0LCAweDBEQSwgMHgwQzIsIDB4MEM4LAorCTB4MDFFLCAweDBDMywgMHgwQjksIDB4MDM2LCAweDAwMiwgMHgwRkEsIDB4MEE5LCAweDBFQiwKKwkweDA0RSwgMHgwMzAsIDB4MDMwLCAweDBGQSwgMHgwMEQsIDB4MEYwLCAweDBBOSwgMHgwRUIsCisJMHgwNDAsIDB4MEI5LCAweDAwRiwgMHgwQUEsIDB4MDdBLCAweDBEMiwgMHgwQzIsIDB4MEM4LAorCTB4MEZBLCAweDBBNywgMHgwQUQsIDB4MDQxLCAweDAwQSwgMHgwNDcsIDB4MEQ1LCAweDAzRCwKKwkweDA2OCwgMHgwQUMsIDB4MEYxLCAweDBGNSwgMHgwNEYsIDB4MDVBLCAweDA5NywgMHgwNTQsCisJMHgwN0QsIDB4MDRGLCAweDBBOCwgMHgwQUEsIDB4MDU1LCAweDAxRiwgMHgwMTEsIDB4MDczLAorCTB4MDVBLCAweDBCMCwgMHgwMTcsIDB4MERFLCAweDA1RCwgMHgwNTksIDB4MEE5LCAweDAyNSwKKwkweDBEMCwgMHgwNTUsIDB4MDJBLCAweDA0NiwgMHgwQkMsIDB4MEI4LCAweDAyMiwgMHgwQUUsCisJMHgwNDUsIDB4MDI5LCAweDAzRSwgMHgwMTQsIDB4MEZBLCAweDBFMSwgMHgwOTksIDB4MDk0LAorCTB4MENBLCAweDA0QSwgMHgwQkUsIDB4MDNELCAweDBENiwgMHgwOTksIDB4MDkyLCAweDA1RCwKKwkweDAxNSwgMHgwMTcsIDB4MEM4LCAweDBENywgMHgwREMsIDB4MDE1LCAweDAxNywgMHgwOEEsCisJMHgwNDAsIDB4MDFGLCAweDAwQSwgMHgwOUUsIDB4MEFDLCAweDBDOSwgMHgwNjUsIDB4MDQ5LAorCTB4MDVDLCAweDAxRCwgMHgwMTAsIDB4MDY4LCAweDA0QSwgMHgwM0UsIDB4MDVCLCAweDBERSwKKwkweDA4MywgMHgwMTYsIDB4MDk1LCAweDA4MCwgMHgwQkUsIDB4MDkxLCAweDA3NCwgMHgwNTgsCisJMHgwQTQsIDB4MDAwLCAweDA3QywgMHgwMzgsIDB4MEU3LCAweDA1NiwgMHgwMzAsIDB4MDE3LAorCTB4MERGLCAweDA3NSwgMHgwQTYsIDB4MDY0LCAweDA5NywgMHgwNDUsIDB4MDIwLCAweDA5RCwKKwkweDAwMywgMHgwNUYsIDB4MDcwLCAweDA1NCwgMHgwNUUsIDB4MDI5LCAweDAxRCwgMHgwRjAsCisJMHgwQTksIDB4MEVBLCAweDBDQywgMHgwODYsIDB4MDU0LCAweDA5NSwgMHgwQzEsIDB4MEQxLAorCTB4MDA2LCAweDA4MywgMHgwMEYsIDB4MEFBLCAweDA3QiwgMHgwRDAsIDB4MDY1LCAweDA0OSwKKwkweDA0NSwgMHgwQkQsIDB4MEU5LCAweDA2MiwgMHgwRDIsIDB4MDkxLCAweDBERiwgMHgwMDQsCisJMHgwNUQsIDB4MDE2LCAweDAyOSwgMHgwMUMsIDB4MDdELCAweDA0RiwgMHgwQUMsIDB4MDFBLAorCTB4MDQ3LCAweDAxQSwgMHgwQTksIDB4MEY1LCAweDA2NywgMHgwNjYsIDB4MDUzLCAweDAyOCwKKwkweDBCNywgMHgwQkQsIDB4MDJDLCAweDA1QSwgMHgwNTIsIDB4MDNCLCAweDBFMywgMHgwREQsCisJMHgwNTksIDB4MEE5LCAweDAyNSwgMHgwRDEsIDB4MEE4LCAweDBBQywgMHgwMDgsIDB4MDZCLAorCTB4MEVFLCAweDAwOCwgMHgwQUIsIDB4MEM1LCAweDAyMCwgMHgwMkYsIDB4MDg1LCAweDA0RiwKKwkweDA1NiwgMHgwNjYsIDB4MDc1LCAweDA0OSwgMHgwNUMsIDB4MDFDLCAweDAxOCwgMHgwMUQsCisJMHgwODEsIDB4MEMyLCAweDA2NCwgMHgwMDUsIDB4MEYwLCAweDA4MCwgMHgwQkUsIDB4MDM1LAorCTB4MDVDLCAweDBEMCwgMHgwMTcsIDB4MEMyLCAweDA1NSwgMHgwRjAsIDB4MDk1LCAweDA3QywKKwkweDAyNSwgMHgwNUYsIDB4MDA4LCAweDAwQiwgMHgwRTEsIDB4MDAxLCAweDA3QywgMHgwN0IsCisJMHgwQUIsIDB4MDM1LCAweDAyNCwgMHgwQkEsIDB4MDEwLCAweDA1NSwgMHgwOTMsIDB4MDFBLAorCTB4MEZCLCAweDA4MiwgMHgwMkEsIDB4MEYxLCAweDA0OCwgMHgwRDcsIDB4MEMyLCAweDBBNywKKwkweDBBQiwgMHgwMzEsIDB4MEIyLCAweDBBNCwgMHgwQUMsIDB4MDYzLCAweDA5RCwgMHgwNEEsCisJMHgwOEQsIDB4MDdDLCAweDA3QiwgMHgwQUIsIDB4MDM1LCAweDAyNCwgMHgwQkEsIDB4MDEwLAorCTB4MDU0LCAweDAzMCwgMHgwOEQsIDB4MDdELCAweDBDMSwgMHgwMTUsIDB4MDc4LCAweDBBQywKKwkweDA2RiwgMHgwNUEsIDB4MDk0LCAweDA2MCwgMHgwMUEsIDB4MEUzLCAweDA3OSwgMHgwRDQsCisJMHgwQUEsIDB4MDRGLCAweDA4NSwgMHgwNEYsIDB4MDU2LCAweDA2NiwgMHgwRDUsIDB4MDQ5LAorCTB4MDU4LCAweDBDNywgMHgwM0EsIDB4MDk1LCAweDA0OSwgMHgwRjAsIDB4MDQ1LCAweDBEMSwKKwkweDA2MiwgMHgwOTQsIDB4MDg2LCAweDBCQywgMHgwMUQsIDB4MDEzLCAweDBEMiwgMHgwOTAsCisJMHgwRkYsIDB4MENGLCAweDA3QSwgMHgwODMsIDB4MEYyLCAweDA1MCwgMHgwMzEsIDB4MERFLAorCTB4MDAwLCAweDA2MCwgMHgwNjAsIDB4MEExLCAweDAxNywgMHgwMzUsIDB4MEE4LCAweDA1RiwKKwkweDA5QiwgMHgwMUIsIDB4MDM3LCAweDAwNywgMHgwNDQsIDB4MDFBLCAweDAzMCwgMHgwMEIsCisJMHgwMzgsIDB4MDBELCAweDBCQywgMHgwMUMsIDB4MEUwLCAweDBEMCwgMHgwNDcsIDB4MENFLAorCTB4MEEwLCAweDBBQSwgMHgwN0EsIDB4MEExLCAweDA5OCwgMHgwNkEsIDB4MDkyLCAweDA5NSwKKwkweDAzRCwgMHgwNjgsIDB4MDMxLCAweDA4MCwgMHgwNUIsIDB4MDgwLCAweDBEQSwgMHgwQTksCisJMHgwRUYsIDB4MDQxLCAweDA5NSwgMHgwMjUsIDB4MDE2LCAweDBGNywgMHgwQTUsIDB4MDhCLAorCTB4MDRBLCAweDBDNiwgMHgwNzksIDB4MEIzLCAweDAzMywgMHgwNjAsIDB4MDJGLCAweDBBQSwKKwkweDA5RSwgMHgwQjEsIDB4MDUxLCAweDA4MCwgMHgwNTksIDB4MDlFLCAweDBDQSwgMHgwQTcsCisJMHgwQUMsIDB4MDBBLCAweDAzMCwgMHgwMEIsIDB4MDY3LCAweDBCMiwgMHgwQUQsIDB4MEQ1LAorCTB4MERBLCAweDA5MiwgMHgwNUQsIDB4MDE3LCAweDBBMywgMHgwMDAsIDB4MEIzLCAweDAyRCwKKwkweDA5NSwgMHgwNkUsIDB4MDA4LCAweDBBOSwgMHgwNTgsIDB4MEExLCAweDAxNywgMHgwM0EsCisJMHgwOEIsIDB4MDAxLCAweDA3RCwgMHgwNTQsIDB4MEY3LCAweDA4RSwgMHgwOTUsIDB4MDI1LAorCTB4MDA4LCAweDAxQywgMHgwRTAsIDB4MDU2LCAweDAwMiwgMHgwRkIsIDB4MEMxLCAweDBEMSwKKwkweDAxNSwgMHgwMTgsIDB4MDA1LCAweDA5MiwgMHgwNkIsIDB4MDNDLCAweDAxRCwgMHgwMTIsCisJMHgwMjgsIDB4MEMwLCAweDAyQywgMHgwQTUsIDB4MDZDLCAweDAxMSwgMHgwNzAsIDB4MDE3LAorCTB4MEIyLCAweDAzOCwgMHgwNEQsIDB4MDgwLCAweDBCRSwgMHgwRTAsIDB4MDJGLCAweDBCNCwKKwkweDBFQywgMHgwNEEsIDB4MEVELCAweDBCMywgMHgwOUUsIDB4MDAyLCAweDBGQiwgMHgwODAsCisJMHgwQkUsIDB4MEUwLCAweDAyRiwgMHgwQjEsIDB4MDM5LCAweDA5MywgMHgwM0UsIDB4MDZELAorCTB4MEU3LCAweDAxMCwgMHgwNjAsIDB4MDlGLCAweDAzMiwgMHgwQTksIDB4MEEyLCAweDA2QywKKwkweDAwNSwgMHgwRjQsIDB4MDQwLCAweDBFNiwgMHgwMEEsIDB4MDk1LCAweDAzRCwgMHgwNkEsCisJMHgwMjMsIDB4MDAwLCAweDBCMywgMHgwODAsIDB4MERBLCAweDBBNywgMHgwRDYsIDB4MDJBLAorCTB4MDAzLCAweDAwRCwgMHgwNzAsIDB4MDE3LCAweDBEMiwgMHgwMkUsIDB4MDc2LCAweDAyOSwKKwkweDA0RiwgMHgwQkMsIDB4MDU0LCAweDBBNiwgMHgwNTEsIDB4MDZGLCAweDA3QSwgMHgwNTgsCisJMHgwQjQsIDB4MEFDLCAweDAwNSwgMHgwRjQsIDB4MDhCLCAweDBBMiwgMHgwRjQsIDB4MDBFLAorCTB4MDM1LCAweDAwRCwgMHgwNDksIDB4MDJFLCAweDBCNCwgMHgwQ0MsIDB4MDE4LCAweDBBNSwKKwkweDBDOCwgMHgwRjgsIDB4MDRBLCAweDA5NywgMHgwMjMsIDB4MEUxLCAweDAwNSwgMHgwMkUsCisJMHgwNDcsIDB4MEMyLCAweDA4QSwgMHgwNUMsIDB4MDhGLCAweDA4NSwgMHgwNjksIDB4MDcyLAorCTB4MDNFLCAweDAxRiwgMHgwNEEsIDB4MEMzLCAweDA1NSwgMHgwMUYsIDB4MDU2LCAweDA0MywKKwkweDAzMiwgMHgwOEMsIDB4MEEzLCAweDA1RSwgMHgwNjAsIDB4MEE4LCAweDA0NSwgMHgwQ0UsCisJMHgwMEQsIDB4MDYwLCAweDAyRiwgMHgwQTMsIDB4MDg0LCAweDA5RCwgMHgwRDgsIDB4MEYwLAorCTB4MDE3LCAweDBEMiwgMHgwMkUsIDB4MDBFLCAweDAxQiwgMHgwMjMsIDB4MDg0LCAweDBEOCwKKwkweDAwQiwgMHgwRUIsIDB4MDg5LCAweDBGMywgMHgwODAsIDB4MEJFLCAweDBFMCwgMHgwMkYsCisJMHgwQkIsIDB4MDM5LCAweDA4NSwgMHgwREYsIDB4MDIyLCAweDAwMywgMHgwRTcsIDB4MDAxLAorCTB4MDdELCAweDBDMCwgMHgwNUYsIDB4MDcwLCAweDAxNywgMHgwRDEsIDB4MDE3LCAweDAzOCwKKwkweDAxNCwgMHgwNUIsIDB4MEQ2LCAweDBBMiwgMHgwNzQsIDB4MDBELCAweDA0QiwgMHgwN0EsCisJMHgwQjMsIDB4MDMxLCAweDA5NiwgMHgwOTQsIDB4MDZCLCAweDBDQywgMHgwMzUsIDB4MDIzLAorCTB4MEQ3LCAweDA0OSwgMHgwNDgsIDB4MDE1LCAweDA3MywgMHgwMjksIDB4MDBGLCAweDA1RCwKKwkweDA4QSwgMHgwQzAsIDB4MDVGLCAweDA0RCwgMHgwNzksIDB4MDg0LCAweDAzNSwgMHgwODAsCisJMHgwQkUsIDB4MDg4LCAweDAxQywgMHgwQzMsIDB4MDUyLCAweDA5RiwgMHgwNTksIDB4MDY4LAorCTB4MEMwLCAweDAyQywgMHgwRTAsIDB4MDM2LCAweDBBQSwgMHgwN0IsIDB4MENELCAweDA0QSwKKwkweDA5MiwgMHgwQkUsIDB4MEYzLCAweDA4MSwgMHgwNEEsIDB4MDdELCAweDA1QiwgMHgwNTksCisJMHgwOTQsIDB4MENBLCAweDAxQywgMHgwMjQsIDB4MEVFLCAweDBDNywgMHgwODAsIDB4MEJFLAorCTB4MDg4LCAweDAxQywgMHgwQzMsIDB4MDUyLCAweDA5RiwgMHgwNTksIDB4MDY4LCAweDBDMCwKKwkweDAyQywgMHgwRTAsIDB4MDM2LCAweDBBQSwgMHgwN0IsIDB4MENELCAweDA0QSwgMHgwOTIsCisJMHgwQkUsIDB4MEYzLCAweDA4MSwgMHgwNDMsIDB4MDg0LCAweDA5QywgMHgwN0IsIDB4MDM4LAorCTB4MDBCLCAweDBFQiwgMHgwQUYsIDB4MDcwLCAweDBENCwgMHgwRUEsIDB4MDUzLCAweDAwMCwKKwkweDA5QiwgMHgwNEYsIDB4MDlDLCAweDA1NCwgMHgwMzAsIDB4MEYzLCAweDA4QSwgMHgwOTQsCisJMHgwRkEsIDB4MEI2LCAweDBCMywgMHgwMjksIDB4MDk0LCAweDAyMiwgMHgwRTYsIDB4MDFBLAorCTB4MDg1LCAweDBGOSwgMHgwQjAsIDB4MDU5LCAweDA5MywgMHgwRjksIDB4MEQyLCAweDBDNCwKKwkweDAzMiwgMHgwNjAsIDB4MEI5LCAweDAzNiwgMHgwQjAsIDB4MEIzLCAweDA5MCwgMHgwRDksCisJMHgwNzcsIDB4MDI2LCAweDAxQywgMHgwMjcsIDB4MDIyLCAweDBFOCwgMHgwOTYsIDB4MEI0LAorCTB4MDIzLCAweDBFQSwgMHgwOUUsIDB4MEI1LCAweDAxMSwgMHgwODAsIDB4MDU5LCAweDA2NSwKKwkweDA4NiwgMHgwMjAsIDB4MDczLCAweDA5NiwgMHgwOEQsIDB4MDc5LCAweDBBRCwgMHgwNTgsCisJMHgwMEIsIDB4MEU5LCAweDAxNywgMHgwNDQsIDB4MDhBLCAweDA0QSwgMHgwMDcsIDB4MEQ3LAorCTB4MDdBLCAweDA4MiwgMHgwQTEsIDB4MDkwLCAweDBGQSwgMHgwRUYsIDB4MDAxLCAweDA1NCwKKwkweDBCQSwgMHgwNTAsIDB4MEQ0LCAweDA1OSwgMHgwMUUsIDB4MDJDLCAweDBFOSwgMHgwRjMsCisJMHgwOEEsIDB4MDk5LCAweDA4NSwgMHgwNkIsIDB4MDBCLCAweDAyMywgMHgwMTUsIDB4MDk3LAorCTB4MDcyLCAweDA2MSwgMHgwMTcsIDB4MDMwLCAweDBENCwgMHgwMkMsIDB4MDczLCAweDA4NywKKwkweDA0OCwgMHgwQUEsIDB4MDAyLCAweDA4MSwgMHgwMjUsIDB4MERFLCAweDA5MSwgMHgwMEQsCisJMHgwNEEsIDB4MEMwLCAweDA1RiwgMHgwN0UsIDB4MEQyLCAweDA4MCwgMHgwQTUsIDB4MDNFLAorCTB4MEIyLCAweDBEMCwgMHgwQzgsIDB4MDZCLCAweDA4MCwgMHgwQkUsIDB4MDg4LCAweDAxQywKKwkweDBFQSwgMHgwMDksIDB4MDE3LCAweDA0NCwgMHgwMUEsIDB4MDM3LCAweDAxQSwgMHgwOTEsCisJMHgwNzQsIDB4MDU4LCAweDBBMywgMHgwNzEsIDB4MEFGLCAweDAwNywgMHgwNDQsIDB4MDU0LAorCTB4MDZFLCAweDAzNSwgMHgwRTAsIDB4MEU4LCAweDBBQSwgMHgwNjQsIDB4MDBGLCAweDA5MCwKKwkweDBGQSwgMHgwRDAsIDB4MDYzLCAweDAwMCwgMHgwQjMsIDB4MDgwLCAweDBEQSwgMHgwMkMsCisJMHgwNzMsIDB4MDg3LCAweDA0OCwgMHgwQUEsIDB4MDAyLCAweDA4MSwgMHgwMjUsIDB4MERFLAorCTB4MDkxLCAweDAwRCwgMHgwNEEsIDB4MEMwLCAweDA1RiwgMHgwNDgsIDB4MEJBLCAweDAyNywKKwkweDBBMywgMHgwMDAsIDB4MEI3LCAweDAwMSwgMHgwQjcsIDB4MDRGLCAweDA5QywgMHgwQjQsCisJMHgwNkIsIDB4MENDLCAweDAzNSwgMHgwMTYsIDB4MEY1LCAweDA2NiwgMHgwNjMsIDB4MDJELAorCTB4MDI5LCAweDAxRSwgMHgwQkEsIDB4MDRBLCAweDA0MCwgMHgwQUIsIDB4MDk5LCAweDA0OCwKKwkweDA3QSwgMHgwRUMsIDB4MDUwLCAweDA4QiwgMHgwOUMsIDB4MDA4LCAweDAyMiwgMHgwRkMsCisJMHgwRjksIDB4MEIyLCAweDA1NSwgMHgwM0QsIDB4MDYyLCAweDBBOSwgMHgwMjMsIDB4MDUxLAorCTB4MDIzLCAweDA5QywgMHgwMEEsIDB4MDNDLCAweDA3MywgMHgwMEQsIDB4MDQ0LCAweDA1QywKKwkweDBFMSwgMHgwNTAsIDB4MDcxLCAweDBDRSwgMHgwQTEsIDB4MDFGLCAweDBFNywgMHgwMTUsCisJMHgwNkIsIDB4MDBCLCAweDAyNSwgMHgwRUQsIDB4MDBCLCAweDA5MywgMHgwNjAsIDB4MDJGLAorCTB4MEFBLCAweDA5RSwgMHgwQUMsIDB4MDM2LCAweDA2NSwgMHgwNDksIDB4MDVGLCAweDA3QSwKKwkweDAyMCwgMHgwNTAsIDB4MDA4LCAweDA3RiwgMHgwRUYsIDB4MDM5LCAweDAxNCwgMHgwNDksCisJMHgwMDEsIDB4MDExLCAweDA4MSwgMHgwMDQsIDB4MDYwLCAweDA0MCwgMHgwQ0MsIDB4MDU5LAorCTB4MEMwLCAweDBBRCwgMHgwMjMsIDB4MEVCLCAweDA0MSwgMHgwQjAsIDB4MDgxLCAweDBGMiwKKwkweDAzQSwgMHgwNDEsIDB4MEFBLCAweDA1MCwgMHgwNDMsIDB4MEU0LCAweDBENCwgMHgwODYsCisJMHgwNTQsIDB4MEEwLCAweDA4NywgMHgwQzEsIDB4MDUyLCAweDBDQSwgMHgwOTMsIDB4MDAxLAorCTB4MDMyLCAweDA1NCwgMHgwOUQsIDB4MDI0LCAweDAwMiwgMHgwMDAsIDB4MDAwLCAweDA1MiwKKwkweDBBRiwgMHgwMTYsIDB4MDQ2LCAweDBBNywgMHgwOTEsIDB4MDY3LCAweDAwOCwgMHgwQjQsCisJMHgwMDQsIDB4MDUxLCAweDBGMSwgMHgwNjUsIDB4MDE5LCAweDBCNCwgMHgwNkUsIDB4MDJELAorCTB4MEMwLCAweDBBRCwgMHgwNDksIDB4MDAwLCAweDA5MiwgMHgwNTcsIDB4MDFCLCAweDA3NCwKKwkweDA0NSwgMHgwNUYsIDB4MDIzLCAweDA1MSwgMHgwQjcsIDB4MDQ0LCAweDAwQSwgMHgwMTAsCisJMHgwMDYsIDB4MEEzLCAweDA2RSwgMHgwOEIsIDB4MDZCLCAweDAwOCwgMHgwMUYsIDB4MDE5LAorCTB4MEQxLCAweDBFNiwgMHgwODAsIDB4MDgyLCAweDA4MCwgMHgwNTQsIDB4MDA0LCAweDAyQSwKKwkweDA0NSwgMHgwOTEsIDB4MEE5LCAweDBFNCwgMHgwNTksIDB4MEMyLCAweDAyRCwgMHgwMDEsCisJMHgwMTQsIDB4MDA0LCAweDA1MCwgMHgwRDMsIDB4MEZDLCAweDA1NSwgMHgwODQsIDB4MDYxLAorCTB4MEQ5LCAweDA4MCwgMHgwNTEsIDB4MDJGLCAweDBFMiwgMHgwMUYsIDB4MDQ2LCAweDA1RiwKKwkweDA0MCwgMHgwRTAsIDB4MDIwLCAweDAxNSwgMHgwNEEsIDB4MEJDLCAweDA1OSwgMHgwMUEsCisJMHgwOUUsIDB4MDQ1LCAweDA5QywgMHgwMjIsIDB4MEQwLCAweDAxMSwgMHgwNDgsIDB4MENCLAorCTB4MEU4LCAweDAxNCwgMHgwMDgsIDB4MDAxLCAweDA1NCwgMHgwMTUsIDB4MEUyLCAweDBDOCwKKwkweDBENCwgMHgwRjIsIDB4MDJDLCAweDBFMSwgMHgwMTYsIDB4MDgwLCAweDA4QSwgMHgwNDYsCisJMHgwNUYsIDB4MDUyLCAweDA3QywgMHgwRDksIDB4MEE4LCAweDBGOCwgMHgwODgsIDB4MEQwLAorCTB4MDVBLCAweDAzQywgMHgwRDIsIDB4MDVDLCAweDA1QiwgMHgwODAsIDB4MERBLCAweDBBNywKKwkweDBENiwgMHgwNUEsIDB4MDA4LCAweDA4NiwgMHgwQTQsIDB4MDVELCAweDAxNywgMHgwQTAsCisJMHgwQzMsIDB4MDUyLCAweDAyRSwgMHgwODgsIDB4MEE4LCAweDAyMiwgMHgwMUYsIDB4MDUzLAorCTB4MEVBLCAweDBEQSwgMHgwQ0MsIDB4MEE2LCAweDA1MCwgMHgwRTEsIDB4MDI3LCAweDA3NiwKKwkweDAzQywgMHgwMDUsIDB4MEY1LCAweDA0RiwgMHgwQUIsIDB4MDZCLCAweDAzMiwgMHgwOTksCisJMHgwNDMsIDB4MDg0LCAweDA5QywgMHgwN0IsIDB4MDM4LCAweDAwQiwgMHgwRTksIDB4MDI3LAorCTB4MEFDLCAweDBENCwgMHgwOTIsIDB4MEUwLCAweDAwRSwgMHgwREEsIDB4MDM4LCAweDA0RCwKKwkweDA4MCwgMHgwQkUsIDB4MEU2LCAweDA3RCwgMHgwNTAsIDB4MEJBLCAweDA1MSwgMHgwQUUsCisJMHgwNjYsIDB4MEVGLCAweDBCQywgMHgwREMsIDB4MDdCLCAweDA4NywgMHgwMUUsIDB4MDAyLAorCTB4MEZBLCAweDA5MywgMHgwRTYsIDB4MENELCAweDA0NywgMHgwQzQsIDB4MDQzLCAweDBDRCwKKwkweDAwRiwgMHgwMzQsIDB4MDlELCAweDBBMywgMHgwMDAsIDB4MEIwLCAweDA1NSwgMHgwMDEsCisJMHgwQUUsIDB4MDAzLCAweDA4NCwgMHgwMDQsIDB4MENFLCAweDAwMSwgMHgwRDAsIDB4MEUxLAorCTB4MDcwLCAweDAwMiwgMHgwODAsIDB4MDBFLCAweDA4OSwgMHgwRTksIDB4MDIyLCAweDAxRiwKKwkweDBFMCwgMHgwRTgsIDB4MDk2LCAweDBCMCwgMHgwMTEsIDB4MEY0LCAweDBDMiwgMHgwQ0UsCisJMHgwMDMsIDB4MDZBLCAweDA0NCwgMHgwMkQsIDB4MEMwLCAweDA2RCwgMHgwNDgsIDB4MDA1LAorCTB4MEI4LCAweDAwRCwgMHgwQTMsIDB4MDAwLCAweDBCNywgMHgwNzYsIDB4MEQ1LCAweDBERSwKKwkweDBCMSwgMHgwNTAsIDB4MERDLCAweDA3RCwgMHgwNzcsIDB4MEJDLCAweDA1NCwgMHgwQkEsCisJMHgwNTIsIDB4MDdGLCAweDA1OCwgMHgwMTQsIDB4MDM0LCAweDAwRiwgMHgwOUEsIDB4MEYzLAorCTB4MDgxLCAweDA1OCwgMHgwMEIsIDB4MEVBLCAweDBFRiwgMHgwNTgsIDB4MDE0LCAweDA2MCwKKwkweDAxNiwgMHgwQTUsIDB4MDZDLCAweDAyRSwgMHgwRjcsIDB4MDgxLCAweDA0QiwgMHgwQTUsCisJMHgwNkYsIDB4MDdELCAweDA1RCwgMHgwRUUsIDB4MEI1LCAweDAyRSwgMHgwOTUsIDB4MDgwLAorCTB4MEJFLCAweDBGMCwgMHgwNzMsIDB4MEJELCAweDAwNCwgMHgwN0MsIDB4MEVBLCAweDBGRSwKKwkweDBFQiwgMHgwNEMsIDB4MERFLCAweDAyOSwgMHgwNTMsIDB4MERELCAweDA2QSwgMHgwNTQsCisJMHgwOTQsIDB4MEE5LCAweDBFQSwgMHgwMEEsIDB4MDhDLCAweDAwMiwgMHgwRDYsIDB4MDRDLAorCTB4MDNDLCAweDAwNSwgMHgwRjQsIDB4MDAwLCAweDBFQSwgMHgwQ0QsIDB4MDU2LCAweDBBRiwKKwkweDBDMCwgMHgwNDcsIDB4MEQyLCAweDA5QywgMHgwOEQsIDB4MDI5LCAweDBDQSwgMHgwRTAsCisJMHgwMkYsIDB4MEFFLCAweDBCRCwgMHgwNzUsIDB4MDk5LCAweDA5RCwgMHgwNEEsIDB4MEY5LAorCTB4MEVGLCAweDA1MSwgMHgwN0MsIDB4MDk0LCAweDAwQywgMHgwNzcsIDB4MDgwLCAweDAxOCwKKwkweDAxOCwgMHgwMjksIDB4MDJBLCAweDBGOCwgMHgwRTAsIDB4MEU4LCAweDBBQSwgMHgwMzAsCisJMHgwMEIsIDB4MDJBLCAweDA5OCwgMHgwN0MsIDB4MDFELCAweDAxMSwgMHgwNTEsIDB4MDgwLAorCTB4MDU5LCAweDA1NCwgMHgwQzMsIDB4MDUxLCAweDBGNSwgMHgwMUIsIDB4MDMzLCAweDAyNCwKKwkweDBCQiwgMHgwODIsIDB4MEE1LCAweDAxOSwgMHgwNUMsIDB4MDFELCAweDAxMCwgMHgwMjgsCisJMHgwQzAsIDB4MDJDLCAweDA5QSwgMHgwQzcsIDB4MEMxLCAweDBEMSwgMHgwMjIsIDB4MDhDLAorCTB4MDAyLCAweDBDOSwgMHgwOTQsIDB4MDY0LCAweDA1QywgMHgwMEMsIDB4MEQ2LCAweDA4RSwKKwkweDAxMywgMHgwNjAsIDB4MDJGLCAweDBCOCwgMHgwMEIsIDB4MEVBLCAweDAzMCwgMHgwRTMsCisJMHgwQzAsIDB4MDVGLCAweDA0OCwgMHgwREMsIDB4MDc4LCAweDAwQiwgMHgwRTgsIDB4MDAwLAorCTB4MEUzLCAweDBDMCwgMHgwNUYsIDB4MDZDLCAweDAzOCwgMHgwRDUsIDB4MDJFLCAweDAzNSwKKwkweDA0RiwgMHgwNUEsIDB4MDhBLCAweDA2MSwgMHgwQUEsIDB4MDlGLCAweDA1NiwgMHgwMUIsCisJMHgwMzIsIDB4MDk5LCAweDA0NiwgMHgwNDIsIDB4MEM4LCAweDAwMSwgMHgwMEMsIDB4MDQ1LAorCTB4MENFLCAweDBBNSwgMHgwMTcsIDB4MEU2LCAweDBDNiwgMHgwQ0UsIDB4MEE5LCAweDBFQiwKKwkweDAxNSwgMHgwMTYsIDB4MDQ2LCAweDBBMiwgMHgwNDcsIDB4MDM4LCAweDAxNCwgMHgwNDMsCisJMHgwMjYsIDB4MDIyLCAweDBFNywgMHgwM0QsIDB4MDYwLCAweDAyRiwgMHgwQUEsIDB4MDlFLAorCTB4MEI1LCAweDAxMiwgMHgwRTAsIDB4MDdGLCAweDAwMSwgMHgwN0QsIDB4MEUzLCAweDBFNywKKwkweDAwMiwgMHgwOTMsIDB4MEY5LCAweDA5NSwgMHgwNDQsIDB4MDVDLCAweDBFNSwgMHgwQTAsCisJMHgwRTMsIDB4MDlELCAweDA0QSwgMHgwN0YsIDB4MDlDLCAweDA1NCwgMHgwQTksIDB4MEVCLAorCTB4MDUxLCAweDAwNSwgMHgwNDYsIDB4MEI5LCAweDBGQywgMHgwQzAsIDB4MDFCLCAweDAyMiwKKwkweDAyRSwgMHgwNjQsIDB4MDU0LCAweDAyRiwgMHgwQ0QsIDB4MDQ2LCAweDBDQywgMHgwQTcsCisJMHgwRDUsIDB4MDg2LCAweDBDQywgMHgwQTYsIDB4MDUwLCAweDA1NSwgMHgwQzYsIDB4MDQ1LAorCTB4MENFLCAweDA1QSwgMHgwMEUsIDB4MDM5LCAweDBENCwgMHgwQTcsIDB4MEY5LCAweDBDNSwKKwkweDA0QSwgMHgwOUUsIDB4MEI1LCAweDAxMSwgMHgwODAsIDB4MDU5LCAweDBDMCwgMHgwNkQsCisJMHgwQ0YsIDB4MEU2LCAweDAwMCwgMHgwRDksIDB4MDExLCAweDA3MywgMHgwMjIsIDB4MEExLAorCTB4MDdFLCAweDA2QSwgMHgwMzYsIDB4MDY1LCAweDAzRSwgMHgwQUMsIDB4MDM2LCAweDA2NSwKKwkweDAzMiwgMHgwQjAsIDB4MDE3LCAweDBERCwgMHgwM0UsIDB4MDcyLCAweDBEMiwgMHgwNzksCisJMHgwMzEsIDB4MDBDLCAweDA5OCwgMHgwMkUsIDB4MDRDLCAweDAyMCwgMHgwNzMsIDB4MDJBLAorCTB4MDhGLCAweDBGMywgMHgwOEEsIDB4MEFELCAweDBFNywgMHgwNDEsIDB4MDgyLCAweDA3QywKKwkweDBDQSwgMHgwQTYsIDB4MDg5LCAweDBCNSwgMHgwODUsIDB4MDlGLCAweDBCMCwgMHgwRjAsCisJMHgwMTcsIDB4MEQ1LCAweDAxRiwgMHgwNTQsIDB4MDU0LCAweDAyNSwgMHgwMUEsIDB4MEE4LAorCTB4MEZGLCAweDAyQSwgMHgwOTQsIDB4MDY1LCAweDAxMSwgMHgwRDcsIDB4MDQ5LCAweDA0NCwKKwkweDBENSwgMHgwQ0MsIDB4MEEwLCAweDA1NSwgMHgwRDgsIDB4MEFFLCAweDAwRSwgMHgwODgsCisJMHgwMTQsIDB4MDYwLCAweDAxNiwgMHgwNEQsIDB4MDYzLCAweDAyMiwgMHgwRTAsIDB4MDcyLAorCTB4MDg2LCAweDAzOCwgMHgwNEQsIDB4MDgwLCAweDBCRSwgMHgwRTAsIDB4MDJGLCAweDBCOCwKKwkweDAwQiwgMHgwRUUsIDB4MDAyLCAweDBGQiwgMHgwODEsIDB4MDM4LCAweDBGMCwgMHgwMTcsCisJMHgwRDcsIDB4MEQ3LCAweDAxRSwgMHgwMDIsIDB4MEZBLCAweDBGQSwgMHgwRTMsIDB4MEMwLAorCTB4MDVGLCAweDA0QywgMHgwODUsIDB4MDkwLCAweDAwMiwgMHgwMTgsIDB4MEM4LCAweDA1QiwKKwkweDA4MCwgMHgwREEsIDB4MDMwLCAweDAwQiwgMHgwNzAsIDB4MDFCLCAweDA0QywgMHgwMjIsCisJMHgwRDMsIDB4MDRDLCAweDAzMywgMHgwMDMsIDB4MDhDLCAweDAyRSwgMHgwNEMsIDB4MDQzLAorCTB4MDI2LCAweDBEMCwgMHgwRjUsIDB4MDYzLCAweDA2NiwgMHgwRDAsIDB4MDk1LCAweDBBNywKKwkweDBDRSwgMHgwNDUsIDB4MDMzLCAweDAwQSwgMHgwRDYsIDB4MDE2LCAweDA0MiwgMHgwMzgsCisJMHgwNkUsIDB4MEU0LCAweDBDRSwgMHgwQkQsIDB4MDU5LCAweDAyQywgMHgwRDIsIDB4MEFCLAorCTB4MEJBLCAweDA5NCwgMHgwOUQsIDB4MEU2LCAweDAxQSwgMHgwQjAsIDB4MDE3LCAweDBENSwKKwkweDA0RiwgMHgwNUEsIDB4MDhCLCAweDAwOSwgMHgwMUEsIDB4MDg4LCAweDBCOSwgMHgwQzUsCisJMHgwNDIsIDB4MDQ3LCAweDAzMCwgMHgwRDQsIDB4MDMyLCAweDAxNiwgMHgwNzIsIDB4MDg4LAorCTB4MDY1LCAweDBCRCwgMHgwNTksIDB4MDk5LCAweDAyNSwgMHgwQTUsIDB4MDYwLCAweDAyRiwKKwkweDBCOCwgMHgwNjAsIDB4MEYzLCAweDAwOCwgMHgwQjcsIDB4MDRBLCAweDAxQSwgMHgwOEYsCisJMHgwQUIsIDB4MDBELCAweDA5OSwgMHgwNDYsIDB4MDUxLCAweDBBRiwgMHgwMzgsIDB4MEE4LAorCTB4MDhFLCAweDA5MCwgMHgwNjUsIDB4MDEzLCAweDA1MiwgMHgwMTgsIDB4MEEwLCAweDA1NCwKKwkweDBCMSwgMHgwNDIsIDB4MDJFLCAweDA2MSwgMHgwQTgsIDB4MDQ4LCAweDBFNywgMHgwMkQsCisJMHgwMTYsIDB4MEY3LCAweDBBOCwgMHgwMDUsIDB4MEE1LCAweDA2MCwgMHgwMkYsIDB4MEE0LAorCTB4MDc1LCAweDBEMiwgMHgwNTEsIDB4MDM1LCAweDA3MywgMHgwMjgsIDB4MDE1LCAweDA3NiwKKwkweDAyQiwgMHgwODMsIDB4MEEyLCAweDAwNSwgMHgwMTgsIDB4MDA1LCAweDA5MywgMHgwNTgsCisJMHgwQzgsIDB4MEI4LCAweDAwNiwgMHgwMjgsIDB4MDYzLCAweDA4NCwgMHgwRDgsIDB4MDBCLAorCTB4MEVFLCAweDAwMiwgMHgwRkIsIDB4MDgwLCAweDBCRSwgMHgwRTAsIDB4MDJGLCAweDBBMCwKKwkweDA0MywgMHgwQTcsIDB4MDAxLCAweDA3RCwgMHgwNEMsIDB4MEUzLCAweDBDMCwgMHgwNUYsCisJMHgwNzAsIDB4MDE3LCAweDBEQywgMHgwMDUsIDB4MEY0LCAweDA2NCwgMHgwMkQsIDB4MEMwLAorCTB4MDZELCAweDAxOCwgMHgwMDUsIDB4MEI4LCAweDAwRCwgMHgwQTUsIDB4MEJELCAweDA2QSwKKwkweDAyMywgMHgwODYsIDB4MEFBLCAweDA5RSwgMHgwQjUsIDB4MDExLCAweDBBNCwgMHgwNkEsCisJMHgwQTMsIDB4MEVBLCAweDA4QSwgMHgwOEQsIDB4MDIzLCAweDBFMSwgMHgwMTcsIDB4MDM4LAorCTB4MDM0LCAweDA2OSwgMHgwNzEsIDB4MDk4LCAweDA0NSwgMHgwQTYsIDB4MDk4LCAweDA2QSwKKwkweDAzRSwgMHgwQUMsIDB4MDM2LCAweDA2NSwgMHgwMTksIDB4MDQ2LCAweDBCQywgMHgwRTIsCisJMHgwQTIsIDB4MDNBLCAweDA0MSwgMHgwOTQsIDB4MDRELCAweDA0OCwgMHgwNjIsIDB4MDgxLAorCTB4MDUyLCAweDBDNSwgMHgwMTYsIDB4MEY3LCAweDBBOCwgMHgwOEIsIDB4MDRBLCAweDA1NCwKKwkweDBGNSwgMHgwQTgsIDB4MDhDLCAweDAwMiwgMHgwREMsIDB4MDA2LCAweDBEMSwgMHgwMDMsCisJMHgwOUMsIDB4MEI0LCAweDBBOSwgMHgwRUUsIDB4MDBBLCAweDA5NSwgMHgwMjUsIDB4MDJBLAorCTB4MDdBLCAweDBBRCwgMHgwNDYsIDB4MDAxLCAweDA2NywgMHgwMDEsIDB4MEI1LCAweDBENywKKwkweDBBQywgMHgwMEEsIDB4MDMwLCAweDAwQiwgMHgwNkMsIDB4MDQ5LCAweDAzNSwgMHgwRTYsCisJMHgwQjUsIDB4MDY3LCAweDBGMywgMHgwMDAsIDB4MDZDLCAweDA4OCwgMHgwQjksIDB4MDkxLAorCTB4MDUwLCAweDBCRiwgMHgwMzEsIDB4MDFCLCAweDAzMiwgMHgwQTcsIDB4MEI4LCAweDA2OCwKKwkweDA5NSwgMHgwMjUsIDB4MDdCLCAweDBBRCwgMHgwMzMsIDB4MDc4LCAweDBBNywgMHgwQ0QsCisJMHgwM0UsIDB4MEQzLCAweDA4RSwgMHgwOUQsIDB4MDM0LCAweDBFNywgMHgwNEUsIDB4MEQ0LAorCTB4MDIyLCAweDBFNywgMHgwMDYsIDB4MDg0LCAweDA4RSwgMHgwNjAsIDB4MEE4LCAweDBGRiwKKwkweDAzOCwgMHgwQUIsIDB4MDgzLCAweDA5QywgMHgwMkEsIDB4MDA4LCAweDBGOSwgMHgwRDQsCisJMHgwMjAsIDB4MDYzLCAweDBCQywgMHgwMUEsIDB4MDA2LCAweDAwQSwgMHgwQzAsIDB4MDVGLAorCTB4MDQ2LCAweDA0MiwgMHgwREMsIDB4MDA2LCAweDBEMSwgMHgwODAsIDB4MDVCLCAweDA4MCwKKwkweDBEQSwgMHgwMjIsIDB4MEU2LCAweDAxQSwgMHgwODQsIDB4MDhFLCAweDA3MiwgMHgwRDEsCisJMHgwNkYsIDB4MDVBLCAweDA4MCwgMHgwODcsIDB4MDFBLCAweDBBQSwgMHgwN0EsIDB4MEQ0LAorCTB4MDQ4LCAweDBDOCwgMHgwRDUsIDB4MDQ3LCAweDBENSwgMHgwMTUsIDB4MDIzLCAweDAyMywKKwkweDBFMSwgMHgwMTcsIDB4MDM4LCAweDAzNCwgMHgwOEMsIDB4MEJBLCAweDA0QiwgMHgwN0IsCisJMHgwRDQsIDB4MDAyLCAweDBEMiwgMHgwOEMsIDB4MDIyLCAweDBEQywgMHgwMDYsIDB4MEQ1LAorCTB4MDFGLCAweDA1NiwgMHgwMUIsIDB4MDMyLCAweDA4QywgMHgwQTMsIDB4MDVFLCAweDA3MSwKKwkweDA1MSwgMHgwMUQsIDB4MDIwLCAweDBDQSwgMHgwMjYsIDB4MEE0LCAweDAzMSwgMHgwNDAsCisJMHgwQTksIDB4MDYyLCAweDBCMCwgMHgwMTcsIDB4MERGLCAweDA5RSwgMHgwRjQsIDB4MEI3LAorCTB4MEM5LCAweDA0MCwgMHgwQzcsIDB4MDc4LCAweDAwMSwgMHgwODEsIDB4MDgyLCAweDBCOCwKKwkweDAzOCwgMHgwMzksIDB4MDQ5LCAweDAxQywgMHgwMjYsIDB4MEMwLCAweDA1RiwgMHgwNzAsCisJMHgwMTcsIDB4MEQ0LCAweDBBQiwgMHgwRTEsIDB4MDJBLCAweDBGOCwgMHgwNEEsIDB4MEJFLAorCTB4MDEyLCAweDBBRiwgMHgwOEYsIDB4MDk3LCAweDA0RiwgMHgwQ0IsIDB4MEE3LCAweDAwMSwKKwkweDA3RCwgMHgwREEsIDB4MDgwLCAweDBBQSwgMHgwOTEsIDB4MDY0LCAweDA3RiwgMHgwNEEsCisJMHgwODEsIDB4MEQ1LCAweDAyMiwgMHgwQzgsIDB4MEZFLCAweDA4MiwgMHgwODAsIDB4MDI1LAorCTB4MDQ4LCAweDBCMiwgMHgwM0UsIDB4MEJCLCAweDBEQywgMHgwMzUsIDB4MDJFLCAweDA5NCwKKwkweDAwNywgMHgwRTgsIDB4MDhBLCAweDA5QywgMHgwMDMsIDB4MEUyLCAweDA0QiwgMHgwQTUsCisJMHgwNzcsIDB4MEFCLCAweDBCMywgMHgwMzIsIDB4MEU5LCAweDA0QiwgMHgwQkQsIDB4MDU5LAorCTB4MDg2LCAweDA4NCwgMHgwOTcsIDB4MDdBLCAweDAwNCwgMHgwQkEsIDB4MDUzLCAweDBFMSwKKwkweDAzMiwgMHgwRUYsIDB4MDUwLCAweDBENCwgMHgwRTYsIDB4MDM1LCAweDA1MywgMHgwRUIsCisJMHgwMDIsIDB4MDlDLCAweDBDNywgMHgwRDcsIDB4MDdBLCAweDBCMywgMHgwMzAsIDB4MEQyLAorCTB4MDVELCAweDBFQSwgMHgwMDIsIDB4MEU5LCAweDA0NCwgMHgwNUQsIDB4MDE2LCAweDAyOCwKKwkweDBDMCwgMHgwMkMsIDB4MEUwLCAweDAzNiwgMHgwOTEsIDB4MDc0LCAweDA0NSwgMHgwNTksCisJMHgwMTgsIDB4MEQ1LCAweDA0RiwgMHgwQUMsIDB4MDBBLCAweDBDNCwgMHgwMzUsIDB4MDMwLAorCTB4MDhCLCAweDAzOCwgMHgwNjksIDB4MDJCLCAweDBCRCwgMHgwNTksIDB4MDk4LCAweDA2OSwKKwkweDAyRSwgMHgwRjUsIDB4MDEyLCAweDBFOSwgMHgwNTgsIDB4MDY3LCAweDA0QSwgMHgwRUYsCisJMHgwNTAsIDB4MEQ1LCAweDA4RSwgMHgwM0UsIDB4MDFDLCAweDBBNCwgMHgwQjAsIDB4MENFLAorCTB4MDkzLCAweDAyMSwgMHgwNkUsIDB4MDFBLCAweDA0OCwgMHgwMUYsIDB4MEEyLCAweDAyQSwKKwkweDBDMywgMHgwMEQsIDB4MDU3LCAweDA3QSwgMHgwQjMsIDB4MDBELCAweDAwOSwgMHgwMkUsCisJMHgwRjQsIDB4MDQzLCAweDA1RCwgMHgwMjgsIDB4MDhCLCAweDA4MywgMHgwMjAsIDB4MDkyLAorCTB4MDM4LCAweDA0RCwgMHgwODAsIDB4MEJFLCAweDBFMCwgMHgwMkYsIDB4MEFDLCAweDAxNywKKwkweDA0OSwgMHgwQjMsIDB4MEE1LCAweDA4MiwgMHgwRTksIDB4MDNFLCAweDBFOSwgMHgwMzYsCisJMHgwNzQsIDB4MEUwLCAweDAyRiwgMHgwQTYsIDB4MENFLCAweDA5QywgMHgwMDUsIDB4MEY0LAorCTB4MEMyLCAweDAyQywgMHgwOEMsIDB4MDUyLCAweDA1NywgMHgwN0EsIDB4MEQ0LCAweDA4RCwKKwkweDA0OCwgMHgwRkEsIDB4MEVGLCAweDA1MCwgMHgwRDUsIDB4MEFFLCAweDAzNSwgMHgwNTMsCisJMHgwRUIsIDB4MDAyLCAweDA4NiwgMHgwMjEsIDB4MEFBLCAweDBFRiwgMHgwNTYsIDB4MDY2LAorCTB4MDFBLCAweDA0QiwgMHgwQkQsIDB4MDQ0LCAweDBCQSwgMHgwNTAsIDB4MEM0LCAweDBFOSwKKwkweDA1MywgMHgwRUIsIDB4MDAyLCAweDA4NiwgMHgwODEsIDB4MEY1LCAweDBERSwgMHgwQTEsCisJMHgwQTgsIDB4MDYyLCAweDAxRiwgMHgwNUQsIDB4MEZFLCAweDBBMiwgMHgwNUQsIDB4MDI5LAorCTB4MDc3LCAweDBBOCwgMHgwNkEsIDB4MDYxLCAweDA4RCwgMHgwNDAsIDB4MEZELCAweDAxMSwKKwkweDA1MywgMHgwMEMsIDB4MDZBLCAweDBBNywgMHgwRDYsIDB4MDA1LCAweDAzMCwgMHgwQzcsCisJMHgwRDcsIDB4MDdGLCAweDBBOSwgMHgwNTcsIDB4MDRBLCAweDA1RCwgMHgwRUIsIDB4MDQ4LAorCTB4MDFCLCAweDAwQywgMHgwN0MsIDB4MDhCLCAweDA5RCwgMHgwOEEsIDB4MDUzLCAweDBFRiwKKwkweDA2NiwgMHgwOTQsIDB4MENBLCAweDA1NCwgMHgwRjUsIDB4MEEwLCAweDBDNiwgMHgwMDEsCisJMHgwNkUsIDB4MDAzLCAweDA2QSwgMHgwOUYsIDB4MDU2LCAweDA3NiwgMHgwNjUsIDB4MDMyLAorCTB4MDhCLCAweDA3QiwgMHgwRDIsIDB4MEM1LCAweDBBNSwgMHgwNjAsIDB4MDJGLCAweDBBQSwKKwkweDA3RCwgMHgwNjUsIDB4MEEzLCAweDAwMCwgMHgwQjcsIDB4MDAxLCAweDBCNCwgMHgwQzgsCisJMHgwNUEsIDB4MDA3LCAweDA4RiwgMHgwRUQsIDB4MDAxLCAweDBENSwgMHgwMjcsIDB4MDkxLAorCTB4MDY3LCAweDAwMSwgMHgwQjQsIDB4MDhCLCAweDA5QywgMHgwNTQsIDB4MDFDLCAweDA3MywKKwkweDBBOCwgMHgwODQsIDB4MDVDLCAweDBDMSwgMHgwNTAsIDB4MEJGLCAweDAzNiwgMHgwNTYsCisJMHgwNjAsIDB4MEFCLCAweDA4QywgMHgwOEIsIDB4MDlDLCAweDA1NCwgMHgwMUMsIDB4MDczLAorCTB4MEE4LCAweDA4NCwgMHgwNUMsIDB4MEMxLCAweDA1MCwgMHgwQkYsIDB4MDM2LCAweDA1NiwKKwkweDA2QywgMHgwMDUsIDB4MEY1LCAweDA1MywgMHgwRDYsIDB4MEEyLCAweDAzMCwgMHgwMEIsCisJMHgwMjksIDB4MDVCLCAweDAxOSwgMHgwRkMsIDB4MEY2LCAweDA5NCwgMHgwNDUsIDB4MENGLAorCTB4MDE1LCAweDAwQiwgMHgwRjMsIDB4MDNDLCAweDBCMywgMHgwMkEsIDB4MDdBLCAweDBDNSwKKwkweDA0NiwgMHgwMDEsIDB4MDY0LCAweDA4QSwgMHgwMzEsIDB4MDIzLCAweDA5QywgMHgwMEEsCisJMHgwNUQsIDB4MEVBLCAweDAzNCwgMHgwMzMsIDB4MDJFLCAweDA5NSwgMHgwQzcsIDB4MENFLAorCTB4MDJBLCAweDA0RiwgMHgwRTYsIDB4MDUwLCAweDAyMCwgMHgwQjksIDB4MDMxLCAweDAwQywKKwkweDA5QiwgMHgwRUYsIDB4MDM5LCAweDAxNCwgMHgwNDUsIDB4MENFLCAweDA0NSwgMHgwMDcsCisJMHgwMUMsIDB4MEVBLCAweDA0NiwgMHgwODcsIDB4MEFCLCAweDAxQiwgMHgwMzYsIDB4MDg0LAorCTB4MEE3LCAweDA1RSwgMHgwQUMsIDB4MDk2LCAweDA2NywgMHgwNTIsIDB4MEIwLCAweDAxNywKKwkweDBEQywgMHgwRkUsIDB4MDdCLCAweDA0QSwgMHgwMjIsIDB4MEU3LCAweDA4QSwgMHgwODUsCisJMHgwRjksIDB4MDlFLCAweDA1OSwgMHgwOTcsIDB4MDdBLCAweDA4RCwgMHgwMEMsIDB4MENCLAorCTB4MEE1LCAweDAyNywgMHgwRjMsIDB4MEEwLCAweDA0NCwgMHgwMzIsIDB4MDYwLCAweDBCOSwKKwkweDAzNywgMHgwREUsIDB4MDcyLCAweDAyOCwgMHgwOEIsIDB4MDlDLCAweDA4QSwgMHgwMEUsCisJMHgwMzksIDB4MEQ0LCAweDA4QywgMHgwMDUsIDB4MEY3LCAweDBFNywgMHgwQjgsIDB4MDJBLAorCTB4MEY5LCAweDAyOCwgMHgwMTgsIDB4MEVGLCAweDAwMCwgMHgwMzAsIDB4MDMwLCAweDA1NywKKwkweDAwNywgMHgwNDQsIDB4MDBBLCAweDA1MCwgMHgwOEYsIDB4MEYwLCAweDA3MywgMHgwOTEsCisJMHgwNDEsIDB4MDFGLCAweDAzQSwgMHgwOTAsIDB4MDQ1LCAweDBDMCwgMHgwQkIsIDB4MDE4LAorCTB4MEUxLCAweDAzNiwgMHgwMDIsIDB4MEZCLCAweDBGQiwgMHgwOUUsIDB4MDAyLCAweDBGQSwKKwkweDBFRSwgMHgwRTcsIDB4MEY1LCAweDBDRiwgMHgwMDEsIDB4MDdELCAweDAxMCwgMHgwNUMsCisJMHgwRjAsIDB4MDE3LCAweDBEMSwgMHgwMDUsIDB4MENGLCAweDAwMSwgMHgwN0QsIDB4MDUzLAorCTB4MEVCLCAweDAyRCwgMHgwMTgsIDB4MDA1LCAweDBCOCwgMHgwMEQsIDB4MEE2LCAweDA0MiwKKwkweDBEQywgMHgwMDYsIDB4MEQzLCAweDAxNywgMHgwMzUsIDB4MEE4LCAweDA4QiwgMHgwOUMsCisJMHgwMEEsIDB4MDBFLCAweDAzOSwgMHgwRDQsIDB4MDBDLCAweDBGRSwgMHgwN0IsIDB4MDRBLAorCTB4MDIyLCAweDBFNiwgMHgwNTUsIDB4MDBCLCAweDBGMywgMHgwMzEsIDB4MEIzLCAweDA2MCwKKwkweDAyRiwgMHgwQkMsIDB4MDdDLCAweDBFMiwgMHgwQTQsIDB4MEZFLCAweDA2NSwgMHgwNTEsCisJMHgwMTcsIDB4MDM4LCAweDAxNCwgMHgwMUMsIDB4MDczLCAweDBBOCwgMHgwMTksIDB4MEZDLAorCTB4MEY2LCAweDA5NCwgMHgwNDUsIDB4MENDLCAweDBBQSwgMHgwMTcsIDB4MEU2LCAweDA2MywKKwkweDA2NiwgMHgwMEEsIDB4MEI4LCAweDBDQywgMHgwODUsIDB4MEExLCAweDA1OCwgMHgwRjYsCisJMHgwQTIsIDB4MDM1LCAweDA0OCwgMHgwNDgsIDB4MDdGLCAweDA0QSwgMHgwODksIDB4MDk1LAorCTB4MDIxLCAweDAyMSwgMHgwRkQsIDB4MDA1LCAweDAwMiwgMHgwNTQsIDB4MDlFLCAweDA0NSwKKwkweDA5MSwgMHgwMEUsIDB4MDNDLCAweDAwNSwgMHgwRjUsIDB4MDA3LCAweDA0MCwgMHgwNTUsCisJMHgwNDgsIDB4MDUyLCAweDAzRSwgMHgwODYsIDB4MEEwLCAweDA3NSwgMHgwNDgsIDB4MDUyLAorCTB4MDNFLCAweDBCNSwgMHgwMDAsIDB4MDRBLCAweDA5QywgMHgwMDAsIDB4MDZCLCAweDBDNywKKwkweDBDRSwgMHgwNDUsIDB4MDI3LCAweDBGMywgMHgwMkEsIDB4MDg0LCAweDAzNywgMHgwMzUsCisJMHgwREUsIDB4MEEwLCAweDBBQiwgMHgwMjMsIDB4MDFBLCAweDBBRSwgMHgwRjUsIDB4MDgzLAorCTB4MDU5LCAweDAxOCwgMHgwRDcsIDB4MDQzLCAweDBERSwgMHgwMkEsIDB4MEQwLCAweDA5NCwKKwkweDBFQiwgMHgwREUsIDB4MDA1LCAweDAzQSwgMHgwOTUsIDB4MDlGLCAweDBDQywgMHgwQzMsCisJMHgwMjAsIDB4MDQ1LCAweDBDQywgMHgwQUEsIDB4MDE3LCAweDBFNiwgMHgwNjYsIDB4MENDLAorCTB4MDQzLCAweDAyNiwgMHgwNEYsIDB4MEU3LCAweDA0MSwgMHgwMjIsIDB4MDJFLCAweDA3MCwKKwkweDA2OCwgMHgwMzgsIDB4MEU3LCAweDA1MywgMHgwRTAsIDB4MDJGLCAweDBBQiwgMHgwQkMsCisJMHgwMTIsIDB4MEQyLCAweDBFOSwgMHgwNTgsIDB4MDBCLCAweDBFQSwgMHgwQTcsIDB4MEFELAorCTB4MDQ1LCAweDBBMSwgMHgwMUYsIDB4MEMwLCAweDA1RiwgMHgwNzgsIDB4MDM5LCAweDBDOCwKKwkweDBBMCwgMHgwOEYsIDB4MDlELCAweDA0OCwgMHgwMUMsIDB4MDI0LCAweDBFRSwgMHgwQzcsCisJMHgwODAsIDB4MEJFLCAweDBCQSwgMHgwRjUsIDB4MDZELCAweDA2NiwgMHgwNDksIDB4MDc3LAorCTB4MDBELCAweDA0RSwgMHgwQTUsIDB4MDMwLCAweDAwOSwgMHgwQjQsIDB4MEY5LCAweDBDNSwKKwkweDA0MywgMHgwMEYsIDB4MDM4LCAweDBBOSwgMHgwM0YsIDB4MDlELCAweDAwMiwgMHgwRkIsCisJMHgwQ0UsIDB4MDQ1LCAweDAxMSwgMHgwNzMsIDB4MDkxLCAweDA0MSwgMHgwQzcsIDB4MDNBLAorCTB4MDkxLCAweDA5RiwgMHgwQ0YsIDB4MDY5LCAweDA0NCwgMHgwNUMsIDB4MEYxLCAweDA1MCwKKwkweDBCRiwgMHgwMzMsIDB4MENCLCAweDAzMiwgMHgwQTcsIDB4MEFDLCAweDA1NCwgMHgwOTAsCisJMHgwOEQsIDB4MDQ0LCAweDA4RSwgMHgwNzAsIDB4MDI5LCAweDA3NywgMHgwQTgsIDB4MEQwLAorCTB4MENDLCAweDBCQSwgMHgwNTYsIDB4MEIwLCAweDBCMiwgMHgwOUQsIDB4MDhDLCAweDA4NiwKKwkweDA0QywgMHgwMTcsIDB4MDI2LCAweDA3NywgMHgwMjYsIDB4MDFDLCAweDAyNywgMHgwMUMsCisJMHgwMjQsIDB4MDlFLCAweDAyMywgMHgwNjEsIDB4MEJFLCAweDA4RSwgMHgwMTIsIDB4MDRGLAorCTB4MDExLCAweDA4NywgMHgwMUMsIDB4MEVBLCAweDA1QywgMHgwMDUsIDB4MEY1LCAweDBENywKKwkweDBCOCwgMHgwNkEsIDB4MDc1LCAweDAyOSwgMHgwNzcsIDB4MEFCLCAweDAwRCwgMHgwOTksCisJMHgwNzQsIDB4MEE1LCAweDA0RiwgMHgwNzIsIDB4MEEwLCAweDBBQSwgMHgwNEEsIDB4MEM2LAorCTB4MEYzLCAweDA2NiwgMHgwNjYsIDB4MEM2LCAweDAzOSwgMHgwODIsIDB4MEFGLCAweDA3NSwKKwkweDBBNiwgMHgwNkYsIDB4MDE0LCAweDA2QiwgMHgwQ0UsIDB4MDA1LCAweDA3MCwgMHgwNzMsCisJMHgwOTYsIDB4MDgyLCAweDAzRSwgMHgwNzUsIDB4MDI4LCAweDBFMSwgMHgwM0EsIDB4MEE3LAorCTB4MEFELCAweDA0NCwgMHgwNjAsIDB4MDE2LCAweDA1MiwgMHgwQjYsIDB4MDFELCAweDA3QSwKKwkweDBCNiwgMHgwQjMsIDB4MDI0LCAweDBCQiwgMHgwODYsIDB4MEE3LCAweDA1MiwgMHgwOTgsCisJMHgwMDQsIDB4MERBLCAweDA3QywgMHgwRTIsIDB4MEExLCAweDA4NywgMHgwOUMsIDB4MDU1LAorCTB4MEY3LCAweDA5QywgMHgwQjUsIDB4MEFDLCAweDAyQywgMHgwOTUsIDB4MDMzLCAweDBCOSwKKwkweDAzMSwgMHgwMDUsIDB4MEQ5LCAweDA1MywgMHgwRDYsIDB4MEEyLCAweDAzMCwgMHgwMEIsCisJMHgwMjksIDB4MDVCLCAweDAwMiwgMHgwMkUsIDB4MDYxLCAweDA1QSwgMHgwMTcsIDB4MEU2LAorCTB4MDlDLCAweDBCMywgMHgwMkEsIDB4MDdBLCAweDBDNSwgMHgwNDAsIDB4MDIxLCAweDBBOCwKKwkweDA5MSwgMHgwQ0UsIDB4MDA1LCAweDAyNywgMHgwRjMsIDB4MEE1LCAweDA4OCwgMHgwNjQsCisJMHgwQzEsIDB4MDcyLCAweDA2NSwgMHgwNEYsIDB4MDU4LCAweDAxNCwgMHgwMEMsIDB4MDhELAorCTB4MDdFLCAweDBGMywgMHgwODEsIDB4MDQ0LCAweDA1QywgMHgwRUYsIDB4MDQxLCAweDBDNywKKwkweDAzQSwgMHgwQkUsIDB4MDAyLCAweDBGQSwgMHgwQTksIDB4MEVBLCAweDBDRSwgMHgwQ0MsCisJMHgwQTksIDB4MDI5LCAweDA1MywgMHgwRDYsIDB4MEEyLCAweDA0NiwgMHgwNDcsIDB4MERELAorCTB4MDdBLCAweDBDMCwgMHgwQTMsIDB4MDAwLCAweDA4NiwgMHgwRTIsIDB4MDlCLCAweDAyOSwKKwkweDA3OCwgMHgwOEIsIDB4MDgxLCAweDAwOSwgMHgwOTgsIDB4MDcwLCAweDA5QiwgMHgwMjksCisJMHgwNzksIDB4MDVELCAweDBEOSwgMHgwNzIsIDB4MEVELCAweDA5NCwgMHgwQkMsIDB4MEI5LAorCTB4MDc2LCAweDAxMywgMHgwM0IsIDB4MDJBLCAweDA1RCwgMHgwQjIsIDB4MDk3LCAweDA5NSwKKwkweDAyRSwgMHgwRDksIDB4MDRCLCAweDBDQSwgMHgwN0QsIDB4MDVCLCAweDA1OSwgMHgwOTQsCisJMHgwQ0EsIDB4MDFDLCAweDAyNCwgMHgwRUUsIDB4MEM3LCAweDA5NCwgMHgwQkMsIDB4MEMwLAorCTB4MDI2LCAweDBEMywgMHgwRTcsIDB4MDE1LCAweDAwQywgMHgwM0MsIDB4MEUyLCAweDBBQywKKwkweDBGRSwgMHgwN0IsIDB4MDRBLCAweDAyMiwgMHgwRTcsIDB4MDhBLCAweDA4NSwgMHgwRjksCisJMHgwOUUsIDB4MDU5LCAweDA5NywgMHgwN0EsIDB4MDhELCAweDAwQywgMHgwQ0IsIDB4MEE1LAorCTB4MDI3LCAweDBGMywgMHgwQTAsIDB4MDQxLCAweDA3MiwgMHgwNjIsIDB4MDE5LCAweDAzNywKKwkweDBERSwgMHgwNzAsIDB4MDI4LCAweDA4QiwgMHgwOUMsIDB4MDhBLCAweDAwRSwgMHgwMzksCisJMHgwRDQsIDB4MDhELCAweDAwRiwgMHgwNTYsIDB4MDM2LCAweDA2RCwgMHgwMDksIDB4MDRFLAorCTB4MEJELCAweDA1OSwgMHgwMkMsIDB4MENFLCAweDBBNSwgMHgwNkIsIDB4MDBCLCAweDAyMiwKKwkweDBEOSwgMHgwOUQsIDB4MEM5LCAweDBCMiwgMHgwOTcsIDB4MEJFLCAweDBGMywgMHgwODEsCisJMHgwNEEsIDB4MDdELCAweDA2NSwgMHgwQTMsIDB4MDAwLCAweDA5MywgMHgwOEYsIDB4MDY3LAorCTB4MDI5LCAweDA3OCwgMHgwQzIsIDB4MDRELCAweDBDMSwgMHgwRDEsIDB4MDA2LCAweDA4MiwKKwkweDAzMSwgMHgwQUYsIDB4MDA3LCAweDAzOCwgMHgwMzQsIDB4MDExLCAweDBGMywgMHgwQTgsCisJMHgwMkEsIDB4MDlFLCAweDBBOCwgMHgwNjYsIDB4MDFBLCAweDBBNCwgMHgwQTUsIDB4MDRGLAorCTB4MDVBLCAweDAwQywgMHgwMTEsIDB4MDhGLCAweDBBQSwgMHgwN0IsIDB4MEQwLCAweDA2NSwKKwkweDA0OSwgMHgwNDUsIDB4MEJELCAweDBFOSwgMHgwNjIsIDB4MEQyLCAweDBCMSwgMHgwOUUsCisJMHgwNkMsIDB4MENDLCAweDBDNiwgMHgwMTksIDB4MDg3LCAweDAwOSwgMHgwQzMsIDB4MDhFLAorCTB4MDc1LCAweDA0MSwgMHgwMUYsIDB4MDNBLCAweDBBNSwgMHgwMTMsIDB4MEQ1LCAweDA1NSwKKwkweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsCisJMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LAorCTB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwKKwkweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsCisJMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDU1LAorCTB4MDU1LCAweDA1NSwgMHgwNTUsIDB4MDVBLCAweDBDQywgMHgwOTAKKyB9OworCisjZW5kaWYJLyogZGVmaW5lZChDT05GSUdfU01DVFIpIHx8IGRlZmluZWQoQ09ORklHX1NNQ1RSX01PRFVMRSkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXMzODB0ci5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3RtczM4MHRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0M2I0NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXMzODB0ci5jCkBAIC0wLDAgKzEsMjQxMCBAQAorLyoKKyAqICB0bXMzODB0ci5jOiBBIG5ldHdvcmsgZHJpdmVyIGxpYnJhcnkgZm9yIFRleGFzIEluc3RydW1lbnRzIFRNUzM4MC1iYXNlZAorICogICAgICAgICAgICAgIFRva2VuIFJpbmcgQWRhcHRlcnMuCisgKgorICogIE9yaWdpbmFsbHkgc2t0ci5jOiBXcml0dGVuIDE5OTcgYnkgQ2hyaXN0b3BoIEdvb3MKKyAqCisgKiAgQSBmaW5lIHJlc3VsdCBvZiB0aGUgTGludXggU3lzdGVtcyBOZXR3b3JrIEFyY2hpdGVjdHVyZSBQcm9qZWN0LgorICogIGh0dHA6Ly93d3cubGludXgtc25hLm9yZworICoKKyAqICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiAgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAgVGhlIGZvbGxvd2luZyBtb2R1bGVzIGFyZSBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciBjYXJkIHN1cHBvcnQ6CisgKgktIHRtc3BjaSAoR2VuZXJpYyBQQ0kgY2FyZCBzdXBwb3J0KQorICoJLSBhYnlzcyAoTWFkZ2UgUENJIHN1cHBvcnQpCisgKiAgICAgIC0gdG1zaXNhIChTeXNLb25uZWN0IFRSNC8xNiBJU0EpCisgKgorICogIFNvdXJjZXM6CisgKiAgCS0gVGhlIGhhcmR3YXJlIHJlbGF0ZWQgcGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIHRha2UgZnJvbQorICogIAkgIHRoZSBTeXNLb25uZWN0IFRva2VuIFJpbmcgZHJpdmVyIGZvciBXaW5kb3dzIE5ULgorICogIAktIEkgdXNlZCB0aGUgSUJNIFRva2VuIFJpbmcgZHJpdmVyICdpYm10ci5jJyBhcyBhIGJhc2UgZm9yIHRoaXMKKyAqICAJICBkcml2ZXIsIGFzIHdlbGwgYXMgdGhlICdza2VsZXRvbi5jJyBkcml2ZXIgYnkgRG9uYWxkIEJlY2tlci4KKyAqICAJLSBBbHNvIHZhcmlvdXMgb3RoZXIgZHJpdmVycyBpbiB0aGUgbGludXggc291cmNlIHRyZWUgd2VyZSB0YWtlbgorICogIAkgIGFzIHNhbXBsZXMgZm9yIHNvbWUgdGFza3MuCisgKiAgICAgIC0gVEkgVE1TMzgwIFNlY29uZC1HZW5lcmF0aW9uIFRva2VuIFJpbmcgVXNlcidzIEd1aWRlCisgKiAgCS0gVEkgZGF0YXNoZWV0cyBmb3IgcmVzcGVjdGl2ZSBjaGlwcworICogIAktIERhdmlkIEhlaW4gYXQgVGV4YXMgSW5zdHJ1bWVudHMgCisgKiAgCS0gVmFyaW91cyBNYWRnZSBlbXBsb3llZXMKKyAqCisgKiAgTWFpbnRhaW5lcihzKToKKyAqICAgIEpTCUpheSBTY2h1bGlzdAkJanNjaGxzdEBzYW1iYS5vcmcKKyAqICAgIENHCUNocmlzdG9waCBHb29zCQljZ29vc0BzeXNrb25uZWN0LmRlCisgKiAgICBBRglBZGFtIEZyaXR6bGVyCQltaWRAYXVrLmN4CisgKiAgICBNTFAgICAgICAgTWlrZSBQaGlsbGlwcyAgICAgICAgICAgcGhpbGxpbUBhbXRyYWsuY29tCisgKiAgICBKRglKb2NoZW4gRnJpZWRyaWNoCWpvY2hlbkBzY3JhbS5kZQorICogICAgIAorICogIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgorICoJMjktQXVnLTk3CUNHCUNyZWF0ZWQKKyAqCTA0LUFwci05OAlDRwlGaXhlZCBwcm9ibGVtcyBjYXVzZWQgYnkgdG9rX3RpbWVyX2NoZWNrCisgKgkxMC1BcHItOTgJQ0cJRml4ZWQgbG9ja3VwcyBhdCBjYWJsZSBkaXNjb25uZWN0aW9uCisgKgkyNy1NYXktOTgJSlMJRm9ybWF0ZWQgdG8gTGludXggS2VybmVsIEZvcm1hdAorICoJMzEtTWF5LTk4CUpTCUhhY2tlZCBpbiBQQ0kgc3VwcG9ydAorICoJMTYtSnVuLTk4CUpTCU1vZHVsaXplZCBmb3IgbXVsdGlwbGUgY2FyZHMgd2l0aCBvbmUgZHJpdmVyCisgKgkgICBTZXAtOTkJQUYJUmVuYW1lZCB0byB0bXMzODB0ciAoc3VwcG9ydHMgbW9yZSB0aGFuIFNLJ3MpCisgKiAgICAgIDIzLVNlcC05OQlBRiAgICAgIEFkZGVkIENvbXBhcSBhbmQgVGhvbWFzLUNvbnJhZCBQQ0kgc3VwcG9ydAorICoJCQkJRml4ZWQgYSBidWcgY2F1c2luZyBkb3VibGUgY29waWVzIG9uIFBDSQorICoJCQkJRml4ZWQgZm9yIG5ldyBtdWx0aWNhc3Qgc3R1ZmYgKDIuMi8yLjMpCisgKgkyNS1TZXAtOTkJQUYJVXBlZCBUUExfTlVNIGZyb20gMyB0byA5CisgKgkJCQlSZW1vdmVkIGV4dHJhbmVvdXMgJ05vIGZyZWUgVFBMJworICoJMjItRGVjLTk5CUFGCUFkZGVkIE1hZGdlIFBDSSBNazIgc3VwcG9ydCBhbmQgZ2VuZXJhbGl6ZWQKKyAqCQkJCXBhcnRzIG9mIHRoZSBpbml0aWxpemF0aW9uIHByb2NlZHVyZS4KKyAqCTMwLURlYy05OQlBRglUdXJuZWQgdG1zMzgwdHIgaW50byBhIGxpYnJhcnkgYWxhIDgzOTAuCisgKgkJCQlNYWRnZSBzdXBwb3J0IGlzIHByb3ZpZGVkIGluIHRoZSBhYnlzcyBtb2R1bGUKKyAqCQkJCUdlbmVyaWMgUENJIHN1cHBvcnQgaXMgaW4gdGhlIHRtc3BjaSBtb2R1bGUuCisgKgkzMC1Ob3YtMDAJSkYJVXBkYXRlZCBQQ0kgY29kZSB0byBzdXBwb3J0IElPIE1NVSB2aWEKKyAqCQkJCXBjaV9tYXBfc3RhdGljKCkuIEFscGhhIHVzZXMgdGhpcyBNTVUgZm9yIElTQQorICoJCQkJYXMgd2VsbC4KKyAqICAgICAgMTQtSmFuLTAxCUpGCUZpeCBETUEgb24gaWZkb3duL2lmdXAgc2VxdWVuY2VzLiBTb21lIAorICogICAgICAJCQljbGVhbnVwLgorICoJMTMtSmFuLTAyCUpGCUFkZCBzcGlubG9jayB0byBmaXggcmFjZSBjb25kaXRpb24uCisgKgkwOS1Ob3YtMDIJSkYJRml4ZWQgcHJpbnRrcyB0byBub3QgU1BBTSB0aGUgY29uc29sZSBkdXJpbmcKKyAqCQkJCW5vcm1hbCBvcGVyYXRpb24uCisgKgkzMC1EZWMtMDIJSkYJUmVtb3ZlZCBpbmNvcnJlY3QgX19pbml0IGZyb20gCisgKgkJCQl0bXMzODB0cl9pbml0X2NhcmQuCisgKiAgICAgIAkJCQorICogIFRvIGRvOgorICogICAgMS4gTXVsdGkvQnJvYWRjYXN0IHBhY2tldCBoYW5kbGluZyAodGhpcyBtYXkgaGF2ZSBmaXhlZCBpdHNlbGYpCisgKiAgICAyLiBXcml0ZSBhIHNrdHJpc2EgbW9kdWxlIHRoYXQgaW5jbHVkZXMgdGhlIG9sZCBJU0Egc3VwcG9ydCAoZG9uZSkKKyAqICAgIDMuIEFsbG93IG1vZHVsZXMgdG8gbG9hZCB0aGVpciBvd24gbWljcm9jb2RlCisgKiAgICA0LiBTcGVlZCB1cCB0aGUgQlVEIHByb2Nlc3MgLS0gZnJlZXppbmcgdGhlIGtlcm5lbCBmb3IgMytzZWMgaXMKKyAqICAgICAgICAgcXVpdGUgdW5hY2NlcHRhYmxlLgorICogICAgNS4gU3RpbGwgYSBmZXcgcmVtYWluaW5nIHN0YWxscyB3aGVuIHRoZSBjYWJsZSBpcyB1bnBsdWdnZWQuCisgKi8KKworI2lmZGVmIE1PRFVMRQorc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0gInRtczM4MHRyLmM6IHYxLjEwIDMwLzEyLzIwMDIgYnkgQ2hyaXN0b3BoIEdvb3MsIEFkYW0gRnJpdHpsZXJcbiI7CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3RyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJ0bXMzODB0ci5oIgkJLyogT3VyIFN0dWZmICovCisKKy8qIFVzZSAwIGZvciBwcm9kdWN0aW9uLCAxIGZvciB2ZXJpZmljYXRpb24sIDIgZm9yIGRlYnVnLCBhbmQKKyAqIDMgZm9yIHZlcnkgdmVyYm9zZSBkZWJ1Zy4KKyAqLworI2lmbmRlZiBUTVMzODBUUl9ERUJVRworI2RlZmluZSBUTVMzODBUUl9ERUJVRyAwCisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdG1zMzgwdHJfZGVidWcgPSBUTVMzODBUUl9ERUJVRzsKKworc3RhdGljIHN0cnVjdCBkZXZpY2UgdG1zX2RldmljZTsKKworLyogSW5kZXggdG8gZnVuY3Rpb25zLCBhcyBmdW5jdGlvbiBwcm90b3R5cGVzLgorICogQWxwaGFiZXRpY2FsIGJ5IGZ1bmN0aW9uIG5hbWUuCisgKi8KKworLyogIkEiICovCisvKiAiQiIgKi8KK3N0YXRpYyBpbnQgICAgICB0bXMzODB0cl9icmluZ3VwX2RpYWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworLyogIkMiICovCitzdGF0aWMgdm9pZAl0bXMzODB0cl9jYW5jZWxfdHhfcXVldWUoc3RydWN0IG5ldF9sb2NhbCogdHApOworc3RhdGljIGludCAJdG1zMzgwdHJfY2hpcHNldF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgCXRtczM4MHRyX2Noa19pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfY2hrX291dHN0YW5kaW5nX2NtZHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfY2hrX3NyY19hZGRyKHVuc2lnbmVkIGNoYXIgKmZyYW1lLCB1bnNpZ25lZCBjaGFyICpod19hZGRyKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHRtczM4MHRyX2Noa19zc2Ioc3RydWN0IG5ldF9sb2NhbCAqdHAsIHVuc2lnbmVkIHNob3J0IElycVR5cGUpOworaW50CSAJdG1zMzgwdHJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfY21kX3N0YXR1c19pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvKiAiRCIgKi8KK3N0YXRpYyB2b2lkIAl0bXMzODB0cl9kaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjaWYgVE1TMzgwVFJfREVCVUcgPiAwCitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfZHVtcCh1bnNpZ25lZCBjaGFyICpEYXRhLCBpbnQgbGVuZ3RoKTsKKyNlbmRpZgorLyogIkUiICovCitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfZXhlY19jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgQ29tbWFuZCk7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfZXhlY19zaWZjbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IFdyaXRlVmFsdWUpOworLyogIkYiICovCisvKiAiRyIgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqdG1zMzgwdHJfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworLyogIkgiICovCitzdGF0aWMgaW50IAl0bXMzODB0cl9oYXJkd2FyZV9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvKiAiSSIgKi8KK3N0YXRpYyBpbnQgCXRtczM4MHRyX2luaXRfYWRhcHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIAl0bXMzODB0cl9pbml0X2lwYihzdHJ1Y3QgbmV0X2xvY2FsICp0cCk7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfaW5pdF9uZXRfbG9jYWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfaW5pdF9vcGIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvKiAiTSIgKi8KKy8qICJPIiAqLworaW50CQl0bXMzODB0cl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQJdG1zMzgwdHJfb3Blbl9hZGFwdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworLyogIlAiICovCisvKiAiUiIgKi8KK3N0YXRpYyB2b2lkIAl0bXMzODB0cl9yY3Zfc3RhdHVzX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgCXRtczM4MHRyX3JlYWRfcHRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgCXRtczM4MHRyX3JlYWRfcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKkRhdGEsCisJCQl1bnNpZ25lZCBzaG9ydCBBZGRyZXNzLCBpbnQgTGVuZ3RoKTsKK3N0YXRpYyBpbnQgCXRtczM4MHRyX3Jlc2V0X2FkYXB0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfcmVzZXRfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgCXRtczM4MHRyX3Jpbmdfc3RhdHVzX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8qICJTIiAqLworc3RhdGljIGludCAJdG1zMzgwdHJfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAJdG1zMzgwdHJfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludAl0bXMzODB0cl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcik7CisvKiAiVCIgKi8KK3N0YXRpYyB2b2lkIAl0bXMzODB0cl90aW1lcl9jaGsodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIAl0bXMzODB0cl90aW1lcl9lbmRfd2FpdCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgCXRtczM4MHRyX3R4X3N0YXR1c19pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisvKiAiVSIgKi8KK3N0YXRpYyB2b2lkIAl0bXMzODB0cl91cGRhdGVfcmN2X3N0YXRzKHN0cnVjdCBuZXRfbG9jYWwgKnRwLAorCQkJdW5zaWduZWQgY2hhciBEYXRhUHRyW10sIHVuc2lnbmVkIGludCBMZW5ndGgpOworLyogIlciICovCit2b2lkCSAJdG1zMzgwdHJfd2FpdCh1bnNpZ25lZCBsb25nIHRpbWUpOworc3RhdGljIHZvaWQgCXRtczM4MHRyX3dyaXRlX3JwbF9zdGF0dXMoUlBMICpycGwsIHVuc2lnbmVkIGludCBTdGF0dXMpOworc3RhdGljIHZvaWQgCXRtczM4MHRyX3dyaXRlX3RwbF9zdGF0dXMoVFBMICp0cGwsIHVuc2lnbmVkIGludCBTdGF0dXMpOworCisjZGVmaW5lIFNJRlJFQURCKHJlZykgKCgoc3RydWN0IG5ldF9sb2NhbCAqKWRldi0+cHJpdiktPnNpZnJlYWRiKGRldiwgcmVnKSkKKyNkZWZpbmUgU0lGV1JJVEVCKHZhbCwgcmVnKSAoKChzdHJ1Y3QgbmV0X2xvY2FsICopZGV2LT5wcml2KS0+c2lmd3JpdGViKGRldiwgdmFsLCByZWcpKQorI2RlZmluZSBTSUZSRUFEVyhyZWcpICgoKHN0cnVjdCBuZXRfbG9jYWwgKilkZXYtPnByaXYpLT5zaWZyZWFkdyhkZXYsIHJlZykpCisjZGVmaW5lIFNJRldSSVRFVyh2YWwsIHJlZykgKCgoc3RydWN0IG5ldF9sb2NhbCAqKWRldi0+cHJpdiktPnNpZndyaXRldyhkZXYsIHZhbCwgcmVnKSkKKworCisKKyNpZiAwIC8qIFRNUzM4MFRSX0RFQlVHID4gMCAqLworc3RhdGljIGludCBtYWRnZW1jX3NpZnByb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgb2xkLCBjaGsxLCBjaGsyOworCQorCW9sZCA9IFNJRlJFQURCKFNJRkFEUik7ICAvKiBHZXQgdGhlIG9sZCBTSUZBRFIgdmFsdWUgKi8KKworICAgICAgICBjaGsxID0gMDsgICAgICAgLyogQmVnaW4gd2l0aCBjaGVjayB2YWx1ZSAwICovCisgICAgICAgIGRvIHsKKwkJbWFkZ2VtY19zZXRyZWdwYWdlKGRldiwgMCk7CisgICAgICAgICAgICAgICAgLyogV3JpdGUgbmV3IFNJRkFEUiB2YWx1ZSAqLworCQlTSUZXUklURUIoY2hrMSwgU0lGQURSKTsKKwkJY2hrMiA9IFNJRlJFQURCKFNJRkFEUik7CisJCWlmIChjaGsyICE9IGNoazEpCisJCQlyZXR1cm4gLTE7CisJCQorCQltYWRnZW1jX3NldHJlZ3BhZ2UoZGV2LCAxKTsKKyAgICAgICAgICAgICAgICAvKiBSZWFkLCBpbnZlcnQgYW5kIHdyaXRlICovCisJCWNoazIgPSBTSUZSRUFEQihTSUZBREQpOworCQlpZiAoY2hrMiAhPSBjaGsxKQorCQkJcmV0dXJuIC0xOworCisJCW1hZGdlbWNfc2V0cmVncGFnZShkZXYsIDApOworICAgICAgICAgICAgICAgIGNoazIgXj0gMHgwRkU7CisJCVNJRldSSVRFQihjaGsyLCBTSUZBRFIpOworCisgICAgICAgICAgICAgICAgLyogUmVhZCwgaW52ZXJ0IGFuZCBjb21wYXJlICovCisJCW1hZGdlbWNfc2V0cmVncGFnZShkZXYsIDEpOworCQljaGsyID0gU0lGUkVBREIoU0lGQUREKTsKKwkJbWFkZ2VtY19zZXRyZWdwYWdlKGRldiwgMCk7CisgICAgICAgICAgICAgICAgY2hrMiBePSAweDBGRTsKKworICAgICAgICAgICAgICAgIGlmKGNoazEgIT0gY2hrMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoLTEpOyAgICAvKiBObyBhZGFwdGVyICovCisgICAgICAgICAgICAgICAgY2hrMSAtPSAyOworICAgICAgICB9IHdoaWxlKGNoazEgIT0gMCk7ICAgICAvKiBSZXBlYXQgMTI4IHRpbWVzIChhbGwgYnl0ZSB2YWx1ZXMpICovCisKKwltYWRnZW1jX3NldHJlZ3BhZ2UoZGV2LCAwKTsgLyogc2FuaXR5ICovCisgICAgICAgIC8qIFJlc3RvcmUgdGhlIFNJRkFEUiB2YWx1ZSAqLworCVNJRldSSVRFQihvbGQsIFNJRkFEUik7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCisvKgorICogT3Blbi9pbml0aWFsaXplIHRoZSBib2FyZC4gVGhpcyBpcyBjYWxsZWQgc29tZXRpbWUgYWZ0ZXIKKyAqIGJvb3Rpbmcgd2hlbiB0aGUgJ2lmY29uZmlnJyBwcm9ncmFtIGlzIHJ1bi4KKyAqCisgKiBUaGlzIHJvdXRpbmUgc2hvdWxkIHNldCBldmVyeXRoaW5nIHVwIGFuZXcgYXQgZWFjaCBvcGVuLCBldmVuCisgKiByZWdpc3RlcnMgdGhhdCAic2hvdWxkIiBvbmx5IG5lZWQgdG8gYmUgc2V0IG9uY2UgYXQgYm9vdCwgc28gdGhhdAorICogdGhlcmUgaXMgbm9uLXJlYm9vdCB3YXkgdG8gcmVjb3ZlciBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4KKyAqLworaW50IHRtczM4MHRyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKwkKKwkvKiBpbml0IHRoZSBzcGlubG9jayAqLworCXNwaW5fbG9ja19pbml0KCZ0cC0+bG9jayk7CisJaW5pdF90aW1lcigmdHAtPnRpbWVyKTsKKworCS8qIFJlc2V0IHRoZSBoYXJkd2FyZSBoZXJlLiBEb24ndCBmb3JnZXQgdG8gc2V0IHRoZSBzdGF0aW9uIGFkZHJlc3MuICovCisKKyNpZmRlZiBDT05GSUdfSVNBCisJaWYoZGV2LT5kbWEgPiAwKSAKKwl7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKKwkJZGlzYWJsZV9kbWEoZGV2LT5kbWEpOworCQlzZXRfZG1hX21vZGUoZGV2LT5kbWEsIERNQV9NT0RFX0NBU0NBREUpOworCQllbmFibGVfZG1hKGRldi0+ZG1hKTsKKwkJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJfQorI2VuZGlmCisJCisJZXJyID0gdG1zMzgwdHJfY2hpcHNldF9pbml0KGRldik7CisgIAlpZihlcnIpCisJeworCQlwcmludGsoS0VSTl9JTkZPICIlczogQ2hpcHNldCBpbml0aWFsaXphdGlvbiBlcnJvclxuIiwgCisJCQlkZXYtPm5hbWUpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwl0cC0+dGltZXIuZXhwaXJlcwk9IGppZmZpZXMgKyAzMCpIWjsKKwl0cC0+dGltZXIuZnVuY3Rpb24JPSB0bXMzODB0cl90aW1lcl9lbmRfd2FpdDsKKwl0cC0+dGltZXIuZGF0YQkJPSAodW5zaWduZWQgbG9uZylkZXY7CisJYWRkX3RpbWVyKCZ0cC0+dGltZXIpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBBZGFwdGVyIFJBTSBzaXplOiAlZEtcbiIsIAorCSAgICAgICBkZXYtPm5hbWUsIHRtczM4MHRyX3JlYWRfcHRyKGRldikpOworCisJdG1zMzgwdHJfZW5hYmxlX2ludGVycnVwdHMoZGV2KTsKKwl0bXMzODB0cl9vcGVuX2FkYXB0ZXIoZGV2KTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCisJLyogV2FpdCBmb3IgaW50ZXJydXB0IGZyb20gaGFyZHdhcmUuIElmIGludGVycnVwdCBkb2VzIG5vdCBjb21lLAorCSAqIHRoZXJlIHdpbGwgYmUgYSB0aW1lb3V0IGZyb20gdGhlIHRpbWVyLgorCSAqLworCXRwLT5TbGVlcGluZyA9IDE7CisJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmdHAtPndhaXRfZm9yX3Rva19pbnQpOworCWRlbF90aW1lcigmdHAtPnRpbWVyKTsKKworCS8qIElmIEFkYXB0ZXJWaXJ0T3BlbkZsYWcgaXMgMSwgdGhlIGFkYXB0ZXIgaXMgbm93IG9wZW4gZm9yIHVzZSAqLworCWlmKHRwLT5BZGFwdGVyVmlydE9wZW5GbGFnID09IDApCisJeworCQl0bXMzODB0cl9kaXNhYmxlX2ludGVycnVwdHMoZGV2KTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJdHAtPlN0YXJ0VGltZSA9IGppZmZpZXM7CisKKwkvKiBTdGFydCBmdW5jdGlvbiBjb250cm9sIHRpbWVyICovCisJdHAtPnRpbWVyLmV4cGlyZXMJPSBqaWZmaWVzICsgMipIWjsKKwl0cC0+dGltZXIuZnVuY3Rpb24JPSB0bXMzODB0cl90aW1lcl9jaGs7CisJdHAtPnRpbWVyLmRhdGEJCT0gKHVuc2lnbmVkIGxvbmcpZGV2OworCWFkZF90aW1lcigmdHAtPnRpbWVyKTsKKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBUaW1lb3V0IGZ1bmN0aW9uIHdoaWxlIHdhaXRpbmcgZm9yIGV2ZW50CisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX3RpbWVyX2VuZF93YWl0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlKilkYXRhOworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmKHRwLT5TbGVlcGluZykKKwl7CisJCXRwLT5TbGVlcGluZyA9IDA7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHAtPndhaXRfZm9yX3Rva19pbnQpOworCX0KKworCXJldHVybjsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGNoaXBzZXQKKyAqLworc3RhdGljIGludCB0bXMzODB0cl9jaGlwc2V0X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKworCXRtczM4MHRyX2luaXRfaXBiKHRwKTsKKwl0bXMzODB0cl9pbml0X29wYihkZXYpOworCXRtczM4MHRyX2luaXRfbmV0X2xvY2FsKGRldik7CisKKwlpZih0bXMzODB0cl9kZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUmVzZXR0aW5nIGFkYXB0ZXIuLi5cbiIsIGRldi0+bmFtZSk7CisJZXJyID0gdG1zMzgwdHJfcmVzZXRfYWRhcHRlcihkZXYpOworCWlmKGVyciA8IDApCisJCXJldHVybiAoLTEpOworCisJaWYodG1zMzgwdHJfZGVidWcgPiAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEJyaW5ndXAgZGlhZ3MuLi5cbiIsIGRldi0+bmFtZSk7CisJZXJyID0gdG1zMzgwdHJfYnJpbmd1cF9kaWFncyhkZXYpOworCWlmKGVyciA8IDApCisJCXJldHVybiAoLTEpOworCisJaWYodG1zMzgwdHJfZGVidWcgPiAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEluaXQgYWRhcHRlci4uLlxuIiwgZGV2LT5uYW1lKTsKKwllcnIgPSB0bXMzODB0cl9pbml0X2FkYXB0ZXIoZGV2KTsKKwlpZihlcnIgPCAwKQorCQlyZXR1cm4gKC0xKTsKKworCWlmKHRtczM4MHRyX2RlYnVnID4gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBEb25lIVxuIiwgZGV2LT5uYW1lKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogSW5pdGlhbGl6ZXMgdGhlIG5ldF9sb2NhbCBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX2luaXRfbmV0X2xvY2FsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCWRtYV9hZGRyX3QgZG1hYnVmOworCisJdHAtPnNjYi5DTUQJPSAwOworCXRwLT5zY2IuUGFybVswXSA9IDA7CisJdHAtPnNjYi5QYXJtWzFdID0gMDsKKworCXRwLT5zc2IuU1RTCT0gMDsKKwl0cC0+c3NiLlBhcm1bMF0gPSAwOworCXRwLT5zc2IuUGFybVsxXSA9IDA7CisJdHAtPnNzYi5QYXJtWzJdID0gMDsKKworCXRwLT5DTURxdWV1ZQk9IDA7CisKKwl0cC0+QWRhcHRlck9wZW5GbGFnCT0gMDsKKwl0cC0+QWRhcHRlclZpcnRPcGVuRmxhZyA9IDA7CisJdHAtPlNjYkluVXNlCQk9IDA7CisJdHAtPk9wZW5Db21tYW5kSXNzdWVkCT0gMDsKKwl0cC0+UmVPcGVuSW5Qcm9ncmVzcwk9IDA7CisJdHAtPkhhbHRJblByb2dyZXNzCT0gMDsKKwl0cC0+VHJhbnNtaXRIYWx0U2NoZWR1bGVkID0gMDsKKwl0cC0+TG9iZVdpcmVGYXVsdExvZ2dlZAk9IDA7CisJdHAtPkxhc3RPcGVuU3RhdHVzCT0gMDsKKwl0cC0+TWF4UGFja2V0U2l6ZQk9IERFRkFVTFRfUEFDS0VUX1NJWkU7CisKKwkvKiBDcmVhdGUgY2lyY3VsYXIgY2hhaW4gb2YgdHJhbnNtaXQgbGlzdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVFBMX05VTTsgaSsrKQorCXsKKwkJdHAtPlRwbFtpXS5OZXh0VFBMQWRkciA9IGh0b25sKCgoY2hhciAqKSgmdHAtPlRwbFsoaSsxKSAlIFRQTF9OVU1dKSAtIChjaGFyICopdHApICsgdHAtPmRtYWJ1ZmZlcik7IC8qIERNQSBidWZmZXIgbWF5IGJlIE1NVSBkcml2ZW4gKi8KKwkJdHAtPlRwbFtpXS5TdGF0dXMJPSAwOworCQl0cC0+VHBsW2ldLkZyYW1lU2l6ZQk9IDA7CisJCXRwLT5UcGxbaV0uRnJhZ0xpc3RbMF0uRGF0YUNvdW50CT0gMDsKKwkJdHAtPlRwbFtpXS5GcmFnTGlzdFswXS5EYXRhQWRkcgkJPSAwOworCQl0cC0+VHBsW2ldLk5leHRUUExQdHIJPSAmdHAtPlRwbFsoaSsxKSAlIFRQTF9OVU1dOworCQl0cC0+VHBsW2ldLk1EYXRhCT0gTlVMTDsKKwkJdHAtPlRwbFtpXS5UUExJbmRleAk9IGk7CisJCXRwLT5UcGxbaV0uRE1BQnVmZgk9IDA7CisJCXRwLT5UcGxbaV0uQnVzeUZsYWcJPSAwOworCX0KKworCXRwLT5UcGxGcmVlID0gdHAtPlRwbEJ1c3kgPSAmdHAtPlRwbFswXTsKKworCS8qIENyZWF0ZSBjaXJjdWxhciBjaGFpbiBvZiByZWNlaXZlIGxpc3RzICovCisJZm9yIChpID0gMDsgaSA8IFJQTF9OVU07IGkrKykKKwl7CisJCXRwLT5ScGxbaV0uTmV4dFJQTEFkZHIgPSBodG9ubCgoKGNoYXIgKikoJnRwLT5ScGxbKGkrMSkgJSBSUExfTlVNXSkgLSAoY2hhciAqKXRwKSArIHRwLT5kbWFidWZmZXIpOyAvKiBETUEgYnVmZmVyIG1heSBiZSBNTVUgZHJpdmVuICovCisJCXRwLT5ScGxbaV0uU3RhdHVzID0gKFJYX1ZBTElEIHwgUlhfU1RBUlRfRlJBTUUgfCBSWF9FTkRfRlJBTUUgfCBSWF9GUkFNRV9JUlEpOworCQl0cC0+UnBsW2ldLkZyYW1lU2l6ZSA9IDA7CisJCXRwLT5ScGxbaV0uRnJhZ0xpc3RbMF0uRGF0YUNvdW50ID0gY3B1X3RvX2JlMTYoKHVuc2lnbmVkIHNob3J0KXRwLT5NYXhQYWNrZXRTaXplKTsKKworCQkvKiBBbGxvYyBza2IgYW5kIHBvaW50IGFkYXB0ZXIgdG8gZGF0YSBhcmVhICovCisJCXRwLT5ScGxbaV0uU2tiID0gZGV2X2FsbG9jX3NrYih0cC0+TWF4UGFja2V0U2l6ZSk7CisJCQl0cC0+UnBsW2ldLkRNQUJ1ZmYgPSAwOworCisJCS8qIHNrYiA9PSBOVUxMID8gdGhlbiB1c2UgbG9jYWwgYnVmZmVyICovCisJCWlmKHRwLT5ScGxbaV0uU2tiID09IE5VTEwpCisJCXsKKwkJCXRwLT5ScGxbaV0uU2tiU3RhdCA9IFNLQl9VTkFWQUlMQUJMRTsKKwkJCXRwLT5ScGxbaV0uRnJhZ0xpc3RbMF0uRGF0YUFkZHIgPSBodG9ubCgoKGNoYXIgKil0cC0+TG9jYWxSeEJ1ZmZlcnNbaV0gLSAoY2hhciAqKXRwKSArIHRwLT5kbWFidWZmZXIpOworCQkJdHAtPlJwbFtpXS5NRGF0YSA9IHRwLT5Mb2NhbFJ4QnVmZmVyc1tpXTsKKwkJfQorCQllbHNlCS8qIFNLQiAhPSBOVUxMICovCisJCXsKKwkJCXRwLT5ScGxbaV0uU2tiLT5kZXYgPSBkZXY7CisJCQlza2JfcHV0KHRwLT5ScGxbaV0uU2tiLCB0cC0+TWF4UGFja2V0U2l6ZSk7CisKKwkJCS8qIGRhdGEgdW5yZWFjaGFibGUgZm9yIERNQSA/IHRoZW4gdXNlIGxvY2FsIGJ1ZmZlciAqLworCQkJZG1hYnVmID0gcGNpX21hcF9zaW5nbGUodHAtPnBkZXYsIHRwLT5ScGxbaV0uU2tiLT5kYXRhLCB0cC0+TWF4UGFja2V0U2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWlmKHRwLT5kbWFsaW1pdCAmJiAoZG1hYnVmICsgdHAtPk1heFBhY2tldFNpemUgPiB0cC0+ZG1hbGltaXQpKQorCQkJeworCQkJCXRwLT5ScGxbaV0uU2tiU3RhdCA9IFNLQl9EQVRBX0NPUFk7CisJCQkJdHAtPlJwbFtpXS5GcmFnTGlzdFswXS5EYXRhQWRkciA9IGh0b25sKCgoY2hhciAqKXRwLT5Mb2NhbFJ4QnVmZmVyc1tpXSAtIChjaGFyICopdHApICsgdHAtPmRtYWJ1ZmZlcik7CisJCQkJdHAtPlJwbFtpXS5NRGF0YSA9IHRwLT5Mb2NhbFJ4QnVmZmVyc1tpXTsKKwkJCX0KKwkJCWVsc2UJLyogRE1BIGRpcmVjdGx5IGluIHNrYi0+ZGF0YSAqLworCQkJeworCQkJCXRwLT5ScGxbaV0uU2tiU3RhdCA9IFNLQl9ETUFfRElSRUNUOworCQkJCXRwLT5ScGxbaV0uRnJhZ0xpc3RbMF0uRGF0YUFkZHIgPSBodG9ubChkbWFidWYpOworCQkJCXRwLT5ScGxbaV0uTURhdGEgPSB0cC0+UnBsW2ldLlNrYi0+ZGF0YTsKKwkJCQl0cC0+UnBsW2ldLkRNQUJ1ZmYgPSBkbWFidWY7CisJCQl9CisJCX0KKworCQl0cC0+UnBsW2ldLk5leHRSUExQdHIgPSAmdHAtPlJwbFsoaSsxKSAlIFJQTF9OVU1dOworCQl0cC0+UnBsW2ldLlJQTEluZGV4ID0gaTsKKwl9CisKKwl0cC0+UnBsSGVhZCA9ICZ0cC0+UnBsWzBdOworCXRwLT5ScGxUYWlsID0gJnRwLT5ScGxbUlBMX05VTS0xXTsKKwl0cC0+UnBsVGFpbC0+U3RhdHVzID0gKFJYX1NUQVJUX0ZSQU1FIHwgUlhfRU5EX0ZSQU1FIHwgUlhfRlJBTUVfSVJRKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIEluaXRpYWxpemVzIHRoZSBpbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXIgYmxvY2suCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX2luaXRfaXBiKHN0cnVjdCBuZXRfbG9jYWwgKnRwKQoreworCXRwLT5pcGIuSW5pdF9PcHRpb25zCT0gQlVSU1RfTU9ERTsKKwl0cC0+aXBiLkNNRF9TdGF0dXNfSVYJPSAwOworCXRwLT5pcGIuVFhfSVYJCT0gMDsKKwl0cC0+aXBiLlJYX0lWCQk9IDA7CisJdHAtPmlwYi5SaW5nX1N0YXR1c19JVgk9IDA7CisJdHAtPmlwYi5TQ0JfQ2xlYXJfSVYJPSAwOworCXRwLT5pcGIuQWRhcHRlcl9DSEtfSVYJPSAwOworCXRwLT5pcGIuUlhfQnVyc3RfU2l6ZQk9IEJVUlNUX1NJWkU7CisJdHAtPmlwYi5UWF9CdXJzdF9TaXplCT0gQlVSU1RfU0laRTsKKwl0cC0+aXBiLkRNQV9BYm9ydF9UaHJobGQgPSBETUFfUkVUUklFUzsKKwl0cC0+aXBiLlNDQl9BZGRyCT0gMDsKKwl0cC0+aXBiLlNTQl9BZGRyCT0gMDsKKworCXJldHVybjsKK30KKworLyoKKyAqIEluaXRpYWxpemVzIHRoZSBvcGVuIHBhcmFtZXRlciBibG9jay4KKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfaW5pdF9vcGIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cDsKKwl1bnNpZ25lZCBsb25nIEFkZHI7CisJdW5zaWduZWQgc2hvcnQgUnBsU2l6ZSAgICA9IFJQTF9TSVpFOworCXVuc2lnbmVkIHNob3J0IFRwbFNpemUgICAgPSBUUExfU0laRTsKKwl1bnNpZ25lZCBzaG9ydCBCdWZmZXJTaXplID0gQlVGRkVSX1NJWkU7CisJaW50IGk7CisKKwl0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwl0cC0+b2NwbC5PUEVOT3B0aW9ucyAJID0gMDsKKwl0cC0+b2NwbC5PUEVOT3B0aW9ucyAJfD0gRU5BQkxFX0ZVTExfRFVQTEVYX1NFTEVDVElPTjsKKwl0cC0+b2NwbC5GdWxsRHVwbGV4IAkgPSAwOworCXRwLT5vY3BsLkZ1bGxEdXBsZXggCXw9IE9QRU5fRlVMTF9EVVBMRVhfT0ZGOworCisgICAgICAgIC8qIAorCSAqIFNldCBub2RlIGFkZHJlc3MgCisJICoKKwkgKiBXZSBnbyBhaGVhZCBhbmQgcHV0IGl0IGluIHRoZSBPUEIgZXZlbiB0aG91Z2ggb24KKwkgKiBtb3N0IG9mIHRoZSBnZW5lcmljIGFkYXB0ZXJzIHRoaXMgaXNuJ3QgcmVxdWlyZWQuCisJICogSXRzIHNpbXBsZXIgdGhpcyB3YXkuICAtLSBBU0YKKwkgKi8KKyAgICAgICAgZm9yIChpPTA7aTw2O2krKykKKyAgICAgICAgICAgICAgICB0cC0+b2NwbC5Ob2RlQWRkcltpXSA9ICgodW5zaWduZWQgY2hhciAqKWRldi0+ZGV2X2FkZHIpW2ldOworCisJdHAtPm9jcGwuR3JvdXBBZGRyCSA9IDA7CisJdHAtPm9jcGwuRnVuY3RBZGRyCSA9IDA7CisJdHAtPm9jcGwuUnhMaXN0U2l6ZQkgPSBjcHVfdG9fYmUxNigodW5zaWduZWQgc2hvcnQpUnBsU2l6ZSk7CisJdHAtPm9jcGwuVHhMaXN0U2l6ZQkgPSBjcHVfdG9fYmUxNigodW5zaWduZWQgc2hvcnQpVHBsU2l6ZSk7CisJdHAtPm9jcGwuQnVmU2l6ZQkgPSBjcHVfdG9fYmUxNigodW5zaWduZWQgc2hvcnQpQnVmZmVyU2l6ZSk7CisJdHAtPm9jcGwuUmVzZXJ2ZWQJID0gMDsKKwl0cC0+b2NwbC5UWEJ1Zk1pbgkgPSBUWF9CVUZfTUlOOworCXRwLT5vY3BsLlRYQnVmTWF4CSA9IFRYX0JVRl9NQVg7CisKKwlBZGRyID0gaHRvbmwoKChjaGFyICopdHAtPlByb2R1Y3RJRCAtIChjaGFyICopdHApICsgdHAtPmRtYWJ1ZmZlcik7CisKKwl0cC0+b2NwbC5Qcm9kSURBZGRyWzBdCSA9IExPV09SRChBZGRyKTsKKwl0cC0+b2NwbC5Qcm9kSURBZGRyWzFdCSA9IEhJV09SRChBZGRyKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIFNlbmQgT1BFTiBjb21tYW5kIHRvIGFkYXB0ZXIKKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfb3Blbl9hZGFwdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYodHAtPk9wZW5Db21tYW5kSXNzdWVkKQorCQlyZXR1cm47CisKKwl0cC0+T3BlbkNvbW1hbmRJc3N1ZWQgPSAxOworCXRtczM4MHRyX2V4ZWNfY21kKGRldiwgT0NfT1BFTik7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBDbGVhciB0aGUgYWRhcHRlcidzIGludGVycnVwdCBmbGFnLiBDbGVhciBzeXN0ZW0gaW50ZXJydXB0IGVuYWJsZQorICogKFNJTlRFTik6IGRpc2FibGUgYWRhcHRlciB0byBzeXN0ZW0gaW50ZXJydXB0cy4KKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJU0lGV1JJVEVCKDAsIFNJRkFDTCk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBTZXQgdGhlIGFkYXB0ZXIncyBpbnRlcnJ1cHQgZmxhZy4gU2V0IHN5c3RlbSBpbnRlcnJ1cHQgZW5hYmxlCisgKiAoU0lOVEVOKTogZW5hYmxlIGFkYXB0ZXIgdG8gc3lzdGVtIGludGVycnVwdHMuCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX2VuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJU0lGV1JJVEVCKEFDTF9TSU5URU4sIFNJRkFDTCk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBQdXQgY29tbWFuZCBpbiBjb21tYW5kIHF1ZXVlLCB0cnkgdG8gZXhlY3V0ZSBpdC4KKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfZXhlY19jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgQ29tbWFuZCkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwl0cC0+Q01EcXVldWUgfD0gQ29tbWFuZDsKKwl0bXMzODB0cl9jaGtfb3V0c3RhbmRpbmdfY21kcyhkZXYpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCB0bXMzODB0cl90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyoKKwkgKiBJZiB3ZSBnZXQgaGVyZSwgc29tZSBoaWdoZXIgbGV2ZWwgaGFzIGRlY2lkZWQgd2UgYXJlIGJyb2tlbi4KKwkgKiBUaGVyZSBzaG91bGQgcmVhbGx5IGJlIGEgImtpY2sgbWUiIGZ1bmN0aW9uIGNhbGwgaW5zdGVhZC4KKwkgKgorCSAqIFJlc2V0dGluZyB0aGUgdG9rZW4gcmluZyBhZGFwdGVyIHRha2VzIGEgbG9uZyB0aW1lIHNvIGp1c3QKKwkgKiBmYWtlIHRyYW5zbWlzc2lvbiB0aW1lIGFuZCBnbyBvbiB0cnlpbmcuIE91ciBvd24gdGltZW91dAorCSAqIHJvdXRpbmUgaXMgaW4gdG1zMzgwdHJfdGltZXJfY2hrKCkKKwkgKi8KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKKy8qCisgKiBHZXRzIHNrYiBmcm9tIHN5c3RlbSwgcXVldWVzIGl0IGFuZCBjaGVja3MgaWYgaXQgY2FuIGJlIHNlbnQKKyAqLworc3RhdGljIGludCB0bXMzODB0cl9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyOworCisJZXJyID0gdG1zMzgwdHJfaGFyZHdhcmVfc2VuZF9wYWNrZXQoc2tiLCBkZXYpOworCWlmKHRwLT5UcGxGcmVlLT5OZXh0VFBMUHRyLT5CdXN5RmxhZykKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXJldHVybiAoZXJyKTsKK30KKworLyoKKyAqIE1vdmUgZnJhbWVzIGludG8gYWRhcHRlciB0eCBxdWV1ZQorICovCitzdGF0aWMgaW50IHRtczM4MHRyX2hhcmR3YXJlX3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJVFBMICp0cGw7CisJc2hvcnQgbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCWRtYV9hZGRyX3QgZG1hYnVmLCBuZXdidWY7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgCisJLyogVHJ5IHRvIGdldCBhIGZyZWUgVFBMIGZyb20gdGhlIGNoYWluLgorCSAqCisJICogTk9URTogV2UgKm11c3QqIGFsd2F5cyBsZWF2ZSBvbmUgdW51c2VkIFRQTCBpbiB0aGUgY2hhaW4sCisJICogYmVjYXVzZSBvdGhlcndpc2UgdGhlIGFkYXB0ZXIgbWlnaHQgc2VuZCBmcmFtZXMgdHdpY2UuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CisJaWYodHAtPlRwbEZyZWUtPk5leHRUUExQdHItPkJ1c3lGbGFnKSAgeyAvKiBObyBmcmVlIFRQTCAqLworCQlpZiAodG1zMzgwdHJfZGVidWcgPiAwKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBObyBmcmVlIFRQTFxuIiwgZGV2LT5uYW1lKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZG1hYnVmID0gMDsKKworCS8qIElzIGJ1ZmZlciByZWFjaGFibGUgZm9yIEJ1c21hc3Rlci1ETUE/ICovCisKKwlsZW5ndGgJPSBza2ItPmxlbjsKKwlkbWFidWYgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGRldiwgc2tiLT5kYXRhLCBsZW5ndGgsIFBDSV9ETUFfVE9ERVZJQ0UpOworCWlmKHRwLT5kbWFsaW1pdCAmJiAoZG1hYnVmICsgbGVuZ3RoID4gdHAtPmRtYWxpbWl0KSkgeworCQkvKiBDb3B5IGZyYW1lIHRvIGxvY2FsIGJ1ZmZlciAqLworCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCBkbWFidWYsIGxlbmd0aCwgUENJX0RNQV9UT0RFVklDRSk7CisJCWRtYWJ1ZiAgPSAwOworCQlpIAk9IHRwLT5UcGxGcmVlLT5UUExJbmRleDsKKwkJYnVmIAk9IHRwLT5Mb2NhbFR4QnVmZmVyc1tpXTsKKwkJbWVtY3B5KGJ1Ziwgc2tiLT5kYXRhLCBsZW5ndGgpOworCQluZXdidWYgCT0gKChjaGFyICopYnVmIC0gKGNoYXIgKil0cCkgKyB0cC0+ZG1hYnVmZmVyOworCX0KKwllbHNlIHsKKwkJLyogU2VuZCBkaXJlY3QgZnJvbSBza2ItPmRhdGEgKi8KKwkJbmV3YnVmCT0gZG1hYnVmOworCQlidWYJPSBza2ItPmRhdGE7CisJfQorCS8qIFNvdXJjZSBhZGRyZXNzIGluIHBhY2tldD8gKi8KKwl0bXMzODB0cl9jaGtfc3JjX2FkZHIoYnVmLCBkZXYtPmRldl9hZGRyKTsKKwl0cC0+TGFzdFNlbmRUaW1lCT0gamlmZmllczsKKwl0cGwgCQkJPSB0cC0+VHBsRnJlZTsJLyogR2V0IHRoZSAiZnJlZSIgVFBMICovCisJdHBsLT5CdXN5RmxhZyAJCT0gMTsJCS8qIE1hcmsgVFBMIGFzIGJ1c3kgKi8KKwl0cC0+VHBsRnJlZSAJCT0gdHBsLT5OZXh0VFBMUHRyOworICAgIAorCS8qIFNhdmUgdGhlIHNrYiBmb3IgZGVsYXllZCByZXR1cm4gb2Ygc2tiIHRvIHN5c3RlbSAqLworCXRwbC0+U2tiID0gc2tiOworCXRwbC0+RE1BQnVmZiA9IGRtYWJ1ZjsKKwl0cGwtPkZyYWdMaXN0WzBdLkRhdGFDb3VudCA9IGNwdV90b19iZTE2KCh1bnNpZ25lZCBzaG9ydClsZW5ndGgpOworCXRwbC0+RnJhZ0xpc3RbMF0uRGF0YUFkZHIgID0gaHRvbmwobmV3YnVmKTsKKworCS8qIFdyaXRlIHRoZSBkYXRhIGxlbmd0aCBpbiB0aGUgdHJhbnNtaXQgbGlzdC4gKi8KKwl0cGwtPkZyYW1lU2l6ZSAJPSBjcHVfdG9fYmUxNigodW5zaWduZWQgc2hvcnQpbGVuZ3RoKTsKKwl0cGwtPk1EYXRhIAk9IGJ1ZjsKKworCS8qIFRyYW5zbWl0IHRoZSBmcmFtZSBhbmQgc2V0IHRoZSBzdGF0dXMgdmFsdWVzLiAqLworCXRtczM4MHRyX3dyaXRlX3RwbF9zdGF0dXModHBsLCBUWF9WQUxJRCB8IFRYX1NUQVJUX0ZSQU1FCisJCQkJfCBUWF9FTkRfRlJBTUUgfCBUWF9QQVNTX1NSQ19BRERSCisJCQkJfCBUWF9GUkFNRV9JUlEpOworCisJLyogTGV0IGFkYXB0ZXIgc2VuZCB0aGUgZnJhbWUuICovCisJdG1zMzgwdHJfZXhlY19zaWZjbWQoZGV2LCBDTURfVFhfVkFMSUQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdyaXRlIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgJ1N0YXR1cycgZmllbGQgb2YgdGhlIHNwZWNpZmllZCBUUEwuCisgKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIHdoZW5ldmVyIHRoZSBzdGF0dXMgb2YgYW55IFRQTCBtdXN0IGJlCisgKiBtb2RpZmllZCBieSB0aGUgZHJpdmVyLCBiZWNhdXNlIHRoZSBjb21waWxlciBtYXkgb3RoZXJ3aXNlIGNoYW5nZSB0aGUKKyAqIG9yZGVyIG9mIGluc3RydWN0aW9ucyBzdWNoIHRoYXQgd3JpdGluZyB0aGUgVFBMIHN0YXR1cyBtYXkgYmUgZXhlY3V0ZWQgYXQKKyAqIGFuIHVuZGVzaXJlYWJsZSB0aW1lLiBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCwgdGhlIHN0YXR1cyBpcyBhbHdheXMKKyAqIHdyaXR0ZW4gd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLgorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl93cml0ZV90cGxfc3RhdHVzKFRQTCAqdHBsLCB1bnNpZ25lZCBpbnQgU3RhdHVzKQoreworCXRwbC0+U3RhdHVzID0gU3RhdHVzOworfQorCitzdGF0aWMgdm9pZCB0bXMzODB0cl9jaGtfc3JjX2FkZHIodW5zaWduZWQgY2hhciAqZnJhbWUsIHVuc2lnbmVkIGNoYXIgKmh3X2FkZHIpCit7CisJdW5zaWduZWQgY2hhciBTUkJpdDsKKworCWlmKCgoKHVuc2lnbmVkIGxvbmcpZnJhbWVbOF0pICYgfjB4ODApICE9IDApCS8qIENvbXBhcmUgNCBieXRlcyAqLworCQlyZXR1cm47CisJaWYoKHVuc2lnbmVkIHNob3J0KWZyYW1lWzEyXSAhPSAwKQkJLyogQ29tcGFyZSAyIGJ5dGVzICovCisJCXJldHVybjsKKworCVNSQml0ID0gZnJhbWVbOF0gJiAweDgwOworCW1lbWNweSgmZnJhbWVbOF0sIGh3X2FkZHIsIDYpOworCWZyYW1lWzhdIHw9IFNSQml0OworCisJcmV0dXJuOworfQorCisvKgorICogVGhlIHRpbWVyIHJvdXRpbmU6IENoZWNrIGlmIGFkYXB0ZXIgc3RpbGwgb3BlbiBhbmQgd29ya2luZywgcmVvcGVuIGlmIG5vdC4gCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX3RpbWVyX2Noayh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSopZGF0YTsKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZih0cC0+SGFsdEluUHJvZ3Jlc3MpCisJCXJldHVybjsKKworCXRtczM4MHRyX2Noa19vdXRzdGFuZGluZ19jbWRzKGRldik7CisJaWYodGltZV9iZWZvcmUodHAtPkxhc3RTZW5kVGltZSArIFNFTkRfVElNRU9VVCwgamlmZmllcykKKwkJJiYgKHRwLT5UcGxGcmVlICE9IHRwLT5UcGxCdXN5KSkKKwl7CisJCS8qIEFueXRoaW5nIHRvIHNlbmQsIGJ1dCBzdGFsbGVkIHRvbyBsb25nICovCisJCXRwLT5MYXN0U2VuZFRpbWUgPSBqaWZmaWVzOworCQl0bXMzODB0cl9leGVjX2NtZChkZXYsIE9DX0NMT1NFKTsJLyogRG9lcyByZW9wZW4gYXV0b21hdGljYWxseSAqLworCX0KKworCXRwLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIDIqSFo7CisJYWRkX3RpbWVyKCZ0cC0+dGltZXIpOworCisJaWYodHAtPkFkYXB0ZXJPcGVuRmxhZyB8fCB0cC0+UmVPcGVuSW5Qcm9ncmVzcykKKwkJcmV0dXJuOworCXRwLT5SZU9wZW5JblByb2dyZXNzID0gMTsKKwl0bXMzODB0cl9vcGVuX2FkYXB0ZXIoZGV2KTsKKworCXJldHVybjsKK30KKworLyoKKyAqIFRoZSB0eXBpY2FsIHdvcmtsb2FkIG9mIHRoZSBkcml2ZXI6IEhhbmRsZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaW50ZXJydXB0cy4KKyAqLworaXJxcmV0dXJuX3QgdG1zMzgwdHJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cDsKKwl1bnNpZ25lZCBzaG9ydCBpcnFfdHlwZTsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlpZihkZXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGRldi0+bmFtZSwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCXRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlycV90eXBlID0gU0lGUkVBRFcoU0lGU1RTKTsKKworCXdoaWxlKGlycV90eXBlICYgU1RTX1NZU1RFTV9JUlEpIHsKKwkJaGFuZGxlZCA9IDE7CisJCWlycV90eXBlICY9IFNUU19JUlFfTUFTSzsKKworCQlpZighdG1zMzgwdHJfY2hrX3NzYih0cCwgaXJxX3R5cGUpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERBVEEgTEFURSBvY2N1cnJlZFxuIiwgZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoKGlycV90eXBlKSB7CisJCWNhc2UgU1RTX0lSUV9SRUNFSVZFX1NUQVRVUzoKKwkJCXRtczM4MHRyX3Jlc2V0X2ludGVycnVwdChkZXYpOworCQkJdG1zMzgwdHJfcmN2X3N0YXR1c19pcnEoZGV2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1RTX0lSUV9UUkFOU01JVF9TVEFUVVM6CisJCQkvKiBDaGVjayBpZiBUUkFOU01JVC5IQUxUIGNvbW1hbmQgaXMgY29tcGxldGUgKi8KKwkJCWlmKHRwLT5zc2IuUGFybVswXSAmIENPTU1BTkRfQ09NUExFVEUpIHsKKwkJCQl0cC0+VHJhbnNtaXRDb21tYW5kQWN0aXZlID0gMDsKKwkJCQkJdHAtPlRyYW5zbWl0SGFsdFNjaGVkdWxlZCA9IDA7CisKKwkJCQkJLyogSXNzdWUgYSBuZXcgdHJhbnNtaXQgY29tbWFuZC4gKi8KKwkJCQkJdG1zMzgwdHJfZXhlY19jbWQoZGV2LCBPQ19UUkFOU01JVCk7CisJCQkJfQorCisJCQkJdG1zMzgwdHJfcmVzZXRfaW50ZXJydXB0KGRldik7CisJCQkJdG1zMzgwdHJfdHhfc3RhdHVzX2lycShkZXYpOworCQkJCWJyZWFrOworCisJCWNhc2UgU1RTX0lSUV9DT01NQU5EX1NUQVRVUzoKKwkJCS8qIFRoZSBTU0IgY29udGFpbnMgc3RhdHVzIG9mIGxhc3QgY29tbWFuZAorCQkJICogb3RoZXIgdGhhbiByZWNlaXZlL3RyYW5zbWl0LgorCQkJICovCisJCQl0bXMzODB0cl9jbWRfc3RhdHVzX2lycShkZXYpOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBTVFNfSVJRX1NDQl9DTEVBUjoKKwkJCS8qIFRoZSBTQ0IgaXMgZnJlZSBmb3IgYW5vdGhlciBjb21tYW5kLiAqLworCQkJdHAtPlNjYkluVXNlID0gMDsKKwkJCXRtczM4MHRyX2Noa19vdXRzdGFuZGluZ19jbWRzKGRldik7CisJCQlicmVhazsKKwkJCQorCQljYXNlIFNUU19JUlFfUklOR19TVEFUVVM6CisJCQl0bXMzODB0cl9yaW5nX3N0YXR1c19pcnEoZGV2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1RTX0lSUV9BREFQVEVSX0NIRUNLOgorCQkJdG1zMzgwdHJfY2hrX2lycShkZXYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTVFNfSVJRX0xMQ19TVEFUVVM6CisJCQlwcmludGsoS0VSTl9ERUJVRyAidG1zMzgwdHI6IHVuZXhwZWN0ZWQgTExDIHN0YXR1cyBJUlFcbiIpOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBTVFNfSVJRX1RJTUVSOgorCQkJcHJpbnRrKEtFUk5fREVCVUcgInRtczM4MHRyOiB1bmV4cGVjdGVkIFRpbWVyIElSUVxuIik7CisJCQlicmVhazsKKwkJCQorCQljYXNlIFNUU19JUlFfUkVDRUlWRV9QRU5ESU5HOgorCQkJcHJpbnRrKEtFUk5fREVCVUcgInRtczM4MHRyOiB1bmV4cGVjdGVkIFJlY2VpdmUgUGVuZGluZyBJUlFcbiIpOworCQkJYnJlYWs7CisJCQkKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0RFQlVHICJVbmtub3duIFRva2VuIFJpbmcgSVJRICgweCUwNHgpXG4iLCBpcnFfdHlwZSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFJlc2V0IHN5c3RlbSBpbnRlcnJ1cHQgaWYgbm90IGFscmVhZHkgZG9uZS4gKi8KKwkJaWYoaXJxX3R5cGUgIT0gU1RTX0lSUV9UUkFOU01JVF9TVEFUVVMKKwkJCSYmIGlycV90eXBlICE9IFNUU19JUlFfUkVDRUlWRV9TVEFUVVMpIHsKKwkJCXRtczM4MHRyX3Jlc2V0X2ludGVycnVwdChkZXYpOworCQl9CisKKwkJaXJxX3R5cGUgPSBTSUZSRUFEVyhTSUZTVFMpOworCX0KKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKgorICogIFJlc2V0IHRoZSBJTlRFUlJVUFQgU1lTVEVNIGJpdCBhbmQgaXNzdWUgU1NCIENMRUFSIGNvbW1hbmQuCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX3Jlc2V0X2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlTU0IgKnNzYiA9ICZ0cC0+c3NiOworCisJLyoKKwkgKiBbV29ya2Fyb3VuZCBmb3IgIkRhdGEgTGF0ZSJdCisJICogU2V0IGFsbCBmaWVsZHMgb2YgdGhlIFNTQiB0byB3ZWxsLWRlZmluZWQgdmFsdWVzIHNvIHdlIGNhbgorCSAqIGNoZWNrIGlmIHRoZSBhZGFwdGVyIGhhcyB3cml0dGVuIHRoZSBTU0IuCisJICovCisKKwlzc2ItPlNUUwk9ICh1bnNpZ25lZCBzaG9ydCkgLTE7CisJc3NiLT5QYXJtWzBdIAk9ICh1bnNpZ25lZCBzaG9ydCkgLTE7CisJc3NiLT5QYXJtWzFdIAk9ICh1bnNpZ25lZCBzaG9ydCkgLTE7CisJc3NiLT5QYXJtWzJdIAk9ICh1bnNpZ25lZCBzaG9ydCkgLTE7CisKKwkvKiBGcmVlIFNTQiBieSBpc3N1aW5nIFNTQl9DTEVBUiBjb21tYW5kIGFmdGVyIHJlYWRpbmcgSVJRIGNvZGUKKwkgKiBhbmQgY2xlYXIgU1RTX1NZU1RFTV9JUlEgYml0OiBlbmFibGUgYWRhcHRlciBmb3IgZnVydGhlciBpbnRlcnJ1cHRzLgorCSAqLworCXRtczM4MHRyX2V4ZWNfc2lmY21kKGRldiwgQ01EX1NTQl9DTEVBUiB8IENNRF9DTEVBUl9TWVNURU1fSVJRKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZSBTU0IgaGFzIGFjdHVhbGx5IGJlZW4gd3JpdHRlbiBieSB0aGUgYWRhcHRlci4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgdG1zMzgwdHJfY2hrX3NzYihzdHJ1Y3QgbmV0X2xvY2FsICp0cCwgdW5zaWduZWQgc2hvcnQgSXJxVHlwZSkKK3sKKwlTU0IgKnNzYiA9ICZ0cC0+c3NiOwkvKiBUaGUgYWRkcmVzcyBvZiB0aGUgU1NCLiAqLworCisJLyogQyAwIDEgMiBJTlRFUlJVUFQgQ09ERQorCSAqIC0gLSAtIC0gLS0tLS0tLS0tLS0tLS0KKwkgKiAxIDEgMSAxIFRSQU5TTUlUIFNUQVRVUworCSAqIDEgMSAxIDEgUkVDRUlWRSBTVEFUVVMKKwkgKiAxID8gPyAwIENPTU1BTkQgU1RBVFVTCisJICogMCAwIDAgMCBTQ0IgQ0xFQVIKKwkgKiAxIDEgMCAwIFJJTkcgU1RBVFVTCisJICogMCAwIDAgMCBBREFQVEVSIENIRUNLCisJICoKKwkgKiAwID0gU1NCIGZpZWxkIG5vdCBhZmZlY3RlZCBieSBpbnRlcnJ1cHQKKwkgKiAxID0gU1NCIGZpZWxkIGlzIGFmZmVjdGVkIGJ5IGludGVycnVwdAorCSAqCisJICogQyA9IFNTQiBBRERSRVNTICswOiBDT01NQU5ECisJICogMCA9IFNTQiBBRERSRVNTICsyOiBTVEFUVVMgMAorCSAqIDEgPSBTU0IgQUREUkVTUyArNDogU1RBVFVTIDEKKwkgKiAyID0gU1NCIEFERFJFU1MgKzY6IFNUQVRVUyAyCisJICovCisKKwkvKiBDaGVjayBpZiB0aGlzIGludGVycnVwdCBkb2VzIHVzZSB0aGUgU1NCLiAqLworCisJaWYoSXJxVHlwZSAhPSBTVFNfSVJRX1RSQU5TTUlUX1NUQVRVUworCQkmJiBJcnFUeXBlICE9IFNUU19JUlFfUkVDRUlWRV9TVEFUVVMKKwkJJiYgSXJxVHlwZSAhPSBTVFNfSVJRX0NPTU1BTkRfU1RBVFVTCisJCSYmIElycVR5cGUgIT0gU1RTX0lSUV9SSU5HX1NUQVRVUykKKwl7CisJCXJldHVybiAoMSk7CS8qIFNTQiBub3QgaW52b2x2ZWQuICovCisJfQorCisJLyogTm90ZTogQWxsIGZpZWxkcyBvZiB0aGUgU1NCIGhhdmUgYmVlbiBzZXQgdG8gYWxsIG9uZXMgKC0xKSBhZnRlciBpdAorCSAqIGhhcyBsYXN0IGJlZW4gdXNlZCBieSB0aGUgc29mdHdhcmUgKHNlZSBEcml2ZXJJc3IoKSkuCisJICoKKwkgKiBDaGVjayBpZiB0aGUgYWZmZWN0ZWQgU1NCIGZpZWxkcyBhcmUgc3RpbGwgdW5jaGFuZ2VkLgorCSAqLworCisJaWYoc3NiLT5TVFMgPT0gKHVuc2lnbmVkIHNob3J0KSAtMSkKKwkJcmV0dXJuICgwKTsJLyogQ29tbWFuZCBmaWVsZCBub3QgeWV0IGF2YWlsYWJsZS4gKi8KKwlpZihJcnFUeXBlID09IFNUU19JUlFfQ09NTUFORF9TVEFUVVMpCisJCXJldHVybiAoMSk7CS8qIFN0YXR1cyBmaWVsZHMgbm90IGFsd2F5cyBhZmZlY3RlZC4gKi8KKwlpZihzc2ItPlBhcm1bMF0gPT0gKHVuc2lnbmVkIHNob3J0KSAtMSkKKwkJcmV0dXJuICgwKTsJLyogU3RhdHVzIDEgZmllbGQgbm90IHlldCBhdmFpbGFibGUuICovCisJaWYoSXJxVHlwZSA9PSBTVFNfSVJRX1JJTkdfU1RBVFVTKQorCQlyZXR1cm4gKDEpOwkvKiBTdGF0dXMgMiAmIDMgZmllbGRzIG5vdCBhZmZlY3RlZC4gKi8KKworCS8qIE5vdGU6IEF0IHRoaXMgcG9pbnQsIHRoZSBpbnRlcnJ1cHQgaXMgZWl0aGVyIFRSQU5TTUlUIG9yIFJFQ0VJVkUuICovCisJaWYoc3NiLT5QYXJtWzFdID09ICh1bnNpZ25lZCBzaG9ydCkgLTEpCisJCXJldHVybiAoMCk7CS8qIFN0YXR1cyAyIGZpZWxkIG5vdCB5ZXQgYXZhaWxhYmxlLiAqLworCWlmKHNzYi0+UGFybVsyXSA9PSAodW5zaWduZWQgc2hvcnQpIC0xKQorCQlyZXR1cm4gKDApOwkvKiBTdGF0dXMgMyBmaWVsZCBub3QgeWV0IGF2YWlsYWJsZS4gKi8KKworCXJldHVybiAoMSk7CS8qIEFsbCBTU0IgZmllbGRzIGhhdmUgYmVlbiB3cml0dGVuIGJ5IHRoZSBhZGFwdGVyLiAqLworfQorCisvKgorICogRXZhbHVhdGVzIHRoZSBjb21tYW5kIHJlc3VsdHMgc3RhdHVzIGluIHRoZSBTU0Igc3RhdHVzIGZpZWxkLgorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl9jbWRfc3RhdHVzX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBzaG9ydCBzc2JfY21kLCBzc2JfcGFybV8wOworCXVuc2lnbmVkIHNob3J0IHNzYl9wYXJtXzE7CisJY2hhciAqb3Blbl9lcnIgPSAiT3BlbiBlcnJvciAtIjsKKwljaGFyICpjb2RlX2VyciA9ICJPcGVuIGNvZGUgLSI7CisKKwkvKiBDb3B5IHRoZSBzc2IgdmFsdWVzIHRvIGxvY2FsIHZhcmlhYmxlcyAqLworCXNzYl9jbWQgICAgPSB0cC0+c3NiLlNUUzsKKwlzc2JfcGFybV8wID0gdHAtPnNzYi5QYXJtWzBdOworCXNzYl9wYXJtXzEgPSB0cC0+c3NiLlBhcm1bMV07CisKKwlpZihzc2JfY21kID09IE9QRU4pCisJeworCQl0cC0+U2xlZXBpbmcgPSAwOworCQlpZighdHAtPlJlT3BlbkluUHJvZ3Jlc3MpCisJICAgIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0cC0+d2FpdF9mb3JfdG9rX2ludCk7CisKKwkJdHAtPk9wZW5Db21tYW5kSXNzdWVkID0gMDsKKwkJdHAtPlNjYkluVXNlID0gMDsKKworCQlpZigoc3NiX3Bhcm1fMCAmIDB4MDBGRikgPT0gR09PRF9DT01QTEVUSU9OKQorCQl7CisJCQkvKiBTdWNjZXNzLCB0aGUgYWRhcHRlciBpcyBvcGVuLiAqLworCQkJdHAtPkxvYmVXaXJlRmF1bHRMb2dnZWQJPSAwOworCQkJdHAtPkFkYXB0ZXJPcGVuRmxhZyAJPSAxOworCQkJdHAtPkFkYXB0ZXJWaXJ0T3BlbkZsYWcgPSAxOworCQkJdHAtPlRyYW5zbWl0Q29tbWFuZEFjdGl2ZSA9IDA7CisJCQl0bXMzODB0cl9leGVjX2NtZChkZXYsIE9DX1RSQU5TTUlUKTsKKwkJCXRtczM4MHRyX2V4ZWNfY21kKGRldiwgT0NfUkVDRUlWRSk7CisKKwkJCWlmKHRwLT5SZU9wZW5JblByb2dyZXNzKQorCQkJCXRwLT5SZU9wZW5JblByb2dyZXNzID0gMDsKKworCQkJcmV0dXJuOworCQl9CisJCWVsc2UgCS8qIFRoZSBhZGFwdGVyIGRpZCBub3Qgb3Blbi4gKi8KKwkJeworCSAgICAJCWlmKHNzYl9wYXJtXzAgJiBOT0RFX0FERFJfRVJST1IpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vZGUgYWRkcmVzcyBlcnJvclxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkgICAgCQlpZihzc2JfcGFybV8wICYgTElTVF9TSVpFX0VSUk9SKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaXN0IHNpemUgZXJyb3JcbiIsCisJCQkJCWRldi0+bmFtZSk7CisJICAgIAkJaWYoc3NiX3Bhcm1fMCAmIEJVRl9TSVpFX0VSUk9SKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBCdWZmZXIgc2l6ZSBlcnJvclxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkgICAgCQlpZihzc2JfcGFybV8wICYgVFhfQlVGX0NPVU5UX0VSUk9SKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUeCBidWZmZXIgY291bnQgZXJyb3JcbiIsCisJCQkJCWRldi0+bmFtZSk7CisJICAgIAkJaWYoc3NiX3Bhcm1fMCAmIElOVkFMSURfT1BFTl9PUFRJT04pCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludmFsaWQgb3BlbiBvcHRpb25cbiIsCisJCQkJCWRldi0+bmFtZSk7CisJICAgIAkJaWYoc3NiX3Bhcm1fMCAmIE9QRU5fRVJST1IpCisJCQl7CisJCQkJLyogU2hvdyB0aGUgb3BlbiBwaGFzZS4gKi8KKwkJCQlzd2l0Y2goc3NiX3Bhcm1fMCAmIE9QRU5fUEhBU0VTX01BU0spCisJCQkJeworCQkJCQljYXNlIExPQkVfTUVESUFfVEVTVDoKKwkJCQkJCWlmKCF0cC0+TG9iZVdpcmVGYXVsdExvZ2dlZCkKKwkJCQkJCXsKKwkJCQkJCQl0cC0+TG9iZVdpcmVGYXVsdExvZ2dlZCA9IDE7CisJCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIExvYmUgd2lyZSBmYXVsdCAoY2hlY2sgY2FibGUgISkuXG4iLCBkZXYtPm5hbWUsIG9wZW5fZXJyKTsKKwkJICAgIAkJCQl9CisJCQkJCQl0cC0+UmVPcGVuSW5Qcm9ncmVzcwk9IDE7CisJCQkJCQl0cC0+QWRhcHRlck9wZW5GbGFnIAk9IDA7CisJCQkJCQl0cC0+QWRhcHRlclZpcnRPcGVuRmxhZyA9IDE7CisJCQkJCQl0bXMzODB0cl9vcGVuX2FkYXB0ZXIoZGV2KTsKKwkJCQkJCXJldHVybjsKKworCQkJCQljYXNlIFBIWVNJQ0FMX0lOU0VSVElPTjoKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBQaHlzaWNhbCBpbnNlcnRpb24uXG4iLCBkZXYtPm5hbWUsIG9wZW5fZXJyKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgQUREUkVTU19WRVJJRklDQVRJT046CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgQWRkcmVzcyB2ZXJpZmljYXRpb24uXG4iLCBkZXYtPm5hbWUsIG9wZW5fZXJyKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgUEFSVElDSVBBVElPTl9JTl9SSU5HX1BPTEw6CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgUGFydGljaXBhdGlvbiBpbiByaW5nIHBvbGwuXG4iLCBkZXYtPm5hbWUsIG9wZW5fZXJyKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgUkVRVUVTVF9JTklUSUFMSVNBVElPTjoKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBSZXF1ZXN0IGluaXRpYWxpc2F0aW9uLlxuIiwgZGV2LT5uYW1lLCBvcGVuX2Vycik7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIEZVTExEVVBMRVhfQ0hFQ0s6CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgRnVsbCBkdXBsZXggY2hlY2suXG4iLCBkZXYtPm5hbWUsIG9wZW5fZXJyKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgVW5rbm93biBvcGVuIHBoYXNlXG4iLCBkZXYtPm5hbWUsIG9wZW5fZXJyKTsKKwkJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIFNob3cgdGhlIG9wZW4gZXJyb3JzLiAqLworCQkJCXN3aXRjaChzc2JfcGFybV8wICYgT1BFTl9FUlJPUl9DT0RFU19NQVNLKQorCQkJCXsKKwkJCQkJY2FzZSBPUEVOX0ZVTkNUSU9OX0ZBSUxVUkU6CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgT1BFTl9GVU5DVElPTl9GQUlMVVJFIiwgZGV2LT5uYW1lLCBjb2RlX2Vycik7CisJCQkJCQl0cC0+TGFzdE9wZW5TdGF0dXMgPQorCQkJCQkJCU9QRU5fRlVOQ1RJT05fRkFJTFVSRTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgT1BFTl9TSUdOQUxfTE9TUzoKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBPUEVOX1NJR05BTF9MT1NTXG4iLCBkZXYtPm5hbWUsIGNvZGVfZXJyKTsKKwkJCQkJCXRwLT5MYXN0T3BlblN0YXR1cyA9CisJCQkJCQkJT1BFTl9TSUdOQUxfTE9TUzsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgT1BFTl9USU1FT1VUOgorCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIE9QRU5fVElNRU9VVFxuIiwgZGV2LT5uYW1lLCBjb2RlX2Vycik7CisJCQkJCQl0cC0+TGFzdE9wZW5TdGF0dXMgPQorCQkJCQkJCU9QRU5fVElNRU9VVDsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgT1BFTl9SSU5HX0ZBSUxVUkU6CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgT1BFTl9SSU5HX0ZBSUxVUkVcbiIsIGRldi0+bmFtZSwgY29kZV9lcnIpOworCQkJCQkJdHAtPkxhc3RPcGVuU3RhdHVzID0KKwkJCQkJCQlPUEVOX1JJTkdfRkFJTFVSRTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgT1BFTl9SSU5HX0JFQUNPTklORzoKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBPUEVOX1JJTkdfQkVBQ09OSU5HXG4iLCBkZXYtPm5hbWUsIGNvZGVfZXJyKTsKKwkJCQkJCXRwLT5MYXN0T3BlblN0YXR1cyA9CisJCQkJCQkJT1BFTl9SSU5HX0JFQUNPTklORzsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgT1BFTl9EVVBMSUNBVEVfTk9ERUFERFI6CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgT1BFTl9EVVBMSUNBVEVfTk9ERUFERFJcbiIsIGRldi0+bmFtZSwgY29kZV9lcnIpOworCQkJCQkJdHAtPkxhc3RPcGVuU3RhdHVzID0KKwkJCQkJCQlPUEVOX0RVUExJQ0FURV9OT0RFQUREUjsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgT1BFTl9SRVFVRVNUX0lOSVQ6CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgT1BFTl9SRVFVRVNUX0lOSVRcbiIsIGRldi0+bmFtZSwgY29kZV9lcnIpOworCQkJCQkJdHAtPkxhc3RPcGVuU3RhdHVzID0KKwkJCQkJCQlPUEVOX1JFUVVFU1RfSU5JVDsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgT1BFTl9SRU1PVkVfUkVDRUlWRUQ6CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgT1BFTl9SRU1PVkVfUkVDRUlWRUQiLCBkZXYtPm5hbWUsIGNvZGVfZXJyKTsKKwkJCQkJCXRwLT5MYXN0T3BlblN0YXR1cyA9CisJCQkJCQkJT1BFTl9SRU1PVkVfUkVDRUlWRUQ7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIE9QRU5fRlVMTERVUExFWF9TRVQ6CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgT1BFTl9GVUxMRFVQTEVYX1NFVFxuIiwgZGV2LT5uYW1lLCBjb2RlX2Vycik7CisJCQkJCQl0cC0+TGFzdE9wZW5TdGF0dXMgPQorCQkJCQkJCU9QRU5fRlVMTERVUExFWF9TRVQ7CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0OgorCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIFVua25vd24gb3BlbiBlcnIgY29kZSIsIGRldi0+bmFtZSwgY29kZV9lcnIpOworCQkJCQkJdHAtPkxhc3RPcGVuU3RhdHVzID0KKwkJCQkJCQlPUEVOX0ZVTkNUSU9OX0ZBSUxVUkU7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCXRwLT5BZGFwdGVyT3BlbkZsYWcgCT0gMDsKKwkJCXRwLT5BZGFwdGVyVmlydE9wZW5GbGFnID0gMDsKKworCQkJcmV0dXJuOworCQl9CisJfQorCWVsc2UKKwl7CisJCWlmKHNzYl9jbWQgIT0gUkVBRF9FUlJPUl9MT0cpCisJCQlyZXR1cm47CisKKwkJLyogQWRkIHZhbHVlcyBmcm9tIHRoZSBlcnJvciBsb2cgdGFibGUgdG8gdGhlIE1BQworCQkgKiBzdGF0aXN0aWNzIGNvdW50ZXJzIGFuZCB1cGRhdGUgdGhlIGVycm9ybG9ndGFibGUKKwkJICogbWVtb3J5LgorCQkgKi8KKwkJdHAtPk1hY1N0YXQubGluZV9lcnJvcnMgKz0gdHAtPmVycm9ybG9ndGFibGUuTGluZV9FcnJvcjsKKwkJdHAtPk1hY1N0YXQuYnVyc3RfZXJyb3JzICs9IHRwLT5lcnJvcmxvZ3RhYmxlLkJ1cnN0X0Vycm9yOworCQl0cC0+TWFjU3RhdC5BX0NfZXJyb3JzICs9IHRwLT5lcnJvcmxvZ3RhYmxlLkFSSV9GQ0lfRXJyb3I7CisJCXRwLT5NYWNTdGF0Lmxvc3RfZnJhbWVzICs9IHRwLT5lcnJvcmxvZ3RhYmxlLkxvc3RfRnJhbWVfRXJyb3I7CisJCXRwLT5NYWNTdGF0LnJlY3ZfY29uZ2VzdF9jb3VudCArPSB0cC0+ZXJyb3Jsb2d0YWJsZS5SeF9Db25nZXN0X0Vycm9yOworCQl0cC0+TWFjU3RhdC5yeF9lcnJvcnMgKz0gdHAtPmVycm9ybG9ndGFibGUuUnhfQ29uZ2VzdF9FcnJvcjsKKwkJdHAtPk1hY1N0YXQuZnJhbWVfY29waWVkX2Vycm9ycyArPSB0cC0+ZXJyb3Jsb2d0YWJsZS5GcmFtZV9Db3BpZWRfRXJyb3I7CisJCXRwLT5NYWNTdGF0LnRva2VuX2Vycm9ycyArPSB0cC0+ZXJyb3Jsb2d0YWJsZS5Ub2tlbl9FcnJvcjsKKwkJdHAtPk1hY1N0YXQuZHVtbXkxICs9IHRwLT5lcnJvcmxvZ3RhYmxlLkRNQV9CdXNfRXJyb3I7CisJCXRwLT5NYWNTdGF0LmR1bW15MSArPSB0cC0+ZXJyb3Jsb2d0YWJsZS5ETUFfUGFyaXR5X0Vycm9yOworCQl0cC0+TWFjU3RhdC5hYm9ydF9kZWxpbWl0ZXJzICs9IHRwLT5lcnJvcmxvZ3RhYmxlLkFib3J0RGVsaW1ldGVyczsKKwkJdHAtPk1hY1N0YXQuZnJlcXVlbmN5X2Vycm9ycyArPSB0cC0+ZXJyb3Jsb2d0YWJsZS5GcmVxdWVuY3lfRXJyb3I7CisJCXRwLT5NYWNTdGF0LmludGVybmFsX2Vycm9ycyArPSB0cC0+ZXJyb3Jsb2d0YWJsZS5JbnRlcm5hbF9FcnJvcjsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBUaGUgaW52ZXJzZSByb3V0aW5lIHRvIHRtczM4MHRyX29wZW4oKS4KKyAqLworaW50IHRtczM4MHRyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwlkZWxfdGltZXIoJnRwLT50aW1lcik7CisKKwkvKiBGbHVzaCB0aGUgVHggYW5kIGRpc2FibGUgUnggaGVyZS4gKi8KKworCXRwLT5IYWx0SW5Qcm9ncmVzcyAJPSAxOworCXRtczM4MHRyX2V4ZWNfY21kKGRldiwgT0NfQ0xPU0UpOworCXRwLT50aW1lci5leHBpcmVzCT0gamlmZmllcyArIDEqSFo7CisJdHAtPnRpbWVyLmZ1bmN0aW9uIAk9IHRtczM4MHRyX3RpbWVyX2VuZF93YWl0OworCXRwLT50aW1lci5kYXRhIAkJPSAodW5zaWduZWQgbG9uZylkZXY7CisJYWRkX3RpbWVyKCZ0cC0+dGltZXIpOworCisJdG1zMzgwdHJfZW5hYmxlX2ludGVycnVwdHMoZGV2KTsKKworCXRwLT5TbGVlcGluZyA9IDE7CisJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmdHAtPndhaXRfZm9yX3Rva19pbnQpOworCXRwLT5UcmFuc21pdENvbW1hbmRBY3RpdmUgPSAwOworICAgIAorCWRlbF90aW1lcigmdHAtPnRpbWVyKTsKKwl0bXMzODB0cl9kaXNhYmxlX2ludGVycnVwdHMoZGV2KTsKKyAgIAorI2lmZGVmIENPTkZJR19JU0EKKwlpZihkZXYtPmRtYSA+IDApIAorCXsKKwkJdW5zaWduZWQgbG9uZyBmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCQlkaXNhYmxlX2RtYShkZXYtPmRtYSk7CisJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCX0KKyNlbmRpZgorCQorCVNJRldSSVRFVygweEZGMDAsIFNJRkNNRCk7CisjaWYgMAorCWlmKGRldi0+ZG1hID4gMCkgLyogd2hhdCB0aGU/ICovCisJCVNJRldSSVRFQigweGZmLCBQT1NSRUcpOworI2VuZGlmCisJdG1zMzgwdHJfY2FuY2VsX3R4X3F1ZXVlKHRwKTsKKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4gVGhpcyBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIGNhcmQgb3BlbgorICogb3IgY2xvc2VkLgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnRtczM4MHRyX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiAoKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICopJnRwLT5NYWNTdGF0KTsKK30KKworLyoKKyAqIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdGVyLgorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IE9wZW5PcHRpb25zOworCQorCU9wZW5PcHRpb25zID0gdHAtPm9jcGwuT1BFTk9wdGlvbnMgJgorCQl+KFBBU1NfQURBUFRFUl9NQUNfRlJBTUVTCisJCSAgfCBQQVNTX0FUVEVOVElPTl9GUkFNRVMKKwkJICB8IFBBU1NfQkVBQ09OX01BQ19GUkFNRVMKKwkJICB8IENPUFlfQUxMX01BQ19GUkFNRVMKKwkJICB8IENPUFlfQUxMX05PTl9NQUNfRlJBTUVTKTsKKwkKKwl0cC0+b2NwbC5GdW5jdEFkZHIgPSAwOworCQorCWlmKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KKwkJT3Blbk9wdGlvbnMgfD0gQ09QWV9BTExfTk9OX01BQ19GUkFNRVMgfAorCQkJQ09QWV9BTExfTUFDX0ZSQU1FUzsKKwllbHNlCisJeworCQlpZihkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQorCQl7CisJCQkvKiBEaXNhYmxlIHByb21pc2N1b3VzIG1vZGUsIHVzZSBub3JtYWwgbW9kZS4gKi8KKwkJCXRwLT5vY3BsLkZ1bmN0QWRkciA9IDB4RkZGRkZGRkY7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpbnQgaTsKKwkJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0ID0gZGV2LT5tY19saXN0OworCQkJZm9yIChpPTA7IGk8IGRldi0+bWNfY291bnQ7IGkrKykKKwkJCXsKKwkJCQkoKGNoYXIgKikoJnRwLT5vY3BsLkZ1bmN0QWRkcikpWzBdIHw9CisJCQkJCW1jbGlzdC0+ZG1pX2FkZHJbMl07CisJCQkJKChjaGFyICopKCZ0cC0+b2NwbC5GdW5jdEFkZHIpKVsxXSB8PQorCQkJCQltY2xpc3QtPmRtaV9hZGRyWzNdOworCQkJCSgoY2hhciAqKSgmdHAtPm9jcGwuRnVuY3RBZGRyKSlbMl0gfD0KKwkJCQkJbWNsaXN0LT5kbWlfYWRkcls0XTsKKwkJCQkoKGNoYXIgKikoJnRwLT5vY3BsLkZ1bmN0QWRkcikpWzNdIHw9CisJCQkJCW1jbGlzdC0+ZG1pX2FkZHJbNV07CisJCQkJbWNsaXN0ID0gbWNsaXN0LT5uZXh0OworCQkJfQorCQl9CisJCXRtczM4MHRyX2V4ZWNfY21kKGRldiwgT0NfU0VUX0ZVTkNUX0FERFIpOworCX0KKwkKKwl0cC0+b2NwbC5PUEVOT3B0aW9ucyA9IE9wZW5PcHRpb25zOworCXRtczM4MHRyX2V4ZWNfY21kKGRldiwgT0NfTU9ESUZZX09QRU5fUEFSTVMpOworCXJldHVybjsKK30KKworLyoKKyAqIFdhaXQgZm9yIHNvbWUgdGltZSAobWljcm9zZWNvbmRzKQorICovCit2b2lkIHRtczM4MHRyX3dhaXQodW5zaWduZWQgbG9uZyB0aW1lKQoreworI2lmIDAKKwlsb25nIHRtcDsKKwkKKwl0bXAgPSBqaWZmaWVzICsgdGltZS8oMTAwMDAwMC9IWik7CisJZG8geworICAJCWN1cnJlbnQtPnN0YXRlIAkJPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCXRtcCA9IHNjaGVkdWxlX3RpbWVvdXQodG1wKTsKKwl9IHdoaWxlKHRpbWVfYWZ0ZXIodG1wLCBqaWZmaWVzKSk7CisjZWxzZQorCXVkZWxheSh0aW1lKTsKKyNlbmRpZgorCXJldHVybjsKK30KKworLyoKKyAqIFdyaXRlIGEgY29tbWFuZCB2YWx1ZSB0byB0aGUgU0lGQ01EIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX2V4ZWNfc2lmY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBXcml0ZVZhbHVlKQoreworCXVuc2lnbmVkIHNob3J0IGNtZDsKKwl1bnNpZ25lZCBzaG9ydCBTaWZTdHNWYWx1ZTsKKwl1bnNpZ25lZCBsb25nIGxvb3BfY291bnRlcjsKKworCVdyaXRlVmFsdWUgPSAoKFdyaXRlVmFsdWUgXiBDTURfU1lTVEVNX0lSUSkgfCBDTURfSU5URVJSVVBUX0FEQVBURVIpOworCWNtZCA9ICh1bnNpZ25lZCBzaG9ydClXcml0ZVZhbHVlOworCWxvb3BfY291bnRlciA9IDAsNSAqIDgwMDAwMDsKKwlkbyB7CisJCVNpZlN0c1ZhbHVlID0gU0lGUkVBRFcoU0lGU1RTKTsKKwl9IHdoaWxlKChTaWZTdHNWYWx1ZSAmIENNRF9JTlRFUlJVUFRfQURBUFRFUikgJiYgbG9vcF9jb3VudGVyLS0pOworCVNJRldSSVRFVyhjbWQsIFNJRkNNRCk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBQcm9jZXNzZXMgYWRhcHRlciBoYXJkd2FyZSByZXNldCwgaGFsdHMgYWRhcHRlciBhbmQgZG93bmxvYWRzIGZpcm13YXJlLAorICogY2xlYXJzIHRoZSBoYWx0IGJpdC4KKyAqLworc3RhdGljIGludCB0bXMzODB0cl9yZXNldF9hZGFwdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIHNob3J0ICpmd19wdHI7CisJdW5zaWduZWQgc2hvcnQgY291bnQsIGMsIGNvdW50MjsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5ID0gTlVMTDsKKworCXN0cm5jcHkodG1zX2RldmljZS5idXNfaWQsZGV2LT5uYW1lLCBCVVNfSURfU0laRSk7CisKKwlpZiAocmVxdWVzdF9maXJtd2FyZSgmZndfZW50cnksICJ0bXMzODB0ci5iaW4iLCAmdG1zX2RldmljZSkgIT0gMCkgeworCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IGZpcm13YXJlICVzIGlzIG1pc3NpbmcsIGNhbm5vdCBzdGFydC5cbiIsCisJCQlkZXYtPm5hbWUsICJ0bXMzODB0ci5iaW4iKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJZndfcHRyID0gKHVuc2lnbmVkIHNob3J0ICopZndfZW50cnktPmRhdGE7CisJY291bnQyID0gZndfZW50cnktPnNpemUgLyAyOworCisJLyogSGFyZHdhcmUgYWRhcHRlciByZXNldCAqLworCVNJRldSSVRFVyhBQ0xfQVJFU0VULCBTSUZBQ0wpOworCXRtczM4MHRyX3dhaXQoNDApOworCQorCWMgPSBTSUZSRUFEVyhTSUZBQ0wpOworCXRtczM4MHRyX3dhaXQoMjApOworCisJaWYoZGV2LT5kbWEgPT0gMCkJLyogRm9yIFBDSSBhZGFwdGVycyAqLworCXsKKwkJYyAmPSB+KEFDTF9OU0VMT1VUMCB8IEFDTF9OU0VMT1VUMSk7CS8qIENsZWFyIGJpdHMgKi8KKwkJaWYodHAtPnNldG5zZWxvdXQpCisJCSAgYyB8PSAoKnRwLT5zZXRuc2Vsb3V0KShkZXYpOworCX0KKworCS8qIEluIGNhc2UgYSBjb21tYW5kIGlzIHBlbmRpbmcgLSBmb3JnZXQgaXQgKi8KKwl0cC0+U2NiSW5Vc2UgPSAwOworCisJYyAmPSB+QUNMX0FSRVNFVDsJCS8qIENsZWFyIGFkYXB0ZXIgcmVzZXQgYml0ICovCisJYyB8PSAgQUNMX0NQSEFMVDsJCS8qIEhhbHQgYWRhcHRlciBDUFUsIGFsbG93IGRvd25sb2FkICovCisJYyB8PSBBQ0xfQk9PVDsKKwljIHw9IEFDTF9TSU5URU47CisJYyAmPSB+QUNMX1BTRE1BRU47CQkvKiBDbGVhciBwc2V1ZG8gZG1hIGJpdCAqLworCVNJRldSSVRFVyhjLCBTSUZBQ0wpOworCXRtczM4MHRyX3dhaXQoNDApOworCisJY291bnQgPSAwOworCS8qIERvd25sb2FkIGZpcm13YXJlIHZpYSBESU8gaW50ZXJmYWNlOiAqLworCWRvIHsKKwkJaWYgKGNvdW50MiA8IDMpIGNvbnRpbnVlOworCisJCS8qIERvd25sb2FkIGZpcnN0IGFkZHJlc3MgcGFydCAqLworCQlTSUZXUklURVcoKmZ3X3B0ciwgU0lGQURYKTsKKwkJZndfcHRyKys7CisJCWNvdW50Mi0tOworCQkvKiBEb3dubG9hZCBzZWNvbmQgYWRkcmVzcyBwYXJ0ICovCisJCVNJRldSSVRFVygqZndfcHRyLCBTSUZBREQpOworCQlmd19wdHIrKzsKKwkJY291bnQyLS07CisKKwkJaWYoKGNvdW50ID0gKmZ3X3B0cikgIT0gMCkJLyogTG9hZCBsb29wIGNvdW50ZXIgKi8KKwkJeworCQkJZndfcHRyKys7CS8qIERvd25sb2FkIGJsb2NrIGRhdGEgKi8KKwkJCWNvdW50Mi0tOworCQkJaWYgKGNvdW50ID4gY291bnQyKSBjb250aW51ZTsKKworCQkJZm9yKDsgY291bnQgPiAwOyBjb3VudC0tKQorCQkJeworCQkJCVNJRldSSVRFVygqZndfcHRyLCBTSUZJTkMpOworCQkJCWZ3X3B0cisrOworCQkJCWNvdW50Mi0tOworCQkJfQorCQl9CisJCWVsc2UJLyogU3RvcCwgaWYgbGFzdCBibG9jayBkb3dubG9hZGVkICovCisJCXsKKwkJCWMgPSBTSUZSRUFEVyhTSUZBQ0wpOworCQkJYyAmPSAofkFDTF9DUEhBTFQgfCBBQ0xfU0lOVEVOKTsKKworCQkJLyogQ2xlYXIgQ1BIQUxUIGFuZCBzdGFydCBCVUQgKi8KKwkJCVNJRldSSVRFVyhjLCBTSUZBQ0wpOworCQkJaWYgKGZ3X2VudHJ5KQorCQkJCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOworCQkJcmV0dXJuICgxKTsKKwkJfQorCX0gd2hpbGUoY291bnQgPT0gMCk7CisKKwlpZiAoZndfZW50cnkpCisJCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBBZGFwdGVyIERvd25sb2FkIEZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKKwlyZXR1cm4gKC0xKTsKK30KKworLyoKKyAqIFN0YXJ0cyBicmluZyB1cCBkaWFnbm9zdGljcyBvZiB0b2tlbiByaW5nIGFkYXB0ZXIgYW5kIGV2YWx1YXRlcworICogZGlhZ25vc3RpYyByZXN1bHRzLgorICovCitzdGF0aWMgaW50IHRtczM4MHRyX2JyaW5ndXBfZGlhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgbG9vcF9jbnQsIHJldHJ5X2NudDsKKwl1bnNpZ25lZCBzaG9ydCBTdGF0dXM7CisKKwl0bXMzODB0cl93YWl0KEhBTEZfU0VDT05EKTsKKwl0bXMzODB0cl9leGVjX3NpZmNtZChkZXYsIEVYRUNfU09GVF9SRVNFVCk7CisJdG1zMzgwdHJfd2FpdChIQUxGX1NFQ09ORCk7CisKKwlyZXRyeV9jbnQgPSBCVURfTUFYX1JFVFJJRVM7CS8qIG1heGltYWwgbnVtYmVyIG9mIHJldHJ5cyAqLworCisJZG8geworCQlyZXRyeV9jbnQtLTsKKwkJaWYodG1zMzgwdHJfZGVidWcgPiAzKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIkJVRC1TdGF0dXM6ICIpOworCQlsb29wX2NudCA9IEJVRF9NQVhfTE9PUENOVDsJLyogbWF4aW11bTogdGhyZWUgc2Vjb25kcyovCisJCWRvIHsJCQkvKiBJbnNwZWN0IEJVRCByZXN1bHRzICovCisJCQlsb29wX2NudC0tOworCQkJdG1zMzgwdHJfd2FpdChIQUxGX1NFQ09ORCk7CisJCQlTdGF0dXMgPSBTSUZSRUFEVyhTSUZTVFMpOworCQkJU3RhdHVzICY9IFNUU19NQVNLOworCisJCQlpZih0bXMzODB0cl9kZWJ1ZyA+IDMpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAlMDRYIFxuIiwgU3RhdHVzKTsKKwkJCS8qIEJVRCBzdWNjZXNzZnVsbHkgY29tcGxldGVkICovCisJCQlpZihTdGF0dXMgPT0gU1RTX0lOSVRJQUxJWkUpCisJCQkJcmV0dXJuICgxKTsKKwkJLyogVW5yZWNvdmVyYWJsZSBoYXJkd2FyZSBlcnJvciwgQlVEIG5vdCBjb21wbGV0ZWQ/ICovCisJCX0gd2hpbGUoKGxvb3BfY250ID4gMCkgJiYgKChTdGF0dXMgJiAoU1RTX0VSUk9SIHwgU1RTX1RFU1QpKQorCQkJIT0gKFNUU19FUlJPUiB8IFNUU19URVNUKSkpOworCisJCS8qIEVycm9yIHByZXZlbnRpbmcgY29tcGxldGlvbiBvZiBCVUQgKi8KKwkJaWYocmV0cnlfY250ID4gMCkKKwkJeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFkYXB0ZXIgU29mdHdhcmUgUmVzZXQuXG4iLCAKKwkJCQlkZXYtPm5hbWUpOworCQkJdG1zMzgwdHJfZXhlY19zaWZjbWQoZGV2LCBFWEVDX1NPRlRfUkVTRVQpOworCQkJdG1zMzgwdHJfd2FpdChIQUxGX1NFQ09ORCk7CisJCX0KKwl9IHdoaWxlKHJldHJ5X2NudCA+IDApOworCisJU3RhdHVzID0gU0lGUkVBRFcoU0lGU1RTKTsKKwkKKwlwcmludGsoS0VSTl9JTkZPICIlczogSGFyZHdhcmUgZXJyb3JcbiIsIGRldi0+bmFtZSk7CisJLyogSGFyZHdhcmUgZXJyb3Igb2NjdXJyZWQhICovCisJU3RhdHVzICY9IDB4MDAxZjsKKwlpZiAoU3RhdHVzICYgMHgwMDEwKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogQlVEIEVycm9yOiBUaW1lb3V0XG4iLCBkZXYtPm5hbWUpOworCWVsc2UgaWYgKChTdGF0dXMgJiAweDAwMGYpID4gNikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJVRCBFcnJvcjogSWxsZWdhbCBGYWlsdXJlXG4iLCBkZXYtPm5hbWUpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJyaW5nIFVwIERpYWdub3N0aWNzIEVycm9yICglMDRYKSBvY2N1cnJlZFxuIiwgZGV2LT5uYW1lLCBTdGF0dXMgJiAweDAwMGYpOworCisJcmV0dXJuICgtMSk7Cit9CisKKy8qCisgKiBDb3B5IGluaXRpYWxpc2F0aW9uIGRhdGEgdG8gYWRhcHRlciBtZW1vcnksIGJlZ2lubmluZyBhdCBhZGRyZXNzCisgKiAxOjBBMDA7IFN0YXJ0aW5nIERNQSB0ZXN0IGFuZCBldmFsdWF0aW5nIHJlc3VsdCBiaXRzLgorICovCitzdGF0aWMgaW50IHRtczM4MHRyX2luaXRfYWRhcHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWNvbnN0IHVuc2lnbmVkIGNoYXIgU0NCX1Rlc3RbNl0gPSB7MHgwMCwgMHgwMCwgMHhDMSwgMHhFMiwgMHhENCwgMHg4Qn07CisJY29uc3QgdW5zaWduZWQgY2hhciBTU0JfVGVzdFs4XSA9IHsweEZGLCAweEZGLCAweEQxLCAweEQ3LAorCQkJCQkJMHhDNSwgMHhEOSwgMHhDMywgMHhENH07CisJdm9pZCAqcHRyID0gKHZvaWQgKikmdHAtPmlwYjsKKwl1bnNpZ25lZCBzaG9ydCAqaXBiX3B0ciA9ICh1bnNpZ25lZCBzaG9ydCAqKXB0cjsKKwl1bnNpZ25lZCBjaGFyICpjYl9wdHIgPSAodW5zaWduZWQgY2hhciAqKSAmdHAtPnNjYjsKKwl1bnNpZ25lZCBjaGFyICpzYl9wdHIgPSAodW5zaWduZWQgY2hhciAqKSAmdHAtPnNzYjsKKwl1bnNpZ25lZCBzaG9ydCBTdGF0dXM7CisJaW50IGksIGxvb3BfY250LCByZXRyeV9jbnQ7CisKKwkvKiBOb3JtYWxpemU6IGJ5dGUgb3JkZXIgbG93L2hpZ2gsIHdvcmQgb3JkZXIgaGlnaC9sb3chIChvbmx5IElQQiEpICovCisJdHAtPmlwYi5TQ0JfQWRkciA9IFNXQVBXKCgoY2hhciAqKSZ0cC0+c2NiIC0gKGNoYXIgKil0cCkgKyB0cC0+ZG1hYnVmZmVyKTsKKwl0cC0+aXBiLlNTQl9BZGRyID0gU1dBUFcoKChjaGFyICopJnRwLT5zc2IgLSAoY2hhciAqKXRwKSArIHRwLT5kbWFidWZmZXIpOworCisJaWYodG1zMzgwdHJfZGVidWcgPiAzKQorCXsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBidWZmZXIgKHJlYWwpOiAlbHhcbiIsIGRldi0+bmFtZSwgKGxvbmcpICZ0cC0+c2NiKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBidWZmZXIgKHZpcnQpOiAlbHhcbiIsIGRldi0+bmFtZSwgKGxvbmcpICgoY2hhciAqKSZ0cC0+c2NiIC0gKGNoYXIgKil0cCkgKyAobG9uZykgdHAtPmRtYWJ1ZmZlcik7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogYnVmZmVyIChETUEpIDogJWx4XG4iLCBkZXYtPm5hbWUsIChsb25nKSB0cC0+ZG1hYnVmZmVyKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBidWZmZXIgKHRwKSAgOiAlbHhcbiIsIGRldi0+bmFtZSwgKGxvbmcpIHRwKTsKKwl9CisJLyogTWF4aW11bTogdGhyZWUgaW5pdGlhbGl6YXRpb24gcmV0cmllcyAqLworCXJldHJ5X2NudCA9IElOSVRfTUFYX1JFVFJJRVM7CisKKwlkbyB7CisJCXJldHJ5X2NudC0tOworCisJCS8qIFRyYW5zZmVyIGluaXRpYWxpemF0aW9uIGJsb2NrICovCisJCVNJRldSSVRFVygweDAwMDEsIFNJRkFEWCk7CisKKwkJLyogVG8gYWRkcmVzcyAwMDAxOjBBMDAgb2YgYWRhcHRlciBSQU0gKi8KKwkJU0lGV1JJVEVXKDB4MEEwMCwgU0lGQUREKTsKKworCQkvKiBXcml0ZSAxMSB3b3JkcyB0byBhZGFwdGVyIFJBTSAqLworCQlmb3IoaSA9IDA7IGkgPCAxMTsgaSsrKQorCQkJU0lGV1JJVEVXKGlwYl9wdHJbaV0sIFNJRklOQyk7CisKKwkJLyogRXhlY3V0ZSBTQ0IgYWRhcHRlciBjb21tYW5kICovCisJCXRtczM4MHRyX2V4ZWNfc2lmY21kKGRldiwgQ01EX0VYRUNVVEUpOworCisJCWxvb3BfY250ID0gSU5JVF9NQVhfTE9PUENOVDsJLyogTWF4aW11bTogMTEgc2Vjb25kcyAqLworCisJCS8qIFdoaWxlIHJlbWFpbmluZyByZXRyaWVzLCBubyBlcnJvciBhbmQgbm90IGNvbXBsZXRlZCAqLworCQlkbyB7CisJCQlTdGF0dXMgPSAwOworCQkJbG9vcF9jbnQtLTsKKwkJCXRtczM4MHRyX3dhaXQoSEFMRl9TRUNPTkQpOworCisJCQkvKiBNYXNrIGludGVyZXN0aW5nIHN0YXR1cyBiaXRzICovCisJCQlTdGF0dXMgPSBTSUZSRUFEVyhTSUZTVFMpOworCQkJU3RhdHVzICY9IFNUU19NQVNLOworCQl9IHdoaWxlKCgoU3RhdHVzICYoU1RTX0lOSVRJQUxJWkUgfCBTVFNfRVJST1IgfCBTVFNfVEVTVCkpICE9IDApCisJCQkmJiAoKFN0YXR1cyAmIFNUU19FUlJPUikgPT0gMCkgJiYgKGxvb3BfY250ICE9IDApKTsKKworCQlpZigoU3RhdHVzICYgKFNUU19JTklUSUFMSVpFIHwgU1RTX0VSUk9SIHwgU1RTX1RFU1QpKSA9PSAwKQorCQl7CisJCQkvKiBJbml0aWFsaXphdGlvbiBjb21wbGV0ZWQgd2l0aG91dCBlcnJvciAqLworCQkJaSA9IDA7CisJCQlkbyB7CS8qIFRlc3QgaWYgY29udGVudHMgb2YgU0NCIGlzIHZhbGlkICovCisJCQkJaWYoU0NCX1Rlc3RbaV0gIT0gKihjYl9wdHIgKyBpKSkKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBETUEgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCQkJCQkvKiBETUEgZGF0YSBlcnJvcjogd3JvbmcgZGF0YSBpbiBTQ0IgKi8KKwkJCQkJcmV0dXJuICgtMSk7CisJCQkJfQorCQkJCWkrKzsKKwkJCX0gd2hpbGUoaSA8IDYpOworCisJCQlpID0gMDsKKwkJCWRvIHsJLyogVGVzdCBpZiBjb250ZW50cyBvZiBTU0IgaXMgdmFsaWQgKi8KKwkJCQlpZihTU0JfVGVzdFtpXSAhPSAqKHNiX3B0ciArIGkpKQorCQkJCQkvKiBETUEgZGF0YSBlcnJvcjogd3JvbmcgZGF0YSBpbiBTU0IgKi8KKwkJCQkJcmV0dXJuICgtMSk7CisJCQkJaSsrOworCQkJfSB3aGlsZSAoaSA8IDgpOworCisJCQlyZXR1cm4gKDEpOwkvKiBBZGFwdGVyIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCAqLworCQl9CisJCWVsc2UKKwkJeworCQkJaWYoKFN0YXR1cyAmIFNUU19FUlJPUikgIT0gMCkKKwkJCXsKKwkJCQkvKiBJbml0aWFsaXphdGlvbiBlcnJvciBvY2N1cnJlZCAqLworCQkJCVN0YXR1cyA9IFNJRlJFQURXKFNJRlNUUyk7CisJCQkJU3RhdHVzICY9IFNUU19FUlJPUl9NQVNLOworCQkJCS8qIFNob3dJbml0aWFsaXNhdGlvbkVycm9yQ29kZShTdGF0dXMpOyAqLworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTdGF0dXMgZXJyb3I6ICVkXG4iLCBkZXYtPm5hbWUsIFN0YXR1cyk7CisJCQkJcmV0dXJuICgtMSk7IC8qIFVucmVjb3ZlcmFibGUgZXJyb3IgKi8KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZihyZXRyeV9jbnQgPiAwKQorCQkJCXsKKwkJCQkJLyogUmVzZXQgYWRhcHRlciBhbmQgdHJ5IGluaXQgYWdhaW4gKi8KKwkJCQkJdG1zMzgwdHJfZXhlY19zaWZjbWQoZGV2LCBFWEVDX1NPRlRfUkVTRVQpOworCQkJCQl0bXMzODB0cl93YWl0KEhBTEZfU0VDT05EKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IHdoaWxlKHJldHJ5X2NudCA+IDApOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJldHJ5IGV4Y2VlZGVkXG4iLCBkZXYtPm5hbWUpOworCXJldHVybiAoLTEpOworfQorCisvKgorICogQ2hlY2sgZm9yIG91dHN0YW5kaW5nIGNvbW1hbmRzIGluIGNvbW1hbmQgcXVldWUgYW5kIHRyaWVzIHRvIGV4ZWN1dGUKKyAqIGNvbW1hbmQgaW1tZWRpYXRlbHkuIENvcnJlc3BvbmRpbmcgY29tbWFuZCBmbGFnIGluIGNvbW1hbmQgcXVldWUgaXMgY2xlYXJlZC4KKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfY2hrX291dHN0YW5kaW5nX2NtZHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBBZGRyID0gMDsKKworCWlmKHRwLT5DTURxdWV1ZSA9PSAwKQorCQlyZXR1cm47CQkvKiBObyBjb21tYW5kIGV4ZWN1dGlvbiAqLworCisJLyogSWYgU0NCIGluIHVzZTogbm8gY29tbWFuZCAqLworCWlmKHRwLT5TY2JJblVzZSA9PSAxKQorCQlyZXR1cm47CisKKwkvKiBDaGVjayBpZiBhZGFwdGVyIGlzIG9wZW5lZCwgYXZvaWRpbmcgQ09NTUFORF9SRUpFQ1QKKwkgKiBpbnRlcnJ1cHQgYnkgdGhlIGFkYXB0ZXIhCisJICovCisJaWYodHAtPkFkYXB0ZXJPcGVuRmxhZyA9PSAwKQorCXsKKwkJaWYodHAtPkNNRHF1ZXVlICYgT0NfT1BFTikKKwkJeworCQkJLyogRXhlY3V0ZSBPUEVOIGNvbW1hbmQJKi8KKwkJCXRwLT5DTURxdWV1ZSBePSBPQ19PUEVOOworCisJCQlBZGRyID0gaHRvbmwoKChjaGFyICopJnRwLT5vY3BsIC0gKGNoYXIgKil0cCkgKyB0cC0+ZG1hYnVmZmVyKTsKKwkJCXRwLT5zY2IuUGFybVswXSA9IExPV09SRChBZGRyKTsKKwkJCXRwLT5zY2IuUGFybVsxXSA9IEhJV09SRChBZGRyKTsKKwkJCXRwLT5zY2IuQ01EID0gT1BFTjsKKwkJfQorCQllbHNlCisJCQkvKiBObyBPUEVOIGNvbW1hbmQgcXVldWVkLCBidXQgYWRhcHRlciBjbG9zZWQuIE5vdGU6CisJCQkgKiBXZSdsbCB0cnkgdG8gcmUtb3BlbiB0aGUgYWRhcHRlciBpbiBEcml2ZXJQb2xsKCkKKwkJCSAqLworCQkJcmV0dXJuOwkJLyogTm8gYWRhcHRlciBjb21tYW5kIGlzc3VlZCAqLworCX0KKwllbHNlCisJeworCQkvKiBBZGFwdGVyIGlzIG9wZW47IGV2YWx1YXRlIGNvbW1hbmQgcXVldWU6IHRyeSB0byBleGVjdXRlCisJCSAqIG91dHN0YW5kaW5nIGNvbW1hbmRzIChkZXBlbmRpbmcgb24gcHJpb3JpdHkhKSBDTE9TRQorCQkgKiBjb21tYW5kIHF1ZXVlZAorCQkgKi8KKwkJaWYodHAtPkNNRHF1ZXVlICYgT0NfQ0xPU0UpCisJCXsKKwkJCXRwLT5DTURxdWV1ZSBePSBPQ19DTE9TRTsKKwkJCXRwLT5BZGFwdGVyT3BlbkZsYWcgPSAwOworCQkJdHAtPnNjYi5QYXJtWzBdID0gMDsgLyogUGFybVswXSwgUGFybVsxXSBhcmUgaWdub3JlZCAqLworCQkJdHAtPnNjYi5QYXJtWzFdID0gMDsgLyogYnV0IHNob3VsZCBiZSBzZXQgdG8gemVybyEgKi8KKwkJCXRwLT5zY2IuQ01EID0gQ0xPU0U7CisJCQlpZighdHAtPkhhbHRJblByb2dyZXNzKQorCQkJCXRwLT5DTURxdWV1ZSB8PSBPQ19PUEVOOyAvKiByZS1vcGVuIGFkYXB0ZXIgKi8KKwkJCWVsc2UKKwkJCQl0cC0+Q01EcXVldWUgPSAwOwkvKiBubyBtb3JlIGNvbW1hbmRzICovCisJCX0KKwkJZWxzZQorCQl7CisJCQlpZih0cC0+Q01EcXVldWUgJiBPQ19SRUNFSVZFKQorCQkJeworCQkJCXRwLT5DTURxdWV1ZSBePSBPQ19SRUNFSVZFOworCQkJCUFkZHIgPSBodG9ubCgoKGNoYXIgKil0cC0+UnBsSGVhZCAtIChjaGFyICopdHApICsgdHAtPmRtYWJ1ZmZlcik7CisJCQkJdHAtPnNjYi5QYXJtWzBdID0gTE9XT1JEKEFkZHIpOworCQkJCXRwLT5zY2IuUGFybVsxXSA9IEhJV09SRChBZGRyKTsKKwkJCQl0cC0+c2NiLkNNRCA9IFJFQ0VJVkU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYodHAtPkNNRHF1ZXVlICYgT0NfVFJBTlNNSVRfSEFMVCkKKwkJCQl7CisJCQkJCS8qIE5PVEU6IFRSQU5TTUlULkhBTFQgbXVzdCBiZSBjaGVja2VkIAorCQkJCQkgKiBiZWZvcmUgVFJBTlNNSVQuCisJCQkJCSAqLworCQkJCQl0cC0+Q01EcXVldWUgXj0gT0NfVFJBTlNNSVRfSEFMVDsKKwkJCQkJdHAtPnNjYi5DTUQgPSBUUkFOU01JVF9IQUxUOworCisJCQkJCS8qIFBhcm1bMF0gYW5kIFBhcm1bMV0gYXJlIGlnbm9yZWQKKwkJCQkJICogYnV0IHNob3VsZCBiZSBzZXQgdG8gemVybyEKKwkJCQkJICovCisJCQkJCXRwLT5zY2IuUGFybVswXSA9IDA7CisJCQkJCXRwLT5zY2IuUGFybVsxXSA9IDA7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmKHRwLT5DTURxdWV1ZSAmIE9DX1RSQU5TTUlUKQorCQkJCQl7CisJCQkJCQkvKiBOT1RFOiBUUkFOU01JVCBtdXN0IGJlIAorCQkJCQkJICogY2hlY2tlZCBhZnRlciBUUkFOU01JVC5IQUxUCisJCQkJCQkgKi8KKwkJCQkJCWlmKHRwLT5UcmFuc21pdENvbW1hbmRBY3RpdmUpCisJCQkJCQl7CisJCQkJCQkJaWYoIXRwLT5UcmFuc21pdEhhbHRTY2hlZHVsZWQpCisJCQkJCQkJeworCQkJCQkJCQl0cC0+VHJhbnNtaXRIYWx0U2NoZWR1bGVkID0gMTsKKwkJCQkJCQkJdG1zMzgwdHJfZXhlY19jbWQoZGV2LCBPQ19UUkFOU01JVF9IQUxUKSA7CisJCQkJCQkJfQorCQkJCQkJCXRwLT5UcmFuc21pdENvbW1hbmRBY3RpdmUgPSAwOworCQkJCQkJCXJldHVybjsKKwkJCQkJCX0KKworCQkJCQkJdHAtPkNNRHF1ZXVlIF49IE9DX1RSQU5TTUlUOworCQkJCQkJdG1zMzgwdHJfY2FuY2VsX3R4X3F1ZXVlKHRwKTsKKwkJCQkJCUFkZHIgPSBodG9ubCgoKGNoYXIgKil0cC0+VHBsQnVzeSAtIChjaGFyICopdHApICsgdHAtPmRtYWJ1ZmZlcik7CisJCQkJCQl0cC0+c2NiLlBhcm1bMF0gPSBMT1dPUkQoQWRkcik7CisJCQkJCQl0cC0+c2NiLlBhcm1bMV0gPSBISVdPUkQoQWRkcik7CisJCQkJCQl0cC0+c2NiLkNNRCA9IFRSQU5TTUlUOworCQkJCQkJdHAtPlRyYW5zbWl0Q29tbWFuZEFjdGl2ZSA9IDE7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlpZih0cC0+Q01EcXVldWUgJiBPQ19NT0RJRllfT1BFTl9QQVJNUykKKwkJCQkJCXsKKwkJCQkJCQl0cC0+Q01EcXVldWUgXj0gT0NfTU9ESUZZX09QRU5fUEFSTVM7CisJCQkJCQkJdHAtPnNjYi5QYXJtWzBdID0gdHAtPm9jcGwuT1BFTk9wdGlvbnM7IC8qIG5ldyBPUEVOIG9wdGlvbnMqLworCQkJCQkJCXRwLT5zY2IuUGFybVswXSB8PSBFTkFCTEVfRlVMTF9EVVBMRVhfU0VMRUNUSU9OOworCQkJCQkJCXRwLT5zY2IuUGFybVsxXSA9IDA7IC8qIGlzIGlnbm9yZWQgYnV0IHNob3VsZCBiZSB6ZXJvICovCisJCQkJCQkJdHAtPnNjYi5DTUQgPSBNT0RJRllfT1BFTl9QQVJNUzsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlpZih0cC0+Q01EcXVldWUgJiBPQ19TRVRfRlVOQ1RfQUREUikKKwkJCQkJCQl7CisJCQkJCQkJCXRwLT5DTURxdWV1ZSBePSBPQ19TRVRfRlVOQ1RfQUREUjsKKwkJCQkJCQkJdHAtPnNjYi5QYXJtWzBdID0gTE9XT1JEKHRwLT5vY3BsLkZ1bmN0QWRkcik7CisJCQkJCQkJCXRwLT5zY2IuUGFybVsxXSA9IEhJV09SRCh0cC0+b2NwbC5GdW5jdEFkZHIpOworCQkJCQkJCQl0cC0+c2NiLkNNRCA9IFNFVF9GVU5DVF9BRERSOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQlpZih0cC0+Q01EcXVldWUgJiBPQ19TRVRfR1JPVVBfQUREUikKKwkJCQkJCQkJeworCQkJCQkJCQkJdHAtPkNNRHF1ZXVlIF49IE9DX1NFVF9HUk9VUF9BRERSOworCQkJCQkJCQkJdHAtPnNjYi5QYXJtWzBdID0gTE9XT1JEKHRwLT5vY3BsLkdyb3VwQWRkcik7CisJCQkJCQkJCQl0cC0+c2NiLlBhcm1bMV0gPSBISVdPUkQodHAtPm9jcGwuR3JvdXBBZGRyKTsKKwkJCQkJCQkJCXRwLT5zY2IuQ01EID0gU0VUX0dST1VQX0FERFI7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorCQkJCQkJCQl7CisJCQkJCQkJCQlpZih0cC0+Q01EcXVldWUgJiBPQ19SRUFEX0VSUk9SX0xPRykKKwkJCQkJCQkJCXsKKwkJCQkJCQkJCQl0cC0+Q01EcXVldWUgXj0gT0NfUkVBRF9FUlJPUl9MT0c7CisJCQkJCQkJCQkJQWRkciA9IGh0b25sKCgoY2hhciAqKSZ0cC0+ZXJyb3Jsb2d0YWJsZSAtIChjaGFyICopdHApICsgdHAtPmRtYWJ1ZmZlcik7CisJCQkJCQkJCQkJdHAtPnNjYi5QYXJtWzBdID0gTE9XT1JEKEFkZHIpOworCQkJCQkJCQkJCXRwLT5zY2IuUGFybVsxXSA9IEhJV09SRChBZGRyKTsKKwkJCQkJCQkJCQl0cC0+c2NiLkNNRCA9IFJFQURfRVJST1JfTE9HOworCQkJCQkJCQkJfQorCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJeworCQkJCQkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNoZWNrRm9yT3V0c3RhbmRpbmdDb21tYW5kOiB1bmtub3duIENvbW1hbmRcbiIpOworCQkJCQkJCQkJCXRwLT5DTURxdWV1ZSA9IDA7CisJCQkJCQkJCQkJcmV0dXJuOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJdHAtPlNjYkluVXNlID0gMTsJLyogU2V0IHNlbWFwaG9yZTogU0NCIGluIHVzZS4gKi8KKworCS8qIEV4ZWN1dGUgU0NCIGFuZCBnZW5lcmF0ZSBJUlEgd2hlbiBkb25lLiAqLworCXRtczM4MHRyX2V4ZWNfc2lmY21kKGRldiwgQ01EX0VYRUNVVEUgfCBDTURfU0NCX1JFUVVFU1QpOworCisJcmV0dXJuOworfQorCisvKgorICogSVJRIGNvbmRpdGlvbnM6IHNpZ25hbCBsb3NzIG9uIHRoZSByaW5nLCB0cmFuc21pdCBvciByZWNlaXZlIG9mIGJlYWNvbgorICogZnJhbWVzIChkaXNhYmxlZCBpZiBiaXQgMSBvZiBPUEVOIG9wdGlvbiBpcyBzZXQpOyByZXBvcnQgZXJyb3IgTUFDCisgKiBmcmFtZSB0cmFuc21pdCAoZGlzYWJsZWQgaWYgYml0IDIgb2YgT1BFTiBvcHRpb24gaXMgc2V0KTsgb3BlbiBvciBzaG9ydAorICogY2lyY3VpdCBmYXVsdCBvbiB0aGUgbG9iZSBpcyBkZXRlY3RlZDsgcmVtb3ZlIE1BQyBmcmFtZSByZWNlaXZlZDsKKyAqIGVycm9yIGNvdW50ZXIgb3ZlcmZsb3cgKDI1NSk7IG9wZW5lZCBhZGFwdGVyIGlzIHRoZSBvbmx5IHN0YXRpb24gaW4gcmluZy4KKyAqIEFmdGVyIHNvbWUgb2YgdGhlIElSUXMgdGhlIGFkYXB0ZXIgaXMgY2xvc2VkIQorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl9yaW5nX3N0YXR1c19pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwl0cC0+Q3VycmVudFJpbmdTdGF0dXMgPSBiZTE2X3RvX2NwdSgodW5zaWduZWQgc2hvcnQpdHAtPnNzYi5QYXJtWzBdKTsKKworCS8qIEZpcnN0OiBmaWxsIHVwIHN0YXRpc3RpY3MgKi8KKwlpZih0cC0+c3NiLlBhcm1bMF0gJiBTSUdOQUxfTE9TUykKKwl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTaWduYWwgTG9zc1xuIiwgZGV2LT5uYW1lKTsKKwkJdHAtPk1hY1N0YXQubGluZV9lcnJvcnMrKzsKKwl9CisKKwkvKiBBZGFwdGVyIGlzIGNsb3NlZCwgYnV0IGluaXRpYWxpemVkICovCisJaWYodHAtPnNzYi5QYXJtWzBdICYgTE9CRV9XSVJFX0ZBVUxUKQorCXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExvYmUgV2lyZSBGYXVsdCwgUmVvcGVuIEFkYXB0ZXJcbiIsIAorCQkJZGV2LT5uYW1lKTsKKwkJdHAtPk1hY1N0YXQubGluZV9lcnJvcnMrKzsKKwl9CisKKwlpZih0cC0+c3NiLlBhcm1bMF0gJiBSSU5HX1JFQ09WRVJZKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogUmluZyBSZWNvdmVyeVxuIiwgZGV2LT5uYW1lKTsKKworCS8qIENvdW50ZXIgb3ZlcmZsb3c6IHJlYWQgZXJyb3IgbG9nICovCisJaWYodHAtPnNzYi5QYXJtWzBdICYgQ09VTlRFUl9PVkVSRkxPVykKKwl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb3VudGVyIE92ZXJmbG93XG4iLCBkZXYtPm5hbWUpOworCQl0bXMzODB0cl9leGVjX2NtZChkZXYsIE9DX1JFQURfRVJST1JfTE9HKTsKKwl9CisKKwkvKiBBZGFwdGVyIGlzIGNsb3NlZCwgYnV0IGluaXRpYWxpemVkICovCisJaWYodHAtPnNzYi5QYXJtWzBdICYgUkVNT1ZFX1JFQ0VJVkVEKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVtb3ZlIFJlY2VpdmVkLCBSZW9wZW4gQWRhcHRlclxuIiwgCisJCQlkZXYtPm5hbWUpOworCisJLyogQWRhcHRlciBpcyBjbG9zZWQsIGJ1dCBpbml0aWFsaXplZCAqLworCWlmKHRwLT5zc2IuUGFybVswXSAmIEFVVE9fUkVNT1ZBTF9FUlJPUikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEF1dG8gUmVtb3ZhbCBFcnJvciwgUmVvcGVuIEFkYXB0ZXJcbiIsIAorCQkJZGV2LT5uYW1lKTsKKworCWlmKHRwLT5zc2IuUGFybVswXSAmIEhBUkRfRVJST1IpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBIYXJkIEVycm9yXG4iLCBkZXYtPm5hbWUpOworCisJaWYodHAtPnNzYi5QYXJtWzBdICYgU09GVF9FUlJPUikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNvZnQgRXJyb3JcbiIsIGRldi0+bmFtZSk7CisKKwlpZih0cC0+c3NiLlBhcm1bMF0gJiBUUkFOU01JVF9CRUFDT04pCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUcmFuc21pdCBCZWFjb25cbiIsIGRldi0+bmFtZSk7CisKKwlpZih0cC0+c3NiLlBhcm1bMF0gJiBTSU5HTEVfU1RBVElPTikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNpbmdsZSBTdGF0aW9uXG4iLCBkZXYtPm5hbWUpOworCisJLyogQ2hlY2sgaWYgYWRhcHRlciBoYXMgYmVlbiBjbG9zZWQgKi8KKwlpZih0cC0+c3NiLlBhcm1bMF0gJiBBREFQVEVSX0NMT1NFRCkKKwl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBZGFwdGVyIGNsb3NlZCAoUmVvcGVuaW5nKSwiIAorCQkJIkN1cnJlbnRSaW5nU3RhdCAleFxuIiwKKwkJCWRldi0+bmFtZSwgdHAtPkN1cnJlbnRSaW5nU3RhdHVzKTsKKwkJdHAtPkFkYXB0ZXJPcGVuRmxhZyA9IDA7CisJCXRtczM4MHRyX29wZW5fYWRhcHRlcihkZXYpOworCX0KKworCXJldHVybjsKK30KKworLyoKKyAqIElzc3VlZCBpZiBhZGFwdGVyIGhhcyBlbmNvdW50ZXJlZCBhbiB1bnJlY292ZXJhYmxlIGhhcmR3YXJlCisgKiBvciBzb2Z0d2FyZSBlcnJvci4KKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfY2hrX2lycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCXVuc2lnbmVkIHNob3J0IEFkYXB0ZXJDaGVja0Jsb2NrWzRdOworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXRwLT5BZGFwdGVyT3BlbkZsYWcgPSAwOwkvKiBBZGFwdGVyIGNsb3NlZCBub3cgKi8KKworCS8qIFBhZ2UgbnVtYmVyIG9mIGFkYXB0ZXIgbWVtb3J5ICovCisJU0lGV1JJVEVXKDB4MDAwMSwgU0lGQURYKTsKKwkvKiBBZGRyZXNzIG9mZnNldCAqLworCVNJRldSSVRFVyhDSEVDS0FERFIsIFNJRkFEUik7CisKKwkvKiBSZWFkaW5nIDggYnl0ZSBhZGFwdGVyIGNoZWNrIGJsb2NrLiAqLworCWZvcihpID0gMDsgaSA8IDQ7IGkrKykKKwkJQWRhcHRlckNoZWNrQmxvY2tbaV0gPSBTSUZSRUFEVyhTSUZJTkMpOworCisJaWYodG1zMzgwdHJfZGVidWcgPiAzKQorCXsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBBZGFwdGVyQ2hlY2tCbG9jazogIiwgZGV2LT5uYW1lKTsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCXByaW50aygiJTA0WCIsIEFkYXB0ZXJDaGVja0Jsb2NrW2ldKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKworCXN3aXRjaChBZGFwdGVyQ2hlY2tCbG9ja1swXSkKKwl7CisJCWNhc2UgRElPX1BBUklUWToKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBESU8gcGFyaXR5IGVycm9yXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBETUFfUkVBRF9BQk9SVDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzIERNQSByZWFkIG9wZXJhdGlvbiBhYm9ydGVkOlxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQkJc3dpdGNoIChBZGFwdGVyQ2hlY2tCbG9ja1sxXSkKKwkJCXsKKwkJCQljYXNlIDA6CisJCQkJCXByaW50ayhLRVJOX0lORk8gIlRpbWVvdXRcbiIpOworCQkJCQlwcmludGsoS0VSTl9JTkZPICJBZGRyZXNzOiAlMDRYICUwNFhcbiIsCisJCQkJCQlBZGFwdGVyQ2hlY2tCbG9ja1syXSwKKwkJCQkJCUFkYXB0ZXJDaGVja0Jsb2NrWzNdKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDE6CisJCQkJCXByaW50ayhLRVJOX0lORk8gIlBhcml0eSBlcnJvclxuIik7CisJCQkJCXByaW50ayhLRVJOX0lORk8gIkFkZHJlc3M6ICUwNFggJTA0WFxuIiwKKwkJCQkJCUFkYXB0ZXJDaGVja0Jsb2NrWzJdLCAKKwkJCQkJCUFkYXB0ZXJDaGVja0Jsb2NrWzNdKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDI6IAorCQkJCQlwcmludGsoS0VSTl9JTkZPICJCdXMgZXJyb3JcbiIpOworCQkJCQlwcmludGsoS0VSTl9JTkZPICJBZGRyZXNzOiAlMDRYICUwNFhcbiIsCisJCQkJCQlBZGFwdGVyQ2hlY2tCbG9ja1syXSwgCisJCQkJCQlBZGFwdGVyQ2hlY2tCbG9ja1szXSk7CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiVW5rbm93biBlcnJvci5cbiIpOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgRE1BX1dSSVRFX0FCT1JUOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERNQSB3cml0ZSBvcGVyYXRpb24gYWJvcnRlZDogXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCQlzd2l0Y2ggKEFkYXB0ZXJDaGVja0Jsb2NrWzFdKQorCQkJeworCQkJCWNhc2UgMDogCisJCQkJCXByaW50ayhLRVJOX0lORk8gIlRpbWVvdXRcbiIpOworCQkJCQlwcmludGsoS0VSTl9JTkZPICJBZGRyZXNzOiAlMDRYICUwNFhcbiIsCisJCQkJCQlBZGFwdGVyQ2hlY2tCbG9ja1syXSwgCisJCQkJCQlBZGFwdGVyQ2hlY2tCbG9ja1szXSk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAxOiAKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiUGFyaXR5IGVycm9yXG4iKTsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiQWRkcmVzczogJTA0WCAlMDRYXG4iLAorCQkJCQkJQWRhcHRlckNoZWNrQmxvY2tbMl0sIAorCQkJCQkJQWRhcHRlckNoZWNrQmxvY2tbM10pOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgMjogCisJCQkJCXByaW50ayhLRVJOX0lORk8gIkJ1cyBlcnJvclxuIik7CisJCQkJCXByaW50ayhLRVJOX0lORk8gIkFkZHJlc3M6ICUwNFggJTA0WFxuIiwKKwkJCQkJCUFkYXB0ZXJDaGVja0Jsb2NrWzJdLCAKKwkJCQkJCUFkYXB0ZXJDaGVja0Jsb2NrWzNdKTsKKwkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQlwcmludGsoS0VSTl9JTkZPICJVbmtub3duIGVycm9yLlxuIik7CisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJTExFR0FMX09QX0NPREU6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSWxsZWdhbCBvcGVyYXRpb24gY29kZSBpbiBmaXJtd2FyZVxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQkJLyogUGFybVswLTNdOiBhZGFwdGVyIGludGVybmFsIHJlZ2lzdGVyIFIxMy1SMTUgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgUEFSSVRZX0VSUk9SUzoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBZGFwdGVyIGludGVybmFsIGJ1cyBwYXJpdHkgZXJyb3JcbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJCS8qIFBhcm1bMC0zXTogYWRhcHRlciBpbnRlcm5hbCByZWdpc3RlciBSMTMtUjE1ICovCisJCQlicmVhazsKKworCQljYXNlIFJBTV9EQVRBX0VSUk9SOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJBTSBkYXRhIGVycm9yXG4iLCBkZXYtPm5hbWUpOworCQkJLyogUGFybVswLTFdOiBNU1cvTFNXIGFkZHJlc3Mgb2YgUkFNIGxvY2F0aW9uLiAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBSQU1fUEFSSVRZX0VSUk9SOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJBTSBwYXJpdHkgZXJyb3JcbiIsIGRldi0+bmFtZSk7CisJCQkvKiBQYXJtWzAtMV06IE1TVy9MU1cgYWRkcmVzcyBvZiBSQU0gbG9jYXRpb24uICovCisJCQlicmVhazsKKworCQljYXNlIFJJTkdfVU5ERVJSVU46CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSW50ZXJuYWwgRE1BIHVuZGVycnVuIGRldGVjdGVkXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCQlicmVhazsKKworCQljYXNlIElOVkFMSURfSVJROgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVucmVjb2duaXplZCBpbnRlcnJ1cHQgZGV0ZWN0ZWRcbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJCS8qIFBhcm1bMC0zXTogYWRhcHRlciBpbnRlcm5hbCByZWdpc3RlciBSMTMtUjE1ICovCisJCQlicmVhazsKKworCQljYXNlIElOVkFMSURfRVJST1JfSVJROgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVucmVjb2duaXplZCBlcnJvciBpbnRlcnJ1cHQgZGV0ZWN0ZWRcbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJCS8qIFBhcm1bMC0zXTogYWRhcHRlciBpbnRlcm5hbCByZWdpc3RlciBSMTMtUjE1ICovCisJCQlicmVhazsKKworCQljYXNlIElOVkFMSURfWE9QOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVucmVjb2duaXplZCBYT1AgcmVxdWVzdCBkZXRlY3RlZFxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQkJLyogUGFybVswLTNdOiBhZGFwdGVyIGludGVybmFsIHJlZ2lzdGVyIFIxMy1SMTUgKi8KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5rbm93biBzdGF0dXMiLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJfQorCisJaWYodG1zMzgwdHJfY2hpcHNldF9pbml0KGRldikgPT0gMSkKKwl7CisJCS8qIFJlc3RhcnQgb2YgZmlybXdhcmUgc3VjY2Vzc2Z1bCAqLworCQl0cC0+QWRhcHRlck9wZW5GbGFnID0gMTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBJbnRlcm5hbCBhZGFwdGVyIHBvaW50ZXIgdG8gUkFNIGRhdGEgYXJlIGNvcGllZCBmcm9tIGFkYXB0ZXIgaW50bworICogaG9zdCBzeXN0ZW0uCisgKi8KK3N0YXRpYyBpbnQgdG1zMzgwdHJfcmVhZF9wdHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgc2hvcnQgYWRhcHRlcnJhbTsKKworCXRtczM4MHRyX3JlYWRfcmFtKGRldiwgKHVuc2lnbmVkIGNoYXIgKikmdHAtPmludHB0cnMuQnVybmVkSW5BZGRyUHRyLAorCQkJQURBUFRFUl9JTlRfUFRSUywgMTYpOworCXRtczM4MHRyX3JlYWRfcmFtKGRldiwgKHVuc2lnbmVkIGNoYXIgKikmYWRhcHRlcnJhbSwKKwkJCWNwdV90b19iZTE2KCh1bnNpZ25lZCBzaG9ydCl0cC0+aW50cHRycy5BZGFwdGVyUkFNUHRyKSwgMik7CisJcmV0dXJuIGJlMTZfdG9fY3B1KGFkYXB0ZXJyYW0pOyAKK30KKworLyoKKyAqIFJlYWRzIGEgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYWRhcHRlciB0byBzeXN0ZW0gbWVtb3J5LgorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl9yZWFkX3JhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICpEYXRhLAorCQkJCXVuc2lnbmVkIHNob3J0IEFkZHJlc3MsIGludCBMZW5ndGgpCit7CisJaW50IGk7CisJdW5zaWduZWQgc2hvcnQgb2xkX3NpZmFkeCwgb2xkX3NpZmFkciwgSW5Xb3JkOworCisJLyogU2F2ZSB0aGUgY3VycmVudCB2YWx1ZXMgKi8KKwlvbGRfc2lmYWR4ID0gU0lGUkVBRFcoU0lGQURYKTsKKwlvbGRfc2lmYWRyID0gU0lGUkVBRFcoU0lGQURSKTsKKworCS8qIFBhZ2UgbnVtYmVyIG9mIGFkYXB0ZXIgbWVtb3J5ICovCisJU0lGV1JJVEVXKDB4MDAwMSwgU0lGQURYKTsKKwkvKiBBZGRyZXNzIG9mZnNldCBpbiBhZGFwdGVyIFJBTSAqLworICAgICAgICBTSUZXUklURVcoQWRkcmVzcywgU0lGQURSKTsKKworCS8qIENvcHkgbGVuIGJ5dGUgZnJvbSBhZGFwdGVyIG1lbW9yeSB0byBzeXN0ZW0gZGF0YSBhcmVhLiAqLworCWkgPSAwOworCWZvcig7OykKKwl7CisJCUluV29yZCA9IFNJRlJFQURXKFNJRklOQyk7CisKKwkJKihEYXRhICsgaSkgPSBISUJZVEUoSW5Xb3JkKTsJLyogV3JpdGUgZmlyc3QgYnl0ZSAqLworCQlpZigrK2kgPT0gTGVuZ3RoKQkJLyogQWxsIGlzIGRvbmUgYnJlYWsgKi8KKwkJCWJyZWFrOworCisJCSooRGF0YSArIGkpID0gTE9CWVRFKEluV29yZCk7CS8qIFdyaXRlIHNlY29uZCBieXRlICovCisJCWlmICgrK2kgPT0gTGVuZ3RoKQkJLyogQWxsIGlzIGRvbmUgYnJlYWsgKi8KKwkJCWJyZWFrOworCX0KKworCS8qIFJlc3RvcmUgb3JpZ2luYWwgdmFsdWVzICovCisJU0lGV1JJVEVXKG9sZF9zaWZhZHgsIFNJRkFEWCk7CisJU0lGV1JJVEVXKG9sZF9zaWZhZHIsIFNJRkFEUik7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBDYW5jZWwgYWxsIHF1ZXVlZCBwYWNrZXRzIGluIHRoZSB0cmFuc21pc3Npb24gcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX2NhbmNlbF90eF9xdWV1ZShzdHJ1Y3QgbmV0X2xvY2FsKiB0cCkKK3sKKwlUUEwgKnRwbDsKKworCS8qCisJICogTk9URTogVGhlcmUgbXVzdCBub3QgYmUgYW4gYWN0aXZlIFRSQU5TTUlUIGNvbW1hbmQgcGVuZGluZywgd2hlbgorCSAqIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorCSAqLworCWlmKHRwLT5UcmFuc21pdENvbW1hbmRBY3RpdmUpCisJCXJldHVybjsKKworCWZvcig7OykKKwl7CisJCXRwbCA9IHRwLT5UcGxCdXN5OworCQlpZighdHBsLT5CdXN5RmxhZykKKwkJCWJyZWFrOworCQkvKiAiUmVtb3ZlIiBUUEwgZnJvbSBidXN5IGxpc3QuICovCisJCXRwLT5UcGxCdXN5ID0gdHBsLT5OZXh0VFBMUHRyOworCQl0bXMzODB0cl93cml0ZV90cGxfc3RhdHVzKHRwbCwgMCk7CS8qIENsZWFyIFZBTElEIGJpdCAqLworCQl0cGwtPkJ1c3lGbGFnID0gMDsJCS8qICJmcmVlIiBUUEwgKi8KKworCQlwcmludGsoS0VSTl9JTkZPICJDYW5jZWwgdHggKCUwOGxYaCkuXG4iLCAodW5zaWduZWQgbG9uZyl0cGwpOworCQlpZiAodHBsLT5ETUFCdWZmKQorCQkJcGNpX3VubWFwX3NpbmdsZSh0cC0+cGRldiwgdHBsLT5ETUFCdWZmLCB0cGwtPlNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkodHBsLT5Ta2IpOworCX0KKworCXJldHVybjsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIGEgdHJhbnNtaXQgaW50ZXJydXB0IGlzIGdlbmVyYXRlZCBieSB0aGUKKyAqIGFkYXB0ZXIuIEZvciBhIGNvbW1hbmQgY29tcGxldGUgaW50ZXJydXB0LCBpdCBpcyBjaGVja2VkIGlmIHdlIGhhdmUgdG8KKyAqIGlzc3VlIGEgbmV3IHRyYW5zbWl0IGNvbW1hbmQgb3Igbm90LgorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl90eF9zdGF0dXNfaXJxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGNoYXIgSGlnaEJ5dGUsIEhpZ2hBYywgTG93QWM7CisJVFBMICp0cGw7CisKKwkvKiBOT1RFOiBBdCB0aGlzIHBvaW50IHRoZSBTU0IgZnJvbSBUUkFOU01JVCBTVEFUVVMgaXMgbm8gbG9uZ2VyCisJICogYXZhaWxhYmxlLCBiZWNhdXNlIHRoZSBDTEVBUiBTU0IgY29tbWFuZCBoYXMgYWxyZWFkeSBiZWVuIGlzc3VlZC4KKwkgKgorCSAqIFByb2Nlc3MgYWxsIGNvbXBsZXRlIHRyYW5zbWlzc2lvbnMuCisJICovCisKKwlmb3IoOzspCisJeworCQl0cGwgPSB0cC0+VHBsQnVzeTsKKwkJaWYoIXRwbC0+QnVzeUZsYWcgfHwgKHRwbC0+U3RhdHVzCisJCQkmIChUWF9WQUxJRCB8IFRYX0ZSQU1FX0NPTVBMRVRFKSkKKwkJCSE9IFRYX0ZSQU1FX0NPTVBMRVRFKQorCQl7CisJCQlicmVhazsKKwkJfQorCisJCS8qICJSZW1vdmUiIFRQTCBmcm9tIGJ1c3kgbGlzdC4gKi8KKwkJdHAtPlRwbEJ1c3kgPSB0cGwtPk5leHRUUExQdHIgOworCisJCS8qIENoZWNrIHRoZSB0cmFuc21pdCBzdGF0dXMgZmllbGQgb25seSBmb3IgZGlyZWN0ZWQgZnJhbWVzKi8KKwkJaWYoRElSRUNURURfRlJBTUUodHBsKSAmJiAodHBsLT5TdGF0dXMgJiBUWF9FUlJPUikgPT0gMCkKKwkJeworCQkJSGlnaEJ5dGUgPSBHRVRfVFJBTlNNSVRfU1RBVFVTX0hJR0hfQllURSh0cGwtPlN0YXR1cyk7CisJCQlIaWdoQWMgICA9IEdFVF9GUkFNRV9TVEFUVVNfSElHSF9BQyhIaWdoQnl0ZSk7CisJCQlMb3dBYyAgICA9IEdFVF9GUkFNRV9TVEFUVVNfTE9XX0FDKEhpZ2hCeXRlKTsKKworCQkJaWYoKEhpZ2hBYyAhPSBMb3dBYykgfHwgKEhpZ2hBYyA9PSBBQ19OT1RfUkVDT0dOSVpFRCkpCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAoREE9JTA4bFggbm90IHJlY29nbml6ZWQpXG4iLAorCQkJCQlkZXYtPm5hbWUsCisJCQkJCSoodW5zaWduZWQgbG9uZyAqKSZ0cGwtPk1EYXRhWzIrMl0pOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmKHRtczM4MHRyX2RlYnVnID4gMykKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBEaXJlY3RlZCBmcmFtZSB0eCdkXG4iLCAKKwkJCQkJCWRldi0+bmFtZSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZighRElSRUNURURfRlJBTUUodHBsKSkKKwkJCXsKKwkJCQlpZih0bXMzODB0cl9kZWJ1ZyA+IDMpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogQnJvYWRjYXN0IGZyYW1lIHR4J2RcbiIsCisJCQkJCQlkZXYtPm5hbWUpOworCQkJfQorCQl9CisKKwkJdHAtPk1hY1N0YXQudHhfcGFja2V0cysrOworCQlpZiAodHBsLT5ETUFCdWZmKQorCQkJcGNpX3VubWFwX3NpbmdsZSh0cC0+cGRldiwgdHBsLT5ETUFCdWZmLCB0cGwtPlNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYl9pcnEodHBsLT5Ta2IpOworCQl0cGwtPkJ1c3lGbGFnID0gMDsJLyogImZyZWUiIFRQTCAqLworCX0KKworCWlmKCF0cC0+VHBsRnJlZS0+TmV4dFRQTFB0ci0+QnVzeUZsYWcpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBDYWxsZWQgaWYgYSBmcmFtZSByZWNlaXZlIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgYnkgdGhlIGFkYXB0ZXIuCisgKiBDaGVjayBpZiB0aGUgZnJhbWUgaXMgdmFsaWQgYW5kIGluZGljYXRlIGl0IHRvIHN5c3RlbS4KKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfcmN2X3N0YXR1c19pcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgY2hhciAqUmVjZWl2ZURhdGFQdHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBpbnQgTGVuZ3RoLCBMZW5ndGgyOworCVJQTCAqcnBsOworCVJQTCAqU2F2ZUhlYWQ7CisJZG1hX2FkZHJfdCBkbWFidWY7CisKKwkvKiBOT1RFOiBBdCB0aGlzIHBvaW50IHRoZSBTU0IgZnJvbSBSRUNFSVZFIFNUQVRVUyBpcyBubyBsb25nZXIKKwkgKiBhdmFpbGFibGUsIGJlY2F1c2UgdGhlIENMRUFSIFNTQiBjb21tYW5kIGhhcyBhbHJlYWR5IGJlZW4gaXNzdWVkLgorCSAqCisJICogUHJvY2VzcyBhbGwgY29tcGxldGUgcmVjZWl2ZXMuCisJICovCisKKwlmb3IoOzspCisJeworCQlycGwgPSB0cC0+UnBsSGVhZDsKKwkJaWYocnBsLT5TdGF0dXMgJiBSWF9WQUxJRCkKKwkJCWJyZWFrOwkJLyogUlBMIHN0aWxsIGluIHVzZSBieSBhZGFwdGVyICovCisKKwkJLyogRm9yd2FyZCBSUExIZWFkIHBvaW50ZXIgdG8gbmV4dCBsaXN0LiAqLworCQlTYXZlSGVhZCA9IHRwLT5ScGxIZWFkOworCQl0cC0+UnBsSGVhZCA9IHJwbC0+TmV4dFJQTFB0cjsKKworCQkvKiBHZXQgdGhlIGZyYW1lIHNpemUgKEJ5dGUgc3dhcCBmb3IgSW50ZWwpLgorCQkgKiBEbyB0aGlzIGVhcmx5IChzZWUgd29ya2Fyb3VuZCBjb21tZW50IGJlbG93KQorCQkgKi8KKwkJTGVuZ3RoID0gYmUxNl90b19jcHUoKHVuc2lnbmVkIHNob3J0KXJwbC0+RnJhbWVTaXplKTsKKworCQkvKiBDaGVjayBpZiB0aGUgRnJhbWVfU3RhcnQsIEZyYW1lX0VuZCBhbmQKKwkJICogRnJhbWVfQ29tcGxldGUgYml0cyBhcmUgc2V0LgorCQkgKi8KKwkJaWYoKHJwbC0+U3RhdHVzICYgVkFMSURfU0lOR0xFX0JVRkZFUl9GUkFNRSkKKwkJCT09IFZBTElEX1NJTkdMRV9CVUZGRVJfRlJBTUUpCisJCXsKKwkJCVJlY2VpdmVEYXRhUHRyID0gcnBsLT5NRGF0YTsKKworCQkJLyogV29ya2Fyb3VuZCBmb3IgZGVsYXllZCB3cml0ZSBvZiBGcmFtZVNpemUgb24gSVNBCisJCQkgKiAoRnJhbWVTaXplIGlzIGZhbHNlIGJ1dCB2YWxpZC1iaXQgaXMgcmVzZXQpCisJCQkgKiBGcmFtZSBzaXplIGlzIHNldCB0byB6ZXJvIHdoZW4gdGhlIFJQTCBpcyBmcmVlZC4KKwkJCSAqIExlbmd0aDIgaXMgdGhlcmUgYmVjYXVzZSB0aGVyZSBoYXZlIGFsc28gYmVlbgorCQkJICogY2FzZXMgd2hlcmUgdGhlIEZyYW1lU2l6ZSB3YXMgcGFydGlhbGx5IHdyaXR0ZW4KKwkJCSAqLworCQkJTGVuZ3RoMiA9IGJlMTZfdG9fY3B1KCh1bnNpZ25lZCBzaG9ydClycGwtPkZyYW1lU2l6ZSk7CisKKwkJCWlmKExlbmd0aCA9PSAwIHx8IExlbmd0aCAhPSBMZW5ndGgyKQorCQkJeworCQkJCXRwLT5ScGxIZWFkID0gU2F2ZUhlYWQ7CisJCQkJYnJlYWs7CS8qIFJldHVybiB0byB0bXMzODB0cl9pbnRlcnJ1cHQgKi8KKwkJCX0KKwkJCXRtczM4MHRyX3VwZGF0ZV9yY3Zfc3RhdHModHAsUmVjZWl2ZURhdGFQdHIsTGVuZ3RoKTsKKwkJCSAgCisJCQlpZih0bXMzODB0cl9kZWJ1ZyA+IDMpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBQYWNrZXQgTGVuZ3RoICUwNFggKCVkKVxuIiwKKwkJCQkJZGV2LT5uYW1lLCBMZW5ndGgsIExlbmd0aCk7CisJCQkgIAorCQkJLyogSW5kaWNhdGUgdGhlIHJlY2VpdmVkIGZyYW1lIHRvIHN5c3RlbSB0aGUKKwkJCSAqIGFkYXB0ZXIgZG9lcyB0aGUgU291cmNlLVJvdXRpbmcgcGFkZGluZyBmb3IgCisJCQkgKiB1cy4gU2VlOiBPcGVuT3B0aW9ucyBpbiB0bXMzODB0cl9pbml0X29wYigpCisJCQkgKi8KKwkJCXNrYiA9IHJwbC0+U2tiOworCQkJaWYocnBsLT5Ta2JTdGF0ID09IFNLQl9VTkFWQUlMQUJMRSkKKwkJCXsKKwkJCQkvKiBUcnkgYWdhaW4gdG8gYWxsb2NhdGUgc2tiICovCisJCQkJc2tiID0gZGV2X2FsbG9jX3NrYih0cC0+TWF4UGFja2V0U2l6ZSk7CisJCQkJaWYoc2tiID09IE5VTEwpCisJCQkJeworCQkJCQkvKiBVcGRhdGUgU3RhdHMgPz8gKi8KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJc2tiLT5kZXYJPSBkZXY7CisJCQkJCXNrYl9wdXQoc2tiLCB0cC0+TWF4UGFja2V0U2l6ZSk7CisJCQkJCXJwbC0+U2tiU3RhdCAJPSBTS0JfREFUQV9DT1BZOworCQkJCQlSZWNlaXZlRGF0YVB0ciAJPSBycGwtPk1EYXRhOworCQkJCX0KKwkJCX0KKworCQkJaWYoc2tiICYmIChycGwtPlNrYlN0YXQgPT0gU0tCX0RBVEFfQ09QWQorCQkJCXx8IHJwbC0+U2tiU3RhdCA9PSBTS0JfRE1BX0RJUkVDVCkpCisJCQl7CisJCQkJaWYocnBsLT5Ta2JTdGF0ID09IFNLQl9EQVRBX0NPUFkpCisJCQkJCW1lbWNweShza2ItPmRhdGEsIFJlY2VpdmVEYXRhUHRyLCBMZW5ndGgpOworCisJCQkJLyogRGVsaXZlciBmcmFtZSB0byBzeXN0ZW0gKi8KKwkJCQlycGwtPlNrYiA9IE5VTEw7CisJCQkJc2tiX3RyaW0oc2tiLExlbmd0aCk7CisJCQkJc2tiLT5wcm90b2NvbCA9IHRyX3R5cGVfdHJhbnMoc2tiLGRldik7CisJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJfQorCQl9CisJCWVsc2UJLyogSW52YWxpZCBmcmFtZSAqLworCQl7CisJCQlpZihycGwtPlNrYiAhPSBOVUxMKQorCQkJCWRldl9rZnJlZV9za2JfaXJxKHJwbC0+U2tiKTsKKworCQkJLyogU2tpcCBsaXN0LiAqLworCQkJaWYocnBsLT5TdGF0dXMgJiBSWF9TVEFSVF9GUkFNRSkKKwkJCQkvKiBGcmFtZSBzdGFydCBiaXQgaXMgc2V0IC0+IG92ZXJmbG93LiAqLworCQkJCXRwLT5NYWNTdGF0LnJ4X2Vycm9ycysrOworCQl9CisJCWlmIChycGwtPkRNQUJ1ZmYpCisJCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCBycGwtPkRNQUJ1ZmYsIHRwLT5NYXhQYWNrZXRTaXplLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJcnBsLT5ETUFCdWZmID0gMDsKKworCQkvKiBBbGxvY2F0ZSBuZXcgc2tiIGZvciBycGwgKi8KKwkJcnBsLT5Ta2IgPSBkZXZfYWxsb2Nfc2tiKHRwLT5NYXhQYWNrZXRTaXplKTsKKwkJLyogc2tiID09IE5VTEwgPyB0aGVuIHVzZSBsb2NhbCBidWZmZXIgKi8KKwkJaWYocnBsLT5Ta2IgPT0gTlVMTCkKKwkJeworCQkJcnBsLT5Ta2JTdGF0ID0gU0tCX1VOQVZBSUxBQkxFOworCQkJcnBsLT5GcmFnTGlzdFswXS5EYXRhQWRkciA9IGh0b25sKCgoY2hhciAqKXRwLT5Mb2NhbFJ4QnVmZmVyc1tycGwtPlJQTEluZGV4XSAtIChjaGFyICopdHApICsgdHAtPmRtYWJ1ZmZlcik7CisJCQlycGwtPk1EYXRhID0gdHAtPkxvY2FsUnhCdWZmZXJzW3JwbC0+UlBMSW5kZXhdOworCQl9CisJCWVsc2UJLyogc2tiICE9IE5VTEwgKi8KKwkJeworCQkJcnBsLT5Ta2ItPmRldiA9IGRldjsKKwkJCXNrYl9wdXQocnBsLT5Ta2IsIHRwLT5NYXhQYWNrZXRTaXplKTsKKworCQkJLyogRGF0YSB1bnJlYWNoYWJsZSBmb3IgRE1BID8gdGhlbiB1c2UgbG9jYWwgYnVmZmVyICovCisJCQlkbWFidWYgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGRldiwgcnBsLT5Ta2ItPmRhdGEsIHRwLT5NYXhQYWNrZXRTaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJaWYodHAtPmRtYWxpbWl0ICYmIChkbWFidWYgKyB0cC0+TWF4UGFja2V0U2l6ZSA+IHRwLT5kbWFsaW1pdCkpCisJCQl7CisJCQkJcnBsLT5Ta2JTdGF0ID0gU0tCX0RBVEFfQ09QWTsKKwkJCQlycGwtPkZyYWdMaXN0WzBdLkRhdGFBZGRyID0gaHRvbmwoKChjaGFyICopdHAtPkxvY2FsUnhCdWZmZXJzW3JwbC0+UlBMSW5kZXhdIC0gKGNoYXIgKil0cCkgKyB0cC0+ZG1hYnVmZmVyKTsKKwkJCQlycGwtPk1EYXRhID0gdHAtPkxvY2FsUnhCdWZmZXJzW3JwbC0+UlBMSW5kZXhdOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIERNQSBkaXJlY3RseSBpbiBza2ItPmRhdGEgKi8KKwkJCQlycGwtPlNrYlN0YXQgPSBTS0JfRE1BX0RJUkVDVDsKKwkJCQlycGwtPkZyYWdMaXN0WzBdLkRhdGFBZGRyID0gaHRvbmwoZG1hYnVmKTsKKwkJCQlycGwtPk1EYXRhID0gcnBsLT5Ta2ItPmRhdGE7CisJCQkJcnBsLT5ETUFCdWZmID0gZG1hYnVmOworCQkJfQorCQl9CisKKwkJcnBsLT5GcmFnTGlzdFswXS5EYXRhQ291bnQgPSBjcHVfdG9fYmUxNigodW5zaWduZWQgc2hvcnQpdHAtPk1heFBhY2tldFNpemUpOworCQlycGwtPkZyYW1lU2l6ZSA9IDA7CisKKwkJLyogUGFzcyB0aGUgbGFzdCBSUEwgYmFjayB0byB0aGUgYWRhcHRlciAqLworCQl0cC0+UnBsVGFpbC0+RnJhbWVTaXplID0gMDsKKworCQkvKiBSZXNldCB0aGUgQ1NUQVQgZmllbGQgaW4gdGhlIGxpc3QuICovCisJCXRtczM4MHRyX3dyaXRlX3JwbF9zdGF0dXModHAtPlJwbFRhaWwsIFJYX1ZBTElEIHwgUlhfRlJBTUVfSVJRKTsKKworCQkvKiBDdXJyZW50IFJQTCBiZWNvbWVzIGxhc3Qgb25lIGluIGxpc3QuICovCisJCXRwLT5ScGxUYWlsID0gdHAtPlJwbFRhaWwtPk5leHRSUExQdHI7CisKKwkJLyogSW5mb3JtIGFkYXB0ZXIgYWJvdXQgUlBMIHZhbGlkLiAqLworCQl0bXMzODB0cl9leGVjX3NpZmNtZChkZXYsIENNRF9SWF9WQUxJRCk7CisJfQorCisJcmV0dXJuOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCB3aGVuZXZlciB0aGUgc3RhdHVzIG9mIGFueSBSUEwgbXVzdCBiZQorICogbW9kaWZpZWQgYnkgdGhlIGRyaXZlciwgYmVjYXVzZSB0aGUgY29tcGlsZXIgbWF5IG90aGVyd2lzZSBjaGFuZ2UgdGhlCisgKiBvcmRlciBvZiBpbnN0cnVjdGlvbnMgc3VjaCB0aGF0IHdyaXRpbmcgdGhlIFJQTCBzdGF0dXMgbWF5IGJlIGV4ZWN1dGVkCisgKiBhdCBhbiB1bmRlc2lyZWFibGUgdGltZS4gV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQsIHRoZSBzdGF0dXMgaXMKKyAqIGFsd2F5cyB3cml0dGVuIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAqLworc3RhdGljIHZvaWQgdG1zMzgwdHJfd3JpdGVfcnBsX3N0YXR1cyhSUEwgKnJwbCwgdW5zaWduZWQgaW50IFN0YXR1cykKK3sKKwlycGwtPlN0YXR1cyA9IFN0YXR1czsKKworCXJldHVybjsKK30KKworLyoKKyAqIFRoZSBmdW5jdGlvbiB1cGRhdGVzIHRoZSBzdGF0aXN0aWMgY291bnRlcnMgaW4gbWFjLT5NYWNTdGF0LgorICogSXQgZGlmZmVydGlhdGVzIGJldHdlZW4gZGlyZWN0ZWQgYW5kIGJyb2FkY2FzdC9tdWx0aWNhc3QgKCA9PWZ1bmN0aW9uYWwpCisgKiBmcmFtZXMuCisgKi8KK3N0YXRpYyB2b2lkIHRtczM4MHRyX3VwZGF0ZV9yY3Zfc3RhdHMoc3RydWN0IG5ldF9sb2NhbCAqdHAsIHVuc2lnbmVkIGNoYXIgRGF0YVB0cltdLAorCQkJCQl1bnNpZ25lZCBpbnQgTGVuZ3RoKQoreworCXRwLT5NYWNTdGF0LnJ4X3BhY2tldHMrKzsKKwl0cC0+TWFjU3RhdC5yeF9ieXRlcyArPSBMZW5ndGg7CisJCisJLyogVGVzdCBmdW5jdGlvbmFsIGJpdCAqLworCWlmKERhdGFQdHJbMl0gJiBHUk9VUF9CSVQpCisJCXRwLT5NYWNTdGF0Lm11bHRpY2FzdCsrOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHRtczM4MHRyX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBuZXRfbG9jYWwgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhZGRyID0gYWRkcjsKKwkKKwlpZiAodHAtPkFkYXB0ZXJPcGVuRmxhZyB8fCB0cC0+QWRhcHRlclZpcnRPcGVuRmxhZykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2Fubm90IHNldCBNQUMvTEFBIGFkZHJlc3Mgd2hpbGUgY2FyZCBpcyBvcGVuXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHNhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKKwlyZXR1cm4gMDsKK30KKworI2lmIFRNUzM4MFRSX0RFQlVHID4gMAorLyoKKyAqIER1bXAgUGFja2V0IChkYXRhKQorICovCitzdGF0aWMgdm9pZCB0bXMzODB0cl9kdW1wKHVuc2lnbmVkIGNoYXIgKkRhdGEsIGludCBsZW5ndGgpCit7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGxlbmd0aCAvIDg7IGkrKywgaiArPSA4KQorCXsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJICAgICAgIERhdGFbaiswXSxEYXRhW2orMV0sRGF0YVtqKzJdLERhdGFbaiszXSwKKwkJICAgICAgIERhdGFbais0XSxEYXRhW2orNV0sRGF0YVtqKzZdLERhdGFbais3XSk7CisJfQorCisJcmV0dXJuOworfQorI2VuZGlmCisKK3ZvaWQgdG1zZGV2X3Rlcm0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICp0cDsKKworCXRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCB0cC0+ZG1hYnVmZmVyLCBzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCksCisJCVBDSV9ETUFfQklESVJFQ1RJT05BTCk7Cit9CisKK2ludCB0bXNkZXZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGRtYWxpbWl0LCAKKwkJc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9sb2NhbCAqdG1zX2xvY2FsOworCisJbWVtc2V0KGRldi0+cHJpdiwgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpKTsKKwl0bXNfbG9jYWwgPSBuZXRkZXZfcHJpdihkZXYpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRtc19sb2NhbC0+d2FpdF9mb3JfdG9rX2ludCk7CisJdG1zX2xvY2FsLT5kbWFsaW1pdCA9IGRtYWxpbWl0OworCXRtc19sb2NhbC0+cGRldiA9IHBkZXY7CisJdG1zX2xvY2FsLT5kbWFidWZmZXIgPSBwY2lfbWFwX3NpbmdsZShwZGV2LCAodm9pZCAqKXRtc19sb2NhbCwKKwkgICAgc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCWlmICh0bXNfbG9jYWwtPmRtYWJ1ZmZlciArIHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSA+IGRtYWxpbWl0KQorCXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1lbW9yeSBub3QgYWNjZXNzaWJsZSBmb3IgRE1BXG4iLAorCQkJZGV2LT5uYW1lKTsKKwkJdG1zZGV2X3Rlcm0oZGV2KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCQorCS8qIFRoZXNlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjYXJkIGRyaXZlciBpZiBuZWVkZWQgKi8KKwlkZXYtPm9wZW4JCT0gdG1zMzgwdHJfb3BlbjsKKwlkZXYtPnN0b3AJCT0gdG1zMzgwdHJfY2xvc2U7CisJZGV2LT5kb19pb2N0bAkJPSBOVUxMOyAKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHRtczM4MHRyX3NlbmRfcGFja2V0OworCWRldi0+dHhfdGltZW91dAkJPSB0bXMzODB0cl90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBIWjsKKwlkZXYtPmdldF9zdGF0cwkJPSB0bXMzODB0cl9nZXRfc3RhdHM7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmdG1zMzgwdHJfc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+c2V0X21hY19hZGRyZXNzCT0gdG1zMzgwdHJfc2V0X21hY19hZGRyZXNzOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBNT0RVTEUKKworRVhQT1JUX1NZTUJPTCh0bXMzODB0cl9vcGVuKTsKK0VYUE9SVF9TWU1CT0wodG1zMzgwdHJfY2xvc2UpOworRVhQT1JUX1NZTUJPTCh0bXMzODB0cl9pbnRlcnJ1cHQpOworRVhQT1JUX1NZTUJPTCh0bXNkZXZfaW5pdCk7CitFWFBPUlRfU1lNQk9MKHRtc2Rldl90ZXJtKTsKK0VYUE9SVF9TWU1CT0wodG1zMzgwdHJfd2FpdCk7CisKK3N0cnVjdCBtb2R1bGUgKlRNUzM4MF9tb2R1bGUgPSBOVUxMOworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMiLCB2ZXJzaW9uKTsKKwkKKwlUTVMzODBfbW9kdWxlID0gJl9fdGhpc19tb2R1bGU7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlUTVMzODBfbW9kdWxlID0gTlVMTDsKK30KKyNlbmRpZgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVkVSU0lPTlMgIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgdG1zMzgwdHIuYyIKKyAqICBhbHQtY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgdG1zMzgwdHIuYyIKKyAqICBjLXNldC1zdHlsZSAiSyZSIgorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3RtczM4MHRyLmggYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvdG1zMzgwdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmM1YmEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3RtczM4MHRyLmgKQEAgLTAsMCArMSwxMTQxIEBACisvKiAKKyAqIHRtczM4MHRyLmg6IFRJIFRNUzM4MCBUb2tlbiBSaW5nIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiBBdXRob3JzOgorICogLSBDaHJpc3RvcGggR29vcyA8Y2dvb3NAc3lza29ubmVjdC5kZT4KKyAqIC0gQWRhbSBGcml0emxlciA8bWlkQGF1ay5jeD4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfVE1TMzgwVFJfSAorI2RlZmluZSBfX0xJTlVYX1RNUzM4MFRSX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisvKiBtb2R1bGUgcHJvdG90eXBlcyAqLworaW50IHRtczM4MHRyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgdG1zMzgwdHJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpcnFyZXR1cm5fdCB0bXMzODB0cl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitpbnQgdG1zZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBkbWFsaW1pdCwKKwkJc3RydWN0IHBjaV9kZXYgKnBkZXYpOwordm9pZCB0bXNkZXZfdGVybShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgdG1zMzgwdHJfd2FpdCh1bnNpZ25lZCBsb25nIHRpbWUpOworCisjZGVmaW5lIFRNUzM4MFRSX01BWF9BREFQVEVSUyA3CisKKyNkZWZpbmUgU0VORF9USU1FT1VUIDEwKkhaCisKKyNkZWZpbmUgVFJfUkNGX0xPTkdFU1RfRlJBTUVfTUFTSyAweDAwNzAKKyNkZWZpbmUgVFJfUkNGX0ZSQU1FNEsgMHgwMDMwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICBCaXQgb3JkZXIgZm9yIGFkYXB0ZXIgY29tbXVuaWNhdGlvbiB3aXRoIERNQQkJICAgICovCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICovCisvKiAgQml0ICA4IHwgOXwgMTB8IDExfHwgMTJ8IDEzfCAxNHwgMTV8fCAwfCAxfCAyfCAzfHwgNHwgNXwgNnwgN3wgICovCisvKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICovCisvKiAgVGhlIGJ5dGVzIGluIGEgd29yZCBtdXN0IGJlIGJ5dGUgc3dhcHBlZC4gQWxzbywgaWYgYSBkb3VibGUJICAgICovCisvKiAgd29yZCBpcyB1c2VkIGZvciBzdG9yYWdlLCB0aGVuIHRoZSB3b3JkcywgYXMgd2VsbCBhcyB0aGUgYnl0ZXMsICovCisvKiAgbXVzdCBiZSBzd2FwcGVkLiAJCQkJCQkgICAgKi8KKy8qICBCaXQgb3JkZXIgZm9yIGFkYXB0ZXIgY29tbXVuaWNhdGlvbiB3aXRoIERJTyAJCSAgICAqLworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAqLworLyogIEJpdCAgMCB8IDF8IDJ8IDN8fCA0fCA1fCA2fCA3fHwgOHwgOXwgMTB8IDExfHwgMTJ8IDEzfCAxNHwgMTV8ICAqLworLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTd2FwIHdvcmRzIG9mIGEgbG9uZy4gICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTV0FQVyh4KSAoKCh4KSA8PCAxNikgfCAoKHgpID4+IDE2KSkKKworLyogR2V0IHRoZSBsb3cgYnl0ZSBvZiBhIHdvcmQuICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExPQllURSh3KSAgICAgICAoKHVuc2lnbmVkIGNoYXIpKHcpKQorCisvKiBHZXQgdGhlIGhpZ2ggYnl0ZSBvZiBhIHdvcmQuICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSElCWVRFKHcpICAgICAgICgodW5zaWduZWQgY2hhcikoKHVuc2lnbmVkIHNob3J0KSh3KSA+PiA4KSkKKworLyogR2V0IHRoZSBsb3cgd29yZCBvZiBhIGxvbmcuICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExPV09SRChsKSAgICAgICAoKHVuc2lnbmVkIHNob3J0KShsKSkKKworLyogR2V0IHRoZSBoaWdoIHdvcmQgb2YgYSBsb25nLiAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhJV09SRChsKSAgICAgICAoKHVuc2lnbmVkIHNob3J0KSgodW5zaWduZWQgbG9uZykobCkgPj4gMTYpKQorCisKKworLyogVG9rZW4gcmluZyBhZGFwdGVyIEkvTyBhZGRyZXNzZXMgZm9yIG5vcm1hbCBtb2RlLiAqLworCisvKgorICogVGhlIFNJRiByZWdpc3RlcnMuICBDb21tb24gdG8gYWxsIGFkYXB0ZXJzLgorICovCisvKiBCYXNpYyBTSUYgKFNSU1ggPSAwKSAqLworI2RlZmluZSBTSUZEQVQgICAgICAJCTB4MDAJLyogU0lGL0RNQSBkYXRhLiAqLworI2RlZmluZSBTSUZJTkMgICAgICAJCTB4MDIgIAkvKiBJTyBXb3JkIGRhdGEgd2l0aCBhdXRvIGluY3JlbWVudC4gKi8KKyNkZWZpbmUgU0lGSU5IICAgICAgCQkweDAzICAJLyogSU8gQnl0ZSBkYXRhIHdpdGggYXV0byBpbmNyZW1lbnQuICovCisjZGVmaW5lIFNJRkFEUiAgICAgIAkJMHgwNCAgCS8qIFNJRi9ETUEgQWRkcmVzcy4gKi8KKyNkZWZpbmUgU0lGQ01EICAgICAgCQkweDA2ICAJLyogU0lGIENvbW1hbmQuICovCisjZGVmaW5lIFNJRlNUUyAgICAgIAkJMHgwNiAgCS8qIFNJRiBTdGF0dXMuICovCisKKy8qICJFeHRlbmRlZCIgU0lGIChTUlNYID0gMSkgKi8KKyNkZWZpbmUgU0lGQUNMICAgICAgCQkweDA4ICAJLyogU0lGIEFkYXB0ZXIgQ29udHJvbCBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgU0lGQUREICAgICAgCQkweDBhIAkvKiBTSUYvRE1BIEFkZHJlc3MuIC0tIDB4MGEgKi8KKyNkZWZpbmUgU0lGQURYICAgICAgCQkweDBjICAgICAvKiAweDBjICovCisjZGVmaW5lIERNQUxFTiAgICAgIAkJMHgwZSAJLyogU0lGIERNQSBsZW5ndGguIC0tIDB4MGUgKi8KKworLyoKKyAqIFBPUyBSZWdpc3RlcnMuICBPbmx5IGZvciBJU0EgQWRhcHRlcnMuCisgKi8KKyNkZWZpbmUgUE9TUkVHICAgICAgCQkweDEwIAkvKiBBZGFwdGVyIFByb2dyYW0gT3B0aW9uIFNlbGVjdCAoUE9TKQorCQkJIAkJICogUmVnaXN0ZXI6IGJhc2UgSU8gYWRkcmVzcyArIDE2IGJ5dGUuCisJCQkgCQkgKi8KKyNkZWZpbmUgUE9TUkVHXzIgICAgCQkyNEwgCS8qIG9ubHkgZm9yIFRSNC8xNisgYWRhcHRlcgorCQkJIAkJICogYmFzZSBJTyBhZGRyZXNzICsgMjQgYnl0ZS4gLS0gMHgxOAorCQkJIAkJICovCisKKy8qIFNJRkNNRCBjb21tYW5kIGNvZGVzIChoaWdoLWxvdykgKi8KKyNkZWZpbmUgQ01EX0lOVEVSUlVQVF9BREFQVEVSICAgMHg4MDAwICAvKiBDYXVzZSBpbnRlcm5hbCBhZGFwdGVyIGludGVycnVwdCAqLworI2RlZmluZSBDTURfQURBUFRFUl9SRVNFVCAgIAkweDQwMDAgIC8qIEhhcmR3YXJlIHJlc2V0IG9mIGFkYXB0ZXIgKi8KKyNkZWZpbmUgQ01EX1NTQl9DTEVBUgkJMHgyMDAwICAvKiBBY2tub3dsZWRnZSB0byBhZGFwdGVyIHRvCisJCQkJCSAqIHN5c3RlbSBpbnRlcnJ1cHRzLgorCQkJCQkgKi8KKyNkZWZpbmUgQ01EX0VYRUNVVEUJCTB4MTAwMAkvKiBFeGVjdXRlIFNDQiBjb21tYW5kICovCisjZGVmaW5lIENNRF9TQ0JfUkVRVUVTVAkJMHgwODAwICAvKiBSZXF1ZXN0IGFkYXB0ZXIgdG8gaW50ZXJydXB0CisJCQkJCSAqIHN5c3RlbSB3aGVuIFNDQiBpcyBhdmFpbGFibGUgZm9yCisJCQkJCSAqIGFub3RoZXIgY29tbWFuZC4KKwkJCQkJICovCisjZGVmaW5lIENNRF9SWF9DT05USU5VRQkJMHgwNDAwICAvKiBDb250aW51ZSByZWNlaXZlIGFmdGVyIG9kZCBwb2ludGVyCisJCQkJCSAqIHN0b3AuIChvZGQgcG9pbnRlciByZWNlaXZlIG1ldGhvZCkKKwkJCQkJICovCisjZGVmaW5lIENNRF9SWF9WQUxJRAkJMHgwMjAwICAvKiBOb3cgYWN0dWFsIFJQTCBpcyB2YWxpZC4gKi8KKyNkZWZpbmUgQ01EX1RYX1ZBTElECQkweDAxMDAgIC8qIE5vdyBhY3R1YWwgVFBMIGlzIHZhbGlkLiAodmFsaWQKKwkJCQkJICogYml0IHJlY2VpdmUvdHJhbnNtaXQgbWV0aG9kKQorCQkJCQkgKi8KKyNkZWZpbmUgQ01EX1NZU1RFTV9JUlEJCTB4MDA4MCAgLyogQWRhcHRlci10by1hdHRhY2hlZC1zeXN0ZW0KKwkJCQkJICogaW50ZXJydXB0IGlzIHJlc2V0LgorCQkJCQkgKi8KKyNkZWZpbmUgQ01EX0NMRUFSX1NZU1RFTV9JUlEJMHgwMDgwCS8qIENsZWFyIFNZU1RFTV9JTlRFUlJVUFQgYml0LgorCQkJCQkgKiAod3JpdGU6IDE9aWdub3JlLCAwPXJlc2V0KQorCQkJCQkgKi8KKyNkZWZpbmUgRVhFQ19TT0ZUX1JFU0VUCQkweEZGMDAgIC8qIGFkYXB0ZXIgc29mdCByZXNldC4gKHJlc3RhcnQKKwkJCQkJICogYWRhcHRlciBhZnRlciBoYXJkd2FyZSByZXNldCkKKwkJCQkJICovCisKKworLyogQUNMIGNvbW1hbmRzIChoaWdoLWxvdykgKi8KKyNkZWZpbmUgQUNMX1NXSExEQQkJMHgwODAwICAvKiBTb2Z0d2FyZSBob2xkIGFja25vd2xlZGdlLiAqLworI2RlZmluZSBBQ0xfU1dERElSCQkweDA0MDAgIC8qIERhdGEgdHJhbnNmZXIgZGlyZWN0aW9uLiAqLworI2RlZmluZSBBQ0xfU1dIUlEJCTB4MDIwMCAgLyogUHNldWRvIERNQSBvcGVyYXRpb24uICovCisjZGVmaW5lIEFDTF9QU0RNQUVOCQkweDAxMDAgIC8qIEVuYWJsZSBwc2V1ZG8gc3lzdGVtIERNQS4gKi8KKyNkZWZpbmUgQUNMX0FSRVNFVAkJMHgwMDgwICAvKiBBZGFwdGVyIGhhcmR3YXJlIHJlc2V0IGNvbW1hbmQuCisJCQkJCSAqIChoZWxkIGluIHJlc2V0IGNvbmRpdGlvbiBhcworCQkJCQkgKiBsb25nIGFzIGJpdCBpcyBzZXQpCisJCQkJCSAqLworI2RlZmluZSBBQ0xfQ1BIQUxUCQkweDAwNDAgIC8qIENvbW11bmljYXRpb24gcHJvY2Vzc29yIGhhbHQuCisJCQkJCSAqIChjYW4gb25seSBiZSBzZXQgd2hpbGUgQUNMX0FSRVNFVAorCQkJCQkgKiBiaXQgaXMgc2V0OyBwcmV2ZW50cyBhZGFwdGVyCisJCQkJCSAqIHByb2Nlc3NvciBmcm9tIGV4ZWN1dGluZyBjb2RlIHdoaWxlCisJCQkJCSAqIGRvd25sb2FkaW5nIGZpcm13YXJlKQorCQkJCQkgKi8KKyNkZWZpbmUgQUNMX0JPT1QJCTB4MDAyMAorI2RlZmluZSBBQ0xfU0lOVEVOCQkweDAwMDggIC8qIFN5c3RlbSBpbnRlcnJ1cHQgZW5hYmxlL2Rpc2FibGUKKwkJCQkJICogKDEvMCk6IGNhbiBiZSB3cml0dGVuIGlmIEFDTF9BUkVTRVQKKwkJCQkJICogaXMgemVyby4KKwkJCQkJICovCisjZGVmaW5lIEFDTF9QRU4gICAgICAgICAgICAgICAgIDB4MDAwNAorCisjZGVmaW5lIEFDTF9OU0VMT1VUMCAgICAgICAgICAgIDB4MDAwMiAKKyNkZWZpbmUgQUNMX05TRUxPVVQxICAgICAgICAgICAgMHgwMDAxCS8qIE5TRUxPVVR4IGhhdmUgYSBjYXJkLXNwZWNpZmljCisJCQkJCSAqIG1lYW5pbmcgZm9yIHNldHRpbmcgcmluZyBzcGVlZC4KKwkJCQkJICovCisKKyNkZWZpbmUgUFNfRE1BX01BU0sJCShBQ0xfU1dIUlEgfCBBQ0xfUFNETUFFTikKKworCisvKiBTSUZTVFMgcmVnaXN0ZXIgcmV0dXJuIGNvZGVzIChoaWdoLWxvdykgKi8KKyNkZWZpbmUgU1RTX1NZU1RFTV9JUlEJCTB4MDA4MAkvKiBBZGFwdGVyLXRvLWF0dGFjaGVkLXN5c3RlbQorCQkJCQkgKiBpbnRlcnJ1cHQgaXMgdmFsaWQuCisJCQkJCSAqLworI2RlZmluZSBTVFNfSU5JVElBTElaRQkJMHgwMDQwICAvKiBJTklUSUFMSVpFIHN0YXR1cy4gKHJlYWR5IHRvCisJCQkJCSAqIGluaXRpYWxpemUpCisJCQkJCSAqLworI2RlZmluZSBTVFNfVEVTVAkJMHgwMDIwICAvKiBURVNUIHN0YXR1cy4gKEJVRCBub3QgY29tcGxldGVkKSAqLworI2RlZmluZSBTVFNfRVJST1IJCTB4MDAxMCAgLyogRVJST1Igc3RhdHVzLiAodW5yZWNvdmVyYWJsZQorCQkJCQkgKiBIVyBlcnJvciBvY2N1cnJlZCkKKwkJCQkJICovCisjZGVmaW5lIFNUU19NQVNLCQkweDAwRjAgIC8qIE1hc2sgaW50ZXJlc3Rpbmcgc3RhdHVzIGJpdHMuICovCisjZGVmaW5lIFNUU19FUlJPUl9NQVNLCQkweDAwMEYgIC8qIEdldCBFcnJvciBDb2RlIGJ5IG1hc2tpbmcgdGhlCisJCQkJCSAqIGludGVycnVwdCBjb2RlIGJpdHMuCisJCQkJCSAqLworI2RlZmluZSBBREFQVEVSX0lOVF9QVFJTCTB4MEEwMCAgLyogQWRkcmVzcyBvZmZzZXQgb2YgYWRhcHRlciBpbnRlcm5hbAorCQkJCQkgKiBwb2ludGVycyAwMTowYTAwIChoaWdoLWxvdykgaGF2ZSB0bworCQkJCQkgKiBiZSByZWFkIGFmdGVyIGluaXQgYW5kIGJlZm9yZSBvcGVuLgorCQkJCQkgKi8KKworCisvKiBJbnRlcnJ1cHQgQ29kZXMgKG9ubHkgTUFDIElSUXMpICovCisjZGVmaW5lIFNUU19JUlFfQURBUFRFUl9DSEVDSwkweDAwMDAJLyogdW5yZWNvdmVyYWJsZSBoYXJkd2FyZSBvcgorCQkJCQkgKiBzb2Z0d2FyZSBlcnJvci4KKwkJCQkJICovIAorI2RlZmluZSBTVFNfSVJRX1JJTkdfU1RBVFVTCTB4MDAwNCAgLyogU1NCIGlzIHVwZGF0ZWQgd2l0aCByaW5nIHN0YXR1cy4gKi8KKyNkZWZpbmUgU1RTX0lSUV9MTENfU1RBVFVTCTB4MDAwNQkvKiBOb3QgdXNlZCBpbiBNQUMtb25seSBtaWNyb2NvZGUgKi8KKyNkZWZpbmUgU1RTX0lSUV9TQ0JfQ0xFQVIJMHgwMDA2CS8qIFNDQiBjbGVhciwgZm9sbG93aW5nIGFuCisJCQkJCSAqIFNDQl9SRVFVRVNUIElSUS4KKwkJCQkJICovCisjZGVmaW5lIFNUU19JUlFfVElNRVIJCTB4MDAwNwkvKiBOb3Qgbm9ybWFsbHkgdXNlZCBpbiBNQUMgdWNvZGUgKi8KKyNkZWZpbmUgU1RTX0lSUV9DT01NQU5EX1NUQVRVUwkweDAwMDgJLyogU1NCIGlzIHVwZGF0ZWQgd2l0aCBjb21tYW5kIAorCQkJCQkgKiBzdGF0dXMuCisJCQkJCSAqLyAKKyNkZWZpbmUgU1RTX0lSUV9SRUNFSVZFX1NUQVRVUwkweDAwMEEJLyogU1NCIGlzIHVwZGF0ZWQgd2l0aCByZWNlaXZlCisJCQkJCSAqIHN0YXR1cy4KKwkJCQkJICovCisjZGVmaW5lIFNUU19JUlFfVFJBTlNNSVRfU1RBVFVTCTB4MDAwQwkvKiBTU0IgaXMgdXBkYXRlZCB3aXRoIHRyYW5zbWl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3RhdHVzCisJCQkJCSAqLworI2RlZmluZSBTVFNfSVJRX1JFQ0VJVkVfUEVORElORwkweDAwMEUJLyogTm90IHVzZWQgaW4gTUFDLW9ubHkgbWljcm9jb2RlICovCisjZGVmaW5lIFNUU19JUlFfTUFTSwkJMHgwMDBGCS8qID0gU1RTX0VSUk9SX01BU0suICovCisKKworLyogVFJBTlNNSVRfU1RBVFVTIGNvbXBsZXRpb24gY29kZTogKFNTQi5QYXJtWzBdKSAqLworI2RlZmluZSBDT01NQU5EX0NPTVBMRVRFCTB4MDA4MAkvKiBUUkFOU01JVCBjb21tYW5kIGNvbXBsZXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChhdm9pZCB0aGlzISkgaXNzdWUgYW5vdGhlciB0cmFuc21pdAorCQkJCQkgKiB0byBzZW5kIGFkZGl0aW9uYWwgZnJhbWVzLgorCQkJCQkgKi8KKyNkZWZpbmUgRlJBTUVfQ09NUExFVEUJCTB4MDA0MAkvKiBGcmFtZSBoYXMgYmVlbiB0cmFuc21pdHRlZDsKKwkJCQkJICogSU5URVJSVVBUX0ZSQU1FIGJpdCB3YXMgc2V0IGluIHRoZQorCQkJCQkgKiBDU1RBVCByZXF1ZXN0OyBpbmRpY2F0aW9uIG9mIHBvc3NpYmx5CisJCQkJCSAqIG1vcmUgdGhhbiBvbmUgZnJhbWUgdHJhbnNtaXNzaW9ucyEKKwkJCQkJICogU1NCLlBhcm1bMC0xXTogMzIgYml0IHBvaW50ZXIgdG8KKwkJCQkJICogVFBMIG9mIGxhc3QgZnJhbWUuCisJCQkJCSAqLworI2RlZmluZSBMSVNUX0VSUk9SCQkweDAwMjAJLyogRXJyb3IgaW4gb25lIG9mIHRoZSBUUExzIHRoYXQKKwkJCQkJICogY29tcG9zZSB0aGUgZnJhbWU7IFRSQU5TTUlUCisJCQkJCSAqIHRlcm1pbmF0ZWQ7IFBhcm1bMS0yXTogMzJiaXQgcG9pbnRlcgorCQkJCQkgKiB0byBUUEwgd2hpY2ggc3RhcnRzIHRoZSBlcnJvcgorCQkJCQkgKiBmcmFtZTsgZXJyb3IgZGV0YWlscyBpbiBiaXRzIDgtMTMuCisJCQkJCSAqICgxND8pCisJCQkJCSAqLworI2RlZmluZSBGUkFNRV9TSVpFX0VSUk9SCTB4ODAwMAkvKiBGUkFNRV9TSVpFIGRvZXMgbm90IGVxdWFsIHRoZSBzdW0gb2YKKwkJCQkJICogdGhlIHZhbGlkIERBVEFfQ09VTlQgZmllbGRzOworCQkJCQkgKiBGUkFNRV9TSVpFIGxlc3MgdGhhbiBoZWFkZXIgcGx1cworCQkJCQkgKiBpbmZvcm1hdGlvbiBmaWVsZC4gKDE1IGJ5dGVzICsKKwkJCQkJICogcm91dGluZyBmaWVsZCkgT3IgaWYgRlJBTUVfU0laRQorCQkJCQkgKiB3YXMgc3BlY2lmaWVkIGFzIHplcm8gaW4gb25lIGxpc3QuCisJCQkJCSAqLworI2RlZmluZSBUWF9USFJFU0hPTEQJCTB4NDAwMAkvKiBGUkFNRV9TSVpFIGdyZWF0ZXIgdGhhbiAoQlVGRkVSX1NJWkUKKwkJCQkJICogLSA5KSAqIFRYX0JVRl9NQVguCisJCQkJCSAqLworI2RlZmluZSBPRERfQUREUkVTUwkJMHgyMDAwCS8qIE9kZCBmb3J3YXJkIHBvaW50ZXIgdmFsdWUgaXMKKwkJCQkJICogcmVhZCBvbiBhIGxpc3Qgd2l0aG91dCBFTkRfRlJBTUUKKwkJCQkJICogaW5kaWNhdGlvbi4KKwkJCQkJICovCisjZGVmaW5lIEZSQU1FX0VSUk9SCQkweDEwMDAJLyogU1RBUlRfRlJBTUUgYml0IChub3QpIGFudGljaXBhdGVkLAorCQkJCQkgKiBidXQgKG5vdCkgc2V0LgorCQkJCQkgKi8KKyNkZWZpbmUgQUNDRVNTX1BSSU9SSVRZX0VSUk9SCTB4MDgwMAkvKiBBY2Nlc3MgcHJpb3JpdHkgcmVxdWVzdGVkIGhhcyBub3QKKwkJCQkJICogYmVlbiBhbGxvd2VkLgorCQkJCQkgKi8KKyNkZWZpbmUgVU5FTkFCTEVEX01BQ19GUkFNRQkweDA0MDAJLyogTUFDIGZyYW1lIGhhcyBzb3VyY2UgY2xhc3Mgb2YgemVybworCQkJCQkgKiBvciBNQUMgZnJhbWUgUENGIEFUVE4gZmllbGQgaXMKKwkJCQkJICogZ3JlYXRlciB0aGFuIG9uZS4KKwkJCQkJICovCisjZGVmaW5lIElMTEVHQUxfRlJBTUVfRk9STUFUCTB4MDIwMAkvKiBCaXQgMCBvciBGQyBmaWVsZCB3YXMgc2V0IHRvIG9uZS4gKi8KKworCisvKgorICogU2luY2Ugd2UgbmVlZCB0byBzdXBwb3J0IHNvbWUgZnVuY3Rpb25zIGV2ZW4gaWYgdGhlIGFkYXB0ZXIgaXMgaW4gYQorICogQ0xPU0VEIHN0YXRlLCB3ZSBoYXZlIGEgKHBzZXVkby0pIGNvbW1hbmQgcXVldWUgd2hpY2ggaG9sZHMgY29tbWFuZHMKKyAqIHRoYXQgYXJlIG91dHN0YW5kaWcgdG8gYmUgZXhlY3V0ZWQuCisgKgorICogRWFjaCB0aW1lIGEgY29tbWFuZCBjb21wbGV0ZXMsIGFuIGludGVycnVwdCBvY2N1cnMgYW5kIHRoZSBuZXh0CisgKiBjb21tYW5kIGlzIGV4ZWN1dGVkLiBUaGUgY29tbWFuZCBxdWV1ZSBpcyBhY3R1YWxseSBhIHNpbXBsZSB3b3JkIHdpdGggCisgKiBhIGJpdCBmb3IgZWFjaCBvdXRzdGFuZGlnIGNvbW1hbmQuIFRoZXJlZm9yZSB0aGUgY29tbWFuZHMgd2lsbCBub3QgYmUKKyAqIGV4ZWN1dGVkIGluIHRoZSBvcmRlciB0aGV5IGhhdmUgYmVlbiBxdWV1ZWQuCisgKgorICogVGhlIGZvbGxvd2luZyBkZWZpbmVzIHRoZSBjb21tYW5kIGNvZGUgYml0cyBhbmQgdGhlIGNvbW1hbmQgcXVldWU6CisgKi8KKyNkZWZpbmUgT0NfT1BFTgkJCTB4MDAwMQkvKiBPUEVOIGNvbW1hbmQgKi8KKyNkZWZpbmUgT0NfVFJBTlNNSVQJCTB4MDAwMgkvKiBUUkFOU01JVCBjb21tYW5kICovCisjZGVmaW5lIE9DX1RSQU5TTUlUX0hBTFQJMHgwMDA0CS8qIFRSQU5TTUlUX0hBTFQgY29tbWFuZCAqLworI2RlZmluZSBPQ19SRUNFSVZFCQkweDAwMDgJLyogUkVDRUlWRSBjb21tYW5kICovCisjZGVmaW5lIE9DX0NMT1NFCQkweDAwMTAJLyogQ0xPU0UgY29tbWFuZCAqLworI2RlZmluZSBPQ19TRVRfR1JPVVBfQUREUgkweDAwMjAJLyogU0VUX0dST1VQX0FERFIgY29tbWFuZCAqLworI2RlZmluZSBPQ19TRVRfRlVOQ1RfQUREUgkweDAwNDAJLyogU0VUX0ZVTkNUX0FERFIgY29tbWFuZCAqLworI2RlZmluZSBPQ19SRUFEX0VSUk9SX0xPRwkweDAwODAJLyogUkVBRF9FUlJPUl9MT0cgY29tbWFuZCAqLworI2RlZmluZSBPQ19SRUFEX0FEQVBURVIJCTB4MDEwMAkvKiBSRUFEX0FEQVBURVIgY29tbWFuZCAqLworI2RlZmluZSBPQ19NT0RJRllfT1BFTl9QQVJNUwkweDA0MDAJLyogTU9ESUZZX09QRU5fUEFSTVMgY29tbWFuZCAqLworI2RlZmluZSBPQ19SRVNUT1JFX09QRU5fUEFSTVMJMHgwODAwCS8qIFJFU1RPUkVfT1BFTl9QQVJNUyBjb21tYW5kICovCisjZGVmaW5lIE9DX1NFVF9GSVJTVF8xNl9HUk9VUAkweDEwMDAJLyogU0VUX0ZJUlNUXzE2X0dST1VQIGNvbW1hbmQgKi8KKyNkZWZpbmUgT0NfU0VUX0JSSURHRV9QQVJNUwkweDIwMDAJLyogU0VUX0JSSURHRV9QQVJNUyBjb21tYW5kICovCisjZGVmaW5lIE9DX0NPTkZJR19CUklER0VfUEFSTVMJMHg0MDAwCS8qIENPTkZJR19CUklER0VfUEFSTVMgY29tbWFuZCAqLworCisjZGVmaW5lIE9QRU4JCQkweDAzMDAJLyogQzogb3BlbiBjb21tYW5kLiBTOiBjb21wbGV0aW9uLiAqLworI2RlZmluZSBUUkFOU01JVAkJMHgwNDAwCS8qIEM6IHRyYW5zbWl0IGNvbW1hbmQuIFM6IGNvbXBsZXRpb24KKwkJCQkJICogc3RhdHVzLiAocmVqZWN0OiBDT01NQU5EX1JFSkVDVCBpZgorCQkJCQkgKiBhZGFwdGVyIG5vdCBvcGVuZWQsIFRSQU5TTUlUIGFscmVhZHkKKwkJCQkJICogaXNzdWVkIG9yIGFkZHJlc3MgcGFzc2VkIGluIHRoZSBTQ0IKKwkJCQkJICogbm90IHdvcmQgYWxpZ25lZCkKKwkJCQkJICovCisjZGVmaW5lIFRSQU5TTUlUX0hBTFQJCTB4MDUwMAkvKiBDOiBpbnRlcnJ1cHQgVFggVFBMIGNoYWluOyBpZiBubworCQkJCQkgKiBUUkFOU01JVCBjb21tYW5kIGlzc3VlZCwgdGhlIGNvbW1hbmQKKwkJCQkJICogaXMgaWdub3JlZCAoY29tcGxldGlvbiB3aXRoIFRSQU5TTUlUCisJCQkJCSAqIHN0YXR1cyAoMHgwNDAwKSEpCisJCQkJCSAqLworI2RlZmluZSBSRUNFSVZFCQkJMHgwNjAwCS8qIEM6IHJlY2VpdmUgY29tbWFuZC4gUzogY29tcGxldGlvbgorCQkJCQkgKiBzdGF0dXMuIChyZWplY3Q6IENPTU1BTkRfUkVKRUNUIGlmCisJCQkJCSAqIGFkYXB0ZXIgbm90IG9wZW5lZCwgUkVDRUlWRSBhbHJlYWR5CisJCQkJCSAqIGlzc3VlZCBvciBhZGRyZXNzIHBhc3NlZCBpbiB0aGUgU0NCIAorCQkJCQkgKiBub3Qgd29yZCBhbGlnbmVkKQorCQkJCQkgKi8KKyNkZWZpbmUgQ0xPU0UJCQkweDA3MDAJLyogQzogY2xvc2UgYWRhcHRlci4gUzogY29tcGxldGlvbi4KKwkJCQkJICogKENPTU1BTkRfUkVKRUNUIGlmIGFkYXB0ZXIgbm90IG9wZW4pCisJCQkJCSAqLworI2RlZmluZSBTRVRfR1JPVVBfQUREUgkJMHgwODAwCS8qIEM6IGFsdGVyIGFkYXB0ZXIgZ3JvdXAgYWRkcmVzcyBhZnRlcgorCQkJCQkgKiBPUEVOLiBTOiBjb21wbGV0aW9uLiAoQ09NTUFORF9SRUpFQ1QKKwkJCQkJICogaWYgYWRhcHRlciBub3Qgb3BlbikKKwkJCQkJICovCisjZGVmaW5lIFNFVF9GVU5DVF9BRERSCQkweDA5MDAJLyogQzogYWx0ZXIgYWRhcHRlciBmdW5jdGlvbmFsIGFkZHJlc3MKKwkJCQkJICogYWZ0ZXIgT1BFTi4gUzogY29tcGxldGlvbi4KKwkJCQkJICogKENPTU1BTkRfUkVKRUNUIGlmIGFkYXB0ZXIgbm90IG9wZW4pCisJCQkJCSAqLworI2RlZmluZSBSRUFEX0VSUk9SX0xPRwkJMHgwQTAwCS8qIEM6IHJlYWQgYWRhcHRlciBlcnJvciBjb3VudGVycy4KKwkJCQkJICogUzogY29tcGxldGlvbi4gKGNvbW1hbmQgaWdub3JlZAorCQkJCQkgKiBpZiBhZGFwdGVyIG5vdCBvcGVuISkKKwkJCQkJICovCisjZGVmaW5lIFJFQURfQURBUFRFUgkJMHgwQjAwCS8qIEM6IHJlYWQgZGF0YSBmcm9tIGFkYXB0ZXIgbWVtb3J5LgorCQkJCQkgKiAoaW1wb3J0YW50OiBhZnRlciBpbml0IGFuZCBiZWZvcmUKKwkJCQkJICogb3BlbiEpIFM6IGNvbXBsZXRpb24uIChBREFQVEVSX0NIRUNLCisJCQkJCSAqIGludGVycnVwdCBpZiB1bmRlZmluZWQgc3RvcmFnZSBhcmVhCisJCQkJCSAqIHJlYWQpCisJCQkJCSAqLworI2RlZmluZSBNT0RJRllfT1BFTl9QQVJNUwkweDBEMDAJLyogQzogbW9kaWZ5IHNvbWUgYWRhcHRlciBvcGVyYXRpb25hbAorCQkJCQkgKiBwYXJhbWV0ZXJzLiAoYml0IGNvcnJlc3BvbmRlbmQgdG8KKwkJCQkJICogV1JBUF9JTlRFUkZBQ0UgaXMgaWdub3JlZCkKKwkJCQkJICogUzogY29tcGxldGlvbi4gKHJlamVjdDogCisJCQkJCSAqIENPTU1BTkRfUkVKRUNUKQorCQkJCQkgKi8KKyNkZWZpbmUgUkVTVE9SRV9PUEVOX1BBUk1TCTB4MEUwMAkvKiBDOiBtb2RpZnkgc29tZSBhZGFwdGVyIG9wZXJhdGlvbmFsCisJCQkJCSAqIHBhcmFtZXRlcnMuIChiaXQgY29ycmVzcG9uZGVuZAorCQkJCQkgKiB0byBXUkFQX0lOVEVSRkFDRSBpcyBpZ25vcmVkKQorCQkJCQkgKiBTOiBjb21wbGV0aW9uLiAocmVqZWN0OgorCQkJCQkgKiBDT01NQU5EX1JFSkVDVCkKKwkJCQkJICovCisjZGVmaW5lIFNFVF9GSVJTVF8xNl9HUk9VUAkweDBGMDAJLyogQzogYWx0ZXIgdGhlIGZpcnN0IHR3byBieXRlcyBpbgorCQkJCQkgKiBhZGFwdGVyIGdyb3VwIGFkZHJlc3MuCisJCQkJCSAqIFM6IGNvbXBsZXRpb24uIChyZWplY3Q6CisJCQkJCSAqIENPTU1BTkRfUkVKRUNUKQorCQkJCQkgKi8KKyNkZWZpbmUgU0VUX0JSSURHRV9QQVJNUwkweDEwMDAJLyogQzogdmFsdWVzIGFuZCBjb25kaXRpb25zIGZvciB0aGUKKwkJCQkJICogYWRhcHRlciBoYXJkd2FyZSB0byB1c2Ugd2hlbiBmcmFtZXMKKwkJCQkJICogYXJlIGNvcGllZCBmb3IgZm9yd2FyZGluZy4KKwkJCQkJICogUzogY29tcGxldGlvbi4gKHJlamVjdDoKKwkJCQkJICogQ09NTUFORF9SRUpFQ1QpCisJCQkJCSAqLworI2RlZmluZSBDT05GSUdfQlJJREdFX1BBUk1TCTB4MTEwMAkvKiBDOiAuLgorCQkJCQkgKiBTOiBjb21wbGV0aW9uLiAocmVqZWN0OgorCQkJCQkgKiBDT01NQU5EX1JFSkVDVCkKKwkJCQkJICovCisKKyNkZWZpbmUgU1BFRURfNAkJCTQKKyNkZWZpbmUgU1BFRURfMTYJCTE2CS8qIERlZmF1bHQgdHJhbnNtaXNzaW9uIHNwZWVkICAqLworCisKKy8qIEluaXRpYWxpemF0aW9uIFBhcmFtZXRlciBCbG9jayAoSVBCKTsgd29yZCBhbGlnbm1lbnQgbmVjZXNzYXJ5ISAqLworI2RlZmluZSBCVVJTVF9TSVpFCTB4MDAxOAkvKiBEZWZhdWx0IGJ1cnN0IHNpemUgKi8KKyNkZWZpbmUgQlVSU1RfTU9ERQkweDlGMDAJLyogQnVyc3QgbW9kZSBlbmFibGUgKi8KKyNkZWZpbmUgRE1BX1JFVFJJRVMJMHgwNTA1CS8qIE1hZ2ljIERNQSByZXRyeSBudW1iZXIuLi4gKi8KKworI2RlZmluZSBDWUNMRV9USU1FCTMJLyogRGVmYXVsdCBBVC1idXMgY3ljbGUgdGltZTogNTAwIG5zCisJCQkJICogKGxhdGVyIGFkYXB0ZXIgdmVyc2lvbjogZml4ICBjeWNsZSB0aW1lISkKKwkJCQkgKi8KKyNkZWZpbmUgTElORV9TUEVFRF9CSVQJMHg4MAorCisvKiBNYWNybyBkZWZpbml0aW9uIGZvciB0aGUgd2FpdCBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgT05FX1NFQ09ORF9USUNLUwkxMDAwMDAwCisjZGVmaW5lIEhBTEZfU0VDT05ECQkoT05FX1NFQ09ORF9USUNLUyAvIDIpCisjZGVmaW5lIE9ORV9TRUNPTkQJCShPTkVfU0VDT05EX1RJQ0tTKQorI2RlZmluZSBUV09fU0VDT05EUwkJKE9ORV9TRUNPTkRfVElDS1MgKiAyKQorI2RlZmluZSBUSFJFRV9TRUNPTkRTCQkoT05FX1NFQ09ORF9USUNLUyAqIDMpCisjZGVmaW5lIEZPVVJfU0VDT05EUwkJKE9ORV9TRUNPTkRfVElDS1MgKiA0KQorI2RlZmluZSBGSVZFX1NFQ09ORFMJCShPTkVfU0VDT05EX1RJQ0tTICogNSkKKworI2RlZmluZSBCVUZGRVJfU0laRSAJCTIwNDgJLyogQnVmZmVycyBvbiBBZGFwdGVyICovCisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IEluaXRfT3B0aW9uczsJLyogSW5pdGlhbGl6ZSB3aXRoIGJ1cnN0IG1vZGU7CisJCQkJCSAqIExMQyBkaXNhYmxlZC4gKE1BQyBvbmx5KQorCQkJCQkgKi8KKworCS8qIEludGVycnVwdCB2ZWN0b3JzIHRoZSBhZGFwdGVyIHBsYWNlcyBvbiBhdHRhY2hlZCBzeXN0ZW0gYnVzLiAqLworCXVfaW50OF90ICBDTURfU3RhdHVzX0lWOyAgICAvKiBJbnRlcnJ1cHQgdmVjdG9yOiBjb21tYW5kIHN0YXR1cy4gKi8KKwl1X2ludDhfdCAgVFhfSVY7CSAgICAvKiBJbnRlcnJ1cHQgdmVjdG9yOiB0cmFuc21pdC4gKi8KKwl1X2ludDhfdCAgUlhfSVY7CSAgICAvKiBJbnRlcnJ1cHQgdmVjdG9yOiByZWNlaXZlLiAqLworCXVfaW50OF90ICBSaW5nX1N0YXR1c19JVjsgICAvKiBJbnRlcnJ1cHQgdmVjdG9yOiByaW5nIHN0YXR1cy4gKi8KKwl1X2ludDhfdCAgU0NCX0NsZWFyX0lWOwkgICAgLyogSW50ZXJydXB0IHZlY3RvcjogU0NCIGNsZWFyLiAqLworCXVfaW50OF90ICBBZGFwdGVyX0NIS19JVjsgICAvKiBJbnRlcnJ1cHQgdmVjdG9yOiBhZGFwdGVyIGNoZWNrLiAqLworCisJdV9pbnQxNl90IFJYX0J1cnN0X1NpemU7ICAgIC8qIE1heC4gbnVtYmVyIG9mIHRyYW5zZmVyIGN5Y2xlcy4gKi8KKwl1X2ludDE2X3QgVFhfQnVyc3RfU2l6ZTsgICAgLyogRHVyaW5nIERNQSBidXJzdDsgZXZlbiB2YWx1ZSEgKi8KKwl1X2ludDE2X3QgRE1BX0Fib3J0X1RocmhsZDsgLyogTnVtYmVyIG9mIERNQSByZXRyaWVzLiAqLworCisJdV9pbnQzMl90IFNDQl9BZGRyOyAgIC8qIFNDQiBhZGRyZXNzOiBldmVuLCB3b3JkIGFsaWduZWQsIGhpZ2gtbG93ICovCisJdV9pbnQzMl90IFNTQl9BZGRyOyAgIC8qIFNTQiBhZGRyZXNzOiBldmVuLCB3b3JkIGFsaWduZWQsIGhpZ2gtbG93ICovCit9IElQQiwgKklQQl9QdHI7CisjcHJhZ21hIHBhY2soKQorCisvKgorICogT1BFTiBDb21tYW5kIFBhcmFtZXRlciBMaXN0IChPQ1BMKSAoY2FuIGJlIHJldXNlZCwgaWYgdGhlIGFkYXB0ZXIgaGFzIHRvCisgKiBiZSByZW9wZW5lZCkKKyAqLworI2RlZmluZSBCVUZGRVJfU0laRQkyMDQ4CQkvKiBCdWZmZXJzIG9uIEFkYXB0ZXIuICovCisjZGVmaW5lIFRQTF9TSVpFCTgrNipUWF9GUkFHX05VTSAvKiBEZXBlbmRpbmcgb24gZnJhZ21lbnRzIHBlciBUUEwuICovCisjZGVmaW5lIFJQTF9TSVpFCTE0CQkvKiAod2l0aCBUSSBmaXJtd2FyZSB2Mi4yNiBoYW5kbGluZworCQkJCQkgKiB1cCB0byBuaW5lIGZyYWdtZW50cyBwb3NzaWJsZSkKKwkJCQkJICovCisjZGVmaW5lIFRYX0JVRl9NSU4JMjAJCS8qID8/PyAoU3RlcGhhbjogY2FsY3VsYXRpb24gd2l0aCAqLworI2RlZmluZSBUWF9CVUZfTUFYCTQwCQkvKiBCVUZGRVJfU0laRSBhbmQgTUFYX0ZSQU1FX1NJWkUpID8/PyAKKwkJCQkJICovCisjZGVmaW5lIERJU0FCTEVfRUFSTFlfVE9LRU5fUkVMRUFTRSAJMHgxMDAwCisKKy8qIE9QRU4gT3B0aW9ucyAoaGlnaC1sb3cpICovCisjZGVmaW5lIFdSQVBfSU5URVJGQUNFCQkweDAwODAJLyogSW5zZXJ0aW5nIG9taXR0ZWQgZm9yIHRlc3QKKwkJCQkJICogcHVycG9zZXM7IHRyYW5zbWl0IGRhdGEgYXBwZWFycworCQkJCQkgKiBhcyByZWNlaXZlIGRhdGEuICh1c2VmdWwgZm9yCisJCQkJCSAqIHRlc3Rpbmc7IGNoYW5nZTogQ0xPU0UgbmVjZXNzYXJ5KQorCQkJCQkgKi8KKyNkZWZpbmUgRElTQUJMRV9IQVJEX0VSUk9SCTB4MDA0MAkvKiBPbiBIQVJEX0VSUk9SICYgVFJBTlNNSVRfQkVBQ09OCisJCQkJCSAqIG5vIFJJTkcuU1RBVFVTIGludGVycnVwdC4KKwkJCQkJICovCisjZGVmaW5lIERJU0FCTEVfU09GVF9FUlJPUgkweDAwMjAJLyogT24gU09GVF9FUlJPUiwgbm8gUklORy5TVEFUVVMKKwkJCQkJICogaW50ZXJydXB0LgorCQkJCQkgKi8KKyNkZWZpbmUgUEFTU19BREFQVEVSX01BQ19GUkFNRVMJMHgwMDEwCS8qIFBhc3NpbmcgdW5zdXBwb3J0ZWQgTUFDIGZyYW1lcworCQkJCQkgKiB0byBzeXN0ZW0uCisJCQkJCSAqLworI2RlZmluZSBQQVNTX0FUVEVOVElPTl9GUkFNRVMJMHgwMDA4CS8qIEFsbCBjaGFuZ2VkIGF0dGVudGlvbiBNQUMgZnJhbWVzIGFyZQorCQkJCQkgKiBwYXNzZWQgdG8gdGhlIHN5c3RlbS4KKwkJCQkJICovCisjZGVmaW5lIFBBRF9ST1VUSU5HX0ZJRUxECTB4MDAwNAkvKiBSb3V0aW5nIGZpZWxkIGlzIHBhZGRlZCB0byAxOAorCQkJCQkgKiBieXRlcy4KKwkJCQkJICovCisjZGVmaW5lIEZSQU1FX0hPTEQJCTB4MDAwMgkvKkFkYXB0ZXIgd2FpdHMgZm9yIGVudGlyZSBmcmFtZSBiZWZvcmUKKwkJCQkJICogaW5pdGlhdGluZyBETUEgdHJhbnNmZXI7IG90aGVyd2lzZToKKwkJCQkJICogRE1BIHRyYW5zZmVyIGluaXRpYXRpb24gaWYgaW50ZXJuYWwKKwkJCQkJICogYnVmZmVyIGZpbGxlZC4KKwkJCQkJICovCisjZGVmaW5lIENPTlRFTkRFUgkJMHgwMDAxCS8qIEFkYXB0ZXIgcGFydGljaXBhdGVzIGluIHRoZSBtb25pdG9yCisJCQkJCSAqIGNvbnRlbnRpb24gcHJvY2Vzcy4KKwkJCQkJICovCisjZGVmaW5lIFBBU1NfQkVBQ09OX01BQ19GUkFNRVMJMHg4MDAwCS8qIEFkYXB0ZXIgcGFzc2VzIGJlYWNvbiBNQUMgZnJhbWVzCisJCQkJCSAqIHRvIHRoZSBzeXN0ZW0uCisJCQkJCSAqLworI2RlZmluZSBFQVJMWV9UT0tFTl9SRUxFQVNFIAkweDEwMDAJLyogT25seSB2YWxpZCBpbiAxNiBNYnBzIG9wZXJhdGlvbjsKKwkJCQkJICogMCA9IEVUUi4gKG5vIGVmZmVjdCBpbiA0IE1icHMKKwkJCQkJICogb3BlcmF0aW9uKQorCQkJCQkgKi8KKyNkZWZpbmUgQ09QWV9BTExfTUFDX0ZSQU1FUwkweDA0MDAJLyogQWxsIE1BQyBmcmFtZXMgYXJlIGNvcGllZCB0bworCQkJCQkgKiB0aGUgc3lzdGVtLiAoYWZ0ZXIgT1BFTjogZHVwbGljYXRlCisJCQkJCSAqIGFkZHJlc3MgdGVzdCAoREFUKSBNQUMgZnJhbWUgaXMgCisJCQkJCSAqIGZpcnN0IHJlY2VpdmVkIGZyYW1lIGNvcGllZCB0byB0aGUKKwkJCQkJICogc3lzdGVtKQorCQkJCQkgKi8KKyNkZWZpbmUgQ09QWV9BTExfTk9OX01BQ19GUkFNRVMJMHgwMjAwCS8qIEFsbCBub24gTUFDIGZyYW1lcyBhcmUgY29waWVkIHRvCisJCQkJCSAqIHRoZSBzeXN0ZW0uCisJCQkJCSAqLworI2RlZmluZSBQQVNTX0ZJUlNUX0JVRl9PTkxZCTB4MDEwMAkvKiBQYXNzZXMgb25seSBmaXJzdCBpbnRlcm5hbCBidWZmZXIKKwkJCQkJICogb2YgZWFjaCByZWNlaXZlZCBmcmFtZTsgRnJhbWVTaXplCisJCQkJCSAqIG9mIFJQTHMgbXVzdCBjb250YWluIGludGVybmFsCisJCQkJCSAqIEJVRkZFUl9TSVpFIGJpdHMgZm9yIHByb21pc2NvdXMgbW9kZS4KKwkJCQkJICovCisjZGVmaW5lIEVOQUJMRV9GVUxMX0RVUExFWF9TRUxFQ1RJT04JMHgyMDAwIAorIAkJCQkJLyogRW5hYmxlIHRoZSB1c2Ugb2YgZnVsbC1kdXBsZXgKKwkJCQkJICogc2V0dGluZ3Mgd2l0aCBiaXRzIGluIGJ5dGUgMjIgaW4KKwkJCQkJICogb2NwbC4gKG5ldyBmZWF0dXJlIGluIGZpcm13YXJlCisJCQkJCSAqIHZlcnNpb24gMy4wOSkKKwkJCQkJICovCisKKy8qIEZ1bGwtZHVwbGV4IHNldHRpbmdzICovCisjZGVmaW5lIE9QRU5fRlVMTF9EVVBMRVhfT0ZGCTB4MDAwMAorI2RlZmluZSBPUEVOX0ZVTExfRFVQTEVYX09OCTB4MDBjMAorI2RlZmluZSBPUEVOX0ZVTExfRFVQTEVYX0FVVE8JMHgwMDgwCisKKyNkZWZpbmUgUFJPRF9JRF9TSVpFCTE4CS8qIExlbmd0aCBvZiBwcm9kdWN0IElELiAqLworCisjZGVmaW5lIFRYX0ZSQUdfTlVNCTMJIC8qIE51bWJlciBvZiBmcmFnbWVudHMgdXNlZCBpbiBvbmUgVFBMLiAqLworI2RlZmluZSBUWF9NT1JFX0ZSQUdNRU5UUyAweDgwMDAgLyogQml0IHNldCBpbiBEYXRhQ291bnQgdG8gaW5kaWNhdGUgbW9yZQorCQkJCSAgKiBmcmFnbWVudHMgZm9sbG93aW5nLgorCQkJCSAgKi8KKworLyogWFhYIGlzIHRoZXJlIHNvbWUgYmV0dGVyIHdheSB0byBkbyB0aGlzPyAqLworI2RlZmluZSBJU0FfTUFYX0FERFJFU1MgCTB4MDBmZmZmZmYKKyNkZWZpbmUgUENJX01BWF9BRERSRVNTCQkweGZmZmZmZmZmCisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QgeworCXVfaW50MTZfdCBPUEVOT3B0aW9uczsKKwl1X2ludDhfdCAgTm9kZUFkZHJbNl07CS8qIEFkYXB0ZXIgbm9kZSBhZGRyZXNzOyB1c2UgUk9NIAorCQkJCSAqIGFkZHJlc3MKKwkJCQkgKi8KKwl1X2ludDMyX3QgR3JvdXBBZGRyOwkvKiBNdWx0aWNhc3Q6IGhpZ2ggb3JkZXIKKwkJCQkgKiBieXRlcyA9IDB4QzAwMAorCQkJCSAqLworCXVfaW50MzJfdCBGdW5jdEFkZHI7CS8qIEhpZ2ggb3JkZXIgYnl0ZXMgPSAweEMwMDAgKi8KKwl1X2ludDE2X3QgUnhMaXN0U2l6ZTsJLyogUlBMIHNpemU6IDAgKD0yNiksIDE0LCAyMCBvcgorCQkJCSAqIDI2IGJ5dGVzIHJlYWQgYnkgdGhlIGFkYXB0ZXIuCisJCQkJICogKERlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIAorCQkJCSAqIGZyYWdtZW50cy9saXN0KQorCQkJCSAqLworCXVfaW50MTZfdCBUeExpc3RTaXplOwkvKiBUUEwgc2l6ZSAqLworCXVfaW50MTZfdCBCdWZTaXplOwkvKiBJcyBhdXRvbWF0aWNhbGx5IHJvdW5kZWQgdXAgdG8gdGhlCisJCQkJICogbmVhcmVzdCBuSyBib3VuZGFyeS4KKwkJCQkgKi8KKwl1X2ludDE2X3QgRnVsbER1cGxleDsKKwl1X2ludDE2X3QgUmVzZXJ2ZWQ7CisJdV9pbnQ4X3QgIFRYQnVmTWluOwkvKiBOdW1iZXIgb2YgYWRhcHRlciBidWZmZXJzIHJlc2VydmVkCisJCQkJICogZm9yIHRyYW5zbWlzc2lvbiBhIG1pbmltdW0gb2YgMgorCQkJCSAqIGJ1ZmZlcnMgbXVzdCBiZSBhbGxvY2F0ZWQuCisJCQkJICovCisJdV9pbnQ4X3QgIFRYQnVmTWF4OwkvKiBNYXhpbXVtIG51bWJlciBvZiBhZGFwdGVyIGJ1ZmZlcnMKKwkJCQkgKiBmb3IgdHJhbnNtaXQ7IGEgbWluaW11bSBvZiAyIGJ1ZmZlcnMKKwkJCQkgKiBtdXN0IGJlIGF2YWlsYWJsZSBmb3IgcmVjZWl2ZS4KKwkJCQkgKiBEZWZhdWx0OiA2CisJCQkJICovCisJdV9pbnQxNl90IFByb2RJREFkZHJbMl07LyogUG9pbnRlciB0byBwcm9kdWN0IElELiAqLworfSBPUEIsICpPUEJfUHRyOworI3ByYWdtYSBwYWNrKCkKKworLyoKKyAqIFNDQjogYWRhcHRlciBjb21tYW5kcyBlbmFibGVkIGJ5IHRoZSBob3N0IHN5c3RlbSBzdGFydGVkIGJ5IHdyaXRpbmcKKyAqIENNRF9JTlRFUlJVUFRfQURBUFRFUiB8IENNRF9FWEVDVVRFICh8U0NCX1JFUVVFU1QpIHRvIHRoZSBTSUZDTUQgSU8KKyAqIHJlZ2lzdGVyLiAoc3BlY2lhbCBjYXNlOiB8IENNRF9TWVNURU1fSVJRIGZvciBpbml0aWFsaXphdGlvbikKKyAqLworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCB7CisJdV9pbnQxNl90IENNRDsJCS8qIENvbW1hbmQgY29kZSAqLworCXVfaW50MTZfdCBQYXJtWzJdOwkvKiBQb2ludGVyIHRvIENvbW1hbmQgUGFyYW1ldGVyIEJsb2NrICovCit9IFNDQjsJLyogU3lzdGVtIENvbW1hbmQgQmxvY2sgKDMyIGJpdCBwaHlzaWNhbCBhZGRyZXNzOyBiaWcgZW5kaWFuKSovCisjcHJhZ21hIHBhY2soKQorCisvKgorICogU1NCOiBhZGFwdGVyIGNvbW1hbmQgcmV0dXJuIHN0YXR1cyBjYW4gYmUgZXZhbHVhdGVkIGFmdGVyIENPTU1BTkRfU1RBVFVTCisgKiBhZGFwdGVyIHRvIHN5c3RlbSBpbnRlcnJ1cHQgYWZ0ZXIgcmVhZGluZyBTU0IsIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIFNTQgorICogaGFzIHRvIGJlIHRvbGQgdGhlIGFkYXB0ZXIgYnkgd3JpdGluZyBDTURfSU5URVJSVVBUX0FEQVBURVIgfCBDTURfU1NCX0NMRUFSCisgKiBpbiB0aGUgU0lGQ01EIElPIHJlZ2lzdGVyLgorICovCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IHsKKwl1X2ludDE2X3QgU1RTOwkJLyogU3RhdHVzIGNvZGUgKi8KKwl1X2ludDE2X3QgUGFybVszXTsJLyogUGFyYW1ldGVyIG9yIHBvaW50ZXIgdG8gU3RhdHVzIFBhcmFtZXRlcgorCQkJCSAqIEJsb2NrLgorCQkJCSAqLworfSBTU0I7CS8qIFN5c3RlbSBTdGF0dXMgQmxvY2sgKGJpZyBlbmRpYW4gLSBwaHlzaWNhbCBhZGRyZXNzKSAgKi8KKyNwcmFnbWEgcGFjaygpCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBCdXJuZWRJbkFkZHJQdHI7CS8qIFBvaW50ZXIgdG8gYWRhcHRlciBidXJuZWQgaW4KKwkJCQkJICogYWRkcmVzcy4gKEJJQSkKKwkJCQkJICovCisJdW5zaWduZWQgc2hvcnQgU29mdHdhcmVMZXZlbFB0cjsvKiBQb2ludGVyIHRvIHNvZnR3YXJlIGxldmVsIGRhdGEuICovCisJdW5zaWduZWQgc2hvcnQgQWRhcHRlckFkZHJQdHI7CS8qIFBvaW50ZXIgdG8gYWRhcHRlciBhZGRyZXNzZXMuICovCisJdW5zaWduZWQgc2hvcnQgQWRhcHRlclBhcm1zUHRyOwkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgcGFyYW1ldGVycy4gKi8KKwl1bnNpZ25lZCBzaG9ydCBNQUNCdWZmZXJQdHI7CS8qIFBvaW50ZXIgdG8gTUFDIGJ1ZmZlci4gKGludGVybmFsKSAqLworCXVuc2lnbmVkIHNob3J0IExMQ0NvdW50ZXJzUHRyOwkvKiBQb2ludGVyIHRvIExMQyBjb3VudGVycy4gICovCisJdW5zaWduZWQgc2hvcnQgU3BlZWRGbGFnUHRyOwkvKiBQb2ludGVyIHRvIGRhdGEgcmF0ZSBmbGFnLgorCQkJCQkgKiAoNC8xNiBNYnBzKQorCQkJCQkgKi8KKwl1bnNpZ25lZCBzaG9ydCBBZGFwdGVyUkFNUHRyOwkvKiBQb2ludGVyIHRvIGFkYXB0ZXIgUkFNIGZvdW5kLiAoS0IpICovCit9IElOVFBUUlM7CS8qIEFkYXB0ZXIgaW50ZXJuYWwgcG9pbnRlcnMgKi8KKworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCB7CisJdV9pbnQ4X3QgIExpbmVfRXJyb3I7CQkvKiBMaW5lIGVycm9yOiBjb2RlIHZpb2xhdGlvbiBpbgorCQkJCQkgKiBmcmFtZSBvciBpbiBhIHRva2VuLCBvciBGQ1MgZXJyb3IuCisJCQkJCSAqLworCXVfaW50OF90ICBJbnRlcm5hbF9FcnJvcjsJLyogSUJNIHNwZWNpZmljLiAoUmVzZXJ2ZWRfMSkgKi8KKwl1X2ludDhfdCAgQnVyc3RfRXJyb3I7CisJdV9pbnQ4X3QgIEFSSV9GQ0lfRXJyb3I7CS8qIEFSSS9GQ0kgYml0IHplcm8gaW4gQU1QIG9yCisJCQkJCSAqIFNNUCBNQUMgZnJhbWUuCisJCQkJCSAqLworCXVfaW50OF90ICBBYm9ydERlbGltZXRlcnM7CS8qIElCTSBzcGVjaWZpYy4gKFJlc2VydmVkXzIpICovCisJdV9pbnQ4X3QgIFJlc2VydmVkXzM7CisJdV9pbnQ4X3QgIExvc3RfRnJhbWVfRXJyb3I7CS8qIFJlY2VpdmUgb2YgZW5kIG9mIHRyYW5zbWl0dGVkCisJCQkJCSAqIGZyYW1lIGZhaWxlZC4KKwkJCQkJICovCisJdV9pbnQ4X3QgIFJ4X0Nvbmdlc3RfRXJyb3I7CS8qIEFkYXB0ZXIgaW4gcmVwZWF0IG1vZGUgaGFzIG5vdAorCQkJCQkgKiBlbm91Z2ggYnVmZmVyIHNwYWNlIHRvIGNvcHkgaW5jb21pbmcKKwkJCQkJICogZnJhbWUuCisJCQkJCSAqLworCXVfaW50OF90ICBGcmFtZV9Db3BpZWRfRXJyb3I7CS8qIEFSSSBiaXQgbm90IHplcm8gaW4gZnJhbWUKKwkJCQkJICogYWRkcmVzc2VkIHRvIGFkYXB0ZXIuCisJCQkJCSAqLworCXVfaW50OF90ICBGcmVxdWVuY3lfRXJyb3I7CS8qIElCTSBzcGVjaWZpYy4gKFJlc2VydmVkXzQpICovCisJdV9pbnQ4X3QgIFRva2VuX0Vycm9yOwkJLyogKGFjdGl2ZSBvbmx5IGluIG1vbml0b3Igc3RhdGlvbikgKi8KKwl1X2ludDhfdCAgUmVzZXJ2ZWRfNTsKKwl1X2ludDhfdCAgRE1BX0J1c19FcnJvcjsJLyogRE1BIGJ1cyBlcnJvcnMgbm90IGV4Y2VlZGluZyB0aGUKKwkJCQkJICogYWJvcnQgdGhyZXNob2xkcy4KKwkJCQkJICovCisJdV9pbnQ4X3QgIERNQV9QYXJpdHlfRXJyb3I7CS8qIERNQSBwYXJpdHkgZXJyb3JzIG5vdCBleGNlZWRpbmcKKwkJCQkJICogdGhlIGFib3J0IHRocmVzaG9sZHMuCisJCQkJCSAqLworfSBFUlJPUlRBQjsJLyogQWRhcHRlciBlcnJvciBjb3VudGVycyAqLworI3ByYWdtYSBwYWNrKCkKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTZW5kIGFuZCBSZWNlaXZlIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0qLworI3ByYWdtYSBwYWNrKDEpCit0eXBlZGVmIHN0cnVjdCB7CisJdV9pbnQxNl90IERhdGFDb3VudDsJLyogVmFsdWUgMCwgZXZlbiBhbmQgb2RkIHZhbHVlcyBhcmUKKwkJCQkgKiBwZXJtaXR0ZWQ7IHZhbHVlIGlzIHVuYWx0ZXJlZCBtb3N0CisJCQkJICogc2lnbmlmaWNhbnQgYml0IHNldDogZm9sbG93aW5nCisJCQkJICogZnJhZ21lbnRzIGxhc3QgZnJhZ21lbnQ6IG1vc3QKKwkJCQkgKiBzaWduaWZpY2FudCBiaXQgaXMgbm90IGV2YWx1YXRlZC4KKwkJCQkgKiAoPz8/KQorCQkJCSAqLworCXVfaW50MzJfdCBEYXRhQWRkcjsJLyogUG9pbnRlciB0byBmcmFtZSBkYXRhIGZyYWdtZW50OworCQkJCSAqIGV2ZW4gb3Igb2RkLgorCQkJCSAqLworfSBGcmFnbWVudDsKKyNwcmFnbWEgcGFjaygpCisKKyNkZWZpbmUgTUFYX0ZSQUdfTlVNQkVSUyAgICA5CS8qIE1heGltYWwgbnVtYmVyIG9mIGZyYWdtZW50cyBwb3NzaWJsZSB0byB1c2UKKwkJCQkgKiBpbiBvbmUgUlBML1RQTC4gKGRlcGVuZGluZyBvbiBUSSBmaXJtd2FyZSAKKwkJCQkgKiB2ZXJzaW9uKQorCQkJCSAqLworCisvKgorICogQUMgKDEpLCBGQyAoMSksIERzdCAoNiksIFNyYyAoNiksIFJJRiAoMTgpLCBEYXRhICg0NDcyKSA9IDQ1MDQKKyAqIFRoZSBwYWNrZXQgc2l6ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dzOiA1NDgsIDE1MDIsIDIwODQsIDQ1MDQsIDgxNzYsCisgKiAxMTQzOSwgMTc4MzIuIFJlZmVyIHRvIFRNUzM4MCBTZWNvbmQgR2VuZXJhdGlvbiBUb2tlbiBSaW5nIFVzZXIncyBHdWlkZQorICogUGFnZSAyLTI3LgorICovCisjZGVmaW5lIEhFQURFUl9TSVpFCQkoMSArIDEgKyA2ICsgNikKKyNkZWZpbmUgU1JDX1NJWkUJCTE4CisjZGVmaW5lIE1JTl9EQVRBX1NJWkUJCTUxNgorI2RlZmluZSBERUZBVUxUX0RBVEFfU0laRQk0NDcyCisjZGVmaW5lIE1BWF9EQVRBX1NJWkUJCTE3ODAwCisKKyNkZWZpbmUgREVGQVVMVF9QQUNLRVRfU0laRSAoSEVBREVSX1NJWkUgKyBTUkNfU0laRSArIERFRkFVTFRfREFUQV9TSVpFKQorI2RlZmluZSBNSU5fUEFDS0VUX1NJWkUgICAgIChIRUFERVJfU0laRSArIFNSQ19TSVpFICsgTUlOX0RBVEFfU0laRSkKKyNkZWZpbmUgTUFYX1BBQ0tFVF9TSVpFICAgICAoSEVBREVSX1NJWkUgKyBTUkNfU0laRSArIE1BWF9EQVRBX1NJWkUpCisKKy8qCisgKiBNYWNyb3MgdG8gZGVhbCB3aXRoIHRoZSBmcmFtZSBzdGF0dXMgZmllbGQuCisgKi8KKyNkZWZpbmUgQUNfTk9UX1JFQ09HTklaRUQJMHgwMAorI2RlZmluZSBHUk9VUF9CSVQJCTB4ODAKKyNkZWZpbmUgR0VUX1RSQU5TTUlUX1NUQVRVU19ISUdIX0JZVEUoVHMpICgodW5zaWduZWQgY2hhcikoKFRzKSA+PiA4KSkKKyNkZWZpbmUgR0VUX0ZSQU1FX1NUQVRVU19ISUdIX0FDKEZzKQkgICgodW5zaWduZWQgY2hhcikoKChGcykgJiAweEMwKSA+PiA2KSkKKyNkZWZpbmUgR0VUX0ZSQU1FX1NUQVRVU19MT1dfQUMoRnMpICAgICAgICgodW5zaWduZWQgY2hhcikoKChGcykgJiAweDBDKSA+PiAyKSkKKyNkZWZpbmUgRElSRUNURURfRlJBTUUoQ29udGV4dCkgICAgICAgICAgICghKChDb250ZXh0KS0+TURhdGFbMl0gJiBHUk9VUF9CSVQpKQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNlbmQgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBkZWZpbmUgVFhfQ1NUQVQgX1JFUVVFU1QgKFIpIGFuZCBfQ09NUExFVEUgKEMpIHZhbHVlcyAoaGlnaC1sb3cpICovCisKKyNkZWZpbmUgVFhfVkFMSUQJCTB4MDA4MAkvKiBSOiBzZXQgdmlhIFRSQU5TTUlULlZBTElEIGludGVycnVwdC4KKwkJCQkJICogQzogYWx3YXlzIHJlc2V0IHRvIHplcm8hCisJCQkJCSAqLworI2RlZmluZSBUWF9GUkFNRV9DT01QTEVURQkweDAwNDAJLyogUjogbXVzdCBiZSByZXNldCB0byB6ZXJvLgorCQkJCQkgKiBDOiBzZXQgdG8gb25lLgorCQkJCQkgKi8KKyNkZWZpbmUgVFhfU1RBUlRfRlJBTUUJCTB4MDAyMCAgLyogUjogc3RhcnQgb2YgYSBmcmFtZTogMSAKKwkJCQkJICogQzogdW5jaGFuZ2VkLgorCQkJCQkgKi8KKyNkZWZpbmUgVFhfRU5EX0ZSQU1FCQkweDAwMTAgIC8qIFI6IGVuZCBvZiBhIGZyYW1lOiAxCisJCQkJCSAqIEM6IHVuY2hhbmdlZC4KKwkJCQkJICovCisjZGVmaW5lIFRYX0ZSQU1FX0lSUQkJMHgwMDA4ICAvKiBSOiByZXF1ZXN0IGludGVycnVwdCBnZW5lcmF0aW9uCisJCQkJCSAqIGFmdGVyIHRyYW5zbWlzc2lvbi4KKwkJCQkJICogQzogdW5jaGFuZ2VkLgorCQkJCQkgKi8KKyNkZWZpbmUgVFhfRVJST1IJCTB4MDAwNCAgLyogUjogcmVzZXJ2ZWQuCisJCQkJCSAqIEM6IHNldCB0byBvbmUgaWYgRXJyb3Igb2NjdXJyZWQuCisJCQkJCSAqLworI2RlZmluZSBUWF9JTlRFUkZSQU1FX1dBSVQJMHgwMDA0CisjZGVmaW5lIFRYX1BBU1NfQ1JDCQkweDAwMDIgIC8qIFI6IHNldCBpZiBDUkMgdmFsdWUgaXMgYWxyZWFkeQorCQkJCQkgKiBjYWxjdWxhdGVkLiAodmFsaWQgb25seSBpbgorCQkJCQkgKiBGUkFNRV9TVEFSVCBUUEwpCisJCQkJCSAqIEM6IHVuY2hhbmdlZC4KKwkJCQkJICovCisjZGVmaW5lIFRYX1BBU1NfU1JDX0FERFIJMHgwMDAxICAvKiBSOiBhZGFwdGVyIHVzZXMgZXhwbGljaXQgZnJhbWUKKwkJCQkJICogc291cmNlIGFkZHJlc3MgYW5kIGRvZXMgbm90IG92ZXJ3cml0ZQorCQkJCQkgKiB3aXRoIHRoZSBhZGFwdGVyIG5vZGUgYWRkcmVzcy4KKwkJCQkJICogKHZhbGlkIG9ubHkgaW4gRlJBTUVfU1RBUlQgVFBMKQorCQkJCQkgKgorCQkJCQkgKiBDOiB1bmNoYW5nZWQuCisJCQkJCSAqLworI2RlZmluZSBUWF9TVFJJUF9GUwkJMHhGRjAwICAvKiBSOiByZXNlcnZlZC4KKwkJCQkJICogQzogaWYgbm8gVHJhbnNtaXNzaW9uIEVycm9yLAorCQkJCQkgKiBmaWVsZCBjb250YWlucyBjb3B5IG9mIEZTIGJ5dGUgYWZ0ZXIKKwkJCQkJICogc3RyaXBwaW5nIG9mIGZyYW1lLgorCQkJCQkgKi8KKworLyoKKyAqIFN0cnVjdHVyZSBvZiBUcmFuc21pdCBQYXJhbWV0ZXIgTGlzdHMgKFRQTHMpIChvbmx5IG9uZSBmcmFtZSBldmVyeSBUUEwsCisgKiBidXQgcG9zc2libHkgbXVsdGlwbGUgVFBMcyBmb3Igb25lIGZyYW1lKSB0aGUgbGVuZ3RoIG9mIHRoZSBUUExzIGhhcyB0byBiZQorICogaW5pdGlhbGl6ZWQgaW4gdGhlIE9QTC4gKE9QRU4gcGFyYW1ldGVyIGxpc3QpCisgKi8KKyNkZWZpbmUgVFBMX05VTQkJMwkvKiBOdW1iZXIgb2YgVHJhbnNtaXQgUGFyYW1ldGVyIExpc3RzLgorCQkJCSAqICEhIE1VU1QgQkUgPj0gMyAhIQorCQkJCSAqLworCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IHNfVFBMIFRQTDsKKworc3RydWN0IHNfVFBMIHsJLyogVHJhbnNtaXQgUGFyYW1ldGVyIExpc3QgKGFsaWduIG9uIGV2ZW4gd29yZCBib3VuZGFyaWVzKSAqLworCXVfaW50MzJfdCBOZXh0VFBMQWRkcjsJCS8qIFBvaW50ZXIgdG8gbmV4dCBUUEwgaW4gY2hhaW47IGlmCisJCQkJCSAqIHBvaW50ZXIgaXMgb2RkOiB0aGlzIGlzIHRoZSBsYXN0CisJCQkJCSAqIFRQTC4gUG9pbnRpbmcgdG8gaXRzZWxmIGNhbiBjYXVzZQorCQkJCQkgKiBwcm9ibGVtcyEKKwkJCQkJICovCisJdm9sYXRpbGUgdV9pbnQxNl90IFN0YXR1czsJLyogSW5pdGlhbGl6ZWQgYnkgdGhlIGFkYXB0ZXI6CisJCQkJCSAqIENTVEFUX1JFUVVFU1QgaW1wb3J0YW50OiB1cGRhdGUgbGVhc3QKKwkJCQkJICogc2lnbmlmaWNhbnQgYml0IGZpcnN0ISBTZXQgYnkgdGhlCisJCQkJCSAqIGFkYXB0ZXI6IENTVEFUX0NPTVBMRVRFIHN0YXR1cy4KKwkJCQkJICovCisJdV9pbnQxNl90IEZyYW1lU2l6ZTsJCS8qIE51bWJlciBvZiBieXRlcyB0byBiZSB0cmFuc21pdHRlZAorCQkJCQkgKiBhcyBhIGZyYW1lIGluY2x1ZGluZyBBQy9GQywKKwkJCQkJICogRGVzdGluYXRpb24sIFNvdXJjZSwgUm91dGluZyBmaWVsZAorCQkJCQkgKiBub3QgaW5jbHVkaW5nIENSQywgRlMsIEVuZCBEZWxpbWl0ZXIKKwkJCQkJICogKHZhbGlkIG9ubHkgaWYgU1RBUlRfRlJBTUUgYml0IGluIAorCQkJCQkgKiBDU1RBVCBub256ZXJvKSBtdXN0IG5vdCBiZSB6ZXJvIGluCisJCQkJCSAqIGFueSBsaXN0OyBtYXhpbXVtIHZhbHVlOiAoQlVGRkVSX1NJWkUKKwkJCQkJICogLSA4KSAqIFRYX0JVRl9NQVggc3VtIG9mIERhdGFDb3VudAorCQkJCQkgKiB2YWx1ZXMgaW4gRnJhZ21lbnRMaXN0IG11c3QgZXF1YWwKKwkJCQkJICogRnJhbWVfU2l6ZSB2YWx1ZSBpbiBTVEFSVF9GUkFNRSBUUEwhCisJCQkJCSAqIGZyYW1lIGRhdGEgZnJhZ21lbnQgbGlzdC4KKwkJCQkJICovCisKKwkvKiBUUEwvUlBMIHNpemUgaW4gT1BFTiBwYXJhbWV0ZXIgbGlzdCBkZXBlbmRpbmcgb24gbWF4aW1hbAorCSAqIG51bWJlcnMgb2YgZnJhZ21lbnRzIHVzZWQgaW4gb25lIHBhcmFtZXRlciBsaXN0LgorCSAqLworCUZyYWdtZW50IEZyYWdMaXN0W1RYX0ZSQUdfTlVNXTsJLyogTWF4aW11bTogbmluZSBmcmFtZSBmcmFnbWVudHMgaW4gb25lCisJCQkJCSAqIFRQTCBhY3R1YWwgdmVyc2lvbiBvZiBmaXJtd2FyZTogOQorCQkJCQkgKiBmcmFnbWVudHMgcG9zc2libGUuCisJCQkJCSAqLworI3ByYWdtYSBwYWNrKCkKKworCS8qIFNwZWNpYWwgcHJvcHJpZXRhcnkgZGF0YSBhbmQgcHJlY2FsY3VsYXRpb25zICovCisKKwlUUEwgKk5leHRUUExQdHI7CQkvKiBQb2ludGVyIHRvIG5leHQgVFBMIGluIGNoYWluLiAqLworCXVuc2lnbmVkIGNoYXIgKk1EYXRhOworCXN0cnVjdCBza19idWZmICpTa2I7CisJdW5zaWduZWQgY2hhciBUUExJbmRleDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIEJ1c3lGbGFnOy8qIEZsYWc6IFRQTCBidXN5PyAqLworCWRtYV9hZGRyX3QgRE1BQnVmZjsJCS8qIERNQSBJTyBidXMgYWRkcmVzcyBmcm9tIHBjaV9tYXAgKi8KK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVJlY2VpdmUgRnVuY3Rpb25zLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIGRlZmluZSBSRUNFSVZFX0NTVEFUX1JFUVVFU1QgKFIpIGFuZCBSRUNFSVZFX0NTVEFUX0NPTVBMRVRFIChDKSB2YWx1ZXMuCisgKiAoaGlnaC1sb3cpCisgKi8KKyNkZWZpbmUgUlhfVkFMSUQJCTB4MDA4MAkvKiBSOiBzZXQ7IHRlbGwgYWRhcHRlciB3aXRoCisJCQkJCSAqIFJFQ0VJVkUuVkFMSUQgaW50ZXJydXB0LgorCQkJCQkgKiBDOiByZXNldCB0byB6ZXJvLgorCQkJCQkgKi8KKyNkZWZpbmUgUlhfRlJBTUVfQ09NUExFVEUJMHgwMDQwICAvKiBSOiBtdXN0IGJlIHJlc2V0IHRvIHplcm8sCisJCQkJCSAqIEM6IHNldCB0byBvbmUuCisJCQkJCSAqLworI2RlZmluZSBSWF9TVEFSVF9GUkFNRQkJMHgwMDIwICAvKiBSOiBtdXN0IGJlIHJlc2V0IHRvIHplcm8uCisJCQkJCSAqIEM6IHNldCB0byBvbmUgb24gdGhlIGxpc3QuCisJCQkJCSAqLworI2RlZmluZSBSWF9FTkRfRlJBTUUJCTB4MDAxMCAgLyogUjogbXVzdCBiZSByZXNldCB0byB6ZXJvLgorCQkJCQkgKiBDOiBzZXQgdG8gb25lIG9uIHRoZSBsaXN0CisJCQkJCSAqIHRoYXQgZW5kcyB0aGUgZnJhbWUuCisJCQkJCSAqLworI2RlZmluZSBSWF9GUkFNRV9JUlEJCTB4MDAwOCAgLyogUjogcmVxdWVzdCBpbnRlcnJ1cHQgZ2VuZXJhdGlvbgorCQkJCQkgKiBhZnRlciByZWNlaXZlLgorCQkJCQkgKiBDOiB1bmNoYW5nZWQuCisJCQkJCSAqLworI2RlZmluZSBSWF9JTlRFUkZSQU1FX1dBSVQJMHgwMDA0ICAvKiBSOiBhZnRlciByZWNlaXZpbmcgYSBmcmFtZToKKwkJCQkJICogaW50ZXJydXB0IGFuZCB3YWl0IGZvciBhCisJCQkJCSAqIFJFQ0VJVkUuQ09OVElOVUUuCisJCQkJCSAqIEM6IHVuY2hhbmdlZC4KKwkJCQkJICovCisjZGVmaW5lIFJYX1BBU1NfQ1JDCQkweDAwMDIgIC8qIFI6IGlmIHNldCwgdGhlIGFkYXB0ZXIgaW5jbHVkZXMKKwkJCQkJICogdGhlIENSQyBpbiBkYXRhIHBhc3NlZC4gKGxhc3QgZm91ciAKKwkJCQkJICogYnl0ZXM7IHZhbGlkIG9ubHkgaWYgRlJBTUVfU1RBUlQgaXMKKwkJCQkJICogc2V0KQorCQkJCQkgKiBDOiBzZXQsIGlmIENSQyBpcyBpbmNsdWRlZCBpbgorCQkJCQkgKiByZWNlaXZlZCBkYXRhLgorCQkJCQkgKi8KKyNkZWZpbmUgUlhfUEFTU19TUkNfQUREUgkweDAwMDEgIC8qIFI6IGFkYXB0ZXIgdXNlcyBleHBsaWNpdCBmcmFtZQorCQkJCQkgKiBzb3VyY2UgYWRkcmVzcyBhbmQgZG9lcyBub3QKKwkJCQkJICogb3ZlcndyaXRlIHdpdGggdGhlIGFkYXB0ZXIgbm9kZQorCQkJCQkgKiBhZGRyZXNzLiAodmFsaWQgb25seSBpZiBGUkFNRV9TVEFSVAorCQkJCQkgKiBpcyBzZXQpCisJCQkJCSAqIEM6IHVuY2hhbmdlZC4KKwkJCQkJICovCisjZGVmaW5lIFJYX1JFQ0VJVkVfRlMJCTB4RkMwMCAgLyogUjogcmVzZXJ2ZWQ7IG11c3QgYmUgcmVzZXQgdG8gemVyby4KKwkJCQkJICogQzogb24gbGlzdHMgd2l0aCBTVEFSVF9GUkFNRSwgZmllbGQKKwkJCQkJICogY29udGFpbnMgZnJhbWUgc3RhdHVzIGZpZWxkIGZyb20KKwkJCQkJICogcmVjZWl2ZWQgZnJhbWU7IG90aGVyd2lzZSBjbGVhcmVkLgorCQkJCQkgKi8KKyNkZWZpbmUgUlhfQUREUl9NQVRDSAkJMHgwMzAwICAvKiBSOiByZXNlcnZlZDsgbXVzdCBiZSByZXNldCB0byB6ZXJvLgorCQkJCQkgKiBDOiBhZGRyZXNzIG1hdGNoIGNvZGUgbWFzay4KKwkJCQkJICovIAorI2RlZmluZSBSWF9TVEFUVVNfTUFTSwkJMHgwMEZGICAvKiBNYXNrIGZvciByZWNlaXZlIHN0YXR1cyBiaXRzLiAqLworCisjZGVmaW5lIFJYX0lOVEVSTl9BRERSX01BVENIICAgIDB4MDEwMCAgLyogQzogaW50ZXJuYWxseSBhZGRyZXNzIG1hdGNoLiAqLworI2RlZmluZSBSWF9FWFRFUk5fQUREUl9NQVRDSCAgICAweDAyMDAgIC8qIEM6IGV4dGVybmFsbHkgbWF0Y2hlZCB2aWEKKwkJCQkJICogWE1BVENIL1hGQUlMIGludGVyZmFjZS4KKwkJCQkJICovCisjZGVmaW5lIFJYX0lOVEVYVF9BRERSX01BVENIICAgIDB4MDMwMCAgLyogQzogaW50ZXJuYWxseSBhbmQgZXh0ZXJuYWxseQorCQkJCQkgKiBtYXRjaGVkLgorCQkJCQkgKi8KKyNkZWZpbmUgUlhfUkVBRFkgKFJYX1ZBTElEIHwgUlhfRlJBTUVfSVJRKSAvKiBSZWFkeSBmb3IgcmVjZWl2ZS4gKi8KKworLyogQ29uc3RhbnRzIGZvciBDb21tYW5kIFN0YXR1cyBJbnRlcnJ1cHQuCisgKiBDT01NQU5EX1JFSkVDVCBzdGF0dXMgZmllbGQgYml0IGZ1bmN0aW9ucyAoU1NCLlBhcm1bMF0pCisgKi8KKyNkZWZpbmUgSUxMRUdBTF9DT01NQU5ECQkweDAwODAJLyogU2V0IGlmIGFuIHVua25vd24gY29tbWFuZAorCQkJCQkgKiBpcyBpc3N1ZWQgdG8gdGhlIGFkYXB0ZXIKKwkJCQkJICovCisjZGVmaW5lIEFERFJFU1NfRVJST1IJCTB4MDA0MCAgLyogU2V0IGlmIGFueSBhZGRyZXNzIGZpZWxkIGluCisJCQkJCSAqIHRoZSBTQ0IgaXMgb2RkLiAobm90IHdvcmQgYWxpZ25lZCkKKwkJCQkJICovCisjZGVmaW5lIEFEQVBURVJfT1BFTgkJMHgwMDIwICAvKiBDb21tYW5kIGlzc3VlZCBpbGxlZ2FsIHdpdGgKKwkJCQkJICogb3BlbiBhZGFwdGVyLgorCQkJCQkgKi8KKyNkZWZpbmUgQURBUFRFUl9DTE9TRQkJMHgwMDEwICAvKiBDb21tYW5kIGlzc3VlZCBpbGxlZ2FsIHdpdGgKKwkJCQkJICogY2xvc2VkIGFkYXB0ZXIuCisJCQkJCSAqLworI2RlZmluZSBTQU1FX0NPTU1BTkQJCTB4MDAwOCAgLyogQ29tbWFuZCBpc3N1ZWQgd2l0aCBzYW1lIGNvbW1hbmQKKwkJCQkJICogYWxyZWFkeSBleGVjdXRpbmcuCisJCQkJCSAqLworCisvKiBPUEVOX0NPTVBMRVRJT04gdmFsdWVzIChTU0IuUGFybVswXSwgTVNCKSAqLworI2RlZmluZSBOT0RFX0FERFJfRVJST1IJCTB4MDA0MCAgLyogV3JvbmcgYWRkcmVzcyBvciBCSUEgcmVhZAorCQkJCQkgKiB6ZXJvIGFkZHJlc3MuCisJCQkJCSAqLworI2RlZmluZSBMSVNUX1NJWkVfRVJST1IJCTB4MDAyMCAgLyogSWYgTGlzdF9TaXplIHZhbHVlIG5vdCBpbiAwLAorCQkJCQkgKiAxNCwgMjAsIDI2LgorCQkJCQkgKi8KKyNkZWZpbmUgQlVGX1NJWkVfRVJST1IJCTB4MDAxMCAgLyogTm90IGVub3VnaCBhdmFpbGFibGUgbWVtb3J5IGZvcgorCQkJCQkgKiB0d28gYnVmZmVycy4KKwkJCQkJICovCisjZGVmaW5lIFRYX0JVRl9DT1VOVF9FUlJPUgkweDAwMDQgIC8qIFJlbWFpbmluZyByZWNlaXZlIGJ1ZmZlcnMgbGVzcyB0aGFuCisJCQkJCSAqIHR3by4KKwkJCQkJICovCisjZGVmaW5lIE9QRU5fRVJST1IJCTB4MDAwMgkvKiBFcnJvciBkdXJpbmcgcmluZyBpbnNlcnRpb247IG1vcmUKKwkJCQkJICogaW5mb3JtYXRpb24gaW4gYml0cyA4LTE1LgorCQkJCQkgKi8KKworLyogU3RhbmRhcmQgcmV0dXJuIGNvZGVzICovCisjZGVmaW5lIEdPT0RfQ09NUExFVElPTgkJMHgwMDgwICAvKiA9T1BFTl9TVUNDRVNTRlVMTCAqLworI2RlZmluZSBJTlZBTElEX09QRU5fT1BUSU9OCTB4MDAwMSAgLyogT1BFTiBvcHRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGJ5CisJCQkJCSAqIHRoZSBhZGFwdGVyLgorCQkJCQkgKi8KKworLyogT1BFTiBwaGFzZXM7IGRldGFpbHMgb2YgT1BFTl9FUlJPUiAoU1NCLlBhcm1bMF0sIExTQikgICAgICAgICAgICAqLworI2RlZmluZSBPUEVOX1BIQVNFU19NQVNLICAgICAgICAgICAgMHhGMDAwICAvKiBDaGVjayBvbmx5IHRoZSBiaXRzIDgtMTEuICovCisjZGVmaW5lIExPQkVfTUVESUFfVEVTVCAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgUEhZU0lDQUxfSU5TRVJUSU9OICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBBRERSRVNTX1ZFUklGSUNBVElPTiAgICAgICAgMHgzMDAwCisjZGVmaW5lIFBBUlRJQ0lQQVRJT05fSU5fUklOR19QT0xMICAweDQwMDAKKyNkZWZpbmUgUkVRVUVTVF9JTklUSUFMSVNBVElPTiAgICAgIDB4NTAwMAorI2RlZmluZSBGVUxMRFVQTEVYX0NIRUNLICAgICAgICAgICAgMHg2MDAwCisKKy8qIE9QRU4gZXJyb3IgY29kZXM7IGRldGFpbHMgb2YgT1BFTl9FUlJPUiAoU1NCLlBhcm1bMF0sIExTQikgKi8KKyNkZWZpbmUgT1BFTl9FUlJPUl9DT0RFU19NQVNLCTB4MEYwMCAgLyogQ2hlY2sgb25seSB0aGUgYml0cyAxMi0xNS4gKi8KKyNkZWZpbmUgT1BFTl9GVU5DVElPTl9GQUlMVVJFICAgMHgwMTAwICAvKiBVbmFibGUgdG8gdHJhbnNtaXQgdG8gaXRzZWxmIG9yCisJCQkJCSAqIGZyYW1lcyByZWNlaXZlZCBiZWZvcmUgaW5zZXJ0aW9uLgorCQkJCQkgKi8KKyNkZWZpbmUgT1BFTl9TSUdOQUxfTE9TUwkweDAyMDAJLyogU2lnbmFsIGxvc3MgY29uZGl0aW9uIGRldGVjdGVkIGF0CisJCQkJCSAqIHJlY2VpdmVyLgorCQkJCQkgKi8KKyNkZWZpbmUgT1BFTl9USU1FT1VUCQkweDA1MDAJLyogSW5zZXJ0aW9uIHRpbWVyIGV4cGlyZWQgYmVmb3JlCisJCQkJCSAqIGxvZ2ljYWwgaW5zZXJ0aW9uLgorCQkJCQkgKi8KKyNkZWZpbmUgT1BFTl9SSU5HX0ZBSUxVUkUJMHgwNjAwCS8qIFVuYWJsZSB0byByZWNlaXZlIG93biByaW5nIHB1cmdlCisJCQkJCSAqIE1BQyBmcmFtZXMuCisJCQkJCSAqLworI2RlZmluZSBPUEVOX1JJTkdfQkVBQ09OSU5HCTB4MDcwMAkvKiBCZWFjb24gTUFDIGZyYW1lIHJlY2VpdmVkIGFmdGVyCisJCQkJCSAqIHJpbmcgaW5zZXJ0aW9uLgorCQkJCQkgKi8KKyNkZWZpbmUgT1BFTl9EVVBMSUNBVEVfTk9ERUFERFIJMHgwODAwICAvKiBPdGhlciBzdGF0aW9uIGluIHJpbmcgZm91bmQKKwkJCQkJICogd2l0aCB0aGUgc2FtZSBhZGRyZXNzLgorCQkJCQkgKi8KKyNkZWZpbmUgT1BFTl9SRVFVRVNUX0lOSVQJMHgwOTAwCS8qIFJQUyBwcmVzZW50IGJ1dCBkb2VzIG5vdCByZXNwb25kLiAqLworI2RlZmluZSBPUEVOX1JFTU9WRV9SRUNFSVZFRCAgICAweDBBMDAgIC8qIEFkYXB0ZXIgcmVjZWl2ZWQgYSByZW1vdmUgYWRhcHRlcgorCQkJCQkgKiBNQUMgZnJhbWUuCisJCQkJCSAqLworI2RlZmluZSBPUEVOX0ZVTExEVVBMRVhfU0VUCTB4MEQwMAkvKiBHb3QgdGhpcyB3aXRoIGZ1bGwgZHVwbGV4IG9uIHdoZW4KKwkJCQkJICogdHJ5aW5nIHRvIGNvbm5lY3QgdG8gYSBub3JtYWwgcmluZy4KKwkJCQkJICovCisKKy8qIFNFVF9CUklER0VfUEFSTVMgcmV0dXJuIGNvZGVzOiAqLworI2RlZmluZSBCUklER0VfSU5WQUxJRF9NQVhfTEVOICAweDQwMDAgIC8qIE1BWF9ST1VUSU5HX0ZJRUxEX0xFTkdUSCBvZGQsCisJCQkJCSAqIGxlc3MgdGhhbiA2IG9yID4gMzAuCisJCQkJCSAqLworI2RlZmluZSBCUklER0VfSU5WQUxJRF9TUkNfUklORyAweDIwMDAgIC8qIFNPVVJDRV9SSU5HIG51bWJlciB6ZXJvLCB0b28gbGFyZ2UKKwkJCQkJICogb3IgPSBUQVJHRVRfUklORy4KKwkJCQkJICovCisjZGVmaW5lIEJSSURHRV9JTlZBTElEX1RSR19SSU5HIDB4MTAwMCAgLyogVEFSR0VUX1JJTkcgbnVtYmVyIHplcm8sIHRvbyBsYXJnZQorCQkJCQkgKiBvciA9IFNPVVJDRV9SSU5HLgorCQkJCQkgKi8KKyNkZWZpbmUgQlJJREdFX0lOVkFMSURfQlJER0VfTk8gMHgwODAwICAvKiBCUklER0VfTlVNQkVSIHRvbyBsYXJnZS4gKi8KKyNkZWZpbmUgQlJJREdFX0lOVkFMSURfT1BUSU9OUyAgMHgwNDAwICAvKiBJbnZhbGlkIGJyaWRnZSBvcHRpb25zLiAqLworI2RlZmluZSBCUklER0VfRElBR1NfRkFJTEVEICAgICAweDAyMDAgIC8qIERpYWdub3N0aWNzIG9mIFRNUzM4MFNSQSBmYWlsZWQuICovCisjZGVmaW5lIEJSSURHRV9OT19TUkEgICAgICAgICAgIDB4MDEwMCAgLyogVGhlIFRNUzM4MFNSQSBkb2VzIG5vdCBleGlzdCBpbiBIVworCQkJCQkgKiBjb25maWd1cmF0aW9uLgorCQkJCQkgKi8KKworLyoKKyAqIEJyaW5nIFVwIERpYWdub3N0aWNzIGVycm9yIGNvZGVzLgorICovCisjZGVmaW5lIEJVRF9JTklUSUFMX0VSUk9SICAgICAgIDB4MAorI2RlZmluZSBCVURfQ0hFQ0tTVU1fRVJST1IgICAgICAweDEKKyNkZWZpbmUgQlVEX0FEQVBURVJfUkFNX0VSUk9SICAgMHgyCisjZGVmaW5lIEJVRF9JTlNUUlVDVElPTl9FUlJPUiAgIDB4MworI2RlZmluZSBCVURfQ09OVEVYVF9FUlJPUiAgICAgICAweDQKKyNkZWZpbmUgQlVEX1BST1RPQ09MX0VSUk9SICAgICAgMHg1CisjZGVmaW5lIEJVRF9JTlRFUkZBQ0VfRVJST1IJMHg2CisKKy8qIEJVRCBjb25zdGFudHMgKi8KKyNkZWZpbmUgQlVEX01BWF9SRVRSSUVTICAgICAgICAgMworI2RlZmluZSBCVURfTUFYX0xPT1BDTlQgICAgICAgICA2CisjZGVmaW5lIEJVRF9USU1FT1VUICAgICAgICAgICAgIDMwMDAKKworLyogSW5pdGlhbGl6YXRpb24gY29uc3RhbnRzICovCisjZGVmaW5lIElOSVRfTUFYX1JFVFJJRVMgICAgICAgIDMJLyogTWF4aW11bSB0aHJlZSByZXRyaWVzLiAqLworI2RlZmluZSBJTklUX01BWF9MT09QQ05UICAgICAgICAyMiAgICAgIC8qIE1heGltdW0gbG9vcCBjb3VudHMuICovCisKKy8qIFJJTkcgU1RBVFVTIGZpZWxkIHZhbHVlcyAoaGlnaC9sb3cpICovCisjZGVmaW5lIFNJR05BTF9MT1NTICAgICAgICAgICAgIDB4MDA4MCAgLyogTG9zcyBvZiBzaWduYWwgb24gdGhlIHJpbmcKKwkJCQkJICogZGV0ZWN0ZWQuCisJCQkJCSAqLworI2RlZmluZSBIQVJEX0VSUk9SICAgICAgICAgICAgICAweDAwNDAgIC8qIFRyYW5zbWl0dGluZyBvciByZWNlaXZpbmcgYmVhY29uCisJCQkJCSAqIGZyYW1lcy4KKwkJCQkJICovCisjZGVmaW5lIFNPRlRfRVJST1IgICAgICAgICAgICAgIDB4MDAyMCAgLyogUmVwb3J0IGVycm9yIE1BQyBmcmFtZQorCQkJCQkgKiB0cmFuc21pdHRlZC4KKwkJCQkJICovCisjZGVmaW5lIFRSQU5TTUlUX0JFQUNPTiAgICAgICAgIDB4MDAxMCAgLyogVHJhbnNtaXR0aW5nIGJlYWNvbiBmcmFtZXMgb24gdGhlCisJCQkJCSAqIHJpbmcuCisJCQkJCSAqLworI2RlZmluZSBMT0JFX1dJUkVfRkFVTFQgICAgICAgICAweDAwMDggIC8qIE9wZW4gb3Igc2hvcnQgY2lyY3VpdCBpbiB0aGUKKwkJCQkJICogY2FibGUgdG8gY29uY2VudHJhdG9yOyBhZGFwdGVyCisJCQkJCSAqIGNsb3NlZC4KKwkJCQkJICovCisjZGVmaW5lIEFVVE9fUkVNT1ZBTF9FUlJPUiAgICAgIDB4MDAwNCAgLyogTG9iZSB3cmFwIHRlc3QgZmFpbGVkLCBkZWluc2VydGVkOworCQkJCQkgKiBhZGFwdGVyIGNsb3NlZC4KKwkJCQkJICovCisjZGVmaW5lIFJFTU9WRV9SRUNFSVZFRCAgICAgICAgIDB4MDAwMSAgLyogUmVjZWl2ZWQgYSByZW1vdmUgcmluZyBzdGF0aW9uIE1BQworCQkJCQkgKiBNQUMgZnJhbWUgcmVxdWVzdDsgYWRhcHRlciBjbG9zZWQuCisJCQkJCSAqLworI2RlZmluZSBDT1VOVEVSX09WRVJGTE9XICAgICAgICAweDgwMDAgIC8qIE92ZXJmbG93IG9mIG9uZSBvZiB0aGUgYWRhcHRlcnMKKwkJCQkJICogZXJyb3IgY291bnRlcnM7IFJFQUQuRVJST1IuTE9HLgorCQkJCQkgKi8KKyNkZWZpbmUgU0lOR0xFX1NUQVRJT04gICAgICAgICAgMHg0MDAwICAvKiBBZGFwdGVyIGlzIHRoZSBvbmx5IHN0YXRpb24gb24gdGhlCisJCQkJCSAqIHJpbmcuCisJCQkJCSAqLworI2RlZmluZSBSSU5HX1JFQ09WRVJZICAgICAgICAgICAweDIwMDAgIC8qIENsYWltIHRva2VuIE1BQyBmcmFtZXMgb24gdGhlIHJpbmc7CisJCQkJCSAqIHJlc2V0IGFmdGVyIHJpbmcgcHVyZ2UgZnJhbWUuCisJCQkJCSAqLworCisjZGVmaW5lIEFEQVBURVJfQ0xPU0VEIChMT0JFX1dJUkVfRkFVTFQgfCBBVVRPX1JFTU9WQUxfRVJST1IgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJFTU9WRV9SRUNFSVZFRCkKKworLyogQWRhcHRlcl9jaGVja19ibG9jay5TdGF0dXMgZmllbGQgYml0IGFzc2lnbm1lbnRzOiAqLworI2RlZmluZSBESU9fUEFSSVRZICAgICAgICAgICAgICAweDgwMDAgIC8qIEFkYXB0ZXIgZGV0ZWN0cyBiYWQgcGFyaXR5CisJCQkJCSAqIHRocm91Z2ggZGlyZWN0IEkvTyBhY2Nlc3MuCisJCQkJCSAqLworI2RlZmluZSBETUFfUkVBRF9BQk9SVCAgICAgICAgICAweDQwMDAgIC8qIEFib3J0aW5nIERNQSByZWFkIG9wZXJhdGlvbgorCQkJCQkgKiBmcm9tIHN5c3RlbSBQYXJtWzBdOiAwPXRpbWVvdXQsCisJCQkJCSAqIDE9cGFyaXR5IGVycm9yLCAyPWJ1cyBlcnJvcjsKKwkJCQkJICogUGFybVsxXTogMzIgYml0IHBvaW50ZXIgdG8gaG9zdAorCQkJCQkgKiBzeXN0ZW0gYWRkcmVzcyBhdCBmYWlsdXJlLgorCQkJCQkgKi8KKyNkZWZpbmUgRE1BX1dSSVRFX0FCT1JUICAgICAgICAgMHgyMDAwICAvKiBBYm9ydGluZyBETUEgd3JpdGUgb3BlcmF0aW9uCisJCQkJCSAqIHRvIHN5c3RlbS4gKHBhcmFtZXRlcnMgYW5hbG9nb3VzIHRvCisJCQkJCSAqIERNQV9SRUFEX0FCT1JUKQorCQkJCQkgKi8KKyNkZWZpbmUgSUxMRUdBTF9PUF9DT0RFICAgICAgICAgMHgxMDAwICAvKiBJbGxlZ2FsIG9wZXJhdGlvbiBjb2RlIGluIHRoZQorCQkJCQkgKiB0aGUgYWRhcHRlcnMgZmlybXdhcmUgUGFybVswXS0yOgorCQkJCQkgKiBjb21tdW5pY2F0aW9ucyBwcm9jZXNzb3IgcmVnaXN0ZXJzCisJCQkJCSAqIFIxMy1SMTUuCisJCQkJCSAqLworI2RlZmluZSBQQVJJVFlfRVJST1JTICAgICAgICAgICAweDA4MDAgIC8qIEFkYXB0ZXIgZGV0ZWN0cyBpbnRlcm5hbCBidXMKKwkJCQkJICogcGFyaXR5IGVycm9yLgorCQkJCQkgKi8KKyNkZWZpbmUgUkFNX0RBVEFfRVJST1IgICAgICAgICAgMHgwMDgwICAvKiBWYWxpZCBvbmx5IGR1cmluZyBSQU0gdGVzdGluZzsKKwkJCQkJICogUkFNIGRhdGEgZXJyb3IgUGFybVswLTFdOiAzMiBiaXQKKwkJCQkJICogcG9pbnRlciB0byBSQU0gbG9jYXRpb24uCisJCQkJCSAqLworI2RlZmluZSBSQU1fUEFSSVRZX0VSUk9SICAgICAgICAweDAwNDAgIC8qIFZhbGlkIG9ubHkgZHVyaW5nIFJBTSB0ZXN0aW5nOworCQkJCQkgKiBSQU0gcGFyaXR5IGVycm9yIFBhcm1bMC0xXTogMzIgYml0CisJCQkJCSAqIHBvaW50ZXIgdG8gUkFNIGxvY2F0aW9uLgorCQkJCQkgKi8KKyNkZWZpbmUgUklOR19VTkRFUlJVTiAgICAgICAgICAgMHgwMDIwICAvKiBJbnRlcm5hbCBETUEgdW5kZXJydW4gd2hlbgorCQkJCQkgKiB0cmFuc21pdHRpbmcgb250byByaW5nLgorCQkJCQkgKi8KKyNkZWZpbmUgSU5WQUxJRF9JUlEgICAgICAgICAgICAgMHgwMDA4ICAvKiBVbnJlY29nbml6ZWQgaW50ZXJydXB0IGdlbmVyYXRlZAorCQkJCQkgKiBpbnRlcm5hbCB0byBhZGFwdGVyIFBhcm1bMC0yXToKKwkJCQkJICogYWRhcHRlciByZWdpc3RlciBSMTMtUjE1LgorCQkJCQkgKi8KKyNkZWZpbmUgSU5WQUxJRF9FUlJPUl9JUlEgICAgICAgMHgwMDA0ICAvKiBVbnJlY29nbml6ZWQgZXJyb3IgaW50ZXJydXB0CisJCQkJCSAqIGdlbmVyYXRlZCBQYXJtWzAtMl06IGFkYXB0ZXIgcmVnaXN0ZXIKKwkJCQkJICogUjEzLVIxNS4KKwkJCQkJICovCisjZGVmaW5lIElOVkFMSURfWE9QICAgICAgICAgICAgIDB4MDAwMiAgLyogVW5yZWNvZ25pemVkIFhPUCByZXF1ZXN0IGluCisJCQkJCSAqIGNvbW11bmljYXRpb24gcHJvY2Vzc29yIFBhcm1bMC0yXToKKwkJCQkJICogYWRhcHRlciByZWdpc3RlciBSMTMtUjE1LgorCQkJCQkgKi8KKyNkZWZpbmUgQ0hFQ0tBRERSICAgICAgICAgICAgICAgMHgwNUUwICAvKiBBZGFwdGVyIGNoZWNrIHN0YXR1cyBpbmZvcm1hdGlvbgorCQkJCQkgKiBhZGRyZXNzIG9mZnNldC4KKwkJCQkJICovCisjZGVmaW5lIFJPTV9QQUdFXzAgICAgICAgICAgICAgIDB4MDAwMCAgLyogQWRhcHRlciBST00gcGFnZSAwLiAqLworCisvKgorICogUkVDRUlWRS5TVEFUVVMgaW50ZXJydXB0IHJlc3VsdCBTU0IgdmFsdWVzOiAoaGlnaC1sb3cpCisgKiAoUkVDRUlWRV9DT01QTEVURSBmaWVsZCBiaXQgZGVmaW5pdGlvbnMgaW4gU1NCLlBhcm1bMF0pCisgKi8KKyNkZWZpbmUgUlhfQ09NUExFVEUgICAgICAgICAgICAgMHgwMDgwICAvKiBTU0IuUGFybVswXTsgU1NCLlBhcm1bMV06IDMyCisJCQkJCSAqIGJpdCBwb2ludGVyIHRvIGxhc3QgUlBMLgorCQkJCQkgKi8KKyNkZWZpbmUgUlhfU1VTUEVOREVEICAgICAgICAgICAgMHgwMDQwICAvKiBTU0IuUGFybVswXTsgU1NCLlBhcm1bMV06IDMyCisJCQkJCSAqIGJpdCBwb2ludGVyIHRvIFJQTCB3aXRoIG9kZAorCQkJCQkgKiBmb3J3YXJkIHBvaW50ZXIuCisJCQkJCSAqLworCisvKiBWYWxpZCByZWNlaXZlIENTVEFUOiAqLworI2RlZmluZSBSWF9GUkFNRV9DT05UUk9MX0JJVFMgKFJYX1ZBTElEIHwgUlhfU1RBUlRfRlJBTUUgfCBSWF9FTkRfRlJBTUUgfCBcCisJCQkgICAgICAgUlhfRlJBTUVfQ09NUExFVEUpCisjZGVmaW5lIFZBTElEX1NJTkdMRV9CVUZGRVJfRlJBTUUgKFJYX1NUQVJUX0ZSQU1FIHwgUlhfRU5EX0ZSQU1FIHwgXAorCQkJCSAgIFJYX0ZSQU1FX0NPTVBMRVRFKQorCit0eXBlZGVmIGVudW0gU0tCX1NUQVQgU0tCX1NUQVQ7CitlbnVtIFNLQl9TVEFUIHsKKwlTS0JfVU5BVkFJTEFCTEUsCisJU0tCX0RNQV9ESVJFQ1QsCisJU0tCX0RBVEFfQ09QWQorfTsKKworLyogUmVjZWl2ZSBQYXJhbWV0ZXIgTGlzdCAoUlBMKSBUaGUgbGVuZ3RoIG9mIHRoZSBSUExzIGhhcyB0byBiZSBpbml0aWFsaXplZCAKKyAqIGluIHRoZSBPUEwuIChPUEVOIHBhcmFtZXRlciBsaXN0KQorICovCisjZGVmaW5lIFJQTF9OVU0JCTMKKworI2RlZmluZSBSWF9GUkFHX05VTSAgICAgMQkvKiBNYXhpbWFsIG51bWJlciBvZiB1c2VkIGZyYWdtZW50cyBpbiBvbmUgUlBMLgorCQkJCSAqICh1cCB0byBmaXJtd2FyZSB2Mi4yNDogMywgbm93OiB1cCB0byA5KQorCQkJCSAqLworCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IHNfUlBMIFJQTDsKK3N0cnVjdCBzX1JQTCB7CS8qIFJlY2VpdmUgUGFyYW1ldGVyIExpc3QgKi8KKwl1X2ludDMyX3QgTmV4dFJQTEFkZHI7CQkvKiBQb2ludGVyIHRvIG5leHQgUlBMIGluIGNoYWluCisJCQkJCSAqIChub3JtYWxpemVkID0gcGh5c2ljYWwgMzIgYml0CisJCQkJCSAqIGFkZHJlc3MpIGlmIHBvaW50ZXIgaXMgb2RkOiB0aGlzCisJCQkJCSAqIGlzIGxhc3QgUlBMLiBQb2ludGluZyB0byBpdHNlbGYgY2FuCisJCQkJCSAqIGNhdXNlIHByb2JsZW1zIQorCQkJCQkgKi8KKwl2b2xhdGlsZSB1X2ludDE2X3QgU3RhdHVzOwkvKiBTZXQgYnkgY3JlYXRpb24gb2YgUmVjZWl2ZSBQYXJhbWV0ZXIKKwkJCQkJICogTGlzdCBSRUNFSVZFX0NTVEFUX0NPTVBMRVRFIHNldCBieQorCQkJCQkgKiBhZGFwdGVyIGluIGxpc3RzIHRoYXQgc3RhcnQgb3IgZW5kCisJCQkJCSAqIGEgZnJhbWUuCisJCQkJCSAqLworCXZvbGF0aWxlIHVfaW50MTZfdCBGcmFtZVNpemU7CSAvKiBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgYXMgYQorCQkJCQkgKiBmcmFtZSBpbmNsdWRpbmcgQUMvRkMsIERlc3RpbmF0aW9uLAorCQkJCQkgKiBTb3VyY2UsIFJvdXRpbmcgZmllbGQgbm90IGluY2x1ZGluZyAKKwkJCQkJICogQ1JDLCBGUyAoRnJhbWUgU3RhdHVzKSwgRW5kIERlbGltaXRlcgorCQkJCQkgKiAodmFsaWQgb25seSBpZiBTVEFSVF9GUkFNRSBiaXQgaW4gCisJCQkJCSAqIENTVEFUIG5vbnplcm8pIG11c3Qgbm90IGJlIHplcm8gaW4KKwkJCQkJICogYW55IGxpc3Q7IG1heGltdW0gdmFsdWU6IChCVUZGRVJfU0laRQorCQkJCQkgKiAtIDgpICogVFhfQlVGX01BWCBzdW0gb2YgRGF0YUNvdW50CisJCQkJCSAqIHZhbHVlcyBpbiBGcmFnbWVudExpc3QgbXVzdCBlcXVhbAorCQkJCQkgKiBGcmFtZV9TaXplIHZhbHVlIGluIFNUQVJUX0ZSQU1FIFRQTCEKKwkJCQkJICogZnJhbWUgZGF0YSBmcmFnbWVudCBsaXN0CisJCQkJCSAqLworCisJLyogVFBML1JQTCBzaXplIGluIE9QRU4gcGFyYW1ldGVyIGxpc3QgZGVwZW5kaW5nIG9uIG1heGltYWwgbnVtYmVycworCSAqIG9mIGZyYWdtZW50cyB1c2VkIGluIG9uZSBwYXJhbWV0ZXIgbGlzdC4KKwkgKi8KKwlGcmFnbWVudCBGcmFnTGlzdFtSWF9GUkFHX05VTV07CS8qIE1heGltdW06IG5pbmUgZnJhbWUgZnJhZ21lbnRzIGluCisJCQkJCSAqIG9uZSBUUEwuIEFjdHVhbCB2ZXJzaW9uIG9mIGZpcm13YXJlOgorCQkJCQkgKiA5IGZyYWdtZW50cyBwb3NzaWJsZS4KKwkJCQkJICovCisjcHJhZ21hIHBhY2soKQorCisJLyogU3BlY2lhbCBwcm9wcmlldGFyeSBkYXRhIGFuZCBwcmVjYWxjdWxhdGlvbnMuICovCisJUlBMICpOZXh0UlBMUHRyOwkvKiBMb2dpY2FsIHBvaW50ZXIgdG8gbmV4dCBSUEwgaW4gY2hhaW4uICovCisJdW5zaWduZWQgY2hhciAqTURhdGE7CisJc3RydWN0IHNrX2J1ZmYgKlNrYjsKKwlTS0JfU1RBVCBTa2JTdGF0OworCWludCBSUExJbmRleDsKKwlkbWFfYWRkcl90IERNQUJ1ZmY7CQkvKiBETUEgSU8gYnVzIGFkZHJlc3MgZnJvbSBwY2lfbWFwICovCit9OworCisvKiBJbmZvcm1hdGlvbiB0aGF0IG5lZWQgdG8gYmUga2VwdCBmb3IgZWFjaCBib2FyZC4gKi8KK3R5cGVkZWYgc3RydWN0IG5ldF9sb2NhbCB7CisjcHJhZ21hIHBhY2soMSkKKwlJUEIgaXBiOwkvKiBJbml0aWFsaXphdGlvbiBQYXJhbWV0ZXIgQmxvY2suICovCisJU0NCIHNjYjsJLyogU3lzdGVtIENvbW1hbmQgQmxvY2s6IHN5c3RlbSB0byBhZGFwdGVyIAorCQkJICogY29tbXVuaWNhdGlvbi4KKwkJCSAqLworCVNTQiBzc2I7CS8qIFN5c3RlbSBTdGF0dXMgQmxvY2s6IGFkYXB0ZXIgdG8gc3lzdGVtIAorCQkJICogY29tbXVuaWNhdGlvbi4KKwkJCSAqLworCU9QQiBvY3BsOwkvKiBPcGVuIE9wdGlvbnMgUGFyYW1ldGVyIEJsb2NrLiAqLworCisJRVJST1JUQUIgZXJyb3Jsb2d0YWJsZTsJLyogQWRhcHRlciBzdGF0aXN0aWMgZXJyb3IgY291bnRlcnMuCisJCQkJICogKHJlYWQgZnJvbSBhZGFwdGVyIG1lbW9yeSkKKwkJCQkgKi8KKwl1bnNpZ25lZCBjaGFyIFByb2R1Y3RJRFtQUk9EX0lEX1NJWkUgKyAxXTsgLyogUHJvZHVjdCBJRCAqLworI3ByYWdtYSBwYWNrKCkKKworCVRQTCBUcGxbVFBMX05VTV07CisJVFBMICpUcGxGcmVlOworCVRQTCAqVHBsQnVzeTsKKwl1bnNpZ25lZCBjaGFyIExvY2FsVHhCdWZmZXJzW1RQTF9OVU1dW0RFRkFVTFRfUEFDS0VUX1NJWkVdOworCisJUlBMIFJwbFtSUExfTlVNXTsKKwlSUEwgKlJwbEhlYWQ7CisJUlBMICpScGxUYWlsOworCXVuc2lnbmVkIGNoYXIgTG9jYWxSeEJ1ZmZlcnNbUlBMX05VTV1bREVGQVVMVF9QQUNLRVRfU0laRV07CisKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlpbnQgRGF0YVJhdGU7CisJdW5zaWduZWQgY2hhciBTY2JJblVzZTsKKwl1bnNpZ25lZCBzaG9ydCBDTURxdWV1ZTsKKworCXVuc2lnbmVkIGxvbmcgQWRhcHRlck9wZW5GbGFnOjE7CisJdW5zaWduZWQgbG9uZyBBZGFwdGVyVmlydE9wZW5GbGFnOjE7CisJdW5zaWduZWQgbG9uZyBPcGVuQ29tbWFuZElzc3VlZDoxOworCXVuc2lnbmVkIGxvbmcgVHJhbnNtaXRDb21tYW5kQWN0aXZlOjE7CisJdW5zaWduZWQgbG9uZyBUcmFuc21pdEhhbHRTY2hlZHVsZWQ6MTsKKwl1bnNpZ25lZCBsb25nIEhhbHRJblByb2dyZXNzOjE7CisJdW5zaWduZWQgbG9uZyBMb2JlV2lyZUZhdWx0TG9nZ2VkOjE7CisJdW5zaWduZWQgbG9uZyBSZU9wZW5JblByb2dyZXNzOjE7CisJdW5zaWduZWQgbG9uZyBTbGVlcGluZzoxOworCisJdW5zaWduZWQgbG9uZyBMYXN0T3BlblN0YXR1czsKKwl1bnNpZ25lZCBzaG9ydCBDdXJyZW50UmluZ1N0YXR1czsKKwl1bnNpZ25lZCBsb25nIE1heFBhY2tldFNpemU7CisJCisJdW5zaWduZWQgbG9uZyBTdGFydFRpbWU7CisJdW5zaWduZWQgbG9uZyBMYXN0U2VuZFRpbWU7CisKKwlzdHJ1Y3QgdHJfc3RhdGlzdGljcyBNYWNTdGF0OwkvKiBNQUMgc3RhdGlzdGljcyBzdHJ1Y3R1cmUgKi8KKworCXVuc2lnbmVkIGxvbmcgZG1hbGltaXQ7IC8qIHRoZSBtYXggRE1BIGFkZHJlc3MgKGllLCBJU0EpICovCisJZG1hX2FkZHJfdCAgICBkbWFidWZmZXI7IC8qIHRoZSBETUEgYnVzIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0bworCQkJCSAgICBwcml2LiBNaWdodCBiZSBkaWZmZXJlbnQgZnJvbSB2aXJ0X3RvX2J1cygpCisJCQkJICAgIGZvciBhcmNoaXRlY3R1cmVzIHdpdGggSU8gTU1VIChBbHBoYSkgKi8KKworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCisJd2FpdF9xdWV1ZV9oZWFkX3QgIHdhaXRfZm9yX3Rva19pbnQ7CisKKwlJTlRQVFJTIGludHB0cnM7CS8qIEludGVybmFsIGFkYXB0ZXIgcG9pbnRlci4gTXVzdCBiZSByZWFkCisJCQkJICogYmVmb3JlIE9QRU4gY29tbWFuZC4KKwkJCQkgKi8KKwl1bnNpZ25lZCBzaG9ydCAoKnNldG5zZWxvdXQpKHN0cnVjdCBuZXRfZGV2aWNlICopOworCXVuc2lnbmVkIHNob3J0ICgqc2lmcmVhZGIpKHN0cnVjdCBuZXRfZGV2aWNlICosIHVuc2lnbmVkIHNob3J0KTsKKwl2b2lkICgqc2lmd3JpdGViKShzdHJ1Y3QgbmV0X2RldmljZSAqLCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOworCXVuc2lnbmVkIHNob3J0ICgqc2lmcmVhZHcpKHN0cnVjdCBuZXRfZGV2aWNlICosIHVuc2lnbmVkIHNob3J0KTsKKwl2b2lkICgqc2lmd3JpdGV3KShzdHJ1Y3QgbmV0X2RldmljZSAqLCB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpOworCisJc3BpbmxvY2tfdCBsb2NrOyAgICAgICAgICAgICAgICAvKiBTTVAgcHJvdGVjdGlvbiAqLworCXZvaWQgKnRtc3ByaXY7Cit9IE5FVF9MT0NBTDsKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgkvKiBfX0xJTlVYX1RNUzM4MFRSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXNwY2kuYyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXNwY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2RkYjVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3Rtc3BjaS5jCkBAIC0wLDAgKzEsMjY3IEBACisvKgorICogIHRtc3BjaS5jOiBBIGdlbmVyaWMgbmV0d29yayBkcml2ZXIgZm9yIFRNUzM4MC1iYXNlZCBQQ0kgdG9rZW4gcmluZyBjYXJkcy4KKyAqCisgKiAgV3JpdHRlbiAxOTk5IGJ5IEFkYW0gRnJpdHpsZXIKKyAqCisgKiAgVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogIFRoaXMgZHJpdmVyIG1vZHVsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNhcmRzOgorICoJLSBTeXNLb25uZWN0IFRSNC8xNigrKSBQQ0kJKFNLLTQ1OTApCisgKgktIFN5c0tvbm5lY3QgVFI0LzE2IFBDSQkJKFNLLTQ1OTEpCisgKiAgICAgIC0gQ29tcGFxIFRSIDQvMTYgUENJCisgKiAgICAgIC0gVGhvbWFzLUNvbnJhZCBUQzQwNDggNC8xNiBQQ0kgCisgKiAgICAgIC0gM0NvbSAzQzMzOSBUb2tlbiBMaW5rIFZlbG9jaXR5CisgKgorICogIE1haW50YWluZXIocyk6CisgKiAgICBBRglBZGFtIEZyaXR6bGVyCQltaWRAYXVrLmN4CisgKgorICogIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgorICoJMzAtRGVjLTk5CUFGCVNwbGl0IG9mZiBmcm9tIHRoZSB0bXMzODB0ciBkcml2ZXIuCisgKgkyMi1KYW4tMDAJQUYJVXBkYXRlZCB0byB1c2UgaW5kaXJlY3QgcmVhZC93cml0ZXMKKyAqCTIzLU5vdi0wMAlKRwlOZXcgUENJIEFQSSwgY2xlYW51cHMKKyAqCisgKiAgVE9ETzoKKyAqCTEuIFNlZSBpZiB3ZSBjYW4gdXNlIE1NSU8gaW5zdGVhZCBvZiBwb3J0IGFjY2Vzc2VzCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90cmRldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgInRtczM4MHRyLmgiCisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KKyJ0bXNwY2kuYzogdjEuMDIgMjMvMTEvMjAwMCBieSBBZGFtIEZyaXR6bGVyXG4iOworCisjZGVmaW5lIFRNU19QQ0lfSU9fRVhURU5UIDMyCisKK3N0cnVjdCBjYXJkX2luZm8geworCXVuc2lnbmVkIGNoYXIgbnNlbG91dFsyXTsgLyogTlNFTE9VVCB2YWxzIGZvciA0bWIoWzBdKSBhbmQgMTZtYihbMV0pICovCisJY2hhciAqbmFtZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2FyZF9pbmZvIGNhcmRfaW5mb190YWJsZVtdID0geworCXsgezB4MDMsIDB4MDF9LCAiQ29tcGFxIDQvMTYgVFIgUENJIn0sCisJeyB7MHgwMywgMHgwMX0sICJTSyBORVQgVFIgNC8xNiBQQ0kifSwKKwl7IHsweDAzLCAweDAxfSwgIlRob21hcy1Db25yYWQgVEM0MDQ4IFBDSSA0LzE2In0sCisJeyB7MHgwMywgMHgwMX0sICIzQ29tIFRva2VuIExpbmsgVmVsb2NpdHkifSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0bXNwY2lfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX1RPS0VOUklORywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9TWVNLT05ORUNULCBQQ0lfREVWSUNFX0lEX1NZU0tPTk5FQ1RfVFIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDEgfSwKKwl7IFBDSV9WRU5ET1JfSURfVENPTlJBRCwgUENJX0RFVklDRV9JRF9UQ09OUkFEX1RPS0VOUklORywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMiB9LAorCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCBQQ0lfREVWSUNFX0lEXzNDT01fM0MzMzksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDMgfSwKKwl7IH0JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB0bXNwY2lfcGNpX3RibCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHZvaWQgdG1zX3BjaV9yZWFkX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB0bXNfcGNpX3NldG5zZWxvdXRfcGlucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHRtc19wY2lfc2lmcmVhZGIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCXJldHVybiBpbmIoZGV2LT5iYXNlX2FkZHIgKyByZWcpOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgdG1zX3BjaV9zaWZyZWFkdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCByZWcpCit7CisJcmV0dXJuIGludyhkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHRtc19wY2lfc2lmd3JpdGViKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZhbCwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCW91dGIodmFsLCBkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHRtc19wY2lfc2lmd3JpdGV3KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZhbCwgdW5zaWduZWQgc2hvcnQgcmVnKQoreworCW91dHcodmFsLCBkZXYtPmJhc2VfYWRkciArIHJlZyk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRtc19wY2lfYXR0YWNoKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQorewkKKwlzdGF0aWMgaW50IHZlcnNpb25wcmludGVkOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG5ldF9sb2NhbCAqdHA7CisJaW50IGksIHJldDsKKwl1bnNpZ25lZCBpbnQgcGNpX2lycV9saW5lOworCXVuc2lnbmVkIGxvbmcgcGNpX2lvYWRkcjsKKwlzdHJ1Y3QgY2FyZF9pbmZvICpjYXJkaW5mbyA9ICZjYXJkX2luZm9fdGFibGVbZW50LT5kcml2ZXJfZGF0YV07CisJCQorCWlmICh2ZXJzaW9ucHJpbnRlZCsrID09IDApCisJCXByaW50aygiJXMiLCB2ZXJzaW9uKTsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBSZW1vdmUgSS9PIHNwYWNlIG1hcmtlciBpbiBiaXQgMC4gKi8KKwlwY2lfaXJxX2xpbmUgPSBwZGV2LT5pcnE7CisJcGNpX2lvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMCk7CisKKwkvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgZm91bmQgYSB2YWxpZCBjYXJkLiAqLworCWRldiA9IGFsbG9jX3RyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2xvY2FsKSk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWlmICghcmVxdWVzdF9yZWdpb24ocGNpX2lvYWRkciwgVE1TX1BDSV9JT19FWFRFTlQsIGRldi0+bmFtZSkpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycl9vdXRfdHJkZXY7CisJfQorCisJcmV0ID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCB0bXMzODB0cl9pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJICBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfb3V0X3JlZ2lvbjsKKworCWRldi0+YmFzZV9hZGRyCT0gcGNpX2lvYWRkcjsKKwlkZXYtPmlycSAJPSBwY2lfaXJxX2xpbmU7CisJZGV2LT5kbWEJPSAwOworCisJcHJpbnRrKCIlczogJXNcbiIsIGRldi0+bmFtZSwgY2FyZGluZm8tPm5hbWUpOworCXByaW50aygiJXM6ICAgIElPOiAlIzRseCAgSVJROiAlZFxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOworCQkKKwl0bXNfcGNpX3JlYWRfZWVwcm9tKGRldik7CisKKwlwcmludGsoIiVzOiAgICBSaW5nIFN0YXRpb24gQWRkcmVzczogIiwgZGV2LT5uYW1lKTsKKwlwcmludGsoIiUyLjJ4IiwgZGV2LT5kZXZfYWRkclswXSk7CisJZm9yIChpID0gMTsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCI6JTIuMngiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIlxuIik7CisJCQorCXJldCA9IHRtc2Rldl9pbml0KGRldiwgUENJX01BWF9BRERSRVNTLCBwZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50aygiJXM6IHVuYWJsZSB0byBnZXQgbWVtb3J5IGZvciBkZXYtPnByaXYuXG4iLCBkZXYtPm5hbWUpOworCQlnb3RvIGVycl9vdXRfaXJxOworCX0KKworCXRwID0gZGV2LT5wcml2OworCXRwLT5zZXRuc2Vsb3V0ID0gdG1zX3BjaV9zZXRuc2Vsb3V0X3BpbnM7CisJCQorCXRwLT5zaWZyZWFkYiA9IHRtc19wY2lfc2lmcmVhZGI7CisJdHAtPnNpZnJlYWR3ID0gdG1zX3BjaV9zaWZyZWFkdzsKKwl0cC0+c2lmd3JpdGViID0gdG1zX3BjaV9zaWZ3cml0ZWI7CisJdHAtPnNpZndyaXRldyA9IHRtc19wY2lfc2lmd3JpdGV3OworCQkKKwltZW1jcHkodHAtPlByb2R1Y3RJRCwgY2FyZGluZm8tPm5hbWUsIFBST0RfSURfU0laRSArIDEpOworCisJdHAtPnRtc3ByaXYgPSBjYXJkaW5mbzsKKworCWRldi0+b3BlbiA9IHRtczM4MHRyX29wZW47CisJZGV2LT5zdG9wID0gdG1zMzgwdHJfY2xvc2U7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCXJldCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX291dF90bXNkZXY7CisJCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfdG1zZGV2OgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwl0bXNkZXZfdGVybShkZXYpOworZXJyX291dF9pcnE6CisJZnJlZV9pcnEocGRldi0+aXJxLCBkZXYpOworZXJyX291dF9yZWdpb246CisJcmVsZWFzZV9yZWdpb24ocGNpX2lvYWRkciwgVE1TX1BDSV9JT19FWFRFTlQpOworZXJyX291dF90cmRldjoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWFkcyBNQUMgYWRkcmVzcyBmcm9tIGFkYXB0ZXIgUkFNLCB3aGljaCBzaG91bGQndmUgcmVhZCBpdCBmcm9tCisgKiB0aGUgb25ib2FyZCBST00uICAKKyAqCisgKiBDYWxsaW5nIHRoaXMgb24gYSBib2FyZCB0aGF0IGRvZXMgbm90IHN1cHBvcnQgaXQgY2FuIGJlIGEgdmVyeQorICogZGFuZ2Vyb3VzIHRoaW5nLiAgVGhlIE1hZGdlIGJvYXJkLCBmb3IgaW5zdGFuY2UsIHdpbGwgbG9jayB5b3VyCisgKiBtYWNoaW5lIGhhcmQgd2hlbiB0aGlzIGlzIGNhbGxlZC4gIEx1Y2tpbHksIGl0cyBzdXBwb3J0ZWQgaW4gYQorICogc2VwYXJhdGUgZHJpdmVyLiAgLS1BU0YKKyAqLworc3RhdGljIHZvaWQgdG1zX3BjaV9yZWFkX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCQorCS8qIEFkZHJlc3M6IDAwMDA6MDAwMCAqLworCXRtc19wY2lfc2lmd3JpdGV3KGRldiwgMCwgU0lGQURYKTsKKwl0bXNfcGNpX3NpZndyaXRldyhkZXYsIDAsIFNJRkFEUik7CQorCQorCS8qIFJlYWQgc2l4IGJ5dGUgTUFDIGFkZHJlc3MgZGF0YSAqLworCWRldi0+YWRkcl9sZW4gPSA2OworCWZvcihpID0gMDsgaSA8IDY7IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IHRtc19wY2lfc2lmcmVhZHcoZGV2LCBTSUZJTkMpID4+IDg7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB0bXNfcGNpX3NldG5zZWxvdXRfcGlucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIHNob3J0IHZhbCA9IDA7CisJc3RydWN0IG5ldF9sb2NhbCAqdHAgPSBkZXYtPnByaXY7CisJc3RydWN0IGNhcmRfaW5mbyAqY2FyZGluZm8gPSB0cC0+dG1zcHJpdjsKKyAgCisJaWYodHAtPkRhdGFSYXRlID09IFNQRUVEXzQpCisJCXZhbCB8PSBjYXJkaW5mby0+bnNlbG91dFswXTsJLyogU2V0IDRNYnBzICovCisJZWxzZQorCQl2YWwgfD0gY2FyZGluZm8tPm5zZWxvdXRbMV07CS8qIFNldCAxNk1icHMgKi8KKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgdG1zX3BjaV9kZXRhY2ggKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoIWRldikKKwkJQlVHKCk7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgVE1TX1BDSV9JT19FWFRFTlQpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXRtc2Rldl90ZXJtKGRldik7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB0bXNfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAidG1zcGNpIiwKKwkuaWRfdGFibGUJPSB0bXNwY2lfcGNpX3RibCwKKwkucHJvYmUJCT0gdG1zX3BjaV9hdHRhY2gsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh0bXNfcGNpX2RldGFjaCksCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0bXNfcGNpX2luaXQgKHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnRtc19wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRtc19wY2lfcm1tb2QgKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmdG1zX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh0bXNfcGNpX2luaXQpOworbW9kdWxlX2V4aXQodG1zX3BjaV9ybW1vZCk7CisKKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVkVSU0lPTlMgIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgdG1zcGNpLmMiCisgKiAgYWx0LWNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUkvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC90b2tlbnJpbmcvIC1jIHRtc3BjaS5jIgorICogIGMtc2V0LXN0eWxlICJLJlIiCisgKiAgYy1pbmRlbnQtbGV2ZWw6IDgKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC8yMTE0Mi5jIGIvZHJpdmVycy9uZXQvdHVsaXAvMjExNDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGI2OTRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvMjExNDIuYwpAQCAtMCwwICsxLDI0NSBAQAorLyoKKwlkcml2ZXJzL25ldC90dWxpcC8yMTE0Mi5jCisKKwlNYWludGFpbmVkIGJ5IEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKwlDb3B5cmlnaHQgMjAwMCwyMDAxICBUaGUgTGludXggS2VybmVsIFRlYW0KKwlXcml0dGVuL2NvcHlyaWdodCAxOTk0LTIwMDEgYnkgRG9uYWxkIEJlY2tlci4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJUGxlYXNlIHJlZmVyIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay90dWxpcC11c2VyLntwZGYscHMsaHRtbH0KKwlmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGRyaXZlciwgb3IgdmlzaXQgdGhlIHByb2plY3QKKwlXZWIgcGFnZSBhdCBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3R1bGlwLworCisqLworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJ0dWxpcC5oIgorCisKK3N0YXRpYyB1MTYgdDIxMTQyX2NzcjEzW10gPSB7IDB4MDAwMSwgMHgwMDA5LCAweDAwMDksIDB4MDAwMCwgMHgwMDAxLCB9OwordTE2IHQyMTE0Ml9jc3IxNFtdID0JICAgIHsgMHhGRkZGLCAweDA3MDUsIDB4MDcwNSwgMHgwMDAwLCAweDdGM0QsIH07CitzdGF0aWMgdTE2IHQyMTE0Ml9jc3IxNVtdID0geyAweDAwMDgsIDB4MDAwNiwgMHgwMDBFLCAweDAwMDgsIDB4MDAwOCwgfTsKKworCisvKiBIYW5kbGUgdGhlIDIxMTQzIHVuaXF1ZWx5OiBkbyBhdXRvc2VsZWN0IHdpdGggTldheSwgbm90IHRoZSBFRVBST00gbGlzdAorICAgb2YgYXZhaWxhYmxlIHRyYW5zY2VpdmVycy4gICovCit2b2lkIHQyMTE0Ml90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisJaW50IGNzcjEyID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTIpOworCWludCBuZXh0X3RpY2sgPSA2MCpIWjsKKwlpbnQgbmV3X2NzcjYgPSAwOworCisJaWYgKHR1bGlwX2RlYnVnID4gMikKKwkJcHJpbnRrKEtFUk5fSU5GTyIlczogMjExNDMgbmVnb3RpYXRpb24gc3RhdHVzICU4Ljh4LCAlcy5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGNzcjEyLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSk7CisJaWYgKHR1bGlwX21lZGlhX2NhcFtkZXYtPmlmX3BvcnRdICYgTWVkaWFJc01JSSkgeworCQlpZiAodHVsaXBfY2hlY2tfZHVwbGV4KGRldikgPCAwKSB7CisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQkJbmV4dF90aWNrID0gMypIWjsKKwkJfSBlbHNlIHsKKwkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwkJCW5leHRfdGljayA9IDYwKkhaOworCQl9CisJfSBlbHNlIGlmICh0cC0+bndheXNldCkgeworCQkvKiBEb24ndCBzY3JldyB1cCBhIG5lZ290aWF0ZWQgc2Vzc2lvbiEgKi8KKwkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0lORk8iJXM6IFVzaW5nIE5XYXktc2V0ICVzIG1lZGlhLCBjc3IxMiAlOC44eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSwgY3NyMTIpOworCX0gZWxzZSBpZiAodHAtPm1lZGlhbG9jaykgeworCQkJOworCX0gZWxzZSBpZiAoZGV2LT5pZl9wb3J0ID09IDMpIHsKKwkJaWYgKGNzcjEyICYgMikgewkvKiBObyAxMDBtYnBzIGxpbmsgYmVhdCwgcmV2ZXJ0IHRvIDEwbWJwcy4gKi8KKwkJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyIlczogTm8gMjExNDMgMTAwYmFzZVR4IGxpbmsgYmVhdCwgJTguOHgsICIKKwkJCQkJICAgInRyeWluZyBOV2F5LlxuIiwgZGV2LT5uYW1lLCBjc3IxMik7CisJCQl0MjExNDJfc3RhcnRfbndheShkZXYpOworCQkJbmV4dF90aWNrID0gMypIWjsKKwkJfQorCX0gZWxzZSBpZiAoKGNzcjEyICYgMHg3MDAwKSAhPSAweDUwMDApIHsKKwkJLyogTmVnb3RpYXRpb24gZmFpbGVkLiAgU2VhcmNoIG1lZGlhIHR5cGVzLiAqLworCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyIlczogMjExNDMgbmVnb3RpYXRpb24gZmFpbGVkLCBzdGF0dXMgJTguOHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgY3NyMTIpOworCQlpZiAoIShjc3IxMiAmIDQpKSB7CQkvKiAxMG1icHMgbGluayBiZWF0IGdvb2QuICovCisJCQluZXdfY3NyNiA9IDB4ODI0MjAwMDA7CisJCQlkZXYtPmlmX3BvcnQgPSAwOworCQkJaW93cml0ZTMyKDAsIGlvYWRkciArIENTUjEzKTsKKwkJCWlvd3JpdGUzMigweDAwMDNGRkZGLCBpb2FkZHIgKyBDU1IxNCk7CisJCQlpb3dyaXRlMTYodDIxMTQyX2NzcjE1W2Rldi0+aWZfcG9ydF0sIGlvYWRkciArIENTUjE1KTsKKwkJCWlvd3JpdGUzMih0MjExNDJfY3NyMTNbZGV2LT5pZl9wb3J0XSwgaW9hZGRyICsgQ1NSMTMpOworCQl9IGVsc2UgeworCQkJLyogU2VsZWN0IDEwMG1icHMgcG9ydCB0byBjaGVjayBmb3IgbGluayBiZWF0LiAqLworCQkJbmV3X2NzcjYgPSAweDgzODYwMDAwOworCQkJZGV2LT5pZl9wb3J0ID0gMzsKKwkJCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBDU1IxMyk7CisJCQlpb3dyaXRlMzIoMHgwMDAzRkY3RiwgaW9hZGRyICsgQ1NSMTQpOworCQkJaW93cml0ZTE2KDgsIGlvYWRkciArIENTUjE1KTsKKwkJCWlvd3JpdGUzMigxLCBpb2FkZHIgKyBDU1IxMyk7CisJCX0KKwkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0lORk8iJXM6IFRlc3RpbmcgbmV3IDIxMTQzIG1lZGlhICVzLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdKTsKKwkJaWYgKG5ld19jc3I2ICE9ICh0cC0+Y3NyNiAmIH4weDAwRDUpKSB7CisJCQl0cC0+Y3NyNiAmPSAweDAwRDU7CisJCQl0cC0+Y3NyNiB8PSBuZXdfY3NyNjsKKwkJCWlvd3JpdGUzMigweDAzMDEsIGlvYWRkciArIENTUjEyKTsKKwkJCXR1bGlwX3Jlc3RhcnRfcnh0eCh0cCk7CisJCX0KKwkJbmV4dF90aWNrID0gMypIWjsKKwl9CisKKwkvKiBtb2RfdGltZXIgc3luY2hyb25pemVzIHVzIHdpdGggcG90ZW50aWFsIGFkZF90aW1lciBjYWxscworCSAqIGZyb20gaW50ZXJydXB0cy4KKwkgKi8KKwltb2RfdGltZXIoJnRwLT50aW1lciwgUlVOX0FUKG5leHRfdGljaykpOworfQorCisKK3ZvaWQgdDIxMTQyX3N0YXJ0X253YXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKwlpbnQgY3NyMTQgPSAoKHRwLT5zeW1fYWR2ZXJ0aXNlICYgMHgwNzgwKSA8PCA5KSAgfAorCQkoKHRwLT5zeW1fYWR2ZXJ0aXNlICYgMHgwMDIwKSA8PCAxKSB8IDB4ZmZiZjsKKworCWRldi0+aWZfcG9ydCA9IDA7CisJdHAtPm53YXkgPSB0cC0+bWVkaWFzZW5zZSA9IDE7CisJdHAtPm53YXlzZXQgPSB0cC0+bHBhciA9IDA7CisJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSZXN0YXJ0aW5nIDIxMTQzIGF1dG9uZWdvdGlhdGlvbiwgY3NyMTQ9JTguOHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBjc3IxNCk7CisJaW93cml0ZTMyKDB4MDAwMSwgaW9hZGRyICsgQ1NSMTMpOworCXVkZWxheSgxMDApOworCWlvd3JpdGUzMihjc3IxNCwgaW9hZGRyICsgQ1NSMTQpOworCXRwLT5jc3I2ID0gMHg4MjQyMDAwMCB8ICh0cC0+c3ltX2FkdmVydGlzZSAmIDB4MDA0MCA/IEZ1bGxEdXBsZXggOiAwKTsKKwlpb3dyaXRlMzIodHAtPmNzcjYsIGlvYWRkciArIENTUjYpOworCWlmICh0cC0+bXRhYmxlICAmJiAgdHAtPm10YWJsZS0+Y3NyMTVkaXIpIHsKKwkJaW93cml0ZTMyKHRwLT5tdGFibGUtPmNzcjE1ZGlyLCBpb2FkZHIgKyBDU1IxNSk7CisJCWlvd3JpdGUzMih0cC0+bXRhYmxlLT5jc3IxNXZhbCwgaW9hZGRyICsgQ1NSMTUpOworCX0gZWxzZQorCQlpb3dyaXRlMTYoMHgwMDA4LCBpb2FkZHIgKyBDU1IxNSk7CisJaW93cml0ZTMyKDB4MTMwMSwgaW9hZGRyICsgQ1NSMTIpOyAJCS8qIFRyaWdnZXIgTldBWS4gKi8KK30KKworCisKK3ZvaWQgdDIxMTQyX2xua19jaGFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNzcjUpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisJaW50IGNzcjEyID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTIpOworCisJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyIlczogMjExNDMgbGluayBzdGF0dXMgaW50ZXJydXB0ICU4Ljh4LCBDU1I1ICV4LCAiCisJCQkgICAiJTguOHguXG4iLCBkZXYtPm5hbWUsIGNzcjEyLCBjc3I1LCBpb3JlYWQzMihpb2FkZHIgKyBDU1IxNCkpOworCisJLyogSWYgTldheSBmaW5pc2hlZCBhbmQgd2UgaGF2ZSBhIG5lZ290aWF0ZWQgcGFydG5lciBjYXBhYmlsaXR5LiAqLworCWlmICh0cC0+bndheSAgJiYgICF0cC0+bndheXNldCAgJiYgIChjc3IxMiAmIDB4NzAwMCkgPT0gMHg1MDAwKSB7CisJCWludCBzZXR1cF9kb25lID0gMDsKKwkJaW50IG5lZ290aWF0ZWQgPSB0cC0+c3ltX2FkdmVydGlzZSAmIChjc3IxMiA+PiAxNik7CisJCXRwLT5scGFyID0gY3NyMTIgPj4gMTY7CisJCXRwLT5ud2F5c2V0ID0gMTsKKwkJaWYgKG5lZ290aWF0ZWQgJiAweDAxMDApCQlkZXYtPmlmX3BvcnQgPSA1OworCQllbHNlIGlmIChuZWdvdGlhdGVkICYgMHgwMDgwKQlkZXYtPmlmX3BvcnQgPSAzOworCQllbHNlIGlmIChuZWdvdGlhdGVkICYgMHgwMDQwKQlkZXYtPmlmX3BvcnQgPSA0OworCQllbHNlIGlmIChuZWdvdGlhdGVkICYgMHgwMDIwKQlkZXYtPmlmX3BvcnQgPSAwOworCQllbHNlIHsKKwkJCXRwLT5ud2F5c2V0ID0gMDsKKwkJCWlmICgoY3NyMTIgJiAyKSA9PSAwICAmJiAgKHRwLT5zeW1fYWR2ZXJ0aXNlICYgMHgwMTgwKSkKKwkJCQlkZXYtPmlmX3BvcnQgPSAzOworCQl9CisJCXRwLT5mdWxsX2R1cGxleCA9ICh0dWxpcF9tZWRpYV9jYXBbZGV2LT5pZl9wb3J0XSAmIE1lZGlhQWx3YXlzRkQpID8gMTowOworCisJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpIHsKKwkJCWlmICh0cC0+bndheXNldCkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogU3dpdGNoaW5nIHRvICVzIGJhc2VkIG9uIGxpbmsgIgorCQkJCQkgICAibmVnb3RpYXRpb24gJTQuNHggJiAlNC40eCA9ICU0LjR4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSwgdHAtPnN5bV9hZHZlcnRpc2UsCisJCQkJCSAgIHRwLT5scGFyLCBuZWdvdGlhdGVkKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQXV0b25lZ290aWF0aW9uIGZhaWxlZCwgdXNpbmcgJXMsIgorCQkJCQkgICAiIGxpbmsgYmVhdCBzdGF0dXMgJTQuNHguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdLCBjc3IxMik7CisJCX0KKworCQlpZiAodHAtPm10YWJsZSkgeworCQkJaW50IGk7CisJCQlmb3IgKGkgPSAwOyBpIDwgdHAtPm10YWJsZS0+bGVhZmNvdW50OyBpKyspCisJCQkJaWYgKHRwLT5tdGFibGUtPm1sZWFmW2ldLm1lZGlhID09IGRldi0+aWZfcG9ydCkgeworCQkJCQlpbnQgc3RhcnR1cCA9ICEgKCh0cC0+Y2hpcF9pZCA9PSBEQzIxMTQzICYmIHRwLT5yZXZpc2lvbiA9PSA2NSkpOworCQkJCQl0cC0+Y3VyX2luZGV4ID0gaTsKKwkJCQkJdHVsaXBfc2VsZWN0X21lZGlhKGRldiwgc3RhcnR1cCk7CisJCQkJCXNldHVwX2RvbmUgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCX0KKwkJaWYgKCAhIHNldHVwX2RvbmUpIHsKKwkJCXRwLT5jc3I2ID0gKGRldi0+aWZfcG9ydCAmIDEgPyAweDgzOEUwMDAwIDogMHg4MjQyMDAwMCkgfCAodHAtPmNzcjYgJiAweDIwZmYpOworCQkJaWYgKHRwLT5mdWxsX2R1cGxleCkKKwkJCQl0cC0+Y3NyNiB8PSAweDAyMDA7CisJCQlpb3dyaXRlMzIoMSwgaW9hZGRyICsgQ1NSMTMpOworCQl9CisjaWYgMAkJCQkJCQkvKiBSZXN0YXJ0IHNob3VsZG4ndCBiZSBuZWVkZWQuICovCisJCWlvd3JpdGUzMih0cC0+Y3NyNiB8IFJ4T24sIGlvYWRkciArIENTUjYpOworCQlpZiAodHVsaXBfZGVidWcgPiAyKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAgUmVzdGFydGluZyBUeCBhbmQgUngsIENTUjUgaXMgJTguOHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSNSkpOworI2VuZGlmCisJCXR1bGlwX3N0YXJ0X3J4dHgodHApOworCQlpZiAodHVsaXBfZGVidWcgPiAyKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAgU2V0dGluZyBDU1I2ICU4Ljh4LyV4IENTUjEyICU4Ljh4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIHRwLT5jc3I2LCBpb3JlYWQzMihpb2FkZHIgKyBDU1I2KSwKKwkJCQkgICBpb3JlYWQzMihpb2FkZHIgKyBDU1IxMikpOworCX0gZWxzZSBpZiAoKHRwLT5ud2F5c2V0ICAmJiAgKGNzcjUgJiAweDA4MDAwMDAwKQorCQkJCSYmIChkZXYtPmlmX3BvcnQgPT0gMyAgfHwgIGRldi0+aWZfcG9ydCA9PSA1KQorCQkJCSYmIChjc3IxMiAmIDIpID09IDIpIHx8CisJCQkgICAodHAtPm53YXkgJiYgKGNzcjUgJiAoVFBMbmtGYWlsKSkpKSB7CisJCS8qIExpbmsgYmxldz8gTWF5YmUgcmVzdGFydCBOV2F5LiAqLworCQlkZWxfdGltZXJfc3luYygmdHAtPnRpbWVyKTsKKwkJdDIxMTQyX3N0YXJ0X253YXkoZGV2KTsKKwkJdHAtPnRpbWVyLmV4cGlyZXMgPSBSVU5fQVQoMypIWik7CisJCWFkZF90aW1lcigmdHAtPnRpbWVyKTsKKwl9IGVsc2UgaWYgKGRldi0+aWZfcG9ydCA9PSAzICB8fCAgZGV2LT5pZl9wb3J0ID09IDUpIHsKKwkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0lORk8iJXM6IDIxMTQzICVzIGxpbmsgYmVhdCAlcy5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSwKKwkJCQkgICAoY3NyMTIgJiAyKSA/ICJmYWlsZWQiIDogImdvb2QiKTsKKwkJaWYgKChjc3IxMiAmIDIpICAmJiAgISB0cC0+bWVkaWFsb2NrKSB7CisJCQlkZWxfdGltZXJfc3luYygmdHAtPnRpbWVyKTsKKwkJCXQyMTE0Ml9zdGFydF9ud2F5KGRldik7CisJCQl0cC0+dGltZXIuZXhwaXJlcyA9IFJVTl9BVCgzKkhaKTsKKwkJCWFkZF90aW1lcigmdHAtPnRpbWVyKTsKKwkJfSBlbHNlIGlmIChkZXYtPmlmX3BvcnQgPT0gNSkKKwkJCWlvd3JpdGUzMihpb3JlYWQzMihpb2FkZHIgKyBDU1IxNCkgJiB+MHgwODAsIGlvYWRkciArIENTUjE0KTsKKwl9IGVsc2UgaWYgKGRldi0+aWZfcG9ydCA9PSAwICB8fCAgZGV2LT5pZl9wb3J0ID09IDQpIHsKKwkJaWYgKChjc3IxMiAmIDQpID09IDApCisJCQlwcmludGsoS0VSTl9JTkZPIiVzOiAyMTE0MyAxMGJhc2VUIGxpbmsgYmVhdCBnb29kLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUpOworCX0gZWxzZSBpZiAoIShjc3IxMiAmIDQpKSB7CQkvKiAxMG1icHMgbGluayBiZWF0IGdvb2QuICovCisJCWlmICh0dWxpcF9kZWJ1ZykKKwkJCXByaW50ayhLRVJOX0lORk8iJXM6IDIxMTQzIDEwbWJwcyBzZW5zZWQgbWVkaWEuXG4iLAorCQkJCSAgIGRldi0+bmFtZSk7CisJCWRldi0+aWZfcG9ydCA9IDA7CisJfSBlbHNlIGlmICh0cC0+bndheXNldCkgeworCQlpZiAodHVsaXBfZGVidWcpCisJCQlwcmludGsoS0VSTl9JTkZPIiVzOiAyMTE0MyB1c2luZyBOV2F5LXNldCAlcywgY3NyNiAlOC44eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSwgdHAtPmNzcjYpOworCX0gZWxzZSB7CQkvKiAxMDBtYnBzIGxpbmsgYmVhdCBnb29kLiAqLworCQlpZiAodHVsaXBfZGVidWcpCisJCQlwcmludGsoS0VSTl9JTkZPIiVzOiAyMTE0MyAxMDBiYXNlVHggc2Vuc2VkIG1lZGlhLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUpOworCQlkZXYtPmlmX3BvcnQgPSAzOworCQl0cC0+Y3NyNiA9IDB4ODM4RTAwMDAgfCAodHAtPmNzcjYgJiAweDIwZmYpOworCQlpb3dyaXRlMzIoMHgwMDAzRkY3RiwgaW9hZGRyICsgQ1NSMTQpOworCQlpb3dyaXRlMzIoMHgwMzAxLCBpb2FkZHIgKyBDU1IxMik7CisJCXR1bGlwX3Jlc3RhcnRfcnh0eCh0cCk7CisJfQorfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL0tjb25maWcgYi9kcml2ZXJzL25ldC90dWxpcC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyY2RhZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC9LY29uZmlnCkBAIC0wLDAgKzEsMTY2IEBACisjCisjIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBjb25maWd1cmF0aW9uCisjCisKK21lbnUgIlR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIChQQ0kgfHwgRUlTQSB8fCBDQVJEQlVTKQorCitjb25maWcgTkVUX1RVTElQCisJYm9vbCAiXCJUdWxpcFwiIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0IgorCWhlbHAKKwkgIFRoaXMgc2VsZWN0cyB0aGUgIlR1bGlwIiBmYW1pbHkgb2YgRUlTQS9QQ0kgbmV0d29yayBjYXJkcy4KKworY29uZmlnIERFMjEwNFgKKwl0cmlzdGF0ZSAiRWFybHkgREVDY2hpcCBUdWxpcCAoZGMyMTA0eCkgUENJIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORVRfVFVMSVAgJiYgUENJICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIGlzIGRldmVsb3BlZCBmb3IgdGhlIFNNQyBFdGhlclBvd2VyIHNlcmllcyBFdGhlcm5ldAorCSAgY2FyZHMgYW5kIGFsc28gd29ya3Mgd2l0aCBjYXJkcyBiYXNlZCBvbiB0aGUgREVDY2hpcAorCSAgMjEwNDAgKFR1bGlwIHNlcmllcykgY2hpcHMuICBTb21lIExpbmtTeXMgUENJIGNhcmRzIGFyZQorCSAgb2YgdGhpcyB0eXBlLiAgKElmIHlvdXIgY2FyZCBpcyBOT1QgU01DIEV0aGVyUG93ZXIgMTAvMTAwIFBDSQorCSAgKHNtYzkzMzJkc3QpLCB5b3UgY2FuIGFsc28gdHJ5IHRoZSBkcml2ZXIgZm9yICJHZW5lcmljIERFQ2NoaXAiCisJICBjYXJkcywgYmVsb3cuICBIb3dldmVyLCBtb3N0IHBlb3BsZSB3aXRoIGEgbmV0d29yayBjYXJkIG9mIHRoaXMgdHlwZQorCSAgd2lsbCBzYXkgWSBoZXJlLikgRG8gcmVhZCB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGRlMjEwNHguCisKK2NvbmZpZyBUVUxJUAorCXRyaXN0YXRlICJERUNjaGlwIFR1bGlwIChkYzIxMTR4KSBQQ0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9UVUxJUCAmJiBQQ0kKKwlzZWxlY3QgQ1JDMzIKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBpcyBkZXZlbG9wZWQgZm9yIHRoZSBTTUMgRXRoZXJQb3dlciBzZXJpZXMgRXRoZXJuZXQKKwkgIGNhcmRzIGFuZCBhbHNvIHdvcmtzIHdpdGggY2FyZHMgYmFzZWQgb24gdGhlIERFQ2NoaXAgCisJICAyMTE0MCAoVHVsaXAgc2VyaWVzKSBjaGlwcy4gIFNvbWUgTGlua1N5cyBQQ0kgY2FyZHMgYXJlCisJICBvZiB0aGlzIHR5cGUuICAoSWYgeW91ciBjYXJkIGlzIE5PVCBTTUMgRXRoZXJQb3dlciAxMC8xMDAgUENJCisJICAoc21jOTMzMmRzdCksIHlvdSBjYW4gYWxzbyB0cnkgdGhlIGRyaXZlciBmb3IgIkdlbmVyaWMgREVDY2hpcCIKKwkgIGNhcmRzLCBhYm92ZS4gIEhvd2V2ZXIsIG1vc3QgcGVvcGxlIHdpdGggYSBuZXR3b3JrIGNhcmQgb2YgdGhpcyB0eXBlCisJICB3aWxsIHNheSBZIGhlcmUuKSBEbyByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgdHVsaXAuCisKK2NvbmZpZyBUVUxJUF9NV0kKKwlib29sICJOZXcgYnVzIGNvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBUVUxJUCAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGNvbmZpZ3VyZXMgeW91ciBUdWxpcCBjYXJkIHNwZWNpZmljYWxseSBmb3IgdGhlIGNhcmQgYW5kCisJICBzeXN0ZW0gY2FjaGUgbGluZSBzaXplIHR5cGUgeW91IGFyZSB1c2luZy4KKworCSAgVGhpcyBpcyBleHBlcmltZW50YWwgY29kZSwgbm90IHlldCB0ZXN0ZWQgb24gbWFueSBib2FyZHMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBUVUxJUF9NTUlPCisJYm9vbCAiVXNlIFBDSSBzaGFyZWQgbWVtIGZvciBOSUMgcmVnaXN0ZXJzIgorCWRlcGVuZHMgb24gVFVMSVAKKwloZWxwCisJICBVc2UgUENJIHNoYXJlZCBtZW1vcnkgZm9yIHRoZSBOSUMgcmVnaXN0ZXJzLCByYXRoZXIgdGhhbiBnb2luZyB0aHJvdWdoCisJICB0aGUgVHVsaXAncyBQSU8gKHByb2dyYW1tZWQgSS9PIHBvcnRzKS4gIEZhc3RlciwgYnV0IGNvdWxkIHByb2R1Y2UKKwkgIG9ic2N1cmUgYnVncyBpZiB5b3VyIG1haW5ib2FyZCBoYXMgbWVtb3J5IGNvbnRyb2xsZXIgdGltaW5nIGlzc3Vlcy4KKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFRVTElQX05BUEkKKwlib29sICJVc2UgTkFQSSBSWCBwb2xsaW5nICIKKwlkZXBlbmRzIG9uIFRVTElQCisJaGVscAorCSAgTkFQSSBpcyBhIG5ldyBkcml2ZXIgQVBJIGRlc2lnbmVkIHRvIHJlZHVjZSBDUFUgYW5kIGludGVycnVwdCBsb2FkCisJICB3aGVuIHRoZSBkcml2ZXIgaXMgcmVjZWl2aW5nIGxvdHMgb2YgcGFja2V0cyBmcm9tIHRoZSBjYXJkLiBJdCBpcworCSAgc3RpbGwgc29tZXdoYXQgZXhwZXJpbWVudGFsIGFuZCB0aHVzIG5vdCB5ZXQgZW5hYmxlZCBieSBkZWZhdWx0LgorCisJICBJZiB5b3VyIGVzdGltYXRlZCBSeCBsb2FkIGlzIDEwa3BwcyBvciBtb3JlLCBvciBpZiB0aGUgY2FyZCB3aWxsIGJlCisJICBkZXBsb3llZCBvbiBwb3RlbnRpYWxseSB1bmZyaWVuZGx5IG5ldHdvcmtzIChlLmcuIGluIGEgZmlyZXdhbGwpLAorCSAgdGhlbiBzYXkgWSBoZXJlLgorCisJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL05BUElfSE9XVE8udHh0PiBmb3IgbW9yZQorCSAgaW5mb3JtYXRpb24uCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIFRVTElQX05BUElfSFdfTUlUSUdBVElPTgorCWJvb2wgIlVzZSBJbnRlcnJ1cHQgTWl0aWdhdGlvbiAiCisJZGVwZW5kcyBvbiBUVUxJUF9OQVBJCisJLS0taGVscC0tLQorCSAgVXNlIEhXIHRvIHJlZHVjZSBSWCBpbnRlcnJ1cHRzLiBOb3Qgc3RyaWN0IG5lY2Vzc2FyeSBzaW5jZSBOQVBJIHJlZHVjZXMKKwkgIFJYIGludGVycnVwdHMgYnV0IGl0c2VsZi4gQWx0aG91Z2ggdGhpcyByZWR1Y2VzIFJYIGludGVycnVwdHMgZXZlbiBhdAorCSAgbG93IGxldmVscyB0cmFmZmljIGF0IHRoZSBjb3N0IG9mIGEgc21hbGwgbGF0ZW5jeS4KKworCSAgSWYgaW4gZG91YnQsIHNheSBZLgorCitjb25maWcgREU0WDUKKwl0cmlzdGF0ZSAiR2VuZXJpYyBERUNjaGlwICYgRElHSVRBTCBFdGhlcldPUktTIFBDSS9FSVNBIgorCWRlcGVuZHMgb24gTkVUX1RVTElQICYmIChQQ0kgfHwgRUlTQSkKKwlzZWxlY3QgQ1JDMzIKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSBESUdJVEFMIHNlcmllcyBvZiBQQ0kvRUlTQSBFdGhlcm5ldCBjYXJkcy4KKwkgIFRoZXNlIGluY2x1ZGUgdGhlIERFNDI1LCBERTQzNCwgREU0MzUsIERFNDUwIGFuZCBERTUwMCBtb2RlbHMuICBJZgorCSAgeW91IGhhdmUgYSBuZXR3b3JrIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgcmVhZCB0aGUKKwkgIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4gTW9yZSBzcGVjaWZpYworCSAgaW5mb3JtYXRpb24gaXMgY29udGFpbmVkIGluCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGU0eDUudHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBkZTR4NS4KKworY29uZmlnIFdJTkJPTkRfODQwCisJdHJpc3RhdGUgIldpbmJvbmQgVzg5Yzg0MCBFdGhlcm5ldCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1RVTElQICYmIFBDSQorCXNlbGVjdCBDUkMzMgorCXNlbGVjdCBNSUkKKwloZWxwCisJICBUaGlzIGRyaXZlciBpcyBmb3IgdGhlIFdpbmJvbmQgVzg5Yzg0MCBjaGlwLiAgSXQgYWxzbyB3b3JrcyB3aXRoIAorCSAgdGhlIFRYOTg4MiBjaGlwIG9uIHRoZSBDb21wZXggUkwxMDAtQVRYIGJvYXJkLgorCSAgTW9yZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhbmQgdXBkYXRlcyBhcmUgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL2RyaXZlcnMuaHRtbD4uCisKK2NvbmZpZyBETTkxMDIKKwl0cmlzdGF0ZSAiRGF2aWNvbSBETTkxMHgvRE05ODB4IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfVFVMSVAgJiYgUENJCisJc2VsZWN0IENSQzMyCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgaXMgZm9yIERNOTEwMihBKS9ETTkxMzIvRE05ODAxIGNvbXBhdGlibGUgUENJIGNhcmRzIGZyb20KKwkgIERhdmljb20gKDxodHRwOi8vd3d3LmRhdmljb20uY29tLnR3Lz4pLiAgSWYgeW91IGhhdmUgc3VjaCBhIG5ldHdvcmsKKwkgIChFdGhlcm5ldCkgY2FyZCwgc2F5IFkuICBTb21lIGluZm9ybWF0aW9uIGlzIGNvbnRhaW5lZCBpbiB0aGUgZmlsZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RtZmUudHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBkbWZlLgorCitjb25maWcgUENNQ0lBX1hJUkNPTQorCXRyaXN0YXRlICJYaXJjb20gQ2FyZEJ1cyBzdXBwb3J0IChuZXcgZHJpdmVyKSIKKwlkZXBlbmRzIG9uIE5FVF9UVUxJUCAmJiBDQVJEQlVTCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSBEaWdpdGFsICJUdWxpcCIgRXRoZXJuZXQgQ2FyZEJ1cyBhZGFwdGVycy4KKwkgIEl0IHNob3VsZCB3b3JrIHdpdGggbW9zdCBERUMgMjEqNCotYmFzZWQgY2hpcHMvZXRoZXJjYXJkcywgYXMgd2VsbAorCSAgYXMgd2l0aCB3b3JrLWFsaWtlIGNoaXBzIGZyb20gTGl0ZS1PbiAoUE5JQykgYW5kIE1hY3Jvbml4IChNWElDKSBhbmQKKwkgIEFTSVguCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgeGlyY29tX2NiLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFBDTUNJQV9YSVJUVUxJUAorCXRyaXN0YXRlICJYaXJjb20gVHVsaXAtbGlrZSBDYXJkQnVzIHN1cHBvcnQgKG9sZCBkcml2ZXIpIgorCWRlcGVuZHMgb24gTkVUX1RVTElQICYmIENBUkRCVVMgJiYgQlJPS0VOX09OX1NNUAorCXNlbGVjdCBDUkMzMgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIGlzIGZvciB0aGUgRGlnaXRhbCAiVHVsaXAiIEV0aGVybmV0IENhcmRCdXMgYWRhcHRlcnMuCisJICBJdCBzaG91bGQgd29yayB3aXRoIG1vc3QgREVDIDIxKjQqLWJhc2VkIGNoaXBzL2V0aGVyY2FyZHMsIGFzIHdlbGwKKwkgIGFzIHdpdGggd29yay1hbGlrZSBjaGlwcyBmcm9tIExpdGUtT24gKFBOSUMpIGFuZCBNYWNyb25peCAoTVhJQykgYW5kCisJICBBU0lYLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIHhpcmNvbV90dWxpcF9jYi4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2VuZG1lbnUKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC90dWxpcC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmI5YjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvTWFrZWZpbGUKQEAgLTAsMCArMSwxNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4ICJUdWxpcCIgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIGRyaXZlcnMuCisjCisKK29iai0kKENPTkZJR19QQ01DSUFfWElSVFVMSVApCSs9IHhpcmNvbV90dWxpcF9jYi5vCitvYmotJChDT05GSUdfUENNQ0lBX1hJUkNPTSkJKz0geGlyY29tX2NiLm8KK29iai0kKENPTkZJR19ETTkxMDIpCQkrPSBkbWZlLm8KK29iai0kKENPTkZJR19XSU5CT05EXzg0MCkJKz0gd2luYm9uZC04NDAubworb2JqLSQoQ09ORklHX0RFMjEwNFgpCQkrPSBkZTIxMDR4Lm8KK29iai0kKENPTkZJR19UVUxJUCkJCSs9IHR1bGlwLm8KK29iai0kKENPTkZJR19ERTRYNSkJCSs9IGRlNHg1Lm8KKworIyBEZWNsYXJlIG11bHRpLXBhcnQgZHJpdmVycy4KKwordHVsaXAtb2JqcwkJCTo9IGVlcHJvbS5vIGludGVycnVwdC5vIG1lZGlhLm8gXAorCQkJCSAgIHRpbWVyLm8gdHVsaXBfY29yZS5vCQlcCisJCQkJICAgMjExNDIubyBwbmljLm8gcG5pYzIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jIGIvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOGUxOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMKQEAgLTAsMCArMSwyMTg3IEBACisvKiBkZTIxMDR4LmM6IEEgTGludXggUENJIEV0aGVybmV0IGRyaXZlciBmb3IgSW50ZWwvRGlnaXRhbCAyMTA0MC8xIGNoaXBzLiAqLworLyoKKwlDb3B5cmlnaHQgMjAwMSwyMDAzIEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKworCUNvcHlyaWdodCAxOTk0LCAxOTk1IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLgkgICAgW2RlNHg1LmNdCisJV3JpdHRlbi9jb3B5cmlnaHQgMTk5NC0yMDAxIGJ5IERvbmFsZCBCZWNrZXIuCQkgICAgW3R1bGlwLmNdCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mCisJdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKwlEcml2ZXJzIGJhc2VkIG9uIG9yIGRlcml2ZWQgZnJvbSB0aGlzIGNvZGUgZmFsbCB1bmRlciB0aGUgR1BMIGFuZCBtdXN0CisJcmV0YWluIHRoZSBhdXRob3JzaGlwLCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2Ugbm90aWNlLiAgVGhpcyBmaWxlIGlzIG5vdAorCWEgY29tcGxldGUgcHJvZ3JhbSBhbmQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBlbnRpcmUgb3BlcmF0aW5nCisJc3lzdGVtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuCisKKwlTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCVRPRE8sIGluIHJvdWdoIHByaW9yaXR5IG9yZGVyOgorCSogU3VwcG9ydCBmb3JjaW5nIG1lZGlhIHR5cGUgd2l0aCBhIG1vZHVsZSBwYXJhbWV0ZXIsCisJICBsaWtlIGRsMmsuYy9zdW5kYW5jZS5jCisJKiBDb25zdGFudHMgKG1vZHVsZSBwYXJtcz8pIGZvciBSeCB3b3JrIGxpbWl0CisJKiBDb21wbGV0ZSByZXNldCBvbiBQY2lFcnIKKwkqIEp1bWJvIGZyYW1lcyAvIGRldi0+Y2hhbmdlX210dQorCSogQWRqdXN0IFJ4IEZJRk8gdGhyZXNob2xkIGFuZCBNYXggUnggRE1BIGJ1cnN0IG9uIFJ4IEZJRk8gZXJyb3IKKwkqIEFkanVzdCBUeCBGSUZPIHRocmVzaG9sZCBhbmQgTWF4IFR4IERNQSBidXJzdCBvbiBUeCBGSUZPIGVycm9yCisJKiBJbXBsZW1lbnQgVHggc29mdHdhcmUgaW50ZXJydXB0IG1pdGlnYXRpb24gdmlhCisJICBUeCBkZXNjcmlwdG9yIGJpdAorCisgKi8KKworI2RlZmluZSBEUlZfTkFNRQkJImRlMjEwNHgiCisjZGVmaW5lIERSVl9WRVJTSU9OCQkiMC43IgorI2RlZmluZSBEUlZfUkVMREFURQkJIk1hciAxNywgMjAwNCIKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworLyogVGhlc2UgaWRlbnRpZnkgdGhlIGRyaXZlciBiYXNlIHZlcnNpb24gYW5kIG1heSBub3QgYmUgcmVtb3ZlZC4gKi8KK3N0YXRpYyBjaGFyIHZlcnNpb25bXSA9CitLRVJOX0lORk8gRFJWX05BTUUgIiBQQ0kgRXRoZXJuZXQgZHJpdmVyIHYiIERSVl9WRVJTSU9OICIgKCIgRFJWX1JFTERBVEUgIilcbiI7CisKK01PRFVMRV9BVVRIT1IoIkplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwvRGlnaXRhbCAyMTA0MC8xIHNlcmllcyBQQ0kgRXRoZXJuZXQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CisKK3N0YXRpYyBpbnQgZGVidWcgPSAtMTsKK21vZHVsZV9wYXJhbSAoZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDIChkZWJ1ZywgImRlMjEwNHggYml0bWFwcGVkIG1lc3NhZ2UgZW5hYmxlIG51bWJlciIpOworCisvKiBTZXQgdGhlIGNvcHkgYnJlYWtwb2ludCBmb3IgdGhlIGNvcHktb25seS10aW55LWJ1ZmZlciBSeCBzdHJ1Y3R1cmUuICovCisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX2hwcGFfXykgXAorICAgICAgICB8fCBkZWZpbmVkKF9fc3BhcmNfKSB8fCBkZWZpbmVkKF9faWE2NF9fKSBcCisgICAgICAgIHx8IGRlZmluZWQoX19zaF9fKSB8fCBkZWZpbmVkKF9fbWlwc19fKQorc3RhdGljIGludCByeF9jb3B5YnJlYWsgPSAxNTE4OworI2Vsc2UKK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrID0gMTAwOworI2VuZGlmCittb2R1bGVfcGFyYW0gKHJ4X2NvcHlicmVhaywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MgKHJ4X2NvcHlicmVhaywgImRlMjEwNHggQnJlYWtwb2ludCBhdCB3aGljaCBSeCBwYWNrZXRzIGFyZSBjb3BpZWQiKTsKKworI2RlZmluZSBQRlgJCQlEUlZfTkFNRSAiOiAiCisKKyNkZWZpbmUgREVfREVGX01TR19FTkFCTEUJKE5FVElGX01TR19EUlYJCXwgXAorCQkJCSBORVRJRl9NU0dfUFJPQkUgCXwgXAorCQkJCSBORVRJRl9NU0dfTElOSwkJfCBcCisJCQkJIE5FVElGX01TR19JRkRPV04JfCBcCisJCQkJIE5FVElGX01TR19JRlVQCQl8IFwKKwkJCQkgTkVUSUZfTVNHX1JYX0VSUgl8IFwKKwkJCQkgTkVUSUZfTVNHX1RYX0VSUikKKworI2RlZmluZSBERV9SWF9SSU5HX1NJWkUJCTY0CisjZGVmaW5lIERFX1RYX1JJTkdfU0laRQkJNjQKKyNkZWZpbmUgREVfUklOR19CWVRFUwkJXAorCQkoKHNpemVvZihzdHJ1Y3QgZGVfZGVzYykgKiBERV9SWF9SSU5HX1NJWkUpICsJXAorCQkoc2l6ZW9mKHN0cnVjdCBkZV9kZXNjKSAqIERFX1RYX1JJTkdfU0laRSkpCisjZGVmaW5lIE5FWFRfVFgoTikJCSgoKE4pICsgMSkgJiAoREVfVFhfUklOR19TSVpFIC0gMSkpCisjZGVmaW5lIE5FWFRfUlgoTikJCSgoKE4pICsgMSkgJiAoREVfUlhfUklOR19TSVpFIC0gMSkpCisjZGVmaW5lIFRYX0JVRkZTX0FWQUlMKENQKQkJCQkJXAorCSgoKENQKS0+dHhfdGFpbCA8PSAoQ1ApLT50eF9oZWFkKSA/CQkJXAorCSAgKENQKS0+dHhfdGFpbCArIChERV9UWF9SSU5HX1NJWkUgLSAxKSAtIChDUCktPnR4X2hlYWQgOglcCisJICAoQ1ApLT50eF90YWlsIC0gKENQKS0+dHhfaGVhZCAtIDEpCisKKyNkZWZpbmUgUEtUX0JVRl9TWgkJMTUzNgkvKiBTaXplIG9mIGVhY2ggdGVtcG9yYXJ5IFJ4IGJ1ZmZlci4qLworI2RlZmluZSBSWF9PRkZTRVQJCTIKKworI2RlZmluZSBERV9TRVRVUF9TS0IJCSgoc3RydWN0IHNrX2J1ZmYgKikgMSkKKyNkZWZpbmUgREVfRFVNTVlfU0tCCQkoKHN0cnVjdCBza19idWZmICopIDIpCisjZGVmaW5lIERFX1NFVFVQX0ZSQU1FX1dPUkRTCTk2CisjZGVmaW5lIERFX0VFUFJPTV9XT1JEUwkJMjU2CisjZGVmaW5lIERFX0VFUFJPTV9TSVpFCQkoREVfRUVQUk9NX1dPUkRTICogc2l6ZW9mKHUxNikpCisjZGVmaW5lIERFX01BWF9NRURJQQkJNQorCisjZGVmaW5lIERFX01FRElBX1RQX0FVVE8JMAorI2RlZmluZSBERV9NRURJQV9CTkMJCTEKKyNkZWZpbmUgREVfTUVESUFfQVVJCQkyCisjZGVmaW5lIERFX01FRElBX1RQCQkzCisjZGVmaW5lIERFX01FRElBX1RQX0ZECQk0CisjZGVmaW5lIERFX01FRElBX0lOVkFMSUQJREVfTUFYX01FRElBCisjZGVmaW5lIERFX01FRElBX0ZJUlNUCQkwCisjZGVmaW5lIERFX01FRElBX0xBU1QJCShERV9NQVhfTUVESUEgLSAxKQorI2RlZmluZSBERV9BVUlfQk5DCQkoU1VQUE9SVEVEX0FVSSB8IFNVUFBPUlRFRF9CTkMpCisKKyNkZWZpbmUgREVfVElNRVJfTElOSwkJKDYwICogSFopCisjZGVmaW5lIERFX1RJTUVSX05PX0xJTksJKDUgKiBIWikKKworI2RlZmluZSBERV9OVU1fUkVHUwkJMTYKKyNkZWZpbmUgREVfUkVHU19TSVpFCQkoREVfTlVNX1JFR1MgKiBzaXplb2YodTMyKSkKKyNkZWZpbmUgREVfUkVHU19WRVIJCTEKKworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUCQkoNipIWikKKworI2RlZmluZSBERV9VTkFMSUdORURfMTYoYSkJKHUxNikoZ2V0X3VuYWxpZ25lZCgodTE2ICopKGEpKSkKKworLyogVGhpcyBpcyBhIG15c3RlcmlvdXMgdmFsdWUgdGhhdCBjYW4gYmUgd3JpdHRlbiB0byBDU1IxMSBpbiB0aGUgMjEwNDAgKG9ubHkpCisgICB0byBzdXBwb3J0IGEgcHJlLU5XYXkgZnVsbC1kdXBsZXggc2lnbmFsaW5nIG1lY2hhbmlzbSB1c2luZyBzaG9ydCBmcmFtZXMuCisgICBObyBvbmUga25vd3Mgd2hhdCBpdCBzaG91bGQgYmUsIGJ1dCBpZiBsZWZ0IGF0IGl0cyBkZWZhdWx0IHZhbHVlIHNvbWUKKyAgIDEwYmFzZTIoISkgcGFja2V0cyB0cmlnZ2VyIGEgZnVsbC1kdXBsZXgtcmVxdWVzdCBpbnRlcnJ1cHQuICovCisjZGVmaW5lIEZVTExfRFVQTEVYX01BR0lDCTB4Njk2OQorCitlbnVtIHsKKwkvKiBOSUMgcmVnaXN0ZXJzICovCisJQnVzTW9kZQkJCT0gMHgwMCwKKwlUeFBvbGwJCQk9IDB4MDgsCisJUnhQb2xsCQkJPSAweDEwLAorCVJ4UmluZ0FkZHIJCT0gMHgxOCwKKwlUeFJpbmdBZGRyCQk9IDB4MjAsCisJTWFjU3RhdHVzCQk9IDB4MjgsCisJTWFjTW9kZQkJCT0gMHgzMCwKKwlJbnRyTWFzawkJPSAweDM4LAorCVJ4TWlzc2VkCQk9IDB4NDAsCisJUk9NQ21kCQkJPSAweDQ4LAorCUNTUjExCQkJPSAweDU4LAorCVNJQVN0YXR1cwkJPSAweDYwLAorCUNTUjEzCQkJPSAweDY4LAorCUNTUjE0CQkJPSAweDcwLAorCUNTUjE1CQkJPSAweDc4LAorCVBDSVBNCQkJPSAweDQwLAorCisJLyogQnVzTW9kZSBiaXRzICovCisJQ21kUmVzZXQJCT0gKDEgPDwgMCksCisJQ2FjaGVBbGlnbjE2CQk9IDB4MDAwMDgwMDAsCisJQnVyc3RMZW40CQk9IDB4MDAwMDA0MDAsCisKKwkvKiBSeC9UeFBvbGwgYml0cyAqLworCU5vcm1hbFR4UG9sbAkJPSAoMSA8PCAwKSwKKwlOb3JtYWxSeFBvbGwJCT0gKDEgPDwgMCksCisKKwkvKiBUeC9SeCBkZXNjcmlwdG9yIHN0YXR1cyBiaXRzICovCisJRGVzY093bgkJCT0gKDEgPDwgMzEpLAorCVJ4RXJyb3IJCQk9ICgxIDw8IDE1KSwKKwlSeEVyckxvbmcJCT0gKDEgPDwgNyksCisJUnhFcnJDUkMJCT0gKDEgPDwgMSksCisJUnhFcnJGSUZPCQk9ICgxIDw8IDApLAorCVJ4RXJyUnVudAkJPSAoMSA8PCAxMSksCisJUnhFcnJGcmFtZQkJPSAoMSA8PCAxNCksCisJUmluZ0VuZAkJCT0gKDEgPDwgMjUpLAorCUZpcnN0RnJhZwkJPSAoMSA8PCAyOSksCisJTGFzdEZyYWcJCT0gKDEgPDwgMzApLAorCVR4RXJyb3IJCQk9ICgxIDw8IDE1KSwKKwlUeEZJRk9VbmRlcgkJPSAoMSA8PCAxKSwKKwlUeExpbmtGYWlsCQk9ICgxIDw8IDIpIHwgKDEgPDwgMTApIHwgKDEgPDwgMTEpLAorCVR4TWF4Q29sCQk9ICgxIDw8IDgpLAorCVR4T1dDCQkJPSAoMSA8PCA5KSwKKwlUeEphYmJlcgkJPSAoMSA8PCAxNCksCisJU2V0dXBGcmFtZQkJPSAoMSA8PCAyNyksCisJVHhTd0ludAkJCT0gKDEgPDwgMzEpLAorCisJLyogTWFjU3RhdHVzIGJpdHMgKi8KKwlJbnRyT0sJCQk9ICgxIDw8IDE2KSwKKwlJbnRyRXJyCQkJPSAoMSA8PCAxNSksCisJUnhJbnRyCQkJPSAoMSA8PCA2KSwKKwlSeEVtcHR5CQkJPSAoMSA8PCA3KSwKKwlUeEludHIJCQk9ICgxIDw8IDApLAorCVR4RW1wdHkJCQk9ICgxIDw8IDIpLAorCVBjaUVycgkJCT0gKDEgPDwgMTMpLAorCVR4U3RhdGUJCQk9ICgxIDw8IDIyKSB8ICgxIDw8IDIxKSB8ICgxIDw8IDIwKSwKKwlSeFN0YXRlCQkJPSAoMSA8PCAxOSkgfCAoMSA8PCAxOCkgfCAoMSA8PCAxNyksCisJTGlua0ZhaWwJCT0gKDEgPDwgMTIpLAorCUxpbmtQYXNzCQk9ICgxIDw8IDQpLAorCVJ4U3RvcHBlZAkJPSAoMSA8PCA4KSwKKwlUeFN0b3BwZWQJCT0gKDEgPDwgMSksCisKKwkvKiBNYWNNb2RlIGJpdHMgKi8KKwlUeEVuYWJsZQkJPSAoMSA8PCAxMyksCisJUnhFbmFibGUJCT0gKDEgPDwgMSksCisJUnhUeAkJCT0gVHhFbmFibGUgfCBSeEVuYWJsZSwKKwlGdWxsRHVwbGV4CQk9ICgxIDw8IDkpLAorCUFjY2VwdEFsbE11bHRpY2FzdAk9ICgxIDw8IDcpLAorCUFjY2VwdEFsbFBoeXMJCT0gKDEgPDwgNiksCisJQk9DbnQJCQk9ICgxIDw8IDUpLAorCU1hY01vZGVDbGVhcgkJPSAoMTw8MTIpIHwgKDE8PDExKSB8ICgxPDwxMCkgfCAoMTw8OCkgfCAoMTw8MykgfAorCQkJCSAgUnhUeCB8IEJPQ250IHwgQWNjZXB0QWxsUGh5cyB8IEFjY2VwdEFsbE11bHRpY2FzdCwKKworCS8qIFJPTUNtZCBiaXRzICovCisJRUVfU0hJRlRfQ0xLCQk9IDB4MDIsCS8qIEVFUFJPTSBzaGlmdCBjbG9jay4gKi8KKwlFRV9DUwkJCT0gMHgwMSwJLyogRUVQUk9NIGNoaXAgc2VsZWN0LiAqLworCUVFX0RBVEFfV1JJVEUJCT0gMHgwNCwJLyogRGF0YSBmcm9tIHRoZSBUdWxpcCB0byBFRVBST00uICovCisJRUVfV1JJVEVfMAkJPSAweDAxLAorCUVFX1dSSVRFXzEJCT0gMHgwNSwKKwlFRV9EQVRBX1JFQUQJCT0gMHgwOCwJLyogRGF0YSBmcm9tIHRoZSBFRVBST00gY2hpcC4gKi8KKwlFRV9FTkIJCQk9ICgweDQ4MDAgfCBFRV9DUyksCisKKwkvKiBUaGUgRUVQUk9NIGNvbW1hbmRzIGluY2x1ZGUgdGhlIGFsd2F5LXNldCBsZWFkaW5nIGJpdC4gKi8KKwlFRV9SRUFEX0NNRAkJPSA2LAorCisJLyogUnhNaXNzZWQgYml0cyAqLworCVJ4TWlzc2VkT3ZlcgkJPSAoMSA8PCAxNiksCisJUnhNaXNzZWRNYXNrCQk9IDB4ZmZmZiwKKworCS8qIFNST00tcmVsYXRlZCBiaXRzICovCisJU1JPTUMwSW5mb0xlYWYJCT0gMjcsCisJTWVkaWFCbG9ja01hc2sJCT0gMHgzZiwKKwlNZWRpYUN1c3RvbUNTUnMJCT0gKDEgPDwgNiksCisJCisJLyogUENJUE0gYml0cyAqLworCVBNX1NsZWVwCQk9ICgxIDw8IDMxKSwKKwlQTV9Tbm9vemUJCT0gKDEgPDwgMzApLAorCVBNX01hc2sJCQk9IFBNX1NsZWVwIHwgUE1fU25vb3plLAorCQorCS8qIFNJQVN0YXR1cyBiaXRzICovCisJTldheVN0YXRlCQk9ICgxIDw8IDE0KSB8ICgxIDw8IDEzKSB8ICgxIDw8IDEyKSwKKwlOV2F5UmVzdGFydAkJPSAoMSA8PCAxMiksCisJTm9uc2VsUG9ydEFjdGl2ZQk9ICgxIDw8IDkpLAorCUxpbmtGYWlsU3RhdHVzCQk9ICgxIDw8IDIpLAorCU5ldEN4bkVycgkJPSAoMSA8PCAxKSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgZGVfaW50cl9tYXNrID0KKwlJbnRyT0sgfCBJbnRyRXJyIHwgUnhJbnRyIHwgUnhFbXB0eSB8IFR4SW50ciB8IFR4RW1wdHkgfAorCUxpbmtQYXNzIHwgTGlua0ZhaWwgfCBQY2lFcnI7CisKKy8qCisgKiBTZXQgdGhlIHByb2dyYW1tYWJsZSBidXJzdCBsZW5ndGggdG8gNCBsb25nd29yZHMgZm9yIGFsbDoKKyAqIERNQSBlcnJvcnMgcmVzdWx0IHdpdGhvdXQgdGhlc2UgdmFsdWVzLiBDYWNoZSBhbGlnbiAxNiBsb25nLgorICovCitzdGF0aWMgY29uc3QgdTMyIGRlX2J1c19tb2RlID0gQ2FjaGVBbGlnbjE2IHwgQnVyc3RMZW40OworCitzdHJ1Y3QgZGVfc3JvbV9tZWRpYV9ibG9jayB7CisJdTgJCQlvcHRzOworCXUxNgkJCWNzcjEzOworCXUxNgkJCWNzcjE0OworCXUxNgkJCWNzcjE1OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGRlX3Nyb21faW5mb19sZWFmIHsKKwl1MTYJCQlkZWZhdWx0X21lZGlhOworCXU4CQkJbl9ibG9ja3M7CisJdTgJCQl1bnVzZWQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZGVfZGVzYyB7CisJdTMyCQkJb3B0czE7CisJdTMyCQkJb3B0czI7CisJdTMyCQkJYWRkcjE7CisJdTMyCQkJYWRkcjI7Cit9OworCitzdHJ1Y3QgbWVkaWFfaW5mbyB7CisJdTE2CQkJdHlwZTsJLyogREVfTUVESUFfeHh4ICovCisJdTE2CQkJY3NyMTM7CisJdTE2CQkJY3NyMTQ7CisJdTE2CQkJY3NyMTU7Cit9OworCitzdHJ1Y3QgcmluZ19pbmZvIHsKKwlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYjsKKwlkbWFfYWRkcl90CQltYXBwaW5nOworfTsKKworc3RydWN0IGRlX3ByaXZhdGUgeworCXVuc2lnbmVkCQl0eF9oZWFkOworCXVuc2lnbmVkCQl0eF90YWlsOworCXVuc2lnbmVkCQlyeF90YWlsOworCisJdm9pZAkJCV9faW9tZW0gKnJlZ3M7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKKwlzcGlubG9ja190CQlsb2NrOworCisJc3RydWN0IGRlX2Rlc2MJCSpyeF9yaW5nOworCXN0cnVjdCBkZV9kZXNjCQkqdHhfcmluZzsKKwlzdHJ1Y3QgcmluZ19pbmZvCXR4X3NrYltERV9UWF9SSU5HX1NJWkVdOworCXN0cnVjdCByaW5nX2luZm8Jcnhfc2tiW0RFX1JYX1JJTkdfU0laRV07CisJdW5zaWduZWQJCXJ4X2J1Zl9zejsKKwlkbWFfYWRkcl90CQlyaW5nX2RtYTsKKworCXUzMgkJCW1zZ19lbmFibGU7CisKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBuZXRfc3RhdHM7CisKKwlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7CisKKwl1MTYJCQlzZXR1cF9mcmFtZVtERV9TRVRVUF9GUkFNRV9XT1JEU107CisKKwl1MzIJCQltZWRpYV90eXBlOworCXUzMgkJCW1lZGlhX3N1cHBvcnRlZDsKKwl1MzIJCQltZWRpYV9hZHZlcnRpc2U7CisJc3RydWN0IG1lZGlhX2luZm8JbWVkaWFbREVfTUFYX01FRElBXTsKKwlzdHJ1Y3QgdGltZXJfbGlzdAltZWRpYV90aW1lcjsKKworCXU4CQkJKmVlX2RhdGE7CisJdW5zaWduZWQJCWJvYXJkX2lkeDsKKwl1bnNpZ25lZAkJZGUyMTA0MCA6IDE7CisJdW5zaWduZWQJCW1lZGlhX2xvY2sgOiAxOworfTsKKworCitzdGF0aWMgdm9pZCBkZV9zZXRfcnhfbW9kZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBkZV90eCAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKTsKK3N0YXRpYyB2b2lkIGRlX2NsZWFuX3JpbmdzIChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUpOworc3RhdGljIHZvaWQgZGVfbWVkaWFfaW50ZXJydXB0IChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUsIHUzMiBzdGF0dXMpOworc3RhdGljIHZvaWQgZGUyMTA0MF9tZWRpYV90aW1lciAodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGRlMjEwNDFfbWVkaWFfdGltZXIgKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGRlX29rX3RvX2FkdmVydGlzZSAoc3RydWN0IGRlX3ByaXZhdGUgKmRlLCB1MzIgbmV3X21lZGlhKTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZGVfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9ERUMsIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQLAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9ERUMsIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX1BMVVMsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBkZV9wY2lfdGJsKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtZWRpYV9uYW1lW0RFX01BWF9NRURJQV0gPSB7CisJIjEwYmFzZVQgYXV0byIsCisJIkJOQyIsCisJIkFVSSIsCisJIjEwYmFzZVQtSEQiLAorCSIxMGJhc2VULUZEIgorfTsKKworLyogMjEwNDAgdHJhbnNjZWl2ZXIgcmVnaXN0ZXIgc2V0dGluZ3M6CisgKiBUUCBBVVRPKHVudXNlZCksIEJOQyh1bnVzZWQpLCBBVUksIFRQLCBUUCBGRCovCitzdGF0aWMgdTE2IHQyMTA0MF9jc3IxM1tdID0geyAwLCAwLCAweDhGMDksIDB4OEYwMSwgMHg4RjAxLCB9Oworc3RhdGljIHUxNiB0MjEwNDBfY3NyMTRbXSA9IHsgMCwgMCwgMHgwNzA1LCAweEZGRkYsIDB4RkZGRCwgfTsKK3N0YXRpYyB1MTYgdDIxMDQwX2NzcjE1W10gPSB7IDAsIDAsIDB4MDAwNiwgMHgwMDAwLCAweDAwMDAsIH07CisKKy8qIDIxMDQxIHRyYW5zY2VpdmVyIHJlZ2lzdGVyIHNldHRpbmdzOiBUUCBBVVRPLCBCTkMsIEFVSSwgVFAsIFRQIEZEKi8KK3N0YXRpYyB1MTYgdDIxMDQxX2NzcjEzW10gPSB7IDB4RUYwMSwgMHhFRjA5LCAweEVGMDksIDB4RUYwMSwgMHhFRjA5LCB9Oworc3RhdGljIHUxNiB0MjEwNDFfY3NyMTRbXSA9IHsgMHhGRkZGLCAweEY3RkQsIDB4RjdGRCwgMHg2RjNGLCAweDZGM0QsIH07CitzdGF0aWMgdTE2IHQyMTA0MV9jc3IxNVtdID0geyAweDAwMDgsIDB4MDAwNiwgMHgwMDBFLCAweDAwMDgsIDB4MDAwOCwgfTsKKworCisjZGVmaW5lIGRyMzIocmVnKQkJcmVhZGwoZGUtPnJlZ3MgKyAocmVnKSkKKyNkZWZpbmUgZHczMihyZWcsdmFsKQkJd3JpdGVsKCh2YWwpLCBkZS0+cmVncyArIChyZWcpKQorCisKK3N0YXRpYyB2b2lkIGRlX3J4X2Vycl9hY2N0IChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUsIHVuc2lnbmVkIHJ4X3RhaWwsCisJCQkgICAgdTMyIHN0YXR1cywgdTMyIGxlbikKK3sKKwlpZiAobmV0aWZfbXNnX3J4X2VyciAoZGUpKQorCQlwcmludGsgKEtFUk5fREVCVUcKKwkJCSIlczogcnggZXJyLCBzbG90ICVkIHN0YXR1cyAweCV4IGxlbiAlZFxuIiwKKwkJCWRlLT5kZXYtPm5hbWUsIHJ4X3RhaWwsIHN0YXR1cywgbGVuKTsKKworCWlmICgoc3RhdHVzICYgMHgzODAwMDMwMCkgIT0gMHgwMzAwKSB7CisJCS8qIEluZ29yZSBlYXJsaWVyIGJ1ZmZlcnMuICovCisJCWlmICgoc3RhdHVzICYgMHhmZmZmKSAhPSAweDdmZmYpIHsKKwkJCWlmIChuZXRpZl9tc2dfcnhfZXJyKGRlKSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3ZlcnNpemVkIEV0aGVybmV0IGZyYW1lICIKKwkJCQkJICAgInNwYW5uZWQgbXVsdGlwbGUgYnVmZmVycywgc3RhdHVzICU4Ljh4IVxuIiwKKwkJCQkJICAgZGUtPmRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCWRlLT5uZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQl9CisJfSBlbHNlIGlmIChzdGF0dXMgJiBSeEVycm9yKSB7CisJCS8qIFRoZXJlIHdhcyBhIGZhdGFsIGVycm9yLiAqLworCQlkZS0+bmV0X3N0YXRzLnJ4X2Vycm9ycysrOyAvKiBlbmQgb2YgYSBwYWNrZXQuKi8KKwkJaWYgKHN0YXR1cyAmIDB4MDg5MCkgZGUtPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBSeEVyckNSQykgZGUtPm5ldF9zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBSeEVyckZJRk8pIGRlLT5uZXRfc3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRlX3J4IChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUpCit7CisJdW5zaWduZWQgcnhfdGFpbCA9IGRlLT5yeF90YWlsOworCXVuc2lnbmVkIHJ4X3dvcmsgPSBERV9SWF9SSU5HX1NJWkU7CisJdW5zaWduZWQgZHJvcCA9IDA7CisJaW50IHJjOworCisJd2hpbGUgKHJ4X3dvcmstLSkgeworCQl1MzIgc3RhdHVzLCBsZW47CisJCWRtYV9hZGRyX3QgbWFwcGluZzsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKmNvcHlfc2tiOworCQl1bnNpZ25lZCBjb3B5aW5nX3NrYiwgYnVmbGVuOworCisJCXNrYiA9IGRlLT5yeF9za2JbcnhfdGFpbF0uc2tiOworCQlpZiAoIXNrYikKKwkJCUJVRygpOworCQlybWIoKTsKKwkJc3RhdHVzID0gbGUzMl90b19jcHUoZGUtPnJ4X3JpbmdbcnhfdGFpbF0ub3B0czEpOworCQlpZiAoc3RhdHVzICYgRGVzY093bikKKwkJCWJyZWFrOworCisJCWxlbiA9ICgoc3RhdHVzID4+IDE2KSAmIDB4N2ZmKSAtIDQ7CisJCW1hcHBpbmcgPSBkZS0+cnhfc2tiW3J4X3RhaWxdLm1hcHBpbmc7CisKKwkJaWYgKHVubGlrZWx5KGRyb3ApKSB7CisJCQlkZS0+bmV0X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWdvdG8gcnhfbmV4dDsKKwkJfQorCisJCWlmICh1bmxpa2VseSgoc3RhdHVzICYgMHgzODAwODMwMCkgIT0gMHgwMzAwKSkgeworCQkJZGVfcnhfZXJyX2FjY3QoZGUsIHJ4X3RhaWwsIHN0YXR1cywgbGVuKTsKKwkJCWdvdG8gcnhfbmV4dDsKKwkJfQorCisJCWNvcHlpbmdfc2tiID0gKGxlbiA8PSByeF9jb3B5YnJlYWspOworCisJCWlmICh1bmxpa2VseShuZXRpZl9tc2dfcnhfc3RhdHVzKGRlKSkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJ4IHNsb3QgJWQgc3RhdHVzIDB4JXggbGVuICVkIGNvcHlpbmc/ICVkXG4iLAorCQkJICAgICAgIGRlLT5kZXYtPm5hbWUsIHJ4X3RhaWwsIHN0YXR1cywgbGVuLAorCQkJICAgICAgIGNvcHlpbmdfc2tiKTsKKworCQlidWZsZW4gPSBjb3B5aW5nX3NrYiA/IChsZW4gKyBSWF9PRkZTRVQpIDogZGUtPnJ4X2J1Zl9zejsKKwkJY29weV9za2IgPSBkZXZfYWxsb2Nfc2tiIChidWZsZW4pOworCQlpZiAodW5saWtlbHkoIWNvcHlfc2tiKSkgeworCQkJZGUtPm5ldF9zdGF0cy5yeF9kcm9wcGVkKys7CisJCQlkcm9wID0gMTsKKwkJCXJ4X3dvcmsgPSAxMDA7CisJCQlnb3RvIHJ4X25leHQ7CisJCX0KKwkJY29weV9za2ItPmRldiA9IGRlLT5kZXY7CisKKwkJaWYgKCFjb3B5aW5nX3NrYikgeworCQkJcGNpX3VubWFwX3NpbmdsZShkZS0+cGRldiwgbWFwcGluZywKKwkJCQkJIGJ1ZmxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXNrYl9wdXQoc2tiLCBsZW4pOworCisJCQltYXBwaW5nID0KKwkJCWRlLT5yeF9za2JbcnhfdGFpbF0ubWFwcGluZyA9CisJCQkJcGNpX21hcF9zaW5nbGUoZGUtPnBkZXYsIGNvcHlfc2tiLT50YWlsLAorCQkJCQkgICAgICAgYnVmbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGUtPnJ4X3NrYltyeF90YWlsXS5za2IgPSBjb3B5X3NrYjsKKwkJfSBlbHNlIHsKKwkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShkZS0+cGRldiwgbWFwcGluZywgbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJc2tiX3Jlc2VydmUoY29weV9za2IsIFJYX09GRlNFVCk7CisJCQltZW1jcHkoc2tiX3B1dChjb3B5X3NrYiwgbGVuKSwgc2tiLT50YWlsLCBsZW4pOworCisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGUtPnBkZXYsIG1hcHBpbmcsIGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkJLyogV2UnbGwgcmV1c2UgdGhlIG9yaWdpbmFsIHJpbmcgYnVmZmVyLiAqLworCQkJc2tiID0gY29weV9za2I7CisJCX0KKworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMgKHNrYiwgZGUtPmRldik7CisKKwkJZGUtPm5ldF9zdGF0cy5yeF9wYWNrZXRzKys7CisJCWRlLT5uZXRfc3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCWRlLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlyYyA9IG5ldGlmX3J4IChza2IpOworCQlpZiAocmMgPT0gTkVUX1JYX0RST1ApCisJCQlkcm9wID0gMTsKKworcnhfbmV4dDoKKwkJZGUtPnJ4X3JpbmdbcnhfdGFpbF0ub3B0czEgPSBjcHVfdG9fbGUzMihEZXNjT3duKTsKKwkJaWYgKHJ4X3RhaWwgPT0gKERFX1JYX1JJTkdfU0laRSAtIDEpKQorCQkJZGUtPnJ4X3JpbmdbcnhfdGFpbF0ub3B0czIgPQorCQkJCWNwdV90b19sZTMyKFJpbmdFbmQgfCBkZS0+cnhfYnVmX3N6KTsKKwkJZWxzZQorCQkJZGUtPnJ4X3JpbmdbcnhfdGFpbF0ub3B0czIgPSBjcHVfdG9fbGUzMihkZS0+cnhfYnVmX3N6KTsKKwkJZGUtPnJ4X3JpbmdbcnhfdGFpbF0uYWRkcjEgPSBjcHVfdG9fbGUzMihtYXBwaW5nKTsKKwkJcnhfdGFpbCA9IE5FWFRfUlgocnhfdGFpbCk7CisJfQorCisJaWYgKCFyeF93b3JrKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcnggd29yayBsaW1pdCByZWFjaGVkXG4iLCBkZS0+ZGV2LT5uYW1lKTsKKworCWRlLT5yeF90YWlsID0gcnhfdGFpbDsKK30KKworc3RhdGljIGlycXJldHVybl90IGRlX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2luc3RhbmNlOworCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IGRldi0+cHJpdjsKKwl1MzIgc3RhdHVzOworCisJc3RhdHVzID0gZHIzMihNYWNTdGF0dXMpOworCWlmICgoIShzdGF0dXMgJiAoSW50ck9LfEludHJFcnIpKSkgfHwgKHN0YXR1cyA9PSAweEZGRkYpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlpZiAobmV0aWZfbXNnX2ludHIoZGUpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludHIsIHN0YXR1cyAlMDh4IG1vZGUgJTA4eCBkZXNjICV1LyV1LyV1XG4iLAorCQkgICAgICAgIGRldi0+bmFtZSwgc3RhdHVzLCBkcjMyKE1hY01vZGUpLCBkZS0+cnhfdGFpbCwgZGUtPnR4X2hlYWQsIGRlLT50eF90YWlsKTsKKworCWR3MzIoTWFjU3RhdHVzLCBzdGF0dXMpOworCisJaWYgKHN0YXR1cyAmIChSeEludHIgfCBSeEVtcHR5KSkgeworCQlkZV9yeChkZSk7CisJCWlmIChzdGF0dXMgJiBSeEVtcHR5KQorCQkJZHczMihSeFBvbGwsIE5vcm1hbFJ4UG9sbCk7CisJfQorCisJc3Bpbl9sb2NrKCZkZS0+bG9jayk7CisKKwlpZiAoc3RhdHVzICYgKFR4SW50ciB8IFR4RW1wdHkpKQorCQlkZV90eChkZSk7CisKKwlpZiAoc3RhdHVzICYgKExpbmtQYXNzIHwgTGlua0ZhaWwpKQorCQlkZV9tZWRpYV9pbnRlcnJ1cHQoZGUsIHN0YXR1cyk7CisKKwlzcGluX3VubG9jaygmZGUtPmxvY2spOworCisJaWYgKHN0YXR1cyAmIFBjaUVycikgeworCQl1MTYgcGNpX3N0YXR1czsKKworCQlwY2lfcmVhZF9jb25maWdfd29yZChkZS0+cGRldiwgUENJX1NUQVRVUywgJnBjaV9zdGF0dXMpOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGUtPnBkZXYsIFBDSV9TVEFUVVMsIHBjaV9zdGF0dXMpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBQQ0kgYnVzIGVycm9yLCBzdGF0dXM9JTA4eCwgUENJIHN0YXR1cz0lMDR4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMsIHBjaV9zdGF0dXMpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgZGVfdHggKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwl1bnNpZ25lZCB0eF9oZWFkID0gZGUtPnR4X2hlYWQ7CisJdW5zaWduZWQgdHhfdGFpbCA9IGRlLT50eF90YWlsOworCisJd2hpbGUgKHR4X3RhaWwgIT0gdHhfaGVhZCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQl1MzIgc3RhdHVzOworCisJCXJtYigpOworCQlzdGF0dXMgPSBsZTMyX3RvX2NwdShkZS0+dHhfcmluZ1t0eF90YWlsXS5vcHRzMSk7CisJCWlmIChzdGF0dXMgJiBEZXNjT3duKQorCQkJYnJlYWs7CisKKwkJc2tiID0gZGUtPnR4X3NrYlt0eF90YWlsXS5za2I7CisJCWlmICghc2tiKQorCQkJQlVHKCk7CisJCWlmICh1bmxpa2VseShza2IgPT0gREVfRFVNTVlfU0tCKSkKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAodW5saWtlbHkoc2tiID09IERFX1NFVFVQX1NLQikpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoZGUtPnBkZXYsIGRlLT50eF9za2JbdHhfdGFpbF0ubWFwcGluZywKKwkJCQkJIHNpemVvZihkZS0+c2V0dXBfZnJhbWUpLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCisJCXBjaV91bm1hcF9zaW5nbGUoZGUtPnBkZXYsIGRlLT50eF9za2JbdHhfdGFpbF0ubWFwcGluZywKKwkJCQkgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCWlmIChzdGF0dXMgJiBMYXN0RnJhZykgeworCQkJaWYgKHN0YXR1cyAmIFR4RXJyb3IpIHsKKwkJCQlpZiAobmV0aWZfbXNnX3R4X2VycihkZSkpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHggZXJyLCBzdGF0dXMgMHgleFxuIiwKKwkJCQkJICAgICAgIGRlLT5kZXYtPm5hbWUsIHN0YXR1cyk7CisJCQkJZGUtPm5ldF9zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgVHhPV0MpCisJCQkJCWRlLT5uZXRfc3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiBUeE1heENvbCkKKwkJCQkJZGUtPm5ldF9zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiBUeExpbmtGYWlsKQorCQkJCQlkZS0+bmV0X3N0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIFR4RklGT1VuZGVyKQorCQkJCQlkZS0+bmV0X3N0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQl9IGVsc2UgeworCQkJCWRlLT5uZXRfc3RhdHMudHhfcGFja2V0cysrOworCQkJCWRlLT5uZXRfc3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQkJaWYgKG5ldGlmX21zZ190eF9kb25lKGRlKSkKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0eCBkb25lLCBzbG90ICVkXG4iLCBkZS0+ZGV2LT5uYW1lLCB0eF90YWlsKTsKKwkJCX0KKwkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCX0KKworbmV4dDoKKwkJZGUtPnR4X3NrYlt0eF90YWlsXS5za2IgPSBOVUxMOworCisJCXR4X3RhaWwgPSBORVhUX1RYKHR4X3RhaWwpOworCX0KKworCWRlLT50eF90YWlsID0gdHhfdGFpbDsKKworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRlLT5kZXYpICYmIChUWF9CVUZGU19BVkFJTChkZSkgPiAoREVfVFhfUklOR19TSVpFIC8gNCkpKQorCQluZXRpZl93YWtlX3F1ZXVlKGRlLT5kZXYpOworfQorCitzdGF0aWMgaW50IGRlX3N0YXJ0X3htaXQgKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGludCBlbnRyeSwgdHhfZnJlZTsKKwl1MzIgbWFwcGluZywgbGVuLCBmbGFncyA9IEZpcnN0RnJhZyB8IExhc3RGcmFnOworCXN0cnVjdCBkZV9kZXNjICp0eGQ7CisKKwlzcGluX2xvY2tfaXJxKCZkZS0+bG9jayk7CisKKwl0eF9mcmVlID0gVFhfQlVGRlNfQVZBSUwoZGUpOworCWlmICh0eF9mcmVlID09IDApIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlzcGluX3VubG9ja19pcnEoJmRlLT5sb2NrKTsKKwkJcmV0dXJuIDE7CisJfQorCXR4X2ZyZWUtLTsKKworCWVudHJ5ID0gZGUtPnR4X2hlYWQ7CisKKwl0eGQgPSAmZGUtPnR4X3JpbmdbZW50cnldOworCisJbGVuID0gc2tiLT5sZW47CisJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKGRlLT5wZGV2LCBza2ItPmRhdGEsIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJaWYgKGVudHJ5ID09IChERV9UWF9SSU5HX1NJWkUgLSAxKSkKKwkJZmxhZ3MgfD0gUmluZ0VuZDsKKwlpZiAoIXR4X2ZyZWUgfHwgKHR4X2ZyZWUgPT0gKERFX1RYX1JJTkdfU0laRSAvIDIpKSkKKwkJZmxhZ3MgfD0gVHhTd0ludDsKKwlmbGFncyB8PSBsZW47CisJdHhkLT5vcHRzMiA9IGNwdV90b19sZTMyKGZsYWdzKTsKKwl0eGQtPmFkZHIxID0gY3B1X3RvX2xlMzIobWFwcGluZyk7CisKKwlkZS0+dHhfc2tiW2VudHJ5XS5za2IgPSBza2I7CisJZGUtPnR4X3NrYltlbnRyeV0ubWFwcGluZyA9IG1hcHBpbmc7CisJd21iKCk7CisKKwl0eGQtPm9wdHMxID0gY3B1X3RvX2xlMzIoRGVzY093bik7CisJd21iKCk7CisKKwlkZS0+dHhfaGVhZCA9IE5FWFRfVFgoZW50cnkpOworCWlmIChuZXRpZl9tc2dfdHhfcXVldWVkKGRlKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0eCBxdWV1ZWQsIHNsb3QgJWQsIHNrYmxlbiAlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZW50cnksIHNrYi0+bGVuKTsKKworCWlmICh0eF9mcmVlID09IDApCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCXNwaW5fdW5sb2NrX2lycSgmZGUtPmxvY2spOworCisJLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgdHJhbnNtaXQgZGVtYW5kLiAqLworCWR3MzIoVHhQb2xsLCBOb3JtYWxUeFBvbGwpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLgorICAgTm90ZSB0aGF0IHdlIG9ubHkgdXNlIGV4Y2x1c2lvbiBhcm91bmQgYWN0dWFsbHkgcXVldWVpbmcgdGhlCisgICBuZXcgZnJhbWUsIG5vdCBhcm91bmQgZmlsbGluZyBkZS0+c2V0dXBfZnJhbWUuICBUaGlzIGlzIG5vbi1kZXRlcm1pbmlzdGljCisgICB3aGVuIHJlLWVudGVyZWQgYnV0IHN0aWxsIGNvcnJlY3QuICovCisKKyN1bmRlZiBzZXRfYml0X2xlCisjZGVmaW5lIHNldF9iaXRfbGUoaSxwKSBkbyB7ICgoY2hhciAqKShwKSlbKGkpLzhdIHw9ICgxPDwoKGkpJTgpKTsgfSB3aGlsZSgwKQorCitzdGF0aWMgdm9pZCBidWlsZF9zZXR1cF9mcmFtZV9oYXNoKHUxNiAqc2V0dXBfZnJtLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IGRldi0+cHJpdjsKKwl1MTYgaGFzaF90YWJsZVszMl07CisJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJaW50IGk7CisJdTE2ICplYWRkcnM7CisKKwltZW1zZXQoaGFzaF90YWJsZSwgMCwgc2l6ZW9mKGhhc2hfdGFibGUpKTsKKwlzZXRfYml0X2xlKDI1NSwgaGFzaF90YWJsZSk7IAkJCS8qIEJyb2FkY2FzdCBlbnRyeSAqLworCS8qIFRoaXMgc2hvdWxkIHdvcmsgb24gYmlnLWVuZGlhbiBtYWNoaW5lcyBhcyB3ZWxsLiAqLworCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJaW50IGluZGV4ID0gZXRoZXJfY3JjX2xlKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKSAmIDB4MWZmOworCisJCXNldF9iaXRfbGUoaW5kZXgsIGhhc2hfdGFibGUpOworCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCQkqc2V0dXBfZnJtKysgPSBoYXNoX3RhYmxlW2ldOworCQkJKnNldHVwX2ZybSsrID0gaGFzaF90YWJsZVtpXTsKKwkJfQorCQlzZXR1cF9mcm0gPSAmZGUtPnNldHVwX2ZyYW1lWzEzKjZdOworCX0KKworCS8qIEZpbGwgdGhlIGZpbmFsIGVudHJ5IHdpdGggb3VyIHBoeXNpY2FsIGFkZHJlc3MuICovCisJZWFkZHJzID0gKHUxNiAqKWRldi0+ZGV2X2FkZHI7CisJKnNldHVwX2ZybSsrID0gZWFkZHJzWzBdOyAqc2V0dXBfZnJtKysgPSBlYWRkcnNbMF07CisJKnNldHVwX2ZybSsrID0gZWFkZHJzWzFdOyAqc2V0dXBfZnJtKysgPSBlYWRkcnNbMV07CisJKnNldHVwX2ZybSsrID0gZWFkZHJzWzJdOyAqc2V0dXBfZnJtKysgPSBlYWRkcnNbMl07Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX3NldHVwX2ZyYW1lX3BlcmZlY3QodTE2ICpzZXR1cF9mcm0sIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlID0gZGV2LT5wcml2OworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCWludCBpOworCXUxNiAqZWFkZHJzOworCisJLyogV2UgaGF2ZSA8PSAxNCBhZGRyZXNzZXMgc28gd2UgY2FuIHVzZSB0aGUgd29uZGVyZnVsCisJICAgMTYgYWRkcmVzcyBwZXJmZWN0IGZpbHRlcmluZyBvZiB0aGUgVHVsaXAuICovCisJZm9yIChpID0gMCwgbWNsaXN0ID0gZGV2LT5tY19saXN0OyBpIDwgZGV2LT5tY19jb3VudDsKKwkgICAgIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCWVhZGRycyA9ICh1MTYgKiltY2xpc3QtPmRtaV9hZGRyOworCQkqc2V0dXBfZnJtKysgPSAqZWFkZHJzOyAqc2V0dXBfZnJtKysgPSAqZWFkZHJzKys7CisJCSpzZXR1cF9mcm0rKyA9ICplYWRkcnM7ICpzZXR1cF9mcm0rKyA9ICplYWRkcnMrKzsKKwkJKnNldHVwX2ZybSsrID0gKmVhZGRyczsgKnNldHVwX2ZybSsrID0gKmVhZGRycysrOworCX0KKwkvKiBGaWxsIHRoZSB1bnVzZWQgZW50cmllcyB3aXRoIHRoZSBicm9hZGNhc3QgYWRkcmVzcy4gKi8KKwltZW1zZXQoc2V0dXBfZnJtLCAweGZmLCAoMTUtaSkqMTIpOworCXNldHVwX2ZybSA9ICZkZS0+c2V0dXBfZnJhbWVbMTUqNl07CisKKwkvKiBGaWxsIHRoZSBmaW5hbCBlbnRyeSB3aXRoIG91ciBwaHlzaWNhbCBhZGRyZXNzLiAqLworCWVhZGRycyA9ICh1MTYgKilkZXYtPmRldl9hZGRyOworCSpzZXR1cF9mcm0rKyA9IGVhZGRyc1swXTsgKnNldHVwX2ZybSsrID0gZWFkZHJzWzBdOworCSpzZXR1cF9mcm0rKyA9IGVhZGRyc1sxXTsgKnNldHVwX2ZybSsrID0gZWFkZHJzWzFdOworCSpzZXR1cF9mcm0rKyA9IGVhZGRyc1syXTsgKnNldHVwX2ZybSsrID0gZWFkZHJzWzJdOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGVfc2V0X3J4X21vZGUgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlID0gZGV2LT5wcml2OworCXUzMiBtYWNtb2RlOworCXVuc2lnbmVkIGludCBlbnRyeTsKKwl1MzIgbWFwcGluZzsKKwlzdHJ1Y3QgZGVfZGVzYyAqdHhkOworCXN0cnVjdCBkZV9kZXNjICpkdW1teV90eGQgPSBOVUxMOworCisJbWFjbW9kZSA9IGRyMzIoTWFjTW9kZSkgJiB+KEFjY2VwdEFsbE11bHRpY2FzdCB8IEFjY2VwdEFsbFBoeXMpOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewkvKiBTZXQgcHJvbWlzY3VvdXMuICovCisJCW1hY21vZGUgfD0gQWNjZXB0QWxsTXVsdGljYXN0IHwgQWNjZXB0QWxsUGh5czsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKChkZXYtPm1jX2NvdW50ID4gMTAwMCkgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCS8qIFRvbyBtYW55IHRvIGZpbHRlciB3ZWxsIC0tIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KKwkJbWFjbW9kZSB8PSBBY2NlcHRBbGxNdWx0aWNhc3Q7CisJCWdvdG8gb3V0OworCX0KKworCS8qIE5vdGUgdGhhdCBvbmx5IHRoZSBsb3ctYWRkcmVzcyBzaG9ydHdvcmQgb2Ygc2V0dXBfZnJhbWUgaXMgdmFsaWQhCisJICAgVGhlIHZhbHVlcyBhcmUgZG91YmxlZCBmb3IgYmlnLWVuZGlhbiBhcmNoaXRlY3R1cmVzLiAqLworCWlmIChkZXYtPm1jX2NvdW50ID4gMTQpCS8qIE11c3QgdXNlIGEgbXVsdGljYXN0IGhhc2ggdGFibGUuICovCisJCWJ1aWxkX3NldHVwX2ZyYW1lX2hhc2ggKGRlLT5zZXR1cF9mcmFtZSwgZGV2KTsKKwllbHNlCisJCWJ1aWxkX3NldHVwX2ZyYW1lX3BlcmZlY3QgKGRlLT5zZXR1cF9mcmFtZSwgZGV2KTsKKworCS8qCisJICogTm93IGFkZCB0aGlzIGZyYW1lIHRvIHRoZSBUeCBsaXN0LgorCSAqLworCisJZW50cnkgPSBkZS0+dHhfaGVhZDsKKworCS8qIEF2b2lkIGEgY2hpcCBlcnJhdGEgYnkgcHJlZml4aW5nIGEgZHVtbXkgZW50cnkuICovCisJaWYgKGVudHJ5ICE9IDApIHsKKwkJZGUtPnR4X3NrYltlbnRyeV0uc2tiID0gREVfRFVNTVlfU0tCOworCisJCWR1bW15X3R4ZCA9ICZkZS0+dHhfcmluZ1tlbnRyeV07CisJCWR1bW15X3R4ZC0+b3B0czIgPSAoZW50cnkgPT0gKERFX1RYX1JJTkdfU0laRSAtIDEpKSA/CisJCQkJICAgY3B1X3RvX2xlMzIoUmluZ0VuZCkgOiAwOworCQlkdW1teV90eGQtPmFkZHIxID0gMDsKKworCQkvKiBNdXN0IHNldCBEZXNjT3duZWQgbGF0ZXIgdG8gYXZvaWQgcmFjZSB3aXRoIGNoaXAgKi8KKworCQllbnRyeSA9IE5FWFRfVFgoZW50cnkpOworCX0KKworCWRlLT50eF9za2JbZW50cnldLnNrYiA9IERFX1NFVFVQX1NLQjsKKwlkZS0+dHhfc2tiW2VudHJ5XS5tYXBwaW5nID0gbWFwcGluZyA9CisJICAgIHBjaV9tYXBfc2luZ2xlIChkZS0+cGRldiwgZGUtPnNldHVwX2ZyYW1lLAorCQkJICAgIHNpemVvZiAoZGUtPnNldHVwX2ZyYW1lKSwgUENJX0RNQV9UT0RFVklDRSk7CisKKwkvKiBQdXQgdGhlIHNldHVwIGZyYW1lIG9uIHRoZSBUeCBsaXN0LiAqLworCXR4ZCA9ICZkZS0+dHhfcmluZ1tlbnRyeV07CisJaWYgKGVudHJ5ID09IChERV9UWF9SSU5HX1NJWkUgLSAxKSkKKwkJdHhkLT5vcHRzMiA9IGNwdV90b19sZTMyKFNldHVwRnJhbWUgfCBSaW5nRW5kIHwgc2l6ZW9mIChkZS0+c2V0dXBfZnJhbWUpKTsKKwllbHNlCisJCXR4ZC0+b3B0czIgPSBjcHVfdG9fbGUzMihTZXR1cEZyYW1lIHwgc2l6ZW9mIChkZS0+c2V0dXBfZnJhbWUpKTsKKwl0eGQtPmFkZHIxID0gY3B1X3RvX2xlMzIobWFwcGluZyk7CisJd21iKCk7CisKKwl0eGQtPm9wdHMxID0gY3B1X3RvX2xlMzIoRGVzY093bik7CisJd21iKCk7CisKKwlpZiAoZHVtbXlfdHhkKSB7CisJCWR1bW15X3R4ZC0+b3B0czEgPSBjcHVfdG9fbGUzMihEZXNjT3duKTsKKwkJd21iKCk7CisJfQorCisJZGUtPnR4X2hlYWQgPSBORVhUX1RYKGVudHJ5KTsKKworCWlmIChUWF9CVUZGU19BVkFJTChkZSkgPCAwKQorCQlCVUcoKTsKKwlpZiAoVFhfQlVGRlNfQVZBSUwoZGUpID09IDApCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIFRyaWdnZXIgYW4gaW1tZWRpYXRlIHRyYW5zbWl0IGRlbWFuZC4gKi8KKwlkdzMyKFR4UG9sbCwgTm9ybWFsVHhQb2xsKTsKKworb3V0OgorCWlmIChtYWNtb2RlICE9IGRyMzIoTWFjTW9kZSkpCisJCWR3MzIoTWFjTW9kZSwgbWFjbW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGRlX3NldF9yeF9tb2RlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlID0gZGV2LT5wcml2OworCisJc3Bpbl9sb2NrX2lycXNhdmUgKCZkZS0+bG9jaywgZmxhZ3MpOworCV9fZGVfc2V0X3J4X21vZGUoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmZGUtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlX3J4X21pc3NlZChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUsIHUzMiByeF9taXNzZWQpCit7CisJaWYgKHVubGlrZWx5KHJ4X21pc3NlZCAmIFJ4TWlzc2VkT3ZlcikpCisJCWRlLT5uZXRfc3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBSeE1pc3NlZE1hc2s7CisJZWxzZQorCQlkZS0+bmV0X3N0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gKHJ4X21pc3NlZCAmIFJ4TWlzc2VkTWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGVfZ2V0X3N0YXRzKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwl1MzIgdG1wID0gZHIzMihSeE1pc3NlZCk7IC8qIHNlbGYtY2xlYXJpbmcgKi8KKworCWRlX3J4X21pc3NlZChkZSwgdG1wKTsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpkZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisKKwkvKiBUaGUgY2hpcCBvbmx5IG5lZWQgcmVwb3J0IGZyYW1lIHNpbGVudGx5IGRyb3BwZWQuICovCisJc3Bpbl9sb2NrX2lycSgmZGUtPmxvY2spOworIAlpZiAobmV0aWZfcnVubmluZyhkZXYpICYmIG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisgCQlfX2RlX2dldF9zdGF0cyhkZSk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZS0+bG9jayk7CisKKwlyZXR1cm4gJmRlLT5uZXRfc3RhdHM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRlX2lzX3J1bm5pbmcgKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwlyZXR1cm4gKGRyMzIoTWFjU3RhdHVzKSAmIChSeFN0YXRlIHwgVHhTdGF0ZSkpID8gMSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlX3N0b3Bfcnh0eCAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCXUzMiBtYWNtb2RlOworCXVuc2lnbmVkIGludCB3b3JrID0gMTAwMDsKKworCW1hY21vZGUgPSBkcjMyKE1hY01vZGUpOworCWlmIChtYWNtb2RlICYgUnhUeCkgeworCQlkdzMyKE1hY01vZGUsIG1hY21vZGUgJiB+UnhUeCk7CisJCWRyMzIoTWFjTW9kZSk7CisJfQorCisJd2hpbGUgKC0td29yayA+IDApIHsKKwkJaWYgKCFkZV9pc19ydW5uaW5nKGRlKSkKKwkJCXJldHVybjsKKwkJY3B1X3JlbGF4KCk7CisJfQorCQorCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0aW1lb3V0IGV4cGlyZWQgc3RvcHBpbmcgRE1BXG4iLCBkZS0+ZGV2LT5uYW1lKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlX3N0YXJ0X3J4dHggKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwl1MzIgbWFjbW9kZTsKKworCW1hY21vZGUgPSBkcjMyKE1hY01vZGUpOworCWlmICgobWFjbW9kZSAmIFJ4VHgpICE9IFJ4VHgpIHsKKwkJZHczMihNYWNNb2RlLCBtYWNtb2RlIHwgUnhUeCk7CisJCWRyMzIoTWFjTW9kZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkZV9zdG9wX2h3IChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUpCit7CisKKwl1ZGVsYXkoNSk7CisJZHczMihJbnRyTWFzaywgMCk7CisKKwlkZV9zdG9wX3J4dHgoZGUpOworCisJZHczMihNYWNTdGF0dXMsIGRyMzIoTWFjU3RhdHVzKSk7CisKKwl1ZGVsYXkoMTApOworCisJZGUtPnJ4X3RhaWwgPSAwOworCWRlLT50eF9oZWFkID0gZGUtPnR4X3RhaWwgPSAwOworfQorCitzdGF0aWMgdm9pZCBkZV9saW5rX3VwKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwlpZiAoIW5ldGlmX2NhcnJpZXJfb2soZGUtPmRldikpIHsKKwkJbmV0aWZfY2Fycmllcl9vbihkZS0+ZGV2KTsKKwkJaWYgKG5ldGlmX21zZ19saW5rKGRlKSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIHVwLCBtZWRpYSAlc1xuIiwKKwkJCSAgICAgICBkZS0+ZGV2LT5uYW1lLCBtZWRpYV9uYW1lW2RlLT5tZWRpYV90eXBlXSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkZV9saW5rX2Rvd24oc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCWlmIChuZXRpZl9jYXJyaWVyX29rKGRlLT5kZXYpKSB7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRlLT5kZXYpOworCQlpZiAobmV0aWZfbXNnX2xpbmsoZGUpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgZG93blxuIiwgZGUtPmRldi0+bmFtZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkZV9zZXRfbWVkaWEgKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwl1bnNpZ25lZCBtZWRpYSA9IGRlLT5tZWRpYV90eXBlOworCXUzMiBtYWNtb2RlID0gZHIzMihNYWNNb2RlKTsKKworCWlmIChkZV9pc19ydW5uaW5nKGRlKSkKKwkJQlVHKCk7CisKKwlpZiAoZGUtPmRlMjEwNDApCisJCWR3MzIoQ1NSMTEsIEZVTExfRFVQTEVYX01BR0lDKTsKKwlkdzMyKENTUjEzLCAwKTsgLyogUmVzZXQgcGh5ICovCisJZHczMihDU1IxNCwgZGUtPm1lZGlhW21lZGlhXS5jc3IxNCk7CisJZHczMihDU1IxNSwgZGUtPm1lZGlhW21lZGlhXS5jc3IxNSk7CisJZHczMihDU1IxMywgZGUtPm1lZGlhW21lZGlhXS5jc3IxMyk7CisKKwkvKiBtdXN0IGRlbGF5IDEwbXMgYmVmb3JlIHdyaXRpbmcgdG8gb3RoZXIgcmVnaXN0ZXJzLAorCSAqIGVzcGVjaWFsbHkgQ1NSNgorCSAqLworCW1kZWxheSgxMCk7CisKKwlpZiAobWVkaWEgPT0gREVfTUVESUFfVFBfRkQpCisJCW1hY21vZGUgfD0gRnVsbER1cGxleDsKKwllbHNlCisJCW1hY21vZGUgJj0gfkZ1bGxEdXBsZXg7CisJCisJaWYgKG5ldGlmX21zZ19saW5rKGRlKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogc2V0IGxpbmsgJXNcbiIKKwkJICAgICAgIEtFUk5fSU5GTyAiJXM6ICAgIG1vZGUgMHgleCwgc2lhIDB4JXgsMHgleCwweCV4LDB4JXhcbiIKKwkJICAgICAgIEtFUk5fSU5GTyAiJXM6ICAgIHNldCBtb2RlIDB4JXgsIHNldCBzaWEgMHgleCwweCV4LDB4JXhcbiIsCisJCSAgICAgICBkZS0+ZGV2LT5uYW1lLCBtZWRpYV9uYW1lW21lZGlhXSwKKwkJICAgICAgIGRlLT5kZXYtPm5hbWUsIGRyMzIoTWFjTW9kZSksIGRyMzIoU0lBU3RhdHVzKSwKKwkJICAgICAgIGRyMzIoQ1NSMTMpLCBkcjMyKENTUjE0KSwgZHIzMihDU1IxNSksCisJCSAgICAgICBkZS0+ZGV2LT5uYW1lLCBtYWNtb2RlLCBkZS0+bWVkaWFbbWVkaWFdLmNzcjEzLAorCQkgICAgICAgZGUtPm1lZGlhW21lZGlhXS5jc3IxNCwgZGUtPm1lZGlhW21lZGlhXS5jc3IxNSk7CisJfQorCWlmIChtYWNtb2RlICE9IGRyMzIoTWFjTW9kZSkpCisJCWR3MzIoTWFjTW9kZSwgbWFjbW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGRlX25leHRfbWVkaWEgKHN0cnVjdCBkZV9wcml2YXRlICpkZSwgdTMyICptZWRpYSwKKwkJCSAgIHVuc2lnbmVkIGludCBuX21lZGlhKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5fbWVkaWE7IGkrKykgeworCQlpZiAoZGVfb2tfdG9fYWR2ZXJ0aXNlKGRlLCBtZWRpYVtpXSkpIHsKKwkJCWRlLT5tZWRpYV90eXBlID0gbWVkaWFbaV07CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRlMjEwNDBfbWVkaWFfdGltZXIgKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSAoc3RydWN0IGRlX3ByaXZhdGUgKikgZGF0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGUtPmRldjsKKwl1MzIgc3RhdHVzID0gZHIzMihTSUFTdGF0dXMpOworCXVuc2lnbmVkIGludCBjYXJyaWVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJY2FycmllciA9IChzdGF0dXMgJiBOZXRDeG5FcnIpID8gMCA6IDE7CisJCQorCWlmIChjYXJyaWVyKSB7CisJCWlmIChkZS0+bWVkaWFfdHlwZSAhPSBERV9NRURJQV9BVUkgJiYgKHN0YXR1cyAmIExpbmtGYWlsU3RhdHVzKSkKKwkJCWdvdG8gbm9fbGlua195ZXQ7CisKKwkJZGUtPm1lZGlhX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgREVfVElNRVJfTElOSzsKKwkJYWRkX3RpbWVyKCZkZS0+bWVkaWFfdGltZXIpOworCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2soZGV2KSkKKwkJCWRlX2xpbmtfdXAoZGUpOworCQllbHNlCisJCQlpZiAobmV0aWZfbXNnX3RpbWVyKGRlKSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXMgbGluayBvaywgc3RhdHVzICV4XG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIG1lZGlhX25hbWVbZGUtPm1lZGlhX3R5cGVdLAorCQkJCSAgICAgICBzdGF0dXMpOworCQlyZXR1cm47CisJfQorCisJZGVfbGlua19kb3duKGRlKTsJCisKKwlpZiAoZGUtPm1lZGlhX2xvY2spCisJCXJldHVybjsKKworCWlmIChkZS0+bWVkaWFfdHlwZSA9PSBERV9NRURJQV9BVUkpIHsKKwkJdTMyIG5leHRfc3RhdGUgPSBERV9NRURJQV9UUDsKKwkJZGVfbmV4dF9tZWRpYShkZSwgJm5leHRfc3RhdGUsIDEpOworCX0gZWxzZSB7CisJCXUzMiBuZXh0X3N0YXRlID0gREVfTUVESUFfQVVJOworCQlkZV9uZXh0X21lZGlhKGRlLCAmbmV4dF9zdGF0ZSwgMSk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlLT5sb2NrLCBmbGFncyk7CisJZGVfc3RvcF9yeHR4KGRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZS0+bG9jaywgZmxhZ3MpOworCWRlX3NldF9tZWRpYShkZSk7CisJZGVfc3RhcnRfcnh0eChkZSk7CisKK25vX2xpbmtfeWV0OgorCWRlLT5tZWRpYV90aW1lci5leHBpcmVzID0gamlmZmllcyArIERFX1RJTUVSX05PX0xJTks7CisJYWRkX3RpbWVyKCZkZS0+bWVkaWFfdGltZXIpOworCisJaWYgKG5ldGlmX21zZ190aW1lcihkZSkpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBubyBsaW5rLCB0cnlpbmcgbWVkaWEgJXMsIHN0YXR1cyAleFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbWVkaWFfbmFtZVtkZS0+bWVkaWFfdHlwZV0sIHN0YXR1cyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVfb2tfdG9fYWR2ZXJ0aXNlIChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUsIHUzMiBuZXdfbWVkaWEpCit7CisJc3dpdGNoIChuZXdfbWVkaWEpIHsKKwljYXNlIERFX01FRElBX1RQX0FVVE86CisJCWlmICghKGRlLT5tZWRpYV9hZHZlcnRpc2UgJiBBRFZFUlRJU0VEX0F1dG9uZWcpKQorCQkJcmV0dXJuIDA7CisJCWlmICghKGRlLT5tZWRpYV9hZHZlcnRpc2UgJiAoQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkpKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgREVfTUVESUFfQk5DOgorCQlpZiAoIShkZS0+bWVkaWFfYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF9CTkMpKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgREVfTUVESUFfQVVJOgorCQlpZiAoIShkZS0+bWVkaWFfYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF9BVUkpKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgREVfTUVESUFfVFA6CisJCWlmICghKGRlLT5tZWRpYV9hZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSBERV9NRURJQV9UUF9GRDoKKwkJaWYgKCEoZGUtPm1lZGlhX2FkdmVydGlzZSAmIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsKSkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwl9CisJCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGRlMjEwNDFfbWVkaWFfdGltZXIgKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSAoc3RydWN0IGRlX3ByaXZhdGUgKikgZGF0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGUtPmRldjsKKwl1MzIgc3RhdHVzID0gZHIzMihTSUFTdGF0dXMpOworCXVuc2lnbmVkIGludCBjYXJyaWVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJY2FycmllciA9IChzdGF0dXMgJiBOZXRDeG5FcnIpID8gMCA6IDE7CisJCQorCWlmIChjYXJyaWVyKSB7CisJCWlmICgoZGUtPm1lZGlhX3R5cGUgPT0gREVfTUVESUFfVFBfQVVUTyB8fAorCQkgICAgIGRlLT5tZWRpYV90eXBlID09IERFX01FRElBX1RQIHx8CisJCSAgICAgZGUtPm1lZGlhX3R5cGUgPT0gREVfTUVESUFfVFBfRkQpICYmCisJCSAgICAoc3RhdHVzICYgTGlua0ZhaWxTdGF0dXMpKQorCQkJZ290byBub19saW5rX3lldDsKKworCQlkZS0+bWVkaWFfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBERV9USU1FUl9MSU5LOworCQlhZGRfdGltZXIoJmRlLT5tZWRpYV90aW1lcik7CisJCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKQorCQkJZGVfbGlua191cChkZSk7CisJCWVsc2UKKwkJCWlmIChuZXRpZl9tc2dfdGltZXIoZGUpKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBsaW5rIG9rLCBtb2RlICV4IHN0YXR1cyAleFxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBtZWRpYV9uYW1lW2RlLT5tZWRpYV90eXBlXSwKKwkJCQkgICAgICAgZHIzMihNYWNNb2RlKSwgc3RhdHVzKTsKKwkJcmV0dXJuOworCX0KKworCWRlX2xpbmtfZG93bihkZSk7CQorCisJLyogaWYgbWVkaWEgdHlwZSBsb2NrZWQsIGRvbid0IHN3aXRjaCBtZWRpYSAqLworCWlmIChkZS0+bWVkaWFfbG9jaykKKwkJZ290byBzZXRfbWVkaWE7CisKKwkvKiBpZiBhY3Rpdml0eSBkZXRlY3RlZCwgdXNlIHRoYXQgYXMgaGludCBmb3IgbmV3IG1lZGlhIHR5cGUgKi8KKwlpZiAoc3RhdHVzICYgTm9uc2VsUG9ydEFjdGl2ZSkgeworCQl1bnNpZ25lZCBpbnQgaGF2ZV9tZWRpYSA9IDE7CisKKwkJLyogaWYgQVVJL0JOQyBzZWxlY3RlZCwgdGhlbiBhY3Rpdml0eSBpcyBvbiBUUCBwb3J0ICovCisJCWlmIChkZS0+bWVkaWFfdHlwZSA9PSBERV9NRURJQV9BVUkgfHwKKwkJICAgIGRlLT5tZWRpYV90eXBlID09IERFX01FRElBX0JOQykgeworCQkJaWYgKGRlX29rX3RvX2FkdmVydGlzZShkZSwgREVfTUVESUFfVFBfQVVUTykpCisJCQkJZGUtPm1lZGlhX3R5cGUgPSBERV9NRURJQV9UUF9BVVRPOworCQkJZWxzZQorCQkJCWhhdmVfbWVkaWEgPSAwOworCQl9CisKKwkJLyogVFAgc2VsZWN0ZWQuICBJZiB0aGVyZSBpcyBvbmx5IFRQIGFuZCBCTkMsIHRoZW4gaXQncyBCTkMgKi8KKwkJZWxzZSBpZiAoKChkZS0+bWVkaWFfc3VwcG9ydGVkICYgREVfQVVJX0JOQykgPT0gU1VQUE9SVEVEX0JOQykgJiYKKwkJCSBkZV9va190b19hZHZlcnRpc2UoZGUsIERFX01FRElBX0JOQykpCisJCQlkZS0+bWVkaWFfdHlwZSA9IERFX01FRElBX0JOQzsKKworCQkvKiBUUCBzZWxlY3RlZC4gIElmIHRoZXJlIGlzIG9ubHkgVFAgYW5kIEFVSSwgdGhlbiBpdCdzIEFVSSAqLworCQllbHNlIGlmICgoKGRlLT5tZWRpYV9zdXBwb3J0ZWQgJiBERV9BVUlfQk5DKSA9PSBTVVBQT1JURURfQVVJKSAmJgorCQkJIGRlX29rX3RvX2FkdmVydGlzZShkZSwgREVfTUVESUFfQVVJKSkKKwkJCWRlLT5tZWRpYV90eXBlID0gREVfTUVESUFfQVVJOworCisJCS8qIG90aGVyd2lzZSwgaWdub3JlIHRoZSBoaW50ICovCisJCWVsc2UKKwkJCWhhdmVfbWVkaWEgPSAwOworCisJCWlmIChoYXZlX21lZGlhKQorCQkJZ290byBzZXRfbWVkaWE7CisJfQorCisJLyoKKwkgKiBBYnNlbnQgb3IgYW1iaWd1b3VzIGFjdGl2aXR5IGhpbnQsIG1vdmUgdG8gbmV4dCBhZHZlcnRpc2VkCisJICogbWVkaWEgc3RhdGUuICBJZiBkZS0+bWVkaWFfdHlwZSBpcyBsZWZ0IHVuY2hhbmdlZCwgdGhpcworCSAqIHNpbXBseSByZXNldHMgdGhlIFBIWSBhbmQgcmVsb2FkcyB0aGUgY3VycmVudCBtZWRpYSBzZXR0aW5ncy4KKwkgKi8KKwlpZiAoZGUtPm1lZGlhX3R5cGUgPT0gREVfTUVESUFfQVVJKSB7CisJCXUzMiBuZXh0X3N0YXRlc1tdID0geyBERV9NRURJQV9CTkMsIERFX01FRElBX1RQX0FVVE8gfTsKKwkJZGVfbmV4dF9tZWRpYShkZSwgbmV4dF9zdGF0ZXMsIEFSUkFZX1NJWkUobmV4dF9zdGF0ZXMpKTsKKwl9IGVsc2UgaWYgKGRlLT5tZWRpYV90eXBlID09IERFX01FRElBX0JOQykgeworCQl1MzIgbmV4dF9zdGF0ZXNbXSA9IHsgREVfTUVESUFfVFBfQVVUTywgREVfTUVESUFfQVVJIH07CisJCWRlX25leHRfbWVkaWEoZGUsIG5leHRfc3RhdGVzLCBBUlJBWV9TSVpFKG5leHRfc3RhdGVzKSk7CisJfSBlbHNlIHsKKwkJdTMyIG5leHRfc3RhdGVzW10gPSB7IERFX01FRElBX0FVSSwgREVfTUVESUFfQk5DLCBERV9NRURJQV9UUF9BVVRPIH07CisJCWRlX25leHRfbWVkaWEoZGUsIG5leHRfc3RhdGVzLCBBUlJBWV9TSVpFKG5leHRfc3RhdGVzKSk7CisJfQorCQorc2V0X21lZGlhOgorCXNwaW5fbG9ja19pcnFzYXZlKCZkZS0+bG9jaywgZmxhZ3MpOworCWRlX3N0b3Bfcnh0eChkZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGUtPmxvY2ssIGZsYWdzKTsKKwlkZV9zZXRfbWVkaWEoZGUpOworCWRlX3N0YXJ0X3J4dHgoZGUpOworCitub19saW5rX3lldDoKKwlkZS0+bWVkaWFfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBERV9USU1FUl9OT19MSU5LOworCWFkZF90aW1lcigmZGUtPm1lZGlhX3RpbWVyKTsKKworCWlmIChuZXRpZl9tc2dfdGltZXIoZGUpKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogbm8gbGluaywgdHJ5aW5nIG1lZGlhICVzLCBzdGF0dXMgJXhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIG1lZGlhX25hbWVbZGUtPm1lZGlhX3R5cGVdLCBzdGF0dXMpOworfQorCitzdGF0aWMgdm9pZCBkZV9tZWRpYV9pbnRlcnJ1cHQgKHN0cnVjdCBkZV9wcml2YXRlICpkZSwgdTMyIHN0YXR1cykKK3sKKwlpZiAoc3RhdHVzICYgTGlua1Bhc3MpIHsKKwkJZGVfbGlua191cChkZSk7CisJCW1vZF90aW1lcigmZGUtPm1lZGlhX3RpbWVyLCBqaWZmaWVzICsgREVfVElNRVJfTElOSyk7CisJCXJldHVybjsKKwl9CisJCisJaWYgKCEoc3RhdHVzICYgTGlua0ZhaWwpKQorCQlCVUcoKTsKKworCWlmIChuZXRpZl9jYXJyaWVyX29rKGRlLT5kZXYpKSB7CisJCWRlX2xpbmtfZG93bihkZSk7CisJCW1vZF90aW1lcigmZGUtPm1lZGlhX3RpbWVyLCBqaWZmaWVzICsgREVfVElNRVJfTk9fTElOSyk7CisJfQorfQorCitzdGF0aWMgaW50IGRlX3Jlc2V0X21hYyAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCXUzMiBzdGF0dXMsIHRtcDsKKworCS8qCisJICogUmVzZXQgTUFDLiAgZGU0eDUuYyBhbmQgdHVsaXAuYyBleGFtaW5lZCBmb3IgImFkdmljZSIKKwkgKiBpbiB0aGlzIGFyZWEuCisJICovCisKKwlpZiAoZHIzMihCdXNNb2RlKSA9PSAweGZmZmZmZmZmKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogUmVzZXQgdGhlIGNoaXAsIGhvbGRpbmcgYml0IDAgc2V0IGF0IGxlYXN0IDUwIFBDSSBjeWNsZXMuICovCisJZHczMiAoQnVzTW9kZSwgQ21kUmVzZXQpOworCW1kZWxheSAoMSk7CisKKwlkdzMyIChCdXNNb2RlLCBkZV9idXNfbW9kZSk7CisJbWRlbGF5ICgxKTsKKworCWZvciAodG1wID0gMDsgdG1wIDwgNTsgdG1wKyspIHsKKwkJZHIzMiAoQnVzTW9kZSk7CisJCW1kZWxheSAoMSk7CisJfQorCisJbWRlbGF5ICgxKTsKKworCXN0YXR1cyA9IGRyMzIoTWFjU3RhdHVzKTsKKwlpZiAoc3RhdHVzICYgKFJ4U3RhdGUgfCBUeFN0YXRlKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlpZiAoc3RhdHVzID09IDB4ZmZmZmZmZmYpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZV9hZGFwdGVyX3dha2UgKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwl1MzIgcG1jdGw7CisKKwlpZiAoZGUtPmRlMjEwNDApCisJCXJldHVybjsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZS0+cGRldiwgUENJUE0sICZwbWN0bCk7CisJaWYgKHBtY3RsICYgUE1fTWFzaykgeworCQlwbWN0bCAmPSB+UE1fTWFzazsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZS0+cGRldiwgUENJUE0sIHBtY3RsKTsKKworCQkvKiBkZTR4NS5jIGRlbGF5cywgc28gd2UgZG8gdG9vICovCisJCW1zbGVlcCgxMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkZV9hZGFwdGVyX3NsZWVwIChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUpCit7CisJdTMyIHBtY3RsOworCisJaWYgKGRlLT5kZTIxMDQwKQorCQlyZXR1cm47CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGUtPnBkZXYsIFBDSVBNLCAmcG1jdGwpOworCXBtY3RsIHw9IFBNX1NsZWVwOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGUtPnBkZXYsIFBDSVBNLCBwbWN0bCk7Cit9CisKK3N0YXRpYyBpbnQgZGVfaW5pdF9odyAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZS0+ZGV2OworCXUzMiBtYWNtb2RlOworCWludCByYzsKKworCWRlX2FkYXB0ZXJfd2FrZShkZSk7CisJCisJbWFjbW9kZSA9IGRyMzIoTWFjTW9kZSkgJiB+TWFjTW9kZUNsZWFyOworCisJcmMgPSBkZV9yZXNldF9tYWMoZGUpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJZGVfc2V0X21lZGlhKGRlKTsgLyogcmVzZXQgcGh5ICovCisKKwlkdzMyKFJ4UmluZ0FkZHIsIGRlLT5yaW5nX2RtYSk7CisJZHczMihUeFJpbmdBZGRyLCBkZS0+cmluZ19kbWEgKyAoc2l6ZW9mKHN0cnVjdCBkZV9kZXNjKSAqIERFX1JYX1JJTkdfU0laRSkpOworCisJZHczMihNYWNNb2RlLCBSeFR4IHwgbWFjbW9kZSk7CisKKwlkcjMyKFJ4TWlzc2VkKTsgLyogc2VsZi1jbGVhcmluZyAqLworCisJZHczMihJbnRyTWFzaywgZGVfaW50cl9tYXNrKTsKKworCWRlX3NldF9yeF9tb2RlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZV9yZWZpbGxfcnggKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IERFX1JYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihkZS0+cnhfYnVmX3N6KTsKKwkJaWYgKCFza2IpCisJCQlnb3RvIGVycl9vdXQ7CisKKwkJc2tiLT5kZXYgPSBkZS0+ZGV2OworCisJCWRlLT5yeF9za2JbaV0ubWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKGRlLT5wZGV2LAorCQkJc2tiLT50YWlsLCBkZS0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlkZS0+cnhfc2tiW2ldLnNrYiA9IHNrYjsKKworCQlkZS0+cnhfcmluZ1tpXS5vcHRzMSA9IGNwdV90b19sZTMyKERlc2NPd24pOworCQlpZiAoaSA9PSAoREVfUlhfUklOR19TSVpFIC0gMSkpCisJCQlkZS0+cnhfcmluZ1tpXS5vcHRzMiA9CisJCQkJY3B1X3RvX2xlMzIoUmluZ0VuZCB8IGRlLT5yeF9idWZfc3opOworCQllbHNlCisJCQlkZS0+cnhfcmluZ1tpXS5vcHRzMiA9IGNwdV90b19sZTMyKGRlLT5yeF9idWZfc3opOworCQlkZS0+cnhfcmluZ1tpXS5hZGRyMSA9IGNwdV90b19sZTMyKGRlLT5yeF9za2JbaV0ubWFwcGluZyk7CisJCWRlLT5yeF9yaW5nW2ldLmFkZHIyID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX291dDoKKwlkZV9jbGVhbl9yaW5ncyhkZSk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBpbnQgZGVfaW5pdF9yaW5ncyAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCW1lbXNldChkZS0+dHhfcmluZywgMCwgc2l6ZW9mKHN0cnVjdCBkZV9kZXNjKSAqIERFX1RYX1JJTkdfU0laRSk7CisJZGUtPnR4X3JpbmdbREVfVFhfUklOR19TSVpFIC0gMV0ub3B0czIgPSBjcHVfdG9fbGUzMihSaW5nRW5kKTsKKworCWRlLT5yeF90YWlsID0gMDsKKwlkZS0+dHhfaGVhZCA9IGRlLT50eF90YWlsID0gMDsKKworCXJldHVybiBkZV9yZWZpbGxfcnggKGRlKTsKK30KKworc3RhdGljIGludCBkZV9hbGxvY19yaW5ncyAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCWRlLT5yeF9yaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGUtPnBkZXYsIERFX1JJTkdfQllURVMsICZkZS0+cmluZ19kbWEpOworCWlmICghZGUtPnJ4X3JpbmcpCisJCXJldHVybiAtRU5PTUVNOworCWRlLT50eF9yaW5nID0gJmRlLT5yeF9yaW5nW0RFX1JYX1JJTkdfU0laRV07CisJcmV0dXJuIGRlX2luaXRfcmluZ3MoZGUpOworfQorCitzdGF0aWMgdm9pZCBkZV9jbGVhbl9yaW5ncyAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCXVuc2lnbmVkIGk7CisKKwltZW1zZXQoZGUtPnJ4X3JpbmcsIDAsIHNpemVvZihzdHJ1Y3QgZGVfZGVzYykgKiBERV9SWF9SSU5HX1NJWkUpOworCWRlLT5yeF9yaW5nW0RFX1JYX1JJTkdfU0laRSAtIDFdLm9wdHMyID0gY3B1X3RvX2xlMzIoUmluZ0VuZCk7CisJd21iKCk7CisJbWVtc2V0KGRlLT50eF9yaW5nLCAwLCBzaXplb2Yoc3RydWN0IGRlX2Rlc2MpICogREVfVFhfUklOR19TSVpFKTsKKwlkZS0+dHhfcmluZ1tERV9UWF9SSU5HX1NJWkUgLSAxXS5vcHRzMiA9IGNwdV90b19sZTMyKFJpbmdFbmQpOworCXdtYigpOworCisJZm9yIChpID0gMDsgaSA8IERFX1JYX1JJTkdfU0laRTsgaSsrKSB7CisJCWlmIChkZS0+cnhfc2tiW2ldLnNrYikgeworCQkJcGNpX3VubWFwX3NpbmdsZShkZS0+cGRldiwgZGUtPnJ4X3NrYltpXS5tYXBwaW5nLAorCQkJCQkgZGUtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IoZGUtPnJ4X3NrYltpXS5za2IpOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IERFX1RYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZS0+dHhfc2tiW2ldLnNrYjsKKwkJaWYgKChza2IpICYmIChza2IgIT0gREVfRFVNTVlfU0tCKSkgeworCQkJaWYgKHNrYiAhPSBERV9TRVRVUF9TS0IpIHsKKwkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQkJZGUtPm5ldF9zdGF0cy50eF9kcm9wcGVkKys7CisJCQkJcGNpX3VubWFwX3NpbmdsZShkZS0+cGRldiwKKwkJCQkJZGUtPnR4X3NrYltpXS5tYXBwaW5nLAorCQkJCQlza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQl9IGVsc2UgeworCQkJCXBjaV91bm1hcF9zaW5nbGUoZGUtPnBkZXYsCisJCQkJCWRlLT50eF9za2JbaV0ubWFwcGluZywKKwkJCQkJc2l6ZW9mKGRlLT5zZXR1cF9mcmFtZSksCisJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQkJfQorCQl9CisJfQorCisJbWVtc2V0KCZkZS0+cnhfc2tiLCAwLCBzaXplb2Yoc3RydWN0IHJpbmdfaW5mbykgKiBERV9SWF9SSU5HX1NJWkUpOworCW1lbXNldCgmZGUtPnR4X3NrYiwgMCwgc2l6ZW9mKHN0cnVjdCByaW5nX2luZm8pICogREVfVFhfUklOR19TSVpFKTsKK30KKworc3RhdGljIHZvaWQgZGVfZnJlZV9yaW5ncyAoc3RydWN0IGRlX3ByaXZhdGUgKmRlKQoreworCWRlX2NsZWFuX3JpbmdzKGRlKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGRlLT5wZGV2LCBERV9SSU5HX0JZVEVTLCBkZS0+cnhfcmluZywgZGUtPnJpbmdfZG1hKTsKKwlkZS0+cnhfcmluZyA9IE5VTEw7CisJZGUtPnR4X3JpbmcgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGRlX29wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlID0gZGV2LT5wcml2OworCWludCByYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG5ldGlmX21zZ19pZnVwKGRlKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlbmFibGluZyBpbnRlcmZhY2VcbiIsIGRldi0+bmFtZSk7CisKKwlkZS0+cnhfYnVmX3N6ID0gKGRldi0+bXR1IDw9IDE1MDAgPyBQS1RfQlVGX1NaIDogZGV2LT5tdHUgKyAzMik7CisKKwlyYyA9IGRlX2FsbG9jX3JpbmdzKGRlKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcmluZyBhbGxvY2F0aW9uIGZhaWx1cmUsIGVycj0lZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBkZV9pbml0X2h3KGRlKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaC93IGluaXQgZmFpbHVyZSwgZXJyPSVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCByYyk7CisJCWdvdG8gZXJyX291dF9mcmVlOworCX0KKworCXJjID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGRlX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSVJRICVkIHJlcXVlc3QgZmFpbHVyZSwgZXJyPSVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBkZXYtPmlycSwgcmMpOworCQlnb3RvIGVycl9vdXRfaHc7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwltb2RfdGltZXIoJmRlLT5tZWRpYV90aW1lciwgamlmZmllcyArIERFX1RJTUVSX05PX0xJTkspOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfaHc6CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlLT5sb2NrLCBmbGFncyk7CisJZGVfc3RvcF9odyhkZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGUtPmxvY2ssIGZsYWdzKTsKKworZXJyX291dF9mcmVlOgorCWRlX2ZyZWVfcmluZ3MoZGUpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBkZV9jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChuZXRpZl9tc2dfaWZkb3duKGRlKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkaXNhYmxpbmcgaW50ZXJmYWNlXG4iLCBkZXYtPm5hbWUpOworCisJZGVsX3RpbWVyX3N5bmMoJmRlLT5tZWRpYV90aW1lcik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGUtPmxvY2ssIGZsYWdzKTsKKwlkZV9zdG9wX2h3KGRlKTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZS0+bG9jaywgZmxhZ3MpOworCQorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJZGVfZnJlZV9yaW5ncyhkZSk7CisJZGVfYWRhcHRlcl9zbGVlcChkZSk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKGRlLT5wZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVfdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE5JQyBzdGF0dXMgJTA4eCBtb2RlICUwOHggc2lhICUwOHggZGVzYyAldS8ldS8ldVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBkcjMyKE1hY1N0YXR1cyksIGRyMzIoTWFjTW9kZSksIGRyMzIoU0lBU3RhdHVzKSwKKwkgICAgICAgZGUtPnJ4X3RhaWwsIGRlLT50eF9oZWFkLCBkZS0+dHhfdGFpbCk7CisKKwlkZWxfdGltZXJfc3luYygmZGUtPm1lZGlhX3RpbWVyKTsKKworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlzcGluX2xvY2tfaXJxKCZkZS0+bG9jayk7CisKKwlkZV9zdG9wX2h3KGRlKTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworCXNwaW5fdW5sb2NrX2lycSgmZGUtPmxvY2spOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCQkKKwkvKiBVcGRhdGUgdGhlIGVycm9yIGNvdW50cy4gKi8KKwlfX2RlX2dldF9zdGF0cyhkZSk7CisKKwlzeW5jaHJvbml6ZV9pcnEoZGV2LT5pcnEpOworCWRlX2NsZWFuX3JpbmdzKGRlKTsKKworCWRlX2luaXRfaHcoZGUpOworCQorCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIHZvaWQgX19kZV9nZXRfcmVncyhzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUsIHU4ICpidWYpCit7CisJaW50IGk7CisJdTMyICpyYnVmID0gKHUzMiAqKWJ1ZjsKKwkKKwkvKiByZWFkIGFsbCBDU1JzICovCisJZm9yIChpID0gMDsgaSA8IERFX05VTV9SRUdTOyBpKyspCisJCXJidWZbaV0gPSBkcjMyKGkgKiA4KTsKKworCS8qIGhhbmRsZSBzZWxmLWNsZWFyaW5nIFJ4TWlzc2VkIGNvdW50ZXIsIENTUjggKi8KKwlkZV9yeF9taXNzZWQoZGUsIHJidWZbOF0pOworfQorCitzdGF0aWMgaW50IF9fZGVfZ2V0X3NldHRpbmdzKHN0cnVjdCBkZV9wcml2YXRlICpkZSwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCWVjbWQtPnN1cHBvcnRlZCA9IGRlLT5tZWRpYV9zdXBwb3J0ZWQ7CisJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCWVjbWQtPnBoeV9hZGRyZXNzID0gMDsKKwllY21kLT5hZHZlcnRpc2luZyA9IGRlLT5tZWRpYV9hZHZlcnRpc2U7CisJCisJc3dpdGNoIChkZS0+bWVkaWFfdHlwZSkgeworCWNhc2UgREVfTUVESUFfQVVJOgorCQllY21kLT5wb3J0ID0gUE9SVF9BVUk7CisJCWVjbWQtPnNwZWVkID0gNTsKKwkJYnJlYWs7CisJY2FzZSBERV9NRURJQV9CTkM6CisJCWVjbWQtPnBvcnQgPSBQT1JUX0JOQzsKKwkJZWNtZC0+c3BlZWQgPSAyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllY21kLT5wb3J0ID0gUE9SVF9UUDsKKwkJZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDsKKwkJYnJlYWs7CisJfQorCQorCWlmIChkcjMyKE1hY01vZGUpICYgRnVsbER1cGxleCkKKwkJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJZWxzZQorCQllY21kLT5kdXBsZXggPSBEVVBMRVhfSEFMRjsKKworCWlmIChkZS0+bWVkaWFfbG9jaykKKwkJZWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKKwllbHNlCisJCWVjbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKKworCS8qIGlnbm9yZSBtYXh0eHBrdCwgbWF4cnhwa3QgZm9yIG5vdyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZV9zZXRfc2V0dGluZ3Moc3RydWN0IGRlX3ByaXZhdGUgKmRlLCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJdTMyIG5ld19tZWRpYTsKKwl1bnNpZ25lZCBpbnQgbWVkaWFfbG9jazsKKworCWlmIChlY21kLT5zcGVlZCAhPSBTUEVFRF8xMCAmJiBlY21kLT5zcGVlZCAhPSA1ICYmIGVjbWQtPnNwZWVkICE9IDIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChkZS0+ZGUyMTA0MCAmJiBlY21kLT5zcGVlZCA9PSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZWNtZC0+ZHVwbGV4ICE9IERVUExFWF9IQUxGICYmIGVjbWQtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGVjbWQtPnBvcnQgIT0gUE9SVF9UUCAmJiBlY21kLT5wb3J0ICE9IFBPUlRfQVVJICYmIGVjbWQtPnBvcnQgIT0gUE9SVF9CTkMpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChkZS0+ZGUyMTA0MCAmJiBlY21kLT5wb3J0ID09IFBPUlRfQk5DKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZWNtZC0+dHJhbnNjZWl2ZXIgIT0gWENWUl9JTlRFUk5BTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGVjbWQtPmF1dG9uZWcgIT0gQVVUT05FR19ESVNBQkxFICYmIGVjbWQtPmF1dG9uZWcgIT0gQVVUT05FR19FTkFCTEUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlY21kLT5hZHZlcnRpc2luZyAmIH5kZS0+bWVkaWFfc3VwcG9ydGVkKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZWNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSAmJgorCSAgICAoIShlY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfQXV0b25lZykpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkKKwlzd2l0Y2ggKGVjbWQtPnBvcnQpIHsKKwljYXNlIFBPUlRfQVVJOgorCQluZXdfbWVkaWEgPSBERV9NRURJQV9BVUk7CisJCWlmICghKGVjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF9BVUkpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgUE9SVF9CTkM6CisJCW5ld19tZWRpYSA9IERFX01FRElBX0JOQzsKKwkJaWYgKCEoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEX0JOQykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKGVjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpCisJCQluZXdfbWVkaWEgPSBERV9NRURJQV9UUF9BVVRPOworCQllbHNlIGlmIChlY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQluZXdfbWVkaWEgPSBERV9NRURJQV9UUF9GRDsKKwkJZWxzZQorCQkJbmV3X21lZGlhID0gREVfTUVESUFfVFA7CisJCWlmICghKGVjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF9UUCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCEoZWNtZC0+YWR2ZXJ0aXNpbmcgJiAoQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfCBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwkKKwltZWRpYV9sb2NrID0gKGVjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpID8gMCA6IDE7CisJCisJaWYgKChuZXdfbWVkaWEgPT0gZGUtPm1lZGlhX3R5cGUpICYmCisJICAgIChtZWRpYV9sb2NrID09IGRlLT5tZWRpYV9sb2NrKSAmJgorCSAgICAoZWNtZC0+YWR2ZXJ0aXNpbmcgPT0gZGUtPm1lZGlhX2FkdmVydGlzZSkpCisJCXJldHVybiAwOyAvKiBub3RoaW5nIHRvIGNoYW5nZSAqLworCSAgICAKKwlkZV9saW5rX2Rvd24oZGUpOworCWRlX3N0b3Bfcnh0eChkZSk7CisJCisJZGUtPm1lZGlhX3R5cGUgPSBuZXdfbWVkaWE7CisJZGUtPm1lZGlhX2xvY2sgPSBtZWRpYV9sb2NrOworCWRlLT5tZWRpYV9hZHZlcnRpc2UgPSBlY21kLT5hZHZlcnRpc2luZzsKKwlkZV9zZXRfbWVkaWEoZGUpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZV9nZXRfZHJ2aW5mbyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldixzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IGRldi0+cHJpdjsKKworCXN0cmNweSAoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5IChpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RyY3B5IChpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoZGUtPnBkZXYpKTsKKwlpbmZvLT5lZWR1bXBfbGVuID0gREVfRUVQUk9NX1NJWkU7Cit9CisKK3N0YXRpYyBpbnQgZGVfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIERFX1JFR1NfU0laRTsKK30KKworc3RhdGljIGludCBkZV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IGRldi0+cHJpdjsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2tfaXJxKCZkZS0+bG9jayk7CisJcmMgPSBfX2RlX2dldF9zZXR0aW5ncyhkZSwgZWNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZS0+bG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZGVfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmZGUtPmxvY2spOworCXJjID0gX19kZV9zZXRfc2V0dGluZ3MoZGUsIGVjbWQpOworCXNwaW5fdW5sb2NrX2lycSgmZGUtPmxvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdTMyIGRlX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IGRldi0+cHJpdjsKKworCXJldHVybiBkZS0+bXNnX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQgZGVfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBtc2dsdmwpCit7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlID0gZGV2LT5wcml2OworCisJZGUtPm1zZ19lbmFibGUgPSBtc2dsdmw7Cit9CisKK3N0YXRpYyBpbnQgZGVfZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisKKwlpZiAoIWRlLT5lZV9kYXRhKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKChlZXByb20tPm9mZnNldCAhPSAwKSB8fCAoZWVwcm9tLT5tYWdpYyAhPSAwKSB8fAorCSAgICAoZWVwcm9tLT5sZW4gIT0gREVfRUVQUk9NX1NJWkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltZW1jcHkoZGF0YSwgZGUtPmVlX2RhdGEsIGVlcHJvbS0+bGVuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlX253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisJdTMyIHN0YXR1czsKKworCWlmIChkZS0+bWVkaWFfdHlwZSAhPSBERV9NRURJQV9UUF9BVVRPKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobmV0aWZfY2Fycmllcl9vayhkZS0+ZGV2KSkKKwkJZGVfbGlua19kb3duKGRlKTsKKworCXN0YXR1cyA9IGRyMzIoU0lBU3RhdHVzKTsKKwlkdzMyKFNJQVN0YXR1cywgKHN0YXR1cyAmIH5OV2F5U3RhdGUpIHwgTldheVJlc3RhcnQpOworCWlmIChuZXRpZl9tc2dfbGluayhkZSkpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIG53YXkgcmVzdGFydCwgc3RhdHVzICV4LCV4XG4iLAorCQkgICAgICAgZGUtPmRldi0+bmFtZSwgc3RhdHVzLCBkcjMyKFNJQVN0YXR1cykpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZV9nZXRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLAorCQkJdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisKKwlyZWdzLT52ZXJzaW9uID0gKERFX1JFR1NfVkVSIDw8IDIpIHwgZGUtPmRlMjEwNDA7CisKKwlzcGluX2xvY2tfaXJxKCZkZS0+bG9jayk7CisJX19kZV9nZXRfcmVncyhkZSwgZGF0YSk7CisJc3Bpbl91bmxvY2tfaXJxKCZkZS0+bG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZGVfZXRodG9vbF9vcHMgPSB7CisJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF90eF9jc3VtCQk9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCisJLmdldF9zZwkJCT0gZXRodG9vbF9vcF9nZXRfc2csCisJLmdldF9kcnZpbmZvCQk9IGRlX2dldF9kcnZpbmZvLAorCS5nZXRfcmVnc19sZW4JCT0gZGVfZ2V0X3JlZ3NfbGVuLAorCS5nZXRfc2V0dGluZ3MJCT0gZGVfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gZGVfc2V0X3NldHRpbmdzLAorCS5nZXRfbXNnbGV2ZWwJCT0gZGVfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gZGVfc2V0X21zZ2xldmVsLAorCS5nZXRfZWVwcm9tCQk9IGRlX2dldF9lZXByb20sCisJLm53YXlfcmVzZXQJCT0gZGVfbndheV9yZXNldCwKKwkuZ2V0X3JlZ3MJCT0gZGVfZ2V0X3JlZ3MsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZGUyMTA0MF9nZXRfbWFjX2FkZHJlc3MgKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwl1bnNpZ25lZCBpOworCisJZHczMiAoUk9NQ21kLCAwKTsJLyogUmVzZXQgdGhlIHBvaW50ZXIgd2l0aCBhIGR1bW15IHdyaXRlLiAqLworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlpbnQgdmFsdWUsIGJvZ3VzY250ID0gMTAwMDAwOworCQlkbworCQkJdmFsdWUgPSBkcjMyKFJPTUNtZCk7CisJCXdoaWxlICh2YWx1ZSA8IDAgJiYgLS1ib2d1c2NudCA+IDApOworCQlkZS0+ZGV2LT5kZXZfYWRkcltpXSA9IHZhbHVlOworCQl1ZGVsYXkoMSk7CisJCWlmIChib2d1c2NudCA8PSAwKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggInRpbWVvdXQgcmVhZGluZyAyMTA0MCBNQUMgYWRkcmVzcyBieXRlICV1XG4iLCBpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBkZTIxMDQwX2dldF9tZWRpYV9pbmZvKHN0cnVjdCBkZV9wcml2YXRlICpkZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWRlLT5tZWRpYV90eXBlID0gREVfTUVESUFfVFA7CisJZGUtPm1lZGlhX3N1cHBvcnRlZCB8PSBTVVBQT1JURURfVFAgfCBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKKwkJCSAgICAgICBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEX0FVSTsKKwlkZS0+bWVkaWFfYWR2ZXJ0aXNlID0gZGUtPm1lZGlhX3N1cHBvcnRlZDsKKworCWZvciAoaSA9IDA7IGkgPCBERV9NQVhfTUVESUE7IGkrKykgeworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSBERV9NRURJQV9BVUk6CisJCWNhc2UgREVfTUVESUFfVFA6CisJCWNhc2UgREVfTUVESUFfVFBfRkQ6CisJCQlkZS0+bWVkaWFbaV0udHlwZSA9IGk7CisJCQlkZS0+bWVkaWFbaV0uY3NyMTMgPSB0MjEwNDBfY3NyMTNbaV07CisJCQlkZS0+bWVkaWFbaV0uY3NyMTQgPSB0MjEwNDBfY3NyMTRbaV07CisJCQlkZS0+bWVkaWFbaV0uY3NyMTUgPSB0MjEwNDBfY3NyMTVbaV07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRlLT5tZWRpYVtpXS50eXBlID0gREVfTUVESUFfSU5WQUxJRDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKiBOb3RlOiB0aGlzIHJvdXRpbmUgcmV0dXJucyBleHRyYSBkYXRhIGJpdHMgZm9yIHNpemUgZGV0ZWN0aW9uLiAqLworc3RhdGljIHVuc2lnbmVkIF9faW5pdCB0dWxpcF9yZWFkX2VlcHJvbSh2b2lkIF9faW9tZW0gKnJlZ3MsIGludCBsb2NhdGlvbiwgaW50IGFkZHJfbGVuKQoreworCWludCBpOworCXVuc2lnbmVkIHJldHZhbCA9IDA7CisJdm9pZCBfX2lvbWVtICplZV9hZGRyID0gcmVncyArIFJPTUNtZDsKKwlpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IChFRV9SRUFEX0NNRCA8PCBhZGRyX2xlbik7CisKKwl3cml0ZWwoRUVfRU5CICYgfkVFX0NTLCBlZV9hZGRyKTsKKwl3cml0ZWwoRUVfRU5CLCBlZV9hZGRyKTsKKworCS8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gNCArIGFkZHJfbGVuOyBpID49IDA7IGktLSkgeworCQlzaG9ydCBkYXRhdmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gRUVfREFUQV9XUklURSA6IDA7CisJCXdyaXRlbChFRV9FTkIgfCBkYXRhdmFsLCBlZV9hZGRyKTsKKwkJcmVhZGwoZWVfYWRkcik7CisJCXdyaXRlbChFRV9FTkIgfCBkYXRhdmFsIHwgRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsKKwkJcmVhZGwoZWVfYWRkcik7CisJCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKHJlYWRsKGVlX2FkZHIpICYgRUVfREFUQV9SRUFEKSA/IDEgOiAwKTsKKwl9CisJd3JpdGVsKEVFX0VOQiwgZWVfYWRkcik7CisJcmVhZGwoZWVfYWRkcik7CisKKwlmb3IgKGkgPSAxNjsgaSA+IDA7IGktLSkgeworCQl3cml0ZWwoRUVfRU5CIHwgRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsKKwkJcmVhZGwoZWVfYWRkcik7CisJCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKHJlYWRsKGVlX2FkZHIpICYgRUVfREFUQV9SRUFEKSA/IDEgOiAwKTsKKwkJd3JpdGVsKEVFX0VOQiwgZWVfYWRkcik7CisJCXJlYWRsKGVlX2FkZHIpOworCX0KKworCS8qIFRlcm1pbmF0ZSB0aGUgRUVQUk9NIGFjY2Vzcy4gKi8KKwl3cml0ZWwoRUVfRU5CICYgfkVFX0NTLCBlZV9hZGRyKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZGUyMTA0MV9nZXRfc3JvbV9pbmZvIChzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUpCit7CisJdW5zaWduZWQgaSwgc2Ffb2Zmc2V0ID0gMCwgb2ZzOworCXU4IGVlX2RhdGFbREVfRUVQUk9NX1NJWkUgKyA2XSA9IHt9OworCXVuc2lnbmVkIGVlX2FkZHJfc2l6ZSA9IHR1bGlwX3JlYWRfZWVwcm9tKGRlLT5yZWdzLCAweGZmLCA4KSAmIDB4NDAwMDAgPyA4IDogNjsKKwlzdHJ1Y3QgZGVfc3JvbV9pbmZvX2xlYWYgKmlsOworCXZvaWQgKmJ1ZnA7CisKKwkvKiBkb3dubG9hZCBlbnRpcmUgZWVwcm9tICovCisJZm9yIChpID0gMDsgaSA8IERFX0VFUFJPTV9XT1JEUzsgaSsrKQorCQkoKHUxNiAqKWVlX2RhdGEpW2ldID0KKwkJCWxlMTZfdG9fY3B1KHR1bGlwX3JlYWRfZWVwcm9tKGRlLT5yZWdzLCBpLCBlZV9hZGRyX3NpemUpKTsKKworCS8qIERFQyBub3cgaGFzIGEgc3BlY2lmaWNhdGlvbiBidXQgZWFybHkgYm9hcmQgbWFrZXJzCisJICAganVzdCBwdXQgdGhlIGFkZHJlc3MgaW4gdGhlIGZpcnN0IEVFUFJPTSBsb2NhdGlvbnMuICovCisJLyogVGhpcyBkb2VzICBtZW1jbXAoZWVkYXRhLCBlZWRhdGErMTYsIDgpICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkgKyspCisJCWlmIChlZV9kYXRhW2ldICE9IGVlX2RhdGFbMTYraV0pCisJCQlzYV9vZmZzZXQgPSAyMDsKKworCS8qIHN0b3JlIE1BQyBhZGRyZXNzICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkgKyspCisJCWRlLT5kZXYtPmRldl9hZGRyW2ldID0gZWVfZGF0YVtpICsgc2Ffb2Zmc2V0XTsKKworCS8qIGdldCBvZmZzZXQgb2YgY29udHJvbGxlciAwIGluZm8gbGVhZi4gIGlnbm9yZSAybmQgYnl0ZS4gKi8KKwlvZnMgPSBlZV9kYXRhW1NST01DMEluZm9MZWFmXTsKKwlpZiAob2ZzID49IChzaXplb2YoZWVfZGF0YSkgLSBzaXplb2Yoc3RydWN0IGRlX3Nyb21faW5mb19sZWFmKSAtIHNpemVvZihzdHJ1Y3QgZGVfc3JvbV9tZWRpYV9ibG9jaykpKQorCQlnb3RvIGJhZF9zcm9tOworCisJLyogZ2V0IHBvaW50ZXIgdG8gaW5mbyBsZWFmICovCisJaWwgPSAoc3RydWN0IGRlX3Nyb21faW5mb19sZWFmICopICZlZV9kYXRhW29mc107CisKKwkvKiBwYXJhbm9pYSBjaGVja3MgKi8KKwlpZiAoaWwtPm5fYmxvY2tzID09IDApCisJCWdvdG8gYmFkX3Nyb207CisJaWYgKChzaXplb2YoZWVfZGF0YSkgLSBvZnMpIDwKKwkgICAgKHNpemVvZihzdHJ1Y3QgZGVfc3JvbV9pbmZvX2xlYWYpICsgKHNpemVvZihzdHJ1Y3QgZGVfc3JvbV9tZWRpYV9ibG9jaykgKiBpbC0+bl9ibG9ja3MpKSkKKwkJZ290byBiYWRfc3JvbTsKKworCS8qIGdldCBkZWZhdWx0IG1lZGlhIHR5cGUgKi8KKwlzd2l0Y2ggKERFX1VOQUxJR05FRF8xNigmaWwtPmRlZmF1bHRfbWVkaWEpKSB7CisJY2FzZSAweDAwMDE6ICBkZS0+bWVkaWFfdHlwZSA9IERFX01FRElBX0JOQzsgYnJlYWs7CisJY2FzZSAweDAwMDI6ICBkZS0+bWVkaWFfdHlwZSA9IERFX01FRElBX0FVSTsgYnJlYWs7CisJY2FzZSAweDAyMDQ6ICBkZS0+bWVkaWFfdHlwZSA9IERFX01FRElBX1RQX0ZEOyBicmVhazsKKwlkZWZhdWx0OiBkZS0+bWVkaWFfdHlwZSA9IERFX01FRElBX1RQX0FVVE87IGJyZWFrOworCX0KKwkKKwlpZiAobmV0aWZfbXNnX3Byb2JlKGRlKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZGUlZDogU1JPTSBsZWFmIG9mZnNldCAldSwgZGVmYXVsdCBtZWRpYSAlc1xuIiwKKwkJICAgICAgIGRlLT5ib2FyZF9pZHgsIG9mcywKKwkJICAgICAgIG1lZGlhX25hbWVbZGUtPm1lZGlhX3R5cGVdKTsKKworCS8qIGluaXQgU0lBIHJlZ2lzdGVyIHZhbHVlcyB0byBkZWZhdWx0cyAqLworCWZvciAoaSA9IDA7IGkgPCBERV9NQVhfTUVESUE7IGkrKykgeworCQlkZS0+bWVkaWFbaV0udHlwZSA9IERFX01FRElBX0lOVkFMSUQ7CisJCWRlLT5tZWRpYVtpXS5jc3IxMyA9IDB4ZmZmZjsKKwkJZGUtPm1lZGlhW2ldLmNzcjE0ID0gMHhmZmZmOworCQlkZS0+bWVkaWFbaV0uY3NyMTUgPSAweGZmZmY7CisJfQorCisJLyogcGFyc2UgbWVkaWEgYmxvY2tzIHRvIHNlZSB3aGF0IG1lZGlhcyBhcmUgc3VwcG9ydGVkLAorCSAqIGFuZCBpZiBhbnkgY3VzdG9tIENTUiB2YWx1ZXMgYXJlIHByb3ZpZGVkCisJICovCisJYnVmcCA9ICgodm9pZCAqKWlsKSArIHNpemVvZigqaWwpOworCWZvciAoaSA9IDA7IGkgPCBpbC0+bl9ibG9ja3M7IGkrKykgeworCQlzdHJ1Y3QgZGVfc3JvbV9tZWRpYV9ibG9jayAqaWIgPSBidWZwOworCQl1bnNpZ25lZCBpZHg7CisKKwkJLyogaW5kZXggYmFzZWQgb24gbWVkaWEgdHlwZSBpbiBtZWRpYSBibG9jayAqLworCQlzd2l0Y2goaWItPm9wdHMgJiBNZWRpYUJsb2NrTWFzaykgeworCQljYXNlIDA6IC8qIDEwYmFzZVQgKi8KKwkJCWRlLT5tZWRpYV9zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX1RQIHwgU1VQUE9SVEVEXzEwYmFzZVRfSGFsZgorCQkJCQkgIHwgU1VQUE9SVEVEX0F1dG9uZWc7CisJCQlpZHggPSBERV9NRURJQV9UUDsKKwkJCWRlLT5tZWRpYVtERV9NRURJQV9UUF9BVVRPXS50eXBlID0gREVfTUVESUFfVFBfQVVUTzsKKwkJCWJyZWFrOworCQljYXNlIDE6IC8qIEJOQyAqLworCQkJZGUtPm1lZGlhX3N1cHBvcnRlZCB8PSBTVVBQT1JURURfQk5DOworCQkJaWR4ID0gREVfTUVESUFfQk5DOworCQkJYnJlYWs7CisJCWNhc2UgMjogLyogQVVJICovCisJCQlkZS0+bWVkaWFfc3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9BVUk7CisJCQlpZHggPSBERV9NRURJQV9BVUk7CisJCQlicmVhazsKKwkJY2FzZSA0OiAvKiAxMGJhc2VULUZEICovCisJCQlkZS0+bWVkaWFfc3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9UUCB8IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwKKwkJCQkJICB8IFNVUFBPUlRFRF9BdXRvbmVnOworCQkJaWR4ID0gREVfTUVESUFfVFBfRkQ7CisJCQlkZS0+bWVkaWFbREVfTUVESUFfVFBfQVVUT10udHlwZSA9IERFX01FRElBX1RQX0FVVE87CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gYmFkX3Nyb207CisJCX0KKworCQlkZS0+bWVkaWFbaWR4XS50eXBlID0gaWR4OworCisJCWlmIChuZXRpZl9tc2dfcHJvYmUoZGUpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiZGUlZDogICBtZWRpYSBibG9jayAjJXU6ICVzIiwKKwkJCSAgICAgICBkZS0+Ym9hcmRfaWR4LCBpLAorCQkJICAgICAgIG1lZGlhX25hbWVbZGUtPm1lZGlhW2lkeF0udHlwZV0pOworCisJCWJ1ZnAgKz0gc2l6ZW9mIChpYi0+b3B0cyk7CisKKwkJaWYgKGliLT5vcHRzICYgTWVkaWFDdXN0b21DU1JzKSB7CisJCQlkZS0+bWVkaWFbaWR4XS5jc3IxMyA9IERFX1VOQUxJR05FRF8xNigmaWItPmNzcjEzKTsKKwkJCWRlLT5tZWRpYVtpZHhdLmNzcjE0ID0gREVfVU5BTElHTkVEXzE2KCZpYi0+Y3NyMTQpOworCQkJZGUtPm1lZGlhW2lkeF0uY3NyMTUgPSBERV9VTkFMSUdORURfMTYoJmliLT5jc3IxNSk7CisJCQlidWZwICs9IHNpemVvZihpYi0+Y3NyMTMpICsgc2l6ZW9mKGliLT5jc3IxNCkgKworCQkJCXNpemVvZihpYi0+Y3NyMTUpOworCisJCQlpZiAobmV0aWZfbXNnX3Byb2JlKGRlKSkKKwkJCQlwcmludGsoIiAoJXgsJXgsJXgpXG4iLAorCQkJCSAgICAgICBkZS0+bWVkaWFbaWR4XS5jc3IxMywKKwkJCQkgICAgICAgZGUtPm1lZGlhW2lkeF0uY3NyMTQsCisJCQkJICAgICAgIGRlLT5tZWRpYVtpZHhdLmNzcjE1KTsKKwkJCQkgICAgICAgCisJCX0gZWxzZSBpZiAobmV0aWZfbXNnX3Byb2JlKGRlKSkKKwkJCXByaW50aygiXG4iKTsKKworCQlpZiAoYnVmcCA+ICgodm9pZCAqKSZlZV9kYXRhW0RFX0VFUFJPTV9TSVpFIC0gM10pKQorCQkJYnJlYWs7CisJfQorCisJZGUtPm1lZGlhX2FkdmVydGlzZSA9IGRlLT5tZWRpYV9zdXBwb3J0ZWQ7CisKK2ZpbGxfZGVmYXVsdHM6CisJLyogZmlsbCBpbiBkZWZhdWx0cywgZm9yIGNhc2VzIHdoZXJlIGN1c3RvbSBDU1JzIG5vdCB1c2VkICovCisJZm9yIChpID0gMDsgaSA8IERFX01BWF9NRURJQTsgaSsrKSB7CisJCWlmIChkZS0+bWVkaWFbaV0uY3NyMTMgPT0gMHhmZmZmKQorCQkJZGUtPm1lZGlhW2ldLmNzcjEzID0gdDIxMDQxX2NzcjEzW2ldOworCQlpZiAoZGUtPm1lZGlhW2ldLmNzcjE0ID09IDB4ZmZmZikKKwkJCWRlLT5tZWRpYVtpXS5jc3IxNCA9IHQyMTA0MV9jc3IxNFtpXTsKKwkJaWYgKGRlLT5tZWRpYVtpXS5jc3IxNSA9PSAweGZmZmYpCisJCQlkZS0+bWVkaWFbaV0uY3NyMTUgPSB0MjEwNDFfY3NyMTVbaV07CisJfQorCisJZGUtPmVlX2RhdGEgPSBrbWFsbG9jKERFX0VFUFJPTV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGUtPmVlX2RhdGEpCisJCW1lbWNweShkZS0+ZWVfZGF0YSwgJmVlX2RhdGFbMF0sIERFX0VFUFJPTV9TSVpFKTsKKworCXJldHVybjsKKworYmFkX3Nyb206CisJLyogZm9yIGVycm9yIGNhc2VzLCBpdCdzIG9rIHRvIGFzc3VtZSB3ZSBzdXBwb3J0IGFsbCB0aGVzZSAqLworCWZvciAoaSA9IDA7IGkgPCBERV9NQVhfTUVESUE7IGkrKykKKwkJZGUtPm1lZGlhW2ldLnR5cGUgPSBpOworCWRlLT5tZWRpYV9zdXBwb3J0ZWQgPQorCQlTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkJU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8CisJCVNVUFBPUlRFRF9BdXRvbmVnIHwKKwkJU1VQUE9SVEVEX1RQIHwKKwkJU1VQUE9SVEVEX0FVSSB8CisJCVNVUFBPUlRFRF9CTkM7CisJZ290byBmaWxsX2RlZmF1bHRzOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkZV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlOworCWludCByYzsKKwl2b2lkIF9faW9tZW0gKnJlZ3M7CisJbG9uZyBwY2lhZGRyOworCXN0YXRpYyBpbnQgYm9hcmRfaWR4ID0gLTE7CisKKwlib2FyZF9pZHgrKzsKKworI2lmbmRlZiBNT0RVTEUKKwlpZiAoYm9hcmRfaWR4ID09IDApCisJCXByaW50aygiJXMiLCB2ZXJzaW9uKTsKKyNlbmRpZgorCisJLyogYWxsb2NhdGUgYSBuZXcgZXRoZXJuZXQgZGV2aWNlIHN0cnVjdHVyZSwgYW5kIGZpbGwgaW4gZGVmYXVsdHMgKi8KKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGRlX3ByaXZhdGUpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKwlkZXYtPm9wZW4gPSBkZV9vcGVuOworCWRldi0+c3RvcCA9IGRlX2Nsb3NlOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gZGVfc2V0X3J4X21vZGU7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBkZV9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gZGVfZ2V0X3N0YXRzOworCWRldi0+ZXRodG9vbF9vcHMgPSAmZGVfZXRodG9vbF9vcHM7CisJZGV2LT50eF90aW1lb3V0ID0gZGVfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKworCWRlID0gZGV2LT5wcml2OworCWRlLT5kZTIxMDQwID0gZW50LT5kcml2ZXJfZGF0YSA9PSAwID8gMSA6IDA7CisJZGUtPnBkZXYgPSBwZGV2OworCWRlLT5kZXYgPSBkZXY7CisJZGUtPm1zZ19lbmFibGUgPSAoZGVidWcgPCAwID8gREVfREVGX01TR19FTkFCTEUgOiBkZWJ1Zyk7CisJZGUtPmJvYXJkX2lkeCA9IGJvYXJkX2lkeDsKKwlzcGluX2xvY2tfaW5pdCAoJmRlLT5sb2NrKTsKKwlpbml0X3RpbWVyKCZkZS0+bWVkaWFfdGltZXIpOworCWlmIChkZS0+ZGUyMTA0MCkKKwkJZGUtPm1lZGlhX3RpbWVyLmZ1bmN0aW9uID0gZGUyMTA0MF9tZWRpYV90aW1lcjsKKwllbHNlCisJCWRlLT5tZWRpYV90aW1lci5mdW5jdGlvbiA9IGRlMjEwNDFfbWVkaWFfdGltZXI7CisJZGUtPm1lZGlhX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGU7CisKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIHdha2UgdXAgZGV2aWNlLCBhc3NpZ24gcmVzb3VyY2VzICovCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9mcmVlOworCisJLyogcmVzZXJ2ZSBQQ0kgcmVzb3VyY2VzIHRvIGVuc3VyZSBkcml2ZXIgYXRvbWljaXR5ICovCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCisJLyogY2hlY2sgZm9yIGludmFsaWQgSVJRIHZhbHVlICovCisJaWYgKHBkZXYtPmlycSA8IDIpIHsKKwkJcmMgPSAtRUlPOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJpbnZhbGlkIGlycSAoJWQpIGZvciBwY2kgZGV2ICVzXG4iLAorCQkgICAgICAgcGRldi0+aXJxLCBwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gZXJyX291dF9yZXM7CisJfQorCisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisKKwkvKiBvYnRhaW4gYW5kIGNoZWNrIHZhbGlkaXR5IG9mIFBDSSBJL08gYWRkcmVzcyAqLworCXBjaWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisJaWYgKCFwY2lhZGRyKSB7CisJCXJjID0gLUVJTzsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibm8gTU1JTyByZXNvdXJjZSBmb3IgcGNpIGRldiAlc1xuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZ290byBlcnJfb3V0X3JlczsKKwl9CisJaWYgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkgPCBERV9SRUdTX1NJWkUpIHsKKwkJcmMgPSAtRUlPOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJNTUlPIHJlc291cmNlICglbHgpIHRvbyBzbWFsbCBvbiBwY2kgZGV2ICVzXG4iLAorCQkgICAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKSwgcGNpX25hbWUocGRldikpOworCQlnb3RvIGVycl9vdXRfcmVzOworCX0KKworCS8qIHJlbWFwIENTUiByZWdpc3RlcnMgKi8KKwlyZWdzID0gaW9yZW1hcF9ub2NhY2hlKHBjaWFkZHIsIERFX1JFR1NfU0laRSk7CisJaWYgKCFyZWdzKSB7CisJCXJjID0gLUVJTzsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IG1hcCBQQ0kgTU1JTyAoJWx4QCVseCkgb24gcGNpIGRldiAlc1xuIiwKKwkJICAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSksIHBjaWFkZHIsIHBjaV9uYW1lKHBkZXYpKTsKKwkJZ290byBlcnJfb3V0X3JlczsKKwl9CisJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZykgcmVnczsKKwlkZS0+cmVncyA9IHJlZ3M7CisKKwlkZV9hZGFwdGVyX3dha2UoZGUpOworCisJLyogbWFrZSBzdXJlIGhhcmR3YXJlIGlzIG5vdCBydW5uaW5nICovCisJcmMgPSBkZV9yZXNldF9tYWMoZGUpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgcmVzZXQgTUFDLCBwY2kgZGV2ICVzXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlnb3RvIGVycl9vdXRfaW9tYXA7CisJfQorCisJLyogZ2V0IE1BQyBhZGRyZXNzLCBpbml0aWFsaXplIGRlZmF1bHQgbWVkaWEgdHlwZSBhbmQKKwkgKiBnZXQgbGlzdCBvZiBzdXBwb3J0ZWQgbWVkaWEKKwkgKi8KKwlpZiAoZGUtPmRlMjEwNDApIHsKKwkJZGUyMTA0MF9nZXRfbWFjX2FkZHJlc3MoZGUpOworCQlkZTIxMDQwX2dldF9tZWRpYV9pbmZvKGRlKTsKKwl9IGVsc2UgeworCQlkZTIxMDQxX2dldF9zcm9tX2luZm8oZGUpOworCX0KKworCS8qIHJlZ2lzdGVyIG5ldyBuZXR3b3JrIGludGVyZmFjZSB3aXRoIGtlcm5lbCAqLworCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfaW9tYXA7CisKKwkvKiBwcmludCBpbmZvIGFib3V0IGJvYXJkIGFuZCBpbnRlcmZhY2UganVzdCByZWdpc3RlcmVkICovCisJcHJpbnRrIChLRVJOX0lORk8gIiVzOiAlcyBhdCAweCVseCwgIgorCQkiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngsICIKKwkJIklSUSAlZFxuIiwKKwkJZGV2LT5uYW1lLAorCQlkZS0+ZGUyMTA0MCA/ICIyMTA0MCIgOiAiMjEwNDEiLAorCQlkZXYtPmJhc2VfYWRkciwKKwkJZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwKKwkJZGV2LT5kZXZfYWRkclsyXSwgZGV2LT5kZXZfYWRkclszXSwKKwkJZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSwKKwkJZGV2LT5pcnEpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwkvKiBlbmFibGUgYnVzbWFzdGVyaW5nICovCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwkvKiBwdXQgYWRhcHRlciB0byBzbGVlcCAqLworCWRlX2FkYXB0ZXJfc2xlZXAoZGUpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfaW9tYXA6CisJaWYgKGRlLT5lZV9kYXRhKQorCQlrZnJlZShkZS0+ZWVfZGF0YSk7CisJaW91bm1hcChyZWdzKTsKK2Vycl9vdXRfcmVzOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfb3V0X2Rpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworZXJyX291dF9mcmVlOgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZGVfcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZGVfcHJpdmF0ZSAqZGUgPSBkZXYtPnByaXY7CisKKwlpZiAoIWRldikKKwkJQlVHKCk7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZGUtPmVlX2RhdGEpCisJCWtmcmVlKGRlLT5lZV9kYXRhKTsKKwlpb3VubWFwKGRlLT5yZWdzKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJZnJlZV9uZXRkZXYoZGV2KTsKK30KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IGRlX3N1c3BlbmQgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YSAocGRldik7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlID0gZGV2LT5wcml2OworCisJcnRubF9sb2NrKCk7CisJaWYgKG5ldGlmX3J1bm5pbmcgKGRldikpIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmRlLT5tZWRpYV90aW1lcik7CisKKwkJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCQlzcGluX2xvY2tfaXJxKCZkZS0+bG9jayk7CisKKwkJZGVfc3RvcF9odyhkZSk7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJCXNwaW5fdW5sb2NrX2lycSgmZGUtPmxvY2spOworCQllbmFibGVfaXJxKGRldi0+aXJxKTsKKwkJCisJCS8qIFVwZGF0ZSB0aGUgZXJyb3IgY291bnRzLiAqLworCQlfX2RlX2dldF9zdGF0cyhkZSk7CisKKwkJc3luY2hyb25pemVfaXJxKGRldi0+aXJxKTsKKwkJZGVfY2xlYW5fcmluZ3MoZGUpOworCisJCWRlX2FkYXB0ZXJfc2xlZXAoZGUpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJfSBlbHNlIHsKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCX0KKwlydG5sX3VubG9jaygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlX3Jlc3VtZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YSAocGRldik7CisJc3RydWN0IGRlX3ByaXZhdGUgKmRlID0gZGV2LT5wcml2OworCisJcnRubF9sb2NrKCk7CisJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCWdvdG8gb3V0OworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJCWRlX2luaXRfaHcoZGUpOworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJfSBlbHNlIHsKKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCX0KK291dDoKKwlydG5sX3VubG9jaygpOworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkZV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCT0gZGVfcGNpX3RibCwKKwkucHJvYmUJCT0gZGVfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2V4aXRfcChkZV9yZW1vdmVfb25lKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IGRlX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBkZV9yZXN1bWUsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRlX2luaXQgKHZvaWQpCit7CisjaWZkZWYgTU9EVUxFCisJcHJpbnRrKCIlcyIsIHZlcnNpb24pOworI2VuZGlmCisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCAoJmRlX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkZV9leGl0ICh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJmRlX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGRlX2luaXQpOworbW9kdWxlX2V4aXQoZGVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzgwMGMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYwpAQCAtMCwwICsxLDU3NzggQEAKKy8qICBkZTR4NS5jOiBBIERJR0lUQUwgREMyMXg0eCBERUNjaGlwIGFuZCBERTQyNS9ERTQzNC9ERTQzNS9ERTQ1MC9ERTUwMAorICAgICAgICAgICAgIGV0aGVybmV0IGRyaXZlciBmb3IgTGludXguCisKKyAgICBDb3B5cmlnaHQgMTk5NCwgMTk5NSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbi4KKworICAgIFRlc3RpbmcgcmVzb3VyY2VzIGZvciB0aGlzIGRyaXZlciBoYXZlIGJlZW4gbWFkZSBhdmFpbGFibGUKKyAgICBpbiBwYXJ0IGJ5IE5BU0EgQW1lcyBSZXNlYXJjaCBDZW50ZXIgKG1qYWNvYkBuYXMubmFzYS5nb3YpLgorCisgICAgVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhdCBkYXZpZXNAbWFuaWFjLnVsdHJhbmV0LmNvbS4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQgICBgYEFTICBJUycnIEFORCAgIEFOWSAgRVhQUkVTUyBPUiAgIElNUExJRUQKKyAgICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAgICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KKyAgICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsICBJTkRJUkVDVCwKKyAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAgICBOT1QgTElNSVRFRCAgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUyAgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAgICBVU0UsIERBVEEsICBPUiBQUk9GSVRTOyBPUiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAgICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAgICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAgICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAgICBPcmlnaW5hbGx5LCAgIHRoaXMgIGRyaXZlciAgd2FzICAgIHdyaXR0ZW4gIGZvciB0aGUgIERpZ2l0YWwgICBFcXVpcG1lbnQKKyAgICBDb3Jwb3JhdGlvbiBzZXJpZXMgb2YgRXRoZXJXT1JLUyBldGhlcm5ldCBjYXJkczoKKworICAgICAgICBERTQyNSBUUC9DT0FYIEVJU0EKKwlERTQzNCBUUCBQQ0kKKwlERTQzNSBUUC9DT0FYL0FVSSBQQ0kKKwlERTQ1MCBUUC9DT0FYL0FVSSBQQ0kKKwlERTUwMCAxMC8xMDAgUENJIEZhc3Rlcm5ldAorCisgICAgYnV0IGl0ICB3aWxsICBub3cgYXR0ZW1wdCAgdG8gIHN1cHBvcnQgYWxsICBjYXJkcyB3aGljaCAgIGNvbmZvcm0gdG8gdGhlCisgICAgRGlnaXRhbCBTZW1pY29uZHVjdG9yICAgU1JPTSAgIFNwZWNpZmljYXRpb24uICAgIFRoZSAgZHJpdmVyICAgY3VycmVudGx5CisgICAgcmVjb2duaXNlcyB0aGUgZm9sbG93aW5nIGNoaXBzOgorCisgICAgICAgIERDMjEwNDAgIChubyBTUk9NKSAKKwlEQzIxMDQxW0FdICAKKwlEQzIxMTQwW0FdIAorCURDMjExNDIgCisJREMyMTE0MyAKKworICAgIFNvIGZhciB0aGUgZHJpdmVyIGlzIGtub3duIHRvIHdvcmsgd2l0aCB0aGUgZm9sbG93aW5nIGNhcmRzOgorCisgICAgICAgIEtJTkdTVE9OCisJTGlua3N5cworCVpOWVgzNDIKKwlTTUM4NDMyCisJU01DOTMzMiAody9uZXcgU1JPTSkKKwlaTllYMzFbNDVdCisJWk5ZWDM0NiAxMC8xMDAgNCBwb3J0IChjYW4gYWN0IGFzIGEgMTAvMTAwIGJyaWRnZSEpIAorCisgICAgVGhlIGRyaXZlciBoYXMgYmVlbiB0ZXN0ZWQgb24gYSByZWxhdGl2ZWx5IGJ1c3kgbmV0d29yayB1c2luZyB0aGUgREU0MjUsCisgICAgREU0MzQsIERFNDM1IGFuZCBERTUwMCBjYXJkcyBhbmQgYmVuY2htYXJrZWQgd2l0aCAndHRjcCc6IGl0IHRyYW5zZmVycmVkCisgICAgMTZNIG9mIGRhdGEgdG8gYSBERUNzdGF0aW9uIDUwMDAvMjAwIGFzIGZvbGxvd3M6CisKKyAgICAgICAgICAgICAgICBUQ1AgICAgICAgICAgIFVEUAorICAgICAgICAgICAgIFRYICAgICBSWCAgICAgVFggICAgIFJYCisgICAgREU0MjUgICAxMDMwayAgOTk3ayAgIDExNzBrICAxMTI4aworICAgIERFNDM0ICAgMTA2M2sgIDk5NWsgICAxMTcwayAgMTEyNWsKKyAgICBERTQzNSAgIDEwNjNrICA5OTVrICAgMTE3MGsgIDExMjVrCisgICAgREU1MDAgICAxMDYzayAgOTk4ayAgIDExNzBrICAxMTI1ayAgaW4gMTBNYi9zIG1vZGUKKworICAgIEFsbCAgdmFsdWVzIGFyZSB0eXBpY2FsIChpbiAgIGtCeXRlcy9zZWMpIGZyb20gYSAgc2FtcGxlICBvZiA0IGZvciAgZWFjaAorICAgIG1lYXN1cmVtZW50LiBUaGVpciBlcnJvciBpcyArLy0yMGsgb24gYSBxdWlldCAocHJpdmF0ZSkgbmV0d29yayBhbmQgYWxzbworICAgIGRlcGVuZCBvbiB3aGF0IGxvYWQgdGhlIENQVSBoYXMuCisKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgVGhpcyBkcml2ZXIgIGhhcyBiZWVuIHdyaXR0ZW4gc3Vic3RhbnRpYWxseSAgZnJvbSAgc2NyYXRjaCwgYWx0aG91Z2ggaXRzCisgICAgaW5oZXJpdGFuY2Ugb2Ygc3R5bGUgYW5kIHN0YWNrIGludGVyZmFjZSBmcm9tICdld3JrMy5jJyBhbmQgaW4gdHVybiBmcm9tCisgICAgRG9uYWxkIEJlY2tlcidzICdsYW5jZS5jJyBzaG91bGQgYmUgb2J2aW91cy4gV2l0aCB0aGUgbW9kdWxlIGF1dG9sb2FkIG9mCisgICAgZXZlcnkgIHVzYWJsZSBERUNjaGlwIGJvYXJkLCAgSSAgcGluY2hlZCBEb25hbGQncyAnbmV4dF9tb2R1bGUnIGZpZWxkIHRvCisgICAgbGluayBteSBtb2R1bGVzIHRvZ2V0aGVyLgorCisgICAgVXB0byAxNSBFSVNBIGNhcmRzIGNhbiBiZSBzdXBwb3J0ZWQgdW5kZXIgdGhpcyBkcml2ZXIsIGxpbWl0ZWQgcHJpbWFyaWx5CisgICAgYnkgdGhlIGF2YWlsYWJsZSBJUlEgbGluZXMuICBJIGhhdmUgIGNoZWNrZWQgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zIG9mCisgICAgbXVsdGlwbGUgZGVwY2EsIEV0aGVyV09SS1MgMyBjYXJkcyBhbmQgZGU0eDUgY2FyZHMgYW5kICBoYXZlIG5vdCBmb3VuZCBhCisgICAgcHJvYmxlbSB5ZXQgKHByb3ZpZGVkIHlvdSBoYXZlIGF0IGxlYXN0IGRlcGNhLmMgdjAuMzgpIC4uLgorCisgICAgUENJIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQgIHRvIGFsbG93IHRoZSBkcml2ZXIgIHRvIHdvcmsgd2l0aCB0aGUgREU0MzQsCisgICAgREU0MzUsIERFNDUwIGFuZCBERTUwMCBjYXJkcy4gVGhlIEkvTyBhY2Nlc3NlcyBhcmUgYSBiaXQgb2YgYSBrbHVkZ2UgZHVlCisgICAgdG8gdGhlIGRpZmZlcmVuY2VzIGluIHRoZSBFSVNBIGFuZCBQQ0kgQ1NSIGFkZHJlc3Mgb2Zmc2V0cyBmcm9tIHRoZSBiYXNlCisgICAgYWRkcmVzcy4KKworICAgIFRoZSBhYmlsaXR5IHRvIGxvYWQgdGhpcyAgZHJpdmVyIGFzIGEgbG9hZGFibGUgIG1vZHVsZSBoYXMgYmVlbiBpbmNsdWRlZAorICAgIGFuZCB1c2VkIGV4dGVuc2l2ZWx5ICBkdXJpbmcgdGhlIGRyaXZlciBkZXZlbG9wbWVudCAgKHRvIHNhdmUgdGhvc2UgbG9uZworICAgIHJlYm9vdCBzZXF1ZW5jZXMpLiAgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQgIHVuZGVyIFBDSSBhbmQgRUlTQSBoYXMgYmVlbgorICAgIGFjaGlldmVkIGJ5IGxldHRpbmcgdGhlIGRyaXZlciBhdXRvcHJvYmUgYXMgaWYgaXQgd2VyZSBjb21waWxlZCBpbnRvIHRoZQorICAgIGtlcm5lbC4gRG8gbWFrZSBzdXJlICB5b3UncmUgbm90IHNoYXJpbmcgIGludGVycnVwdHMgd2l0aCBhbnl0aGluZyAgdGhhdAorICAgIGNhbm5vdCBhY2NvbW1vZGF0ZSAgaW50ZXJydXB0ICBzaGFyaW5nIQorCisgICAgVG8gdXRpbGlzZSB0aGlzIGFiaWxpdHksIHlvdSBoYXZlIHRvIGRvIDggdGhpbmdzOgorCisgICAgMCkgaGF2ZSBhIGNvcHkgb2YgdGhlIGxvYWRhYmxlIG1vZHVsZXMgY29kZSBpbnN0YWxsZWQgb24geW91ciBzeXN0ZW0uCisgICAgMSkgY29weSBkZTR4NS5jIGZyb20gdGhlICAvbGludXgvZHJpdmVycy9uZXQgZGlyZWN0b3J5IHRvIHlvdXIgZmF2b3VyaXRlCisgICAgdGVtcG9yYXJ5IGRpcmVjdG9yeS4KKyAgICAyKSBmb3IgZml4ZWQgIGF1dG9wcm9iZXMgKG5vdCAgcmVjb21tZW5kZWQpLCAgZWRpdCB0aGUgc291cmNlIGNvZGUgIG5lYXIKKyAgICBsaW5lIDU1OTQgdG8gcmVmbGVjdCB0aGUgSS9PIGFkZHJlc3MgIHlvdSdyZSB1c2luZywgb3IgYXNzaWduIHRoZXNlIHdoZW4KKyAgICBsb2FkaW5nIGJ5OgorCisgICAgICAgICAgICAgICAgICAgaW5zbW9kIGRlNHg1IGlvPTB4Z2hoICAgICAgICAgICB3aGVyZSBnID0gYnVzIG51bWJlcgorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGggPSBkZXZpY2UgbnVtYmVyICAgCisKKyAgICAgICBOQjogYXV0b3Byb2JpbmcgZm9yIG1vZHVsZXMgaXMgbm93IHN1cHBvcnRlZCBieSBkZWZhdWx0LiBZb3UgbWF5IGp1c3QKKyAgICAgICAgICAgdXNlOgorCisgICAgICAgICAgICAgICAgICAgaW5zbW9kIGRlNHg1CisKKyAgICAgICAgICAgdG8gbG9hZCBhbGwgYXZhaWxhYmxlIGJvYXJkcy4gRm9yIGEgc3BlY2lmaWMgYm9hcmQsIHN0aWxsIHVzZQorCSAgIHRoZSAnaW89PycgYWJvdmUuCisgICAgMykgY29tcGlsZSAgZGU0eDUuYywgYnV0IGluY2x1ZGUgLURNT0RVTEUgaW4gIHRoZSBjb21tYW5kIGxpbmUgdG8gZW5zdXJlCisgICAgdGhhdCB0aGUgY29ycmVjdCBiaXRzIGFyZSBjb21waWxlZCAoc2VlIGVuZCBvZiBzb3VyY2UgY29kZSkuCisgICAgNCkgaWYgeW91IGFyZSB3YW50aW5nIHRvIGFkZCBhIG5ldyAgY2FyZCwgZ290byA1LiBPdGhlcndpc2UsIHJlY29tcGlsZSBhCisgICAga2VybmVsIHdpdGggdGhlIGRlNHg1IGNvbmZpZ3VyYXRpb24gdHVybmVkIG9mZiBhbmQgcmVib290LgorICAgIDUpIGluc21vZCBkZTR4NSBbaW89MHhnaGhdCisgICAgNikgcnVuIHRoZSBuZXQgc3RhcnR1cCBiaXRzIGZvciB5b3VyIG5ldyBldGg/PyBpbnRlcmZhY2UocykgbWFudWFsbHkgCisgICAgKHVzdWFsbHkgL2V0Yy9yYy5pbmV0WzEyXSBhdCBib290IHRpbWUpLiAKKyAgICA3KSBlbmpveSEKKworICAgIFRvIHVubG9hZCBhIG1vZHVsZSwgdHVybiBvZmYgdGhlIGFzc29jaWF0ZWQgaW50ZXJmYWNlKHMpIAorICAgICdpZmNvbmZpZyBldGg/PyBkb3duJyB0aGVuICdybW1vZCBkZTR4NScuCisKKyAgICBBdXRvbWVkaWEgZGV0ZWN0aW9uIGlzIGluY2x1ZGVkIHNvIHRoYXQgaW4gIHByaW5jaXBhbCB5b3UgY2FuIGRpc2Nvbm5lY3QKKyAgICBmcm9tLCBlLmcuICBUUCwgcmVjb25uZWN0ICB0byBCTkMgIGFuZCAgdGhpbmdzIHdpbGwgc3RpbGwgd29yayAgKGFmdGVyIGEKKyAgICBwYXVzZSB3aGlsc3QgdGhlICAgZHJpdmVyIGZpZ3VyZXMgb3V0ICAgd2hlcmUgaXRzIG1lZGlhIHdlbnQpLiAgTXkgdGVzdHMKKyAgICB1c2luZyBwaW5nIHNob3dlZCB0aGF0IGl0IGFwcGVhcnMgdG8gd29yay4uLi4KKworICAgIEJ5ICBkZWZhdWx0LCAgdGhlIGRyaXZlciB3aWxsICBub3cgICBhdXRvZGV0ZWN0IGFueSAgREVDY2hpcCBiYXNlZCBjYXJkLgorICAgIFNob3VsZCB5b3UgaGF2ZSBhIG5lZWQgdG8gcmVzdHJpY3QgdGhlIGRyaXZlciB0byBESUdJVEFMIG9ubHkgY2FyZHMsIHlvdQorICAgIGNhbiBjb21waWxlIHdpdGggYSAgREVDX09OTFkgZGVmaW5lLCBvciBpZiAgbG9hZGluZyBhcyBhIG1vZHVsZSwgdXNlIHRoZQorICAgICdkZWNfb25seT0xJyAgcGFyYW1ldGVyLiAKKworICAgIEkndmUgY2hhbmdlZCB0aGUgdGltaW5nIHJvdXRpbmVzIHRvICB1c2UgdGhlIGtlcm5lbCB0aW1lciBhbmQgc2NoZWR1bGluZworICAgIGZ1bmN0aW9ucyAgc28gdGhhdCB0aGUgIGhhbmdzICBhbmQgb3RoZXIgYXNzb3J0ZWQgcHJvYmxlbXMgdGhhdCBvY2N1cnJlZAorICAgIHdoaWxlIGF1dG9zZW5zaW5nIHRoZSAgbWVkaWEgIHNob3VsZCBiZSBnb25lLiAgQSAgYm9udXMgIGZvciB0aGUgREMyMTA0MAorICAgIGF1dG8gIG1lZGlhIHNlbnNlIGFsZ29yaXRobSBpcyAgdGhhdCBpdCBjYW4gbm93ICB1c2Ugb25lIHRoYXQgaXMgbW9yZSBpbgorICAgIGxpbmUgd2l0aCB0aGUgIHJlc3QgKHRoZSBEQzIxMDQwICBjaGlwIGRvZXNuJ3QgIGhhdmUgYSBoYXJkd2FyZSAgdGltZXIpLgorICAgIFRoZSBkb3duc2lkZSBpcyB0aGUgMSAnamlmZmllcycgKDEwbXMpIHJlc29sdXRpb24uCisKKyAgICBJRUVFIDgwMi4zdSBNSUkgaW50ZXJmYWNlIGNvZGUgaGFzICBiZWVuIGFkZGVkIGluIGFudGljaXBhdGlvbiB0aGF0IHNvbWUKKyAgICBwcm9kdWN0cyBtYXkgdXNlIGl0IGluIHRoZSBmdXR1cmUuCisKKyAgICBUaGUgU01DOTMzMiBjYXJkICBoYXMgYSBub24tY29tcGxpYW50IFNST00gIHdoaWNoIG5lZWRzIGZpeGluZyAtICBJIGhhdmUKKyAgICBwYXRjaGVkIHRoaXMgIGRyaXZlciB0byBkZXRlY3QgaXQgIGJlY2F1c2UgdGhlIFNST00gZm9ybWF0IHVzZWQgY29tcGxpZXMKKyAgICB0byBhIHByZXZpb3VzIERFQy1TVEQgZm9ybWF0LgorCisgICAgSSBoYXZlIHJlbW92ZWQgdGhlIGJ1ZmZlciBjb3BpZXMgbmVlZGVkIGZvciByZWNlaXZlIG9uIEludGVscy4gIEkgY2Fubm90CisgICAgcmVtb3ZlIHRoZW0gZm9yICAgQWxwaGFzIHNpbmNlICB0aGUgIFR1bGlwIGhhcmR3YXJlICAgb25seSBkb2VzIGxvbmd3b3JkCisgICAgYWxpZ25lZCAgRE1BIHRyYW5zZmVycyAgYW5kICB0aGUgIEFscGhhcyBnZXQgICBhbGlnbm1lbnQgdHJhcHMgd2l0aCAgbm9uCisgICAgbG9uZ3dvcmQgYWxpZ25lZCBkYXRhIGNvcGllcyAod2hpY2ggbWFrZXMgdGhlbSByZWFsbHkgc2xvdykuIE5vIGNvbW1lbnQuCisKKyAgICBJICBoYXZlIGFkZGVkIFNST00gZGVjb2RpbmcgIHJvdXRpbmVzIHRvIG1ha2UgdGhpcyAgZHJpdmVyIHdvcmsgd2l0aCBhbnkKKyAgICBjYXJkIHRoYXQgIHN1cHBvcnRzIHRoZSBEaWdpdGFsICBTZW1pY29uZHVjdG9yIFNST00gc3BlYy4gVGhpcyB3aWxsIGhlbHAKKyAgICBhbGwgIGNhcmRzIHJ1bm5pbmcgdGhlIGRjMjExNHggIHNlcmllcyBjaGlwcyBpbiBwYXJ0aWN1bGFyLiAgQ2FyZHMgdXNpbmcKKyAgICB0aGUgZGMyMTA0eCAgY2hpcHMgc2hvdWxkIHJ1biBjb3JyZWN0bHkgd2l0aCAgdGhlIGJhc2ljICBkcml2ZXIuICBJJ20gaW4KKyAgICBkZWJ0IHRvIDxtamFjb2JAZmVyYWwuY29tPiBmb3IgdGhlICB0ZXN0aW5nIGFuZCBmZWVkYmFjayB0aGF0IGhlbHBlZCBnZXQKKyAgICB0aGlzIGZlYXR1cmUgd29ya2luZy4gIFNvIGZhciB3ZSBoYXZlICB0ZXN0ZWQgS0lOR1NUT04sIFNNQzg0MzIsIFNNQzkzMzIKKyAgICAod2l0aCB0aGUgbGF0ZXN0IFNST00gY29tcGx5aW5nICB3aXRoIHRoZSBTUk9NIHNwZWMgIFYzOiB0aGVpciBmaXJzdCB3YXMKKyAgICBicm9rZW4pLCBaTllYMzQyICBhbmQgIExpbmtTeXMuIFpZTlgzMTQgKGR1YWwgIDIxMDQxICBNQUMpIGFuZCAgWk5ZWCAzMTUKKyAgICAocXVhZCAyMTA0MSBNQUMpICBjYXJkcyBhbHNvICBhcHBlYXIgIHRvIHdvcmsgZGVzcGl0ZSB0aGVpciAgaW5jb3JyZWN0bHkKKyAgICB3aXJlZCBJUlFzLgorCisgICAgSSBoYXZlIGFkZGVkIGEgdGVtcG9yYXJ5IGZpeCBmb3IgaW50ZXJydXB0IHByb2JsZW1zIHdoZW4gc29tZSBTQ1NJIGNhcmRzCisgICAgc2hhcmUgdGhlIHNhbWUgaW50ZXJydXB0IGFzIHRoZSBERUNjaGlwIGJhc2VkICBjYXJkcy4gVGhlIHByb2JsZW0gb2NjdXJzCisgICAgYmVjYXVzZSAgdGhlIFNDU0kgY2FyZCB3YW50cyB0byAgZ3JhYiB0aGUgaW50ZXJydXB0ICBhcyBhIGZhc3QgaW50ZXJydXB0CisgICAgKHJ1bnMgdGhlICAgc2VydmljZSByb3V0aW5lIHdpdGggaW50ZXJydXB0cyB0dXJuZWQgICBvZmYpIHZzLiAgdGhpcyBjYXJkCisgICAgd2hpY2ggcmVhbGx5IG5lZWRzIHRvIHJ1biB0aGUgc2VydmljZSByb3V0aW5lIHdpdGggaW50ZXJydXB0cyB0dXJuZWQgb24uCisgICAgVGhpcyBkcml2ZXIgd2lsbCAgbm93ICAgYWRkIHRoZSBpbnRlcnJ1cHQgc2VydmljZSAgIHJvdXRpbmUgIGFzICBhICBmYXN0CisgICAgaW50ZXJydXB0IGlmIGl0ICAgaXMgYm91bmNlZCBmcm9tIHRoZSAgIHNsb3cgaW50ZXJydXB0LiAgVEhJUyBJUyBOT1QgICBBCisgICAgUkVDT01NRU5ERUQgV0FZIFRPIFJVTiBUSEUgRFJJVkVSICBhbmQgaGFzIGJlZW4gZG9uZSAgZm9yIGEgbGltaXRlZCB0aW1lCisgICAgdW50aWwgIHBlb3BsZSAgIHNvcnQgIG91dCB0aGVpciAgY29tcGF0aWJpbGl0eSAgICBpc3N1ZXMgYW5kIHRoZSAga2VybmVsCisgICAgaW50ZXJydXB0ICBzZXJ2aWNlIGNvZGUgIGlzICBmaXhlZC4gICBZT1UgIFNIT1VMRCBTRVBBUkFURSBPVVQgIFRIRSBGQVNUCisgICAgSU5URVJSVVBUIENBUkRTIEZST00gVEhFIFNMT1cgSU5URVJSVVBUIENBUkRTIHRvIGVuc3VyZSB0aGF0IHRoZXkgZG8gbm90CisgICAgcnVuIG9uIHRoZSBzYW1lIGludGVycnVwdC4gUENNQ0lBL0NhcmRCdXMgaXMgYW5vdGhlciBjYW4gb2Ygd29ybXMuLi4KKworICAgIEZpbmFsbHksIEkgdGhpbmsgIEkgaGF2ZSByZWFsbHkgIGZpeGVkICB0aGUgbW9kdWxlICBsb2FkaW5nIHByb2JsZW0gd2l0aAorICAgIG1vcmUgdGhhbiBvbmUgREVDY2hpcCBiYXNlZCAgY2FyZC4gIEFzIGEgIHNpZGUgZWZmZWN0LCBJIGRvbid0IG1lc3Mgd2l0aAorICAgIHRoZSAgZGV2aWNlIHN0cnVjdHVyZSBhbnkgIG1vcmUgd2hpY2ggbWVhbnMgdGhhdCAgaWYgbW9yZSB0aGFuIDEgY2FyZCBpbgorICAgIDIuMC54IGlzICAgIGluc3RhbGxlZCAoNCAgaW4gICAyLjEueCksICB0aGUgIHVzZXIgICB3aWxsIGhhdmUgICB0byAgZWRpdAorICAgIGxpbnV4L2RyaXZlcnMvbmV0L1NwYWNlLmMgIHRvIG1ha2Ugcm9vbSBmb3IgIHRoZW0uIEhlbmNlLCBtb2R1bGUgbG9hZGluZworICAgIGlzICB0aGUgcHJlZmVycmVkIHdheSB0byB1c2UgICB0aGlzIGRyaXZlciwgc2luY2UgIGl0ICBkb2Vzbid0IGhhdmUgdGhpcworICAgIGxpbWl0YXRpb24uCisKKyAgICBXaGVyZSBTUk9NIG1lZGlhICBkZXRlY3Rpb24gaXMgdXNlZCBhbmQgIGZ1bGwgZHVwbGV4IGlzIHNwZWNpZmllZCBpbiB0aGUKKyAgICBTUk9NLCAgdGhlIGZlYXR1cmUgaXMgIGlnbm9yZWQgdW5sZXNzICBscC0+cGFyYW1zLmZkeCAgaXMgc2V0IGF0IGNvbXBpbGUKKyAgICB0aW1lICBPUiBkdXJpbmcgIGEgICBtb2R1bGUgbG9hZCAgKGluc21vZCAgZGU0eDUgICBhcmdzPSdldGg/PzpmZHgnIFtzZWUKKyAgICBiZWxvd10pLiAgVGhpcyBpcyBiZWNhdXNlIHRoZXJlICBpcyBubyB3YXkgIHRvIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IGZ1bGwKKyAgICBkdXBsZXggICBsaW5rcyAgZXhjZXB0IHRocm91Z2ggICBhdXRvbmVnb3RpYXRpb24uICAgIFdoZW4gSSAgaW5jbHVkZSB0aGUKKyAgICBhdXRvbmVnb3RpYXRpb24gZmVhdHVyZSBpbiAgdGhlIFNST00gYXV0b2NvbmYgIGNvZGUsIHRoaXMgZGV0ZWN0aW9uIHdpbGwKKyAgICBvY2N1ciBhdXRvbWF0aWNhbGx5IGZvciB0aGF0IGNhc2UuCisKKyAgICBDb21tYW5kICBsaW5lIGFyZ3VtZW50cyBhcmUgIG5vdyAgYWxsb3dlZCwgc2ltaWxhciAgdG8gcGFzc2luZyBhcmd1bWVudHMKKyAgICB0aHJvdWdoIExJTE8uIFRoaXMgd2lsbCBhbGxvdyBhIHBlciBhZGFwdGVyIGJvYXJkICBzZXQgdXAgb2YgZnVsbCBkdXBsZXgKKyAgICBhbmQgbWVkaWEuIFRoZSBvbmx5IGxleGljYWwgY29uc3RyYWludHMgIGFyZTogdGhlIGJvYXJkIG5hbWUgKGRldi0+bmFtZSkKKyAgICBhcHBlYXJzIGluIHRoZSBsaXN0IGJlZm9yZSBpdHMgIHBhcmFtZXRlcnMuICBUaGUgbGlzdCBvZiBwYXJhbWV0ZXJzIGVuZHMKKyAgICBlaXRoZXIgYXQgdGhlIGVuZCBvZiB0aGUgcGFyYW1ldGVyIGxpc3Qgb3Igd2l0aCBhbm90aGVyIGJvYXJkIG5hbWUuICBUaGUKKyAgICBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgYWxsb3dlZDoKKworICAgICAgICAgICAgZmR4ICAgICAgICBmb3IgZnVsbCBkdXBsZXgKKwkgICAgYXV0b3NlbnNlICB0byBzZXQgdGhlIG1lZGlhL3NwZWVkOyB3aXRoIHRoZSBmb2xsb3dpbmcgCisJICAgICAgICAgICAgICAgc3ViLXBhcmFtZXRlcnM6CisJCSAgICAgICBUUCwgVFBfTlcsIEJOQywgQVVJLCBCTkNfQVVJLCAxMDBNYiwgMTBNYiwgQVVUTworCisgICAgQ2FzZSBzZW5zaXRpdml0eSBpcyBpbXBvcnRhbnQgIGZvciAgdGhlIHN1Yi1wYXJhbWV0ZXJzLiBUaGV5ICptdXN0KiAgIGJlCisgICAgdXBwZXIgY2FzZS4gRXhhbXBsZXM6CisKKyAgICAgICAgaW5zbW9kIGRlNHg1IGFyZ3M9J2V0aDE6ZmR4IGF1dG9zZW5zZT1CTkMgZXRoMDphdXRvc2Vuc2U9MTAwTWInLgorCisgICAgRm9yIGEgY29tcGlsZWQgaW4gZHJpdmVyLCBhdCBvciBhYm92ZSBsaW5lIDU0OCwgcGxhY2UgZS5nLgorCSNkZWZpbmUgREU0WDVfUEFSTSAiZXRoMDpmZHggYXV0b3NlbnNlPUFVSSBldGgyOmF1dG9zZW5zZT1UUCIKKworICAgIFllcywgIEkga25vdyBmdWxsIGR1cGxleCBpc24ndCAgcGVybWlzc2libGUgb24gQk5DICBvciBBVUk7IHRoZXkncmUganVzdAorICAgIGV4YW1wbGVzLiBCeSBkZWZhdWx0LCBmdWxsIGR1cGxleCBpcyB0dXJuZWQgb2ZmIGFuZCAgQVVUTyBpcyB0aGUgZGVmYXVsdAorICAgIGF1dG9zZW5zZSBzZXR0aW5nLiAgSW4gcmVhbGl0eSwgSSBleHBlY3Qgb25seSAgdGhlIGZ1bGwgZHVwbGV4IG9wdGlvbiB0bworICAgIGJlIHVzZWQuIE5vdGUgdGhlIHVzZSBvZiBzaW5nbGUgcXVvdGVzIGluIHRoZSB0d28gZXhhbXBsZXMgYWJvdmUgYW5kIHRoZQorICAgIGxhY2sgb2YgY29tbWFzIHRvIHNlcGFyYXRlIGl0ZW1zLiBBTFNPLCB5b3UgbXVzdCBnZXQgdGhlIHJlcXVlc3RlZCBtZWRpYQorICAgIGNvcnJlY3QgaW4gcmVsYXRpb24gdG8gd2hhdCB0aGUgYWRhcHRlciBTUk9NIHNheXMgaXQgaGFzLiBUaGVyZSdzIG5vIHdheQorICAgIHRvICBkZXRlcm1pbmUgdGhpcyBpbiAgYWR2YW5jZSBvdGhlciB0aGFuIGJ5ICB0cmlhbCBhbmQgZXJyb3IgYW5kIGNvbW1vbgorICAgIHNlbnNlLCBlLmcuIGNhbGwgYSBCTkMgY29ubmVjdG9yZWQgcG9ydCAnQk5DJywgbm90ICcxME1iJy4KKworICAgIENoYW5nZWQgdGhlIGJ1cyBwcm9iaW5nLiAgRUlTQSB1c2VkIHRvIGJlICBkb25lIGZpcnN0LCAgZm9sbG93ZWQgYnkgUENJLgorICAgIE1vc3QgcGVvcGxlIHByb2JhYmx5IGRvbid0IGV2ZW4ga25vdyAgd2hhdCBhIGRlNDI1IGlzIHRvZGF5IGFuZCB0aGUgRUlTQQorICAgIHByb2JlIGhhcyBtZXNzZWQgIHVwIHNvbWUgU0NTSSBjYXJkcyAgaW4gdGhlIHBhc3QsICBzbyBub3cgUENJIGlzIGFsd2F5cworICAgIHByb2JlZCAgZmlyc3QgIGZvbGxvd2VkIGJ5ICBFSVNBIGlmICBhKSB0aGUgYXJjaGl0ZWN0dXJlIGFsbG93cyBFSVNBIGFuZAorICAgIGVpdGhlciAgYikgdGhlcmUgaGF2ZSBiZWVuIG5vIFBDSSBjYXJkcyBkZXRlY3RlZCBvciAgYykgYW4gRUlTQSBwcm9iZSBpcworICAgIGZvcmNlZCBieSAgdGhlIHVzZXIuICBUbyBmb3JjZSAgYSBwcm9iZSAgaW5jbHVkZSAgImZvcmNlX2Vpc2EiICBpbiAgeW91cgorICAgIGluc21vZCAiYXJncyIgbGluZTsgIGZvciBidWlsdC1pbiBrZXJuZWxzIGVpdGhlciBjaGFuZ2UgdGhlIGRyaXZlciB0byBkbworICAgIHRoaXMgIGF1dG9tYXRpY2FsbHkgIG9yIGluY2x1ZGUgICNkZWZpbmUgREU0WDVfRk9SQ0VfRUlTQSAgb24gb3IgIGJlZm9yZQorICAgIGxpbmUgMTA0MCBpbiB0aGUgZHJpdmVyLgorCisgICAgVE8gRE86IAorICAgIC0tLS0tLQorCisgICAgUmV2aXNpb24gSGlzdG9yeQorICAgIC0tLS0tLS0tLS0tLS0tLS0KKworICAgIFZlcnNpb24gICBEYXRlICAgICAgICBEZXNjcmlwdGlvbgorICAKKyAgICAgIDAuMSAgICAgMTctTm92LTk0ICAgSW5pdGlhbCB3cml0aW5nLiBBTFBIQSBjb2RlIHJlbGVhc2UuCisgICAgICAwLjIgICAgIDEzLUphbi05NSAgIEFkZGVkIFBDSSBzdXBwb3J0IGZvciBERTQzNSdzLgorICAgICAgMC4yMSAgICAxOS1KYW4tOTUgICBBZGRlZCBhdXRvIG1lZGlhIGRldGVjdGlvbi4KKyAgICAgIDAuMjIgICAgMTAtRmViLTk1ICAgRml4IGludGVycnVwdCBoYW5kbGVyIGNhbGwgPGNocmlzQGNvc3kuc2JnLmFjLmF0Pi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRml4IHJlY29nbml0aW9uIGJ1ZyByZXBvcnRlZCBieSA8YmttQHN0YXIucmwuYWMudWs+LgorCQkJICBBZGQgcmVxdWVzdC9yZWxlYXNlX3JlZ2lvbiBjb2RlLgorCQkJICBBZGQgbG9hZGFibGUgbW9kdWxlcyBzdXBwb3J0IGZvciBQQ0kuCisJCQkgIENsZWFuIHVwIGxvYWRhYmxlIG1vZHVsZXMgc3VwcG9ydC4KKyAgICAgIDAuMjMgICAgMjgtRmViLTk1ICAgQWRkZWQgREMyMTA0MSBhbmQgREMyMTE0MCBzdXBwb3J0LiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRml4IG1pc3NlZCBmcmFtZSBjb3VudGVyIHZhbHVlIGFuZCBpbml0aWFsaXNhdGlvbi4KKwkJCSAgRml4ZWQgRUlTQSBwcm9iZS4KKyAgICAgIDAuMjQgICAgMTEtQXByLTk1ICAgQ2hhbmdlIGRlbGF5IHJvdXRpbmUgdG8gdXNlIDxsaW51eC91ZGVsYXk+LgorICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2UgVFhfQlVGRlNfQVZBSUwgbWFjcm8uCisJCQkgIENoYW5nZSBtZWRpYSBhdXRvZGV0ZWN0aW9uIHRvIGFsbG93IG1hbnVhbCBzZXR0aW5nLgorCQkJICBDb21wbGV0ZWQgREU1MDAgKERDMjExNDApIHN1cHBvcnQuCisgICAgICAwLjI0MSAgIDE4LUFwci05NSAgIEludGVyaW0gcmVsZWFzZSB3aXRob3V0IERFNTAwIEF1dG9zZW5zZSBBbGdvcml0aG0uCisgICAgICAwLjI0MiAgIDEwLU1heS05NSAgIE1pbm9yIGNoYW5nZXMuCisgICAgICAwLjMwICAgIDEyLUp1bi05NSAgIFRpbWVyIGZpeCBmb3IgREMyMTE0MC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydGFiaWxpdHkgY2hhbmdlcy4KKwkJCSAgQWRkIEFMUEhBIGNoYW5nZXMgZnJvbSA8amVzdGFicm9AYW50LnRheTEuZGVjLmNvbT4uCisJCQkgIEFkZCBERTUwMCBzZW1pIGF1dG9tYXRpYyBhdXRvc2Vuc2UuCisJCQkgIEFkZCBMaW5rIEZhaWwgaW50ZXJydXB0IFRQIGZhaWx1cmUgZGV0ZWN0aW9uLgorCQkJICBBZGQgdGltZXIgYmFzZWQgbGluayBjaGFuZ2UgZGV0ZWN0aW9uLgorCQkJICBQbHVnZ2VkIGEgbWVtb3J5IGxlYWsgaW4gZGU0eDVfcXVldWVfcGt0KCkuCisgICAgICAwLjMxICAgIDEzLUp1bi05NSAgIEZpeGVkIFBDSSBzdHVmZiBmb3IgMS4zLjEuCisgICAgICAwLjMyICAgIDI2LUp1bi05NSAgIEFkZGVkIHZlcmlmeV9hcmVhKCkgY2FsbHMgaW4gZGU0eDVfaW9jdGwoKSBmcm9tIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbiBieSA8aGVpa29AY29sb3NzdXMuZXNjYXBlLmRlPi4KKyAgICAgIDAuMzMgICAgIDgtQXVnLTk1ICAgQWRkIHNoYXJlZCBpbnRlcnJ1cHQgc3VwcG9ydCAobm90IHJlbGVhc2VkIHlldCkuCisgICAgICAwLjMzMSAgIDIxLUF1Zy05NSAgIEZpeCBkZTR4NV9vcGVuKCkgd2l0aCBmYXN0IENQVXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeCBkZTR4NV9pbnRlcnJ1cHQoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRml4IGRjMjExNDBfYXV0b2NvbmYoKSBtZXNzLgorCQkJICBObyBzaGFyZWQgaW50ZXJydXB0IHN1cHBvcnQuCisgICAgICAwLjMzMiAgIDExLVNlcC05NSAgIEFkZGVkIE1JSSBtYW5hZ2VtZW50IGludGVyZmFjZSByb3V0aW5lcy4KKyAgICAgIDAuNDAgICAgIDUtTWFyLTk2ICAgRml4IHNldHVwIGZyYW1lIHRpbWVvdXQgPG1hYXJ0ZW5iQGhwa3VpcGMuY2Vybi5jaD4uCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBrZXJuZWwgdGltZXIgY29kZSAoaC93IGlzIHRvbyBmbGFreSkuCisJCQkgIEFkZCBNSUkgYmFzZWQgUEhZIGF1dG9zZW5zZS4KKwkJCSAgQWRkIG5ldyBtdWx0aWNhc3RpbmcgY29kZS4KKwkJCSAgQWRkIG5ldyBhdXRvc2Vuc2UgYWxnb3JpdGhtcyBmb3IgbWVkaWEvbW9kZSAKKwkJCSAgc2VsZWN0aW9uIHVzaW5nIGtlcm5lbCBzY2hlZHVsaW5nL3RpbWluZy4KKwkJCSAgUmUtZm9ybWF0dGVkLgorCQkJICBNYWRlIGNoYW5nZXMgc3VnZ2VzdGVkIGJ5IDxqZWZmQHJvdXRlci5wYXRjaC5uZXQ+OgorCQkJICAgIENoYW5nZSBkcml2ZXIgdG8gZGV0ZWN0IGFsbCBERUNjaGlwIGJhc2VkIGNhcmRzCisJCQkgICAgd2l0aCBERUNfT05MWSByZXN0cmljdGlvbiBhIHNwZWNpYWwgY2FzZS4KKwkJCSAgICBDaGFuZ2VkIGRyaXZlciB0byBhdXRvcHJvYmUgYXMgYSBtb2R1bGUuIE5vIGlycQorCQkJICAgIGNoZWNraW5nIGlzIGRvbmUgbm93IC0gYXNzdW1lIEJJT1MgaXMgZ29vZCEKKwkJCSAgQWRkZWQgU01DOTMzMiBkZXRlY3Rpb24gPG1hbmFiZUBSb3kuZHNsLnR1dGljcy5hYy5qcD4KKyAgICAgIDAuNDEgICAgMjEtTWFyLTk2ICAgRG9uJ3QgY2hlY2sgZm9yIGdldF9od19hZGRyIGNoZWNrc3VtIHVubGVzcyBERUMgY2FyZAorICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IDxuaWxlc0BheHA3NDVnc2ZjLm5hc2EuZ292PgorCQkJICBGaXggZm9yIG11bHRpcGxlIFBDSSBjYXJkcyByZXBvcnRlZCBieSA8am9zQHhvcy5ubD4KKwkJCSAgRHVoLCBwdXQgdGhlIFNBX1NISVJRIGZsYWcgaW50byByZXF1ZXN0X2ludGVycnVwdCgpLgorCQkJICBGaXggU01DIGV0aGVybmV0IGFkZHJlc3MgaW4gZW5ldF9kZXRbXS4KKwkJCSAgUHJpbnQgY2hpcCBuYW1lIGluc3RlYWQgb2YgIlVOS05PV04iIGR1cmluZyBib290LgorICAgICAgMC40MiAgICAyNi1BcHItOTYgICBGaXggTUlJIHdyaXRlIFRBIGJpdCBlcnJvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgRml4IGJ1ZyBpbiBkYzIxMDQwIGFuZCBkYzIxMDQxIGF1dG9zZW5zZSBjb2RlLgorCQkJICBSZW1vdmUgYnVmZmVyIGNvcGllcyBvbiByZWNlaXZlIGZvciBJbnRlbHMuCisJCQkgIENoYW5nZSBza19idWZmIGhhbmRsaW5nIGR1cmluZyBtZWRpYSBkaXNjb25uZWN0cyB0bworCQkJICAgZWxpbWluYXRlIERVUCBwYWNrZXRzLgorCQkJICBBZGQgZHluYW1pYyBUWCB0aHJlc2hvbGRpbmcuCisJCQkgIENoYW5nZSBhbGwgY2hpcHMgdG8gdXNlIHBlcmZlY3QgbXVsdGljYXN0IGZpbHRlcmluZy4KKwkJCSAgRml4IGFsbG9jX2RldmljZSgpIGJ1ZyA8amFyaUBtYXJra3VzMi5maW1yLmZpPgorICAgICAgMC40MyAgIDIxLUp1bi05NiAgICBGaXggdW5jb25uZWN0ZWQgbWVkaWEgVFggcmV0cnkgYnVnLgorICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgQWNjdG9uIHRvIHRoZSBsaXN0IG9mIGJyb2tlbiBjYXJkcy4KKwkJCSAgRml4IFRYIHVuZGVyLXJ1biBidWcgZm9yIG5vbiBEQzIxMTQwIGNoaXBzLgorCQkJICBGaXggYm9vdCBjb21tYW5kIHByb2JlIGJ1ZyBpbiBhbGxvY19kZXZpY2UoKSBhcworCQkJICAgcmVwb3J0ZWQgYnkgPGtvZW4uZ2FkZXluZUBiYXJjby5jb20+IGFuZCAKKwkJCSAgIDxvcmF2YUBuZXRoZXIudGt5Lmh1dC5maT4uCisJCQkgIEFkZCBjYWNoZSBsb2NrcyB0byBwcmV2ZW50IGEgcmFjZSBjb25kaXRpb24gYXMKKwkJCSAgIHJlcG9ydGVkIGJ5IDxjc2RAbWljcm9wbGV4LmNvbT4gYW5kIAorCQkJICAgPGJhYmFAYmVja21hbi51aXVjLmVkdT4uCisJCQkgIFVwZ3JhZGVkIGFsbG9jX2RldmljZSgpIGNvZGUuCisgICAgICAwLjQzMSAgMjgtSnVuLTk2ICAgIEZpeCBwb3RlbnRpYWwgYnVnIGluIHF1ZXVlX3BrdCgpIGZyb20gZGlzY3Vzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIDxjc2RAbWljcm9wbGV4LmNvbT4KKyAgICAgIDAuNDQgICAxMy1BdWctOTYgICAgRml4IFJYIG92ZXJmbG93IGJ1ZyBpbiAyMTE0WzAyM10gY2hpcHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeCBFSVNBIHByb2JlIGJ1Z3MgcmVwb3J0ZWQgYnkgPG9zMkBrcGkua2hhcmtvdi51YT4KKwkJCSAgYW5kIDxtaWNoYWVsQGNvbXB1cmV4LmNvbT4uCisgICAgICAwLjQ0MSAgIDktU2VwLTk2ICAgIENoYW5nZSBkYzIxMDQxX2F1dG9jb25mKCkgdG8gcHJvYmUgcXVpZXQgQk5DIG1lZGlhCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgbG9vcGJhY2sgcGFja2V0LgorICAgICAgMC40NDIgICA5LVNlcC05NiAgICBJbmNsdWRlIEFVSSBpbiBkYzIxMDQxIG1lZGlhIHByaW50b3V0LiBCdWcgcmVwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IDxiaGF0QG11bmRvb2suY3MubXUuT1ouQVU+CisgICAgICAwLjQ1ICAgIDgtRGVjLTk2ICAgIEluY2x1ZGUgZW5kaWFuIGZ1bmN0aW9ucyBmb3IgUFBDIHVzZSwgZnJvbSB3b3JrIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPGNvcnRAY3Mubm10LmVkdT4gYW5kIDxnLnRob21hc0BvcGVuZ3JvdXAub3JnPi4KKyAgICAgIDAuNDUxICAyOC1EZWMtOTYgICAgQWRkZWQgZml4IHRvIGFsbG93IGF1dG9wcm9iZSBmb3IgbW9kdWxlcyBhZnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbiBmcm9tIDxtamFjb2JAZmVyYWwuY29tPi4KKyAgICAgIDAuNSAgICAzMC1KYW4tOTcgICAgQWRkZWQgU1JPTSBkZWNvZGluZyBmdW5jdGlvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZWQgZGVidWcgZmxhZ3MuCisJCQkgIEZpeCBzbGVlcC93YWtldXAgY2FsbHMgZm9yIFBDSSBjYXJkcywgYnVnIHJlcG9ydGVkCisJCQkgICBieSA8Y3Jvc3NAZ3dlZXAubGtnLmRlYy5jb20+LgorCQkJICBBZGRlZCBtdWx0aS1NQUMsIG9uZSBTUk9NIGZlYXR1cmUgZnJvbSBkaXNjdXNzaW9uCisJCQkgICB3aXRoIDxtamFjb2JAZmVyYWwuY29tPi4KKwkJCSAgQWRkZWQgZnVsbCBtb2R1bGUgYXV0b3Byb2JlIGNhcGFiaWxpdHkuCisJCQkgIEFkZGVkIGF0dGVtcHQgdG8gdXNlIGFuIFNNQzkzMzIgd2l0aCBicm9rZW4gU1JPTS4KKwkJCSAgQWRkZWQgZml4IGZvciBaWU5YIG11bHRpLW1hYyBjYXJkcyB0aGF0IGRpZG4ndAorCQkJICAgZ2V0IHRoZWlyIElSUXMgd2lyZWQgY29ycmVjdGx5LgorICAgICAgMC41MSAgIDEzLUZlYi05NyAgICBBZGRlZCBlbmRpYW4gZml4ZXMgZm9yIHRoZSBTUk9NIGFjY2Vzc2VzIGZyb20KKwkJCSAgIDxwYXViZXJ0QGlyYW0uZXM+CisJCQkgIEZpeCBpbml0X2Nvbm5lY3Rpb24oKSB0byByZW1vdmUgZXh0cmEgZGV2aWNlIHJlc2V0LgorCQkJICBGaXggTUFDL1BIWSByZXNldCBvcmRlcmluZyBpbiBkYzIxMTQwbV9hdXRvY29uZigpLgorCQkJICBGaXggaW5pdGlhbGlzYXRpb24gcHJvYmxlbSB3aXRoIGxwLT50aW1lb3V0IGluCisJCQkgICB0eXBlWF9pbmZvYmxvY2soKSBmcm9tIDxwYXViZXJ0QGlyYW0uZXM+LgorCQkJICBGaXggTUlJIFBIWSByZXNldCBwcm9ibGVtIGZyb20gd29yayBkb25lIGJ5CisJCQkgICA8cGF1YmVydEBpcmFtLmVzPi4KKyAgICAgIDAuNTIgICAyNi1BcHItOTcgICAgU29tZSBjaGFuZ2VzIG1heSBub3QgY3JlZGl0IHRoZSByaWdodCBwZW9wbGUgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBkaXNrIGNyYXNoIG1lYW50IEkgbG9zdCBzb21lIG1haWwuCisJCQkgIENoYW5nZSBSWCBpbnRlcnJ1cHQgcm91dGluZSB0byBkcm9wIHJhdGhlciB0aGFuIAorCQkJICAgZGVmZXIgcGFja2V0cyB0byBhdm9pZCBoYW5nIHJlcG9ydGVkIGJ5IAorCQkJICAgPGcudGhvbWFzQG9wZW5ncm91cC5vcmc+LgorCQkJICBGaXggc3JvbV9leGVjKCkgdG8gcmV0dXJuIGZvciBDT01QQUNUIGFuZCB0eXBlIDEKKwkJCSAgIGluZm9ibG9ja3MuCisJCQkgIEFkZGVkIERDMjExNDIgYW5kIERDMjExNDMgZnVuY3Rpb25zLgorCQkJICBBZGRlZCBieXRlIGNvdW50ZXJzIGZyb20gPHBoaWxAdGF6ZW5kYS5kZW1vbi5jby51az4KKwkJCSAgQWRkZWQgU0FfSU5URVJSVVBUIHRlbXBvcmFyeSBmaXggZnJvbSAKKwkJCSAgIDxtamFjb2JAZmVyYWwuY29tPi4KKyAgICAgIDAuNTMgICAxMi1Ob3YtOTcgICAgRml4IHRoZSAqX3Byb2JlKCkgdG8gaW5jbHVkZSAnZXRoPz8nIG5hbWUgZHVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgbG9hZDogYnVnIHJlcG9ydGVkIGJ5CisJCQkgICA8UGlldGUuQnJvb2tzQGNsLmNhbS5hYy51az4KKwkJCSAgRml4IG11bHRpLU1BQywgb25lIFNST00sIHRvIHdvcmsgd2l0aCAyMTE0eCBjaGlwczoKKwkJCSAgIGJ1ZyByZXBvcnRlZCBieSA8Y21ldHpAaW5uZXIubmV0Pi4KKwkJCSAgTWFrZSBhYm92ZSBzZWFyY2ggaW5kZXBlbmRlbnQgb2YgQklPUyBkZXZpY2Ugc2NhbgorCQkJICAgZGlyZWN0aW9uLgorCQkJICBDb21wbGV0ZWQgREMyMTE0WzIzXSBhdXRvc2Vuc2UgZnVuY3Rpb25zLgorICAgICAgMC41MzEgIDIxLURlYy05NyAgICBGaXggREU1MDAtWEEgMTAwTWIvcyBidWcgcmVwb3J0ZWQgYnkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8cm9iaW5AaW50ZXJjb3JlLmNvbQorCQkJICBGaXggdHlwZTFfaW5mb2Jsb2NrKCkgYnVnIGludHJvZHVjZWQgaW4gMC41MywgZnJvbQorCQkJICAgcHJvYmxlbSByZXBvcnRzIGJ5IAorCQkJICAgPHBhcm1lZUBwb3N0ZWNzcy5uY3JmcmFuLmZyYW5jZS5uY3IuY29tPiBhbmQKKwkJCSAgIDxqb0BpY2UuZGlsbGluZ2VuLmJheW5ldC5kZT4uCisJCQkgIEFkZGVkIGFyZ3VtZW50IGxpc3QgdG8gc2V0IHVwIGVhY2ggYm9hcmQgZnJvbSBlaXRoZXIKKwkJCSAgIGEgbW9kdWxlJ3MgY29tbWFuZCBsaW5lIG9yIGEgY29tcGlsZWQgaW4gI2RlZmluZS4KKwkJCSAgQWRkZWQgZ2VuZXJpYyBNSUkgUEhZIGZ1bmN0aW9uYWxpdHkgdG8gZGVhbCB3aXRoCisJCQkgICBuZXdlciBQSFkgY2hpcHMuCisJCQkgIEZpeCB0aGUgbWVzcyBpbiAyLjEuNjcuCisgICAgICAwLjUzMiAgIDUtSmFuLTk4ICAgIEZpeCBidWcgaW4gbWlpX2dldF9waHkoKSByZXBvcnRlZCBieSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWRoYXRAY29jb2NvLm5ldD4uCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeCBidWcgaW4gcGNpX3Byb2JlKCkgZm9yIDY0IGJpdCBzeXN0ZW1zIHJlcG9ydGVkCisJCQkgICBieSA8YmVsbGlvdHRAYWNjZXNzb25lLmNvbT4uCisgICAgICAwLjUzMyAgIDktSmFuLTk4ICAgIEZpeCBtb3JlIDY0IGJpdCBidWdzIHJlcG9ydGVkIGJ5IDxqYWxAY3MuYnJvd24uZWR1Pi4KKyAgICAgIDAuNTM0ICAyNC1KYW4tOTggICAgRml4IGxhc3QgKD8pIGVuZGlhbiBidWcgZnJvbSA8Z2VlcnRAbGludXgtbTY4ay5vcmc+CisgICAgICAwLjUzNSAgMjEtRmViLTk4ICAgIEZpeCBFdGhlcm5ldCBBZGRyZXNzIFBST00gcmVzZXQgYnVnIGZvciBEQzIxMDQwLgorICAgICAgMC41MzYgIDIxLU1hci05OCAgICBDaGFuZ2UgcGNpX3Byb2JlKCkgdG8gdXNlIHRoZSBwY2lfZGV2IHN0cnVjdHVyZS4KKwkJCSAgKipJbmNvbXBhdGlibGUgd2l0aCAyLjAueCBmcm9tIGhlcmUuKioKKyAgICAgIDAuNTQwICAgNS1KdWwtOTggICAgQXRvbWljaXplIGFzc2VydGlvbiBvZiBkZXYtPmludGVycnVwdCBmb3IgU01QCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIDxsbWFAdmFyZXNlYXJjaC5jb20+CisJCQkgIEFkZCBUUCwgQVVJIGFuZCBCTkMgY2FzZXMgdG8gMjExNDBtX2F1dG9jb25mKCkgZm9yCisJCQkgICBjYXNlIHdoZXJlIGEgMjExNDAgdW5kZXIgU1JPTSBjb250cm9sIHVzZXMsIGUuZy4gQVVJCisJCQkgICBmcm9tIHByb2JsZW0gcmVwb3J0IGJ5IDxkZWxjaGluaUBscG5wMDkuaW4ycDMuZnI+CisJCQkgIEFkZCBNSUkgcGFyYWxsZWwgZGV0ZWN0aW9uIHRvIDIxMTR4X2F1dG9jb25mKCkgZm9yCisJCQkgICBjYXNlIHdoZXJlIG5vIGF1dG9uZWdvdGlhdGlvbiBwYXJ0bmVyIGV4aXN0cyBmcm9tCisJCQkgICBwcm9ibGVtIHJlcG9ydCBieSA8bWxhcHNsZXlAbmRpcmVjdC5jby51az4uCisJCQkgIEFkZCBhYmlsaXR5IHRvIGZvcmNlIGNvbm5lY3Rpb24gdHlwZSBkaXJlY3RseSBldmVuCisJCQkgICB3aGVuIHVzaW5nIFNST00gY29udHJvbCBmcm9tIHByb2JsZW0gcmVwb3J0IGJ5CisJCQkgICA8ZWFybEBleGlzLm5ldD4uCisJCQkgIFVwZGF0ZWQgdGhlIFBDSSBpbnRlcmZhY2UgdG8gY29uZm9ybSB3aXRoIHRoZSBsYXRlc3QKKwkJCSAgIHZlcnNpb24uIEkgaG9wZSBub3RoaW5nIGlzIGJyb2tlbi4uLgorICAgICAgICAgIAkJICBBZGQgVFggZG9uZSBpbnRlcnJ1cHQgbW9kaWZpY2F0aW9uIGZyb20gc3VnZ2VzdGlvbgorCQkJICAgYnkgPEF1c3Rpbi5Eb25uZWxseUBjbC5jYW0uYWMudWs+LgorCQkJICBGaXggaXNfYW5jX2NhcGFibGUoKSBidWcgcmVwb3J0ZWQgYnkgCisJCQkgICA8QXVzdGluLkRvbm5lbGx5QGNsLmNhbS5hYy51az4uCisJCQkgIEZpeCB0eXBlWzEzXV9pbmZvYmxvY2soKSBidWc6IGR1cmluZyBNSUkgc2VhcmNoLCBQSFkKKwkJCSAgIGxwLT5yc3Qgbm90IHJ1biBiZWNhdXNlIGxwLT5pYm4gbm90IGluaXRpYWxpc2VkIC0KKwkJCSAgIGZyb20gcmVwb3J0ICYgZml4IGJ5IDxwYXViZXJ0QGlyYW0uZXM+LgorCQkJICBGaXggcHJvYmUgYnVnIHdpdGggRUlTQSAmIFBDSSBjYXJkcyBwcmVzZW50IGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydCBieSA8ZWlyaWtAbmV0Y29tLmNvbT4uCisgICAgICAwLjU0MSAgMjQtQXVnLTk4ICAgIEZpeCBjb21waWxlciBwcm9ibGVtcyBhc3NvY2lhdGVkIHdpdGggaTM4Ni1zdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wcyBmcm9tIG11bHRpcGxlIGJ1ZyByZXBvcnRzIGFuZCB0ZW1wb3JhcnkgZml4CisJCQkgICBmcm9tIDxwYXViZXJ0QGlyYW0uZXM+LgorCQkJICBGaXggcGNpX3Byb2JlKCkgdG8gY29ycmVjdGx5IGVtdWxhdGUgdGhlIG9sZAorCQkJICAgcGNpYmlvc19maW5kX2NsYXNzKCkgZnVuY3Rpb24uCisJCQkgIEFkZCBhbl9leGNlcHRpb24oKSBmb3Igb2xkIFpZTlgzNDYgYW5kIGZpeCBjb21waWxlCisJCQkgICB3YXJuaW5nIG9uIFBQQyAmIFNQQVJDLCBmcm9tIDxlY2RAc2t5bmV0LmJlPi4KKwkJCSAgRml4IGxhc3RQQ0kgdG8gY29ycmVjdGx5IHdvcmsgd2l0aCBjb21waWxlZCBpbgorCQkJICAga2VybmVscyBhbmQgbW9kdWxlcyBmcm9tIGJ1ZyByZXBvcnQgYnkgCisJCQkgICA8WmxhdGtvLkNhbHVzaWNAQ0FSTmV0LmhyPiBldCBhbC4KKyAgICAgIDAuNTQyICAxNS1TZXAtOTggICAgRml4IGRjMjExNHhfYXV0b2NvbmYoKSB0byBzdG9wIG11bHRpcGxlIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIG1lZGlhIGlzIHVuY29ubmVjdGVkLgorCQkJICBDaGFuZ2UgZGV2LT5pbnRlcnJ1cHQgdG8gbHAtPmludGVycnVwdCB0byBlbnN1cmUKKwkJCSAgIGFsaWdubWVudCBmb3IgQWxwaGEncyBhbmQgYXZvaWQgdGhlaXIgdW5hbGlnbmVkCisJCQkgICBhY2Nlc3MgdHJhcHMuIFRoaXMgZmxhZyBpcyBtZXJlbHkgZm9yIGxvZyBtZXNzYWdlczoKKwkJCSAgIHNob3VsZCBkbyBzb21ldGhpbmcgbW9yZSBkZWZpbml0aXZlIHRob3VnaC4uLgorICAgICAgMC41NDMgIDMwLURlYy05OCAgICBBZGQgU01QIHNwaW4gbG9ja2luZy4KKyAgICAgIDAuNTQ0ICAgOC1NYXktOTkgICAgRml4IGZvciBidWdneSBTUk9NIGluIE1vdG9yb2xhIGVtYmVkZGVkIGJvYXJkcyB1c2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAyMTE0MyBieSA8bW1wb3J0ZXJAaG9tZS5jb20+LgorCQkJICBDaGFuZ2UgUENJL0VJU0EgYnVzIHByb2Jpbmcgb3JkZXIuCisgICAgICAwLjU0NSAgMjgtTm92LTk5ICAgIEZ1cnRoZXIgTW90byBTUk9NIGJ1ZyBmaXggZnJvbSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtcG9ydGVyQGVuZy5tY2QubW90LmNvbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIGRvdWJsZSBjaGVja2luZyBmb3IgREVCVUdfUlggaW4gZGU0eDVfZGJnX3J4KCkKKwkJCSAgIGZyb20gcmVwb3J0IGJ5IDxnZWVydEBsaW51eC1tNjhrLm9yZz4KKyAgICAgIDAuNTQ2ICAyMi1GZWItMDEgICAgRml4ZXMgQWxwaGEgWFAxMDAwIG9vcHMuICBUaGUgc3JvbV9zZWFyY2ggZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcyBjYXVzaW5nIGEgcGFnZSBmYXVsdCB3aGVuIGluaXRpYWxpemluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlICdwYicsIG9uIGEgbm9uIGRlNHg1IFBDSSBkZXZpY2UsIGluIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYSBQQ0kgYnJpZGdlIChERUMgY2hpcCAyMTE1MikuIFRoZSB2YWx1ZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BiJyBpcyBub3cgb25seSBpbml0aWFsaXplZCBpZiBhIGRlNHg1IGNoaXAgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnQuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZyYW5jZUBoYW5kaGVsZHMub3JnPiAgCisgICAgICAwLjU0NyAgMDgtTm92LTAxICAgIFVzZSBsaWJyYXJ5IGNyYzMyIGZ1bmN0aW9ucyBieSA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgICAgICAwLjU0OCAgMzAtQXVnLTAzICAgIEJpZyAyLjYgY2xlYW51cC4gUG9ydGVkIHRvIFBDSS9FSVNBIHByb2JpbmcgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljIERNQSBBUElzLiBGaXhlZCBERTQyNSBzdXBwb3J0IG9uIEFscGhhLgorCQkJICAgPG1hekB3aWxkLXdpbmQuZnIuZXUub3JnPgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9laXNhLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2lmZGVmIENPTkZJR19QUENfTVVMVElQTEFURk9STQorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjZW5kaWYgLyogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNICovCisKKyNpbmNsdWRlICJkZTR4NS5oIgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9ICJkZTR4NS5jOlYwLjU0NiAyMDAxLzAyLzIyIGRhdmllc0BtYW5pYWMudWx0cmFuZXQuY29tXG4iOworCisjZGVmaW5lIGNfY2hhciBjb25zdCBjaGFyCisjZGVmaW5lIFRXSURETEUoYSkgKHVfc2hvcnQpbGUxNl90b19jcHUoZ2V0X3VuYWxpZ25lZCgodV9zaG9ydCAqKShhKSkpCisKKy8qCisqKiBNSUkgSW5mb3JtYXRpb24KKyovCitzdHJ1Y3QgcGh5X3RhYmxlIHsKKyAgICBpbnQgcmVzZXQ7ICAgICAgICAgICAgICAvKiBIYXJkIHJlc2V0IHJlcXVpcmVkPyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBpZDsgICAgICAgICAgICAgICAgIC8qIElFRUUgT1VJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IHRhOyAgICAgICAgICAgICAgICAgLyogT25lIGN5Y2xlIFRBIHRpbWUgLSA4MDIuM3UgaXMgY29uZnVzaW5nIGhlcmUgKi8KKyAgICBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAvKiBOb24gYXV0b25lZ290aWF0aW9uIChwYXJhbGxlbCkgc3BlZWQgZGV0LiAgICAqLworCWludCByZWc7CisJaW50IG1hc2s7CisJaW50IHZhbHVlOworICAgIH0gc3BkOworfTsKKworc3RydWN0IG1paV9waHkgeworICAgIGludCByZXNldDsgICAgICAgICAgICAgIC8qIEhhcmQgcmVzZXQgcmVxdWlyZWQ/ICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IGlkOyAgICAgICAgICAgICAgICAgLyogSUVFRSBPVUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgdGE7ICAgICAgICAgICAgICAgICAvKiBPbmUgY3ljbGUgVEEgdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHN0cnVjdCB7ICAgICAgICAgICAgICAgIC8qIE5vbiBhdXRvbmVnb3RpYXRpb24gKHBhcmFsbGVsKSBzcGVlZCBkZXQuICovCisJaW50IHJlZzsKKwlpbnQgbWFzazsKKwlpbnQgdmFsdWU7CisgICAgfSBzcGQ7CisgICAgaW50IGFkZHI7ICAgICAgICAgICAgICAgLyogTUlJIGFkZHJlc3MgZm9yIHRoZSBQSFkgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1X2NoYXIgICpnZXA7ICAgICAgICAgICAvKiBTdGFydCBvZiBHRVAgc2VxdWVuY2UgYmxvY2sgaW4gU1JPTSAgICAgICAqLworICAgIHVfY2hhciAgKnJzdDsgICAgICAgICAgIC8qIFN0YXJ0IG9mIHJlc2V0IHNlcXVlbmNlIGluIFNST00gICAgICAgICAgICovCisgICAgdV9pbnQgbWM7ICAgICAgICAgICAgICAgLyogTWVkaWEgQ2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1X2ludCBhbmE7ICAgICAgICAgICAgICAvKiBOV2F5IEFkdmVydGlzZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVfaW50IGZkeDsgICAgICAgICAgICAgIC8qIEZ1bGwgRHVwbGVYIGNhcGFiaWxpdGVzIGZvciBlYWNoIG1lZGlhICAgICovCisgICAgdV9pbnQgdHRtOyAgICAgICAgICAgICAgLyogVHJhbnNtaXQgVGhyZXNob2xkIE1vZGUgZm9yIGVhY2ggbWVkaWEgICAgKi8KKyAgICB1X2ludCBtY2k7ICAgICAgICAgICAgICAvKiAyMTE0MiBNSUkgQ29ubmVjdG9yIEludGVycnVwdCBpbmZvICAgICAgICAqLworfTsKKworI2RlZmluZSBERTRYNV9NQVhfUEhZIDggICAgIC8qIEFsbG93IHVwdG8gOCBhdHRhY2hlZCBQSFkgZGV2aWNlcyBwZXIgYm9hcmQgKi8KKworc3RydWN0IHNpYV9waHkgeworICAgIHVfY2hhciBtYzsgICAgICAgICAgICAgIC8qIE1lZGlhIENvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdV9jaGFyIGV4dDsgICAgICAgICAgICAgLyogY3NyMTMtMTUgdmFsaWQgd2hlbiBzZXQgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgY3NyMTM7ICAgICAgICAgICAgICAvKiBTSUEgQ29ubmVjdGl2aXR5IFJlZ2lzdGVyICAgICAgICAgICAgICAgICAqLworICAgIGludCBjc3IxNDsgICAgICAgICAgICAgIC8qIFNJQSBUWC9SWCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IGNzcjE1OyAgICAgICAgICAgICAgLyogU0lBIEdlbmVyYWwgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgZ2VwYzsgICAgICAgICAgICAgICAvKiBTSUEgR0VQIENvbnRyb2wgSW5mb3JtYXRpb24gICAgICAgICAgICAgICAqLworICAgIGludCBnZXA7ICAgICAgICAgICAgICAgIC8qIFNJQSBHRVAgRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9OworCisvKgorKiogRGVmaW5lIHRoZSBrbm93IHVuaXZlcnNlIG9mIFBIWSBkZXZpY2VzIHRoYXQgY2FuIGJlCisqKiByZWNvZ25pc2VkIGJ5IHRoaXMgZHJpdmVyLgorKi8KK3N0YXRpYyBzdHJ1Y3QgcGh5X3RhYmxlIHBoeV9pbmZvW10gPSB7CisgICAgezAsIE5BVElPTkFMX1RYLCAxLCB7MHgxOSwgMHg0MCwgMHgwMH19LCAgICAgICAvKiBOYXRpb25hbCBUWCAgICAgICovCisgICAgezEsIEJST0FEQ09NX1Q0LCAxLCB7MHgxMCwgMHgwMiwgMHgwMn19LCAgICAgICAvKiBCcm9hZGNvbSBUNCAgICAgICovCisgICAgezAsIFNFRVFfVDQgICAgLCAxLCB7MHgxMiwgMHgxMCwgMHgxMH19LCAgICAgICAvKiBTRUVRIFQ0ICAgICAgICAgICovCisgICAgezAsIENZUFJFU1NfVDQgLCAxLCB7MHgwNSwgMHgyMCwgMHgyMH19LCAgICAgICAvKiBDeXByZXNzIFQ0ICAgICAgICovCisgICAgezAsIDB4NzgxMCAgICAgLCAxLCB7MHgxNCwgMHgwODAwLCAweDA4MDB9fSAgICAvKiBMZXZlbCBPbmUgTFRYOTcwICovCit9OworCisvKgorKiogVGhlc2UgR0VORVJJQyB2YWx1ZXMgYXNzdW1lcyB0aGF0IHRoZSBQSFkgZGV2aWNlcyBmb2xsb3cgODAyLjN1IGFuZAorKiogYWxsb3cgcGFyYWxsZWwgZGV0ZWN0aW9uIHRvIHNldCB0aGUgbGluayBwYXJ0bmVyIGFiaWxpdHkgcmVnaXN0ZXIuCisqKiBEZXRlY3Rpb24gb2YgMTAwQmFzZS1UWCBbSC9GIER1cGxleF0gYW5kIDEwMEJhc2UtVDQgaXMgc3VwcG9ydGVkLgorKi8KKyNkZWZpbmUgR0VORVJJQ19SRUcgICAweDA1ICAgICAgLyogQXV0b25lZy4gTGluayBQYXJ0bmVyIEFkdmVydGlzZW1lbnQgUmVnLiAqLworI2RlZmluZSBHRU5FUklDX01BU0sgIE1JSV9BTkxQQV8xMDBNIC8qIEFsbCAxMDBNYi9zIFRlY2hub2xvZ2llcyAgICAgICAgICAgICovCisjZGVmaW5lIEdFTkVSSUNfVkFMVUUgTUlJX0FOTFBBXzEwME0gLyogMTAwQi1UWCwgMTAwQi1UWCBGRFgsIDEwMEItVDQgICAgICAgKi8KKworLyoKKyoqIERlZmluZSBzcGVjaWFsIFNST00gZGV0ZWN0aW9uIGNhc2VzCisqLworc3RhdGljIGNfY2hhciBlbmV0X2RldFtdW0VUSF9BTEVOXSA9IHsKKyAgICB7MHgwMCwgMHgwMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMH0sCisgICAgezB4MDAsIDB4MDAsIDB4ZTgsIDB4MDAsIDB4MDAsIDB4MDB9Cit9OworCisjZGVmaW5lIFNNQyAgICAxCisjZGVmaW5lIEFDQ1RPTiAyCisKKy8qCisqKiBTUk9NIFJlcGFpciBkZWZpbml0aW9ucy4gSWYgYSBicm9rZW4gU1JPTSBpcyBkZXRlY3RlZCBhIGNhcmQgbWF5CisqKiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBoZWxwIGZpZ3VyZSBvdXQgd2hhdCB0byBkby4gVGhpcyBpcyBhCisqKiAic3RhYiBpbiB0aGUgZGFyayIgYW5kIHNvIGZhciBmb3IgU01DOTMzMidzIG9ubHkuCisqLworc3RhdGljIGNfY2hhciBzcm9tX3JlcGFpcl9pbmZvW11bMTAwXSA9IHsKKyAgICB7MHgwMCwweDFlLDB4MDAsMHgwMCwweDAwLDB4MDgsICAgICAgICAgICAgIC8qIFNNQzkzMzIgKi8KKyAgICAgMHgxZiwweDAxLDB4OGYsMHgwMSwweDAwLDB4MDEsMHgwMCwweDAyLAorICAgICAweDAxLDB4MDAsMHgwMCwweDc4LDB4ZTAsMHgwMSwweDAwLDB4NTAsCisgICAgIDB4MDAsMHgxOCx9Cit9OworCisKKyNpZmRlZiBERTRYNV9ERUJVRworc3RhdGljIGludCBkZTR4NV9kZWJ1ZyA9IERFNFg1X0RFQlVHOworI2Vsc2UKKy8qc3RhdGljIGludCBkZTR4NV9kZWJ1ZyA9IChERUJVR19NSUkgfCBERUJVR19TUk9NIHwgREVCVUdfUENJQ0ZHIHwgREVCVUdfTUVESUEgfCBERUJVR19WRVJTSU9OKTsqLworc3RhdGljIGludCBkZTR4NV9kZWJ1ZyA9IChERUJVR19NRURJQSB8IERFQlVHX1ZFUlNJT04pOworI2VuZGlmCisKKy8qCisqKiBBbGxvdyBwZXIgYWRhcHRlciBzZXQgdXAuIEZvciBtb2R1bGVzIHRoaXMgaXMgc2ltcGx5IGEgY29tbWFuZCBsaW5lCisqKiBwYXJhbWV0ZXIsIGUuZy46IAorKiogaW5zbW9kIGRlNHg1IGFyZ3M9J2V0aDE6ZmR4IGF1dG9zZW5zZT1CTkMgZXRoMDphdXRvc2Vuc2U9MTAwTWInLgorKioKKyoqIEZvciBhIGNvbXBpbGVkIGluIGRyaXZlciwgcGxhY2UgZS5nLgorKiogICAgICNkZWZpbmUgREU0WDVfUEFSTSAiZXRoMDpmZHggYXV0b3NlbnNlPUFVSSBldGgyOmF1dG9zZW5zZT1UUCIKKyoqIGhlcmUKKyovCisjaWZkZWYgREU0WDVfUEFSTQorc3RhdGljIGNoYXIgKmFyZ3MgPSBERTRYNV9QQVJNOworI2Vsc2UKK3N0YXRpYyBjaGFyICphcmdzOworI2VuZGlmCisKK3N0cnVjdCBwYXJhbWV0ZXJzIHsKKyAgICBpbnQgZmR4OworICAgIGludCBhdXRvc2Vuc2U7Cit9OworCisjZGVmaW5lIERFNFg1X0FVVE9TRU5TRV9NUyAyNTAgICAgICAvKiBtc2VjIGF1dG9zZW5zZSB0aWNrIChERTUwMCkgKi8KKworI2RlZmluZSBERTRYNV9OREEgMHhmZmUwICAgICAgICAgICAgLyogTm8gRGV2aWNlIChJL08pIEFkZHJlc3MgKi8KKworLyoKKyoqIEV0aGVybmV0IFBST00gZGVmaW5lcworKi8KKyNkZWZpbmUgUFJPQkVfTEVOR1RIICAgIDMyCisjZGVmaW5lIEVUSF9QUk9NX1NJRyAgICAweEFBNTUwMEZGVUwKKworLyoKKyoqIEV0aGVybmV0IEluZm8KKyovCisjZGVmaW5lIFBLVF9CVUZfU1oJMTUzNiAgICAgICAgICAgIC8qIEJ1ZmZlciBzaXplIGZvciBlYWNoIFR4L1J4IGJ1ZmZlciAqLworI2RlZmluZSBJRUVFODAyXzNfU1ogICAgMTUxOCAgICAgICAgICAgIC8qIFBhY2tldCArIENSQyAqLworI2RlZmluZSBNQVhfUEtUX1NaICAgCTE1MTQgICAgICAgICAgICAvKiBNYXhpbXVtIGV0aGVybmV0IHBhY2tldCBsZW5ndGggKi8KKyNkZWZpbmUgTUFYX0RBVF9TWiAgIAkxNTAwICAgICAgICAgICAgLyogTWF4aW11bSBldGhlcm5ldCBkYXRhIGxlbmd0aCAqLworI2RlZmluZSBNSU5fREFUX1NaICAgCTEgICAgICAgICAgICAgICAvKiBNaW5pbXVtIGV0aGVybmV0IGRhdGEgbGVuZ3RoICovCisjZGVmaW5lIFBLVF9IRFJfTEVOICAgICAxNCAgICAgICAgICAgICAgLyogQWRkcmVzc2VzIGFuZCBkYXRhIGxlbmd0aCBpbmZvICovCisjZGVmaW5lIEZBS0VfRlJBTUVfTEVOICAoTUFYX1BLVF9TWiArIDEpCisjZGVmaW5lIFFVRVVFX1BLVF9USU1FT1VUICgzKkhaKSAgICAgICAgLyogMyBzZWNvbmQgdGltZW91dCAqLworCisKKy8qCisqKiBFSVNBIGJ1cyBkZWZpbmVzCisqLworI2RlZmluZSBERTRYNV9FSVNBX0lPX1BPUlRTICAgMHgwYzAwICAgIC8qIEkvTyBwb3J0IGJhc2UgYWRkcmVzcywgc2xvdCAwICovCisjZGVmaW5lIERFNFg1X0VJU0FfVE9UQUxfU0laRSAweDEwMCAgICAgLyogSS9PIGFkZHJlc3MgZXh0ZW50ICovCisKKyNkZWZpbmUgRUlTQV9BTExPV0VEX0lSUV9MSVNUICB7NSwgOSwgMTAsIDExfQorCisjZGVmaW5lIERFNFg1X1NJR05BVFVSRSB7IkRFNDI1IiwiREU0MzQiLCJERTQzNSIsIkRFNDUwIiwiREU1MDAifQorI2RlZmluZSBERTRYNV9OQU1FX0xFTkdUSCA4CisKK3N0YXRpYyBjX2NoYXIgKmRlNHg1X3NpZ25hdHVyZXNbXSA9IERFNFg1X1NJR05BVFVSRTsKKworLyoKKyoqIEV0aGVybmV0IFBST00gZGVmaW5lcyBmb3IgREMyMTA0MAorKi8KKyNkZWZpbmUgUFJPQkVfTEVOR1RIICAgIDMyCisjZGVmaW5lIEVUSF9QUk9NX1NJRyAgICAweEFBNTUwMEZGVUwKKworLyoKKyoqIFBDSSBCdXMgZGVmaW5lcworKi8KKyNkZWZpbmUgUENJX01BWF9CVVNfTlVNICAgICAgOAorI2RlZmluZSBERTRYNV9QQ0lfVE9UQUxfU0laRSAweDgwICAgICAgIC8qIEkvTyBhZGRyZXNzIGV4dGVudCAqLworI2RlZmluZSBERTRYNV9DTEFTU19DT0RFICAgICAweDAwMDIwMDAwIC8qIE5ldHdvcmsgY29udHJvbGxlciwgRXRoZXJuZXQgKi8KKworLyoKKyoqIE1lbW9yeSBBbGlnbm1lbnQuIEVhY2ggZGVzY3JpcHRvciBpcyA0IGxvbmd3b3JkcyBsb25nLiBUbyBmb3JjZSBhCisqKiBwYXJ0aWN1bGFyIGFsaWdubWVudCBvbiB0aGUgVFggZGVzY3JpcHRvciwgYWRqdXN0IERFU0NfU0tJUF9MRU4gYW5kCisqKiBERVNDX0FMSUdOLiBBTElHTiBhbGlnbnMgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHByaXZhdGUgbWVtb3J5IGFyZWEKKyoqIGFuZCBoZW5jZSB0aGUgUlggZGVzY3JpcHRvciByaW5nJ3MgZmlyc3QgZW50cnkuIAorKi8KKyNkZWZpbmUgREU0WDVfQUxJR040ICAgICAgKCh1X2xvbmcpNCAtIDEpICAgICAvKiAxIGxvbmd3b3JkIGFsaWduICovCisjZGVmaW5lIERFNFg1X0FMSUdOOCAgICAgICgodV9sb25nKTggLSAxKSAgICAgLyogMiBsb25nd29yZCBhbGlnbiAqLworI2RlZmluZSBERTRYNV9BTElHTjE2ICAgICAoKHVfbG9uZykxNiAtIDEpICAgIC8qIDQgbG9uZ3dvcmQgYWxpZ24gKi8KKyNkZWZpbmUgREU0WDVfQUxJR04zMiAgICAgKCh1X2xvbmcpMzIgLSAxKSAgICAvKiA4IGxvbmd3b3JkIGFsaWduICovCisjZGVmaW5lIERFNFg1X0FMSUdONjQgICAgICgodV9sb25nKTY0IC0gMSkgICAgLyogMTYgbG9uZ3dvcmQgYWxpZ24gKi8KKyNkZWZpbmUgREU0WDVfQUxJR04xMjggICAgKCh1X2xvbmcpMTI4IC0gMSkgICAvKiAzMiBsb25nd29yZCBhbGlnbiAqLworCisjZGVmaW5lIERFNFg1X0FMSUdOICAgICAgICAgREU0WDVfQUxJR04zMiAgICAgICAgICAgLyogS2VlcCB0aGUgREMyMTA0MCBoYXBweS4uLiAqLworI2RlZmluZSBERTRYNV9DQUNIRV9BTElHTiAgIENBTF8xNkxPTkcKKyNkZWZpbmUgREVTQ19TS0lQX0xFTiBEU0xfMCAgICAgICAgICAgICAvKiBNdXN0IGFncmVlIHdpdGggREVTQ19BTElHTiAqLworLyojZGVmaW5lIERFU0NfQUxJR04gICAgdTMyIGR1bW15WzRdOyAgLyAqIE11c3QgYWdyZWUgd2l0aCBERVNDX1NLSVBfTEVOICovCisjZGVmaW5lIERFU0NfQUxJR04KKworI2lmbmRlZiBERUNfT05MWSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZSBSRUFETUUuZGU0eDUgZm9yIHVzaW5nIHRoaXMgKi8KK3N0YXRpYyBpbnQgZGVjX29ubHk7CisjZWxzZQorc3RhdGljIGludCBkZWNfb25seSA9IDE7CisjZW5kaWYKKworLyoKKyoqIERFNFg1IElSUSBFTkFCTEUvRElTQUJMRQorKi8KKyNkZWZpbmUgRU5BQkxFX0lSUXMgeyBcCisgICAgaW1yIHw9IGxwLT5pcnFfZW47XAorICAgIG91dGwoaW1yLCBERTRYNV9JTVIpOyAgICAgICAgICAgICAgIC8qIEVuYWJsZSB0aGUgSVJRcyAqL1wKK30KKworI2RlZmluZSBESVNBQkxFX0lSUXMge1wKKyAgICBpbXIgPSBpbmwoREU0WDVfSU1SKTtcCisgICAgaW1yICY9IH5scC0+aXJxX2VuO1wKKyAgICBvdXRsKGltciwgREU0WDVfSU1SKTsgICAgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBJUlFzICovXAorfQorCisjZGVmaW5lIFVOTUFTS19JUlFzIHtcCisgICAgaW1yIHw9IGxwLT5pcnFfbWFzaztcCisgICAgb3V0bChpbXIsIERFNFg1X0lNUik7ICAgICAgICAgICAgICAgLyogVW5tYXNrIHRoZSBJUlFzICovXAorfQorCisjZGVmaW5lIE1BU0tfSVJRcyB7XAorICAgIGltciA9IGlubChERTRYNV9JTVIpO1wKKyAgICBpbXIgJj0gfmxwLT5pcnFfbWFzaztcCisgICAgb3V0bChpbXIsIERFNFg1X0lNUik7ICAgICAgICAgICAgICAgLyogTWFzayB0aGUgSVJRcyAqL1wKK30KKworLyoKKyoqIERFNFg1IFNUQVJUL1NUT1AKKyovCisjZGVmaW5lIFNUQVJUX0RFNFg1IHtcCisgICAgb21yID0gaW5sKERFNFg1X09NUik7XAorICAgIG9tciB8PSBPTVJfU1QgfCBPTVJfU1I7XAorICAgIG91dGwob21yLCBERTRYNV9PTVIpOyAgICAgICAgICAgICAgIC8qIEVuYWJsZSB0aGUgVFggYW5kL29yIFJYICovXAorfQorCisjZGVmaW5lIFNUT1BfREU0WDUge1wKKyAgICBvbXIgPSBpbmwoREU0WDVfT01SKTtcCisgICAgb21yICY9IH4oT01SX1NUfE9NUl9TUik7XAorICAgIG91dGwob21yLCBERTRYNV9PTVIpOyAgICAgICAgICAgICAgIC8qIERpc2FibGUgdGhlIFRYIGFuZC9vciBSWCAqLyBcCit9CisKKy8qCisqKiBERTRYNSBTSUEgUkVTRVQKKyovCisjZGVmaW5lIFJFU0VUX1NJQSBvdXRsKDAsIERFNFg1X1NJQ1IpOyAgLyogUmVzZXQgU0lBIGNvbm5lY3Rpdml0eSByZWdzICovCisKKy8qCisqKiBERTUwMCBBVVRPU0VOU0UgVElNRVIgSU5URVJWQUwgKE1JTExJU0VDUykKKyovCisjZGVmaW5lIERFNFg1X0FVVE9TRU5TRV9NUyAgMjUwCisKKy8qCisqKiBTUk9NIFN0cnVjdHVyZQorKi8KK3N0cnVjdCBkZTR4NV9zcm9tIHsKKyAgICBjaGFyIHN1Yl92ZW5kb3JfaWRbMl07CisgICAgY2hhciBzdWJfc3lzdGVtX2lkWzJdOworICAgIGNoYXIgcmVzZXJ2ZWRbMTJdOworICAgIGNoYXIgaWRfYmxvY2tfY3JjOworICAgIGNoYXIgcmVzZXJ2ZWQyOworICAgIGNoYXIgdmVyc2lvbjsKKyAgICBjaGFyIG51bV9jb250cm9sbGVyczsKKyAgICBjaGFyIGllZWVfYWRkcls2XTsKKyAgICBjaGFyIGluZm9bMTAwXTsKKyAgICBzaG9ydCBjaGtzdW07Cit9OworI2RlZmluZSBTVUJfVkVORE9SX0lEIDB4NTAwYQorCisvKgorKiogREU0WDUgRGVzY3JpcHRvcnMuIE1ha2Ugc3VyZSB0aGF0IGFsbCB0aGUgUlggYnVmZmVycyBhcmUgY29udGlndW91cworKiogYW5kIGhhdmUgc2l6ZXMgb2YgYm90aCBhIHBvd2VyIG9mIDIgYW5kIGEgbXVsdGlwbGUgb2YgNC4KKyoqIEEgc2l6ZSBvZiAyNTYgYnl0ZXMgZm9yIGVhY2ggYnVmZmVyIGNvdWxkIGJlIGNob3NlbiBiZWNhdXNlIG92ZXIgOTAlIG9mCisqKiBhbGwgcGFja2V0cyBpbiBvdXIgbmV0d29yayBhcmUgPDI1NiBieXRlcyBsb25nIGFuZCA2NCBsb25nd29yZCBhbGlnbm1lbnQKKyoqIGlzIHBvc3NpYmxlLiAxNTM2IHNob3dlZCBiZXR0ZXIgJ3R0Y3AnIHBlcmZvcm1hbmNlLiBUYWtlIHlvdXIgcGljay4gMzIgVFgKKyoqIGRlc2NyaXB0b3JzIGFyZSBuZWVkZWQgZm9yIG1hY2hpbmVzIHdpdGggYW4gQUxQSEEgQ1BVLgorKi8KKyNkZWZpbmUgTlVNX1JYX0RFU0MgOCAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgUlggZGVzY3JpcHRvcnMgICAqLworI2RlZmluZSBOVU1fVFhfREVTQyAzMiAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBUWCBkZXNjcmlwdG9ycyAgICovCisjZGVmaW5lIFJYX0JVRkZfU1ogIDE1MzYgICAgICAgICAgICAgICAgLyogUG93ZXIgb2YgMiBmb3Iga21hbGxvYyBhbmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNdWx0aXBsZSBvZiA0IGZvciBEQzIxMDQwICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbG93cyA1MTIgYnl0ZSBhbGlnbm1lbnQgICovCitzdHJ1Y3QgZGU0eDVfZGVzYyB7CisgICAgdm9sYXRpbGUgczMyIHN0YXR1czsKKyAgICB1MzIgZGVzMTsKKyAgICB1MzIgYnVmOworICAgIHUzMiBuZXh0OworICAgIERFU0NfQUxJR04KK307CisKKy8qCisqKiBUaGUgREU0WDUgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyovCisjZGVmaW5lIERFNFg1X1BLVF9TVEFUX1NaIDE2CisjZGVmaW5lIERFNFg1X1BLVF9CSU5fU1ogIDEyOCAgICAgICAgICAgIC8qIFNob3VsZCBiZSA+PTEwMCB1bmxlc3MgeW91CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlYXNlIERFNFg1X1BLVF9TVEFUX1NaICovCisKK3N0cnVjdCBwa3Rfc3RhdHMgeworCXVfaW50IGJpbnNbREU0WDVfUEtUX1NUQVRfU1pdOyAgICAgIC8qIFByaXZhdGUgc3RhdHMgY291bnRlcnMgICAgICAgKi8KKwl1X2ludCB1bmljYXN0OworCXVfaW50IG11bHRpY2FzdDsKKwl1X2ludCBicm9hZGNhc3Q7CisJdV9pbnQgZXhjZXNzaXZlX2NvbGxpc2lvbnM7CisJdV9pbnQgdHhfdW5kZXJydW5zOworCXVfaW50IGV4Y2Vzc2l2ZV91bmRlcnJ1bnM7CisJdV9pbnQgcnhfcnVudF9mcmFtZXM7CisJdV9pbnQgcnhfY29sbGlzaW9uOworCXVfaW50IHJ4X2RyaWJibGU7CisJdV9pbnQgcnhfb3ZlcmZsb3c7Cit9OworCitzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSB7CisgICAgY2hhciBhZGFwdGVyX25hbWVbODBdOyAgICAgICAgICAgICAgICAgIC8qIEFkYXB0ZXIgbmFtZSAgICAgICAgICAgICAgICAgKi8KKyAgICB1X2xvbmcgaW50ZXJydXB0OyAgICAgICAgICAgICAgICAgICAgICAgLyogQWxpZ25lZCBJU1IgZmxhZyAgICAgICAgICAgICAqLworICAgIHN0cnVjdCBkZTR4NV9kZXNjICpyeF9yaW5nOwkJICAgIC8qIFJYIGRlc2NyaXB0b3IgcmluZyAgICAgICAgICAgKi8KKyAgICBzdHJ1Y3QgZGU0eDVfZGVzYyAqdHhfcmluZzsJCSAgICAvKiBUWCBkZXNjcmlwdG9yIHJpbmcgICAgICAgICAgICovCisgICAgc3RydWN0IHNrX2J1ZmYgKnR4X3NrYltOVU1fVFhfREVTQ107ICAgIC8qIFRYIHNrYiBmb3IgZnJlZWluZyB3aGVuIHNlbnQgKi8KKyAgICBzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiW05VTV9SWF9ERVNDXTsgICAgLyogUlggc2tiJ3MgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCByeF9uZXcsIHJ4X29sZDsgICAgICAgICAgICAgICAgICAgICAvKiBSWCBkZXNjcmlwdG9yIHJpbmcgcG9pbnRlcnMgICovCisgICAgaW50IHR4X25ldywgdHhfb2xkOyAgICAgICAgICAgICAgICAgICAgIC8qIFRYIGRlc2NyaXB0b3IgcmluZyBwb2ludGVycyAgKi8KKyAgICBjaGFyIHNldHVwX2ZyYW1lW1NFVFVQX0ZSQU1FX0xFTl07ICAgICAgLyogSG9sZHMgTUNBIGFuZCBQQSBpbmZvLiAgICAgICAqLworICAgIGNoYXIgZnJhbWVbNjRdOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNaW4gc2l6ZWQgcGFja2V0IGZvciBsb29wYmFjayovCisgICAgc3BpbmxvY2tfdCBsb2NrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkYXB0ZXIgc3BlY2lmaWMgc3BpbmxvY2sgICAgKi8KKyAgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsgICAgICAgICAgLyogUHVibGljIHN0YXRzICAgICAgICAgICAgICAgICAqLworICAgIHN0cnVjdCBwa3Rfc3RhdHMgcGt0U3RhdHM7CSAgICAgICAgICAgIC8qIFByaXZhdGUgc3RhdHMgY291bnRlcnMJICAgICovCisgICAgY2hhciByeFJpbmdTaXplOworICAgIGNoYXIgdHhSaW5nU2l6ZTsKKyAgICBpbnQgIGJ1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRUlTQSBvciBQQ0kgICAgICAgICAgICAgICAgICAqLworICAgIGludCAgYnVzX251bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQQ0kgQnVzIG51bWJlciAgICAgICAgICAgICAgICovCisgICAgaW50ICBkZXZpY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldmljZSBudW1iZXIgb24gUENJIGJ1cyAgICAgKi8KKyAgICBpbnQgIHN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRhcHRlciBPUEVORUQgb3IgQ0xPU0VEICAgICAqLworICAgIGludCAgY2hpcHNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEQzIxMDQwLCBEQzIxMDQxIG9yIERDMjExNDAgICovCisgICAgczMyICBpcnFfbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEludGVycnVwdCBNYXNrIChFbmFibGUpIGJpdHMgKi8KKyAgICBzMzIgIGlycV9lbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VtbWFyeSBpbnRlcnJ1cHQgYml0cyAgICAgICAqLworICAgIGludCAgbWVkaWE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNZWRpYSAoZWcgVFApLCBtb2RlIChlZyAxMDBCKSovCisgICAgaW50ICBjX21lZGlhOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlbWVtYmVyIHRoZSBsYXN0IG1lZGlhIGNvbm4gKi8KKyAgICBpbnQgIGZkeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWVkaWEgZnVsbCBkdXBsZXggZmxhZyAgICAgICAqLworICAgIGludCAgbGlua09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMaW5rIGlzIE9LICAgICAgICAgICAgICAgICAgICovCisgICAgaW50ICBhdXRvc2Vuc2U7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbG93L2Rpc2FsbG93IGF1dG9zZW5zaW5nICAgKi8KKyAgICBpbnQgIHR4X2VuYWJsZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIGRlc2NyaXB0b3IgcG9sbGluZyAgICAqLworICAgIGludCAgc2V0dXBfZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXR1cCBmcmFtZSBmaWx0ZXJpbmcgdHlwZSAgICovCisgICAgaW50ICBsb2NhbF9zdGF0ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0YXRlIHdpdGhpbiBhICdtZWRpYScgc3RhdGUgKi8KKyAgICBzdHJ1Y3QgbWlpX3BoeSBwaHlbREU0WDVfTUFYX1BIWV07ICAgICAgLyogTGlzdCBvZiBhdHRhY2hlZCBQSFkgZGV2aWNlcyAqLworICAgIHN0cnVjdCBzaWFfcGh5IHNpYTsgICAgICAgICAgICAgICAgICAgICAvKiBTSUEgUEhZIEluZm9ybWF0aW9uICAgICAgICAgICovCisgICAgaW50ICBhY3RpdmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluZGV4IHRvIGFjdGl2ZSBQSFkgZGV2aWNlICAgKi8KKyAgICBpbnQgIG1paV9jbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGF0dGFjaGVkIFBIWSdzICAgICAqLworICAgIGludCAgdGltZW91dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTY2hlZHVsaW5nIGNvdW50ZXIgICAgICAgICAgICovCisgICAgc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7ICAgICAgICAgICAgICAgIC8qIFRpbWVyIGluZm8gZm9yIGtlcm5lbCAgICAgICAgKi8KKyAgICBpbnQgdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGVtcG9yYXJ5IGdsb2JhbCBwZXIgY2FyZCAgICAqLworICAgIHN0cnVjdCB7CisJdV9sb25nIGxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9jayB0aGUgY2FjaGUgYWNjZXNzZXMgICAgICAqLworCXMzMiBjc3IwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmVkIEJ1cyBNb2RlIFJlZ2lzdGVyICAgICAgKi8KKwlzMzIgY3NyNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlZCBPcGVyYXRpbmcgTW9kZSBSZWcuICAgICovCisJczMyIGNzcjc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZWQgSVJRIE1hc2sgUmVnaXN0ZXIgICAgICAqLworCXMzMiBnZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmVkIEdlbmVyYWwgUHVycG9zZSBSZWcuICAgKi8KKwlzMzIgZ2VwYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb250cm9sIGluZm8gZm9yIEdFUCAgICAgICAgICovCisJczMyIGNzcjEzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZWQgU0lBIENvbm5lY3Rpdml0eSBSZWcuICAqLworCXMzMiBjc3IxNDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmVkIFNJQSBUWC9SWCBSZWdpc3RlciAgICAgKi8KKwlzMzIgY3NyMTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlZCBTSUEgR2VuZXJhbCBSZWdpc3RlciAgICovCisJaW50IHNhdmVfY250OyAgICAgICAgICAgICAgICAgICAgICAgLyogRmxhZyBpZiBzdGF0ZSBhbHJlYWR5IHNhdmVkICAqLworCXN0cnVjdCBza19idWZmICpza2I7ICAgICAgICAgICAgICAgIC8qIFNhdmUgdGhlIChyZS1vcmRlcmVkKSBza2IncyAgKi8KKyAgICB9IGNhY2hlOworICAgIHN0cnVjdCBkZTR4NV9zcm9tIHNyb207ICAgICAgICAgICAgICAgICAvKiBBIGNvcHkgb2YgdGhlIFNST00gICAgICAgICAgICovCisgICAgaW50IGNmcnY7CQkJCSAgICAvKiBDYXJkIENGUlYgY29weSAqLworICAgIGludCByeF9vdmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3IgJ1JYIG92ZXJmbG93JyB0YWcgICovCisgICAgaW50IHVzZVNST007ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBub24tREVDIGNhcmQgdXNlIFNST00gICAgKi8KKyAgICBpbnQgdXNlTUlJOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5mb2Jsb2NrIHVzaW5nIHRoZSBNSUkgICAgICAqLworICAgIGludCBhc0JpdFZhbGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRvc2Vuc2UgYml0cyBpbiBHRVA/ICAgICAgICovCisgICAgaW50IGFzUG9sYXJpdHk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAgPT4gYXNzZXJ0ZWQgaGlnaCAgICAgICAgICAgKi8KKyAgICBpbnQgYXNCaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXV0b3NlbnNlIGJpdCBudW1iZXIgaW4gR0VQICAqLworICAgIGludCBkZWZNZWRpdW07ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTUk9NIGRlZmF1bHQgbWVkaXVtICAgICAgICAgICovCisgICAgaW50IHRjb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExhc3QgaW5mb2Jsb2NrIG51bWJlciAgICAgICAgKi8KKyAgICBpbnQgaW5mb2Jsb2NrX2luaXQ7ICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZWQgdGhpcyBpbmZvYmxvY2s/ICAqLworICAgIGludCBpbmZvbGVhZl9vZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAvKiBTUk9NIGluZm9sZWFmIGZvciBjb250cm9sbGVyICovCisgICAgczMyIGluZm9ibG9ja19jc3I2OyAgICAgICAgICAgICAgICAgICAgIC8qIGNzcjYgdmFsdWUgaW4gU1JPTSBpbmZvYmxvY2sgKi8KKyAgICBpbnQgaW5mb2Jsb2NrX21lZGlhOyAgICAgICAgICAgICAgICAgICAgLyogaW5mb2Jsb2NrIG1lZGlhICAgICAgICAgICAgICAqLworICAgIGludCAoKmluZm9sZWFmX2ZuKShzdHJ1Y3QgbmV0X2RldmljZSAqKTsgICAgLyogUG9pbnRlciB0byBpbmZvbGVhZiBmdW5jdGlvbiAqLworICAgIHVfY2hhciAqcnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIFR5cGUgNSByZXNldCBpbmZvICovCisgICAgdV9jaGFyICBpYm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluZm9ibG9jayBudW1iZXIgICAgICAgICAgICAgKi8KKyAgICBzdHJ1Y3QgcGFyYW1ldGVycyBwYXJhbXM7ICAgICAgICAgICAgICAgLyogQ29tbWFuZCBsaW5lLyAjZGVmaW5lZCBwYXJhbXMgKi8KKyAgICBzdHJ1Y3QgZGV2aWNlICpnZW5kZXY7CSAgICAgICAgICAgIC8qIEdlbmVyaWMgZGV2aWNlICovCisgICAgZG1hX2FkZHJfdCBkbWFfcmluZ3M7CQkgICAgLyogRE1BIGhhbmRsZSBmb3IgcmluZ3MJICAgICovCisgICAgaW50IGRtYV9zaXplOwkJCSAgICAvKiBTaXplIG9mIHRoZSBETUEgYXJlYQkgICAgKi8KKyAgICBjaGFyICpyeF9idWZzOwkJCSAgICAvKiByeCBidWZzIG9uIGFscGhhLCBzcGFyYywgLi4uICovCit9OworCisvKgorKiogVG8gZ2V0IGFyb3VuZCBjZXJ0YWluIHBveHkgY2FyZHMgdGhhdCBkb24ndCBwcm92aWRlIGFuIFNST00KKyoqIGZvciB0aGUgc2Vjb25kIGFuZCBtb3JlIERFQ2NoaXAsIEkgaGF2ZSB0byBrZXkgb2ZmIHRoZSBmaXJzdAorKiogY2hpcCdzIGFkZHJlc3MuIEknbGwgYXNzdW1lIHRoZXJlJ3Mgbm90IGEgYmFkIFNST00gaWZmOgorKioKKyoqICAgICAgbyB0aGUgY2hpcHNldCBpcyB0aGUgc2FtZQorKiogICAgICBvIHRoZSBidXMgbnVtYmVyIGlzIHRoZSBzYW1lIGFuZCA+IDAKKyoqICAgICAgbyB0aGUgc3VtIG9mIGFsbCB0aGUgcmV0dXJuZWQgaHcgYWRkcmVzcyBieXRlcyBpcyAwIG9yIDB4NWZhCisqKgorKiogQWxzbyBoYXZlIHRvIHNhdmUgdGhlIGlycSBmb3IgdGhvc2UgY2FyZHMgd2hvc2UgaGFyZHdhcmUgZGVzaWduZXJzCisqKiBjYW4ndCBmb2xsb3cgdGhlIFBDSSB0byBQQ0kgQnJpZGdlIEFyY2hpdGVjdHVyZSBzcGVjLgorKi8KK3N0YXRpYyBzdHJ1Y3QgeworICAgIGludCBjaGlwc2V0OworICAgIGludCBidXM7CisgICAgaW50IGlycTsKKyAgICB1X2NoYXIgYWRkcltFVEhfQUxFTl07Cit9IGxhc3QgPSB7MCx9OworCisvKgorKiogVGhlIHRyYW5zbWl0IHJpbmcgZnVsbCBjb25kaXRpb24gaXMgZGVzY3JpYmVkIGJ5IHRoZSB0eF9vbGQgYW5kIHR4X25ldworKiogcG9pbnRlcnMgYnk6CisqKiAgICB0eF9vbGQgICAgICAgICAgICA9IHR4X25ldyAgICBFbXB0eSByaW5nCisqKiAgICB0eF9vbGQgICAgICAgICAgICA9IHR4X25ldysxICBGdWxsIHJpbmcKKyoqICAgIHR4X29sZCt0eFJpbmdTaXplID0gdHhfbmV3KzEgIEZ1bGwgcmluZyAgKHdyYXBwZWQgY29uZGl0aW9uKQorKi8KKyNkZWZpbmUgVFhfQlVGRlNfQVZBSUwgKChscC0+dHhfb2xkPD1scC0+dHhfbmV3KT9cCisJCQlscC0+dHhfb2xkK2xwLT50eFJpbmdTaXplLWxwLT50eF9uZXctMTpcCisJCQlscC0+dHhfb2xkICAgICAgICAgICAgICAgLWxwLT50eF9uZXctMSkKKworI2RlZmluZSBUWF9QS1RfUEVORElORyAobHAtPnR4X29sZCAhPSBscC0+dHhfbmV3KQorCisvKgorKiogUHVibGljIEZ1bmN0aW9ucworKi8KK3N0YXRpYyBpbnQgICAgIGRlNHg1X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBkZTR4NV9xdWV1ZV9wa3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgZGU0eDVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCAgICAgZGU0eDVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0ICBuZXRfZGV2aWNlX3N0YXRzICpkZTR4NV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBkZTR4NV9sb2NhbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBwa3RfbGVuKTsKK3N0YXRpYyB2b2lkICAgIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIGRlNHg1X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOworCisvKgorKiogUHJpdmF0ZSBmdW5jdGlvbnMKKyovCitzdGF0aWMgaW50ICAgICBkZTR4NV9od19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfbG9uZyBpb2Jhc2UsIHN0cnVjdCBkZXZpY2UgKmdlbmRldik7CitzdGF0aWMgaW50ICAgICBkZTR4NV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgZGU0eDVfc3dfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBkZTR4NV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIGRlNHg1X3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgZGU0eDVfYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgZGU0eDVfdHh1cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIGRlNHg1X3J4X292ZmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBpbnQgICAgIGF1dG9jb25mX21lZGlhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgY3JlYXRlX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpmcmFtZSwgaW50IGxlbik7CitzdGF0aWMgdm9pZCAgICBsb2FkX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpidWYsIHUzMiBmbGFncywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgaW50ICAgICBkYzIxMDQwX2F1dG9jb25mKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgZGMyMTA0MV9hdXRvY29uZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIGRjMjExNDBtX2F1dG9jb25mKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgZGMyMTE0eF9hdXRvY29uZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIHNyb21fYXV0b2NvbmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBkZTR4NV9zdXNwZWN0X3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB0aW1lb3V0LCBpbnQgcHJldl9zdGF0ZSwgaW50ICgqZm4pKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCksIGludCAoKmFzZm4pKHN0cnVjdCBuZXRfZGV2aWNlICopKTsKK3N0YXRpYyBpbnQgICAgIGRjMjEwNDBfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNzcjEzLCBpbnQgY3NyMTQsIGludCBjc3IxNSwgaW50IHRpbWVvdXQsIGludCBuZXh0X3N0YXRlLCBpbnQgc3VzcGVjdF9zdGF0ZSwgaW50ICgqZm4pKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCkpOworc3RhdGljIGludCAgICAgdGVzdF9tZWRpYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzMzIgaXJxcywgczMyIGlycV9tYXNrLCBzMzIgY3NyMTMsIHMzMiBjc3IxNCwgczMyIGNzcjE1LCBzMzIgbXNlYyk7CitzdGF0aWMgaW50ICAgICB0ZXN0X2Zvcl8xMDBNYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbXNlYyk7CitzdGF0aWMgaW50ICAgICB3YWl0X2Zvcl9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgdGVzdF9taWlfcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByZWcsIGludCBtYXNrLCBpbnQgcG9sLCBsb25nIG1zZWMpOworc3RhdGljIGludCAgICAgaXNfc3BkXzEwMChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIGlzXzEwMF91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIGlzXzEwX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgaXNfYW5jX2NhcGFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBwaW5nX21lZGlhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtc2VjKTsKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqZGU0eDVfYWxsb2NfcnhfYnVmZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5kZXgsIGludCBsZW4pOworc3RhdGljIHZvaWQgICAgZGU0eDVfZnJlZV9yeF9idWZmcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIGRlNHg1X2ZyZWVfdHhfYnVmZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBkZTR4NV9zYXZlX3NrYnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBkZTR4NV9yc3RfZGVzY19yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgZGU0eDVfY2FjaGVfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZsYWcpOworc3RhdGljIHZvaWQgICAgZGU0eDVfcHV0X2NhY2hlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgICAgZGU0eDVfcHV0Yl9jYWNoZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBzdHJ1Y3QgIHNrX2J1ZmYgKmRlNHg1X2dldF9jYWNoZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIGRlNHg1X3NldHVwX2ludHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBkZTR4NV9pbml0X2Nvbm5lY3Rpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBkZTR4NV9yZXNldF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICByZXNldF9pbml0X3NpYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzMzIgc2ljciwgczMyIHN0cnIsIHMzMiBzaWdyKTsKK3N0YXRpYyBpbnQgICAgIHRlc3RfYW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHMzMiBpcnFzLCBzMzIgaXJxX21hc2ssIHMzMiBtc2VjKTsKK3N0YXRpYyBpbnQgICAgIHRlc3RfdHAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgczMyIG1zZWMpOworc3RhdGljIGludCAgICAgRUlTQV9zaWduYXR1cmUoY2hhciAqbmFtZSwgc3RydWN0IGRldmljZSAqZGV2aWNlKTsKK3N0YXRpYyBpbnQgICAgIFBDSV9zaWduYXR1cmUoY2hhciAqbmFtZSwgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwKTsKK3N0YXRpYyB2b2lkICAgIERldmljZVByZXNlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9sb25nIGlvYmFzZSk7CitzdGF0aWMgdm9pZCAgICBlbmV0X2FkZHJfcnN0KHVfbG9uZyBhcHJvbV9hZGRyKTsKK3N0YXRpYyBpbnQgICAgIGRlNHg1X2JhZF9zcm9tKHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCk7CitzdGF0aWMgc2hvcnQgICBzcm9tX3JkKHVfbG9uZyBhZGRyZXNzLCB1X2NoYXIgb2Zmc2V0KTsKK3N0YXRpYyB2b2lkICAgIHNyb21fbGF0Y2godV9pbnQgY29tbWFuZCwgdV9sb25nIGFkZHJlc3MpOworc3RhdGljIHZvaWQgICAgc3JvbV9jb21tYW5kKHVfaW50IGNvbW1hbmQsIHVfbG9uZyBhZGRyZXNzKTsKK3N0YXRpYyB2b2lkICAgIHNyb21fYWRkcmVzcyh1X2ludCBjb21tYW5kLCB1X2xvbmcgYWRkcmVzcywgdV9jaGFyIG9mZnNldCk7CitzdGF0aWMgc2hvcnQgICBzcm9tX2RhdGEodV9pbnQgY29tbWFuZCwgdV9sb25nIGFkZHJlc3MpOworLypzdGF0aWMgdm9pZCAgICBzcm9tX2J1c3kodV9pbnQgY29tbWFuZCwgdV9sb25nIGFkZHJlc3MpOyovCitzdGF0aWMgdm9pZCAgICBzZW5kdG9fc3JvbSh1X2ludCBjb21tYW5kLCB1X2xvbmcgYWRkcik7CitzdGF0aWMgaW50ICAgICBnZXRmcm9tX3Nyb20odV9sb25nIGFkZHIpOworc3RhdGljIGludCAgICAgc3JvbV9tYXBfbWVkaWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBzcm9tX2luZm9sZWFmX2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBzcm9tX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBzcm9tX2V4ZWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9jaGFyICpwKTsKK3N0YXRpYyBpbnQgICAgIG1paV9yZCh1X2NoYXIgcGh5cmVnLCB1X2NoYXIgcGh5YWRkciwgdV9sb25nIGlvYWRkcik7CitzdGF0aWMgdm9pZCAgICBtaWlfd3IoaW50IGRhdGEsIHVfY2hhciBwaHlyZWcsIHVfY2hhciBwaHlhZGRyLCB1X2xvbmcgaW9hZGRyKTsKK3N0YXRpYyBpbnQgICAgIG1paV9yZGF0YSh1X2xvbmcgaW9hZGRyKTsKK3N0YXRpYyB2b2lkICAgIG1paV93ZGF0YShpbnQgZGF0YSwgaW50IGxlbiwgdV9sb25nIGlvYWRkcik7CitzdGF0aWMgdm9pZCAgICBtaWlfdGEodV9sb25nIHJ3LCB1X2xvbmcgaW9hZGRyKTsKK3N0YXRpYyBpbnQgICAgIG1paV9zd2FwKGludCBkYXRhLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkICAgIG1paV9hZGRyZXNzKHVfY2hhciBhZGRyLCB1X2xvbmcgaW9hZGRyKTsKK3N0YXRpYyB2b2lkICAgIHNlbmR0b19taWkodTMyIGNvbW1hbmQsIGludCBkYXRhLCB1X2xvbmcgaW9hZGRyKTsKK3N0YXRpYyBpbnQgICAgIGdldGZyb21fbWlpKHUzMiBjb21tYW5kLCB1X2xvbmcgaW9hZGRyKTsKK3N0YXRpYyBpbnQgICAgIG1paV9nZXRfb3VpKHVfY2hhciBwaHlhZGRyLCB1X2xvbmcgaW9hZGRyKTsKK3N0YXRpYyBpbnQgICAgIG1paV9nZXRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgU2V0TXVsdGljYXN0RmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgZ2V0X2h3X2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBzcm9tX3JlcGFpcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY2FyZCk7CitzdGF0aWMgaW50ICAgICB0ZXN0X2JhZF9lbmV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdGF0dXMpOworc3RhdGljIGludCAgICAgYW5fZXhjZXB0aW9uKHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCk7CitzdGF0aWMgY2hhciAgICAqYnVpbGRfc2V0dXBfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1vZGUpOworc3RhdGljIHZvaWQgICAgZGlzYWJsZV9hc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBlbmFibGVfYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB0aW1lX291dCk7CitzdGF0aWMgbG9uZyAgICBkZTR4NV9zd2l0Y2hfbWFjX3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBnZXBfcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBnZXBfd3IoczMyIGRhdGEsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICgqZm4pKHVfbG9uZyBkYXRhKSwgdV9sb25nIGRhdGEsIHVfbG9uZyBtc2VjKTsKK3N0YXRpYyB2b2lkICAgIHlhd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXRlKTsKK3N0YXRpYyB2b2lkICAgIGRlNHg1X3BhcnNlX3BhcmFtcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkICAgIGRlNHg1X2RiZ19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgICAgZGU0eDVfZGJnX21paShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgayk7CitzdGF0aWMgdm9pZCAgICBkZTR4NV9kYmdfbWVkaWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCAgICBkZTR4NV9kYmdfc3JvbShzdHJ1Y3QgZGU0eDVfc3JvbSAqcCk7CitzdGF0aWMgdm9pZCAgICBkZTR4NV9kYmdfcngoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxlbik7CitzdGF0aWMgaW50ICAgICBkZTR4NV9zdHJuY21wKGNoYXIgKmEsIGNoYXIgKmIsIGludCBuKTsKK3N0YXRpYyBpbnQgICAgIGRjMjEwNDFfaW5mb2xlYWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICBkYzIxMTQwX2luZm9sZWFmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCAgICAgZGMyMTE0Ml9pbmZvbGVhZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgICAgIGRjMjExNDNfaW5mb2xlYWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICAgICB0eXBlMF9pbmZvYmxvY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9jaGFyIGNvdW50LCB1X2NoYXIgKnApOworc3RhdGljIGludCAgICAgdHlwZTFfaW5mb2Jsb2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciBjb3VudCwgdV9jaGFyICpwKTsKK3N0YXRpYyBpbnQgICAgIHR5cGUyX2luZm9ibG9jayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgY291bnQsIHVfY2hhciAqcCk7CitzdGF0aWMgaW50ICAgICB0eXBlM19pbmZvYmxvY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9jaGFyIGNvdW50LCB1X2NoYXIgKnApOworc3RhdGljIGludCAgICAgdHlwZTRfaW5mb2Jsb2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciBjb3VudCwgdV9jaGFyICpwKTsKK3N0YXRpYyBpbnQgICAgIHR5cGU1X2luZm9ibG9jayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgY291bnQsIHVfY2hhciAqcCk7CitzdGF0aWMgaW50ICAgICBjb21wYWN0X2luZm9ibG9jayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgY291bnQsIHVfY2hhciAqcCk7CisKKy8qCisqKiBOb3RlIG5vdyB0aGF0IG1vZHVsZSBhdXRvcHJvYmluZyBpcyBhbGxvd2VkIHVuZGVyIEVJU0EgYW5kIFBDSS4gVGhlCisqKiBJUlEgbGluZXMgd2lsbCBub3QgYmUgYXV0by1kZXRlY3RlZDsgaW5zdGVhZCBJJ2xsIHJlbHkgb24gdGhlIEJJT1NlcworKiogdG8gImRvIHRoZSByaWdodCB0aGluZyIuCisqLworCitzdGF0aWMgaW50IGlvPTB4MDsvKiBFRElUIFRISVMgTElORSBGT1IgWU9VUiBDT05GSUdVUkFUSU9OIElGIE5FRURFRCAgICAgICAgKi8KKworbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRlNHg1X2RlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRlY19vbmx5LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGFyZ3MsIGNoYXJwLCAwKTsKKworTU9EVUxFX1BBUk1fREVTQyhpbywgImRlNHg1IEkvTyBiYXNlIGFkZHJlc3MiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGU0eDVfZGVidWcsICJkZTR4NSBkZWJ1ZyBtYXNrIik7CitNT0RVTEVfUEFSTV9ERVNDKGRlY19vbmx5LCAiZGU0eDUgcHJvYmUgb25seSBmb3IgRGlnaXRhbCBib2FyZHMgKDAtMSkiKTsKK01PRFVMRV9QQVJNX0RFU0MoYXJncywgImRlNHg1IGZ1bGwgZHVwbGV4IGFuZCBtZWRpYSB0eXBlIHNldHRpbmdzOyBzZWUgZGU0eDUuYyBmb3IgZGV0YWlscyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorKiogTGlzdCB0aGUgU1JPTSBpbmZvbGVhZiBmdW5jdGlvbnMgYW5kIGNoaXBzZXRzCisqLworc3RydWN0IEluZm9MZWFmIHsKKyAgICBpbnQgY2hpcHNldDsKKyAgICBpbnQgKCpmbikoc3RydWN0IG5ldF9kZXZpY2UgKik7Cit9Oworc3RhdGljIHN0cnVjdCBJbmZvTGVhZiBpbmZvbGVhZl9hcnJheVtdID0geworICAgIHtEQzIxMDQxLCBkYzIxMDQxX2luZm9sZWFmfSwKKyAgICB7REMyMTE0MCwgZGMyMTE0MF9pbmZvbGVhZn0sCisgICAge0RDMjExNDIsIGRjMjExNDJfaW5mb2xlYWZ9LAorICAgIHtEQzIxMTQzLCBkYzIxMTQzX2luZm9sZWFmfQorfTsKKyNkZWZpbmUgSU5GT0xFQUZfU0laRSAoc2l6ZW9mKGluZm9sZWFmX2FycmF5KS8oc2l6ZW9mKGludCkrc2l6ZW9mKGludCAqKSkpCisKKy8qCisqKiBMaXN0IHRoZSBTUk9NIGluZm8gYmxvY2sgZnVuY3Rpb25zCisqLworc3RhdGljIGludCAoKmRjX2luZm9ibG9ja1tdKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIsIHVfY2hhciAqKSA9IHsKKyAgICB0eXBlMF9pbmZvYmxvY2ssCisgICAgdHlwZTFfaW5mb2Jsb2NrLAorICAgIHR5cGUyX2luZm9ibG9jaywKKyAgICB0eXBlM19pbmZvYmxvY2ssCisgICAgdHlwZTRfaW5mb2Jsb2NrLAorICAgIHR5cGU1X2luZm9ibG9jaywKKyAgICBjb21wYWN0X2luZm9ibG9jaworfTsKKworI2RlZmluZSBDT01QQUNUIChzaXplb2YoZGNfaW5mb2Jsb2NrKS9zaXplb2YoaW50ICopIC0gMSkKKworLyoKKyoqIE1pc2NlbGxhbmVvdXMgZGVmaW5lcy4uLgorKi8KKyNkZWZpbmUgUkVTRVRfREU0WDUge1wKKyAgICBpbnQgaTtcCisgICAgaT1pbmwoREU0WDVfQk1SKTtcCisgICAgbWRlbGF5KDEpO1wKKyAgICBvdXRsKGkgfCBCTVJfU1dSLCBERTRYNV9CTVIpO1wKKyAgICBtZGVsYXkoMSk7XAorICAgIG91dGwoaSwgREU0WDVfQk1SKTtcCisgICAgbWRlbGF5KDEpO1wKKyAgICBmb3IgKGk9MDtpPDU7aSsrKSB7aW5sKERFNFg1X0JNUik7IG1kZWxheSgxKTt9XAorICAgIG1kZWxheSgxKTtcCit9CisKKyNkZWZpbmUgUEhZX0hBUkRfUkVTRVQge1wKKyAgICBvdXRsKEdFUF9IUlNULCBERTRYNV9HRVApOyAgICAgICAgICAgLyogSGFyZCBSRVNFVCB0aGUgUEhZIGRldi4gKi9cCisgICAgbWRlbGF5KDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFzc2VydCBmb3IgMW1zICovXAorICAgIG91dGwoMHgwMCwgREU0WDVfR0VQKTtcCisgICAgbWRlbGF5KDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdhaXQgZm9yIDJtcyAqL1wKK30KKworDAorc3RhdGljIGludCBfX2RldmluaXQgCitkZTR4NV9od19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfbG9uZyBpb2Jhc2UsIHN0cnVjdCBkZXZpY2UgKmdlbmRldikKK3sKKyAgICBjaGFyIG5hbWVbREU0WDVfTkFNRV9MRU5HVEggKyAxXTsKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKyAgICBpbnQgaSwgc3RhdHVzPTA7CisKKyAgICBnZW5kZXYtPmRyaXZlcl9kYXRhID0gZGV2OworCisgICAgLyogRW5zdXJlIHdlJ3JlIG5vdCBzbGVlcGluZyAqLworICAgIGlmIChscC0+YnVzID09IEVJU0EpIHsKKwlvdXRiKFdBS0VVUCwgUENJX0NGUE0pOworICAgIH0gZWxzZSB7CisJcGRldiA9IHRvX3BjaV9kZXYgKGdlbmRldik7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DRkRBX1BTTSwgV0FLRVVQKTsKKyAgICB9CisgICAgbWRlbGF5KDEwKTsKKworICAgIFJFU0VUX0RFNFg1OworICAgIAorICAgIGlmICgoaW5sKERFNFg1X1NUUykgJiAoU1RTX1RTIHwgU1RTX1JTKSkgIT0gMCkgeworCXJldHVybiAtRU5YSU87ICAgICAgICAgICAgICAgICAgICAgICAvKiBIYXJkd2FyZSBjb3VsZCBub3QgcmVzZXQgKi8KKyAgICB9CisgICAgCisgICAgLyogCisgICAgKiogTm93IGZpbmQgb3V0IHdoYXQga2luZCBvZiBEQzIxMDQwL0RDMjEwNDEvREMyMTE0MCBib2FyZCB3ZSBoYXZlLgorICAgICovCisgICAgbHAtPnVzZVNST00gPSBGQUxTRTsKKyAgICBpZiAobHAtPmJ1cyA9PSBQQ0kpIHsKKwlQQ0lfc2lnbmF0dXJlKG5hbWUsIGxwKTsKKyAgICB9IGVsc2UgeworCUVJU0Ffc2lnbmF0dXJlKG5hbWUsIGdlbmRldik7CisgICAgfQorICAgIAorICAgIGlmICgqbmFtZSA9PSAnXDAnKSB7ICAgICAgICAgICAgICAgICAgICAgLyogTm90IGZvdW5kIGEgYm9hcmQgc2lnbmF0dXJlICovCisJcmV0dXJuIC1FTlhJTzsKKyAgICB9CisgICAgCisgICAgZGV2LT5iYXNlX2FkZHIgPSBpb2Jhc2U7CisgICAgcHJpbnRrICgiJXM6ICVzIGF0IDB4JTA0bHgiLCBnZW5kZXYtPmJ1c19pZCwgbmFtZSwgaW9iYXNlKTsKKyAgICAKKyAgICBwcmludGsoIiwgaC93IGFkZHJlc3MgIik7CisgICAgc3RhdHVzID0gZ2V0X2h3X2FkZHIoZGV2KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU4gLSAxOyBpKyspIHsgICAgIC8qIGdldCB0aGUgZXRoZXJuZXQgYWRkci4gKi8KKwlwcmludGsoIiUyLjJ4OiIsIGRldi0+ZGV2X2FkZHJbaV0pOworICAgIH0KKyAgICBwcmludGsoIiUyLjJ4LFxuIiwgZGV2LT5kZXZfYWRkcltpXSk7CisgICAgCisgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisJcHJpbnRrKCIgICAgICB3aGljaCBoYXMgYW4gRXRoZXJuZXQgUFJPTSBDUkMgZXJyb3IuXG4iKTsKKwlyZXR1cm4gLUVOWElPOworICAgIH0gZWxzZSB7CisJbHAtPmNhY2hlLmdlcGMgPSBHRVBfSU5JVDsKKwlscC0+YXNCaXQgPSBHRVBfU0xOSzsKKwlscC0+YXNQb2xhcml0eSA9IEdFUF9TTE5LOworCWxwLT5hc0JpdFZhbGlkID0gVFJVRTsKKwlscC0+dGltZW91dCA9IC0xOworCWxwLT5nZW5kZXYgPSBnZW5kZXY7CisJc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKwlpbml0X3RpbWVyKCZscC0+dGltZXIpOworCWRlNHg1X3BhcnNlX3BhcmFtcyhkZXYpOworCisJLyoKKwkqKiBDaG9vc2UgY29ycmVjdCBhdXRvc2Vuc2luZyBpbiBjYXNlIHNvbWVvbmUgbWVzc2VkIHVwCisJKi8KKyAgICAgICAgbHAtPmF1dG9zZW5zZSA9IGxwLT5wYXJhbXMuYXV0b3NlbnNlOworICAgICAgICBpZiAobHAtPmNoaXBzZXQgIT0gREMyMTE0MCkgeworICAgICAgICAgICAgaWYgKChscC0+Y2hpcHNldD09REMyMTA0MCkgJiYgKGxwLT5wYXJhbXMuYXV0b3NlbnNlJlRQX05XKSkgeworICAgICAgICAgICAgICAgIGxwLT5wYXJhbXMuYXV0b3NlbnNlID0gVFA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGxwLT5jaGlwc2V0PT1EQzIxMDQxKSAmJiAobHAtPnBhcmFtcy5hdXRvc2Vuc2UmQk5DX0FVSSkpIHsKKyAgICAgICAgICAgICAgICBscC0+cGFyYW1zLmF1dG9zZW5zZSA9IEJOQzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCWxwLT5mZHggPSBscC0+cGFyYW1zLmZkeDsKKwlzcHJpbnRmKGxwLT5hZGFwdGVyX25hbWUsIiVzICglcykiLCBuYW1lLCBnZW5kZXYtPmJ1c19pZCk7CisKKwlscC0+ZG1hX3NpemUgPSAoTlVNX1JYX0RFU0MgKyBOVU1fVFhfREVTQykgKiBzaXplb2Yoc3RydWN0IGRlNHg1X2Rlc2MpOworI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9fcG93ZXJwY19fKSB8fCBkZWZpbmVkKF9fc3BhcmNfdjlfXykgfHwgZGVmaW5lZChERTRYNV9ET19NRU1DUFkpCisJbHAtPmRtYV9zaXplICs9IFJYX0JVRkZfU1ogKiBOVU1fUlhfREVTQyArIERFNFg1X0FMSUdOOworI2VuZGlmCisJbHAtPnJ4X3JpbmcgPSBkbWFfYWxsb2NfY29oZXJlbnQoZ2VuZGV2LCBscC0+ZG1hX3NpemUsCisJCQkJCSAmbHAtPmRtYV9yaW5ncywgR0ZQX0FUT01JQyk7CisJaWYgKGxwLT5yeF9yaW5nID09IE5VTEwpIHsKKwkgICAgcmV0dXJuIC1FTk9NRU07CisJfQorCisJbHAtPnR4X3JpbmcgPSBscC0+cnhfcmluZyArIE5VTV9SWF9ERVNDOworCSAgICAKKwkvKgorCSoqIFNldCB1cCB0aGUgUlggZGVzY3JpcHRvciByaW5nIChJbnRlbHMpCisJKiogQWxsb2NhdGUgY29udGlndW91cyByZWNlaXZlIGJ1ZmZlcnMsIGxvbmcgd29yZCBhbGlnbmVkIChBbHBoYXMpIAorCSovCisjaWYgIWRlZmluZWQoX19hbHBoYV9fKSAmJiAhZGVmaW5lZChfX3Bvd2VycGNfXykgJiYgIWRlZmluZWQoX19zcGFyY192OV9fKSAmJiAhZGVmaW5lZChERTRYNV9ET19NRU1DUFkpCisJZm9yIChpPTA7IGk8TlVNX1JYX0RFU0M7IGkrKykgeworCSAgICBscC0+cnhfcmluZ1tpXS5zdGF0dXMgPSAwOworCSAgICBscC0+cnhfcmluZ1tpXS5kZXMxID0gY3B1X3RvX2xlMzIoUlhfQlVGRl9TWik7CisJICAgIGxwLT5yeF9yaW5nW2ldLmJ1ZiA9IDA7CisJICAgIGxwLT5yeF9yaW5nW2ldLm5leHQgPSAwOworCSAgICBscC0+cnhfc2tiW2ldID0gKHN0cnVjdCBza19idWZmICopIDE7ICAgICAvKiBEdW1teSBlbnRyeSAqLworCX0KKworI2Vsc2UKKwl7CisJCWRtYV9hZGRyX3QgZG1hX3J4X2J1ZnM7CisKKwkJZG1hX3J4X2J1ZnMgPSBscC0+ZG1hX3JpbmdzICsgKE5VTV9SWF9ERVNDICsgTlVNX1RYX0RFU0MpCisJCSAgICAgIAkqIHNpemVvZihzdHJ1Y3QgZGU0eDVfZGVzYyk7CisJCWRtYV9yeF9idWZzID0gKGRtYV9yeF9idWZzICsgREU0WDVfQUxJR04pICYgfkRFNFg1X0FMSUdOOworCQlscC0+cnhfYnVmcyA9IChjaGFyICopKCgobG9uZykobHAtPnJ4X3JpbmcgKyBOVU1fUlhfREVTQworCQkgICAgICAJKyBOVU1fVFhfREVTQykgKyBERTRYNV9BTElHTikgJiB+REU0WDVfQUxJR04pOworCQlmb3IgKGk9MDsgaTxOVU1fUlhfREVTQzsgaSsrKSB7CisJICAgIAkJbHAtPnJ4X3JpbmdbaV0uc3RhdHVzID0gMDsKKwkgICAgCQlscC0+cnhfcmluZ1tpXS5kZXMxID0gY3B1X3RvX2xlMzIoUlhfQlVGRl9TWik7CisJICAgIAkJbHAtPnJ4X3JpbmdbaV0uYnVmID0KKwkJCQljcHVfdG9fbGUzMihkbWFfcnhfYnVmcytpKlJYX0JVRkZfU1opOworCSAgICAJCWxwLT5yeF9yaW5nW2ldLm5leHQgPSAwOworCSAgICAJCWxwLT5yeF9za2JbaV0gPSAoc3RydWN0IHNrX2J1ZmYgKikgMTsgLyogRHVtbXkgZW50cnkgKi8KKwkJfQorCisJfQorI2VuZGlmCisKKwliYXJyaWVyKCk7CisKKwlscC0+cnhSaW5nU2l6ZSA9IE5VTV9SWF9ERVNDOworCWxwLT50eFJpbmdTaXplID0gTlVNX1RYX0RFU0M7CisJICAgIAorCS8qIFdyaXRlIHRoZSBlbmQgb2YgbGlzdCBtYXJrZXIgdG8gdGhlIGRlc2NyaXB0b3IgbGlzdHMgKi8KKwlscC0+cnhfcmluZ1tscC0+cnhSaW5nU2l6ZSAtIDFdLmRlczEgfD0gY3B1X3RvX2xlMzIoUkRfUkVSKTsKKwlscC0+dHhfcmluZ1tscC0+dHhSaW5nU2l6ZSAtIDFdLmRlczEgfD0gY3B1X3RvX2xlMzIoVERfVEVSKTsKKworCS8qIFRlbGwgdGhlIGFkYXB0ZXIgd2hlcmUgdGhlIFRYL1JYIHJpbmdzIGFyZSBsb2NhdGVkLiAqLworCW91dGwobHAtPmRtYV9yaW5ncywgREU0WDVfUlJCQSk7CisJb3V0bChscC0+ZG1hX3JpbmdzICsgTlVNX1JYX0RFU0MgKiBzaXplb2Yoc3RydWN0IGRlNHg1X2Rlc2MpLAorCSAgICAgREU0WDVfVFJCQSk7CisJICAgIAorCS8qIEluaXRpYWxpc2UgdGhlIElSUSBtYXNrIGFuZCBFbmFibGUvRGlzYWJsZSAqLworCWxwLT5pcnFfbWFzayA9IElNUl9SSU0gfCBJTVJfVElNIHwgSU1SX1RVTSB8IElNUl9VTk07CisJbHAtPmlycV9lbiAgID0gSU1SX05JTSB8IElNUl9BSU07CisKKwkvKiBDcmVhdGUgYSBsb29wYmFjayBwYWNrZXQgZnJhbWUgZm9yIGxhdGVyIG1lZGlhIHByb2JpbmcgKi8KKwljcmVhdGVfcGFja2V0KGRldiwgbHAtPmZyYW1lLCBzaXplb2YobHAtPmZyYW1lKSk7CisKKwkvKiBDaGVjayBpZiB0aGUgUlggb3ZlcmZsb3cgYnVnIG5lZWRzIHRlc3RpbmcgZm9yICovCisJaSA9IGxwLT5jZnJ2ICYgMHgwMDAwMDBmZTsKKwlpZiAoKGxwLT5jaGlwc2V0ID09IERDMjExNDApICYmIChpID09IDB4MjApKSB7CisJICAgIGxwLT5yeF9vdmYgPSAxOworCX0KKworCS8qIEluaXRpYWxpc2UgdGhlIFNST00gcG9pbnRlcnMgaWYgcG9zc2libGUgKi8KKwlpZiAobHAtPnVzZVNST00pIHsKKwkgICAgbHAtPnN0YXRlID0gSU5JVElBTElTRUQ7CisJICAgIGlmIChzcm9tX2luZm9sZWFmX2luZm8oZGV2KSkgeworCSAgICAgICAgZG1hX2ZyZWVfY29oZXJlbnQgKGdlbmRldiwgbHAtPmRtYV9zaXplLAorCQkJICAgICAgIGxwLT5yeF9yaW5nLCBscC0+ZG1hX3JpbmdzKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwkgICAgfQorCSAgICBzcm9tX2luaXQoZGV2KTsKKwl9CisKKwlscC0+c3RhdGUgPSBDTE9TRUQ7CisKKwkvKgorCSoqIENoZWNrIGZvciBhbiBNSUkgaW50ZXJmYWNlCisJKi8KKwlpZiAoKGxwLT5jaGlwc2V0ICE9IERDMjEwNDApICYmIChscC0+Y2hpcHNldCAhPSBEQzIxMDQxKSkgeworCSAgICBtaWlfZ2V0X3BoeShkZXYpOworCX0KKwkKKyNpZm5kZWYgX19zcGFyY192OV9fCisJcHJpbnRrKCIgICAgICBhbmQgcmVxdWlyZXMgSVJRJWQgKHByb3ZpZGVkIGJ5ICVzKS5cbiIsIGRldi0+aXJxLAorI2Vsc2UKKwlwcmludGsoIiAgICAgIGFuZCByZXF1aXJlcyBJUlEleCAocHJvdmlkZWQgYnkgJXMpLlxuIiwgZGV2LT5pcnEsCisjZW5kaWYKKwkgICAgICAgKChscC0+YnVzID09IFBDSSkgPyAiUENJIEJJT1MiIDogIkVJU0EgQ05GRyIpKTsKKyAgICB9CisgICAgCisgICAgaWYgKGRlNHg1X2RlYnVnICYgREVCVUdfVkVSU0lPTikgeworCXByaW50ayh2ZXJzaW9uKTsKKyAgICB9CisgICAgCisgICAgLyogVGhlIERFNFg1LXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisgICAgU0VUX01PRFVMRV9PV05FUihkZXYpOworICAgIFNFVF9ORVRERVZfREVWKGRldiwgZ2VuZGV2KTsKKyAgICBkZXYtPm9wZW4gPSAmZGU0eDVfb3BlbjsKKyAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZkZTR4NV9xdWV1ZV9wa3Q7CisgICAgZGV2LT5zdG9wID0gJmRlNHg1X2Nsb3NlOworICAgIGRldi0+Z2V0X3N0YXRzID0gJmRlNHg1X2dldF9zdGF0czsKKyAgICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfbXVsdGljYXN0X2xpc3Q7CisgICAgZGV2LT5kb19pb2N0bCA9ICZkZTR4NV9pb2N0bDsKKyAgICAKKyAgICBkZXYtPm1lbV9zdGFydCA9IDA7CisgICAgCisgICAgLyogRmlsbCBpbiB0aGUgZ2VuZXJpYyBmaWVsZHMgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisgICAgaWYgKChzdGF0dXMgPSByZWdpc3Rlcl9uZXRkZXYgKGRldikpKSB7CisJICAgIGRtYV9mcmVlX2NvaGVyZW50IChnZW5kZXYsIGxwLT5kbWFfc2l6ZSwKKwkJCSAgICAgICBscC0+cnhfcmluZywgbHAtPmRtYV9yaW5ncyk7CisJICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIAorICAgIC8qIExldCB0aGUgYWRhcHRlciBzbGVlcCB0byBzYXZlIHBvd2VyICovCisgICAgeWF3bihkZXYsIFNMRUVQKTsKKyAgICAKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisMCitzdGF0aWMgaW50CitkZTR4NV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGksIHN0YXR1cyA9IDA7CisgICAgczMyIG9tcjsKKworICAgIC8qIEFsbG9jYXRlIHRoZSBSWCBidWZmZXJzICovCisgICAgZm9yIChpPTA7IGk8bHAtPnJ4UmluZ1NpemU7IGkrKykgeworCWlmIChkZTR4NV9hbGxvY19yeF9idWZmKGRldiwgaSwgMCkgPT0gTlVMTCkgeworCSAgICBkZTR4NV9mcmVlX3J4X2J1ZmZzKGRldik7CisJICAgIHJldHVybiAtRUFHQUlOOworCX0KKyAgICB9CisKKyAgICAvKgorICAgICoqIFdha2UgdXAgdGhlIGFkYXB0ZXIKKyAgICAqLworICAgIHlhd24oZGV2LCBXQUtFVVApOworCisgICAgLyogCisgICAgKiogUmUtaW5pdGlhbGl6ZSB0aGUgREU0WDUuLi4gCisgICAgKi8KKyAgICBzdGF0dXMgPSBkZTR4NV9pbml0KGRldik7CisgICAgc3Bpbl9sb2NrX2luaXQoJmxwLT5sb2NrKTsKKyAgICBscC0+c3RhdGUgPSBPUEVOOworICAgIGRlNHg1X2RiZ19vcGVuKGRldik7CisgICAgCisgICAgaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAodm9pZCAqKWRlNHg1X2ludGVycnVwdCwgU0FfU0hJUlEsIAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPmFkYXB0ZXJfbmFtZSwgZGV2KSkgeworCXByaW50aygiZGU0eDVfb3BlbigpOiBSZXF1ZXN0ZWQgSVJRJWQgaXMgYnVzeSAtIGF0dGVtcGluZyBGQVNUL1NIQVJFLi4uIiwgZGV2LT5pcnEpOworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgZGU0eDVfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPmFkYXB0ZXJfbmFtZSwgZGV2KSkgeworCSAgICBwcmludGsoIlxuICAgICAgICAgICAgICBDYW5ub3QgZ2V0IElSUS0gcmVjb25maWd1cmUgeW91ciBoYXJkd2FyZS5cbiIpOworCSAgICBkaXNhYmxlX2FzdChkZXYpOworCSAgICBkZTR4NV9mcmVlX3J4X2J1ZmZzKGRldik7CisJICAgIGRlNHg1X2ZyZWVfdHhfYnVmZnMoZGV2KTsKKwkgICAgeWF3bihkZXYsIFNMRUVQKTsKKwkgICAgbHAtPnN0YXRlID0gQ0xPU0VEOworCSAgICByZXR1cm4gLUVBR0FJTjsKKwl9IGVsc2UgeworCSAgICBwcmludGsoIlxuICAgICAgICAgICAgICBTdWNjZWVkZWQsIGJ1dCB5b3Ugc2hvdWxkIHJlY29uZmlndXJlIHlvdXIgaGFyZHdhcmUgdG8gYXZvaWQgdGhpcy5cbiIpOworCSAgICBwcmludGsoIldBUk5JTkc6IHRoZXJlIG1heSBiZSBJUlEgcmVsYXRlZCBwcm9ibGVtcyBpbiBoZWF2aWx5IGxvYWRlZCBzeXN0ZW1zLlxuIik7CisJfQorICAgIH0KKworICAgIGxwLT5pbnRlcnJ1cHQgPSBVTk1BU0tfSU5URVJSVVBUUzsKKyAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICAKKyAgICBTVEFSVF9ERTRYNTsKKwkKKyAgICBkZTR4NV9zZXR1cF9pbnRyKGRldik7CisgICAgCisgICAgaWYgKGRlNHg1X2RlYnVnICYgREVCVUdfT1BFTikgeworCXByaW50aygiXHRzdHM6ICAweCUwOHhcbiIsIGlubChERTRYNV9TVFMpKTsKKwlwcmludGsoIlx0Ym1yOiAgMHglMDh4XG4iLCBpbmwoREU0WDVfQk1SKSk7CisJcHJpbnRrKCJcdGltcjogIDB4JTA4eFxuIiwgaW5sKERFNFg1X0lNUikpOworCXByaW50aygiXHRvbXI6ICAweCUwOHhcbiIsIGlubChERTRYNV9PTVIpKTsKKwlwcmludGsoIlx0c2lzcjogMHglMDh4XG4iLCBpbmwoREU0WDVfU0lTUikpOworCXByaW50aygiXHRzaWNyOiAweCUwOHhcbiIsIGlubChERTRYNV9TSUNSKSk7CisJcHJpbnRrKCJcdHN0cnI6IDB4JTA4eFxuIiwgaW5sKERFNFg1X1NUUlIpKTsKKwlwcmludGsoIlx0c2lncjogMHglMDh4XG4iLCBpbmwoREU0WDVfU0lHUikpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKgorKiogSW5pdGlhbGl6ZSB0aGUgREU0WDUgb3BlcmF0aW5nIGNvbmRpdGlvbnMuIE5COiBhIGNoaXAgcHJvYmxlbSB3aXRoIHRoZQorKiogREMyMTE0MCByZXF1aXJlcyB1c2luZyBwZXJmZWN0IGZpbHRlcmluZyBtb2RlIGZvciB0aGF0IGNoaXAuIFNpbmNlIEkgY2FuJ3QKKyoqIHNlZSB3aHkgSSdkIHdhbnQgPiAxNCBtdWx0aWNhc3QgYWRkcmVzc2VzLCBJIGhhdmUgY2hhbmdlZCBhbGwgY2hpcHMgdG8gdXNlCisqKiB0aGUgcGVyZmVjdCBmaWx0ZXJpbmcgbW9kZS4gS2VlcCB0aGUgRE1BIGJ1cnN0IGxlbmd0aCBhdCA4OiB0aGVyZSBzZWVtcworKiogdG8gYmUgZGF0YSBjb3JydXB0aW9uIHByb2JsZW1zIGlmIGl0IGlzIGxhcmdlciAoVURQIGVycm9ycyBzZWVuIGZyb20gYQorKiogdHRjcCBzb3VyY2UpLgorKi8KK3N0YXRpYyBpbnQKK2RlNHg1X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sgIAorICAgIC8qIExvY2sgb3V0IG90aGVyIHByb2Nlc3NlcyB3aGlsc3Qgc2V0dGluZyB1cCB0aGUgaGFyZHdhcmUgKi8KKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgCisgICAgZGU0eDVfc3dfcmVzZXQoZGV2KTsKKyAgICAKKyAgICAvKiBBdXRvY29uZmlndXJlIHRoZSBjb25uZWN0ZWQgcG9ydCAqLworICAgIGF1dG9jb25mX21lZGlhKGRldik7CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RlNHg1X3N3X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGksIGosIHN0YXR1cyA9IDA7CisgICAgczMyIGJtciwgb21yOworICAgIAorICAgIC8qIFNlbGVjdCB0aGUgTUlJIG9yIFNSTCBwb3J0IG5vdyBhbmQgUkVTRVQgdGhlIE1BQyAqLworICAgIGlmICghbHAtPnVzZVNST00pIHsKKwlpZiAobHAtPnBoeVtscC0+YWN0aXZlXS5pZCAhPSAwKSB7CisJICAgIGxwLT5pbmZvYmxvY2tfY3NyNiA9IE9NUl9TRFAgfCBPTVJfUFMgfCBPTVJfSEJEOworCX0gZWxzZSB7CisJICAgIGxwLT5pbmZvYmxvY2tfY3NyNiA9IE9NUl9TRFAgfCBPTVJfVFRNOworCX0KKwlkZTR4NV9zd2l0Y2hfbWFjX3BvcnQoZGV2KTsKKyAgICB9CisKKyAgICAvKiAKKyAgICAqKiBTZXQgdGhlIHByb2dyYW1tYWJsZSBidXJzdCBsZW5ndGggdG8gOCBsb25nd29yZHMgZm9yIGFsbCB0aGUgREMyMTE0MAorICAgICoqIEZhc3Rlcm5ldCBjaGlwcyBhbmQgNCBsb25nd29yZHMgZm9yIGFsbCBvdGhlcnM6IERNQSBlcnJvcnMgcmVzdWx0CisgICAgKiogd2l0aG91dCB0aGVzZSB2YWx1ZXMuIENhY2hlIGFsaWduIDE2IGxvbmcuCisgICAgKi8KKyAgICBibXIgPSAobHAtPmNoaXBzZXQ9PURDMjExNDAgPyBQQkxfOCA6IFBCTF80KSB8IERFU0NfU0tJUF9MRU4gfCBERTRYNV9DQUNIRV9BTElHTjsKKyAgICBibXIgfD0gKChscC0+Y2hpcHNldCAmIH4weDAwZmYpPT1EQzIxMTR4ID8gQk1SX1JNTCA6IDApOworICAgIG91dGwoYm1yLCBERTRYNV9CTVIpOworCisgICAgb21yID0gaW5sKERFNFg1X09NUikgJiB+T01SX1BSOyAgICAgICAgICAgICAvKiBUdXJuIG9mZiBwcm9taXNjdW91cyBtb2RlICovCisgICAgaWYgKGxwLT5jaGlwc2V0ID09IERDMjExNDApIHsKKwlvbXIgfD0gKE9NUl9TRFAgfCBPTVJfU0IpOworICAgIH0KKyAgICBscC0+c2V0dXBfZiA9IFBFUkZFQ1Q7CisgICAgb3V0bChscC0+ZG1hX3JpbmdzLCBERTRYNV9SUkJBKTsKKyAgICBvdXRsKGxwLT5kbWFfcmluZ3MgKyBOVU1fUlhfREVTQyAqIHNpemVvZihzdHJ1Y3QgZGU0eDVfZGVzYyksCisJIERFNFg1X1RSQkEpOworICAgIAorICAgIGxwLT5yeF9uZXcgPSBscC0+cnhfb2xkID0gMDsKKyAgICBscC0+dHhfbmV3ID0gbHAtPnR4X29sZCA9IDA7CisgICAgCisgICAgZm9yIChpID0gMDsgaSA8IGxwLT5yeFJpbmdTaXplOyBpKyspIHsKKwlscC0+cnhfcmluZ1tpXS5zdGF0dXMgPSBjcHVfdG9fbGUzMihSX09XTik7CisgICAgfQorICAgIAorICAgIGZvciAoaSA9IDA7IGkgPCBscC0+dHhSaW5nU2l6ZTsgaSsrKSB7CisJbHAtPnR4X3JpbmdbaV0uc3RhdHVzID0gY3B1X3RvX2xlMzIoMCk7CisgICAgfQorICAgIAorICAgIGJhcnJpZXIoKTsKKworICAgIC8qIEJ1aWxkIHRoZSBzZXR1cCBmcmFtZSBkZXBlbmRpbmcgb24gZmlsdGVyaW5nIG1vZGUgKi8KKyAgICBTZXRNdWx0aWNhc3RGaWx0ZXIoZGV2KTsKKyAgICAKKyAgICBsb2FkX3BhY2tldChkZXYsIGxwLT5zZXR1cF9mcmFtZSwgUEVSRkVDVF9GfFREX1NFVHxTRVRVUF9GUkFNRV9MRU4sIChzdHJ1Y3Qgc2tfYnVmZiAqKTEpOworICAgIG91dGwob21yfE9NUl9TVCwgREU0WDVfT01SKTsKKworICAgIC8qIFBvbGwgZm9yIHNldHVwIGZyYW1lIGNvbXBsZXRpb24gKGFkYXB0ZXIgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgbm93KSAqLworCisgICAgZm9yIChqPTAsIGk9MDsoaTw1MDApICYmIChqPT0wKTtpKyspIHsgICAgICAgLyogVXB0byA1MDBtcyBkZWxheSAqLworCW1kZWxheSgxKTsKKwlpZiAoKHMzMilsZTMyX3RvX2NwdShscC0+dHhfcmluZ1tscC0+dHhfbmV3XS5zdGF0dXMpID49IDApIGo9MTsKKyAgICB9CisgICAgb3V0bChvbXIsIERFNFg1X09NUik7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RvcCBldmVyeXRoaW5nISAqLworCisgICAgaWYgKGogPT0gMCkgeworCXByaW50aygiJXM6IFNldHVwIGZyYW1lIHRpbWVkIG91dCwgc3RhdHVzICUwOHhcbiIsIGRldi0+bmFtZSwgCisJICAgICAgIGlubChERTRYNV9TVFMpKTsKKwlzdGF0dXMgPSAtRUlPOworICAgIH0KKyAgICAKKyAgICBscC0+dHhfbmV3ID0gKCsrbHAtPnR4X25ldykgJSBscC0+dHhSaW5nU2l6ZTsKKyAgICBscC0+dHhfb2xkID0gbHAtPnR4X25ldzsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIAorKiogV3JpdGVzIGEgc29ja2V0IGJ1ZmZlciBhZGRyZXNzIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSB0cmFuc21pdCBkZXNjcmlwdG9yLgorKi8KK3N0YXRpYyBpbnQKK2RlNHg1X3F1ZXVlX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBzdGF0dXMgPSAwOworICAgIHVfbG9uZyBmbGFncyA9IDA7CisKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgaWYgKGxwLT50eF9lbmFibGUgPT0gTk8pIHsgICAgICAgICAgICAgICAgICAgLyogQ2Fubm90IHNlbmQgZm9yIG5vdyAqLworCXJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKgorICAgICoqIENsZWFuIG91dCB0aGUgVFggcmluZyBhc3luY2hyb25vdXNseSB0byBpbnRlcnJ1cHRzIC0gc29tZXRpbWVzIHRoZQorICAgICoqIGludGVycnVwdHMgYXJlIGxvc3QgYnkgZGVsYXllZCBkZXNjcmlwdG9yIHN0YXR1cyB1cGRhdGVzIHJlbGF0aXZlIHRvCisgICAgKiogdGhlIGlycSBhc3NlcnRpb24sIGVzcGVjaWFsbHkgd2l0aCBhIGJ1c3kgUENJIGJ1cy4KKyAgICAqLworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworICAgIGRlNHg1X3R4KGRldik7CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworICAgIC8qIFRlc3QgaWYgY2FjaGUgaXMgYWxyZWFkeSBsb2NrZWQgLSByZXF1ZXVlIHNrYiBpZiBzbyAqLworICAgIGlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICh2b2lkICopJmxwLT5jYWNoZS5sb2NrKSAmJiAhbHAtPmludGVycnVwdCkgCisJcmV0dXJuIC0xOworCisgICAgLyogVHJhbnNtaXQgZGVzY3JpcHRvciByaW5nIGZ1bGwgb3Igc3RhbGUgc2tiICovCisgICAgaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSB8fCAodV9sb25nKSBscC0+dHhfc2tiW2xwLT50eF9uZXddID4gMSkgeworCWlmIChscC0+aW50ZXJydXB0KSB7CisJICAgIGRlNHg1X3B1dGJfY2FjaGUoZGV2LCBza2IpOyAgICAgICAgICAvKiBSZXF1ZXVlIHRoZSBidWZmZXIgKi8KKwl9IGVsc2UgeworCSAgICBkZTR4NV9wdXRfY2FjaGUoZGV2LCBza2IpOworCX0KKwlpZiAoZGU0eDVfZGVidWcgJiBERUJVR19UWCkgeworCSAgICBwcmludGsoIiVzOiB0cmFuc21pdCBidXN5LCBsb3N0IG1lZGlhIG9yIHN0YWxlIHNrYiBmb3VuZDpcbiAgU1RTOiUwOHhcbiAgdGJ1c3k6JWRcbiAgSU1SOiUwOHhcbiAgT01SOiUwOHhcbiBTdGFsZSBza2I6ICVzXG4iLGRldi0+bmFtZSwgaW5sKERFNFg1X1NUUyksIG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSwgaW5sKERFNFg1X0lNUiksIGlubChERTRYNV9PTVIpLCAoKHVfbG9uZykgbHAtPnR4X3NrYltscC0+dHhfbmV3XSA+IDEpID8gIllFUyIgOiAiTk8iKTsKKwl9CisgICAgfSBlbHNlIGlmIChza2ItPmxlbiA+IDApIHsKKwkvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgc3R1ZmYgcXVldWVkIGxvY2FsbHksIHVzZSB0aGF0IGZpcnN0ICovCisJaWYgKGxwLT5jYWNoZS5za2IgJiYgIWxwLT5pbnRlcnJ1cHQpIHsKKwkgICAgZGU0eDVfcHV0X2NhY2hlKGRldiwgc2tiKTsKKwkgICAgc2tiID0gZGU0eDVfZ2V0X2NhY2hlKGRldik7CisJfQorCisJd2hpbGUgKHNrYiAmJiAhbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpICYmCisJICAgICAgICh1X2xvbmcpIGxwLT50eF9za2JbbHAtPnR4X25ld10gPD0gMSkgeworCSAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwkgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCSAgICBsb2FkX3BhY2tldChkZXYsIHNrYi0+ZGF0YSwgVERfSUMgfCBURF9MUyB8IFREX0ZTIHwgc2tiLT5sZW4sIHNrYik7CisgCSAgICBscC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJICAgIG91dGwoUE9MTF9ERU1BTkQsIERFNFg1X1RQRCk7LyogU3RhcnQgdGhlIFRYICovCisJCQorCSAgICBscC0+dHhfbmV3ID0gKCsrbHAtPnR4X25ldykgJSBscC0+dHhSaW5nU2l6ZTsKKwkgICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCSAgICAKKwkgICAgaWYgKFRYX0JVRkZTX0FWQUlMKSB7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7ICAgICAgICAgLyogQW5vdGhlciBwa3QgbWF5IGJlIHF1ZXVlZCAqLworCSAgICB9CisJICAgIHNrYiA9IGRlNHg1X2dldF9jYWNoZShkZXYpOworCSAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCX0KKwlpZiAoc2tiKSBkZTR4NV9wdXRiX2NhY2hlKGRldiwgc2tiKTsKKyAgICB9CisgICAgCisgICAgbHAtPmNhY2hlLmxvY2sgPSAwOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyoqIFRoZSBERTRYNSBpbnRlcnJ1cHQgaGFuZGxlci4gCisqKiAKKyoqIEkvTyBSZWFkL1dyaXRlcyB0aHJvdWdoIGludGVybWVkaWF0ZSBQQ0kgYnJpZGdlcyBhcmUgbmV2ZXIgJ3Bvc3RlZCcsCisqKiBzbyB0aGF0IHRoZSBhc3NlcnRlZCBpbnRlcnJ1cHQgYWx3YXlzIGhhcyBzb21lIHJlYWwgZGF0YSB0byB3b3JrIHdpdGggLQorKiogaWYgdGhlc2UgSS9PIGFjY2Vzc2VzIGFyZSBldmVyIGNoYW5nZWQgdG8gbWVtb3J5IGFjY2Vzc2VzLCBlbnN1cmUgdGhlCisqKiBTVFMgd3JpdGUgaXMgcmVhZCBpbW1lZGlhdGVseSB0byBjb21wbGV0ZSB0aGUgdHJhbnNhY3Rpb24gaWYgdGhlIGFkYXB0ZXIKKyoqIGlzIG5vdCBvbiBidXMgMC4gTG9zdCBpbnRlcnJ1cHRzIGNhbiBzdGlsbCBvY2N1ciB3aGVuIHRoZSBQQ0kgYnVzIGxvYWQKKyoqIGlzIGhpZ2ggYW5kIGRlc2NyaXB0b3Igc3RhdHVzIGJpdHMgY2Fubm90IGJlIHNldCBiZWZvcmUgdGhlIGFzc29jaWF0ZWQKKyoqIGludGVycnVwdCBpcyBhc3NlcnRlZCBhbmQgdGhpcyByb3V0aW5lIGVudGVyZWQuCisqLworc3RhdGljIGlycXJldHVybl90CitkZTR4NV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscDsKKyAgICBzMzIgaW1yLCBvbXIsIHN0cywgbGltaXQ7CisgICAgdV9sb25nIGlvYmFzZTsKKyAgICB1bnNpZ25lZCBpbnQgaGFuZGxlZCA9IDA7CisgICAgCisgICAgaWYgKGRldiA9PSBOVUxMKSB7CisJcHJpbnRrICgiZGU0eDVfaW50ZXJydXB0KCk6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBpcnEpOworCXJldHVybiBJUlFfTk9ORTsKKyAgICB9CisgICAgbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHNwaW5fbG9jaygmbHAtPmxvY2spOworICAgIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCQorICAgIERJU0FCTEVfSVJRczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbnN1cmUgbm9uIHJlLWVudHJhbmN5ICovCisKKyAgICBpZiAodGVzdF9hbmRfc2V0X2JpdChNQVNLX0lOVEVSUlVQVFMsICh2b2lkKikgJmxwLT5pbnRlcnJ1cHQpKQorCXByaW50aygiJXM6IFJlLWVudGVyaW5nIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci5cbiIsIGRldi0+bmFtZSk7CisKKyAgICBzeW5jaHJvbml6ZV9pcnEoZGV2LT5pcnEpOworCQorICAgIGZvciAobGltaXQ9MDsgbGltaXQ8ODsgbGltaXQrKykgeworCXN0cyA9IGlubChERTRYNV9TVFMpOyAgICAgICAgICAgIC8qIFJlYWQgSVJRIHN0YXR1cyAqLworCW91dGwoc3RzLCBERTRYNV9TVFMpOyAgICAgICAgICAgIC8qIFJlc2V0IHRoZSBib2FyZCBpbnRlcnJ1cHRzICovCisJICAgIAorCWlmICghKHN0cyAmIGxwLT5pcnFfbWFzaykpIGJyZWFrOy8qIEFsbCBkb25lICovCisJaGFuZGxlZCA9IDE7CisJICAgIAorCWlmIChzdHMgJiAoU1RTX1JJIHwgU1RTX1JVKSkgICAgIC8qIFJ4IGludGVycnVwdCAocGFja2V0W3NdIGFycml2ZWQpICovCisJICBkZTR4NV9yeChkZXYpOworCSAgICAKKwlpZiAoc3RzICYgKFNUU19USSB8IFNUU19UVSkpICAgICAvKiBUeCBpbnRlcnJ1cHQgKHBhY2tldCBzZW50KSAqLworCSAgZGU0eDVfdHgoZGV2KTsgCisJICAgIAorCWlmIChzdHMgJiBTVFNfTE5GKSB7ICAgICAgICAgICAgIC8qIFRQIExpbmsgaGFzIGZhaWxlZCAqLworCSAgICBscC0+aXJxX21hc2sgJj0gfklNUl9MRk07CisJfQorCSAgICAKKwlpZiAoc3RzICYgU1RTX1VORikgeyAgICAgICAgICAgICAvKiBUcmFuc21pdCB1bmRlcnJ1biAqLworCSAgICBkZTR4NV90eHVyKGRldik7CisJfQorCSAgICAKKwlpZiAoc3RzICYgU1RTX1NFKSB7ICAgICAgICAgICAgICAvKiBCdXMgRXJyb3IgKi8KKwkgICAgU1RPUF9ERTRYNTsKKwkgICAgcHJpbnRrKCIlczogRmF0YWwgYnVzIGVycm9yIG9jY3VycmVkLCBzdHM9JSM4eCwgZGV2aWNlIHN0b3BwZWQuXG4iLAorCQkgICBkZXYtPm5hbWUsIHN0cyk7CisJICAgIHNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisJICAgIHJldHVybiBJUlFfSEFORExFRDsKKwl9CisgICAgfQorCisgICAgLyogTG9hZCB0aGUgVFggcmluZyB3aXRoIGFueSBsb2NhbGx5IHN0b3JlZCBwYWNrZXRzICovCisgICAgaWYgKCF0ZXN0X2FuZF9zZXRfYml0KDAsICh2b2lkICopJmxwLT5jYWNoZS5sb2NrKSkgeworCXdoaWxlIChscC0+Y2FjaGUuc2tiICYmICFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgJiYgbHAtPnR4X2VuYWJsZSkgeworCSAgICBkZTR4NV9xdWV1ZV9wa3QoZGU0eDVfZ2V0X2NhY2hlKGRldiksIGRldik7CisJfQorCWxwLT5jYWNoZS5sb2NrID0gMDsKKyAgICB9CisKKyAgICBscC0+aW50ZXJydXB0ID0gVU5NQVNLX0lOVEVSUlVQVFM7CisgICAgRU5BQkxFX0lSUXM7CisgICAgc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKKyAgICAKKyAgICByZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIGludAorZGU0eDVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgZW50cnk7CisgICAgczMyIHN0YXR1czsKKyAgICAKKyAgICBmb3IgKGVudHJ5PWxwLT5yeF9uZXc7IChzMzIpbGUzMl90b19jcHUobHAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyk+PTA7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5PWxwLT5yeF9uZXcpIHsKKwlzdGF0dXMgPSAoczMyKWxlMzJfdG9fY3B1KGxwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMpOworCQorCWlmIChscC0+cnhfb3ZmKSB7CisJICAgIGlmIChpbmwoREU0WDVfTUZDKSAmIE1GQ19GT0NNKSB7CisJCWRlNHg1X3J4X292ZmMoZGV2KTsKKwkJYnJlYWs7CisJICAgIH0KKwl9CisKKwlpZiAoc3RhdHVzICYgUkRfRlMpIHsgICAgICAgICAgICAgICAgIC8qIFJlbWVtYmVyIHRoZSBzdGFydCBvZiBmcmFtZSAqLworCSAgICBscC0+cnhfb2xkID0gZW50cnk7CisJfQorCQorCWlmIChzdGF0dXMgJiBSRF9MUykgeyAgICAgICAgICAgICAgICAgLyogVmFsaWQgZnJhbWUgc3RhdHVzICovCisJICAgIGlmIChscC0+dHhfZW5hYmxlKSBscC0+bGlua09LKys7CisJICAgIGlmIChzdGF0dXMgJiBSRF9FUykgewkgICAgICAvKiBUaGVyZSB3YXMgYW4gZXJyb3IuICovCisJCWxwLT5zdGF0cy5yeF9lcnJvcnMrKzsgICAgICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3Igc3RhdHMuICovCisJCWlmIChzdGF0dXMgJiAoUkRfUkYgfCBSRF9UTCkpIGxwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIFJEX0NFKSAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIFJEX09GKSAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBSRF9UTCkgICAgICAgICAgIGxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBSRF9SRikgICAgICAgICAgIGxwLT5wa3RTdGF0cy5yeF9ydW50X2ZyYW1lcysrOworCQlpZiAoc3RhdHVzICYgUkRfQ1MpICAgICAgICAgICBscC0+cGt0U3RhdHMucnhfY29sbGlzaW9uKys7CisJCWlmIChzdGF0dXMgJiBSRF9EQikgICAgICAgICAgIGxwLT5wa3RTdGF0cy5yeF9kcmliYmxlKys7CisJCWlmIChzdGF0dXMgJiBSRF9PRikgICAgICAgICAgIGxwLT5wa3RTdGF0cy5yeF9vdmVyZmxvdysrOworCSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQSB2YWxpZCBmcmFtZSByZWNlaXZlZCAqLworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlzaG9ydCBwa3RfbGVuID0gKHNob3J0KShsZTMyX3RvX2NwdShscC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzKQorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gMTYpIC0gNDsKKwkJCisJCWlmICgoc2tiID0gZGU0eDVfYWxsb2NfcnhfYnVmZihkZXYsIGVudHJ5LCBwa3RfbGVuKSkgPT0gTlVMTCkgeworCQkgICAgcHJpbnRrKCIlczogSW5zdWZmaWNpZW50IG1lbW9yeTsgbnVraW5nIHBhY2tldC5cbiIsIAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUpOworCQkgICAgbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJfSBlbHNlIHsKKwkJICAgIGRlNHg1X2RiZ19yeChza2IsIHBrdF9sZW4pOworCisJCSAgICAvKiBQdXNoIHVwIHRoZSBwcm90b2NvbCBzdGFjayAqLworCQkgICAgc2tiLT5wcm90b2NvbD1ldGhfdHlwZV90cmFucyhza2IsZGV2KTsKKwkJICAgIGRlNHg1X2xvY2FsX3N0YXRzKGRldiwgc2tiLT5kYXRhLCBwa3RfbGVuKTsKKwkJICAgIG5ldGlmX3J4KHNrYik7CisJCSAgICAKKwkJICAgIC8qIFVwZGF0ZSBzdGF0cyAqLworCQkgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJICAgIGxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisgCQkgICAgbHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCX0KKwkgICAgfQorCSAgICAKKwkgICAgLyogQ2hhbmdlIGJ1ZmZlciBvd25lcnNoaXAgZm9yIHRoaXMgZnJhbWUsIGJhY2sgdG8gdGhlIGFkYXB0ZXIgKi8KKwkgICAgZm9yICg7bHAtPnJ4X29sZCE9ZW50cnk7bHAtPnJ4X29sZD0oKytscC0+cnhfb2xkKSVscC0+cnhSaW5nU2l6ZSkgeworCQlscC0+cnhfcmluZ1tscC0+cnhfb2xkXS5zdGF0dXMgPSBjcHVfdG9fbGUzMihSX09XTik7CisJCWJhcnJpZXIoKTsKKwkgICAgfQorCSAgICBscC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzID0gY3B1X3RvX2xlMzIoUl9PV04pOworCSAgICBiYXJyaWVyKCk7CisJfQorCQorCS8qCisJKiogVXBkYXRlIGVudHJ5IGluZm9ybWF0aW9uCisJKi8KKwlscC0+cnhfbmV3ID0gKCsrbHAtPnJ4X25ldykgJSBscC0+cnhSaW5nU2l6ZTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZGU0eDVfZnJlZV90eF9idWZmKHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCwgaW50IGVudHJ5KQoreworICAgIGRtYV91bm1hcF9zaW5nbGUobHAtPmdlbmRldiwgbGUzMl90b19jcHUobHAtPnR4X3JpbmdbZW50cnldLmJ1ZiksCisJCSAgICAgbGUzMl90b19jcHUobHAtPnR4X3JpbmdbZW50cnldLmRlczEpICYgVERfVEJTMSwKKwkJICAgICBETUFfVE9fREVWSUNFKTsKKyAgICBpZiAoKHVfbG9uZykgbHAtPnR4X3NrYltlbnRyeV0gPiAxKQorCWRldl9rZnJlZV9za2JfaXJxKGxwLT50eF9za2JbZW50cnldKTsKKyAgICBscC0+dHhfc2tiW2VudHJ5XSA9IE5VTEw7Cit9CisKKy8qCisqKiBCdWZmZXIgc2VudCAtIGNoZWNrIGZvciBUWCBidWZmZXIgZXJyb3JzLgorKi8KK3N0YXRpYyBpbnQKK2RlNHg1X3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGVudHJ5OworICAgIHMzMiBzdGF0dXM7CisgICAgCisgICAgZm9yIChlbnRyeSA9IGxwLT50eF9vbGQ7IGVudHJ5ICE9IGxwLT50eF9uZXc7IGVudHJ5ID0gbHAtPnR4X29sZCkgeworCXN0YXR1cyA9IChzMzIpbGUzMl90b19jcHUobHAtPnR4X3JpbmdbZW50cnldLnN0YXR1cyk7CisJaWYgKHN0YXR1cyA8IDApIHsgICAgICAgICAgICAgICAgICAgICAvKiBCdWZmZXIgbm90IHNlbnQgeWV0ICovCisJICAgIGJyZWFrOworCX0gZWxzZSBpZiAoc3RhdHVzICE9IDB4N2ZmZmZmZmYpIHsgICAgLyogTm90IHNldHVwIGZyYW1lICovCisJICAgIGlmIChzdGF0dXMgJiBURF9FUykgeyAgICAgICAgICAgICAvKiBBbiBlcnJvciBoYXBwZW5lZCAqLworCQlscC0+c3RhdHMudHhfZXJyb3JzKys7IAorCQlpZiAoc3RhdHVzICYgVERfTkMpIGxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgVERfTEMpIGxwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBURF9VRikgbHAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBURF9FQykgbHAtPnBrdFN0YXRzLmV4Y2Vzc2l2ZV9jb2xsaXNpb25zKys7CisJCWlmIChzdGF0dXMgJiBURF9ERSkgbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJICAgIAorCQlpZiAoVFhfUEtUX1BFTkRJTkcpIHsKKwkJICAgIG91dGwoUE9MTF9ERU1BTkQsIERFNFg1X1RQRCk7LyogUmVzdGFydCBhIHN0YWxsZWQgVFggKi8KKwkJfQorCSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBQYWNrZXQgc2VudCAqLworCQlscC0+c3RhdHMudHhfcGFja2V0cysrOworCQlpZiAobHAtPnR4X2VuYWJsZSkgbHAtPmxpbmtPSysrOworCSAgICB9CisJICAgIC8qIFVwZGF0ZSB0aGUgY29sbGlzaW9uIGNvdW50ZXIgKi8KKwkgICAgbHAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gKChzdGF0dXMgJiBURF9FQykgPyAxNiA6IAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAoKHN0YXR1cyAmIFREX0NDKSA+PiAzKSk7CisKKwkgICAgLyogRnJlZSB0aGUgYnVmZmVyLiAqLworCSAgICBpZiAobHAtPnR4X3NrYltlbnRyeV0gIT0gTlVMTCkKKwkgICAgCWRlNHg1X2ZyZWVfdHhfYnVmZihscCwgZW50cnkpOworCX0KKwkKKwkvKiBVcGRhdGUgYWxsIHRoZSBwb2ludGVycyAqLworCWxwLT50eF9vbGQgPSAoKytscC0+dHhfb2xkKSAlIGxwLT50eFJpbmdTaXplOworICAgIH0KKworICAgIC8qIEFueSByZXNvdXJjZXMgYXZhaWxhYmxlPyAqLworICAgIGlmIChUWF9CVUZGU19BVkFJTCAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKKwlpZiAobHAtPmludGVycnVwdCkKKwkgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCWVsc2UKKwkgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyAgICB9CisJCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RlNHg1X2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IG5leHRfdGljayA9IERFNFg1X0FVVE9TRU5TRV9NUzsKKyAgICAKKyAgICBkaXNhYmxlX2FzdChkZXYpOworICAgIAorICAgIGlmIChscC0+dXNlU1JPTSkgeworCW5leHRfdGljayA9IHNyb21fYXV0b2NvbmYoZGV2KTsKKyAgICB9IGVsc2UgaWYgKGxwLT5jaGlwc2V0ID09IERDMjExNDApIHsKKwluZXh0X3RpY2sgPSBkYzIxMTQwbV9hdXRvY29uZihkZXYpOworICAgIH0gZWxzZSBpZiAobHAtPmNoaXBzZXQgPT0gREMyMTA0MSkgeworCW5leHRfdGljayA9IGRjMjEwNDFfYXV0b2NvbmYoZGV2KTsKKyAgICB9IGVsc2UgaWYgKGxwLT5jaGlwc2V0ID09IERDMjEwNDApIHsKKwluZXh0X3RpY2sgPSBkYzIxMDQwX2F1dG9jb25mKGRldik7CisgICAgfQorICAgIGxwLT5saW5rT0sgPSAwOworICAgIGVuYWJsZV9hc3QoZGV2LCBuZXh0X3RpY2spOworICAgIAorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitkZTR4NV90eHVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IG9tcjsKKworICAgIG9tciA9IGlubChERTRYNV9PTVIpOworICAgIGlmICghKG9tciAmIE9NUl9TRikgfHwgKGxwLT5jaGlwc2V0PT1EQzIxMDQxKSB8fCAobHAtPmNoaXBzZXQ9PURDMjEwNDApKSB7CisJb21yICY9IH4oT01SX1NUfE9NUl9TUik7CisJb3V0bChvbXIsIERFNFg1X09NUik7CisJd2hpbGUgKGlubChERTRYNV9TVFMpICYgU1RTX1RTKTsKKwlpZiAoKG9tciAmIE9NUl9UUikgPCBPTVJfVFIpIHsKKwkgICAgb21yICs9IDB4NDAwMDsKKwl9IGVsc2UgeworCSAgICBvbXIgfD0gT01SX1NGOworCX0KKwlvdXRsKG9tciB8IE9NUl9TVCB8IE9NUl9TUiwgREU0WDVfT01SKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgCitkZTR4NV9yeF9vdmZjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IG9tcjsKKworICAgIG9tciA9IGlubChERTRYNV9PTVIpOworICAgIG91dGwob21yICYgfk9NUl9TUiwgREU0WDVfT01SKTsKKyAgICB3aGlsZSAoaW5sKERFNFg1X1NUUykgJiBTVFNfUlMpOworCisgICAgZm9yICg7IChzMzIpbGUzMl90b19jcHUobHAtPnJ4X3JpbmdbbHAtPnJ4X25ld10uc3RhdHVzKT49MDspIHsKKwlscC0+cnhfcmluZ1tscC0+cnhfbmV3XS5zdGF0dXMgPSBjcHVfdG9fbGUzMihSX09XTik7CisJbHAtPnJ4X25ldyA9ICgrK2xwLT5yeF9uZXcgJSBscC0+cnhSaW5nU2l6ZSk7CisgICAgfQorCisgICAgb3V0bChvbXIsIERFNFg1X09NUik7CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RlNHg1X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgczMyIGltciwgb21yOworICAgIAorICAgIGRpc2FibGVfYXN0KGRldik7CisKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgCisgICAgaWYgKGRlNHg1X2RlYnVnICYgREVCVUdfQ0xPU0UpIHsKKwlwcmludGsoIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZCwgc3RhdHVzIHdhcyAlOC44eC5cbiIsCisJICAgICAgIGRldi0+bmFtZSwgaW5sKERFNFg1X1NUUykpOworICAgIH0KKyAgICAKKyAgICAvKiAKKyAgICAqKiBXZSBzdG9wIHRoZSBERTRYNSBoZXJlLi4uIG1hc2sgaW50ZXJydXB0cyBhbmQgc3RvcCBUWCAmIFJYCisgICAgKi8KKyAgICBESVNBQkxFX0lSUXM7CisgICAgU1RPUF9ERTRYNTsKKyAgICAKKyAgICAvKiBGcmVlIHRoZSBhc3NvY2lhdGVkIGlycSAqLworICAgIGZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworICAgIGxwLT5zdGF0ZSA9IENMT1NFRDsKKworICAgIC8qIEZyZWUgYW55IHNvY2tldCBidWZmZXJzICovCisgICAgZGU0eDVfZnJlZV9yeF9idWZmcyhkZXYpOworICAgIGRlNHg1X2ZyZWVfdHhfYnVmZnMoZGV2KTsKKyAgICAKKyAgICAvKiBQdXQgdGhlIGFkYXB0ZXIgdG8gc2xlZXAgdG8gc2F2ZSBwb3dlciAqLworICAgIHlhd24oZGV2LCBTTEVFUCk7CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCitkZTR4NV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAKKyAgICBscC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyA9IChpbnQpKGlubChERTRYNV9NRkMpICYgKE1GQ19PVkZMIHwgTUZDX0NOVFIpKTsKKyAgICAKKyAgICByZXR1cm4gJmxwLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQKK2RlNHg1X2xvY2FsX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IHBrdF9sZW4pCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaT0xOyBpPERFNFg1X1BLVF9TVEFUX1NaLTE7IGkrKykgeworICAgICAgICBpZiAocGt0X2xlbiA8IChpKkRFNFg1X1BLVF9CSU5fU1opKSB7CisJICAgIGxwLT5wa3RTdGF0cy5iaW5zW2ldKys7CisJICAgIGkgPSBERTRYNV9QS1RfU1RBVF9TWjsKKwl9CisgICAgfQorICAgIGlmIChidWZbMF0gJiAweDAxKSB7ICAgICAgICAgIC8qIE11bHRpY2FzdC9Ccm9hZGNhc3QgKi8KKyAgICAgICAgaWYgKCgqKHMzMiAqKSZidWZbMF0gPT0gLTEpICYmICgqKHMxNiAqKSZidWZbNF0gPT0gLTEpKSB7CisJICAgIGxwLT5wa3RTdGF0cy5icm9hZGNhc3QrKzsKKwl9IGVsc2UgeworCSAgICBscC0+cGt0U3RhdHMubXVsdGljYXN0Kys7CisJfQorICAgIH0gZWxzZSBpZiAoKCooczMyICopJmJ1ZlswXSA9PSAqKHMzMiAqKSZkZXYtPmRldl9hZGRyWzBdKSAmJgorCSAgICAgICAoKihzMTYgKikmYnVmWzRdID09ICooczE2ICopJmRldi0+ZGV2X2FkZHJbNF0pKSB7CisgICAgICAgIGxwLT5wa3RTdGF0cy51bmljYXN0Kys7CisgICAgfQorCQkKKyAgICBscC0+cGt0U3RhdHMuYmluc1swXSsrOyAgICAgICAvKiBEdXBsaWNhdGVzIHN0YXRzLnJ4X3BhY2tldHMgKi8KKyAgICBpZiAobHAtPnBrdFN0YXRzLmJpbnNbMF0gPT0gMCkgeyAvKiBSZXNldCBjb3VudGVycyAqLworICAgICAgICBtZW1zZXQoKGNoYXIgKikmbHAtPnBrdFN0YXRzLCAwLCBzaXplb2YobHAtPnBrdFN0YXRzKSk7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKgorKiogUmVtb3ZlcyB0aGUgVERfSUMgZmxhZyBmcm9tIHByZXZpb3VzIGRlc2NyaXB0b3IgdG8gaW1wcm92ZSBUWCBwZXJmb3JtYW5jZS4KKyoqIElmIHRoZSBmbGFnIGlzIGNoYW5nZWQgb24gYSBkZXNjcmlwdG9yIHRoYXQgaXMgYmVpbmcgcmVhZCBieSB0aGUgaGFyZHdhcmUsCisqKiBJIGFzc3VtZSBQQ0kgdHJhbnNhY3Rpb24gb3JkZXJpbmcgd2lsbCBtZWFuIHlvdSBhcmUgZWl0aGVyIHN1Y2Nlc3NmdWwgb3IKKyoqIGp1c3QgbWlzcyBhc3NlcnRpbmcgdGhlIGNoYW5nZSB0byB0aGUgaGFyZHdhcmUuIEFueXdheSB5b3UncmUgbWVzc2luZyB3aXRoCisqKiBhIGRlc2NyaXB0b3IgeW91IGRvbid0IG93biwgYnV0IHRoaXMgc2hvdWxkbid0IGtpbGwgdGhlIGNoaXAgcHJvdmlkZWQKKyoqIHRoZSBkZXNjcmlwdG9yIHJlZ2lzdGVyIGlzIHJlYWQgb25seSB0byB0aGUgaGFyZHdhcmUuCisqLworc3RhdGljIHZvaWQKK2xvYWRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgdTMyIGZsYWdzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IGVudHJ5ID0gKGxwLT50eF9uZXcgPyBscC0+dHhfbmV3LTEgOiBscC0+dHhSaW5nU2l6ZS0xKTsKKyAgICBkbWFfYWRkcl90IGJ1Zl9kbWEgPSBkbWFfbWFwX3NpbmdsZShscC0+Z2VuZGV2LCBidWYsIGZsYWdzICYgVERfVEJTMSwgRE1BX1RPX0RFVklDRSk7CisKKyAgICBscC0+dHhfcmluZ1tscC0+dHhfbmV3XS5idWYgPSBjcHVfdG9fbGUzMihidWZfZG1hKTsKKyAgICBscC0+dHhfcmluZ1tscC0+dHhfbmV3XS5kZXMxICY9IGNwdV90b19sZTMyKFREX1RFUik7CisgICAgbHAtPnR4X3JpbmdbbHAtPnR4X25ld10uZGVzMSB8PSBjcHVfdG9fbGUzMihmbGFncyk7CisgICAgbHAtPnR4X3NrYltscC0+dHhfbmV3XSA9IHNrYjsKKyAgICBscC0+dHhfcmluZ1tlbnRyeV0uZGVzMSAmPSBjcHVfdG9fbGUzMih+VERfSUMpOworICAgIGJhcnJpZXIoKTsKKworICAgIGxwLT50eF9yaW5nW2xwLT50eF9uZXddLnN0YXR1cyA9IGNwdV90b19sZTMyKFRfT1dOKTsKKyAgICBiYXJyaWVyKCk7Cit9CisKKy8qCisqKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyovCitzdGF0aWMgdm9pZAorc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICAvKiBGaXJzdCwgZG91YmxlIGNoZWNrIHRoYXQgdGhlIGFkYXB0ZXIgaXMgb3BlbiAqLworICAgIGlmIChscC0+c3RhdGUgPT0gT1BFTikgeworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsgICAgICAgICAvKiBzZXQgcHJvbWlzY3VvdXMgbW9kZSAqLworCSAgICB1MzIgb21yOworCSAgICBvbXIgPSBpbmwoREU0WDVfT01SKTsKKwkgICAgb21yIHw9IE9NUl9QUjsKKwkgICAgb3V0bChvbXIsIERFNFg1X09NUik7CisJfSBlbHNlIHsgCisJICAgIFNldE11bHRpY2FzdEZpbHRlcihkZXYpOworCSAgICBsb2FkX3BhY2tldChkZXYsIGxwLT5zZXR1cF9mcmFtZSwgVERfSUMgfCBQRVJGRUNUX0YgfCBURF9TRVQgfCAKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUVVBfRlJBTUVfTEVOLCAoc3RydWN0IHNrX2J1ZmYgKikxKTsKKwkgICAgCisJICAgIGxwLT50eF9uZXcgPSAoKytscC0+dHhfbmV3KSAlIGxwLT50eFJpbmdTaXplOworCSAgICBvdXRsKFBPTExfREVNQU5ELCBERTRYNV9UUEQpOyAgICAgICAvKiBTdGFydCB0aGUgVFggKi8KKwkgICAgZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJfQorICAgIH0KK30KKworLyoKKyoqIENhbGN1bGF0ZSB0aGUgaGFzaCBjb2RlIGFuZCB1cGRhdGUgdGhlIGxvZ2ljYWwgYWRkcmVzcyBmaWx0ZXIKKyoqIGZyb20gYSBsaXN0IG9mIGV0aGVybmV0IG11bHRpY2FzdCBhZGRyZXNzZXMuCisqKiBMaXR0bGUgZW5kaWFuIGNyYyBvbmUgbGluZXIgZnJvbSBNYXR0IFRob21hcywgREVDLgorKi8KK3N0YXRpYyB2b2lkCitTZXRNdWx0aWNhc3RGaWx0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pPWRldi0+bWNfbGlzdDsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IGksIGosIGJpdCwgYnl0ZTsKKyAgICB1MTYgaGFzaGNvZGU7CisgICAgdTMyIG9tciwgY3JjOworICAgIGNoYXIgKnBhOworICAgIHVuc2lnbmVkIGNoYXIgKmFkZHJzOworCisgICAgb21yID0gaW5sKERFNFg1X09NUik7CisgICAgb21yICY9IH4oT01SX1BSIHwgT01SX1BNKTsKKyAgICBwYSA9IGJ1aWxkX3NldHVwX2ZyYW1lKGRldiwgQUxMKTsgICAgICAgIC8qIEJ1aWxkIHRoZSBiYXNpYyBmcmFtZSAqLworICAgIAorICAgIGlmICgoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgfHwgKGRldi0+bWNfY291bnQgPiAxNCkpIHsKKwlvbXIgfD0gT01SX1BNOyAgICAgICAgICAgICAgICAgICAgICAgLyogUGFzcyBhbGwgbXVsdGljYXN0cyAqLworICAgIH0gZWxzZSBpZiAobHAtPnNldHVwX2YgPT0gSEFTSF9QRVJGKSB7ICAgLyogSGFzaCBGaWx0ZXJpbmcgKi8KKwlmb3IgKGk9MDtpPGRldi0+bWNfY291bnQ7aSsrKSB7ICAgICAgLyogZm9yIGVhY2ggYWRkcmVzcyBpbiB0aGUgbGlzdCAqLworCSAgICBhZGRycz1kbWktPmRtaV9hZGRyOworCSAgICBkbWk9ZG1pLT5uZXh0OworCSAgICBpZiAoKCphZGRycyAmIDB4MDEpID09IDEpIHsgICAgICAvKiBtdWx0aWNhc3QgYWRkcmVzcz8gKi8gCisJCWNyYyA9IGV0aGVyX2NyY19sZShFVEhfQUxFTiwgYWRkcnMpOworCQloYXNoY29kZSA9IGNyYyAmIEhBU0hfQklUUzsgIC8qIGhhc2hjb2RlIGlzIDkgTFNiIG9mIENSQyAqLworCQkKKwkJYnl0ZSA9IGhhc2hjb2RlID4+IDM7ICAgICAgICAvKiBiaXRbMy04XSAtPiBieXRlIGluIGZpbHRlciAqLworCQliaXQgPSAxIDw8IChoYXNoY29kZSAmIDB4MDcpOy8qIGJpdFswLTJdIC0+IGJpdCBpbiBieXRlICovCisJCQorCQlieXRlIDw8PSAxOyAgICAgICAgICAgICAgICAgIC8qIGNhbGMgb2Zmc2V0IGludG8gc2V0dXAgZnJhbWUgKi8KKwkJaWYgKGJ5dGUgJiAweDAyKSB7CisJCSAgICBieXRlIC09IDE7CisJCX0KKwkJbHAtPnNldHVwX2ZyYW1lW2J5dGVdIHw9IGJpdDsKKwkgICAgfQorCX0KKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlcmZlY3QgZmlsdGVyaW5nICovCisJZm9yIChqPTA7IGo8ZGV2LT5tY19jb3VudDsgaisrKSB7CisJICAgIGFkZHJzPWRtaS0+ZG1pX2FkZHI7CisJICAgIGRtaT1kbWktPm5leHQ7CisJICAgIGZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsgCisJCSoocGEgKyAoaSYxKSkgPSAqYWRkcnMrKzsKKwkJaWYgKGkgJiAweDAxKSBwYSArPSA0OworCSAgICB9CisJfQorICAgIH0KKyAgICBvdXRsKG9tciwgREU0WDVfT01SKTsKKyAgICAKKyAgICByZXR1cm47Cit9CisKKyNpZmRlZiBDT05GSUdfRUlTQQorCitzdGF0aWMgdV9jaGFyIGRlNHg1X2lycVtdID0gRUlTQV9BTExPV0VEX0lSUV9MSVNUOworCitzdGF0aWMgaW50IF9faW5pdCBkZTR4NV9laXNhX3Byb2JlIChzdHJ1Y3QgZGV2aWNlICpnZW5kZXYpCit7CisJc3RydWN0IGVpc2FfZGV2aWNlICplZGV2OworCXVfbG9uZyBpb2Jhc2U7CisJdV9jaGFyIGlycSwgcmVndmFsOworCXVfc2hvcnQgdmVuZG9yOworCXUzMiBjZmlkOworCWludCBzdGF0dXMsIGRldmljZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBkZTR4NV9wcml2YXRlICpscDsKKworCWVkZXYgPSB0b19laXNhX2RldmljZSAoZ2VuZGV2KTsKKwlpb2Jhc2UgPSBlZGV2LT5iYXNlX2FkZHI7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uIChpb2Jhc2UsIERFNFg1X0VJU0FfVE9UQUxfU0laRSwgImRlNHg1IikpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uIChpb2Jhc2UgKyBERTRYNV9FSVNBX0lPX1BPUlRTLAorCQkJICAgICBERTRYNV9FSVNBX1RPVEFMX1NJWkUsICJkZTR4NSIpKSB7CisJCXN0YXR1cyA9IC1FQlVTWTsKKwkJZ290byByZWxlYXNlX3JlZ18xOworCX0KKwkKKwlpZiAoIShkZXYgPSBhbGxvY19ldGhlcmRldiAoc2l6ZW9mIChzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSkpKSkgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlnb3RvIHJlbGVhc2VfcmVnXzI7CisJfQorCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwljZmlkID0gKHUzMikgaW5sKFBDSV9DRklEKTsKKwlscC0+Y2ZydiA9ICh1X3Nob3J0KSBpbmwoUENJX0NGUlYpOworCWRldmljZSA9IChjZmlkID4+IDgpICYgMHgwMGZmZmYwMDsKKwl2ZW5kb3IgPSAodV9zaG9ydCkgY2ZpZDsKKwkgICAgCisJLyogUmVhZCB0aGUgRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVycyAqLworCXJlZ3ZhbCA9IGluYihFSVNBX1JFRzApICYgKEVSMF9JTlRMIHwgRVIwX0lOVFQpOworI2lmZGVmIENPTkZJR19BTFBIQQorCS8qIExvb2tzIGxpa2UgdGhlIEplbnNlbiBmaXJtd2FyZSAocmV2IDIuMikgZG9lc24ndCByZWFsbHkKKwkgKiBjYXJlIGFib3V0IHRoZSBFSVNBIGNvbmZpZ3VyYXRpb24sIGFuZCB0aHVzIGRvZXNuJ3QKKwkgKiBjb25maWd1cmUgdGhlIFBMWCBicmlkZ2UgcHJvcGVybHkuIE9oIHdlbGwuLi4gU2ltcGx5IG1pbWljCisJICogdGhlIEVJU0EgY29uZmlnIGZpbGUgdG8gc29ydCBpdCBvdXQuICovCisJCisJLyogRUlTQSBSRUcxOiBBc3NlcnQgRGVjQ2hpcCAyMTA0MCBIVyBSZXNldCAqLworCW91dGIgKEVSMV9JQU0gfCAxLCBFSVNBX1JFRzEpOworCW1kZWxheSAoMSk7CisKKyAgICAgICAgLyogRUlTQSBSRUcxOiBEZWFzc2VydCBEZWNDaGlwIDIxMDQwIEhXIFJlc2V0ICovCisJb3V0YiAoRVIxX0lBTSwgRUlTQV9SRUcxKTsKKwltZGVsYXkgKDEpOworCisJLyogRUlTQSBSRUczOiBSL1cgQnVyc3QgVHJhbnNmZXIgRW5hYmxlICovCisJb3V0YiAoRVIzX0JXRSB8IEVSM19CUkUsIEVJU0FfUkVHMyk7CisJCisJLyogMzJfYml0IHNsYXZlL21hc3RlciwgUHJlZW1wdCBUaW1lPTIzIGJjbGtzLCBVbmxhdGNoZWQgSW50ZXJydXB0ICovCisJb3V0YiAoRVIwX0JTVyB8IEVSMF9CTVcgfCBFUjBfRVBUIHwgcmVndmFsLCBFSVNBX1JFRzApOworI2VuZGlmCisJaXJxID0gZGU0eDVfaXJxWyhyZWd2YWwgPj4gMSkgJiAweDAzXTsKKwkKKwlpZiAoaXNfREMyMTE0eCkgeworCSAgICBkZXZpY2UgPSAoKGxwLT5jZnJ2ICYgQ0ZSVl9STikgPCBEQzIxMTR4X0JSSyA/IERDMjExNDIgOiBEQzIxMTQzKTsKKwl9CisJbHAtPmNoaXBzZXQgPSBkZXZpY2U7CisJbHAtPmJ1cyA9IEVJU0E7CisKKwkvKiBXcml0ZSB0aGUgUENJIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXJzICovCisJb3V0bChQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01BU1RFUiwgUENJX0NGQ1MpOworCW91dGwoMHgwMDAwNjAwMCwgUENJX0NGTFQpOworCW91dGwoaW9iYXNlLCBQQ0lfQ0JJTyk7CisJICAgIAorCURldmljZVByZXNlbnQoZGV2LCBFSVNBX0FQUk9NKTsKKworCWRldi0+aXJxID0gaXJxOworCisJaWYgKCEoc3RhdHVzID0gZGU0eDVfaHdfaW5pdCAoZGV2LCBpb2Jhc2UsIGdlbmRldikpKSB7CisJCXJldHVybiAwOworCX0KKworCWZyZWVfbmV0ZGV2IChkZXYpOworIHJlbGVhc2VfcmVnXzI6CisJcmVsZWFzZV9yZWdpb24gKGlvYmFzZSArIERFNFg1X0VJU0FfSU9fUE9SVFMsIERFNFg1X0VJU0FfVE9UQUxfU0laRSk7CisgcmVsZWFzZV9yZWdfMToKKwlyZWxlYXNlX3JlZ2lvbiAoaW9iYXNlLCBERTRYNV9FSVNBX1RPVEFMX1NJWkUpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZGU0eDVfZWlzYV9yZW1vdmUgKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXVfbG9uZyBpb2Jhc2U7CisKKwlkZXYgPSBkZXZpY2UtPmRyaXZlcl9kYXRhOworCWlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCQorCXVucmVnaXN0ZXJfbmV0ZGV2IChkZXYpOworCWZyZWVfbmV0ZGV2IChkZXYpOworCXJlbGVhc2VfcmVnaW9uIChpb2Jhc2UgKyBERTRYNV9FSVNBX0lPX1BPUlRTLCBERTRYNV9FSVNBX1RPVEFMX1NJWkUpOworCXJlbGVhc2VfcmVnaW9uIChpb2Jhc2UsIERFNFg1X0VJU0FfVE9UQUxfU0laRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBlaXNhX2RldmljZV9pZCBkZTR4NV9laXNhX2lkc1tdID0geworICAgICAgICB7ICJERUM0MjUwIiwgMCB9LAkvKiAwIGlzIHRoZSBib2FyZCBuYW1lIGluZGV4Li4uICovCisgICAgICAgIHsgIiIgfQorfTsKKworc3RhdGljIHN0cnVjdCBlaXNhX2RyaXZlciBkZTR4NV9laXNhX2RyaXZlciA9IHsKKyAgICAgICAgLmlkX3RhYmxlID0gZGU0eDVfZWlzYV9pZHMsCisgICAgICAgIC5kcml2ZXIgICA9IHsKKyAgICAgICAgICAgICAgICAubmFtZSAgICA9ICJkZTR4NSIsCisgICAgICAgICAgICAgICAgLnByb2JlICAgPSBkZTR4NV9laXNhX3Byb2JlLAorICAgICAgICAgICAgICAgIC5yZW1vdmUgID0gX19kZXZleGl0X3AgKGRlNHg1X2Vpc2FfcmVtb3ZlKSwKKyAgICAgICAgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoZWlzYSwgZGU0eDVfZWlzYV9pZHMpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUENJCisKKy8qCisqKiBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIHRoZSBjdXJyZW50IGJ1cyAod2hpY2ggaXMgPjApIGZvciBhIERFQ2NoaXAgd2l0aCBhbgorKiogU1JPTSwgc28gdGhhdCBpbiBtdWx0aXBvcnQgY2FyZHMgdGhhdCBoYXZlIG9uZSBTUk9NIHNoYXJlZCBiZXR3ZWVuIG11bHRpcGxlIAorKiogREVDY2hpcHMsIHdlIGNhbiBmaW5kIHRoZSBiYXNlIFNST00gaXJyZXNwZWN0aXZlIG9mIHRoZSBCSU9TIHNjYW4gZGlyZWN0aW9uLgorKiogRm9yIHNpbmdsZSBwb3J0IGNhcmRzIHRoaXMgaXMgYSB0aW1lIHdhc3Rlci4uLgorKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCAKK3Nyb21fc2VhcmNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworICAgIHVfY2hhciBwYjsKKyAgICB1X3Nob3J0IHZlbmRvciwgc3RhdHVzOworICAgIHVfaW50IGlycSA9IDAsIGRldmljZTsKKyAgICB1X2xvbmcgaW9iYXNlID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB1cHBlciAzMiBiaXRzIGluIEFscGhhcyAqLworICAgIGludCBpLCBqLCBjZnJ2OworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgc3RydWN0IGxpc3RfaGVhZCAqd2FsayA9ICZwZGV2LT5idXNfbGlzdDsKKworICAgIGZvciAod2FsayA9IHdhbGstPm5leHQ7IHdhbGsgIT0gJnBkZXYtPmJ1c19saXN0OyB3YWxrID0gd2Fsay0+bmV4dCkgeworCXN0cnVjdCBwY2lfZGV2ICp0aGlzX2RldiA9IHBjaV9kZXZfYih3YWxrKTsKKworCS8qIFNraXAgdGhlIHBjaV9idXMgbGlzdCBlbnRyeSAqLworCWlmIChsaXN0X2VudHJ5KHdhbGssIHN0cnVjdCBwY2lfYnVzLCBkZXZpY2VzKSA9PSBwZGV2LT5idXMpIGNvbnRpbnVlOworCisJdmVuZG9yID0gdGhpc19kZXYtPnZlbmRvcjsKKwlkZXZpY2UgPSB0aGlzX2Rldi0+ZGV2aWNlIDw8IDg7CisJaWYgKCEoaXNfREMyMTA0MCB8fCBpc19EQzIxMDQxIHx8IGlzX0RDMjExNDAgfHwgaXNfREMyMTE0eCkpIGNvbnRpbnVlOworCisJLyogR2V0IHRoZSBjaGlwIGNvbmZpZ3VyYXRpb24gcmV2aXNpb24gcmVnaXN0ZXIgKi8KKwlwYiA9IHRoaXNfZGV2LT5idXMtPm51bWJlcjsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQodGhpc19kZXYsIFBDSV9SRVZJU0lPTl9JRCwgJmNmcnYpOworCisJLyogU2V0IHRoZSBkZXZpY2UgbnVtYmVyIGluZm9ybWF0aW9uICovCisJbHAtPmRldmljZSA9IFBDSV9TTE9UKHRoaXNfZGV2LT5kZXZmbik7CisJbHAtPmJ1c19udW0gPSBwYjsKKwkgICAgCisJLyogU2V0IHRoZSBjaGlwc2V0IGluZm9ybWF0aW9uICovCisJaWYgKGlzX0RDMjExNHgpIHsKKwkgICAgZGV2aWNlID0gKChjZnJ2ICYgQ0ZSVl9STikgPCBEQzIxMTR4X0JSSyA/IERDMjExNDIgOiBEQzIxMTQzKTsKKwl9CisJbHAtPmNoaXBzZXQgPSBkZXZpY2U7CisKKwkvKiBHZXQgdGhlIGJvYXJkIEkvTyBhZGRyZXNzICg2NCBiaXRzIG9uIHNwYXJjNjQpICovCisJaW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHRoaXNfZGV2LCAwKTsKKworCS8qIEZldGNoIHRoZSBJUlEgdG8gYmUgdXNlZCAqLworCWlycSA9IHRoaXNfZGV2LT5pcnE7CisJaWYgKChpcnEgPT0gMCkgfHwgKGlycSA9PSAweGZmKSB8fCAoKGludClpcnEgPT0gLTEpKSBjb250aW51ZTsKKwkgICAgCisJLyogQ2hlY2sgaWYgSS9PIGFjY2Vzc2VzIGFyZSBlbmFibGVkICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQodGhpc19kZXYsIFBDSV9DT01NQU5ELCAmc3RhdHVzKTsKKwlpZiAoIShzdGF0dXMgJiBQQ0lfQ09NTUFORF9JTykpIGNvbnRpbnVlOworCisJLyogU2VhcmNoIGZvciBhIHZhbGlkIFNST00gYXR0YWNoZWQgdG8gdGhpcyBERUNjaGlwICovCisJRGV2aWNlUHJlc2VudChkZXYsIERFNFg1X0FQUk9NKTsKKwlmb3IgKGo9MCwgaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsKKwkgICAgaiArPSAodV9jaGFyKSAqKCh1X2NoYXIgKikmbHAtPnNyb20gKyBTUk9NX0hXQUREICsgaSk7CisJfQorCWlmICgoaiAhPSAwKSAmJiAoaiAhPSAweDVmYSkpIHsKKwkgICAgbGFzdC5jaGlwc2V0ID0gZGV2aWNlOworCSAgICBsYXN0LmJ1cyA9IHBiOworCSAgICBsYXN0LmlycSA9IGlycTsKKwkgICAgZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgeworCQlsYXN0LmFkZHJbaV0gPSAodV9jaGFyKSooKHVfY2hhciAqKSZscC0+c3JvbSArIFNST01fSFdBREQgKyBpKTsKKwkgICAgfQorCSAgICByZXR1cm47CisJfQorICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoKKyoqIFBDSSBidXMgSS9PIGRldmljZSBwcm9iZQorKiogTkI6IFBDSSBJL08gYWNjZXNzZXMgYW5kIEJ1cyBNYXN0ZXJpbmcgYXJlIGVuYWJsZWQgYnkgdGhlIFBDSSBCSU9TLCBub3QKKyoqIHRoZSBkcml2ZXIuIFNvbWUgUENJIEJJT1MncywgcHJlIFYyLjEsIG5lZWQgdGhlIHNsb3QgKyBmZWF0dXJlcyB0byBiZQorKiogZW5hYmxlZCBieSB0aGUgdXNlciBmaXJzdCBpbiB0aGUgc2V0IHVwIHV0aWxpdHkuIEhlbmNlIHdlIGp1c3QgY2hlY2sgZm9yCisqKiBlbmFibGVkIGZlYXR1cmVzIGFuZCBzaWxlbnRseSBpZ25vcmUgdGhlIGNhcmQgaWYgdGhleSdyZSBub3QuCisqKgorKiogU1RPUCBQUkVTUzogU29tZSBCSU9TJ3MgX19yZXF1aXJlX18gdGhlIGRyaXZlciB0byBlbmFibGUgdGhlIGJ1cyBtYXN0ZXJpbmcKKyoqIGJpdC4gSGVyZSwgY2hlY2sgZm9yIEkvTyBhY2Nlc3NlcyBhbmQgdGhlbiBzZXQgQk0uIElmIHlvdSBwdXQgdGhlIGNhcmQgaW4KKyoqIGEgbm9uIEJNIHNsb3QsIHlvdSdyZSBvbiB5b3VyIG93biAoYW5kIGNvbXBsYWluIHRvIHRoZSBQQyB2ZW5kb3IgdGhhdCB5b3VyCisqKiBQQyBkb2Vzbid0IGNvbmZvcm0gdG8gdGhlIFBDSSBzdGFuZGFyZCkhCisqKgorKiogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNvbXBhdGlibGUgd2l0aCB0aGUgKmxhdGVzdCogMi4xLngga2VybmVscy4gRm9yIDIuMC54CisqKiBrZXJuZWxzIHVzZSB0aGUgVjAuNTM1W25dIGRyaXZlcnMuCisqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkZTR4NV9wY2lfcHJvYmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJdV9jaGFyIHBiLCBwYnVzID0gMCwgZGV2X251bSwgZG51bSA9IDAsIHRpbWVyOworCXVfc2hvcnQgdmVuZG9yLCBzdGF0dXM7CisJdV9pbnQgaXJxID0gMCwgZGV2aWNlOworCXVfbG9uZyBpb2Jhc2UgPSAwOwkvKiBDbGVhciB1cHBlciAzMiBiaXRzIGluIEFscGhhcyAqLworCWludCBlcnJvcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBkZTR4NV9wcml2YXRlICpscDsKKworCWRldl9udW0gPSBQQ0lfU0xPVChwZGV2LT5kZXZmbik7CisJcGIgPSBwZGV2LT5idXMtPm51bWJlcjsKKworCWlmIChpbykgeyAvKiBwcm9iZSBhIHNpbmdsZSBQQ0kgZGV2aWNlICovCisJCXBidXMgPSAodV9zaG9ydCkoaW8gPj4gOCk7CisJCWRudW0gPSAodV9zaG9ydCkoaW8gJiAweGZmKTsKKwkJaWYgKChwYnVzICE9IHBiKSB8fCAoZG51bSAhPSBkZXZfbnVtKSkKKwkJCXJldHVybiAtRU5PREVWOworCX0KKworCXZlbmRvciA9IHBkZXYtPnZlbmRvcjsKKwlkZXZpY2UgPSBwZGV2LT5kZXZpY2UgPDwgODsKKwlpZiAoIShpc19EQzIxMDQwIHx8IGlzX0RDMjEwNDEgfHwgaXNfREMyMTE0MCB8fCBpc19EQzIxMTR4KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBPaywgdGhlIGRldmljZSBzZWVtcyB0byBiZSBmb3IgdXMuICovCisJaWYgKChlcnJvciA9IHBjaV9lbmFibGVfZGV2aWNlIChwZGV2KSkpCisJCXJldHVybiBlcnJvcjsKKworCWlmICghKGRldiA9IGFsbG9jX2V0aGVyZGV2IChzaXplb2YgKHN0cnVjdCBkZTR4NV9wcml2YXRlKSkpKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBkaXNhYmxlX2RldjsKKwl9CisKKwlscCA9IG5ldGRldl9wcml2KGRldik7CisJbHAtPmJ1cyA9IFBDSTsKKwlscC0+YnVzX251bSA9IDA7CisJCisJLyogU2VhcmNoIGZvciBhbiBTUk9NIG9uIHRoaXMgYnVzICovCisJaWYgKGxwLT5idXNfbnVtICE9IHBiKSB7CisJICAgIGxwLT5idXNfbnVtID0gcGI7CisJICAgIHNyb21fc2VhcmNoKGRldiwgcGRldik7CisJfQorCisJLyogR2V0IHRoZSBjaGlwIGNvbmZpZ3VyYXRpb24gcmV2aXNpb24gcmVnaXN0ZXIgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX1JFVklTSU9OX0lELCAmbHAtPmNmcnYpOworCisJLyogU2V0IHRoZSBkZXZpY2UgbnVtYmVyIGluZm9ybWF0aW9uICovCisJbHAtPmRldmljZSA9IGRldl9udW07CisJbHAtPmJ1c19udW0gPSBwYjsKKwkKKwkvKiBTZXQgdGhlIGNoaXBzZXQgaW5mb3JtYXRpb24gKi8KKwlpZiAoaXNfREMyMTE0eCkgeworCSAgICBkZXZpY2UgPSAoKGxwLT5jZnJ2ICYgQ0ZSVl9STikgPCBEQzIxMTR4X0JSSyA/IERDMjExNDIgOiBEQzIxMTQzKTsKKwl9CisJbHAtPmNoaXBzZXQgPSBkZXZpY2U7CisKKwkvKiBHZXQgdGhlIGJvYXJkIEkvTyBhZGRyZXNzICg2NCBiaXRzIG9uIHNwYXJjNjQpICovCisJaW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCisJLyogRmV0Y2ggdGhlIElSUSB0byBiZSB1c2VkICovCisJaXJxID0gcGRldi0+aXJxOworCWlmICgoaXJxID09IDApIHx8IChpcnEgPT0gMHhmZikgfHwgKChpbnQpaXJxID09IC0xKSkgeworCQllcnJvciA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9kZXY7CisJfQorCSAgICAKKwkvKiBDaGVjayBpZiBJL08gYWNjZXNzZXMgYW5kIEJ1cyBNYXN0ZXJpbmcgYXJlIGVuYWJsZWQgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJnN0YXR1cyk7CisjaWZkZWYgX19wb3dlcnBjX18KKwlpZiAoIShzdGF0dXMgJiBQQ0lfQ09NTUFORF9JTykpIHsKKwkgICAgc3RhdHVzIHw9IFBDSV9DT01NQU5EX0lPOworCSAgICBwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsIHN0YXR1cyk7CisJICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmc3RhdHVzKTsKKwl9CisjZW5kaWYgLyogX19wb3dlcnBjX18gKi8KKwlpZiAoIShzdGF0dXMgJiBQQ0lfQ09NTUFORF9JTykpIHsKKwkJZXJyb3IgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfZGV2OworCX0KKworCWlmICghKHN0YXR1cyAmIFBDSV9DT01NQU5EX01BU1RFUikpIHsKKwkgICAgc3RhdHVzIHw9IFBDSV9DT01NQU5EX01BU1RFUjsKKwkgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCBzdGF0dXMpOworCSAgICBwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJnN0YXR1cyk7CisJfQorCWlmICghKHN0YXR1cyAmIFBDSV9DT01NQU5EX01BU1RFUikpIHsKKwkJZXJyb3IgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfZGV2OworCX0KKworCS8qIENoZWNrIHRoZSBsYXRlbmN5IHRpbWVyIGZvciB2YWx1ZXMgPj0gMHg2MCAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAmdGltZXIpOworCWlmICh0aW1lciA8IDB4NjApIHsKKwkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDYwKTsKKwl9CisKKwlEZXZpY2VQcmVzZW50KGRldiwgREU0WDVfQVBST00pOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbiAoaW9iYXNlLCBERTRYNV9QQ0lfVE9UQUxfU0laRSwgImRlNHg1IikpIHsKKwkJZXJyb3IgPSAtRUJVU1k7CisJCWdvdG8gZnJlZV9kZXY7CisJfQorCisJZGV2LT5pcnEgPSBpcnE7CisJCisJaWYgKChlcnJvciA9IGRlNHg1X2h3X2luaXQoZGV2LCBpb2Jhc2UsICZwZGV2LT5kZXYpKSkgeworCQlnb3RvIHJlbGVhc2U7CisJfQorCisJcmV0dXJuIDA7CisKKyByZWxlYXNlOgorCXJlbGVhc2VfcmVnaW9uIChpb2Jhc2UsIERFNFg1X1BDSV9UT1RBTF9TSVpFKTsKKyBmcmVlX2RldjoKKwlmcmVlX25ldGRldiAoZGV2KTsKKyBkaXNhYmxlX2RldjoKKwlwY2lfZGlzYWJsZV9kZXZpY2UgKHBkZXYpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGRlNHg1X3BjaV9yZW1vdmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdV9sb25nIGlvYmFzZTsKKworCWRldiA9IHBkZXYtPmRldi5kcml2ZXJfZGF0YTsKKwlpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKworCXVucmVnaXN0ZXJfbmV0ZGV2IChkZXYpOworCWZyZWVfbmV0ZGV2IChkZXYpOworCXJlbGVhc2VfcmVnaW9uIChpb2Jhc2UsIERFNFg1X1BDSV9UT1RBTF9TSVpFKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UgKHBkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZGU0eDVfcGNpX3RibFtdID0geworICAgICAgICB7IFBDSV9WRU5ET1JfSURfREVDLCBQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUCwKKyAgICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisgICAgICAgIHsgUENJX1ZFTkRPUl9JRF9ERUMsIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX1BMVVMsCisgICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMSB9LAorICAgICAgICB7IFBDSV9WRU5ET1JfSURfREVDLCBQQ0lfREVWSUNFX0lEX0RFQ19UVUxJUF9GQVNULAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMiB9LAorICAgICAgICB7IFBDSV9WRU5ET1JfSURfREVDLCBQQ0lfREVWSUNFX0lEX0RFQ18yMTE0MiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDMgfSwKKyAgICAgICAgeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRlNHg1X3BjaV9kcml2ZXIgPSB7CisgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJkZTR4NSIsCisgICAgICAgIC5pZF90YWJsZSAgICAgICA9IGRlNHg1X3BjaV90YmwsCisgICAgICAgIC5wcm9iZSAgICAgICAgICA9IGRlNHg1X3BjaV9wcm9iZSwKKwkucmVtb3ZlICAgICAgICAgPSBfX2RldmV4aXRfcCAoZGU0eDVfcGNpX3JlbW92ZSksCit9OworCisjZW5kaWYKKworLyoKKyoqIEF1dG8gY29uZmlndXJlIHRoZSBtZWRpYSBoZXJlIHJhdGhlciB0aGFuIHNldHRpbmcgdGhlIHBvcnQgYXQgY29tcGlsZQorKiogdGltZS4gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBkZTR4NV9pbml0KCkgYW5kIHdoZW4gYSBsb3NzIG9mIG1lZGlhIGlzCisqKiBkZXRlY3RlZCAoZXhjZXNzaXZlIGNvbGxpc2lvbnMsIGxvc3Mgb2YgY2Fycmllciwgbm8gY2FycmllciBvciBsaW5rIGZhaWwKKyoqIFtUUF0gb3Igbm8gcmVjZW50IHJlY2VpdmUgYWN0aXZpdHkpIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHVzZXIgaGFzIGJlZW4gCisqKiBzbmVha3kgYW5kIGNoYW5nZWQgdGhlIHBvcnQgb24gdXMuCisqLworc3RhdGljIGludAorYXV0b2NvbmZfbWVkaWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgbmV4dF90aWNrID0gREU0WDVfQVVUT1NFTlNFX01TOworCisgICAgbHAtPmxpbmtPSyA9IDA7CisgICAgbHAtPmNfbWVkaWEgPSBBVVRPOyAgICAgICAgICAgICAgICAgICAgIC8qIEJvZ3VzIGxhc3QgbWVkaWEgKi8KKyAgICBkaXNhYmxlX2FzdChkZXYpOworICAgIGlubChERTRYNV9NRkMpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBaZXJvIHRoZSBsb3N0IGZyYW1lcyBjb3VudGVyICovCisgICAgbHAtPm1lZGlhID0gSU5JVDsKKyAgICBscC0+dGNvdW50ID0gMDsKKworICAgIGlmIChscC0+dXNlU1JPTSkgeworCW5leHRfdGljayA9IHNyb21fYXV0b2NvbmYoZGV2KTsKKyAgICB9IGVsc2UgaWYgKGxwLT5jaGlwc2V0ID09IERDMjEwNDApIHsKKwluZXh0X3RpY2sgPSBkYzIxMDQwX2F1dG9jb25mKGRldik7CisgICAgfSBlbHNlIGlmIChscC0+Y2hpcHNldCA9PSBEQzIxMDQxKSB7CisJbmV4dF90aWNrID0gZGMyMTA0MV9hdXRvY29uZihkZXYpOworICAgIH0gZWxzZSBpZiAobHAtPmNoaXBzZXQgPT0gREMyMTE0MCkgeworCW5leHRfdGljayA9IGRjMjExNDBtX2F1dG9jb25mKGRldik7CisgICAgfQorCisgICAgZW5hYmxlX2FzdChkZXYsIG5leHRfdGljayk7CisgICAgCisgICAgcmV0dXJuIChscC0+bWVkaWEpOworfQorCisvKgorKiogQXV0b2NvbmZpZ3VyZSB0aGUgbWVkaWEgd2hlbiB1c2luZyB0aGUgREMyMTA0MC4gQVVJIGNhbm5vdCBiZSBkaXN0aW5ndWlzaGVkCisqKiBmcm9tIEJOQyBhcyB0aGUgcG9ydCBoYXMgYSBqdW1wZXIgdG8gc2V0IHRoaWNrIG9yIHRoaW4gd2lyZS4gV2hlbiBzZXQgZm9yCisqKiBCTkMsIHRoZSBCTkMgcG9ydCB3aWxsIGluZGljYXRlIGFjdGl2aXR5IGlmIGl0J3Mgbm90IHRlcm1pbmF0ZWQgY29ycmVjdGx5LgorKiogVGhlIG9ubHkgd2F5IHRvIHRlc3QgZm9yIHRoYXQgaXMgdG8gcGxhY2UgYSBsb29wYmFjayBwYWNrZXQgb250byB0aGUKKyoqIG5ldHdvcmsgYW5kIHdhdGNoIGZvciBlcnJvcnMuIFNpbmNlIHdlJ3JlIG1lc3Npbmcgd2l0aCB0aGUgaW50ZXJydXB0IG1hc2sKKyoqIHJlZ2lzdGVyLCBkaXNhYmxlIHRoZSBib2FyZCBpbnRlcnJ1cHRzIGFuZCBkbyBub3QgYWxsb3cgYW55IG1vcmUgcGFja2V0cyB0bworKiogYmUgcXVldWVkIHRvIHRoZSBoYXJkd2FyZS4gUmUtZW5hYmxlIGV2ZXJ5dGhpbmcgb25seSB3aGVuIHRoZSBtZWRpYSBpcworKiogZm91bmQuCisqKiBJIG1heSBoYXZlIHRvICJhZ2Ugb3V0IiBsb2NhbGx5IHF1ZXVlZCBwYWNrZXRzIHNvIHRoYXQgdGhlIGhpZ2hlciBsYXllcgorKiogdGltZW91dHMgZG9uJ3QgZWZmZWN0aXZlbHkgZHVwbGljYXRlIHBhY2tldHMgb24gdGhlIG5ldHdvcmsuCisqLworc3RhdGljIGludAorZGMyMTA0MF9hdXRvY29uZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBuZXh0X3RpY2sgPSBERTRYNV9BVVRPU0VOU0VfTVM7CisgICAgczMyIGltcjsKKyAgICAKKyAgICBzd2l0Y2ggKGxwLT5tZWRpYSkgeworICAgIGNhc2UgSU5JVDoKKwlESVNBQkxFX0lSUXM7CisJbHAtPnR4X2VuYWJsZSA9IE5POworCWxwLT50aW1lb3V0ID0gLTE7CisJZGU0eDVfc2F2ZV9za2JzKGRldik7CisJaWYgKChscC0+YXV0b3NlbnNlID09IEFVVE8pIHx8IChscC0+YXV0b3NlbnNlID09IFRQKSkgeworCSAgICBscC0+bWVkaWEgPSBUUDsKKwl9IGVsc2UgaWYgKChscC0+YXV0b3NlbnNlID09IEJOQykgfHwgKGxwLT5hdXRvc2Vuc2UgPT0gQVVJKSB8fCAobHAtPmF1dG9zZW5zZSA9PSBCTkNfQVVJKSkgeworCSAgICBscC0+bWVkaWEgPSBCTkNfQVVJOworCX0gZWxzZSBpZiAobHAtPmF1dG9zZW5zZSA9PSBFWFRfU0lBKSB7CisJICAgIGxwLT5tZWRpYSA9IEVYVF9TSUE7CisJfSBlbHNlIHsKKwkgICAgbHAtPm1lZGlhID0gTkM7CisJfQorCWxwLT5sb2NhbF9zdGF0ZSA9IDA7CisJbmV4dF90aWNrID0gZGMyMTA0MF9hdXRvY29uZihkZXYpOworCWJyZWFrOworCQorICAgIGNhc2UgVFA6CisJbmV4dF90aWNrID0gZGMyMTA0MF9zdGF0ZShkZXYsIDB4OGYwMSwgMHhmZmZmLCAweDAwMDAsIDMwMDAsIEJOQ19BVUksIAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQX1NVU1BFQ1QsIHRlc3RfdHApOworCWJyZWFrOworCQorICAgIGNhc2UgVFBfU1VTUEVDVDoKKwluZXh0X3RpY2sgPSBkZTR4NV9zdXNwZWN0X3N0YXRlKGRldiwgMTAwMCwgVFAsIHRlc3RfdHAsIGRjMjEwNDBfYXV0b2NvbmYpOworCWJyZWFrOworCQorICAgIGNhc2UgQk5DOgorICAgIGNhc2UgQVVJOgorICAgIGNhc2UgQk5DX0FVSToKKwluZXh0X3RpY2sgPSBkYzIxMDQwX3N0YXRlKGRldiwgMHg4ZjA5LCAweDA3MDUsIDB4MDAwNiwgMzAwMCwgRVhUX1NJQSwgCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTkNfQVVJX1NVU1BFQ1QsIHBpbmdfbWVkaWEpOworCWJyZWFrOworCQorICAgIGNhc2UgQk5DX0FVSV9TVVNQRUNUOgorCW5leHRfdGljayA9IGRlNHg1X3N1c3BlY3Rfc3RhdGUoZGV2LCAxMDAwLCBCTkNfQVVJLCBwaW5nX21lZGlhLCBkYzIxMDQwX2F1dG9jb25mKTsKKwlicmVhazsKKwkKKyAgICBjYXNlIEVYVF9TSUE6CisJbmV4dF90aWNrID0gZGMyMTA0MF9zdGF0ZShkZXYsIDB4MzA0MSwgMHgwMDAwLCAweDAwMDYsIDMwMDAsIAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQywgRVhUX1NJQV9TVVNQRUNULCBwaW5nX21lZGlhKTsKKwlicmVhazsKKwkKKyAgICBjYXNlIEVYVF9TSUFfU1VTUEVDVDoKKwluZXh0X3RpY2sgPSBkZTR4NV9zdXNwZWN0X3N0YXRlKGRldiwgMTAwMCwgRVhUX1NJQSwgcGluZ19tZWRpYSwgZGMyMTA0MF9hdXRvY29uZik7CisJYnJlYWs7CisJCisgICAgY2FzZSBOQzoKKwkvKiBkZWZhdWx0IHRvIFRQIGZvciBhbGwgKi8KKwlyZXNldF9pbml0X3NpYShkZXYsIDB4OGYwMSwgMHhmZmZmLCAweDAwMDApOworCWlmIChscC0+bWVkaWEgIT0gbHAtPmNfbWVkaWEpIHsKKwkgICAgZGU0eDVfZGJnX21lZGlhKGRldik7CisJICAgIGxwLT5jX21lZGlhID0gbHAtPm1lZGlhOworCX0KKwlscC0+bWVkaWEgPSBJTklUOworCWxwLT50eF9lbmFibGUgPSBOTzsKKwlicmVhazsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIG5leHRfdGljazsKK30KKworc3RhdGljIGludAorZGMyMTA0MF9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY3NyMTMsIGludCBjc3IxNCwgaW50IGNzcjE1LCBpbnQgdGltZW91dCwKKwkgICAgICBpbnQgbmV4dF9zdGF0ZSwgaW50IHN1c3BlY3Rfc3RhdGUsIAorCSAgICAgIGludCAoKmZuKShzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQpKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IG5leHRfdGljayA9IERFNFg1X0FVVE9TRU5TRV9NUzsKKyAgICBpbnQgbGlua0JhZDsKKworICAgIHN3aXRjaCAobHAtPmxvY2FsX3N0YXRlKSB7CisgICAgY2FzZSAwOgorCXJlc2V0X2luaXRfc2lhKGRldiwgY3NyMTMsIGNzcjE0LCBjc3IxNSk7CisJbHAtPmxvY2FsX3N0YXRlKys7CisJbmV4dF90aWNrID0gNTAwOworCWJyZWFrOworCSAgICAKKyAgICBjYXNlIDE6CisJaWYgKCFscC0+dHhfZW5hYmxlKSB7CisJICAgIGxpbmtCYWQgPSBmbihkZXYsIHRpbWVvdXQpOworCSAgICBpZiAobGlua0JhZCA8IDApIHsKKwkJbmV4dF90aWNrID0gbGlua0JhZCAmIH5USU1FUl9DQjsKKwkgICAgfSBlbHNlIHsKKwkJaWYgKGxpbmtCYWQgJiYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykpIHsKKwkJICAgIGxwLT5sb2NhbF9zdGF0ZSA9IDA7CisJCSAgICBscC0+bWVkaWEgPSBuZXh0X3N0YXRlOworCQl9IGVsc2UgeworCQkgICAgZGU0eDVfaW5pdF9jb25uZWN0aW9uKGRldik7CisJCX0KKwkgICAgfQorCX0gZWxzZSBpZiAoIWxwLT5saW5rT0sgJiYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykpIHsKKwkgICAgbHAtPm1lZGlhID0gc3VzcGVjdF9zdGF0ZTsKKwkgICAgbmV4dF90aWNrID0gMzAwMDsKKwl9CisJYnJlYWs7CisgICAgfQorICAgIAorICAgIHJldHVybiBuZXh0X3RpY2s7Cit9CisKK3N0YXRpYyBpbnQKK2RlNHg1X3N1c3BlY3Rfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHRpbWVvdXQsIGludCBwcmV2X3N0YXRlLAorCQkgICAgICBpbnQgKCpmbikoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50KSwKKwkJICAgICAgaW50ICgqYXNmbikoc3RydWN0IG5ldF9kZXZpY2UgKikpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBpbnQgbmV4dF90aWNrID0gREU0WDVfQVVUT1NFTlNFX01TOworICAgIGludCBsaW5rQmFkOworCisgICAgc3dpdGNoIChscC0+bG9jYWxfc3RhdGUpIHsKKyAgICBjYXNlIDE6CisJaWYgKGxwLT5saW5rT0spIHsKKwkgICAgbHAtPm1lZGlhID0gcHJldl9zdGF0ZTsKKwl9IGVsc2UgeworCSAgICBscC0+bG9jYWxfc3RhdGUrKzsKKwkgICAgbmV4dF90aWNrID0gYXNmbihkZXYpOworCX0KKwlicmVhazsKKworICAgIGNhc2UgMjoKKwlsaW5rQmFkID0gZm4oZGV2LCB0aW1lb3V0KTsKKwlpZiAobGlua0JhZCA8IDApIHsKKwkgICAgbmV4dF90aWNrID0gbGlua0JhZCAmIH5USU1FUl9DQjsKKwl9IGVsc2UgaWYgKCFsaW5rQmFkKSB7CisJICAgIGxwLT5sb2NhbF9zdGF0ZS0tOworCSAgICBscC0+bWVkaWEgPSBwcmV2X3N0YXRlOworCX0gZWxzZSB7CisJICAgIGxwLT5tZWRpYSA9IElOSVQ7CisJICAgIGxwLT50Y291bnQrKzsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIG5leHRfdGljazsKK30KKworLyoKKyoqIEF1dG9jb25maWd1cmUgdGhlIG1lZGlhIHdoZW4gdXNpbmcgdGhlIERDMjEwNDEuIEFVSSBuZWVkcyB0byBiZSB0ZXN0ZWQKKyoqIGJlZm9yZSBCTkMsIGJlY2F1c2UgdGhlIEJOQyBwb3J0IHdpbGwgaW5kaWNhdGUgYWN0aXZpdHkgaWYgaXQncyBub3QKKyoqIHRlcm1pbmF0ZWQgY29ycmVjdGx5LiBUaGUgb25seSB3YXkgdG8gdGVzdCBmb3IgdGhhdCBpcyB0byBwbGFjZSBhIGxvb3BiYWNrCisqKiBwYWNrZXQgb250byB0aGUgbmV0d29yayBhbmQgd2F0Y2ggZm9yIGVycm9ycy4gU2luY2Ugd2UncmUgbWVzc2luZyB3aXRoCisqKiB0aGUgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIsIGRpc2FibGUgdGhlIGJvYXJkIGludGVycnVwdHMgYW5kIGRvIG5vdCBhbGxvdworKiogYW55IG1vcmUgcGFja2V0cyB0byBiZSBxdWV1ZWQgdG8gdGhlIGhhcmR3YXJlLiBSZS1lbmFibGUgZXZlcnl0aGluZyBvbmx5CisqKiB3aGVuIHRoZSBtZWRpYSBpcyBmb3VuZC4KKyovCitzdGF0aWMgaW50CitkYzIxMDQxX2F1dG9jb25mKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgczMyIHN0cywgaXJxcywgaXJxX21hc2ssIGltciwgb21yOworICAgIGludCBuZXh0X3RpY2sgPSBERTRYNV9BVVRPU0VOU0VfTVM7CisgICAgCisgICAgc3dpdGNoIChscC0+bWVkaWEpIHsKKyAgICBjYXNlIElOSVQ6CisJRElTQUJMRV9JUlFzOworCWxwLT50eF9lbmFibGUgPSBOTzsKKwlscC0+dGltZW91dCA9IC0xOworCWRlNHg1X3NhdmVfc2ticyhkZXYpOyAgICAgICAgICAvKiBTYXZlIG5vbiB0cmFuc21pdHRlZCBza2IncyAqLworCWlmICgobHAtPmF1dG9zZW5zZSA9PSBBVVRPKSB8fCAobHAtPmF1dG9zZW5zZSA9PSBUUF9OVykpIHsKKwkgICAgbHAtPm1lZGlhID0gVFA7ICAgICAgICAgICAgLyogT24gY2hpcCBhdXRvIG5lZ290aWF0aW9uIGlzIGJyb2tlbiAqLworCX0gZWxzZSBpZiAobHAtPmF1dG9zZW5zZSA9PSBUUCkgeworCSAgICBscC0+bWVkaWEgPSBUUDsKKwl9IGVsc2UgaWYgKGxwLT5hdXRvc2Vuc2UgPT0gQk5DKSB7CisJICAgIGxwLT5tZWRpYSA9IEJOQzsKKwl9IGVsc2UgaWYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVJKSB7CisJICAgIGxwLT5tZWRpYSA9IEFVSTsKKwl9IGVsc2UgeworCSAgICBscC0+bWVkaWEgPSBOQzsKKwl9CisJbHAtPmxvY2FsX3N0YXRlID0gMDsKKwluZXh0X3RpY2sgPSBkYzIxMDQxX2F1dG9jb25mKGRldik7CisJYnJlYWs7CisJCisgICAgY2FzZSBUUF9OVzoKKwlpZiAobHAtPnRpbWVvdXQgPCAwKSB7CisJICAgIG9tciA9IGlubChERTRYNV9PTVIpOy8qIFNldCB1cCBmdWxsIGR1cGxleCBmb3IgdGhlIGF1dG9uZWdvdGlhdGUgKi8KKwkgICAgb3V0bChvbXIgfCBPTVJfRkRYLCBERTRYNV9PTVIpOworCX0KKwlpcnFzID0gU1RTX0xORiB8IFNUU19MTlA7CisJaXJxX21hc2sgPSBJTVJfTEZNIHwgSU1SX0xQTTsKKwlzdHMgPSB0ZXN0X21lZGlhKGRldiwgaXJxcywgaXJxX21hc2ssIDB4ZWYwMSwgMHhmZmZmLCAweDAwMDgsIDI0MDApOworCWlmIChzdHMgPCAwKSB7CisJICAgIG5leHRfdGljayA9IHN0cyAmIH5USU1FUl9DQjsKKwl9IGVsc2UgeworCSAgICBpZiAoc3RzICYgU1RTX0xOUCkgeworCQlscC0+bWVkaWEgPSBBTlM7CisJICAgIH0gZWxzZSB7CisJCWxwLT5tZWRpYSA9IEFVSTsKKwkgICAgfQorCSAgICBuZXh0X3RpY2sgPSBkYzIxMDQxX2F1dG9jb25mKGRldik7CisJfQorCWJyZWFrOworCQorICAgIGNhc2UgQU5TOgorCWlmICghbHAtPnR4X2VuYWJsZSkgeworCSAgICBpcnFzID0gU1RTX0xOUDsKKwkgICAgaXJxX21hc2sgPSBJTVJfTFBNOworCSAgICBzdHMgPSB0ZXN0X2FucyhkZXYsIGlycXMsIGlycV9tYXNrLCAzMDAwKTsKKwkgICAgaWYgKHN0cyA8IDApIHsKKwkJbmV4dF90aWNrID0gc3RzICYgflRJTUVSX0NCOworCSAgICB9IGVsc2UgeworCQlpZiAoIShzdHMgJiBTVFNfTE5QKSAmJiAobHAtPmF1dG9zZW5zZSA9PSBBVVRPKSkgeworCQkgICAgbHAtPm1lZGlhID0gVFA7CisJCSAgICBuZXh0X3RpY2sgPSBkYzIxMDQxX2F1dG9jb25mKGRldik7CisJCX0gZWxzZSB7CisJCSAgICBscC0+bG9jYWxfc3RhdGUgPSAxOworCQkgICAgZGU0eDVfaW5pdF9jb25uZWN0aW9uKGRldik7CisJCX0KKwkgICAgfQorCX0gZWxzZSBpZiAoIWxwLT5saW5rT0sgJiYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykpIHsKKwkgICAgbHAtPm1lZGlhID0gQU5TX1NVU1BFQ1Q7CisJICAgIG5leHRfdGljayA9IDMwMDA7CisJfQorCWJyZWFrOworCQorICAgIGNhc2UgQU5TX1NVU1BFQ1Q6CisJbmV4dF90aWNrID0gZGU0eDVfc3VzcGVjdF9zdGF0ZShkZXYsIDEwMDAsIEFOUywgdGVzdF90cCwgZGMyMTA0MV9hdXRvY29uZik7CisJYnJlYWs7CisJCisgICAgY2FzZSBUUDoKKwlpZiAoIWxwLT50eF9lbmFibGUpIHsKKwkgICAgaWYgKGxwLT50aW1lb3V0IDwgMCkgeworCQlvbXIgPSBpbmwoREU0WDVfT01SKTsgICAgICAgICAgLyogU2V0IHVwIGhhbGYgZHVwbGV4IGZvciBUUCAqLworCQlvdXRsKG9tciAmIH5PTVJfRkRYLCBERTRYNV9PTVIpOworCSAgICB9CisJICAgIGlycXMgPSBTVFNfTE5GIHwgU1RTX0xOUDsKKwkgICAgaXJxX21hc2sgPSBJTVJfTEZNIHwgSU1SX0xQTTsKKwkgICAgc3RzID0gdGVzdF9tZWRpYShkZXYsaXJxcywgaXJxX21hc2ssIDB4ZWYwMSwgMHhmZjNmLCAweDAwMDgsIDI0MDApOworCSAgICBpZiAoc3RzIDwgMCkgeworCQluZXh0X3RpY2sgPSBzdHMgJiB+VElNRVJfQ0I7CisJICAgIH0gZWxzZSB7CisJCWlmICghKHN0cyAmIFNUU19MTlApICYmIChscC0+YXV0b3NlbnNlID09IEFVVE8pKSB7CisJCSAgICBpZiAoaW5sKERFNFg1X1NJU1IpICYgU0lTUl9OUkEpIHsKKwkJCWxwLT5tZWRpYSA9IEFVSTsgICAgICAgLyogTm9uIHNlbGVjdGVkIHBvcnQgYWN0aXZpdHkgKi8KKwkJICAgIH0gZWxzZSB7CisJCQlscC0+bWVkaWEgPSBCTkM7CisJCSAgICB9CisJCSAgICBuZXh0X3RpY2sgPSBkYzIxMDQxX2F1dG9jb25mKGRldik7CisJCX0gZWxzZSB7CisJCSAgICBscC0+bG9jYWxfc3RhdGUgPSAxOworCQkgICAgZGU0eDVfaW5pdF9jb25uZWN0aW9uKGRldik7CisJCX0KKwkgICAgfQorCX0gZWxzZSBpZiAoIWxwLT5saW5rT0sgJiYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykpIHsKKwkgICAgbHAtPm1lZGlhID0gVFBfU1VTUEVDVDsKKwkgICAgbmV4dF90aWNrID0gMzAwMDsKKwl9CisJYnJlYWs7CisJCisgICAgY2FzZSBUUF9TVVNQRUNUOgorCW5leHRfdGljayA9IGRlNHg1X3N1c3BlY3Rfc3RhdGUoZGV2LCAxMDAwLCBUUCwgdGVzdF90cCwgZGMyMTA0MV9hdXRvY29uZik7CisJYnJlYWs7CisJCisgICAgY2FzZSBBVUk6CisJaWYgKCFscC0+dHhfZW5hYmxlKSB7CisJICAgIGlmIChscC0+dGltZW91dCA8IDApIHsKKwkJb21yID0gaW5sKERFNFg1X09NUik7ICAgICAgICAgIC8qIFNldCB1cCBoYWxmIGR1cGxleCBmb3IgQVVJICovCisJCW91dGwob21yICYgfk9NUl9GRFgsIERFNFg1X09NUik7CisJICAgIH0KKwkgICAgaXJxcyA9IDA7CisJICAgIGlycV9tYXNrID0gMDsKKwkgICAgc3RzID0gdGVzdF9tZWRpYShkZXYsaXJxcywgaXJxX21hc2ssIDB4ZWYwOSwgMHhmNzNkLCAweDAwMGUsIDEwMDApOworCSAgICBpZiAoc3RzIDwgMCkgeworCQluZXh0X3RpY2sgPSBzdHMgJiB+VElNRVJfQ0I7CisJICAgIH0gZWxzZSB7CisJCWlmICghKGlubChERTRYNV9TSVNSKSAmIFNJU1JfU1JBKSAmJiAobHAtPmF1dG9zZW5zZSA9PSBBVVRPKSkgeworCQkgICAgbHAtPm1lZGlhID0gQk5DOworCQkgICAgbmV4dF90aWNrID0gZGMyMTA0MV9hdXRvY29uZihkZXYpOworCQl9IGVsc2UgeworCQkgICAgbHAtPmxvY2FsX3N0YXRlID0gMTsKKwkJICAgIGRlNHg1X2luaXRfY29ubmVjdGlvbihkZXYpOworCQl9CisJICAgIH0KKwl9IGVsc2UgaWYgKCFscC0+bGlua09LICYmIChscC0+YXV0b3NlbnNlID09IEFVVE8pKSB7CisJICAgIGxwLT5tZWRpYSA9IEFVSV9TVVNQRUNUOworCSAgICBuZXh0X3RpY2sgPSAzMDAwOworCX0KKwlicmVhazsKKwkKKyAgICBjYXNlIEFVSV9TVVNQRUNUOgorCW5leHRfdGljayA9IGRlNHg1X3N1c3BlY3Rfc3RhdGUoZGV2LCAxMDAwLCBBVUksIHBpbmdfbWVkaWEsIGRjMjEwNDFfYXV0b2NvbmYpOworCWJyZWFrOworCQorICAgIGNhc2UgQk5DOgorCXN3aXRjaCAobHAtPmxvY2FsX3N0YXRlKSB7CisJY2FzZSAwOgorCSAgICBpZiAobHAtPnRpbWVvdXQgPCAwKSB7CisJCW9tciA9IGlubChERTRYNV9PTVIpOyAgICAgICAgICAvKiBTZXQgdXAgaGFsZiBkdXBsZXggZm9yIEJOQyAqLworCQlvdXRsKG9tciAmIH5PTVJfRkRYLCBERTRYNV9PTVIpOworCSAgICB9CisJICAgIGlycXMgPSAwOworCSAgICBpcnFfbWFzayA9IDA7CisJICAgIHN0cyA9IHRlc3RfbWVkaWEoZGV2LGlycXMsIGlycV9tYXNrLCAweGVmMDksIDB4ZjczZCwgMHgwMDA2LCAxMDAwKTsKKwkgICAgaWYgKHN0cyA8IDApIHsKKwkJbmV4dF90aWNrID0gc3RzICYgflRJTUVSX0NCOworCSAgICB9IGVsc2UgeworCQlscC0+bG9jYWxfc3RhdGUrKzsgICAgICAgICAgICAgLyogRW5zdXJlIG1lZGlhIGNvbm5lY3RlZCAqLworCQluZXh0X3RpY2sgPSBkYzIxMDQxX2F1dG9jb25mKGRldik7CisJICAgIH0KKwkgICAgYnJlYWs7CisJICAgIAorCWNhc2UgMToKKwkgICAgaWYgKCFscC0+dHhfZW5hYmxlKSB7CisJCWlmICgoc3RzID0gcGluZ19tZWRpYShkZXYsIDMwMDApKSA8IDApIHsKKwkJICAgIG5leHRfdGljayA9IHN0cyAmIH5USU1FUl9DQjsKKwkJfSBlbHNlIHsKKwkJICAgIGlmIChzdHMpIHsKKwkJCWxwLT5sb2NhbF9zdGF0ZSA9IDA7CisJCQlscC0+bWVkaWEgPSBOQzsKKwkJICAgIH0gZWxzZSB7CisJCQlkZTR4NV9pbml0X2Nvbm5lY3Rpb24oZGV2KTsKKwkJICAgIH0KKwkJfQorCSAgICB9IGVsc2UgaWYgKCFscC0+bGlua09LICYmIChscC0+YXV0b3NlbnNlID09IEFVVE8pKSB7CisJCWxwLT5tZWRpYSA9IEJOQ19TVVNQRUNUOworCQluZXh0X3RpY2sgPSAzMDAwOworCSAgICB9CisJICAgIGJyZWFrOworCX0KKwlicmVhazsKKwkKKyAgICBjYXNlIEJOQ19TVVNQRUNUOgorCW5leHRfdGljayA9IGRlNHg1X3N1c3BlY3Rfc3RhdGUoZGV2LCAxMDAwLCBCTkMsIHBpbmdfbWVkaWEsIGRjMjEwNDFfYXV0b2NvbmYpOworCWJyZWFrOworCQorICAgIGNhc2UgTkM6CisJb21yID0gaW5sKERFNFg1X09NUik7ICAgIC8qIFNldCB1cCBmdWxsIGR1cGxleCBmb3IgdGhlIGF1dG9uZWdvdGlhdGUgKi8KKwlvdXRsKG9tciB8IE9NUl9GRFgsIERFNFg1X09NUik7CisJcmVzZXRfaW5pdF9zaWEoZGV2LCAweGVmMDEsIDB4ZmZmZiwgMHgwMDA4KTsvKiBJbml0aWFsaXNlIHRoZSBTSUEgKi8KKwlpZiAobHAtPm1lZGlhICE9IGxwLT5jX21lZGlhKSB7CisJICAgIGRlNHg1X2RiZ19tZWRpYShkZXYpOworCSAgICBscC0+Y19tZWRpYSA9IGxwLT5tZWRpYTsKKwl9CisJbHAtPm1lZGlhID0gSU5JVDsKKwlscC0+dHhfZW5hYmxlID0gTk87CisJYnJlYWs7CisgICAgfQorICAgIAorICAgIHJldHVybiBuZXh0X3RpY2s7Cit9CisKKy8qCisqKiBTb21lIGF1dG9uZWdvdGlhdGlvbiBjaGlwcyBhcmUgYnJva2VuIGluIHRoYXQgdGhleSBkbyBub3QgcmV0dXJuIHRoZQorKiogYWNrbm93bGVkZ2UgYml0IChhbmxwYSAmIE1JSV9BTkxQQV9BQ0spIGluIHRoZSBsaW5rIHBhcnRuZXIgYWR2ZXJ0aXNlbWVudAorKiogcmVnaXN0ZXIsIGV4Y2VwdCBhdCB0aGUgZmlyc3QgcG93ZXIgdXAgbmVnb3RpYXRpb24uCisqLworc3RhdGljIGludAorZGMyMTE0MG1fYXV0b2NvbmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGludCBhbmEsIGFubHBhLCBjYXAsIGNyLCBzbG5rLCBzcjsKKyAgICBpbnQgbmV4dF90aWNrID0gREU0WDVfQVVUT1NFTlNFX01TOworICAgIHVfbG9uZyBpbXIsIG9tciwgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgCisgICAgc3dpdGNoKGxwLT5tZWRpYSkgeworICAgIGNhc2UgSU5JVDogCisgICAgICAgIGlmIChscC0+dGltZW91dCA8IDApIHsKKwkgICAgRElTQUJMRV9JUlFzOworCSAgICBscC0+dHhfZW5hYmxlID0gRkFMU0U7CisJICAgIGxwLT5saW5rT0sgPSAwOworCSAgICBkZTR4NV9zYXZlX3NrYnMoZGV2KTsgICAgICAgICAgLyogU2F2ZSBub24gdHJhbnNtaXR0ZWQgc2tiJ3MgKi8KKwl9CisJaWYgKChuZXh0X3RpY2sgPSBkZTR4NV9yZXNldF9waHkoZGV2KSkgPCAwKSB7CisJICAgIG5leHRfdGljayAmPSB+VElNRVJfQ0I7CisJfSBlbHNlIHsKKwkgICAgaWYgKGxwLT51c2VTUk9NKSB7CisJCWlmIChzcm9tX21hcF9tZWRpYShkZXYpIDwgMCkgeworCQkgICAgbHAtPnRjb3VudCsrOworCQkgICAgcmV0dXJuIG5leHRfdGljazsKKwkJfQorCQlzcm9tX2V4ZWMoZGV2LCBscC0+cGh5W2xwLT5hY3RpdmVdLmdlcCk7CisJCWlmIChscC0+aW5mb2Jsb2NrX21lZGlhID09IEFOUykgeworCQkgICAgYW5hID0gbHAtPnBoeVtscC0+YWN0aXZlXS5hbmEgfCBNSUlfQU5BX0NTTUE7CisJCSAgICBtaWlfd3IoYW5hLCBNSUlfQU5BLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJbHAtPnRtcCA9IE1JSV9TUl9BU1NDOyAgICAgLyogRmFrZSBvdXQgdGhlIE1JSSBzcGVlZCBzZXQgKi8KKwkJU0VUXzEwTWI7CisJCWlmIChscC0+YXV0b3NlbnNlID09IF8xMDBNYikgeworCQkgICAgbHAtPm1lZGlhID0gXzEwME1iOworCQl9IGVsc2UgaWYgKGxwLT5hdXRvc2Vuc2UgPT0gXzEwTWIpIHsKKwkJICAgIGxwLT5tZWRpYSA9IF8xME1iOworCQl9IGVsc2UgaWYgKChscC0+YXV0b3NlbnNlID09IEFVVE8pICYmIAorCQkJICAgICAgICAgICAgKChzcj1pc19hbmNfY2FwYWJsZShkZXYpKSAmIE1JSV9TUl9BTkMpKSB7CisJCSAgICBhbmEgPSAoKChzciA+PiA2KSAmIE1JSV9BTkFfVEFGKSB8IE1JSV9BTkFfQ1NNQSk7CisJCSAgICBhbmEgJj0gKGxwLT5mZHggPyB+MCA6IH5NSUlfQU5BX0ZEQU0pOworCQkgICAgbWlpX3dyKGFuYSwgTUlJX0FOQSwgbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLCBERTRYNV9NSUkpOworCQkgICAgbHAtPm1lZGlhID0gQU5TOworCQl9IGVsc2UgaWYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykgeworCQkgICAgbHAtPm1lZGlhID0gU1BEX0RFVDsKKwkJfSBlbHNlIGlmIChpc19zcGRfMTAwKGRldikgJiYgaXNfMTAwX3VwKGRldikpIHsKKwkJICAgIGxwLT5tZWRpYSA9IF8xMDBNYjsKKwkJfSBlbHNlIHsKKwkJICAgIGxwLT5tZWRpYSA9IE5DOworCQl9CisJICAgIH0KKwkgICAgbHAtPmxvY2FsX3N0YXRlID0gMDsKKwkgICAgbmV4dF90aWNrID0gZGMyMTE0MG1fYXV0b2NvbmYoZGV2KTsKKwl9CisJYnJlYWs7CisJCisgICAgY2FzZSBBTlM6CisJc3dpdGNoIChscC0+bG9jYWxfc3RhdGUpIHsKKwljYXNlIDA6CisJICAgIGlmIChscC0+dGltZW91dCA8IDApIHsKKwkJbWlpX3dyKE1JSV9DUl9BU1NFIHwgTUlJX0NSX1JBTiwgTUlJX0NSLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7CisJICAgIH0KKwkgICAgY3IgPSB0ZXN0X21paV9yZWcoZGV2LCBNSUlfQ1IsIE1JSV9DUl9SQU4sIEZBTFNFLCA1MDApOworCSAgICBpZiAoY3IgPCAwKSB7CisJCW5leHRfdGljayA9IGNyICYgflRJTUVSX0NCOworCSAgICB9IGVsc2UgeworCQlpZiAoY3IpIHsKKwkJICAgIGxwLT5sb2NhbF9zdGF0ZSA9IDA7CisJCSAgICBscC0+bWVkaWEgPSBTUERfREVUOworCQl9IGVsc2UgeworCQkgICAgbHAtPmxvY2FsX3N0YXRlKys7CisJCX0KKwkJbmV4dF90aWNrID0gZGMyMTE0MG1fYXV0b2NvbmYoZGV2KTsKKwkgICAgfQorCSAgICBicmVhazsKKwkgICAgCisJY2FzZSAxOgorCSAgICBpZiAoKHNyPXRlc3RfbWlpX3JlZyhkZXYsIE1JSV9TUiwgTUlJX1NSX0FTU0MsIFRSVUUsIDIwMDApKSA8IDApIHsKKwkJbmV4dF90aWNrID0gc3IgJiB+VElNRVJfQ0I7CisJICAgIH0gZWxzZSB7CisJCWxwLT5tZWRpYSA9IFNQRF9ERVQ7CisJCWxwLT5sb2NhbF9zdGF0ZSA9IDA7CisJCWlmIChzcikgeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdWNjZXNzISAqLworCQkgICAgbHAtPnRtcCA9IE1JSV9TUl9BU1NDOworCQkgICAgYW5scGEgPSBtaWlfcmQoTUlJX0FOTFBBLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7CisJCSAgICBhbmEgPSBtaWlfcmQoTUlJX0FOQSwgbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLCBERTRYNV9NSUkpOworCQkgICAgaWYgKCEoYW5scGEgJiBNSUlfQU5MUEFfUkYpICYmIAorCQkJIChjYXAgPSBhbmxwYSAmIE1JSV9BTkxQQV9UQUYgJiBhbmEpKSB7CisJCQlpZiAoY2FwICYgTUlJX0FOQV8xMDBNKSB7CisJCQkgICAgbHAtPmZkeCA9ICgoYW5hICYgYW5scGEgJiBNSUlfQU5BX0ZEQU0gJiBNSUlfQU5BXzEwME0pID8gVFJVRSA6IEZBTFNFKTsKKwkJCSAgICBscC0+bWVkaWEgPSBfMTAwTWI7CisJCQl9IGVsc2UgaWYgKGNhcCAmIE1JSV9BTkFfMTBNKSB7CisJCQkgICAgbHAtPmZkeCA9ICgoYW5hICYgYW5scGEgJiBNSUlfQU5BX0ZEQU0gJiBNSUlfQU5BXzEwTSkgPyBUUlVFIDogRkFMU0UpOworCisJCQkgICAgbHAtPm1lZGlhID0gXzEwTWI7CisJCQl9CisJCSAgICB9CisJCX0gICAgICAgICAgICAgICAgICAgICAgIC8qIEF1dG8gTmVnb3RpYXRpb24gZmFpbGVkIHRvIGZpbmlzaCAqLworCQluZXh0X3RpY2sgPSBkYzIxMTQwbV9hdXRvY29uZihkZXYpOworCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXV0byBOZWdvdGlhdGlvbiBmYWlsZWQgdG8gc3RhcnQgKi8KKwkgICAgYnJlYWs7CisJfQorCWJyZWFrOworCQorICAgIGNhc2UgU1BEX0RFVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaG9vc2UgMTBNYi9zIG9yIDEwME1iL3MgKi8KKyAgICAgICAgaWYgKGxwLT50aW1lb3V0IDwgMCkgeworCSAgICBscC0+dG1wID0gKGxwLT5waHlbbHAtPmFjdGl2ZV0uaWQgPyBNSUlfU1JfTEtTIDogCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAofmdlcF9yZChkZXYpICYgR0VQX0xOUCkpOworCSAgICBTRVRfMTAwTWJfUERFVDsKKwl9CisgICAgICAgIGlmICgoc2xuayA9IHRlc3RfZm9yXzEwME1iKGRldiwgNjUwMCkpIDwgMCkgeworCSAgICBuZXh0X3RpY2sgPSBzbG5rICYgflRJTUVSX0NCOworCX0gZWxzZSB7CisJICAgIGlmIChpc19zcGRfMTAwKGRldikgJiYgaXNfMTAwX3VwKGRldikpIHsKKwkJbHAtPm1lZGlhID0gXzEwME1iOworCSAgICB9IGVsc2UgaWYgKCghaXNfc3BkXzEwMChkZXYpICYmIChpc18xMF91cChkZXYpICYgbHAtPnRtcCkpKSB7CisJCWxwLT5tZWRpYSA9IF8xME1iOworCSAgICB9IGVsc2UgeworCQlscC0+bWVkaWEgPSBOQzsKKwkgICAgfQorCSAgICBuZXh0X3RpY2sgPSBkYzIxMTQwbV9hdXRvY29uZihkZXYpOworCX0KKwlicmVhazsKKwkKKyAgICBjYXNlIF8xMDBNYjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IDEwME1iL3MgKi8KKyAgICAgICAgbmV4dF90aWNrID0gMzAwMDsKKwlpZiAoIWxwLT50eF9lbmFibGUpIHsKKwkgICAgU0VUXzEwME1iOworCSAgICBkZTR4NV9pbml0X2Nvbm5lY3Rpb24oZGV2KTsKKwl9IGVsc2UgeworCSAgICBpZiAoIWxwLT5saW5rT0sgJiYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykpIHsKKwkJaWYgKCFpc18xMDBfdXAoZGV2KSB8fCAoIWxwLT51c2VTUk9NICYmICFpc19zcGRfMTAwKGRldikpKSB7CisJCSAgICBscC0+bWVkaWEgPSBJTklUOworCQkgICAgbHAtPnRjb3VudCsrOworCQkgICAgbmV4dF90aWNrID0gREU0WDVfQVVUT1NFTlNFX01TOworCQl9CisJICAgIH0KKwl9CisJYnJlYWs7CisKKyAgICBjYXNlIEJOQzoKKyAgICBjYXNlIEFVSToKKyAgICBjYXNlIF8xME1iOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IDEwTWIvcyAqLworICAgICAgICBuZXh0X3RpY2sgPSAzMDAwOworCWlmICghbHAtPnR4X2VuYWJsZSkgeworCSAgICBTRVRfMTBNYjsKKwkgICAgZGU0eDVfaW5pdF9jb25uZWN0aW9uKGRldik7CisJfSBlbHNlIHsKKwkgICAgaWYgKCFscC0+bGlua09LICYmIChscC0+YXV0b3NlbnNlID09IEFVVE8pKSB7CisJCWlmICghaXNfMTBfdXAoZGV2KSB8fCAoIWxwLT51c2VTUk9NICYmIGlzX3NwZF8xMDAoZGV2KSkpIHsKKwkJICAgIGxwLT5tZWRpYSA9IElOSVQ7CisJCSAgICBscC0+dGNvdW50Kys7CisJCSAgICBuZXh0X3RpY2sgPSBERTRYNV9BVVRPU0VOU0VfTVM7CisJCX0KKwkgICAgfQorCX0KKwlicmVhazsKKwkKKyAgICBjYXNlIE5DOgorICAgICAgICBpZiAobHAtPm1lZGlhICE9IGxwLT5jX21lZGlhKSB7CisJICAgIGRlNHg1X2RiZ19tZWRpYShkZXYpOworCSAgICBscC0+Y19tZWRpYSA9IGxwLT5tZWRpYTsKKwl9CisJbHAtPm1lZGlhID0gSU5JVDsKKwlscC0+dHhfZW5hYmxlID0gRkFMU0U7CisJYnJlYWs7CisgICAgfQorICAgIAorICAgIHJldHVybiBuZXh0X3RpY2s7Cit9CisKKy8qCisqKiBUaGlzIHJvdXRpbmUgbWF5IGJlIG1lcmdlZCBpbnRvIGRjMjExNDBtX2F1dG9jb25mKCkgc29tZXRpbWUgYXMgSSdtCisqKiBjaGFuZ2luZyBob3cgSSBmaWd1cmUgb3V0IHRoZSBtZWRpYSAtIGJ1dCB0cnlpbmcgdG8ga2VlcCBpdCBiYWNrd2FyZHMKKyoqIGNvbXBhdGlibGUgd2l0aCB0aGUgZGU1MDAteGEgYW5kIGRlNTAwLWFhLgorKiogV2hldGhlciBpdCdzIEJOQywgQVVJLCBTWU0gb3IgTUlJIGlzIHNvcnRlZCBvdXQgaW4gdGhlIGluZm9ibG9jaworKiogZnVuY3Rpb25zIGFuZCBzZXQgZHVyaW5nIGRlNHg1X21hY19wb3J0KCkgYW5kL29yIGRlNHg1X3Jlc2V0X3BoeSgpLgorKiogVGhpcyByb3V0aW5lIGp1c3QgaGFzIHRvIGZpZ3VyZSBvdXQgd2hldGhlciAxME1iL3Mgb3IgMTAwTWIvcyBpcworKiogYWN0aXZlLgorKiogV2hlbiBhdXRvbmVnb3RpYXRpb24gaXMgd29ya2luZywgdGhlIEFOUyBwYXJ0IHNlYXJjaGVzIHRoZSBTUk9NIGZvcgorKiogdGhlIGhpZ2hlc3QgY29tbW9uIHNwZWVkIChUUCkgbGluayB0aGF0IGJvdGggY2FuIHJ1biBhbmQgaWYgdGhhdCBjYW4KKyoqIGJlIGZ1bGwgZHVwbGV4LiBUaGF0IGluZm9ibG9jayBpcyBleGVjdXRlZCBhbmQgdGhlbiB0aGUgbGluayBzcGVlZCBzZXQuCisqKgorKiogT25seSBfMTBNYiBhbmQgXzEwME1iIGFyZSB0ZXN0ZWQgaGVyZS4KKyovCitzdGF0aWMgaW50CitkYzIxMTR4X2F1dG9jb25mKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgczMyIGNyLCBhbmxwYSwgYW5hLCBjYXAsIGlycXMsIGlycV9tYXNrLCBpbXIsIG9tciwgc2xuaywgc3IsIHN0czsKKyAgICBpbnQgbmV4dF90aWNrID0gREU0WDVfQVVUT1NFTlNFX01TOworCisgICAgc3dpdGNoIChscC0+bWVkaWEpIHsKKyAgICBjYXNlIElOSVQ6CisgICAgICAgIGlmIChscC0+dGltZW91dCA8IDApIHsKKwkgICAgRElTQUJMRV9JUlFzOworCSAgICBscC0+dHhfZW5hYmxlID0gRkFMU0U7CisJICAgIGxwLT5saW5rT0sgPSAwOworICAgICAgICAgICAgbHAtPnRpbWVvdXQgPSAtMTsKKwkgICAgZGU0eDVfc2F2ZV9za2JzKGRldik7ICAgICAgICAgICAgLyogU2F2ZSBub24gdHJhbnNtaXR0ZWQgc2tiJ3MgKi8KKwkgICAgaWYgKGxwLT5wYXJhbXMuYXV0b3NlbnNlICYgfkFVVE8pIHsKKwkJc3JvbV9tYXBfbWVkaWEoZGV2KTsgICAgICAgICAvKiBGaXhlZCBtZWRpYSByZXF1ZXN0ZWQgICAgICAqLworCQlpZiAobHAtPm1lZGlhICE9IGxwLT5wYXJhbXMuYXV0b3NlbnNlKSB7CisJCSAgICBscC0+dGNvdW50Kys7CisJCSAgICBscC0+bWVkaWEgPSBJTklUOworCQkgICAgcmV0dXJuIG5leHRfdGljazsKKwkJfQorCQlscC0+bWVkaWEgPSBJTklUOworCSAgICB9CisJfQorCWlmICgobmV4dF90aWNrID0gZGU0eDVfcmVzZXRfcGh5KGRldikpIDwgMCkgeworCSAgICBuZXh0X3RpY2sgJj0gflRJTUVSX0NCOworCX0gZWxzZSB7CisJICAgIGlmIChscC0+YXV0b3NlbnNlID09IF8xMDBNYikgeworCQlscC0+bWVkaWEgPSBfMTAwTWI7CisJICAgIH0gZWxzZSBpZiAobHAtPmF1dG9zZW5zZSA9PSBfMTBNYikgeworCQlscC0+bWVkaWEgPSBfMTBNYjsKKwkgICAgfSBlbHNlIGlmIChscC0+YXV0b3NlbnNlID09IFRQKSB7CisJCWxwLT5tZWRpYSA9IFRQOworCSAgICB9IGVsc2UgaWYgKGxwLT5hdXRvc2Vuc2UgPT0gQk5DKSB7CisJCWxwLT5tZWRpYSA9IEJOQzsKKwkgICAgfSBlbHNlIGlmIChscC0+YXV0b3NlbnNlID09IEFVSSkgeworCQlscC0+bWVkaWEgPSBBVUk7CisJICAgIH0gZWxzZSB7CisJCWxwLT5tZWRpYSA9IFNQRF9ERVQ7CisJCWlmICgobHAtPmluZm9ibG9ja19tZWRpYSA9PSBBTlMpICYmIAorCQkgICAgICAgICAgICAgICAgICAgICgoc3I9aXNfYW5jX2NhcGFibGUoZGV2KSkgJiBNSUlfU1JfQU5DKSkgeworCQkgICAgYW5hID0gKCgoc3IgPj4gNikgJiBNSUlfQU5BX1RBRikgfCBNSUlfQU5BX0NTTUEpOworCQkgICAgYW5hICY9IChscC0+ZmR4ID8gfjAgOiB+TUlJX0FOQV9GREFNKTsKKwkJICAgIG1paV93cihhbmEsIE1JSV9BTkEsIGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkciwgREU0WDVfTUlJKTsKKwkJICAgIGxwLT5tZWRpYSA9IEFOUzsKKwkJfQorCSAgICB9CisJICAgIGxwLT5sb2NhbF9zdGF0ZSA9IDA7CisJICAgIG5leHRfdGljayA9IGRjMjExNHhfYXV0b2NvbmYoZGV2KTsKKyAgICAgICAgfQorCWJyZWFrOworCQorICAgIGNhc2UgQU5TOgorCXN3aXRjaCAobHAtPmxvY2FsX3N0YXRlKSB7CisJY2FzZSAwOgorCSAgICBpZiAobHAtPnRpbWVvdXQgPCAwKSB7CisJCW1paV93cihNSUlfQ1JfQVNTRSB8IE1JSV9DUl9SQU4sIE1JSV9DUiwgbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLCBERTRYNV9NSUkpOworCSAgICB9CisJICAgIGNyID0gdGVzdF9taWlfcmVnKGRldiwgTUlJX0NSLCBNSUlfQ1JfUkFOLCBGQUxTRSwgNTAwKTsKKwkgICAgaWYgKGNyIDwgMCkgeworCQluZXh0X3RpY2sgPSBjciAmIH5USU1FUl9DQjsKKwkgICAgfSBlbHNlIHsKKwkJaWYgKGNyKSB7CisJCSAgICBscC0+bG9jYWxfc3RhdGUgPSAwOworCQkgICAgbHAtPm1lZGlhID0gU1BEX0RFVDsKKwkJfSBlbHNlIHsKKwkJICAgIGxwLT5sb2NhbF9zdGF0ZSsrOworCQl9CisJCW5leHRfdGljayA9IGRjMjExNHhfYXV0b2NvbmYoZGV2KTsKKwkgICAgfQorCSAgICBicmVhazsKKwkgICAgCisJY2FzZSAxOgorCSAgICBpZiAoKHNyPXRlc3RfbWlpX3JlZyhkZXYsIE1JSV9TUiwgTUlJX1NSX0FTU0MsIFRSVUUsIDIwMDApKSA8IDApIHsKKwkJbmV4dF90aWNrID0gc3IgJiB+VElNRVJfQ0I7CisJICAgIH0gZWxzZSB7CisJCWxwLT5tZWRpYSA9IFNQRF9ERVQ7CisJCWxwLT5sb2NhbF9zdGF0ZSA9IDA7CisJCWlmIChzcikgeyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdWNjZXNzISAqLworCQkgICAgbHAtPnRtcCA9IE1JSV9TUl9BU1NDOworCQkgICAgYW5scGEgPSBtaWlfcmQoTUlJX0FOTFBBLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7CisJCSAgICBhbmEgPSBtaWlfcmQoTUlJX0FOQSwgbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLCBERTRYNV9NSUkpOworCQkgICAgaWYgKCEoYW5scGEgJiBNSUlfQU5MUEFfUkYpICYmIAorCQkJIChjYXAgPSBhbmxwYSAmIE1JSV9BTkxQQV9UQUYgJiBhbmEpKSB7CisJCQlpZiAoY2FwICYgTUlJX0FOQV8xMDBNKSB7CisJCQkgICAgbHAtPmZkeCA9ICgoYW5hICYgYW5scGEgJiBNSUlfQU5BX0ZEQU0gJiBNSUlfQU5BXzEwME0pID8gVFJVRSA6IEZBTFNFKTsKKwkJCSAgICBscC0+bWVkaWEgPSBfMTAwTWI7CisJCQl9IGVsc2UgaWYgKGNhcCAmIE1JSV9BTkFfMTBNKSB7CisJCQkgICAgbHAtPmZkeCA9ICgoYW5hICYgYW5scGEgJiBNSUlfQU5BX0ZEQU0gJiBNSUlfQU5BXzEwTSkgPyBUUlVFIDogRkFMU0UpOworCQkJICAgIGxwLT5tZWRpYSA9IF8xME1iOworCQkJfQorCQkgICAgfQorCQl9ICAgICAgICAgICAgICAgICAgICAgICAvKiBBdXRvIE5lZ290aWF0aW9uIGZhaWxlZCB0byBmaW5pc2ggKi8KKwkJbmV4dF90aWNrID0gZGMyMTE0eF9hdXRvY29uZihkZXYpOworCSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXV0byBOZWdvdGlhdGlvbiBmYWlsZWQgdG8gc3RhcnQgICovCisJICAgIGJyZWFrOworCX0KKwlicmVhazsKKworICAgIGNhc2UgQVVJOgorCWlmICghbHAtPnR4X2VuYWJsZSkgeworCSAgICBpZiAobHAtPnRpbWVvdXQgPCAwKSB7CisJCW9tciA9IGlubChERTRYNV9PTVIpOyAgIC8qIFNldCB1cCBoYWxmIGR1cGxleCBmb3IgQVVJICAgICAgICAqLworCQlvdXRsKG9tciAmIH5PTVJfRkRYLCBERTRYNV9PTVIpOworCSAgICB9CisJICAgIGlycXMgPSAwOworCSAgICBpcnFfbWFzayA9IDA7CisJICAgIHN0cyA9IHRlc3RfbWVkaWEoZGV2LGlycXMsIGlycV9tYXNrLCAwLCAwLCAwLCAxMDAwKTsKKwkgICAgaWYgKHN0cyA8IDApIHsKKwkJbmV4dF90aWNrID0gc3RzICYgflRJTUVSX0NCOworCSAgICB9IGVsc2UgeworCQlpZiAoIShpbmwoREU0WDVfU0lTUikgJiBTSVNSX1NSQSkgJiYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykpIHsKKwkJICAgIGxwLT5tZWRpYSA9IEJOQzsKKwkJICAgIG5leHRfdGljayA9IGRjMjExNHhfYXV0b2NvbmYoZGV2KTsKKwkJfSBlbHNlIHsKKwkJICAgIGxwLT5sb2NhbF9zdGF0ZSA9IDE7CisJCSAgICBkZTR4NV9pbml0X2Nvbm5lY3Rpb24oZGV2KTsKKwkJfQorCSAgICB9CisJfSBlbHNlIGlmICghbHAtPmxpbmtPSyAmJiAobHAtPmF1dG9zZW5zZSA9PSBBVVRPKSkgeworCSAgICBscC0+bWVkaWEgPSBBVUlfU1VTUEVDVDsKKwkgICAgbmV4dF90aWNrID0gMzAwMDsKKwl9CisJYnJlYWs7CisJCisgICAgY2FzZSBBVUlfU1VTUEVDVDoKKwluZXh0X3RpY2sgPSBkZTR4NV9zdXNwZWN0X3N0YXRlKGRldiwgMTAwMCwgQVVJLCBwaW5nX21lZGlhLCBkYzIxMTR4X2F1dG9jb25mKTsKKwlicmVhazsKKwkKKyAgICBjYXNlIEJOQzoKKwlzd2l0Y2ggKGxwLT5sb2NhbF9zdGF0ZSkgeworCWNhc2UgMDoKKwkgICAgaWYgKGxwLT50aW1lb3V0IDwgMCkgeworCQlvbXIgPSBpbmwoREU0WDVfT01SKTsgICAgICAgICAgLyogU2V0IHVwIGhhbGYgZHVwbGV4IGZvciBCTkMgKi8KKwkJb3V0bChvbXIgJiB+T01SX0ZEWCwgREU0WDVfT01SKTsKKwkgICAgfQorCSAgICBpcnFzID0gMDsKKwkgICAgaXJxX21hc2sgPSAwOworCSAgICBzdHMgPSB0ZXN0X21lZGlhKGRldixpcnFzLCBpcnFfbWFzaywgMCwgMCwgMCwgMTAwMCk7CisJICAgIGlmIChzdHMgPCAwKSB7CisJCW5leHRfdGljayA9IHN0cyAmIH5USU1FUl9DQjsKKwkgICAgfSBlbHNlIHsKKwkJbHAtPmxvY2FsX3N0YXRlKys7ICAgICAgICAgICAgIC8qIEVuc3VyZSBtZWRpYSBjb25uZWN0ZWQgKi8KKwkJbmV4dF90aWNrID0gZGMyMTE0eF9hdXRvY29uZihkZXYpOworCSAgICB9CisJICAgIGJyZWFrOworCSAgICAKKwljYXNlIDE6CisJICAgIGlmICghbHAtPnR4X2VuYWJsZSkgeworCQlpZiAoKHN0cyA9IHBpbmdfbWVkaWEoZGV2LCAzMDAwKSkgPCAwKSB7CisJCSAgICBuZXh0X3RpY2sgPSBzdHMgJiB+VElNRVJfQ0I7CisJCX0gZWxzZSB7CisJCSAgICBpZiAoc3RzKSB7CisJCQlscC0+bG9jYWxfc3RhdGUgPSAwOworCQkJbHAtPnRjb3VudCsrOworCQkJbHAtPm1lZGlhID0gSU5JVDsKKwkJICAgIH0gZWxzZSB7CisJCQlkZTR4NV9pbml0X2Nvbm5lY3Rpb24oZGV2KTsKKwkJICAgIH0KKwkJfQorCSAgICB9IGVsc2UgaWYgKCFscC0+bGlua09LICYmIChscC0+YXV0b3NlbnNlID09IEFVVE8pKSB7CisJCWxwLT5tZWRpYSA9IEJOQ19TVVNQRUNUOworCQluZXh0X3RpY2sgPSAzMDAwOworCSAgICB9CisJICAgIGJyZWFrOworCX0KKwlicmVhazsKKwkKKyAgICBjYXNlIEJOQ19TVVNQRUNUOgorCW5leHRfdGljayA9IGRlNHg1X3N1c3BlY3Rfc3RhdGUoZGV2LCAxMDAwLCBCTkMsIHBpbmdfbWVkaWEsIGRjMjExNHhfYXV0b2NvbmYpOworCWJyZWFrOworCQorICAgIGNhc2UgU1BEX0RFVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaG9vc2UgMTBNYi9zIG9yIDEwME1iL3MgKi8KKwkgIGlmIChzcm9tX21hcF9tZWRpYShkZXYpIDwgMCkgeworCSAgICAgIGxwLT50Y291bnQrKzsKKwkgICAgICBscC0+bWVkaWEgPSBJTklUOworCSAgICAgIHJldHVybiBuZXh0X3RpY2s7CisJICB9CisJICBpZiAobHAtPm1lZGlhID09IF8xMDBNYikgeworCSAgICAgIGlmICgoc2xuayA9IHRlc3RfZm9yXzEwME1iKGRldiwgNjUwMCkpIDwgMCkgeworCQkgIGxwLT5tZWRpYSA9IFNQRF9ERVQ7CisJCSAgcmV0dXJuICAoc2xuayAmIH5USU1FUl9DQik7CisJICAgICAgfQorCSAgfSBlbHNlIHsKKwkgICAgICBpZiAod2FpdF9mb3JfbGluayhkZXYpIDwgMCkgeworCQkgIGxwLT5tZWRpYSA9IFNQRF9ERVQ7CisJCSAgcmV0dXJuIFBERVRfTElOS19XQUlUOworCSAgICAgIH0KKwkgIH0KKwkgIGlmIChscC0+bWVkaWEgPT0gQU5TKSB7ICAgICAgICAgICAvKiBEbyBNSUkgcGFyYWxsZWwgZGV0ZWN0aW9uICovCisJICAgICAgaWYgKGlzX3NwZF8xMDAoZGV2KSkgeworCQkgIGxwLT5tZWRpYSA9IF8xMDBNYjsKKwkgICAgICB9IGVsc2UgeworCQkgIGxwLT5tZWRpYSA9IF8xME1iOworCSAgICAgIH0KKwkgICAgICBuZXh0X3RpY2sgPSBkYzIxMTR4X2F1dG9jb25mKGRldik7CisJICB9IGVsc2UgaWYgKCgobHAtPm1lZGlhID09IF8xMDBNYikgJiYgaXNfMTAwX3VwKGRldikpIHx8CisJCSAgICAgKCgobHAtPm1lZGlhID09IF8xME1iKSB8fCAobHAtPm1lZGlhID09IFRQKSB8fAorCQkgICAgICAgKGxwLT5tZWRpYSA9PSBCTkMpICAgfHwgKGxwLT5tZWRpYSA9PSBBVUkpKSAmJiAKKwkJICAgICAgaXNfMTBfdXAoZGV2KSkpIHsKKwkgICAgICBuZXh0X3RpY2sgPSBkYzIxMTR4X2F1dG9jb25mKGRldik7CisJICB9IGVsc2UgeworCSAgICAgIGxwLT50Y291bnQrKzsKKwkgICAgICBscC0+bWVkaWEgPSBJTklUOworCSAgfQorCSAgYnJlYWs7CisJCisgICAgY2FzZSBfMTBNYjoKKyAgICAgICAgbmV4dF90aWNrID0gMzAwMDsKKwlpZiAoIWxwLT50eF9lbmFibGUpIHsKKwkgICAgU0VUXzEwTWI7CisJICAgIGRlNHg1X2luaXRfY29ubmVjdGlvbihkZXYpOworCX0gZWxzZSB7CisJICAgIGlmICghbHAtPmxpbmtPSyAmJiAobHAtPmF1dG9zZW5zZSA9PSBBVVRPKSkgeworCQlpZiAoIWlzXzEwX3VwKGRldikgfHwgKCFscC0+dXNlU1JPTSAmJiBpc19zcGRfMTAwKGRldikpKSB7CisJCSAgICBscC0+bWVkaWEgPSBJTklUOworCQkgICAgbHAtPnRjb3VudCsrOworCQkgICAgbmV4dF90aWNrID0gREU0WDVfQVVUT1NFTlNFX01TOworCQl9CisJICAgIH0KKwl9CisJYnJlYWs7CisKKyAgICBjYXNlIF8xMDBNYjoKKyAgICAgICAgbmV4dF90aWNrID0gMzAwMDsKKwlpZiAoIWxwLT50eF9lbmFibGUpIHsKKwkgICAgU0VUXzEwME1iOworCSAgICBkZTR4NV9pbml0X2Nvbm5lY3Rpb24oZGV2KTsKKwl9IGVsc2UgeworCSAgICBpZiAoIWxwLT5saW5rT0sgJiYgKGxwLT5hdXRvc2Vuc2UgPT0gQVVUTykpIHsKKwkJaWYgKCFpc18xMDBfdXAoZGV2KSB8fCAoIWxwLT51c2VTUk9NICYmICFpc19zcGRfMTAwKGRldikpKSB7CisJCSAgICBscC0+bWVkaWEgPSBJTklUOworCQkgICAgbHAtPnRjb3VudCsrOworCQkgICAgbmV4dF90aWNrID0gREU0WDVfQVVUT1NFTlNFX01TOworCQl9CisJICAgIH0KKwl9CisJYnJlYWs7CisKKyAgICBkZWZhdWx0OgorCWxwLT50Y291bnQrKzsKK3ByaW50aygiSHVoPzogbWVkaWE6JTAyeFxuIiwgbHAtPm1lZGlhKTsKKwlscC0+bWVkaWEgPSBJTklUOworCWJyZWFrOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gbmV4dF90aWNrOworfQorCitzdGF0aWMgaW50Citzcm9tX2F1dG9jb25mKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgIHJldHVybiBscC0+aW5mb2xlYWZfZm4oZGV2KTsKK30KKworLyoKKyoqIFRoaXMgbWFwcGluZyBrZWVwcyB0aGUgb3JpZ2luYWwgbWVkaWEgY29kZXMgYW5kIEZEWCBmbGFnIHVuY2hhbmdlZC4KKyoqIFdoaWxlIGl0IGlzbid0IHN0cmljdGx5IG5lY2Vzc2FyeSwgaXQgaGVscHMgbWUgZm9yIHRoZSBtb21lbnQuLi4KKyoqIFRoZSBlYXJseSByZXR1cm4gYXZvaWRzIGEgbWVkaWEgc3RhdGUgLyBTUk9NIG1lZGlhIHNwYWNlIGNsYXNoLgorKi8KK3N0YXRpYyBpbnQKK3Nyb21fbWFwX21lZGlhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgIGxwLT5mZHggPSAwOworICAgIGlmIChscC0+aW5mb2Jsb2NrX21lZGlhID09IGxwLT5tZWRpYSkgCisgICAgICByZXR1cm4gMDsKKworICAgIHN3aXRjaChscC0+aW5mb2Jsb2NrX21lZGlhKSB7CisgICAgICBjYXNlIFNST01fMTBCQVNFVEY6CisJaWYgKCFscC0+cGFyYW1zLmZkeCkgcmV0dXJuIC0xOworCWxwLT5mZHggPSBUUlVFOworICAgICAgY2FzZSBTUk9NXzEwQkFTRVQ6CisJaWYgKGxwLT5wYXJhbXMuZmR4ICYmICFscC0+ZmR4KSByZXR1cm4gLTE7CisJaWYgKChscC0+Y2hpcHNldCA9PSBEQzIxMTQwKSB8fCAoKGxwLT5jaGlwc2V0ICYgfjB4MDBmZikgPT0gREMyMTE0eCkpIHsKKwkgICAgbHAtPm1lZGlhID0gXzEwTWI7CisJfSBlbHNlIHsKKwkgICAgbHAtPm1lZGlhID0gVFA7CisJfQorCWJyZWFrOworCisgICAgICBjYXNlIFNST01fMTBCQVNFMjoKKwlscC0+bWVkaWEgPSBCTkM7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgU1JPTV8xMEJBU0U1OgorCWxwLT5tZWRpYSA9IEFVSTsKKwlicmVhazsKKworICAgICAgY2FzZSBTUk9NXzEwMEJBU0VURjoKKyAgICAgICAgaWYgKCFscC0+cGFyYW1zLmZkeCkgcmV0dXJuIC0xOworCWxwLT5mZHggPSBUUlVFOworICAgICAgY2FzZSBTUk9NXzEwMEJBU0VUOgorCWlmIChscC0+cGFyYW1zLmZkeCAmJiAhbHAtPmZkeCkgcmV0dXJuIC0xOworCWxwLT5tZWRpYSA9IF8xMDBNYjsKKwlicmVhazsKKworICAgICAgY2FzZSBTUk9NXzEwMEJBU0VUNDoKKwlscC0+bWVkaWEgPSBfMTAwTWI7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgU1JPTV8xMDBCQVNFRkY6CisJaWYgKCFscC0+cGFyYW1zLmZkeCkgcmV0dXJuIC0xOworCWxwLT5mZHggPSBUUlVFOworICAgICAgY2FzZSBTUk9NXzEwMEJBU0VGOiAKKwlpZiAobHAtPnBhcmFtcy5mZHggJiYgIWxwLT5mZHgpIHJldHVybiAtMTsKKwlscC0+bWVkaWEgPSBfMTAwTWI7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgQU5TOgorCWxwLT5tZWRpYSA9IEFOUzsKKwlscC0+ZmR4ID0gbHAtPnBhcmFtcy5mZHg7CisJYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6IAorCXByaW50aygiJXM6IEJhZCBtZWRpYSBjb2RlIFslZF0gZGV0ZWN0ZWQgaW4gU1JPTSFcbiIsIGRldi0+bmFtZSwgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+aW5mb2Jsb2NrX21lZGlhKTsKKwlyZXR1cm4gLTE7CisJYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitkZTR4NV9pbml0X2Nvbm5lY3Rpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB1X2xvbmcgZmxhZ3MgPSAwOworCisgICAgaWYgKGxwLT5tZWRpYSAhPSBscC0+Y19tZWRpYSkgeworICAgICAgICBkZTR4NV9kYmdfbWVkaWEoZGV2KTsKKwlscC0+Y19tZWRpYSA9IGxwLT5tZWRpYTsgICAgICAgICAgLyogU3RvcCBzY3JvbGxpbmcgbWVkaWEgbWVzc2FnZXMgKi8KKyAgICB9CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICBkZTR4NV9yc3RfZGVzY19yaW5nKGRldik7CisgICAgZGU0eDVfc2V0dXBfaW50cihkZXYpOworICAgIGxwLT50eF9lbmFibGUgPSBZRVM7CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKyAgICBvdXRsKFBPTExfREVNQU5ELCBERTRYNV9UUEQpOworCisgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisgICAgcmV0dXJuOworfQorCisvKgorKiogR2VuZXJhbCBQSFkgcmVzZXQgZnVuY3Rpb24uIFNvbWUgTUlJIGRldmljZXMgZG9uJ3QgcmVzZXQgY29ycmVjdGx5CisqKiBzaW5jZSB0aGVpciBNSUkgYWRkcmVzcyBwaW5zIGNhbiBmbG9hdCBhdCB2b2x0YWdlcyB0aGF0IGFyZSBkZXBlbmRlbnQKKyoqIG9uIHRoZSBzaWduYWwgcGluIHVzZS4gRG8gYSBkb3VibGUgcmVzZXQgdG8gZW5zdXJlIGEgcmVzZXQuCisqLworc3RhdGljIGludAorZGU0eDVfcmVzZXRfcGh5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IG5leHRfdGljayA9IDA7CisKKyAgICBpZiAoKGxwLT51c2VTUk9NKSB8fCAobHAtPnBoeVtscC0+YWN0aXZlXS5pZCkpIHsKKwlpZiAobHAtPnRpbWVvdXQgPCAwKSB7CisJICAgIGlmIChscC0+dXNlU1JPTSkgeworCQlpZiAobHAtPnBoeVtscC0+YWN0aXZlXS5yc3QpIHsKKwkJICAgIHNyb21fZXhlYyhkZXYsIGxwLT5waHlbbHAtPmFjdGl2ZV0ucnN0KTsKKwkJICAgIHNyb21fZXhlYyhkZXYsIGxwLT5waHlbbHAtPmFjdGl2ZV0ucnN0KTsKKwkJfSBlbHNlIGlmIChscC0+cnN0KSB7ICAgICAgICAgIC8qIFR5cGUgNSBpbmZvYmxvY2sgcmVzZXQgKi8KKwkJICAgIHNyb21fZXhlYyhkZXYsIGxwLT5yc3QpOworCQkgICAgc3JvbV9leGVjKGRldiwgbHAtPnJzdCk7CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJUEhZX0hBUkRfUkVTRVQ7CisJICAgIH0KKwkgICAgaWYgKGxwLT51c2VNSUkpIHsKKwkgICAgICAgIG1paV93cihNSUlfQ1JfUlNULCBNSUlfQ1IsIGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkciwgREU0WDVfTUlJKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCWlmIChscC0+dXNlTUlJKSB7CisJICAgIG5leHRfdGljayA9IHRlc3RfbWlpX3JlZyhkZXYsIE1JSV9DUiwgTUlJX0NSX1JTVCwgRkFMU0UsIDUwMCk7CisJfQorICAgIH0gZWxzZSBpZiAobHAtPmNoaXBzZXQgPT0gREMyMTE0MCkgeworCVBIWV9IQVJEX1JFU0VUOworICAgIH0KKworICAgIHJldHVybiBuZXh0X3RpY2s7Cit9CisKK3N0YXRpYyBpbnQKK3Rlc3RfbWVkaWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgczMyIGlycXMsIHMzMiBpcnFfbWFzaywgczMyIGNzcjEzLCBzMzIgY3NyMTQsIHMzMiBjc3IxNSwgczMyIG1zZWMpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgczMyIHN0cywgY3NyMTI7CisgICAgCisgICAgaWYgKGxwLT50aW1lb3V0IDwgMCkgeworCWxwLT50aW1lb3V0ID0gbXNlYy8xMDA7CisJaWYgKCFscC0+dXNlU1JPTSkgeyAgICAgIC8qIEFscmVhZHkgZG9uZSBpZiBieSBTUk9NLCBlbHNlIGRjMjEwNFswMV0gKi8KKwkgICAgcmVzZXRfaW5pdF9zaWEoZGV2LCBjc3IxMywgY3NyMTQsIGNzcjE1KTsKKwl9CisKKwkvKiBzZXQgdXAgdGhlIGludGVycnVwdCBtYXNrICovCisJb3V0bChpcnFfbWFzaywgREU0WDVfSU1SKTsKKworCS8qIGNsZWFyIGFsbCBwZW5kaW5nIGludGVycnVwdHMgKi8KKwlzdHMgPSBpbmwoREU0WDVfU1RTKTsKKwlvdXRsKHN0cywgREU0WDVfU1RTKTsKKwkKKwkvKiBjbGVhciBjc3IxMiBOUkEgYW5kIFNSQSBiaXRzICovCisJaWYgKChscC0+Y2hpcHNldCA9PSBEQzIxMDQxKSB8fCBscC0+dXNlU1JPTSkgeworCSAgICBjc3IxMiA9IGlubChERTRYNV9TSVNSKTsKKwkgICAgb3V0bChjc3IxMiwgREU0WDVfU0lTUik7CisJfQorICAgIH0KKyAgICAKKyAgICBzdHMgPSBpbmwoREU0WDVfU1RTKSAmIH5USU1FUl9DQjsKKyAgICAKKyAgICBpZiAoIShzdHMgJiBpcnFzKSAmJiAtLWxwLT50aW1lb3V0KSB7CisJc3RzID0gMTAwIHwgVElNRVJfQ0I7CisgICAgfSBlbHNlIHsKKwlscC0+dGltZW91dCA9IC0xOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc3RzOworfQorCitzdGF0aWMgaW50Cit0ZXN0X3RwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHMzMiBtc2VjKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBzaXNyOworICAgIAorICAgIGlmIChscC0+dGltZW91dCA8IDApIHsKKwlscC0+dGltZW91dCA9IG1zZWMvMTAwOworICAgIH0KKyAgICAKKyAgICBzaXNyID0gKGlubChERTRYNV9TSVNSKSAmIH5USU1FUl9DQikgJiAoU0lTUl9MS0YgfCBTSVNSX05DUik7CisKKyAgICBpZiAoc2lzciAmJiAtLWxwLT50aW1lb3V0KSB7CisJc2lzciA9IDEwMCB8IFRJTUVSX0NCOworICAgIH0gZWxzZSB7CisJbHAtPnRpbWVvdXQgPSAtMTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHNpc3I7Cit9CisKKy8qCisqKiBTYW1wbGVzIHRoZSAxMDBNYiBMaW5rIFN0YXRlIFNpZ25hbC4gVGhlIHNhbXBsZSBpbnRlcnZhbCBpcyBpbXBvcnRhbnQKKyoqIGJlY2F1c2UgdG9vIGZhc3QgYSByYXRlIGNhbiBnaXZlIGVycm9uZW91cyByZXN1bHRzIGFuZCBjb25mdXNlIHRoZQorKiogc3BlZWQgc2Vuc2UgYWxnb3JpdGhtLgorKi8KKyNkZWZpbmUgU0FNUExFX0lOVEVSVkFMIDUwMCAgLyogbXMgKi8KKyNkZWZpbmUgU0FNUExFX0RFTEFZICAgIDIwMDAgLyogbXMgKi8KK3N0YXRpYyBpbnQKK3Rlc3RfZm9yXzEwME1iKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtc2VjKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IGdlcCA9IDAsIHJldCA9ICgobHAtPmNoaXBzZXQgJiB+MHgwMGZmKT09REMyMTE0eD8gLTEgOkdFUF9TTE5LKTsKKworICAgIGlmIChscC0+dGltZW91dCA8IDApIHsKKwlpZiAoKG1zZWMvU0FNUExFX0lOVEVSVkFMKSA8PSAwKSByZXR1cm4gMDsKKwlpZiAobXNlYyA+IFNBTVBMRV9ERUxBWSkgeworCSAgICBscC0+dGltZW91dCA9IChtc2VjIC0gU0FNUExFX0RFTEFZKS9TQU1QTEVfSU5URVJWQUw7CisJICAgIGdlcCA9IFNBTVBMRV9ERUxBWSB8IFRJTUVSX0NCOworCSAgICByZXR1cm4gZ2VwOworCX0gZWxzZSB7CisJICAgIGxwLT50aW1lb3V0ID0gbXNlYy9TQU1QTEVfSU5URVJWQUw7CisJfQorICAgIH0KKyAgICAKKyAgICBpZiAobHAtPnBoeVtscC0+YWN0aXZlXS5pZCB8fCBscC0+dXNlU1JPTSkgeworCWdlcCA9IGlzXzEwMF91cChkZXYpIHwgaXNfc3BkXzEwMChkZXYpOworICAgIH0gZWxzZSB7CisJZ2VwID0gKH5nZXBfcmQoZGV2KSAmIChHRVBfU0xOSyB8IEdFUF9MTlApKTsKKyAgICB9CisgICAgaWYgKCEoZ2VwICYgcmV0KSAmJiAtLWxwLT50aW1lb3V0KSB7CisJZ2VwID0gU0FNUExFX0lOVEVSVkFMIHwgVElNRVJfQ0I7CisgICAgfSBlbHNlIHsKKwlscC0+dGltZW91dCA9IC0xOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gZ2VwOworfQorCitzdGF0aWMgaW50Cit3YWl0X2Zvcl9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgIGlmIChscC0+dGltZW91dCA8IDApIHsKKwlscC0+dGltZW91dCA9IDE7CisgICAgfQorICAgIAorICAgIGlmIChscC0+dGltZW91dC0tKSB7CisJcmV0dXJuIFRJTUVSX0NCOworICAgIH0gZWxzZSB7CisJbHAtPnRpbWVvdXQgPSAtMTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisqKgorKioKKyovCitzdGF0aWMgaW50Cit0ZXN0X21paV9yZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJlZywgaW50IG1hc2ssIGludCBwb2wsIGxvbmcgbXNlYykKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGludCB0ZXN0OworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAKKyAgICBpZiAobHAtPnRpbWVvdXQgPCAwKSB7CisJbHAtPnRpbWVvdXQgPSBtc2VjLzEwMDsKKyAgICB9CisgICAgCisgICAgaWYgKHBvbCkgcG9sID0gfjA7CisgICAgcmVnID0gbWlpX3JkKCh1X2NoYXIpcmVnLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSkgJiBtYXNrOworICAgIHRlc3QgPSAocmVnIF4gcG9sKSAmIG1hc2s7CisgICAgCisgICAgaWYgKHRlc3QgJiYgLS1scC0+dGltZW91dCkgeworCXJlZyA9IDEwMCB8IFRJTUVSX0NCOworICAgIH0gZWxzZSB7CisJbHAtPnRpbWVvdXQgPSAtMTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJlZzsKK30KKworc3RhdGljIGludAoraXNfc3BkXzEwMChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBzcGQ7CisgICAgCisgICAgaWYgKGxwLT51c2VNSUkpIHsKKwlzcGQgPSBtaWlfcmQobHAtPnBoeVtscC0+YWN0aXZlXS5zcGQucmVnLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7CisJc3BkID0gfihzcGQgXiBscC0+cGh5W2xwLT5hY3RpdmVdLnNwZC52YWx1ZSk7CisJc3BkICY9IGxwLT5waHlbbHAtPmFjdGl2ZV0uc3BkLm1hc2s7CisgICAgfSBlbHNlIGlmICghbHAtPnVzZVNST00pIHsgICAgICAgICAgICAgICAgICAgICAgLyogZGU1MDAteGEgKi8KKwlzcGQgPSAoKH5nZXBfcmQoZGV2KSkgJiBHRVBfU0xOSyk7CisgICAgfSBlbHNlIHsKKwlpZiAoKGxwLT5pYm4gPT0gMikgfHwgIWxwLT5hc0JpdFZhbGlkKQorCSAgICByZXR1cm4gKChscC0+Y2hpcHNldCA9PSBEQzIxMTQzKT8ofmlubChERTRYNV9TSVNSKSZTSVNSX0xTMTAwKTowKTsKKworCXNwZCA9IChscC0+YXNCaXRWYWxpZCAmIChscC0+YXNQb2xhcml0eSBeIChnZXBfcmQoZGV2KSAmIGxwLT5hc0JpdCkpKSB8CisJICAgICAgICAgIChscC0+bGlua09LICYgfmxwLT5hc0JpdFZhbGlkKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHNwZDsKK30KKworc3RhdGljIGludAoraXNfMTAwX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgCisgICAgaWYgKGxwLT51c2VNSUkpIHsKKwkvKiBEb3VibGUgcmVhZCBmb3Igc3RpY2t5IGJpdHMgJiB0ZW1wb3JhcnkgZHJvcHMgKi8KKwltaWlfcmQoTUlJX1NSLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7CisJcmV0dXJuIChtaWlfcmQoTUlJX1NSLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSkgJiBNSUlfU1JfTEtTKTsKKyAgICB9IGVsc2UgaWYgKCFscC0+dXNlU1JPTSkgeyAgICAgICAgICAgICAgICAgICAgICAgLyogZGU1MDAteGEgKi8KKwlyZXR1cm4gKCh+Z2VwX3JkKGRldikpICYgR0VQX1NMTkspOworICAgIH0gZWxzZSB7CisJaWYgKChscC0+aWJuID09IDIpIHx8ICFscC0+YXNCaXRWYWxpZCkKKwkgICAgcmV0dXJuICgobHAtPmNoaXBzZXQgPT0gREMyMTE0Myk/KH5pbmwoREU0WDVfU0lTUikmU0lTUl9MUzEwMCk6MCk7CisKKyAgICAgICAgcmV0dXJuICgobHAtPmFzQml0VmFsaWQmKGxwLT5hc1BvbGFyaXR5XihnZXBfcmQoZGV2KSZscC0+YXNCaXQpKSkgfAorCQkobHAtPmxpbmtPSyAmIH5scC0+YXNCaXRWYWxpZCkpOworICAgIH0KK30KKworc3RhdGljIGludAoraXNfMTBfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAKKyAgICBpZiAobHAtPnVzZU1JSSkgeworCS8qIERvdWJsZSByZWFkIGZvciBzdGlja3kgYml0cyAmIHRlbXBvcmFyeSBkcm9wcyAqLworCW1paV9yZChNSUlfU1IsIGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkciwgREU0WDVfTUlJKTsKKwlyZXR1cm4gKG1paV9yZChNSUlfU1IsIGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkciwgREU0WDVfTUlJKSAmIE1JSV9TUl9MS1MpOworICAgIH0gZWxzZSBpZiAoIWxwLT51c2VTUk9NKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBkZTUwMC14YSAqLworCXJldHVybiAoKH5nZXBfcmQoZGV2KSkgJiBHRVBfTE5QKTsKKyAgICB9IGVsc2UgeworCWlmICgobHAtPmlibiA9PSAyKSB8fCAhbHAtPmFzQml0VmFsaWQpCisJICAgIHJldHVybiAoKChscC0+Y2hpcHNldCAmIH4weDAwZmYpID09IERDMjExNHgpID8KKwkJICAgICh+aW5sKERFNFg1X1NJU1IpJlNJU1JfTFMxMCk6CisJCSAgICAwKTsKKworCXJldHVybiAoKGxwLT5hc0JpdFZhbGlkJihscC0+YXNQb2xhcml0eV4oZ2VwX3JkKGRldikmbHAtPmFzQml0KSkpIHwKKwkJKGxwLT5saW5rT0sgJiB+bHAtPmFzQml0VmFsaWQpKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK2lzX2FuY19jYXBhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgCisgICAgaWYgKGxwLT5waHlbbHAtPmFjdGl2ZV0uaWQgJiYgKCFscC0+dXNlU1JPTSB8fCBscC0+dXNlTUlJKSkgeworCXJldHVybiAobWlpX3JkKE1JSV9TUiwgbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLCBERTRYNV9NSUkpKTsKKyAgICB9IGVsc2UgaWYgKChscC0+Y2hpcHNldCAmIH4weDAwZmYpID09IERDMjExNHgpIHsKKwlyZXR1cm4gKGlubChERTRYNV9TSVNSKSAmIFNJU1JfTFBOKSA+PiAxMjsKKyAgICB9IGVsc2UgeworCXJldHVybiAwOworICAgIH0KK30KKworLyoKKyoqIFNlbmQgYSBwYWNrZXQgb250byB0aGUgbWVkaWEgYW5kIHdhdGNoIGZvciBzZW5kIGVycm9ycyB0aGF0IGluZGljYXRlIHRoZQorKiogbWVkaWEgaXMgYmFkIG9yIHVuY29ubmVjdGVkLgorKi8KK3N0YXRpYyBpbnQKK3BpbmdfbWVkaWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1zZWMpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgaW50IHNpc3I7CisgICAgCisgICAgaWYgKGxwLT50aW1lb3V0IDwgMCkgeworCWxwLT50aW1lb3V0ID0gbXNlYy8xMDA7CisJCisJbHAtPnRtcCA9IGxwLT50eF9uZXc7ICAgICAgICAgICAgICAgIC8qIFJlbWVtYmVyIHRoZSByaW5nIHBvc2l0aW9uICovCisJbG9hZF9wYWNrZXQoZGV2LCBscC0+ZnJhbWUsIFREX0xTIHwgVERfRlMgfCBzaXplb2YobHAtPmZyYW1lKSwgKHN0cnVjdCBza19idWZmICopMSk7CisJbHAtPnR4X25ldyA9ICgrK2xwLT50eF9uZXcpICUgbHAtPnR4UmluZ1NpemU7CisJb3V0bChQT0xMX0RFTUFORCwgREU0WDVfVFBEKTsKKyAgICB9CisgICAgCisgICAgc2lzciA9IGlubChERTRYNV9TSVNSKTsKKworICAgIGlmICgoIShzaXNyICYgU0lTUl9OQ1IpKSAmJiAKKwkoKHMzMilsZTMyX3RvX2NwdShscC0+dHhfcmluZ1tscC0+dG1wXS5zdGF0dXMpIDwgMCkgJiYgCisJICgtLWxwLT50aW1lb3V0KSkgeworCXNpc3IgPSAxMDAgfCBUSU1FUl9DQjsKKyAgICB9IGVsc2UgeworCWlmICgoIShzaXNyICYgU0lTUl9OQ1IpKSAmJiAKKwkgICAgIShsZTMyX3RvX2NwdShscC0+dHhfcmluZ1tscC0+dG1wXS5zdGF0dXMpICYgKFRfT1dOIHwgVERfRVMpKSAmJgorCSAgICBscC0+dGltZW91dCkgeworCSAgICBzaXNyID0gMDsKKwl9IGVsc2UgeworCSAgICBzaXNyID0gMTsKKwl9CisJbHAtPnRpbWVvdXQgPSAtMTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHNpc3I7Cit9CisKKy8qCisqKiBUaGlzIGZ1bmN0aW9uIGRvZXMgMiB0aGluZ3M6IG9uIEludGVscyBpdCBrbWFsbG9jJ3MgYW5vdGhlciBidWZmZXIgdG8KKyoqIHJlcGxhY2UgdGhlIG9uZSBhYm91dCB0byBiZSBwYXNzZWQgdXAuIE9uIEFscGhhJ3MgaXQga21hbGxvY3MgYSBidWZmZXIKKyoqIGludG8gd2hpY2ggdGhlIHBhY2tldCBpcyBjb3BpZWQuCisqLworc3RhdGljIHN0cnVjdCBza19idWZmICoKK2RlNHg1X2FsbG9jX3J4X2J1ZmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluZGV4LCBpbnQgbGVuKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgc3RydWN0IHNrX2J1ZmYgKnA7CisKKyNpZiAhZGVmaW5lZChfX2FscGhhX18pICYmICFkZWZpbmVkKF9fcG93ZXJwY19fKSAmJiAhZGVmaW5lZChfX3NwYXJjX3Y5X18pICYmICFkZWZpbmVkKERFNFg1X0RPX01FTUNQWSkKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAqcmV0OworICAgIHVfbG9uZyBpPTAsIHRtcDsKKworICAgIHAgPSBkZXZfYWxsb2Nfc2tiKElFRUU4MDJfM19TWiArIERFNFg1X0FMSUdOICsgMik7CisgICAgaWYgKCFwKSByZXR1cm4gTlVMTDsKKworICAgIHAtPmRldiA9IGRldjsKKyAgICB0bXAgPSB2aXJ0X3RvX2J1cyhwLT5kYXRhKTsKKyAgICBpID0gKCh0bXAgKyBERTRYNV9BTElHTikgJiB+REU0WDVfQUxJR04pIC0gdG1wOworICAgIHNrYl9yZXNlcnZlKHAsIGkpOworICAgIGxwLT5yeF9yaW5nW2luZGV4XS5idWYgPSBjcHVfdG9fbGUzMih0bXAgKyBpKTsKKworICAgIHJldCA9IGxwLT5yeF9za2JbaW5kZXhdOworICAgIGxwLT5yeF9za2JbaW5kZXhdID0gcDsKKworICAgIGlmICgodV9sb25nKSByZXQgPiAxKSB7CisJc2tiX3B1dChyZXQsIGxlbik7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKworI2Vsc2UKKyAgICBpZiAobHAtPnN0YXRlICE9IE9QRU4pIHJldHVybiAoc3RydWN0IHNrX2J1ZmYgKikxOyAvKiBGYWtlIG91dCB0aGUgb3BlbiAqLworCisgICAgcCA9IGRldl9hbGxvY19za2IobGVuICsgMik7CisgICAgaWYgKCFwKSByZXR1cm4gTlVMTDsKKworICAgIHAtPmRldiA9IGRldjsKKyAgICBza2JfcmVzZXJ2ZShwLCAyKTsJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsaWduICovCisgICAgaWYgKGluZGV4IDwgbHAtPnJ4X29sZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV3JhcHBlZCBidWZmZXIgKi8KKwlzaG9ydCB0bGVuID0gKGxwLT5yeFJpbmdTaXplIC0gbHAtPnJ4X29sZCkgKiBSWF9CVUZGX1NaOworCW1lbWNweShza2JfcHV0KHAsdGxlbiksbHAtPnJ4X2J1ZnMgKyBscC0+cnhfb2xkICogUlhfQlVGRl9TWix0bGVuKTsKKwltZW1jcHkoc2tiX3B1dChwLGxlbi10bGVuKSxscC0+cnhfYnVmcyxsZW4tdGxlbik7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGluZWFyIGJ1ZmZlciAqLworCW1lbWNweShza2JfcHV0KHAsbGVuKSxscC0+cnhfYnVmcyArIGxwLT5yeF9vbGQgKiBSWF9CVUZGX1NaLGxlbik7CisgICAgfQorCQkgICAgCisgICAgcmV0dXJuIHA7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK2RlNHg1X2ZyZWVfcnhfYnVmZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGludCBpOworCisgICAgZm9yIChpPTA7IGk8bHAtPnJ4UmluZ1NpemU7IGkrKykgeworCWlmICgodV9sb25nKSBscC0+cnhfc2tiW2ldID4gMSkgeworCSAgICBkZXZfa2ZyZWVfc2tiKGxwLT5yeF9za2JbaV0pOworCX0KKwlscC0+cnhfcmluZ1tpXS5zdGF0dXMgPSAwOworCWxwLT5yeF9za2JbaV0gPSAoc3RydWN0IHNrX2J1ZmYgKikxOyAgICAvKiBEdW1teSBlbnRyeSAqLworICAgIH0KKworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2RlNHg1X2ZyZWVfdHhfYnVmZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGludCBpOworCisgICAgZm9yIChpPTA7IGk8bHAtPnR4UmluZ1NpemU7IGkrKykgeworCWlmIChscC0+dHhfc2tiW2ldKQorCSAgICBkZTR4NV9mcmVlX3R4X2J1ZmYobHAsIGkpOworCWxwLT50eF9yaW5nW2ldLnN0YXR1cyA9IDA7CisgICAgfQorCisgICAgLyogVW5sb2FkIHRoZSBsb2NhbGx5IHF1ZXVlZCBwYWNrZXRzICovCisgICAgd2hpbGUgKGxwLT5jYWNoZS5za2IpIHsKKwlkZXZfa2ZyZWVfc2tiKGRlNHg1X2dldF9jYWNoZShkZXYpKTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qCisqKiBXaGVuIGEgdXNlciBwdWxscyBhIGNvbm5lY3Rpb24sIHRoZSBERUNjaGlwIGNhbiBlbmQgdXAgaW4gYQorKiogJ3J1bm5pbmcgLSB3YWl0aW5nIGZvciBlbmQgb2YgdHJhbnNtaXNzaW9uJyBzdGF0ZS4gVGhpcyBtZWFucyB0aGF0IHdlCisqKiBoYXZlIHRvIHBlcmZvcm0gYSBjaGlwIHNvZnQgcmVzZXQgdG8gZW5zdXJlIHRoYXQgd2UgY2FuIHN5bmNocm9uaXplCisqKiB0aGUgaGFyZHdhcmUgYW5kIHNvZnR3YXJlIGFuZCBtYWtlIGFueSBtZWRpYSBwcm9iZXMgdXNpbmcgYSBsb29wYmFjaworKiogcGFja2V0IG1lYW5pbmdmdWwuCisqLworc3RhdGljIHZvaWQKK2RlNHg1X3NhdmVfc2ticyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIHMzMiBvbXI7CisKKyAgICBpZiAoIWxwLT5jYWNoZS5zYXZlX2NudCkgeworCVNUT1BfREU0WDU7CisJZGU0eDVfdHgoZGV2KTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsdXNoIGFueSBzZW50IHNrYidzICovCisJZGU0eDVfZnJlZV90eF9idWZmcyhkZXYpOworCWRlNHg1X2NhY2hlX3N0YXRlKGRldiwgREU0WDVfU0FWRV9TVEFURSk7CisJZGU0eDVfc3dfcmVzZXQoZGV2KTsKKwlkZTR4NV9jYWNoZV9zdGF0ZShkZXYsIERFNFg1X1JFU1RPUkVfU1RBVEUpOworCWxwLT5jYWNoZS5zYXZlX2NudCsrOworCVNUQVJUX0RFNFg1OworICAgIH0KKworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2RlNHg1X3JzdF9kZXNjX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgaTsKKyAgICBzMzIgb21yOworCisgICAgaWYgKGxwLT5jYWNoZS5zYXZlX2NudCkgeworCVNUT1BfREU0WDU7CisJb3V0bChscC0+ZG1hX3JpbmdzLCBERTRYNV9SUkJBKTsKKwlvdXRsKGxwLT5kbWFfcmluZ3MgKyBOVU1fUlhfREVTQyAqIHNpemVvZihzdHJ1Y3QgZGU0eDVfZGVzYyksCisJICAgICBERTRYNV9UUkJBKTsKKyAgICAKKwlscC0+cnhfbmV3ID0gbHAtPnJ4X29sZCA9IDA7CisJbHAtPnR4X25ldyA9IGxwLT50eF9vbGQgPSAwOworICAgIAorCWZvciAoaSA9IDA7IGkgPCBscC0+cnhSaW5nU2l6ZTsgaSsrKSB7CisJICAgIGxwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IGNwdV90b19sZTMyKFJfT1dOKTsKKwl9CisgICAgCisJZm9yIChpID0gMDsgaSA8IGxwLT50eFJpbmdTaXplOyBpKyspIHsKKwkgICAgbHAtPnR4X3JpbmdbaV0uc3RhdHVzID0gY3B1X3RvX2xlMzIoMCk7CisJfQorICAgIAorCWJhcnJpZXIoKTsKKwlscC0+Y2FjaGUuc2F2ZV9jbnQtLTsKKwlTVEFSVF9ERTRYNTsKKyAgICB9CisgICAgICAgIAorICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2RlNHg1X2NhY2hlX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBmbGFnKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCisgICAgc3dpdGNoKGZsYWcpIHsKKyAgICAgIGNhc2UgREU0WDVfU0FWRV9TVEFURToKKwlscC0+Y2FjaGUuY3NyMCA9IGlubChERTRYNV9CTVIpOworCWxwLT5jYWNoZS5jc3I2ID0gKGlubChERTRYNV9PTVIpICYgfihPTVJfU1QgfCBPTVJfU1IpKTsKKwlscC0+Y2FjaGUuY3NyNyA9IGlubChERTRYNV9JTVIpOworCWJyZWFrOworCisgICAgICBjYXNlIERFNFg1X1JFU1RPUkVfU1RBVEU6CisJb3V0bChscC0+Y2FjaGUuY3NyMCwgREU0WDVfQk1SKTsKKwlvdXRsKGxwLT5jYWNoZS5jc3I2LCBERTRYNV9PTVIpOworCW91dGwobHAtPmNhY2hlLmNzcjcsIERFNFg1X0lNUik7CisJaWYgKGxwLT5jaGlwc2V0ID09IERDMjExNDApIHsKKwkgICAgZ2VwX3dyKGxwLT5jYWNoZS5nZXBjLCBkZXYpOworCSAgICBnZXBfd3IobHAtPmNhY2hlLmdlcCwgZGV2KTsKKwl9IGVsc2UgeworCSAgICByZXNldF9pbml0X3NpYShkZXYsIGxwLT5jYWNoZS5jc3IxMywgbHAtPmNhY2hlLmNzcjE0LCAKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPmNhY2hlLmNzcjE1KTsKKwl9CisJYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZGU0eDVfcHV0X2NhY2hlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAqcDsKKworICAgIGlmIChscC0+Y2FjaGUuc2tiKSB7CisJZm9yIChwPWxwLT5jYWNoZS5za2I7IHAtPm5leHQ7IHA9cC0+bmV4dCk7CisJcC0+bmV4dCA9IHNrYjsKKyAgICB9IGVsc2UgeworCWxwLT5jYWNoZS5za2IgPSBza2I7CisgICAgfQorICAgIHNrYi0+bmV4dCA9IE5VTEw7CisKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitkZTR4NV9wdXRiX2NhY2hlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAqcCA9IGxwLT5jYWNoZS5za2I7CisKKyAgICBscC0+Y2FjaGUuc2tiID0gc2tiOworICAgIHNrYi0+bmV4dCA9IHA7CisKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCitkZTR4NV9nZXRfY2FjaGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHN0cnVjdCBza19idWZmICpwID0gbHAtPmNhY2hlLnNrYjsKKworICAgIGlmIChwKSB7CisJbHAtPmNhY2hlLnNrYiA9IHAtPm5leHQ7CisJcC0+bmV4dCA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHA7Cit9CisKKy8qCisqKiBDaGVjayB0aGUgQXV0byBOZWdvdGlhdGlvbiBTdGF0ZS4gUmV0dXJuIE9LIHdoZW4gYSBsaW5rIHBhc3MgaW50ZXJydXB0CisqKiBpcyByZWNlaXZlZCBhbmQgdGhlIGF1dG8tbmVnb3RpYXRpb24gc3RhdHVzIGlzIE5XQVkgT0suCisqLworc3RhdGljIGludAordGVzdF9hbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgczMyIGlycXMsIHMzMiBpcnFfbWFzaywgczMyIG1zZWMpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgczMyIHN0cywgYW5zOworICAgIAorICAgIGlmIChscC0+dGltZW91dCA8IDApIHsKKwlscC0+dGltZW91dCA9IG1zZWMvMTAwOworCW91dGwoaXJxX21hc2ssIERFNFg1X0lNUik7CisJCisJLyogY2xlYXIgYWxsIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCXN0cyA9IGlubChERTRYNV9TVFMpOworCW91dGwoc3RzLCBERTRYNV9TVFMpOworICAgIH0KKyAgICAKKyAgICBhbnMgPSBpbmwoREU0WDVfU0lTUikgJiBTSVNSX0FOUzsKKyAgICBzdHMgPSBpbmwoREU0WDVfU1RTKSAmIH5USU1FUl9DQjsKKyAgICAKKyAgICBpZiAoIShzdHMgJiBpcnFzKSAmJiAoYW5zIF4gQU5TX05XT0spICYmIC0tbHAtPnRpbWVvdXQpIHsKKwlzdHMgPSAxMDAgfCBUSU1FUl9DQjsKKyAgICB9IGVsc2UgeworCWxwLT50aW1lb3V0ID0gLTE7CisgICAgfQorICAgIAorICAgIHJldHVybiBzdHM7Cit9CisKK3N0YXRpYyB2b2lkCitkZTR4NV9zZXR1cF9pbnRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgczMyIGltciwgc3RzOworICAgIAorICAgIGlmIChpbmwoREU0WDVfT01SKSAmIE9NUl9TUikgeyAgIC8qIE9ubHkgdW5tYXNrIGlmIFRYL1JYIGlzIGVuYWJsZWQgKi8KKwlpbXIgPSAwOworCVVOTUFTS19JUlFzOworCXN0cyA9IGlubChERTRYNV9TVFMpOyAgICAgICAgLyogUmVzZXQgYW55IHBlbmRpbmcgKHN0YWxlKSBpbnRlcnJ1cHRzICovCisJb3V0bChzdHMsIERFNFg1X1NUUyk7CisJRU5BQkxFX0lSUXM7CisgICAgfQorICAgIAorICAgIHJldHVybjsKK30KKworLyoKKyoqCisqLworc3RhdGljIHZvaWQKK3Jlc2V0X2luaXRfc2lhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHMzMiBjc3IxMywgczMyIGNzcjE0LCBzMzIgY3NyMTUpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBSRVNFVF9TSUE7CisgICAgaWYgKGxwLT51c2VTUk9NKSB7CisJaWYgKGxwLT5pYm4gPT0gMykgeworCSAgICBzcm9tX2V4ZWMoZGV2LCBscC0+cGh5W2xwLT5hY3RpdmVdLnJzdCk7CisJICAgIHNyb21fZXhlYyhkZXYsIGxwLT5waHlbbHAtPmFjdGl2ZV0uZ2VwKTsKKwkgICAgb3V0bCgxLCBERTRYNV9TSUNSKTsKKwkgICAgcmV0dXJuOworCX0gZWxzZSB7CisJICAgIGNzcjE1ID0gbHAtPmNhY2hlLmNzcjE1OworCSAgICBjc3IxNCA9IGxwLT5jYWNoZS5jc3IxNDsKKwkgICAgY3NyMTMgPSBscC0+Y2FjaGUuY3NyMTM7CisJICAgIG91dGwoY3NyMTUgfCBscC0+Y2FjaGUuZ2VwYywgREU0WDVfU0lHUik7CisJICAgIG91dGwoY3NyMTUgfCBscC0+Y2FjaGUuZ2VwLCBERTRYNV9TSUdSKTsKKwl9CisgICAgfSBlbHNlIHsKKwlvdXRsKGNzcjE1LCBERTRYNV9TSUdSKTsKKyAgICB9CisgICAgb3V0bChjc3IxNCwgREU0WDVfU1RSUik7CisgICAgb3V0bChjc3IxMywgREU0WDVfU0lDUik7CisKKyAgICBtZGVsYXkoMTApOworCisgICAgcmV0dXJuOworfQorCisvKgorKiogQ3JlYXRlIGEgbG9vcGJhY2sgZXRoZXJuZXQgcGFja2V0CisqLworc3RhdGljIHZvaWQKK2NyZWF0ZV9wYWNrZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqZnJhbWUsIGludCBsZW4pCit7CisgICAgaW50IGk7CisgICAgY2hhciAqYnVmID0gZnJhbWU7CisgICAgCisgICAgZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgeyAgICAgICAgICAgICAvKiBVc2UgdGhpcyBzb3VyY2UgYWRkcmVzcyAqLworCSpidWYrKyA9IGRldi0+ZGV2X2FkZHJbaV07CisgICAgfQorICAgIGZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsgICAgICAgICAgICAgLyogVXNlIHRoaXMgZGVzdGluYXRpb24gYWRkcmVzcyAqLworCSpidWYrKyA9IGRldi0+ZGV2X2FkZHJbaV07CisgICAgfQorICAgIAorICAgICpidWYrKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGFja2V0IGxlbmd0aCAoMiBieXRlcykgKi8KKyAgICAqYnVmKysgPSAxOworICAgIAorICAgIHJldHVybjsKK30KKworLyoKKyoqIExvb2sgZm9yIGEgcGFydGljdWxhciBib2FyZCBuYW1lIGluIHRoZSBFSVNBIGNvbmZpZ3VyYXRpb24gc3BhY2UKKyovCitzdGF0aWMgaW50CitFSVNBX3NpZ25hdHVyZShjaGFyICpuYW1lLCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisgICAgaW50IGksIHN0YXR1cyA9IDAsIHNpZ2xlbiA9IHNpemVvZihkZTR4NV9zaWduYXR1cmVzKS9zaXplb2YoY19jaGFyICopOworICAgIHN0cnVjdCBlaXNhX2RldmljZSAqZWRldjsKKworICAgICpuYW1lID0gJ1wwJzsKKyAgICBlZGV2ID0gdG9fZWlzYV9kZXZpY2UgKGRldmljZSk7CisgICAgaSA9IGVkZXYtPmlkLmRyaXZlcl9kYXRhOworCisgICAgaWYgKGkgPj0gMCAmJiBpIDwgc2lnbGVuKSB7CisJICAgIHN0cmNweSAobmFtZSwgZGU0eDVfc2lnbmF0dXJlc1tpXSk7CisJICAgIHN0YXR1cyA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHRoZSBkZXZpY2UgbmFtZSBzdHJpbmcgKi8KK30KKworLyoKKyoqIExvb2sgZm9yIGEgcGFydGljdWxhciBib2FyZCBuYW1lIGluIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZQorKi8KK3N0YXRpYyBpbnQKK1BDSV9zaWduYXR1cmUoY2hhciAqbmFtZSwgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwKQoreworICAgIGludCBpLCBzdGF0dXMgPSAwLCBzaWdsZW4gPSBzaXplb2YoZGU0eDVfc2lnbmF0dXJlcykvc2l6ZW9mKGNfY2hhciAqKTsKKyAgICAKKyAgICBpZiAobHAtPmNoaXBzZXQgPT0gREMyMTA0MCkgeworCXN0cmNweShuYW1lLCAiREU0MzQvNSIpOworCXJldHVybiBzdGF0dXM7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWFyY2ggZm9yIGEgREVDIG5hbWUgaW4gdGhlIFNST00gKi8KKwlpbnQgaSA9ICooKGNoYXIgKikmbHAtPnNyb20gKyAxOSkgKiAzOworCXN0cm5jcHkobmFtZSwgKGNoYXIgKikmbHAtPnNyb20gKyAyNiArIGksIDgpOworICAgIH0KKyAgICBuYW1lWzhdID0gJ1wwJzsKKyAgICBmb3IgKGk9MDsgaTxzaWdsZW47IGkrKykgeworCWlmIChzdHJzdHIobmFtZSxkZTR4NV9zaWduYXR1cmVzW2ldKSE9TlVMTCkgYnJlYWs7CisgICAgfQorICAgIGlmIChpID09IHNpZ2xlbikgeworCWlmIChkZWNfb25seSkgeworCSAgICAqbmFtZSA9ICdcMCc7CisJfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2UgY2hpcCBuYW1lIHRvIGF2b2lkIGNvbmZ1c2lvbiAqLworCSAgICBzdHJjcHkobmFtZSwgKCgobHAtPmNoaXBzZXQgPT0gREMyMTA0MCkgPyAiREMyMTA0MCIgOgorCQkJICAgKChscC0+Y2hpcHNldCA9PSBEQzIxMDQxKSA/ICJEQzIxMDQxIiA6CisJCQkgICAgKChscC0+Y2hpcHNldCA9PSBEQzIxMTQwKSA/ICJEQzIxMTQwIiA6CisJCQkgICAgICgobHAtPmNoaXBzZXQgPT0gREMyMTE0MikgPyAiREMyMTE0MiIgOgorCQkJICAgICAgKChscC0+Y2hpcHNldCA9PSBEQzIxMTQzKSA/ICJEQzIxMTQzIiA6ICJVTktOT1dOIgorCQkJICAgICApKSkpKSkpOworCX0KKwlpZiAobHAtPmNoaXBzZXQgIT0gREMyMTA0MSkgeworCSAgICBscC0+dXNlU1JPTSA9IFRSVUU7ICAgICAgICAgICAgIC8qIGNhcmQgaXMgbm90IHJlY29nbmlzYWJseSBERUMgKi8KKwl9CisgICAgfSBlbHNlIGlmICgobHAtPmNoaXBzZXQgJiB+MHgwMGZmKSA9PSBEQzIxMTR4KSB7CisJbHAtPnVzZVNST00gPSBUUlVFOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKgorKiogU2V0IHVwIHRoZSBFdGhlcm5ldCBQUk9NIGNvdW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBFdGhlcm5ldCBhZGRyZXNzIG9uCisqKiB0aGUgREMyMTA0MCwgZWxzZSAgcmVhZCB0aGUgU1JPTSBmb3IgdGhlIG90aGVyIGNoaXBzLgorKiogVGhlIFNST00gbWF5IG5vdCBiZSBwcmVzZW50IGluIGEgbXVsdGktTUFDIGNhcmQsIHNvIGZpcnN0IHJlYWQgdGhlCisqKiBNQUMgYWRkcmVzcyBhbmQgY2hlY2sgZm9yIGEgYmFkIGFkZHJlc3MuIElmIHRoZXJlIGlzIGEgYmFkIG9uZSB0aGVuIGV4aXQKKyoqIGltbWVkaWF0ZWx5IHdpdGggdGhlIHByaW9yIHNyb20gY29udGVudHMgaW50YWN0ICh0aGUgaC93IGFkZHJlc3Mgd2lsbAorKiogYmUgZml4ZWQgdXAgbGF0ZXIpLgorKi8KK3N0YXRpYyB2b2lkCitEZXZpY2VQcmVzZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfbG9uZyBhcHJvbV9hZGRyKQoreworICAgIGludCBpLCBqPTA7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAKKyAgICBpZiAobHAtPmNoaXBzZXQgPT0gREMyMTA0MCkgeworCWlmIChscC0+YnVzID09IEVJU0EpIHsKKwkgICAgZW5ldF9hZGRyX3JzdChhcHJvbV9hZGRyKTsgLyogUmVzZXQgRXRoZXJuZXQgQWRkcmVzcyBST00gUG9pbnRlciAqLworCX0gZWxzZSB7CisJICAgIG91dGwoMCwgYXByb21fYWRkcik7ICAgICAgIC8qIFJlc2V0IEV0aGVybmV0IEFkZHJlc3MgUk9NIFBvaW50ZXIgKi8KKwl9CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIG5ldyBzcm9tICovCisJdV9zaG9ydCB0bXAsICpwID0gKHNob3J0ICopKChjaGFyICopJmxwLT5zcm9tICsgU1JPTV9IV0FERCk7CisJZm9yIChpPTA7IGk8KEVUSF9BTEVOPj4xKTsgaSsrKSB7CisJICAgIHRtcCA9IHNyb21fcmQoYXByb21fYWRkciwgKFNST01fSFdBREQ+PjEpICsgaSk7CisJICAgICpwID0gbGUxNl90b19jcHUodG1wKTsKKwkgICAgaiArPSAqcCsrOworCX0KKwlpZiAoKGogPT0gMCkgfHwgKGogPT0gMHgyZmZmZCkpIHsKKwkgICAgcmV0dXJuOworCX0KKworCXA9KHNob3J0ICopJmxwLT5zcm9tOworCWZvciAoaT0wOyBpPChzaXplb2Yoc3RydWN0IGRlNHg1X3Nyb20pPj4xKTsgaSsrKSB7CisJICAgIHRtcCA9IHNyb21fcmQoYXByb21fYWRkciwgaSk7CisJICAgICpwKysgPSBsZTE2X3RvX2NwdSh0bXApOworCX0KKwlkZTR4NV9kYmdfc3JvbSgoc3RydWN0IGRlNHg1X3Nyb20gKikmbHAtPnNyb20pOworICAgIH0KKyAgICAKKyAgICByZXR1cm47Cit9CisKKy8qCisqKiBTaW5jZSB0aGUgd3JpdGUgb24gdGhlIEVuZXQgUFJPTSByZWdpc3RlciBkb2Vzbid0IHNlZW0gdG8gcmVzZXQgdGhlIFBST00KKyoqIHBvaW50ZXIgY29ycmVjdGx5IChhdCBsZWFzdCBvbiBteSBERTQyNSBFSVNBIGNhcmQpLCB0aGlzIHJvdXRpbmUgc2hvdWxkIGRvCisqKiBpdC4uLmZyb20gZGVwY2EuYy4KKyovCitzdGF0aWMgdm9pZAorZW5ldF9hZGRyX3JzdCh1X2xvbmcgYXByb21fYWRkcikKK3sKKyAgICB1bmlvbiB7CisJc3RydWN0IHsKKwkgICAgdTMyIGE7CisJICAgIHUzMiBiOworCX0gbGxzaWc7CisJY2hhciBTaWdbc2l6ZW9mKHUzMikgPDwgMV07CisgICAgfSBkZXY7CisgICAgc2hvcnQgc2lnTGVuZ3RoPTA7CisgICAgczggZGF0YTsKKyAgICBpbnQgaSwgajsKKyAgICAKKyAgICBkZXYubGxzaWcuYSA9IEVUSF9QUk9NX1NJRzsKKyAgICBkZXYubGxzaWcuYiA9IEVUSF9QUk9NX1NJRzsKKyAgICBzaWdMZW5ndGggPSBzaXplb2YodTMyKSA8PCAxOworICAgIAorICAgIGZvciAoaT0wLGo9MDtqPHNpZ0xlbmd0aCAmJiBpPFBST0JFX0xFTkdUSCtzaWdMZW5ndGgtMTtpKyspIHsKKwlkYXRhID0gaW5iKGFwcm9tX2FkZHIpOworCWlmIChkZXYuU2lnW2pdID09IGRhdGEpIHsgICAgLyogdHJhY2sgc2lnbmF0dXJlICovCisJICAgIGorKzsKKwl9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgIC8qIGxvc3Qgc2lnbmF0dXJlOyBiZWdpbiBzZWFyY2ggYWdhaW4gKi8KKwkgICAgaWYgKGRhdGEgPT0gZGV2LlNpZ1swXSkgeyAgLyogcmFyZSBjYXNlLi4uLiAqLworCQlqPTE7CisJICAgIH0gZWxzZSB7CisJCWo9MDsKKwkgICAgfQorCX0KKyAgICB9CisgICAgCisgICAgcmV0dXJuOworfQorCisvKgorKiogRm9yIHRoZSBiYWQgc3RhdHVzIGNhc2UgYW5kIG5vIFNST00sIHRoZW4gYWRkIG9uZSB0byB0aGUgcHJldmlvdXMKKyoqIGFkZHJlc3MuIEhvd2V2ZXIsIG5lZWQgdG8gYWRkIG9uZSBiYWNrd2FyZHMgaW4gY2FzZSB3ZSBoYXZlIDB4ZmYKKyoqIGFzIG9uZSBvciBtb3JlIG9mIHRoZSBieXRlcy4gT25seSB0aGUgbGFzdCAzIGJ5dGVzIHNob3VsZCBiZSBjaGVja2VkCisqKiBhcyB0aGUgZmlyc3QgdGhyZWUgYXJlIGludmFyaWFudCAtIGFzc2lnbmVkIHRvIGFuIG9yZ2FuaXNhdGlvbi4KKyovCitzdGF0aWMgaW50CitnZXRfaHdfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgYnJva2VuLCBpLCBrLCB0bXAsIHN0YXR1cyA9IDA7CisgICAgdV9zaG9ydCBqLGNoa3N1bTsKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgYnJva2VuID0gZGU0eDVfYmFkX3Nyb20obHApOworCisgICAgZm9yIChpPTAsaz0wLGo9MDtqPDM7aisrKSB7CisJayA8PD0gMTsKKwlpZiAoayA+IDB4ZmZmZikgay09MHhmZmZmOworCQorCWlmIChscC0+YnVzID09IFBDSSkgeworCSAgICBpZiAobHAtPmNoaXBzZXQgPT0gREMyMTA0MCkgeworCQl3aGlsZSAoKHRtcCA9IGlubChERTRYNV9BUFJPTSkpIDwgMCk7CisJCWsgKz0gKHVfY2hhcikgdG1wOworCQlkZXYtPmRldl9hZGRyW2krK10gPSAodV9jaGFyKSB0bXA7CisJCXdoaWxlICgodG1wID0gaW5sKERFNFg1X0FQUk9NKSkgPCAwKTsKKwkJayArPSAodV9zaG9ydCkgKHRtcCA8PCA4KTsKKwkJZGV2LT5kZXZfYWRkcltpKytdID0gKHVfY2hhcikgdG1wOworCSAgICB9IGVsc2UgaWYgKCFicm9rZW4pIHsKKwkJZGV2LT5kZXZfYWRkcltpXSA9ICh1X2NoYXIpIGxwLT5zcm9tLmllZWVfYWRkcltpXTsgaSsrOworCQlkZXYtPmRldl9hZGRyW2ldID0gKHVfY2hhcikgbHAtPnNyb20uaWVlZV9hZGRyW2ldOyBpKys7CisJICAgIH0gZWxzZSBpZiAoKGJyb2tlbiA9PSBTTUMpIHx8IChicm9rZW4gPT0gQUNDVE9OKSkgeworCQlkZXYtPmRldl9hZGRyW2ldID0gKigodV9jaGFyICopJmxwLT5zcm9tICsgaSk7IGkrKzsKKwkJZGV2LT5kZXZfYWRkcltpXSA9ICooKHVfY2hhciAqKSZscC0+c3JvbSArIGkpOyBpKys7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBrICs9ICh1X2NoYXIpICh0bXAgPSBpbmIoRUlTQV9BUFJPTSkpOworCSAgICBkZXYtPmRldl9hZGRyW2krK10gPSAodV9jaGFyKSB0bXA7CisJICAgIGsgKz0gKHVfc2hvcnQpICgodG1wID0gaW5iKEVJU0FfQVBST00pKSA8PCA4KTsKKwkgICAgZGV2LT5kZXZfYWRkcltpKytdID0gKHVfY2hhcikgdG1wOworCX0KKwkKKwlpZiAoayA+IDB4ZmZmZikgay09MHhmZmZmOworICAgIH0KKyAgICBpZiAoayA9PSAweGZmZmYpIGs9MDsKKyAgICAKKyAgICBpZiAobHAtPmJ1cyA9PSBQQ0kpIHsKKwlpZiAobHAtPmNoaXBzZXQgPT0gREMyMTA0MCkgeworCSAgICB3aGlsZSAoKHRtcCA9IGlubChERTRYNV9BUFJPTSkpIDwgMCk7CisJICAgIGNoa3N1bSA9ICh1X2NoYXIpIHRtcDsKKwkgICAgd2hpbGUgKCh0bXAgPSBpbmwoREU0WDVfQVBST00pKSA8IDApOworCSAgICBjaGtzdW0gfD0gKHVfc2hvcnQpICh0bXAgPDwgOCk7CisJICAgIGlmICgoayAhPSBjaGtzdW0pICYmIChkZWNfb25seSkpIHN0YXR1cyA9IC0xOworCX0KKyAgICB9IGVsc2UgeworCWNoa3N1bSA9ICh1X2NoYXIpIGluYihFSVNBX0FQUk9NKTsKKwljaGtzdW0gfD0gKHVfc2hvcnQpIChpbmIoRUlTQV9BUFJPTSkgPDwgOCk7CisJaWYgKChrICE9IGNoa3N1bSkgJiYgKGRlY19vbmx5KSkgc3RhdHVzID0gLTE7CisgICAgfQorCisgICAgLyogSWYgcG9zc2libGUsIHRyeSB0byBmaXggYSBicm9rZW4gY2FyZCAtIFNNQyBvbmx5IHNvIGZhciAqLworICAgIHNyb21fcmVwYWlyKGRldiwgYnJva2VuKTsKKworI2lmZGVmIENPTkZJR19QUENfTVVMVElQTEFURk9STQorICAgIC8qIAorICAgICoqIElmIHRoZSBhZGRyZXNzIHN0YXJ0cyB3aXRoIDAwIGEwLCB3ZSBoYXZlIHRvIGJpdC1yZXZlcnNlCisgICAgKiogZWFjaCBieXRlIG9mIHRoZSBhZGRyZXNzLgorICAgICovCisgICAgaWYgKCAoX21hY2hpbmUgJiBfTUFDSF9QbWFjKSAmJgorCSAoZGV2LT5kZXZfYWRkclswXSA9PSAwKSAmJgorCSAoZGV2LT5kZXZfYWRkclsxXSA9PSAweGEwKSApCisgICAgeworCSAgICBmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47ICsraSkKKwkgICAgeworCQkgICAgaW50IHggPSBkZXYtPmRldl9hZGRyW2ldOworCQkgICAgeCA9ICgoeCAmIDB4ZikgPDwgNCkgKyAoKHggJiAweGYwKSA+PiA0KTsKKwkJICAgIHggPSAoKHggJiAweDMzKSA8PCAyKSArICgoeCAmIDB4Y2MpID4+IDIpOworCQkgICAgZGV2LT5kZXZfYWRkcltpXSA9ICgoeCAmIDB4NTUpIDw8IDEpICsgKCh4ICYgMHhhYSkgPj4gMSk7CisJICAgIH0KKyAgICB9CisjZW5kaWYgLyogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNICovCisKKyAgICAvKiBUZXN0IGZvciBhIGJhZCBlbmV0IGFkZHJlc3MgKi8KKyAgICBzdGF0dXMgPSB0ZXN0X2JhZF9lbmV0KGRldiwgc3RhdHVzKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qCisqKiBUZXN0IGZvciBlbmV0IGFkZHJlc3NlcyBpbiB0aGUgZmlyc3QgMzIgYnl0ZXMuIFRoZSBidWlsdC1pbiBzdHJuY21wCisqKiBkaWRuJ3Qgc2VlbSB0byB3b3JrIGhlcmUuLi4/CisqLworc3RhdGljIGludAorZGU0eDVfYmFkX3Nyb20oc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwKQoreworICAgIGludCBpLCBzdGF0dXMgPSAwOworCisgICAgZm9yIChpPTA7IGk8c2l6ZW9mKGVuZXRfZGV0KS9FVEhfQUxFTjsgaSsrKSB7CisJaWYgKCFkZTR4NV9zdHJuY21wKChjaGFyICopJmxwLT5zcm9tLCAoY2hhciAqKSZlbmV0X2RldFtpXSwgMykgJiYKKwkgICAgIWRlNHg1X3N0cm5jbXAoKGNoYXIgKikmbHAtPnNyb20rMHgxMCwgKGNoYXIgKikmZW5ldF9kZXRbaV0sIDMpKSB7CisJICAgIGlmIChpID09IDApIHsKKwkJc3RhdHVzID0gU01DOworCSAgICB9IGVsc2UgaWYgKGkgPT0gMSkgeworCQlzdGF0dXMgPSBBQ0NUT047CisJICAgIH0KKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK2RlNHg1X3N0cm5jbXAoY2hhciAqYSwgY2hhciAqYiwgaW50IG4pCit7CisgICAgaW50IHJldD0wOworCisgICAgZm9yICg7biAmJiAhcmV0O24tLSkgeworCXJldCA9ICphKysgLSAqYisrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitzcm9tX3JlcGFpcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY2FyZCkKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgc3dpdGNoKGNhcmQpIHsKKyAgICAgIGNhc2UgU01DOgorCW1lbXNldCgoY2hhciAqKSZscC0+c3JvbSwgMCwgc2l6ZW9mKHN0cnVjdCBkZTR4NV9zcm9tKSk7CisJbWVtY3B5KGxwLT5zcm9tLmllZWVfYWRkciwgKGNoYXIgKilkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGxwLT5zcm9tLmluZm8sIChjaGFyICopJnNyb21fcmVwYWlyX2luZm9bU01DLTFdLCAxMDApOworCWxwLT51c2VTUk9NID0gVFJVRTsKKwlicmVhazsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qCisqKiBBc3N1bWUgdGhhdCB0aGUgaXJxJ3MgZG8gbm90IGZvbGxvdyB0aGUgUENJIHNwZWMgLSB0aGlzIGlzIHNlZW1zCisqKiB0byBiZSB0cnVlIHNvIGZhciAoMiBmb3IgMikuCisqLworc3RhdGljIGludAordGVzdF9iYWRfZW5ldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhdHVzKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IGksIHRtcDsKKworICAgIGZvciAodG1wPTAsaT0wOyBpPEVUSF9BTEVOOyBpKyspIHRtcCArPSAodV9jaGFyKWRldi0+ZGV2X2FkZHJbaV07CisgICAgaWYgKCh0bXAgPT0gMCkgfHwgKHRtcCA9PSAweDVmYSkpIHsKKwlpZiAoKGxwLT5jaGlwc2V0ID09IGxhc3QuY2hpcHNldCkgJiYgCisJICAgIChscC0+YnVzX251bSA9PSBsYXN0LmJ1cykgJiYgKGxwLT5idXNfbnVtID4gMCkpIHsKKwkgICAgZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgZGV2LT5kZXZfYWRkcltpXSA9IGxhc3QuYWRkcltpXTsKKwkgICAgZm9yIChpPUVUSF9BTEVOLTE7IGk+MjsgLS1pKSB7CisJCWRldi0+ZGV2X2FkZHJbaV0gKz0gMTsKKwkJaWYgKGRldi0+ZGV2X2FkZHJbaV0gIT0gMCkgYnJlYWs7CisJICAgIH0KKwkgICAgZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgbGFzdC5hZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKwkgICAgaWYgKCFhbl9leGNlcHRpb24obHApKSB7CisJCWRldi0+aXJxID0gbGFzdC5pcnE7CisJICAgIH0KKworCSAgICBzdGF0dXMgPSAwOworCX0KKyAgICB9IGVsc2UgaWYgKCFzdGF0dXMpIHsKKwlsYXN0LmNoaXBzZXQgPSBscC0+Y2hpcHNldDsKKwlsYXN0LmJ1cyA9IGxwLT5idXNfbnVtOworCWxhc3QuaXJxID0gZGV2LT5pcnE7CisJZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgbGFzdC5hZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKgorKiogTGlzdCBvZiBib2FyZCBleGNlcHRpb25zIHdpdGggY29ycmVjdGx5IHdpcmVkIElSUXMKKyovCitzdGF0aWMgaW50Cithbl9leGNlcHRpb24oc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwKQoreworICAgIGlmICgoKih1X3Nob3J0ICopbHAtPnNyb20uc3ViX3ZlbmRvcl9pZCA9PSAweDAwYzApICYmIAorCSgqKHVfc2hvcnQgKilscC0+c3JvbS5zdWJfc3lzdGVtX2lkID09IDB4OTVlMCkpIHsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisqKiBTUk9NIFJlYWQKKyovCitzdGF0aWMgc2hvcnQKK3Nyb21fcmQodV9sb25nIGFkZHIsIHVfY2hhciBvZmZzZXQpCit7CisgICAgc2VuZHRvX3Nyb20oU1JPTV9SRCB8IFNST01fU1IsIGFkZHIpOworICAgIAorICAgIHNyb21fbGF0Y2goU1JPTV9SRCB8IFNST01fU1IgfCBEVF9DUywgYWRkcik7CisgICAgc3JvbV9jb21tYW5kKFNST01fUkQgfCBTUk9NX1NSIHwgRFRfSU4gfCBEVF9DUywgYWRkcik7CisgICAgc3JvbV9hZGRyZXNzKFNST01fUkQgfCBTUk9NX1NSIHwgRFRfQ1MsIGFkZHIsIG9mZnNldCk7CisgICAgCisgICAgcmV0dXJuIHNyb21fZGF0YShTUk9NX1JEIHwgU1JPTV9TUiB8IERUX0NTLCBhZGRyKTsKK30KKworc3RhdGljIHZvaWQKK3Nyb21fbGF0Y2godV9pbnQgY29tbWFuZCwgdV9sb25nIGFkZHIpCit7CisgICAgc2VuZHRvX3Nyb20oY29tbWFuZCwgYWRkcik7CisgICAgc2VuZHRvX3Nyb20oY29tbWFuZCB8IERUX0NMSywgYWRkcik7CisgICAgc2VuZHRvX3Nyb20oY29tbWFuZCwgYWRkcik7CisgICAgCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorc3JvbV9jb21tYW5kKHVfaW50IGNvbW1hbmQsIHVfbG9uZyBhZGRyKQoreworICAgIHNyb21fbGF0Y2goY29tbWFuZCwgYWRkcik7CisgICAgc3JvbV9sYXRjaChjb21tYW5kLCBhZGRyKTsKKyAgICBzcm9tX2xhdGNoKChjb21tYW5kICYgMHgwMDAwZmYwMCkgfCBEVF9DUywgYWRkcik7CisgICAgCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorc3JvbV9hZGRyZXNzKHVfaW50IGNvbW1hbmQsIHVfbG9uZyBhZGRyLCB1X2NoYXIgb2Zmc2V0KQoreworICAgIGludCBpLCBhOworICAgIAorICAgIGEgPSBvZmZzZXQgPDwgMjsKKyAgICBmb3IgKGk9MDsgaTw2OyBpKyssIGEgPDw9IDEpIHsKKwlzcm9tX2xhdGNoKGNvbW1hbmQgfCAoKGEgJiAweDgwKSA/IERUX0lOIDogMCksIGFkZHIpOworICAgIH0KKyAgICB1ZGVsYXkoMSk7CisgICAgCisgICAgaSA9IChnZXRmcm9tX3Nyb20oYWRkcikgPj4gMykgJiAweDAxOworICAgIAorICAgIHJldHVybjsKK30KKworc3RhdGljIHNob3J0Citzcm9tX2RhdGEodV9pbnQgY29tbWFuZCwgdV9sb25nIGFkZHIpCit7CisgICAgaW50IGk7CisgICAgc2hvcnQgd29yZCA9IDA7CisgICAgczMyIHRtcDsKKyAgICAKKyAgICBmb3IgKGk9MDsgaTwxNjsgaSsrKSB7CisJc2VuZHRvX3Nyb20oY29tbWFuZCAgfCBEVF9DTEssIGFkZHIpOworCXRtcCA9IGdldGZyb21fc3JvbShhZGRyKTsKKwlzZW5kdG9fc3JvbShjb21tYW5kLCBhZGRyKTsKKwkKKwl3b3JkID0gKHdvcmQgPDwgMSkgfCAoKHRtcCA+PiAzKSAmIDB4MDEpOworICAgIH0KKyAgICAKKyAgICBzZW5kdG9fc3JvbShjb21tYW5kICYgMHgwMDAwZmYwMCwgYWRkcik7CisgICAgCisgICAgcmV0dXJuIHdvcmQ7Cit9CisKKy8qCitzdGF0aWMgdm9pZAorc3JvbV9idXN5KHVfaW50IGNvbW1hbmQsIHVfbG9uZyBhZGRyKQoreworICAgc2VuZHRvX3Nyb20oKGNvbW1hbmQgJiAweDAwMDBmZjAwKSB8IERUX0NTLCBhZGRyKTsKKyAgIAorICAgd2hpbGUgKCEoKGdldGZyb21fc3JvbShhZGRyKSA+PiAzKSAmIDB4MDEpKSB7CisgICAgICAgbWRlbGF5KDEpOworICAgfQorICAgCisgICBzZW5kdG9fc3JvbShjb21tYW5kICYgMHgwMDAwZmYwMCwgYWRkcik7CisgICAKKyAgIHJldHVybjsKK30KKyovCisKK3N0YXRpYyB2b2lkCitzZW5kdG9fc3JvbSh1X2ludCBjb21tYW5kLCB1X2xvbmcgYWRkcikKK3sKKyAgICBvdXRsKGNvbW1hbmQsIGFkZHIpOworICAgIHVkZWxheSgxKTsKKyAgICAKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKK2dldGZyb21fc3JvbSh1X2xvbmcgYWRkcikKK3sKKyAgICBzMzIgdG1wOworICAgIAorICAgIHRtcCA9IGlubChhZGRyKTsKKyAgICB1ZGVsYXkoMSk7CisgICAgCisgICAgcmV0dXJuIHRtcDsKK30KKworc3RhdGljIGludAorc3JvbV9pbmZvbGVhZl9pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICBpbnQgaSwgY291bnQ7CisgICAgdV9jaGFyICpwOworCisgICAgLyogRmluZCB0aGUgaW5mb2xlYWYgZGVjb2RlciBmdW5jdGlvbiB0aGF0IG1hdGNoZXMgdGhpcyBjaGlwc2V0ICovCisgICAgZm9yIChpPTA7IGk8SU5GT0xFQUZfU0laRTsgaSsrKSB7CisJaWYgKGxwLT5jaGlwc2V0ID09IGluZm9sZWFmX2FycmF5W2ldLmNoaXBzZXQpIGJyZWFrOworICAgIH0KKyAgICBpZiAoaSA9PSBJTkZPTEVBRl9TSVpFKSB7CisJbHAtPnVzZVNST00gPSBGQUxTRTsKKwlwcmludGsoIiVzOiBDYW5ub3QgZmluZCBjb3JyZWN0IGNoaXBzZXQgZm9yIFNST00gZGVjb2RpbmchXG4iLCAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lKTsKKwlyZXR1cm4gLUVOWElPOworICAgIH0KKworICAgIGxwLT5pbmZvbGVhZl9mbiA9IGluZm9sZWFmX2FycmF5W2ldLmZuOworCisgICAgLyogRmluZCB0aGUgaW5mb3JtYXRpb24gb2Zmc2V0IHRoYXQgdGhpcyBmdW5jdGlvbiBzaG91bGQgdXNlICovCisgICAgY291bnQgPSAqKCh1X2NoYXIgKikmbHAtPnNyb20gKyAxOSk7CisgICAgcCAgPSAodV9jaGFyICopJmxwLT5zcm9tICsgMjY7CisKKyAgICBpZiAoY291bnQgPiAxKSB7CisJZm9yIChpPWNvdW50OyBpOyAtLWksIHArPTMpIHsKKwkgICAgaWYgKGxwLT5kZXZpY2UgPT0gKnApIGJyZWFrOworCX0KKwlpZiAoaSA9PSAwKSB7CisJICAgIGxwLT51c2VTUk9NID0gRkFMU0U7CisJICAgIHByaW50aygiJXM6IENhbm5vdCBmaW5kIGNvcnJlY3QgUENJIGRldmljZSBbJWRdIGZvciBTUk9NIGRlY29kaW5nIVxuIiwgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGxwLT5kZXZpY2UpOworCSAgICByZXR1cm4gLUVOWElPOworCX0KKyAgICB9CisKKyAgICBscC0+aW5mb2xlYWZfb2Zmc2V0ID0gVFdJRERMRShwKzEpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisqKiBUaGlzIHJvdXRpbmUgbG9hZHMgYW55IHR5cGUgMSBvciAzIE1JSSBpbmZvIGludG8gdGhlIG1paSBkZXZpY2UKKyoqIHN0cnVjdCBhbmQgZXhlY3V0ZXMgYW55IHR5cGUgNSBjb2RlIHRvIHJlc2V0IFBIWSBkZXZpY2VzIGZvciB0aGlzCisqKiBjb250cm9sbGVyLgorKiogVGhlIGluZm8gZm9yIHRoZSBNSUkgZGV2aWNlcyB3aWxsIGJlIHZhbGlkIHNpbmNlIHRoZSBpbmRleCB1c2VkCisqKiB3aWxsIGZvbGxvdyB0aGUgZGlzY292ZXJ5IHByb2Nlc3MgZnJvbSBNSUkgYWRkcmVzcyAxLTMxIHRoZW4gMC4KKyovCitzdGF0aWMgdm9pZAorc3JvbV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgKnAgPSAodV9jaGFyICopJmxwLT5zcm9tICsgbHAtPmluZm9sZWFmX29mZnNldDsKKyAgICB1X2NoYXIgY291bnQ7CisKKyAgICBwKz0yOworICAgIGlmIChscC0+Y2hpcHNldCA9PSBEQzIxMTQwKSB7CisJbHAtPmNhY2hlLmdlcGMgPSAoKnArKyB8IEdFUF9DVFJMKTsKKwlnZXBfd3IobHAtPmNhY2hlLmdlcGMsIGRldik7CisgICAgfQorCisgICAgLyogQmxvY2sgY291bnQgKi8KKyAgICBjb3VudCA9ICpwKys7CisKKyAgICAvKiBKdW1wIHRoZSBpbmZvYmxvY2tzIHRvIGZpbmQgdHlwZXMgKi8KKyAgICBmb3IgKDtjb3VudDsgLS1jb3VudCkgeworCWlmICgqcCA8IDEyOCkgeworCSAgICBwICs9IENPTVBBQ1RfTEVOOworCX0gZWxzZSBpZiAoKihwKzEpID09IDUpIHsKKwkgICAgdHlwZTVfaW5mb2Jsb2NrKGRldiwgMSwgcCk7CisJICAgIHAgKz0gKCgqcCAmIEJMT0NLX0xFTikgKyAxKTsKKwl9IGVsc2UgaWYgKCoocCsxKSA9PSA0KSB7CisJICAgIHAgKz0gKCgqcCAmIEJMT0NLX0xFTikgKyAxKTsKKwl9IGVsc2UgaWYgKCoocCsxKSA9PSAzKSB7CisJICAgIHR5cGUzX2luZm9ibG9jayhkZXYsIDEsIHApOworCSAgICBwICs9ICgoKnAgJiBCTE9DS19MRU4pICsgMSk7CisJfSBlbHNlIGlmICgqKHArMSkgPT0gMikgeworCSAgICBwICs9ICgoKnAgJiBCTE9DS19MRU4pICsgMSk7CisJfSBlbHNlIGlmICgqKHArMSkgPT0gMSkgeworCSAgICB0eXBlMV9pbmZvYmxvY2soZGV2LCAxLCBwKTsKKwkgICAgcCArPSAoKCpwICYgQkxPQ0tfTEVOKSArIDEpOworCX0gZWxzZSB7CisJICAgIHAgKz0gKCgqcCAmIEJMT0NLX0xFTikgKyAxKTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKgorKiogQSBnZW5lcmljIHJvdXRpbmUgdGhhdCB3cml0ZXMgR0VQIGNvbnRyb2wsIGRhdGEgYW5kIHJlc2V0IGluZm9ybWF0aW9uCisqKiB0byB0aGUgR0VQIHJlZ2lzdGVyICgyMTE0MCkgb3IgY3NyMTUgR0VQIHBvcnRpb24gKDIxMTRbMjNdKS4KKyovCitzdGF0aWMgdm9pZAorc3JvbV9leGVjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciAqcCkKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICB1X2NoYXIgY291bnQgPSAocCA/ICpwKysgOiAwKTsKKyAgICB1X3Nob3J0ICp3ID0gKHVfc2hvcnQgKilwOworCisgICAgaWYgKCgobHAtPmlibiAhPSAxKSAmJiAobHAtPmlibiAhPSAzKSAmJiAobHAtPmlibiAhPSA1KSkgfHwgIWNvdW50KSByZXR1cm47CisKKyAgICBpZiAobHAtPmNoaXBzZXQgIT0gREMyMTE0MCkgUkVTRVRfU0lBOworIAorICAgIHdoaWxlIChjb3VudC0tKSB7CisJZ2VwX3dyKCgobHAtPmNoaXBzZXQ9PURDMjExNDApICYmIChscC0+aWJuIT01KSA/IAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwKysgOiBUV0lERExFKHcrKykpLCBkZXYpOworCW1kZWxheSgyKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDJtcyBwZXIgYWN0aW9uICovCisgICAgfQorCisgICAgaWYgKGxwLT5jaGlwc2V0ICE9IERDMjExNDApIHsKKwlvdXRsKGxwLT5jYWNoZS5jc3IxNCwgREU0WDVfU1RSUik7CisJb3V0bChscC0+Y2FjaGUuY3NyMTMsIERFNFg1X1NJQ1IpOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoKKyoqIEJhc2ljYWxseSB0aGlzIGZ1bmN0aW9uIGlzIGEgTk9QIHNpbmNlIGl0IHdpbGwgbmV2ZXIgYmUgY2FsbGVkLAorKiogdW5sZXNzIEkgaW1wbGVtZW50IHRoZSBEQzIxMDQxIFNST00gZnVuY3Rpb25zLiBUaGVyZSdzIG5vIG5lZWQKKyoqIHNpbmNlIHRoZSBleGlzdGluZyBjb2RlIHdpbGwgYmUgc2F0aXNmYWN0b3J5IGZvciBhbGwgYm9hcmRzLgorKi8KK3N0YXRpYyBpbnQgCitkYzIxMDQxX2luZm9sZWFmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgcmV0dXJuIERFNFg1X0FVVE9TRU5TRV9NUzsKK30KKworc3RhdGljIGludCAKK2RjMjExNDBfaW5mb2xlYWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciBjb3VudCA9IDA7CisgICAgdV9jaGFyICpwID0gKHVfY2hhciAqKSZscC0+c3JvbSArIGxwLT5pbmZvbGVhZl9vZmZzZXQ7CisgICAgaW50IG5leHRfdGljayA9IERFNFg1X0FVVE9TRU5TRV9NUzsKKworICAgIC8qIFJlYWQgdGhlIGNvbm5lY3Rpb24gdHlwZSAqLworICAgIHArPTI7CisKKyAgICAvKiBHRVAgY29udHJvbCAqLworICAgIGxwLT5jYWNoZS5nZXBjID0gKCpwKysgfCBHRVBfQ1RSTCk7CisKKyAgICAvKiBCbG9jayBjb3VudCAqLworICAgIGNvdW50ID0gKnArKzsKKworICAgIC8qIFJlY3Vyc2l2ZWx5IGZpZ3VyZSBvdXQgdGhlIGluZm8gYmxvY2tzICovCisgICAgaWYgKCpwIDwgMTI4KSB7CisJbmV4dF90aWNrID0gZGNfaW5mb2Jsb2NrW0NPTVBBQ1RdKGRldiwgY291bnQsIHApOworICAgIH0gZWxzZSB7CisJbmV4dF90aWNrID0gZGNfaW5mb2Jsb2NrWyoocCsxKV0oZGV2LCBjb3VudCwgcCk7CisgICAgfQorCisgICAgaWYgKGxwLT50Y291bnQgPT0gY291bnQpIHsKKwlscC0+bWVkaWEgPSBOQzsKKyAgICAgICAgaWYgKGxwLT5tZWRpYSAhPSBscC0+Y19tZWRpYSkgeworCSAgICBkZTR4NV9kYmdfbWVkaWEoZGV2KTsKKwkgICAgbHAtPmNfbWVkaWEgPSBscC0+bWVkaWE7CisJfQorCWxwLT5tZWRpYSA9IElOSVQ7CisJbHAtPnRjb3VudCA9IDA7CisJbHAtPnR4X2VuYWJsZSA9IEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBuZXh0X3RpY2sgJiB+VElNRVJfQ0I7Cit9CisKK3N0YXRpYyBpbnQgCitkYzIxMTQyX2luZm9sZWFmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgY291bnQgPSAwOworICAgIHVfY2hhciAqcCA9ICh1X2NoYXIgKikmbHAtPnNyb20gKyBscC0+aW5mb2xlYWZfb2Zmc2V0OworICAgIGludCBuZXh0X3RpY2sgPSBERTRYNV9BVVRPU0VOU0VfTVM7CisKKyAgICAvKiBSZWFkIHRoZSBjb25uZWN0aW9uIHR5cGUgKi8KKyAgICBwKz0yOworCisgICAgLyogQmxvY2sgY291bnQgKi8KKyAgICBjb3VudCA9ICpwKys7CisKKyAgICAvKiBSZWN1cnNpdmVseSBmaWd1cmUgb3V0IHRoZSBpbmZvIGJsb2NrcyAqLworICAgIGlmICgqcCA8IDEyOCkgeworCW5leHRfdGljayA9IGRjX2luZm9ibG9ja1tDT01QQUNUXShkZXYsIGNvdW50LCBwKTsKKyAgICB9IGVsc2UgeworCW5leHRfdGljayA9IGRjX2luZm9ibG9ja1sqKHArMSldKGRldiwgY291bnQsIHApOworICAgIH0KKworICAgIGlmIChscC0+dGNvdW50ID09IGNvdW50KSB7CisJbHAtPm1lZGlhID0gTkM7CisgICAgICAgIGlmIChscC0+bWVkaWEgIT0gbHAtPmNfbWVkaWEpIHsKKwkgICAgZGU0eDVfZGJnX21lZGlhKGRldik7CisJICAgIGxwLT5jX21lZGlhID0gbHAtPm1lZGlhOworCX0KKwlscC0+bWVkaWEgPSBJTklUOworCWxwLT50Y291bnQgPSAwOworCWxwLT50eF9lbmFibGUgPSBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV4dF90aWNrICYgflRJTUVSX0NCOworfQorCitzdGF0aWMgaW50IAorZGMyMTE0M19pbmZvbGVhZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9jaGFyIGNvdW50ID0gMDsKKyAgICB1X2NoYXIgKnAgPSAodV9jaGFyICopJmxwLT5zcm9tICsgbHAtPmluZm9sZWFmX29mZnNldDsKKyAgICBpbnQgbmV4dF90aWNrID0gREU0WDVfQVVUT1NFTlNFX01TOworCisgICAgLyogUmVhZCB0aGUgY29ubmVjdGlvbiB0eXBlICovCisgICAgcCs9MjsKKworICAgIC8qIEJsb2NrIGNvdW50ICovCisgICAgY291bnQgPSAqcCsrOworCisgICAgLyogUmVjdXJzaXZlbHkgZmlndXJlIG91dCB0aGUgaW5mbyBibG9ja3MgKi8KKyAgICBpZiAoKnAgPCAxMjgpIHsKKwluZXh0X3RpY2sgPSBkY19pbmZvYmxvY2tbQ09NUEFDVF0oZGV2LCBjb3VudCwgcCk7CisgICAgfSBlbHNlIHsKKwluZXh0X3RpY2sgPSBkY19pbmZvYmxvY2tbKihwKzEpXShkZXYsIGNvdW50LCBwKTsKKyAgICB9CisgICAgaWYgKGxwLT50Y291bnQgPT0gY291bnQpIHsKKwlscC0+bWVkaWEgPSBOQzsKKyAgICAgICAgaWYgKGxwLT5tZWRpYSAhPSBscC0+Y19tZWRpYSkgeworCSAgICBkZTR4NV9kYmdfbWVkaWEoZGV2KTsKKwkgICAgbHAtPmNfbWVkaWEgPSBscC0+bWVkaWE7CisJfQorCWxwLT5tZWRpYSA9IElOSVQ7CisJbHAtPnRjb3VudCA9IDA7CisJbHAtPnR4X2VuYWJsZSA9IEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBuZXh0X3RpY2sgJiB+VElNRVJfQ0I7Cit9CisKKy8qCisqKiBUaGUgY29tcGFjdCBpbmZvYmxvY2sgaXMgb25seSBkZXNpZ25lZCBmb3IgREMyMTE0MFtBXSBjaGlwcywgc28KKyoqIHdlJ2xsIHJldXNlIHRoZSBkYzIxMTQwbV9hdXRvY29uZiBmdW5jdGlvbi4gTm9uIE1JSSBtZWRpYSBvbmx5LgorKi8KK3N0YXRpYyBpbnQgCitjb21wYWN0X2luZm9ibG9jayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgY291bnQsIHVfY2hhciAqcCkKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciBmbGFncywgY3NyNjsKKworICAgIC8qIFJlY3Vyc2l2ZWx5IGZpZ3VyZSBvdXQgdGhlIGluZm8gYmxvY2tzICovCisgICAgaWYgKC0tY291bnQgPiBscC0+dGNvdW50KSB7CisJaWYgKCoocCtDT01QQUNUX0xFTikgPCAxMjgpIHsKKwkgICAgcmV0dXJuIGRjX2luZm9ibG9ja1tDT01QQUNUXShkZXYsIGNvdW50LCBwK0NPTVBBQ1RfTEVOKTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gZGNfaW5mb2Jsb2NrWyoocCtDT01QQUNUX0xFTisxKV0oZGV2LCBjb3VudCwgcCtDT01QQUNUX0xFTik7CisJfQorICAgIH0KKworICAgIGlmICgobHAtPm1lZGlhID09IElOSVQpICYmIChscC0+dGltZW91dCA8IDApKSB7CisgICAgICAgIGxwLT5pYm4gPSBDT01QQUNUOworICAgICAgICBscC0+YWN0aXZlID0gMDsKKwlnZXBfd3IobHAtPmNhY2hlLmdlcGMsIGRldik7CisJbHAtPmluZm9ibG9ja19tZWRpYSA9ICgqcCsrKSAmIENPTVBBQ1RfTUM7CisJbHAtPmNhY2hlLmdlcCA9ICpwKys7CisJY3NyNiA9ICpwKys7CisJZmxhZ3MgPSAqcCsrOworCisJbHAtPmFzQml0VmFsaWQgPSAoZmxhZ3MgJiAweDgwKSA/IDAgOiAtMTsKKwlscC0+ZGVmTWVkaXVtID0gKGZsYWdzICYgMHg0MCkgPyAtMSA6IDA7CisJbHAtPmFzQml0ID0gMSA8PCAoKGNzcjYgPj4gMSkgJiAweDA3KTsKKwlscC0+YXNQb2xhcml0eSA9ICgoY3NyNiAmIDB4ODApID8gLTEgOiAwKSAmIGxwLT5hc0JpdDsKKwlscC0+aW5mb2Jsb2NrX2NzcjYgPSBPTVJfREVGIHwgKChjc3I2ICYgMHg3MSkgPDwgMTgpOworCWxwLT51c2VNSUkgPSBGQUxTRTsKKworCWRlNHg1X3N3aXRjaF9tYWNfcG9ydChkZXYpOworICAgIH0KKworICAgIHJldHVybiBkYzIxMTQwbV9hdXRvY29uZihkZXYpOworfQorCisvKgorKiogVGhpcyBibG9jayBkZXNjcmliZXMgbm9uIE1JSSBtZWRpYSBmb3IgdGhlIERDMjExNDBbQV0gb25seS4KKyovCitzdGF0aWMgaW50IAordHlwZTBfaW5mb2Jsb2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciBjb3VudCwgdV9jaGFyICpwKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9jaGFyIGZsYWdzLCBjc3I2LCBsZW4gPSAoKnAgJiBCTE9DS19MRU4pKzE7CisKKyAgICAvKiBSZWN1cnNpdmVseSBmaWd1cmUgb3V0IHRoZSBpbmZvIGJsb2NrcyAqLworICAgIGlmICgtLWNvdW50ID4gbHAtPnRjb3VudCkgeworCWlmICgqKHArbGVuKSA8IDEyOCkgeworCSAgICByZXR1cm4gZGNfaW5mb2Jsb2NrW0NPTVBBQ1RdKGRldiwgY291bnQsIHArbGVuKTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gZGNfaW5mb2Jsb2NrWyoocCtsZW4rMSldKGRldiwgY291bnQsIHArbGVuKTsKKwl9CisgICAgfQorCisgICAgaWYgKChscC0+bWVkaWEgPT0gSU5JVCkgJiYgKGxwLT50aW1lb3V0IDwgMCkpIHsKKyAgICAgICAgbHAtPmlibiA9IDA7CisgICAgICAgIGxwLT5hY3RpdmUgPSAwOworICAgICAgICBnZXBfd3IobHAtPmNhY2hlLmdlcGMsIGRldik7CisJcCs9MjsKKwlscC0+aW5mb2Jsb2NrX21lZGlhID0gKCpwKyspICYgQkxPQ0swX01DOworCWxwLT5jYWNoZS5nZXAgPSAqcCsrOworCWNzcjYgPSAqcCsrOworCWZsYWdzID0gKnArKzsKKworCWxwLT5hc0JpdFZhbGlkID0gKGZsYWdzICYgMHg4MCkgPyAwIDogLTE7CisJbHAtPmRlZk1lZGl1bSA9IChmbGFncyAmIDB4NDApID8gLTEgOiAwOworCWxwLT5hc0JpdCA9IDEgPDwgKChjc3I2ID4+IDEpICYgMHgwNyk7CisJbHAtPmFzUG9sYXJpdHkgPSAoKGNzcjYgJiAweDgwKSA/IC0xIDogMCkgJiBscC0+YXNCaXQ7CisJbHAtPmluZm9ibG9ja19jc3I2ID0gT01SX0RFRiB8ICgoY3NyNiAmIDB4NzEpIDw8IDE4KTsKKwlscC0+dXNlTUlJID0gRkFMU0U7CisKKwlkZTR4NV9zd2l0Y2hfbWFjX3BvcnQoZGV2KTsKKyAgICB9CisKKyAgICByZXR1cm4gZGMyMTE0MG1fYXV0b2NvbmYoZGV2KTsKK30KKworLyogVGhlc2UgZnVuY3Rpb25zIGFyZSB1bmRlciBjb25zdHJ1Y3Rpb24hICovCisKK3N0YXRpYyBpbnQgCit0eXBlMV9pbmZvYmxvY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9jaGFyIGNvdW50LCB1X2NoYXIgKnApCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgbGVuID0gKCpwICYgQkxPQ0tfTEVOKSsxOworCisgICAgLyogUmVjdXJzaXZlbHkgZmlndXJlIG91dCB0aGUgaW5mbyBibG9ja3MgKi8KKyAgICBpZiAoLS1jb3VudCA+IGxwLT50Y291bnQpIHsKKwlpZiAoKihwK2xlbikgPCAxMjgpIHsKKwkgICAgcmV0dXJuIGRjX2luZm9ibG9ja1tDT01QQUNUXShkZXYsIGNvdW50LCBwK2xlbik7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIGRjX2luZm9ibG9ja1sqKHArbGVuKzEpXShkZXYsIGNvdW50LCBwK2xlbik7CisJfQorICAgIH0KKworICAgIHAgKz0gMjsKKyAgICBpZiAobHAtPnN0YXRlID09IElOSVRJQUxJU0VEKSB7CisgICAgICAgIGxwLT5pYm4gPSAxOworCWxwLT5hY3RpdmUgPSAqcCsrOworCWxwLT5waHlbbHAtPmFjdGl2ZV0uZ2VwID0gKCpwID8gcCA6IE5VTEwpOyBwICs9ICgqcCArIDEpOworCWxwLT5waHlbbHAtPmFjdGl2ZV0ucnN0ID0gKCpwID8gcCA6IE5VTEwpOyBwICs9ICgqcCArIDEpOworCWxwLT5waHlbbHAtPmFjdGl2ZV0ubWMgID0gVFdJRERMRShwKTsgcCArPSAyOworCWxwLT5waHlbbHAtPmFjdGl2ZV0uYW5hID0gVFdJRERMRShwKTsgcCArPSAyOworCWxwLT5waHlbbHAtPmFjdGl2ZV0uZmR4ID0gVFdJRERMRShwKTsgcCArPSAyOworCWxwLT5waHlbbHAtPmFjdGl2ZV0udHRtID0gVFdJRERMRShwKTsKKwlyZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKChscC0+bWVkaWEgPT0gSU5JVCkgJiYgKGxwLT50aW1lb3V0IDwgMCkpIHsKKyAgICAgICAgbHAtPmlibiA9IDE7CisgICAgICAgIGxwLT5hY3RpdmUgPSAqcDsKKwlscC0+aW5mb2Jsb2NrX2NzcjYgPSBPTVJfTUlJXzEwMDsKKwlscC0+dXNlTUlJID0gVFJVRTsKKwlscC0+aW5mb2Jsb2NrX21lZGlhID0gQU5TOworCisJZGU0eDVfc3dpdGNoX21hY19wb3J0KGRldik7CisgICAgfQorCisgICAgcmV0dXJuIGRjMjExNDBtX2F1dG9jb25mKGRldik7Cit9CisKK3N0YXRpYyBpbnQgCit0eXBlMl9pbmZvYmxvY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9jaGFyIGNvdW50LCB1X2NoYXIgKnApCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgbGVuID0gKCpwICYgQkxPQ0tfTEVOKSsxOworCisgICAgLyogUmVjdXJzaXZlbHkgZmlndXJlIG91dCB0aGUgaW5mbyBibG9ja3MgKi8KKyAgICBpZiAoLS1jb3VudCA+IGxwLT50Y291bnQpIHsKKwlpZiAoKihwK2xlbikgPCAxMjgpIHsKKwkgICAgcmV0dXJuIGRjX2luZm9ibG9ja1tDT01QQUNUXShkZXYsIGNvdW50LCBwK2xlbik7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIGRjX2luZm9ibG9ja1sqKHArbGVuKzEpXShkZXYsIGNvdW50LCBwK2xlbik7CisJfQorICAgIH0KKworICAgIGlmICgobHAtPm1lZGlhID09IElOSVQpICYmIChscC0+dGltZW91dCA8IDApKSB7CisgICAgICAgIGxwLT5pYm4gPSAyOworICAgICAgICBscC0+YWN0aXZlID0gMDsKKwlwICs9IDI7CisJbHAtPmluZm9ibG9ja19tZWRpYSA9ICgqcCkgJiBNRURJQV9DT0RFOworCisgICAgICAgIGlmICgoKnArKykgJiBFWFRfRklFTEQpIHsKKwkgICAgbHAtPmNhY2hlLmNzcjEzID0gVFdJRERMRShwKTsgcCArPSAyOworCSAgICBscC0+Y2FjaGUuY3NyMTQgPSBUV0lERExFKHApOyBwICs9IDI7CisJICAgIGxwLT5jYWNoZS5jc3IxNSA9IFRXSURETEUocCk7IHAgKz0gMjsKKwl9IGVsc2UgeworCSAgICBscC0+Y2FjaGUuY3NyMTMgPSBDU1IxMzsKKwkgICAgbHAtPmNhY2hlLmNzcjE0ID0gQ1NSMTQ7CisJICAgIGxwLT5jYWNoZS5jc3IxNSA9IENTUjE1OworCX0KKyAgICAgICAgbHAtPmNhY2hlLmdlcGMgPSAoKHMzMikoVFdJRERMRShwKSkgPDwgMTYpOyBwICs9IDI7CisgICAgICAgIGxwLT5jYWNoZS5nZXAgID0gKChzMzIpKFRXSURETEUocCkpIDw8IDE2KTsKKwlscC0+aW5mb2Jsb2NrX2NzcjYgPSBPTVJfU0lBOworCWxwLT51c2VNSUkgPSBGQUxTRTsKKworCWRlNHg1X3N3aXRjaF9tYWNfcG9ydChkZXYpOworICAgIH0KKworICAgIHJldHVybiBkYzIxMTR4X2F1dG9jb25mKGRldik7Cit9CisKK3N0YXRpYyBpbnQgCit0eXBlM19pbmZvYmxvY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdV9jaGFyIGNvdW50LCB1X2NoYXIgKnApCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgbGVuID0gKCpwICYgQkxPQ0tfTEVOKSsxOworCisgICAgLyogUmVjdXJzaXZlbHkgZmlndXJlIG91dCB0aGUgaW5mbyBibG9ja3MgKi8KKyAgICBpZiAoLS1jb3VudCA+IGxwLT50Y291bnQpIHsKKwlpZiAoKihwK2xlbikgPCAxMjgpIHsKKwkgICAgcmV0dXJuIGRjX2luZm9ibG9ja1tDT01QQUNUXShkZXYsIGNvdW50LCBwK2xlbik7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIGRjX2luZm9ibG9ja1sqKHArbGVuKzEpXShkZXYsIGNvdW50LCBwK2xlbik7CisJfQorICAgIH0KKworICAgIHAgKz0gMjsKKyAgICBpZiAobHAtPnN0YXRlID09IElOSVRJQUxJU0VEKSB7CisgICAgICAgIGxwLT5pYm4gPSAzOworICAgICAgICBscC0+YWN0aXZlID0gKnArKzsKKwlpZiAoTU9UT19TUk9NX0JVRykgbHAtPmFjdGl2ZSA9IDA7CisJbHAtPnBoeVtscC0+YWN0aXZlXS5nZXAgPSAoKnAgPyBwIDogTlVMTCk7IHAgKz0gKDIgKiAoKnApICsgMSk7CisJbHAtPnBoeVtscC0+YWN0aXZlXS5yc3QgPSAoKnAgPyBwIDogTlVMTCk7IHAgKz0gKDIgKiAoKnApICsgMSk7CisJbHAtPnBoeVtscC0+YWN0aXZlXS5tYyAgPSBUV0lERExFKHApOyBwICs9IDI7CisJbHAtPnBoeVtscC0+YWN0aXZlXS5hbmEgPSBUV0lERExFKHApOyBwICs9IDI7CisJbHAtPnBoeVtscC0+YWN0aXZlXS5mZHggPSBUV0lERExFKHApOyBwICs9IDI7CisJbHAtPnBoeVtscC0+YWN0aXZlXS50dG0gPSBUV0lERExFKHApOyBwICs9IDI7CisJbHAtPnBoeVtscC0+YWN0aXZlXS5tY2kgPSAqcDsKKwlyZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKChscC0+bWVkaWEgPT0gSU5JVCkgJiYgKGxwLT50aW1lb3V0IDwgMCkpIHsKKyAgICAgICAgbHAtPmlibiA9IDM7CisJbHAtPmFjdGl2ZSA9ICpwOworCWlmIChNT1RPX1NST01fQlVHKSBscC0+YWN0aXZlID0gMDsKKwlscC0+aW5mb2Jsb2NrX2NzcjYgPSBPTVJfTUlJXzEwMDsKKwlscC0+dXNlTUlJID0gVFJVRTsKKwlscC0+aW5mb2Jsb2NrX21lZGlhID0gQU5TOworCisJZGU0eDVfc3dpdGNoX21hY19wb3J0KGRldik7CisgICAgfQorCisgICAgcmV0dXJuIGRjMjExNHhfYXV0b2NvbmYoZGV2KTsKK30KKworc3RhdGljIGludCAKK3R5cGU0X2luZm9ibG9jayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgY291bnQsIHVfY2hhciAqcCkKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciBmbGFncywgY3NyNiwgbGVuID0gKCpwICYgQkxPQ0tfTEVOKSsxOworCisgICAgLyogUmVjdXJzaXZlbHkgZmlndXJlIG91dCB0aGUgaW5mbyBibG9ja3MgKi8KKyAgICBpZiAoLS1jb3VudCA+IGxwLT50Y291bnQpIHsKKwlpZiAoKihwK2xlbikgPCAxMjgpIHsKKwkgICAgcmV0dXJuIGRjX2luZm9ibG9ja1tDT01QQUNUXShkZXYsIGNvdW50LCBwK2xlbik7CisJfSBlbHNlIHsKKwkgICAgcmV0dXJuIGRjX2luZm9ibG9ja1sqKHArbGVuKzEpXShkZXYsIGNvdW50LCBwK2xlbik7CisJfQorICAgIH0KKworICAgIGlmICgobHAtPm1lZGlhID09IElOSVQpICYmIChscC0+dGltZW91dCA8IDApKSB7CisgICAgICAgIGxwLT5pYm4gPSA0OworICAgICAgICBscC0+YWN0aXZlID0gMDsKKwlwKz0yOworCWxwLT5pbmZvYmxvY2tfbWVkaWEgPSAoKnArKykgJiBNRURJQV9DT0RFOworICAgICAgICBscC0+Y2FjaGUuY3NyMTMgPSBDU1IxMzsgICAgICAgICAgICAgIC8qIEhhcmQgY29kZWQgZGVmYXVsdHMgKi8KKwlscC0+Y2FjaGUuY3NyMTQgPSBDU1IxNDsKKwlscC0+Y2FjaGUuY3NyMTUgPSBDU1IxNTsKKyAgICAgICAgbHAtPmNhY2hlLmdlcGMgPSAoKHMzMikoVFdJRERMRShwKSkgPDwgMTYpOyBwICs9IDI7CisgICAgICAgIGxwLT5jYWNoZS5nZXAgID0gKChzMzIpKFRXSURETEUocCkpIDw8IDE2KTsgcCArPSAyOworCWNzcjYgPSAqcCsrOworCWZsYWdzID0gKnArKzsKKworCWxwLT5hc0JpdFZhbGlkID0gKGZsYWdzICYgMHg4MCkgPyAwIDogLTE7CisJbHAtPmRlZk1lZGl1bSA9IChmbGFncyAmIDB4NDApID8gLTEgOiAwOworCWxwLT5hc0JpdCA9IDEgPDwgKChjc3I2ID4+IDEpICYgMHgwNyk7CisJbHAtPmFzUG9sYXJpdHkgPSAoKGNzcjYgJiAweDgwKSA/IC0xIDogMCkgJiBscC0+YXNCaXQ7CisJbHAtPmluZm9ibG9ja19jc3I2ID0gT01SX0RFRiB8ICgoY3NyNiAmIDB4NzEpIDw8IDE4KTsKKwlscC0+dXNlTUlJID0gRkFMU0U7CisKKwlkZTR4NV9zd2l0Y2hfbWFjX3BvcnQoZGV2KTsKKyAgICB9CisKKyAgICByZXR1cm4gZGMyMTE0eF9hdXRvY29uZihkZXYpOworfQorCisvKgorKiogVGhpcyBibG9jayB0eXBlIHByb3ZpZGVzIGluZm9ybWF0aW9uIGZvciByZXNldHRpbmcgZXh0ZXJuYWwgZGV2aWNlcworKiogKGNoaXBzKSB0aHJvdWdoIHRoZSBHZW5lcmFsIFB1cnBvc2UgUmVnaXN0ZXIuCisqLworc3RhdGljIGludCAKK3R5cGU1X2luZm9ibG9jayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1X2NoYXIgY291bnQsIHVfY2hhciAqcCkKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciBsZW4gPSAoKnAgJiBCTE9DS19MRU4pKzE7CisKKyAgICAvKiBSZWN1cnNpdmVseSBmaWd1cmUgb3V0IHRoZSBpbmZvIGJsb2NrcyAqLworICAgIGlmICgtLWNvdW50ID4gbHAtPnRjb3VudCkgeworCWlmICgqKHArbGVuKSA8IDEyOCkgeworCSAgICByZXR1cm4gZGNfaW5mb2Jsb2NrW0NPTVBBQ1RdKGRldiwgY291bnQsIHArbGVuKTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gZGNfaW5mb2Jsb2NrWyoocCtsZW4rMSldKGRldiwgY291bnQsIHArbGVuKTsKKwl9CisgICAgfQorCisgICAgLyogTXVzdCBiZSBpbml0aWFsaXppbmcgdG8gcnVuIHRoaXMgY29kZSAqLworICAgIGlmICgobHAtPnN0YXRlID09IElOSVRJQUxJU0VEKSB8fCAobHAtPm1lZGlhID09IElOSVQpKSB7CisJcCs9MjsKKyAgICAgICAgbHAtPnJzdCA9IHA7CisgICAgICAgIHNyb21fZXhlYyhkZXYsIGxwLT5yc3QpOworICAgIH0KKworICAgIHJldHVybiBERTRYNV9BVVRPU0VOU0VfTVM7Cit9CisKKy8qCisqKiBNSUkgUmVhZC9Xcml0ZQorKi8KKworc3RhdGljIGludAorbWlpX3JkKHVfY2hhciBwaHlyZWcsIHVfY2hhciBwaHlhZGRyLCB1X2xvbmcgaW9hZGRyKQoreworICAgIG1paV93ZGF0YShNSUlfUFJFQU1CTEUsICAyLCBpb2FkZHIpOyAgIC8qIFN0YXJ0IG9mIDM0IGJpdCBwcmVhbWJsZS4uLiAgICAqLworICAgIG1paV93ZGF0YShNSUlfUFJFQU1CTEUsIDMyLCBpb2FkZHIpOyAgIC8qIC4uLmNvbnRpbnVlZCAgICAgICAgICAgICAgICAgICAqLworICAgIG1paV93ZGF0YShNSUlfU1RSRCwgNCwgaW9hZGRyKTsgICAgICAgIC8qIFNGRCBhbmQgUmVhZCBvcGVyYXRpb24gICAgICAgICAqLworICAgIG1paV9hZGRyZXNzKHBoeWFkZHIsIGlvYWRkcik7ICAgICAgICAgIC8qIFBIWSBhZGRyZXNzIHRvIGJlIGFjY2Vzc2VkICAgICAqLworICAgIG1paV9hZGRyZXNzKHBoeXJlZywgaW9hZGRyKTsgICAgICAgICAgIC8qIFBIWSBSZWdpc3RlciB0byByZWFkICAgICAgICAgICAqLworICAgIG1paV90YShNSUlfU1RSRCwgaW9hZGRyKTsgICAgICAgICAgICAgIC8qIFR1cm4gYXJvdW5kIHRpbWUgLSAyIE1EQyAgICAgICAqLworICAgIAorICAgIHJldHVybiBtaWlfcmRhdGEoaW9hZGRyKTsgICAgICAgICAgICAgIC8qIFJlYWQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAqLworfQorCitzdGF0aWMgdm9pZAorbWlpX3dyKGludCBkYXRhLCB1X2NoYXIgcGh5cmVnLCB1X2NoYXIgcGh5YWRkciwgdV9sb25nIGlvYWRkcikKK3sKKyAgICBtaWlfd2RhdGEoTUlJX1BSRUFNQkxFLCAgMiwgaW9hZGRyKTsgICAvKiBTdGFydCBvZiAzNCBiaXQgcHJlYW1ibGUuLi4gICAgKi8KKyAgICBtaWlfd2RhdGEoTUlJX1BSRUFNQkxFLCAzMiwgaW9hZGRyKTsgICAvKiAuLi5jb250aW51ZWQgICAgICAgICAgICAgICAgICAgKi8KKyAgICBtaWlfd2RhdGEoTUlJX1NUV1IsIDQsIGlvYWRkcik7ICAgICAgICAvKiBTRkQgYW5kIFdyaXRlIG9wZXJhdGlvbiAgICAgICAgKi8KKyAgICBtaWlfYWRkcmVzcyhwaHlhZGRyLCBpb2FkZHIpOyAgICAgICAgICAvKiBQSFkgYWRkcmVzcyB0byBiZSBhY2Nlc3NlZCAgICAgKi8KKyAgICBtaWlfYWRkcmVzcyhwaHlyZWcsIGlvYWRkcik7ICAgICAgICAgICAvKiBQSFkgUmVnaXN0ZXIgdG8gd3JpdGUgICAgICAgICAgKi8KKyAgICBtaWlfdGEoTUlJX1NUV1IsIGlvYWRkcik7ICAgICAgICAgICAgICAvKiBUdXJuIGFyb3VuZCB0aW1lIC0gMiBNREMgICAgICAgKi8KKyAgICBkYXRhID0gbWlpX3N3YXAoZGF0YSwgMTYpOyAgICAgICAgICAgICAvKiBTd2FwIGRhdGEgYml0IG9yZGVyaW5nICAgICAgICAgKi8KKyAgICBtaWlfd2RhdGEoZGF0YSwgMTYsIGlvYWRkcik7ICAgICAgICAgICAvKiBXcml0ZSBkYXRhICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKK21paV9yZGF0YSh1X2xvbmcgaW9hZGRyKQoreworICAgIGludCBpOworICAgIHMzMiB0bXAgPSAwOworICAgIAorICAgIGZvciAoaT0wOyBpPDE2OyBpKyspIHsKKwl0bXAgPDw9IDE7CisJdG1wIHw9IGdldGZyb21fbWlpKE1JSV9NUkQgfCBNSUlfUkQsIGlvYWRkcik7CisgICAgfQorICAgIAorICAgIHJldHVybiB0bXA7Cit9CisKK3N0YXRpYyB2b2lkCittaWlfd2RhdGEoaW50IGRhdGEsIGludCBsZW4sIHVfbG9uZyBpb2FkZHIpCit7CisgICAgaW50IGk7CisgICAgCisgICAgZm9yIChpPTA7IGk8bGVuOyBpKyspIHsKKwlzZW5kdG9fbWlpKE1JSV9NV1IgfCBNSUlfV1IsIGRhdGEsIGlvYWRkcik7CisJZGF0YSA+Pj0gMTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorbWlpX2FkZHJlc3ModV9jaGFyIGFkZHIsIHVfbG9uZyBpb2FkZHIpCit7CisgICAgaW50IGk7CisgICAgCisgICAgYWRkciA9IG1paV9zd2FwKGFkZHIsIDUpOworICAgIGZvciAoaT0wOyBpPDU7IGkrKykgeworCXNlbmR0b19taWkoTUlJX01XUiB8IE1JSV9XUiwgYWRkciwgaW9hZGRyKTsKKwlhZGRyID4+PSAxOworICAgIH0KKyAgICAKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCittaWlfdGEodV9sb25nIHJ3LCB1X2xvbmcgaW9hZGRyKQoreworICAgIGlmIChydyA9PSBNSUlfU1RXUikgeworCXNlbmR0b19taWkoTUlJX01XUiB8IE1JSV9XUiwgMSwgaW9hZGRyKTsgIAorCXNlbmR0b19taWkoTUlJX01XUiB8IE1JSV9XUiwgMCwgaW9hZGRyKTsgIAorICAgIH0gZWxzZSB7CisJZ2V0ZnJvbV9taWkoTUlJX01SRCB8IE1JSV9SRCwgaW9hZGRyKTsgICAgICAgIC8qIFRyaS1zdGF0ZSBNRElPICovCisgICAgfQorICAgIAorICAgIHJldHVybjsKK30KKworc3RhdGljIGludAorbWlpX3N3YXAoaW50IGRhdGEsIGludCBsZW4pCit7CisgICAgaW50IGksIHRtcCA9IDA7CisgICAgCisgICAgZm9yIChpPTA7IGk8bGVuOyBpKyspIHsKKwl0bXAgPDw9IDE7CisJdG1wIHw9IChkYXRhICYgMSk7CisJZGF0YSA+Pj0gMTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHRtcDsKK30KKworc3RhdGljIHZvaWQKK3NlbmR0b19taWkodTMyIGNvbW1hbmQsIGludCBkYXRhLCB1X2xvbmcgaW9hZGRyKQoreworICAgIHUzMiBqOworICAgIAorICAgIGogPSAoZGF0YSAmIDEpIDw8IDE3OworICAgIG91dGwoY29tbWFuZCB8IGosIGlvYWRkcik7CisgICAgdWRlbGF5KDEpOworICAgIG91dGwoY29tbWFuZCB8IE1JSV9NREMgfCBqLCBpb2FkZHIpOworICAgIHVkZWxheSgxKTsKKyAgICAKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKK2dldGZyb21fbWlpKHUzMiBjb21tYW5kLCB1X2xvbmcgaW9hZGRyKQoreworICAgIG91dGwoY29tbWFuZCwgaW9hZGRyKTsKKyAgICB1ZGVsYXkoMSk7CisgICAgb3V0bChjb21tYW5kIHwgTUlJX01EQywgaW9hZGRyKTsKKyAgICB1ZGVsYXkoMSk7CisgICAgCisgICAgcmV0dXJuICgoaW5sKGlvYWRkcikgPj4gMTkpICYgMSk7Cit9CisKKy8qCisqKiBIZXJlJ3MgMyB3YXlzIHRvIGNhbGN1bGF0ZSB0aGUgT1VJIGZyb20gdGhlIElEIHJlZ2lzdGVycy4KKyovCitzdGF0aWMgaW50CittaWlfZ2V0X291aSh1X2NoYXIgcGh5YWRkciwgdV9sb25nIGlvYWRkcikKK3sKKy8qCisgICAgdW5pb24geworCXVfc2hvcnQgcmVnOworCXVfY2hhciBicmVnWzJdOworICAgIH0gYTsKKyAgICBpbnQgaSwgcjIsIHIzLCByZXQ9MDsqLworICAgIGludCByMiwgcjM7CisKKyAgICAvKiBSZWFkIHIyIGFuZCByMyAqLworICAgIHIyID0gbWlpX3JkKE1JSV9JRDAsIHBoeWFkZHIsIGlvYWRkcik7CisgICAgcjMgPSBtaWlfcmQoTUlJX0lEMSwgcGh5YWRkciwgaW9hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNFRVEgYW5kIEN5cHJlc3Mgd2F5ICogLworICAgIC8gKiBTaHVmZmxlIHIyIGFuZCByMyAqIC8KKyAgICBhLnJlZz0wOworICAgIHIzID0gKChyMz4+MTApfChyMjw8NikpJjB4MGZmOworICAgIHIyID0gKChyMj4+MikmMHgzZmZmKTsKKworICAgIC8gKiBCaXQgcmV2ZXJzZSByMyAqIC8KKyAgICBmb3IgKGk9MDtpPDg7aSsrKSB7CisJcmV0PDw9MTsKKwlyZXQgfD0gKHIzJjEpOworCXIzPj49MTsKKyAgICB9CisKKyAgICAvICogQml0IHJldmVyc2UgcjIgKiAvCisgICAgZm9yIChpPTA7aTwxNjtpKyspIHsKKwlhLnJlZzw8PTE7CisJYS5yZWcgfD0gKHIyJjEpOworCXIyPj49MTsKKyAgICB9CisKKyAgICAvICogU3dhcCByMiBieXRlcyAqIC8KKyAgICBpPWEuYnJlZ1swXTsKKyAgICBhLmJyZWdbMF09YS5icmVnWzFdOworICAgIGEuYnJlZ1sxXT1pOworCisgICAgcmV0dXJuICgoYS5yZWc8PDgpfHJldCk7ICovICAgICAgICAgICAgICAgICAvKiBTRUVRIGFuZCBDeXByZXNzIHdheSAqLworLyogICAgcmV0dXJuICgocjI8PDYpfCh1X2ludCkocjM+PjEwKSk7ICovICAgICAgLyogTkFUSU9OQUwgYW5kIEJST0FEQ09NIHdheSAqLworICAgIHJldHVybiByMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKEkgZGlkIGl0KSBNeSB3YXkgKi8KK30KKworLyoKKyoqIFRoZSBTUk9NIHNwZWMgZm9yY2VzIHVzIHRvIHNlYXJjaCBhZGRyZXNzZXMgWzEtMzEgMF0uIEJ1bW1lci4KKyovCitzdGF0aWMgaW50CittaWlfZ2V0X3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgdV9sb25nIGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGludCBpLCBqLCBrLCBuLCBsaW1pdD1zaXplb2YocGh5X2luZm8pL3NpemVvZihzdHJ1Y3QgcGh5X3RhYmxlKTsKKyAgICBpbnQgaWQ7CisgICAgCisgICAgbHAtPmFjdGl2ZSA9IDA7CisgICAgbHAtPnVzZU1JSSA9IFRSVUU7CisKKyAgICAvKiBTZWFyY2ggdGhlIE1JSSBhZGRyZXNzIHNwYWNlIGZvciBwb3NzaWJsZSBQSFkgZGV2aWNlcyAqLworICAgIGZvciAobj0wLCBscC0+bWlpX2NudD0wLCBpPTE7ICEoKGk9PTEpICYmIChuPT0xKSk7IGk9KGkrMSklREU0WDVfTUFYX01JSSkgeworCWxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkciA9IGk7CisJaWYgKGk9PTApIG4rKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvdW50IGN5Y2xlcyAqLworCXdoaWxlIChkZTR4NV9yZXNldF9waHkoZGV2KTwwKSB1ZGVsYXkoMTAwKTsvKiBXYWl0IGZvciByZXNldCAqLworCWlkID0gbWlpX2dldF9vdWkoaSwgREU0WDVfTUlJKTsgCisJaWYgKChpZCA9PSAwKSB8fCAoaWQgPT0gNjU1MzUpKSBjb250aW51ZTsgIC8qIFZhbGlkIElEPyAqLworCWZvciAoaj0wOyBqPGxpbWl0OyBqKyspIHsgICAgICAgICAgICAgICAgICAvKiBTZWFyY2ggUEhZIHRhYmxlICovCisJICAgIGlmIChpZCAhPSBwaHlfaW5mb1tqXS5pZCkgY29udGludWU7ICAgIC8qIElEIG1hdGNoPyAqLworCSAgICBmb3IgKGs9MDsgbHAtPnBoeVtrXS5pZCAmJiAoayA8IERFNFg1X01BWF9QSFkpOyBrKyspOworCSAgICBpZiAoayA8IERFNFg1X01BWF9QSFkpIHsKKwkJbWVtY3B5KChjaGFyICopJmxwLT5waHlba10sCisJCSAgICAgICAoY2hhciAqKSZwaHlfaW5mb1tqXSwgc2l6ZW9mKHN0cnVjdCBwaHlfdGFibGUpKTsKKwkJbHAtPnBoeVtrXS5hZGRyID0gaTsKKwkJbHAtPm1paV9jbnQrKzsKKwkJbHAtPmFjdGl2ZSsrOworCSAgICB9IGVsc2UgeworCQlnb3RvIHB1cmdhdG9yeTsgICAgICAgICAgICAgICAgICAgIC8qIFN0b3AgdGhlIHNlYXJjaCAqLworCSAgICB9CisJICAgIGJyZWFrOworCX0KKwlpZiAoKGogPT0gbGltaXQpICYmIChpIDwgREU0WDVfTUFYX01JSSkpIHsKKwkgICAgZm9yIChrPTA7IGxwLT5waHlba10uaWQgJiYgKGsgPCBERTRYNV9NQVhfUEhZKTsgaysrKTsKKwkgICAgbHAtPnBoeVtrXS5hZGRyID0gaTsKKwkgICAgbHAtPnBoeVtrXS5pZCA9IGlkOworCSAgICBscC0+cGh5W2tdLnNwZC5yZWcgPSBHRU5FUklDX1JFRzsgICAgICAvKiBBTkxQQSByZWdpc3RlciAgICAgICAgICovCisJICAgIGxwLT5waHlba10uc3BkLm1hc2sgPSBHRU5FUklDX01BU0s7ICAgIC8qIDEwME1iL3MgdGVjaG5vbG9naWVzICAgKi8KKwkgICAgbHAtPnBoeVtrXS5zcGQudmFsdWUgPSBHRU5FUklDX1ZBTFVFOyAgLyogVFggJiBUNCwgSC9GIER1cGxleCAgICAqLworCSAgICBscC0+bWlpX2NudCsrOworCSAgICBscC0+YWN0aXZlKys7CisJICAgIHByaW50aygiJXM6IFVzaW5nIGdlbmVyaWMgTUlJIGRldmljZSBjb250cm9sLiBJZiB0aGUgYm9hcmQgZG9lc24ndCBvcGVyYXRlLCBcbnBsZWFzZSBtYWlsIHRoZSBmb2xsb3dpbmcgZHVtcCB0byB0aGUgYXV0aG9yOlxuIiwgZGV2LT5uYW1lKTsKKwkgICAgaiA9IGRlNHg1X2RlYnVnOworCSAgICBkZTR4NV9kZWJ1ZyB8PSBERUJVR19NSUk7CisJICAgIGRlNHg1X2RiZ19taWkoZGV2LCBrKTsKKwkgICAgZGU0eDVfZGVidWcgPSBqOworCSAgICBwcmludGsoIlxuIik7CisJfQorICAgIH0KKyAgcHVyZ2F0b3J5OgorICAgIGxwLT5hY3RpdmUgPSAwOworICAgIGlmIChscC0+cGh5WzBdLmlkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzZXQgdGhlIFBIWSBkZXZpY2VzICovCisJZm9yIChrPTA7IGxwLT5waHlba10uaWQgJiYgKGsgPCBERTRYNV9NQVhfUEhZKTsgaysrKSB7IC8qRm9yIGVhY2ggUEhZKi8KKwkgICAgbWlpX3dyKE1JSV9DUl9SU1QsIE1JSV9DUiwgbHAtPnBoeVtrXS5hZGRyLCBERTRYNV9NSUkpOworCSAgICB3aGlsZSAobWlpX3JkKE1JSV9DUiwgbHAtPnBoeVtrXS5hZGRyLCBERTRYNV9NSUkpICYgTUlJX0NSX1JTVCk7CisJICAgIAorCSAgICBkZTR4NV9kYmdfbWlpKGRldiwgayk7CisJfQorICAgIH0KKyAgICBpZiAoIWxwLT5taWlfY250KSBscC0+dXNlTUlJID0gRkFMU0U7CisKKyAgICByZXR1cm4gbHAtPm1paV9jbnQ7Cit9CisKK3N0YXRpYyBjaGFyICoKK2J1aWxkX3NldHVwX2ZyYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtb2RlKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IGk7CisgICAgY2hhciAqcGEgPSBscC0+c2V0dXBfZnJhbWU7CisgICAgCisgICAgLyogSW5pdGlhbGlzZSB0aGUgc2V0dXAgZnJhbWUgKi8KKyAgICBpZiAobW9kZSA9PSBBTEwpIHsKKwltZW1zZXQobHAtPnNldHVwX2ZyYW1lLCAwLCBTRVRVUF9GUkFNRV9MRU4pOworICAgIH0KKyAgICAKKyAgICBpZiAobHAtPnNldHVwX2YgPT0gSEFTSF9QRVJGKSB7CisJZm9yIChwYT1scC0+c2V0dXBfZnJhbWUrSU1QRVJGX1BBX09GRlNFVCwgaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsKKwkgICAgKihwYSArIGkpID0gZGV2LT5kZXZfYWRkcltpXTsgICAgICAgICAgICAgICAgIC8qIEhvc3QgYWRkcmVzcyAqLworCSAgICBpZiAoaSAmIDB4MDEpIHBhICs9IDI7CisJfQorCSoobHAtPnNldHVwX2ZyYW1lICsgKEhBU0hfVEFCTEVfTEVOID4+IDMpIC0gMykgPSAweDgwOworICAgIH0gZWxzZSB7CisJZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgeyAvKiBIb3N0IGFkZHJlc3MgKi8KKwkgICAgKihwYSArIChpJjEpKSA9IGRldi0+ZGV2X2FkZHJbaV07CisJICAgIGlmIChpICYgMHgwMSkgcGEgKz0gNDsKKwl9CisJZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgeyAvKiBCcm9hZGNhc3QgYWRkcmVzcyAqLworCSAgICAqKHBhICsgKGkmMSkpID0gKGNoYXIpIDB4ZmY7CisJICAgIGlmIChpICYgMHgwMSkgcGEgKz0gNDsKKwl9CisgICAgfQorICAgIAorICAgIHJldHVybiBwYTsgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludHMgdG8gdGhlIG5leHQgZW50cnkgKi8KK30KKworc3RhdGljIHZvaWQKK2VuYWJsZV9hc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHRpbWVfb3V0KQoreworICAgIHRpbWVvdXQoZGV2LCAodm9pZCAqKSZkZTR4NV9hc3QsICh1X2xvbmcpZGV2LCB0aW1lX291dCk7CisgICAgCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZGlzYWJsZV9hc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIAorICAgIGRlbF90aW1lcigmbHAtPnRpbWVyKTsKKyAgICAKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyBsb25nCitkZTR4NV9zd2l0Y2hfbWFjX3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBzMzIgb21yOworCisgICAgU1RPUF9ERTRYNTsKKworICAgIC8qIEFzc2VydCB0aGUgT01SX1BTIGJpdCBpbiBDU1I2ICovCisgICAgb21yID0gKGlubChERTRYNV9PTVIpICYgfihPTVJfUFMgfCBPTVJfSEJEIHwgT01SX1RUTSB8IE9NUl9QQ1MgfCBPTVJfU0NSIHwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NUl9GRFgpKTsKKyAgICBvbXIgfD0gbHAtPmluZm9ibG9ja19jc3I2OworICAgIGlmIChvbXIgJiBPTVJfUFMpIG9tciB8PSBPTVJfSEJEOworICAgIG91dGwob21yLCBERTRYNV9PTVIpOworICAgIAorICAgIC8qIFNvZnQgUmVzZXQgKi8KKyAgICBSRVNFVF9ERTRYNTsKKyAgICAKKyAgICAvKiBSZXN0b3JlIHRoZSBHRVAgLSBlc3BlY2lhbGx5IGZvciBDT01QQUNUIGFuZCBUeXBlIDAgSW5mb2Jsb2NrcyAqLworICAgIGlmIChscC0+Y2hpcHNldCA9PSBEQzIxMTQwKSB7CisJZ2VwX3dyKGxwLT5jYWNoZS5nZXBjLCBkZXYpOworCWdlcF93cihscC0+Y2FjaGUuZ2VwLCBkZXYpOworICAgIH0gZWxzZSBpZiAoKGxwLT5jaGlwc2V0ICYgfjB4MGZmKSA9PSBEQzIxMTR4KSB7CisJcmVzZXRfaW5pdF9zaWEoZGV2LCBscC0+Y2FjaGUuY3NyMTMsIGxwLT5jYWNoZS5jc3IxNCwgbHAtPmNhY2hlLmNzcjE1KTsKKyAgICB9CisKKyAgICAvKiBSZXN0b3JlIENTUjYgKi8KKyAgICBvdXRsKG9tciwgREU0WDVfT01SKTsKKworICAgIC8qIFJlc2V0IENTUjggKi8KKyAgICBpbmwoREU0WDVfTUZDKTsKKworICAgIHJldHVybiBvbXI7Cit9CisKK3N0YXRpYyB2b2lkCitnZXBfd3IoczMyIGRhdGEsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBpZiAobHAtPmNoaXBzZXQgPT0gREMyMTE0MCkgeworCW91dGwoZGF0YSwgREU0WDVfR0VQKTsKKyAgICB9IGVsc2UgaWYgKChscC0+Y2hpcHNldCAmIH4weDAwZmYpID09IERDMjExNHgpIHsKKwlvdXRsKChkYXRhPDwxNikgfCBscC0+Y2FjaGUuY3NyMTUsIERFNFg1X1NJR1IpOworICAgIH0KKworICAgIHJldHVybjsKK30KKworc3RhdGljIGludAorZ2VwX3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBpZiAobHAtPmNoaXBzZXQgPT0gREMyMTE0MCkgeworCXJldHVybiBpbmwoREU0WDVfR0VQKTsKKyAgICB9IGVsc2UgaWYgKChscC0+Y2hpcHNldCAmIH4weDAwZmYpID09IERDMjExNHgpIHsKKwlyZXR1cm4gKGlubChERTRYNV9TSUdSKSAmIDB4MDAwZmZmZmYpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAordGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICgqZm4pKHVfbG9uZyBkYXRhKSwgdV9sb25nIGRhdGEsIHVfbG9uZyBtc2VjKQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgaW50IGR0OworICAgIAorICAgIC8qIEZpcnN0LCBjYW5jZWwgYW55IHBlbmRpbmcgdGltZXIgZXZlbnRzICovCisgICAgZGVsX3RpbWVyKCZscC0+dGltZXIpOworICAgIAorICAgIC8qIENvbnZlcnQgbXNlYyB0byB0aWNrcyAqLworICAgIGR0ID0gKG1zZWMgKiBIWikgLyAxMDAwOworICAgIGlmIChkdD09MCkgZHQ9MTsKKyAgICAKKyAgICAvKiBTZXQgdXAgdGltZXIgKi8KKyAgICBpbml0X3RpbWVyKCZscC0+dGltZXIpOworICAgIGxwLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIGR0OworICAgIGxwLT50aW1lci5mdW5jdGlvbiA9IGZuOworICAgIGxwLT50aW1lci5kYXRhID0gZGF0YTsKKyAgICBhZGRfdGltZXIoJmxwLT50aW1lcik7CisgICAgCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAoreWF3bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RhdGUpCit7CisgICAgc3RydWN0IGRlNHg1X3ByaXZhdGUgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2xvbmcgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyAgICBpZiAoKGxwLT5jaGlwc2V0ID09IERDMjEwNDApIHx8IChscC0+Y2hpcHNldCA9PSBEQzIxMTQwKSkgcmV0dXJuOworCisgICAgaWYobHAtPmJ1cyA9PSBFSVNBKSB7CisJc3dpdGNoKHN0YXRlKSB7CisJICBjYXNlIFdBS0VVUDoKKwkgICAgb3V0YihXQUtFVVAsIFBDSV9DRlBNKTsKKwkgICAgbWRlbGF5KDEwKTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgU05PT1pFOgorCSAgICBvdXRiKFNOT09aRSwgUENJX0NGUE0pOworCSAgICBicmVhazsKKworCSAgY2FzZSBTTEVFUDoKKwkgICAgb3V0bCgwLCBERTRYNV9TSUNSKTsKKwkgICAgb3V0YihTTEVFUCwgUENJX0NGUE0pOworCSAgICBicmVhazsKKwl9CisgICAgfSBlbHNlIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYgKGxwLT5nZW5kZXYpOworCXN3aXRjaChzdGF0ZSkgeworCSAgY2FzZSBXQUtFVVA6CisJICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0ZEQV9QU00sIFdBS0VVUCk7CisJICAgIG1kZWxheSgxMCk7CisJICAgIGJyZWFrOworCisJICBjYXNlIFNOT09aRToKKwkgICAgcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DRkRBX1BTTSwgU05PT1pFKTsKKwkgICAgYnJlYWs7CisKKwkgIGNhc2UgU0xFRVA6CisJICAgIG91dGwoMCwgREU0WDVfU0lDUik7CisJICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0ZEQV9QU00sIFNMRUVQKTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2RlNHg1X3BhcnNlX3BhcmFtcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHN0cnVjdCBkZTR4NV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7CisgICAgY2hhciAqcCwgKnEsIHQ7CisKKyAgICBscC0+cGFyYW1zLmZkeCA9IDA7CisgICAgbHAtPnBhcmFtcy5hdXRvc2Vuc2UgPSBBVVRPOworCisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgcmV0dXJuOworCisgICAgaWYgKChwID0gc3Ryc3RyKGFyZ3MsIGRldi0+bmFtZSkpKSB7CisJaWYgKCEocSA9IHN0cnN0cihwK3N0cmxlbihkZXYtPm5hbWUpLCAiZXRoIikpKSBxID0gcCArIHN0cmxlbihwKTsKKwl0ID0gKnE7CisJKnEgPSAnXDAnOworCisJaWYgKHN0cnN0cihwLCAiZmR4IikgfHwgc3Ryc3RyKHAsICJGRFgiKSkgbHAtPnBhcmFtcy5mZHggPSAxOworCisJaWYgKHN0cnN0cihwLCAiYXV0b3NlbnNlIikgfHwgc3Ryc3RyKHAsICJBVVRPU0VOU0UiKSkgeworCSAgICBpZiAoc3Ryc3RyKHAsICJUUCIpKSB7CisJCWxwLT5wYXJhbXMuYXV0b3NlbnNlID0gVFA7CisJICAgIH0gZWxzZSBpZiAoc3Ryc3RyKHAsICJUUF9OVyIpKSB7CisJCWxwLT5wYXJhbXMuYXV0b3NlbnNlID0gVFBfTlc7CisJICAgIH0gZWxzZSBpZiAoc3Ryc3RyKHAsICJCTkMiKSkgeworCQlscC0+cGFyYW1zLmF1dG9zZW5zZSA9IEJOQzsKKwkgICAgfSBlbHNlIGlmIChzdHJzdHIocCwgIkFVSSIpKSB7CisJCWxwLT5wYXJhbXMuYXV0b3NlbnNlID0gQVVJOworCSAgICB9IGVsc2UgaWYgKHN0cnN0cihwLCAiQk5DX0FVSSIpKSB7CisJCWxwLT5wYXJhbXMuYXV0b3NlbnNlID0gQk5DOworCSAgICB9IGVsc2UgaWYgKHN0cnN0cihwLCAiMTBNYiIpKSB7CisJCWxwLT5wYXJhbXMuYXV0b3NlbnNlID0gXzEwTWI7CisJICAgIH0gZWxzZSBpZiAoc3Ryc3RyKHAsICIxMDBNYiIpKSB7CisJCWxwLT5wYXJhbXMuYXV0b3NlbnNlID0gXzEwME1iOworCSAgICB9IGVsc2UgaWYgKHN0cnN0cihwLCAiQVVUTyIpKSB7CisJCWxwLT5wYXJhbXMuYXV0b3NlbnNlID0gQVVUTzsKKwkgICAgfQorCX0KKwkqcSA9IHQ7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZGU0eDVfZGJnX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGludCBpOworICAgIAorICAgIGlmIChkZTR4NV9kZWJ1ZyAmIERFQlVHX09QRU4pIHsKKwlwcmludGsoIiVzOiBkZTR4NSBvcGVuaW5nIHdpdGggaXJxICVkXG4iLGRldi0+bmFtZSxkZXYtPmlycSk7CisJcHJpbnRrKCJcdHBoeXNpY2FsIGFkZHJlc3M6ICIpOworCWZvciAoaT0wO2k8NjtpKyspIHsKKwkgICAgcHJpbnRrKCIlMi4yeDoiLChzaG9ydClkZXYtPmRldl9hZGRyW2ldKTsKKwl9CisJcHJpbnRrKCJcbiIpOworCXByaW50aygiRGVzY3JpcHRvciBoZWFkIGFkZHJlc3NlczpcbiIpOworCXByaW50aygiXHQweCU4LjhseCAgMHglOC44bHhcbiIsKHVfbG9uZylscC0+cnhfcmluZywodV9sb25nKWxwLT50eF9yaW5nKTsKKwlwcmludGsoIkRlc2NyaXB0b3IgYWRkcmVzc2VzOlxuUlg6ICIpOworCWZvciAoaT0wO2k8bHAtPnJ4UmluZ1NpemUtMTtpKyspeworCSAgICBpZiAoaSA8IDMpIHsKKwkJcHJpbnRrKCIweCU4LjhseCAgIiwodV9sb25nKSZscC0+cnhfcmluZ1tpXS5zdGF0dXMpOworCSAgICB9CisJfQorCXByaW50aygiLi4uMHglOC44bHhcbiIsKHVfbG9uZykmbHAtPnJ4X3JpbmdbaV0uc3RhdHVzKTsKKwlwcmludGsoIlRYOiAiKTsKKwlmb3IgKGk9MDtpPGxwLT50eFJpbmdTaXplLTE7aSsrKXsKKwkgICAgaWYgKGkgPCAzKSB7CisJCXByaW50aygiMHglOC44bHggICIsICh1X2xvbmcpJmxwLT50eF9yaW5nW2ldLnN0YXR1cyk7CisJICAgIH0KKwl9CisJcHJpbnRrKCIuLi4weCU4LjhseFxuIiwgKHVfbG9uZykmbHAtPnR4X3JpbmdbaV0uc3RhdHVzKTsKKwlwcmludGsoIkRlc2NyaXB0b3IgYnVmZmVyczpcblJYOiAiKTsKKwlmb3IgKGk9MDtpPGxwLT5yeFJpbmdTaXplLTE7aSsrKXsKKwkgICAgaWYgKGkgPCAzKSB7CisJCXByaW50aygiMHglOC44eCAgIixsZTMyX3RvX2NwdShscC0+cnhfcmluZ1tpXS5idWYpKTsKKwkgICAgfQorCX0KKwlwcmludGsoIi4uLjB4JTguOHhcbiIsbGUzMl90b19jcHUobHAtPnJ4X3JpbmdbaV0uYnVmKSk7CisJcHJpbnRrKCJUWDogIik7CisJZm9yIChpPTA7aTxscC0+dHhSaW5nU2l6ZS0xO2krKyl7CisJICAgIGlmIChpIDwgMykgeworCQlwcmludGsoIjB4JTguOHggICIsIGxlMzJfdG9fY3B1KGxwLT50eF9yaW5nW2ldLmJ1ZikpOworCSAgICB9CisJfQorCXByaW50aygiLi4uMHglOC44eFxuIiwgbGUzMl90b19jcHUobHAtPnR4X3JpbmdbaV0uYnVmKSk7CisJcHJpbnRrKCJSaW5nIHNpemU6IFxuUlg6ICVkXG5UWDogJWRcbiIsIAorCSAgICAgICAoc2hvcnQpbHAtPnJ4UmluZ1NpemUsIAorCSAgICAgICAoc2hvcnQpbHAtPnR4UmluZ1NpemUpOyAKKyAgICB9CisgICAgCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZGU0eDVfZGJnX21paShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaykKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICAKKyAgICBpZiAoZGU0eDVfZGVidWcgJiBERUJVR19NSUkpIHsKKwlwcmludGsoIlxuTUlJIGRldmljZSBhZGRyZXNzOiAlZFxuIiwgbHAtPnBoeVtrXS5hZGRyKTsKKwlwcmludGsoIk1JSSBDUjogICV4XG4iLG1paV9yZChNSUlfQ1IsbHAtPnBoeVtrXS5hZGRyLERFNFg1X01JSSkpOworCXByaW50aygiTUlJIFNSOiAgJXhcbiIsbWlpX3JkKE1JSV9TUixscC0+cGh5W2tdLmFkZHIsREU0WDVfTUlJKSk7CisJcHJpbnRrKCJNSUkgSUQwOiAleFxuIixtaWlfcmQoTUlJX0lEMCxscC0+cGh5W2tdLmFkZHIsREU0WDVfTUlJKSk7CisJcHJpbnRrKCJNSUkgSUQxOiAleFxuIixtaWlfcmQoTUlJX0lEMSxscC0+cGh5W2tdLmFkZHIsREU0WDVfTUlJKSk7CisJaWYgKGxwLT5waHlba10uaWQgIT0gQlJPQURDT01fVDQpIHsKKwkgICAgcHJpbnRrKCJNSUkgQU5BOiAleFxuIixtaWlfcmQoMHgwNCxscC0+cGh5W2tdLmFkZHIsREU0WDVfTUlJKSk7CisJICAgIHByaW50aygiTUlJIEFOQzogJXhcbiIsbWlpX3JkKDB4MDUsbHAtPnBoeVtrXS5hZGRyLERFNFg1X01JSSkpOworCX0KKwlwcmludGsoIk1JSSAxNjogICV4XG4iLG1paV9yZCgweDEwLGxwLT5waHlba10uYWRkcixERTRYNV9NSUkpKTsKKwlpZiAobHAtPnBoeVtrXS5pZCAhPSBCUk9BRENPTV9UNCkgeworCSAgICBwcmludGsoIk1JSSAxNzogICV4XG4iLG1paV9yZCgweDExLGxwLT5waHlba10uYWRkcixERTRYNV9NSUkpKTsKKwkgICAgcHJpbnRrKCJNSUkgMTg6ICAleFxuIixtaWlfcmQoMHgxMixscC0+cGh5W2tdLmFkZHIsREU0WDVfTUlJKSk7CisJfSBlbHNlIHsKKwkgICAgcHJpbnRrKCJNSUkgMjA6ICAleFxuIixtaWlfcmQoMHgxNCxscC0+cGh5W2tdLmFkZHIsREU0WDVfTUlJKSk7CisJfQorICAgIH0KKyAgICAKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitkZTR4NV9kYmdfbWVkaWEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIAorICAgIGlmIChscC0+bWVkaWEgIT0gbHAtPmNfbWVkaWEpIHsKKwlpZiAoZGU0eDVfZGVidWcgJiBERUJVR19NRURJQSkgeworCSAgICBwcmludGsoIiVzOiBtZWRpYSBpcyAlcyVzXG4iLCBkZXYtPm5hbWUsCisJCSAgIChscC0+bWVkaWEgPT0gTkMgID8gInVuY29ubmVjdGVkLCBsaW5rIGRvd24gb3IgaW5jb21wYXRpYmxlIGNvbm5lY3Rpb24iIDoKKwkJICAgIChscC0+bWVkaWEgPT0gVFAgID8gIlRQIiA6CisJCSAgICAgKGxwLT5tZWRpYSA9PSBBTlMgPyAiVFAvTndheSIgOgorCQkgICAgICAobHAtPm1lZGlhID09IEJOQyA/ICJCTkMiIDogCisJCSAgICAgICAobHAtPm1lZGlhID09IEFVSSA/ICJBVUkiIDogCisJCQkobHAtPm1lZGlhID09IEJOQ19BVUkgPyAiQk5DL0FVSSIgOiAKKwkJCSAobHAtPm1lZGlhID09IEVYVF9TSUEgPyAiRVhUIFNJQSIgOiAKKwkJCSAgKGxwLT5tZWRpYSA9PSBfMTAwTWIgID8gIjEwME1iL3MiIDoKKwkJCSAgIChscC0+bWVkaWEgPT0gXzEwTWIgICA/ICIxME1iL3MiIDoKKwkJCSAgICAiPz8/IgorCQkJICAgICkpKSkpKSkpKSwgKGxwLT5mZHg/IiBmdWxsIGR1cGxleC4iOiIuIikpOworCX0KKwlscC0+Y19tZWRpYSA9IGxwLT5tZWRpYTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorZGU0eDVfZGJnX3Nyb20oc3RydWN0IGRlNHg1X3Nyb20gKnApCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoZGU0eDVfZGVidWcgJiBERUJVR19TUk9NKSB7CisJcHJpbnRrKCJTdWItc3lzdGVtIFZlbmRvciBJRDogJTA0eFxuIiwgKigodV9zaG9ydCAqKXAtPnN1Yl92ZW5kb3JfaWQpKTsKKwlwcmludGsoIlN1Yi1zeXN0ZW0gSUQ6ICAgICAgICAlMDR4XG4iLCAqKCh1X3Nob3J0ICopcC0+c3ViX3N5c3RlbV9pZCkpOworCXByaW50aygiSUQgQmxvY2sgQ1JDOiAgICAgICAgICUwMnhcbiIsICh1X2NoYXIpKHAtPmlkX2Jsb2NrX2NyYykpOworCXByaW50aygiU1JPTSB2ZXJzaW9uOiAgICAgICAgICUwMnhcbiIsICh1X2NoYXIpKHAtPnZlcnNpb24pKTsKKwlwcmludGsoIiMgY29udHJvbGxlcnM6ICAgICAgICAgJTAyeFxuIiwgKHVfY2hhcikocC0+bnVtX2NvbnRyb2xsZXJzKSk7CisKKwlwcmludGsoIkhhcmR3YXJlIEFkZHJlc3M6ICAgICAiKTsKKwlmb3IgKGk9MDtpPEVUSF9BTEVOLTE7aSsrKSB7CisJICAgIHByaW50aygiJTAyeDoiLCAodV9jaGFyKSoocC0+aWVlZV9hZGRyK2kpKTsKKwl9CisJcHJpbnRrKCIlMDJ4XG4iLCAodV9jaGFyKSoocC0+aWVlZV9hZGRyK2kpKTsKKwlwcmludGsoIkNSQyBjaGVja3N1bTogICAgICAgICAlMDR4XG4iLCAodV9zaG9ydCkocC0+Y2hrc3VtKSk7CisJZm9yIChpPTA7IGk8NjQ7IGkrKykgeworCSAgICBwcmludGsoIiUzZCAlMDR4XG4iLCBpPDwxLCAodV9zaG9ydCkqKCh1X3Nob3J0ICopcCtpKSk7CisJfQorICAgIH0KKworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2RlNHg1X2RiZ19yeChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuKQoreworICAgIGludCBpLCBqOworCisgICAgaWYgKGRlNHg1X2RlYnVnICYgREVCVUdfUlgpIHsKKwlwcmludGsoIlI6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IDwtICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IGxlbi9TQVA6JTAyeCUwMnggWyVkXVxuIiwKKwkgICAgICAgKHVfY2hhcilza2ItPmRhdGFbMF0sCisJICAgICAgICh1X2NoYXIpc2tiLT5kYXRhWzFdLAorCSAgICAgICAodV9jaGFyKXNrYi0+ZGF0YVsyXSwKKwkgICAgICAgKHVfY2hhcilza2ItPmRhdGFbM10sCisJICAgICAgICh1X2NoYXIpc2tiLT5kYXRhWzRdLAorCSAgICAgICAodV9jaGFyKXNrYi0+ZGF0YVs1XSwKKwkgICAgICAgKHVfY2hhcilza2ItPmRhdGFbNl0sCisJICAgICAgICh1X2NoYXIpc2tiLT5kYXRhWzddLAorCSAgICAgICAodV9jaGFyKXNrYi0+ZGF0YVs4XSwKKwkgICAgICAgKHVfY2hhcilza2ItPmRhdGFbOV0sCisJICAgICAgICh1X2NoYXIpc2tiLT5kYXRhWzEwXSwKKwkgICAgICAgKHVfY2hhcilza2ItPmRhdGFbMTFdLAorCSAgICAgICAodV9jaGFyKXNrYi0+ZGF0YVsxMl0sCisJICAgICAgICh1X2NoYXIpc2tiLT5kYXRhWzEzXSwKKwkgICAgICAgbGVuKTsKKwlmb3IgKGo9MDsgbGVuPjA7ais9MTYsIGxlbi09MTYpIHsKKwkgIHByaW50aygiICAgICUwM3g6ICIsaik7CisJICBmb3IgKGk9MDsgaTwxNiAmJiBpPGxlbjsgaSsrKSB7CisJICAgIHByaW50aygiJTAyeCAiLCh1X2NoYXIpc2tiLT5kYXRhW2kral0pOworCSAgfQorCSAgcHJpbnRrKCJcbiIpOworCX0KKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qCisqKiBQZXJmb3JtIElPQ1RMIGNhbGwgZnVuY3Rpb25zIGhlcmUuIFNvbWUgYXJlIHByaXZpbGVnZWQgb3BlcmF0aW9ucyBhbmQgdGhlCisqKiBlZmZlY3RpdmUgdWlkIGlzIGNoZWNrZWQgaW4gdGhvc2UgY2FzZXMuIEluIHRoZSBub3JtYWwgY291cnNlIG9mIGV2ZW50cworKiogdGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgZm9yIG15IHRlc3RpbmcuCisqLworc3RhdGljIGludAorZGU0eDVfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKyAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHN0cnVjdCBkZTR4NV9pb2N0bCAqaW9jID0gKHN0cnVjdCBkZTR4NV9pb2N0bCAqKSAmcnEtPmlmcl9pZnJ1OworICAgIHVfbG9uZyBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgaSwgaiwgc3RhdHVzID0gMDsKKyAgICBzMzIgb21yOworICAgIHVuaW9uIHsKKwl1OCAgYWRkclsxNDRdOworCXUxNiBzdmFsWzcyXTsKKwl1MzIgbHZhbFszNl07CisgICAgfSB0bXA7CisgICAgdV9sb25nIGZsYWdzID0gMDsKKyAgICAKKyAgICBzd2l0Y2goaW9jLT5jbWQpIHsKKyAgICBjYXNlIERFNFg1X0dFVF9IV0FERFI6ICAgICAgICAgICAvKiBHZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3MgKi8KKwlpb2MtPmxlbiA9IEVUSF9BTEVOOworCWZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsKKwkgICAgdG1wLmFkZHJbaV0gPSBkZXYtPmRldl9hZGRyW2ldOworCX0KKwlpZiAoY29weV90b191c2VyKGlvYy0+ZGF0YSwgdG1wLmFkZHIsIGlvYy0+bGVuKSkgcmV0dXJuIC1FRkFVTFQ7CisJYnJlYWs7CisKKyAgICBjYXNlIERFNFg1X1NFVF9IV0FERFI6ICAgICAgICAgICAvKiBTZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3MgKi8KKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHJldHVybiAtRVBFUk07CisJaWYgKGNvcHlfZnJvbV91c2VyKHRtcC5hZGRyLCBpb2MtPmRhdGEsIEVUSF9BTEVOKSkgcmV0dXJuIC1FRkFVTFQ7CisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJcmV0dXJuIC1FQlVTWTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJZm9yIChpPTA7IGk8RVRIX0FMRU47IGkrKykgeworCSAgICBkZXYtPmRldl9hZGRyW2ldID0gdG1wLmFkZHJbaV07CisJfQorCWJ1aWxkX3NldHVwX2ZyYW1lKGRldiwgUEhZU19BRERSX09OTFkpOworCS8qIFNldCB1cCB0aGUgZGVzY3JpcHRvciBhbmQgZ2l2ZSBvd25lcnNoaXAgdG8gdGhlIGNhcmQgKi8KKwlsb2FkX3BhY2tldChkZXYsIGxwLT5zZXR1cF9mcmFtZSwgVERfSUMgfCBQRVJGRUNUX0YgfCBURF9TRVQgfCAKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUVVBfRlJBTUVfTEVOLCAoc3RydWN0IHNrX2J1ZmYgKikxKTsKKwlscC0+dHhfbmV3ID0gKCsrbHAtPnR4X25ldykgJSBscC0+dHhSaW5nU2l6ZTsKKwlvdXRsKFBPTExfREVNQU5ELCBERTRYNV9UUEQpOyAgICAgICAgICAgICAgICAvKiBTdGFydCB0aGUgVFggKi8KKwluZXRpZl93YWtlX3F1ZXVlKGRldik7ICAgICAgICAgICAgICAgICAgICAgIC8qIFVubG9jayB0aGUgVFggcmluZyAqLworCWJyZWFrOworCisgICAgY2FzZSBERTRYNV9TRVRfUFJPTTogICAgICAgICAgICAgLyogU2V0IFByb21pc2N1b3VzIE1vZGUgKi8KKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHJldHVybiAtRVBFUk07CisJb21yID0gaW5sKERFNFg1X09NUik7CisJb21yIHw9IE9NUl9QUjsKKwlvdXRsKG9tciwgREU0WDVfT01SKTsKKwlkZXYtPmZsYWdzIHw9IElGRl9QUk9NSVNDOworCWJyZWFrOworCisgICAgY2FzZSBERTRYNV9DTFJfUFJPTTogICAgICAgICAgICAgLyogQ2xlYXIgUHJvbWlzY3VvdXMgTW9kZSAqLworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgcmV0dXJuIC1FUEVSTTsKKwlvbXIgPSBpbmwoREU0WDVfT01SKTsKKwlvbXIgJj0gfk9NUl9QUjsKKwlvdXRsKG9tciwgREU0WDVfT01SKTsKKwlkZXYtPmZsYWdzICY9IH5JRkZfUFJPTUlTQzsKKwlicmVhazsKKworICAgIGNhc2UgREU0WDVfU0FZX0JPTzogICAgICAgICAgICAgIC8qIFNheSAiQm9vISIgdG8gdGhlIGtlcm5lbCBsb2cgZmlsZSAqLworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgcmV0dXJuIC1FUEVSTTsKKwlwcmludGsoIiVzOiBCb28hXG4iLCBkZXYtPm5hbWUpOworCWJyZWFrOworCisgICAgY2FzZSBERTRYNV9NQ0FfRU46ICAgICAgICAgICAgICAgLyogRW5hYmxlIHBhc3MgYWxsIG11bHRpY2FzdCBhZGRyZXNzaW5nICovCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSByZXR1cm4gLUVQRVJNOworCW9tciA9IGlubChERTRYNV9PTVIpOworCW9tciB8PSBPTVJfUE07CisJb3V0bChvbXIsIERFNFg1X09NUik7CisJYnJlYWs7CisKKyAgICBjYXNlIERFNFg1X0dFVF9TVEFUUzogICAgICAgICAgICAvKiBHZXQgdGhlIGRyaXZlciBzdGF0aXN0aWNzICovCisgICAgeworICAgICAgICBzdHJ1Y3QgcGt0X3N0YXRzIHN0YXRidWY7CisJaW9jLT5sZW4gPSBzaXplb2Yoc3RhdGJ1Zik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5sb2NrLCBmbGFncyk7CisJbWVtY3B5KCZzdGF0YnVmLCAmbHAtPnBrdFN0YXRzLCBpb2MtPmxlbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwlpZiAoY29weV90b191c2VyKGlvYy0+ZGF0YSwgJnN0YXRidWYsIGlvYy0+bGVuKSkgCisJCXJldHVybiAtRUZBVUxUOyAKKwlicmVhazsKKyAgICB9CisgICAgY2FzZSBERTRYNV9DTFJfU1RBVFM6ICAgICAgICAgICAgLyogWmVybyBvdXQgdGhlIGRyaXZlciBzdGF0aXN0aWNzICovCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSByZXR1cm4gLUVQRVJNOworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+bG9jaywgZmxhZ3MpOworCW1lbXNldCgmbHAtPnBrdFN0YXRzLCAwLCBzaXplb2YobHAtPnBrdFN0YXRzKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPmxvY2ssIGZsYWdzKTsKKwlicmVhazsKKworICAgIGNhc2UgREU0WDVfR0VUX09NUjogICAgICAgICAgICAgIC8qIEdldCB0aGUgT01SIFJlZ2lzdGVyIGNvbnRlbnRzICovCisJdG1wLmFkZHJbMF0gPSBpbmwoREU0WDVfT01SKTsKKwlpZiAoY29weV90b191c2VyKGlvYy0+ZGF0YSwgdG1wLmFkZHIsIDEpKSByZXR1cm4gLUVGQVVMVDsKKwlicmVhazsKKworICAgIGNhc2UgREU0WDVfU0VUX09NUjogICAgICAgICAgICAgIC8qIFNldCB0aGUgT01SIFJlZ2lzdGVyIGNvbnRlbnRzICovCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSByZXR1cm4gLUVQRVJNOworCWlmIChjb3B5X2Zyb21fdXNlcih0bXAuYWRkciwgaW9jLT5kYXRhLCAxKSkgcmV0dXJuIC1FRkFVTFQ7CisJb3V0bCh0bXAuYWRkclswXSwgREU0WDVfT01SKTsKKwlicmVhazsKKworICAgIGNhc2UgREU0WDVfR0VUX1JFRzogICAgICAgICAgICAgIC8qIEdldCB0aGUgREU0WDUgUmVnaXN0ZXJzICovCisJaiA9IDA7CisJdG1wLmx2YWxbMF0gPSBpbmwoREU0WDVfU1RTKTsgais9NDsKKwl0bXAubHZhbFsxXSA9IGlubChERTRYNV9CTVIpOyBqKz00OworCXRtcC5sdmFsWzJdID0gaW5sKERFNFg1X0lNUik7IGorPTQ7CisJdG1wLmx2YWxbM10gPSBpbmwoREU0WDVfT01SKTsgais9NDsKKwl0bXAubHZhbFs0XSA9IGlubChERTRYNV9TSVNSKTsgais9NDsKKwl0bXAubHZhbFs1XSA9IGlubChERTRYNV9TSUNSKTsgais9NDsKKwl0bXAubHZhbFs2XSA9IGlubChERTRYNV9TVFJSKTsgais9NDsKKwl0bXAubHZhbFs3XSA9IGlubChERTRYNV9TSUdSKTsgais9NDsKKwlpb2MtPmxlbiA9IGo7CisJaWYgKGNvcHlfdG9fdXNlcihpb2MtPmRhdGEsIHRtcC5hZGRyLCBpb2MtPmxlbikpIHJldHVybiAtRUZBVUxUOworCWJyZWFrOworCQorI2RlZmluZSBERTRYNV9EVU1QICAgICAgICAgICAgICAweDBmIC8qIER1bXAgdGhlIERFNFg1IFN0YXR1cyAqLworLyoJCisgICAgICBjYXNlIERFNFg1X0RVTVA6CisJaiA9IDA7CisJdG1wLmFkZHJbaisrXSA9IGRldi0+aXJxOworCWZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsKKwkgICAgdG1wLmFkZHJbaisrXSA9IGRldi0+ZGV2X2FkZHJbaV07CisJfQorCXRtcC5hZGRyW2orK10gPSBscC0+cnhSaW5nU2l6ZTsKKwl0bXAubHZhbFtqPj4yXSA9IChsb25nKWxwLT5yeF9yaW5nOyBqKz00OworCXRtcC5sdmFsW2o+PjJdID0gKGxvbmcpbHAtPnR4X3Jpbmc7IGorPTQ7CisJCisJZm9yIChpPTA7aTxscC0+cnhSaW5nU2l6ZS0xO2krKyl7CisJICAgIGlmIChpIDwgMykgeworCQl0bXAubHZhbFtqPj4yXSA9IChsb25nKSZscC0+cnhfcmluZ1tpXS5zdGF0dXM7IGorPTQ7CisJICAgIH0KKwl9CisJdG1wLmx2YWxbaj4+Ml0gPSAobG9uZykmbHAtPnJ4X3JpbmdbaV0uc3RhdHVzOyBqKz00OworCWZvciAoaT0wO2k8bHAtPnR4UmluZ1NpemUtMTtpKyspeworCSAgICBpZiAoaSA8IDMpIHsKKwkJdG1wLmx2YWxbaj4+Ml0gPSAobG9uZykmbHAtPnR4X3JpbmdbaV0uc3RhdHVzOyBqKz00OworCSAgICB9CisJfQorCXRtcC5sdmFsW2o+PjJdID0gKGxvbmcpJmxwLT50eF9yaW5nW2ldLnN0YXR1czsgais9NDsKKwkKKwlmb3IgKGk9MDtpPGxwLT5yeFJpbmdTaXplLTE7aSsrKXsKKwkgICAgaWYgKGkgPCAzKSB7CisJCXRtcC5sdmFsW2o+PjJdID0gKHMzMilsZTMyX3RvX2NwdShscC0+cnhfcmluZ1tpXS5idWYpOyBqKz00OworCSAgICB9CisJfQorCXRtcC5sdmFsW2o+PjJdID0gKHMzMilsZTMyX3RvX2NwdShscC0+cnhfcmluZ1tpXS5idWYpOyBqKz00OworCWZvciAoaT0wO2k8bHAtPnR4UmluZ1NpemUtMTtpKyspeworCSAgICBpZiAoaSA8IDMpIHsKKwkJdG1wLmx2YWxbaj4+Ml0gPSAoczMyKWxlMzJfdG9fY3B1KGxwLT50eF9yaW5nW2ldLmJ1Zik7IGorPTQ7CisJICAgIH0KKwl9CisJdG1wLmx2YWxbaj4+Ml0gPSAoczMyKWxlMzJfdG9fY3B1KGxwLT50eF9yaW5nW2ldLmJ1Zik7IGorPTQ7CisJCisJZm9yIChpPTA7aTxscC0+cnhSaW5nU2l6ZTtpKyspeworCSAgICB0bXAubHZhbFtqPj4yXSA9IGxlMzJfdG9fY3B1KGxwLT5yeF9yaW5nW2ldLnN0YXR1cyk7IGorPTQ7CisJfQorCWZvciAoaT0wO2k8bHAtPnR4UmluZ1NpemU7aSsrKXsKKwkgICAgdG1wLmx2YWxbaj4+Ml0gPSBsZTMyX3RvX2NwdShscC0+dHhfcmluZ1tpXS5zdGF0dXMpOyBqKz00OworCX0KKwkKKwl0bXAubHZhbFtqPj4yXSA9IGlubChERTRYNV9CTVIpOyAgais9NDsKKwl0bXAubHZhbFtqPj4yXSA9IGlubChERTRYNV9UUEQpOyAgais9NDsKKwl0bXAubHZhbFtqPj4yXSA9IGlubChERTRYNV9SUEQpOyAgais9NDsKKwl0bXAubHZhbFtqPj4yXSA9IGlubChERTRYNV9SUkJBKTsgais9NDsKKwl0bXAubHZhbFtqPj4yXSA9IGlubChERTRYNV9UUkJBKTsgais9NDsKKwl0bXAubHZhbFtqPj4yXSA9IGlubChERTRYNV9TVFMpOyAgais9NDsKKwl0bXAubHZhbFtqPj4yXSA9IGlubChERTRYNV9PTVIpOyAgais9NDsKKwl0bXAubHZhbFtqPj4yXSA9IGlubChERTRYNV9JTVIpOyAgais9NDsKKwl0bXAubHZhbFtqPj4yXSA9IGxwLT5jaGlwc2V0OyBqKz00OyAKKwlpZiAobHAtPmNoaXBzZXQgPT0gREMyMTE0MCkgeworCSAgICB0bXAubHZhbFtqPj4yXSA9IGdlcF9yZChkZXYpOyAgais9NDsKKwl9IGVsc2UgeworCSAgICB0bXAubHZhbFtqPj4yXSA9IGlubChERTRYNV9TSVNSKTsgais9NDsKKwkgICAgdG1wLmx2YWxbaj4+Ml0gPSBpbmwoREU0WDVfU0lDUik7IGorPTQ7CisJICAgIHRtcC5sdmFsW2o+PjJdID0gaW5sKERFNFg1X1NUUlIpOyBqKz00OworCSAgICB0bXAubHZhbFtqPj4yXSA9IGlubChERTRYNV9TSUdSKTsgais9NDsgCisJfQorCXRtcC5sdmFsW2o+PjJdID0gbHAtPnBoeVtscC0+YWN0aXZlXS5pZDsgais9NDsgCisJaWYgKGxwLT5waHlbbHAtPmFjdGl2ZV0uaWQgJiYgKCFscC0+dXNlU1JPTSB8fCBscC0+dXNlTUlJKSkgeworCSAgICB0bXAubHZhbFtqPj4yXSA9IGxwLT5hY3RpdmU7IGorPTQ7IAorCSAgICB0bXAubHZhbFtqPj4yXT1taWlfcmQoTUlJX0NSLGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkcixERTRYNV9NSUkpOyBqKz00OworCSAgICB0bXAubHZhbFtqPj4yXT1taWlfcmQoTUlJX1NSLGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkcixERTRYNV9NSUkpOyBqKz00OworCSAgICB0bXAubHZhbFtqPj4yXT1taWlfcmQoTUlJX0lEMCxscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsREU0WDVfTUlJKTsgais9NDsKKwkgICAgdG1wLmx2YWxbaj4+Ml09bWlpX3JkKE1JSV9JRDEsbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLERFNFg1X01JSSk7IGorPTQ7CisJICAgIGlmIChscC0+cGh5W2xwLT5hY3RpdmVdLmlkICE9IEJST0FEQ09NX1Q0KSB7CisJCXRtcC5sdmFsW2o+PjJdPW1paV9yZChNSUlfQU5BLGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkcixERTRYNV9NSUkpOyBqKz00OworCQl0bXAubHZhbFtqPj4yXT1taWlfcmQoTUlJX0FOTFBBLGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkcixERTRYNV9NSUkpOyBqKz00OworCSAgICB9CisJICAgIHRtcC5sdmFsW2o+PjJdPW1paV9yZCgweDEwLGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkcixERTRYNV9NSUkpOyBqKz00OworCSAgICBpZiAobHAtPnBoeVtscC0+YWN0aXZlXS5pZCAhPSBCUk9BRENPTV9UNCkgeworCQl0bXAubHZhbFtqPj4yXT1taWlfcmQoMHgxMSxscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsREU0WDVfTUlJKTsgais9NDsKKwkJdG1wLmx2YWxbaj4+Ml09bWlpX3JkKDB4MTIsbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLERFNFg1X01JSSk7IGorPTQ7CisJICAgIH0gZWxzZSB7CisJCXRtcC5sdmFsW2o+PjJdPW1paV9yZCgweDE0LGxwLT5waHlbbHAtPmFjdGl2ZV0uYWRkcixERTRYNV9NSUkpOyBqKz00OworCSAgICB9CisJfQorCQorCXRtcC5hZGRyW2orK10gPSBscC0+dHhSaW5nU2l6ZTsKKwl0bXAuYWRkcltqKytdID0gbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpOworCQorCWlvYy0+bGVuID0gajsKKwlpZiAoY29weV90b191c2VyKGlvYy0+ZGF0YSwgdG1wLmFkZHIsIGlvYy0+bGVuKSkgcmV0dXJuIC1FRkFVTFQ7CisJYnJlYWs7CisKKyovCisgICAgZGVmYXVsdDoKKwlyZXR1cm4gLUVPUE5PVFNVUFA7CisgICAgfQorICAgIAorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRlNHg1X21vZHVsZV9pbml0ICh2b2lkKQoreworCWludCBlcnIgPSAwOworCisjaWZkZWYgQ09ORklHX1BDSQorCWVyciA9IHBjaV9tb2R1bGVfaW5pdCAoJmRlNHg1X3BjaV9kcml2ZXIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0VJU0EKKwllcnIgfD0gZWlzYV9kcml2ZXJfcmVnaXN0ZXIgKCZkZTR4NV9laXNhX2RyaXZlcik7CisjZW5kaWYKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkZTR4NV9tb2R1bGVfZXhpdCAodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfUENJCisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmZGU0eDVfcGNpX2RyaXZlcik7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRUlTQQorCWVpc2FfZHJpdmVyX3VucmVnaXN0ZXIgKCZkZTR4NV9laXNhX2RyaXZlcik7CisjZW5kaWYKK30KKworbW9kdWxlX2luaXQgKGRlNHg1X21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0IChkZTR4NV9tb2R1bGVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kZTR4NS5oIGIvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDM3YTQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuaApAQCAtMCwwICsxLDEwMjkgQEAKKy8qCisgICAgQ29weXJpZ2h0IDE5OTQgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24uCisKKyAgICBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gIHRoZSB0ZXJtcyBvZiB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKyAgICBUaGUgYXV0aG9yIG1heSAgICBiZSAgcmVhY2hlZCBhcyBkYXZpZXNAd2FudG9uLmxrZy5kZWMuY29tICBvciAgIERpZ2l0YWwKKyAgICBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIDU1MCBLaW5nIFN0cmVldCwgTGl0dGxldG9uIE1BIDAxNDYwLgorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworLyoKKyoqIERDMjEwNDAgQ1NSPDEuLjE1PiBSZWdpc3RlciBBZGRyZXNzIE1hcAorKi8KKyNkZWZpbmUgREU0WDVfQk1SICAgIGlvYmFzZSsoMHgwMDAgPDwgbHAtPmJ1cykgIC8qIEJ1cyBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIERFNFg1X1RQRCAgICBpb2Jhc2UrKDB4MDA4IDw8IGxwLT5idXMpICAvKiBUcmFuc21pdCBQb2xsIERlbWFuZCBSZWcgKi8KKyNkZWZpbmUgREU0WDVfUlBEICAgIGlvYmFzZSsoMHgwMTAgPDwgbHAtPmJ1cykgIC8qIFJlY2VpdmUgUG9sbCBEZW1hbmQgUmVnICovCisjZGVmaW5lIERFNFg1X1JSQkEgICBpb2Jhc2UrKDB4MDE4IDw8IGxwLT5idXMpICAvKiBSWCBSaW5nIEJhc2UgQWRkcmVzcyBSZWcgKi8KKyNkZWZpbmUgREU0WDVfVFJCQSAgIGlvYmFzZSsoMHgwMjAgPDwgbHAtPmJ1cykgIC8qIFRYIFJpbmcgQmFzZSBBZGRyZXNzIFJlZyAqLworI2RlZmluZSBERTRYNV9TVFMgICAgaW9iYXNlKygweDAyOCA8PCBscC0+YnVzKSAgLyogU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIERFNFg1X09NUiAgICBpb2Jhc2UrKDB4MDMwIDw8IGxwLT5idXMpICAvKiBPcGVyYXRpb24gTW9kZSBSZWdpc3RlciAqLworI2RlZmluZSBERTRYNV9JTVIgICAgaW9iYXNlKygweDAzOCA8PCBscC0+YnVzKSAgLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgREU0WDVfTUZDICAgIGlvYmFzZSsoMHgwNDAgPDwgbHAtPmJ1cykgIC8qIE1pc3NlZCBGcmFtZSBDb3VudGVyICovCisjZGVmaW5lIERFNFg1X0FQUk9NICBpb2Jhc2UrKDB4MDQ4IDw8IGxwLT5idXMpICAvKiBFdGhlcm5ldCBBZGRyZXNzIFBST00gKi8KKyNkZWZpbmUgREU0WDVfQlJPTSAgIGlvYmFzZSsoMHgwNDggPDwgbHAtPmJ1cykgIC8qIEJvb3QgUk9NIFJlZ2lzdGVyICovCisjZGVmaW5lIERFNFg1X1NST00gICBpb2Jhc2UrKDB4MDQ4IDw8IGxwLT5idXMpICAvKiBTZXJpYWwgUk9NIFJlZ2lzdGVyICovCisjZGVmaW5lIERFNFg1X01JSSAgICBpb2Jhc2UrKDB4MDQ4IDw8IGxwLT5idXMpICAvKiBNSUkgSW50ZXJmYWNlIFJlZ2lzdGVyICovCisjZGVmaW5lIERFNFg1X0REUiAgICBpb2Jhc2UrKDB4MDUwIDw8IGxwLT5idXMpICAvKiBEYXRhIERpYWdub3N0aWMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgREU0WDVfRkRSICAgIGlvYmFzZSsoMHgwNTggPDwgbHAtPmJ1cykgIC8qIEZ1bGwgRHVwbGV4IFJlZ2lzdGVyICovCisjZGVmaW5lIERFNFg1X0dQVCAgICBpb2Jhc2UrKDB4MDU4IDw8IGxwLT5idXMpICAvKiBHZW5lcmFsIFB1cnBvc2UgVGltZXIgUmVnLiovCisjZGVmaW5lIERFNFg1X0dFUCAgICBpb2Jhc2UrKDB4MDYwIDw8IGxwLT5idXMpICAvKiBHZW5lcmFsIFB1cnBvc2UgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgREU0WDVfU0lTUiAgIGlvYmFzZSsoMHgwNjAgPDwgbHAtPmJ1cykgIC8qIFNJQSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgREU0WDVfU0lDUiAgIGlvYmFzZSsoMHgwNjggPDwgbHAtPmJ1cykgIC8qIFNJQSBDb25uZWN0aXZpdHkgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgREU0WDVfU1RSUiAgIGlvYmFzZSsoMHgwNzAgPDwgbHAtPmJ1cykgIC8qIFNJQSBUWC9SWCBSZWdpc3RlciAqLworI2RlZmluZSBERTRYNV9TSUdSICAgaW9iYXNlKygweDA3OCA8PCBscC0+YnVzKSAgLyogU0lBIEdlbmVyYWwgUmVnaXN0ZXIgKi8KKworLyoKKyoqIEVJU0EgUmVnaXN0ZXIgQWRkcmVzcyBNYXAKKyovCisjZGVmaW5lIEVJU0FfSUQgICAgICBpb2Jhc2UrMHgwYzgwICAgLyogRUlTQSBJRCBSZWdpc3RlcnMgKi8gCisjZGVmaW5lIEVJU0FfSUQwICAgICBpb2Jhc2UrMHgwYzgwICAgLyogRUlTQSBJRCBSZWdpc3RlciAwICovIAorI2RlZmluZSBFSVNBX0lEMSAgICAgaW9iYXNlKzB4MGM4MSAgIC8qIEVJU0EgSUQgUmVnaXN0ZXIgMSAqLyAKKyNkZWZpbmUgRUlTQV9JRDIgICAgIGlvYmFzZSsweDBjODIgICAvKiBFSVNBIElEIFJlZ2lzdGVyIDIgKi8gCisjZGVmaW5lIEVJU0FfSUQzICAgICBpb2Jhc2UrMHgwYzgzICAgLyogRUlTQSBJRCBSZWdpc3RlciAzICovIAorI2RlZmluZSBFSVNBX0NSICAgICAgaW9iYXNlKzB4MGM4NCAgIC8qIEVJU0EgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBFSVNBX1JFRzAgICAgaW9iYXNlKzB4MGM4OCAgIC8qIEVJU0EgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAwICovCisjZGVmaW5lIEVJU0FfUkVHMSAgICBpb2Jhc2UrMHgwYzg5ICAgLyogRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEgKi8KKyNkZWZpbmUgRUlTQV9SRUcyICAgIGlvYmFzZSsweDBjOGEgICAvKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworI2RlZmluZSBFSVNBX1JFRzMgICAgaW9iYXNlKzB4MGM4ZiAgIC8qIEVJU0EgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAzICovCisjZGVmaW5lIEVJU0FfQVBST00gICBpb2Jhc2UrMHgwYzkwICAgLyogRXRoZXJuZXQgQWRkcmVzcyBQUk9NICovCisKKy8qCisqKiBQQ0kvRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVycyBBZGRyZXNzIE1hcAorKi8KKyNkZWZpbmUgUENJX0NGSUQgICAgIGlvYmFzZSsweDAwMDggICAvKiBQQ0kgQ29uZmlndXJhdGlvbiBJRCBSZWdpc3RlciAqLworI2RlZmluZSBQQ0lfQ0ZDUyAgICAgaW9iYXNlKzB4MDAwYyAgIC8qIFBDSSBDb21tYW5kL1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQQ0lfQ0ZSViAgICAgaW9iYXNlKzB4MDAxOCAgIC8qIFBDSSBSZXZpc2lvbiBSZWdpc3RlciAqLworI2RlZmluZSBQQ0lfQ0ZMVCAgICAgaW9iYXNlKzB4MDAxYyAgIC8qIFBDSSBMYXRlbmN5IFRpbWVyIFJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9DQklPICAgICBpb2Jhc2UrMHgwMDI4ICAgLyogUENJIEJhc2UgSS9PIFJlZ2lzdGVyICovCisjZGVmaW5lIFBDSV9DQk1BICAgICBpb2Jhc2UrMHgwMDJjICAgLyogUENJIEJhc2UgTWVtb3J5IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX0NCRVIgICAgIGlvYmFzZSsweDAwMzAgICAvKiBQQ0kgRXhwYW5zaW9uIFJPTSBCYXNlIEFkZHJlc3MgUmVnLiAqLworI2RlZmluZSBQQ0lfQ0ZJVCAgICAgaW9iYXNlKzB4MDAzYyAgIC8qIFBDSSBDb25maWd1cmF0aW9uIEludGVycnVwdCBSZWdpc3RlciAqLworI2RlZmluZSBQQ0lfQ0ZEQSAgICAgaW9iYXNlKzB4MDA0MCAgIC8qIFBDSSBEcml2ZXIgQXJlYSBSZWdpc3RlciAqLworI2RlZmluZSBQQ0lfQ0ZERCAgICAgaW9iYXNlKzB4MDA0MSAgIC8qIFBDSSBEcml2ZXIgRGVwZW5kZW50IEFyZWEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUENJX0NGUE0gICAgIGlvYmFzZSsweDAwNDMgICAvKiBQQ0kgUG93ZXIgTWFuYWdlbWVudCBBcmVhIFJlZ2lzdGVyICovCisKKy8qCisqKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMCBiaXQgZGVmaW5pdGlvbnMKKyovCisjZGVmaW5lIEVSMF9CU1cgICAgICAgMHg4MCAgICAgICAgICAgLyogRUlTQSBCdXMgU2xhdmUgV2lkdGgsIDE6IDMyIGJpdHMgKi8KKyNkZWZpbmUgRVIwX0JNVyAgICAgICAweDQwICAgICAgICAgICAvKiBFSVNBIEJ1cyBNYXN0ZXIgV2lkdGgsIDE6IDMyIGJpdHMgKi8KKyNkZWZpbmUgRVIwX0VQVCAgICAgICAweDIwICAgICAgICAgICAvKiBFSVNBIFBSRUVNUFQgVGltZSwgMDogMjMgQkNMS3MgKi8KKyNkZWZpbmUgRVIwX0lTVFMgICAgICAweDEwICAgICAgICAgICAvKiBJbnRlcnJ1cHQgU3RhdHVzIChYKSAqLworI2RlZmluZSBFUjBfTEkgICAgICAgIDB4MDggICAgICAgICAgIC8qIExhdGNoIEludGVycnVwdHMgKi8KKyNkZWZpbmUgRVIwX0lOVEwgICAgICAweDA2ICAgICAgICAgICAvKiBJTlRlcnJ1cHQgTGV2ZWwgKi8KKyNkZWZpbmUgRVIwX0lOVFQgICAgICAweDAxICAgICAgICAgICAvKiBJTlRlcnJ1cHQgVHlwZSwgMDogTGV2ZWwsIDE6IEVkZ2UgKi8KKworLyoKKyoqIEVJU0EgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAxIGJpdCBkZWZpbml0aW9ucworKi8KKyNkZWZpbmUgRVIxX0lBTSAgICAgICAweGUwICAgICAgICAgICAvKiBJU0EgQWRkcmVzcyBNb2RlICovCisjZGVmaW5lIEVSMV9JQUUgICAgICAgMHgxMCAgICAgICAgICAgLyogSVNBIEFkZHJlc3NpbmcgRW5hYmxlICovCisjZGVmaW5lIEVSMV9VUElOICAgICAgMHgwZiAgICAgICAgICAgLyogVXNlciBQaW5zICovCisKKy8qCisqKiBFSVNBIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiBiaXQgZGVmaW5pdGlvbnMKKyovCisjZGVmaW5lIEVSMl9CUlMgICAgICAgMHhjMCAgICAgICAgICAgLyogQm9vdCBST00gU2l6ZSAqLworI2RlZmluZSBFUjJfQlJBICAgICAgIDB4M2MgICAgICAgICAgIC8qIEJvb3QgUk9NIEFkZHJlc3MgPDE2OjEzPiAqLworCisvKgorKiogRUlTQSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDMgYml0IGRlZmluaXRpb25zCisqLworI2RlZmluZSBFUjNfQldFICAgICAgIDB4NDAgICAgICAgICAgIC8qIEJ1cnN0IFdyaXRlIEVuYWJsZSAqLworI2RlZmluZSBFUjNfQlJFICAgICAgIDB4MDQgICAgICAgICAgIC8qIEJ1cnN0IFJlYWQgRW5hYmxlICovCisjZGVmaW5lIEVSM19MU1IgICAgICAgMHgwMiAgICAgICAgICAgLyogTG9jYWwgU29mdHdhcmUgUmVzZXQgKi8KKworLyoKKyoqIFBDSSBDb25maWd1cmF0aW9uIElEIFJlZ2lzdGVyIChQQ0lfQ0ZJRCkuIFRoZSBEZXZpY2UgSURzIGFyZSBsZWZ0CisqKiBzaGlmdGVkIDggYml0cyB0byBhbGxvdyBkZXRlY3Rpb24gb2YgREMyMTE0MiBhbmQgREMyMTE0MyB2YXJpYW50cyB3aXRoCisqKiB0aGUgY29uZmlndXJhdGlvbiByZXZpc2lvbiByZWdpc3RlciBzdGVwIG51bWJlci4KKyovCisjZGVmaW5lIENGSURfRElEICAgIDB4ZmYwMCAgICAgICAgICAgLyogRGV2aWNlIElEICovCisjZGVmaW5lIENGSURfVklEICAgIDB4MDBmZiAgICAgICAgICAgLyogVmVuZG9yIElEICovCisjZGVmaW5lIERDMjEwNDBfRElEIDB4MDIwMCAgICAgICAgICAgLyogVW5pcXVlIERldmljZSBJRCAjICovCisjZGVmaW5lIERDMjEwNDBfVklEIDB4MTAxMSAgICAgICAgICAgLyogREMyMTA0MCBNYW51ZmFjdHVyZXIgKi8KKyNkZWZpbmUgREMyMTA0MV9ESUQgMHgxNDAwICAgICAgICAgICAvKiBVbmlxdWUgRGV2aWNlIElEICMgKi8KKyNkZWZpbmUgREMyMTA0MV9WSUQgMHgxMDExICAgICAgICAgICAvKiBEQzIxMDQxIE1hbnVmYWN0dXJlciAqLworI2RlZmluZSBEQzIxMTQwX0RJRCAweDA5MDAgICAgICAgICAgIC8qIFVuaXF1ZSBEZXZpY2UgSUQgIyAqLworI2RlZmluZSBEQzIxMTQwX1ZJRCAweDEwMTEgICAgICAgICAgIC8qIERDMjExNDAgTWFudWZhY3R1cmVyICovCisjZGVmaW5lIERDMjExNHhfRElEIDB4MTkwMCAgICAgICAgICAgLyogVW5pcXVlIERldmljZSBJRCAjICovCisjZGVmaW5lIERDMjExNHhfVklEIDB4MTAxMSAgICAgICAgICAgLyogREMyMTE0WzIzXSBNYW51ZmFjdHVyZXIgKi8KKworLyoKKyoqIENoaXBzZXQgZGVmaW5lcworKi8KKyNkZWZpbmUgREMyMTA0MCAgICAgREMyMTA0MF9ESUQKKyNkZWZpbmUgREMyMTA0MSAgICAgREMyMTA0MV9ESUQKKyNkZWZpbmUgREMyMTE0MCAgICAgREMyMTE0MF9ESUQKKyNkZWZpbmUgREMyMTE0eCAgICAgREMyMTE0eF9ESUQKKyNkZWZpbmUgREMyMTE0MiAgICAgKERDMjExNHhfRElEIHwgMHgwMDEwKQorI2RlZmluZSBEQzIxMTQzICAgICAoREMyMTE0eF9ESUQgfCAweDAwMzApCisjZGVmaW5lIERDMjExNHhfQlJLIDB4MDAyMCAgICAgICAgICAgLyogQ0ZSViBicmVhayBiZXR3ZWVuIERDMjExNDIgJiBEQzIxMTQzICovCisKKyNkZWZpbmUgaXNfREMyMTA0MCAoKHZlbmRvciA9PSBEQzIxMDQwX1ZJRCkgJiYgKGRldmljZSA9PSBEQzIxMDQwX0RJRCkpCisjZGVmaW5lIGlzX0RDMjEwNDEgKCh2ZW5kb3IgPT0gREMyMTA0MV9WSUQpICYmIChkZXZpY2UgPT0gREMyMTA0MV9ESUQpKQorI2RlZmluZSBpc19EQzIxMTQwICgodmVuZG9yID09IERDMjExNDBfVklEKSAmJiAoZGV2aWNlID09IERDMjExNDBfRElEKSkKKyNkZWZpbmUgaXNfREMyMTE0eCAoKHZlbmRvciA9PSBEQzIxMTR4X1ZJRCkgJiYgKGRldmljZSA9PSBEQzIxMTR4X0RJRCkpCisjZGVmaW5lIGlzX0RDMjExNDIgKCh2ZW5kb3IgPT0gREMyMTE0eF9WSUQpICYmIChkZXZpY2UgPT0gREMyMTE0MikpCisjZGVmaW5lIGlzX0RDMjExNDMgKCh2ZW5kb3IgPT0gREMyMTE0eF9WSUQpICYmIChkZXZpY2UgPT0gREMyMTE0MykpCisKKy8qCisqKiBQQ0kgQ29uZmlndXJhdGlvbiBDb21tYW5kL1N0YXR1cyBSZWdpc3RlciAoUENJX0NGQ1MpCisqLworI2RlZmluZSBDRkNTX0RQRSAgICAweDgwMDAwMDAwICAgICAgIC8qIERldGVjdGVkIFBhcml0eSBFcnJvciAoUykgKi8KKyNkZWZpbmUgQ0ZDU19TU0UgICAgMHg0MDAwMDAwMCAgICAgICAvKiBTaWduYWwgU3lzdGVtIEVycm9yICAgKFMpICovCisjZGVmaW5lIENGQ1NfUk1BICAgIDB4MjAwMDAwMDAgICAgICAgLyogUmVjZWl2ZSBNYXN0ZXIgQWJvcnQgIChTKSAqLworI2RlZmluZSBDRkNTX1JUQSAgICAweDEwMDAwMDAwICAgICAgIC8qIFJlY2VpdmUgVGFyZ2V0IEFib3J0ICAoUykgKi8KKyNkZWZpbmUgQ0ZDU19EU1QgICAgMHgwNjAwMDAwMCAgICAgICAvKiBERVZTRUwgVGltaW5nICAgICAgICAgKFMpICovCisjZGVmaW5lIENGQ1NfRFBSICAgIDB4MDEwMDAwMDAgICAgICAgLyogRGF0YSBQYXJpdHkgUmVwb3J0ICAgIChTKSAqLworI2RlZmluZSBDRkNTX0ZCQiAgICAweDAwODAwMDAwICAgICAgIC8qIEZhc3QgQmFjay1Uby1CYWNrICAgICAoUykgKi8KKyNkZWZpbmUgQ0ZDU19TRUUgICAgMHgwMDAwMDEwMCAgICAgICAvKiBTeXN0ZW0gRXJyb3IgRW5hYmxlICAgKEMpICovCisjZGVmaW5lIENGQ1NfUEVSICAgIDB4MDAwMDAwNDAgICAgICAgLyogUGFyaXR5IEVycm9yIFJlc3BvbnNlIChDKSAqLworI2RlZmluZSBDRkNTX01PICAgICAweDAwMDAwMDA0ICAgICAgIC8qIE1hc3RlciBPcGVyYXRpb24gICAgICAoQykgKi8KKyNkZWZpbmUgQ0ZDU19NU0EgICAgMHgwMDAwMDAwMiAgICAgICAvKiBNZW1vcnkgU3BhY2UgQWNjZXNzICAgKEMpICovCisjZGVmaW5lIENGQ1NfSU9TQSAgIDB4MDAwMDAwMDEgICAgICAgLyogSS9PIFNwYWNlIEFjY2VzcyAgICAgIChDKSAqLworCisvKgorKiogUENJIENvbmZpZ3VyYXRpb24gUmV2aXNpb24gUmVnaXN0ZXIgKFBDSV9DRlJWKQorKi8KKyNkZWZpbmUgQ0ZSVl9CQyAgICAgMHhmZjAwMDAwMCAgICAgICAvKiBCYXNlIENsYXNzICovCisjZGVmaW5lIENGUlZfU0MgICAgIDB4MDBmZjAwMDAgICAgICAgLyogU3ViY2xhc3MgKi8KKyNkZWZpbmUgQ0ZSVl9STiAgICAgMHgwMDAwMDBmMCAgICAgICAvKiBSZXZpc2lvbiBOdW1iZXIgKi8KKyNkZWZpbmUgQ0ZSVl9TTiAgICAgMHgwMDAwMDAwZiAgICAgICAvKiBTdGVwIE51bWJlciAqLworI2RlZmluZSBCQVNFX0NMQVNTICAweDAyMDAwMDAwICAgICAgIC8qIEluZGljYXRlcyBOZXR3b3JrIENvbnRyb2xsZXIgKi8KKyNkZWZpbmUgU1VCX0NMQVNTICAgMHgwMDAwMDAwMCAgICAgICAvKiBJbmRpY2F0ZXMgRXRoZXJuZXQgQ29udHJvbGxlciAqLworI2RlZmluZSBTVEVQX05VTUJFUiAweDAwMDAwMDIwICAgICAgIC8qIEluY3JlbWVudHMgZm9yIGZ1dHVyZSBjaGlwcyAqLworI2RlZmluZSBSRVZfTlVNQkVSICAweDAwMDAwMDAzICAgICAgIC8qIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDM6IFJldiBpbiBTdGVwICovCisjZGVmaW5lIENGUlZfTUFTSyAgIDB4ZmZmZjAwMDAgICAgICAgLyogUmVnaXN0ZXIgbWFzayAqLworCisvKgorKiogUENJIENvbmZpZ3VyYXRpb24gTGF0ZW5jeSBUaW1lciBSZWdpc3RlciAoUENJX0NGTFQpCisqLworI2RlZmluZSBDRkxUX0JDICAgICAweDAwMDBmZjAwICAgICAgIC8qIExhdGVuY3kgVGltZXIgYml0cyAqLworCisvKgorKiogUENJIENvbmZpZ3VyYXRpb24gQmFzZSBJL08gQWRkcmVzcyBSZWdpc3RlciAoUENJX0NCSU8pCisqLworI2RlZmluZSBDQklPX01BU0sgICAtMTI4ICAgICAgICAgICAgIC8qIEJhc2UgSS9PIEFkZHJlc3MgTWFzayAqLworI2RlZmluZSBDQklPX0lPU0kgICAweDAwMDAwMDAxICAgICAgIC8qIEkvTyBTcGFjZSBJbmRpY2F0b3IgKFJPLCB2YWx1ZSBpcyAxKSAqLworCisvKgorKiogUENJIENvbmZpZ3VyYXRpb24gQ2FyZCBJbmZvcm1hdGlvbiBTdHJ1Y3R1cmUgUmVnaXN0ZXIgKFBDSV9DQ0lTKQorKi8KKyNkZWZpbmUgQ0NJU19ST01JICAgMHhmMDAwMDAwMCAgICAgICAvKiBST00gSW1hZ2UgKi8KKyNkZWZpbmUgQ0NJU19BU08gICAgMHgwZmZmZmZmOCAgICAgICAvKiBBZGRyZXNzIFNwYWNlIE9mZnNldCAqLworI2RlZmluZSBDQ0lTX0FTSSAgICAweDAwMDAwMDA3ICAgICAgIC8qIEFkZHJlc3MgU3BhY2UgSW5kaWNhdG9yICovCisKKy8qCisqKiBQQ0kgQ29uZmlndXJhdGlvbiBTdWJzeXN0ZW0gSUQgUmVnaXN0ZXIgKFBDSV9TU0lEKQorKi8KKyNkZWZpbmUgU1NJRF9TU0lEICAgMHhmZmZmMDAwMCAgICAgICAvKiBTdWJzeXN0ZW0gSUQgKi8KKyNkZWZpbmUgU1NJRF9TVklEICAgMHgwMDAwZmZmZiAgICAgICAvKiBTdWJzeXN0ZW0gVmVuZG9yIElEICovCisKKy8qCisqKiBQQ0kgQ29uZmlndXJhdGlvbiBFeHBhbnNpb24gUk9NIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAoUENJX0NCRVIpCisqLworI2RlZmluZSBDQkVSX01BU0sgICAweGZmZmZmYzAwICAgICAgIC8qIEV4cGFuc2lvbiBST00gQmFzZSBBZGRyZXNzIE1hc2sgKi8KKyNkZWZpbmUgQ0JFUl9ST01FICAgMHgwMDAwMDAwMSAgICAgICAvKiBST00gRW5hYmxlICovCisKKy8qCisqKiBQQ0kgQ29uZmlndXJhdGlvbiBJbnRlcnJ1cHQgUmVnaXN0ZXIgKFBDSV9DRklUKQorKi8KKyNkZWZpbmUgQ0ZJVF9NWExUICAgMHhmZjAwMDAwMCAgICAgICAvKiBNQVhfTEFUIFZhbHVlICgwLjI1dXMgcGVyaW9kcykgKi8KKyNkZWZpbmUgQ0ZJVF9NTkdUICAgMHgwMGZmMDAwMCAgICAgICAvKiBNSU5fR05UIFZhbHVlICgwLjI1dXMgcGVyaW9kcykgKi8KKyNkZWZpbmUgQ0ZJVF9JUlFQICAgMHgwMDAwZmYwMCAgICAgICAvKiBJbnRlcnJ1cHQgUGluICovCisjZGVmaW5lIENGSVRfSVJRTCAgIDB4MDAwMDAwZmYgICAgICAgLyogSW50ZXJydXB0IExpbmUgKi8KKworLyoKKyoqIFBDSSBDb25maWd1cmF0aW9uIFBvd2VyIE1hbmFnZW1lbnQgQXJlYSBSZWdpc3RlciAoUENJX0NGUE0pCisqLworI2RlZmluZSBTTEVFUCAgICAgICAweDgwICAgICAgICAgICAgIC8qIFBvd2VyIFNhdmluZyBTbGVlcCBNb2RlICovCisjZGVmaW5lIFNOT09aRSAgICAgIDB4NDAgICAgICAgICAgICAgLyogUG93ZXIgU2F2aW5nIFNub296ZSBNb2RlICovCisjZGVmaW5lIFdBS0VVUCAgICAgIDB4MDAgICAgICAgICAgICAgLyogUG93ZXIgU2F2aW5nIFdha2V1cCAqLworCisjZGVmaW5lIFBDSV9DRkRBX0RTVSAweDQxICAgICAgICAgICAgLyogOCBiaXQgQ29uZmlndXJhdGlvbiBTcGFjZSBBZGRyZXNzICovCisjZGVmaW5lIFBDSV9DRkRBX1BTTSAweDQzICAgICAgICAgICAgLyogOCBiaXQgQ29uZmlndXJhdGlvbiBTcGFjZSBBZGRyZXNzICovCisKKy8qCisqKiBEQzIxMDQwIEJ1cyBNb2RlIFJlZ2lzdGVyIChERTRYNV9CTVIpCisqLworI2RlZmluZSBCTVJfUk1MICAgIDB4MDAyMDAwMDAgICAgICAgLyogW01lbW9yeV0gUmVhZCBNdWx0aXBsZSAqLworI2RlZmluZSBCTVJfREJPICAgIDB4MDAxMDAwMDAgICAgICAgLyogRGVzY3JpcHRvciBCeXRlIE9yZGVyaW5nIChFbmRpYW4pICovCisjZGVmaW5lIEJNUl9UQVAgICAgMHgwMDBlMDAwMCAgICAgICAvKiBUcmFuc21pdCBBdXRvbWF0aWMgUG9sbGluZyAqLworI2RlZmluZSBCTVJfREFTICAgIDB4MDAwMTAwMDAgICAgICAgLyogRGlhZ25vc3RpYyBBZGRyZXNzIFNwYWNlICovCisjZGVmaW5lIEJNUl9DQUwgICAgMHgwMDAwYzAwMCAgICAgICAvKiBDYWNoZSBBbGlnbm1lbnQgKi8KKyNkZWZpbmUgQk1SX1BCTCAgICAweDAwMDAzZjAwICAgICAgIC8qIFByb2dyYW1tYWJsZSBCdXJzdCBMZW5ndGggKi8KKyNkZWZpbmUgQk1SX0JMRSAgICAweDAwMDAwMDgwICAgICAgIC8qIEJpZy9MaXR0bGUgRW5kaWFuICovCisjZGVmaW5lIEJNUl9EU0wgICAgMHgwMDAwMDA3YyAgICAgICAvKiBEZXNjcmlwdG9yIFNraXAgTGVuZ3RoICovCisjZGVmaW5lIEJNUl9CQVIgICAgMHgwMDAwMDAwMiAgICAgICAvKiBCdXMgQVJiaXRyYXRpb24gKi8KKyNkZWZpbmUgQk1SX1NXUiAgICAweDAwMDAwMDAxICAgICAgIC8qIFNvZnR3YXJlIFJlc2V0ICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRpbWluZ3MgaGVyZSBhcmUgZm9yIDEwQkFTRS1UL0FVSSBvbmx5Ki8KKyNkZWZpbmUgVEFQX05PUE9MTCAweDAwMDAwMDAwICAgICAgIC8qIE5vIGF1dG9tYXRpYyBwb2xsaW5nICovCisjZGVmaW5lIFRBUF8yMDBVUyAgMHgwMDAyMDAwMCAgICAgICAvKiBUWCBhdXRvbWF0aWMgcG9sbGluZyBldmVyeSAyMDB1cyAqLworI2RlZmluZSBUQVBfODAwVVMgIDB4MDAwNDAwMDAgICAgICAgLyogVFggYXV0b21hdGljIHBvbGxpbmcgZXZlcnkgODAwdXMgKi8KKyNkZWZpbmUgVEFQXzFfNk1TICAweDAwMDYwMDAwICAgICAgIC8qIFRYIGF1dG9tYXRpYyBwb2xsaW5nIGV2ZXJ5IDEuNm1zICovCisjZGVmaW5lIFRBUF8xMl84VVMgMHgwMDA4MDAwMCAgICAgICAvKiBUWCBhdXRvbWF0aWMgcG9sbGluZyBldmVyeSAxMi44dXMgKi8KKyNkZWZpbmUgVEFQXzI1XzZVUyAweDAwMGEwMDAwICAgICAgIC8qIFRYIGF1dG9tYXRpYyBwb2xsaW5nIGV2ZXJ5IDI1LjZ1cyAqLworI2RlZmluZSBUQVBfNTFfMlVTIDB4MDAwYzAwMDAgICAgICAgLyogVFggYXV0b21hdGljIHBvbGxpbmcgZXZlcnkgNTEuMnVzICovCisjZGVmaW5lIFRBUF8xMDJfNFVTIDB4MDAwZTAwMDAgICAgICAvKiBUWCBhdXRvbWF0aWMgcG9sbGluZyBldmVyeSAxMDIuNHVzICovCisKKyNkZWZpbmUgQ0FMX05PVVNFICAweDAwMDAwMDAwICAgICAgIC8qIE5vdCB1c2VkICovCisjZGVmaW5lIENBTF84TE9ORyAgMHgwMDAwNDAwMCAgICAgICAvKiA4LWxvbmd3b3JkIGFsaWdubWVudCAqLworI2RlZmluZSBDQUxfMTZMT05HIDB4MDAwMDgwMDAgICAgICAgLyogMTYtbG9uZ3dvcmQgYWxpZ25tZW50ICovCisjZGVmaW5lIENBTF8zMkxPTkcgMHgwMDAwYzAwMCAgICAgICAvKiAzMi1sb25nd29yZCBhbGlnbm1lbnQgKi8KKworI2RlZmluZSBQQkxfMCAgICAgIDB4MDAwMDAwMDAgICAgICAgLyogIERNQSBidXJzdCBsZW5ndGggPSBhbW91bnQgaW4gUlggRklGTyAqLworI2RlZmluZSBQQkxfMSAgICAgIDB4MDAwMDAxMDAgICAgICAgLyogIDEgbG9uZ3dvcmQgIERNQSBidXJzdCBsZW5ndGggKi8KKyNkZWZpbmUgUEJMXzIgICAgICAweDAwMDAwMjAwICAgICAgIC8qICAyIGxvbmd3b3JkcyBETUEgYnVyc3QgbGVuZ3RoICovCisjZGVmaW5lIFBCTF80ICAgICAgMHgwMDAwMDQwMCAgICAgICAvKiAgNCBsb25nd29yZHMgRE1BIGJ1cnN0IGxlbmd0aCAqLworI2RlZmluZSBQQkxfOCAgICAgIDB4MDAwMDA4MDAgICAgICAgLyogIDggbG9uZ3dvcmRzIERNQSBidXJzdCBsZW5ndGggKi8KKyNkZWZpbmUgUEJMXzE2ICAgICAweDAwMDAxMDAwICAgICAgIC8qIDE2IGxvbmd3b3JkcyBETUEgYnVyc3QgbGVuZ3RoICovCisjZGVmaW5lIFBCTF8zMiAgICAgMHgwMDAwMjAwMCAgICAgICAvKiAzMiBsb25nd29yZHMgRE1BIGJ1cnN0IGxlbmd0aCAqLworCisjZGVmaW5lIERTTF8wICAgICAgMHgwMDAwMDAwMCAgICAgICAvKiAgMCBsb25nd29yZCAgLyBkZXNjcmlwdG9yICovCisjZGVmaW5lIERTTF8xICAgICAgMHgwMDAwMDAwNCAgICAgICAvKiAgMSBsb25nd29yZCAgLyBkZXNjcmlwdG9yICovCisjZGVmaW5lIERTTF8yICAgICAgMHgwMDAwMDAwOCAgICAgICAvKiAgMiBsb25nd29yZHMgLyBkZXNjcmlwdG9yICovCisjZGVmaW5lIERTTF80ICAgICAgMHgwMDAwMDAxMCAgICAgICAvKiAgNCBsb25nd29yZHMgLyBkZXNjcmlwdG9yICovCisjZGVmaW5lIERTTF84ICAgICAgMHgwMDAwMDAyMCAgICAgICAvKiAgOCBsb25nd29yZHMgLyBkZXNjcmlwdG9yICovCisjZGVmaW5lIERTTF8xNiAgICAgMHgwMDAwMDA0MCAgICAgICAvKiAxNiBsb25nd29yZHMgLyBkZXNjcmlwdG9yICovCisjZGVmaW5lIERTTF8zMiAgICAgMHgwMDAwMDA4MCAgICAgICAvKiAzMiBsb25nd29yZHMgLyBkZXNjcmlwdG9yICovCisKKy8qCisqKiBEQzIxMDQwIFRyYW5zbWl0IFBvbGwgRGVtYW5kIFJlZ2lzdGVyIChERTRYNV9UUEQpCisqLworI2RlZmluZSBUUEQgICAgICAgIDB4MDAwMDAwMDEgICAgICAgLyogVHJhbnNtaXQgUG9sbCBEZW1hbmQgKi8KKworLyoKKyoqIERDMjEwNDAgUmVjZWl2ZSBQb2xsIERlbWFuZCBSZWdpc3RlciAoREU0WDVfUlBEKQorKi8KKyNkZWZpbmUgUlBEICAgICAgICAweDAwMDAwMDAxICAgICAgIC8qIFJlY2VpdmUgUG9sbCBEZW1hbmQgKi8KKworLyoKKyoqIERDMjEwNDAgUmVjZWl2ZSBSaW5nIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAoREU0WDVfUlJCQSkKKyovCisjZGVmaW5lIFJSQkEgICAgICAgMHhmZmZmZmZmYyAgICAgICAvKiBSWCBEZXNjcmlwdG9yIExpc3QgU3RhcnQgQWRkcmVzcyAqLworCisvKgorKiogREMyMTA0MCBUcmFuc21pdCBSaW5nIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAoREU0WDVfVFJCQSkKKyovCisjZGVmaW5lIFRSQkEgICAgICAgMHhmZmZmZmZmYyAgICAgICAvKiBUWCBEZXNjcmlwdG9yIExpc3QgU3RhcnQgQWRkcmVzcyAqLworCisvKgorKiogU3RhdHVzIFJlZ2lzdGVyIChERTRYNV9TVFMpCisqLworI2RlZmluZSBTVFNfR1BJICAgIDB4MDQwMDAwMDAgICAgICAgLyogR2VuZXJhbCBQdXJwb3NlIFBvcnQgSW50ZXJydXB0ICovCisjZGVmaW5lIFNUU19CRSAgICAgMHgwMzgwMDAwMCAgICAgICAvKiBCdXMgRXJyb3IgQml0cyAqLworI2RlZmluZSBTVFNfVFMgICAgIDB4MDA3MDAwMDAgICAgICAgLyogVHJhbnNtaXQgUHJvY2VzcyBTdGF0ZSAqLworI2RlZmluZSBTVFNfUlMgICAgIDB4MDAwZTAwMDAgICAgICAgLyogUmVjZWl2ZSBQcm9jZXNzIFN0YXRlICovCisjZGVmaW5lIFNUU19OSVMgICAgMHgwMDAxMDAwMCAgICAgICAvKiBOb3JtYWwgSW50ZXJydXB0IFN1bW1hcnkgKi8KKyNkZWZpbmUgU1RTX0FJUyAgICAweDAwMDA4MDAwICAgICAgIC8qIEFibm9ybWFsIEludGVycnVwdCBTdW1tYXJ5ICovCisjZGVmaW5lIFNUU19FUiAgICAgMHgwMDAwNDAwMCAgICAgICAvKiBFYXJseSBSZWNlaXZlICovCisjZGVmaW5lIFNUU19GQkUgICAgMHgwMDAwMjAwMCAgICAgICAvKiBGYXRhbCBCdXMgRXJyb3IgKi8KKyNkZWZpbmUgU1RTX1NFICAgICAweDAwMDAyMDAwICAgICAgIC8qIFN5c3RlbSBFcnJvciAqLworI2RlZmluZSBTVFNfTE5GICAgIDB4MDAwMDEwMDAgICAgICAgLyogTGluayBGYWlsICovCisjZGVmaW5lIFNUU19GRCAgICAgMHgwMDAwMDgwMCAgICAgICAvKiBGdWxsLUR1cGxleCBTaG9ydCBGcmFtZSBSZWNlaXZlZCAqLworI2RlZmluZSBTVFNfVE0gICAgIDB4MDAwMDA4MDAgICAgICAgLyogVGltZXIgRXhwaXJlZCAoREMyMTA0MSkgKi8KKyNkZWZpbmUgU1RTX0VUSSAgICAweDAwMDAwNDAwICAgICAgIC8qIEVhcmx5IFRyYW5zbWl0IEludGVycnVwdCAqLworI2RlZmluZSBTVFNfQVQgICAgIDB4MDAwMDA0MDAgICAgICAgLyogQVVJL1RQIFBpbiAqLworI2RlZmluZSBTVFNfUldUICAgIDB4MDAwMDAyMDAgICAgICAgLyogUmVjZWl2ZSBXYXRjaGRvZyBUaW1lLU91dCAqLworI2RlZmluZSBTVFNfUlBTICAgIDB4MDAwMDAxMDAgICAgICAgLyogUmVjZWl2ZSBQcm9jZXNzIFN0b3BwZWQgKi8KKyNkZWZpbmUgU1RTX1JVICAgICAweDAwMDAwMDgwICAgICAgIC8qIFJlY2VpdmUgQnVmZmVyIFVuYXZhaWxhYmxlICovCisjZGVmaW5lIFNUU19SSSAgICAgMHgwMDAwMDA0MCAgICAgICAvKiBSZWNlaXZlIEludGVycnVwdCAqLworI2RlZmluZSBTVFNfVU5GICAgIDB4MDAwMDAwMjAgICAgICAgLyogVHJhbnNtaXQgVW5kZXJmbG93ICovCisjZGVmaW5lIFNUU19MTlAgICAgMHgwMDAwMDAxMCAgICAgICAvKiBMaW5rIFBhc3MgKi8KKyNkZWZpbmUgU1RTX0FOQyAgICAweDAwMDAwMDEwICAgICAgIC8qIEF1dG9uZWdvdGlhdGlvbiBDb21wbGV0ZSAqLworI2RlZmluZSBTVFNfVEpUICAgIDB4MDAwMDAwMDggICAgICAgLyogVHJhbnNtaXQgSmFiYmVyIFRpbWUtT3V0ICovCisjZGVmaW5lIFNUU19UVSAgICAgMHgwMDAwMDAwNCAgICAgICAvKiBUcmFuc21pdCBCdWZmZXIgVW5hdmFpbGFibGUgKi8KKyNkZWZpbmUgU1RTX1RQUyAgICAweDAwMDAwMDAyICAgICAgIC8qIFRyYW5zbWl0IFByb2Nlc3MgU3RvcHBlZCAqLworI2RlZmluZSBTVFNfVEkgICAgIDB4MDAwMDAwMDEgICAgICAgLyogVHJhbnNtaXQgSW50ZXJydXB0ICovCisKKyNkZWZpbmUgRUJfUEFSICAgICAweDAwMDAwMDAwICAgICAgIC8qIFBhcml0eSBFcnJvciAqLworI2RlZmluZSBFQl9NQSAgICAgIDB4MDA4MDAwMDAgICAgICAgLyogTWFzdGVyIEFib3J0ICovCisjZGVmaW5lIEVCX1RBICAgICAgMHgwMTAwMDAwMCAgICAgICAvKiBUYXJnZXQgQWJvcnQgKi8KKyNkZWZpbmUgRUJfUkVTMCAgICAweDAxODAwMDAwICAgICAgIC8qIFJlc2VydmVkICovCisjZGVmaW5lIEVCX1JFUzEgICAgMHgwMjAwMDAwMCAgICAgICAvKiBSZXNlcnZlZCAqLworCisjZGVmaW5lIFRTX1NUT1AgICAgMHgwMDAwMDAwMCAgICAgICAvKiBTdG9wcGVkICovCisjZGVmaW5lIFRTX0ZURCAgICAgMHgwMDEwMDAwMCAgICAgICAvKiBGZXRjaCBUcmFuc21pdCBEZXNjcmlwdG9yICovCisjZGVmaW5lIFRTX1dFT1QgICAgMHgwMDIwMDAwMCAgICAgICAvKiBXYWl0IGZvciBFbmQgT2YgVHJhbnNtaXNzaW9uICovCisjZGVmaW5lIFRTX1FEQVQgICAgMHgwMDMwMDAwMCAgICAgICAvKiBRdWV1ZSBza2IgZGF0YSBpbnRvIFRYIEZJRk8gKi8KKyNkZWZpbmUgVFNfUkVTICAgICAweDAwNDAwMDAwICAgICAgIC8qIFJlc2VydmVkICovCisjZGVmaW5lIFRTX1NQS1QgICAgMHgwMDUwMDAwMCAgICAgICAvKiBTZXR1cCBQYWNrZXQgKi8KKyNkZWZpbmUgVFNfU1VTUCAgICAweDAwNjAwMDAwICAgICAgIC8qIFN1c3BlbmRlZCAqLworI2RlZmluZSBUU19DTFREICAgIDB4MDA3MDAwMDAgICAgICAgLyogQ2xvc2UgVHJhbnNtaXQgRGVzY3JpcHRvciAqLworCisjZGVmaW5lIFJTX1NUT1AgICAgMHgwMDAwMDAwMCAgICAgICAvKiBTdG9wcGVkICovCisjZGVmaW5lIFJTX0ZSRCAgICAgMHgwMDAyMDAwMCAgICAgICAvKiBGZXRjaCBSZWNlaXZlIERlc2NyaXB0b3IgKi8KKyNkZWZpbmUgUlNfQ0VPUiAgICAweDAwMDQwMDAwICAgICAgIC8qIENoZWNrIGZvciBFbmQgb2YgUmVjZWl2ZSBQYWNrZXQgKi8KKyNkZWZpbmUgUlNfV0ZSUCAgICAweDAwMDYwMDAwICAgICAgIC8qIFdhaXQgZm9yIFJlY2VpdmUgUGFja2V0ICovCisjZGVmaW5lIFJTX1NVU1AgICAgMHgwMDA4MDAwMCAgICAgICAvKiBTdXNwZW5kZWQgKi8KKyNkZWZpbmUgUlNfQ0xSRCAgICAweDAwMGEwMDAwICAgICAgIC8qIENsb3NlIFJlY2VpdmUgRGVzY3JpcHRvciAqLworI2RlZmluZSBSU19GTFVTSCAgIDB4MDAwYzAwMDAgICAgICAgLyogRmx1c2ggUlggRklGTyAqLworI2RlZmluZSBSU19RUkZTICAgIDB4MDAwZTAwMDAgICAgICAgLyogUXVldWUgUlggRklGTyBpbnRvIFJYIFNrYiAqLworCisjZGVmaW5lIElOVF9DQU5DRUwgMHgwMDAxZmZmZiAgICAgICAvKiBGb3IgemVyb2luZyBhbGwgaW50ZXJydXB0IHNvdXJjZXMgKi8KKworLyoKKyoqIE9wZXJhdGlvbiBNb2RlIFJlZ2lzdGVyIChERTRYNV9PTVIpCisqLworI2RlZmluZSBPTVJfU0MgICAgIDB4ODAwMDAwMDAgICAgICAgLyogU3BlY2lhbCBDYXB0dXJlIEVmZmVjdCBFbmFibGUgKi8KKyNkZWZpbmUgT01SX1JBICAgICAweDQwMDAwMDAwICAgICAgIC8qIFJlY2VpdmUgQWxsICovCisjZGVmaW5lIE9NUl9TRFAgICAgMHgwMjAwMDAwMCAgICAgICAvKiBTRCBQb2xhcml0eSAtIE1VU1QgQkUgQVNTRVJURUQgKi8KKyNkZWZpbmUgT01SX1NDUiAgICAweDAxMDAwMDAwICAgICAgIC8qIFNjcmFtYmxlciBNb2RlICovCisjZGVmaW5lIE9NUl9QQ1MgICAgMHgwMDgwMDAwMCAgICAgICAvKiBQQ1MgRnVuY3Rpb24gKi8KKyNkZWZpbmUgT01SX1RUTSAgICAweDAwNDAwMDAwICAgICAgIC8qIFRyYW5zbWl0IFRocmVzaG9sZCBNb2RlICovCisjZGVmaW5lIE9NUl9TRiAgICAgMHgwMDIwMDAwMCAgICAgICAvKiBTdG9yZSBhbmQgRm9yd2FyZCAqLworI2RlZmluZSBPTVJfSEJEICAgIDB4MDAwODAwMDAgICAgICAgLyogSGVhcnRCZWF0IERpc2FibGUgKi8KKyNkZWZpbmUgT01SX1BTICAgICAweDAwMDQwMDAwICAgICAgIC8qIFBvcnQgU2VsZWN0ICovCisjZGVmaW5lIE9NUl9DQSAgICAgMHgwMDAyMDAwMCAgICAgICAvKiBDYXB0dXJlIEVmZmVjdCBFbmFibGUgKi8KKyNkZWZpbmUgT01SX0JQICAgICAweDAwMDEwMDAwICAgICAgIC8qIEJhY2sgUHJlc3N1cmUgKi8KKyNkZWZpbmUgT01SX1RSICAgICAweDAwMDBjMDAwICAgICAgIC8qIFRocmVzaG9sZCBDb250cm9sIEJpdHMgKi8KKyNkZWZpbmUgT01SX1NUICAgICAweDAwMDAyMDAwICAgICAgIC8qIFN0YXJ0L1N0b3AgVHJhbnNtaXNzaW9uIENvbW1hbmQgKi8KKyNkZWZpbmUgT01SX0ZDICAgICAweDAwMDAxMDAwICAgICAgIC8qIEZvcmNlIENvbGxpc2lvbiBNb2RlICovCisjZGVmaW5lIE9NUl9PTSAgICAgMHgwMDAwMGMwMCAgICAgICAvKiBPcGVyYXRpbmcgTW9kZSAqLworI2RlZmluZSBPTVJfRkRYICAgIDB4MDAwMDAyMDAgICAgICAgLyogRnVsbCBEdXBsZXggTW9kZSAqLworI2RlZmluZSBPTVJfRktEICAgIDB4MDAwMDAxMDAgICAgICAgLyogRmxha3kgT3NjaWxsYXRvciBEaXNhYmxlICovCisjZGVmaW5lIE9NUl9QTSAgICAgMHgwMDAwMDA4MCAgICAgICAvKiBQYXNzIEFsbCBNdWx0aWNhc3QgKi8KKyNkZWZpbmUgT01SX1BSICAgICAweDAwMDAwMDQwICAgICAgIC8qIFByb21pc2N1b3VzIE1vZGUgKi8KKyNkZWZpbmUgT01SX1NCICAgICAweDAwMDAwMDIwICAgICAgIC8qIFN0YXJ0L1N0b3AgQmFja29mZiBDb3VudGVyICovCisjZGVmaW5lIE9NUl9JRiAgICAgMHgwMDAwMDAxMCAgICAgICAvKiBJbnZlcnNlIEZpbHRlcmluZyAqLworI2RlZmluZSBPTVJfUEIgICAgIDB4MDAwMDAwMDggICAgICAgLyogUGFzcyBCYWQgRnJhbWVzICovCisjZGVmaW5lIE9NUl9ITyAgICAgMHgwMDAwMDAwNCAgICAgICAvKiBIYXNoIE9ubHkgRmlsdGVyaW5nIE1vZGUgKi8KKyNkZWZpbmUgT01SX1NSICAgICAweDAwMDAwMDAyICAgICAgIC8qIFN0YXJ0L1N0b3AgUmVjZWl2ZSAqLworI2RlZmluZSBPTVJfSFAgICAgIDB4MDAwMDAwMDEgICAgICAgLyogSGFzaC9QZXJmZWN0IFJlY2VpdmUgRmlsdGVyaW5nIE1vZGUgKi8KKworI2RlZmluZSBUUl83MiAgICAgIDB4MDAwMDAwMDAgICAgICAgLyogVGhyZXNob2xkIHNldCB0byA3MiAoMTI4KSBieXRlcyAqLworI2RlZmluZSBUUl85NiAgICAgIDB4MDAwMDQwMDAgICAgICAgLyogVGhyZXNob2xkIHNldCB0byA5NiAoMjU2KSBieXRlcyAqLworI2RlZmluZSBUUl8xMjggICAgIDB4MDAwMDgwMDAgICAgICAgLyogVGhyZXNob2xkIHNldCB0byAxMjggKDUxMikgYnl0ZXMgKi8KKyNkZWZpbmUgVFJfMTYwICAgICAweDAwMDBjMDAwICAgICAgIC8qIFRocmVzaG9sZCBzZXQgdG8gMTYwICgxMDI0KSBieXRlcyAqLworCisjZGVmaW5lIE9NUl9ERUYgICAgIChPTVJfU0RQKQorI2RlZmluZSBPTVJfU0lBICAgICAoT01SX1NEUCB8IE9NUl9UVE0pCisjZGVmaW5lIE9NUl9TWU0gICAgIChPTVJfU0RQIHwgT01SX1NDUiB8IE9NUl9QQ1MgfCBPTVJfSEJEIHwgT01SX1BTKQorI2RlZmluZSBPTVJfTUlJXzEwICAoT01SX1NEUCB8IE9NUl9UVE0gfCBPTVJfUFMpCisjZGVmaW5lIE9NUl9NSUlfMTAwIChPTVJfU0RQIHwgT01SX0hCRCB8IE9NUl9QUykKKworLyoKKyoqIERDMjEwNDAgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKERFNFg1X0lNUikKKyovCisjZGVmaW5lIElNUl9HUE0gICAgMHgwNDAwMDAwMCAgICAgICAvKiBHZW5lcmFsIFB1cnBvc2UgUG9ydCBNYXNrICovCisjZGVmaW5lIElNUl9OSU0gICAgMHgwMDAxMDAwMCAgICAgICAvKiBOb3JtYWwgSW50ZXJydXB0IFN1bW1hcnkgTWFzayAqLworI2RlZmluZSBJTVJfQUlNICAgIDB4MDAwMDgwMDAgICAgICAgLyogQWJub3JtYWwgSW50ZXJydXB0IFN1bW1hcnkgTWFzayAqLworI2RlZmluZSBJTVJfRVJNICAgIDB4MDAwMDQwMDAgICAgICAgLyogRWFybHkgUmVjZWl2ZSBNYXNrICovCisjZGVmaW5lIElNUl9GQk0gICAgMHgwMDAwMjAwMCAgICAgICAvKiBGYXRhbCBCdXMgRXJyb3IgTWFzayAqLworI2RlZmluZSBJTVJfU0VNICAgIDB4MDAwMDIwMDAgICAgICAgLyogU3lzdGVtIEVycm9yIE1hc2sgKi8KKyNkZWZpbmUgSU1SX0xGTSAgICAweDAwMDAxMDAwICAgICAgIC8qIExpbmsgRmFpbCBNYXNrICovCisjZGVmaW5lIElNUl9GRE0gICAgMHgwMDAwMDgwMCAgICAgICAvKiBGdWxsLUR1cGxleCAoU2hvcnQgRnJhbWUpIE1hc2sgKi8KKyNkZWZpbmUgSU1SX1RNTSAgICAweDAwMDAwODAwICAgICAgIC8qIFRpbWVyIEV4cGlyZWQgTWFzayAoREMyMTA0MSkgKi8KKyNkZWZpbmUgSU1SX0VUTSAgICAweDAwMDAwNDAwICAgICAgIC8qIEVhcmx5IFRyYW5zbWl0IEludGVycnVwdCBNYXNrICovCisjZGVmaW5lIElNUl9BVE0gICAgMHgwMDAwMDQwMCAgICAgICAvKiBBVUkvVFAgU3dpdGNoIE1hc2sgKi8KKyNkZWZpbmUgSU1SX1JXTSAgICAweDAwMDAwMjAwICAgICAgIC8qIFJlY2VpdmUgV2F0Y2hkb2cgVGltZS1PdXQgTWFzayAqLworI2RlZmluZSBJTVJfUlNNICAgIDB4MDAwMDAxMDAgICAgICAgLyogUmVjZWl2ZSBTdG9wcGVkIE1hc2sgKi8KKyNkZWZpbmUgSU1SX1JVTSAgICAweDAwMDAwMDgwICAgICAgIC8qIFJlY2VpdmUgQnVmZmVyIFVuYXZhaWxhYmxlIE1hc2sgKi8KKyNkZWZpbmUgSU1SX1JJTSAgICAweDAwMDAwMDQwICAgICAgIC8qIFJlY2VpdmUgSW50ZXJydXB0IE1hc2sgKi8KKyNkZWZpbmUgSU1SX1VOTSAgICAweDAwMDAwMDIwICAgICAgIC8qIFVuZGVyZmxvdyBJbnRlcnJ1cHQgTWFzayAqLworI2RlZmluZSBJTVJfQU5NICAgIDB4MDAwMDAwMTAgICAgICAgLyogQXV0b25lZ290aWF0aW9uIENvbXBsZXRlIE1hc2sgKi8KKyNkZWZpbmUgSU1SX0xQTSAgICAweDAwMDAwMDEwICAgICAgIC8qIExpbmsgUGFzcyAqLworI2RlZmluZSBJTVJfVEpNICAgIDB4MDAwMDAwMDggICAgICAgLyogVHJhbnNtaXQgVGltZS1PdXQgSmFiYmVyIE1hc2sgKi8KKyNkZWZpbmUgSU1SX1RVTSAgICAweDAwMDAwMDA0ICAgICAgIC8qIFRyYW5zbWl0IEJ1ZmZlciBVbmF2YWlsYWJsZSBNYXNrICovCisjZGVmaW5lIElNUl9UU00gICAgMHgwMDAwMDAwMiAgICAgICAvKiBUcmFuc21pc3Npb24gU3RvcHBlZCBNYXNrICovCisjZGVmaW5lIElNUl9USU0gICAgMHgwMDAwMDAwMSAgICAgICAvKiBUcmFuc21pdCBJbnRlcnJ1cHQgTWFzayAqLworCisvKgorKiogTWlzc2VkIEZyYW1lcyBhbmQgRklGTyBPdmVyZmxvdyBDb3VudGVycyAoREU0WDVfTUZDKQorKi8KKyNkZWZpbmUgTUZDX0ZPQ08gICAweDEwMDAwMDAwICAgICAgIC8qIEZJRk8gT3ZlcmZsb3cgQ291bnRlciBPdmVyZmxvdyBCaXQgKi8KKyNkZWZpbmUgTUZDX0ZPQyAgICAweDBmZmUwMDAwICAgICAgIC8qIEZJRk8gT3ZlcmZsb3cgQ291bnRlciBCaXRzICovCisjZGVmaW5lIE1GQ19PVkZMICAgMHgwMDAxMDAwMCAgICAgICAvKiBNaXNzZWQgRnJhbWVzIENvdW50ZXIgT3ZlcmZsb3cgQml0ICovCisjZGVmaW5lIE1GQ19DTlRSICAgMHgwMDAwZmZmZiAgICAgICAvKiBNaXNzZWQgRnJhbWVzIENvdW50ZXIgQml0cyAqLworI2RlZmluZSBNRkNfRk9DTSAgIDB4MWZmZTAwMDAgICAgICAgLyogRklGTyBPdmVyZmxvdyBDb3VudGVyIE1hc2sgKi8KKworLyoKKyoqIERDMjEwNDAgRXRoZXJuZXQgQWRkcmVzcyBQUk9NIChERTRYNV9BUFJPTSkKKyovCisjZGVmaW5lIEFQUk9NX0ROICAgMHg4MDAwMDAwMCAgICAgICAvKiBEYXRhIE5vdCBWYWxpZCAqLworI2RlZmluZSBBUFJPTV9EVCAgIDB4MDAwMDAwZmYgICAgICAgLyogQWRkcmVzcyBCeXRlICovCisKKy8qCisqKiBEQzIxMDQxIEJvb3QvRXRoZXJuZXQgQWRkcmVzcyBST00gKERFNFg1X0JST00pCisqLworI2RlZmluZSBCUk9NX01PREUgMHgwMDAwODAwMCAgICAgICAvKiBNT0RFXzE6IDAsICBNT0RFXzA6IDEgIChyZWFkIG9ubHkpICovCisjZGVmaW5lIEJST01fUkQgICAweDAwMDA0MDAwICAgICAgIC8qIFJlYWQgZnJvbSBCb290IFJPTSAqLworI2RlZmluZSBCUk9NX1dSICAgMHgwMDAwMjAwMCAgICAgICAvKiBXcml0ZSB0byBCb290IFJPTSAqLworI2RlZmluZSBCUk9NX0JSICAgMHgwMDAwMTAwMCAgICAgICAvKiBTZWxlY3QgQm9vdCBST00gd2hlbiBzZXQgKi8KKyNkZWZpbmUgQlJPTV9TUiAgIDB4MDAwMDA4MDAgICAgICAgLyogU2VsZWN0IFNlcmlhbCBST00gd2hlbiBzZXQgKi8KKyNkZWZpbmUgQlJPTV9SRUcgIDB4MDAwMDA0MDAgICAgICAgLyogRXh0ZXJuYWwgUmVnaXN0ZXIgU2VsZWN0ICovCisjZGVmaW5lIEJST01fRFQgICAweDAwMDAwMGZmICAgICAgIC8qIERhdGEgQnl0ZSAqLworCisvKgorKiogREMyMTA0MSBTZXJpYWwvRXRoZXJuZXQgQWRkcmVzcyBST00gKERFNFg1X1NST00sIERFNFg1X01JSSkKKyovCisjZGVmaW5lIE1JSV9NREkgICAweDAwMDgwMDAwICAgICAgIC8qIE1JSSBNYW5hZ2VtZW50IERhdGEgSW4gKi8KKyNkZWZpbmUgTUlJX01ETyAgIDB4MDAwNjAwMDAgICAgICAgLyogTUlJIE1hbmFnZW1lbnQgTW9kZS9EYXRhIE91dCAqLworI2RlZmluZSBNSUlfTVJEICAgMHgwMDA0MDAwMCAgICAgICAvKiBNSUkgTWFuYWdlbWVudCBEZWZpbmUgUmVhZCBNb2RlICovCisjZGVmaW5lIE1JSV9NV1IgICAweDAwMDAwMDAwICAgICAgIC8qIE1JSSBNYW5hZ2VtZW50IERlZmluZSBXcml0ZSBNb2RlICovCisjZGVmaW5lIE1JSV9NRFQgICAweDAwMDIwMDAwICAgICAgIC8qIE1JSSBNYW5hZ2VtZW50IERhdGEgT3V0ICovCisjZGVmaW5lIE1JSV9NREMgICAweDAwMDEwMDAwICAgICAgIC8qIE1JSSBNYW5hZ2VtZW50IENsb2NrICovCisjZGVmaW5lIE1JSV9SRCAgICAweDAwMDA0MDAwICAgICAgIC8qIFJlYWQgZnJvbSBNSUkgKi8KKyNkZWZpbmUgTUlJX1dSICAgIDB4MDAwMDIwMDAgICAgICAgLyogV3JpdGUgdG8gTUlJICovCisjZGVmaW5lIE1JSV9TRUwgICAweDAwMDAwODAwICAgICAgIC8qIFNlbGVjdCBNSUkgd2hlbiBSRVNFVCAqLworCisjZGVmaW5lIFNST01fTU9ERSAweDAwMDA4MDAwICAgICAgIC8qIE1PREVfMTogMCwgIE1PREVfMDogMSAgKHJlYWQgb25seSkgKi8KKyNkZWZpbmUgU1JPTV9SRCAgIDB4MDAwMDQwMDAgICAgICAgLyogUmVhZCBmcm9tIEJvb3QgUk9NICovCisjZGVmaW5lIFNST01fV1IgICAweDAwMDAyMDAwICAgICAgIC8qIFdyaXRlIHRvIEJvb3QgUk9NICovCisjZGVmaW5lIFNST01fQlIgICAweDAwMDAxMDAwICAgICAgIC8qIFNlbGVjdCBCb290IFJPTSB3aGVuIHNldCAqLworI2RlZmluZSBTUk9NX1NSICAgMHgwMDAwMDgwMCAgICAgICAvKiBTZWxlY3QgU2VyaWFsIFJPTSB3aGVuIHNldCAqLworI2RlZmluZSBTUk9NX1JFRyAgMHgwMDAwMDQwMCAgICAgICAvKiBFeHRlcm5hbCBSZWdpc3RlciBTZWxlY3QgKi8KKyNkZWZpbmUgU1JPTV9EVCAgIDB4MDAwMDAwZmYgICAgICAgLyogRGF0YSBCeXRlICovCisKKyNkZWZpbmUgRFRfT1VUICAgIDB4MDAwMDAwMDggICAgICAgLyogU2VyaWFsIERhdGEgT3V0ICovCisjZGVmaW5lIERUX0lOICAgICAweDAwMDAwMDA0ICAgICAgIC8qIFNlcmlhbCBEYXRhIEluICovCisjZGVmaW5lIERUX0NMSyAgICAweDAwMDAwMDAyICAgICAgIC8qIFNlcmlhbCBST00gQ2xvY2sgKi8KKyNkZWZpbmUgRFRfQ1MgICAgIDB4MDAwMDAwMDEgICAgICAgLyogU2VyaWFsIFJPTSBDaGlwIFNlbGVjdCAqLworCisjZGVmaW5lIE1JSV9QUkVBTUJMRSAweGZmZmZmZmZmICAgIC8qIE1JSSBNYW5hZ2VtZW50IFByZWFtYmxlICovCisjZGVmaW5lIE1JSV9URVNUICAgICAweGFhYWFhYWFhICAgIC8qIE1JSSBUZXN0IFNpZ25hbCAqLworI2RlZmluZSBNSUlfU1RSRCAgICAgMHgwNiAgICAgICAgICAvKiBTdGFydCBvZiBGcmFtZStPcCBDb2RlOiB1c2UgbG93IG5pYmJsZSAqLworI2RlZmluZSBNSUlfU1RXUiAgICAgMHgwYSAgICAgICAgICAvKiBTdGFydCBvZiBGcmFtZStPcCBDb2RlOiB1c2UgbG93IG5pYmJsZSAqLworCisjZGVmaW5lIE1JSV9DUiAgICAgICAweDAwICAgICAgICAgIC8qIE1JSSBNYW5hZ2VtZW50IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX1NSICAgICAgIDB4MDEgICAgICAgICAgLyogTUlJIE1hbmFnZW1lbnQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9JRDAgICAgICAweDAyICAgICAgICAgIC8qIFBIWSBJZGVudGlmaWVyIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgTUlJX0lEMSAgICAgIDB4MDMgICAgICAgICAgLyogUEhZIElkZW50aWZpZXIgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBNSUlfQU5BICAgICAgMHgwNCAgICAgICAgICAvKiBBdXRvIE5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgKi8KKyNkZWZpbmUgTUlJX0FOTFBBICAgIDB4MDUgICAgICAgICAgLyogQXV0byBOZWdvdGlhdGlvbiBMaW5rIFBhcnRuZXIgQWJpbGl0eSAqLworI2RlZmluZSBNSUlfQU5FICAgICAgMHgwNiAgICAgICAgICAvKiBBdXRvIE5lZ290aWF0aW9uIEV4cGFuc2lvbiAqLworI2RlZmluZSBNSUlfQU5QICAgICAgMHgwNyAgICAgICAgICAvKiBBdXRvIE5lZ290aWF0aW9uIE5leHQgUGFnZSBUWCAqLworCisjZGVmaW5lIERFNFg1X01BWF9NSUkgMzIgICAgICAgICAgIC8qIE1heGltdW0gYWRkcmVzcyBvZiBNSUkgUEhZIGRldmljZXMgKi8KKworLyoKKyoqIE1JSSBNYW5hZ2VtZW50IENvbnRyb2wgUmVnaXN0ZXIKKyovCisjZGVmaW5lIE1JSV9DUl9SU1QgIDB4ODAwMCAgICAgICAgIC8qIFJFU0VUIHRoZSBQSFkgY2hpcCAqLworI2RlZmluZSBNSUlfQ1JfTFBCSyAweDQwMDAgICAgICAgICAvKiBMb29wYmFjayBlbmFibGUgKi8KKyNkZWZpbmUgTUlJX0NSX1NQRCAgMHgyMDAwICAgICAgICAgLyogMDogMTBNYi9zOyAxOiAxMDBNYi9zICovCisjZGVmaW5lIE1JSV9DUl8xMCAgIDB4MDAwMCAgICAgICAgIC8qIFNldCAxME1iL3MgKi8KKyNkZWZpbmUgTUlJX0NSXzEwMCAgMHgyMDAwICAgICAgICAgLyogU2V0IDEwME1iL3MgKi8KKyNkZWZpbmUgTUlJX0NSX0FTU0UgMHgxMDAwICAgICAgICAgLyogQXV0byBTcGVlZCBTZWxlY3QgRW5hYmxlICovCisjZGVmaW5lIE1JSV9DUl9QRCAgIDB4MDgwMCAgICAgICAgIC8qIFBvd2VyIERvd24gKi8KKyNkZWZpbmUgTUlJX0NSX0lTT0wgMHgwNDAwICAgICAgICAgLyogSXNvbGF0ZSBNb2RlICovCisjZGVmaW5lIE1JSV9DUl9SQU4gIDB4MDIwMCAgICAgICAgIC8qIFJlc3RhcnQgQXV0byBOZWdvdGlhdGlvbiAqLworI2RlZmluZSBNSUlfQ1JfRkRNICAweDAxMDAgICAgICAgICAvKiBGdWxsIER1cGxleCBNb2RlICovCisjZGVmaW5lIE1JSV9DUl9DVEUgIDB4MDA4MCAgICAgICAgIC8qIENvbGxpc2lvbiBUZXN0IEVuYWJsZSAqLworCisvKgorKiogTUlJIE1hbmFnZW1lbnQgU3RhdHVzIFJlZ2lzdGVyCisqLworI2RlZmluZSBNSUlfU1JfVDRDICAweDgwMDAgICAgICAgICAvKiAxMDBCQVNFLVQ0IGNhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSX1RYRkQgMHg0MDAwICAgICAgICAgLyogMTAwQkFTRS1UWCBGdWxsIER1cGxleCBjYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl9UWEhEIDB4MjAwMCAgICAgICAgIC8qIDEwMEJBU0UtVFggSGFsZiBEdXBsZXggY2FwYWJsZSAqLworI2RlZmluZSBNSUlfU1JfVEZEICAweDEwMDAgICAgICAgICAvKiAxMEJBU0UtVCBGdWxsIER1cGxleCBjYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl9USEQgIDB4MDgwMCAgICAgICAgIC8qIDEwQkFTRS1UIEhhbGYgRHVwbGV4IGNhcGFibGUgKi8KKyNkZWZpbmUgTUlJX1NSX0FTU0MgMHgwMDIwICAgICAgICAgLyogQXV0byBTcGVlZCBTZWxlY3Rpb24gQ29tcGxldGUqLworI2RlZmluZSBNSUlfU1JfUkZEICAweDAwMTAgICAgICAgICAvKiBSZW1vdGUgRmF1bHQgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgTUlJX1NSX0FOQyAgMHgwMDA4ICAgICAgICAgLyogQXV0byBOZWdvdGlhdGlvbiBjYXBhYmxlICovCisjZGVmaW5lIE1JSV9TUl9MS1MgIDB4MDAwNCAgICAgICAgIC8qIExpbmsgU3RhdHVzICovCisjZGVmaW5lIE1JSV9TUl9KQUJEIDB4MDAwMiAgICAgICAgIC8qIEphYmJlciBEZXRlY3QgKi8KKyNkZWZpbmUgTUlJX1NSX1hDICAgMHgwMDAxICAgICAgICAgLyogRXh0ZW5kZWQgQ2FwYWJpbGl0aWVzICovCisKKy8qCisqKiBNSUkgTWFuYWdlbWVudCBBdXRvIE5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgUmVnaXN0ZXIKKyovCisjZGVmaW5lIE1JSV9BTkFfVEFGICAweDAzZTAgICAgICAgIC8qIFRlY2hub2xvZ3kgQWJpbGl0eSBGaWVsZCAqLworI2RlZmluZSBNSUlfQU5BX1Q0QU0gMHgwMjAwICAgICAgICAvKiBUNCBUZWNobm9sb2d5IEFiaWxpdHkgTWFzayAqLworI2RlZmluZSBNSUlfQU5BX1RYQU0gMHgwMTgwICAgICAgICAvKiBUWCBUZWNobm9sb2d5IEFiaWxpdHkgTWFzayAqLworI2RlZmluZSBNSUlfQU5BX0ZEQU0gMHgwMTQwICAgICAgICAvKiBGdWxsIER1cGxleCBUZWNobm9sb2d5IEFiaWxpdHkgTWFzayAqLworI2RlZmluZSBNSUlfQU5BX0hEQU0gMHgwMmEwICAgICAgICAvKiBIYWxmIER1cGxleCBUZWNobm9sb2d5IEFiaWxpdHkgTWFzayAqLworI2RlZmluZSBNSUlfQU5BXzEwME0gMHgwMzgwICAgICAgICAvKiAxMDBNYiBUZWNobm9sb2d5IEFiaWxpdHkgTWFzayAqLworI2RlZmluZSBNSUlfQU5BXzEwTSAgMHgwMDYwICAgICAgICAvKiAxME1iIFRlY2hub2xvZ3kgQWJpbGl0eSBNYXNrICovCisjZGVmaW5lIE1JSV9BTkFfQ1NNQSAweDAwMDEgICAgICAgIC8qIENTTUEtQ0QgQ2FwYWJsZSAqLworCisvKgorKiogTUlJIE1hbmFnZW1lbnQgQXV0byBOZWdvdGlhdGlvbiBSZW1vdGUgRW5kIFJlZ2lzdGVyCisqLworI2RlZmluZSBNSUlfQU5MUEFfTlAgICAweDgwMDAgICAgICAvKiBOZXh0IFBhZ2UgKEVuYWJsZSkgKi8KKyNkZWZpbmUgTUlJX0FOTFBBX0FDSyAgMHg0MDAwICAgICAgLyogUmVtb3RlIEFja25vd2xlZGdlICovCisjZGVmaW5lIE1JSV9BTkxQQV9SRiAgIDB4MjAwMCAgICAgIC8qIFJlbW90ZSBGYXVsdCAqLworI2RlZmluZSBNSUlfQU5MUEFfVEFGICAweDAzZTAgICAgICAvKiBUZWNobm9sb2d5IEFiaWxpdHkgRmllbGQgKi8KKyNkZWZpbmUgTUlJX0FOTFBBX1Q0QU0gMHgwMjAwICAgICAgLyogVDQgVGVjaG5vbG9neSBBYmlsaXR5IE1hc2sgKi8KKyNkZWZpbmUgTUlJX0FOTFBBX1RYQU0gMHgwMTgwICAgICAgLyogVFggVGVjaG5vbG9neSBBYmlsaXR5IE1hc2sgKi8KKyNkZWZpbmUgTUlJX0FOTFBBX0ZEQU0gMHgwMTQwICAgICAgLyogRnVsbCBEdXBsZXggVGVjaG5vbG9neSBBYmlsaXR5IE1hc2sgKi8KKyNkZWZpbmUgTUlJX0FOTFBBX0hEQU0gMHgwMmEwICAgICAgLyogSGFsZiBEdXBsZXggVGVjaG5vbG9neSBBYmlsaXR5IE1hc2sgKi8KKyNkZWZpbmUgTUlJX0FOTFBBXzEwME0gMHgwMzgwICAgICAgLyogMTAwTWIgVGVjaG5vbG9neSBBYmlsaXR5IE1hc2sgKi8KKyNkZWZpbmUgTUlJX0FOTFBBXzEwTSAgMHgwMDYwICAgICAgLyogMTBNYiBUZWNobm9sb2d5IEFiaWxpdHkgTWFzayAqLworI2RlZmluZSBNSUlfQU5MUEFfQ1NNQSAweDAwMDEgICAgICAvKiBDU01BLUNEIENhcGFibGUgKi8KKworLyoKKyoqIFNST00gTWVkaWEgRGVmaW5pdGlvbnMgKEFCRyBTUk9NIFNlY3Rpb24pCisqLworI2RlZmluZSBNRURJQV9OV0FZICAgICAweDAwODAgICAgICAvKiBOd2F5IChBdXRvIE5lZ290aWF0aW9uKSBvbiBQSFkgKi8KKyNkZWZpbmUgTUVESUFfTUlJICAgICAgMHgwMDQwICAgICAgLyogTUlJIFByZXNlbnQgb24gdGhlIGFkYXB0ZXIgKi8KKyNkZWZpbmUgTUVESUFfRklCUkUgICAgMHgwMDA4ICAgICAgLyogRmlicmUgTWVkaWEgcHJlc2VudCAqLworI2RlZmluZSBNRURJQV9BVUkgICAgICAweDAwMDQgICAgICAvKiBBVUkgTWVkaWEgcHJlc2VudCAqLworI2RlZmluZSBNRURJQV9UUCAgICAgICAweDAwMDIgICAgICAvKiBUUCBNZWRpYSBwcmVzZW50ICovCisjZGVmaW5lIE1FRElBX0JOQyAgICAgIDB4MDAwMSAgICAgIC8qIEJOQyBNZWRpYSBwcmVzZW50ICovCisKKy8qCisqKiBTUk9NIERlZmluaXRpb25zIChEaWdpdGFsIFNlbWljb25kdWN0b3IgRm9ybWF0KQorKi8KKyNkZWZpbmUgU1JPTV9TU1ZJRCAgICAgMHgwMDAwICAgICAgLyogU3ViLXN5c3RlbSBWZW5kb3IgSUQgb2Zmc2V0ICovCisjZGVmaW5lIFNST01fU1NJRCAgICAgIDB4MDAwMiAgICAgIC8qIFN1Yi1zeXN0ZW0gSUQgb2Zmc2V0ICovCisjZGVmaW5lIFNST01fQ0lTUEwgICAgIDB4MDAwNCAgICAgIC8qIENhcmRCdXMgQ0lTIFBvaW50ZXIgbG93IG9mZnNldCAqLworI2RlZmluZSBTUk9NX0NJU1BIICAgICAweDAwMDYgICAgICAvKiBDYXJkQnVzIENJUyBQb2ludGVyIGhpZ2ggb2Zmc2V0ICovCisjZGVmaW5lIFNST01fSURDUkMgICAgIDB4MDAxMCAgICAgIC8qIElEIEJsb2NrIENSQyBvZmZzZXQqLworI2RlZmluZSBTUk9NX1JTVkQyICAgICAweDAwMTEgICAgICAvKiBJRCBSZXNlcnZlZCAyIG9mZnNldCAqLworI2RlZmluZSBTUk9NX1NGViAgICAgICAweDAwMTIgICAgICAvKiBTUk9NIEZvcm1hdCBWZXJzaW9uIG9mZnNldCAqLworI2RlZmluZSBTUk9NX0NDTlQgICAgICAweDAwMTMgICAgICAvKiBDb250cm9sbGVyIENvdW50IG9mZnNldCAqLworI2RlZmluZSBTUk9NX0hXQUREICAgICAweDAwMTQgICAgICAvKiBIYXJkd2FyZSBBZGRyZXNzIG9mZnNldCAqLworI2RlZmluZSBTUk9NX01SU1ZEICAgICAweDAwN2MgICAgICAvKiBNYW51ZmFjdHVyZXIgUmVzZXJ2ZWQgb2Zmc2V0Ki8KKyNkZWZpbmUgU1JPTV9DUkMgICAgICAgMHgwMDdlICAgICAgLyogU1JPTSBDUkMgb2Zmc2V0ICovCisKKy8qCisqKiBTUk9NIE1lZGlhIENvbm5lY3Rpb24gRGVmaW5pdGlvbnMKKyovCisjZGVmaW5lIFNST01fMTBCVCAgICAgIDB4MDAwMCAgICAgIC8qICAxMEJBU0UtVCBoYWxmIGR1cGxleCAqLworI2RlZmluZSBTUk9NXzEwQlROICAgICAweDAxMDAgICAgICAvKiAgMTBCQVNFLVQgd2l0aCBOd2F5ICovCisjZGVmaW5lIFNST01fMTBCVEYgICAgIDB4MDIwNCAgICAgIC8qICAxMEJBU0UtVCBmdWxsIGR1cGxleCAqLworI2RlZmluZSBTUk9NXzEwQlROTFAgICAweDA0MDAgICAgICAvKiAgMTBCQVNFLVQgd2l0aG91dCBMaW5rIFBhc3MgdGVzdCAqLworI2RlZmluZSBTUk9NXzEwQjIgICAgICAweDAwMDEgICAgICAvKiAgMTBCQVNFLTIgKEJOQykgKi8KKyNkZWZpbmUgU1JPTV8xMEI1ICAgICAgMHgwMDAyICAgICAgLyogIDEwQkFTRS01IChBVUkpICovCisjZGVmaW5lIFNST01fMTAwQlRIICAgIDB4MDAwMyAgICAgIC8qICAxMDBCQVNFLVQgaGFsZiBkdXBsZXggKi8KKyNkZWZpbmUgU1JPTV8xMDBCVEYgICAgMHgwMjA1ICAgICAgLyogIDEwMEJBU0UtVCBmdWxsIGR1cGxleCAqLworI2RlZmluZSBTUk9NXzEwMEJUNCAgICAweDAwMDYgICAgICAvKiAgMTAwQkFTRS1UNCAqLworI2RlZmluZSBTUk9NXzEwMEJGWCAgICAweDAwMDcgICAgICAvKiAgMTAwQkFTRS1GWCBoYWxmIGR1cGxleCAoRmliZXIpICovCisjZGVmaW5lIFNST01fTTEwQlQgICAgIDB4MDAwOSAgICAgIC8qICBNSUkgMTBCQVNFLVQgaGFsZiBkdXBsZXggKi8KKyNkZWZpbmUgU1JPTV9NMTBCVEYgICAgMHgwMjBhICAgICAgLyogIE1JSSAxMEJBU0UtVCBmdWxsIGR1cGxleCAqLworI2RlZmluZSBTUk9NX00xMDBCVCAgICAweDAwMGQgICAgICAvKiAgTUlJIDEwMEJBU0UtVCBoYWxmIGR1cGxleCAqLworI2RlZmluZSBTUk9NX00xMDBCVEYgICAweDAyMGUgICAgICAvKiAgTUlJIDEwMEJBU0UtVCBmdWxsIGR1cGxleCAqLworI2RlZmluZSBTUk9NX00xMDBCVDQgICAweDAwMGYgICAgICAvKiAgTUlJIDEwMEJBU0UtVDQgKi8KKyNkZWZpbmUgU1JPTV9NMTAwQkYgICAgMHgwMDEwICAgICAgLyogIE1JSSAxMDBCQVNFLUZYIGhhbGYgZHVwbGV4ICovCisjZGVmaW5lIFNST01fTTEwMEJGRiAgIDB4MDIxMSAgICAgIC8qICBNSUkgMTAwQkFTRS1GWCBmdWxsIGR1cGxleCAqLworI2RlZmluZSBTUk9NX1BEQSAgICAgICAweDA4MDAgICAgICAvKiAgUG93ZXJ1cCAmIER5bmFtaWMgQXV0b3NlbnNlICovCisjZGVmaW5lIFNST01fUEFPICAgICAgIDB4ODgwMCAgICAgIC8qICBQb3dlcnVwIEF1dG9zZW5zZSBPbmx5ICovCisjZGVmaW5lIFNST01fTlNNSSAgICAgIDB4ZmZmZiAgICAgIC8qICBObyBTZWxlY3RlZCBNZWRpYSBJbmZvcm1hdGlvbiAqLworCisvKgorKiogU1JPTSBNZWRpYSBEZWZpbml0aW9ucworKi8KKyNkZWZpbmUgU1JPTV8xMEJBU0VUICAgMHgwMDAwICAgICAgLyogIDEwQkFTRS1UIGhhbGYgZHVwbGV4ICovCisjZGVmaW5lIFNST01fMTBCQVNFMiAgIDB4MDAwMSAgICAgIC8qICAxMEJBU0UtMiAoQk5DKSAqLworI2RlZmluZSBTUk9NXzEwQkFTRTUgICAweDAwMDIgICAgICAvKiAgMTBCQVNFLTUgKEFVSSkgKi8KKyNkZWZpbmUgU1JPTV8xMDBCQVNFVCAgMHgwMDAzICAgICAgLyogIDEwMEJBU0UtVCBoYWxmIGR1cGxleCAqLworI2RlZmluZSBTUk9NXzEwQkFTRVRGICAweDAwMDQgICAgICAvKiAgMTBCQVNFLVQgZnVsbCBkdXBsZXggKi8KKyNkZWZpbmUgU1JPTV8xMDBCQVNFVEYgMHgwMDA1ICAgICAgLyogIDEwMEJBU0UtVCBmdWxsIGR1cGxleCAqLworI2RlZmluZSBTUk9NXzEwMEJBU0VUNCAweDAwMDYgICAgICAvKiAgMTAwQkFTRS1UNCAqLworI2RlZmluZSBTUk9NXzEwMEJBU0VGICAweDAwMDcgICAgICAvKiAgMTAwQkFTRS1GWCBoYWxmIGR1cGxleCAqLworI2RlZmluZSBTUk9NXzEwMEJBU0VGRiAweDAwMDggICAgICAvKiAgMTAwQkFTRS1GWCBmdWxsIGR1cGxleCAqLworCisjZGVmaW5lIEJMT0NLX0xFTiAgICAgIDB4N2YgICAgICAgIC8qIEV4dGVuZGVkIGJsb2NrcyBsZW5ndGggbWFzayAqLworI2RlZmluZSBFWFRfRklFTEQgICAgICAweDQwICAgICAgICAvKiBFeHRlbmRlZCBibG9ja3MgZXh0ZW5zaW9uIGZpZWxkIGJpdCAqLworI2RlZmluZSBNRURJQV9DT0RFICAgICAweDNmICAgICAgICAvKiBFeHRlbmRlZCBibG9ja3MgbWVkaWEgY29kZSBtYXNrICovCisKKy8qCisqKiBTUk9NIENvbXBhY3QgRm9ybWF0IEJsb2NrIE1hc2tzCisqLworI2RlZmluZSBDT01QQUNUX0ZJICAgICAgMHg4MCAgICAgICAvKiBGb3JtYXQgSW5kaWNhdG9yICovCisjZGVmaW5lIENPTVBBQ1RfTEVOICAgICAweDA0ICAgICAgIC8qIExlbmd0aCAqLworI2RlZmluZSBDT01QQUNUX01DICAgICAgMHgzZiAgICAgICAvKiBNZWRpYSBDb2RlICovCisKKy8qCisqKiBTUk9NIEV4dGVuZGVkIEZvcm1hdCBCbG9jayBUeXBlIDAgTWFza3MKKyovCisjZGVmaW5lIEJMT0NLMF9GSSAgICAgIDB4ODAgICAgICAgIC8qIEZvcm1hdCBJbmRpY2F0b3IgKi8KKyNkZWZpbmUgQkxPQ0swX01DUyAgICAgMHg4MCAgICAgICAgLyogTWVkaWEgQ29kZSBieXRlIFNpZ24gKi8KKyNkZWZpbmUgQkxPQ0swX01DICAgICAgMHgzZiAgICAgICAgLyogTWVkaWEgQ29kZSAqLworCisvKgorKiogREMyMTA0MCBGdWxsIER1cGxleCBSZWdpc3RlciAoREU0WDVfRkRSKQorKi8KKyNkZWZpbmUgRkRSX0ZEQUNWICAweDAwMDBmZmZmICAgICAgLyogRnVsbCBEdXBsZXggQXV0byBDb25maWd1cmF0aW9uIFZhbHVlICovCisKKy8qCisqKiBEQzIxMDQxIEdlbmVyYWwgUHVycG9zZSBUaW1lciBSZWdpc3RlciAoREU0WDVfR1BUKQorKi8KKyNkZWZpbmUgR1BUX0NPTiAgMHgwMDAxMDAwMCAgICAgICAgLyogT25lIHNob3Q6IDAsICBDb250aW51b3VzOiAxICovCisjZGVmaW5lIEdQVF9WQUwgIDB4MDAwMGZmZmYgICAgICAgIC8qIFRpbWVyIFZhbHVlICovCisKKy8qCisqKiBEQzIxMTQwIEdlbmVyYWwgUHVycG9zZSBSZWdpc3RlciAoREU0WDVfR0VQKSAoaGFyZHdhcmUgZGVwZW5kZW50IGJpdHMpCisqLworLyogVmFsaWQgT05MWSBmb3IgREU1MDAgaGFyZHdhcmUgKi8KKyNkZWZpbmUgR0VQX0xOUCAgMHgwMDAwMDA4MCAgICAgICAgLyogTGluayBQYXNzICAgICAgICAgICAgICAgKGlucHV0KSAgICAgICAgKi8KKyNkZWZpbmUgR0VQX1NMTksgMHgwMDAwMDA0MCAgICAgICAgLyogU1lNIExJTksgICAgICAgICAgICAgICAgKGlucHV0KSAgICAgICAgKi8KKyNkZWZpbmUgR0VQX1NERVQgMHgwMDAwMDAyMCAgICAgICAgLyogU2lnbmFsIERldGVjdCAgICAgICAgICAgKGlucHV0KSAgICAgICAgKi8KKyNkZWZpbmUgR0VQX0hSU1QgMHgwMDAwMDAxMCAgICAgICAgLyogSGFyZCBSRVNFVCAodG8gUEhZKSAgICAgKG91dHB1dCkgICAgICAgKi8KKyNkZWZpbmUgR0VQX0ZEWEQgMHgwMDAwMDAwOCAgICAgICAgLyogRnVsbCBEdXBsZXggRGlzYWJsZSAgICAgKG91dHB1dCkgICAgICAgKi8KKyNkZWZpbmUgR0VQX1BIWUwgMHgwMDAwMDAwNCAgICAgICAgLyogUEhZIExvb3BiYWNrICAgICAgICAgICAgKG91dHB1dCkgICAgICAgKi8KKyNkZWZpbmUgR0VQX0ZMRUQgMHgwMDAwMDAwMiAgICAgICAgLyogRm9yY2UgQWN0aXZpdHkgTEVEIG9uICAgKG91dHB1dCkgICAgICAgKi8KKyNkZWZpbmUgR0VQX01PREUgMHgwMDAwMDAwMSAgICAgICAgLyogMDogMTBNYi9zLCAgMTogMTAwTWIvcyAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR0VQX0lOSVQgMHgwMDAwMDExZiAgICAgICAgLyogU2V0dXAgaW5wdXRzICgwKSBhbmQgb3V0cHV0cyAoMSkgICAgICAgKi8KKyNkZWZpbmUgR0VQX0NUUkwgMHgwMDAwMDEwMCAgICAgICAgLyogR0VQIGNvbnRyb2wgYml0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoKKyoqIFNJQSBSZWdpc3RlciBEZWZhdWx0cworKi8KKyNkZWZpbmUgQ1NSMTMgMHgwMDAwMDAwMQorI2RlZmluZSBDU1IxNCAweDAwMDNmZjdmICAgICAgICAgICAvKiBBdXRvbmVnb3RpYXRpb24gZGlzYWJsZWQgICAgICAgICAgICAgICAqLworI2RlZmluZSBDU1IxNSAweDAwMDAwMDA4CisKKy8qCisqKiBTSUEgU3RhdHVzIFJlZ2lzdGVyIChERTRYNV9TSVNSKQorKi8KKyNkZWZpbmUgU0lTUl9MUEMgICAweGZmZmYwMDAwICAgICAgLyogTGluayBQYXJ0bmVyJ3MgQ29kZSBXb3JkICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9MUE4gICAweDAwMDA4MDAwICAgICAgLyogTGluayBQYXJ0bmVyIE5lZ290aWFibGUgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9BTlMgICAweDAwMDA3MDAwICAgICAgLyogQXV0byBOZWdvdGlhdGlvbiBBcmJpdHJhdGlvbiBTdGF0ZSAgICAgKi8KKyNkZWZpbmUgU0lTUl9OU04gICAweDAwMDAwODAwICAgICAgLyogTm9uIFN0YWJsZSBOTFBzIERldGVjdGVkIChEQzIxMDQxKSAgICAgKi8KKyNkZWZpbmUgU0lTUl9UUkYgICAweDAwMDAwODAwICAgICAgLyogVHJhbnNtaXQgUmVtb3RlIEZhdWx0ICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9OU05EICAweDAwMDAwNDAwICAgICAgLyogTm9uIFN0YWJsZSBOTFBzIERldGVjdGVkIChEQzIxMTQyKSAgICAgKi8KKyNkZWZpbmUgU0lTUl9BTlJfRkRTIDB4MDAwMDA0MDAgICAgLyogQXV0byBOZWdvdGlhdGUgUmVzdGFydC9GdWxsIER1cGxleCBTZWwuKi8KKyNkZWZpbmUgU0lTUl9UUkEgICAweDAwMDAwMjAwICAgICAgLyogMTBCQVNFLVQgUmVjZWl2ZSBQb3J0IEFjdGl2aXR5ICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9OUkEgICAweDAwMDAwMjAwICAgICAgLyogTm9uIFNlbGVjdGVkIFBvcnQgUmVjZWl2ZSBBY3Rpdml0eSAgICAgKi8KKyNkZWZpbmUgU0lTUl9BUkEgICAweDAwMDAwMTAwICAgICAgLyogQVVJIFJlY2VpdmUgUG9ydCBBY3Rpdml0eSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9TUkEgICAweDAwMDAwMTAwICAgICAgLyogU2VsZWN0ZWQgUG9ydCBSZWNlaXZlIEFjdGl2aXR5ICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9EQU8gICAweDAwMDAwMDgwICAgICAgLyogUExMIEFsbCBPbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9EQVogICAweDAwMDAwMDQwICAgICAgLyogUExMIEFsbCBaZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9EU1AgICAweDAwMDAwMDIwICAgICAgLyogUExMIFNlbGYtVGVzdCBQYXNzICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9EU0QgICAweDAwMDAwMDEwICAgICAgLyogUExMIFNlbGYtVGVzdCBEb25lICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9BUFMgICAweDAwMDAwMDA4ICAgICAgLyogQXV0byBQb2xhcml0eSBTdGF0ZSAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9MS0YgICAweDAwMDAwMDA0ICAgICAgLyogTGluayBGYWlsIFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9MUzEwICAweDAwMDAwMDA0ICAgICAgLyogMTBNYi9zIExpbmsgRmFpbCBTdGF0dXMgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9OQ1IgICAweDAwMDAwMDAyICAgICAgLyogTmV0d29yayBDb25uZWN0aW9uIEVycm9yICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9MUzEwMCAweDAwMDAwMDAyICAgICAgLyogMTAwTWIvcyBMaW5rIEZhaWwgU3RhdHVzICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9QQVVJICAweDAwMDAwMDAxICAgICAgLyogQVVJX1RQIEluZGljYXRpb24gICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0lTUl9NUkEgICAweDAwMDAwMDAxICAgICAgLyogTUlJIFJlY2VpdmUgUG9ydCBBY3Rpdml0eSAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBBTlNfTkRJUyAgIDB4MDAwMDAwMDAgICAgICAvKiBOd2F5IGRpc2FibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBTlNfVERJUyAgIDB4MDAwMDEwMDAgICAgICAvKiBUcmFuc21pdCBEaXNhYmxlICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBTlNfQURFVCAgIDB4MDAwMDIwMDAgICAgICAvKiBBYmlsaXR5IERldGVjdCAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBTlNfQUNLICAgIDB4MDAwMDMwMDAgICAgICAvKiBBY2tub3dsZWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBTlNfQ0FDSyAgIDB4MDAwMDQwMDAgICAgICAvKiBDb21wbGV0ZSBBY2tub3dsZWRnZSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBTlNfTldPSyAgIDB4MDAwMDUwMDAgICAgICAvKiBOd2F5IE9LIC0gRkxQIExpbmsgR29vZCAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBTlNfTENISyAgIDB4MDAwMDYwMDAgICAgICAvKiBMaW5rIENoZWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFNJU1JfUlNUICAgMHgwMDAwMDMwMSAgICAgIC8qIENTUjEyIHJlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFNJU1JfQU5SICAgMHgwMDAwMTMwMSAgICAgIC8qIEF1dG9uZWdvdGlhdGlvbiByZXN0YXJ0ICAgICAgICAgICAgICAgICovCisKKy8qCisqKiBTSUEgQ29ubmVjdGl2aXR5IFJlZ2lzdGVyIChERTRYNV9TSUNSKQorKi8KKyNkZWZpbmUgU0lDUl9TRE0gICAweGZmZmYwMDAwICAgICAgIC8qIFNJQSBEaWFnbm9zdGljcyBNb2RlICovCisjZGVmaW5lIFNJQ1JfT0U1NyAgMHgwMDAwODAwMCAgICAgICAvKiBPdXRwdXQgRW5hYmxlIDUgNiA3ICovCisjZGVmaW5lIFNJQ1JfT0UyNCAgMHgwMDAwNDAwMCAgICAgICAvKiBPdXRwdXQgRW5hYmxlIDIgNCAqLworI2RlZmluZSBTSUNSX09FMTMgIDB4MDAwMDIwMDAgICAgICAgLyogT3V0cHV0IEVuYWJsZSAxIDMgKi8KKyNkZWZpbmUgU0lDUl9JRSAgICAweDAwMDAxMDAwICAgICAgIC8qIElucHV0IEVuYWJsZSAqLworI2RlZmluZSBTSUNSX0VYVCAgIDB4MDAwMDAwMDAgICAgICAgLyogU0lBIE1VWCBTZWxlY3QgRXh0ZXJuYWwgU0lBIE1vZGUgKi8KKyNkZWZpbmUgU0lDUl9EX1NJQSAweDAwMDAwNDAwICAgICAgIC8qIFNJQSBNVVggU2VsZWN0IERpYWdub3N0aWNzIC0gU0lBIFNpZ3MgKi8KKyNkZWZpbmUgU0lDUl9EUExMICAweDAwMDAwODAwICAgICAgIC8qIFNJQSBNVVggU2VsZWN0IERpYWdub3N0aWNzIC0gRFBMTCBTaWdzKi8KKyNkZWZpbmUgU0lDUl9BUExMICAweDAwMDAwYTAwICAgICAgIC8qIFNJQSBNVVggU2VsZWN0IERpYWdub3N0aWNzIC0gRFBMTCBTaWdzKi8KKyNkZWZpbmUgU0lDUl9EX1J4TSAweDAwMDAwYzAwICAgICAgIC8qIFNJQSBNVVggU2VsZWN0IERpYWdub3N0aWNzIC0gUnhNIFNpZ3MgKi8KKyNkZWZpbmUgU0lDUl9NX1J4TSAweDAwMDAwZDAwICAgICAgIC8qIFNJQSBNVVggU2VsZWN0IERpYWdub3N0aWNzIC0gUnhNIFNpZ3MgKi8KKyNkZWZpbmUgU0lDUl9MTktUICAweDAwMDAwZTAwICAgICAgIC8qIFNJQSBNVVggU2VsZWN0IERpYWdub3N0aWNzIC0gTGluayBUZXN0Ki8KKyNkZWZpbmUgU0lDUl9TRUwgICAweDAwMDAwZjAwICAgICAgIC8qIFNJQSBNVVggU2VsZWN0IEFVSSBvciBUUCB3aXRoIExFRHMgKi8KKyNkZWZpbmUgU0lDUl9BU0UgICAweDAwMDAwMDgwICAgICAgIC8qIEFQTEwgU3RhcnQgRW5hYmxlKi8KKyNkZWZpbmUgU0lDUl9TSU0gICAweDAwMDAwMDQwICAgICAgIC8qIFNlcmlhbCBJbnRlcmZhY2UgSW5wdXQgTXVsdGlwbGV4ZXIgKi8KKyNkZWZpbmUgU0lDUl9FTkkgICAweDAwMDAwMDIwICAgICAgIC8qIEVuY29kZXIgSW5wdXQgTXVsdGlwbGV4ZXIgKi8KKyNkZWZpbmUgU0lDUl9FRFAgICAweDAwMDAwMDEwICAgICAgIC8qIFNJQSBQTEwgRXh0ZXJuYWwgSW5wdXQgRW5hYmxlICovCisjZGVmaW5lIFNJQ1JfQVVJICAgMHgwMDAwMDAwOCAgICAgICAvKiAxMEJhc2UtVCAoMCkgb3IgQVVJICgxKSAqLworI2RlZmluZSBTSUNSX0NBQyAgIDB4MDAwMDAwMDQgICAgICAgLyogQ1NSIEF1dG8gQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBTSUNSX1BTICAgIDB4MDAwMDAwMDIgICAgICAgLyogUGluIEFVSS9UUCBTZWxlY3Rpb24gKi8KKyNkZWZpbmUgU0lDUl9TUkwgICAweDAwMDAwMDAxICAgICAgIC8qIFNJQSBSZXNldCAqLworI2RlZmluZSBTSUFfUkVTRVQgIDB4MDAwMDAwMDAgICAgICAgLyogU0lBIFJlc2V0IFZhbHVlICovCisKKy8qCisqKiBTSUEgVHJhbnNtaXQgYW5kIFJlY2VpdmUgUmVnaXN0ZXIgKERFNFg1X1NUUlIpCisqLworI2RlZmluZSBTVFJSX1RBUyAgIDB4MDAwMDgwMDAgICAgICAgLyogMTBCYXNlLVQvQVVJIEF1dG9zZW5zaW5nIEVuYWJsZSAqLworI2RlZmluZSBTVFJSX1NQUCAgIDB4MDAwMDQwMDAgICAgICAgLyogU2V0IFBvbGFyaXR5IFBsdXMgKi8KKyNkZWZpbmUgU1RSUl9BUEUgICAweDAwMDAyMDAwICAgICAgIC8qIEF1dG8gUG9sYXJpdHkgRW5hYmxlICovCisjZGVmaW5lIFNUUlJfTFRFICAgMHgwMDAwMTAwMCAgICAgICAvKiBMaW5rIFRlc3QgRW5hYmxlICovCisjZGVmaW5lIFNUUlJfU1FFICAgMHgwMDAwMDgwMCAgICAgICAvKiBTaWduYWwgUXVhbGl0eSBFbmFibGUgKi8KKyNkZWZpbmUgU1RSUl9DTEQgICAweDAwMDAwNDAwICAgICAgIC8qIENvbGxpc2lvbiBEZXRlY3QgRW5hYmxlICovCisjZGVmaW5lIFNUUlJfQ1NRICAgMHgwMDAwMDIwMCAgICAgICAvKiBDb2xsaXNpb24gU3F1ZWxjaCBFbmFibGUgKi8KKyNkZWZpbmUgU1RSUl9SU1EgICAweDAwMDAwMTAwICAgICAgIC8qIFJlY2VpdmUgU3F1ZWxjaCBFbmFibGUgKi8KKyNkZWZpbmUgU1RSUl9BTkUgICAweDAwMDAwMDgwICAgICAgIC8qIEF1dG8gTmVnb3RpYXRlIEVuYWJsZSAqLworI2RlZmluZSBTVFJSX0hERSAgIDB4MDAwMDAwNDAgICAgICAgLyogSGFsZiBEdXBsZXggRW5hYmxlICovCisjZGVmaW5lIFNUUlJfQ1BFTiAgMHgwMDAwMDAzMCAgICAgICAvKiBDb21wZW5zYXRpb24gRW5hYmxlICovCisjZGVmaW5lIFNUUlJfTFNFICAgMHgwMDAwMDAwOCAgICAgICAvKiBMaW5rIFB1bHNlIFNlbmQgRW5hYmxlICovCisjZGVmaW5lIFNUUlJfRFJFTiAgMHgwMDAwMDAwNCAgICAgICAvKiBEcml2ZXIgRW5hYmxlICovCisjZGVmaW5lIFNUUlJfTEJLICAgMHgwMDAwMDAwMiAgICAgICAvKiBMb29wYmFjayBFbmFibGUgKi8KKyNkZWZpbmUgU1RSUl9FQ0VOICAweDAwMDAwMDAxICAgICAgIC8qIEVuY29kZXIgRW5hYmxlICovCisjZGVmaW5lIFNUUlJfUkVTRVQgMHhmZmZmZmZmZiAgICAgICAvKiBSZXNldCB2YWx1ZSBmb3IgU1RSUiAqLworCisvKgorKiogU0lBIEdlbmVyYWwgUmVnaXN0ZXIgKERFNFg1X1NJR1IpCisqLworI2RlZmluZSBTSUdSX1JNSSAgIDB4NDAwMDAwMDAgICAgICAgLyogUmVjZWl2ZSBNYXRjaCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU0lHUl9HSTEgICAweDIwMDAwMDAwICAgICAgIC8qIEdlbmVyYWwgUG9ydCBJbnRlcnJ1cHQgMSAqLworI2RlZmluZSBTSUdSX0dJMCAgIDB4MTAwMDAwMDAgICAgICAgLyogR2VuZXJhbCBQb3J0IEludGVycnVwdCAwICovCisjZGVmaW5lIFNJR1JfQ1dFICAgMHgwODAwMDAwMCAgICAgICAvKiBDb250cm9sIFdyaXRlIEVuYWJsZSAqLworI2RlZmluZSBTSUdSX1JNRSAgIDB4MDQwMDAwMDAgICAgICAgLyogUmVjZWl2ZSBNYXRjaCBFbmFibGUgKi8KKyNkZWZpbmUgU0lHUl9HRUkxICAweDAyMDAwMDAwICAgICAgIC8qIEdFUCBJbnRlcnJ1cHQgRW5hYmxlIG9uIFBvcnQgMSAqLworI2RlZmluZSBTSUdSX0dFSTAgIDB4MDEwMDAwMDAgICAgICAgLyogR0VQIEludGVycnVwdCBFbmFibGUgb24gUG9ydCAwICovCisjZGVmaW5lIFNJR1JfTEdTMyAgMHgwMDgwMDAwMCAgICAgICAvKiBMRUQvR0VQMyBTZWxlY3QgKi8KKyNkZWZpbmUgU0lHUl9MR1MyICAweDAwNDAwMDAwICAgICAgIC8qIExFRC9HRVAyIFNlbGVjdCAqLworI2RlZmluZSBTSUdSX0xHUzEgIDB4MDAyMDAwMDAgICAgICAgLyogTEVEL0dFUDEgU2VsZWN0ICovCisjZGVmaW5lIFNJR1JfTEdTMCAgMHgwMDEwMDAwMCAgICAgICAvKiBMRUQvR0VQMCBTZWxlY3QgKi8KKyNkZWZpbmUgU0lHUl9NRCAgICAweDAwMGYwMDAwICAgICAgIC8qIEdlbmVyYWwgUHVycG9zZSBNb2RlIGFuZCBEYXRhICovCisjZGVmaW5lIFNJR1JfTFYyICAgMHgwMDAwODAwMCAgICAgICAvKiBHZW5lcmFsIFB1cnBvc2UgTEVEMiB2YWx1ZSAqLworI2RlZmluZSBTSUdSX0xFMiAgIDB4MDAwMDQwMDAgICAgICAgLyogR2VuZXJhbCBQdXJwb3NlIExFRDIgZW5hYmxlICovCisjZGVmaW5lIFNJR1JfRlJMICAgMHgwMDAwMjAwMCAgICAgICAvKiBGb3JjZSBSZWNlaXZlciBMb3cgKi8KKyNkZWZpbmUgU0lHUl9EUFNUICAweDAwMDAxMDAwICAgICAgIC8qIFBMTCBTZWxmIFRlc3QgU3RhcnQgKi8KKyNkZWZpbmUgU0lHUl9MU0QgICAweDAwMDAwODAwICAgICAgIC8qIExFRCBTdHJldGNoIERpc2FibGUgKi8KKyNkZWZpbmUgU0lHUl9GTEYgICAweDAwMDAwNDAwICAgICAgIC8qIEZvcmNlIExpbmsgRmFpbCAqLworI2RlZmluZSBTSUdSX0ZVU1EgIDB4MDAwMDAyMDAgICAgICAgLyogRm9yY2UgVW5zcXVlbGNoICovCisjZGVmaW5lIFNJR1JfVFNDSyAgMHgwMDAwMDEwMCAgICAgICAvKiBUZXN0IENsb2NrICovCisjZGVmaW5lIFNJR1JfTFYxICAgMHgwMDAwMDA4MCAgICAgICAvKiBHZW5lcmFsIFB1cnBvc2UgTEVEMSB2YWx1ZSAqLworI2RlZmluZSBTSUdSX0xFMSAgIDB4MDAwMDAwNDAgICAgICAgLyogR2VuZXJhbCBQdXJwb3NlIExFRDEgZW5hYmxlICovCisjZGVmaW5lIFNJR1JfUldSICAgMHgwMDAwMDAyMCAgICAgICAvKiBSZWNlaXZlIFdhdGNoZG9nIFJlbGVhc2UgKi8KKyNkZWZpbmUgU0lHUl9SV0QgICAweDAwMDAwMDEwICAgICAgIC8qIFJlY2VpdmUgV2F0Y2hkb2cgRGlzYWJsZSAqLworI2RlZmluZSBTSUdSX0FCTSAgIDB4MDAwMDAwMDggICAgICAgLyogQk5DOiAwLCAgQVVJOjEgKi8KKyNkZWZpbmUgU0lHUl9KQ0sgICAweDAwMDAwMDA0ICAgICAgIC8qIEphYmJlciBDbG9jayAqLworI2RlZmluZSBTSUdSX0hVSiAgIDB4MDAwMDAwMDIgICAgICAgLyogSG9zdCBVbmphYiAqLworI2RlZmluZSBTSUdSX0pCRCAgIDB4MDAwMDAwMDEgICAgICAgLyogSmFiYmVyIERpc2FibGUgKi8KKyNkZWZpbmUgU0lHUl9SRVNFVCAweGZmZmYwMDAwICAgICAgIC8qIFJlc2V0IHZhbHVlIGZvciBTSUdSICovCisKKy8qCisqKiBSZWNlaXZlIERlc2NyaXB0b3IgQml0IFN1bW1hcnkKKyovCisjZGVmaW5lIFJfT1dOICAgICAgMHg4MDAwMDAwMCAgICAgICAvKiBPd24gQml0ICovCisjZGVmaW5lIFJEX0ZGICAgICAgMHg0MDAwMDAwMCAgICAgICAvKiBGaWx0ZXJpbmcgRmFpbCAqLworI2RlZmluZSBSRF9GTCAgICAgIDB4M2ZmZjAwMDAgICAgICAgLyogRnJhbWUgTGVuZ3RoICovCisjZGVmaW5lIFJEX0VTICAgICAgMHgwMDAwODAwMCAgICAgICAvKiBFcnJvciBTdW1tYXJ5ICovCisjZGVmaW5lIFJEX0xFICAgICAgMHgwMDAwNDAwMCAgICAgICAvKiBMZW5ndGggRXJyb3IgKi8KKyNkZWZpbmUgUkRfRFQgICAgICAweDAwMDAzMDAwICAgICAgIC8qIERhdGEgVHlwZSAqLworI2RlZmluZSBSRF9SRiAgICAgIDB4MDAwMDA4MDAgICAgICAgLyogUnVudCBGcmFtZSAqLworI2RlZmluZSBSRF9NRiAgICAgIDB4MDAwMDA0MDAgICAgICAgLyogTXVsdGljYXN0IEZyYW1lICovCisjZGVmaW5lIFJEX0ZTICAgICAgMHgwMDAwMDIwMCAgICAgICAvKiBGaXJzdCBEZXNjcmlwdG9yICovCisjZGVmaW5lIFJEX0xTICAgICAgMHgwMDAwMDEwMCAgICAgICAvKiBMYXN0IERlc2NyaXB0b3IgKi8KKyNkZWZpbmUgUkRfVEwgICAgICAweDAwMDAwMDgwICAgICAgIC8qIEZyYW1lIFRvbyBMb25nICovCisjZGVmaW5lIFJEX0NTICAgICAgMHgwMDAwMDA0MCAgICAgICAvKiBDb2xsaXNpb24gU2VlbiAqLworI2RlZmluZSBSRF9GVCAgICAgIDB4MDAwMDAwMjAgICAgICAgLyogRnJhbWUgVHlwZSAqLworI2RlZmluZSBSRF9SSiAgICAgIDB4MDAwMDAwMTAgICAgICAgLyogUmVjZWl2ZSBXYXRjaGRvZyAqLworI2RlZmluZSBSRF9SRSAgICAgIDB4MDAwMDAwMDggICAgICAgLyogUmVwb3J0IG9uIE1JSSBFcnJvciAqLworI2RlZmluZSBSRF9EQiAgICAgIDB4MDAwMDAwMDQgICAgICAgLyogRHJpYmJsaW5nIEJpdCAqLworI2RlZmluZSBSRF9DRSAgICAgIDB4MDAwMDAwMDIgICAgICAgLyogQ1JDIEVycm9yICovCisjZGVmaW5lIFJEX09GICAgICAgMHgwMDAwMDAwMSAgICAgICAvKiBPdmVyZmxvdyAqLworCisjZGVmaW5lIFJEX1JFUiAgICAgMHgwMjAwMDAwMCAgICAgICAvKiBSZWNlaXZlIEVuZCBPZiBSaW5nICovCisjZGVmaW5lIFJEX1JDSCAgICAgMHgwMTAwMDAwMCAgICAgICAvKiBTZWNvbmQgQWRkcmVzcyBDaGFpbmVkICovCisjZGVmaW5lIFJEX1JCUzIgICAgMHgwMDNmZjgwMCAgICAgICAvKiBCdWZmZXIgMiBTaXplICovCisjZGVmaW5lIFJEX1JCUzEgICAgMHgwMDAwMDdmZiAgICAgICAvKiBCdWZmZXIgMSBTaXplICovCisKKy8qCisqKiBUcmFuc21pdCBEZXNjcmlwdG9yIEJpdCBTdW1tYXJ5CisqLworI2RlZmluZSBUX09XTiAgICAgIDB4ODAwMDAwMDAgICAgICAgLyogT3duIEJpdCAqLworI2RlZmluZSBURF9FUyAgICAgIDB4MDAwMDgwMDAgICAgICAgLyogRXJyb3IgU3VtbWFyeSAqLworI2RlZmluZSBURF9UTyAgICAgIDB4MDAwMDQwMDAgICAgICAgLyogVHJhbnNtaXQgSmFiYmVyIFRpbWUtT3V0ICovCisjZGVmaW5lIFREX0xPICAgICAgMHgwMDAwMDgwMCAgICAgICAvKiBMb3NzIE9mIENhcnJpZXIgKi8KKyNkZWZpbmUgVERfTkMgICAgICAweDAwMDAwNDAwICAgICAgIC8qIE5vIENhcnJpZXIgKi8KKyNkZWZpbmUgVERfTEMgICAgICAweDAwMDAwMjAwICAgICAgIC8qIExhdGUgQ29sbGlzaW9uICovCisjZGVmaW5lIFREX0VDICAgICAgMHgwMDAwMDEwMCAgICAgICAvKiBFeGNlc3NpdmUgQ29sbGlzaW9ucyAqLworI2RlZmluZSBURF9IRiAgICAgIDB4MDAwMDAwODAgICAgICAgLyogSGVhcnRiZWF0IEZhaWwgKi8KKyNkZWZpbmUgVERfQ0MgICAgICAweDAwMDAwMDc4ICAgICAgIC8qIENvbGxpc2lvbiBDb3VudGVyICovCisjZGVmaW5lIFREX0xGICAgICAgMHgwMDAwMDAwNCAgICAgICAvKiBMaW5rIEZhaWwgKi8KKyNkZWZpbmUgVERfVUYgICAgICAweDAwMDAwMDAyICAgICAgIC8qIFVuZGVyZmxvdyBFcnJvciAqLworI2RlZmluZSBURF9ERSAgICAgIDB4MDAwMDAwMDEgICAgICAgLyogRGVmZXJyZWQgKi8KKworI2RlZmluZSBURF9JQyAgICAgIDB4ODAwMDAwMDAgICAgICAgLyogSW50ZXJydXB0IE9uIENvbXBsZXRpb24gKi8KKyNkZWZpbmUgVERfTFMgICAgICAweDQwMDAwMDAwICAgICAgIC8qIExhc3QgU2VnbWVudCAqLworI2RlZmluZSBURF9GUyAgICAgIDB4MjAwMDAwMDAgICAgICAgLyogRmlyc3QgU2VnbWVudCAqLworI2RlZmluZSBURF9GVDEgICAgIDB4MTAwMDAwMDAgICAgICAgLyogRmlsdGVyaW5nIFR5cGUgKi8KKyNkZWZpbmUgVERfU0VUICAgICAweDA4MDAwMDAwICAgICAgIC8qIFNldHVwIFBhY2tldCAqLworI2RlZmluZSBURF9BQyAgICAgIDB4MDQwMDAwMDAgICAgICAgLyogQWRkIENSQyBEaXNhYmxlICovCisjZGVmaW5lIFREX1RFUiAgICAgMHgwMjAwMDAwMCAgICAgICAvKiBUcmFuc21pdCBFbmQgT2YgUmluZyAqLworI2RlZmluZSBURF9UQ0ggICAgIDB4MDEwMDAwMDAgICAgICAgLyogU2Vjb25kIEFkZHJlc3MgQ2hhaW5lZCAqLworI2RlZmluZSBURF9EUEQgICAgIDB4MDA4MDAwMDAgICAgICAgLyogRGlzYWJsZWQgUGFkZGluZyAqLworI2RlZmluZSBURF9GVDAgICAgIDB4MDA0MDAwMDAgICAgICAgLyogRmlsdGVyaW5nIFR5cGUgKi8KKyNkZWZpbmUgVERfVEJTMiAgICAweDAwM2ZmODAwICAgICAgIC8qIEJ1ZmZlciAyIFNpemUgKi8KKyNkZWZpbmUgVERfVEJTMSAgICAweDAwMDAwN2ZmICAgICAgIC8qIEJ1ZmZlciAxIFNpemUgKi8KKworI2RlZmluZSBQRVJGRUNUX0YgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSEFTSF9GICAgICBURF9GVDAKKyNkZWZpbmUgSU5WRVJTRV9GICBURF9GVDEKKyNkZWZpbmUgSEFTSF9PX0YgICAoVERfRlQxIHwgVERfRjApCisKKy8qCisqKiBNZWRpYSAvIG1vZGUgc3RhdGUgbWFjaGluZSBkZWZpbml0aW9ucworKiogVXNlciBzZWxlY3RhYmxlOgorKi8KKyNkZWZpbmUgVFAgICAgICAgICAgICAgIDB4MDA0MCAgICAgLyogMTBCYXNlLVQgKG5vdyBlcXVpdiB0byBfMTBNYikgICAgICAgICovCisjZGVmaW5lIFRQX05XICAgICAgICAgICAweDAwMDIgICAgIC8qIDEwQmFzZS1UIHdpdGggTndheSAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCTkMgICAgICAgICAgICAgMHgwMDA0ICAgICAvKiBUaGlud2lyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQVVJICAgICAgICAgICAgIDB4MDAwOCAgICAgLyogVGhpY2t3aXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJOQ19BVUkgICAgICAgICAweDAwMTAgICAgIC8qIEJOQy9BVUkgb24gREMyMTA0MCBpbmRpc3Rpbmd1aXNoYWJsZSAqLworI2RlZmluZSBfMTBNYiAgICAgICAgICAgMHgwMDQwICAgICAvKiAxME1iL3MgRXRoZXJuZXQgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgXzEwME1iICAgICAgICAgIDB4MDA4MCAgICAgLyogMTAwTWIvcyBFdGhlcm5ldCAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFVVE8gICAgICAgICAgICAweDQwMDAgICAgIC8qIEF1dG8gc2Vuc2UgdGhlIG1lZGlhIG9yIHNwZWVkICAgICAgICAqLworCisvKgorKiogSW50ZXJuYWwgc3RhdGVzCisqLworI2RlZmluZSBOQyAgICAgICAgICAgICAgMHgwMDAwICAgICAvKiBObyBDb25uZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQU5TICAgICAgICAgICAgIDB4MDAyMCAgICAgLyogSW50ZXJtZWRpYXRlIEF1dG9OZWdvdGlhdGlvbiBTdGF0ZSAgICovCisjZGVmaW5lIFNQRF9ERVQgICAgICAgICAweDAxMDAgICAgIC8qIFBhcmFsbGVsIHNwZWVkIGRldGVjdGlvbiAgICAgICAgICAgICAqLworI2RlZmluZSBJTklUICAgICAgICAgICAgMHgwMjAwICAgICAvKiBJbml0aWFsIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRVhUX1NJQSAgICAgICAgIDB4MDQwMCAgICAgLyogRXh0ZXJuYWwgU0lBIGZvciBtb3RoZXJib2FyZCBjaGlwICAgICovCisjZGVmaW5lIEFOU19TVVNQRUNUICAgICAweDA4MDIgICAgIC8qIFN1c3BlY3QgdGhlIEFOUyAoVFApIHBvcnQgaXMgZG93biAgICAqLworI2RlZmluZSBUUF9TVVNQRUNUICAgICAgMHgwODAzICAgICAvKiBTdXNwZWN0IHRoZSBUUCBwb3J0IGlzIGRvd24gICAgICAgICAgKi8KKyNkZWZpbmUgQk5DX0FVSV9TVVNQRUNUIDB4MDgwNCAgICAgLyogU3VzcGVjdCB0aGUgQk5DIG9yIEFVSSBwb3J0IGlzIGRvd24gICovCisjZGVmaW5lIEVYVF9TSUFfU1VTUEVDVCAweDA4MDUgICAgIC8qIFN1c3BlY3QgdGhlIEVYVCBTSUEgcG9ydCBpcyBkb3duICAgICAqLworI2RlZmluZSBCTkNfU1VTUEVDVCAgICAgMHgwODA2ICAgICAvKiBTdXNwZWN0IHRoZSBCTkMgcG9ydCBpcyBkb3duICAgICAgICAgKi8KKyNkZWZpbmUgQVVJX1NVU1BFQ1QgICAgIDB4MDgwNyAgICAgLyogU3VzcGVjdCB0aGUgQVVJIHBvcnQgaXMgZG93biAgICAgICAgICovCisjZGVmaW5lIE1JSSAgICAgICAgICAgICAweDEwMDAgICAgIC8qIE1JSSBvbiB0aGUgMjExNDMgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFRJTUVSX0NCICAgICAgICAweDgwMDAwMDAwIC8qIFRpbWVyIGNhbGxiYWNrIGRldGVjdGlvbiAgICAgICAgICAgICAqLworCisvKgorKiogREU0WDUgREVCVUcgT3B0aW9ucworKi8KKyNkZWZpbmUgREVCVUdfTk9ORSAgICAgIDB4MDAwMCAgICAgLyogTm8gREVCVUcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgREVCVUdfVkVSU0lPTiAgIDB4MDAwMSAgICAgLyogUHJpbnQgdmVyc2lvbiBtZXNzYWdlICovCisjZGVmaW5lIERFQlVHX01FRElBICAgICAweDAwMDIgICAgIC8qIFByaW50IG1lZGlhIG1lc3NhZ2VzICovCisjZGVmaW5lIERFQlVHX1RYICAgICAgICAweDAwMDQgICAgIC8qIFByaW50IFRYIChxdWV1ZV9wa3QpIG1lc3NhZ2VzICovCisjZGVmaW5lIERFQlVHX1JYICAgICAgICAweDAwMDggICAgIC8qIFByaW50IFJYIChkZTR4NV9yeCkgbWVzc2FnZXMgKi8KKyNkZWZpbmUgREVCVUdfU1JPTSAgICAgIDB4MDAxMCAgICAgLyogUHJpbnQgU1JPTSBtZXNzYWdlcyAqLworI2RlZmluZSBERUJVR19NSUkgICAgICAgMHgwMDIwICAgICAvKiBQcmludCBNSUkgbWVzc2FnZXMgKi8KKyNkZWZpbmUgREVCVUdfT1BFTiAgICAgIDB4MDA0MCAgICAgLyogUHJpbnQgZGU0eDVfb3BlbigpIG1lc3NhZ2VzICovCisjZGVmaW5lIERFQlVHX0NMT1NFICAgICAweDAwODAgICAgIC8qIFByaW50IGRlNHg1X2Nsb3NlKCkgbWVzc2FnZXMgKi8KKyNkZWZpbmUgREVCVUdfUENJQ0ZHICAgIDB4MDEwMAorI2RlZmluZSBERUJVR19BTEwgICAgICAgMHgwMWZmCisKKy8qCisqKiBNaXNjZWxsYW5lb3VzCisqLworI2RlZmluZSBQQ0kgIDAKKyNkZWZpbmUgRUlTQSAxCisKKyNkZWZpbmUgSEFTSF9UQUJMRV9MRU4gICA1MTIgICAgICAgLyogQml0cyAqLworI2RlZmluZSBIQVNIX0JJVFMgICAgICAgIDB4MDFmZiAgICAvKiA5IExTIGJpdHMgKi8KKworI2RlZmluZSBTRVRVUF9GUkFNRV9MRU4gIDE5MiAgICAgICAvKiBCeXRlcyAqLworI2RlZmluZSBJTVBFUkZfUEFfT0ZGU0VUIDE1NiAgICAgICAvKiBCeXRlcyAqLworCisjZGVmaW5lIFBPTExfREVNQU5EICAgICAgICAgIDEKKworI2RlZmluZSBMT1NUX01FRElBX1RIUkVTSE9MRCAzCisKKyNkZWZpbmUgTUFTS19JTlRFUlJVUFRTICAgICAgMQorI2RlZmluZSBVTk1BU0tfSU5URVJSVVBUUyAgICAwCisKKyNkZWZpbmUgREU0WDVfU1RSTEVOICAgICAgICAgOAorCisjZGVmaW5lIERFNFg1X0lOSVQgICAgICAgICAgIDAgICAgIC8qIEluaXRpYWxpc2F0aW9uIHRpbWUgKi8KKyNkZWZpbmUgREU0WDVfUlVOICAgICAgICAgICAgMSAgICAgLyogUnVuIHRpbWUgKi8KKworI2RlZmluZSBERTRYNV9TQVZFX1NUQVRFICAgICAwCisjZGVmaW5lIERFNFg1X1JFU1RPUkVfU1RBVEUgIDEKKworLyoKKyoqIEFkZHJlc3MgRmlsdGVyaW5nIE1vZGVzCisqLworI2RlZmluZSBQRVJGRUNUICAgICAgICAgICAgICAwICAgICAvKiAxNiBwZXJmZWN0IHBoeXNpY2FsIGFkZHJlc3NlcyAqLworI2RlZmluZSBIQVNIX1BFUkYgICAgICAgICAgICAxICAgICAvKiAxIHBlcmZlY3QsIDUxMiBtdWx0aWNhc3QgYWRkcmVzc2VzICovCisjZGVmaW5lIFBFUkZFQ1RfUkVKICAgICAgICAgIDIgICAgIC8qIFJlamVjdCAxNiBwZXJmZWN0IHBoeXNpY2FsIGFkZHJlc3NlcyAqLworI2RlZmluZSBBTExfSEFTSCAgICAgICAgICAgICAzICAgICAvKiBIYXNoZXMgYWxsIHBoeXNpY2FsICYgbXVsdGljYXN0IGFkZHJzICovCisKKyNkZWZpbmUgQUxMICAgICAgICAgICAgICAgICAgMCAgICAgLyogQ2xlYXIgb3V0IGFsbCB0aGUgc2V0dXAgZnJhbWUgKi8KKyNkZWZpbmUgUEhZU19BRERSX09OTFkgICAgICAgMSAgICAgLyogVXBkYXRlIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9ubHkgKi8KKworLyoKKyoqIEJvb2xlYW5zCisqLworI2RlZmluZSBOTyAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEZBTFNFICAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBZRVMgICAgICAgICAgICAgICAgICB+MAorI2RlZmluZSBUUlVFICAgICAgICAgICAgICAgICB+MAorCisvKgorKiogQWRhcHRlciBzdGF0ZQorKi8KKyNkZWZpbmUgSU5JVElBTElTRUQgICAgICAgICAgMCAgICAgLyogQWZ0ZXIgaC93IGluaXRpYWxpc2VkIGFuZCBtZW0gYWxsb2MnZCAqLworI2RlZmluZSBDTE9TRUQgICAgICAgICAgICAgICAxICAgICAvKiBSZWFkeSBmb3Igb3BlbmluZyAqLworI2RlZmluZSBPUEVOICAgICAgICAgICAgICAgICAyICAgICAvKiBSdW5uaW5nICovCisKKy8qCisqKiBWYXJpb3VzIHdhaXQgdGltZXMKKyovCisjZGVmaW5lIFBERVRfTElOS19XQUlUICAgIDEyMDAgICAgLyogbXNlY3MgdG8gd2FpdCBmb3IgbGluayBkZXRlY3QgYml0cyAgICAgKi8KKyNkZWZpbmUgQU5TX0ZJTklTSF9XQUlUICAgMTAwMCAgICAvKiBtc2VjcyB0byB3YWl0IGZvciBsaW5rIGRldGVjdCBiaXRzICAgICAqLworCisvKgorKiogSUVFRSBPVUlzIGZvciB2YXJpb3VzIFBIWSB2ZW5kb3IvY2hpcCBjb21ib3MgLSBSZWcgMiB2YWx1ZXMgb25seS4gU2luY2UKKyoqIHRoZSB2ZW5kb3JzIHNlZW0gc3BsaXQgNTAtNTAgb24gaG93IHRvIGNhbGN1bGF0ZSB0aGUgT1VJIHJlZ2lzdGVyIHZhbHVlcworKiogYW55d2F5LCBqdXN0IHJlYWRpbmcgUmVnMiBzZWVtcyByZWFzb25hYmxlIGZvciBub3cgW3NlZSBkZTR4NV9nZXRfb3VpKCldLgorKi8KKyNkZWZpbmUgTkFUSU9OQUxfVFggMHgyMDAwCisjZGVmaW5lIEJST0FEQ09NX1Q0IDB4MDNlMAorI2RlZmluZSBTRUVRX1Q0ICAgICAweDAwMTYKKyNkZWZpbmUgQ1lQUkVTU19UNCAgMHgwMDE0CisKKy8qCisqKiBTcGVlZCBTZWxlY3Rpb24gc3R1ZmYKKyovCisjZGVmaW5lIFNFVF8xME1iIHtcCisgIGlmICgobHAtPnBoeVtscC0+YWN0aXZlXS5pZCkgJiYgKCFscC0+dXNlU1JPTSB8fCBscC0+dXNlTUlJKSkge1wKKyAgICBvbXIgPSBpbmwoREU0WDVfT01SKSAmIH4oT01SX1RUTSB8IE9NUl9QQ1MgfCBPTVJfU0NSIHwgT01SX0ZEWCk7XAorICAgIGlmICgobHAtPnRtcCAhPSBNSUlfU1JfQVNTQykgfHwgKGxwLT5hdXRvc2Vuc2UgIT0gQVVUTykpIHtcCisgICAgICBtaWlfd3IoTUlJX0NSXzEwfChscC0+ZmR4P01JSV9DUl9GRE06MCksIE1JSV9DUiwgbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLCBERTRYNV9NSUkpO1wKKyAgICB9XAorICAgIG9tciB8PSAoKGxwLT5mZHggPyBPTVJfRkRYIDogMCkgfCBPTVJfVFRNKTtcCisgICAgb3V0bChvbXIsIERFNFg1X09NUik7XAorICAgIGlmICghbHAtPnVzZVNST00pIGxwLT5jYWNoZS5nZXAgPSAwO1wKKyAgfSBlbHNlIGlmIChscC0+dXNlU1JPTSAmJiAhbHAtPnVzZU1JSSkge1wKKyAgICBvbXIgPSAoaW5sKERFNFg1X09NUikgJiB+KE9NUl9QUyB8IE9NUl9IQkQgfCBPTVJfVFRNIHwgT01SX1BDUyB8IE9NUl9TQ1IgfCBPTVJfRkRYKSk7XAorICAgIG9tciB8PSAobHAtPmZkeCA/IE9NUl9GRFggOiAwKTtcCisgICAgb3V0bChvbXIgfCAobHAtPmluZm9ibG9ja19jc3I2ICYgfihPTVJfU0NSIHwgT01SX0hCRCkpLCBERTRYNV9PTVIpO1wKKyAgfSBlbHNlIHtcCisgICAgb21yID0gKGlubChERTRYNV9PTVIpICYgfihPTVJfUFMgfCBPTVJfSEJEIHwgT01SX1RUTSB8IE9NUl9QQ1MgfCBPTVJfU0NSIHwgT01SX0ZEWCkpO1wKKyAgICBvbXIgfD0gKGxwLT5mZHggPyBPTVJfRkRYIDogMCk7XAorICAgIG91dGwob21yIHwgT01SX1NEUCB8IE9NUl9UVE0sIERFNFg1X09NUik7XAorICAgIGxwLT5jYWNoZS5nZXAgPSAobHAtPmZkeCA/IDAgOiBHRVBfRkRYRCk7XAorICAgIGdlcF93cihscC0+Y2FjaGUuZ2VwLCBkZXYpO1wKKyAgfVwKK30KKworI2RlZmluZSBTRVRfMTAwTWIge1wKKyAgaWYgKChscC0+cGh5W2xwLT5hY3RpdmVdLmlkKSAmJiAoIWxwLT51c2VTUk9NIHx8IGxwLT51c2VNSUkpKSB7XAorICAgIGludCBmZHg9MDtcCisgICAgaWYgKGxwLT5waHlbbHAtPmFjdGl2ZV0uaWQgPT0gTkFUSU9OQUxfVFgpIHtcCisgICAgICAgIG1paV93cihtaWlfcmQoMHgxOCwgbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLCBERTRYNV9NSUkpICYgfjB4MjAwMCxcCisgICAgICAgICAgICAgICAgICAgICAgMHgxOCwgbHAtPnBoeVtscC0+YWN0aXZlXS5hZGRyLCBERTRYNV9NSUkpO1wKKyAgICB9XAorICAgIG9tciA9IGlubChERTRYNV9PTVIpICYgfihPTVJfVFRNIHwgT01SX1BDUyB8IE9NUl9TQ1IgfCBPTVJfRkRYKTtcCisgICAgc3IgPSBtaWlfcmQoTUlJX1NSLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7XAorICAgIGlmICghKHNyICYgTUlJX0FOQV9UNEFNKSAmJiBscC0+ZmR4KSBmZHg9MTtcCisgICAgaWYgKChscC0+dG1wICE9IE1JSV9TUl9BU1NDKSB8fCAobHAtPmF1dG9zZW5zZSAhPSBBVVRPKSkge1wKKyAgICAgIG1paV93cihNSUlfQ1JfMTAwfChmZHg/TUlJX0NSX0ZETTowKSwgTUlJX0NSLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7XAorICAgIH1cCisgICAgaWYgKGZkeCkgb21yIHw9IE9NUl9GRFg7XAorICAgIG91dGwob21yLCBERTRYNV9PTVIpO1wKKyAgICBpZiAoIWxwLT51c2VTUk9NKSBscC0+Y2FjaGUuZ2VwID0gMDtcCisgIH0gZWxzZSBpZiAobHAtPnVzZVNST00gJiYgIWxwLT51c2VNSUkpIHtcCisgICAgb21yID0gKGlubChERTRYNV9PTVIpICYgfihPTVJfUFMgfCBPTVJfSEJEIHwgT01SX1RUTSB8IE9NUl9QQ1MgfCBPTVJfU0NSIHwgT01SX0ZEWCkpO1wKKyAgICBvbXIgfD0gKGxwLT5mZHggPyBPTVJfRkRYIDogMCk7XAorICAgIG91dGwob21yIHwgbHAtPmluZm9ibG9ja19jc3I2LCBERTRYNV9PTVIpO1wKKyAgfSBlbHNlIHtcCisgICAgb21yID0gKGlubChERTRYNV9PTVIpICYgfihPTVJfUFMgfCBPTVJfSEJEIHwgT01SX1RUTSB8IE9NUl9QQ1MgfCBPTVJfU0NSIHwgT01SX0ZEWCkpO1wKKyAgICBvbXIgfD0gKGxwLT5mZHggPyBPTVJfRkRYIDogMCk7XAorICAgIG91dGwob21yIHwgT01SX1NEUCB8IE9NUl9QUyB8IE9NUl9IQkQgfCBPTVJfUENTIHwgT01SX1NDUiwgREU0WDVfT01SKTtcCisgICAgbHAtPmNhY2hlLmdlcCA9IChscC0+ZmR4ID8gMCA6IEdFUF9GRFhEKSB8IEdFUF9NT0RFO1wKKyAgICBnZXBfd3IobHAtPmNhY2hlLmdlcCwgZGV2KTtcCisgIH1cCit9CisKKy8qIEZJWCBNRSBzbyBJIGRvbid0IGphbSAxME1iIG5ldHdvcmtzICovCisjZGVmaW5lIFNFVF8xMDBNYl9QREVUIHtcCisgIGlmICgobHAtPnBoeVtscC0+YWN0aXZlXS5pZCkgJiYgKCFscC0+dXNlU1JPTSB8fCBscC0+dXNlTUlJKSkge1wKKyAgICBtaWlfd3IoTUlJX0NSXzEwMHxNSUlfQ1JfQVNTRSwgTUlJX0NSLCBscC0+cGh5W2xwLT5hY3RpdmVdLmFkZHIsIERFNFg1X01JSSk7XAorICAgIG9tciA9IChpbmwoREU0WDVfT01SKSAmIH4oT01SX1RUTSB8IE9NUl9QQ1MgfCBPTVJfU0NSIHwgT01SX0ZEWCkpO1wKKyAgICBvdXRsKG9tciwgREU0WDVfT01SKTtcCisgIH0gZWxzZSBpZiAobHAtPnVzZVNST00gJiYgIWxwLT51c2VNSUkpIHtcCisgICAgb21yID0gKGlubChERTRYNV9PTVIpICYgfihPTVJfVFRNIHwgT01SX1BDUyB8IE9NUl9TQ1IgfCBPTVJfRkRYKSk7XAorICAgIG91dGwob21yLCBERTRYNV9PTVIpO1wKKyAgfSBlbHNlIHtcCisgICAgb21yID0gKGlubChERTRYNV9PTVIpICYgfihPTVJfUFMgfCBPTVJfSEJEIHwgT01SX1RUTSB8IE9NUl9QQ1MgfCBPTVJfU0NSIHwgT01SX0ZEWCkpO1wKKyAgICBvdXRsKG9tciB8IE9NUl9TRFAgfCBPTVJfUFMgfCBPTVJfSEJEIHwgT01SX1BDUywgREU0WDVfT01SKTtcCisgICAgbHAtPmNhY2hlLmdlcCA9IChHRVBfRkRYRCB8IEdFUF9NT0RFKTtcCisgICAgZ2VwX3dyKGxwLT5jYWNoZS5nZXAsIGRldik7XAorICB9XAorfQorCisvKgorKiogSW5jbHVkZSB0aGUgSU9DVEwgc3R1ZmYKKyovCisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorCisjZGVmaW5lCURFNFg1SU9DVEwJU0lPQ0RFVlBSSVZBVEUKKworc3RydWN0IGRlNHg1X2lvY3RsIHsKKwl1bnNpZ25lZCBzaG9ydCBjbWQ7ICAgICAgICAgICAgICAgIC8qIENvbW1hbmQgdG8gcnVuICovCisJdW5zaWduZWQgc2hvcnQgbGVuOyAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgdGhlIGRhdGEgYnVmZmVyICovCisJdW5zaWduZWQgY2hhciAgX191c2VyICpkYXRhOyAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciAqLworfTsKKworLyogCisqKiBSZWNvZ25pc2VkIGNvbW1hbmRzIGZvciB0aGUgZHJpdmVyIAorKi8KKyNkZWZpbmUgREU0WDVfR0VUX0hXQUREUgkweDAxIC8qIEdldCB0aGUgaGFyZHdhcmUgYWRkcmVzcyAqLworI2RlZmluZSBERTRYNV9TRVRfSFdBRERSCTB4MDIgLyogU2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzICovCisjZGVmaW5lIERFNFg1X1NFVF9QUk9NICAJMHgwMyAvKiBTZXQgUHJvbWlzY3VvdXMgTW9kZSAqLworI2RlZmluZSBERTRYNV9DTFJfUFJPTSAgCTB4MDQgLyogQ2xlYXIgUHJvbWlzY3VvdXMgTW9kZSAqLworI2RlZmluZSBERTRYNV9TQVlfQk9PCSAgICAgICAgMHgwNSAvKiBTYXkgIkJvbyEiIHRvIHRoZSBrZXJuZWwgbG9nIGZpbGUgKi8KKyNkZWZpbmUgREU0WDVfR0VUX01DQSAgIAkweDA2IC8qIEdldCBhIG11bHRpY2FzdCBhZGRyZXNzICovCisjZGVmaW5lIERFNFg1X1NFVF9NQ0EgICAJMHgwNyAvKiBTZXQgYSBtdWx0aWNhc3QgYWRkcmVzcyAqLworI2RlZmluZSBERTRYNV9DTFJfTUNBICAgIAkweDA4IC8qIENsZWFyIGEgbXVsdGljYXN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgREU0WDVfTUNBX0VOICAgIAkweDA5IC8qIEVuYWJsZSBhIG11bHRpY2FzdCBhZGRyZXNzIGdyb3VwICovCisjZGVmaW5lIERFNFg1X0dFVF9TVEFUUyAgCTB4MGEgLyogR2V0IHRoZSBkcml2ZXIgc3RhdGlzdGljcyAqLworI2RlZmluZSBERTRYNV9DTFJfU1RBVFMgCTB4MGIgLyogWmVybyBvdXQgdGhlIGRyaXZlciBzdGF0aXN0aWNzICovCisjZGVmaW5lIERFNFg1X0dFVF9PTVIgICAgICAgICAgIDB4MGMgLyogR2V0IHRoZSBPTVIgUmVnaXN0ZXIgY29udGVudHMgKi8KKyNkZWZpbmUgREU0WDVfU0VUX09NUiAgICAgICAgICAgMHgwZCAvKiBTZXQgdGhlIE9NUiBSZWdpc3RlciBjb250ZW50cyAqLworI2RlZmluZSBERTRYNV9HRVRfUkVHICAgICAgICAgICAweDBlIC8qIEdldCB0aGUgREU0WDUgUmVnaXN0ZXJzICovCisKKyNkZWZpbmUgTU9UT19TUk9NX0JVRyAgICAoKGxwLT5hY3RpdmUgPT0gOCkgJiYgKCgobGUzMl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoKHMzMiAqKWRldi0+ZGV2X2FkZHIpKSkpJjB4MDBmZmZmZmYpPT0weDNlMDAwOCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMgYi9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1ZjMzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYwpAQCAtMCwwICsxLDIwNjYgQEAKKy8qCisgICAgQSBEYXZpY29tIERNOTEwMi9ETTkxMDJBL0RNOTEwMkErRE05ODAxL0RNOTEwMkErRE05ODAyIE5JQyBmYXN0CisgICAgZXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KKyAgICBDb3B5cmlnaHQgKEMpIDE5OTcgIFN0ZW4gV2FuZworCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAgICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBEQVZJQ09NIFdlYi1TaXRlOiB3d3cuZGF2aWNvbS5jb20udHcKKworICAgIEF1dGhvcjogU3RlbiBXYW5nLCA4ODYtMy01Nzk4Nzk3LTg1MTcsIEUtbWFpbDogc3Rlbl93YW5nQGRhdmljb20uY29tLnR3CisgICAgTWFpbnRhaW5lcjogVG9iaWFzIFJpbmdzdHJvbSA8dG9yaUB1bmhhcHB5Lm1pbmUubnU+CisKKyAgICAoQylDb3B5cmlnaHQgMTk5Ny0xOTk4IERBVklDT00gU2VtaWNvbmR1Y3RvcixJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgICBNYXJjZWxvIFRvc2F0dGkgPG1hcmNlbG9AY29uZWN0aXZhLmNvbS5icj4gOgorICAgIE1hZGUgaXQgY29tcGlsZSBpbiAyLjMgKGRldmljZSB0byBuZXRfZGV2aWNlKQorCisgICAgQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4gOgorICAgIENsZWFuZWQgdXAgZm9yIGtlcm5lbCBtZXJnZS4KKyAgICBSZW1vdmVkIHRoZSBiYWNrIGNvbXBhdGliaWxpdHkgc3VwcG9ydAorICAgIFJlZm9ybWF0dGVkLCBmaXhpbmcgc3BlbGxpbmcgZXRjIGFzIEkgd2VudAorICAgIFJlbW92ZWQgSVJRIDAtMTUgYXNzdW1wdGlvbgorCisgICAgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPiA6CisgICAgVXBkYXRlZCB0byB1c2UgbmV3IFBDSSBkcml2ZXIgQVBJLgorICAgIFJlc291cmNlIHVzYWdlIGNsZWFudXBzLgorICAgIFJlcG9ydCBkcml2ZXIgdmVyc2lvbiB0byB1c2VyLgorCisgICAgVG9iaWFzIFJpbmdzdHJvbSA8dG9yaUB1bmhhcHB5Lm1pbmUubnU+IDoKKyAgICBDbGVhbmVkIHVwIGFuZCBhZGRlZCBTTVAgc2FmZXR5LiAgVGhhbmtzIGdvIHRvIEplZmYgR2FyemlrLAorICAgIEFuZHJldyBNb3J0b24gYW5kIEZyYW5rIERhdmlzIGZvciB0aGUgU01QIHNhZmV0eSBmaXhlcy4KKworICAgIFZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHN1c2UuY3o+IDoKKyAgICBDbGVhbmVkIHVwIHBvaW50ZXIgYXJpdGhtZXRpY3MuCisgICAgRml4ZWQgYSBsb3Qgb2YgNjRiaXQgaXNzdWVzLgorICAgIENsZWFuZWQgdXAgcHJpbnRrKClzIGEgYml0LgorICAgIEZpeGVkIHNvbWUgb2J2aW91cyBiaWcgZW5kaWFuIHByb2JsZW1zLgorCisgICAgVG9iaWFzIFJpbmdzdHJvbSA8dG9yaUB1bmhhcHB5Lm1pbmUubnU+IDoKKyAgICBVc2UgdGltZV9hZnRlciBmb3IgamlmZmllcyBjYWxjdWxhdGlvbi4gIEFkZGVkIGV0aHRvb2wKKyAgICBzdXBwb3J0LiAgVXBkYXRlZCBQQ0kgcmVzb3VyY2UgYWxsb2NhdGlvbi4gIERvIG5vdAorICAgIGZvcmdldCB0byB1bm1hcCBQQ0kgbWFwcGVkIHNrYnMuCisKKyAgICBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICAgIEFkZGVkIG5ldyBQQ0kgaWRlbnRpZmllcnMgcHJvdmlkZWQgYnkgQ2xlYXIgWmhhbmcgYXQgQUxpIAorICAgIGZvciB0aGVpciAxNTYzIGV0aGVybmV0IGRldmljZS4KKworICAgIFRPRE8KKworICAgIEltcGxlbWVudCBwY2lfZHJpdmVyOjpzdXNwZW5kKCkgYW5kIHBjaV9kcml2ZXI6OnJlc3VtZSgpCisgICAgcG93ZXIgbWFuYWdlbWVudCBtZXRob2RzLgorCisgICAgQ2hlY2sgb24gNjQgYml0IGJveGVzLgorICAgIENoZWNrIGFuZCBmaXggb24gYmlnIGVuZGlhbiBib3hlcy4KKworICAgIFRlc3QgYW5kIG1ha2Ugc3VyZSBQQ0kgbGF0ZW5jeSBpcyBub3cgY29ycmVjdCBmb3IgYWxsIGNhc2VzLgorKi8KKworI2RlZmluZSBEUlZfTkFNRQkiZG1mZSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMzYuNCIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIjIwMDItMDEtMTciCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKworLyogQm9hcmQvU3lzdGVtL0RlYnVnIGluZm9ybWF0aW9uL2RlZmluaXRpb24gLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBQQ0lfRE05MTMyX0lEICAgMHg5MTMyMTI4MiAgICAgIC8qIERhdmljb20gRE05MTMyIElEICovCisjZGVmaW5lIFBDSV9ETTkxMDJfSUQgICAweDkxMDIxMjgyICAgICAgLyogRGF2aWNvbSBETTkxMDIgSUQgKi8KKyNkZWZpbmUgUENJX0RNOTEwMF9JRCAgIDB4OTEwMDEyODIgICAgICAvKiBEYXZpY29tIERNOTEwMCBJRCAqLworI2RlZmluZSBQQ0lfRE05MDA5X0lEICAgMHg5MDA5MTI4MiAgICAgIC8qIERhdmljb20gRE05MDA5IElEICovCisKKyNkZWZpbmUgRE05MTAyX0lPX1NJWkUgIDB4ODAKKyNkZWZpbmUgRE05MTAyQV9JT19TSVpFIDB4MTAwCisjZGVmaW5lIFRYX01BWF9TRU5EX0NOVCAweDEgICAgICAgICAgICAgLyogTWF4aW11bSB0eCBwYWNrZXQgcGVyIHRpbWUgKi8KKyNkZWZpbmUgVFhfREVTQ19DTlQgICAgIDB4MTAgICAgICAgICAgICAvKiBBbGxvY2F0ZWQgVHggZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgUlhfREVTQ19DTlQgICAgIDB4MjAgICAgICAgICAgICAvKiBBbGxvY2F0ZWQgUnggZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgVFhfRlJFRV9ERVNDX0NOVCAoVFhfREVTQ19DTlQgLSAyKQkvKiBNYXggVFggcGFja2V0IGNvdW50ICovCisjZGVmaW5lIFRYX1dBS0VfREVTQ19DTlQgKFRYX0RFU0NfQ05UIC0gMykJLyogVFggd2FrZXVwIGNvdW50ICovCisjZGVmaW5lIERFU0NfQUxMX0NOVCAgICAoVFhfREVTQ19DTlQgKyBSWF9ERVNDX0NOVCkKKyNkZWZpbmUgVFhfQlVGX0FMTE9DICAgIDB4NjAwCisjZGVmaW5lIFJYX0FMTE9DX1NJWkUgICAweDYyMAorI2RlZmluZSBETTkxMFhfUkVTRVQgICAgMQorI2RlZmluZSBDUjBfREVGQVVMVCAgICAgMHgwMEUwMDAwMCAgICAgIC8qIFRYICYgUlggYnVyc3QgbW9kZSAqLworI2RlZmluZSBDUjZfREVGQVVMVCAgICAgMHgwMDA4MDAwMCAgICAgIC8qIEhEICovCisjZGVmaW5lIENSN19ERUZBVUxUICAgICAweDE4MGMxCisjZGVmaW5lIENSMTVfREVGQVVMVCAgICAweDA2ICAgICAgICAgICAgLyogVHhKYWJiZXIgUnhXYXRjaGRvZyAqLworI2RlZmluZSBUREVTMF9FUlJfTUFTSyAgMHg0MzAyICAgICAgICAgIC8qIFRYSlQsIExDLCBFQywgRlVFICovCisjZGVmaW5lIE1BWF9QQUNLRVRfU0laRSAxNTE0CisjZGVmaW5lIERNRkVfTUFYX01VTFRJQ0FTVCAxNAorI2RlZmluZSBSWF9DT1BZX1NJWkUJMTAwCisjZGVmaW5lIE1BWF9DSEVDS19QQUNLRVQgMHg4MDAwCisjZGVmaW5lIERNOTgwMV9OT0lTRV9GTE9PUiA4CisjZGVmaW5lIERNOTgwMl9OT0lTRV9GTE9PUiA1CisKKyNkZWZpbmUgRE1GRV8xME1IRiAgICAgIDAKKyNkZWZpbmUgRE1GRV8xMDBNSEYgICAgIDEKKyNkZWZpbmUgRE1GRV8xME1GRCAgICAgIDQKKyNkZWZpbmUgRE1GRV8xMDBNRkQgICAgIDUKKyNkZWZpbmUgRE1GRV9BVVRPICAgICAgIDgKKyNkZWZpbmUgRE1GRV8xTV9IUE5BICAgIDB4MTAKKworI2RlZmluZSBETUZFX1RYVEhfNzIJMHg0MDAwMDAJLyogVFggVEggNzIgYnl0ZSAqLworI2RlZmluZSBETUZFX1RYVEhfOTYJMHg0MDQwMDAJLyogVFggVEggOTYgYnl0ZSAqLworI2RlZmluZSBETUZFX1RYVEhfMTI4CTB4MDAwMAkJLyogVFggVEggMTI4IGJ5dGUgKi8KKyNkZWZpbmUgRE1GRV9UWFRIXzI1NgkweDQwMDAJCS8qIFRYIFRIIDI1NiBieXRlICovCisjZGVmaW5lIERNRkVfVFhUSF81MTIJMHg4MDAwCQkvKiBUWCBUSCA1MTIgYnl0ZSAqLworI2RlZmluZSBETUZFX1RYVEhfMUsJMHhDMDAwCQkvKiBUWCBUSCAxSyAgYnl0ZSAqLworCisjZGVmaW5lIERNRkVfVElNRVJfV1VUICAoamlmZmllcyArIEhaICogMSkvKiB0aW1lciB3YWtldXAgdGltZSA6IDEgc2Vjb25kICovCisjZGVmaW5lIERNRkVfVFhfVElNRU9VVCAoKDMqSFopLzIpCS8qIHR4IHBhY2tldCB0aW1lLW91dCB0aW1lIDEuNSBzIiAqLworI2RlZmluZSBETUZFX1RYX0tJQ0sgCShIWi8yKQkvKiB0eCBwYWNrZXQgS2ljay1vdXQgdGltZSAwLjUgcyIgKi8KKworI2RlZmluZSBETUZFX0RCVUcoZGJ1Z19ub3csIG1zZywgdmFsdWUpIGlmIChkbWZlX2RlYnVnIHx8IChkYnVnX25vdykpIHByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiAlcyAlbHhcbiIsIChtc2cpLCAobG9uZykgKHZhbHVlKSkKKworI2RlZmluZSBTSE9XX01FRElBX1RZUEUobW9kZSkgcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IENoYW5nZSBTcGVlZCB0byAlc01oeiAlcyBkdXBsZXhcbiIsbW9kZSAmIDEgPyIxMDAiOiIxMCIsIG1vZGUgJiA0ID8gImZ1bGwiOiJoYWxmIik7CisKKworLyogQ1I5IGRlZmluaXRpb246IFNST00vTUlJICovCisjZGVmaW5lIENSOV9TUk9NX1JFQUQgICAweDQ4MDAKKyNkZWZpbmUgQ1I5X1NSQ1MgICAgICAgIDB4MQorI2RlZmluZSBDUjlfU1JDTEsgICAgICAgMHgyCisjZGVmaW5lIENSOV9DUkRPVVQgICAgICAweDgKKyNkZWZpbmUgU1JPTV9EQVRBXzAgICAgIDB4MAorI2RlZmluZSBTUk9NX0RBVEFfMSAgICAgMHg0CisjZGVmaW5lIFBIWV9EQVRBXzEgICAgICAweDIwMDAwCisjZGVmaW5lIFBIWV9EQVRBXzAgICAgICAweDAwMDAwCisjZGVmaW5lIE1EQ0xLSCAgICAgICAgICAweDEwMDAwCisKKyNkZWZpbmUgUEhZX1BPV0VSX0RPV04JMHg4MDAKKworI2RlZmluZSBTUk9NX1Y0MV9DT0RFICAgMHgxNAorCisjZGVmaW5lIFNST01fQ0xLX1dSSVRFKGRhdGEsIGlvYWRkcikgb3V0bChkYXRhfENSOV9TUk9NX1JFQUR8Q1I5X1NSQ1MsaW9hZGRyKTt1ZGVsYXkoNSk7b3V0bChkYXRhfENSOV9TUk9NX1JFQUR8Q1I5X1NSQ1N8Q1I5X1NSQ0xLLGlvYWRkcik7dWRlbGF5KDUpO291dGwoZGF0YXxDUjlfU1JPTV9SRUFEfENSOV9TUkNTLGlvYWRkcik7dWRlbGF5KDUpOworCisjZGVmaW5lIF9fQ0hLX0lPX1NJWkUocGNpX2lkLCBkZXZfcmV2KSAoICgocGNpX2lkKT09UENJX0RNOTEzMl9JRCkgfHwgKChkZXZfcmV2KSA+PSAweDAyMDAwMDMwKSApID8gRE05MTAyQV9JT19TSVpFOiBETTkxMDJfSU9fU0laRQorI2RlZmluZSBDSEtfSU9fU0laRShwY2lfZGV2LCBkZXZfcmV2KSBfX0NIS19JT19TSVpFKCgocGNpX2RldiktPmRldmljZSA8PCAxNikgfCAocGNpX2RldiktPnZlbmRvciwgZGV2X3JldikKKworLyogU3RlbiBDaGVjayAqLworI2RlZmluZSBERVZJQ0UgbmV0X2RldmljZQorCisvKiBTdHJ1Y3R1cmUvZW51bSBkZWNsYXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdHJ1Y3QgdHhfZGVzYyB7CisgICAgICAgIHUzMiB0ZGVzMCwgdGRlczEsIHRkZXMyLCB0ZGVzMzsgLyogRGF0YSBmb3IgdGhlIGNhcmQgKi8KKyAgICAgICAgY2hhciAqdHhfYnVmX3B0cjsgICAgICAgICAgICAgICAvKiBEYXRhIGZvciB1cyAqLworICAgICAgICBzdHJ1Y3QgdHhfZGVzYyAqbmV4dF90eF9kZXNjOworfSBfX2F0dHJpYnV0ZV9fKCggYWxpZ25lZCgzMikgKSk7CisKK3N0cnVjdCByeF9kZXNjIHsKKwl1MzIgcmRlczAsIHJkZXMxLCByZGVzMiwgcmRlczM7IC8qIERhdGEgZm9yIHRoZSBjYXJkICovCisJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYl9wdHI7CS8qIERhdGEgZm9yIHVzICovCisJc3RydWN0IHJ4X2Rlc2MgKm5leHRfcnhfZGVzYzsKK30gX19hdHRyaWJ1dGVfXygoIGFsaWduZWQoMzIpICkpOworCitzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvIHsKKwl1MzIgY2hpcF9pZDsJCQkvKiBDaGlwIHZlbmRvci9EZXZpY2UgSUQgKi8KKwl1MzIgY2hpcF9yZXZpc2lvbjsJCS8qIENoaXAgcmV2aXNpb24gKi8KKwlzdHJ1Y3QgREVWSUNFICpuZXh0X2RldjsJLyogbmV4dCBkZXZpY2UgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsJCS8qIFBDSSBkZXZpY2UgKi8KKwlzcGlubG9ja190IGxvY2s7CisKKwlsb25nIGlvYWRkcjsJCQkvKiBJL08gYmFzZSBhZGRyZXNzICovCisJdTMyIGNyMF9kYXRhOworCXUzMiBjcjVfZGF0YTsKKwl1MzIgY3I2X2RhdGE7CisJdTMyIGNyN19kYXRhOworCXUzMiBjcjE1X2RhdGE7CisKKwkvKiBwb2ludGVyIGZvciBtZW1vcnkgcGh5c2ljYWwgYWRkcmVzcyAqLworCWRtYV9hZGRyX3QgYnVmX3Bvb2xfZG1hX3B0cjsJLyogVHggYnVmZmVyIHBvb2wgbWVtb3J5ICovCisJZG1hX2FkZHJfdCBidWZfcG9vbF9kbWFfc3RhcnQ7CS8qIFR4IGJ1ZmZlciBwb29sIGFsaWduIGR3b3JkICovCisJZG1hX2FkZHJfdCBkZXNjX3Bvb2xfZG1hX3B0cjsJLyogZGVzY3JpcHRvciBwb29sIG1lbW9yeSAqLworCWRtYV9hZGRyX3QgZmlyc3RfdHhfZGVzY19kbWE7CisJZG1hX2FkZHJfdCBmaXJzdF9yeF9kZXNjX2RtYTsKKworCS8qIGRlc2NyaXB0b3IgcG9pbnRlciAqLworCXVuc2lnbmVkIGNoYXIgKmJ1Zl9wb29sX3B0cjsJLyogVHggYnVmZmVyIHBvb2wgbWVtb3J5ICovCisJdW5zaWduZWQgY2hhciAqYnVmX3Bvb2xfc3RhcnQ7CS8qIFR4IGJ1ZmZlciBwb29sIGFsaWduIGR3b3JkICovCisJdW5zaWduZWQgY2hhciAqZGVzY19wb29sX3B0cjsJLyogZGVzY3JpcHRvciBwb29sIG1lbW9yeSAqLworCXN0cnVjdCB0eF9kZXNjICpmaXJzdF90eF9kZXNjOworCXN0cnVjdCB0eF9kZXNjICp0eF9pbnNlcnRfcHRyOworCXN0cnVjdCB0eF9kZXNjICp0eF9yZW1vdmVfcHRyOworCXN0cnVjdCByeF9kZXNjICpmaXJzdF9yeF9kZXNjOworCXN0cnVjdCByeF9kZXNjICpyeF9pbnNlcnRfcHRyOworCXN0cnVjdCByeF9kZXNjICpyeF9yZWFkeV9wdHI7CS8qIHBhY2tldCBjb21lIHBvaW50ZXIgKi8KKwl1bnNpZ25lZCBsb25nIHR4X3BhY2tldF9jbnQ7CS8qIHRyYW5zbWl0dGVkIHBhY2tldCBjb3VudCAqLworCXVuc2lnbmVkIGxvbmcgdHhfcXVldWVfY250OwkvKiB3YWl0IHRvIHNlbmQgcGFja2V0IGNvdW50ICovCisJdW5zaWduZWQgbG9uZyByeF9hdmFpbF9jbnQ7CS8qIGF2YWlsYWJsZSByeCBkZXNjcmlwdG9yIGNvdW50ICovCisJdW5zaWduZWQgbG9uZyBpbnRlcnZhbF9yeF9jbnQ7CS8qIHJ4IHBhY2tldCBjb3VudCBhIGNhbGxiYWNrIHRpbWUgKi8KKworCXUxNiBIUE5BX2NvbW1hbmQ7CQkvKiBGb3IgSFBOQSByZWdpc3RlciAxNiAqLworCXUxNiBIUE5BX3RpbWVyOwkJCS8qIEZvciBIUE5BIHJlbW90ZSBkZXZpY2UgY2hlY2sgKi8KKwl1MTYgZGJ1Z19jbnQ7CisJdTE2IE5JQ19jYXBhYmlsaXR5OwkJLyogTklDIG1lZGlhIGNhcGFiaWxpdHkgKi8KKwl1MTYgUEhZX3JlZzQ7CQkJLyogU2F2ZWQgUGh5eGNlciByZWdpc3RlciA0IHZhbHVlICovCisKKwl1OCBIUE5BX3ByZXNlbnQ7CQkvKiAwOm5vbmUsIDE6RE05ODAxLCAyOkRNOTgwMiAqLworCXU4IGNoaXBfdHlwZTsJCQkvKiBLZWVwIERNOTEwMkEgY2hpcCB0eXBlICovCisJdTggbWVkaWFfbW9kZTsJCQkvKiB1c2VyIHNwZWNpZnkgbWVkaWEgbW9kZSAqLworCXU4IG9wX21vZGU7CQkJLyogcmVhbCB3b3JrIG1lZGlhIG1vZGUgKi8KKwl1OCBwaHlfYWRkcjsKKwl1OCBsaW5rX2ZhaWxlZDsJCQkvKiBFdmVyIGxpbmsgZmFpbGVkICovCisJdTggd2FpdF9yZXNldDsJCQkvKiBIYXJkd2FyZSBmYWlsZWQsIG5lZWQgdG8gcmVzZXQgKi8KKwl1OCBkbTkxMHhfY2hrX21vZGU7CQkvKiBPcGVyYXRpbmcgbW9kZSBjaGVjayAqLworCXU4IGZpcnN0X2luX2NhbGxiYWNrOwkJLyogRmxhZyB0byByZWNvcmQgc3RhdGUgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKworCS8qIFN5c3RlbSBkZWZpbmVkIHN0YXRpc3RpYyBjb3VudGVyICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisKKwkvKiBEcml2ZXIgZGVmaW5lZCBzdGF0aXN0aWMgY291bnRlciAqLworCXVuc2lnbmVkIGxvbmcgdHhfZmlmb191bmRlcnJ1bjsKKwl1bnNpZ25lZCBsb25nIHR4X2xvc3NfY2FycmllcjsKKwl1bnNpZ25lZCBsb25nIHR4X25vX2NhcnJpZXI7CisJdW5zaWduZWQgbG9uZyB0eF9sYXRlX2NvbGxpc2lvbjsKKwl1bnNpZ25lZCBsb25nIHR4X2V4Y2Vzc2l2ZV9jb2xsaXNpb247CisJdW5zaWduZWQgbG9uZyB0eF9qYWJiZXJfdGltZW91dDsKKwl1bnNpZ25lZCBsb25nIHJlc2V0X2NvdW50OworCXVuc2lnbmVkIGxvbmcgcmVzZXRfY3I4OworCXVuc2lnbmVkIGxvbmcgcmVzZXRfZmF0YWw7CisJdW5zaWduZWQgbG9uZyByZXNldF9UWHRpbWVvdXQ7CisKKwkvKiBOSUMgU1JPTSBkYXRhICovCisJdW5zaWduZWQgY2hhciBzcm9tWzEyOF07Cit9OworCitlbnVtIGRtZmVfb2Zmc2V0cyB7CisJRENSMCA9IDB4MDAsIERDUjEgPSAweDA4LCBEQ1IyID0gMHgxMCwgRENSMyA9IDB4MTgsIERDUjQgPSAweDIwLAorCURDUjUgPSAweDI4LCBEQ1I2ID0gMHgzMCwgRENSNyA9IDB4MzgsIERDUjggPSAweDQwLCBEQ1I5ID0gMHg0OCwKKwlEQ1IxMCA9IDB4NTAsIERDUjExID0gMHg1OCwgRENSMTIgPSAweDYwLCBEQ1IxMyA9IDB4NjgsIERDUjE0ID0gMHg3MCwKKwlEQ1IxNSA9IDB4NzgKK307CisKK2VudW0gZG1mZV9DUjZfYml0cyB7CisJQ1I2X1JYU0MgPSAweDIsIENSNl9QQkYgPSAweDgsIENSNl9QTSA9IDB4NDAsIENSNl9QQU0gPSAweDgwLAorCUNSNl9GRE0gPSAweDIwMCwgQ1I2X1RYU0MgPSAweDIwMDAsIENSNl9TVEkgPSAweDEwMDAwMCwKKwlDUjZfU0ZUID0gMHgyMDAwMDAsIENSNl9SWEEgPSAweDQwMDAwMDAwLCBDUjZfTk9fUFVSR0UgPSAweDIwMDAwMDAwCit9OworCisvKiBHbG9iYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0ZGF0YSBwcmludGVkX3ZlcnNpb247CitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisJS0VSTl9JTkZPIERSVl9OQU1FICI6IERhdmljb20gRE05eHh4IG5ldCBkcml2ZXIsIHZlcnNpb24gIgorCURSVl9WRVJTSU9OICIgKCIgRFJWX1JFTERBVEUgIilcbiI7CisKK3N0YXRpYyBpbnQgZG1mZV9kZWJ1ZzsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRtZmVfbWVkaWFfbW9kZSA9IERNRkVfQVVUTzsKK3N0YXRpYyB1MzIgZG1mZV9jcjZfdXNlcl9zZXQ7CisKKy8qIEZvciBtb2R1bGUgaW5wdXQgcGFyYW1ldGVyICovCitzdGF0aWMgaW50IGRlYnVnOworc3RhdGljIHUzMiBjcjZzZXQ7CitzdGF0aWMgdW5zaWduZWQgY2hhciBtb2RlID0gODsKK3N0YXRpYyB1OCBjaGttb2RlID0gMTsKK3N0YXRpYyB1OCBIUE5BX21vZGU7CQkvKiBEZWZhdWx0OiBMb3cgUG93ZXIvSGlnaCBTcGVlZCAqLworc3RhdGljIHU4IEhQTkFfcnhfY21kOwkJLyogRGVmYXVsdDogRGlzYWJsZSBSeCByZW1vdGUgY29tbWFuZCAqLworc3RhdGljIHU4IEhQTkFfdHhfY21kOwkJLyogRGVmYXVsdDogRG9uJ3QgaXNzdWUgcmVtb3RlIGNvbW1hbmQgKi8KK3N0YXRpYyB1OCBIUE5BX05vaXNlRmxvb3I7CS8qIERlZmF1bHQ6IEhQTkEgTm9pc2VGbG9vciAqLworc3RhdGljIHU4IFNGX21vZGU7CQkvKiBTcGVjaWFsIEZ1bmN0aW9uOiAxOlZMQU4sIDI6UlggRmxvdyBDb250cm9sCisJCQkJICAgNDogVFggcGF1c2UgcGFja2V0ICovCisKKworLyogZnVuY3Rpb24gZGVjbGFyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCBkbWZlX29wZW4oc3RydWN0IERFVklDRSAqKTsKK3N0YXRpYyBpbnQgZG1mZV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICosIHN0cnVjdCBERVZJQ0UgKik7CitzdGF0aWMgaW50IGRtZmVfc3RvcChzdHJ1Y3QgREVWSUNFICopOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICogZG1mZV9nZXRfc3RhdHMoc3RydWN0IERFVklDRSAqKTsKK3N0YXRpYyB2b2lkIGRtZmVfc2V0X2ZpbHRlcl9tb2RlKHN0cnVjdCBERVZJQ0UgKik7CitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wczsKK3N0YXRpYyB1MTYgcmVhZF9zcm9tX3dvcmQobG9uZyAsaW50KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBkbWZlX2ludGVycnVwdChpbnQgLCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBwb2xsX2RtZmUgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCitzdGF0aWMgdm9pZCBkbWZlX2Rlc2NyaXB0b3JfaW5pdChzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICosIHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgYWxsb2NhdGVfcnhfYnVmZmVyKHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKik7CitzdGF0aWMgdm9pZCB1cGRhdGVfY3I2KHUzMiwgdW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCBzZW5kX2ZpbHRlcl9mcmFtZShzdHJ1Y3QgREVWSUNFICogLGludCk7CitzdGF0aWMgdm9pZCBkbTkxMzJfaWRfdGFibGUoc3RydWN0IERFVklDRSAqICxpbnQpOworc3RhdGljIHUxNiBwaHlfcmVhZCh1bnNpZ25lZCBsb25nLCB1OCwgdTgsIHUzMik7CitzdGF0aWMgdm9pZCBwaHlfd3JpdGUodW5zaWduZWQgbG9uZywgdTgsIHU4LCB1MTYsIHUzMik7CitzdGF0aWMgdm9pZCBwaHlfd3JpdGVfMWJpdCh1bnNpZ25lZCBsb25nLCB1MzIpOworc3RhdGljIHUxNiBwaHlfcmVhZF8xYml0KHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHU4IGRtZmVfc2Vuc2Vfc3BlZWQoc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqKTsKK3N0YXRpYyB2b2lkIGRtZmVfcHJvY2Vzc19tb2RlKHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKik7CitzdGF0aWMgdm9pZCBkbWZlX3RpbWVyKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIGlubGluZSB1MzIgY2FsX0NSQyh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCwgdTgpOworc3RhdGljIHZvaWQgZG1mZV9yeF9wYWNrZXQoc3RydWN0IERFVklDRSAqLCBzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICopOworc3RhdGljIHZvaWQgZG1mZV9mcmVlX3R4X3BrdChzdHJ1Y3QgREVWSUNFICosIHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKik7CitzdGF0aWMgdm9pZCBkbWZlX3JldXNlX3NrYihzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICosIHN0cnVjdCBza19idWZmICopOworc3RhdGljIHZvaWQgZG1mZV9keW5hbWljX3Jlc2V0KHN0cnVjdCBERVZJQ0UgKik7CitzdGF0aWMgdm9pZCBkbWZlX2ZyZWVfcnhidWZmZXIoc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqKTsKK3N0YXRpYyB2b2lkIGRtZmVfaW5pdF9kbTkxMHgoc3RydWN0IERFVklDRSAqKTsKK3N0YXRpYyB2b2lkIGRtZmVfcGFyc2Vfc3JvbShzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICopOworc3RhdGljIHZvaWQgZG1mZV9wcm9ncmFtX0RNOTgwMShzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICosIGludCk7CitzdGF0aWMgdm9pZCBkbWZlX3Byb2dyYW1fRE05ODAyKHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKik7CitzdGF0aWMgdm9pZCBkbWZlX0hQTkFfcmVtb3RlX2NtZF9jaGsoc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqICk7CitzdGF0aWMgdm9pZCBkbWZlX3NldF9waHl4Y2VyKHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKik7CisKKy8qIERNOTEwWCBuZXR3b3JrIGJhb3JkIHJvdXRpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICoJU2VhcmNoIERNOTEwWCBib2FyZCAsYWxsb2NhdGUgc3BhY2UgYW5kIHJlZ2lzdGVyIGl0CisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgZG1mZV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGI7CS8qIGJvYXJkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdTMyIGRldl9yZXYsIHBjaV9wbXI7CisJaW50IGksIGVycjsKKworCURNRkVfREJVRygwLCAiZG1mZV9pbml0X29uZSgpIiwgMCk7CisKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQlwcmludGsodmVyc2lvbik7CisKKwkvKiBJbml0IG5ldHdvcmsgZGV2aWNlICovCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKCpkYikpOworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FICI6IDMyLWJpdCBQQ0kgRE1BIG5vdCBhdmFpbGFibGUuXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisJfQorCisJLyogRW5hYmxlIE1hc3Rlci9JTyBhY2Nlc3MsIERpc2FibGUgbWVtb3J5IGFjY2VzcyAqLworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9mcmVlOworCisJaWYgKCFwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IEkvTyBiYXNlIGlzIHplcm9cbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfZGlzYWJsZTsKKwl9CisKKwkvKiBSZWFkIENoaXAgcmV2aXNpb24gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX1JFVklTSU9OX0lELCAmZGV2X3Jldik7CisKKwlpZiAocGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSA8IChDSEtfSU9fU0laRShwZGV2LCBkZXZfcmV2KSkgKSB7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiBBbGxvY2F0ZWQgSS9PIHNpemUgdG9vIHNtYWxsXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGU7CisJfQorCisjaWYgMAkvKiBwY2lfe2VuYWJsZV9kZXZpY2Usc2V0X21hc3Rlcn0gc2V0cyBtaW5pbXVtIGxhdGVuY3kgZm9yIHVzIG5vdyAqLworCisJLyogU2V0IExhdGVuY3kgVGltZXIgODBoICovCisJLyogRklYTUU6IHNldHRpbmcgdmFsdWVzID4gMzIgYnJlYWtzIHNvbWUgU2lTIDU1OXggc3R1ZmYuCisJICAgTmVlZCBhIFBDSSBxdWlyay4uICovCisKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDB4ODApOworI2VuZGlmCisKKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IEZhaWxlZCB0byByZXF1ZXN0IFBDSSByZWdpb25zXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGU7CisJfQorCisJLyogSW5pdCBzeXN0ZW0gJiBkZXZpY2UgKi8KKwlkYiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBBbGxvY2F0ZSBUeC9SeCBkZXNjcmlwdG9yIG1lbW9yeSAqLworCWRiLT5kZXNjX3Bvb2xfcHRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqIERFU0NfQUxMX0NOVCArIDB4MjAsICZkYi0+ZGVzY19wb29sX2RtYV9wdHIpOworCWRiLT5idWZfcG9vbF9wdHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBUWF9CVUZfQUxMT0MgKiBUWF9ERVNDX0NOVCArIDQsICZkYi0+YnVmX3Bvb2xfZG1hX3B0cik7CisKKwlkYi0+Zmlyc3RfdHhfZGVzYyA9IChzdHJ1Y3QgdHhfZGVzYyAqKSBkYi0+ZGVzY19wb29sX3B0cjsKKwlkYi0+Zmlyc3RfdHhfZGVzY19kbWEgPSBkYi0+ZGVzY19wb29sX2RtYV9wdHI7CisJZGItPmJ1Zl9wb29sX3N0YXJ0ID0gZGItPmJ1Zl9wb29sX3B0cjsKKwlkYi0+YnVmX3Bvb2xfZG1hX3N0YXJ0ID0gZGItPmJ1Zl9wb29sX2RtYV9wdHI7CisKKwlkYi0+Y2hpcF9pZCA9IGVudC0+ZHJpdmVyX2RhdGE7CisJZGItPmlvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlkYi0+Y2hpcF9yZXZpc2lvbiA9IGRldl9yZXY7CisKKwlkYi0+cGRldiA9IHBkZXY7CisKKwlkZXYtPmJhc2VfYWRkciA9IGRiLT5pb2FkZHI7CisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJZGV2LT5vcGVuID0gJmRtZmVfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZkbWZlX3N0YXJ0X3htaXQ7CisJZGV2LT5zdG9wID0gJmRtZmVfc3RvcDsKKwlkZXYtPmdldF9zdGF0cyA9ICZkbWZlX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZkbWZlX3NldF9maWx0ZXJfbW9kZTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gJnBvbGxfZG1mZTsKKyNlbmRpZgorCWRldi0+ZXRodG9vbF9vcHMgPSAmbmV0ZGV2X2V0aHRvb2xfb3BzOworCXNwaW5fbG9ja19pbml0KCZkYi0+bG9jayk7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHg1MCwgJnBjaV9wbXIpOworCXBjaV9wbXIgJj0gMHg3MDAwMDsKKwlpZiAoIChwY2lfcG1yID09IDB4MTAwMDApICYmIChkZXZfcmV2ID09IDB4MDIwMDAwMzEpICkKKwkJZGItPmNoaXBfdHlwZSA9IDE7CS8qIERNOTEwMkEgRTMgKi8KKwllbHNlCisJCWRiLT5jaGlwX3R5cGUgPSAwOworCisJLyogcmVhZCA2NCB3b3JkIHNyb20gZGF0YSAqLworCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorCQkoKHUxNiAqKSBkYi0+c3JvbSlbaV0gPSBjcHVfdG9fbGUxNihyZWFkX3Nyb21fd29yZChkYi0+aW9hZGRyLCBpKSk7CisKKwkvKiBTZXQgTm9kZSBhZGRyZXNzICovCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJZGV2LT5kZXZfYWRkcltpXSA9IGRiLT5zcm9tWzIwICsgaV07CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYgKGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0X3JlczsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBEYXZpY29tIERNJTA0bHggYXQgcGNpJXMsIiwKKwkJZGV2LT5uYW1lLAorCQllbnQtPmRyaXZlcl9kYXRhID4+IDE2LAorCQlwY2lfbmFtZShwZGV2KSk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlYyUwMngiLCBpID8gJzonIDogJyAnLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIiwgaXJxICVkLlxuIiwgZGV2LT5pcnEpOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXRfZGlzYWJsZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CitlcnJfb3V0X2ZyZWU6CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfbmV0ZGV2KGRldik7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkbWZlX3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGIgPSBuZXRkZXZfcHJpdihkZXYpOworCisJRE1GRV9EQlVHKDAsICJkbWZlX3JlbW92ZV9vbmUoKSIsIDApOworCisgCWlmIChkZXYpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChkYi0+cGRldiwgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqCisJCQkJCURFU0NfQUxMX0NOVCArIDB4MjAsIGRiLT5kZXNjX3Bvb2xfcHRyLAorIAkJCQkJZGItPmRlc2NfcG9vbF9kbWFfcHRyKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChkYi0+cGRldiwgVFhfQlVGX0FMTE9DICogVFhfREVTQ19DTlQgKyA0LAorCQkJCQlkYi0+YnVmX3Bvb2xfcHRyLCBkYi0+YnVmX3Bvb2xfZG1hX3B0cik7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJCWZyZWVfbmV0ZGV2KGRldik7CS8qIGZyZWUgYm9hcmQgaW5mb3JtYXRpb24gKi8KKwkJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCX0KKworCURNRkVfREJVRygwLCAiZG1mZV9yZW1vdmVfb25lKCkgZXhpdCIsIDApOworfQorCisKKy8qCisgKglPcGVuIHRoZSBpbnRlcmZhY2UuCisgKglUaGUgaW50ZXJmYWNlIGlzIG9wZW5lZCB3aGVuZXZlciAiaWZjb25maWciIGFjdGl2ZXMgaXQuCisgKi8KKworc3RhdGljIGludCBkbWZlX29wZW4oc3RydWN0IERFVklDRSAqZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGIgPSBuZXRkZXZfcHJpdihkZXYpOworCisJRE1GRV9EQlVHKDAsICJkbWZlX29wZW4iLCAwKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmZG1mZV9pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHN5c3RlbSB2YXJpYWJsZSBpbml0ICovCisJZGItPmNyNl9kYXRhID0gQ1I2X0RFRkFVTFQgfCBkbWZlX2NyNl91c2VyX3NldDsKKwlkYi0+dHhfcGFja2V0X2NudCA9IDA7CisJZGItPnR4X3F1ZXVlX2NudCA9IDA7CisJZGItPnJ4X2F2YWlsX2NudCA9IDA7CisJZGItPmxpbmtfZmFpbGVkID0gMTsKKwlkYi0+d2FpdF9yZXNldCA9IDA7CisKKwlkYi0+Zmlyc3RfaW5fY2FsbGJhY2sgPSAwOworCWRiLT5OSUNfY2FwYWJpbGl0eSA9IDB4ZjsJLyogQWxsIGNhcGFiaWxpdHkqLworCWRiLT5QSFlfcmVnNCA9IDB4MWUwOworCisJLyogQ1I2IG9wZXJhdGlvbiBtb2RlIGRlY2lzaW9uICovCisJaWYgKCAhY2hrbW9kZSB8fCAoZGItPmNoaXBfaWQgPT0gUENJX0RNOTEzMl9JRCkgfHwKKwkJKGRiLT5jaGlwX3JldmlzaW9uID49IDB4MDIwMDAwMzApICkgeworICAgIAkJZGItPmNyNl9kYXRhIHw9IERNRkVfVFhUSF8yNTY7CisJCWRiLT5jcjBfZGF0YSA9IENSMF9ERUZBVUxUOworCQlkYi0+ZG05MTB4X2Noa19tb2RlPTQ7CQkvKiBFbnRlciB0aGUgbm9ybWFsIG1vZGUgKi8KKyAJfSBlbHNlIHsKKwkJZGItPmNyNl9kYXRhIHw9IENSNl9TRlQ7CS8qIFN0b3JlICYgRm9yd2FyZCBtb2RlICovCisJCWRiLT5jcjBfZGF0YSA9IDA7CisJCWRiLT5kbTkxMHhfY2hrX21vZGUgPSAxOwkvKiBFbnRlciB0aGUgY2hlY2sgbW9kZSAqLworCX0KKworCS8qIEluaXRpbGl6ZSBETTkxMFggYm9hcmQgKi8KKwlkbWZlX2luaXRfZG05MTB4KGRldik7CisKKwkvKiBBY3RpdmUgU3lzdGVtIEludGVyZmFjZSAqLworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCS8qIHNldCBhbmQgYWN0aXZlIGEgdGltZXIgcHJvY2VzcyAqLworCWluaXRfdGltZXIoJmRiLT50aW1lcik7CisJZGItPnRpbWVyLmV4cGlyZXMgPSBETUZFX1RJTUVSX1dVVCArIEhaICogMjsKKwlkYi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlkYi0+dGltZXIuZnVuY3Rpb24gPSAmZG1mZV90aW1lcjsKKwlhZGRfdGltZXIoJmRiLT50aW1lcik7CisKKwlyZXR1cm4gMDsKK30KKworCisvKglJbml0aWxpemUgRE05MTBYIGJvYXJkCisgKglSZXNldCBETTkxMFggYm9hcmQKKyAqCUluaXRpbGl6ZSBUWC9SeCBkZXNjcmlwdG9yIGNoYWluIHN0cnVjdHVyZQorICoJU2VuZCB0aGUgc2V0LXVwIGZyYW1lCisgKglFbmFibGUgVHgvUnggbWFjaGluZQorICovCisKK3N0YXRpYyB2b2lkIGRtZmVfaW5pdF9kbTkxMHgoc3RydWN0IERFVklDRSAqZGV2KQoreworCXN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKmRiID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRiLT5pb2FkZHI7CisKKwlETUZFX0RCVUcoMCwgImRtZmVfaW5pdF9kbTkxMHgoKSIsIDApOworCisJLyogUmVzZXQgRE05MTB4IE1BQyBjb250cm9sbGVyICovCisJb3V0bChETTkxMFhfUkVTRVQsIGlvYWRkciArIERDUjApOwkvKiBSRVNFVCBNQUMgKi8KKwl1ZGVsYXkoMTAwKTsKKwlvdXRsKGRiLT5jcjBfZGF0YSwgaW9hZGRyICsgRENSMCk7CisJdWRlbGF5KDUpOworCisJLyogUGh5IGFkZHIgOiBETTkxMChBKTIvRE05MTMyLzk4MDEsIHBoeSBhZGRyZXNzID0gMSAqLworCWRiLT5waHlfYWRkciA9IDE7CisKKwkvKiBQYXJzZXIgU1JPTSBhbmQgbWVkaWEgbW9kZSAqLworCWRtZmVfcGFyc2Vfc3JvbShkYik7CisJZGItPm1lZGlhX21vZGUgPSBkbWZlX21lZGlhX21vZGU7CisKKwkvKiBSRVNFVCBQaHl4Y2VyIENoaXAgYnkgR1BSIHBvcnQgYml0IDcgKi8KKwlvdXRsKDB4MTgwLCBpb2FkZHIgKyBEQ1IxMik7CQkvKiBMZXQgYml0IDcgb3V0cHV0IHBvcnQgKi8KKwlpZiAoZGItPmNoaXBfaWQgPT0gUENJX0RNOTAwOV9JRCkgeworCQlvdXRsKDB4ODAsIGlvYWRkciArIERDUjEyKTsJLyogSXNzdWUgUkVTRVQgc2lnbmFsICovCisJCW1kZWxheSgzMDApOwkJCS8qIERlbGF5IDMwMCBtcyAqLworCX0KKwlvdXRsKDB4MCwgaW9hZGRyICsgRENSMTIpOwkvKiBDbGVhciBSRVNFVCBzaWduYWwgKi8KKworCS8qIFByb2Nlc3MgUGh5eGNlciBNZWRpYSBNb2RlICovCisJaWYgKCAhKGRiLT5tZWRpYV9tb2RlICYgMHgxMCkgKQkvKiBGb3JjZSAxTSBtb2RlICovCisJCWRtZmVfc2V0X3BoeXhjZXIoZGIpOworCisJLyogTWVkaWEgTW9kZSBQcm9jZXNzICovCisJaWYgKCAhKGRiLT5tZWRpYV9tb2RlICYgRE1GRV9BVVRPKSApCisJCWRiLT5vcF9tb2RlID0gZGItPm1lZGlhX21vZGU7IAkvKiBGb3JjZSBNb2RlICovCisKKwkvKiBJbml0aWxpYXplIFRyYW5zbWl0L1JlY2VpdmUgZGVjcmlwdG9yIGFuZCBDUjMvNCAqLworCWRtZmVfZGVzY3JpcHRvcl9pbml0KGRiLCBpb2FkZHIpOworCisJLyogSW5pdCBDUjYgdG8gcHJvZ3JhbSBETTkxMHggb3BlcmF0aW9uICovCisJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGlvYWRkcik7CisKKwkvKiBTZW5kIHNldHVwIGZyYW1lICovCisJaWYgKGRiLT5jaGlwX2lkID09IFBDSV9ETTkxMzJfSUQpCisJCWRtOTEzMl9pZF90YWJsZShkZXYsIGRldi0+bWNfY291bnQpOwkvKiBETTkxMzIgKi8KKwllbHNlCisJCXNlbmRfZmlsdGVyX2ZyYW1lKGRldiwgZGV2LT5tY19jb3VudCk7CS8qIERNOTEwMi9ETTkxMDJBICovCisKKwkvKiBJbml0IENSNywgaW50ZXJydXB0IGFjdGl2ZSBiaXQgKi8KKwlkYi0+Y3I3X2RhdGEgPSBDUjdfREVGQVVMVDsKKwlvdXRsKGRiLT5jcjdfZGF0YSwgaW9hZGRyICsgRENSNyk7CisKKwkvKiBJbml0IENSMTUsIFR4IGphYmJlciBhbmQgUnggd2F0Y2hkb2cgdGltZXIgKi8KKwlvdXRsKGRiLT5jcjE1X2RhdGEsIGlvYWRkciArIERDUjE1KTsKKworCS8qIEVuYWJsZSBETTkxMFggVHgvUnggZnVuY3Rpb24gKi8KKwlkYi0+Y3I2X2RhdGEgfD0gQ1I2X1JYU0MgfCBDUjZfVFhTQyB8IDB4NDAwMDA7CisJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGlvYWRkcik7Cit9CisKKworLyoKKyAqCUhhcmR3YXJlIHN0YXJ0IHRyYW5zbWlzc2lvbi4KKyAqCVNlbmQgYSBwYWNrZXQgdG8gbWVkaWEgZnJvbSB0aGUgdXBwZXIgbGF5ZXIuCisgKi8KKworc3RhdGljIGludCBkbWZlX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IERFVklDRSAqZGV2KQoreworCXN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKmRiID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdHhfZGVzYyAqdHhwdHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURNRkVfREJVRygwLCAiZG1mZV9zdGFydF94bWl0IiwgMCk7CisKKwkvKiBSZXNvdXJjZSBmbGFnIGNoZWNrICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogVG9vIGxhcmdlIHBhY2tldCBjaGVjayAqLworCWlmIChza2ItPmxlbiA+IE1BWF9QQUNLRVRfU0laRSkgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogYmlnIHBhY2tldCA9ICVkXG4iLCAodTE2KXNrYi0+bGVuKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGItPmxvY2ssIGZsYWdzKTsKKworCS8qIE5vIFR4IHJlc291cmNlIGNoZWNrLCBpdCBuZXZlciBoYXBwZW4gbnJvbWFsbHkgKi8KKwlpZiAoZGItPnR4X3F1ZXVlX2NudCA+PSBUWF9GUkVFX0RFU0NfQ05UKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7CisJCXByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiBObyBUeCByZXNvdXJjZSAlbGRcbiIsIGRiLT50eF9xdWV1ZV9jbnQpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBEaXNhYmxlIE5JQyBpbnRlcnJ1cHQgKi8KKwlvdXRsKDAsIGRldi0+YmFzZV9hZGRyICsgRENSNyk7CisKKwkvKiB0cmFuc21pdCB0aGlzIHBhY2tldCAqLworCXR4cHRyID0gZGItPnR4X2luc2VydF9wdHI7CisJbWVtY3B5KHR4cHRyLT50eF9idWZfcHRyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwl0eHB0ci0+dGRlczEgPSBjcHVfdG9fbGUzMigweGUxMDAwMDAwIHwgc2tiLT5sZW4pOworCisJLyogUG9pbnQgdG8gbmV4dCB0cmFuc21pdCBmcmVlIGRlc2NyaXB0b3IgKi8KKwlkYi0+dHhfaW5zZXJ0X3B0ciA9IHR4cHRyLT5uZXh0X3R4X2Rlc2M7CisKKwkvKiBUcmFuc21pdCBQYWNrZXQgUHJvY2VzcyAqLworCWlmICggKCFkYi0+dHhfcXVldWVfY250KSAmJiAoZGItPnR4X3BhY2tldF9jbnQgPCBUWF9NQVhfU0VORF9DTlQpICkgeworCQl0eHB0ci0+dGRlczAgPSBjcHVfdG9fbGUzMigweDgwMDAwMDAwKTsJLyogU2V0IG93bmVyIGJpdCAqLworCQlkYi0+dHhfcGFja2V0X2NudCsrOwkJCS8qIFJlYWR5IHRvIHNlbmQgKi8KKwkJb3V0bCgweDEsIGRldi0+YmFzZV9hZGRyICsgRENSMSk7CS8qIElzc3VlIFR4IHBvbGxpbmcgKi8KKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CQkvKiBzYXZlZCB0aW1lIHN0YW1wICovCisJfSBlbHNlIHsKKwkJZGItPnR4X3F1ZXVlX2NudCsrOwkJCS8qIHF1ZXVlIFRYIHBhY2tldCAqLworCQlvdXRsKDB4MSwgZGV2LT5iYXNlX2FkZHIgKyBEQ1IxKTsJLyogSXNzdWUgVHggcG9sbGluZyAqLworCX0KKworCS8qIFR4IHJlc291cmNlIGNoZWNrICovCisJaWYgKCBkYi0+dHhfcXVldWVfY250IDwgVFhfRlJFRV9ERVNDX0NOVCApCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCS8qIFJlc3RvcmUgQ1I3IHRvIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYi0+bG9jaywgZmxhZ3MpOworCW91dGwoZGItPmNyN19kYXRhLCBkZXYtPmJhc2VfYWRkciArIERDUjcpOworCisJLyogZnJlZSB0aGlzIFNLQiAqLworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKglTdG9wIHRoZSBpbnRlcmZhY2UuCisgKglUaGUgaW50ZXJmYWNlIGlzIHN0b3BwZWQgd2hlbiBpdCBpcyBicm91Z2h0LgorICovCisKK3N0YXRpYyBpbnQgZG1mZV9zdG9wKHN0cnVjdCBERVZJQ0UgKmRldikKK3sKKwlzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICpkYiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCURNRkVfREJVRygwLCAiZG1mZV9zdG9wIiwgMCk7CisKKwkvKiBkaXNhYmxlIHN5c3RlbSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIGRlbGV0ZWQgdGltZXIgKi8KKwlkZWxfdGltZXJfc3luYygmZGItPnRpbWVyKTsKKworCS8qIFJlc2V0ICYgc3RvcCBETTkxMFggYm9hcmQgKi8KKwlvdXRsKERNOTEwWF9SRVNFVCwgaW9hZGRyICsgRENSMCk7CisJdWRlbGF5KDUpOworCXBoeV93cml0ZShkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDAsIDB4ODAwMCwgZGItPmNoaXBfaWQpOworCisJLyogZnJlZSBpbnRlcnJ1cHQgKi8KKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCS8qIGZyZWUgYWxsb2NhdGVkIHJ4IGJ1ZmZlciAqLworCWRtZmVfZnJlZV9yeGJ1ZmZlcihkYik7CisKKyNpZiAwCisJLyogc2hvdyBzdGF0aXN0aWMgY291bnRlciAqLworCXByaW50ayhEUlZfTkFNRSAiOiBGVTolbHggRUM6JWx4IExDOiVseCBOQzolbHggTE9DOiVseCBUWEpUOiVseCBSRVNFVDolbHggUkNSODolbHggRkFMOiVseCBUVDolbHhcbiIsCisJCWRiLT50eF9maWZvX3VuZGVycnVuLCBkYi0+dHhfZXhjZXNzaXZlX2NvbGxpc2lvbiwKKwkJZGItPnR4X2xhdGVfY29sbGlzaW9uLCBkYi0+dHhfbm9fY2FycmllciwgZGItPnR4X2xvc3NfY2FycmllciwKKwkJZGItPnR4X2phYmJlcl90aW1lb3V0LCBkYi0+cmVzZXRfY291bnQsIGRiLT5yZXNldF9jcjgsCisJCWRiLT5yZXNldF9mYXRhbCwgZGItPnJlc2V0X1RYdGltZW91dCk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisKKy8qCisgKglETTkxMDIgaW5zdGVycnVwdCBoYW5kbGVyCisgKglyZWNlaXZlIHRoZSBwYWNrZXQgdG8gdXBwZXIgbGF5ZXIsIGZyZWUgdGhlIHRyYW5zbWl0dGVkIHBhY2tldAorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkbWZlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBERVZJQ0UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICpkYiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRE1GRV9EQlVHKDAsICJkbWZlX2ludGVycnVwdCgpIiwgMCk7CisKKwlpZiAoIWRldikgeworCQlETUZFX0RCVUcoMSwgImRtZmVfaW50ZXJydXB0KCkgd2l0aG91dCBERVZJQ0UgYXJnIiwgMCk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGItPmxvY2ssIGZsYWdzKTsKKworCS8qIEdvdCBETTkxMFggc3RhdHVzICovCisJZGItPmNyNV9kYXRhID0gaW5sKGlvYWRkciArIERDUjUpOworCW91dGwoZGItPmNyNV9kYXRhLCBpb2FkZHIgKyBEQ1I1KTsKKwlpZiAoICEoZGItPmNyNV9kYXRhICYgMHhjMSkgKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHQgaW4gQ1I3IHRvIHNvbHZlIHRoZSBpbnRlcnJ1cHQgZWRnZSBwcm9ibGVtICovCisJb3V0bCgwLCBpb2FkZHIgKyBEQ1I3KTsKKworCS8qIENoZWNrIHN5c3RlbSBzdGF0dXMgKi8KKwlpZiAoZGItPmNyNV9kYXRhICYgMHgyMDAwKSB7CisJCS8qIHN5c3RlbSBidXMgZXJyb3IgaGFwcGVuICovCisJCURNRkVfREJVRygxLCAiU3lzdGVtIGJ1cyBlcnJvciBoYXBwZW4uIENSNT0iLCBkYi0+Y3I1X2RhdGEpOworCQlkYi0+cmVzZXRfZmF0YWwrKzsKKwkJZGItPndhaXRfcmVzZXQgPSAxOwkvKiBOZWVkIHRvIFJFU0VUICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwkgLyogUmVjZWl2ZWQgdGhlIGNvbWluZyBwYWNrZXQgKi8KKwlpZiAoIChkYi0+Y3I1X2RhdGEgJiAweDQwKSAmJiBkYi0+cnhfYXZhaWxfY250ICkKKwkJZG1mZV9yeF9wYWNrZXQoZGV2LCBkYik7CisKKwkvKiByZWFsbG9jYXRlIHJ4IGRlc2NyaXB0b3IgYnVmZmVyICovCisJaWYgKGRiLT5yeF9hdmFpbF9jbnQ8UlhfREVTQ19DTlQpCisJCWFsbG9jYXRlX3J4X2J1ZmZlcihkYik7CisKKwkvKiBGcmVlIHRoZSB0cmFuc21pdHRlZCBkZXNjcmlwdG9yICovCisJaWYgKCBkYi0+Y3I1X2RhdGEgJiAweDAxKQorCQlkbWZlX2ZyZWVfdHhfcGt0KGRldiwgZGIpOworCisJLyogTW9kZSBDaGVjayAqLworCWlmIChkYi0+ZG05MTB4X2Noa19tb2RlICYgMHgyKSB7CisJCWRiLT5kbTkxMHhfY2hrX21vZGUgPSAweDQ7CisJCWRiLT5jcjZfZGF0YSB8PSAweDEwMDsKKwkJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGRiLT5pb2FkZHIpOworCX0KKworCS8qIFJlc3RvcmUgQ1I3IHRvIGVuYWJsZSBpbnRlcnJ1cHQgbWFzayAqLworCW91dGwoZGItPmNyN19kYXRhLCBpb2FkZHIgKyBEQ1I3KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorLyoKKyAqIFBvbGxpbmcgJ2ludGVycnVwdCcgLSB1c2VkIGJ5IHRoaW5ncyBsaWtlIG5ldGNvbnNvbGUgdG8gc2VuZCBza2JzCisgKiB3aXRob3V0IGhhdmluZyB0byByZS1lbmFibGUgaW50ZXJydXB0cy4gSXQncyBub3QgY2FsbGVkIHdoaWxlCisgKiB0aGUgaW50ZXJydXB0IHJvdXRpbmUgaXMgZXhlY3V0aW5nLgorICovCisKK3N0YXRpYyB2b2lkIHBvbGxfZG1mZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBkaXNhYmxlX2lycSBoZXJlIGlzIG5vdCB2ZXJ5IG5pY2UsIGJ1dCB3aXRoIHRoZSBsb2NrbGVzcworCSAgIGludGVycnVwdCBoYW5kbGVyIHdlIGhhdmUgbm8gb3RoZXIgY2hvaWNlLiAqLworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlkbWZlX2ludGVycnVwdCAoZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7Cit9CisjZW5kaWYKKworLyoKKyAqCUZyZWUgVFggcmVzb3VyY2UgYWZ0ZXIgVFggY29tcGxldGUKKyAqLworCitzdGF0aWMgdm9pZCBkbWZlX2ZyZWVfdHhfcGt0KHN0cnVjdCBERVZJQ0UgKmRldiwgc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqIGRiKQoreworCXN0cnVjdCB0eF9kZXNjICp0eHB0cjsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXUzMiB0ZGVzMDsKKworCXR4cHRyID0gZGItPnR4X3JlbW92ZV9wdHI7CisJd2hpbGUoZGItPnR4X3BhY2tldF9jbnQpIHsKKwkJdGRlczAgPSBsZTMyX3RvX2NwdSh0eHB0ci0+dGRlczApOworCQkvKiBwcmludGsoRFJWX05BTUUgIjogdGRlczA9JXhcbiIsIHRkZXMwKTsgKi8KKwkJaWYgKHRkZXMwICYgMHg4MDAwMDAwMCkKKwkJCWJyZWFrOworCisJCS8qIEEgcGFja2V0IHNlbnQgY29tcGxldGVkICovCisJCWRiLT50eF9wYWNrZXRfY250LS07CisJCWRiLT5zdGF0cy50eF9wYWNrZXRzKys7CisKKwkJLyogVHJhbnNtaXQgc3RhdGlzdGljIGNvdW50ZXIgKi8KKwkJaWYgKCB0ZGVzMCAhPSAweDdmZmZmZmZmICkgeworCQkJLyogcHJpbnRrKERSVl9OQU1FICI6IHRkZXMwPSV4XG4iLCB0ZGVzMCk7ICovCisJCQlkYi0+c3RhdHMuY29sbGlzaW9ucyArPSAodGRlczAgPj4gMykgJiAweGY7CisJCQlkYi0+c3RhdHMudHhfYnl0ZXMgKz0gbGUzMl90b19jcHUodHhwdHItPnRkZXMxKSAmIDB4N2ZmOworCQkJaWYgKHRkZXMwICYgVERFUzBfRVJSX01BU0spIHsKKwkJCQlkYi0+c3RhdHMudHhfZXJyb3JzKys7CisKKwkJCQlpZiAodGRlczAgJiAweDAwMDIpIHsJLyogVW5kZXJSdW4gKi8KKwkJCQkJZGItPnR4X2ZpZm9fdW5kZXJydW4rKzsKKwkJCQkJaWYgKCAhKGRiLT5jcjZfZGF0YSAmIENSNl9TRlQpICkgeworCQkJCQkJZGItPmNyNl9kYXRhID0gZGItPmNyNl9kYXRhIHwgQ1I2X1NGVDsKKwkJCQkJCXVwZGF0ZV9jcjYoZGItPmNyNl9kYXRhLCBkYi0+aW9hZGRyKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAodGRlczAgJiAweDAxMDApCisJCQkJCWRiLT50eF9leGNlc3NpdmVfY29sbGlzaW9uKys7CisJCQkJaWYgKHRkZXMwICYgMHgwMjAwKQorCQkJCQlkYi0+dHhfbGF0ZV9jb2xsaXNpb24rKzsKKwkJCQlpZiAodGRlczAgJiAweDA0MDApCisJCQkJCWRiLT50eF9ub19jYXJyaWVyKys7CisJCQkJaWYgKHRkZXMwICYgMHgwODAwKQorCQkJCQlkYi0+dHhfbG9zc19jYXJyaWVyKys7CisJCQkJaWYgKHRkZXMwICYgMHg0MDAwKQorCQkJCQlkYi0+dHhfamFiYmVyX3RpbWVvdXQrKzsKKwkJCX0KKwkJfQorCisgICAgCQl0eHB0ciA9IHR4cHRyLT5uZXh0X3R4X2Rlc2M7CisJfS8qIEVuZCBvZiB3aGlsZSAqLworCisJLyogVXBkYXRlIFRYIHJlbW92ZSBwb2ludGVyIHRvIG5leHQgKi8KKwlkYi0+dHhfcmVtb3ZlX3B0ciA9IHR4cHRyOworCisJLyogU2VuZCB0aGUgVHggcGFja2V0IGluIHF1ZXVlICovCisJaWYgKCAoZGItPnR4X3BhY2tldF9jbnQgPCBUWF9NQVhfU0VORF9DTlQpICYmIGRiLT50eF9xdWV1ZV9jbnQgKSB7CisJCXR4cHRyLT50ZGVzMCA9IGNwdV90b19sZTMyKDB4ODAwMDAwMDApOwkvKiBTZXQgb3duZXIgYml0ICovCisJCWRiLT50eF9wYWNrZXRfY250Kys7CQkJLyogUmVhZHkgdG8gc2VuZCAqLworCQlkYi0+dHhfcXVldWVfY250LS07CisJCW91dGwoMHgxLCBpb2FkZHIgKyBEQ1IxKTsJCS8qIElzc3VlIFR4IHBvbGxpbmcgKi8KKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CQkvKiBzYXZlZCB0aW1lIHN0YW1wICovCisJfQorCisJLyogUmVzb3VyY2UgYXZhaWxhYmxlIGNoZWNrICovCisJaWYgKCBkYi0+dHhfcXVldWVfY250IDwgVFhfV0FLRV9ERVNDX0NOVCApCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsJLyogQWN0aXZlIHVwcGVyIGxheWVyLCBzZW5kIGFnYWluICovCit9CisKKworLyoKKyAqCUNhbGN1bGF0ZSB0aGUgQ1JDIHZhbHVkZSBvZiB0aGUgUnggcGFja2V0CisgKglmbGFnID0gCTEgOiByZXR1cm4gdGhlIHJldmVyc2UgQ1JDIChmb3IgdGhlIHJlY2VpdmVkIHBhY2tldCBDUkMpCisgKgkJMCA6IHJldHVybiB0aGUgbm9ybWFsIENSQyAoZm9yIEhhc2ggVGFibGUgaW5kZXgpCisgKi8KKworc3RhdGljIGlubGluZSB1MzIgY2FsX0NSQyh1bnNpZ25lZCBjaGFyICogRGF0YSwgdW5zaWduZWQgaW50IExlbiwgdTggZmxhZykKK3sKKwl1MzIgY3JjID0gY3JjMzIofjAsIERhdGEsIExlbik7CisJaWYgKGZsYWcpIGNyYyA9IH5jcmM7CisJcmV0dXJuIGNyYzsKK30KKworCisvKgorICoJUmVjZWl2ZSB0aGUgY29tZSBwYWNrZXQgYW5kIHBhc3MgdG8gdXBwZXIgbGF5ZXIKKyAqLworCitzdGF0aWMgdm9pZCBkbWZlX3J4X3BhY2tldChzdHJ1Y3QgREVWSUNFICpkZXYsIHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKiBkYikKK3sKKwlzdHJ1Y3QgcnhfZGVzYyAqcnhwdHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgcnhsZW47CisJdTMyIHJkZXMwOworCisJcnhwdHIgPSBkYi0+cnhfcmVhZHlfcHRyOworCisJd2hpbGUoZGItPnJ4X2F2YWlsX2NudCkgeworCQlyZGVzMCA9IGxlMzJfdG9fY3B1KHJ4cHRyLT5yZGVzMCk7CisJCWlmIChyZGVzMCAmIDB4ODAwMDAwMDApCS8qIHBhY2tldCBvd25lciBjaGVjayAqLworCQkJYnJlYWs7CisKKwkJZGItPnJ4X2F2YWlsX2NudC0tOworCQlkYi0+aW50ZXJ2YWxfcnhfY250Kys7CisKKwkJcGNpX3VubWFwX3NpbmdsZShkYi0+cGRldiwgbGUzMl90b19jcHUocnhwdHItPnJkZXMyKSwgUlhfQUxMT0NfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJaWYgKCAocmRlczAgJiAweDMwMCkgIT0gMHgzMDApIHsKKwkJCS8qIEEgcGFja2V0IHdpdGhvdXQgRmlyc3QvTGFzdCBmbGFnICovCisJCQkvKiByZXVzZSB0aGlzIFNLQiAqLworCQkJRE1GRV9EQlVHKDAsICJSZXVzZSBTSyBidWZmZXIsIHJkZXMwIiwgcmRlczApOworCQkJZG1mZV9yZXVzZV9za2IoZGIsIHJ4cHRyLT5yeF9za2JfcHRyKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEEgcGFja2V0IHdpdGggRmlyc3QvTGFzdCBmbGFnICovCisJCQlyeGxlbiA9ICggKHJkZXMwID4+IDE2KSAmIDB4M2ZmZikgLSA0OworCisJCQkvKiBlcnJvciBzdW1tYXJ5IGJpdCBjaGVjayAqLworCQkJaWYgKHJkZXMwICYgMHg4MDAwKSB7CisJCQkJLyogVGhpcyBpcyBhIGVycm9yIHBhY2tldCAqLworCQkJCS8vcHJpbnRrKERSVl9OQU1FICI6IHJkZXMwOiAlbHhcbiIsIHJkZXMwKTsKKwkJCQlkYi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJaWYgKHJkZXMwICYgMSkKKwkJCQkJZGItPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQkJaWYgKHJkZXMwICYgMikKKwkJCQkJZGItPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQlpZiAocmRlczAgJiAweDgwKQorCQkJCQlkYi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJfQorCisJCQlpZiAoICEocmRlczAgJiAweDgwMDApIHx8CisJCQkJKChkYi0+Y3I2X2RhdGEgJiBDUjZfUE0pICYmIChyeGxlbj42KSkgKSB7CisJCQkJc2tiID0gcnhwdHItPnJ4X3NrYl9wdHI7CisKKwkJCQkvKiBSZWNlaXZlZCBQYWNrZXQgQ1JDIGNoZWNrIG5lZWQgb3Igbm90ICovCisJCQkJaWYgKCAoZGItPmRtOTEweF9jaGtfbW9kZSAmIDEpICYmCisJCQkJCShjYWxfQ1JDKHNrYi0+dGFpbCwgcnhsZW4sIDEpICE9CisJCQkJCSgqKHUzMiAqKSAoc2tiLT50YWlsK3J4bGVuKSApKSkgeyAvKiBGSVhNRSAoPykgKi8KKwkJCQkJLyogRm91bmQgYSBlcnJvciByZWNlaXZlZCBwYWNrZXQgKi8KKwkJCQkJZG1mZV9yZXVzZV9za2IoZGIsIHJ4cHRyLT5yeF9za2JfcHRyKTsKKwkJCQkJZGItPmRtOTEweF9jaGtfbW9kZSA9IDM7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogR29vZCBwYWNrZXQsIHNlbmQgdG8gdXBwZXIgbGF5ZXIgKi8KKwkJCQkJLyogU2hvcnN0IHBhY2tldCB1c2VkIG5ldyBTS0IgKi8KKwkJCQkJaWYgKCAocnhsZW4gPCBSWF9DT1BZX1NJWkUpICYmCisJCQkJCQkoIChza2IgPSBkZXZfYWxsb2Nfc2tiKHJ4bGVuICsgMikgKQorCQkJCQkJIT0gTlVMTCkgKSB7CisJCQkJCQkvKiBzaXplIGxlc3MgdGhhbiBDT1BZX1NJWkUsIGFsbG9jYXRlIGEgcnhsZW4gU0tCICovCisJCQkJCQlza2ItPmRldiA9IGRldjsKKwkJCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7IC8qIDE2Ynl0ZSBhbGlnbiAqLworCQkJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCByeGxlbiksIHJ4cHRyLT5yeF9za2JfcHRyLT50YWlsLCByeGxlbik7CisJCQkJCQlkbWZlX3JldXNlX3NrYihkYiwgcnhwdHItPnJ4X3NrYl9wdHIpOworCQkJCQl9IGVsc2UgeworCQkJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJCQlza2JfcHV0KHNrYiwgcnhsZW4pOworCQkJCQl9CisJCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJCWRiLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJCWRiLT5zdGF0cy5yeF9ieXRlcyArPSByeGxlbjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIFJldXNlIFNLQiBidWZmZXIgd2hlbiB0aGUgcGFja2V0IGlzIGVycm9yICovCisJCQkJRE1GRV9EQlVHKDAsICJSZXVzZSBTSyBidWZmZXIsIHJkZXMwIiwgcmRlczApOworCQkJCWRtZmVfcmV1c2Vfc2tiKGRiLCByeHB0ci0+cnhfc2tiX3B0cik7CisJCQl9CisJCX0KKworCQlyeHB0ciA9IHJ4cHRyLT5uZXh0X3J4X2Rlc2M7CisJfQorCisJZGItPnJ4X3JlYWR5X3B0ciA9IHJ4cHRyOworfQorCisKKy8qCisgKglHZXQgc3RhdGlzdGljcyBmcm9tIGRyaXZlci4KKyAqLworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKiBkbWZlX2dldF9zdGF0cyhzdHJ1Y3QgREVWSUNFICpkZXYpCit7CisJc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGIgPSBuZXRkZXZfcHJpdihkZXYpOworCisJRE1GRV9EQlVHKDAsICJkbWZlX2dldF9zdGF0cyIsIDApOworCXJldHVybiAmZGItPnN0YXRzOworfQorCisKKy8qCisgKiBTZXQgRE05MTBYIG11bHRpY2FzdCBhZGRyZXNzCisgKi8KKworc3RhdGljIHZvaWQgZG1mZV9zZXRfZmlsdGVyX21vZGUoc3RydWN0IERFVklDRSAqIGRldikKK3sKKwlzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICpkYiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURNRkVfREJVRygwLCAiZG1mZV9zZXRfZmlsdGVyX21vZGUoKSIsIDApOworCXNwaW5fbG9ja19pcnFzYXZlKCZkYi0+bG9jaywgZmxhZ3MpOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQlETUZFX0RCVUcoMCwgIkVuYWJsZSBQUk9NIE1vZGUiLCAwKTsKKwkJZGItPmNyNl9kYXRhIHw9IENSNl9QTSB8IENSNl9QQkY7CisJCXVwZGF0ZV9jcjYoZGItPmNyNl9kYXRhLCBkYi0+aW9hZGRyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGItPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJIHx8IGRldi0+bWNfY291bnQgPiBETUZFX01BWF9NVUxUSUNBU1QpIHsKKwkJRE1GRV9EQlVHKDAsICJQYXNzIGFsbCBtdWx0aWNhc3QgYWRkcmVzcyIsIGRldi0+bWNfY291bnQpOworCQlkYi0+Y3I2X2RhdGEgJj0gfihDUjZfUE0gfCBDUjZfUEJGKTsKKwkJZGItPmNyNl9kYXRhIHw9IENSNl9QQU07CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlETUZFX0RCVUcoMCwgIlNldCBtdWx0aWNhc3QgYWRkcmVzcyIsIGRldi0+bWNfY291bnQpOworCWlmIChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MTMyX0lEKQorCQlkbTkxMzJfaWRfdGFibGUoZGV2LCBkZXYtPm1jX2NvdW50KTsJLyogRE05MTMyICovCisJZWxzZQorCQlzZW5kX2ZpbHRlcl9mcmFtZShkZXYsIGRldi0+bWNfY291bnQpOyAJLyogRE05MTAyL0RNOTEwMkEgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYi0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCWlmIChucC0+cGRldikKKwkJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGRldikpOworCWVsc2UKKwkJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIkVJU0EgMHglbHggJWQiLAorCQkJZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKK307CisKKy8qCisgKglBIHBlcmlvZGljIHRpbWVyIHJvdXRpbmUKKyAqCUR5bmFtaWMgbWVkaWEgc2Vuc2UsIGFsbG9jYXRlIFJ4IGJ1ZmZlci4uLgorICovCisKK3N0YXRpYyB2b2lkIGRtZmVfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXUzMiB0bXBfY3I4OworCXVuc2lnbmVkIGNoYXIgdG1wX2NyMTI7CisJc3RydWN0IERFVklDRSAqZGV2ID0gKHN0cnVjdCBERVZJQ0UgKikgZGF0YTsKKwlzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICpkYiA9IG5ldGRldl9wcml2KGRldik7CisgCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlETUZFX0RCVUcoMCwgImRtZmVfdGltZXIoKSIsIDApOworCXNwaW5fbG9ja19pcnFzYXZlKCZkYi0+bG9jaywgZmxhZ3MpOworCisJLyogTWVkaWEgbW9kZSBwcm9jZXNzIHdoZW4gTGluayBPSyBiZWZvcmUgZW50ZXIgdGhpcyByb3V0ZSAqLworCWlmIChkYi0+Zmlyc3RfaW5fY2FsbGJhY2sgPT0gMCkgeworCQlkYi0+Zmlyc3RfaW5fY2FsbGJhY2sgPSAxOworCQlpZiAoZGItPmNoaXBfdHlwZSAmJiAoZGItPmNoaXBfaWQ9PVBDSV9ETTkxMDJfSUQpKSB7CisJCQlkYi0+Y3I2X2RhdGEgJj0gfjB4NDAwMDA7CisJCQl1cGRhdGVfY3I2KGRiLT5jcjZfZGF0YSwgZGItPmlvYWRkcik7CisJCQlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAwLCAweDEwMDAsIGRiLT5jaGlwX2lkKTsKKwkJCWRiLT5jcjZfZGF0YSB8PSAweDQwMDAwOworCQkJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGRiLT5pb2FkZHIpOworCQkJZGItPnRpbWVyLmV4cGlyZXMgPSBETUZFX1RJTUVSX1dVVCArIEhaICogMjsKKwkJCWFkZF90aW1lcigmZGItPnRpbWVyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKworCS8qIE9wZXJhdGluZyBNb2RlIENoZWNrICovCisJaWYgKCAoZGItPmRtOTEweF9jaGtfbW9kZSAmIDB4MSkgJiYKKwkJKGRiLT5zdGF0cy5yeF9wYWNrZXRzID4gTUFYX0NIRUNLX1BBQ0tFVCkgKQorCQlkYi0+ZG05MTB4X2Noa19tb2RlID0gMHg0OworCisJLyogRHluYW1pYyByZXNldCBETTkxMFggOiBzeXN0ZW0gZXJyb3Igb3IgdHJhbnNtaXQgdGltZS1vdXQgKi8KKwl0bXBfY3I4ID0gaW5sKGRiLT5pb2FkZHIgKyBEQ1I4KTsKKwlpZiAoIChkYi0+aW50ZXJ2YWxfcnhfY250PT0wKSAmJiAodG1wX2NyOCkgKSB7CisJCWRiLT5yZXNldF9jcjgrKzsKKwkJZGItPndhaXRfcmVzZXQgPSAxOworCX0KKwlkYi0+aW50ZXJ2YWxfcnhfY250ID0gMDsKKworCS8qIFRYIHBvbGxpbmcga2ljayBtb25pdG9yICovCisJaWYgKCBkYi0+dHhfcGFja2V0X2NudCAmJgorCSAgICAgdGltZV9hZnRlcihqaWZmaWVzLCBkZXYtPnRyYW5zX3N0YXJ0ICsgRE1GRV9UWF9LSUNLKSApIHsKKwkJb3V0bCgweDEsIGRldi0+YmFzZV9hZGRyICsgRENSMSk7ICAgLyogVHggcG9sbGluZyBhZ2FpbiAqLworCisJCS8qIFRYIFRpbWVvdXQgKi8KKwkJaWYgKCB0aW1lX2FmdGVyKGppZmZpZXMsIGRldi0+dHJhbnNfc3RhcnQgKyBETUZFX1RYX1RJTUVPVVQpICkgeworCQkJZGItPnJlc2V0X1RYdGltZW91dCsrOworCQkJZGItPndhaXRfcmVzZXQgPSAxOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFR4IHRpbWVvdXQgLSByZXNldHRpbmdcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJfQorCX0KKworCWlmIChkYi0+d2FpdF9yZXNldCkgeworCQlETUZFX0RCVUcoMCwgIkR5bmFtaWMgUmVzZXQgZGV2aWNlIiwgZGItPnR4X3BhY2tldF9jbnQpOworCQlkYi0+cmVzZXRfY291bnQrKzsKKwkJZG1mZV9keW5hbWljX3Jlc2V0KGRldik7CisJCWRiLT5maXJzdF9pbl9jYWxsYmFjayA9IDA7CisJCWRiLT50aW1lci5leHBpcmVzID0gRE1GRV9USU1FUl9XVVQ7CisJCWFkZF90aW1lcigmZGItPnRpbWVyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGItPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIExpbmsgc3RhdHVzIGNoZWNrLCBEeW5hbWljIG1lZGlhIHR5cGUgY2hhbmdlICovCisJaWYgKGRiLT5jaGlwX2lkID09IFBDSV9ETTkxMzJfSUQpCisJCXRtcF9jcjEyID0gaW5iKGRiLT5pb2FkZHIgKyBEQ1I5ICsgMyk7CS8qIERNOTEzMiAqLworCWVsc2UKKwkJdG1wX2NyMTIgPSBpbmIoZGItPmlvYWRkciArIERDUjEyKTsJLyogRE05MTAyL0RNOTEwMkEgKi8KKworCWlmICggKChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MTAyX0lEKSAmJgorCQkoZGItPmNoaXBfcmV2aXNpb24gPT0gMHgwMjAwMDAzMCkpIHx8CisJCSgoZGItPmNoaXBfaWQgPT0gUENJX0RNOTEzMl9JRCkgJiYKKwkJKGRiLT5jaGlwX3JldmlzaW9uID09IDB4MDIwMDAwMTApKSApIHsKKwkJLyogRE05MTAyQSBDaGlwICovCisJCWlmICh0bXBfY3IxMiAmIDIpCisJCQl0bXBfY3IxMiA9IDB4MDsJCS8qIExpbmsgZmFpbGVkICovCisJCWVsc2UKKwkJCXRtcF9jcjEyID0gMHgzOwkvKiBMaW5rIE9LICovCisJfQorCisJaWYgKCAhKHRtcF9jcjEyICYgMHgzKSAmJiAhZGItPmxpbmtfZmFpbGVkICkgeworCQkvKiBMaW5rIEZhaWxlZCAqLworCQlETUZFX0RCVUcoMCwgIkxpbmsgRmFpbGVkIiwgdG1wX2NyMTIpOworCQlkYi0+bGlua19mYWlsZWQgPSAxOworCisJCS8qIEZvciBGb3JjZSAxMC8xMDBNIEhhbGYvRnVsbCBtb2RlOiBFbmFibGUgQXV0by1OZWdvIG1vZGUgKi8KKwkJLyogQVVUTyBvciBmb3JjZSAxTSBIb21lcnVuL0xvbmdydW4gZG9uJ3QgbmVlZCAqLworCQlpZiAoICEoZGItPm1lZGlhX21vZGUgJiAweDM4KSApCisJCQlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAwLCAweDEwMDAsIGRiLT5jaGlwX2lkKTsKKworCQkvKiBBVVRPIG1vZGUsIGlmIElOVCBwaHl4Y2VyIGxpbmsgZmFpbGVkLCBzZWxlY3QgRVhUIGRldmljZSAqLworCQlpZiAoZGItPm1lZGlhX21vZGUgJiBETUZFX0FVVE8pIHsKKwkJCS8qIDEwLzEwME0gbGluayBmYWlsZWQsIHVzZWQgMU0gSG9tZS1OZXQgKi8KKwkJCWRiLT5jcjZfZGF0YXw9MHgwMDA0MDAwMDsJLyogYml0MTg9MSwgTUlJICovCisJCQlkYi0+Y3I2X2RhdGEmPX4weDAwMDAwMjAwOwkvKiBiaXQ5PTAsIEhEIG1vZGUgKi8KKwkJCXVwZGF0ZV9jcjYoZGItPmNyNl9kYXRhLCBkYi0+aW9hZGRyKTsKKwkJfQorCX0gZWxzZQorCQlpZiAoKHRtcF9jcjEyICYgMHgzKSAmJiBkYi0+bGlua19mYWlsZWQpIHsKKwkJCURNRkVfREJVRygwLCAiTGluayBsaW5rIE9LIiwgdG1wX2NyMTIpOworCQkJZGItPmxpbmtfZmFpbGVkID0gMDsKKworCQkJLyogQXV0byBTZW5zZSBTcGVlZCAqLworCQkJaWYgKCAoZGItPm1lZGlhX21vZGUgJiBETUZFX0FVVE8pICYmCisJCQkJZG1mZV9zZW5zZV9zcGVlZChkYikgKQorCQkJCWRiLT5saW5rX2ZhaWxlZCA9IDE7CisJCQlkbWZlX3Byb2Nlc3NfbW9kZShkYik7CisJCQkvKiBTSE9XX01FRElBX1RZUEUoZGItPm9wX21vZGUpOyAqLworCQl9CisKKwkvKiBIUE5BIHJlbW90ZSBjb21tYW5kIGNoZWNrICovCisJaWYgKGRiLT5IUE5BX2NvbW1hbmQgJiAweGYwMCkgeworCQlkYi0+SFBOQV90aW1lci0tOworCQlpZiAoIWRiLT5IUE5BX3RpbWVyKQorCQkJZG1mZV9IUE5BX3JlbW90ZV9jbWRfY2hrKGRiKTsKKwl9CisKKwkvKiBUaW1lciBhY3RpdmUgYWdhaW4gKi8KKwlkYi0+dGltZXIuZXhwaXJlcyA9IERNRkVfVElNRVJfV1VUOworCWFkZF90aW1lcigmZGItPnRpbWVyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYi0+bG9jaywgZmxhZ3MpOworfQorCisKKy8qCisgKglEeW5hbWljIHJlc2V0IHRoZSBETTkxMFggYm9hcmQKKyAqCVN0b3AgRE05MTBYIGJvYXJkCisgKglGcmVlIFR4L1J4IGFsbG9jYXRlZCBtZW1vcnkKKyAqCVJlc2V0IERNOTEwWCBib2FyZAorICoJUmUtaW5pdGlsaXplIERNOTEwWCBib2FyZAorICovCisKK3N0YXRpYyB2b2lkIGRtZmVfZHluYW1pY19yZXNldChzdHJ1Y3QgREVWSUNFICpkZXYpCit7CisJc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGIgPSBuZXRkZXZfcHJpdihkZXYpOworCisJRE1GRV9EQlVHKDAsICJkbWZlX2R5bmFtaWNfcmVzZXQoKSIsIDApOworCisJLyogU29wdCBNQUMgY29udHJvbGxlciAqLworCWRiLT5jcjZfZGF0YSAmPSB+KENSNl9SWFNDIHwgQ1I2X1RYU0MpOwkvKiBEaXNhYmxlIFR4L1J4ICovCisJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGRldi0+YmFzZV9hZGRyKTsKKwlvdXRsKDAsIGRldi0+YmFzZV9hZGRyICsgRENSNyk7CQkvKiBEaXNhYmxlIEludGVycnVwdCAqLworCW91dGwoaW5sKGRldi0+YmFzZV9hZGRyICsgRENSNSksIGRldi0+YmFzZV9hZGRyICsgRENSNSk7CisKKwkvKiBEaXNhYmxlIHVwcGVyIGxheWVyIGludGVyZmFjZSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qIEZyZWUgUnggQWxsb2NhdGUgYnVmZmVyICovCisJZG1mZV9mcmVlX3J4YnVmZmVyKGRiKTsKKworCS8qIHN5c3RlbSB2YXJpYWJsZSBpbml0ICovCisJZGItPnR4X3BhY2tldF9jbnQgPSAwOworCWRiLT50eF9xdWV1ZV9jbnQgPSAwOworCWRiLT5yeF9hdmFpbF9jbnQgPSAwOworCWRiLT5saW5rX2ZhaWxlZCA9IDE7CisJZGItPndhaXRfcmVzZXQgPSAwOworCisJLyogUmUtaW5pdGlsaXplIERNOTEwWCBib2FyZCAqLworCWRtZmVfaW5pdF9kbTkxMHgoZGV2KTsKKworCS8qIFJlc3RhcnQgdXBwZXIgbGF5ZXIgaW50ZXJmYWNlICovCisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisKKy8qCisgKglmcmVlIGFsbCBhbGxvY2F0ZWQgcnggYnVmZmVyCisgKi8KKworc3RhdGljIHZvaWQgZG1mZV9mcmVlX3J4YnVmZmVyKHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKiBkYikKK3sKKwlETUZFX0RCVUcoMCwgImRtZmVfZnJlZV9yeGJ1ZmZlcigpIiwgMCk7CisKKwkvKiBmcmVlIGFsbG9jYXRlZCByeCBidWZmZXIgKi8KKwl3aGlsZSAoZGItPnJ4X2F2YWlsX2NudCkgeworCQlkZXZfa2ZyZWVfc2tiKGRiLT5yeF9yZWFkeV9wdHItPnJ4X3NrYl9wdHIpOworCQlkYi0+cnhfcmVhZHlfcHRyID0gZGItPnJ4X3JlYWR5X3B0ci0+bmV4dF9yeF9kZXNjOworCQlkYi0+cnhfYXZhaWxfY250LS07CisJfQorfQorCisKKy8qCisgKglSZXVzZSB0aGUgU0sgYnVmZmVyCisgKi8KKworc3RhdGljIHZvaWQgZG1mZV9yZXVzZV9za2Ioc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGIsIHN0cnVjdCBza19idWZmICogc2tiKQoreworCXN0cnVjdCByeF9kZXNjICpyeHB0ciA9IGRiLT5yeF9pbnNlcnRfcHRyOworCisJaWYgKCEocnhwdHItPnJkZXMwICYgY3B1X3RvX2xlMzIoMHg4MDAwMDAwMCkpKSB7CisJCXJ4cHRyLT5yeF9za2JfcHRyID0gc2tiOworCQlyeHB0ci0+cmRlczIgPSBjcHVfdG9fbGUzMiggcGNpX21hcF9zaW5nbGUoZGItPnBkZXYsIHNrYi0+dGFpbCwgUlhfQUxMT0NfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKSApOworCQl3bWIoKTsKKwkJcnhwdHItPnJkZXMwID0gY3B1X3RvX2xlMzIoMHg4MDAwMDAwMCk7CisJCWRiLT5yeF9hdmFpbF9jbnQrKzsKKwkJZGItPnJ4X2luc2VydF9wdHIgPSByeHB0ci0+bmV4dF9yeF9kZXNjOworCX0gZWxzZQorCQlETUZFX0RCVUcoMCwgIlNLIEJ1ZmZlciByZXVzZSBtZXRob2QgZXJyb3IiLCBkYi0+cnhfYXZhaWxfY250KTsKK30KKworCisvKgorICoJSW5pdGlhbGl6ZSB0cmFuc21pdC9SZWNlaXZlIGRlc2NyaXB0b3IKKyAqCVVzaW5nIENoYWluIHN0cnVjdHVyZSwgYW5kIGFsbG9jYXRlIFR4L1J4IGJ1ZmZlcgorICovCisKK3N0YXRpYyB2b2lkIGRtZmVfZGVzY3JpcHRvcl9pbml0KHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKmRiLCB1bnNpZ25lZCBsb25nIGlvYWRkcikKK3sKKwlzdHJ1Y3QgdHhfZGVzYyAqdG1wX3R4OworCXN0cnVjdCByeF9kZXNjICp0bXBfcng7CisJdW5zaWduZWQgY2hhciAqdG1wX2J1ZjsKKwlkbWFfYWRkcl90IHRtcF90eF9kbWEsIHRtcF9yeF9kbWE7CisJZG1hX2FkZHJfdCB0bXBfYnVmX2RtYTsKKwlpbnQgaTsKKworCURNRkVfREJVRygwLCAiZG1mZV9kZXNjcmlwdG9yX2luaXQoKSIsIDApOworCisJLyogdHggZGVzY3JpcHRvciBzdGFydCBwb2ludGVyICovCisJZGItPnR4X2luc2VydF9wdHIgPSBkYi0+Zmlyc3RfdHhfZGVzYzsKKwlkYi0+dHhfcmVtb3ZlX3B0ciA9IGRiLT5maXJzdF90eF9kZXNjOworCW91dGwoZGItPmZpcnN0X3R4X2Rlc2NfZG1hLCBpb2FkZHIgKyBEQ1I0KTsgICAgIC8qIFRYIERFU0MgYWRkcmVzcyAqLworCisJLyogcnggZGVzY3JpcHRvciBzdGFydCBwb2ludGVyICovCisJZGItPmZpcnN0X3J4X2Rlc2MgPSAodm9pZCAqKWRiLT5maXJzdF90eF9kZXNjICsgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqIFRYX0RFU0NfQ05UOworCWRiLT5maXJzdF9yeF9kZXNjX2RtYSA9ICBkYi0+Zmlyc3RfdHhfZGVzY19kbWEgKyBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpICogVFhfREVTQ19DTlQ7CisJZGItPnJ4X2luc2VydF9wdHIgPSBkYi0+Zmlyc3RfcnhfZGVzYzsKKwlkYi0+cnhfcmVhZHlfcHRyID0gZGItPmZpcnN0X3J4X2Rlc2M7CisJb3V0bChkYi0+Zmlyc3RfcnhfZGVzY19kbWEsIGlvYWRkciArIERDUjMpOwkvKiBSWCBERVNDIGFkZHJlc3MgKi8KKworCS8qIEluaXQgVHJhbnNtaXQgY2hhaW4gKi8KKwl0bXBfYnVmID0gZGItPmJ1Zl9wb29sX3N0YXJ0OworCXRtcF9idWZfZG1hID0gZGItPmJ1Zl9wb29sX2RtYV9zdGFydDsKKwl0bXBfdHhfZG1hID0gZGItPmZpcnN0X3R4X2Rlc2NfZG1hOworCWZvciAodG1wX3R4ID0gZGItPmZpcnN0X3R4X2Rlc2MsIGkgPSAwOyBpIDwgVFhfREVTQ19DTlQ7IGkrKywgdG1wX3R4KyspIHsKKwkJdG1wX3R4LT50eF9idWZfcHRyID0gdG1wX2J1ZjsKKwkJdG1wX3R4LT50ZGVzMCA9IGNwdV90b19sZTMyKDApOworCQl0bXBfdHgtPnRkZXMxID0gY3B1X3RvX2xlMzIoMHg4MTAwMDAwMCk7CS8qIElDLCBjaGFpbiAqLworCQl0bXBfdHgtPnRkZXMyID0gY3B1X3RvX2xlMzIodG1wX2J1Zl9kbWEpOworCQl0bXBfdHhfZG1hICs9IHNpemVvZihzdHJ1Y3QgdHhfZGVzYyk7CisJCXRtcF90eC0+dGRlczMgPSBjcHVfdG9fbGUzMih0bXBfdHhfZG1hKTsKKwkJdG1wX3R4LT5uZXh0X3R4X2Rlc2MgPSB0bXBfdHggKyAxOworCQl0bXBfYnVmID0gdG1wX2J1ZiArIFRYX0JVRl9BTExPQzsKKwkJdG1wX2J1Zl9kbWEgPSB0bXBfYnVmX2RtYSArIFRYX0JVRl9BTExPQzsKKwl9CisJKC0tdG1wX3R4KS0+dGRlczMgPSBjcHVfdG9fbGUzMihkYi0+Zmlyc3RfdHhfZGVzY19kbWEpOworCXRtcF90eC0+bmV4dF90eF9kZXNjID0gZGItPmZpcnN0X3R4X2Rlc2M7CisKKwkgLyogSW5pdCBSZWNlaXZlIGRlc2NyaXB0b3IgY2hhaW4gKi8KKwl0bXBfcnhfZG1hPWRiLT5maXJzdF9yeF9kZXNjX2RtYTsKKwlmb3IgKHRtcF9yeCA9IGRiLT5maXJzdF9yeF9kZXNjLCBpID0gMDsgaSA8IFJYX0RFU0NfQ05UOyBpKyssIHRtcF9yeCsrKSB7CisJCXRtcF9yeC0+cmRlczAgPSBjcHVfdG9fbGUzMigwKTsKKwkJdG1wX3J4LT5yZGVzMSA9IGNwdV90b19sZTMyKDB4MDEwMDA2MDApOworCQl0bXBfcnhfZG1hICs9IHNpemVvZihzdHJ1Y3QgcnhfZGVzYyk7CisJCXRtcF9yeC0+cmRlczMgPSBjcHVfdG9fbGUzMih0bXBfcnhfZG1hKTsKKwkJdG1wX3J4LT5uZXh0X3J4X2Rlc2MgPSB0bXBfcnggKyAxOworCX0KKwkoLS10bXBfcngpLT5yZGVzMyA9IGNwdV90b19sZTMyKGRiLT5maXJzdF9yeF9kZXNjX2RtYSk7CisJdG1wX3J4LT5uZXh0X3J4X2Rlc2MgPSBkYi0+Zmlyc3RfcnhfZGVzYzsKKworCS8qIHByZS1hbGxvY2F0ZSBSeCBidWZmZXIgKi8KKwlhbGxvY2F0ZV9yeF9idWZmZXIoZGIpOworfQorCisKKy8qCisgKglVcGRhdGUgQ1I2IHZhbHVlCisgKglGaXJzdGx5IHN0b3AgRE05MTBYICwgdGhlbiB3cml0dGVuIHZhbHVlIGFuZCBzdGFydAorICovCisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9jcjYodTMyIGNyNl9kYXRhLCB1bnNpZ25lZCBsb25nIGlvYWRkcikKK3sKKwl1MzIgY3I2X3RtcDsKKworCWNyNl90bXAgPSBjcjZfZGF0YSAmIH4weDIwMDI7ICAgICAgICAgICAvKiBzdG9wIFR4L1J4ICovCisJb3V0bChjcjZfdG1wLCBpb2FkZHIgKyBEQ1I2KTsKKwl1ZGVsYXkoNSk7CisJb3V0bChjcjZfZGF0YSwgaW9hZGRyICsgRENSNik7CisJdWRlbGF5KDUpOworfQorCisKKy8qCisgKglTZW5kIGEgc2V0dXAgZnJhbWUgZm9yIERNOTEzMgorICoJVGhpcyBzZXR1cCBmcmFtZSBpbml0aWxpemUgRE05MTBYIGFkZHJlc3MgZmlsdGVyIG1vZGUKKyovCisKK3N0YXRpYyB2b2lkIGRtOTEzMl9pZF90YWJsZShzdHJ1Y3QgREVWSUNFICpkZXYsIGludCBtY19jbnQpCit7CisJc3RydWN0IGRldl9tY19saXN0ICptY3B0cjsKKwl1MTYgKiBhZGRycHRyOworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHIrMHhjMDsJCS8qIElEIFRhYmxlICovCisJdTMyIGhhc2hfdmFsOworCXUxNiBpLCBoYXNoX3RhYmxlWzRdOworCisJRE1GRV9EQlVHKDAsICJkbTkxMzJfaWRfdGFibGUoKSIsIDApOworCisJLyogTm9kZSBhZGRyZXNzICovCisJYWRkcnB0ciA9ICh1MTYgKikgZGV2LT5kZXZfYWRkcjsKKwlvdXR3KGFkZHJwdHJbMF0sIGlvYWRkcik7CisJaW9hZGRyICs9IDQ7CisJb3V0dyhhZGRycHRyWzFdLCBpb2FkZHIpOworCWlvYWRkciArPSA0OworCW91dHcoYWRkcnB0clsyXSwgaW9hZGRyKTsKKwlpb2FkZHIgKz0gNDsKKworCS8qIENsZWFyIEhhc2ggVGFibGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQloYXNoX3RhYmxlW2ldID0gMHgwOworCisJLyogYnJvYWRjYXN0IGFkZHJlc3MgKi8KKwloYXNoX3RhYmxlWzNdID0gMHg4MDAwOworCisJLyogdGhlIG11bHRpY2FzdCBhZGRyZXNzIGluIEhhc2ggVGFibGUgOiA2NCBiaXRzICovCisJZm9yIChtY3B0ciA9IGRldi0+bWNfbGlzdCwgaSA9IDA7IGkgPCBtY19jbnQ7IGkrKywgbWNwdHIgPSBtY3B0ci0+bmV4dCkgeworCQloYXNoX3ZhbCA9IGNhbF9DUkMoIChjaGFyICopIG1jcHRyLT5kbWlfYWRkciwgNiwgMCkgJiAweDNmOworCQloYXNoX3RhYmxlW2hhc2hfdmFsIC8gMTZdIHw9ICh1MTYpIDEgPDwgKGhhc2hfdmFsICUgMTYpOworCX0KKworCS8qIFdyaXRlIHRoZSBoYXNoIHRhYmxlIHRvIE1BQyBNRCB0YWJsZSAqLworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGlvYWRkciArPSA0KQorCQlvdXR3KGhhc2hfdGFibGVbaV0sIGlvYWRkcik7Cit9CisKKworLyoKKyAqCVNlbmQgYSBzZXR1cCBmcmFtZSBmb3IgRE05MTAyL0RNOTEwMkEKKyAqCVRoaXMgc2V0dXAgZnJhbWUgaW5pdGlsaXplIERNOTEwWCBhZGRyZXNzIGZpbHRlciBtb2RlCisgKi8KKworc3RhdGljIHZvaWQgc2VuZF9maWx0ZXJfZnJhbWUoc3RydWN0IERFVklDRSAqZGV2LCBpbnQgbWNfY250KQoreworCXN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKmRiID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jcHRyOworCXN0cnVjdCB0eF9kZXNjICp0eHB0cjsKKwl1MTYgKiBhZGRycHRyOworCXUzMiAqIHN1cHRyOworCWludCBpOworCisJRE1GRV9EQlVHKDAsICJzZW5kX2ZpbHRlcl9mcmFtZSgpIiwgMCk7CisKKwl0eHB0ciA9IGRiLT50eF9pbnNlcnRfcHRyOworCXN1cHRyID0gKHUzMiAqKSB0eHB0ci0+dHhfYnVmX3B0cjsKKworCS8qIE5vZGUgYWRkcmVzcyAqLworCWFkZHJwdHIgPSAodTE2ICopIGRldi0+ZGV2X2FkZHI7CisJKnN1cHRyKysgPSBhZGRycHRyWzBdOworCSpzdXB0cisrID0gYWRkcnB0clsxXTsKKwkqc3VwdHIrKyA9IGFkZHJwdHJbMl07CisKKwkvKiBicm9hZGNhc3QgYWRkcmVzcyAqLworCSpzdXB0cisrID0gMHhmZmZmOworCSpzdXB0cisrID0gMHhmZmZmOworCSpzdXB0cisrID0gMHhmZmZmOworCisJLyogZml0IHRoZSBtdWx0aWNhc3QgYWRkcmVzcyAqLworCWZvciAobWNwdHIgPSBkZXYtPm1jX2xpc3QsIGkgPSAwOyBpIDwgbWNfY250OyBpKyssIG1jcHRyID0gbWNwdHItPm5leHQpIHsKKwkJYWRkcnB0ciA9ICh1MTYgKikgbWNwdHItPmRtaV9hZGRyOworCQkqc3VwdHIrKyA9IGFkZHJwdHJbMF07CisJCSpzdXB0cisrID0gYWRkcnB0clsxXTsKKwkJKnN1cHRyKysgPSBhZGRycHRyWzJdOworCX0KKworCWZvciAoOyBpPDE0OyBpKyspIHsKKwkJKnN1cHRyKysgPSAweGZmZmY7CisJCSpzdXB0cisrID0gMHhmZmZmOworCQkqc3VwdHIrKyA9IDB4ZmZmZjsKKwl9CisKKwkvKiBwcmVwYXJlIHRoZSBzZXR1cCBmcmFtZSAqLworCWRiLT50eF9pbnNlcnRfcHRyID0gdHhwdHItPm5leHRfdHhfZGVzYzsKKwl0eHB0ci0+dGRlczEgPSBjcHVfdG9fbGUzMigweDg5MDAwMGMwKTsKKworCS8qIFJlc291cmNlIENoZWNrIGFuZCBTZW5kIHRoZSBzZXR1cCBwYWNrZXQgKi8KKwlpZiAoIWRiLT50eF9wYWNrZXRfY250KSB7CisJCS8qIFJlc291cmNlIEVtcHR5ICovCisJCWRiLT50eF9wYWNrZXRfY250Kys7CisJCXR4cHRyLT50ZGVzMCA9IGNwdV90b19sZTMyKDB4ODAwMDAwMDApOworCQl1cGRhdGVfY3I2KGRiLT5jcjZfZGF0YSB8IDB4MjAwMCwgZGV2LT5iYXNlX2FkZHIpOworCQlvdXRsKDB4MSwgZGV2LT5iYXNlX2FkZHIgKyBEQ1IxKTsJLyogSXNzdWUgVHggcG9sbGluZyAqLworCQl1cGRhdGVfY3I2KGRiLT5jcjZfZGF0YSwgZGV2LT5iYXNlX2FkZHIpOworCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwl9IGVsc2UKKwkJZGItPnR4X3F1ZXVlX2NudCsrOwkvKiBQdXQgaW4gVFggcXVldWUgKi8KK30KKworCisvKgorICoJQWxsb2NhdGUgcnggYnVmZmVyLAorICoJQXMgcG9zc2libGUgYXMgYWxsb2NhdGUgbWF4aXVtbiBSeCBidWZmZXIKKyAqLworCitzdGF0aWMgdm9pZCBhbGxvY2F0ZV9yeF9idWZmZXIoc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqZGIpCit7CisJc3RydWN0IHJ4X2Rlc2MgKnJ4cHRyOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlyeHB0ciA9IGRiLT5yeF9pbnNlcnRfcHRyOworCisJd2hpbGUoZGItPnJ4X2F2YWlsX2NudCA8IFJYX0RFU0NfQ05UKSB7CisJCWlmICggKCBza2IgPSBkZXZfYWxsb2Nfc2tiKFJYX0FMTE9DX1NJWkUpICkgPT0gTlVMTCApCisJCQlicmVhazsKKwkJcnhwdHItPnJ4X3NrYl9wdHIgPSBza2I7IC8qIEZJWE1FICg/KSAqLworCQlyeHB0ci0+cmRlczIgPSBjcHVfdG9fbGUzMiggcGNpX21hcF9zaW5nbGUoZGItPnBkZXYsIHNrYi0+dGFpbCwgUlhfQUxMT0NfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKSApOworCQl3bWIoKTsKKwkJcnhwdHItPnJkZXMwID0gY3B1X3RvX2xlMzIoMHg4MDAwMDAwMCk7CisJCXJ4cHRyID0gcnhwdHItPm5leHRfcnhfZGVzYzsKKwkJZGItPnJ4X2F2YWlsX2NudCsrOworCX0KKworCWRiLT5yeF9pbnNlcnRfcHRyID0gcnhwdHI7Cit9CisKKworLyoKKyAqCVJlYWQgb25lIHdvcmQgZGF0YSBmcm9tIHRoZSBzZXJpYWwgUk9NCisgKi8KKworc3RhdGljIHUxNiByZWFkX3Nyb21fd29yZChsb25nIGlvYWRkciwgaW50IG9mZnNldCkKK3sKKwlpbnQgaTsKKwl1MTYgc3JvbV9kYXRhID0gMDsKKwlsb25nIGNyOV9pb2FkZHIgPSBpb2FkZHIgKyBEQ1I5OworCisJb3V0bChDUjlfU1JPTV9SRUFELCBjcjlfaW9hZGRyKTsKKwlvdXRsKENSOV9TUk9NX1JFQUQgfCBDUjlfU1JDUywgY3I5X2lvYWRkcik7CisKKwkvKiBTZW5kIHRoZSBSZWFkIENvbW1hbmQgMTEwYiAqLworCVNST01fQ0xLX1dSSVRFKFNST01fREFUQV8xLCBjcjlfaW9hZGRyKTsKKwlTUk9NX0NMS19XUklURShTUk9NX0RBVEFfMSwgY3I5X2lvYWRkcik7CisJU1JPTV9DTEtfV1JJVEUoU1JPTV9EQVRBXzAsIGNyOV9pb2FkZHIpOworCisJLyogU2VuZCB0aGUgb2Zmc2V0ICovCisJZm9yIChpID0gNTsgaSA+PSAwOyBpLS0pIHsKKwkJc3JvbV9kYXRhID0gKG9mZnNldCAmICgxIDw8IGkpKSA/IFNST01fREFUQV8xIDogU1JPTV9EQVRBXzA7CisJCVNST01fQ0xLX1dSSVRFKHNyb21fZGF0YSwgY3I5X2lvYWRkcik7CisJfQorCisJb3V0bChDUjlfU1JPTV9SRUFEIHwgQ1I5X1NSQ1MsIGNyOV9pb2FkZHIpOworCisJZm9yIChpID0gMTY7IGkgPiAwOyBpLS0pIHsKKwkJb3V0bChDUjlfU1JPTV9SRUFEIHwgQ1I5X1NSQ1MgfCBDUjlfU1JDTEssIGNyOV9pb2FkZHIpOworCQl1ZGVsYXkoNSk7CisJCXNyb21fZGF0YSA9IChzcm9tX2RhdGEgPDwgMSkgfCAoKGlubChjcjlfaW9hZGRyKSAmIENSOV9DUkRPVVQpID8gMSA6IDApOworCQlvdXRsKENSOV9TUk9NX1JFQUQgfCBDUjlfU1JDUywgY3I5X2lvYWRkcik7CisJCXVkZWxheSg1KTsKKwl9CisKKwlvdXRsKENSOV9TUk9NX1JFQUQsIGNyOV9pb2FkZHIpOworCXJldHVybiBzcm9tX2RhdGE7Cit9CisKKworLyoKKyAqCUF1dG8gc2Vuc2UgdGhlIG1lZGlhIG1vZGUKKyAqLworCitzdGF0aWMgdTggZG1mZV9zZW5zZV9zcGVlZChzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICogZGIpCit7CisJdTggRXJyRmxhZyA9IDA7CisJdTE2IHBoeV9tb2RlOworCisJLyogQ1I2IGJpdDE4PTAsIHNlbGVjdCAxMC8xMDBNICovCisJdXBkYXRlX2NyNiggKGRiLT5jcjZfZGF0YSAmIH4weDQwMDAwKSwgZGItPmlvYWRkcik7CisKKwlwaHlfbW9kZSA9IHBoeV9yZWFkKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgMSwgZGItPmNoaXBfaWQpOworCXBoeV9tb2RlID0gcGh5X3JlYWQoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAxLCBkYi0+Y2hpcF9pZCk7CisKKwlpZiAoIChwaHlfbW9kZSAmIDB4MjQpID09IDB4MjQgKSB7CisJCWlmIChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MTMyX0lEKQkvKiBETTkxMzIgKi8KKwkJCXBoeV9tb2RlID0gcGh5X3JlYWQoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCA3LCBkYi0+Y2hpcF9pZCkgJiAweGYwMDA7CisJCWVsc2UgCQkJCS8qIERNOTEwMi9ETTkxMDJBICovCisJCQlwaHlfbW9kZSA9IHBoeV9yZWFkKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgMTcsIGRiLT5jaGlwX2lkKSAmIDB4ZjAwMDsKKwkJLyogcHJpbnRrKERSVl9OQU1FICI6IFBoeV9tb2RlICV4ICIscGh5X21vZGUpOyAqLworCQlzd2l0Y2ggKHBoeV9tb2RlKSB7CisJCWNhc2UgMHgxMDAwOiBkYi0+b3BfbW9kZSA9IERNRkVfMTBNSEY7IGJyZWFrOworCQljYXNlIDB4MjAwMDogZGItPm9wX21vZGUgPSBETUZFXzEwTUZEOyBicmVhazsKKwkJY2FzZSAweDQwMDA6IGRiLT5vcF9tb2RlID0gRE1GRV8xMDBNSEY7IGJyZWFrOworCQljYXNlIDB4ODAwMDogZGItPm9wX21vZGUgPSBETUZFXzEwME1GRDsgYnJlYWs7CisJCWRlZmF1bHQ6IGRiLT5vcF9tb2RlID0gRE1GRV8xME1IRjsKKwkJCUVyckZsYWcgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlkYi0+b3BfbW9kZSA9IERNRkVfMTBNSEY7CisJCURNRkVfREJVRygwLCAiTGluayBGYWlsZWQgOiIsIHBoeV9tb2RlKTsKKwkJRXJyRmxhZyA9IDE7CisJfQorCisJcmV0dXJuIEVyckZsYWc7Cit9CisKKworLyoKKyAqCVNldCAxMC8xMDAgcGh5eGNlciBjYXBhYmlsaXR5CisgKglBVVRPIG1vZGUgOiBwaHl4Y2VyIHJlZ2lzdGVyNCBpcyBOSUMgY2FwYWJpbGl0eQorICoJRm9yY2UgbW9kZTogcGh5eGNlciByZWdpc3RlcjQgaXMgdGhlIGZvcmNlIG1lZGlhCisgKi8KKworc3RhdGljIHZvaWQgZG1mZV9zZXRfcGh5eGNlcihzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICpkYikKK3sKKwl1MTYgcGh5X3JlZzsKKworCS8qIFNlbGVjdCAxMC8xMDBNIHBoeXhjZXIgKi8KKwlkYi0+Y3I2X2RhdGEgJj0gfjB4NDAwMDA7CisJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGRiLT5pb2FkZHIpOworCisJLyogRE05MDA5IENoaXA6IFBoeXhjZXIgcmVnMTggYml0MTI9MCAqLworCWlmIChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MDA5X0lEKSB7CisJCXBoeV9yZWcgPSBwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDE4LCBkYi0+Y2hpcF9pZCkgJiB+MHgxMDAwOworCQlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAxOCwgcGh5X3JlZywgZGItPmNoaXBfaWQpOworCX0KKworCS8qIFBoeXhjZXIgY2FwYWJpbGl0eSBzZXR0aW5nICovCisJcGh5X3JlZyA9IHBoeV9yZWFkKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgNCwgZGItPmNoaXBfaWQpICYgfjB4MDFlMDsKKworCWlmIChkYi0+bWVkaWFfbW9kZSAmIERNRkVfQVVUTykgeworCQkvKiBBVVRPIE1vZGUgKi8KKwkJcGh5X3JlZyB8PSBkYi0+UEhZX3JlZzQ7CisJfSBlbHNlIHsKKwkJLyogRm9yY2UgTW9kZSAqLworCQlzd2l0Y2goZGItPm1lZGlhX21vZGUpIHsKKwkJY2FzZSBETUZFXzEwTUhGOiBwaHlfcmVnIHw9IDB4MjA7IGJyZWFrOworCQljYXNlIERNRkVfMTBNRkQ6IHBoeV9yZWcgfD0gMHg0MDsgYnJlYWs7CisJCWNhc2UgRE1GRV8xMDBNSEY6IHBoeV9yZWcgfD0gMHg4MDsgYnJlYWs7CisJCWNhc2UgRE1GRV8xMDBNRkQ6IHBoeV9yZWcgfD0gMHgxMDA7IGJyZWFrOworCQl9CisJCWlmIChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MDA5X0lEKSBwaHlfcmVnICY9IDB4NjE7CisJfQorCisgIAkvKiBXcml0ZSBuZXcgY2FwYWJpbGl0eSB0byBQaHl4Y2VyIFJlZzQgKi8KKwlpZiAoICEocGh5X3JlZyAmIDB4MDFlMCkpIHsKKwkJcGh5X3JlZ3w9ZGItPlBIWV9yZWc0OworCQlkYi0+bWVkaWFfbW9kZXw9RE1GRV9BVVRPOworCX0KKwlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCA0LCBwaHlfcmVnLCBkYi0+Y2hpcF9pZCk7CisKKyAJLyogUmVzdGFydCBBdXRvLU5lZ290aWF0aW9uICovCisJaWYgKCBkYi0+Y2hpcF90eXBlICYmIChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MTAyX0lEKSApCisJCXBoeV93cml0ZShkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDAsIDB4MTgwMCwgZGItPmNoaXBfaWQpOworCWlmICggIWRiLT5jaGlwX3R5cGUgKQorCQlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAwLCAweDEyMDAsIGRiLT5jaGlwX2lkKTsKK30KKworCisvKgorICoJUHJvY2VzcyBvcC1tb2RlCisgKglBVVRPIG1vZGUgOiBQSFkgY29udHJvbGxlciBpbiBBdXRvLW5lZ290aWF0aW9uIE1vZGUKKyAqCUZvcmNlIG1vZGU6IFBIWSBjb250cm9sbGVyIGluIGZvcmNlIG1vZGUgd2l0aCBIVUIKKyAqCQkJTi13YXkgZm9yY2UgY2FwYWJpbGl0eSB3aXRoIFNXSVRDSAorICovCisKK3N0YXRpYyB2b2lkIGRtZmVfcHJvY2Vzc19tb2RlKHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKmRiKQoreworCXUxNiBwaHlfcmVnOworCisJLyogRnVsbCBEdXBsZXggTW9kZSBDaGVjayAqLworCWlmIChkYi0+b3BfbW9kZSAmIDB4NCkKKwkJZGItPmNyNl9kYXRhIHw9IENSNl9GRE07CS8qIFNldCBGdWxsIER1cGxleCBCaXQgKi8KKwllbHNlCisJCWRiLT5jcjZfZGF0YSAmPSB+Q1I2X0ZETTsJLyogQ2xlYXIgRnVsbCBEdXBsZXggQml0ICovCisKKwkvKiBUcmFuc2NpdmVyIFNlbGVjdGlvbiAqLworCWlmIChkYi0+b3BfbW9kZSAmIDB4MTApCQkvKiAxTSBIb21lUE5BICovCisJCWRiLT5jcjZfZGF0YSB8PSAweDQwMDAwOy8qIEV4dGVybmFsIE1JSSBzZWxlY3QgKi8KKwllbHNlCisJCWRiLT5jcjZfZGF0YSAmPSB+MHg0MDAwMDsvKiBJbnRlcm5hbCAxMC8xMDAgdHJhbnNjaXZlciAqLworCisJdXBkYXRlX2NyNihkYi0+Y3I2X2RhdGEsIGRiLT5pb2FkZHIpOworCisJLyogMTAvMTAwTSBwaHl4Y2VyIGZvcmNlIG1vZGUgbmVlZCAqLworCWlmICggIShkYi0+bWVkaWFfbW9kZSAmIDB4MTgpKSB7CisJCS8qIEZvcmVjZSBNb2RlICovCisJCXBoeV9yZWcgPSBwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDYsIGRiLT5jaGlwX2lkKTsKKwkJaWYgKCAhKHBoeV9yZWcgJiAweDEpICkgeworCQkJLyogcGFydGVyIHdpdGhvdXQgTi1XYXkgY2FwYWJpbGl0eSAqLworCQkJcGh5X3JlZyA9IDB4MDsKKwkJCXN3aXRjaChkYi0+b3BfbW9kZSkgeworCQkJY2FzZSBETUZFXzEwTUhGOiBwaHlfcmVnID0gMHgwOyBicmVhazsKKwkJCWNhc2UgRE1GRV8xME1GRDogcGh5X3JlZyA9IDB4MTAwOyBicmVhazsKKwkJCWNhc2UgRE1GRV8xMDBNSEY6IHBoeV9yZWcgPSAweDIwMDA7IGJyZWFrOworCQkJY2FzZSBETUZFXzEwME1GRDogcGh5X3JlZyA9IDB4MjEwMDsgYnJlYWs7CisJCQl9CisJCQlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAwLCBwaHlfcmVnLCBkYi0+Y2hpcF9pZCk7CisgICAgICAgCQkJaWYgKCBkYi0+Y2hpcF90eXBlICYmIChkYi0+Y2hpcF9pZCA9PSBQQ0lfRE05MTAyX0lEKSApCisJCQkJbWRlbGF5KDIwKTsKKwkJCXBoeV93cml0ZShkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDAsIHBoeV9yZWcsIGRiLT5jaGlwX2lkKTsKKwkJfQorCX0KK30KKworCisvKgorICoJV3JpdGUgYSB3b3JkIHRvIFBoeSByZWdpc3RlcgorICovCisKK3N0YXRpYyB2b2lkIHBoeV93cml0ZSh1bnNpZ25lZCBsb25nIGlvYmFzZSwgdTggcGh5X2FkZHIsIHU4IG9mZnNldCwgdTE2IHBoeV9kYXRhLCB1MzIgY2hpcF9pZCkKK3sKKwl1MTYgaTsKKwl1bnNpZ25lZCBsb25nIGlvYWRkcjsKKworCWlmIChjaGlwX2lkID09IFBDSV9ETTkxMzJfSUQpIHsKKwkJaW9hZGRyID0gaW9iYXNlICsgMHg4MCArIG9mZnNldCAqIDQ7CisJCW91dHcocGh5X2RhdGEsIGlvYWRkcik7CisJfSBlbHNlIHsKKwkJLyogRE05MTAyL0RNOTEwMkEgQ2hpcCAqLworCQlpb2FkZHIgPSBpb2Jhc2UgKyBEQ1I5OworCisJCS8qIFNlbmQgMzMgc3luY2hyb25pemF0aW9uIGNsb2NrIHRvIFBoeSBjb250cm9sbGVyICovCisJCWZvciAoaSA9IDA7IGkgPCAzNTsgaSsrKQorCQkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBQSFlfREFUQV8xKTsKKworCQkvKiBTZW5kIHN0YXJ0IGNvbW1hbmQoMDEpIHRvIFBoeSAqLworCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIFBIWV9EQVRBXzApOworCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIFBIWV9EQVRBXzEpOworCisJCS8qIFNlbmQgd3JpdGUgY29tbWFuZCgwMSkgdG8gUGh5ICovCisJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgUEhZX0RBVEFfMCk7CisJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgUEhZX0RBVEFfMSk7CisKKwkJLyogU2VuZCBQaHkgYWRkcmVzcyAqLworCQlmb3IgKGkgPSAweDEwOyBpID4gMDsgaSA9IGkgPj4gMSkKKwkJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgcGh5X2FkZHIgJiBpID8gUEhZX0RBVEFfMSA6IFBIWV9EQVRBXzApOworCisJCS8qIFNlbmQgcmVnaXN0ZXIgYWRkcmVzcyAqLworCQlmb3IgKGkgPSAweDEwOyBpID4gMDsgaSA9IGkgPj4gMSkKKwkJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgb2Zmc2V0ICYgaSA/IFBIWV9EQVRBXzEgOiBQSFlfREFUQV8wKTsKKworCQkvKiB3cml0dGVuIHRyYXNuaXRpb24gKi8KKwkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBQSFlfREFUQV8xKTsKKwkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBQSFlfREFUQV8wKTsKKworCQkvKiBXcml0ZSBhIHdvcmQgZGF0YSB0byBQSFkgY29udHJvbGxlciAqLworCQlmb3IgKCBpID0gMHg4MDAwOyBpID4gMDsgaSA+Pj0gMSkKKwkJCXBoeV93cml0ZV8xYml0KGlvYWRkciwgcGh5X2RhdGEgJiBpID8gUEhZX0RBVEFfMSA6IFBIWV9EQVRBXzApOworCX0KK30KKworCisvKgorICoJUmVhZCBhIHdvcmQgZGF0YSBmcm9tIHBoeSByZWdpc3RlcgorICovCisKK3N0YXRpYyB1MTYgcGh5X3JlYWQodW5zaWduZWQgbG9uZyBpb2Jhc2UsIHU4IHBoeV9hZGRyLCB1OCBvZmZzZXQsIHUzMiBjaGlwX2lkKQoreworCWludCBpOworCXUxNiBwaHlfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGlvYWRkcjsKKworCWlmIChjaGlwX2lkID09IFBDSV9ETTkxMzJfSUQpIHsKKwkJLyogRE05MTMyIENoaXAgKi8KKwkJaW9hZGRyID0gaW9iYXNlICsgMHg4MCArIG9mZnNldCAqIDQ7CisJCXBoeV9kYXRhID0gaW53KGlvYWRkcik7CisJfSBlbHNlIHsKKwkJLyogRE05MTAyL0RNOTEwMkEgQ2hpcCAqLworCQlpb2FkZHIgPSBpb2Jhc2UgKyBEQ1I5OworCisJCS8qIFNlbmQgMzMgc3luY2hyb25pemF0aW9uIGNsb2NrIHRvIFBoeSBjb250cm9sbGVyICovCisJCWZvciAoaSA9IDA7IGkgPCAzNTsgaSsrKQorCQkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBQSFlfREFUQV8xKTsKKworCQkvKiBTZW5kIHN0YXJ0IGNvbW1hbmQoMDEpIHRvIFBoeSAqLworCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIFBIWV9EQVRBXzApOworCQlwaHlfd3JpdGVfMWJpdChpb2FkZHIsIFBIWV9EQVRBXzEpOworCisJCS8qIFNlbmQgcmVhZCBjb21tYW5kKDEwKSB0byBQaHkgKi8KKwkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBQSFlfREFUQV8xKTsKKwkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBQSFlfREFUQV8wKTsKKworCQkvKiBTZW5kIFBoeSBhZGRyZXNzICovCisJCWZvciAoaSA9IDB4MTA7IGkgPiAwOyBpID0gaSA+PiAxKQorCQkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBwaHlfYWRkciAmIGkgPyBQSFlfREFUQV8xIDogUEhZX0RBVEFfMCk7CisKKwkJLyogU2VuZCByZWdpc3RlciBhZGRyZXNzICovCisJCWZvciAoaSA9IDB4MTA7IGkgPiAwOyBpID0gaSA+PiAxKQorCQkJcGh5X3dyaXRlXzFiaXQoaW9hZGRyLCBvZmZzZXQgJiBpID8gUEhZX0RBVEFfMSA6IFBIWV9EQVRBXzApOworCisJCS8qIFNraXAgdHJhbnNpdGlvbiBzdGF0ZSAqLworCQlwaHlfcmVhZF8xYml0KGlvYWRkcik7CisKKwkJLyogcmVhZCAxNmJpdCBkYXRhICovCisJCWZvciAocGh5X2RhdGEgPSAwLCBpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCXBoeV9kYXRhIDw8PSAxOworCQkJcGh5X2RhdGEgfD0gcGh5X3JlYWRfMWJpdChpb2FkZHIpOworCQl9CisJfQorCisJcmV0dXJuIHBoeV9kYXRhOworfQorCisKKy8qCisgKglXcml0ZSBvbmUgYml0IGRhdGEgdG8gUGh5IENvbnRyb2xsZXIKKyAqLworCitzdGF0aWMgdm9pZCBwaHlfd3JpdGVfMWJpdCh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTMyIHBoeV9kYXRhKQoreworCW91dGwocGh5X2RhdGEsIGlvYWRkcik7CQkJLyogTUlJIENsb2NrIExvdyAqLworCXVkZWxheSgxKTsKKwlvdXRsKHBoeV9kYXRhIHwgTURDTEtILCBpb2FkZHIpOwkvKiBNSUkgQ2xvY2sgSGlnaCAqLworCXVkZWxheSgxKTsKKwlvdXRsKHBoeV9kYXRhLCBpb2FkZHIpOwkJCS8qIE1JSSBDbG9jayBMb3cgKi8KKwl1ZGVsYXkoMSk7Cit9CisKKworLyoKKyAqCVJlYWQgb25lIGJpdCBwaHkgZGF0YSBmcm9tIFBIWSBjb250cm9sbGVyCisgKi8KKworc3RhdGljIHUxNiBwaHlfcmVhZF8xYml0KHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCXUxNiBwaHlfZGF0YTsKKworCW91dGwoMHg1MDAwMCwgaW9hZGRyKTsKKwl1ZGVsYXkoMSk7CisJcGh5X2RhdGEgPSAoIGlubChpb2FkZHIpID4+IDE5ICkgJiAweDE7CisJb3V0bCgweDQwMDAwLCBpb2FkZHIpOworCXVkZWxheSgxKTsKKworCXJldHVybiBwaHlfZGF0YTsKK30KKworCisvKgorICoJUGFyc2VyIFNST00gYW5kIG1lZGlhIG1vZGUKKyAqLworCitzdGF0aWMgdm9pZCBkbWZlX3BhcnNlX3Nyb20oc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqIGRiKQoreworCWNoYXIgKiBzcm9tID0gZGItPnNyb207CisJaW50IGRtZmVfbW9kZSwgdG1wX3JlZzsKKworCURNRkVfREJVRygwLCAiZG1mZV9wYXJzZV9zcm9tKCkgIiwgMCk7CisKKwkvKiBJbml0IENSMTUgKi8KKwlkYi0+Y3IxNV9kYXRhID0gQ1IxNV9ERUZBVUxUOworCisJLyogQ2hlY2sgU1JPTSBWZXJzaW9uICovCisJaWYgKCAoIChpbnQpIHNyb21bMThdICYgMHhmZikgPT0gU1JPTV9WNDFfQ09ERSkgeworCQkvKiBTUk9NIFY0LjAxICovCisJCS8qIEdldCBOSUMgc3VwcG9ydCBtZWRpYSBtb2RlICovCisJCWRiLT5OSUNfY2FwYWJpbGl0eSA9IGxlMTZfdG9fY3B1cChzcm9tICsgMzQpOworCQlkYi0+UEhZX3JlZzQgPSAwOworCQlmb3IgKHRtcF9yZWcgPSAxOyB0bXBfcmVnIDwgMHgxMDsgdG1wX3JlZyA8PD0gMSkgeworCQkJc3dpdGNoKCBkYi0+TklDX2NhcGFiaWxpdHkgJiB0bXBfcmVnICkgeworCQkJY2FzZSAweDE6IGRiLT5QSFlfcmVnNCB8PSAweDAwMjA7IGJyZWFrOworCQkJY2FzZSAweDI6IGRiLT5QSFlfcmVnNCB8PSAweDAwNDA7IGJyZWFrOworCQkJY2FzZSAweDQ6IGRiLT5QSFlfcmVnNCB8PSAweDAwODA7IGJyZWFrOworCQkJY2FzZSAweDg6IGRiLT5QSFlfcmVnNCB8PSAweDAxMDA7IGJyZWFrOworCQkJfQorCQl9CisKKwkJLyogTWVkaWEgTW9kZSBGb3JjZSBvciBub3QgY2hlY2sgKi8KKwkJZG1mZV9tb2RlID0gbGUzMl90b19jcHVwKHNyb20gKyAzNCkgJiBsZTMyX3RvX2NwdXAoc3JvbSArIDM2KTsKKwkJc3dpdGNoKGRtZmVfbW9kZSkgeworCQljYXNlIDB4NDogZG1mZV9tZWRpYV9tb2RlID0gRE1GRV8xMDBNSEY7IGJyZWFrOwkvKiAxMDBNSEYgKi8KKwkJY2FzZSAweDI6IGRtZmVfbWVkaWFfbW9kZSA9IERNRkVfMTBNRkQ7IGJyZWFrOwkvKiAxME1GRCAqLworCQljYXNlIDB4ODogZG1mZV9tZWRpYV9tb2RlID0gRE1GRV8xMDBNRkQ7IGJyZWFrOwkvKiAxMDBNRkQgKi8KKwkJY2FzZSAweDEwMDoKKwkJY2FzZSAweDIwMDogZG1mZV9tZWRpYV9tb2RlID0gRE1GRV8xTV9IUE5BOyBicmVhazsvKiBIb21lUE5BICovCisJCX0KKworCQkvKiBTcGVjaWFsIEZ1bmN0aW9uIHNldHRpbmcgKi8KKwkJLyogVkxBTiBmdW5jdGlvbiAqLworCQlpZiAoIChTRl9tb2RlICYgMHgxKSB8fCAoc3JvbVs0M10gJiAweDgwKSApCisJCQlkYi0+Y3IxNV9kYXRhIHw9IDB4NDA7CisKKwkJLyogRmxvdyBDb250cm9sICovCisJCWlmICggKFNGX21vZGUgJiAweDIpIHx8IChzcm9tWzQwXSAmIDB4MSkgKQorCQkJZGItPmNyMTVfZGF0YSB8PSAweDQwMDsKKworCQkvKiBUWCBwYXVzZSBwYWNrZXQgKi8KKwkJaWYgKCAoU0ZfbW9kZSAmIDB4NCkgfHwgKHNyb21bNDBdICYgMHhlKSApCisJCQlkYi0+Y3IxNV9kYXRhIHw9IDB4OTgwMDsKKwl9CisKKwkvKiBQYXJzZSBIUE5BIHBhcmFtZXRlciAqLworCWRiLT5IUE5BX2NvbW1hbmQgPSAxOworCisJLyogQWNjZXB0IHJlbW90ZSBjb21tYW5kIG9yIG5vdCAqLworCWlmIChIUE5BX3J4X2NtZCA9PSAwKQorCQlkYi0+SFBOQV9jb21tYW5kIHw9IDB4ODAwMDsKKworCSAvKiBJc3N1ZSByZW1vdGUgY29tbWFuZCAmIG9wZXJhdGlvbiBtb2RlICovCisJaWYgKEhQTkFfdHhfY21kID09IDEpCisJCXN3aXRjaChIUE5BX21vZGUpIHsJLyogSXNzdWUgUmVtb3RlIENvbW1hbmQgKi8KKwkJY2FzZSAwOiBkYi0+SFBOQV9jb21tYW5kIHw9IDB4MDkwNDsgYnJlYWs7CisJCWNhc2UgMTogZGItPkhQTkFfY29tbWFuZCB8PSAweDBhMDA7IGJyZWFrOworCQljYXNlIDI6IGRiLT5IUE5BX2NvbW1hbmQgfD0gMHgwNTA2OyBicmVhazsKKwkJY2FzZSAzOiBkYi0+SFBOQV9jb21tYW5kIHw9IDB4MDYwMjsgYnJlYWs7CisJCX0KKwllbHNlCisJCXN3aXRjaChIUE5BX21vZGUpIHsJLyogRG9uJ3QgSXNzdWUgKi8KKwkJY2FzZSAwOiBkYi0+SFBOQV9jb21tYW5kIHw9IDB4MDAwNDsgYnJlYWs7CisJCWNhc2UgMTogZGItPkhQTkFfY29tbWFuZCB8PSAweDAwMDA7IGJyZWFrOworCQljYXNlIDI6IGRiLT5IUE5BX2NvbW1hbmQgfD0gMHgwMDA2OyBicmVhazsKKwkJY2FzZSAzOiBkYi0+SFBOQV9jb21tYW5kIHw9IDB4MDAwMjsgYnJlYWs7CisJCX0KKworCS8qIENoZWNrIERNOTgwMSBvciBETTk4MDIgcHJlc2VudCBvciBub3QgKi8KKwlkYi0+SFBOQV9wcmVzZW50ID0gMDsKKwl1cGRhdGVfY3I2KGRiLT5jcjZfZGF0YXwweDQwMDAwLCBkYi0+aW9hZGRyKTsKKwl0bXBfcmVnID0gcGh5X3JlYWQoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAzLCBkYi0+Y2hpcF9pZCk7CisJaWYgKCAoIHRtcF9yZWcgJiAweGZmZjAgKSA9PSAweGI5MDAgKSB7CisJCS8qIERNOTgwMSBvciBETTk4MDIgcHJlc2VudCAqLworCQlkYi0+SFBOQV90aW1lciA9IDg7CisJCWlmICggcGh5X3JlYWQoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAzMSwgZGItPmNoaXBfaWQpID09IDB4NDQwNCkgeworCQkJLyogRE05ODAxIEhvbWVSdW4gKi8KKwkJCWRiLT5IUE5BX3ByZXNlbnQgPSAxOworCQkJZG1mZV9wcm9ncmFtX0RNOTgwMShkYiwgdG1wX3JlZyk7CisJCX0gZWxzZSB7CisJCQkvKiBETTk4MDIgTG9uZ1J1biAqLworCQkJZGItPkhQTkFfcHJlc2VudCA9IDI7CisJCQlkbWZlX3Byb2dyYW1fRE05ODAyKGRiKTsKKwkJfQorCX0KKworfQorCisKKy8qCisgKglJbml0IEhvbWVSdW4gRE05ODAxCisgKi8KKworc3RhdGljIHZvaWQgZG1mZV9wcm9ncmFtX0RNOTgwMShzdHJ1Y3QgZG1mZV9ib2FyZF9pbmZvICogZGIsIGludCBIUE5BX3JldikKK3sKKwl1aW50IHJlZzE3LCByZWcyNTsKKworCWlmICggIUhQTkFfTm9pc2VGbG9vciApIEhQTkFfTm9pc2VGbG9vciA9IERNOTgwMV9OT0lTRV9GTE9PUjsKKwlzd2l0Y2goSFBOQV9yZXYpIHsKKwljYXNlIDB4YjkwMDogLyogRE05ODAxIEUzICovCisJCWRiLT5IUE5BX2NvbW1hbmQgfD0gMHgxMDAwOworCQlyZWcyNSA9IHBoeV9yZWFkKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgMjQsIGRiLT5jaGlwX2lkKTsKKwkJcmVnMjUgPSAoIChyZWcyNSArIEhQTkFfTm9pc2VGbG9vcikgJiAweGZmKSB8IDB4ZjAwMDsKKwkJcmVnMTcgPSBwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDE3LCBkYi0+Y2hpcF9pZCk7CisJCWJyZWFrOworCWNhc2UgMHhiOTAxOiAvKiBETTk4MDEgRTQgKi8KKwkJcmVnMjUgPSBwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDI1LCBkYi0+Y2hpcF9pZCk7CisJCXJlZzI1ID0gKHJlZzI1ICYgMHhmZjAwKSArIEhQTkFfTm9pc2VGbG9vcjsKKwkJcmVnMTcgPSBwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDE3LCBkYi0+Y2hpcF9pZCk7CisJCXJlZzE3ID0gKHJlZzE3ICYgMHhmZmYwKSArIEhQTkFfTm9pc2VGbG9vciArIDM7CisJCWJyZWFrOworCWNhc2UgMHhiOTAyOiAvKiBETTk4MDEgRTUgKi8KKwljYXNlIDB4YjkwMzogLyogRE05ODAxIEU2ICovCisJZGVmYXVsdDoKKwkJZGItPkhQTkFfY29tbWFuZCB8PSAweDEwMDA7CisJCXJlZzI1ID0gcGh5X3JlYWQoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAyNSwgZGItPmNoaXBfaWQpOworCQlyZWcyNSA9IChyZWcyNSAmIDB4ZmYwMCkgKyBIUE5BX05vaXNlRmxvb3IgLSA1OworCQlyZWcxNyA9IHBoeV9yZWFkKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgMTcsIGRiLT5jaGlwX2lkKTsKKwkJcmVnMTcgPSAocmVnMTcgJiAweGZmZjApICsgSFBOQV9Ob2lzZUZsb29yOworCQlicmVhazsKKwl9CisJcGh5X3dyaXRlKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgMTYsIGRiLT5IUE5BX2NvbW1hbmQsIGRiLT5jaGlwX2lkKTsKKwlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAxNywgcmVnMTcsIGRiLT5jaGlwX2lkKTsKKwlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAyNSwgcmVnMjUsIGRiLT5jaGlwX2lkKTsKK30KKworCisvKgorICoJSW5pdCBIb21lUnVuIERNOTgwMgorICovCisKK3N0YXRpYyB2b2lkIGRtZmVfcHJvZ3JhbV9ETTk4MDIoc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqIGRiKQoreworCXVpbnQgcGh5X3JlZzsKKworCWlmICggIUhQTkFfTm9pc2VGbG9vciApIEhQTkFfTm9pc2VGbG9vciA9IERNOTgwMl9OT0lTRV9GTE9PUjsKKwlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAxNiwgZGItPkhQTkFfY29tbWFuZCwgZGItPmNoaXBfaWQpOworCXBoeV9yZWcgPSBwaHlfcmVhZChkYi0+aW9hZGRyLCBkYi0+cGh5X2FkZHIsIDI1LCBkYi0+Y2hpcF9pZCk7CisJcGh5X3JlZyA9ICggcGh5X3JlZyAmIDB4ZmYwMCkgKyBIUE5BX05vaXNlRmxvb3I7CisJcGh5X3dyaXRlKGRiLT5pb2FkZHIsIGRiLT5waHlfYWRkciwgMjUsIHBoeV9yZWcsIGRiLT5jaGlwX2lkKTsKK30KKworCisvKgorICoJQ2hlY2sgcmVtb3RlIEhQTkEgcG93ZXIgYW5kIHNwZWVkIHN0YXR1cy4gSWYgbm90IGNvcnJlY3QsCisgKglpc3N1ZSBjb21tYW5kIGFnYWluLgorKi8KKworc3RhdGljIHZvaWQgZG1mZV9IUE5BX3JlbW90ZV9jbWRfY2hrKHN0cnVjdCBkbWZlX2JvYXJkX2luZm8gKiBkYikKK3sKKwl1aW50IHBoeV9yZWc7CisKKwkvKiBHb3QgcmVtb3RlIGRldmljZSBzdGF0dXMgKi8KKwlwaHlfcmVnID0gcGh5X3JlYWQoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAxNywgZGItPmNoaXBfaWQpICYgMHg2MDsKKwlzd2l0Y2gocGh5X3JlZykgeworCWNhc2UgMHgwMDogcGh5X3JlZyA9IDB4MGEwMDticmVhazsgLyogTFAvTFMgKi8KKwljYXNlIDB4MjA6IHBoeV9yZWcgPSAweDA5MDA7YnJlYWs7IC8qIExQL0hTICovCisJY2FzZSAweDQwOiBwaHlfcmVnID0gMHgwNjAwO2JyZWFrOyAvKiBIUC9MUyAqLworCWNhc2UgMHg2MDogcGh5X3JlZyA9IDB4MDUwMDticmVhazsgLyogSFAvSFMgKi8KKwl9CisKKwkvKiBDaGVjayByZW1vdGUgZGV2aWNlIHN0YXR1cyBtYXRjaCBvdXIgc2V0dGluZyBvdCBub3QgKi8KKwlpZiAoIHBoeV9yZWcgIT0gKGRiLT5IUE5BX2NvbW1hbmQgJiAweDBmMDApICkgeworCQlwaHlfd3JpdGUoZGItPmlvYWRkciwgZGItPnBoeV9hZGRyLCAxNiwgZGItPkhQTkFfY29tbWFuZCwgZGItPmNoaXBfaWQpOworCQlkYi0+SFBOQV90aW1lcj04OworCX0gZWxzZQorCQlkYi0+SFBOQV90aW1lcj02MDA7CS8qIE1hdGNoLCBldmVyeSAxMCBtaW51dGVzLCBjaGVjayAqLworfQorCisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGRtZmVfcGNpX3RibFtdID0geworCXsgMHgxMjgyLCAweDkxMzIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFBDSV9ETTkxMzJfSUQgfSwKKwl7IDB4MTI4MiwgMHg5MTAyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBQQ0lfRE05MTAyX0lEIH0sCisJeyAweDEyODIsIDB4OTEwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgUENJX0RNOTEwMF9JRCB9LAorCXsgMHgxMjgyLCAweDkwMDksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFBDSV9ETTkwMDlfSUQgfSwKKwl7IDAsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZG1mZV9wY2lfdGJsKTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZG1mZV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImRtZmUiLAorCS5pZF90YWJsZQk9IGRtZmVfcGNpX3RibCwKKwkucHJvYmUJCT0gZG1mZV9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGRtZmVfcmVtb3ZlX29uZSksCit9OworCitNT0RVTEVfQVVUSE9SKCJTdGVuIFdhbmcsIHN0ZW5fd2FuZ0BkYXZpY29tLmNvbS50dyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEYXZpY29tIERNOTEwWCBmYXN0IGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obW9kZSwgYnl0ZSwgMCk7Cittb2R1bGVfcGFyYW0oY3I2c2V0LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGNoa21vZGUsIGJ5dGUsIDApOworbW9kdWxlX3BhcmFtKEhQTkFfbW9kZSwgYnl0ZSwgMCk7Cittb2R1bGVfcGFyYW0oSFBOQV9yeF9jbWQsIGJ5dGUsIDApOworbW9kdWxlX3BhcmFtKEhQTkFfdHhfY21kLCBieXRlLCAwKTsKK21vZHVsZV9wYXJhbShIUE5BX05vaXNlRmxvb3IsIGJ5dGUsIDApOworbW9kdWxlX3BhcmFtKFNGX21vZGUsIGJ5dGUsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRhdmljb20gRE05eHh4IGVuYWJsZSBkZWJ1Z2dpbmcgKDAtMSkiKTsKK01PRFVMRV9QQVJNX0RFU0MobW9kZSwgIkRhdmljb20gRE05eHh4OiBCaXQgMDogMTAvMTAwTWJwcywgYml0IDI6IGR1cGxleCwgYml0IDg6IEhvbWVQTkEiKTsKK01PRFVMRV9QQVJNX0RFU0MoU0ZfbW9kZSwgIkRhdmljb20gRE05eHh4IHNwZWNpYWwgZnVuY3Rpb24gKGJpdCAwOiBWTEFOLCBiaXQgMSBGbG93IENvbnRyb2wsIGJpdCAyOiBUWCBwYXVzZSBwYWNrZXQpIik7CisKKy8qCURlc2NyaXB0aW9uOgorICoJd2hlbiB1c2VyIHVzZWQgaW5zbW9kIHRvIGFkZCBtb2R1bGUsIHN5c3RlbSBpbnZva2VkIGluaXRfbW9kdWxlKCkKKyAqCXRvIGluaXRpbGl6ZSBhbmQgcmVnaXN0ZXIuCisgKi8KKworc3RhdGljIGludCBfX2luaXQgZG1mZV9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByYzsKKworCXByaW50ayh2ZXJzaW9uKTsKKwlwcmludGVkX3ZlcnNpb24gPSAxOworCisJRE1GRV9EQlVHKDAsICJpbml0X21vZHVsZSgpICIsIGRlYnVnKTsKKworCWlmIChkZWJ1ZykKKwkJZG1mZV9kZWJ1ZyA9IGRlYnVnOwkvKiBzZXQgZGVidWcgZmxhZyAqLworCWlmIChjcjZzZXQpCisJCWRtZmVfY3I2X3VzZXJfc2V0ID0gY3I2c2V0OworCisgCXN3aXRjaChtb2RlKSB7CisgICAJY2FzZSBETUZFXzEwTUhGOgorCWNhc2UgRE1GRV8xMDBNSEY6CisJY2FzZSBETUZFXzEwTUZEOgorCWNhc2UgRE1GRV8xMDBNRkQ6CisJY2FzZSBETUZFXzFNX0hQTkE6CisJCWRtZmVfbWVkaWFfbW9kZSA9IG1vZGU7CisJCWJyZWFrOworCWRlZmF1bHQ6ZG1mZV9tZWRpYV9tb2RlID0gRE1GRV9BVVRPOworCQlicmVhazsKKwl9CisKKwlpZiAoSFBOQV9tb2RlID4gNCkKKwkJSFBOQV9tb2RlID0gMDsJCS8qIERlZmF1bHQ6IExQL0hTICovCisJaWYgKEhQTkFfcnhfY21kID4gMSkKKwkJSFBOQV9yeF9jbWQgPSAwOwkvKiBEZWZhdWx0OiBJZ25vcmVkIHJlbW90ZSBjbWQgKi8KKwlpZiAoSFBOQV90eF9jbWQgPiAxKQorCQlIUE5BX3R4X2NtZCA9IDA7CS8qIERlZmF1bHQ6IERvbid0IGlzc3VlIHJlbW90ZSBjbWQgKi8KKwlpZiAoSFBOQV9Ob2lzZUZsb29yID4gMTUpCisJCUhQTkFfTm9pc2VGbG9vciA9IDA7CisKKwlyYyA9IHBjaV9tb2R1bGVfaW5pdCgmZG1mZV9kcml2ZXIpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKglEZXNjcmlwdGlvbjoKKyAqCXdoZW4gdXNlciB1c2VkIHJtbW9kIHRvIGRlbGV0ZSBtb2R1bGUsIHN5c3RlbSBpbnZva2VkIGNsZWFuX21vZHVsZSgpCisgKgl0byB1bi1yZWdpc3RlciBhbGwgcmVnaXN0ZXJlZCBzZXJ2aWNlcy4KKyAqLworCitzdGF0aWMgdm9pZCBfX2V4aXQgZG1mZV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCURNRkVfREJVRygwLCAiZG1mZV9jbGVhbl9tb2R1bGUoKSAiLCBkZWJ1Zyk7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkbWZlX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGRtZmVfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZG1mZV9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9lZXByb20uYyBiL2RyaXZlcnMvbmV0L3R1bGlwL2VlcHJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNWJmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC9lZXByb20uYwpAQCAtMCwwICsxLDM1NyBAQAorLyoKKwlkcml2ZXJzL25ldC90dWxpcC9lZXByb20uYworCisJTWFpbnRhaW5lZCBieSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisJQ29weXJpZ2h0IDIwMDAsMjAwMSAgVGhlIExpbnV4IEtlcm5lbCBUZWFtCisJV3JpdHRlbi9jb3B5cmlnaHQgMTk5NC0yMDAxIGJ5IERvbmFsZCBCZWNrZXIuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCVBsZWFzZSByZWZlciB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdHVsaXAtdXNlci57cGRmLHBzLGh0bWx9CisJZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBkcml2ZXIsIG9yIHZpc2l0IHRoZSBwcm9qZWN0CisJV2ViIHBhZ2UgYXQgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy90dWxpcC8KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgInR1bGlwLmgiCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworCisKKy8qIFNlcmlhbCBFRVBST00gc2VjdGlvbi4gKi8KKy8qIFRoZSBtYWluIHJvdXRpbmUgdG8gcGFyc2UgdGhlIHZlcnkgY29tcGxpY2F0ZWQgU1JPTSBzdHJ1Y3R1cmUuCisgICBTZWFyY2ggd3d3LmRpZ2l0YWwuY29tIGZvciAiMjFYNCBTUk9NIiB0byBnZXQgZGV0YWlscy4KKyAgIFRoaXMgY29kZSBpcyB2ZXJ5IGNvbXBsZXgsIGFuZCB3aWxsIHJlcXVpcmUgY2hhbmdlcyB0byBzdXBwb3J0CisgICBhZGRpdGlvbmFsIGNhcmRzLCBzbyBJJ2xsIGJlIHZlcmJvc2UgYWJvdXQgd2hhdCBpcyBnb2luZyBvbi4KKyAgICovCisKKy8qIEtub3duIGNhcmRzIHRoYXQgaGF2ZSBvbGQtc3R5bGUgRUVQUk9Ncy4gKi8KK3N0YXRpYyBzdHJ1Y3QgZWVwcm9tX2ZpeHVwIGVlcHJvbV9maXh1cHNbXSBfX2RldmluaXRkYXRhID0geworICB7IkFzYW50ZSIsIDAsIDAsIDB4OTQsIHsweDFlMDAsIDB4MDAwMCwgMHgwODAwLCAweDAxMDAsIDB4MDE4YywKKwkJCSAgMHgwMDAwLCAweDAwMDAsIDB4ZTA3OCwgMHgwMDAxLCAweDAwNTAsIDB4MDAxOCB9fSwKKyAgeyJTTUM5MzMyRFNUIiwgMCwgMCwgMHhDMCwgeyAweDFlMDAsIDB4MDAwMCwgMHgwODAwLCAweDA0MWYsCisJCQkgICAweDAwMDAsIDB4MDA5RSwgLyogMTBiYXNlVCAqLworCQkJICAgMHgwMDA0LCAweDAwOUUsIC8qIDEwYmFzZVQtRkQgKi8KKwkJCSAgIDB4MDkwMywgMHgwMDZELCAvKiAxMDBiYXNlVHggKi8KKwkJCSAgIDB4MDkwNSwgMHgwMDZELCAvKiAxMDBiYXNlVHgtRkQgKi8gfX0sCisgIHsiQ29nZW50IEVNMTAwIiwgMCwgMCwgMHg5MiwgeyAweDFlMDAsIDB4MDAwMCwgMHgwODAwLCAweDA2M2YsCisJCQkJIDB4MDEwNywgMHg4MDIxLCAvKiAxMDBiYXNlRnggKi8KKwkJCQkgMHgwMTA4LCAweDgwMjEsIC8qIDEwMGJhc2VGeC1GRCAqLworCQkJCSAweDAxMDAsIDB4MDA5RSwgLyogMTBiYXNlVCAqLworCQkJCSAweDAxMDQsIDB4MDA5RSwgLyogMTBiYXNlVC1GRCAqLworCQkJCSAweDAxMDMsIDB4MDA2RCwgLyogMTAwYmFzZVR4ICovCisJCQkJIDB4MDEwNSwgMHgwMDZELCAvKiAxMDBiYXNlVHgtRkQgKi8gfX0sCisgIHsiTWF4dGVjaCBOWC0xMTAiLCAwLCAwLCAweEU4LCB7IDB4MWUwMCwgMHgwMDAwLCAweDA4MDAsIDB4MDUxMywKKwkJCQkgICAweDEwMDEsIDB4MDA5RSwgLyogMTBiYXNlMiwgQ1NSMTIgMHgxMCovCisJCQkJICAgMHgwMDAwLCAweDAwOUUsIC8qIDEwYmFzZVQgKi8KKwkJCQkgICAweDAwMDQsIDB4MDA5RSwgLyogMTBiYXNlVC1GRCAqLworCQkJCSAgIDB4MDMwMywgMHgwMDZELCAvKiAxMDBiYXNlVHgsIENTUjEyIDB4MDMgKi8KKwkJCQkgICAweDAzMDUsIDB4MDA2RCwgLyogMTAwYmFzZVR4LUZEIENTUjEyIDB4MDMgKi99fSwKKyAgeyJBY2N0b24gRU4xMjA3IiwgMCwgMCwgMHhFOCwgeyAweDFlMDAsIDB4MDAwMCwgMHgwODAwLCAweDA1MUYsCisJCQkJICAweDFCMDEsIDB4MDAwMCwgLyogMTBiYXNlMiwgICBDU1IxMiAweDFCICovCisJCQkJICAweDBCMDAsIDB4MDA5RSwgLyogMTBiYXNlVCwgICBDU1IxMiAweDBCICovCisJCQkJICAweDBCMDQsIDB4MDA5RSwgLyogMTBiYXNlVC1GRCxDU1IxMiAweDBCICovCisJCQkJICAweDFCMDMsIDB4MDA2RCwgLyogMTAwYmFzZVR4LCBDU1IxMiAweDFCICovCisJCQkJICAweDFCMDUsIDB4MDA2RCwgLyogMTAwYmFzZVR4LUZEIENTUjEyIDB4MUIgKi8KKyAgIH19LAorICB7Ik5ldFdpbmRlciIsIDB4MDAsIDB4MTAsIDB4NTcsCisJLyogRGVmYXVsdCBtZWRpYSA9IE1JSQorCSAqIE1JSSBibG9jaywgcmVzZXQgc2VxdWVuY2UgKDMpID0gMHgwODIxIDB4MDAwMCAweDAwMDEsIGNhcGFiaWxpdGllcyAweDAxZTEKKwkgKi8KKwl7IDB4MWUwMCwgMHgwMDAwLCAweDAwMGIsIDB4OGYwMSwgMHgwMTAzLCAweDAzMDAsIDB4MDgyMSwgMHgwMDAsIDB4MDAwMSwgMHgwMDAwLCAweDAxZTEgfQorICB9LAorICB7TlVMTH19OworCisKK3N0YXRpYyBjb25zdCBjaGFyICpibG9ja19uYW1lW10gX19kZXZpbml0ZGF0YSA9IHsKKwkiMjExNDAgbm9uLU1JSSIsCisJIjIxMTQwIE1JSSBQSFkiLAorCSIyMTE0MiBTZXJpYWwgUEhZIiwKKwkiMjExNDIgTUlJIFBIWSIsCisJIjIxMTQzIFNZTSBQSFkiLAorCSIyMTE0MyByZXNldCBtZXRob2QiCit9OworCisKKy8qKgorICogdHVsaXBfYnVpbGRfZmFrZV9tZWRpYXRhYmxlIC0gQnVpbGQgYSBmYWtlIG1lZGlhdGFibGUgZW50cnkuCisgKiBAdHA6IFB0ciB0byB0aGUgdHVsaXAgcHJpdmF0ZSBkYXRhLgorICoKKyAqIFNvbWUgY2FyZHMgbGlrZSB0aGUgM3g1IEhTQyBjYXJkcyAoSjM1MTRBKSBkbyBub3QgaGF2ZSBhIHN0YW5kYXJkIAorICogc3JvbSBhbmQgY2FuIG5vdCBiZSBoYW5kbGVkIHVuZGVyIHRoZSBmaXh1cCByb3V0aW5lLiAgVGhlc2UgY2FyZHMKKyAqIHN0aWxsIG5lZWQgYSB2YWxpZCBtZWRpYXRhYmxlIGVudHJ5IGZvciBjb3JyZWN0IGNzcjEyIHNldHVwIGFuZCAKKyAqIG1paSBoYW5kbGluZy4KKyAqIAorICogU2luY2UgdGhpcyBpcyBjdXJyZW50bHkgYSBwYXJpc2MtbGludXggc3BlY2lmaWMgZnVuY3Rpb24sIHRoZQorICogI2lmZGVmIF9faHBwYV9fIHNob3VsZCBjb21wbGV0ZWx5IG9wdGltaXplIHRoaXMgZnVuY3Rpb24gYXdheSBmb3IKKyAqIG5vbi1wYXJpc2MgaGFyZHdhcmUuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB0dWxpcF9idWlsZF9mYWtlX21lZGlhdGFibGUoc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwKQoreworI2lmZGVmIENPTkZJR19HU0MKKwlpZiAodHAtPmZsYWdzICYgTkVFRFNfRkFLRV9NRURJQV9UQUJMRSkgeworCQlzdGF0aWMgdW5zaWduZWQgY2hhciBsZWFmZGF0YVtdID0KKwkJCXsgMHgwMSwgICAgICAgLyogcGh5IG51bWJlciAqLworCQkJICAweDAyLCAgICAgICAvKiBncHIgc2V0dXAgc2VxdWVuY2UgbGVuZ3RoICovCisJCQkgIDB4MDIsIDB4MDAsIC8qIGdwciBzZXR1cCBzZXF1ZW5jZSAqLworCQkJICAweDAyLCAgICAgICAvKiBwaHkgcmVzZXQgc2VxdWVuY2UgbGVuZ3RoICovCisJCQkgIDB4MDEsIDB4MDAsIC8qIHBoeSByZXNldCBzZXF1ZW5jZSAqLworCQkJICAweDAwLCAweDc4LCAvKiBtZWRpYSBjYXBhYmlsaXRpZXMgKi8KKwkJCSAgMHgwMCwgMHhlMCwgLyogbndheSBhZHZlcnRpc21lbnQgKi8KKwkJCSAgMHgwMCwgMHgwNSwgLyogZmR4IGJpdCBtYXAgKi8KKwkJCSAgMHgwMCwgMHgwNiAgLyogdHRtIGJpdCBtYXAgKi8KKwkJCX07CisKKwkJdHAtPm10YWJsZSA9IChzdHJ1Y3QgbWVkaWF0YWJsZSAqKQorCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IG1lZGlhdGFibGUpICsgc2l6ZW9mKHN0cnVjdCBtZWRpYWxlYWYpLCBHRlBfS0VSTkVMKTsKKworCQlpZiAodHAtPm10YWJsZSA9PSBOVUxMKQorCQkJcmV0dXJuOyAvKiBIb3JyaWJsZSwgaW1wb3NzaWJsZSBmYWlsdXJlLiAqLworCisJCXRwLT5tdGFibGUtPmRlZmF1bHRtZWRpYSA9IDB4ODAwOworCQl0cC0+bXRhYmxlLT5sZWFmY291bnQgPSAxOworCQl0cC0+bXRhYmxlLT5jc3IxMmRpciA9IDB4M2Y7IC8qIGlucHV0cyBvbiBiaXQ3IGZvciBoc2MtcGNpLCBiaXQ2IGZvciBwY2ktZnggKi8KKwkJdHAtPm10YWJsZS0+aGFzX25vbm1paSA9IDA7CisJCXRwLT5tdGFibGUtPmhhc19yZXNldCA9IDA7CisJCXRwLT5tdGFibGUtPmhhc19taWkgPSAxOworCQl0cC0+bXRhYmxlLT5jc3IxNWRpciA9IHRwLT5tdGFibGUtPmNzcjE1dmFsID0gMDsKKwkJdHAtPm10YWJsZS0+bWxlYWZbMF0udHlwZSA9IDE7CisJCXRwLT5tdGFibGUtPm1sZWFmWzBdLm1lZGlhID0gMTE7CisJCXRwLT5tdGFibGUtPm1sZWFmWzBdLmxlYWZkYXRhID0gJmxlYWZkYXRhWzBdOworCQl0cC0+ZmxhZ3MgfD0gSEFTX1BIWV9JUlE7CisJCXRwLT5jc3IxMl9zaGFkb3cgPSAtMTsKKwl9CisjZW5kaWYgCit9CisKK3ZvaWQgX19kZXZpbml0IHR1bGlwX3BhcnNlX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIFRoZSBsYXN0IG1lZGlhIGluZm8gbGlzdCBwYXJzZWQsIGZvciBtdWx0aXBvcnQgYm9hcmRzLiAgKi8KKwlzdGF0aWMgc3RydWN0IG1lZGlhdGFibGUgKmxhc3RfbWVkaWF0YWJsZTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciAqbGFzdF9lZV9kYXRhOworCXN0YXRpYyBpbnQgY29udHJvbGxlcl9pbmRleDsKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGNoYXIgKmVlX2RhdGEgPSB0cC0+ZWVwcm9tOworCWludCBpOworCisJdHAtPm10YWJsZSA9IE5VTEw7CisJLyogRGV0ZWN0IGFuIG9sZC1zdHlsZSAoU0Egb25seSkgRUVQUk9NIGxheW91dDoKKwkgICBtZW1jbXAoZWVkYXRhLCBlZWRhdGErMTYsIDgpLiAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpICsrKQorCQlpZiAoZWVfZGF0YVtpXSAhPSBlZV9kYXRhWzE2K2ldKQorCQkJYnJlYWs7CisJaWYgKGkgPj0gOCkgeworCQlpZiAoZWVfZGF0YVswXSA9PSAweGZmKSB7CisJCQlpZiAobGFzdF9tZWRpYXRhYmxlKSB7CisJCQkJY29udHJvbGxlcl9pbmRleCsrOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAgQ29udHJvbGxlciAlZCBvZiBtdWx0aXBvcnQgYm9hcmQuXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIGNvbnRyb2xsZXJfaW5kZXgpOworCQkJCXRwLT5tdGFibGUgPSBsYXN0X21lZGlhdGFibGU7CisJCQkJZWVfZGF0YSA9IGxhc3RfZWVfZGF0YTsKKwkJCQlnb3RvIHN1YnNlcXVlbnRfYm9hcmQ7CisJCQl9IGVsc2UKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogIE1pc3NpbmcgRUVQUk9NLCB0aGlzIGludGVyZmFjZSBtYXkgIgorCQkJCQkgICAibm90IHdvcmsgY29ycmVjdGx5IVxuIiwKKwkJCSAgIGRldi0+bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwkgIC8qIERvIGEgZml4LXVwIGJhc2VkIG9uIHRoZSB2ZW5kb3IgaGFsZiBvZiB0aGUgc3RhdGlvbiBhZGRyZXNzIHByZWZpeC4gKi8KKwkgIGZvciAoaSA9IDA7IGVlcHJvbV9maXh1cHNbaV0ubmFtZTsgaSsrKSB7CisJCWlmIChkZXYtPmRldl9hZGRyWzBdID09IGVlcHJvbV9maXh1cHNbaV0uYWRkcjAKKwkJCSYmICBkZXYtPmRldl9hZGRyWzFdID09IGVlcHJvbV9maXh1cHNbaV0uYWRkcjEKKwkJCSYmICBkZXYtPmRldl9hZGRyWzJdID09IGVlcHJvbV9maXh1cHNbaV0uYWRkcjIpIHsKKwkJICBpZiAoZGV2LT5kZXZfYWRkclsyXSA9PSAweEU4ICAmJiAgZWVfZGF0YVsweDFhXSA9PSAweDU1KQorCQkJICBpKys7CQkJLyogQW4gQWNjdG9uIEVOMTIwNywgbm90IGFuIG91dGxhdyBNYXh0ZWNoLiAqLworCQkgIG1lbWNweShlZV9kYXRhICsgMjYsIGVlcHJvbV9maXh1cHNbaV0ubmV3dGFibGUsCisJCQkJIHNpemVvZihlZXByb21fZml4dXBzW2ldLm5ld3RhYmxlKSk7CisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE9sZCBmb3JtYXQgRUVQUk9NIG9uICclcycgYm9hcmQuICBVc2luZyIKKwkJCQkgIiBzdWJzdGl0dXRlIG1lZGlhIGNvbnRyb2wgaW5mby5cbiIsCisJCQkJIGRldi0+bmFtZSwgZWVwcm9tX2ZpeHVwc1tpXS5uYW1lKTsKKwkJICBicmVhazsKKwkJfQorCSAgfQorCSAgaWYgKGVlcHJvbV9maXh1cHNbaV0ubmFtZSA9PSBOVUxMKSB7IC8qIE5vIGZpeHVwIGZvdW5kLiAqLworCQkgIHByaW50ayhLRVJOX0lORk8gIiVzOiBPbGQgc3R5bGUgRUVQUk9NIHdpdGggbm8gbWVkaWEgc2VsZWN0aW9uICIKKwkJCQkgImluZm9ybWF0aW9uLlxuIiwKKwkJCSAgIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwkgIH0KKwl9CisKKwljb250cm9sbGVyX2luZGV4ID0gMDsKKwlpZiAoZWVfZGF0YVsxOV0gPiAxKSB7CQkvKiBNdWx0aXBvcnQgYm9hcmQuICovCisJCWxhc3RfZWVfZGF0YSA9IGVlX2RhdGE7CisJfQorc3Vic2VxdWVudF9ib2FyZDoKKworCWlmIChlZV9kYXRhWzI3XSA9PSAwKSB7CQkvKiBObyB2YWxpZCBtZWRpYSB0YWJsZS4gKi8KKwkJdHVsaXBfYnVpbGRfZmFrZV9tZWRpYXRhYmxlKHRwKTsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBjaGFyICpwID0gKHZvaWQgKillZV9kYXRhICsgZWVfZGF0YVsyN107CisJCXVuc2lnbmVkIGNoYXIgY3NyMTJkaXIgPSAwOworCQlpbnQgY291bnQsIG5ld19hZHZlcnRpc2UgPSAwOworCQlzdHJ1Y3QgbWVkaWF0YWJsZSAqbXRhYmxlOworCQl1MTYgbWVkaWEgPSBnZXRfdTE2KHApOworCisJCXAgKz0gMjsKKwkJaWYgKHRwLT5mbGFncyAmIENTUjEyX0lOX1NST00pCisJCQljc3IxMmRpciA9ICpwKys7CisJCWNvdW50ID0gKnArKzsKKworCSAgICAgICAgLyogdGhlcmUgaXMgbm8gcGh5IGluZm9ybWF0aW9uLCBkb24ndCBldmVuIHRyeSB0byBidWlsZCBtdGFibGUgKi8KKwkgICAgICAgIGlmIChjb3VudCA9PSAwKSB7CisJCQlpZiAodHVsaXBfZGVidWcgPiAwKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBubyBwaHkgaW5mbywgYWJvcnRpbmcgbXRhYmxlIGJ1aWxkXG4iLCBkZXYtPm5hbWUpOworCQkgICAgICAgIHJldHVybjsKKwkJfQorCisJCW10YWJsZSA9IChzdHJ1Y3QgbWVkaWF0YWJsZSAqKQorCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IG1lZGlhdGFibGUpICsgY291bnQqc2l6ZW9mKHN0cnVjdCBtZWRpYWxlYWYpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKG10YWJsZSA9PSBOVUxMKQorCQkJcmV0dXJuOwkJCQkvKiBIb3JyaWJsZSwgaW1wb3NzaWJsZSBmYWlsdXJlLiAqLworCQlsYXN0X21lZGlhdGFibGUgPSB0cC0+bXRhYmxlID0gbXRhYmxlOworCQltdGFibGUtPmRlZmF1bHRtZWRpYSA9IG1lZGlhOworCQltdGFibGUtPmxlYWZjb3VudCA9IGNvdW50OworCQltdGFibGUtPmNzcjEyZGlyID0gY3NyMTJkaXI7CisJCW10YWJsZS0+aGFzX25vbm1paSA9IG10YWJsZS0+aGFzX21paSA9IG10YWJsZS0+aGFzX3Jlc2V0ID0gMDsKKwkJbXRhYmxlLT5jc3IxNWRpciA9IG10YWJsZS0+Y3NyMTV2YWwgPSAwOworCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiAgRUVQUk9NIGRlZmF1bHQgbWVkaWEgdHlwZSAlcy5cbiIsIGRldi0+bmFtZSwKKwkJCSAgIG1lZGlhICYgMHgwODAwID8gIkF1dG9zZW5zZSIgOiBtZWRpYW5hbWVbbWVkaWEgJiBNRURJQV9NQVNLXSk7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlzdHJ1Y3QgbWVkaWFsZWFmICpsZWFmID0gJm10YWJsZS0+bWxlYWZbaV07CisKKwkJCWlmICgocFswXSAmIDB4ODApID09IDApIHsgLyogMjExNDAgQ29tcGFjdCBibG9jay4gKi8KKwkJCQlsZWFmLT50eXBlID0gMDsKKwkJCQlsZWFmLT5tZWRpYSA9IHBbMF0gJiAweDNmOworCQkJCWxlYWYtPmxlYWZkYXRhID0gcDsKKwkJCQlpZiAoKHBbMl0gJiAweDYxKSA9PSAweDAxKQkvKiBCb2d1cywgYnV0IFpueXggYm9hcmRzIGRvIGl0LiAqLworCQkJCQltdGFibGUtPmhhc19taWkgPSAxOworCQkJCXAgKz0gNDsKKwkJCX0gZWxzZSB7CisJCQkJbGVhZi0+dHlwZSA9IHBbMV07CisJCQkJaWYgKHBbMV0gPT0gMHgwNSkgeworCQkJCQltdGFibGUtPmhhc19yZXNldCA9IGk7CisJCQkJCWxlYWYtPm1lZGlhID0gcFsyXSAmIDB4MGY7CisJCQkJfSBlbHNlIGlmICh0cC0+Y2hpcF9pZCA9PSBETTkxMFggJiYgcFsxXSA9PSAweDgwKSB7CisJCQkJCS8qIEhhY2sgdG8gaWdub3JlIERhdmljb20gZGVsYXkgcGVyaW9kIGJsb2NrICovCisJCQkJCW10YWJsZS0+bGVhZmNvdW50LS07CisJCQkJCWNvdW50LS07CisJCQkJCWktLTsKKwkJCQkJbGVhZi0+bGVhZmRhdGEgPSBwICsgMjsKKwkJCQkJcCArPSAocFswXSAmIDB4M2YpICsgMTsKKwkJCQkJY29udGludWU7CisJCQkJfSBlbHNlIGlmIChwWzFdICYgMSkgeworCQkJCQlpbnQgZ3ByX2xlbiwgcmVzZXRfbGVuOworCisJCQkJCW10YWJsZS0+aGFzX21paSA9IDE7CisJCQkJCWxlYWYtPm1lZGlhID0gMTE7CisJCQkJCWdwcl9sZW49cFszXSoyOworCQkJCQlyZXNldF9sZW49cFs0K2dwcl9sZW5dKjI7CisJCQkJCW5ld19hZHZlcnRpc2UgfD0gZ2V0X3UxNigmcFs3K2dwcl9sZW4rcmVzZXRfbGVuXSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbXRhYmxlLT5oYXNfbm9ubWlpID0gMTsKKwkJCQkJbGVhZi0+bWVkaWEgPSBwWzJdICYgTUVESUFfTUFTSzsKKwkJCQkJLyogRGF2aWNvbSdzIG1lZGlhIG51bWJlciBmb3IgMTAwQmFzZVRYIGlzIHN0cmFuZ2UgKi8KKwkJCQkJaWYgKHRwLT5jaGlwX2lkID09IERNOTEwWCAmJiBsZWFmLT5tZWRpYSA9PSAxKQorCQkJCQkJbGVhZi0+bWVkaWEgPSAzOworCQkJCQlzd2l0Y2ggKGxlYWYtPm1lZGlhKSB7CisJCQkJCWNhc2UgMDogbmV3X2FkdmVydGlzZSB8PSAweDAwMjA7IGJyZWFrOworCQkJCQljYXNlIDQ6IG5ld19hZHZlcnRpc2UgfD0gMHgwMDQwOyBicmVhazsKKwkJCQkJY2FzZSAzOiBuZXdfYWR2ZXJ0aXNlIHw9IDB4MDA4MDsgYnJlYWs7CisJCQkJCWNhc2UgNTogbmV3X2FkdmVydGlzZSB8PSAweDAxMDA7IGJyZWFrOworCQkJCQljYXNlIDY6IG5ld19hZHZlcnRpc2UgfD0gMHgwMjAwOyBicmVhazsKKwkJCQkJfQorCQkJCQlpZiAocFsxXSA9PSAyICAmJiAgbGVhZi0+bWVkaWEgPT0gMCkgeworCQkJCQkJaWYgKHBbMl0gJiAweDQwKSB7CisJCQkJCQkJdTMyIGJhc2UxNSA9IGdldF91bmFsaWduZWQoKHUxNiopJnBbN10pOworCQkJCQkJCW10YWJsZS0+Y3NyMTVkaXIgPQorCQkJCQkJCQkoZ2V0X3VuYWxpZ25lZCgodTE2KikmcFs5XSk8PDE2KSArIGJhc2UxNTsKKwkJCQkJCQltdGFibGUtPmNzcjE1dmFsID0KKwkJCQkJCQkJKGdldF91bmFsaWduZWQoKHUxNiopJnBbMTFdKTw8MTYpICsgYmFzZTE1OworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQltdGFibGUtPmNzcjE1ZGlyID0gZ2V0X3VuYWxpZ25lZCgodTE2KikmcFszXSk8PDE2OworCQkJCQkJCW10YWJsZS0+Y3NyMTV2YWwgPSBnZXRfdW5hbGlnbmVkKCh1MTYqKSZwWzVdKTw8MTY7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJbGVhZi0+bGVhZmRhdGEgPSBwICsgMjsKKwkJCQlwICs9IChwWzBdICYgMHgzZikgKyAxOworCQkJfQorCQkJaWYgKHR1bGlwX2RlYnVnID4gMSAgJiYgIGxlYWYtPm1lZGlhID09IDExKSB7CisJCQkJdW5zaWduZWQgY2hhciAqYnAgPSBsZWFmLT5sZWFmZGF0YTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogIE1JSSBpbnRlcmZhY2UgUEhZICVkLCBzZXR1cC9yZXNldCAiCisJCQkJCSAgICJzZXF1ZW5jZXMgJWQvJWQgbG9uZywgY2FwYWJpbGl0aWVzICUyLjJ4ICUyLjJ4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBicFswXSwgYnBbMV0sIGJwWzIgKyBicFsxXSoyXSwKKwkJCQkJICAgYnBbNSArIGJwWzIgKyBicFsxXSoyXSoyXSwgYnBbNCArIGJwWzIgKyBicFsxXSoyXSoyXSk7CisJCQl9CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogIEluZGV4ICMlZCAtIE1lZGlhICVzICgjJWQpIGRlc2NyaWJlZCAiCisJCQkJICAgImJ5IGEgJXMgKCVkKSBibG9jay5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBpLCBtZWRpYW5hbWVbbGVhZi0+bWVkaWEgJiAxNV0sIGxlYWYtPm1lZGlhLAorCQkJCSAgIGxlYWYtPnR5cGUgPCBBUlJBWV9TSVpFKGJsb2NrX25hbWUpID8gYmxvY2tfbmFtZVtsZWFmLT50eXBlXSA6ICI8dW5rbm93bj4iLAorCQkJCSAgIGxlYWYtPnR5cGUpOworCQl9CisJCWlmIChuZXdfYWR2ZXJ0aXNlKQorCQkJdHAtPnN5bV9hZHZlcnRpc2UgPSBuZXdfYWR2ZXJ0aXNlOworCX0KK30KKy8qIFJlYWRpbmcgYSBzZXJpYWwgRUVQUk9NIGlzIGEgImJpdCIgZ3J1bmd5LCBidXQgd2Ugd29yayBvdXIgd2F5IHRocm91Z2g6LT4uKi8KKworLyogIEVFUFJPTV9DdHJsIGJpdHMuICovCisjZGVmaW5lIEVFX1NISUZUX0NMSwkweDAyCS8qIEVFUFJPTSBzaGlmdCBjbG9jay4gKi8KKyNkZWZpbmUgRUVfQ1MJCTB4MDEJLyogRUVQUk9NIGNoaXAgc2VsZWN0LiAqLworI2RlZmluZSBFRV9EQVRBX1dSSVRFCTB4MDQJLyogRGF0YSBmcm9tIHRoZSBUdWxpcCB0byBFRVBST00uICovCisjZGVmaW5lIEVFX1dSSVRFXzAJMHgwMQorI2RlZmluZSBFRV9XUklURV8xCTB4MDUKKyNkZWZpbmUgRUVfREFUQV9SRUFECTB4MDgJLyogRGF0YSBmcm9tIHRoZSBFRVBST00gY2hpcC4gKi8KKyNkZWZpbmUgRUVfRU5CCQkoMHg0ODAwIHwgRUVfQ1MpCisKKy8qIERlbGF5IGJldHdlZW4gRUVQUk9NIGNsb2NrIHRyYW5zaXRpb25zLgorICAgRXZlbiBhdCAzM01oeiBjdXJyZW50IFBDSSBpbXBsZW1lbnRhdGlvbnMgZG9uJ3Qgb3ZlcnJ1biB0aGUgRUVQUk9NIGNsb2NrLgorICAgV2UgYWRkIGEgYnVzIHR1cm4tYXJvdW5kIHRvIGluc3VyZSB0aGF0IHRoaXMgcmVtYWlucyB0cnVlLiAqLworI2RlZmluZSBlZXByb21fZGVsYXkoKQlpb3JlYWQzMihlZV9hZGRyKQorCisvKiBUaGUgRUVQUk9NIGNvbW1hbmRzIGluY2x1ZGUgdGhlIGFsd2F5LXNldCBsZWFkaW5nIGJpdC4gKi8KKyNkZWZpbmUgRUVfUkVBRF9DTUQJCSg2KQorCisvKiBOb3RlOiB0aGlzIHJvdXRpbmUgcmV0dXJucyBleHRyYSBkYXRhIGJpdHMgZm9yIHNpemUgZGV0ZWN0aW9uLiAqLworaW50IF9fZGV2aW5pdCB0dWxpcF9yZWFkX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbG9jYXRpb24sIGludCBhZGRyX2xlbikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCByZXR2YWwgPSAwOworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IGRldi0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKmVlX2FkZHIgPSB0cC0+YmFzZV9hZGRyICsgQ1NSOTsKKwlpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IChFRV9SRUFEX0NNRCA8PCBhZGRyX2xlbik7CisKKwlpb3dyaXRlMzIoRUVfRU5CICYgfkVFX0NTLCBlZV9hZGRyKTsKKwlpb3dyaXRlMzIoRUVfRU5CLCBlZV9hZGRyKTsKKworCS8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gNCArIGFkZHJfbGVuOyBpID49IDA7IGktLSkgeworCQlzaG9ydCBkYXRhdmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gRUVfREFUQV9XUklURSA6IDA7CisJCWlvd3JpdGUzMihFRV9FTkIgfCBkYXRhdmFsLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJCWlvd3JpdGUzMihFRV9FTkIgfCBkYXRhdmFsIHwgRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGlvcmVhZDMyKGVlX2FkZHIpICYgRUVfREFUQV9SRUFEKSA/IDEgOiAwKTsKKwl9CisJaW93cml0ZTMyKEVFX0VOQiwgZWVfYWRkcik7CisJZWVwcm9tX2RlbGF5KCk7CisKKwlmb3IgKGkgPSAxNjsgaSA+IDA7IGktLSkgeworCQlpb3dyaXRlMzIoRUVfRU5CIHwgRUVfU0hJRlRfQ0xLLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KCk7CisJCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGlvcmVhZDMyKGVlX2FkZHIpICYgRUVfREFUQV9SRUFEKSA/IDEgOiAwKTsKKwkJaW93cml0ZTMyKEVFX0VOQiwgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheSgpOworCX0KKworCS8qIFRlcm1pbmF0ZSB0aGUgRUVQUk9NIGFjY2Vzcy4gKi8KKwlpb3dyaXRlMzIoRUVfRU5CICYgfkVFX0NTLCBlZV9hZGRyKTsKKwlyZXR1cm4gKHRwLT5mbGFncyAmIEhBU19TV0FQUEVEX1NFRVBST00pID8gc3dhYjE2KHJldHZhbCkgOiByZXR2YWw7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2ludGVycnVwdC5jIGIvZHJpdmVycy9uZXQvdHVsaXAvaW50ZXJydXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiNWNkYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2ludGVycnVwdC5jCkBAIC0wLDAgKzEsNzg2IEBACisvKgorCWRyaXZlcnMvbmV0L3R1bGlwL2ludGVycnVwdC5jCisKKwlNYWludGFpbmVkIGJ5IEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKwlDb3B5cmlnaHQgMjAwMCwyMDAxICBUaGUgTGludXggS2VybmVsIFRlYW0KKwlXcml0dGVuL2NvcHlyaWdodCAxOTk0LTIwMDEgYnkgRG9uYWxkIEJlY2tlci4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJUGxlYXNlIHJlZmVyIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay90dWxpcC11c2VyLntwZGYscHMsaHRtbH0KKwlmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGRyaXZlciwgb3IgdmlzaXQgdGhlIHByb2plY3QKKwlXZWIgcGFnZSBhdCBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3R1bGlwLworCisqLworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSAidHVsaXAuaCIKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorCitpbnQgdHVsaXBfcnhfY29weWJyZWFrOwordW5zaWduZWQgaW50IHR1bGlwX21heF9pbnRlcnJ1cHRfd29yazsKKworI2lmZGVmIENPTkZJR19UVUxJUF9OQVBJX0hXX01JVElHQVRJT04KKyNkZWZpbmUgTUlUX1NJWkUgMTUKKyNkZWZpbmUgTUlUX1RBQkxFIDE1IC8qIFdlIHVzZSAwIG9yIG1heCAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IG1pdF90YWJsZVtNSVRfU0laRSsxXSA9Cit7CisgICAgICAgIC8qICBDUlMxMSAyMTE0MyBoYXJkd2FyZSBNaXRpZ2F0aW9uIENvbnRyb2wgSW50ZXJydXB0CisgICAgICAgICAgICBXZSB1c2Ugb25seSBSWCBtaXRpZ2F0aW9uIHdlIG90aGVyIHRlY2huaXF1ZXMgZm9yCisgICAgICAgICAgICBUWCBpbnRyLiBtaXRpZ2F0aW9uLgorCisgICAgICAgICAgIDMxICAgIEN5Y2xlIFNpemUgKHRpbWVyIGNvbnRyb2wpCisgICAgICAgICAgIDMwOjI3IFRYIHRpbWVyIGluIDE2ICogQ3ljbGUgc2l6ZQorICAgICAgICAgICAyNjoyNCBUWCBObyBwa3RzIGJlZm9yZSBJbnQuCisgICAgICAgICAgIDIzOjIwIFJYIHRpbWVyIGluIEN5Y2xlIHNpemUKKyAgICAgICAgICAgMTk6MTcgUlggTm8gcGt0cyBiZWZvcmUgSW50LgorICAgICAgICAgICAxNiAgICAgICBDb250aW51ZXMgTW9kZSAoQ00pCisgICAgICAgICovCisKKyAgICAgICAgMHgwLCAgICAgICAgICAgICAvKiBJTSBkaXNhYmxlZCAqLworICAgICAgICAweDgwMTUwMDAwLCAgICAgIC8qIFJYIHRpbWUgPSAxLCBSWCBwa3RzID0gMiwgQ00gPSAxICovCisgICAgICAgIDB4ODAxNTAwMDAsCisgICAgICAgIDB4ODAyNzAwMDAsCisgICAgICAgIDB4ODAzNzAwMDAsCisgICAgICAgIDB4ODA0OTAwMDAsCisgICAgICAgIDB4ODA1OTAwMDAsCisgICAgICAgIDB4ODA2OTAwMDAsCisgICAgICAgIDB4ODA3QjAwMDAsCisgICAgICAgIDB4ODA4QjAwMDAsCisgICAgICAgIDB4ODA5RDAwMDAsCisgICAgICAgIDB4ODBBRDAwMDAsCisgICAgICAgIDB4ODBCRDAwMDAsCisgICAgICAgIDB4ODBDRjAwMDAsCisgICAgICAgIDB4ODBERjAwMDAsCisvLyAgICAgICAweDgwRkYwMDAwICAgICAgLyogUlggdGltZSA9IDE2LCBSWCBwa3RzID0gNywgQ00gPSAxICovCisgICAgICAgIDB4ODBGMTAwMDAgICAgICAvKiBSWCB0aW1lID0gMTYsIFJYIHBrdHMgPSAwLCBDTSA9IDEgKi8KK307CisjZW5kaWYKKworCitpbnQgdHVsaXBfcmVmaWxsX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZW50cnk7CisJaW50IHJlZmlsbGVkID0gMDsKKworCS8qIFJlZmlsbCB0aGUgUnggcmluZyBidWZmZXJzLiAqLworCWZvciAoOyB0cC0+Y3VyX3J4IC0gdHAtPmRpcnR5X3J4ID4gMDsgdHAtPmRpcnR5X3J4KyspIHsKKwkJZW50cnkgPSB0cC0+ZGlydHlfcnggJSBSWF9SSU5HX1NJWkU7CisJCWlmICh0cC0+cnhfYnVmZmVyc1tlbnRyeV0uc2tiID09IE5VTEwpIHsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisJCQlkbWFfYWRkcl90IG1hcHBpbmc7CisKKwkJCXNrYiA9IHRwLT5yeF9idWZmZXJzW2VudHJ5XS5za2IgPSBkZXZfYWxsb2Nfc2tiKFBLVF9CVUZfU1opOworCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJCWJyZWFrOworCisJCQltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUodHAtPnBkZXYsIHNrYi0+dGFpbCwgUEtUX0JVRl9TWiwKKwkJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJdHAtPnJ4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcgPSBtYXBwaW5nOworCisJCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCQl0cC0+cnhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IGNwdV90b19sZTMyKG1hcHBpbmcpOworCQkJcmVmaWxsZWQrKzsKKwkJfQorCQl0cC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzID0gY3B1X3RvX2xlMzIoRGVzY093bmVkKTsKKwl9CisJaWYodHAtPmNoaXBfaWQgPT0gTEM4MkMxNjgpIHsKKwkJaWYoKChpb3JlYWQzMih0cC0+YmFzZV9hZGRyICsgQ1NSNSk+PjE3KSYweDA3KSA9PSA0KSB7CisJCQkvKiBSeCBzdG9wcGVkIGR1ZSB0byBvdXQgb2YgYnVmZmVycywKKwkJCSAqIHJlc3RhcnQgaXQKKwkJCSAqLworCQkJaW93cml0ZTMyKDB4MDEsIHRwLT5iYXNlX2FkZHIgKyBDU1IyKTsKKwkJfQorCX0KKwlyZXR1cm4gcmVmaWxsZWQ7Cit9CisKKyNpZmRlZiBDT05GSUdfVFVMSVBfTkFQSQorCit2b2lkIG9vbV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCW5ldGlmX3J4X3NjaGVkdWxlKGRldik7Cit9CisKK2ludCB0dWxpcF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5ID0gdHAtPmN1cl9yeCAlIFJYX1JJTkdfU0laRTsKKwlpbnQgcnhfd29ya19saW1pdCA9ICpidWRnZXQ7CisJaW50IHJlY2VpdmVkID0gMDsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlnb3RvIGRvbmU7CisKKwlpZiAocnhfd29ya19saW1pdCA+IGRldi0+cXVvdGEpCisJCXJ4X3dvcmtfbGltaXQgPSBkZXYtPnF1b3RhOworCisjaWZkZWYgQ09ORklHX1RVTElQX05BUElfSFdfTUlUSUdBVElPTgorCisvKiB0aGF0IG9uZSBidWZmZXIgaXMgbmVlZGVkIGZvciBtaXQgYWN0aXZhdGlvbjsgb3IgbWlnaHQgYmUgYQorICAgYnVnIGluIHRoZSByaW5nIGJ1ZmZlciBjb2RlOyBjaGVjayBsYXRlciAtLSBKSFMqLworCisgICAgICAgIGlmIChyeF93b3JrX2xpbWl0ID49UlhfUklOR19TSVpFKSByeF93b3JrX2xpbWl0LS07CisjZW5kaWYKKworCWlmICh0dWxpcF9kZWJ1ZyA+IDQpCisJCXByaW50ayhLRVJOX0RFQlVHICIgSW4gdHVsaXBfcngoKSwgZW50cnkgJWQgJTguOHguXG4iLCBlbnRyeSwKKwkJCSAgIHRwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMpOworCisgICAgICAgZG8geworCQlpZiAoaW9yZWFkMzIodHAtPmJhc2VfYWRkciArIENTUjUpID09IDB4ZmZmZmZmZmYpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgSW4gdHVsaXBfcG9sbCgpLCBoYXJkd2FyZSBkaXNhcHBlYXJlZC5cbiIpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgICAgICAgIC8qIEFja25vd2xlZGdlIGN1cnJlbnQgUlggaW50ZXJydXB0IHNvdXJjZXMuICovCisgICAgICAgICAgICAgICBpb3dyaXRlMzIoKFJ4SW50ciB8IFJ4Tm9CdWYpLCB0cC0+YmFzZV9hZGRyICsgQ1NSNSk7CisgCisgCisgICAgICAgICAgICAgICAvKiBJZiB3ZSBvd24gdGhlIG5leHQgZW50cnksIGl0IGlzIGEgbmV3IHBhY2tldC4gU2VuZCBpdCB1cC4gKi8KKyAgICAgICAgICAgICAgIHdoaWxlICggISAodHAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyAmIGNwdV90b19sZTMyKERlc2NPd25lZCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgIHMzMiBzdGF0dXMgPSBsZTMyX3RvX2NwdSh0cC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzKTsKKyAKKyAKKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRwLT5kaXJ0eV9yeCArIFJYX1JJTkdfU0laRSA9PSB0cC0+Y3VyX3J4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworIAorICAgICAgICAgICAgICAgICAgICAgICBpZiAodHVsaXBfZGVidWcgPiA1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogSW4gdHVsaXBfcngoKSwgZW50cnkgJWQgJTguOHguXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGVudHJ5LCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS1yeF93b3JrX2xpbWl0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG5vdF9kb25lOworIAorICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHN0YXR1cyAmIDB4MzgwMDgzMDApICE9IDB4MDMwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RhdHVzICYgMHgzODAwMDMwMCkgIT0gMHgwMzAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluZ29yZSBlYXJsaWVyIGJ1ZmZlcnMuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHN0YXR1cyAmIDB4ZmZmZikgIT0gMHg3ZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0dWxpcF9kZWJ1ZyA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE92ZXJzaXplZCBFdGhlcm5ldCBmcmFtZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGFubmVkIG11bHRpcGxlIGJ1ZmZlcnMsIHN0YXR1cyAlOC44eCFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAmIFJ4RGVzY0ZhdGFsRXJyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZXJlIHdhcyBhIGZhdGFsIGVycm9yLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR1bGlwX2RlYnVnID4gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSZWNlaXZlIGVycm9yLCBSeCBzdGF0dXMgJTguOHguXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnN0YXRzLnJ4X2Vycm9ycysrOyAvKiBlbmQgb2YgYSBwYWNrZXQuKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgJiAweDA4OTApIHRwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICYgMHgwMDA0KSB0cC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICYgMHgwMDAyKSB0cC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAmIDB4MDAwMSkgdHAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9taXQgdGhlIGZvdXIgb2N0ZXQgQ1JDIGZyb20gdGhlIGxlbmd0aC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBwa3RfbGVuID0gKChzdGF0dXMgPj4gMTYpICYgMHg3ZmYpIC0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworICAKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwa3RfbGVuID4gMTUxOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEJvZ3VzIHBhY2tldCBzaXplIG9mICVkICglI3gpLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIHBrdF9sZW4sIHBrdF9sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2xlbiA9IDE1MTg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgbG9uZyBlbm91Z2ggdG8gYWNjZXB0IHdpdGhvdXQgY29weWluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGEgbWluaW1hbGx5LXNpemVkIHNrYnVmZi4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGt0X2xlbiA8IHR1bGlwX3J4X2NvcHlicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMikpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gZGV2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiX3Jlc2VydmUoc2tiLCAyKTsgICAgLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUodHAtPnBkZXYsCisJCQkJCQkJCSAgIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nLAorCQkJCQkJCQkgICBwa3RfbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworI2lmICEgZGVmaW5lZChfX2FscGhhX18pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGhfY29weV9hbmRfc3VtKHNrYiwgdHAtPnJ4X2J1ZmZlcnNbZW50cnldLnNrYi0+dGFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2xlbiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2JfcHV0KHNrYiwgcGt0X2xlbik7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHNrYl9wdXQoc2tiLCBwa3RfbGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+cnhfYnVmZmVyc1tlbnRyeV0uc2tiLT50YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9sZW4pOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UodHAtPnBkZXYsCisJCQkJCQkJCSAgICAgIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nLAorCQkJCQkJCQkgICAgICBwa3RfbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAvKiBQYXNzIHVwIHRoZSBza2IgYWxyZWFkeSBvbiB0aGUgUnggcmluZy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnRlbXAgPSBza2JfcHV0KHNrYiA9IHRwLT5yeF9idWZmZXJzW2VudHJ5XS5za2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3RfbGVuKTsKKyAgCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cC0+cnhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZyAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlMzJfdG9fY3B1KHRwLT5yeF9yaW5nW2VudHJ5XS5idWZmZXIxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBJbnRlcm5hbCBmYXVsdDogVGhlIHNrYnVmZiBhZGRyZXNzZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRvIG5vdCBtYXRjaCBpbiB0dWxpcF9yeDogJTA4eCB2cy4gJTA4bGx4ICVwIC8gJXAuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGUzMl90b19jcHUodHAtPnJ4X3JpbmdbZW50cnldLmJ1ZmZlcjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl0cC0+cnhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+aGVhZCwgdGVtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCB0cC0+cnhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtUX0JVRl9TWiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKyAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+cnhfYnVmZmVyc1tlbnRyeV0uc2tiID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKyAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQrKzsKKworICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9ICgrK3RwLT5jdXJfcngpICUgUlhfUklOR19TSVpFOworICAgICAgICAgICAgICAgICAgICAgICBpZiAodHAtPmN1cl9yeCAtIHRwLT5kaXJ0eV9yeCA+IFJYX1JJTkdfU0laRS80KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1bGlwX3JlZmlsbF9yeChkZXYpOworIAorICAgICAgICAgICAgICAgIH0KKyAKKyAgICAgICAgICAgICAgIC8qIE5ldyBhY2sgc3RyYXRlZ3kuLi4gaXJxIGRvZXMgbm90IGFjayBSeCBhbnkgbG9uZ2VyCisgICAgICAgICAgICAgICAgICBob3BlZnVsbHkgdGhpcyBoZWxwcyAqLworIAorICAgICAgICAgICAgICAgLyogUmVhbGx5IGJhZCB0aGluZ3MgY2FuIGhhcHBlbiBoZXJlLi4uIElmIG5ldyBwYWNrZXQgYXJyaXZlcworICAgICAgICAgICAgICAgICogYW5kIGFuIGlycSBhcnJpdmVzICh0eCBvciBqdXN0IGR1ZSB0byBvY2Nhc2lvbmFsbHkgdW5zZXQKKyAgICAgICAgICAgICAgICAqIG1hc2spLCBpdCB3aWxsIGJlIGFja2VkIGJ5IGlycSBoYW5kbGVyLCBidXQgbmV3IHRocmVhZAorICAgICAgICAgICAgICAgICogaXMgbm90IHNjaGVkdWxlZC4gSXQgaXMgbWFqb3IgaG9sZSBpbiBkZXNpZ24uCisgICAgICAgICAgICAgICAgKiBObyBpZGVhIGhvdyB0byBmaXggdGhpcyBpZiAicGxheWluZyB3aXRoIGZpcmUiIHdpbGwgZmFpbAorICAgICAgICAgICAgICAgICogdG9tb3Jyb3cgKG5pZ2h0IDAxMTAyOSkuIElmIGl0IHdpbGwgbm90IGZhaWwsIHdlIHdvbgorICAgICAgICAgICAgICAgICogZmluYWxseTogYW1vdW50IG9mIElPIGRpZCBub3QgaW5jcmVhc2UgYXQgYWxsLiAqLworICAgICAgIH0gd2hpbGUgKChpb3JlYWQzMih0cC0+YmFzZV9hZGRyICsgQ1NSNSkgJiBSeEludHIpKTsKKyAKK2RvbmU6CisgCisgI2lmZGVmIENPTkZJR19UVUxJUF9OQVBJX0hXX01JVElHQVRJT04KKyAgCisgICAgICAgICAgLyogV2UgdXNlIHRoaXMgc2ltcGxpc3RpYyBzY2hlbWUgZm9yIElNLiBJdCdzIHByb3ZlbiBieQorICAgICAgICAgICAgIHJlYWwgbGlmZSBpbnN0YWxsYXRpb25zLiBXZSBjYW4gaGF2ZSBJTSBlbmFibGVkCisgICAgICAgICAgICBjb250aW51ZXNseSBidXQgdGhpcyB3b3VsZCBjYXVzZSB1bm5lY2Vzc2FyeSBsYXRlbmN5LiAKKyAgICAgICAgICAgIFVuZm9ydHVuZWx5IHdlIGNhbid0IHVzZSBhbGwgdGhlIE5FVF9SWF8qIGZlZWRiYWNrIGhlcmUuIAorICAgICAgICAgICAgVGhpcyB3b3VsZCB0dXJuIG9uIElNIGZvciBkZXZpY2VzIHRoYXQgaXMgbm90IGNvbnRyaWJ1dGluZyAKKyAgICAgICAgICAgIHRvIGJhY2tsb2cgY29uZ2VzdGlvbiB3aXRoIHVubmVjZXNzYXJ5IGxhdGVuY3kuIAorICAKKyAgICAgICAgICAgICBXZSBtb25pdG9yIHRoZSB0aGUgZGV2aWNlIFJYLXJpbmcgYW5kIGhhdmU6CisgIAorICAgICAgICAgICAgIEhXIEludGVycnVwdCBNaXRpZ2F0aW9uIGVpdGhlciBPTiBvciBPRkYuCisgIAorICAgICAgICAgICAgT046ICBNb3JlIHRoZW4gMSBwa3QgcmVjZWl2ZWQgKHBlciBpbnRyLikgT1Igd2UgYXJlIGRyb3BwaW5nIAorICAgICAgICAgICAgIE9GRjogT25seSAxIHBrdCByZWNlaXZlZAorICAgICAgICAgICAgCisgICAgICAgICAgICAgTm90ZS4gV2Ugb25seSB1c2UgbWluIGFuZCBtYXggKDAsIDE1KSBzZXR0aW5ncyBmcm9tIG1pdF90YWJsZSAqLworICAKKyAgCisgICAgICAgICAgaWYoIHRwLT5mbGFncyAmICBIQVNfSU5UUl9NSVRJR0FUSU9OKSB7CisgICAgICAgICAgICAgICAgIGlmKCByZWNlaXZlZCA+IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgdHAtPm1pdF9vbiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5taXRfb24gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW93cml0ZTMyKG1pdF90YWJsZVtNSVRfVEFCTEVdLCB0cC0+YmFzZV9hZGRyICsgQ1NSMTEpOworICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRwLT5taXRfb24gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bWl0X29uID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCB0cC0+YmFzZV9hZGRyICsgQ1NSMTEpOworICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyNlbmRpZiAvKiBDT05GSUdfVFVMSVBfTkFQSV9IV19NSVRJR0FUSU9OICovCisgCisgICAgICAgICBkZXYtPnF1b3RhIC09IHJlY2VpdmVkOworICAgICAgICAgKmJ1ZGdldCAtPSByZWNlaXZlZDsKKyAKKyAgICAgICAgIHR1bGlwX3JlZmlsbF9yeChkZXYpOworICAgICAgICAgCisgICAgICAgICAvKiBJZiBSWCByaW5nIGlzIG5vdCBmdWxsIHdlIGFyZSBvdXQgb2YgbWVtb3J5LiAqLworICAgICAgICAgaWYgKHRwLT5yeF9idWZmZXJzW3RwLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRV0uc2tiID09IE5VTEwpIGdvdG8gb29tOworIAorICAgICAgICAgLyogUmVtb3ZlIHVzIGZyb20gcG9sbGluZyBsaXN0IGFuZCBlbmFibGUgUlggaW50ci4gKi8KKyAKKyAgICAgICAgIG5ldGlmX3J4X2NvbXBsZXRlKGRldik7CisgICAgICAgICBpb3dyaXRlMzIodHVsaXBfdGJsW3RwLT5jaGlwX2lkXS52YWxpZF9pbnRycywgdHAtPmJhc2VfYWRkcitDU1I3KTsKKyAKKyAgICAgICAgIC8qIFRoZSBsYXN0IG9wIGhhcHBlbnMgYWZ0ZXIgcG9sbCBjb21wbGV0aW9uLiBXaGljaCBtZWFucyB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICogMS4gaXQgY2FuIHJhY2Ugd2l0aCBkaXNhYmxpbmcgaXJxcyBpbiBpcnEgaGFuZGxlcgorICAgICAgICAgICogMi4gaXQgY2FuIHJhY2Ugd2l0aCBkaXNlL2VuYWJsaW5nIGlycXMgaW4gb3RoZXIgcG9sbCB0aHJlYWRzCisgICAgICAgICAgKiAzLiBpZiBhbiBpcnEgcmFpc2VkIGFmdGVyIGJlZ2lubmluZyBsb29wLCBpdCB3aWxsIGJlIGltbWVkaWF0ZWx5CisgICAgICAgICAgKiAgICB0cmlnZ2VyZWQgaGVyZS4KKyAgICAgICAgICAqCisgICAgICAgICAgKiBTdW1tYXJpemluZzogdGhlIGxvZ2ljIHJlc3VsdHMgaW4gc29tZSByZWR1bmRhbnQgaXJxcyBib3RoCisgICAgICAgICAgKiBkdWUgdG8gcmFjZXMgaW4gbWFza2luZyBhbmQgZHVlIHRvIHRvbyBsYXRlIGFja2luZyBvZiBhbHJlYWR5CisgICAgICAgICAgKiBwcm9jZXNzZWQgaXJxcy4gQnV0IGl0IG11c3Qgbm90IHJlc3VsdCBpbiBsb3NpbmcgZXZlbnRzLgorICAgICAgICAgICovCisgCisgICAgICAgICByZXR1cm4gMDsKKyAKKyBub3RfZG9uZToKKyAgICAgICAgIGlmICghcmVjZWl2ZWQpIHsKKworICAgICAgICAgICAgICAgICByZWNlaXZlZCA9IGRldi0+cXVvdGE7IC8qIE5vdCB0byBoYXBwZW4gKi8KKyAgICAgICAgIH0KKyAgICAgICAgIGRldi0+cXVvdGEgLT0gcmVjZWl2ZWQ7CisgICAgICAgICAqYnVkZ2V0IC09IHJlY2VpdmVkOworIAorICAgICAgICAgaWYgKHRwLT5jdXJfcnggLSB0cC0+ZGlydHlfcnggPiBSWF9SSU5HX1NJWkUvMiB8fAorICAgICAgICAgICAgIHRwLT5yeF9idWZmZXJzW3RwLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRV0uc2tiID09IE5VTEwpCisgICAgICAgICAgICAgICAgIHR1bGlwX3JlZmlsbF9yeChkZXYpOworIAorICAgICAgICAgaWYgKHRwLT5yeF9idWZmZXJzW3RwLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRV0uc2tiID09IE5VTEwpIGdvdG8gb29tOworIAorICAgICAgICAgcmV0dXJuIDE7CisgCisgCisgb29tOiAgICAvKiBFeGVjdXRlZCB3aXRoIFJYIGludHMgZGlzYWJsZWQgKi8KKyAKKyAgICAgICAgIAorICAgICAgICAgLyogU3RhcnQgdGltZXIsIHN0b3AgcG9sbGluZywgYnV0IGRvIG5vdCBlbmFibGUgcnggaW50ZXJydXB0cy4gKi8KKyAgICAgICAgIG1vZF90aW1lcigmdHAtPm9vbV90aW1lciwgamlmZmllcysxKTsKKyAgICAgICAKKyAgICAgICAgIC8qIFRoaW5rOiB0aW1lcl9wZW5kaW5nKCkgd2FzIGFuIGV4cGxpY2l0IHNpZ25hdHVyZSBvZiBidWcuCisgICAgICAgICAgKiBUaW1lciBjYW4gYmUgcGVuZGluZyBub3cgYnV0IGZpcmVkIGFuZCBjb21wbGV0ZWQKKyAgICAgICAgICAqIGJlZm9yZSB3ZSBkaWQgbmV0aWZfcnhfY29tcGxldGUoKS4gU2VlPyBXZSB3b3VsZCBsb3NlIGl0LiAqLworIAorICAgICAgICAgLyogcmVtb3ZlIG91cnNlbHZlcyBmcm9tIHRoZSBwb2xsaW5nIGxpc3QgKi8KKyAgICAgICAgIG5ldGlmX3J4X2NvbXBsZXRlKGRldik7CisgCisgICAgICAgICByZXR1cm4gMDsKK30KKworI2Vsc2UgLyogQ09ORklHX1RVTElQX05BUEkgKi8KKworc3RhdGljIGludCB0dWxpcF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5ID0gdHAtPmN1cl9yeCAlIFJYX1JJTkdfU0laRTsKKwlpbnQgcnhfd29ya19saW1pdCA9IHRwLT5kaXJ0eV9yeCArIFJYX1JJTkdfU0laRSAtIHRwLT5jdXJfcng7CisJaW50IHJlY2VpdmVkID0gMDsKKworCWlmICh0dWxpcF9kZWJ1ZyA+IDQpCisJCXByaW50ayhLRVJOX0RFQlVHICIgSW4gdHVsaXBfcngoKSwgZW50cnkgJWQgJTguOHguXG4iLCBlbnRyeSwKKwkJCSAgIHRwLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMpOworCS8qIElmIHdlIG93biB0aGUgbmV4dCBlbnRyeSwgaXQgaXMgYSBuZXcgcGFja2V0LiBTZW5kIGl0IHVwLiAqLworCXdoaWxlICggISAodHAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyAmIGNwdV90b19sZTMyKERlc2NPd25lZCkpKSB7CisJCXMzMiBzdGF0dXMgPSBsZTMyX3RvX2NwdSh0cC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzKTsKKworCQlpZiAodHVsaXBfZGVidWcgPiA1KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJbiB0dWxpcF9yeCgpLCBlbnRyeSAlZCAlOC44eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBlbnRyeSwgc3RhdHVzKTsKKwkJaWYgKC0tcnhfd29ya19saW1pdCA8IDApCisJCQlicmVhazsKKwkJaWYgKChzdGF0dXMgJiAweDM4MDA4MzAwKSAhPSAweDAzMDApIHsKKwkJCWlmICgoc3RhdHVzICYgMHgzODAwMDMwMCkgIT0gMHgwMzAwKSB7CisJCQkJLyogSW5nb3JlIGVhcmxpZXIgYnVmZmVycy4gKi8KKwkJCQlpZiAoKHN0YXR1cyAmIDB4ZmZmZikgIT0gMHg3ZmZmKSB7CisJCQkJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3ZlcnNpemVkIEV0aGVybmV0IGZyYW1lICIKKwkJCQkJCQkgICAic3Bhbm5lZCBtdWx0aXBsZSBidWZmZXJzLCBzdGF0dXMgJTguOHghXG4iLAorCQkJCQkJCSAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKwkJCQkJdHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHN0YXR1cyAmIFJ4RGVzY0ZhdGFsRXJyKSB7CisJCQkJLyogVGhlcmUgd2FzIGEgZmF0YWwgZXJyb3IuICovCisJCQkJaWYgKHR1bGlwX2RlYnVnID4gMikKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSZWNlaXZlIGVycm9yLCBSeCBzdGF0dXMgJTguOHguXG4iLAorCQkJCQkJICAgZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJCXRwLT5zdGF0cy5yeF9lcnJvcnMrKzsgLyogZW5kIG9mIGEgcGFja2V0LiovCisJCQkJaWYgKHN0YXR1cyAmIDB4MDg5MCkgdHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgMHgwMDA0KSB0cC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJaWYgKHN0YXR1cyAmIDB4MDAwMikgdHAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgMHgwMDAxKSB0cC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIE9taXQgdGhlIGZvdXIgb2N0ZXQgQ1JDIGZyb20gdGhlIGxlbmd0aC4gKi8KKwkJCXNob3J0IHBrdF9sZW4gPSAoKHN0YXR1cyA+PiAxNikgJiAweDdmZikgLSA0OworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCQlpZiAocGt0X2xlbiA+IDE1MTgpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQm9ndXMgcGFja2V0IHNpemUgb2YgJWQgKCUjeCkuXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIHBrdF9sZW4sIHBrdF9sZW4pOworCQkJCXBrdF9sZW4gPSAxNTE4OworCQkJCXRwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQl9CisjZW5kaWYKKworCQkJLyogQ2hlY2sgaWYgdGhlIHBhY2tldCBpcyBsb25nIGVub3VnaCB0byBhY2NlcHQgd2l0aG91dCBjb3B5aW5nCisJCQkgICB0byBhIG1pbmltYWxseS1zaXplZCBza2J1ZmYuICovCisJCQlpZiAocGt0X2xlbiA8IHR1bGlwX3J4X2NvcHlicmVhaworCQkJCSYmIChza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKSkgIT0gTlVMTCkgeworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLworCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdSh0cC0+cGRldiwKKwkJCQkJCQkgICAgdHAtPnJ4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcsCisJCQkJCQkJICAgIHBrdF9sZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisjaWYgISBkZWZpbmVkKF9fYWxwaGFfXykKKwkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgdHAtPnJ4X2J1ZmZlcnNbZW50cnldLnNrYi0+dGFpbCwKKwkJCQkJCSBwa3RfbGVuLCAwKTsKKwkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CisjZWxzZQorCQkJCW1lbWNweShza2JfcHV0KHNrYiwgcGt0X2xlbiksCisJCQkJICAgICAgIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5za2ItPnRhaWwsCisJCQkJICAgICAgIHBrdF9sZW4pOworI2VuZGlmCisJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHRwLT5wZGV2LAorCQkJCQkJCSAgICAgICB0cC0+cnhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZywKKwkJCQkJCQkgICAgICAgcGt0X2xlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCX0gZWxzZSB7IAkvKiBQYXNzIHVwIHRoZSBza2IgYWxyZWFkeSBvbiB0aGUgUnggcmluZy4gKi8KKwkJCQljaGFyICp0ZW1wID0gc2tiX3B1dChza2IgPSB0cC0+cnhfYnVmZmVyc1tlbnRyeV0uc2tiLAorCQkJCQkJICAgICBwa3RfbGVuKTsKKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCQkJaWYgKHRwLT5yeF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nICE9CisJCQkJICAgIGxlMzJfdG9fY3B1KHRwLT5yeF9yaW5nW2VudHJ5XS5idWZmZXIxKSkgeworCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnRlcm5hbCBmYXVsdDogVGhlIHNrYnVmZiBhZGRyZXNzZXMgIgorCQkJCQkgICAgICAgImRvIG5vdCBtYXRjaCBpbiB0dWxpcF9yeDogJTA4eCB2cy4gJUx4ICVwIC8gJXAuXG4iLAorCQkJCQkgICAgICAgZGV2LT5uYW1lLAorCQkJCQkgICAgICAgbGUzMl90b19jcHUodHAtPnJ4X3JpbmdbZW50cnldLmJ1ZmZlcjEpLAorCQkJCQkgICAgICAgKGxvbmcgbG9uZyl0cC0+cnhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZywKKwkJCQkJICAgICAgIHNrYi0+aGVhZCwgdGVtcCk7CisJCQkJfQorI2VuZGlmCisKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCB0cC0+cnhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZywKKwkJCQkJCSBQS1RfQlVGX1NaLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQkJdHAtPnJ4X2J1ZmZlcnNbZW50cnldLnNrYiA9IE5VTEw7CisJCQkJdHAtPnJ4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcgPSAwOworCQkJfQorCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworCQkJbmV0aWZfcngoc2tiKTsKKworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCXRwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQl0cC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJfQorCQlyZWNlaXZlZCsrOworCQllbnRyeSA9ICgrK3RwLT5jdXJfcngpICUgUlhfUklOR19TSVpFOworCX0KKwlyZXR1cm4gcmVjZWl2ZWQ7Cit9CisjZW5kaWYgIC8qIENPTkZJR19UVUxJUF9OQVBJICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHBoeV9pbnRlcnJ1cHQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisjaWZkZWYgX19ocHBhX18KKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBjc3IxMiA9IGlvcmVhZDMyKHRwLT5iYXNlX2FkZHIgKyBDU1IxMikgJiAweGZmOworCisJaWYgKGNzcjEyICE9IHRwLT5jc3IxMl9zaGFkb3cpIHsKKwkJLyogYWNrIGludGVycnVwdCAqLworCQlpb3dyaXRlMzIoY3NyMTIgfCAweDAyLCB0cC0+YmFzZV9hZGRyICsgQ1NSMTIpOworCQl0cC0+Y3NyMTJfc2hhZG93ID0gY3NyMTI7CisJCS8qIGRvIGxpbmsgY2hhbmdlIHN0dWZmICovCisJCXNwaW5fbG9jaygmdHAtPmxvY2spOworCQl0dWxpcF9jaGVja19kdXBsZXgoZGV2KTsKKwkJc3Bpbl91bmxvY2soJnRwLT5sb2NrKTsKKwkJLyogY2xlYXIgaXJxIGFjayBiaXQgKi8KKwkJaW93cml0ZTMyKGNzcjEyICYgfjB4MDIsIHRwLT5iYXNlX2FkZHIgKyBDU1IxMik7CisKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXMgYWxsIG9mIHRoZSBSeCB0aHJlYWQgd29yayBhbmQgY2xlYW5zIHVwCisgICBhZnRlciB0aGUgVHggdGhyZWFkLiAqLworaXJxcmV0dXJuX3QgdHVsaXBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKwlpbnQgY3NyNTsKKwlpbnQgbWlzc2VkOworCWludCByeCA9IDA7CisJaW50IHR4ID0gMDsKKwlpbnQgb2kgPSAwOworCWludCBtYXhyeCA9IFJYX1JJTkdfU0laRTsKKwlpbnQgbWF4dHggPSBUWF9SSU5HX1NJWkU7CisJaW50IG1heG9pID0gVFhfUklOR19TSVpFOworI2lmZGVmIENPTkZJR19UVUxJUF9OQVBJCisJaW50IHJ4ZCA9IDA7CisjZWxzZQorCWludCBlbnRyeTsKKyNlbmRpZgorCXVuc2lnbmVkIGludCB3b3JrX2NvdW50ID0gdHVsaXBfbWF4X2ludGVycnVwdF93b3JrOworCXVuc2lnbmVkIGludCBoYW5kbGVkID0gMDsKKworCS8qIExldCdzIHNlZSB3aGV0aGVyIHRoZSBpbnRlcnJ1cHQgcmVhbGx5IGlzIGZvciB1cyAqLworCWNzcjUgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1I1KTsKKworICAgICAgICBpZiAodHAtPmZsYWdzICYgSEFTX1BIWV9JUlEpIAorCSAgICAgICAgaGFuZGxlZCA9IHBoeV9pbnRlcnJ1cHQgKGRldik7CisgICAgCisJaWYgKChjc3I1ICYgKE5vcm1hbEludHJ8QWJub3JtYWxJbnRyKSkgPT0gMCkKKwkJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7CisKKwl0cC0+bmlyKys7CisKKwlkbyB7CisKKyNpZmRlZiBDT05GSUdfVFVMSVBfTkFQSQorCisJCWlmICghcnhkICYmIChjc3I1ICYgKFJ4SW50ciB8IFJ4Tm9CdWYpKSkgeworCQkJcnhkKys7CisJCQkvKiBNYXNrIFJYIGludHJzIGFuZCBhZGQgdGhlIGRldmljZSB0byBwb2xsIGxpc3QuICovCisJCQlpb3dyaXRlMzIodHVsaXBfdGJsW3RwLT5jaGlwX2lkXS52YWxpZF9pbnRycyZ+UnhQb2xsSW50LCBpb2FkZHIgKyBDU1I3KTsKKwkJCW5ldGlmX3J4X3NjaGVkdWxlKGRldik7CisJCQkKKwkJCWlmICghKGNzcjUmfihBYm5vcm1hbEludHJ8Tm9ybWFsSW50cnxSeFBvbGxJbnR8VFBMbmtQYXNzKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCX0KKwkJCisgICAgICAgICAgICAgICAvKiBBY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0IHNvdXJjZXMgd2UgaGFuZGxlIGhlcmUgQVNBUAorICAgICAgICAgICAgICAgICAgdGhlIHBvbGwgZnVuY3Rpb24gZG9lcyBSeCBhbmQgUnhOb0J1ZiBhY2tpbmcgKi8KKwkJCisJCWlvd3JpdGUzMihjc3I1ICYgMHgwMDAxZmYzZiwgaW9hZGRyICsgQ1NSNSk7CisKKyNlbHNlIAorCQkvKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMgQVNBUC4gKi8KKwkJaW93cml0ZTMyKGNzcjUgJiAweDAwMDFmZmZmLCBpb2FkZHIgKyBDU1I1KTsKKworCisJCWlmIChjc3I1ICYgKFJ4SW50ciB8IFJ4Tm9CdWYpKSB7CisJCQkJcnggKz0gdHVsaXBfcngoZGV2KTsKKwkJCXR1bGlwX3JlZmlsbF9yeChkZXYpOworCQl9CisKKyNlbmRpZiAvKiAgQ09ORklHX1RVTElQX05BUEkgKi8KKwkJCisJCWlmICh0dWxpcF9kZWJ1ZyA+IDQpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGludGVycnVwdCAgY3NyNT0lIzguOHggbmV3IGNzcjU9JSM4Ljh4LlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGNzcjUsIGlvcmVhZDMyKGlvYWRkciArIENTUjUpKTsKKwkJCisKKwkJaWYgKGNzcjUgJiAoVHhOb0J1ZiB8IFR4RGllZCB8IFR4SW50ciB8IFRpbWVySW50KSkgeworCQkJdW5zaWduZWQgaW50IGRpcnR5X3R4OworCisJCQlzcGluX2xvY2soJnRwLT5sb2NrKTsKKworCQkJZm9yIChkaXJ0eV90eCA9IHRwLT5kaXJ0eV90eDsgdHAtPmN1cl90eCAtIGRpcnR5X3R4ID4gMDsKKwkJCQkgZGlydHlfdHgrKykgeworCQkJCWludCBlbnRyeSA9IGRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworCQkJCWludCBzdGF0dXMgPSBsZTMyX3RvX2NwdSh0cC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzKTsKKworCQkJCWlmIChzdGF0dXMgPCAwKQorCQkJCQlicmVhazsJCQkvKiBJdCBzdGlsbCBoYXMgbm90IGJlZW4gVHhlZCAqLworCisJCQkJLyogQ2hlY2sgZm9yIFJ4IGZpbHRlciBzZXR1cCBmcmFtZXMuICovCisJCQkJaWYgKHRwLT50eF9idWZmZXJzW2VudHJ5XS5za2IgPT0gTlVMTCkgeworCQkJCQkvKiB0ZXN0IGJlY2F1c2UgZHVtbXkgZnJhbWVzIG5vdCBtYXBwZWQgKi8KKwkJCQkJaWYgKHRwLT50eF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nKQorCQkJCQkJcGNpX3VubWFwX3NpbmdsZSh0cC0+cGRldiwKKwkJCQkJCQkgdHAtPnR4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcsCisJCQkJCQkJIHNpemVvZih0cC0+c2V0dXBfZnJhbWUpLAorCQkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJaWYgKHN0YXR1cyAmIDB4ODAwMCkgeworCQkJCQkvKiBUaGVyZSB3YXMgYW4gbWFqb3IgZXJyb3IsIGxvZyBpdC4gKi8KKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQkJCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdCBlcnJvciwgVHggc3RhdHVzICU4Ljh4LlxuIiwKKwkJCQkJCQkgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisjZW5kaWYKKwkJCQkJdHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJCQlpZiAoc3RhdHVzICYgMHg0MTA0KSB0cC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQkJaWYgKHN0YXR1cyAmIDB4MEMwMCkgdHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCQkJCWlmIChzdGF0dXMgJiAweDAyMDApIHRwLT5zdGF0cy50eF93aW5kb3dfZXJyb3JzKys7CisJCQkJCWlmIChzdGF0dXMgJiAweDAwMDIpIHRwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJCQlpZiAoKHN0YXR1cyAmIDB4MDA4MCkgJiYgdHAtPmZ1bGxfZHVwbGV4ID09IDApCisJCQkJCQl0cC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycysrOworCQkJCX0gZWxzZSB7CisJCQkJCXRwLT5zdGF0cy50eF9ieXRlcyArPQorCQkJCQkJdHAtPnR4X2J1ZmZlcnNbZW50cnldLnNrYi0+bGVuOworCQkJCQl0cC0+c3RhdHMuY29sbGlzaW9ucyArPSAoc3RhdHVzID4+IDMpICYgMTU7CisJCQkJCXRwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQkJfQorCisJCQkJcGNpX3VubWFwX3NpbmdsZSh0cC0+cGRldiwgdHAtPnR4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcsCisJCQkJCQkgdHAtPnR4X2J1ZmZlcnNbZW50cnldLnNrYi0+bGVuLAorCQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCQkJLyogRnJlZSB0aGUgb3JpZ2luYWwgc2tiLiAqLworCQkJCWRldl9rZnJlZV9za2JfaXJxKHRwLT50eF9idWZmZXJzW2VudHJ5XS5za2IpOworCQkJCXRwLT50eF9idWZmZXJzW2VudHJ5XS5za2IgPSBOVUxMOworCQkJCXRwLT50eF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nID0gMDsKKwkJCQl0eCsrOworCQkJfQorCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkJCWlmICh0cC0+Y3VyX3R4IC0gZGlydHlfdHggPiBUWF9SSU5HX1NJWkUpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQtb2Ytc3luYyBkaXJ0eSBwb2ludGVyLCAlZCB2cy4gJWQuXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIGRpcnR5X3R4LCB0cC0+Y3VyX3R4KTsKKwkJCQlkaXJ0eV90eCArPSBUWF9SSU5HX1NJWkU7CisJCQl9CisjZW5kaWYKKworCQkJaWYgKHRwLT5jdXJfdHggLSBkaXJ0eV90eCA8IFRYX1JJTkdfU0laRSAtIDIpCisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJCQl0cC0+ZGlydHlfdHggPSBkaXJ0eV90eDsKKwkJCWlmIChjc3I1ICYgVHhEaWVkKSB7CisJCQkJaWYgKHR1bGlwX2RlYnVnID4gMikKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRoZSB0cmFuc21pdHRlciBzdG9wcGVkLiIKKwkJCQkJCSAgICIgIENTUjUgaXMgJXgsIENTUjYgJXgsIG5ldyBDU1I2ICV4LlxuIiwKKwkJCQkJCSAgIGRldi0+bmFtZSwgY3NyNSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSNiksIHRwLT5jc3I2KTsKKwkJCQl0dWxpcF9yZXN0YXJ0X3J4dHgodHApOworCQkJfQorCQkJc3Bpbl91bmxvY2soJnRwLT5sb2NrKTsKKwkJfQorCisJCS8qIExvZyBlcnJvcnMuICovCisJCWlmIChjc3I1ICYgQWJub3JtYWxJbnRyKSB7CS8qIEFibm9ybWFsIGVycm9yIHN1bW1hcnkgYml0LiAqLworCQkJaWYgKGNzcjUgPT0gMHhmZmZmZmZmZikKKwkJCQlicmVhazsKKwkJCWlmIChjc3I1ICYgVHhKYWJiZXIpIHRwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmIChjc3I1ICYgVHhGSUZPVW5kZXJmbG93KSB7CisJCQkJaWYgKCh0cC0+Y3NyNiAmIDB4QzAwMCkgIT0gMHhDMDAwKQorCQkJCQl0cC0+Y3NyNiArPSAweDQwMDA7CS8qIEJ1bXAgdXAgdGhlIFR4IHRocmVzaG9sZCAqLworCQkJCWVsc2UKKwkJCQkJdHAtPmNzcjYgfD0gMHgwMDIwMDAwMDsgIC8qIFN0b3JlLW4tZm9yd2FyZC4gKi8KKwkJCQkvKiBSZXN0YXJ0IHRoZSB0cmFuc21pdCBwcm9jZXNzLiAqLworCQkJCXR1bGlwX3Jlc3RhcnRfcnh0eCh0cCk7CisJCQkJaW93cml0ZTMyKDAsIGlvYWRkciArIENTUjEpOworCQkJfQorCQkJaWYgKGNzcjUgJiAoUnhEaWVkIHwgUnhOb0J1ZikpIHsKKwkJCQlpZiAodHAtPmZsYWdzICYgQ09NRVRfTUFDX0FERFIpIHsKKwkJCQkJaW93cml0ZTMyKHRwLT5tY19maWx0ZXJbMF0sIGlvYWRkciArIDB4QUMpOworCQkJCQlpb3dyaXRlMzIodHAtPm1jX2ZpbHRlclsxXSwgaW9hZGRyICsgMHhCMCk7CisJCQkJfQorCQkJfQorCQkJaWYgKGNzcjUgJiBSeERpZWQpIHsJCS8qIE1pc3NlZCBhIFJ4IGZyYW1lLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBpb3JlYWQzMihpb2FkZHIgKyBDU1I4KSAmIDB4ZmZmZjsKKwkJCQl0cC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJdHVsaXBfc3RhcnRfcnh0eCh0cCk7CisJCQl9CisJCQkvKgorCQkJICogTkI6IHQyMTE0Ml9sbmtfY2hhbmdlKCkgZG9lcyBhIGRlbF90aW1lcl9zeW5jKCksIHNvIGJlIGNhcmVmdWwgaWYgdGhpcworCQkJICogY2FsbCBpcyBldmVyIGRvbmUgdW5kZXIgdGhlIHNwaW5sb2NrCisJCQkgKi8KKwkJCWlmIChjc3I1ICYgKFRQTG5rUGFzcyB8IFRQTG5rRmFpbCB8IDB4MDgwMDAwMDApKSB7CisJCQkJaWYgKHRwLT5saW5rX2NoYW5nZSkKKwkJCQkJKHRwLT5saW5rX2NoYW5nZSkoZGV2LCBjc3I1KTsKKwkJCX0KKwkJCWlmIChjc3I1ICYgU3l0ZW1FcnJvcikgeworCQkJCWludCBlcnJvciA9IChjc3I1ID4+IDIzKSAmIDc7CisJCQkJLyogb29wcywgd2UgaGl0IGEgUENJIGVycm9yLiAgVGhlIGNvZGUgcHJvZHVjZWQgY29ycmVzcG9uZHMKKwkJCQkgKiB0byB0aGUgcmVhc29uOgorCQkJCSAqICAwIC0gcGFyaXR5IGVycm9yCisJCQkJICogIDEgLSBtYXN0ZXIgYWJvcnQKKwkJCQkgKiAgMiAtIHRhcmdldCBhYm9ydAorCQkJCSAqIE5vdGUgdGhhdCBvbiBwYXJpdHkgZXJyb3IsIHdlIHNob3VsZCBkbyBhIHNvZnR3YXJlIHJlc2V0CisJCQkJICogb2YgdGhlIGNoaXAgdG8gZ2V0IGl0IGJhY2sgaW50byBhIHNhbmUgc3RhdGUgKGFjY29yZGluZworCQkJCSAqIHRvIHRoZSAyMTE0Mi8zIGRvY3MgdGhhdCBpcykuCisJCQkJICogICAtLSBybWsKKwkJCQkgKi8KKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAoJWx1KSBTeXN0ZW0gRXJyb3Igb2NjdXJyZWQgKCVkKVxuIiwKKwkJCQkJZGV2LT5uYW1lLCB0cC0+bmlyLCBlcnJvcik7CisJCQl9CisJCQkvKiBDbGVhciBhbGwgZXJyb3Igc291cmNlcywgaW5jbHVkZWQgdW5kb2N1bWVudGVkIG9uZXMhICovCisJCQlpb3dyaXRlMzIoMHgwODAwZjdiYSwgaW9hZGRyICsgQ1NSNSk7CisJCQlvaSsrOworCQl9CisJCWlmIChjc3I1ICYgVGltZXJJbnQpIHsKKworCQkJaWYgKHR1bGlwX2RlYnVnID4gMikKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBSZS1lbmFibGluZyBpbnRlcnJ1cHRzLCAlOC44eC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgY3NyNSk7CisJCQlpb3dyaXRlMzIodHVsaXBfdGJsW3RwLT5jaGlwX2lkXS52YWxpZF9pbnRycywgaW9hZGRyICsgQ1NSNyk7CisJCQl0cC0+dHRpbWVyID0gMDsKKwkJCW9pKys7CisJCX0KKwkJaWYgKHR4ID4gbWF4dHggfHwgcnggPiBtYXhyeCB8fCBvaSA+IG1heG9pKSB7CisJCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUb28gbXVjaCB3b3JrIGR1cmluZyBhbiBpbnRlcnJ1cHQsICIKKwkJCQkJICAgImNzcjU9MHglOC44eC4gKCVsdSkgKCVkLCVkLCVkKVxuIiwgZGV2LT5uYW1lLCBjc3I1LCB0cC0+bmlyLCB0eCwgcngsIG9pKTsKKworICAgICAgICAgICAgICAgICAgICAgICAvKiBBY2tub3dsZWRnZSBhbGwgaW50ZXJydXB0IHNvdXJjZXMuICovCisgICAgICAgICAgICAgICAgICAgICAgICBpb3dyaXRlMzIoMHg4MDAxZmZmZiwgaW9hZGRyICsgQ1NSNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHAtPmZsYWdzICYgSEFTX0lOVFJfTUlUSUdBVElPTikgeworICAgICAgICAgICAgICAgICAgICAgLyogSm9zaXAgTG9uY2FyaWMgYXQgSUNBU0UgZGlkIGV4dGVuc2l2ZSBleHBlcmltZW50YXRpb24KKwkJCXRvIGRldmVsb3AgYSBnb29kIGludGVycnVwdCBtaXRpZ2F0aW9uIHNldHRpbmcuKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW93cml0ZTMyKDB4OGIyNDAwMDAsIGlvYWRkciArIENTUjExKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHAtPmNoaXBfaWQgPT0gTEM4MkMxNjgpIHsKKwkJCQkvKiB0aGUgTEM4MkMxNjggZG9lc24ndCBoYXZlIGEgaHcgdGltZXIuKi8KKwkJCQlpb3dyaXRlMzIoMHgwMCwgaW9hZGRyICsgQ1NSNyk7CisJCQkJbW9kX3RpbWVyKCZ0cC0+dGltZXIsIFJVTl9BVChIWi81MCkpOworCQkJfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFzayBhbGwgaW50ZXJydXB0aW5nIHNvdXJjZXMsIHNldCB0aW1lciB0bworCQkJCXJlLWVuYWJsZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW93cml0ZTMyKCgofmNzcjUpICYgMHgwMDAxZWJlZikgfCBBYm5vcm1hbEludHIgfCBUaW1lckludCwgaW9hZGRyICsgQ1NSNyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvd3JpdGUzMigweDAwMTIsIGlvYWRkciArIENTUjExKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCWJyZWFrOworCQl9CisKKwkJd29ya19jb3VudC0tOworCQlpZiAod29ya19jb3VudCA9PSAwKQorCQkJYnJlYWs7CisKKwkJY3NyNSA9IGlvcmVhZDMyKGlvYWRkciArIENTUjUpOworCisjaWZkZWYgQ09ORklHX1RVTElQX05BUEkKKwkJaWYgKHJ4ZCkKKwkJCWNzcjUgJj0gflJ4UG9sbEludDsKKwl9IHdoaWxlICgoY3NyNSAmIChUeE5vQnVmIHwgCisJCQkgIFR4RGllZCB8IAorCQkJICBUeEludHIgfCAKKwkJCSAgVGltZXJJbnQgfAorCQkJICAvKiBBYm5vcm1hbCBpbnRyLiAqLworCQkJICBSeERpZWQgfCAKKwkJCSAgVHhGSUZPVW5kZXJmbG93IHwgCisJCQkgIFR4SmFiYmVyIHwgCisJCQkgIFRQTG5rRmFpbCB8ICAKKwkJCSAgU3l0ZW1FcnJvciApKSAhPSAwKTsKKyNlbHNlIAorCX0gd2hpbGUgKChjc3I1ICYgKE5vcm1hbEludHJ8QWJub3JtYWxJbnRyKSkgIT0gMCk7CisKKwl0dWxpcF9yZWZpbGxfcngoZGV2KTsKKworCS8qIGNoZWNrIGlmIHRoZSBjYXJkIGlzIGluIHN1c3BlbmQgbW9kZSAqLworCWVudHJ5ID0gdHAtPmRpcnR5X3J4ICUgUlhfUklOR19TSVpFOworCWlmICh0cC0+cnhfYnVmZmVyc1tlbnRyeV0uc2tiID09IE5VTEwpIHsKKwkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpbiByeCBzdXNwZW5kIG1vZGU6ICglbHUpICh0cC0+Y3VyX3J4ID0gJXUsIHR0aW1lciA9ICVkLCByeCA9ICVkKSBnby9zdGF5IGluIHN1c3BlbmQgbW9kZVxuIiwgZGV2LT5uYW1lLCB0cC0+bmlyLCB0cC0+Y3VyX3J4LCB0cC0+dHRpbWVyLCByeCk7CisJCWlmICh0cC0+Y2hpcF9pZCA9PSBMQzgyQzE2OCkgeworCQkJaW93cml0ZTMyKDB4MDAsIGlvYWRkciArIENTUjcpOworCQkJbW9kX3RpbWVyKCZ0cC0+dGltZXIsIFJVTl9BVChIWi81MCkpOworCQl9IGVsc2UgeworCQkJaWYgKHRwLT50dGltZXIgPT0gMCB8fCAoaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTEpICYgMHhmZmZmKSA9PSAwKSB7CisJCQkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGluIHJ4IHN1c3BlbmQgbW9kZTogKCVsdSkgc2V0IHRpbWVyXG4iLCBkZXYtPm5hbWUsIHRwLT5uaXIpOworCQkJCWlvd3JpdGUzMih0dWxpcF90YmxbdHAtPmNoaXBfaWRdLnZhbGlkX2ludHJzIHwgVGltZXJJbnQsCisJCQkJCWlvYWRkciArIENTUjcpOworCQkJCWlvd3JpdGUzMihUaW1lckludCwgaW9hZGRyICsgQ1NSNSk7CisJCQkJaW93cml0ZTMyKDEyLCBpb2FkZHIgKyBDU1IxMSk7CisJCQkJdHAtPnR0aW1lciA9IDE7CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLyogQ09ORklHX1RVTElQX05BUEkgKi8KKworCWlmICgobWlzc2VkID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSOCkgJiAweDFmZmZmKSkgeworCQl0cC0+c3RhdHMucnhfZHJvcHBlZCArPSBtaXNzZWQgJiAweDEwMDAwID8gMHgxMDAwMCA6IG1pc3NlZDsKKwl9CisKKwlpZiAodHVsaXBfZGVidWcgPiA0KQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4aXRpbmcgaW50ZXJydXB0LCBjc3I1PSUjNC40eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGlvcmVhZDMyKGlvYWRkciArIENTUjUpKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL21lZGlhLmMgYi9kcml2ZXJzL25ldC90dWxpcC9tZWRpYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYWUwOWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC9tZWRpYS5jCkBAIC0wLDAgKzEsNTYyIEBACisvKgorCWRyaXZlcnMvbmV0L3R1bGlwL21lZGlhLmMKKworCU1haW50YWluZWQgYnkgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorCUNvcHlyaWdodCAyMDAwLDIwMDEgIFRoZSBMaW51eCBLZXJuZWwgVGVhbQorCVdyaXR0ZW4vY29weXJpZ2h0IDE5OTQtMjAwMSBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlQbGVhc2UgcmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3R1bGlwLXVzZXIue3BkZixwcyxodG1sfQorCWZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgZHJpdmVyLCBvciB2aXNpdCB0aGUgcHJvamVjdAorCVdlYiBwYWdlIGF0IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvdHVsaXAvCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlICJ0dWxpcC5oIgorCisKKy8qIFRoZSBtYXhpbXVtIGRhdGEgY2xvY2sgcmF0ZSBpcyAyLjUgTWh6LiAgVGhlIG1pbmltdW0gdGltaW5nIGlzIHVzdWFsbHkKKyAgIG1ldCBieSBiYWNrLXRvLWJhY2sgUENJIEkvTyBjeWNsZXMsIGJ1dCB3ZSBpbnNlcnQgYSBkZWxheSB0byBhdm9pZAorICAgIm92ZXJjbG9ja2luZyIgaXNzdWVzIG9yIGZ1dHVyZSA2Nk1oeiBQQ0kuICovCisjZGVmaW5lIG1kaW9fZGVsYXkoKSBpb3JlYWQzMihtZGlvX2FkZHIpCisKKy8qIFJlYWQgYW5kIHdyaXRlIHRoZSBNSUkgcmVnaXN0ZXJzIHVzaW5nIHNvZnR3YXJlLWdlbmVyYXRlZCBzZXJpYWwKKyAgIE1ESU8gcHJvdG9jb2wuICBJdCBpcyBqdXN0IGRpZmZlcmVudCBlbm91Z2ggZnJvbSB0aGUgRUVQUk9NIHByb3RvY29sCisgICB0byBub3Qgc2hhcmUgY29kZS4gIFRoZSBtYXhpdW0gZGF0YSBjbG9jayByYXRlIGlzIDIuNSBNaHouICovCisjZGVmaW5lIE1ESU9fU0hJRlRfQ0xLCQkweDEwMDAwCisjZGVmaW5lIE1ESU9fREFUQV9XUklURTAJMHgwMDAwMAorI2RlZmluZSBNRElPX0RBVEFfV1JJVEUxCTB4MjAwMDAKKyNkZWZpbmUgTURJT19FTkIJCTB4MDAwMDAgLyogSWdub3JlIHRoZSAweDAyMDAwIGRhdGFib29rIHNldHRpbmcuICovCisjZGVmaW5lIE1ESU9fRU5CX0lOCQkweDQwMDAwCisjZGVmaW5lIE1ESU9fREFUQV9SRUFECQkweDgwMDAwCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGNvbWV0X21paXJlZzJvZmZzZXRbMzJdID0geworCTB4QjQsIDB4QjgsIDB4QkMsIDB4QzAsICAweEM0LCAweEM4LCAweENDLCAwLCAgMCwwLDAsMCwgIDAsMCwwLDAsCisJMCwweEQwLDAsMCwgIDAsMCwwLDAsICAwLDAsMCwwLCAwLCAweEQ0LCAweEQ4LCAweERDLCB9OworCisKKy8qIE1JSSB0cmFuc2NlaXZlciBjb250cm9sIHNlY3Rpb24uCisgICBSZWFkIGFuZCB3cml0ZSB0aGUgTUlJIHJlZ2lzdGVycyB1c2luZyBzb2Z0d2FyZS1nZW5lcmF0ZWQgc2VyaWFsCisgICBNRElPIHByb3RvY29sLiAgU2VlIHRoZSBNSUkgc3BlY2lmaWNhdGlvbnMgb3IgRFA4Mzg0MEEgZGF0YSBzaGVldAorICAgZm9yIGRldGFpbHMuICovCisKK2ludCB0dWxpcF9tZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisJaW50IHJlYWRfY21kID0gKDB4ZjYgPDwgMTApIHwgKChwaHlfaWQgJiAweDFmKSA8PCA1KSB8IGxvY2F0aW9uOworCWludCByZXR2YWwgPSAwOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKwl2b2lkIF9faW9tZW0gKm1kaW9fYWRkciA9IGlvYWRkciArIENTUjk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChsb2NhdGlvbiAmIH4weDFmKQorCQlyZXR1cm4gMHhmZmZmOworCisJaWYgKHRwLT5jaGlwX2lkID09IENPTUVUICAmJiAgcGh5X2lkID09IDMwKSB7CisJCWlmIChjb21ldF9taWlyZWcyb2Zmc2V0W2xvY2F0aW9uXSkKKwkJCXJldHVybiBpb3JlYWQzMihpb2FkZHIgKyBjb21ldF9taWlyZWcyb2Zmc2V0W2xvY2F0aW9uXSk7CisJCXJldHVybiAweGZmZmY7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5taWlfbG9jaywgZmxhZ3MpOworCWlmICh0cC0+Y2hpcF9pZCA9PSBMQzgyQzE2OCkgeworCQlpbnQgaSA9IDEwMDA7CisJCWlvd3JpdGUzMigweDYwMDIwMDAwICsgKHBoeV9pZDw8MjMpICsgKGxvY2F0aW9uPDwxOCksIGlvYWRkciArIDB4QTApOworCQlpb3JlYWQzMihpb2FkZHIgKyAweEEwKTsKKwkJaW9yZWFkMzIoaW9hZGRyICsgMHhBMCk7CisJCXdoaWxlICgtLWkgPiAwKSB7CisJCQliYXJyaWVyKCk7CisJCQlpZiAoICEgKChyZXR2YWwgPSBpb3JlYWQzMihpb2FkZHIgKyAweEEwKSkgJiAweDgwMDAwMDAwKSkKKwkJCQlicmVhazsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bWlpX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHJldHZhbCAmIDB4ZmZmZjsKKwl9CisKKwlpZih0cC0+Y2hpcF9pZCA9PSBVTEk1MjZYICYmIHRwLT5yZXZpc2lvbiA+PSAweDQwKSB7CisJCWludCB2YWx1ZTsKKwkJaW50IGkgPSAxMDAwOworCQkKKwkJdmFsdWUgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1I5KTsKKwkJaW93cml0ZTMyKHZhbHVlICYgMHhGRkVGRkZGRiwgaW9hZGRyICsgQ1NSOSk7CisJCQorCQl2YWx1ZSA9IChwaHlfaWQgPDwgMjEpIHwgKGxvY2F0aW9uIDw8IDE2KSB8IDB4MDgwMDAwMDA7CisJCWlvd3JpdGUzMih2YWx1ZSwgaW9hZGRyICsgQ1NSMTApOworCQkKKwkJd2hpbGUoLS1pID4gMCkgeworCQkJbWRpb19kZWxheSgpOworCQkJaWYoaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTApICYgMHgxMDAwMDAwMCkKKwkJCQlicmVhazsKKwkJfQorCQlyZXR2YWwgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1IxMCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5taWlfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmV0dmFsICYgMHhGRkZGOworCX0KKwkvKiBFc3RhYmxpc2ggc3luYyBieSBzZW5kaW5nIGF0IGxlYXN0IDMyIGxvZ2ljIG9uZXMuICovCisJZm9yIChpID0gMzI7IGkgPj0gMDsgaS0tKSB7CisJCWlvd3JpdGUzMihNRElPX0VOQiB8IE1ESU9fREFUQV9XUklURTEsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJaW93cml0ZTMyKE1ESU9fRU5CIHwgTURJT19EQVRBX1dSSVRFMSB8IE1ESU9fU0hJRlRfQ0xLLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJfQorCS8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKSB7CisJCWludCBkYXRhdmFsID0gKHJlYWRfY21kICYgKDEgPDwgaSkpID8gTURJT19EQVRBX1dSSVRFMSA6IDA7CisKKwkJaW93cml0ZTMyKE1ESU9fRU5CIHwgZGF0YXZhbCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlpb3dyaXRlMzIoTURJT19FTkIgfCBkYXRhdmFsIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJLyogUmVhZCB0aGUgdHdvIHRyYW5zaXRpb24sIDE2IGRhdGEsIGFuZCB3aXJlLWlkbGUgYml0cy4gKi8KKwlmb3IgKGkgPSAxOTsgaSA+IDA7IGktLSkgeworCQlpb3dyaXRlMzIoTURJT19FTkJfSU4sIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW9yZWFkMzIobWRpb19hZGRyKSAmIE1ESU9fREFUQV9SRUFEKSA/IDEgOiAwKTsKKwkJaW93cml0ZTMyKE1ESU9fRU5CX0lOIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bWlpX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gKHJldHZhbD4+MSkgJiAweGZmZmY7Cit9CisKK3ZvaWQgdHVsaXBfbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWwpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwlpbnQgY21kID0gKDB4NTAwMiA8PCAxNikgfCAoKHBoeV9pZCAmIDB4MWYpIDw8IDIzKSB8IChsb2NhdGlvbjw8MTgpIHwgKHZhbCAmIDB4ZmZmZik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCXZvaWQgX19pb21lbSAqbWRpb19hZGRyID0gaW9hZGRyICsgQ1NSOTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGxvY2F0aW9uICYgfjB4MWYpCisJCXJldHVybjsKKworCWlmICh0cC0+Y2hpcF9pZCA9PSBDT01FVCAmJiBwaHlfaWQgPT0gMzApIHsKKwkJaWYgKGNvbWV0X21paXJlZzJvZmZzZXRbbG9jYXRpb25dKQorCQkJaW93cml0ZTMyKHZhbCwgaW9hZGRyICsgY29tZXRfbWlpcmVnMm9mZnNldFtsb2NhdGlvbl0pOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5taWlfbG9jaywgZmxhZ3MpOworCWlmICh0cC0+Y2hpcF9pZCA9PSBMQzgyQzE2OCkgeworCQlpbnQgaSA9IDEwMDA7CisJCWlvd3JpdGUzMihjbWQsIGlvYWRkciArIDB4QTApOworCQlkbyB7CisJCQliYXJyaWVyKCk7CisJCQlpZiAoICEgKGlvcmVhZDMyKGlvYWRkciArIDB4QTApICYgMHg4MDAwMDAwMCkpCisJCQkJYnJlYWs7CisJCX0gd2hpbGUgKC0taSA+IDApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bWlpX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodHAtPmNoaXBfaWQgPT0gVUxJNTI2WCAmJiB0cC0+cmV2aXNpb24gPj0gMHg0MCkgeworCQlpbnQgdmFsdWU7CisJCWludCBpID0gMTAwMDsKKwkJCisJCXZhbHVlID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSOSk7CisJCWlvd3JpdGUzMih2YWx1ZSAmIDB4RkZFRkZGRkYsIGlvYWRkciArIENTUjkpOworCQkKKwkJdmFsdWUgPSAocGh5X2lkIDw8IDIxKSB8IChsb2NhdGlvbiA8PCAxNikgfCAweDA0MDAwMDAwIHwgKHZhbCAmIDB4RkZGRik7CisJCWlvd3JpdGUzMih2YWx1ZSwgaW9hZGRyICsgQ1NSMTApOworCQkKKwkJd2hpbGUoLS1pID4gMCkgeworCQkJaWYgKGlvcmVhZDMyKGlvYWRkciArIENTUjEwKSAmIDB4MTAwMDAwMDApCisJCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPm1paV9sb2NrLCBmbGFncyk7CisJfQorCQkKKwkvKiBFc3RhYmxpc2ggc3luYyBieSBzZW5kaW5nIDMyIGxvZ2ljIG9uZXMuICovCisJZm9yIChpID0gMzI7IGkgPj0gMDsgaS0tKSB7CisJCWlvd3JpdGUzMihNRElPX0VOQiB8IE1ESU9fREFUQV9XUklURTEsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJaW93cml0ZTMyKE1ESU9fRU5CIHwgTURJT19EQVRBX1dSSVRFMSB8IE1ESU9fU0hJRlRfQ0xLLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJfQorCS8qIFNoaWZ0IHRoZSBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDMxOyBpID49IDA7IGktLSkgeworCQlpbnQgZGF0YXZhbCA9IChjbWQgJiAoMSA8PCBpKSkgPyBNRElPX0RBVEFfV1JJVEUxIDogMDsKKwkJaW93cml0ZTMyKE1ESU9fRU5CIHwgZGF0YXZhbCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlpb3dyaXRlMzIoTURJT19FTkIgfCBkYXRhdmFsIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJLyogQ2xlYXIgb3V0IGV4dHJhIGJpdHMuICovCisJZm9yIChpID0gMjsgaSA+IDA7IGktLSkgeworCQlpb3dyaXRlMzIoTURJT19FTkJfSU4sIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJaW93cml0ZTMyKE1ESU9fRU5CX0lOIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bWlpX2xvY2ssIGZsYWdzKTsKK30KKworCisvKiBTZXQgdXAgdGhlIHRyYW5zY2VpdmVyIGNvbnRyb2wgcmVnaXN0ZXJzIGZvciB0aGUgc2VsZWN0ZWQgbWVkaWEgdHlwZS4gKi8KK3ZvaWQgdHVsaXBfc2VsZWN0X21lZGlhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdGFydHVwKQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCXN0cnVjdCBtZWRpYXRhYmxlICptdGFibGUgPSB0cC0+bXRhYmxlOworCXUzMiBuZXdfY3NyNjsKKwlpbnQgaTsKKworCWlmIChtdGFibGUpIHsKKwkJc3RydWN0IG1lZGlhbGVhZiAqbWxlYWYgPSAmbXRhYmxlLT5tbGVhZlt0cC0+Y3VyX2luZGV4XTsKKwkJdW5zaWduZWQgY2hhciAqcCA9IG1sZWFmLT5sZWFmZGF0YTsKKwkJc3dpdGNoIChtbGVhZi0+dHlwZSkgeworCQljYXNlIDA6CQkJCQkvKiAyMTE0MCBub24tTUlJIHhjdnIuICovCisJCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVXNpbmcgYSAyMTE0MCBub24tTUlJIHRyYW5zY2VpdmVyIgorCQkJCQkgICAiIHdpdGggY29udHJvbCBzZXR0aW5nICUyLjJ4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBwWzFdKTsKKwkJCWRldi0+aWZfcG9ydCA9IHBbMF07CisJCQlpZiAoc3RhcnR1cCkKKwkJCQlpb3dyaXRlMzIobXRhYmxlLT5jc3IxMmRpciB8IDB4MTAwLCBpb2FkZHIgKyBDU1IxMik7CisJCQlpb3dyaXRlMzIocFsxXSwgaW9hZGRyICsgQ1NSMTIpOworCQkJbmV3X2NzcjYgPSAweDAyMDAwMDAwIHwgKChwWzJdICYgMHg3MSkgPDwgMTgpOworCQkJYnJlYWs7CisJCWNhc2UgMjogY2FzZSA0OiB7CisJCQl1MTYgc2V0dXBbNV07CisJCQl1MzIgY3NyMTN2YWwsIGNzcjE0dmFsLCBjc3IxNWRpciwgY3NyMTV2YWw7CisJCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQkJCXNldHVwW2ldID0gZ2V0X3UxNigmcFtpKjIgKyAxXSk7CisKKwkJCWRldi0+aWZfcG9ydCA9IHBbMF0gJiBNRURJQV9NQVNLOworCQkJaWYgKHR1bGlwX21lZGlhX2NhcFtkZXYtPmlmX3BvcnRdICYgTWVkaWFBbHdheXNGRCkKKwkJCQl0cC0+ZnVsbF9kdXBsZXggPSAxOworCisJCQlpZiAoc3RhcnR1cCAmJiBtdGFibGUtPmhhc19yZXNldCkgeworCQkJCXN0cnVjdCBtZWRpYWxlYWYgKnJsZWFmID0gJm10YWJsZS0+bWxlYWZbbXRhYmxlLT5oYXNfcmVzZXRdOworCQkJCXVuc2lnbmVkIGNoYXIgKnJzdCA9IHJsZWFmLT5sZWFmZGF0YTsKKwkJCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlc2V0dGluZyB0aGUgdHJhbnNjZWl2ZXIuXG4iLAorCQkJCQkJICAgZGV2LT5uYW1lKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgcnN0WzBdOyBpKyspCisJCQkJCWlvd3JpdGUzMihnZXRfdTE2KHJzdCArIDEgKyAoaTw8MSkpIDw8IDE2LCBpb2FkZHIgKyBDU1IxNSk7CisJCQl9CisJCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogMjExNDMgbm9uLU1JSSAlcyB0cmFuc2NlaXZlciBjb250cm9sICIKKwkJCQkJICAgIiU0LjR4LyU0LjR4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSwgc2V0dXBbMF0sIHNldHVwWzFdKTsKKwkJCWlmIChwWzBdICYgMHg0MCkgewkvKiBTSUEgKENTUjEzLTE1KSBzZXR1cCB2YWx1ZXMgYXJlIHByb3ZpZGVkLiAqLworCQkJCWNzcjEzdmFsID0gc2V0dXBbMF07CisJCQkJY3NyMTR2YWwgPSBzZXR1cFsxXTsKKwkJCQljc3IxNWRpciA9IChzZXR1cFszXTw8MTYpIHwgc2V0dXBbMl07CisJCQkJY3NyMTV2YWwgPSAoc2V0dXBbNF08PDE2KSB8IHNldHVwWzJdOworCQkJCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBDU1IxMyk7CisJCQkJaW93cml0ZTMyKGNzcjE0dmFsLCBpb2FkZHIgKyBDU1IxNCk7CisJCQkJaW93cml0ZTMyKGNzcjE1ZGlyLCBpb2FkZHIgKyBDU1IxNSk7CS8qIERpcmVjdGlvbiAqLworCQkJCWlvd3JpdGUzMihjc3IxNXZhbCwgaW9hZGRyICsgQ1NSMTUpOwkvKiBEYXRhICovCisJCQkJaW93cml0ZTMyKGNzcjEzdmFsLCBpb2FkZHIgKyBDU1IxMyk7CisJCQl9IGVsc2UgeworCQkJCWNzcjEzdmFsID0gMTsKKwkJCQljc3IxNHZhbCA9IDA7CisJCQkJY3NyMTVkaXIgPSAoc2V0dXBbMF08PDE2KSB8IDB4MDAwODsKKwkJCQljc3IxNXZhbCA9IChzZXR1cFsxXTw8MTYpIHwgMHgwMDA4OworCQkJCWlmIChkZXYtPmlmX3BvcnQgPD0gNCkKKwkJCQkJY3NyMTR2YWwgPSB0MjExNDJfY3NyMTRbZGV2LT5pZl9wb3J0XTsKKwkJCQlpZiAoc3RhcnR1cCkgeworCQkJCQlpb3dyaXRlMzIoMCwgaW9hZGRyICsgQ1NSMTMpOworCQkJCQlpb3dyaXRlMzIoY3NyMTR2YWwsIGlvYWRkciArIENTUjE0KTsKKwkJCQl9CisJCQkJaW93cml0ZTMyKGNzcjE1ZGlyLCBpb2FkZHIgKyBDU1IxNSk7CS8qIERpcmVjdGlvbiAqLworCQkJCWlvd3JpdGUzMihjc3IxNXZhbCwgaW9hZGRyICsgQ1NSMTUpOwkvKiBEYXRhICovCisJCQkJaWYgKHN0YXJ0dXApIGlvd3JpdGUzMihjc3IxM3ZhbCwgaW9hZGRyICsgQ1NSMTMpOworCQkJfQorCQkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICBTZXR0aW5nIENTUjE1IHRvICU4Ljh4LyU4Ljh4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBjc3IxNWRpciwgY3NyMTV2YWwpOworCQkJaWYgKG1sZWFmLT50eXBlID09IDQpCisJCQkJbmV3X2NzcjYgPSAweDgyMDIwMDAwIHwgKChzZXR1cFsyXSAmIDB4NzEpIDw8IDE4KTsKKwkJCWVsc2UKKwkJCQluZXdfY3NyNiA9IDB4ODI0MjAwMDA7CisJCQlicmVhazsKKwkJfQorCQljYXNlIDE6IGNhc2UgMzogeworCQkJaW50IHBoeV9udW0gPSBwWzBdOworCQkJaW50IGluaXRfbGVuZ3RoID0gcFsxXTsKKwkJCXUxNiAqbWlzY19pbmZvLCB0bXBfaW5mbzsKKworCQkJZGV2LT5pZl9wb3J0ID0gMTE7CisJCQluZXdfY3NyNiA9IDB4MDIwRTAwMDA7CisJCQlpZiAobWxlYWYtPnR5cGUgPT0gMykgewkvKiAyMTE0MiAqLworCQkJCXUxNiAqaW5pdF9zZXF1ZW5jZSA9ICh1MTYqKShwKzIpOworCQkJCXUxNiAqcmVzZXRfc2VxdWVuY2UgPSAmKCh1MTYqKShwKzMpKVtpbml0X2xlbmd0aF07CisJCQkJaW50IHJlc2V0X2xlbmd0aCA9IHBbMiArIGluaXRfbGVuZ3RoKjJdOworCQkJCW1pc2NfaW5mbyA9IHJlc2V0X3NlcXVlbmNlICsgcmVzZXRfbGVuZ3RoOworCQkJCWlmIChzdGFydHVwKQorCQkJCQlmb3IgKGkgPSAwOyBpIDwgcmVzZXRfbGVuZ3RoOyBpKyspCisJCQkJCQlpb3dyaXRlMzIoZ2V0X3UxNigmcmVzZXRfc2VxdWVuY2VbaV0pIDw8IDE2LCBpb2FkZHIgKyBDU1IxNSk7CisJCQkJZm9yIChpID0gMDsgaSA8IGluaXRfbGVuZ3RoOyBpKyspCisJCQkJCWlvd3JpdGUzMihnZXRfdTE2KCZpbml0X3NlcXVlbmNlW2ldKSA8PCAxNiwgaW9hZGRyICsgQ1NSMTUpOworCQkJfSBlbHNlIHsKKwkJCQl1OCAqaW5pdF9zZXF1ZW5jZSA9IHAgKyAyOworCQkJCXU4ICpyZXNldF9zZXF1ZW5jZSA9IHAgKyAzICsgaW5pdF9sZW5ndGg7CisJCQkJaW50IHJlc2V0X2xlbmd0aCA9IHBbMiArIGluaXRfbGVuZ3RoXTsKKwkJCQltaXNjX2luZm8gPSAodTE2KikocmVzZXRfc2VxdWVuY2UgKyByZXNldF9sZW5ndGgpOworCQkJCWlmIChzdGFydHVwKSB7CisJCQkJCWlvd3JpdGUzMihtdGFibGUtPmNzcjEyZGlyIHwgMHgxMDAsIGlvYWRkciArIENTUjEyKTsKKwkJCQkJZm9yIChpID0gMDsgaSA8IHJlc2V0X2xlbmd0aDsgaSsrKQorCQkJCQkJaW93cml0ZTMyKHJlc2V0X3NlcXVlbmNlW2ldLCBpb2FkZHIgKyBDU1IxMik7CisJCQkJfQorCQkJCWZvciAoaSA9IDA7IGkgPCBpbml0X2xlbmd0aDsgaSsrKQorCQkJCQlpb3dyaXRlMzIoaW5pdF9zZXF1ZW5jZVtpXSwgaW9hZGRyICsgQ1NSMTIpOworCQkJfQorCQkJdG1wX2luZm8gPSBnZXRfdTE2KCZtaXNjX2luZm9bMV0pOworCQkJaWYgKHRtcF9pbmZvKQorCQkJCXRwLT5hZHZlcnRpc2luZ1twaHlfbnVtXSA9IHRtcF9pbmZvIHwgMTsKKwkJCWlmICh0bXBfaW5mbyAmJiBzdGFydHVwIDwgMikgeworCQkJCWlmICh0cC0+bWlpX2FkdmVydGlzZSA9PSAwKQorCQkJCQl0cC0+bWlpX2FkdmVydGlzZSA9IHRwLT5hZHZlcnRpc2luZ1twaHlfbnVtXTsKKwkJCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICBBZHZlcnRpc2luZyAlNC40eCBvbiBNSUkgJWQuXG4iLAorCQkJCQkgICAgICAgZGV2LT5uYW1lLCB0cC0+bWlpX2FkdmVydGlzZSwgdHAtPnBoeXNbcGh5X251bV0pOworCQkJCXR1bGlwX21kaW9fd3JpdGUoZGV2LCB0cC0+cGh5c1twaHlfbnVtXSwgNCwgdHAtPm1paV9hZHZlcnRpc2UpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSA1OiBjYXNlIDY6IHsKKwkJCXUxNiBzZXR1cFs1XTsKKworCQkJbmV3X2NzcjYgPSAwOyAvKiBGSVhNRSAqLworCisJCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQkJCXNldHVwW2ldID0gZ2V0X3UxNigmcFtpKjIgKyAxXSk7CisKKwkJCWlmIChzdGFydHVwICYmIG10YWJsZS0+aGFzX3Jlc2V0KSB7CisJCQkJc3RydWN0IG1lZGlhbGVhZiAqcmxlYWYgPSAmbXRhYmxlLT5tbGVhZlttdGFibGUtPmhhc19yZXNldF07CisJCQkJdW5zaWduZWQgY2hhciAqcnN0ID0gcmxlYWYtPmxlYWZkYXRhOworCQkJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUmVzZXR0aW5nIHRoZSB0cmFuc2NlaXZlci5cbiIsCisJCQkJCQkgICBkZXYtPm5hbWUpOworCQkJCWZvciAoaSA9IDA7IGkgPCByc3RbMF07IGkrKykKKwkJCQkJaW93cml0ZTMyKGdldF91MTYocnN0ICsgMSArIChpPDwxKSkgPDwgMTYsIGlvYWRkciArIENTUjE1KTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogIEludmFsaWQgbWVkaWEgdGFibGUgc2VsZWN0aW9uICVkLlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBtbGVhZi0+dHlwZSk7CisJCQluZXdfY3NyNiA9IDB4MDIwRTAwMDA7CisJCX0KKwkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVXNpbmcgbWVkaWEgdHlwZSAlcywgQ1NSMTIgaXMgJTIuMnguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgbWVkaWFuYW1lW2Rldi0+aWZfcG9ydF0sCisJCQkJICAgaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTIpICYgMHhmZik7CisJfSBlbHNlIGlmICh0cC0+Y2hpcF9pZCA9PSBMQzgyQzE2OCkgeworCQlpZiAoc3RhcnR1cCAmJiAhIHRwLT5tZWRpYWxvY2spCisJCQlkZXYtPmlmX3BvcnQgPSB0cC0+bWlpX2NudCA/IDExIDogMDsKKwkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUE5JQyBQSFkgc3RhdHVzIGlzICUzLjN4LCBtZWRpYSAlcy5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQzMihpb2FkZHIgKyAweEI4KSwgbWVkaWFuYW1lW2Rldi0+aWZfcG9ydF0pOworCQlpZiAodHAtPm1paV9jbnQpIHsKKwkJCW5ld19jc3I2ID0gMHg4MTBDMDAwMDsKKwkJCWlvd3JpdGUzMigweDAwMDEsIGlvYWRkciArIENTUjE1KTsKKwkJCWlvd3JpdGUzMigweDAyMDFCMDdBLCBpb2FkZHIgKyAweEI4KTsKKwkJfSBlbHNlIGlmIChzdGFydHVwKSB7CisJCQkvKiBTdGFydCB3aXRoIDEwbWJwcyB0byBkbyBhdXRvbmVnb3RpYXRpb24uICovCisJCQlpb3dyaXRlMzIoMHgzMiwgaW9hZGRyICsgQ1NSMTIpOworCQkJbmV3X2NzcjYgPSAweDAwNDIwMDAwOworCQkJaW93cml0ZTMyKDB4MDAwMUIwNzgsIGlvYWRkciArIDB4QjgpOworCQkJaW93cml0ZTMyKDB4MDIwMUIwNzgsIGlvYWRkciArIDB4QjgpOworCQl9IGVsc2UgaWYgKGRldi0+aWZfcG9ydCA9PSAzICB8fCAgZGV2LT5pZl9wb3J0ID09IDUpIHsKKwkJCWlvd3JpdGUzMigweDMzLCBpb2FkZHIgKyBDU1IxMik7CisJCQluZXdfY3NyNiA9IDB4MDE4NjAwMDA7CisJCQkvKiBUcmlnZ2VyIGF1dG9uZWdvdGlhdGlvbi4gKi8KKwkJCWlvd3JpdGUzMihzdGFydHVwID8gMHgwMjAxRjg2OCA6IDB4MDAwMUY4NjgsIGlvYWRkciArIDB4QjgpOworCQl9IGVsc2UgeworCQkJaW93cml0ZTMyKDB4MzIsIGlvYWRkciArIENTUjEyKTsKKwkJCW5ld19jc3I2ID0gMHgwMDQyMDAwMDsKKwkJCWlvd3JpdGUzMigweDFGMDc4LCBpb2FkZHIgKyAweEI4KTsKKwkJfQorCX0gZWxzZSB7CQkJCQkvKiBVbmtub3duIGNoaXAgdHlwZSB3aXRoIG5vIG1lZGlhIHRhYmxlLiAqLworCQlpZiAodHAtPmRlZmF1bHRfcG9ydCA9PSAwKQorCQkJZGV2LT5pZl9wb3J0ID0gdHAtPm1paV9jbnQgPyAxMSA6IDM7CisJCWlmICh0dWxpcF9tZWRpYV9jYXBbZGV2LT5pZl9wb3J0XSAmIE1lZGlhSXNNSUkpIHsKKwkJCW5ld19jc3I2ID0gMHgwMjBFMDAwMDsKKwkJfSBlbHNlIGlmICh0dWxpcF9tZWRpYV9jYXBbZGV2LT5pZl9wb3J0XSAmIE1lZGlhSXNGeCkgeworCQkJbmV3X2NzcjYgPSAweDAyODYwMDAwOworCQl9IGVsc2UKKwkJCW5ld19jc3I2ID0gMHgwMzg2MDAwMDsKKwkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTm8gbWVkaWEgZGVzY3JpcHRpb24gdGFibGUsIGFzc3VtaW5nICIKKwkJCQkgICAiJXMgdHJhbnNjZWl2ZXIsIENTUjEyICUyLjJ4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdLAorCQkJCSAgIGlvcmVhZDMyKGlvYWRkciArIENTUjEyKSk7CisJfQorCisJdHAtPmNzcjYgPSBuZXdfY3NyNiB8ICh0cC0+Y3NyNiAmIDB4ZmRmZikgfCAodHAtPmZ1bGxfZHVwbGV4ID8gMHgwMjAwIDogMCk7CisJcmV0dXJuOworfQorCisvKgorICBDaGVjayB0aGUgTUlJIG5lZ290aWF0ZWQgZHVwbGV4IGFuZCBjaGFuZ2UgdGhlIENTUjYgc2V0dGluZyBpZgorICByZXF1aXJlZC4KKyAgUmV0dXJuIDAgaWYgZXZlcnl0aGluZyBpcyBPSy4KKyAgUmV0dXJuIDwgMCBpZiB0aGUgdHJhbnNjZWl2ZXIgaXMgbWlzc2luZyBvciBoYXMgbm8gbGluayBiZWF0LgorICAqLworaW50IHR1bGlwX2NoZWNrX2R1cGxleChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IGJtc3IsIGxwYSwgbmVnb3RpYXRlZCwgbmV3X2NzcjY7CisKKwlibXNyID0gdHVsaXBfbWRpb19yZWFkKGRldiwgdHAtPnBoeXNbMF0sIE1JSV9CTVNSKTsKKwlscGEgPSB0dWxpcF9tZGlvX3JlYWQoZGV2LCB0cC0+cGh5c1swXSwgTUlJX0xQQSk7CisJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1JSSBzdGF0dXMgJTQuNHgsIExpbmsgcGFydG5lciByZXBvcnQgIgorCQkJICAgIiU0LjR4LlxuIiwgZGV2LT5uYW1lLCBibXNyLCBscGEpOworCWlmIChibXNyID09IDB4ZmZmZikKKwkJcmV0dXJuIC0yOworCWlmICgoYm1zciAmIEJNU1JfTFNUQVRVUykgPT0gMCkgeworCQlpbnQgbmV3X2Jtc3IgPSB0dWxpcF9tZGlvX3JlYWQoZGV2LCB0cC0+cGh5c1swXSwgTUlJX0JNU1IpOworCQlpZiAoKG5ld19ibXNyICYgQk1TUl9MU1RBVFVTKSA9PSAwKSB7CisJCQlpZiAodHVsaXBfZGVidWcgID4gMSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTm8gbGluayBiZWF0IG9uIHRoZSBNSUkgaW50ZXJmYWNlLCIKKwkJCQkJICAgIiBzdGF0dXMgJTQuNHguXG4iLCBkZXYtPm5hbWUsIG5ld19ibXNyKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwluZWdvdGlhdGVkID0gbHBhICYgdHAtPmFkdmVydGlzaW5nWzBdOworCXRwLT5mdWxsX2R1cGxleCA9IG1paV9kdXBsZXgodHAtPmZ1bGxfZHVwbGV4X2xvY2ssIG5lZ290aWF0ZWQpOworCisJbmV3X2NzcjYgPSB0cC0+Y3NyNjsKKworCWlmIChuZWdvdGlhdGVkICYgTFBBXzEwMCkgbmV3X2NzcjYgJj0gflR4VGhyZXNob2xkOworCWVsc2UJCQkgIG5ld19jc3I2IHw9IFR4VGhyZXNob2xkOworCWlmICh0cC0+ZnVsbF9kdXBsZXgpIG5ld19jc3I2IHw9IEZ1bGxEdXBsZXg7CisJZWxzZQkJICAgICBuZXdfY3NyNiAmPSB+RnVsbER1cGxleDsKKworCWlmIChuZXdfY3NyNiAhPSB0cC0+Y3NyNikgeworCQl0cC0+Y3NyNiA9IG5ld19jc3I2OworCQl0dWxpcF9yZXN0YXJ0X3J4dHgodHApOworCisJCWlmICh0dWxpcF9kZWJ1ZyA+IDApCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogU2V0dGluZyAlcy1kdXBsZXggYmFzZWQgb24gTUlJIgorCQkJCSAgICIjJWQgbGluayBwYXJ0bmVyIGNhcGFiaWxpdHkgb2YgJTQuNHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgdHAtPmZ1bGxfZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiLAorCQkJCSAgIHRwLT5waHlzWzBdLCBscGEpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2RldmluaXQgdHVsaXBfZmluZF9taWkgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBib2FyZF9pZHgpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcGh5biwgcGh5X2lkeCA9IDA7CisJaW50IG1paV9yZWcwOworCWludCBtaWlfYWR2ZXJ0OworCXVuc2lnbmVkIGludCB0b19hZHZlcnQsIG5ld19ibWNyLCBhbmVfc3dpdGNoOworCisJLyogRmluZCB0aGUgY29ubmVjdGVkIE1JSSB4Y3Zycy4KKwkgICBEb2luZyB0aGlzIGluIG9wZW4oKSB3b3VsZCBhbGxvdyBkZXRlY3RpbmcgZXh0ZXJuYWwgeGN2cnMgbGF0ZXIsCisJICAgYnV0IHRha2VzIG11Y2ggdGltZS4gKi8KKwlmb3IgKHBoeW4gPSAxOyBwaHluIDw9IDMyICYmIHBoeV9pZHggPCBzaXplb2YgKHRwLT5waHlzKTsgcGh5bisrKSB7CisJCWludCBwaHkgPSBwaHluICYgMHgxZjsKKwkJaW50IG1paV9zdGF0dXMgPSB0dWxpcF9tZGlvX3JlYWQgKGRldiwgcGh5LCBNSUlfQk1TUik7CisJCWlmICgobWlpX3N0YXR1cyAmIDB4ODMwMSkgPT0gMHg4MDAxIHx8CisJCSAgICAoKG1paV9zdGF0dXMgJiBCTVNSXzEwMEJBU0U0KSA9PSAwCisJCSAgICAgJiYgKG1paV9zdGF0dXMgJiAweDc4MDApICE9IDApKSB7CisJCQkvKiBwcmVzZXJ2ZSBCZWNrZXIgbG9naWMsIGdhaW4gaW5kZW50YXRpb24gbGV2ZWwgKi8KKwkJfSBlbHNlIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbWlpX3JlZzAgPSB0dWxpcF9tZGlvX3JlYWQgKGRldiwgcGh5LCBNSUlfQk1DUik7CisJCW1paV9hZHZlcnQgPSB0dWxpcF9tZGlvX3JlYWQgKGRldiwgcGh5LCBNSUlfQURWRVJUSVNFKTsKKwkJYW5lX3N3aXRjaCA9IDA7CisKKwkJLyogaWYgbm90IGFkdmVydGlzaW5nIGF0IGFsbCwgZ2VuIGFuCisJCSAqIGFkdmVydGlzaW5nIHZhbHVlIGZyb20gdGhlIGNhcGFiaWxpdHkKKwkJICogYml0cyBpbiBCTVNSCisJCSAqLworCQlpZiAoKG1paV9hZHZlcnQgJiBBRFZFUlRJU0VfQUxMKSA9PSAwKSB7CisJCQl1bnNpZ25lZCBpbnQgdG1wYWR2ID0gdHVsaXBfbWRpb19yZWFkIChkZXYsIHBoeSwgTUlJX0JNU1IpOworCQkJbWlpX2FkdmVydCA9ICgodG1wYWR2ID4+IDYpICYgMHgzZTApIHwgMTsKKwkJfQorCisJCWlmICh0cC0+bWlpX2FkdmVydGlzZSkgeworCQkJdHAtPmFkdmVydGlzaW5nW3BoeV9pZHhdID0KKwkJCXRvX2FkdmVydCA9IHRwLT5taWlfYWR2ZXJ0aXNlOworCQl9IGVsc2UgaWYgKHRwLT5hZHZlcnRpc2luZ1twaHlfaWR4XSkgeworCQkJdG9fYWR2ZXJ0ID0gdHAtPmFkdmVydGlzaW5nW3BoeV9pZHhdOworCQl9IGVsc2UgeworCQkJdHAtPmFkdmVydGlzaW5nW3BoeV9pZHhdID0KKwkJCXRwLT5taWlfYWR2ZXJ0aXNlID0KKwkJCXRvX2FkdmVydCA9IG1paV9hZHZlcnQ7CisJCX0KKworCQl0cC0+cGh5c1twaHlfaWR4KytdID0gcGh5OworCisJCXByaW50ayAoS0VSTl9JTkZPICJ0dWxpcCVkOiAgTUlJIHRyYW5zY2VpdmVyICMlZCAiCisJCQkiY29uZmlnICU0LjR4IHN0YXR1cyAlNC40eCBhZHZlcnRpc2luZyAlNC40eC5cbiIsCisJCQlib2FyZF9pZHgsIHBoeSwgbWlpX3JlZzAsIG1paV9zdGF0dXMsIG1paV9hZHZlcnQpOworCisJCS8qIEZpeHVwIGZvciBETGluayB3aXRoIG1pc3dpcmVkIFBIWS4gKi8KKwkJaWYgKG1paV9hZHZlcnQgIT0gdG9fYWR2ZXJ0KSB7CisJCQlwcmludGsgKEtFUk5fREVCVUcgInR1bGlwJWQ6ICBBZHZlcnRpc2luZyAlNC40eCBvbiBQSFkgJWQsIgorCQkJCSIgcHJldmlvdXNseSBhZHZlcnRpc2luZyAlNC40eC5cbiIsCisJCQkJYm9hcmRfaWR4LCB0b19hZHZlcnQsIHBoeSwgbWlpX2FkdmVydCk7CisJCQl0dWxpcF9tZGlvX3dyaXRlIChkZXYsIHBoeSwgNCwgdG9fYWR2ZXJ0KTsKKwkJfQorCisJCS8qIEVuYWJsZSBhdXRvbmVnb3RpYXRpb246IHNvbWUgYm9hcmRzIGRlZmF1bHQgdG8gb2ZmLiAqLworCQlpZiAodHAtPmRlZmF1bHRfcG9ydCA9PSAwKSB7CisJCQluZXdfYm1jciA9IG1paV9yZWcwIHwgQk1DUl9BTkVOQUJMRTsKKwkJCWlmIChuZXdfYm1jciAhPSBtaWlfcmVnMCkgeworCQkJCW5ld19ibWNyIHw9IEJNQ1JfQU5SRVNUQVJUOworCQkJCWFuZV9zd2l0Y2ggPSAxOworCQkJfQorCQl9CisJCS8qIC4uLm9yIGRpc2FibGUgbndheSwgaWYgZm9yY2luZyBtZWRpYSAqLworCQllbHNlIHsKKwkJCW5ld19ibWNyID0gbWlpX3JlZzAgJiB+Qk1DUl9BTkVOQUJMRTsKKwkJCWlmIChuZXdfYm1jciAhPSBtaWlfcmVnMCkKKwkJCQlhbmVfc3dpdGNoID0gMTsKKwkJfQorCisJCS8qIGNsZWFyIG91dCBiaXRzIHdlIG5ldmVyIHdhbnQgYXQgdGhpcyBwb2ludCAqLworCQluZXdfYm1jciAmPSB+KEJNQ1JfQ1RTVCB8IEJNQ1JfRlVMTERQTFggfCBCTUNSX0lTT0xBVEUgfAorCQkJICAgICAgQk1DUl9QRE9XTiB8IEJNQ1JfU1BFRUQxMDAgfCBCTUNSX0xPT1BCQUNLIHwKKwkJCSAgICAgIEJNQ1JfUkVTRVQpOworCisJCWlmICh0cC0+ZnVsbF9kdXBsZXgpCisJCQluZXdfYm1jciB8PSBCTUNSX0ZVTExEUExYOworCQlpZiAodHVsaXBfbWVkaWFfY2FwW3RwLT5kZWZhdWx0X3BvcnRdICYgTWVkaWFJczEwMCkKKwkJCW5ld19ibWNyIHw9IEJNQ1JfU1BFRUQxMDA7CisKKwkJaWYgKG5ld19ibWNyICE9IG1paV9yZWcwKSB7CisJCQkvKiBzb21lIHBoeXMgbmVlZCB0aGUgQU5FIHN3aXRjaCB0bworCQkJICogaGFwcGVuIGJlZm9yZSBmb3JjZWQgbWVkaWEgc2V0dGluZ3MKKwkJCSAqIHdpbGwgInRha2UuIiAgSG93ZXZlciwgd2Ugd3JpdGUgdGhlCisJCQkgKiBzYW1lIHZhbHVlIHR3aWNlIGluIG9yZGVyIG5vdCB0bworCQkJICogY29uZnVzZSB0aGUgc2FuZSBwaHlzLgorCQkJICovCisJCQlpZiAoYW5lX3N3aXRjaCkgeworCQkJCXR1bGlwX21kaW9fd3JpdGUgKGRldiwgcGh5LCBNSUlfQk1DUiwgbmV3X2JtY3IpOworCQkJCXVkZWxheSAoMTApOworCQkJfQorCQkJdHVsaXBfbWRpb193cml0ZSAoZGV2LCBwaHksIE1JSV9CTUNSLCBuZXdfYm1jcik7CisJCX0KKwl9CisJdHAtPm1paV9jbnQgPSBwaHlfaWR4OworCWlmICh0cC0+bXRhYmxlICYmIHRwLT5tdGFibGUtPmhhc19taWkgJiYgcGh5X2lkeCA9PSAwKSB7CisJCXByaW50ayAoS0VSTl9JTkZPICJ0dWxpcCVkOiAqKipXQVJOSU5HKioqOiBObyBNSUkgdHJhbnNjZWl2ZXIgZm91bmQhXG4iLAorCQkJYm9hcmRfaWR4KTsKKwkJdHAtPnBoeXNbMF0gPSAxOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3BuaWMuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3BuaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTk4MGJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvcG5pYy5jCkBAIC0wLDAgKzEsMTcyIEBACisvKgorCWRyaXZlcnMvbmV0L3R1bGlwL3BuaWMuYworCisJTWFpbnRhaW5lZCBieSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisJQ29weXJpZ2h0IDIwMDAsMjAwMSAgVGhlIExpbnV4IEtlcm5lbCBUZWFtCisJV3JpdHRlbi9jb3B5cmlnaHQgMTk5NC0yMDAxIGJ5IERvbmFsZCBCZWNrZXIuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCVBsZWFzZSByZWZlciB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdHVsaXAtdXNlci57cGRmLHBzLGh0bWx9CisJZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBkcml2ZXIsIG9yIHZpc2l0IHRoZSBwcm9qZWN0CisJV2ViIHBhZ2UgYXQgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy90dWxpcC8KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgInR1bGlwLmgiCisKKwordm9pZCBwbmljX2RvX253YXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKwl1MzIgcGh5X3JlZyA9IGlvcmVhZDMyKGlvYWRkciArIDB4QjgpOworCXUzMiBuZXdfY3NyNiA9IHRwLT5jc3I2ICYgfjB4NDBDNDAyMDA7CisKKwlpZiAocGh5X3JlZyAmIDB4NzgwMDAwMDApIHsgLyogSWdub3JlIGJhc2VUNCAqLworCQlpZiAocGh5X3JlZyAmIDB4MjAwMDAwMDApCQlkZXYtPmlmX3BvcnQgPSA1OworCQllbHNlIGlmIChwaHlfcmVnICYgMHg0MDAwMDAwMCkJZGV2LT5pZl9wb3J0ID0gMzsKKwkJZWxzZSBpZiAocGh5X3JlZyAmIDB4MTAwMDAwMDApCWRldi0+aWZfcG9ydCA9IDQ7CisJCWVsc2UgaWYgKHBoeV9yZWcgJiAweDA4MDAwMDAwKQlkZXYtPmlmX3BvcnQgPSAwOworCQl0cC0+bndheXNldCA9IDE7CisJCW5ld19jc3I2ID0gKGRldi0+aWZfcG9ydCAmIDEpID8gMHgwMTg2MDAwMCA6IDB4MDA0MjAwMDA7CisJCWlvd3JpdGUzMigweDMyIHwgKGRldi0+aWZfcG9ydCAmIDEpLCBpb2FkZHIgKyBDU1IxMik7CisJCWlmIChkZXYtPmlmX3BvcnQgJiAxKQorCQkJaW93cml0ZTMyKDB4MUY4NjgsIGlvYWRkciArIDB4QjgpOworCQlpZiAocGh5X3JlZyAmIDB4MzAwMDAwMDApIHsKKwkJCXRwLT5mdWxsX2R1cGxleCA9IDE7CisJCQluZXdfY3NyNiB8PSAweDAwMDAwMjAwOworCQl9CisJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFBOSUMgYXV0b25lZ290aWF0ZWQgc3RhdHVzICU4Ljh4LCAlcy5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBwaHlfcmVnLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSk7CisJCWlmICh0cC0+Y3NyNiAhPSBuZXdfY3NyNikgeworCQkJdHAtPmNzcjYgPSBuZXdfY3NyNjsKKwkJCS8qIFJlc3RhcnQgVHggKi8KKwkJCXR1bGlwX3Jlc3RhcnRfcnh0eCh0cCk7CisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJfQorCX0KK30KKwordm9pZCBwbmljX2xua19jaGFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNzcjUpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisJaW50IHBoeV9yZWcgPSBpb3JlYWQzMihpb2FkZHIgKyAweEI4KTsKKworCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogUE5JQyBsaW5rIGNoYW5nZWQgc3RhdGUgJTguOHgsIENTUjUgJTguOHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBwaHlfcmVnLCBjc3I1KTsKKwlpZiAoaW9yZWFkMzIoaW9hZGRyICsgQ1NSNSkgJiBUUExua0ZhaWwpIHsKKwkJaW93cml0ZTMyKChpb3JlYWQzMihpb2FkZHIgKyBDU1I3KSAmIH5UUExua0ZhaWwpIHwgVFBMbmtQYXNzLCBpb2FkZHIgKyBDU1I3KTsKKwkJLyogSWYgd2UgdXNlIGFuIGV4dGVybmFsIE1JSSwgdGhlbiB3ZSBtdXN0bid0IHVzZSB0aGUKKwkJICogaW50ZXJuYWwgbmVnb3RpYXRpb24uCisJCSAqLworCQlpZiAodHVsaXBfbWVkaWFfY2FwW2Rldi0+aWZfcG9ydF0gJiBNZWRpYUlzTUlJKQorCQkJcmV0dXJuOworCQlpZiAoISB0cC0+bndheXNldCAgfHwgIGppZmZpZXMgLSBkZXYtPnRyYW5zX3N0YXJ0ID4gMSpIWikgeworCQkJdHAtPmNzcjYgPSAweDAwNDIwMDAwIHwgKHRwLT5jc3I2ICYgMHgwMDAwZmRmZik7CisJCQlpb3dyaXRlMzIodHAtPmNzcjYsIGlvYWRkciArIENTUjYpOworCQkJaW93cml0ZTMyKDB4MzAsIGlvYWRkciArIENTUjEyKTsKKwkJCWlvd3JpdGUzMigweDAyMDFGMDc4LCBpb2FkZHIgKyAweEI4KTsgLyogVHVybiBvbiBhdXRvbmVnb3RpYXRpb24uICovCisJCQlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJfQorCX0gZWxzZSBpZiAoaW9yZWFkMzIoaW9hZGRyICsgQ1NSNSkgJiBUUExua1Bhc3MpIHsKKwkJaWYgKHR1bGlwX21lZGlhX2NhcFtkZXYtPmlmX3BvcnRdICYgTWVkaWFJc01JSSkgeworCQkJc3Bpbl9sb2NrKCZ0cC0+bG9jayk7CisJCQl0dWxpcF9jaGVja19kdXBsZXgoZGV2KTsKKwkJCXNwaW5fdW5sb2NrKCZ0cC0+bG9jayk7CisJCX0gZWxzZSB7CisJCQlwbmljX2RvX253YXkoZGV2KTsKKwkJfQorCQlpb3dyaXRlMzIoKGlvcmVhZDMyKGlvYWRkciArIENTUjcpICYgflRQTG5rUGFzcykgfCBUUExua0ZhaWwsIGlvYWRkciArIENTUjcpOworCX0KK30KKwordm9pZCBwbmljX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YTsKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKwlpbnQgbmV4dF90aWNrID0gNjAqSFo7CisKKwlpZighaW9yZWFkMzIoaW9hZGRyICsgQ1NSNykpIHsKKwkJLyogdGhlIHRpbWVyIHdhcyBjYWxsZWQgZHVlIHRvIGEgd29yayBvdmVyZmxvdworCQkgKiBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIuIFNraXAgdGhlIGNvbm5lY3Rpb24KKwkJICogY2hlY2tzLCB0aGUgbmljIGlzIGRlZmluaXRpdmVseSBzcGVha2luZyB3aXRoCisJCSAqIGhpcyBsaW5rIHBhcnRuZXIuCisJCSAqLworCQlnb3RvIHRvb19nb29kX2Nvbm5lY3Rpb247CisJfQorCisJaWYgKHR1bGlwX21lZGlhX2NhcFtkZXYtPmlmX3BvcnRdICYgTWVkaWFJc01JSSkgeworCQlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJCWlmICh0dWxpcF9jaGVja19kdXBsZXgoZGV2KSA+IDApCisJCQluZXh0X3RpY2sgPSAzKkhaOworCQlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKwl9IGVsc2UgeworCQlpbnQgY3NyMTIgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1IxMik7CisJCWludCBuZXdfY3NyNiA9IHRwLT5jc3I2ICYgfjB4NDBDNDAyMDA7CisJCWludCBwaHlfcmVnID0gaW9yZWFkMzIoaW9hZGRyICsgMHhCOCk7CisJCWludCBjc3I1ID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSNSk7CisKKwkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUE5JQyB0aW1lciBQSFkgc3RhdHVzICU4Ljh4LCAlcyAiCisJCQkJICAgIkNTUjUgJTguOHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgcGh5X3JlZywgbWVkaWFuYW1lW2Rldi0+aWZfcG9ydF0sIGNzcjUpOworCQlpZiAocGh5X3JlZyAmIDB4MDQwMDAwMDApIHsJLyogUmVtb3RlIGxpbmsgZmF1bHQgKi8KKwkJCWlvd3JpdGUzMigweDAyMDFGMDc4LCBpb2FkZHIgKyAweEI4KTsKKwkJCW5leHRfdGljayA9IDEqSFo7CisJCQl0cC0+bndheXNldCA9IDA7CisJCX0gZWxzZSBpZiAocGh5X3JlZyAmIDB4NzgwMDAwMDApIHsgLyogSWdub3JlIGJhc2VUNCAqLworCQkJcG5pY19kb19ud2F5KGRldik7CisJCQluZXh0X3RpY2sgPSA2MCpIWjsKKwkJfSBlbHNlIGlmIChjc3I1ICYgVFBMbmtGYWlsKSB7IC8qIDEwMGJhc2VUeCBsaW5rIGJlYXQgKi8KKwkJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcyBsaW5rIGJlYXQgZmFpbGVkLCBDU1IxMiAlNC40eCwgIgorCQkJCQkgICAiQ1NSNSAlOC44eCwgUEhZICUzLjN4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSwgY3NyMTIsCisJCQkJCSAgIGlvcmVhZDMyKGlvYWRkciArIENTUjUpLCBpb3JlYWQzMihpb2FkZHIgKyAweEI4KSk7CisJCQluZXh0X3RpY2sgPSAzKkhaOworCQkJaWYgKHRwLT5tZWRpYWxvY2spIHsKKwkJCX0gZWxzZSBpZiAodHAtPm53YXlzZXQgICYmICAoZGV2LT5pZl9wb3J0ICYgMSkpIHsKKwkJCQluZXh0X3RpY2sgPSAxKkhaOworCQkJfSBlbHNlIGlmIChkZXYtPmlmX3BvcnQgPT0gMCkgeworCQkJCWRldi0+aWZfcG9ydCA9IDM7CisJCQkJaW93cml0ZTMyKDB4MzMsIGlvYWRkciArIENTUjEyKTsKKwkJCQluZXdfY3NyNiA9IDB4MDE4NjAwMDA7CisJCQkJaW93cml0ZTMyKDB4MUY4NjgsIGlvYWRkciArIDB4QjgpOworCQkJfSBlbHNlIHsKKwkJCQlkZXYtPmlmX3BvcnQgPSAwOworCQkJCWlvd3JpdGUzMigweDMyLCBpb2FkZHIgKyBDU1IxMik7CisJCQkJbmV3X2NzcjYgPSAweDAwNDIwMDAwOworCQkJCWlvd3JpdGUzMigweDFGMDc4LCBpb2FkZHIgKyAweEI4KTsKKwkJCX0KKwkJCWlmICh0cC0+Y3NyNiAhPSBuZXdfY3NyNikgeworCQkJCXRwLT5jc3I2ID0gbmV3X2NzcjY7CisJCQkJLyogUmVzdGFydCBUeCAqLworCQkJCXR1bGlwX3Jlc3RhcnRfcnh0eCh0cCk7CisJCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENoYW5naW5nIFBOSUMgY29uZmlndXJhdGlvbiB0byAlcyAiCisJCQkJCQkgICAiJXMtZHVwbGV4LCBDU1I2ICU4Ljh4LlxuIiwKKwkJCQkJCSAgIGRldi0+bmFtZSwgbWVkaWFuYW1lW2Rldi0+aWZfcG9ydF0sCisJCQkJCQkgICB0cC0+ZnVsbF9kdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIsIG5ld19jc3I2KTsKKwkJCX0KKwkJfQorCX0KK3Rvb19nb29kX2Nvbm5lY3Rpb246CisJbW9kX3RpbWVyKCZ0cC0+dGltZXIsIFJVTl9BVChuZXh0X3RpY2spKTsKKwlpZighaW9yZWFkMzIoaW9hZGRyICsgQ1NSNykpIHsKKwkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBzdyB0aW1lciB3YWtldXAuXG4iLCBkZXYtPm5hbWUpOworCQlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJCXR1bGlwX3JlZmlsbF9yeChkZXYpOworCQllbmFibGVfaXJxKGRldi0+aXJxKTsKKwkJaW93cml0ZTMyKHR1bGlwX3RibFt0cC0+Y2hpcF9pZF0udmFsaWRfaW50cnMsIGlvYWRkciArIENTUjcpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3BuaWMyLmMgYi9kcml2ZXJzL25ldC90dWxpcC9wbmljMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZjRhOWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC9wbmljMi5jCkBAIC0wLDAgKzEsNDA3IEBACisvKgorCWRyaXZlcnMvbmV0L3R1bGlwL3BuaWMyLmMKKworCU1haW50YWluZWQgYnkgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorCUNvcHlyaWdodCAyMDAwLDIwMDEgIFRoZSBMaW51eCBLZXJuZWwgVGVhbQorCVdyaXR0ZW4vY29weXJpZ2h0IDE5OTQtMjAwMSBieSBEb25hbGQgQmVja2VyLgorICAgICAgICBNb2RpZmllZCB0byBoZXAgc3VwcG9ydCBQTklDX0lJIGJ5IEtldmluIEIuIEhlbmRyaWNrcworCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlQbGVhc2UgcmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3R1bGlwLXVzZXIue3BkZixwcyxodG1sfQorCWZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgZHJpdmVyLCBvciB2aXNpdCB0aGUgcHJvamVjdAorCVdlYiBwYWdlIGF0IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvdHVsaXAvCisKKyovCisKKworLyogVW5kZXJzdGFuZGluZyB0aGUgUE5JQ19JSSAtIGV2ZXJ5dGhpbmcgaXMgdGhpcyBmaWxlIGlzIGJhc2VkCisgKiBvbiB0aGUgUE5JQ19JSV9QREYgZGF0YXNoZWV0IHdoaWNoIGlzIHNvcmVseSBsYWNraW5nIGluIGRldGFpbAorICoKKyAqIEFzIEkgdW5kZXJzdGFuZCB0aGluZ3MsIGhlcmUgYXJlIHRoZSByZWdpc3RlcnMgYW5kIGJpdHMgdGhhdAorICogZXhwbGFpbiB0aGUgbWFza3MgYW5kIGNvbnN0YW50cyB1c2VkIGluIHRoaXMgZmlsZSB0aGF0IGFyZQorICogZWl0aGVyIGRpZmZlcmVudCBmcm9tIHRoZSAyMTE0Mi8zIG9yIGltcG9ydGFudCBmb3IgYmFzaWMgb3BlcmF0aW9uLgorICoKKyAqCisgKiBDU1IgNiAgKG1hc2sgPSAweGZlM2JkMWZkIG9mIGJpdHMgbm90IHRvIGNoYW5nZSkKKyAqIC0tLS0tCisgKiBCaXQgMjQgICAgLSBTQ1IKKyAqIEJpdCAyMyAgICAtIFBDUworICogQml0IDIyICAgIC0gVFRNIChUcmFzbWl0IFRocmVzaG9sZCBNb2RlKQorICogQml0IDE4ICAgIC0gUG9ydCBTZWxlY3QKKyAqIEJpdCAxMyAgICAtIFN0YXJ0IC0gMSwgU3RvcCAtIDAgVHJhbnNtaXNzaW9ucworICogQml0IDExOjEwIC0gTG9vcCBCYWNrIE9wZXJhdGlvbiBNb2RlCisgKiBCaXQgOSAgICAgLSBGdWxsIER1cGxleCBtb2RlIChBZHZlcnRpc2UgMTBCYXNlVC1GRCBpcyBDU1IxNDw3PiBpcyBzZXQpCisgKiBCaXQgMSAgICAgLSBTdGFydCAtIDEsIFN0b3AgLSAwIFJlY2VpdmUKKyAqCisgKgorICogQ1NSIDE0ICAobWFzayA9IDB4ZmZmMGVlMzkgb2YgYml0cyBub3QgdG8gY2hhbmdlKQorICogLS0tLS0tCisgKiBCaXQgMTkgICAgLSBQQVVTRS1QYXVzZQorICogQml0IDE4ICAgIC0gQWR2ZXJ0aXNlIFQ0CisgKiBCaXQgMTcgICAgLSBBZHZlcnRpc2UgMTAwYmFzZVR4LUZECisgKiBCaXQgMTYgICAgLSBBZHZlcnRpc2UgMTAwYmFzZVR4LUhECisgKiBCaXQgMTIgICAgLSBMVEUgLSBMaW5rIFRlc3QgRW5hYmxlCisgKiBCaXQgNyAgICAgLSBBTkUgLSBBdXRvIE5lZ290aWF0ZSBFbmFibGUKKyAqIEJpdCA2ICAgICAtIEhERSAtIEFkdmVydGlzZSAxMGJhc2VULUhECisgKiBCaXQgMiAgICAgLSBSZXNldCB0byBQb3dlciBkb3duIC0ga2VwdCBhcyAxIGZvciBub3JtYWwgb3BlcmF0aW9uCisgKiBCaXQgMSAgICAgLSAgTG9vcCBCYWNrIGVuYWJsZSBmb3IgMTBiYXNlVCBNQ0MKKyAqCisgKgorICogQ1NSIDEyCisgKiAtLS0tLS0KKyAqIEJpdCAyNSAgICAtIFBhcnRuZXIgY2FuIGRvIFQ0CisgKiBCaXQgMjQgICAgLSBQYXJ0bmVyIGNhbiBkbyAxMDBiYXNlVHgtRkQKKyAqIEJpdCAyMyAgICAtIFBhcnRuZXIgY2FuIGRvIDEwMGJhc2VUeC1IRAorICogQml0IDIyICAgIC0gUGFydG5lciBjYW4gZG8gMTBiYXNlVC1GRAorICogQml0IDIxICAgIC0gUGFydG5lciBjYW4gZG8gMTBiYXNlVC1IRAorICogQml0IDE1ICAgIC0gTFBOIGlzIDEgaWYgYWxsIGFib3ZlIGJpdHMgYXJlIHZhbGlkIG90aGVyIHdpc2UgMAorICogQml0IDE0OjEyIC0gYXV0b25lZ290aWF0aW9uIHN0YXRlICh3cml0ZSAwMDEgdG8gc3RhcnQgYXV0b25lZ290aWF0ZSkKKyAqIEJpdCAzICAgICAtIEF1dG9wb2xhcml0eSBzdGF0ZQorICogQml0IDIgICAgIC0gTFMxMEIgLSBsaW5rIHN0YXRlIG9mIDEwYmFzZVQgMCAtIGdvb2QsIDEgLSBmYWlsZWQKKyAqIEJpdCAxICAgICAtIExTMTAwQiAtIGxpbmsgc3RhdGUgb2YgMTAwYmFzZVQgMCAtIGdvb2QsIDEtIGZhaWxkCisgKgorICoKKyAqIERhdGEgUG9ydCBTZWxlY3Rpb24gSW5mbworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogQ1NSMTQ8Nz4gICBDU1I2PDE4PiAgICBDU1I2PDIyPiAgICBDU1I2PDIzPiAgICBDU1I2PDI0PiAgIE1PREUvUE9SVAorICogICAxICAgICAgICAgICAwICAgICAgICAgICAwIChYKSAgICAgICAwIChYKSAgICAgICAxICAgICAgICBOV0FZCisgKiAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDEgICAgICAgICAgIDAgKFgpICAgICAgIDAgICAgICAgIDEwYmFzZVQKKyAqICAgMCAgICAgICAgICAgMSAgICAgICAgICAgMCAgICAgICAgICAgMSAgICAgICAgICAgMSAoWCkgICAgMTAwYmFzZVQKKyAqCisgKgorICovCisKKworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSAidHVsaXAuaCIKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisKK3ZvaWQgcG5pYzJfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCWludCBuZXh0X3RpY2sgPSA2MCpIWjsKKworCWlmICh0dWxpcF9kZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0lORk8iJXM6IFBOSUMyIG5lZ290aWF0aW9uIHN0YXR1cyAlOC44eC5cbiIsCisgICAgICAgICAgICAgICAgICAgIGRldi0+bmFtZSxpb3JlYWQzMihpb2FkZHIgKyBDU1IxMikpOworCisJaWYgKG5leHRfdGljaykgeworCQltb2RfdGltZXIoJnRwLT50aW1lciwgUlVOX0FUKG5leHRfdGljaykpOworCX0KK30KKworCit2b2lkIHBuaWMyX3N0YXJ0X253YXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKyAgICAgICAgaW50IGNzcjE0OworICAgICAgICBpbnQgY3NyMTI7CisKKyAgICAgICAgLyogc2V0IHVwIHdoYXQgdG8gYWR2ZXJ0aXNlIGR1cmluZyB0aGUgbmVnb3RpYXRpb24gKi8KKworICAgICAgICAvKiBsb2FkIGluIGNzcjE0ICBhbmQgbWFzayBvZmYgYml0cyBub3QgdG8gdG91Y2gKKyAgICAgICAgICogY29tbWVudCBhdCB0b3Agb2YgZmlsZSBleHBsYWlucyBtYXNrIHZhbHVlCisgICAgICAgICAqLworCWNzcjE0ID0gKGlvcmVhZDMyKGlvYWRkciArIENTUjE0KSAmIDB4ZmZmMGVlMzkpOworCisgICAgICAgIC8qIGJpdCAxNyAtIGFkdmV0aXNlIDEwMGJhc2VUeC1GRCAqLworICAgICAgICBpZiAodHAtPnN5bV9hZHZlcnRpc2UgJiAweDAxMDApIGNzcjE0IHw9IDB4MDAwMjAwMDA7CisKKyAgICAgICAgLyogYml0IDE2IC0gYWR2ZXJ0aXNlIDEwMGJhc2VUeC1IRCAqLworICAgICAgICBpZiAodHAtPnN5bV9hZHZlcnRpc2UgJiAweDAwODApIGNzcjE0IHw9IDB4MDAwMTAwMDA7CisKKyAgICAgICAgLyogYml0IDYgLSBhZHZlcnRpc2UgMTBiYXNlVC1IRCAqLworICAgICAgICBpZiAodHAtPnN5bV9hZHZlcnRpc2UgJiAweDAwMjApIGNzcjE0IHw9IDB4MDAwMDAwNDA7CisKKyAgICAgICAgLyogTm93IHNldCBiaXQgMTIgTGluayBUZXN0IEVuYWJsZSwgQml0IDcgQXV0b25lZ290aWF0aW9uIEVuYWJsZQorICAgICAgICAgKiBhbmQgYml0IDAgRG9uJ3QgUG93ZXJEb3duIDEwYmFzZVQKKyAgICAgICAgICovCisgICAgICAgIGNzcjE0IHw9IDB4MDAwMDExODQ7CisKKwlpZiAodHVsaXBfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlc3RhcnRpbmcgUE5JQzIgYXV0b25lZ290aWF0aW9uLCAiCisgICAgICAgICAgICAgICAgICAgICAgImNzcjE0PSU4Ljh4LlxuIiwgZGV2LT5uYW1lLCBjc3IxNCk7CisKKyAgICAgICAgLyogdGVsbCBwbmljMl9sbmtfY2hhbmdlIHdlIGFyZSBkb2luZyBhbiBud2F5IG5lZ290aWF0aW9uICovCisJZGV2LT5pZl9wb3J0ID0gMDsKKwl0cC0+bndheSA9IHRwLT5tZWRpYXNlbnNlID0gMTsKKwl0cC0+bndheXNldCA9IHRwLT5scGFyID0gMDsKKworICAgICAgICAvKiBub3cgd2UgaGF2ZSB0byBzZXQgdXAgY3NyNiBmb3IgTldBWSBzdGF0ZSAqLworCisJdHAtPmNzcjYgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1I2KTsKKwlpZiAodHVsaXBfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE9uIEVudHJ5IHRvIE53YXksICIKKyAgICAgICAgICAgICAgICAgICAgICAiY3NyNj0lOC44eC5cbiIsIGRldi0+bmFtZSwgdHAtPmNzcjYpOworCisgICAgICAgIC8qIG1hc2sgb2ZmIGFueSBiaXRzIG5vdCB0byB0b3VjaAorICAgICAgICAgKiBjb21tZW50IGF0IHRvcCBvZiBmaWxlIGV4cGxhaW5zIG1hc2sgdmFsdWUKKyAgICAgICAgICovCisJdHAtPmNzcjYgPSB0cC0+Y3NyNiAmIDB4ZmUzYmQxZmQ7CisKKyAgICAgICAgLyogZG9uJ3QgZm9yZ2V0IHRoYXQgYml0IDkgaXMgYWxzbyB1c2VkIGZvciBhZHZlcnRpc2luZyAqLworICAgICAgICAvKiBhZHZlcnRpc2UgMTBiYXNlVC1GRCBmb3IgdGhlIG5lZ290aWF0aW9uIChiaXQgOSkgKi8KKyAgICAgICAgaWYgKHRwLT5zeW1fYWR2ZXJ0aXNlICYgMHgwMDQwKSB0cC0+Y3NyNiB8PSAweDAwMDAwMjAwOworCisgICAgICAgIC8qIHNldCBiaXQgMjQgZm9yIG53YXkgbmVnb3RpYXRpb24gbW9kZSAuLi4KKyAgICAgICAgICogc2VlIERhdGEgUG9ydCBTZWxlY3Rpb24gY29tbWVudCBhdCB0b3Agb2YgZmlsZQorICAgICAgICAgKiBhbmQgIlN0b3AiIC0gcmVzZXQgYm90aCBUcmFuc21pdCAoYml0IDEzKSBhbmQgUmVjZWl2ZSAoYml0IDEpCisgICAgICAgICAqLworICAgICAgICB0cC0+Y3NyNiB8PSAweDAxMDAwMDAwOworCWlvd3JpdGUzMihjc3IxNCwgaW9hZGRyICsgQ1NSMTQpOworCWlvd3JpdGUzMih0cC0+Y3NyNiwgaW9hZGRyICsgQ1NSNik7CisgICAgICAgIHVkZWxheSgxMDApOworCisgICAgICAgIC8qIGFsbCBzZXQgdXAgc28gbm93IGZvcmNlIHRoZSBuZWdvdGlhdGlvbiB0byBiZWdpbiAqLworCisgICAgICAgIC8qIHJlYWQgaW4gY3VycmVudCB2YWx1ZXMgYW5kIG1hc2sgb2ZmIGFsbCBidXQgdGhlCisJICogQXV0b25lZ290aWF0aW9uIGJpdHMgMTQ6MTIuICBXcml0aW5nIGEgMDAxIHRvIHRob3NlIGJpdHMKKyAgICAgICAgICogc2hvdWxkIHN0YXJ0IHRoZSBhdXRvbmVnb3RpYXRpb24KKyAgICAgICAgICovCisgICAgICAgIGNzcjEyID0gKGlvcmVhZDMyKGlvYWRkciArIENTUjEyKSAmIDB4ZmZmZjhmZmYpOworICAgICAgICBjc3IxMiB8PSAweDEwMDA7CisJaW93cml0ZTMyKGNzcjEyLCBpb2FkZHIgKyBDU1IxMik7Cit9CisKKworCit2b2lkIHBuaWMyX2xua19jaGFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNzcjUpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisgICAgICAgIGludCBjc3IxNDsKKworICAgICAgICAvKiByZWFkIHRoZSBzdGF1cyByZWdpc3RlciB0byBmaW5kIG91dCB3aGF0IGlzIHVwICovCisJaW50IGNzcjEyID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTIpOworCisJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyIlczogUE5JQzIgbGluayBzdGF0dXMgaW50ZXJydXB0ICU4Ljh4LCAiCisgICAgICAgICAgICAgICAgICAgICAgICIgQ1NSNSAleCwgJTguOHguXG4iLCBkZXYtPm5hbWUsIGNzcjEyLAorICAgICAgICAgICAgICAgICAgICAgICBjc3I1LCBpb3JlYWQzMihpb2FkZHIgKyBDU1IxNCkpOworCisJLyogSWYgTldheSBmaW5pc2hlZCBhbmQgd2UgaGF2ZSBhIG5lZ290aWF0ZWQgcGFydG5lciBjYXBhYmlsaXR5LgorICAgICAgICAgKiBjaGVjayBiaXRzIDE0OjEyIGZvciBiaXQgcGF0dGVybiAxMDEgLSBhbGwgaXMgZ29vZAorICAgICAgICAgKi8KKwlpZiAodHAtPm53YXkgICYmICAhdHAtPm53YXlzZXQpIHsKKworCSAgICAgICAgLyogd2UgZGlkIGFuIGF1dG8gbmVnb3RpYXRpb24gKi8KKworICAgICAgICAgICAgICAgIGlmICgoY3NyMTIgJiAweDcwMDApID09IDB4NTAwMCkgeworCisJICAgICAgICAgICAgICAgLyogbmVnb3RpYXRpb24gZW5kZWQgc3VjY2Vzc2Z1bGx5ICovCisKKwkgICAgICAgICAgICAgICAvKiBnZXQgdGhlIGxpbmsgcGFydG5lcnMgcmVwbHkgYW5kIG1hc2sgb3V0IGFsbCBidXQKKyAgICAgICAgICAgICAgICAgICAgICAgICogYml0cyAyNC0yMSB3aGljaCBzaG93IHRoZSBwYXJ0bmVycyBjYXBhYmlsaXRlcworICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgbWF0Y2ggdGhvc2UgdG8gd2hhdCB3ZSBhZHZlcnRpc2VkCisgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZW4gYmVnaW4gdG8gaW50ZXJwcmV0IHRoZSByZXN1bHRzIG9mIHRoZSBuZWdvdGlhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICogQWx3YXlzIGdvIGluIHRoaXMgb3JkZXIgOiAod2UgYXJlIGlnbm9yaW5nIFQ0IGZvciBub3cpCisgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAxMDBiYXNlVHgtRkQsIDEwMGJhc2VUeC1IRCwgMTBiYXNlVC1GRCwgMTBiYXNlVC1IRAorICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCQkgICAgICAgIGludCBuZWdvdGlhdGVkID0gKChjc3IxMiA+PiAxNikgJiAweDAxRTApICYgdHAtPnN5bV9hZHZlcnRpc2U7CisJCSAgICAgICAgdHAtPmxwYXIgPSAoY3NyMTIgPj4gMTYpOworCQkgICAgICAgIHRwLT5ud2F5c2V0ID0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZ290aWF0ZWQgJiAweDAxMDApICAgICAgICBkZXYtPmlmX3BvcnQgPSA1OworCQkgICAgICAgIGVsc2UgaWYgKG5lZ290aWF0ZWQgJiAweDAwODApCWRldi0+aWZfcG9ydCA9IDM7CisJCSAgICAgICAgZWxzZSBpZiAobmVnb3RpYXRlZCAmIDB4MDA0MCkJZGV2LT5pZl9wb3J0ID0gNDsKKwkJCWVsc2UgaWYgKG5lZ290aWF0ZWQgJiAweDAwMjApCWRldi0+aWZfcG9ydCA9IDA7CisJCQllbHNlIHsKKwkJCSAgICAgaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBmdW5ueSBhdXRvbmVnb3RpYXRlIHJlc3VsdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNzcjEyICU4Ljh4IGFkdmVydGlzaW5nICU0LjR4XG4iLAorCQkJICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGNzcjEyLCB0cC0+c3ltX2FkdmVydGlzZSk7CisJCQkgICAgIHRwLT5ud2F5c2V0ID0gMDsKKwkJCSAgICAgLyogc28gY2hlY2sgIGlmIDEwMGJhc2VUeCBsaW5rIHN0YXRlIGlzIG9rYXkgKi8KKwkJCSAgICAgaWYgKChjc3IxMiAmIDIpID09IDAgICYmICAodHAtPnN5bV9hZHZlcnRpc2UgJiAweDAxODApKQorCQkJICAgICAgIGRldi0+aWZfcG9ydCA9IDM7CisJCQl9CisKKwkJCS8qIG5vdyByZWNvcmQgdGhlIGR1cGxleCB0aGF0IHdhcyBuZWdvdGlhdGVkICovCisJCQl0cC0+ZnVsbF9kdXBsZXggPSAwOworCQkJaWYgKChkZXYtPmlmX3BvcnQgPT0gNCkgfHwgKGRldi0+aWZfcG9ydCA9PSA1KSkKKwkJCSAgICAgICB0cC0+ZnVsbF9kdXBsZXggPSAxOworCisJCQlpZiAodHVsaXBfZGVidWcgPiAxKSB7CisJCQkgICAgICAgaWYgKHRwLT5ud2F5c2V0KQorCQkJICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBTd2l0Y2hpbmcgdG8gJXMgYmFzZWQgb24gbGluayAiCisJCQkJICAgICJuZWdvdGlhdGlvbiAlNC40eCAmICU0LjR4ID0gJTQuNHguXG4iLAorCQkJCSAgICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+c3ltX2FkdmVydGlzZSwgdHAtPmxwYXIsIG5lZ290aWF0ZWQpOworCQkJfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW1lbWJlciB0byB0dXJuIG9mZiBiaXQgNyAtIGF1dG9uZWdvdGlhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGVuYWJsZSBzbyB3ZSBjYW4gcHJvcGVybHkgZW5kIG53YXkgbW9kZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHNldCBkdXBsZXggKGllLiB1c2UgY3NyNjw5PiBhZ2FpbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworCSAgICAgICAgICAgICAgICBjc3IxNCA9IChpb3JlYWQzMihpb2FkZHIgKyBDU1IxNCkgJiAweGZmZmZmZjdmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvd3JpdGUzMihjc3IxNCxpb2FkZHIgKyBDU1IxNCk7CisKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogbm93IHNldCB0aGUgZGF0YSBwb3J0IGFuZCBvcGVyYXRpbmcgbW9kZQorCQkJICogKHNlZSB0aGUgRGF0YSBQb3J0IFNlbGVjdGlvbiBjb21tZW50cyBhdAorCQkJICogdGhlIHRvcCBvZiB0aGUgZmlsZQorCQkJICovCisKKwkJCS8qIGdldCBjdXJyZW50IGNzcjYgYW5kIG1hc2sgb2ZmIGJpdHMgbm90IHRvIHRvdWNoICovCisJCQkvKiBzZWUgY29tbWVudCBhdCB0b3Agb2YgZmlsZSAqLworCisJCQl0cC0+Y3NyNiA9IChpb3JlYWQzMihpb2FkZHIgKyBDU1I2KSAmIDB4ZmUzYmQxZmQpOworCisJCQkvKiBzbyBpZiB1c2luZyBpZl9wb3J0IDMgb3IgNSB0aGVuIHNlbGVjdCB0aGUgMTAwYmFzZVQKKwkJCSAqIHBvcnQgZWxzZSBzZWxlY3QgdGhlIDEwYmFzZVQgcG9ydC4KKwkJCSAqIFNlZSB0aGUgRGF0YSBQb3J0IFNlbGVjdGlvbiB0YWJsZSBhdCB0aGUgdG9wCisJCQkgKiBvZiB0aGUgZmlsZSB3aGljaCB3YXMgdGFrZW4gZnJvbSB0aGUgUE5JQ19JSS5QREYKKwkJCSAqIGRhdGFzaGVldAorCQkJICovCisJCQlpZiAoZGV2LT5pZl9wb3J0ICYgMSkgdHAtPmNzcjYgfD0gMHgwMTg0MDAwMDsKKwkJCWVsc2UgdHAtPmNzcjYgfD0gMHgwMDQwMDAwMDsKKworCQkJLyogbm93IHNldCB0aGUgZnVsbCBkdXBsZXggYml0IGFwcHJvcHJpYXRlbHkgKi8KKwkJCWlmICh0cC0+ZnVsbF9kdXBsZXgpIHRwLT5jc3I2IHw9IDB4MDAwMDAyMDA7CisKKwkJCWlvd3JpdGUzMigxLCBpb2FkZHIgKyBDU1IxMyk7CisKKwkJCWlmICh0dWxpcF9kZWJ1ZyA+IDIpCisJCQkgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogIFNldHRpbmcgQ1NSNiAlOC44eC8leCBDU1IxMiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlOC44eC5cbiIsIGRldi0+bmFtZSwgdHAtPmNzcjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvcmVhZDMyKGlvYWRkciArIENTUjYpLCBpb3JlYWQzMihpb2FkZHIgKyBDU1IxMikpOworCisJCQkvKiBub3cgdGhlIGZvbGxvd2luZyBhY3R1YWxseSB3cml0ZXMgb3V0IHRoZQorCQkJICogbmV3IGNzcjYgdmFsdWVzCisJCQkgKi8KKwkJCXR1bGlwX3N0YXJ0X3J4dHgodHApOworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKwkgICAgICAgIH0gZWxzZSB7CisJICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBBdXRvbmVnb3RpYXRpb24gZmFpbGVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgJXMsIGxpbmsgYmVhdCBzdGF0dXMgJTQuNHguXG4iLAorCQkJCSAgICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSwgY3NyMTIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW1lbWJlciB0byB0dXJuIG9mZiBiaXQgNyAtIGF1dG9uZWdvdGlhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGVuYWJsZSBzbyB3ZSBkb24ndCBmb3JnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworCSAgICAgICAgICAgICAgICBjc3IxNCA9IChpb3JlYWQzMihpb2FkZHIgKyBDU1IxNCkgJiAweGZmZmZmZjdmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvd3JpdGUzMihjc3IxNCxpb2FkZHIgKyBDU1IxNCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdoYXQgc2hvdWxkIHdlIGRvIHdoZW4gYXV0b25lZ290aWF0ZSBmYWlscz8KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHNob3VsZCB3ZSB0cnkgYWdhaW4gb3IgZGVmYXVsdCB0byBiYXNlbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICogY2FzZS4gIEkganVzdCBkb24ndCBrbm93LgorICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGZvciBub3cgZGVmYXVsdCB0byBzb21lIGJhc2VsaW5lIGNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJICAgICAgICAgICAgICAgICBkZXYtPmlmX3BvcnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5ud2F5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+bndheXNldCA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgdG8gMTBiYXNlVHgtSEQgLSBzZWUgRGF0YSBQb3J0IFNlbGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvbW1lbnQgZ2l2ZW4gYXQgdGhlIHRvcCBvZiB0aGUgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCSAgICAgICAgICAgICAgICAgdHAtPmNzcjYgPSAoaW9yZWFkMzIoaW9hZGRyICsgQ1NSNikgJiAweGZlM2JkMWZkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+Y3NyNiB8PSAweDAwNDAwMDAwOworCisJICAgICAgICAgICAgICAgICB0dWxpcF9yZXN0YXJ0X3J4dHgodHApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisJCX0KKwl9CisKKwlpZiAoKHRwLT5ud2F5c2V0ICAmJiAgKGNzcjUgJiAweDA4MDAwMDAwKQorCQkJICAmJiAoZGV2LT5pZl9wb3J0ID09IDMgIHx8ICBkZXYtPmlmX3BvcnQgPT0gNSkKKwkJCSAgJiYgKGNzcjEyICYgMikgPT0gMikgfHwgKHRwLT5ud2F5ICYmIChjc3I1ICYgKFRQTG5rRmFpbCkpKSkgeworCisJCS8qIExpbmsgYmxldz8gTWF5YmUgcmVzdGFydCBOV2F5LiAqLworCisJCWlmICh0dWxpcF9kZWJ1ZyA+IDIpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFVnaCEgTGluayBibGV3P1xuIiwgZGV2LT5uYW1lKTsKKworCQlkZWxfdGltZXJfc3luYygmdHAtPnRpbWVyKTsKKwkJcG5pYzJfc3RhcnRfbndheShkZXYpOworCQl0cC0+dGltZXIuZXhwaXJlcyA9IFJVTl9BVCgzKkhaKTsKKwkJYWRkX3RpbWVyKCZ0cC0+dGltZXIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuOworCX0KKworCisgICAgICAgIGlmIChkZXYtPmlmX3BvcnQgPT0gMyAgfHwgIGRldi0+aWZfcG9ydCA9PSA1KSB7CisKKwkgICAgICAgIC8qIHdlIGFyZSBhdCAxMDBtYiBhbmQgYSBwb3RlbnRpYWwgbGluayBjaGFuZ2Ugb2NjdXJyZWQgKi8KKworCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyIlczogUE5JQzIgJXMgbGluayBiZWF0ICVzLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdLAorCQkJCSAgIChjc3IxMiAmIDIpID8gImZhaWxlZCIgOiAiZ29vZCIpOworCisgICAgICAgICAgICAgICAgLyogY2hlY2sgMTAwIGxpbmsgYmVhdCAqLworCisgICAgICAgICAgICAgICAgdHAtPm53YXkgPSAwOworICAgICAgICAgICAgICAgIHRwLT5ud2F5c2V0ID0gMTsKKworICAgICAgICAgICAgICAgIC8qIGlmIGZhaWxlZCB0aGVuIHRyeSBkb2luZyBhbiBud2F5IHRvIGdldCBpbiBzeW5jICovCisJCWlmICgoY3NyMTIgJiAyKSAgJiYgICEgdHAtPm1lZGlhbG9jaykgeworCQkJZGVsX3RpbWVyX3N5bmMoJnRwLT50aW1lcik7CisJCQlwbmljMl9zdGFydF9ud2F5KGRldik7CisJCQl0cC0+dGltZXIuZXhwaXJlcyA9IFJVTl9BVCgzKkhaKTsKKyAgICAgICAJCQlhZGRfdGltZXIoJnRwLT50aW1lcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKwlpZiAoZGV2LT5pZl9wb3J0ID09IDAgIHx8ICBkZXYtPmlmX3BvcnQgPT0gNCkgeworCisJICAgICAgICAvKiB3ZSBhcmUgYXQgMTBtYiBhbmQgYSBwb3RlbnRpYWwgbGluayBjaGFuZ2Ugb2NjdXJyZWQgKi8KKworCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyIlczogUE5JQzIgJXMgbGluayBiZWF0ICVzLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdLAorCQkJCSAgIChjc3IxMiAmIDQpID8gImZhaWxlZCIgOiAiZ29vZCIpOworCisKKyAgICAgICAgICAgICAgICB0cC0+bndheSA9IDA7CisgICAgICAgICAgICAgICAgdHAtPm53YXlzZXQgPSAxOworCisgICAgICAgICAgICAgICAgLyogaWYgZmFpbGVkLCB0cnkgZG9pbmcgYW4gbndheSB0byBnZXQgaW4gc3luYyAqLworCQlpZiAoKGNzcjEyICYgNCkgICYmICAhIHRwLT5tZWRpYWxvY2spIHsKKwkJCWRlbF90aW1lcl9zeW5jKCZ0cC0+dGltZXIpOworCQkJcG5pYzJfc3RhcnRfbndheShkZXYpOworCQkJdHAtPnRpbWVyLmV4cGlyZXMgPSBSVU5fQVQoMypIWik7CisgICAgICAgCQkJYWRkX3RpbWVyKCZ0cC0+dGltZXIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisKKwlpZiAodHVsaXBfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9JTkZPIiVzOiBQTklDMiBMaW5rIENoYW5nZSBEZWZhdWx0P1xuIixkZXYtPm5hbWUpOworCisgICAgICAgIC8qIGlmIGFsbCBlbHNlIGZhaWxzIGRlZmF1bHQgdG8gdHJ5aW5nIDEwYmFzZVQtSEQgKi8KKwlkZXYtPmlmX3BvcnQgPSAwOworCisgICAgICAgIC8qIG1ha2Ugc3VyZSBhdXRvbmVnb3RpYXRlIGVuYWJsZSBpcyBvZmYgKi8KKwljc3IxNCA9IChpb3JlYWQzMihpb2FkZHIgKyBDU1IxNCkgJiAweGZmZmZmZjdmKTsKKyAgICAgICAgaW93cml0ZTMyKGNzcjE0LGlvYWRkciArIENTUjE0KTsKKworICAgICAgICAvKiBzZXQgdG8gMTBiYXNlVHgtSEQgLSBzZWUgRGF0YSBQb3J0IFNlbGVjdGlvbgorICAgICAgICAgKiBjb21tZW50IGdpdmVuIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUKKyAgICAgICAgICovCisJdHAtPmNzcjYgPSAoaW9yZWFkMzIoaW9hZGRyICsgQ1NSNikgJiAweGZlM2JkMWZkKTsKKyAgICAgICAgdHAtPmNzcjYgfD0gMHgwMDQwMDAwMDsKKworCXR1bGlwX3Jlc3RhcnRfcnh0eCh0cCk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3RpbWVyLmMgYi9kcml2ZXJzL25ldC90dWxpcC90aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MTU2ODIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC90aW1lci5jCkBAIC0wLDAgKzEsMTc1IEBACisvKgorCWRyaXZlcnMvbmV0L3R1bGlwL3RpbWVyLmMKKworCU1haW50YWluZWQgYnkgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorCUNvcHlyaWdodCAyMDAwLDIwMDEgIFRoZSBMaW51eCBLZXJuZWwgVGVhbQorCVdyaXR0ZW4vY29weXJpZ2h0IDE5OTQtMjAwMSBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlQbGVhc2UgcmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3R1bGlwLXVzZXIue3BkZixwcyxodG1sfQorCWZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgZHJpdmVyLCBvciB2aXNpdCB0aGUgcHJvamVjdAorCVdlYiBwYWdlIGF0IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvdHVsaXAvCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlICJ0dWxpcC5oIgorCisKK3ZvaWQgdHVsaXBfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCXUzMiBjc3IxMiA9IGlvcmVhZDMyKGlvYWRkciArIENTUjEyKTsKKwlpbnQgbmV4dF90aWNrID0gMipIWjsKKworCWlmICh0dWxpcF9kZWJ1ZyA+IDIpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNZWRpYSBzZWxlY3Rpb24gdGljaywgJXMsIHN0YXR1cyAlOC44eCBtb2RlIgorCQkJICAgIiAlOC44eCBTSUEgJTguOHggJTguOHggJTguOHggJTguOHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSNSksCisJCQkgICBpb3JlYWQzMihpb2FkZHIgKyBDU1I2KSwgY3NyMTIsIGlvcmVhZDMyKGlvYWRkciArIENTUjEzKSwKKwkJCSAgIGlvcmVhZDMyKGlvYWRkciArIENTUjE0KSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTUpKTsKKwl9CisJc3dpdGNoICh0cC0+Y2hpcF9pZCkgeworCWNhc2UgREMyMTE0MDoKKwljYXNlIERDMjExNDI6CisJY2FzZSBNWDk4NzEzOgorCWNhc2UgQ09NUEVYOTg4MToKKwljYXNlIERNOTEwWDoKKwljYXNlIFVMSTUyNlg6CisJZGVmYXVsdDogeworCQlzdHJ1Y3QgbWVkaWFsZWFmICptbGVhZjsKKwkJdW5zaWduZWQgY2hhciAqcDsKKwkJaWYgKHRwLT5tdGFibGUgPT0gTlVMTCkgewkvKiBObyBFRVBST00gaW5mbywgdXNlIGdlbmVyaWMgY29kZS4gKi8KKwkJCS8qIE5vdCBtdWNoIHRoYXQgY2FuIGJlIGRvbmUuCisJCQkgICBBc3N1bWUgdGhpcyBhIGdlbmVyaWMgTUlJIG9yIFNZTSB0cmFuc2NlaXZlci4gKi8KKwkJCW5leHRfdGljayA9IDYwKkhaOworCQkJaWYgKHR1bGlwX2RlYnVnID4gMikKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG5ldHdvcmsgbWVkaWEgbW9uaXRvciBDU1I2ICU4Ljh4ICIKKwkJCQkJICAgIkNTUjEyIDB4JTIuMnguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIGlvcmVhZDMyKGlvYWRkciArIENTUjYpLCBjc3IxMiAmIDB4ZmYpOworCQkJYnJlYWs7CisJCX0KKwkJbWxlYWYgPSAmdHAtPm10YWJsZS0+bWxlYWZbdHAtPmN1cl9pbmRleF07CisJCXAgPSBtbGVhZi0+bGVhZmRhdGE7CisJCXN3aXRjaCAobWxlYWYtPnR5cGUpIHsKKwkJY2FzZSAwOiBjYXNlIDQ6IHsKKwkJCS8qIFR5cGUgMCBzZXJpYWwgb3IgNCBTWU0gdHJhbnNjZWl2ZXIuICBDaGVjayB0aGUgbGluayBiZWF0IGJpdC4gKi8KKwkJCWludCBvZmZzZXQgPSBtbGVhZi0+dHlwZSA9PSA0ID8gNSA6IDI7CisJCQlzOCBiaXRudW0gPSBwW29mZnNldF07CisJCQlpZiAocFtvZmZzZXQrMV0gJiAweDgwKSB7CisJCQkJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUciJXM6IFRyYW5zY2VpdmVyIG1vbml0b3IgdGljayAiCisJCQkJCQkgICAiQ1NSMTI9JSMyLjJ4LCBubyBtZWRpYSBzZW5zZS5cbiIsCisJCQkJCQkgICBkZXYtPm5hbWUsIGNzcjEyKTsKKwkJCQlpZiAobWxlYWYtPnR5cGUgPT0gNCkgeworCQkJCQlpZiAobWxlYWYtPm1lZGlhID09IDMgJiYgKGNzcjEyICYgMHgwMikpCisJCQkJCQlnb3RvIHNlbGVjdF9uZXh0X21lZGlhOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICh0dWxpcF9kZWJ1ZyA+IDIpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc2NlaXZlciBtb25pdG9yIHRpY2s6IENTUjEyPSUjMi4yeCIKKwkJCQkJICAgIiBiaXQgJWQgaXMgJWQsIGV4cGVjdGluZyAlZC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgY3NyMTIsIChiaXRudW0gPj4gMSkgJiA3LAorCQkJCQkgICAoY3NyMTIgJiAoMSA8PCAoKGJpdG51bSA+PiAxKSAmIDcpKSkgIT0gMCwKKwkJCQkJICAgKGJpdG51bSA+PSAwKSk7CisJCQkvKiBDaGVjayB0aGF0IHRoZSBzcGVjaWZpZWQgYml0IGhhcyB0aGUgcHJvcGVyIHZhbHVlLiAqLworCQkJaWYgKChiaXRudW0gPCAwKSAhPQorCQkJCSgoY3NyMTIgJiAoMSA8PCAoKGJpdG51bSA+PiAxKSAmIDcpKSkgIT0gMCkpIHsKKwkJCQlpZiAodHVsaXBfZGVidWcgPiAyKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IExpbmsgYmVhdCBkZXRlY3RlZCBmb3IgJXMuXG4iLCBkZXYtPm5hbWUsCisJCQkJCSAgICAgICBtZWRpYW5hbWVbbWxlYWYtPm1lZGlhICYgTUVESUFfTUFTS10pOworCQkJCWlmICgocFsyXSAmIDB4NjEpID09IDB4MDEpCS8qIEJvZ3VzIFpueXggYm9hcmQuICovCisJCQkJCWdvdG8gYWN0dWFsbHlfbWlpOworCQkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCQlpZiAodHAtPm1lZGlhbG9jaykKKwkJCQlicmVhazsKKwkgIHNlbGVjdF9uZXh0X21lZGlhOgorCQkJaWYgKC0tdHAtPmN1cl9pbmRleCA8IDApIHsKKwkJCQkvKiBXZSBzdGFydCBhZ2FpbiwgYnV0IHNob3VsZCBpbnN0ZWFkIGxvb2sgZm9yIGRlZmF1bHQuICovCisJCQkJdHAtPmN1cl9pbmRleCA9IHRwLT5tdGFibGUtPmxlYWZjb3VudCAtIDE7CisJCQl9CisJCQlkZXYtPmlmX3BvcnQgPSB0cC0+bXRhYmxlLT5tbGVhZlt0cC0+Y3VyX2luZGV4XS5tZWRpYTsKKwkJCWlmICh0dWxpcF9tZWRpYV9jYXBbZGV2LT5pZl9wb3J0XSAmIE1lZGlhSXNGRCkKKwkJCQlnb3RvIHNlbGVjdF9uZXh0X21lZGlhOyAvKiBTa2lwIEZEIGVudHJpZXMuICovCisJCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTm8gbGluayBiZWF0IG9uIG1lZGlhICVzLCIKKwkJCQkgICAgICAgIiB0cnlpbmcgdHJhbnNjZWl2ZXIgdHlwZSAlcy5cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgbWVkaWFuYW1lW21sZWFmLT5tZWRpYSAmIE1FRElBX01BU0tdLAorCQkJCSAgICAgICBtZWRpYW5hbWVbdHAtPm10YWJsZS0+bWxlYWZbdHAtPmN1cl9pbmRleF0ubWVkaWFdKTsKKwkJCXR1bGlwX3NlbGVjdF9tZWRpYShkZXYsIDApOworCQkJLyogUmVzdGFydCB0aGUgdHJhbnNtaXQgcHJvY2Vzcy4gKi8KKwkJCXR1bGlwX3Jlc3RhcnRfcnh0eCh0cCk7CisJCQluZXh0X3RpY2sgPSAoMjQqSFopLzEwOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAxOiAgY2FzZSAzOgkJLyogMjExNDAsIDIxMTQyIE1JSSAqLworCQlhY3R1YWxseV9taWk6CisJCQlpZiAodHVsaXBfY2hlY2tfZHVwbGV4KGRldikgPCAwKSB7CisJCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJCQluZXh0X3RpY2sgPSAzKkhaOworCQkJfSBlbHNlIHsKKwkJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCQkJbmV4dF90aWNrID0gNjAqSFo7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAyOgkJCQkJLyogMjExNDIgc2VyaWFsIGJsb2NrIGhhcyBubyBsaW5rIGJlYXQuICovCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlicmVhazsKKwl9CisJLyogbW9kX3RpbWVyIHN5bmNocm9uaXplcyB1cyB3aXRoIHBvdGVudGlhbCBhZGRfdGltZXIgY2FsbHMKKwkgKiBmcm9tIGludGVycnVwdHMuCisJICovCisJbW9kX3RpbWVyKCZ0cC0+dGltZXIsIFJVTl9BVChuZXh0X3RpY2spKTsKK30KKworCit2b2lkIG14aWNfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCWludCBuZXh0X3RpY2sgPSA2MCpIWjsKKworCWlmICh0dWxpcF9kZWJ1ZyA+IDMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyIlczogTVhJQyBuZWdvdGlhdGlvbiBzdGF0dXMgJTguOHguXG4iLCBkZXYtPm5hbWUsCisJCQkgICBpb3JlYWQzMihpb2FkZHIgKyBDU1IxMikpOworCX0KKwlpZiAobmV4dF90aWNrKSB7CisJCW1vZF90aW1lcigmdHAtPnRpbWVyLCBSVU5fQVQobmV4dF90aWNrKSk7CisJfQorfQorCisKK3ZvaWQgY29tZXRfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IG5leHRfdGljayA9IDYwKkhaOworCisJaWYgKHR1bGlwX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDb21ldCBsaW5rIHN0YXR1cyAlNC40eCBwYXJ0bmVyIGNhcGFiaWxpdHkgIgorCQkJICAgIiU0LjR4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwKKwkJCSAgIHR1bGlwX21kaW9fcmVhZChkZXYsIHRwLT5waHlzWzBdLCAxKSwKKwkJCSAgIHR1bGlwX21kaW9fcmVhZChkZXYsIHRwLT5waHlzWzBdLCA1KSk7CisJLyogbW9kX3RpbWVyIHN5bmNocm9uaXplcyB1cyB3aXRoIHBvdGVudGlhbCBhZGRfdGltZXIgY2FsbHMKKwkgKiBmcm9tIGludGVycnVwdHMuCisJICovCisJaWYgKHR1bGlwX2NoZWNrX2R1cGxleChkZXYpIDwgMCkKKwkJeyBuZXRpZl9jYXJyaWVyX29mZihkZXYpOyB9CisJZWxzZQorCQl7IG5ldGlmX2NhcnJpZXJfb24oZGV2KTsgfQorCW1vZF90aW1lcigmdHAtPnRpbWVyLCBSVU5fQVQobmV4dF90aWNrKSk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwLmggYi9kcml2ZXJzL25ldC90dWxpcC90dWxpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMzQ2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC90dWxpcC5oCkBAIC0wLDAgKzEsNDkzIEBACisvKgorCWRyaXZlcnMvbmV0L3R1bGlwL3R1bGlwLmgKKworCUNvcHlyaWdodCAyMDAwLDIwMDEgIFRoZSBMaW51eCBLZXJuZWwgVGVhbQorCVdyaXR0ZW4vY29weXJpZ2h0IDE5OTQtMjAwMSBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworCW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisKKwlQbGVhc2UgcmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3R1bGlwLXVzZXIue3BkZixwcyxodG1sfQorCWZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgZHJpdmVyLCBvciB2aXNpdCB0aGUgcHJvamVjdAorCVdlYiBwYWdlIGF0IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvdHVsaXAvCisKKyovCisKKyNpZm5kZWYgX19ORVRfVFVMSVBfSF9fCisjZGVmaW5lIF9fTkVUX1RVTElQX0hfXworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKworCisvKiB1bmRlZmluZSwgb3IgZGVmaW5lIHRvIHZhcmlvdXMgZGVidWdnaW5nIGxldmVscyAoPjQgPT0gb2JzY2VuZSBsZXZlbHMpICovCisjZGVmaW5lIFRVTElQX0RFQlVHIDEKKworLyogdW5kZWZpbmUgVVNFX0lPX09QUyBmb3IgTU1JTywgZGVmaW5lIGZvciBQSU8gKi8KKyNpZmRlZiBDT05GSUdfVFVMSVBfTU1JTworIyB1bmRlZiBVU0VfSU9fT1BTCisjZWxzZQorIyBkZWZpbmUgVVNFX0lPX09QUyAxCisjZW5kaWYKKworCisKK3N0cnVjdCB0dWxpcF9jaGlwX3RhYmxlIHsKKwljaGFyICpjaGlwX25hbWU7CisJaW50IGlvX3NpemU7CisJaW50IHZhbGlkX2ludHJzOwkvKiBDU1I3IGludGVycnVwdCBlbmFibGUgc2V0dGluZ3MgKi8KKwlpbnQgZmxhZ3M7CisJdm9pZCAoKm1lZGlhX3RpbWVyKSAodW5zaWduZWQgbG9uZyBkYXRhKTsKK307CisKKworZW51bSB0YmxfZmxhZyB7CisJSEFTX01JSQkJCT0gMHgwMDAxLAorCUhBU19NRURJQV9UQUJMRQkJPSAweDAwMDIsCisJQ1NSMTJfSU5fU1JPTQkJPSAweDAwMDQsCisJQUxXQVlTX0NIRUNLX01JSQk9IDB4MDAwOCwKKwlIQVNfQUNQSQkJPSAweDAwMTAsCisJTUNfSEFTSF9PTkxZCQk9IDB4MDAyMCwgLyogSGFzaC1vbmx5IG11bHRpY2FzdCBmaWx0ZXIuICovCisJSEFTX1BOSUNOV0FZCQk9IDB4MDA4MCwKKwlIQVNfTldBWQkJPSAweDAwNDAsIC8qIFVzZXMgaW50ZXJuYWwgTldheSB4Y3ZyLiAqLworCUhBU19JTlRSX01JVElHQVRJT04JPSAweDAxMDAsCisJSVNfQVNJWAkJCT0gMHgwMjAwLAorCUhBU184MDIzWAkJPSAweDA0MDAsCisJQ09NRVRfTUFDX0FERFIJCT0gMHgwODAwLAorCUhBU19QQ0lfTVdJCQk9IDB4MTAwMCwKKwlIQVNfUEhZX0lSUQkJPSAweDIwMDAsCisJSEFTX1NXQVBQRURfU0VFUFJPTQk9IDB4NDAwMCwKKwlORUVEU19GQUtFX01FRElBX1RBQkxFCT0gMHg4MDAwLAorfTsKKworCisvKiBjaGlwIHR5cGVzLiAgY2FyZWZ1bCEgIG9yZGVyIGlzIFZFUlkgSU1QT1JUQU5UIGhlcmUsIGFzIHRoZXNlCisgKiBhcmUgdXNlZCB0aHJvdWdob3V0IHRoZSBkcml2ZXIgYXMgaW5kaWNlcyBpbnRvIGFycmF5cyAqLworLyogTm90ZSAyMTE0MiA9PSAyMTE0My4gKi8KK2VudW0gY2hpcHMgeworCURDMjEwNDAgPSAwLAorCURDMjEwNDEgPSAxLAorCURDMjExNDAgPSAyLAorCURDMjExNDIgPSAzLCBEQzIxMTQzID0gMywKKwlMQzgyQzE2OCwKKwlNWDk4NzEzLAorCU1YOTg3MTUsCisJTVg5ODcyNSwKKwlBWDg4MTQwLAorCVBOSUMyLAorCUNPTUVULAorCUNPTVBFWDk4ODEsCisJSTIxMTQ1LAorCURNOTEwWCwKKwlDT05FWEFOVCwKKwlVTEk1MjZYCit9OworCisKK2VudW0gTWVkaWFJcyB7CisJTWVkaWFJc0ZEID0gMSwKKwlNZWRpYUFsd2F5c0ZEID0gMiwKKwlNZWRpYUlzTUlJID0gNCwKKwlNZWRpYUlzRnggPSA4LAorCU1lZGlhSXMxMDAgPSAxNgorfTsKKworCisvKiBPZmZzZXRzIHRvIHRoZSBDb21tYW5kIGFuZCBTdGF0dXMgUmVnaXN0ZXJzLCAiQ1NScyIuICBBbGwgYWNjZXNzZXMKKyAgIG11c3QgYmUgbG9uZ3dvcmQgaW5zdHJ1Y3Rpb25zIGFuZCBxdWFkd29yZCBhbGlnbmVkLiAqLworZW51bSB0dWxpcF9vZmZzZXRzIHsKKwlDU1IwID0gMCwKKwlDU1IxID0gMHgwOCwKKwlDU1IyID0gMHgxMCwKKwlDU1IzID0gMHgxOCwKKwlDU1I0ID0gMHgyMCwKKwlDU1I1ID0gMHgyOCwKKwlDU1I2ID0gMHgzMCwKKwlDU1I3ID0gMHgzOCwKKwlDU1I4ID0gMHg0MCwKKwlDU1I5ID0gMHg0OCwKKwlDU1IxMCA9IDB4NTAsCisJQ1NSMTEgPSAweDU4LAorCUNTUjEyID0gMHg2MCwKKwlDU1IxMyA9IDB4NjgsCisJQ1NSMTQgPSAweDcwLAorCUNTUjE1ID0gMHg3OCwKK307CisKKy8qIHJlZ2lzdGVyIG9mZnNldCBhbmQgYml0cyBmb3IgQ0ZERCBQQ0kgY29uZmlnIHJlZyAqLworZW51bSBwY2lfY2ZnX2RyaXZlcl9yZWcgeworCUNGREQgPSAweDQwLAorCUNGRERfU2xlZXAgPSAoMSA8PCAzMSksCisJQ0ZERF9Tbm9vemUgPSAoMSA8PCAzMCksCit9OworCisjZGVmaW5lIFJ4UG9sbEludCAoUnhJbnRyfFJ4Tm9CdWZ8UnhEaWVkfFJ4SmFiYmVyKQorCisvKiBUaGUgYml0cyBpbiB0aGUgQ1NSNSBzdGF0dXMgcmVnaXN0ZXJzLCBtb3N0bHkgaW50ZXJydXB0IHNvdXJjZXMuICovCitlbnVtIHN0YXR1c19iaXRzIHsKKwlUaW1lckludCA9IDB4ODAwLAorCVN5dGVtRXJyb3IgPSAweDIwMDAsCisJVFBMbmtGYWlsID0gMHgxMDAwLAorCVRQTG5rUGFzcyA9IDB4MTAsCisJTm9ybWFsSW50ciA9IDB4MTAwMDAsCisJQWJub3JtYWxJbnRyID0gMHg4MDAwLAorCVJ4SmFiYmVyID0gMHgyMDAsCisJUnhEaWVkID0gMHgxMDAsCisJUnhOb0J1ZiA9IDB4ODAsCisJUnhJbnRyID0gMHg0MCwKKwlUeEZJRk9VbmRlcmZsb3cgPSAweDIwLAorCVR4SmFiYmVyID0gMHgwOCwKKwlUeE5vQnVmID0gMHgwNCwKKwlUeERpZWQgPSAweDAyLAorCVR4SW50ciA9IDB4MDEsCit9OworCisvKiBiaXQgbWFzayBmb3IgQ1NSNSBUWC9SWCBwcm9jZXNzIHN0YXRlICovCisjZGVmaW5lIENTUjVfVFMJMHgwMDcwMDAwMAorI2RlZmluZSBDU1I1X1JTCTB4MDAwZTAwMDAKKworZW51bSB0dWxpcF9tb2RlX2JpdHMgeworCVR4VGhyZXNob2xkCQk9ICgxIDw8IDIyKSwKKwlGdWxsRHVwbGV4CQk9ICgxIDw8IDkpLAorCVR4T24JCQk9IDB4MjAwMCwKKwlBY2NlcHRCcm9hZGNhc3QJCT0gMHgwMTAwLAorCUFjY2VwdEFsbE11bHRpY2FzdAk9IDB4MDA4MCwKKwlBY2NlcHRBbGxQaHlzCQk9IDB4MDA0MCwKKwlBY2NlcHRSdW50CQk9IDB4MDAwOCwKKwlSeE9uCQkJPSAweDAwMDIsCisJUnhUeAkJCT0gKFR4T24gfCBSeE9uKSwKK307CisKKworZW51bSB0dWxpcF9idXNjb25maWdfYml0cyB7CisJTVdJCQkJPSAoMSA8PCAyNCksCisJTVJMCQkJPSAoMSA8PCAyMyksCisJTVJNCQkJPSAoMSA8PCAyMSksCisJQ0FMU2hpZnQJCT0gMTQsCisJQnVyc3RMZW5TaGlmdAkJPSA4LAorfTsKKworCisvKiBUaGUgVHVsaXAgUnggYW5kIFR4IGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KK3N0cnVjdCB0dWxpcF9yeF9kZXNjIHsKKwlzMzIgc3RhdHVzOworCXMzMiBsZW5ndGg7CisJdTMyIGJ1ZmZlcjE7CisJdTMyIGJ1ZmZlcjI7Cit9OworCisKK3N0cnVjdCB0dWxpcF90eF9kZXNjIHsKKwlzMzIgc3RhdHVzOworCXMzMiBsZW5ndGg7CisJdTMyIGJ1ZmZlcjE7CisJdTMyIGJ1ZmZlcjI7CQkvKiBXZSB1c2Ugb25seSBidWZmZXIgMS4gICovCit9OworCisKK2VudW0gZGVzY19zdGF0dXNfYml0cyB7CisJRGVzY093bmVkID0gMHg4MDAwMDAwMCwKKwlSeERlc2NGYXRhbEVyciA9IDB4ODAwMCwKKwlSeFdob2xlUGt0ID0gMHgwMzAwLAorfTsKKworCitlbnVtIHQyMTE0M19jc3I2X2JpdHMgeworCWNzcjZfc2MgPSAoMTw8MzEpLAorCWNzcjZfcmEgPSAoMTw8MzApLAorCWNzcjZfaWduX2Rlc3RfbXNiID0gKDE8PDI2KSwKKwljc3I2X21ibyA9ICgxPDwyNSksCisJY3NyNl9zY3IgPSAoMTw8MjQpLCAgLyogc2NyYW1ibGUgbW9kZSBmbGFnOiBjYW4ndCBiZSBzZXQgKi8KKwljc3I2X3BjcyA9ICgxPDwyMyksICAvKiBFbmFibGVzIFBDUyBmdW5jdGlvbnMgKHN5bWJvbCBtb2RlIHJlcXVpcmVzIGNzcjZfcHMgYmUgc2V0KSBkZWZhdWx0IGlzIHNldCAqLworCWNzcjZfdHRtID0gKDE8PDIyKSwgIC8qIFRyYW5zbWl0IFRocmVzaG9sZCBNb2RlLCBzZXQgZm9yIDEwYmFzZVQsIDAgZm9yIDEwMEJhc2VUWCAqLworCWNzcjZfc2YgPSAoMTw8MjEpLCAgIC8qIFN0b3JlIGFuZCBmb3J3YXJkLiBJZiBzZXQgaWdub3JlcyBUUiBiaXRzICovCisJY3NyNl9oYmQgPSAoMTw8MTkpLCAgLyogSGVhcnQgYmVhdCBkaXNhYmxlLiBEaXNhYmxlcyBTUUUgZnVuY3Rpb24gaW4gMTBiYXNlVCAqLworCWNzcjZfcHMgPSAoMTw8MTgpLCAgIC8qIFBvcnQgU2VsZWN0LiAwIChkZWZ1YWx0KSA9IDEwYmFzZVQsIDEgPSAxMDBiYXNlVFg6IGNhbid0IGJlIHNldCAqLworCWNzcjZfY2EgPSAoMTw8MTcpLCAgIC8qIENvbGxpc2lvbiBPZmZzZXQgRW5hYmxlLiBJZiBzZXQgdXNlcyBzcGVjaWFsIGFsZ29yaXRobSBpbiBsb3cgY29sbGlzaW9uIHNpdHVhdGlvbnMgKi8KKwljc3I2X3RyaCA9ICgxPDwxNSksICAvKiBUcmFuc21pdCBUaHJlc2hvbGQgaGlnaCBiaXQgKi8KKwljc3I2X3RybCA9ICgxPDwxNCksICAvKiBUcmFuc21pdCBUaHJlc2hvbGQgbG93IGJpdCAqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFRoaXMgdGFibGUgc2hvd3MgdHJhbnNtaXQgdGhyZXNob2xkIHZhbHVlcyBiYXNlZCBvbiBtZWRpYSAgICoKKwkgKiBhbmQgdGhlc2UgdHdvIHJlZ2lzdGVycyAoZnJvbSBQTklDMSAmIDIgZG9jcykgTm90ZTogdGhpcyBpcyAqCisJICogYWxsIG1lYW5pbmdsZXNzIGlmIHNmIGlzIHNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiAodHJoLHRybCkgKiAxMDBCYXNlVFggKiAxMEJhc2VUICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiAgICgwLDApICAgKiAgICAgMTI4ICAgKiAgICA3MiAgICoKKwkgKiAgICgwLDEpICAgKiAgICAgMjU2ICAgKiAgICA5NiAgICoKKwkgKiAgICgxLDApICAgKiAgICAgNTEyICAgKiAgIDEyOCAgICoKKwkgKiAgICgxLDEpICAgKiAgICAxMDI0ICAgKiAgIDE2MCAgICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwljc3I2X2ZjID0gKDE8PDEyKSwgICAvKiBGb3JjZXMgYSBjb2xsaXNpb24gaW4gbmV4dCB0cmFuc21pc3Npb24gKGZvciB0ZXN0aW5nIGluIGxvb3BiYWNrIG1vZGUpICovCisJY3NyNl9vbV9pbnRfbG9vcCA9ICgxPDwxMCksIC8qIGludGVybmFsIChGSUZPKSBsb29wYmFjayBmbGFnICovCisJY3NyNl9vbV9leHRfbG9vcCA9ICgxPDwxMSksIC8qIGV4dGVybmFsIChQTUQpIGxvb3BiYWNrIGZsYWcgKi8KKwkvKiBzZXQgYm90aCBhbmQgeW91IGdldCAoUEhZKSBsb29wYmFjayAqLworCWNzcjZfZmQgPSAoMTw8OSksICAgIC8qIEZ1bGwgZHVwbGV4IG1vZGUsIGRpc2FibGVzIGhlYXJiZWF0LCBubyBsb29wYmFjayAqLworCWNzcjZfcG0gPSAoMTw8NyksICAgIC8qIFBhc3MgQWxsIE11bHRpY2FzdCAqLworCWNzcjZfcHIgPSAoMTw8NiksICAgIC8qIFByb21pc2N1b3VzIG1vZGUgKi8KKwljc3I2X3NiID0gKDE8PDUpLCAgICAvKiBTdGFydCgxKS9TdG9wKDApIGJhY2tvZmYgY291bnRlciAqLworCWNzcjZfaWYgPSAoMTw8NCksICAgIC8qIEludmVyc2UgRmlsdGVyaW5nLCByZWplY3RzIG9ubHkgYWRkcmVzc2VzIGluIGFkZHJlc3MgdGFibGU6IGNhbid0IGJlIHNldCAqLworCWNzcjZfcGIgPSAoMTw8MyksICAgIC8qIFBhc3MgQmFkIEZyYW1lcywgKDEpIGNhdXNlcyBldmVuIGJhZCBmcmFtZXMgdG8gYmUgcGFzc2VkIG9uICovCisJY3NyNl9obyA9ICgxPDwyKSwgICAgLyogSGFzaC1vbmx5IGZpbHRlcmluZyBtb2RlOiBjYW4ndCBiZSBzZXQgKi8KKwljc3I2X2hwID0gKDE8PDApLCAgICAvKiBIYXNoL1BlcmZlY3QgUmVjZWl2ZSBGaWx0ZXJpbmcgTW9kZTogY2FuJ3QgYmUgc2V0ICovCisKKwljc3I2X21hc2tfY2FwdHVyZSA9IChjc3I2X3NjIHwgY3NyNl9jYSksCisJY3NyNl9tYXNrX2RlZnN0YXRlID0gKGNzcjZfbWFza19jYXB0dXJlIHwgY3NyNl9tYm8pLAorCWNzcjZfbWFza19oZGNhcCA9IChjc3I2X21hc2tfZGVmc3RhdGUgfCBjc3I2X2hiZCB8IGNzcjZfcHMpLAorCWNzcjZfbWFza19oZGNhcHR0ID0gKGNzcjZfbWFza19oZGNhcCAgfCBjc3I2X3RyaCB8IGNzcjZfdHJsKSwKKwljc3I2X21hc2tfZnVsbGNhcCA9IChjc3I2X21hc2tfaGRjYXB0dCB8IGNzcjZfZmQpLAorCWNzcjZfbWFza19mdWxscHJvbWlzYyA9IChjc3I2X3ByIHwgY3NyNl9wbSksCisJY3NyNl9tYXNrX2ZpbHRlcnMgPSAoY3NyNl9ocCB8IGNzcjZfaG8gfCBjc3I2X2lmKSwKKwljc3I2X21hc2tfMTAwYnQgPSAoY3NyNl9zY3IgfCBjc3I2X3BjcyB8IGNzcjZfaGJkKSwKK307CisKKworLyogS2VlcCB0aGUgcmluZyBzaXplcyBhIHBvd2VyIG9mIHR3byBmb3IgZWZmaWNpZW5jeS4KKyAgIE1ha2luZyB0aGUgVHggcmluZyB0b28gbGFyZ2UgZGVjcmVhc2VzIHRoZSBlZmZlY3RpdmVuZXNzIG9mIGNoYW5uZWwKKyAgIGJvbmRpbmcgYW5kIHBhY2tldCBwcmlvcml0eS4KKyAgIFRoZXJlIGFyZSBubyBpbGwgZWZmZWN0cyBmcm9tIHRvby1sYXJnZSByZWNlaXZlIHJpbmdzLiAqLworCisjZGVmaW5lIFRYX1JJTkdfU0laRQkzMgorI2RlZmluZSBSWF9SSU5HX1NJWkUJMTI4IAorI2RlZmluZSBNRURJQV9NQVNLICAgICAzMQorCisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1MzYJLyogU2l6ZSBvZiBlYWNoIHRlbXBvcmFyeSBSeCBidWZmZXIuICovCisKKyNkZWZpbmUgVFVMSVBfTUlOX0NBQ0hFX0xJTkUJOAkvKiBpbiB1bml0cyBvZiAzMi1iaXQgd29yZHMgKi8KKworI2lmIGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9faHBwYV9fKQorLyogVGhlIFVsdHJhU3BhcmMgUENJIGNvbnRyb2xsZXJzIHdpbGwgZGlzY29ubmVjdCBhdCBldmVyeSA2NC1ieXRlCisgKiBjcm9zc2luZyBhbnl3YXlzIHNvIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHRlbGwgVHVsaXAgdG8gYnVyc3QKKyAqIGFueSBtb3JlIHRoYW4gdGhhdC4KKyAqLworI2RlZmluZSBUVUxJUF9NQVhfQ0FDSEVfTElORQkxNgkvKiBpbiB1bml0cyBvZiAzMi1iaXQgd29yZHMgKi8KKyNlbHNlCisjZGVmaW5lIFRVTElQX01BWF9DQUNIRV9MSU5FCTMyCS8qIGluIHVuaXRzIG9mIDMyLWJpdCB3b3JkcyAqLworI2VuZGlmCisKKworLyogUmluZy13cmFwIGZsYWcgaW4gbGVuZ3RoIGZpZWxkLCB1c2UgZm9yIGxhc3QgcmluZyBlbnRyeS4KKwkweDAxMDAwMDAwIG1lYW5zIGNoYWluIG9uIGJ1ZmZlcjIgYWRkcmVzcywKKwkweDAyMDAwMDAwIG1lYW5zIHVzZSB0aGUgcmluZyBzdGFydCBhZGRyZXNzIGluIENTUjIvMy4KKyAgIE5vdGU6IFNvbWUgd29yay1hbGlrZSBjaGlwcyBkbyBub3QgZnVuY3Rpb24gY29ycmVjdGx5IGluIGNoYWluZWQgbW9kZS4KKyAgIFRoZSBBU0lYIGNoaXAgd29ya3Mgb25seSBpbiBjaGFpbmVkIG1vZGUuCisgICBUaHVzIHdlIGluZGljYXRlcyByaW5nIG1vZGUsIGJ1dCBhbHdheXMgd3JpdGUgdGhlICduZXh0JyBmaWVsZCBmb3IKKyAgIGNoYWluZWQgbW9kZSBhcyB3ZWxsLgorKi8KKyNkZWZpbmUgREVTQ19SSU5HX1dSQVAgMHgwMjAwMDAwMAorCisKKyNkZWZpbmUgRUVQUk9NX1NJWkUgNTEyIAkvKiAyIDw8IEVFUFJPTV9BRERSTEVOICovCisKKworI2RlZmluZSBSVU5fQVQoeCkgKGppZmZpZXMgKyAoeCkpCisKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQkJCS8qIEFLQSBnZXRfdW5hbGlnbmVkKCkgKi8KKyNkZWZpbmUgZ2V0X3UxNihwdHIpICgqKHUxNiAqKShwdHIpKQorI2Vsc2UKKyNkZWZpbmUgZ2V0X3UxNihwdHIpICgoKHU4KikocHRyKSlbMF0gKyAoKCh1OCopKHB0cikpWzFdPDw4KSkKKyNlbmRpZgorCitzdHJ1Y3QgbWVkaWFsZWFmIHsKKwl1OCB0eXBlOworCXU4IG1lZGlhOworCXVuc2lnbmVkIGNoYXIgKmxlYWZkYXRhOworfTsKKworCitzdHJ1Y3QgbWVkaWF0YWJsZSB7CisJdTE2IGRlZmF1bHRtZWRpYTsKKwl1OCBsZWFmY291bnQ7CisJdTggY3NyMTJkaXI7CQkvKiBHZW5lcmFsIHB1cnBvc2UgcGluIGRpcmVjdGlvbnMuICovCisJdW5zaWduZWQgaGFzX21paToxOworCXVuc2lnbmVkIGhhc19ub25taWk6MTsKKwl1bnNpZ25lZCBoYXNfcmVzZXQ6NjsKKwl1MzIgY3NyMTVkaXI7CisJdTMyIGNzcjE1dmFsOwkJLyogMjExNDMgTldheSBzZXR0aW5nLiAqLworCXN0cnVjdCBtZWRpYWxlYWYgbWxlYWZbMF07Cit9OworCisKK3N0cnVjdCBtZWRpYWluZm8geworCXN0cnVjdCBtZWRpYWluZm8gKm5leHQ7CisJaW50IGluZm9fdHlwZTsKKwlpbnQgaW5kZXg7CisJdW5zaWduZWQgY2hhciAqaW5mbzsKK307CisKK3N0cnVjdCByaW5nX2luZm8geworCXN0cnVjdCBza19idWZmCSpza2I7CisJZG1hX2FkZHJfdAltYXBwaW5nOworfTsKKworCitzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSB7CisJY29uc3QgY2hhciAqcHJvZHVjdF9uYW1lOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXh0X21vZHVsZTsKKwlzdHJ1Y3QgdHVsaXBfcnhfZGVzYyAqcnhfcmluZzsKKwlzdHJ1Y3QgdHVsaXBfdHhfZGVzYyAqdHhfcmluZzsKKwlkbWFfYWRkcl90IHJ4X3JpbmdfZG1hOworCWRtYV9hZGRyX3QgdHhfcmluZ19kbWE7CisJLyogVGhlIHNhdmVkIGFkZHJlc3Mgb2YgYSBzZW50LWluLXBsYWNlIHBhY2tldC9idWZmZXIsIGZvciBza2ZyZWUoKS4gKi8KKwlzdHJ1Y3QgcmluZ19pbmZvIHR4X2J1ZmZlcnNbVFhfUklOR19TSVpFXTsKKwkvKiBUaGUgYWRkcmVzc2VzIG9mIHJlY2VpdmUtaW4tcGxhY2Ugc2tidWZmcy4gKi8KKwlzdHJ1Y3QgcmluZ19pbmZvIHJ4X2J1ZmZlcnNbUlhfUklOR19TSVpFXTsKKwl1MTYgc2V0dXBfZnJhbWVbOTZdOwkvKiBQc2V1ZG8tVHggZnJhbWUgdG8gaW5pdCBhZGRyZXNzIHRhYmxlLiAqLworCWludCBjaGlwX2lkOworCWludCByZXZpc2lvbjsKKwlpbnQgZmxhZ3M7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CS8qIE1lZGlhIHNlbGVjdGlvbiB0aW1lci4gKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBvb21fdGltZXI7ICAgIC8qIE91dCBvZiBtZW1vcnkgdGltZXIuICovCisJdTMyIG1jX2ZpbHRlclsyXTsKKwlzcGlubG9ja190IGxvY2s7CisJc3BpbmxvY2tfdCBtaWlfbG9jazsKKwl1bnNpZ25lZCBpbnQgY3VyX3J4LCBjdXJfdHg7CS8qIFRoZSBuZXh0IGZyZWUgcmluZyBlbnRyeSAqLworCXVuc2lnbmVkIGludCBkaXJ0eV9yeCwgZGlydHlfdHg7CS8qIFRoZSByaW5nIGVudHJpZXMgdG8gYmUgZnJlZSgpZWQuICovCisKKyNpZmRlZiAJQ09ORklHX1RVTElQX05BUElfSFdfTUlUSUdBVElPTgorICAgICAgICBpbnQgbWl0X29uOworI2VuZGlmCisJdW5zaWduZWQgaW50IGZ1bGxfZHVwbGV4OjE7CS8qIEZ1bGwtZHVwbGV4IG9wZXJhdGlvbiByZXF1ZXN0ZWQuICovCisJdW5zaWduZWQgaW50IGZ1bGxfZHVwbGV4X2xvY2s6MTsKKwl1bnNpZ25lZCBpbnQgZmFrZV9hZGRyOjE7CS8qIE11bHRpcG9ydCBib2FyZCBmYWtlZCBhZGRyZXNzLiAqLworCXVuc2lnbmVkIGludCBkZWZhdWx0X3BvcnQ6NDsJLyogTGFzdCBkZXYtPmlmX3BvcnQgdmFsdWUuICovCisJdW5zaWduZWQgaW50IG1lZGlhMjo0OwkvKiBTZWNvbmRhcnkgbW9uaXRvcmVkIG1lZGlhIHBvcnQuICovCisJdW5zaWduZWQgaW50IG1lZGlhbG9jazoxOwkvKiBEb24ndCBzZW5zZSBtZWRpYSB0eXBlLiAqLworCXVuc2lnbmVkIGludCBtZWRpYXNlbnNlOjE7CS8qIE1lZGlhIHNlbnNpbmcgaW4gcHJvZ3Jlc3MuICovCisJdW5zaWduZWQgaW50IG53YXk6MSwgbndheXNldDoxOwkJLyogMjExNDMgaW50ZXJuYWwgTldheS4gKi8KKwl1bnNpZ25lZCBpbnQgY3NyMDsJLyogQ1NSMCBzZXR0aW5nLiAqLworCXVuc2lnbmVkIGludCBjc3I2OwkvKiBDdXJyZW50IENTUjYgY29udHJvbCBzZXR0aW5ncy4gKi8KKwl1bnNpZ25lZCBjaGFyIGVlcHJvbVtFRVBST01fU0laRV07CS8qIFNlcmlhbCBFRVBST00gY29udGVudHMuICovCisJdm9pZCAoKmxpbmtfY2hhbmdlKSAoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGludCBjc3I1KTsKKwl1MTYgc3ltX2FkdmVydGlzZSwgbWlpX2FkdmVydGlzZTsgLyogTldheSBjYXBhYmlsaXRpZXMgYWR2ZXJ0aXNlZC4gICovCisJdTE2IGxwYXI7CQkvKiAyMTE0MyBMaW5rIHBhcnRuZXIgYWJpbGl0eS4gKi8KKwl1MTYgYWR2ZXJ0aXNpbmdbNF07CisJc2lnbmVkIGNoYXIgcGh5c1s0XSwgbWlpX2NudDsJLyogTUlJIGRldmljZSBhZGRyZXNzZXMuICovCisJc3RydWN0IG1lZGlhdGFibGUgKm10YWJsZTsKKwlpbnQgY3VyX2luZGV4OwkJLyogQ3VycmVudCBtZWRpYSBpbmRleC4gKi8KKwlpbnQgc2F2ZWRfaWZfcG9ydDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlpbnQgdHRpbWVyOworCWludCBzdXNwX3J4OworCXVuc2lnbmVkIGxvbmcgbmlyOworCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworCWludCBjc3IxMl9zaGFkb3c7CisJaW50IHBhZDA7CQkvKiBVc2VkIGZvciA4LWJ5dGUgYWxpZ25tZW50ICovCit9OworCisKK3N0cnVjdCBlZXByb21fZml4dXAgeworCWNoYXIgKm5hbWU7CisJdW5zaWduZWQgY2hhciBhZGRyMDsKKwl1bnNpZ25lZCBjaGFyIGFkZHIxOworCXVuc2lnbmVkIGNoYXIgYWRkcjI7CisJdTE2IG5ld3RhYmxlWzMyXTsJLyogTWF4IGxlbmd0aCBiZWxvdy4gKi8KK307CisKKworLyogMjExNDIuYyAqLworZXh0ZXJuIHUxNiB0MjExNDJfY3NyMTRbXTsKK3ZvaWQgdDIxMTQyX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7Cit2b2lkIHQyMTE0Ml9zdGFydF9ud2F5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCB0MjExNDJfbG5rX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY3NyNSk7CisKKworLyogUE5JQzIuYyAqLwordm9pZCBwbmljMl9sbmtfY2hhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjc3I1KTsKK3ZvaWQgcG5pYzJfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3ZvaWQgcG5pYzJfc3RhcnRfbndheShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcG5pYzJfbG5rX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY3NyNSk7CisKKy8qIGVlcHJvbS5jICovCit2b2lkIHR1bGlwX3BhcnNlX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCB0dWxpcF9yZWFkX2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbG9jYXRpb24sIGludCBhZGRyX2xlbik7CisKKy8qIGludGVycnVwdC5jICovCitleHRlcm4gdW5zaWduZWQgaW50IHR1bGlwX21heF9pbnRlcnJ1cHRfd29yazsKK2V4dGVybiBpbnQgdHVsaXBfcnhfY29weWJyZWFrOworaXJxcmV0dXJuX3QgdHVsaXBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworaW50IHR1bGlwX3JlZmlsbF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNpZmRlZiBDT05GSUdfVFVMSVBfTkFQSQoraW50IHR1bGlwX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpOworI2VuZGlmCisKKworLyogbWVkaWEuYyAqLworaW50IHR1bGlwX21kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOwordm9pZCB0dWxpcF9tZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKTsKK3ZvaWQgdHVsaXBfc2VsZWN0X21lZGlhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdGFydHVwKTsKK2ludCB0dWxpcF9jaGVja19kdXBsZXgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHR1bGlwX2ZpbmRfbWlpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYm9hcmRfaWR4KTsKKworLyogcG5pYy5jICovCit2b2lkIHBuaWNfZG9fbndheShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcG5pY19sbmtfY2hhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjc3I1KTsKK3ZvaWQgcG5pY190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOworCisvKiB0aW1lci5jICovCit2b2lkIHR1bGlwX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7Cit2b2lkIG14aWNfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK3ZvaWQgY29tZXRfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKKworLyogdHVsaXBfY29yZS5jICovCitleHRlcm4gaW50IHR1bGlwX2RlYnVnOworZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBtZWRpYW5hbWVbXTsKK2V4dGVybiBjb25zdCBjaGFyIHR1bGlwX21lZGlhX2NhcFtdOworZXh0ZXJuIHN0cnVjdCB0dWxpcF9jaGlwX3RhYmxlIHR1bGlwX3RibFtdOwordm9pZCBvb21fdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK2V4dGVybiB1OCB0MjEwNDBfY3NyMTNbXTsKKworc3RhdGljIGlubGluZSB2b2lkIHR1bGlwX3N0YXJ0X3J4dHgoc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwKQoreworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKwlpb3dyaXRlMzIodHAtPmNzcjYgfCBSeFR4LCBpb2FkZHIgKyBDU1I2KTsKKwliYXJyaWVyKCk7CisJKHZvaWQpIGlvcmVhZDMyKGlvYWRkciArIENTUjYpOyAvKiBtbWlvIHN5bmMgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIHR1bGlwX3N0b3Bfcnh0eChzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHApCit7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCXUzMiBjc3I2ID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSNik7CisKKwlpZiAoY3NyNiAmIFJ4VHgpIHsKKwkJdW5zaWduZWQgaT0xMzAwLzEwOworCQlpb3dyaXRlMzIoY3NyNiAmIH5SeFR4LCBpb2FkZHIgKyBDU1I2KTsKKwkJYmFycmllcigpOworCQkvKiB3YWl0IHVudGlsIGluLWZsaWdodCBmcmFtZSBjb21wbGV0ZXMuCisJCSAqIE1heCB0aW1lIEAgMTBCVDogMTUwMCo4Yi8xME1icHMgPT0gMTIwMHVzICgrIDEwMHVzIG1hcmdpbikKKwkJICogVHlwaWNhbGx5IGV4cGVjdCB0aGlzIGxvb3AgdG8gZW5kIGluIDwgNTAgdXMgb24gMTAwQlQuCisJCSAqLworCQl3aGlsZSAoLS1pICYmIChpb3JlYWQzMihpb2FkZHIgKyBDU1I1KSAmIChDU1I1X1RTfENTUjVfUlMpKSkKKwkJCXVkZWxheSgxMCk7CisKKwkJaWYgKCFpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0dWxpcF9zdG9wX3J4dHgoKSBmYWlsZWRcbiIsCisJCQkJCXBjaV9uYW1lKHRwLT5wZGV2KSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHVsaXBfcmVzdGFydF9yeHR4KHN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCkKK3sKKwlpZighKHRwLT5jaGlwX2lkID09IFVMSTUyNlggJiYgCisJCSh0cC0+cmV2aXNpb24gPT0gMHg0MCB8fCB0cC0+cmV2aXNpb24gPT0gMHg1MCkpKSB7CisJCXR1bGlwX3N0b3Bfcnh0eCh0cCk7CisJCXVkZWxheSg1KTsKKwl9CisJdHVsaXBfc3RhcnRfcnh0eCh0cCk7Cit9CisKKyNlbmRpZiAvKiBfX05FVF9UVUxJUF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwX2NvcmUuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDk4YjNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jCkBAIC0wLDAgKzEsMTg2MSBAQAorLyogdHVsaXBfY29yZS5jOiBBIERFQyAyMXg0eC1mYW1pbHkgZXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4gKi8KKworLyoKKwlNYWludGFpbmVkIGJ5IEplZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KKwlDb3B5cmlnaHQgMjAwMCwyMDAxICBUaGUgTGludXggS2VybmVsIFRlYW0KKwlXcml0dGVuL2NvcHlyaWdodCAxOTk0LTIwMDEgYnkgRG9uYWxkIEJlY2tlci4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJUGxlYXNlIHJlZmVyIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay90dWxpcC11c2VyLntwZGYscHMsaHRtbH0KKwlmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGRyaXZlciwgb3IgdmlzaXQgdGhlIHByb2plY3QKKwlXZWIgcGFnZSBhdCBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3R1bGlwLworCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNkZWZpbmUgRFJWX05BTUUJInR1bGlwIgorI2lmZGVmIENPTkZJR19UVUxJUF9OQVBJCisjZGVmaW5lIERSVl9WRVJTSU9OICAgICIxLjEuMTMtTkFQSSIgLyogS2VlcCBhdCBsZWFzdCBmb3IgdGVzdCAqLworI2Vsc2UKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMS4xMyIKKyNlbmRpZgorI2RlZmluZSBEUlZfUkVMREFURQkiTWF5IDExLCAyMDAyIgorCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlICJ0dWxpcC5oIgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpZmRlZiBfX3NwYXJjX18KKyNpbmNsdWRlIDxhc20vcGJtLmg+CisjZW5kaWYKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorCSJMaW51eCBUdWxpcCBkcml2ZXIgdmVyc2lvbiAiIERSVl9WRVJTSU9OICIgKCIgRFJWX1JFTERBVEUgIilcbiI7CisKKworLyogQSBmZXcgdXNlci1jb25maWd1cmFibGUgdmFsdWVzLiAqLworCisvKiBNYXhpbXVtIGV2ZW50cyAoUnggcGFja2V0cywgZXRjLikgdG8gaGFuZGxlIGF0IGVhY2ggaW50ZXJydXB0LiAqLworc3RhdGljIHVuc2lnbmVkIGludCBtYXhfaW50ZXJydXB0X3dvcmsgPSAyNTsKKworI2RlZmluZSBNQVhfVU5JVFMgOAorLyogVXNlZCB0byBwYXNzIHRoZSBmdWxsLWR1cGxleCBmbGFnLCBldGMuICovCitzdGF0aWMgaW50IGZ1bGxfZHVwbGV4W01BWF9VTklUU107CitzdGF0aWMgaW50IG9wdGlvbnNbTUFYX1VOSVRTXTsKK3N0YXRpYyBpbnQgbXR1W01BWF9VTklUU107CQkJLyogSnVtYm8gTVRVIGZvciBpbnRlcmZhY2VzLiAqLworCisvKiAgVGhlIHBvc3NpYmxlIG1lZGlhIHR5cGVzIHRoYXQgY2FuIGJlIHNldCBpbiBvcHRpb25zW10gYXJlOiAqLworY29uc3QgY2hhciAqIGNvbnN0IG1lZGlhbmFtZVszMl0gPSB7CisJIjEwYmFzZVQiLCAiMTBiYXNlMiIsICJBVUkiLCAiMTAwYmFzZVR4IiwKKwkiMTBiYXNlVC1GRFgiLCAiMTAwYmFzZVR4LUZEWCIsICIxMDBiYXNlVDQiLCAiMTAwYmFzZUZ4IiwKKwkiMTAwYmFzZUZ4LUZEWCIsICJNSUkgMTBiYXNlVCIsICJNSUkgMTBiYXNlVC1GRFgiLCAiTUlJIiwKKwkiMTBiYXNlVChmb3JjZWQpIiwgIk1JSSAxMDBiYXNlVHgiLCAiTUlJIDEwMGJhc2VUeC1GRFgiLCAiTUlJIDEwMGJhc2VUNCIsCisJIk1JSSAxMDBiYXNlRngtSERYIiwgIk1JSSAxMDBiYXNlRngtRkRYIiwgIkhvbWUtUE5BIDFNYnBzIiwgIkludmFsaWQtMTkiLAorCSIiLCIiLCIiLCIiLCAiIiwiIiwiIiwiIiwgICIiLCIiLCIiLCJUcmFuc2NlaXZlciByZXNldCIsCit9OworCisvKiBTZXQgdGhlIGNvcHkgYnJlYWtwb2ludCBmb3IgdGhlIGNvcHktb25seS10aW55LWJ1ZmZlciBSeCBzdHJ1Y3R1cmUuICovCisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX2hwcGFfXykgXAorCXx8IGRlZmluZWQoX19zcGFyY18pIHx8IGRlZmluZWQoX19pYTY0X18pIFwKKwl8fCBkZWZpbmVkKF9fc2hfXykgfHwgZGVmaW5lZChfX21pcHNfXykKK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrID0gMTUxODsKKyNlbHNlCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhayA9IDEwMDsKKyNlbmRpZgorCisvKgorICBTZXQgdGhlIGJ1cyBwZXJmb3JtYW5jZSByZWdpc3Rlci4KKwlUeXBpY2FsOiBTZXQgMTYgbG9uZ3dvcmQgY2FjaGUgYWxpZ25tZW50LCBubyBidXJzdCBsaW1pdC4KKwlDYWNoZSBhbGlnbm1lbnQgYml0cyAxNToxNAkgICAgIEJ1cnN0IGxlbmd0aCAxMzo4CisJCTAwMDAJTm8gYWxpZ25tZW50ICAweDAwMDAwMDAwIHVubGltaXRlZAkJMDgwMCA4IGxvbmd3b3JkcworCQk0MDAwCTggIGxvbmd3b3JkcwkJMDEwMCAxIGxvbmd3b3JkCQkxMDAwIDE2IGxvbmd3b3JkcworCQk4MDAwCTE2IGxvbmd3b3JkcwkJMDIwMCAyIGxvbmd3b3JkcwkyMDAwIDMyIGxvbmd3b3JkcworCQlDMDAwCTMyICBsb25nd29yZHMJCTA0MDAgNCBsb25nd29yZHMKKwlXYXJuaW5nOiBtYW55IG9sZGVyIDQ4NiBzeXN0ZW1zIGFyZSBicm9rZW4gYW5kIHJlcXVpcmUgc2V0dGluZyAweDAwQTA0ODAwCisJICAgOCBsb25nd29yZCBjYWNoZSBhbGlnbm1lbnQsIDggbG9uZ3dvcmQgYnVyc3QuCisJVG9EbzogTm9uLUludGVsIHNldHRpbmcgY291bGQgYmUgYmV0dGVyLgorKi8KKworI2lmIGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9faWE2NF9fKQorc3RhdGljIGludCBjc3IwID0gMHgwMUEwMDAwMCB8IDB4RTAwMDsKKyNlbGlmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKK3N0YXRpYyBpbnQgY3NyMCA9IDB4MDFBMDAwMDAgfCAweDgwMDA7CisjZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykgfHwgZGVmaW5lZChfX2hwcGFfXykKKy8qIFRoZSBVbHRyYVNwYXJjIFBDSSBjb250cm9sbGVycyB3aWxsIGRpc2Nvbm5lY3QgYXQgZXZlcnkgNjQtYnl0ZQorICogY3Jvc3NpbmcgYW55d2F5cyBzbyBpdCBtYWtlcyBubyBzZW5zZSB0byB0ZWxsIFR1bGlwIHRvIGJ1cnN0CisgKiBhbnkgbW9yZSB0aGFuIHRoYXQuCisgKi8KK3N0YXRpYyBpbnQgY3NyMCA9IDB4MDFBMDAwMDAgfCAweDkwMDA7CisjZWxpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX19zaF9fKQorc3RhdGljIGludCBjc3IwID0gMHgwMUEwMDAwMCB8IDB4NDgwMDsKKyNlbGlmIGRlZmluZWQoX19taXBzX18pCitzdGF0aWMgaW50IGNzcjAgPSAweDAwMjAwMDAwIHwgMHg0MDAwOworI2Vsc2UKKyN3YXJuaW5nIFByb2Nlc3NvciBhcmNoaXRlY3R1cmUgdW5kZWZpbmVkIQorc3RhdGljIGludCBjc3IwID0gMHgwMEEwMDAwMCB8IDB4NDgwMDsKKyNlbmRpZgorCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgdXN1YWxseSBhcmUgbm90IGNoYW5nZWQuICovCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQgICg0KkhaKQorCisKK01PRFVMRV9BVVRIT1IoIlRoZSBMaW51eCBLZXJuZWwgVGVhbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEaWdpdGFsIDIxKjQqIFR1bGlwIGV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworbW9kdWxlX3BhcmFtKHR1bGlwX2RlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyeF9jb3B5YnJlYWssIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY3NyMCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShvcHRpb25zLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGZ1bGxfZHVwbGV4LCBpbnQsIE5VTEwsIDApOworCisjZGVmaW5lIFBGWCBEUlZfTkFNRSAiOiAiCisKKyNpZmRlZiBUVUxJUF9ERUJVRworaW50IHR1bGlwX2RlYnVnID0gVFVMSVBfREVCVUc7CisjZWxzZQoraW50IHR1bGlwX2RlYnVnID0gMTsKKyNlbmRpZgorCisKKworLyoKKyAqIFRoaXMgdGFibGUgdXNlIGR1cmluZyBvcGVyYXRpb24gZm9yIGNhcGFiaWxpdGllcyBhbmQgbWVkaWEgdGltZXIuCisgKgorICogSXQgaXMgaW5kZXhlZCB2aWEgdGhlIHZhbHVlcyBpbiAnZW51bSBjaGlwcycKKyAqLworCitzdHJ1Y3QgdHVsaXBfY2hpcF90YWJsZSB0dWxpcF90YmxbXSA9IHsKKyAgeyB9LCAvKiBwbGFjZWhvbGRlciBmb3IgYXJyYXksIHNsb3QgdW51c2VkIGN1cnJlbnRseSAqLworICB7IH0sIC8qIHBsYWNlaG9sZGVyIGZvciBhcnJheSwgc2xvdCB1bnVzZWQgY3VycmVudGx5ICovCisKKyAgLyogREMyMTE0MCAqLworICB7ICJEaWdpdGFsIERTMjExNDAgVHVsaXAiLCAxMjgsIDB4MDAwMWViZWYsCisJSEFTX01JSSB8IEhBU19NRURJQV9UQUJMRSB8IENTUjEyX0lOX1NST00gfCBIQVNfUENJX01XSSwgdHVsaXBfdGltZXIgfSwKKworICAvKiBEQzIxMTQyLCBEQzIxMTQzICovCisgIHsgIkRpZ2l0YWwgRFMyMTE0MyBUdWxpcCIsIDEyOCwgMHgwODAxZmJmZiwKKwlIQVNfTUlJIHwgSEFTX01FRElBX1RBQkxFIHwgQUxXQVlTX0NIRUNLX01JSSB8IEhBU19BQ1BJIHwgSEFTX05XQVkKKwl8IEhBU19JTlRSX01JVElHQVRJT04gfCBIQVNfUENJX01XSSwgdDIxMTQyX3RpbWVyIH0sCisKKyAgLyogTEM4MkMxNjggKi8KKyAgeyAiTGl0ZS1PbiA4MmMxNjggUE5JQyIsIDI1NiwgMHgwMDAxZmJlZiwKKwlIQVNfTUlJIHwgSEFTX1BOSUNOV0FZLCBwbmljX3RpbWVyIH0sCisKKyAgLyogTVg5ODcxMyAqLworICB7ICJNYWNyb25peCA5ODcxMyBQTUFDIiwgMTI4LCAweDAwMDFlYmVmLAorCUhBU19NSUkgfCBIQVNfTUVESUFfVEFCTEUgfCBDU1IxMl9JTl9TUk9NLCBteGljX3RpbWVyIH0sCisKKyAgLyogTVg5ODcxNSAqLworICB7ICJNYWNyb25peCA5ODcxNSBQTUFDIiwgMjU2LCAweDAwMDFlYmVmLAorCUhBU19NRURJQV9UQUJMRSwgbXhpY190aW1lciB9LAorCisgIC8qIE1YOTg3MjUgKi8KKyAgeyAiTWFjcm9uaXggOTg3MjUgUE1BQyIsIDI1NiwgMHgwMDAxZWJlZiwKKwlIQVNfTUVESUFfVEFCTEUsIG14aWNfdGltZXIgfSwKKworICAvKiBBWDg4MTQwICovCisgIHsgIkFTSVggQVg4ODE0MCIsIDEyOCwgMHgwMDAxZmJmZiwKKwlIQVNfTUlJIHwgSEFTX01FRElBX1RBQkxFIHwgQ1NSMTJfSU5fU1JPTSB8IE1DX0hBU0hfT05MWQorCXwgSVNfQVNJWCwgdHVsaXBfdGltZXIgfSwKKworICAvKiBQTklDMiAqLworICB7ICJMaXRlLU9uIFBOSUMtSUkiLCAyNTYsIDB4MDgwMWZiZmYsCisJSEFTX01JSSB8IEhBU19OV0FZIHwgSEFTXzgwMjNYIHwgSEFTX1BDSV9NV0ksIHBuaWMyX3RpbWVyIH0sCisKKyAgLyogQ09NRVQgKi8KKyAgeyAiQURNdGVrIENvbWV0IiwgMjU2LCAweDAwMDFhYmVmLAorCUhBU19NSUkgfCBNQ19IQVNIX09OTFkgfCBDT01FVF9NQUNfQUREUiwgY29tZXRfdGltZXIgfSwKKworICAvKiBDT01QRVg5ODgxICovCisgIHsgIkNvbXBleCA5ODgxIFBNQUMiLCAxMjgsIDB4MDAwMWViZWYsCisJSEFTX01JSSB8IEhBU19NRURJQV9UQUJMRSB8IENTUjEyX0lOX1NST00sIG14aWNfdGltZXIgfSwKKworICAvKiBJMjExNDUgKi8KKyAgeyAiSW50ZWwgRFMyMTE0NSBUdWxpcCIsIDEyOCwgMHgwODAxZmJmZiwKKwlIQVNfTUlJIHwgSEFTX01FRElBX1RBQkxFIHwgQUxXQVlTX0NIRUNLX01JSSB8IEhBU19BQ1BJCisJfCBIQVNfTldBWSB8IEhBU19QQ0lfTVdJLCB0MjExNDJfdGltZXIgfSwKKworICAvKiBETTkxMFggKi8KKyAgeyAiRGF2aWNvbSBETTkxMDIvRE05MTAyQSIsIDEyOCwgMHgwMDAxZWJlZiwKKwlIQVNfTUlJIHwgSEFTX01FRElBX1RBQkxFIHwgQ1NSMTJfSU5fU1JPTSB8IEhBU19BQ1BJLAorCXR1bGlwX3RpbWVyIH0sCisKKyAgLyogUlM3MTEyICovCisgIHsgIkNvbmV4YW50IExBTmZpbml0eSIsIDI1NiwgMHgwMDAxZWJlZiwKKwlIQVNfTUlJIHwgSEFTX0FDUEksIHR1bGlwX3RpbWVyIH0sCisKKyAgIC8qIFVMaTUyNlggKi8KKyAgIHsgIlVMaSBNNTI2MS9NNTI2MyIsIDEyOCwgMHgwMDAxZWJlZiwKKyAgICAgICAgSEFTX01JSSB8IEhBU19NRURJQV9UQUJMRSB8IENTUjEyX0lOX1NST00gfCBIQVNfQUNQSSwgdHVsaXBfdGltZXIgfSwKK307CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHR1bGlwX3BjaV90YmxbXSA9IHsKKwl7IDB4MTAxMSwgMHgwMDA5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBEQzIxMTQwIH0sCisJeyAweDEwMTEsIDB4MDAxOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgREMyMTE0MyB9LAorCXsgMHgxMUFELCAweDAwMDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIExDODJDMTY4IH0sCisJeyAweDEwZDksIDB4MDUxMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVg5ODcxMyB9LAorCXsgMHgxMGQ5LCAweDA1MzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIE1YOTg3MTUgfSwKKy8qCXsgMHgxMGQ5LCAweDA1MzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIE1YOTg3MjUgfSwqLworCXsgMHgxMjVCLCAweDE0MDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEFYODgxNDAgfSwKKwl7IDB4MTFBRCwgMHhjMTE1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBQTklDMiB9LAorCXsgMHgxMzE3LCAweDA5ODEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisJeyAweDEzMTcsIDB4MDk4NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwKKwl7IDB4MTMxNywgMHgxOTg1LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDT01FVCB9LAorCXsgMHgxMzE3LCAweDk1MTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisJeyAweDEzRDEsIDB4QUIwMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwKKwl7IDB4MTNEMSwgMHhBQjAzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDT01FVCB9LAorCXsgMHgxM0QxLCAweEFCMDgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisJeyAweDEwNEEsIDB4MDk4MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwKKwl7IDB4MTA0QSwgMHgyNzc0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDT01FVCB9LAorCXsgMHgxMjU5LCAweGExMjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisJeyAweDExRjYsIDB4OTg4MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NUEVYOTg4MSB9LAorCXsgMHg4MDg2LCAweDAwMzksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEkyMTE0NSB9LAorCXsgMHgxMjgyLCAweDkxMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIERNOTEwWCB9LAorCXsgMHgxMjgyLCAweDkxMDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIERNOTEwWCB9LAorCXsgMHgxMTEzLCAweDEyMTYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisJeyAweDExMTMsIDB4MTIxNywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTVg5ODcxNSB9LAorCXsgMHgxMTEzLCAweDk1MTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisJeyAweDExODYsIDB4MTU0MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwKKwl7IDB4MTE4NiwgMHgxNTYxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDT01FVCB9LAorCXsgMHgxMTg2LCAweDE1OTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisJeyAweDE0ZjEsIDB4MTgwMywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09ORVhBTlQgfSwKKwl7IDB4MTYyNiwgMHg4NDEwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDT01FVCB9LAorCXsgMHgxNzM3LCAweEFCMDksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sCisJeyAweDE3MzcsIDB4QUIwOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwKKwl7IDB4MTdCMywgMHhBQjA4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDT01FVCB9LAorIAl7IDB4MTBiOSwgMHg1MjYxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBVTEk1MjZYIH0sCS8qIEFMaSAxNTYzIGludGVncmF0ZWQgZXRoZXJuZXQgKi8KKyAJeyAweDEwYjksIDB4NTI2MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgVUxJNTI2WCB9LAkvKiBBTGkgMTU2MyBpbnRlZ3JhdGVkIGV0aGVybmV0ICovCisJeyAweDEwYjcsIDB4OTMwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ09NRVQgfSwgLyogM0NvbSAzQ1NPSE8xMDBCLVRYICovCisJeyB9IC8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHR1bGlwX3BjaV90YmwpOworCisKKy8qIEEgZnVsbC1kdXBsZXggbWFwIGZvciBtZWRpYSB0eXBlcy4gKi8KK2NvbnN0IGNoYXIgdHVsaXBfbWVkaWFfY2FwWzMyXSA9Cit7MCwwLDAsMTYsICAzLDE5LDE2LDI0LCAgMjcsNCw3LDUsIDAsMjAsMjMsMjAsICAyOCwzMSwwLDAsIH07CisKK3N0YXRpYyB2b2lkIHR1bGlwX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB0dWxpcF9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHR1bGlwX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHR1bGlwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHR1bGlwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgdHVsaXBfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB0dWxpcF9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp0dWxpcF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHByaXZhdGVfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgcG9sbF90dWxpcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCB0dWxpcF9zZXRfcG93ZXJfc3RhdGUgKHN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCwKKwkJCQkgICBpbnQgc2xlZXAsIGludCBzbm9vemUpCit7CisJaWYgKHRwLT5mbGFncyAmIEhBU19BQ1BJKSB7CisJCXUzMiB0bXAsIG5ld3RtcDsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkICh0cC0+cGRldiwgQ0ZERCwgJnRtcCk7CisJCW5ld3RtcCA9IHRtcCAmIH4oQ0ZERF9TbGVlcCB8IENGRERfU25vb3plKTsKKwkJaWYgKHNsZWVwKQorCQkJbmV3dG1wIHw9IENGRERfU2xlZXA7CisJCWVsc2UgaWYgKHNub296ZSkKKwkJCW5ld3RtcCB8PSBDRkREX1Nub296ZTsKKwkJaWYgKHRtcCAhPSBuZXd0bXApCisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkICh0cC0+cGRldiwgQ0ZERCwgbmV3dG1wKTsKKwl9CisKK30KKworCitzdGF0aWMgdm9pZCB0dWxpcF91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCWludCBuZXh0X3RpY2sgPSAzKkhaOworCWludCBpOworCisJLyogV2FrZSB0aGUgY2hpcCBmcm9tIHNsZWVwL3Nub296ZSBtb2RlLiAqLworCXR1bGlwX3NldF9wb3dlcl9zdGF0ZSAodHAsIDAsIDApOworCisJLyogT24gc29tZSBjaGlwIHJldnMgd2UgbXVzdCBzZXQgdGhlIE1JSS9TWU0gcG9ydCBiZWZvcmUgdGhlIHJlc2V0IT8gKi8KKwlpZiAodHAtPm1paV9jbnQgIHx8ICAodHAtPm10YWJsZSAgJiYgIHRwLT5tdGFibGUtPmhhc19taWkpKQorCQlpb3dyaXRlMzIoMHgwMDA0MDAwMCwgaW9hZGRyICsgQ1NSNik7CisKKwkvKiBSZXNldCB0aGUgY2hpcCwgaG9sZGluZyBiaXQgMCBzZXQgYXQgbGVhc3QgNTAgUENJIGN5Y2xlcy4gKi8KKwlpb3dyaXRlMzIoMHgwMDAwMDAwMSwgaW9hZGRyICsgQ1NSMCk7CisJdWRlbGF5KDEwMCk7CisKKwkvKiBEZWFzc2VydCByZXNldC4KKwkgICBXYWl0IHRoZSBzcGVjaWZpZWQgNTAgUENJIGN5Y2xlcyBhZnRlciBhIHJlc2V0IGJ5IGluaXRpYWxpemluZworCSAgIFR4IGFuZCBSeCBxdWV1ZXMgYW5kIHRoZSBhZGRyZXNzIGZpbHRlciBsaXN0LiAqLworCWlvd3JpdGUzMih0cC0+Y3NyMCwgaW9hZGRyICsgQ1NSMCk7CisJdWRlbGF5KDEwMCk7CisKKwlpZiAodHVsaXBfZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR1bGlwX3VwKCksIGlycT09JWQuXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKworCWlvd3JpdGUzMih0cC0+cnhfcmluZ19kbWEsIGlvYWRkciArIENTUjMpOworCWlvd3JpdGUzMih0cC0+dHhfcmluZ19kbWEsIGlvYWRkciArIENTUjQpOworCXRwLT5jdXJfcnggPSB0cC0+Y3VyX3R4ID0gMDsKKwl0cC0+ZGlydHlfcnggPSB0cC0+ZGlydHlfdHggPSAwOworCisJaWYgKHRwLT5mbGFncyAmIE1DX0hBU0hfT05MWSkgeworCQl1MzIgYWRkcl9sb3cgPSBsZTMyX3RvX2NwdShnZXRfdW5hbGlnbmVkKCh1MzIgKilkZXYtPmRldl9hZGRyKSk7CisJCXUzMiBhZGRyX2hpZ2ggPSBsZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKCh1MTYgKikoZGV2LT5kZXZfYWRkcis0KSkpOworCQlpZiAodHAtPmNoaXBfaWQgPT0gQVg4ODE0MCkgeworCQkJaW93cml0ZTMyKDAsIGlvYWRkciArIENTUjEzKTsKKwkJCWlvd3JpdGUzMihhZGRyX2xvdywgIGlvYWRkciArIENTUjE0KTsKKwkJCWlvd3JpdGUzMigxLCBpb2FkZHIgKyBDU1IxMyk7CisJCQlpb3dyaXRlMzIoYWRkcl9oaWdoLCBpb2FkZHIgKyBDU1IxNCk7CisJCX0gZWxzZSBpZiAodHAtPmZsYWdzICYgQ09NRVRfTUFDX0FERFIpIHsKKwkJCWlvd3JpdGUzMihhZGRyX2xvdywgIGlvYWRkciArIDB4QTQpOworCQkJaW93cml0ZTMyKGFkZHJfaGlnaCwgaW9hZGRyICsgMHhBOCk7CisJCQlpb3dyaXRlMzIoMCwgaW9hZGRyICsgMHhBQyk7CisJCQlpb3dyaXRlMzIoMCwgaW9hZGRyICsgMHhCMCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBUaGlzIGlzIHNldF9yeF9tb2RlKCksIGJ1dCB3aXRob3V0IHN0YXJ0aW5nIHRoZSB0cmFuc21pdHRlci4gKi8KKwkJdTE2ICplYWRkcnMgPSAodTE2ICopZGV2LT5kZXZfYWRkcjsKKwkJdTE2ICpzZXR1cF9mcm0gPSAmdHAtPnNldHVwX2ZyYW1lWzE1KjZdOworCQlkbWFfYWRkcl90IG1hcHBpbmc7CisKKwkJLyogMjExNDAgYnVnOiB5b3UgbXVzdCBhZGQgdGhlIGJyb2FkY2FzdCBhZGRyZXNzLiAqLworCQltZW1zZXQodHAtPnNldHVwX2ZyYW1lLCAweGZmLCBzaXplb2YodHAtPnNldHVwX2ZyYW1lKSk7CisJCS8qIEZpbGwgdGhlIGZpbmFsIGVudHJ5IG9mIHRoZSB0YWJsZSB3aXRoIG91ciBwaHlzaWNhbCBhZGRyZXNzLiAqLworCQkqc2V0dXBfZnJtKysgPSBlYWRkcnNbMF07ICpzZXR1cF9mcm0rKyA9IGVhZGRyc1swXTsKKwkJKnNldHVwX2ZybSsrID0gZWFkZHJzWzFdOyAqc2V0dXBfZnJtKysgPSBlYWRkcnNbMV07CisJCSpzZXR1cF9mcm0rKyA9IGVhZGRyc1syXTsgKnNldHVwX2ZybSsrID0gZWFkZHJzWzJdOworCisJCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGRldiwgdHAtPnNldHVwX2ZyYW1lLAorCQkJCQkgc2l6ZW9mKHRwLT5zZXR1cF9mcmFtZSksCisJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJdHAtPnR4X2J1ZmZlcnNbdHAtPmN1cl90eF0uc2tiID0gTlVMTDsKKwkJdHAtPnR4X2J1ZmZlcnNbdHAtPmN1cl90eF0ubWFwcGluZyA9IG1hcHBpbmc7CisKKwkJLyogUHV0IHRoZSBzZXR1cCBmcmFtZSBvbiB0aGUgVHggbGlzdC4gKi8KKwkJdHAtPnR4X3JpbmdbdHAtPmN1cl90eF0ubGVuZ3RoID0gY3B1X3RvX2xlMzIoMHgwODAwMDAwMCB8IDE5Mik7CisJCXRwLT50eF9yaW5nW3RwLT5jdXJfdHhdLmJ1ZmZlcjEgPSBjcHVfdG9fbGUzMihtYXBwaW5nKTsKKwkJdHAtPnR4X3JpbmdbdHAtPmN1cl90eF0uc3RhdHVzID0gY3B1X3RvX2xlMzIoRGVzY093bmVkKTsKKworCQl0cC0+Y3VyX3R4Kys7CisJfQorCisJdHAtPnNhdmVkX2lmX3BvcnQgPSBkZXYtPmlmX3BvcnQ7CisJaWYgKGRldi0+aWZfcG9ydCA9PSAwKQorCQlkZXYtPmlmX3BvcnQgPSB0cC0+ZGVmYXVsdF9wb3J0OworCisJLyogQWxsb3cgc2VsZWN0aW5nIGEgZGVmYXVsdCBtZWRpYS4gKi8KKwlpID0gMDsKKwlpZiAodHAtPm10YWJsZSA9PSBOVUxMKQorCQlnb3RvIG1lZGlhX3BpY2tlZDsKKwlpZiAoZGV2LT5pZl9wb3J0KSB7CisJCWludCBsb29raW5nX2ZvciA9IHR1bGlwX21lZGlhX2NhcFtkZXYtPmlmX3BvcnRdICYgTWVkaWFJc01JSSA/IDExIDoKKwkJCShkZXYtPmlmX3BvcnQgPT0gMTIgPyAwIDogZGV2LT5pZl9wb3J0KTsKKwkJZm9yIChpID0gMDsgaSA8IHRwLT5tdGFibGUtPmxlYWZjb3VudDsgaSsrKQorCQkJaWYgKHRwLT5tdGFibGUtPm1sZWFmW2ldLm1lZGlhID09IGxvb2tpbmdfZm9yKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVzaW5nIHVzZXItc3BlY2lmaWVkIG1lZGlhICVzLlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbZGV2LT5pZl9wb3J0XSk7CisJCQkJZ290byBtZWRpYV9waWNrZWQ7CisJCQl9CisJfQorCWlmICgodHAtPm10YWJsZS0+ZGVmYXVsdG1lZGlhICYgMHgwODAwKSA9PSAwKSB7CisJCWludCBsb29raW5nX2ZvciA9IHRwLT5tdGFibGUtPmRlZmF1bHRtZWRpYSAmIE1FRElBX01BU0s7CisJCWZvciAoaSA9IDA7IGkgPCB0cC0+bXRhYmxlLT5sZWFmY291bnQ7IGkrKykKKwkJCWlmICh0cC0+bXRhYmxlLT5tbGVhZltpXS5tZWRpYSA9PSBsb29raW5nX2ZvcikgeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVc2luZyBFRVBST00tc2V0IG1lZGlhICVzLlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBtZWRpYW5hbWVbbG9va2luZ19mb3JdKTsKKwkJCQlnb3RvIG1lZGlhX3BpY2tlZDsKKwkJCX0KKwl9CisJLyogU3RhcnQgc2Vuc2luZyBmaXJzdCBub24tZnVsbC1kdXBsZXggbWVkaWEuICovCisJZm9yIChpID0gdHAtPm10YWJsZS0+bGVhZmNvdW50IC0gMTsKKwkJICh0dWxpcF9tZWRpYV9jYXBbdHAtPm10YWJsZS0+bWxlYWZbaV0ubWVkaWFdICYgTWVkaWFBbHdheXNGRCkgJiYgaSA+IDA7IGktLSkKKwkJOworbWVkaWFfcGlja2VkOgorCisJdHAtPmNzcjYgPSAwOworCXRwLT5jdXJfaW5kZXggPSBpOworCXRwLT5ud2F5c2V0ID0gMDsKKworCWlmIChkZXYtPmlmX3BvcnQpIHsKKwkJaWYgKHRwLT5jaGlwX2lkID09IERDMjExNDMgICYmCisJCSAgICAodHVsaXBfbWVkaWFfY2FwW2Rldi0+aWZfcG9ydF0gJiBNZWRpYUlzTUlJKSkgeworCQkJLyogV2UgbXVzdCByZXNldCB0aGUgbWVkaWEgQ1NScyB3aGVuIHdlIGZvcmNlLXNlbGVjdCBNSUkgbW9kZS4gKi8KKwkJCWlvd3JpdGUzMigweDAwMDAsIGlvYWRkciArIENTUjEzKTsKKwkJCWlvd3JpdGUzMigweDAwMDAsIGlvYWRkciArIENTUjE0KTsKKwkJCWlvd3JpdGUzMigweDAwMDgsIGlvYWRkciArIENTUjE1KTsKKwkJfQorCQl0dWxpcF9zZWxlY3RfbWVkaWEoZGV2LCAxKTsKKwl9IGVsc2UgaWYgKHRwLT5jaGlwX2lkID09IERDMjExNDIpIHsKKwkJaWYgKHRwLT5taWlfY250KSB7CisJCQl0dWxpcF9zZWxlY3RfbWVkaWEoZGV2LCAxKTsKKwkJCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVzaW5nIE1JSSB0cmFuc2NlaXZlciAlZCwgc3RhdHVzICIKKwkJCQkJICAgIiU0LjR4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCB0cC0+cGh5c1swXSwgdHVsaXBfbWRpb19yZWFkKGRldiwgdHAtPnBoeXNbMF0sIDEpKTsKKwkJCWlvd3JpdGUzMihjc3I2X21hc2tfZGVmc3RhdGUsIGlvYWRkciArIENTUjYpOworCQkJdHAtPmNzcjYgPSBjc3I2X21hc2tfaGRjYXA7CisJCQlkZXYtPmlmX3BvcnQgPSAxMTsKKwkJCWlvd3JpdGUzMigweDAwMDAsIGlvYWRkciArIENTUjEzKTsKKwkJCWlvd3JpdGUzMigweDAwMDAsIGlvYWRkciArIENTUjE0KTsKKwkJfSBlbHNlCisJCQl0MjExNDJfc3RhcnRfbndheShkZXYpOworCX0gZWxzZSBpZiAodHAtPmNoaXBfaWQgPT0gUE5JQzIpIHsKKwkgICAgICAgIC8qIGZvciBpbml0aWFsIHN0YXJ0dXAgYWR2ZXJ0aXNlIDEwLzEwMCBGdWxsIGFuZCBIYWxmICovCisJICAgICAgICB0cC0+c3ltX2FkdmVydGlzZSA9IDB4MDFFMDsKKyAgICAgICAgICAgICAgICAvKiBlbmFibGUgYXV0b25lZ290aWF0ZSBlbmQgaW50ZXJydXB0ICovCisJICAgICAgICBpb3dyaXRlMzIoaW9yZWFkMzIoaW9hZGRyK0NTUjUpfCAweDAwMDA4MDEwLCBpb2FkZHIgKyBDU1I1KTsKKwkgICAgICAgIGlvd3JpdGUzMihpb3JlYWQzMihpb2FkZHIrQ1NSNyl8IDB4MDAwMDgwMTAsIGlvYWRkciArIENTUjcpOworCQlwbmljMl9zdGFydF9ud2F5KGRldik7CisJfSBlbHNlIGlmICh0cC0+Y2hpcF9pZCA9PSBMQzgyQzE2OCAgJiYgICEgdHAtPm1lZGlhbG9jaykgeworCQlpZiAodHAtPm1paV9jbnQpIHsKKwkJCWRldi0+aWZfcG9ydCA9IDExOworCQkJdHAtPmNzcjYgPSAweDgxNEMwMDAwIHwgKHRwLT5mdWxsX2R1cGxleCA/IDB4MDIwMCA6IDApOworCQkJaW93cml0ZTMyKDB4MDAwMSwgaW9hZGRyICsgQ1NSMTUpOworCQl9IGVsc2UgaWYgKGlvcmVhZDMyKGlvYWRkciArIENTUjUpICYgVFBMbmtQYXNzKQorCQkJcG5pY19kb19ud2F5KGRldik7CisJCWVsc2UgeworCQkJLyogU3RhcnQgd2l0aCAxMG1icHMgdG8gZG8gYXV0b25lZ290aWF0aW9uLiAqLworCQkJaW93cml0ZTMyKDB4MzIsIGlvYWRkciArIENTUjEyKTsKKwkJCXRwLT5jc3I2ID0gMHgwMDQyMDAwMDsKKwkJCWlvd3JpdGUzMigweDAwMDFCMDc4LCBpb2FkZHIgKyAweEI4KTsKKwkJCWlvd3JpdGUzMigweDAyMDFCMDc4LCBpb2FkZHIgKyAweEI4KTsKKwkJCW5leHRfdGljayA9IDEqSFo7CisJCX0KKwl9IGVsc2UgaWYgKCh0cC0+Y2hpcF9pZCA9PSBNWDk4NzEzIHx8IHRwLT5jaGlwX2lkID09IENPTVBFWDk4ODEpCisJCQkgICAmJiAhIHRwLT5tZWRpYWxvY2spIHsKKwkJZGV2LT5pZl9wb3J0ID0gMDsKKwkJdHAtPmNzcjYgPSAweDAxODgwMDAwIHwgKHRwLT5mdWxsX2R1cGxleCA/IDB4MDIwMCA6IDApOworCQlpb3dyaXRlMzIoMHgwZjM3MDAwMCB8IGlvcmVhZDE2KGlvYWRkciArIDB4ODApLCBpb2FkZHIgKyAweDgwKTsKKwl9IGVsc2UgaWYgKHRwLT5jaGlwX2lkID09IE1YOTg3MTUgfHwgdHAtPmNoaXBfaWQgPT0gTVg5ODcyNSkgeworCQkvKiBQcm92aWRlZCBieSBCT0xPLCBNYWNyb25peCAtIDEyLzEwLzE5OTguICovCisJCWRldi0+aWZfcG9ydCA9IDA7CisJCXRwLT5jc3I2ID0gMHgwMWE4MDIwMDsKKwkJaW93cml0ZTMyKDB4MGYzNzAwMDAgfCBpb3JlYWQxNihpb2FkZHIgKyAweDgwKSwgaW9hZGRyICsgMHg4MCk7CisJCWlvd3JpdGUzMigweDExMDAwIHwgaW9yZWFkMTYoaW9hZGRyICsgMHhhMCksIGlvYWRkciArIDB4YTApOworCX0gZWxzZSBpZiAodHAtPmNoaXBfaWQgPT0gQ09NRVQgfHwgdHAtPmNoaXBfaWQgPT0gQ09ORVhBTlQpIHsKKwkJLyogRW5hYmxlIGF1dG9tYXRpYyBUeCB1bmRlcnJ1biByZWNvdmVyeS4gKi8KKwkJaW93cml0ZTMyKGlvcmVhZDMyKGlvYWRkciArIDB4ODgpIHwgMSwgaW9hZGRyICsgMHg4OCk7CisJCWRldi0+aWZfcG9ydCA9IHRwLT5taWlfY250ID8gMTEgOiAwOworCQl0cC0+Y3NyNiA9IDB4MDAwNDAwMDA7CisJfSBlbHNlIGlmICh0cC0+Y2hpcF9pZCA9PSBBWDg4MTQwKSB7CisJCXRwLT5jc3I2ID0gdHAtPm1paV9jbnQgPyAweDAwMDQwMTAwIDogMHgwMDAwMDEwMDsKKwl9IGVsc2UKKwkJdHVsaXBfc2VsZWN0X21lZGlhKGRldiwgMSk7CisKKwkvKiBTdGFydCB0aGUgY2hpcCdzIFR4IHRvIHByb2Nlc3Mgc2V0dXAgZnJhbWUuICovCisJdHVsaXBfc3RvcF9yeHR4KHRwKTsKKwliYXJyaWVyKCk7CisJdWRlbGF5KDUpOworCWlvd3JpdGUzMih0cC0+Y3NyNiB8IFR4T24sIGlvYWRkciArIENTUjYpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJaW93cml0ZTMyKHR1bGlwX3RibFt0cC0+Y2hpcF9pZF0udmFsaWRfaW50cnMsIGlvYWRkciArIENTUjUpOworCWlvd3JpdGUzMih0dWxpcF90YmxbdHAtPmNoaXBfaWRdLnZhbGlkX2ludHJzLCBpb2FkZHIgKyBDU1I3KTsKKwl0dWxpcF9zdGFydF9yeHR4KHRwKTsKKwlpb3dyaXRlMzIoMCwgaW9hZGRyICsgQ1NSMik7CQkvKiBSeCBwb2xsIGRlbWFuZCAqLworCisJaWYgKHR1bGlwX2RlYnVnID4gMikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERvbmUgdHVsaXBfdXAoKSwgQ1NSMCAlOC44eCwgQ1NSNSAlOC44eCBDU1I2ICU4Ljh4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSMCksIGlvcmVhZDMyKGlvYWRkciArIENTUjUpLAorCQkJICAgaW9yZWFkMzIoaW9hZGRyICsgQ1NSNikpOworCX0KKworCS8qIFNldCB0aGUgdGltZXIgdG8gc3dpdGNoIHRvIGNoZWNrIGZvciBsaW5rIGJlYXQgYW5kIHBlcmhhcHMgc3dpdGNoCisJICAgdG8gYW4gYWx0ZXJuYXRlIG1lZGlhIHR5cGUuICovCisJdHAtPnRpbWVyLmV4cGlyZXMgPSBSVU5fQVQobmV4dF90aWNrKTsKKwlhZGRfdGltZXIoJnRwLT50aW1lcik7CisjaWZkZWYgQ09ORklHX1RVTElQX05BUEkKKwlpbml0X3RpbWVyKCZ0cC0+b29tX3RpbWVyKTsKKyAgICAgICAgdHAtPm9vbV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworICAgICAgICB0cC0+b29tX3RpbWVyLmZ1bmN0aW9uID0gb29tX3RpbWVyOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQKK3R1bGlwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKChyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJnR1bGlwX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KSkpCisJCXJldHVybiByZXR2YWw7CisKKwl0dWxpcF9pbml0X3JpbmcgKGRldik7CisKKwl0dWxpcF91cCAoZGV2KTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlIChkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgdHVsaXBfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJnRwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodHVsaXBfbWVkaWFfY2FwW2Rldi0+aWZfcG9ydF0gJiBNZWRpYUlzTUlJKSB7CisJCS8qIERvIG5vdGhpbmcgLS0gdGhlIG1lZGlhIG1vbml0b3Igc2hvdWxkIGhhbmRsZSB0aGlzLiAqLworCQlpZiAodHVsaXBfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRyYW5zbWl0IHRpbWVvdXQgdXNpbmcgTUlJIGRldmljZS5cbiIsCisJCQkJICAgZGV2LT5uYW1lKTsKKwl9IGVsc2UgaWYgKHRwLT5jaGlwX2lkID09IERDMjExNDAgfHwgdHAtPmNoaXBfaWQgPT0gREMyMTE0MgorCQkJICAgfHwgdHAtPmNoaXBfaWQgPT0gTVg5ODcxMyB8fCB0cC0+Y2hpcF9pZCA9PSBDT01QRVg5ODgxCisJCQkgICB8fCB0cC0+Y2hpcF9pZCA9PSBETTkxMFggfHwgdHAtPmNoaXBfaWQgPT0gVUxJNTI2WCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogMjExNDAgdHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgJTguOHgsICIKKwkJCSAgICJTSUEgJTguOHggJTguOHggJTguOHggJTguOHgsIHJlc2V0dGluZy4uLlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSNSksIGlvcmVhZDMyKGlvYWRkciArIENTUjEyKSwKKwkJCSAgIGlvcmVhZDMyKGlvYWRkciArIENTUjEzKSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTQpLCBpb3JlYWQzMihpb2FkZHIgKyBDU1IxNSkpOworCQlpZiAoICEgdHAtPm1lZGlhbG9jayAgJiYgIHRwLT5tdGFibGUpIHsKKwkJCWRvCisJCQkJLS10cC0+Y3VyX2luZGV4OworCQkJd2hpbGUgKHRwLT5jdXJfaW5kZXggPj0gMAorCQkJCSAgICYmICh0dWxpcF9tZWRpYV9jYXBbdHAtPm10YWJsZS0+bWxlYWZbdHAtPmN1cl9pbmRleF0ubWVkaWFdCisJCQkJCSAgICYgTWVkaWFJc0ZEKSk7CisJCQlpZiAoLS10cC0+Y3VyX2luZGV4IDwgMCkgeworCQkJCS8qIFdlIHN0YXJ0IGFnYWluLCBidXQgc2hvdWxkIGluc3RlYWQgbG9vayBmb3IgZGVmYXVsdC4gKi8KKwkJCQl0cC0+Y3VyX2luZGV4ID0gdHAtPm10YWJsZS0+bGVhZmNvdW50IC0gMTsKKwkJCX0KKwkJCXR1bGlwX3NlbGVjdF9tZWRpYShkZXYsIDApOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgc3dpdGNoaW5nIHRvICVzICIKKwkJCQkgICAibWVkaWEuXG4iLCBkZXYtPm5hbWUsIG1lZGlhbmFtZVtkZXYtPmlmX3BvcnRdKTsKKwkJfQorCX0gZWxzZSBpZiAodHAtPmNoaXBfaWQgPT0gUE5JQzIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFBOSUMyIHRyYW5zbWl0IHRpbWVkIG91dCwgc3RhdHVzICU4Ljh4LCAiCisJCSAgICAgICAiQ1NSNi83ICU4Ljh4IC8gJTguOHggQ1NSMTIgJTguOHgsIHJlc2V0dGluZy4uLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgKGludClpb3JlYWQzMihpb2FkZHIgKyBDU1I1KSwgKGludClpb3JlYWQzMihpb2FkZHIgKyBDU1I2KSwKKwkJICAgICAgIChpbnQpaW9yZWFkMzIoaW9hZGRyICsgQ1NSNyksIChpbnQpaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTIpKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgJTguOHgsIENTUjEyICIKKwkJCSAgICIlOC44eCwgcmVzZXR0aW5nLi4uXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQzMihpb2FkZHIgKyBDU1I1KSwgaW9yZWFkMzIoaW9hZGRyICsgQ1NSMTIpKTsKKwkJZGV2LT5pZl9wb3J0ID0gMDsKKwl9CisKKyNpZiBkZWZpbmVkKHdheV90b29fbWFueV9tZXNzYWdlcykKKwlpZiAodHVsaXBfZGVidWcgPiAzKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJCXU4ICpidWYgPSAodTggKikodHAtPnJ4X3JpbmdbaV0uYnVmZmVyMSk7CisJCQlpbnQgajsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlMmQ6ICU4Ljh4ICU4Ljh4ICU4Ljh4ICU4Ljh4ICAiCisJCQkJICAgIiUyLjJ4ICUyLjJ4ICUyLjJ4LlxuIiwKKwkJCQkgICBpLCAodW5zaWduZWQgaW50KXRwLT5yeF9yaW5nW2ldLnN0YXR1cywKKwkJCQkgICAodW5zaWduZWQgaW50KXRwLT5yeF9yaW5nW2ldLmxlbmd0aCwKKwkJCQkgICAodW5zaWduZWQgaW50KXRwLT5yeF9yaW5nW2ldLmJ1ZmZlcjEsCisJCQkJICAgKHVuc2lnbmVkIGludCl0cC0+cnhfcmluZ1tpXS5idWZmZXIyLAorCQkJCSAgIGJ1ZlswXSwgYnVmWzFdLCBidWZbMl0pOworCQkJZm9yIChqID0gMDsgYnVmW2pdICE9IDB4ZWUgJiYgaiA8IDE2MDA7IGorKykKKwkJCQlpZiAoaiA8IDEwMCkgcHJpbnRrKCIgJTIuMngiLCBidWZbal0pOworCQkJcHJpbnRrKCIgaj0lZC5cbiIsIGopOworCQl9CisJCXByaW50ayhLRVJOX0RFQlVHICIgIFJ4IHJpbmcgJTguOHg6ICIsIChpbnQpdHAtPnJ4X3JpbmcpOworCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCisJCQlwcmludGsoIiAlOC44eCIsICh1bnNpZ25lZCBpbnQpdHAtPnJ4X3JpbmdbaV0uc3RhdHVzKTsKKwkJcHJpbnRrKCJcbiIgS0VSTl9ERUJVRyAiICBUeCByaW5nICU4Ljh4OiAiLCAoaW50KXRwLT50eF9yaW5nKTsKKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCQkJcHJpbnRrKCIgJTguOHgiLCAodW5zaWduZWQgaW50KXRwLT50eF9yaW5nW2ldLnN0YXR1cyk7CisJCXByaW50aygiXG4iKTsKKwl9CisjZW5kaWYKKworCS8qIFN0b3AgYW5kIHJlc3RhcnQgdGhlIGNoaXAncyBUeCBwcm9jZXNzZXMgLiAqLworCisJdHVsaXBfcmVzdGFydF9yeHR4KHRwKTsKKwkvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSB0cmFuc21pdCBkZW1hbmQuICovCisJaW93cml0ZTMyKDAsIGlvYWRkciArIENTUjEpOworCisJdHAtPnN0YXRzLnR4X2Vycm9ycysrOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnRwLT5sb2NrLCBmbGFncyk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKK30KKworCisvKiBJbml0aWFsaXplIHRoZSBSeCBhbmQgVHggcmluZ3MsIGFsb25nIHdpdGggdmFyaW91cyAnZGV2JyBiaXRzLiAqLworc3RhdGljIHZvaWQgdHVsaXBfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCXRwLT5zdXNwX3J4ID0gMDsKKwl0cC0+dHRpbWVyID0gMDsKKwl0cC0+bmlyID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQl0cC0+cnhfcmluZ1tpXS5zdGF0dXMgPSAweDAwMDAwMDAwOworCQl0cC0+cnhfcmluZ1tpXS5sZW5ndGggPSBjcHVfdG9fbGUzMihQS1RfQlVGX1NaKTsKKwkJdHAtPnJ4X3JpbmdbaV0uYnVmZmVyMiA9IGNwdV90b19sZTMyKHRwLT5yeF9yaW5nX2RtYSArIHNpemVvZihzdHJ1Y3QgdHVsaXBfcnhfZGVzYykgKiAoaSArIDEpKTsKKwkJdHAtPnJ4X2J1ZmZlcnNbaV0uc2tiID0gTlVMTDsKKwkJdHAtPnJ4X2J1ZmZlcnNbaV0ubWFwcGluZyA9IDA7CisJfQorCS8qIE1hcmsgdGhlIGxhc3QgZW50cnkgYXMgd3JhcHBpbmcgdGhlIHJpbmcuICovCisJdHAtPnJ4X3JpbmdbaS0xXS5sZW5ndGggPSBjcHVfdG9fbGUzMihQS1RfQlVGX1NaIHwgREVTQ19SSU5HX1dSQVApOworCXRwLT5yeF9yaW5nW2ktMV0uYnVmZmVyMiA9IGNwdV90b19sZTMyKHRwLT5yeF9yaW5nX2RtYSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJZG1hX2FkZHJfdCBtYXBwaW5nOworCisJCS8qIE5vdGUgdGhlIHJlY2VpdmUgYnVmZmVyIG11c3QgYmUgbG9uZ3dvcmQgYWxpZ25lZC4KKwkJICAgZGV2X2FsbG9jX3NrYigpIHByb3ZpZGVzIDE2IGJ5dGUgYWxpZ25tZW50LiAgQnV0IGRvICpub3QqCisJCSAgIHVzZSBza2JfcmVzZXJ2ZSgpIHRvIGFsaWduIHRoZSBJUCBoZWFkZXIhICovCisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKFBLVF9CVUZfU1opOworCQl0cC0+cnhfYnVmZmVyc1tpXS5za2IgPSBza2I7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCWJyZWFrOworCQltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUodHAtPnBkZXYsIHNrYi0+dGFpbCwKKwkJCQkJIFBLVF9CVUZfU1osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCXRwLT5yeF9idWZmZXJzW2ldLm1hcHBpbmcgPSBtYXBwaW5nOworCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCXRwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IGNwdV90b19sZTMyKERlc2NPd25lZCk7CS8qIE93bmVkIGJ5IFR1bGlwIGNoaXAgKi8KKwkJdHAtPnJ4X3JpbmdbaV0uYnVmZmVyMSA9IGNwdV90b19sZTMyKG1hcHBpbmcpOworCX0KKwl0cC0+ZGlydHlfcnggPSAodW5zaWduZWQgaW50KShpIC0gUlhfUklOR19TSVpFKTsKKworCS8qIFRoZSBUeCBidWZmZXIgZGVzY3JpcHRvciBpcyBmaWxsZWQgaW4gYXMgbmVlZGVkLCBidXQgd2UKKwkgICBkbyBuZWVkIHRvIGNsZWFyIHRoZSBvd25lcnNoaXAgYml0LiAqLworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQl0cC0+dHhfYnVmZmVyc1tpXS5za2IgPSBOVUxMOworCQl0cC0+dHhfYnVmZmVyc1tpXS5tYXBwaW5nID0gMDsKKwkJdHAtPnR4X3JpbmdbaV0uc3RhdHVzID0gMHgwMDAwMDAwMDsKKwkJdHAtPnR4X3JpbmdbaV0uYnVmZmVyMiA9IGNwdV90b19sZTMyKHRwLT50eF9yaW5nX2RtYSArIHNpemVvZihzdHJ1Y3QgdHVsaXBfdHhfZGVzYykgKiAoaSArIDEpKTsKKwl9CisJdHAtPnR4X3JpbmdbaS0xXS5idWZmZXIyID0gY3B1X3RvX2xlMzIodHAtPnR4X3JpbmdfZG1hKTsKK30KKworc3RhdGljIGludAordHVsaXBfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5OworCXUzMiBmbGFnOworCWRtYV9hZGRyX3QgbWFwcGluZzsKKworCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKworCS8qIENhbGN1bGF0ZSB0aGUgbmV4dCBUeCBkZXNjcmlwdG9yIGVudHJ5LiAqLworCWVudHJ5ID0gdHAtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKKworCXRwLT50eF9idWZmZXJzW2VudHJ5XS5za2IgPSBza2I7CisJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHRwLT5wZGV2LCBza2ItPmRhdGEsCisJCQkJIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwl0cC0+dHhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZyA9IG1hcHBpbmc7CisJdHAtPnR4X3JpbmdbZW50cnldLmJ1ZmZlcjEgPSBjcHVfdG9fbGUzMihtYXBwaW5nKTsKKworCWlmICh0cC0+Y3VyX3R4IC0gdHAtPmRpcnR5X3R4IDwgVFhfUklOR19TSVpFLzIpIHsvKiBUeXBpY2FsIHBhdGggKi8KKwkJZmxhZyA9IDB4NjAwMDAwMDA7IC8qIE5vIGludGVycnVwdCAqLworCX0gZWxzZSBpZiAodHAtPmN1cl90eCAtIHRwLT5kaXJ0eV90eCA9PSBUWF9SSU5HX1NJWkUvMikgeworCQlmbGFnID0gMHhlMDAwMDAwMDsgLyogVHgtZG9uZSBpbnRyLiAqLworCX0gZWxzZSBpZiAodHAtPmN1cl90eCAtIHRwLT5kaXJ0eV90eCA8IFRYX1JJTkdfU0laRSAtIDIpIHsKKwkJZmxhZyA9IDB4NjAwMDAwMDA7IC8qIE5vIFR4LWRvbmUgaW50ci4gKi8KKwl9IGVsc2UgewkJLyogTGVhdmUgcm9vbSBmb3Igc2V0X3J4X21vZGUoKSB0byBmaWxsIGVudHJpZXMuICovCisJCWZsYWcgPSAweGUwMDAwMDAwOyAvKiBUeC1kb25lIGludHIuICovCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl9CisJaWYgKGVudHJ5ID09IFRYX1JJTkdfU0laRS0xKQorCQlmbGFnID0gMHhlMDAwMDAwMCB8IERFU0NfUklOR19XUkFQOworCisJdHAtPnR4X3JpbmdbZW50cnldLmxlbmd0aCA9IGNwdV90b19sZTMyKHNrYi0+bGVuIHwgZmxhZyk7CisJLyogaWYgd2Ugd2VyZSB1c2luZyBUcmFuc21pdCBBdXRvbWF0aWMgUG9sbGluZywgd2Ugd291bGQgbmVlZCBhCisJICogd21iKCkgaGVyZS4gKi8KKwl0cC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzID0gY3B1X3RvX2xlMzIoRGVzY093bmVkKTsKKwl3bWIoKTsKKworCXRwLT5jdXJfdHgrKzsKKworCS8qIFRyaWdnZXIgYW4gaW1tZWRpYXRlIHRyYW5zbWl0IGRlbWFuZC4gKi8KKwlpb3dyaXRlMzIoMCwgdHAtPmJhc2VfYWRkciArIENTUjEpOworCisJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0dWxpcF9jbGVhbl90eF9yaW5nKHN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCkKK3sKKwl1bnNpZ25lZCBpbnQgZGlydHlfdHg7CisKKwlmb3IgKGRpcnR5X3R4ID0gdHAtPmRpcnR5X3R4IDsgdHAtPmN1cl90eCAtIGRpcnR5X3R4ID4gMDsKKwkJZGlydHlfdHgrKykgeworCQlpbnQgZW50cnkgPSBkaXJ0eV90eCAlIFRYX1JJTkdfU0laRTsKKwkJaW50IHN0YXR1cyA9IGxlMzJfdG9fY3B1KHRwLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMpOworCisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQl0cC0+c3RhdHMudHhfZXJyb3JzKys7CS8qIEl0IHdhc24ndCBUeGVkICovCisJCQl0cC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzID0gMDsKKwkJfQorCisJCS8qIENoZWNrIGZvciBUeCBmaWx0ZXIgc2V0dXAgZnJhbWVzLiAqLworCQlpZiAodHAtPnR4X2J1ZmZlcnNbZW50cnldLnNrYiA9PSBOVUxMKSB7CisJCQkvKiB0ZXN0IGJlY2F1c2UgZHVtbXkgZnJhbWVzIG5vdCBtYXBwZWQgKi8KKwkJCWlmICh0cC0+dHhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZykKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LAorCQkJCQl0cC0+dHhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZywKKwkJCQkJc2l6ZW9mKHRwLT5zZXR1cF9mcmFtZSksCisJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQkJY29udGludWU7CisJCX0KKworCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCB0cC0+dHhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZywKKwkJCQl0cC0+dHhfYnVmZmVyc1tlbnRyeV0uc2tiLT5sZW4sCisJCQkJUENJX0RNQV9UT0RFVklDRSk7CisKKwkJLyogRnJlZSB0aGUgb3JpZ2luYWwgc2tiLiAqLworCQlkZXZfa2ZyZWVfc2tiX2lycSh0cC0+dHhfYnVmZmVyc1tlbnRyeV0uc2tiKTsKKwkJdHAtPnR4X2J1ZmZlcnNbZW50cnldLnNrYiA9IE5VTEw7CisJCXRwLT50eF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHR1bGlwX2Rvd24gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRlbF90aW1lcl9zeW5jICgmdHAtPnRpbWVyKTsKKyNpZmRlZiBDT05GSUdfVFVMSVBfTkFQSQorCWRlbF90aW1lcl9zeW5jICgmdHAtPm9vbV90aW1lcik7CisjZW5kaWYKKwlzcGluX2xvY2tfaXJxc2F2ZSAoJnRwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYnkgY2xlYXJpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCWlvd3JpdGUzMiAoMHgwMDAwMDAwMCwgaW9hZGRyICsgQ1NSNyk7CisKKwkvKiBTdG9wIHRoZSBUeCBhbmQgUnggcHJvY2Vzc2VzLiAqLworCXR1bGlwX3N0b3Bfcnh0eCh0cCk7CisKKwkvKiBwcmVwYXJlIHJlY2VpdmUgYnVmZmVycyAqLworCXR1bGlwX3JlZmlsbF9yeChkZXYpOworCisJLyogcmVsZWFzZSBhbnkgdW5jb25zdW1lZCB0cmFuc21pdCBidWZmZXJzICovCisJdHVsaXBfY2xlYW5fdHhfcmluZyh0cCk7CisKKwlpZiAoaW9yZWFkMzIgKGlvYWRkciArIENTUjYpICE9IDB4ZmZmZmZmZmYpCisJCXRwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IGlvcmVhZDMyIChpb2FkZHIgKyBDU1I4KSAmIDB4ZmZmZjsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJaW5pdF90aW1lcigmdHAtPnRpbWVyKTsKKwl0cC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwl0cC0+dGltZXIuZnVuY3Rpb24gPSB0dWxpcF90YmxbdHAtPmNoaXBfaWRdLm1lZGlhX3RpbWVyOworCisJZGV2LT5pZl9wb3J0ID0gdHAtPnNhdmVkX2lmX3BvcnQ7CisKKwkvKiBMZWF2ZSB0aGUgZHJpdmVyIGluIHNub296ZSwgbm90IHNsZWVwLCBtb2RlLiAqLworCXR1bGlwX3NldF9wb3dlcl9zdGF0ZSAodHAsIDAsIDEpOworfQorCisKK3N0YXRpYyBpbnQgdHVsaXBfY2xvc2UgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisJaW50IGk7CisKKwluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCisJdHVsaXBfZG93biAoZGV2KTsKKworCWlmICh0dWxpcF9kZWJ1ZyA+IDEpCisJCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLCBzdGF0dXMgd2FzICUyLjJ4LlxuIiwKKwkJCWRldi0+bmFtZSwgaW9yZWFkMzIgKGlvYWRkciArIENTUjUpKTsKKworCWZyZWVfaXJxIChkZXYtPmlycSwgZGV2KTsKKworCS8qIEZyZWUgYWxsIHRoZSBza2J1ZmZzIGluIHRoZSBSeCBxdWV1ZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHRwLT5yeF9idWZmZXJzW2ldLnNrYjsKKwkJZG1hX2FkZHJfdCBtYXBwaW5nID0gdHAtPnJ4X2J1ZmZlcnNbaV0ubWFwcGluZzsKKworCQl0cC0+cnhfYnVmZmVyc1tpXS5za2IgPSBOVUxMOworCQl0cC0+cnhfYnVmZmVyc1tpXS5tYXBwaW5nID0gMDsKKworCQl0cC0+cnhfcmluZ1tpXS5zdGF0dXMgPSAwOwkvKiBOb3Qgb3duZWQgYnkgVHVsaXAgY2hpcC4gKi8KKwkJdHAtPnJ4X3JpbmdbaV0ubGVuZ3RoID0gMDsKKwkJdHAtPnJ4X3JpbmdbaV0uYnVmZmVyMSA9IDB4QkFERjAwRDA7CS8qIEFuIGludmFsaWQgYWRkcmVzcy4gKi8KKwkJaWYgKHNrYikgeworCQkJcGNpX3VubWFwX3NpbmdsZSh0cC0+cGRldiwgbWFwcGluZywgUEtUX0JVRl9TWiwKKwkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiIChza2IpOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHAtPnR4X2J1ZmZlcnNbaV0uc2tiOworCisJCWlmIChza2IgIT0gTlVMTCkgeworCQkJcGNpX3VubWFwX3NpbmdsZSh0cC0+cGRldiwgdHAtPnR4X2J1ZmZlcnNbaV0ubWFwcGluZywKKwkJCQkJIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IgKHNrYik7CisJCX0KKwkJdHAtPnR4X2J1ZmZlcnNbaV0uc2tiID0gTlVMTDsKKwkJdHAtPnR4X2J1ZmZlcnNbaV0ubWFwcGluZyA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqdHVsaXBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5iYXNlX2FkZHI7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUgKCZ0cC0+bG9jaywgZmxhZ3MpOworCisJCXRwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IGlvcmVhZDMyKGlvYWRkciArIENTUjgpICYgMHhmZmZmOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuICZ0cC0+c3RhdHM7Cit9CisKKworc3RhdGljIHZvaWQgdHVsaXBfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobnAtPnBkZXYpKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBvcHMgPSB7CisJLmdldF9kcnZpbmZvID0gdHVsaXBfZ2V0X2RydmluZm8KK307CisKKy8qIFByb3ZpZGUgaW9jdGwoKSBjYWxscyB0byBleGFtaW5lIHRoZSBNSUkgeGN2ciBzdGF0ZS4gKi8KK3N0YXRpYyBpbnQgcHJpdmF0ZV9pb2N0bCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkocnEpOworCWNvbnN0IHVuc2lnbmVkIGludCBwaHlfaWR4ID0gMDsKKwlpbnQgcGh5ID0gdHAtPnBoeXNbcGh5X2lkeF0gJiAweDFmOworCXVuc2lnbmVkIGludCByZWdudW0gPSBkYXRhLT5yZWdfbnVtOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgkJLyogR2V0IGFkZHJlc3Mgb2YgTUlJIFBIWSBpbiB1c2UuICovCisJCWlmICh0cC0+bWlpX2NudCkKKwkJCWRhdGEtPnBoeV9pZCA9IHBoeTsKKwkJZWxzZSBpZiAodHAtPmZsYWdzICYgSEFTX05XQVkpCisJCQlkYXRhLT5waHlfaWQgPSAzMjsKKwkJZWxzZSBpZiAodHAtPmNoaXBfaWQgPT0gQ09NRVQpCisJCQlkYXRhLT5waHlfaWQgPSAxOworCQllbHNlCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCWNhc2UgU0lPQ0dNSUlSRUc6CQkvKiBSZWFkIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJCWlmIChkYXRhLT5waHlfaWQgPT0gMzIgJiYgKHRwLT5mbGFncyAmIEhBU19OV0FZKSkgeworCQkJaW50IGNzcjEyID0gaW9yZWFkMzIgKGlvYWRkciArIENTUjEyKTsKKwkJCWludCBjc3IxNCA9IGlvcmVhZDMyIChpb2FkZHIgKyBDU1IxNCk7CisJCQlzd2l0Y2ggKHJlZ251bSkgeworCQkJY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChjc3IxNDw8NSkgJiAweDEwMDApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRldi0+aWZfcG9ydCA9PSA1ICYmIHRwLT5ud2F5c2V0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT52YWxfb3V0ID0gMHgxMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+dmFsX291dCA9ICh0dWxpcF9tZWRpYV9jYXBbZGV2LT5pZl9wb3J0XSZNZWRpYUlzMTAwID8gMHgyMDAwIDogMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHR1bGlwX21lZGlhX2NhcFtkZXYtPmlmX3BvcnRdJk1lZGlhSXNGRCA/IDB4MDEwMCA6IDApOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT52YWxfb3V0ID0KKwkJCQkJMHgxODQ4ICsKKwkJCQkJKChjc3IxMiYweDcwMDApID09IDB4NTAwMCA/IDB4MjAgOiAwKSArCisJCQkJCSgoY3NyMTImMHgwNikgPT0gNiA/IDAgOiA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+dmFsX291dCB8PSAweDYwNDg7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkdmVydGlzZWQgdmFsdWUsIGJvZ3VzIDEwYmFzZVR4LUZEIHZhbHVlIGZyb20gQ1NSNi4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+dmFsX291dCA9CisJCQkJCSgoaW9yZWFkMzIoaW9hZGRyICsgQ1NSNikgPj4gMykgJiAweDAwNDApICsKKwkJCQkJKChjc3IxNCA+PiAxKSAmIDB4MjApICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+dmFsX291dCB8PSAoKGNzcjE0ID4+IDkpICYgMHgwM0MwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNTogZGF0YS0+dmFsX291dCA9IHRwLT5scGFyOyBicmVhazsKKwkJCWRlZmF1bHQ6IGRhdGEtPnZhbF9vdXQgPSAwOyBicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWRhdGEtPnZhbF9vdXQgPSB0dWxpcF9tZGlvX3JlYWQgKGRldiwgZGF0YS0+cGh5X2lkICYgMHgxZiwgcmVnbnVtKTsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU0lPQ1NNSUlSRUc6CQkvKiBXcml0ZSBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCQlpZiAoIWNhcGFibGUgKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKHJlZ251bSAmIH4weDFmKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChkYXRhLT5waHlfaWQgPT0gcGh5KSB7CisJCQl1MTYgdmFsdWUgPSBkYXRhLT52YWxfaW47CisJCQlzd2l0Y2ggKHJlZ251bSkgeworCQkJY2FzZSAwOgkvKiBDaGVjayBmb3IgYXV0b25lZ290aWF0aW9uIG9uIG9yIHJlc2V0LiAqLworCQkJCXRwLT5mdWxsX2R1cGxleF9sb2NrID0gKHZhbHVlICYgMHg5MDAwKSA/IDAgOiAxOworCQkJCWlmICh0cC0+ZnVsbF9kdXBsZXhfbG9jaykKKwkJCQkJdHAtPmZ1bGxfZHVwbGV4ID0gKHZhbHVlICYgMHgwMTAwKSA/IDEgOiAwOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCXRwLT5hZHZlcnRpc2luZ1twaHlfaWR4XSA9CisJCQkJdHAtPm1paV9hZHZlcnRpc2UgPSBkYXRhLT52YWxfaW47CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGRhdGEtPnBoeV9pZCA9PSAzMiAmJiAodHAtPmZsYWdzICYgSEFTX05XQVkpKSB7CisJCQl1MTYgdmFsdWUgPSBkYXRhLT52YWxfaW47CisJCQlpZiAocmVnbnVtID09IDApIHsKKwkJCSAgaWYgKCh2YWx1ZSAmIDB4MTIwMCkgPT0gMHgxMjAwKSB7CisJCQkgICAgaWYgKHRwLT5jaGlwX2lkID09IFBOSUMyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuaWMyX3N0YXJ0X253YXkgKGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwkJCQkgICB0MjExNDJfc3RhcnRfbndheSAoZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQkgIH0KKwkJCX0gZWxzZSBpZiAocmVnbnVtID09IDQpCisJCQkJdHAtPnN5bV9hZHZlcnRpc2UgPSB2YWx1ZTsKKwkJfSBlbHNlIHsKKwkJCXR1bGlwX21kaW9fd3JpdGUgKGRldiwgZGF0YS0+cGh5X2lkICYgMHgxZiwgcmVnbnVtLCBkYXRhLT52YWxfaW4pOworCQl9CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKworLyogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgICBOb3RlIHRoYXQgd2Ugb25seSB1c2UgZXhjbHVzaW9uIGFyb3VuZCBhY3R1YWxseSBxdWV1ZWluZyB0aGUKKyAgIG5ldyBmcmFtZSwgbm90IGFyb3VuZCBmaWxsaW5nIHRwLT5zZXR1cF9mcmFtZS4gIFRoaXMgaXMgbm9uLWRldGVybWluaXN0aWMKKyAgIHdoZW4gcmUtZW50ZXJlZCBidXQgc3RpbGwgY29ycmVjdC4gKi8KKworI3VuZGVmIHNldF9iaXRfbGUKKyNkZWZpbmUgc2V0X2JpdF9sZShpLHApIGRvIHsgKChjaGFyICopKHApKVsoaSkvOF0gfD0gKDE8PCgoaSklOCkpOyB9IHdoaWxlKDApCisKK3N0YXRpYyB2b2lkIGJ1aWxkX3NldHVwX2ZyYW1lX2hhc2godTE2ICpzZXR1cF9mcm0sIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bGlwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYgaGFzaF90YWJsZVszMl07CisJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJaW50IGk7CisJdTE2ICplYWRkcnM7CisKKwltZW1zZXQoaGFzaF90YWJsZSwgMCwgc2l6ZW9mKGhhc2hfdGFibGUpKTsKKwlzZXRfYml0X2xlKDI1NSwgaGFzaF90YWJsZSk7IAkJCS8qIEJyb2FkY2FzdCBlbnRyeSAqLworCS8qIFRoaXMgc2hvdWxkIHdvcmsgb24gYmlnLWVuZGlhbiBtYWNoaW5lcyBhcyB3ZWxsLiAqLworCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJaW50IGluZGV4ID0gZXRoZXJfY3JjX2xlKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKSAmIDB4MWZmOworCisJCXNldF9iaXRfbGUoaW5kZXgsIGhhc2hfdGFibGUpOworCisJfQorCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCSpzZXR1cF9mcm0rKyA9IGhhc2hfdGFibGVbaV07CisJCSpzZXR1cF9mcm0rKyA9IGhhc2hfdGFibGVbaV07CisJfQorCXNldHVwX2ZybSA9ICZ0cC0+c2V0dXBfZnJhbWVbMTMqNl07CisKKwkvKiBGaWxsIHRoZSBmaW5hbCBlbnRyeSB3aXRoIG91ciBwaHlzaWNhbCBhZGRyZXNzLiAqLworCWVhZGRycyA9ICh1MTYgKilkZXYtPmRldl9hZGRyOworCSpzZXR1cF9mcm0rKyA9IGVhZGRyc1swXTsgKnNldHVwX2ZybSsrID0gZWFkZHJzWzBdOworCSpzZXR1cF9mcm0rKyA9IGVhZGRyc1sxXTsgKnNldHVwX2ZybSsrID0gZWFkZHJzWzFdOworCSpzZXR1cF9mcm0rKyA9IGVhZGRyc1syXTsgKnNldHVwX2ZybSsrID0gZWFkZHJzWzJdOworfQorCitzdGF0aWMgdm9pZCBidWlsZF9zZXR1cF9mcmFtZV9wZXJmZWN0KHUxNiAqc2V0dXBfZnJtLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dWxpcF9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJaW50IGk7CisJdTE2ICplYWRkcnM7CisKKwkvKiBXZSBoYXZlIDw9IDE0IGFkZHJlc3NlcyBzbyB3ZSBjYW4gdXNlIHRoZSB3b25kZXJmdWwKKwkgICAxNiBhZGRyZXNzIHBlcmZlY3QgZmlsdGVyaW5nIG9mIHRoZSBUdWxpcC4gKi8KKwlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IGkgPCBkZXYtPm1jX2NvdW50OworCSAgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJZWFkZHJzID0gKHUxNiAqKW1jbGlzdC0+ZG1pX2FkZHI7CisJCSpzZXR1cF9mcm0rKyA9ICplYWRkcnM7ICpzZXR1cF9mcm0rKyA9ICplYWRkcnMrKzsKKwkJKnNldHVwX2ZybSsrID0gKmVhZGRyczsgKnNldHVwX2ZybSsrID0gKmVhZGRycysrOworCQkqc2V0dXBfZnJtKysgPSAqZWFkZHJzOyAqc2V0dXBfZnJtKysgPSAqZWFkZHJzKys7CisJfQorCS8qIEZpbGwgdGhlIHVudXNlZCBlbnRyaWVzIHdpdGggdGhlIGJyb2FkY2FzdCBhZGRyZXNzLiAqLworCW1lbXNldChzZXR1cF9mcm0sIDB4ZmYsICgxNS1pKSoxMik7CisJc2V0dXBfZnJtID0gJnRwLT5zZXR1cF9mcmFtZVsxNSo2XTsKKworCS8qIEZpbGwgdGhlIGZpbmFsIGVudHJ5IHdpdGggb3VyIHBoeXNpY2FsIGFkZHJlc3MuICovCisJZWFkZHJzID0gKHUxNiAqKWRldi0+ZGV2X2FkZHI7CisJKnNldHVwX2ZybSsrID0gZWFkZHJzWzBdOyAqc2V0dXBfZnJtKysgPSBlYWRkcnNbMF07CisJKnNldHVwX2ZybSsrID0gZWFkZHJzWzFdOyAqc2V0dXBfZnJtKysgPSBlYWRkcnNbMV07CisJKnNldHVwX2ZybSsrID0gZWFkZHJzWzJdOyAqc2V0dXBfZnJtKysgPSBlYWRkcnNbMl07Cit9CisKKworc3RhdGljIHZvaWQgc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmJhc2VfYWRkcjsKKwlpbnQgY3NyNjsKKworCWNzcjYgPSBpb3JlYWQzMihpb2FkZHIgKyBDU1I2KSAmIH4weDAwRDU7CisKKwl0cC0+Y3NyNiAmPSB+MHgwMEQ1OworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsJCQkvKiBTZXQgcHJvbWlzY3VvdXMuICovCisJCXRwLT5jc3I2IHw9IEFjY2VwdEFsbE11bHRpY2FzdCB8IEFjY2VwdEFsbFBoeXM7CisJCWNzcjYgfD0gQWNjZXB0QWxsTXVsdGljYXN0IHwgQWNjZXB0QWxsUGh5czsKKwkJLyogVW5jb25kaXRpb25hbGx5IGxvZyBuZXQgdGFwcy4gKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CisJfSBlbHNlIGlmICgoZGV2LT5tY19jb3VudCA+IDEwMDApICB8fCAgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKSB7CisJCS8qIFRvbyBtYW55IHRvIGZpbHRlciB3ZWxsIC0tIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KKwkJdHAtPmNzcjYgfD0gQWNjZXB0QWxsTXVsdGljYXN0OworCQljc3I2IHw9IEFjY2VwdEFsbE11bHRpY2FzdDsKKwl9IGVsc2UJaWYgKHRwLT5mbGFncyAmIE1DX0hBU0hfT05MWSkgeworCQkvKiBTb21lIHdvcmstYWxpa2VzIGhhdmUgb25seSBhIDY0LWVudHJ5IGhhc2ggZmlsdGVyIHRhYmxlLiAqLworCQkvKiBTaG91bGQgdmVyaWZ5IGNvcnJlY3RuZXNzIG9uIGJpZy1lbmRpYW4vX19wb3dlcnBjX18gKi8KKwkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJCWludCBpOworCQlpZiAoZGV2LT5tY19jb3VudCA+IDY0KSB7CQkvKiBBcmJpdHJhcnkgbm9uLWVmZmVjdGl2ZSBsaW1pdC4gKi8KKwkJCXRwLT5jc3I2IHw9IEFjY2VwdEFsbE11bHRpY2FzdDsKKwkJCWNzcjYgfD0gQWNjZXB0QWxsTXVsdGljYXN0OworCQl9IGVsc2UgeworCQkJdTMyIG1jX2ZpbHRlclsyXSA9IHswLCAwfTsJCSAvKiBNdWx0aWNhc3QgaGFzaCBmaWx0ZXIgKi8KKwkJCWludCBmaWx0ZXJiaXQ7CisJCQlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IG1jbGlzdCAmJiBpIDwgZGV2LT5tY19jb3VudDsKKwkJCQkgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCQlpZiAodHAtPmZsYWdzICYgQ09NRVRfTUFDX0FERFIpCisJCQkJCWZpbHRlcmJpdCA9IGV0aGVyX2NyY19sZShFVEhfQUxFTiwgbWNsaXN0LT5kbWlfYWRkcik7CisJCQkJZWxzZQorCQkJCQlmaWx0ZXJiaXQgPSBldGhlcl9jcmMoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpID4+IDI2OworCQkJCWZpbHRlcmJpdCAmPSAweDNmOworCQkJCW1jX2ZpbHRlcltmaWx0ZXJiaXQgPj4gNV0gfD0gMSA8PCAoZmlsdGVyYml0ICYgMzEpOworCQkJCWlmICh0dWxpcF9kZWJ1ZyA+IDIpIHsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFkZGVkIGZpbHRlciBmb3IgJTIuMng6JTIuMng6JTIuMng6IgorCQkJCQkJICAgIiUyLjJ4OiUyLjJ4OiUyLjJ4ICAlOC44eCBiaXQgJWQuXG4iLCBkZXYtPm5hbWUsCisJCQkJCQkgICBtY2xpc3QtPmRtaV9hZGRyWzBdLCBtY2xpc3QtPmRtaV9hZGRyWzFdLAorCQkJCQkJICAgbWNsaXN0LT5kbWlfYWRkclsyXSwgbWNsaXN0LT5kbWlfYWRkclszXSwKKwkJCQkJCSAgIG1jbGlzdC0+ZG1pX2FkZHJbNF0sIG1jbGlzdC0+ZG1pX2FkZHJbNV0sCisJCQkJCQkgICBldGhlcl9jcmMoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpLCBmaWx0ZXJiaXQpOworCQkJCX0KKwkJCX0KKwkJCWlmIChtY19maWx0ZXJbMF0gPT0gdHAtPm1jX2ZpbHRlclswXSAgJiYKKwkJCQltY19maWx0ZXJbMV0gPT0gdHAtPm1jX2ZpbHRlclsxXSkKKwkJCQk7CQkJCS8qIE5vIGNoYW5nZS4gKi8KKwkJCWVsc2UgaWYgKHRwLT5mbGFncyAmIElTX0FTSVgpIHsKKwkJCQlpb3dyaXRlMzIoMiwgaW9hZGRyICsgQ1NSMTMpOworCQkJCWlvd3JpdGUzMihtY19maWx0ZXJbMF0sIGlvYWRkciArIENTUjE0KTsKKwkJCQlpb3dyaXRlMzIoMywgaW9hZGRyICsgQ1NSMTMpOworCQkJCWlvd3JpdGUzMihtY19maWx0ZXJbMV0sIGlvYWRkciArIENTUjE0KTsKKwkJCX0gZWxzZSBpZiAodHAtPmZsYWdzICYgQ09NRVRfTUFDX0FERFIpIHsKKwkJCQlpb3dyaXRlMzIobWNfZmlsdGVyWzBdLCBpb2FkZHIgKyAweEFDKTsKKwkJCQlpb3dyaXRlMzIobWNfZmlsdGVyWzFdLCBpb2FkZHIgKyAweEIwKTsKKwkJCX0KKwkJCXRwLT5tY19maWx0ZXJbMF0gPSBtY19maWx0ZXJbMF07CisJCQl0cC0+bWNfZmlsdGVyWzFdID0gbWNfZmlsdGVyWzFdOworCQl9CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJdTMyIHR4X2ZsYWdzID0gMHgwODAwMDAwMCB8IDE5MjsKKworCQkvKiBOb3RlIHRoYXQgb25seSB0aGUgbG93LWFkZHJlc3Mgc2hvcnR3b3JkIG9mIHNldHVwX2ZyYW1lIGlzIHZhbGlkIQorCQkgICBUaGUgdmFsdWVzIGFyZSBkb3VibGVkIGZvciBiaWctZW5kaWFuIGFyY2hpdGVjdHVyZXMuICovCisJCWlmIChkZXYtPm1jX2NvdW50ID4gMTQpIHsgLyogTXVzdCB1c2UgYSBtdWx0aWNhc3QgaGFzaCB0YWJsZS4gKi8KKwkJCWJ1aWxkX3NldHVwX2ZyYW1lX2hhc2godHAtPnNldHVwX2ZyYW1lLCBkZXYpOworCQkJdHhfZmxhZ3MgPSAweDA4NDAwMDAwIHwgMTkyOworCQl9IGVsc2UgeworCQkJYnVpbGRfc2V0dXBfZnJhbWVfcGVyZmVjdCh0cC0+c2V0dXBfZnJhbWUsIGRldik7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAodHAtPmN1cl90eCAtIHRwLT5kaXJ0eV90eCA+IFRYX1JJTkdfU0laRSAtIDIpIHsKKwkJCS8qIFNhbWUgc2V0dXAgcmVjZW50bHkgcXVldWVkLCB3ZSBuZWVkIG5vdCBhZGQgaXQuICovCisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBpbnQgZW50cnk7CisJCQlpbnQgZHVtbXkgPSAtMTsKKworCQkJLyogTm93IGFkZCB0aGlzIGZyYW1lIHRvIHRoZSBUeCBsaXN0LiAqLworCisJCQllbnRyeSA9IHRwLT5jdXJfdHgrKyAlIFRYX1JJTkdfU0laRTsKKworCQkJaWYgKGVudHJ5ICE9IDApIHsKKwkJCQkvKiBBdm9pZCBhIGNoaXAgZXJyYXRhIGJ5IHByZWZpeGluZyBhIGR1bW15IGVudHJ5LiBEb24ndCBkbworCQkJCSAgIHRoaXMgb24gdGhlIFVMSTUyNlggYXMgaXQgdHJpZ2dlcnMgYSBkaWZmZXJlbnQgcHJvYmxlbSAqLworCQkJCWlmICghKHRwLT5jaGlwX2lkID09IFVMSTUyNlggJiYgKHRwLT5yZXZpc2lvbiA9IDB4NDAgfHwgdHAtPnJldmlzaW9uID09IDB4NTApKSkgeworCQkJCQl0cC0+dHhfYnVmZmVyc1tlbnRyeV0uc2tiID0gTlVMTDsKKwkJCQkJdHAtPnR4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcgPSAwOworCQkJCQl0cC0+dHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0KKwkJCQkJCShlbnRyeSA9PSBUWF9SSU5HX1NJWkUtMSkgPyBjcHVfdG9fbGUzMihERVNDX1JJTkdfV1JBUCkgOiAwOworCQkJCQl0cC0+dHhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IDA7CisJCQkJCS8qIE11c3Qgc2V0IERlc2NPd25lZCBsYXRlciB0byBhdm9pZCByYWNlIHdpdGggY2hpcCAqLworCQkJCQlkdW1teSA9IGVudHJ5OworCQkJCQllbnRyeSA9IHRwLT5jdXJfdHgrKyAlIFRYX1JJTkdfU0laRTsKKwkJCQl9CisJCQl9CisKKwkJCXRwLT50eF9idWZmZXJzW2VudHJ5XS5za2IgPSBOVUxMOworCQkJdHAtPnR4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcgPQorCQkJCXBjaV9tYXBfc2luZ2xlKHRwLT5wZGV2LCB0cC0+c2V0dXBfZnJhbWUsCisJCQkJCSAgICAgICBzaXplb2YodHAtPnNldHVwX2ZyYW1lKSwKKwkJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJLyogUHV0IHRoZSBzZXR1cCBmcmFtZSBvbiB0aGUgVHggbGlzdC4gKi8KKwkJCWlmIChlbnRyeSA9PSBUWF9SSU5HX1NJWkUtMSkKKwkJCQl0eF9mbGFncyB8PSBERVNDX1JJTkdfV1JBUDsJCS8qIFdyYXAgcmluZy4gKi8KKwkJCXRwLT50eF9yaW5nW2VudHJ5XS5sZW5ndGggPSBjcHVfdG9fbGUzMih0eF9mbGFncyk7CisJCQl0cC0+dHhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9CisJCQkJY3B1X3RvX2xlMzIodHAtPnR4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcpOworCQkJdHAtPnR4X3JpbmdbZW50cnldLnN0YXR1cyA9IGNwdV90b19sZTMyKERlc2NPd25lZCk7CisJCQlpZiAoZHVtbXkgPj0gMCkKKwkJCQl0cC0+dHhfcmluZ1tkdW1teV0uc3RhdHVzID0gY3B1X3RvX2xlMzIoRGVzY093bmVkKTsKKwkJCWlmICh0cC0+Y3VyX3R4IC0gdHAtPmRpcnR5X3R4ID49IFRYX1JJTkdfU0laRSAtIDIpCisJCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJCQkvKiBUcmlnZ2VyIGFuIGltbWVkaWF0ZSB0cmFuc21pdCBkZW1hbmQuICovCisJCQlpb3dyaXRlMzIoMCwgaW9hZGRyICsgQ1NSMSk7CisJCX0KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworCX0KKworCWlvd3JpdGUzMihjc3I2LCBpb2FkZHIgKyBDU1I2KTsKK30KKworI2lmZGVmIENPTkZJR19UVUxJUF9NV0kKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB0dWxpcF9td2lfY29uZmlnIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXU4IGNhY2hlOworCXUxNiBwY2lfY29tbWFuZDsKKwl1MzIgY3NyMDsKKworCWlmICh0dWxpcF9kZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHVsaXBfbXdpX2NvbmZpZygpXG4iLCBwY2lfbmFtZShwZGV2KSk7CisKKwl0cC0+Y3NyMCA9IGNzcjAgPSAwOworCisJLyogaWYgd2UgaGF2ZSBhbnkgY2FjaGUgbGluZSBzaXplIGF0IGFsbCwgd2UgY2FuIGRvIE1STSAqLworCWNzcjAgfD0gTVJNOworCisJLyogLi4uYW5kIGJhcnJpbmcgaGFyZHdhcmUgYnVncywgTVdJICovCisJaWYgKCEodHAtPmNoaXBfaWQgPT0gREMyMTE0MyAmJiB0cC0+cmV2aXNpb24gPT0gNjUpKQorCQljc3IwIHw9IE1XSTsKKworCS8qIHNldCBvciBkaXNhYmxlIE1XSSBpbiB0aGUgc3RhbmRhcmQgUENJIGNvbW1hbmQgYml0LgorCSAqIENoZWNrIGZvciB0aGUgY2FzZSB3aGVyZSAgbXdpIGlzIGRlc2lyZWQgYnV0IG5vdCBhdmFpbGFibGUKKwkgKi8KKwlpZiAoY3NyMCAmIE1XSSkJcGNpX3NldF9td2kocGRldik7CisJZWxzZQkJcGNpX2NsZWFyX213aShwZGV2KTsKKworCS8qIHJlYWQgcmVzdWx0IGZyb20gaGFyZHdhcmUgKGluIGNhc2UgYml0IHJlZnVzZWQgdG8gZW5hYmxlKSAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmcGNpX2NvbW1hbmQpOworCWlmICgoY3NyMCAmIE1XSSkgJiYgKCEocGNpX2NvbW1hbmQgJiBQQ0lfQ09NTUFORF9JTlZBTElEQVRFKSkpCisJCWNzcjAgJj0gfk1XSTsKKworCS8qIGlmIGNhY2hlIGxpbmUgc2l6ZSBoYXJkd2lyZWQgdG8gemVybywgbm8gTVdJICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgJmNhY2hlKTsKKwlpZiAoKGNzcjAgJiBNV0kpICYmIChjYWNoZSA9PSAwKSkgeworCQljc3IwICY9IH5NV0k7CisJCXBjaV9jbGVhcl9td2kocGRldik7CisJfQorCisJLyogYXNzaWduIHBlci1jYWNoZWxpbmUtc2l6ZSBjYWNoZSBhbGlnbm1lbnQgYW5kCisJICogYnVyc3QgbGVuZ3RoIHZhbHVlcworCSAqLworCXN3aXRjaCAoY2FjaGUpIHsKKwljYXNlIDg6CisJCWNzcjAgfD0gTVJMIHwgKDEgPDwgQ0FMU2hpZnQpIHwgKDE2IDw8IEJ1cnN0TGVuU2hpZnQpOworCQlicmVhazsKKwljYXNlIDE2OgorCQljc3IwIHw9IE1STCB8ICgyIDw8IENBTFNoaWZ0KSB8ICgxNiA8PCBCdXJzdExlblNoaWZ0KTsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJY3NyMCB8PSBNUkwgfCAoMyA8PCBDQUxTaGlmdCkgfCAoMzIgPDwgQnVyc3RMZW5TaGlmdCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNhY2hlID0gMDsKKwkJYnJlYWs7CisJfQorCisJLyogaWYgd2UgaGF2ZSBhIGdvb2QgY2FjaGUgbGluZSBzaXplLCB3ZSBieSBub3cgaGF2ZSBhIGdvb2QKKwkgKiBjc3IwLCBzbyBzYXZlIGl0IGFuZCBleGl0CisJICovCisJaWYgKGNhY2hlKQorCQlnb3RvIG91dDsKKworCS8qIHdlIGRvbid0IGhhdmUgYSBnb29kIGNzcjAgb3IgY2FjaGUgbGluZSBzaXplLCBkaXNhYmxlIE1XSSAqLworCWlmIChjc3IwICYgTVdJKSB7CisJCXBjaV9jbGVhcl9td2kocGRldik7CisJCWNzcjAgJj0gfk1XSTsKKwl9CisKKwkvKiBzYW5lIGRlZmF1bHRzIGZvciBidXJzdCBsZW5ndGggYW5kIGNhY2hlIGFsaWdubWVudAorCSAqIG9yaWdpbmFsbHkgZnJvbSBkZTR4NSBkcml2ZXIKKwkgKi8KKwljc3IwIHw9ICg4IDw8IEJ1cnN0TGVuU2hpZnQpIHwgKDEgPDwgQ0FMU2hpZnQpOworCitvdXQ6CisJdHAtPmNzcjAgPSBjc3IwOworCWlmICh0dWxpcF9kZWJ1ZyA+IDIpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogTVdJIGNvbmZpZyBjYWNoZWxpbmU9JWQsIGNzcjA9JTA4eFxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpLCBjYWNoZSwgY3NyMCk7Cit9CisjZW5kaWYKKworLyoKKyAqCUNoaXBzIHRoYXQgaGF2ZSB0aGUgTVJNL3Jlc2VydmVkIGJpdCBxdWlyayBhbmQgdGhlIGJ1cnN0IHF1aXJrLiBUaGF0CisgKglpcyB0aGUgRE05MTBYIGFuZCB0aGUgb24gY2hpcCBVTGkgZGV2aWNlcworICovCisgCitzdGF0aWMgaW50IHR1bGlwX3VsaV9kbV9xdWlyayhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpZiAocGRldi0+dmVuZG9yID09IDB4MTI4MiAmJiBwZGV2LT5kZXZpY2UgPT0gMHg5MTAyKQorCQlyZXR1cm4gMTsKKwlpZiAocGRldi0+dmVuZG9yID09IDB4MTBiOSAmJiBwZGV2LT5kZXZpY2UgPT0gMHg1MjYxKQorCQlyZXR1cm4gMTsKKwlpZiAocGRldi0+dmVuZG9yID09IDB4MTBiOSAmJiBwZGV2LT5kZXZpY2UgPT0gMHg1MjYzKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgdHVsaXBfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHA7CisJLyogU2VlIG5vdGUgYmVsb3cgb24gdGhlIG11bHRpcG9ydCBjYXJkcy4gKi8KKwlzdGF0aWMgdW5zaWduZWQgY2hhciBsYXN0X3BoeXNfYWRkcls2XSA9IHsweDAwLCAnTCcsICdpJywgJ24nLCAndScsICd4J307CisJc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGVhcmx5XzQ4Nl9jaGlwc2V0c1tdID0geworCQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjQyNCkgfSwKKwkJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU0ksIFBDSV9ERVZJQ0VfSURfU0lfNDk2KSB9LAorCQl7IH0sCisJfTsKKwlzdGF0aWMgaW50IGxhc3RfaXJxOworCXN0YXRpYyBpbnQgbXVsdGlwb3J0X2NudDsJLyogRm9yIGZvdXItcG9ydCBib2FyZHMgdy9vbmUgRUVQUk9NICovCisJdTggY2hpcF9yZXY7CisJaW50IGksIGlycTsKKwl1bnNpZ25lZCBzaG9ydCBzdW07CisJdW5zaWduZWQgY2hhciAqZWVfZGF0YTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCXN0YXRpYyBpbnQgYm9hcmRfaWR4ID0gLTE7CisJaW50IGNoaXBfaWR4ID0gZW50LT5kcml2ZXJfZGF0YTsKKwljb25zdCBjaGFyICpjaGlwX25hbWUgPSB0dWxpcF90YmxbY2hpcF9pZHhdLmNoaXBfbmFtZTsKKwl1bnNpZ25lZCBpbnQgZWVwcm9tX21pc3NpbmcgPSAwOworCXVuc2lnbmVkIGludCBmb3JjZV9jc3IwID0gMDsKKworI2lmbmRlZiBNT0RVTEUKKwlzdGF0aWMgaW50IGRpZF92ZXJzaW9uOwkJLyogQWxyZWFkeSBwcmludGVkIHZlcnNpb24gaW5mby4gKi8KKwlpZiAodHVsaXBfZGVidWcgPiAwICAmJiAgZGlkX3ZlcnNpb24rKyA9PSAwKQorCQlwcmludGsgKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKyNlbmRpZgorCisJYm9hcmRfaWR4Kys7CisKKwkvKgorCSAqCUxhbiBtZWRpYSB3aXJlIGEgdHVsaXAgY2hpcCB0byBhIHdhbiBpbnRlcmZhY2UuIE5lZWRzIGEgdmVyeQorCSAqCWRpZmZlcmVudCBkcml2ZXIgKGxtYyBkcml2ZXIpCisJICovCisKKyAgICAgICAgaWYgKHBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9MTUMpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggInNraXBwaW5nIExNQyBjYXJkLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qCisJICoJRWFybHkgRE05MTAwJ3MgbmVlZCBzb2Z0d2FyZSBDUkMgYW5kIHRoZSBETUZFIGRyaXZlcgorCSAqLworCisJaWYgKHBkZXYtPnZlbmRvciA9PSAweDEyODIgJiYgcGRldi0+ZGV2aWNlID09IDB4OTEwMCkKKwl7CisJCXUzMiBkZXZfcmV2OworCQkvKiBSZWFkIENoaXAgcmV2aXNpb24gKi8KKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJmRldl9yZXYpOworCQlpZihkZXZfcmV2IDwgMHgwMjAwMDAzMCkKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAic2tpcHBpbmcgZWFybHkgRE05MTAwIHdpdGggQ3JjIGJ1ZyAodXNlIGRtZmUpXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJLyoKKwkgKglMb29rcyBmb3IgZWFybHkgUENJIGNoaXBzZXRzIHdoZXJlIHBlb3BsZSByZXBvcnQgaGFuZ3MKKwkgKgl3aXRob3V0IHRoZSB3b3JrYXJvdW5kcyBiZWluZyBvbi4KKwkgKi8KKworCS8qIDEuIEludGVsIFNhdHVybi4gU3dpdGNoIHRvIDggbG9uZyB3b3JkcyBidXJzdCwgOCBsb25nIHdvcmQgY2FjaGUKKwkgICAgICBhbGlnbmVkLiAgQXJpZXMgbWlnaHQgbmVlZCB0aGlzIHRvby4gVGhlIFNhdHVybiBlcnJhdGEgYXJlIG5vdCAKKwkgICAgICBwcmV0dHkgcmVhZGluZyBidXQgdGhhbmtmdWxseSBpdCdzIGFuIG9sZCA0ODYgY2hpcHNldC4KKworCSAgIDIuIFRoZSBkcmVhZGVkIFNpUzQ5NiA0ODYgY2hpcHNldC4gU2FtZSB3b3JrYXJvdW5kIGFzIEludGVsCisJICAgICAgU2F0dXJuLgorCSovCisKKwlpZiAocGNpX2Rldl9wcmVzZW50KGVhcmx5XzQ4Nl9jaGlwc2V0cykpIHsKKwkJY3NyMCA9IE1STCB8IE1STSB8ICg4IDw8IEJ1cnN0TGVuU2hpZnQpIHwgKDEgPDwgQ0FMU2hpZnQpOworCQlmb3JjZV9jc3IwID0gMTsKKwl9CisKKwkvKiBidWdmaXg6IHRoZSBBU0lYIG11c3QgaGF2ZSBhIGJ1cnN0IGxpbWl0IG9yIGhvcnJpYmxlIHRoaW5ncyBoYXBwZW4uICovCisJaWYgKGNoaXBfaWR4ID09IEFYODgxNDApIHsKKwkJaWYgKChjc3IwICYgMHgzZjAwKSA9PSAwKQorCQkJY3NyMCB8PSAweDIwMDA7CisJfQorCisJLyogUE5JQyBkb2Vzbid0IGhhdmUgTVdJL01STC9NUk0uLi4gKi8KKwlpZiAoY2hpcF9pZHggPT0gTEM4MkMxNjgpCisJCWNzcjAgJj0gfjB4ZmZmMTAwMDA7IC8qIHplcm8gcmVzZXJ2ZWQgYml0cyAzMToyMCwgMTYgKi8KKworCS8qIERNOTEwMkEgaGFzIHRyb3VibGVzIHdpdGggTVJNICYgY2xlYXIgcmVzZXJ2ZWQgYml0cyAyNDoyMiwgMjAsIDE2LCA3OjEgKi8KKwlpZiAodHVsaXBfdWxpX2RtX3F1aXJrKHBkZXYpKSB7CisJCWNzcjAgJj0gfjB4MDFmMTAwZmY7CisjaWYgZGVmaW5lZChfX3NwYXJjX18pCisgICAgICAgICAgICAgICAgY3NyMCA9IChjc3IwICYgfjB4ZmYwMCkgfCAweGUwMDA7CisjZW5kaWYKKwl9CisJLyoKKwkgKglBbmQgYmFjayB0byBidXNpbmVzcworCSAqLworCisJaSA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYCisJCQkiQ2Fubm90IGVuYWJsZSB0dWxpcCBib2FyZCAjJWQsIGFib3J0aW5nXG4iLAorCQkJYm9hcmRfaWR4KTsKKwkJcmV0dXJuIGk7CisJfQorCisJaXJxID0gcGRldi0+aXJxOworCisJLyogYWxsb2NfZXRoZXJkZXYgZW5zdXJlcyBhbGlnbmVkIGFuZCB6ZXJvZWQgcHJpdmF0ZSBzdHJ1Y3R1cmVzICovCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYgKHNpemVvZiAoKnRwKSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImV0aGVyIGRldmljZSBhbGxvYyBmYWlsZWQsIGFib3J0aW5nXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisJaWYgKHBjaV9yZXNvdXJjZV9sZW4gKHBkZXYsIDApIDwgdHVsaXBfdGJsW2NoaXBfaWR4XS5pb19zaXplKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICIlczogSS9PIHJlZ2lvbiAoMHglbHhAMHglbHgpIHRvbyBzbWFsbCwgIgorCQkJImFib3J0aW5nXG4iLCBwY2lfbmFtZShwZGV2KSwKKwkJCXBjaV9yZXNvdXJjZV9sZW4gKHBkZXYsIDApLAorCQkJcGNpX3Jlc291cmNlX3N0YXJ0IChwZGV2LCAwKSk7CisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKwl9CisKKwkvKiBncmFiIGFsbCByZXNvdXJjZXMgZnJvbSBib3RoIFBJTyBhbmQgTU1JTyByZWdpb25zLCBhcyB3ZQorCSAqIGRvbid0IHdhbnQgYW55b25lIGVsc2UgbWVzc2luZyBhcm91bmQgd2l0aCBvdXIgaGFyZHdhcmUgKi8KKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyAocGRldiwgInR1bGlwIikpCisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKworI2lmbmRlZiBVU0VfSU9fT1BTCisJaW9hZGRyID0gIHBjaV9pb21hcChwZGV2LCAxLCB0dWxpcF90YmxbY2hpcF9pZHhdLmlvX3NpemUpOworI2Vsc2UKKwlpb2FkZHIgPSAgcGNpX2lvbWFwKHBkZXYsIDAsIHR1bGlwX3RibFtjaGlwX2lkeF0uaW9fc2l6ZSk7CisjZW5kaWYKKwlpZiAoIWlvYWRkcikKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUgKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJmNoaXBfcmV2KTsKKworCS8qCisJICogaW5pdGlhbGl6ZSBwcml2YXRlIGRhdGEgc3RydWN0dXJlICd0cCcKKwkgKiBpdCBpcyB6ZXJvZWQgYW5kIGFsaWduZWQgaW4gYWxsb2NfZXRoZXJkZXYKKwkgKi8KKwl0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwl0cC0+cnhfcmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsCisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgdHVsaXBfcnhfZGVzYykgKiBSWF9SSU5HX1NJWkUgKworCQkJCQkgICBzaXplb2Yoc3RydWN0IHR1bGlwX3R4X2Rlc2MpICogVFhfUklOR19TSVpFLAorCQkJCQkgICAmdHAtPnJ4X3JpbmdfZG1hKTsKKwlpZiAoIXRwLT5yeF9yaW5nKQorCQlnb3RvIGVycl9vdXRfbXRhYmxlOworCXRwLT50eF9yaW5nID0gKHN0cnVjdCB0dWxpcF90eF9kZXNjICopKHRwLT5yeF9yaW5nICsgUlhfUklOR19TSVpFKTsKKwl0cC0+dHhfcmluZ19kbWEgPSB0cC0+cnhfcmluZ19kbWEgKyBzaXplb2Yoc3RydWN0IHR1bGlwX3J4X2Rlc2MpICogUlhfUklOR19TSVpFOworCisJdHAtPmNoaXBfaWQgPSBjaGlwX2lkeDsKKwl0cC0+ZmxhZ3MgPSB0dWxpcF90YmxbY2hpcF9pZHhdLmZsYWdzOworCXRwLT5wZGV2ID0gcGRldjsKKwl0cC0+YmFzZV9hZGRyID0gaW9hZGRyOworCXRwLT5yZXZpc2lvbiA9IGNoaXBfcmV2OworCXRwLT5jc3IwID0gY3NyMDsKKwlzcGluX2xvY2tfaW5pdCgmdHAtPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZ0cC0+bWlpX2xvY2spOworCWluaXRfdGltZXIoJnRwLT50aW1lcik7CisJdHAtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJdHAtPnRpbWVyLmZ1bmN0aW9uID0gdHVsaXBfdGJsW3RwLT5jaGlwX2lkXS5tZWRpYV90aW1lcjsKKworCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW9hZGRyOworCisjaWZkZWYgQ09ORklHX1RVTElQX01XSQorCWlmICghZm9yY2VfY3NyMCAmJiAodHAtPmZsYWdzICYgSEFTX1BDSV9NV0kpKQorCQl0dWxpcF9td2lfY29uZmlnIChwZGV2LCBkZXYpOworI2Vsc2UKKwkvKiBNV0kgaXMgYnJva2VuIGZvciBEQzIxMTQzIHJldiA2NS4uLiAqLworCWlmIChjaGlwX2lkeCA9PSBEQzIxMTQzICYmIGNoaXBfcmV2ID09IDY1KQorCQl0cC0+Y3NyMCAmPSB+TVdJOworI2VuZGlmCisKKwkvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KKwl0dWxpcF9zdG9wX3J4dHgodHApOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKyNpZmRlZiBDT05GSUdfR1NDCisJaWYgKHBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9IUCkgeworCQlzd2l0Y2ggKHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpIHsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQljYXNlIDB4MTA2MToKKwkJY2FzZSAweDEwNjI6CisJCWNhc2UgMHgxMDYzOgorCQljYXNlIDB4MTA5ODoKKwkJY2FzZSAweDEwOTk6CisJCWNhc2UgMHgxMEVFOgorCQkJdHAtPmZsYWdzIHw9IEhBU19TV0FQUEVEX1NFRVBST00gfCBORUVEU19GQUtFX01FRElBX1RBQkxFOworCQkJY2hpcF9uYW1lID0gIkdTQyBEUzIxMTQwIFR1bGlwIjsKKwkJfQorCX0KKyNlbmRpZgorCisJLyogQ2xlYXIgdGhlIG1pc3NlZC1wYWNrZXQgY291bnRlci4gKi8KKwlpb3JlYWQzMihpb2FkZHIgKyBDU1I4KTsKKworCS8qIFRoZSBzdGF0aW9uIGFkZHJlc3MgUk9NIGlzIHJlYWQgYnl0ZSBzZXJpYWxseS4gIFRoZSByZWdpc3RlciBtdXN0CisJICAgYmUgcG9sbGVkLCB3YWl0aW5nIGZvciB0aGUgdmFsdWUgdG8gYmUgcmVhZCBiaXQgc2VyaWFsbHkgZnJvbSB0aGUKKwkgICBFRVBST00uCisJICAgKi8KKwllZV9kYXRhID0gdHAtPmVlcHJvbTsKKwlzdW0gPSAwOworCWlmIChjaGlwX2lkeCA9PSBMQzgyQzE2OCkgeworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlpbnQgdmFsdWUsIGJvZ3VzY250ID0gMTAwMDAwOworCQkJaW93cml0ZTMyKDB4NjAwIHwgaSwgaW9hZGRyICsgMHg5OCk7CisJCQlkbworCQkJCXZhbHVlID0gaW9yZWFkMzIoaW9hZGRyICsgQ1NSOSk7CisJCQl3aGlsZSAodmFsdWUgPCAwICAmJiAtLWJvZ3VzY250ID4gMCk7CisJCQlwdXRfdW5hbGlnbmVkKGxlMTZfdG9fY3B1KHZhbHVlKSwgKCh1MTYqKWRldi0+ZGV2X2FkZHIpICsgaSk7CisJCQlzdW0gKz0gdmFsdWUgJiAweGZmZmY7CisJCX0KKwl9IGVsc2UgaWYgKGNoaXBfaWR4ID09IENPTUVUKSB7CisJCS8qIE5vIG5lZWQgdG8gcmVhZCB0aGUgRUVQUk9NLiAqLworCQlwdXRfdW5hbGlnbmVkKGNwdV90b19sZTMyKGlvcmVhZDMyKGlvYWRkciArIDB4QTQpKSwgKHUzMiAqKWRldi0+ZGV2X2FkZHIpOworCQlwdXRfdW5hbGlnbmVkKGNwdV90b19sZTE2KGlvcmVhZDMyKGlvYWRkciArIDB4QTgpKSwgKHUxNiAqKShkZXYtPmRldl9hZGRyICsgNCkpOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSArKykKKwkJCXN1bSArPSBkZXYtPmRldl9hZGRyW2ldOworCX0gZWxzZSB7CisJCS8qIEEgc2VyaWFsIEVFUFJPTSBpbnRlcmZhY2UsIHdlIHJlYWQgbm93IGFuZCBzb3J0IGl0IG91dCBsYXRlci4gKi8KKwkJaW50IHNhX29mZnNldCA9IDA7CisJCWludCBlZV9hZGRyX3NpemUgPSB0dWxpcF9yZWFkX2VlcHJvbShkZXYsIDB4ZmYsIDgpICYgMHg0MDAwMCA/IDggOiA2OworCisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodHAtPmVlcHJvbSk7IGkrPTIpIHsKKwkJCXUxNiBkYXRhID0gdHVsaXBfcmVhZF9lZXByb20oZGV2LCBpLzIsIGVlX2FkZHJfc2l6ZSk7CisJCQllZV9kYXRhW2ldID0gZGF0YSAmIDB4ZmY7CisJCQllZV9kYXRhW2kgKyAxXSA9IGRhdGEgPj4gODsKKwkJfQorCisJCS8qIERFQyBub3cgaGFzIGEgc3BlY2lmaWNhdGlvbiAoc2VlIE5vdGVzKSBidXQgZWFybHkgYm9hcmQgbWFrZXJzCisJCSAgIGp1c3QgcHV0IHRoZSBhZGRyZXNzIGluIHRoZSBmaXJzdCBFRVBST00gbG9jYXRpb25zLiAqLworCQkvKiBUaGlzIGRvZXMgIG1lbWNtcChlZV9kYXRhLCBlZV9kYXRhKzE2LCA4KSAqLworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSArKykKKwkJCWlmIChlZV9kYXRhW2ldICE9IGVlX2RhdGFbMTYraV0pCisJCQkJc2Ffb2Zmc2V0ID0gMjA7CisJCWlmIChjaGlwX2lkeCA9PSBDT05FWEFOVCkgeworCQkJLyogQ2hlY2sgdGhhdCB0aGUgdHVwbGUgdHlwZSBhbmQgbGVuZ3RoIGlzIGNvcnJlY3QuICovCisJCQlpZiAoZWVfZGF0YVsweDE5OF0gPT0gMHgwNCAgJiYgIGVlX2RhdGFbMHgxOTldID09IDYpCisJCQkJc2Ffb2Zmc2V0ID0gMHgxOUE7CisJCX0gZWxzZSBpZiAoZWVfZGF0YVswXSA9PSAweGZmICAmJiAgZWVfZGF0YVsxXSA9PSAweGZmICYmCisJCQkJICAgZWVfZGF0YVsyXSA9PSAwKSB7CisJCQlzYV9vZmZzZXQgPSAyOwkJLyogR3JyciwgZGFtbiBNYXRyb3ggYm9hcmRzLiAqLworCQkJbXVsdGlwb3J0X2NudCA9IDQ7CisJCX0KKyNpZmRlZiBDT05GSUdfRERCNTQ3NgorCQlpZiAoKHBkZXYtPmJ1cy0+bnVtYmVyID09IDApICYmIChQQ0lfU0xPVChwZGV2LT5kZXZmbikgPT0gNikpIHsKKwkJCS8qIEREQjU0NzYgTUFDIGFkZHJlc3MgaW4gZmlyc3QgRUVQUk9NIGxvY2F0aW9ucy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgc2Ffb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gbWVkaWEgdGFibGUgZWl0aGVyICovCisgICAgICAgICAgICAgICAgICAgICAgIHRwLT5mbGFncyAmPSB+SEFTX01FRElBX1RBQkxFOworICAgICAgICAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0REQjU0NzcKKyAgICAgICAgICAgICAgIGlmICgocGRldi0+YnVzLT5udW1iZXIgPT0gMCkgJiYgKFBDSV9TTE9UKHBkZXYtPmRldmZuKSA9PSA0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAvKiBEREI1NDc3IE1BQyBhZGRyZXNzIGluIGZpcnN0IEVFUFJPTSBsb2NhdGlvbnMuICovCisgICAgICAgICAgICAgICAgICAgICAgIHNhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIG1lZGlhIHRhYmxlIGVpdGhlciAqLworICAgICAgICAgICAgICAgICAgICAgICB0cC0+ZmxhZ3MgJj0gfkhBU19NRURJQV9UQUJMRTsKKyAgICAgICAgICAgICAgIH0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19NSVBTX0NPQkFMVAorICAgICAgICAgICAgICAgaWYgKChwZGV2LT5idXMtPm51bWJlciA9PSAwKSAmJiAKKyAgICAgICAgICAgICAgICAgICAoKFBDSV9TTE9UKHBkZXYtPmRldmZuKSA9PSA3KSB8fAorICAgICAgICAgICAgICAgICAgICAoUENJX1NMT1QocGRldi0+ZGV2Zm4pID09IDEyKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgLyogQ29iYWx0IE1BQyBhZGRyZXNzIGluIGZpcnN0IEVFUFJPTSBsb2NhdGlvbnMuICovCisgICAgICAgICAgICAgICAgICAgICAgIHNhX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIG1lZGlhIHRhYmxlIGVpdGhlciAqLworICAgICAgICAgICAgICAgICAgICAgICB0cC0+ZmxhZ3MgJj0gfkhBU19NRURJQV9UQUJMRTsKKyAgICAgICAgICAgICAgIH0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19HU0MKKwkJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSBicm9rZW4gc3JvbSAqLworCQlpZiAoZWVfZGF0YVswXSA9PSAweDYxICYmIGVlX2RhdGFbMV0gPT0gMHgxMCkgeworCQkJLyogcGNpX3ZlbmRvcl9pZCBhbmQgc3Vic3lzdGVtX2lkIGFyZSBzd2FwcGVkICovCisJCQllZV9kYXRhWzBdID0gZWVfZGF0YVsyXTsKKwkJCWVlX2RhdGFbMV0gPSBlZV9kYXRhWzNdOworCQkJZWVfZGF0YVsyXSA9IDB4NjE7CisJCQllZV9kYXRhWzNdID0gMHgxMDsKKworCQkJLyogSFNDLVBDSSBib2FyZHMgbmVlZCB0byBiZSBieXRlLXN3YXBlZCBhbmQgc2hpZnRlZAorCQkJICogdXAgMSB3b3JkLiAgVGhpcyBzaGlmdCBuZWVkcyB0byBoYXBwZW4gYXQgdGhlIGVuZAorCQkJICogb2YgdGhlIE1BQyBmaXJzdCBiZWNhdXNlIG9mIHRoZSAyIGJ5dGUgb3ZlcmxhcC4KKwkJCSAqLworCQkJZm9yIChpID0gNDsgaSA+PSAwOyBpIC09IDIpIHsKKwkJCQllZV9kYXRhWzE3ICsgaSArIDNdID0gZWVfZGF0YVsxNyArIGldOworCQkJCWVlX2RhdGFbMTYgKyBpICsgNV0gPSBlZV9kYXRhWzE2ICsgaV07CisJCQl9CisJCX0KKyNlbmRpZgorCisJCWZvciAoaSA9IDA7IGkgPCA2OyBpICsrKSB7CisJCQlkZXYtPmRldl9hZGRyW2ldID0gZWVfZGF0YVtpICsgc2Ffb2Zmc2V0XTsKKwkJCXN1bSArPSBlZV9kYXRhW2kgKyBzYV9vZmZzZXRdOworCQl9CisJfQorCS8qIExpdGUtT24gYm9hcmRzIGhhdmUgdGhlIGFkZHJlc3MgYnl0ZS1zd2FwcGVkLiAqLworCWlmICgoZGV2LT5kZXZfYWRkclswXSA9PSAweEEwICB8fCAgZGV2LT5kZXZfYWRkclswXSA9PSAweEMwIHx8IGRldi0+ZGV2X2FkZHJbMF0gPT0gMHgwMikKKwkJJiYgIGRldi0+ZGV2X2FkZHJbMV0gPT0gMHgwMCkKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrPTIpIHsKKwkJCWNoYXIgdG1wID0gZGV2LT5kZXZfYWRkcltpXTsKKwkJCWRldi0+ZGV2X2FkZHJbaV0gPSBkZXYtPmRldl9hZGRyW2krMV07CisJCQlkZXYtPmRldl9hZGRyW2krMV0gPSB0bXA7CisJCX0KKwkvKiBPbiB0aGUgWnlueCAzMTUgRXRoZXJhcnJheSBhbmQgb3RoZXIgbXVsdGlwb3J0IGJvYXJkcyBvbmx5IHRoZQorCSAgIGZpcnN0IFR1bGlwIGhhcyBhbiBFRVBST00uCisJICAgT24gU3BhcmMgc3lzdGVtcyB0aGUgbWFjIGFkZHJlc3MgaXMgaGVsZCBpbiB0aGUgT0JQIHByb3BlcnR5CisJICAgImxvY2FsLW1hYy1hZGRyZXNzIi4KKwkgICBUaGUgYWRkcmVzc2VzIG9mIHRoZSBzdWJzZXF1ZW50IHBvcnRzIGFyZSBkZXJpdmVkIGZyb20gdGhlIGZpcnN0LgorCSAgIE1hbnkgUENJIEJJT1NlcyBhbHNvIGluY29ycmVjdGx5IHJlcG9ydCB0aGUgSVJRIGxpbmUsIHNvIHdlIGNvcnJlY3QKKwkgICB0aGF0IGhlcmUgYXMgd2VsbC4gKi8KKwlpZiAoc3VtID09IDAgIHx8IHN1bSA9PSA2KjB4ZmYpIHsKKyNpZiBkZWZpbmVkKF9fc3BhcmNfXykKKwkJc3RydWN0IHBjaWRldl9jb29raWUgKnBjcCA9IHBkZXYtPnN5c2RhdGE7CisjZW5kaWYKKwkJZWVwcm9tX21pc3NpbmcgPSAxOworCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQkJZGV2LT5kZXZfYWRkcltpXSA9IGxhc3RfcGh5c19hZGRyW2ldOworCQlkZXYtPmRldl9hZGRyW2ldID0gbGFzdF9waHlzX2FkZHJbaV0gKyAxOworI2lmIGRlZmluZWQoX19zcGFyY19fKQorCQlpZiAoKHBjcCAhPSBOVUxMKSAmJiBwcm9tX2dldHByb3BsZW4ocGNwLT5wcm9tX25vZGUsCisJCQkibG9jYWwtbWFjLWFkZHJlc3MiKSA9PSA2KSB7CisJCQlwcm9tX2dldHByb3BlcnR5KHBjcC0+cHJvbV9ub2RlLCAibG9jYWwtbWFjLWFkZHJlc3MiLAorCQkJICAgIGRldi0+ZGV2X2FkZHIsIDYpOworCQl9CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQkJLyogUGF0Y2ggdXAgeDg2IEJJT1MgYnVnLiAqLworCQlpZiAobGFzdF9pcnEpCisJCQlpcnEgPSBsYXN0X2lycTsKKyNlbmRpZgorCX0KKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWxhc3RfcGh5c19hZGRyW2ldID0gZGV2LT5kZXZfYWRkcltpXTsKKwlsYXN0X2lycSA9IGlycTsKKwlkZXYtPmlycSA9IGlycTsKKworCS8qIFRoZSBsb3dlciBmb3VyIGJpdHMgYXJlIHRoZSBtZWRpYSB0eXBlLiAqLworCWlmIChib2FyZF9pZHggPj0gMCAgJiYgIGJvYXJkX2lkeCA8IE1BWF9VTklUUykgeworCQlpZiAob3B0aW9uc1tib2FyZF9pZHhdICYgTUVESUFfTUFTSykKKwkJCXRwLT5kZWZhdWx0X3BvcnQgPSBvcHRpb25zW2JvYXJkX2lkeF0gJiBNRURJQV9NQVNLOworCQlpZiAoKG9wdGlvbnNbYm9hcmRfaWR4XSAmIEZ1bGxEdXBsZXgpIHx8IGZ1bGxfZHVwbGV4W2JvYXJkX2lkeF0gPiAwKQorCQkJdHAtPmZ1bGxfZHVwbGV4ID0gMTsKKwkJaWYgKG10dVtib2FyZF9pZHhdID4gMCkKKwkJCWRldi0+bXR1ID0gbXR1W2JvYXJkX2lkeF07CisJfQorCWlmIChkZXYtPm1lbV9zdGFydCAmIE1FRElBX01BU0spCisJCXRwLT5kZWZhdWx0X3BvcnQgPSBkZXYtPm1lbV9zdGFydCAmIE1FRElBX01BU0s7CisJaWYgKHRwLT5kZWZhdWx0X3BvcnQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidHVsaXAlZDogVHJhbnNjZWl2ZXIgc2VsZWN0aW9uIGZvcmNlZCB0byAlcy5cbiIsCisJCSAgICAgICBib2FyZF9pZHgsIG1lZGlhbmFtZVt0cC0+ZGVmYXVsdF9wb3J0ICYgTUVESUFfTUFTS10pOworCQl0cC0+bWVkaWFsb2NrID0gMTsKKwkJaWYgKHR1bGlwX21lZGlhX2NhcFt0cC0+ZGVmYXVsdF9wb3J0XSAmIE1lZGlhQWx3YXlzRkQpCisJCQl0cC0+ZnVsbF9kdXBsZXggPSAxOworCX0KKwlpZiAodHAtPmZ1bGxfZHVwbGV4KQorCQl0cC0+ZnVsbF9kdXBsZXhfbG9jayA9IDE7CisKKwlpZiAodHVsaXBfbWVkaWFfY2FwW3RwLT5kZWZhdWx0X3BvcnRdICYgTWVkaWFJc01JSSkgeworCQl1MTYgbWVkaWEyYWR2ZXJ0W10gPSB7IDB4MjAsIDB4NDAsIDB4MDNlMCwgMHg2MCwgMHg4MCwgMHgxMDAsIDB4MjAwIH07CisJCXRwLT5taWlfYWR2ZXJ0aXNlID0gbWVkaWEyYWR2ZXJ0W3RwLT5kZWZhdWx0X3BvcnQgLSA5XTsKKwkJdHAtPm1paV9hZHZlcnRpc2UgfD0gKHRwLT5mbGFncyAmIEhBU184MDIzWCk7IC8qIE1hdGNoaW5nIGJpdHMhICovCisJfQorCisJaWYgKHRwLT5mbGFncyAmIEhBU19NRURJQV9UQUJMRSkgeworCQlzcHJpbnRmKGRldi0+bmFtZSwgInR1bGlwJWQiLCBib2FyZF9pZHgpOwkvKiBoYWNrICovCisJCXR1bGlwX3BhcnNlX2VlcHJvbShkZXYpOworCQlzdHJjcHkoZGV2LT5uYW1lLCAiZXRoJWQiKTsJCQkvKiB1bi1oYWNrICovCisJfQorCisJaWYgKCh0cC0+ZmxhZ3MgJiBBTFdBWVNfQ0hFQ0tfTUlJKSB8fAorCQkodHAtPm10YWJsZSAgJiYgIHRwLT5tdGFibGUtPmhhc19taWkpIHx8CisJCSggISB0cC0+bXRhYmxlICAmJiAgKHRwLT5mbGFncyAmIEhBU19NSUkpKSkgeworCQlpZiAodHAtPm10YWJsZSAgJiYgIHRwLT5tdGFibGUtPmhhc19taWkpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCB0cC0+bXRhYmxlLT5sZWFmY291bnQ7IGkrKykKKwkJCQlpZiAodHAtPm10YWJsZS0+bWxlYWZbaV0ubWVkaWEgPT0gMTEpIHsKKwkJCQkJdHAtPmN1cl9pbmRleCA9IGk7CisJCQkJCXRwLT5zYXZlZF9pZl9wb3J0ID0gZGV2LT5pZl9wb3J0OworCQkJCQl0dWxpcF9zZWxlY3RfbWVkaWEoZGV2LCAyKTsKKwkJCQkJZGV2LT5pZl9wb3J0ID0gdHAtPnNhdmVkX2lmX3BvcnQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJfQorCisJCS8qIEZpbmQgdGhlIGNvbm5lY3RlZCBNSUkgeGN2cnMuCisJCSAgIERvaW5nIHRoaXMgaW4gb3BlbigpIHdvdWxkIGFsbG93IGRldGVjdGluZyBleHRlcm5hbCB4Y3ZycworCQkgICBsYXRlciwgYnV0IHRha2VzIG11Y2ggdGltZS4gKi8KKwkJdHVsaXBfZmluZF9taWkgKGRldiwgYm9hcmRfaWR4KTsKKwl9CisKKwkvKiBUaGUgVHVsaXAtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSB0dWxpcF9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gdHVsaXBfc3RhcnRfeG1pdDsKKwlkZXYtPnR4X3RpbWVvdXQgPSB0dWxpcF90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworI2lmZGVmIENPTkZJR19UVUxJUF9OQVBJCisJZGV2LT5wb2xsID0gdHVsaXBfcG9sbDsKKwlkZXYtPndlaWdodCA9IDE2OworI2VuZGlmCisJZGV2LT5zdG9wID0gdHVsaXBfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSB0dWxpcF9nZXRfc3RhdHM7CisJZGV2LT5kb19pb2N0bCA9IHByaXZhdGVfaW9jdGw7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBzZXRfcnhfbW9kZTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gJnBvbGxfdHVsaXA7CisjZW5kaWYKKwlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmb3BzKTsKKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmluZzsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyByZXYgJWQgYXQgJXAsIiwKKwkgICAgICAgZGV2LT5uYW1lLCBjaGlwX25hbWUsIGNoaXBfcmV2LCBpb2FkZHIpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJaWYgKGVlcHJvbV9taXNzaW5nKQorCQlwcmludGsoIiBFRVBST00gbm90IHByZXNlbnQsIik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlYyUyLjJYIiwgaSA/ICc6JyA6ICcgJywgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCIsIElSUSAlZC5cbiIsIGlycSk7CisKKyAgICAgICAgaWYgKHRwLT5jaGlwX2lkID09IFBOSUMyKQorCQl0cC0+bGlua19jaGFuZ2UgPSBwbmljMl9sbmtfY2hhbmdlOworCWVsc2UgaWYgKHRwLT5mbGFncyAmIEhBU19OV0FZKQorCQl0cC0+bGlua19jaGFuZ2UgPSB0MjExNDJfbG5rX2NoYW5nZTsKKwllbHNlIGlmICh0cC0+ZmxhZ3MgJiBIQVNfUE5JQ05XQVkpCisJCXRwLT5saW5rX2NoYW5nZSA9IHBuaWNfbG5rX2NoYW5nZTsKKworCS8qIFJlc2V0IHRoZSB4Y3ZyIGludGVyZmFjZSBhbmQgdHVybiBvbiBoZWFydGJlYXQuICovCisJc3dpdGNoIChjaGlwX2lkeCkgeworCWNhc2UgREMyMTE0MDoKKwljYXNlIERNOTEwWDoKKwljYXNlIFVMSTUyNlg6CisJZGVmYXVsdDoKKwkJaWYgKHRwLT5tdGFibGUpCisJCQlpb3dyaXRlMzIodHAtPm10YWJsZS0+Y3NyMTJkaXIgfCAweDEwMCwgaW9hZGRyICsgQ1NSMTIpOworCQlicmVhazsKKwljYXNlIERDMjExNDI6CisJCWlmICh0cC0+bWlpX2NudCAgfHwgIHR1bGlwX21lZGlhX2NhcFtkZXYtPmlmX3BvcnRdICYgTWVkaWFJc01JSSkgeworCQkJaW93cml0ZTMyKGNzcjZfbWFza19kZWZzdGF0ZSwgaW9hZGRyICsgQ1NSNik7CisJCQlpb3dyaXRlMzIoMHgwMDAwLCBpb2FkZHIgKyBDU1IxMyk7CisJCQlpb3dyaXRlMzIoMHgwMDAwLCBpb2FkZHIgKyBDU1IxNCk7CisJCQlpb3dyaXRlMzIoY3NyNl9tYXNrX2hkY2FwLCBpb2FkZHIgKyBDU1I2KTsKKwkJfSBlbHNlCisJCQl0MjExNDJfc3RhcnRfbndheShkZXYpOworCQlicmVhazsKKwljYXNlIFBOSUMyOgorCSAgICAgICAgLyoganVzdCBkbyBhIHJlc2V0IGZvciBzYW5pdHkgc2FrZSAqLworCQlpb3dyaXRlMzIoMHgwMDAwLCBpb2FkZHIgKyBDU1IxMyk7CisJCWlvd3JpdGUzMigweDAwMDAsIGlvYWRkciArIENTUjE0KTsKKwkJYnJlYWs7CisJY2FzZSBMQzgyQzE2ODoKKwkJaWYgKCAhIHRwLT5taWlfY250KSB7CisJCQl0cC0+bndheSA9IDE7CisJCQl0cC0+bndheXNldCA9IDA7CisJCQlpb3dyaXRlMzIoY3NyNl90dG0gfCBjc3I2X2NhLCBpb2FkZHIgKyBDU1I2KTsKKwkJCWlvd3JpdGUzMigweDMwLCBpb2FkZHIgKyBDU1IxMik7CisJCQlpb3dyaXRlMzIoMHgwMDAxRjA3OCwgaW9hZGRyICsgQ1NSNik7CisJCQlpb3dyaXRlMzIoMHgwMjAxRjA3OCwgaW9hZGRyICsgQ1NSNik7IC8qIFR1cm4gb24gYXV0b25lZ290aWF0aW9uLiAqLworCQl9CisJCWJyZWFrOworCWNhc2UgTVg5ODcxMzoKKwljYXNlIENPTVBFWDk4ODE6CisJCWlvd3JpdGUzMigweDAwMDAwMDAwLCBpb2FkZHIgKyBDU1I2KTsKKwkJaW93cml0ZTMyKDB4MDAwNzExQzAsIGlvYWRkciArIENTUjE0KTsgLyogVHVybiBvbiBOV2F5LiAqLworCQlpb3dyaXRlMzIoMHgwMDAwMDAwMSwgaW9hZGRyICsgQ1NSMTMpOworCQlicmVhazsKKwljYXNlIE1YOTg3MTU6CisJY2FzZSBNWDk4NzI1OgorCQlpb3dyaXRlMzIoMHgwMWE4MDAwMCwgaW9hZGRyICsgQ1NSNik7CisJCWlvd3JpdGUzMigweEZGRkZGRkZGLCBpb2FkZHIgKyBDU1IxNCk7CisJCWlvd3JpdGUzMigweDAwMDAxMDAwLCBpb2FkZHIgKyBDU1IxMik7CisJCWJyZWFrOworCWNhc2UgQ09NRVQ6CisJCS8qIE5vIGluaXRpYWxpemF0aW9uIG5lY2Vzc2FyeS4gKi8KKwkJYnJlYWs7CisJfQorCisJLyogcHV0IHRoZSBjaGlwIGluIHNub296ZSBtb2RlIHVudGlsIG9wZW5lZCAqLworCXR1bGlwX3NldF9wb3dlcl9zdGF0ZSAodHAsIDAsIDEpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZnJlZV9yaW5nOgorCXBjaV9mcmVlX2NvbnNpc3RlbnQgKHBkZXYsCisJCQkgICAgIHNpemVvZiAoc3RydWN0IHR1bGlwX3J4X2Rlc2MpICogUlhfUklOR19TSVpFICsKKwkJCSAgICAgc2l6ZW9mIChzdHJ1Y3QgdHVsaXBfdHhfZGVzYykgKiBUWF9SSU5HX1NJWkUsCisJCQkgICAgIHRwLT5yeF9yaW5nLCB0cC0+cnhfcmluZ19kbWEpOworCitlcnJfb3V0X210YWJsZToKKwlpZiAodHAtPm10YWJsZSkKKwkJa2ZyZWUgKHRwLT5tdGFibGUpOworCXBjaV9pb3VubWFwKHBkZXYsIGlvYWRkcik7CisKK2Vycl9vdXRfZnJlZV9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyAocGRldik7CisKK2Vycl9vdXRfZnJlZV9uZXRkZXY6CisJZnJlZV9uZXRkZXYgKGRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IHR1bGlwX3N1c3BlbmQgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChkZXYgJiYgbmV0aWZfcnVubmluZyAoZGV2KSAmJiBuZXRpZl9kZXZpY2VfcHJlc2VudCAoZGV2KSkgeworCQluZXRpZl9kZXZpY2VfZGV0YWNoIChkZXYpOworCQl0dWxpcF9kb3duIChkZXYpOworCQkvKiBwY2lfcG93ZXJfb2ZmKHBkZXYsIC0xKTsgKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB0dWxpcF9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChkZXYgJiYgbmV0aWZfcnVubmluZyAoZGV2KSAmJiAhbmV0aWZfZGV2aWNlX3ByZXNlbnQgKGRldikpIHsKKyNpZiAxCisJCXBjaV9lbmFibGVfZGV2aWNlIChwZGV2KTsKKyNlbmRpZgorCQkvKiBwY2lfcG93ZXJfb24ocGRldik7ICovCisJCXR1bGlwX3VwIChkZXYpOworCQluZXRpZl9kZXZpY2VfYXR0YWNoIChkZXYpOworCX0KKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19QTSAqLworCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB0dWxpcF9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKwlzdHJ1Y3QgdHVsaXBfcHJpdmF0ZSAqdHA7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuOworCisJdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJcGNpX2ZyZWVfY29uc2lzdGVudCAocGRldiwKKwkJCSAgICAgc2l6ZW9mIChzdHJ1Y3QgdHVsaXBfcnhfZGVzYykgKiBSWF9SSU5HX1NJWkUgKworCQkJICAgICBzaXplb2YgKHN0cnVjdCB0dWxpcF90eF9kZXNjKSAqIFRYX1JJTkdfU0laRSwKKwkJCSAgICAgdHAtPnJ4X3JpbmcsIHRwLT5yeF9yaW5nX2RtYSk7CisJaWYgKHRwLT5tdGFibGUpCisJCWtmcmVlICh0cC0+bXRhYmxlKTsKKwlwY2lfaW91bm1hcChwZGV2LCB0cC0+YmFzZV9hZGRyKTsKKwlmcmVlX25ldGRldiAoZGV2KTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zIChwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEgKHBkZXYsIE5VTEwpOworCisJLyogcGNpX3Bvd2VyX29mZiAocGRldiwgLTEpOyAqLworfQorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKy8qCisgKiBQb2xsaW5nICdpbnRlcnJ1cHQnIC0gdXNlZCBieSB0aGluZ3MgbGlrZSBuZXRjb25zb2xlIHRvIHNlbmQgc2ticworICogd2l0aG91dCBoYXZpbmcgdG8gcmUtZW5hYmxlIGludGVycnVwdHMuIEl0J3Mgbm90IGNhbGxlZCB3aGlsZQorICogdGhlIGludGVycnVwdCByb3V0aW5lIGlzIGV4ZWN1dGluZy4KKyAqLworCitzdGF0aWMgdm9pZCBwb2xsX3R1bGlwIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIGRpc2FibGVfaXJxIGhlcmUgaXMgbm90IHZlcnkgbmljZSwgYnV0IHdpdGggdGhlIGxvY2tsZXNzCisJICAgaW50ZXJydXB0IGhhbmRsZXIgd2UgaGF2ZSBubyBvdGhlciBjaG9pY2UuICovCisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCXR1bGlwX2ludGVycnVwdCAoZGV2LT5pcnEsIGRldiwgTlVMTCk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHR1bGlwX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUJPSB0dWxpcF9wY2lfdGJsLAorCS5wcm9iZQkJPSB0dWxpcF9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHR1bGlwX3JlbW92ZV9vbmUpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gdHVsaXBfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHR1bGlwX3Jlc3VtZSwKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KK307CisKKworc3RhdGljIGludCBfX2luaXQgdHVsaXBfaW5pdCAodm9pZCkKK3sKKyNpZmRlZiBNT0RVTEUKKwlwcmludGsgKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKyNlbmRpZgorCisJLyogY29weSBtb2R1bGUgcGFybXMgaW50byBnbG9iYWxzICovCisJdHVsaXBfcnhfY29weWJyZWFrID0gcnhfY29weWJyZWFrOworCXR1bGlwX21heF9pbnRlcnJ1cHRfd29yayA9IG1heF9pbnRlcnJ1cHRfd29yazsKKworCS8qIHByb2JlIGZvciBhbmQgaW5pdCBib2FyZHMgKi8KKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0ICgmdHVsaXBfZHJpdmVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgdHVsaXBfY2xlYW51cCAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZ0dWxpcF9kcml2ZXIpOworfQorCisKK21vZHVsZV9pbml0KHR1bGlwX2luaXQpOworbW9kdWxlX2V4aXQodHVsaXBfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC93aW5ib25kLTg0MC5jIGIvZHJpdmVycy9uZXQvdHVsaXAvd2luYm9uZC04NDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2U2NGVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvd2luYm9uZC04NDAuYwpAQCAtMCwwICsxLDE3MTYgQEAKKy8qIHdpbmJvbmQtODQwLmM6IEEgTGludXggUENJIG5ldHdvcmsgYWRhcHRlciBkZXZpY2UgZHJpdmVyLiAqLworLyoKKwlXcml0dGVuIDE5OTgtMjAwMSBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorCXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisJRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdAorCXJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZS4gIFRoaXMgZmlsZSBpcyBub3QKKwlhIGNvbXBsZXRlIHByb2dyYW0gYW5kIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgZW50aXJlIG9wZXJhdGluZworCXN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorCisJVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisJU3VwcG9ydCBhbmQgdXBkYXRlcyBhdmFpbGFibGUgYXQKKwlodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL2RyaXZlcnMuaHRtbAorCisJRG8gbm90IHJlbW92ZSB0aGUgY29weXJpZ2h0IGluZm9ybWF0aW9uLgorCURvIG5vdCBjaGFuZ2UgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gdW5sZXNzIGFuIGltcHJvdmVtZW50IGhhcyBiZWVuIG1hZGUuCisJTWVyZWx5IHJlbW92aW5nIG15IG5hbWUsIGFzIENvbXBleCBoYXMgZG9uZSBpbiB0aGUgcGFzdCwgZG9lcyBub3QgY291bnQKKwlhcyBhbiBpbXByb3ZlbWVudC4KKworCUNoYW5nZWxvZzoKKwkqIHBvcnRlZCB0byAyLjQKKwkJPz8/CisJKiBzcGluIGxvY2sgdXBkYXRlLCBtZW1vcnkgYmFycmllcnMsIG5ldyBzdHlsZSBkbWEgbWFwcGluZ3MKKwkJbGltaXQgZWFjaCB0eCBidWZmZXIgdG8gPCAxMDI0IGJ5dGVzCisJCXJlbW92ZSBEZXNjSW50ciBmcm9tIFJ4IGRlc2NyaXB0b3JzICh0aGF0J3MgYW4gVHggZmxhZykKKwkJcmVtb3ZlIG5leHQgcG9pbnRlciBmcm9tIFR4IGRlc2NyaXB0b3JzCisJCXN5bmNocm9uaXplIHR4X3FfYnl0ZXMKKwkJc29mdHdhcmUgcmVzZXQgaW4gdHhfdGltZW91dAorCQkJQ29weXJpZ2h0IChDKSAyMDAwIE1hbmZyZWQgU3ByYXVsCisJKiBmdXJ0aGVyIGNsZWFudXBzCisJCXBvd2VyIG1hbmFnZW1lbnQuCisJCXN1cHBvcnQgZm9yIGJpZyBlbmRpYW4gZGVzY3JpcHRvcnMKKwkJCUNvcHlyaWdodCAoQykgMjAwMSBNYW5mcmVkIFNwcmF1bAorICAJKiBldGh0b29sIHN1cHBvcnQgKGpnYXJ6aWspCisJKiBSZXBsYWNlIHNvbWUgTUlJLXJlbGF0ZWQgbWFnaWMgbnVtYmVycyB3aXRoIGNvbnN0YW50cyAoamdhcnppaykKKyAgCisJVE9ETzoKKwkqIGVuYWJsZSBwY2lfcG93ZXJfb2ZmCisJKiBXYWtlLU9uLUxBTgorKi8KKyAgCisjZGVmaW5lIERSVl9OQU1FCSJ3aW5ib25kLTg0MCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMDEtZCIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIk5vdi0xNy0yMDAxIgorCisKKy8qIEF1dG9tYXRpY2FsbHkgZXh0cmFjdGVkIGNvbmZpZ3VyYXRpb24gaW5mbzoKK3Byb2JlLWZ1bmM6IHdpbmJvbmQ4NDBfcHJvYmUKK2NvbmZpZy1pbjogdHJpc3RhdGUgJ1dpbmJvbmQgVzg5Yzg0MCBFdGhlcm5ldCBzdXBwb3J0JyBDT05GSUdfV0lOQk9ORF84NDAKKworYy1oZWxwLW5hbWU6IFdpbmJvbmQgVzg5Yzg0MCBQQ0kgRXRoZXJuZXQgc3VwcG9ydAorYy1oZWxwLXN5bWJvbDogQ09ORklHX1dJTkJPTkRfODQwCitjLWhlbHA6IFRoaXMgZHJpdmVyIGlzIGZvciB0aGUgV2luYm9uZCBXODljODQwIGNoaXAuICBJdCBhbHNvIHdvcmtzIHdpdGgKK2MtaGVscDogdGhlIFRYOTg4MiBjaGlwIG9uIHRoZSBDb21wZXggUkwxMDAtQVRYIGJvYXJkLgorYy1oZWxwOiBNb3JlIHNwZWNpZmljIGluZm9ybWF0aW9uIGFuZCB1cGRhdGVzIGFyZSBhdmFpbGFibGUgZnJvbSAKK2MtaGVscDogaHR0cDovL3d3dy5zY3lsZC5jb20vbmV0d29yay9kcml2ZXJzLmh0bWwKKyovCisKKy8qIFRoZSB1c2VyLWNvbmZpZ3VyYWJsZSB2YWx1ZXMuCisgICBUaGVzZSBtYXkgYmUgbW9kaWZpZWQgd2hlbiBhIGRyaXZlciBtb2R1bGUgaXMgbG9hZGVkLiovCisKK3N0YXRpYyBpbnQgZGVidWcgPSAxOwkJCS8qIDEgbm9ybWFsIG1lc3NhZ2VzLCAwIHF1aWV0IC4uIDcgdmVyYm9zZS4gKi8KK3N0YXRpYyBpbnQgbWF4X2ludGVycnVwdF93b3JrID0gMjA7CisvKiBNYXhpbXVtIG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIGZpbHRlciAodnMuIFJ4LWFsbC1tdWx0aWNhc3QpLgorICAgVGhlICc4NDAgdXNlcyBhIDY0IGVsZW1lbnQgaGFzaCB0YWJsZSBiYXNlZCBvbiB0aGUgRXRoZXJuZXQgQ1JDLiAgKi8KK3N0YXRpYyBpbnQgbXVsdGljYXN0X2ZpbHRlcl9saW1pdCA9IDMyOworCisvKiBTZXQgdGhlIGNvcHkgYnJlYWtwb2ludCBmb3IgdGhlIGNvcHktb25seS10aW55LWZyYW1lcyBzY2hlbWUuCisgICBTZXR0aW5nIHRvID4gMTUxOCBlZmZlY3RpdmVseSBkaXNhYmxlcyB0aGlzIGZlYXR1cmUuICovCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhazsKKworLyogVXNlZCB0byBwYXNzIHRoZSBtZWRpYSB0eXBlLCBldGMuCisgICBCb3RoICdvcHRpb25zW10nIGFuZCAnZnVsbF9kdXBsZXhbXScgc2hvdWxkIGV4aXN0IGZvciBkcml2ZXIKKyAgIGludGVyb3BlcmFiaWxpdHkuCisgICBUaGUgbWVkaWEgdHlwZSBpcyB1c3VhbGx5IHBhc3NlZCBpbiAnb3B0aW9uc1tdJy4KKyovCisjZGVmaW5lIE1BWF9VTklUUyA4CQkvKiBNb3JlIGFyZSBzdXBwb3J0ZWQsIGxpbWl0IG9ubHkgb24gb3B0aW9ucyAqLworc3RhdGljIGludCBvcHRpb25zW01BWF9VTklUU10gPSB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKK3N0YXRpYyBpbnQgZnVsbF9kdXBsZXhbTUFYX1VOSVRTXSA9IHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9OworCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIHNldCBhdCBjb21waWxlIHRpbWUuICovCisKKy8qIEtlZXAgdGhlIHJpbmcgc2l6ZXMgYSBwb3dlciBvZiB0d28gZm9yIGNvbXBpbGUgZWZmaWNpZW5jeS4KKyAgIFRoZSBjb21waWxlciB3aWxsIGNvbnZlcnQgPHVuc2lnbmVkPiclJzwyXk4+IGludG8gYSBiaXQgbWFzay4KKyAgIE1ha2luZyB0aGUgVHggcmluZyB0b28gbGFyZ2UgZGVjcmVhc2VzIHRoZSBlZmZlY3RpdmVuZXNzIG9mIGNoYW5uZWwKKyAgIGJvbmRpbmcgYW5kIHBhY2tldCBwcmlvcml0eS4KKyAgIFRoZXJlIGFyZSBubyBpbGwgZWZmZWN0cyBmcm9tIHRvby1sYXJnZSByZWNlaXZlIHJpbmdzLiAqLworI2RlZmluZSBUWF9SSU5HX1NJWkUJMTYKKyNkZWZpbmUgVFhfUVVFVUVfTEVOCTEwCQkvKiBMaW1pdCByaW5nIGVudHJpZXMgYWN0dWFsbHkgdXNlZC4gICovCisjZGVmaW5lIFRYX1FVRVVFX0xFTl9SRVNUQVJUCTUKKyNkZWZpbmUgUlhfUklOR19TSVpFCTMyCisKKyNkZWZpbmUgVFhfQlVGTElNSVQJKDEwMjQtMTI4KQorCisvKiBUaGUgcHJlc3VtZWQgRklGTyBzaXplIGZvciB3b3JraW5nIGFyb3VuZCB0aGUgVHgtRklGTy1vdmVyZmxvdyBidWcuCisgICBUbyBhdm9pZCBvdmVyZmxvd2luZyB3ZSBkb24ndCBxdWV1ZSBhZ2FpbiB1bnRpbCB3ZSBoYXZlIHJvb20gZm9yIGEKKyAgIGZ1bGwtc2l6ZSBwYWNrZXQuCisgKi8KKyNkZWZpbmUgVFhfRklGT19TSVpFICgyMDQ4KQorI2RlZmluZSBUWF9CVUdfRklGT19MSU1JVCAoVFhfRklGT19TSVpFLTE1MTQtMTYpCisKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAoMipIWikKKworI2RlZmluZSBQS1RfQlVGX1NaCQkxNTM2CQkJLyogU2l6ZSBvZiBlYWNoIHRlbXBvcmFyeSBSeCBidWZmZXIuKi8KKworLyogSW5jbHVkZSBmaWxlcywgZGVzaWduZWQgdG8gc3VwcG9ydCBtb3N0IGtlcm5lbCB2ZXJzaW9ucyAyLjAuMCBhbmQgbGF0ZXIuICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgkJLyogUHJvY2Vzc29yIHR5cGUgZm9yIGNhY2hlIGFsaWdubWVudC4gKi8KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKy8qIFRoZXNlIGlkZW50aWZ5IHRoZSBkcml2ZXIgYmFzZSB2ZXJzaW9uIGFuZCBtYXkgbm90IGJlIHJlbW92ZWQuICovCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CitLRVJOX0lORk8gRFJWX05BTUUgIi5jOnYiIERSVl9WRVJTSU9OICIgKDIuNCBwb3J0KSAiIERSVl9SRUxEQVRFICIgIERvbmFsZCBCZWNrZXIgPGJlY2tlckBzY3lsZC5jb20+XG4iCitLRVJOX0lORk8gIiAgaHR0cDovL3d3dy5zY3lsZC5jb20vbmV0d29yay9kcml2ZXJzLmh0bWxcbiI7CisKK01PRFVMRV9BVVRIT1IoIkRvbmFsZCBCZWNrZXIgPGJlY2tlckBzY3lsZC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIldpbmJvbmQgVzg5Yzg0MCBFdGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyeF9jb3B5YnJlYWssIGludCwgMCk7Cittb2R1bGVfcGFyYW0obXVsdGljYXN0X2ZpbHRlcl9saW1pdCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShvcHRpb25zLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGZ1bGxfZHVwbGV4LCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfaW50ZXJydXB0X3dvcmssICJ3aW5ib25kLTg0MCBtYXhpbXVtIGV2ZW50cyBoYW5kbGVkIHBlciBpbnRlcnJ1cHQiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJ3aW5ib25kLTg0MCBkZWJ1ZyBsZXZlbCAoMC02KSIpOworTU9EVUxFX1BBUk1fREVTQyhyeF9jb3B5YnJlYWssICJ3aW5ib25kLTg0MCBjb3B5IGJyZWFrcG9pbnQgZm9yIGNvcHktb25seS10aW55LWZyYW1lcyIpOworTU9EVUxFX1BBUk1fREVTQyhtdWx0aWNhc3RfZmlsdGVyX2xpbWl0LCAid2luYm9uZC04NDAgbWF4aW11bSBudW1iZXIgb2YgZmlsdGVyZWQgbXVsdGljYXN0IGFkZHJlc3NlcyIpOworTU9EVUxFX1BBUk1fREVTQyhvcHRpb25zLCAid2luYm9uZC04NDA6IEJpdHMgMC0zOiBtZWRpYSB0eXBlLCBiaXQgMTc6IGZ1bGwgZHVwbGV4Iik7CitNT0RVTEVfUEFSTV9ERVNDKGZ1bGxfZHVwbGV4LCAid2luYm9uZC04NDAgZnVsbCBkdXBsZXggc2V0dGluZyhzKSAoMSkiKTsKKworLyoKKwkJCQlUaGVvcnkgb2YgT3BlcmF0aW9uCisKK0kuIEJvYXJkIENvbXBhdGliaWxpdHkKKworVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSBXaW5ib25kIHc4OWM4NDAgY2hpcC4KKworSUkuIEJvYXJkLXNwZWNpZmljIHNldHRpbmdzCisKK05vbmUuCisKK0lJSS4gRHJpdmVyIG9wZXJhdGlvbgorCitUaGlzIGNoaXAgaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSBEaWdpdGFsIDIxKjQqICJUdWxpcCIgZmFtaWx5LiAgVGhlIGZpcnN0Cit0d2VsdmUgcmVnaXN0ZXJzIGFuZCB0aGUgZGVzY3JpcHRvciBmb3JtYXQgYXJlIG5lYXJseSBpZGVudGljYWwuICBSZWFkIGEKK1R1bGlwIG1hbnVhbCBmb3Igb3BlcmF0aW9uYWwgZGV0YWlscy4KKworQSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIG11bHRpY2FzdCBmaWx0ZXIgYW5kIHN0YXRpb24gYWRkcmVzcyBhcmUKK3N0b3JlZCBpbiByZWdpc3RlcnMgcmF0aGVyIHRoYW4gbG9hZGVkIHRocm91Z2ggYSBwc2V1ZG8tdHJhbnNtaXQgcGFja2V0LgorCitVbmxpa2UgdGhlIFR1bGlwLCB0cmFuc21pdCBidWZmZXJzIGFyZSBsaW1pdGVkIHRvIDFLQi4gIFRvIHRyYW5zbWl0IGEKK2Z1bGwtc2l6ZWQgcGFja2V0IHdlIG11c3QgdXNlIGJvdGggZGF0YSBidWZmZXJzIGluIGEgZGVzY3JpcHRvci4gIFRodXMgdGhlCitkcml2ZXIgdXNlcyByaW5nIG1vZGUgd2hlcmUgZGVzY3JpcHRvcnMgYXJlIGltcGxpY2l0bHkgc2VxdWVudGlhbCBpbiBtZW1vcnksCityYXRoZXIgdGhhbiB1c2luZyB0aGUgc2Vjb25kIGRlc2NyaXB0b3IgYWRkcmVzcyBhcyBhIGNoYWluIHBvaW50ZXIgdG8KK3N1YnNlcXVlbnQgZGVzY3JpcHRvcnMuCisKK0lWLiBOb3RlcworCitJZiB5b3UgYXJlIGdvaW5nIHRvIGFsbW9zdCBjbG9uZSBhIFR1bGlwLCB3aHkgbm90IGdvIGFsbCB0aGUgd2F5IGFuZCBhdm9pZAordGhlIG5lZWQgZm9yIGEgbmV3IGRyaXZlcj8KKworSVZiLiBSZWZlcmVuY2VzCisKK2h0dHA6Ly93d3cuc2N5bGQuY29tL2V4cGVydC8xMDBtYnBzLmh0bWwKK2h0dHA6Ly93d3cuc2N5bGQuY29tL2V4cGVydC9OV2F5Lmh0bWwKK2h0dHA6Ly93d3cud2luYm9uZC5jb20udHcvCisKK0lWYy4gRXJyYXRhCisKK0EgaG9ycmlibGUgYnVnIGV4aXN0cyBpbiB0aGUgdHJhbnNtaXQgRklGTy4gIEFwcGFyZW50bHkgdGhlIGNoaXAgZG9lc24ndAorY29ycmVjdGx5IGRldGVjdCBhIGZ1bGwgRklGTywgYW5kIHF1ZXVpbmcgbW9yZSB0aGFuIDIwNDggYnl0ZXMgbWF5IHJlc3VsdCBpbgorc2lsZW50IGRhdGEgY29ycnVwdGlvbi4KKworVGVzdCB3aXRoICdwaW5nIC1zIDEwMDAwJyBvbiBhIGZhc3QgY29tcHV0ZXIuCisKKyovCisKKwwKKworLyoKKyAgUENJIHByb2JlIHRhYmxlLgorKi8KK2VudW0gcGNpX2lkX2ZsYWdzX2JpdHMgeworICAgICAgICAvKiBTZXQgUENJIGNvbW1hbmQgcmVnaXN0ZXIgYml0cyBiZWZvcmUgY2FsbGluZyBwcm9iZTEoKS4gKi8KKyAgICAgICAgUENJX1VTRVNfSU89MSwgUENJX1VTRVNfTUVNPTIsIFBDSV9VU0VTX01BU1RFUj00LAorICAgICAgICAvKiBSZWFkIGFuZCBtYXAgdGhlIHNpbmdsZSBmb2xsb3dpbmcgUENJIEJBUi4gKi8KKyAgICAgICAgUENJX0FERFIwPTA8PDQsIFBDSV9BRERSMT0xPDw0LCBQQ0lfQUREUjI9Mjw8NCwgUENJX0FERFIzPTM8PDQsCisgICAgICAgIFBDSV9BRERSXzY0QklUUz0weDEwMCwgUENJX05PX0FDUElfV0FLRT0weDIwMCwgUENJX05PX01JTl9MQVRFTkNZPTB4NDAwLAorfTsKK2VudW0gY2hpcF9jYXBhYmlsaXR5X2ZsYWdzIHsKKwlDYW5IYXZlTUlJPTEsIEhhc0Jyb2tlblR4PTIsIEFsd2F5c0ZEWD00LCBGRFhPbk5vTUlJPTgsfTsKKyNpZmRlZiBVU0VfSU9fT1BTCisjZGVmaW5lIFc4NDBfRkxBR1MgKFBDSV9VU0VTX0lPIHwgUENJX0FERFIwIHwgUENJX1VTRVNfTUFTVEVSKQorI2Vsc2UKKyNkZWZpbmUgVzg0MF9GTEFHUyAoUENJX1VTRVNfTUVNIHwgUENJX0FERFIxIHwgUENJX1VTRVNfTUFTVEVSKQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB3ODQwX3BjaV90YmxbXSA9IHsKKwl7IDB4MTA1MCwgMHgwODQwLCBQQ0lfQU5ZX0lELCAweDgxNTMsICAgICAwLCAwLCAwIH0sCisJeyAweDEwNTAsIDB4MDg0MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMSB9LAorCXsgMHgxMWY2LCAweDIwMTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDIgfSwKKwl7IDAsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdzg0MF9wY2lfdGJsKTsKKworc3RydWN0IHBjaV9pZF9pbmZvIHsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgICAgc3RydWN0IG1hdGNoX2luZm8geworICAgICAgICAgICAgICAgIGludCAgICAgcGNpLCBwY2lfbWFzaywgc3Vic3lzdGVtLCBzdWJzeXN0ZW1fbWFzazsKKyAgICAgICAgICAgICAgICBpbnQgcmV2aXNpb24sIHJldmlzaW9uX21hc2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9ubHkgOCBiaXRzLiAqLworICAgICAgICB9IGlkOworICAgICAgICBlbnVtIHBjaV9pZF9mbGFnc19iaXRzIHBjaV9mbGFnczsKKyAgICAgICAgaW50IGlvX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5lZWRlZCBmb3IgSS9PIHJlZ2lvbiBjaGVjayBvciBpb3JlbWFwKCkuICovCisgICAgICAgIGludCBkcnZfZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEcml2ZXIgdXNlLCBpbnRlbmRlZCBhcyBjYXBhYmlsaXR5IGZsYWdzLiAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2lkX2luZm8gcGNpX2lkX3RibFtdID0geworCXsiV2luYm9uZCBXODljODQwIiwJCQkvKiBTb21ldGltZSBhIExldmVsLU9uZSBzd2l0Y2ggY2FyZC4gKi8KKwkgeyAweDA4NDAxMDUwLCAweGZmZmZmZmZmLCAweDgxNTMwMDAwLCAweGZmZmYwMDAwIH0sCisJIFc4NDBfRkxBR1MsIDEyOCwgQ2FuSGF2ZU1JSSB8IEhhc0Jyb2tlblR4IHwgRkRYT25Ob01JSX0sCisJeyJXaW5ib25kIFc4OWM4NDAiLCB7IDB4MDg0MDEwNTAsIDB4ZmZmZmZmZmYsIH0sCisJIFc4NDBfRkxBR1MsIDEyOCwgQ2FuSGF2ZU1JSSB8IEhhc0Jyb2tlblR4fSwKKwl7IkNvbXBleCBSTDEwMC1BVFgiLCB7IDB4MjAxMTExRjYsIDB4ZmZmZmZmZmYsfSwKKwkgVzg0MF9GTEFHUywgMTI4LCBDYW5IYXZlTUlJIHwgSGFzQnJva2VuVHh9LAorCXtOVUxMLH0sCQkJCQkvKiAwIHRlcm1pbmF0ZWQgbGlzdC4gKi8KK307CisKKy8qIFRoaXMgZHJpdmVyIHdhcyB3cml0dGVuIHRvIHVzZSBQQ0kgbWVtb3J5IHNwYWNlLCBob3dldmVyIHNvbWUgeDg2IHN5c3RlbXMKKyAgIHdvcmsgb25seSB3aXRoIEkvTyBzcGFjZSBhY2Nlc3Nlcy4gIFBhc3MgLURVU0VfSU9fT1BTIHRvIHVzZSBQQ0kgSS9PIHNwYWNlCisgICBhY2Nlc3NlcyBpbnN0ZWFkIG9mIG1lbW9yeSBzcGFjZS4gKi8KKworLyogT2Zmc2V0cyB0byB0aGUgQ29tbWFuZCBhbmQgU3RhdHVzIFJlZ2lzdGVycywgIkNTUnMiLgorICAgV2hpbGUgc2ltaWxhciB0byB0aGUgVHVsaXAsIHRoZXNlIHJlZ2lzdGVycyBhcmUgbG9uZ3dvcmQgYWxpZ25lZC4KKyAgIE5vdGU6IEl0J3Mgbm90IHVzZWZ1bCB0byBkZWZpbmUgc3ltYm9saWMgbmFtZXMgZm9yIGV2ZXJ5IHJlZ2lzdGVyIGJpdCBpbgorICAgdGhlIGRldmljZS4gIFRoZSBuYW1lIGNhbiBvbmx5IHBhcnRpYWxseSBkb2N1bWVudCB0aGUgc2VtYW50aWNzIGFuZCBtYWtlCisgICB0aGUgZHJpdmVyIGxvbmdlciBhbmQgbW9yZSBkaWZmaWN1bHQgdG8gcmVhZC4KKyovCitlbnVtIHc4NDBfb2Zmc2V0cyB7CisJUENJQnVzQ2ZnPTB4MDAsIFR4U3RhcnREZW1hbmQ9MHgwNCwgUnhTdGFydERlbWFuZD0weDA4LAorCVJ4UmluZ1B0cj0weDBDLCBUeFJpbmdQdHI9MHgxMCwKKwlJbnRyU3RhdHVzPTB4MTQsIE5ldHdvcmtDb25maWc9MHgxOCwgSW50ckVuYWJsZT0weDFDLAorCVJ4TWlzc2VkPTB4MjAsIEVFQ3RybD0weDI0LCBNSUlDdHJsPTB4MjQsIEJvb3RSb209MHgyOCwgR1BUaW1lcj0weDJDLAorCUN1clJ4RGVzY0FkZHI9MHgzMCwgQ3VyUnhCdWZBZGRyPTB4MzQsCQkJLyogRGVidWcgdXNlICovCisJTXVsdGljYXN0RmlsdGVyMD0weDM4LCBNdWx0aWNhc3RGaWx0ZXIxPTB4M0MsIFN0YXRpb25BZGRyPTB4NDAsCisJQ3VyVHhEZXNjQWRkcj0weDRDLCBDdXJUeEJ1ZkFkZHI9MHg1MCwKK307CisKKy8qIEJpdHMgaW4gdGhlIGludGVycnVwdCBzdGF0dXMvZW5hYmxlIHJlZ2lzdGVycy4gKi8KKy8qIFRoZSBiaXRzIGluIHRoZSBJbnRyIFN0YXR1cy9FbmFibGUgcmVnaXN0ZXJzLCBtb3N0bHkgaW50ZXJydXB0IHNvdXJjZXMuICovCitlbnVtIGludHJfc3RhdHVzX2JpdHMgeworCU5vcm1hbEludHI9MHgxMDAwMCwgQWJub3JtYWxJbnRyPTB4ODAwMCwKKwlJbnRyUENJRXJyPTB4MjAwMCwgVGltZXJJbnQ9MHg4MDAsCisJSW50clJ4RGllZD0weDEwMCwgUnhOb0J1Zj0weDgwLCBJbnRyUnhEb25lPTB4NDAsCisJVHhGSUZPVW5kZXJmbG93PTB4MjAsIFJ4RXJySW50cj0weDEwLAorCVR4SWRsZT0weDA0LCBJbnRyVHhTdG9wcGVkPTB4MDIsIEludHJUeERvbmU9MHgwMSwKK307CisKKy8qIEJpdHMgaW4gdGhlIE5ldHdvcmtDb25maWcgcmVnaXN0ZXIuICovCitlbnVtIHJ4X21vZGVfYml0cyB7CisJQWNjZXB0RXJyPTB4ODAsIEFjY2VwdFJ1bnQ9MHg0MCwKKwlBY2NlcHRCcm9hZGNhc3Q9MHgyMCwgQWNjZXB0TXVsdGljYXN0PTB4MTAsCisJQWNjZXB0QWxsUGh5cz0weDA4LCBBY2NlcHRNeVBoeXM9MHgwMiwKK307CisKK2VudW0gbWlpX3JlZ19iaXRzIHsKKwlNRElPX1NoaWZ0Q2xrPTB4MTAwMDAsIE1ESU9fRGF0YUluPTB4ODAwMDAsIE1ESU9fRGF0YU91dD0weDIwMDAwLAorCU1ESU9fRW5iT3V0cHV0PTB4NDAwMDAsIE1ESU9fRW5iSW4gPSAweDAwMDAwLAorfTsKKworLyogVGhlIFR1bGlwIFJ4IGFuZCBUeCBidWZmZXIgZGVzY3JpcHRvcnMuICovCitzdHJ1Y3Qgdzg0MF9yeF9kZXNjIHsKKwlzMzIgc3RhdHVzOworCXMzMiBsZW5ndGg7CisJdTMyIGJ1ZmZlcjE7CisJdTMyIGJ1ZmZlcjI7Cit9OworCitzdHJ1Y3Qgdzg0MF90eF9kZXNjIHsKKwlzMzIgc3RhdHVzOworCXMzMiBsZW5ndGg7CisJdTMyIGJ1ZmZlcjEsIGJ1ZmZlcjI7Cit9OworCisvKiBCaXRzIGluIG5ldHdvcmtfZGVzYy5zdGF0dXMgKi8KK2VudW0gZGVzY19zdGF0dXNfYml0cyB7CisJRGVzY093bj0weDgwMDAwMDAwLCBEZXNjRW5kUmluZz0weDAyMDAwMDAwLCBEZXNjVXNlTGluaz0weDAxMDAwMDAwLAorCURlc2NXaG9sZVBrdD0weDYwMDAwMDAwLCBEZXNjU3RhcnRQa3Q9MHgyMDAwMDAwMCwgRGVzY0VuZFBrdD0weDQwMDAwMDAwLAorCURlc2NJbnRyPTB4ODAwMDAwMDAsCit9OworCisjZGVmaW5lIE1JSV9DTlQJCTEgLyogd2luYm9uZCBvbmx5IHN1cHBvcnRzIG9uZSBNSUkgKi8KK3N0cnVjdCBuZXRkZXZfcHJpdmF0ZSB7CisJc3RydWN0IHc4NDBfcnhfZGVzYyAqcnhfcmluZzsKKwlkbWFfYWRkcl90CXJ4X2FkZHJbUlhfUklOR19TSVpFXTsKKwlzdHJ1Y3Qgdzg0MF90eF9kZXNjICp0eF9yaW5nOworCWRtYV9hZGRyX3QJdHhfYWRkcltUWF9SSU5HX1NJWkVdOworCWRtYV9hZGRyX3QgcmluZ19kbWFfYWRkcjsKKwkvKiBUaGUgYWRkcmVzc2VzIG9mIHJlY2VpdmUtaW4tcGxhY2Ugc2tidWZmcy4gKi8KKwlzdHJ1Y3Qgc2tfYnVmZiogcnhfc2tidWZmW1JYX1JJTkdfU0laRV07CisJLyogVGhlIHNhdmVkIGFkZHJlc3Mgb2YgYSBzZW50LWluLXBsYWNlIHBhY2tldC9idWZmZXIsIGZvciBsYXRlciBmcmVlKCkuICovCisJc3RydWN0IHNrX2J1ZmYqIHR4X3NrYnVmZltUWF9SSU5HX1NJWkVdOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkvKiBNZWRpYSBtb25pdG9yaW5nIHRpbWVyLiAqLworCS8qIEZyZXF1ZW50bHkgdXNlZCB2YWx1ZXM6IGtlZXAgc29tZSBhZGphY2VudCBmb3IgY2FjaGUgZWZmZWN0LiAqLworCXNwaW5sb2NrX3QgbG9jazsKKwlpbnQgY2hpcF9pZCwgZHJ2X2ZsYWdzOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCWludCBjc3I2OworCXN0cnVjdCB3ODQwX3J4X2Rlc2MgKnJ4X2hlYWRfZGVzYzsKKwl1bnNpZ25lZCBpbnQgY3VyX3J4LCBkaXJ0eV9yeDsJCS8qIFByb2R1Y2VyL2NvbnN1bWVyIHJpbmcgaW5kaWNlcyAqLworCXVuc2lnbmVkIGludCByeF9idWZfc3o7CQkJCS8qIEJhc2VkIG9uIE1UVStzbGFjay4gKi8KKwl1bnNpZ25lZCBpbnQgY3VyX3R4LCBkaXJ0eV90eDsKKwl1bnNpZ25lZCBpbnQgdHhfcV9ieXRlczsKKwl1bnNpZ25lZCBpbnQgdHhfZnVsbDsJCQkJLyogVGhlIFR4IHF1ZXVlIGlzIGZ1bGwuICovCisJLyogTUlJIHRyYW5zY2VpdmVyIHNlY3Rpb24uICovCisJaW50IG1paV9jbnQ7CQkJCQkJLyogTUlJIGRldmljZSBhZGRyZXNzZXMuICovCisJdW5zaWduZWQgY2hhciBwaHlzW01JSV9DTlRdOwkJLyogTUlJIGRldmljZSBhZGRyZXNzZXMsIGJ1dCBvbmx5IHRoZSBmaXJzdCBpcyB1c2VkICovCisJdTMyIG1paTsKKwlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpX2lmOworCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworfTsKKworc3RhdGljIGludCAgZWVwcm9tX3JlYWQodm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBsb2NhdGlvbik7CitzdGF0aWMgaW50ICBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpOworc3RhdGljIGludCAgbmV0ZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICB1cGRhdGVfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG5ldGRldl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgaW5pdF9yeHR4X3JpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZnJlZV9yeHR4X3JpbmdzKHN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnApOworc3RhdGljIHZvaWQgaW5pdF9yZWdpc3RlcnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB0eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBhbGxvY19yaW5nZGVzYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGZyZWVfcmluZ2Rlc2Moc3RydWN0IG5ldGRldl9wcml2YXRlICpucCk7CitzdGF0aWMgaW50ICBzdGFydF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBpbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBuZXRkZXZfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGludHJfc3RhdHVzKTsKK3N0YXRpYyBpbnQgIG5ldGRldl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB1MzIgX19zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpnZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG5ldGRldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOworc3RhdGljIGludCAgbmV0ZGV2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisMCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHc4NDBfcHJvYmUxIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wOworCXN0YXRpYyBpbnQgZmluZF9jbnQ7CisJaW50IGNoaXBfaWR4ID0gZW50LT5kcml2ZXJfZGF0YTsKKwlpbnQgaXJxOworCWludCBpLCBvcHRpb24gPSBmaW5kX2NudCA8IE1BWF9VTklUUyA/IG9wdGlvbnNbZmluZF9jbnRdIDogMDsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwlpbnQgYmFyID0gMTsKKworCWkgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoaSkgcmV0dXJuIGk7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlycSA9IHBkZXYtPmlycTsKKworCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsMHhGRkZGZmZmZikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2luYm9uZC04NDA6IERldmljZSAlcyBkaXNhYmxlZCBkdWUgdG8gRE1BIGxpbWl0YXRpb25zLlxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqbnApKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSkpCisJCWdvdG8gZXJyX291dF9uZXRkZXY7CisjaWZkZWYgVVNFX0lPX09QUworCWJhciA9IDA7CisjZW5kaWYKKwlpb2FkZHIgPSBwY2lfaW9tYXAocGRldiwgYmFyLCBwY2lfaWRfdGJsW2NoaXBfaWR4XS5pb19zaXplKTsKKwlpZiAoIWlvYWRkcikKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJKCh1MTYgKilkZXYtPmRldl9hZGRyKVtpXSA9IGxlMTZfdG9fY3B1KGVlcHJvbV9yZWFkKGlvYWRkciwgaSkpOworCisJLyogUmVzZXQgdGhlIGNoaXAgdG8gZXJhc2UgcHJldmlvdXMgbWlzY29uZmlndXJhdGlvbi4KKwkgICBObyBob2xkIHRpbWUgcmVxdWlyZWQhICovCisJaW93cml0ZTMyKDB4MDAwMDAwMDEsIGlvYWRkciArIFBDSUJ1c0NmZyk7CisKKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvYWRkcjsKKwlkZXYtPmlycSA9IGlycTsKKworCW5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlucC0+cGNpX2RldiA9IHBkZXY7CisJbnAtPmNoaXBfaWQgPSBjaGlwX2lkeDsKKwlucC0+ZHJ2X2ZsYWdzID0gcGNpX2lkX3RibFtjaGlwX2lkeF0uZHJ2X2ZsYWdzOworCXNwaW5fbG9ja19pbml0KCZucC0+bG9jayk7CisJbnAtPm1paV9pZi5kZXYgPSBkZXY7CisJbnAtPm1paV9pZi5tZGlvX3JlYWQgPSBtZGlvX3JlYWQ7CisJbnAtPm1paV9pZi5tZGlvX3dyaXRlID0gbWRpb193cml0ZTsKKwlucC0+YmFzZV9hZGRyID0gaW9hZGRyOworCQorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJaWYgKGRldi0+bWVtX3N0YXJ0KQorCQlvcHRpb24gPSBkZXYtPm1lbV9zdGFydDsKKworCS8qIFRoZSBsb3dlciBmb3VyIGJpdHMgYXJlIHRoZSBtZWRpYSB0eXBlLiAqLworCWlmIChvcHRpb24gPiAwKSB7CisJCWlmIChvcHRpb24gJiAweDIwMCkKKwkJCW5wLT5taWlfaWYuZnVsbF9kdXBsZXggPSAxOworCQlpZiAob3B0aW9uICYgMTUpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogaWdub3JpbmcgdXNlciBzdXBwbGllZCBtZWRpYSB0eXBlICVkIiwKKwkJCQlkZXYtPm5hbWUsIG9wdGlvbiAmIDE1KTsKKwl9CisJaWYgKGZpbmRfY250IDwgTUFYX1VOSVRTICAmJiAgZnVsbF9kdXBsZXhbZmluZF9jbnRdID4gMCkKKwkJbnAtPm1paV9pZi5mdWxsX2R1cGxleCA9IDE7CisKKwlpZiAobnAtPm1paV9pZi5mdWxsX2R1cGxleCkKKwkJbnAtPm1paV9pZi5mb3JjZV9tZWRpYSA9IDE7CisKKwkvKiBUaGUgY2hpcC1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9ICZuZXRkZXZfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZzdGFydF90eDsKKwlkZXYtPnN0b3AgPSAmbmV0ZGV2X2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gJmdldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZTsKKwlkZXYtPmRvX2lvY3RsID0gJm5ldGRldl9pb2N0bDsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJm5ldGRldl9ldGh0b29sX29wczsKKwlkZXYtPnR4X3RpbWVvdXQgPSAmdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKworCWkgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoaSkKKwkJZ290byBlcnJfb3V0X2NsZWFyZGV2OworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGF0ICVwLCAiLAorCQkgICBkZXYtPm5hbWUsIHBjaV9pZF90YmxbY2hpcF9pZHhdLm5hbWUsIGlvYWRkcik7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJCXByaW50aygiJTIuMng6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCIlMi4yeCwgSVJRICVkLlxuIiwgZGV2LT5kZXZfYWRkcltpXSwgaXJxKTsKKworCWlmIChucC0+ZHJ2X2ZsYWdzICYgQ2FuSGF2ZU1JSSkgeworCQlpbnQgcGh5LCBwaHlfaWR4ID0gMDsKKwkJZm9yIChwaHkgPSAxOyBwaHkgPCAzMiAmJiBwaHlfaWR4IDwgTUlJX0NOVDsgcGh5KyspIHsKKwkJCWludCBtaWlfc3RhdHVzID0gbWRpb19yZWFkKGRldiwgcGh5LCBNSUlfQk1TUik7CisJCQlpZiAobWlpX3N0YXR1cyAhPSAweGZmZmYgICYmICBtaWlfc3RhdHVzICE9IDB4MDAwMCkgeworCQkJCW5wLT5waHlzW3BoeV9pZHgrK10gPSBwaHk7CisJCQkJbnAtPm1paV9pZi5hZHZlcnRpc2luZyA9IG1kaW9fcmVhZChkZXYsIHBoeSwgTUlJX0FEVkVSVElTRSk7CisJCQkJbnAtPm1paSA9IChtZGlvX3JlYWQoZGV2LCBwaHksIE1JSV9QSFlTSUQxKSA8PCAxNikrCisJCQkJCQltZGlvX3JlYWQoZGV2LCBwaHksIE1JSV9QSFlTSUQyKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTUlJIFBIWSAlOC44eGggZm91bmQgYXQgYWRkcmVzcyAlZCwgc3RhdHVzICIKKwkJCQkJICAgIjB4JTQuNHggYWR2ZXJ0aXNpbmcgJTQuNHguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIG5wLT5taWksIHBoeSwgbWlpX3N0YXR1cywgbnAtPm1paV9pZi5hZHZlcnRpc2luZyk7CisJCQl9CisJCX0KKwkJbnAtPm1paV9jbnQgPSBwaHlfaWR4OworCQlucC0+bWlpX2lmLnBoeV9pZCA9IG5wLT5waHlzWzBdOworCQlpZiAocGh5X2lkeCA9PSAwKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1JSSBQSFkgbm90IGZvdW5kIC0tIHRoaXMgZGV2aWNlIG1heSAiCisJCQkJCSAgICJub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuXG4iLCBkZXYtPm5hbWUpOworCQl9CisJfQorCisJZmluZF9jbnQrKzsKKwlyZXR1cm4gMDsKKworZXJyX291dF9jbGVhcmRldjoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcGNpX2lvdW5tYXAocGRldiwgaW9hZGRyKTsKK2Vycl9vdXRfZnJlZV9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXRfbmV0ZGV2OgorCWZyZWVfbmV0ZGV2IChkZXYpOworCXJldHVybiAtRU5PREVWOworfQorCisMCisvKiBSZWFkIHRoZSBFRVBST00gYW5kIE1JSSBNYW5hZ2VtZW50IERhdGEgSS9PIChNRElPKSBpbnRlcmZhY2VzLiAgVGhlc2UgYXJlCisgICBvZnRlbiBzZXJpYWwgYml0IHN0cmVhbXMgZ2VuZXJhdGVkIGJ5IHRoZSBob3N0IHByb2Nlc3Nvci4KKyAgIFRoZSBleGFtcGxlIGJlbG93IGlzIGZvciB0aGUgY29tbW9uIDkzYzQ2IEVFUFJPTSwgNjQgMTYgYml0IHdvcmRzLiAqLworCisvKiBEZWxheSBiZXR3ZWVuIEVFUFJPTSBjbG9jayB0cmFuc2l0aW9ucy4KKyAgIE5vIGV4dHJhIGRlbGF5IGlzIG5lZWRlZCB3aXRoIDMzTWh6IFBDSSwgYnV0IGZ1dHVyZSA2Nk1oeiBhY2Nlc3MgbWF5IG5lZWQKKyAgIGEgZGVsYXkuICBOb3RlIHRoYXQgcHJlLTIuMC4zNCBrZXJuZWxzIGhhZCBhIGNhY2hlLWFsaWdubWVudCBidWcgdGhhdAorICAgbWFkZSB1ZGVsYXkoKSB1bnJlbGlhYmxlLgorICAgVGhlIG9sZCBtZXRob2Qgb2YgdXNpbmcgYW4gSVNBIGFjY2VzcyBhcyBhIGRlbGF5LCBfX1NMT1dfRE9XTl9JT19fLCBpcworICAgZGVwcmljYXRlZC4KKyovCisjZGVmaW5lIGVlcHJvbV9kZWxheShlZV9hZGRyKQlpb3JlYWQzMihlZV9hZGRyKQorCitlbnVtIEVFUFJPTV9DdHJsX0JpdHMgeworCUVFX1NoaWZ0Q2xrPTB4MDIsIEVFX1dyaXRlMD0weDgwMSwgRUVfV3JpdGUxPTB4ODA1LAorCUVFX0NoaXBTZWxlY3Q9MHg4MDEsIEVFX0RhdGFJbj0weDA4LAorfTsKKworLyogVGhlIEVFUFJPTSBjb21tYW5kcyBpbmNsdWRlIHRoZSBhbHdheS1zZXQgbGVhZGluZyBiaXQuICovCitlbnVtIEVFUFJPTV9DbWRzIHsKKwlFRV9Xcml0ZUNtZD0oNSA8PCA2KSwgRUVfUmVhZENtZD0oNiA8PCA2KSwgRUVfRXJhc2VDbWQ9KDcgPDwgNiksCit9OworCitzdGF0aWMgaW50IGVlcHJvbV9yZWFkKHZvaWQgX19pb21lbSAqYWRkciwgaW50IGxvY2F0aW9uKQoreworCWludCBpOworCWludCByZXR2YWwgPSAwOworCXZvaWQgX19pb21lbSAqZWVfYWRkciA9IGFkZHIgKyBFRUN0cmw7CisJaW50IHJlYWRfY21kID0gbG9jYXRpb24gfCBFRV9SZWFkQ21kOworCWlvd3JpdGUzMihFRV9DaGlwU2VsZWN0LCBlZV9hZGRyKTsKKworCS8qIFNoaWZ0IHRoZSByZWFkIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gMTA7IGkgPj0gMDsgaS0tKSB7CisJCXNob3J0IGRhdGF2YWwgPSAocmVhZF9jbWQgJiAoMSA8PCBpKSkgPyBFRV9Xcml0ZTEgOiBFRV9Xcml0ZTA7CisJCWlvd3JpdGUzMihkYXRhdmFsLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KGVlX2FkZHIpOworCQlpb3dyaXRlMzIoZGF0YXZhbCB8IEVFX1NoaWZ0Q2xrLCBlZV9hZGRyKTsKKwkJZWVwcm9tX2RlbGF5KGVlX2FkZHIpOworCX0KKwlpb3dyaXRlMzIoRUVfQ2hpcFNlbGVjdCwgZWVfYWRkcik7CisJZWVwcm9tX2RlbGF5KGVlX2FkZHIpOworCisJZm9yIChpID0gMTY7IGkgPiAwOyBpLS0pIHsKKwkJaW93cml0ZTMyKEVFX0NoaXBTZWxlY3QgfCBFRV9TaGlmdENsaywgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheShlZV9hZGRyKTsKKwkJcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoaW9yZWFkMzIoZWVfYWRkcikgJiBFRV9EYXRhSW4pID8gMSA6IDApOworCQlpb3dyaXRlMzIoRUVfQ2hpcFNlbGVjdCwgZWVfYWRkcik7CisJCWVlcHJvbV9kZWxheShlZV9hZGRyKTsKKwl9CisKKwkvKiBUZXJtaW5hdGUgdGhlIEVFUFJPTSBhY2Nlc3MuICovCisJaW93cml0ZTMyKDAsIGVlX2FkZHIpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qICBNSUkgdHJhbnNjZWl2ZXIgY29udHJvbCBzZWN0aW9uLgorCVJlYWQgYW5kIHdyaXRlIHRoZSBNSUkgcmVnaXN0ZXJzIHVzaW5nIHNvZnR3YXJlLWdlbmVyYXRlZCBzZXJpYWwKKwlNRElPIHByb3RvY29sLiAgU2VlIHRoZSBNSUkgc3BlY2lmaWNhdGlvbnMgb3IgRFA4Mzg0MEEgZGF0YSBzaGVldAorCWZvciBkZXRhaWxzLgorCisJVGhlIG1heGltdW0gZGF0YSBjbG9jayByYXRlIGlzIDIuNSBNaHouICBUaGUgbWluaW11bSB0aW1pbmcgaXMgdXN1YWxseQorCW1ldCBieSBiYWNrLXRvLWJhY2sgMzNNaHogUENJIGN5Y2xlcy4gKi8KKyNkZWZpbmUgbWRpb19kZWxheShtZGlvX2FkZHIpIGlvcmVhZDMyKG1kaW9fYWRkcikKKworLyogU2V0IGlmZiBhIE1JSSB0cmFuc2NlaXZlciBvbiBhbnkgaW50ZXJmYWNlIHJlcXVpcmVzIG1kaW8gcHJlYW1ibGUuCisgICBUaGlzIG9ubHkgc2V0IHdpdGggb2xkZXIgdHJhbnNjZWl2ZXJzLCBzbyB0aGUgZXh0cmEKKyAgIGNvZGUgc2l6ZSBvZiBhIHBlci1pbnRlcmZhY2UgZmxhZyBpcyBub3Qgd29ydGh3aGlsZS4gKi8KK3N0YXRpYyBjaGFyIG1paV9wcmVhbWJsZV9yZXF1aXJlZCA9IDE7CisKKyNkZWZpbmUgTURJT19XUklURTAgKE1ESU9fRW5iT3V0cHV0KQorI2RlZmluZSBNRElPX1dSSVRFMSAoTURJT19EYXRhT3V0IHwgTURJT19FbmJPdXRwdXQpCisKKy8qIEdlbmVyYXRlIHRoZSBwcmVhbWJsZSByZXF1aXJlZCBmb3IgaW5pdGlhbCBzeW5jaHJvbml6YXRpb24gYW5kCisgICBhIGZldyBvbGRlciB0cmFuc2NlaXZlcnMuICovCitzdGF0aWMgdm9pZCBtZGlvX3N5bmModm9pZCBfX2lvbWVtICptZGlvX2FkZHIpCit7CisJaW50IGJpdHMgPSAzMjsKKworCS8qIEVzdGFibGlzaCBzeW5jIGJ5IHNlbmRpbmcgYXQgbGVhc3QgMzIgbG9naWMgb25lcy4gKi8KKwl3aGlsZSAoLS1iaXRzID49IDApIHsKKwkJaW93cml0ZTMyKE1ESU9fV1JJVEUxLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KG1kaW9fYWRkcik7CisJCWlvd3JpdGUzMihNRElPX1dSSVRFMSB8IE1ESU9fU2hpZnRDbGssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkobWRpb19hZGRyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKm1kaW9fYWRkciA9IG5wLT5iYXNlX2FkZHIgKyBNSUlDdHJsOworCWludCBtaWlfY21kID0gKDB4ZjYgPDwgMTApIHwgKHBoeV9pZCA8PCA1KSB8IGxvY2F0aW9uOworCWludCBpLCByZXR2YWwgPSAwOworCisJaWYgKG1paV9wcmVhbWJsZV9yZXF1aXJlZCkKKwkJbWRpb19zeW5jKG1kaW9fYWRkcik7CisKKwkvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDE1OyBpID49IDA7IGktLSkgeworCQlpbnQgZGF0YXZhbCA9IChtaWlfY21kICYgKDEgPDwgaSkpID8gTURJT19XUklURTEgOiBNRElPX1dSSVRFMDsKKworCQlpb3dyaXRlMzIoZGF0YXZhbCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheShtZGlvX2FkZHIpOworCQlpb3dyaXRlMzIoZGF0YXZhbCB8IE1ESU9fU2hpZnRDbGssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkobWRpb19hZGRyKTsKKwl9CisJLyogUmVhZCB0aGUgdHdvIHRyYW5zaXRpb24sIDE2IGRhdGEsIGFuZCB3aXJlLWlkbGUgYml0cy4gKi8KKwlmb3IgKGkgPSAyMDsgaSA+IDA7IGktLSkgeworCQlpb3dyaXRlMzIoTURJT19FbmJJbiwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheShtZGlvX2FkZHIpOworCQlyZXR2YWwgPSAocmV0dmFsIDw8IDEpIHwgKChpb3JlYWQzMihtZGlvX2FkZHIpICYgTURJT19EYXRhSW4pID8gMSA6IDApOworCQlpb3dyaXRlMzIoTURJT19FbmJJbiB8IE1ESU9fU2hpZnRDbGssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkobWRpb19hZGRyKTsKKwl9CisJcmV0dXJuIChyZXR2YWw+PjEpICYgMHhmZmZmOworfQorCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqbWRpb19hZGRyID0gbnAtPmJhc2VfYWRkciArIE1JSUN0cmw7CisJaW50IG1paV9jbWQgPSAoMHg1MDAyIDw8IDE2KSB8IChwaHlfaWQgPDwgMjMpIHwgKGxvY2F0aW9uPDwxOCkgfCB2YWx1ZTsKKwlpbnQgaTsKKworCWlmIChsb2NhdGlvbiA9PSA0ICAmJiAgcGh5X2lkID09IG5wLT5waHlzWzBdKQorCQlucC0+bWlpX2lmLmFkdmVydGlzaW5nID0gdmFsdWU7CisKKwlpZiAobWlpX3ByZWFtYmxlX3JlcXVpcmVkKQorCQltZGlvX3N5bmMobWRpb19hZGRyKTsKKworCS8qIFNoaWZ0IHRoZSBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDMxOyBpID49IDA7IGktLSkgeworCQlpbnQgZGF0YXZhbCA9IChtaWlfY21kICYgKDEgPDwgaSkpID8gTURJT19XUklURTEgOiBNRElPX1dSSVRFMDsKKworCQlpb3dyaXRlMzIoZGF0YXZhbCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheShtZGlvX2FkZHIpOworCQlpb3dyaXRlMzIoZGF0YXZhbCB8IE1ESU9fU2hpZnRDbGssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkobWRpb19hZGRyKTsKKwl9CisJLyogQ2xlYXIgb3V0IGV4dHJhIGJpdHMuICovCisJZm9yIChpID0gMjsgaSA+IDA7IGktLSkgeworCQlpb3dyaXRlMzIoTURJT19FbmJJbiwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheShtZGlvX2FkZHIpOworCQlpb3dyaXRlMzIoTURJT19FbmJJbiB8IE1ESU9fU2hpZnRDbGssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkobWRpb19hZGRyKTsKKwl9CisJcmV0dXJuOworfQorCisMCitzdGF0aWMgaW50IG5ldGRldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZV9hZGRyOworCWludCBpOworCisJaW93cml0ZTMyKDB4MDAwMDAwMDEsIGlvYWRkciArIFBDSUJ1c0NmZyk7CQkvKiBSZXNldCAqLworCisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCWkgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJmludHJfaGFuZGxlciwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAoaSkKKwkJZ290byBvdXRfZXJyOworCisJaWYgKGRlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3ODljODQwX29wZW4oKSBpcnEgJWQuXG4iLAorCQkJICAgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisKKwlpZigoaT1hbGxvY19yaW5nZGVzYyhkZXYpKSkKKwkJZ290byBvdXRfZXJyOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwlpbml0X3JlZ2lzdGVycyhkZXYpOworCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlpZiAoZGVidWcgPiAyKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERvbmUgbmV0ZGV2X29wZW4oKS5cbiIsIGRldi0+bmFtZSk7CisKKwkvKiBTZXQgdGhlIHRpbWVyIHRvIGNoZWNrIGZvciBsaW5rIGJlYXQuICovCisJaW5pdF90aW1lcigmbnAtPnRpbWVyKTsKKwlucC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAxKkhaOworCW5wLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCW5wLT50aW1lci5mdW5jdGlvbiA9ICZuZXRkZXZfdGltZXI7CQkJCS8qIHRpbWVyIGhhbmRsZXIgKi8KKwlhZGRfdGltZXIoJm5wLT50aW1lcik7CisJcmV0dXJuIDA7CitvdXRfZXJyOgorCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwlyZXR1cm4gaTsKK30KKworI2RlZmluZSBNSUlfREFWSUNPTV9ETTkxMDEJMHgwMTgxYjgwMAorCitzdGF0aWMgaW50IHVwZGF0ZV9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGR1cGxleCwgZmFzdGV0aCwgcmVzdWx0LCBtaWlfcmVnOworCisJLyogQlNNUiAqLworCW1paV9yZWcgPSBtZGlvX3JlYWQoZGV2LCBucC0+cGh5c1swXSwgTUlJX0JNU1IpOworCisJaWYgKG1paV9yZWcgPT0gMHhmZmZmKQorCQlyZXR1cm4gbnAtPmNzcjY7CisJLyogcmVyZWFkOiB0aGUgbGluayBzdGF0dXMgYml0IGlzIHN0aWNreSAqLworCW1paV9yZWcgPSBtZGlvX3JlYWQoZGV2LCBucC0+cGh5c1swXSwgTUlJX0JNU1IpOworCWlmICghKG1paV9yZWcgJiAweDQpKSB7CisJCWlmIChuZXRpZl9jYXJyaWVyX29rKGRldikpIHsKKwkJCWlmIChkZWJ1ZykKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTUlJICMlZCByZXBvcnRzIG5vIGxpbmsuIERpc2FibGluZyB3YXRjaGRvZy5cbiIsCisJCQkJCWRldi0+bmFtZSwgbnAtPnBoeXNbMF0pOworCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJfQorCQlyZXR1cm4gbnAtPmNzcjY7CisJfQorCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJCWlmIChkZWJ1ZykKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNSUkgIyVkIGxpbmsgaXMgYmFjay4gRW5hYmxpbmcgd2F0Y2hkb2cuXG4iLAorCQkJCWRldi0+bmFtZSwgbnAtPnBoeXNbMF0pOworCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJfQorCQorCWlmICgobnAtPm1paSAmIH4weGYpID09IE1JSV9EQVZJQ09NX0RNOTEwMSkgeworCQkvKiBJZiB0aGUgbGluayBwYXJ0bmVyIGRvZXNuJ3Qgc3VwcG9ydCBhdXRvbmVnb3RpYXRpb24KKwkJICogdGhlIE1JSSBkZXRlY3RzIGl0J3MgYWJpbGl0aWVzIHdpdGggdGhlICJwYXJhbGxlbCBkZXRlY3Rpb24iLgorCQkgKiBTb21lIE1JSXMgdXBkYXRlIHRoZSBMUEEgcmVnaXN0ZXIgdG8gdGhlIHJlc3VsdCBvZiB0aGUgcGFyYWxsZWwKKwkJICogZGV0ZWN0aW9uLCBzb21lIGRvbid0LgorCQkgKiBUaGUgRGF2aWNvbSBQSFkgW2F0IGxlYXN0IDAxODFiODAwXSBkb2Vzbid0LgorCQkgKiBJbnN0ZWFkIGJpdCA5IGFuZCAxMyBvZiB0aGUgQk1DUiBhcmUgdXBkYXRlZCB0byB0aGUgcmVzdWx0CisJCSAqIG9mIHRoZSBuZWdvdGlhdGlvbi4uCisJCSAqLworCQltaWlfcmVnID0gbWRpb19yZWFkKGRldiwgbnAtPnBoeXNbMF0sIE1JSV9CTUNSKTsKKwkJZHVwbGV4ID0gbWlpX3JlZyAmIEJNQ1JfRlVMTERQTFg7CisJCWZhc3RldGggPSBtaWlfcmVnICYgQk1DUl9TUEVFRDEwMDsKKwl9IGVsc2UgeworCQlpbnQgbmVnb3RpYXRlZDsKKwkJbWlpX3JlZwk9IG1kaW9fcmVhZChkZXYsIG5wLT5waHlzWzBdLCBNSUlfTFBBKTsKKwkJbmVnb3RpYXRlZCA9IG1paV9yZWcgJiBucC0+bWlpX2lmLmFkdmVydGlzaW5nOworCisJCWR1cGxleCA9IChuZWdvdGlhdGVkICYgTFBBXzEwMEZVTEwpIHx8ICgobmVnb3RpYXRlZCAmIDB4MDJDMCkgPT0gTFBBXzEwRlVMTCk7CisJCWZhc3RldGggPSBuZWdvdGlhdGVkICYgMHgzODA7CisJfQorCWR1cGxleCB8PSBucC0+bWlpX2lmLmZvcmNlX21lZGlhOworCS8qIHJlbW92ZSBmYXN0ZXRoZXIgYW5kIGZ1bGxkdXBsZXggKi8KKwlyZXN1bHQgPSBucC0+Y3NyNiAmIH4weDIwMDAwMjAwOworCWlmIChkdXBsZXgpCisJCXJlc3VsdCB8PSAweDIwMDsKKwlpZiAoZmFzdGV0aCkKKwkJcmVzdWx0IHw9IDB4MjAwMDAwMDA7CisJaWYgKHJlc3VsdCAhPSBucC0+Y3NyNiAmJiBkZWJ1ZykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNldHRpbmcgJWRNQml0LSVzLWR1cGxleCBiYXNlZCBvbiBNSUkjJWRcbiIsCisJCQkJIGRldi0+bmFtZSwgZmFzdGV0aCA/IDEwMCA6IDEwLCAKKwkJCSAgIAlkdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIsIG5wLT5waHlzWzBdKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisjZGVmaW5lIFJYVFhfVElNRU9VVAkyMDAwCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX2NzcjYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ldykKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlX2FkZHI7CisJaW50IGxpbWl0ID0gUlhUWF9USU1FT1VUOworCisJaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCQluZXcgPSAwOworCWlmIChuZXc9PW5wLT5jc3I2KQorCQlyZXR1cm47CisJLyogc3RvcCBib3RoIFR4IGFuZCBSeCBwcm9jZXNzZXMgKi8KKwlpb3dyaXRlMzIobnAtPmNzcjYgJiB+MHgyMDAyLCBpb2FkZHIgKyBOZXR3b3JrQ29uZmlnKTsKKwkvKiB3YWl0IHVudGlsIHRoZXkgaGF2ZSByZWFsbHkgc3RvcHBlZCAqLworCWZvciAoOzspIHsKKwkJaW50IGNzcjUgPSBpb3JlYWQzMihpb2FkZHIgKyBJbnRyU3RhdHVzKTsKKwkJaW50IHQ7CisKKwkJdCA9IChjc3I1ID4+IDE3KSAmIDB4MDc7CisJCWlmICh0PT0wfHx0PT0xKSB7CisJCQkvKiByeCBzdG9wcGVkICovCisJCQl0ID0gKGNzcjUgPj4gMjApICYgMHgwNzsKKwkJCWlmICh0PT0wfHx0PT0xKQorCQkJCWJyZWFrOworCQl9CisKKwkJbGltaXQtLTsKKwkJaWYoIWxpbWl0KSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogY291bGRuJ3Qgc3RvcCByeHR4LCBJbnRyU3RhdHVzICV4aC5cbiIsCisJCQkJCWRldi0+bmFtZSwgY3NyNSk7CisJCQlicmVhazsKKwkJfQorCQl1ZGVsYXkoMSk7CisJfQorCW5wLT5jc3I2ID0gbmV3OworCS8qIGFuZCByZXN0YXJ0IHRoZW0gd2l0aCB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gKi8KKwlpb3dyaXRlMzIobnAtPmNzcjYsIGlvYWRkciArIE5ldHdvcmtDb25maWcpOworCWlmIChuZXcgJiAweDIwMCkKKwkJbnAtPm1paV9pZi5mdWxsX2R1cGxleCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZV9hZGRyOworCisJaWYgKGRlYnVnID4gMikKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNZWRpYSBzZWxlY3Rpb24gdGltZXIgdGljaywgc3RhdHVzICU4Ljh4ICIKKwkJCSAgICJjb25maWcgJTguOHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQzMihpb2FkZHIgKyBJbnRyU3RhdHVzKSwKKwkJCSAgIGlvcmVhZDMyKGlvYWRkciArIE5ldHdvcmtDb25maWcpKTsKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJdXBkYXRlX2NzcjYoZGV2LCB1cGRhdGVfbGluayhkZXYpKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwlucC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAxMCpIWjsKKwlhZGRfdGltZXIoJm5wLT50aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcnh0eF9yaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJbnAtPnJ4X2hlYWRfZGVzYyA9ICZucC0+cnhfcmluZ1swXTsKKwlucC0+dHhfcmluZyA9IChzdHJ1Y3Qgdzg0MF90eF9kZXNjKikmbnAtPnJ4X3JpbmdbUlhfUklOR19TSVpFXTsKKworCS8qIEluaXRpYWwgYWxsIFJ4IGRlc2NyaXB0b3JzLiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlucC0+cnhfcmluZ1tpXS5sZW5ndGggPSBucC0+cnhfYnVmX3N6OworCQlucC0+cnhfcmluZ1tpXS5zdGF0dXMgPSAwOworCQlucC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwl9CisJLyogTWFyayB0aGUgbGFzdCBlbnRyeSBhcyB3cmFwcGluZyB0aGUgcmluZy4gKi8KKwlucC0+cnhfcmluZ1tpLTFdLmxlbmd0aCB8PSBEZXNjRW5kUmluZzsKKworCS8qIEZpbGwgaW4gdGhlIFJ4IGJ1ZmZlcnMuICBIYW5kbGUgYWxsb2NhdGlvbiBmYWlsdXJlIGdyYWNlZnVsbHkuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKG5wLT5yeF9idWZfc3opOworCQlucC0+cnhfc2tidWZmW2ldID0gc2tiOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlicmVhazsKKwkJc2tiLT5kZXYgPSBkZXY7CQkJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLworCQlucC0+cnhfYWRkcltpXSA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LHNrYi0+dGFpbCwKKwkJCQkJc2tiLT5sZW4sUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQlucC0+cnhfcmluZ1tpXS5idWZmZXIxID0gbnAtPnJ4X2FkZHJbaV07CisJCW5wLT5yeF9yaW5nW2ldLnN0YXR1cyA9IERlc2NPd247CisJfQorCisJbnAtPmN1cl9yeCA9IDA7CisJbnAtPmRpcnR5X3J4ID0gKHVuc2lnbmVkIGludCkoaSAtIFJYX1JJTkdfU0laRSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBUeCBkZXNjcmlwdG9ycyAqLworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlucC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJbnAtPnR4X3JpbmdbaV0uc3RhdHVzID0gMDsKKwl9CisJbnAtPnR4X2Z1bGwgPSAwOworCW5wLT50eF9xX2J5dGVzID0gbnAtPmRpcnR5X3R4ID0gbnAtPmN1cl90eCA9IDA7CisKKwlpb3dyaXRlMzIobnAtPnJpbmdfZG1hX2FkZHIsIG5wLT5iYXNlX2FkZHIgKyBSeFJpbmdQdHIpOworCWlvd3JpdGUzMihucC0+cmluZ19kbWFfYWRkcitzaXplb2Yoc3RydWN0IHc4NDBfcnhfZGVzYykqUlhfUklOR19TSVpFLAorCQlucC0+YmFzZV9hZGRyICsgVHhSaW5nUHRyKTsKKworfQorCitzdGF0aWMgdm9pZCBmcmVlX3J4dHhfcmluZ3Moc3RydWN0IG5ldGRldl9wcml2YXRlKiBucCkKK3sKKwlpbnQgaTsKKwkvKiBGcmVlIGFsbCB0aGUgc2tidWZmcyBpbiB0aGUgUnggcXVldWUuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCW5wLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJCWlmIChucC0+cnhfc2tidWZmW2ldKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LAorCQkJCQkJbnAtPnJ4X2FkZHJbaV0sCisJCQkJCQlucC0+cnhfc2tidWZmW2ldLT5sZW4sCisJCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihucC0+cnhfc2tidWZmW2ldKTsKKwkJfQorCQlucC0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwl9CisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCWlmIChucC0+dHhfc2tidWZmW2ldKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LAorCQkJCQkJbnAtPnR4X2FkZHJbaV0sCisJCQkJCQlucC0+dHhfc2tidWZmW2ldLT5sZW4sCisJCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IobnAtPnR4X3NrYnVmZltpXSk7CisJCX0KKwkJbnAtPnR4X3NrYnVmZltpXSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBpbml0X3JlZ2lzdGVycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2VfYWRkcjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWlvd3JpdGU4KGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIFN0YXRpb25BZGRyICsgaSk7CisKKwkvKiBJbml0aWFsaXplIG90aGVyIHJlZ2lzdGVycy4gKi8KKyNpZmRlZiBfX0JJR19FTkRJQU4KKwlpID0gKDE8PDIwKTsJLyogQmlnLWVuZGlhbiBkZXNjcmlwdG9ycyAqLworI2Vsc2UKKwlpID0gMDsKKyNlbmRpZgorCWkgfD0gKDB4MDQ8PDIpOwkJLyogc2tpcCBsZW5ndGggNCB1MzIgKi8KKwlpIHw9IDB4MDI7CQkvKiBnaXZlIFJ4IHByaW9yaXR5ICovCisKKwkvKiBDb25maWd1cmUgdGhlIFBDSSBidXMgYnVyc3RzIGFuZCBGSUZPIHRocmVzaG9sZHMuCisJICAgNDg2OiBTZXQgOCBsb25nd29yZCBjYWNoZSBhbGlnbm1lbnQsIDggbG9uZ3dvcmQgYnVyc3QuCisJICAgNTg2OiBTZXQgMTYgbG9uZ3dvcmQgY2FjaGUgYWxpZ25tZW50LCBubyBidXJzdCBsaW1pdC4KKwkgICBDYWNoZSBhbGlnbm1lbnQgYml0cyAxNToxNAkgICAgIEJ1cnN0IGxlbmd0aCAxMzo4CisJCTAwMDAJPG5vdCBhbGxvd2VkPiAJCTAwMDAgYWxpZ24gdG8gY2FjaGUJMDgwMCA4IGxvbmd3b3JkcworCQk0MDAwCTggIGxvbmd3b3JkcwkJMDEwMCAxIGxvbmd3b3JkCQkxMDAwIDE2IGxvbmd3b3JkcworCQk4MDAwCTE2IGxvbmd3b3JkcwkJMDIwMCAyIGxvbmd3b3JkcwkyMDAwIDMyIGxvbmd3b3JkcworCQlDMDAwCTMyICBsb25nd29yZHMJCTA0MDAgNCBsb25nd29yZHMgKi8KKworI2lmIGRlZmluZWQgKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChNT0RVTEUpCisJLyogV2hlbiBub3QgYSBtb2R1bGUgd2UgY2FuIHdvcmsgYXJvdW5kIGJyb2tlbiAnNDg2IFBDSSBib2FyZHMuICovCisJaWYgKGJvb3RfY3B1X2RhdGEueDg2IDw9IDQpIHsKKwkJaSB8PSAweDQ4MDA7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUaGlzIGlzIGEgMzg2LzQ4NiBQQ0kgc3lzdGVtLCBzZXR0aW5nIGNhY2hlICIKKwkJCSAgICJhbGlnbm1lbnQgdG8gOCBsb25nd29yZHMuXG4iLCBkZXYtPm5hbWUpOworCX0gZWxzZSB7CisJCWkgfD0gMHhFMDAwOworCX0KKyNlbGlmIGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19hbHBoYV9fKSB8fCBkZWZpbmVkKF9faWE2NF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisJaSB8PSAweEUwMDA7CisjZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykKKwlpIHw9IDB4NDgwMDsKKyNlbHNlCisjd2FybmluZyBQcm9jZXNzb3IgYXJjaGl0ZWN0dXJlIHVuZGVmaW5lZAorCWkgfD0gMHg0ODAwOworI2VuZGlmCisJaW93cml0ZTMyKGksIGlvYWRkciArIFBDSUJ1c0NmZyk7CisKKwlucC0+Y3NyNiA9IDA7CisJLyogMTI4IGJ5dGUgVHggdGhyZXNob2xkOyAKKwkJVHJhbnNtaXQgb247IFJlY2VpdmUgb247ICovCisJdXBkYXRlX2NzcjYoZGV2LCAweDAwMDIyMDAyIHwgdXBkYXRlX2xpbmsoZGV2KSB8IF9fc2V0X3J4X21vZGUoZGV2KSk7CisKKwkvKiBDbGVhciBhbmQgRW5hYmxlIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJaW93cml0ZTMyKDB4MUEwRjUsIGlvYWRkciArIEludHJTdGF0dXMpOworCWlvd3JpdGUzMigweDFBMEY1LCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKworCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBSeFN0YXJ0RGVtYW5kKTsKK30KKworc3RhdGljIHZvaWQgdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2VfYWRkcjsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlOC44eCwiCisJCSAgICIgcmVzZXR0aW5nLi4uXG4iLCBkZXYtPm5hbWUsIGlvcmVhZDMyKGlvYWRkciArIEludHJTdGF0dXMpKTsKKworCXsKKwkJaW50IGk7CisJCXByaW50ayhLRVJOX0RFQlVHICIgIFJ4IHJpbmcgJXA6ICIsIG5wLT5yeF9yaW5nKTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQorCQkJcHJpbnRrKCIgJTguOHgiLCAodW5zaWduZWQgaW50KW5wLT5yeF9yaW5nW2ldLnN0YXR1cyk7CisJCXByaW50aygiXG4iS0VSTl9ERUJVRyIgIFR4IHJpbmcgJXA6ICIsIG5wLT50eF9yaW5nKTsKKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCQkJcHJpbnRrKCIgJTguOHgiLCBucC0+dHhfcmluZ1tpXS5zdGF0dXMpOworCQlwcmludGsoIlxuIik7CisJfQorCXByaW50ayhLRVJOX0RFQlVHICJUeCBjdXIgJWQgVHggZGlydHkgJWQgVHggRnVsbCAlZCwgcSBieXRlcyAlZC5cbiIsCisJCQkJbnAtPmN1cl90eCwgbnAtPmRpcnR5X3R4LCBucC0+dHhfZnVsbCwgbnAtPnR4X3FfYnl0ZXMpOworCXByaW50ayhLRVJOX0RFQlVHICJUeCBEZXNjcmlwdG9yIGFkZHIgJXhoLlxuIixpb3JlYWQzMihpb2FkZHIrMHg0QykpOworCisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwkvKgorCSAqIFVuZGVyIGhpZ2ggbG9hZCBkaXJ0eV90eCBhbmQgdGhlIGludGVybmFsIHR4IGRlc2NyaXB0b3IgcG9pbnRlcgorCSAqIGNvbWUgb3V0IG9mIHN5bmMsIHRodXMgcGVyZm9ybSBhIHNvZnR3YXJlIHJlc2V0IGFuZCByZWluaXRpYWxpemUKKwkgKiBldmVyeXRoaW5nLgorCSAqLworCisJaW93cml0ZTMyKDEsIG5wLT5iYXNlX2FkZHIrUENJQnVzQ2ZnKTsKKwl1ZGVsYXkoMSk7CisKKwlmcmVlX3J4dHhfcmluZ3MobnApOworCWluaXRfcnh0eF9yaW5ncyhkZXYpOworCWluaXRfcmVnaXN0ZXJzKGRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJZW5hYmxlX2lycShkZXYtPmlycSk7CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbnAtPnN0YXRzLnR4X2Vycm9ycysrOworCXJldHVybjsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgUnggYW5kIFR4IHJpbmdzLCBhbG9uZyB3aXRoIHZhcmlvdXMgJ2RldicgYml0cy4gKi8KK3N0YXRpYyBpbnQgYWxsb2NfcmluZ2Rlc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW5wLT5yeF9idWZfc3ogPSAoZGV2LT5tdHUgPD0gMTUwMCA/IFBLVF9CVUZfU1ogOiBkZXYtPm10dSArIDMyKTsKKworCW5wLT5yeF9yaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQobnAtPnBjaV9kZXYsCisJCQlzaXplb2Yoc3RydWN0IHc4NDBfcnhfZGVzYykqUlhfUklOR19TSVpFICsKKwkJCXNpemVvZihzdHJ1Y3Qgdzg0MF90eF9kZXNjKSpUWF9SSU5HX1NJWkUsCisJCQkmbnAtPnJpbmdfZG1hX2FkZHIpOworCWlmKCFucC0+cnhfcmluZykKKwkJcmV0dXJuIC1FTk9NRU07CisJaW5pdF9yeHR4X3JpbmdzKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcmluZ2Rlc2Moc3RydWN0IG5ldGRldl9wcml2YXRlICpucCkKK3sKKwlwY2lfZnJlZV9jb25zaXN0ZW50KG5wLT5wY2lfZGV2LAorCQkJc2l6ZW9mKHN0cnVjdCB3ODQwX3J4X2Rlc2MpKlJYX1JJTkdfU0laRSArCisJCQlzaXplb2Yoc3RydWN0IHc4NDBfdHhfZGVzYykqVFhfUklOR19TSVpFLAorCQkJbnAtPnJ4X3JpbmcsIG5wLT5yaW5nX2RtYV9hZGRyKTsKKworfQorCitzdGF0aWMgaW50IHN0YXJ0X3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgZW50cnk7CisKKwkvKiBDYXV0aW9uOiB0aGUgd3JpdGUgb3JkZXIgaXMgaW1wb3J0YW50IGhlcmUsIHNldCB0aGUgZmllbGQKKwkgICB3aXRoIHRoZSAib3duZXJzaGlwIiBiaXRzIGxhc3QuICovCisKKwkvKiBDYWxjdWxhdGUgdGhlIG5leHQgVHggZGVzY3JpcHRvciBlbnRyeS4gKi8KKwllbnRyeSA9IG5wLT5jdXJfdHggJSBUWF9SSU5HX1NJWkU7CisKKwlucC0+dHhfYWRkcltlbnRyeV0gPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2RldiwKKwkJCQlza2ItPmRhdGEsc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCW5wLT50eF9za2J1ZmZbZW50cnldID0gc2tiOworCisJbnAtPnR4X3JpbmdbZW50cnldLmJ1ZmZlcjEgPSBucC0+dHhfYWRkcltlbnRyeV07CisJaWYgKHNrYi0+bGVuIDwgVFhfQlVGTElNSVQpIHsKKwkJbnAtPnR4X3JpbmdbZW50cnldLmxlbmd0aCA9IERlc2NXaG9sZVBrdCB8IHNrYi0+bGVuOworCX0gZWxzZSB7CisJCWludCBsZW4gPSBza2ItPmxlbiAtIFRYX0JVRkxJTUlUOworCisJCW5wLT50eF9yaW5nW2VudHJ5XS5idWZmZXIyID0gbnAtPnR4X2FkZHJbZW50cnldK1RYX0JVRkxJTUlUOworCQlucC0+dHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0gRGVzY1dob2xlUGt0IHwgKGxlbiA8PCAxMSkgfCBUWF9CVUZMSU1JVDsKKwl9CisJaWYoZW50cnkgPT0gVFhfUklOR19TSVpFLTEpCisJCW5wLT50eF9yaW5nW2VudHJ5XS5sZW5ndGggfD0gRGVzY0VuZFJpbmc7CisKKwkvKiBOb3cgYWNxdWlyZSB0aGUgaXJxIHNwaW5sb2NrLgorCSAqIFRoZSBkaWZmaWN1bHQgcmFjZSBpcyB0aGUgdGhlIG9yZGVyaW5nIGJldHdlZW4KKwkgKiBpbmNyZWFzaW5nIG5wLT5jdXJfdHggYW5kIHNldHRpbmcgRGVzY093bjoKKwkgKiAtIGlmIG5wLT5jdXJfdHggaXMgaW5jcmVhc2VkIGZpcnN0IHRoZSBpbnRlcnJ1cHQKKwkgKiAgIGhhbmRsZXIgY291bGQgY29uc2lkZXIgdGhlIHBhY2tldCBhcyB0cmFuc21pdHRlZAorCSAqICAgc2luY2UgRGVzY093biBpcyBjbGVhcmVkLgorCSAqIC0gSWYgRGVzY093biBpcyBzZXQgZmlyc3QgdGhlIE5JQyBjb3VsZCByZXBvcnQgdGhlCisJICogICBwYWNrZXQgYXMgc2VudCwgYnV0IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3b3VsZCBpZ25vcmUgaXQKKwkgKiAgIHNpbmNlIHRoZSBucC0+Y3VyX3R4IHdhcyBub3QgeWV0IGluY3JlYXNlZC4KKwkgKi8KKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJbnAtPmN1cl90eCsrOworCisJd21iKCk7IC8qIGZsdXNoIGxlbmd0aCwgYnVmZmVyMSwgYnVmZmVyMiAqLworCW5wLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMgPSBEZXNjT3duOworCXdtYigpOyAvKiBmbHVzaCBzdGF0dXMgYW5kIGtpY2sgdGhlIGhhcmR3YXJlICovCisJaW93cml0ZTMyKDAsIG5wLT5iYXNlX2FkZHIgKyBUeFN0YXJ0RGVtYW5kKTsKKwlucC0+dHhfcV9ieXRlcyArPSBza2ItPmxlbjsKKwkvKiBXb3JrIGFyb3VuZCBob3JyaWJsZSBidWcgaW4gdGhlIGNoaXAgYnkgbWFya2luZyB0aGUgcXVldWUgYXMgZnVsbAorCSAgIHdoZW4gd2UgZG8gbm90IGhhdmUgRklGTyByb29tIGZvciBhIG1heGltdW0gc2l6ZWQgcGFja2V0LiAqLworCWlmIChucC0+Y3VyX3R4IC0gbnAtPmRpcnR5X3R4ID4gVFhfUVVFVUVfTEVOIHx8CisJCSgobnAtPmRydl9mbGFncyAmIEhhc0Jyb2tlblR4KSAmJiBucC0+dHhfcV9ieXRlcyA+IFRYX0JVR19GSUZPX0xJTUlUKSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXdtYigpOworCQlucC0+dHhfZnVsbCA9IDE7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlpZiAoZGVidWcgPiA0KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHJhbnNtaXQgZnJhbWUgIyVkIHF1ZXVlZCBpbiBzbG90ICVkLlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgbnAtPmN1cl90eCwgZW50cnkpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X3R4X2RvbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlmb3IgKDsgbnAtPmN1cl90eCAtIG5wLT5kaXJ0eV90eCA+IDA7IG5wLT5kaXJ0eV90eCsrKSB7CisJCWludCBlbnRyeSA9IG5wLT5kaXJ0eV90eCAlIFRYX1JJTkdfU0laRTsKKwkJaW50IHR4X3N0YXR1cyA9IG5wLT50eF9yaW5nW2VudHJ5XS5zdGF0dXM7CisKKwkJaWYgKHR4X3N0YXR1cyA8IDApCisJCQlicmVhazsKKwkJaWYgKHR4X3N0YXR1cyAmIDB4ODAwMCkgeyAJLyogVGhlcmUgd2FzIGFuIGVycm9yLCBsb2cgaXQuICovCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkJCWlmIChkZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdCBlcnJvciwgVHggc3RhdHVzICU4Ljh4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCB0eF9zdGF0dXMpOworI2VuZGlmCisJCQlucC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQlpZiAodHhfc3RhdHVzICYgMHgwMTA0KSBucC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWlmICh0eF9zdGF0dXMgJiAweDBDODApIG5wLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJaWYgKHR4X3N0YXR1cyAmIDB4MDIwMCkgbnAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJCWlmICh0eF9zdGF0dXMgJiAweDAwMDIpIG5wLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJaWYgKCh0eF9zdGF0dXMgJiAweDAwODApICYmIG5wLT5taWlfaWYuZnVsbF9kdXBsZXggPT0gMCkKKwkJCQlucC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycysrOworCQl9IGVsc2UgeworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCQlpZiAoZGVidWcgPiAzKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHJhbnNtaXQgc2xvdCAlZCBvaywgVHggc3RhdHVzICU4Ljh4LlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBlbnRyeSwgdHhfc3RhdHVzKTsKKyNlbmRpZgorCQkJbnAtPnN0YXRzLnR4X2J5dGVzICs9IG5wLT50eF9za2J1ZmZbZW50cnldLT5sZW47CisJCQlucC0+c3RhdHMuY29sbGlzaW9ucyArPSAodHhfc3RhdHVzID4+IDMpICYgMTU7CisJCQlucC0+c3RhdHMudHhfcGFja2V0cysrOworCQl9CisJCS8qIEZyZWUgdGhlIG9yaWdpbmFsIHNrYi4gKi8KKwkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldixucC0+dHhfYWRkcltlbnRyeV0sCisJCQkJCW5wLT50eF9za2J1ZmZbZW50cnldLT5sZW4sCisJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQlucC0+dHhfcV9ieXRlcyAtPSBucC0+dHhfc2tidWZmW2VudHJ5XS0+bGVuOworCQlkZXZfa2ZyZWVfc2tiX2lycShucC0+dHhfc2tidWZmW2VudHJ5XSk7CisJCW5wLT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwl9CisJaWYgKG5wLT50eF9mdWxsICYmCisJCW5wLT5jdXJfdHggLSBucC0+ZGlydHlfdHggPCBUWF9RVUVVRV9MRU5fUkVTVEFSVCAmJgorCQlucC0+dHhfcV9ieXRlcyA8IFRYX0JVR19GSUZPX0xJTUlUKSB7CisJCS8qIFRoZSByaW5nIGlzIG5vIGxvbmdlciBmdWxsLCBjbGVhciB0YnVzeS4gKi8KKwkJbnAtPnR4X2Z1bGwgPSAwOworCQl3bWIoKTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCX0KK30KKworLyogVGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXMgYWxsIG9mIHRoZSBSeCB0aHJlYWQgd29yayBhbmQgY2xlYW5zIHVwCisgICBhZnRlciB0aGUgVHggdGhyZWFkLiAqLworc3RhdGljIGlycXJldHVybl90IGludHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlX2FkZHI7CisJaW50IHdvcmtfbGltaXQgPSBtYXhfaW50ZXJydXB0X3dvcms7CisJaW50IGhhbmRsZWQgPSAwOworCisJaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCQlyZXR1cm4gSVJRX05PTkU7CisJZG8geworCQl1MzIgaW50cl9zdGF0dXMgPSBpb3JlYWQzMihpb2FkZHIgKyBJbnRyU3RhdHVzKTsKKworCQkvKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMgQVNBUC4gKi8KKwkJaW93cml0ZTMyKGludHJfc3RhdHVzICYgMHgwMDFmZmZmLCBpb2FkZHIgKyBJbnRyU3RhdHVzKTsKKworCQlpZiAoZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJbnRlcnJ1cHQsIHN0YXR1cyAlNC40eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7CisKKwkJaWYgKChpbnRyX3N0YXR1cyAmIChOb3JtYWxJbnRyfEFibm9ybWFsSW50cikpID09IDApCisJCQlicmVhazsKKworCQloYW5kbGVkID0gMTsKKworCQlpZiAoaW50cl9zdGF0dXMgJiAoSW50clJ4RG9uZSB8IFJ4Tm9CdWYpKQorCQkJbmV0ZGV2X3J4KGRldik7CisJCWlmIChpbnRyX3N0YXR1cyAmIFJ4Tm9CdWYpCisJCQlpb3dyaXRlMzIoMCwgaW9hZGRyICsgUnhTdGFydERlbWFuZCk7CisKKwkJaWYgKGludHJfc3RhdHVzICYgKFR4SWRsZSB8IEludHJUeERvbmUpICYmCisJCQlucC0+Y3VyX3R4ICE9IG5wLT5kaXJ0eV90eCkgeworCQkJc3Bpbl9sb2NrKCZucC0+bG9jayk7CisJCQluZXRkZXZfdHhfZG9uZShkZXYpOworCQkJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKKwkJfQorCisJCS8qIEFibm9ybWFsIGVycm9yIHN1bW1hcnkvdW5jb21tb24gZXZlbnRzIGhhbmRsZXJzLiAqLworCQlpZiAoaW50cl9zdGF0dXMgJiAoQWJub3JtYWxJbnRyIHwgVHhGSUZPVW5kZXJmbG93IHwgSW50clBDSUVyciB8CisJCQkJCQkgICBUaW1lckludCB8IEludHJUeFN0b3BwZWQpKQorCQkJbmV0ZGV2X2Vycm9yKGRldiwgaW50cl9zdGF0dXMpOworCisJCWlmICgtLXdvcmtfbGltaXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVG9vIG11Y2ggd29yayBhdCBpbnRlcnJ1cHQsICIKKwkJCQkgICAic3RhdHVzPTB4JTQuNHguXG4iLCBkZXYtPm5hbWUsIGludHJfc3RhdHVzKTsKKwkJCS8qIFNldCB0aGUgdGltZXIgdG8gcmUtZW5hYmxlIHRoZSBvdGhlciBpbnRlcnJ1cHRzIGFmdGVyCisJCQkgICAxMCo4MnVzZWMgdGlja3MuICovCisJCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwkJCWlmIChuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKSB7CisJCQkJaW93cml0ZTMyKEFibm9ybWFsSW50ciB8IFRpbWVySW50LCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKwkJCQlpb3dyaXRlMzIoMTAsIGlvYWRkciArIEdQVGltZXIpOworCQkJfQorCQkJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwlpZiAoZGVidWcgPiAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4aXRpbmcgaW50ZXJydXB0LCBzdGF0dXM9JSM0LjR4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW9yZWFkMzIoaW9hZGRyICsgSW50clN0YXR1cykpOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKiBUaGlzIHJvdXRpbmUgaXMgbG9naWNhbGx5IHBhcnQgb2YgdGhlIGludGVycnVwdCBoYW5kbGVyLCBidXQgc2VwYXJhdGVkCisgICBmb3IgY2xhcml0eSBhbmQgYmV0dGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24uICovCitzdGF0aWMgaW50IG5ldGRldl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlbnRyeSA9IG5wLT5jdXJfcnggJSBSWF9SSU5HX1NJWkU7CisJaW50IHdvcmtfbGltaXQgPSBucC0+ZGlydHlfcnggKyBSWF9SSU5HX1NJWkUgLSBucC0+Y3VyX3J4OworCisJaWYgKGRlYnVnID4gNCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiIEluIG5ldGRldl9yeCgpLCBlbnRyeSAlZCBzdGF0dXMgJTQuNHguXG4iLAorCQkJICAgZW50cnksIG5wLT5yeF9yaW5nW2VudHJ5XS5zdGF0dXMpOworCX0KKworCS8qIElmIEVPUCBpcyBzZXQgb24gdGhlIG5leHQgZW50cnksIGl0J3MgYSBuZXcgcGFja2V0LiBTZW5kIGl0IHVwLiAqLworCXdoaWxlICgtLXdvcmtfbGltaXQgPj0gMCkgeworCQlzdHJ1Y3Qgdzg0MF9yeF9kZXNjICpkZXNjID0gbnAtPnJ4X2hlYWRfZGVzYzsKKwkJczMyIHN0YXR1cyA9IGRlc2MtPnN0YXR1czsKKworCQlpZiAoZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgbmV0ZGV2X3J4KCkgc3RhdHVzIHdhcyAlOC44eC5cbiIsCisJCQkJICAgc3RhdHVzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJaWYgKChzdGF0dXMgJiAweDM4MDA4MzAwKSAhPSAweDAzMDApIHsKKwkJCWlmICgoc3RhdHVzICYgMHgzODAwMDMwMCkgIT0gMHgwMzAwKSB7CisJCQkJLyogSW5nb3JlIGVhcmxpZXIgYnVmZmVycy4gKi8KKwkJCQlpZiAoKHN0YXR1cyAmIDB4ZmZmZikgIT0gMHg3ZmZmKSB7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPdmVyc2l6ZWQgRXRoZXJuZXQgZnJhbWUgc3Bhbm5lZCAiCisJCQkJCQkgICAibXVsdGlwbGUgYnVmZmVycywgZW50cnkgJSN4IHN0YXR1cyAlNC40eCFcbiIsCisJCQkJCQkgICBkZXYtPm5hbWUsIG5wLT5jdXJfcngsIHN0YXR1cyk7CisJCQkJCW5wLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJfQorCQkJfSBlbHNlIGlmIChzdGF0dXMgJiAweDgwMDApIHsKKwkJCQkvKiBUaGVyZSB3YXMgYSBmYXRhbCBlcnJvci4gKi8KKwkJCQlpZiAoZGVidWcgPiAyKQorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlY2VpdmUgZXJyb3IsIFJ4IHN0YXR1cyAlOC44eC5cbiIsCisJCQkJCQkgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOyAvKiBlbmQgb2YgYSBwYWNrZXQuKi8KKwkJCQlpZiAoc3RhdHVzICYgMHgwODkwKSBucC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCWlmIChzdGF0dXMgJiAweDAwNEMpIG5wLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgMHgwMDAyKSBucC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJfQorCQl9IGVsc2UgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCS8qIE9taXQgdGhlIGZvdXIgb2N0ZXQgQ1JDIGZyb20gdGhlIGxlbmd0aC4gKi8KKwkJCWludCBwa3RfbGVuID0gKChzdGF0dXMgPj4gMTYpICYgMHg3ZmYpIC0gNDsKKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCQlpZiAoZGVidWcgPiA0KQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIgIG5ldGRldl9yeCgpIG5vcm1hbCBSeCBwa3QgbGVuZ3RoICVkIgorCQkJCQkgICAiIHN0YXR1cyAleC5cbiIsIHBrdF9sZW4sIHN0YXR1cyk7CisjZW5kaWYKKwkJCS8qIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgbG9uZyBlbm91Z2ggdG8gYWNjZXB0IHdpdGhvdXQgY29weWluZworCQkJICAgdG8gYSBtaW5pbWFsbHktc2l6ZWQgc2tidWZmLiAqLworCQkJaWYgKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsKKwkJCQkmJiAoc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMikpICE9IE5VTEwpIHsKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KKwkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobnAtPnBjaV9kZXYsbnAtPnJ4X2FkZHJbZW50cnldLAorCQkJCQkJCSAgICBucC0+cnhfc2tidWZmW2VudHJ5XS0+bGVuLAorCQkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBucC0+cnhfc2tidWZmW2VudHJ5XS0+dGFpbCwgcGt0X2xlbiwgMCk7CisJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShucC0+cGNpX2RldixucC0+cnhfYWRkcltlbnRyeV0sCisJCQkJCQkJICAgICAgIG5wLT5yeF9za2J1ZmZbZW50cnldLT5sZW4sCisJCQkJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQl9IGVsc2UgeworCQkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsbnAtPnJ4X2FkZHJbZW50cnldLAorCQkJCQkJCW5wLT5yeF9za2J1ZmZbZW50cnldLT5sZW4sCisJCQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlza2JfcHV0KHNrYiA9IG5wLT5yeF9za2J1ZmZbZW50cnldLCBwa3RfbGVuKTsKKwkJCQlucC0+cnhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCQl9CisjaWZuZGVmIGZpbmFsX3ZlcnNpb24JCQkJLyogUmVtb3ZlIGFmdGVyIHRlc3RpbmcuICovCisJCQkvKiBZb3Ugd2lsbCB3YW50IHRoaXMgaW5mbyBmb3IgdGhlIGluaXRpYWwgZGVidWcuICovCisJCQlpZiAoZGVidWcgPiA1KQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIgIFJ4IGRhdGEgJTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMng6IgorCQkJCQkgICAiJTIuMnggJTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMnggJTIuMnglMi4yeCAiCisJCQkJCSAgICIlZC4lZC4lZC4lZC5cbiIsCisJCQkJCSAgIHNrYi0+ZGF0YVswXSwgc2tiLT5kYXRhWzFdLCBza2ItPmRhdGFbMl0sIHNrYi0+ZGF0YVszXSwKKwkJCQkJICAgc2tiLT5kYXRhWzRdLCBza2ItPmRhdGFbNV0sIHNrYi0+ZGF0YVs2XSwgc2tiLT5kYXRhWzddLAorCQkJCQkgICBza2ItPmRhdGFbOF0sIHNrYi0+ZGF0YVs5XSwgc2tiLT5kYXRhWzEwXSwKKwkJCQkJICAgc2tiLT5kYXRhWzExXSwgc2tiLT5kYXRhWzEyXSwgc2tiLT5kYXRhWzEzXSwKKwkJCQkJICAgc2tiLT5kYXRhWzE0XSwgc2tiLT5kYXRhWzE1XSwgc2tiLT5kYXRhWzE2XSwKKwkJCQkJICAgc2tiLT5kYXRhWzE3XSk7CisjZW5kaWYKKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCW5wLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlucC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJfQorCQllbnRyeSA9ICgrK25wLT5jdXJfcngpICUgUlhfUklOR19TSVpFOworCQlucC0+cnhfaGVhZF9kZXNjID0gJm5wLT5yeF9yaW5nW2VudHJ5XTsKKwl9CisKKwkvKiBSZWZpbGwgdGhlIFJ4IHJpbmcgYnVmZmVycy4gKi8KKwlmb3IgKDsgbnAtPmN1cl9yeCAtIG5wLT5kaXJ0eV9yeCA+IDA7IG5wLT5kaXJ0eV9yeCsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWVudHJ5ID0gbnAtPmRpcnR5X3J4ICUgUlhfUklOR19TSVpFOworCQlpZiAobnAtPnJ4X3NrYnVmZltlbnRyeV0gPT0gTlVMTCkgeworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihucC0+cnhfYnVmX3N6KTsKKwkJCW5wLT5yeF9za2J1ZmZbZW50cnldID0gc2tiOworCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJCWJyZWFrOwkJCS8qIEJldHRlciBsdWNrIG5leHQgcm91bmQuICovCisJCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCQlucC0+cnhfYWRkcltlbnRyeV0gPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2RldiwKKwkJCQkJCQlza2ItPnRhaWwsCisJCQkJCQkJc2tiLT5sZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlucC0+cnhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IG5wLT5yeF9hZGRyW2VudHJ5XTsKKwkJfQorCQl3bWIoKTsKKwkJbnAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyA9IERlc2NPd247CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW50cl9zdGF0dXMpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBucC0+YmFzZV9hZGRyOworCisJaWYgKGRlYnVnID4gMikKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBBYm5vcm1hbCBldmVudCwgJTguOHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7CisJaWYgKGludHJfc3RhdHVzID09IDB4ZmZmZmZmZmYpCisJCXJldHVybjsKKwlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwlpZiAoaW50cl9zdGF0dXMgJiBUeEZJRk9VbmRlcmZsb3cpIHsKKwkJaW50IG5ldzsKKwkJLyogQnVtcCB1cCB0aGUgVHggdGhyZXNob2xkICovCisjaWYgMAorCQkvKiBUaGlzIGNhdXNlcyBsb3RzIG9mIGRyb3BwZWQgcGFja2V0cywKKwkJICogYW5kIHVuZGVyIGhpZ2ggbG9hZCBldmVuIHR4X3RpbWVvdXRzCisJCSAqLworCQluZXcgPSBucC0+Y3NyNiArIDB4NDAwMDsKKyNlbHNlCisJCW5ldyA9IChucC0+Y3NyNiA+PiAxNCkmMHg3ZjsKKwkJaWYgKG5ldyA8IDY0KQorCQkJbmV3ICo9IDI7CisJCSBlbHNlCisJCSAJbmV3ID0gMTI3OyAvKiBsb2FkIGZ1bGwgcGFja2V0IGJlZm9yZSBzdGFydGluZyAqLworCQluZXcgPSAobnAtPmNzcjYgJiB+KDB4N0YgPDwgMTQpKSB8IChuZXc8PDE0KTsKKyNlbmRpZgorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFR4IHVuZGVyZmxvdywgbmV3IGNzcjYgJTguOHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBuZXcpOworCQl1cGRhdGVfY3NyNihkZXYsIG5ldyk7CisJfQorCWlmIChpbnRyX3N0YXR1cyAmIEludHJSeERpZWQpIHsJCS8qIE1pc3NlZCBhIFJ4IGZyYW1lLiAqLworCQlucC0+c3RhdHMucnhfZXJyb3JzKys7CisJfQorCWlmIChpbnRyX3N0YXR1cyAmIFRpbWVySW50KSB7CisJCS8qIFJlLWVuYWJsZSBvdGhlciBpbnRlcnJ1cHRzLiAqLworCQlpZiAobmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKwkJCWlvd3JpdGUzMigweDFBMEY1LCBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKwl9CisJbnAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gaW9yZWFkMzIoaW9hZGRyICsgUnhNaXNzZWQpICYgMHhmZmZmOworCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBSeFN0YXJ0RGVtYW5kKTsKKwlzcGluX3VubG9jaygmbnAtPmxvY2spOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2VfYWRkcjsKKworCS8qIFRoZSBjaGlwIG9ubHkgbmVlZCByZXBvcnQgZnJhbWUgc2lsZW50bHkgZHJvcHBlZC4gKi8KKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSAmJiBuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCQlucC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBpb3JlYWQzMihpb2FkZHIgKyBSeE1pc3NlZCkgJiAweGZmZmY7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwlyZXR1cm4gJm5wLT5zdGF0czsKK30KKworCitzdGF0aWMgdTMyIF9fc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlX2FkZHI7CisJdTMyIG1jX2ZpbHRlclsyXTsJCQkvKiBNdWx0aWNhc3QgaGFzaCBmaWx0ZXIgKi8KKwl1MzIgcnhfbW9kZTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsJCQkvKiBTZXQgcHJvbWlzY3VvdXMuICovCisJCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICovCisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CisJCW1lbXNldChtY19maWx0ZXIsIDB4ZmYsIHNpemVvZihtY19maWx0ZXIpKTsKKwkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdEFsbFBoeXMKKwkJCXwgQWNjZXB0TXlQaHlzOworCX0gZWxzZSBpZiAoKGRldi0+bWNfY291bnQgPiBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0KQorCQkJICAgfHwgIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQkvKiBUb28gbWFueSB0byBtYXRjaCwgb3IgYWNjZXB0IGFsbCBtdWx0aWNhc3RzLiAqLworCQltZW1zZXQobWNfZmlsdGVyLCAweGZmLCBzaXplb2YobWNfZmlsdGVyKSk7CisJCXJ4X21vZGUgPSBBY2NlcHRCcm9hZGNhc3QgfCBBY2NlcHRNdWx0aWNhc3QgfCBBY2NlcHRNeVBoeXM7CisJfSBlbHNlIHsKKwkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJCWludCBpOworCQltZW1zZXQobWNfZmlsdGVyLCAwLCBzaXplb2YobWNfZmlsdGVyKSk7CisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCQkJIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQlpbnQgZmlsdGVyYml0ID0gKGV0aGVyX2NyYyhFVEhfQUxFTiwgbWNsaXN0LT5kbWlfYWRkcikgPj4gMjYpIF4gMHgzRjsKKwkJCWZpbHRlcmJpdCAmPSAweDNmOworCQkJbWNfZmlsdGVyW2ZpbHRlcmJpdCA+PiA1XSB8PSAxIDw8IChmaWx0ZXJiaXQgJiAzMSk7CisJCX0KKwkJcnhfbW9kZSA9IEFjY2VwdEJyb2FkY2FzdCB8IEFjY2VwdE11bHRpY2FzdCB8IEFjY2VwdE15UGh5czsKKwl9CisJaW93cml0ZTMyKG1jX2ZpbHRlclswXSwgaW9hZGRyICsgTXVsdGljYXN0RmlsdGVyMCk7CisJaW93cml0ZTMyKG1jX2ZpbHRlclsxXSwgaW9hZGRyICsgTXVsdGljYXN0RmlsdGVyMSk7CisJcmV0dXJuIHJ4X21vZGU7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIHJ4X21vZGUgPSBfX3NldF9yeF9tb2RlKGRldik7CisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCXVwZGF0ZV9jc3I2KGRldiwgKG5wLT5jc3I2ICYgfjB4MDBGOCkgfCByeF9tb2RlKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X2dldF9kcnZpbmZvIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RyY3B5IChpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkgKGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzdHJjcHkgKGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworfQorCitzdGF0aWMgaW50IG5ldGRldl9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCXJjID0gbWlpX2V0aHRvb2xfZ3NldCgmbnAtPm1paV9pZiwgY21kKTsKKwlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBuZXRkZXZfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByYzsKKworCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKKwlyYyA9IG1paV9ldGh0b29sX3NzZXQoJm5wLT5taWlfaWYsIGNtZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbmV0ZGV2X253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gbWlpX253YXlfcmVzdGFydCgmbnAtPm1paV9pZik7Cit9CisKK3N0YXRpYyB1MzIgbmV0ZGV2X2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIG1paV9saW5rX29rKCZucC0+bWlpX2lmKTsKK30KKworc3RhdGljIHUzMiBuZXRkZXZfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRlYnVnOworfQorCitzdGF0aWMgdm9pZCBuZXRkZXZfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSkKK3sKKwlkZWJ1ZyA9IHZhbHVlOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorCS5nZXRfc2V0dGluZ3MJCT0gbmV0ZGV2X2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCQk9IG5ldGRldl9zZXRfc2V0dGluZ3MsCisJLm53YXlfcmVzZXQJCT0gbmV0ZGV2X253YXlfcmVzZXQsCisJLmdldF9saW5rCQk9IG5ldGRldl9nZXRfbGluaywKKwkuZ2V0X21zZ2xldmVsCQk9IG5ldGRldl9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAkJPSBuZXRkZXZfc2V0X21zZ2xldmVsLAorCS5nZXRfc2cJCQk9IGV0aHRvb2xfb3BfZ2V0X3NnLAorCS5nZXRfdHhfY3N1bQkJPSBldGh0b29sX29wX2dldF90eF9jc3VtLAorfTsKKworc3RhdGljIGludCBuZXRkZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkocnEpOworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3dpdGNoKGNtZCkgeworCWNhc2UgU0lPQ0dNSUlQSFk6CQkvKiBHZXQgYWRkcmVzcyBvZiBNSUkgUEhZIGluIHVzZS4gKi8KKwkJZGF0YS0+cGh5X2lkID0gKChzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKiluZXRkZXZfcHJpdihkZXYpKS0+cGh5c1swXSAmIDB4MWY7CisJCS8qIEZhbGwgVGhyb3VnaCAqLworCisJY2FzZSBTSU9DR01JSVJFRzoJCS8qIFJlYWQgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwkJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCQlkYXRhLT52YWxfb3V0ID0gbWRpb19yZWFkKGRldiwgZGF0YS0+cGh5X2lkICYgMHgxZiwgZGF0YS0+cmVnX251bSAmIDB4MWYpOworCQlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNJT0NTTUlJUkVHOgkJLyogV3JpdGUgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOworCQltZGlvX3dyaXRlKGRldiwgZGF0YS0+cGh5X2lkICYgMHgxZiwgZGF0YS0+cmVnX251bSAmIDB4MWYsIGRhdGEtPnZhbF9pbik7CisJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCitzdGF0aWMgaW50IG5ldGRldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbnAtPmJhc2VfYWRkcjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmIChkZWJ1ZyA+IDEpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZCwgc3RhdHVzIHdhcyAlOC44eCAiCisJCQkgICAiQ29uZmlnICU4Ljh4LlxuIiwgZGV2LT5uYW1lLCBpb3JlYWQzMihpb2FkZHIgKyBJbnRyU3RhdHVzKSwKKwkJCSAgIGlvcmVhZDMyKGlvYWRkciArIE5ldHdvcmtDb25maWcpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBRdWV1ZSBwb2ludGVycyB3ZXJlIFR4ICVkIC8gJWQsICBSeCAlZCAvICVkLlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgbnAtPmN1cl90eCwgbnAtPmRpcnR5X3R4LCBucC0+Y3VyX3J4LCBucC0+ZGlydHlfcngpOworCX0KKworIAkvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCXVwZGF0ZV9jc3I2KGRldiwgMCk7CisJaW93cml0ZTMyKDB4MDAwMCwgaW9hZGRyICsgSW50ckVuYWJsZSk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwl3bWIoKTsKKwluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisKKwlpZiAoaW9yZWFkMzIoaW9hZGRyICsgTmV0d29ya0NvbmZpZykgIT0gMHhmZmZmZmZmZikKKwkJbnAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gaW9yZWFkMzIoaW9hZGRyICsgUnhNaXNzZWQpICYgMHhmZmZmOworCisjaWZkZWYgX19pMzg2X18KKwlpZiAoZGVidWcgPiAyKSB7CisJCWludCBpOworCisJCXByaW50ayhLRVJOX0RFQlVHIiAgVHggcmluZyBhdCAlOC44eDpcbiIsCisJCQkgICAoaW50KW5wLT50eF9yaW5nKTsKKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAjJWQgZGVzYy4gJTQuNHggJTQuNHggJTguOHguXG4iLAorCQkJCSAgIGksIG5wLT50eF9yaW5nW2ldLmxlbmd0aCwKKwkJCQkgICBucC0+dHhfcmluZ1tpXS5zdGF0dXMsIG5wLT50eF9yaW5nW2ldLmJ1ZmZlcjEpOworCQlwcmludGsoIlxuIktFUk5fREVCVUcgIiAgUnggcmluZyAlOC44eDpcbiIsCisJCQkgICAoaW50KW5wLT5yeF9yaW5nKTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiICMlZCBkZXNjLiAlNC40eCAlNC40eCAlOC44eFxuIiwKKwkJCQkgICBpLCBucC0+cnhfcmluZ1tpXS5sZW5ndGgsCisJCQkJICAgbnAtPnJ4X3JpbmdbaV0uc3RhdHVzLCBucC0+cnhfcmluZ1tpXS5idWZmZXIxKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBfX2kzODZfXyBkZWJ1Z2dpbmcgb25seSAqLworCisJZGVsX3RpbWVyX3N5bmMoJm5wLT50aW1lcik7CisKKwlmcmVlX3J4dHhfcmluZ3MobnApOworCWZyZWVfcmluZ2Rlc2MobnApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB3ODQwX3JlbW92ZTEgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJCisJaWYgKGRldikgeworCQlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJcGNpX2lvdW5tYXAocGRldiwgbnAtPmJhc2VfYWRkcik7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKKy8qCisgKiBzdXNwZW5kL3Jlc3VtZSBzeW5jaHJvbml6YXRpb246CisgKiAtIG9wZW4sIGNsb3NlLCBkb19pb2N0bDoKKyAqIAlydG5sX2xvY2ssICYgbmV0aWZfZGV2aWNlX2RldGFjaCBhZnRlciB0aGUgcnRubF91bmxvY2suCisgKiAtIGdldF9zdGF0czoKKyAqIAlzcGluX2xvY2tfaXJxKG5wLT5sb2NrKSwgZG9lc24ndCB0b3VjaCBodyBpZiBub3QgcHJlc2VudAorICogLSBoYXJkX3N0YXJ0X3htaXQ6CisgKiAJbmV0aWZfc3RvcF9xdWV1ZSArIHNwaW5fdW5sb2NrX3dhaXQoJmRldi0+eG1pdF9sb2NrKTsKKyAqIC0gdHhfdGltZW91dDoKKyAqIAluZXRpZl9kZXZpY2VfZGV0YWNoICsgc3Bpbl91bmxvY2tfd2FpdCgmZGV2LT54bWl0X2xvY2spOworICogLSBzZXRfbXVsdGljYXN0X2xpc3QKKyAqIAluZXRpZl9kZXZpY2VfZGV0YWNoICsgc3Bpbl91bmxvY2tfd2FpdCgmZGV2LT54bWl0X2xvY2spOworICogLSBpbnRlcnJ1cHQgaGFuZGxlcgorICogCWRvZXNuJ3QgdG91Y2ggaHcgaWYgbm90IHByZXNlbnQsIHN5bmNocm9uaXplX2lycSB3YWl0cyBmb3IKKyAqIAlydW5uaW5nIGluc3RhbmNlcyBvZiB0aGUgaW50ZXJydXB0IGhhbmRsZXIuCisgKgorICogRGlzYWJsaW5nIGh3IHJlcXVpcmVzIGNsZWFyaW5nIGNzcjYgJiBJbnRyRW5hYmxlLgorICogdXBkYXRlX2NzcjYgJiBhbGwgZnVuY3Rpb24gdGhhdCB3cml0ZSBJbnRyRW5hYmxlIGNoZWNrIG5ldGlmX2RldmljZV9wcmVzZW50CisgKiBiZWZvcmUgc2V0dGluZ3MgYW55IGJpdHMuCisgKgorICogRGV0YWNoIG11c3Qgb2NjdXIgdW5kZXIgc3Bpbl91bmxvY2tfaXJxKCksIGludGVycnVwdHMgZnJvbSBhIGRldGFjaGVkCisgKiBkZXZpY2Ugd291bGQgY2F1c2UgYW4gaXJxIHN0b3JtLgorICovCitzdGF0aWMgaW50IHc4NDBfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlX2FkZHI7CisKKwlydG5sX2xvY2soKTsKKwlpZiAobmV0aWZfcnVubmluZyAoZGV2KSkgeworCQlkZWxfdGltZXJfc3luYygmbnAtPnRpbWVyKTsKKworCQlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwkJdXBkYXRlX2NzcjYoZGV2LCAwKTsKKwkJaW93cml0ZTMyKDAsIGlvYWRkciArIEludHJFbmFibGUpOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOworCisJCXNwaW5fdW5sb2NrX3dhaXQoJmRldi0+eG1pdF9sb2NrKTsKKwkJc3luY2hyb25pemVfaXJxKGRldi0+aXJxKTsKKwkKKwkJbnAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gaW9yZWFkMzIoaW9hZGRyICsgUnhNaXNzZWQpICYgMHhmZmZmOworCisJCS8qIG5vIG1vcmUgaGFyZHdhcmUgYWNjZXNzZXMgYmVoaW5kIHRoaXMgbGluZS4gKi8KKworCQlpZiAobnAtPmNzcjYpIEJVRygpOworCQlpZiAoaW9yZWFkMzIoaW9hZGRyICsgSW50ckVuYWJsZSkpIEJVRygpOworCisJCS8qIHBjaV9wb3dlcl9vZmYocGRldiwgLTEpOyAqLworCisJCWZyZWVfcnh0eF9yaW5ncyhucCk7CisJfSBlbHNlIHsKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCX0KKwlydG5sX3VubG9jaygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHc4NDBfcmVzdW1lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKwlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJ0bmxfbG9jaygpOworCWlmIChuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCQlnb3RvIG91dDsgLyogZGV2aWNlIG5vdCBzdXNwZW5kZWQgKi8KKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCS8qCXBjaV9wb3dlcl9vbihwZGV2KTsgKi8KKworCQlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJCWlvd3JpdGUzMigxLCBucC0+YmFzZV9hZGRyK1BDSUJ1c0NmZyk7CisJCWlvcmVhZDMyKG5wLT5iYXNlX2FkZHIrUENJQnVzQ2ZnKTsKKwkJdWRlbGF5KDEpOworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJCWluaXRfcnh0eF9yaW5ncyhkZXYpOworCQlpbml0X3JlZ2lzdGVycyhkZXYpOworCQlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwkJbW9kX3RpbWVyKCZucC0+dGltZXIsIGppZmZpZXMgKyAxKkhaKTsKKwl9IGVsc2UgeworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJfQorb3V0OgorCXJ0bmxfdW5sb2NrKCk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHc4NDBfZHJpdmVyID0geworCS5uYW1lCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQk9IHc4NDBfcGNpX3RibCwKKwkucHJvYmUJCT0gdzg0MF9wcm9iZTEsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh3ODQwX3JlbW92ZTEpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gdzg0MF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gdzg0MF9yZXN1bWUsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHc4NDBfaW5pdCh2b2lkKQoreworCXByaW50ayh2ZXJzaW9uKTsKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZ3ODQwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB3ODQwX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnc4NDBfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodzg0MF9pbml0KTsKK21vZHVsZV9leGl0KHc4NDBfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC94aXJjb21fY2IuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3hpcmNvbV9jYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2Y2M0ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90dWxpcC94aXJjb21fY2IuYwpAQCAtMCwwICsxLDEyNzcgQEAKKy8qCisgKiB4aXJjb21fY2I6IEEgZHJpdmVyIGZvciB0aGUgKHR1bGlwLWxpa2UpIFhpcmNvbSBDYXJkYnVzIGV0aGVybmV0IGNhcmRzIAorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgKEMpIGJ5IHRoZSByZXNwZWN0aXZlIGF1dGhvcnMsIGFuZCBsaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKiBMaWNlbnNlLgorICoKKyAqIFdyaXR0ZW4gYnkgQXJqYW4gdmFuIGRlIFZlbiBmb3IgUmVkIEhhdCwgSW5jLgorICogQmFzZWQgb24gd29yayBieSBKZWZmIEdhcnppaywgRG91ZyBMZWRmb3JkIGFuZCBEb25hbGQgQmVja2VyIAorICoKKyAqICAJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogICAgICBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqCisgKiAJJElkOiB4aXJjb21fY2IuYyx2IDEuMzMgMjAwMS8wMy8xOSAxNDowMjowNyBhcmphbnYgRXhwICQKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgZW50ZXIoeCkgICBwcmludGsoIkVudGVyOiAlcywgJXMgbGluZSAlaVxuIix4LF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBsZWF2ZSh4KSAgIHByaW50aygiTGVhdmU6ICVzLCAlcyBsaW5lICVpXG4iLHgsX19GSUxFX18sX19MSU5FX18pCisjZWxzZQorI2RlZmluZSBlbnRlcih4KSAgIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBsZWF2ZSh4KSAgIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJYaXJjb20gQ2FyZGJ1cyBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkFyamFuIHZhbiBkZSBWZW4gPGFyamFudkByZWRoYXQuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKKworLyogSU8gcmVnaXN0ZXJzIG9uIHRoZSBjYXJkLCBvZmZzZXRzICovCisjZGVmaW5lIENTUjAJMHgwMAorI2RlZmluZSBDU1IxCTB4MDgKKyNkZWZpbmUgQ1NSMgkweDEwCisjZGVmaW5lIENTUjMJMHgxOAorI2RlZmluZSBDU1I0CTB4MjAKKyNkZWZpbmUgQ1NSNQkweDI4CisjZGVmaW5lIENTUjYJMHgzMAorI2RlZmluZSBDU1I3CTB4MzgKKyNkZWZpbmUgQ1NSOAkweDQwCisjZGVmaW5lIENTUjkJMHg0OAorI2RlZmluZSBDU1IxMAkweDUwCisjZGVmaW5lIENTUjExCTB4NTgKKyNkZWZpbmUgQ1NSMTIJMHg2MAorI2RlZmluZSBDU1IxMwkweDY4CisjZGVmaW5lIENTUjE0CTB4NzAKKyNkZWZpbmUgQ1NSMTUJMHg3OAorI2RlZmluZSBDU1IxNgkweDgwCisKKy8qIFBDSSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUENJX1BPV0VSTUdNVCAJMHg0MAorCisvKiBPZmZzZXRzIG9mIHRoZSBidWZmZXJzIHdpdGhpbiB0aGUgZGVzY3JpcHRvciBwYWdlcywgaW4gYnl0ZXMgKi8KKworI2RlZmluZSBOVU1ERVNDUklQVE9SUyA0CisKK3N0YXRpYyBpbnQgYnVmZmVyb2Zmc2V0c1tOVU1ERVNDUklQVE9SU10gPSB7MTI4LDIwNDgsNDA5Niw2MTQ0fTsKKworCitzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgeworCS8qIFNlbmQgYW5kIHJlY2VpdmUgYnVmZmVycywga2VybmVsLWFkZHJlc3NhYmxlIGFuZCBkbWEgYWRkcmVzc2FibGUgZm9ybXMgKi8KKworCXVuc2lnbmVkIGludCAqcnhfYnVmZmVyOworCXVuc2lnbmVkIGludCAqdHhfYnVmZmVyOworCisJZG1hX2FkZHJfdCByeF9kbWFfaGFuZGxlOworCWRtYV9hZGRyX3QgdHhfZG1hX2hhbmRsZTsKKworCXN0cnVjdCBza19idWZmICp0eF9za2JbNF07CisKKwl1bnNpZ25lZCBsb25nIGlvX3BvcnQ7CisJaW50IG9wZW47CisJCisJLyogdHJhbnNtaXRfdXNlZCBpcyB0aGUgcm90YXRpbmcgY291bnRlciB0aGF0IGluZGljYXRlcyB3aGljaCB0cmFuc21pdAorCSAgIGRlc2NyaXB0b3IgaGFzIHRvIGJlIHVzZWQgbmV4dCAqLworCWludCB0cmFuc21pdF91c2VkOworCisJLyogU3BpbmxvY2sgdG8gc2VyaWFsaXplIHJlZ2lzdGVyIG9wZXJhdGlvbnMuCisJICAgSXQgbXVzdCBiZSBoZWx0IHdoaWxlIG1hbmlwdWxhdGluZyB0aGUgZm9sbG93aW5nIHJlZ2lzdGVyczoKKwkgICBDU1IwLCBDU1I2LCBDU1I3LCBDU1I5LCBDU1IxMCwgQ1NSMTUKKwkgKi8KKwlzcGlubG9ja190IGxvY2s7CisKKworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7Cit9OworCisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBpbnQgeGlyY29tX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpOworc3RhdGljIHZvaWQgeGlyY29tX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgeGlyY29tX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgeGlyY29tX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHhpcmNvbV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCB4aXJjb21fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB4aXJjb21fdXAoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqeGlyY29tX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNpZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgeGlyY29tX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpbnZlc3RpZ2F0ZV9yZWFkX2Rlc2NyaXB0b3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldixzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQsIGludCBkZXNjbnIsIHVuc2lnbmVkIGludCBidWZmZXJvZmZzZXQpOworc3RhdGljIHZvaWQgaW52ZXN0aWdhdGVfd3JpdGVfZGVzY3JpcHRvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQsIGludCBkZXNjbnIsIHVuc2lnbmVkIGludCBidWZmZXJvZmZzZXQpOworc3RhdGljIHZvaWQgcmVhZF9tYWNfYWRkcmVzcyhzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpOworc3RhdGljIHZvaWQgdHJhbnNjZWl2ZXJfdm9vZG9vKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCk7CitzdGF0aWMgdm9pZCBpbml0aWFsaXplX2NhcmQoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKTsKK3N0YXRpYyB2b2lkIHRyaWdnZXJfdHJhbnNtaXQoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKTsKK3N0YXRpYyB2b2lkIHRyaWdnZXJfcmVjZWl2ZShzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpOworc3RhdGljIHZvaWQgc2V0dXBfZGVzY3JpcHRvcnMoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKTsKK3N0YXRpYyB2b2lkIHJlbW92ZV9kZXNjcmlwdG9ycyhzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpOworc3RhdGljIGludCBsaW5rX3N0YXR1c19jaGFuZ2VkKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCk7CitzdGF0aWMgdm9pZCBhY3RpdmF0ZV9yZWNlaXZlcihzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpOworc3RhdGljIHZvaWQgZGVhY3RpdmF0ZV9yZWNlaXZlcihzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpOworc3RhdGljIHZvaWQgYWN0aXZhdGVfdHJhbnNtaXR0ZXIoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKTsKK3N0YXRpYyB2b2lkIGRlYWN0aXZhdGVfdHJhbnNtaXR0ZXIoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKTsKK3N0YXRpYyB2b2lkIGVuYWJsZV90cmFuc21pdF9pbnRlcnJ1cHQoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKTsKK3N0YXRpYyB2b2lkIGVuYWJsZV9yZWNlaXZlX2ludGVycnVwdChzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpOworc3RhdGljIHZvaWQgZW5hYmxlX2xpbmtfaW50ZXJydXB0KHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCk7CitzdGF0aWMgdm9pZCBkaXNhYmxlX2FsbF9pbnRlcnJ1cHRzKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCk7CitzdGF0aWMgaW50IGxpbmtfc3RhdHVzKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCk7CisKKworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgeGlyY29tX3BjaV90YWJsZVtdID0geworCXsweDExNUQsIDB4MDAwMywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAorCXswLH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHhpcmNvbV9wY2lfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgeGlyY29tX29wcyA9IHsKKwkubmFtZQkJPSAieGlyY29tX2NiIiwgCisJLmlkX3RhYmxlCT0geGlyY29tX3BjaV90YWJsZSwgCisJLnByb2JlCQk9IHhpcmNvbV9wcm9iZSwgCisJLnJlbW92ZQkJPSB4aXJjb21fcmVtb3ZlLCAKKwkuc3VzcGVuZCA9TlVMTCwKKwkucmVzdW1lID1OVUxMCit9OworCisKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQgcHJpbnRfYmluYXJ5KHVuc2lnbmVkIGludCBudW1iZXIpCit7CisJaW50IGksaTI7CisJY2hhciBidWZmZXJbNjRdOworCW1lbXNldChidWZmZXIsMCw2NCk7CisJaTI9MDsKKwlmb3IgKGk9MzE7aT49MDtpLS0pIHsKKwkJaWYgKG51bWJlciAmICgxPDxpKSkKKwkJCWJ1ZmZlcltpMisrXT0nMSc7CisJCWVsc2UKKwkJCWJ1ZmZlcltpMisrXT0nMCc7CisJCWlmICgoaSYzKT09MCkgCisJCQlidWZmZXJbaTIrK109JyAnOworCX0KKwlwcmludGsoIiVzXG4iLGJ1ZmZlcik7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgbmV0ZGV2X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnByaXZhdGUgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RyY3B5KGluZm8tPmRyaXZlciwgInhpcmNvbV9jYiIpOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocHJpdmF0ZS0+cGRldikpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gbmV0ZGV2X2dldF9kcnZpbmZvLAorfTsKKworLyogeGlyY29tX3Byb2JlIGlzIHRoZSBjb2RlIHRoYXQgZ2V0cyBjYWxsZWQgb24gZGV2aWNlIGluc2VydGlvbi4KKyAgIGl0IHNldHMgdXAgdGhlIGhhcmR3YXJlIGFuZCByZWdpc3RlcnMgdGhlIGRldmljZSB0byB0aGUgbmV0d29ya2xheWVyLgorICAgCisgICBUT0RPOiBTZW5kIDEgb3IgMiAiZHVtbXkiIHBhY2tldHMgaGVyZSBhcyB0aGUgY2FyZCBzZWVtcyB0byBkaXNjYXJkIHRoZQorICAgICAgICAgZmlyc3QgdHdvIHBhY2tldHMgdGhhdCBnZXQgc2VuZCwgYW5kIHB1bXAgaGF0ZXMgdGhhdC4KKyAgICAgICAgIAorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCB4aXJjb21fcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnByaXZhdGU7CisJdW5zaWduZWQgY2hhciBjaGlwX3JldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHNob3J0IHRtcDE2OworCWVudGVyKCJ4aXJjb21fcHJvYmUiKTsKKwkKKwkvKiBGaXJzdCBkbyB0aGUgUENJIGluaXRpYWxpc2F0aW9uICovCisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCXJldHVybiAtRU5PREVWOworCisJLyogZGlzYWJsZSBhbGwgcG93ZXJtYW5hZ2VtZW50ICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfUE9XRVJNR01ULCAweDAwMDApOworCQorCXBjaV9zZXRfbWFzdGVyKHBkZXYpOyAvKiBXaHkgaXNuJ3QgdGhpcyBkb25lIGJ5IHBjaV9lbmFibGVfZGV2aWNlID8qLworCisJLyogY2xlYXIgUENJIHN0YXR1cywgaWYgYW55ICovIAorCXBjaV9yZWFkX2NvbmZpZ193b3JkIChwZGV2LFBDSV9TVEFUVVMsICZ0bXAxNik7IAorCXBjaV93cml0ZV9jb25maWdfd29yZCAocGRldiwgUENJX1NUQVRVUyx0bXAxNik7CisJCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmY2hpcF9yZXYpOworCQorCWlmICghcmVxdWVzdF9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLCAxMjgsICJ4aXJjb21fY2IiKSkgeworCQlwcmludGsoS0VSTl9FUlIgInhpcmNvbV9wcm9iZTogZmFpbGVkIHRvIGFsbG9jYXRlIGlvLXJlZ2lvblxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIAorCSAgIEJlZm9yZSBjaGFuZ2luZyB0aGUgaGFyZHdhcmUsIGFsbG9jYXRlIHRoZSBtZW1vcnkuCisJICAgVGhpcyB3YXksIHdlIGNhbiBmYWlsIGdyYWNlZnVsbHkgaWYgbm90IGVub3VnaCBtZW1vcnkKKwkgICBpcyBhdmFpbGFibGUuIAorCSAqLworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgeGlyY29tX3ByaXZhdGUpKTsKKwlpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgInhpcmNvbV9wcm9iZTogZmFpbGVkIHRvIGFsbG9jYXRlIGV0aGVyZGV2XG4iKTsKKwkJZ290byBkZXZpY2VfZmFpbDsKKwl9CisJcHJpdmF0ZSA9IG5ldGRldl9wcml2KGRldik7CisJCisJLyogQWxsb2NhdGUgdGhlIHNlbmQvcmVjZWl2ZSBidWZmZXJzICovCisJcHJpdmF0ZS0+cnhfYnVmZmVyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiw4MTkyLCZwcml2YXRlLT5yeF9kbWFfaGFuZGxlKTsKKwlpZiAocHJpdmF0ZS0+cnhfYnVmZmVyID09IE5VTEwpIHsKKyAJCXByaW50ayhLRVJOX0VSUiAieGlyY29tX3Byb2JlOiBubyBtZW1vcnkgZm9yIHJ4IGJ1ZmZlciBcbiIpOworCQlnb3RvIHJ4X2J1Zl9mYWlsOworCX0JCisJcHJpdmF0ZS0+dHhfYnVmZmVyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiw4MTkyLCZwcml2YXRlLT50eF9kbWFfaGFuZGxlKTsKKwlpZiAocHJpdmF0ZS0+dHhfYnVmZmVyID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ4aXJjb21fcHJvYmU6IG5vIG1lbW9yeSBmb3IgdHggYnVmZmVyIFxuIik7CisJCWdvdG8gdHhfYnVmX2ZhaWw7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKworCXByaXZhdGUtPmRldiA9IGRldjsKKwlwcml2YXRlLT5wZGV2ID0gcGRldjsKKwlwcml2YXRlLT5pb19wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCXNwaW5fbG9ja19pbml0KCZwcml2YXRlLT5sb2NrKTsKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKwlkZXYtPmJhc2VfYWRkciA9IHByaXZhdGUtPmlvX3BvcnQ7CisJCisJaW5pdGlhbGl6ZV9jYXJkKHByaXZhdGUpOworCXJlYWRfbWFjX2FkZHJlc3MocHJpdmF0ZSk7CisJc2V0dXBfZGVzY3JpcHRvcnMocHJpdmF0ZSk7CisJCisJZGV2LT5vcGVuID0gJnhpcmNvbV9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJnhpcmNvbV9zdGFydF94bWl0OworCWRldi0+c3RvcCA9ICZ4aXJjb21fY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSAmeGlyY29tX2dldF9zdGF0czsKKwlkZXYtPnByaXYgPSBwcml2YXRlOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSAmeGlyY29tX3BvbGxfY29udHJvbGxlcjsKKyNlbmRpZgorCVNFVF9FVEhUT09MX09QUyhkZXYsICZuZXRkZXZfZXRodG9vbF9vcHMpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAieGlyY29tX3Byb2JlOiBuZXRkZXZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZC5cbiIpOworCQlnb3RvIHJlZ19mYWlsOworCX0KKwkJCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFhpcmNvbSBjYXJkYnVzIHJldmlzaW9uICVpIGF0IGlycSAlaSBcbiIsIGRldi0+bmFtZSwgY2hpcF9yZXYsIHBkZXYtPmlycSk7CisJLyogc3RhcnQgdGhlIHRyYW5zbWl0dGVyIHRvIGdldCBhIGhlYXJ0YmVhdCAqLworCS8qIFRPRE86IHNlbmQgMiBkdW1teSBwYWNrZXRzIGhlcmUgKi8KKwl0cmFuc2NlaXZlcl92b29kb28ocHJpdmF0ZSk7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXZhdGUtPmxvY2ssZmxhZ3MpOworCWFjdGl2YXRlX3RyYW5zbWl0dGVyKHByaXZhdGUpOworCWFjdGl2YXRlX3JlY2VpdmVyKHByaXZhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXZhdGUtPmxvY2ssZmxhZ3MpOworCQorCXRyaWdnZXJfcmVjZWl2ZShwcml2YXRlKTsKKwkKKwlsZWF2ZSgieGlyY29tX3Byb2JlIik7CisJcmV0dXJuIDA7CisKK3JlZ19mYWlsOgorCWtmcmVlKHByaXZhdGUtPnR4X2J1ZmZlcik7Cit0eF9idWZfZmFpbDoKKwlrZnJlZShwcml2YXRlLT5yeF9idWZmZXIpOworcnhfYnVmX2ZhaWw6CisJZnJlZV9uZXRkZXYoZGV2KTsKK2RldmljZV9mYWlsOgorCXJldHVybiAtRU5PREVWOworfQorCisKKy8qCisgeGlyY29tX3JlbW92ZSBpcyBjYWxsZWQgb24gbW9kdWxlLXVubG9hZCBvciBvbiBkZXZpY2UtZWplY3QuCisgaXQgdW5yZWdpc3RlcnMgdGhlIGlycSwgaW8tcmVnaW9uIGFuZCBuZXR3b3JrIGRldmljZS4KKyBJbnRlcnJ1cHRzIGFuZCBzdWNoIGFyZSBhbHJlYWR5IHN0b3BwZWQgaW4gdGhlICJpZmNvbmZpZyBldGhYIGRvd24iCisgY29kZS4KKyAqLworc3RhdGljIHZvaWQgX19kZXZleGl0IHhpcmNvbV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZW50ZXIoInhpcmNvbV9yZW1vdmUiKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsODE5MixjYXJkLT5yeF9idWZmZXIsY2FyZC0+cnhfZG1hX2hhbmRsZSk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LDgxOTIsY2FyZC0+dHhfYnVmZmVyLGNhcmQtPnR4X2RtYV9oYW5kbGUpOworCisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIDEyOCk7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlmcmVlX25ldGRldihkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlsZWF2ZSgieGlyY29tX3JlbW92ZSIpOworfSAKKworc3RhdGljIGlycXJldHVybl90IHhpcmNvbV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisJaW50IGk7CisKKwllbnRlcigieGlyY29tX2ludGVycnVwdFxuIik7CisKKwlzcGluX2xvY2soJmNhcmQtPmxvY2spOworCXN0YXR1cyA9IGlubChjYXJkLT5pb19wb3J0K0NTUjUpOworCisjaWZkZWYgREVCVUcJCisJcHJpbnRfYmluYXJ5KHN0YXR1cyk7CisJcHJpbnRrKCJ0eCBzdGF0dXMgMHglMDh4IDB4JTA4eCBcbiIsY2FyZC0+dHhfYnVmZmVyWzBdLGNhcmQtPnR4X2J1ZmZlcls0XSk7CisJcHJpbnRrKCJyeCBzdGF0dXMgMHglMDh4IDB4JTA4eCBcbiIsY2FyZC0+cnhfYnVmZmVyWzBdLGNhcmQtPnJ4X2J1ZmZlcls0XSk7CisjZW5kaWYJCisJLyogSGFuZGxlIHNoYXJlZCBpcnEgYW5kIGhvdHBsdWcgKi8KKwlpZiAoc3RhdHVzID09IDAgfHwgc3RhdHVzID09IDB4ZmZmZmZmZmYpIHsKKwkJc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaWYgKGxpbmtfc3RhdHVzX2NoYW5nZWQoY2FyZCkpIHsKKwkJaW50IG5ld2xpbms7CisJCXByaW50ayhLRVJOX0RFQlVHICJ4aXJjb21fY2I6IExpbmsgc3RhdHVzIGhhcyBjaGFuZ2VkIFxuIik7CisJCW5ld2xpbmsgPSBsaW5rX3N0YXR1cyhjYXJkKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAgInhpcmNvbV9jYjogTGluayBpcyAlaSBtYml0IFxuIixuZXdsaW5rKTsKKwkJaWYgKG5ld2xpbmspCisJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCWVsc2UKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCQorCX0KKworCS8qIENsZWFyIGFsbCByZW1haW5pbmcgaW50ZXJydXB0cyAqLwkKKwlzdGF0dXMgfD0gMHhmZmZmZmZmZjsgLyogRklYTUU6IG1ha2UgdGhpcyBjbGVhciBvbmx5IHRoZQorCQkJCSAgICAgICAgcmVhbCBleGlzdGluZyBiaXRzICovCisJb3V0bChzdGF0dXMsY2FyZC0+aW9fcG9ydCtDU1I1KTsKKwkKKworCWZvciAoaT0wO2k8TlVNREVTQ1JJUFRPUlM7aSsrKSAKKwkJaW52ZXN0aWdhdGVfd3JpdGVfZGVzY3JpcHRvcihkZXYsY2FyZCxpLGJ1ZmZlcm9mZnNldHNbaV0pOworCWZvciAoaT0wO2k8TlVNREVTQ1JJUFRPUlM7aSsrKSAKKwkJaW52ZXN0aWdhdGVfcmVhZF9kZXNjcmlwdG9yKGRldixjYXJkLGksYnVmZmVyb2Zmc2V0c1tpXSk7CisKKwkKKwlzcGluX3VubG9jaygmY2FyZC0+bG9jayk7CisJbGVhdmUoInhpcmNvbV9pbnRlcnJ1cHQiKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgeGlyY29tX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbmV4dGRlc2NyaXB0b3I7CisJaW50IGRlc2M7CisJZW50ZXIoInhpcmNvbV9zdGFydF94bWl0Iik7CisJCisJY2FyZCA9IG5ldGRldl9wcml2KGRldik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssZmxhZ3MpOworCQorCS8qIEZpcnN0IHNlZSBpZiB3ZSBjYW4gZnJlZSBzb21lIGRlc2NyaXB0b3JzICovCisJZm9yIChkZXNjPTA7ZGVzYzxOVU1ERVNDUklQVE9SUztkZXNjKyspIAorCQlpbnZlc3RpZ2F0ZV93cml0ZV9kZXNjcmlwdG9yKGRldixjYXJkLGRlc2MsYnVmZmVyb2Zmc2V0c1tkZXNjXSk7CisJCisJCisJbmV4dGRlc2NyaXB0b3IgPSAoY2FyZC0+dHJhbnNtaXRfdXNlZCArMSkgJSAoTlVNREVTQ1JJUFRPUlMpOworCWRlc2MgPSBjYXJkLT50cmFuc21pdF91c2VkOworCQorCS8qIG9ubHkgc2VuZCB0aGUgcGFja2V0IGlmIHRoZSBkZXNjcmlwdG9yIGlzIGZyZWUgKi8KKwlpZiAoY2FyZC0+dHhfYnVmZmVyWzQqZGVzY109PTApIHsKKwkJCS8qIENvcHkgdGhlIHBhY2tldCBkYXRhOyB6ZXJvIHRoZSBtZW1vcnkgZmlyc3QgYXMgdGhlIGNhcmQKKwkJCSAgIHNvbWV0aW1lcyBzZW5kcyBtb3JlIHRoYW4geW91IGFzayBpdCB0by4gKi8KKwkJCQorCQkJbWVtc2V0KCZjYXJkLT50eF9idWZmZXJbYnVmZmVyb2Zmc2V0c1tkZXNjXS80XSwwLDE1MzYpOworCQkJbWVtY3B5KCYoY2FyZC0+dHhfYnVmZmVyW2J1ZmZlcm9mZnNldHNbZGVzY10vNF0pLHNrYi0+ZGF0YSxza2ItPmxlbik7CisJCisJCisJCQkvKiBGSVhNRTogVGhlIHNwZWNpZmljYXRpb24gdGVsbHMgdXMgdGhhdCB0aGUgbGVuZ3RoIHdlIHNlbmQgSEFTIHRvIGJlIGEgbXVsdGlwbGUgb2YKKwkJCSAgIDQgYnl0ZXMuICovCisJCQkgICAKKwkJCWNhcmQtPnR4X2J1ZmZlcls0KmRlc2MrMV0gPSBza2ItPmxlbjsKKwkJCWlmIChkZXNjID09IE5VTURFU0NSSVBUT1JTLTEpCisJCQkJY2FyZC0+dHhfYnVmZmVyWzQqZGVzYysxXSB8PSAoMTw8MjUpOyAgLyogYml0IDI1OiBsYXN0IGRlc2NyaXB0b3Igb2YgdGhlIHJpbmcgKi8KKworCQkJY2FyZC0+dHhfYnVmZmVyWzQqZGVzYysxXSB8PSAweEYwMDAwMDAwOworCQkJCQkJIC8qIDB4RjAuLi4gbWVhbnMgd2FudCBpbnRlcnJ1cHRzKi8gCisJCQljYXJkLT50eF9za2JbZGVzY10gPSBza2I7CisJCQkKKwkJCXdtYigpOworCQkJLyogVGhpcyBnaXZlcyB0aGUgZGVzY3JpcHRvciB0byB0aGUgY2FyZCAqLworCQkJY2FyZC0+dHhfYnVmZmVyWzQqZGVzY10gPSAweDgwMDAwMDAwOworCQkJdHJpZ2dlcl90cmFuc21pdChjYXJkKTsKKwkJCWlmICgoKGludCljYXJkLT50eF9idWZmZXJbbmV4dGRlc2NyaXB0b3IqNF0pPDApIHsJLyogbmV4dCBkZXNjcmlwdG9yIGlzIG9jY3VwaWVkLi4uICovCisJCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJfQorCQkJY2FyZC0+dHJhbnNtaXRfdXNlZCA9IG5leHRkZXNjcmlwdG9yOworCQkJbGVhdmUoInhpcmNvbS1zdGFydF94bWl0IC0gc2VudCIpOwkKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssZmxhZ3MpOworCQkJcmV0dXJuIDA7CisJfQorCQorCisKKwkvKiBVaCBvaC4uLiBubyBmcmVlIGRlc2NyaXB0b3IuLi4gZHJvcCB0aGUgcGFja2V0ICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssZmxhZ3MpOworCXRyaWdnZXJfdHJhbnNtaXQoY2FyZCk7CisJCisJcmV0dXJuIC1FSU87Cit9CisKKworCisKK3N0YXRpYyBpbnQgeGlyY29tX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnhwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0dmFsOworCWVudGVyKCJ4aXJjb21fb3BlbiIpOworCXByaW50ayhLRVJOX0lORk8gInhpcmNvbSBjYXJkYnVzIGFkYXB0b3IgZm91bmQsIHJlZ2lzdGVyaW5nIGFzICVzLCB1c2luZyBpcnEgJWkgXG4iLGRldi0+bmFtZSxkZXYtPmlycSk7CisJcmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZ4aXJjb21faW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXR2YWwpIHsKKwkJbGVhdmUoInhpcmNvbV9vcGVuIC0gTm8gSVJRIik7CisJCXJldHVybiByZXR2YWw7CisJfQorCQorCXhpcmNvbV91cCh4cCk7CisJeHAtPm9wZW4gPSAxOworCWxlYXZlKCJ4aXJjb21fb3BlbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhpcmNvbV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWVudGVyKCJ4aXJjb21fY2xvc2UiKTsKKwljYXJkID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7IC8qIHdlIGRvbid0IHdhbnQgbmV3IHBhY2tldHMgKi8KKworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLGZsYWdzKTsKKwkKKwlkaXNhYmxlX2FsbF9pbnRlcnJ1cHRzKGNhcmQpOworI2lmIDAJCisJLyogV2UgY2FuIGVuYWJsZSB0aGlzIGFnYWluIG9uY2Ugd2Ugc2VuZCBkdW1teSBwYWNrZXRzIG9uIGlmY29uZmlnIGV0aFggdXAgKi8KKwlkZWFjdGl2YXRlX3JlY2VpdmVyKGNhcmQpOworCWRlYWN0aXZhdGVfdHJhbnNtaXR0ZXIoY2FyZCk7CisjZW5kaWYJCisJcmVtb3ZlX2Rlc2NyaXB0b3JzKGNhcmQpOworCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssZmxhZ3MpOworCQorCWNhcmQtPm9wZW4gPSAwOworCWZyZWVfaXJxKGRldi0+aXJxLGRldik7CisJCisJbGVhdmUoInhpcmNvbV9jbG9zZSIpOworCQorCXJldHVybiAwOworCQorfQorCisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp4aXJjb21fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgICAgIHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCA9IG5ldGRldl9wcml2KGRldik7CisgICAgICAgIHJldHVybiAmY2FyZC0+c3RhdHM7Cit9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIHhpcmNvbV9wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJeGlyY29tX2ludGVycnVwdChkZXYtPmlycSwgZGV2LCBOVUxMKTsKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKK30KKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIGluaXRpYWxpemVfY2FyZChzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWVudGVyKCJpbml0aWFsaXplX2NhcmQiKTsKKworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCS8qIEZpcnN0OiByZXNldCB0aGUgY2FyZCAqLworCXZhbCA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSMCk7CisJdmFsIHw9IDB4MDE7CQkvKiBTb2Z0d2FyZSByZXNldCAqLworCW91dGwodmFsLCBjYXJkLT5pb19wb3J0ICsgQ1NSMCk7CisKKwl1ZGVsYXkoMTAwKTsJCS8qIGdpdmUgdGhlIGNhcmQgc29tZSB0aW1lIHRvIHJlc2V0ICovCisKKwl2YWwgPSBpbmwoY2FyZC0+aW9fcG9ydCArIENTUjApOworCXZhbCAmPSB+MHgwMTsJCS8qIGRpc2FibGUgU29mdHdhcmUgcmVzZXQgKi8KKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjApOworCisKKwl2YWwgPSAwOwkJLyogVmFsdWUgMHgwMCBpcyBhIHNhZmUgYW5kIGNvbnNlcnZhdGl2ZSB2YWx1ZSAKKwkJCQkgICBmb3IgdGhlIFBDSSBjb25maWd1cmF0aW9uIHNldHRpbmdzICovCisJb3V0bCh2YWwsIGNhcmQtPmlvX3BvcnQgKyBDU1IwKTsKKworCisJZGlzYWJsZV9hbGxfaW50ZXJydXB0cyhjYXJkKTsKKwlkZWFjdGl2YXRlX3JlY2VpdmVyKGNhcmQpOworCWRlYWN0aXZhdGVfdHJhbnNtaXR0ZXIoY2FyZCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlsZWF2ZSgiaW5pdGlhbGl6ZV9jYXJkIik7Cit9CisKKy8qCit0cmlnZ2VyX3RyYW5zbWl0IGNhdXNlcyB0aGUgY2FyZCB0byBjaGVjayBmb3IgZnJhbWVzIHRvIGJlIHRyYW5zbWl0dGVkLgorVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgd3JpdGluZyB0byB0aGUgQ1NSMSBwb3J0LiBUaGUgZG9jdW1lbnRhdGlvbgorY2xhaW1zIHRoYXQgdGhlIGFjdCBvZiB3cml0aW5nIGlzIHN1ZmZpY2llbnQgYW5kIHRoYXQgdGhlIHZhbHVlIGlzCitpZ25vcmVkOyBJIGNob3NlIHplcm8uCisqLworc3RhdGljIHZvaWQgdHJpZ2dlcl90cmFuc21pdChzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwllbnRlcigidHJpZ2dlcl90cmFuc21pdCIpOworCisJdmFsID0gMDsKKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjEpOworCisJbGVhdmUoInRyaWdnZXJfdHJhbnNtaXQiKTsKK30KKworLyoKK3RyaWdnZXJfcmVjZWl2ZSBjYXVzZXMgdGhlIGNhcmQgdG8gY2hlY2sgZm9yIGVtcHR5IGZyYW1lcyBpbiB0aGUKK2Rlc2NyaXB0b3IgbGlzdCBpbiB3aGljaCBwYWNrZXRzIGNhbiBiZSByZWNlaXZlZC4KK1RoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IHdyaXRpbmcgdG8gdGhlIENTUjIgcG9ydC4gVGhlIGRvY3VtZW50YXRpb24KK2NsYWltcyB0aGF0IHRoZSBhY3Qgb2Ygd3JpdGluZyBpcyBzdWZmaWNpZW50IGFuZCB0aGF0IHRoZSB2YWx1ZSBpcworaWdub3JlZDsgSSBjaG9zZSB6ZXJvLgorKi8KK3N0YXRpYyB2b2lkIHRyaWdnZXJfcmVjZWl2ZShzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwllbnRlcigidHJpZ2dlcl9yZWNlaXZlIik7CisKKwl2YWwgPSAwOworCW91dGwodmFsLCBjYXJkLT5pb19wb3J0ICsgQ1NSMik7CisKKwlsZWF2ZSgidHJpZ2dlcl9yZWNlaXZlIik7Cit9CisKKy8qCitzZXR1cF9kZXNjcmlwdG9ycyBpbml0aWFsaXplcyB0aGUgc2VuZCBhbmQgcmVjZWl2ZSBidWZmZXJzIHRvIGJlIHZhbGlkCitkZXNjcmlwdG9ycyBhbmQgcHJvZ3JhbXMgdGhlIGFkZHJlc3NlcyBpbnRvIHRoZSBjYXJkLgorKi8KK3N0YXRpYyB2b2lkIHNldHVwX2Rlc2NyaXB0b3JzKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGludCBhZGRyZXNzOworCWludCBpOworCWVudGVyKCJzZXR1cF9kZXNjcmlwdG9ycyIpOworCisKKwlpZiAoY2FyZC0+cnhfYnVmZmVyID09IE5VTEwpCisJCUJVRygpOworCWlmIChjYXJkLT50eF9idWZmZXIgPT0gTlVMTCkKKwkJQlVHKCk7CisKKwkvKiBSZWNlaXZlIGRlc2NyaXB0b3JzICovCisJbWVtc2V0KGNhcmQtPnJ4X2J1ZmZlciwgMCwgMTI4KTsJLyogY2xlYXIgdGhlIGRlc2NyaXB0b3JzICovCisJZm9yIChpPTA7aTxOVU1ERVNDUklQVE9SUztpKysgKSB7CisKKwkJLyogUnggRGVzY3IwOiBJdCdzIGVtcHR5LCBsZXQgdGhlIGNhcmQgb3duIGl0LCBubyBlcnJvcnMgLT4gMHg4MDAwMDAwMCAqLworCQljYXJkLT5yeF9idWZmZXJbaSo0ICsgMF0gPSAweDgwMDAwMDAwOworCQkvKiBSeCBEZXNjcjE6IGJ1ZmZlciAxIGlzIDE1MzYgYnl0ZXMsIGJ1ZmZlciAyIGlzIDAgYnl0ZXMgKi8KKwkJY2FyZC0+cnhfYnVmZmVyW2kqNCArIDFdID0gMTUzNjsKKwkJaWYgKGk9PU5VTURFU0NSSVBUT1JTLTEpCisJCQljYXJkLT5yeF9idWZmZXJbaSo0ICsgMV0gfD0gKDEgPDwgMjUpOyAvKiBiaXQgMjUgaXMgImxhc3QgZGVzY3JpcHRvciIgKi8KKworCQkvKiBSeCBEZXNjcjI6IGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlcgorCQkgICB3ZSBzdG9yZSB0aGUgYnVmZmVyIGF0IHRoZSAybmQgaGFsZiBvZiB0aGUgcGFnZSAqLworCQorCQlhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpIGNhcmQtPnJ4X2RtYV9oYW5kbGU7CisJCWNhcmQtPnJ4X2J1ZmZlcltpKjQgKyAyXSA9IGNwdV90b19sZTMyKGFkZHJlc3MgKyBidWZmZXJvZmZzZXRzW2ldKTsKKwkJLyogUnggRGVzYzM6IGFkZHJlc3Mgb2YgMm5kIGJ1ZmZlciAtPiAwICovCisJCWNhcmQtPnJ4X2J1ZmZlcltpKjQgKyAzXSA9IDA7CisJfQorCQorCXdtYigpOworCS8qIFdyaXRlIHRoZSByZWNlaXZlIGRlc2NyaXB0b3IgcmluZyBhZGRyZXNzIHRvIHRoZSBjYXJkICovCisJYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSBjYXJkLT5yeF9kbWFfaGFuZGxlOworCXZhbCA9IGNwdV90b19sZTMyKGFkZHJlc3MpOyAKKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjMpOwkvKiBSZWNlaXZlIGRlc2NyIGxpc3QgYWRkcmVzcyAqLworCisKKwkvKiB0cmFuc21pdCBkZXNjcmlwdG9ycyAqLworCW1lbXNldChjYXJkLT50eF9idWZmZXIsIDAsIDEyOCk7CS8qIGNsZWFyIHRoZSBkZXNjcmlwdG9ycyAqLworCQorCWZvciAoaT0wO2k8TlVNREVTQ1JJUFRPUlM7aSsrICkgeworCQkvKiBUeCBEZXNjcjA6IEVtcHR5LCB3ZSBvd24gaXQsIG5vIGVycm9ycyAtPiAweDAwMDAwMDAwICovCisJCWNhcmQtPnR4X2J1ZmZlcltpKjQgKyAwXSA9IDB4MDAwMDAwMDA7CisJCS8qIFR4IERlc2NyMTogYnVmZmVyIDEgaXMgMTUzNiBieXRlcywgYnVmZmVyIDIgaXMgMCBieXRlcyAqLworCQljYXJkLT50eF9idWZmZXJbaSo0ICsgMV0gPSAxNTM2OworCQlpZiAoaT09TlVNREVTQ1JJUFRPUlMtMSkKKwkJCWNhcmQtPnR4X2J1ZmZlcltpKjQgKyAxXSB8PSAoMSA8PCAyNSk7IC8qIGJpdCAyNSBpcyAibGFzdCBkZXNjcmlwdG9yIiAqLworCQkKKwkJLyogVHggRGVzY3IyOiBhZGRyZXNzIG9mIHRoZSBidWZmZXIKKwkJICAgd2Ugc3RvcmUgdGhlIGJ1ZmZlciBhdCB0aGUgMm5kIGhhbGYgb2YgdGhlIHBhZ2UgKi8KKwkJYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSBjYXJkLT50eF9kbWFfaGFuZGxlOworCQljYXJkLT50eF9idWZmZXJbaSo0ICsgMl0gPSBjcHVfdG9fbGUzMihhZGRyZXNzICsgYnVmZmVyb2Zmc2V0c1tpXSk7CisJCS8qIFR4IERlc2MzOiBhZGRyZXNzIG9mIDJuZCBidWZmZXIgLT4gMCAqLworCQljYXJkLT50eF9idWZmZXJbaSo0ICsgM10gPSAwOworCX0KKworCXdtYigpOworCS8qIHdpdGUgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZyB0byB0aGUgY2FyZCAqLworCWFkZHJlc3MgPSAodW5zaWduZWQgbG9uZykgY2FyZC0+dHhfZG1hX2hhbmRsZTsKKwl2YWwgPWNwdV90b19sZTMyKGFkZHJlc3MpOworCW91dGwodmFsLCBjYXJkLT5pb19wb3J0ICsgQ1NSNCk7CS8qIHhtaXQgZGVzY3IgbGlzdCBhZGRyZXNzICovCisKKwlsZWF2ZSgic2V0dXBfZGVzY3JpcHRvcnMiKTsKK30KKworLyoKK3JlbW92ZV9kZXNjcmlwdG9ycyBpbmZvcm1zIHRoZSBjYXJkIHRoZSBkZXNjcmlwdG9ycyBhcmUgbm8gbG9uZ2VyCit2YWxpZCBieSBzZXR0aW5nIHRoZSBhZGRyZXNzIGluIHRoZSBjYXJkIHRvIDB4MDAuCisqLworc3RhdGljIHZvaWQgcmVtb3ZlX2Rlc2NyaXB0b3JzKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWVudGVyKCJyZW1vdmVfZGVzY3JpcHRvcnMiKTsKKworCXZhbCA9IDA7CisJb3V0bCh2YWwsIGNhcmQtPmlvX3BvcnQgKyBDU1IzKTsJLyogUmVjZWl2ZSBkZXNjcmlwdG9yIGFkZHJlc3MgKi8KKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjQpOwkvKiBTZW5kIGRlc2NyaXB0b3IgYWRkcmVzcyAqLworCisJbGVhdmUoInJlbW92ZV9kZXNjcmlwdG9ycyIpOworfQorCisvKgorbGlua19zdGF0dXNfY2hhbmdlZCByZXR1cm5zIDEgaWYgdGhlIGNhcmQgaGFzIGluZGljYXRlZCB0aGF0Cit0aGUgbGluayBzdGF0dXMgaGFzIGNoYW5nZWQuIFRoZSBuZXcgbGluayBzdGF0dXMgaGFzIHRvIGJlIHJlYWQgZnJvbSBDU1IxMi4KKworVGhpcyBmdW5jdGlvbiBhbHNvIGNsZWFycyB0aGUgc3RhdHVzLWJpdC4KKyovCitzdGF0aWMgaW50IGxpbmtfc3RhdHVzX2NoYW5nZWQoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJZW50ZXIoImxpbmtfc3RhdHVzX2NoYW5nZWQiKTsKKworCXZhbCA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSNSk7CS8qIFN0YXR1cyByZWdpc3RlciAqLworCisJaWYgKCh2YWwgJiAoMSA8PCAyNykpID09IDApIHsJLyogbm8gY2hhbmdlICovCisJCWxlYXZlKCJsaW5rX3N0YXR1c19jaGFuZ2VkIC0gbm9jaGFuZ2UiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogY2xlYXIgdGhlIGV2ZW50IGJ5IHdyaXRpbmcgYSAxIHRvIHRoZSBiaXQgaW4gdGhlCisJICAgc3RhdHVzIHJlZ2lzdGVyLiAqLworCXZhbCA9ICgxIDw8IDI3KTsKKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjUpOworCisJbGVhdmUoImxpbmtfc3RhdHVzX2NoYW5nZWQgLSBjaGFuZ2VkIik7CisJcmV0dXJuIDE7Cit9CisKKworLyoKK3RyYW5zbWl0X2FjdGl2ZSByZXR1cm5zIDEgaWYgdGhlIHRyYW5zbWl0dGVyIG9uIHRoZSBjYXJkIGlzCitpbiBhIG5vbi1zdG9wcGVkIHN0YXRlLgorKi8KK3N0YXRpYyBpbnQgdHJhbnNtaXRfYWN0aXZlKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWVudGVyKCJ0cmFuc21pdF9hY3RpdmUiKTsKKworCXZhbCA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSNSk7CS8qIFN0YXR1cyByZWdpc3RlciAqLworCisJaWYgKCh2YWwgJiAoNyA8PCAyMCkpID09IDApIHsJLyogdHJhbnNtaXR0ZXIgZGlzYWJsZWQgKi8KKwkJbGVhdmUoInRyYW5zbWl0X2FjdGl2ZSAtIGluYWN0aXZlIik7CisJCXJldHVybiAwOworCX0KKworCWxlYXZlKCJ0cmFuc21pdF9hY3RpdmUgLSBhY3RpdmUiKTsKKwlyZXR1cm4gMTsKK30KKworLyoKK3JlY2VpdmVfYWN0aXZlIHJldHVybnMgMSBpZiB0aGUgcmVjZWl2ZXIgb24gdGhlIGNhcmQgaXMKK2luIGEgbm9uLXN0b3BwZWQgc3RhdGUuCisqLworc3RhdGljIGludCByZWNlaXZlX2FjdGl2ZShzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwllbnRlcigicmVjZWl2ZV9hY3RpdmUiKTsKKworCisJdmFsID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I1KTsJLyogU3RhdHVzIHJlZ2lzdGVyICovCisKKwlpZiAoKHZhbCAmICg3IDw8IDE3KSkgPT0gMCkgewkvKiByZWNlaXZlciBkaXNhYmxlZCAqLworCQlsZWF2ZSgicmVjZWl2ZV9hY3RpdmUgLSBpbmFjdGl2ZSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlsZWF2ZSgicmVjZWl2ZV9hY3RpdmUgLSBhY3RpdmUiKTsKKwlyZXR1cm4gMTsKK30KKworLyoKK2FjdGl2YXRlX3JlY2VpdmVyIGVuYWJsZXMgdGhlIHJlY2VpdmVyIG9uIHRoZSBjYXJkLgorQmVmb3JlIGJlaW5nIGFsbG93ZWQgdG8gYWN0aXZlIHRoZSByZWNlaXZlciwgdGhlIHJlY2VpdmVyCittdXN0IGJlIGNvbXBsZXRlbHkgZGUtYWN0aXZhdGVkLiBUbyBhY2hpZXZlIHRoaXMsCit0aGlzIGNvZGUgYWN0dWFsbHkgZGlzYWJsZXMgdGhlIHJlY2VpdmVyIGZpcnN0OyB0aGVuIGl0IHdhaXRzIGZvciB0aGUgCityZWNlaXZlciB0byBiZWNvbWUgaW5hY3RpdmUsIHRoZW4gaXQgYWN0aXZhdGVzIHRoZSByZWNlaXZlciBhbmQgdGhlbgoraXQgd2FpdHMgZm9yIHRoZSByZWNlaXZlciB0byBiZSBhY3RpdmUuCisKK211c3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZC4KKyovCitzdGF0aWMgdm9pZCBhY3RpdmF0ZV9yZWNlaXZlcihzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgY291bnRlcjsKKwllbnRlcigiYWN0aXZhdGVfcmVjZWl2ZXIiKTsKKworCisJdmFsID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I2KTsJLyogT3BlcmF0aW9uIG1vZGUgKi8KKwkKKwkvKiBJZiB0aGUgImFjdGl2ZSIgYml0IGlzIHNldCBhbmQgdGhlIHJlY2VpdmVyIGlzIGFscmVhZHkKKwkgICBhY3RpdmUsIG5vIG5lZWQgdG8gZG8gdGhlIGV4cGVuc2l2ZSB0aGluZyAqLworCWlmICgodmFsJjIpICYmIChyZWNlaXZlX2FjdGl2ZShjYXJkKSkpCisJCXJldHVybjsKKwkKKwkKKwl2YWwgPSB2YWwgJiB+MjsJCS8qIGRpc2FibGUgdGhlIHJlY2VpdmVyICovCisJb3V0bCh2YWwsIGNhcmQtPmlvX3BvcnQgKyBDU1I2KTsKKworCWNvdW50ZXIgPSAxMDsKKwl3aGlsZSAoY291bnRlciA+IDApIHsKKwkJaWYgKCFyZWNlaXZlX2FjdGl2ZShjYXJkKSkKKwkJCWJyZWFrOworCQkvKiB3YWl0IGEgd2hpbGUgKi8KKwkJdWRlbGF5KDUwKTsKKwkJY291bnRlci0tOworCQlpZiAoY291bnRlciA8PSAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICJ4aXJjb21fY2I6IFJlY2VpdmVyIGZhaWxlZCB0byBkZWFjdGl2YXRlXG4iKTsKKwl9CisKKwkvKiBlbmFibGUgdGhlIHJlY2VpdmVyICovCisJdmFsID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I2KTsJLyogT3BlcmF0aW9uIG1vZGUgKi8KKwl2YWwgPSB2YWwgfCAyOwkJCQkvKiBlbmFibGUgdGhlIHJlY2VpdmVyICovCisJb3V0bCh2YWwsIGNhcmQtPmlvX3BvcnQgKyBDU1I2KTsKKworCS8qIG5vdyB3YWl0IGZvciB0aGUgY2FyZCB0byBhY3RpdmF0ZSBhZ2FpbiAqLworCWNvdW50ZXIgPSAxMDsKKwl3aGlsZSAoY291bnRlciA+IDApIHsKKwkJaWYgKHJlY2VpdmVfYWN0aXZlKGNhcmQpKQorCQkJYnJlYWs7CisJCS8qIHdhaXQgYSB3aGlsZSAqLworCQl1ZGVsYXkoNTApOworCQljb3VudGVyLS07CisJCWlmIChjb3VudGVyIDw9IDApCisJCQlwcmludGsoS0VSTl9FUlIgInhpcmNvbV9jYjogUmVjZWl2ZXIgZmFpbGVkIHRvIHJlLWFjdGl2YXRlXG4iKTsKKwl9CisKKwlsZWF2ZSgiYWN0aXZhdGVfcmVjZWl2ZXIiKTsKK30KKworLyoKK2RlYWN0aXZhdGVfcmVjZWl2ZXIgZGlzYWJsZXMgdGhlIHJlY2VpdmVyIG9uIHRoZSBjYXJkLgorVG8gYWNoaWV2ZSB0aGlzIHRoaXMgY29kZSBkaXNhYmxlcyB0aGUgcmVjZWl2ZXIgZmlyc3Q7IAordGhlbiBpdCB3YWl0cyBmb3IgdGhlIHJlY2VpdmVyIHRvIGJlY29tZSBpbmFjdGl2ZS4KKworbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorKi8KK3N0YXRpYyB2b2lkIGRlYWN0aXZhdGVfcmVjZWl2ZXIoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGNvdW50ZXI7CisJZW50ZXIoImRlYWN0aXZhdGVfcmVjZWl2ZXIiKTsKKworCXZhbCA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSNik7CS8qIE9wZXJhdGlvbiBtb2RlICovCisJdmFsID0gdmFsICYgfjI7CQkJCS8qIGRpc2FibGUgdGhlIHJlY2VpdmVyICovCisJb3V0bCh2YWwsIGNhcmQtPmlvX3BvcnQgKyBDU1I2KTsKKworCWNvdW50ZXIgPSAxMDsKKwl3aGlsZSAoY291bnRlciA+IDApIHsKKwkJaWYgKCFyZWNlaXZlX2FjdGl2ZShjYXJkKSkKKwkJCWJyZWFrOworCQkvKiB3YWl0IGEgd2hpbGUgKi8KKwkJdWRlbGF5KDUwKTsKKwkJY291bnRlci0tOworCQlpZiAoY291bnRlciA8PSAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICJ4aXJjb21fY2I6IFJlY2VpdmVyIGZhaWxlZCB0byBkZWFjdGl2YXRlXG4iKTsKKwl9CisKKworCWxlYXZlKCJkZWFjdGl2YXRlX3JlY2VpdmVyIik7Cit9CisKKworLyoKK2FjdGl2YXRlX3RyYW5zbWl0dGVyIGVuYWJsZXMgdGhlIHRyYW5zbWl0dGVyIG9uIHRoZSBjYXJkLgorQmVmb3JlIGJlaW5nIGFsbG93ZWQgdG8gYWN0aXZlIHRoZSB0cmFuc21pdHRlciwgdGhlIHRyYW5zbWl0dGVyCittdXN0IGJlIGNvbXBsZXRlbHkgZGUtYWN0aXZhdGVkLiBUbyBhY2hpZXZlIHRoaXMsCit0aGlzIGNvZGUgYWN0dWFsbHkgZGlzYWJsZXMgdGhlIHRyYW5zbWl0dGVyIGZpcnN0OyB0aGVuIGl0IHdhaXRzIGZvciB0aGUgCit0cmFuc21pdHRlciB0byBiZWNvbWUgaW5hY3RpdmUsIHRoZW4gaXQgYWN0aXZhdGVzIHRoZSB0cmFuc21pdHRlciBhbmQgdGhlbgoraXQgd2FpdHMgZm9yIHRoZSB0cmFuc21pdHRlciB0byBiZSBhY3RpdmUgYWdhaW4uCisKK211c3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZC4KKyovCitzdGF0aWMgdm9pZCBhY3RpdmF0ZV90cmFuc21pdHRlcihzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgY291bnRlcjsKKwllbnRlcigiYWN0aXZhdGVfdHJhbnNtaXR0ZXIiKTsKKworCisJdmFsID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I2KTsJLyogT3BlcmF0aW9uIG1vZGUgKi8KKworCS8qIElmIHRoZSAiYWN0aXZlIiBiaXQgaXMgc2V0IGFuZCB0aGUgcmVjZWl2ZXIgaXMgYWxyZWFkeQorCSAgIGFjdGl2ZSwgbm8gbmVlZCB0byBkbyB0aGUgZXhwZW5zaXZlIHRoaW5nICovCSAKKwlpZiAoKHZhbCYoMTw8MTMpKSAmJiAodHJhbnNtaXRfYWN0aXZlKGNhcmQpKSkKKwkJcmV0dXJuOworCisJdmFsID0gdmFsICYgfigxIDw8IDEzKTsJLyogZGlzYWJsZSB0aGUgdHJhbnNtaXR0ZXIgKi8KKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjYpOworCisJY291bnRlciA9IDEwOworCXdoaWxlIChjb3VudGVyID4gMCkgeworCQlpZiAoIXRyYW5zbWl0X2FjdGl2ZShjYXJkKSkKKwkJCWJyZWFrOworCQkvKiB3YWl0IGEgd2hpbGUgKi8KKwkJdWRlbGF5KDUwKTsKKwkJY291bnRlci0tOworCQlpZiAoY291bnRlciA8PSAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICJ4aXJjb21fY2I6IFRyYW5zbWl0dGVyIGZhaWxlZCB0byBkZWFjdGl2YXRlXG4iKTsKKwl9CisKKwkvKiBlbmFibGUgdGhlIHRyYW5zbWl0dGVyICovCisJdmFsID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I2KTsJLyogT3BlcmF0aW9uIG1vZGUgKi8KKwl2YWwgPSB2YWwgfCAoMSA8PCAxMyk7CS8qIGVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIgKi8KKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjYpOworCisJLyogbm93IHdhaXQgZm9yIHRoZSBjYXJkIHRvIGFjdGl2YXRlIGFnYWluICovCisJY291bnRlciA9IDEwOworCXdoaWxlIChjb3VudGVyID4gMCkgeworCQlpZiAodHJhbnNtaXRfYWN0aXZlKGNhcmQpKQorCQkJYnJlYWs7CisJCS8qIHdhaXQgYSB3aGlsZSAqLworCQl1ZGVsYXkoNTApOworCQljb3VudGVyLS07CisJCWlmIChjb3VudGVyIDw9IDApCisJCQlwcmludGsoS0VSTl9FUlIgInhpcmNvbV9jYjogVHJhbnNtaXR0ZXIgZmFpbGVkIHRvIHJlLWFjdGl2YXRlXG4iKTsKKwl9CisKKwlsZWF2ZSgiYWN0aXZhdGVfdHJhbnNtaXR0ZXIiKTsKK30KKworLyoKK2RlYWN0aXZhdGVfdHJhbnNtaXR0ZXIgZGlzYWJsZXMgdGhlIHRyYW5zbWl0dGVyIG9uIHRoZSBjYXJkLgorVG8gYWNoaWV2ZSB0aGlzIHRoaXMgY29kZSBkaXNhYmxlcyB0aGUgdHJhbnNtaXR0ZXIgZmlyc3Q7IAordGhlbiBpdCB3YWl0cyBmb3IgdGhlIHRyYW5zbWl0dGVyIHRvIGJlY29tZSBpbmFjdGl2ZS4KKworbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorKi8KK3N0YXRpYyB2b2lkIGRlYWN0aXZhdGVfdHJhbnNtaXR0ZXIoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGNvdW50ZXI7CisJZW50ZXIoImRlYWN0aXZhdGVfdHJhbnNtaXR0ZXIiKTsKKworCXZhbCA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSNik7CS8qIE9wZXJhdGlvbiBtb2RlICovCisJdmFsID0gdmFsICYgfjI7CQkvKiBkaXNhYmxlIHRoZSB0cmFuc21pdHRlciAqLworCW91dGwodmFsLCBjYXJkLT5pb19wb3J0ICsgQ1NSNik7CisKKwljb3VudGVyID0gMjA7CisJd2hpbGUgKGNvdW50ZXIgPiAwKSB7CisJCWlmICghdHJhbnNtaXRfYWN0aXZlKGNhcmQpKQorCQkJYnJlYWs7CisJCS8qIHdhaXQgYSB3aGlsZSAqLworCQl1ZGVsYXkoNTApOworCQljb3VudGVyLS07CisJCWlmIChjb3VudGVyIDw9IDApCisJCQlwcmludGsoS0VSTl9FUlIgInhpcmNvbV9jYjogVHJhbnNtaXR0ZXIgZmFpbGVkIHRvIGRlYWN0aXZhdGVcbiIpOworCX0KKworCisJbGVhdmUoImRlYWN0aXZhdGVfdHJhbnNtaXR0ZXIiKTsKK30KKworCisvKgorZW5hYmxlX3RyYW5zbWl0X2ludGVycnVwdCBlbmFibGVzIHRoZSB0cmFuc21pdCBpbnRlcnJ1cHQKKworbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorKi8KK3N0YXRpYyB2b2lkIGVuYWJsZV90cmFuc21pdF9pbnRlcnJ1cHQoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJZW50ZXIoImVuYWJsZV90cmFuc21pdF9pbnRlcnJ1cHQiKTsKKworCXZhbCA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSNyk7CS8qIEludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKi8KKwl2YWwgfD0gMTsJCQkJLyogZW5hYmxlIHRoZSB0cmFuc21pdCBpbnRlcnJ1cHQgKi8KKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjcpOworCisJbGVhdmUoImVuYWJsZV90cmFuc21pdF9pbnRlcnJ1cHQiKTsKK30KKworCisvKgorZW5hYmxlX3JlY2VpdmVfaW50ZXJydXB0IGVuYWJsZXMgdGhlIHJlY2VpdmUgaW50ZXJydXB0CisKK211c3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZC4KKyovCitzdGF0aWMgdm9pZCBlbmFibGVfcmVjZWl2ZV9pbnRlcnJ1cHQoc3RydWN0IHhpcmNvbV9wcml2YXRlICpjYXJkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJZW50ZXIoImVuYWJsZV9yZWNlaXZlX2ludGVycnVwdCIpOworCisJdmFsID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I3KTsJLyogSW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLworCXZhbCA9IHZhbCB8ICgxIDw8IDYpOwkJCS8qIGVuYWJsZSB0aGUgcmVjZWl2ZSBpbnRlcnJ1cHQgKi8KKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjcpOworCisJbGVhdmUoImVuYWJsZV9yZWNlaXZlX2ludGVycnVwdCIpOworfQorCisvKgorZW5hYmxlX2xpbmtfaW50ZXJydXB0IGVuYWJsZXMgdGhlIGxpbmsgc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQKKworbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorKi8KK3N0YXRpYyB2b2lkIGVuYWJsZV9saW5rX2ludGVycnVwdChzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwllbnRlcigiZW5hYmxlX2xpbmtfaW50ZXJydXB0Iik7CisKKwl2YWwgPSBpbmwoY2FyZC0+aW9fcG9ydCArIENTUjcpOwkvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyICovCisJdmFsID0gdmFsIHwgKDEgPDwgMjcpOwkJCS8qIGVuYWJsZSB0aGUgbGluayBzdGF0dXMgY2hhZ2UgaW50ZXJydXB0ICovCisJb3V0bCh2YWwsIGNhcmQtPmlvX3BvcnQgKyBDU1I3KTsKKworCWxlYXZlKCJlbmFibGVfbGlua19pbnRlcnJ1cHQiKTsKK30KKworCisKKy8qCitkaXNhYmxlX2FsbF9pbnRlcnJ1cHRzIGRpc2FibGVzIGFsbCBpbnRlcnJ1cHRzCisKK211c3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZC4KKyovCitzdGF0aWMgdm9pZCBkaXNhYmxlX2FsbF9pbnRlcnJ1cHRzKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWVudGVyKCJlbmFibGVfYWxsX2ludGVycnVwdHMiKTsKKwkKKwl2YWwgPSAwOwkJCQkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJb3V0bCh2YWwsIGNhcmQtPmlvX3BvcnQgKyBDU1I3KTsKKworCWxlYXZlKCJkaXNhYmxlX2FsbF9pbnRlcnJ1cHRzIik7Cit9CisKKy8qCitlbmFibGVfY29tbW9uX2ludGVycnVwdHMgZW5hYmxlcyBzZXZlcmFsIHdlaXJkIGludGVycnVwdHMKKworbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorKi8KK3N0YXRpYyB2b2lkIGVuYWJsZV9jb21tb25faW50ZXJydXB0cyhzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwllbnRlcigiZW5hYmxlX2xpbmtfaW50ZXJydXB0Iik7CisKKwl2YWwgPSBpbmwoY2FyZC0+aW9fcG9ydCArIENTUjcpOwkvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyICovCisJdmFsIHw9ICgxPDwxNik7IC8qIE5vcm1hbCBJbnRlcnJ1cHQgU3VtbWFyeSAqLworCXZhbCB8PSAoMTw8MTUpOyAvKiBBYm5vcm1hbCBJbnRlcnJ1cHQgU3VtbWFyeSAqLworCXZhbCB8PSAoMTw8MTMpOyAvKiBGYXRhbCBidXMgZXJyb3IgKi8KKwl2YWwgfD0gKDE8PDgpOyAgLyogUmVjZWl2ZSBQcm9jZXNzIFN0b3BwZWQgKi8KKwl2YWwgfD0gKDE8PDcpOyAgLyogUmVjZWl2ZSBCdWZmZXIgVW5hdmFpbGFibGUgKi8KKwl2YWwgfD0gKDE8PDUpOyAgLyogVHJhbnNtaXQgVW5kZXJmbG93ICovCisJdmFsIHw9ICgxPDwyKTsgIC8qIFRyYW5zbWl0IEJ1ZmZlciBVbmF2YWlsYWJsZSAqLworCXZhbCB8PSAoMTw8MSk7ICAvKiBUcmFuc21pdCBQcm9jZXNzIFN0b3BwZWQgKi8KKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjcpOworCisJbGVhdmUoImVuYWJsZV9saW5rX2ludGVycnVwdCIpOworfQorCisvKgorZW5hYmxlX3Byb21pc2Mgc3RhcnRzIHByb21pc2MgbW9kZQorCittdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQgYW5kIGludGVycnVwdHMgZGlzYWJsZWQuCisqLworc3RhdGljIGludCBlbmFibGVfcHJvbWlzYyhzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwllbnRlcigiZW5hYmxlX3Byb21pc2MiKTsKKworCXZhbCA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSNik7CQorCXZhbCA9IHZhbCB8ICgxIDw8IDYpOwkKKwlvdXRsKHZhbCwgY2FyZC0+aW9fcG9ydCArIENTUjYpOworCisJbGVhdmUoImVuYWJsZV9wcm9taXNjIik7CisJcmV0dXJuIDE7Cit9CisKKworCisKKy8qIAorbGlua19zdGF0dXMoKSBjaGVja3MgdGhlIHRoZSBsaW5rcyBzdGF0dXMgYW5kIHdpbGwgcmV0dXJuIDAgZm9yIG5vIGxpbmssIDEwIGZvciAxMG1iaXQgbGluayBhbmQgMTAwIGZvci4uIGd1ZXNzIHdoYXQuCisKK011c3QgYmUgY2FsbGVkIGluIGxvY2tlZCBzdGF0ZSB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQKKyovCitzdGF0aWMgaW50IGxpbmtfc3RhdHVzKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWVudGVyKCJsaW5rX3N0YXR1cyIpOworCQorCXZhbCA9IGluYihjYXJkLT5pb19wb3J0ICsgQ1NSMTIpOworCQorCWlmICghKHZhbCYoMTw8MikpKSAgLyogYml0IDIgaXMgMCBmb3IgMTBtYml0IGxpbmssIDEgZm9yIG5vdCBhbiAxMG1iaXQgbGluayAqLworCQlyZXR1cm4gMTA7CisJaWYgKCEodmFsJigxPDwxKSkpICAvKiBiaXQgMSBpcyAwIGZvciAxMDBtYml0IGxpbmssIDEgZm9yIG5vdCBhbiAxMDBtYml0IGxpbmsgKi8KKwkJcmV0dXJuIDEwMDsKKwkJCisJLyogSWYgd2UgZ2V0IGhlcmUgLT4gbm8gbGluayBhdCBhbGwgKi8JCisKKwlsZWF2ZSgibGlua19zdGF0dXMiKTsKKwlyZXR1cm4gMDsKK30KKworCisKKworCisvKgorICByZWFkX21hY19hZGRyZXNzKCkgcmVhZHMgdGhlIE1BQyBhZGRyZXNzIGZyb20gdGhlIE5JQyBhbmQgc3RvcmVzIGl0IGluIHRoZSAiZGV2IiBzdHJ1Y3R1cmUuCisgCisgIFRoaXMgZnVuY3Rpb24gd2lsbCB0YWtlIHRoZSBzcGlubG9jayBpdHNlbGYgYW5kIGNhbiwgYXMgYSByZXN1bHQsIG5vdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWx0LgorICovCitzdGF0aWMgdm9pZCByZWFkX21hY19hZGRyZXNzKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGosIHR1cGxlLCBsaW5rLCBkYXRhX2lkLCBkYXRhX2NvdW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwllbnRlcigicmVhZF9tYWNfYWRkcmVzcyIpOworCQkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJb3V0bCgxIDw8IDEyLCBjYXJkLT5pb19wb3J0ICsgQ1NSOSk7CS8qIGVuYWJsZSBib290IHJvbSBhY2Nlc3MgKi8KKwlmb3IgKGkgPSAweDEwMDsgaSA8IDB4MWY3OyBpICs9IGxpbmsgKyAyKSB7CisJCW91dGwoaSwgY2FyZC0+aW9fcG9ydCArIENTUjEwKTsKKwkJdHVwbGUgPSBpbmwoY2FyZC0+aW9fcG9ydCArIENTUjkpICYgMHhmZjsKKwkJb3V0bChpICsgMSwgY2FyZC0+aW9fcG9ydCArIENTUjEwKTsKKwkJbGluayA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSOSkgJiAweGZmOworCQlvdXRsKGkgKyAyLCBjYXJkLT5pb19wb3J0ICsgQ1NSMTApOworCQlkYXRhX2lkID0gaW5sKGNhcmQtPmlvX3BvcnQgKyBDU1I5KSAmIDB4ZmY7CisJCW91dGwoaSArIDMsIGNhcmQtPmlvX3BvcnQgKyBDU1IxMCk7CisJCWRhdGFfY291bnQgPSBpbmwoY2FyZC0+aW9fcG9ydCArIENTUjkpICYgMHhmZjsKKwkJaWYgKCh0dXBsZSA9PSAweDIyKSAmJiAoZGF0YV9pZCA9PSAweDA0KSAmJiAoZGF0YV9jb3VudCA9PSAweDA2KSkgeworCQkJLyogCisJCQkgKiBUaGlzIGlzIGl0LiAgV2UgaGF2ZSB0aGUgZGF0YSB3ZSB3YW50LgorCQkJICovCisJCQlmb3IgKGogPSAwOyBqIDwgNjsgaisrKSB7CisJCQkJb3V0bChpICsgaiArIDQsIGNhcmQtPmlvX3BvcnQgKyBDU1IxMCk7CisJCQkJY2FyZC0+ZGV2LT5kZXZfYWRkcltqXSA9IGlubChjYXJkLT5pb19wb3J0ICsgQ1NSOSkgJiAweGZmOworCQkJfQorCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAobGluayA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisjaWZkZWYgREVCVUcKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiVjJTIuMlgiLCBpID8gJzonIDogJyAnLCBjYXJkLT5kZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKwlsZWF2ZSgicmVhZF9tYWNfYWRkcmVzcyIpOworfQorCisKKy8qCisgdHJhbnNjZWl2ZXJfdm9vZG9vKCkgZW5hYmxlcyB0aGUgZXh0ZXJuYWwgVVRQIHBsdWcgdGhpbmd5LgorIGl0J3MgY2FsbGVkIHZvb2RvbyBhcyBJIHN0b2xlIHRoaXMgY29kZSBhbmQgY2Fubm90IGNyb3NzLXJlZmVyZW5jZQorIGl0IHdpdGggdGhlIHNwZWNpZmljYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkIHRyYW5zY2VpdmVyX3Zvb2RvbyhzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWVudGVyKCJ0cmFuc2NlaXZlcl92b29kb28iKTsKKworCS8qIGRpc2FibGUgYWxsIHBvd2VybWFuYWdlbWVudCAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoY2FyZC0+cGRldiwgUENJX1BPV0VSTUdNVCwgMHgwMDAwKTsKKworCXNldHVwX2Rlc2NyaXB0b3JzKGNhcmQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCW91dGwoMHgwMDA4LCBjYXJkLT5pb19wb3J0ICsgQ1NSMTUpOworICAgICAgICB1ZGVsYXkoMjUpOyAgCisgICAgICAgIG91dGwoMHhhODA1MDAwMCwgY2FyZC0+aW9fcG9ydCArIENTUjE1KTsKKyAgICAgICAgdWRlbGF5KDI1KTsKKyAgICAgICAgb3V0bCgweGEwMGYwMDAwLCBjYXJkLT5pb19wb3J0ICsgQ1NSMTUpOworICAgICAgICB1ZGVsYXkoMjUpOworICAgICAgICAKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJbmV0aWZfc3RhcnRfcXVldWUoY2FyZC0+ZGV2KTsKKwlsZWF2ZSgidHJhbnNjZWl2ZXJfdm9vZG9vIik7Cit9CisKKworc3RhdGljIHZvaWQgeGlyY29tX3VwKHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJZW50ZXIoInhpcmNvbV91cCIpOworCisJLyogZGlzYWJsZSBhbGwgcG93ZXJtYW5hZ2VtZW50ICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChjYXJkLT5wZGV2LCBQQ0lfUE9XRVJNR01ULCAweDAwMDApOworCisJc2V0dXBfZGVzY3JpcHRvcnMoY2FyZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJCisJZW5hYmxlX2xpbmtfaW50ZXJydXB0KGNhcmQpOworCWVuYWJsZV90cmFuc21pdF9pbnRlcnJ1cHQoY2FyZCk7CisJZW5hYmxlX3JlY2VpdmVfaW50ZXJydXB0KGNhcmQpOworCWVuYWJsZV9jb21tb25faW50ZXJydXB0cyhjYXJkKTsKKwllbmFibGVfcHJvbWlzYyhjYXJkKTsKKwkKKwkvKiBUaGUgY2FyZCBjYW4gaGF2ZSByZWNlaXZlZCBwYWNrZXRzIGFscmVhZHksIHJlYWQgdGhlbSBhd2F5IG5vdyAqLworCWZvciAoaT0wO2k8TlVNREVTQ1JJUFRPUlM7aSsrKSAKKwkJaW52ZXN0aWdhdGVfcmVhZF9kZXNjcmlwdG9yKGNhcmQtPmRldixjYXJkLGksYnVmZmVyb2Zmc2V0c1tpXSk7CisKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwl0cmlnZ2VyX3JlY2VpdmUoY2FyZCk7CisJdHJpZ2dlcl90cmFuc21pdChjYXJkKTsKKwluZXRpZl9zdGFydF9xdWV1ZShjYXJkLT5kZXYpOworCWxlYXZlKCJ4aXJjb21fdXAiKTsKK30KKworLyogQnVmZmVyb2Zmc2V0IGlzIGluIEJZVEVTICovCitzdGF0aWMgdm9pZCBpbnZlc3RpZ2F0ZV9yZWFkX2Rlc2NyaXB0b3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldixzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKmNhcmQsIGludCBkZXNjbnIsIHVuc2lnbmVkIGludCBidWZmZXJvZmZzZXQpCit7CisJCWludCBzdGF0dXM7CQkKKwkJCisJCWVudGVyKCJpbnZlc3RpZ2F0ZV9yZWFkX2Rlc2NyaXB0b3IiKTsKKwkJc3RhdHVzID0gY2FyZC0+cnhfYnVmZmVyWzQqZGVzY25yXTsKKwkJCisJCWlmICgoc3RhdHVzID4gMCkpIHsJLyogcGFja2V0IHJlY2VpdmVkICovCisJCQorCQkJLyogVE9ETzogZGlzY2FyZCBlcnJvciBwYWNrZXRzICovCisJCQkKKwkJCXNob3J0IHBrdF9sZW4gPSAoKHN0YXR1cyA+PiAxNikgJiAweDdmZikgLSA0OwkvKiBtaW51cyA0LCB3ZSBkb24ndCB3YW50IHRoZSBDUkMgKi8KKwkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCWlmIChwa3RfbGVuID4gMTUxOCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAieGlyY29tX2NiOiBQYWNrZXQgbGVuZ3RoICVpIGlzIGJvZ3VzIFxuIixwa3RfbGVuKTsKKwkJCQlwa3RfbGVuID0gMTUxODsKKwkJCX0KKworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgMik7CisJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQljYXJkLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlza2ItPmRldiA9IGRldjsKKwkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgKHVuc2lnbmVkIGNoYXIqKSZjYXJkLT5yeF9idWZmZXJbYnVmZmVyb2Zmc2V0IC8gNF0sIHBrdF9sZW4sIDApOworCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJY2FyZC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJY2FyZC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJCQorCQkgICAgICBvdXQ6CisJCQkvKiBnaXZlIHRoZSBidWZmZXIgYmFjayB0byB0aGUgY2FyZCAqLworCQkJY2FyZC0+cnhfYnVmZmVyWzQqZGVzY25yXSA9ICAweDgwMDAwMDAwOworCQkJdHJpZ2dlcl9yZWNlaXZlKGNhcmQpOworCQl9CisKKwkJbGVhdmUoImludmVzdGlnYXRlX3JlYWRfZGVzY3JpcHRvciIpOworCit9CisKKworLyogQnVmZmVyb2Zmc2V0IGlzIGluIEJZVEVTICovCitzdGF0aWMgdm9pZCBpbnZlc3RpZ2F0ZV93cml0ZV9kZXNjcmlwdG9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqY2FyZCwgaW50IGRlc2NuciwgdW5zaWduZWQgaW50IGJ1ZmZlcm9mZnNldCkKK3sKKwkJaW50IHN0YXR1czsKKworCQllbnRlcigiaW52ZXN0aWdhdGVfd3JpdGVfZGVzY3JpcHRvciIpOworCQkKKwkJc3RhdHVzID0gY2FyZC0+dHhfYnVmZmVyWzQqZGVzY25yXTsKKyNpZiAwCQkKKwkJaWYgKHN0YXR1cyAmIDB4ODAwMCkgewkvKiBNYWpvciBlcnJvciAqLworCQkJcHJpbnRrKEtFUk5fRVJSICJNYWpvciB0cmFuc21pdCBlcnJvciBzdGF0dXMgJXggXG4iLCBzdGF0dXMpOworCQkJY2FyZC0+dHhfYnVmZmVyWzQqZGVzY25yXSA9IDA7CisJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCQl9CisjZW5kaWYKKwkJaWYgKHN0YXR1cyA+IDApIHsJLyogYml0IDMxIGlzIDAgd2hlbiBkb25lICovCisJCQlpZiAoY2FyZC0+dHhfc2tiW2Rlc2Nucl0hPU5VTEwpIHsKKwkJCQljYXJkLT5zdGF0cy50eF9ieXRlcyArPSBjYXJkLT50eF9za2JbZGVzY25yXS0+bGVuOworCQkJCWRldl9rZnJlZV9za2JfaXJxKGNhcmQtPnR4X3NrYltkZXNjbnJdKTsKKwkJCX0KKwkJCWNhcmQtPnR4X3NrYltkZXNjbnJdID0gTlVMTDsKKwkJCS8qIEJpdCA4IGluIHRoZSBzdGF0dXMgZmllbGQgaXMgMSBpZiB0aGVyZSB3YXMgYSBjb2xsaXNpb24gKi8KKwkJCWlmIChzdGF0dXMmKDE8PDgpKQorCQkJCWNhcmQtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJCWNhcmQtPnR4X2J1ZmZlcls0KmRlc2Nucl0gPSAwOyAvKiBkZXNjcmlwdG9yIGlzIGZyZWUgYWdhaW4gKi8KKwkJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJCQljYXJkLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCX0KKworCQlsZWF2ZSgiaW52ZXN0aWdhdGVfd3JpdGVfZGVzY3JpcHRvciIpOworCQkKK30KKworCitzdGF0aWMgaW50IF9faW5pdCB4aXJjb21faW5pdCh2b2lkKQoreworCXBjaV9yZWdpc3Rlcl9kcml2ZXIoJnhpcmNvbV9vcHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgeGlyY29tX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnhpcmNvbV9vcHMpOworfSAKKworbW9kdWxlX2luaXQoeGlyY29tX2luaXQpIAorbW9kdWxlX2V4aXQoeGlyY29tX2V4aXQpCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3hpcmNvbV90dWxpcF9jYi5jIGIvZHJpdmVycy9uZXQvdHVsaXAveGlyY29tX3R1bGlwX2NiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjY2IyNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL3hpcmNvbV90dWxpcF9jYi5jCkBAIC0wLDAgKzEsMTc0OCBAQAorLyogeGlyY29tX3R1bGlwX2NiLmM6IEEgWGlyY29tIENCRS0xMDAgZXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4gKi8KKy8qCisJV3JpdHRlbi9jb3B5cmlnaHQgMTk5NC0xOTk5IGJ5IERvbmFsZCBCZWNrZXIuCisKKwlUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisJb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisJNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKwlBbm5hcG9saXMgTUQgMjE0MDMKKworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlMaW51eCBrZXJuZWwtc3BlY2lmaWMgY2hhbmdlczoKKworCUxLMS4wIChJb24gQmFkdWxlc2N1KQorCS0gTWFqb3IgY2xlYW51cAorCS0gVXNlIDIuNCBQQ0kgQVBJCisJLSBTdXBwb3J0IGV0aHRvb2wKKwktIFJld3JpdGUgcGVyZmVjdCBmaWx0ZXIvaGFzaCBjb2RlCisJLSBVc2UgaW50ZXJydXB0cyBmb3IgbWVkaWEgY2hhbmdlcworCisJTEsxLjEgKElvbiBCYWR1bGVzY3UpCisJLSBEaXNhbGxvdyBuZWdvdGlhdGlvbiBvZiB1bnN1cHBvcnRlZCBmdWxsLWR1cGxleCBtb2RlcworKi8KKworI2RlZmluZSBEUlZfTkFNRQkieGlyY29tX3R1bGlwX2NiIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC45MStMSzEuMSIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIk9jdG9iZXIgMTEsIDIwMDEiCisKKyNkZWZpbmUgQ0FSREJVUyAxCisKKy8qIEEgZmV3IHVzZXItY29uZmlndXJhYmxlIHZhbHVlcy4gKi8KKworI2RlZmluZSB4aXJjb21fZGVidWcgZGVidWcKKyNpZmRlZiBYSVJDT01fREVCVUcKK3N0YXRpYyBpbnQgeGlyY29tX2RlYnVnID0gWElSQ09NX0RFQlVHOworI2Vsc2UKK3N0YXRpYyBpbnQgeGlyY29tX2RlYnVnID0gMTsKKyNlbmRpZgorCisvKiBNYXhpbXVtIGV2ZW50cyAoUnggcGFja2V0cywgZXRjLikgdG8gaGFuZGxlIGF0IGVhY2ggaW50ZXJydXB0LiAqLworc3RhdGljIGludCBtYXhfaW50ZXJydXB0X3dvcmsgPSAyNTsKKworI2RlZmluZSBNQVhfVU5JVFMgNAorLyogVXNlZCB0byBwYXNzIHRoZSBmdWxsLWR1cGxleCBmbGFnLCBldGMuICovCitzdGF0aWMgaW50IGZ1bGxfZHVwbGV4W01BWF9VTklUU107CitzdGF0aWMgaW50IG9wdGlvbnNbTUFYX1VOSVRTXTsKK3N0YXRpYyBpbnQgbXR1W01BWF9VTklUU107CQkJLyogSnVtYm8gTVRVIGZvciBpbnRlcmZhY2VzLiAqLworCisvKiBLZWVwIHRoZSByaW5nIHNpemVzIGEgcG93ZXIgb2YgdHdvIGZvciBlZmZpY2llbmN5LgorICAgTWFraW5nIHRoZSBUeCByaW5nIHRvbyBsYXJnZSBkZWNyZWFzZXMgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgY2hhbm5lbAorICAgYm9uZGluZyBhbmQgcGFja2V0IHByaW9yaXR5LgorICAgVGhlcmUgYXJlIG5vIGlsbCBlZmZlY3RzIGZyb20gdG9vLWxhcmdlIHJlY2VpdmUgcmluZ3MuICovCisjZGVmaW5lIFRYX1JJTkdfU0laRQkxNgorI2RlZmluZSBSWF9SSU5HX1NJWkUJMzIKKworLyogU2V0IHRoZSBjb3B5IGJyZWFrcG9pbnQgZm9yIHRoZSBjb3B5LW9ubHktdGlueS1idWZmZXIgUnggc3RydWN0dXJlLiAqLworI2lmZGVmIF9fYWxwaGFfXworc3RhdGljIGludCByeF9jb3B5YnJlYWsgPSAxNTE4OworI2Vsc2UKK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrID0gMTAwOworI2VuZGlmCisKKy8qCisgIFNldCB0aGUgYnVzIHBlcmZvcm1hbmNlIHJlZ2lzdGVyLgorCVR5cGljYWw6IFNldCAxNiBsb25nd29yZCBjYWNoZSBhbGlnbm1lbnQsIG5vIGJ1cnN0IGxpbWl0LgorCUNhY2hlIGFsaWdubWVudCBiaXRzIDE1OjE0CSAgICAgQnVyc3QgbGVuZ3RoIDEzOjgKKwkJMDAwMAlObyBhbGlnbm1lbnQgIDB4MDAwMDAwMDAgdW5saW1pdGVkCQkwODAwIDggbG9uZ3dvcmRzCisJCTQwMDAJOCAgbG9uZ3dvcmRzCQkwMTAwIDEgbG9uZ3dvcmQJCTEwMDAgMTYgbG9uZ3dvcmRzCisJCTgwMDAJMTYgbG9uZ3dvcmRzCQkwMjAwIDIgbG9uZ3dvcmRzCTIwMDAgMzIgbG9uZ3dvcmRzCisJCUMwMDAJMzIgIGxvbmd3b3JkcwkJMDQwMCA0IGxvbmd3b3JkcworCVdhcm5pbmc6IG1hbnkgb2xkZXIgNDg2IHN5c3RlbXMgYXJlIGJyb2tlbiBhbmQgcmVxdWlyZSBzZXR0aW5nIDB4MDBBMDQ4MDAKKwkgICA4IGxvbmd3b3JkIGNhY2hlIGFsaWdubWVudCwgOCBsb25nd29yZCBidXJzdC4KKwlUb0RvOiBOb24tSW50ZWwgc2V0dGluZyBjb3VsZCBiZSBiZXR0ZXIuCisqLworCisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19pYTY0X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKK3N0YXRpYyBpbnQgY3NyMCA9IDB4MDFBMDAwMDAgfCAweEUwMDA7CisjZWxpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQorc3RhdGljIGludCBjc3IwID0gMHgwMUIwMDAwMCB8IDB4ODAwMDsKKyNlbGlmIGRlZmluZWQoX19zcGFyY19fKQorc3RhdGljIGludCBjc3IwID0gMHgwMUIwMDA4MCB8IDB4ODAwMDsKKyNlbGlmIGRlZmluZWQoX19pMzg2X18pCitzdGF0aWMgaW50IGNzcjAgPSAweDAxQTAwMDAwIHwgMHg4MDAwOworI2Vsc2UKKyN3YXJuaW5nIFByb2Nlc3NvciBhcmNoaXRlY3R1cmUgdW5kZWZpbmVkIQorc3RhdGljIGludCBjc3IwID0gMHgwMEEwMDAwMCB8IDB4NDgwMDsKKyNlbmRpZgorCisvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgdXN1YWxseSBhcmUgbm90IGNoYW5nZWQuICovCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQJCSg0ICogSFopCisjZGVmaW5lIFBLVF9CVUZfU1oJCTE1MzYJCQkvKiBTaXplIG9mIGVhY2ggdGVtcG9yYXJ5IFJ4IGJ1ZmZlci4qLworI2RlZmluZSBQS1RfU0VUVVBfU1oJCTE5MgkJCS8qIFNpemUgb2YgdGhlIHNldHVwIGZyYW1lICovCisKKy8qIFBDSSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUENJX1BPV0VSTUdNVCAJMHg0MAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgkvKiBQcm9jZXNzb3IgdHlwZSBmb3IgY2FjaGUgYWxpZ25tZW50LiAqLworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKworLyogVGhlc2UgaWRlbnRpZnkgdGhlIGRyaXZlciBiYXNlIHZlcnNpb24gYW5kIG1heSBub3QgYmUgcmVtb3ZlZC4gKi8KK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KK0tFUk5fSU5GTyBEUlZfTkFNRSAiLmMgZGVyaXZlZCBmcm9tIHR1bGlwLmM6djAuOTEgNC8xNC85OSBiZWNrZXJAc2N5bGQuY29tXG4iCitLRVJOX0lORk8gIiB1bm9mZmljaWFsIDIuNC54IGtlcm5lbCBwb3J0LCB2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIiwgIiBEUlZfUkVMREFURSAiXG4iOworCitNT0RVTEVfQVVUSE9SKCJEb25hbGQgQmVja2VyIDxiZWNrZXJAc2N5bGQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJYaXJjb20gQ0JFLTEwMCBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyeF9jb3B5YnJlYWssIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY3NyMCwgaW50LCAwKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG9wdGlvbnMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZnVsbF9kdXBsZXgsIGludCwgTlVMTCwgMCk7CisKKyNkZWZpbmUgUlVOX0FUKHgpIChqaWZmaWVzICsgKHgpKQorCisvKgorCQkJCVRoZW9yeSBvZiBPcGVyYXRpb24KKworSS4gQm9hcmQgQ29tcGF0aWJpbGl0eQorCitUaGlzIGRldmljZSBkcml2ZXIgd2FzIGZvcmtlZCBmcm9tIHRoZSBkcml2ZXIgZm9yIHRoZSBERUNjaGlwICJUdWxpcCIsCitEaWdpdGFsJ3Mgc2luZ2xlLWNoaXAgZXRoZXJuZXQgY29udHJvbGxlcnMgZm9yIFBDSS4gIEl0IHN1cHBvcnRzIFhpcmNvbSdzCithbG1vc3QtVHVsaXAtY29tcGF0aWJsZSBDQkUtMTAwIENhcmRCdXMgYWRhcHRlcnMuCisKK0lJLiBCb2FyZC1zcGVjaWZpYyBzZXR0aW5ncworCitQQ0kgYnVzIGRldmljZXMgYXJlIGNvbmZpZ3VyZWQgYnkgdGhlIHN5c3RlbSBhdCBib290IHRpbWUsIHNvIG5vIGp1bXBlcnMKK25lZWQgdG8gYmUgc2V0IG9uIHRoZSBib2FyZC4gIFRoZSBzeXN0ZW0gQklPUyBwcmVmZXJhYmx5IHNob3VsZCBhc3NpZ24gdGhlCitQQ0kgSU5UQSBzaWduYWwgdG8gYW4gb3RoZXJ3aXNlIHVudXNlZCBzeXN0ZW0gSVJRIGxpbmUuCisKK0lJSS4gRHJpdmVyIG9wZXJhdGlvbgorCitJSUlhLiBSaW5nIGJ1ZmZlcnMKKworVGhlIFhpcmNvbSBjYW4gdXNlIGVpdGhlciByaW5nIGJ1ZmZlcnMgb3IgbGlzdHMgb2YgVHggYW5kIFJ4IGRlc2NyaXB0b3JzLgorVGhpcyBkcml2ZXIgdXNlcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCByaW5ncyBvZiBSeCBhbmQgVHggZGVzY3JpcHRvcnMsIHNldCBhdAorY29tcGlsZSB0aW1lIGJ5IFJYL1RYX1JJTkdfU0laRS4gIFRoaXMgdmVyc2lvbiBvZiB0aGUgZHJpdmVyIGFsbG9jYXRlcyBza2J1ZmZzCitmb3IgdGhlIFJ4IHJpbmcgYnVmZmVycyBhdCBvcGVuKCkgdGltZSBhbmQgcGFzc2VzIHRoZSBza2ItPmRhdGEgZmllbGQgdG8gdGhlCitYaXJjb20gYXMgcmVjZWl2ZSBkYXRhIGJ1ZmZlcnMuICBXaGVuIGFuIGluY29taW5nIGZyYW1lIGlzIGxlc3MgdGhhbgorUlhfQ09QWUJSRUFLIGJ5dGVzIGxvbmcsIGEgZnJlc2ggc2tidWZmIGlzIGFsbG9jYXRlZCBhbmQgdGhlIGZyYW1lIGlzCitjb3BpZWQgdG8gdGhlIG5ldyBza2J1ZmYuICBXaGVuIHRoZSBpbmNvbWluZyBmcmFtZSBpcyBsYXJnZXIsIHRoZSBza2J1ZmYgaXMKK3Bhc3NlZCBkaXJlY3RseSB1cCB0aGUgcHJvdG9jb2wgc3RhY2sgYW5kIHJlcGxhY2VkIGJ5IGEgbmV3bHkgYWxsb2NhdGVkCitza2J1ZmYuCisKK1RoZSBSWF9DT1BZQlJFQUsgdmFsdWUgaXMgY2hvc2VuIHRvIHRyYWRlLW9mZiB0aGUgbWVtb3J5IHdhc3RlZCBieQordXNpbmcgYSBmdWxsLXNpemVkIHNrYnVmZiBmb3Igc21hbGwgZnJhbWVzIHZzLiB0aGUgY29weWluZyBjb3N0cyBvZiBsYXJnZXIKK2ZyYW1lcy4gIEZvciBzbWFsbCBmcmFtZXMgdGhlIGNvcHlpbmcgY29zdCBpcyBuZWdsaWdpYmxlIChlc3AuIGNvbnNpZGVyaW5nCit0aGF0IHdlIGFyZSBwcmUtbG9hZGluZyB0aGUgY2FjaGUgd2l0aCBpbW1lZGlhdGVseSB1c2VmdWwgaGVhZGVyCitpbmZvcm1hdGlvbikuICBGb3IgbGFyZ2UgZnJhbWVzIHRoZSBjb3B5aW5nIGNvc3QgaXMgbm9uLXRyaXZpYWwsIGFuZCB0aGUKK2xhcmdlciBjb3B5IG1pZ2h0IGZsdXNoIHRoZSBjYWNoZSBvZiB1c2VmdWwgZGF0YS4gIEEgc3VidGxlIGFzcGVjdCBvZiB0aGlzCitjaG9pY2UgaXMgdGhhdCB0aGUgWGlyY29tIG9ubHkgcmVjZWl2ZXMgaW50byBsb25nd29yZCBhbGlnbmVkIGJ1ZmZlcnMsIHRodXMKK3RoZSBJUCBoZWFkZXIgYXQgb2Zmc2V0IDE0IGlzbid0IGxvbmd3b3JkIGFsaWduZWQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KK0NvcGllZCBmcmFtZXMgYXJlIHB1dCBpbnRvIHRoZSBuZXcgc2tidWZmIGF0IGFuIG9mZnNldCBvZiAiKzIiLCB0aHVzIGNvcHlpbmcKK2hhcyB0aGUgYmVuZWZpY2lhbCBlZmZlY3Qgb2YgYWxpZ25pbmcgdGhlIElQIGhlYWRlciBhbmQgcHJlbG9hZGluZyB0aGUKK2NhY2hlLgorCitJSUlDLiBTeW5jaHJvbml6YXRpb24KK1RoZSBkcml2ZXIgcnVucyBhcyB0d28gaW5kZXBlbmRlbnQsIHNpbmdsZS10aHJlYWRlZCBmbG93cyBvZiBjb250cm9sLiAgT25lCitpcyB0aGUgc2VuZC1wYWNrZXQgcm91dGluZSwgd2hpY2ggZW5mb3JjZXMgc2luZ2xlLXRocmVhZGVkIHVzZSBieSB0aGUKK2Rldi0+dGJ1c3kgZmxhZy4gIFRoZSBvdGhlciB0aHJlYWQgaXMgdGhlIGludGVycnVwdCBoYW5kbGVyLCB3aGljaCBpcyBzaW5nbGUKK3RocmVhZGVkIGJ5IHRoZSBoYXJkd2FyZSBhbmQgb3RoZXIgc29mdHdhcmUuCisKK1RoZSBzZW5kIHBhY2tldCB0aHJlYWQgaGFzIHBhcnRpYWwgY29udHJvbCBvdmVyIHRoZSBUeCByaW5nIGFuZCAnZGV2LT50YnVzeScKK2ZsYWcuICBJdCBzZXRzIHRoZSB0YnVzeSBmbGFnIHdoZW5ldmVyIGl0J3MgcXVldWluZyBhIFR4IHBhY2tldC4gSWYgdGhlIG5leHQKK3F1ZXVlIHNsb3QgaXMgZW1wdHksIGl0IGNsZWFycyB0aGUgdGJ1c3kgZmxhZyB3aGVuIGZpbmlzaGVkIG90aGVyd2lzZSBpdCBzZXRzCit0aGUgJ3RwLT50eF9mdWxsJyBmbGFnLgorCitUaGUgaW50ZXJydXB0IGhhbmRsZXIgaGFzIGV4Y2x1c2l2ZSBjb250cm9sIG92ZXIgdGhlIFJ4IHJpbmcgYW5kIHJlY29yZHMgc3RhdHMKK2Zyb20gdGhlIFR4IHJpbmcuICAoVGhlIFR4LWRvbmUgaW50ZXJydXB0IGNhbid0IGJlIHNlbGVjdGl2ZWx5IHR1cm5lZCBvZmYsIHNvCit3ZSBjYW4ndCBhdm9pZCB0aGUgaW50ZXJydXB0IG92ZXJoZWFkIGJ5IGhhdmluZyB0aGUgVHggcm91dGluZSByZWFwIHRoZSBUeAorc3RhdHMuKQkgQWZ0ZXIgcmVhcGluZyB0aGUgc3RhdHMsIGl0IG1hcmtzIHRoZSBxdWV1ZSBlbnRyeSBhcyBlbXB0eSBieSBzZXR0aW5nCit0aGUgJ2Jhc2UnIHRvIHplcm8uCSBJZmYgdGhlICd0cC0+dHhfZnVsbCcgZmxhZyBpcyBzZXQsIGl0IGNsZWFycyBib3RoIHRoZQordHhfZnVsbCBhbmQgdGJ1c3kgZmxhZ3MuCisKK0lWLiBOb3RlcworCitJVmIuIFJlZmVyZW5jZXMKKworaHR0cDovL2Nlc2Rpcy5nc2ZjLm5hc2EuZ292L2xpbnV4L21pc2MvTldheS5odG1sCitodHRwOi8vd3d3LmRpZ2l0YWwuY29tICAoc2VhcmNoIGZvciBjdXJyZW50IDIxKjQqIGRhdGFzaGVldHMgYW5kICIyMVg0IFNST00iKQoraHR0cDovL3d3dy5uYXRpb25hbC5jb20vcGYvRFAvRFA4Mzg0MEEuaHRtbAorCitJVmMuIEVycmF0YQorCisqLworCisvKiBBIGZ1bGwtZHVwbGV4IG1hcCBmb3IgbWVkaWEgdHlwZXMuICovCitlbnVtIE1lZGlhSXMgeworCU1lZGlhSXNGRCA9IDEsIE1lZGlhQWx3YXlzRkQ9MiwgTWVkaWFJc01JST00LCBNZWRpYUlzRng9OCwKKwlNZWRpYUlzMTAwPTE2fTsKK3N0YXRpYyBjb25zdCBjaGFyIG1lZGlhX2NhcFtdID0KK3swLDAsMCwxNiwgIDMsMTksMTYsMjQsICAyNyw0LDcsNSwgMCwyMCwyMywyMCB9OworCisvKiBPZmZzZXRzIHRvIHRoZSBDb21tYW5kIGFuZCBTdGF0dXMgUmVnaXN0ZXJzLCAiQ1NScyIuICBBbGwgYWNjZXNzZXMKKyAgIG11c3QgYmUgbG9uZ3dvcmQgaW5zdHJ1Y3Rpb25zIGFuZCBxdWFkd29yZCBhbGlnbmVkLiAqLworZW51bSB4aXJjb21fb2Zmc2V0cyB7CisJQ1NSMD0wLCAgICBDU1IxPTB4MDgsIENTUjI9MHgxMCwgQ1NSMz0weDE4LCBDU1I0PTB4MjAsIENTUjU9MHgyOCwKKwlDU1I2PTB4MzAsIENTUjc9MHgzOCwgQ1NSOD0weDQwLCBDU1I5PTB4NDgsIENTUjEwPTB4NTAsIENTUjExPTB4NTgsCisJQ1NSMTI9MHg2MCwgQ1NSMTM9MHg2OCwgQ1NSMTQ9MHg3MCwgQ1NSMTU9MHg3OCwgQ1NSMTY9MHgwNCwgfTsKKworLyogVGhlIGJpdHMgaW4gdGhlIENTUjUgc3RhdHVzIHJlZ2lzdGVycywgbW9zdGx5IGludGVycnVwdCBzb3VyY2VzLiAqLworZW51bSBzdGF0dXNfYml0cyB7CisJTGlua0NoYW5nZT0weDA4MDAwMDAwLAorCU5vcm1hbEludHI9MHgxMDAwMCwgTm9ybWFsSW50ck1hc2s9MHgwMDAxNDA0NSwKKwlBYm5vcm1hbEludHI9MHg4MDAwLCBBYm5vcm1hbEludHJNYXNrPTB4MGEwMGE1YTIsCisJUmVzZXJ2ZWRJbnRyTWFzaz0weGUwMDAxYTE4LAorCUVhcmx5UnhJbnRyPTB4NDAwMCwgQnVzRXJyb3JJbnRyPTB4MjAwMCwKKwlFYXJseVR4SW50cj0weDQwMCwgUnhEaWVkPTB4MTAwLCBSeE5vQnVmPTB4ODAsIFJ4SW50cj0weDQwLAorCVR4RklGT1VuZGVyZmxvdz0weDIwLCBUeE5vQnVmPTB4MDQsIFR4RGllZD0weDAyLCBUeEludHI9MHgwMSwKK307CisKK2VudW0gY3NyMF9jb250cm9sX2JpdHMgeworCUVuYWJsZU1XST0weDAxMDAwMDAwLCBFbmFibGVNUkw9MHgwMDgwMDAwMCwKKwlFbmFibGVNUk09MHgwMDIwMDAwMCwgRXF1YWxCdXNQcmlvPTB4MDIsCisJU29mdHdhcmVSZXNldD0weDAxLAorfTsKKworZW51bSBjc3I2X2NvbnRyb2xfYml0cyB7CisJUmVjZWl2ZUFsbEJpdD0weDQwMDAwMDAwLCBBbGxNdWx0aUJpdD0weDgwLCBQcm9taXNjQml0PTB4NDAsCisJSGFzaEZpbHRlckJpdD0weDAxLCBGdWxsRHVwbGV4Qml0PTB4MDIwMCwKKwlUeFRocmVzaDEwPTB4NDAwMDAwLCBUeFN0b3JlRm9ydz0weDIwMDAwMCwKKwlUeFRocmVzaE1hc2s9MHhjMDAwLCBUeFRocmVzaFNoaWZ0PTE0LAorCUVuYWJsZVR4PTB4MjAwMCwgRW5hYmxlUng9MHgwMiwKKwlSZXNlcnZlZFplcm9NYXNrPTB4OGQ5MzAxMzQsIFJlc2VydmVkT25lTWFzaz0weDMyMGMwMDAwLAorCUVuYWJsZVR4Ung9KEVuYWJsZVR4IHwgRW5hYmxlUngpLAorfTsKKworCitlbnVtIHRibF9mbGFnIHsKKwlIQVNfTUlJPTEsIEhBU19BQ1BJPTIsCit9Oworc3RhdGljIHN0cnVjdCB4aXJjb21fY2hpcF90YWJsZSB7CisJY2hhciAqY2hpcF9uYW1lOworCWludCB2YWxpZF9pbnRyczsJCQkvKiBDU1I3IGludGVycnVwdCBlbmFibGUgc2V0dGluZ3MgKi8KKwlpbnQgZmxhZ3M7Cit9IHhpcmNvbV90YmxbXSA9IHsKKyAgeyAiWGlyY29tIENhcmRidXMgQWRhcHRlciIsCisJTGlua0NoYW5nZSB8IE5vcm1hbEludHIgfCBBYm5vcm1hbEludHIgfCBCdXNFcnJvckludHIgfAorCVJ4RGllZCB8IFJ4Tm9CdWYgfCBSeEludHIgfCBUeEZJRk9VbmRlcmZsb3cgfCBUeE5vQnVmIHwgVHhEaWVkIHwgVHhJbnRyLAorCUhBU19NSUkgfCBIQVNfQUNQSSwgfSwKKyAgeyBOVUxMLCB9LAorfTsKKy8qIFRoaXMgbWF0Y2hlcyB0aGUgdGFibGUgYWJvdmUuICovCitlbnVtIGNoaXBzIHsKKwlYMzIwMV8zLAorfTsKKworCisvKiBUaGUgWGlyY29tIFJ4IGFuZCBUeCBidWZmZXIgZGVzY3JpcHRvcnMuICovCitzdHJ1Y3QgeGlyY29tX3J4X2Rlc2MgeworCXMzMiBzdGF0dXM7CisJczMyIGxlbmd0aDsKKwl1MzIgYnVmZmVyMSwgYnVmZmVyMjsKK307CisKK3N0cnVjdCB4aXJjb21fdHhfZGVzYyB7CisJczMyIHN0YXR1czsKKwlzMzIgbGVuZ3RoOworCXUzMiBidWZmZXIxLCBidWZmZXIyOwkJCQkvKiBXZSB1c2Ugb25seSBidWZmZXIgMS4gICovCit9OworCitlbnVtIHR4X2Rlc2MwX3N0YXR1c19iaXRzIHsKKwlUeDBEZXNjT3duZWQ9MHg4MDAwMDAwMCwgVHgwRGVzY0Vycm9yPTB4ODAwMCwgVHgwTm9DYXJyaWVyPTB4MDgwMCwKKwlUeDBMYXRlQ29sbD0weDAyMDAsIFR4ME1hbnlDb2xsPTB4MDEwMCwgVHgwVW5kZXJmbG93PTB4MDIsCit9OworZW51bSB0eF9kZXNjMV9zdGF0dXNfYml0cyB7CisJVHgxQ29tcGxJbnRyPTB4ODAwMDAwMDAsIFR4MUxhc3RTZWc9MHg0MDAwMDAwMCwgVHgxRmlyc3RTZWc9MHgyMDAwMDAwMCwKKwlUeDFTZXR1cFBrdD0weDA4MDAwMDAwLCBUeDFEaXNhYmxlQ1JDPTB4MDQwMDAwMDAsIFR4MVJpbmdXcmFwPTB4MDIwMDAwMDAsCisJVHgxQ2hhaW5EZXNjPTB4MDEwMDAwMDAsIFR4MU5vUGFkPTB4ODAwMDAwLCBUeDFIYXNoU2V0dXA9MHg0MDAwMDAsCisJVHgxV2hvbGVQa3Q9KFR4MUZpcnN0U2VnIHwgVHgxTGFzdFNlZyksCit9OworZW51bSByeF9kZXNjMF9zdGF0dXNfYml0cyB7CisJUngwRGVzY093bmVkPTB4ODAwMDAwMDAsIFJ4MERlc2NFcnJvcj0weDgwMDAsIFJ4ME5vU3BhY2U9MHg0MDAwLAorCVJ4MFJ1bnQ9MHgwODAwLCBSeDBNY2FzdFBrdD0weDA0MDAsIFJ4MEZpcnN0U2VnPTB4MDIwMCwgUngwTGFzdFNlZz0weDAxMDAsCisJUngwSHVnZUZyYW1lPTB4ODAsIFJ4MENSQ0Vycm9yPTB4MDIsCisJUngwV2hvbGVQa3Q9KFJ4MEZpcnN0U2VnIHwgUngwTGFzdFNlZyksCit9OworZW51bSByeF9kZXNjMV9zdGF0dXNfYml0cyB7CisJUngxUmluZ1dyYXA9MHgwMjAwMDAwMCwgUngxQ2hhaW5EZXNjPTB4MDEwMDAwMDAsCit9OworCitzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgeworCXN0cnVjdCB4aXJjb21fcnhfZGVzYyByeF9yaW5nW1JYX1JJTkdfU0laRV07CisJc3RydWN0IHhpcmNvbV90eF9kZXNjIHR4X3JpbmdbVFhfUklOR19TSVpFXTsKKwkvKiBUaGUgc2F2ZWQgYWRkcmVzcyBvZiBhIHNlbnQtaW4tcGxhY2UgcGFja2V0L2J1ZmZlciwgZm9yIHNrZnJlZSgpLiAqLworCXN0cnVjdCBza19idWZmKiB0eF9za2J1ZmZbVFhfUklOR19TSVpFXTsKKyNpZmRlZiBDQVJEQlVTCisJLyogVGhlIFgzMjAxLTMgcmVxdWlyZXMgNC1ieXRlIGFsaWduZWQgdHggYnVmcyAqLworCXN0cnVjdCBza19idWZmKiB0eF9hbGlnbmVkX3NrYnVmZltUWF9SSU5HX1NJWkVdOworI2VuZGlmCisJLyogVGhlIGFkZHJlc3NlcyBvZiByZWNlaXZlLWluLXBsYWNlIHNrYnVmZnMuICovCisJc3RydWN0IHNrX2J1ZmYqIHJ4X3NrYnVmZltSWF9SSU5HX1NJWkVdOworCXUxNiBzZXR1cF9mcmFtZVtQS1RfU0VUVVBfU1ogLyBzaXplb2YodTE2KV07CS8qIFBzZXVkby1UeCBmcmFtZSB0byBpbml0IGFkZHJlc3MgdGFibGUuICovCisJaW50IGNoaXBfaWQ7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJdW5zaWduZWQgaW50IGN1cl9yeCwgY3VyX3R4OwkJLyogVGhlIG5leHQgZnJlZSByaW5nIGVudHJ5ICovCisJdW5zaWduZWQgaW50IGRpcnR5X3J4LCBkaXJ0eV90eDsJLyogVGhlIHJpbmcgZW50cmllcyB0byBiZSBmcmVlKCllZC4gKi8KKwl1bnNpZ25lZCBpbnQgdHhfZnVsbDoxOwkJCQkvKiBUaGUgVHggcXVldWUgaXMgZnVsbC4gKi8KKwl1bnNpZ25lZCBpbnQgc3BlZWQxMDA6MTsKKwl1bnNpZ25lZCBpbnQgZnVsbF9kdXBsZXg6MTsJCQkvKiBGdWxsLWR1cGxleCBvcGVyYXRpb24gcmVxdWVzdGVkLiAqLworCXVuc2lnbmVkIGludCBhdXRvbmVnOjE7CisJdW5zaWduZWQgaW50IGRlZmF1bHRfcG9ydDo0OwkJLyogTGFzdCBkZXYtPmlmX3BvcnQgdmFsdWUuICovCisJdW5zaWduZWQgaW50IG9wZW46MTsKKwl1bnNpZ25lZCBpbnQgY3NyMDsJCQkJCS8qIENTUjAgc2V0dGluZy4gKi8KKwl1bnNpZ25lZCBpbnQgY3NyNjsJCQkJCS8qIEN1cnJlbnQgQ1NSNiBjb250cm9sIHNldHRpbmdzLiAqLworCXUxNiB0b19hZHZlcnRpc2U7CQkJCQkvKiBOV2F5IGNhcGFiaWxpdGllcyBhZHZlcnRpc2VkLiAgKi8KKwl1MTYgYWR2ZXJ0aXNpbmdbNF07CisJc2lnbmVkIGNoYXIgcGh5c1s0XSwgbWlpX2NudDsJCS8qIE1JSSBkZXZpY2UgYWRkcmVzc2VzLiAqLworCWludCBzYXZlZF9pZl9wb3J0OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXNwaW5sb2NrX3QgbG9jazsKK307CisKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbik7CitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKTsKK3N0YXRpYyB2b2lkIHhpcmNvbV91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHhpcmNvbV9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCB4aXJjb21fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHhpcmNvbV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgeGlyY29tX2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgeGlyY29tX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHhpcmNvbV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHhpcmNvbV9tZWRpYV9jaGFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3QgeGlyY29tX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpbnQgeGlyY29tX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp4aXJjb21fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCB4aXJjb21faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGNoZWNrX2R1cGxleChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgb3BzOworCisKKy8qIFRoZSBYaXJjb20gY2FyZHMgYXJlIHBpY2t5IGFib3V0IHdoZW4gY2VydGFpbiBiaXRzIGluIENTUjYgY2FuIGJlCisgICBtYW5pcHVsYXRlZC4gIEtlaXRoIE93ZW5zIDxrYW9zQG9jcy5jb20uYXU+LiAqLworc3RhdGljIHZvaWQgb3V0bF9DU1I2KHUzMiBuZXdjc3I2LCBsb25nIGlvYWRkcikKK3sKKwljb25zdCBpbnQgc3RyaWN0X2JpdHMgPQorCQlUeFRocmVzaDEwIHwgVHhTdG9yZUZvcncgfCBUeFRocmVzaE1hc2sgfCBFbmFibGVUeFJ4IHwgRnVsbER1cGxleEJpdDsKKyAgICBpbnQgY3NyNSwgY3NyNV8yMl8yMCwgY3NyNV8xOV8xNywgY3VycmNzcjYsIGF0dGVtcHRzID0gMjAwOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgc2F2ZV9mbGFncyhmbGFncyk7CisgICAgY2xpKCk7CisJLyogbWFzayBvdXQgdGhlIHJlc2VydmVkIGJpdHMgdGhhdCBhbHdheXMgcmVhZCAwIG9uIHRoZSBYaXJjb20gY2FyZHMgKi8KKwluZXdjc3I2ICY9IH5SZXNlcnZlZFplcm9NYXNrOworCS8qIG9yIGluIHRoZSByZXNlcnZlZCBiaXRzIHRoYXQgYWx3YXlzIHJlYWQgMSAqLworCW5ld2NzcjYgfD0gUmVzZXJ2ZWRPbmVNYXNrOworICAgIGN1cnJjc3I2ID0gaW5sKGlvYWRkciArIENTUjYpOworICAgIGlmICgoKG5ld2NzcjYgJiBzdHJpY3RfYml0cykgPT0gKGN1cnJjc3I2ICYgc3RyaWN0X2JpdHMpKSB8fAorCSgoY3VycmNzcjYgJiB+RW5hYmxlVHhSeCkgPT0gMCkpIHsKKwkJb3V0bChuZXdjc3I2LCBpb2FkZHIgKyBDU1I2KTsJLyogc2FmZSAqLworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJcmV0dXJuOworICAgIH0KKyAgICAvKiBtYWtlIHN1cmUgdGhlIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlciBhcmUgc3RvcHBlZCBmaXJzdCAqLworICAgIGN1cnJjc3I2ICY9IH5FbmFibGVUeFJ4OworICAgIHdoaWxlICgxKSB7CisJCWNzcjUgPSBpbmwoaW9hZGRyICsgQ1NSNSk7CisJCWlmIChjc3I1ID09IDB4ZmZmZmZmZmYpCisJCQlicmVhazsgIC8qIGNhbm5vdCByZWFkIGNzcjUsIGNhcmQgcmVtb3ZlZD8gKi8KKwkJY3NyNV8yMl8yMCA9IGNzcjUgJiAweDcwMDAwMDsKKwkJY3NyNV8xOV8xNyA9IGNzcjUgJiAweDBlMDAwMDsKKwkJaWYgKChjc3I1XzIyXzIwID09IDAgfHwgY3NyNV8yMl8yMCA9PSAweDYwMDAwMCkgJiYKKwkJCShjc3I1XzE5XzE3ID09IDAgfHwgY3NyNV8xOV8xNyA9PSAweDgwMDAwIHx8IGNzcjVfMTlfMTcgPT0gMHhjMDAwMCkpCisJCQlicmVhazsgIC8qIGJvdGggYXJlIHN0b3BwZWQgb3Igc3VzcGVuZGVkICovCisJCWlmICghLS1hdHRlbXB0cykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRSAiOiBvdXRsX0NTUjYgdG9vIG1hbnkgYXR0ZW1wdHMsIgorCQkJCSAgICJjc3I1PTB4JTA4eFxuIiwgY3NyNSk7CisJCQlvdXRsKG5ld2NzcjYsIGlvYWRkciArIENTUjYpOyAgLyogdW5zYWZlIGJ1dCBkbyBpdCBhbnl3YXkgKi8KKwkJCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisJCW91dGwoY3VycmNzcjYsIGlvYWRkciArIENTUjYpOworCQl1ZGVsYXkoMSk7CisgICAgfQorICAgIC8qIG5vdyBpdCBpcyBzYWZlIHRvIGNoYW5nZSBjc3I2ICovCisgICAgb3V0bChuZXdjc3I2LCBpb2FkZHIgKyBDU1I2KTsKKyAgICByZXN0b3JlX2ZsYWdzKGZsYWdzKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcmVhZF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGksIGo7CisJdW5zaWduZWQgY2hhciB0dXBsZSwgbGluaywgZGF0YV9pZCwgZGF0YV9jb3VudDsKKworCS8qIFhpcmNvbSBoYXMgaXRzIGFkZHJlc3Mgc3RvcmVkIGluIHRoZSBDSVM7CisJICogd2UgYWNjZXNzIGl0IHRocm91Z2ggdGhlIGJvb3Qgcm9tIGludGVyZmFjZSBmb3Igbm93CisJICogdGhpcyBtaWdodCBub3Qgd29yaywgYXMgdGhlIENJUyBpcyBub3QgcGFyc2VkIGJ1dCBJCisJICogKGRhbmlsbykgdXNlIHRoZSBvZmZzZXQgSSBmb3VuZCBvbiBteSBjYXJkJ3MgQ0lTICEhIQorCSAqCisJICogRG91ZyBMZWRmb3JkOiBJIGNoYW5nZWQgdGhpcyByb3V0aW5lIGFyb3VuZCBzbyB0aGF0IGl0CisJICogd2Fsa3MgdGhlIENJUyBtZW1vcnkgc3BhY2UsIHBhcnNpbmcgdGhlIGNvbmZpZyBpdGVtcywgYW5kCisJICogZmluZHMgdGhlIHByb3BlciBsYW5fbm9kZV9pZCB0dXBsZSBhbmQgdXNlcyB0aGUgZGF0YQorCSAqIHN0b3JlZCB0aGVyZS4KKwkgKi8KKwlvdXRsKDEgPDwgMTIsIGlvYWRkciArIENTUjkpOyAvKiBlbmFibGUgYm9vdCByb20gYWNjZXNzICovCisJZm9yIChpID0gMHgxMDA7IGkgPCAweDFmNzsgaSArPSBsaW5rKzIpIHsKKwkJb3V0bChpLCBpb2FkZHIgKyBDU1IxMCk7CisJCXR1cGxlID0gaW5sKGlvYWRkciArIENTUjkpICYgMHhmZjsKKwkJb3V0bChpICsgMSwgaW9hZGRyICsgQ1NSMTApOworCQlsaW5rID0gaW5sKGlvYWRkciArIENTUjkpICYgMHhmZjsKKwkJb3V0bChpICsgMiwgaW9hZGRyICsgQ1NSMTApOworCQlkYXRhX2lkID0gaW5sKGlvYWRkciArIENTUjkpICYgMHhmZjsKKwkJb3V0bChpICsgMywgaW9hZGRyICsgQ1NSMTApOworCQlkYXRhX2NvdW50ID0gaW5sKGlvYWRkciArIENTUjkpICYgMHhmZjsKKwkJaWYgKCAodHVwbGUgPT0gMHgyMikgJiYKKwkJCSAoZGF0YV9pZCA9PSAweDA0KSAmJiAoZGF0YV9jb3VudCA9PSAweDA2KSApIHsKKwkJCS8qCisJCQkgKiBUaGlzIGlzIGl0LiAgV2UgaGF2ZSB0aGUgZGF0YSB3ZSB3YW50LgorCQkJICovCisJCQlmb3IgKGogPSAwOyBqIDwgNjsgaisrKSB7CisJCQkJb3V0bChpICsgaiArIDQsIGlvYWRkciArIENTUjEwKTsKKwkJCQlkZXYtPmRldl9hZGRyW2pdID0gaW5sKGlvYWRkciArIENTUjkpICYgMHhmZjsKKwkJCX0KKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGxpbmsgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworLyoKKyAqIGxvY2F0ZSB0aGUgTUlJIGludGVyZmFjZXMgYW5kIGluaXRpYWxpemUgdGhlbS4KKyAqIHdlIGRpc2FibGUgZnVsbC1kdXBsZXggbW9kZXMgaGVyZSwKKyAqIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHRoZW0uCisgKi8KK3N0YXRpYyB2b2lkIGZpbmRfbWlpX3RyYW5zY2VpdmVycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBwaHksIHBoeV9pZHg7CisKKwlpZiAobWVkaWFfY2FwW3RwLT5kZWZhdWx0X3BvcnRdICYgTWVkaWFJc01JSSkgeworCQl1MTYgbWVkaWEyYWR2ZXJ0W10gPSB7IDB4MjAsIDB4NDAsIDB4MDNlMCwgMHg2MCwgMHg4MCwgMHgxMDAsIDB4MjAwIH07CisJCXRwLT50b19hZHZlcnRpc2UgPSBtZWRpYTJhZHZlcnRbdHAtPmRlZmF1bHRfcG9ydCAtIDldOworCX0gZWxzZQorCQl0cC0+dG9fYWR2ZXJ0aXNlID0KKwkJCS8qQURWRVJUSVNFXzEwMEJBU0U0IHwgQURWRVJUSVNFXzEwMEZVTEwgfCovIEFEVkVSVElTRV8xMDBIQUxGIHwKKwkJCS8qQURWRVJUSVNFXzEwRlVMTCB8Ki8gQURWRVJUSVNFXzEwSEFMRiB8IEFEVkVSVElTRV9DU01BOworCisJLyogRmluZCB0aGUgY29ubmVjdGVkIE1JSSB4Y3Zycy4KKwkgICBEb2luZyB0aGlzIGluIG9wZW4oKSB3b3VsZCBhbGxvdyBkZXRlY3RpbmcgZXh0ZXJuYWwgeGN2cnMgbGF0ZXIsCisJICAgYnV0IHRha2VzIG11Y2ggdGltZS4gKi8KKwlmb3IgKHBoeSA9IDAsIHBoeV9pZHggPSAwOyBwaHkgPCAzMiAmJiBwaHlfaWR4IDwgc2l6ZW9mKHRwLT5waHlzKTsgcGh5KyspIHsKKwkJaW50IG1paV9zdGF0dXMgPSBtZGlvX3JlYWQoZGV2LCBwaHksIE1JSV9CTVNSKTsKKwkJaWYgKChtaWlfc3RhdHVzICYgKEJNU1JfMTAwQkFTRTQgfCBCTVNSXzEwMEhBTEYgfCBCTVNSXzEwSEFMRikpID09IEJNU1JfMTAwQkFTRTQgfHwKKwkJCSgobWlpX3N0YXR1cyAmIEJNU1JfMTAwQkFTRTQpID09IDAgJiYKKwkJCSAobWlpX3N0YXR1cyAmIChCTVNSXzEwMEZVTEwgfCBCTVNSXzEwMEhBTEYgfCBCTVNSXzEwRlVMTCB8IEJNU1JfMTBIQUxGKSkgIT0gMCkpIHsKKwkJCWludCBtaWlfcmVnMCA9IG1kaW9fcmVhZChkZXYsIHBoeSwgTUlJX0JNQ1IpOworCQkJaW50IG1paV9hZHZlcnQgPSBtZGlvX3JlYWQoZGV2LCBwaHksIE1JSV9BRFZFUlRJU0UpOworCQkJaW50IHJlZzQgPSAoKG1paV9zdGF0dXMgPj4gNikgJiB0cC0+dG9fYWR2ZXJ0aXNlKSB8IEFEVkVSVElTRV9DU01BOworCQkJdHAtPnBoeXNbcGh5X2lkeF0gPSBwaHk7CisJCQl0cC0+YWR2ZXJ0aXNpbmdbcGh5X2lkeCsrXSA9IHJlZzQ7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogIE1JSSB0cmFuc2NlaXZlciAjJWQgIgorCQkJCSAgICJjb25maWcgJTQuNHggc3RhdHVzICU0LjR4IGFkdmVydGlzaW5nICU0LjR4LlxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIHBoeSwgbWlpX3JlZzAsIG1paV9zdGF0dXMsIG1paV9hZHZlcnQpOworCQl9CisJfQorCXRwLT5taWlfY250ID0gcGh5X2lkeDsKKwlpZiAocGh5X2lkeCA9PSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiAqKipXQVJOSU5HKioqOiBObyBNSUkgdHJhbnNjZWl2ZXIgZm91bmQhXG4iLAorCQkJICAgZGV2LT5uYW1lKTsKKwkJdHAtPnBoeXNbMF0gPSAwOworCX0KK30KKworCisvKgorICogVG8gcXVvdGUgQXJqYW4gdmFuIGRlIFZlbjoKKyAqICAgdHJhbnNjZWl2ZXJfdm9vZG9vKCkgZW5hYmxlcyB0aGUgZXh0ZXJuYWwgVVRQIHBsdWcgdGhpbmd5LgorICogICBpdCdzIGNhbGxlZCB2b29kb28gYXMgSSBzdG9sZSB0aGlzIGNvZGUgYW5kIGNhbm5vdCBjcm9zcy1yZWZlcmVuY2UKKyAqICAgaXQgd2l0aCB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqIEFjdHVhbGx5IGl0IHNlZW1zIHRvIGdvIGxpa2UgdGhpczoKKyAqIC0gR1BJTzIgZW5hYmxlcyB0aGUgTUlJIGl0c2VsZiBzbyB3ZSBjYW4gdGFsayB0byBpdC4gVGhlIE1JSSBnZXRzIHJlc2V0CisgKiAgIHNvIGFueSBwcmlvciBNSUkgc2V0dGluZ3MgYXJlIGxvc3QuCisgKiAtIEdQSU8wIGVuYWJsZXMgdGhlIFRQIHBvcnQgc28gdGhlIE1JSSBjYW4gdGFsayB0byB0aGUgbmV0d29yay4KKyAqIC0gYSBzb2Z0d2FyZSByZXNldCB3aWxsIHJlc2V0IGJvdGggR1BJTyBwaW5zLgorICogSSBhbHNvIG1vdmVkIHRoZSBzb2Z0d2FyZSByZXNldCBoZXJlLCBiZWNhdXNlIGRvaW5nIGl0IGluIHhpcmNvbV91cCgpCisgKiByZXF1aXJlZCBlbmFibGluZyB0aGUgR1BJTyBwaW5zIGVhY2ggdGltZSwgd2hpY2ggcmVzZXQgdGhlIE1JSSBlYWNoIHRpbWUuCisgKiBUaHVzIHdlIGNvdWxkbid0IGNvbnRyb2wgdGhlIE1JSSAtLSB3aGljaCBzdWNrcyBiZWNhdXNlIHdlIGRvbid0IGtub3cKKyAqIGhvdyB0byBoYW5kbGUgZnVsbC1kdXBsZXggbW9kZXMgc28gd2UgKm11c3QqIGRpc2FibGUgdGhlbS4KKyAqLworc3RhdGljIHZvaWQgdHJhbnNjZWl2ZXJfdm9vZG9vKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHhpcmNvbV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCS8qIFJlc2V0IHRoZSBjaGlwLCBob2xkaW5nIGJpdCAwIHNldCBhdCBsZWFzdCA1MCBQQ0kgY3ljbGVzLiAqLworCW91dGwoU29mdHdhcmVSZXNldCwgaW9hZGRyICsgQ1NSMCk7CisJdWRlbGF5KDIpOworCisJLyogRGVhc3NlcnQgcmVzZXQuICovCisJb3V0bCh0cC0+Y3NyMCwgaW9hZGRyICsgQ1NSMCk7CisKKwkvKiBSZXNldCB0aGUgeGN2ciBpbnRlcmZhY2UgYW5kIHR1cm4gb24gaGVhcnRiZWF0LiAqLworCW91dGwoMHgwMDA4LCBpb2FkZHIgKyBDU1IxNSk7CisJdWRlbGF5KDUpOyAgLyogVGhlIGRlbGF5cyBhcmUgWGlyY29tLXJlY29tbWVuZGVkIHRvIGdpdmUgdGhlCisJCQkJICogY2hpcHNldCB0aW1lIHRvIHJlc2V0IHRoZSBhY3R1YWwgaGFyZHdhcmUKKwkJCQkgKiBvbiB0aGUgUENNQ0lBIGNhcmQKKwkJCQkgKi8KKwlvdXRsKDB4YTgwNTAwMDAsIGlvYWRkciArIENTUjE1KTsKKwl1ZGVsYXkoNSk7CisJb3V0bCgweGEwMGYwMDAwLCBpb2FkZHIgKyBDU1IxNSk7CisJdWRlbGF5KDUpOworCisJb3V0bF9DU1I2KDAsIGlvYWRkcik7CisJLy9vdXRsX0NTUjYoRnVsbER1cGxleEJpdCwgaW9hZGRyKTsKK30KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB4aXJjb21faW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHA7CisJc3RhdGljIGludCBib2FyZF9pZHggPSAtMTsKKwlpbnQgY2hpcF9pZHggPSBpZC0+ZHJpdmVyX2RhdGE7CisJbG9uZyBpb2FkZHI7CisJaW50IGk7CisJdTggY2hpcF9yZXY7CisKKy8qIHdoZW4gYnVpbHQgaW50byB0aGUga2VybmVsLCB3ZSBvbmx5IHByaW50IHZlcnNpb24gaWYgZGV2aWNlIGlzIGZvdW5kICovCisjaWZuZGVmIE1PRFVMRQorCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorCisJLy9wcmludGsoS0VSTl9JTkZPICJ4aXJjb21faW5pdF9vbmUoJXMpXG4iLCBwY2lfbmFtZShwZGV2KSk7CisKKwlib2FyZF9pZHgrKzsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKnRwKSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBEUlZfTkFNRSAiJWQ6IGNhbm5vdCBhbGxvYyBldGhlcmRldiwgYWJvcnRpbmdcbiIsIGJvYXJkX2lkeCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCWRldi0+aXJxID0gcGRldi0+aXJxOworCisJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgZGV2LT5uYW1lKSkgeworCQlwcmludGsgKEtFUk5fRVJSIERSVl9OQU1FICIgJWQ6IGNhbm5vdCByZXNlcnZlIFBDSSByZXNvdXJjZXMsIGFib3J0aW5nXG4iLCBib2FyZF9pZHgpOworCQlnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7CisJfQorCisJLyogQnJpbmcgdGhlIGNoaXAgb3V0IG9mIHNsZWVwIG1vZGUuCisJICAgQ2F1dGlvbjogU25vb3plIG1vZGUgZG9lcyBub3Qgd29yayB3aXRoIHNvbWUgYm9hcmRzISAqLworCWlmICh4aXJjb21fdGJsW2NoaXBfaWR4XS5mbGFncyAmIEhBU19BQ1BJKQorCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9QT1dFUk1HTVQsIDApOworCisJLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBwcm9jZXNzZXMuICovCisJb3V0bF9DU1I2KGlubChpb2FkZHIgKyBDU1I2KSAmIH5FbmFibGVUeFJ4LCBpb2FkZHIpOworCS8qIENsZWFyIHRoZSBtaXNzZWQtcGFja2V0IGNvdW50ZXIuICovCisJKHZvbGF0aWxlIGludClpbmwoaW9hZGRyICsgQ1NSOCk7CisKKwl0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2tfaW5pdCgmdHAtPmxvY2spOworCXRwLT5wZGV2ID0gcGRldjsKKwl0cC0+Y2hpcF9pZCA9IGNoaXBfaWR4OworCS8qIEJ1Z0ZpeGVzOiBUaGUgMjExNDMtVEQgaGFuZ3Mgd2l0aCBQQ0kgV3JpdGUtYW5kLUludmFsaWRhdGUgY3ljbGVzLiAqLworCS8qIFhYWDogaXMgdGhpcyBuZWNlc3NhcnkgZm9yIFhpcmNvbT8gKi8KKwl0cC0+Y3NyMCA9IGNzcjAgJiB+RW5hYmxlTVdJOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwkvKiBUaGUgbG93ZXIgZm91ciBiaXRzIGFyZSB0aGUgbWVkaWEgdHlwZS4gKi8KKwlpZiAoYm9hcmRfaWR4ID49IDAgJiYgYm9hcmRfaWR4IDwgTUFYX1VOSVRTKSB7CisJCXRwLT5kZWZhdWx0X3BvcnQgPSBvcHRpb25zW2JvYXJkX2lkeF0gJiAxNTsKKwkJaWYgKChvcHRpb25zW2JvYXJkX2lkeF0gJiAweDkwKSB8fCBmdWxsX2R1cGxleFtib2FyZF9pZHhdID4gMCkKKwkJCXRwLT5mdWxsX2R1cGxleCA9IDE7CisJCWlmIChtdHVbYm9hcmRfaWR4XSA+IDApCisJCQlkZXYtPm10dSA9IG10dVtib2FyZF9pZHhdOworCX0KKwlpZiAoZGV2LT5tZW1fc3RhcnQpCisJCXRwLT5kZWZhdWx0X3BvcnQgPSBkZXYtPm1lbV9zdGFydDsKKwlpZiAodHAtPmRlZmF1bHRfcG9ydCkgeworCQlpZiAobWVkaWFfY2FwW3RwLT5kZWZhdWx0X3BvcnRdICYgTWVkaWFBbHdheXNGRCkKKwkJCXRwLT5mdWxsX2R1cGxleCA9IDE7CisJfQorCWlmICh0cC0+ZnVsbF9kdXBsZXgpCisJCXRwLT5hdXRvbmVnID0gMDsKKwllbHNlCisJCXRwLT5hdXRvbmVnID0gMTsKKwl0cC0+c3BlZWQxMDAgPSAxOworCisJLyogVGhlIFhpcmNvbS1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9ICZ4aXJjb21fb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ4aXJjb21fc3RhcnRfeG1pdDsKKwlkZXYtPnN0b3AgPSAmeGlyY29tX2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gJnhpcmNvbV9nZXRfc3RhdHM7CisJZGV2LT5kb19pb2N0bCA9ICZ4aXJjb21faW9jdGw7CisjaWZkZWYgSEFWRV9NVUxUSUNBU1QKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZTsKKyNlbmRpZgorCWRldi0+dHhfdGltZW91dCA9IHhpcmNvbV90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCVNFVF9FVEhUT09MX09QUyhkZXYsICZvcHMpOworCisJdHJhbnNjZWl2ZXJfdm9vZG9vKGRldik7CisKKwlyZWFkX21hY19hZGRyZXNzKGRldik7CisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpCisJCWdvdG8gZXJyX291dF9jbGVhcmRldjsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJmNoaXBfcmV2KTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgcmV2ICVkIGF0ICUjM2x4LCIsCisJICAgICAgIGRldi0+bmFtZSwgeGlyY29tX3RibFtjaGlwX2lkeF0uY2hpcF9uYW1lLCBjaGlwX3JldiwgaW9hZGRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwcmludGsoIiVjJTIuMlgiLCBpID8gJzonIDogJyAnLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIiwgSVJRICVkLlxuIiwgZGV2LT5pcnEpOworCisJaWYgKHhpcmNvbV90YmxbY2hpcF9pZHhdLmZsYWdzICYgSEFTX01JSSkgeworCQlmaW5kX21paV90cmFuc2NlaXZlcnMoZGV2KTsKKwkJY2hlY2tfZHVwbGV4KGRldik7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfY2xlYXJkZXY6CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfb3V0X2ZyZWVfbmV0ZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKworLyogTUlJIHRyYW5zY2VpdmVyIGNvbnRyb2wgc2VjdGlvbi4KKyAgIFJlYWQgYW5kIHdyaXRlIHRoZSBNSUkgcmVnaXN0ZXJzIHVzaW5nIHNvZnR3YXJlLWdlbmVyYXRlZCBzZXJpYWwKKyAgIE1ESU8gcHJvdG9jb2wuICBTZWUgdGhlIE1JSSBzcGVjaWZpY2F0aW9ucyBvciBEUDgzODQwQSBkYXRhIHNoZWV0CisgICBmb3IgZGV0YWlscy4gKi8KKworLyogVGhlIG1heGltdW0gZGF0YSBjbG9jayByYXRlIGlzIDIuNSBNaHouICBUaGUgbWluaW11bSB0aW1pbmcgaXMgdXN1YWxseQorICAgbWV0IGJ5IGJhY2stdG8tYmFjayBQQ0kgSS9PIGN5Y2xlcywgYnV0IHdlIGluc2VydCBhIGRlbGF5IHRvIGF2b2lkCisgICAib3ZlcmNsb2NraW5nIiBpc3N1ZXMgb3IgZnV0dXJlIDY2TWh6IFBDSS4gKi8KKyNkZWZpbmUgbWRpb19kZWxheSgpIGlubChtZGlvX2FkZHIpCisKKy8qIFJlYWQgYW5kIHdyaXRlIHRoZSBNSUkgcmVnaXN0ZXJzIHVzaW5nIHNvZnR3YXJlLWdlbmVyYXRlZCBzZXJpYWwKKyAgIE1ESU8gcHJvdG9jb2wuICBJdCBpcyBqdXN0IGRpZmZlcmVudCBlbm91Z2ggZnJvbSB0aGUgRUVQUk9NIHByb3RvY29sCisgICB0byBub3Qgc2hhcmUgY29kZS4gIFRoZSBtYXhpdW0gZGF0YSBjbG9jayByYXRlIGlzIDIuNSBNaHouICovCisjZGVmaW5lIE1ESU9fU0hJRlRfQ0xLCTB4MTAwMDAKKyNkZWZpbmUgTURJT19EQVRBX1dSSVRFMCAweDAwMDAwCisjZGVmaW5lIE1ESU9fREFUQV9XUklURTEgMHgyMDAwMAorI2RlZmluZSBNRElPX0VOQgkJMHgwMDAwMAkJLyogSWdub3JlIHRoZSAweDAyMDAwIGRhdGFib29rIHNldHRpbmcuICovCisjZGVmaW5lIE1ESU9fRU5CX0lOCQkweDQwMDAwCisjZGVmaW5lIE1ESU9fREFUQV9SRUFECTB4ODAwMDAKKworc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQoreworCWludCBpOworCWludCByZWFkX2NtZCA9ICgweGY2IDw8IDEwKSB8IChwaHlfaWQgPDwgNSkgfCBsb2NhdGlvbjsKKwlpbnQgcmV0dmFsID0gMDsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWxvbmcgbWRpb19hZGRyID0gaW9hZGRyICsgQ1NSOTsKKworCS8qIEVzdGFibGlzaCBzeW5jIGJ5IHNlbmRpbmcgYXQgbGVhc3QgMzIgbG9naWMgb25lcy4gKi8KKwlmb3IgKGkgPSAzMjsgaSA+PSAwOyBpLS0pIHsKKwkJb3V0bChNRElPX0VOQiB8IE1ESU9fREFUQV9XUklURTEsIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwkJb3V0bChNRElPX0VOQiB8IE1ESU9fREFUQV9XUklURTEgfCBNRElPX1NISUZUX0NMSywgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCX0KKwkvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IDE1OyBpID49IDA7IGktLSkgeworCQlpbnQgZGF0YXZhbCA9IChyZWFkX2NtZCAmICgxIDw8IGkpKSA/IE1ESU9fREFUQV9XUklURTEgOiAwOworCisJCW91dGwoTURJT19FTkIgfCBkYXRhdmFsLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJCW91dGwoTURJT19FTkIgfCBkYXRhdmFsIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJLyogUmVhZCB0aGUgdHdvIHRyYW5zaXRpb24sIDE2IGRhdGEsIGFuZCB3aXJlLWlkbGUgYml0cy4gKi8KKwlmb3IgKGkgPSAxOTsgaSA+IDA7IGktLSkgeworCQlvdXRsKE1ESU9fRU5CX0lOLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJCXJldHZhbCA9IChyZXR2YWwgPDwgMSkgfCAoKGlubChtZGlvX2FkZHIpICYgTURJT19EQVRBX1JFQUQpID8gMSA6IDApOworCQlvdXRsKE1ESU9fRU5CX0lOIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJcmV0dXJuIChyZXR2YWw+PjEpICYgMHhmZmZmOworfQorCisKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpCit7CisJaW50IGk7CisJaW50IGNtZCA9ICgweDUwMDIgPDwgMTYpIHwgKHBoeV9pZCA8PCAyMykgfCAobG9jYXRpb24gPDwgMTgpIHwgdmFsdWU7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlsb25nIG1kaW9fYWRkciA9IGlvYWRkciArIENTUjk7CisKKwkvKiBFc3RhYmxpc2ggc3luYyBieSBzZW5kaW5nIDMyIGxvZ2ljIG9uZXMuICovCisJZm9yIChpID0gMzI7IGkgPj0gMDsgaS0tKSB7CisJCW91dGwoTURJT19FTkIgfCBNRElPX0RBVEFfV1JJVEUxLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJCW91dGwoTURJT19FTkIgfCBNRElPX0RBVEFfV1JJVEUxIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJLyogU2hpZnQgdGhlIGNvbW1hbmQgYml0cyBvdXQuICovCisJZm9yIChpID0gMzE7IGkgPj0gMDsgaS0tKSB7CisJCWludCBkYXRhdmFsID0gKGNtZCAmICgxIDw8IGkpKSA/IE1ESU9fREFUQV9XUklURTEgOiAwOworCQlvdXRsKE1ESU9fRU5CIHwgZGF0YXZhbCwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlvdXRsKE1ESU9fRU5CIHwgZGF0YXZhbCB8IE1ESU9fU0hJRlRfQ0xLLCBtZGlvX2FkZHIpOworCQltZGlvX2RlbGF5KCk7CisJfQorCS8qIENsZWFyIG91dCBleHRyYSBiaXRzLiAqLworCWZvciAoaSA9IDI7IGkgPiAwOyBpLS0pIHsKKwkJb3V0bChNRElPX0VOQl9JTiwgbWRpb19hZGRyKTsKKwkJbWRpb19kZWxheSgpOworCQlvdXRsKE1ESU9fRU5CX0lOIHwgTURJT19TSElGVF9DTEssIG1kaW9fYWRkcik7CisJCW1kaW9fZGVsYXkoKTsKKwl9CisJcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkCit4aXJjb21fdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpOworCisJeGlyY29tX2luaXRfcmluZyhkZXYpOworCS8qIENsZWFyIHRoZSB0eCByaW5nICovCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCXRwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQl0cC0+dHhfcmluZ1tpXS5zdGF0dXMgPSAwOworCX0KKworCWlmICh4aXJjb21fZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHhpcmNvbV91cCgpIGlycSAlZC5cbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCisJb3V0bCh2aXJ0X3RvX2J1cyh0cC0+cnhfcmluZyksIGlvYWRkciArIENTUjMpOworCW91dGwodmlydF90b19idXModHAtPnR4X3JpbmcpLCBpb2FkZHIgKyBDU1I0KTsKKworCXRwLT5zYXZlZF9pZl9wb3J0ID0gZGV2LT5pZl9wb3J0OworCWlmIChkZXYtPmlmX3BvcnQgPT0gMCkKKwkJZGV2LT5pZl9wb3J0ID0gdHAtPmRlZmF1bHRfcG9ydDsKKworCXRwLT5jc3I2ID0gVHhUaHJlc2gxMCAvKnwgRnVsbER1cGxleEJpdCovOwkJCQkJCS8qIFhYWDogd2h5IDEwIGFuZCBub3QgMTAwPyAqLworCisJc2V0X3J4X21vZGUoZGV2KTsKKworCS8qIFN0YXJ0IHRoZSBjaGlwJ3MgVHggdG8gcHJvY2VzcyBzZXR1cCBmcmFtZS4gKi8KKwlvdXRsX0NTUjYodHAtPmNzcjYsIGlvYWRkcik7CisJb3V0bF9DU1I2KHRwLT5jc3I2IHwgRW5hYmxlVHgsIGlvYWRkcik7CisKKwkvKiBBY2tub3dsZWRnZSBhbGwgb3V0c3RhbmRpbmcgaW50ZXJydXB0cyBzb3VyY2VzICovCisJb3V0bCh4aXJjb21fdGJsW3RwLT5jaGlwX2lkXS52YWxpZF9pbnRycywgaW9hZGRyICsgQ1NSNSk7CisJLyogRW5hYmxlIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJb3V0bCh4aXJjb21fdGJsW3RwLT5jaGlwX2lkXS52YWxpZF9pbnRycywgaW9hZGRyICsgQ1NSNyk7CisJLyogRW5hYmxlIFJ4ICovCisJb3V0bF9DU1I2KHRwLT5jc3I2IHwgRW5hYmxlVHhSeCwgaW9hZGRyKTsKKwkvKiBSeCBwb2xsIGRlbWFuZCAqLworCW91dGwoMCwgaW9hZGRyICsgQ1NSMik7CisKKwkvKiBUZWxsIHRoZSBuZXQgbGF5ZXIgd2UncmUgcmVhZHkgKi8KKwluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKworCS8qIENoZWNrIGN1cnJlbnQgbWVkaWEgc3RhdGUgKi8KKwl4aXJjb21fbWVkaWFfY2hhbmdlKGRldik7CisKKwlpZiAoeGlyY29tX2RlYnVnID4gMikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERvbmUgeGlyY29tX3VwKCksIENTUjAgJTguOHgsIENTUjUgJTguOHggQ1NSNiAlOC44eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGlubChpb2FkZHIgKyBDU1IwKSwgaW5sKGlvYWRkciArIENTUjUpLAorCQkJICAgaW5sKGlvYWRkciArIENTUjYpKTsKKwl9Cit9CisKKworc3RhdGljIGludAoreGlyY29tX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgJnhpcmNvbV9pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldikpCisJCXJldHVybiAtRUFHQUlOOworCisJeGlyY29tX3VwKGRldik7CisJdHAtPm9wZW4gPSAxOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgeGlyY29tX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKG1lZGlhX2NhcFtkZXYtPmlmX3BvcnRdICYgTWVkaWFJc01JSSkgeworCQkvKiBEbyBub3RoaW5nIC0tIHRoZSBtZWRpYSBtb25pdG9yIHNob3VsZCBoYW5kbGUgdGhpcy4gKi8KKwkJaWYgKHhpcmNvbV9kZWJ1ZyA+IDEpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVHJhbnNtaXQgdGltZW91dCB1c2luZyBNSUkgZGV2aWNlLlxuIiwKKwkJCQkgICBkZXYtPm5hbWUpOworCX0KKworI2lmIGRlZmluZWQod2F5X3Rvb19tYW55X21lc3NhZ2VzKQorCWlmICh4aXJjb21fZGVidWcgPiAzKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJCXU4ICpidWYgPSAodTggKikodHAtPnJ4X3JpbmdbaV0uYnVmZmVyMSk7CisJCQlpbnQgajsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlMmQ6ICU4Ljh4ICU4Ljh4ICU4Ljh4ICU4Ljh4ICAiCisJCQkJICAgIiUyLjJ4ICUyLjJ4ICUyLjJ4LlxuIiwKKwkJCQkgICBpLCAodW5zaWduZWQgaW50KXRwLT5yeF9yaW5nW2ldLnN0YXR1cywKKwkJCQkgICAodW5zaWduZWQgaW50KXRwLT5yeF9yaW5nW2ldLmxlbmd0aCwKKwkJCQkgICAodW5zaWduZWQgaW50KXRwLT5yeF9yaW5nW2ldLmJ1ZmZlcjEsCisJCQkJICAgKHVuc2lnbmVkIGludCl0cC0+cnhfcmluZ1tpXS5idWZmZXIyLAorCQkJCSAgIGJ1ZlswXSwgYnVmWzFdLCBidWZbMl0pOworCQkJZm9yIChqID0gMDsgYnVmW2pdICE9IDB4ZWUgJiYgaiA8IDE2MDA7IGorKykKKwkJCQlpZiAoaiA8IDEwMCkgcHJpbnRrKCIgJTIuMngiLCBidWZbal0pOworCQkJcHJpbnRrKCIgaj0lZC5cbiIsIGopOworCQl9CisJCXByaW50ayhLRVJOX0RFQlVHICIgIFJ4IHJpbmcgJTguOHg6ICIsIChpbnQpdHAtPnJ4X3JpbmcpOworCQlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspCisJCQlwcmludGsoIiAlOC44eCIsICh1bnNpZ25lZCBpbnQpdHAtPnJ4X3JpbmdbaV0uc3RhdHVzKTsKKwkJcHJpbnRrKCJcbiIgS0VSTl9ERUJVRyAiICBUeCByaW5nICU4Ljh4OiAiLCAoaW50KXRwLT50eF9yaW5nKTsKKwkJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKQorCQkJcHJpbnRrKCIgJTguOHgiLCAodW5zaWduZWQgaW50KXRwLT50eF9yaW5nW2ldLnN0YXR1cyk7CisJCXByaW50aygiXG4iKTsKKwl9CisjZW5kaWYKKworCS8qIFN0b3AgYW5kIHJlc3RhcnQgdGhlIGNoaXAncyBUeC9SeCBwcm9jZXNzZXMgLiAqLworCW91dGxfQ1NSNih0cC0+Y3NyNiB8IEVuYWJsZVJ4LCBpb2FkZHIpOworCW91dGxfQ1NSNih0cC0+Y3NyNiB8IEVuYWJsZVR4UngsIGlvYWRkcik7CisJLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgdHJhbnNtaXQgZGVtYW5kLiAqLworCW91dGwoMCwgaW9hZGRyICsgQ1NSMSk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCXRwLT5zdGF0cy50eF9lcnJvcnMrKzsKK30KKworCisvKiBJbml0aWFsaXplIHRoZSBSeCBhbmQgVHggcmluZ3MsIGFsb25nIHdpdGggdmFyaW91cyAnZGV2JyBiaXRzLiAqLworc3RhdGljIHZvaWQgeGlyY29tX2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJdHAtPnR4X2Z1bGwgPSAwOworCXRwLT5jdXJfcnggPSB0cC0+Y3VyX3R4ID0gMDsKKwl0cC0+ZGlydHlfcnggPSB0cC0+ZGlydHlfdHggPSAwOworCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXRwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CisJCXRwLT5yeF9yaW5nW2ldLmxlbmd0aCA9IFBLVF9CVUZfU1o7CisJCXRwLT5yeF9yaW5nW2ldLmJ1ZmZlcjIgPSB2aXJ0X3RvX2J1cygmdHAtPnJ4X3JpbmdbaSsxXSk7CisJCXRwLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCX0KKwkvKiBNYXJrIHRoZSBsYXN0IGVudHJ5IGFzIHdyYXBwaW5nIHRoZSByaW5nLiAqLworCXRwLT5yeF9yaW5nW2ktMV0ubGVuZ3RoID0gUEtUX0JVRl9TWiB8IFJ4MVJpbmdXcmFwOworCXRwLT5yeF9yaW5nW2ktMV0uYnVmZmVyMiA9IHZpcnRfdG9fYnVzKCZ0cC0+cnhfcmluZ1swXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJLyogTm90ZSB0aGUgcmVjZWl2ZSBidWZmZXIgbXVzdCBiZSBsb25nd29yZCBhbGlnbmVkLgorCQkgICBkZXZfYWxsb2Nfc2tiKCkgcHJvdmlkZXMgMTYgYnl0ZSBhbGlnbm1lbnQuICBCdXQgZG8gKm5vdCoKKwkJICAgdXNlIHNrYl9yZXNlcnZlKCkgdG8gYWxpZ24gdGhlIElQIGhlYWRlciEgKi8KKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IoUEtUX0JVRl9TWik7CisJCXRwLT5yeF9za2J1ZmZbaV0gPSBza2I7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCXRwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IFJ4MERlc2NPd25lZDsJLyogT3duZWQgYnkgWGlyY29tIGNoaXAgKi8KKwkJdHAtPnJ4X3JpbmdbaV0uYnVmZmVyMSA9IHZpcnRfdG9fYnVzKHNrYi0+dGFpbCk7CisJfQorCXRwLT5kaXJ0eV9yeCA9ICh1bnNpZ25lZCBpbnQpKGkgLSBSWF9SSU5HX1NJWkUpOworCisJLyogVGhlIFR4IGJ1ZmZlciBkZXNjcmlwdG9yIGlzIGZpbGxlZCBpbiBhcyBuZWVkZWQsIGJ1dCB3ZQorCSAgIGRvIG5lZWQgdG8gY2xlYXIgdGhlIG93bmVyc2hpcCBiaXQuICovCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCXRwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQl0cC0+dHhfcmluZ1tpXS5zdGF0dXMgPSAwOworCQl0cC0+dHhfcmluZ1tpXS5idWZmZXIyID0gdmlydF90b19idXMoJnRwLT50eF9yaW5nW2krMV0pOworI2lmZGVmIENBUkRCVVMKKwkJaWYgKHRwLT5jaGlwX2lkID09IFgzMjAxXzMpCisJCQl0cC0+dHhfYWxpZ25lZF9za2J1ZmZbaV0gPSBkZXZfYWxsb2Nfc2tiKFBLVF9CVUZfU1opOworI2VuZGlmIC8qIENBUkRCVVMgKi8KKwl9CisJdHAtPnR4X3JpbmdbaS0xXS5idWZmZXIyID0gdmlydF90b19idXMoJnRwLT50eF9yaW5nWzBdKTsKK30KKworCitzdGF0aWMgaW50Cit4aXJjb21fc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlbnRyeTsKKwl1MzIgZmxhZzsKKworCS8qIENhdXRpb246IHRoZSB3cml0ZSBvcmRlciBpcyBpbXBvcnRhbnQgaGVyZSwgc2V0IHRoZSBiYXNlIGFkZHJlc3MKKwkgICB3aXRoIHRoZSAib3duZXJzaGlwIiBiaXRzIGxhc3QuICovCisKKwkvKiBDYWxjdWxhdGUgdGhlIG5leHQgVHggZGVzY3JpcHRvciBlbnRyeS4gKi8KKwllbnRyeSA9IHRwLT5jdXJfdHggJSBUWF9SSU5HX1NJWkU7CisKKwl0cC0+dHhfc2tidWZmW2VudHJ5XSA9IHNrYjsKKyNpZmRlZiBDQVJEQlVTCisJaWYgKHRwLT5jaGlwX2lkID09IFgzMjAxXzMpIHsKKwkJbWVtY3B5KHRwLT50eF9hbGlnbmVkX3NrYnVmZltlbnRyeV0tPmRhdGEsc2tiLT5kYXRhLHNrYi0+bGVuKTsKKwkJdHAtPnR4X3JpbmdbZW50cnldLmJ1ZmZlcjEgPSB2aXJ0X3RvX2J1cyh0cC0+dHhfYWxpZ25lZF9za2J1ZmZbZW50cnldLT5kYXRhKTsKKwl9IGVsc2UKKyNlbmRpZgorCQl0cC0+dHhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IHZpcnRfdG9fYnVzKHNrYi0+ZGF0YSk7CisKKwlpZiAodHAtPmN1cl90eCAtIHRwLT5kaXJ0eV90eCA8IFRYX1JJTkdfU0laRS8yKSB7LyogVHlwaWNhbCBwYXRoICovCisJCWZsYWcgPSBUeDFXaG9sZVBrdDsgLyogTm8gaW50ZXJydXB0ICovCisJfSBlbHNlIGlmICh0cC0+Y3VyX3R4IC0gdHAtPmRpcnR5X3R4ID09IFRYX1JJTkdfU0laRS8yKSB7CisJCWZsYWcgPSBUeDFXaG9sZVBrdCB8IFR4MUNvbXBsSW50cjsgLyogVHgtZG9uZSBpbnRyLiAqLworCX0gZWxzZSBpZiAodHAtPmN1cl90eCAtIHRwLT5kaXJ0eV90eCA8IFRYX1JJTkdfU0laRSAtIDIpIHsKKwkJZmxhZyA9IFR4MVdob2xlUGt0OyAvKiBObyBUeC1kb25lIGludHIuICovCisJfSBlbHNlIHsKKwkJLyogTGVhdmUgcm9vbSBmb3Igc2V0X3J4X21vZGUoKSB0byBmaWxsIGVudHJpZXMuICovCisJCWZsYWcgPSBUeDFXaG9sZVBrdCB8IFR4MUNvbXBsSW50cjsgLyogVHgtZG9uZSBpbnRyLiAqLworCQl0cC0+dHhfZnVsbCA9IDE7CisJfQorCWlmIChlbnRyeSA9PSBUWF9SSU5HX1NJWkUgLSAxKQorCQlmbGFnIHw9IFR4MVdob2xlUGt0IHwgVHgxQ29tcGxJbnRyIHwgVHgxUmluZ1dyYXA7CisKKwl0cC0+dHhfcmluZ1tlbnRyeV0ubGVuZ3RoID0gc2tiLT5sZW4gfCBmbGFnOworCXRwLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMgPSBUeDBEZXNjT3duZWQ7CS8qIFBhc3Mgb3duZXJzaGlwIHRvIHRoZSBjaGlwLiAqLworCXRwLT5jdXJfdHgrKzsKKwlpZiAodHAtPnR4X2Z1bGwpCisJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisJZWxzZQorCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCisJLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgdHJhbnNtaXQgZGVtYW5kLiAqLworCW91dGwoMCwgZGV2LT5iYXNlX2FkZHIgKyBDU1IxKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgeGlyY29tX21lZGlhX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdTE2IHJlZzAsIHJlZzEsIHJlZzQsIHJlZzU7CisJdTMyIGNzcjYgPSBpbmwoaW9hZGRyICsgQ1NSNiksIG5ld2NzcjY7CisKKwkvKiByZXNldCBzdGF0dXMgZmlyc3QgKi8KKwltZGlvX3JlYWQoZGV2LCB0cC0+cGh5c1swXSwgTUlJX0JNQ1IpOworCW1kaW9fcmVhZChkZXYsIHRwLT5waHlzWzBdLCBNSUlfQk1TUik7CisKKwlyZWcwID0gbWRpb19yZWFkKGRldiwgdHAtPnBoeXNbMF0sIE1JSV9CTUNSKTsKKwlyZWcxID0gbWRpb19yZWFkKGRldiwgdHAtPnBoeXNbMF0sIE1JSV9CTVNSKTsKKworCWlmIChyZWcxICYgQk1TUl9MU1RBVFVTKSB7CisJCS8qIGxpbmsgaXMgdXAgKi8KKwkJaWYgKHJlZzAgJiBCTUNSX0FORU5BQkxFKSB7CisJCQkvKiBhdXRvbmVnb3RpYXRpb24gaXMgZW5hYmxlZCAqLworCQkJcmVnNCA9IG1kaW9fcmVhZChkZXYsIHRwLT5waHlzWzBdLCBNSUlfQURWRVJUSVNFKTsKKwkJCXJlZzUgPSBtZGlvX3JlYWQoZGV2LCB0cC0+cGh5c1swXSwgTUlJX0xQQSk7CisJCQlpZiAocmVnNCAmIEFEVkVSVElTRV8xMDBGVUxMICYmIHJlZzUgJiBMUEFfMTAwRlVMTCkgeworCQkJCXRwLT5zcGVlZDEwMCA9IDE7CisJCQkJdHAtPmZ1bGxfZHVwbGV4ID0gMTsKKwkJCX0gZWxzZSBpZiAocmVnNCAmIEFEVkVSVElTRV8xMDBIQUxGICYmIHJlZzUgJiBMUEFfMTAwSEFMRikgeworCQkJCXRwLT5zcGVlZDEwMCA9IDE7CisJCQkJdHAtPmZ1bGxfZHVwbGV4ID0gMDsKKwkJCX0gZWxzZSBpZiAocmVnNCAmIEFEVkVSVElTRV8xMEZVTEwgJiYgcmVnNSAmIExQQV8xMEZVTEwpIHsKKwkJCQl0cC0+c3BlZWQxMDAgPSAwOworCQkJCXRwLT5mdWxsX2R1cGxleCA9IDE7CisJCQl9IGVsc2UgeworCQkJCXRwLT5zcGVlZDEwMCA9IDA7CisJCQkJdHAtPmZ1bGxfZHVwbGV4ID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIGF1dG9uZWdvdGlhdGlvbiBpcyBkaXNhYmxlZCAqLworCQkJaWYgKHJlZzAgJiBCTUNSX1NQRUVEMTAwKQorCQkJCXRwLT5zcGVlZDEwMCA9IDE7CisJCQllbHNlCisJCQkJdHAtPnNwZWVkMTAwID0gMDsKKwkJCWlmIChyZWcwICYgQk1DUl9GVUxMRFBMWCkKKwkJCQl0cC0+ZnVsbF9kdXBsZXggPSAxOworCQkJZWxzZQorCQkJCXRwLT5mdWxsX2R1cGxleCA9IDA7CisJCX0KKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBMaW5rIGlzIHVwLCBydW5uaW5nIGF0ICVzTWJpdCAlcy1kdXBsZXhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsCisJCSAgICAgICB0cC0+c3BlZWQxMDAgPyAiMTAwIiA6ICIxMCIsCisJCSAgICAgICB0cC0+ZnVsbF9kdXBsZXggPyAiZnVsbCIgOiAiaGFsZiIpOworCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCW5ld2NzcjYgPSBjc3I2ICYgfkZ1bGxEdXBsZXhCaXQ7CisJCWlmICh0cC0+ZnVsbF9kdXBsZXgpCisJCQluZXdjc3I2IHw9IEZ1bGxEdXBsZXhCaXQ7CisJCWlmIChuZXdjc3I2ICE9IGNzcjYpCisJCQlvdXRsX0NTUjYobmV3Y3NyNiwgaW9hZGRyICsgQ1NSNik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBMaW5rIGlzIGRvd25cbiIsIGRldi0+bmFtZSk7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIGNoZWNrX2R1cGxleChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNiByZWcwOworCisJbWRpb193cml0ZShkZXYsIHRwLT5waHlzWzBdLCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7CisJdWRlbGF5KDUwMCk7CisJd2hpbGUgKG1kaW9fcmVhZChkZXYsIHRwLT5waHlzWzBdLCBNSUlfQk1DUikgJiBCTUNSX1JFU0VUKTsKKworCXJlZzAgPSBtZGlvX3JlYWQoZGV2LCB0cC0+cGh5c1swXSwgTUlJX0JNQ1IpOworCW1kaW9fd3JpdGUoZGV2LCB0cC0+cGh5c1swXSwgTUlJX0FEVkVSVElTRSwgdHAtPmFkdmVydGlzaW5nWzBdKTsKKworCWlmICh0cC0+YXV0b25lZykgeworCQlyZWcwICY9IH4oQk1DUl9TUEVFRDEwMCB8IEJNQ1JfRlVMTERQTFgpOworCQlyZWcwIHw9IEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVDsKKwl9IGVsc2UgeworCQlyZWcwICY9IH4oQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUKTsKKwkJaWYgKHRwLT5zcGVlZDEwMCkKKwkJCXJlZzAgfD0gQk1DUl9TUEVFRDEwMDsKKwkJaWYgKHRwLT5mdWxsX2R1cGxleCkKKwkJCXJlZzAgfD0gQk1DUl9GVUxMRFBMWDsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBMaW5rIGZvcmNlZCB0byAlc01iaXQgJXMtZHVwbGV4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLAorCQkgICAgICAgdHAtPnNwZWVkMTAwID8gIjEwMCIgOiAiMTAiLAorCQkgICAgICAgdHAtPmZ1bGxfZHVwbGV4ID8gImZ1bGwiIDogImhhbGYiKTsKKwl9CisJbWRpb193cml0ZShkZXYsIHRwLT5waHlzWzBdLCBNSUlfQk1DUiwgcmVnMCk7Cit9CisKKworLyogVGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXMgYWxsIG9mIHRoZSBSeCB0aHJlYWQgd29yayBhbmQgY2xlYW5zIHVwCisgICBhZnRlciB0aGUgVHggdGhyZWFkLiAqLworc3RhdGljIGlycXJldHVybl90IHhpcmNvbV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2luc3RhbmNlOworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGNzcjUsIHdvcmtfYnVkZ2V0ID0gbWF4X2ludGVycnVwdF93b3JrOworCWludCBoYW5kbGVkID0gMDsKKworCXNwaW5fbG9jayAoJnRwLT5sb2NrKTsKKworCWRvIHsKKwkJY3NyNSA9IGlubChpb2FkZHIgKyBDU1I1KTsKKwkJLyogQWNrbm93bGVkZ2UgYWxsIG9mIHRoZSBjdXJyZW50IGludGVycnVwdCBzb3VyY2VzIEFTQVAuICovCisJCW91dGwoY3NyNSAmIDB4MDAwMWZmZmYsIGlvYWRkciArIENTUjUpOworCisJCWlmICh4aXJjb21fZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcnJ1cHQgIGNzcjU9JSM4Ljh4IG5ldyBjc3I1PSUjOC44eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBjc3I1LCBpbmwoZGV2LT5iYXNlX2FkZHIgKyBDU1I1KSk7CisKKwkJaWYgKGNzcjUgPT0gMHhmZmZmZmZmZikKKwkJCWJyZWFrOwkvKiBhbGwgYml0cyBzZXQsIGFzc3VtZSBQQ01DSUEgY2FyZCByZW1vdmVkICovCisKKwkJaWYgKChjc3I1ICYgKE5vcm1hbEludHJ8QWJub3JtYWxJbnRyKSkgPT0gMCkKKwkJCWJyZWFrOworCisJCWhhbmRsZWQgPSAxOworCisJCWlmIChjc3I1ICYgKFJ4SW50ciB8IFJ4Tm9CdWYpKQorCQkJd29ya19idWRnZXQgLT0geGlyY29tX3J4KGRldik7CisKKwkJaWYgKGNzcjUgJiAoVHhOb0J1ZiB8IFR4RGllZCB8IFR4SW50cikpIHsKKwkJCXVuc2lnbmVkIGludCBkaXJ0eV90eDsKKworCQkJZm9yIChkaXJ0eV90eCA9IHRwLT5kaXJ0eV90eDsgdHAtPmN1cl90eCAtIGRpcnR5X3R4ID4gMDsKKwkJCQkgZGlydHlfdHgrKykgeworCQkJCWludCBlbnRyeSA9IGRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworCQkJCWludCBzdGF0dXMgPSB0cC0+dHhfcmluZ1tlbnRyeV0uc3RhdHVzOworCisJCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJCWJyZWFrOwkJCS8qIEl0IHN0aWxsIGhhc24ndCBiZWVuIFR4ZWQgKi8KKwkJCQkvKiBDaGVjayBmb3IgUnggZmlsdGVyIHNldHVwIGZyYW1lcy4gKi8KKwkJCQlpZiAodHAtPnR4X3NrYnVmZltlbnRyeV0gPT0gTlVMTCkKKwkJCQkgIGNvbnRpbnVlOworCisJCQkJaWYgKHN0YXR1cyAmIFR4MERlc2NFcnJvcikgeworCQkJCQkvKiBUaGVyZSB3YXMgYW4gbWFqb3IgZXJyb3IsIGxvZyBpdC4gKi8KKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQkJCQlpZiAoeGlyY29tX2RlYnVnID4gMSkKKwkJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHJhbnNtaXQgZXJyb3IsIFR4IHN0YXR1cyAlOC44eC5cbiIsCisJCQkJCQkJICAgZGV2LT5uYW1lLCBzdGF0dXMpOworI2VuZGlmCisJCQkJCXRwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCQkJaWYgKHN0YXR1cyAmIFR4ME1hbnlDb2xsKSB7CisJCQkJCQl0cC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQkJfQorCQkJCQlpZiAoc3RhdHVzICYgVHgwTm9DYXJyaWVyKSB0cC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQkJaWYgKHN0YXR1cyAmIFR4MExhdGVDb2xsKSB0cC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQkJCQlpZiAoc3RhdHVzICYgVHgwVW5kZXJmbG93KSB0cC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCQl9IGVsc2UgeworCQkJCQl0cC0+c3RhdHMudHhfYnl0ZXMgKz0gdHAtPnR4X3JpbmdbZW50cnldLmxlbmd0aCAmIDB4N2ZmOworCQkJCQl0cC0+c3RhdHMuY29sbGlzaW9ucyArPSAoc3RhdHVzID4+IDMpICYgMTU7CisJCQkJCXRwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQkJfQorCisJCQkJLyogRnJlZSB0aGUgb3JpZ2luYWwgc2tiLiAqLworCQkJCWRldl9rZnJlZV9za2JfaXJxKHRwLT50eF9za2J1ZmZbZW50cnldKTsKKwkJCQl0cC0+dHhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCQl9CisKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQkJaWYgKHRwLT5jdXJfdHggLSBkaXJ0eV90eCA+IFRYX1JJTkdfU0laRSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IE91dC1vZi1zeW5jIGRpcnR5IHBvaW50ZXIsICVkIHZzLiAlZCwgZnVsbD0lZC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgZGlydHlfdHgsIHRwLT5jdXJfdHgsIHRwLT50eF9mdWxsKTsKKwkJCQlkaXJ0eV90eCArPSBUWF9SSU5HX1NJWkU7CisJCQl9CisjZW5kaWYKKworCQkJaWYgKHRwLT50eF9mdWxsICYmCisJCQkgICAgdHAtPmN1cl90eCAtIGRpcnR5X3R4ICA8IFRYX1JJTkdfU0laRSAtIDIpCisJCQkJLyogVGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwgKi8KKwkJCQl0cC0+dHhfZnVsbCA9IDA7CisKKwkJCWlmICh0cC0+dHhfZnVsbCkKKwkJCQluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCQkJZWxzZQorCQkJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisKKwkJCXRwLT5kaXJ0eV90eCA9IGRpcnR5X3R4OworCQkJaWYgKGNzcjUgJiBUeERpZWQpIHsKKwkJCQlpZiAoeGlyY29tX2RlYnVnID4gMikKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRoZSB0cmFuc21pdHRlciBzdG9wcGVkLiIKKwkJCQkJCSAgICIgIENTUjUgaXMgJXgsIENTUjYgJXgsIG5ldyBDU1I2ICV4LlxuIiwKKwkJCQkJCSAgIGRldi0+bmFtZSwgY3NyNSwgaW5sKGlvYWRkciArIENTUjYpLCB0cC0+Y3NyNik7CisJCQkJb3V0bF9DU1I2KHRwLT5jc3I2IHwgRW5hYmxlUngsIGlvYWRkcik7CisJCQkJb3V0bF9DU1I2KHRwLT5jc3I2IHwgRW5hYmxlVHhSeCwgaW9hZGRyKTsKKwkJCX0KKwkJfQorCisJCS8qIExvZyBlcnJvcnMuICovCisJCWlmIChjc3I1ICYgQWJub3JtYWxJbnRyKSB7CS8qIEFibm9ybWFsIGVycm9yIHN1bW1hcnkgYml0LiAqLworCQkJaWYgKGNzcjUgJiBMaW5rQ2hhbmdlKQorCQkJCXhpcmNvbV9tZWRpYV9jaGFuZ2UoZGV2KTsKKwkJCWlmIChjc3I1ICYgVHhGSUZPVW5kZXJmbG93KSB7CisJCQkJaWYgKCh0cC0+Y3NyNiAmIFR4VGhyZXNoTWFzaykgIT0gVHhUaHJlc2hNYXNrKQorCQkJCQl0cC0+Y3NyNiArPSAoMSA8PCBUeFRocmVzaFNoaWZ0KTsJLyogQnVtcCB1cCB0aGUgVHggdGhyZXNob2xkICovCisJCQkJZWxzZQorCQkJCQl0cC0+Y3NyNiB8PSBUeFN0b3JlRm9ydzsgIC8qIFN0b3JlLW4tZm9yd2FyZC4gKi8KKwkJCQkvKiBSZXN0YXJ0IHRoZSB0cmFuc21pdCBwcm9jZXNzLiAqLworCQkJCW91dGxfQ1NSNih0cC0+Y3NyNiB8IEVuYWJsZVJ4LCBpb2FkZHIpOworCQkJCW91dGxfQ1NSNih0cC0+Y3NyNiB8IEVuYWJsZVR4UngsIGlvYWRkcik7CisJCQl9CisJCQlpZiAoY3NyNSAmIFJ4RGllZCkgewkJLyogTWlzc2VkIGEgUnggZnJhbWUuICovCisJCQkJdHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCXRwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IGlubChpb2FkZHIgKyBDU1I4KSAmIDB4ZmZmZjsKKwkJCQlvdXRsX0NTUjYodHAtPmNzcjYgfCBFbmFibGVUeFJ4LCBpb2FkZHIpOworCQkJfQorCQkJLyogQ2xlYXIgYWxsIGVycm9yIHNvdXJjZXMsIGluY2x1ZGVkIHVuZG9jdW1lbnRlZCBvbmVzISAqLworCQkJb3V0bCgweDA4MDBmN2JhLCBpb2FkZHIgKyBDU1I1KTsKKwkJfQorCQlpZiAoLS13b3JrX2J1ZGdldCA8IDApIHsKKwkJCWlmICh4aXJjb21fZGVidWcgPiAxKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUb28gbXVjaCB3b3JrIGR1cmluZyBhbiBpbnRlcnJ1cHQsICIKKwkJCQkJICAgImNzcjU9MHglOC44eC5cbiIsIGRldi0+bmFtZSwgY3NyNSk7CisJCQkvKiBBY2tub3dsZWRnZSBhbGwgaW50ZXJydXB0IHNvdXJjZXMuICovCisJCQlvdXRsKDB4ODAwMWZmZmYsIGlvYWRkciArIENTUjUpOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgxKTsKKworCWlmICh4aXJjb21fZGVidWcgPiAzKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4aXRpbmcgaW50ZXJydXB0LCBjc3I1PSUjNC40eC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGlubChpb2FkZHIgKyBDU1I1KSk7CisKKwlzcGluX3VubG9jayAoJnRwLT5sb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCitzdGF0aWMgaW50Cit4aXJjb21fcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZW50cnkgPSB0cC0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOworCWludCByeF93b3JrX2xpbWl0ID0gdHAtPmRpcnR5X3J4ICsgUlhfUklOR19TSVpFIC0gdHAtPmN1cl9yeDsKKwlpbnQgd29ya19kb25lID0gMDsKKworCWlmICh4aXJjb21fZGVidWcgPiA0KQorCQlwcmludGsoS0VSTl9ERUJVRyAiIEluIHhpcmNvbV9yeCgpLCBlbnRyeSAlZCAlOC44eC5cbiIsIGVudHJ5LAorCQkJICAgdHAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyk7CisJLyogSWYgd2Ugb3duIHRoZSBuZXh0IGVudHJ5LCBpdCdzIGEgbmV3IHBhY2tldC4gU2VuZCBpdCB1cC4gKi8KKwl3aGlsZSAodHAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyA+PSAwKSB7CisJCXMzMiBzdGF0dXMgPSB0cC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzOworCisJCWlmICh4aXJjb21fZGVidWcgPiA1KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiBJbiB4aXJjb21fcngoKSwgZW50cnkgJWQgJTguOHguXG4iLCBlbnRyeSwKKwkJCQkgICB0cC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzKTsKKwkJaWYgKC0tcnhfd29ya19saW1pdCA8IDApCisJCQlicmVhazsKKwkJaWYgKChzdGF0dXMgJiAweDM4MDA4MzAwKSAhPSAweDAzMDApIHsKKwkJCWlmICgoc3RhdHVzICYgMHgzODAwMDMwMCkgIT0gMHgwMzAwKSB7CisJCQkJLyogSWdub3JlIGVhcmxpZXIgYnVmZmVycy4gKi8KKwkJCQlpZiAoKHN0YXR1cyAmIDB4ZmZmZikgIT0gMHg3ZmZmKSB7CisJCQkJCWlmICh4aXJjb21fZGVidWcgPiAxKQorCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE92ZXJzaXplZCBFdGhlcm5ldCBmcmFtZSAiCisJCQkJCQkJICAgInNwYW5uZWQgbXVsdGlwbGUgYnVmZmVycywgc3RhdHVzICU4Ljh4IVxuIiwKKwkJCQkJCQkgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisJCQkJCXRwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQkJfQorCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBSeDBEZXNjRXJyb3IpIHsKKwkJCQkvKiBUaGVyZSB3YXMgYSBmYXRhbCBlcnJvci4gKi8KKwkJCQlpZiAoeGlyY29tX2RlYnVnID4gMikKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSZWNlaXZlIGVycm9yLCBSeCBzdGF0dXMgJTguOHguXG4iLAorCQkJCQkJICAgZGV2LT5uYW1lLCBzdGF0dXMpOworCQkJCXRwLT5zdGF0cy5yeF9lcnJvcnMrKzsgLyogZW5kIG9mIGEgcGFja2V0LiovCisJCQkJaWYgKHN0YXR1cyAmIChSeDBSdW50IHwgUngwSHVnZUZyYW1lKSkgdHAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQlpZiAoc3RhdHVzICYgUngwQ1JDRXJyb3IpIHRwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBPbWl0IHRoZSBmb3VyIG9jdGV0IENSQyBmcm9tIHRoZSBsZW5ndGguICovCisJCQlzaG9ydCBwa3RfbGVuID0gKChzdGF0dXMgPj4gMTYpICYgMHg3ZmYpIC0gNDsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQkJaWYgKHBrdF9sZW4gPiAxNTE4KSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEJvZ3VzIHBhY2tldCBzaXplIG9mICVkICglI3gpLlxuIiwKKwkJCQkJICAgZGV2LT5uYW1lLCBwa3RfbGVuLCBwa3RfbGVuKTsKKwkJCQlwa3RfbGVuID0gMTUxODsKKwkJCQl0cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJfQorI2VuZGlmCisJCQkvKiBDaGVjayBpZiB0aGUgcGFja2V0IGlzIGxvbmcgZW5vdWdoIHRvIGFjY2VwdCB3aXRob3V0IGNvcHlpbmcKKwkJCSAgIHRvIGEgbWluaW1hbGx5LXNpemVkIHNrYnVmZi4gKi8KKwkJCWlmIChwa3RfbGVuIDwgcnhfY29weWJyZWFrCisJCQkJJiYgKHNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpKSAhPSBOVUxMKSB7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCisjaWYgISBkZWZpbmVkKF9fYWxwaGFfXykKKwkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgYnVzX3RvX3ZpcnQodHAtPnJ4X3JpbmdbZW50cnldLmJ1ZmZlcjEpLAorCQkJCQkJCQkgcGt0X2xlbiwgMCk7CisJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworI2Vsc2UKKwkJCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdF9sZW4pLAorCQkJCQkgICBidXNfdG9fdmlydCh0cC0+cnhfcmluZ1tlbnRyeV0uYnVmZmVyMSksIHBrdF9sZW4pOworI2VuZGlmCisJCQkJd29ya19kb25lKys7CisJCQl9IGVsc2UgeyAJLyogUGFzcyB1cCB0aGUgc2tiIGFscmVhZHkgb24gdGhlIFJ4IHJpbmcuICovCisJCQkJc2tiX3B1dChza2IgPSB0cC0+cnhfc2tidWZmW2VudHJ5XSwgcGt0X2xlbik7CisJCQkJdHAtPnJ4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJfQorCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJdHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCXRwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQl9CisJCWVudHJ5ID0gKCsrdHAtPmN1cl9yeCkgJSBSWF9SSU5HX1NJWkU7CisJfQorCisJLyogUmVmaWxsIHRoZSBSeCByaW5nIGJ1ZmZlcnMuICovCisJZm9yICg7IHRwLT5jdXJfcnggLSB0cC0+ZGlydHlfcnggPiAwOyB0cC0+ZGlydHlfcngrKykgeworCQllbnRyeSA9IHRwLT5kaXJ0eV9yeCAlIFJYX1JJTkdfU0laRTsKKwkJaWYgKHRwLT5yeF9za2J1ZmZbZW50cnldID09IE5VTEwpIHsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisJCQlza2IgPSB0cC0+cnhfc2tidWZmW2VudHJ5XSA9IGRldl9hbGxvY19za2IoUEtUX0JVRl9TWik7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJYnJlYWs7CisJCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCQl0cC0+cnhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IHZpcnRfdG9fYnVzKHNrYi0+dGFpbCk7CisJCQl3b3JrX2RvbmUrKzsKKwkJfQorCQl0cC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzID0gUngwRGVzY093bmVkOworCX0KKworCXJldHVybiB3b3JrX2RvbmU7Cit9CisKKworc3RhdGljIHZvaWQKK3hpcmNvbV9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBieSBjbGVhcmluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJb3V0bCgwLCBpb2FkZHIgKyBDU1I3KTsKKwkvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KKwlvdXRsX0NTUjYoaW5sKGlvYWRkciArIENTUjYpICYgfkVuYWJsZVR4UngsIGlvYWRkcik7CisKKwlpZiAoaW5sKGlvYWRkciArIENTUjYpICE9IDB4ZmZmZmZmZmYpCisJCXRwLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IGlubChpb2FkZHIgKyBDU1I4KSAmIDB4ZmZmZjsKKworCWRldi0+aWZfcG9ydCA9IHRwLT5zYXZlZF9pZl9wb3J0OworfQorCisKK3N0YXRpYyBpbnQKK3hpcmNvbV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IHhpcmNvbV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwlpZiAoeGlyY29tX2RlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBTaHV0dGluZyBkb3duIGV0aGVyY2FyZCwgc3RhdHVzIHdhcyAlMi4yeC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGlubChpb2FkZHIgKyBDU1I1KSk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAobmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKwkJeGlyY29tX2Rvd24oZGV2KTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJLyogRnJlZSBhbGwgdGhlIHNrYnVmZnMgaW4gdGhlIFJ4IHF1ZXVlLiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHAtPnJ4X3NrYnVmZltpXTsKKwkJdHAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJCXRwLT5yeF9yaW5nW2ldLnN0YXR1cyA9IDA7CQkvKiBOb3Qgb3duZWQgYnkgWGlyY29tIGNoaXAuICovCisJCXRwLT5yeF9yaW5nW2ldLmxlbmd0aCA9IDA7CisJCXRwLT5yeF9yaW5nW2ldLmJ1ZmZlcjEgPSAweEJBREYwMEQwOyAvKiBBbiBpbnZhbGlkIGFkZHJlc3MuICovCisJCWlmIChza2IpIHsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJaWYgKHRwLT50eF9za2J1ZmZbaV0pCisJCQlkZXZfa2ZyZWVfc2tiKHRwLT50eF9za2J1ZmZbaV0pOworCQl0cC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwl9CisKKwl0cC0+b3BlbiA9IDA7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp4aXJjb21fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHhpcmNvbV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWlmIChuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKQorCQl0cC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBpbmwoaW9hZGRyICsgQ1NSOCkgJiAweGZmZmY7CisKKwlyZXR1cm4gJnRwLT5zdGF0czsKK30KKworc3RhdGljIGludCB4aXJjb21fZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwllY21kLT5zdXBwb3J0ZWQgPQorCQkJU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8CisJCQlTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKKwkJCVNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwKKwkJCVNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKKwkJCVNVUFBPUlRFRF9BdXRvbmVnIHwKKwkJCVNVUFBPUlRFRF9NSUk7CisKKwllY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfTUlJOworCWlmICh0cC0+YWR2ZXJ0aXNpbmdbMF0gJiBBRFZFUlRJU0VfMTBIQUxGKQorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZjsKKwlpZiAodHAtPmFkdmVydGlzaW5nWzBdICYgQURWRVJUSVNFXzEwRlVMTCkKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGw7CisJaWYgKHRwLT5hZHZlcnRpc2luZ1swXSAmIEFEVkVSVElTRV8xMDBIQUxGKQorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGY7CisJaWYgKHRwLT5hZHZlcnRpc2luZ1swXSAmIEFEVkVSVElTRV8xMDBGVUxMKQorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGw7CisJaWYgKHRwLT5hdXRvbmVnKSB7CisJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXV0b25lZzsKKwkJZWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOworCX0gZWxzZQorCQllY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCisJZWNtZC0+cG9ydCA9IFBPUlRfTUlJOworCWVjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsKKwllY21kLT5waHlfYWRkcmVzcyA9IHRwLT5waHlzWzBdOworCWVjbWQtPnNwZWVkID0gdHAtPnNwZWVkMTAwID8gU1BFRURfMTAwIDogU1BFRURfMTA7CisJZWNtZC0+ZHVwbGV4ID0gdHAtPmZ1bGxfZHVwbGV4ID8gRFVQTEVYX0ZVTEwgOiBEVVBMRVhfSEFMRjsKKwllY21kLT5tYXh0eHBrdCA9IFRYX1JJTkdfU0laRSAvIDI7CisJZWNtZC0+bWF4cnhwa3QgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhpcmNvbV9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCB4aXJjb21fcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNiBhdXRvbmVnLCBzcGVlZDEwMCwgZnVsbF9kdXBsZXg7CisKKwlhdXRvbmVnID0gKGVjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpOworCXNwZWVkMTAwID0gKGVjbWQtPnNwZWVkID09IFNQRUVEXzEwMCk7CisJZnVsbF9kdXBsZXggPSAoZWNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKTsKKworCXRwLT5hdXRvbmVnID0gYXV0b25lZzsKKwlpZiAoc3BlZWQxMDAgIT0gdHAtPnNwZWVkMTAwIHx8CisJICAgIGZ1bGxfZHVwbGV4ICE9IHRwLT5mdWxsX2R1cGxleCkgeworCQl0cC0+c3BlZWQxMDAgPSBzcGVlZDEwMDsKKwkJdHAtPmZ1bGxfZHVwbGV4ID0gZnVsbF9kdXBsZXg7CisJCS8qIGNoYW5nZSBhZHZlcnRpc2luZyBiaXRzICovCisJCXRwLT5hZHZlcnRpc2luZ1swXSAmPSB+KEFEVkVSVElTRV8xMEhBTEYgfAorCQkJCSAgICAgQURWRVJUSVNFXzEwRlVMTCB8CisJCQkJICAgICBBRFZFUlRJU0VfMTAwSEFMRiB8CisJCQkJICAgICBBRFZFUlRJU0VfMTAwRlVMTCB8CisJCQkJICAgICBBRFZFUlRJU0VfMTAwQkFTRTQpOworCQlpZiAoc3BlZWQxMDApIHsKKwkJCWlmIChmdWxsX2R1cGxleCkKKwkJCQl0cC0+YWR2ZXJ0aXNpbmdbMF0gfD0gQURWRVJUSVNFXzEwMEZVTEw7CisJCQllbHNlCisJCQkJdHAtPmFkdmVydGlzaW5nWzBdIHw9IEFEVkVSVElTRV8xMDBIQUxGOworCQl9IGVsc2UgeworCQkJaWYgKGZ1bGxfZHVwbGV4KQorCQkJCXRwLT5hZHZlcnRpc2luZ1swXSB8PSBBRFZFUlRJU0VfMTBGVUxMOworCQkJZWxzZQorCQkJCXRwLT5hZHZlcnRpc2luZ1swXSB8PSBBRFZFUlRJU0VfMTBIQUxGOworCQl9CisJfQorCWNoZWNrX2R1cGxleChkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB4aXJjb21fZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7CisJc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHRwLT5wZGV2KSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgb3BzID0geworCS5nZXRfc2V0dGluZ3MgPSB4aXJjb21fZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgPSB4aXJjb21fc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbyA9IHhpcmNvbV9nZXRfZHJ2aW5mbywKK307CisKKy8qIFByb3ZpZGUgaW9jdGwoKSBjYWxscyB0byBleGFtaW5lIHRoZSBNSUkgeGN2ciBzdGF0ZS4gKi8KK3N0YXRpYyBpbnQgeGlyY29tX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IHhpcmNvbV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdTE2ICpkYXRhID0gKHUxNiAqKSZycS0+aWZyX2lmcnU7CisJaW50IHBoeSA9IHRwLT5waHlzWzBdICYgMHgxZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3dpdGNoKGNtZCkgeworCS8qIExlZ2FjeSBtaWktZGlhZyBpbnRlcmZhY2UgKi8KKwljYXNlIFNJT0NHTUlJUEhZOgkJLyogR2V0IGFkZHJlc3Mgb2YgTUlJIFBIWSBpbiB1c2UuICovCisJCWlmICh0cC0+bWlpX2NudCkKKwkJCWRhdGFbMF0gPSBwaHk7CisJCWVsc2UKKwkJCXJldHVybiAtRU5PREVWOworCQlyZXR1cm4gMDsKKwljYXNlIFNJT0NHTUlJUkVHOgkJLyogUmVhZCBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCQlzYXZlX2ZsYWdzKGZsYWdzKTsKKwkJY2xpKCk7CisJCWRhdGFbM10gPSBtZGlvX3JlYWQoZGV2LCBkYXRhWzBdICYgMHgxZiwgZGF0YVsxXSAmIDB4MWYpOworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBTSU9DU01JSVJFRzoJCS8qIFdyaXRlIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCXNhdmVfZmxhZ3MoZmxhZ3MpOworCQljbGkoKTsKKwkJaWYgKGRhdGFbMF0gPT0gdHAtPnBoeXNbMF0pIHsKKwkJCXUxNiB2YWx1ZSA9IGRhdGFbMl07CisJCQlzd2l0Y2ggKGRhdGFbMV0pIHsKKwkJCWNhc2UgMDoKKwkJCQlpZiAodmFsdWUgJiAoQk1DUl9SRVNFVCB8IEJNQ1JfQU5FTkFCTEUpKQorCQkJCQkvKiBBdXRvbmVnb3RpYXRpb24uICovCisJCQkJCXRwLT5hdXRvbmVnID0gMTsKKwkJCQllbHNlIHsKKwkJCQkJdHAtPmZ1bGxfZHVwbGV4ID0gKHZhbHVlICYgQk1DUl9GVUxMRFBMWCkgPyAxIDogMDsKKwkJCQkJdHAtPmF1dG9uZWcgPSAwOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQl0cC0+YWR2ZXJ0aXNpbmdbMF0gPSB2YWx1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNoZWNrX2R1cGxleChkZXYpOworCQl9CisJCW1kaW9fd3JpdGUoZGV2LCBkYXRhWzBdICYgMHgxZiwgZGF0YVsxXSAmIDB4MWYsIGRhdGFbMl0pOworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworLyogU2V0IG9yIGNsZWFyIHRoZSBtdWx0aWNhc3QgZmlsdGVyIGZvciB0aGlzIGFkYXB0b3IuCisgICBOb3RlIHRoYXQgd2Ugb25seSB1c2UgZXhjbHVzaW9uIGFyb3VuZCBhY3R1YWxseSBxdWV1ZWluZyB0aGUKKyAgIG5ldyBmcmFtZSwgbm90IGFyb3VuZCBmaWxsaW5nIHRwLT5zZXR1cF9mcmFtZS4gIFRoaXMgaXMgbm9uLWRldGVybWluaXN0aWMKKyAgIHdoZW4gcmUtZW50ZXJlZCBidXQgc3RpbGwgY29ycmVjdC4gKi8KK3N0YXRpYyB2b2lkIHNldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHhpcmNvbV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgY3NyNiA9IGlubChpb2FkZHIgKyBDU1I2KTsKKwl1MTYgKmVhZGRycywgKnNldHVwX2ZybTsKKwl1MzIgdHhfZmxhZ3M7CisJaW50IGk7CisKKwl0cC0+Y3NyNiAmPSB+KEFsbE11bHRpQml0IHwgUHJvbWlzY0JpdCB8IEhhc2hGaWx0ZXJCaXQpOworCWNzcjYgJj0gfihBbGxNdWx0aUJpdCB8IFByb21pc2NCaXQgfCBIYXNoRmlsdGVyQml0KTsKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CQkJLyogU2V0IHByb21pc2N1b3VzLiAqLworCQl0cC0+Y3NyNiB8PSBQcm9taXNjQml0OworCQljc3I2IHw9IFByb21pc2NCaXQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmICgoZGV2LT5tY19jb3VudCA+IDEwMDApIHx8IChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQkvKiBUb28gbWFueSB0byBmaWx0ZXIgd2VsbCAtLSBhY2NlcHQgYWxsIG11bHRpY2FzdHMuICovCisJCXRwLT5jc3I2IHw9IEFsbE11bHRpQml0OworCQljc3I2IHw9IEFsbE11bHRpQml0OworCQlnb3RvIG91dDsKKwl9CisKKwl0eF9mbGFncyA9IFR4MVdob2xlUGt0IHwgVHgxU2V0dXBQa3QgfCBQS1RfU0VUVVBfU1o7CisKKwkvKiBOb3RlIHRoYXQgb25seSB0aGUgbG93LWFkZHJlc3Mgc2hvcnR3b3JkIG9mIHNldHVwX2ZyYW1lIGlzIHZhbGlkISAqLworCXNldHVwX2ZybSA9IHRwLT5zZXR1cF9mcmFtZTsKKwltY2xpc3QgPSBkZXYtPm1jX2xpc3Q7CisKKwkvKiBGaWxsIHRoZSBmaXJzdCBlbnRyeSB3aXRoIG91ciBwaHlzaWNhbCBhZGRyZXNzLiAqLworCWVhZGRycyA9ICh1MTYgKilkZXYtPmRldl9hZGRyOworCSpzZXR1cF9mcm0gPSBjcHVfdG9fbGUxNihlYWRkcnNbMF0pOyBzZXR1cF9mcm0gKz0gMjsKKwkqc2V0dXBfZnJtID0gY3B1X3RvX2xlMTYoZWFkZHJzWzFdKTsgc2V0dXBfZnJtICs9IDI7CisJKnNldHVwX2ZybSA9IGNwdV90b19sZTE2KGVhZGRyc1syXSk7IHNldHVwX2ZybSArPSAyOworCisJaWYgKGRldi0+bWNfY291bnQgPiAxNCkgeyAvKiBNdXN0IHVzZSBhIG11bHRpY2FzdCBoYXNoIHRhYmxlLiAqLworCQl1MzIgKmhhc2hfdGFibGUgPSAodTMyICopKHRwLT5zZXR1cF9mcmFtZSArIDQgKiAxMik7CisJCXUzMiBoYXNoLCBoYXNoMjsKKworCQl0eF9mbGFncyB8PSBUeDFIYXNoU2V0dXA7CisJCXRwLT5jc3I2IHw9IEhhc2hGaWx0ZXJCaXQ7CisJCWNzcjYgfD0gSGFzaEZpbHRlckJpdDsKKworCQkvKiBGaWxsIHRoZSB1bnVzZWQgMyBlbnRyaWVzIHdpdGggdGhlIGJyb2FkY2FzdCBhZGRyZXNzLgorCQkgICBBdCBsZWFzdCBvbmUgZW50cnkgKm11c3QqIGNvbnRhaW4gdGhlIGJyb2FkY2FzdCBhZGRyZXNzISEhKi8KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJKnNldHVwX2ZybSA9IDB4ZmZmZjsgc2V0dXBfZnJtICs9IDI7CisJCQkqc2V0dXBfZnJtID0gMHhmZmZmOyBzZXR1cF9mcm0gKz0gMjsKKwkJCSpzZXR1cF9mcm0gPSAweGZmZmY7IHNldHVwX2ZybSArPSAyOworCQl9CisKKwkJLyogVHJ1bHkgYnJhaW4tZGFtYWdlZCBoYXNoIGZpbHRlciBsYXlvdXQgKi8KKwkJLyogWFhYOiBub3Qgc3VyZSBpZiBJIHNob3VsZCB0YWtlIHRoZSBsYXN0IG9yIHRoZSBmaXJzdCA5IGJpdHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQl1MzIgKmhwdHI7CisJCQloYXNoID0gZXRoZXJfY3JjKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKSAmIDB4MWZmOworCQkJaWYgKGhhc2ggPCAzODQpIHsKKwkJCQloYXNoMiA9IGhhc2ggKyAoKGhhc2ggPj4gNCkgPDwgNCkgKworCQkJCQkoKGhhc2ggPj4gNSkgPDwgNSk7CisJCQl9IGVsc2UgeworCQkJCWhhc2ggLT0gMzg0OworCQkJCWhhc2gyID0gNjQgKyBoYXNoICsgKGhhc2ggPj4gNCkgKiA4MDsKKwkJCX0KKwkJCWhwdHIgPSAmaGFzaF90YWJsZVtoYXNoMiAmIH4weDFmXTsKKwkJCSpocHRyIHw9IGNwdV90b19sZTMyKDEgPDwgKGhhc2gyICYgMHgxZikpOworCQl9CisJfSBlbHNlIHsKKwkJLyogV2UgaGF2ZSA8PSAxNCBtY2FzdCBhZGRyZXNzZXMgc28gd2UgY2FuIHVzZSBYaXJjb20ncworCQkgICB3b25kZXJmdWwgMTYtYWRkcmVzcyBwZXJmZWN0IGZpbHRlci4gKi8KKwkJZm9yIChpID0gMDsgaSA8IGRldi0+bWNfY291bnQ7IGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQllYWRkcnMgPSAodTE2ICopbWNsaXN0LT5kbWlfYWRkcjsKKwkJCSpzZXR1cF9mcm0gPSBjcHVfdG9fbGUxNihlYWRkcnNbMF0pOyBzZXR1cF9mcm0gKz0gMjsKKwkJCSpzZXR1cF9mcm0gPSBjcHVfdG9fbGUxNihlYWRkcnNbMV0pOyBzZXR1cF9mcm0gKz0gMjsKKwkJCSpzZXR1cF9mcm0gPSBjcHVfdG9fbGUxNihlYWRkcnNbMl0pOyBzZXR1cF9mcm0gKz0gMjsKKwkJfQorCQkvKiBGaWxsIHRoZSB1bnVzZWQgZW50cmllcyB3aXRoIHRoZSBicm9hZGNhc3QgYWRkcmVzcy4KKwkJICAgQXQgbGVhc3Qgb25lIGVudHJ5ICptdXN0KiBjb250YWluIHRoZSBicm9hZGNhc3QgYWRkcmVzcyEhISovCisJCWZvciAoOyBpIDwgMTU7IGkrKykgeworCQkJKnNldHVwX2ZybSA9IDB4ZmZmZjsgc2V0dXBfZnJtICs9IDI7CisJCQkqc2V0dXBfZnJtID0gMHhmZmZmOyBzZXR1cF9mcm0gKz0gMjsKKwkJCSpzZXR1cF9mcm0gPSAweGZmZmY7IHNldHVwX2ZybSArPSAyOworCQl9CisJfQorCisJLyogTm93IGFkZCB0aGlzIGZyYW1lIHRvIHRoZSBUeCBsaXN0LiAqLworCWlmICh0cC0+Y3VyX3R4IC0gdHAtPmRpcnR5X3R4ID4gVFhfUklOR19TSVpFIC0gMikgeworCQkvKiBTYW1lIHNldHVwIHJlY2VudGx5IHF1ZXVlZCwgd2UgbmVlZCBub3QgYWRkIGl0LiAqLworCQkvKiBYWFg6IEh1aD8gQWxsIGl0IG1lYW5zIGlzIHRoYXQgdGhlIFR4IGxpc3QgaXMgZnVsbC4uLiovCisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJdW5zaWduZWQgaW50IGVudHJ5OworCQlpbnQgZHVtbXkgPSAtMTsKKworCQlzYXZlX2ZsYWdzKGZsYWdzKTsgY2xpKCk7CisJCWVudHJ5ID0gdHAtPmN1cl90eCsrICUgVFhfUklOR19TSVpFOworCisJCWlmIChlbnRyeSAhPSAwKSB7CisJCQkvKiBBdm9pZCBhIGNoaXAgZXJyYXRhIGJ5IHByZWZpeGluZyBhIGR1bW15IGVudHJ5LiAqLworCQkJdHAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJdHAtPnR4X3JpbmdbZW50cnldLmxlbmd0aCA9CisJCQkJKGVudHJ5ID09IFRYX1JJTkdfU0laRSAtIDEpID8gVHgxUmluZ1dyYXAgOiAwOworCQkJdHAtPnR4X3JpbmdbZW50cnldLmJ1ZmZlcjEgPSAwOworCQkJLyogcmFjZSB3aXRoIGNoaXAsIHNldCBUeDBEZXNjT3duZWQgbGF0ZXIgKi8KKwkJCWR1bW15ID0gZW50cnk7CisJCQllbnRyeSA9IHRwLT5jdXJfdHgrKyAlIFRYX1JJTkdfU0laRTsKKwkJfQorCisJCXRwLT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJLyogUHV0IHRoZSBzZXR1cCBmcmFtZSBvbiB0aGUgVHggbGlzdC4gKi8KKwkJaWYgKGVudHJ5ID09IFRYX1JJTkdfU0laRSAtIDEpCisJCQl0eF9mbGFncyB8PSBUeDFSaW5nV3JhcDsJCS8qIFdyYXAgcmluZy4gKi8KKwkJdHAtPnR4X3JpbmdbZW50cnldLmxlbmd0aCA9IHR4X2ZsYWdzOworCQl0cC0+dHhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IHZpcnRfdG9fYnVzKHRwLT5zZXR1cF9mcmFtZSk7CisJCXRwLT50eF9yaW5nW2VudHJ5XS5zdGF0dXMgPSBUeDBEZXNjT3duZWQ7CisJCWlmICh0cC0+Y3VyX3R4IC0gdHAtPmRpcnR5X3R4ID49IFRYX1JJTkdfU0laRSAtIDIpIHsKKwkJCXRwLT50eF9mdWxsID0gMTsKKwkJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisJCX0KKwkJaWYgKGR1bW15ID49IDApCisJCQl0cC0+dHhfcmluZ1tkdW1teV0uc3RhdHVzID0gVHgwRGVzY093bmVkOworCQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKKwkJLyogVHJpZ2dlciBhbiBpbW1lZGlhdGUgdHJhbnNtaXQgZGVtYW5kLiAqLworCQlvdXRsKDAsIGlvYWRkciArIENTUjEpOworCX0KKworb3V0OgorCW91dGxfQ1NSNihjc3I2LCBpb2FkZHIpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB4aXJjb21fcGNpX3RhYmxlW10gPSB7CisgIHsgMHgxMTVELCAweDAwMDMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFgzMjAxXzMgfSwKKyAgezB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB4aXJjb21fcGNpX3RhYmxlKTsKKworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHhpcmNvbV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwcmludGsoS0VSTl9JTkZPICJ4aXJjb21fc3VzcGVuZCglcylcbiIsIGRldi0+bmFtZSk7CisJaWYgKHRwLT5vcGVuKQorCQl4aXJjb21fZG93bihkZXYpOworCisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgMyk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHhpcmNvbV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgeGlyY29tX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwcmludGsoS0VSTl9JTkZPICJ4aXJjb21fcmVzdW1lKCVzKVxuIiwgZGV2LT5uYW1lKTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwwKTsKKwlwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKworCS8qIEJyaW5nIHRoZSBjaGlwIG91dCBvZiBzbGVlcCBtb2RlLgorCSAgIENhdXRpb246IFNub296ZSBtb2RlIGRvZXMgbm90IHdvcmsgd2l0aCBzb21lIGJvYXJkcyEgKi8KKwlpZiAoeGlyY29tX3RibFt0cC0+Y2hpcF9pZF0uZmxhZ3MgJiBIQVNfQUNQSSkKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgUENJX1BPV0VSTUdNVCwgMCk7CisKKwl0cmFuc2NlaXZlcl92b29kb28oZGV2KTsKKwlpZiAoeGlyY29tX3RibFt0cC0+Y2hpcF9pZF0uZmxhZ3MgJiBIQVNfTUlJKQorCQljaGVja19kdXBsZXgoZGV2KTsKKworCWlmICh0cC0+b3BlbikKKwkJeGlyY29tX3VwKGRldik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IHhpcmNvbV9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICJ4aXJjb21fcmVtb3ZlX29uZSglcylcbiIsIGRldi0+bmFtZSk7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCWZyZWVfbmV0ZGV2KGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB4aXJjb21fZHJpdmVyID0geworCS5uYW1lCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQk9IHhpcmNvbV9wY2lfdGFibGUsCisJLnByb2JlCQk9IHhpcmNvbV9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHhpcmNvbV9yZW1vdmVfb25lKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IHhpcmNvbV9zdXNwZW5kLAorCS5yZXN1bWUJCT0geGlyY29tX3Jlc3VtZQorI2VuZGlmIC8qIENPTkZJR19QTSAqLworfTsKKworCitzdGF0aWMgaW50IF9faW5pdCB4aXJjb21faW5pdCh2b2lkKQoreworLyogd2hlbiBhIG1vZHVsZSwgdGhpcyBpcyBwcmludGVkIHdoZXRoZXIgb3Igbm90IGRldmljZXMgYXJlIGZvdW5kIGluIHByb2JlICovCisjaWZkZWYgTU9EVUxFCisJcHJpbnRrKHZlcnNpb24pOworI2VuZGlmCisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmeGlyY29tX2RyaXZlcik7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IHhpcmNvbV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ4aXJjb21fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoeGlyY29tX2luaXQpCittb2R1bGVfZXhpdCh4aXJjb21fZXhpdCkKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWluZGVudC1sZXZlbDogNAorICogIGMtYmFzaWMtb2Zmc2V0OiA0CisgKiAgdGFiLXdpZHRoOiA0CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bi5jIGIvZHJpdmVycy9uZXQvdHVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JmZWUzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3R1bi5jCkBAIC0wLDAgKzEsODgzIEBACisvKgorICogIFRVTiAtIFVuaXZlcnNhbCBUVU4vVEFQIGRldmljZSBkcml2ZXIuCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDIgTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICRJZDogdHVuLmMsdiAxLjE1IDIwMDIvMDMvMDEgMDI6NDQ6MjQgbWF4ayBFeHAgJAorICovCisKKy8qCisgKiAgQ2hhbmdlczoKKyAqCisgKiAgTWFyayBTbWl0aCA8bWFya3p6enNtaXRoQHlhaG9vLmNvbS5hdT4KKyAqICAgVXNlIHJhbmRvbV9ldGhlcl9hZGRyKCkgZm9yIHRhcCBNQUMgYWRkcmVzcy4KKyAqCisgKiAgSGFyYWxkIFJvZWxsZSA8aGFyYWxkLnJvZWxsZUBpZmkubG11LmRlPiAgMjAwNC8wNC8yMAorICogICAgRml4ZXMgaW4gcGFja2V0IGRyb3BwaW5nLCBxdWV1ZSBsZW5ndGggc2V0dGluZyBhbmQgcXVldWUgd2FrZXVwLgorICogICAgSW5jcmVhc2VkIGRlZmF1bHQgdHggcXVldWUgbGVuZ3RoLgorICogICAgQWRkZWQgZXRodG9vbCBBUEkuCisgKiAgICBNaW5vciBjbGVhbnVwcworICoKKyAqICBEYW5pZWwgUG9kbGVqc2tpIDx1bmRlcmxleUB1bmRlcmxleS5ldS5vcmc+CisgKiAgICBNb2RpZmljYXRpb25zIGZvciAyLjMuOTktcHJlNSBrZXJuZWwuCisgKi8KKworI2RlZmluZSBEUlZfTkFNRQkidHVuIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS42IgorI2RlZmluZSBEUlZfREVTQ1JJUFRJT04JIlVuaXZlcnNhbCBUVU4vVEFQIGRldmljZSBkcml2ZXIiCisjZGVmaW5lIERSVl9DT1BZUklHSFQJIihDKSAxOTk5LTIwMDQgTWF4IEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4iCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3R1bi5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmZGVmIFRVTl9ERUJVRworc3RhdGljIGludCBkZWJ1ZzsKKyNlbmRpZgorCisvKiBOZXR3b3JrIGRldmljZSBwYXJ0IG9mIHRoZSBkcml2ZXIgKi8KKworc3RhdGljIExJU1RfSEVBRCh0dW5fZGV2X2xpc3QpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB0dW5fZXRodG9vbF9vcHM7CisKKy8qIE5ldCBkZXZpY2Ugb3Blbi4gKi8KK3N0YXRpYyBpbnQgdHVuX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyogTmV0IGRldmljZSBjbG9zZS4gKi8KK3N0YXRpYyBpbnQgdHVuX25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyogTmV0IGRldmljZSBzdGFydCB4bWl0ICovCitzdGF0aWMgaW50IHR1bl9uZXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4gPSBuZXRkZXZfcHJpdihkZXYpOworCisJREJHKEtFUk5fSU5GTyAiJXM6IHR1bl9uZXRfeG1pdCAlZFxuIiwgdHVuLT5kZXYtPm5hbWUsIHNrYi0+bGVuKTsKKworCS8qIERyb3AgcGFja2V0IGlmIGludGVyZmFjZSBpcyBub3QgYXR0YWNoZWQgKi8KKwlpZiAoIXR1bi0+YXR0YWNoZWQpCisJCWdvdG8gZHJvcDsKKworCS8qIFBhY2tldCBkcm9wcGluZyAqLworCWlmIChza2JfcXVldWVfbGVuKCZ0dW4tPnJlYWRxKSA+PSBkZXYtPnR4X3F1ZXVlX2xlbikgeworCQlpZiAoISh0dW4tPmZsYWdzICYgVFVOX09ORV9RVUVVRSkpIHsKKwkJCS8qIE5vcm1hbCBxdWV1ZWluZyBtb2RlLiAqLworCQkJLyogUGFja2V0IHNjaGVkdWxlciBoYW5kbGVzIGRyb3BwaW5nIG9mIGZ1cnRoZXIgcGFja2V0cy4gKi8KKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQkJLyogV2Ugd29uJ3Qgc2VlIGFsbCBkcm9wcGVkIHBhY2tldHMgaW5kaXZpZHVhbGx5LCBzbyBvdmVycnVuCisJCQkgKiBlcnJvciBpcyBtb3JlIGFwcHJvcHJpYXRlLiAqLworCQkJdHVuLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJLyogU2luZ2xlIHF1ZXVlIG1vZGUuCisJCQkgKiBEcml2ZXIgaGFuZGxlcyBkcm9wcGluZyBvZiBhbGwgcGFja2V0cyBpdHNlbGYuICovCisJCQlnb3RvIGRyb3A7CisJCX0KKwl9CisKKwkvKiBRdWV1ZSBwYWNrZXQgKi8KKwlza2JfcXVldWVfdGFpbCgmdHVuLT5yZWFkcSwgc2tiKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIE5vdGlmeSBhbmQgd2FrZSB1cCByZWFkZXIgcHJvY2VzcyAqLworCWlmICh0dW4tPmZsYWdzICYgVFVOX0ZBU1lOQykKKwkJa2lsbF9mYXN5bmMoJnR1bi0+ZmFzeW5jLCBTSUdJTywgUE9MTF9JTik7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dW4tPnJlYWRfd2FpdCk7CisJcmV0dXJuIDA7CisKK2Ryb3A6CisJdHVuLT5zdGF0cy50eF9kcm9wcGVkKys7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKKy8qKiBBZGQgdGhlIHNwZWNpZmllZCBFdGhlcm5ldCBhZGRyZXNzIHRvIHRoaXMgbXVsdGljYXN0IGZpbHRlci4gKi8KK3N0YXRpYyB2b2lkCithZGRfbXVsdGkodTMyKiBmaWx0ZXIsIGNvbnN0IHU4KiBhZGRyKQoreworCWludCBiaXRfbnIgPSBldGhlcl9jcmMoRVRIX0FMRU4sIGFkZHIpID4+IDI2OworCWZpbHRlcltiaXRfbnIgPj4gNV0gfD0gMSA8PCAoYml0X25yICYgMzEpOworfQorCisvKiogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgRXRoZXJuZXQgYWRkcmVzIGZyb20gdGhpcyBtdWx0aWNhc3QgZmlsdGVyLiAqLworc3RhdGljIHZvaWQKK2RlbF9tdWx0aSh1MzIqIGZpbHRlciwgY29uc3QgdTgqIGFkZHIpCit7CisJaW50IGJpdF9uciA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgYWRkcikgPj4gMjY7CisJZmlsdGVyW2JpdF9uciA+PiA1XSAmPSB+KDEgPDwgKGJpdF9uciAmIDMxKSk7Cit9CisKKy8qKiBVcGRhdGUgdGhlIGxpc3Qgb2YgbXVsdGljYXN0IGdyb3VwcyB0byB3aGljaCB0aGUgbmV0d29yayBkZXZpY2UgYmVsb25ncy4KKyAqIFRoaXMgbGlzdCBpcyB1c2VkIHRvIGZpbHRlciBwYWNrZXRzIGJlaW5nIHNlbnQgZnJvbSB0aGUgY2hhcmFjdGVyIGRldmljZSB0bworICogdGhlIG5ldHdvcmsgZGV2aWNlLiAqLworc3RhdGljIHZvaWQKK3R1bl9uZXRfbWNsaXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biA9IG5ldGRldl9wcml2KGRldik7CisJY29uc3Qgc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJaW50IGk7CisJREJHKEtFUk5fREVCVUcgIiVzOiB0dW5fbmV0X21jbGlzdDogbWNfY291bnQgJWRcbiIsCisJCQlkZXYtPm5hbWUsIGRldi0+bWNfY291bnQpOworCW1lbXNldCh0dW4tPmNocl9maWx0ZXIsIDAsIHNpemVvZiB0dW4tPmNocl9maWx0ZXIpOworCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgaSA8IGRldi0+bWNfY291bnQgJiYgbWNsaXN0ICE9IE5VTEw7CisJCQlpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQlhZGRfbXVsdGkodHVuLT5uZXRfZmlsdGVyLCBtY2xpc3QtPmRtaV9hZGRyKTsKKwkJREJHKEtFUk5fREVCVUcgIiVzOiB0dW5fbmV0X21jbGlzdDogJXg6JXg6JXg6JXg6JXg6JXhcbiIsCisJCQkJZGV2LT5uYW1lLAorCQkJCW1jbGlzdC0+ZG1pX2FkZHJbMF0sIG1jbGlzdC0+ZG1pX2FkZHJbMV0sIG1jbGlzdC0+ZG1pX2FkZHJbMl0sCisJCQkJbWNsaXN0LT5kbWlfYWRkclszXSwgbWNsaXN0LT5kbWlfYWRkcls0XSwgbWNsaXN0LT5kbWlfYWRkcls1XSk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnR1bl9uZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gJnR1bi0+c3RhdHM7Cit9CisKKy8qIEluaXRpYWxpemUgbmV0IGRldmljZS4gKi8KK3N0YXRpYyB2b2lkIHR1bl9uZXRfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4gPSBuZXRkZXZfcHJpdihkZXYpOworICAgCisJc3dpdGNoICh0dW4tPmZsYWdzICYgVFVOX1RZUEVfTUFTSykgeworCWNhc2UgVFVOX1RVTl9ERVY6CisJCS8qIFBvaW50LXRvLVBvaW50IFRVTiBEZXZpY2UgKi8KKwkJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSAwOworCQlkZXYtPmFkZHJfbGVuID0gMDsKKwkJZGV2LT5tdHUgPSAxNTAwOworCisJCS8qIFplcm8gaGVhZGVyIGxlbmd0aCAqLworCQlkZXYtPnR5cGUgPSBBUlBIUkRfTk9ORTsgCisJCWRldi0+ZmxhZ3MgPSBJRkZfUE9JTlRPUE9JTlQgfCBJRkZfTk9BUlAgfCBJRkZfTVVMVElDQVNUOworCQlkZXYtPnR4X3F1ZXVlX2xlbiA9IFRVTl9SRUFEUV9TSVpFOyAgLyogV2UgcHJlZmVyIG91ciBvd24gcXVldWUgbGVuZ3RoICovCisJCWJyZWFrOworCisJY2FzZSBUVU5fVEFQX0RFVjoKKwkJLyogRXRoZXJuZXQgVEFQIERldmljZSAqLworCQlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHR1bl9uZXRfbWNsaXN0OworCisJCWV0aGVyX3NldHVwKGRldik7CisJCXJhbmRvbV9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpOworCQlkZXYtPnR4X3F1ZXVlX2xlbiA9IFRVTl9SRUFEUV9TSVpFOyAgLyogV2UgcHJlZmVyIG91ciBvd24gcXVldWUgbGVuZ3RoICovCisJCWJyZWFrOworCX0KK30KKworLyogQ2hhcmFjdGVyIGRldmljZSBwYXJ0ICovCisKKy8qIFBvbGwgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHVuX2Nocl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICogd2FpdCkKK3sgIAorCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IG1hc2sgPSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKworCWlmICghdHVuKQorCQlyZXR1cm4gLUVCQURGRDsKKworCURCRyhLRVJOX0lORk8gIiVzOiB0dW5fY2hyX3BvbGxcbiIsIHR1bi0+ZGV2LT5uYW1lKTsKKworCXBvbGxfd2FpdChmaWxlLCAmdHVuLT5yZWFkX3dhaXQsIHdhaXQpOworIAorCWlmIChza2JfcXVldWVfbGVuKCZ0dW4tPnJlYWRxKSkKKwkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCisJcmV0dXJuIG1hc2s7Cit9CisKKy8qIEdldCBwYWNrZXQgZnJvbSB1c2VyIHNwYWNlIGJ1ZmZlciAqLworc3RhdGljIF9faW5saW5lX18gc3NpemVfdCB0dW5fZ2V0X3VzZXIoc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biwgc3RydWN0IGlvdmVjICppdiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB0dW5fcGkgcGkgPSB7IDAsIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApIH07CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzaXplX3QgbGVuID0gY291bnQsIGFsaWduID0gMDsKKworCWlmICghKHR1bi0+ZmxhZ3MgJiBUVU5fTk9fUEkpKSB7CisJCWlmICgobGVuIC09IHNpemVvZihwaSkpID4gY291bnQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZihtZW1jcHlfZnJvbWlvdmVjKCh2b2lkICopJnBpLCBpdiwgc2l6ZW9mKHBpKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoKHR1bi0+ZmxhZ3MgJiBUVU5fVFlQRV9NQVNLKSA9PSBUVU5fVEFQX0RFVikKKwkJYWxpZ24gPSBORVRfSVBfQUxJR047CisgCisJaWYgKCEoc2tiID0gYWxsb2Nfc2tiKGxlbiArIGFsaWduLCBHRlBfS0VSTkVMKSkpIHsKKwkJdHVuLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChhbGlnbikKKwkJc2tiX3Jlc2VydmUoc2tiLCBhbGlnbik7CisJaWYgKG1lbWNweV9mcm9taW92ZWMoc2tiX3B1dChza2IsIGxlbiksIGl2LCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNrYi0+ZGV2ID0gdHVuLT5kZXY7CisJc3dpdGNoICh0dW4tPmZsYWdzICYgVFVOX1RZUEVfTUFTSykgeworCWNhc2UgVFVOX1RVTl9ERVY6CisJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiLT5wcm90b2NvbCA9IHBpLnByb3RvOworCQlicmVhazsKKwljYXNlIFRVTl9UQVBfREVWOgorCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCB0dW4tPmRldik7CisJCWJyZWFrOworCX07CisKKwlpZiAodHVuLT5mbGFncyAmIFRVTl9OT0NIRUNLU1VNKQorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworIAorCW5ldGlmX3J4X25pKHNrYik7CisJdHVuLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworICAgCisJdHVuLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJdHVuLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisKKwlyZXR1cm4gY291bnQ7Cit9IAorCitzdGF0aWMgaW5saW5lIHNpemVfdCBpb3ZfdG90YWwoY29uc3Qgc3RydWN0IGlvdmVjICppdiwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGk7CisJc2l6ZV90IGxlbjsKKworCWZvciAoaSA9IDAsIGxlbiA9IDA7IGkgPCBjb3VudDsgaSsrKSAKKwkJbGVuICs9IGl2W2ldLmlvdl9sZW47CisKKwlyZXR1cm4gbGVuOworfQorCisvKiBXcml0ZXYgKi8KK3N0YXRpYyBzc2l6ZV90IHR1bl9jaHJfd3JpdGV2KHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3Qgc3RydWN0IGlvdmVjICppdiwgCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCF0dW4pCisJCXJldHVybiAtRUJBREZEOworCisJREJHKEtFUk5fSU5GTyAiJXM6IHR1bl9jaHJfd3JpdGUgJWxkXG4iLCB0dW4tPmRldi0+bmFtZSwgY291bnQpOworCisJcmV0dXJuIHR1bl9nZXRfdXNlcih0dW4sIChzdHJ1Y3QgaW92ZWMgKikgaXYsIGlvdl90b3RhbChpdiwgY291bnQpKTsKK30KKworLyogV3JpdGUgKi8KK3N0YXRpYyBzc2l6ZV90IHR1bl9jaHJfd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwgCisJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGlvdmVjIGl2ID0geyAodm9pZCBfX3VzZXIgKikgYnVmLCBjb3VudCB9OworCXJldHVybiB0dW5fY2hyX3dyaXRldihmaWxlLCAmaXYsIDEsIHBvcyk7Cit9CisKKy8qIFB1dCBwYWNrZXQgdG8gdGhlIHVzZXIgc3BhY2UgYnVmZmVyICovCitzdGF0aWMgX19pbmxpbmVfXyBzc2l6ZV90IHR1bl9wdXRfdXNlcihzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgICBzdHJ1Y3QgaW92ZWMgKml2LCBpbnQgbGVuKQoreworCXN0cnVjdCB0dW5fcGkgcGkgPSB7IDAsIHNrYi0+cHJvdG9jb2wgfTsKKwlzc2l6ZV90IHRvdGFsID0gMDsKKworCWlmICghKHR1bi0+ZmxhZ3MgJiBUVU5fTk9fUEkpKSB7CisJCWlmICgobGVuIC09IHNpemVvZihwaSkpIDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChsZW4gPCBza2ItPmxlbikgeworCQkJLyogUGFja2V0IHdpbGwgYmUgc3RyaXBlZCAqLworCQkJcGkuZmxhZ3MgfD0gVFVOX1BLVF9TVFJJUDsKKwkJfQorIAorCQlpZiAobWVtY3B5X3RvaW92ZWMoaXYsICh2b2lkICopICZwaSwgc2l6ZW9mKHBpKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJdG90YWwgKz0gc2l6ZW9mKHBpKTsKKwl9ICAgICAgIAorCisJbGVuID0gbWluX3QoaW50LCBza2ItPmxlbiwgbGVuKTsKKworCXNrYl9jb3B5X2RhdGFncmFtX2lvdmVjKHNrYiwgMCwgaXYsIGxlbik7CisJdG90YWwgKz0gbGVuOworCisJdHVuLT5zdGF0cy50eF9wYWNrZXRzKys7CisJdHVuLT5zdGF0cy50eF9ieXRlcyArPSBsZW47CisKKwlyZXR1cm4gdG90YWw7Cit9CisKKy8qIFJlYWR2ICovCitzdGF0aWMgc3NpemVfdCB0dW5fY2hyX3JlYWR2KHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKml2LAorCQkJICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzc2l6ZV90IGxlbiwgcmV0ID0gMDsKKworCWlmICghdHVuKQorCQlyZXR1cm4gLUVCQURGRDsKKworCURCRyhLRVJOX0lORk8gIiVzOiB0dW5fY2hyX3JlYWRcbiIsIHR1bi0+ZGV2LT5uYW1lKTsKKworCWxlbiA9IGlvdl90b3RhbChpdiwgY291bnQpOworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFkZF93YWl0X3F1ZXVlKCZ0dW4tPnJlYWRfd2FpdCwgJndhaXQpOworCXdoaWxlIChsZW4pIHsKKwkJY29uc3QgdTggb25lc1sgRVRIX0FMRU5dID0geyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH07CisJCXU4IGFkZHJbIEVUSF9BTEVOXTsKKwkJaW50IGJpdF9ucjsKKworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKworCQkvKiBSZWFkIGZyYW1lcyBmcm9tIHRoZSBxdWV1ZSAqLworCQlpZiAoIShza2I9c2tiX2RlcXVldWUoJnR1bi0+cmVhZHEpKSkgeworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogTm90aGluZyB0byByZWFkLCBsZXQncyBzbGVlcCAqLworCQkJc2NoZWR1bGUoKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW5ldGlmX3dha2VfcXVldWUodHVuLT5kZXYpOworCisJCS8qKiBEZWNpZGUgd2hldGhlciB0byBhY2NlcHQgdGhpcyBwYWNrZXQuIFRoaXMgY29kZSBpcyBkZXNpZ25lZCB0bworCQkgKiBiZWhhdmUgaWRlbnRpY2FsbHkgdG8gYW4gRXRoZXJuZXQgaW50ZXJmYWNlLiBBY2NlcHQgdGhlIHBhY2tldCBpZgorCQkgKiAtIHdlIGFyZSBwcm9taXNjdW91cy4KKwkJICogLSB0aGUgcGFja2V0IGlzIGFkZHJlc3NlZCB0byB1cy4KKwkJICogLSB0aGUgcGFja2V0IGlzIGJyb2FkY2FzdC4KKwkJICogLSB0aGUgcGFja2V0IGlzIG11bHRpY2FzdCBhbmQKKwkJICogICAtIHdlIGFyZSBtdWx0aWNhc3QgcHJvbWlzY291cy4KKwkJICogICAtIHdlIGJlbG9uZyB0byB0aGUgbXVsdGljYXN0IGdyb3VwLgorCQkgKi8KKwkJbWVtY3B5KGFkZHIsIHNrYi0+ZGF0YSwKKwkJICAgICAgIG1pbl90KHNpemVfdCwgc2l6ZW9mIGFkZHIsIHNrYi0+bGVuKSk7CisJCWJpdF9uciA9IGV0aGVyX2NyYyhzaXplb2YgYWRkciwgYWRkcikgPj4gMjY7CisJCWlmICgodHVuLT5pZl9mbGFncyAmIElGRl9QUk9NSVNDKSB8fAorCQkJCW1lbWNtcChhZGRyLCB0dW4tPmRldl9hZGRyLCBzaXplb2YgYWRkcikgPT0gMCB8fAorCQkJCW1lbWNtcChhZGRyLCBvbmVzLCBzaXplb2YgYWRkcikgPT0gMCB8fAorCQkJCSgoKGFkZHJbMF0gPT0gMSAmJiBhZGRyWzFdID09IDAgJiYgYWRkclsyXSA9PSAweDVlKSB8fAorCQkJCSAgKGFkZHJbMF0gPT0gMHgzMyAmJiBhZGRyWzFdID09IDB4MzMpKSAmJgorCQkJCSAoKHR1bi0+aWZfZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHx8CisJCQkJICAodHVuLT5jaHJfZmlsdGVyW2JpdF9uciA+PiA1XSAmICgxIDw8IChiaXRfbnIgJiAzMSkpKSkpKSB7CisJCQlEQkcoS0VSTl9ERUJVRyAiJXM6IHR1bl9jaHJfcmVhZHY6IGFjY2VwdGVkOiAleDoleDoleDoleDoleDoleFxuIiwKKwkJCQkJdHVuLT5kZXYtPm5hbWUsIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sCisJCQkJCWFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOworCQkJcmV0ID0gdHVuX3B1dF91c2VyKHR1biwgc2tiLCAoc3RydWN0IGlvdmVjICopIGl2LCBsZW4pOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCURCRyhLRVJOX0RFQlVHICIlczogdHVuX2Nocl9yZWFkdjogcmVqZWN0ZWQ6ICV4OiV4OiV4OiV4OiV4OiV4XG4iLAorCQkJCQl0dW4tPmRldi0+bmFtZSwgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwKKwkJCQkJYWRkclszXSwgYWRkcls0XSwgYWRkcls1XSk7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnR1bi0+cmVhZF93YWl0LCAmd2FpdCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZWFkICovCitzdGF0aWMgc3NpemVfdCB0dW5fY2hyX3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwgCisJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaW92ZWMgaXYgPSB7IGJ1ZiwgY291bnQgfTsKKwlyZXR1cm4gdHVuX2Nocl9yZWFkdihmaWxlLCAmaXYsIDEsIHBvcyk7Cit9CisKK3N0YXRpYyB2b2lkIHR1bl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4gPSBuZXRkZXZfcHJpdihkZXYpOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmdHVuLT5yZWFkcSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdHVuLT5yZWFkX3dhaXQpOworCisJdHVuLT5vd25lciA9IC0xOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWRldi0+b3BlbiA9IHR1bl9uZXRfb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHR1bl9uZXRfeG1pdDsKKwlkZXYtPnN0b3AgPSB0dW5fbmV0X2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gdHVuX25ldF9zdGF0czsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJnR1bl9ldGh0b29sX29wczsKKwlkZXYtPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldjsKK30KKworc3RhdGljIHN0cnVjdCB0dW5fc3RydWN0ICp0dW5fZ2V0X2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuOworCisJQVNTRVJUX1JUTkwoKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHR1biwgJnR1bl9kZXZfbGlzdCwgbGlzdCkgeworCQlpZiAoIXN0cm5jbXAodHVuLT5kZXYtPm5hbWUsIG5hbWUsIElGTkFNU0laKSkKKwkJICAgIHJldHVybiB0dW47CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgdHVuX3NldF9pZmYoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBpZnJlcSAqaWZyKQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW47CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgZXJyOworCisJdHVuID0gdHVuX2dldF9ieV9uYW1lKGlmci0+aWZyX25hbWUpOworCWlmICh0dW4pIHsKKwkJaWYgKHR1bi0+YXR0YWNoZWQpCisJCQlyZXR1cm4gLUVCVVNZOworCisJCS8qIENoZWNrIHBlcm1pc3Npb25zICovCisJCWlmICh0dW4tPm93bmVyICE9IC0xICYmCisJCSAgICBjdXJyZW50LT5ldWlkICE9IHR1bi0+b3duZXIgJiYgIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCX0gCisJZWxzZSBpZiAoX19kZXZfZ2V0X2J5X25hbWUoaWZyLT5pZnJfbmFtZSkpIAorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlIHsKKwkJY2hhciAqbmFtZTsKKwkJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwkJZXJyID0gLUVJTlZBTDsKKworCQkvKiBTZXQgZGV2IHR5cGUgKi8KKwkJaWYgKGlmci0+aWZyX2ZsYWdzICYgSUZGX1RVTikgeworCQkJLyogVFVOIGRldmljZSAqLworCQkJZmxhZ3MgfD0gVFVOX1RVTl9ERVY7CisJCQluYW1lID0gInR1biVkIjsKKwkJfSBlbHNlIGlmIChpZnItPmlmcl9mbGFncyAmIElGRl9UQVApIHsKKwkJCS8qIFRBUCBkZXZpY2UgKi8KKwkJCWZsYWdzIHw9IFRVTl9UQVBfREVWOworCQkJbmFtZSA9ICJ0YXAlZCI7CisJCX0gZWxzZSAKKwkJCWdvdG8gZmFpbGVkOworICAgCisJCWlmICgqaWZyLT5pZnJfbmFtZSkKKwkJCW5hbWUgPSBpZnItPmlmcl9uYW1lOworCisJCWRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IHR1bl9zdHJ1Y3QpLCBuYW1lLAorCQkJCSAgIHR1bl9zZXR1cCk7CisJCWlmICghZGV2KQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJdHVuID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJdHVuLT5kZXYgPSBkZXY7CisJCXR1bi0+ZmxhZ3MgPSBmbGFnczsKKwkJLyogQmUgcHJvbWlzY3VvdXMgYnkgZGVmYXVsdCB0byBtYWludGFpbiBwcmV2aW91cyBiZWhhdmlvdXIuICovCisJCXR1bi0+aWZfZmxhZ3MgPSBJRkZfUFJPTUlTQzsKKwkJLyogR2VuZXJhdGUgcmFuZG9tIEV0aGVybmV0IGFkZHJlc3MuICovCisJCSoodTE2ICopdHVuLT5kZXZfYWRkciA9IGh0b25zKDB4MDBGRik7CisJCWdldF9yYW5kb21fYnl0ZXModHVuLT5kZXZfYWRkciArIHNpemVvZih1MTYpLCA0KTsKKwkJbWVtc2V0KHR1bi0+Y2hyX2ZpbHRlciwgMCwgc2l6ZW9mIHR1bi0+Y2hyX2ZpbHRlcik7CisKKwkJdHVuX25ldF9pbml0KGRldik7CisKKwkJaWYgKHN0cmNocihkZXYtPm5hbWUsICclJykpIHsKKwkJCWVyciA9IGRldl9hbGxvY19uYW1lKGRldiwgZGV2LT5uYW1lKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWdvdG8gZXJyX2ZyZWVfZGV2OworCQl9CisKKwkJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2aWNlKHR1bi0+ZGV2KTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycl9mcmVlX2RldjsKKwkKKwkJbGlzdF9hZGQoJnR1bi0+bGlzdCwgJnR1bl9kZXZfbGlzdCk7CisJfQorCisJREJHKEtFUk5fSU5GTyAiJXM6IHR1bl9zZXRfaWZmXG4iLCB0dW4tPmRldi0+bmFtZSk7CisKKwlpZiAoaWZyLT5pZnJfZmxhZ3MgJiBJRkZfTk9fUEkpCisJCXR1bi0+ZmxhZ3MgfD0gVFVOX05PX1BJOworCisJaWYgKGlmci0+aWZyX2ZsYWdzICYgSUZGX09ORV9RVUVVRSkKKwkJdHVuLT5mbGFncyB8PSBUVU5fT05FX1FVRVVFOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gdHVuOworCXR1bi0+YXR0YWNoZWQgPSAxOworCisJc3RyY3B5KGlmci0+aWZyX25hbWUsIHR1bi0+ZGV2LT5uYW1lKTsKKwlyZXR1cm4gMDsKKworIGVycl9mcmVlX2RldjoKKwlmcmVlX25ldGRldihkZXYpOworIGZhaWxlZDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHR1bl9jaHJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdm9pZCBfX3VzZXIqIGFyZ3AgPSAodm9pZCBfX3VzZXIqKWFyZzsKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCisJaWYgKGNtZCA9PSBUVU5TRVRJRkYgfHwgX0lPQ19UWVBFKGNtZCkgPT0gMHg4OSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZpZnIsIGFyZ3AsIHNpemVvZiBpZnIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY21kID09IFRVTlNFVElGRiAmJiAhdHVuKSB7CisJCWludCBlcnI7CisKKwkJaWZyLmlmcl9uYW1lW0lGTkFNU0laLTFdID0gJ1wwJzsKKworCQlydG5sX2xvY2soKTsKKwkJZXJyID0gdHVuX3NldF9pZmYoZmlsZSwgJmlmcik7CisJCXJ0bmxfdW5sb2NrKCk7CisKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaWZyLCBzaXplb2YoaWZyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCF0dW4pCisJCXJldHVybiAtRUJBREZEOworCisJREJHKEtFUk5fSU5GTyAiJXM6IHR1bl9jaHJfaW9jdGwgY21kICVkXG4iLCB0dW4tPmRldi0+bmFtZSwgY21kKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUVU5TRVROT0NTVU06CisJCS8qIERpc2FibGUvRW5hYmxlIGNoZWNrc3VtICovCisJCWlmIChhcmcpCisJCQl0dW4tPmZsYWdzIHw9IFRVTl9OT0NIRUNLU1VNOworCQllbHNlCisJCQl0dW4tPmZsYWdzICY9IH5UVU5fTk9DSEVDS1NVTTsKKworCQlEQkcoS0VSTl9JTkZPICIlczogY2hlY2tzdW0gJXNcbiIsCisJCSAgICB0dW4tPmRldi0+bmFtZSwgYXJnID8gImRpc2FibGVkIiA6ICJlbmFibGVkIik7CisJCWJyZWFrOworCisJY2FzZSBUVU5TRVRQRVJTSVNUOgorCQkvKiBEaXNhYmxlL0VuYWJsZSBwZXJzaXN0IG1vZGUgKi8KKwkJaWYgKGFyZykKKwkJCXR1bi0+ZmxhZ3MgfD0gVFVOX1BFUlNJU1Q7CisJCWVsc2UKKwkJCXR1bi0+ZmxhZ3MgJj0gflRVTl9QRVJTSVNUOworCisJCURCRyhLRVJOX0lORk8gIiVzOiBwZXJzaXN0ICVzXG4iLAorCQkgICAgdHVuLT5kZXYtPm5hbWUsIGFyZyA/ICJkaXNhYmxlZCIgOiAiZW5hYmxlZCIpOworCQlicmVhazsKKworCWNhc2UgVFVOU0VUT1dORVI6CisJCS8qIFNldCBvd25lciBvZiB0aGUgZGV2aWNlICovCisJCXR1bi0+b3duZXIgPSAodWlkX3QpIGFyZzsKKworCQlEQkcoS0VSTl9JTkZPICIlczogb3duZXIgc2V0IHRvICVkXG4iLCB0dW4tPmRldi0+bmFtZSwgdHVuLT5vd25lcik7CisJCWJyZWFrOworCisjaWZkZWYgVFVOX0RFQlVHCisJY2FzZSBUVU5TRVRERUJVRzoKKwkJdHVuLT5kZWJ1ZyA9IGFyZzsKKwkJYnJlYWs7CisjZW5kaWYKKworCWNhc2UgU0lPQ0dJRkZMQUdTOgorCQlpZnIuaWZyX2ZsYWdzID0gdHVuLT5pZl9mbGFnczsKKwkJaWYgKGNvcHlfdG9fdXNlciggYXJncCwgJmlmciwgc2l6ZW9mIGlmcikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNJT0NTSUZGTEFHUzoKKwkJLyoqIFNldCB0aGUgY2hhcmFjdGVyIGRldmljZSdzIGludGVyZmFjZSBmbGFncy4gQ3VycmVudGx5IG9ubHkKKwkJICogSUZGX1BST01JU0MgYW5kIElGRl9BTExNVUxUSSBhcmUgdXNlZC4gKi8KKwkJdHVuLT5pZl9mbGFncyA9IGlmci5pZnJfZmxhZ3M7CisJCURCRyhLRVJOX0lORk8gIiVzOiBpbnRlcmZhY2UgZmxhZ3MgMHglbHhcbiIsCisJCQkJdHVuLT5kZXYtPm5hbWUsIHR1bi0+aWZfZmxhZ3MpOworCQlyZXR1cm4gMDsKKworCWNhc2UgU0lPQ0dJRkhXQUREUjoKKwkJbWVtY3B5KGlmci5pZnJfaHdhZGRyLnNhX2RhdGEsIHR1bi0+ZGV2X2FkZHIsCisJCQkJbWluKHNpemVvZiBpZnIuaWZyX2h3YWRkci5zYV9kYXRhLCBzaXplb2YgdHVuLT5kZXZfYWRkcikpOworCQlpZiAoY29weV90b191c2VyKCBhcmdwLCAmaWZyLCBzaXplb2YgaWZyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgU0lPQ1NJRkhXQUREUjoKKwkJLyoqIFNldCB0aGUgY2hhcmFjdGVyIGRldmljZSdzIGhhcmR3YXJlIGFkZHJlc3MuIFRoaXMgaXMgdXNlZCB3aGVuCisJCSAqIGZpbHRlcmluZyBwYWNrZXRzIGJlaW5nIHNlbnQgZnJvbSB0aGUgbmV0d29yayBkZXZpY2UgdG8gdGhlIGNoYXJhY3RlcgorCQkgKiBkZXZpY2UuICovCisJCW1lbWNweSh0dW4tPmRldl9hZGRyLCBpZnIuaWZyX2h3YWRkci5zYV9kYXRhLAorCQkJCW1pbihzaXplb2YgaWZyLmlmcl9od2FkZHIuc2FfZGF0YSwgc2l6ZW9mIHR1bi0+ZGV2X2FkZHIpKTsKKwkJREJHKEtFUk5fREVCVUcgIiVzOiBzZXQgaGFyZHdhcmUgYWRkcmVzczogJXg6JXg6JXg6JXg6JXg6JXhcbiIsCisJCQkJdHVuLT5kZXYtPm5hbWUsCisJCQkJdHVuLT5kZXZfYWRkclswXSwgdHVuLT5kZXZfYWRkclsxXSwgdHVuLT5kZXZfYWRkclsyXSwKKwkJCQl0dW4tPmRldl9hZGRyWzNdLCB0dW4tPmRldl9hZGRyWzRdLCB0dW4tPmRldl9hZGRyWzVdKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNJT0NBRERNVUxUSToKKwkJLyoqIEFkZCB0aGUgc3BlY2lmaWVkIGdyb3VwIHRvIHRoZSBjaGFyYWN0ZXIgZGV2aWNlJ3MgbXVsdGljYXN0IGZpbHRlcgorCQkgKiBsaXN0LiAqLworCQlhZGRfbXVsdGkodHVuLT5jaHJfZmlsdGVyLCBpZnIuaWZyX2h3YWRkci5zYV9kYXRhKTsKKwkJREJHKEtFUk5fREVCVUcgIiVzOiBhZGQgbXVsdGk6ICV4OiV4OiV4OiV4OiV4OiV4XG4iLAorCQkJCXR1bi0+ZGV2LT5uYW1lLAorCQkJCSh1OClpZnIuaWZyX2h3YWRkci5zYV9kYXRhWzBdLCAodTgpaWZyLmlmcl9od2FkZHIuc2FfZGF0YVsxXSwKKwkJCQkodTgpaWZyLmlmcl9od2FkZHIuc2FfZGF0YVsyXSwgKHU4KWlmci5pZnJfaHdhZGRyLnNhX2RhdGFbM10sCisJCQkJKHU4KWlmci5pZnJfaHdhZGRyLnNhX2RhdGFbNF0sICh1OClpZnIuaWZyX2h3YWRkci5zYV9kYXRhWzVdKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNJT0NERUxNVUxUSToKKwkJLyoqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGdyb3VwIGZyb20gdGhlIGNoYXJhY3RlciBkZXZpY2UncyBtdWx0aWNhc3QKKwkJICogZmlsdGVyIGxpc3QuICovCisJCWRlbF9tdWx0aSh0dW4tPmNocl9maWx0ZXIsIGlmci5pZnJfaHdhZGRyLnNhX2RhdGEpOworCQlEQkcoS0VSTl9ERUJVRyAiJXM6IGRlbCBtdWx0aTogJXg6JXg6JXg6JXg6JXg6JXhcbiIsCisJCQkJdHVuLT5kZXYtPm5hbWUsCisJCQkJKHU4KWlmci5pZnJfaHdhZGRyLnNhX2RhdGFbMF0sICh1OClpZnIuaWZyX2h3YWRkci5zYV9kYXRhWzFdLAorCQkJCSh1OClpZnIuaWZyX2h3YWRkci5zYV9kYXRhWzJdLCAodTgpaWZyLmlmcl9od2FkZHIuc2FfZGF0YVszXSwKKwkJCQkodTgpaWZyLmlmcl9od2FkZHIuc2FfZGF0YVs0XSwgKHU4KWlmci5pZnJfaHdhZGRyLnNhX2RhdGFbNV0pOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dW5fY2hyX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgb24pCit7CisJc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKCF0dW4pCisJCXJldHVybiAtRUJBREZEOworCisJREJHKEtFUk5fSU5GTyAiJXM6IHR1bl9jaHJfZmFzeW5jICVkXG4iLCB0dW4tPmRldi0+bmFtZSwgb24pOworCisJaWYgKChyZXQgPSBmYXN5bmNfaGVscGVyKGZkLCBmaWxlLCBvbiwgJnR1bi0+ZmFzeW5jKSkgPCAwKQorCQlyZXR1cm4gcmV0OyAKKyAKKwlpZiAob24pIHsKKwkJcmV0ID0gZl9zZXRvd24oZmlsZSwgY3VycmVudC0+cGlkLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXR1bi0+ZmxhZ3MgfD0gVFVOX0ZBU1lOQzsKKwl9IGVsc2UgCisJCXR1bi0+ZmxhZ3MgJj0gflRVTl9GQVNZTkM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dW5fY2hyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCURCRzEoS0VSTl9JTkZPICJ0dW5YOiB0dW5fY2hyX29wZW5cbiIpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHVuX2Nocl9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCF0dW4pCisJCXJldHVybiAwOworCisJREJHKEtFUk5fSU5GTyAiJXM6IHR1bl9jaHJfY2xvc2VcbiIsIHR1bi0+ZGV2LT5uYW1lKTsKKworCXR1bl9jaHJfZmFzeW5jKC0xLCBmaWxlLCAwKTsKKworCXJ0bmxfbG9jaygpOworCisJLyogRGV0YWNoIGZyb20gbmV0IGRldmljZSAqLworCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJdHVuLT5hdHRhY2hlZCA9IDA7CisKKwkvKiBEcm9wIHJlYWQgcXVldWUgKi8KKwlza2JfcXVldWVfcHVyZ2UoJnR1bi0+cmVhZHEpOworCisJaWYgKCEodHVuLT5mbGFncyAmIFRVTl9QRVJTSVNUKSkgeworCQlsaXN0X2RlbCgmdHVuLT5saXN0KTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXZpY2UodHVuLT5kZXYpOworCX0KKworCXJ0bmxfdW5sb2NrKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHVuX2ZvcHMgPSB7CisJLm93bmVyCT0gVEhJU19NT0RVTEUsCQorCS5sbHNlZWsgPSBub19sbHNlZWssCisJLnJlYWQJPSB0dW5fY2hyX3JlYWQsCisJLnJlYWR2CT0gdHVuX2Nocl9yZWFkdiwKKwkud3JpdGUJPSB0dW5fY2hyX3dyaXRlLAorCS53cml0ZXYgPSB0dW5fY2hyX3dyaXRldiwKKwkucG9sbAk9IHR1bl9jaHJfcG9sbCwKKwkuaW9jdGwJPSB0dW5fY2hyX2lvY3RsLAorCS5vcGVuCT0gdHVuX2Nocl9vcGVuLAorCS5yZWxlYXNlID0gdHVuX2Nocl9jbG9zZSwKKwkuZmFzeW5jID0gdHVuX2Nocl9mYXN5bmMJCQorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHR1bl9taXNjZGV2ID0geworCS5taW5vciA9IFRVTl9NSU5PUiwKKwkubmFtZSA9ICJ0dW4iLAorCS5mb3BzID0gJnR1bl9mb3BzLAorCS5kZXZmc19uYW1lID0gIm5ldC90dW4iLAorfTsKKworLyogZXRodG9vbCBpbnRlcmZhY2UgKi8KKworc3RhdGljIGludCB0dW5fZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCWNtZC0+c3VwcG9ydGVkCQk9IDA7CisJY21kLT5hZHZlcnRpc2luZwk9IDA7CisJY21kLT5zcGVlZAkJPSBTUEVFRF8xMDsKKwljbWQtPmR1cGxleAkJPSBEVVBMRVhfRlVMTDsKKwljbWQtPnBvcnQJCT0gUE9SVF9UUDsKKwljbWQtPnBoeV9hZGRyZXNzCT0gMDsKKwljbWQtPnRyYW5zY2VpdmVyCT0gWENWUl9JTlRFUk5BTDsKKwljbWQtPmF1dG9uZWcJCT0gQVVUT05FR19ESVNBQkxFOworCWNtZC0+bWF4dHhwa3QJCT0gMDsKKwljbWQtPm1heHJ4cGt0CQk9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHR1bl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4gPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmZ3X3ZlcnNpb24sICJOL0EiKTsKKworCXN3aXRjaCAodHVuLT5mbGFncyAmIFRVTl9UWVBFX01BU0spIHsKKwljYXNlIFRVTl9UVU5fREVWOgorCQlzdHJjcHkoaW5mby0+YnVzX2luZm8sICJ0dW4iKTsKKwkJYnJlYWs7CisJY2FzZSBUVU5fVEFQX0RFVjoKKwkJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCAidGFwIik7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHUzMiB0dW5fZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisjaWZkZWYgVFVOX0RFQlVHCisJc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIHR1bi0+ZGVidWc7CisjZWxzZQorCXJldHVybiAtRU9QTk9UU1VQUDsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB0dW5fc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSkKK3sKKyNpZmRlZiBUVU5fREVCVUcKKwlzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl0dW4tPmRlYnVnID0gdmFsdWU7CisjZW5kaWYKK30KKworc3RhdGljIHUzMiB0dW5fZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gdHVuLT5hdHRhY2hlZDsKK30KKworc3RhdGljIHUzMiB0dW5fZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHVuX3N0cnVjdCAqdHVuID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlyZXR1cm4gKHR1bi0+ZmxhZ3MgJiBUVU5fTk9DSEVDS1NVTSkgPT0gMDsKK30KKworc3RhdGljIGludCB0dW5fc2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCit7CisJc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biA9IG5ldGRldl9wcml2KGRldik7CisJaWYgKGRhdGEpCisJCXR1bi0+ZmxhZ3MgJj0gflRVTl9OT0NIRUNLU1VNOworCWVsc2UKKwkJdHVuLT5mbGFncyB8PSBUVU5fTk9DSEVDS1NVTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB0dW5fZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncwk9IHR1bl9nZXRfc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvCT0gdHVuX2dldF9kcnZpbmZvLAorCS5nZXRfbXNnbGV2ZWwJPSB0dW5fZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJPSB0dW5fc2V0X21zZ2xldmVsLAorCS5nZXRfbGluawk9IHR1bl9nZXRfbGluaywKKwkuZ2V0X3J4X2NzdW0JPSB0dW5fZ2V0X3J4X2NzdW0sCisJLnNldF9yeF9jc3VtCT0gdHVuX3NldF9yeF9jc3VtCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0dW5faW5pdCh2b2lkKQoreworCWludCByZXQgPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyAidHVuOiAlcywgJXNcbiIsIERSVl9ERVNDUklQVElPTiwgRFJWX1ZFUlNJT04pOworCXByaW50ayhLRVJOX0lORk8gInR1bjogJXNcbiIsIERSVl9DT1BZUklHSFQpOworCisJcmV0ID0gbWlzY19yZWdpc3RlcigmdHVuX21pc2NkZXYpOworCWlmIChyZXQpCisJCXByaW50ayhLRVJOX0VSUiAidHVuOiBDYW4ndCByZWdpc3RlciBtaXNjIGRldmljZSAlZFxuIiwgVFVOX01JTk9SKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB0dW5fY2xlYW51cCh2b2lkKQoreworCXN0cnVjdCB0dW5fc3RydWN0ICp0dW4sICpueHQ7CisKKwltaXNjX2RlcmVnaXN0ZXIoJnR1bl9taXNjZGV2KTsgIAorCisJcnRubF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHR1biwgbnh0LCAmdHVuX2Rldl9saXN0LCBsaXN0KSB7CisJCURCRyhLRVJOX0lORk8gIiVzIGNsZWFuZWQgdXBcbiIsIHR1bi0+ZGV2LT5uYW1lKTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXZpY2UodHVuLT5kZXYpOworCX0KKwlydG5sX3VubG9jaygpOworCQorfQorCittb2R1bGVfaW5pdCh0dW5faW5pdCk7Cittb2R1bGVfZXhpdCh0dW5fY2xlYW51cCk7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJWX0RFU0NSSVBUSU9OKTsKK01PRFVMRV9BVVRIT1IoRFJWX0NPUFlSSUdIVCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihUVU5fTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHlwaG9vbi1maXJtd2FyZS5oIGIvZHJpdmVycy9uZXQvdHlwaG9vbi1maXJtd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZjQ3ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90eXBob29uLWZpcm13YXJlLmgKQEAgLTAsMCArMSwzNzc4IEBACisvKgorICogQ29weXJpZ2h0IDE5OTktMjAwNCAzQ29tIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBvZiB0aGUgM2M5OTBpbWcuaAorICogbWljcm9jb2RlIHNvZnR3YXJlIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbiBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbiBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgM0NvbSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgM0NPTSBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBVU0VSIEFDS05PV0xFREdFUyBBTkQgQUdSRUVTIFRIQVQgUFVSQ0hBU0UgT1IgVVNFIE9GIFRIRSAzYzk5MGltZy5oCisgKiBNSUNST0NPREUgU09GVFdBUkUgV0lMTCBOT1QgQ1JFQVRFIE9SIEdJVkUgR1JPVU5EUyBGT1IgQSBMSUNFTlNFIEJZCisgKiBJTVBMSUNBVElPTiwgRVNUT1BQRUwsIE9SIE9USEVSV0lTRSBJTiBBTlkgSU5URUxMRUNUVUFMIFBST1BFUlRZIFJJR0hUUworICogKFBBVEVOVCwgQ09QWVJJR0hULCBUUkFERSBTRUNSRVQsIE1BU0sgV09SSywgT1IgT1RIRVIgUFJPUFJJRVRBUlkgUklHSFQpCisgKiBFTUJPRElFRCBJTiBBTlkgT1RIRVIgM0NPTSBIQVJEV0FSRSBPUiBTT0ZUV0FSRSBFSVRIRVIgU09MRUxZIE9SIElOCisgKiBDT01CSU5BVElPTiBXSVRIIFRIRSAzYzk5MGltZy5oIE1JQ1JPQ09ERSBTT0ZUV0FSRQorICovIAorCisgLyogdmVyIDAzLjAwMS4wMDggKi8KK3N0YXRpYyBjb25zdCB1OCB0eXBob29uX2Zpcm13YXJlX2ltYWdlW10gPSB7CisweDU0LCAweDU5LCAweDUwLCAweDQ4LCAweDRmLCAweDRmLCAweDRlLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAKKzB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4Y2IsIDB4OTksIDB4YjEsIDB4ZDQsIAorMHg0YywgMHhiOCwgMHhkMCwgMHg0YiwgMHgzMiwgMHgwMiwgMHhkNCwgMHhlZSwgMHg3MywgMHg3ZSwgMHgwYiwgMHgxMywgCisweDliLCAweGMwLCAweGFlLCAweGY0LCAweDQwLCAweDAxLCAweDAwLCAweDAwLCAweGU4LCAweGZjLCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MzksIDB4MDAsIDB4MDAsIDB4ZWEsIDB4MDUsIDB4MDAsIDB4MDAsIDB4ZWEsIAorMHgwNCwgMHgwMCwgMHgwMCwgMHhlYSwgMHgwMywgMHgwMCwgMHgwMCwgMHhlYSwgMHgwMiwgMHgwMCwgMHgwMCwgMHhlYSwgCisweDAxLCAweDAwLCAweDAwLCAweGVhLCAweDMyLCAweDAyLCAweDAwLCAweGVhLCAweGM1LCAweDE0LCAweDAwLCAweGVhLCAKKzB4MDcsIDB4MDAsIDB4MmQsIDB4ZTksIDB4MGUsIDB4MDAsIDB4YTAsIDB4ZTEsIDB4MDAsIDB4MTAsIDB4MGYsIDB4ZTEsIAorMHhkMCwgMHgyMCwgMHg5ZiwgMHhlNSwgMHgxMiwgMHhmZiwgMHgyZiwgMHhlMSwgMHhmZSwgMHhmZiwgMHhmZiwgMHhlYSwgCisweDAxLCAweDAwLCAweDgwLCAweGUwLCAweDA0LCAweDIwLCAweDgxLCAweGU0LCAweDAxLCAweDAwLCAweDUwLCAweGUxLCAKKzB4ZmMsIDB4ZmYsIDB4ZmYsIDB4MWEsIDB4MGUsIDB4ZjAsIDB4YTAsIDB4ZTEsIDB4MDAsIDB4YTAsIDB4YTAsIDB4ZTEsIAorMHgwZSwgMHhiMCwgMHhhMCwgMHhlMSwgMHgwMCwgMHgwMCwgMHhhMCwgMHhlMywgMHhhOCwgMHgxMCwgMHg5ZiwgMHhlNSwgCisweDAwLCAweDAwLCAweDgxLCAweGU1LCAweGE0LCAweDEwLCAweDlmLCAweGU1LCAweDAwLCAweDAwLCAweDgxLCAweGU1LCAKKzB4MDEsIDB4MTYsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MDAsIDB4OTEsIDB4ZTUsIDB4MDEsIDB4MDAsIDB4ODAsIDB4ZTMsIAorMHgwMCwgMHgwMCwgMHg4MSwgMHhlNSwgMHhkNywgMHgwMCwgMHhhMCwgMHhlMywgMHgwMCwgMHhmMCwgMHgyMSwgMHhlMSwgCisweDg4LCAweGQwLCAweDlmLCAweGU1LCAweGRiLCAweDAwLCAweGEwLCAweGUzLCAweDAwLCAweGYwLCAweDIxLCAweGUxLCAKKzB4N2MsIDB4ZDAsIDB4OWYsIDB4ZTUsIDB4ZDIsIDB4MDAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4ZjAsIDB4MjEsIDB4ZTEsIAorMHg3NCwgMHhkMCwgMHg5ZiwgMHhlNSwgMHhkMSwgMHgwMCwgMHhhMCwgMHhlMywgMHgwMCwgMHhmMCwgMHgyMSwgMHhlMSwgCisweDZjLCAweGQwLCAweDlmLCAweGU1LCAweDliLCAweDE0LCAweDAwLCAweGViLCAweGQzLCAweDAwLCAweGEwLCAweGUzLCAKKzB4MDAsIDB4ZjAsIDB4MjEsIDB4ZTEsIDB4NjAsIDB4ZDAsIDB4OWYsIDB4ZTUsIDB4NjAsIDB4MDAsIDB4OWYsIDB4ZTUsIAorMHg2MCwgMHgxMCwgMHg5ZiwgMHhlNSwgMHg2MCwgMHgyMCwgMHg5ZiwgMHhlNSwgMHhkYiwgMHhmZiwgMHhmZiwgMHhlYiwgCisweDVjLCAweDAwLCAweDlmLCAweGU1LCAweDVjLCAweDEwLCAweDlmLCAweGU1LCAweDAwLCAweDIwLCAweGEwLCAweGUzLCAKKzB4ZDcsIDB4ZmYsIDB4ZmYsIDB4ZWIsIDB4NTQsIDB4MDAsIDB4OWYsIDB4ZTUsIDB4NTQsIDB4MTAsIDB4OWYsIDB4ZTUsIAorMHhkNCwgMHhmZiwgMHhmZiwgMHhlYiwgMHgwYSwgMHgwMCwgMHhhMCwgMHhlMSwgMHgwYiwgMHhmMCwgMHhhMCwgMHhlMSwgCisweGQzLCAweDEwLCAweGEwLCAweGUzLCAweDAxLCAweGYwLCAweDIxLCAweGUxLCAweGQ0LCAweGZmLCAweGZmLCAweGViLCAKKzB4M2MsIDB4YTAsIDB4OWYsIDB4ZTUsIDB4MWEsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4YzYsIDB4ZmYsIDB4ZmYsIDB4ZWEsIAorMHgxNSwgMHgyMSwgMHhmZiwgMHhmZiwgMHgwYywgMHgwMCwgMHgxMCwgMHgwMCwgMHgxYywgMHgwMCwgMHgxMCwgMHgwMCwgCisweDNjLCAweDM4LCAweDAwLCAweDgwLCAweGZjLCAweDM3LCAweDAwLCAweDgwLCAweGZjLCAweDNmLCAweDAwLCAweDgwLCAKKzB4N2MsIDB4MzQsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MGYsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MzAsIDB4MDAsIDB4ODAsIAorMHhhZCwgMHhkZSwgMHhhZCwgMHhkZSwgMHhiMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgyNCwgMHhhYiwgMHgyMCwgMHg0MCwgCisweDQ4LCAweDI5LCAweDAwLCAweDAwLCAweDI4LCAweDA1LCAweDAwLCAweDgwLCAweGJkLCAweGJhLCAweDIxLCAweDQwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDU4LCAweDU3LCAweDAwLCAweDAwLCAweDg2LCAweDRiLCAweDAwLCAweDAwLCAweDYwLCAweDAxLCAweGZmLCAweGZmLCAKKzB4YjAsIDB4YjUsIDB4MDcsIDB4MWMsIDB4MTIsIDB4NGQsIDB4MDAsIDB4MjQsIDB4MjgsIDB4NjgsIDB4MDAsIDB4MjgsIAorMHgxZSwgMHhkMCwgMHgzOCwgMHgxYywgMHgxMCwgMHg0OSwgMHgwNCwgMHhmMCwgMHg3YiwgMHhmZCwgMHgyOSwgMHg2OCwgCisweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweDAwLCAweDI4LCAweDE1LCAweGQwLCAweDM4LCAweDAxLCAweDBkLCAweDQ5LCAKKzB4NDAsIDB4MTgsIDB4MTksIDB4MjMsIDB4ZGIsIDB4MDEsIDB4YzAsIDB4MTgsIDB4NDEsIDB4NmIsIDB4ODAsIDB4MjksIAorMHgwYywgMHhkMiwgMHgwMSwgMHgzMSwgMHg0MSwgMHg2MywgMHgyOCwgMHg2OCwgMHhjMSwgMHg2OSwgMHhjMCwgMHg0NiwgCisweDI5LCAweDYwLCAweDM5LCAweDA3LCAweDQxLCAweDYwLCAweDA0LCAweDYyLCAweGM3LCAweDYyLCAweGIwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MjAsIDB4MWMsIDB4ZmEsIDB4ZTcsIDB4ZTgsIDB4MTcsIDB4MDAsIDB4ODAsIAorMHhlZSwgMHgwNSwgMHgwMCwgMHgwMCwgMHhhMCwgMHgxYywgMHgwMCwgMHg4MCwgMHgwMiwgMHg0OSwgMHgwYSwgMHg2OCwgCisweGMwLCAweDQ2LCAweGMyLCAweDYxLCAweDA4LCAweDYwLCAweDcwLCAweDQ3LCAKKzB4ZTgsIDB4MTcsIDB4MDAsIDB4ODAsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwZiwgMHhlMSwgMHgwMCwgMHgxMCwgMHhhMCwgMHhlMSwgCisweGMwLCAweDEwLCAweDgxLCAweGUzLCAweDAxLCAweGYwLCAweDIxLCAweGUxLCAweDFlLCAweGZmLCAweDJmLCAweGUxLCAKKzB4MDAsIDB4ZjAsIDB4MjEsIDB4ZTEsIDB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4MDAsIDB4MDAsIDB4MGYsIDB4ZTEsIAorMHhjMCwgMHgwMCwgMHg4MCwgMHhlMywgMHgwMCwgMHhmMCwgMHgyMSwgMHhlMSwgMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgCisweDAwLCAweDAwLCAweDBmLCAweGUxLCAweGMwLCAweDAwLCAweGMwLCAweGUzLCAweDAwLCAweGYwLCAweDIxLCAweGUxLCAKKzB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4MDAsIDB4MDAsIDB4MGYsIDB4ZTEsIDB4NDAsIDB4MDAsIDB4ODAsIDB4ZTMsIAorMHgwMCwgMHhmMCwgMHgyMSwgMHhlMSwgMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHgwMCwgMHgwMCwgMHgwZiwgMHhlMSwgCisweDgwLCAweDAwLCAweDEwLCAweGUzLCAweDgwLCAweDAwLCAweDgwLCAweGUzLCAweDAwLCAweGYwLCAweDIxLCAweGUxLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MTIsIDB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4MDAsIDB4MDAsIDB4NTAsIDB4ZTMsIAorMHgwMCwgMHgwMCwgMHgwZiwgMHhlMSwgMHg4MCwgMHgwMCwgMHhjMCwgMHgxMywgMHgwMCwgMHhmMCwgMHgyMSwgMHhlMSwgCisweDFlLCAweGZmLCAweDJmLCAweGUxLCAweDAwLCAweDAwLCAweDBmLCAweGUxLCAweDgwLCAweDAwLCAweGMwLCAweGUzLCAKKzB4MDAsIDB4ZjAsIDB4MjEsIDB4ZTEsIDB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4OTEsIDB4MDAsIDB4MDAsIDB4ZTAsIAorMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHgwMSwgMHgyMCwgMHg4MCwgMHhlMCwgMHgwMSwgMHgwMCwgMHg4MCwgMHhlMCwgCisweDFlLCAweGZmLCAweDJmLCAweGUxLCAweDgwLCAweGI1LCAweDA4LCAweDRmLCAweDY0LCAweDI4LCAweDA0LCAweGQzLCAKKzB4NjQsIDB4MjAsIDB4MzgsIDB4NjMsIDB4MDAsIDB4MjAsIDB4YzAsIDB4NDMsIDB4MDMsIDB4ZTAsIDB4MzgsIDB4NjMsIAorMHgwNCwgMHg0OSwgMHgwNSwgMHhmMCwgMHgwMSwgMHhmYiwgMHg3OCwgMHg2MywgMHhiOCwgMHg2MywgMHg4MCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDg4LCAweDEzLCAweDAwLCAweDAwLCAKKzB4ODAsIDB4YjQsIDB4MTAsIDB4NGIsIDB4MDAsIDB4MjIsIDB4MWYsIDB4NmIsIDB4NjQsIDB4MmYsIDB4MDMsIDB4ZDIsIAorMHgwOSwgMHg2OCwgMHgwOSwgMHg2OCwgMHg0OSwgMHgwOCwgMHgwMiwgMHhkMiwgMHgxMCwgMHgxYywgMHg4MCwgMHhiYywgCisweDcwLCAweDQ3LCAweDE5LCAweDFjLCAweGRiLCAweDZiLCAweDRmLCAweDZiLCAweGJiLCAweDQyLCAweDA1LCAweGQyLCAKKzB4NDAsIDB4NjgsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4MTgsIDB4MTgsIDB4YzgsIDB4NjMsIDB4ZjEsIDB4ZTcsIAorMHg0MSwgMHg2OCwgMHgwNSwgMHg0YiwgMHgxOSwgMHg0MywgMHg0MSwgMHg2MCwgMHgwNCwgMHg0OCwgMHhjMSwgMHg2YiwgCisweDAxLCAweDMxLCAweGMxLCAweDYzLCAweDAyLCAweDIwLCAweGU4LCAweGU3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MGMsIDB4MmIsIDB4MDAsIDB4ODAsIDB4OTAsIDB4YjUsIDB4MDcsIDB4MWMsIAorMHgxNSwgMHg0YywgMHgwMCwgMHgyMCwgMHgyMSwgMHg2YiwgMHg2NCwgMHgyOSwgMHgwYiwgMHhkMiwgMHhiOSwgMHg2ZSwgCisweDQ5LCAweDA4LCAweDA4LCAweGQzLCAweDIxLCAweDZjLCAweGEyLCAweDZiLCAweDkxLCAweDQyLCAweDA3LCAweGQyLCAKKzB4ZmEsIDB4MWQsIDB4MzksIDB4MzIsIDB4NTIsIDB4OGIsIDB4ODksIDB4MTgsIDB4MjEsIDB4NjQsIDB4OTAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg3OCwgMHg2YSwgMHgzOSwgMHg2YiwgMHhjMCwgMHg0NiwgMHg0OCwgMHg2MiwgCisweDM4LCAweDZiLCAweDAyLCAweGYwLCAweDJkLCAweGZlLCAweDM4LCAweDFjLCAweDAyLCAweGYwLCAweGU4LCAweGZhLCAKKzB4MDEsIDB4MjAsIDB4YmIsIDB4MjMsIDB4MWIsIDB4MDEsIDB4ZTEsIDB4MTgsIDB4YzgsIDB4NzMsIDB4MDUsIDB4NDksIAorMHgwYSwgMHg2YywgMHgxMiwgMHgxOCwgMHgwYSwgMHg2NCwgMHgwNCwgMHg0OSwgMHg4YSwgMHg2ZCwgMHgxMiwgMHgxOCwgCisweDhhLCAweDY1LCAweGU0LCAweGU3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDBjLCAweDJiLCAweDAwLCAweDgwLCAKKzB4YTQsIDB4MmEsIDB4MDAsIDB4ODAsIDB4ODAsIDB4YjQsIDB4MGEsIDB4NDgsIDB4YzAsIDB4NmQsIDB4MDIsIDB4MjMsIAorMHgxOCwgMHg0MCwgMHgwOSwgMHg0YSwgMHgwMCwgMHgyMSwgMHgwMCwgMHgyOCwgMHgwMywgMHhkMCwgMHhkMSwgMHg2MywgCisweDExLCAweDY0LCAweDgwLCAweGJjLCAweDcwLCAweDQ3LCAweDA2LCAweDQ4LCAweDA3LCAweDY4LCAweDdiLCAweDFjLCAKKzB4MDMsIDB4NjAsIDB4MGEsIDB4MmYsIDB4ZjcsIDB4ZDMsIDB4MDEsIDB4NjAsIDB4ZjMsIDB4ZTcsIDB4MDAsIDB4MDAsIAorMHhhNCwgMHgyYSwgMHgwMCwgMHg4MCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHhlMCwgMHgwMSwgMHgwMCwgMHg4MCwgCisweDcwLCAweDQ3LCAweDAyLCAweDA0LCAweDEyLCAweDBjLCAweDAwLCAweDBjLCAweDEwLCAweDE4LCAweDBhLCAweDA0LCAKKzB4MTIsIDB4MGMsIDB4MDksIDB4MGMsIDB4NTEsIDB4MTgsIDB4MDgsIDB4MTgsIDB4MDEsIDB4MGMsIDB4MDUsIDB4ZDAsIAorMHgwMSwgMHgwNCwgMHgwOSwgMHgwYywgMHgwMCwgMHgwYywgMHgwOCwgMHgxOCwgMHgwMSwgMHgwYywgMHhmOSwgMHhkMSwgCisweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDcwLCAweDQ3LCAweDgwLCAweGI0LCAweDAwLCAweDIyLCAweDAwLCAweDI5LCAKKzB4MTgsIDB4ZDAsIDB4NGYsIDB4MDgsIDB4N2IsIDB4MWUsIDB4MDAsIDB4MmYsIAorMHgwNiwgMHhkMCwgMHgwNywgMHg4OCwgMHhiYSwgMHgxOCwgMHgwMiwgMHgzMCwgMHgxZiwgMHgxYywgMHgwMSwgMHgzYiwgCisweDAwLCAweDJmLCAweGY4LCAweGQxLCAweDQ5LCAweDA4LCAweDAzLCAweGQzLCAweDAwLCAweDg4LCAweDAwLCAweDA2LCAKKzB4MDAsIDB4MGUsIDB4ODIsIDB4MTgsIDB4MTAsIDB4MGMsIDB4MDUsIDB4ZDAsIDB4MTAsIDB4MDQsIDB4MDAsIDB4MGMsIAorMHgxMSwgMHgwYywgMHg0MiwgMHgxOCwgMHgxMCwgMHgwYywgMHhmOSwgMHhkMSwgMHgxMCwgMHgwNCwgMHgwMCwgMHgwYywgCisweDgwLCAweGJjLCAweDcwLCAweDQ3LCAweDgwLCAweGI1LCAweDgzLCAweDg5LCAweGM3LCAweDg5LCAweGZiLCAweDE4LCAKKzB4MDcsIDB4OGEsIDB4ZmIsIDB4MTgsIDB4NDcsIDB4OGEsIDB4ZmIsIDB4MTgsIDB4NDAsIDB4N2EsIDB4MDAsIDB4MDIsIAorMHhjNywgMHgxOCwgMHgzOCwgMHgwYywgMHgwNSwgMHhkMCwgMHgzOCwgMHgwNCwgMHgwMCwgMHgwYywgMHgzYiwgMHgwYywgCisweGM3LCAweDE4LCAweDM4LCAweDBjLCAweGY5LCAweGQxLCAweDA4LCAweDFjLCAweDExLCAweDFjLCAweGZmLCAweGY3LCAKKzB4YzgsIDB4ZmYsIDB4MDEsIDB4MWMsIDB4MzgsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4YjAsIDB4ZmYsIDB4ODAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg5MCwgMHhiNSwgMHgwMiwgMHgyMywgMHg4MiwgMHg2OCwgMHgxYSwgMHg0MCwgCisweDAwLCAweDI3LCAweDAwLCAweDJhLCAweDBmLCAweGQwLCAweDBhLCAweDRhLCAweDkzLCAweDY5LCAweDAxLCAweDMzLCAKKzB4OTMsIDB4NjEsIDB4MGEsIDB4NjgsIDB4OGIsIDB4NjgsIDB4OWEsIDB4MTgsIDB4MDAsIDB4NjgsIDB4MWMsIDB4MTgsIAorMHg1NywgMHg4MSwgMHgwOSwgMHg2OSwgMHgxMCwgMHgxYywgMHhmZiwgMHhmNywgMHhhYywgMHhmZiwgMHhjMCwgMHg0MywgCisweDYwLCAweDgxLCAweDM4LCAweDFjLCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAKKzB4MGMsIDB4MmIsIDB4MDAsIDB4ODAsIDB4OTAsIDB4YjUsIDB4MDQsIDB4MjMsIDB4ODIsIDB4NjgsIDB4MWEsIDB4NDAsIAorMHgwMCwgMHgyNywgMHgwMCwgMHgyYSwgMHgxMSwgMHhkMCwgMHg0YSwgMHg2OCwgMHg1MiwgMHgwOSwgMHgwZSwgMHhkMywgCisweDA5LCAweDRhLCAweDEzLCAweDZhLCAweDAxLCAweDMzLCAweDEzLCAweDYyLCAweGNiLCAweDY4LCAweDAyLCAweDY4LCAKKzB4OWMsIDB4MTgsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MDgsIDB4M2EsIDB4MWEsIDB4NDMsIDB4MTIsIDB4NjgsIAorMHgwMCwgMHhmMCwgMHgyZSwgMHhmOCwgMHgyMCwgMHg4MiwgMHgzOCwgMHgxYywgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDBjLCAweDJiLCAweDAwLCAweDgwLCAweDkwLCAweGI1LCAweDgwLCAweDIzLCAKKzB4ODIsIDB4NjgsIDB4MWEsIDB4NDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4MmEsIDB4MTUsIDB4ZDAsIDB4NGEsIDB4NjgsIAorMHg5MiwgMHgwOSwgMHgxMiwgMHhkMywgMHgwYiwgMHg0YSwgMHhkMywgMHg2OSwgMHgwMSwgMHgzMywgMHhkMywgMHg2MSwgCisweGNiLCAweDY4LCAweDAyLCAweDY4LCAweDlmLCAweDE4LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDA4LCAweDNhLCAKKzB4MWEsIDB4NDMsIDB4MTIsIDB4NjgsIDB4MDAsIDB4ZjAsIDB4MGUsIDB4ZjgsIDB4MDAsIDB4MjgsIDB4MDAsIDB4ZDEsIAorMHgwNCwgMHg0OCwgMHhjMCwgMHg0NiwgMHhmOCwgMHg4MCwgMHgyMCwgMHgxYywgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDBjLCAweDJiLCAweDAwLCAweDgwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAKKzB4YjAsIDB4YjUsIDB4MTQsIDB4MWMsIDB4MDUsIDB4MWMsIDB4MGYsIDB4MWMsIDB4MzgsIDB4NjksIDB4YjksIDB4NjgsIAorMHg0MSwgMHgxOCwgMHgzOCwgMHg2OCwgMHhmZiwgMHhmNywgMHg1MywgMHhmZiwgMHhjMCwgMHg0MywgMHgwMSwgMHgwNCwgCisweDA5LCAweDBjLCAweDIwLCAweDFjLCAweGZmLCAweGY3LCAweDM5LCAweGZmLCAweDA0LCAweDFjLCAweGI4LCAweDY4LCAKKzB4NzksIDB4NjksIDB4NDAsIDB4MTgsIDB4NjksIDB4NjgsIDB4ODgsIDB4NDIsIDB4MGMsIDB4ZDIsIDB4MmEsIDB4NjgsIAorMHgxMiwgMHgxOCwgMHgwOSwgMHgxYSwgMHgxMCwgMHgxYywgMHgwMCwgMHhmMCwgMHgwNSwgMHhmOSwgMHhjMCwgMHg0MywgCisweDAxLCAweDA0LCAweDA5LCAweDBjLCAweDIwLCAweDFjLCAweGZmLCAweGY3LCAweDI2LCAweGZmLCAweDA0LCAweDFjLCAKKzB4ZTAsIDB4NDMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4YjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHg4MCwgMHhiNSwgMHgwNywgMHgxYywgMHhiOCwgMHg2YiwgMHhjMCwgMHgwOCwgMHgxYSwgMHhkMywgMHhiOCwgMHg2YSwgCisweGY5LCAweDZiLCAweDQwLCAweDE4LCAweDc5LCAweDZjLCAweDAwLCAweGYwLCAweGVkLCAweGY4LCAweGMwLCAweDQzLCAKKzB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIDB4MGEsIDB4NDgsIDB4MDcsIDB4ZDAsIDB4MjAsIDB4MjMsIDB4YjksIDB4NjksIAorMHgxOSwgMHg0MywgMHhiOSwgMHg2MSwgMHgwMSwgMHg2YiwgMHgwMSwgMHgzMSwgMHgwMSwgMHg2MywgMHgwNywgMHhlMCwgCisweGZmLCAweDIzLCAweDAxLCAweDMzLCAweGI5LCAweDY5LCAweDE5LCAweDQzLCAweGI5LCAweDYxLCAweDQxLCAweDZhLCAKKzB4MDEsIDB4MzEsIDB4NDEsIDB4NjIsIDB4MDAsIDB4MjAsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgMHg4MCwgMHhiNSwgMHgwNywgMHgxYywgMHhiOCwgMHg2YiwgMHg0MSwgMHgwOSwgCisweDFjLCAweGQzLCAweGMwLCAweDA4LCAweDFhLCAweGQzLCAweGY4LCAweDFkLCAweDM5LCAweDMwLCAweDAwLCAweDdiLCAKKzB4MDYsIDB4MjgsIDB4MTUsIDB4ZDEsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4NTMsIDB4ZjgsIDB4MDEsIDB4MWMsIAorMHgwYSwgMHg0OCwgMHgwNywgMHhkMCwgMHg0MCwgMHgyMywgMHhiOSwgMHg2OSwgCisweDE5LCAweDQzLCAweGI5LCAweDYxLCAweDgxLCAweDZiLCAweDAxLCAweDMxLCAweDgxLCAweDYzLCAweDA3LCAweGUwLCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDIsIDB4YjksIDB4NjksIDB4MTksIDB4NDMsIDB4YjksIDB4NjEsIDB4YzEsIDB4NmEsIAorMHgwMSwgMHgzMSwgMHhjMSwgMHg2MiwgMHgwMCwgMHgyMCwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDBjLCAweDJiLCAweDAwLCAweDgwLCAweGIwLCAweGI1LCAweDA3LCAweDFjLCAweGI4LCAweDZiLCAweDgxLCAweDA5LCAKKzB4MmMsIDB4ZDMsIDB4YzAsIDB4MDgsIDB4MmEsIDB4ZDMsIDB4ZjgsIDB4MWQsIDB4MzksIDB4MzAsIDB4MDAsIDB4N2IsIAorMHgxMSwgMHgyOCwgMHgyNSwgMHhkMSwgMHhiOCwgMHg2YSwgMHgzOSwgMHg2YywgMHg0MCwgMHgxOCwgMHgwMSwgMHgyMywgCisweDliLCAweDA3LCAweDA2LCAweDMwLCAweDE4LCAweDQzLCAweDAwLCAweDY4LCAweDA1LCAweDA0LCAweDJkLCAweDBjLCAKKzB4MGYsIDB4NGMsIDB4MTEsIDB4ZDAsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MWYsIDB4ZjgsIDB4MDAsIDB4MjgsIAorMHgwYywgMHhkMCwgMHhhOCwgMHg0MiwgMHgwMiwgMHhkMSwgMHgwYywgMHg0YiwgMHg5OCwgMHg0MiwgMHgwNywgMHhkMCwgCisweDgwLCAweDIzLCAweGI4LCAweDY5LCAweDE4LCAweDQzLCAweGI4LCAweDYxLCAweDYwLCAweDZiLCAweDAxLCAweDMwLCAKKzB4NjAsIDB4NjMsIDB4MDcsIDB4ZTAsIDB4MDEsIDB4MjMsIDB4NWIsIDB4MDIsIDB4YjgsIDB4NjksIDB4MTgsIDB4NDMsIAorMHhiOCwgMHg2MSwgMHhhMCwgMHg2YSwgMHgwMSwgMHgzMCwgMHhhMCwgMHg2MiwgMHgwMCwgMHgyMCwgMHhiMCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDBjLCAweDJiLCAweDAwLCAweDgwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAKKzB4ZjAsIDB4YjUsIDB4ZmYsIDB4YjAsIDB4OTksIDB4YjAsIDB4MDQsIDB4MWMsIDB4ZTAsIDB4NmIsIDB4NjEsIDB4NmMsIAorMHgwOSwgMHgxOCwgMHgwMywgMHhhYSwgMHg4NSwgMHgxOCwgMHhhMywgMHg2YSwgMHgwMCwgMHgyMCwgMHg4YSwgMHgwOCwgCisweDAxLCAweDMyLCAweDk3LCAweDkyLCAweDA3LCAweGQwLCAweDgyLCAweDAwLCAweDlmLCAweDU4LCAweDAzLCAweGFlLCAKKzB4YjcsIDB4NTAsIDB4OTcsIDB4OWEsIDB4MDEsIDB4MzAsIDB4ODIsIDB4NDIsIDB4ZjcsIDB4ZDgsIDB4NjAsIDB4NmEsIAorMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgwNCwgMHgzMCwgMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgMHhjMCwgMHg0NiwgCisweDAyLCAweDkwLCAweDAyLCAweGFmLCAweDNmLCAweDg4LCAweDAzLCAweGE4LCAweGZmLCAweGY3LCAweDg3LCAweGZlLCAKKzB4YzAsIDB4NDMsIDB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIDB4MzgsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4NmQsIDB4ZmUsIAorMHgwNywgMHgxYywgMHhlMCwgMHg2YiwgMHhhMSwgMHg2YywgMHg0MCwgMHgxOCwgMHg2MSwgMHg2YSwgMHgwMSwgMHgyMywgCisweDliLCAweDA3LCAweDA4LCAweDMxLCAweDE5LCAweDQzLCAweDA5LCAweDY4LCAweGMwLCAweDQ2LCAweDAxLCAweDkxLCAKKzB4MDEsIDB4YTksIDB4MDksIDB4ODgsIDB4MDEsIDB4MzEsIDB4ODgsIDB4NDIsIDB4MGMsIDB4ZDIsIDB4YTIsIDB4NmEsIAorMHgxMiwgMHgxOCwgMHgwOSwgMHgxYSwgMHgxMCwgMHgxYywgMHgwMCwgMHhmMCwgMHgyZiwgMHhmOCwgMHhjMCwgMHg0MywgCisweDAxLCAweDA0LCAweDA5LCAweDBjLCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAweDUwLCAweGZlLCAweDA3LCAweDFjLCAKKzB4YTgsIDB4ODksIDB4ZTksIDB4ODksIDB4MDgsIDB4MTgsIDB4MjksIDB4OGEsIDB4MDgsIDB4MTgsIDB4NjksIDB4OGEsIAorMHgwOCwgMHgxOCwgMHg2OSwgMHg3YSwgMHgwOSwgMHgwMiwgMHgwOCwgMHgxOCwgMHhhMSwgMHg2YywgMHg2MiwgMHg2YywgCisweDg5LCAweDFhLCAweDBhLCAweDA0LCAweDEyLCAweDBjLCAweDExLCAweDAyLCAweDEyLCAweDBhLCAweDExLCAweDQzLCAKKzB4MDksIDB4MDQsIDB4MDksIDB4MGMsIDB4MDksIDB4MTgsIDB4MDgsIDB4MGMsIDB4MDUsIDB4ZDAsIDB4MDgsIDB4MDQsIAorMHgwMCwgMHgwYywgMHgwOSwgMHgwYywgMHg0MSwgMHgxOCwgMHgwOCwgMHgwYywgMHhmOSwgMHhkMSwgMHgzOCwgMHgxYywgCisweGZmLCAweGY3LCAweDJmLCAweGZlLCAweGMwLCAweDQzLCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDdmLCAweGIwLCAKKzB4MTksIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4YjAsIDB4YjQsIDB4MDAsIDB4MjIsIAorMHgwMCwgMHgyOSwgMHgyZSwgMHhkMCwgMHg4MywgMHgwNywgMHg5YiwgMHgwZiwgMHhkYywgMHgwMCwgMHg0NywgMHgxOCwgCisweDA0LCAweDI1LCAweGVmLCAweDFiLCAweGJmLCAweDA3LCAweGJmLCAweDBmLCAweGZmLCAweDAwLCAweDgwLCAweDA4LCAKKzB4ODAsIDB4MDAsIDB4NTksIDB4MTgsIDB4MDMsIDB4MzEsIDB4ODksIDB4MDgsIDB4NGQsIDB4MWUsIDB4MDIsIDB4YzgsIAorMHhlMSwgMHg0MCwgMHhhMSwgMHg0MCwgMHg2YiwgMHgxZSwgMHgwMCwgMHgyZCwgMHgwOSwgMHhkMCwgMHgwYywgMHgwNCwgCisweDI0LCAweDBjLCAweGEyLCAweDE4LCAweDA5LCAweDBjLCAweDhhLCAweDE4LCAweDAyLCAweGM4LCAweDFjLCAweDFjLCAKKzB4MDEsIDB4M2IsIDB4MDAsIDB4MmMsIDB4ZjUsIDB4ZDEsIDB4YjksIDB4NDAsIDB4MDgsIDB4MWMsIDB4ZjgsIDB4NDAsIAorMHgwMSwgMHgwNCwgMHgwOSwgMHgwYywgMHg4OSwgMHgxOCwgMHgwMCwgMHgwYywgMHg0MiwgMHgxOCwgMHgxMCwgMHgwYywgCisweDA1LCAweGQwLCAweDEwLCAweDA0LCAweDAwLCAweDBjLCAweDExLCAweDBjLCAweDQyLCAweDE4LCAweDEwLCAweDBjLCAKKzB4ZjksIDB4ZDEsIDB4MTAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4YjAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHg5MCwgMHhiNCwgMHgwMCwgMHgyMCwgMHgwMSwgMHgyNywgMHgxMSwgMHg0OSwgMHg0MiwgMHgwMCwgMHgxMiwgMHgxOCwgCisweGQyLCAweDAwLCAweDUzLCAweDE4LCAweDljLCAweDY4LCAweDAxLCAweDIzLCAKKzB4OWIsIDB4MDcsIDB4MjMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4MWIsIDB4MDMsIDB4MWIsIDB4MGIsIDB4OGEsIDB4NTgsIAorMHgxMiwgMHgwMywgMHgxMiwgMHgwYiwgMHg5MywgMHg0MiwgMHgwYywgMHhkMSwgMHgwMSwgMHgzMCwgMHgwNCwgMHgyOCwgCisweGVjLCAweGQzLCAweDA4LCAweDQ4LCAweGMwLCAweDZhLCAweDAxLCAweDAzLCAweDA5LCAweDBiLCAweDA3LCAweDQ4LCAKKzB4MDAsIDB4NmYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MGIsIDB4ODEsIDB4NDIsIDB4MDIsIDB4ZDAsIDB4MzgsIDB4MWMsIAorMHg5MCwgMHhiYywgMHg3MCwgMHg0NywgMHgwMCwgMHgyMCwgMHhmYiwgMHhlNywgMHhhOCwgMHgwMywgMHgwMCwgMHg4MCwgCisweDAwLCAweDQwLCAweDE0LCAweDQwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDk4LCAweGI0LCAweDE0LCAweDRhLCAKKzB4YzAsIDB4NDYsIDB4MDAsIDB4OTIsIDB4ODMsIDB4MDAsIDB4MTMsIDB4NDgsIDB4YzAsIDB4NTgsIDB4MDcsIDB4MDMsIAorMHgzZiwgMHgwYiwgMHgxMiwgMHg0OCwgMHhjMCwgMHg1OCwgMHgwMiwgMHgwMywgMHgxMiwgMHgwYiwgMHgxMSwgMHg0OCwgCisweGMwLCAweDU4LCAweDAwLCAweDAzLCAweDAwLCAweDBiLCAweDEwLCAweDRjLCAweGU0LCAweDU4LCAweDAxLCAweDIzLCAKKzB4OWIsIDB4MDcsIDB4MjMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4OWIsIDB4MDAsIDB4Y2MsIDB4MDAsIDB4MDEsIDB4MjEsIAorMHg5OCwgMHg0MiwgMHgwMSwgMHhkMSwgMHgwOCwgMHgxYywgMHgwOSwgMHhlMCwgMHg5OCwgMHg0MiwgMHgwMywgMHhkOSwgCisweDEwLCAweDFhLCAweGRhLCAweDFiLCAweDgwLCAweDE4LCAweDAwLCAweGUwLCAweDE4LCAweDFhLCAweDg0LCAweDQyLCAKKzB4ZjQsIDB4ZDMsIDB4MDAsIDB4MjAsIDB4OTgsIDB4YmMsIDB4NzAsIDB4NDcsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIAorMHgyMCwgMHgwNCwgMHgwMCwgMHg4MCwgMHgyOCwgMHgwNCwgMHgwMCwgMHg4MCwgMHgwOCwgMHgwNCwgMHgwMCwgMHg4MCwgCisweDE4LCAweDA0LCAweDAwLCAweDgwLCAweDgwLCAweGI0LCAweDEzLCAweDA0LCAweDAwLCAweGQwLCAweDAxLCAweDNhLCAKKzB4ODAsIDB4MDAsIDB4MGIsIDB4MWMsIDB4MTMsIDB4NDksIDB4MGYsIDB4NTgsIDB4YzAsIDB4NDYsIDB4M2IsIDB4NjAsIAorMHgwYiwgMHg1OCwgMHhjMCwgMHg0NiwgMHg1YSwgMHg2MCwgMHgwYSwgMHg1OCwgMHgwOCwgMHgzMiwgMHgxMCwgMHg0YiwgCisweDFiLCAweDU4LCAweDlhLCAweDQyLCAweDAxLCAweGQzLCAweDBmLCAweDRhLCAweDEyLCAweDU4LCAweDBmLCAweDRiLCAKKzB4MWYsIDB4NTgsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4M2IsIDB4NDMsIDB4MWIsIDB4NjgsIDB4OWIsIDB4MDAsIAorMHgxNywgMHgwMywgMHgzZiwgMHgwYiwgMHg5ZiwgMHg0MiwgMHgwNiwgMHhkMSwgMHgwYSwgMHg0OCwgMHhjMSwgMHg2OCwgCisweDAxLCAweDMxLCAweGMxLCAweDYwLCAweDAxLCAweDIwLCAweDgwLCAweGJjLCAweDcwLCAweDQ3LCAweDA4LCAweDRiLCAKKzB4MWIsIDB4NTgsIDB4YzAsIDB4NDYsIDB4MWEsIDB4NjAsIDB4MGEsIDB4NTAsIDB4MDAsIDB4MjAsIDB4ZjYsIDB4ZTcsIAorMHgwOCwgMHgwNCwgMHgwMCwgMHg4MCwgMHgyOCwgMHgwNCwgMHgwMCwgMHg4MCwgMHgyMCwgMHgwNCwgMHgwMCwgMHg4MCwgCisweDE4LCAweDA0LCAweDAwLCAweDgwLCAweGEwLCAweDgyLCAweDIwLCAweDQwLCAweDEwLCAweDA0LCAweDAwLCAweDgwLCAKKzB4ZmYsIDB4NWYsIDB4MmQsIDB4ZTksIDB4NDgsIDB4ZmUsIDB4ZmYsIDB4ZWIsIDB4MDEsIDB4YjYsIDB4YTAsIDB4ZTMsIAorMHgwMSwgMHhiMSwgMHg4YiwgMHhlMiwgMHgwMiwgMHg4YSwgMHhhMCwgMHhlMywgMHgwMSwgMHg3YSwgMHhhMCwgMHhlMywgCisweDAxLCAweGE5LCAweGEwLCAweGUzLCAweDAxLCAweDU2LCAweGEwLCAweGUzLCAweGM4LCAweDYwLCAweDlmLCAweGU1LCAKKzB4YzgsIDB4OTAsIDB4OWYsIDB4ZTUsIDB4MTQsIDB4NDAsIDB4OWIsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4NTQsIDB4ZTMsIAorMHgyYywgMHgwMCwgMHgwMCwgMHgwYSwgMHgwMywgMHgwYSwgMHgxNCwgMHhlMywgMHgxMSwgMHgwMCwgMHgwMCwgMHgwYSwgCisweDBjLCAweDAwLCAweDk2LCAweGU1LCAweDAwLCAweDAwLCAweDUwLCAweGUzLCAweDIxLCAweDAwLCAweDAwLCAweDBhLCAKKzB4MDEsIDB4MGEsIDB4MTQsIDB4ZTMsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MWMsIDB4MDAsIDB4OTYsIDB4ZTUsIAorMHgwMSwgMHgwYSwgMHhjMCwgMHhlMywgMHgxYywgMHgwMCwgMHg4NiwgMHhlNSwgMHgxYywgMHgwMCwgMHg4NSwgMHhlNSwgCisweDE0LCAweDcwLCAweDg1LCAweGU1LCAweDA2LCAweDAwLCAweDAwLCAweGVhLCAweDAyLCAweDBhLCAweDE0LCAweGUzLCAKKzB4MDQsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MWMsIDB4MDAsIDB4OTYsIDB4ZTUsIDB4MDIsIDB4MGEsIDB4YzAsIDB4ZTMsIAorMHgxYywgMHgwMCwgMHg4NiwgMHhlNSwgMHgxYywgMHgwMCwgMHg4NSwgMHhlNSwgMHgxNCwgMHg4MCwgMHg4NSwgMHhlNSwgCisweDAxLCAweDA5LCAweDE0LCAweGUzLCAweDA0LCAweDAwLCAweDAwLCAweDBhLCAweDFjLCAweDAwLCAweDk2LCAweGU1LCAKKzB4MDEsIDB4MDksIDB4YzAsIDB4ZTMsIDB4MWMsIDB4MDAsIDB4ODYsIDB4ZTUsIDB4MWMsIDB4MDAsIDB4ODUsIDB4ZTUsIAorMHgxNCwgMHhhMCwgMHg4NSwgMHhlNSwgMHgwMiwgMHgwMCwgMHgxNCwgMHhlMywgMHg0MCwgMHgwMCwgMHgwMCwgMHgxYiwgCisweDAxLCAweDAwLCAweDE0LCAweGUzLCAweDU0LCAweDAwLCAweDAwLCAweDFiLCAweDAyLCAweDBiLCAweDE0LCAweGUzLCAKKzB4NjcsIDB4MDAsIDB4MDAsIDB4MWIsIDB4MDEsIDB4MGIsIDB4MTQsIDB4ZTMsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MWIsIAorMHgxOCwgMHgwMCwgMHg5OSwgMHhlNSwgMHgwMSwgMHgwMCwgMHg4MCwgMHhlMiwgMHgxOCwgMHgwMCwgMHg4OSwgMHhlNSwgCisweGQ1LCAweGZmLCAweGZmLCAweGVhLCAweDFjLCAweDAwLCAweDk2LCAweGU1LCAweDAxLCAweDBhLCAweGMwLCAweGUzLCAKKzB4MWMsIDB4MDAsIDB4ODYsIDB4ZTUsIDB4MWMsIDB4MDAsIDB4ODUsIDB4ZTUsIAorMHgxNCwgMHg3MCwgMHg4NSwgMHhlNSwgMHhlMSwgMHhmZiwgMHhmZiwgMHhlYSwgMHhmZiwgMHg1ZiwgMHhiZCwgMHhlOCwgCisweDA0LCAweGYwLCAweDVlLCAweGUyLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDA4LCAweDgzLCAweDIwLCAweDQwLCAKKzB4MTAsIDB4MTAsIDB4MWYsIDB4ZTUsIDB4MTQsIDB4MzAsIDB4OTEsIDB4ZTUsIDB4MDAsIDB4MjAsIDB4YzMsIDB4ZTEsIAorMHgxNCwgMHgyMCwgMHg4MSwgMHhlNSwgMHgwMSwgMHgxNiwgMHhhMCwgMHhlMywgMHgwYywgMHgyMCwgMHg4MSwgMHhlNSwgCisweDBiLCAweDEyLCAweGEwLCAweGUzLCAweDAwLCAweDAwLCAweDgxLCAweGU1LCAweDE4LCAweDEwLCAweDlmLCAweGU1LCAKKzB4YjAsIDB4MjQsIDB4ZDEsIDB4ZTEsIDB4MDEsIDB4MjAsIDB4ODIsIDB4ZTIsIDB4YjAsIDB4MjQsIDB4YzEsIDB4ZTEsIAorMHgzYywgMHgyMCwgMHg5MSwgMHhlNSwgMHgwMCwgMHgwMCwgMHg4MiwgMHhlMSwgMHgzYywgMHgwMCwgMHg4MSwgMHhlNSwgCisweDFlLCAweGZmLCAweDJmLCAweGUxLCAweGEwLCAweDgyLCAweDIwLCAweDQwLCAweGZmLCAweGZmLCAweGZmLCAweGVhLCAKKzB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZWEsIDB4MDEsIDB4MGIsIDB4YTAsIDB4ZTMsIDB4MDEsIDB4MTYsIDB4YTAsIDB4ZTMsIAorMHgxNCwgMHgwMCwgMHg4MSwgMHhlNSwgMHgwMCwgMHgxYSwgMHg4MSwgMHhlMSwgMHgyNCwgMHgyMCwgMHg5MSwgMHhlNSwgCisweDcwLCAweDAwLCAweDFmLCAweGU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDI0LCAweDIwLCAweDgwLCAweGU1LCAKKzB4MjgsIDB4MTAsIDB4OTEsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MTAsIDB4ODAsIDB4ZTUsIAorMHgyYywgMHgyMCwgMHg5MCwgMHhlNSwgMHgwMSwgMHgyMCwgMHg4MiwgMHhlMiwgMHgyYywgMHgyMCwgMHg4MCwgMHhlNSwgCisweDNmLCAweDAwLCAweDAxLCAweGUyLCAweDNmLCAweDAwLCAweDUwLCAweGUzLCAweDFlLCAweGZmLCAweDJmLCAweDExLCAKKzB4MTgsIDB4MDAsIDB4OWYsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4OTAsIDB4ZTUsIDB4MDEsIDB4MTAsIDB4ODEsIDB4ZTIsIAorMHgwMCwgMHgxMCwgMHg4MCwgMHhlNSwgMHgwMiwgMHgxOCwgMHhhMCwgMHhlMywgMHgwYiwgMHgwMiwgMHhhMCwgMHhlMywgCisweDAwLCAweDEwLCAweDgwLCAweGU1LCAweDFlLCAweGZmLCAweDJmLCAweGUxLCAweDMwLCAweDA0LCAweDAwLCAweDgwLCAKKzB4MDEsIDB4MDYsIDB4YTAsIDB4ZTMsIDB4MDEsIDB4MDEsIDB4ODAsIDB4ZTIsIDB4MDAsIDB4MTAsIDB4OTAsIDB4ZTUsIAorMHgwMSwgMHgwOCwgMHgxMSwgMHhlMywgMHgwYiwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMiwgMHgxOSwgMHg4MSwgMHhlMiwgCisweDA1LCAweDAwLCAweDAwLCAweDFhLCAweDAwLCAweDIwLCAweDkwLCAweGU1LCAweDQyLCAweDI4LCAweGIwLCAweGUxLCAKKzB4MDUsIDB4MDAsIDB4MDAsIDB4MWEsIDB4MDAsIDB4MDAsIDB4OTAsIDB4ZTUsIDB4MDIsIDB4MGMsIDB4MTAsIDB4ZTMsIAorMHgwMiwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwNiwgMHgwNywgMHhhMCwgMHhlMywgMHg0YywgMHgxMSwgMHg4MCwgMHhlNSwgCisweDAzLCAweDAwLCAweDAwLCAweGVhLCAweDBjLCAweDAwLCAweDlmLCAweGU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4NDAsIDB4MTAsIDB4ODAsIDB4ZTUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZWEsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZWEsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMSwgMHgwNiwgMHhhMCwgMHhlMywgMHgwMSwgMHgwMSwgMHg4MCwgMHhlMiwgCisweDAwLCAweDEwLCAweDkwLCAweGU1LCAweDAxLCAweDA4LCAweDExLCAweGUzLCAweDBjLCAweDEwLCAweGEwLCAweGUzLCAKKzB4MDIsIDB4MTksIDB4ODEsIDB4ZTIsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MWEsIDB4MDAsIDB4MjAsIDB4OTAsIDB4ZTUsIAorMHg0MiwgMHgyOCwgMHhiMCwgMHhlMSwgMHgwNSwgMHgwMCwgMHgwMCwgMHgxYSwgMHgwMCwgMHgwMCwgMHg5MCwgMHhlNSwgCisweDAyLCAweDBjLCAweDEwLCAweGUzLCAweDAyLCAweDAwLCAweDAwLCAweDBhLCAweDA2LCAweDA3LCAweGEwLCAweGUzLCAKKzB4NGMsIDB4MTEsIDB4ODAsIDB4ZTUsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZWEsIDB4NGMsIDB4MDAsIDB4MWYsIDB4ZTUsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgxMCwgMHg4MCwgMHhlNSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhlYSwgCisweGZlLCAweGZmLCAweGZmLCAweGVhLCAweDAyLCAweDFiLCAweGEwLCAweGUzLCAweDAxLCAweDA2LCAweGEwLCAweGUzLCAKKzB4MTQsIDB4MTAsIDB4ODAsIDB4ZTUsIDB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4ODAsIDB4MjEsIDB4MWYsIDB4ZTUsIAorMHgxNCwgMHgzMCwgMHg5MiwgMHhlNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMCwgMHg4MCwgMHhlNSwgCisweDFjLCAweDAwLCAweDkyLCAweGU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgxLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MTQsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDEsIDB4MDYsIDB4YTAsIDB4ZTMsIAorMHgxYywgMHgxMCwgMHg4MiwgMHhlNSwgMHgwYywgMHgxMCwgMHg4MCwgMHhlNSwgMHgxYywgMHgxMCwgMHg5MiwgMHhlNSwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDFjLCAweDEwLCAweDgwLCAweGU1LCAweDFlLCAweGZmLCAweDJmLCAweGUxLCAKKzB4YzAsIDB4MjEsIDB4MWYsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MWMsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMSwgMHgxNiwgMHhhMCwgMHhlMywgMHgxNCwgMHgwMCwgMHg4MiwgMHhlNSwgMHgwYywgMHgwMCwgMHg4MSwgMHhlNSwgCisweDFjLCAweDAwLCAweDkyLCAweGU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDFjLCAweDAwLCAweDgxLCAweGU1LCAKKzB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4ODAsIDB4YjUsIDB4MGYsIDB4MWMsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHgxNywgMHhmOCwgMHgwMCwgMHgyOCwgMHgwMiwgMHhkMCwgMHgzOCwgMHgxYywgCisweDAwLCAweGYwLCAweDkyLCAweGY4LCAweDAwLCAweDIwLCAweDgwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4ODAsIDB4YjUsIDB4MGYsIDB4MWMsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MDksIDB4ZjgsIDB4MDAsIDB4MjgsIAorMHgwMiwgMHhkMCwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHg4NCwgMHhmOCwgMHgwMCwgMHgyMCwgMHg4MCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweGYwLCAweGI0LCAweDA3LCAweDY4LCAweDNhLCAweDc4LCAweGQyLCAweDA3LCAKKzB4ZDIsIDB4MGYsIDB4MDAsIDB4MjQsIDB4MDAsIDB4MmEsIDB4MDMsIDB4ZDAsIDB4ZmYsIDB4MjIsIDB4MDEsIDB4MzIsIAorMHg0MiwgMHg2MCwgMHgwMCwgMHhlMCwgMHg0NCwgMHg2MCwgMHgzYSwgMHg3YiwgMHg3YiwgMHg3YiwgMHgxYiwgMHgwMiwgCisweDFhLCAweDQzLCAweDgxLCAweDJhLCAweDA4LCAweGQxLCAweDAxLCAweDIzLCAweDViLCAweDAyLCAweDQyLCAweDY4LCAKKzB4MWEsIDB4NDMsIDB4NDIsIDB4NjAsIDB4MDQsIDB4MjIsIDB4YmYsIDB4MTgsIDB4ODIsIDB4NjAsIDB4MDAsIDB4ZTAsIAorMHg4NCwgMHg2MCwgMHgzYSwgMHg3YiwgMHg3YiwgMHg3YiwgMHgxYiwgMHgwMiwgMHgxYSwgMHg0MywgMHgwOCwgMHgyYSwgCisweDA2LCAweGQxLCAweDA2LCAweDIzLCAweDQxLCAweDY4LCAweDE5LCAweDQzLCAweDQxLCAweDYwLCAweDgxLCAweDY4LCAKKzB4MGUsIDB4MzEsIDB4M2MsIDB4ZTAsIDB4YzEsIDB4MjMsIDB4ZGIsIDB4MDAsIDB4OWEsIDB4NDIsIDB4MDMsIDB4ZDEsIAorMHg0MSwgMHg2OCwgMHgyNCwgMHg0YiwgMHgxOSwgMHg0MywgMHgzZSwgMHhlMCwgMHgyMywgMHg0YiwgMHg5YSwgMHg0MiwgCisweDA0LCAweGQxLCAweDAxLCAweDIzLCAweDFiLCAweDAzLCAweDQxLCAweDY4LCAweDE5LCAweDQzLCAweDM2LCAweGUwLCAKKzB4MTMsIDB4MDIsIDB4MTIsIDB4MGEsIDB4MTIsIDB4MDYsIDB4MTIsIDB4MGUsIDB4MWEsIDB4NDMsIDB4MTIsIDB4MDQsIAorMHgxMiwgMHgwYywgMHgyZSwgMHgzYSwgMHgxYywgMHg0YiwgMHg5YSwgMHg0MiwgMHgyZCwgMHhkOCwgMHgwMSwgMHgyNSwgCisweDQyLCAweDY4LCAweDE1LCAweDQzLCAweDQ1LCAweDYwLCAweGJhLCAweDdiLCAweGZiLCAweDdiLCAweDFiLCAweDAyLCAKKzB4MWEsIDB4NDMsIDB4MTgsIDB4NGIsIDB4OWEsIDB4NDIsIDB4MjIsIDB4ZDEsIDB4ZmIsIDB4MWQsIDB4MDksIDB4MzMsIAorMHg0NCwgMHhjYiwgMHg5YiwgMHgwNywgMHhkYiwgMHgwZSwgMHhkYSwgMHg0MCwgMHg1YiwgMHg0MiwgMHgyMCwgMHgzMywgCisweDllLCAweDQwLCAweDE2LCAweDQzLCAweDAzLCAweDJlLCAweDE4LCAweGQxLCAweDM5LCAweDdkLCAweDdiLCAweDdkLCAKKzB4MWIsIDB4MDIsIDB4MTksIDB4NDMsIDB4MDgsIDB4MjksIDB4MDcsIDB4ZDEsIDB4MDQsIDB4MjEsIDB4MjksIDB4NDMsIAorMHg0MSwgMHg2MCwgMHg4MSwgMHg2OCwgMHgxNiwgMHgzMSwgMHg4MSwgMHg2MCwgMHgwMSwgMHgyMSwgMHgwYSwgMHhlMCwgCisweGMxLCAweDIzLCAweGRiLCAweDAwLCAweDk5LCAweDQyLCAweDA0LCAweGQxLCAweDAxLCAweDIxLCAweDg5LCAweDAzLCAKKzB4MjksIDB4NDMsIDB4NDEsIDB4NjAsIDB4MDAsIDB4ZTAsIDB4ODQsIDB4NjAsIDB4MDAsIDB4MjEsIDB4MDgsIDB4MWMsIAorMHhmMCwgMHhiYywgMHg3MCwgMHg0NywgMHgwMiwgMHg0MCwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4MCwgMHgwMCwgMHgwMCwgCisweGFlLCAweDA1LCAweDAwLCAweDAwLCAweGFhLCAweGFhLCAweDAwLCAweDAwLCAweDgwLCAweGI0LCAweDQyLCAweDY4LCAKKzB4ZDEsIDB4MDgsIDB4M2YsIDB4ZDMsIDB4MDEsIDB4NjgsIDB4ODMsIDB4NjgsIDB4NTksIDB4MTgsIDB4MDIsIDB4MzksIAorMHg4ZiwgMHg3OCwgMHgzZiwgMHgwNywgMHgzZiwgMHgwZiwgMHgwNSwgMHgyZiwgMHgwMywgMHhkMSwgMHhkYSwgMHgxZCwgCisweDBkLCAweDMyLCAweGMyLCAweDYwLCAweDA1LCAweGUwLCAweGJmLCAweDAwLCAweGRiLCAweDE5LCAweGMzLCAweDYwLCAKKzB4MDgsIDB4MjMsIDB4MWEsIDB4NDMsIDB4NDIsIDB4NjAsIDB4OGEsIDB4NzgsIDB4MTIsIDB4MDcsIDB4MTIsIDB4MGYsIAorMHg5MiwgMHgwMCwgMHgwMiwgMHg2MSwgMHgwYSwgMHg3OSwgMHg0YiwgMHg3OSwgMHgxYiwgMHgwMiwgMHgxYSwgMHg0MywgCisweDEzLCAweDAyLCAweDEyLCAweDBhLCAweDEyLCAweDA2LCAweDEyLCAweDBlLCAweDFhLCAweDQzLCAweDEyLCAweDA0LCAKKzB4MTIsIDB4MGMsIDB4NDIsIDB4NjEsIDB4Y2EsIDB4N2EsIDB4MDYsIDB4MmEsIDB4MDMsIDB4ZDEsIDB4MTAsIDB4MjMsIAorMHg0MiwgMHg2OCwgMHgxYSwgMHg0MywgMHgxMCwgMHhlMCwgMHgxMSwgMHgyYSwgMHgwMywgMHhkMSwgMHgyMCwgMHgyMywgCisweDQyLCAweDY4LCAweDFhLCAweDQzLCAweDBhLCAweGUwLCAweDMzLCAweDJhLCAweDAzLCAweGQxLCAweDQwLCAweDIzLCAKKzB4NDIsIDB4NjgsIDB4MWEsIDB4NDMsIDB4MDQsIDB4ZTAsIDB4MzIsIDB4MmEsIDB4MDMsIDB4ZDEsIDB4ODAsIDB4MjMsIAorMHg0MiwgMHg2OCwgMHgxYSwgMHg0MywgMHg0MiwgMHg2MCwgMHhjOSwgMHg3YSwgMHhjMCwgMHg0NiwgMHgwMSwgMHg3NiwgCisweDgwLCAweGJjLCAweDcwLCAweDQ3LCAweDBhLCAweDc4LCAweGMwLCAweDQ2LCAweDAyLCAweDYwLCAweDRiLCAweDc4LCAKKzB4MWIsIDB4MDIsIDB4MWEsIDB4NDMsIDB4MDIsIDB4NjAsIDB4OGIsIDB4NzgsIDB4MWIsIDB4MDQsIDB4MWEsIDB4NDMsIAorMHgwMiwgMHg2MCwgMHhjOSwgMHg3OCwgMHgwOSwgMHgwNiwgMHgxMSwgMHg0MywgMHgwMSwgMHg2MCwgMHg3MCwgMHg0NywgCisweDgwLCAweGI1LCAweDA3LCAweDFjLCAweDQ4LCAweDY4LCAweDgwLCAweDA5LCAweDI2LCAweGQzLCAweGI4LCAweDZhLCAKKzB4YzksIDB4NjgsIDB4NDAsIDB4MTgsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MDIsIDB4MzAsIDB4MTgsIDB4NDMsIAorMHgwMCwgMHg2OCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgMHgxMSwgMHgyMywgMHg5YiwgMHgwMiwgMHg5OCwgMHg0MiwgCisweDE4LCAweGQxLCAweDc4LCAweDZhLCAweDM5LCAweDZiLCAweGMwLCAweDQ2LCAKKzB4NDgsIDB4NjIsIDB4MzgsIDB4NmIsIDB4MDIsIDB4ZjAsIDB4ZGEsIDB4ZjgsIDB4MzgsIDB4MWMsIDB4MDEsIDB4ZjAsIAorMHg5NSwgMHhmZCwgMHgwMSwgMHgyMCwgMHgwNywgMHg0OSwgMHhjMCwgMHg0NiwgMHhjOCwgMHg3MywgMHgwNywgMHg0OSwgCisweDRhLCAweDZjLCAweDEyLCAweDE4LCAweDRhLCAweDY0LCAweDA2LCAweDQ5LCAweDhhLCAweDZkLCAweDEyLCAweDE4LCAKKzB4OGEsIDB4NjUsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MjAsIDB4ZmEsIDB4ZTcsIAorMHgxOCwgMHgxYSwgMHgwMCwgMHg4MCwgMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgMHhhNCwgMHgyYSwgMHgwMCwgMHg4MCwgCisweDgxLCAweDA3LCAweDE5LCAweGQwLCAweDgwLCAweDA4LCAweDgwLCAweDAwLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAKKzB4MDEsIDB4MWQsIDB4MTgsIDB4NDMsIDB4MDAsIDB4NjgsIDB4MTksIDB4NDMsIDB4MDksIDB4NjgsIDB4MDIsIDB4MDIsIAorMHgxMiwgMHgwZSwgMHgxMiwgMHgwNiwgMHgwMCwgMHgwYSwgMHhmZiwgMHgyMywgMHgxYiwgMHgwNCwgMHgxOCwgMHg0MCwgCisweDEwLCAweDQzLCAweDBhLCAweDBhLCAweDEyLCAweDA2LCAweDEyLCAweDBlLCAweDEwLCAweDQzLCAweDA5LCAweDAyLCAKKzB4MWIsIDB4MGEsIDB4MTksIDB4NDAsIDB4MDgsIDB4NDMsIDB4NzAsIDB4NDcsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIAorMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgMHgwMSwgMHgwNiwgMHgwMiwgMHgwMiwgMHhmZiwgMHgyMywgMHgxYiwgMHgwNCwgCisweDFhLCAweDQwLCAweDExLCAweDQzLCAweDAyLCAweDBhLCAweDFiLCAweDBhLCAweDFhLCAweDQwLCAweDExLCAweDQzLCAKKzB4MDAsIDB4MGUsIDB4MDgsIDB4NDMsIDB4ZWQsIDB4ZTcsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4YjUsIDB4MDQsIDB4MjMsIAorMHg4MSwgMHg2YiwgMHgxOSwgMHg0MCwgMHgwMCwgMHgyMiwgMHgwMCwgMHgyOSwgMHg0NiwgMHhkMCwgMHhjNywgMHgxZCwgCisweDM5LCAweDM3LCAweDM5LCAweDdiLCAweDMzLCAweDI5LCAweDAxLCAweGQwLCAweDMyLCAweDI5LCAweDNmLCAweGQxLCAKKzB4MDEsIDB4NmIsIDB4YzAsIDB4NDYsIDB4NGEsIDB4NjUsIDB4YzQsIDB4MWQsIDB4MmQsIDB4MzQsIDB4Y2QsIDB4MWQsIAorMHgyZCwgMHgzNSwgMHgwMCwgMHgyMiwgMHg5MywgMHgwMCwgMHhlNiwgMHg1OCwgMHhjMCwgMHg0NiwgMHhlZSwgMHg1MCwgCisweDAxLCAweDMyLCAweDA3LCAweDJhLCAweGY4LCAweGQzLCAweDgyLCAweDZhLCAweGMwLCAweDQ2LCAweDRhLCAweDYzLCAKKzB4ODIsIDB4NmEsIDB4YzAsIDB4NDYsIDB4OGEsIDB4NjIsIDB4N2EsIDB4OGIsIDB4Y2IsIDB4MWQsIDB4MzksIDB4MzMsIAorMHg1YSwgMHg4MywgMHg0MCwgMHg2YSwgMHhjMCwgMHg0NiwgMHg0OCwgMHg2MiwgMHgxMiwgMHg0OCwgMHgwMSwgMHgyNywgCisweDQyLCAweDY4LCAweDAwLCAweDJhLCAweDEwLCAweGQxLCAweGMyLCAweDY4LCAweDAwLCAweDJhLCAweDEzLCAweGQxLCAKKzB4NDIsIDB4NjksIDB4MDAsIDB4MmEsIDB4MGQsIDB4ZDEsIDB4MDEsIDB4NjEsIDB4YzEsIDB4NjAsIDB4MDEsIDB4NmEsIAorMHgwMiwgMHgyOSwgMHgwMiwgMHhkMywgMHgyMCwgMHgzMCwgMHgwNywgMHg3MSwgMHgwYywgMHhlMCwgMHgwMCwgMHhmMCwgCisweDEzLCAweGY4LCAweDA5LCAweGUwLCAweGMyLCAweDY4LCAweDAwLCAweDJhLCAweDAyLCAweGQxLCAweDAxLCAweDYxLCAKKzB4YzEsIDB4NjAsIDB4MDMsIDB4ZTAsIDB4MDIsIDB4NjksIDB4YzAsIDB4NDYsIDB4NTEsIDB4NjUsIDB4MDEsIDB4NjEsIAorMHgzOCwgMHgxYywgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgxMCwgMHgxYywgMHhmYSwgMHhlNywgCisweDZjLCAweDA2LCAweDAwLCAweDgwLCAweDgwLCAweGI1LCAweDFlLCAweDQ5LCAweDAwLCAweDIyLCAweGNiLCAweDY4LCAKKzB4MDAsIDB4MmIsIDB4MzQsIDB4ZDAsIDB4YzgsIDB4MWQsIDB4ZjksIDB4MzAsIDB4ODMsIDB4NjIsIDB4Y2IsIDB4NjgsIAorMHg5YiwgMHg2YSwgMHhjMCwgMHg0NiwgMHhjMywgMHg2MiwgMHhjZiwgMHg2OSwgMHg3YiwgMHgwMCwgMHhkZiwgMHgxOSwgCisweDdmLCAweDAyLCAweDE3LCAweDRiLCAweGZmLCAweDE4LCAweGZmLCAweDM3LCAweDY1LCAweDM3LCAweDgzLCAweDYzLCAKKzB4MDcsIDB4NjMsIDB4Y2IsIDB4MWQsIDB4ZmYsIDB4MzMsIDB4NWEsIDB4MzMsIDB4MWEsIDB4NzIsIDB4Y2IsIDB4NjksIAorMHgwMCwgMHgyYiwgMHgwMSwgMHhkMCwgMHhjYSwgMHg2MSwgMHgwMSwgMHhlMCwgMHgwMSwgMHgyMywgMHhjYiwgMHg2MSwgCisweDBmLCAweDFjLCAweGM5LCAweDY4LCAweDQ5LCAweDZhLCAweDA5LCAweDg5LCAweDAxLCAweDMxLCAweDQxLCAweDYzLCAKKzB4ZjgsIDB4MWQsIDB4ZmYsIDB4MzAsIDB4M2EsIDB4MzAsIDB4NDIsIDB4NjAsIDB4MDIsIDB4ODIsIDB4ODIsIDB4NjAsIAorMHhjMiwgMHg2MCwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHhjZSwgMHhmYSwgMHgzOCwgMHg2YSwgMHgwMSwgMHgzMCwgCisweDM4LCAweDYyLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDBhLCAweGY4LCAweDgwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MTAsIDB4MWMsIDB4ZmEsIDB4ZTcsIDB4MDAsIDB4MDAsIDB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIAorMHhhYywgMHhhYiwgMHgyMCwgMHg0MCwgMHhmMCwgMHhiNSwgMHgwNywgMHgxYywgMHhmOSwgMHgxZCwgMHhmOSwgMHgzMSwgCisweDg4LCAweDZhLCAweGMyLCAweDFkLCAweDJkLCAweDMyLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDA4LCAweDMyLCAKKzB4MWEsIDB4NDMsIDB4YzgsIDB4NmEsIDB4MTIsIDB4NjgsIDB4MTIsIDB4MDQsIDB4MTIsIDB4MGMsIDB4ODAsIDB4MTgsIAorMHg4MiwgMHg3OSwgMHhjMywgMHg3OSwgMHgxYiwgMHgwMiwgMHgxYSwgMHg0MywgMHgxMywgMHgwMiwgMHgxMiwgMHgwYSwgCisweDEyLCAweDA2LCAweDEyLCAweDBlLCAweDFhLCAweDQzLCAweDEyLCAweDA0LCAweDEyLCAweDBjLCAweDAyLCAweDM4LCAKKzB4OTIsIDB4MDQsIDB4OTIsIDB4MGMsIDB4MDAsIDB4MjYsIDB4MjUsIDB4NGQsIAorMHhlYywgMHgxZCwgMHhmZiwgMHgzNCwgMHgzYSwgMHgzNCwgMHgwMCwgMHgyYSwgMHgwNCwgMHhkMCwgMHgyMCwgMHg4YSwgCisweDAxLCAweDIzLCAweDliLCAweDAyLCAweDE4LCAweDQzLCAweDJiLCAweGUwLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAKKzB4YzIsIDB4MWQsIDB4MGQsIDB4MzIsIDB4MWEsIDB4NDMsIDB4MTIsIDB4NjgsIDB4MTIsIDB4MDQsIDB4MTIsIDB4MzAsIAorMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgMHgxMCwgMHg0MywgMHgwMywgMHgxYywgCisweGY4LCAweDFkLCAweGZmLCAweDMwLCAweDRhLCAweDMwLCAweDgyLCAweDc4LCAweGM4LCAweDZiLCAweDE5LCAweDFjLCAKKzB4MDIsIDB4ZjAsIDB4MDIsIDB4ZjgsIDB4MDAsIDB4MjgsIDB4MDQsIDB4ZGEsIDB4MjAsIDB4OGEsIDB4ZmYsIDB4MjMsIAorMHgwMSwgMHgzMywgMHgxOCwgMHg0MywgMHgwZSwgMHhlMCwgMHhmOSwgMHgxZCwgMHhmZiwgMHgzMSwgMHgzYSwgMHgzMSwgCisweDA4LCAweDYwLCAweDAxLCAweDA0LCAweDA5LCAweDBjLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDFjLCAweGY4LCAKKzB4MDAsIDB4MjgsIDB4MTQsIDB4ZDEsIDB4MjAsIDB4OGEsIDB4MDEsIDB4MjMsIDB4NWIsIDB4MDIsIDB4MTgsIDB4NDMsIAorMHgyMCwgMHg4MiwgMHgyMSwgMHg4YSwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHhhMiwgMHhmYiwgMHhlOCwgMHg2OCwgCisweDAxLCAweDIzLCAweDliLCAweDA3LCAweDU0LCAweDMwLCAweDE4LCAweDQzLCAweDAwLCAweDY4LCAweGMwLCAweDQ2LCAKKzB4ZTgsIDB4NjAsIDB4MzAsIDB4MWMsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDEsIDB4MjAsIAorMHhmYSwgMHhlNywgMHgwMCwgMHgwMCwgMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgMHhmOCwgMHhiNSwgMHgwNywgMHgxYywgCisweGZjLCAweDFkLCAweGY5LCAweDM0LCAweGEwLCAweDZiLCAweGE2LCAweDZhLCAweGM1LCAweDFkLCAweDBkLCAweDM1LCAKKzB4MzgsIDB4NDgsIDB4YzAsIDB4NmEsIDB4NGIsIDB4MDAsIDB4NTksIDB4MTgsIDB4NDksIDB4MDEsIDB4NDIsIDB4MTgsIAorMHgwMSwgMHgyMCwgMHg4MCwgMHgwNywgMHgxMCwgMHg0MywgMHgwMCwgMHg2OCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgCisweDAwLCAweDkwLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweGQwLCAweDFkLCAweDA1LCAweDMwLCAweDE4LCAweDQzLCAKKzB4MDAsIDB4NjgsIDB4MzgsIDB4MWMsIDB4MjksIDB4MWMsIDB4MDAsIDB4ZjAsIDB4YzIsIDB4ZmEsIDB4YTgsIDB4ODgsIAorMHg0MSwgMHgwNywgMHgwMSwgMHhkMCwgMHgwMCwgMHgyMCwgMHg1MSwgMHhlMCwgMHgyOSwgMHg4OSwgMHgwOSwgMHgxOCwgCisweDYwLCAweDZiLCAweDgxLCAweDQyLCAweGY4LCAweGQ4LCAweDY5LCAweDg5LCAweGVhLCAweDg4LCAweDg5LCAweDE4LCAKKzB4ODEsIDB4NDIsIDB4ZjMsIDB4ZDgsIDB4MDAsIDB4OTgsIDB4MDEsIDB4MjgsIDB4MjUsIDB4ZDEsIDB4ZTAsIDB4NmEsIAorMHhmMSwgMHg2YiwgMHg0MCwgMHgxOCwgMHg3MSwgMHg2YywgMHhmYSwgMHgxZCwgMHhjZCwgMHgzMiwgMHgwMSwgMHhmMCwgCisweDMzLCAweGY5LCAweGZhLCAweDFkLCAweGZmLCAweDMyLCAweDNhLCAweDMyLCAweGUwLCAweDZhLCAweDUxLCAweDY5LCAKKzB4NDAsIDB4MTgsIDB4YzMsIDB4MWQsIDB4MDMsIDB4MzMsIDB4MDAsIDB4MjAsIDB4ODEsIDB4MDAsIDB4NWUsIDB4NTgsIAorMHhjOSwgMHgxOSwgMHhmZiwgMHgzMSwgMHgwMSwgMHgzMSwgMHg0ZSwgMHg2MSwgMHgwMSwgMHgzMCwgMHgwNCwgMHgyOCwgCisweGY2LCAweGQzLCAweGUwLCAweDZhLCAweDUxLCAweDY5LCAweDQwLCAweDE4LCAweGMxLCAweDFkLCAweDA1LCAweDMxLCAKKzB4MDAsIDB4MjAsIDB4MDAsIDB4MjIsIDB4NDMsIDB4MDAsIDB4Y2EsIDB4NTIsIDB4MDEsIDB4MzAsIDB4MDYsIDB4MjgsIAorMHhmYSwgMHhkMywgMHgyOSwgMHgxYywgMHgxMSwgMHg0YSwgMHgwMCwgMHgyMCwgMHhmZiwgMHhmNywgMHhhZSwgMHhmYiwgCisweDAxLCAweDIyLCAweDUyLCAweDA0LCAweDYwLCAweDZiLCAweDAyLCAweDQzLCAweDAxLCAweDIwLCAweDIxLCAweDZiLCAKKzB4ZmYsIDB4ZjcsIDB4YTYsIDB4ZmIsIDB4MDEsIDB4MjIsIDB4NTIsIDB4MDQsIDB4NjAsIDB4NmIsIDB4MDIsIDB4NDMsIAorMHgwMCwgMHgyMCwgMHhlMSwgMHg2YSwgMHhmZiwgMHhmNywgMHg5ZSwgMHhmYiwgMHhhMSwgMHg2YiwgMHgwOCwgMHg0YSwgCisweDAxLCAweDIwLCAweGZmLCAweGY3LCAweDk5LCAweGZiLCAweDAzLCAweDIwLCAweDA2LCAweDQ5LCAweGMwLCAweDQ2LCAKKzB4NDgsIDB4NjIsIDB4MDEsIDB4MjAsIDB4ZjgsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHg0YywgMHgyYSwgMHgwMCwgMHg4MCwgMHg1NCwgMHgwMCwgMHgwMywgMHgwMCwgMHgxNCwgMHgwMCwgMHgwZiwgMHgwMCwgCisweDZjLCAweDA3LCAweDAwLCAweDgwLCAweGYwLCAweGI1LCAweDhkLCAweGIwLCAweDAwLCAweDIwLCAweGI1LCAweDRhLCAKKzB4ZDUsIDB4MWQsIDB4ZjksIDB4MzUsIDB4NjgsIDB4NjIsIDB4MDEsIDB4MjAsIDB4MDAsIDB4MDUsIDB4YjMsIDB4NDksIAorMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHhhOCwgMHg2YSwgMHhjNCwgMHgxZCwgMHgyZCwgMHgzNCwgMHhiMSwgMHg0OCwgCisweGMwLCAweDZhLCAweGQ3LCAweDFkLCAweGZmLCAweDM3LCAweDNhLCAweDM3LCAweDM5LCAweDY4LCAweDRiLCAweDAwLCAKKzB4NTksIDB4MTgsIDB4NDksIDB4MDEsIDB4NDAsIDB4MTgsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4YzEsIDB4MWQsIAorMHgwNSwgMHgzMSwgMHgxOSwgMHg0MywgMHgwOSwgMHg2OCwgMHgwOCwgMHgzMCwgMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgCisweGMwLCAweDQ2LCAweDA5LCAweDkwLCAweGZmLCAweDIzLCAweDFiLCAweDAyLCAweDE4LCAweDQwLCAweDAwLCAweDBhLCAKKzB4MGEsIDB4OTAsIDB4MGEsIDB4OTgsIDB4YTQsIDB4NGUsIDB4MDEsIDB4MjgsIDB4NTksIDB4ZDEsIDB4MjgsIDB4NmIsIAorMHhhMiwgMHg2OCwgMHg4MCwgMHgxOCwgMHhhMiwgMHg0YSwgMHgyMSwgMHg2OSwgCisweDA5LCAweDA0LCAweDA5LCAweDBjLCAweDAxLCAweGYwLCAweDI2LCAweGY5LCAweDI4LCAweDZiLCAweDc5LCAweDY5LCAKKzB4NDAsIDB4MTgsIDB4YzEsIDB4MWQsIDB4MDUsIDB4MzEsIDB4MDAsIDB4MjAsIDB4ODIsIDB4MDAsIDB4OTgsIDB4NGIsIAorMHhkMywgMHgxOCwgMHhmZiwgMHgzMywgMHgwMSwgMHgzMywgMHg1YiwgMHg2OSwgMHhjMCwgMHg0NiwgMHg4YiwgMHg1MCwgCisweDAxLCAweDMwLCAweDA0LCAweDI4LCAweGY0LCAweGQzLCAweDAwLCAweDIwLCAweDMxLCAweDFjLCAweDgyLCAweDAwLCAKKzB4NTYsIDB4MTgsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MzMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4MDQsIDB4YWUsIAorMHhiMywgMHg1MCwgMHgwMSwgMHgzMCwgMHgwMywgMHgyOCwgMHhmNCwgMHhkMywgMHgwMCwgMHgyMCwgMHgwOCwgMHg5MCwgCisweDkwLCAweDQ5LCAweDQyLCAweDAwLCAweDhiLCAweDVhLCAweGIyLCAweDVhLCAweDkzLCAweDQyLCAweDEzLCAweGQwLCAKKzB4OGUsIDB4NDgsIDB4YzEsIDB4ODksIDB4MDEsIDB4MzEsIDB4YzEsIDB4ODEsIDB4YjgsIDB4NjgsIDB4MDAsIDB4MjgsIAorMHgwMywgMHhkMSwgMHgzOCwgMHg4YSwgMHgxMCwgMHgyMywgMHgxOCwgMHg0MywgMHg3MSwgMHhlMCwgMHgzOCwgMHg4YSwgCisweDQwLCAweDIzLCAweDE4LCAweDQzLCAweDZkLCAweGUwLCAweDAwLCAweGYwLCAweDExLCAweGY5LCAweDAxLCAweGYwLCAKKzB4NjcsIDB4ZmYsIDB4ZjUsIDB4ZTAsIDB4MDEsIDB4MzAsIDB4MDYsIDB4MjgsIDB4ZTMsIDB4ZDMsIDB4MDgsIDB4OTgsIAorMHgwMCwgMHgyOCwgMHgwYywgMHhkMSwgMHhiOCwgMHg2OCwgMHg0MSwgMHgxYywgMHhiOSwgMHg2MCwgMHgwMCwgMHgyOCwgCisweDAzLCAweGQxLCAweDM4LCAweDhhLCAweDAxLCAweDIzLCAweDE4LCAweDQzLCAweDAyLCAweGUwLCAweDM4LCAweDhhLCAKKzB4MDQsIDB4MjMsIDB4MTgsIDB4NDMsIDB4MzgsIDB4ODIsIDB4NzgsIDB4NjgsIDB4MDEsIDB4MzAsIDB4NzgsIDB4NjAsIAorMHg2MiwgMHhlMCwgMHgwYSwgMHg5OCwgMHgwMiwgMHgyOCwgMHg1ZiwgMHhkMSwgMHgwOSwgMHg5OCwgMHg0MCwgMHgwYywgCisweDczLCAweGQzLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweGUwLCAweDFkLCAweDAxLCAweDMwLCAweDE4LCAweDQzLCAKKzB4MDAsIDB4NjgsIDB4ZTEsIDB4MWQsIDB4MGQsIDB4MzEsIDB4MTksIDB4NDMsIDB4MDksIDB4NjgsIDB4NDAsIDB4MTgsIAorMHgwYywgMHgzOCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgMHgwMCwgMHgyMSwgMHg4YSwgMHgwMCwgMHg2YiwgMHg0YiwgCisweGQ2LCAweDE4LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDMzLCAweDQzLCAweDFiLCAweDY4LCAweDA0LCAweGFlLCAKKzB4YjMsIDB4NTAsIDB4MDEsIDB4MzEsIDB4MDMsIDB4MjksIDB4ZjMsIDB4ZDMsIDB4MDAsIDB4MjEsIDB4ODMsIDB4MWUsIAorMHgwYywgMHg5MywgMHg2OCwgMHg0YSwgMHgxNiwgMHg2YiwgMHhjMCwgMHg0NiwgMHgwYiwgMHg5NiwgMHg4YSwgMHgwMCwgCisweDBjLCAweDliLCAweDliLCAweDE4LCAweDBiLCAweDllLCAweDllLCAweDE5LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAKKzB4MzMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4NmUsIDB4NDYsIDB4YjMsIDB4NTAsIDB4MDEsIDB4MzEsIDB4MDQsIDB4MjksIAorMHhmMSwgMHhkMywgMHg2OSwgMHg0NiwgMHg4YiwgMHgxYywgMHgwNywgMHg5MywgMHgwMCwgMHgyMSwgMHgwOCwgMHg5MSwgCisweDA0LCAweGFlLCAweDRhLCAweDAwLCAweDA3LCAweDliLCAweDliLCAweDVhLCAweGIyLCAweDVhLCAweDkzLCAweDQyLCAKKzB4MTEsIDB4ZDAsIDB4NTgsIDB4NDgsIDB4YzEsIDB4ODksIDB4MDEsIDB4MzEsIDB4YzEsIDB4ODEsIDB4ZjgsIDB4NjgsIAorMHg0MSwgMHgxYywgMHhmOSwgMHg2MCwgMHgwMCwgMHgyOCwgMHgwMywgMHhkMSwgMHgzOCwgMHg4YSwgMHgyMCwgMHgyMywgCisweDE4LCAweDQzLCAweDAyLCAweGUwLCAweDM4LCAweDhhLCAweDgwLCAweDIzLCAweDE4LCAweDQzLCAweDM4LCAweDgyLCAKKzB4OGYsIDB4ZTcsIDB4MDEsIDB4MzEsIDB4MDYsIDB4MjksIDB4ZTQsIDB4ZDMsIDB4MDgsIDB4OTksIDB4MDAsIDB4MjksIAorMHgwZCwgMHhkMSwgMHhmOSwgMHg2OCwgMHg0YSwgMHgxYywgMHhmYSwgMHg2MCwgMHgwMCwgMHgyOSwgMHgwNCwgMHhkMSwgCisweDM5LCAweDhhLCAweDAyLCAweDIzLCAweDE5LCAweDQzLCAweDAzLCAweGUwLCAweDBjLCAweGUwLCAweDM5LCAweDhhLCAKKzB4MDgsIDB4MjMsIDB4MTksIDB4NDMsIDB4MzksIDB4ODIsIDB4MjksIDB4NmIsIDB4MDgsIDB4MTgsIDB4MDEsIDB4MjMsIAorMHg5YiwgMHgwNywgMHgwMSwgMHgzOCwgMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgMHhjMCwgMHg0NiwgMHgyMCwgMHg3NiwgCisweDAxLCAweDIzLCAweDliLCAweDA3LCAweGUwLCAweDFkLCAweDExLCAweDMwLCAweDE4LCAweDQzLCAweDAwLCAweDY4LCAKKzB4MDEsIDB4MDYsIDB4MDksIDB4MGUsIDB4MDAsIDB4ZTAsIDB4MTksIDB4ZTAsIDB4MzUsIDB4NDgsIDB4MmEsIDB4NmIsIAorMHhjMCwgMHg0NiwgMHhlYSwgMHg2MiwgMHgwNCwgMHgyOSwgMHg0ZiwgMHhkMSwgMHgwMSwgMHgyMSwgMHhjNiwgMHgxZCwgCisweGZmLCAweDM2LCAweDVhLCAweDM2LCAweDMxLCAweDcyLCAweDBhLCAweDk5LCAweDAyLCAweDI5LCAweDFlLCAweGQxLCAKKzB4MDksIDB4OTksIDB4MDksIDB4MGUsIDB4NDksIDB4MDYsIDB4MWEsIDB4ZDEsIDB4ZTEsIDB4MWQsIDB4MDUsIDB4MzEsIAorMHgxOSwgMHg0MywgMHgwOSwgMHg2OCwgMHgwOSwgMHgwNiwgMHgwOSwgMHgwZSwgMHgwOCwgMHgzOSwgMHgxYSwgMHhlMCwgCisweDAxLCAweDIzLCAweDliLCAweDA3LCAweGUwLCAweDFkLCAweDAxLCAweDMwLCAweDE4LCAweDQzLCAweDAwLCAweDY4LCAKKzB4ZTEsIDB4MWQsIDB4MGQsIDB4MzEsIDB4MTksIDB4NDMsIDB4MDksIDB4NjgsIDB4NDAsIDB4MTgsIDB4MDAsIDB4MDQsIAorMHgwMCwgMHgwYywgMHhmOSwgMHg2OCwgMHg0YSwgMHgxYywgMHhmYSwgMHg2MCwgMHgwMCwgMHgyOSwgMHhiYywgMHhkMSwgCisweGI2LCAweGU3LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweGUxLCAweDFkLCAKKzB4MDUsIDB4MzEsIDB4MTksIDB4NDMsIDB4MDksIDB4NjgsIDB4MDksIDB4MDYsIDB4MDksIDB4MGUsIDB4YTEsIDB4NjAsIAorMHhlOCwgMHg2YSwgMHhjMCwgMHg0NiwgMHgyMCwgMHg2MCwgMHgyMCwgMHgxYywgMHhmZiwgMHhmNywgMHg4OCwgMHhmYywgCisweDIwLCAweDdlLCAweDMzLCAweDI4LCAweDAxLCAweGQwLCAweDMyLCAweDI4LCAweDExLCAweGQxLCAweDAxLCAweDIxLCAKKzB4MTQsIDB4NGMsIDB4YzAsIDB4NDYsIDB4ZjksIDB4NjAsIDB4YjksIDB4NjAsIDB4MjAsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHg4NSwgMHhmOCwgMHgyOCwgMHg2YiwgMHhhOSwgMHg2YSwgMHhjMCwgMHg0NiwgMHg4OCwgMHg2MiwgMHgyMCwgMHgxYywgCisweGZmLCAweGY3LCAweGMwLCAweGZkLCAweDAwLCAweDI4LCAweDExLCAweGQxLCAweDBlLCAweGUwLCAweDAwLCAweDIwLCAKKzB4MzAsIDB4NzIsIDB4MTEsIDB4ZTAsIDB4MzMsIDB4MjksIDB4MDEsIDB4ZDAsIDB4MzIsIDB4MjksIDB4MGQsIDB4ZDEsIAorMHgwNywgMHgxYywgMHgwMCwgMHhmMCwgMHg3MSwgMHhmOCwgMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgMHhiMCwgMHhmZCwgCisweDAwLCAweDI4LCAweDAxLCAweGQxLCAweDAxLCAweGYwLCAweDcwLCAweGZlLCAweDBkLCAweGIwLCAweGYwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4ZjAsIDB4MTIsIDB4ZjgsIDB4ZjYsIDB4ZTcsIDB4MDAsIDB4MDAsIAorMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHg0YywgMHgyYSwgMHgwMCwgMHg4MCwgCisweGFjLCAweGFiLCAweDIwLCAweDQwLCAweDQwLCAweDA3LCAweDAwLCAweDgwLCAweDgyLCAweDA3LCAweDAwLCAweDgwLCAKKzB4MGMsIDB4MmIsIDB4MDAsIDB4ODAsIDB4NmMsIDB4MDcsIDB4MDAsIDB4ODAsIDB4ZjAsIDB4YjUsIDB4MjUsIDB4NDgsIAorMHg0MSwgMHg2OCwgMHgwMSwgMHgzMSwgMHg0MSwgMHg2MCwgMHgyNCwgMHg0ZiwgMHhmOSwgMHgxZCwgMHhmOSwgMHgzMSwgCisweDAwLCAweDI0LCAweDg4LCAweDZhLCAweGZhLCAweDY4LCAweGMwLCAweDQ2LCAweDk0LCAweDYxLCAweDA0LCAweDIyLCAKKzB4ZmIsIDB4NjgsIDB4YzAsIDB4NDYsIDB4ZGEsIDB4NjAsIDB4MTAsIDB4MjIsIDB4ZmIsIDB4NjgsIDB4YzAsIDB4NDYsIAorMHg5YSwgMHg2MSwgMHhmYSwgMHgxZCwgMHhmZiwgMHgzMiwgMHg1YSwgMHgzMiwgMHgxMywgMHg3YSwgMHgxYiwgMHg0YSwgCisweDAwLCAweDJiLCAweDBiLCAweGQwLCAweDE1LCAweDhhLCAweDJlLCAweDBhLCAweDM2LCAweDAyLCAweDMzLCAweDIzLCAKKzB4MmIsIDB4NDAsIDB4OWIsIDB4MDAsIDB4MWUsIDB4NDMsIDB4Y2MsIDB4MjMsIDB4MmIsIDB4NDAsIDB4OWIsIDB4MDgsIAorMHgzMywgMHg0MywgMHgxMywgMHg4MiwgMHgxMiwgMHg4YSwgMHhmYiwgMHg2OCwgMHhjMCwgMHg0NiwgMHhkYSwgMHg4MywgCisweDRhLCAweDZiLCAweGZiLCAweDY4LCAweGMwLCAweDQ2LCAweGRhLCAweDgxLCAweDBhLCAweDZiLCAweGMwLCAweDQ2LCAKKzB4ODIsIDB4NjIsIDB4YzQsIDB4NjIsIDB4YzMsIDB4MWQsIDB4MzksIDB4MzMsIDB4NGEsIDB4NmIsIDB4YzAsIDB4NDYsIAorMHg1YSwgMHg4MywgMHgwNCwgMHgyMywgMHgwMiwgMHg2OCwgMHgxYSwgMHg0MywgMHgwMiwgMHg2MCwgMHg4OCwgMHg2YSwgCisweDAxLCAweGYwLCAweDMyLCAweGZhLCAweGY4LCAweDY4LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDU0LCAweDMwLCAKKzB4MTgsIDB4NDMsIDB4MDAsIDB4NjgsIDB4YzAsIDB4NDYsIDB4ZjgsIDB4NjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgCisweGFjLCAweDA3LCAweDAwLCAweDgwLCAweDgwLCAweGI1LCAweGMxLCAweDFkLCAweGY5LCAweDMxLCAweDhhLCAweDZhLCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZDEsIDB4MWQsIDB4NDUsIDB4MzEsIDB4MTksIDB4NDMsIDB4MDksIDB4NjgsIAorMHgwYiwgMHgwNiwgMHgxYiwgMHgwZSwgMHgwMSwgMHgyNywgMHhjMSwgMHgxZCwgMHhmZiwgMHgzMSwgMHg0YSwgMHgzMSwgCisweDMzLCAweDJiLCAweDA1LCAweGQxLCAweDhiLCAweDcwLCAweDAxLCAweDFjLCAweDEwLCAweDFjLCAweDAwLCAweGYwLCAKKzB4MGYsIDB4ZjgsIDB4MDYsIDB4ZTAsIDB4MzIsIDB4MmIsIDB4MDgsIDB4ZDEsIDB4OGIsIDB4NzAsIDB4MDEsIDB4MWMsIAorMHgxMCwgMHgxYywgMHgwMCwgMHhmMCwgMHgzYywgMHhmOCwgMHgzOCwgMHgxYywgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDIwLCAweDg4LCAweDcwLCAweGY5LCAweGU3LCAweDkwLCAweGI0LCAweGNhLCAweDFkLCAKKzB4ZjksIDB4MzIsIDB4MzMsIDB4MjcsIDB4Y2MsIDB4MWQsIDB4ZmYsIDB4MzQsIDB4NGEsIDB4MzQsIDB4ZDMsIDB4NmEsIAorMHhjMCwgMHg0NiwgMHhhNywgMHg3MCwgMHhmZiwgMHgzMSwgMHg0MSwgMHgzMSwgMHgwNywgMHg2YywgMHhjMCwgMHg0NiwgCisweDRmLCAweDYxLCAweGZiLCAweDE4LCAweDM5LCAweDFjLCAweDlmLCAweDFlLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAKKzB4ZmMsIDB4MWMsIDB4MjMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4MWIsIDB4MDYsIDB4MWIsIDB4MGUsIDB4OWIsIDB4MDAsIAorMHgxYiwgMHgwNCwgMHgxYiwgMHgwYywgMHhjOSwgMHgxOCwgMHgwOCwgMHgzMSwgMHgwMSwgMHg2NCwgMHgwMSwgMHgyMywgCisweDliLCAweDA3LCAweGI5LCAweDFjLCAweDE5LCAweDQzLCAweDA5LCAweDY4LCAweDM0LCAweDMwLCAweDAxLCAweDc2LCAKKzB4ZjgsIDB4MWQsIDB4MDEsIDB4MzAsIDB4MTgsIDB4NDMsIDB4MDAsIDB4NjgsIDB4MDAsIDB4MDQsIDB4YjksIDB4MWQsIAorMHgxOSwgMHg0MywgMHhkMCwgMHg2MywgMHgwOSwgMHg2OCwgMHgwOSwgMHgwNCwgMHgwOSwgMHgwYywgMHgwOCwgMHg0MywgCisweGQwLCAweDYzLCAweDkwLCAweGJjLCAweDcwLCAweDQ3LCAweGIwLCAweGI1LCAweGNhLCAweDFkLCAweGY5LCAweDMyLCAKKzB4YzUsIDB4MWQsIDB4MmQsIDB4MzUsIDB4MzIsIDB4MjAsIDB4Y2YsIDB4MWQsIAorMHhmZiwgMHgzNywgMHg0YSwgMHgzNywgMHhkMywgMHg2YSwgMHhjMCwgMHg0NiwgMHhiOCwgMHg3MCwgMHhjYywgMHgxZCwgCisweGZmLCAweDM0LCAweDNhLCAweDM0LCAweGU4LCAweDY4LCAweGMwLCAweDQ2LCAweDYwLCAweDYxLCAweDEwLCAweDMwLCAKKzB4ZTgsIDB4NjAsIDB4NjAsIDB4NjksIDB4YzAsIDB4MTgsIDB4ODcsIDB4MWUsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIAorMHgzOCwgMHgxZCwgMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgMHgwMCwgMHgwNCwgMHhiOSwgMHgxYywgMHgxOSwgMHg0MywgCisweGQwLCAweDYzLCAweDA5LCAweDY4LCAweDA5LCAweDA0LCAweDA5LCAweDBjLCAweDA4LCAweDQzLCAweGQwLCAweDYzLCAKKzB4ZjgsIDB4MWQsIDB4MDMsIDB4MzAsIDB4ZmYsIDB4ZjcsIDB4ZmMsIDB4ZmIsIDB4MjAsIDB4NjIsIDB4ZjgsIDB4MWQsIAorMHgwNywgMHgzMCwgMHhmZiwgMHhmNywgMHhmNywgMHhmYiwgMHg2MCwgMHg2MiwgMHgwMCwgMHgyMCwgMHgyOCwgMHg3NiwgCisweGIwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweGY3LCAweGI1LCAweDgxLCAweGIwLCAweDAxLCAweDk4LCAKKzB4YzcsIDB4MWQsIDB4ZjksIDB4MzcsIDB4YjgsIDB4NmEsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZDQsIDB4MWQsIAorMHgwNSwgMHgzNCwgMHgyMywgMHg0MywgMHgxYywgMHg2OCwgMHhmZiwgMHgyMywgMHhmZSwgMHgzMywgMHgyMywgMHg0MCwgCisweDdmLCAweDZiLCAweDNmLCAweDA0LCAweDNiLCAweDQzLCAweDBiLCAweDYwLCAweDM0LCAweDMwLCAweDFjLCAweDFjLCAKKzB4ODAsIDB4MjMsIDB4MjMsIDB4NDAsIDB4MDEsIDB4OWYsIDB4ZmYsIDB4MzcsIDB4NDEsIDB4MzcsIDB4MDAsIDB4MmIsIAorMHgzYywgMHhkMCwgMHgwYywgMHgyMywgMHgwMCwgMHg5MywgMHgwMCwgMHgyMywgMHg5ZCwgMHgwMCwgMHhhZSwgMHgxOCwgCisweDM2LCAweDY5LCAweDZkLCAweDE4LCAweDZlLCAweDYxLCAweDAxLCAweDMzLCAweDA1LCAweDJiLCAweGY3LCAweGQzLCAKKzB4MDAsIDB4MjMsIDB4OWQsIDB4MDAsIDB4YWUsIDB4MTgsIDB4NzYsIDB4NmEsIDB4NmQsIDB4MTgsIDB4YWUsIDB4NjIsIAorMHgwMSwgMHgzMywgMHgwNSwgMHgyYiwgMHhmNywgMHhkMywgMHgwMSwgMHg5YiwgMHhmZiwgMHgzMywgMHg1MSwgMHgzMywgCisweDliLCAweDc4LCAweDMzLCAweDJiLCAweDBlLCAweGQxLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweGM1LCAweDFkLCAKKzB4MDEsIDB4MzUsIDB4MmIsIDB4NDMsIDB4MWIsIDB4NjgsIDB4YzAsIDB4NDYsIDB4NGIsIDB4ODEsIDB4MDEsIDB4MjMsIAorMHg5YiwgMHgwNywgMHhjNSwgMHgxZCwgMHgwZCwgMHgzNSwgMHgyYiwgMHg0MywgMHgxYiwgMHg2OCwgMHgxNiwgMHhlMCwgCisweDdiLCAweDY5LCAweGMwLCAweDQ2LCAweDRiLCAweDgxLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweGM1LCAweDFkLCAKKzB4MGQsIDB4MzUsIDB4MmIsIDB4NDMsIDB4MWIsIDB4NjgsIDB4N2QsIDB4NjksIDB4NWQsIDB4MWIsIDB4MDEsIDB4MjMsIAorMHg5YiwgMHgwNywgMHhjNiwgMHgxZCwgMHgwMSwgMHgzNiwgMHgzMywgMHg0MywgMHgxYiwgMHg2OCwgMHhlYiwgMHgxOCwgCisweDBjLCAweDNiLCAweDAyLCAweGUwLCAweDAwLCAweDIzLCAweDAwLCAweDkzLCAweDRiLCAweDgxLCAweGNiLCAweDgwLCAKKzB4NjMsIDB4MDksIDB4NDksIDB4ZDMsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4YzQsIDB4MWQsIDB4MDUsIDB4MzQsIAorMHgyMywgMHg0MywgMHgxYiwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwYiwgMHg4MSwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgCisweGM0LCAweDFkLCAweDBkLCAweDM0LCAweDIzLCAweDQzLCAweDFiLCAweDY4LCAweDBjLCAweDg5LCAweDFiLCAweDFiLCAKKzB4MDAsIDB4OWMsIDB4MWMsIDB4MWIsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MDgsIDB4MzAsIDB4MTgsIDB4NDMsIAorMHgwMCwgMHg2OCwgMHgyMCwgMHgxOCwgMHg4OCwgMHg4MCwgMHgzOCwgMHg2YSwgMHgwNCwgMHgwZSwgMHhmZiwgMHgyMywgCisweDFiLCAweDA0LCAweDAzLCAweDQwLCAweDFiLCAweDBhLCAweDFjLCAweDQzLCAweGZmLCAweDIzLCAweDFiLCAweDAyLCAKKzB4MDMsIDB4NDAsIDB4MWIsIDB4MDIsIDB4MjMsIDB4NDMsIDB4MDAsIDB4MDYsIDB4MTgsIDB4NDMsIDB4YzgsIDB4NjAsIAorMHg3OCwgMHg2YSwgMHgwNywgMHgwZSwgMHhmZiwgMHgyMywgMHgxYiwgMHgwNCwgMHgwMywgMHg0MCwgMHgxYiwgMHgwYSwgCisweDFmLCAweDQzLCAweGZmLCAweDIzLCAweDFiLCAweDAyLCAweDAzLCAweDQwLCAweDFiLCAweDAyLCAweDNiLCAweDQzLCAKKzB4MDAsIDB4MDYsIDB4MTgsIDB4NDMsIDB4MDgsIDB4NjEsIDB4ZDAsIDB4NmIsIDB4YzAsIDB4NDYsIDB4YzgsIDB4NjMsIAorMHg5MCwgMHg2YiwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2NCwgMHg1MCwgMHg2YywgMHhjMCwgMHg0NiwgMHg0OCwgMHg2NCwgCisweDEwLCAweDZjLCAweGMwLCAweDQ2LCAweDg4LCAweDY0LCAweGQwLCAweDZjLCAweGMwLCAweDQ2LCAweGM4LCAweDY0LCAKKzB4OTAsIDB4NmMsIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjUsIDB4MDIsIDB4ZTAsIDB4MDAsIDB4MjMsIDB4MGIsIDB4ODEsIAorMHg4YiwgMHg4MCwgMHgwNCwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgCisweDBmLCAweDRhLCAweDkzLCAweDg5LCAweDAxLCAweDMzLCAweDkzLCAweDgxLCAweGMyLCAweDFkLCAweGY5LCAweDMyLCAKKzB4MDQsIDB4MjMsIDB4OTAsIDB4NmEsIDB4YzAsIDB4NDYsIDB4YzMsIDB4NjAsIDB4MTAsIDB4MjMsIDB4ODMsIDB4NjEsIAorMHhjYiwgMHgwYSwgMHgwMSwgMHhkMywgMHgxOCwgMHgyMywgMHg4MywgMHg2MSwgMHhjMSwgMHg4MywgMHg1MSwgMHg2YiwgCisweGMwLCAweDQ2LCAweGMxLCAweDgxLCAweDUxLCAweDZiLCAweGMyLCAweDFkLCAweDM5LCAweDMyLCAweDUxLCAweDgzLCAKKzB4MDQsIDB4MjMsIDB4MDEsIDB4NjgsIDB4MTksIDB4NDMsIDB4MDEsIDB4NjAsIDB4MDEsIDB4ZjAsIDB4YzIsIDB4ZjgsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgCisweGIwLCAweGI1LCAweDFiLCAweDRjLCAweDIwLCAweDZhLCAweDAyLCAweDI4LCAweDFiLCAweGQyLCAweDAwLCAweDIwLCAKKzB4ZTcsIDB4MWQsIDB4MTksIDB4MzcsIDB4MzgsIDB4NzEsIDB4ZTEsIDB4NjgsIDB4ZTAsIDB4MWQsIDB4ZjksIDB4MzAsIAorMHgwMCwgMHgyOSwgMHgxNSwgMHhkMCwgMHg0MiwgMHg2YSwgMHgwMCwgMHgyYSwgMHgxMiwgMHhkMSwgMHgwMSwgMHgyNSwgCisweDBhLCAweGUwLCAweGZmLCAweGY3LCAweDg5LCAweGZiLCAweDAwLCAweDI4LCAweDA5LCAweGQxLCAweDIwLCAweDZhLCAKKzB4MDIsIDB4MjgsIDB4MDAsIDB4ZDMsIDB4M2QsIDB4NzEsIDB4ZTAsIDB4NjgsIDB4MDAsIDB4MjgsIDB4MDIsIDB4ZDAsIAorMHgzOCwgMHg3OSwgMHgwMCwgMHgyOCwgMHhmMSwgMHhkMCwgMHhiMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDQwLCAweDZhLCAweDAwLCAweDI4LCAweGY5LCAweGQxLCAweDAwLCAweDI5LCAweGY3LCAweGQxLCAweDYwLCAweDY5LCAKKzB4MDAsIDB4MjgsIDB4MDQsIDB4ZDAsIDB4MDYsIDB4NDgsIDB4MDAsIDB4NjgsIDB4MDMsIDB4ZjAsIDB4YTgsIDB4ZmMsIAorMHhlZiwgMHhlNywgMHg2MCwgMHg2OCwgMHgwMCwgMHgyOCwgMHhlYywgMHhkMCwgMHgwMCwgMHhmMCwgMHg1YSwgMHhmOCwgCisweGU5LCAweGU3LCAweDAwLCAweDAwLCAweDZjLCAweDA2LCAweDAwLCAweDgwLCAweDM0LCAweDA0LCAweDAwLCAweDgwLCAKKzB4YjAsIDB4YjUsIDB4MDcsIDB4MWMsIDB4MjAsIDB4MjMsIDB4YjgsIDB4NjgsIDB4MTgsIDB4NDAsIDB4MDEsIDB4MjQsIAorMHgwMCwgMHgyNSwgMHgwMCwgMHgyOCwgMHgwYiwgMHhkMSwgMHgzOCwgMHg2YSwgMHgwMCwgMHgyOCwgMHgwMywgMHhkMSwgCisweDI4LCAweDFjLCAweGIwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDFmLCAweDQ4LCAweDAxLCAweDZlLCAKKzB4MDEsIDB4MzEsIDB4MDEsIDB4NjYsIDB4MDMsIDB4ZTAsIDB4NDgsIDB4NjgsIDB4YzQsIDB4MjMsIDB4MTgsIDB4NDAsIAorMHgwMywgMHhkMSwgMHgzOCwgMHg2YSwgMHgwMCwgMHhmMCwgMHgwYywgMHhmYywgMHgyZiwgMHhlMCwgMHgzOCwgMHgxYywgCisweDAwLCAweGYwLCAweDFjLCAweGZjLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDdiLCAweGZhLCAweGI4LCAweDY4LCAKKzB4YzAsIDB4MDgsIDB4MDIsIDB4ZDMsIDB4MzgsIDB4NmEsIDB4MDAsIDB4ZjAsIDB4ZDEsIDB4ZmIsIDB4YjgsIDB4NjgsIAorMHgzOSwgMHg2YSwgMHhjMCwgMHg0NiwgMHg4OCwgMHg2MCwgMHgzOCwgMHg2YSwgMHhjMCwgMHg0NiwgMHhjNSwgMHg2MCwgCisweDEwLCAweDQ4LCAweDQxLCAweDY4LCAweDAwLCAweDI5LCAweDExLCAweGQxLCAweGMxLCAweDY4LCAweDAwLCAweDI5LCAKKzB4MDksIDB4ZDEsIDB4NDEsIDB4NjksIDB4MDAsIDB4MjksIDB4MDYsIDB4ZDEsIDB4MzksIDB4NmEsIDB4YzAsIDB4NDYsIAorMHg4MSwgMHg2MCwgMHg0MSwgMHg2MCwgMHgwMCwgMHhmMCwgMHgxNCwgMHhmOCwgMHgwYiwgMHhlMCwgMHgzOSwgMHg2YSwgCisweGMwLCAweDQ2LCAweDgxLCAweDYwLCAweDQxLCAweDYwLCAweDA2LCAweGUwLCAweDM5LCAweDZhLCAweDgyLCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4ZDEsIDB4NjAsIDB4MzksIDB4NmEsIDB4YzAsIDB4NDYsIDB4ODEsIDB4NjAsIDB4MjAsIDB4MWMsIAorMHhiZCwgMHhlNywgMHgwMCwgMHgwMCwgMHhhNCwgMHgyYSwgMHgwMCwgMHg4MCwgMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgCisweDkwLCAweGI1LCAweDBiLCAweDRjLCAweDY3LCAweDY4LCAweDAwLCAweDJmLCAweDBmLCAweGQwLCAweDM4LCAweDFjLCAKKzB4MDAsIDB4ZjAsIDB4MTIsIDB4ZjgsIDB4MDAsIDB4MjgsIDB4MGEsIDB4ZDEsIDB4NjAsIDB4NjgsIDB4YzAsIDB4NjgsIAorMHhjMCwgMHg0NiwgMHg2MCwgMHg2MCwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHhjMywgMHhmYiwgMHgwMCwgMHgyMCwgCisweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAxLCAweDIwLCAweGZhLCAweGU3LCAweDAwLCAweDAwLCAKKzB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIDB4ZjAsIDB4YjUsIDB4MDcsIDB4MWMsIDB4ZmUsIDB4MWQsIDB4NDksIDB4MzYsIAorMHgzMCwgMHg3OCwgMHg0MCwgMHgwMCwgMHhjMCwgMHgxOSwgMHg4NSwgMHg4YiwgMHgzMywgMHg0YywgMHgzNCwgMHg0YiwgCisweDlkLCAweDQyLCAweDNjLCAweGQwLCAweDM4LCAweDFjLCAweDIxLCAweDFjLCAweDJhLCAweDFjLCAweDAwLCAweGYwLCAKKzB4MWQsIDB4ZjksIDB4MzEsIDB4NDgsIDB4ODAsIDB4NmEsIDB4NTgsIDB4MjEsIDB4NjksIDB4NDMsIDB4NDAsIDB4MTgsIAorMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgCisweDJjLCAweDRkLCAweDAxLCAweDI4LCAweDFhLCAweGQxLCAweDMwLCAweDc4LCAweGMwLCAweDE5LCAweGMxLCAweDFkLCAKKzB4MTksIDB4MzEsIDB4MDgsIDB4N2EsIDB4M2EsIDB4NjgsIDB4ODAsIDB4MTgsIDB4MDksIDB4N2IsIDB4ZWEsIDB4MWQsIAorMHgyMSwgMHgzMiwgMHgwMCwgMHhmMCwgMHhlMywgMHhmYywgMHgzMCwgMHg3OCwgMHhjMCwgMHgxOSwgMHgyMCwgMHgzMCwgCisweDAwLCAweDc5LCAweDM5LCAweDY4LCAweDQwLCAweDE4LCAweGMxLCAweDFkLCAweDA1LCAweDMxLCAweDAwLCAweDIwLCAKKzB4MDAsIDB4MjMsIDB4NDIsIDB4MDAsIDB4OGIsIDB4NTIsIDB4MDEsIDB4MzAsIDB4MDYsIDB4MjgsIDB4ZmEsIDB4ZDMsIAorMHhhMCwgMHg4OCwgMHg0MSwgMHgwNywgMHgwYiwgMHhkMSwgMHgyMSwgMHg4OSwgMHgwOSwgMHgxOCwgMHg3OCwgMHg2OCwgCisweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDgxLCAweDQyLCAweDA0LCAweGQ4LCAweDYxLCAweDg5LCAweGUyLCAweDg4LCAKKzB4ODksIDB4MTgsIDB4ODEsIDB4NDIsIDB4MDMsIDB4ZDksIDB4MDAsIDB4MjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHgyMSwgMHgxYywgMHgxNCwgMHg0YSwgMHgwMCwgMHgyMCwgMHhmZSwgMHhmNywgMHg1YSwgMHhmZiwgCisweDAxLCAweDIyLCAweDUyLCAweDA0LCAweDc4LCAweDY4LCAweDAyLCAweDQzLCAKKzB4MDEsIDB4MjAsIDB4MzksIDB4NjgsIDB4ZmUsIDB4ZjcsIDB4NTIsIDB4ZmYsIDB4MDEsIDB4MjIsIDB4NTIsIDB4MDQsIAorMHg3OCwgMHg2OCwgMHgwMiwgMHg0MywgMHgwMCwgMHgyMCwgMHgzOSwgMHg2OCwgMHhmZSwgMHhmNywgMHg0YSwgMHhmZiwgCisweDBiLCAweDQ5LCAweDBjLCAweDRhLCAweDAxLCAweDIwLCAweGZlLCAweGY3LCAweDQ1LCAweGZmLCAweDAxLCAweDIwLCAKKzB4ZTksIDB4MWQsIDB4MTksIDB4MzEsIDB4NDgsIDB4NzEsIDB4MDIsIDB4MjEsIDB4ZWEsIDB4MWQsIDB4ZjksIDB4MzIsIAorMHg1MSwgMHg2MiwgMHhkOSwgMHhlNywgMHgyOCwgMHhhYywgMHgyMCwgMHg0MCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgCisweDRjLCAweDJhLCAweDAwLCAweDgwLCAweDZjLCAweDA2LCAweDAwLCAweDgwLCAweDU0LCAweDAwLCAweDAzLCAweDAwLCAKKzB4MTQsIDB4YWMsIDB4MjAsIDB4NDAsIDB4MTQsIDB4MDAsIDB4MDcsIDB4MDAsIDB4ZjAsIDB4YjUsIDB4ODMsIDB4YjAsIAorMHgwMCwgMHgyMSwgMHg0ZiwgMHg0OCwgMHhjMiwgMHgxZCwgMHhmOSwgMHgzMiwgMHg1MSwgMHg2MiwgMHgwMSwgMHgyMSwgCisweGM5LCAweDA0LCAweDRkLCAweDRhLCAweGMwLCAweDQ2LCAweDExLCAweDYwLCAweGMxLCAweDFkLCAweDE5LCAweDMxLCAKKzB4NDksIDB4NzksIDB4MDAsIDB4MjksIDB4MDQsIDB4ZDEsIDB4NGEsIDB4NDgsIDB4MDAsIDB4NjgsIDB4MDMsIDB4ZjAsIAorMHg5YiwgMHhmYiwgMHg4NywgMHhlMCwgMHg0NSwgMHg0OCwgMHg0NywgMHg2OCwgMHhmYywgMHgxZCwgMHg0OSwgMHgzNCwgCisweDIxLCAweDc4LCAweDQ4LCAweDAwLCAweGMwLCAweDE5LCAweDgwLCAweDhiLCAweDQ0LCAweDRhLCAweDkyLCAweDZhLCAKKzB4NTgsIDB4MjMsIDB4NTgsIDB4NDMsIDB4MTUsIDB4MTgsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZWEsIDB4MWQsIAorMHgwNSwgMHgzMiwgMHgxYSwgMHg0MywgMHgxMiwgMHg2OCwgMHgwOCwgMHgzNSwgMHgyYiwgMHg0MywgMHgxZCwgMHg2OCwgCisweGZmLCAweDIzLCAweDFiLCAweDAyLCAweDJiLCAweDQwLCAweDFiLCAweDBhLCAweDNjLCAweDRkLCAweDAxLCAweDJiLCAKKzB4MjQsIDB4ZDEsIDB4YzgsIDB4MTksIDB4YzEsIDB4MWQsIDB4MTksIDB4MzEsIDB4MDgsIDB4N2EsIDB4M2EsIDB4NjgsIAorMHg4MCwgMHgxOCwgMHgzOSwgMHg0YSwgMHgwOSwgMHg3YiwgMHgwMCwgMHhmMCwgMHhjNSwgMHhmYywgMHgyMCwgMHg3OCwgCisweGMwLCAweDE5LCAweDIwLCAweDMwLCAweDAwLCAweDc5LCAweDM5LCAweDY4LCAweDQxLCAweDE4LCAweDAwLCAweDIwLCAKKzB4ODIsIDB4MDAsIDB4NTMsIDB4MTksIDB4OWIsIDB4NmUsIDB4NmUsIDB4NDYsIDB4YjMsIDB4NTAsIDB4MDEsIDB4MzAsIAorMHgwMywgMHgyOCwgMHhmNywgMHhkMywgMHhjYSwgMHgxZCwgMHgwNSwgMHgzMiwgMHg2OSwgMHg0NiwgMHgwMCwgMHgyMCwgCisweDQzLCAweDAwLCAweGNkLCAweDVhLCAweGMwLCAweDQ2LCAweGQ1LCAweDUyLCAweDAxLCAweDMwLCAweDA2LCAweDI4LCAKKzB4ZjgsIDB4ZDMsIDB4MmQsIDB4ZTAsIDB4MDIsIDB4MmIsIDB4MmIsIDB4ZDEsIDB4MTEsIDB4MGEsIDB4MjksIDB4ZDMsIAorMHgwMCwgMHgyMSwgMHg4YSwgMHgwMCwgMHg1MywgMHgxOSwgMHg5YiwgMHg2ZSwgMHg2ZSwgMHg0NiwgMHhiMywgMHg1MCwgCisweDAxLCAweDMxLCAweDAzLCAweDI5LCAweGY3LCAweGQzLCAweDIxLCAweDc4LCAweDQ5LCAweDAwLCAweGM5LCAweDE5LCAKKzB4MDksIDB4OGYsIDB4M2EsIDB4NjgsIDB4OGIsIDB4MTgsIDB4NmEsIDB4NDYsIDB4MDAsIDB4MjEsIDB4NGQsIDB4MDAsIAorMHg1NiwgMHg1YiwgMHhjMCwgMHg0NiwgMHg1ZSwgMHg1MywgMHgwMSwgMHgzMSwgMHgwNiwgMHgyOSwgMHhmOCwgMHhkMywgCisweDE5LCAweDQ5LCAweDhhLCAweDZhLCAweDEzLCAweDE4LCAweDFhLCAweDZkLCAweDAwLCAweDlkLCAweDU1LCAweDQwLCAKKzB4MTksIDB4NGEsIDB4ZDYsIDB4NjgsIDB4NzUsIDB4NDAsIDB4MWQsIDB4NjUsIDB4ODksIDB4NmEsIDB4MDgsIDB4MTgsIAorMHg0MSwgMHg2ZCwgMHgwMiwgMHg5YiwgMHg1OSwgMHg0MCwgMHg5MiwgMHg2OSwgMHg1MSwgMHg0MCwgMHg0MSwgMHg2NSwgCisweDIwLCAweDc4LCAweDQxLCAweDFlLCAweDIxLCAweDcwLCAweDAwLCAweDI4LCAweDBkLCAweGQwLCAweDM4LCAweDFjLCAKKzB4ZmYsIDB4ZjcsIDB4ZjQsIDB4ZmUsIDB4MDAsIDB4MjgsIDB4MGQsIDB4ZDEsIDB4MDgsIDB4NGEsIDB4NTAsIDB4NjgsIAorMHhjMCwgMHg2OCwgMHhjMCwgMHg0NiwgMHg1MCwgMHg2MCwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHhhNCwgMHhmYSwgCisweDAyLCAweGUwLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDczLCAweGZhLCAweDAxLCAweGYwLCAweGRlLCAweGZhLCAKKzB4MDMsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHgzOCwgMHgwNCwgMHgwMCwgMHg4MCwgMHg0YywgMHgyYSwgMHgwMCwgMHg4MCwgCisweGFjLCAweGFiLCAweDIwLCAweDQwLCAweDk0LCAweDA2LCAweDAwLCAweDgwLCAweDA4LCAweDgzLCAweDIwLCAweDQwLCAKKzB4ZjAsIDB4YjUsIDB4ODIsIDB4YjAsIDB4NjksIDB4NGIsIDB4OWYsIDB4NmEsIDB4NTgsIDB4MjMsIDB4NWEsIDB4NDMsIAorMHhiYSwgMHgxOCwgMHhjMywgMHgxZCwgMHg0OSwgMHgzMywgMHgxZiwgMHg3OCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgCisweGQ0LCAweDFkLCAweDAxLCAweDM0LCAweDIzLCAweDQzLCAweDFkLCAweDY4LCAweDQzLCAweDY4LCAweDFjLCAweDA0LCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZDYsIDB4MWQsIDB4MDUsIDB4MzYsIDB4MzMsIDB4NDMsIDB4MWIsIDB4NjgsIAorMHgxYywgMHg0MywgMHg0MiwgMHgyMywgMHgxYywgMHg0MywgMHgwYywgMHg2MCwgMHhmZiwgMHgyNiwgMHgzNiwgMHgwMiwgCisweDJlLCAweDQwLCAweDAxLCAweDIzLCAweDViLCAweDAyLCAweDllLCAweDQyLCAweDc0LCAweGQxLCAweDZiLCAweDBjLCAKKzB4MmIsIDB4ZDMsIDB4YzMsIDB4MTksIDB4MjAsIDB4MzMsIDB4MWIsIDB4NzksIAorMHhjMCwgMHg0NiwgMHg0YiwgMHg4MSwgMHg3YiwgMHgwMCwgMHgxYiwgMHgxOCwgMHgxYiwgMHg4ZiwgMHg0YywgMHg4OSwgCisweDFiLCAweDFiLCAweGNiLCAweDgwLCAweDAwLCAweDI0LCAweGE2LCAweDAwLCAweDAxLCAweDk2LCAweGIzLCAweDE4LCAKKzB4ZGUsIDB4MWQsIDB4MDksIDB4MzYsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MzMsIDB4NDMsIDB4MWIsIDB4NjgsIAorMHgwMSwgMHg5ZSwgMHg3NiwgMHgxOCwgMHg3MywgMHg2MSwgMHgwMSwgMHgzNCwgMHgwNSwgMHgyYywgMHhmMCwgMHhkMywgCisweDAwLCAweDI0LCAweGE2LCAweDAwLCAweDAwLCAweDk2LCAweGIzLCAweDE4LCAweGRlLCAweDFkLCAweDFkLCAweDM2LCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MzMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4MDAsIDB4OWUsIDB4NzYsIDB4MTgsIAorMHhiMywgMHg2MiwgMHgwMSwgMHgzNCwgMHgwNSwgMHgyYywgMHhmMCwgMHhkMywgMHgwNiwgMHhlMCwgMHgwMCwgMHgyMywgCisweDRiLCAweDgxLCAweGNiLCAweDgwLCAweDQwLCAweDIzLCAweDljLCAweDQzLCAweDBjLCAweDYwLCAweDIzLCAweDFjLCAKKzB4NmIsIDB4MGUsIDB4NGEsIDB4ZDMsIDB4YzMsIDB4MTksIDB4MjAsIDB4MzMsIDB4MWIsIDB4NzksIDB4MTAsIDB4MzMsIAorMHgwYiwgMHg4MSwgMHg3YiwgMHgwMCwgMHgxYiwgMHgxOCwgMHgxYiwgMHg4ZiwgMHgwZiwgMHg4OSwgMHhkYiwgMHgxYiwgCisweDhiLCAweDgwLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweGQ0LCAweDFkLCAweDM1LCAweDM0LCAweDIzLCAweDQzLCAKKzB4MWIsIDB4NjgsIDB4YzAsIDB4NDYsIDB4Y2IsIDB4NjMsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZDQsIDB4MWQsIAorMHgzMSwgMHgzNCwgMHgyMywgMHg0MywgMHgxYiwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwYiwgMHg2NCwgMHhhYiwgMHgwZSwgCisweDIxLCAweGQyLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweGQ0LCAweDFkLCAweDNkLCAweDM0LCAweDIzLCAweDQzLCAKKzB4MWIsIDB4NjgsIDB4YzAsIDB4NDYsIDB4NGIsIDB4NjQsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZDQsIDB4MWQsIAorMHgzOSwgMHgzNCwgMHgyMywgMHg0MywgMHgxYiwgMHg2OCwgMHhjMCwgMHg0NiwgMHg4YiwgMHg2NCwgMHgwMSwgMHgyMywgCisweDliLCAweDA3LCAweGQ0LCAweDFkLCAweDQ1LCAweDM0LCAweDIzLCAweDQzLCAweDFiLCAweDY4LCAweGMwLCAweDQ2LCAKKzB4Y2IsIDB4NjQsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZDQsIDB4MWQsIDB4NDEsIDB4MzQsIDB4MjMsIDB4NDMsIAorMHgxYiwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwYiwgMHg2NSwgMHgwMCwgMHhlMCwgMHgwZiwgMHhlMCwgMHhmYiwgMHgxZiwgCisweDAxLCAweDNiLCAweDFiLCAweDA0LCAweDFiLCAweDBjLCAweDA3LCAweDY4LCAweGZmLCAweDE4LCAweDAzLCAweDY5LCAKKzB4MDgsIDB4MWMsIDB4MzksIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MzQsIDB4ZjgsIDB4MmMsIDB4ZTAsIDB4MDAsIDB4MjMsIAorMHgwYiwgMHg4MSwgMHg4YiwgMHg4MCwgMHgyOCwgMHhlMCwgMHgwMCwgMHgyMywgMHg4YiwgMHg4MCwgMHgwYiwgMHg4MSwgCisweGMzLCAweDE5LCAweDIwLCAweDMzLCAweDFiLCAweDdhLCAweGMwLCAweDQ2LCAweDRiLCAweDgxLCAweDdiLCAweDAwLCAKKzB4MTgsIDB4MTgsIDB4MDAsIDB4OGUsIDB4YzAsIDB4NDYsIDB4YzgsIDB4ODAsIDB4MDAsIDB4MjAsIDB4ODcsIDB4MDAsIAorMHhiYiwgMHgxOCwgMHhkYywgMHgxZCwgMHgwOSwgMHgzNCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgyMywgMHg0MywgCisweDFiLCAweDY4LCAweDdmLCAweDE4LCAweDdiLCAweDYxLCAweDAxLCAweDMwLCAweDA1LCAweDI4LCAweGYyLCAweGQzLCAKKzB4MDAsIDB4MjAsIDB4ODcsIDB4MDAsIDB4YmIsIDB4MTgsIDB4ZGMsIDB4MWQsIDB4MWQsIDB4MzQsIDB4MDEsIDB4MjMsIAorMHg5YiwgMHgwNywgMHgyMywgMHg0MywgMHgxYiwgMHg2OCwgMHg3ZiwgMHgxOCwgMHhiYiwgMHg2MiwgMHgwMSwgMHgzMCwgCisweDA1LCAweDI4LCAweGYyLCAweGQzLCAweDAyLCAweGIwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4NGMsIDB4MmEsIDB4MDAsIDB4ODAsIDB4ODAsIDB4YjQsIDB4MWYsIDB4MWMsIDB4M2IsIDB4MGMsIDB4MTgsIDB4ZDIsIAorMHgxNywgMHg2ZCwgMHgxMSwgMHg0YiwgMHhjMCwgMHg0NiwgMHhkZiwgMHg2MCwgMHg1MiwgMHg2ZCwgMHhjMCwgMHg0NiwgCisweDFhLCAweDYxLCAweGM3LCAweDYwLCAweDFhLCAweDY5LCAweGMwLCAweDQ2LCAweDAyLCAweDYxLCAweGQ4LCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4MDgsIDB4ODAsIDB4ZDgsIDB4NjgsIDB4MDAsIDB4MGMsIDB4NDgsIDB4ODAsIDB4MTgsIDB4NjksIAorMHhjMCwgMHg0NiwgMHg4OCwgMHg4MCwgMHgxOCwgMHg2OSwgMHgwMCwgMHgwYywgMHhjOCwgMHg4MCwgMHg4MCwgMHhiYywgCisweDcwLCAweDQ3LCAweDRhLCAweDg4LCAweDEyLCAweDA0LCAweDBiLCAweDg4LCAweDFhLCAweDQzLCAweGMyLCAweDYwLCAKKzB4OGEsIDB4ODgsIDB4YzksIDB4ODgsIDB4MDksIDB4MDQsIDB4MTEsIDB4NDMsIDB4MDEsIDB4NjEsIDB4ZjIsIDB4ZTcsIAorMHgyYywgMHgwNywgMHgwMCwgMHg4MCwgMHhmMSwgMHhiNSwgMHg4OCwgMHhiMCwgMHgwMCwgMHgyMiwgMHgwOCwgMHg5OCwgCisweDAwLCAweDZhLCAweDA4LCAweDliLCAweDk5LCAweDY4LCAweDQ5LCAweDBhLCAweDAyLCAweGQzLCAweDAxLCAweDI3LCAKKzB4ZmYsIDB4MDMsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4MjcsIDB4MDMsIDB4OGIsIDB4MDAsIDB4MmIsIDB4MTksIDB4ZDAsIAorMHhhMywgMHg0OSwgMHg4OSwgMHg2YSwgMHgxYywgMHgxYywgMHg1OCwgMHgyMywgMHg2MywgMHg0MywgMHhjOSwgMHgxOCwgCisweDAxLCAweDIzLCAweDliLCAweDA3LCAweDU4LCAweDM5LCAweDE5LCAweDQzLCAweDA5LCAweDY4LCAweDA5LCAweDA0LCAKKzB4MDksIDB4MGMsIDB4MDIsIDB4MjksIDB4MDIsIDB4ZDEsIDB4MDgsIDB4MjMsIDB4MWYsIDB4NDMsIDB4MDcsIDB4ZTAsIAorMHg0MSwgMHg4YiwgMHgwMCwgMHgyOSwgMHgwMiwgMHhkMCwgMHgwYywgMHgyMywgCisweDFmLCAweDQzLCAweDAxLCAweGUwLCAweDA0LCAweDIzLCAweDFmLCAweDQzLCAweDgzLCAweDhhLCAweDAwLCAweDJiLCAKKzB4MTgsIDB4ZDAsIDB4OTUsIDB4NDksIDB4ODksIDB4NmEsIDB4MWMsIDB4MWMsIDB4NTgsIDB4MjMsIDB4NjMsIDB4NDMsIAorMHhjOSwgMHgxOCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHg1OCwgMHgzOSwgMHgxOSwgMHg0MywgMHgwOSwgMHg2OCwgCisweDA5LCAweDA0LCAweDA5LCAweDBjLCAweDAyLCAweDI5LCAweDAxLCAweGQxLCAweDBmLCAweDQzLCAweDA3LCAweGUwLCAKKzB4YzEsIDB4OGEsIDB4MDAsIDB4MjksIDB4MDIsIDB4ZDAsIDB4MDMsIDB4MjMsIDB4MWYsIDB4NDMsIDB4MDEsIDB4ZTAsIAorMHgwMSwgMHgyMywgMHgxZiwgMHg0MywgMHhjMSwgMHgxZCwgMHgzOSwgMHgzMSwgMHgwNywgMHg5MSwgMHg0YiwgMHg4OSwgCisweDBjLCAweDg5LCAweDFjLCAweDE5LCAweDI0LCAweDA0LCAweDI0LCAweDBjLCAweDA4LCAweDlkLCAweDJkLCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4MDEsIDB4OTUsIDB4YzksIDB4ODgsIDB4N2QsIDB4MDgsIDB4MWEsIDB4ZDMsIDB4MWEsIDB4MWMsIAorMHhjMywgMHgxZCwgMHgxOSwgMHgzMywgMHgxYSwgMHg3MiwgMHgwNywgMHg5YSwgMHg5MiwgMHg4OSwgMHhjMCwgMHg0NiwgCisweDFhLCAweDczLCAweDA3LCAweDlhLCAweDEyLCAweDg5LCAweGMwLCAweDQ2LCAweDAyLCAweDg2LCAweDA0LCAweDg3LCAKKzB4ODIsIDB4OGEsIDB4MDEsIDB4M2EsIDB4ODIsIDB4ODMsIDB4MDEsIDB4MjIsIDB4MTksIDB4NzEsIDB4MDgsIDB4OWIsIAorMHgxYiwgMHg2OCwgMHg1YiwgMHgxOCwgMHg1YiwgMHg3OCwgMHg5YiwgMHgwMCwgMHgxYiwgMHgwNCwgMHgxYiwgMHgwYywgCisweDA4LCAweDMzLCAweDU5LCAweDE4LCAweGJiLCAweDA4LCAweDQ3LCAweGQzLCAweDA3LCAweDliLCAweDViLCAweDg5LCAKKzB4ODUsIDB4MTgsIDB4MDYsIDB4OTUsIDB4MjAsIDB4MzUsIDB4MmIsIDB4NzIsIDB4MDcsIDB4OWIsIDB4OWIsIDB4ODksIAorMHhjMCwgMHg0NiwgMHgyYiwgMHg3MywgMHgwNywgMHg5YiwgMHgxYiwgMHg4OSwgMHgyZSwgMHgxYywgMHg1NSwgMHgwMCwgCisweDJkLCAweDE4LCAweDA1LCAweDk1LCAweDJiLCAweDg2LCAweDAwLCAweDJhLCAweDAxLCAweGQwLCAweGMzLCAweDhhLCAKKzB4MDAsIDB4ZTAsIDB4ODMsIDB4OGEsIDB4MDEsIDB4M2IsIDB4MDUsIDB4OWQsIDB4YzAsIDB4NDYsIDB4YWIsIDB4ODMsIAorMHgzMSwgMHg3MSwgMHg2NSwgMHg0YiwgMHg5ZCwgMHg2YSwgMHgwNSwgMHg5YiwgMHg5ZSwgMHg4YiwgMHg1OCwgMHgyMywgCisweDczLCAweDQzLCAweGViLCAweDE4LCAweGRkLCAweDFkLCAweDAxLCAweDM1LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAKKzB4MmIsIDB4NDMsIDB4MWQsIDB4NjgsIDB4MmIsIDB4MGUsIDB4NWIsIDB4MDYsIDB4MDEsIDB4ZDEsIDB4MDgsIDB4MzEsIAorMHgwMCwgMHhlMCwgMHgxMCwgMHgzMSwgMHg4MSwgMHgyMywgMHg1YiwgMHgwMiwgMHgxZCwgMHg0MCwgMHg5ZCwgMHg0MiwgCisweDAzLCAweGQxLCAweGUzLCAweDFmLCAweDA1LCAweDNiLCAweDFjLCAweDA0LCAweDI0LCAweDBjLCAweDA1LCAweDliLCAKKzB4YzAsIDB4NDYsIDB4MWMsIDB4ODcsIDB4MDgsIDB4OWIsIDB4MWIsIDB4NjgsIDB4MWIsIDB4MTksIDB4MTAsIDB4M2IsIAorMHg5YiwgMHg3YiwgMHgwNiwgMHg5ZCwgMHg0MCwgMHgzNSwgMHgyYiwgMHg3MCwgMHgyYiwgMHg3OCwgMHgwMiwgMHgzMywgCisweGUzLCAweDFhLCAweDFjLCAweDA0LCAweDI0LCAweDBjLCAweDAxLCAweDMyLCAweGJiLCAweDA4LCAweDliLCAweDA3LCAKKzB4NmQsIDB4ZDAsIDB4ODMsIDB4MTgsIDB4MjAsIDB4MzMsIDB4MDQsIDB4OTMsIDB4MTksIDB4NzIsIDB4MDEsIDB4OWIsIAorMHg1ZCwgMHgxOCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgyYiwgMHg0MywgMHgxYiwgMHg2OCwgMHgxYiwgMHgwNywgCisweDFiLCAweDBmLCAweDliLCAweDAwLCAweDA0LCAweDllLCAweGMwLCAweDQ2LCAweDMzLCAweDczLCAweDAwLCAweDk1LCAKKzB4MmIsIDB4NzgsIDB4MWIsIDB4MDcsIDB4MWIsIDB4MGYsIDB4OWIsIDB4MDAsIDB4MDQsIDB4OWQsIDB4YzAsIDB4NDYsIAorMHgyYiwgMHg3MywgMHgwMCwgMHg5ZCwgMHhlYiwgMHg3OCwgMHhhZCwgMHg3OCwgMHgxYiwgMHgwMiwgMHgxZCwgMHg0MywgCisweDJiLCAweDAyLCAweDJkLCAweDBhLCAweDJkLCAweDA2LCAweDJkLCAweDBlLCAweDJiLCAweDQzLCAweDU1LCAweDAwLCAKKzB4MmQsIDB4MTgsIDB4MmIsIDB4ODYsIDB4MDQsIDB4OWIsIDB4YzAsIDB4NDYsIDB4NTksIDB4NzIsIDB4MDQsIDB4OWIsIAorMHgxYiwgMHg3YiwgMHgyZSwgMHgxYywgMHgwNCwgMHg5ZCwgMHhjMCwgMHg0NiwgMHg2YiwgMHg3MywgMHgzMywgMHg4ZSwgCisweGMwLCAweDQ2LCAweDczLCAweDg2LCAweDAwLCAweDlkLCAweDJiLCAweDc4LCAweDFiLCAweDA3LCAweDFiLCAweDBmLCAKKzB4OWIsIDB4MDAsIDB4MWIsIDB4MDQsIDB4MWIsIDB4MGMsIDB4NTksIDB4MTgsIDB4MDQsIDB4MjUsIDB4M2QsIDB4NDAsIAorMHgwZSwgMHhkMCwgMHgzNCwgMHg4NywgMHgwMywgMHg4YiwgMHgwMSwgMHgzYiwgMHhiMywgMHg4MywgMHgxMywgMHgxYywgCisweDFiLCAweDE4LCAweDIwLCAweDMzLCAweDE5LCAweDcxLCAweDAxLCAweDliLCAweDViLCAweDE4LCAweDViLCAweDc4LCAKKzB4OWIsIDB4MDAsIDB4NTksIDB4MTgsIDB4MDgsIDB4MzEsIDB4MDEsIDB4MzIsIDB4M2IsIDB4MDksIDB4MzcsIDB4ZDMsIAorMHgwMCwgMHgyZCwgMHgwMSwgMHhkMCwgMHg0MywgMHg4YiwgMHgwMCwgMHhlMCwgMHgwMywgMHg4YiwgMHg1NSwgMHgwMCwgCisweDJkLCAweDE4LCAweDAxLCAweDNiLCAweGFiLCAweDgzLCAweDgzLCAweDE4LCAweDAzLCAweDkzLCAweDIwLCAweDMzLCAKKzB4MTksIDB4NzEsIDB4MjAsIDB4NGIsIDB4OWQsIDB4NmEsIDB4NTMsIDB4MDAsIDB4MWIsIDB4MTgsIDB4MDIsIDB4OTMsIAorMHg5ZSwgMHg4YiwgMHg1OCwgMHgyMywgMHg3MywgMHg0MywgMHhlYiwgMHgxOCwgMHhkZCwgMHgxZCwgMHgwMSwgMHgzNSwgCisweDAxLCAweDIzLCAweDliLCAweDA3LCAweDJiLCAweDQzLCAweDFkLCAweDY4LCAKKzB4MmIsIDB4MGUsIDB4NWIsIDB4MDYsIDB4MDIsIDB4ZDEsIDB4MDgsIDB4MzEsIDB4MDEsIDB4ZTAsIDB4MTUsIDB4ZTAsIAorMHgxMCwgMHgzMSwgMHg4MSwgMHgyMywgMHg1YiwgMHgwMiwgMHgxZCwgMHg0MCwgMHg5ZCwgMHg0MiwgMHgwMywgMHhkMSwgCisweGUzLCAweDFmLCAweDA1LCAweDNiLCAweDFjLCAweDA0LCAweDI0LCAweDBjLCAweDAyLCAweDliLCAweGMwLCAweDQ2LCAKKzB4MWMsIDB4ODcsIDB4MDgsIDB4OWIsIDB4MWIsIDB4NjgsIDB4MWIsIDB4MTksIDB4MTAsIDB4M2IsIDB4OWIsIDB4N2IsIAorMHgwMywgMHg5YywgMHg0MCwgMHgzNCwgMHgyMywgMHg3MCwgMHgwMSwgMHgzMiwgMHgwNywgMHg5YiwgMHhjMCwgMHg0NiwgCisweGQ5LCAweDgwLCAweDUxLCAweDFlLCAweGMzLCAweDFkLCAweDQ5LCAweDMzLCAweDE5LCAweDcwLCAweDA3LCAweDYxLCAKKzB4MDQsIDB4MmEsIDB4MDYsIDB4ZDIsIDB4MDYsIDB4NDksIDB4NTMsIDB4MDAsIDB4MWIsIDB4MTgsIDB4OTksIDB4ODMsIAorMHgwMSwgMHgzMiwgMHgwNCwgMHgyYSwgMHhmOSwgMHhkMywgMHgwOSwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDRjLCAweDJhLCAweDAwLCAweDgwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAKKzB4NzAsIDB4NDcsIDB4ODAsIDB4YjUsIDB4OGMsIDB4YjAsIDB4MDcsIDB4MWMsIDB4MTIsIDB4NDgsIDB4MDEsIDB4NjgsIAorMHgwMSwgMHgzMSwgMHgwMSwgMHg2MCwgMHgzOCwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MCwgMHg3OCwgMHg2OCwgCisweGMwLCAweDQ2LCAweDAxLCAweDkwLCAweGI4LCAweDY4LCAweGMwLCAweDQ2LCAweDAyLCAweDkwLCAweDBkLCAweDQ4LCAKKzB4NDEsIDB4NjgsIDB4YzksIDB4NjgsIDB4YzAsIDB4NDYsIDB4NDEsIDB4NjAsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHg0ZiwgMHhmOCwgMHhiOCwgMHg2OCwgMHg0MCwgMHgwOSwgMHgwNiwgMHhkMywgMHgxMCwgMHgyMywgMHgwMiwgMHg5OCwgCisweDE4LCAweDQzLCAweDAyLCAweDkwLCAweDY4LCAweDQ2LCAweDAyLCAweGYwLCAweGUxLCAweGZmLCAweDY4LCAweDQ2LCAKKzB4MDIsIDB4ZjAsIDB4OWEsIDB4ZmUsIDB4MGMsIDB4YjAsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgMHgwMCwgMHhiNSwgMHg4YywgMHhiMCwgCisweDAxLCAweDY4LCAweGMwLCAweDQ2LCAweDAwLCAweDkxLCAweDQxLCAweDY4LCAweDA1LCAweDRiLCAweDE5LCAweDQzLCAKKzB4MDEsIDB4OTEsIDB4MDAsIDB4ZjAsIDB4MmYsIDB4ZjgsIDB4NjgsIDB4NDYsIDB4MDIsIDB4ZjAsIDB4ODQsIDB4ZmUsIAorMHgwYywgMHhiMCwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhMCwgCisweDAyLCAweDZhLCAweDAzLCAweDY4LCAweGMwLCAweDQ2LCAweDEzLCAweDYwLCAweDQwLCAweDY4LCAweGMwLCAweDQ2LCAKKzB4NTAsIDB4NjAsIDB4NDAsIDB4MzIsIDB4NDgsIDB4NjgsIDB4YzAsIDB4NDYsIDB4OTAsIDB4ODAsIDB4YzgsIDB4NjgsIAorMHhjMCwgMHg0NiwgMHhkMCwgMHg4MCwgMHg0OCwgMHg2OSwgMHhjMCwgMHg0NiwgMHgxMCwgMHg4MSwgMHg4OCwgMHg2OCwgCisweGMwLCAweDQ2LCAweDUwLCAweDgxLCAweDA4LCAweDdlLCAweGMwLCAweDQ2LCAweDkwLCAweDczLCAweDA4LCAweDY5LCAKKzB4YzAsIDB4NDYsIDB4OTAsIDB4ODEsIDB4NzAsIDB4NDcsIDB4MDQsIDB4NDksIDB4MDgsIDB4NjgsIDB4MDAsIDB4MjgsIAorMHgwMCwgMHhkMSwgMHg3MCwgMHg0NywgMHhjMiwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwYSwgMHg2MCwgMHhmYSwgMHhlNywgCisweDZjLCAweDA2LCAweDAwLCAweDgwLCAweDAyLCAweDQ5LCAweDBhLCAweDY4LCAweGMwLCAweDQ2LCAweGMyLCAweDYwLCAKKzB4MDgsIDB4NjAsIDB4NzAsIDB4NDcsIDB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIDB4YjAsIDB4YjQsIDB4MDAsIDB4MjIsIAorMHgxMiwgMHg0ZiwgMHg3YywgMHg3ZiwgMHgwMSwgMHgzNCwgMHg3YywgMHg3NywgMHgwMywgMHgyMywgMHhmYywgMHgxZCwgCisweDE5LCAweDM0LCAweDM4LCAweDYyLCAweDc5LCAweDYyLCAweDIzLCAweDcyLCAweDBlLCAweDRjLCAweDI1LCAweDY4LCAKKzB4NmIsIDB4MGMsIDB4MDUsIDB4ZDIsIDB4MjMsIDB4NjgsIDB4MWIsIDB4MGMsIDB4MTAsIDB4ZDEsIDB4MjQsIDB4NjgsIAorMHhhMywgMHgwYSwgMHgwZCwgMHhkMywgMHgwMSwgMHgyMywgMHgwYSwgMHg0ZiwgMHhjMCwgMHg0NiwgMHhmYiwgMHg2MiwgCisweDA5LCAweDRmLCAweDBhLCAweDRiLCAweGMwLCAweDQ2LCAweGRmLCAweDYwLCAweDk5LCAweDYwLCAweDU4LCAweDYwLCAKKzB4MTAsIDB4MWMsIDB4MTgsIDB4NjAsIDB4MDEsIDB4MzIsIDB4ZmIsIDB4ZTcsIDB4MTAsIDB4MWMsIDB4MzgsIDB4NjQsIAorMHgwMSwgMHgzMiwgMHhmYiwgMHhlNywgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgxMCwgMHg0MCwgCisweGMwLCAweDAwLCAweDE4LCAweDAwLCAweDAyLCAweDgxLCAweDAwLCAweDAwLCAweDQwLCAweDAxLCAweDE4LCAweDAwLCAKKzB4ZjAsIDB4YjUsIDB4NDcsIDB4NGYsIDB4MzgsIDB4NjgsIDB4NDcsIDB4NGUsIDB4NDcsIDB4NGQsIDB4MDcsIDB4MjMsIAorMHg1YiwgMHgwMiwgMHhlYywgMHgxOCwgMHgwMCwgMHgyOCwgMHgxZCwgMHhkMSwgMHgyMCwgMHg2YiwgMHgwMSwgMHgzMCwgCisweDIwLCAweDYzLCAweDQ0LCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweDQzLCAweDQ4LCAweDQxLCAweDY5LCAKKzB4MDAsIDB4MjksIDB4MTMsIDB4ZDAsIDB4YzEsIDB4MWQsIDB4NjksIDB4MzEsIDB4MDksIDB4N2IsIDB4MDAsIDB4MjksIAorMHgwZSwgMHhkMCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgwMSwgMHg2ZCwgMHgxOSwgMHg0MywgMHgwOSwgMHg2OCwgCisweGMwLCAweDQ2LCAweDgxLCAweDYxLCAweGMyLCAweDY5LCAweDkxLCAweDQyLCAweDA0LCAweGQwLCAweGYxLCAweDZjLCAKKzB4MDEsIDB4MzEsIDB4ZjEsIDB4NjQsIDB4MDEsIDB4ZjAsIDB4NTAsIDB4ZmUsIAorMHgzOCwgMHg2OCwgMHgwMSwgMHgyOCwgMHgxNywgMHhkMSwgMHgzNywgMHg0OCwgMHg0MSwgMHg2OSwgMHgwMCwgMHgyOSwgCisweDEzLCAweGQwLCAweGMxLCAweDFkLCAweDY5LCAweDMxLCAweDA5LCAweDdiLCAweDAwLCAweDI5LCAweDBlLCAweGQwLCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MDEsIDB4NmQsIDB4MTksIDB4NDMsIDB4MDksIDB4NjgsIDB4YzAsIDB4NDYsIAorMHg4MSwgMHg2MSwgMHhjMiwgMHg2OSwgMHg5MSwgMHg0MiwgMHgwNCwgMHhkMCwgMHhmMSwgMHg2YywgMHgwMSwgMHgzMSwgCisweGYxLCAweDY0LCAweDAxLCAweGYwLCAweDM1LCAweGZlLCAweDM4LCAweDY4LCAweDAyLCAweDI4LCAweDJmLCAweGQxLCAKKzB4YmIsIDB4MjMsIDB4MWIsIDB4MDEsIDB4ZWUsIDB4MTgsIDB4NzAsIDB4N2IsIDB4MDAsIDB4MjgsIDB4MDMsIDB4ZDAsIAorMHgwMCwgMHgyMCwgMHg3MCwgMHg3MywgMHgwMCwgMHhmMCwgMHg0YSwgMHhmZCwgMHgzMCwgMHg3YiwgMHgwMCwgMHgyOCwgCisweDAyLCAweGQwLCAweDc4LCAweDY4LCAweDAyLCAweGYwLCAweGFhLCAweGZmLCAweDFiLCAweDIzLCAweGRiLCAweDAxLCAKKzB4ZTgsIDB4MTgsIDB4YzAsIDB4OGIsIDB4MDQsIDB4MjYsIDB4MDYsIDB4NDAsIDB4ZTAsIDB4NmEsIDB4YjAsIDB4NDIsIAorMHgxNCwgMHhkMCwgMHhmOCwgMHg2OCwgMHgwMSwgMHgzMCwgMHhmOCwgMHg2MCwgMHgxOSwgMHgyOCwgMHgxMSwgMHhkMywgCisweDFiLCAweDQ4LCAweDAxLCAweDdiLCAweDAwLCAweDI5LCAweDBkLCAweGQxLCAweGZmLCAweDMwLCAweDQxLCAweDMwLCAKKzB4NDAsIDB4NzgsIDB4MDAsIDB4MjgsIDB4MDgsIDB4ZDEsIDB4YjgsIDB4NjgsIDB4MDIsIDB4ZjAsIDB4OTAsIDB4ZmYsIAorMHgwMCwgMHgyMCwgMHhmOCwgMHg2MCwgMHhlNiwgMHg2MiwgMHgwMSwgMHhlMCwgMHgwMCwgMHgyMCwgMHhmOCwgMHg2MCwgCisweDM4LCAweDY4LCAweDAzLCAweDI4LCAweDBiLCAweGQxLCAweGVjLCAweDFkLCAweDc5LCAweDM0LCAweGUwLCAweDZiLCAKKzB4ODAsIDB4MDgsIDB4MDIsIDB4ZDMsIDB4MDIsIDB4MjAsIDB4MDIsIDB4ZjAsIDB4MDcsIDB4ZmMsIDB4MDIsIDB4MjMsIAorMHhlMCwgMHg2YiwgMHg5OCwgMHg0MywgMHhlMCwgMHg2MywgMHgzOCwgMHg2OCwgMHgwMSwgMHgzMCwgMHgzOCwgMHg2MCwgCisweDAzLCAweDI4LCAweDAxLCAweGQ5LCAweDAwLCAweDIwLCAweDM4LCAweDYwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4M2MsIDB4MDQsIDB4MDAsIDB4ODAsIDB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg0MCwgMHgwMSwgMHgxOCwgMHgwMCwgMHg2NCwgMHgyZCwgMHgwMCwgMHg4MCwgCisweGU0LCAweDJjLCAweDAwLCAweDgwLCAweDI4LCAweDA1LCAweDAwLCAweDgwLCAweGIwLCAweGI0LCAweDFkLCAweDQ4LCAKKzB4ODQsIDB4OGEsIDB4MWQsIDB4NGEsIDB4MTMsIDB4OGEsIDB4YzEsIDB4MWQsIDB4MDksIDB4MzEsIDB4MDEsIDB4MjcsIAorMHg5YywgMHg0MiwgMHgwMywgMHhkMSwgMHg0MywgMHg4YSwgMHg1NCwgMHg4YSwgMHhhMywgMHg0MiwgMHgxMCwgMHhkMCwgCisweDBiLCAweDc4LCAweDAwLCAweDJiLCAweDBkLCAweGQwLCAweDRiLCAweDc4LCAweDAwLCAweDJiLCAweDBhLCAweGQwLCAKKzB4NDQsIDB4OGIsIDB4OTMsIDB4OGEsIDB4OWMsIDB4NDIsIDB4MDQsIDB4ZGMsIDB4MTMsIDB4NGIsIDB4YzAsIDB4NDYsIAorMHg1ZiwgMHg2MCwgMHg5NywgMHg4MiwgMHgwMSwgMHhlMCwgMHgwMSwgMHgzMywgMHg5MywgMHg4MiwgMHhjMywgMHg4YiwgCisweDVjLCAweDFjLCAweGM0LCAweDgzLCAweDg0LCAweDhiLCAweGEzLCAweDQyLCAweDBlLCAweGRiLCAweDg0LCAweDhhLCAKKzB4MDUsIDB4OGIsIDB4MDAsIDB4MjMsIDB4YWMsIDB4NDIsIDB4MDUsIDB4ZGEsIDB4NDQsIDB4OGEsIDB4YzUsIDB4OGEsIAorMHhhYywgMHg0MiwgMHgwMSwgMHhkYSwgMHg0YiwgMHg3MCwgMHgwMCwgMHhlMCwgMHg0ZiwgMHg3MCwgMHg0MywgMHg4MiwgCisweDgzLCAweDgyLCAweGMzLCAweDgzLCAweDQxLCAweDhhLCAweGMwLCAweDQ2LCAweDUxLCAweDgyLCAweDgwLCAweDhhLCAKKzB4YzAsIDB4NDYsIDB4MTAsIDB4ODIsIDB4YjAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4ZTgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHgzYywgMHgwNCwgMHgwMCwgMHg4MCwgMHg0MCwgMHgwMSwgMHgxOCwgMHgwMCwgMHhmNywgMHhiNSwgMHg5MSwgMHhiMCwgCisweDZiLCAweDQ2LCAweDg0LCAweDFlLCAweDEyLCAweDk5LCAweDE0LCAweDI5LCAweDFhLCAweGQ5LCAweDAwLCAweDIwLCAKKzB4ODEsIDB4MDAsIDB4NjcsIDB4NTgsIDB4YzAsIDB4NDYsIDB4NTcsIDB4NTAsIDB4MDEsIDB4MzAsIDB4MDAsIDB4MDYsIAorMHgwMCwgMHgwZSwgMHgxMCwgMHgyOCwgMHhmNiwgMHhkMywgMHgwMCwgMHgyMSwgMHgwNSwgMHgyMCwgMHg4NywgMHgwMCwgCisweGQ2LCAweDU5LCAweDRmLCAweDFjLCAweDNkLCAweDA2LCAweDJkLCAweDBlLCAweDBmLCAweDFjLCAweGJmLCAweDAwLCAKKzB4ZGUsIDB4NTEsIDB4MjksIDB4MWMsIDB4MDEsIDB4MzAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MGUsIDB4MTAsIDB4MjgsIAorMHhmMSwgMHhkMywgMHgwOSwgMHhlMCwgMHgwMCwgMHgyMCwgMHg4MSwgMHgwMCwgMHg2MywgMHg1OCwgMHhjMCwgMHg0NiwgCisweDUzLCAweDUwLCAweDAxLCAweDMwLCAweDAwLCAweDA2LCAweDAwLCAweDBlLCAweDA2LCAweDI4LCAweGY2LCAweGQzLCAKKzB4MDAsIDB4MjAsIDB4ZTAsIDB4NzAsIDB4MjAsIDB4NzIsIDB4NjAsIDB4NzIsIDB4YTAsIDB4NzIsIDB4MjAsIDB4NzMsIAorMHg2MCwgMHg3MywgMHgxMiwgMHg5OSwgMHgxNCwgMHgyOSwgMHgzNywgMHhkOSwgMHg2OSwgMHg0NiwgMHg4ZSwgMHgxYywgCisweDkxLCAweDc4LCAweDA5LCAweDA3LCAweDA5LCAweDBmLCAweDg5LCAweDAwLCAweDE0LCAweDM5LCAweDBkLCAweDA2LCAKKzB4MmQsIDB4MTYsIDB4MDAsIDB4MjcsIDB4MDAsIDB4MmQsIDB4MWIsIDB4ZGQsIDB4ZjAsIDB4MTksIDB4MTAsIDB4YTksIAorMHgwMCwgMHhmMCwgMHgzZCwgMHhmOCwgMHgwMCwgMHgyOCwgMHgwZSwgMHhkMCwgCisweDAwLCAweDIwLCAweDEwLCAweGE5LCAweDA5LCAweDc4LCAweDAwLCAweDI5LCAweDA5LCAweGRkLCAweDAwLCAweDIyLCAKKzB4MzksIDB4MTgsIDB4NzIsIDB4NTQsIDB4MDEsIDB4MzAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MGUsIDB4MTAsIDB4YTksIAorMHgwOSwgMHg3OCwgMHg4OCwgMHg0MiwgMHhmNiwgMHhkYiwgMHgxMCwgMHhhOCwgMHgwMCwgMHg3OCwgMHgzOCwgMHgxOCwgCisweDA3LCAweDA2LCAweDNmLCAweDBlLCAweGFmLCAweDQyLCAweGUzLCAweGRiLCAweDY4LCAweDQ2LCAweGUyLCAweDFkLCAKKzB4MGQsIDB4MzIsIDB4MDAsIDB4MjEsIDB4YWIsIDB4MDgsIDB4NWYsIDB4MWMsIDB4MDgsIDB4ZDAsIDB4OGIsIDB4MDAsIAorMHhjNCwgMHg1OCwgMHhjMCwgMHg0NiwgMHhkNCwgMHg1MCwgMHgwMSwgMHgzMSwgMHgwOSwgMHgwNiwgMHgwOSwgMHgwZSwgCisweDhmLCAweDQyLCAweGY2LCAweGQ4LCAweDE0LCAweGIwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4OTAsIDB4YjQsIDB4ODcsIDB4MWUsIDB4MDAsIDB4MjAsIDB4ODksIDB4MDgsIDB4NGIsIDB4MWMsIDB4MDgsIDB4ZDAsIAorMHg4MSwgMHgwMCwgMHg1NCwgMHg1OCwgMHhjMCwgMHg0NiwgMHg3YywgMHg1MCwgMHgwMSwgMHgzMCwgMHgwMCwgMHgwNiwgCisweDAwLCAweDBlLCAweDgzLCAweDQyLCAweGY2LCAweGQ4LCAweDkwLCAweGJjLCAweDcwLCAweDQ3LCAweDgwLCAweGI0LCAKKzB4MDIsIDB4NzgsIDB4ZDIsIDB4MDYsIDB4ZDIsIDB4MGUsIDB4MDAsIDB4MjMsIDB4MDEsIDB4MjcsIDB4MDEsIDB4MmEsIAorMHgwMSwgMHhkYywgMHgwZiwgMHg3MCwgMHgxMSwgMHhlMCwgMHg0MCwgMHg3OCwgMHhjMCwgMHg0NiwgMHgwOCwgMHg3MCwgCisweDE0LCAweDJhLCAweDA0LCAweGQxLCAweDA4LCAweDQ4LCAweDAxLCAweDdhLCAweDAxLCAweDMxLCAweDAxLCAweDcyLCAKKzB4MDcsIDB4ZTAsIDB4MDIsIDB4MmEsIDB4MDUsIDB4ZDAsIDB4MDUsIDB4MmEsIDB4MDMsIDB4ZDAsIDB4MDYsIDB4MmEsIAorMHgwMSwgMHhkMCwgMHgxNSwgMHgyYSwgMHgwMiwgMHhkMSwgMHgxOCwgMHgxYywgMHg4MCwgMHhiYywgMHg3MCwgMHg0NywgCisweDM4LCAweDFjLCAweGZiLCAweGU3LCAweGUwLCAweDgyLCAweDIwLCAweDQwLCAweDAwLCAweGI1LCAweDBmLCAweDQ4LCAKKzB4MDEsIDB4MjMsIDB4MWIsIDB4MDYsIDB4NDEsIDB4NjksIDB4OTksIDB4NDMsIDB4MWEsIDB4MDksIDB4NDEsIDB4NjEsIAorMHhkMSwgMHg2MCwgMHgwMCwgMHgyMSwgMHhhMSwgMHgyMiwgMHg1MiwgMHgwMywgMHg5MSwgMHg2MSwgMHgxOSwgMHgxYywgCisweDA5LCAweDRhLCAweGMwLCAweDQ2LCAweDExLCAweDYwLCAweDFiLCAweDIzLCAweGRiLCAweDAxLCAweGMwLCAweDE4LCAKKzB4ODAsIDB4NjksIDB4MDAsIDB4MjgsIDB4MDMsIDB4ZDAsIDB4MDIsIDB4ZjAsIDB4NjEsIDB4ZmUsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHgwNCwgMHg0OCwgMHg0MSwgMHg4OCwgMHgwMSwgMHgzMSwgMHg0MSwgMHg4MCwgMHhmOCwgMHhlNywgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweGIwLCAweGUwLCAweDgyLCAweDIwLCAweDQwLCAKKzB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4YjUsIDB4ODYsIDB4YjAsIDB4OTUsIDB4NGEsIDB4ZDAsIDB4NjgsIAorMHhkNywgMHgxZCwgMHg3OSwgMHgzNywgMHgwMSwgMHgyOCwgMHgwOSwgMHhkMSwgMHgzOCwgMHg4OSwgMHgwMCwgMHgyOCwgCisweDA2LCAweGQxLCAweGQwLCAweDZmLCAweDAyLCAweDIzLCAweDAxLCAweDY4LCAweDk5LCAweDQzLCAweDAxLCAweDYwLCAKKzB4MTQsIDB4MjAsIDB4MzgsIDB4ODEsIDB4OGUsIDB4NGMsIDB4NjEsIDB4NmEsIDB4OGUsIDB4NDgsIDB4YzMsIDB4NmIsIAorMHg1OSwgMHgxOCwgMHhjMSwgMHg2MywgMHhhMCwgMHg2YSwgMHgxOSwgMHgyMywgMHhkYiwgMHgwMSwgMHhkNCwgMHgxOCwgCisweGEwLCAweDYyLCAweDIxLCAweDZhLCAweDA5LCAweDAzLCAweDA5LCAweDBiLCAweDgxLCAweDQyLCAweDA1LCAweGQxLCAKKzB4MDEsIDB4MjAsIDB4NDAsIDB4MDQsIDB4ODcsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIDB4ZjMsIDB4ZTAsIAorMHhiYiwgMHg4YSwgMHg1OCwgMHgxYywgMHhiOCwgMHg4MiwgMHgzZCwgMHg4YiwgMHgwMSwgMHgyMCwgMHgwMCwgMHgyMSwgCisweGFiLCAweDQyLCAweDA0LCAweGRiLCAweGQzLCAweDFkLCAweDg5LCAweDMzLCAweDU4LCAweDcwLCAweGI5LCAweDgyLCAKKzB4ZjksIDB4ODMsIDB4MzMsIDB4MjMsIDB4OWIsIDB4MDEsIDB4ZDMsIDB4MTgsIDB4MDUsIDB4OTMsIDB4NWIsIDB4NjksIAorMHgwZiwgMHgyYiwgMHg3MywgMHhkMiwgMHgwMCwgMHgyMSwgMHg3YywgMHg0ZiwgMHhjMCwgMHg0NiwgMHgzOSwgMHg2MSwgCisweDIxLCAweDZhLCAweDhhLCAweDY4LCAweDEyLCAweDA0LCAweDEyLCAweDBjLCAweDRiLCAweDY4LCAweDFlLCAweDBjLCAKKzB4MzYsIDB4MDQsIDB4ZmQsIDB4MWYsIDB4MDksIDB4M2QsIDB4MDAsIDB4MmUsIDB4MDUsIDB4ZDEsIDB4M2IsIDB4MmEsIAorMHgwMywgMHhkMywgMHgwMSwgMHgyMywgMHhkYiwgMHgwMiwgMHg5YSwgMHg0MiwgMHgwMSwgMHhkOSwgMHhhOCwgMHg3MywgCisweGM4LCAweGUwLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDA4LCAweDMxLCAweDE5LCAweDQzLCAweDA5LCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4MDMsIDB4OTEsIDB4MDMsIDB4YTksIDB4MDksIDB4ODgsIDB4MDEsIDB4MzEsIDB4MDksIDB4MDQsIAorMHgwOSwgMHgwYywgMHg3OSwgMHg4MiwgMHg0OSwgMHgwOSwgMHgwNSwgMHgzMSwgMHgwOSwgMHgwNiwgMHgwOSwgMHgwZSwgCisweDY5LCAweDRlLCAweGMwLCAweDQ2LCAweDAyLCAweDk2LCAweDY5LCAweDQ4LCAweDQzLCAweDZhLCAweGMwLCAweDQ2LCAKKzB4MDEsIDB4OTMsIDB4ODMsIDB4NmEsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTMsIDB4YzIsIDB4MWQsIDB4MTEsIDB4MzIsIAorMHg4MCwgMHg2OSwgMHgwMCwgMHgwMywgMHgwMCwgMHgwYiwgMHg5MiwgMHg2OCwgMHhiMywgMHgwNywgMHgxYSwgMHg0MywgCisweDEyLCAweDY4LCAweDkwLCAweDQyLCAweDAxLCAweGQxLCAweDAxLCAweDIwLCAKKzB4MGQsIDB4ZTAsIDB4OTAsIDB4NDIsIDB4MDUsIDB4ZDksIDB4MDAsIDB4OWIsIDB4MTgsIDB4MWEsIDB4MDEsIDB4OWIsIAorMHhkMiwgMHgxYSwgMHg4MiwgMHgxOCwgMHgwMCwgMHhlMCwgMHgxMiwgMHgxYSwgMHgwMSwgMHgyMCwgMHgwOSwgMHgwMSwgCisweDkxLCAweDQyLCAweDAwLCAweGQzLCAweDAwLCAweDIwLCAweDAxLCAweDI4LCAweDY1LCAweGQxLCAweDUxLCAweDQ5LCAKKzB4MjAsIDB4NjksIDB4MDAsIDB4MjgsIDB4NjIsIDB4ZDAsIDB4MDUsIDB4OTksIDB4NDgsIDB4NjksIDB4MDEsIDB4MzAsIAorMHg0OCwgMHg2MSwgMHgwMiwgMHgyMCwgMHgyMSwgMHg2YSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHgwMCwgMHhmMCwgCisweGE3LCAweGZjLCAweDc4LCAweDYzLCAweGJlLCAweDYwLCAweDQ5LCAweDQ5LCAweDIyLCAweDZhLCAweGEzLCAweDZiLCAKKzB4ZDMsIDB4MTgsIDB4NjYsIDB4NmIsIDB4YjMsIDB4NDIsIDB4MDAsIDB4ZDksIDB4MjIsIDB4NmIsIDB4YzAsIDB4NDYsIAorMHhiYSwgMHg2MiwgMHhiYSwgMHg2YSwgMHgwYywgMHgzMiwgMHhmYSwgMHg2MiwgMHgwMCwgMHgyMiwgMHhmYSwgMHg2MSwgCisweDAzLCAweGFhLCAweDUyLCAweDg4LCAweGQyLCAweDA5LCAweDAzLCAweGQzLCAweDAxLCAweDIyLCAweDAwLCAweGUwLCAKKzB4N2IsIDB4ZTAsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4MjIsIDB4N2EsIDB4NjAsIDB4N2EsIDB4NjgsIDB4YzAsIDB4NDYsIAorMHgwMiwgMHg2MCwgMHg3OCwgMHg4YSwgMHg0MSwgMHg0ZSwgMHg2MCwgMHgyOCwgMHgwNCwgMHhkYywgMHhiMCwgMHg4MywgCisweDc4LCAweDhhLCAweGMwLCAweDQ2LCAweGYwLCAweDgzLCAweDA4LCAweGUwLCAweDYwLCAweDIwLCAweGIwLCAweDgzLCAKKzB4NzksIDB4OGEsIDB4ZjgsIDB4NmEsIDB4NDIsIDB4MTgsIDB4NjMsIDB4NmIsIDB4OWEsIDB4NDIsIDB4MDMsIDB4ZDgsIAorMHhmMSwgMHg4MywgMHgwMCwgMHgyMiwgMHgzYSwgMHg2MywgMHgwNSwgMHhlMCwgMHgyMSwgMHg2YiwgMHhjMCwgMHg0NiwgCisweDM5LCAweDYzLCAweDYxLCAweDZiLCAweDA4LCAweDFhLCAweGYwLCAweDgzLCAweDJkLCAweDQ5LCAweDc4LCAweDZiLCAKKzB4NDIsIDB4NjgsIDB4YzAsIDB4NDYsIDB4YmEsIDB4NjAsIDB4ODIsIDB4NjgsIDB4YzAsIDB4NDYsIDB4ZmEsIDB4NjAsIAorMHgwMiwgMHg2OSwgMHhjMCwgMHg0NiwgMHg3YSwgMHg2MSwgMHg0MCwgMHg2OSwgMHhjMCwgMHg0NiwgMHhiOCwgMHg2MSwgCisweDJlLCAweDRiLCAweGM4LCAweDE4LCAweDA0LCAweDkwLCAweDAwLCAweGYwLCAweDM3LCAweGY5LCAweDA0LCAweDk4LCAKKzB4MDAsIDB4ZjAsIDB4ODgsIDB4ZjgsIDB4MDAsIDB4ZjAsIDB4ZjYsIDB4ZmEsIDB4NzgsIDB4OGEsIDB4ZjEsIDB4OGIsIAorMHg4OCwgMHg0MiwgMHgwNCwgMHhkMSwgMHhmOSwgMHg2YSwgMHgwOCwgMHgxOCwgMHgwNCwgMHhlMCwgMHgzOCwgMHhlMCwgCisweDMyLCAweGUwLCAweDNhLCAweDZiLCAweDEwLCAweDE4LCAweDQwLCAweDFhLCAweDgxLCAweDA3LCAweDAyLCAweGQwLCAKKzB4ODAsIDB4MDgsIDB4ODAsIDB4MDAsIDB4MDQsIDB4MzAsIDB4NjEsIDB4NmIsIDB4MDksIDB4MWEsIDB4YTIsIDB4NmIsIAorMHg5MSwgMHg0MiwgMHgwMCwgMHhkMiwgMHgyMCwgMHg2YiwgMHhjMCwgMHg0NiwgMHgyMCwgMHg2MiwgMHhlOCwgMHg3YiwgCisweDAwLCAweDI4LCAweDA4LCAweGQwLCAweDAwLCAweDIyLCAweGVhLCAweDczLCAweDA1LCAweDk5LCAweDQ4LCAweDY5LCAKKzB4MDEsIDB4MzgsIDB4NDgsIDB4NjEsIDB4NzgsIDB4NmIsIDB4MDAsIDB4ZjAsIDB4NzMsIDB4ZmEsIDB4MTgsIDB4NDgsIAorMHg4MCwgMHg2YSwgMHg4MCwgMHgwNiwgMHg4MCwgMHgwZSwgMHgwMSwgMHgyOCwgMHgwYSwgMHhkMSwgMHgyMCwgMHg2YSwgCisweDAwLCAweDAzLCAweDAwLCAweDBiLCAweDBiLCAweDRjLCAweGExLCAweDZhLCAweDg4LCAweDQyLCAweDAzLCAweGQwLCAKKzB4MDYsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDEsIDB4MjAsIDB4NDAsIDB4MDQsIAorMHgwOCwgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHgwNiwgMHhlMCwgMHhlMCwgMHg2OCwgMHgwMCwgMHgyOCwgCisweDAxLCAweGQwLCAweDAwLCAweGYwLCAweGI1LCAweGZhLCAweDAxLCAweDIwLCAweGE4LCAweDczLCAweGVkLCAweGU3LCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MDAsIDB4NDAsIDB4MTQsIDB4NDAsIDB4YTQsIDB4MmEsIDB4MDAsIDB4ODAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHgyOCwgMHgxYSwgMHgwMCwgMHg4MCwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgCisweGE4LCAweDAzLCAweDAwLCAweDgwLCAweDY4LCAweDFhLCAweDAwLCAweDgwLCAweGM0LCAweDBiLCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MTAsIDB4NDAsIDB4ODAsIDB4YjUsIDB4MDcsIDB4MWMsIDB4NzgsIDB4NmEsIDB4NDAsIDB4ODksIAorMHhmZiwgMHgyMSwgMHgwMSwgMHgzMSwgMHgwMSwgMHg0MCwgMHgxMCwgMHg0OCwgMHgwMiwgMHhkMSwgMHg4MSwgMHg2YywgCisweDAxLCAweDMxLCAweDgxLCAweDY0LCAweDc5LCAweDZhLCAweDQ5LCAweDg5LCAweDQ5LCAweDBiLCAweDAyLCAweGQyLCAKKzB4NDEsIDB4NmMsIDB4MDEsIDB4MzEsIDB4NDEsIDB4NjQsIDB4MGIsIDB4NDgsIDB4NDEsIDB4NmEsIDB4MDEsIDB4MzEsIAorMHg0MSwgMHg2MiwgMHg3OCwgMHg2YSwgMHgzOSwgMHg2YiwgMHhjMCwgMHg0NiwgMHg0OCwgMHg2MiwgMHgzOCwgMHg2YiwgCisweDAwLCAweGYwLCAweGY4LCAweGZiLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweGIzLCAweGY4LCAweDAxLCAweDIwLCAKKzB4MDQsIDB4NDksIDB4YzAsIDB4NDYsIDB4YzgsIDB4NzMsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHhhNCwgMHgyYSwgMHgwMCwgMHg4MCwgMHhhMCwgMHg4MiwgMHgyMCwgMHg0MCwgMHgxOCwgMHgxYSwgMHgwMCwgMHg4MCwgCisweGY4LCAweGI1LCAweDA3LCAweDFjLCAweDAwLCAweDIyLCAweGY5LCAweDFkLCAweDYxLCAweDMxLCAweDBkLCAweDFjLCAKKzB4NzgsIDB4NmEsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTAsIDB4NDAsIDB4ODksIAorMHgwMywgMHgwYywgMHgwMSwgMHhkMiwgMHg0MCwgMHgwYSwgMHgwMywgMHhkMiwgMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgCisweGMxLCAweGZmLCAweDY3LCAweGUwLCAweDM1LCAweDQ4LCAweGMwLCAweDZiLCAweDAwLCAweDA5LCAweDFmLCAweGQzLCAKKzB4MDgsIDB4NzgsIDB4NDAsIDB4MDgsIDB4MWMsIDB4ZDIsIDB4MDAsIDB4MjAsIDB4NDMsIDB4MDAsIDB4Y2MsIDB4NWEsIAorMHgzMSwgMHg0ZSwgMHg5ZSwgMHgxOSwgMHgzMywgMHgyMywgMHg5YiwgMHgwMSwgMHhmMywgMHgxOCwgMHgxYiwgMHg4OCwgCisweDljLCAweDQyLCAweDBlLCAweGQwLCAweGI4LCAweDY5LCAweDM5LCAweDZiLCAweGMwLCAweDQ2LCAweDg4LCAweDYxLCAKKzB4ZjgsIDB4NjgsIDB4MzksIDB4NmIsIDB4YzAsIDB4NDYsIDB4YzgsIDB4NjAsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHgyNywgMHhmOSwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHg3NCwgMHhmOCwgMHg0NiwgMHhlMCwgMHgwMSwgMHgzMCwgCisweDAzLCAweDI4LCAweGUzLCAweGRiLCAweDAyLCAweDIwLCAweDQzLCAweDAwLCAweDVjLCAweDE4LCAweGU0LCAweDg4LCAKKzB4MjIsIDB4NGUsIDB4OWUsIDB4MTksIDB4MzMsIDB4MjMsIDB4OWIsIDB4MDEsIDB4ZjMsIDB4MTgsIDB4MWIsIDB4ODgsIAorMHg5YywgMHg0MiwgMHgwMywgMHhkMSwgMHgwMSwgMHgyMywgMHgwMSwgMHgzOCwgMHhkOCwgMHg0MiwgMHhmMCwgMHhkYywgCisweDAxLCAweDIzLCAweGQ4LCAweDQyLCAweGM0LCAweGQwLCAweDFiLCAweDRlLCAweDBiLCAweDIzLCAweDFiLCAweDAyLCAKKzB4ZjAsIDB4MTgsIDB4NDAsIDB4NjksIDB4MDAsIDB4MjgsIDB4MjQsIDB4ZDAsIDB4N2QsIDB4NjMsIDB4MDAsIDB4OTgsIAorMHg0MCwgMHg4OSwgMHgwMCwgMHgwYywgMHgxZiwgMHhkMiwgMHgwMCwgMHgyNCwgMHgyZCwgMHgyMywgMHg5YiwgMHgwMSwgCisweGYwLCAweDE4LCAweGMwLCAweDZiLCAweDM1LCAweDFjLCAweDAwLCAweDI4LCAweDE3LCAweGQwLCAweGZlLCAweDFkLCAKKzB4MmQsIDB4MzYsIDB4YTIsIDB4MDAsIDB4NTIsIDB4MTksIDB4MmQsIDB4MjMsIDB4OWIsIDB4MDEsIDB4ZDIsIDB4MTgsIAorMHhkMiwgMHg2YiwgMHgzOCwgMHgxYywgMHgzMSwgMHgxYywgMHgwMiwgMHhmMCwgMHg3YiwgMHhmYywgMHgwMSwgMHgyOCwgCisweDBlLCAweGQwLCAweDAxLCAweDM0LCAweGEwLCAweDAwLCAweDQwLCAweDE5LCAweDJkLCAweDIzLCAweDliLCAweDAxLCAKKzB4YzAsIDB4MTgsIDB4YzAsIDB4NmIsIDB4MDAsIDB4MjgsIDB4ZWEsIDB4ZDEsIDB4MDEsIDB4ZTAsIDB4MDEsIDB4MmEsIAorMHgwMiwgMHhkMCwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHgwOCwgMHhmOCwgMHhmOCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweGU4LCAweDFhLCAweDAwLCAweDgwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4ODAsIDB4YjUsIDB4MDcsIDB4MWMsIDB4YjgsIDB4NjksIDB4MzksIDB4NmIsIDB4YzAsIDB4NDYsIDB4ODgsIDB4NjEsIAorMHhmOCwgMHg2OCwgMHgzOSwgMHg2YiwgMHhjMCwgMHg0NiwgMHhjOCwgMHg2MCwgMHg3OCwgMHg2YSwgMHg0MCwgMHg4OSwgCisweDAxLCAweDBjLCAweDBlLCAweGQyLCAweDQwLCAweDBhLCAweDBjLCAweGQzLCAweDM4LCAweDY4LCAweDQwLCAweDA4LCAKKzB4MDIsIDB4ZDMsIDB4MzgsIDB4MWMsIDB4MDIsIDB4ZjAsIDB4MGMsIDB4ZmMsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHhiYiwgMHhmOCwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHgwOCwgMHhmOCwgMHgwMiwgMHhlMCwgMHgzOCwgMHgxYywgCisweGZmLCAweGY3LCAweDMwLCAweGZmLCAweDAxLCAweDIwLCAweDgwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MDEsIDB4MjEsIDB4MDAsIDB4NmIsIDB4NDAsIDB4NmEsIDB4YzAsIDB4NDYsIDB4MDEsIDB4NjAsIDB4NzAsIDB4NDcsIAorMHhiMCwgMHhiNCwgMHhjMSwgMHgxZCwgMHgzOSwgMHgzMSwgMHgwOSwgMHg4YiwgMHg4OSwgMHgwOCwgMHgwOSwgMHgwNCwgCisweDA5LCAweDBjLCAweDg0LCAweDZhLCAweGMyLCAweDFkLCAweDYxLCAweDMyLCAweDAwLCAweDIwLCAweDAwLCAweDI5LCAKKzB4MGMsIDB4ZGQsIDB4ODcsIDB4MDAsIDB4M2QsIDB4MTksIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MmIsIDB4NDMsIAorMHgxYiwgMHg2OCwgMHhjMCwgMHg0NiwgMHhkMywgMHg1MSwgMHgwMSwgMHgzMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgCisweDg4LCAweDQyLCAweGYyLCAweGRiLCAweGIwLCAweGJjLCAweDcwLCAweDQ3LCAweGYwLCAweGI1LCAweGEwLCAweGIwLCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4YzEsIDB4MWQsIDB4MjEsIDB4MzEsIDB4MTksIDB4NDMsIDB4MDksIDB4NjgsIAorMHhjMCwgMHg0NiwgMHgwYiwgMHg5MSwgMHhjMSwgMHgxZCwgMHg1MywgMHgzMSwgMHgxOSwgMHg0MywgMHgxZiwgMHg5MSwgCisweDA5LCAweDY4LCAweDAxLCAweGFmLCAweGZhLCAweDFkLCAweDM5LCAweDMyLCAweDFlLCAweDkyLCAweDE3LCAweGFiLCAKKzB4NTksIDB4ODAsIDB4M2EsIDB4NDksIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MGEsIDB4NmEsIDB4MTMsIDB4NDMsIAorMHhjYywgMHgxZCwgMHgxMSwgMHgzNCwgMHg4OSwgMHg2OSwgMHgwOSwgMHgwMywgMHgwOSwgMHgwYiwgMHgyMiwgMHg2OSwgCisweGU1LCAweDY4LCAweGMwLCAweDQ2LCAweDFkLCAweDk1LCAweGZjLCAweDFkLCAweDM5LCAweDM0LCAweDY0LCAweDhiLCAKKzB4NjQsIDB4MDksIDB4MDUsIDB4MzQsIDB4MjQsIDB4MDYsIDB4MjQsIDB4MGUsIDB4MWMsIDB4OTQsIDB4NTYsIDB4MWEsIAorMHgxYiwgMHg5NiwgMHgxYywgMHg5YywgMHgyZSwgMHg0YSwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MiwgMHgwMSwgMHgyNiwgCisweDFkLCAweDlkLCAweDFhLCAweDY4LCAweDkxLCAweDQyLCAweDAxLCAweGQxLCAweDMyLCAweDFjLCAweDBiLCAweGUwLCAKKzB4OTEsIDB4NDIsIDB4MDMsIDB4ZDksIDB4NTIsIDB4MWIsIDB4MWIsIDB4OWUsIDB4YjUsIDB4MTgsIDB4MDAsIDB4ZTAsIAorMHg1NSwgMHgxYSwgMHgwMSwgMHgyMiwgMHgyNCwgMHgwMSwgMHhhYywgMHg0MiwgCisweDAwLCAweGQzLCAweDAwLCAweDIyLCAweDAxLCAweDJhLCAweGU2LCAweGQxLCAweDkxLCAweDA3LCAweDAxLCAweDQzLCAKKzB4MDksIDB4NjgsIDB4YzAsIDB4NDYsIDB4MzksIDB4NjAsIDB4OTMsIDB4MDcsIDB4MDEsIDB4MWQsIDB4MTksIDB4NDMsIAorMHgwOSwgMHg2OCwgMHhjMCwgMHg0NiwgMHg3OSwgMHg2MCwgMHhjMSwgMHgxZCwgMHgwMSwgMHgzMSwgMHgxOSwgMHg0MywgCisweDA5LCAweDY4LCAweGMwLCAweDQ2LCAweGI5LCAweDYwLCAweDFmLCAweDk5LCAweDA5LCAweDY4LCAweDFlLCAweDlhLCAKKzB4YzAsIDB4NDYsIDB4NTEsIDB4ODMsIDB4YzEsIDB4MWQsIDB4MWQsIDB4MzEsIDB4MTksIDB4NDMsIDB4MDksIDB4NjgsIAorMHhjMCwgMHg0NiwgMHgzOCwgMHg2MywgMHg3OSwgMHg2MiwgMHhjMSwgMHgxZCwgMHgxMSwgMHgzMSwgMHgxOSwgMHg0MywgCisweDA5LCAweDY4LCAweGMwLCAweDQ2LCAweGI5LCAweDYxLCAweGMxLCAweDFkLCAweDA1LCAweDMxLCAweDE5LCAweDQzLCAKKzB4MDksIDB4NjgsIDB4YzAsIDB4NDYsIDB4ZjksIDB4NjAsIDB4YzEsIDB4MWQsIDB4MTcsIDB4MzEsIDB4MTksIDB4NDMsIAorMHgwOSwgMHg2OCwgMHhjMCwgMHg0NiwgMHhmOSwgMHg4MywgMHgwZSwgMHgzMCwgMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgCisweGMwLCAweDQ2LCAweGY4LCAweDgxLCAweDM4LCAweDY4LCAweDQwLCAweDA4LCAweDAyLCAweGQzLCAweDM4LCAweDFjLCAKKzB4MDIsIDB4ZjAsIDB4NWMsIDB4ZmIsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MGIsIDB4ZjgsIDB4MzgsIDB4MWMsIAorMHhmZiwgMHhmNywgMHg1OCwgMHhmZiwgMHgyMCwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweGE4LCAweDAzLCAweDAwLCAweDgwLCAweDU1LCAweDU1LCAweDU1LCAweDU1LCAweGY4LCAweGI1LCAweDA3LCAweDFjLCAKKzB4ZjgsIDB4MWQsIDB4MzksIDB4MzAsIDB4NDEsIDB4OGIsIDB4MzksIDB4NGEsIDB4OTEsIDB4NDIsIDB4MDAsIDB4ZGQsIAorMHg0MiwgMHg4MywgMHg0MiwgMHg4YiwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MiwgMHgwMSwgMHgyMCwgMHgzYSwgMHgxZCwgCisweDA2LCAweGNhLCAweGJiLCAweDZhLCAweDAyLCAweGYwLCAweDBlLCAweGZmLCAweDMzLCAweDRhLCAweGMwLCAweDQ2LCAKKzB4MDAsIDB4OTIsIDB4MzMsIDB4NGUsIDB4MzAsIDB4NmEsIDB4MzMsIDB4NGMsIDB4ZTEsIDB4NmQsIDB4NDEsIDB4MTgsIAorMHgzOCwgMHg2YiwgMHhjMywgMHgxZCwgMHgwNSwgMHgzMywgMHgwMSwgMHgyMCwgMHg3MiwgMHg2YSwgMHgwMiwgMHhmMCwgCisweGZiLCAweGZlLCAweGUwLCAweDZkLCAweDE4LCAweDMwLCAweDAwLCAweDI1LCAweGIxLCAweDZhLCAweDgxLCAweDQyLCAKKzB4MDEsIDB4ZDgsIDB4ZTUsIDB4NjUsIDB4MDAsIDB4ZTAsIDB4ZTAsIDB4NjUsIDB4MmYsIDB4MjMsIDB4OWIsIDB4MDEsIAorMHgyMCwgMHgxYywgMHhlMSwgMHg2ZCwgMHhlNCwgMHgxOCwgMHgyMiwgMHg2OCwgMHg5MiwgMHgwMCwgMHgyNywgMHg0YiwgCisweGMwLCAweDQ2LCAweDk5LCAweDUwLCAweDI2LCAweDQ4LCAweGMxLCAweDZiLCAweDRhLCAweDA4LCAweDA1LCAweGQzLCAKKzB4NDksIDB4MDgsIDB4NDksIDB4MDAsIDB4YzEsIDB4NjMsIDB4MDEsIDB4MjAsIDB4MDEsIDB4ZjAsIDB4ZDYsIDB4ZmYsIAorMHgyMiwgMHg0YSwgMHgxZiwgMHg0OCwgMHhjMSwgMHgxZCwgMHg4OSwgMHgzMSwgMHgwYiwgMHg3OCwgMHgwMCwgMHgyYiwgCisweDAyLCAweGQwLCAweDQ5LCAweDc4LCAweDAwLCAweDI5LCAweDAwLCAweGQxLCAweDFlLCAweDRhLCAweGMwLCAweDQ2LCAKKzB4MDAsIDB4OTIsIDB4MjAsIDB4NjgsIDB4ODAsIDB4MDAsIDB4MTksIDB4NGIsIDB4YzMsIDB4MTgsIDB4MDUsIDB4Y2UsIAorMHhjMSwgMHgxZCwgMHgxMSwgMHgzMSwgMHgwMSwgMHgyMCwgMHgwMiwgMHhmMCwgMHhjNywgMHhmZSwgMHgxNCwgMHg0OCwgCisweDIxLCAweDY4LCAweDAxLCAweDMxLCAweDIxLCAweDYwLCAweDE3LCAweDI5LCAweDAwLCAweGQzLCAweDI1LCAweDYwLCAKKzB4MzksIDB4NmIsIDB4YzAsIDB4NDYsIDB4MGQsIDB4NjUsIDB4NzksIDB4NmEsIDB4M2EsIDB4NmIsIDB4YzAsIDB4NDYsIAorMHg1MSwgMHg2MiwgMHgzMywgMHgyMywgMHg5YiwgMHgwMSwgMHhjMCwgMHgxOCwgMHg4MSwgMHg2OCwgMHgwMCwgMHgyOSwgCisweDAzLCAweGQxLCAweDM5LCAweDZiLCAweGMwLCAweDQ2LCAweDgxLCAweDYwLCAweDA0LCAweGUwLCAweDM5LCAweDZiLCAKKzB4YzIsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MTEsIDB4NjUsIDB4MzksIDB4NmIsIDB4YzAsIDB4NDYsIDB4YzEsIDB4NjAsIAorMHhmOCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHhlYSwgMHgwNSwgMHgwMCwgMHgwMCwgCisweDE4LCAweDAwLCAweDE0LCAweDAyLCAweDdjLCAweDI5LCAweDAwLCAweDgwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4NDQsIDB4ODIsIDB4MjAsIDB4NDAsIDB4ZTgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDIsIAorMHgwNCwgMHgwMCwgMHgwMCwgMHgwMywgMHhmMCwgMHhiNSwgMHgxMSwgMHg0ZSwgMHhmZiwgMHgyNSwgMHgwMSwgMHgzNSwgCisweDEwLCAweDRmLCAweGMwLCAweDQ2LCAweDM1LCAweDYwLCAweDc4LCAweDY5LCAweDAxLCAweDM4LCAweDc4LCAweDYxLCAKKzB4YmMsIDB4NjgsIDB4MDAsIDB4MmMsIDB4MTAsIDB4ZDAsIDB4MjAsIDB4NmQsIDB4YzAsIDB4NDYsIDB4YjgsIDB4NjAsIAorMHgyMCwgMHgxYywgMHgwMCwgMHhmMCwgMHgyMSwgMHhmOCwgMHgyMCwgMHgxYywgMHgwMCwgMHhmMCwgMHgwNCwgMHhmYSwgCisweDA4LCAweDQ4LCAweDgwLCAweDZhLCAweDAwLCAweDBjLCAweDAwLCAweDA3LCAweGU5LCAweGQxLCAweGYwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDUsIDB4NDgsIDB4YzEsIDB4NzksIDB4MDEsIDB4MzEsIDB4YzEsIDB4NzEsIAorMHhmNywgMHhlNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHgyOCwgMHgxYiwgMHgwMCwgMHg4MCwgCisweDAwLCAweDAwLCAweDEwLCAweDQwLCAweGEwLCAweDgyLCAweDIwLCAweDQwLCAKKzB4MDEsIDB4MjAsIDB4ODAsIDB4MDMsIDB4MDEsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIDB4NzAsIDB4NDcsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHg5MCwgMHhiNSwgMHgwNywgMHgxYywgMHgzOCwgMHg2OCwgMHhjMCwgMHgwOCwgCisweDA5LCAweGQzLCAweDFkLCAweDQ4LCAweDAxLCAweDZhLCAweDAxLCAweDM5LCAweDAxLCAweDYyLCAweDIwLCAweDMwLCAKKzB4MDAsIDB4NzksIDB4MDAsIDB4MjgsIDB4MDEsIDB4ZDAsIDB4ZmUsIDB4ZjcsIDB4ZTksIDB4ZmQsIDB4MDEsIDB4MjMsIAorMHg5YiwgMHgwNywgMHhmOCwgMHgxZCwgMHgxZCwgMHgzMCwgMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgMHgxNiwgMHg0YywgCisweDYxLCAweDZhLCAweDgxLCAweDQyLCAweDIxLCAweGQxLCAweDAxLCAweDFjLCAweDE5LCAweDQzLCAweDA5LCAweDY4LCAKKzB4MDksIDB4MDQsIDB4MDksIDB4MGMsIDB4MDEsIDB4MjksIDB4MWEsIDB4ZDEsIDB4MDAsIDB4ZjAsIDB4MjIsIDB4ZjgsIAorMHg2MCwgMHg2MiwgMHg2MCwgMHg2YSwgMHgyMSwgMHg2YSwgMHg4OCwgMHg0MiwgMHgwNSwgMHhkMCwgMHgwMSwgMHgyMSwgCisweDg5LCAweDA3LCAweDAxLCAweDQzLCAweDA5LCAweDY4LCAweDA5LCAweDA0LCAweGYyLCAweGQwLCAweDUxLCAweDIxLCAKKzB4ODksIDB4MDMsIDB4NjIsIDB4NmEsIDB4MjMsIDB4NmIsIDB4OWEsIDB4NDIsIDB4MDIsIDB4ZDEsIDB4NjAsIDB4NmIsIAorMHhhMiwgMHg2YiwgMHg4MCwgMHgxYSwgMHgwNCwgMHgzOCwgMHhjOCwgMHg2MCwgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDIwLCAweDc5LCAweDZhLCAweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweGY3LCAweGU3LCAKKzB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIDB4ZTgsIDB4MWEsIDB4MDAsIDB4ODAsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIAorMHhjMSwgMHgxZCwgMHgwMSwgMHgzMSwgMHgxOSwgMHg0MywgMHgwOSwgMHg2OCwgMHgwOSwgMHgwNCwgMHgwOSwgMHgwYywgCisweDA4LCAweDE4LCAweDBkLCAweDMwLCAweDgxLCAweDA3LCAweDAyLCAweGQwLCAweDgwLCAweDA4LCAweDgwLCAweDAwLCAKKzB4MDQsIDB4MzAsIDB4MDQsIDB4NDksIDB4OGEsIDB4NmIsIDB4MTIsIDB4MTgsIDB4NGIsIDB4NmIsIDB4OWEsIDB4NDIsIAorMHgwMCwgMHhkOSwgMHgwOCwgMHg2YiwgMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHhlOCwgMHgxYSwgMHgwMCwgMHg4MCwgCisweDAwLCAweGI1LCAweDA0LCAweDQ4LCAweGMwLCAweDY4LCAweDEwLCAweDI4LCAweDAxLCAweGQzLCAweDAwLCAweGYwLCAKKzB4MDUsIDB4ZjgsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4ZTgsIDB4MWEsIDB4MDAsIDB4ODAsIAorMHg4OCwgMHhiNSwgMHgwYywgMHg0ZiwgMHgzOCwgMHg3OSwgMHgwMCwgMHgyOCwgMHgxMSwgMHhkMSwgMHgwYiwgMHg0OSwgCisweDEwLCAweDIwLCAweDAyLCAweGYwLCAweGY1LCAweGZkLCAweDAwLCAweDI4LCAweDBiLCAweGQwLCAweDAxLCAweDIwLCAKKzB4MzgsIDB4NzEsIDB4MDgsIDB4NGEsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTIsIDB4MDcsIDB4NDgsIDB4NDIsIDB4NjgsIAorMHgwNywgMHg0YiwgMHgwMSwgMHg2OCwgMHgwMCwgMHgyMCwgMHgwMiwgMHhmMCwgMHhkZiwgMHhmZCwgMHg4OCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweGY4LCAweDFhLCAweDAwLCAweDgwLCAweGY1LCAweDJjLCAweGZmLCAweGZmLCAKKzB4MTAsIDB4MDAsIDB4MzUsIDB4MDIsIDB4N2MsIDB4MjksIDB4MDAsIDB4ODAsIDB4NDQsIDB4ODAsIDB4MjAsIDB4NDAsIAorMHg5MCwgMHhiNSwgMHgwMSwgMHgyMCwgMHg0MCwgMHgwMiwgMHgxMCwgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgCisweDBmLCAweDRmLCAweDEwLCAweDIxLCAweGY4LCAweDFkLCAweDNkLCAweDMwLCAweDAyLCAweGYwLCAweDRjLCAweGZjLCAKKzB4MTksIDB4MjMsIDB4ZGIsIDB4MDEsIDB4ZmMsIDB4MTgsIDB4ZTAsIDB4NjgsIDB4MDAsIDB4MjgsIDB4MDEsIDB4ZDAsIAorMHgwMCwgMHhmMCwgMHgxNCwgMHhmOCwgMHgwMCwgMHgyMCwgMHhjOSwgMHgyMywgMHgxYiwgMHgwMSwgMHhmOSwgMHgxOCwgCisweDA4LCAweDcxLCAweGUwLCAweDY4LCAweDEwLCAweDI4LCAweDA0LCAweGQzLCAweDAxLCAweDIwLCAweGJiLCAweDIzLCAKKzB4MWIsIDB4MDEsIDB4ZjksIDB4MTgsIDB4NDgsIDB4NzMsIDB4OTAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHhmOCwgMHhiNSwgMHgzNywgMHg0OCwgCisweDE5LCAweDIzLCAweGRiLCAweDAxLCAweGMxLCAweDE4LCAweGM5LCAweDY4LCAweDM1LCAweDRkLCAweDEwLCAweDI5LCAKKzB4MDAsIDB4ZDksIDB4MTAsIDB4MjEsIDB4NjksIDB4NjIsIDB4MzIsIDB4NDgsIDB4YzEsIDB4NmMsIDB4MDAsIDB4NmUsIAorMHg4MSwgMHg0MiwgMHgwNywgMHhkOSwgMHgwOCwgMHgxYSwgMHgwNywgMHgwOSwgMHgwMCwgMHgyNCwgMHg2OCwgMHg2YSwgCisweGI4LCAweDQyLCAweDEyLCAweGQyLCAweDA3LCAweDFjLCAweDEwLCAweGUwLCAweDgxLCAweDQyLCAweDJhLCAweGQyLCAKKzB4MmMsIDB4NGEsIDB4NTIsIDB4NmIsIDB4MTAsIDB4MWEsIDB4MDcsIDB4MDksIDB4NjgsIDB4NmEsIDB4YjgsIDB4NDIsIAorMHgwNSwgMHhkOSwgMHgwYywgMHgwOSwgMHgzOSwgMHgxOSwgMHg4OCwgMHg0MiwgMHgwMywgMHhkMiwgMHhjNCwgMHgxYiwgCisweDAxLCAweGUwLCAweDAwLCAweDI0LCAweDA3LCAweDFjLCAweDNlLCAweDE5LCAweDMwLCAweDAxLCAweDI1LCAweDQ5LCAKKzB4MDIsIDB4ZjAsIDB4ODQsIDB4ZmQsIDB4MDAsIDB4MjgsIDB4M2QsIDB4ZDAsIDB4MjMsIDB4NDgsIDB4MDAsIDB4MmMsIAorMHgxYSwgMHhkMSwgMHgxZSwgMHg0OSwgMHgzYSwgMHgwMSwgMHg2ZiwgMHg2MiwgMHgwOSwgMHg2ZSwgMHg4YywgMHgxOCwgCisweDFkLCAweDRkLCAweDZiLCAweDZiLCAweGEzLCAweDQyLCAweDAwLCAweGQ4LCAweGU0LCAweDFhLCAweDFlLCAweDRiLCAKKzB4MWEsIDB4NDMsIDB4MDAsIDB4OTIsIDB4ZWEsIDB4NmEsIDB4NTEsIDB4MTgsIAorMHgyYSwgMHg2YiwgMHgwMywgMHgxYywgMHgyMCwgMHhlMCwgMHgxYiwgMHg0OCwgMHgwMSwgMHg2YiwgMHgwMSwgMHgzMSwgCisweDAxLCAweDYzLCAweDAwLCAweDIwLCAweDY4LCAweDYyLCAweGY4LCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MTAsIDB4NDksIDB4MjQsIDB4MDEsIDB4M2YsIDB4MDEsIDB4MTEsIDB4MjIsIDB4NTIsIDB4MDUsIDB4M2EsIDB4NDMsIAorMHg2ZSwgMHg2MiwgMHgwMCwgMHg5MiwgMHgwZSwgMHg0ZCwgMHhlYSwgMHg2YSwgMHgwOSwgMHg2ZSwgMHg1MSwgMHgxOCwgCisweDAzLCAweDFjLCAweDA2LCAweDFjLCAweDAwLCAweDIwLCAweDJhLCAweDZiLCAweDAyLCAweGYwLCAweDRhLCAweGZkLCAKKzB4MGMsIDB4NGEsIDB4MjIsIDB4NDMsIDB4MDAsIDB4OTIsIDB4YmIsIDB4MTksIDB4ZTksIDB4NmEsIDB4MmEsIDB4NmIsIAorMHgwMCwgMHgyMCwgMHgwMiwgMHhmMCwgMHg0MSwgMHhmZCwgMHgwMywgMHg0OCwgMHhjMCwgMHg0NiwgMHgwNCwgMHg2NiwgCisweDAwLCAweGYwLCAweDEwLCAweGY4LCAweDAxLCAweDIwLCAweGRhLCAweGU3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4MjgsIDB4MWIsIDB4MDAsIDB4ODAsIDB4N2MsIDB4MjksIDB4MDAsIDB4ODAsIDB4NWQsIDB4MmUsIDB4ZmYsIDB4ZmYsIAorMHg0NCwgMHg4MCwgMHgyMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgzNiwgMHgwMiwgMHhhMCwgMHg4MiwgMHgyMCwgMHg0MCwgCisweDA0LCAweDQ4LCAweDAxLCAweDZlLCAweDA0LCAweDRhLCAweDgwLCAweDMwLCAweGQxLCAweDYwLCAweDAyLCAweDIzLCAKKzB4YzEsIDB4NmIsIDB4MTksIDB4NDMsIDB4YzEsIDB4NjMsIDB4NzAsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHg5MCwgMHhlZSwgMHgyMCwgMHg0MCwgMHhmMCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgwMSwgMHgyMCwgMHg4MCwgMHgwMiwgCisweDFjLCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweDAwLCAweDI3LCAweDFiLCAweDRlLCAweDMzLCAweDIzLCAKKzB4OWIsIDB4MDEsIDB4ZjUsIDB4MTgsIDB4NjgsIDB4NmEsIDB4MDAsIDB4MjgsIDB4MWQsIDB4ZDksIDB4MTksIDB4NGMsIAorMHg2OCwgMHg0NiwgMHgxMCwgMHgyMSwgMHgwMiwgMHhmMCwgMHg5MCwgMHhmYiwgMHg2OCwgMHg0NiwgMHgwMCwgMHhmMCwgCisweDMzLCAweGY4LCAweDAwLCAweDI4LCAweDA0LCAweGQwLCAweDE1LCAweDQ5LCAweDQ4LCAweDY5LCAweDAxLCAweDMwLCAKKzB4NDgsIDB4NjEsIDB4MGEsIDB4ZTAsIDB4MTMsIDB4NDksIDB4NjAsIDB4N2IsIDB4MDEsIDB4MzAsIDB4NjAsIDB4NzMsIAorMHg4OCwgMHg3OSwgMHgwMSwgMHgzMCwgMHg4OCwgMHg3MSwgMHgxMSwgMHg0OCwgMHgwMCwgMHg2OCwgMHgwMiwgMHhmMCwgCisweDY1LCAweGY5LCAweDY4LCAweDZhLCAweDAxLCAweDM3LCAweGI4LCAweDQyLCAweGUyLCAweGQ4LCAweGJiLCAweDIzLCAKKzB4MWIsIDB4MDEsIDB4ZjAsIDB4MTgsIDB4ODEsIDB4N2IsIDB4MDAsIDB4MjksIDB4MDMsIDB4ZDAsIDB4MDAsIDB4MjEsIAorMHg4MSwgMHg3MywgMHhmZiwgMHhmNywgMHgwNSwgMHhmYiwgMHhmZiwgMHhmNywgMHhlMywgMHhmZSwgMHgwNCwgMHhiMCwgCisweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGIwLCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4YjAsIDB4ODIsIDB4MjAsIDB4NDAsIDB4MDgsIDB4ODMsIDB4MjAsIDB4NDAsIAorMHhhMCwgMHg4MiwgMHgyMCwgMHg0MCwgMHg1OCwgMHgwNCwgMHgwMCwgMHg4MCwgMHg5MCwgMHhiNCwgMHgxNywgMHg0ZiwgCisweDE5LCAweDIzLCAweGRiLCAweDAxLCAweGY5LCAweDE4LCAweDAwLCAweDIyLCAweGNiLCAweDY4LCAweDAwLCAweDJiLCAKKzB4MjMsIDB4ZDAsIDB4MDEsIDB4M2IsIDB4Y2IsIDB4NjAsIDB4MzMsIDB4MjMsIDB4OWIsIDB4MDEsIDB4ZmYsIDB4MTgsIAorMHhiYiwgMHg2OSwgMHgxYywgMHg2ZCwgMHhjMCwgMHg0NiwgMHhiYywgMHg2MSwgMHgwNCwgMHg2OCwgMHhjMCwgMHg0NiwgCisweDVjLCAweDYwLCAweDQ0LCAweDY4LCAweGMwLCAweDQ2LCAweDljLCAweDYwLCAweDg0LCAweDY4LCAweGMwLCAweDQ2LCAKKzB4MWMsIDB4NjEsIDB4YzAsIDB4NjgsIDB4YzAsIDB4NDYsIDB4NTgsIDB4NjEsIDB4MWEsIDB4NjUsIDB4MDgsIDB4NjksIAorMHg0MiwgMHgxYywgMHgwYSwgMHg2MSwgMHgwMCwgMHgyOCwgMHgwMywgMHhkMCwgMHgzOCwgMHg2YSwgMHhjMCwgMHg0NiwgCisweDAzLCAweDY1LCAweDAwLCAweGUwLCAweGZiLCAweDYxLCAweDNiLCAweDYyLCAweDE4LCAweDFjLCAweDkwLCAweGJjLCAKKzB4NzAsIDB4NDcsIDB4MTAsIDB4MWMsIDB4ZmIsIDB4ZTcsIDB4MDAsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHgwYSwgMHg0YSwgMHgzMywgMHgyMywgMHg5YiwgMHgwMSwgMHhkMSwgMHgxOCwgMHhjOCwgMHg2OSwgMHgxOSwgMHgyMywgCisweGRiLCAweDAxLCAweGQyLCAweDE4LCAweDEzLCAweDY5LCAweDAwLCAweDJiLCAweDA2LCAweGQwLCAweDAxLCAweDNiLCAKKzB4MTMsIDB4NjEsIDB4Y2EsIDB4NjksIDB4MTIsIDB4NmQsIDB4YzAsIDB4NDYsIDB4Y2EsIDB4NjEsIDB4NzAsIDB4NDcsIAorMHgwMCwgMHgyMSwgMHgxMSwgMHg2MSwgMHhmYiwgMHhlNywgMHgwMCwgMHgwMCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweDA2LCAweDRhLCAweDExLCAweDY5LCAweDRiLCAweDFjLCAweDEzLCAweDYxLCAweDQwLCAweDMyLCAweDAwLCAweDI5LCAKKzB4MDEsIDB4ZDAsIDB4ZDEsIDB4NjksIDB4MDAsIDB4ZTAsIDB4MDAsIDB4MjEsIDB4MDEsIDB4NjUsIDB4ZDAsIDB4NjEsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHhlOCwgMHgxYSwgMHgwMCwgMHg4MCwgMHgwNiwgMHg0YSwgMHhkMSwgMHg2OCwgCisweDRiLCAweDFjLCAweGQzLCAweDYwLCAweDQwLCAweDMyLCAweDAwLCAweDI5LCAweDAxLCAweGQwLCAweDkxLCAweDY5LCAKKzB4MDAsIDB4ZTAsIDB4MDAsIDB4MjEsIDB4MDEsIDB4NjUsIDB4OTAsIDB4NjEsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHhlOCwgMHgxYSwgMHgwMCwgMHg4MCwgMHg5MCwgMHhiNCwgMHgwMCwgMHgyMSwgCisweDBmLCAweDRhLCAweDk3LCAweDg5LCAweDkyLCAweDZhLCAweDRiLCAweDAwLCAweDFiLCAweDE4LCAweDliLCAweDhhLCAKKzB4MDAsIDB4MmIsIDB4MTIsIDB4ZDAsIDB4YmIsIDB4NDIsIDB4MTAsIDB4ZGMsIDB4MWMsIDB4MWMsIDB4NTgsIDB4MjMsIAorMHg2MywgMHg0MywgMHhkMywgMHgxOCwgMHhkYywgMHgxZiwgMHg0OSwgMHgzYywgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgCisweDIzLCAweDQzLCAweDFiLCAweDY4LCAweDFiLCAweDA2LCAweDFiLCAweDBlLCAweDAzLCAweDJiLCAweDAyLCAweGQwLCAKKzB4MDAsIDB4MjAsIDB4OTAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4MDEsIDB4MzEsIDB4MDQsIDB4MjksIDB4ZTQsIDB4ZDMsIAorMHgwMSwgMHgyMCwgMHhmOCwgMHhlNywgMHg0YywgMHgyYSwgMHgwMCwgMHg4MCwgMHhmNywgMHhiNSwgMHg4NiwgMHhiMCwgCisweDNkLCAweDRhLCAweDA3LCAweDFjLCAweGQxLCAweDY5LCAweDhmLCAweDQwLCAweDAzLCAweDFjLCAweDE0LCAweDZhLCAKKzB4ZTMsIDB4NDAsIDB4NWYsIDB4NDAsIDB4MDcsIDB4OWUsIDB4OGUsIDB4NDAsIDB4NzcsIDB4NDAsIDB4Y2YsIDB4NDAsIAorMHg5NCwgMHg2OSwgMHhjMCwgMHg0NiwgMHgwNSwgMHg5NCwgMHgwMywgMHgxYywgMHhhMywgMHg0MCwgMHgwMCwgMHgyNSwgCisweDE0LCAweDY5LCAweGMwLCAweDQ2LCAweDA0LCAweDk0LCAweDAwLCAweDJjLCAweDVkLCAweGQ5LCAweDFjLCAweDFjLCAKKzB4MzIsIDB4NGUsIDB4MjYsIDB4NDMsIDB4OTQsIDB4NjksIDB4ZTYsIDB4NDAsIDB4MzMsIDB4MWMsIDB4MDMsIDB4OTYsIAorMHg1MywgMHg2YSwgMHhjMCwgMHg0NiwgMHgwMiwgMHg5MywgMHhkMiwgMHg2YSwgMHhjMCwgMHg0NiwgMHgwMSwgMHg5MiwgCisweGJiLCAweDAwLCAweDAyLCAweDlhLCAweGQyLCAweDU4LCAweDEzLCAweDFjLCAweDA1LCAweDljLCAweGUzLCAweDQwLCAKKzB4MDMsIDB4OWMsIDB4YTMsIDB4NDIsIDB4M2UsIDB4ZDEsIDB4OGEsIDB4NDAsIDB4Y2EsIDB4NDAsIDB4MTQsIDB4MWMsIAorMHg2MywgMHgwMCwgMHgxYiwgMHgxOSwgMHg1YiwgMHgwMSwgMHgwMSwgMHg5YSwgMHhkMiwgMHgxOCwgMHgwMSwgMHgyMywgCisweDliLCAweDA3LCAweGQ2LCAweDFkLCAweDAxLCAweDM2LCAweDMzLCAweDQzLCAweDFiLCAweDY4LCAweDFiLCAweDA2LCAKKzB4MWIsIDB4MGUsIDB4MDMsIDB4MmIsIDB4MmMsIDB4ZDEsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZDYsIDB4MWQsIAorMHg1MSwgMHgzNiwgMHgzMywgMHg0MywgMHgxYiwgMHg2OCwgMHgwNywgMHg5ZSwgMHgxZSwgMHg0MCwgMHgwMCwgMHg5NiwgCisweDAxLCAweDIzLCAweDliLCAweDA3LCAweGQ2LCAweDFkLCAweDQ5LCAweDM2LCAweDMzLCAweDQzLCAweDFiLCAweDY4LCAKKzB4ODMsIDB4NDIsIDB4MWIsIDB4ZDEsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4ZDYsIDB4MWQsIDB4NGQsIDB4MzYsIAorMHgzMywgMHg0MywgMHgxYiwgMHg2OCwgMHgwMCwgMHg5ZSwgMHhiMywgMHg0MiwgMHgxMiwgMHhkMSwgMHgwMSwgMHgyMywgCisweDliLCAweDA3LCAweDFhLCAweDQzLCAweDEyLCAweDY4LCAweDEyLCAweDA0LCAweDEyLCAweDBjLCAweDA4LCAweDliLCAKKzB4MzIsIDB4MmIsIDB4MDQsIDB4ZDEsIDB4MDIsIDB4MmEsIDB4MDcsIDB4ZDEsIDB4MjAsIDB4MDQsIDB4MDAsIDB4MTQsIAorMHgwZiwgMHhlMCwgMHgwOCwgMHg5YiwgMHgzMywgMHgyYiwgMHgwMSwgMHhkMSwgMHgwMSwgMHgyYSwgMHhmNywgMHhkMCwgCisweDA0LCAweDlhLCAweDAxLCAweDM3LCAweDk3LCAweDQyLCAweDAwLCAweGQzLCAweDAwLCAweDI3LCAweDA0LCAweDlhLCAKKzB4MDEsIDB4MzUsIDB4YWEsIDB4NDIsIDB4YWUsIDB4ZDgsIDB4MDAsIDB4MjAsIDB4YzAsIDB4NDMsIDB4MDksIDB4YjAsIAorMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHg0YywgMHgyYSwgMHgwMCwgMHg4MCwgCisweDAwLCAweDAwLCAweDAwLCAweDgwLCAweGYwLCAweGI1LCAweDI3LCAweDRkLCAweDY4LCAweDY5LCAweDAwLCAweDI4LCAKKzB4MDYsIDB4ZDAsIDB4MjYsIDB4NDgsIDB4MDAsIDB4NjgsIDB4MDIsIDB4ZjAsIDB4MmIsIDB4ZjgsIDB4ZjAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgyMywgMHg0YywgMHgwMCwgMHgyNiwgMHhhMCwgMHg2OCwgMHgyMywgMHg0ZiwgCisweDAwLCAweDI4LCAweDE2LCAweGQwLCAweDBmLCAweGUwLCAweDI4LCAweDZhLCAweDAyLCAweDI4LCAweDAyLCAweGQzLCAKKzB4MDEsIDB4MjAsIDB4MzgsIDB4NzEsIDB4MGYsIDB4ZTAsIDB4YTYsIDB4NjAsIDB4ZmQsIDB4ZjcsIDB4ZGUsIDB4ZmUsIAorMHgwMCwgMHgyOCwgMHhlYSwgMHhkMSwgMHgyOCwgMHg2YSwgMHgwMiwgMHgyOCwgMHgwMSwgMHhkMywgMHgwMSwgMHgyMCwgCisweDM4LCAweDcxLCAweGU4LCAweDY4LCAweDAwLCAweDI4LCAweDAyLCAweGQwLCAweDM4LCAweDc5LCAweDAwLCAweDI4LCAKKzB4ZTksIDB4ZDAsIDB4NjgsIDB4NjgsIDB4MDAsIDB4MjgsIDB4MWIsIDB4ZDAsIDB4MDEsIDB4MjAsIDB4YTAsIDB4NjAsIAorMHhmZSwgMHhmNywgMHhiYywgMHhmYiwgMHgwMCwgMHgyOCwgMHhkNiwgMHhkMSwgMHg2OCwgMHg2OCwgMHgwMCwgMHgyOCwgCisweGY2LCAweGQxLCAweDExLCAweGUwLCAweDAwLCAweDI4LCAweGQwLCAweGQxLCAweDI4LCAweDZhLCAweDAyLCAweDI4LCAKKzB4MDIsIDB4ZDMsIDB4MDEsIDB4MjAsIDB4MzgsIDB4NzEsIDB4Y2EsIDB4ZTcsIDB4YTYsIDB4NjAsIDB4ZmQsIDB4ZjcsIAorMHhiOSwgMHhmZSwgMHgwMCwgMHgyOCwgMHhjNSwgMHhkMSwgMHgyOCwgMHg2YSwgMHgwMiwgMHgyOCwgMHgwMSwgMHhkMywgCisweDAxLCAweDIwLCAweDM4LCAweDcxLCAweGU4LCAweDY4LCAweDAwLCAweDI4LCAweGJkLCAweGQwLCAweDM4LCAweDc5LCAKKzB4MDAsIDB4MjgsIDB4ZTcsIDB4ZDAsIDB4YjksIDB4ZTcsIDB4MDAsIDB4MDAsIDB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIAorMHg1YywgMHgwNCwgMHgwMCwgMHg4MCwgMHg0YywgMHgyYSwgMHgwMCwgMHg4MCwgMHg4YywgMHgwNiwgMHgwMCwgMHg4MCwgCisweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweDcwLCAweDQ3LCAweDAwLCAweDAwLCAKKzB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4OTAsIDB4YjUsIDB4NDAsIDB4MjAsIDB4MWQsIDB4NDksIDB4YzAsIDB4NDYsIAorMHgwOCwgMHg2MCwgMHgwMSwgMHhmMCwgMHg5ZCwgMHhmYywgMHgwMywgMHgyMywgMHgxYiwgMHgwNywgMHg0MSwgMHg2OCwgCisweDE5LCAweDQwLCAweDBjLCAweDBmLCAweDYxLCAweDAxLCAweDA5LCAweDFiLCAweDg5LCAweDAwLCAweDE4LCAweDRhLCAKKzB4OGYsIDB4MTgsIDB4MDEsIDB4MjEsIDB4MzksIDB4ODAsIDB4ODEsIDB4NmEsIDB4YzAsIDB4NDYsIDB4NzksIDB4NjUsIAorMHg0MSwgMHg2YSwgMHhjMCwgMHg0NiwgMHg3OSwgMHg2NywgMHhiOSwgMHg2YywgMHhmYSwgMHg2YywgMHg4OSwgMHgxOCwgCisweGI5LCAweDY0LCAweDAwLCAweDIxLCAweGY5LCAweDY0LCAweGJhLCAweDZiLCAweDNiLCAweDZkLCAweGQyLCAweDE4LCAKKzB4YmEsIDB4NjMsIDB4MzksIDB4NjUsIDB4NDIsIDB4NmEsIDB4MjAsIDB4MzIsIDB4NTEsIDB4NzEsIDB4NzksIDB4NmQsIAorMHg3YSwgMHg2ZiwgMHhkMiwgMHg2ZCwgMHhjMCwgMHg0NiwgMHgxMSwgMHg2MCwgMHhmYywgMHhmNywgMHhjYSwgMHhmZiwgCisweDIwLCAweDAxLCAweDA5LCAweDQ5LCAweDQwLCAweDE4LCAweDE5LCAweDIzLCAweGRiLCAweDAxLCAweGMwLCAweDE4LCAKKzB4NDEsIDB4NmIsIDB4MDEsIDB4MzksIDB4NDEsIDB4NjMsIDB4NzgsIDB4NmYsIDB4MDEsIDB4ZjAsIDB4YzYsIDB4ZmIsIAorMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgCisweDVjLCAweDJiLCAweDAwLCAweDgwLCAweGEwLCAweDFjLCAweDAwLCAweDgwLCAweGYwLCAweGI1LCAweDQwLCAweDIwLCAKKzB4MTIsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIDB4MDEsIDB4ZjAsIDB4NTksIDB4ZmMsIDB4MDcsIDB4MWMsIAorMHg0MCwgMHg2OCwgMHgwMywgMHgyMywgMHgxYiwgMHgwNywgMHgxOCwgMHg0MCwgMHgwNiwgMHgwZiwgMHg3MCwgMHgwMSwgCisweDgwLCAweDFiLCAweDgwLCAweDAwLCAweDBjLCAweDQ5LCAweDQ0LCAweDE4LCAweGI4LCAweDZhLCAweGMwLCAweDQ2LCAKKzB4NjAsIDB4NjUsIDB4NzgsIDB4NmEsIDB4YzAsIDB4NDYsIDB4NjAsIDB4NjcsIDB4ODAsIDB4NmYsIDB4MDUsIDB4MWQsIAorMHhlNSwgMHg2MywgMHhiOSwgMHg2OSwgMHgyOCwgMHgxYywgMHgwMiwgMHhmMCwgMHg4OSwgMHhmOSwgMHgzOCwgMHgxYywgCisweDIxLCAweDFjLCAweDMyLCAweDFjLCAweDJiLCAweDFjLCAweDAwLCAweGYwLCAweDIwLCAweGY4LCAweGYwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjAsIDB4NWMsIDB4MmIsIDB4MDAsIDB4ODAsIAorMHhmMCwgMHhiNSwgMHg0YiwgMHg2ZiwgMHg5YiwgMHg2ZiwgMHgxZiwgMHgxZCwgMHhjZiwgMHg2MywgMHgwNSwgMHg2OCwgCisweDAwLCAweDIzLCAweDg0LCAweDY5LCAweGE0LCAweDA4LCAweDA4LCAweGQwLCAweDljLCAweDAwLCAweDJlLCAweDU5LCAKKzB4YzAsIDB4NDYsIDB4M2UsIDB4NTEsIDB4ODQsIDB4NjksIDB4YTQsIDB4MDgsIDB4MDEsIDB4MzMsIDB4OWMsIDB4NDIsIAorMHhmNiwgMHhkOCwgMHgzYiwgMHgxYywgMHgwMCwgMHhmMCwgMHgwMywgMHhmOCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweGZmLCAweGI1LCAweDgxLCAweGIwLCAweDA0LCAweDFjLCAweDFkLCAweDFjLCAweDBmLCAweDFjLCAKKzB4NDYsIDB4NDgsIDB4MDEsIDB4NjksIDB4MDEsIDB4MzEsIDB4MDEsIDB4NjEsIDB4ZjksIDB4MWQsIDB4NTEsIDB4MzEsIAorMHhiZCwgMHg2NSwgMHgwMCwgMHg5MSwgMHgyMCwgMHgxYywgMHhmZCwgMHhmNywgMHg1ZCwgMHhmYywgMHhmOCwgMHg2ZCwgCisweDQwLCAweDA5LCAweDM2LCAweGQyLCAweGI4LCAweDZkLCAweDA2LCAweDdiLCAweDQzLCAweDdiLCAweDFiLCAweDAyLCAKKzB4MWUsIDB4NDMsIDB4MTcsIDB4MjEsIDB4NDksIDB4MDIsIDB4MDEsIDB4NzMsIDB4MGIsIDB4MGEsIDB4NDMsIDB4NzMsIAorMHgwMCwgMHg5OSwgMHgyMCwgMHgxYywgMHhmZCwgMHhmNywgMHg0YywgMHhmYywgMHhiOCwgMHg2ZCwgMHhjMCwgMHg0NiwgCisweDA2LCAweDczLCAweDMzLCAweDBhLCAweDQzLCAweDczLCAweGY4LCAweDZkLCAweDQwLCAweDA5LCAweDIwLCAweGQyLCAKKzB4NjAsIDB4NjgsIDB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIDB4MDMsIDB4OTgsIDB4MDEsIDB4ZjAsIDB4Y2MsIDB4ZmMsIAorMHg2MCwgMHg2OCwgMHgzMiwgMHg0YiwgMHgxOCwgMHg0MywgMHg2MCwgMHg2MCwgMHgyMCwgMHgxYywgMHgwMSwgMHhmMCwgCisweDM1LCAweGZkLCAweDAwLCAweDI1LCAweDdkLCAweDYwLCAweGJkLCAweDYwLCAweDNkLCAweDY0LCAweDdkLCAweDY0LCAKKzB4MjAsIDB4MWMsIDB4ZmMsIDB4ZjcsIDB4MzEsIDB4ZmYsIDB4MzgsIDB4ODgsIDB4NDAsIDB4MjMsIDB4MTgsIDB4NDMsIAorMHgzOCwgMHg4MCwgMHg3ZCwgMHg2MiwgMHgyOSwgMHg0OCwgMHhjMCwgMHg0NiwgMHhiOCwgMHg2MiwgMHgzOCwgMHgxYywgCisweDAwLCAweGYwLCAweGEwLCAweGZiLCAweDQ0LCAweGUwLCAweDIwLCAweDY4LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAKKzB4MDgsIDB4MzgsIDB4MTgsIDB4NDMsIDB4MDAsIDB4NjgsIDB4YzAsIDB4NDYsIDB4NzgsIDB4NjQsIDB4NjAsIDB4NjgsIAorMHgwMiwgMHgwNCwgMHgxMiwgMHgwYywgMHg3OCwgMHg2ZSwgMHgwMSwgMHgyNiwgMHhjMSwgMHgxZCwgMHgwZCwgMHgzMSwgCisweDhhLCAweDQyLCAweDAyLCAweGQyLCAweDNhLCAweDY0LCAweDA4LCAweDFjLCAweDBlLCAweGUwLCAweDQxLCAweDE5LCAKKzB4ODksIDB4ODksIDB4ZjAsIDB4MjMsIDB4MTksIDB4NDAsIDB4MDksIDB4MDksIDB4ODksIDB4MDAsIDB4NDAsIDB4MTgsIAorMHhmOCwgMHg2MCwgMHhmOSwgMHg2MSwgMHg2MSwgMHg2OCwgMHgwOSwgMHgwNCwgMHgwOSwgMHgwYywgMHg4MSwgMHg0MiwgCisweDE2LCAweGQyLCAweDM5LCAweDY0LCAweDYzLCAweDY4LCAweDE5LCAweDA0LCAweDA5LCAweDBjLCAweDQwLCAweDFhLCAKKzB4MDMsIDB4MzAsIDB4ODAsIDB4MDgsIDB4ODIsIDB4MDAsIDB4YTAsIDB4NjEsIAorMHgyMCwgMHg2OCwgMHgwOSwgMHgxOCwgMHg5YiwgMHgxOCwgMHg2MywgMHg2MCwgMHhjMywgMHgxZiwgMHgwNSwgMHgzYiwgCisweDM4LCAweDFjLCAweDAwLCAweGYwLCAweGI2LCAweGZhLCAweDdlLCAweDgwLCAweDIwLCAweDFjLCAweDAwLCAweGYwLCAKKzB4YmYsIDB4ZmIsIDB4MGIsIDB4ZTAsIDB4YjksIDB4NjgsIDB4MDgsIDB4MWEsIDB4MDAsIDB4MjUsIDB4NzgsIDB4NjIsIAorMHhiZCwgMHg2MiwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHgzYywgMHhmYywgMHgyMCwgMHgxYywgMHgzOSwgMHgxYywgCisweDAwLCAweGYwLCAweDY0LCAweGY4LCAweDA1LCAweGIwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MGMsIDB4MmIsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4YzAsIAorMHhmMCwgMHhiNSwgMHgwNCwgMHgxYywgMHgwZiwgMHgxYywgMHgzOCwgMHg2YywgMHhmOSwgMHg2YiwgMHgwZCwgMHgxOCwgCisweDIxLCAweDY4LCAweDQxLCAweDE4LCAweDAwLCAweDIwLCAweGEyLCAweDY5LCAweDAwLCAweDJhLCAweDBiLCAweGQ5LCAKKzB4ODIsIDB4MDAsIDB4NTYsIDB4MTgsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MzMsIDB4NDMsIDB4MWIsIDB4NjgsIAorMHhjMCwgMHg0NiwgMHhhYiwgMHg1MCwgMHhhMiwgMHg2OSwgMHgwMSwgMHgzMCwgMHg4MiwgMHg0MiwgMHhmMywgMHhkOCwgCisweDc4LCAweDZlLCAweGY5LCAweDZiLCAweDA5LCAweDE4LCAweDg5LCAweDg5LCAweGYwLCAweDIzLCAweDE5LCAweDQwLCAKKzB4MDksIDB4MDksIDB4ODksIDB4MDAsIDB4NDAsIDB4MTgsIDB4ZjgsIDB4NjAsIDB4ZjksIDB4NjEsIDB4MjAsIDB4NjgsIAorMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgwOCwgMHgzOCwgMHgxOCwgMHg0MywgMHgwMSwgMHg2OCwgMHg3OCwgMHg2YywgCisweGZjLCAweGY3LCAweDk1LCAweGZmLCAweDc4LCAweDY0LCAweDYwLCAweDY4LCAweDAxLCAweDA0LCAweDA5LCAweDBjLCAKKzB4ZjgsIDB4NjgsIDB4ODEsIDB4NDIsIDB4MTksIDB4ZDIsIDB4MzksIDB4NjQsIDB4NjMsIDB4NjgsIDB4MTksIDB4MDQsIAorMHgwOSwgMHgwYywgMHg0MCwgMHgxYSwgMHgwMywgMHgzMCwgMHg4MCwgMHgwOCwgMHg4MiwgMHgwMCwgMHhhMCwgMHg2MSwgCisweDIwLCAweDY4LCAweDA5LCAweDE4LCAweDliLCAweDE4LCAweDYzLCAweDYwLCAweGMzLCAweDFmLCAweDA1LCAweDNiLCAKKzB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4NTYsIDB4ZmEsIDB4MDEsIDB4MjAsIDB4NzgsIDB4ODAsIDB4MjAsIDB4MWMsIAorMHgwMCwgMHhmMCwgMHg1ZSwgMHhmYiwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHhiOSwgMHg2OCwgCisweDA4LCAweDFhLCAweDc4LCAweDYyLCAweDAwLCAweDIwLCAweGI4LCAweDYyLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAKKzB4ZDksIDB4ZmIsIDB4MjAsIDB4MWMsIDB4MzksIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MDEsIDB4ZjgsIDB4ZWYsIDB4ZTcsIAorMHhmMCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgwNCwgMHgxYywgMHgwZiwgMHgxYywgMHg4ZSwgMHg0OCwgMHg0MSwgMHg2OSwgCisweDAxLCAweDMxLCAweDQxLCAweDYxLCAweDAzLCAweDIwLCAweDAwLCAweDA3LCAweDYxLCAweDY4LCAweDA4LCAweDQwLCAKKzB4MDYsIDB4MGYsIDB4MGEsIDB4MDQsIDB4MTIsIDB4MGMsIDB4MjAsIDB4NjgsIDB4MTEsIDB4MTgsIDB4ZmIsIDB4NjgsIAorMHhkMiwgMHgxYSwgMHg3YiwgMHg2OCwgMHg5ZCwgMHgxYSwgMHhjMywgMHgxZiwgMHgwNSwgMHgzYiwgMHgzOCwgMHgxYywgCisweDJhLCAweDFjLCAweDAwLCAweGYwLCAweDI2LCAweGZhLCAweDAwLCAweDIwLCAweDc4LCAweDgwLCAweDIwLCAweDFjLCAKKzB4MDAsIDB4ZjAsIDB4MmUsIDB4ZmIsIDB4NjAsIDB4NjgsIDB4NDAsIDB4MTksIDB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIAorMHg2MCwgMHg2MCwgMHgzMCwgMHgxYywgMHgwMSwgMHhmMCwgMHhlMCwgMHhmYiwgMHg3ZCwgMHg0ZSwgMHgwYiwgMHgyMywgCisweDFiLCAweDAyLCAweGYwLCAweDE4LCAweDAwLCAweDY5LCAweDAwLCAweDI4LCAweDE5LCAweGQwLCAweDAwLCAweDI1LCAKKzB4MmQsIDB4MjMsIDB4OWIsIDB4MDEsIDB4ZjAsIDB4MTgsIDB4YzAsIDB4NjgsIDB4MDAsIDB4MjgsIDB4MTIsIDB4ZDAsIAorMHhhYSwgMHgwMCwgMHg5MiwgMHgxOSwgMHgyZCwgMHgyMywgMHg5YiwgMHgwMSwgMHhkMiwgMHgxOCwgMHhkMiwgMHg2OCwgCisweDIwLCAweDFjLCAweDM5LCAweDFjLCAweDAxLCAweGYwLCAweDFjLCAweGZlLCAweDAxLCAweDM1LCAweGE4LCAweDAwLCAKKzB4ODAsIDB4MTksIDB4MmQsIDB4MjMsIDB4OWIsIDB4MDEsIDB4YzAsIDB4MTgsIDB4YzAsIDB4NjgsIDB4MDAsIDB4MjgsIAorMHhlYywgMHhkMSwgMHhmOCwgMHg2YiwgMHgwMSwgMHgxZiwgMHg4YSwgMHgxYywgMHhmYSwgMHg2MywgMHhmYSwgMHg2OCwgCisweDdkLCAweDZjLCAweDAwLCAweGYwLCAweGJiLCAweGY5LCAweGMwLCAweDQzLCAweDAxLCAweDA0LCAweDA5LCAweDBjLCAKKzB4MjgsIDB4MWMsIDB4ZmMsIDB4ZjcsIDB4MTAsIDB4ZmYsIDB4MDMsIDB4OTAsIDB4ZjksIDB4NmIsIDB4M2EsIDB4NmUsIAorMHg4ZSwgMHgxOCwgMHgyMCwgMHg2OCwgMHgxMiwgMHgxOCwgMHgwMSwgMHg5MiwgMHg3YSwgMHg2ZSwgMHg4ZCwgMHgxOCwgCisweDExLCAweDE4LCAweDAyLCAweDkxLCAweGM4LCAweDFkLCAweDA5LCAweDMwLCAweGUwLCAweDYwLCAweGIxLCAweDg4LCAKKzB4MDgsIDB4MDIsIDB4MDksIDB4MGEsIDB4MDksIDB4MDYsIDB4MDksIDB4MGUsIDB4MDgsIDB4NDMsIDB4MDAsIDB4MDQsIAorMHgwMCwgMHgwYywgMHg3OCwgMHg2MSwgMHg2OCwgMHg2OCwgMHgwMSwgMHgwZSwgMHhmZiwgMHgyMiwgMHgxMiwgMHgwNCwgCisweDAyLCAweDQwLCAweDEyLCAweDBhLCAweDExLCAweDQzLCAweGZmLCAweDIyLCAweDEyLCAweDAyLCAweDAyLCAweDQwLCAKKzB4MTIsIDB4MDIsIDB4MTEsIDB4NDMsIDB4MDAsIDB4MDYsIDB4MDgsIDB4NDMsIDB4MzgsIDB4NjEsIDB4YTgsIDB4ODksIAorMHgwOSwgMHgyMywgMHgxYiwgMHgwMiwgMHgxOCwgMHg0MCwgMHhiOCwgMHg2MSwgCisweGE4LCAweDg5LCAweDk4LCAweDQzLCAweGE4LCAweDgxLCAweGE4LCAweDg5LCAweDAyLCAweDk5LCAweGMwLCAweDQ2LCAKKzB4ODgsIDB4ODEsIDB4MDAsIDB4MjAsIDB4NzAsIDB4ODAsIDB4YjAsIDB4ODAsIDB4NzAsIDB4ODEsIDB4NjgsIDB4NjAsIAorMHgyOCwgMHg4MiwgMHhiOSwgMHg2ZSwgMHgzMCwgMHgxYywgMHhmYywgMHhmNywgMHhlOCwgMHhmZSwgMHgzOCwgMHg4NiwgCisweGZhLCAweDY5LCAweDMwLCAweDFjLCAweDI5LCAweDFjLCAweGZjLCAweGY3LCAweDAzLCAweGZmLCAweDc4LCAweDg2LCAKKzB4M2QsIDB4OGUsIDB4NzgsIDB4OGUsIDB4MDMsIDB4OTksIDB4ZmMsIDB4ZjcsIDB4YzgsIDB4ZmUsIDB4MDAsIDB4OTAsIAorMHg2MCwgMHg2OCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgMHgzOSwgMHg2ZSwgMHg0MSwgMHgxYSwgMHgwOSwgMHgwNCwgCisweDA5LCAweDBjLCAweDdhLCAweDZlLCAweDgyLCAweDFhLCAweDEzLCAweDA0LCAweDFiLCAweDBjLCAweDFhLCAweDAyLCAKKzB4MWIsIDB4MGEsIDB4MWEsIDB4NDMsIDB4MTYsIDB4MDQsIDB4MzYsIDB4MGMsIDB4YmEsIDB4NjgsIDB4ODIsIDB4NDIsIAorMHgwMSwgMHhkMiwgMHgwMCwgMHgyMCwgMHgwMCwgMHhlMCwgMHgxMCwgMHgxYSwgMHhiOCwgMHg2MCwgMHgwOCwgMHgwMiwgCisweDA5LCAweDEyLCAweDA5LCAweDA2LCAweDA5LCAweDBlLCAweDA4LCAweDQzLCAweDAxLCAweDA0LCAweDA5LCAweDBjLCAKKzB4MDEsIDB4OTgsIDB4YzAsIDB4NDYsIDB4NDEsIDB4ODAsIDB4MjgsIDB4MWMsIDB4ZmMsIDB4ZjcsIDB4YTMsIDB4ZmUsIAorMHgwNSwgMHgxYywgMHgwMCwgMHg5OCwgMHgzMSwgMHgxYywgMHhmYywgMHhmNywgMHg5ZSwgMHhmZSwgMHgwNiwgMHgxYywgCisweDc4LCAweDY5LCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDAxLCAweDAyLCAweDAwLCAweDBhLCAweDA4LCAweDQzLCAKKzB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIDB4MDEsIDB4OTgsIDB4YzAsIDB4NDYsIDB4ODEsIDB4ODAsIDB4MjgsIDB4MWMsIAorMHhmYywgMHhmNywgMHg4ZiwgMHhmZSwgMHg3OSwgMHg2OSwgMHgwMSwgMHgzMSwgMHhjMCwgMHg0MywgMHg3OSwgMHg2MSwgCisweDAxLCAweDlhLCAweGMwLCAweDQ2LCAweDUwLCAweDgxLCAweDM4LCAweDY5LCAweDAxLCAweDBlLCAweGZmLCAweDIyLCAKKzB4MTIsIDB4MDQsIDB4MDIsIDB4NDAsIDB4MTIsIDB4MGEsIDB4MTEsIDB4NDMsIDB4ZmYsIDB4MjIsIDB4MTIsIDB4MDIsIAorMHgwMiwgMHg0MCwgMHgxMiwgMHgwMiwgMHgxMSwgMHg0MywgMHgwMCwgMHgwNiwgMHgwMSwgMHg0MywgMHgzMCwgMHgxYywgCisweGZjLCAweGY3LCAweDc3LCAweGZlLCAweDM5LCAweDY5LCAweDdhLCAweDY4LCAweDg5LCAweDE4LCAweDM5LCAweDYxLCAKKzB4YjksIDB4NjgsIDB4MDAsIDB4MjksIDB4MDksIDB4ZDEsIDB4MDIsIDB4OTksIDB4ODksIDB4ODksIDB4YmEsIDB4NjksIAorMHgxMSwgMHg0MywgMHgwMiwgMHg5YSwgMHhjMCwgMHg0NiwgMHg5MSwgMHg4MSwgMHhiOSwgMHg2OSwgMHhmYywgMHhmNywgCisweDY2LCAweGZlLCAweDIwLCAweDgyLCAweDAwLCAweDIwLCAweDYwLCAweDgyLCAweGY4LCAweDZkLCAweDQxLCAweDA4LCAKKzB4MTYsIDB4ZDMsIDB4ODAsIDB4MGEsIDB4MGEsIDB4ZDMsIDB4NjAsIDB4NjgsIDB4MTAsIDB4MzgsIDB4MDEsIDB4MDQsIAorMHgwOSwgMHgwYywgMHgwOCwgMHgwMiwgMHgwOSwgMHgwYSwgMHgwOCwgMHg0MywgMHgyMSwgMHg2OCwgMHhjMCwgMHg0NiwgCisweDA4LCAweDgyLCAweDA5LCAweGUwLCAweDYwLCAweDY4LCAweDBjLCAweDM4LCAweDAxLCAweDA0LCAweDA5LCAweDBjLCAKKzB4MDgsIDB4MDIsIDB4MDksIDB4MGEsIDB4MDgsIDB4NDMsIDB4MjEsIDB4NjgsIDB4YzAsIDB4NDYsIDB4ODgsIDB4ODEsIAorMHgwNCwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGYxLCAweGI1LCAweDg0LCAweGIwLCAweDZlLCAweDRkLCAweDI4LCAweDY5LCAKKzB4MDEsIDB4MjIsIDB4MDQsIDB4OTksIDB4OGEsIDB4NDAsIDB4OTAsIDB4NDMsIDB4MjgsIDB4NjEsIDB4MDQsIDB4OTgsIAorMHg0MywgMHgwMSwgMHgxOCwgMHgxYSwgMHg4MCwgMHgwMCwgMHgxNiwgMHgxYywgMHg2OSwgMHg0OSwgMHg0NCwgMHgxOCwgCisweGUwLCAweDZiLCAweGMwLCAweDQ2LCAweDAwLCAweDkwLCAweGEwLCAweDY4LCAweDAwLCAweDI4LCAweDAxLCAweGQxLCAKKzB4MDAsIDB4MjYsIDB4MjYsIDB4ZTAsIDB4NjUsIDB4NDgsIDB4NDEsIDB4NjksIDB4MDEsIDB4MzEsIDB4NDEsIDB4NjEsIAorMHgwNCwgMHg5OCwgMHhmYywgMHhmNywgMHgwOSwgMHhmZCwgMHgwNywgMHgxYywgMHgwMywgMHhkMSwgMHgyOCwgMHg2OSwgCisweDMwLCAweDQzLCAweDI4LCAweDYxLCAweGI1LCAweGUwLCAweGEwLCAweDY4LCAweDY1LCAweDY4LCAweGE4LCAweDQyLCAKKzB4MDAsIDB4ZDIsIDB4MDUsIDB4MWMsIDB4YTEsIDB4NmMsIDB4YTksIDB4NDIsIDB4MTYsIDB4ZDIsIDB4NDAsIDB4MWEsIAorMHg2MiwgMHg2YSwgMHgxMCwgMHgxYSwgMHgwMCwgMHgyNiwgMHg2MCwgMHg2MiwgMHhhNiwgMHg2MCwgMHhhNiwgMHg2MiwgCisweDIwLCAweDg4LCAweDQ4LCAweDIzLCAweDE4LCAweDQzLCAweDIwLCAweDgwLCAweDBkLCAweDFjLCAweDA5LCAweGQxLCAKKzB4MzgsIDB4MWMsIDB4ZmMsIDB4ZjcsIDB4MTksIDB4ZmQsIDB4MDMsIDB4MjAsIDB4NjAsIDB4ODAsIDB4NjYsIDB4NjAsIAorMHgyMCwgMHgxYywgMHgwMCwgMHhmMCwgMHg4ZCwgMHhmOSwgMHg5NiwgMHhlMCwgMHhlMSwgMHg2OCwgMHgzOCwgMHg2OCwgCisweDA5LCAweDE4LCAweGMzLCAweDFmLCAweDA1LCAweDNiLCAweDIwLCAweDFjLCAweDAyLCAweDM5LCAweDJhLCAweDFjLCAKKzB4MDAsIDB4ZjAsIDB4Y2QsIDB4ZjgsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4ZDcsIDB4ZjksIDB4ZTAsIDB4NjgsIAorMHg0NiwgMHgxOSwgMHg3OCwgMHg2OCwgMHgzMCwgMHg0MywgMHg3OCwgMHg2MCwgMHgwNCwgMHg5OCwgMHgzMSwgMHgxYywgCisweDAxLCAweGYwLCAweDg4LCAweGZhLCAweDIxLCAweDZlLCAweDAwLCAweDk4LCAKKzB4MDgsIDB4MTgsIDB4MDEsIDB4OTAsIDB4NzAsIDB4MWEsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4NjEsIDB4NmUsIAorMHg3MSwgMHgxYSwgMHgwYSwgMHgwNCwgMHgxMiwgMHgwYywgMHgxMSwgMHgwMiwgMHgxMiwgMHgwYSwgMHgxMSwgMHg0MywgCisweDA5LCAweDA0LCAweDA5LCAweDBjLCAweDAyLCAweDkxLCAweDAxLCAweDAyLCAweDAwLCAweDBhLCAweDA4LCAweDQzLCAKKzB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIDB4MDEsIDB4OTgsIDB4YzAsIDB4NDYsIDB4NDEsIDB4ODAsIDB4MjAsIDB4OGUsIAorMHhmYywgMHhmNywgMHhjYiwgMHhmZCwgMHgwNiwgMHgxYywgMHg2MCwgMHg4ZSwgMHgwMiwgMHg5OSwgMHhmYywgMHhmNywgCisweGM2LCAweGZkLCAweDAzLCAweDkwLCAweDYwLCAweDY5LCAweDAxLCAweDA0LCAweDA5LCAweDBjLCAweDA4LCAweDAyLCAKKzB4MDksIDB4MGEsIDB4MDgsIDB4NDMsIDB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIDB4MDEsIDB4OTgsIDB4YzAsIDB4NDYsIAorMHg4MSwgMHg4MCwgMHgzMCwgMHgxYywgMHhmYywgMHhmNywgMHhiNywgMHhmZCwgMHg2MSwgMHg2OSwgMHgwMSwgMHgzMSwgCisweGMwLCAweDQzLCAweDYxLCAweDYxLCAweDAxLCAweDk5LCAweGMwLCAweDQ2LCAweDQ4LCAweDgxLCAweDYwLCAweDZlLCAKKzB4MDAsIDB4OTksIDB4NDYsIDB4MTgsIDB4MjAsIDB4NjksIDB4MDEsIDB4MGUsIDB4ZmYsIDB4MjIsIDB4MTIsIDB4MDQsIAorMHgwMiwgMHg0MCwgMHgxMiwgMHgwYSwgMHgxMSwgMHg0MywgMHhmZiwgMHgyMiwgMHgxMiwgMHgwMiwgMHgwMiwgMHg0MCwgCisweDEyLCAweDAyLCAweDExLCAweDQzLCAweDAwLCAweDA2LCAweDAxLCAweDQzLCAweDcxLCAweDYwLCAweDAzLCAweDk4LCAKKzB4ZmMsIDB4ZjcsIDB4OWIsIDB4ZmQsIDB4MjEsIDB4NjksIDB4NDksIDB4MTksIDB4MjEsIDB4NjEsIDB4YTEsIDB4NjgsIAorMHg0OSwgMHgxYiwgMHhhMSwgMHg2MCwgMHgwNiwgMHhkMSwgMHhiMSwgMHg4OSwgMHhhMiwgMHg2OSwgMHgxMSwgMHg0MywgCisweGIxLCAweDgxLCAweGExLCAweDY5LCAweGZjLCAweGY3LCAweDhkLCAweGZkLCAweDM4LCAweDgyLCAweDYxLCAweDZlLCAKKzB4MzgsIDB4NjgsIDB4MDksIDB4MTgsIDB4MGUsIDB4MzEsIDB4ZjksIDB4NjAsIDB4ZTIsIDB4NjgsIDB4MDAsIDB4OTksIAorMHgwNCwgMHgzOCwgMHgwMCwgMHhmMCwgMHg0YywgMHhmOCwgMHgwMiwgMHgyMCwgMHg3OCwgMHg4MiwgMHhlMCwgMHg2ZCwgCisweDQxLCAweDA4LCAweDE2LCAweGQzLCAweDgwLCAweDBhLCAweDBhLCAweGQzLCAweDc4LCAweDY4LCAweDEwLCAweDM4LCAKKzB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIDB4MDgsIDB4MDIsIDB4MDksIDB4MGEsIDB4MDgsIDB4NDMsIDB4MzksIDB4NjgsIAorMHhjMCwgMHg0NiwgMHhjOCwgMHg4MSwgMHgwOSwgMHhlMCwgMHg3OCwgMHg2OCwgMHgwYywgMHgzOCwgMHgwMSwgMHgwNCwgCisweDA5LCAweDBjLCAweDA4LCAweDAyLCAweDA5LCAweDBhLCAweDA4LCAweDQzLCAweDM5LCAweDY4LCAweGMwLCAweDQ2LCAKKzB4NDgsIDB4ODEsIDB4MDUsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHhkMCwgMHgyYywgMHgwMCwgMHg4MCwgMHg1YywgMHgyYiwgMHgwMCwgMHg4MCwgMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgCisweGY3LCAweGI1LCAweDAzLCAweDFjLCAweDBmLCAweDFjLCAweDAwLCAweDIwLCAweDFjLCAweDY4LCAweDI2LCAweDA0LCAKKzB4MzEsIDB4MWMsIDB4MWQsIDB4MWQsIDB4ZmMsIDB4ZjcsIDB4NTEsIDB4ZmQsIDB4NDAsIDB4YzcsIDB4MDIsIDB4OWEsIAorMHhkMSwgMHgxYywgMHg4OSwgMHgwOCwgMHgwMSwgMHgzOSwgMHg0YSwgMHgxZSwgMHgwMiwgMHg5MiwgMHgwMCwgMHgyOSwgCisweDBkLCAweGQwLCAweDIxLCAweDBjLCAweDEwLCAweGNkLCAweDIyLCAweDA0LCAweDBhLCAweDQzLCAweDExLCAweDFjLCAKKzB4MTYsIDB4MWMsIDB4ZmMsIDB4ZjcsIDB4NDAsIDB4ZmQsIDB4NDAsIDB4YzcsIDB4MDIsIDB4OTksIDB4NGEsIDB4MWUsIAorMHgwMiwgMHg5MiwgMHgwMCwgMHgyOSwgMHhmMSwgMHhkMSwgMHgwMywgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDgwLCAweDA4LCAweDgwLCAweDAwLCAweDg5LCAweDA4LCAweDg5LCAweDAwLCAweDAzLCAweDMyLCAKKzB4OTMsIDB4MDgsIDB4NWEsIDB4MWUsIDB4MDAsIDB4MmIsIDB4MDUsIDB4ZDAsIDB4MDgsIDB4YzksIDB4MDgsIDB4YzAsIAorMHgxMywgMHgxYywgMHgwMSwgMHgzYSwgMHgwMCwgMHgyYiwgMHhmOSwgMHhkMSwgMHg3MCwgMHg0NywgMHhmZiwgMHhiNSwgCisweDg2LCAweGIwLCAweDE3LCAweDFjLCAweDAwLCAweDI2LCAweDA2LCAweDk4LCAweDgwLCAweDZjLCAweGMwLCAweDFiLCAKKzB4MDYsIDB4OTksIDB4YzAsIDB4NDYsIDB4ODgsIDB4NjQsIDB4MDEsIDB4MjAsIDB4YzAsIDB4MDUsIDB4MDYsIDB4OTksIAorMHg4OSwgMHg2YiwgMHhjMCwgMHg0NiwgMHgwMSwgMHg5MSwgMHgwNiwgMHg5OSwgMHg0YywgMHg2YiwgMHg2NywgMHhlMCwgCisweDIxLCAweDY4LCAweGMwLCAweDQ2LCAweDAyLCAweDkxLCAweDYxLCAweDY4LCAweGMwLCAweDQ2LCAweDAzLCAweDkxLCAKKzB4YTEsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDQsIDB4OTEsIDB4MDIsIDB4YTksIDB4NDksIDB4ODgsIDB4YjksIDB4NDIsIAorMHgwOCwgMHhkMiwgMHgwMiwgMHhhZCwgMHg2ZCwgMHg4OCwgMHgwMiwgMHhhOSwgMHg0OSwgMHg4OCwgMHg3ZiwgMHgxYSwgCisweDAwLCAweDIxLCAweDAyLCAweGFiLCAweDU5LCAweDgwLCAweDE5LCAweGUwLCAweDAyLCAweGE5LCAweDQ5LCAweDg4LCAKKzB4YzksIDB4MWIsIDB4MDIsIDB4YWIsIDB4NTksIDB4ODAsIDB4M2QsIDB4MWMsIDB4MDAsIDB4MjcsIDB4MDEsIDB4MjEsIAorMHg0OSwgMHgwNiwgMHgwNywgMHg5YiwgMHg5YSwgMHgwNywgMHg5MiwgMHgwZiwgMHgwZCwgMHhkMCwgMHhlYiwgMHgwNiwgCisweGRiLCAweDBlLCAweDA4LCAweGQwLCAweDFlLCAweDJiLCAweDA4LCAweGQzLCAweDFlLCAweDJiLCAweDAyLCAweGQxLCAKKzB4MDMsIDB4MmEsIDB4MDQsIDB4ZDEsIDB4MDEsIDB4ZTAsIDB4MDIsIDB4MmEsIAorMHgwMSwgMHhkMywgMHgwMSwgMHgyNiwgMHgwMCwgMHgyMSwgMHgyOSwgMHg0MywgMHgwMSwgMHg0MywgMHgwYSwgMHgxYywgCisweDAwLCAweDkxLCAweDAwLCAweDIwLCAweDAzLCAweDk5LCAweDA0LCAweDlhLCAweDA3LCAweDliLCAweDAxLCAweGYwLCAKKzB4NWIsIDB4ZmYsIDB4MDcsIDB4OTksIDB4NDksIDB4MTksIDB4MDcsIDB4OTEsIDB4MDAsIDB4MmUsIDB4MGEsIDB4ZDAsIAorMHgxZCwgMHg0YSwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MiwgMHgxZCwgMHg0OCwgMHgwMSwgMHg2ZCwgMHg0MiwgMHg2ZCwgCisweDAwLCAweDIwLCAweDA3LCAweDliLCAweDAxLCAweGYwLCAweDRjLCAweGZmLCAweDAwLCAweDI2LCAweDAyLCAweGE4LCAKKzB4NDAsIDB4ODgsIDB4MDAsIDB4MjgsIDB4MGMsIDB4ZDAsIDB4MDMsIDB4OTgsIDB4NDAsIDB4MTksIDB4MDMsIDB4OTAsIAorMHgwMiwgMHg5OCwgMHhjMCwgMHg0NiwgMHgyMCwgMHg2MCwgMHgwMywgMHg5OCwgMHhjMCwgMHg0NiwgMHg2MCwgMHg2MCwgCisweDA0LCAweDk4LCAweGMwLCAweDQ2LCAweGEwLCAweDYwLCAweDAzLCAweGUwLCAweDAxLCAweDk4LCAweDAxLCAweDM4LCAKKzB4MDEsIDB4OTAsIDB4MTAsIDB4MzQsIDB4MDYsIDB4OTgsIDB4YzAsIDB4NDYsIDB4NDQsIDB4NjMsIDB4MDEsIDB4OTgsIAorMHgwNiwgMHg5OSwgMHhjMCwgMHg0NiwgMHg4OCwgMHg2MywgMHgwMCwgMHgyMCwgMHgwMCwgMHgyZiwgMHgwMiwgMHhkMCwgCisweDAxLCAweDk5LCAweDAwLCAweDI5LCAweDkyLCAweGQxLCAweDA5LCAweDRhLCAweGMwLCAweDQ2LCAweDAwLCAweDkyLCAKKzB4MDYsIDB4NDgsIDB4MDEsIDB4NmQsIDB4NDIsIDB4NmQsIDB4MDAsIDB4MjAsIDB4MDksIDB4OWIsIDB4MDEsIDB4ZjAsIAorMHgxZiwgMHhmZiwgMHgwYSwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgCisweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDdjLCAweDI5LCAweDAwLCAweDgwLCAweDA0LCAweDAwLCAweDUzLCAweDAyLCAKKzB4OTAsIDB4YjUsIDB4MGMsIDB4MWMsIDB4MDcsIDB4MWMsIDB4MzgsIDB4NjgsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIAorMHgwOCwgMHgzOCwgMHgxOCwgMHg0MywgMHgwMSwgMHg2OCwgMHgzOCwgMHg4YSwgMHhmYywgMHhmNywgMHg4NSwgMHhmYywgCisweGMwLCAweDQzLCAweGY5LCAweDY4LCAweGMwLCAweDQ2LCAweDA4LCAweDgwLCAweDc4LCAweDhhLCAweDM5LCAweDY4LCAKKzB4MDgsIDB4MWEsIDB4MzgsIDB4NjAsIDB4MzgsIDB4MWMsIDB4MDEsIDB4ZjAsIDB4OGIsIDB4ZjksIDB4MzgsIDB4MWMsIAorMHhmYywgMHhmNywgMHg4YywgMHhmYiwgMHgyMCwgMHgxYywgMHhmZiwgMHhmNywgMHgzMywgMHhmZSwgMHg5MCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDgwLCAweGI1LCAweDAxLCAweDg4LCAweDhhLCAweDA5LCAweDIxLCAweGQzLCAKKzB4Y2EsIDB4MDksIDB4MWYsIDB4ZDIsIDB4OGEsIDB4MDgsIDB4MWQsIDB4ZDMsIDB4MDAsIDB4MjEsIDB4MDEsIDB4ODAsIAorMHg0MSwgMHg4MCwgMHg0NywgMHg2ZiwgMHg0MCwgMHg2ZCwgMHhmYSwgMHgxZCwgMHgxOSwgMHgzMiwgMHg1MSwgMHg3MSwgCisweGZhLCAweDZkLCAweGMwLCAweDQ2LCAweDEwLCAweDYwLCAweDNhLCAweDZlLCAweGMwLCAweDQ2LCAweDEwLCAweDYwLCAKKzB4MGMsIDB4NDgsIDB4YzAsIDB4NDYsIDB4ODEsIDB4NjMsIDB4YzEsIDB4NmIsIDB4NDksIDB4MDgsIDB4NDksIDB4MDAsIAorMHhjMSwgMHg2MywgMHgwMSwgMHgyMCwgMHgwMCwgMHhmMCwgMHhjYywgMHhmZiwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgCisweDZiLCAweGZmLCAweDgwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDgwLCAweDIzLCAweDE5LCAweDQzLCAKKzB4MDEsIDB4ODAsIDB4MDEsIDB4ODgsIDB4NDksIDB4MDksIDB4ZjYsIDB4ZDIsIDB4MDAsIDB4ZjAsIDB4YjAsIDB4ZjgsIAorMHhmMywgMHhlNywgMHgwMCwgMHgwMCwgMHhlOCwgMHgwZSwgMHgwMCwgMHg4MCwgMHhmMCwgMHhiNSwgMHgwNywgMHgxYywgCisweDEwLCAweDFjLCAweDBkLCAweDFjLCAweDAwLCAweDI0LCAweDVlLCAweDFlLCAweDAwLCAweDJiLCAweDE5LCAweGQwLCAKKzB4MDEsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MzksIDB4NjAsIDB4NDEsIDB4ODgsIDB4MGMsIDB4MTksIDB4NDEsIDB4NjgsIAorMHhjMCwgMHg0NiwgMHg3OSwgMHg2MCwgMHg4MSwgMHg2OCwgMHhjMCwgMHg0NiwgMHhiOSwgMHg2MCwgMHhjMSwgMHg2OCwgCisweGMwLCAweDQ2LCAweGY5LCAweDYwLCAweDEwLCAweDMwLCAweDEwLCAweDM3LCAweGU5LCAweDZhLCAweDgxLCAweDQyLCAKKzB4MDIsIDB4ZDgsIDB4MjgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4ZWMsIDB4ZmYsIDB4MzEsIDB4MWMsIDB4MDEsIDB4M2UsIAorMHgwMCwgMHgyOSwgMHhlNSwgMHhkMSwgMHgyMCwgMHgxYywgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDAwLCAweDIxLCAweGMxLCAweDYxLCAweDA1LCAweDQ5LCAweDBhLCAweDY4LCAweDAwLCAweDJhLCAweDAxLCAweGQxLCAKKzB4MDgsIDB4NjAsIDB4MDIsIDB4ZTAsIDB4NGEsIDB4NjgsIDB4YzAsIDB4NDYsIDB4ZDAsIDB4NjEsIDB4NDgsIDB4NjAsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHhkMCwgMHgyYywgMHgwMCwgMHg4MCwgMHgwMywgMHg0OSwgMHgwOCwgMHg2OCwgCisweDAwLCAweDI4LCAweDAyLCAweGQwLCAweGMyLCAweDY5LCAweGMwLCAweDQ2LCAweDBhLCAweDYwLCAweDcwLCAweDQ3LCAKKzB4ZDAsIDB4MmMsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MjEsIDB4ODEsIDB4NjcsIDB4MDUsIDB4NDksIDB4OGEsIDB4NjgsIAorMHgwMCwgMHgyYSwgMHgwMSwgMHhkMSwgMHg4OCwgMHg2MCwgMHgwMiwgMHhlMCwgMHhjYSwgMHg2OCwgMHhjMCwgMHg0NiwgCisweDkwLCAweDY3LCAweGM4LCAweDYwLCAweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweGQwLCAweDJjLCAweDAwLCAweDgwLCAKKzB4MDMsIDB4NDksIDB4ODgsIDB4NjgsIDB4MDAsIDB4MjgsIDB4MDIsIDB4ZDAsIDB4ODIsIDB4NmYsIDB4YzAsIDB4NDYsIAorMHg4YSwgMHg2MCwgMHg3MCwgMHg0NywgMHhkMCwgMHgyYywgMHgwMCwgMHg4MCwgCisweDAwLCAweGI1LCAweDgwLCAweDIwLCAweDEzLCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweGZmLCAweGY3LCAKKzB4ZDUsIDB4ZmYsIDB4MDAsIDB4MjgsIDB4MWIsIDB4ZDAsIDB4MDMsIDB4MjMsIDB4MWIsIDB4MDcsIDB4NDEsIDB4NjgsIAorMHgxOSwgMHg0MCwgMHgwYSwgMHgwZiwgMHg1MSwgMHgwMSwgMHg4OSwgMHgxYSwgMHg4OSwgMHgwMCwgMHgwZCwgMHg0YiwgCisweGM5LCAweDE4LCAweDRiLCAweDg4LCAweDAwLCAweDJiLCAweDA0LCAweGQxLCAweDExLCAweDFjLCAweGZmLCAweGY3LCAKKzB4M2IsIDB4ZmYsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDEsIDB4MmIsIDB4MDIsIDB4ZDEsIDB4ZmYsIDB4ZjcsIAorMHgwNSwgMHhmYywgMHhmOCwgMHhlNywgMHgwMiwgMHgyYiwgMHhmNiwgMHhkMSwgMHhmZiwgMHhmNywgMHg0ZSwgMHhmYiwgCisweGYzLCAweGU3LCAweDA0LCAweDQ4LCAweDAxLCAweDZkLCAweDAxLCAweDMxLCAweDAxLCAweDY1LCAweGVlLCAweGU3LCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4YjAsIDB4NWMsIDB4MmIsIDB4MDAsIDB4ODAsIDB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIAorMHgwMCwgMHhiNSwgMHgyMCwgMHgyMCwgMHgwZCwgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHhmZiwgMHhmNywgCisweGJmLCAweGZmLCAweDAwLCAweDI4LCAweDBlLCAweGQwLCAweDAxLCAweDg4LCAweDIwLCAweDIzLCAweDE5LCAweDQzLCAKKzB4MDEsIDB4ODAsIDB4MDEsIDB4ODgsIDB4MTAsIDB4MjMsIDB4OTksIDB4NDMsIDB4MDEsIDB4ODAsIDB4MDEsIDB4ODgsIAorMHgwOSwgMHgwYSwgMHgwMSwgMHhkMywgMHhmZiwgMHhmNywgMHgyZSwgMHhmZiwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDAzLCAweDQ4LCAweDAxLCAweDZkLCAweDAxLCAweDMxLCAweDAxLCAweDY1LCAweGY4LCAweGU3LCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4YjAsIDB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIDB4OTgsIDB4YjUsIDB4MDcsIDB4MWMsIAorMHgyMiwgMHg0OCwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MCwgMHgyMiwgMHg0OCwgMHhjMywgMHgxZCwgMHg0MSwgMHgzMywgCisweDQxLCAweDZkLCAweDgyLCAweDZkLCAweDgwLCAweDZjLCAweDAwLCAweDAzLCAweDAwLCAweDBiLCAweDljLCAweDY4LCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDcsIDB4MjMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4OTgsIDB4NDIsIDB4MDAsIDB4ZDEsIAorMHgwYywgMHhlMCwgMHg5OCwgMHg0MiwgMHgwMywgMHhkOSwgMHgxMCwgMHgxYSwgMHg1OSwgMHgxYSwgMHg0MSwgMHgxOCwgCisweDAwLCAweGUwLCAweDE5LCAweDFhLCAweDAxLCAweDIwLCAweDEwLCAweDI5LCAweDAwLCAweGQ4LCAweDAwLCAweDIwLCAKKzB4MDAsIDB4MjgsIDB4MWYsIDB4ZDAsIDB4NzgsIDB4NmEsIDB4ZjksIDB4NmEsIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIAorMHhiOCwgMHg2YSwgMHhmOSwgMHg2YSwgMHhjMCwgMHg0NiwgMHg0OCwgMHg2MCwgMHgxMCwgMHg0YSwgMHhjMCwgMHg0NiwgCisweDAwLCAweDkyLCAweGZiLCAweDZhLCAweDBmLCAweDQ4LCAweDQyLCAweDZkLCAweDAzLCAweDIwLCAweDM5LCAweDZhLCAKKzB4MDEsIDB4ZjAsIDB4ZTIsIDB4ZmQsIDB4MzgsIDB4ODgsIDB4MTAsIDB4MjMsIDB4MTgsIDB4NDMsIDB4MzgsIDB4ODAsIAorMHgzOCwgMHg4OCwgMHg0MCwgMHgyMywgMHg5OCwgMHg0MywgMHgzOCwgMHg4MCwgMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgCisweDU1LCAweGZmLCAweDk4LCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDM4LCAweDg4LCAweDQwLCAweDIzLCAKKzB4MTgsIDB4NDMsIDB4MzgsIDB4ODAsIDB4ZjcsIDB4ZTcsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIAorMHhhOCwgMHgwMywgMHgwMCwgMHg4MCwgMHgwOCwgMHgwMCwgMHgxMSwgMHgwMiwgMHg3YywgMHgyOSwgMHgwMCwgMHg4MCwgCisweGIwLCAweGI1LCAweDQwLCAweDIwLCAweDJjLCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweDAwLCAweGYwLCAKKzB4ZmQsIDB4ZmUsIDB4MDcsIDB4MWMsIDB4NDAsIDB4NjgsIDB4MDMsIDB4MjMsIDB4MWIsIDB4MDcsIDB4MTgsIDB4NDAsIAorMHgwNSwgMHgwZiwgMHg2OCwgMHgwMSwgMHg0MCwgMHgxYiwgMHg4MCwgMHgwMCwgMHgyNiwgMHg0OSwgMHg0NCwgMHgxOCwgCisweDIwLCAweDg4LCAweDAyLCAweDIzLCAweDE4LCAweDQzLCAweDIwLCAweDgwLCAweDIwLCAweDg4LCAweDQxLCAweDA4LCAKKzB4MzQsIDB4ZDMsIDB4NDAsIDB4MDgsIDB4NDAsIDB4MDAsIDB4MjAsIDB4ODAsIDB4YTAsIDB4NmMsIDB4ZTEsIDB4NmMsIAorMHg0MCwgMHgxOCwgMHhhMCwgMHg2NCwgMHgwMCwgMHgyMCwgMHhlMCwgMHg2NCwgMHhhMSwgMHg2YiwgMHgyMiwgMHg2ZCwgCisweDg5LCAweDE4LCAweGExLCAweDYzLCAweDIwLCAweDY1LCAweGI4LCAweDZhLCAweGMwLCAweDQ2LCAweDYwLCAweDY1LCAKKzB4MDMsIDB4MjMsIDB4MWIsIDB4MDcsIDB4NzgsIDB4NjgsIDB4MTgsIDB4NDAsIDB4NzgsIDB4NjAsIDB4NjEsIDB4NjgsIAorMHgzNiwgMHgzMSwgMHg5NCwgMHgyOSwgMHgwNCwgMHhkOCwgMHgzOCwgMHgyMywgMHgxOCwgMHg0MywgMHg3OCwgMHg2MCwgCisweDM4LCAweDIwLCAweDAzLCAweGUwLCAweDk0LCAweDIzLCAweDE4LCAweDQzLCAweDc4LCAweDYwLCAweDk0LCAweDIwLCAKKzB4YjgsIDB4NjEsIDB4MzksIDB4NjgsIDB4NzgsIDB4NjgsIDB4MDIsIDB4MDQsIDB4MTIsIDB4MGMsIDB4MjAsIDB4MWMsIAorMHhjYiwgMHgxZiwgMHgwNSwgMHgzYiwgMHhmZiwgMHhmNywgMHhkNywgMHhmZCwgMHgwMiwgMHgyMCwgMHg2MCwgMHg4MCwgCisweDM4LCAweDFjLCAweGZmLCAweGY3LCAweGRmLCAweGZlLCAweGIwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MzgsIDB4MWMsIDB4ZmMsIDB4ZjcsIDB4MDcsIDB4ZmEsIDB4MjgsIDB4MDEsIDB4MDYsIDB4NDksIDB4NDAsIDB4MTgsIAorMHgxOSwgMHgyMywgMHhkYiwgMHgwMSwgMHhjMCwgMHgxOCwgMHg0MSwgMHg2YiwgMHgwMSwgMHgzOSwgMHg0MSwgMHg2MywgCisweGVmLCAweGU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGIwLCAKKzB4NWMsIDB4MmIsIDB4MDAsIDB4ODAsIDB4YTAsIDB4MWMsIDB4MDAsIDB4ODAsIDB4OTAsIDB4YjUsIDB4MDAsIDB4MjcsIAorMHgwZiwgMHg0YywgMHgwZCwgMHhlMCwgMHg0MiwgMHg2YiwgMHgwMSwgMHgzYSwgMHg0MiwgMHg2MywgMHgwMCwgMHgyYSwgCisweDA1LCAweGRjLCAweDAyLCAweDZiLCAweGMwLCAweDQ2LCAweDQyLCAweDYzLCAweGMwLCAweDZhLCAweDAxLCAweGYwLCAKKzB4YzYsIDB4ZjksIDB4MDEsIDB4MzcsIDB4MGIsIDB4MmYsIDB4MDcsIDB4ZDIsIDB4MzgsIDB4MDEsIDB4MDAsIDB4MTksIAorMHgzMywgMHgyMywgMHg5YiwgMHgwMSwgMHhjMCwgMHgxOCwgMHg4MSwgMHg2YSwgMHgwMCwgMHgyOSwgMHhlOSwgMHhkMSwgCisweDAxLCAweDIwLCAweDQwLCAweDA2LCAweDAzLCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweDkwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjAsIAorMHgxMCwgMHg0OCwgMHhjMSwgMHg2OCwgMHgwMSwgMHgzMSwgMHhjMSwgMHg2MCwgMHgwZiwgMHg0OSwgMHhjOCwgMHg2OCwgCisweDAxLCAweDI4LCAweDE3LCAweGQxLCAweGM4LCAweDFkLCAweDc5LCAweDMwLCAweDAyLCAweDg5LCAweDAwLCAweDJhLCAKKzB4MTIsIDB4ZDAsIDB4MDEsIDB4M2EsIDB4MDIsIDB4ODEsIDB4MDIsIDB4ODksIDB4MDAsIDB4MmEsIDB4MGQsIDB4ZDEsIAorMHg0MiwgMHg4OSwgMHgwMCwgMHgyYSwgMHgwOCwgMHhkMSwgMHhjOSwgMHg2ZiwgMHgwMiwgMHgyMywgMHgwYSwgMHg2OCwgCisweDFhLCAweDQzLCAweDBhLCAweDYwLCAweDA0LCAweDIxLCAweDAxLCAweDgxLCAweDAxLCAweDIxLCAweDAwLCAweGUwLCAKKzB4MDAsIDB4MjEsIDB4NDEsIDB4ODEsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDgsIDB4ODMsIDB4MjAsIDB4NDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHhiMCwgMHhiNSwgMHgwNywgMHgxYywgMHgwMSwgMHgyMywgMHhmOCwgMHgxZCwgCisweDY5LCAweDMwLCAweDAzLCAweDczLCAweDFlLCAweDQ4LCAweGMyLCAweDFkLCAweDc5LCAweDMyLCAweDU0LCAweDhhLCAKKzB4NjEsIDB4MWMsIDB4NTEsIDB4ODIsIDB4ZDUsIDB4OGEsIDB4MDAsIDB4MjEsIDB4YWMsIDB4NDIsIDB4MDQsIDB4ZGIsIAorMHhjNCwgMHgxZCwgMHg4OSwgMHgzNCwgMHg2MywgMHg3MCwgMHg1MSwgMHg4MiwgMHhkMSwgMHg4MywgMHgwMSwgMHgyMywgCisweDliLCAweDA3LCAweDNhLCAweDZkLCAweDFhLCAweDQzLCAweDEyLCAweDY4LCAweGMwLCAweDQ2LCAweGJhLCAweDYxLCAKKzB4ZmIsIDB4NjksIDB4OWEsIDB4NDIsIDB4MDYsIDB4ZDEsIDB4ZjgsIDB4NmMsIDB4MTIsIDB4NDksIDB4YzAsIDB4NDYsIAorMHgwOCwgMHg2MCwgMHhiMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg3OSwgMHg2MSwgMHg0MSwgMHg2OSwgCisweGZhLCAweDZjLCAweDkxLCAweDQzLCAweDQxLCAweDYxLCAweDAxLCAweDIwLCAweDAwLCAweDA1LCAweGMxLCAweDYwLCAKKzB4MzgsIDB4NjksIDB4MDIsIDB4MjgsIDB4ZjEsIDB4ZDAsIDB4YjgsIDB4NjksIDB4ZjksIDB4NjksIDB4NDEsIDB4MWEsIAorMHgwMSwgMHhkNSwgMHg3OCwgMHg2ZCwgMHg0MSwgMHgxOCwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHgwZSwgMHhmOCwgCisweGY5LCAweDY5LCAweDA5LCAweDE4LCAweGY5LCAweDYxLCAweDc4LCAweDZkLCAweDgxLCAweDQyLCAweGUyLCAweGQzLCAKKzB4MDgsIDB4MWEsIDB4ZjgsIDB4NjEsIDB4ZGYsIDB4ZTcsIDB4MDAsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHhmOCwgMHhiNSwgMHgwNCwgMHgxYywgMHgwZiwgMHgxYywgMHhmZiwgMHgyMywgCisweDIxLCAweDMzLCAweDlmLCAweDQyLCAweDAxLCAweGQ5LCAweGZmLCAweDI3LCAweDIxLCAweDM3LCAweGUxLCAweDZlLCAKKzB4MzgsIDB4MWMsIDB4MDEsIDB4ZjAsIDB4Y2IsIDB4ZmMsIDB4MmQsIDB4NGQsIDB4MDAsIDB4MjgsIDB4MTMsIDB4ZDEsIAorMHhlMCwgMHgxZCwgMHg0OSwgMHgzMCwgMHgwMSwgMHg3YSwgMHgwMSwgMHgyMywgMHgxOSwgMHg0MywgMHgwMSwgMHg3MiwgCisweDI5LCAweDRhLCAweGMwLCAweDQ2LCAweDAwLCAweDkyLCAweDI5LCAweDQ4LCAweDAxLCAweDZkLCAweDQyLCAweDZkLCAKKzB4MDAsIDB4MjAsIDB4MmIsIDB4MWMsIDB4MDEsIDB4ZjAsIDB4YjAsIDB4ZmMsIDB4MDAsIDB4MjAsIDB4ZjgsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgyMCwgMHg2OSwgMHgwMSwgMHgzMCwgMHgyMCwgMHg2MSwgMHgyMywgMHg0OSwgCisweGM4LCAweDFkLCAweGI5LCAweDMwLCAweDAyLCAweDZiLCAweDkyLCAweDAwLCAweDUxLCAweDE4LCAweGMwLCAweDMxLCAKKzB4MGYsIDB4NjEsIDB4MDEsIDB4NmIsIDB4MDEsIDB4MzEsIDB4ODksIDB4MDcsIDB4ODksIDB4MGYsIDB4MDEsIDB4NjMsIAorMHgyMCwgMHg2YiwgMHhjMiwgMHgxOSwgMHg2MSwgMHg2ZCwgMHg4YSwgMHg0MiwgMHgwMywgMHhkOCwgMHgyMywgMHgyMiwgCisweDEyLCAweDA1LCAweDNhLCAweDQzLCAweDA1LCAweGUwLCAweDA5LCAweDFhLCAweDdlLCAweDFhLCAweDA3LCAweGQxLCAKKzB4MjMsIDB4MjIsIDB4MTIsIDB4MDUsIDB4MGEsIDB4NDMsIDB4MDAsIDB4OTIsIDB4NjEsIDB4NmUsIDB4MDksIDB4MTgsIAorMHhhMiwgMHg2ZSwgMHgxMCwgMHhlMCwgMHgxMSwgMHgyMiwgMHg1MiwgMHgwNSwgMHgwYSwgMHg0MywgMHgwMCwgMHg5MiwgCisweDYxLCAweDZlLCAweDA5LCAweDE4LCAweDAwLCAweDIwLCAweGEyLCAweDZlLCAweDJiLCAweDFjLCAweDAxLCAweGYwLCAKKzB4N2QsIDB4ZmMsIDB4MjMsIDB4MjIsIDB4MTIsIDB4MDUsIDB4MzIsIDB4NDMsIDB4MDAsIDB4OTIsIDB4NjEsIDB4NmUsIAorMHhhMiwgMHg2ZSwgMHgwMCwgMHgyMCwgMHgyYiwgMHgxYywgMHgwMSwgMHhmMCwgMHg3MywgMHhmYywgMHgyMCwgMHg2YiwgCisweGMwLCAweDE5LCAweDAwLCAweDA5LCAweDAwLCAweDAxLCAweDYxLCAweDZkLCAweDgxLCAweDQyLCAweDAwLCAweGQ4LCAKKzB4NDAsIDB4MWEsIDB4MjAsIDB4NjMsIDB4MzgsIDB4MWMsIDB4YjgsIDB4ZTcsIAorMHg0NCwgMHg4MCwgMHgyMCwgMHg0MCwgMHgwNCwgMHgwMCwgMHgxYiwgMHgwMiwgMHg3YywgMHgyOSwgMHgwMCwgMHg4MCwgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDgwLCAweGI1LCAweDAxLCAweDIwLCAweGMwLCAweDAzLCAweDBkLCAweDQ5LCAKKzB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIDB4MGMsIDB4NDksIDB4YzgsIDB4MWQsIDB4NDksIDB4MzAsIDB4MDIsIDB4N2EsIAorMHgwMCwgMHgyNywgMHgwMCwgMHgyYSwgMHgwMywgMHhkMCwgMHgwNywgMHg3MiwgMHgwOCwgMHgxYywgMHhmZiwgMHhmNywgCisweDM3LCAweGZmLCAweDA4LCAweDQ5LCAweGM4LCAweDFkLCAweDQ5LCAweDMwLCAweDAyLCAweDdhLCAweDAwLCAweDJhLCAKKzB4MDMsIDB4ZDAsIDB4MDcsIDB4NzIsIDB4MDgsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4MmQsIDB4ZmYsIDB4ODAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHg2NCwgMHgyZCwgMHgwMCwgMHg4MCwgCisweGU0LCAweDJjLCAweDAwLCAweDgwLCAweDkwLCAweGI1LCAweDA3LCAweDFjLCAweDEwLCAweDIwLCAweDE4LCAweDQ5LCAKKzB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIDB4ZjgsIDB4NjgsIDB4MDEsIDB4MzAsIDB4ZjgsIDB4NjAsIDB4MTYsIDB4NDgsIAorMHhjNCwgMHgxZCwgMHhiOSwgMHgzNCwgMHg2MSwgMHg2YiwgMHg4OSwgMHgwMCwgMHgwOSwgMHgxOCwgMHhjMCwgMHgzMSwgCisweDA5LCAweDY5LCAweDdhLCAweDY4LCAweDkyLCAweDAwLCAweGQyLCAweDE5LCAweDUxLCAweDY0LCAweDYxLCAweDZiLCAKKzB4ODksIDB4MDAsIDB4MDgsIDB4MTgsIDB4YzAsIDB4MzAsIDB4MDEsIDB4NjksIDB4NzgsIDB4NjgsIDB4ODAsIDB4MDAsIAorMHhjMCwgMHgxOSwgMHhjMCwgMHg2YiwgMHgwMSwgMHhmMCwgMHhhMiwgMHhmYSwgMHgwMSwgMHgyMywgMHg3OCwgMHg2OCwgCisweDU4LCAweDQwLCAweDc4LCAweDYwLCAweDYwLCAweDZiLCAweDAxLCAweDMwLCAweDgwLCAweDA3LCAweDgwLCAweDBmLCAKKzB4NjAsIDB4NjMsIDB4ZjgsIDB4MWQsIDB4MTksIDB4MzAsIDB4NDAsIDB4NzksIDB4MDAsIDB4MjgsIDB4MDIsIDB4ZDEsIAorMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHgwNywgMHhmOCwgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDAwLCAweDAwLCAweDAwLCAweGIwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDkwLCAweGI1LCAweDA3LCAweDFjLCAKKzB4MzksIDB4NDgsIDB4YzAsIDB4NjgsIDB4MDAsIDB4MjgsIDB4MDUsIDB4ZDAsIDB4YjgsIDB4NmEsIDB4YzAsIDB4NjgsIAorMHg4MCwgMHgwOSwgMHgwMSwgMHhkMywgMHgwMiwgMHgyMCwgMHgwMCwgMHhlMCwgMHg3OCwgMHg2ZiwgMHhmYywgMHhmNywgCisweDU5LCAweGY4LCAweDA0LCAweDFjLCAweDA2LCAweGQxLCAweDAxLCAweDIwLCAweGY5LCAweDFkLCAweDE5LCAweDMxLCAKKzB4MDgsIDB4NzEsIDB4OTAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4ZjgsIDB4NmMsIDB4MmYsIDB4NDksIAorMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHhiYSwgMHg2YSwgMHgzOCwgMHgxYywgMHgyMSwgMHgxYywgMHgwMCwgMHhmMCwgCisweDU5LCAweGY4LCAweDY3LCAweDYyLCAweDAwLCAweDI4LCAweDAzLCAweGQxLCAweDIwLCAweDFjLCAweDAwLCAweGYwLCAKKzB4MGIsIDB4ZmQsIDB4ZWMsIDB4ZTcsIDB4ZjksIDB4NmQsIDB4MDksIDB4NjgsIDB4MDksIDB4MTgsIDB4MDksIDB4MDksIAorMHgwOSwgMHgwMSwgMHg3YSwgMHg2ZCwgMHg4YSwgMHg0MiwgMHgwMCwgMHhkOCwgMHg4OSwgMHgxYSwgMHhhMSwgMHg2MiwgCisweGI5LCAweDY4LCAweDg5LCAweDAwLCAweGM5LCAweDE5LCAweDRhLCAweDZjLCAweDAwLCAweDJhLCAweDA3LCAweGQwLCAKKzB4NGEsIDB4NmMsIDB4MTIsIDB4MWEsIDB4NGEsIDB4NjQsIDB4ODAsIDB4MDgsIDB4ODAsIDB4MDAsIDB4YjksIDB4NmEsIAorMHgwOCwgMHgxOCwgMHhiOCwgMHg2MiwgMHgzOCwgMHg2OCwgMHhiOSwgMHg2YSwgMHg4MCwgMHgwMCwgMHhjMCwgMHgxOSwgCisweDQyLCAweDZiLCAweDkxLCAweDQyLCAweDBlLCAweGQzLCAweDAwLCAweDIxLCAweDQxLCAweDY0LCAweGI4LCAweDZhLCAKKzB4MzksIDB4NjgsIDB4ODksIDB4MDAsIDB4YzksIDB4MTksIDB4NDksIDB4NmIsIDB4NDAsIDB4MWEsIDB4YjgsIDB4NjIsIAorMHhiOSwgMHg2OCwgMHg4OSwgMHgwMCwgMHhjOSwgMHgxOSwgMHhjOSwgMHg2YiwgMHg0MCwgMHgxOCwgMHhiOCwgMHg2MiwgCisweGI4LCAweDY4LCAweDgxLCAweDAwLCAweGM5LCAweDE5LCAweDQ5LCAweDZjLCAweDAwLCAweDI5LCAweGI4LCAweGQxLCAKKzB4YjksIDB4NmEsIDB4ZmEsIDB4NmIsIDB4OTEsIDB4NDIsIDB4YjQsIDB4ZDAsIDB4M2EsIDB4NmMsIDB4OTEsIDB4NDIsIAorMHhiMSwgMHhkMCwgMHgwMSwgMHgyMywgMHg1OCwgMHg0MCwgMHhiOCwgMHg2MCwgMHg4MCwgMHgwMCwgMHhjMCwgMHgxOSwgCisweGMwLCAweDZiLCAweGMwLCAweDQ2LCAweGI4LCAweDYyLCAweGY4LCAweDY4LCAweDAwLCAweDI4LCAweDAxLCAweGQwLCAKKzB4MDEsIDB4MzgsIDB4ZjgsIDB4NjAsIDB4MzgsIDB4NjksIDB4MDAsIDB4MjgsIDB4YTEsIDB4ZDAsIDB4MDEsIDB4MzgsIAorMHgzOCwgMHg2MSwgMHg5ZSwgMHhlNywgMHg2OCwgMHgxOSwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgCisweGY3LCAweGI1LCAweDkwLCAweGIwLCAweDA0LCAweDFjLCAweDBkLCAweDFjLCAweDAwLCAweDIwLCAweDA1LCAweDkwLCAKKzB4MDIsIDB4OTAsIDB4MDAsIDB4MjIsIDB4MDEsIDB4OTIsIDB4ZjksIDB4NDgsIDB4YzAsIDB4NmEsIDB4YzAsIDB4NDYsIAorMHhhOCwgMHg2MSwgMHhhMCwgMHg2OCwgMHg4MSwgMHgwMCwgMHgwOSwgMHgxOSwgMHg0OSwgMHg2YiwgMHhjMCwgMHg0NiwgCisweDIwLCAweDYwLCAweGUxLCAweDYyLCAweDEyLCAweDlhLCAweGQwLCAweDY4LCAweGMwLCAweDQ2LCAweGE4LCAweDYwLCAKKzB4MTIsIDB4OWEsIDB4NTEsIDB4NzgsIDB4YzAsIDB4NDYsIDB4MGMsIDB4OTEsIDB4ZjAsIDB4NDgsIDB4YzAsIDB4NDYsIAorMHgwMywgMHg5MCwgMHhkNywgMHgxZCwgMHgwOSwgMHgzNywgMHhlMCwgMHg2YSwgCisweGMxLCAweDFiLCAweDA5LCAweDA5LCAweGUzLCAweDFkLCAweDE5LCAweDMzLCAweDBjLCAweDlhLCAweGMwLCAweDQ2LCAKKzB4MGYsIDB4OTMsIDB4ZWIsIDB4NGIsIDB4YzAsIDB4NDYsIDB4MGUsIDB4OTMsIDB4OTEsIDB4NDIsIDB4MDEsIDB4ZDMsIAorMHhiOCwgMHg0MiwgMHgyMSwgMHhkOCwgMHhlMSwgMHg2OCwgMHgwMiwgMHgyOSwgMHgxZSwgMHhkMiwgMHgwMSwgMHgyMCwgCisweDBmLCAweDk5LCAweGMwLCAweDQ2LCAweDQ4LCAweDcxLCAweDAwLCAweDIwLCAweDAzLCAweDk5LCAweDAxLCAweGYwLCAKKzB4NTcsIDB4ZmIsIDB4MDAsIDB4MjgsIDB4MDMsIDB4ZDEsIDB4MGUsIDB4OWIsIDB4ZDgsIDB4NmIsIDB4MDEsIDB4MzAsIAorMHhkOCwgMHg2MywgMHgwMSwgMHgyMCwgMHg4MCwgMHgwNiwgMHgwMCwgMHgyNywgMHg2OCwgMHg2MCwgMHhhZiwgMHg2MSwgCisweGRkLCAweDRhLCAweGMwLCAweDQ2LCAweDAwLCAweDkyLCAweGRkLCAweDQ4LCAweDAxLCAweDZkLCAweDQyLCAweDZkLCAKKzB4ZGMsIDB4NGIsIDB4MDAsIDB4MjAsIDB4MDEsIDB4ZjAsIDB4M2EsIDB4ZmIsIDB4MzgsIDB4MWMsIDB4NWMsIDB4ZTMsIAorMHhiOCwgMHg0MiwgMHgwMywgMHhkOCwgMHgyMCwgMHgxYywgMHgwMCwgMHhmMCwgMHg3YiwgMHhmYywgMHgwNywgMHgxYywgCisweGQ3LCAweDQ4LCAweGMwLCAweDY4LCAweDAwLCAweDI4LCAweDY0LCAweGQwLCAweDM4LCAweDc4LCAweDQwLCAweDA3LCAKKzB4NDAsIDB4MGYsIDB4MDMsIDB4MjgsIDB4NjAsIDB4ZDEsIDB4MDUsIDB4OTgsIDB4MDEsIDB4MzAsIDB4MDAsIDB4MDYsIAorMHgwMCwgMHgwZSwgMHgwNSwgMHg5MCwgMHgzOCwgMHg3OCwgMHhmMCwgMHgyMywgMHgxOCwgMHg0MCwgMHg1OCwgMHhkMSwgCisweGUwLCAweDZhLCAweGMwLCAweDFiLCAweDAwLCAweDA5LCAweDBjLCAweDk5LCAweDg4LCAweDQyLCAweDAyLCAweGQyLCAKKzB4ZTAsIDB4NjgsIDB4MDIsIDB4MjgsIDB4MDUsIDB4ZDMsIDB4Y2IsIDB4NDksIDB4ODgsIDB4NjgsIDB4MDAsIDB4ZjAsIAorMHg4MywgMHhmZiwgMHgwNiwgMHgxYywgMHgwNiwgMHhkMSwgMHgwMywgMHg5YiwgMHgyOCwgMHgxYywgMHgzOSwgMHgxYywgCisweDIyLCAweDFjLCAweDAwLCAweGYwLCAweDhiLCAweGZjLCAweDE2LCAweGUxLCAweDJlLCAweDYyLCAweGY4LCAweDY4LCAKKzB4MDAsIDB4MjgsIDB4MGQsIDB4ZDAsIDB4YjgsIDB4ODksIDB4MDAsIDB4MjgsIDB4MDMsIDB4ZDAsIDB4YzEsIDB4NDksIAorMHhjOSwgMHg2OCwgMHgwMCwgMHhmMCwgMHg3MCwgMHhmZiwgMHhmOCwgMHg4OSwgMHgwMCwgMHgyOCwgMHgwMywgMHhkMCwgCisweGJkLCAweDQ5LCAweGM5LCAweDY4LCAweDAwLCAweGYwLCAweDY5LCAweGZmLCAweDdhLCAweDY4LCAweGMwLCAweDQ2LCAKKzB4NzIsIDB4NjEsIDB4YjksIDB4NjgsIDB4YzAsIDB4NDYsIDB4YjEsIDB4NjEsIDB4MzAsIDB4MWMsIDB4YjgsIDB4NDksIAorMHgwOSwgMHg2OCwgMHgwMCwgMHhmMCwgMHg1ZSwgMHhmZiwgMHgwMCwgMHgyOCwgMHgxNywgMHhkMSwgMHgzMCwgMHgxYywgCisweGI0LCAweDQ5LCAweDQ5LCAweDY4LCAweDAwLCAweGYwLCAweDU3LCAweGZmLCAweDEwLCAweDM3LCAweGUwLCAweDZhLCAKKzB4YjgsIDB4NDIsIDB4MDMsIDB4ZDgsIDB4MjAsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MjcsIDB4ZmMsIDB4MDcsIDB4MWMsIAorMHg2OCwgMHg2OCwgMHhhZiwgMHg0YiwgMHgxOCwgMHg0MywgMHg2OCwgMHg2MCwgMHgwMCwgMHgyMCwgMHhhOCwgMHg2MSwgCisweGFjLCAweDIzLCAweGE4LCAweDY4LCAweDk4LCAweDQzLCAweGE4LCAweDYwLCAweGIwLCAweGUwLCAweGE4LCAweDY5LCAKKzB4YTgsIDB4MjgsIDB4MDEsIDB4ZDIsIDB4YTgsIDB4MjAsIDB4YTgsIDB4NjEsIDB4MTAsIDB4MzcsIDB4ZTAsIDB4NmEsIAorMHhiOCwgMHg0MiwgMHg2YywgMHhkOCwgMHg5YywgMHhlMCwgMHhhNSwgMHhlMCwgMHhhNCwgMHhlMCwgMHgxMCwgMHgyOCwgCisweDY4LCAweGQxLCAweDAzLCAweDIzLCAweDFiLCAweDA3LCAweDY4LCAweDY4LCAweDE4LCAweDQwLCAweDAxLCAweDBmLCAKKzB4NDgsIDB4MDEsIDB4NDAsIDB4MWEsIDB4ODAsIDB4MDAsIDB4YTAsIDB4NGEsIDB4ODIsIDB4MTgsIDB4MDEsIDB4OTIsIAorMHg3OCwgMHg4OCwgMHg0MiwgMHgwYiwgMHgzMSwgMHhkMywgMHg4MiwgMHgwYiwgMHgyZiwgMHhkMywgMHg5ZCwgMHg0OCwgCisweGMwLCAweDQ2LCAweDAzLCAweDkwLCAweDAyLCAweDIwLCAweDAxLCAweDlhLCAweGMwLCAweDQ2LCAweDEwLCAweDgwLCAKKzB4NzgsIDB4ODgsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MGQsIDB4MDEsIDB4OWEsIDB4YzAsIDB4NDYsIDB4NTAsIDB4NjAsIAorMHhiOCwgMHg2OCwgMHgwMSwgMHg5YSwgMHhjMCwgMHg0NiwgMHg5MCwgMHg2MCwgMHg3OCwgMHg2OCwgMHgwMSwgMHg5YSwgCisweGMwLCAweDQ2LCAweDEwLCAweDYyLCAweDAwLCAweDIwLCAweDAxLCAweDlhLCAweGMwLCAweDQ2LCAweDkwLCAweDY0LCAKKzB4MDEsIDB4OWEsIDB4YzAsIDB4NDYsIDB4OTAsIDB4NjMsIDB4ODgsIDB4MDIsIDB4OGYsIDB4NDksIDB4NDAsIDB4MTgsIAorMHgwMSwgMHg5YSwgMHhjMCwgMHg0NiwgMHg1MCwgMHg2MywgMHgwMSwgMHg5YSwgMHg1MCwgMHg2OCwgMHgzNiwgMHgzMCwgCisweDk0LCAweDI4LCAweDAxLCAweGQ4LCAweDM4LCAweDIwLCAweDAwLCAweGUwLCAweDk0LCAweDIwLCAweGE4LCAweDYxLCAKKzB4MTAsIDB4MzcsIDB4ZTAsIDB4NmEsIDB4YjgsIDB4NDIsIDB4MjgsIDB4ZDgsIDB4NTgsIDB4ZTAsIDB4N2EsIDB4ODgsIAorMHg5MiwgMHgwYiwgMHgwMywgMHhkMywgMHg4NSwgMHg0OCwgMHhjMCwgMHg0NiwgMHgwMywgMHg5MCwgMHgyMywgMHhlMCwgCisweDAxLCAweDIyLCAweDEyLCAweDAzLCAweDAyLCAweDQwLCAweDgzLCAweDRiLCAweDFkLCAweGQwLCAweDAzLCAweDkzLCAKKzB4MDAsIDB4MDUsIDB4MDAsIDB4MGQsIDB4MDEsIDB4OWEsIDB4YzAsIDB4NDYsIDB4NTAsIDB4NjAsIDB4YjgsIDB4NjgsIAorMHgwMSwgMHg5YSwgMHhjMCwgMHg0NiwgMHg5MCwgMHg2MCwgMHg3OCwgMHg2OCwgMHgwMSwgMHg5YSwgMHhjMCwgMHg0NiwgCisweDEwLCAweDYyLCAweDAwLCAweDIwLCAweDAxLCAweDlhLCAweGMwLCAweDQ2LCAKKzB4OTAsIDB4NjQsIDB4MDEsIDB4OWEsIDB4YzAsIDB4NDYsIDB4OTAsIDB4NjMsIDB4ODgsIDB4MDIsIDB4NzUsIDB4NDksIAorMHg0MCwgMHgxOCwgMHgwMSwgMHg5YSwgMHhjMCwgMHg0NiwgMHg1MCwgMHg2MywgMHgwMiwgMHhlMCwgMHgzMywgMHhlMCwgCisweDJhLCAweGUwLCAweDAzLCAweDkzLCAweDAxLCAweDIwLCAweDBmLCAweDk5LCAweGMwLCAweDQ2LCAweDQ4LCAweDcxLCAKKzB4MTIsIDB4OWEsIDB4NTAsIDB4NzgsIDB4MDUsIDB4OTksIDB4NDMsIDB4MWEsIDB4MGIsIDB4OTMsIDB4MTAsIDB4MzcsIAorMHhlMCwgMHg2YSwgMHhiOCwgMHg0MiwgMHgwMywgMHhkOCwgMHgyMCwgMHgxYywgMHgwMCwgMHhmMCwgMHg5MiwgMHhmYiwgCisweDA3LCAweDFjLCAweDAxLCAweDlhLCAweDUwLCAweDZiLCAweDkxLCAweDZiLCAweDA5LCAweDAxLCAweDQwLCAweDE4LCAKKzB4MGIsIDB4OWIsIDB4MjEsIDB4MWMsIDB4M2EsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4N2QsIDB4ZmIsIDB4MDEsIDB4OWEsIAorMHhjMCwgMHg0NiwgMHhkMCwgMHg2NCwgMHgwMSwgMHg5YSwgMHgwYiwgMHg5YiwgMHhjMCwgMHg0NiwgMHgxMywgMHg2NSwgCisweDAxLCAweDIzLCAweDViLCAweDA2LCAweDY4LCAweDY4LCAweDE4LCAweDQzLCAweDY4LCAweDYwLCAweDAwLCAweDIwLCAKKzB4YTgsIDB4NjEsIDB4MGQsIDB4ZTAsIDB4MTAsIDB4MzcsIDB4ZTAsIDB4NmEsIDB4YjgsIDB4NDIsIDB4MDMsIDB4ZDgsIAorMHgyMCwgMHgxYywgMHgwMCwgMHhmMCwgMHg3MSwgMHhmYiwgMHgwNywgMHgxYywgMHgzOCwgMHg3OCwgMHg0MCwgMHgwNywgCisweDQwLCAweDBmLCAweDAzLCAweDI4LCAweDAwLCAweGQxLCAweGY4LCAweGU2LCAweGE4LCAweDY5LCAweDAzLCAweDk5LCAKKzB4MDEsIDB4ZjAsIDB4MjYsIDB4ZmEsIDB4MDAsIDB4MjgsIDB4MmEsIDB4ZDEsIDB4MzgsIDB4MWMsIDB4MjEsIDB4MWMsIAorMHgwMCwgMHhmMCwgMHg3OSwgMHhmYiwgMHhhOCwgMHg2OCwgMHg4MCwgMHgwOSwgMHgwNCwgMHhkMywgMHgzMCwgMHgxYywgCisweDQ5LCAweDQ5LCAweDQ5LCAweDY4LCAweDAwLCAweGYwLCAweDgxLCAweGZlLCAweDQxLCAweDQ5LCAweDAwLCAweDIwLCAKKzB4MDEsIDB4ZjAsIDB4MTQsIDB4ZmEsIDB4MDAsIDB4MjgsIDB4MDQsIDB4ZDEsIDB4MGUsIDB4OWIsIDB4ZDgsIDB4NmIsIAorMHgwMSwgMHgzMCwgMHhkOCwgMHg2MywgMHgxMSwgMHhlMCwgMHgwMSwgMHgyMCwgMHgwZiwgMHg5OSwgMHhjMCwgMHg0NiwgCisweDQ4LCAweDcxLCAweDgwLCAweDA2LCAweDAwLCAweDI3LCAweDY4LCAweDYwLCAweGFmLCAweDYxLCAweDNhLCAweDRhLCAKKzB4YzAsIDB4NDYsIDB4MDAsIDB4OTIsIDB4MzksIDB4NDgsIDB4MDEsIDB4NmQsIDB4NDIsIDB4NmQsIDB4MzksIDB4NGIsIAorMHgwMCwgMHgyMCwgMHgwMSwgMHhmMCwgMHhmMywgMHhmOSwgMHgwMCwgMHgyMCwgMHgxNSwgMHhlMiwgMHgwNSwgMHg5OCwgCisweDBjLCAweDk5LCAweDA4LCAweDFhLCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDBjLCAweDkwLCAweDBiLCAweDkwLCAKKzB4MGMsIDB4OTgsIDB4MDAsIDB4MjgsIDB4MDMsIDB4ZDAsIDB4MDEsIDB4MjAsIDB4MGYsIDB4OTksIDB4YzAsIDB4NDYsIAorMHg0OCwgMHg3MSwgMHgyOCwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwNCwgMHg5MCwgMHgwMCwgMHgyNiwgMHgwMCwgMHgyMCwgCisweDA4LCAweDkwLCAweDAwLCAweDIyLCAweDBhLCAweDkyLCAweDBjLCAweDk4LCAweDAxLCAweDM4LCAweDBkLCAweDkwLCAKKzB4YTMsIDB4ZTAsIDB4NzgsIDB4ODgsIDB4OGEsIDB4MWIsIDB4MTIsIDB4MDQsIDB4MTIsIDB4MGMsIDB4OTAsIDB4NDIsIAorMHgwNSwgMHhkZCwgMHgwNywgMHg5MiwgMHg4MCwgMHgxYSwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgMHgwOCwgMHg5MCwgCisweDAwLCAweGUwLCAweDA3LCAweDkwLCAweDA4LCAweDk4LCAweDAwLCAweDI4LCAweDA3LCAweGQxLCAweDBkLCAweDk4LCAKKzB4MGEsIDB4OWEsIDB4OTAsIDB4NDIsIDB4MDcsIDB4ZGQsIDB4MDcsIDB4OTgsIDB4MzAsIDB4MTgsIDB4ODgsIDB4NDIsIAorMHgwMywgMHhkOCwgMHgwMSwgMHgyMCwgMHg0MCwgMHgwNSwgMHgwNiwgMHg5MCwgMHgxYywgMHhlMCwgMHgxMSwgMHgyMCwgCisweDQwLCAweDA1LCAweDA2LCAweDkwLCAweGE4LCAweDY4LCAweDhjLCAweDIzLCAweDE4LCAweDQwLCAweDAyLCAweGQxLCAKKzB4MjAsIDB4NDgsIDB4YzAsIDB4NDYsIDB4MDYsIDB4OTAsIDB4YjEsIDB4MDcsIDB4ODksIDB4MGYsIDB4MGYsIDB4ZDAsIAorMHgwNywgMHg5OCwgMHhjMCwgMHgwNiwgMHhjMCwgMHgwZSwgMHgwOCwgMHhkMCwgMHgxZSwgMHgyOCwgMHgwOSwgMHhkYiwgCisweDFlLCAweDI4LCAweDAyLCAweGQxLCAweDAzLCAweDI5LCAweDA1LCAweGQxLCAweDAxLCAweGUwLCAweDAyLCAweDI5LCAKKzB4MDIsIDB4ZDMsIDB4MDEsIDB4MjAsIDB4MDIsIDB4OTAsIDB4ZGUsIDB4ZTcsIDB4MGEsIDB4OWEsIDB4MDAsIDB4MmEsIAorMHgwNCwgMHhkMSwgMHgwMSwgMHgyMywgMHhkYiwgMHgwNSwgMHgwNiwgMHg5OCwgMHgxOCwgMHg0MywgMHgwNiwgMHg5MCwgCisweDA3LCAweDk4LCAweDA2LCAweDk5LCAweDA4LCAweDQzLCAweDAyLCAweDFjLCAweDAwLCAweDkwLCAweDA0LCAweDk4LCAKKzB4ODMsIDB4MTksIDB4MWQsIDB4ZTAsIDB4ZTgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MDEsIDB4NDksIDB4ZmYsIDB4ZmYsIAorMHgyOCwgMHgwZiwgMHgwMCwgMHg4MCwgMHgwNCwgMHgwMCwgMHgxMiwgMHgwMiwgMHg3YywgMHgyOSwgMHgwMCwgMHg4MCwgCisweDQ0LCAweDgwLCAweDIwLCAweDQwLCAweDY4LCAweDE5LCAweDAwLCAweDgwLCAweDYwLCAweDA0LCAweDAwLCAweDgwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4NWMsIDB4MmIsIDB4MDAsIDB4ODAsIDB4NTUsIDB4MzIsIDB4ZmYsIDB4ZmYsIAorMHhhYywgMHg1ZSwgMHgyMSwgMHg0MCwgMHgwZCwgMHgzZCwgMHhmZiwgMHhmZiwgMHhjZCwgMHgzMSwgMHhmZiwgMHhmZiwgCisweDAwLCAweDAwLCAweDMyLCAweDAyLCAweDAwLCAweDIwLCAweDNhLCAweDFkLCAweDA2LCAweGNhLCAweDAxLCAweGYwLCAKKzB4NmIsIDB4ZjksIDB4MDcsIDB4OTgsIDB4MzYsIDB4MTgsIDB4MDIsIDB4OTgsIAorMHgwMCwgMHgyOCwgMHgxNiwgMHhkMCwgMHhhOCwgMHg2OCwgMHg4YywgMHgyMywgMHgxOCwgMHg0MCwgMHgwNCwgMHhkMSwgCisweDA5LCAweDIzLCAweDViLCAweDA0LCAweDA2LCAweDk4LCAweDE4LCAweDQzLCAweDA2LCAweDkwLCAweDA2LCAweDk4LCAKKzB4YzIsIDB4NGEsIDB4MDIsIDB4NDMsIDB4MDAsIDB4OTIsIDB4MDQsIDB4OTgsIDB4ODMsIDB4MTksIDB4YzEsIDB4NDgsIAorMHgwMSwgMHg2ZCwgMHg0MiwgMHg2ZCwgMHgwMCwgMHgyMCwgMHgwMSwgMHhmMCwgMHg1MSwgMHhmOSwgMHgwMCwgMHgyMCwgCisweDAyLCAweDkwLCAweDA4LCAweDk4LCAweDAwLCAweDI4LCAweDBiLCAweGQxLCAweDBiLCAweDliLCAweDAxLCAweDNiLCAKKzB4MGIsIDB4OTMsIDB4MTAsIDB4MzcsIDB4ZTAsIDB4NmEsIDB4YjgsIDB4NDIsIDB4MGMsIDB4ZDgsIDB4MjAsIDB4MWMsIAorMHgwMCwgMHhmMCwgMHg4YSwgMHhmYSwgMHgwNywgMHgxYywgMHgwNywgMHhlMCwgMHg3OCwgMHg2OCwgMHgwNywgMHg5YSwgCisweDgwLCAweDE4LCAweDc4LCAweDYwLCAweDc4LCAweDg4LCAweDA3LCAweDlhLCAweDgwLCAweDFhLCAweDc4LCAweDgwLCAKKzB4MGEsIDB4OWEsIDB4NTAsIDB4MWMsIDB4MDIsIDB4MDQsIDB4MTIsIDB4MGMsIDB4MGEsIDB4OTIsIDB4MGMsIDB4OTgsIAorMHgwYSwgMHg5YSwgMHg4MiwgMHg0MiwgMHgwMywgMHhkYSwgMHhhOSwgMHg2OSwgMHhiMSwgMHg0MiwgMHgwMCwgMHhkOSwgCisweDUzLCAweGU3LCAweGE4LCAweDY5LCAweGIwLCAweDQyLCAweDZiLCAweGQxLCAweGE4LCAweDY4LCAweDAxLCAweDA5LCAKKzB4NjksIDB4ZDIsIDB4MDgsIDB4OWEsIDB4MDAsIDB4MmEsIDB4NTYsIDB4ZDAsIDB4MGMsIDB4OTksIDB4MGEsIDB4OWEsIAorMHg4YSwgMHg0MiwgMHgzZSwgMHhkYiwgMHhiMSwgMHgwNywgMHg4OSwgMHgwZiwgMHgwYywgMHhkMCwgMHgwOCwgMHg5YSwgCisweGQyLCAweDA2LCAweGQyLCAweDBlLCAweDBiLCAweGQwLCAweDFlLCAweDJhLCAweDA2LCAweGRiLCAweDFlLCAweDJhLCAKKzB4MDIsIDB4ZDEsIDB4MDMsIDB4MjksIDB4MDUsIDB4ZDAsIDB4MDEsIDB4ZTAsIDB4MDIsIDB4MjksIDB4MDIsIDB4ZDIsIAorMHgwMiwgMHg5OSwgMHgwMCwgMHgyOSwgMHgyMSwgMHhkMCwgMHgwOCwgMHg5YSwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MiwgCisweDA0LCAweDk4LCAweDgzLCAweDE5LCAweDAwLCAweDIwLCAweDNhLCAweDFkLCAweDA2LCAweGNhLCAweDAxLCAweGYwLCAKKzB4MDEsIDB4ZjksIDB4MDgsIDB4OTgsIDB4MzYsIDB4MTgsIDB4YTgsIDB4NjgsIDB4OGMsIDB4MjMsIDB4MTgsIDB4NDAsIAorMHgwMiwgMHhkMCwgMHgwMSwgMHgyMCwgMHg0MCwgMHgwNiwgMHgwMCwgMHhlMCwgMHg5MiwgMHg0OCwgMHgwMSwgMHgyMiwgCisweDAyLCAweDQzLCAweDAwLCAweDkyLCAweDA0LCAweDk4LCAweDgzLCAweDE5LCAweDhlLCAweDQ4LCAweDAxLCAweDZkLCAKKzB4NDIsIDB4NmQsIDB4MDAsIDB4MjAsIDB4MDEsIDB4ZjAsIDB4ZWMsIDB4ZjgsIDB4MDAsIDB4MjAsIDB4MDIsIDB4OTAsIAorMHgxNSwgMHhlMCwgMHg4YywgMHgyMywgMHgxOCwgMHg0MCwgMHgwMiwgMHhkMCwgMHgwMSwgMHgyMCwgMHg0MCwgMHgwNiwgCisweDAwLCAweGUwLCAweDg4LCAweDQ4LCAweDA4LCAweDlhLCAweDAyLCAweDQzLCAweDAwLCAweGUwLCAweDA4LCAweDlhLCAKKzB4YzAsIDB4NDYsIDB4MDAsIDB4OTIsIDB4MDQsIDB4OTgsIDB4ODMsIDB4MTksIDB4MDAsIDB4MjAsIDB4M2EsIDB4MWQsIAorMHgwNiwgMHhjYSwgMHgwMSwgMHhmMCwgMHhkNSwgMHhmOCwgMHgwOCwgMHg5OCwgMHgzNiwgMHgxOCwgMHgxMCwgMHgzNywgCisweGUwLCAweDZhLCAweGI4LCAweDQyLCAweDAzLCAweGQ4LCAweDIwLCAweDFjLCAweDAwLCAweGYwLCAweDE0LCAweGZhLCAKKzB4MDcsIDB4MWMsIDB4NjgsIDB4NjgsIDB4ODAsIDB4MGUsIDB4NmIsIDB4ZDIsIDB4MGEsIDB4OTgsIDB4YzAsIDB4NDYsIAorMHgwOSwgMHg5MCwgMHgwYywgMHg5OSwgMHg4OCwgMHg0MiwgMHg1YywgMHhkYSwgMHgwZCwgMHg5OCwgMHgwOSwgMHg5OSwgCisweDg4LCAweDQyLCAweDAzLCAweGQwLCAweDdhLCAweDg4LCAweDFlLCAweGUwLCAweDVmLCAweGUwLCAweDVlLCAweGUwLCAKKzB4NzgsIDB4ODgsIDB4MDEsIDB4MjIsIDB4NTIsIDB4MDYsIDB4MDIsIDB4NDMsIDB4YTksIDB4NjgsIDB4OGMsIDB4MjMsIAorMHgxOSwgMHg0MCwgMHgwMiwgMHhkMSwgMHgwOSwgMHgyMywgMHg1YiwgMHgwNCwgMHgxYSwgMHg0MywgMHhiMSwgMHgwNywgCisweDg5LCAweDBmLCAweDBlLCAweGQwLCAweGMzLCAweDA2LCAweGRiLCAweDBlLCAweDA4LCAweGQwLCAweDFlLCAweDJiLCAKKzB4MDksIDB4ZGIsIDB4MWUsIDB4MmIsIDB4MDIsIDB4ZDEsIDB4MDMsIDB4MjksIDB4MDUsIDB4ZDEsIDB4MDEsIDB4ZTAsIAorMHgwMiwgMHgyOSwgMHgwMiwgMHhkMywgMHgwMSwgMHgyMSwgMHgwMiwgMHg5MSwgMHgwMiwgMHgxYywgMHgwOSwgMHg5OCwgCisweDAwLCAweDI4LCAweDAyLCAweGQxLCAweDAxLCAweDIzLCAweGRiLCAweDA1LCAweDFhLCAweDQzLCAweDAwLCAweDkyLCAKKzB4MDQsIDB4OTgsIDB4ODMsIDB4MTksIDB4MDAsIDB4MjAsIDB4M2EsIDB4MWQsIDB4MDYsIDB4Y2EsIDB4MDEsIDB4ZjAsIAorMHg4ZiwgMHhmOCwgMHg3OCwgMHg4OCwgMHg4NiwgMHgxOSwgMHgxMCwgMHgzNywgMHgwMiwgMHg5OCwgMHgwMCwgMHgyOCwgCisweDE0LCAweGQwLCAweGE4LCAweDY4LCAweDhjLCAweDIzLCAweDE4LCAweDQwLCAweDAyLCAweGQwLCAweDAxLCAweDIwLCAKKzB4NDAsIDB4MDYsIDB4MDAsIDB4ZTAsIDB4NTcsIDB4NDgsIDB4MDEsIDB4MjIsIDB4MDIsIDB4NDMsIDB4MDAsIDB4OTIsIAorMHgwNCwgMHg5OCwgMHg4MywgMHgxOSwgMHg1MywgMHg0OCwgMHgwMSwgMHg2ZCwgMHg0MiwgMHg2ZCwgMHgwMCwgMHgyMCwgCisweDAxLCAweGYwLCAweDc2LCAweGY4LCAweDAwLCAweDIwLCAweDAyLCAweDkwLCAweGUwLCAweDZhLCAweGI4LCAweDQyLCAKKzB4MDMsIDB4ZDgsIDB4MjAsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4YjYsIDB4ZjksIDB4MDcsIDB4MWMsIDB4MDksIDB4OTgsIAorMHgwMSwgMHgzMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgMHgwOSwgMHg5MCwgCisweDBjLCAweDk5LCAweDg4LCAweDQyLCAweGEyLCAweGRiLCAweDY4LCAweDY4LCAweDMwLCAweDQzLCAweDAxLCAweDA0LCAKKzB4MDksIDB4MGMsIDB4NjgsIDB4NjAsIDB4ZTgsIDB4NmEsIDB4MDAsIDB4ZjAsIDB4N2IsIDB4ZmEsIDB4MjgsIDB4ZTAsIAorMHgyNywgMHhlMCwgMHhhOCwgMHg2OCwgMHgwMCwgMHgwOSwgMHgxNCwgMHhkMywgMHg2OCwgMHg2OCwgMHg4MCwgMHgwZSwgCisweDE1LCAweGQyLCAweDAxLCAweDlhLCAweDAwLCAweDJhLCAweDEyLCAweGQwLCAweDAxLCAweDlhLCAweDUwLCAweDZiLCAKKzB4MGIsIDB4OWIsIDB4MjEsIDB4MWMsIDB4M2EsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4ODksIDB4ZjksIDB4MDEsIDB4OWEsIAorMHhjMCwgMHg0NiwgMHg5MCwgMHg2NCwgMHgwMSwgMHg5YSwgMHgwYiwgMHg5YiwgMHhjMCwgMHg0NiwgMHg5MywgMHg2MywgCisweDAzLCAweGUwLCAweGU4LCAweDZhLCAweDMxLCAweDFjLCAweDAwLCAweGYwLCAweDVkLCAweGZhLCAweDY4LCAweDY4LCAKKzB4MzAsIDB4NDMsIDB4NjgsIDB4NjAsIDB4YTgsIDB4NjksIDB4YjAsIDB4NDIsIDB4MDUsIDB4ZDksIDB4MDAsIDB4MDQsIAorMHgwMCwgMHgwYywgMHg4MCwgMHgxYiwgMHgwMCwgMHhmMCwgMHhlZSwgMHhmOSwgMHhhZSwgMHg2MSwgMHhhOCwgMHg2OCwgCisweDhjLCAweDIzLCAweDE4LCAweDQwLCAweDBiLCAweGQwLCAweDJmLCAweDRhLCAweGMwLCAweDQ2LCAweDAwLCAweDkyLCAKKzB4MDQsIDB4OTgsIDB4YzMsIDB4MWYsIDB4MDUsIDB4M2IsIDB4MmEsIDB4NDgsIDB4MDEsIDB4NmQsIDB4NDIsIDB4NmQsIAorMHgwMCwgMHgyMCwgMHgwMSwgMHhmMCwgMHgyMywgMHhmOCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgyMCwgMHg2ZCwgCisweDE4LCAweDQzLCAweDAwLCAweDY4LCAweGMwLCAweDQ2LCAweGEwLCAweDYxLCAweGUxLCAweDY5LCAweDgxLCAweDQyLCAKKzB4MTIsIDB4ZDAsIDB4MjIsIDB4NjksIDB4MDIsIDB4MmEsIDB4MGYsIDB4ZDIsIDB4NDEsIDB4MWEsIDB4MDEsIDB4ZDUsIAorMHg2MCwgMHg2ZCwgMHg0MSwgMHgxOCwgMHgyMCwgMHgxYywgMHhmZiwgMHhmNywgMHgzZiwgMHhmYiwgMHhlMSwgMHg2OSwgCisweDQwLCAweDE4LCAweGUwLCAweDYxLCAweDYxLCAweDZkLCAweDg4LCAweDQyLCAweDI0LCAweGQzLCAweDQwLCAweDFhLCAKKzB4ZTAsIDB4NjEsIDB4MjEsIDB4ZTAsIDB4ODEsIDB4NDIsIDB4MWYsIDB4ZDEsIDB4MjAsIDB4NjksIDB4MDIsIDB4MjgsIAorMHgxYywgMHhkMiwgMHgwMSwgMHgyMCwgMHg2MCwgMHg2MSwgMHgxOCwgMHg0OCwgMHg0MSwgMHg2OSwgMHhlMiwgMHg2YywgCisweDBhLCAweDQzLCAweDQyLCAweDYxLCAweDgxLCAweDY5LCAweGUzLCAweDZjLCAweDk5LCAweDQzLCAweDgxLCAweDYxLCAKKzB4MDEsIDB4MjEsIDB4MDksIDB4MDUsIDB4Y2EsIDB4NjAsIDB4ODAsIDB4NjksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjEsIAorMHg4YiwgMHgwMiwgMHgyMCwgMHg2ZCwgMHgxOCwgMHg0MywgMHgwMCwgMHg2OCwgMHhjMCwgMHg0NiwgMHhhMCwgMHg2MSwgCisweGUxLCAweDY5LCAweDgxLCAweDQyLCAweDAyLCAweGQwLCAweDIwLCAweDFjLCAweGZmLCAweGY3LCAweGNjLCAweGZhLCAKKzB4MjgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MGYsIDB4ZjksIDB4MGMsIDB4OTgsIDB4MDUsIDB4OTksIDB4NDAsIDB4MTgsIAorMHgwMCwgMHgwMSwgMHgxMCwgMHgzMCwgMHg2OCwgMHg2MSwgMHgxMywgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDdjLCAweDI5LCAweDAwLCAweDgwLCAKKzB4MDAsIDB4MDAsIDB4MTIsIDB4MDIsIDB4MDQsIDB4MDAsIDB4NTIsIDB4MDIsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHhmMCwgMHhiNSwgMHg0MCwgMHgyMCwgMHgyZCwgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHgwMCwgMHhmMCwgCisweDAzLCAweGY5LCAweDA3LCAweDFjLCAweDgxLCAweDY5LCAweDQ0LCAweDZhLCAweGEwLCAweDZmLCAweDAwLCAweGYwLCAKKzB4NDUsIDB4ZmUsIDB4MDAsIDB4MjAsIDB4ZTEsIDB4MWQsIDB4MTksIDB4MzEsIDB4NDgsIDB4NzEsIDB4NzksIDB4NjgsIAorMHhjOSwgMHgwZSwgMHgwOSwgMHhkMywgMHhmOCwgMHg2YSwgMHgwMCwgMHgwMSwgMHgyNCwgMHg0OSwgMHg0MCwgMHgxOCwgCisweDI0LCAweDRiLCAweGMwLCAweDE4LCAweDAxLCAweDY4LCAweDAxLCAweDM5LCAweDAxLCAweDYwLCAweDM2LCAweGUwLCAKKzB4ZTEsIDB4NmQsIDB4MDksIDB4NjgsIDB4MjIsIDB4NmUsIDB4YzAsIDB4NDYsIDB4MTEsIDB4NjAsIDB4MjAsIDB4NGUsIAorMHhmNSwgMHgxZCwgMHg3OSwgMHgzNSwgMHgwMSwgMHgyMywgMHhlOSwgMHg2YiwgMHgxOSwgMHg0MywgMHhlOSwgMHg2MywgCisweGI5LCAweDZhLCAweGUyLCAweDZkLCAweGMwLCAweDQ2LCAweDExLCAweDYwLCAweGI5LCAweDZhLCAweDIyLCAweDZlLCAKKzB4YzAsIDB4NDYsIDB4MTEsIDB4NjAsIDB4NjEsIDB4NjksIDB4MDAsIDB4MjksIDB4MDQsIDB4ZDEsIDB4YTksIDB4NmIsIAorMHgwMSwgMHgzMSwgMHhhOSwgMHg2MywgMHgwOCwgMHgyOSwgMHgwNywgMHhkMywgMHhhOCwgMHg2MywgMHgwMSwgMHgyMCwgCisweDAwLCAweGYwLCAweDg2LCAweGY4LCAweGU4LCAweDZiLCAweDQwLCAweDA4LCAweDQwLCAweDAwLCAweGU4LCAweDYzLCAKKzB4NzgsIDB4NjgsIDB4ODEsIDB4MGUsIDB4MGYsIDB4ZDIsIDB4MGIsIDB4MjMsIDB4MWIsIDB4MDIsIDB4ZjEsIDB4MTgsIAorMHhjOSwgMHg2OCwgMHgwMCwgMHgyOSwgMHgwNiwgMHhkMCwgMHgwMCwgMHgwOCwgMHgwNCwgMHhkMiwgMHgyMCwgMHgxYywgCisweDM5LCAweDFjLCAweDAwLCAweGYwLCAweDQzLCAweGY4LCAweDAyLCAweGUwLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAKKzB4MDUsIDB4ZmEsIDB4MzgsIDB4MWMsIDB4ZmIsIDB4ZjcsIDB4MDYsIDB4ZmMsIDB4MjAsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHgwYiwgMHhmOCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgCisweGEwLCAweDFjLCAweDAwLCAweDgwLCAweGI0LCAweDBjLCAweDAwLCAweDAwLCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ODAsIDB4YjUsIDB4MDcsIDB4MWMsIDB4ZjgsIDB4MWQsIDB4MTksIDB4MzAsIAorMHgwMSwgMHg3OSwgMHgwMCwgMHgyOSwgMHgwNCwgMHhkMCwgMHgwMCwgMHgyMSwgMHgwMSwgMHg3MSwgMHgzOCwgMHgxYywgCisweGZmLCAweGY3LCAweDU2LCAweGZiLCAweGY4LCAweDY4LCAweDAyLCAweDI4LCAweDBkLCAweGQwLCAweGI4LCAweDY4LCAKKzB4ODAsIDB4MDAsIDB4YzIsIDB4MTksIDB4NTAsIDB4NmMsIDB4MDAsIDB4MjgsIDB4MTEsIDB4ZDAsIDB4YjgsIDB4NmEsIAorMHg0MSwgMHg3OCwgMHgwOSwgMHgwMSwgMHgxMCwgMHgzMSwgMHg1MiwgMHg2YiwgMHgxMCwgMHgxYSwgMHg4OCwgMHg0MiwgCisweDA1LCAweGQzLCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAweDQyLCAweGZiLCAweDgwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MzgsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4MjgsIDB4ZmEsIDB4ZjgsIDB4ZTcsIDB4NzgsIDB4NjgsIAorMHg4MCwgMHgwMCwgMHhjMCwgMHgxOSwgMHhjMCwgMHg2YiwgMHhjMCwgMHg0NiwgMHhiOCwgMHg2MiwgMHhmMSwgMHhlNywgCisweGIwLCAweGI1LCAweDg3LCAweGIwLCAweDBmLCAweDFjLCAweDgwLCAweDZmLCAweGMwLCAweDQ2LCAweDAwLCAweDkwLCAKKzB4MDAsIDB4MjQsIDB4MTMsIDB4NGQsIDB4MGIsIDB4MjMsIDB4MWIsIDB4MDIsIDB4ZTgsIDB4MTgsIDB4ODAsIDB4NjksIAorMHgwMCwgMHgyOCwgMHgxNywgMHhkMCwgMHg2OSwgMHg0NiwgMHhhMiwgMHgwMCwgMHg1MiwgMHgxOSwgMHgwYiwgMHgyMywgCisweDFiLCAweDAyLCAweGQyLCAweDE4LCAweDkyLCAweDY5LCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDkyLCAweGZiLCAKKzB4MDAsIDB4MjgsIDB4MDksIDB4ZDEsIDB4MDEsIDB4MzQsIDB4YTAsIDB4MDAsIDB4NDAsIDB4MTksIDB4MGIsIDB4MjMsIAorMHgxYiwgMHgwMiwgMHhjMCwgMHgxOCwgMHg4MCwgMHg2OSwgMHgwMCwgMHgyOCwgMHhlYSwgMHhkMSwgMHgwMSwgMHhlMCwgCisweDAxLCAweDI4LCAweDAyLCAweGQwLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDlkLCAweGY5LCAweDA3LCAweGIwLCAKKzB4YjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHhiOCwgMHhiNSwgMHhjMiwgMHgwNywgMHhkMiwgMHgwZiwgMHgxNiwgMHg0YywgMHgxNiwgMHg0OSwgMHgwMSwgMHhkMCwgCisweDA4LCAweDIyLCAweDA4LCAweGUwLCAweDgyLCAweDA4LCAweDA1LCAweGQzLCAweDBjLCAweDIyLCAweGE0LCAweDE4LCAKKzB4MGIsIDB4NjgsIDB4ZGYsIDB4MWQsIDB4MTUsIDB4MzcsIDB4MDMsIDB4ZTAsIDB4MWMsIDB4MjIsIDB4MGIsIDB4NjgsIAorMHhkZiwgMHgxZCwgMHgwOSwgMHgzNywgMHgwZiwgMHg0YiwgMHgxZCwgMHg3OCwgMHgwMCwgMHgyZCwgMHgxMywgMHhkMCwgCisweDViLCAweDc4LCAweDAwLCAweDJiLCAweDEwLCAweGQwLCAweDAxLCAweDIzLCAweDViLCAweDA2LCAweDFhLCAweDQzLCAKKzB4MDAsIDB4MjgsIDB4MDEsIDB4ZDEsIDB4NWIsIDB4MDgsIDB4MWEsIDB4NDMsIDB4MDAsIDB4OTIsIDB4NGEsIDB4NjgsIAorMHgwMSwgMHgyMCwgMHgzOSwgMHgxYywgMHgyMywgMHgxYywgMHgwMCwgMHhmMCwgMHhkZiwgMHhmZSwgMHhiOCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAzLCAweDIzLCAweDFiLCAweDA2LCAweDFhLCAweDQzLCAweGYxLCAweGU3LCAKKzB4OTAsIDB4ZWUsIDB4MjAsIDB4NDAsIDB4N2MsIDB4MjksIDB4MDAsIDB4ODAsIDB4ZjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHgwMCwgMHgyMSwgMHhjMSwgMHg2MSwgMHgwNSwgMHg0OSwgMHg4YSwgMHg2OCwgMHgwMCwgMHgyYSwgMHgwMSwgMHhkMSwgCisweDg4LCAweDYwLCAweDAyLCAweGUwLCAweGNhLCAweDY4LCAweGMwLCAweDQ2LCAweGQwLCAweDYxLCAweGM4LCAweDYwLCAKKzB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MGYsIDB4MDAsIDB4ODAsIDB4MDMsIDB4NDksIDB4ODgsIDB4NjgsIAorMHgwMCwgMHgyOCwgMHgwMiwgMHhkMCwgMHhjMiwgMHg2OSwgMHhjMCwgMHg0NiwgMHg4YSwgMHg2MCwgMHg3MCwgMHg0NywgCisweDI4LCAweDBmLCAweDAwLCAweDgwLCAweDAxLCAweDFjLCAweDAxLCAweDIzLCAweDg4LCAweDY4LCAweDU4LCAweDQwLCAKKzB4ODgsIDB4NjAsIDB4Y2EsIDB4NjgsIDB4MDEsIDB4M2EsIDB4Y2EsIDB4NjAsIDB4MGEsIDB4NjksIDB4MDEsIDB4M2EsIAorMHg4MCwgMHgwMCwgMHgwYSwgMHg2MSwgMHg0MiwgMHgxOCwgMHhkMCwgMHg2YiwgMHg1MywgMHg2YiwgMHhjMCwgMHg0NiwgCisweGNiLCAweDYyLCAweDBiLCAweDY4LCAweDliLCAweDAwLCAweDU5LCAweDE4LCAweDQ5LCAweDZjLCAweDUzLCAweDZjLCAKKzB4YzksIDB4MTgsIDB4NTEsIDB4NjQsIDB4NzAsIDB4NDcsIDB4OGEsIDB4NjgsIDB4OTIsIDB4MDAsIDB4NTIsIDB4MTgsIAorMHhkMywgMHg2YiwgMHg4MywgMHg0MiwgMHgxNywgMHhkMSwgMHhkMCwgMHgxZCwgMHgzZCwgMHgzMCwgMHgwYSwgMHg2OCwgCisweDkyLCAweDAwLCAweDUyLCAweDE4LCAweDUyLCAweDZjLCAweDAzLCAweDY4LCAweDlhLCAweDFhLCAweDAyLCAweDYwLCAKKzB4MDEsIDB4MjMsIDB4ODgsIDB4NjgsIDB4NTgsIDB4NDAsIDB4ODgsIDB4NjAsIDB4Y2EsIDB4NjgsIDB4MDEsIDB4MzIsIAorMHhjYSwgMHg2MCwgMHgwYSwgMHg2OSwgMHgwMSwgMHgzMiwgMHg4MCwgMHgwMCwgMHg0MCwgMHgxOCwgMHgwYSwgMHg2MSwgCisweDQwLCAweDZiLCAweGMwLCAweDQ2LCAweGM4LCAweDYyLCAweDcwLCAweDQ3LCAweGI4LCAweGI1LCAweDA0LCAweDFjLCAKKzB4MWQsIDB4MWMsIDB4MTcsIDB4MWMsIDB4MDgsIDB4MWMsIDB4MzksIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4ZDksIDB4ZmYsIAorMHgwMCwgMHgyMCwgMHgyOSwgMHgxYywgMHgwMCwgMHhmMCwgMHg3YywgMHhmZSwgMHgwMSwgMHgyMCwgMHhmOSwgMHgxZCwgCisweDE5LCAweDMxLCAweDQ4LCAweDcxLCAweDgwLCAweDA2LCAweDYwLCAweDYwLCAweDAwLCAweDIwLCAweGEwLCAweDYxLCAKKzB4MDYsIDB4NGEsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTIsIDB4MDYsIDB4NDgsIAorMHgwMSwgMHg2ZCwgMHg0MiwgMHg2ZCwgMHgwNSwgMHg0YiwgMHgwMCwgMHgyMCwgMHgwMCwgMHhmMCwgMHg2MiwgMHhmZSwgCisweGI4LCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDEyLCAweDAyLCAKKzB4N2MsIDB4MjksIDB4MDAsIDB4ODAsIDB4NDQsIDB4ODAsIDB4MjAsIDB4NDAsIDB4MDYsIDB4NDksIDB4MGEsIDB4NjgsIAorMHgxMCwgMHgxOCwgMHgwOCwgMHg2MCwgMHgwMSwgMHgyMywgMHg1YiwgMHgwMiwgMHg5OCwgMHg0MiwgMHgwMywgMHhkOSwgCisweDAzLCAweDQ5LCAweDBhLCAweDc5LCAweDAxLCAweDMyLCAweDBhLCAweDcxLCAweDcwLCAweDQ3LCAweDAwLCAweDAwLCAKKzB4ZTQsIDB4MmQsIDB4MDAsIDB4ODAsIDB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MDgsIDB4ODAsIDB4MDAsIAorMHgwNiwgMHg0OSwgMHgwYSwgMHg2OCwgMHgxMCwgMHgxOCwgMHgwOCwgMHg2MCwgMHgwMSwgMHgyMywgMHg1YiwgMHgwMiwgCisweDk4LCAweDQyLCAweDAzLCAweGQ5LCAweDAzLCAweDQ5LCAweDBhLCAweDc5LCAweDAxLCAweDMyLCAweDBhLCAweDcxLCAKKzB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4ZTQsIDB4MmQsIDB4MDAsIDB4ODAsIDB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIAorMHgwMywgMHgzMCwgMHg4MCwgMHgwOCwgMHg4MCwgMHgwMCwgMHgwNiwgMHg0OSwgMHgwYSwgMHg2OCwgMHgxMCwgMHgxOCwgCisweDA4LCAweDYwLCAweDAxLCAweDIzLCAweDViLCAweDAyLCAweDk4LCAweDQyLCAweDAzLCAweGQ5LCAweDAzLCAweDQ5LCAKKzB4MGEsIDB4NzksIDB4MDEsIDB4MzIsIDB4MGEsIDB4NzEsIDB4NzAsIDB4NDcsIDB4ZTQsIDB4MmQsIDB4MDAsIDB4ODAsIAorMHhhMCwgMHg4MiwgMHgyMCwgMHg0MCwgMHgwMiwgMHg0OCwgMHg0MSwgMHg3OSwgMHgwMSwgMHgzMSwgMHg0MSwgMHg3MSwgCisweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweGEwLCAweDgyLCAweDIwLCAweDQwLCAweDkwLCAweGI0LCAweDgyLCAweDAwLCAKKzB4MTcsIDB4NGIsIDB4OWEsIDB4NTgsIDB4OGIsIDB4MDcsIDB4MDIsIDB4ZDAsIDB4ODksIDB4MDgsIDB4MGIsIDB4MWQsIAorMHgwMSwgMHhlMCwgMHg4OSwgMHgwOCwgMHhjYiwgMHgxYywgMHgxMSwgMHg2OSwgMHhkNywgMHg2OCwgMHgxMiwgMHg0YywgCisweDgwLCAweDAwLCAweDIwLCAweDU4LCAweDQwLCAweDY4LCAweGI5LCAweDQyLCAweDAzLCAweGQxLCAweDgxLCAweDQyLCAKKzB4MTksIDB4ZDksIDB4MTEsIDB4NjgsIDB4MTcsIDB4ZTAsIDB4MDAsIDB4MjQsIDB4YjksIDB4NDIsIDB4MDksIDB4ZDksIAorMHg4MSwgMHg0MiwgMHgxMiwgMHhkOSwgMHgxMSwgMHg2OCwgMHg3OCwgMHgxYSwgMHgwMCwgMHhkNSwgMHgwMywgMHgzMCwgCisweDgwLCAweDEwLCAweDk4LCAweDQyLCAweDBiLCAweGQ4LCAweDA3LCAweGUwLCAweDgxLCAweDQyLCAweDA1LCAweGQ4LCAKKzB4NzgsIDB4MWEsIDB4MDAsIDB4ZDUsIDB4MDMsIDB4MzAsIDB4ODAsIDB4MTAsIDB4OTgsIDB4NDIsIDB4MDIsIDB4ZDgsIAorMHgyMCwgMHgxYywgMHg5MCwgMHhiYywgMHg3MCwgMHg0NywgMHhjOCwgMHgxZCwgMHgwNSwgMHgzMCwgMHhmYSwgMHhlNywgCisweDcwLCAweDA0LCAweDAwLCAweDgwLCAweDgwLCAweGI1LCAweDgwLCAweDAwLCAweDBmLCAweDRhLCAweDE3LCAweDU4LCAKKzB4ODgsIDB4MDcsIDB4MDIsIDB4ZDAsIDB4ODgsIDB4MDgsIDB4MDQsIDB4MzAsIDB4MDEsIDB4ZTAsIDB4ODgsIDB4MDgsIAorMHgwMywgMHgzMCwgMHgzOSwgMHg2OSwgMHg3YSwgMHg2OCwgMHg5MSwgMHg0MiwgMHgwOSwgMHhkOSwgMHgzOSwgMHg2OCwgCisweGMwLCAweDQ2LCAweDM5LCAweDYxLCAweGY5LCAweDY4LCAweDdhLCAweDY4LCAweDkxLCAweDQyLCAweDAyLCAweGQ5LCAKKzB4MzksIDB4NjgsIDB4YzAsIDB4NDYsIDB4ZjksIDB4NjAsIDB4ODEsIDB4MDAsIDB4MzgsIDB4NjksIDB4MDAsIDB4ZjAsIAorMHhkMSwgMHhmZCwgMHgzOCwgMHg2MSwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgCisweDcwLCAweDA0LCAweDAwLCAweDgwLCAweDkwLCAweGI1LCAweDAzLCAweDIxLCAweDA5LCAweDA3LCAweDAxLCAweDQwLCAKKzB4MGMsIDB4MGYsIDB4MDEsIDB4MDQsIDB4MDksIDB4MGMsIDB4MDEsIDB4MjIsIDB4OTIsIDB4MDcsIDB4MDIsIDB4NDAsIAorMHhhMywgMHgwMCwgMHgxYywgMHg0ZiwgMHhmZiwgMHg1OCwgMHg4OSwgMHgwNywgMHg4OSwgMHgwZiwgMHgwMCwgMHgwNCwgCisweDAwLCAweDBjLCAweDgwLCAweDA4LCAweDAwLCAweDI5LCAweDAwLCAweGQwLCAweDAxLCAweDMwLCAweDAwLCAweDJhLCAKKzB4MDEsIDB4ZDAsIDB4MDIsIDB4MzAsIDB4MDAsIDB4ZTAsIDB4MDMsIDB4MzAsIDB4ZjksIDB4NjgsIDB4N2EsIDB4NjgsIAorMHg5MSwgMHg0MiwgMHgwMiwgMHhkOSwgMHgzOSwgMHg2OCwgMHhjMCwgMHg0NiwgMHhmOSwgMHg2MCwgMHg4MSwgMHgwMCwgCisweGY4LCAweDY4LCAweDAwLCAweGYwLCAweGE1LCAweGZkLCAweGY4LCAweDYwLCAweDBmLCAweDQ4LCAweDAwLCAweDY5LCAKKzB4MDAsIDB4MjgsIDB4MDUsIDB4ZDAsIDB4MDEsIDB4MjAsIDB4YTAsIDB4NDAsIDB4MDIsIDB4ZDAsIDB4MjAsIDB4MWMsIAorMHhmZSwgMHhmNywgMHhjYSwgMHhmYywgMHgwYiwgMHg0OSwgMHhjOCwgMHgxZCwgMHgxOSwgMHgzMCwgMHgwMywgMHg3OSwgCisweDAwLCAweDIyLCAweDAwLCAweDJiLCAweDA1LCAweGQxLCAweDA5LCAweDQ5LCAweGM4LCAweDFkLCAweDE5LCAweDMwLCAKKzB4MDMsIDB4NzksIDB4MDAsIDB4MmIsIDB4MDMsIDB4ZDAsIDB4MDIsIDB4NzEsIDB4MDgsIDB4MWMsIDB4ZmYsIDB4ZjcsIAorMHg3OSwgMHhmOSwgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg3MCwgMHgwNCwgMHgwMCwgMHg4MCwgCisweGQwLCAweDJjLCAweDAwLCAweDgwLCAweDY0LCAweDJkLCAweDAwLCAweDgwLCAweGU0LCAweDJjLCAweDAwLCAweDgwLCAKKzB4YjAsIDB4YjUsIDB4MmIsIDB4NDksIDB4MDksIDB4NzksIDB4MDAsIDB4MjksIDB4MDMsIDB4ZDEsIDB4NDEsIDB4NjgsIAorMHgyOSwgMHg0YiwgMHgxOSwgMHg0MywgMHg0MSwgMHg2MCwgMHg4MSwgMHg2OCwgCisweDQ5LCAweDA4LCAweDAyLCAweGQzLCAweDA5LCAweDIxLCAweDA5LCAweDA0LCAweDAxLCAweGUwLCAweDBkLCAweDIxLCAKKzB4MDksIDB4MDQsIDB4MGMsIDB4YzgsIDB4MDgsIDB4MzgsIDB4MTksIDB4NDMsIDB4ODcsIDB4NjgsIDB4YmIsIDB4MGEsIAorMHgwMywgMHhkMywgMHg0MywgMHg2OCwgMHg1YiwgMHgwOCwgMHgwMCwgMHhkMywgMHgwMSwgMHgzMSwgMHg0MCwgMHg2OCwgCisweDAzLCAweDIzLCAweDFiLCAweDA3LCAweDE4LCAweDQwLCAweDA3LCAweDBmLCAweGY4LCAweDAwLCAweDFkLCAweDRjLCAKKzB4MDAsIDB4MTksIDB4MjMsIDB4NjgsIDB4YzAsIDB4MTgsIDB4NTAsIDB4MzAsIDB4MDAsIDB4NzksIDB4MDEsIDB4MjgsIAorMHgxMCwgMHhkMSwgMHg2MCwgMHg2OCwgMHgwMSwgMHgyOCwgMHgwZCwgMHhkMCwgMHgxMCwgMHgxYywgMHgwMCwgMHhmMCwgCisweDcxLCAweGY4LCAweDM4LCAweDAxLCAweDAwLCAweDE5LCAweDE5LCAweDIzLCAweGRiLCAweDAxLCAweGMwLCAweDE4LCAKKzB4NDEsIDB4NmIsIDB4MDEsIDB4MzksIDB4NDEsIDB4NjMsIDB4YjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHgzOCwgMHgwMSwgMHgwMCwgMHgxOSwgMHgxOSwgMHgyMywgMHhkYiwgMHgwMSwgMHhjMCwgMHgxOCwgMHgwMywgMHg2YiwgCisweDVkLCAweDFjLCAweDA1LCAweDYzLCAweGJkLCAweDAyLCAweDJkLCAweDE5LCAweGRiLCAweDAwLCAweGViLCAweDE4LCAKKzB4ODAsIDB4MzMsIDB4MTksIDB4NjMsIDB4ZGEsIDB4NjIsIDB4ODEsIDB4NmIsIDB4MDEsIDB4MzEsIDB4ODEsIDB4NjMsIAorMHgwMSwgMHgyMSwgMHhiOSwgMHg0MCwgMHgyMiwgMHg2OCwgMHgxMSwgMHg0MywgMHgyMSwgMHg2MCwgMHgwMSwgMHg2YiwgCisweDgwLCAweDI5LCAweGUyLCAweGQzLCAweDAwLCAweDIxLCAweDAxLCAweDYzLCAweGRmLCAweGU3LCAweDAwLCAweDAwLCAKKzB4MjgsIDB4MGYsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4YTAsIDB4MWMsIDB4MDAsIDB4ODAsIAorMHhmMCwgMHhiNSwgMHgxZiwgMHg0ZSwgMHg3MCwgMHg2OCwgMHgwMCwgMHgyOCwgMHgzNiwgMHhkMSwgMHgwMCwgMHgyNCwgCisweGIxLCAweDY4LCAweDQ4LCAweDFjLCAweGM5LCAweDAwLCAweDg5LCAweDE5LCAweGIwLCAweDYwLCAweDMyLCAweDY4LCAKKzB4ODksIDB4MTgsIDB4NjAsIDB4MzEsIDB4MGQsIDB4N2IsIDB4MDgsIDB4MjgsIDB4MDAsIDB4ZDMsIDB4YjQsIDB4NjAsIAorMHgyOCwgMHgwMSwgMHg4MCwgMHgxOSwgMHgxOSwgMHgyMywgMHhkYiwgMHgwMSwgMHhjMCwgMHgxOCwgMHg4NywgMHg2YiwgCisweDAwLCAweDJmLCAweDIxLCAweGQwLCAweGMxLCAweDZhLCAweDRiLCAweDFjLCAweGFhLCAweDAyLCAweDkyLCAweDE5LCAKKzB4YzksIDB4MDAsIDB4NTEsIDB4MTgsIDB4ODAsIDB4MzEsIDB4YzMsIDB4NjIsIDB4Y2EsIDB4NmEsIDB4MDksIDB4NmIsIAorMHgwMSwgMHgzZiwgMHg4NywgMHg2MywgMHg4MCwgMHgyYiwgMHgwMCwgMHhkMywgMHhjNCwgMHg2MiwgMHgwMCwgMHgyZiwgCisweDA2LCAweGQxLCAweDAxLCAweDI3LCAweGFmLCAweDQwLCAweDNiLCAweDFjLCAweGRiLCAweDQzLCAweDM3LCAweDY4LCAKKzB4M2IsIDB4NDAsIDB4MzMsIDB4NjAsIDB4NDMsIDB4NmIsIDB4MDEsIDB4M2IsIDB4NDMsIDB4NjMsIDB4MTAsIDB4MWMsIAorMHgzNywgMHgxYywgMHgwMCwgMHhmMCwgMHgwOSwgMHhmOCwgMHg3OCwgMHg2OCwgMHgwMCwgMHgyOCwgMHhjOSwgMHhkMCwgCisweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweGEwLCAweDFjLCAweDAwLCAweDgwLCAKKzB4ZjAsIDB4YjUsIDB4Y2QsIDB4MGYsIDB4ZWQsIDB4MDcsIDB4MDEsIDB4MjQsIDB4MDAsIDB4MjcsIDB4MmUsIDB4NGIsIAorMHgyZSwgMHg0YSwgMHgwMCwgMHgyZCwgMHgxZCwgMHhkMCwgMHhkOCwgMHg2YSwgMHgwMSwgMHgzMCwgMHhkOCwgMHg2MiwgCisweDEwLCAweDFjLCAweDUyLCAweDY5LCAweDAwLCAweDJhLCAweDEyLCAweGQwLCAweDAyLCAweDY5LCAweDUzLCAweDFjLCAKKzB4OTIsIDB4MDAsIDB4MTIsIDB4MTgsIDB4MDMsIDB4NjEsIDB4OTEsIDB4NjEsIDB4NDEsIDB4NjksIDB4MDEsIDB4MzEsIAorMHg0MSwgMHg2MSwgMHgwMiwgMHg2OSwgMHgwZiwgMHgyYSwgMHgwMCwgMHhkMywgMHgwNywgMHg2MSwgMHgwZiwgMHgyOSwgCisweDAwLCAweGQzLCAweDQ0LCAweDYwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDA4LCAweDFjLCAKKzB4ZmYsIDB4ZjcsIDB4ZWUsIDB4ZmUsIDB4ZjgsIDB4ZTcsIDB4MTUsIDB4NjksIDB4NmUsIDB4MWMsIDB4YWQsIDB4MDAsIAorMHhhZCwgMHgxOCwgMHgxNiwgMHg2MSwgMHhhOSwgMHg2MSwgMHg1NSwgMHg2OSwgMHgwMSwgMHgzNSwgMHg1NSwgMHg2MSwgCisweDE2LCAweDY5LCAweDBmLCAweDJlLCAweDAwLCAweGQzLCAweDE3LCAweDYxLCAweDBmLCAweDJkLCAweDAwLCAweGQzLCAKKzB4NTQsIDB4NjAsIDB4OGMsIDB4MDIsIDB4YTQsIDB4MGEsIDB4MTYsIDB4NGYsIDB4M2EsIDB4NmYsIDB4ZmQsIDB4NjgsIAorMHhmOSwgMHgxZCwgMHg3OSwgMHgzMSwgMHgwMSwgMHgyZCwgMHgwYywgMHhkMSwgMHhkYiwgMHg2ZCwgMHg1YiwgMHgwOCwgCisweDA5LCAweGQzLCAweDBiLCAweDg5LCAweDAwLCAweDJiLCAweDA2LCAweGQxLCAweGZkLCAweDZmLCAweDAzLCAweDNiLCAKKzB4MmUsIDB4NjgsIDB4MzMsIDB4NDAsIDB4MmIsIDB4NjAsIDB4MTQsIDB4MjMsIDB4MGIsIDB4ODEsIDB4MTAsIDB4NjAsIAorMHg4MCwgMHgwNywgMHg4MCwgMHgwYSwgMHgyMCwgMHg0MywgMHgwMywgMHgwNCwgMHgwMCwgMHhkMCwgMHgwMSwgMHgzOCwgCisweDUwLCAweDYwLCAweDA5LCAweDZhLCAweDA4LCAweDMyLCAweDkxLCAweDQyLCAweDAwLCAweGQ4LCAweDA3LCAweDRhLCAKKzB4MDAsIDB4MGQsIDB4MDIsIDB4ZDMsIDB4NTEsIDB4MjAsIDB4ODAsIDB4MDMsIDB4ODIsIDB4NjEsIDB4M2EsIDB4NjcsIAorMHhiZSwgMHhlNywgMHgwMCwgMHgwMCwgMHhhNCwgMHgyYSwgMHgwMCwgMHg4MCwgMHhhMCwgMHgxYywgMHgwMCwgMHg4MCwgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDI0LCAweGE3LCAweDIwLCAweDQwLCAKKzB4YjAsIDB4YjUsIDB4MDAsIDB4MjgsIDB4MDQsIDB4ZDEsIDB4MDEsIDB4MjAsIDB4YzAsIDB4MDUsIDB4MTYsIDB4NDksIAorMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHgxNSwgMHg0YywgMHgwMCwgMHgyNSwgMHg2NywgMHg2OSwgMHgwMCwgMHgyZiwgCisweDE2LCAweGQwLCAweGUwLCAweDY4LCAweDQxLCAweDFjLCAweDgwLCAweDAwLCAweDAwLCAweDE5LCAweGUxLCAweDYwLCAKKzB4ODAsIDB4NjksIDB4MDEsIDB4M2YsIDB4ZmYsIDB4ZjcsIDB4OTQsIDB4ZmUsIDB4ZTAsIDB4NjgsIDB4MGYsIDB4MjgsIAorMHgwMCwgMHhkMywgMHhlNSwgMHg2MCwgMHhlMCwgMHg2OCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgxOSwgMHg4MCwgMHg2OSwgCisweDAwLCAweDA4LCAweDAxLCAweGQzLCAweDAwLCAweDJmLCAweGVhLCAweGQxLCAweDY3LCAweDYxLCAweDAzLCAweGUwLCAKKzB4MDgsIDB4NDgsIDB4MDEsIDB4NmQsIDB4MDEsIDB4MzEsIDB4MDEsIDB4NjUsIDB4NjUsIDB4NjAsIDB4MjAsIDB4NjgsIAorMHgwMCwgMHgyOCwgMHgwMSwgMHhkMCwgMHhmZiwgMHhmNywgMHgyNiwgMHhmZiwgMHhiMCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGIwLCAweGEwLCAweDFjLCAweDAwLCAweDgwLCAKKzB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIDB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIDB4YjAsIDB4YjQsIDB4MTAsIDB4MjMsIAorMHg4MiwgMHg2OCwgMHgxMywgMHg0MCwgMHgwMCwgMHgyMSwgMHgwMCwgMHgyYiwgMHgxNSwgMHhkMCwgMHgwYywgMHg0YiwgCisweDFhLCAweDQwLCAweDEyLCAweDAxLCAweDgxLCAweDI0LCAweDE0LCAweDQzLCAweDAyLCAweDY4LCAweDE1LCAweDY4LCAKKzB4MTMsIDB4MWQsIDB4ODAsIDB4Y2IsIDB4MWIsIDB4NjgsIDB4MDQsIDB4M2EsIDB4MDIsIDB4NjAsIDB4MjAsIDB4YzIsIAorMHg4MCwgMHhjMiwgMHgwOCwgMHhjMiwgMHgxNCwgMHg2MCwgMHg0MiwgMHg2OCwgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgCisweDA0LCAweDMyLCAweDFhLCAweDQzLCAweDQyLCAweDYwLCAweDA4LCAweDFjLCAweGIwLCAweGJjLCAweDcwLCAweDQ3LCAKKzB4MDAsIDB4ZjAsIDB4ZmYsIDB4MGYsIDB4ZjAsIDB4YjQsIDB4ODIsIDB4NjgsIDB4NTMsIDB4MDksIDB4MzQsIDB4ZDMsIAorMHgxYiwgMHg0YiwgMHgxYSwgMHg0MCwgMHgxMiwgMHgwMSwgMHg4MSwgMHgyNiwgMHgxNiwgMHg0MywgMHgwMywgMHg2OCwgCisweDFkLCAweDY4LCAweDFmLCAweDFkLCAweDEwLCAweGNmLCAweDNmLCAweDY4LCAweDA0LCAweDNiLCAweDAzLCAweDYwLCAKKzB4MjAsIDB4YzMsIDB4MTAsIDB4YzMsIDB4ODAsIDB4YzMsIDB4MWUsIDB4NjAsIDB4NDMsIDB4NjgsIDB4MWYsIDB4MWQsIAorMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgzYiwgMHg0MywgMHg0MywgMHg2MCwgMHhjYiwgMHg2YiwgMHgxOCwgMHgxZiwgCisweGM4LCAweDYzLCAweDgwLCAweGNiLCAweDgwLCAweGMwLCAweDFjLCAweDY4LCAweDFmLCAweDFkLCAweDAzLCAweDFkLCAKKzB4MDQsIDB4NjAsIDB4MzgsIDB4MWMsIDB4M2YsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MWYsIDB4NjAsIDB4MWYsIDB4MWQsIAorMHg0MywgMHg2OCwgMHgxYywgMHgwNCwgMHgyNCwgMHgwYywgMHg4MSwgMHgyMywgMHgyMywgMHg0MywgMHgzYiwgMHg2MCwgCisweDQwLCAweDY4LCAweDAwLCAweDBjLCAweDAwLCAweDA0LCAweDEwLCAweDQzLCAweDc4LCAweDYwLCAweDA4LCAweDZlLCAKKzB4MDQsIDB4MzAsIDB4MDgsIDB4NjYsIDB4NDgsIDB4NmUsIDB4MDQsIDB4MzAsIDB4NDgsIDB4NjYsIDB4MDAsIDB4MjAsIAorMHhmMCwgMHhiYywgMHg3MCwgMHg0NywgMHgwMCwgMHhmMCwgMHhmZiwgMHgwZiwgMHg4MCwgMHhiNCwgMHg4MSwgMHg2YSwgCisweDAxLCAweDIzLCAweDliLCAweDA3LCAweGNhLCAweDFkLCAweDA1LCAweDMyLCAweDFhLCAweDQzLCAweDEyLCAweDY4LCAKKzB4Y2YsIDB4MWQsIDB4MDEsIDB4MzcsIDB4M2IsIDB4NDMsIDB4MWIsIDB4NjgsIDB4YzAsIDB4NDYsIDB4Y2IsIDB4NjAsIAorMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgwZiwgMHgxZCwgMHgzYiwgMHg0MywgMHgxYiwgMHg2OCwgMHhjMCwgMHg0NiwgCisweDhiLCAweDYwLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDBiLCAweDQzLCAweDFiLCAweDY4LCAweDBjLCAweGMxLCAKKzB4MDIsIDB4NjIsIDB4MDEsIDB4NmIsIDB4YzAsIDB4NDYsIDB4MGEsIDB4NjIsIDB4MDQsIDB4MjMsIDB4ODEsIDB4NjksIAorMHgxOSwgMHg0MywgMHg4MSwgMHg2MSwgMHgwMiwgMHg2YiwgMHhjMCwgMHg0NiwgMHg5MSwgMHg2MSwgMHg4MSwgMHg2YSwgCisweDA0LCAweDMxLCAweDgxLCAweDYyLCAweDAyLCAweDZiLCAweGMwLCAweDQ2LCAweDkxLCAweDYyLCAweGMxLCAweDFkLCAKKzB4MzksIDB4MzEsIDB4NGEsIDB4OGIsIDB4MDQsIDB4M2EsIDB4NGEsIDB4ODMsIDB4NDksIDB4OGIsIDB4MDIsIDB4NmIsIAorMHg0MCwgMHgzMiwgMHg1MSwgMHg4MywgMHhjMSwgMHg4OSwgMHgwNCwgMHgzOSwgMHhjMSwgMHg4MSwgMHhjMSwgMHg2OCwgCisweDAwLCAweDZiLCAweGMwLCAweDQ2LCAweGMxLCAweDYwLCAweDAwLCAweDIwLCAweDgwLCAweGJjLCAweDcwLCAweDQ3LCAKKzB4MDAsIDB4NDcsIDB4MDgsIDB4NDcsIDB4MTAsIDB4NDcsIDB4MTgsIDB4NDcsIDB4MjAsIDB4NDcsIDB4MjgsIDB4NDcsIAorMHgzMCwgMHg0NywgMHgzOCwgMHg0NywgMHgzMCwgMHg0MCwgMHgyZCwgMHhlOSwgMHgwYywgMHhjMCwgMHg5ZCwgMHhlNSwgCisweDBjLCAweDQ4LCAweGEwLCAweGUxLCAweDI0LCAweDQ4LCAweGIwLCAweGUxLCAweDFlLCAweDAwLCAweDAwLCAweDBhLCAKKzB4MDEsIDB4YzAsIDB4NGMsIDB4ZTIsIDB4MTgsIDB4NDAsIDB4YTAsIDB4ZTMsIDB4NjQsIDB4NTEsIDB4OWYsIDB4ZTUsIAorMHg5NCwgMHg1MCwgMHgyMCwgMHhlMCwgMHgwMCwgMHg1MCwgMHg5MCwgMHhlNSwgMHgxNCwgMHg0MCwgMHg5MCwgMHhlNSwgCisweDAwLCAweDMwLCAweDg1LCAweGU1LCAweDA0LCAweGMwLCAweDg1LCAweGU1LCAweDA4LCAweDEwLCAweDg1LCAweGU1LCAKKzB4MGMsIDB4MjAsIDB4ODUsIDB4ZTUsIDB4MTAsIDB4MTAsIDB4OTAsIDB4ZTUsIAorMHgxMCwgMHg1MCwgMHg4NSwgMHhlMiwgMHgwMSwgMHgwMCwgMHg1NSwgMHhlMSwgMHgwYywgMHg1MCwgMHg5MCwgMHg1NSwgCisweDA0LCAweDAwLCAweDU1LCAweGUxLCAweDA1LCAweDAwLCAweDAwLCAweDBhLCAweDA0LCAweDEwLCAweDkwLCAweGU1LCAKKzB4MDAsIDB4NTAsIDB4ODAsIDB4ZTUsIDB4MDAsIDB4NTAsIDB4ODEsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4YTAsIDB4ZTMsIAorMHgzMCwgMHg0MCwgMHhiZCwgMHhlOCwgMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHgwMCwgMHgzMCwgMHg5MywgMHhlNSwgCisweDA4LCAweDIwLCAweDkwLCAweGU1LCAweDAxLCAweDMxLCAweDgzLCAweGUzLCAweDAyLCAweDM2LCAweDgzLCAweGUzLCAKKzB4MDMsIDB4MDAsIDB4NTUsIDB4ZTEsIDB4MTQsIDB4MzAsIDB4ODAsIDB4ZTUsIDB4ZjIsIDB4ZmYsIDB4ZmYsIDB4MWEsIAorMHgwMSwgMHgwMCwgMHhhMCwgMHhlMywgMHhmNCwgMHhmZiwgMHhmZiwgMHhlYSwgMHgwMSwgMHgwNiwgMHgxYywgMHhlMywgCisweGYxLCAweGZmLCAweGZmLCAweDBhLCAweGVjLCAweDEwLCAweDlmLCAweGU1LCAweDAyLCAweGM2LCAweGNjLCAweGUzLCAKKzB4NTQsIDB4MjAsIDB4OTEsIDB4ZTUsIDB4ZTQsIDB4MzAsIDB4OWYsIDB4ZTUsIDB4NTAsIDB4MTAsIDB4OTEsIDB4ZTUsIAorMHhkOSwgMHhmZiwgMHhmZiwgMHhlYSwgMHhmMCwgMHg0NywgMHgyZCwgMHhlOSwgMHgyMCwgMHhjMCwgMHg5ZCwgMHhlNSwgCisweDBjLCAweDY4LCAweGEwLCAweGUxLCAweDI2LCAweDY4LCAweGIwLCAweGUxLCAweDI1LCAweDAwLCAweDAwLCAweDBhLCAKKzB4MTgsIDB4NDAsIDB4YTAsIDB4ZTMsIDB4YjgsIDB4NTAsIDB4OWYsIDB4ZTUsIDB4OTQsIDB4MDAsIDB4MDAsIDB4ZTAsIAorMHgwNSwgMHgwMCwgMHg4MCwgMHhlMCwgMHgwOCwgMHg0MCwgMHg5MCwgMHhlNSwgMHgwNCwgMHg4MCwgMHg5MCwgMHhlNSwgCisweDAwLCAweDcwLCAweGEwLCAweGUzLCAweDFmLCAweGMwLCAweGEwLCAweGUzLCAweDAyLCAweGM0LCAweDhjLCAweGUzLCAKKzB4MDAsIDB4NTAsIDB4OTAsIDB4ZTUsIDB4MTAsIDB4OTAsIDB4OTAsIDB4ZTUsIDB4MTQsIDB4YTAsIDB4OTAsIDB4ZTUsIAorMHgwMCwgMHgzMCwgMHg4NSwgMHhlNSwgMHgwNCwgMHhjMCwgMHg4NSwgMHhlNSwgMHgwOCwgMHgxMCwgMHg4NSwgMHhlNSwgCisweDBjLCAweDIwLCAweDg1LCAweGU1LCAweDEwLCAweDUwLCAweDg1LCAweGUyLCAweDA5LCAweDAwLCAweDU1LCAweGUxLCAKKzB4MGMsIDB4NTAsIDB4OTAsIDB4NTUsIDB4MGEsIDB4MDAsIDB4NTUsIDB4ZTEsIDB4MTUsIDB4MDAsIDB4MDAsIDB4MGEsIAorMHgwMywgMHg3MCwgMHgxNywgMHhlMiwgMHgyMCwgMHgxMCwgMHg4MSwgMHhlMiwgMHgyMCwgMHgzMCwgMHg4MywgMHhlMiwgCisweDBhLCAweDAwLCAweDAwLCAweDBhLCAweDAwLCAweDYwLCAweDk2LCAweGUyLCAweDAxLCAweDcwLCAweDg3LCAweGUyLCAKKzB4MDksIDB4MDAsIDB4MDAsIDB4MGEsIDB4MjAsIDB4NjAsIDB4NDYsIDB4ZTIsIDB4MjAsIDB4MDAsIDB4NTYsIDB4ZTMsIAorMHhlYywgMHhmZiwgMHhmZiwgMHhjYSwgMHgwMCwgMHg3MCwgMHhhMCwgMHhlMywgMHgwMSwgMHhjMCwgMHg0NiwgMHhlMiwgCisweDAyLCAweGM0LCAweDhjLCAweGUzLCAweDAwLCAweDYwLCAweGEwLCAweGUzLCAweGU3LCAweGZmLCAweGZmLCAweGVhLCAKKzB4MDAsIDB4NTAsIDB4ODgsIDB4ZTUsIDB4ZjIsIDB4ZmYsIDB4ZmYsIDB4ZWEsIDB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIAorMHgwMCwgMHg1MCwgMHg4MCwgMHhlNSwgMHgwMSwgMHgwMCwgMHhhMCwgMHhlMSwgMHhmMCwgMHg0NywgMHhiZCwgMHhlOCwgCisweDFlLCAweGZmLCAweDJmLCAweGUxLCAweDAwLCAweGEwLCAweDk0LCAweGU1LCAweDBhLCAweDAwLCAweDU1LCAweGUxLCAKKzB4MTQsIDB4YTAsIDB4ODAsIDB4ZTUsIDB4ZTUsIDB4ZmYsIDB4ZmYsIDB4MWEsIDB4MDEsIDB4MTAsIDB4YTAsIDB4ZTMsIAorMHhmNSwgMHhmZiwgMHhmZiwgMHhlYSwgMHhhOCwgMHgwMywgMHgwMCwgMHg4MCwgMHg3YywgMHgyOSwgMHgwMCwgMHg4MCwgCisweDAwLCAweDgwLCAweDIwLCAweDQwLCAweDY4LCAweDgyLCAweDlmLCAweGU1LCAweDBiLCAweDkyLCAweGEwLCAweGUzLCAKKzB4NjQsIDB4YTIsIDB4OWYsIDB4ZTUsIDB4NTgsIDB4YjAsIDB4OWEsIDB4ZTUsIDB4MGUsIDB4ZjAsIDB4YTAsIDB4ZTEsIAorMHg1NCwgMHhiMCwgMHg5YSwgMHhlNSwgMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHgzZiwgMHg0MCwgMHgyZCwgMHhlOSwgCisweDAwLCAweDAwLCAweDRmLCAweGUxLCAweDFmLCAweDAwLCAweDAwLCAweGUyLCAweDEyLCAweDAwLCAweDUwLCAweGUzLCAKKzB4NTQsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MGYsIDB4ZTEsIDB4ODAsIDB4MDAsIDB4YzAsIDB4ZTMsIAorMHgwMCwgMHhmMCwgMHgyMSwgMHhlMSwgMHgwNCwgMHg1MCwgMHhhMCwgMHhlMywgMHgwMCwgMHg0MCwgMHg5OSwgMHhlNSwgCisweDA5LCAweDAwLCAweDAwLCAweGVhLCAweDAyLCAweDAwLCAweDE0LCAweGUzLCAweDUzLCAweDAwLCAweDAwLCAweDFiLCAKKzB4ODAsIDB4MDAsIDB4MTQsIDB4ZTMsIDB4NTksIDB4MDAsIDB4MDAsIDB4MWIsIDB4MjAsIDB4MDAsIDB4MTQsIDB4ZTMsIAorMHg1OSwgMHgwMCwgMHgwMCwgMHgxYiwgMHgwMiwgMHgwNywgMHgxNCwgMHhlMywgMHg1OSwgMHgwMCwgMHgwMCwgMHgxYiwgCisweDAxLCAweDA2LCAweDE0LCAweGUzLCAweDU5LCAweDAwLCAweDAwLCAweDFiLCAweDA4LCAweDAwLCAweDE0LCAweGUzLCAKKzB4NDUsIDB4MDAsIDB4MDAsIDB4MWIsIDB4MDIsIDB4MDUsIDB4MTQsIDB4ZTMsIDB4NGEsIDB4MDAsIDB4MDAsIDB4MWIsIAorMHgwMiwgMHgwOCwgMHgxNCwgMHhlMywgMHg0YiwgMHgwMCwgMHgwMCwgMHgxYiwgMHhlNSwgMHgwZSwgMHgxNCwgMHhlMywgCisweDA3LCAweDAwLCAweDAwLCAweDBhLCAweDA0LCAweDIwLCAweDk4LCAweGU1LCAweDBjLCAweDEwLCAweDk4LCAweGU1LCAKKzB4MDQsIDB4MzAsIDB4NTIsIDB4ZTIsIDB4M2MsIDB4MzAsIDB4YTAsIDB4YjMsIDB4MDQsIDB4MzAsIDB4ODgsIDB4ZTUsIAorMHgwMiwgMHgwMCwgMHg5MSwgMHhlNywgMHgwZiwgMHhlMCwgMHhhMCwgMHhlMSwgCisweDEwLCAweGZmLCAweDJmLCAweGUxLCAweDAxLCAweDUwLCAweDU1LCAweGUyLCAweDAzLCAweDAwLCAweDAwLCAweDBhLCAKKzB4MDAsIDB4NDAsIDB4OTksIDB4ZTUsIDB4MGMsIDB4MDAsIDB4OWEsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4MTQsIDB4ZTEsIAorMHgxYiwgMHhmZiwgMHgyZiwgMHgxMSwgMHgwOCwgMHgwMCwgMHg5YSwgMHhlNSwgMHgwMCwgMHgwMCwgMHgxNCwgMHhlMSwgCisweDBiLCAweDAwLCAweDAwLCAweDBhLCAweDAxLCAweDBjLCAweDE0LCAweGUzLCAweDk4LCAweDAxLCAweDlmLCAweDE1LCAKKzB4MGYsIDB4ZTAsIDB4YTAsIDB4MTEsIDB4MTAsIDB4ZmYsIDB4MmYsIDB4MTEsIDB4MDIsIDB4MDQsIDB4MTQsIDB4ZTMsIAorMHg4YywgMHgwMSwgMHg5ZiwgMHgxNSwgMHgwZiwgMHhlMCwgMHhhMCwgMHgxMSwgMHgxMCwgMHhmZiwgMHgyZiwgMHgxMSwgCisweDAxLCAweDA5LCAweDE0LCAweGUzLCAweDgwLCAweDAxLCAweDlmLCAweDE1LCAweDBmLCAweGUwLCAweGEwLCAweDExLCAKKzB4MTAsIDB4ZmYsIDB4MmYsIDB4MTEsIDB4MDQsIDB4MDAsIDB4OWEsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4MTQsIDB4ZTEsIAorMHgxNiwgMHgwMCwgMHgwMCwgMHgwYSwgMHg1NCwgMHhlMCwgMHg4ZiwgMHhlMiwgMHgwNCwgMHgwMCwgMHgxNCwgMHhlMywgCisweDQwLCAweDAwLCAweDlhLCAweDE1LCAweDEwLCAweGZmLCAweDJmLCAweDExLCAweDAyLCAweDBhLCAweDE0LCAweGUzLCAKKzB4NDQsIDB4MDAsIDB4OWEsIDB4MTUsIDB4MTAsIDB4ZmYsIDB4MmYsIDB4MTEsIDB4MDIsIDB4MDksIDB4MTQsIDB4ZTMsIAorMHg0OCwgMHgwMCwgMHg5YSwgMHgxNSwgMHgxMCwgMHhmZiwgMHgyZiwgMHgxMSwgMHgwMSwgMHgwMiwgMHgxNCwgMHhlMywgCisweDRjLCAweDAwLCAweDlhLCAweDE1LCAweDEwLCAweGZmLCAweDJmLCAweDExLCAweDAxLCAweDA0LCAweDE0LCAweGUzLCAKKzB4NTAsIDB4MDAsIDB4OWEsIDB4MTUsIDB4MTAsIDB4ZmYsIDB4MmYsIDB4MTEsIDB4MDEsIDB4MGEsIDB4MTQsIDB4ZTMsIAorMHgyMSwgMHgwMCwgMHgwMCwgMHgxYiwgMHgwMiwgMHgwMCwgMHgxNCwgMHhlMywgMHgwZSwgMHgwMCwgMHgwMCwgMHgxYiwgCisweDEwLCAweDAwLCAweDlhLCAweGU1LCAweDAwLCAweDAwLCAweDE0LCAweGUxLCAweDFjLCAweDAwLCAweDAwLCAweDFiLCAKKzB4MDAsIDB4NDAsIDB4OTksIDB4ZTUsIDB4MDQsIDB4NTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4NDAsIDB4OTQsIDB4ZTIsIAorMHgxYiwgMHhmZiwgMHgyZiwgMHgxMSwgMHgzZiwgMHg0MCwgMHhiZCwgMHhlOCwgMHgwNCwgMHhmMCwgMHg1ZSwgMHhlMiwgCisweGMwLCAweDAwLCAweDgwLCAweGUzLCAweDAwLCAweGYwLCAweDYxLCAweGUxLCAweGZhLCAweGZmLCAweGZmLCAweGVhLCAKKzB4MTgsIDB4MDAsIDB4OWEsIDB4ZTUsIDB4MWMsIDB4MTAsIDB4OWEsIDB4ZTUsIDB4MTEsIDB4ZmYsIDB4MmYsIDB4ZTEsIAorMHg1NCwgMHhiMCwgMHg5YSwgMHhlNSwgMHgxYywgMHgxMCwgMHg5YSwgMHhlNSwgMHgxNCwgMHgwMCwgMHg5YSwgMHhlNSwgCisweDExLCAweGZmLCAweDJmLCAweGUxLCAweDIwLCAweDEwLCAweDlhLCAweGU1LCAweDAwLCAweDAwLCAweGEwLCAweGUzLCAKKzB4MTEsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4MjQsIDB4MTAsIDB4OWEsIDB4ZTUsIDB4MTEsIDB4ZmYsIDB4MmYsIDB4ZTEsIAorMHgyOCwgMHgxMCwgMHg5YSwgMHhlNSwgMHgxMSwgMHhmZiwgMHgyZiwgMHhlMSwgMHgyYywgMHgxMCwgMHg5YSwgMHhlNSwgCisweDExLCAweGZmLCAweDJmLCAweGUxLCAweDMwLCAweDEwLCAweDlhLCAweGU1LCAweDExLCAweGZmLCAweDJmLCAweGUxLCAKKzB4MzQsIDB4MTAsIDB4OWEsIDB4ZTUsIDB4MTEsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4ZWEsIAorMHgzOCwgMHhlMCwgMHg5YSwgMHhlNSwgMHgzYywgMHgxMCwgMHg5YSwgMHhlNSwgMHgxOCwgMHgwMCwgMHg5YSwgMHhlNSwgCisweDExLCAweGZmLCAweDJmLCAweGUxLCAweDM4LCAweGUwLCAweDlhLCAweGU1LCAweDNjLCAweDEwLCAweDlhLCAweGU1LCAKKzB4MTQsIDB4MDAsIDB4OWEsIDB4ZTUsIDB4MTEsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4NjQsIDB4MjAsIDB4OWYsIDB4ZTUsIAorMHgwMCwgMHgzMCwgMHg5MiwgMHhlNSwgMHgwMCwgMHgzMCwgMHg1MywgMHhlMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHhiYSwgCisweDAwLCAweDMwLCAweDgyLCAweGU1LCAweDBjLCAweDAwLCAweDkyLCAweGU1LCAweDA4LCAweDMwLCAweDkyLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4OTEsIDB4ZTIsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDMsIDB4MTAsIDB4ODAsIDB4ZTcsIAorMHgwNCwgMHgzMCwgMHg1MywgMHhlMiwgMHgzYywgMHgzMCwgMHhhMCwgMHhiMywgMHgwOCwgMHgzMCwgMHg4MiwgMHhlNSwgCisweDAxLCAweDAwLCAweGEwLCAweGUzLCAweDFlLCAweGZmLCAweDJmLCAweGUxLCAweDNjLCAweDEwLCAweDlmLCAweGU1LCAKKzB4MDAsIDB4MDAsIDB4OTEsIDB4ZTUsIDB4MDEsIDB4MDAsIDB4ODAsIDB4ZTIsIDB4MDAsIDB4MDAsIDB4ODEsIDB4ZTUsIAorMHgwMCwgMHgwMCwgMHhhMCwgMHhlMywgMHhmOCwgMHhmZiwgMHhmZiwgMHhlYSwgMHgxMCwgMHgwMCwgMHg5ZiwgMHhlNSwgCisweDA4LCAweDEwLCAweDkwLCAweGU1LCAweDA0LCAweDEwLCAweDUxLCAweGUyLCAweDNjLCAweDEwLCAweGEwLCAweGIzLCAKKzB4MDgsIDB4MTAsIDB4ODAsIDB4ZTUsIDB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4ZTQsIDB4MmQsIDB4MDAsIDB4ODAsIAorMHhjYywgMHgwNCwgMHgwMCwgMHg4MCwgMHg3MSwgMHgyYiwgMHhmZiwgMHhmZiwgMHhkMSwgMHgzZCwgMHhmZiwgMHhmZiwgCisweGM5LCAweDJiLCAweGZmLCAweGZmLCAweGEwLCAweDgyLCAweDIwLCAweDQwLCAweGM5LCAweDFjLCAweDg5LCAweDA4LCAKKzB4ODksIDB4MDAsIDB4MDEsIDB4MjMsIDB4ODUsIDB4NGEsIDB4NWIsIDB4MDcsIDB4MTgsIDB4NDMsIDB4MTMsIDB4NjgsIAorMHg1YiwgMHgxOCwgMHgxMywgMHg2MCwgMHgwMCwgMHgxZiwgMHg4MSwgMHhhMywgMHg1YiwgMHgxYSwgMHgxOCwgMHg0NywgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIDB4MDQsIDB4MjAsIDB4YTAsIDB4ZTUsIAorMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgMHgwNCwgMHgyMCwgMHhhMCwgMHhlNSwgCisweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAweDA0LCAweDIwLCAweGEwLCAweGU1LCAKKzB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4ZTQsIDB4MmQsIDB4MDAsIDB4ODAsIAorMHg5OCwgMHgwMCwgMHg5ZiwgMHhlNSwgMHg5OCwgMHgxMCwgMHg5ZiwgMHhlNSwgMHgwMSwgMHgyMCwgMHg0MCwgMHhlMCwgCisweDk0LCAweDMwLCAweDlmLCAweGU1LCAweDAwLCAweDAwLCAweDkxLCAweGU1LCAweDAzLCAweDAwLCAweDUwLCAweGUxLCAKKzB4MDMsIDB4MDAsIDB4MDAsIDB4MWEsIDB4MDQsIDB4MTAsIDB4ODEsIDB4ZTIsIDB4MDQsIDB4MjAsIDB4NTIsIDB4ZTIsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwYSwgMHhmOCwgMHhmZiwgMHhmZiwgMHhlYSwgMHg3OCwgMHgwMCwgMHg5ZiwgMHhlNSwgCisweDAwLCAweDIwLCAweDgwLCAweGU1LCAweDc0LCAweDAwLCAweDlmLCAweGU1LCAweDc0LCAweDEwLCAweDlmLCAweGU1LCAKKzB4MDEsIDB4MjAsIDB4NDAsIDB4ZTAsIDB4NjAsIDB4MzAsIDB4OWYsIDB4ZTUsIDB4MDAsIDB4MDAsIDB4OTEsIDB4ZTUsIAorMHgwMywgMHgwMCwgMHg1MCwgMHhlMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgxYSwgMHgwNCwgMHgxMCwgMHg4MSwgMHhlMiwgCisweDA0LCAweDIwLCAweDUyLCAweGUyLCAweDAwLCAweDAwLCAweDAwLCAweDBhLCAweGY4LCAweGZmLCAweGZmLCAweGVhLCAKKzB4NTAsIDB4MDAsIDB4OWYsIDB4ZTUsIDB4MDAsIDB4MjAsIDB4ODAsIDB4ZTUsIDB4NGMsIDB4MDAsIDB4OWYsIDB4ZTUsIAorMHg0YywgMHgxMCwgMHg5ZiwgMHhlNSwgMHgwMSwgMHgyMCwgMHg0MCwgMHhlMCwgMHgyYywgMHgzMCwgMHg5ZiwgMHhlNSwgCisweDAwLCAweDAwLCAweDkxLCAweGU1LCAweDAzLCAweDAwLCAweDUwLCAweGUxLCAweDAzLCAweDAwLCAweDAwLCAweDFhLCAKKzB4MDQsIDB4MTAsIDB4ODEsIDB4ZTIsIDB4MDQsIDB4MjAsIDB4NTIsIDB4ZTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGEsIAorMHhmOCwgMHhmZiwgMHhmZiwgMHhlYSwgMHgyOCwgMHgwMCwgMHg5ZiwgMHhlNSwgMHgwMCwgMHgyMCwgMHg4MCwgMHhlNSwgCisweDFlLCAweGZmLCAweDJmLCAweGUxLCAweDdjLCAweDM0LCAweDAwLCAweDgwLCAweDgwLCAweDMwLCAweDAwLCAweDgwLCAKKzB4YWQsIDB4ZGUsIDB4YWQsIDB4ZGUsIDB4YzAsIDB4MDQsIDB4MDAsIDB4ODAsIDB4ZmMsIDB4MzcsIDB4MDAsIDB4ODAsIAorMHg4MCwgMHgzNCwgMHgwMCwgMHg4MCwgMHhjNCwgMHgwNCwgMHgwMCwgMHg4MCwgMHhmYywgMHgzZiwgMHgwMCwgMHg4MCwgCisweDQwLCAweDM4LCAweDAwLCAweDgwLCAweGM4LCAweDA0LCAweDAwLCAweDgwLCAweDc4LCAweDQ3LCAweDAwLCAweDAwLCAKKzB4NzEsIDB4ZWEsIDB4ZmYsIDB4ZWEsIDB4NzgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MzksIDB4ZmUsIDB4ZmYsIDB4ZWEsIAorMHg3OCwgMHg0NywgMHgwMCwgMHgwMCwgMHg2MywgMHhmZSwgMHhmZiwgMHhlYSwgMHg3OCwgMHg0NywgMHgwMCwgMHgwMCwgCisweDFiLCAweGZmLCAweGZmLCAweGVhLCAweDc4LCAweDQ3LCAweDAwLCAweDAwLCAweDZiLCAweGVhLCAweGZmLCAweGVhLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIAorMHgyOCwgMHgwNCwgMHgwMCwgMHgwMCwgMHhmOCwgMHgzZCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHg4MCwgCisweDAwLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI5LCAweDBiLCAweGZmLCAweGZmLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZDUsIDB4MGIsIDB4ZmYsIDB4ZmYsIDB4MDMsIDB4ZmYsIDB4MDYsIDB4NTQsIAorMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NSwgMHgwNCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweGExLCAweDA1LCAweGZmLCAweGZmLCAweDA0LCAweGZmLCAweDA3LCAweDU0LCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAKKzB4YjUsIDB4MDQsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjEsIDB4MDUsIDB4ZmYsIDB4ZmYsIAorMHgwNSwgMHhmZiwgMHgwNSwgMHg1NCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgzOSwgMHgwNCwgMHhmZiwgMHhmZiwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDU1LCAweDA1LCAweGZmLCAweGZmLCAweDAxLCAweGZmLCAweDA0LCAweDAwLCAKKzB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDEsIDB4MTgsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHg2MSwgMHgwZSwgMHhmZiwgMHhmZiwgMHgwMiwgMHhmZiwgMHgwMiwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweGExLCAweDAyLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGYxLCAweDAyLCAweGZmLCAweGZmLCAKKzB4ZmYsIDB4ZmYsIDB4MDEsIDB4NDQsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5ZCwgMHgwZCwgMHhmZiwgMHhmZiwgMHgwNiwgMHgwMCwgMHhmZiwgMHgwMCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDNkLCAweDUwLCAweGZmLCAweGZmLCAweDgxLCAweDUwLCAweGZmLCAweGZmLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweGZmLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4NDgsIDB4MDUsIDB4MDAsIDB4ODAsIDB4MTEsIDB4NzUsIDB4MjEsIDB4NDAsIDB4MWIsIDB4NzUsIDB4MjEsIDB4NDAsIAorMHgzMSwgMHg3NSwgMHgyMSwgMHg0MCwgMHg0OSwgMHg3NSwgMHgyMSwgMHg0MCwgCisweDU1LCAweDc1LCAweDIxLCAweDQwLCAweDYzLCAweDc1LCAweDIxLCAweDQwLCAweDdkLCAweDc1LCAweDIxLCAweDQwLCAKKzB4YTksIDB4NzUsIDB4MjEsIDB4NDAsIDB4NmQsIDB4NzYsIDB4MjEsIDB4NDAsIDB4YzUsIDB4NzYsIDB4MjEsIDB4NDAsIAorMHhkMywgMHg3NiwgMHgyMSwgMHg0MCwgMHhkZCwgMHg3NiwgMHgyMSwgMHg0MCwgMHhlNywgMHg3NiwgMHgyMSwgMHg0MCwgCisweDk5LCAweDc3LCAweDIxLCAweDQwLCAweGE3LCAweDc3LCAweDIxLCAweDQwLCAweGI1LCAweDc3LCAweDIxLCAweDQwLCAKKzB4NjEsIDB4NzgsIDB4MjEsIDB4NDAsIDB4NWYsIDB4N2MsIDB4MjEsIDB4NDAsIDB4ZTksIDB4N2MsIDB4MjEsIDB4NDAsIAorMHg4OSwgMHg3ZCwgMHgyMSwgMHg0MCwgMHhiZCwgMHg3ZSwgMHgyMSwgMHg0MCwgMHhjOSwgMHg3ZSwgMHgyMSwgMHg0MCwgCisweDI5LCAweDdmLCAweDIxLCAweDQwLCAweDhkLCAweDdmLCAweDIxLCAweDQwLCAweGI5LCAweDdmLCAweDIxLCAweDQwLCAKKzB4ZGQsIDB4N2YsIDB4MjEsIDB4NDAsIDB4MWQsIDB4ODAsIDB4MjEsIDB4NDAsIDB4NDUsIDB4ODAsIDB4MjEsIDB4NDAsIAorMHg4ZCwgMHg4MCwgMHgyMSwgMHg0MCwgMHg5ZCwgMHg4MCwgMHgyMSwgMHg0MCwgMHhjNSwgMHg4MCwgMHgyMSwgMHg0MCwgCisweGQ1LCAweDgwLCAweDIxLCAweDQwLCAweDFkLCAweDgxLCAweDIxLCAweDQwLCAweDViLCAweDgxLCAweDIxLCAweDQwLCAKKzB4YjEsIDB4ODEsIDB4MjEsIDB4NDAsIDB4MTEsIDB4ODIsIDB4MjEsIDB4NDAsIDB4MWIsIDB4ODIsIDB4MjEsIDB4NDAsIAorMHgxZiwgMHg4MiwgMHgyMSwgMHg0MCwgMHg4ZCwgMHg4MiwgMHgyMSwgMHg0MCwgMHhkOSwgMHg4MiwgMHgyMSwgMHg0MCwgCisweDMxLCAweDgzLCAweDIxLCAweDQwLCAweDZkLCAweDgzLCAweDIxLCAweDQwLCAweGQxLCAweDgzLCAweDIxLCAweDQwLCAKKzB4MDksIDB4ODQsIDB4MjEsIDB4NDAsIDB4MTksIDB4ODQsIDB4MjEsIDB4NDAsIDB4NTEsIDB4ODQsIDB4MjEsIDB4NDAsIAorMHg2MSwgMHg4NCwgMHgyMSwgMHg0MCwgMHg3NSwgMHg4NCwgMHgyMSwgMHg0MCwgMHg5ZCwgMHg4NCwgMHgyMSwgMHg0MCwgCisweGE3LCAweDg0LCAweDIxLCAweDQwLCAweGIxLCAweDg0LCAweDIxLCAweDQwLCAweDE1LCAweDg1LCAweDIxLCAweDQwLCAKKzB4NDUsIDB4ODUsIDB4MjEsIDB4NDAsIDB4NTEsIDB4ODUsIDB4MjEsIDB4NDAsIDB4YzUsIDB4ODUsIDB4MjEsIDB4NDAsIAorMHhjZiwgMHg4NSwgMHgyMSwgMHg0MCwgMHhkOSwgMHg4NSwgMHgyMSwgMHg0MCwgMHhlMywgMHg4NSwgMHgyMSwgMHg0MCwgCisweGVkLCAweDg1LCAweDIxLCAweDQwLCAweGY3LCAweDg1LCAweDIxLCAweDQwLCAweDAxLCAweDg2LCAweDIxLCAweDQwLCAKKzB4MGIsIDB4ODYsIDB4MjEsIDB4NDAsIDB4MTUsIDB4ODYsIDB4MjEsIDB4NDAsIDB4MDEsIDB4ODksIDB4MjEsIDB4NDAsIAorMHgxZiwgMHg4NiwgMHgyMSwgMHg0MCwgMHgyOSwgMHg4NiwgMHgyMSwgMHg0MCwgMHgzMywgMHg4NiwgMHgyMSwgMHg0MCwgCisweDNkLCAweDg2LCAweDIxLCAweDQwLCAweDY1LCAweDg2LCAweDIxLCAweDQwLCAweDZmLCAweDg2LCAweDIxLCAweDQwLCAKKzB4ZDEsIDB4ODYsIDB4MjEsIDB4NDAsIDB4ZGIsIDB4ODYsIDB4MjEsIDB4NDAsIDB4ZTUsIDB4ODYsIDB4MjEsIDB4NDAsIAorMHhlZiwgMHg4NiwgMHgyMSwgMHg0MCwgMHhmOSwgMHg4NiwgMHgyMSwgMHg0MCwgMHg5ZCwgMHg3NCwgMHgyMSwgMHg0MCwgCisweDAzLCAweDg3LCAweDIxLCAweDQwLCAweDY5LCAweDg3LCAweDIxLCAweDQwLCAweGI1LCAweDg3LCAweDIxLCAweDQwLCAKKzB4ZjksIDB4ODcsIDB4MjEsIDB4NDAsIDB4MDksIDB4ODgsIDB4MjEsIDB4NDAsIDB4OWQsIDB4NzQsIDB4MjEsIDB4NDAsIAorMHg1NSwgMHg4OCwgMHgyMSwgMHg0MCwgMHg1OSwgMHg4OCwgMHgyMSwgMHg0MCwgMHg1ZCwgMHg4OCwgMHgyMSwgMHg0MCwgCisweGI1LCAweDg4LCAweDIxLCAweDQwLCAweGRkLCAweDg4LCAweDIxLCAweDQwLCAweGU5LCAweDg4LCAweDIxLCAweDQwLCAKKzB4ZWQsIDB4ODgsIDB4MjEsIDB4NDAsIDB4ZjEsIDB4ODgsIDB4MjEsIDB4NDAsIDB4ZjUsIDB4ODgsIDB4MjEsIDB4NDAsIAorMHhmOSwgMHg4OCwgMHgyMSwgMHg0MCwgMHhmZCwgMHg4OCwgMHgyMSwgMHg0MCwgMHgyZCwgMHg4NSwgMHgyMSwgMHg0MCwgCisweDg5LCAweDg1LCAweDIxLCAweDQwLCAweDlkLCAweDc0LCAweDIxLCAweDQwLCAweDlkLCAweDc0LCAweDIxLCAweDQwLCAKKzB4MGQsIDB4ODksIDB4MjEsIDB4NDAsIDB4OWQsIDB4NzQsIDB4MjEsIDB4NDAsIDB4ZTEsIDB4NzQsIDB4MjEsIDB4NDAsIAorMHg5ZCwgMHg3NCwgMHgyMSwgMHg0MCwgMHg5ZCwgMHg3NCwgMHgyMSwgMHg0MCwgMHg5ZCwgMHg3NCwgMHgyMSwgMHg0MCwgCisweDlkLCAweDc0LCAweDIxLCAweDQwLCAweDlkLCAweDc0LCAweDIxLCAweDQwLCAweDlkLCAweDc0LCAweDIxLCAweDQwLCAKKzB4NmIsIDB4NzgsIDB4MjEsIDB4NDAsIDB4ZjUsIDB4N2IsIDB4MjEsIDB4NDAsIDB4MzEsIDB4N2MsIDB4MjEsIDB4NDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDVjLCAweDAxLCAweDE4LCAweDQwLCAweDU4LCAweDAxLCAweDE4LCAweDQwLCAKKzB4MjQsIDB4YTMsIDB4MjAsIDB4NDAsIDB4MjQsIDB4YTcsIDB4MjAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2YywgMHgwMSwgMHgxOCwgMHg0MCwgMHg2OCwgMHgwMSwgMHgxOCwgMHg0MCwgCisweDI0LCAweDgzLCAweDIwLCAweDQwLCAweDI0LCAweGEzLCAweDIwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2MsIDB4MDEsIDB4MTgsIDB4NDAsIDB4NzgsIDB4MDEsIDB4MTgsIDB4NDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhjLCAweDAxLCAweDE4LCAweDQwLCAKKzB4ODgsIDB4MDEsIDB4MTgsIDB4NDAsIDB4MjQsIDB4YTksIDB4MjAsIDB4NDAsIDB4MjQsIDB4YWIsIDB4MjAsIDB4NDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDA4LCAweDAwLCAweDEyLCAweDAwLCAweDE4LCAweDAwLCAweDEyLCAweDAwLCAweDBjLCAweDAwLCAweDEyLCAweDAwLCAKKzB4MWMsIDB4MDAsIDB4MTIsIDB4MDAsIDB4MjQsIDB4YTgsIDB4MjAsIDB4NDAsIDB4YTQsIDB4YTgsIDB4MjAsIDB4NDAsIAorMHhhNCwgMHhhOCwgMHgyMCwgMHg0MCwgMHgyNCwgMHhhOSwgMHgyMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweGQxLCAweGE4LCAweDIxLCAweDQwLCAweDJkLCAweGFhLCAweDIxLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4ODksIDB4NzAsIDB4MjEsIDB4NDAsIDB4YzksIDB4YTEsIDB4MjEsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDU3LCAweDg5LCAweDIxLCAweDQwLCAweGQxLCAweGE4LCAweDIxLCAweDQwLCAweGM1LCAweDJmLCAweGZmLCAweGZmLCAKKzB4MDUsIDB4MjEsIDB4ZmYsIDB4ZmYsIDB4ZWYsIDB4MjAsIDB4ZmYsIDB4ZmYsIDB4NTksIDB4YTcsIDB4MjEsIDB4NDAsIAorMHgzNCwgMHgyZSwgMHgwMCwgMHg4MCwgMHg0OCwgMHgyZSwgMHgwMCwgMHg4MCwgMHg1YywgMHgyZSwgMHgwMCwgMHg4MCwgCisweDMwLCAweDMzLCAweDNhLCAweDMxLCAweDMxLCAweDNhLCAweDMxLCAweDMxLCAweDAwLCAweDMwLCAweDM3LCAweDJmLCAKKzB4MzIsIDB4MzMsIDB4MmYsIDB4MzAsIDB4MzEsIDB4MDAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzEsIDB4MzUsIAorMHgzNiwgMHgzOSwgMHgwMCwgMHg0MywgMHg2ZiwgMHg3MCwgMHg3OSwgMHg3MiwgMHg2OSwgMHg2NywgMHg2OCwgMHg3NCwgCisweDIwLCAweDI4LCAweDYzLCAweDI5LCAweDIwLCAweDMyLCAweDMwLCAweDMwLCAweDMxLCAweDIwLCAweDMzLCAweDQzLCAKKzB4NmYsIDB4NmQsIDB4MjAsIDB4NDMsIDB4NmYsIDB4NzIsIDB4NzAsIDB4NmYsIDB4NzIsIDB4NjEsIDB4NzQsIDB4NjksIAorMHg2ZiwgMHg2ZSwgMHgwYSwgMHgwMCwgMHgwOCwgMHgxMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhjLCAweDUzLCAweGZmLCAweGZmLCAKKzB4MjcsIDB4ZjAsIDB4N2QsIDB4ZmQsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsIDB4ZGEsIDB4MGUsIDB4ODIsIDB4MDAsIAorMHgwMSwgMHg0MCwgMHg2NCwgMHgwNCwgMHg2NCwgMHgyZCwgMHgwMCwgMHg4MCwgMHhlNCwgMHgyYywgMHgwMCwgMHg4MCwgCisweDY5LCAweDNlLCAweGZmLCAweGZmLCAweGM5LCAweDRmLCAweGZmLCAweGZmLCAweGQ1LCAweDI0LCAweGZmLCAweGZmLCAKKzB4YzksIDB4M2IsIDB4ZmYsIDB4ZmYsIDB4MjksIDB4M2MsIDB4ZmYsIDB4ZmYsIDB4MTksIDB4MWEsIDB4ZmYsIDB4ZmYsIAorMHg2NSwgMHgxMSwgMHhmZiwgMHhmZiwgMHhjYywgMHg1MywgMHhmZiwgMHhmZiwgMHgyMSwgMHg0MCwgMHhmZiwgMHhmZiwgCisweDg5LCAweDcwLCAweDIxLCAweDQwLCAweDQ5LCAweDcyLCAweDIxLCAweDQwLCAweGQ5LCAweDNmLCAweGZmLCAweGZmLCAKKzB4MjEsIDB4OWEsIDB4MjEsIDB4NDAsIDB4ODUsIDB4MjQsIDB4ZmYsIDB4ZmYsIDB4NjQsIDB4NTMsIDB4ZmYsIDB4ZmYsIAorMHg4YywgMHg1MywgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgCisweDgwLCAweDMwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MjAsIDB4NDAsIDB4YjAsIDB4NTAsIDB4MDAsIDB4MDAsIDB4N2IsIDB4MGUsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHg2ZSwgMHgyMSwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweGVkLCAweDg5LCAweDIxLCAweDQwLCAweDhiLCAweDg5LCAweDIxLCAweDQwLCAweGE1LCAweDhjLCAweDIxLCAweDQwLCAKKzB4MDUsIDB4OGQsIDB4MjEsIDB4NDAsIDB4Y2QsIDB4OGQsIDB4MjEsIDB4NDAsIDB4OGIsIDB4OGIsIDB4MjEsIDB4NDAsIAorMHhhOSwgMHg4ZSwgMHgyMSwgMHg0MCwgMHgxNSwgMHg4ZiwgMHgyMSwgMHg0MCwgMHg2OSwgMHg4YiwgMHgyMSwgMHg0MCwgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisweDU5LCAweGJkLCAweDIxLCAweDQwLCAweGMxLCAweGJkLCAweDIxLCAweDQwLCAweDJkLCAweGJlLCAweDIxLCAweDQwLCAKKzB4MDAsIDB4MjAsIDB4MGEsIDB4NGEsIDB4MGIsIDB4MjMsIDB4MWIsIDB4MDIsIDB4ZDEsIDB4MTgsIDB4MmQsIDB4MjMsIAorMHg5YiwgMHgwMSwgMHhkMywgMHgxOCwgMHg4OCwgMHg2MSwgMHhkOCwgMHg2MCwgMHhkOCwgMHg2MywgMHg4MCwgMHgzMiwgCisweGM4LCAweDYwLCAweDA4LCAweDYxLCAweDQ4LCAweDYxLCAweGQwLCAweDYyLCAweDAzLCAweDQ4LCAweGMwLCAweDQ2LCAKKzB4NDgsIDB4NjAsIDB4ODgsIDB4NjAsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHhmZSwgMHgwMywgMHgwMCwgMHgwMCwgMHhmMCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgwYywgMHgxYywgMHgwNSwgMHgxYywgCisweDAwLCAweDIzLCAweDAwLCAweDkzLCAweGZmLCAweGY3LCAweGRlLCAweGZmLCAweDY4LCAweDQ5LCAweDBiLCAweDIzLCAKKzB4MWIsIDB4MDIsIDB4Y2YsIDB4MTgsIDB4NzgsIDB4NjgsIDB4MjgsIDB4NDAsIAorMHgwMCwgMHgyMiwgMHhmOCwgMHg2MCwgMHgzYSwgMHg2MSwgMHhiYSwgMHg2OCwgMHgyMiwgMHg0MCwgMHg3YSwgMHg2MSwgCisweDBjLCAweDFjLCAweDQxLCAweDA5LCAweDAzLCAweGQyLCAweDUxLCAweDA5LCAweDAxLCAweGQyLCAweDgwLCAweDBhLCAKKzB4MDIsIDB4ZDMsIDB4NjAsIDB4NDgsIDB4MDAsIDB4ZjAsIDB4YzIsIDB4ZjgsIDB4MDEsIDB4MjAsIDB4ZjksIDB4NjgsIAorMHg0OSwgMHgwOSwgMHgwMywgMHhkMiwgMHg3OSwgMHg2OSwgMHg0OSwgMHgwOSwgMHgwMCwgMHhkMiwgMHgwMCwgMHgyMCwgCisweDAwLCAweDA2LCAweDAwLCAweDBlLCAweDAzLCAweGYwLCAweGQ0LCAweGZhLCAweGY4LCAweDY4LCAweDAwLCAweDI4LCAKKzB4NzAsIDB4ZDAsIDB4MDAsIDB4MjMsIDB4MDIsIDB4OTMsIDB4MDEsIDB4OTMsIDB4NTQsIDB4NGEsIDB4MDEsIDB4MjMsIAorMHgxOCwgMHg0MywgMHhmOCwgMHg2MCwgMHgwMCwgMHgyMCwgMHhkNSwgMHgxZCwgMHg3OSwgMHgzNSwgMHgwMywgMHg5NSwgCisweDAxLCAweDI0LCAweDAwLCAweDIxLCAweDRmLCAweDRkLCAweGZhLCAweDY4LCAweDIyLCAweDQwLCAweDM5LCAweGQwLCAKKzB4OGEsIDB4MDAsIDB4NTIsIDB4MTgsIDB4OTIsIDB4MDAsIDB4NGUsIDB4NGIsIDB4OWIsIDB4NWMsIDB4MWUsIDB4MWMsIAorMHg4MywgMHg0MiwgMHgwNCwgMHhkMCwgMHg0YiwgMHg0YiwgMHhkMywgMHgxOCwgMHg1YiwgMHg3OCwgMHg4MywgMHg0MiwgCisweDJjLCAweGQxLCAweDQ5LCAweDRiLCAweGQyLCAweDE4LCAweGQzLCAweDc4LCAweDAzLCAweDlkLCAweGVkLCAweDZhLCAKKzB4YWIsIDB4NDIsIDB4MDIsIDB4ZDksIDB4MDMsIDB4OWQsIDB4YzAsIDB4NDYsIDB4ZWIsIDB4NjIsIDB4NTMsIDB4NjgsIAorMHg1YiwgMHgwOCwgMHgwMSwgMHhkMywgMHgwMSwgMHgyMywgMHgwMCwgMHg5MywgMHg4NiwgMHg0MiwgMHgwYSwgMHhkMSwgCisweDk1LCAweDY4LCAweDAyLCAweDliLCAweDVlLCAweDFjLCAweDAyLCAweDk2LCAweDliLCAweDAwLCAweDNjLCAweDRlLCAKKzB4OWUsIDB4MTksIDB4MGIsIDB4MjMsIDB4MWIsIDB4MDIsIDB4ZjMsIDB4MTgsIDB4OWQsIDB4NjEsIDB4NTMsIDB4NzgsIAorMHg4MywgMHg0MiwgMHgwZCwgMHhkMSwgMHhkMiwgMHg2OCwgMHgwMSwgMHg5YiwgMHg1ZCwgMHgxYywgMHgwMSwgMHg5NSwgCisweDliLCAweDAwLCAweDM1LCAweDRkLCAweDVkLCAweDE5LCAweDJkLCAweDIzLCAweDliLCAweDAxLCAweGViLCAweDE4LCAKKzB4ZGEsIDB4NjAsIDB4M2EsIDB4NjksIDB4MDEsIDB4MzIsIDB4M2EsIDB4NjEsIDB4NjQsIDB4MDAsIDB4MDEsIDB4MzEsIAorMHgwYiwgMHgyOSwgMHhiZCwgMHhkMywgMHgwMSwgMHgzMCwgMHgwOSwgMHgyOCwgMHhiOCwgMHhkMywgMHgwMCwgMHgyMCwgCisweDAyLCAweDliLCAweDk5LCAweDAwLCAweDJiLCAweDRhLCAweDg5LCAweDE4LCAweDBiLCAweDIzLCAweDFiLCAweDAyLCAKKzB4YzksIDB4MTgsIDB4ODgsIDB4NjEsIDB4MDEsIDB4OWIsIDB4OTksIDB4MDAsIDB4ODksIDB4MTgsIDB4MmQsIDB4MjMsIAorMHg5YiwgMHgwMSwgMHhjOSwgMHgxOCwgMHhjOCwgMHg2MCwgMHgwMCwgMHg5YiwgMHgwMCwgMHgyYiwgMHgwYywgMHhkMSwgCisweDgxLCAweDAwLCAweDg5LCAweDE4LCAweDBiLCAweDIzLCAweDFiLCAweDAyLCAweGM5LCAweDE4LCAweGNiLCAweDY5LCAKKzB4YzAsIDB4NDYsIDB4OGIsIDB4NjEsIDB4MDEsIDB4MzAsIDB4MGIsIDB4MjgsIDB4ZjQsIDB4ZDMsIDB4MDgsIDB4ZTAsIAorMHgwNywgMHhlMCwgMHgwMywgMHg5ZCwgMHhlOCwgMHg2YSwgMHgzMCwgMHgyOCwgMHgwMywgMHhkMiwgMHgzMCwgMHgyMCwgCisweDAzLCAweDlkLCAweGMwLCAweDQ2LCAweGU4LCAweDYyLCAweDE5LCAweDRhLCAweDc4LCAweDY5LCAweDAwLCAweDI4LCAKKzB4MmEsIDB4ZDAsIDB4MDAsIDB4MjEsIDB4MDEsIDB4MjMsIDB4MTgsIDB4NDMsIDB4NzgsIDB4NjEsIDB4MDAsIDB4MjAsIAorMHgwMSwgMHgyNCwgMHgwMCwgMHgyMiwgMHgxMywgMHg0ZSwgMHg3YiwgMHg2OSwgMHgyMywgMHg0MCwgMHgxMCwgMHhkMCwgCisweDkzLCAweDAwLCAweDliLCAweDE4LCAweDliLCAweDAwLCAweDEyLCAweDRkLCAweDViLCAweDE5LCAweDlkLCAweDc4LCAKKzB4ODUsIDB4NDIsIDB4MDgsIDB4ZDEsIDB4MWQsIDB4NjksIDB4MGIsIDB4MWMsIDB4OWIsIDB4MDAsIDB4OWUsIDB4MTksIAorMHgyZCwgMHgyMywgMHg5YiwgMHgwMSwgMHhmMywgMHgxOCwgMHhkZCwgMHg2MywgMHgwMSwgMHgzMSwgMHg2NCwgMHgwMCwgCisweDAxLCAweDMyLCAweDBiLCAweDJhLCAweGU2LCAweGQzLCAweDAxLCAweDMwLCAweDA5LCAweDI4LCAweGUxLCAweGQzLCAKKzB4MDAsIDB4MjAsIDB4ODksIDB4MDAsIDB4MDQsIDB4NGEsIDB4ODksIDB4MTgsIDB4MmQsIDB4MjMsIDB4OWIsIDB4MDEsIAorMHhjOSwgMHgxOCwgMHhjOCwgMHg2MywgMHgwNCwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDMwLCAweDUzLCAweGZmLCAweGZmLCAweDAwLCAweDAxLCAweDAwLCAweDgwLCAKKzB4MDAsIDB4NDcsIDB4MDgsIDB4NDcsIDB4MTAsIDB4NDcsIDB4MTgsIDB4NDcsIDB4NzgsIDB4NDcsIDB4YzAsIDB4NDYsIAorMHgxOCwgMHhjMCwgMHg5ZiwgMHhlNSwgMHgxYywgMHhmZiwgMHgyZiwgMHhlMSwgMHg3OCwgMHg0NywgMHhjMCwgMHg0NiwgCisweDEwLCAweGMwLCAweDlmLCAweGU1LCAweDFjLCAweGZmLCAweDJmLCAweGUxLCAweDc4LCAweDQ3LCAweGMwLCAweDQ2LCAKKzB4MDgsIDB4YzAsIDB4OWYsIDB4ZTUsIDB4MWMsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4MzgsIDB4NTIsIDB4ZmYsIDB4ZmYsIAorMHg4OCwgMHg1MSwgMHhmZiwgMHhmZiwgMHhkNSwgMHhiMCwgMHgyMSwgMHg0MCwgMHhmMCwgMHhiNSwgMHgwNCwgMHgyMCwgCisweDFhLCAweDQ5LCAweDAxLCAweDI1LCAweDA4LCAweDYwLCAweDFhLCAweDRmLCAweGJiLCAweDIzLCAweDFiLCAweDAxLCAKKzB4ZjgsIDB4MTgsIDB4MDUsIDB4NzMsIDB4MTgsIDB4NDgsIDB4NDEsIDB4NmIsIDB4MmMsIDB4MDUsIDB4MDAsIDB4MjAsIAorMHg3YSwgMHg2ZSwgMHgxNywgMHg0YiwgMHg4YSwgMHg0MiwgMHgxZCwgMHhkMCwgCisweDE5LCAweDdiLCAweDAwLCAweDI5LCAweDE3LCAweGQxLCAweGQ5LCAweDFkLCAweGZmLCAweDMxLCAweDNhLCAweDMxLCAKKzB4NDksIDB4NzgsIDB4MWUsIDB4MWMsIDB4MDAsIDB4MjksIDB4MTAsIDB4ZDEsIDB4YjAsIDB4NjAsIDB4MTAsIDB4MjAsIAorMHg3MCwgMHg2MCwgMHgxMCwgMHg0YSwgMHgxMCwgMHg0OSwgMHhmZiwgMHhmNywgMHhjMywgMHhmZiwgMHgwMCwgMHgyOCwgCisweDA3LCAweGQwLCAweDM1LCAweDczLCAweDA0LCAweDIzLCAweGI4LCAweDY5LCAweDE4LCAweDQzLCAweGI4LCAweDYxLCAKKzB4MjAsIDB4NjEsIDB4MDAsIDB4ZjAsIDB4MTcsIDB4ZjgsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHgxOCwgMHg3MywgMHgwNCwgMHgyMywgMHhiOCwgMHg2OSwgMHg5OCwgMHg0MywgMHhiOCwgMHg2MSwgMHgyMCwgMHg2MSwgCisweGY1LCAweGU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGIwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4MDAsIDB4MDEsIDB4MTgsIDB4NDAsIDB4MjgsIDB4MDUsIDB4MDAsIDB4ODAsIDB4MjAsIDB4NTUsIDB4ZmYsIDB4ZmYsIAorMHg3ZCwgMHg3MSwgMHgyMSwgMHg0MCwgMHhmOCwgMHhiNSwgMHgxNSwgMHg0ZiwgMHgzOSwgMHg2YywgMHgxNSwgMHg0OCwgCisweDQwLCAweDZlLCAweDBjLCAweDFhLCAweDE0LCAweDRlLCAweDcxLCAweDY4LCAweDE0LCAweDRkLCAweGExLCAweDQyLCAKKzB4MDYsIDB4ZDgsIDB4MTQsIDB4NGEsIDB4MGEsIDB4NDMsIDB4MDAsIDB4OTIsIDB4YjksIDB4NmIsIDB4MDksIDB4MTgsIAorMHhmYSwgMHg2YiwgMHgxMSwgMHhlMCwgMHgxMSwgMHgyMiwgMHg1MiwgMHgwNSwgMHgyMiwgMHg0MywgMHgwMCwgMHg5MiwgCisweGI5LCAweDZiLCAweDA5LCAweDE4LCAweDAwLCAweDIwLCAweGZhLCAweDZiLCAweDJiLCAweDFjLCAweGZmLCAweGY3LCAKKzB4OGQsIDB4ZmYsIDB4NzAsIDB4NjgsIDB4MDAsIDB4MWIsIDB4MGEsIDB4NGEsIDB4MDIsIDB4NDMsIDB4MDAsIDB4OTIsIAorMHhiOSwgMHg2YiwgMHhmYSwgMHg2YiwgMHgwMCwgMHgyMCwgMHgyYiwgMHgxYywgMHhmZiwgMHhmNywgMHg4MiwgMHhmZiwgCisweGY4LCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDdjLCAweDI5LCAweDAwLCAweDgwLCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MjgsIDB4MDUsIDB4MDAsIDB4ODAsIDB4NDQsIDB4ODAsIDB4MjAsIDB4NDAsIAorMHgwMCwgMHgwMCwgMHgzNywgMHgwMiwgMHhmMCwgMHhiNSwgMHgyYiwgMHg0ZiwgMHhiOCwgMHg2OCwgMHg3OSwgMHg2OCwgCisweGMwLCAweDE5LCAweDIwLCAweDMwLCAweDI5LCAweDRhLCAweGZmLCAweGY3LCAweDYzLCAweGZmLCAweDAxLCAweDIwLCAKKzB4YzAsIDB4MDIsIDB4MjgsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjAsIDB4YjksIDB4NjgsIDB4MzgsIDB4MWMsIAorMHgyNiwgMHg0ZCwgMHgwMCwgMHgyNCwgMHgyNiwgMHg0ZSwgMHhlZiwgMHgxZCwgMHg3OSwgMHgzNywgMHgwMCwgMHgyOSwgCisweDMxLCAweGQxLCAweDMxLCAweDY4LCAweDBhLCAweDc4LCAweDEyLCAweDBhLCAweDAzLCAweGQyLCAweDA0LCAweDczLCAKKzB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NDksIDB4NzgsIDB4MDAsIDB4MjksIDB4MGMsIDB4ZDEsIAorMHgwNSwgMHgxYywgMHg0MCwgMHg2OCwgMHgwMCwgMHhmMCwgMHgzZSwgMHhmOSwgMHgzMCwgMHg2OCwgMHgwMCwgMHhmMCwgCisweDY3LCAweGY4LCAweDAwLCAweDI4LCAweDI2LCAweGQxLCAweDJjLCAweDczLCAweGZmLCAweGY3LCAweDU4LCAweGZmLCAKKzB4MjIsIDB4ZTAsIDB4MDksIDB4MDEsIDB4MDcsIDB4MWMsIDB4NDEsIDB4NjAsIDB4MDgsIDB4MWMsIDB4MTcsIDB4NGEsIAorMHgxNywgMHg0OSwgMHhmZiwgMHhmNywgMHgzNSwgMHhmZiwgMHgwMCwgMHgyOCwgMHgwNywgMHhkMSwgMHgzYywgMHg3MywgCisweDA0LCAweDIzLCAweGE4LCAweDY5LCAweDk4LCAweDQzLCAweDk5LCAweDA0LCAweGE4LCAweDYxLCAweDA4LCAweDYxLCAKKzB4ZGEsIDB4ZTcsIDB4MTAsIDB4MjAsIDB4MDAsIDB4ZjAsIDB4MjAsIDB4ZjksIDB4MTAsIDB4MjAsIDB4YjgsIDB4NjAsIAorMHhmZiwgMHhmNywgMHg4MiwgMHhmZiwgMHhkMiwgMHhlNywgMHgwNSwgMHgxYywgMHg0MCwgMHg2OCwgMHgwMCwgMHhmMCwgCisweDE3LCAweGY5LCAweDMwLCAweDY4LCAweDAwLCAweGYwLCAweDQwLCAweGY4LCAweDAwLCAweDI4LCAweGQ4LCAweGQwLCAKKzB4MDIsIDB4MjMsIDB4ZjgsIDB4NmIsIDB4MTgsIDB4NDMsIDB4ZjgsIDB4NjMsIDB4YzQsIDB4ZTcsIDB4MDAsIDB4MDAsIAorMHgyOCwgMHgwNSwgMHgwMCwgMHg4MCwgMHhhNSwgMHg1NSwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGU0LCAweDAxLCAweDAwLCAweDgwLCAweDIwLCAweDU1LCAweGZmLCAweGZmLCAKKzB4N2QsIDB4NzEsIDB4MjEsIDB4NDAsIDB4OTAsIDB4YjUsIDB4MDEsIDB4MjAsIDB4NDAsIDB4MDMsIDB4MTAsIDB4NDksIAorMHgwMCwgMHgyNywgMHgwOCwgMHg2MCwgMHgwZiwgMHg0YywgMHhlMCwgMHgxZCwgMHhmZiwgMHgzMCwgMHgzYSwgMHgzMCwgCisweDQ3LCAweDcwLCAweGUwLCAweDY5LCAweDgwLCAweDAwLCAweDAwLCAweDE5LCAweDAwLCAweDY5LCAweDAwLCAweGYwLCAKKzB4ZDcsIDB4ZjgsIDB4ZTAsIDB4NjksIDB4MDAsIDB4MjgsIDB4MDEsIDB4ZDAsIDB4ZTcsIDB4NjEsIDB4MDEsIDB4ZTAsIAorMHgwMSwgMHgyMCwgMHhlMCwgMHg2MSwgMHgwNywgMHg0OCwgMHgwMiwgMHgyMywgMHhjMSwgMHg2YiwgMHgxOSwgMHg0MywgCisweGMxLCAweDYzLCAweDI3LCAweDczLCAweGZmLCAweGY3LCAweDAwLCAweGZmLCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjAsIDB4MjgsIDB4MDUsIDB4MDAsIDB4ODAsIAorMHhlOCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg4MCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgwNywgMHgxYywgMHg3OCwgMHg4OCwgCisweDZkLCAweDI4LCAweDAzLCAweGRiLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAKKzB4ZjcsIDB4ZjgsIDB4MTcsIDB4ZTAsIDB4ODAsIDB4MDAsIDB4MGQsIDB4NDksIDB4MDksIDB4NTgsIDB4MzgsIDB4MWMsIAorMHhmZiwgMHhmNywgMHhjYiwgMHhmZSwgMHgwMCwgMHgyOCwgMHgwZiwgMHhkMSwgMHgzOSwgMHg3OCwgMHhjOSwgMHgwOSwgCisweDBjLCAweGQzLCAweDY5LCAweDQ2LCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweGNmLCAweGY4LCAweDY4LCAweDQ2LCAKKzB4MDAsIDB4MjEsIDB4MDAsIDB4ZjAsIDB4MGIsIDB4ZjgsIDB4MDAsIDB4MjgsIDB4MDEsIDB4ZDEsIDB4MDEsIDB4MjAsIAorMHgwMCwgMHhlMCwgMHgwMCwgMHgyMCwgMHgwNCwgMHhiMCwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweGU4LCAweDAxLCAweDAwLCAweDgwLCAweGYwLCAweGI1LCAweDgyLCAweGIwLCAweDAyLCAweDFjLCAweDQxLCAweDRiLCAKKzB4ZGQsIDB4MWQsIDB4ZmYsIDB4MzUsIDB4M2EsIDB4MzUsIDB4MmYsIDB4NzgsIDB4MDAsIDB4MmYsIDB4MDEsIDB4ZDAsIAorMHgwMCwgMHgyNywgMHgwMCwgMHhlMCwgMHgwMSwgMHgyNywgMHgyZiwgMHg3MCwgMHgyZiwgMHg3OCwgMHhmYiwgMHgwMCwgCisweGRiLCAweDE5LCAweDViLCAweDAxLCAweDNhLCAweDRmLCAweGRjLCAweDE5LCAweDQwLCAweDc4LCAweDAwLCAweDAxLCAKKzB4YzcsIDB4MWQsIDB4MDksIDB4MzcsIDB4MDAsIDB4MjAsIDB4ODMsIDB4MDAsIDB4ZDYsIDB4NTgsIDB4YzAsIDB4NDYsIAorMHhlNiwgMHg1MCwgMHgwMSwgMHgzMCwgMHgwNCwgMHgyOCwgMHhmOCwgMHhkMywgMHgwMCwgMHgyOSwgMHgwZiwgMHhkMCwgCisweDAwLCAweDIyLCAweGJiLCAweDA4LCAweDAxLCAweDkzLCAweDgzLCAweDQyLCAweDBiLCAweGQ5LCAweDEzLCAweDFjLCAKKzB4OWIsIDB4MDAsIDB4Y2IsIDB4NTgsIDB4ODYsIDB4MDAsIDB4YTMsIDB4NTEsIDB4MDEsIDB4OWIsIDB4MDEsIDB4MzAsIAorMHgwMSwgMHgzMiwgMHg4MywgMHg0MiwgMHhmNSwgMHhkOCwgMHgwMCwgMHhlMCwgMHgxMCwgMHgyNywgMHgyYiwgMHg0OCwgCisweDAyLCAweDZkLCAweDgwLCAweDZlLCAweDJhLCAweDQ5LCAweDgyLCAweDQyLCAweDAzLCAweGQ4LCAweDgyLCAweDFhLCAKKzB4Y2IsIDB4NmMsIDB4OWEsIDB4MWEsIDB4MDAsIDB4ZTAsIDB4MTIsIDB4MWEsIDB4YmEsIDB4NDIsIDB4MDUsIDB4ZDgsIAorMHgyNiwgMHg0OCwgMHg4MSwgMHg2YiwgMHgwMSwgMHgzMSwgMHg4MSwgMHg2MywgMHgwMSwgMHgyMCwgMHgzNywgMHhlMCwgCisweGMzLCAweDE5LCAweGNhLCAweDZjLCAweDkzLCAweDQyLCAweDA4LCAweGQ4LCAweDIyLCAweDRhLCAweDNhLCAweDQzLCAKKzB4MDAsIDB4OTIsIDB4MGEsIDB4MWMsIDB4NDksIDB4NmMsIDB4MDksIDB4MTgsIDB4OTIsIDB4NmMsIDB4MjMsIDB4MWMsIAorMHgxMiwgMHhlMCwgMHgxNiwgMHgxYSwgMHgwMCwgMHg5NiwgMHgxYiwgMHg0OSwgMHg0OSwgMHg2YywgMHgwOSwgMHgxOCwgCisweDE5LCAweDQ4LCAweDgyLCAweDZjLCAweDAzLCAweDIwLCAweDIzLCAweDFjLCAweGZmLCAweGY3LCAweDVlLCAweGZlLCAKKzB4YjgsIDB4MWIsIDB4MTgsIDB4NGEsIDB4MDIsIDB4NDMsIDB4MDAsIDB4OTIsIDB4YTMsIDB4MTksIDB4MTQsIDB4NDgsIAorMHg4MiwgMHg2YywgMHg0MSwgMHg2YywgMHgwMywgMHgyMCwgMHhmZiwgMHhmNywgMHg1MywgMHhmZSwgMHgwMSwgMHgyMCwgCisweDBkLCAweDQ5LCAweGMwLCAweDQ2LCAweDY4LCAweDcwLCAweDhhLCAweDY5LCAweDkyLCAweDAwLCAweDUyLCAweDE4LCAKKzB4MTcsIDB4NjEsIDB4OGEsIDB4NjksIDB4MDAsIDB4MmEsIDB4MDIsIDB4ZDAsIDB4MDAsIDB4MjcsIDB4OGYsIDB4NjEsIAorMHgwMCwgMHhlMCwgMHg4OCwgMHg2MSwgMHgwYywgMHg0OCwgMHgwMiwgMHgyMywgMHhjMSwgMHg2YiwgMHgxOSwgMHg0MywgCisweGMxLCAweDYzLCAweDAwLCAweDIwLCAweDAxLCAweDI3LCAweDBhLCAweDQ5LCAweGMwLCAweDQ2LCAweDRmLCAweDczLCAKKzB4MDIsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MjgsIDB4MDUsIDB4MDAsIDB4ODAsIAorMHg1MCwgMHhiYSwgMHgyMCwgMHg0MCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg3YywgMHgyOSwgMHgwMCwgMHg4MCwgCisweGEwLCAweDgyLCAweDIwLCAweDQwLCAweDAwLCAweDAwLCAweDE5LCAweDAyLCAweGU4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4MTgsIDB4MWEsIDB4MDAsIDB4ODAsIDB4MDcsIDB4NDksIDB4OGEsIDB4NmUsIDB4MTAsIDB4MTgsIDB4MDcsIDB4NGEsIAorMHhkMiwgMHg2YywgMHgxMywgMHgwNCwgMHgxYiwgMHgwYywgMHg4MywgMHg0MiwgMHgwMCwgMHhkOCwgMHg4MCwgMHgxYSwgCisweDg4LCAweDY2LCAweDg4LCAweDZlLCAweDAzLCAweDQ5LCAweGMwLCAweDQ2LCAweDQ4LCAweDYxLCAweDcwLCAweDQ3LCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4N2MsIDB4MjksIDB4MDAsIDB4ODAsIDB4OTAsIDB4ZWUsIDB4MjAsIDB4NDAsIAorMHgwNiwgMHg0OSwgMHg0YSwgMHg2ZSwgMHgxMCwgMHgxOCwgMHgwNiwgMHg0YSwgMHgxMiwgMHg2YywgMHg4MiwgMHg0MiwgCisweDAwLCAweGQ4LCAweDgwLCAweDFhLCAweDQ4LCAweDY2LCAweDQ4LCAweDZlLCAweDAzLCAweDQ5LCAweGMwLCAweDQ2LCAKKzB4MDgsIDB4NjEsIDB4NzAsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4N2MsIDB4MjksIDB4MDAsIDB4ODAsIAorMHg5MCwgMHhlZSwgMHgyMCwgMHg0MCwgMHgwNSwgMHgyMiwgMHgwYSwgMHg2MCwgMHg4MiwgMHg4OCwgMHhjMCwgMHg0NiwgCisweDhhLCAweDgwLCAweDAwLCAweDIyLCAweDRhLCAweDcwLCAweDQwLCAweDg4LCAweGMwLCAweDQ2LCAweDQ4LCAweDgwLCAKKzB4Y2EsIDB4ODAsIDB4OGEsIDB4NjAsIDB4Y2EsIDB4NjAsIDB4NzAsIDB4NDcsIDB4MDUsIDB4MjIsIDB4MDIsIDB4NjAsIAorMHgwMCwgMHgyMiwgMHg4MiwgMHg4MCwgMHg0MiwgMHg3MCwgMHg0MSwgMHg4MCwgMHhjMiwgMHg4MCwgMHg4MiwgMHg2MCwgCisweGMyLCAweDYwLCAweDcwLCAweDQ3LCAweDgwLCAweGI1LCAweDg0LCAweGIwLCAweDA3LCAweDFjLCAweDBlLCAweDQ4LCAKKzB4NDEsIDB4NmIsIDB4MDEsIDB4MzEsIDB4NDEsIDB4NjMsIDB4NjksIDB4NDYsIAorMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgMHhkZCwgMHhmZiwgMHgzOCwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MCwgCisweDQ1LCAweDIwLCAweDAwLCAweGFiLCAweDE4LCAweDcwLCAweDAxLCAweDI3LCAweGRmLCAweDgwLCAweDY4LCAweDQ2LCAKKzB4MDAsIDB4MjEsIDB4ZmYsIDB4ZjcsIDB4MTEsIDB4ZmYsIDB4MDAsIDB4MjgsIDB4MDEsIDB4ZDEsIDB4MzgsIDB4MWMsIAorMHgwMCwgMHhlMCwgMHgwMCwgMHgyMCwgMHgwNCwgMHhiMCwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweGEwLCAweDgyLCAweDIwLCAweDQwLCAweDAwLCAweGI1LCAweDg0LCAweGIwLCAweGMxLCAweDg4LCAweDA5LCAweDRhLCAKKzB4YzAsIDB4NDYsIDB4OTEsIDB4ODEsIDB4NjksIDB4NDYsIDB4ZmYsIDB4ZjcsIDB4YmQsIDB4ZmYsIDB4MDEsIDB4MjAsIAorMHg0MCwgMHgwMiwgMHgwMSwgMHhhYiwgMHg1OCwgMHg4MCwgMHg2OCwgMHg0NiwgMHgwMCwgMHgyMSwgMHhmZiwgMHhmNywgCisweGY1LCAweGZlLCAweDAxLCAweDIwLCAweDA0LCAweGIwLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAKKzB4ZTgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MDAsIDB4YjUsIDB4ZmYsIDB4ZjcsIDB4YzMsIDB4ZmYsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHgwMSwgMHgyMCwgMHgwMywgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg3MSwgMHhhMSwgMHgyMSwgCisweDQ5LCAweDAzLCAweDg4LCAweDYwLCAweDAwLCAweDIwLCAweDcwLCAweDQ3LCAweDI4LCAweDBmLCAweDAwLCAweDgwLCAKKzB4MDAsIDB4MjAsIDB4MDQsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NzEsIDB4ZmYsIDB4MjEsIDB4YTEsIDB4MjIsIAorMHg1MiwgMHgwMywgMHgwMSwgMHgzMSwgMHg5MSwgMHg2MCwgMHg3MCwgMHg0NywgMHgyOCwgMHgwZiwgMHgwMCwgMHg4MCwgCisweDAyLCAweDIwLCAweGExLCAweDIxLCAweDQ5LCAweDAzLCAweDg4LCAweDYwLCAweDAwLCAweDIwLCAweDcwLCAweDQ3LCAKKzB4MDEsIDB4MjAsIDB4NDAsIDB4MDIsIDB4YTEsIDB4MjEsIDB4NDksIDB4MDMsIDB4ODgsIDB4NjAsIDB4MDAsIDB4MjAsIAorMHg3MCwgMHg0NywgMHhjMCwgMHg4OCwgMHhjMCwgMHgwNiwgMHhjMCwgMHgwZSwgMHhhMSwgMHgyMSwgMHg0OSwgMHgwMywgCisweDQ4LCAweDYxLCAweDAyLCAweDQ5LCAweGMwLCAweDQ2LCAweGM4LCAweDYzLCAweDAwLCAweDIwLCAweDcwLCAweDQ3LCAKKzB4ZTgsIDB4MWEsIDB4MDAsIDB4ODAsIDB4ODAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4MDgsIDB4NDksIDB4MGYsIDB4NmIsIAorMHg2OSwgMHg0NiwgMHhmZiwgMHhmNywgMHg3MSwgMHhmZiwgMHhmOCwgMHgwNiwgMHhjMCwgMHgwZSwgMHgwMSwgMHhhYiwgCisweDU4LCAweDgwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZmLCAweGY3LCAweGE5LCAweGZlLCAweDAxLCAweDIwLCAKKzB4MDQsIDB4YjAsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4ODAsIDB4MDAsIDB4MTQsIDB4NDAsIAorMHg4MCwgMHhiNSwgMHg4NSwgMHhiMCwgMHgwNywgMHgxYywgMHg2OSwgMHg0NiwgMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgCisweDViLCAweGZmLCAweGY4LCAweDg4LCAweDA0LCAweGE5LCAweDAzLCAweGYwLCAweGM5LCAweGZmLCAweDAxLCAweGFiLCAKKzB4NTgsIDB4ODAsIDB4MDEsIDB4YTgsIDB4NDAsIDB4ODgsIDB4MDAsIDB4MjgsIDB4MGYsIDB4ZDAsIDB4MDEsIDB4YTgsIAorMHg0MCwgMHg4OCwgMHg4MCwgMHgwOCwgMHgwMywgMHgzOCwgMHg4MCwgMHgwOCwgMHgwMSwgMHgzMCwgMHgwNCwgMHgzYiwgCisweDU4LCAweDcwLCAweDA0LCAweDk4LCAweDAxLCAweDY4LCAweGMwLCAweDQ2LCAweDAyLCAweDkxLCAweDQwLCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4MDMsIDB4OTAsIDB4MDUsIDB4ZTAsIDB4MDAsIDB4YTgsIDB4MDAsIDB4NzgsIDB4NDAsIDB4MjMsIAorMHgxOCwgMHg0MywgMHgwMCwgMHhhYiwgMHgxOCwgMHg3MCwgMHgwNCwgMHg5OCwgMHhjMSwgMHgxZCwgMHgwMSwgMHgzMSwgCisweDY4LCAweDQ2LCAweGZmLCAweGY3LCAweDc1LCAweGZlLCAweDAxLCAweDIwLCAweDA1LCAweGIwLCAweDgwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4OTAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4MTQsIDB4NGYsIDB4MzksIDB4N2IsIAorMHgwMCwgMHgyOSwgMHgyMCwgMHhkMSwgMHhmOSwgMHgxZCwgMHhmZiwgMHgzMSwgMHgzYSwgMHgzMSwgMHg0OSwgMHg3OCwgCisweDAwLCAweDI5LCAweDFhLCAweGQxLCAweDEwLCAweDQ5LCAweDA1LCAweDIyLCAweDAwLCAweDkyLCAweDA4LCAweDIyLCAKKzB4MDAsIDB4YWIsIDB4NWEsIDB4ODAsIDB4OTgsIDB4ODAsIDB4MDYsIDB4MjAsIDB4MDAsIDB4YWIsIDB4NTgsIDB4NzAsIAorMHgwMCwgMHgyNCwgMHhkYywgMHg4MCwgMHgwOCwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwMiwgMHg5MCwgMHg0OCwgMHg2OCwgCisweGMwLCAweDQ2LCAweDAzLCAweDkwLCAweDAxLCAweDIwLCAweDM4LCAweDczLCAweDY4LCAweDQ2LCAweDA4LCAweDMxLCAKKzB4ZmYsIDB4ZjcsIDB4NGMsIDB4ZmUsIDB4MDAsIDB4MjgsIDB4MDAsIDB4ZDAsIDB4M2MsIDB4NzMsIDB4MDQsIDB4YjAsIAorMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgyOCwgMHgwNSwgMHgwMCwgMHg4MCwgCisweGE0LCAweDJhLCAweDAwLCAweDgwLCAweDkwLCAweGI1LCAweDg0LCAweGIwLCAweDA3LCAweDFjLCAweDY5LCAweDQ2LCAKKzB4MzgsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4ZjksIDB4ZmUsIDB4YmEsIDB4NjgsIDB4MGQsIDB4NGMsIDB4MGUsIDB4NDgsIAorMHgwMCwgMHgyYSwgMHgwNSwgMHhkMSwgMHgwZCwgMHg0OSwgMHhmZiwgMHhmNywgMHhlNCwgMHhmYywgMHgwMCwgMHgyOCwgCisweDBjLCAweGRhLCAweDA1LCAweGUwLCAweGI5LCAweDg4LCAweDBiLCAweDRiLCAweGZmLCAweGY3LCAweGRmLCAweGZjLCAKKzB4MDAsIDB4MjgsIDB4MDUsIDB4ZGEsIDB4MDEsIDB4YWIsIDB4NWMsIDB4ODAsIDB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIAorMHhmZiwgMHhmNywgMHgyMiwgMHhmZSwgMHgwMCwgMHgyMCwgMHgwNCwgMHhiMCwgCisweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAKKzB4MGQsIDB4NzYsIDB4MjEsIDB4NDAsIDB4YzEsIDB4YmQsIDB4MjEsIDB4NDAsIDB4NTksIDB4YmQsIDB4MjEsIDB4NDAsIAorMHgwMCwgMHhiNSwgMHhjMCwgMHg4OCwgMHgwMywgMHhmMCwgMHgyZSwgMHhmZiwgMHgwMCwgMHgyMCwgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweGI1LCAweGZmLCAweGY3LCAweGUyLCAweGZlLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MDAsIDB4YjUsIDB4ZmYsIDB4ZjcsIDB4ZGQsIDB4ZmUsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIAorMHgwMSwgMHgxYywgMHgwMiwgMHgyMCwgMHgwMCwgMHhmMCwgMHgwMiwgMHhmOCwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweGIwLCAweGI1LCAweGM2LCAweGIwLCAweDA3LCAweDFjLCAweDA4LCAweDFjLCAweDY5LCAweDQ2LCAweGZmLCAweGY3LCAKKzB4YjUsIDB4ZmUsIDB4MjEsIDB4NDgsIDB4ZmYsIDB4ZjcsIDB4YTQsIDB4ZmMsIDB4MDQsIDB4MWMsIDB4MjAsIDB4NGEsIAorMHgwMCwgMHgyMSwgMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgMHhhMCwgMHhmYywgMHgwMCwgMHgyOCwgMHgyNywgMHhkMCwgCisweDA0LCAweGE5LCAweDFkLCAweDRhLCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAweDk5LCAweGZjLCAweDA0LCAweGE4LCAKKzB4MDAsIDB4MjMsIDB4MDEsIDB4MmYsIDB4MDYsIDB4ZDEsIDB4MGMsIDB4YWEsIDB4MDIsIDB4MzIsIDB4MDAsIDB4MjEsIAorMHgxMywgMHg2MCwgMHgwMSwgMHgzMSwgMHgxMCwgMHgyOSwgMHhmYiwgMHhkMywgMHgwMSwgMHg2OCwgMHgwNCwgMHgyOSwgCisweDA0LCAweGQ5LCAweDg5LCAweDA4LCAweDAzLCAweDM5LCAweDg5LCAweDA4LCAweDAxLCAweDMxLCAweDAwLCAweGUwLCAKKzB4MTksIDB4MWMsIDB4MDAsIDB4YWIsIDB4NTksIDB4NzAsIDB4MDYsIDB4YTksIDB4MDksIDB4NzgsIDB4YzAsIDB4NDYsIAorMHhkOSwgMHg4MCwgMHgwMCwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwMiwgMHg5MCwgMHgwNywgMHg5OCwgMHhjMCwgMHg0NiwgCisweDAzLCAweDkwLCAweDA0LCAweDMzLCAweDA4LCAweGFkLCAweDAyLCAweGUwLCAweDQ1LCAweDIwLCAweDAwLCAweGFiLCAKKzB4MTgsIDB4NzAsIDB4MDksIDB4NDksIDB4MjAsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4NmUsIDB4ZmMsIDB4NjgsIDB4NDYsIAorMHgyOSwgMHgxYywgMHhmZiwgMHhmNywgMHhiNywgMHhmZCwgMHgwMSwgMHgyMCwgMHg0NiwgMHhiMCwgMHhiMCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDI0LCAweDAyLCAweGZmLCAweGZmLCAweDU5LCAweGIxLCAweDIxLCAweDQwLCAKKzB4OWQsIDB4YWYsIDB4MjEsIDB4NDAsIDB4M2MsIDB4MDIsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4YjUsIDB4MDEsIDB4MWMsIAorMHgwMiwgMHgyMCwgMHgwMCwgMHhmMCwgMHgxMCwgMHhmOCwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgCisweDAxLCAweDFjLCAweDAxLCAweDIwLCAweGZmLCAweGY3LCAweGEyLCAweGZmLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MDAsIDB4YjUsIDB4MDEsIDB4MWMsIDB4MDEsIDB4MjAsIDB4MDAsIDB4ZjAsIDB4MDIsIDB4ZjgsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHhmMCwgMHhiNSwgMHhjNywgMHhiMCwgMHgwNCwgMHgxYywgMHgwZiwgMHgxYywgMHgzOCwgMHgxYywgCisweDAxLCAweGE5LCAweGZmLCAweGY3LCAweDRkLCAweGZlLCAweDIxLCAweDQ4LCAweGZmLCAweGY3LCAweDNjLCAweGZjLCAKKzB4MDAsIDB4OTAsIDB4NzgsIDB4NzgsIDB4MDAsIDB4MDEsIDB4YmEsIDB4NjgsIDB4MDQsIDB4MzAsIDB4ZmMsIDB4MmEsIAorMHgyNSwgMHhkOCwgMHhmZiwgMHgyMywgMHgwOSwgMHgzMywgMHg5OCwgMHg0MiwgMHgyMSwgMHhkOCwgMHgxOSwgMHgyYywgCisweDFmLCAweGQ4LCAweGZkLCAweDg4LCAweGY4LCAweDY4LCAweGMwLCAweDQ2LCAweDA1LCAweDkwLCAweGY5LCAweDFkLCAKKzB4MDksIDB4MzEsIDB4MDYsIDB4YWIsIDB4MDAsIDB4MjAsIDB4N2UsIDB4NzgsIDB4MDAsIDB4MmUsIDB4MGQsIDB4ZGQsIAorMHg0MCwgMHhjOSwgMHg0MCwgMHhjMywgMHg0MCwgMHhjOSwgMHg0MCwgMHhjMywgMHg0MCwgMHhjOSwgMHg0MCwgMHhjMywgCisweDQwLCAweGM5LCAweDQwLCAweGMzLCAweDAxLCAweDMwLCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDdlLCAweDc4LCAKKzB4ODYsIDB4NDIsIDB4ZjEsIDB4ZGMsIDB4MjAsIDB4MWMsIDB4MDUsIDB4YTksIDB4MmIsIDB4MWMsIDB4ZmYsIDB4ZjcsIAorMHgyMSwgMHhmYywgMHgwMCwgMHgyOCwgMHgwNSwgMHhkMCwgMHgwMSwgMHhhOCwgMHgwMCwgMHg3OCwgMHg0MCwgMHgyMywgCisweDE4LCAweDQzLCAweDAxLCAweGFiLCAweDE4LCAweDcwLCAweDA3LCAweDQ5LCAweDAwLCAweDk4LCAweGZmLCAweGY3LCAKKzB4MDYsIDB4ZmMsIDB4MDAsIDB4MjEsIDB4MDEsIDB4YTgsIDB4ZmYsIDB4ZjcsIDB4NGYsIDB4ZmQsIDB4MDEsIDB4MjAsIAorMHg0NywgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgyNCwgMHgwMiwgMHhmZiwgMHhmZiwgCisweDNjLCAweDAyLCAweGZmLCAweGZmLCAweDAwLCAweGI1LCAweGZmLCAweGY3LCAweDFiLCAweGZlLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4ZjAsIDB4YjUsIDB4YzYsIDB4YjAsIDB4MDcsIDB4MWMsIDB4ZmMsIDB4ODgsIDB4MjUsIDB4NGQsIAorMHg2OCwgMHg2OCwgMHgwMSwgMHgzMCwgMHg2OSwgMHg0NiwgMHg2OCwgMHg2MCwgMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgCisweGY1LCAweGZkLCAweDEwLCAweDJjLCAweDA4LCAweGQzLCAweDAwLCAweGE4LCAweDAwLCAweDc4LCAweDQwLCAweDIzLCAKKzB4MTgsIDB4NDMsIDB4MDAsIDB4YWIsIDB4MTgsIDB4NzAsIDB4MDIsIDB4MjAsIDB4ZDgsIDB4ODAsIDB4MTcsIDB4ZTAsIAorMHg3OCwgMHg3OCwgMHg4MiwgMHgwMCwgMHhmYiwgMHgxZCwgMHgwOSwgMHgzMywgMHgwMCwgMHgyMCwgMHhiOSwgMHg2OCwgCisweDAwLCAweDJhLCAweDE1LCAweGQ5LCAweDQwLCAweGNiLCAweDBmLCAweDFjLCAKKzB4MDEsIDB4MzEsIDB4YmUsIDB4NDIsIDB4MGQsIDB4ZDAsIDB4MDAsIDB4YWEsIDB4MTIsIDB4NzgsIDB4NDAsIDB4MjMsIAorMHgxYSwgMHg0MywgMHgwMCwgMHhhYiwgMHgxYSwgMHg3MCwgMHgwNCwgMHgyMiwgMHhkYSwgMHg4MCwgMHgwMiwgMHg5MCwgCisweDAzLCAweDkxLCAweDA0LCAweDMzLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweDE1LCAweGUwLCAweDAxLCAweDMwLCAKKzB4OTAsIDB4NDIsIDB4ZTksIDB4ZDMsIDB4MDAsIDB4YWIsIDB4NWMsIDB4NzAsIDB4MDIsIDB4OTQsIDB4NjksIDB4NjgsIAorMHhjMCwgMHg0NiwgMHgwMywgMHg5MSwgMHhhMiwgMHgwMCwgMHgwMCwgMHgyMCwgMHgxMCwgMHgzMywgMHgwMCwgMHgyYSwgCisweDA1LCAweGQ5LCAweDBmLCAweDFjLCAweDgwLCAweGMzLCAweDAxLCAweDMwLCAweDAxLCAweDMxLCAweDkwLCAweDQyLCAKKzB4ZjksIDB4ZDMsIDB4NjgsIDB4NDYsIDB4MDQsIDB4YTksIDB4ZmYsIDB4ZjcsIDB4ZjcsIDB4ZmMsIDB4MDEsIDB4MjAsIAorMHg0NiwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg5YywgMHgwMywgMHgwMCwgMHg4MCwgCisweDkwLCAweGI0LCAweDIzLCAweDQ4LCAweDAwLCAweDY4LCAweDAxLCAweDIxLCAweDQyLCAweDA5LCAweDAwLCAweGQzLCAKKzB4MDAsIDB4MjEsIDB4MDAsIDB4MjcsIDB4M2EsIDB4MWMsIDB4NDMsIDB4MGIsIDB4MDAsIDB4ZDIsIDB4MDIsIDB4MjIsIAorMHgxMSwgMHg0MywgMHgxZSwgMHg0YSwgMHgyMCwgMHgyNCwgMHhkMywgMHg2OCwgMHgwMSwgMHgyYiwgMHgyZSwgMHhkMSwgCisweDgwLCAweDBhLCAweDAwLCAweGQyLCAweDAwLCAweDI0LCAweDBjLCAweDQzLCAweDIwLCAweDFjLCAweDFiLCAweDIzLCAKKzB4ZGIsIDB4MDEsIDB4ZDEsIDB4MTgsIDB4ODksIDB4OGIsIDB4MDksIDB4MGIsIDB4MDAsIDB4ZDIsIDB4MDQsIDB4MjcsIAorMHgzOCwgMHg0MywgMHhkMSwgMHg2ZiwgMHgwOSwgMHg2OCwgMHgwOSwgMHgwYSwgMHgwNywgMHhkMiwgMHhkMSwgMHgxZCwgCisweDc5LCAweDMxLCAweDA5LCAweDY4LCAweDA5LCAweDY4LCAweDA5LCAweDBhLCAweDAxLCAweGQzLCAweDA4LCAweDIzLCAKKzB4MTgsIDB4NDMsIDB4ZTMsIDB4MjMsIDB4MWIsIDB4MDEsIDB4ZDEsIDB4MTgsIDB4ODksIDB4NzksIDB4MDMsIDB4MjksIAorMHgwMiwgMHhkMSwgMHhmZiwgMHgyMywgMHgwMSwgMHgzMywgMHgxOCwgMHg0MywgMHgwYiwgMHg0OSwgMHgwOSwgMHg2YSwgCisweDEwLCAweDIyLCAweDRiLCAweDBhLCAweDAwLCAweGQyLCAweDAwLCAweDIyLCAweDEwLCAweDQzLCAweDg5LCAweDA3LCAKKzB4ODksIDB4MGYsIDB4ODksIDB4MDEsIDB4MDgsIDB4NDMsIDB4OTAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4NDAsIDB4MGMsIAorMHgwMCwgMHhkMiwgMHgwMCwgMHgyNCwgMHgwYywgMHg0MywgMHgyMCwgMHgxYywgMHhlYywgMHhlNywgMHgwMCwgMHgwMCwgCisweDAwLCAweDAwLCAweDEwLCAweDQwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGMwLCAweDAwLCAweDE4LCAweDQwLCAKKzB4ZjAsIDB4YjUsIDB4M2EsIDB4NGMsIDB4MjAsIDB4MWMsIDB4MDQsIDB4ZjAsIDB4MDcsIDB4ZmEsIDB4MzksIDB4NDgsIAorMHhlMywgMHgyMywgMHgxYiwgMHgwMSwgMHhjNywgMHgxOCwgMHhiOSwgMHg3OSwgMHgzNywgMHg0ZSwgMHhjNSwgMHgxZCwgCisweDc5LCAweDM1LCAweDA2LCAweDI5LCAweDYyLCAweGQyLCAweDAyLCAweGEzLCAweDViLCAweDVjLCAweDViLCAweDAwLCAKKzB4OWYsIDB4NDQsIDB4MDAsIDB4MWMsIDB4MDMsIDB4MGUsIDB4MWUsIDB4MzcsIDB4NGUsIDB4NTUsIDB4MDEsIDB4MjAsIAorMHhiOCwgMHg3MSwgMHgwMCwgMHgyMCwgMHhiMCwgMHg2MCwgMHhmZiwgMHhmNywgMHg5NSwgMHhmZiwgMHgwNSwgMHgyMywgCisweDk4LCAweDQzLCAweDAwLCAweGYwLCAweDZmLCAweGY4LCAweDBjLCAweGUwLCAweGZmLCAweGY3LCAweDhlLCAweGZmLCAKKzB4YzAsIDB4MDgsIDB4MDYsIDB4ZDMsIDB4YjAsIDB4NjgsIDB4NDEsIDB4MWMsIDB4YjEsIDB4NjAsIDB4MGEsIDB4MjgsIAorMHgwMywgMHhkOSwgMHgwNCwgMHgyMCwgMHgwMCwgMHhlMCwgMHgwMiwgMHgyMCwgMHhiOCwgMHg3MSwgMHg2NCwgMHgyMiwgCisweDIwLCAweDFjLCAweDJiLCAweGUwLCAweDA2LCAweDFjLCAweGMwLCAweDZmLCAweDgwLCAweDIzLCAweDAxLCAweDY4LCAKKzB4MTksIDB4NDMsIDB4MDEsIDB4NjAsIDB4MDMsIDB4MjAsIDB4YjgsIDB4NzEsIDB4MjAsIDB4MWMsIDB4MjAsIDB4NGEsIAorMHgwMCwgMHgyMSwgMHgwNCwgMHhmMCwgMHg5OSwgMHhmOSwgMHhmMCwgMHg2ZiwgMHgwNCwgMHgyMywgMHgwMSwgMHg2OCwgCisweDk5LCAweDQzLCAweDAxLCAweDYwLCAweDI4LCAweDY4LCAweDAxLCAweDY4LCAweDE5LCAweDQzLCAweDAxLCAweDYwLCAKKzB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDUsIDB4MjEsIDB4YjksIDB4NzEsIDB4MjksIDB4NjgsIAorMHgwNCwgMHgyMywgMHgwYSwgMHg2OCwgMHg5YSwgMHg0MywgMHgwYSwgMHg2MCwgMHhjMCwgMHg2ZiwgMHgwMSwgMHg2OCwgCisweDE5LCAweDQzLCAweDAxLCAweDYwLCAweGZmLCAweGY3LCAweDVhLCAweGZmLCAweDA4LCAweDIzLCAweDE4LCAweDQzLCAKKzB4MDAsIDB4ZjAsIDB4MzQsIDB4ZjgsIDB4MjAsIDB4MWMsIDB4MTAsIDB4NGEsIDB4MDAsIDB4MjEsIDB4MDQsIDB4ZjAsIAorMHg3NywgMHhmOSwgMHhlNSwgMHhlNywgMHhmZiwgMHhmNywgMHg0ZSwgMHhmZiwgMHgwNCwgMHgyMywgMHgxOCwgMHg0MywgCisweDAwLCAweGYwLCAweDI4LCAweGY4LCAweGRlLCAweGU3LCAweDAwLCAweDIwLCAweDI5LCAweDY4LCAweDYwLCAweDIzLCAKKzB4MGEsIDB4NjgsIDB4OWEsIDB4NDMsIDB4MGEsIDB4NjAsIDB4ZmYsIDB4ZjcsIDB4ZTMsIDB4ZmEsIDB4ZDUsIDB4ZTcsIAorMHgwNiwgMHgyMCwgMHhiOCwgMHg3MSwgMHhkMiwgMHhlNywgMHgwMCwgMHgwMCwgMHhhOSwgMHg3OSwgMHgyMSwgMHg0MCwgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDljLCAweDAzLCAweDAwLCAweDgwLCAweDMwLCAweDc1LCAweDAwLCAweDAwLCAKKzB4MTAsIDB4MjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjUsIDB4MDAsIDB4MjAsIAorMHgwNCwgMHg0OSwgMHhjMCwgMHg0NiwgMHg4OCwgMHg3MSwgMHgwNCwgMHg0OCwgMHgwMSwgMHgyMiwgMHgwMCwgMHgyMSwgCisweDA0LCAweGYwLCAweDRlLCAweGY5LCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDk4LCAweDFjLCAweDAwLCAweDgwLCAKKzB4YTksIDB4NzksIDB4MjEsIDB4NDAsIDB4OTAsIDB4YjUsIDB4MDcsIDB4MWMsIDB4MzEsIDB4NDgsIDB4MDAsIDB4NjgsIAorMHg3OSwgMHgwOCwgMHgwMywgMHhkMywgMHgxMCwgMHgyMywgMHgwMSwgMHgxYywgMHg5OSwgMHg0MywgMHgwMSwgMHhlMCwgCisweDEwLCAweDIxLCAweDAxLCAweDQzLCAweDJkLCAweDRjLCAweGUyLCAweDY4LCAweDAxLCAweDJhLCAweDA1LCAweGQxLCAKKzB4MjIsIDB4NzksIDB4MDAsIDB4MmEsIDB4MDIsIDB4ZDAsIDB4MDEsIDB4MjMsIDB4OWIsIDB4MDIsIDB4MTksIDB4NDMsIAorMHg4MSwgMHg0MiwgMHgwMiwgMHhkMCwgMHgwMSwgMHgyMCwgMHgwMCwgMHgwNSwgMHgwMSwgMHg2MCwgMHhlMCwgMHg2OCwgCisweDAxLCAweDI4LCAweDIwLCAweGQxLCAweDFiLCAweDIzLCAweGRiLCAweDAxLCAweGUwLCAweDE4LCAweDgwLCAweDhiLCAKKzB4ZjksIDB4MDgsIDB4MDQsIDB4ZDMsIDB4MDEsIDB4MjMsIDB4ZGIsIDB4MDIsIDB4MDEsIDB4MWMsIDB4OTksIDB4NDMsIAorMHgwMSwgMHhlMCwgMHgwMSwgMHgyMSwgMHhjOSwgMHgwMiwgMHg4MSwgMHg0MiwgMHgwMiwgMHhkMCwgMHgwMCwgMHgyMCwgCisweDAyLCAweGYwLCAweDFhLCAweGZiLCAweDM4LCAweDA5LCAweDA3LCAweGQzLCAweGUwLCAweDZmLCAweDgwLCAweDIzLCAKKzB4MDEsIDB4NjgsIDB4OTksIDB4NDMsIDB4MDEsIDB4NjAsIDB4ZTAsIDB4MTgsIDB4MDAsIDB4NjgsIDB4MDAsIDB4ZTAsIAorMHhlMCwgMHg2ZiwgMHg4MCwgMHgyMywgMHgwMSwgMHg2OCwgMHgxOSwgMHg0MywgMHgwMSwgMHg2MCwgMHgxNSwgMHg0OCwgCisweDAxLCAweDZhLCAweDc4LCAweDA5LCAweDAzLCAweGQzLCAweGZmLCAweDIwLCAweDAxLCAweDMwLCAweDA4LCAweDQzLCAKKzB4MDMsIDB4ZTAsIDB4ZmYsIDB4MjMsIDB4MDgsIDB4MWMsIDB4MDEsIDB4MzMsIDB4OTgsIDB4NDMsIDB4ODAsIDB4MDgsIAorMHg4MCwgMHgwMCwgMHhiYSwgMHgwOSwgMHg5MiwgMHgwNywgMHg5MiwgMHgwZiwgMHgxMCwgMHg0MywgMHg4OCwgMHg0MiwgCisweDAyLCAweGQwLCAweDBjLCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDYyLCAweGUxLCAweDY4LCAweDAxLCAweDI5LCAKKzB4MDgsIDB4ZDEsIDB4NzksIDB4MGEsIDB4MDYsIDB4ZDMsIDB4ZmYsIDB4MjMsIDB4MDQsIDB4MzMsIDB4MTgsIDB4NDAsIAorMHgwMywgMHgyOCwgMHgwMSwgMHhkMSwgMHhmZiwgMHhmNywgMHg4ZSwgMHhmZiwgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDQwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4YzAsIDB4MDAsIDB4MTgsIDB4NDAsIDB4YzAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4ODAsIDB4YjUsIDB4ZmYsIDB4ZjcsIAorMHhiMSwgMHhmZSwgMHg4MCwgMHgwOSwgMHgxYiwgMHhkMiwgMHgwZiwgMHg0OCwgMHhlMywgMHgyMywgMHgxYiwgMHgwMSwgCisweGMxLCAweDE4LCAweDRhLCAweDc5LCAweDAwLCAweDJhLCAweDE0LCAweGQxLCAweDAxLCAweDIyLCAweDRhLCAweDcxLCAKKzB4MDAsIDB4MjcsIDB4ODAsIDB4MzAsIDB4MDAsIDB4NjgsIDB4NjAsIDB4MjMsIDB4MDEsIDB4NjgsIDB4OTksIDB4NDMsIAorMHgwMSwgMHg2MCwgMHgwOCwgMHg0OCwgMHgwNiwgMHhlMCwgMHgwMiwgMHgyMCwgMHgwMiwgMHhmMCwgMHg4YywgMHhmYywgCisweDA3LCAweDIwLCAweDAyLCAweGYwLCAweDViLCAweGZjLCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAweDM2LCAweGZhLCAKKzB4ZjUsIDB4ZTcsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHhmNCwgMHgwMSwgMHhmZiwgMHhmZiwgMHgwMCwgMHhiNSwgMHg4NCwgMHhiMCwgMHg2OSwgMHg0NiwgMHhmZiwgMHhmNywgCisweDM3LCAweGZjLCAweGZmLCAweGY3LCAweDg1LCAweGZlLCAweDAxLCAweGFiLCAweDU4LCAweDgwLCAweDA4LCAweDQ4LCAKKzB4MDAsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDIsIDB4OTAsIDB4MDcsIDB4NDgsIDB4MDAsIDB4NmEsIDB4YzAsIDB4NDYsIAorMHgwMywgMHg5MCwgMHg2OCwgMHg0NiwgMHgwMCwgMHgyMSwgMHhmZiwgMHhmNywgMHg2NywgMHhmYiwgMHgwMSwgMHgyMCwgCisweDA0LCAweGIwLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDQwLCAKKzB4YzAsIDB4MDAsIDB4MTgsIDB4NDAsIDB4ODAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4MDcsIDB4MWMsIDB4NjksIDB4NDYsIAorMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgMHgxNywgMHhmYywgMHhmOCwgMHg4OCwgMHhmZiwgMHhmNywgMHg0MiwgMHhmZiwgCisweGZmLCAweGY3LCAweDYyLCAweGZlLCAweDAxLCAweGFiLCAweDU4LCAweDgwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAKKzB4ZmYsIDB4ZjcsIDB4NGMsIDB4ZmIsIDB4MDEsIDB4MjAsIDB4MDQsIDB4YjAsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHhiMCwgMHhiNSwgMHhjNiwgMHhiMCwgMHhjNywgMHg4OCwgMHg2OSwgMHg0NiwgMHhmZiwgMHhmNywgCisweDAxLCAweGZjLCAweDAxLCAweDI0LCAweDFhLCAweDRiLCAweDlmLCAweDQyLCAweDBhLCAweGQ5LCAweDAwLCAweGE4LCAKKzB4MDAsIDB4NzgsIDB4NDAsIDB4MjMsIDB4MTgsIDB4NDMsIDB4MDAsIDB4YWIsIDB4MTgsIDB4NzAsIDB4MDIsIDB4MjAsIAorMHhkOCwgMHg4MCwgMHg2OCwgMHg0NiwgMHgwMCwgMHgyMSwgMHgyMCwgMHhlMCwgMHgxNCwgMHg0OCwgMHhmZiwgMHhmNywgCisweGUxLCAweGY5LCAweDA1LCAweDFjLCAweDEzLCAweDRhLCAweDM4LCAweDFjLCAweDA0LCAweGE5LCAweGZmLCAweGY3LCAKKzB4ZGQsIDB4ZjksIDB4MTIsIDB4NDksIDB4MjgsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4ZDgsIDB4ZjksIDB4MDEsIDB4MmYsIAorMHgwNiwgMHhkMSwgMHgwYywgMHhhOSwgMHgwMCwgMHgyMCwgMHgwMCwgMHgyMiwgCisweDBhLCAweDYwLCAweDAxLCAweDMwLCAweDEwLCAweDI4LCAweGZiLCAweGQzLCAweDEwLCAweDIwLCAweDAwLCAweGFiLCAKKzB4NTgsIDB4NzAsIDB4MDQsIDB4OTgsIDB4YzAsIDB4NDYsIDB4MDIsIDB4OTAsIDB4MDUsIDB4OTgsIDB4YzAsIDB4NDYsIAorMHgwMywgMHg5MCwgMHg2OCwgMHg0NiwgMHgwNiwgMHhhOSwgMHhmZiwgMHhmNywgMHgwZiwgMHhmYiwgMHgyMCwgMHgxYywgCisweDQ2LCAweGIwLCAweGIwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweGZmLCAweDAxLCAweDAwLCAweDAwLCAKKzB4MjQsIDB4MDIsIDB4ZmYsIDB4ZmYsIDB4OWQsIDB4YWYsIDB4MjEsIDB4NDAsIDB4M2MsIDB4MDIsIDB4ZmYsIDB4ZmYsIAorMHhmMCwgMHhiNSwgMHhjNiwgMHhiMCwgMHgwNywgMHgxYywgMHg2OSwgMHg0NiwgMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgCisweGJiLCAweGZiLCAweGZjLCAweDg4LCAweDc4LCAweDc4LCAweDAxLCAweDI1LCAweDEwLCAweDI4LCAweDAxLCAweGQxLCAKKzB4MTksIDB4MmMsIDB4MDksIDB4ZDksIDB4MDAsIDB4YTgsIDB4MDAsIDB4NzgsIDB4NDAsIDB4MjMsIDB4MTgsIDB4NDMsIAorMHgwMCwgMHhhYiwgMHgxOCwgMHg3MCwgMHgwMiwgMHgyMCwgMHhkOCwgMHg4MCwgMHgwNCwgMHgzMywgMHgyNywgMHhlMCwgCisweGI4LCAweDY4LCAweGMwLCAweDQ2LCAweDA0LCAweDkwLCAweGY4LCAweDY4LCAweGMwLCAweDQ2LCAweDA1LCAweDkwLCAKKzB4MDYsIDB4YWEsIDB4ZmIsIDB4MWQsIDB4MDksIDB4MzMsIDB4MDAsIDB4MjEsIDB4NzgsIDB4NzgsIDB4MDAsIDB4MjgsIAorMHgwZCwgMHhkZCwgMHgwMCwgMHgyMCwgMHg0MCwgMHhjYiwgMHg0MCwgMHhjMiwgMHgwMSwgMHgzMCwgMHgwMCwgMHgwNCwgCisweDAwLCAweDBjLCAweDA0LCAweDI4LCAweGY4LCAweGRiLCAweDQ4LCAweDFjLCAweDAxLCAweDA0LCAweDA5LCAweDBjLCAKKzB4NzgsIDB4NzgsIDB4ODgsIDB4NDIsIDB4ZjEsIDB4ZGMsIDB4MGIsIDB4NDgsIDB4ZmYsIDB4ZjcsIDB4N2UsIDB4ZjksIAorMHgwNywgMHgxYywgMHgwYSwgMHg0YSwgMHgyMCwgMHgxYywgMHgwNCwgMHhhOSwgMHhmZiwgMHhmNywgMHg3YSwgMHhmOSwgCisweDA4LCAweDQ5LCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAweDc1LCAweGY5LCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAKKzB4ZmYsIDB4ZjcsIDB4YmUsIDB4ZmEsIDB4MjgsIDB4MWMsIDB4NDYsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMiwgMHhmZiwgMHhmZiwgMHhjNSwgMHhhZiwgMHgyMSwgMHg0MCwgCisweDNjLCAweDAyLCAweGZmLCAweGZmLCAweGYwLCAweGI1LCAweDg0LCAweGIwLCAweDA0LCAweDFjLCAweDAwLCAweDI3LCAKKzB4ZTYsIDB4ODgsIDB4YTIsIDB4NjgsIDB4NDcsIDB4NDksIDB4MDgsIDB4NzksIDB4MDAsIDB4MjgsIDB4MDgsIDB4ZDAsIAorMHgwMCwgMHgyZSwgMHgwMSwgMHhkMCwgMHgwMSwgMHgyZSwgMHgwMSwgMHhkMSwgMHgwMSwgMHgyNywgMHgwMSwgMHhlMCwgCisweDA0LCAweDJlLCAweDAwLCAweGQxLCAweDAzLCAweDI2LCAweDAxLCAweDI1LCAweDQxLCAweDQ4LCAweDA1LCAweDJlLCAKKzB4NjYsIDB4ZDIsIDB4MDIsIDB4YTMsIDB4OWIsIDB4NWQsIDB4NWIsIDB4MDAsIDB4OWYsIDB4NDQsIDB4MDAsIDB4MWMsIAorMHgwMywgMHgwNiwgMHgwOCwgMHgwYywgMHgxMCwgMHgwMCwgMHgwNSwgMHg4MCwgMHgwMCwgMHgyMywgMHgwMywgMHhlMCwgCisweDA1LCAweDgwLCAweDA1LCAweGUwLCAweDAwLCAweDIzLCAweDAzLCAweDgwLCAweDQzLCAweDgwLCAweDA2LCAweGUwLCAKKzB4MDAsIDB4MjMsIDB4MDMsIDB4ODAsIDB4NDUsIDB4ODAsIDB4MDIsIDB4ZTAsIDB4ZmYsIDB4MjMsIDB4MDEsIDB4MzMsIAorMHgwMywgMHg4MCwgMHhjYiwgMHgxZCwgMHg3OSwgMHgzMywgMHg5ZSwgMHg4OSwgMHgwMSwgMHgyMywgMHg1YiwgMHgwMiwgCisweDllLCAweDQyLCAweDAyLCAweGRiLCAweGQyLCAweDA3LCAweGQyLCAweDBmLCAweDAwLCAweGUwLCAweDAxLCAweDIyLCAKKzB4NmQsIDB4MjMsIDB4NWIsIDB4MDEsIDB4YzksIDB4MTgsIDB4ODksIDB4ODgsIDB4ZmYsIDB4MjMsIDB4ZTEsIDB4MzMsIAorMHg5OSwgMHg0MywgMHgwMSwgMHgyMywgMHgxOSwgMHg0MywgMHgwNiwgMHg4OCwgMHhmZiwgMHgzMywgMHg5ZSwgMHg0MiwgCisweDBkLCAweGQxLCAweGZmLCAweDIwLCAweGUxLCAweDMwLCAweDA4LCAweDQzLCAweDAwLCAweDJhLCAweDA0LCAweGQxLCAKKzB4MDEsIDB4MjMsIDB4OWIsIDB4MDIsIDB4OTgsIDB4NDMsIDB4MDEsIDB4MWMsIDB4MjAsIDB4ZTAsIDB4MDEsIDB4MjEsIAorMHg4OSwgMHgwMiwgMHgwMSwgMHg0MywgMHgxYywgMHhlMCwgMHgwMSwgMHgyZSwgMHgwYSwgMHhkMSwgMHg0MCwgMHg4OCwgCisweDAxLCAweDI4LCAweDA0LCAweGQxLCAweDYwLCAweDIzLCAweDE5LCAweDQzLCAweDAwLCAweDJhLCAweDEzLCAweGQwLCAKKzB4MGMsIDB4ZTAsIDB4MjAsIDB4MjMsIDB4MTksIDB4NDMsIDB4MGYsIDB4ZTAsIDB4MDAsIDB4MmUsIDB4MGQsIDB4ZDEsIAorMHg0MCwgMHg4OCwgMHgwMSwgMHgyOCwgMHgwOCwgMHhkMSwgMHhmZiwgMHgyMywgMHg4MSwgMHgzMywgMHgxOSwgMHg0MywgCisweDAwLCAweDJhLCAweDA1LCAweGQwLCAweDAxLCAweDIzLCAweDliLCAweDAyLCAweDE5LCAweDQzLCAweDAxLCAweGUwLCAKKzB4ODAsIDB4MjMsIDB4MTksIDB4NDMsIDB4MDQsIDB4MjAsIDB4MDIsIDB4ZjAsIDB4NzUsIDB4ZjksIDB4MDksIDB4MjEsIAorMHg0OSwgMHgwMiwgMHgwMCwgMHgyMCwgMHgwMiwgMHhmMCwgMHg3MCwgMHhmOSwgMHgwMCwgMHgyZiwgMHgwMiwgMHhkMSwgCisweDAwLCAweDIwLCAweDEyLCAweGUwLCAweGZmLCAweGU3LCAweDY5LCAweDQ2LCAweDIwLCAweDFjLCAweGZmLCAweGY3LCAKKzB4ZWYsIDB4ZmEsIDB4MDAsIDB4YTgsIDB4MDAsIDB4NzgsIDB4NDAsIDB4MjMsIDB4MTgsIDB4NDMsIDB4MDAsIDB4YWIsIAorMHgxOCwgMHg3MCwgMHgwMiwgMHgyMCwgMHhkOCwgMHg4MCwgMHg2OCwgMHg0NiwgMHgwMCwgMHgyMSwgMHgwNCwgMHgzMywgCisweGZmLCAweGY3LCAweDIyLCAweGZhLCAweDI4LCAweDFjLCAweDA0LCAweGIwLCAKKzB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHg4OCwgMHgxYywgMHgwMCwgMHg4MCwgMHhjMCwgMHg4OCwgMHg1MSwgMHgyMSwgMHg4OSwgMHgwMywgMHgwOCwgMHg2MiwgCisweDAwLCAweDIwLCAweDcwLCAweDQ3LCAweDgwLCAweGI1LCAweDE2LCAweDRmLCAweGY4LCAweDY4LCAweDAxLCAweDI4LCAKKzB4MDcsIDB4ZDEsIDB4MzcsIDB4MjMsIDB4OWIsIDB4MDEsIDB4ZjgsIDB4MTgsIDB4NDAsIDB4OGEsIDB4ODAsIDB4MjEsIAorMHgwMSwgMHg0MywgMHgxYiwgMHgyMCwgMHgwNywgMHhlMCwgMHg2ZCwgMHgyMywgMHg1YiwgMHgwMSwgMHhmOCwgMHgxOCwgCisweDgwLCAweDhiLCAweDAxLCAweDIxLCAweDQ5LCAweDAzLCAweDAxLCAweDQzLCAweDEwLCAweDIwLCAweDAyLCAweGYwLCAKKzB4MzMsIDB4ZjksIDB4MDEsIDB4MjAsIDB4NzEsIDB4MjMsIDB4NWIsIDB4MDEsIDB4ZjksIDB4MTgsIDB4MDgsIDB4ODAsIAorMHg0OCwgMHg4MCwgMHgxYiwgMHgyMywgMHhkYiwgMHgwMSwgMHhmOCwgMHgxOCwgMHg4MCwgMHg4YiwgMHgwMSwgMHgyMywgCisweDFiLCAweDAzLCAweDk4LCAweDQzLCAweDQxLCAweDIxLCAweDA5LCAweDAyLCAweDAxLCAweDQzLCAweDAwLCAweDIwLCAKKzB4MDIsIDB4ZjAsIDB4MjAsIDB4ZjksIDB4MDAsIDB4MjAsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg4MCwgMHhiNSwgMHgxNywgMHg0ZiwgMHhmOCwgMHg2OCwgMHgwMSwgMHgyOCwgCisweDA4LCAweGQxLCAweDM3LCAweDIzLCAweDliLCAweDAxLCAweGY4LCAweDE4LCAweDQwLCAweDhhLCAweDgwLCAweDIzLCAKKzB4OTgsIDB4NDMsIDB4MDEsIDB4MWMsIDB4MWIsIDB4MjAsIDB4MDgsIDB4ZTAsIDB4NmQsIDB4MjMsIDB4NWIsIDB4MDEsIAorMHhmOCwgMHgxOCwgMHg4MCwgMHg4YiwgMHgwMSwgMHgyMywgMHg1YiwgMHgwMywgMHg5OCwgMHg0MywgMHgwMSwgMHgxYywgCisweDEwLCAweDIwLCAweDAyLCAweGYwLCAweDAxLCAweGY5LCAweGZmLCAweDIwLCAweDcxLCAweDIzLCAweDViLCAweDAxLCAKKzB4ZjksIDB4MTgsIDB4MDEsIDB4MzAsIDB4MDgsIDB4ODAsIDB4MWIsIDB4MjMsIDB4ZGIsIDB4MDEsIDB4ZjgsIDB4MTgsIAorMHg4MCwgMHg4YiwgMHg0MSwgMHgyMywgMHgxYiwgMHgwMiwgMHg5OCwgMHg0MywgMHgwOSwgMHgyMSwgMHg0OSwgMHgwMiwgCisweDAxLCAweDQzLCAweDAwLCAweDIwLCAweDAyLCAweGYwLCAweGVlLCAweGY4LCAweDAwLCAweDIwLCAweDgwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ODAsIDB4YjUsIDB4ODQsIDB4YjAsIAorMHgwOCwgMHg0OSwgMHhjZiwgMHg2YSwgMHg2OSwgMHg0NiwgMHhmZiwgMHhmNywgMHg2OSwgMHhmYSwgMHhiOCwgMHgwNSwgCisweDgwLCAweDBkLCAweDAxLCAweGFiLCAweDU4LCAweDgwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZmLCAweGY3LCAKKzB4YTEsIDB4ZjksIDB4MDEsIDB4MjAsIDB4MDQsIDB4YjAsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHg0MCwgMHgwMCwgMHgxNCwgMHg0MCwgMHhjMCwgMHg4OCwgMHg5ZiwgMHgyMywgMHgxOCwgMHg0MCwgMHgwNSwgMHg0OSwgCisweGM5LCAweDZhLCAweDFiLCAweDIzLCAweDViLCAweDAxLCAweDE5LCAweDQwLCAweDA4LCAweDQzLCAweDAzLCAweDQ5LCAKKzB4YzAsIDB4NDYsIDB4YzgsIDB4NjIsIDB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIDB4NDAsIDB4MDAsIDB4MTQsIDB4NDAsIAorMHg0MCwgMHgwMCwgMHgxNCwgMHgwMCwgMHg4MCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgwZCwgMHg0OSwgMHgwZiwgMHg2YSwgCisweDAxLCAweDJmLCAweDAxLCAweGQxLCAweGZmLCAweDAzLCAweDA3LCAweGUwLCAweDAyLCAweDJmLCAweDAxLCAweGQxLCAKKzB4M2YsIDB4MDMsIDB4MDMsIDB4ZTAsIDB4MDAsIDB4MmYsIDB4MDEsIDB4ZDEsIDB4MDEsIDB4MjcsIDB4ZmYsIDB4MDIsIAorMHg2OSwgMHg0NiwgMHhmZiwgMHhmNywgMHgzNSwgMHhmYSwgMHgwMSwgMHhhYiwgMHg1ZiwgMHg4MCwgMHg2OCwgMHg0NiwgCisweDAwLCAweDIxLCAweGZmLCAweGY3LCAweDZmLCAweGY5LCAweDAxLCAweDIwLCAweDA0LCAweGIwLCAweDgwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MjAsIDB4MTQsIDB4NDAsIDB4YzIsIDB4ODgsIDB4YTEsIDB4MjAsIAorMHg0MCwgMHgwMywgMHgwMCwgMHgyMSwgMHgwMSwgMHgyMywgMHg1YiwgMHgwMywgMHg5YSwgMHg0MiwgMHgwMSwgMHhkMSwgCisweDAyLCAweDIyLCAweDA0LCAweGUwLCAweDAxLCAweDIzLCAweGRiLCAweDAzLCAweDlhLCAweDQyLCAweDAyLCAweGQxLCAKKzB4MDEsIDB4MjIsIDB4MDIsIDB4NjIsIDB4MDAsIDB4ZTAsIDB4MDEsIDB4NjIsIDB4MDgsIDB4MWMsIDB4NzAsIDB4NDcsIAorMHg5MCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgwNywgMHgxYywgMHgwMiwgMHhmMCwgMHg5ZiwgMHhmOCwgMHg2OSwgMHg0NiwgCisweDA0LCAweDFjLCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAweDBhLCAweGZhLCAweDAxLCAweGFiLCAweDVjLCAweDgwLCAKKzB4MDksIDB4NGYsIDB4ZjgsIDB4NmQsIDB4YzAsIDB4NDYsIDB4MDIsIDB4OTAsIDB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIAorMHhmZiwgMHhmNywgMHg0MCwgMHhmOSwgMHhmOCwgMHg2ZCwgMHhjMCwgMHgwNywgMHhjMCwgMHgwZiwgMHgwNSwgMHg0OSwgCisweGMwLCAweDQ2LCAweGM4LCAweDYyLCAweDAxLCAweDIwLCAweDA0LCAweGIwLCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4YTQsIDB4MmEsIDB4MDAsIDB4ODAsIDB4NjgsIDB4MWMsIDB4MDAsIDB4ODAsIAorMHhjMCwgMHg4OCwgMHgwMiwgMHg0OSwgMHhjMCwgMHg0NiwgMHg0OCwgMHg2MSwgMHgwMCwgMHgyMCwgMHg3MCwgMHg0NywgCisweDgwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweGI1LCAweDg0LCAweGIwLCAweDY5LCAweDQ2LCAweGZmLCAweGY3LCAKKzB4ZTMsIDB4ZjksIDB4MDYsIDB4NDgsIDB4YzAsIDB4NjgsIDB4MDEsIDB4YWIsIAorMHg1OCwgMHg4MCwgMHg2OCwgMHg0NiwgMHgwMCwgMHgyMSwgMHhmZiwgMHhmNywgMHgxYiwgMHhmOSwgMHgwMSwgMHgyMCwgCisweDA0LCAweGIwLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDE0LCAweDQwLCAKKzB4YzAsIDB4ODgsIDB4MDIsIDB4NDksIDB4YzAsIDB4NDYsIDB4YzgsIDB4NjAsIDB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIAorMHg4MCwgMHgwMCwgMHgxNCwgMHgwMCwgMHg4MCwgMHhiNSwgMHg4NCwgMHhiMCwgMHg2OSwgMHg0NiwgMHg4NywgMHg2OCwgCisweGZmLCAweGY3LCAweGM2LCAweGY5LCAweDIwLCAweDJmLCAweDA3LCAweGQyLCAweDc4LCAweDAwLCAweDBjLCAweDQ5LCAKKzB4NDAsIDB4MTgsIDB4MWIsIDB4MjMsIDB4ZGIsIDB4MDEsIDB4YzAsIDB4MTgsIDB4ODAsIDB4OGIsIDB4MDYsIDB4ZTAsIAorMHgwMCwgMHhhOCwgMHgwMCwgMHg3OCwgMHg0MCwgMHgyMywgMHgxOCwgMHg0MywgMHgwMCwgMHhhYiwgMHgxOCwgMHg3MCwgCisweDAyLCAweDIwLCAweDAxLCAweGFiLCAweDU4LCAweDgwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZmLCAweGY3LCAKKzB4ZWYsIDB4ZjgsIDB4MDEsIDB4MjAsIDB4MDQsIDB4YjAsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgwMCwgMHhiNSwgMHg4NCwgMHhiMCwgMHhjMSwgMHg4OCwgMHg4MiwgMHg2OCwgCisweDIwLCAweDJhLCAweDA0LCAweGQyLCAweDEwLCAweDFjLCAweDAyLCAweGYwLCAweDE3LCAweGY4LCAweDAwLCAweDIwLCAKKzB4MTAsIDB4ZTAsIDB4NjksIDB4NDYsIDB4ZmYsIDB4ZjcsIDB4OWEsIDB4ZjksIDB4MDAsIDB4YTgsIDB4MDAsIDB4NzgsIAorMHg0MCwgMHgyMywgMHgxOCwgMHg0MywgMHgwMCwgMHhhYiwgMHgxOCwgMHg3MCwgMHgwMiwgMHgyMCwgMHhkOCwgMHg4MCwgCisweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweDA0LCAweDMzLCAweGZmLCAweGY3LCAweGNkLCAweGY4LCAweDAxLCAweDIwLCAKKzB4MDQsIDB4YjAsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4OTAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4YzcsIDB4ODgsIAorMHg2OSwgMHg0NiwgMHhmZiwgMHhmNywgMHg4MywgMHhmOSwgMHgxMCwgMHg0OCwgMHhmZSwgMHhmNywgMHg3MiwgMHhmZiwgCisweDAyLCAweDIwLCAweDM5LCAweDFjLCAweDAyLCAweGYwLCAweGYyLCAweGZmLCAweDAwLCAweDI4LCAweDA2LCAweGQwLCAKKzB4MDIsIDB4MjAsIDB4MzksIDB4MWMsIDB4MDIsIDB4ZjAsIDB4MzYsIDB4ZmYsIDB4MDEsIDB4YWIsIDB4NTgsIDB4ODAsIAorMHgwMiwgMHhlMCwgMHg0NSwgMHgyMCwgMHgwMCwgMHhhYiwgMHgxOCwgMHg3MCwgMHgwNywgMHg0OSwgMHgyMCwgMHgxYywgCisweGZlLCAweGY3LCAweDVmLCAweGZmLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZmLCAweGY3LCAweGE4LCAweGY4LCAKKzB4MDEsIDB4MjAsIDB4MDQsIDB4YjAsIDB4OTAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHgyNCwgMHgwMiwgMHhmZiwgMHhmZiwgMHgzYywgMHgwMiwgMHhmZiwgMHhmZiwgMHhiMCwgMHhiNSwgMHg4NCwgMHhiMCwgCisweGM3LCAweDg4LCAweDY5LCAweDQ2LCAweDg0LCAweDY4LCAweGZmLCAweGY3LCAweDU3LCAweGY5LCAweDEwLCAweDQ4LCAKKzB4ZmUsIDB4ZjcsIDB4NDYsIDB4ZmYsIDB4MGYsIDB4NGEsIDB4MDIsIDB4MjAsIDB4MzksIDB4MWMsIDB4ZmUsIDB4ZjcsIAorMHg0MywgMHhmZiwgMHgwMCwgMHgyOCwgMHgwNiwgMHhkMCwgMHgwZCwgMHg0YiwgMHgwMiwgMHgyMCwgMHgzOSwgMHgxYywgCisweDIyLCAweDFjLCAweGZlLCAweGY3LCAweDNjLCAweGZmLCAweDAyLCAweGUwLCAweDQ1LCAweDIwLCAweDAwLCAweGFiLCAKKzB4MTgsIDB4NzAsIDB4MDksIDB4NDksIDB4MjgsIDB4MWMsIDB4ZmUsIDB4ZjcsIDB4MzIsIDB4ZmYsIDB4NjgsIDB4NDYsIAorMHgwMCwgMHgyMSwgMHhmZiwgMHhmNywgMHg3YiwgMHhmOCwgMHgwMSwgMHgyMCwgMHgwNCwgMHhiMCwgMHhiMCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDI0LCAweDAyLCAweGZmLCAweGZmLCAweDU5LCAweGIxLCAweDIxLCAweDQwLCAKKzB4NTksIDB4YjAsIDB4MjEsIDB4NDAsIDB4M2MsIDB4MDIsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4YjUsIDB4ZmYsIDB4ZjcsIAorMHg0MywgMHhmOSwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgyMCwgMHg3MCwgMHg0NywgMHg4MCwgMHhiNCwgCisweGMyLCAweDg4LCAweDE5LCAweDRiLCAweGExLCAweDIxLCAweDQ5LCAweDAzLCAweDAwLCAweDJhLCAweDAzLCAweGQxLCAKKzB4MTgsIDB4NmIsIDB4MTAsIDB4MjMsIDB4OTgsIDB4NDMsIDB4MDQsIDB4ZTAsIDB4MDEsIDB4MmEsIDB4MDQsIDB4ZDEsIAorMHgxOCwgMHg2YiwgMHgxMCwgMHgyMywgMHgxOCwgMHg0MywgMHg0OCwgMHg2MSwgMHgxZiwgMHhlMCwgMHgwMiwgMHgyYSwgCisweDFkLCAweGQxLCAweGMyLCAweDY4LCAweDg3LCAweDY4LCAweDAwLCAweDIwLCAweDNiLCAweDFjLCAweGMzLCAweDQwLCAKKzB4ZGIsIDB4MDcsIDB4ZGIsIDB4MGYsIDB4OWIsIDB4MDIsIDB4MDMsIDB4NDMsIDB4MGIsIDB4NjEsIDB4MDEsIDB4MzAsIAorMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgMHgyMCwgMHgyOCwgMHhmMywgMHhkYiwgMHgwMCwgMHgyMCwgMHgxMywgMHgxYywgCisweGMzLCAweDQwLCAweGRiLCAweDA3LCAweGRiLCAweDBmLCAweDliLCAweDAyLCAweGM3LCAweDFkLCAweDE5LCAweDM3LCAKKzB4M2IsIDB4NDMsIDB4MGIsIDB4NjEsIDB4MDEsIDB4MzAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4MjAsIDB4MjgsIAorMHhmMSwgMHhkYiwgMHgwMCwgMHgyMCwgMHg4MCwgMHhiYywgMHg3MCwgMHg0NywgMHg4MCwgMHgwMCwgMHgxNCwgMHg0MCwgCisweDgwLCAweGI0LCAweGMyLCAweDg4LCAweDgxLCAweDY4LCAweDEwLCAweDAyLCAweDEyLCAweDBhLCAweDEwLCAweDQzLCAKKzB4MDIsIDB4MDQsIDB4MTIsIDB4MGMsIDB4MGMsIDB4NDgsIDB4YzAsIDB4NDYsIDB4MDIsIDB4NjAsIDB4MGMsIDB4NGIsIAorMHhjMCwgMHg0NiwgMHgxYSwgMHg4MCwgMHgwYSwgMHgwYywgMHgxNywgMHgwMiwgCisweDEyLCAweDEyLCAweDNhLCAweDQzLCAweDEyLCAweDA0LCAweDEyLCAweDBjLCAweDQyLCAweDYwLCAweDVhLCAweDgwLCAKKzB4MDksIDB4MDQsIDB4MDksIDB4MGMsIDB4MGEsIDB4MDIsIDB4MDksIDB4MGEsIDB4MTEsIDB4NDMsIDB4MDksIDB4MDQsIAorMHgwOSwgMHgwYywgMHg4MSwgMHg2MCwgMHg5OSwgMHg4MCwgMHgwMCwgMHgyMCwgMHg4MCwgMHhiYywgMHg3MCwgMHg0NywgCisweDQwLCAweDAwLCAweDE0LCAweDAwLCAweDI4LCAweDFiLCAweDAwLCAweDgwLCAweGIwLCAweGI1LCAweDg0LCAweGIwLCAKKzB4MTMsIDB4NDksIDB4MGEsIDB4NjgsIDB4MTIsIDB4MDQsIDB4MTIsIDB4MGMsIDB4MTMsIDB4MDIsIDB4MTIsIDB4MTIsIAorMHgxMywgMHg0MywgMHg0YSwgMHg2OCwgMHgxMiwgMHgwNCwgMHgxMiwgMHgwYywgMHgxZiwgMHgxYywgMHgxMywgMHgwMiwgCisweDEyLCAweDEyLCAweDEzLCAweDQzLCAweDg5LCAweDY4LCAweDA5LCAweDA0LCAweDA5LCAweDBjLCAweDBhLCAweDAyLCAKKzB4MDksIDB4MTIsIDB4MTEsIDB4NDMsIDB4MGMsIDB4MDQsIDB4MjQsIDB4MGMsIDB4NjksIDB4NDYsIDB4MWQsIDB4MWMsIAorMHhmZiwgMHhmNywgMHhhZSwgMHhmOCwgMHgwMSwgMHhhYiwgMHg1ZiwgMHg4MCwgMHgyOCwgMHgwNCwgMHgyMCwgMHg0MywgCisweDAyLCAweDkwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZlLCAweGY3LCAweGU1LCAweGZmLCAweDAxLCAweDIwLCAKKzB4MDQsIDB4YjAsIDB4YjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NDAsIDB4MDAsIDB4MTQsIDB4NDAsIAorMHhjMSwgMHg4OCwgMHg4MiwgMHg2OCwgMHgwOCwgMHgwMiwgMHgwOSwgMHgwYSwgMHgwOCwgMHg0MywgMHgwMCwgMHgwNCwgCisweDAwLCAweDBjLCAweDBhLCAweDQ5LCAweGMwLCAweDQ2LCAweGM4LCAweDYwLCAweDEwLCAweDBjLCAweDAzLCAweDAyLCAKKzB4MDAsIDB4MTIsIDB4MTgsIDB4NDMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4MDgsIDB4NjEsIDB4MTAsIDB4MDQsIAorMHgwMCwgMHgwYywgMHgwMiwgMHgwMiwgMHgwMCwgMHgwYSwgMHgxMCwgMHg0MywgMHgwMCwgMHgwNCwgMHgwMCwgMHgwYywgCisweDQ4LCAweDYxLCAweDAwLCAweDIwLCAweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweDE0LCAweDAwLCAKKzB4OTAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4MTYsIDB4NGIsIDB4ZDksIDB4NjgsIDB4MDksIDB4MDQsIDB4MDksIDB4MGMsIAorMHgwYSwgMHgwMiwgMHgwOSwgMHgxMiwgMHgxMSwgMHg0MywgMHgxYSwgMHg2OSwgMHgxMiwgMHgwNCwgMHgxMiwgMHgwYywgCisweDE3LCAweDAyLCAweDEyLCAweDEyLCAweDNhLCAweDQzLCAweDViLCAweDY5LCAweDFiLCAweDA0LCAweDFiLCAweDBjLCAKKzB4MWYsIDB4MDIsIDB4MWIsIDB4MTIsIDB4M2IsIDB4NDMsIDB4MWYsIDB4MDQsIDB4M2YsIDB4MGMsIDB4MDUsIDB4MjMsIAorMHgwMCwgMHg5MywgMHg4NCwgMHg4OCwgMHgwMSwgMHhhYiwgMHgxYywgMHg4MCwgMHgwMCwgMHgyNCwgMHgwNCwgMHgzYiwgCisweDVjLCAweDcwLCAweDQwLCAweDg4LCAweDAwLCAweGFiLCAweDU4LCAweDgwLCAweGQ5LCAweDgwLCAweDEwLCAweDA0LCAKKzB4MzgsIDB4NDMsIDB4MDIsIDB4OTAsIDB4MDMsIDB4OTQsIDB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIDB4ZmUsIDB4ZjcsIAorMHg5NSwgMHhmZiwgMHgwMSwgMHgyMCwgMHgwNCwgMHhiMCwgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDQwLCAweDAwLCAweDE0LCAweDQwLCAweDAwLCAweGI1LCAweDg0LCAweGIwLCAweDBiLCAweDQ5LCAweDhhLCAweDZhLCAKKzB4MDUsIDB4MjEsIDB4MDAsIDB4OTEsIDB4ODEsIDB4ODgsIDB4MDEsIDB4YWIsIDB4MTksIDB4ODAsIDB4MDAsIDB4MjEsIAorMHgwNCwgMHgzYiwgMHg1OSwgMHg3MCwgMHg0MCwgMHg4OCwgMHgwMCwgMHhhYiwgMHg1OCwgMHg4MCwgMHhkYSwgMHg4MCwgCisweDAyLCAweDkxLCAweDAzLCAweDkxLCAweDY4LCAweDQ2LCAweGZlLCAweGY3LCAweDc5LCAweGZmLCAweDAxLCAweDIwLCAKKzB4MDQsIDB4YjAsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4YzAsIDB4MDAsIDB4MTQsIDB4NDAsIAorMHhjMCwgMHg4OCwgMHgwMiwgMHg0OSwgMHhjMCwgMHg0NiwgMHg4OCwgMHg2MiwgMHgwMCwgMHgyMCwgMHg3MCwgMHg0NywgCisweGMwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweGI1LCAweDg0LCAweGIwLCAweDBiLCAweDQ5LCAweDBhLCAweDZhLCAKKzB4MDUsIDB4MjEsIDB4MDAsIDB4OTEsIDB4ODEsIDB4ODgsIDB4MDEsIDB4YWIsIDB4MTksIDB4ODAsIDB4MDAsIDB4MjEsIAorMHgwNCwgMHgzYiwgMHg1OSwgMHg3MCwgMHg0MCwgMHg4OCwgMHgwMCwgMHhhYiwgMHg1OCwgMHg4MCwgMHhkYSwgMHg4MCwgCisweDAyLCAweDkxLCAweDAzLCAweDkxLCAweDY4LCAweDQ2LCAweGZlLCAweGY3LCAweDU1LCAweGZmLCAweDAxLCAweDIwLCAKKzB4MDQsIDB4YjAsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4YzAsIDB4MDAsIDB4MTQsIDB4NDAsIAorMHhjMCwgMHg4OCwgMHgwMiwgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2MiwgMHgwMCwgMHgyMCwgMHg3MCwgMHg0NywgCisweGMwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweGI1LCAweGMwLCAweDg4LCAweDAyLCAweDQ5LCAweGZlLCAweGY3LCAKKzB4ZjQsIDB4ZmQsIDB4MDAsIDB4MjAsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NzUsIDB4MDIsIDB4ZmYsIDB4ZmYsIAorMHgwMCwgMHhiNSwgMHg4NCwgMHhiMCwgMHg2OSwgMHg0NiwgMHhmZSwgMHhmNywgMHhmNywgMHhmZiwgMHgwNiwgMHg0OCwgCisweDAwLCAweDZiLCAweDAxLCAweGFiLCAweDU4LCAweDgwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZlLCAweGY3LCAKKzB4MmYsIDB4ZmYsIDB4MDEsIDB4MjAsIDB4MDQsIDB4YjAsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgwMCwgMHhiNSwgMHhmZSwgMHhmNywgMHhmZCwgMHhmZiwgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweGI1LCAweGZlLCAweGY3LCAweGY4LCAweGZmLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIDB4ZjMsIDB4ZmYsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHg4MCwgMHhiNSwgMHgwNywgMHgxYywgMHgxMCwgMHg0OCwgMHhmZSwgMHhmNywgMHhjNiwgMHhmZCwgCisweDAxLCAweDIwLCAweDQwLCAweDAyLCAweGExLCAweDIxLCAweDQ5LCAweDAzLCAweDg4LCAweDYwLCAweDAwLCAweDIxLCAKKzB4MGMsIDB4NDgsIDB4YzAsIDB4NDYsIDB4MDEsIDB4NzEsIDB4MGMsIDB4NDgsIDB4MDIsIDB4NjgsIDB4NTIsIDB4MGMsIAorMHgwNSwgMHhkMiwgMHgwMiwgMHg2OCwgMHgxMiwgMHgwYywgMHgwNiwgMHhkMSwgMHgwMCwgMHg2OCwgMHg4MCwgMHgwYSwgCisweDAzLCAweGQzLCAweDA4LCAweDQ4LCAweGMwLCAweDQ2LCAweGM3LCAweDYwLCAweDAyLCAweGUwLCAweDA3LCAweDQ4LCAKKzB4YzAsIDB4NDYsIDB4MDcsIDB4NjQsIDB4MDgsIDB4MWMsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHhkNSwgMHg5NCwgMHgyMSwgMHg0MCwgMHgyOCwgMHgwZiwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgxMCwgMHg0MCwgCisweDQwLCAweDAxLCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweGI1LCAweDAxLCAweDIwLCAKKzB4MDMsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NzIsIDB4MTIsIDB4MjAsIDB4ZmYsIDB4ZjcsIDB4Y2IsIDB4ZmYsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg4OCwgMHgxYywgMHgwMCwgMHg4MCwgMHgwMCwgMHhiNSwgMHgwMSwgMHgyMCwgCisweDAzLCAweDQ5LCAweGMwLCAweDQ2LCAweDQ4LCAweDcyLCAweDE1LCAweDIwLCAweGZmLCAweGY3LCAweGJmLCAweGZmLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4ODgsIDB4MWMsIDB4MDAsIDB4ODAsIDB4MDAsIDB4YjUsIDB4MDEsIDB4ZjAsIAorMHhmOSwgMHhmZiwgMHgwMSwgMHgyMCwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg4MCwgMHhiNSwgMHg4NCwgMHhiMCwgCisweDA3LCAweDFjLCAweGY4LCAweDg4LCAweDAyLCAweGYwLCAweGZlLCAweGY4LCAweDAwLCAweDI4LCAweDBjLCAweGQxLCAKKzB4NjksIDB4NDYsIDB4MzgsIDB4MWMsIDB4ZmUsIDB4ZjcsIDB4ODIsIDB4ZmYsIDB4MDYsIDB4NDgsIDB4MDEsIDB4YWIsIAorMHg1OCwgMHg4MCwgMHg2OCwgMHg0NiwgMHgwMCwgMHgyMSwgMHhmZSwgMHhmNywgMHhiYiwgMHhmZSwgMHgwMSwgMHgyMCwgCisweDAwLCAweGUwLCAweDAwLCAweDIwLCAweDA0LCAweGIwLCAweDgwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ODAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4NjksIDB4NDYsIDB4ZmUsIDB4ZjcsIAorMHg2ZCwgMHhmZiwgMHgwMSwgMHgyNywgMHgwMSwgMHhhYiwgMHg1ZiwgMHg4MCwgMHgwOSwgMHg0OCwgMHg4MSwgMHg4OSwgCisweDA5LCAweDA0LCAweGMyLCAweDg5LCAweDExLCAweDQzLCAweDAyLCAweDkxLCAweDgxLCAweDg4LCAweDA5LCAweDA0LCAKKzB4YzAsIDB4ODgsIDB4MDgsIDB4NDMsIDB4MDMsIDB4OTAsIDB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIDB4ZmUsIDB4ZjcsIAorMHg5YiwgMHhmZSwgMHgzOCwgMHgxYywgMHgwNCwgMHhiMCwgMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDRjLCAweDJhLCAweDAwLCAweDgwLCAweDAwLCAweGI1LCAweGZlLCAweGY3LCAweDY5LCAweGZmLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIDB4NjQsIDB4ZmYsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHgwMCwgMHhiNSwgMHhmZSwgMHhmNywgMHg1ZiwgMHhmZiwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgCisweGZlLCAweGY3LCAweDVhLCAweGZmLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweGI1LCAweGZlLCAweGY3LCAKKzB4NTUsIDB4ZmYsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIDB4NTAsIDB4ZmYsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgMHhmZSwgMHhmNywgMHg0YiwgMHhmZiwgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweGI1LCAweGZlLCAweGY3LCAweDQ2LCAweGZmLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIDB4NDEsIDB4ZmYsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIAorMHhmZSwgMHhmNywgMHgzYywgMHhmZiwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgMHhmZSwgMHhmNywgCisweDM3LCAweGZmLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweGI1LCAweGZlLCAweGY3LCAweDMyLCAweGZmLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIDB4OGMsIDB4YjAsIDB4MDgsIDB4YTksIDB4ZmUsIDB4ZjcsIAorMHgxMywgMHhmZiwgMHg2OSwgMHg0NiwgMHgwOCwgMHhhOCwgMHgwMiwgMHhmMCwgMHhhOSwgMHhmZiwgMHgwMiwgMHgyMCwgCisweDA4LCAweGFiLCAweDU4LCAweDcwLCAweDY5LCAweDQ2LCAweDA4LCAweGE4LCAweGZlLCAweGY3LCAweDQ4LCAweGZlLCAKKzB4MDEsIDB4MjAsIDB4MGMsIDB4YjAsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIAorMHgxOSwgMHhmZiwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg5MCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgwNywgMHgxYywgCisweDY5LCAweDQ2LCAweDM4LCAweDFjLCAweGZlLCAweGY3LCAweGY4LCAweGZlLCAweGZhLCAweDg4LCAweDEyLCAweDQ5LCAKKzB4MDEsIDB4MjQsIDB4YzgsIDB4MWQsIDB4ODksIDB4MzAsIDB4MDAsIDB4MmEsIDB4MGYsIDB4ZDAsIDB4MDQsIDB4NzAsIAorMHg0NCwgMHg3MCwgMHhiOCwgMHg2OCwgMHgwMCwgMHgwYywgMHg4MCwgMHgzMSwgMHhjOCwgMHg4MiwgMHhiOCwgMHg2OCwgCisweGMwLCAweDQ2LCAweDA4LCAweDgzLCAweGY4LCAweDY4LCAweDAwLCAweDBjLCAweDQ4LCAweDgzLCAweGY4LCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4ODgsIDB4ODMsIDB4MDIsIDB4ZTAsIDB4MDAsIDB4MjEsIAorMHgwMSwgMHg3MCwgMHg0MSwgMHg3MCwgMHgwNiwgMHg0OCwgMHgwMSwgMHhhYiwgMHg1OCwgMHg4MCwgMHg2OCwgMHg0NiwgCisweDAwLCAweDIxLCAweGZlLCAweGY3LCAweDE3LCAweGZlLCAweDIwLCAweDFjLCAweDA0LCAweGIwLCAweDkwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIAorMHgwMCwgMHhiNSwgMHhmZSwgMHhmNywgMHhlMywgMHhmZSwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgCisweGZlLCAweGY3LCAweGRlLCAweGZlLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweGI1LCAweGZlLCAweGY3LCAKKzB4ZDksIDB4ZmUsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIDB4ZDQsIDB4ZmUsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgMHhmZSwgMHhmNywgMHhjZiwgMHhmZSwgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDkwLCAweGI1LCAweDg0LCAweGIwLCAweDA3LCAweDFjLCAweDY5LCAweDQ2LCAweDM4LCAweDFjLCAKKzB4ZmUsIDB4ZjcsIDB4YWUsIDB4ZmUsIDB4ZjgsIDB4ODgsIDB4MDMsIDB4MjQsIDB4ZTQsIDB4MDQsIDB4MDQsIDB4NDMsIAorMHgwMywgMHgyMywgMHhkYiwgMHgwNCwgMHg5YywgMHg0MiwgMHgwMiwgMHhkMywgMHgwZiwgMHg0YiwgMHg5YywgMHg0MiwgCisweDA2LCAweGQ5LCAweDBmLCAweDQ4LCAweDAxLCAweGFiLCAweDU4LCAweDgwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAKKzB4ZmUsIDB4ZjcsIDB4ZGMsIDB4ZmQsIDB4MDEsIDB4MjAsIDB4ODAsIDB4MDcsIDB4MjAsIDB4NDMsIDB4MDAsIDB4NjgsIAorMHgwMCwgMHgyMSwgMHgwMCwgMHhhYiwgMHg1OSwgMHg3MCwgMHhmYSwgMHg4OCwgMHhjMCwgMHg0NiwgMHhkYSwgMHg4MCwgCisweDAyLCAweDkwLCAweDAzLCAweDkxLCAweDY4LCAweDQ2LCAweDA0LCAweDMzLCAweGZlLCAweGY3LCAweGNjLCAweGZkLCAKKzB4MDEsIDB4MjAsIDB4MDQsIDB4YjAsIDB4OTAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHhlMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHg4MCwgMHhiNSwgMHg4NCwgMHhiMCwgCisweDA3LCAweDFjLCAweDY5LCAweDQ2LCAweDM4LCAweDFjLCAweGZlLCAweGY3LCAweDdiLCAweGZlLCAweGY4LCAweDg4LCAKKzB4MDMsIDB4MjMsIDB4ZGIsIDB4MDQsIDB4MTgsIDB4NDMsIDB4OTgsIDB4NDIsIDB4MDIsIDB4ZDMsIDB4MGEsIDB4NGIsIAorMHg5OCwgMHg0MiwgMHgwOCwgMHhkOSwgMHgwOSwgMHg0OCwgMHgwMSwgMHhhYiwgMHg1OCwgMHg4MCwgMHg2OCwgMHg0NiwgCisweDAwLCAweDIxLCAweGZlLCAweGY3LCAweGFiLCAweGZkLCAweDAxLCAweDIwLCAweDAzLCAweGUwLCAweGI5LCAweDY4LCAKKzB4YzAsIDB4NDYsIDB4MDEsIDB4NjAsIDB4MDAsIDB4MjAsIDB4MDQsIDB4YjAsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIAorMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHhlMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgCisweDgwLCAweGI1LCAweDg2LCAweGIwLCAweDAyLCAweGE5LCAweGZlLCAweGY3LCAweDU3LCAweGZlLCAweDAxLCAweDI3LCAKKzB4MDIsIDB4YWIsIDB4NWYsIDB4NzAsIDB4MDAsIDB4MjAsIDB4ZDgsIDB4ODAsIDB4MGEsIDB4NDgsIDB4NDEsIDB4NjgsIAorMHhjMCwgMHg0NiwgMHgwNCwgMHg5MSwgMHg4MSwgMHg2OCwgMHhjMCwgMHg0NiwgMHgwNSwgMHg5MSwgMHhjMSwgMHg2OCwgCisweGMwLCAweDQ2LCAweDAwLCAweDkxLCAweDQwLCAweDY5LCAweGMwLCAweDQ2LCAweDAxLCAweDkwLCAweDY5LCAweDQ2LCAKKzB4MDIsIDB4YTgsIDB4ZmUsIDB4ZjcsIDB4ODEsIDB4ZmQsIDB4MzgsIDB4MWMsIDB4MDYsIDB4YjAsIDB4ODAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg2OCwgMHgxOSwgMHgwMCwgMHg4MCwgMHgwMCwgMHhiNSwgMHhjMSwgMHg2OCwgCisweDgwLCAweDY4LCAweGZlLCAweGY3LCAweDQ3LCAweGZiLCAweDAwLCAweDIwLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIDB4OTAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4MDQsIDB4MWMsIDB4MGYsIDB4MWMsIAorMHg2OCwgMHg0NiwgMHg1MCwgMHgyMSwgMHhmZSwgMHhmNywgMHgzNiwgMHhmZSwgMHgwMSwgMHhhYiwgMHg1YywgMHg4MCwgCisweDAyLCAweDk3LCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZlLCAweGY3LCAweDYxLCAweGZkLCAweDA0LCAweGIwLCAKKzB4OTAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4ODAsIDB4YjUsIDB4ODQsIDB4YjAsIDB4MDcsIDB4MWMsIAorMHg2OCwgMHg0NiwgMHg1MSwgMHgyMSwgMHhmZSwgMHhmNywgMHgyNCwgMHhmZSwgMHgwMSwgMHhhYiwgMHg1ZiwgMHg4MCwgCisweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZlLCAweGY3LCAweDUwLCAweGZkLCAweDA0LCAweGIwLCAweDgwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIAorMHg5MCwgMHhiNSwgMHg4NCwgMHhiMCwgMHgwMCwgMHgyNywgMHgxMiwgMHg0OSwgMHgwOSwgMHg2OCwgMHgxMiwgMHg0YSwgCisweDEyLCAweDZiLCAweDEwLCAweDIzLCAweDFhLCAweDQwLCAweDAxLCAweDI0LCAweDAwLCAweDJhLCAweDAwLCAweGQwLCAKKzB4MDEsIDB4MjcsIDB4OGEsIDB4MGMsIDB4MDMsIDB4ZDMsIDB4M2EsIDB4MDQsIDB4MTIsIDB4MGMsIDB4MDIsIDB4MjcsIAorMHgxNywgMHg0MywgMHhjOSwgMHgwYywgMHgwMywgMHhkMywgMHgzOSwgMHgwNCwgMHgwOSwgMHgwYywgMHgwNCwgMHgyNywgCisweDBmLCAweDQzLCAweDY5LCAweDQ2LCAweGZlLCAweGY3LCAweGVjLCAweGZkLCAweDAxLCAweGFiLCAweDVmLCAweDgwLCAKKzB4NjgsIDB4NDYsIDB4MDAsIDB4MjEsIDB4ZmUsIDB4ZjcsIDB4MjYsIDB4ZmQsIDB4MjAsIDB4MWMsIDB4MDQsIDB4YjAsIAorMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgCisweDAwLCAweDAwLCAweDEwLCAweDQwLCAweGMwLCAweDAwLCAweDE4LCAweDQwLCAweDAwLCAweGI1LCAweDg0LCAweGIwLCAKKzB4NjksIDB4NDYsIDB4ZmUsIDB4ZjcsIDB4ZDcsIDB4ZmQsIDB4MDYsIDB4NDgsIDB4YzAsIDB4NmQsIDB4MDEsIDB4YWIsIAorMHg1OCwgMHg4MCwgMHg2OCwgMHg0NiwgMHgwMCwgMHgyMSwgMHhmZSwgMHhmNywgMHgwZiwgMHhmZCwgMHgwMSwgMHgyMCwgCisweDA0LCAweGIwLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweGE0LCAweDJhLCAweDAwLCAweDgwLCAKKzB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIDB4ZGQsIDB4ZmQsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NzAsIDB4NDcsIAorMHgwMCwgMHgyMCwgMHg3MCwgMHg0NywgMHgwMCwgMHgyMCwgMHg3MCwgMHg0NywgMHgwMCwgMHgyMCwgMHg3MCwgMHg0NywgCisweDAwLCAweDIwLCAweDcwLCAweDQ3LCAweDAwLCAweDIwLCAweDcwLCAweDQ3LCAweDAwLCAweDIwLCAweDcwLCAweDQ3LCAKKzB4MDAsIDB4YjUsIDB4ZmUsIDB4ZjcsIDB4Y2IsIDB4ZmQsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHg4MCwgMHhiNSwgMHg4NSwgMHhiMCwgMHgwMSwgMHhhOSwgMHhmZSwgMHhmNywgMHhhYiwgMHhmZCwgMHgwMCwgMHgyMCwgCisweDAxLCAweGFiLCAweDU4LCAweDcwLCAweDBjLCAweDQ5LCAweGM5LCAweDY4LCAweDAxLCAweDI3LCAweDAxLCAweDI5LCAKKzB4MDIsIDB4ZDEsIDB4MDMsIDB4OTcsIDB4MDQsIDB4OTcsIDB4MDEsIDB4ZTAsIDB4MDMsIDB4OTcsIDB4MDQsIDB4OTAsIAorMHg2OCwgMHg0NiwgMHgwMSwgMHhmMCwgMHgzMywgMHhmZCwgMHgwMiwgMHhhYiwgMHgwMCwgMHg5OCwgMHhjMCwgMHg0NiwgCisweDU4LCAweDgwLCAweDAwLCAweDIxLCAweDAxLCAweGE4LCAweGZlLCAweGY3LCAweGQzLCAweGZjLCAweDM4LCAweDFjLCAKKzB4MDUsIDB4YjAsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHg3MCwgMHg0NywgMHgwNCwgMHg0OSwgMHgwMCwgMHgyMCwgMHgwMCwgMHgyMiwgMHgwYSwgMHg3MCwgMHgwMSwgMHgzMCwgCisweDAxLCAweDMxLCAweDY4LCAweDI4LCAweGZhLCAweGQzLCAweDcwLCAweDQ3LCAweGEwLCAweDgyLCAweDIwLCAweDQwLCAKKzB4MDAsIDB4MjIsIDB4ODgsIDB4NDIsIDB4MDMsIDB4ZDMsIDB4NDAsIDB4MWEsIDB4MDEsIDB4MzIsIDB4ODgsIDB4NDIsIAorMHhmYiwgMHhkMiwgMHgxMCwgMHgxYywgMHg3MCwgMHg0NywgMHg4OCwgMHg0MiwgMHgwMiwgMHhkMywgMHg0MCwgMHgxYSwgCisweDg4LCAweDQyLCAweGZjLCAweGQyLCAweDcwLCAweDQ3LCAweDkwLCAweGI0LCAweDAxLCAweDFjLCAweGZmLCAweDI3LCAKKzB4MDQsIDB4MjksIDB4MjcsIDB4ZGEsIDB4MDAsIDB4MjAsIDB4MTQsIDB4NGEsIDB4NDMsIDB4MDAsIDB4MWIsIDB4MTgsIAorMHhkYiwgMHgwMCwgMHhkNCwgMHg1OCwgMHg2MywgMHgwYywgMHgxYSwgMHhkMiwgMHg0YiwgMHgwMCwgMHg1OSwgMHgxOCwgCisweGM5LCAweDAwLCAweDU3LCAweDU4LCAweDQzLCAweDAwLCAweDFiLCAweDE4LCAweGRiLCAweDAwLCAweGQ3LCAweDUwLCAKKzB4ODksIDB4MTgsIDB4OWEsIDB4MTgsIDB4NGYsIDB4NjgsIDB4YzAsIDB4NDYsIDB4NTcsIDB4NjAsIDB4OGIsIDB4NjgsIAorMHhjMCwgMHg0NiwgMHg5MywgMHg2MCwgMHgwYiwgMHg2OSwgMHhjMCwgMHg0NiwgMHgxMywgMHg2MSwgMHg0YiwgMHg2OSwgCisweGMwLCAweDQ2LCAweDUzLCAweDYxLCAweGM5LCAweDY4LCAweGMwLCAweDQ2LCAweGQxLCAweDYwLCAweDkwLCAweGJjLCAKKzB4NzAsIDB4NDcsIDB4MDEsIDB4MzAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MGUsIDB4MDQsIDB4MjgsIDB4ZDksIDB4ZGIsIAorMHgzOCwgMHgxYywgMHhmNiwgMHhlNywgMHg0MCwgMHhhYiwgMHgyMCwgMHg0MCwgMHhmNywgMHhiNSwgMHhjNCwgMHhiMCwgCisweDA0LCAweDFjLCAweDAwLCAweDIwLCAweDQ2LCAweDlhLCAweDExLCAweDIxLCAweDExLCAweDQwLCAweDZlLCAweGQwLCAKKzB4MDAsIDB4MjcsIDB4NzksIDB4MDAsIDB4YzksIDB4MTksIDB4YzksIDB4MDAsIDB4NTcsIDB4NGEsIDB4NTEsIDB4NTgsIAorMHg0OSwgMHgwYywgMHgwMywgMHhkMiwgMHgwMSwgMHgzMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwZSwgMHgwNCwgMHhlMCwgCisweDc5LCAweDFjLCAweDBmLCAweDA2LCAweDNmLCAweDBlLCAweDA0LCAweDJmLCAweGVmLCAweGRiLCAweDAwLCAweDI4LCAKKzB4NWIsIDB4ZDAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4MjIsIDB4MDAsIDB4OTIsIDB4NDAsIDB4MjMsIDB4MDAsIDB4MjEsIAorMHgwMCwgMHgyMCwgMHgwMiwgMHhhYSwgMHgwMCwgMHhmMCwgMHg4OCwgMHhmYSwgMHgwNCwgMHhhOSwgMHgwMCwgMHgyMCwgCisweDgyLCAweDAwLCAweDhhLCAweDU4LCAweDEyLCAweDA2LCAweDEyLCAweDBlLCAweGEyLCAweDQyLCAweDAzLCAweGQxLCAKKzB4NzIsIDB4MWMsIDB4MTYsIDB4MDYsIDB4MzYsIDB4MGUsIDB4MDQsIDB4ZTAsIDB4MDEsIDB4MzAsIDB4MDAsIDB4MDYsIAorMHgwMCwgMHgwZSwgMHgxMCwgMHgyOCwgMHhmMCwgMHhkYiwgMHgwMCwgMHgyZSwgMHgzZCwgMHhkMCwgMHgwNCwgMHgyYywgCisweDNlLCAweGQxLCAweDgwLCAweDAwLCAweDA4LCAweDU4LCAweDQwLCAweDAxLCAweDgwLCAweDBkLCAweDAwLCAweDIyLCAKKzB4MDAsIDB4OTIsIDB4MTAsIDB4MjMsIDB4MDAsIDB4MjEsIDB4MDIsIDB4YWEsIDB4MDAsIDB4ZjAsIDB4NjgsIDB4ZmEsIAorMHgwMCwgMHgyMSwgMHgwMSwgMHg5MSwgMHgwMiwgMHhhOCwgMHgwNSwgMHg5OSwgMHg0OSwgMHgwYywgMHg4OSwgMHgwNSwgCisweDI5LCAweGQwLCAweGMxLCAweDY4LCAweDBhLCAweDA2LCAweDEyLCAweDBlLCAweDQ1LCAweDliLCAweDlhLCAweDQyLCAKKzB4MTEsIDB4ZDEsIDB4YzAsIDB4NjgsIDB4NDAsIDB4MDEsIDB4ODYsIDB4MGQsIDB4MDAsIDB4MjIsIDB4MDAsIDB4OTIsIAorMHgwYywgMHgyMywgMHgwMCwgMHgyMSwgMHgzMCwgMHgxYywgMHgwMiwgMHhhYSwgMHgwMCwgMHhmMCwgMHg1MCwgMHhmYSwgCisweDAxLCAweDk5LCAweDAyLCAweDlkLCAweDQ4LCAweDFjLCAweDAxLCAweDA2LCAKKzB4MDksIDB4MGUsIDB4MDEsIDB4OTEsIDB4MGUsIDB4ZTAsIDB4NDgsIDB4MDEsIDB4ODYsIDB4MGQsIDB4MDAsIDB4MjIsIAorMHgwMCwgMHg5MiwgMHgxMCwgMHgyMywgMHgwMCwgMHgyMSwgMHgzMCwgMHgxYywgMHgwMiwgMHhhYSwgMHgwMCwgMHhmMCwgCisweDNmLCAweGZhLCAweDAyLCAweGE4LCAweDA1LCAweDk5LCAweDQ5LCAweDBjLCAweDg5LCAweDA1LCAweGQ4LCAweGQxLCAKKzB4MDEsIDB4OTksIDB4MDAsIDB4MjksIDB4MGYsIDB4ZDEsIDB4ZmYsIDB4MjAsIDB4M2QsIDB4ZTAsIDB4NDAsIDB4ZTAsIAorMHg4MCwgMHgwMCwgMHgwOCwgMHg1OCwgMHg0MCwgMHgwMSwgMHg4NiwgMHgwZCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg5MiwgCisweDBjLCAweDIzLCAweDAwLCAweDIxLCAweDMwLCAweDFjLCAweDAyLCAweGFhLCAweDAwLCAweGYwLCAweDI4LCAweGZhLCAKKzB4MDIsIDB4OWQsIDB4MDEsIDB4MjAsIDB4MDAsIDB4MDQsIDB4NDYsIDB4OWEsIDB4MTAsIDB4NDMsIDB4NzksIDB4MDAsIAorMHhjOSwgMHgxOSwgMHhjOSwgMHgwMCwgMHgxNywgMHg0YSwgMHhjMCwgMHg0NiwgMHg1MCwgMHg1MCwgMHgzMCwgMHgxYywgCisweDhlLCAweDE4LCAweDcwLCAweDYwLCAweDEwLCAweDIwLCAweDA0LCAweDJjLCAweDAwLCAweGQwLCAweDBjLCAweDIwLCAKKzB4MDQsIDB4MWMsIDB4YjAsIDB4NjAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MjEsIDB4NDYsIDB4OWEsIDB4MTEsIDB4NDAsIAorMHgyMCwgMHgyOSwgMHgwMCwgMHhkMCwgMHgyOCwgMHgxYywgMHgzMCwgMHg2MSwgMHgyOCwgMHgxOSwgMHhmZiwgMHgyMSwgCisweGZmLCAweDMwLCAweDA4LCAweDMwLCAweDA5LCAweDMxLCAweGZmLCAweGY3LCAweDE5LCAweGZmLCAweDQzLCAweDAxLCAKKzB4MTgsIDB4MTgsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MWIsIDB4NzAsIDB4NjEsIDB4MDAsIDB4MjAsIDB4NTAsIDB4MjEsIAorMHg0NiwgMHg5YSwgMHgxMSwgMHg0MCwgMHg1MCwgMHgyOSwgMHgwMCwgMHhkMSwgMHgyOCwgMHgxYywgMHhmMCwgMHg2MCwgCisweDM4LCAweDFjLCAweDQ3LCAweGIwLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweGZmLCAweDIwLCAKKzB4ZjksIDB4ZTcsIDB4MDAsIDB4MDAsIDB4NDAsIDB4YWIsIDB4MjAsIDB4NDAsIDB4ODAsIDB4YjQsIDB4MDAsIDB4MjMsIAorMHgwMCwgMHgyMiwgMHgwMCwgMHgyOSwgMHgwNiwgMHhkOSwgMHg4NywgMHg1YywgMHg3YiwgMHg0MCwgMHgxYiwgMHgwNiwgCisweDFiLCAweDBlLCAweDAxLCAweDMyLCAweDhhLCAweDQyLCAweGY4LCAweGQzLCAweGQ4LCAweDQzLCAweDAwLCAweDA2LCAKKzB4MDAsIDB4MGUsIDB4ODAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4ZjAsIDB4YjUsIDB4YzYsIDB4YjAsIDB4MDQsIDB4MjgsIAorMHgwNywgMHhkYSwgMHg0MSwgMHgwMCwgMHgwOSwgMHgxOCwgMHhjOSwgMHgwMCwgMHg0NSwgMHg5MSwgMHg0MSwgMHg0YSwgCisweDUxLCAweDU4LCAweDRiLCAweDBjLCAweDAyLCAweGQyLCAweDAwLCAweDIwLCAweGMwLCAweDQzLCAweDc2LCAweGUwLCAKKzB4MDEsIDB4MjMsIDB4NWIsIDB4MDQsIDB4MTksIDB4NDAsIDB4NDMsIDB4MDAsIDB4MTgsIDB4MTgsIDB4YzAsIDB4MDAsIAorMHgzYSwgMHg0YSwgMHgxNCwgMHgxOCwgMHgwMCwgMHgyOSwgMHg2MSwgMHhkMCwgMHgwMCwgMHgyMSwgMHgwMiwgMHg5MSwgCisweDIwLCAweDY5LCAweGExLCAweDY4LCAweDQ1LCAweDE4LCAweDMwLCAweGQwLCAweGZmLCAweDIxLCAweDY4LCAweDFlLCAKKzB4MDksIDB4MzEsIDB4ZmYsIDB4ZjcsIDB4Y2QsIDB4ZmUsIDB4NjEsIDB4NjgsIDB4NDAsIDB4MTgsIDB4MDEsIDB4OTAsIAorMHgwMSwgMHg5OCwgMHg4MSwgMHg0MiwgMHgwMiwgMHhkMSwgMHhhNiwgMHg2OCwgMHhhZiwgMHgxYiwgMHgwOSwgMHhlMCwgCisweDAwLCAweDI2LCAweGZmLCAweDIxLCAweDI4LCAweDFjLCAweDA5LCAweDMxLCAweGZmLCAweGY3LCAweGM3LCAweGZlLCAKKzB4MDcsIDB4MWMsIDB4MDEsIDB4ZDEsIDB4ZmYsIDB4MjcsIDB4MDksIDB4MzcsIDB4MDAsIDB4MjIsIDB4MDAsIDB4OTIsIAorMHgwMSwgMHg5OCwgMHgzMSwgMHgxYywgMHgwMywgMHhhYSwgMHgzYiwgMHgxYywgMHgwMCwgMHhmMCwgMHg5ZSwgMHhmOSwgCisweDAzLCAweGE4LCAweDM5LCAweDFjLCAweGZmLCAweGY3LCAweGFjLCAweGZmLCAweGMwLCAweDQzLCAweDAyLCAweDk5LCAKKzB4NDgsIDB4NDAsIDB4MDEsIDB4MDYsIDB4MDksIDB4MGUsIDB4MDIsIDB4OTEsIDB4ZWQsIDB4MWIsIDB4YTAsIDB4NjgsIAorMHhhOCwgMHg0MiwgMHgwMCwgMHhkMSwgMHgwMCwgMHgyNSwgMHgwMCwgMHgyZCwgMHhjZSwgMHhkOCwgMHgwMiwgMHg5OSwgCisweGNmLCAweDQzLCAweDAwLCAweDIyLCAweDAwLCAweDkyLCAweDBjLCAweDIzLCAweDAwLCAweDIxLCAweDYwLCAweDY4LCAKKzB4MDMsIDB4YWEsIDB4MDAsIDB4ZjAsIDB4ODMsIDB4ZjksIDB4MjAsIDB4NjksIDB4YzAsIDB4NDYsIDB4MDMsIDB4OTAsIAorMHgwNSwgMHg5OCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMiwgMHgzOSwgMHgwNiwgMHgwOSwgMHgwZSwgMHgwOCwgMHg0MywgCisweDA1LCAweDkwLCAweGZmLCAweDIzLCAweDFiLCAweDAyLCAweDk4LCAweDQzLCAweDA1LCAweDkwLCAweDBjLCAweDIxLCAKKzB4MDMsIDB4YTgsIDB4ZmYsIDB4ZjcsIDB4ODMsIDB4ZmYsIDB4ZmYsIDB4MjMsIDB4MWIsIDB4MDIsIDB4MDUsIDB4OTksIAorMHg5OSwgMHg0MywgMHgwMCwgMHgwNiwgMHgwMCwgMHgwZSwgMHgwMCwgMHgwMiwgMHgwOCwgMHg0MywgMHgwNSwgMHg5MCwgCisweDBjLCAweDIzLCAweDAwLCAweDIxLCAweDYwLCAweDY4LCAweDAzLCAweGFhLCAweDAwLCAweGYwLCAweGNhLCAweGY5LCAKKzB4MDAsIDB4MjAsIDB4NDUsIDB4OTksIDB4MDYsIDB4NGEsIDB4YzAsIDB4NDYsIDB4NTAsIDB4NTAsIDB4YzEsIDB4NDMsIAorMHg2MSwgMHg2MCwgMHhhMSwgMHg2MCwgMHhlMSwgMHg2MCwgMHgyMSwgMHg2MSwgMHg2MSwgMHg2MSwgMHg0NiwgMHhiMCwgCisweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDQwLCAweGFiLCAweDIwLCAweDQwLCAKKzB4YjAsIDB4YjQsIDB4NGMsIDB4NDIsIDB4MDAsIDB4MjksIDB4MDAsIDB4ZGIsIAorMHgwYywgMHgxYywgMHgwMCwgMHgyNywgMHhmZiwgMHg0MywgMHgwNCwgMHgyOCwgMHgyMSwgMHhkYSwgMHgxMiwgMHg0ZCwgCisweDQzLCAweDAwLCAweDE4LCAweDE4LCAweGMwLCAweDAwLCAweDQwLCAweDE5LCAweDAxLCAweDJhLCAweDA1LCAweGQwLCAKKzB4MDIsIDB4MmEsIDB4MDksIDB4ZDAsIDB4MDMsIDB4MmEsIDB4MTYsIDB4ZDEsIDB4MDEsIDB4NjksIDB4MGIsIDB4ZTAsIAorMHgwMCwgMHgyOSwgMHgxMiwgMHhkYiwgMHgwMiwgMHg2OSwgMHg4YSwgMHg0MiwgMHgwZiwgMHhkMywgMHgwNSwgMHhlMCwgCisweDAwLCAweDI5LCAweDA3LCAweGRhLCAweGMxLCAweDY4LCAweGExLCAweDQyLCAweDA5LCAweGQzLCAweDA5LCAweDFiLCAKKzB4YzEsIDB4NjAsIDB4YzAsIDB4NjgsIDB4YjAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4YzEsIDB4NjgsIDB4MDksIDB4MTksIAorMHgwMiwgMHg2OSwgMHg5MSwgMHg0MiwgMHhmNiwgMHhkOSwgMHgzOCwgMHgxYywgMHhmNiwgMHhlNywgMHgwMCwgMHgwMCwgCisweDQwLCAweGFiLCAweDIwLCAweDQwLCAweGYwLCAweGI1LCAweDg0LCAweGIwLCAweDE3LCAweDFjLCAweDBkLCAweDFjLCAKKzB4MDAsIDB4MjEsIDB4MDIsIDB4OTEsIDB4NDIsIDB4MDAsIDB4MTIsIDB4MTgsIDB4ZDIsIDB4MDAsIDB4MmMsIDB4NDksIAorMHg4YiwgMHg1OCwgMHgxYiwgMHgwNiwgMHgxYiwgMHgwZSwgMHgwMSwgMHg5MywgMHgwMCwgMHgyMywgMHhkYiwgMHg0MywgCisweDA0LCAweDI4LCAweDAyLCAweGRhLCAweDAxLCAweDk4LCAweDQwLCAweDA4LCAweDAxLCAweGQyLCAweDE4LCAweDFjLCAKKzB4NDYsIDB4ZTAsIDB4NTQsIDB4MTgsIDB4ZTAsIDB4NjgsIDB4YzIsIDB4MTksIDB4MjEsIDB4NjksIDB4OGEsIDB4NDIsIAorMHgwMCwgMHhkOSwgMHgwZiwgMHgxYSwgMHgwMCwgMHgyZiwgMHgzYywgMHhkOSwgMHhhMCwgMHg2OCwgMHhlMSwgMHg2OCwgCisweDQwLCAweDE4LCAweGZmLCAweDIxLCAweDA5LCAweDMxLCAweGZmLCAweGY3LCAweDBkLCAweGZlLCAweDYxLCAweDY4LCAKKzB4NDYsIDB4MTgsIDB4YTAsIDB4NjgsIDB4ZTEsIDB4NjgsIDB4NDAsIDB4MTgsIDB4ZmYsIDB4MjEsIDB4MDksIDB4MzEsIAorMHhmZiwgMHhmNywgMHgwZCwgMHhmZSwgMHhjMiwgMHgxOSwgMHhmZiwgMHgyMSwgMHgwOSwgMHgzMSwgMHg4YSwgMHg0MiwgCisweDE0LCAweGQ5LCAweDAxLCAweDlhLCAweGMwLCAweDQ2LCAweDAwLCAweDkyLCAweDBiLCAweDFhLCAweDAzLCAweDkzLCAKKzB4MDEsIDB4MWMsIDB4MzAsIDB4MWMsIDB4MmEsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4ZTEsIDB4ZjgsIDB4ZTAsIDB4NjgsIAorMHgwMywgMHg5YiwgMHhjMCwgMHgxOCwgMHhlMCwgMHg2MCwgMHgwMywgMHg5YiwgMHg1ZCwgMHgxOSwgMHhmZiwgMHgxYSwgCisweDAyLCAweDk4LCAweDE4LCAweDE4LCAweDAyLCAweDkwLCAweDEwLCAweGUwLCAweDAxLCAweDlhLCAweGMwLCAweDQ2LCAKKzB4MDAsIDB4OTIsIDB4MDEsIDB4MWMsIDB4MzAsIDB4MWMsIDB4MmEsIDB4MWMsIDB4M2IsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHhjZCwgMHhmOCwgMHhlMCwgMHg2OCwgMHhjMCwgMHgxOSwgMHhlZCwgMHgxOSwgMHhlMCwgMHg2MCwgMHgwMiwgMHg5OCwgCisweGMwLCAweDE5LCAweDAyLCAweDkwLCAweDAwLCAweDI3LCAweDAwLCAweDJmLCAweGMyLCAweGQ4LCAweDAyLCAweDk4LCAKKzB4MDQsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NDAsIDB4YWIsIDB4MjAsIDB4NDAsIAorMHhmMCwgMHhiNSwgMHg4MywgMHhiMCwgMHgxNywgMHgxYywgMHgwZCwgMHgxYywgMHgwMCwgMHgyMSwgMHgwMSwgMHg5MSwgCisweDQyLCAweDAwLCAweDEyLCAweDE4LCAweGQyLCAweDAwLCAweDAyLCAweDkyLCAweDMwLCAweDQ5LCAweDhhLCAweDU4LCAKKzB4MTIsIDB4MDYsIDB4MTIsIDB4MGUsIDB4MDAsIDB4MjQsIDB4ZTQsIDB4NDMsIDB4MDQsIDB4MjgsIDB4MDEsIDB4ZGEsIAorMHg1MCwgMHgwOSwgMHgwMSwgMHhkMiwgMHgyMCwgMHgxYywgMHg1MSwgMHhlMCwgMHgwMiwgMHg5YSwgMHg1NCwgMHgxOCwgCisweGUwLCAweDY4LCAweGMyLCAweDE5LCAweDYwLCAweDY5LCAweDgyLCAweDQyLCAweDAxLCAweGQ5LCAweDIyLCAweDY5LCAKKzB4ODcsIDB4MWEsIDB4MDAsIDB4MmYsIDB4NDUsIDB4ZDksIDB4MjUsIDB4NGUsIDB4YTAsIDB4NjgsIDB4ZTEsIDB4NjgsIAorMHg0MCwgMHgxOCwgMHhmZiwgMHgyMSwgMHgwOSwgMHgzMSwgMHhmZiwgMHhmNywgMHhhNywgMHhmZCwgMHg2MSwgMHg2OCwgCisweDQwLCAweDE4LCAweDAwLCAweDkwLCAweGEwLCAweDY4LCAweGUxLCAweDY4LCAweDQwLCAweDE4LCAweGZmLCAweDIxLCAKKzB4MDksIDB4MzEsIDB4ZmYsIDB4ZjcsIDB4YTYsIDB4ZmQsIDB4MDIsIDB4OWEsIDB4YjEsIDB4NTgsIDB4MDEsIDB4MjMsIAorMHg1YiwgMHgwNCwgMHgxOSwgMHg0MywgMHhiMSwgMHg1MCwgMHhjMSwgMHgxOSwgMHhmZiwgMHgyMiwgMHgwOSwgMHgzMiwgCisweDkxLCAweDQyLCAweDEzLCAweGQ5LCAweDEzLCAweDFhLCAweDAxLCAweDFjLCAweDAwLCAweDk4LCAweDJhLCAweDFjLCAKKzB4MWUsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4ZGYsIDB4ZjgsIDB4ZTAsIDB4NjgsIDB4ODAsIDB4MTksIDB4NzUsIDB4MTksIAorMHhlMCwgMHg2MCwgMHgyMSwgMHg2OSwgMHg4OCwgMHg0MiwgMHgwMCwgMHhkOSwgMHgyMCwgMHg2MSwgMHhiZiwgMHgxYiwgCisweDAxLCAweDk4LCAweDMwLCAweDE4LCAweDAxLCAweDkwLCAweDEyLCAweGUwLCAweDAxLCAweDFjLCAweDAwLCAweDllLCAKKzB4MzAsIDB4MWMsIDB4MmEsIDB4MWMsIDB4M2IsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4Y2IsIDB4ZjgsIDB4ZTAsIDB4NjgsIAorMHhjMCwgMHgxOSwgMHhlZCwgMHgxOSwgMHhlMCwgMHg2MCwgMHgyMSwgMHg2OSwgMHg4OCwgMHg0MiwgMHgwMCwgMHhkOSwgCisweDIwLCAweDYxLCAweDAxLCAweDk4LCAweGMwLCAweDE5LCAweDAxLCAweDkwLCAweDAwLCAweDI3LCAweDAwLCAweDJmLCAKKzB4YjksIDB4ZDgsIDB4MDEsIDB4OTgsIDB4MDMsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHg0MCwgMHhhYiwgMHgyMCwgMHg0MCwgMHhiMCwgMHhiNSwgMHhjMywgMHhiMCwgCisweDBjLCAweDFjLCAweDAwLCAweDI3LCAweGZhLCAweDQzLCAweDA0LCAweDI4LCAweDA2LCAweGRhLCAweDQxLCAweDAwLCAKKzB4MDksIDB4MTgsIDB4YzksIDB4MDAsIDB4MTQsIDB4NDgsIDB4NDUsIDB4NTgsIDB4NmIsIDB4MGMsIDB4MDQsIDB4ZDIsIAorMHgxMCwgMHgxYywgMHg0MywgMHhiMCwgMHhiMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg2MiwgMHgwOSwgCisweDFiLCAweGQzLCAweDAwLCAweDIyLCAweDAwLCAweDkyLCAweDA4LCAweDE4LCAweDQwLCAweDY4LCAweDBjLCAweDIzLCAKKzB4MDAsIDB4MjEsIDB4MDEsIDB4YWEsIDB4MDAsIDB4ZjAsIDB4MzAsIDB4ZjgsIDB4MTEsIDB4MmMsIDB4MGQsIDB4ZDAsIAorMHgxMiwgMHgyYywgMHgwZCwgMHhkMCwgMHgxMywgMHgyYywgMHgwNSwgMHhkMCwgMHgxNCwgMHgyYywgMHgwYSwgMHhkMSwgCisweDAzLCAweDk4LCAweDAwLCAweDA0LCAweDA3LCAweDBlLCAweDA2LCAweGUwLCAweDAzLCAweDk4LCAweDA3LCAweDA2LCAKKzB4M2YsIDB4MGUsIDB4MDIsIDB4ZTAsIDB4MDEsIDB4OWYsIDB4MDAsIDB4ZTAsIDB4MDIsIDB4OWYsIDB4MzgsIDB4MWMsIAorMHhkYiwgMHhlNywgMHgwMCwgMHgwMCwgMHg0MCwgMHhhYiwgMHgyMCwgMHg0MCwgMHgwMywgMHg0OSwgMHgwMCwgMHgyMCwgCisweDAwLCAweDIyLCAweDBhLCAweDU0LCAweDAxLCAweDMwLCAweDYwLCAweDI4LCAweGZiLCAweGQzLCAweDcwLCAweDQ3LCAKKzB4NDAsIDB4YWIsIDB4MjAsIDB4NDAsIDB4MDAsIDB4YjUsIDB4MDIsIDB4ZjAsIDB4NmYsIDB4ZmEsIDB4NTcsIDB4MjAsIAorMHgwMiwgMHhmMCwgMHhjYywgMHhmOSwgMHgwMiwgMHhmMCwgMHg0MCwgMHhmOSwgMHgwMCwgMHgwYSwgMHhmYiwgMHhkMywgCisweDAyLCAweGYwLCAweDRlLCAweGZhLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweGYwLCAweGI1LCAweDgyLCAweGIwLCAKKzB4MDcsIDB4OWQsIDB4MTQsIDB4MWMsIDB4MWYsIDB4MWMsIDB4MzAsIDB4NGEsIDB4ZDIsIDB4NmYsIDB4MjAsIDB4MjMsIAorMHgxNiwgMHg2OCwgMHg5ZSwgMHg0MywgMHgxNiwgMHg2MCwgMHgzMywgMHgxYywgMHhmZiwgMHgyMiwgMHgwMSwgMHgzMiwgCisweDJhLCAweDQwLCAweDQwLCAweDAyLCAweDA4LCAweDQzLCAweDA1LCAweDBhLCAweDA2LCAweDFjLCAweDAwLCAweDBjLCAKKzB4MDEsIDB4OTAsIDB4MDAsIDB4MmEsIDB4MjAsIDB4ZDAsIDB4MDIsIDB4ZjAsIDB4NGIsIDB4ZmEsIDB4NTMsIDB4MjAsIAorMHgwMiwgMHhmMCwgMHhhOCwgMHhmOSwgMHgwMSwgMHg5OCwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MCwgMHgwMiwgMHhmMCwgCisweGEzLCAweGY5LCAweDI4LCAweDFjLCAweDAyLCAweGYwLCAweGEwLCAweGY5LCAweDMwLCAweDFjLCAweDAyLCAweGYwLCAKKzB4OWQsIDB4ZjksIDB4MDIsIDB4ZjAsIDB4MjMsIDB4ZmEsIDB4ZmYsIDB4ZjcsIDB4YzcsIDB4ZmYsIDB4MDIsIDB4ZjAsIAorMHgzNywgMHhmYSwgMHg1NCwgMHgyMCwgMHgwMiwgMHhmMCwgMHg5NCwgMHhmOSwgMHgwMCwgMHg5OCwgMHgwMiwgMHhmMCwgCisweDkxLCAweGY5LCAweDI4LCAweDFjLCAweDAyLCAweGYwLCAweDhlLCAweGY5LCAweDMwLCAweDFjLCAweDE0LCAweGUwLCAKKzB4MDIsIDB4ZjAsIDB4MmEsIDB4ZmEsIDB4NTIsIDB4MjAsIDB4MDIsIDB4ZjAsIDB4ODcsIDB4ZjksIDB4MDEsIDB4OTgsIAorMHgwMiwgMHhmMCwgMHg4NCwgMHhmOSwgMHgyOCwgMHgxYywgMHgwMiwgMHhmMCwgMHg4MSwgMHhmOSwgMHgzMCwgMHgxYywgCisweDAyLCAweGYwLCAweDdlLCAweGY5LCAweDAwLCAweDIwLCAweDAyLCAweGYwLCAweDdiLCAweGY5LCAweDAwLCAweDIwLCAKKzB4MDIsIDB4ZjAsIDB4NzgsIDB4ZjksIDB4MDAsIDB4MjAsIDB4MDIsIDB4ZjAsIDB4NzUsIDB4ZjksIDB4MDAsIDB4MjAsIAorMHgwMiwgMHhmMCwgMHg3MiwgMHhmOSwgMHgwMCwgMHgyZiwgMHgwNSwgMHhkOSwgMHgwMiwgMHhmMCwgMHhlNCwgMHhmOCwgCisweDIwLCAweDcwLCAweDAxLCAweDM0LCAweDAxLCAweDNmLCAweGY5LCAweGQxLCAweDAyLCAweGYwLCAweGYwLCAweGY5LCAKKzB4MDQsIDB4NGEsIDB4ZDAsIDB4NmYsIDB4MjAsIDB4MjMsIDB4MDEsIDB4NjgsIDB4MTksIDB4NDMsIDB4MDEsIDB4NjAsIAorMHgwMiwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweGYwLCAweGI1LCAweDgyLCAweGIwLCAweDE0LCAweDFjLCAweDFmLCAweDFjLCAweDQyLCAweDAyLCAweDBhLCAweDQzLCAKKzB4MTUsIDB4MWMsIDB4MDEsIDB4MjgsIDB4NTQsIDB4ZDAsIDB4MmMsIDB4NDksIDB4YzgsIDB4NmYsIDB4MjAsIDB4MjMsIAorMHgwMiwgMHg2OCwgMHg5YSwgMHg0MywgMHgwMiwgMHg2MCwgMHhjOCwgMHg2ZiwgMHg0MCwgMHgyMywgMHgwMSwgMHg2OCwgCisweDE5LCAweDQzLCAweDAxLCAweDYwLCAweDAyLCAweGYwLCAweGU2LCAweGY5LCAweDUzLCAweDIwLCAweDAyLCAweGYwLCAKKzB4NDMsIDB4ZjksIDB4MjgsIDB4MGMsIDB4MDYsIDB4MWMsIDB4MDIsIDB4ZjAsIDB4M2YsIDB4ZjksIDB4MjgsIDB4MGEsIAorMHgwMSwgMHg5MCwgMHgwMCwgMHg5MCwgMHgwMiwgMHhmMCwgMHgzYSwgMHhmOSwgMHgyOCwgMHgxYywgMHgwMiwgMHhmMCwgCisweDM3LCAweGY5LCAweDAyLCAweGYwLCAweGJkLCAweGY5LCAweGZmLCAweGY3LCAweDYxLCAweGZmLCAweDAyLCAweGYwLCAKKzB4ZDEsIDB4ZjksIDB4ODQsIDB4MjAsIDB4MDIsIDB4ZjAsIDB4MmUsIDB4ZjksIDB4MzAsIDB4MWMsIDB4MDIsIDB4ZjAsIAorMHgyYiwgMHhmOSwgMHgwMCwgMHg5OCwgMHgwMiwgMHhmMCwgMHgyOCwgMHhmOSwgMHgyOCwgMHgxYywgMHgwMiwgMHhmMCwgCisweDI1LCAweGY5LCAweDAwLCAweDJmLCAweDA1LCAweGQ5LCAweDIwLCAweDc4LCAweDAxLCAweDM0LCAweDAyLCAweGYwLCAKKzB4MWYsIDB4ZjksIDB4MDEsIDB4M2YsIDB4ZjksIDB4ZDEsIDB4MDIsIDB4ZjAsIDB4YTMsIDB4ZjksIDB4MDIsIDB4ZjAsIAorMHhiOSwgMHhmOSwgMHg4MywgMHgyMCwgMHgwMiwgMHhmMCwgMHgxNiwgMHhmOSwgMHgzMCwgMHgxYywgMHgwMiwgMHhmMCwgCisweDEzLCAweGY5LCAweDAxLCAweDk4LCAweDAyLCAweGYwLCAweDEwLCAweGY5LCAKKzB4MjgsIDB4MWMsIDB4MDIsIDB4ZjAsIDB4MGQsIDB4ZjksIDB4MDIsIDB4ZjAsIDB4OTMsIDB4ZjksIDB4ZmYsIDB4ZjcsIAorMHgzNywgMHhmZiwgMHgwNywgMHg0OSwgMHhjOCwgMHg2ZiwgMHg0MCwgMHgyMywgMHgwMiwgMHg2OCwgMHg5YSwgMHg0MywgCisweDAyLCAweDYwLCAweGM4LCAweDZmLCAweDIwLCAweDIzLCAweDAxLCAweDY4LCAweDE5LCAweDQzLCAweDAxLCAweDYwLCAKKzB4MDIsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHg4MCwgMHhiNSwgMHgwMSwgMHhmMCwgMHg4ZiwgMHhmOCwgMHgwNiwgMHg0ZiwgCisweGMwLCAweDQ2LCAweGY4LCAweDYwLCAweDAxLCAweGYwLCAweGYyLCAweGY4LCAweDc4LCAweDgwLCAweDAxLCAweGYwLCAKKzB4YjEsIDB4ZjgsIDB4MzgsIDB4NzEsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgwMCwgMHhiNSwgMHgwMSwgMHhmMCwgMHgwNSwgMHhmOSwgMHgwMiwgMHg0OSwgCisweGMwLCAweDQ2LCAweDA4LCAweDgwLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4MGIsIDB4NDgsIDB4YzEsIDB4NjgsIDB4MDEsIDB4MjksIDB4MTEsIDB4ZDEsIDB4YzEsIDB4NmYsIDB4MDIsIDB4MjMsIAorMHgwYSwgMHg2OCwgMHgxYSwgMHg0MywgMHgwYSwgMHg2MCwgMHhjMSwgMHg2ZiwgMHg4MCwgMHgyMywgMHgwYSwgMHg2OCwgCisweDFhLCAweDQzLCAweDBhLCAweDYwLCAweGMxLCAweDE4LCAweDA4LCAweDY4LCAweDgyLCAweDIzLCAweDAyLCAweDY4LCAKKzB4MWEsIDB4NDMsIDB4MDIsIDB4NjAsIDB4MDAsIDB4MjAsIDB4MDgsIDB4ODEsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHhmMCwgMHhiNCwgMHg0YSwgMHg0OSwgMHhjYSwgMHgxZCwgMHg5ZCwgMHgzMiwgCisweDAwLCAweDIwLCAweDAwLCAweDI3LCAweDgzLCAweDAwLCAweGQ3LCAweDUwLCAweDAxLCAweDMwLCAweDE3LCAweDI4LCAKKzB4ZmEsIDB4ZDMsIDB4NDYsIDB4NGMsIDB4MDAsIDB4MjAsIDB4ODIsIDB4MDAsIDB4YTcsIDB4NTAsIDB4MDEsIDB4MzAsIAorMHgyMCwgMHgyOCwgMHhmYSwgMHhkMywgMHg0MywgMHg0YSwgMHgwMCwgMHgyMCwgMHg4MywgMHgwMCwgMHhkNywgMHg1MCwgCisweDAxLCAweDMwLCAweDIwLCAweDI4LCAweGZhLCAweGQzLCAweGE3LCAweDYxLCAweDk3LCAweDYxLCAweDRmLCAweDY1LCAKKzB4OGYsIDB4NjUsIDB4M2YsIDB4NGQsIDB4YzAsIDB4NDYsIDB4MmYsIDB4NjAsIDB4NmYsIDB4NjAsIDB4YWYsIDB4NjAsIAorMHhhZiwgMHg2MSwgMHhlZiwgMHg2MCwgMHgyZiwgMHg2MSwgMHg2ZiwgMHg2MSwgMHgwMCwgMHgyMCwgMHhjMSwgMHgwMCwgCisweDA5LCAweDE4LCAweDQ5LCAweDAxLCAweDM1LCAweDRiLCAweGM5LCAweDE4LCAweDg2LCAweDAwLCAweGNiLCAweDFkLCAKKzB4ZjksIDB4MzMsIDB4MzQsIDB4NGMsIDB4MzQsIDB4MTksIDB4ZTMsIDB4NjMsIDB4MTEsIDB4MjMsIDB4NWIsIDB4MDEsIAorMHhjYiwgMHgxOCwgMHg2MywgMHg2MywgMHgwZCwgMHgyMywgMHg5YiwgMHgwMSwgMHhjYiwgMHgxOCwgMHhiNCwgMHgxOCwgCisweGUzLCAweDYzLCAweDIzLCAweDIzLCAweDViLCAweDAxLCAweGM5LCAweDE4LCAweDYxLCAweDYzLCAweDAxLCAweDMwLCAKKzB4MDIsIDB4MjgsIDB4ZTQsIDB4ZGIsIDB4MjksIDB4NDgsIDB4YzEsIDB4MWQsIDB4ZjksIDB4MzEsIDB4MjksIDB4NGMsIAorMHhjMCwgMHg0NiwgMHhhMSwgMHg2MiwgMHg2MSwgMHg2YiwgMHgwZCwgMHgyMywgMHg5YiwgMHgwMSwgMHhlMSwgMHg2MiwgCisweGMxLCAweDE4LCAweDkxLCAweDYyLCAweDUxLCAweDZiLCAweGMwLCAweDQ2LCAweGQxLCAweDYyLCAweDA4LCAweDIxLCAKKzB4ZTEsIDB4NjQsIDB4MjUsIDB4NDksIDB4YzAsIDB4NDYsIDB4MjEsIDB4NjUsIDB4MjQsIDB4NDksIDB4MGIsIDB4NjksIAorMHhjMCwgMHg0NiwgMHg2MywgMHg2NSwgMHhjMywgMHgxZCwgMHg0ZCwgMHgzMywgMHhlMywgMHg2NSwgMHgyNSwgMHg2NiwgCisweDhiLCAweDY4LCAweGMwLCAweDQ2LCAweDYzLCAweDY2LCAweGNiLCAweDY4LCAweGMwLCAweDQ2LCAweGEzLCAweDY2LCAKKzB4MWUsIDB4NGIsIDB4YzAsIDB4NDYsIDB4ZTMsIDB4NjYsIDB4MjcsIDB4NjcsIDB4MGIsIDB4MjMsIDB4ZGIsIDB4MDEsIAorMHhjMywgMHgxOCwgMHhhMywgMHg2NywgMHg2NywgMHg2NywgMHgwMSwgMHgyNiwgMHhlMywgMHgxZCwgMHg2OSwgMHgzMywgCisweDY2LCAweDYxLCAweGU3LCAweDYxLCAweDFmLCAweDczLCAweDAyLCAweDIzLCAweGQzLCAweDY0LCAweDE3LCAweDRiLCAKKzB4YzAsIDB4NDYsIDB4MTMsIDB4NjUsIDB4Y2IsIDB4NjksIDB4YzAsIDB4NDYsIDB4NTMsIDB4NjUsIDB4YzMsIDB4MWQsIAorMHg1MSwgMHgzMywgMHhkMywgMHg2NSwgMHgyYiwgMHgxZCwgMHgxMywgMHg2NiwgMHg0YiwgMHg2OSwgMHhjMCwgMHg0NiwgCisweDUzLCAweDY2LCAweDg5LCAweDY5LCAweGMwLCAweDQ2LCAweDkxLCAweDY2LCAweDBmLCAweDQ5LCAweGMwLCAweDQ2LCAKKzB4ZDEsIDB4NjYsIDB4MTYsIDB4NjcsIDB4MGYsIDB4MjMsIDB4ZGIsIDB4MDEsIDB4YzAsIDB4MTgsIDB4OTAsIDB4NjcsIAorMHg1NiwgMHg2NywgMHhkNywgMHg2MSwgMHhkMCwgMHgxZCwgMHg2OSwgMHgzMCwgMHg1NiwgMHg2MSwgMHgwNywgMHg3MywgCisweGYwLCAweGJjLCAweDcwLCAweDQ3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGU0LCAweDJjLCAweDAwLCAweDgwLCAKKzB4NjQsIDB4MmQsIDB4MDAsIDB4ODAsIDB4OTAsIDB4ZWUsIDB4MjAsIDB4NDAsIDB4MzAsIDB4MDEsIDB4MTgsIDB4MDAsIAorMHg3YywgMHgyOSwgMHgwMCwgMHg4MCwgMHgwMCwgMHg1NSwgMHhmZiwgMHhmZiwgMHgzOCwgMHgwMSwgMHgxOCwgMHgwMCwgCisweDEwLCAweDU1LCAweGZmLCAweGZmLCAweDkwLCAweGI0LCAweDAwLCAweDIxLCAweDFlLCAweDRhLCAweGJiLCAweDIzLCAKKzB4MWIsIDB4MDEsIDB4ZDcsIDB4MTgsIDB4ZjksIDB4NzMsIDB4MTksIDB4MjMsIAorMHhkYiwgMHgwMSwgMHhkMCwgMHgxOCwgMHgwMSwgMHgyNCwgMHhjZCwgMHgyMywgMHgxYiwgMHgwMSwgMHhkMywgMHgxOCwgCisweGMxLCAweDYxLCAweDFjLCAweDcwLCAweDMzLCAweDIzLCAweDliLCAweDAxLCAweGQzLCAweDE4LCAweDk5LCAweDYwLCAKKzB4YjksIDB4NzMsIDB4NTksIDB4NjEsIDB4MmYsIDB4MjMsIDB4OWIsIDB4MDEsIDB4ZDMsIDB4MTgsIDB4MTksIDB4NjAsIAorMHgxMywgMHg0YiwgMHg1MSwgMHgyNywgMHhiZiwgMHgwMywgMHgwMywgMHg2MywgMHgzYiwgMHg2MCwgMHg4NCwgMHg2OSwgCisweGU0LCAweDE4LCAweDQ0LCAweDYzLCAweDA0LCAweDNjLCAweDdjLCAweDYwLCAweDAxLCAweDI0LCAweGU0LCAweDAyLCAKKzB4ODQsIDB4NjMsIDB4MGUsIDB4NGMsIDB4YzAsIDB4NDYsIDB4YmMsIDB4NjAsIDB4MDQsIDB4NmIsIDB4YzAsIDB4NDYsIAorMHg0NCwgMHg2MiwgMHg4NCwgMHg2OSwgMHhlNCwgMHgxOCwgMHgwYiwgMHg0YiwgMHhlMywgMHgxOCwgMHhmYiwgMHg2MCwgCisweDAzLCAweDZiLCAweGMwLCAweDQ2LCAweDgzLCAweDYyLCAweDQzLCAweDZhLCAweGMwLCAweDQ2LCAweDAzLCAweDYyLCAKKzB4YzEsIDB4NjMsIDB4NTEsIDB4NjQsIDB4OTEsIDB4NjQsIDB4ZDEsIDB4NjUsIDB4ZDEsIDB4NjYsIDB4OTAsIDB4YmMsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgyMCwgMHg0MCwgCisweGZjLCAweDA3LCAweDAwLCAweDAwLCAweGZjLCAweGY3LCAweGZmLCAweGZmLCAweDkwLCAweGI0LCAweDAwLCAweDIyLCAKKzB4MWIsIDB4NDksIDB4YzksIDB4MjMsIDB4MWIsIDB4MDEsIDB4YzgsIDB4MTgsIDB4MDIsIDB4NzEsIDB4MDEsIDB4MjAsIAorMHhiYiwgMHgyMywgMHgxYiwgMHgwMSwgMHhjYiwgMHgxOCwgMHg1OCwgMHg3MywgMHgxNywgMHg0OCwgMHgwMywgMHgxYywgCisweDAwLCAweDI3LCAweGRjLCAweDFkLCAweGMxLCAweDM0LCAweDFjLCAweDY1LCAweDIzLCAweDFjLCAweDAxLCAweDM3LCAKKzB4M2YsIDB4MmYsIDB4ZjgsIDB4ZDMsIDB4MWEsIDB4NjUsIDB4MTksIDB4MjMsIDB4ZGIsIDB4MDEsIDB4Y2YsIDB4MTgsIAorMHgzMywgMHgyMywgMHg5YiwgMHgwMSwgMHhjYiwgMHgxOCwgMHgzYSwgMHg2MSwgMHg5OCwgMHg2MSwgMHg0MCwgMHgyMCwgCisweGY4LCAweDYwLCAweGRhLCAweDYxLCAweDFhLCAweDYyLCAweGNhLCAweDY0LCAweDBhLCAweDY2LCAweDBjLCAweDQ4LCAKKzB4YzAsIDB4NDYsIDB4YzIsIDB4NjAsIDB4MGIsIDB4NDgsIDB4MDAsIDB4NmIsIDB4YzAsIDB4MDYsIDB4YzAsIDB4MGUsIAorMHhmOCwgMHg2MywgMHgwYSwgMHg0OCwgMHgwMSwgMHg2OCwgMHhjMCwgMHg0NiwgMHgxOSwgMHg4MCwgMHg0MSwgMHg2OCwgCisweGMwLCAweDQ2LCAweDU5LCAweDgwLCAweDgwLCAweDY4LCAweGMwLCAweDQ2LCAweDk4LCAweDgwLCAweDkwLCAweGJjLCAKKzB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4OTAsIDB4YmMsIDB4MjAsIDB4NDAsIAorMHg5MCwgMHhlZSwgMHgyMCwgMHg0MCwgMHg4MCwgMHgwMCwgMHgxNCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgxNCwgMHg0MCwgCisweDAwLCAweDIwLCAweDBhLCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDczLCAweGNiLCAweDFkLCAweGZmLCAweDMzLCAKKzB4M2EsIDB4MzMsIDB4ODgsIDB4NjEsIDB4YzgsIDB4NjEsIDB4MTgsIDB4NzAsIDB4MDYsIDB4NGEsIDB4YzAsIDB4NDYsIAorMHgxMCwgMHg2NSwgMHg1MCwgMHg2NiwgMHg5MCwgMHg2NiwgMHgwOCwgMHg3MCwgMHg1OCwgMHg3MCwgMHhiYiwgMHgyMywgCisweDFiLCAweDAxLCAweGQxLCAweDE4LCAweDA4LCAweDczLCAweDcwLCAweDQ3LCAweDI4LCAweDA1LCAweDAwLCAweDgwLCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ZjAsIDB4YjQsIDB4MmYsIDB4NDksIDB4MmYsIDB4NGEsIDB4YzAsIDB4NDYsIAorMHgxMSwgMHg2MSwgMHgwMSwgMHgyMywgMHg5YiwgMHgwMiwgMHhjOCwgMHgxOCwgMHg1MCwgMHg2MSwgMHgyZCwgMHg0OCwgCisweGMwLCAweDQ2LCAweDEwLCAweDYyLCAweGRiLCAweDAwLCAweGMzLCAweDE4LCAweDUzLCAweDYyLCAweDAwLCAweDIzLCAKKzB4MTMsIDB4NjMsIDB4NTMsIDB4NjMsIDB4MjksIDB4NGEsIDB4MmEsIDB4NGYsIDB4ZDQsIDB4MWQsIDB4ZmYsIDB4MzQsIAorMHhmYSwgMHgzNCwgMHgxNCwgMHhjNywgMHgwOCwgMHgzZiwgMHgzYiwgMHg2MSwgMHgxYywgMHgxZiwgMHg3YywgMHg2MSwgCisweDI2LCAweDRmLCAweGMwLCAweDQ2LCAweDM5LCAweDYwLCAweGI4LCAweDYxLCAweDc5LCAweDYxLCAweGY4LCAweDYyLCAKKzB4M2IsIDB4NjMsIDB4N2IsIDB4NjQsIDB4YmEsIDB4NjQsIDB4ZmEsIDB4NjUsIDB4MjIsIDB4NGYsIDB4ZmUsIDB4MWQsIAorMHhmOSwgMHgzNiwgMHgyMiwgMHg0ZCwgMHhlYywgMHgxZCwgMHg3OSwgMHgzNCwgMHgyNiwgMHg2MiwgMHg1MSwgMHgyNiwgCisweGI2LCAweDAzLCAweDM3LCAweDYxLCAweDI0LCAweDZhLCAweGMwLCAweDQ2LCAweDc0LCAweDYxLCAweDJmLCAweDY3LCAKKzB4MWQsIDB4NGQsIDB4MDksIDB4MjcsIDB4N2YsIDB4MDQsIDB4ZWMsIDB4MWQsIDB4NzUsIDB4MzQsIDB4N2MsIDB4NjAsIAorMHgzZCwgMHg2MCwgMHgxYiwgMHg0YywgMHhjMCwgMHg0NiwgMHgzYywgMHg2MSwgMHhlNiwgMHgxZCwgMHg3NSwgMHgzNiwgCisweDdlLCAweDYxLCAweDE5LCAweDRmLCAweGMwLCAweDQ2LCAweDdjLCAweDYwLCAweDNkLCAweDYwLCAweDBmLCAweDFjLCAKKzB4MDAsIDB4MjEsIDB4ZmYsIDB4MjQsIDB4MDEsIDB4MzQsIDB4MWQsIDB4MWMsIDB4OGIsIDB4MDAsIDB4ZmQsIDB4NTAsIAorMHgwMSwgMHgzMSwgMHhhMSwgMHg0MiwgMHhmYSwgMHhkMywgMHgwMSwgMHgxYywgMHgwMCwgMHgyMCwgMHgwMSwgMHgyNywgCisweGZmLCAweDAyLCAweDgzLCAweDAwLCAweGNkLCAweDUwLCAweDAxLCAweDMwLCAweGI4LCAweDQyLCAweGZhLCAweGQzLCAKKzB4MDAsIDB4MjAsIDB4ODEsIDB4MDAsIDB4NTUsIDB4NTAsIDB4MDEsIDB4MzAsIDB4ODAsIDB4MjgsIDB4ZmEsIDB4ZDMsIAorMHhmMCwgMHhiYywgMHg3MCwgMHg0NywgMHgyNCwgMHhhMywgMHgyMCwgMHg0MCwgCisweDQwLCAweDAxLCAweDE4LCAweDAwLCAweDI0LCAweDgzLCAweDIwLCAweDQwLCAweDI0LCAweGE5LCAweDIwLCAweDQwLCAKKzB4ODAsIDB4MDEsIDB4MTgsIDB4MDAsIDB4YTgsIDB4MDMsIDB4MDAsIDB4ODAsIDB4MjQsIDB4YTcsIDB4MjAsIDB4NDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgyNCwgMHhhOCwgMHgyMCwgMHg0MCwgMHhhNCwgMHhhOCwgMHgyMCwgMHg0MCwgCisweDA4LCAweDA0LCAweDAwLCAweDgwLCAweGI4LCAweGI1LCAweDJjLCAweDQ4LCAweGZkLCAweGY3LCAweGJhLCAweGZkLCAKKzB4MDEsIDB4MjAsIDB4MmIsIDB4NDksIDB4MGEsIDB4NjgsIDB4NTIsIDB4MGMsIDB4MDYsIDB4ZDIsIDB4MGEsIDB4NjgsIAorMHgxMiwgMHgwYywgMHgwMiwgMHhkMSwgMHgwYSwgMHg2OCwgMHg5MiwgMHgwYSwgMHgwMCwgMHhkMiwgMHgwMCwgMHgyMCwgCisweDA0LCAweDA2LCAweDI0LCAweDBlLCAweDI1LCAweDRhLCAweGQ3LCAweDFkLCAweDBkLCAweDM3LCAweDAwLCAweDIzLCAKKzB4MDAsIDB4MjAsIDB4OWQsIDB4MDAsIDB4NzgsIDB4NTEsIDB4MDEsIDB4MzMsIDB4MDQsIDB4MmIsIDB4ZmEsIDB4ZDMsIAorMHgwMSwgMHgyNywgMHgzZiwgMHgwNSwgMHg1MCwgMHg2MSwgMHhmOCwgMHg2MCwgMHhkMCwgMHg2MSwgMHhmOCwgMHg2MSwgCisweDAwLCAweDIzLCAweGRiLCAweDQzLCAweDkzLCAweDYxLCAweDNiLCAweDYxLCAweDEzLCAweDYyLCAweDNiLCAweDYyLCAKKzB4MDAsIDB4MjcsIDB4MWIsIDB4NGIsIDB4OGQsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTUsIDB4OGQsIDB4NjksIAorMHhjMCwgMHg0NiwgMHgwMCwgMHg5NSwgMHgwMCwgMHgyYywgMHgwYiwgMHhkMCwgMHhkZCwgMHg2YiwgMHhjMCwgMHg0NiwgCisweDAwLCAweDk1LCAweDlkLCAweDZiLCAweGMwLCAweDQ2LCAweDAwLCAweDk1LCAweDVkLCAweDZiLCAweGMwLCAweDQ2LCAKKzB4MDAsIDB4OTUsIDB4MWQsIDB4NmIsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTUsIDB4MDEsIDB4MzcsIDB4NDAsIDB4MmYsIAorMHhlOCwgMHhkMywgMHgwMCwgMHgyNywgMHg2YywgMHg0NiwgMHgwMSwgMHgyMywgMHg1YiwgMHgwNywgMHgxYywgMHg0MywgCisweDAxLCAweGUwLCAweDIwLCAweDYwLCAweDAxLCAweDM3LCAweDBkLCAweDY4LCAweDJiLCAweDA5LCAweDAyLCAweGQyLCAKKzB4ODAsIDB4MmYsIDB4ZjgsIDB4ZDMsIDB4MDEsIDB4ZTAsIDB4ODAsIDB4MmYsIDB4MDMsIDB4ZDMsIDB4MDgsIDB4NDksIAorMHg0YiwgMHg2ZSwgMHgwMSwgMHgzMywgMHg0YiwgMHg2NiwgMHhkMCwgMHg2MiwgMHhiOCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweGY0LCAweDAxLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDEwLCAweDQwLCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDEsIDB4MTgsIDB4NDAsIDB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIAorMHg5MCwgMHhiNCwgMHgwMCwgMHgyMSwgMHgwZSwgMHg0ZiwgMHgwZiwgMHg0YSwgMHgwMCwgMHgyMCwgMHg0YywgMHgwMSwgCisweDY0LCAweDFhLCAweGE0LCAweDAwLCAweGEzLCAweDE4LCAweDU4LCAweDYwLCAweDk4LCAweDYwLCAweDE4LCAweDY0LCAKKzB4NTgsIDB4NjQsIDB4MTAsIDB4NTMsIDB4NTgsIDB4ODAsIDB4Y2MsIDB4MDAsIDB4ZTQsIDB4MTksIDB4OTgsIDB4NjcsIAorMHhkYywgMHg2MiwgMHgwMSwgMHgzMSwgMHgwMywgMHgyOSwgMHhlZSwgMHhkMywgMHgwNiwgMHg0OSwgMHhjMCwgMHg0NiwgCisweDA4LCAweDYwLCAweDQ4LCAweDYwLCAweDg4LCAweDYwLCAweGM4LCAweDYwLCAweDA4LCAweDYxLCAweDkwLCAweGJjLCAKKzB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4YWMsIDB4NjYsIDB4MjEsIDB4NDAsIDB4NWMsIDB4MmIsIDB4MDAsIDB4ODAsIAorMHhkMCwgMHgyYywgMHgwMCwgMHg4MCwgMHg2NCwgMHgyMSwgMHgwNSwgMHg0OCwgMHhjMCwgMHg0NiwgMHgwMSwgMHg2MywgCisweDAwLCAweDIxLCAweGM5LCAweDQzLCAweDQxLCAweDYzLCAweDgxLCAweDYzLCAweDAwLCAweDIxLCAweGMxLCAweDYzLCAKKzB4MDEsIDB4NjQsIDB4NzAsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ODAsIDB4YjQsIDB4MDEsIDB4MjAsIAorMHg0MCwgMHgwMiwgMHgwYSwgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2MCwgMHgzYywgMHgyMCwgMHg0OCwgMHg2MCwgCisweDg4LCAweDYwLCAweDA4LCAweDQ4LCAweGMwLCAweDQ2LCAweGM4LCAweDYwLCAweDAwLCAweDIwLCAweDA3LCAweDRhLCAKKzB4ODcsIDB4MDAsIDB4Y2IsIDB4NjgsIDB4YzAsIDB4NDYsIDB4ZGEsIDB4NTEsIDB4MDEsIDB4MzAsIDB4MTAsIDB4MjgsIAorMHhmOCwgMHhkMywgMHg4MCwgMHhiYywgMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHhlNCwgMHgyZCwgMHgwMCwgMHg4MCwgCisweGY0LCAweDJkLCAweDAwLCAweDgwLCAweDVkLCAweDRjLCAweGZmLCAweGZmLCAweDEyLCAweDQ5LCAweDEzLCAweDQ4LCAKKzB4NjcsIDB4MjMsIDB4OWIsIDB4MDEsIDB4Y2EsIDB4MTgsIDB4MDYsIDB4YzAsIDB4MDgsIDB4MzgsIDB4MTEsIDB4NGIsIAorMHhjYSwgMHgxOCwgMHhjMSwgMHg2MCwgMHg4MiwgMHg2MCwgMHgwMSwgMHg2MSwgMHgwZiwgMHg0OSwgMHgxMCwgMHg0OCwgCisweGE3LCAweDIzLCAweDliLCAweDAxLCAweGNhLCAweDE4LCAweDA2LCAweGMwLCAweDA4LCAweDM4LCAweDBlLCAweDRiLCAKKzB4Y2EsIDB4MTgsIDB4YzEsIDB4NjAsIDB4ODIsIDB4NjAsIDB4MDEsIDB4NjEsIDB4MGMsIDB4NDgsIDB4MGQsIDB4NDksIAorMHg2NywgMHgyMywgMHg5YiwgMHgwMSwgMHhjMiwgMHgxOCwgMHgwNSwgMHhjMSwgMHgwOCwgMHgzOSwgMHgwNSwgMHg0YiwgCisweGMyLCAweDE4LCAweGM4LCAweDYwLCAweDhhLCAweDYwLCAweDA4LCAweDYxLCAweDcwLCAweDQ3LCAweDAwLCAweDAwLCAKKzB4YWMsIDB4MWUsIDB4MjEsIDB4NDAsIDB4NDgsIDB4MmUsIDB4MDAsIDB4ODAsIDB4ZmMsIDB4MWYsIDB4MDAsIDB4MDAsIAorMHhhYywgMHhlZSwgMHgyMCwgMHg0MCwgMHgzNCwgMHgyZSwgMHgwMCwgMHg4MCwgMHhmYywgMHgyZiwgMHgwMCwgMHgwMCwgCisweGFjLCAweDNlLCAweDIxLCAweDQwLCAweDVjLCAweDJlLCAweDAwLCAweDgwLCAKKzB4OTAsIDB4YjQsIDB4MDAsIDB4MjEsIDB4NDAsIDB4NGMsIDB4MDAsIDB4MjAsIDB4MGEsIDB4MDEsIDB4MTIsIDB4MTksIAorMHgxOSwgMHgyMywgMHhkYiwgMHgwMSwgMHhkMiwgMHgxOCwgMHhkMCwgMHg2MiwgMHgxMCwgMHg2MywgMHg1MCwgMHg2MywgCisweDkwLCAweDYzLCAweDAxLCAweDMxLCAweDAzLCAweDI5LCAweGYzLCAweGQzLCAweDNhLCAweDQ5LCAweGMwLCAweDQ2LCAKKzB4MDgsIDB4NjMsIDB4NDgsIDB4NjMsIDB4ODgsIDB4NjMsIDB4MjAsIDB4NjAsIDB4MDEsIDB4MjEsIDB4ZTMsIDB4MWQsIAorMHg1OSwgMHgzMywgMHg2MCwgMHg2MCwgMHgxOSwgMHg3MSwgMHgxOCwgMHg3MiwgMHg5OCwgMHg3MSwgMHg5OCwgMHg3MiwgCisweDU5LCAweDcxLCAweDU4LCAweDcyLCAweGQ4LCAweDcxLCAweGQ4LCAweDcyLCAweGUyLCAweDFkLCAweDQ5LCAweDMyLCAKKzB4MTEsIDB4NzMsIDB4MTksIDB4NzAsIDB4OTAsIDB4NzMsIDB4OTgsIDB4NzAsIDB4NTEsIDB4NzMsIDB4NTksIDB4NzAsIAorMHhkMCwgMHg3MywgMHhkOCwgMHg3MCwgMHgxMSwgMHg3MSwgMHgxMSwgMHg3MiwgMHg5MCwgMHg3MSwgMHg5MCwgMHg3MiwgCisweDUwLCAweDcxLCAweDUwLCAweDcyLCAweGQwLCAweDcxLCAweGQwLCAweDcyLCAweDE4LCAweDczLCAweDAyLCAweDIyLCAKKzB4ZTcsIDB4MWQsIDB4NjksIDB4MzcsIDB4M2EsIDB4NzAsIDB4OTksIDB4NzMsIDB4YmEsIDB4NzAsIDB4NTgsIDB4NzMsIAorMHg3OCwgMHg3MCwgMHhkOCwgMHg3MywgMHhmOCwgMHg3MCwgMHgzOSwgMHg3MSwgMHgzYSwgMHg3MiwgMHhiOSwgMHg3MSwgCisweGI5LCAweDcyLCAweDc4LCAweDcxLCAweDdhLCAweDcyLCAweGY5LCAweDcxLCAweGY5LCAweDcyLCAweDM5LCAweDczLCAKKzB4ZTMsIDB4MWQsIDB4NzksIDB4MzMsIDB4MWEsIDB4NzAsIDB4YjksIDB4NzMsIDB4OTksIDB4NzAsIDB4NzgsIDB4NzMsIAorMHg1YSwgMHg3MCwgMHhmOSwgMHg3MywgMHhkOSwgMHg3MCwgMHgxYSwgMHg3MSwgMHgxYSwgMHg3MiwgMHg5OSwgMHg3MSwgCisweDlhLCAweDcyLCAweDU4LCAweDcxLCAweDVhLCAweDcyLCAweGQ5LCAweDcxLCAweGRhLCAweDcyLCAweDE5LCAweDczLCAKKzB4ZTcsIDB4MWQsIDB4ODksIDB4MzcsIDB4M2EsIDB4NzAsIDB4OTksIDB4NzMsIDB4YjksIDB4NzAsIDB4NTgsIDB4NzMsIAorMHg3YSwgMHg3MCwgMHhkOSwgMHg3MywgMHhmOSwgMHg3MCwgMHgzOSwgMHg3MSwgMHgzYSwgMHg3MiwgMHhiOSwgMHg3MSwgCisweGI5LCAweDcyLCAweDc4LCAweDcxLCAweDdhLCAweDcyLCAweGY5LCAweDcxLCAweGY5LCAweDcyLCAweDNhLCAweDczLCAKKzB4ZTMsIDB4MWQsIDB4OTksIDB4MzMsIDB4MWEsIDB4NzAsIDB4YjksIDB4NzMsIDB4OWEsIDB4NzAsIDB4NzgsIDB4NzMsIAorMHg1YSwgMHg3MCwgMHhmOSwgMHg3MywgMHhkYSwgMHg3MCwgMHgxOSwgMHg3MSwgMHgxYSwgMHg3MiwgMHg5OSwgMHg3MSwgCisweDk5LCAweDcyLCAweDU4LCAweDcxLCAweDVhLCAweDcyLCAweGQ5LCAweDcxLCAweGQ5LCAweDcyLCAweDIwLCAweDYxLCAKKzB4ZTAsIDB4NjAsIDB4NjAsIDB4NjEsIDB4YTAsIDB4NjAsIDB4OTAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHhhMCwgMHgxYywgMHgwMCwgMHg4MCwgMHhlOCwgMHgxOSwgMHgwMCwgMHg4MCwgMHg4MSwgMHgyMCwgMHgwMCwgMHgwMiwgCisweDAxLCAweDQ5LCAweGMwLCAweDQ2LCAweDg4LCAweDYyLCAweDcwLCAweDQ3LCAweGMwLCAweDAwLCAweDE0LCAweDAwLCAKKzB4MDksIDB4NDksIDB4MGEsIDB4NGIsIDB4YzgsIDB4MTgsIDB4MDQsIDB4M2IsIDB4YzksIDB4MTgsIDB4MDgsIDB4NjAsIAorMHgwMCwgMHgyMSwgMHhjMiwgMHgxZCwgMHgyOSwgMHgzMiwgMHhjMiwgMHg2MSwgMHgxMCwgMHgxYywgMHgwMSwgMHgzMSwgCisweDA4LCAweDI5LCAweGY4LCAweGQzLCAweGMxLCAweDFmLCAweDI5LCAweDM5LCAweDAwLCAweDIwLCAweGM4LCAweDYxLCAKKzB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ODQsIDB4MDksIDB4MDAsIDB4MDAsIAorMHgwNiwgMHg0OCwgMHgwNywgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg4MCwgMHg0OCwgMHg4MCwgMHgwMCwgMHgyMCwgCisweDg4LCAweDgwLCAweGM4LCAweDgwLCAweDg4LCAweDYwLCAweDA0LCAweDQ5LCAweGMwLCAweDQ2LCAweDQ4LCAweDYxLCAKKzB4ODgsIDB4NjEsIDB4NzAsIDB4NDcsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4NGMsIDB4MmEsIDB4MDAsIDB4ODAsIAorMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgMHgwMCwgMHgyMSwgMHgwNiwgMHg0OCwgMHhjMiwgMHgxZCwgMHgxOSwgMHgzMiwgCisweGMxLCAweDYwLCAweDAxLCAweDYxLCAweGMxLCAweDYxLCAweDAxLCAweDYyLCAweDExLCAweDcxLCAweGZmLCAweDMwLCAKKzB4MDEsIDB4MzAsIDB4NDEsIDB4NjIsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIAorMHgwOSwgMHg0OCwgMHgwYSwgMHg0YiwgMHhjMCwgMHg0NiwgMHgxOCwgMHg2MCwgMHgwMCwgMHgyMSwgMHhjMiwgMHgxZCwgCisweDRkLCAweDMyLCAweGMyLCAweDYwLCAweDEwLCAweDFjLCAweDAxLCAweDMxLCAweDE0LCAweDI5LCAweGY4LCAweGQzLCAKKzB4YzEsIDB4MWYsIDB4NGQsIDB4MzksIDB4MDAsIDB4MjAsIDB4YzgsIDB4NjAsIDB4NTgsIDB4NjAsIDB4OTgsIDB4NjAsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHhkOCwgMHgwNywgMHgwMCwgMHg4MCwgMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgCisweDAwLCAweGI1LCAweDBiLCAweDQ5LCAweDBiLCAweDQ4LCAweGZkLCAweGY3LCAweGVhLCAweGZiLCAweDBiLCAweDQ4LCAKKzB4MDAsIDB4NmEsIDB4MDEsIDB4MjMsIDB4ZGIsIDB4MDMsIDB4OTgsIDB4NDMsIDB4MDksIDB4NDksIDB4YzAsIDB4NDYsIAorMHgwOCwgMHg2MiwgMHgwOSwgMHg0OCwgMHhjMSwgMHg2OCwgMHgwMSwgMHgyOSwgMHgwNCwgMHhkMSwgMHhjMCwgMHg2ZiwgCisweDgwLCAweDIzLCAweDAxLCAweDY4LCAweDE5LCAweDQzLCAweDAxLCAweDYwLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4YzEsIDB4YmQsIDB4MjEsIDB4NDAsIDB4NzUsIDB4OTgsIDB4MjEsIDB4NDAsIAorMHhjMCwgMHgwMCwgMHgxOCwgMHg0MCwgMHhjMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweDAwLCAweGI1LCAweDBmLCAweDQ4LCAweGMxLCAweDY4LCAweDAxLCAweDI5LCAweDA0LCAweGQxLCAweGMwLCAweDZmLCAKKzB4ODAsIDB4MjMsIDB4MDEsIDB4NjgsIDB4OTksIDB4NDMsIDB4MDEsIDB4NjAsIDB4MGIsIDB4NGIsIDB4MGMsIDB4NDgsIAorMHgwYywgMHg0YSwgMHgwMCwgMHgyMSwgMHhmZCwgMHhmNywgMHhiZiwgMHhmYiwgMHgwYiwgMHg0OCwgMHg0MSwgMHg4ZCwgCisweDAxLCAweDMxLCAweDQxLCAweDg1LCAweDAwLCAweDIxLCAweGMxLCAweDg1LCAweDA5LCAweDQ4LCAweDAwLCAweDZhLCAKKzB4MDEsIDB4MjMsIDB4ZGIsIDB4MDMsIDB4MTgsIDB4NDMsIDB4MDgsIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjIsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg1OSwgMHhiZCwgMHgyMSwgMHg0MCwgCisweDc1LCAweDk4LCAweDIxLCAweDQwLCAweGI4LCAweDBiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAKKzB4YzAsIDB4MDAsIDB4MTgsIDB4NDAsIDB4YzAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4ZjAsIDB4YjUsIDB4MWIsIDB4NGMsIAorMHgxMCwgMHgyNiwgMHhlMCwgMHg2OCwgMHgwMSwgMHgyOCwgMHgwOCwgMHhkMSwgMHg2MCwgMHg4OCwgMHgwMCwgMHgyOCwgCisweDA1LCAweGQxLCAweDIwLCAweDc5LCAweDAwLCAweDI4LCAweDAyLCAweGQxLCAweDE5LCAweDIwLCAweGEwLCAweDY3LCAKKzB4MDAsIDB4ZTAsIDB4YTYsIDB4NjcsIDB4MDAsIDB4MjAsIDB4MDcsIDB4MjMsIDB4NWIsIDB4MDIsIDB4ZTUsIDB4MTgsIAorMHhjMSwgMHg0MywgMHhlOCwgMHg2MSwgMHg2OSwgMHg2MiwgMHg1OSwgMHgwOCwgMHhhMSwgMHgyNywgMHg3ZiwgMHgwMywgCisweDc5LCAweDYwLCAweDBmLCAweDIxLCAweDc5LCAweDYwLCAweGUxLCAweDFkLCAweGI5LCAweDMxLCAweDA4LCAweDcxLCAKKzB4MDEsIDB4MjAsIDB4YjgsIDB4NjAsIDB4NDAsIDB4MDIsIDB4YjgsIDB4NjAsIDB4MDAsIDB4ZjAsIDB4NGMsIDB4ZmEsIAorMHgwMCwgMHhmMCwgMHhmMCwgMHhmYSwgMHgwNCwgMHgyMCwgMHhiOCwgMHg2MCwgMHgwNywgMHgyMCwgMHg3OCwgMHg2MSwgCisweDdlLCAweDYwLCAweDFiLCAweDIzLCAweGRiLCAweDAxLCAweGUwLCAweDE4LCAweGMwLCAweDhiLCAweDA0LCAweDIzLCAKKzB4MTgsIDB4NDAsIDB4ZTgsIDB4NjIsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg5MCwgMHhiNCwgMHgwMiwgMHgxYywgMHgwMCwgMHgyMCwgMHhmZiwgMHgyMywgCisweDAxLCAweDMzLCAweDlhLCAweDQyLCAweDA4LCAweGQwLCAweDAxLCAweDI5LCAweDAwLCAweGQxLCAweDAxLCAweDIwLCAKKzB4MDAsIDB4MmEsIDB4MDEsIDB4ZDEsIDB4MDIsIDB4MjMsIDB4MTgsIDB4NDMsIDB4OTAsIDB4YmMsIDB4NzAsIDB4NDcsIAorMHgxYiwgMHg0YSwgMHhkNywgMHg2OCwgMHgxYSwgMHg0YiwgMHgxOSwgMHg3OSwgMHgxYywgMHgxYywgMHgzNywgMHgyMywgCisweDliLCAweDAxLCAweGUzLCAweDE4LCAweDAxLCAweDJmLCAweDBkLCAweGQxLCAweDU3LCAweDg4LCAweDAwLCAweDJmLCAKKzB4MGEsIDB4ZDEsIDB4MDAsIDB4MjksIDB4MGEsIDB4ZDEsIDB4NTksIDB4OGIsIDB4MGEsIDB4MDksIDB4MDAsIDB4ZDMsIAorMHgwMiwgMHgyMCwgMHg0OSwgMHgwOSwgMHhlOCwgMHhkMywgMHgwMSwgMHgyMywgMHgxOCwgMHg0MywgMHhlNSwgMHhlNywgCisweDAwLCAweDI5LCAweDAzLCAweGQwLCAweDk4LCAweDhhLCAweDgwLCAweDA3LCAweDgwLCAweDBmLCAweGRmLCAweGU3LCAKKzB4NmQsIDB4MjMsIDB4NWIsIDB4MDEsIDB4ZDEsIDB4MTgsIDB4OGEsIDB4ODgsIDB4ZmYsIDB4MjcsIDB4MDEsIDB4MzcsIAorMHgxNywgMHg0MCwgMHgwYSwgMHg0OSwgMHhjOSwgMHg4OCwgMHgwMywgMHhkMCwgMHg0YiwgMHgwYSwgMHgwMSwgMHhkMywgCisweDAzLCAweDIwLCAweGQxLCAweGU3LCAweDEzLCAweDBhLCAweDAzLCAweGQzLCAweDBiLCAweDBhLCAweDAxLCAweGQzLCAKKzB4MDIsIDB4MjAsIDB4Y2IsIDB4ZTcsIDB4ZDIsIDB4MDksIDB4YzksIDB4ZDMsIDB4YzksIDB4MDksIDB4YzcsIDB4ZDMsIAorMHgwMSwgMHgyMCwgMHhjNSwgMHhlNywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgwOCwgMHgxYywgMHgwMCwgMHg4MCwgCisweGYwLCAweGI1LCAweGMxLCAweGIwLCAweDAxLCAweDIwLCAweDAwLCAweDA3LCAweDUyLCAweDQ5LCAweGMwLCAweDQ2LCAKKzB4MDgsIDB4NjAsIDB4NTIsIDB4NDgsIDB4NDIsIDB4NjksIDB4NDAsIDB4MGQsIDB4YTEsIDB4MjEsIDB4NDksIDB4MDMsIAorMHg0OCwgMHg2MCwgMHg1MCwgMHg0OCwgMHhjMCwgMHg2YSwgMHg1MCwgMHg0YiwgMHgxOCwgMHg0MywgMHgwMCwgMHgyMSwgCisweDAzLCAweDAzLCAweDFiLCAweDBiLCAweDRlLCAweDRjLCAweDI3LCAweDZmLCAweDNkLCAweDAzLCAweDJkLCAweDBiLCAKKzB4ZTcsIDB4MWQsIDB4NzksIDB4MzcsIDB4YWIsIDB4NDIsIDB4MWMsIDB4ZDAsIDB4ZTMsIDB4MWQsIDB4NzksIDB4MzMsIAorMHgxYiwgMHg2YSwgMHhjMCwgMHg0NiwgMHg0MCwgMHg5MywgMHgwMSwgMHgyMywgMHg5YiwgMHgwNywgMHgwMywgMHg0MywgCisweDFiLCAweDY4LCAweGNjLCAweDAwLCAweDZlLCAweDQ2LCAweDMzLCAweDUxLCAweDAxLCAweDIzLCAweDliLCAweDA3LCAKKzB4MDYsIDB4MWQsIDB4MzMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4NmMsIDB4NDQsIDB4NjMsIDB4NjAsIDB4MDgsIDB4MzAsIAorMHgwMSwgMHgzMSwgMHg0MCwgMHg5YiwgMHg4MywgMHg0MiwgMHgwMCwgMHhkOCwgMHgzZiwgMHg0OCwgMHgwMywgMHgwMywgCisweDFiLCAweDBiLCAweGFiLCAweDQyLCAweGU3LCAweGQxLCAweDAwLCAweDIwLCAweDAxLCAweDIzLCAweDFiLCAweDAzLCAKKzB4MTMsIDB4NDAsIDB4M2MsIDB4NGMsIDB4MDMsIDB4ZDAsIDB4NjMsIDB4NmEsIDB4MDEsIDB4MzMsIDB4NjMsIDB4NjIsIAorMHgwOSwgMHhlMCwgMHgxMywgMHgwYiwgMHgwMywgMHhkMywgMHgyMywgMHg2YSwgCisweDAxLCAweDMzLCAweDIzLCAweDYyLCAweDAzLCAweGUwLCAweDM3LCAweDRiLCAweDVjLCAweDZkLCAweDAxLCAweDM0LCAKKzB4NWMsIDB4NjUsIDB4MDAsIDB4MjksIDB4MDksIDB4ZDAsIDB4MDMsIDB4MWMsIDB4ZGMsIDB4MDAsIDB4MjMsIDB4MWMsIAorMHg2YiwgMHg0NCwgMHg1YywgMHg2OCwgMHgwMSwgMHgzMCwgMHgyMywgMHgwZCwgMHgwMSwgMHhkMiwgMHg4OCwgMHg0MiwgCisweGY1LCAweGQxLCAweDMwLCAweDRjLCAweDI1LCAweDY4LCAweDZiLCAweDBjLCAweDA1LCAweGQyLCAweDIzLCAweDY4LCAKKzB4MWIsIDB4MGMsIDB4MDgsIDB4ZDEsIDB4MjQsIDB4NjgsIDB4YTMsIDB4MGEsIDB4MDUsIDB4ZDMsIDB4MjAsIDB4MjQsIAorMHgyYiwgMHg0YiwgMHhjMCwgMHg0NiwgMHg1YywgMHg2MiwgMHgwMCwgMHgyNCwgMHg1YywgMHg2MiwgMHgyNSwgMHg0YiwgCisweDIzLCAweDRjLCAweDUxLCAweDI2LCAweGI2LCAweDAzLCAweDIzLCAweDY3LCAweDMzLCAweDYxLCAweDNkLCAweDZhLCAKKzB4YzAsIDB4NDYsIDB4NzUsIDB4NjEsIDB4MDIsIDB4MjUsIDB4YTEsIDB4MjYsIDB4NzYsIDB4MDMsIDB4NzUsIDB4NjAsIAorMHgwMSwgMHgyNSwgMHhiNSwgMHg2MCwgMHhlNiwgMHgxZCwgMHhiOSwgMHgzNiwgMHgzNSwgMHg3MSwgMHg4OCwgMHg0MiwgCisweDIxLCAweGQwLCAweDI1LCAweDFjLCAweGMzLCAweDAwLCAweDZjLCAweDQ2LCAweGU0LCAweDU4LCAweDJlLCAweDZmLCAKKzB4NmIsIDB4NDQsIDB4MzQsIDB4NjAsIDB4NWIsIDB4NjgsIDB4MmMsIDB4NmYsIDB4YzAsIDB4NDYsIDB4NjMsIDB4NjAsIAorMHgyYiwgMHg2ZiwgMHgwOCwgMHgzMywgMHgyYiwgMHg2NywgMHgzYywgMHg2YSwgMHhhMywgMHg0MiwgMHgwMiwgMHhkMywgCisweDEyLCAweDRiLCAweGMwLCAweDQ2LCAweDJiLCAweDY3LCAweDAzLCAweDFjLCAweGRiLCAweDAwLCAweDZiLCAweDQ0LCAKKzB4NWMsIDB4NjgsIDB4MDEsIDB4MzAsIDB4MjMsIDB4MGQsIDB4MDQsIDB4ZDMsIDB4NTEsIDB4MjQsIDB4YTQsIDB4MDMsIAorMHgyYiwgMHg2ZiwgMHhjMCwgMHg0NiwgMHhhMywgMHg2MSwgMHg4OCwgMHg0MiwgMHhkZSwgMHhkMSwgMHgxMCwgMHgwYiwgCisweDAzLCAweGQzLCAweDBlLCAweDQ5LCAweDAxLCAweDIwLCAweGZkLCAweGY3LCAweDc0LCAweGZhLCAweDQxLCAweGIwLCAKKzB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjAsIAorMHgwMCwgMHgwMSwgMHgxNCwgMHg0MCwgMHgwMCwgMHg0MCwgMHgxNCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgyMCwgMHg0MCwgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDI0LCAweGE3LCAweDIwLCAweDQwLCAweGE0LCAweDJhLCAweDAwLCAweDgwLCAKKzB4YTAsIDB4ODIsIDB4MjAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4NDAsIDB4YzAsIDB4MDAsIDB4MTgsIDB4MDAsIAorMHhjOSwgMHg0ZiwgMHhmZiwgMHhmZiwgMHhmMCwgMHhiNCwgMHgwMCwgMHgyMSwgMHgwMCwgMHgyMywgMHgwNywgMHgyMiwgCisweDA2LCAweDI0LCAweDQ3LCAweDRmLCAweGMwLCAweDQ2LCAweDNjLCAweDYxLCAweDNhLCAweDYxLCAweDAxLCAweDMzLCAKKzB4MjAsIDB4MmIsIDB4ZjksIDB4ZDMsIDB4MDQsIDB4MjUsIDB4M2QsIDB4NjEsIDB4MDUsIDB4MjMsIDB4M2IsIDB4NjEsIAorMHgzYywgMHg2MSwgMHgzYSwgMHg2MSwgMHgzYywgMHg2MSwgMHgzYSwgMHg2MSwgMHgzZCwgMHg2MSwgMHgzYiwgMHg2MSwgCisweDNmLCAweDRkLCAweGFiLCAweDZmLCAweGRlLCAweDA4LCAweDAyLCAweDIzLCAweDFlLCAweDQwLCAweDA0LCAweDIzLCAKKzB4MzMsIDB4NDMsIDB4M2IsIDB4NjEsIDB4MDUsIDB4MjMsIDB4MzMsIDB4NDMsIDB4M2IsIDB4NjEsIDB4YWIsIDB4NmYsIAorMHg5ZSwgMHgwOCwgMHgwMiwgMHgyMywgMHgxZSwgMHg0MCwgMHgwNCwgMHgyMywgMHgzMywgMHg0MywgMHgzYiwgMHg2MSwgCisweDA1LCAweDIzLCAweDMzLCAweDQzLCAweDNiLCAweDYxLCAweGFiLCAweDZmLCAweDVlLCAweDA4LCAweDAyLCAweDIzLCAKKzB4MWUsIDB4NDAsIDB4MDQsIDB4MjMsIDB4MzMsIDB4NDMsIDB4M2IsIDB4NjEsIDB4MDUsIDB4MjMsIDB4MzMsIDB4NDMsIAorMHgzYiwgMHg2MSwgMHgwMiwgMHgyMywgMHhhZSwgMHg2ZiwgMHgxZSwgMHg0MCwgMHgwNCwgMHgyMywgMHgzMywgMHg0MywgCisweDNiLCAweDYxLCAweDA1LCAweDIzLCAweDMzLCAweDQzLCAweDNiLCAweDYxLCAweGFiLCAweDZmLCAweDVkLCAweDAwLCAKKzB4MDIsIDB4MjMsIDB4MWQsIDB4NDAsIDB4MDQsIDB4MjMsIDB4MmIsIDB4NDMsIDB4M2IsIDB4NjEsIDB4MDUsIDB4MjMsIAorMHgyYiwgMHg0MywgMHgzYiwgMHg2MSwgMHhjNSwgMHgwOCwgMHgwMiwgMHgyMywgMHgxZCwgMHg0MCwgMHgwNCwgMHgyMywgCisweDJiLCAweDQzLCAweDNiLCAweDYxLCAweDA1LCAweDIzLCAweDJiLCAweDQzLCAweDNiLCAweDYxLCAweDg1LCAweDA4LCAKKzB4MDIsIDB4MjMsIDB4MWQsIDB4NDAsIDB4MDQsIDB4MjMsIDB4MmIsIDB4NDMsIDB4M2IsIDB4NjEsIDB4MDUsIDB4MjMsIAorMHgyYiwgMHg0MywgMHgzYiwgMHg2MSwgMHg0NSwgMHgwOCwgMHgwMiwgMHgyMywgMHgxZCwgMHg0MCwgMHgwNCwgMHgyMywgCisweDJiLCAweDQzLCAweDNiLCAweDYxLCAweDA1LCAweDIzLCAweDJiLCAweDQzLCAweDNiLCAweDYxLCAweDAyLCAweDI1LCAKKzB4MDUsIDB4NDAsIDB4MDQsIDB4MjMsIDB4MmIsIDB4NDMsIDB4M2IsIDB4NjEsIDB4MDUsIDB4MjMsIDB4MmIsIDB4NDMsIAorMHgzYiwgMHg2MSwgMHg0MCwgMHgwMCwgMHgwMiwgMHgyMywgMHgxOCwgMHg0MCwgMHgwNCwgMHgyMywgMHgwMywgMHg0MywgCisweDNiLCAweDYxLCAweDA1LCAweDIzLCAweDE4LCAweDQzLCAweDM4LCAweDYxLCAweDAwLCAweDI1LCAweDNkLCAweDYxLCAKKzB4MDEsIDB4MjMsIDB4M2IsIDB4NjEsIDB4M2QsIDB4NjEsIDB4M2IsIDB4NjEsIDB4MDAsIDB4MjAsIDB4M2QsIDB4NjEsIAorMHgwZCwgMHg0YiwgMHgxYiwgMHg2OSwgMHg0OSwgMHgwMCwgMHgxZSwgMHgxYywgMHgwMiwgMHgyMywgMHgzMywgMHg0MCwgCisweDE5LCAweDQzLCAweDAxLCAweDIzLCAweDNiLCAweDYxLCAweDAxLCAweDMwLCAKKzB4MTAsIDB4MjgsIDB4ZjIsIDB4ZDMsIDB4MDIsIDB4MjAsIDB4MzgsIDB4NjEsIDB4MDMsIDB4MjAsIDB4MzgsIDB4NjEsIAorMHgzYywgMHg2MSwgMHgzYSwgMHg2MSwgMHgzYywgMHg2MSwgMHgzYSwgMHg2MSwgMHgzOCwgMHg2MSwgMHg0OCwgMHgwOCwgCisweGYwLCAweGJjLCAweDcwLCAweDQ3LCAweDgwLCAweDAwLCAweDE0LCAweDAwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4ODAsIDB4MDAsIDB4MTQsIDB4NDAsIDB4ZjAsIDB4YjQsIDB4MDAsIDB4MjQsIDB4MDcsIDB4MjMsIDB4MDYsIDB4MjcsIAorMHg0NCwgMHg0YSwgMHhjMCwgMHg0NiwgMHgxNywgMHg2MSwgMHgxMywgMHg2MSwgMHgwMSwgMHgzNCwgMHgyMCwgMHgyYywgCisweGY5LCAweGQzLCAweDA0LCAweDI2LCAweDE2LCAweDYxLCAweDA1LCAweDI0LCAweDE0LCAweDYxLCAweDE3LCAweDYxLCAKKzB4MDcsIDB4MjMsIDB4MTMsIDB4NjEsIDB4MTYsIDB4NjEsIDB4MTQsIDB4NjEsIDB4MTcsIDB4NjEsIDB4MTMsIDB4NjEsIAorMHgzYywgMHg0YiwgMHg5YiwgMHg2ZiwgMHhkZCwgMHgwOCwgMHgwMiwgMHgyMywgMHgxZCwgMHg0MCwgMHgyYiwgMHgxYywgCisweDMzLCAweDQzLCAweDEzLCAweDYxLCAweDI1LCAweDQzLCAweDE1LCAweDYxLCAweDM3LCAweDRiLCAweDliLCAweDZmLCAKKzB4OWQsIDB4MDgsIDB4MDIsIDB4MjMsIDB4MWQsIDB4NDAsIDB4MmIsIDB4MWMsIDB4MzMsIDB4NDMsIDB4MTMsIDB4NjEsIAorMHgyNSwgMHg0MywgMHgxNSwgMHg2MSwgMHgzMiwgMHg0YiwgMHg5YiwgMHg2ZiwgMHg1ZCwgMHgwOCwgMHgwMiwgMHgyMywgCisweDFkLCAweDQwLCAweDJiLCAweDFjLCAweDMzLCAweDQzLCAweDEzLCAweDYxLCAweDI1LCAweDQzLCAweDE1LCAweDYxLCAKKzB4MmQsIDB4NGIsIDB4OWQsIDB4NmYsIDB4MDIsIDB4MjMsIDB4MWQsIDB4NDAsIDB4MmIsIDB4MWMsIDB4MzMsIDB4NDMsIAorMHgxMywgMHg2MSwgMHgyNSwgMHg0MywgMHgxNSwgMHg2MSwgMHgyOSwgMHg0YiwgMHg5YiwgMHg2ZiwgMHg1ZCwgMHgwMCwgCisweDAyLCAweDIzLCAweDFkLCAweDQwLCAweDJiLCAweDFjLCAweDMzLCAweDQzLCAweDEzLCAweDYxLCAweDI1LCAweDQzLCAKKzB4MTUsIDB4NjEsIDB4YzUsIDB4MDgsIDB4MDIsIDB4MjMsIDB4MWQsIDB4NDAsIDB4MmIsIDB4MWMsIDB4MzMsIDB4NDMsIAorMHgxMywgMHg2MSwgMHgyNSwgMHg0MywgMHgxNSwgMHg2MSwgMHg4NSwgMHgwOCwgMHgwMiwgMHgyMywgMHgxZCwgMHg0MCwgCisweDJiLCAweDFjLCAweDMzLCAweDQzLCAweDEzLCAweDYxLCAweDI1LCAweDQzLCAweDE1LCAweDYxLCAweDQ1LCAweDA4LCAKKzB4MDIsIDB4MjMsIDB4MWQsIDB4NDAsIDB4MmIsIDB4MWMsIDB4MzMsIDB4NDMsIDB4MTMsIDB4NjEsIDB4MjUsIDB4NDMsIAorMHgxNSwgMHg2MSwgMHgwMiwgMHgyNSwgMHgwNSwgMHg0MCwgMHgyYiwgMHgxYywgMHgzMywgMHg0MywgMHgxMywgMHg2MSwgCisweDI1LCAweDQzLCAweDE1LCAweDYxLCAweDQwLCAweDAwLCAweDAyLCAweDIzLCAweDE4LCAweDQwLCAweDAzLCAweDFjLCAKKzB4MzMsIDB4NDMsIDB4MTMsIDB4NjEsIDB4MjAsIDB4NDMsIDB4MTAsIDB4NjEsIDB4MTcsIDB4NjEsIDB4MDcsIDB4MjMsIAorMHgxMywgMHg2MSwgMHgxNiwgMHg2MSwgMHgxNCwgMHg2MSwgMHg0YywgMHgwMCwgMHgwMCwgMHgyMCwgMHgwZiwgMHgyMSwgCisweDI1LCAweDFjLCAweGNkLCAweDQwLCAweDAyLCAweDIzLCAweDFkLCAweDQwLCAweDA0LCAweDIzLCAweDJiLCAweDQzLCAKKzB4MTMsIDB4NjEsIDB4MDUsIDB4MjMsIDB4MmIsIDB4NDMsIDB4MTMsIDB4NjEsIDB4MDEsIDB4MzAsIDB4MDEsIDB4MzksIAorMHgxMCwgMHgyOCwgMHhmMSwgMHhkMywgMHgxNywgMHg2MSwgMHgwNywgMHgyMywgMHgxMywgMHg2MSwgMHgxNywgMHg2MSwgCisweDEzLCAweDYxLCAweDAzLCAweDIwLCAweDEwLCAweDYxLCAweGYwLCAweGJjLCAweDcwLCAweDQ3LCAweDAwLCAweDAwLCAKKzB4ODAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4ZjAsIDB4YjUsIDB4NGYsIDB4NGQsIAorMHgwOCwgMHgyMSwgMHgwMiwgMHgyMCwgMHgyYSwgMHgxYywgMHhmZCwgMHhmNywgMHgyNywgMHhmOSwgMHg0ZCwgMHg0YywgCisweDcxLCAweDIzLCAweDViLCAweDAxLCAweGU3LCAweDE4LCAweDM4LCAweDgwLCAweDFhLCAweDIxLCAweDAyLCAweDIwLCAKKzB4MmEsIDB4MWMsIDB4ZmQsIDB4ZjcsIDB4MWQsIDB4ZjksIDB4NzgsIDB4ODAsIDB4MjAsIDB4NzksIDB4MDAsIDB4MjgsIAorMHgwYiwgMHhkMCwgMHgwMCwgMHgyMCwgMHgzOCwgMHg4MCwgMHhlMCwgMHg2OCwgMHgwMSwgMHgyOCwgMHgxMCwgMHhkMSwgCisweDQ0LCAweDQ4LCAweDAwLCAweDY4LCAweDAxLCAweDIzLCAweDliLCAweDAyLCAweDE4LCAweDQzLCAweDk5LCAweDAyLCAKKzB4MDgsIDB4NjAsIDB4ZTAsIDB4NjgsIDB4MDEsIDB4MjgsIDB4MDYsIDB4ZDEsIDB4NjAsIDB4ODgsIDB4MDAsIDB4MjgsIAorMHgwMywgMHhkMSwgMHhmOSwgMHgyMSwgMHgxMiwgMHgyMCwgMHhmZiwgMHhmNywgMHg0MywgMHhmZiwgMHgwMSwgMHgyMSwgCisweGM5LCAweDAzLCAweDAwLCAweDIwLCAweGZmLCAweGY3LCAweDNlLCAweGZmLCAweDAwLCAweDI1LCAweDdkLCAweDI2LCAKKzB4ZjYsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4MDEsIDB4MzUsIDB4MDAsIDB4MjAsIDB4ZmYsIDB4ZjcsIDB4OWMsIDB4ZmUsIAorMHgwMCwgMHgwYywgMHgwMSwgMHhkMywgMHhiNSwgMHg0MiwgMHhmNywgMHhkMywgMHgwMCwgMHgyNSwgMHgwNSwgMHhlMCwgCisweDAzLCAweDIxLCAweDA5LCAweDAzLCAweDAwLCAweDIwLCAweGZmLCAweGY3LCAweDJiLCAweGZmLCAweDAxLCAweDM1LCAKKzB4MDAsIDB4MjAsIDB4ZmYsIDB4ZjcsIDB4OGQsIDB4ZmUsIDB4NDAsIDB4MGIsIDB4MDEsIDB4ZDIsIDB4YjUsIDB4NDIsIAorMHhmMiwgMHhkMywgMHgwNCwgMHgyMCwgMHhmZiwgMHhmNywgMHg4NiwgMHhmZSwgMHhmZiwgMHgyMywgMHhlMSwgMHgzMywgCisweDk4LCAweDQzLCAweDAxLCAweDIxLCAweDAxLCAweDQzLCAweDM4LCAweDg4LCAweGZmLCAweDIzLCAweDAxLCAweDMzLCAKKzB4OTgsIDB4NDIsIDB4MDMsIDB4ZDEsIDB4MmYsIDB4MjMsIDB4NWIsIDB4MDEsIAorMHgxOSwgMHg0MywgMHgxNiwgMHhlMCwgMHgwMSwgMHgyOCwgMHgwOSwgMHhkMSwgMHg3OCwgMHg4OCwgMHgwMSwgMHgyOCwgCisweDAzLCAweGQxLCAweDIzLCAweDIzLCAweDViLCAweDAxLCAweDE5LCAweDQzLCAweDBkLCAweGUwLCAweDIwLCAweDIzLCAKKzB4MTksIDB4NDMsIDB4MGEsIDB4ZTAsIDB4MDAsIDB4MjgsIDB4MDgsIDB4ZDEsIDB4NzgsIDB4ODgsIDB4MDEsIDB4MjgsIAorMHgwMywgMHhkMSwgMHgwYiwgMHgyMywgMHhkYiwgMHgwMSwgMHgxOSwgMHg0MywgMHgwMSwgMHhlMCwgMHg4MCwgMHgyMywgCisweDE5LCAweDQzLCAweDA0LCAweDIwLCAweGZmLCAweGY3LCAweGY4LCAweGZlLCAweDA5LCAweDIxLCAweDQ5LCAweDAyLCAKKzB4MDAsIDB4MjAsIDB4ZmYsIDB4ZjcsIDB4ZjMsIDB4ZmUsIDB4ZTAsIDB4NjgsIDB4MDAsIDB4MjgsIDB4MGMsIDB4ZDEsIAorMHgwMCwgMHgyMSwgMHgxYiwgMHgyMCwgMHhmZiwgMHhmNywgMHhlYywgMHhmZSwgMHgxYSwgMHgyMCwgMHhmZiwgMHhmNywgCisweDRmLCAweGZlLCAweDAxLCAweDIxLCAweGM5LCAweDAzLCAweDAxLCAweDQzLCAweDFhLCAweDIwLCAweGZmLCAweGY3LCAKKzB4ZTMsIDB4ZmUsIDB4MDAsIDB4MjcsIDB4MDMsIDB4ZTAsIDB4MDgsIDB4MmYsIDB4MDEsIDB4ZDMsIDB4MGYsIDB4MmYsIAorMHgwOCwgMHhkOSwgMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgMHg0MCwgMHhmZSwgMHg3OSwgMHgwMCwgMHgwOSwgMHgxOSwgCisweDFiLCAweDIzLCAweGRiLCAweDAxLCAweGM5LCAweDE4LCAweDg4LCAweDgzLCAweDAxLCAweDM3LCAweDIwLCAweDJmLCAKKzB4ZWYsIDB4ZDMsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4ZWQsIDB4YWYsIDB4MjEsIDB4NDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgxMCwgMHg0MCwgMHg4MSwgMHhiMCwgMHgxMywgMHg0OCwgCisweDAxLCAweDY4LCAweGMwLCAweDQ2LCAweDAwLCAweDkxLCAweDQxLCAweDY4LCAweGMwLCAweDQ2LCAweDAwLCAweDkxLCAKKzB4ODEsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTEsIDB4YzEsIDB4NjgsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTEsIAorMHgwMSwgMHg2OSwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MSwgMHg0MSwgMHg2OSwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MSwgCisweDgxLCAweDY5LCAweGMwLCAweDQ2LCAweDAwLCAweDkxLCAweGMxLCAweDY5LCAweGMwLCAweDQ2LCAweDAwLCAweDkxLCAKKzB4MDEsIDB4NmEsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTEsIDB4NDEsIDB4NmEsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTEsIAorMHg4MSwgMHg2YSwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MSwgMHhjMCwgMHg2YSwgMHhjMCwgMHg0NiwgMHgwMCwgMHg5MCwgCisweDAxLCAweGIwLCAweDcwLCAweDQ3LCAweDAwLCAweDA4LCAweDE0LCAweDQwLCAweGYwLCAweGI1LCAweDgzLCAweGIwLCAKKzB4NjgsIDB4NGQsIDB4MWIsIDB4MjMsIDB4ZGIsIDB4MDEsIDB4ZWYsIDB4MTgsIDB4ZjgsIDB4OGIsIDB4MDQsIDB4MjIsIAorMHgwMiwgMHg0MCwgMHgwMiwgMHg5MiwgMHg3MSwgMHgyMywgMHg1YiwgMHgwMSwgMHhlOCwgMHgxOCwgMHgwMSwgMHg4OCwgCisweGMwLCAweDQ2LCAweDAxLCAweDkxLCAweDQwLCAweDg4LCAweGMwLCAweDQ2LCAweDAwLCAweDkwLCAweDAwLCAweDI0LCAKKzB4MDMsIDB4ZTAsIDB4MDgsIDB4MmMsIDB4MDEsIDB4ZDMsIDB4MGYsIDB4MmMsIDB4MDgsIDB4ZDksIDB4MjAsIDB4MWMsIAorMHhmZiwgMHhmNywgMHhlOCwgMHhmZCwgMHg2MSwgMHgwMCwgMHg0OSwgMHgxOSwgMHgxYiwgMHgyMywgMHhkYiwgMHgwMSwgCisweGM5LCAweDE4LCAweDg4LCAweDgzLCAweDAxLCAweDM0LCAweDIwLCAweDJjLCAweGVmLCAweGQzLCAweDU4LCAweDRjLCAKKzB4ZTAsIDB4NjksIDB4MDAsIDB4MjgsIDB4MTUsIDB4ZDAsIDB4NTcsIDB4NGUsIDB4MjAsIDB4MjUsIDB4MDEsIDB4M2QsIAorMHg1MywgMHg0OSwgMHhlMCwgMHg2OSwgMHgzMCwgMHg0MCwgMHgwYiwgMHhkMCwgMHg2OCwgMHgwMCwgMHg0MCwgMHgxOCwgCisweDM3LCAweDIzLCAweDliLCAweDAxLCAweGMwLCAweDE4LCAweDgxLCAweDhiLCAweDI4LCAweDFjLCAweGZmLCAweGY3LCAKKzB4NjUsIDB4ZmUsIDB4ZTAsIDB4NjksIDB4YjAsIDB4NDMsIDB4ZTAsIDB4NjEsIDB4NzYsIDB4MDgsIDB4MDAsIDB4MmQsIAorMHhlYiwgMHhkMSwgMHgwMSwgMHgyMCwgMHhmZiwgMHhmNywgMHhjMiwgMHhmZCwgMHg0OCwgMHg0OSwgMHhjMCwgMHg0NiwgCisweGY4LCAweDgzLCAweGY4LCAweDhiLCAweGMyLCAweDA4LCAweDI1LCAweGQzLCAweGNhLCAweDY4LCAweDAxLCAweDJhLCAKKzB4MTMsIDB4ZDEsIDB4MGEsIDB4NzksIDB4MDAsIDB4MmEsIDB4MWYsIDB4ZDEsIDB4NDksIDB4ODgsIDB4MDAsIDB4MjksIAorMHgxYywgMHhkMSwgMHgwMSwgMHg5OSwgMHg0MywgMHg0YSwgMHgwMCwgMHgyOSwgMHgwNSwgMHhkMCwgMHgwMSwgMHgyOSwgCisweDE2LCAweGQxLCAweDUxLCAweDhiLCAweGM5LCAweDA4LCAweDEzLCAweGQyLCAweDBmLCAweGUwLCAweDUxLCAweDhiLCAKKzB4MDksIDB4MDksIDB4MGYsIDB4ZDIsIDB4MGIsIDB4ZTAsIDB4MGEsIDB4NzksIDB4MDAsIDB4MmEsIDB4MGIsIDB4ZDEsIAorMHg2ZCwgMHgyMywgMHg1YiwgMHgwMSwgMHhjOSwgMHgxOCwgMHg4YSwgMHg4OCwgMHhjOSwgMHg4OCwgMHgxMSwgMHg0MCwgCisweDQ5LCAweDA5LCAweDA5LCAweDA3LCAweDAyLCAweGQxLCAweDA0LCAweDIzLCAweDk4LCAweDQzLCAweGY4LCAweDgzLCAKKzB4ZjgsIDB4OGIsIDB4MDQsIDB4MjEsIDB4MDEsIDB4NDAsIDB4MDIsIDB4OWEsIDB4MWYsIDB4ZDAsIDB4YjksIDB4OGIsIAorMHg0YSwgMHgwYiwgMHgyNywgMHhkMywgMHg4MCwgMHgwOSwgMHgyNSwgMHhkMywgMHhmZiwgMHgyMywgMHgwMSwgMHg5OCwgCisweDAxLCAweDMzLCAweDk4LCAweDQyLCAweDIwLCAweGQwLCAweDAwLCAweDI1LCAweDAwLCAweDk4LCAweDAxLCAweDI4LCAKKzB4MDAsIDB4ZDEsIDB4MDUsIDB4MDIsIDB4MDEsIDB4OTgsIDB4MDAsIDB4MjgsIDB4MDIsIDB4ZDEsIDB4MDEsIDB4MjMsIAorMHg1YiwgMHgwMywgMHgxZCwgMHg0MywgMHhhOSwgMHg0MiwgMHgxMywgMHhkMCwgCisweDAwLCAweDIwLCAweDI5LCAweDFjLCAweGZmLCAweGY3LCAweDEwLCAweGZlLCAweGJkLCAweDgzLCAweDAwLCAweDIwLCAKKzB4YzAsIDB4NDMsIDB4NjAsIDB4NjIsIDB4MGEsIDB4ZTAsIDB4YjgsIDB4OGIsIDB4NDAsIDB4MGIsIDB4MDcsIDB4ZDIsIAorMHgwOSwgMHgyMSwgMHg0OSwgMHgwMiwgMHgwMCwgMHgyMCwgMHhmZiwgMHhmNywgMHgwMywgMHhmZSwgMHgwOSwgMHgyMCwgCisweDQwLCAweDAyLCAweGI4LCAweDgzLCAweGY4LCAweDhiLCAweGMwLCAweDA4LCAweDJkLCAweGQzLCAweDFkLCAweDQ4LCAKKzB4YzcsIDB4NmEsIDB4MDEsIDB4OTgsIDB4MDAsIDB4OTksIDB4ZmYsIDB4ZjcsIDB4NTEsIDB4ZmMsIDB4YzIsIDB4MDcsIAorMHhkMiwgMHgwZiwgMHgxYSwgMHg0OSwgMHgwMywgMHhkMCwgMHgwNCwgMHgyMywgMHhjZCwgMHg2ZCwgMHgyYiwgMHg0MywgCisweDAzLCAweGUwLCAweDA0LCAweDIzLCAweGNkLCAweDZkLCAweDlkLCAweDQzLCAweDJiLCAweDFjLCAweGNiLCAweDY1LCAKKzB4ODMsIDB4MDgsIDB4MDMsIDB4ZDMsIDB4MDIsIDB4MjMsIDB4Y2QsIDB4NmQsIDB4MmIsIDB4NDMsIDB4MDMsIDB4ZTAsIAorMHgwMiwgMHgyMywgMHhjZCwgMHg2ZCwgMHg5ZCwgMHg0MywgMHgyYiwgMHgxYywgMHhjYiwgMHg2NSwgMHg2MSwgMHg2YSwgCisweDgxLCAweDQyLCAweDBjLCAweGQwLCAweDYwLCAweDYyLCAweDBlLCAweDQ4LCAweDAwLCAweDJhLCAweDAzLCAweGQwLCAKKzB4ZmYsIDB4MjEsIDB4MjEsIDB4MzEsIDB4MzksIDB4NDMsIDB4MDMsIDB4ZTAsIDB4ZmYsIDB4MjMsIDB4MjEsIDB4MzMsIAorMHg5ZiwgMHg0MywgMHgzOSwgMHgxYywgMHhjMSwgMHg2MiwgMHgwMywgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDY4LCAweDFjLCAweDAwLCAweDgwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MjgsIDB4MWMsIDB4MDAsIDB4ODAsIDB4NDAsIDB4MDAsIDB4MTQsIDB4NDAsIAorMHhhNCwgMHgyYSwgMHgwMCwgMHg4MCwgMHg0MCwgMHgwMCwgMHgxNCwgMHgwMCwgMHg5MCwgMHhiNCwgMHgwMSwgMHgyMiwgCisweDIwLCAweDI4LCAweDBmLCAweGQyLCAweDQzLCAweDAwLCAweDBmLCAweDFjLCAweDA3LCAweDQ5LCAweDVjLCAweDE4LCAKKzB4MzcsIDB4MjMsIDB4OWIsIDB4MDEsIDB4ZTMsIDB4MTgsIDB4OWYsIDB4ODMsIDB4ODIsIDB4NDAsIDB4MDcsIDB4MjMsIAorMHg1YiwgMHgwMiwgMHhjOSwgMHgxOCwgMHgxMCwgMHgxYywgMHhjYSwgMHg2OSwgMHgxMCwgMHg0MywgMHhjOCwgMHg2MSwgCisweDkwLCAweGJjLCAweDcwLCAweDQ3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDBiLCAweDQ4LCAweDQwLCAweDY5LCAKKzB4MGIsIDB4NDksIDB4YzksIDB4OGIsIDB4MDQsIDB4MjIsIDB4MGEsIDB4NDAsIDB4MGEsIDB4NDksIDB4MDYsIDB4ZDAsIAorMHgwMSwgMHgyMywgMHhkYiwgMHgwMiwgMHg5OCwgMHg0MywgMHgwMSwgMHgyMywgMHhjYSwgMHg2ZCwgMHgxYSwgMHg0MywgCisweDA1LCAweGUwLCAweDAxLCAweDIzLCAweGRiLCAweDAyLCAweDE4LCAweDQzLCAweGNhLCAweDZkLCAweDUyLCAweDA4LCAKKzB4NTIsIDB4MDAsIDB4Y2EsIDB4NjUsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MTQsIDB4NDAsIAorMHhlOCwgMHgxYiwgMHgwMCwgMHg4MCwgMHhhNCwgMHgyYSwgMHgwMCwgMHg4MCwgMHgwMCwgMHhiNSwgMHg4NCwgMHhiMCwgCisweGZmLCAweGY3LCAweGRlLCAweGZmLCAweDAxLCAweDFjLCAweDA1LCAweDIwLCAweDAwLCAweDkwLCAweDAwLCAweDIwLCAKKzB4MDEsIDB4YWIsIDB4MTgsIDB4ODAsIDB4MDQsIDB4M2IsIDB4NTgsIDB4NzAsIDB4MWIsIDB4MjIsIDB4MDAsIDB4YWIsIAorMHg1YSwgMHg4MCwgMHhkOSwgMHg4MCwgMHgwNSwgMHg0OSwgMHhjOSwgMHg2ZCwgMHhjMCwgMHg0NiwgMHgwMiwgMHg5MSwgCisweDAzLCAweDkwLCAweDY4LCAweDQ2LCAweDAwLCAweDIxLCAweGZkLCAweGY3LCAweDc5LCAweGY4LCAweDA0LCAweGIwLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4YTQsIDB4MmEsIDB4MDAsIDB4ODAsIDB4MGYsIDB4NDgsIDB4MDEsIDB4NjgsIAorMHg0OSwgMHgwYywgMHgwNSwgMHhkMiwgMHgwMSwgMHg2OCwgMHgwOSwgMHgwYywgMHgwNiwgMHhkMSwgMHgwMCwgMHg2OCwgCisweDgwLCAweDBhLCAweDAzLCAweGQzLCAweDBiLCAweDQ4LCAweDAwLCAweDY4LCAweDAwLCAweDBjLCAweDAxLCAweGUwLCAKKzB4MGEsIDB4NDgsIDB4ODAsIDB4NmMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIDB4MDksIDB4NGIsIDB4OTgsIDB4NDIsIAorMHgwNSwgMHhkMCwgMHgwMiwgMHgzMywgMHg5OCwgMHg0MiwgMHgwMiwgMHhkMCwgMHgwNywgMHg0YiwgMHg5OCwgMHg0MiwgCisweDAxLCAweGQxLCAweDAxLCAweDIwLCAweDcwLCAweDQ3LCAweDAwLCAweDIwLCAweGZjLCAweGU3LCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MTAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIAorMHgwNCwgMHg5OSwgMHgwMCwgMHgwMCwgMHgwNywgMHg5OSwgMHgwMCwgMHgwMCwgMHg5MCwgMHhiNCwgMHgwMSwgMHgyNCwgCisweDIxLCAweDFjLCAweDE4LCAweDQ4LCAweDAyLCAweDY4LCAweDUyLCAweDBjLCAweDA2LCAweGQyLCAweDAyLCAweDY4LCAKKzB4MTIsIDB4MGMsIDB4MDIsIDB4ZDEsIDB4MDAsIDB4NjgsIDB4ODAsIDB4MGEsIDB4MDAsIDB4ZDIsIDB4MDAsIDB4MjEsIAorMHgwOSwgMHgwNiwgMHgwOSwgMHgwZSwgMHgxMiwgMHg0ZiwgMHgxMywgMHg0YSwgMHgwMiwgMHhkMCwgMHgzOCwgMHg2OCwgCisweDAwLCAweDBjLCAweDAwLCAweGUwLCAweDkwLCAweDZjLCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDEwLCAweDRiLCAKKzB4OTgsIDB4NDIsIDB4MDgsIDB4ZDAsIDB4MDIsIDB4MzMsIDB4OTgsIDB4NDIsIDB4MDUsIDB4ZDAsIDB4MGUsIDB4NGIsIAorMHg5OCwgMHg0MiwgMHgwMiwgMHhkMCwgMHgwMiwgMHgzYiwgMHg5OCwgMHg0MiwgMHgwYywgMHhkMSwgMHgwMCwgMHgyOSwgCisweDAyLCAweGQwLCAweGY4LCAweDZhLCAweDAwLCAweDBjLCAweDAwLCAweGUwLCAKKzB4ZDAsIDB4NmMsIDB4NDAsIDB4MGEsIDB4MDAsIDB4ZDIsIDB4MDAsIDB4MjQsIDB4MjAsIDB4MDYsIDB4MDAsIDB4MGUsIAorMHg5MCwgMHhiYywgMHg3MCwgMHg0NywgMHgwMCwgMHgyMCwgMHhmYiwgMHhlNywgMHgwMCwgMHgwMCwgMHgxMCwgMHg0MCwgCisweDAwLCAweDAwLCAweDE4LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDA0LCAweDk5LCAweDAwLCAweDAwLCAKKzB4MDcsIDB4OTksIDB4MDAsIDB4MDAsIDB4MGMsIDB4NDgsIDB4MDEsIDB4NjgsIDB4NDksIDB4MGMsIDB4MDUsIDB4ZDIsIAorMHgwMSwgMHg2OCwgMHgwOSwgMHgwYywgMHgwNSwgMHhkMSwgMHgwMCwgMHg2OCwgMHg4MCwgMHgwYSwgMHgwMiwgMHhkMywgCisweDA4LCAweDQ4LCAweDgwLCAweDY4LCAweDAxLCAweGUwLCAweDA4LCAweDQ4LCAweDQwLCAweDZjLCAweDAwLCAweDA0LCAKKzB4MDAsIDB4MGMsIDB4MDAsIDB4MjEsIDB4MDMsIDB4MjgsIDB4MDMsIDB4ZDAsIDB4NDAsIDB4MDgsIDB4MDEsIDB4ZDMsIAorMHgwMSwgMHgyMCwgMHg3MCwgMHg0NywgMHgwOCwgMHgxYywgMHhmYywgMHhlNywgMHgwMCwgMHgwMCwgMHgxMCwgMHg0MCwgCisweDAwLCAweDAwLCAweDE4LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweGYwLCAweGI1LCAweDAxLCAweDI3LCAKKzB4MWEsIDB4NGMsIDB4MjUsIDB4NjgsIDB4ZmYsIDB4ZjcsIDB4NzIsIDB4ZmYsIDB4MDMsIDB4MWMsIDB4MTksIDB4NGEsIAorMHgwMiwgMHgyMSwgMHgwMSwgMHgyNiwgMHgxOCwgMHg0OCwgMHgwMSwgMHgyYiwgMHgxYiwgMHhkMSwgMHhjYiwgMHgwNCwgCisweDFlLCAweDYwLCAweDU1LCAweDIzLCAweDAzLCAweDYwLCAweDAwLCAweDIzLCAweDQzLCAweDYwLCAweDA2LCAweDY4LCAKKzB4NTUsIDB4MmUsIDB4MWIsIDB4ZDEsIDB4YWEsIDB4MjYsIDB4MDYsIDB4NjAsIDB4NDMsIDB4NjAsIDB4MDMsIDB4NjgsIAorMHhhYSwgMHgyYiwgMHgxNSwgMHhkMSwgMHgwOSwgMHgyMywgMHgwMywgMHg2MCwgMHgwNSwgMHgyMywgMHgwZiwgMHg0ZiwgCisweGMwLCAweDQ2LCAweDNiLCAweDYwLCAweDAzLCAweDIzLCAweDBlLCAweDRmLCAweGMwLCAweDQ2LCAweDNiLCAweDYwLCAKKzB4MTEsIDB4NjAsIDB4MDcsIDB4NjgsIDB4MDgsIDB4ZTAsIDB4MDgsIDB4MjMsIDB4MjMsIDB4NjAsIDB4MDQsIDB4MjMsIAorMHgwYSwgMHg0ZiwgMHhjMCwgMHg0NiwgMHgzYiwgMHg2MCwgMHgxMSwgMHg2MCwgMHgwNiwgMHg2MCwgMHgyNywgMHg2OCwgCisweGMwLCAweDQ2LCAweDI1LCAweDYwLCAweDM4LCAweDFjLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4MDAsIDB4MDAsIDB4MjAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MjQsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MjIsIDB4NDAsIAorMHgwMCwgMHgwMCwgMHgyYSwgMHg0MCwgMHgwMCwgMHgwMCwgMHgyNiwgMHg0MCwgMHgwMCwgMHgwMCwgMHgyOCwgMHg0MCwgCisweDgwLCAweGI1LCAweDA3LCAweDFjLCAweGZmLCAweGY3LCAweDMwLCAweGZmLCAweDAxLCAweDI4LCAweDA1LCAweGQxLCAKKzB4MTksIDB4NDgsIDB4MDAsIDB4NjgsIDB4MTksIDB4NDksIDB4NDksIDB4NmIsIDB4MDgsIDB4NDAsIDB4MjIsIDB4ZTAsIAorMHgxOCwgMHg0OCwgMHgwMSwgMHg2OCwgMHg0OSwgMHgwYywgMHgwNSwgMHhkMiwgMHgwMSwgMHg2OCwgMHgwOSwgMHgwYywgCisweDA2LCAweGQxLCAweDAwLCAweDY4LCAweDgwLCAweDBhLCAweDAzLCAweGQzLCAweDE0LCAweDQ4LCAweDAwLCAweDY4LCAKKzB4MDAsIDB4MGMsIDB4MDEsIDB4ZTAsIDB4MTMsIDB4NDgsIDB4ODAsIDB4NmMsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MGMsIAorMHgxMiwgMHg0YiwgMHhjMCwgMHgxOCwgMHgwOCwgMHgyOCwgMHgwYiwgMHhkMiwgMHgwMSwgMHhhMywgMHgxYiwgMHg1YywgCisweDViLCAweDAwLCAweDlmLCAweDQ0LCAweDA1LCAweDAzLCAweDA3LCAweDAzLCAweDA3LCAweDA3LCAweDA1LCAweDAzLCAKKzB4MDMsIDB4MjAsIDB4MDIsIDB4ZTAsIDB4MDEsIDB4MjAsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4MjAsIDB4MDEsIDB4MjEsIAorMHgzOCwgMHg2MCwgMHg4MCwgMHgwNywgMHgwMCwgMHhkMSwgMHgwMCwgMHgyMSwgMHgwOCwgMHgwNiwgMHgwMCwgMHgwZSwgCisweDgwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDM0LCAweDZlLCAweDIxLCAweDQwLCAKKzB4MDAsIDB4MDAsIDB4MTEsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4NDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHhmZSwgMHg2NiwgMHhmZiwgMHhmZiwgMHhmMCwgMHhiNSwgMHg4MiwgMHhiMCwgCisweDA3LCAweDFjLCAweDAxLCAweDIwLCAweDAxLCAweDkwLCAweGZmLCAweGY3LCAweGU3LCAweGZlLCAweDAxLCAweDI4LCAKKzB4MTMsIDB4ZDEsIDB4MzgsIDB4MmYsIDB4MDEsIDB4ZDAsIDB4YTgsIDB4MmYsIDB4MDcsIDB4ZDEsIDB4MDAsIDB4MjYsIAorMHhmNiwgMHg0MywgMHgzNCwgMHgxYywgMHhhOCwgMHgyZiwgMHgwMiwgMHhkMSwgMHgzMCwgMHgxYywgMHgwMCwgMHg5NiwgCisweDM1LCAweDFjLCAweDExLCAweDIwLCAweDAwLCAweDA0LCAweDA2LCAweDYyLCAweDQ0LCAweDYyLCAweDg1LCAweDYyLCAKKzB4MDAsIDB4OTksIDB4YzAsIDB4NDYsIDB4YzEsIDB4NjIsIDB4MDAsIDB4MjEsIDB4MDgsIDB4NDgsIDB4YzAsIDB4NDYsIAorMHgwMSwgMHg2MCwgMHgzOCwgMHgyZiwgMHgwMSwgMHhkMCwgMHhhOCwgMHgyZiwgMHgwNSwgMHhkMSwgMHgwMSwgMHgyMSwgCisweDAxLCAweDYwLCAweGE4LCAweDJmLCAweDAxLCAweGQxLCAweDAzLCAweDIxLCAweDAxLCAweDYwLCAweDAxLCAweDk4LCAKKzB4MDIsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MzQsIDB4NmUsIDB4MjEsIDB4NDAsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHg5MCwgMHhiNSwgMHgwNywgMHgxYywgCisweDEyLCAweDRjLCAweDIxLCAweDY4LCAweDEyLCAweDQ4LCAweDgxLCAweDQyLCAweDBiLCAweGQwLCAweDAwLCAweDIzLCAKKzB4MjEsIDB4MWMsIDB4ZTIsIDB4MWQsIDB4YzEsIDB4MzIsIDB4MDAsIDB4ZTAsIAorMHgwOCwgMHhjMSwgMHg5MSwgMHg0MiwgMHhmYywgMHhkMywgMHgyMCwgMHg2MCwgMHhjOCwgMHgyMCwgMHhhMCwgMHg4MCwgCisweDY3LCAweDcyLCAweDM4LCAweDAxLCAweDAwLCAweGYwLCAweDE4LCAweGY4LCAweDI3LCAweDcyLCAweDBhLCAweDQ4LCAKKzB4YzAsIDB4NDYsIDB4ZTAsIDB4NjAsIDB4MDksIDB4MmYsIDB4MDAsIDB4ZGIsIDB4MDAsIDB4MjcsIDB4ZTAsIDB4MTksIAorMHgwMSwgMHg3ZCwgMHgwMSwgMHgzMSwgMHgwMSwgMHg3NSwgMHhlMCwgMHg4OCwgMHgwMSwgMHgzMCwgMHhlMCwgMHg4MCwgCisweDAxLCAweDIwLCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAKKzB4ZWUsIDB4ZmYsIDB4YzAsIDB4ZDAsIDB4MDgsIDB4MTAsIDB4MDAsIDB4MDMsIDB4ODAsIDB4YjQsIDB4MDgsIDB4NGEsIAorMHhkMSwgMHgxZCwgMHg4OSwgMHgzMSwgMHgwYiwgMHg3YSwgMHgyMCwgMHgyYiwgMHgwMSwgMHhkMywgMHgwMCwgMHgyMywgCisweDBiLCAweDcyLCAweDA3LCAweDFjLCAweDA4LCAweDdhLCAweDQzLCAweDFjLCAweDBiLCAweDcyLCAweDgwLCAweDE4LCAKKzB4OTAsIDB4MzAsIDB4NDcsIDB4NzIsIDB4ODAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIAorMHgwNywgMHg0OSwgMHgwMSwgMHgyMiwgMHgxMiwgMHgwNCwgMHgwOCwgMHg2OCwgMHgwMiwgMHg0MCwgMHgwMSwgMHgyMCwgCisweDAwLCAweDJhLCAweDA2LCAweGQxLCAweDBhLCAweDY4LCAweDEyLCAweDBjLCAweDAyLCAweGQxLCAweDA5LCAweDY4LCAKKzB4ODksIDB4MGEsIDB4MDAsIDB4ZDIsIDB4MDAsIDB4MjAsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MTAsIDB4NDAsIAorMHg5MCwgMHhiNSwgMHgwNywgMHgxYywgMHgwOSwgMHg0YywgMHgzOCwgMHgxYywgMHgyMSwgMHgxYywgMHhmYywgMHhmNywgCisweDkxLCAweGZmLCAweDM4LCAweDFjLCAweDAwLCAweGYwLCAweDBlLCAweGY4LCAweDAxLCAweDIzLCAweGQ4LCAweDQyLCAKKzB4MDEsIDB4ZDEsIDB4MDAsIDB4MGMsIDB4ZTAsIDB4ODAsIDB4MDAsIDB4MjEsIDB4MjAsIDB4MWMsIDB4ZmMsIDB4ZjcsIAorMHhjNSwgMHhmZSwgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHhjNCwgMHg2NiwgMHgyMSwgMHg0MCwgCisweGY4LCAweGI1LCAweDA3LCAweDFjLCAweDc5LCAweDdhLCAweDc2LCAweDQ4LCAweDAwLCAweDIzLCAweDc2LCAweDRjLCAKKzB4MDEsIDB4MjksIDB4NWQsIDB4ZDEsIDB4YTIsIDB4ODgsIDB4YzAsIDB4NDYsIDB4MDAsIDB4OTIsIDB4YTEsIDB4ODksIAorMHg4YSwgMHg0MiwgMHg3NCwgMHhkYSwgMHhmYSwgMHg3YSwgMHgwMCwgMHgyYSwgMHgxNSwgMHhkMCwgMHg3YSwgMHg2YywgCisweDAwLCAweDJhLCAweDEyLCAweGQwLCAweDhhLCAweDQyLCAweDEwLCAweGQ4LCAweDAwLCAweDlhLCAweDUxLCAweDFjLCAKKzB4YTEsIDB4ODAsIDB4YTEsIDB4ODgsIDB4YzAsIDB4NDYsIDB4NDEsIDB4ODEsIDB4NzgsIDB4NmMsIDB4NmIsIDB4NGUsIAorMHhjMCwgMHg0NiwgMHhmMCwgMHg4MCwgMHhhMCwgMHg2YSwgMHg1OCwgMHgyMywgMHg3OSwgMHg2YywgMHg1OSwgMHg0MywgCisweDQwLCAweDE4LCAweGMxLCAweDFhLCAweDI4LCAweGUwLCAweDIyLCAweDg4LCAweDAxLCAweDMyLCAweDEyLCAweDA0LCAKKzB4MTIsIDB4MGMsIDB4MjIsIDB4ODAsIDB4OGEsIDB4NDIsIDB4MDAsIDB4ZGIsIDB4MjMsIDB4ODAsIDB4MDAsIDB4MjIsIAorMHgwMCwgMHgyOSwgMHg2OSwgMHhkZCwgMHg1ZiwgMHg0YywgMHhhNCwgMHg2YSwgMHg1ZSwgMHg0YiwgMHgxZCwgMHg4OCwgCisweDU4LCAweDIzLCAweDZiLCAweDQzLCAweGUzLCAweDE4LCAweGRlLCAweDFkLCAweDAxLCAweDM2LCAweDAxLCAweDIzLCAKKzB4OWIsIDB4MDcsIDB4MzMsIDB4NDMsIDB4MWIsIDB4NjgsIDB4MWIsIDB4MDYsIDB4MTUsIDB4ZDEsIDB4NTgsIDB4NDksIAorMHgwMCwgMHg5YSwgMHgwMSwgMHgzMiwgMHg4YSwgMHg4MCwgMHg4YSwgMHg4OCwgMHhjMCwgMHg0NiwgMHg0MiwgMHg4MSwgCisweDA4LCAweDg4LCAweDAxLCAweDMwLCAweDU0LCAweDRlLCAweGMwLCAweDQ2LCAweGYwLCAweDgwLCAweDU4LCAweDIwLCAKKzB4NjgsIDB4NDMsIDB4MjEsIDB4MTgsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4MzksIDB4ZmIsIDB4ZjAsIDB4ODgsIAorMHgwMCwgMHgwNCwgMHgwMCwgMHgxNCwgMHg5NSwgMHhlMCwgMHg0ZCwgMHg0YiwgMHgwMSwgMHgzNSwgMHgyZCwgMHgwNCwgCisweDJkLCAweDBjLCAweDFkLCAweDgwLCAweDhkLCAweDQyLCAweDAxLCAweGRiLCAweDAwLCAweDI1LCAweDFkLCAweDgwLCAKKzB4MDEsIDB4MzIsIDB4MTIsIDB4MDQsIDB4MTIsIDB4MTQsIDB4OTEsIDB4NDIsIDB4Y2UsIDB4ZGMsIDB4ODEsIDB4ZTAsIAorMHhlMSwgMHg4OCwgMHhlMiwgMHg4OSwgMHg5MSwgMHg0MiwgMHgxOCwgMHhkYSwgMHhmOSwgMHg3YSwgMHgwMCwgMHgyOSwgCisweDJmLCAweGQwLCAweDc5LCAweDZjLCAweDQ5LCAweDA0LCAweDQ5LCAweDBjLCAweDc5LCAweDY0LCAweDJhLCAweGQwLCAKKzB4ZTIsIDB4ODksIDB4OTEsIDB4NDIsIDB4MjcsIDB4ZDgsIDB4ZTEsIDB4ODgsIDB4MDEsIDB4MzEsIDB4ZTEsIDB4ODAsIAorMHhlMSwgMHg4OCwgMHhjMCwgMHg0NiwgMHg4MSwgMHg4MSwgMHgwMSwgMHgyMywgMHhkYiwgMHgwMywgMHg3OCwgMHg2YywgCisweDE4LCAweDQzLCAweDNhLCAweDRlLCAweGMwLCAweDQ2LCAweGYwLCAweDgwLCAweDAwLCAweGUwLCAweDYzLCAweGUwLCAKKzB4ZTAsIDB4NmEsIDB4NzksIDB4NmMsIDB4NGIsIDB4MDAsIDB4NTksIDB4MTgsIDB4NDksIDB4MDEsIDB4NDAsIDB4MTgsIAorMHhjMSwgMHgxZiwgMHg1OSwgMHgzOSwgMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHgwZiwgMHhmYiwgMHhlMCwgMHg2YSwgCisweDc5LCAweDZjLCAweDRhLCAweDAwLCAweDUyLCAweDE4LCAweDUyLCAweDAxLCAweDgwLCAweDE4LCAweDAxLCAweDM5LCAKKzB4MDksIDB4MDQsIDB4MDksIDB4MGMsIDB4NjAsIDB4MzgsIDB4MDAsIDB4ZjAsIDB4ODksIDB4ZmIsIDB4YjYsIDB4ZTcsIAorMHg0YSwgMHhlMCwgMHg2MSwgMHg4OCwgMHgwMSwgMHgzMSwgMHgwOSwgMHgwNCwgCisweDA5LCAweDBjLCAweDYxLCAweDgwLCAweGUyLCAweDg5LCAweDkxLCAweDQyLCAweDAwLCAweGRiLCAweDYzLCAweDgwLCAKKzB4MDAsIDB4MjEsIDB4MDAsIDB4MmEsIDB4M2UsIDB4ZGQsIDB4MjQsIDB4NGMsIDB4ZTQsIDB4NmEsIDB4MjMsIDB4NGIsIAorMHg1ZCwgMHg4OCwgMHg2YiwgMHgwMCwgMHg1YiwgMHgxOSwgMHg1YiwgMHgwMSwgMHhlMywgMHgxOCwgMHhkZSwgMHgxZCwgCisweDAxLCAweDM2LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDMzLCAweDQzLCAweDFiLCAweDY4LCAweDFiLCAweDA2LCAKKzB4MjAsIDB4ZDEsIDB4MWMsIDB4NGUsIDB4ZjEsIDB4ODgsIDB4MDEsIDB4MzEsIDB4ZjEsIDB4ODAsIDB4ZjEsIDB4ODgsIAorMHhjMCwgMHg0NiwgMHg4MSwgMHg4MSwgMHg3MCwgMHg4OCwgMHgwMSwgMHgyMywgMHhkYiwgMHgwMywgMHgwMSwgMHgzMCwgCisweDE4LCAweDQzLCAweDE3LCAweDQ5LCAweGMwLCAweDQ2LCAweGM4LCAweDgwLCAweDY4LCAweDAwLCAweDQwLCAweDE5LCAKKzB4NDAsIDB4MDEsIDB4MjEsIDB4MTgsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4Y2YsIDB4ZmEsIDB4NzEsIDB4ODgsIAorMHg0YSwgMHgwMCwgMHg1MiwgMHgxOCwgMHg1MiwgMHgwMSwgMHhmMCwgMHg2YSwgMHg4MCwgMHgxOCwgMHgwMCwgMHhmMCwgCisweDRkLCAweGZiLCAweDBlLCAweDQ5LCAweGM4LCAweDg4LCAweDc5LCAweGU3LCAweDBiLCAweDRiLCAweDAxLCAweDM1LCAKKzB4MmQsIDB4MDQsIDB4MmQsIDB4MGMsIDB4NWQsIDB4ODAsIDB4OTUsIDB4NDIsIDB4MDEsIDB4ZGIsIDB4MDAsIDB4MjUsIAorMHg1ZCwgMHg4MCwgMHgwMSwgMHgzMSwgMHgwOSwgMHgwNCwgMHgwOSwgMHgxNCwgMHg4YSwgMHg0MiwgMHhjMiwgMHhkYywgCisweDAxLCAweDg5LCAweDAxLCAweDMxLCAweDAxLCAweDgxLCAweDAwLCAweDIwLCAweGMwLCAweDQzLCAweGY4LCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NGMsIDB4MmIsIDB4MDAsIDB4ODAsIDB4NGMsIDB4MmEsIDB4MDAsIDB4ODAsIAorMHhjNCwgMHg2NiwgMHgyMSwgMHg0MCwgMHhmMCwgMHhiNCwgMHgwNiwgMHgxYywgMHgwMSwgMHgyMywgMHhkYiwgMHgwMywgCisweDMzLCAweDQwLCAweDAxLCAweDI0LCAweDQ0LCAweDRmLCAweDAwLCAweDIwLCAweDQ0LCAweDRhLCAweDQ1LCAweDRkLCAKKzB4ZDEsIDB4MWQsIDB4MzksIDB4MzEsIDB4MDAsIDB4MmIsIDB4NDEsIDB4ZDAsIDB4ZTMsIDB4MDMsIDB4ZjMsIDB4MWEsIAorMHg3MywgMHhkMCwgMHhlZSwgMHg4OSwgMHg5ZSwgMHg0MiwgMHg3MSwgMHhkMywgMHhlZSwgMHg4OCwgMHgwMCwgMHgyZSwgCisweDZkLCAweGQwLCAweGVkLCAweDZhLCAweDVlLCAweDFlLCAweDczLCAweDAwLCAweDliLCAweDE5LCAweDViLCAweDAxLCAKKzB4ZWQsIDB4MTgsIDB4YWUsIDB4NjgsIDB4MzYsIDB4MDYsIDB4MzYsIDB4MGUsIDB4MDMsIDB4MmUsIDB4MDIsIDB4ZDAsIAorMHhjZSwgMHg4OSwgMHgwMSwgMHgzNiwgMHhjZSwgMHg4MSwgMHg0MCwgMHgzNSwgMHhhZCwgMHg4YiwgMHhhZCwgMHgwMCwgCisweDM1LCAweDRlLCAweDc2LCAweDZhLCAweGMwLCAweDQ2LCAweDcwLCAweDUxLCAweDU1LCAweDg5LCAweDAxLCAweDM1LCAKKzB4NTUsIDB4ODEsIDB4MzIsIDB4NGUsIDB4ZjIsIDB4NmEsIDB4ZDIsIDB4MTgsIDB4OTAsIDB4NjAsIDB4ZjIsIDB4NmEsIAorMHhkMiwgMHgxOCwgMHg5MCwgMHg2MywgMHhmMiwgMHg2YSwgMHhkMiwgMHgxOCwgMHhkMCwgMHg2MywgMHhmMiwgMHg2YSwgCisweGQyLCAweDE4LCAweDEwLCAweDY0LCAweGYyLCAweDZhLCAweGQyLCAweDE4LCAweDUwLCAweDY0LCAweGYyLCAweDZhLCAKKzB4ZDIsIDB4MTgsIDB4OTAsIDB4NjQsIDB4ZjIsIDB4NmEsIDB4ZDIsIDB4MTgsIDB4ZDAsIDB4NjQsIDB4ZjAsIDB4ODgsIAorMHgwMSwgMHgzOCwgMHhmMCwgMHg4MCwgMHhmMCwgMHg4OCwgMHhjMCwgMHg0NiwgMHg4OCwgMHg4MSwgMHgyNCwgMHg0OSwgCisweDAwLCAweDI4LCAweDM5LCAweGQxLCAweDRmLCAweDgwLCAweDM3LCAweGUwLCAweDAwLCAweDJlLCAweDM4LCAweGQ5LCAKKzB4YWIsIDB4ODksIDB4YjMsIDB4NDIsIDB4MzAsIDB4ZDMsIDB4YWIsIDB4ODgsIDB4MDAsIDB4MmIsIDB4MmMsIDB4ZDAsIAorMHg1MywgMHg4OSwgMHgwMSwgMHgzMywgMHg1MywgMHg4MSwgMHgyYSwgMHgxYywgMHhhZCwgMHg2YSwgMHg1OCwgMHgyMywgCisweDAxLCAweDNlLCAweDczLCAweDQzLCAweGVkLCAweDE4LCAweGFlLCAweDY4LCAweDM2LCAweDA2LCAweDM2LCAweDBlLCAKKzB4MDMsIDB4MmUsIDB4MDIsIDB4ZDAsIDB4Y2UsIDB4ODksIDB4MDEsIDB4MzYsIDB4Y2UsIDB4ODEsIDB4YTgsIDB4NjAsIAorMHg5NSwgMHg2YSwgMHhlZCwgMHgxOCwgMHhhOCwgMHg2MywgMHg5NSwgMHg2YSwgMHhlZCwgMHgxOCwgMHhlOCwgMHg2MywgCisweDk1LCAweDZhLCAweGVkLCAweDE4LCAweDI4LCAweDY0LCAweDk1LCAweDZhLCAweGVkLCAweDE4LCAweDY4LCAweDY0LCAKKzB4OTUsIDB4NmEsIDB4ZWQsIDB4MTgsIDB4YTgsIDB4NjQsIDB4OTUsIDB4NmEsIDB4ZWIsIDB4MTgsIDB4ZDgsIDB4NjQsIAorMHg5MCwgMHg4OCwgMHgwMSwgMHgzOCwgMHg5MCwgMHg4MCwgMHg5MCwgMHg4OCwgMHhjMCwgMHg0NiwgMHg0OCwgMHg4MSwgCisweDAwLCAweDI4LCAweDAzLCAweGQxLCAweDAxLCAweGUwLCAweDA0LCAweGUwLCAweDAzLCAweGUwLCAweDE3LCAweDgwLCAKKzB4MjAsIDB4MWMsIDB4ZjAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4Y2EsIDB4ODksIDB4MDEsIDB4MzIsIDB4Y2EsIDB4ODEsIAorMHhmOSwgMHhlNywgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgCisweDRjLCAweDJhLCAweDAwLCAweDgwLCAweDAwLCAweGI1LCAweDAwLCAweDIxLCAweDQxLCAweDYwLCAweDEwLCAweDQ5LCAKKzB4NGEsIDB4NjgsIDB4MDAsIDB4MmEsIDB4MTAsIDB4ZDEsIDB4Y2EsIDB4NjgsIDB4MDAsIDB4MmEsIDB4MDQsIDB4ZDAsIAorMHhjYSwgMHgxZCwgMHgxOSwgMHgzMiwgMHgxMiwgMHg3OSwgMHgwMCwgMHgyYSwgMHgwOCwgMHhkMCwgMHg0YSwgMHg2OSwgCisweDAwLCAweDJhLCAweDBiLCAweGQxLCAweDg4LCAweDYxLCAweDQ4LCAweDYxLCAKKzB4MDAsIDB4ZjAsIDB4MTAsIDB4ZjgsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NGEsIDB4NjksIDB4MDAsIDB4MmEsIAorMHgwMiwgMHhkMSwgMHg4OCwgMHg2MSwgMHg0OCwgMHg2MSwgMHhmNywgMHhlNywgMHg4YSwgMHg2OSwgMHhjMCwgMHg0NiwgCisweDUwLCAweDYwLCAweDg4LCAweDYxLCAweGYyLCAweGU3LCAweDAwLCAweDAwLCAweDZjLCAweDA2LCAweDAwLCAweDgwLCAKKzB4YjAsIDB4YjUsIDB4MmEsIDB4NDgsIDB4NDAsIDB4NjksIDB4MDAsIDB4MjgsIDB4NGMsIDB4ZDAsIDB4MDgsIDB4MjIsIAorMHhjMSwgMHg2OCwgMHgwYSwgMHg0MCwgMHgwMCwgMHgyNywgMHgyNywgMHg0YiwgMHhkOSwgMHgxZCwgMHhiOSwgMHgzMSwgCisweDAwLCAweDJhLCAweDExLCAweGQwLCAweDA0LCAweDIyLCAweDI1LCAweDRjLCAweGMwLCAweDQ2LCAweDBjLCAweDYxLCAKKzB4MjQsIDB4NGMsIDB4YzAsIDB4NDYsIDB4NGMsIDB4NjIsIDB4MjQsIDB4NGMsIDB4YzAsIDB4NDYsIDB4OGMsIDB4NjIsIAorMHgyMywgMHg0YywgMHhjMCwgMHg0NiwgMHhjYywgMHg2MiwgMHgyMywgMHg0YywgMHhjMCwgMHg0NiwgMHgwYywgMHg2MywgCisweDRmLCAweDYzLCAweDEyLCAweGUwLCAweDA1LCAweDIyLCAweDIxLCAweDRjLCAweGMwLCAweDQ2LCAweDBjLCAweDYxLCAKKzB4MjAsIDB4NGMsIDB4YzAsIDB4NDYsIDB4NGMsIDB4NjIsIDB4MjAsIDB4NGMsIDB4YzAsIDB4NDYsIDB4OGMsIDB4NjIsIAorMHgxZiwgMHg0YywgMHhjMCwgMHg0NiwgMHhjYywgMHg2MiwgMHgxZiwgMHg0YywgMHhjMCwgMHg0NiwgMHgwYywgMHg2MywgCisweDFlLCAweDRjLCAweGMwLCAweDQ2LCAweDRjLCAweDYzLCAweDQwLCAweDI0LCAweGNjLCAweDgyLCAweDRmLCAweDgzLCAKKzB4MWMsIDB4NGYsIDB4MDAsIDB4MjEsIDB4MDAsIDB4MmEsIDB4MGMsIDB4ZDksIDB4OGMsIDB4MDAsIDB4MDUsIDB4MTksIAorMHg2ZCwgMHg2YSwgMHg3ZCwgMHg0MCwgMHhlNCwgMHgxOCwgMHhmZiwgMHgzNCwgMHgwMSwgMHgzNCwgMHg2NSwgMHg2MiwgCisweDAxLCAweDMxLCAweDkxLCAweDQyLCAweGY0LCAweGQzLCAweDEwLCAweDI5LCAweDA3LCAweGQyLCAweDhhLCAweDAwLCAKKzB4ZDIsIDB4MTgsIDB4ZmYsIDB4MzIsIDB4MDEsIDB4MzIsIDB4NTcsIDB4NjIsIDB4MDEsIDB4MzEsIDB4MTAsIDB4MjksIAorMHhmNywgMHhkMywgMHgxMSwgMHg0OSwgMHgwMCwgMHhmMCwgMHgyMiwgMHhmOCwgMHhiMCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDZjLCAweDA2LCAweDAwLCAweDgwLCAweGFjLCAweGFiLCAweDIwLCAweDQwLCAKKzB4MjgsIDB4MDEsIDB4NDAsIDB4MDAsIDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsIAorMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCwgMHgyMCwgMHgwMSwgMHg0MCwgMHgwMCwgCisweDY3LCAweDQ1LCAweDIzLCAweDAxLCAweGVmLCAweGNkLCAweGFiLCAweDg5LCAweDk4LCAweGJhLCAweGRjLCAweGZlLCAKKzB4MTAsIDB4MzIsIDB4NTQsIDB4NzYsIDB4YzMsIDB4ZDIsIDB4ZTEsIDB4ZjAsIDB4MzYsIDB4MzYsIDB4MzYsIDB4MzYsIAorMHgzMCwgMHg4MCwgMHgyMCwgMHg0MCwgMHhiMCwgMHhiNSwgMHgwZiwgMHgxYywgMHgxNSwgMHg0ZCwgMHhlOSwgMHgxZCwgCisweGM5LCAweDMxLCAweDE1LCAweDRjLCAweDIzLCAweDFjLCAweDE1LCAweDRhLCAweDAwLCAweDIwLCAweGZjLCAweGY3LCAKKzB4NDQsIDB4ZmIsIDB4ZTksIDB4MWQsIDB4ZmYsIDB4MzEsIDB4MWUsIDB4MzEsIDB4MjMsIDB4MWMsIDB4MGQsIDB4MWMsIAorMHgxMSwgMHg0YSwgMHgwMSwgMHgyMCwgMHhmYywgMHhmNywgMHgzYiwgMHhmYiwgMHgyOSwgMHgxYywgMHgyMywgMHgxYywgCisweDBlLCAweDRhLCAweDAwLCAweDIwLCAweGZjLCAweGY3LCAweDM1LCAweGZiLCAweDM5LCAweDFjLCAweDIzLCAweDFjLCAKKzB4MGMsIDB4NGEsIDB4MDEsIDB4MjAsIDB4ZmMsIDB4ZjcsIDB4MmYsIDB4ZmIsIDB4MDAsIDB4MjEsIDB4MGIsIDB4NDgsIAorMHhjMiwgMHgxZCwgMHgxOSwgMHgzMiwgMHg1MSwgMHg3MSwgMHgwMSwgMHgyMSwgMHhmZiwgMHgzMCwgMHgwMSwgMHgzMCwgCisweDQxLCAweDYyLCAweDA4LCAweDFjLCAweGIwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAKKzB4YWMsIDB4YWIsIDB4MjAsIDB4NDAsIDB4NzUsIDB4MDgsIDB4ZmYsIDB4ZmYsIDB4MjgsIDB4MDAsIDB4MDMsIDB4MDAsIAorMHg0MCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwNywgMHgwMCwgMHg2YywgMHgwNiwgMHgwMCwgMHg4MCwgCisweGYwLCAweGI1LCAweDM3LCAweDRhLCAweDUwLCAweDY5LCAweDAxLCAweDIzLCAweDliLCAweDA3LCAweDA4LCAweDMwLCAKKzB4MTgsIDB4NDMsIDB4MDAsIDB4NjgsIDB4MDEsIDB4MDYsIDB4MDksIDB4MGUsIDB4MzMsIDB4NGIsIDB4MDEsIDB4MjksIAorMHg0OSwgMHhkMSwgMHgxZiwgMHg2OCwgMHgxOSwgMHgxYywgMHgzMiwgMHg0YiwgMHg5ZiwgMHg0MiwgMHgwNCwgMHhkMSwgCisweGZmLCAweGY3LCAweDNlLCAweGZmLCAweGYwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDIzLCAKKzB4OWYsIDB4MDAsIDB4Y2MsIDB4NTksIDB4NTUsIDB4NjksIDB4ZWYsIDB4MTksIDB4M2MsIDB4NjEsIDB4MDEsIDB4MzMsIAorMHgwNSwgMHgyYiwgMHhmNywgMHhkMywgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMiwgMHgwMiwgMHgyMywgMHgxOCwgMHg0MywgCisweDUzLCAweDY5LCAweGMwLCAweDQ2LCAweDk4LCAweDYwLCAweDUwLCAweDY5LCAweDA4LCAweDIzLCAweGMyLCAweDY4LCAKKzB4MTMsIDB4NDAsIDB4MjUsIDB4NGYsIDB4ZmEsIDB4MWQsIDB4YjksIDB4MzIsIDB4MDAsIDB4MmIsIDB4MDIsIDB4ZDAsIAorMHgwNCwgMHgyMywgMHgyMywgMHg0YywgMHgwMSwgMHhlMCwgMHgwNSwgMHgyMywgMHgyMiwgMHg0YywgMHhjMCwgMHg0NiwgCisweDE0LCAweDYxLCAweDQwLCAweDI0LCAweGQ0LCAweDgyLCAweDAwLCAweDI0LCAweDU0LCAweDgzLCAweDIwLCAweDRjLCAKKzB4MDAsIDB4MjIsIDB4MDAsIDB4MmIsIDB4MGMsIDB4ZDksIDB4OTUsIDB4MDAsIAorMHg0NiwgMHgxOSwgMHg3NiwgMHg2YSwgMHg2NiwgMHg0MCwgMHhlZCwgMHgxOSwgMHhmZiwgMHgzNSwgMHgwMSwgMHgzNSwgCisweDZlLCAweDYyLCAweDAxLCAweDMyLCAweDlhLCAweDQyLCAweGY0LCAweGQzLCAweDEwLCAweDJhLCAweDA3LCAweGQyLCAKKzB4OTMsIDB4MDAsIDB4ZGIsIDB4MTksIDB4ZmYsIDB4MzMsIDB4MDEsIDB4MzMsIDB4NWMsIDB4NjIsIDB4MDEsIDB4MzIsIAorMHgxMCwgMHgyYSwgMHhmNywgMHhkMywgMHhmZiwgMHhmNywgMHg3MCwgMHhmZiwgMHhiYywgMHhlNywgMHgwMCwgMHgyMSwgCisweDhmLCAweDAwLCAweGRjLCAweDU5LCAweDU1LCAweDY5LCAweGVmLCAweDE5LCAweDdjLCAweDYyLCAweDAxLCAweDMxLCAKKzB4MDUsIDB4MjksIDB4ZjcsIDB4ZDMsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDIsIDB4MDMsIDB4MjMsIDB4MTgsIDB4NDMsIAorMHg1MSwgMHg2OSwgMHhjMCwgMHg0NiwgMHg4OCwgMHg2MCwgMHg1MCwgMHg2OSwgMHg0MCwgMHg2OCwgMHhjMCwgMHg0NiwgCisweDUwLCAweDYxLCAweDA5LCAweDQ4LCAweGZjLCAweGY3LCAweGE0LCAweGZhLCAweGE0LCAweGU3LCAweDAwLCAweDAwLCAKKzB4NmMsIDB4MDYsIDB4MDAsIDB4ODAsIDB4MzAsIDB4ODAsIDB4MjAsIDB4NDAsIDB4NjcsIDB4NDUsIDB4MjMsIDB4MDEsIAorMHhhYywgMHhhYiwgMHgyMCwgMHg0MCwgMHgyOCwgMHgwMSwgMHg0MCwgMHgwMCwgMHgyMCwgMHgwMSwgMHg0MCwgMHgwMCwgCisweDVjLCAweDVjLCAweDVjLCAweDVjLCAweDExLCAweDMxLCAweGZmLCAweGZmLCAweGYwLCAweGI1LCAweDA3LCAweDFjLCAKKzB4M2IsIDB4NDgsIDB4M2MsIDB4NGMsIDB4MDgsIDB4MjEsIDB4MjAsIDB4NjAsIDB4YTEsIDB4ODAsIDB4MDAsIDB4MjAsIAorMHgyMCwgMHg4MSwgMHhlMSwgMHg4MCwgMHg2MCwgMHg4MSwgMHgzOSwgMHg0OCwgMHhjMCwgMHg0NiwgMHhlMCwgMHg2MCwgCisweDM4LCAweDQ4LCAweGMwLCAweDQ2LCAweDIwLCAweDYxLCAweDM4LCAweDQ4LCAweGMwLCAweDQ2LCAweDYwLCAweDYxLCAKKzB4MzcsIDB4NDgsIDB4YzAsIDB4NDYsIDB4YTAsIDB4NjEsIDB4MzcsIDB4NDgsIDB4YzAsIDB4NDYsIDB4ZTAsIDB4NjEsIAorMHgzNiwgMHg0OCwgMHhjMCwgMHg0NiwgMHgyMCwgMHg2MiwgMHgzNiwgMHg0OCwgMHhjMCwgMHg0NiwgMHg2MCwgMHg2MiwgCisweDM1LCAweDQ4LCAweGMwLCAweDQ2LCAweGEwLCAweDYyLCAweDM1LCAweDQ4LCAweGMwLCAweDQ2LCAweGUwLCAweDYyLCAKKzB4MzQsIDB4NDgsIDB4YzAsIDB4NDYsIDB4MjAsIDB4NjMsIDB4MzQsIDB4NDgsIDB4YzAsIDB4NDYsIDB4NjAsIDB4NjMsIAorMHgzMywgMHg0OCwgMHhjMCwgMHg0NiwgMHhhMCwgMHg2MywgMHgzMywgMHg0OCwgMHhjMCwgMHg0NiwgMHhlMCwgMHg2MywgCisweDMyLCAweDQ4LCAweGMwLCAweDQ2LCAweDIwLCAweDY0LCAweDMyLCAweDQ4LCAweGMwLCAweDQ2LCAweDYwLCAweDY0LCAKKzB4MzEsIDB4NDgsIDB4YzAsIDB4NDYsIDB4YTAsIDB4NjQsIDB4MzEsIDB4NDgsIDB4YzAsIDB4NDYsIDB4ZTAsIDB4NjQsIAorMHgzMCwgMHg0OCwgMHhjMCwgMHg0NiwgMHgyMCwgMHg2NSwgMHgzMCwgMHg0OSwgMHhjOCwgMHg2OCwgMHgwMiwgMHgwNCwgCisweDg5LCAweDY5LCAweDRhLCAweDQwLCAweGUzLCAweDFkLCAweDc5LCAweDMzLCAweDA5LCAweDA0LCAweGM5LCAweDQzLCAKKzB4YzAsIDB4NDMsIDB4NDgsIDB4NDAsIDB4ZTEsIDB4MWQsIDB4YjksIDB4MzEsIDB4ZGEsIDB4NjMsIDB4MDgsIDB4NjAsIAorMHgyOSwgMHg0ZCwgMHgyMSwgMHgxYywgMHgyYiwgMHgxYywgMHgyOSwgMHg0YSwgMHgwMCwgMHgyMCwgMHhmYywgMHhmNywgCisweDNlLCAweGZhLCAweDI4LCAweDRhLCAweGUxLCAweDFkLCAweGI1LCAweDMxLCAweDAxLCAweDIwLCAweDJiLCAweDFjLCAKKzB4MGUsIDB4MWMsIDB4ZmMsIDB4ZjcsIDB4MzYsIDB4ZmEsIDB4MjQsIDB4NGEsIDB4MDAsIDB4MjAsIDB4MzEsIDB4MWMsIAorMHgyYiwgMHgxYywgMHhmYywgMHhmNywgMHgzMCwgMHhmYSwgMHhlMSwgMHgxZCwgMHg0ZCwgMHgzMSwgMHgyYiwgMHgxYywgCisweDIwLCAweDRhLCAweDAxLCAweDIwLCAweGZjLCAweGY3LCAweDI5LCAweGZhLCAweGUwLCAweDFkLCAweDVkLCAweDMwLCAKKzB4MDEsIDB4NjgsIDB4MDAsIDB4MjksIDB4ZmMsIDB4ZDAsIDB4NjAsIDB4NmQsIDB4YzAsIDB4NDYsIDB4MzgsIDB4NjUsIAorMHgyMCwgMHg2ZSwgMHhjMCwgMHg0NiwgMHg3OCwgMHg2NSwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDgwLCAweDAwLCAweDA4LCAweDAwLCAweDhjLCAweGI5LCAweDIwLCAweDQwLCAweDgxLCAweDgxLCAweDQ4LCAweGJkLCAKKzB4NzksIDB4NTYsIDB4MjMsIDB4OGMsIDB4OTMsIDB4MGMsIDB4ODIsIDB4OTUsIDB4MWQsIDB4MGUsIDB4MTIsIDB4Y2YsIAorMHg5YiwgMHgzYiwgMHhjMCwgMHhlOSwgMHhlNiwgMHg1NSwgMHg3YywgMHg4MiwgMHg5OSwgMHhmNiwgMHg3OCwgMHgwMiwgCisweGQxLCAweGQ3LCAweDI1LCAweDczLCAweDcyLCAweDhjLCAweDMzLCAweDEwLCAweGY3LCAweDAzLCAweGYxLCAweDQyLCAKKzB4NmMsIDB4OWIsIDB4NGEsIDB4YTcsIDB4ODIsIDB4OGUsIDB4MjMsIDB4YTksIDB4OTAsIDB4YjEsIDB4ODIsIDB4OGUsIAorMHhkYywgMHgzZiwgMHhmYiwgMHgyOSwgMHgwMCwgMHg2MiwgMHgyMiwgMHg0NSwgMHg4OCwgMHgyYiwgMHhmMSwgMHg4NSwgCisweDEyLCAweDYxLCAweGQxLCAweDczLCAweDZlLCAweGIxLCAweDExLCAweDE2LCAweDA4LCAweDgzLCAweDIwLCAweDQwLCAKKzB4NzUsIDB4MDgsIDB4ZmYsIDB4ZmYsIDB4NTQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDIsIDB4MDAsIAorMHgxNCwgMHgwMCwgMHgwMywgMHgwMCwgMHg4MCwgMHhiNSwgMHgwZiwgMHgxYywgMHgzOSwgMHgxYywgMHgwMCwgMHhmMCwgCisweDMzLCAweGY4LCAweDM4LCAweDFjLCAweGZmLCAweGY3LCAweDRjLCAweGZmLCAweDAzLCAweDQ4LCAweDAxLCAweDg5LCAKKzB4MDEsIDB4MzEsIDB4MDEsIDB4ODEsIDB4ODAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgMHg5MCwgMHhiNSwgMHgwNCwgMHgxYywgCisweDBmLCAweDFjLCAweDIwLCAweDFjLCAweDM5LCAweDFjLCAweDAwLCAweGYwLCAweDFmLCAweGY4LCAweGUwLCAweDY4LCAKKzB4MDEsIDB4MGUsIDB4ZmYsIDB4MjIsIDB4MTIsIDB4MDQsIDB4MDIsIDB4NDAsIDB4MTIsIDB4MGEsIDB4MTEsIDB4NDMsIAorMHhmZiwgMHgyMiwgMHgxMiwgMHgwMiwgMHgwMiwgMHg0MCwgMHgxMiwgMHgwMiwgMHgxMSwgMHg0MywgMHgwMCwgMHgwNiwgCisweDA4LCAweDQzLCAweDM4LCAweDY1LCAweDIwLCAweDY5LCAweGMwLCAweDQ2LCAweDc4LCAweDY1LCAweDYwLCAweDY5LCAKKzB4YzAsIDB4NDYsIDB4YjgsIDB4NjUsIDB4MDMsIDB4NDgsIDB4MDEsIDB4ODksIDB4MDEsIDB4MzEsIDB4MDEsIDB4ODEsIAorMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgCisweDkwLCAweGI1LCAweDAwLCAweDIyLCAweDkzLCAweDAwLCAweDFmLCAweDE4LCAweGJmLCAweDY5LCAweDViLCAweDE4LCAKKzB4NWYsIDB4NjIsIDB4MDEsIDB4MzIsIDB4MDUsIDB4MmEsIDB4ZjcsIDB4ZDMsIDB4MDcsIDB4N2EsIDB4ZmIsIDB4MDgsIAorMHgwMywgMHhkMywgMHgwMCwgMHgyMywgMHg5MiwgMHgwMCwgMHg1MiwgMHgxOCwgMHgxMywgMHg2MiwgMHgwNywgMHg2YiwgCisweGMwLCAweDQ2LCAweDhmLCAweDYzLCAweGM3LCAweDZhLCAweGMwLCAweDQ2LCAweGNmLCAweDYzLCAweDg3LCAweDZiLCAKKzB4YzAsIDB4NDYsIDB4MGYsIDB4NjQsIDB4NDcsIDB4NmIsIDB4YzAsIDB4NDYsIDB4NGYsIDB4NjQsIDB4MDcsIDB4NmMsIAorMHhjMCwgMHg0NiwgMHg4ZiwgMHg2NCwgMHhjMiwgMHg2YiwgMHhjMCwgMHg0NiwgMHhjYSwgMHg2NCwgMHhjMiwgMHg4OCwgCisweGMwLCAweDQ2LCAweDBhLCAweDgwLCAweDgyLCAweDdhLCAweDEyLCAweDA2LCAweDAzLCAweDdhLCAweDFiLCAweDA0LCAKKzB4MWEsIDB4NDMsIDB4YzMsIDB4ODgsIDB4MWIsIDB4MDIsIDB4MWEsIDB4NDMsIDB4NDMsIDB4N2EsIDB4ZGIsIDB4MDcsIAorMHgxYSwgMHg0MywgMHg4YSwgMHg2MCwgMHgxNywgMHgxYywgMHg4MywgMHg3YSwgMHg1YSwgMHgwOCwgMHgwNSwgMHhkMywgCisweDE0LCAweDIyLCAweDFjLCAweDFjLCAweGEzLCAweDA4LCAweDAyLCAweGQyLCAweDE1LCAweDIyLCAweDAwLCAweGUwLCAKKzB4MDAsIDB4MjIsIDB4MDAsIDB4N2EsIDB4NDMsIDB4MDgsIDB4MTAsIDB4ZDMsIDB4YzAsIDB4MDgsIDB4MDIsIDB4ZDMsIAorMHg4OCwgMHgyMCwgMHgxMCwgMHg0MywgMHgwMSwgMHhlMCwgMHg4MCwgMHgyMCwgMHgxMCwgMHg0MywgMHgzYSwgMHgwYSwgCisweDEyLCAweDAyLCAweDAxLCAweDIzLCAweDFhLCAweDQzLCAweGM4LCAweDYwLCAweDhhLCAweDYwLCAweDA4LCAweDFjLCAKKzB4ZmYsIDB4ZjcsIDB4NzgsIDB4ZmQsIDB4MDUsIDB4ZTAsIDB4MzgsIDB4MGEsIDB4MDAsIDB4MDIsIDB4MDMsIDB4MjMsIAorMHgxOCwgMHg0MywgMHg4OCwgMHg2MCwgMHhjYSwgMHg2MCwgMHgwMywgMHg0OCwgMHgwMSwgMHg4OSwgMHgwMSwgMHgzMSwgCisweDAxLCAweDgxLCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDBjLCAweDJiLCAweDAwLCAweDgwLCAKKzB4ZjAsIDB4YjQsIDB4MDIsIDB4NmQsIDB4MTQsIDB4NGMsIDB4MTUsIDB4MWMsIDB4ZTcsIDB4NjksIDB4YmQsIDB4NDAsIAorMHgxMywgMHgxYywgMHgyNiwgMHg2YSwgMHhmMywgMHg0MCwgMHg1ZCwgMHg0MCwgMHgyZSwgMHgxYywgMHg0NSwgMHg2ZCwgCisweGJkLCAweDQwLCAweDZlLCAweDQwLCAweDJiLCAweDFjLCAweDM1LCAweDFjLCAweGZkLCAweDQwLCAweDJmLCAweDFjLCAKKzB4YmIsIDB4MDAsIDB4NjUsIDB4NmEsIDB4ZWIsIDB4NTgsIDB4MDAsIDB4MmIsIDB4MDgsIDB4ZDAsIDB4MjMsIDB4NjksIAorMHgwMSwgMHgzNywgMHg5ZiwgMHg0MiwgMHgwMCwgMHhkMywgMHgwMCwgMHgyNywgMHhiZSwgMHgwMCwgMHhhZSwgMHg1OSwgCisweDAwLCAweDJlLCAweGY3LCAweGQxLCAweGE0LCAweDY5LCAweGEyLCAweDQwLCAweDExLCAweDQzLCAweDA1LCAweDRiLCAKKzB4MTksIDB4NDMsIDB4YmEsIDB4MDAsIDB4YTksIDB4NTAsIDB4NDAsIDB4MzAsIDB4ODcsIDB4ODMsIDB4ZjAsIDB4YmMsIAorMHg3MCwgMHg0NywgMHgwMCwgMHgwMCwgMHg0YywgMHgyYSwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgCisweDgwLCAweGI0LCAweDAwLCAweDIyLCAweDAwLCAweDIzLCAweDAwLCAweDI5LCAweDA1LCAweGQ5LCAweDA3LCAweDc4LCAKKzB4N2EsIDB4NDAsIDB4MDEsIDB4MzAsIDB4MDEsIDB4MzMsIDB4OGIsIDB4NDIsIDB4ZjksIDB4ZDMsIDB4ZDAsIDB4NDMsIAorMHgwMCwgMHgwNiwgMHgwMCwgMHgwZSwgMHg4MCwgMHhiYywgMHg3MCwgMHg0NywgMHhmMCwgMHhiNSwgMHgwNywgMHgxYywgCisweDAwLCAweDI0LCAweGZmLCAweDI2LCAweDA5LCAweDM2LCAweDIwLCAweDFjLCAweDAwLCAweGYwLCAweDlhLCAweGY4LCAKKzB4MDAsIDB4ZjAsIDB4YjgsIDB4ZjksIDB4MDUsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4YzcsIDB4ZmEsIDB4M2QsIDB4NzAsIAorMHgyOCwgMHgxYywgMHgwMSwgMHgzNywgMHgwMSwgMHgzNCwgMHhiNCwgMHg0MiwgMHhmMSwgMHhkMywgMHhmMCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDgwLCAweGI1LCAweDAwLCAweGYwLCAweDkzLCAweGY4LCAweDAwLCAweGYwLCAKKzB4YTcsIDB4ZjksIDB4MDcsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4YjYsIDB4ZmEsIDB4MzgsIDB4MGEsIDB4ZjYsIDB4ZDMsIAorMHg4MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHhmMywgMHhiNSwgMHg4MiwgMHhiMCwgMHgwMiwgMHg5OCwgCisweDQxLCAweDAyLCAweDUzLCAweDIwLCAweDAwLCAweGYwLCAweDY0LCAweGY4LCAweDAwLCAweGYwLCAweGE4LCAweGZhLCAKKzB4ZmYsIDB4ZjcsIDB4ZTgsIDB4ZmYsIDB4MDAsIDB4MjQsIDB4MDAsIDB4MjAsIDB4MDEsIDB4OTAsIDB4MmUsIDB4MjAsIAorMHgwMCwgMHg5MCwgMHgwMCwgMHgyNSwgMHgwMCwgMHgyNywgMHgwMiwgMHg5OCwgMHgwMSwgMHgyOCwgMHgwNCwgMHhkMSwgCisweDAwLCAweDk4LCAweDg0LCAweDQyLCAweDAxLCAweGQzLCAweDAwLCAweDI2LCAKKzB4MDksIDB4ZTAsIDB4MDEsIDB4OTgsIDB4NDEsIDB4MWMsIDB4MDEsIDB4OTEsIDB4MDAsIDB4ZjAsIDB4NjAsIDB4ZjgsIAorMHgwMCwgMHhmMCwgMHg3ZSwgMHhmOSwgMHgwNiwgMHgxYywgMHgwMCwgMHhmMCwgMHg4ZCwgMHhmYSwgMHhmOCwgMHgwMCwgCisweDg2LCAweDQwLCAweDM1LCAweDQzLCAweDAxLCAweDM0LCAweDAxLCAweDM3LCAweDA0LCAweDJmLCAweGU2LCAweGQzLCAKKzB4MDMsIDB4OTksIDB4MjAsIDB4YzEsIDB4MDMsIDB4OTEsIDB4ZmYsIDB4MjMsIDB4MDksIDB4MzMsIDB4OWMsIDB4NDIsIAorMHhkZCwgMHhkMywgMHgwNCwgMHhiMCwgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHhmMCwgMHhiNSwgCisweDA0LCAweDFjLCAweDBmLCAweDFjLCAweDAxLCAweDJjLCAweDJhLCAweGQwLCAweDE2LCAweDQ4LCAweGMwLCAweDZmLCAKKzB4NDAsIDB4MjMsIDB4MDEsIDB4NjgsIDB4MTksIDB4NDMsIDB4MDEsIDB4NjAsIDB4MDAsIDB4MjYsIDB4MjAsIDB4Y2YsIAorMHhiMSwgMHgwMCwgMHg4NCwgMHgyMCwgMHgwMCwgMHhmMCwgMHgyNCwgMHhmOCwgMHgyOCwgMHgxYywgMHgwMCwgMHhmMCwgCisweGRmLCAweGY5LCAweDI4LCAweDBhLCAweDAwLCAweGYwLCAweGRjLCAweGY5LCAweDI4LCAweDBjLCAweDAwLCAweGYwLCAKKzB4ZDksIDB4ZjksIDB4MjgsIDB4MGUsIDB4MDAsIDB4ZjAsIDB4ZDYsIDB4ZjksIDB4MDAsIDB4ZjAsIDB4NWMsIDB4ZmEsIAorMHgwMSwgMHgzNiwgMHg0MiwgMHgyZSwgMHhlOSwgMHhkMywgMHg2MSwgMHgwMiwgMHg4MywgMHgyMCwgMHgwMCwgMHhmMCwgCisweDBmLCAweGY4LCAweDAwLCAweGYwLCAweDUzLCAweGZhLCAweGZmLCAweGY3LCAweDkzLCAweGZmLCAweDA0LCAweDQ4LCAKKzB4YzAsIDB4NmYsIDB4NDAsIDB4MjMsIDB4MDEsIDB4NjgsIDB4OTksIDB4NDMsIDB4MDEsIDB4NjAsIDB4ZjAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg5MCwgMHhiNSwgMHgwNCwgMHgxYywgCisweDBmLCAweDFjLCAweDAwLCAweGYwLCAweDU5LCAweGZhLCAweDIwLCAweDFjLCAweDAwLCAweGYwLCAweGI2LCAweGY5LCAKKzB4MzgsIDB4MGMsIDB4MDAsIDB4ZjAsIDB4YjMsIDB4ZjksIDB4MzgsIDB4MGEsIDB4MDAsIDB4ZjAsIDB4YjAsIDB4ZjksIAorMHgzOCwgMHgxYywgMHgwMCwgMHhmMCwgMHhhZCwgMHhmOSwgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDAwLCAweGI1LCAweDAxLCAweDFjLCAweDU0LCAweDIwLCAweGZmLCAweGY3LCAweGU3LCAweGZmLCAweDAwLCAweDIwLCAKKzB4MDAsIDB4ZjAsIDB4YTIsIDB4ZjksIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4YjUsIDB4MDAsIDB4ZjAsIAorMHgzZCwgMHhmYSwgMHg1NywgMHgyMCwgMHgwMCwgMHhmMCwgMHg5YSwgMHhmOSwgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDkwLCAweGI1LCAweDA4LCAweDRmLCAweGZhLCAweDZmLCAweDIwLCAweDIzLCAweDE0LCAweDY4LCAweDljLCAweDQzLCAKKzB4MTQsIDB4NjAsIDB4MjMsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4NjUsIDB4ZmYsIDB4ZjgsIDB4NmYsIDB4MjAsIDB4MjMsIAorMHgwMSwgMHg2OCwgMHgxOSwgMHg0MywgMHgwMSwgMHg2MCwgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweDkwLCAweGI1LCAweDA4LCAweDRmLCAweGZhLCAweDZmLCAweDIwLCAweDIzLCAKKzB4MTQsIDB4NjgsIDB4OWMsIDB4NDMsIDB4MTQsIDB4NjAsIDB4MjMsIDB4MWMsIDB4ZmYsIDB4ZjcsIDB4ODcsIDB4ZmYsIAorMHhmOCwgMHg2ZiwgMHgyMCwgMHgyMywgMHgwMSwgMHg2OCwgMHgxOSwgMHg0MywgMHgwMSwgMHg2MCwgMHg5MCwgMHhiYywgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGYwLCAweGI1LCAweDA0LCAweDFjLCAKKzB4MGYsIDB4MWMsIDB4MTgsIDB4NGUsIDB4ZjAsIDB4NmYsIDB4MjAsIDB4MjMsIDB4MDEsIDB4NjgsIDB4OTksIDB4NDMsIAorMHgwMSwgMHg2MCwgMHg2MSwgMHgwMiwgMHg1MywgMHgyMCwgMHhmZiwgMHhmNywgMHhhNSwgMHhmZiwgMHgwMCwgMHhmMCwgCisweGU5LCAweGY5LCAweGZmLCAweGY3LCAweDI5LCAweGZmLCAweGY4LCAweDFkLCAweDA1LCAweDMwLCAweDAxLCAweDJjLCAKKzB4MDMsIDB4ZDEsIDB4MjIsIDB4MmYsIDB4MDEsIDB4ZDMsIDB4MDAsIDB4MjcsIDB4MGYsIDB4ZTAsIDB4NDQsIDB4MWMsIAorMHhmZiwgMHhmNywgMHhhYSwgMHhmZiwgMHgwMCwgMHhmMCwgMHhjOCwgMHhmOCwgMHgwNywgMHgxYywgMHgwMCwgMHhmMCwgCisweGQ3LCAweGY5LCAweDIwLCAweDFjLCAweGZmLCAweGY3LCAweGEyLCAweGZmLCAweDAwLCAweGYwLCAweGMwLCAweGY4LCAKKzB4MDUsIDB4MWMsIDB4MDAsIDB4ZjAsIDB4Y2YsIDB4ZjksIDB4ZjAsIDB4NmYsIDB4MjAsIDB4MjMsIDB4MDEsIDB4NjgsIAorMHgxOSwgMHg0MywgMHgwMSwgMHg2MCwgMHgyOCwgMHgwMiwgMHgzOCwgMHg0MywgMHhmMCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGYwLCAweGI1LCAweGMyLCAweGIwLCAKKzB4MTQsIDB4MWMsIDB4MGQsIDB4MWMsIDB4MDcsIDB4MWMsIDB4MDEsIDB4MmYsIDB4MmYsIDB4ZDAsIDB4NzksIDB4MDIsIAorMHgxOSwgMHg0ZSwgMHhmMCwgMHg2ZiwgMHgyMCwgMHgyMywgMHgwMiwgMHg2OCwgMHg5YSwgMHg0MywgMHgwMiwgMHg2MCwgCisweDUzLCAweDIwLCAweGZmLCAweGY3LCAweDZiLCAweGZmLCAweDAwLCAweGYwLCAweGFmLCAweGY5LCAweGZmLCAweGY3LCAKKzB4ZWYsIDB4ZmUsIDB4NjgsIDB4NDYsIDB4ZmYsIDB4ZjcsIDB4ZDYsIDB4ZmUsIDB4NmEsIDB4NDYsIDB4ZTgsIDB4MWQsIAorMHgwNSwgMHgzMCwgMHgxNCwgMHg1NCwgMHgyMSwgMHgwYSwgMHg2OCwgMHg0NCwgMHg0MSwgMHg3MCwgMHg2OCwgMHg0NiwgCisweDAwLCAweDk5LCAweDBjLCAweDMwLCAweGZmLCAweGY3LCAweGJhLCAweGZlLCAweDAyLCAweGFiLCAweDE4LCAweDcwLCAKKzB4MDAsIDB4MjAsIDB4NTgsIDB4NzAsIDB4NjgsIDB4NDYsIDB4MGMsIDB4MjEsIAorMHhmZiwgMHhmNywgMHhiMiwgMHhmZSwgMHgwMiwgMHhhYiwgMHg1OCwgMHg3MCwgMHg2OSwgMHg0NiwgMHgzOCwgMHgxYywgCisweGZmLCAweGY3LCAweDE1LCAweGZmLCAweGYwLCAweDZmLCAweDIwLCAweDIzLCAweDAxLCAweDY4LCAweDE5LCAweDQzLCAKKzB4MDEsIDB4NjAsIDB4NDIsIDB4YjAsIDB4ZjAsIDB4YmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHhmZiwgMHhiNSwgMHhjMiwgMHhiMCwgMHgwNywgMHgxYywgMHgwMSwgMHgyZiwgCisweDAxLCAweGQxLCAweDAxLCAweDIwLCAweDM2LCAweGUwLCAweDZiLCAweDQ2LCAweDAwLCAweDIwLCAweGM0LCAweDQzLCAKKzB4MTAsIDB4YzMsIDB4MDEsIDB4MzAsIDB4NDIsIDB4MjgsIDB4ZmIsIDB4ZDMsIDB4NjgsIDB4NDYsIDB4MGMsIDB4MzAsIAorMHgwMywgMHgxYywgMHgwMCwgMHgyNCwgMHgwMCwgMHgyYSwgMHgwYSwgMHhkOSwgMHgwZSwgMHg4OCwgMHhjMCwgMHg0NiwgCisweDA2LCAweDcwLCAweDBlLCAweDg4LCAweDM2LCAweDEyLCAweDQ2LCAweDcwLCAweDAyLCAweDMwLCAweDAyLCAweDMxLCAKKzB4MDIsIDB4MzQsIDB4OTQsIDB4NDIsIDB4ZjQsIDB4ZDMsIDB4MDAsIDB4OTIsIDB4MTgsIDB4MWMsIDB4MTEsIDB4MWMsIAorMHhmZiwgMHhmNywgMHg3YywgMHhmZSwgMHgwNCwgMHgxYywgMHgwMCwgMHgyMCwgMHgwMSwgMHg5MCwgMHgwMiwgMHhhYiwgCisweDFjLCAweDcwLCAweDU4LCAweDcwLCAweDlkLCAweDcwLCAweDY4LCAweDQ2LCAweDBjLCAweDIxLCAweGZmLCAweGY3LCAKKzB4NzEsIDB4ZmUsIDB4MDIsIDB4YWIsIDB4NTgsIDB4NzAsIDB4NDUsIDB4OWIsIDB4MWQsIDB4MDYsIDB4MmQsIDB4MGUsIAorMHhhYywgMHg0MiwgMHgwMywgMHhkMSwgMHg2OSwgMHg0NiwgMHgzOCwgMHgxYywgMHhmZiwgMHhmNywgMHgzZSwgMHhmZiwgCisweDAxLCAweDIwLCAweGFjLCAweDQyLCAweDAwLCAweGQxLCAweDAwLCAweDIwLCAweDQ2LCAweGIwLCAweGYwLCAweGJjLCAKKzB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4YjAsIDB4YjUsIDB4YzIsIDB4YjAsIDB4MGYsIDB4MWMsIDB4NDEsIDB4MDIsIAorMHgxNCwgMHg0YywgMHhlMCwgMHg2ZiwgMHgyMCwgMHgyMywgMHgwMiwgMHg2OCwgMHg5YSwgMHg0MywgMHgwMiwgMHg2MCwgCisweDUzLCAweDIwLCAweGZmLCAweGY3LCAweGVmLCAweGZlLCAweDAwLCAweGYwLCAweDMzLCAweGY5LCAweGZmLCAweGY3LCAKKzB4NzMsIDB4ZmUsIDB4NjgsIDB4NDYsIDB4ZmYsIDB4ZjcsIDB4NWEsIDB4ZmUsIDB4ZTAsIDB4NmYsIDB4MjAsIDB4MjMsIAorMHgwMSwgMHg2OCwgMHgxOSwgMHg0MywgMHgwMiwgMHhhZCwgMHgwMSwgMHg2MCwgMHg2ZCwgMHg3OCwgMHgwMCwgMHgyNCwgCisweDAyLCAweGFiLCAweDVjLCAweDcwLCAweDY4LCAweDQ2LCAweDBjLCAweDIxLCAweGZmLCAweGY3LCAweDNjLCAweGZlLCAKKzB4YTgsIDB4NDIsIDB4MDIsIDB4ZDEsIDB4MDAsIDB4OTgsIDB4ODcsIDB4NDIsIDB4MDEsIDB4ZDMsIDB4MjAsIDB4MWMsIAorMHgwMCwgMHhlMCwgMHgwMSwgMHgyMCwgMHg0MiwgMHhiMCwgMHhiMCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgCisweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGZjLCAweDQ2LCAweDYwLCAweDQ3LCAweDAwLCAweDAwLCAweGEwLCAweGUzLCAKKzB4YjQsIDB4MjIsIDB4OWYsIDB4ZTUsIDB4YjQsIDB4MzIsIDB4OWYsIDB4ZTUsIDB4MDEsIDB4MTAsIDB4YTAsIDB4ZTMsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHhhMCwgMHhlMywgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDkzLCAweGU1LCAKKzB4ODEsIDB4MDMsIDB4ODAsIDB4ZTEsIDB4MDEsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDkzLCAweGU1LCAweDAxLCAweDAzLCAweDgwLCAweGUxLCAKKzB4MDEsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgCisweDAwLCAweDEwLCAweDkzLCAweGU1LCAweDgxLCAweDAyLCAweDgwLCAweGUxLCAweDAxLCAweDEwLCAweGEwLCAweGUzLCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg5MywgMHhlNSwgCisweDAxLCAweDAyLCAweDgwLCAweGUxLCAweDAxLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg5MywgMHhlNSwgMHg4MSwgMHgwMSwgMHg4MCwgMHhlMSwgCisweDAxLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg5MywgMHhlNSwgMHgwMSwgMHgwMSwgMHg4MCwgMHhlMSwgMHgwMSwgMHgxMCwgMHhhMCwgMHhlMywgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweGEwLCAweGUzLCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4OTMsIDB4ZTUsIAorMHg4MSwgMHgwMCwgMHg4MCwgMHhlMSwgMHgwMSwgMHgxMCwgMHhhMCwgMHhlMywgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweGEwLCAweGUzLCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4OTMsIDB4ZTUsIAorMHgwMSwgMHgwMCwgMHg4MCwgMHhlMSwgMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHhmYywgMHg0NiwgMHg2MCwgMHg0NywgCisweGE0LCAweDIxLCAweDlmLCAweGU1LCAweGE4LCAweDMxLCAweDlmLCAweGU1LCAweGEwLCAweDEzLCAweGEwLCAweGUxLCAKKzB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIDB4MDEsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDIwLCAweDEzLCAweGEwLCAweGUxLCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAKKzB4MDEsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgCisweGEwLCAweDEyLCAweGEwLCAweGUxLCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAweDAxLCAweDEwLCAweGEwLCAweGUzLCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgyMCwgMHgxMiwgMHhhMCwgMHhlMSwgCisweDAwLCAweDEwLCAweDgzLCAweGU1LCAweDAxLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHhhMCwgMHgxMSwgMHhhMCwgMHhlMSwgMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgCisweDAxLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgyMCwgMHgxMSwgMHhhMCwgMHhlMSwgMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgMHgwMSwgMHgxMCwgMHhhMCwgMHhlMywgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweGEwLCAweGUzLCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4YTAsIDB4MTAsIDB4YTAsIDB4ZTEsIAorMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgMHgwMSwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgCisweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4YTAsIDB4ZTEsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIAorMHgwMSwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgCisweDAwLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAweDAwLCAweDEwLCAweDgyLCAweGU1LCAKKzB4MWUsIDB4ZmYsIDB4MmYsIDB4ZTEsIDB4ZmMsIDB4NDYsIDB4NjAsIDB4NDcsIDB4YTAsIDB4MzAsIDB4OWYsIDB4ZTUsIAorMHgwMSwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgCisweDAwLCAweDEwLCAweDgzLCAweGU1LCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIAorMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHhmYywgMHg0NiwgMHg2MCwgMHg0NywgMHg3MCwgMHgzMCwgMHg5ZiwgMHhlNSwgCisweDAwLCAweDEwLCAweGEwLCAweGUzLCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgCisweDFlLCAweGZmLCAweDJmLCAweGUxLCAweGZjLCAweDQ2LCAweDYwLCAweDQ3LCAweDM0LCAweDIwLCAweDlmLCAweGU1LCAKKzB4M2MsIDB4MzAsIDB4OWYsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4YTAsIDB4ZTMsIDB4MDAsIDB4MTAsIDB4ODIsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg4MiwgMHhlNSwgMHgwMSwgMHgxMCwgMHhhMCwgMHhlMywgMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgCisweDAwLCAweDEwLCAweDgzLCAweGU1LCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAweDAwLCAweDEwLCAweDgzLCAweGU1LCAKKzB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIDB4MDAsIDB4MTAsIDB4ODMsIDB4ZTUsIAorMHgwMCwgMHgxMCwgMHg4MywgMHhlNSwgMHgxZSwgMHhmZiwgMHgyZiwgMHhlMSwgMHhmOCwgMHgwMCwgMHgxOCwgMHg0MCwgCisweDA0LCAweDAxLCAweDE4LCAweDQwLCAweDAwLCAweDAxLCAweDE4LCAweDQwLCAweGZjLCAweDAwLCAweDE4LCAweDQwLCAKKzB4ODAsIDB4YjUsIDB4MDAsIDB4ZjAsIDB4MGMsIDB4ZjgsIDB4MDAsIDB4MjcsIDB4MzgsIDB4MWMsIDB4MDAsIDB4ZjAsIAorMHg0NywgMHhmOCwgMHg3OCwgMHgxYywgMHgwNywgMHgwNCwgMHgzZiwgMHgwYywgMHgwYywgMHgyZiwgMHhmNywgMHhkZCwgCisweDgwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDFkLCAweDQ4LCAKKzB4MDIsIDB4NjgsIDB4MWQsIDB4NDksIDB4OGIsIDB4NjksIDB4ZDIsIDB4MTgsIDB4MDIsIDB4NjAsIDB4MDIsIDB4NjYsIAorMHg4YSwgMHg2YSwgMHg0MywgMHg2OCwgMHg5YiwgMHgxOCwgMHg0MywgMHg2MCwgMHg5MywgMHg0MiwgMHgwMiwgMHhkMiwgCisweDgyLCAweDY4LCAweDAxLCAweDMyLCAweDgyLCAweDYwLCAweGMyLCAweDY4LCAweDBiLCAweDZhLCAweGQyLCAweDE4LCAKKzB4YzIsIDB4NjAsIDB4NDIsIDB4NjksIDB4Y2IsIDB4NjgsIDB4ZDIsIDB4MTgsIDB4NDIsIDB4NjEsIDB4YzIsIDB4NjksIAorMHg4YiwgMHg2OCwgMHhkMiwgMHgxOCwgMHhjMiwgMHg2MSwgMHgwMiwgMHg2OSwgMHgwYiwgMHg2OSwgMHhkMiwgMHgxOCwgCisweDAyLCAweDYxLCAweDgyLCAweDY5LCAweDBiLCAweDY4LCAweGQyLCAweDE4LCAweDgyLCAweDYxLCAweDAyLCAweDZiLCAKKzB4Y2IsIDB4NjksIDB4ZDIsIDB4MTgsIDB4MDIsIDB4NjMsIDB4NGEsIDB4NmEsIDB4NDMsIDB4NmIsIDB4OWIsIDB4MTgsIAorMHg0MywgMHg2MywgMHg5MywgMHg0MiwgMHgwMiwgMHhkMiwgMHg4MiwgMHg2YiwgMHgwMSwgMHgzMiwgMHg4MiwgMHg2MywgCisweGMyLCAweDZiLCAweDRiLCAweDY5LCAweGQyLCAweDE4LCAweGMyLCAweDYzLCAweDAyLCAweDZjLCAweGM5LCAweDZhLCAKKzB4NTEsIDB4MTgsIDB4MDEsIDB4NjQsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4YTQsIDB4MmEsIDB4MDAsIDB4ODAsIAorMHgwMCwgMHgwOCwgMHgxNCwgMHg0MCwgMHg4OCwgMHhiNSwgMHg2OSwgMHg0NiwgMHgwMCwgMHhmMCwgMHgxNywgMHhmOCwgCisweDgxLCAweDA4LCAweDBhLCAweGQwLCAweDAwLCAweDIwLCAweDAwLCAweDI5LCAweDA3LCAweGQ5LCAweDAwLCAweDIyLCAKKzB4ODMsIDB4MDAsIDB4MDAsIDB4OWYsIDB4YzAsIDB4NDYsIDB4ZmEsIDB4NTAsIDB4MDEsIDB4MzAsIDB4ODgsIDB4NDIsIAorMHhmOCwgMHhkMywgMHg4OCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHhiNSwgMHgwMCwgMHhmMCwgCisweDA0LCAweGY4LCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDIyLCAKKzB4MDAsIDB4MjgsIDB4MGEsIDB4ZDAsIDB4MDEsIDB4MjgsIDB4MGEsIDB4ZDAsIDB4MDIsIDB4MjgsIDB4MGMsIDB4ZDAsIAorMHgwMywgMHgyOCwgMHgwMiwgMHhkMSwgMHgwNywgMHg0OCwgMHgxYywgMHgyMiwgMHgwOCwgMHg2MCwgMHgxMCwgMHgxYywgCisweDcwLCAweDQ3LCAweDA2LCAweDQ4LCAweDA0LCAweGUwLCAweDA2LCAweDQ4LCAweDUwLCAweDIyLCAweDA4LCAweDYwLCAKKzB4ZjcsIDB4ZTcsIDB4MDUsIDB4NDgsIDB4NjgsIDB4MjIsIDB4MDgsIDB4NjAsIDB4ZjMsIDB4ZTcsIDB4MDAsIDB4MDAsIAorMHgwOCwgMHg4MywgMHgyMCwgMHg0MCwgMHhhNCwgMHgyYSwgMHgwMCwgMHg4MCwgMHgwYywgMHgyYiwgMHgwMCwgMHg4MCwgCisweGEwLCAweDgyLCAweDIwLCAweDQwLCAweDgwLCAweGI0LCAweDAzLCAweDIyLCAweGMyLCAweDgwLCAweDE1LCAweDRhLCAKKzB4YzAsIDB4NDYsIDB4ODIsIDB4NjAsIDB4MTQsIDB4NGEsIDB4MTIsIDB4ODgsIDB4MDEsIDB4MzIsIDB4YzIsIDB4NjAsIAorMHgwMCwgMHgyMCwgMHgxMywgMHg0YSwgMHgxMywgMHg1YywgMHhjMCwgMHg0NiwgMHgwYiwgMHg3MCwgMHgwMSwgMHgzMCwgCisweDAxLCAweDMxLCAweDA4LCAweDI4LCAweGY4LCAweGQzLCAweDIwLCAweDIyLCAweDBhLCAweDcwLCAweDAxLCAweDMxLCAKKzB4MDAsIDB4MjAsIDB4MGUsIDB4NGIsIDB4MWYsIDB4NWMsIDB4YzAsIDB4NDYsIDB4MGYsIDB4NzAsIDB4MDEsIDB4MzAsIAorMHgwMSwgMHgzMSwgMHgwOCwgMHgyOCwgMHhmOCwgMHhkMywgMHgwYSwgMHg3MCwgMHgwMSwgMHgzMSwgMHgwMCwgMHgyMCwgCisweDA5LCAweDRhLCAweDEzLCAweDVjLCAweGMwLCAweDQ2LCAweDBiLCAweDcwLCAweDAxLCAweDMwLCAweDAxLCAweDMxLCAKKzB4MDgsIDB4MjgsIDB4ZjgsIDB4ZDMsIDB4MDAsIDB4MjAsIDB4MDgsIDB4NzAsIDB4ODAsIDB4YmMsIDB4NzAsIDB4NDcsIAorMHgwOCwgMHgxMCwgMHgwMCwgMHgwMywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHg3YywgMHgwNCwgMHgwMCwgMHg4MCwgCisweDg1LCAweDA0LCAweDAwLCAweDgwLCAweDhlLCAweDA0LCAweDAwLCAweDgwLCAweDAwLCAweGI1LCAweDAxLCAweDIzLCAKKzB4MGEsIDB4NDgsIDB4YzEsIDB4MWQsIDB4ODksIDB4MzEsIDB4NGIsIDB4NzAsIDB4MDAsIDB4MjIsIDB4MGEsIDB4NzAsIAorMHg2NCwgMHgyMSwgMHg4MCwgMHgzMCwgMHhjMSwgMHg4MiwgMHgwMSwgMHg4MywgMHg0MywgMHg4MywgMHg3ZCwgMHgyMSwgCisweGM5LCAweDAwLCAweDgxLCAweDgzLCAweGMyLCAweDgzLCAweDA0LCAweDQ4LCAweDAxLCAweDIyLCAweDAwLCAweDIxLCAKKzB4MDAsIDB4ZjAsIDB4OGUsIDB4ZmIsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHhiNSwgMHgyMiwgMHhmZiwgMHhmZiwgMHgwMCwgMHhiNSwgMHhmZiwgMHhmNywgMHhlMSwgMHhmZiwgMHgxMywgMHg0OCwgCisweDAyLCAweDIyLCAweDAwLCAweDIxLCAweDAwLCAweGYwLCAweDgwLCAweGZiLCAweDAxLCAweDIzLCAweGQ4LCAweDQyLCAKKzB4MGEsIDB4ZDEsIDB4MTAsIDB4NDgsIDB4YzEsIDB4MWQsIDB4MzksIDB4MzEsIDB4Y2EsIDB4ODgsIDB4MDEsIDB4MzIsIAorMHhjYSwgMHg4MCwgMHg4MSwgMHg3OSwgMHgwMSwgMHgzMSwgMHg4MSwgMHg3MSwgMHhmZCwgMHhmNywgMHg3MCwgMHhmOSwgCisweDBiLCAweDQ4LCAweGMwLCAweDY4LCAweDAxLCAweDI4LCAweDA1LCAweGQxLCAweDBhLCAweDQ4LCAweDdkLCAweDIyLCAKKzB4ZDIsIDB4MDAsIDB4MDAsIDB4MjEsIDB4MDAsIDB4ZjAsIDB4NjgsIDB4ZmIsIDB4MDgsIDB4NDgsIDB4ZmIsIDB4ZjcsIAorMHhlMSwgMHhmYywgMHgwOCwgMHg0OCwgMHgyOCwgMHgyMiwgMHgwMCwgMHgyMSwgMHgwMCwgMHhmMCwgMHg2MCwgMHhmYiwgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDc5LCAweDIxLCAweGZmLCAweGZmLCAweGEwLCAweDgyLCAweDIwLCAweDQwLCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4YTUsIDB4N2IsIDB4MjEsIDB4NDAsIAorMHg5NSwgMHgyYywgMHhmZiwgMHhmZiwgMHg1OSwgMHgwMywgMHhmZiwgMHhmZiwgMHgwMCwgMHhiNSwgMHgxMCwgMHgyMCwgCisweDBmLCAweDQ5LCAweGMwLCAweDQ2LCAweDA4LCAweDYwLCAweDBmLCAweDRhLCAweDBmLCAweDQ4LCAweDY0LCAweDIxLCAKKzB4ZmIsIDB4ZjcsIDB4YzYsIDB4ZmMsIDB4MGUsIDB4NDgsIDB4MDEsIDB4MjIsIDB4MTIsIDB4MDQsIDB4MDEsIDB4NjgsIAorMHgwYSwgMHg0MCwgMHgwOCwgMHgyMSwgMHgwMCwgMHgyYSwgMHgwNSwgMHhkMSwgMHgwMiwgMHg2OCwgMHgxMiwgMHgwYywgCisweDA3LCAweGQxLCAweDAwLCAweDY4LCAweDgwLCAweDBhLCAweDA0LCAweGQzLCAweDA4LCAweDQ4LCAweGMwLCAweDQ2LCAKKzB4YzEsIDB4NjAsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MDcsIDB4NDgsIDB4YzAsIDB4NDYsIDB4MDEsIDB4NjQsIAorMHhmOSwgMHhlNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHhhNSwgMHg1NSwgMHhmZiwgMHhmZiwgCisweDdjLCAweDI5LCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDEwLCAweDQwLCAweDQwLCAweDAxLCAweDE4LCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ZjgsIDB4YjUsIDB4MjcsIDB4NDgsIDB4MDEsIDB4MjIsIDB4MTIsIDB4MDQsIAorMHgwMSwgMHg2OCwgMHgwYSwgMHg0MCwgMHgwNywgMHgyMSwgMHgwMCwgMHgyYSwgMHgwNSwgMHhkMSwgMHgwMiwgMHg2OCwgCisweDEyLCAweDBjLCAweDA2LCAweGQxLCAweDAwLCAweDY4LCAweDgwLCAweDBhLCAweDAzLCAweGQzLCAweDIxLCAweDQ4LCAKKzB4YzAsIDB4NDYsIDB4YzEsIDB4NjAsIDB4MDIsIDB4ZTAsIDB4MjAsIDB4NDgsIDB4YzAsIDB4NDYsIDB4MDEsIDB4NjQsIAorMHgxZiwgMHg0OCwgMHhmYiwgMHhmNywgMHg4NywgMHhmYywgMHgxZiwgMHg0OCwgMHhjMSwgMHg2YiwgMHhmZiwgMHgyOSwgCisweGZjLCAweGQxLCAweDgxLCAweDZiLCAweDQyLCAweDZiLCAweDE2LCAweDFjLCAweDBmLCAweDFjLCAweDFjLCAweDRjLCAKKzB4MTAsIDB4MjMsIDB4NjAsIDB4NjksIDB4MTgsIDB4NDMsIDB4NjAsIDB4NjEsIDB4YTEsIDB4NjksIDB4OTksIDB4NDMsIAorMHgxZCwgMHgwNCwgMHhhMSwgMHg2MSwgMHhlOCwgMHg2MCwgMHhhMCwgMHg2OSwgMHhjMCwgMHg0NiwgMHgyOCwgMHg2MSwgCisweDE2LCAweDRhLCAweDE3LCAweDQ5LCAweDY0LCAweDIwLCAweGZiLCAweGY3LCAweDZmLCAweGZjLCAweDE2LCAweDRhLCAKKzB4YzAsIDB4NDYsIDB4MDAsIDB4OTIsIDB4MTUsIDB4NGIsIDB4MDAsIDB4MjAsIDB4MzksIDB4MWMsIDB4MzIsIDB4MWMsIAorMHhmYiwgMHhmNywgMHg2ZSwgMHhmYywgMHgxMywgMHg0OCwgMHhjMSwgMHg2OCwgMHgwOCwgMHgyOSwgMHhmYywgMHhkMSwgCisweDEyLCAweDQ4LCAweGZiLCAweGY3LCAweDVkLCAweGZjLCAweDEwLCAweDIzLCAweDYwLCAweDY5LCAweDk4LCAweDQzLCAKKzB4NjAsIDB4NjEsIDB4ZTgsIDB4NjAsIDB4MDEsIDB4MjAsIDB4ZTMsIDB4MjMsIDB4MWIsIDB4MDEsIDB4ZTEsIDB4MTgsIAorMHhjOCwgMHg3MSwgMHhmOCwgMHhiYywgMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHgwMCwgMHgwMCwgMHgxMCwgMHg0MCwgCisweDQwLCAweDAxLCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDA0LCAweDAyLCAweGZmLCAweGZmLCAKKzB4MDAsIDB4MDEsIDB4MTgsIDB4NDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MjAsIDB4NTUsIDB4ZmYsIDB4ZmYsIAorMHhiNSwgMHhiNiwgMHgyMSwgMHg0MCwgMHg2NCwgMHgwMCwgMHgzMCwgMHgwMiwgMHg0NCwgMHg4MCwgMHgyMCwgMHg0MCwgCisweDQwLCAweDAxLCAweDE4LCAweDQwLCAweGY0LCAweDAxLCAweGZmLCAweGZmLCAweDAwLCAweGI1LCAweGZkLCAweGY3LCAKKzB4MDEsIDB4ZmYsIDB4MDYsIDB4NDgsIDB4ZmIsIDB4ZjcsIDB4MzIsIDB4ZmMsIDB4ZmQsIDB4ZjcsIDB4ZDYsIDB4ZmUsIAorMHhmZSwgMHhmNywgMHgwNCwgMHhmOCwgMHhmZSwgMHhmNywgMHgxNiwgMHhmOCwgMHhmZSwgMHhmNywgMHgyNCwgMHhmOCwgCisweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDkxLCAweDAzLCAweGZmLCAweGZmLCAweDkwLCAweGI1LCAweGZkLCAweGY3LCAKKzB4NmIsIDB4ZmMsIDB4MzQsIDB4NGYsIDB4MDAsIDB4MjQsIDB4ZjksIDB4NjgsIDB4ZjgsIDB4MWQsIDB4NzksIDB4MzAsIAorMHgwMSwgMHgyOSwgMHgwZiwgMHhkMSwgMHgzMSwgMHg0OSwgMHhjMCwgMHg0NiwgMHhmOSwgMHg2NywgMHgzMSwgMHg0OSwgCisweGMwLCAweDQ2LCAweDAxLCAweDYwLCAweDMwLCAweDQ5LCAweGMwLCAweDQ2LCAweDBjLCAweDYwLCAweDRjLCAweDYwLCAKKzB4OGMsIDB4NjAsIDB4Y2MsIDB4NjAsIDB4MGMsIDB4NjEsIDB4NGMsIDB4NjEsIDB4OGMsIDB4NjEsIDB4MDQsIDB4ZTAsIAorMHhmOSwgMHgxZCwgMHg3ZCwgMHgzMSwgMHhmOSwgMHg2NywgMHgxMiwgMHhjMCwgMHgwOCwgMHgzOCwgMHgwMCwgMHg2OCwgCisweDYwLCAweDIzLCAweDAxLCAweDY4LCAweDE5LCAweDQzLCAweDAxLCAweDYwLCAweGY4LCAweDZmLCAweDIwLCAweDIzLCAKKzB4MDEsIDB4NjgsIDB4MTksIDB4NDMsIDB4MDEsIDB4NjAsIDB4ZjgsIDB4NmYsIDB4NDAsIDB4MjMsIDB4MDEsIDB4NjgsIAorMHg5OSwgMHg0MywgMHgwMSwgMHg2MCwgMHgwMCwgMHhmMCwgMHg1NCwgMHhmOCwgMHhmZCwgMHhmNywgMHg0ZSwgMHhmYywgCisweDAwLCAweGYwLCAweDVlLCAweGY5LCAweGZkLCAweGY3LCAweDczLCAweGY4LCAweGZmLCAweGY3LCAweDBjLCAweGZlLCAKKzB4ZmQsIDB4ZjcsIDB4MmUsIDB4ZmUsIDB4ZmQsIDB4ZjcsIDB4YjYsIDB4ZmQsIDB4ZmQsIDB4ZjcsIDB4YzIsIDB4ZmUsIAorMHhmZCwgMHhmNywgMHg1NCwgMHhmZCwgMHhmZCwgMHhmNywgMHgwYSwgMHhmZCwgMHhmZCwgMHhmNywgMHg5NCwgMHhmZCwgCisweDAwLCAweGYwLCAweDFhLCAweGZhLCAweGZkLCAweGY3LCAweDljLCAweGZmLCAweGZkLCAweGY3LCAweDBhLCAweGZmLCAKKzB4ZmQsIDB4ZjcsIDB4ZDIsIDB4ZmUsIDB4ZmQsIDB4ZjcsIDB4M2MsIDB4ZmMsIDB4ZmIsIDB4ZjcsIDB4ZGMsIDB4ZmEsIAorMHhmZiwgMHhmNywgMHg5YywgMHhmZiwgMHg3MSwgMHgyMywgMHg1YiwgMHgwMSwgCisweGY4LCAweDE4LCAweDA0LCAweDcyLCAweDQ0LCAweDcyLCAweDA3LCAweDIzLCAweDViLCAweDAyLCAweGY4LCAweDE4LCAKKzB4MDQsIDB4NjMsIDB4ZjgsIDB4NjgsIDB4MDEsIDB4MjgsIDB4MDIsIDB4ZDEsIDB4YTgsIDB4MjAsIDB4ZmUsIDB4ZjcsIAorMHhiMSwgMHhmZCwgMHgwOSwgMHg0OCwgMHhjMCwgMHg0NiwgMHg0NCwgMHg2MiwgMHgwMCwgMHhmMCwgMHgxOCwgMHhmYSwgCisweDA3LCAweDQ4LCAweGZiLCAweGY3LCAweGJkLCAweGZiLCAweDkwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDEsIDB4MTEsIDB4NDAsIDB4MDQsIDB4MDEsIDB4MTEsIDB4NDAsIAorMHgwMCwgMHgwMSwgMHgxMSwgMHgwMCwgMHhjMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHgxNSwgMHg4ZiwgMHgyMSwgMHg0MCwgCisweDAwLCAweGI1LCAweDA0LCAweDQ4LCAweGZiLCAweGY3LCAweGFhLCAweGZiLCAweGZkLCAweGY3LCAweDVlLCAweGZmLCAKKzB4ZmQsIDB4ZjcsIDB4MjQsIDB4ZmMsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIDB4MTUsIDB4OTksIDB4MjEsIDB4NDAsIAorMHhmYSwgMHgyMSwgMHgwMywgMHg0OCwgMHhjMCwgMHg0NiwgMHg0MSwgMHg2MiwgMHg0MCwgMHgyMSwgMHg0MSwgMHg2MiwgCisweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweGMwLCAweDAwLCAweDE4LCAweDAwLCAweDA3LCAweDQ4LCAweDQxLCAweDY5LCAKKzB4MDcsIDB4NGIsIDB4MTksIDB4NDMsIDB4NDEsIDB4NjEsIDB4ODIsIDB4NjksIDB4OWEsIDB4NDMsIDB4ODIsIDB4NjEsIAorMHgwMSwgMHgyMiwgMHgxMiwgMHgwNSwgMHhkMSwgMHg2MCwgMHg4MCwgMHg2OSwgMHhjMCwgMHg0NiwgMHgxMCwgMHg2MSwgCisweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGZlLCAweGFmLCAweDlhLCAweDEwLCAKKzB4MDAsIDB4YjUsIDB4MDIsIDB4NDgsIDB4ZmIsIDB4ZjcsIDB4ODAsIDB4ZmIsIDB4MDgsIDB4YmMsIDB4MTgsIDB4NDcsIAorMHhjOCwgMHg1NywgMHhmZiwgMHhmZiwgMHhmMCwgMHhiNSwgMHgyNCwgMHg0YywgMHgwMSwgMHgyMSwgMHgwOSwgMHgwNCwgCisweDIwLCAweDY4LCAweDAxLCAweDQwLCAweDA5LCAweDIwLCAweDIyLCAweDRlLCAweDIyLCAweDRkLCAweDAwLCAweDI5LCAKKzB4MDUsIDB4ZDEsIDB4MjEsIDB4NjgsIDB4MDksIDB4MGMsIDB4MDQsIDB4ZDEsIDB4MjEsIDB4NjgsIDB4ODksIDB4MGEsIAorMHgwMSwgMHhkMywgMHhmMCwgMHg2MCwgMHgwMCwgMHhlMCwgMHgyOCwgMHg2NCwgMHgxZCwgMHg0OCwgMHhmYiwgMHhmNywgCisweDY1LCAweGZiLCAweDFkLCAweDRmLCAweDFkLCAweDQ5LCAweDg4LCAweDY5LCAweDAxLCAweDMwLCAweDg4LCAweDYxLCAKKzB4MzgsIDB4N2EsIDB4MDAsIDB4MjgsIDB4MDIsIDB4ZDEsIDB4NzgsIDB4N2EsIDB4MDAsIDB4MjgsIDB4MWYsIDB4ZDAsIAorMHgxOSwgMHg0OCwgMHhmYiwgMHhmNywgMHg1NywgMHhmYiwgMHgxOSwgMHg0OCwgMHhmYiwgMHhmNywgMHg1NCwgMHhmYiwgCisweDAwLCAweDI4LCAweGZhLCAweGQxLCAweDM4LCAweDdhLCAweDAwLCAweDI4LCAweDAyLCAweGQwLCAweDE2LCAweDQ4LCAKKzB4ZmIsIDB4ZjcsIDB4NGMsIDB4ZmIsIDB4MDEsIDB4MjEsIDB4MDksIDB4MDQsIDB4MjAsIDB4NjgsIDB4MDEsIDB4NDAsIAorMHgxNCwgMHgyMCwgMHgwMCwgMHgyOSwgMHgwNSwgMHhkMSwgMHgyMSwgMHg2OCwgMHgwOSwgMHgwYywgMHgwNCwgMHhkMSwgCisweDIxLCAweDY4LCAweDg5LCAweDBhLCAweDAxLCAweGQzLCAweGYwLCAweDYwLCAweDAxLCAweGUwLCAweDI4LCAweDY0LCAKKzB4ZmYsIDB4ZTcsIDB4ZmUsIDB4ZTcsIDB4ZmYsIDB4ZjcsIDB4NjUsIDB4ZmQsIDB4MGIsIDB4NDgsIDB4ZmIsIDB4ZjcsIAorMHgzNSwgMHhmYiwgMHhmZiwgMHhmNywgMHhhZiwgMHhmZiwgMHhjZCwgMHhlNywgMHgwMCwgMHgwMCwgMHgxMCwgMHg0MCwgCisweDQwLCAweDAxLCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDA0LCAweDAyLCAweGZmLCAweGZmLCAKKzB4ODgsIDB4MWMsIDB4MDAsIDB4ODAsIDB4MDgsIDB4ODMsIDB4MjAsIDB4NDAsIDB4ZjQsIDB4MDEsIDB4ZmYsIDB4ZmYsIAorMHhiNSwgMHgwNywgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHg5OSwgMHg5ZiwgMHgyMSwgMHg0MCwgCisweDAwLCAweDIwLCAweDA3LCAweDRhLCAweDAxLCAweDIxLCAweDA5LCAweDA1LCAweDUwLCAweDYxLCAweGM4LCAweDYwLCAKKzB4ZDAsIDB4NjEsIDB4YzgsIDB4NjEsIDB4MDMsIDB4MjMsIDB4ZGIsIDB4MDQsIDB4MDMsIDB4NGEsIDB4MDEsIDB4MjEsIAorMHhkMSwgMHg2MywgMHg1OCwgMHg2MCwgMHhmYywgMHhlNywgMHgwMCwgMHgwMCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweGMwLCAweDAwLCAweDE4LCAweDAwLCAweDgwLCAweGI1LCAweGMwLCAweGIwLCAweDAxLCAweDIyLCAweDAwLCAweDIxLCAKKzB4MGEsIDB4MjAsIDB4ZmMsIDB4ZjcsIDB4ZDEsIDB4ZmYsIDB4MDcsIDB4MWMsIDB4ZmYsIDB4MmYsIDB4MjgsIDB4ZDAsIAorMHg2OSwgMHg0NiwgMHhmZiwgMHgyMiwgMHgzOCwgMHgxYywgMHgwMSwgMHgzMiwgMHhmZCwgMHhmNywgMHg1NCwgMHhmOSwgCisweGZmLCAweDIzLCAweDAxLCAweDMzLCAweDk4LCAweDQyLCAweDFiLCAweGQxLCAweDBkLCAweDk4LCAweDAwLCAweDA5LCAKKzB4MTgsIDB4ZDMsIDB4MzgsIDB4MWMsIDB4ZmQsIDB4ZjcsIDB4OGQsIDB4ZjgsIDB4MGUsIDB4NDksIDB4MDEsIDB4MjIsIAorMHgxMiwgMHgwNCwgMHgwOCwgMHg2OCwgMHgwMiwgMHg0MCwgMHgwZCwgMHg0OCwgMHgwNSwgMHhkMSwgMHgwYSwgMHg2OCwgCisweDEyLCAweDBjLCAweDA2LCAweGQxLCAweDA5LCAweDY4LCAweDg5LCAweDBhLCAweDAzLCAweGQzLCAweDBhLCAweDQ5LCAKKzB4YzAsIDB4NDYsIDB4YzgsIDB4NjAsIDB4MDIsIDB4ZTAsIDB4MDksIDB4NDksIDB4YzAsIDB4NDYsIDB4MDgsIDB4NjQsIAorMHhmZiwgMHhmNywgMHhiYywgMHhmZiwgMHgzOCwgMHgxYywgMHhmZCwgMHhmNywgMHg3NCwgMHhmOCwgMHg0MCwgMHhiMCwgCisweDgwLCAweGJjLCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAweDAwLCAweDAwLCAKKzB4MDAsIDB4MDAsIDB4MTAsIDB4NDAsIDB4MDcsIDB4ODAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDEsIDB4MTgsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHhiNSwgMHgxNywgMHg0OSwgMHgwMSwgMHgyMiwgMHgxMiwgMHgwNCwgCisweDA4LCAweDY4LCAweDAyLCAweDQwLCAweDA2LCAweDIwLCAweDAwLCAweDJhLCAweDA1LCAweGQxLCAweDBhLCAweDY4LCAKKzB4MTIsIDB4MGMsIDB4MDYsIDB4ZDEsIDB4MDksIDB4NjgsIDB4ODksIDB4MGEsIDB4MDMsIDB4ZDMsIDB4MTEsIDB4NDksIAorMHhjMCwgMHg0NiwgMHhjOCwgMHg2MCwgMHgwMiwgMHhlMCwgMHgxMCwgMHg0OSwgMHhjMCwgMHg0NiwgMHgwOCwgMHg2NCwgCisweDAzLCAweDIwLCAweGZlLCAweGY3LCAweGQzLCAweGZjLCAweGZiLCAweGY3LCAweDBkLCAweGZmLCAweDAxLCAweDIzLCAKKzB4MTgsIDB4NDMsIDB4ZmIsIDB4ZjcsIDB4ZTcsIDB4ZmYsIDB4ZmYsIDB4ZjcsIDB4ODMsIDB4ZmUsIDB4ZmYsIDB4ZjcsIAorMHg5ZCwgMHhmZiwgMHhmZiwgMHhmNywgMHgwNSwgMHhmZSwgMHhmZiwgMHhmNywgMHhmNSwgMHhmZSwgMHhmZiwgMHhmNywgCisweDA5LCAweGZmLCAweGZmLCAweGY3LCAweDliLCAweGZkLCAweGZmLCAweGY3LCAweDIxLCAweGZmLCAweDA4LCAweGJjLCAKKzB4MTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4NDAsIDB4NDAsIDB4MDEsIDB4MTgsIDB4MDAsIAorMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHhmMCwgMHhiNCwgMHg0NiwgMHg0YSwgMHgwMSwgMHgyMSwgMHhjOSwgMHgwMywgCisweDQ1LCAweDRkLCAweDE5LCAweDIzLCAweGRiLCAweDAxLCAweGVjLCAweDE4LCAweGExLCAweDYxLCAweDI4LCAweDg4LCAKKzB4NDAsIDB4MDQsIDB4NDMsIDB4NGIsIDB4YzAsIDB4MTgsIDB4ODcsIDB4MWEsIDB4MDQsIDB4MjAsIDB4YWYsIDB4NjAsIAorMHg0MSwgMHg0ZSwgMHhjMCwgMHg0NiwgMHhiMCwgMHg2MSwgMHgwOCwgMHgyMCwgMHhjOCwgMHgyMywgMHg0MywgMHg0MywgCisweGJiLCAweDQyLCAweDIxLCAweGQ5LCAweDQxLCAweDAwLCAweDNkLCAweDRlLCAweGMwLCAweDQ2LCAweDMxLCAweDYxLCAKKzB4YjYsIDB4NjksIDB4MjAsIDB4MjMsIDB4OWIsIDB4MWIsIDB4M2EsIDB4NGUsIDB4YzAsIDB4NDYsIDB4ZjMsIDB4NjEsIAorMHgxMCwgMHgzYiwgMHgzMywgMHg2MiwgMHg4YiwgMHgwMCwgMHhmZiwgMHgxYSwgMHg0MCwgMHgwOCwgMHg4MSwgMHg0MiwgCisweDE3LCAweGQzLCAweGI4LCAweDIzLCAweDQzLCAweDQzLCAweGJiLCAweDQyLCAweDA4LCAweGQ5LCAweDQxLCAweDFlLCAKKzB4MzIsIDB4NGIsIDB4YzAsIDB4NDYsIDB4OTksIDB4ODEsIDB4ZDksIDB4ODEsIDB4NDAsIDB4MDAsIDB4MDIsIDB4MzgsIAorMHg1OCwgMHg2MSwgMHgwYSwgMHhlMCwgMHgwMSwgMHgzMCwgMHg4MSwgMHg0MiwgMHhlZiwgMHhkMiwgMHgwNiwgMHhlMCwgCisweDJjLCAweDRlLCAweGIzLCAweDY5LCAweDAxLCAweDMzLCAweGIzLCAweDYxLCAweDQwLCAweDAwLCAweDg4LCAweDQyLCAKKzB4ZDIsIDB4ZDksIDB4MmEsIDB4NDksIDB4MDAsIDB4MjAsIDB4YTMsIDB4NjksIDB4OWIsIDB4MDgsIDB4MDcsIDB4ZDAsIAorMHgyOCwgMHg0YiwgMHg4NywgMHgwMCwgMHhjYiwgMHg1MSwgMHhhNywgMHg2OSwgMHhiZiwgMHgwOCwgMHgwMSwgMHgzMCwgCisweDg3LCAweDQyLCAweGY4LCAweGQ4LCAweDIyLCAweDQ5LCAweGMwLCAweDQ2LCAweDhhLCAweDYyLCAweDhjLCAweDg5LCAKKzB4NTgsIDB4MjAsIDB4NjAsIDB4NDMsIDB4ODcsIDB4MTgsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4MmMsIAorMHgwYSwgMHhkZCwgMHg1OCwgMHgyMywgMHg0MywgMHg0MywgMHg4YywgMHg2YSwgMHhlMywgMHgxOCwgMHgwMSwgMHgzMCwgCisweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDlhLCAweDYwLCAweDhiLCAweDg5LCAweDgzLCAweDQyLCAweGY0LCAweGRjLCAKKzB4Y2YsIDB4NjIsIDB4Y2MsIDB4ODksIDB4NjAsIDB4MDAsIDB4MDAsIDB4MTksIDB4NDAsIDB4MDEsIDB4YzcsIDB4MTksIAorMHgwMCwgMHgyMCwgMHgwMCwgMHgyYywgMHgwYiwgMHhkZCwgMHg0MywgMHgwMCwgMHgxYiwgMHgxOCwgMHg1YiwgMHgwMSwgCisweGNjLCAweDZhLCAweGUzLCAweDE4LCAweDAxLCAweDMwLCAweDAwLCAweDA0LCAweDAwLCAweDBjLCAweDlhLCAweDYwLCAKKzB4Y2IsIDB4ODksIDB4ODMsIDB4NDIsIDB4ZjMsIDB4ZGMsIDB4NGYsIDB4NjIsIDB4MDAsIDB4MjAsIDB4MGIsIDB4NjksIAorMHgwMCwgMHgyYiwgMHgwNywgMHhkOSwgMHg4NywgMHgwMCwgMHg0YiwgMHg2YSwgMHhjMCwgMHg0NiwgMHhkYSwgMHg1MSwgCisweDBiLCAweDY5LCAweDAxLCAweDMwLCAweDgzLCAweDQyLCAweGY3LCAweGQ4LCAweDQ5LCAweDZhLCAweDgwLCAweDAwLCAKKzB4MDgsIDB4MTgsIDB4MDQsIDB4MzgsIDB4MjgsIDB4NjEsIDB4ZjAsIDB4YmMsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIAorMHhiMCwgMHhiZSwgMHgyMSwgMHg0MCwgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgyMCwgMHg0MCwgCisweDRjLCAweDJhLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDIwLCAweDQwLCAweDAwLCAweGFkLCAweGRlLCAweDAwLCAKKzB4MGEsIDB4NDgsIDB4MDEsIDB4MjMsIDB4MWIsIDB4MDYsIDB4NDEsIDB4NjksIDB4OTksIDB4NDMsIDB4MWEsIDB4MDksIAorMHg0MSwgMHg2MSwgMHhkMSwgMHg2MCwgMHgwMCwgMHgyMSwgMHhhMSwgMHgyMiwgMHg1MiwgMHgwMywgMHg5MSwgMHg2MSwgCisweDFiLCAweDIzLCAweGRiLCAweDAxLCAweGMwLCAweDE4LCAweDgxLCAweDYxLCAweDAxLCAweDIwLCAweDAwLCAweDA2LCAKKzB4NTksIDB4MDUsIDB4MDgsIDB4NjAsIDB4NzAsIDB4NDcsIDB4MDAsIDB4MDAsIDB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIAorMHg4MCwgMHhiNCwgMHgwMiwgMHgxYywgMHgwYiwgMHg0OCwgMHgxYiwgMHgyMywgMHhkYiwgMHgwMSwgMHhjMywgMHgxOCwgCisweDlhLCAweDYxLCAweDAxLCAweDIzLCAweDFiLCAweDA2LCAweDQyLCAweDY5LCAweDFhLCAweDQzLCAweDQyLCAweDYxLCAKKzB4ODcsIDB4NjksIDB4OWYsIDB4NDMsIDB4MDEsIDB4MjMsIDB4MWIsIDB4MDUsIAorMHg4NywgMHg2MSwgMHhkYSwgMHg2MCwgMHg4MCwgMHg2OSwgMHhjMCwgMHg0NiwgMHgxOCwgMHg2MSwgMHhhMSwgMHgyMCwgCisweDQwLCAweDAzLCAweDgxLCAweDYxLCAweDgwLCAweGJjLCAweDcwLCAweDQ3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4ODAsIDB4YjUsIDB4ZmYsIDB4ZjcsIDB4YzksIDB4ZmYsIDB4MDAsIDB4MjAsIDB4MDAsIDB4ZjAsIDB4MjAsIDB4ZjgsIAorMHgwMCwgMHgyMCwgMHgwOSwgMHg0OSwgMHgwMCwgMHgyMiwgMHgwMywgMHgwMSwgMHg1ZiwgMHgxOCwgMHgzMywgMHgyMywgCisweDliLCAweDAxLCAweGZiLCAweDE4LCAweDlhLCAweDYyLCAweDAxLCAweDMwLCAweDBiLCAweDI4LCAweGY2LCAweGQzLCAKKzB4MDQsIDB4NDgsIDB4MDEsIDB4MjIsIDB4MDAsIDB4MjEsIDB4MDAsIDB4ZjAsIDB4MzMsIDB4ZjgsIDB4ODAsIDB4YmMsIAorMHgwOCwgMHhiYywgMHgxOCwgMHg0NywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgMHgxZCwgMHgzZSwgMHhmZiwgMHhmZiwgCisweDAwLCAweGI1LCAweDAyLCAweDQ4LCAweDAwLCAweGYwLCAweDA0LCAweGY4LCAweDA4LCAweGJjLCAweDE4LCAweDQ3LCAKKzB4YTgsIDB4NjEsIDB4MDAsIDB4MDAsIDB4ODAsIDB4YjQsIDB4MDEsIDB4MjIsIDB4MTIsIDB4MDUsIDB4MGYsIDB4NGIsIAorMHhhMSwgMHgyMSwgMHg0OSwgMHgwMywgMHgwMCwgMHgyOCwgMHgwZSwgMHhkMCwgMHhjOCwgMHg2MSwgMHgxOCwgMHgxYywgCisweDU5LCAweDY5LCAweDUzLCAweDAxLCAweDE5LCAweDQzLCAweDQxLCAweDYxLCAweDg3LCAweDY5LCAweDlmLCAweDQzLCAKKzB4ODcsIDB4NjEsIDB4ZDEsIDB4NjAsIDB4ODAsIDB4NjksIDB4YzAsIDB4NDYsIDB4MTAsIDB4NjEsIDB4ODAsIDB4YmMsIAorMHg3MCwgMHg0NywgMHgxOCwgMHgxYywgMHg1ZiwgMHg2OSwgMHgwMSwgMHgyMywgMHg1YiwgMHgwNiwgMHg5ZiwgMHg0MywgCisweDQ3LCAweDYxLCAweGQ3LCAweDYwLCAweDAwLCAweDIwLCAweGM4LCAweDYxLCAweGYzLCAweGU3LCAweDAwLCAweDAwLCAKKzB4NjgsIDB4MGUsIDB4MDAsIDB4ODAsIDB4YjAsIDB4YjQsIDB4MDcsIDB4MWMsIDB4MDAsIDB4MjAsIDB4MTcsIDB4NGMsIAorMHgwMywgMHgwMSwgMHgxZCwgMHgxOSwgMHgzMywgMHgyMywgMHg5YiwgMHgwMSwgMHhlYiwgMHgxOCwgMHg5ZCwgMHg2YSwgCisweGJkLCAweDQyLCAweDA1LCAweGQxLCAweDFkLCAweDZiLCAweDk1LCAweDQyLCAweDAyLCAweGQxLCAweGRiLCAweDZhLCAKKzB4OGIsIDB4NDIsIDB4MWMsIDB4ZDAsIDB4MDEsIDB4MzAsIDB4MGIsIDB4MjgsIDB4ZWUsIDB4ZDMsIDB4MDAsIDB4MjAsIAorMHgwMywgMHgwMSwgMHgxZCwgMHgxOSwgMHgzMywgMHgyMywgMHg5YiwgMHgwMSwgMHhlYiwgMHgxOCwgMHg5YiwgMHg2YSwgCisweDAwLCAweDJiLCAweDA5LCAweGQxLCAweDAzLCAweDAxLCAweDFjLCAweDE5LCAweDMzLCAweDIzLCAweDliLCAweDAxLCAKKzB4ZTMsIDB4MTgsIDB4MWEsIDB4NjMsIDB4ZDksIDB4NjIsIDB4NWEsIDB4NjMsIDB4OWYsIDB4NjIsIDB4MDIsIDB4ZTAsIAorMHgwMSwgMHgzMCwgMHgwYiwgMHgyOCwgMHhlYSwgMHhkMywgMHgwYiwgMHgyOCwgMHgwMSwgMHhkMSwgMHgwMCwgMHgyMCwgCisweGMwLCAweDQzLCAweGIwLCAweGJjLCAweDcwLCAweDQ3LCAweDAwLCAweDAwLCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAKKzB4OTAsIDB4YjQsIDB4MDEsIDB4MWMsIDB4MDAsIDB4MjIsIDB4MDEsIDB4MjAsIDB4MTYsIDB4NGYsIDB4MDEsIDB4ZTAsIAorMHgwMCwgMHgyYSwgMHgwNywgMHhkMSwgMHgwMywgMHgwMSwgMHhkYywgMHgxOSwgMHgzMywgMHgyMywgMHg5YiwgMHgwMSwgCisweGUzLCAweDE4LCAweDliLCAweDY5LCAweDhiLCAweDQyLCAweDExLCAweGQxLCAweDAyLCAweDAxLCAweGQyLCAweDE5LCAKKzB4MzMsIDB4MjMsIDB4OWIsIDB4MDEsIDB4ZDIsIDB4MTgsIDB4OTMsIDB4NmEsIDB4YzAsIDB4NDYsIDB4OTMsIDB4NjEsIAorMHhkMywgMHg2YSwgMHhjMCwgMHg0NiwgMHhkMywgMHg2MSwgMHgxMywgMHg2YiwgMHhjMCwgMHg0NiwgMHgxMywgMHg2MiwgCisweDUzLCAweDZiLCAweGMwLCAweDQ2LCAweDUzLCAweDYyLCAweDAxLCAweDIyLCAweDAxLCAweDMwLCAweDBiLCAweDI4LCAKKzB4ZTAsIDB4ZDMsIDB4MDcsIDB4NGIsIDB4MDAsIDB4MmEsIDB4MDIsIDB4ZDEsIDB4OWEsIDB4NjgsIDB4OGEsIDB4NDIsIAorMHgwMywgMHhkMSwgMHgwMCwgMHgyMSwgMHg5OSwgMHg2MCwgMHg5MCwgMHhiYywgMHg3MCwgMHg0NywgMHgwMCwgMHgyMCwgCisweGMwLCAweDQzLCAweGZhLCAweGU3LCAweDY4LCAweDBlLCAweDAwLCAweDgwLCAweGU4LCAweDFiLCAweDAwLCAweDgwLCAKKzB4MGIsIDB4MjgsIDB4MTcsIDB4ZGEsIDB4MGMsIDB4NDksIDB4MDEsIDB4MjMsIDB4NWIsIDB4MDYsIDB4OGEsIDB4NjksIAorMHgxMywgMHg0MywgMHgwMSwgMHgyMiwgMHgxMiwgMHgwNSwgMHg4YiwgMHg2MSwgMHgxMywgMHg2MSwgMHgwMCwgMHgwMSwgCisweDQwLCAweDE4LCAweDMzLCAweDIzLCAweDliLCAweDAxLCAweGMwLCAweDE4LCAweDAzLCAweDZiLCAweGMwLCAweDQ2LCAKKzB4NDMsIDB4NjMsIDB4NTMsIDB4MDEsIDB4ODgsIDB4NjksIDB4OTgsIDB4NDMsIDB4ODgsIDB4NjEsIDB4MTAsIDB4NjEsIAorMHgwMSwgMHgyMCwgMHg3MCwgMHg0NywgMHgwMCwgMHgyMCwgMHhmYywgMHhlNywgMHg2OCwgMHgwZSwgMHgwMCwgMHg4MCwgCisweDkwLCAweGI0LCAweDA4LCAweDRhLCAweGQwLCAweDY5LCAweDAwLCAweDIxLCAweDA3LCAweDRmLCAweGQzLCAweDY5LCAKKzB4ODMsIDB4NDIsIDB4MDIsIDB4ZDksIDB4ZmMsIDB4MWEsIDB4MjAsIDB4MTgsIDB4MDAsIDB4ZTAsIDB4YzAsIDB4MWEsIAorMHgwOSwgMHgxOCwgMHgxOCwgMHgxYywgMHhiOSwgMHg0MiwgMHhmNCwgMHhkOSwgMHg5MCwgMHhiYywgMHg3MCwgMHg0NywgCisweDAwLCAweDIwLCAweDE0LCAweDQwLCAweGE4LCAweDYxLCAweDAwLCAweDAwLCAweDkwLCAweGI1LCAweDA3LCAweDFjLCAKKzB4MDAsIDB4MjQsIDB4MDAsIDB4MmYsIDB4MDQsIDB4ZDMsIDB4ZmYsIDB4ZjcsIDB4ZTMsIDB4ZmYsIDB4MDEsIDB4MzQsIAorMHhiYywgMHg0MiwgMHhmYSwgMHhkOSwgMHg5MCwgMHhiYywgMHgwOCwgMHhiYywgCisweDE4LCAweDQ3LCAweDAwLCAweDAwLCAKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90eXBob29uLmMgYi9kcml2ZXJzL25ldC90eXBob29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBkMzM3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3R5cGhvb24uYwpAQCAtMCwwICsxLDI2NzMgQEAKKy8qIHR5cGhvb24uYzogQSBMaW51eCBFdGhlcm5ldCBkZXZpY2UgZHJpdmVyIGZvciAzQ29tIDNDUjk5MCBmYW1pbHkgb2YgTklDcyAqLworLyoKKwlXcml0dGVuIDIwMDItMjAwNCBieSBEYXZpZCBEaWxsb3cgPGRhdmVAdGhlZGlsbG93cy5vcmc+CisJQmFzZWQgb24gY29kZSB3cml0dGVuIDE5OTgtMjAwMCBieSBEb25hbGQgQmVja2VyIDxiZWNrZXJAc2N5bGQuY29tPiBhbmQKKwlMaW51eCAyLjIueCBkcml2ZXIgYnkgRGF2aWQgUC4gTWNMZWFuIDxkYXZpZHBtY2xlYW5AeWFob28uY29tPi4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKwl0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCURyaXZlcnMgYmFzZWQgb24gb3IgZGVyaXZlZCBmcm9tIHRoaXMgY29kZSBmYWxsIHVuZGVyIHRoZSBHUEwgYW5kIG11c3QKKwlyZXRhaW4gdGhlIGF1dGhvcnNoaXAsIGNvcHlyaWdodCBhbmQgbGljZW5zZSBub3RpY2UuICBUaGlzIGZpbGUgaXMgbm90CisJYSBjb21wbGV0ZSBwcm9ncmFtIGFuZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdGhlIGVudGlyZSBvcGVyYXRpbmcKKwlzeXN0ZW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4KKworCVRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIG9uIGEgcHVibGljIHdlYiBzaXRlLiBJdCBtYXkgZW5hYmxlCisJY3J5cHRvZ3JhcGhpYyBjYXBhYmlsaXRpZXMgb2YgdGhlIDNDb20gaGFyZHdhcmUsIGFuZCBtYXkgYmUKKwlleHBvcnRlZCBmcm9tIHRoZSBVbml0ZWQgU3RhdGVzIHVuZGVyIExpY2Vuc2UgRXhjZXB0aW9uICJUU1UiCisJcHVyc3VhbnQgdG8gMTUgQy5GLlIuIFNlY3Rpb24gNzQwLjEzKGUpLgorCisJVGhpcyB3b3JrIHdhcyBmdW5kZWQgYnkgdGhlIE5hdGlvbmFsIExpYnJhcnkgb2YgTWVkaWNpbmUgdW5kZXIKKwl0aGUgRGVwYXJ0bWVudCBvZiBFbmVyZ3kgcHJvamVjdCBudW1iZXIgMDI3NEREMDZEMSBhbmQgTkxNIHByb2plY3QKKwludW1iZXIgWTEtTE0tMjAxNS0wMS4KKworCVRoaXMgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciB0aGUgM0NvbSAzQ1I5OTAgRmFtaWx5IG9mIGNhcmRzIHdpdGggdGhlCisJM1hQIFByb2Nlc3Nvci4gSXQgaGFzIGJlZW4gdGVzdGVkIG9uIHg4NiBhbmQgc3BhcmM2NC4KKworCUtOT1dOIElTU1VFUzoKKwkqKSBUaGUgY3VycmVudCBmaXJtd2FyZSBhbHdheXMgc3RyaXBzIHRoZSBWTEFOIHRhZyBvZmYsIGV2ZW4gaWYKKwkJd2UgdGVsbCBpdCBub3QgdG8uIFlvdSBzaG91bGQgZmlsdGVyIFZMQU5zIGF0IHRoZSBzd2l0Y2gKKwkJYXMgYSB3b3JrYXJvdW5kIChnb29kIHByYWN0aWNlIGluIGFueSBldmVudCkgdW50aWwgd2UgY2FuCisJCWdldCB0aGlzIGZpeGVkLgorCSopIENhbm5vdCBETUEgUnggcGFja2V0cyB0byBhIDIgYnl0ZSBhbGlnbmVkIGFkZHJlc3MuIEFsc28gZmlybXdhcmUKKwkJaXNzdWUuIEhvcGVmdWxseSAzQ29tIHdpbGwgZml4IGl0LgorCSopIFdhaXRpbmcgZm9yIGEgY29tbWFuZCByZXNwb25zZSB0YWtlcyA4bXMgZHVlIHRvIG5vbi1wcmVlbXB0YWJsZQorCQlwb2xsaW5nLiBPbmx5IHNpZ25pZmljYW50IGZvciBnZXR0aW5nIHN0YXRzIGFuZCBjcmVhdGluZworCQlTQXMsIGJ1dCBhbiB1Z2x5IHdhcnQgbmV2ZXIgdGhlIGxlc3MuCisKKwlUT0RPOgorCSopIERvZXNuJ3QgZG8gSVBTRUMgb2ZmbG9hZGluZy4gWWV0LiBLZWVwIHllciBwYW50cyBvbiwgaXQncyBjb21pbmcuCisJKikgQWRkIG1vcmUgc3VwcG9ydCBmb3IgZXRodG9vbCAoZXNwZWNpYWxseSBmb3IgTklDIHN0YXRzKQorCSopIEFsbG93IGRpc2FibGluZyBvZiBSWCBjaGVja3N1bSBvZmZsb2FkaW5nCisJKikgRml4IE1BQyBjaGFuZ2luZyB0byB3b3JrIHdoaWxlIHRoZSBpbnRlcmZhY2UgaXMgdXAKKwkJKE5lZWQgdG8gcHV0IGNvbW1hbmRzIG9uIHRoZSBUWCByaW5nLCB3aGljaCBjaGFuZ2VzCisJCXRoZSBsb2NraW5nKQorCSopIEFkZCBpbiBGQ1MgdG8ge3J4LHR4fV9ieXRlcywgc2luY2UgdGhlIGhhcmR3YXJlIGRvZXNuJ3QuIFNlZQorCQlodHRwOi8vb3NzLnNnaS5jb20vY2dpLWJpbi9tZXNnLmNnaT9hPW5ldGRldiZpPTIwMDMxMjE1MTUyMjExLjcwMDNmZThlLnJkZHVubGFwJTQwb3NkbC5vcmcKKyovCisKKy8qIFNldCB0aGUgY29weSBicmVha3BvaW50IGZvciB0aGUgY29weS1vbmx5LXRpbnktZnJhbWVzIHNjaGVtZS4KKyAqIFNldHRpbmcgdG8gPiAxNTE4IGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoaXMgZmVhdHVyZS4KKyAqLworc3RhdGljIGludCByeF9jb3B5YnJlYWsgPSAyMDA7CisKKy8qIFNob3VsZCB3ZSB1c2UgTU1JTyBvciBQb3J0IElPPworICogMDogUG9ydCBJTworICogMTogTU1JTworICogMjogVHJ5IE1NSU8sIGZhbGxiYWNrIHRvIFBvcnQgSU8KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCB1c2VfbW1pbyA9IDI7CisKKy8qIGVuZCB1c2VyLWNvbmZpZ3VyYWJsZSB2YWx1ZXMgKi8KKworLyogTWF4aW11bSBudW1iZXIgb2YgbXVsdGljYXN0IGFkZHJlc3NlcyB0byBmaWx0ZXIgKHZzLiByeC1hbGwtbXVsdGljYXN0KS4KKyAqLworc3RhdGljIGNvbnN0IGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gMzI7CisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCBhcmUgc2V0IGF0IGNvbXBpbGUgdGltZS4gKi8KKworLyogS2VlcCB0aGUgcmluZyBzaXplcyBhIHBvd2VyIG9mIHR3byBmb3IgY29tcGlsZSBlZmZpY2llbmN5LgorICogVGhlIGNvbXBpbGVyIHdpbGwgY29udmVydCA8dW5zaWduZWQ+JyUnPDJeTj4gaW50byBhIGJpdCBtYXNrLgorICogTWFraW5nIHRoZSBUeCByaW5nIHRvbyBsYXJnZSBkZWNyZWFzZXMgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgY2hhbm5lbAorICogYm9uZGluZyBhbmQgcGFja2V0IHByaW9yaXR5LgorICogVGhlcmUgYXJlIG5vIGlsbCBlZmZlY3RzIGZyb20gdG9vLWxhcmdlIHJlY2VpdmUgcmluZ3MuCisgKgorICogV2UgZG9uJ3QgY3VycmVudGx5IHVzZSB0aGUgSGkgVHggcmluZyBzbywgZG9uJ3QgbWFrZSBpdCB2ZXJ5IGJpZy4KKyAqCisgKiBCZXdhcmUgdGhhdCBpZiB3ZSBzdGFydCB1c2luZyB0aGUgSGkgVHggcmluZywgd2Ugd2lsbCBuZWVkIHRvIGNoYW5nZQorICogdHlwaG9vbl9udW1fZnJlZV90eCgpIGFuZCB0eXBob29uX3R4X2NvbXBsZXRlKCkgdG8gYWNjb3VudCBmb3IgdGhhdC4KKyAqLworI2RlZmluZSBUWEhJX0VOVFJJRVMJCTIKKyNkZWZpbmUgVFhMT19FTlRSSUVTCQkxMjgKKyNkZWZpbmUgUlhfRU5UUklFUwkJMzIKKyNkZWZpbmUgQ09NTUFORF9FTlRSSUVTCQkxNgorI2RlZmluZSBSRVNQT05TRV9FTlRSSUVTCTMyCisKKyNkZWZpbmUgQ09NTUFORF9SSU5HX1NJWkUJKENPTU1BTkRfRU5UUklFUyAqIHNpemVvZihzdHJ1Y3QgY21kX2Rlc2MpKQorI2RlZmluZSBSRVNQT05TRV9SSU5HX1NJWkUJKFJFU1BPTlNFX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IHJlc3BfZGVzYykpCisKKy8qIFRoZSAzWFAgd2lsbCBwcmVsb2FkIGFuZCByZW1vdmUgNjQgZW50cmllcyBmcm9tIHRoZSBmcmVlIGJ1ZmZlcgorICogbGlzdCwgYW5kIHdlIG5lZWQgb25lIGVudHJ5IHRvIGtlZXAgdGhlIHJpbmcgZnJvbSB3cmFwcGluZywgc28gCisgKiB0byBrZWVwIHRoaXMgYSBwb3dlciBvZiB0d28sIHdlIHVzZSAxMjggZW50cmllcy4KKyAqLworI2RlZmluZSBSWEZSRUVfRU5UUklFUwkJMTI4CisjZGVmaW5lIFJYRU5UX0VOVFJJRVMJCShSWEZSRUVfRU5UUklFUyAtIDEpCisKKy8qIE9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgdGhhdCB1c3VhbGx5IGFyZSBub3QgY2hhbmdlZC4gKi8KKworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAoMipIWikKKworI2RlZmluZSBQS1RfQlVGX1NaCQkxNTM2CisKKyNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkidHlwaG9vbiIKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OIAkiMS41LjciCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiMDUvMDEvMDciCisjZGVmaW5lIFBGWAkJCURSVl9NT0RVTEVfTkFNRSAiOiAiCisjZGVmaW5lIEVSUl9QRlgJCQlLRVJOX0VSUiBQRlgKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8YXNtL2NoZWNrc3VtLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlICJ0eXBob29uLmgiCisjaW5jbHVkZSAidHlwaG9vbi1maXJtd2FyZS5oIgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CisgICAgInR5cGhvb24uYzogdmVyc2lvbiAiIERSVl9NT0RVTEVfVkVSU0lPTiAiICgiIERSVl9NT0RVTEVfUkVMREFURSAiKVxuIjsKKworTU9EVUxFX0FVVEhPUigiRGF2aWQgRGlsbG93IDxkYXZlQHRoZWRpbGxvd3Mub3JnPiIpOworTU9EVUxFX1ZFUlNJT04oRFJWX01PRFVMRV9WRVJTSU9OKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiM0NvbSBUeXBob29uIEZhbWlseSAoM0M5OTAsIDNDUjk5MCwgYW5kIHZhcmlhbnRzKSIpOworTU9EVUxFX1BBUk1fREVTQyhyeF9jb3B5YnJlYWssICJQYWNrZXRzIHNtYWxsZXIgdGhhbiB0aGlzIGFyZSBjb3BpZWQgYW5kICIKKwkJCSAgICAgICAidGhlIGJ1ZmZlciBnaXZlbiBiYWNrIHRvIHRoZSBOSUMuIERlZmF1bHQgIgorCQkJICAgICAgICJpcyAyMDAuIik7CitNT0RVTEVfUEFSTV9ERVNDKHVzZV9tbWlvLCAiVXNlIE1NSU8gKDEpIG9yIFBJTygwKSB0byBhY2Nlc3MgdGhlIE5JQy4gIgorCQkJICAgIkRlZmF1bHQgaXMgdG8gdHJ5IE1NSU8gYW5kIGZhbGxiYWNrIHRvIFBJTy4iKTsKK21vZHVsZV9wYXJhbShyeF9jb3B5YnJlYWssIGludCwgMCk7Cittb2R1bGVfcGFyYW0odXNlX21taW8sIGludCwgMCk7CisKKyNpZiBkZWZpbmVkKE5FVElGX0ZfVFNPKSAmJiBNQVhfU0tCX0ZSQUdTID4gMzIKKyN3YXJuaW5nIFR5cGhvb24gb25seSBzdXBwb3J0cyAzMiBlbnRyaWVzIGluIGl0cyBTRyBsaXN0IGZvciBUU08sIGRpc2FibGluZyBUU08KKyN1bmRlZiBORVRJRl9GX1RTTworI2VuZGlmCisKKyNpZiBUWExPX0VOVFJJRVMgPD0gKDIgKiBNQVhfU0tCX0ZSQUdTKQorI2Vycm9yIFRYIHJpbmcgdG9vIHNtYWxsIQorI2VuZGlmCisKK3N0cnVjdCB0eXBob29uX2NhcmRfaW5mbyB7CisJY2hhciAqbmFtZTsKKwlpbnQgY2FwYWJpbGl0aWVzOworfTsKKworI2RlZmluZSBUWVBIT09OX0NSWVBUT19OT05FCQkweDAwCisjZGVmaW5lIFRZUEhPT05fQ1JZUFRPX0RFUwkJMHgwMQorI2RlZmluZSBUWVBIT09OX0NSWVBUT18zREVTCQkweDAyCisjZGVmaW5lCVRZUEhPT05fQ1JZUFRPX1ZBUklBQkxFCQkweDA0CisjZGVmaW5lIFRZUEhPT05fRklCRVIJCQkweDA4CisjZGVmaW5lIFRZUEhPT05fV0FLRVVQX05FRURTX1JFU0VUCTB4MTAKKworZW51bSB0eXBob29uX2NhcmRzIHsKKwlUWVBIT09OX1RYID0gMCwgVFlQSE9PTl9UWDk1LCBUWVBIT09OX1RYOTcsIFRZUEhPT05fU1ZSLAorCVRZUEhPT05fU1ZSOTUsIFRZUEhPT05fU1ZSOTcsIFRZUEhPT05fVFhNLCBUWVBIT09OX0JTVlIsCisJVFlQSE9PTl9GWDk1LCBUWVBIT09OX0ZYOTcsIFRZUEhPT05fRlg5NVNWUiwgVFlQSE9PTl9GWDk3U1ZSLAorCVRZUEhPT05fRlhNLAorfTsKKworLyogZGlyZWN0bHkgaW5kZXhlZCBieSBlbnVtIHR5cGhvb25fY2FyZHMsIGFib3ZlICovCitzdGF0aWMgc3RydWN0IHR5cGhvb25fY2FyZF9pbmZvIHR5cGhvb25fY2FyZF9pbmZvW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7ICIzQ29tIFR5cGhvb24gKDNDOTkwLVRYKSIsCisJCVRZUEhPT05fQ1JZUFRPX05PTkV9LAorCXsgIjNDb20gVHlwaG9vbiAoM0NSOTkwLVRYLTk1KSIsCisJCVRZUEhPT05fQ1JZUFRPX0RFU30sCisJeyAiM0NvbSBUeXBob29uICgzQ1I5OTAtVFgtOTcpIiwKKwkgCVRZUEhPT05fQ1JZUFRPX0RFUyB8IFRZUEhPT05fQ1JZUFRPXzNERVN9LAorCXsgIjNDb20gVHlwaG9vbiAoM0M5OTBTVlIpIiwKKwkJVFlQSE9PTl9DUllQVE9fTk9ORX0sCisJeyAiM0NvbSBUeXBob29uICgzQ1I5OTBTVlI5NSkiLAorCQlUWVBIT09OX0NSWVBUT19ERVN9LAorCXsgIjNDb20gVHlwaG9vbiAoM0NSOTkwU1ZSOTcpIiwKKwkgCVRZUEhPT05fQ1JZUFRPX0RFUyB8IFRZUEhPT05fQ1JZUFRPXzNERVN9LAorCXsgIjNDb20gVHlwaG9vbjIgKDNDOTkwQi1UWC1NKSIsCisJCVRZUEhPT05fQ1JZUFRPX1ZBUklBQkxFfSwKKwl7ICIzQ29tIFR5cGhvb24yICgzQzk5MEJTVlIpIiwKKwkJVFlQSE9PTl9DUllQVE9fVkFSSUFCTEV9LAorCXsgIjNDb20gVHlwaG9vbiAoM0NSOTkwLUZYLTk1KSIsCisJCVRZUEhPT05fQ1JZUFRPX0RFUyB8IFRZUEhPT05fRklCRVJ9LAorCXsgIjNDb20gVHlwaG9vbiAoM0NSOTkwLUZYLTk3KSIsCisJIAlUWVBIT09OX0NSWVBUT19ERVMgfCBUWVBIT09OX0NSWVBUT18zREVTIHwgVFlQSE9PTl9GSUJFUn0sCisJeyAiM0NvbSBUeXBob29uICgzQ1I5OTAtRlgtOTUgU2VydmVyKSIsCisJIAlUWVBIT09OX0NSWVBUT19ERVMgfCBUWVBIT09OX0ZJQkVSfSwKKwl7ICIzQ29tIFR5cGhvb24gKDNDUjk5MC1GWC05NyBTZXJ2ZXIpIiwKKwkgCVRZUEhPT05fQ1JZUFRPX0RFUyB8IFRZUEhPT05fQ1JZUFRPXzNERVMgfCBUWVBIT09OX0ZJQkVSfSwKKwl7ICIzQ29tIFR5cGhvb24yICgzQzk5MEItRlgtOTcpIiwKKwkJVFlQSE9PTl9DUllQVE9fVkFSSUFCTEUgfCBUWVBIT09OX0ZJQkVSfSwKK307CisKKy8qIE5vdGVzIG9uIHRoZSBuZXcgc3Vic3lzdGVtIG51bWJlcmluZyBzY2hlbWU6CisgKiBiaXRzIDAtMSBpbmRpY2F0ZSBjcnlwdG8gY2FwYWJpbGl0ZXM6ICgwKSB2YXJpYWJsZSwgKDEpIERFUywgb3IgKDIpIDNERVMKKyAqIGJpdCA0IGluZGljYXRlcyBpZiB0aGlzIGNhcmQgaGFzIHNlY3VyZWQgZmlybXdhcmUgKHdlIGRvbid0IHN1cHBvcnQgaXQpCisgKiBiaXQgOCBpbmRpY2F0ZXMgaWYgdGhpcyBpcyBhICgwKSBjb3BwZXIgb3IgKDEpIGZpYmVyIGNhcmQKKyAqIGJpdHMgMTItMTYgaW5kaWNhdGUgY2FyZCB0eXBlOiAoMCkgY2xpZW50IGFuZCAoMSkgc2VydmVyCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0eXBob29uX3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgUENJX0RFVklDRV9JRF8zQ09NXzNDUjk5MCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsVFlQSE9PTl9UWCB9LAorCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCBQQ0lfREVWSUNFX0lEXzNDT01fM0NSOTkwX1RYXzk1LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgVFlQSE9PTl9UWDk1IH0sCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIFBDSV9ERVZJQ0VfSURfM0NPTV8zQ1I5OTBfVFhfOTcsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBUWVBIT09OX1RYOTcgfSwKKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgUENJX0RFVklDRV9JRF8zQ09NXzNDUjk5MEIsCisJICBQQ0lfQU5ZX0lELCAweDEwMDAsIDAsIDAsIFRZUEhPT05fVFhNIH0sCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIFBDSV9ERVZJQ0VfSURfM0NPTV8zQ1I5OTBCLAorCSAgUENJX0FOWV9JRCwgMHgxMTAyLCAwLCAwLCBUWVBIT09OX0ZYTSB9LAorCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCBQQ0lfREVWSUNFX0lEXzNDT01fM0NSOTkwQiwKKwkgIFBDSV9BTllfSUQsIDB4MjAwMCwgMCwgMCwgVFlQSE9PTl9CU1ZSIH0sCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIFBDSV9ERVZJQ0VfSURfM0NPTV8zQ1I5OTBfRlgsCisJICBQQ0lfQU5ZX0lELCAweDExMDEsIDAsIDAsIFRZUEhPT05fRlg5NSB9LAorCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCBQQ0lfREVWSUNFX0lEXzNDT01fM0NSOTkwX0ZYLAorCSAgUENJX0FOWV9JRCwgMHgxMTAyLCAwLCAwLCBUWVBIT09OX0ZYOTcgfSwKKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgUENJX0RFVklDRV9JRF8zQ09NXzNDUjk5MF9GWCwKKwkgIFBDSV9BTllfSUQsIDB4MjEwMSwgMCwgMCwgVFlQSE9PTl9GWDk1U1ZSIH0sCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIFBDSV9ERVZJQ0VfSURfM0NPTV8zQ1I5OTBfRlgsCisJICBQQ0lfQU5ZX0lELCAweDIxMDIsIDAsIDAsIFRZUEhPT05fRlg5N1NWUiB9LAorCXsgUENJX1ZFTkRPUl9JRF8zQ09NLCBQQ0lfREVWSUNFX0lEXzNDT01fM0NSOTkwU1ZSOTUsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBUWVBIT09OX1NWUjk1IH0sCisJeyBQQ0lfVkVORE9SX0lEXzNDT00sIFBDSV9ERVZJQ0VfSURfM0NPTV8zQ1I5OTBTVlI5NywKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFRZUEhPT05fU1ZSOTcgfSwKKwl7IFBDSV9WRU5ET1JfSURfM0NPTSwgUENJX0RFVklDRV9JRF8zQ09NXzNDUjk5MFNWUiwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFRZUEhPT05fU1ZSIH0sCisJeyAwLCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHR5cGhvb25fcGNpX3RibCk7CisKKy8qIERlZmluZSB0aGUgc2hhcmVkIG1lbW9yeSBhcmVhCisgKiBBbGlnbiBldmVyeXRoaW5nIHRoZSAzWFAgd2lsbCBub3JtYWxseSBiZSB1c2luZy4KKyAqIFdlJ2xsIG5lZWQgdG8gbW92ZS9hbGlnbiB0eEhpIGlmIHdlIHN0YXJ0IHVzaW5nIHRoYXQgcmluZy4KKyAqLworI2RlZmluZSBfXzN4cF9hbGlnbmVkCV9fX19jYWNoZWxpbmVfYWxpZ25lZAorc3RydWN0IHR5cGhvb25fc2hhcmVkIHsKKwlzdHJ1Y3QgdHlwaG9vbl9pbnRlcmZhY2UJaWZhY2U7CisJc3RydWN0IHR5cGhvb25faW5kZXhlcwkJaW5kZXhlcwkJCV9fM3hwX2FsaWduZWQ7CisJc3RydWN0IHR4X2Rlc2MJCQl0eExvW1RYTE9fRU5UUklFU10gCV9fM3hwX2FsaWduZWQ7CisJc3RydWN0IHJ4X2Rlc2MJCQlyeExvW1JYX0VOVFJJRVNdCV9fM3hwX2FsaWduZWQ7CisJc3RydWN0IHJ4X2Rlc2MJCQlyeEhpW1JYX0VOVFJJRVNdCV9fM3hwX2FsaWduZWQ7CisJc3RydWN0IGNtZF9kZXNjCQkJY21kW0NPTU1BTkRfRU5UUklFU10JX18zeHBfYWxpZ25lZDsKKwlzdHJ1Y3QgcmVzcF9kZXNjCQlyZXNwW1JFU1BPTlNFX0VOVFJJRVNdCV9fM3hwX2FsaWduZWQ7CisJc3RydWN0IHJ4X2ZyZWUJCQlyeEJ1ZmZbUlhGUkVFX0VOVFJJRVNdCV9fM3hwX2FsaWduZWQ7CisJdTMyCQkJCXplcm9Xb3JkOworCXN0cnVjdCB0eF9kZXNjCQkJdHhIaVtUWEhJX0VOVFJJRVNdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCByeGJ1ZmZfZW50IHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWRtYV9hZGRyX3QJZG1hX2FkZHI7Cit9OworCitzdHJ1Y3QgdHlwaG9vbiB7CisJLyogVHggY2FjaGUgbGluZSBzZWN0aW9uICovCisJc3RydWN0IHRyYW5zbWl0X3JpbmcgCXR4TG9SaW5nCV9fX19jYWNoZWxpbmVfYWxpZ25lZDsJCisJc3RydWN0IHBjaV9kZXYgKgl0eF9wZGV2OworCXZvaWQgX19pb21lbQkJKnR4X2lvYWRkcjsKKwl1MzIJCQl0eGxvX2RtYV9hZGRyOworCisJLyogSXJxL1J4IGNhY2hlIGxpbmUgc2VjdGlvbiAqLworCXZvaWQgX19pb21lbQkJKmlvYWRkcgkJX19fX2NhY2hlbGluZV9hbGlnbmVkOworCXN0cnVjdCB0eXBob29uX2luZGV4ZXMgKmluZGV4ZXM7CisJdTgJCQlhd2FpdGluZ19yZXNwOworCXU4CQkJZHVwbGV4OworCXU4CQkJc3BlZWQ7CisJdTgJCQljYXJkX3N0YXRlOworCXN0cnVjdCBiYXNpY19yaW5nCXJ4TG9SaW5nOworCXN0cnVjdCBwY2lfZGV2ICoJcGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqCWRldjsKKwlzcGlubG9ja190CQlzdGF0ZV9sb2NrOworCXN0cnVjdCB2bGFuX2dyb3VwICoJdmxncnA7CisJc3RydWN0IGJhc2ljX3JpbmcJcnhIaVJpbmc7CisJc3RydWN0IGJhc2ljX3JpbmcJcnhCdWZmUmluZzsKKwlzdHJ1Y3QgcnhidWZmX2VudAlyeGJ1ZmZlcnNbUlhFTlRfRU5UUklFU107CisKKwkvKiBnZW5lcmFsIHNlY3Rpb24gKi8KKwlzcGlubG9ja190CQljb21tYW5kX2xvY2sJX19fX2NhY2hlbGluZV9hbGlnbmVkOworCXN0cnVjdCBiYXNpY19yaW5nCWNtZFJpbmc7CisJc3RydWN0IGJhc2ljX3JpbmcJcmVzcFJpbmc7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHNfc2F2ZWQ7CisJY29uc3QgY2hhciAqCQluYW1lOworCXN0cnVjdCB0eXBob29uX3NoYXJlZCAqCXNoYXJlZDsKKwlkbWFfYWRkcl90CQlzaGFyZWRfZG1hOworCXUxNgkJCXhjdnJfc2VsZWN0OworCXUxNgkJCXdvbF9ldmVudHM7CisJdTMyCQkJb2ZmbG9hZDsKKworCS8qIHVudXNlZCBzdHVmZiAoZnV0dXJlIHVzZSkgKi8KKwlpbnQJCQljYXBhYmlsaXRpZXM7CisJc3RydWN0IHRyYW5zbWl0X3JpbmcgCXR4SGlSaW5nOworfTsKKworZW51bSBjb21wbGV0aW9uX3dhaXRfdmFsdWVzIHsKKwlOb1dhaXQgPSAwLCBXYWl0Tm9TbGVlcCwgV2FpdFNsZWVwLAorfTsKKworLyogVGhlc2UgYXJlIHRoZSB2YWx1ZXMgZm9yIHRoZSB0eXBob29uLmNhcmRfc3RhdGUgdmFyaWFibGUuCisgKiBUaGVzZSBkZXRlcm1pbmUgd2hlcmUgdGhlIHN0YXRpc3RpY3Mgd2lsbCBjb21lIGZyb20gaW4gZ2V0X3N0YXRzKCkuCisgKiBUaGUgc2xlZXAgaW1hZ2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3RhdGlzdGljcyB3ZSBuZWVkLgorICovCitlbnVtIHN0YXRlX3ZhbHVlcyB7CisJU2xlZXBpbmcgPSAwLCBSdW5uaW5nLAorfTsKKworLyogUENJIHdyaXRlcyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgcG9zdGVkIGluIG9yZGVyLCBidXQgb3V0c3RhbmRpbmcgd3JpdGVzCisgKiBjYW5ub3QgcGFzcyBhIHJlYWQsIHNvIHRoaXMgZm9yY2VzIGN1cnJlbnQgd3JpdGVzIHRvIHBvc3QuCisgKi8KKyNkZWZpbmUgdHlwaG9vbl9wb3N0X3BjaV93cml0ZXMoeCkgXAorCWRvIHsgaWYobGlrZWx5KHVzZV9tbWlvKSkgaW9yZWFkMzIoeCtUWVBIT09OX1JFR19IRUFSVEJFQVQpOyB9IHdoaWxlKDApCisKKy8qIFdlJ2xsIHdhaXQgdXAgdG8gc2l4IHNlY29uZHMgZm9yIGEgcmVzZXQsIGFuZCBoYWxmIGEgc2Vjb25kIG5vcm1hbGx5LgorICovCisjZGVmaW5lIFRZUEhPT05fVURFTEFZCQkJNTAKKyNkZWZpbmUgVFlQSE9PTl9SRVNFVF9USU1FT1VUX1NMRUVQCSg2ICogSFopCisjZGVmaW5lIFRZUEhPT05fUkVTRVRfVElNRU9VVF9OT1NMRUVQCSgoNiAqIDEwMDAwMDApIC8gVFlQSE9PTl9VREVMQVkpCisjZGVmaW5lIFRZUEhPT05fV0FJVF9USU1FT1VUCQkoKDEwMDAwMDAgLyAyKSAvIFRZUEhPT05fVURFTEFZKQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiwgNSwgMjgpCisjZGVmaW5lIHR5cGhvb25fc3luY2hyb25pemVfaXJxKHgpIHN5bmNocm9uaXplX2lycSgpCisjZWxzZQorI2RlZmluZSB0eXBob29uX3N5bmNocm9uaXplX2lycSh4KSBzeW5jaHJvbml6ZV9pcnEoeCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChORVRJRl9GX1RTTykKKyNkZWZpbmUgc2tiX3Rzb19zaXplKHgpCQkoc2tiX3NoaW5mbyh4KS0+dHNvX3NpemUpCisjZGVmaW5lIFRTT19OVU1fREVTQ1JJUFRPUlMJMgorI2RlZmluZSBUU09fT0ZGTE9BRF9PTgkJVFlQSE9PTl9PRkZMT0FEX1RDUF9TRUdNRU5UCisjZWxzZQorI2RlZmluZSBORVRJRl9GX1RTTyAJCTAKKyNkZWZpbmUgc2tiX3Rzb19zaXplKHgpIAkwCisjZGVmaW5lIFRTT19OVU1fREVTQ1JJUFRPUlMJMAorI2RlZmluZSBUU09fT0ZGTE9BRF9PTgkJMAorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZAordHlwaG9vbl9pbmNfaW5kZXgodTMyICppbmRleCwgY29uc3QgaW50IGNvdW50LCBjb25zdCBpbnQgbnVtX2VudHJpZXMpCit7CisJLyogSW5jcmVtZW50IGEgcmluZyBpbmRleCAtLSB3ZSBjYW4gdXNlIHRoaXMgZm9yIGFsbCByaW5ncyBleGVjZXB0CisJICogdGhlIFJ4IHJpbmdzLCBhcyB0aGV5IHVzZSBkaWZmZXJlbnQgc2l6ZSBkZXNjcmlwdG9ycworCSAqIG90aGVyd2lzZSwgZXZlcnl0aGluZyBpcyB0aGUgc2FtZSBzaXplIGFzIGEgY21kX2Rlc2MKKwkgKi8KKwkqaW5kZXggKz0gY291bnQgKiBzaXplb2Yoc3RydWN0IGNtZF9kZXNjKTsKKwkqaW5kZXggJT0gbnVtX2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IGNtZF9kZXNjKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit0eXBob29uX2luY19jbWRfaW5kZXgodTMyICppbmRleCwgY29uc3QgaW50IGNvdW50KQoreworCXR5cGhvb25faW5jX2luZGV4KGluZGV4LCBjb3VudCwgQ09NTUFORF9FTlRSSUVTKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit0eXBob29uX2luY19yZXNwX2luZGV4KHUzMiAqaW5kZXgsIGNvbnN0IGludCBjb3VudCkKK3sKKwl0eXBob29uX2luY19pbmRleChpbmRleCwgY291bnQsIFJFU1BPTlNFX0VOVFJJRVMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3R5cGhvb25faW5jX3J4ZnJlZV9pbmRleCh1MzIgKmluZGV4LCBjb25zdCBpbnQgY291bnQpCit7CisJdHlwaG9vbl9pbmNfaW5kZXgoaW5kZXgsIGNvdW50LCBSWEZSRUVfRU5UUklFUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordHlwaG9vbl9pbmNfdHhfaW5kZXgodTMyICppbmRleCwgY29uc3QgaW50IGNvdW50KQoreworCS8qIGlmIHdlIHN0YXJ0IHVzaW5nIHRoZSBIaSBUeCByaW5nLCB0aGlzIG5lZWRzIHVwZGF0ZWluZyAqLworCXR5cGhvb25faW5jX2luZGV4KGluZGV4LCBjb3VudCwgVFhMT19FTlRSSUVTKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit0eXBob29uX2luY19yeF9pbmRleCh1MzIgKmluZGV4LCBjb25zdCBpbnQgY291bnQpCit7CisJLyogc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSAhPSBzaXplb2Yoc3RydWN0IGNtZF9kZXNjKSAqLworCSppbmRleCArPSBjb3VudCAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYyk7CisJKmluZGV4ICU9IFJYX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX3Jlc2V0KHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgd2FpdF90eXBlKQoreworCWludCBpLCBlcnIgPSAwOworCWludCB0aW1lb3V0OworCisJaWYod2FpdF90eXBlID09IFdhaXROb1NsZWVwKQorCQl0aW1lb3V0ID0gVFlQSE9PTl9SRVNFVF9USU1FT1VUX05PU0xFRVA7CisJZWxzZQorCQl0aW1lb3V0ID0gVFlQSE9PTl9SRVNFVF9USU1FT1VUX1NMRUVQOworCisJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9BTEwsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfTUFTSyk7CisJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9BTEwsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfU1RBVFVTKTsKKworCWlvd3JpdGUzMihUWVBIT09OX1JFU0VUX0FMTCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfU09GVF9SRVNFVCk7CisJdHlwaG9vbl9wb3N0X3BjaV93cml0ZXMoaW9hZGRyKTsKKwl1ZGVsYXkoMSk7CisJaW93cml0ZTMyKFRZUEhPT05fUkVTRVRfTk9ORSwgaW9hZGRyICsgVFlQSE9PTl9SRUdfU09GVF9SRVNFVCk7CisKKwlpZih3YWl0X3R5cGUgIT0gTm9XYWl0KSB7CisJCWZvcihpID0gMDsgaSA8IHRpbWVvdXQ7IGkrKykgeworCQkJaWYoaW9yZWFkMzIoaW9hZGRyICsgVFlQSE9PTl9SRUdfU1RBVFVTKSA9PQorCQkJICAgVFlQSE9PTl9TVEFUVVNfV0FJVElOR19GT1JfSE9TVCkKKwkJCQlnb3RvIG91dDsKKworCQkJaWYod2FpdF90eXBlID09IFdhaXRTbGVlcCkgeworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQkJfSBlbHNlCisJCQkJdWRlbGF5KFRZUEhPT05fVURFTEFZKTsKKwkJfQorCisJCWVyciA9IC1FVElNRURPVVQ7CisJfQorCitvdXQ6CisJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9BTEwsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfTUFTSyk7CisJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9BTEwsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfU1RBVFVTKTsKKworCS8qIFRoZSAzWFAgc2VlbXMgdG8gbmVlZCBhIGxpdHRsZSBleHRyYSB0aW1lIHRvIGNvbXBsZXRlIHRoZSBsb2FkCisJICogb2YgdGhlIHNsZWVwIGltYWdlIGJlZm9yZSB3ZSBjYW4gcmVsaWFibHkgYm9vdCBpdC4gRmFpbHVyZSB0bworCSAqIGRvIHRoaXMgb2NjYXNpb25hbGx5IHJlc3VsdHMgaW4gYSBodW5nIGFkYXB0ZXIgYWZ0ZXIgYm9vdCBpbgorCSAqIHR5cGhvb25faW5pdF9vbmUoKSB3aGlsZSB0cnlpbmcgdG8gcmVhZCB0aGUgTUFDIGFkZHJlc3Mgb3IKKwkgKiBwdXR0aW5nIHRoZSBjYXJkIHRvIHNsZWVwLiAzQ29tJ3MgZHJpdmVyIHdhaXRzIDVtcywgYnV0CisJICogdGhhdCBzZWVtcyB0byBiZSBvdmVya2lsbC4gSG93ZXZlciwgaWYgd2UgY2FuIHNsZWVwLCB3ZSBtaWdodAorCSAqIGFzIHdlbGwgZ2l2ZSBpdCB0aGF0IG11Y2ggdGltZS4gT3RoZXJ3aXNlLCB3ZSdsbCBnaXZlIGl0IDUwMHVzLAorCSAqIHdoaWNoIHNob3VsZCBiZSBlbm91Z2ggKEkndmUgc2VlIGl0IHdvcmsgd2VsbCBhdCAxMDB1cywgYnV0IHN0aWxsCisJICogc2F3IG9jY2FzaW9uYWwgcHJvYmxlbXMuKQorCSAqLworCWlmKHdhaXRfdHlwZSA9PSBXYWl0U2xlZXApCisJCW1zbGVlcCg1KTsKKwllbHNlCisJCXVkZWxheSg1MDApOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK3R5cGhvb25fd2FpdF9zdGF0dXModm9pZCBfX2lvbWVtICppb2FkZHIsIHUzMiB3YWl0X3ZhbHVlKQoreworCWludCBpLCBlcnIgPSAwOworCisJZm9yKGkgPSAwOyBpIDwgVFlQSE9PTl9XQUlUX1RJTUVPVVQ7IGkrKykgeworCQlpZihpb3JlYWQzMihpb2FkZHIgKyBUWVBIT09OX1JFR19TVEFUVVMpID09IHdhaXRfdmFsdWUpCisJCQlnb3RvIG91dDsKKwkJdWRlbGF5KFRZUEhPT05fVURFTEFZKTsKKwl9CisKKwllcnIgPSAtRVRJTUVET1VUOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit0eXBob29uX21lZGlhX3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcmVzcF9kZXNjICpyZXNwKQoreworCWlmKHJlc3AtPnBhcm0xICYgVFlQSE9PTl9NRURJQV9TVEFUX05PX0xJTkspCisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJZWxzZQorCQluZXRpZl9jYXJyaWVyX29uKGRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordHlwaG9vbl9oZWxsbyhzdHJ1Y3QgdHlwaG9vbiAqdHApCit7CisJc3RydWN0IGJhc2ljX3JpbmcgKnJpbmcgPSAmdHAtPmNtZFJpbmc7CisJc3RydWN0IGNtZF9kZXNjICpjbWQ7CisKKwkvKiBXZSBvbmx5IGdldCBhIGhlbGxvIHJlcXVlc3QgaWYgd2UndmUgbm90IHNlbnQgYW55dGhpbmcgdG8gdGhlCisJICogY2FyZCBpbiBhIGxvbmcgd2hpbGUuIElmIHRoZSBsb2NrIGlzIGhlbGQsIHRoZW4gd2UncmUgaW4gdGhlCisJICogcHJvY2VzcyBvZiBpc3N1aW5nIGEgY29tbWFuZCwgc28gd2UgZG9uJ3QgbmVlZCB0byByZXNwb25kLgorCSAqLworCWlmKHNwaW5fdHJ5bG9jaygmdHAtPmNvbW1hbmRfbG9jaykpIHsKKwkJY21kID0gKHN0cnVjdCBjbWRfZGVzYyAqKShyaW5nLT5yaW5nQmFzZSArIHJpbmctPmxhc3RXcml0ZSk7CisJCXR5cGhvb25faW5jX2NtZF9pbmRleCgmcmluZy0+bGFzdFdyaXRlLCAxKTsKKworCQlJTklUX0NPTU1BTkRfTk9fUkVTUE9OU0UoY21kLCBUWVBIT09OX0NNRF9IRUxMT19SRVNQKTsKKwkJc21wX3dtYigpOworCQlpb3dyaXRlMzIocmluZy0+bGFzdFdyaXRlLCB0cC0+aW9hZGRyICsgVFlQSE9PTl9SRUdfQ01EX1JFQURZKTsKKwkJc3Bpbl91bmxvY2soJnRwLT5jb21tYW5kX2xvY2spOworCX0KK30KKworc3RhdGljIGludAordHlwaG9vbl9wcm9jZXNzX3Jlc3BvbnNlKHN0cnVjdCB0eXBob29uICp0cCwgaW50IHJlc3Bfc2l6ZSwKKwkJCQlzdHJ1Y3QgcmVzcF9kZXNjICpyZXNwX3NhdmUpCit7CisJc3RydWN0IHR5cGhvb25faW5kZXhlcyAqaW5kZXhlcyA9IHRwLT5pbmRleGVzOworCXN0cnVjdCByZXNwX2Rlc2MgKnJlc3A7CisJdTggKmJhc2UgPSB0cC0+cmVzcFJpbmcucmluZ0Jhc2U7CisJaW50IGNvdW50LCBsZW4sIHdyYXBfbGVuOworCXUzMiBjbGVhcmVkOworCXUzMiByZWFkeTsKKworCWNsZWFyZWQgPSBsZTMyX3RvX2NwdShpbmRleGVzLT5yZXNwQ2xlYXJlZCk7CisJcmVhZHkgPSBsZTMyX3RvX2NwdShpbmRleGVzLT5yZXNwUmVhZHkpOworCXdoaWxlKGNsZWFyZWQgIT0gcmVhZHkpIHsKKwkJcmVzcCA9IChzdHJ1Y3QgcmVzcF9kZXNjICopKGJhc2UgKyBjbGVhcmVkKTsKKwkJY291bnQgPSByZXNwLT5udW1EZXNjICsgMTsKKwkJaWYocmVzcF9zYXZlICYmIHJlc3AtPnNlcU5vKSB7CisJCQlpZihjb3VudCA+IHJlc3Bfc2l6ZSkgeworCQkJCXJlc3Bfc2F2ZS0+ZmxhZ3MgPSBUWVBIT09OX1JFU1BfRVJST1I7CisJCQkJZ290byBjbGVhbnVwOworCQkJfQorCisJCQl3cmFwX2xlbiA9IDA7CisJCQlsZW4gPSBjb3VudCAqIHNpemVvZigqcmVzcCk7CisJCQlpZih1bmxpa2VseShjbGVhcmVkICsgbGVuID4gUkVTUE9OU0VfUklOR19TSVpFKSkgeworCQkJCXdyYXBfbGVuID0gY2xlYXJlZCArIGxlbiAtIFJFU1BPTlNFX1JJTkdfU0laRTsKKwkJCQlsZW4gPSBSRVNQT05TRV9SSU5HX1NJWkUgLSBjbGVhcmVkOworCQkJfQorCisJCQltZW1jcHkocmVzcF9zYXZlLCByZXNwLCBsZW4pOworCQkJaWYodW5saWtlbHkod3JhcF9sZW4pKSB7CisJCQkJcmVzcF9zYXZlICs9IGxlbiAvIHNpemVvZigqcmVzcCk7CisJCQkJbWVtY3B5KHJlc3Bfc2F2ZSwgYmFzZSwgd3JhcF9sZW4pOworCQkJfQorCisJCQlyZXNwX3NhdmUgPSBOVUxMOworCQl9IGVsc2UgaWYocmVzcC0+Y21kID09IFRZUEhPT05fQ01EX1JFQURfTUVESUFfU1RBVFVTKSB7CisJCQl0eXBob29uX21lZGlhX3N0YXR1cyh0cC0+ZGV2LCByZXNwKTsKKwkJfSBlbHNlIGlmKHJlc3AtPmNtZCA9PSBUWVBIT09OX0NNRF9IRUxMT19SRVNQKSB7CisJCQl0eXBob29uX2hlbGxvKHRwKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGR1bXBpbmcgdW5leHBlY3RlZCByZXNwb25zZSAiCisJCQkgICAgICAgIjB4JTA0eDolZDoweCUwMng6MHglMDR4OiUwOHg6JTA4eFxuIiwKKwkJCSAgICAgICB0cC0+bmFtZSwgbGUxNl90b19jcHUocmVzcC0+Y21kKSwKKwkJCSAgICAgICByZXNwLT5udW1EZXNjLCByZXNwLT5mbGFncywKKwkJCSAgICAgICBsZTE2X3RvX2NwdShyZXNwLT5wYXJtMSksCisJCQkgICAgICAgbGUzMl90b19jcHUocmVzcC0+cGFybTIpLAorCQkJICAgICAgIGxlMzJfdG9fY3B1KHJlc3AtPnBhcm0zKSk7CisJCX0KKworY2xlYW51cDoKKwkJdHlwaG9vbl9pbmNfcmVzcF9pbmRleCgmY2xlYXJlZCwgY291bnQpOworCX0KKworCWluZGV4ZXMtPnJlc3BDbGVhcmVkID0gY3B1X3RvX2xlMzIoY2xlYXJlZCk7CisJd21iKCk7CisJcmV0dXJuIChyZXNwX3NhdmUgPT0gTlVMTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit0eXBob29uX251bV9mcmVlKGludCBsYXN0V3JpdGUsIGludCBsYXN0UmVhZCwgaW50IHJpbmdTaXplKQoreworCS8qIHRoaXMgd29ya3MgZm9yIGFsbCBkZXNjcmlwdG9ycyBidXQgcnhfZGVzYywgYXMgdGhleSBhcmUgYQorCSAqIGRpZmZlcmVudCBzaXplIHRoYW4gdGhlIGNtZF9kZXNjIC0tIGV2ZXJ5b25lIGVsc2UgaXMgdGhlIHNhbWUKKwkgKi8KKwlsYXN0V3JpdGUgLz0gc2l6ZW9mKHN0cnVjdCBjbWRfZGVzYyk7CisJbGFzdFJlYWQgLz0gc2l6ZW9mKHN0cnVjdCBjbWRfZGVzYyk7CisJcmV0dXJuIChyaW5nU2l6ZSArIGxhc3RSZWFkIC0gbGFzdFdyaXRlIC0gMSkgJSByaW5nU2l6ZTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3R5cGhvb25fbnVtX2ZyZWVfY21kKHN0cnVjdCB0eXBob29uICp0cCkKK3sKKwlpbnQgbGFzdFdyaXRlID0gdHAtPmNtZFJpbmcubGFzdFdyaXRlOworCWludCBjbWRDbGVhcmVkID0gbGUzMl90b19jcHUodHAtPmluZGV4ZXMtPmNtZENsZWFyZWQpOworCisJcmV0dXJuIHR5cGhvb25fbnVtX2ZyZWUobGFzdFdyaXRlLCBjbWRDbGVhcmVkLCBDT01NQU5EX0VOVFJJRVMpOworfQorCitzdGF0aWMgaW5saW5lIGludAordHlwaG9vbl9udW1fZnJlZV9yZXNwKHN0cnVjdCB0eXBob29uICp0cCkKK3sKKwlpbnQgcmVzcFJlYWR5ID0gbGUzMl90b19jcHUodHAtPmluZGV4ZXMtPnJlc3BSZWFkeSk7CisJaW50IHJlc3BDbGVhcmVkID0gbGUzMl90b19jcHUodHAtPmluZGV4ZXMtPnJlc3BDbGVhcmVkKTsKKworCXJldHVybiB0eXBob29uX251bV9mcmVlKHJlc3BSZWFkeSwgcmVzcENsZWFyZWQsIFJFU1BPTlNFX0VOVFJJRVMpOworfQorCitzdGF0aWMgaW5saW5lIGludAordHlwaG9vbl9udW1fZnJlZV90eChzdHJ1Y3QgdHJhbnNtaXRfcmluZyAqcmluZykKK3sKKwkvKiBpZiB3ZSBzdGFydCB1c2luZyB0aGUgSGkgVHggcmluZywgdGhpcyBuZWVkcyB1cGRhdGluZyAqLworCXJldHVybiB0eXBob29uX251bV9mcmVlKHJpbmctPmxhc3RXcml0ZSwgcmluZy0+bGFzdFJlYWQsIFRYTE9fRU5UUklFUyk7Cit9CisKK3N0YXRpYyBpbnQKK3R5cGhvb25faXNzdWVfY29tbWFuZChzdHJ1Y3QgdHlwaG9vbiAqdHAsIGludCBudW1fY21kLCBzdHJ1Y3QgY21kX2Rlc2MgKmNtZCwKKwkJICAgICAgaW50IG51bV9yZXNwLCBzdHJ1Y3QgcmVzcF9kZXNjICpyZXNwKQoreworCXN0cnVjdCB0eXBob29uX2luZGV4ZXMgKmluZGV4ZXMgPSB0cC0+aW5kZXhlczsKKwlzdHJ1Y3QgYmFzaWNfcmluZyAqcmluZyA9ICZ0cC0+Y21kUmluZzsKKwlzdHJ1Y3QgcmVzcF9kZXNjIGxvY2FsX3Jlc3A7CisJaW50IGksIGVyciA9IDA7CisJaW50IGdvdF9yZXNwOworCWludCBmcmVlQ21kLCBmcmVlUmVzcDsKKwlpbnQgbGVuLCB3cmFwX2xlbjsKKworCXNwaW5fbG9jaygmdHAtPmNvbW1hbmRfbG9jayk7CisKKwlmcmVlQ21kID0gdHlwaG9vbl9udW1fZnJlZV9jbWQodHApOworCWZyZWVSZXNwID0gdHlwaG9vbl9udW1fZnJlZV9yZXNwKHRwKTsKKworCWlmKGZyZWVDbWQgPCBudW1fY21kIHx8IGZyZWVSZXNwIDwgbnVtX3Jlc3ApIHsKKwkJcHJpbnRrKCIlczogbm8gZGVzY3MgZm9yIGNtZCwgaGFkIChuZWVkZWQpICVkICglZCkgY21kLCAiCisJCQkiJWQgKCVkKSByZXNwXG4iLCB0cC0+bmFtZSwgZnJlZUNtZCwgbnVtX2NtZCwKKwkJCWZyZWVSZXNwLCBudW1fcmVzcCk7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWlmKGNtZC0+ZmxhZ3MgJiBUWVBIT09OX0NNRF9SRVNQT05EKSB7CisJCS8qIElmIHdlJ3JlIGV4cGVjdGluZyBhIHJlc3BvbnNlLCBidXQgdGhlIGNhbGxlciBoYXNuJ3QgZ2l2ZW4KKwkJICogdXMgYSBwbGFjZSB0byBwdXQgaXQsIHdlJ2xsIHByb3ZpZGUgb25lLgorCQkgKi8KKwkJdHAtPmF3YWl0aW5nX3Jlc3AgPSAxOworCQlpZihyZXNwID09IE5VTEwpIHsKKwkJCXJlc3AgPSAmbG9jYWxfcmVzcDsKKwkJCW51bV9yZXNwID0gMTsKKwkJfQorCX0KKworCXdyYXBfbGVuID0gMDsKKwlsZW4gPSBudW1fY21kICogc2l6ZW9mKCpjbWQpOworCWlmKHVubGlrZWx5KHJpbmctPmxhc3RXcml0ZSArIGxlbiA+IENPTU1BTkRfUklOR19TSVpFKSkgeworCQl3cmFwX2xlbiA9IHJpbmctPmxhc3RXcml0ZSArIGxlbiAtIENPTU1BTkRfUklOR19TSVpFOworCQlsZW4gPSBDT01NQU5EX1JJTkdfU0laRSAtIHJpbmctPmxhc3RXcml0ZTsKKwl9CisKKwltZW1jcHkocmluZy0+cmluZ0Jhc2UgKyByaW5nLT5sYXN0V3JpdGUsIGNtZCwgbGVuKTsKKwlpZih1bmxpa2VseSh3cmFwX2xlbikpIHsKKwkJc3RydWN0IGNtZF9kZXNjICp3cmFwX3B0ciA9IGNtZDsKKwkJd3JhcF9wdHIgKz0gbGVuIC8gc2l6ZW9mKCpjbWQpOworCQltZW1jcHkocmluZy0+cmluZ0Jhc2UsIHdyYXBfcHRyLCB3cmFwX2xlbik7CisJfQorCisJdHlwaG9vbl9pbmNfY21kX2luZGV4KCZyaW5nLT5sYXN0V3JpdGUsIG51bV9jbWQpOworCisJLyogIkkgZmVlbCBhIHByZXNlbmNlLi4uIGFub3RoZXIgd2FycmlvciBpcyBvbiB0aGUgdGhlIG1lc2EuIgorCSAqLworCXdtYigpOworCWlvd3JpdGUzMihyaW5nLT5sYXN0V3JpdGUsIHRwLT5pb2FkZHIgKyBUWVBIT09OX1JFR19DTURfUkVBRFkpOworCXR5cGhvb25fcG9zdF9wY2lfd3JpdGVzKHRwLT5pb2FkZHIpOworCisJaWYoKGNtZC0+ZmxhZ3MgJiBUWVBIT09OX0NNRF9SRVNQT05EKSA9PSAwKQorCQlnb3RvIG91dDsKKworCS8qIFVnaC4gV2UnbGwgYmUgaGVyZSBhYm91dCA4bXMsIHNwaW5uaW5nIG91ciB0aHVtYnMsIHVuYWJsZSB0bworCSAqIHByZWVtcHQgb3IgZG8gYW55dGhpbmcgb3RoZXIgdGhhbiB0YWtlIGludGVycnVwdHMuIFNvLCBkb24ndAorCSAqIHdhaXQgZm9yIGEgcmVzcG9uc2UgdW5sZXNzIHlvdSBoYXZlIHRvLgorCSAqCisJICogSSd2ZSB0aG91Z2h0IGFib3V0IHRyeWluZyB0byBzbGVlcCBoZXJlLCBidXQgd2UncmUgY2FsbGVkCisJICogZnJvbSBtYW55IGNvbnRleHRzIHRoYXQgZG9uJ3QgYWxsb3cgdGhhdC4gQWxzbywgZ2l2ZW4gdGhlIHdheQorCSAqIDNDb20gaGFzIGltcGxlbWVudGVkIGlycSBjb2FsZXNjaW5nLCB3ZSB3b3VsZCBsaWtlbHkgdGltZW91dCAtLQorCSAqIHRoaXMgaGFzIGJlZW4gb2JzZXJ2ZWQgaW4gcmVhbCBsaWZlIQorCSAqCisJICogVGhlIGJpZyBraWxsZXIgaXMgd2UgaGF2ZSB0byB3YWl0IHRvIGdldCBzdGF0cyBmcm9tIHRoZSBjYXJkLAorCSAqIHRob3VnaCB3ZSBjb3VsZCBnbyB0byBhIHBlcmlvZGljIHJlZnJlc2ggb2YgdGhvc2UgaWYgd2UgZG9uJ3QKKwkgKiBtaW5kIHRoZW0gZ2V0dGluZyBzb21ld2hhdCBzdGFsZS4gVGhlIHJlc3Qgb2YgdGhlIHdhaXRpbmcKKwkgKiBjb21tYW5kcyBvY2N1ciBkdXJpbmcgb3Blbi9jbG9zZS9zdXNwZW5kL3Jlc3VtZSwgc28gdGhleSBhcmVuJ3QKKwkgKiB0aW1lIGNyaXRpY2FsLiBDcmVhdGluZyBTQXMgaW4gdGhlIGZ1dHVyZSB3aWxsIGFsc28gaGF2ZSB0bworCSAqIHdhaXQgaGVyZS4KKwkgKi8KKwlnb3RfcmVzcCA9IDA7CisJZm9yKGkgPSAwOyBpIDwgVFlQSE9PTl9XQUlUX1RJTUVPVVQgJiYgIWdvdF9yZXNwOyBpKyspIHsKKwkJaWYoaW5kZXhlcy0+cmVzcENsZWFyZWQgIT0gaW5kZXhlcy0+cmVzcFJlYWR5KQorCQkJZ290X3Jlc3AgPSB0eXBob29uX3Byb2Nlc3NfcmVzcG9uc2UodHAsIG51bV9yZXNwLAorCQkJCQkJCQlyZXNwKTsKKwkJdWRlbGF5KFRZUEhPT05fVURFTEFZKTsKKwl9CisKKwlpZighZ290X3Jlc3ApIHsKKwkJZXJyID0gLUVUSU1FRE9VVDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQ29sbGVjdCB0aGUgZXJyb3IgcmVzcG9uc2UgZXZlbiBpZiB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZQorCSAqIHJlc3Qgb2YgdGhlIHJlc3BvbnNlCisJICovCisJaWYocmVzcC0+ZmxhZ3MgJiBUWVBIT09OX1JFU1BfRVJST1IpCisJCWVyciA9IC1FSU87CisKK291dDoKKwlpZih0cC0+YXdhaXRpbmdfcmVzcCkgeworCQl0cC0+YXdhaXRpbmdfcmVzcCA9IDA7CisJCXNtcF93bWIoKTsKKworCQkvKiBVZ2guIElmIGEgcmVzcG9uc2Ugd2FzIGFkZGVkIHRvIHRoZSByaW5nIGJldHdlZW4KKwkJICogdGhlIGNhbGwgdG8gdHlwaG9vbl9wcm9jZXNzX3Jlc3BvbnNlKCkgYW5kIHRoZSBjbGVhcmluZworCQkgKiBvZiB0cC0+YXdhaXRpbmdfcmVzcCwgd2UgY291bGQgaGF2ZSBtaXNzZWQgdGhlIGludGVycnVwdAorCQkgKiBhbmQgaXQgY291bGQgaGFuZyBpbiB0aGUgcmluZyBhbiBpbmRldGVybWluYXRlIGFtb3VudCBvZgorCQkgKiB0aW1lLiBTbywgY2hlY2sgZm9yIGl0LCBhbmQgaW50ZXJydXB0IG91cnNlbHZlcyBpZiB0aGlzCisJCSAqIGlzIHRoZSBjYXNlLgorCQkgKi8KKwkJaWYoaW5kZXhlcy0+cmVzcENsZWFyZWQgIT0gaW5kZXhlcy0+cmVzcFJlYWR5KQorCQkJaW93cml0ZTMyKDEsIHRwLT5pb2FkZHIgKyBUWVBIT09OX1JFR19TRUxGX0lOVEVSUlVQVCk7CisJfQorCisJc3Bpbl91bmxvY2soJnRwLT5jb21tYW5kX2xvY2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkCit0eXBob29uX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKK3sKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBjbWRfZGVzYyB4cF9jbWQ7CisJaW50IGVycjsKKworCXNwaW5fbG9ja19iaCgmdHAtPnN0YXRlX2xvY2spOworCWlmKCF0cC0+dmxncnAgIT0gIWdycCkgeworCQkvKiBXZSd2ZSBlaXRoZXIgYmVlbiB0dXJuZWQgb24gZm9yIHRoZSBmaXJzdCB0aW1lLCBvciB3ZSd2ZQorCQkgKiBiZWVuIHR1cm5lZCBvZmYuIFVwZGF0ZSB0aGUgM1hQLgorCQkgKi8KKwkJaWYoZ3JwKQorCQkJdHAtPm9mZmxvYWQgfD0gVFlQSE9PTl9PRkZMT0FEX1ZMQU47CisJCWVsc2UKKwkJCXRwLT5vZmZsb2FkICY9IH5UWVBIT09OX09GRkxPQURfVkxBTjsKKworCQkvKiBJZiB0aGUgaW50ZXJmYWNlIGlzIHVwLCB0aGUgcnVudGltZSBpcyBydW5uaW5nIC0tIGFuZCB3ZQorCQkgKiBtdXN0IGJlIHVwIGZvciB0aGUgdmxhbiBjb3JlIHRvIGNhbGwgdXMuCisJCSAqCisJCSAqIERvIHRoZSBjb21tYW5kIG91dHNpZGUgb2YgdGhlIHNwaW4gbG9jaywgYXMgaXQgaXMgc2xvdy4KKwkJICovCisJCUlOSVRfQ09NTUFORF9XSVRIX1JFU1BPTlNFKCZ4cF9jbWQsCisJCQkJCVRZUEhPT05fQ01EX1NFVF9PRkZMT0FEX1RBU0tTKTsKKwkJeHBfY21kLnBhcm0yID0gdHAtPm9mZmxvYWQ7CisJCXhwX2NtZC5wYXJtMyA9IHRwLT5vZmZsb2FkOworCQlzcGluX3VubG9ja19iaCgmdHAtPnN0YXRlX2xvY2spOworCQllcnIgPSB0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCQlpZihlcnIgPCAwKQorCQkJcHJpbnRrKCIlczogdmxhbiBvZmZsb2FkIGVycm9yICVkXG4iLCB0cC0+bmFtZSwgLWVycik7CisJCXNwaW5fbG9ja19iaCgmdHAtPnN0YXRlX2xvY2spOworCX0KKworCS8qIG5vdyBtYWtlIHRoZSBjaGFuZ2UgdmlzaWJsZSAqLworCXRwLT52bGdycCA9IGdycDsKKwlzcGluX3VubG9ja19iaCgmdHAtPnN0YXRlX2xvY2spOworfQorCitzdGF0aWMgdm9pZAordHlwaG9vbl92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKK3sKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNwaW5fbG9ja19iaCgmdHAtPnN0YXRlX2xvY2spOworCWlmKHRwLT52bGdycCkKKwkJdHAtPnZsZ3JwLT52bGFuX2RldmljZXNbdmlkXSA9IE5VTEw7CisJc3Bpbl91bmxvY2tfYmgoJnRwLT5zdGF0ZV9sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit0eXBob29uX3Rzb19maWxsKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0cmFuc21pdF9yaW5nICp0eFJpbmcsCisJCQl1MzIgcmluZ19kbWEpCit7CisJc3RydWN0IHRjcG9wdF9kZXNjICp0Y3BkOworCXUzMiB0Y3BkX29mZnNldCA9IHJpbmdfZG1hOworCisJdGNwZCA9IChzdHJ1Y3QgdGNwb3B0X2Rlc2MgKikgKHR4UmluZy0+cmluZ0Jhc2UgKyB0eFJpbmctPmxhc3RXcml0ZSk7CisJdGNwZF9vZmZzZXQgKz0gdHhSaW5nLT5sYXN0V3JpdGU7CisJdGNwZF9vZmZzZXQgKz0gb2Zmc2V0b2Yoc3RydWN0IHRjcG9wdF9kZXNjLCBieXRlc1R4KTsKKwl0eXBob29uX2luY190eF9pbmRleCgmdHhSaW5nLT5sYXN0V3JpdGUsIDEpOworCisJdGNwZC0+ZmxhZ3MgPSBUWVBIT09OX09QVF9ERVNDIHwgVFlQSE9PTl9PUFRfVENQX1NFRzsKKwl0Y3BkLT5udW1EZXNjID0gMTsKKwl0Y3BkLT5tc3NfZmxhZ3MgPSBjcHVfdG9fbGUxNihza2JfdHNvX3NpemUoc2tiKSk7CisJdGNwZC0+bXNzX2ZsYWdzIHw9IFRZUEhPT05fVFNPX0ZJUlNUIHwgVFlQSE9PTl9UU09fTEFTVDsKKwl0Y3BkLT5yZXNwQWRkckxvID0gY3B1X3RvX2xlMzIodGNwZF9vZmZzZXQpOworCXRjcGQtPmJ5dGVzVHggPSBjcHVfdG9fbGUzMihza2ItPmxlbik7CisJdGNwZC0+c3RhdHVzID0gMDsKK30KKworc3RhdGljIGludAordHlwaG9vbl9zdGFydF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0eXBob29uICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHRyYW5zbWl0X3JpbmcgKnR4UmluZzsKKwlzdHJ1Y3QgdHhfZGVzYyAqdHhkLCAqZmlyc3RfdHhkOworCWRtYV9hZGRyX3Qgc2tiX2RtYTsKKwlpbnQgbnVtRGVzYzsKKworCS8qIHdlIGhhdmUgdHdvIHJpbmdzIHRvIGNob29zZSBmcm9tLCBidXQgd2Ugb25seSB1c2UgdHhMbyBmb3Igbm93CisJICogSWYgd2Ugc3RhcnQgdXNpbmcgdGhlIEhpIHJpbmcgYXMgd2VsbCwgd2UnbGwgbmVlZCB0byB1cGRhdGUKKwkgKiB0eXBob29uX3N0b3BfcnVudGltZSgpLCB0eXBob29uX2ludGVycnVwdCgpLCB0eXBob29uX251bV9mcmVlX3R4KCksCisJICogYW5kIFRYSElfRU5USVJFUyB0byBtYXRjaCwgYXMgd2VsbCBhcyB1cGRhdGUgdGhlIFRTTyBjb2RlIGJlbG93CisJICogdG8gZ2V0IHRoZSByaWdodCBETUEgYWRkcmVzcworCSAqLworCXR4UmluZyA9ICZ0cC0+dHhMb1Jpbmc7CisKKwkvKiBXZSBuZWVkIG9uZSBkZXNjcmlwdG9yIGZvciBlYWNoIGZyYWdtZW50IG9mIHRoZSBza19idWZmLCBwbHVzIHRoZQorCSAqIG9uZSBmb3IgdGhlIC0+ZGF0YSBhcmVhIG9mIGl0LgorCSAqCisJICogVGhlIGRvY3Mgc2F5IGEgbWF4aW11bSBvZiAxNiBmcmFnbWVudCBkZXNjcmlwdG9ycyBwZXIgVENQIG9wdGlvbgorCSAqIGRlc2NyaXB0b3IsIHRoZW4gbWFrZSBhIG5ldyBwYWNrZXQgZGVzY3JpcHRvciBhbmQgb3B0aW9uIGRlc2NyaXB0b3IKKwkgKiBmb3IgdGhlIG5leHQgMTYgZnJhZ21lbnRzLiBUaGUgZW5naW5lZXJzIHNheSBqdXN0IGFuIG9wdGlvbgorCSAqIGRlc2NyaXB0b3IgaXMgbmVlZGVkLiBJJ3ZlIHRlc3RlZCB1cCB0byAyNiBmcmFnbWVudHMgd2l0aCBhIHNpbmdsZQorCSAqIHBhY2tldCBkZXNjcmlwdG9yL29wdGlvbiBkZXNjcmlwdG9yIGNvbWJvLCBzbyBJIHVzZSB0aGF0IGZvciBub3cuCisJICoKKwkgKiBJZiBwcm9ibGVtcyBkZXZlbG9wIHdpdGggVFNPLCBjaGVjayB0aGlzIGZpcnN0LgorCSAqLworCW51bURlc2MgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMTsKKwlpZihza2JfdHNvX3NpemUoc2tiKSkKKwkJbnVtRGVzYysrOworCisJLyogV2hlbiBjaGVja2luZyBmb3IgZnJlZSBzcGFjZSBpbiB0aGUgcmluZywgd2UgbmVlZCB0byBhbHNvCisJICogYWNjb3VudCBmb3IgdGhlIGluaXRpYWwgVHggZGVzY3JpcHRvciwgYW5kIHdlIGFsd2F5cyBtdXN0IGxlYXZlCisJICogYXQgbGVhc3Qgb25lIGRlc2NyaXB0b3IgdW51c2VkIGluIHRoZSByaW5nIHNvIHRoYXQgaXQgZG9lc24ndAorCSAqIHdyYXAgYW5kIGxvb2sgZW1wdHkuCisJICoKKwkgKiBUaGUgb25seSB0aW1lIHdlIHNob3VsZCBsb29wIGhlcmUgaXMgd2hlbiB3ZSBoaXQgdGhlIHJhY2UKKwkgKiBiZXR3ZWVuIG1hcmtpbmcgdGhlIHF1ZXVlIGF3YWtlIGFuZCB1cGRhdGluZyB0aGUgY2xlYXJlZCBpbmRleC4KKwkgKiBKdXN0IGxvb3AgYW5kIGl0IHdpbGwgYXBwZWFyLiBUaGlzIGNvbWVzIGZyb20gdGhlIGFjZW5pYyBkcml2ZXIuCisJICovCisJd2hpbGUodW5saWtlbHkodHlwaG9vbl9udW1fZnJlZV90eCh0eFJpbmcpIDwgKG51bURlc2MgKyAyKSkpCisJCXNtcF9ybWIoKTsKKworCWZpcnN0X3R4ZCA9IChzdHJ1Y3QgdHhfZGVzYyAqKSAodHhSaW5nLT5yaW5nQmFzZSArIHR4UmluZy0+bGFzdFdyaXRlKTsKKwl0eXBob29uX2luY190eF9pbmRleCgmdHhSaW5nLT5sYXN0V3JpdGUsIDEpOworCisJZmlyc3RfdHhkLT5mbGFncyA9IFRZUEhPT05fVFhfREVTQyB8IFRZUEhPT05fREVTQ19WQUxJRDsKKwlmaXJzdF90eGQtPm51bURlc2MgPSAwOworCWZpcnN0X3R4ZC0+bGVuID0gMDsKKwlmaXJzdF90eGQtPmFkZHIgPSAodTY0KSgodW5zaWduZWQgbG9uZykgc2tiKSAmIDB4ZmZmZmZmZmY7CisJZmlyc3RfdHhkLT5hZGRySGkgPSAodTY0KSgodW5zaWduZWQgbG9uZykgc2tiKSA+PiAzMjsKKwlmaXJzdF90eGQtPnByb2Nlc3NGbGFncyA9IDA7CisKKwlpZihza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgeworCQkvKiBUaGUgM1hQIHdpbGwgZmlndXJlIG91dCBpZiB0aGlzIGlzIFVEUC9UQ1AgKi8KKwkJZmlyc3RfdHhkLT5wcm9jZXNzRmxhZ3MgfD0gVFlQSE9PTl9UWF9QRl9UQ1BfQ0hLU1VNOworCQlmaXJzdF90eGQtPnByb2Nlc3NGbGFncyB8PSBUWVBIT09OX1RYX1BGX1VEUF9DSEtTVU07CisJCWZpcnN0X3R4ZC0+cHJvY2Vzc0ZsYWdzIHw9IFRZUEhPT05fVFhfUEZfSVBfQ0hLU1VNOworCX0KKworCWlmKHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgeworCQlmaXJzdF90eGQtPnByb2Nlc3NGbGFncyB8PQorCQkgICAgVFlQSE9PTl9UWF9QRl9JTlNFUlRfVkxBTiB8IFRZUEhPT05fVFhfUEZfVkxBTl9QUklPUklUWTsKKwkJZmlyc3RfdHhkLT5wcm9jZXNzRmxhZ3MgfD0KKwkJICAgIGNwdV90b19sZTMyKGh0b25zKHZsYW5fdHhfdGFnX2dldChza2IpKSA8PAorCQkJCVRZUEhPT05fVFhfUEZfVkxBTl9UQUdfU0hJRlQpOworCX0KKworCWlmKHNrYl90c29fc2l6ZShza2IpKSB7CisJCWZpcnN0X3R4ZC0+cHJvY2Vzc0ZsYWdzIHw9IFRZUEhPT05fVFhfUEZfVENQX1NFR01FTlQ7CisJCWZpcnN0X3R4ZC0+bnVtRGVzYysrOworCisJCXR5cGhvb25fdHNvX2ZpbGwoc2tiLCB0eFJpbmcsIHRwLT50eGxvX2RtYV9hZGRyKTsKKwl9CisKKwl0eGQgPSAoc3RydWN0IHR4X2Rlc2MgKikgKHR4UmluZy0+cmluZ0Jhc2UgKyB0eFJpbmctPmxhc3RXcml0ZSk7CisJdHlwaG9vbl9pbmNfdHhfaW5kZXgoJnR4UmluZy0+bGFzdFdyaXRlLCAxKTsKKworCS8qIE5vIG5lZWQgdG8gd29ycnkgYWJvdXQgcGFkZGluZyBwYWNrZXQgLS0gdGhlIGZpcm13YXJlIHBhZHMKKwkgKiBpdCB3aXRoIHplcm9zIHRvIEVUSF9aTEVOIGZvciB1cy4KKwkgKi8KKwlpZihza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID09IDApIHsKKwkJc2tiX2RtYSA9IHBjaV9tYXBfc2luZ2xlKHRwLT50eF9wZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLAorCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJdHhkLT5mbGFncyA9IFRZUEhPT05fRlJBR19ERVNDIHwgVFlQSE9PTl9ERVNDX1ZBTElEOworCQl0eGQtPmxlbiA9IGNwdV90b19sZTE2KHNrYi0+bGVuKTsKKwkJdHhkLT5hZGRyID0gY3B1X3RvX2xlMzIoc2tiX2RtYSk7CisJCXR4ZC0+YWRkckhpID0gMDsKKwkJZmlyc3RfdHhkLT5udW1EZXNjKys7CisJfSBlbHNlIHsKKwkJaW50IGksIGxlbjsKKworCQlsZW4gPSBza2JfaGVhZGxlbihza2IpOworCQlza2JfZG1hID0gcGNpX21hcF9zaW5nbGUodHAtPnR4X3BkZXYsIHNrYi0+ZGF0YSwgbGVuLAorCQkJCSAgICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQl0eGQtPmZsYWdzID0gVFlQSE9PTl9GUkFHX0RFU0MgfCBUWVBIT09OX0RFU0NfVkFMSUQ7CisJCXR4ZC0+bGVuID0gY3B1X3RvX2xlMTYobGVuKTsKKwkJdHhkLT5hZGRyID0gY3B1X3RvX2xlMzIoc2tiX2RtYSk7CisJCXR4ZC0+YWRkckhpID0gMDsKKwkJZmlyc3RfdHhkLT5udW1EZXNjKys7CisKKwkJZm9yKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKSB7CisJCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisJCQl2b2lkICpmcmFnX2FkZHI7CisKKwkJCXR4ZCA9IChzdHJ1Y3QgdHhfZGVzYyAqKSAodHhSaW5nLT5yaW5nQmFzZSArCisJCQkJCQl0eFJpbmctPmxhc3RXcml0ZSk7CisJCQl0eXBob29uX2luY190eF9pbmRleCgmdHhSaW5nLT5sYXN0V3JpdGUsIDEpOworCisJCQlsZW4gPSBmcmFnLT5zaXplOworCQkJZnJhZ19hZGRyID0gKHZvaWQgKikgcGFnZV9hZGRyZXNzKGZyYWctPnBhZ2UpICsKKwkJCQkJCWZyYWctPnBhZ2Vfb2Zmc2V0OworCQkJc2tiX2RtYSA9IHBjaV9tYXBfc2luZ2xlKHRwLT50eF9wZGV2LCBmcmFnX2FkZHIsIGxlbiwKKwkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJdHhkLT5mbGFncyA9IFRZUEhPT05fRlJBR19ERVNDIHwgVFlQSE9PTl9ERVNDX1ZBTElEOworCQkJdHhkLT5sZW4gPSBjcHVfdG9fbGUxNihsZW4pOworCQkJdHhkLT5hZGRyID0gY3B1X3RvX2xlMzIoc2tiX2RtYSk7CisJCQl0eGQtPmFkZHJIaSA9IDA7CisJCQlmaXJzdF90eGQtPm51bURlc2MrKzsKKwkJfQorCX0KKworCS8qIEtpY2sgdGhlIDNYUAorCSAqLworCXdtYigpOworCWlvd3JpdGUzMih0eFJpbmctPmxhc3RXcml0ZSwgdHAtPnR4X2lvYWRkciArIHR4UmluZy0+d3JpdGVSZWdpc3Rlcik7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIElmIHdlIGRvbid0IGhhdmUgcm9vbSB0byBwdXQgdGhlIHdvcnN0IGNhc2UgcGFja2V0IG9uIHRoZQorCSAqIHF1ZXVlLCB0aGVuIHdlIG11c3Qgc3RvcCB0aGUgcXVldWUuIFdlIG5lZWQgMiBleHRyYQorCSAqIGRlc2NyaXB0b3JzIC0tIG9uZSB0byBwcmV2ZW50IHJpbmcgd3JhcCwgYW5kIG9uZSBmb3IgdGhlCisJICogVHggaGVhZGVyLgorCSAqLworCW51bURlc2MgPSBNQVhfU0tCX0ZSQUdTICsgVFNPX05VTV9ERVNDUklQVE9SUyArIDE7CisKKwlpZih0eXBob29uX251bV9mcmVlX3R4KHR4UmluZykgPCAobnVtRGVzYyArIDIpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQkvKiBBIFR4IGNvbXBsZXRlIElSUSBjb3VsZCBoYXZlIGdvdHRlbiBpbmJldHdlZW4sIG1ha2luZworCQkgKiB0aGUgcmluZyBmcmVlIGFnYWluLiBPbmx5IG5lZWQgdG8gcmVjaGVjayBoZXJlLCBzaW5jZQorCQkgKiBUeCBpcyBzZXJpYWxpemVkLgorCQkgKi8KKwkJaWYodHlwaG9vbl9udW1fZnJlZV90eCh0eFJpbmcpID49IChudW1EZXNjICsgMikpCisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit0eXBob29uX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR5cGhvb24gKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgY21kX2Rlc2MgeHBfY21kOworCXUzMiBtY19maWx0ZXJbMl07CisJdTE2IGZpbHRlcjsKKworCWZpbHRlciA9IFRZUEhPT05fUlhfRklMVEVSX0RJUkVDVEVEIHwgVFlQSE9PTl9SWF9GSUxURVJfQlJPQURDQVNUOworCWlmKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZmlsdGVyIHw9IFRZUEhPT05fUlhfRklMVEVSX1BST01JU0NPVVM7CisJfSBlbHNlIGlmKChkZXYtPm1jX2NvdW50ID4gbXVsdGljYXN0X2ZpbHRlcl9saW1pdCkgfHwKKwkJICAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKKwkJLyogVG9vIG1hbnkgdG8gbWF0Y2gsIG9yIGFjY2VwdCBhbGwgbXVsdGljYXN0cy4gKi8KKwkJZmlsdGVyIHw9IFRZUEhPT05fUlhfRklMVEVSX0FMTF9NQ0FTVDsKKwl9IGVsc2UgaWYoZGV2LT5tY19jb3VudCkgeworCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKm1jbGlzdDsKKwkJaW50IGk7CisKKwkJbWVtc2V0KG1jX2ZpbHRlciwgMCwgc2l6ZW9mKG1jX2ZpbHRlcikpOworCQlmb3IoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCQkgICAgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCWludCBiaXQgPSBldGhlcl9jcmMoRVRIX0FMRU4sIG1jbGlzdC0+ZG1pX2FkZHIpICYgMHgzZjsKKwkJCW1jX2ZpbHRlcltiaXQgPj4gNV0gfD0gMSA8PCAoYml0ICYgMHgxZik7CisJCX0KKworCQlJTklUX0NPTU1BTkRfTk9fUkVTUE9OU0UoJnhwX2NtZCwKKwkJCQkJIFRZUEhPT05fQ01EX1NFVF9NVUxUSUNBU1RfSEFTSCk7CisJCXhwX2NtZC5wYXJtMSA9IFRZUEhPT05fTUNBU1RfSEFTSF9TRVQ7CisJCXhwX2NtZC5wYXJtMiA9IGNwdV90b19sZTMyKG1jX2ZpbHRlclswXSk7CisJCXhwX2NtZC5wYXJtMyA9IGNwdV90b19sZTMyKG1jX2ZpbHRlclsxXSk7CisJCXR5cGhvb25faXNzdWVfY29tbWFuZCh0cCwgMSwgJnhwX2NtZCwgMCwgTlVMTCk7CisKKwkJZmlsdGVyIHw9IFRZUEhPT05fUlhfRklMVEVSX01DQVNUX0hBU0g7CisJfQorCisJSU5JVF9DT01NQU5EX05PX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX1NFVF9SWF9GSUxURVIpOworCXhwX2NtZC5wYXJtMSA9IGZpbHRlcjsKKwl0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX2RvX2dldF9zdGF0cyhzdHJ1Y3QgdHlwaG9vbiAqdHApCit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnRwLT5zdGF0czsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2F2ZWQgPSAmdHAtPnN0YXRzX3NhdmVkOworCXN0cnVjdCBjbWRfZGVzYyB4cF9jbWQ7CisJc3RydWN0IHJlc3BfZGVzYyB4cF9yZXNwWzddOworCXN0cnVjdCBzdGF0c19yZXNwICpzID0gKHN0cnVjdCBzdGF0c19yZXNwICopIHhwX3Jlc3A7CisJaW50IGVycjsKKworCUlOSVRfQ09NTUFORF9XSVRIX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX1JFQURfU1RBVFMpOworCWVyciA9IHR5cGhvb25faXNzdWVfY29tbWFuZCh0cCwgMSwgJnhwX2NtZCwgNywgeHBfcmVzcCk7CisJaWYoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qIDNDb20ncyBMaW51eCBkcml2ZXIgdXNlcyB0eE11bHRpcGxlQ29sbGlzaW9ucyBhcyBpdCdzCisJICogY29sbGlzaW9ucyB2YWx1ZSwgYnV0IHRoZXJlIGlzIHNvbWUgb3RoZXIgY29sbGlzaW9uIGluZm8gYXMgd2VsbC4uLgorCSAqCisJICogVGhlIGV4dHJhIHN0YXR1cyByZXBvcnRlZCB3b3VsZCBiZSBhIGdvb2QgY2FuZGlkYXRlIGZvcgorCSAqIGV0aHRvb2xfb3BzLT5nZXRfe3N0cmluZ3Msc3RhdHN9KCkKKwkgKi8KKwlzdGF0cy0+dHhfcGFja2V0cyA9IGxlMzJfdG9fY3B1KHMtPnR4UGFja2V0cyk7CisJc3RhdHMtPnR4X2J5dGVzID0gbGUzMl90b19jcHUocy0+dHhCeXRlcyk7CisJc3RhdHMtPnR4X2Vycm9ycyA9IGxlMzJfdG9fY3B1KHMtPnR4Q2Fycmllckxvc3QpOworCXN0YXRzLT50eF9jYXJyaWVyX2Vycm9ycyA9IGxlMzJfdG9fY3B1KHMtPnR4Q2Fycmllckxvc3QpOworCXN0YXRzLT5jb2xsaXNpb25zID0gbGUzMl90b19jcHUocy0+dHhNdWx0aXBsZUNvbGxpc2lvbnMpOworCXN0YXRzLT5yeF9wYWNrZXRzID0gbGUzMl90b19jcHUocy0+cnhQYWNrZXRzR29vZCk7CisJc3RhdHMtPnJ4X2J5dGVzID0gbGUzMl90b19jcHUocy0+cnhCeXRlc0dvb2QpOworCXN0YXRzLT5yeF9maWZvX2Vycm9ycyA9IGxlMzJfdG9fY3B1KHMtPnJ4Rmlmb092ZXJydW5zKTsKKwlzdGF0cy0+cnhfZXJyb3JzID0gbGUzMl90b19jcHUocy0+cnhGaWZvT3ZlcnJ1bnMpICsKKwkJCWxlMzJfdG9fY3B1KHMtPkJhZFNTRCkgKyBsZTMyX3RvX2NwdShzLT5yeENyY0Vycm9ycyk7CisJc3RhdHMtPnJ4X2NyY19lcnJvcnMgPSBsZTMyX3RvX2NwdShzLT5yeENyY0Vycm9ycyk7CisJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgPSBsZTMyX3RvX2NwdShzLT5yeE92ZXJzaXplZCk7CisJdHAtPnNwZWVkID0gKHMtPmxpbmtTdGF0dXMgJiBUWVBIT09OX0xJTktfMTAwTUJQUykgPworCQkJU1BFRURfMTAwIDogU1BFRURfMTA7CisJdHAtPmR1cGxleCA9IChzLT5saW5rU3RhdHVzICYgVFlQSE9PTl9MSU5LX0ZVTExfRFVQTEVYKSA/CisJCQlEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOworCisJLyogYWRkIGluIHRoZSBzYXZlZCBzdGF0aXN0aWNzCisJICovCisJc3RhdHMtPnR4X3BhY2tldHMgKz0gc2F2ZWQtPnR4X3BhY2tldHM7CisJc3RhdHMtPnR4X2J5dGVzICs9IHNhdmVkLT50eF9ieXRlczsKKwlzdGF0cy0+dHhfZXJyb3JzICs9IHNhdmVkLT50eF9lcnJvcnM7CisJc3RhdHMtPmNvbGxpc2lvbnMgKz0gc2F2ZWQtPmNvbGxpc2lvbnM7CisJc3RhdHMtPnJ4X3BhY2tldHMgKz0gc2F2ZWQtPnJ4X3BhY2tldHM7CisJc3RhdHMtPnJ4X2J5dGVzICs9IHNhdmVkLT5yeF9ieXRlczsKKwlzdGF0cy0+cnhfZmlmb19lcnJvcnMgKz0gc2F2ZWQtPnJ4X2ZpZm9fZXJyb3JzOworCXN0YXRzLT5yeF9lcnJvcnMgKz0gc2F2ZWQtPnJ4X2Vycm9yczsKKwlzdGF0cy0+cnhfY3JjX2Vycm9ycyArPSBzYXZlZC0+cnhfY3JjX2Vycm9yczsKKwlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyArPSBzYXZlZC0+cnhfbGVuZ3RoX2Vycm9yczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgordHlwaG9vbl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZ0cC0+c3RhdHM7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNhdmVkID0gJnRwLT5zdGF0c19zYXZlZDsKKworCXNtcF9ybWIoKTsKKwlpZih0cC0+Y2FyZF9zdGF0ZSA9PSBTbGVlcGluZykKKwkJcmV0dXJuIHNhdmVkOworCisJaWYodHlwaG9vbl9kb19nZXRfc3RhdHModHApIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciBnZXR0aW5nIHN0YXRzXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gc2F2ZWQ7CisJfQorCisJcmV0dXJuIHN0YXRzOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBzb2NrYWRkciAqc2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopIGFkZHI7CisKKwlpZihuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUJVU1k7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgc2FkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAordHlwaG9vbl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCB0eXBob29uICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0cC0+cGRldjsKKwlzdHJ1Y3QgY21kX2Rlc2MgeHBfY21kOworCXN0cnVjdCByZXNwX2Rlc2MgeHBfcmVzcFszXTsKKworCXNtcF9ybWIoKTsKKwlpZih0cC0+Y2FyZF9zdGF0ZSA9PSBTbGVlcGluZykgeworCQlzdHJjcHkoaW5mby0+ZndfdmVyc2lvbiwgIlNsZWVwIGltYWdlIik7CisJfSBlbHNlIHsKKwkJSU5JVF9DT01NQU5EX1dJVEhfUkVTUE9OU0UoJnhwX2NtZCwgVFlQSE9PTl9DTURfUkVBRF9WRVJTSU9OUyk7CisJCWlmKHR5cGhvb25faXNzdWVfY29tbWFuZCh0cCwgMSwgJnhwX2NtZCwgMywgeHBfcmVzcCkgPCAwKSB7CisJCQlzdHJjcHkoaW5mby0+ZndfdmVyc2lvbiwgIlVua25vd24gcnVudGltZSIpOworCQl9IGVsc2UgeworCQkJdTMyIHNsZWVwX3ZlciA9IHhwX3Jlc3BbMF0ucGFybTI7CisJCQlzbnByaW50ZihpbmZvLT5md192ZXJzaW9uLCAzMiwgIiUwMnguJTAzeC4lMDN4IiwKKwkJCQkgc2xlZXBfdmVyID4+IDI0LCAoc2xlZXBfdmVyID4+IDEyKSAmIDB4ZmZmLCAKKwkJCQkgc2xlZXBfdmVyICYgMHhmZmYpOworCQl9CisJfQorCisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX01PRFVMRV9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX01PRFVMRV9WRVJTSU9OKTsKKwlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHBjaV9kZXYpKTsKK30KKworc3RhdGljIGludAordHlwaG9vbl9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHR5cGhvb24gKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8CisJCQkJU1VQUE9SVEVEX0F1dG9uZWc7CisKKwlzd2l0Y2ggKHRwLT54Y3ZyX3NlbGVjdCkgeworCWNhc2UgVFlQSE9PTl9YQ1ZSXzEwSEFMRjoKKwkJY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmOworCQlicmVhazsKKwljYXNlIFRZUEhPT05fWENWUl8xMEZVTEw6CisJCWNtZC0+YWR2ZXJ0aXNpbmcgPSBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbDsKKwkJYnJlYWs7CisJY2FzZSBUWVBIT09OX1hDVlJfMTAwSEFMRjoKKwkJY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZjsKKwkJYnJlYWs7CisJY2FzZSBUWVBIT09OX1hDVlJfMTAwRlVMTDoKKwkJY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbDsKKwkJYnJlYWs7CisJY2FzZSBUWVBIT09OX1hDVlJfQVVUT05FRzoKKwkJY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwKKwkJCQkJICAgIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsIHwKKwkJCQkJICAgIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8CisJCQkJCSAgICBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwgfAorCQkJCQkgICAgQURWRVJUSVNFRF9BdXRvbmVnOworCQlicmVhazsKKwl9CisKKwlpZih0cC0+Y2FwYWJpbGl0aWVzICYgVFlQSE9PTl9GSUJFUikgeworCQljbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfRklCUkU7CisJCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9GSUJSRTsKKwkJY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKKwl9IGVsc2UgeworCQljbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkJICAgIAkJCVNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAorCQkJCQlTVVBQT1JURURfVFA7CisJCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9UUDsKKwkJY21kLT5wb3J0ID0gUE9SVF9UUDsKKwl9CisKKwkvKiBuZWVkIHRvIGdldCBzdGF0cyB0byBtYWtlIHRoZXNlIGxpbmsgc3BlZWQvZHVwbGV4IHZhbGlkICovCisJdHlwaG9vbl9kb19nZXRfc3RhdHModHApOworCWNtZC0+c3BlZWQgPSB0cC0+c3BlZWQ7CisJY21kLT5kdXBsZXggPSB0cC0+ZHVwbGV4OworCWNtZC0+cGh5X2FkZHJlc3MgPSAwOworCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCWlmKHRwLT54Y3ZyX3NlbGVjdCA9PSBUWVBIT09OX1hDVlJfQVVUT05FRykKKwkJY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJZWxzZQorCQljbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CisJY21kLT5tYXh0eHBrdCA9IDE7CisJY21kLT5tYXhyeHBrdCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordHlwaG9vbl9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHR5cGhvb24gKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgY21kX2Rlc2MgeHBfY21kOworCWludCB4Y3ZyOworCWludCBlcnI7CisKKwllcnIgPSAtRUlOVkFMOworCWlmKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQl4Y3ZyID0gVFlQSE9PTl9YQ1ZSX0FVVE9ORUc7CisJfSBlbHNlIHsKKwkJaWYoY21kLT5kdXBsZXggPT0gRFVQTEVYX0hBTEYpIHsKKwkJCWlmKGNtZC0+c3BlZWQgPT0gU1BFRURfMTApCisJCQkJeGN2ciA9IFRZUEhPT05fWENWUl8xMEhBTEY7CisJCQllbHNlIGlmKGNtZC0+c3BlZWQgPT0gU1BFRURfMTAwKQorCQkJCXhjdnIgPSBUWVBIT09OX1hDVlJfMTAwSEFMRjsKKwkJCWVsc2UKKwkJCQlnb3RvIG91dDsKKwkJfSBlbHNlIGlmKGNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKSB7CisJCQlpZihjbWQtPnNwZWVkID09IFNQRUVEXzEwKQorCQkJCXhjdnIgPSBUWVBIT09OX1hDVlJfMTBGVUxMOworCQkJZWxzZSBpZihjbWQtPnNwZWVkID09IFNQRUVEXzEwMCkKKwkJCQl4Y3ZyID0gVFlQSE9PTl9YQ1ZSXzEwMEZVTEw7CisJCQllbHNlCisJCQkJZ290byBvdXQ7CisJCX0gZWxzZQorCQkJZ290byBvdXQ7CisJfQorCisJSU5JVF9DT01NQU5EX05PX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX1hDVlJfU0VMRUNUKTsKKwl4cF9jbWQucGFybTEgPSBjcHVfdG9fbGUxNih4Y3ZyKTsKKwllcnIgPSB0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCWlmKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJdHAtPnhjdnJfc2VsZWN0ID0geGN2cjsKKwlpZihjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJdHAtPnNwZWVkID0gMHhmZjsJLyogaW52YWxpZCAqLworCQl0cC0+ZHVwbGV4ID0gMHhmZjsJLyogaW52YWxpZCAqLworCX0gZWxzZSB7CisJCXRwLT5zcGVlZCA9IGNtZC0+c3BlZWQ7CisJCXRwLT5kdXBsZXggPSBjbWQtPmR1cGxleDsKKwl9CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZAordHlwaG9vbl9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJd29sLT5zdXBwb3J0ZWQgPSBXQUtFX1BIWSB8IFdBS0VfTUFHSUM7CisJd29sLT53b2xvcHRzID0gMDsKKwlpZih0cC0+d29sX2V2ZW50cyAmIFRZUEhPT05fV0FLRV9MSU5LX0VWRU5UKQorCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9QSFk7CisJaWYodHAtPndvbF9ldmVudHMgJiBUWVBIT09OX1dBS0VfTUFHSUNfUEtUKQorCQl3b2wtPndvbG9wdHMgfD0gV0FLRV9NQUdJQzsKKwltZW1zZXQoJndvbC0+c29wYXNzLCAwLCBzaXplb2Yod29sLT5zb3Bhc3MpKTsKK30KKworc3RhdGljIGludAordHlwaG9vbl9zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYod29sLT53b2xvcHRzICYgfihXQUtFX1BIWSB8IFdBS0VfTUFHSUMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRwLT53b2xfZXZlbnRzID0gMDsKKwlpZih3b2wtPndvbG9wdHMgJiBXQUtFX1BIWSkKKwkJdHAtPndvbF9ldmVudHMgfD0gVFlQSE9PTl9XQUtFX0xJTktfRVZFTlQ7CisJaWYod29sLT53b2xvcHRzICYgV0FLRV9NQUdJQykKKwkJdHAtPndvbF9ldmVudHMgfD0gVFlQSE9PTl9XQUtFX01BR0lDX1BLVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyCit0eXBob29uX2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogRm9yIG5vdywgd2UgZG9uJ3QgYWxsb3cgdHVybmluZyBvZmYgUlggY2hlY2tzdW1zLgorCSAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAordHlwaG9vbl9nZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqZXJpbmcpCit7CisJZXJpbmctPnJ4X21heF9wZW5kaW5nID0gUlhFTlRfRU5UUklFUzsKKwllcmluZy0+cnhfbWluaV9tYXhfcGVuZGluZyA9IDA7CisJZXJpbmctPnJ4X2p1bWJvX21heF9wZW5kaW5nID0gMDsKKwllcmluZy0+dHhfbWF4X3BlbmRpbmcgPSBUWExPX0VOVFJJRVMgLSAxOworCisJZXJpbmctPnJ4X3BlbmRpbmcgPSBSWEVOVF9FTlRSSUVTOworCWVyaW5nLT5yeF9taW5pX3BlbmRpbmcgPSAwOworCWVyaW5nLT5yeF9qdW1ib19wZW5kaW5nID0gMDsKKwllcmluZy0+dHhfcGVuZGluZyA9IFRYTE9fRU5UUklFUyAtIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgdHlwaG9vbl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzCQk9IHR5cGhvb25fZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gdHlwaG9vbl9zZXRfc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvCQk9IHR5cGhvb25fZ2V0X2RydmluZm8sCisJLmdldF93b2wJCT0gdHlwaG9vbl9nZXRfd29sLAorCS5zZXRfd29sCQk9IHR5cGhvb25fc2V0X3dvbCwKKwkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X3J4X2NzdW0JCT0gdHlwaG9vbl9nZXRfcnhfY3N1bSwKKwkuZ2V0X3R4X2NzdW0JCT0gZXRodG9vbF9vcF9nZXRfdHhfY3N1bSwKKwkuc2V0X3R4X2NzdW0JCT0gZXRodG9vbF9vcF9zZXRfdHhfY3N1bSwKKwkuZ2V0X3NnCQkJPSBldGh0b29sX29wX2dldF9zZywKKwkuc2V0X3NnCQkJPSBldGh0b29sX29wX3NldF9zZywKKwkuZ2V0X3RzbwkJPSBldGh0b29sX29wX2dldF90c28sCisJLnNldF90c28JCT0gZXRodG9vbF9vcF9zZXRfdHNvLAorCS5nZXRfcmluZ3BhcmFtCQk9IHR5cGhvb25fZ2V0X3JpbmdwYXJhbSwKK307CisKK3N0YXRpYyBpbnQKK3R5cGhvb25fd2FpdF9pbnRlcnJ1cHQodm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJaW50IGksIGVyciA9IDA7CisKKwlmb3IoaSA9IDA7IGkgPCBUWVBIT09OX1dBSVRfVElNRU9VVDsgaSsrKSB7CisJCWlmKGlvcmVhZDMyKGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfU1RBVFVTKSAmCisJCSAgIFRZUEhPT05fSU5UUl9CT09UQ01EKQorCQkJZ290byBvdXQ7CisJCXVkZWxheShUWVBIT09OX1VERUxBWSk7CisJfQorCisJZXJyID0gLUVUSU1FRE9VVDsKKworb3V0OgorCWlvd3JpdGUzMihUWVBIT09OX0lOVFJfQk9PVENNRCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9TVEFUVVMpOworCXJldHVybiBlcnI7Cit9CisKKyNkZWZpbmUgc2hhcmVkX29mZnNldCh4KQlvZmZzZXRvZihzdHJ1Y3QgdHlwaG9vbl9zaGFyZWQsIHgpCisKK3N0YXRpYyB2b2lkCit0eXBob29uX2luaXRfaW50ZXJmYWNlKHN0cnVjdCB0eXBob29uICp0cCkKK3sKKwlzdHJ1Y3QgdHlwaG9vbl9pbnRlcmZhY2UgKmlmYWNlID0gJnRwLT5zaGFyZWQtPmlmYWNlOworCWRtYV9hZGRyX3Qgc2hhcmVkX2RtYTsKKworCW1lbXNldCh0cC0+c2hhcmVkLCAwLCBzaXplb2Yoc3RydWN0IHR5cGhvb25fc2hhcmVkKSk7CisKKwkvKiBUaGUgKkhpIG1lbWJlcnMgb2YgaWZhY2UgYXJlIGFsbCBpbml0J2QgdG8gemVybyBieSB0aGUgbWVtc2V0KCkuCisJICovCisJc2hhcmVkX2RtYSA9IHRwLT5zaGFyZWRfZG1hICsgc2hhcmVkX29mZnNldChpbmRleGVzKTsKKwlpZmFjZS0+cmluZ0luZGV4ID0gY3B1X3RvX2xlMzIoc2hhcmVkX2RtYSk7CisKKwlzaGFyZWRfZG1hID0gdHAtPnNoYXJlZF9kbWEgKyBzaGFyZWRfb2Zmc2V0KHR4TG8pOworCWlmYWNlLT50eExvQWRkciA9IGNwdV90b19sZTMyKHNoYXJlZF9kbWEpOworCWlmYWNlLT50eExvU2l6ZSA9IGNwdV90b19sZTMyKFRYTE9fRU5UUklFUyAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYykpOworCisJc2hhcmVkX2RtYSA9IHRwLT5zaGFyZWRfZG1hICsgc2hhcmVkX29mZnNldCh0eEhpKTsKKwlpZmFjZS0+dHhIaUFkZHIgPSBjcHVfdG9fbGUzMihzaGFyZWRfZG1hKTsKKwlpZmFjZS0+dHhIaVNpemUgPSBjcHVfdG9fbGUzMihUWEhJX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpKTsKKworCXNoYXJlZF9kbWEgPSB0cC0+c2hhcmVkX2RtYSArIHNoYXJlZF9vZmZzZXQocnhCdWZmKTsKKwlpZmFjZS0+cnhCdWZmQWRkciA9IGNwdV90b19sZTMyKHNoYXJlZF9kbWEpOworCWlmYWNlLT5yeEJ1ZmZTaXplID0gY3B1X3RvX2xlMzIoUlhGUkVFX0VOVFJJRVMgKgorCQkJCQlzaXplb2Yoc3RydWN0IHJ4X2ZyZWUpKTsKKworCXNoYXJlZF9kbWEgPSB0cC0+c2hhcmVkX2RtYSArIHNoYXJlZF9vZmZzZXQocnhMbyk7CisJaWZhY2UtPnJ4TG9BZGRyID0gY3B1X3RvX2xlMzIoc2hhcmVkX2RtYSk7CisJaWZhY2UtPnJ4TG9TaXplID0gY3B1X3RvX2xlMzIoUlhfRU5UUklFUyAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYykpOworCisJc2hhcmVkX2RtYSA9IHRwLT5zaGFyZWRfZG1hICsgc2hhcmVkX29mZnNldChyeEhpKTsKKwlpZmFjZS0+cnhIaUFkZHIgPSBjcHVfdG9fbGUzMihzaGFyZWRfZG1hKTsKKwlpZmFjZS0+cnhIaVNpemUgPSBjcHVfdG9fbGUzMihSWF9FTlRSSUVTICogc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSk7CisKKwlzaGFyZWRfZG1hID0gdHAtPnNoYXJlZF9kbWEgKyBzaGFyZWRfb2Zmc2V0KGNtZCk7CisJaWZhY2UtPmNtZEFkZHIgPSBjcHVfdG9fbGUzMihzaGFyZWRfZG1hKTsKKwlpZmFjZS0+Y21kU2l6ZSA9IGNwdV90b19sZTMyKENPTU1BTkRfUklOR19TSVpFKTsKKworCXNoYXJlZF9kbWEgPSB0cC0+c2hhcmVkX2RtYSArIHNoYXJlZF9vZmZzZXQocmVzcCk7CisJaWZhY2UtPnJlc3BBZGRyID0gY3B1X3RvX2xlMzIoc2hhcmVkX2RtYSk7CisJaWZhY2UtPnJlc3BTaXplID0gY3B1X3RvX2xlMzIoUkVTUE9OU0VfUklOR19TSVpFKTsKKworCXNoYXJlZF9kbWEgPSB0cC0+c2hhcmVkX2RtYSArIHNoYXJlZF9vZmZzZXQoemVyb1dvcmQpOworCWlmYWNlLT56ZXJvQWRkciA9IGNwdV90b19sZTMyKHNoYXJlZF9kbWEpOworCisJdHAtPmluZGV4ZXMgPSAmdHAtPnNoYXJlZC0+aW5kZXhlczsKKwl0cC0+dHhMb1JpbmcucmluZ0Jhc2UgPSAodTggKikgdHAtPnNoYXJlZC0+dHhMbzsKKwl0cC0+dHhIaVJpbmcucmluZ0Jhc2UgPSAodTggKikgdHAtPnNoYXJlZC0+dHhIaTsKKwl0cC0+cnhMb1JpbmcucmluZ0Jhc2UgPSAodTggKikgdHAtPnNoYXJlZC0+cnhMbzsKKwl0cC0+cnhIaVJpbmcucmluZ0Jhc2UgPSAodTggKikgdHAtPnNoYXJlZC0+cnhIaTsKKwl0cC0+cnhCdWZmUmluZy5yaW5nQmFzZSA9ICh1OCAqKSB0cC0+c2hhcmVkLT5yeEJ1ZmY7CisJdHAtPmNtZFJpbmcucmluZ0Jhc2UgPSAodTggKikgdHAtPnNoYXJlZC0+Y21kOworCXRwLT5yZXNwUmluZy5yaW5nQmFzZSA9ICh1OCAqKSB0cC0+c2hhcmVkLT5yZXNwOworCisJdHAtPnR4TG9SaW5nLndyaXRlUmVnaXN0ZXIgPSBUWVBIT09OX1JFR19UWF9MT19SRUFEWTsKKwl0cC0+dHhIaVJpbmcud3JpdGVSZWdpc3RlciA9IFRZUEhPT05fUkVHX1RYX0hJX1JFQURZOworCisJdHAtPnR4bG9fZG1hX2FkZHIgPSBpZmFjZS0+dHhMb0FkZHI7CisJdHAtPmNhcmRfc3RhdGUgPSBTbGVlcGluZzsKKwlzbXBfd21iKCk7CisKKwl0cC0+b2ZmbG9hZCA9IFRZUEhPT05fT0ZGTE9BRF9JUF9DSEtTVU0gfCBUWVBIT09OX09GRkxPQURfVENQX0NIS1NVTTsKKwl0cC0+b2ZmbG9hZCB8PSBUWVBIT09OX09GRkxPQURfVURQX0NIS1NVTSB8IFRTT19PRkZMT0FEX09OOworCisJc3Bpbl9sb2NrX2luaXQoJnRwLT5jb21tYW5kX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZ0cC0+c3RhdGVfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkCit0eXBob29uX2luaXRfcmluZ3Moc3RydWN0IHR5cGhvb24gKnRwKQoreworCW1lbXNldCh0cC0+aW5kZXhlcywgMCwgc2l6ZW9mKHN0cnVjdCB0eXBob29uX2luZGV4ZXMpKTsKKworCXRwLT50eExvUmluZy5sYXN0V3JpdGUgPSAwOworCXRwLT50eEhpUmluZy5sYXN0V3JpdGUgPSAwOworCXRwLT5yeExvUmluZy5sYXN0V3JpdGUgPSAwOworCXRwLT5yeEhpUmluZy5sYXN0V3JpdGUgPSAwOworCXRwLT5yeEJ1ZmZSaW5nLmxhc3RXcml0ZSA9IDA7CisJdHAtPmNtZFJpbmcubGFzdFdyaXRlID0gMDsKKwl0cC0+Y21kUmluZy5sYXN0V3JpdGUgPSAwOworCisJdHAtPnR4TG9SaW5nLmxhc3RSZWFkID0gMDsKKwl0cC0+dHhIaVJpbmcubGFzdFJlYWQgPSAwOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCB0eXBob29uICp0cCkKK3sKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5pb2FkZHI7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0cC0+cGRldjsKKwlzdHJ1Y3QgdHlwaG9vbl9maWxlX2hlYWRlciAqZkhkcjsKKwlzdHJ1Y3QgdHlwaG9vbl9zZWN0aW9uX2hlYWRlciAqc0hkcjsKKwl1OCAqaW1hZ2VfZGF0YTsKKwl2b2lkICpkcGFnZTsKKwlkbWFfYWRkcl90IGRwYWdlX2RtYTsKKwl1bnNpZ25lZCBpbnQgY3N1bTsKKwl1MzIgaXJxRW5hYmxlZDsKKwl1MzIgaXJxTWFza2VkOworCXUzMiBudW1TZWN0aW9uczsKKwl1MzIgc2VjdGlvbl9sZW47CisJdTMyIGxlbjsKKwl1MzIgbG9hZF9hZGRyOworCXUzMiBobWFjOworCWludCBpOworCWludCBlcnI7CisKKwllcnIgPSAtRUlOVkFMOworCWZIZHIgPSAoc3RydWN0IHR5cGhvb25fZmlsZV9oZWFkZXIgKikgdHlwaG9vbl9maXJtd2FyZV9pbWFnZTsKKwlpbWFnZV9kYXRhID0gKHU4ICopIGZIZHI7CisKKwlpZihtZW1jbXAoZkhkci0+dGFnLCAiVFlQSE9PTiIsIDgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgZmlybXdhcmUgaW1hZ2UhXG4iLCB0cC0+bmFtZSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKiBDYW5ub3QganVzdCBtYXAgdGhlIGZpcm13YXJlIGltYWdlIHVzaW5nIHBjaV9tYXBfc2luZ2xlKCkgYXMKKwkgKiB0aGUgZmlybXdhcmUgaXMgcGFydCBvZiB0aGUga2VybmVsL21vZHVsZSBpbWFnZSwgc28gd2UgYWxsb2NhdGUKKwkgKiBzb21lIGNvbnNpc3RlbnQgbWVtb3J5IHRvIGNvcHkgdGhlIHNlY3Rpb25zIGludG8sIGFzIGl0IGlzIHNpbXBsZXIsCisJICogYW5kIHNob3J0LWxpdmVkLiBJZiB3ZSBldmVyIHNwbGl0IG91dCBhbmQgcmVxdWlyZSBhIHVzZXJsYW5kCisJICogZmlybXdhcmUgbG9hZGVyLCB0aGVuIHdlIGNhbiByZXZpc2l0IHRoaXMuCisJICovCisJZXJyID0gLUVOT01FTTsKKwlkcGFnZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFBBR0VfU0laRSwgJmRwYWdlX2RtYSk7CisJaWYoIWRwYWdlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIERNQSBtZW0gZm9yIGZpcm13YXJlXG4iLCB0cC0+bmFtZSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlpcnFFbmFibGVkID0gaW9yZWFkMzIoaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9FTkFCTEUpOworCWlvd3JpdGUzMihpcnFFbmFibGVkIHwgVFlQSE9PTl9JTlRSX0JPT1RDTUQsCisJICAgICAgIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfRU5BQkxFKTsKKwlpcnFNYXNrZWQgPSBpb3JlYWQzMihpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX01BU0spOworCWlvd3JpdGUzMihpcnFNYXNrZWQgfCBUWVBIT09OX0lOVFJfQk9PVENNRCwKKwkgICAgICAgaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9NQVNLKTsKKworCWVyciA9IC1FVElNRURPVVQ7CisJaWYodHlwaG9vbl93YWl0X3N0YXR1cyhpb2FkZHIsIFRZUEhPT05fU1RBVFVTX1dBSVRJTkdfRk9SX0hPU1QpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYXJkIHJlYWR5IHRpbWVvdXRcbiIsIHRwLT5uYW1lKTsKKwkJZ290byBlcnJfb3V0X2lycTsKKwl9CisKKwludW1TZWN0aW9ucyA9IGxlMzJfdG9fY3B1KGZIZHItPm51bVNlY3Rpb25zKTsKKwlsb2FkX2FkZHIgPSBsZTMyX3RvX2NwdShmSGRyLT5zdGFydEFkZHIpOworCisJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9CT09UQ01ELCBpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX1NUQVRVUyk7CisJaW93cml0ZTMyKGxvYWRfYWRkciwgaW9hZGRyICsgVFlQSE9PTl9SRUdfRE9XTkxPQURfQk9PVF9BRERSKTsKKwlobWFjID0gbGUzMl90b19jcHUoZkhkci0+aG1hY0RpZ2VzdFswXSk7CisJaW93cml0ZTMyKGhtYWMsIGlvYWRkciArIFRZUEhPT05fUkVHX0RPV05MT0FEX0hNQUNfMCk7CisJaG1hYyA9IGxlMzJfdG9fY3B1KGZIZHItPmhtYWNEaWdlc3RbMV0pOworCWlvd3JpdGUzMihobWFjLCBpb2FkZHIgKyBUWVBIT09OX1JFR19ET1dOTE9BRF9ITUFDXzEpOworCWhtYWMgPSBsZTMyX3RvX2NwdShmSGRyLT5obWFjRGlnZXN0WzJdKTsKKwlpb3dyaXRlMzIoaG1hYywgaW9hZGRyICsgVFlQSE9PTl9SRUdfRE9XTkxPQURfSE1BQ18yKTsKKwlobWFjID0gbGUzMl90b19jcHUoZkhkci0+aG1hY0RpZ2VzdFszXSk7CisJaW93cml0ZTMyKGhtYWMsIGlvYWRkciArIFRZUEhPT05fUkVHX0RPV05MT0FEX0hNQUNfMyk7CisJaG1hYyA9IGxlMzJfdG9fY3B1KGZIZHItPmhtYWNEaWdlc3RbNF0pOworCWlvd3JpdGUzMihobWFjLCBpb2FkZHIgKyBUWVBIT09OX1JFR19ET1dOTE9BRF9ITUFDXzQpOworCXR5cGhvb25fcG9zdF9wY2lfd3JpdGVzKGlvYWRkcik7CisJaW93cml0ZTMyKFRZUEhPT05fQk9PVENNRF9SVU5USU1FX0lNQUdFLCBpb2FkZHIgKyBUWVBIT09OX1JFR19DT01NQU5EKTsKKworCWltYWdlX2RhdGEgKz0gc2l6ZW9mKHN0cnVjdCB0eXBob29uX2ZpbGVfaGVhZGVyKTsKKworCS8qIFRoZSBpb3JlYWQzMigpIGluIHR5cGhvb25fd2FpdF9pbnRlcnJ1cHQoKSB3aWxsIGZvcmNlIHRoZQorCSAqIGxhc3Qgd3JpdGUgdG8gdGhlIGNvbW1hbmQgcmVnaXN0ZXIgdG8gcG9zdCwgc28KKwkgKiB3ZSBkb24ndCBuZWVkIGEgdHlwaG9vbl9wb3N0X3BjaV93cml0ZXMoKSBhZnRlciBpdC4KKwkgKi8KKwlmb3IoaSA9IDA7IGkgPCBudW1TZWN0aW9uczsgaSsrKSB7CisJCXNIZHIgPSAoc3RydWN0IHR5cGhvb25fc2VjdGlvbl9oZWFkZXIgKikgaW1hZ2VfZGF0YTsKKwkJaW1hZ2VfZGF0YSArPSBzaXplb2Yoc3RydWN0IHR5cGhvb25fc2VjdGlvbl9oZWFkZXIpOworCQlsb2FkX2FkZHIgPSBsZTMyX3RvX2NwdShzSGRyLT5zdGFydEFkZHIpOworCQlzZWN0aW9uX2xlbiA9IGxlMzJfdG9fY3B1KHNIZHItPmxlbik7CisKKwkJd2hpbGUoc2VjdGlvbl9sZW4pIHsKKwkJCWxlbiA9IG1pbl90KHUzMiwgc2VjdGlvbl9sZW4sIFBBR0VfU0laRSk7CisKKwkJCWlmKHR5cGhvb25fd2FpdF9pbnRlcnJ1cHQoaW9hZGRyKSA8IDAgfHwKKwkJCSAgIGlvcmVhZDMyKGlvYWRkciArIFRZUEhPT05fUkVHX1NUQVRVUykgIT0KKwkJCSAgIFRZUEhPT05fU1RBVFVTX1dBSVRJTkdfRk9SX1NFR01FTlQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzZWdtZW50IHJlYWR5IHRpbWVvdXRcbiIsCisJCQkJICAgICAgIHRwLT5uYW1lKTsKKwkJCQlnb3RvIGVycl9vdXRfaXJxOworCQkJfQorCisJCQkvKiBEbyBhbiBwc2V1ZG8gSVB2NCBjaGVja3N1bSBvbiB0aGUgZGF0YSAtLSBmaXJzdAorCQkJICogbmVlZCB0byBjb252ZXJ0IGVhY2ggdTE2IHRvIGNwdSBvcmRlciBiZWZvcmUKKwkJCSAqIHN1bW1pbmcuIEZvcnR1bmF0ZWx5LCBkdWUgdG8gdGhlIHByb3BlcnRpZXMgb2YKKwkJCSAqIHRoZSBjaGVja3N1bSwgd2UgY2FuIGRvIHRoaXMgb25jZSwgYXQgdGhlIGVuZC4KKwkJCSAqLworCQkJY3N1bSA9IGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soaW1hZ2VfZGF0YSwgZHBhZ2UsCisJCQkJCQkJIGxlbiwgMCk7CisJCQljc3VtID0gY3N1bV9mb2xkKGNzdW0pOworCQkJY3N1bSA9IGxlMTZfdG9fY3B1KGNzdW0pOworCisJCQlpb3dyaXRlMzIobGVuLCBpb2FkZHIgKyBUWVBIT09OX1JFR19CT09UX0xFTkdUSCk7CisJCQlpb3dyaXRlMzIoY3N1bSwgaW9hZGRyICsgVFlQSE9PTl9SRUdfQk9PVF9DSEVDS1NVTSk7CisJCQlpb3dyaXRlMzIobG9hZF9hZGRyLAorCQkJCQlpb2FkZHIgKyBUWVBIT09OX1JFR19CT09UX0RFU1RfQUREUik7CisJCQlpb3dyaXRlMzIoMCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfQk9PVF9EQVRBX0hJKTsKKwkJCWlvd3JpdGUzMihkcGFnZV9kbWEsIGlvYWRkciArIFRZUEhPT05fUkVHX0JPT1RfREFUQV9MTyk7CisJCQl0eXBob29uX3Bvc3RfcGNpX3dyaXRlcyhpb2FkZHIpOworCQkJaW93cml0ZTMyKFRZUEhPT05fQk9PVENNRF9TRUdfQVZBSUxBQkxFLAorCQkJICAgICAgIGlvYWRkciArIFRZUEhPT05fUkVHX0NPTU1BTkQpOworCisJCQlpbWFnZV9kYXRhICs9IGxlbjsKKwkJCWxvYWRfYWRkciArPSBsZW47CisJCQlzZWN0aW9uX2xlbiAtPSBsZW47CisJCX0KKwl9CisKKwlpZih0eXBob29uX3dhaXRfaW50ZXJydXB0KGlvYWRkcikgPCAwIHx8CisJICAgaW9yZWFkMzIoaW9hZGRyICsgVFlQSE9PTl9SRUdfU1RBVFVTKSAhPQorCSAgIFRZUEhPT05fU1RBVFVTX1dBSVRJTkdfRk9SX1NFR01FTlQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmluYWwgc2VnbWVudCByZWFkeSB0aW1lb3V0XG4iLCB0cC0+bmFtZSk7CisJCWdvdG8gZXJyX291dF9pcnE7CisJfQorCisJaW93cml0ZTMyKFRZUEhPT05fQk9PVENNRF9ETkxEX0NPTVBMRVRFLCBpb2FkZHIgKyBUWVBIT09OX1JFR19DT01NQU5EKTsKKworCWlmKHR5cGhvb25fd2FpdF9zdGF0dXMoaW9hZGRyLCBUWVBIT09OX1NUQVRVU19XQUlUSU5HX0ZPUl9CT09UKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYm9vdCByZWFkeSB0aW1lb3V0LCBzdGF0dXMgMHglMHhcbiIsCisJCSAgICAgICB0cC0+bmFtZSwgaW9yZWFkMzIoaW9hZGRyICsgVFlQSE9PTl9SRUdfU1RBVFVTKSk7CisJCWdvdG8gZXJyX291dF9pcnE7CisJfQorCisJZXJyID0gMDsKKworZXJyX291dF9pcnE6CisJaW93cml0ZTMyKGlycU1hc2tlZCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9NQVNLKTsKKwlpb3dyaXRlMzIoaXJxRW5hYmxlZCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9FTkFCTEUpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBQQUdFX1NJWkUsIGRwYWdlLCBkcGFnZV9kbWEpOworCitlcnJfb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK3R5cGhvb25fYm9vdF8zWFAoc3RydWN0IHR5cGhvb24gKnRwLCB1MzIgaW5pdGlhbF9zdGF0dXMpCit7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+aW9hZGRyOworCisJaWYodHlwaG9vbl93YWl0X3N0YXR1cyhpb2FkZHIsIGluaXRpYWxfc3RhdHVzKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYm9vdCByZWFkeSB0aW1lb3V0XG4iLCB0cC0+bmFtZSk7CisJCWdvdG8gb3V0X3RpbWVvdXQ7CisJfQorCisJaW93cml0ZTMyKDAsIGlvYWRkciArIFRZUEhPT05fUkVHX0JPT1RfUkVDT1JEX0FERFJfSEkpOworCWlvd3JpdGUzMih0cC0+c2hhcmVkX2RtYSwgaW9hZGRyICsgVFlQSE9PTl9SRUdfQk9PVF9SRUNPUkRfQUREUl9MTyk7CisJdHlwaG9vbl9wb3N0X3BjaV93cml0ZXMoaW9hZGRyKTsKKwlpb3dyaXRlMzIoVFlQSE9PTl9CT09UQ01EX1JFR19CT09UX1JFQ09SRCwKKwkJCQlpb2FkZHIgKyBUWVBIT09OX1JFR19DT01NQU5EKTsKKworCWlmKHR5cGhvb25fd2FpdF9zdGF0dXMoaW9hZGRyLCBUWVBIT09OX1NUQVRVU19SVU5OSU5HKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYm9vdCBmaW5pc2ggdGltZW91dCAoc3RhdHVzIDB4JXgpXG4iLAorCQkgICAgICAgdHAtPm5hbWUsIGlvcmVhZDMyKGlvYWRkciArIFRZUEhPT05fUkVHX1NUQVRVUykpOworCQlnb3RvIG91dF90aW1lb3V0OworCX0KKworCS8qIENsZWFyIHRoZSBUcmFuc21pdCBhbmQgQ29tbWFuZCByZWFkeSByZWdpc3RlcnMKKwkgKi8KKwlpb3dyaXRlMzIoMCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfVFhfSElfUkVBRFkpOworCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBUWVBIT09OX1JFR19DTURfUkVBRFkpOworCWlvd3JpdGUzMigwLCBpb2FkZHIgKyBUWVBIT09OX1JFR19UWF9MT19SRUFEWSk7CisJdHlwaG9vbl9wb3N0X3BjaV93cml0ZXMoaW9hZGRyKTsKKwlpb3dyaXRlMzIoVFlQSE9PTl9CT09UQ01EX0JPT1QsIGlvYWRkciArIFRZUEhPT05fUkVHX0NPTU1BTkQpOworCisJcmV0dXJuIDA7CisKK291dF90aW1lb3V0OgorCXJldHVybiAtRVRJTUVET1VUOworfQorCitzdGF0aWMgdTMyCit0eXBob29uX2NsZWFuX3R4KHN0cnVjdCB0eXBob29uICp0cCwgc3RydWN0IHRyYW5zbWl0X3JpbmcgKnR4UmluZywKKwkJCXZvbGF0aWxlIHUzMiAqIGluZGV4KQoreworCXUzMiBsYXN0UmVhZCA9IHR4UmluZy0+bGFzdFJlYWQ7CisJc3RydWN0IHR4X2Rlc2MgKnR4OworCWRtYV9hZGRyX3Qgc2tiX2RtYTsKKwlpbnQgZG1hX2xlbjsKKwlpbnQgdHlwZTsKKworCXdoaWxlKGxhc3RSZWFkICE9IGxlMzJfdG9fY3B1KCppbmRleCkpIHsKKwkJdHggPSAoc3RydWN0IHR4X2Rlc2MgKikgKHR4UmluZy0+cmluZ0Jhc2UgKyBsYXN0UmVhZCk7CisJCXR5cGUgPSB0eC0+ZmxhZ3MgJiBUWVBIT09OX1RZUEVfTUFTSzsKKworCQlpZih0eXBlID09IFRZUEhPT05fVFhfREVTQykgeworCQkJLyogVGhpcyB0eF9kZXNjIGRlc2NyaWJlcyBhIHBhY2tldC4KKwkJCSAqLworCQkJdW5zaWduZWQgbG9uZyBwdHIgPSB0eC0+YWRkciB8ICgodTY0KXR4LT5hZGRySGkgPDwgMzIpOworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSBwdHI7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQl9IGVsc2UgaWYodHlwZSA9PSBUWVBIT09OX0ZSQUdfREVTQykgeworCQkJLyogVGhpcyB0eF9kZXNjIGRlc2NyaWJlcyBhIG1lbW9yeSBtYXBwaW5nLiBGcmVlIGl0LgorCQkJICovCisJCQlza2JfZG1hID0gKGRtYV9hZGRyX3QpIGxlMzJfdG9fY3B1KHR4LT5hZGRyKTsKKwkJCWRtYV9sZW4gPSBsZTE2X3RvX2NwdSh0eC0+bGVuKTsKKwkJCXBjaV91bm1hcF9zaW5nbGUodHAtPnBkZXYsIHNrYl9kbWEsIGRtYV9sZW4sCisJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQl9CisKKwkJdHgtPmZsYWdzID0gMDsKKwkJdHlwaG9vbl9pbmNfdHhfaW5kZXgoJmxhc3RSZWFkLCAxKTsKKwl9CisKKwlyZXR1cm4gbGFzdFJlYWQ7Cit9CisKK3N0YXRpYyB2b2lkCit0eXBob29uX3R4X2NvbXBsZXRlKHN0cnVjdCB0eXBob29uICp0cCwgc3RydWN0IHRyYW5zbWl0X3JpbmcgKnR4UmluZywKKwkJCXZvbGF0aWxlIHUzMiAqIGluZGV4KQoreworCXUzMiBsYXN0UmVhZDsKKwlpbnQgbnVtRGVzYyA9IE1BWF9TS0JfRlJBR1MgKyAxOworCisJLyogVGhpcyB3aWxsIG5lZWQgY2hhbmdpbmcgaWYgd2Ugc3RhcnQgdG8gdXNlIHRoZSBIaSBUeCByaW5nLiAqLworCWxhc3RSZWFkID0gdHlwaG9vbl9jbGVhbl90eCh0cCwgdHhSaW5nLCBpbmRleCk7CisJaWYobmV0aWZfcXVldWVfc3RvcHBlZCh0cC0+ZGV2KSAmJiB0eXBob29uX251bV9mcmVlKHR4UmluZy0+bGFzdFdyaXRlLAorCQkJCWxhc3RSZWFkLCBUWExPX0VOVFJJRVMpID4gKG51bURlc2MgKyAyKSkKKwkJbmV0aWZfd2FrZV9xdWV1ZSh0cC0+ZGV2KTsKKworCXR4UmluZy0+bGFzdFJlYWQgPSBsYXN0UmVhZDsKKwlzbXBfd21iKCk7Cit9CisKK3N0YXRpYyB2b2lkCit0eXBob29uX3JlY3ljbGVfcnhfc2tiKHN0cnVjdCB0eXBob29uICp0cCwgdTMyIGlkeCkKK3sKKwlzdHJ1Y3QgdHlwaG9vbl9pbmRleGVzICppbmRleGVzID0gdHAtPmluZGV4ZXM7CisJc3RydWN0IHJ4YnVmZl9lbnQgKnJ4YiA9ICZ0cC0+cnhidWZmZXJzW2lkeF07CisJc3RydWN0IGJhc2ljX3JpbmcgKnJpbmcgPSAmdHAtPnJ4QnVmZlJpbmc7CisJc3RydWN0IHJ4X2ZyZWUgKnI7CisKKwlpZigocmluZy0+bGFzdFdyaXRlICsgc2l6ZW9mKCpyKSkgJSAoUlhGUkVFX0VOVFJJRVMgKiBzaXplb2YoKnIpKSA9PQorCQkJCWluZGV4ZXMtPnJ4QnVmZkNsZWFyZWQpIHsKKwkJLyogbm8gcm9vbSBpbiByaW5nLCBqdXN0IGRyb3AgdGhlIHNrYgorCQkgKi8KKwkJZGV2X2tmcmVlX3NrYl9hbnkocnhiLT5za2IpOworCQlyeGItPnNrYiA9IE5VTEw7CisJCXJldHVybjsKKwl9CisKKwlyID0gKHN0cnVjdCByeF9mcmVlICopIChyaW5nLT5yaW5nQmFzZSArIHJpbmctPmxhc3RXcml0ZSk7CisJdHlwaG9vbl9pbmNfcnhmcmVlX2luZGV4KCZyaW5nLT5sYXN0V3JpdGUsIDEpOworCXItPnZpcnRBZGRyID0gaWR4OworCXItPnBoeXNBZGRyID0gY3B1X3RvX2xlMzIocnhiLT5kbWFfYWRkcik7CisKKwkvKiBUZWxsIHRoZSBjYXJkIGFib3V0IGl0ICovCisJd21iKCk7CisJaW5kZXhlcy0+cnhCdWZmUmVhZHkgPSBjcHVfdG9fbGUzMihyaW5nLT5sYXN0V3JpdGUpOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX2FsbG9jX3J4X3NrYihzdHJ1Y3QgdHlwaG9vbiAqdHAsIHUzMiBpZHgpCit7CisJc3RydWN0IHR5cGhvb25faW5kZXhlcyAqaW5kZXhlcyA9IHRwLT5pbmRleGVzOworCXN0cnVjdCByeGJ1ZmZfZW50ICpyeGIgPSAmdHAtPnJ4YnVmZmVyc1tpZHhdOworCXN0cnVjdCBiYXNpY19yaW5nICpyaW5nID0gJnRwLT5yeEJ1ZmZSaW5nOworCXN0cnVjdCByeF9mcmVlICpyOworCXN0cnVjdCBza19idWZmICpza2I7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKworCXJ4Yi0+c2tiID0gTlVMTDsKKworCWlmKChyaW5nLT5sYXN0V3JpdGUgKyBzaXplb2YoKnIpKSAlIChSWEZSRUVfRU5UUklFUyAqIHNpemVvZigqcikpID09CisJCQkJaW5kZXhlcy0+cnhCdWZmQ2xlYXJlZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKFBLVF9CVUZfU1opOworCWlmKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisjaWYgMAorCS8qIFBsZWFzZSwgM2NvbSwgZml4IHRoZSBmaXJtd2FyZSB0byBhbGxvdyBETUEgdG8gYSB1bmFsaWduZWQKKwkgKiBhZGRyZXNzISBQcmV0dHkgcGxlYXNlPworCSAqLworCXNrYl9yZXNlcnZlKHNrYiwgMik7CisjZW5kaWYKKworCXNrYi0+ZGV2ID0gdHAtPmRldjsKKwlkbWFfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHRwLT5wZGV2LCBza2ItPnRhaWwsCisJCQkJICBQS1RfQlVGX1NaLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJLyogU2luY2Ugbm8gY2FyZCBkb2VzIDY0IGJpdCBEQUMsIHRoZSBoaWdoIGJpdHMgd2lsbCBuZXZlcgorCSAqIGNoYW5nZSBmcm9tIHplcm8uCisJICovCisJciA9IChzdHJ1Y3QgcnhfZnJlZSAqKSAocmluZy0+cmluZ0Jhc2UgKyByaW5nLT5sYXN0V3JpdGUpOworCXR5cGhvb25faW5jX3J4ZnJlZV9pbmRleCgmcmluZy0+bGFzdFdyaXRlLCAxKTsKKwlyLT52aXJ0QWRkciA9IGlkeDsKKwlyLT5waHlzQWRkciA9IGNwdV90b19sZTMyKGRtYV9hZGRyKTsKKwlyeGItPnNrYiA9IHNrYjsKKwlyeGItPmRtYV9hZGRyID0gZG1hX2FkZHI7CisKKwkvKiBUZWxsIHRoZSBjYXJkIGFib3V0IGl0ICovCisJd21iKCk7CisJaW5kZXhlcy0+cnhCdWZmUmVhZHkgPSBjcHVfdG9fbGUzMihyaW5nLT5sYXN0V3JpdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX3J4KHN0cnVjdCB0eXBob29uICp0cCwgc3RydWN0IGJhc2ljX3JpbmcgKnJ4UmluZywgdm9sYXRpbGUgdTMyICogcmVhZHksCisJICAgdm9sYXRpbGUgdTMyICogY2xlYXJlZCwgaW50IGJ1ZGdldCkKK3sKKwlzdHJ1Y3QgcnhfZGVzYyAqcng7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm5ld19za2I7CisJc3RydWN0IHJ4YnVmZl9lbnQgKnJ4YjsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCXUzMiBsb2NhbF9yZWFkeTsKKwl1MzIgcnhhZGRyOworCWludCBwa3RfbGVuOworCXUzMiBpZHg7CisJdTMyIGNzdW1fYml0czsKKwlpbnQgcmVjZWl2ZWQ7CisKKwlyZWNlaXZlZCA9IDA7CisJbG9jYWxfcmVhZHkgPSBsZTMyX3RvX2NwdSgqcmVhZHkpOworCXJ4YWRkciA9IGxlMzJfdG9fY3B1KCpjbGVhcmVkKTsKKwl3aGlsZShyeGFkZHIgIT0gbG9jYWxfcmVhZHkgJiYgYnVkZ2V0ID4gMCkgeworCQlyeCA9IChzdHJ1Y3QgcnhfZGVzYyAqKSAocnhSaW5nLT5yaW5nQmFzZSArIHJ4YWRkcik7CisJCWlkeCA9IHJ4LT5hZGRyOworCQlyeGIgPSAmdHAtPnJ4YnVmZmVyc1tpZHhdOworCQlza2IgPSByeGItPnNrYjsKKwkJZG1hX2FkZHIgPSByeGItPmRtYV9hZGRyOworCisJCXR5cGhvb25faW5jX3J4X2luZGV4KCZyeGFkZHIsIDEpOworCisJCWlmKHJ4LT5mbGFncyAmIFRZUEhPT05fUlhfRVJST1IpIHsKKwkJCXR5cGhvb25fcmVjeWNsZV9yeF9za2IodHAsIGlkeCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXBrdF9sZW4gPSBsZTE2X3RvX2NwdShyeC0+ZnJhbWVMZW4pOworCisJCWlmKHBrdF9sZW4gPCByeF9jb3B5YnJlYWsgJiYKKwkJICAgKG5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKSkgIT0gTlVMTCkgeworCQkJbmV3X3NrYi0+ZGV2ID0gdHAtPmRldjsKKwkJCXNrYl9yZXNlcnZlKG5ld19za2IsIDIpOworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHRwLT5wZGV2LCBkbWFfYWRkciwKKwkJCQkJCSAgICBQS1RfQlVGX1NaLAorCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlldGhfY29weV9hbmRfc3VtKG5ld19za2IsIHNrYi0+dGFpbCwgcGt0X2xlbiwgMCk7CisJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UodHAtPnBkZXYsIGRtYV9hZGRyLAorCQkJCQkJICAgICAgIFBLVF9CVUZfU1osCisJCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXNrYl9wdXQobmV3X3NrYiwgcGt0X2xlbik7CisJCQl0eXBob29uX3JlY3ljbGVfcnhfc2tiKHRwLCBpZHgpOworCQl9IGVsc2UgeworCQkJbmV3X3NrYiA9IHNrYjsKKwkJCXNrYl9wdXQobmV3X3NrYiwgcGt0X2xlbik7CisJCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCBkbWFfYWRkciwgUEtUX0JVRl9TWiwKKwkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXR5cGhvb25fYWxsb2Nfcnhfc2tiKHRwLCBpZHgpOworCQl9CisJCW5ld19za2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMobmV3X3NrYiwgdHAtPmRldik7CisJCWNzdW1fYml0cyA9IHJ4LT5yeFN0YXR1cyAmIChUWVBIT09OX1JYX0lQX0NIS19HT09EIHwKKwkJCVRZUEhPT05fUlhfVURQX0NIS19HT09EIHwgVFlQSE9PTl9SWF9UQ1BfQ0hLX0dPT0QpOworCQlpZihjc3VtX2JpdHMgPT0KKwkJICAgKFRZUEhPT05fUlhfSVBfQ0hLX0dPT0QgfCBUWVBIT09OX1JYX1RDUF9DSEtfR09PRCkKKwkJICAgfHwgY3N1bV9iaXRzID09CisJCSAgIChUWVBIT09OX1JYX0lQX0NIS19HT09EIHwgVFlQSE9PTl9SWF9VRFBfQ0hLX0dPT0QpKSB7CisJCQluZXdfc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJfSBlbHNlCisJCQluZXdfc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCisJCXNwaW5fbG9jaygmdHAtPnN0YXRlX2xvY2spOworCQlpZih0cC0+dmxncnAgIT0gTlVMTCAmJiByeC0+cnhTdGF0dXMgJiBUWVBIT09OX1JYX1ZMQU4pCisJCQl2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2IobmV3X3NrYiwgdHAtPnZsZ3JwLAorCQkJCQkJIG50b2hsKHJ4LT52bGFuVGFnKSAmIDB4ZmZmZik7CisJCWVsc2UKKwkJCW5ldGlmX3JlY2VpdmVfc2tiKG5ld19za2IpOworCQlzcGluX3VubG9jaygmdHAtPnN0YXRlX2xvY2spOworCisJCXRwLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlyZWNlaXZlZCsrOworCQlidWRnZXQtLTsKKwl9CisJKmNsZWFyZWQgPSBjcHVfdG9fbGUzMihyeGFkZHIpOworCisJcmV0dXJuIHJlY2VpdmVkOworfQorCitzdGF0aWMgdm9pZAordHlwaG9vbl9maWxsX2ZyZWVfcmluZyhzdHJ1Y3QgdHlwaG9vbiAqdHApCit7CisJdTMyIGk7CisKKwlmb3IoaSA9IDA7IGkgPCBSWEVOVF9FTlRSSUVTOyBpKyspIHsKKwkJc3RydWN0IHJ4YnVmZl9lbnQgKnJ4YiA9ICZ0cC0+cnhidWZmZXJzW2ldOworCQlpZihyeGItPnNrYikKKwkJCWNvbnRpbnVlOworCQlpZih0eXBob29uX2FsbG9jX3J4X3NrYih0cCwgaSkgPCAwKQorCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50Cit0eXBob29uX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICp0b3RhbF9idWRnZXQpCit7CisJc3RydWN0IHR5cGhvb24gKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdHlwaG9vbl9pbmRleGVzICppbmRleGVzID0gdHAtPmluZGV4ZXM7CisJaW50IG9yaWdfYnVkZ2V0ID0gKnRvdGFsX2J1ZGdldDsKKwlpbnQgYnVkZ2V0LCB3b3JrX2RvbmUsIGRvbmU7CisKKwlybWIoKTsKKwlpZighdHAtPmF3YWl0aW5nX3Jlc3AgJiYgaW5kZXhlcy0+cmVzcFJlYWR5ICE9IGluZGV4ZXMtPnJlc3BDbGVhcmVkKQorCQkJdHlwaG9vbl9wcm9jZXNzX3Jlc3BvbnNlKHRwLCAwLCBOVUxMKTsKKworCWlmKGxlMzJfdG9fY3B1KGluZGV4ZXMtPnR4TG9DbGVhcmVkKSAhPSB0cC0+dHhMb1JpbmcubGFzdFJlYWQpCisJCXR5cGhvb25fdHhfY29tcGxldGUodHAsICZ0cC0+dHhMb1JpbmcsICZpbmRleGVzLT50eExvQ2xlYXJlZCk7CisKKwlpZihvcmlnX2J1ZGdldCA+IGRldi0+cXVvdGEpCisJCW9yaWdfYnVkZ2V0ID0gZGV2LT5xdW90YTsKKworCWJ1ZGdldCA9IG9yaWdfYnVkZ2V0OworCXdvcmtfZG9uZSA9IDA7CisJZG9uZSA9IDE7CisKKwlpZihpbmRleGVzLT5yeEhpQ2xlYXJlZCAhPSBpbmRleGVzLT5yeEhpUmVhZHkpIHsKKwkJd29ya19kb25lID0gdHlwaG9vbl9yeCh0cCwgJnRwLT5yeEhpUmluZywgJmluZGV4ZXMtPnJ4SGlSZWFkeSwKKwkJCSAgIAkJJmluZGV4ZXMtPnJ4SGlDbGVhcmVkLCBidWRnZXQpOworCQlidWRnZXQgLT0gd29ya19kb25lOworCX0KKworCWlmKGluZGV4ZXMtPnJ4TG9DbGVhcmVkICE9IGluZGV4ZXMtPnJ4TG9SZWFkeSkgeworCQl3b3JrX2RvbmUgKz0gdHlwaG9vbl9yeCh0cCwgJnRwLT5yeExvUmluZywgJmluZGV4ZXMtPnJ4TG9SZWFkeSwKKwkJCSAgIAkJJmluZGV4ZXMtPnJ4TG9DbGVhcmVkLCBidWRnZXQpOworCX0KKworCWlmKHdvcmtfZG9uZSkgeworCQkqdG90YWxfYnVkZ2V0IC09IHdvcmtfZG9uZTsKKwkJZGV2LT5xdW90YSAtPSB3b3JrX2RvbmU7CisKKwkJaWYod29ya19kb25lID49IG9yaWdfYnVkZ2V0KQorCQkJZG9uZSA9IDA7CisJfQorCisJaWYobGUzMl90b19jcHUoaW5kZXhlcy0+cnhCdWZmQ2xlYXJlZCkgPT0gdHAtPnJ4QnVmZlJpbmcubGFzdFdyaXRlKSB7CisJCS8qIHJ4QnVmZiByaW5nIGlzIGVtcHR5LCB0cnkgdG8gZmlsbCBpdC4gKi8KKwkJdHlwaG9vbl9maWxsX2ZyZWVfcmluZyh0cCk7CisJfQorCisJaWYoZG9uZSkgeworCQluZXRpZl9yeF9jb21wbGV0ZShkZXYpOworCQlpb3dyaXRlMzIoVFlQSE9PTl9JTlRSX05PTkUsCisJCQkJdHAtPmlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfTUFTSyk7CisJCXR5cGhvb25fcG9zdF9wY2lfd3JpdGVzKHRwLT5pb2FkZHIpOworCX0KKworCXJldHVybiAoZG9uZSA/IDAgOiAxKTsKK30KKworc3RhdGljIGlycXJldHVybl90Cit0eXBob29uX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IHR5cGhvb24gKnRwID0gZGV2LT5wcml2OworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmlvYWRkcjsKKwl1MzIgaW50cl9zdGF0dXM7CisKKwlpbnRyX3N0YXR1cyA9IGlvcmVhZDMyKGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfU1RBVFVTKTsKKwlpZighKGludHJfc3RhdHVzICYgVFlQSE9PTl9JTlRSX0hPU1RfSU5UKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJaW93cml0ZTMyKGludHJfc3RhdHVzLCBpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX1NUQVRVUyk7CisKKwlpZihuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKGRldikpIHsKKwkJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9BTEwsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfTUFTSyk7CisJCXR5cGhvb25fcG9zdF9wY2lfd3JpdGVzKGlvYWRkcik7CisJCV9fbmV0aWZfcnhfc2NoZWR1bGUoZGV2KTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciwgcG9sbCBhbHJlYWR5IHNjaGVkdWxlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lKTsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZAordHlwaG9vbl9mcmVlX3J4X3JpbmdzKHN0cnVjdCB0eXBob29uICp0cCkKK3sKKwl1MzIgaTsKKworCWZvcihpID0gMDsgaSA8IFJYRU5UX0VOVFJJRVM7IGkrKykgeworCQlzdHJ1Y3QgcnhidWZmX2VudCAqcnhiID0gJnRwLT5yeGJ1ZmZlcnNbaV07CisJCWlmKHJ4Yi0+c2tiKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCByeGItPmRtYV9hZGRyLCBQS1RfQlVGX1NaLAorCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihyeGItPnNrYik7CisJCQlyeGItPnNrYiA9IE5VTEw7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQKK3R5cGhvb25fc2xlZXAoc3RydWN0IHR5cGhvb24gKnRwLCBwY2lfcG93ZXJfdCBzdGF0ZSwgdTE2IGV2ZW50cykKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRwLT5wZGV2OworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmlvYWRkcjsKKwlzdHJ1Y3QgY21kX2Rlc2MgeHBfY21kOworCWludCBlcnI7CisKKwlJTklUX0NPTU1BTkRfV0lUSF9SRVNQT05TRSgmeHBfY21kLCBUWVBIT09OX0NNRF9FTkFCTEVfV0FLRV9FVkVOVFMpOworCXhwX2NtZC5wYXJtMSA9IGV2ZW50czsKKwllcnIgPSB0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCWlmKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdHlwaG9vbl9zbGVlcCgpOiB3YWtlIGV2ZW50cyBjbWQgZXJyICVkXG4iLAorCQkJCXRwLT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCUlOSVRfQ09NTUFORF9OT19SRVNQT05TRSgmeHBfY21kLCBUWVBIT09OX0NNRF9HT1RPX1NMRUVQKTsKKwllcnIgPSB0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCWlmKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdHlwaG9vbl9zbGVlcCgpOiBzbGVlcCBjbWQgZXJyICVkXG4iLAorCQkJCXRwLT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmKHR5cGhvb25fd2FpdF9zdGF0dXMoaW9hZGRyLCBUWVBIT09OX1NUQVRVU19TTEVFUElORykgPCAwKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCS8qIFNpbmNlIHdlIGNhbm5vdCBtb25pdG9yIHRoZSBzdGF0dXMgb2YgdGhlIGxpbmsgd2hpbGUgc2xlZXBpbmcsCisJICogdGVsbCB0aGUgd29ybGQgaXQgd2VudCBhd2F5LgorCSAqLworCW5ldGlmX2NhcnJpZXJfb2ZmKHRwLT5kZXYpOworCisJcGNpX2VuYWJsZV93YWtlKHRwLT5wZGV2LCBzdGF0ZSwgMSk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKK30KKworc3RhdGljIGludAordHlwaG9vbl93YWtldXAoc3RydWN0IHR5cGhvb24gKnRwLCBpbnQgd2FpdF90eXBlKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdHAtPnBkZXY7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+aW9hZGRyOworCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJLyogUG9zdCAyLngueCB2ZXJzaW9ucyBvZiB0aGUgU2xlZXAgSW1hZ2UgcmVxdWlyZSBhIHJlc2V0IGJlZm9yZQorCSAqIHdlIGNhbiBkb3dubG9hZCB0aGUgUnVudGltZSBJbWFnZS4gQnV0IGxldCdzIG5vdCBtYWtlIHVzZXJzIG9mCisJICogdGhlIG9sZCBmaXJtd2FyZSBwYXkgZm9yIHRoZSByZXNldC4KKwkgKi8KKwlpb3dyaXRlMzIoVFlQSE9PTl9CT09UQ01EX1dBS0VVUCwgaW9hZGRyICsgVFlQSE9PTl9SRUdfQ09NTUFORCk7CisJaWYodHlwaG9vbl93YWl0X3N0YXR1cyhpb2FkZHIsIFRZUEhPT05fU1RBVFVTX1dBSVRJTkdfRk9SX0hPU1QpIDwgMCB8fAorCQkJKHRwLT5jYXBhYmlsaXRpZXMgJiBUWVBIT09OX1dBS0VVUF9ORUVEU19SRVNFVCkpCisJCXJldHVybiB0eXBob29uX3Jlc2V0KGlvYWRkciwgd2FpdF90eXBlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX3N0YXJ0X3J1bnRpbWUoc3RydWN0IHR5cGhvb24gKnRwKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB0cC0+ZGV2OworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gdHAtPmlvYWRkcjsKKwlzdHJ1Y3QgY21kX2Rlc2MgeHBfY21kOworCWludCBlcnI7CisKKwl0eXBob29uX2luaXRfcmluZ3ModHApOworCXR5cGhvb25fZmlsbF9mcmVlX3JpbmcodHApOworCisJZXJyID0gdHlwaG9vbl9kb3dubG9hZF9maXJtd2FyZSh0cCk7CisJaWYoZXJyIDwgMCkgeworCQlwcmludGsoIiVzOiBjYW5ub3QgbG9hZCBydW50aW1lIG9uIDNYUFxuIiwgdHAtPm5hbWUpOworCQlnb3RvIGVycm9yX291dDsKKwl9CisKKwlpZih0eXBob29uX2Jvb3RfM1hQKHRwLCBUWVBIT09OX1NUQVRVU19XQUlUSU5HX0ZPUl9CT09UKSA8IDApIHsKKwkJcHJpbnRrKCIlczogY2Fubm90IGJvb3QgM1hQXG4iLCB0cC0+bmFtZSk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKworCUlOSVRfQ09NTUFORF9OT19SRVNQT05TRSgmeHBfY21kLCBUWVBIT09OX0NNRF9TRVRfTUFYX1BLVF9TSVpFKTsKKwl4cF9jbWQucGFybTEgPSBjcHVfdG9fbGUxNihQS1RfQlVGX1NaKTsKKwllcnIgPSB0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCWlmKGVyciA8IDApCisJCWdvdG8gZXJyb3Jfb3V0OworCisJSU5JVF9DT01NQU5EX05PX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX1NFVF9NQUNfQUREUkVTUyk7CisJeHBfY21kLnBhcm0xID0gY3B1X3RvX2xlMTYobnRvaHMoKih1MTYgKikmZGV2LT5kZXZfYWRkclswXSkpOworCXhwX2NtZC5wYXJtMiA9IGNwdV90b19sZTMyKG50b2hsKCoodTMyICopJmRldi0+ZGV2X2FkZHJbMl0pKTsKKwllcnIgPSB0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCWlmKGVyciA8IDApCisJCWdvdG8gZXJyb3Jfb3V0OworCisJLyogRGlzYWJsZSBJUlEgY29hbGVzY2luZyAtLSB3ZSBjYW4gcmVlbmFibGUgaXQgd2hlbiAzQ29tIGdpdmVzCisJICogdXMgc29tZSBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250cm9sIGl0LgorCSAqLworCUlOSVRfQ09NTUFORF9XSVRIX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX0lSUV9DT0FMRVNDRV9DVFJMKTsKKwl4cF9jbWQucGFybTEgPSAwOworCWVyciA9IHR5cGhvb25faXNzdWVfY29tbWFuZCh0cCwgMSwgJnhwX2NtZCwgMCwgTlVMTCk7CisJaWYoZXJyIDwgMCkKKwkJZ290byBlcnJvcl9vdXQ7CisKKwlJTklUX0NPTU1BTkRfTk9fUkVTUE9OU0UoJnhwX2NtZCwgVFlQSE9PTl9DTURfWENWUl9TRUxFQ1QpOworCXhwX2NtZC5wYXJtMSA9IHRwLT54Y3ZyX3NlbGVjdDsKKwllcnIgPSB0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCWlmKGVyciA8IDApCisJCWdvdG8gZXJyb3Jfb3V0OworCisJSU5JVF9DT01NQU5EX05PX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX1ZMQU5fVFlQRV9XUklURSk7CisJeHBfY21kLnBhcm0xID0gX19jb25zdGFudF9jcHVfdG9fbGUxNihFVEhfUF84MDIxUSk7CisJZXJyID0gdHlwaG9vbl9pc3N1ZV9jb21tYW5kKHRwLCAxLCAmeHBfY21kLCAwLCBOVUxMKTsKKwlpZihlcnIgPCAwKQorCQlnb3RvIGVycm9yX291dDsKKworCUlOSVRfQ09NTUFORF9OT19SRVNQT05TRSgmeHBfY21kLCBUWVBIT09OX0NNRF9TRVRfT0ZGTE9BRF9UQVNLUyk7CisJc3Bpbl9sb2NrX2JoKCZ0cC0+c3RhdGVfbG9jayk7CisJeHBfY21kLnBhcm0yID0gdHAtPm9mZmxvYWQ7CisJeHBfY21kLnBhcm0zID0gdHAtPm9mZmxvYWQ7CisJZXJyID0gdHlwaG9vbl9pc3N1ZV9jb21tYW5kKHRwLCAxLCAmeHBfY21kLCAwLCBOVUxMKTsKKwlzcGluX3VubG9ja19iaCgmdHAtPnN0YXRlX2xvY2spOworCWlmKGVyciA8IDApCisJCWdvdG8gZXJyb3Jfb3V0OworCisJdHlwaG9vbl9zZXRfcnhfbW9kZShkZXYpOworCisJSU5JVF9DT01NQU5EX05PX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX1RYX0VOQUJMRSk7CisJZXJyID0gdHlwaG9vbl9pc3N1ZV9jb21tYW5kKHRwLCAxLCAmeHBfY21kLCAwLCBOVUxMKTsKKwlpZihlcnIgPCAwKQorCQlnb3RvIGVycm9yX291dDsKKworCUlOSVRfQ09NTUFORF9XSVRIX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX1JYX0VOQUJMRSk7CisJZXJyID0gdHlwaG9vbl9pc3N1ZV9jb21tYW5kKHRwLCAxLCAmeHBfY21kLCAwLCBOVUxMKTsKKwlpZihlcnIgPCAwKQorCQlnb3RvIGVycm9yX291dDsKKworCXRwLT5jYXJkX3N0YXRlID0gUnVubmluZzsKKwlzbXBfd21iKCk7CisKKwlpb3dyaXRlMzIoVFlQSE9PTl9JTlRSX0VOQUJMRV9BTEwsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfRU5BQkxFKTsKKwlpb3dyaXRlMzIoVFlQSE9PTl9JTlRSX05PTkUsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfTUFTSyk7CisJdHlwaG9vbl9wb3N0X3BjaV93cml0ZXMoaW9hZGRyKTsKKworCXJldHVybiAwOworCitlcnJvcl9vdXQ6CisJdHlwaG9vbl9yZXNldChpb2FkZHIsIFdhaXROb1NsZWVwKTsKKwl0eXBob29uX2ZyZWVfcnhfcmluZ3ModHApOworCXR5cGhvb25faW5pdF9yaW5ncyh0cCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAordHlwaG9vbl9zdG9wX3J1bnRpbWUoc3RydWN0IHR5cGhvb24gKnRwLCBpbnQgd2FpdF90eXBlKQoreworCXN0cnVjdCB0eXBob29uX2luZGV4ZXMgKmluZGV4ZXMgPSB0cC0+aW5kZXhlczsKKwlzdHJ1Y3QgdHJhbnNtaXRfcmluZyAqdHhMbyA9ICZ0cC0+dHhMb1Jpbmc7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+aW9hZGRyOworCXN0cnVjdCBjbWRfZGVzYyB4cF9jbWQ7CisJaW50IGk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgZWFybHksIHNpbmNlIHdlIGNhbid0IHNjaGVkdWxlIGEgcG9sbAorCSAqIHdoZW4gY2FsbGVkIHdpdGggIW5ldGlmX3J1bm5pbmcoKS4gVGhpcyB3aWxsIGJlIHBvc3RlZAorCSAqIHdoZW4gd2UgZm9yY2UgdGhlIHBvc3Rpbmcgb2YgdGhlIGNvbW1hbmQuCisJICovCisJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9OT05FLCBpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX0VOQUJMRSk7CisKKwlJTklUX0NPTU1BTkRfTk9fUkVTUE9OU0UoJnhwX2NtZCwgVFlQSE9PTl9DTURfUlhfRElTQUJMRSk7CisJdHlwaG9vbl9pc3N1ZV9jb21tYW5kKHRwLCAxLCAmeHBfY21kLCAwLCBOVUxMKTsKKworCS8qIFdhaXQgMS8yIHNlYyBmb3IgYW55IG91dHN0YW5kaW5nIHRyYW5zbWl0cyB0byBvY2N1cgorCSAqIFdlJ2xsIGNsZWFudXAgYWZ0ZXIgdGhlIHJlc2V0IGlmIHRoaXMgdGltZXMgb3V0LgorCSAqLworCWZvcihpID0gMDsgaSA8IFRZUEhPT05fV0FJVF9USU1FT1VUOyBpKyspIHsKKwkJaWYoaW5kZXhlcy0+dHhMb0NsZWFyZWQgPT0gY3B1X3RvX2xlMzIodHhMby0+bGFzdFdyaXRlKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoVFlQSE9PTl9VREVMQVkpOworCX0KKworCWlmKGkgPT0gVFlQSE9PTl9XQUlUX1RJTUVPVVQpCisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBoYWx0IHRpbWVkIG91dCB3YWl0aW5nIGZvciBUeCB0byBjb21wbGV0ZVxuIiwKKwkJICAgICAgIHRwLT5uYW1lKTsKKworCUlOSVRfQ09NTUFORF9OT19SRVNQT05TRSgmeHBfY21kLCBUWVBIT09OX0NNRF9UWF9ESVNBQkxFKTsKKwl0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCisJLyogc2F2ZSB0aGUgc3RhdGlzdGljcyBzbyB3aGVuIHdlIGJyaW5nIHRoZSBpbnRlcmZhY2UgdXAgYWdhaW4sCisJICogdGhlIHZhbHVlcyByZXBvcnRlZCB0byB1c2Vyc3BhY2UgYXJlIGNvcnJlY3QuCisJICovCisJdHAtPmNhcmRfc3RhdGUgPSBTbGVlcGluZzsKKwlzbXBfd21iKCk7CisJdHlwaG9vbl9kb19nZXRfc3RhdHModHApOworCW1lbWNweSgmdHAtPnN0YXRzX3NhdmVkLCAmdHAtPnN0YXRzLCBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKKworCUlOSVRfQ09NTUFORF9OT19SRVNQT05TRSgmeHBfY21kLCBUWVBIT09OX0NNRF9IQUxUKTsKKwl0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpOworCisJaWYodHlwaG9vbl93YWl0X3N0YXR1cyhpb2FkZHIsIFRZUEhPT05fU1RBVFVTX0hBTFRFRCkgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0aW1lZCBvdXQgd2FpdGluZyBmb3IgM1hQIHRvIGhhbHRcbiIsCisJCSAgICAgICB0cC0+bmFtZSk7CisKKwlpZih0eXBob29uX3Jlc2V0KGlvYWRkciwgd2FpdF90eXBlKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHJlc2V0IDNYUFxuIiwgdHAtPm5hbWUpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwkvKiBjbGVhbnVwIGFueSBvdXRzdGFuZGluZyBUeCBwYWNrZXRzICovCisJaWYoaW5kZXhlcy0+dHhMb0NsZWFyZWQgIT0gY3B1X3RvX2xlMzIodHhMby0+bGFzdFdyaXRlKSkgeworCQlpbmRleGVzLT50eExvQ2xlYXJlZCA9IGNwdV90b19sZTMyKHR4TG8tPmxhc3RXcml0ZSk7CisJCXR5cGhvb25fY2xlYW5fdHgodHAsICZ0cC0+dHhMb1JpbmcsICZpbmRleGVzLT50eExvQ2xlYXJlZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit0eXBob29uX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYodHlwaG9vbl9yZXNldCh0cC0+aW9hZGRyLCBXYWl0Tm9TbGVlcCkgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb3VsZCBub3QgcmVzZXQgaW4gdHggdGltZW91dFxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkJZ290byB0cnVlbHlfZGVhZDsKKwl9CisKKwkvKiBJZiB3ZSBldmVyIHN0YXJ0IHVzaW5nIHRoZSBIaSByaW5nLCBpdCB3aWxsIG5lZWQgY2xlYW5pbmcgdG9vICovCisJdHlwaG9vbl9jbGVhbl90eCh0cCwgJnRwLT50eExvUmluZywgJnRwLT5pbmRleGVzLT50eExvQ2xlYXJlZCk7CisJdHlwaG9vbl9mcmVlX3J4X3JpbmdzKHRwKTsKKworCWlmKHR5cGhvb25fc3RhcnRfcnVudGltZSh0cCkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBzdGFydCBydW50aW1lIGluIHR4IHRpbWVvdXRcbiIsCisJCQkJCWRldi0+bmFtZSk7CisJCWdvdG8gdHJ1ZWx5X2RlYWQ7CisgICAgICAgIH0KKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlyZXR1cm47CisKK3RydWVseV9kZWFkOgorCS8qIFJlc2V0IHRoZSBoYXJkd2FyZSwgYW5kIHR1cm4gb2ZmIGNhcnJpZXIgdG8gYXZvaWQgbW9yZSB0aW1lb3V0cyAqLworCXR5cGhvb25fcmVzZXQodHAtPmlvYWRkciwgTm9XYWl0KTsKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnI7CisKKwllcnIgPSB0eXBob29uX3dha2V1cCh0cCwgV2FpdFNsZWVwKTsKKwlpZihlcnIgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byB3YWtldXAgZGV2aWNlXG4iLCBkZXYtPm5hbWUpOworCQlnb3RvIG91dF9zbGVlcDsKKwl9CisKKwllcnIgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJnR5cGhvb25faW50ZXJydXB0LCBTQV9TSElSUSwKKwkJCQlkZXYtPm5hbWUsIGRldik7CisJaWYoZXJyIDwgMCkKKwkJZ290byBvdXRfc2xlZXA7CisKKwllcnIgPSB0eXBob29uX3N0YXJ0X3J1bnRpbWUodHApOworCWlmKGVyciA8IDApCisJCWdvdG8gb3V0X2lycTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7CisKK291dF9pcnE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKK291dF9zbGVlcDoKKwlpZih0eXBob29uX2Jvb3RfM1hQKHRwLCBUWVBIT09OX1NUQVRVU19XQUlUSU5HX0ZPUl9IT1NUKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHJlYm9vdCBpbnRvIHNsZWVwIGltZ1xuIiwKKwkJCQlkZXYtPm5hbWUpOworCQl0eXBob29uX3Jlc2V0KHRwLT5pb2FkZHIsIE5vV2FpdCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmKHR5cGhvb25fc2xlZXAodHAsIFBDSV9EM2hvdCwgMCkgPCAwKSAKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGdvIGJhY2sgdG8gc2xlZXBcbiIsIGRldi0+bmFtZSk7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50Cit0eXBob29uX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHR5cGhvb24gKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmKHR5cGhvb25fc3RvcF9ydW50aW1lKHRwLCBXYWl0U2xlZXApIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHN0b3AgcnVudGltZVxuIiwgZGV2LT5uYW1lKTsKKworCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBubyBpcnEgaGFuZGxlciBydW5uaW5nIG9uIGEgZGlmZmVyZW50IENQVS4gKi8KKwl0eXBob29uX3N5bmNocm9uaXplX2lycShkZXYtPmlycSk7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwl0eXBob29uX2ZyZWVfcnhfcmluZ3ModHApOworCXR5cGhvb25faW5pdF9yaW5ncyh0cCk7CisKKwlpZih0eXBob29uX2Jvb3RfM1hQKHRwLCBUWVBIT09OX1NUQVRVU19XQUlUSU5HX0ZPUl9IT1NUKSA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBib290IHNsZWVwIGltYWdlXG4iLCBkZXYtPm5hbWUpOworCisJaWYodHlwaG9vbl9zbGVlcCh0cCwgUENJX0QzaG90LCAwKSA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBwdXQgY2FyZCB0byBzbGVlcFxuIiwgZGV2LT5uYW1lKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50Cit0eXBob29uX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB0eXBob29uICp0cCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBJZiB3ZSdyZSBkb3duLCByZXN1bWUgd2hlbiB3ZSBhcmUgdXBwZWQuCisJICovCisJaWYoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIDA7CisKKwlpZih0eXBob29uX3dha2V1cCh0cCwgV2FpdE5vU2xlZXApIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjcml0aWNhbDogY291bGQgbm90IHdha2UgdXAgaW4gcmVzdW1lXG4iLAorCQkJCWRldi0+bmFtZSk7CisJCWdvdG8gcmVzZXQ7CisJfQorCisJaWYodHlwaG9vbl9zdGFydF9ydW50aW1lKHRwKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY3JpdGljYWw6IGNvdWxkIG5vdCBzdGFydCBydW50aW1lIGluICIKKwkJCQkicmVzdW1lXG4iLCBkZXYtPm5hbWUpOworCQlnb3RvIHJlc2V0OworCX0KKworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworCityZXNldDoKKwl0eXBob29uX3Jlc2V0KHRwLT5pb2FkZHIsIE5vV2FpdCk7CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludAordHlwaG9vbl9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBjbWRfZGVzYyB4cF9jbWQ7CisKKwkvKiBJZiB3ZSdyZSBkb3duLCB3ZSdyZSBhbHJlYWR5IHN1c3BlbmRlZC4KKwkgKi8KKwlpZighbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19iaCgmdHAtPnN0YXRlX2xvY2spOworCWlmKHRwLT52bGdycCAmJiB0cC0+d29sX2V2ZW50cyAmIFRZUEhPT05fV0FLRV9NQUdJQ19QS1QpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJnRwLT5zdGF0ZV9sb2NrKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IGRvIFdBS0VfTUFHSUMgd2l0aCBWTEFOU1xuIiwKKwkJCQlkZXYtPm5hbWUpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlzcGluX3VubG9ja19iaCgmdHAtPnN0YXRlX2xvY2spOworCisJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCisJaWYodHlwaG9vbl9zdG9wX3J1bnRpbWUodHAsIFdhaXROb1NsZWVwKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHN0b3AgcnVudGltZVxuIiwgZGV2LT5uYW1lKTsKKwkJZ290byBuZWVkX3Jlc3VtZTsKKwl9CisKKwl0eXBob29uX2ZyZWVfcnhfcmluZ3ModHApOworCXR5cGhvb25faW5pdF9yaW5ncyh0cCk7CisKKwlpZih0eXBob29uX2Jvb3RfM1hQKHRwLCBUWVBIT09OX1NUQVRVU19XQUlUSU5HX0ZPUl9IT1NUKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGJvb3Qgc2xlZXAgaW1hZ2VcbiIsIGRldi0+bmFtZSk7CisJCWdvdG8gbmVlZF9yZXN1bWU7CisJfQorCisJSU5JVF9DT01NQU5EX05PX1JFU1BPTlNFKCZ4cF9jbWQsIFRZUEhPT05fQ01EX1NFVF9NQUNfQUREUkVTUyk7CisJeHBfY21kLnBhcm0xID0gY3B1X3RvX2xlMTYobnRvaHMoKih1MTYgKikmZGV2LT5kZXZfYWRkclswXSkpOworCXhwX2NtZC5wYXJtMiA9IGNwdV90b19sZTMyKG50b2hsKCoodTMyICopJmRldi0+ZGV2X2FkZHJbMl0pKTsKKwlpZih0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDAsIE5VTEwpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gc2V0IG1hYyBhZGRyZXNzIGluIHN1c3BlbmRcbiIsCisJCQkJZGV2LT5uYW1lKTsKKwkJZ290byBuZWVkX3Jlc3VtZTsKKwl9CisKKwlJTklUX0NPTU1BTkRfTk9fUkVTUE9OU0UoJnhwX2NtZCwgVFlQSE9PTl9DTURfU0VUX1JYX0ZJTFRFUik7CisJeHBfY21kLnBhcm0xID0gVFlQSE9PTl9SWF9GSUxURVJfRElSRUNURUQgfCBUWVBIT09OX1JYX0ZJTFRFUl9CUk9BRENBU1Q7CisJaWYodHlwaG9vbl9pc3N1ZV9jb21tYW5kKHRwLCAxLCAmeHBfY21kLCAwLCBOVUxMKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHNldCByeCBmaWx0ZXIgaW4gc3VzcGVuZFxuIiwKKwkJCQlkZXYtPm5hbWUpOworCQlnb3RvIG5lZWRfcmVzdW1lOworCX0KKworCWlmKHR5cGhvb25fc2xlZXAodHAsIHN0YXRlLCB0cC0+d29sX2V2ZW50cykgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBwdXQgY2FyZCB0byBzbGVlcFxuIiwgZGV2LT5uYW1lKTsKKwkJZ290byBuZWVkX3Jlc3VtZTsKKwl9CisKKwlyZXR1cm4gMDsKKworbmVlZF9yZXN1bWU6CisJdHlwaG9vbl9yZXN1bWUocGRldik7CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludAordHlwaG9vbl9lbmFibGVfd2FrZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIHN0YXRlLCBpbnQgZW5hYmxlKQoreworCXJldHVybiBwY2lfZW5hYmxlX3dha2UocGRldiwgc3RhdGUsIGVuYWJsZSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmluaXQKK3R5cGhvb25fdGVzdF9tbWlvKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGNpX2lvbWFwKHBkZXYsIDEsIDEyOCk7CisJaW50IG1vZGUgPSAwOworCXUzMiB2YWw7CisKKwlpZighaW9hZGRyKQorCQlnb3RvIG91dDsKKworCWlmKGlvcmVhZDMyKGlvYWRkciArIFRZUEhPT05fUkVHX1NUQVRVUykgIT0KKwkJCQlUWVBIT09OX1NUQVRVU19XQUlUSU5HX0ZPUl9IT1NUKQorCQlnb3RvIG91dF91bm1hcDsKKworCWlvd3JpdGUzMihUWVBIT09OX0lOVFJfQUxMLCBpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX01BU0spOworCWlvd3JpdGUzMihUWVBIT09OX0lOVFJfQUxMLCBpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX1NUQVRVUyk7CisJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9BTEwsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfRU5BQkxFKTsKKworCS8qIE9rLCBzZWUgaWYgd2UgY2FuIGNoYW5nZSBvdXIgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciBieQorCSAqIHNlbmRpbmcgb3Vyc2VsdmVzIGFuIGludGVycnVwdC4gSWYgc28sIHRoZW4gTU1JTyB3b3Jrcy4KKwkgKiBUaGUgNTB1c2VjIGRlbGF5IGlzIGFyYml0cmFyeSAtLSBpdCBjb3VsZCBwcm9iYWJseSBiZSBzbWFsbGVyLgorCSAqLworCXZhbCA9IGlvcmVhZDMyKGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfU1RBVFVTKTsKKwlpZigodmFsICYgVFlQSE9PTl9JTlRSX1NFTEYpID09IDApIHsKKwkJaW93cml0ZTMyKDEsIGlvYWRkciArIFRZUEhPT05fUkVHX1NFTEZfSU5URVJSVVBUKTsKKwkJaW9yZWFkMzIoaW9hZGRyICsgVFlQSE9PTl9SRUdfSU5UUl9TVEFUVVMpOworCQl1ZGVsYXkoNTApOworCQl2YWwgPSBpb3JlYWQzMihpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX1NUQVRVUyk7CisJCWlmKHZhbCAmIFRZUEhPT05fSU5UUl9TRUxGKQorCQkJbW9kZSA9IDE7CisJfQorCisJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9BTEwsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfTUFTSyk7CisJaW93cml0ZTMyKFRZUEhPT05fSU5UUl9BTEwsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfU1RBVFVTKTsKKwlpb3dyaXRlMzIoVFlQSE9PTl9JTlRSX05PTkUsIGlvYWRkciArIFRZUEhPT05fUkVHX0lOVFJfRU5BQkxFKTsKKwlpb3JlYWQzMihpb2FkZHIgKyBUWVBIT09OX1JFR19JTlRSX1NUQVRVUyk7CisKK291dF91bm1hcDoKKwlwY2lfaW91bm1hcChwZGV2LCBpb2FkZHIpOworCitvdXQ6CisJaWYoIW1vZGUpCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJmYWxsaW5nIGJhY2sgdG8gcG9ydCBJT1xuIik7CisJcmV0dXJuIG1vZGU7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0Cit0eXBob29uX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0YXRpYyBpbnQgZGlkX3ZlcnNpb24gPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHR5cGhvb24gKnRwOworCWludCBjYXJkX2lkID0gKGludCkgZW50LT5kcml2ZXJfZGF0YTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwl2b2lkICpzaGFyZWQ7CisJZG1hX2FkZHJfdCBzaGFyZWRfZG1hOworCXN0cnVjdCBjbWRfZGVzYyB4cF9jbWQ7CisJc3RydWN0IHJlc3BfZGVzYyB4cF9yZXNwWzNdOworCWludCBpOworCWludCBlcnIgPSAwOworCisJaWYoIWRpZF92ZXJzaW9uKyspCisJCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKnRwKSk7CisJaWYoZGV2ID09IE5VTEwpIHsKKwkJcHJpbnRrKEVSUl9QRlggIiVzOiB1bmFibGUgdG8gYWxsb2MgbmV3IG5ldCBkZXZpY2VcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmKGVyciA8IDApIHsKKwkJcHJpbnRrKEVSUl9QRlggIiVzOiB1bmFibGUgdG8gZW5hYmxlIGRldmljZVxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZ290byBlcnJvcl9vdXRfZGV2OworCX0KKworCWVyciA9IHBjaV9zZXRfbXdpKHBkZXYpOworCWlmKGVyciA8IDApIHsKKwkJcHJpbnRrKEVSUl9QRlggIiVzOiB1bmFibGUgdG8gc2V0IE1XSVxuIiwgcGNpX25hbWUocGRldikpOworCQlnb3RvIGVycm9yX291dF9kaXNhYmxlOworCX0KKworCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOworCWlmKGVyciA8IDApIHsKKwkJcHJpbnRrKEVSUl9QRlggIiVzOiBObyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb25cbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gZXJyb3Jfb3V0X213aTsKKwl9CisKKwkvKiBzYW5pdHkgY2hlY2tzIG9uIElPIGFuZCBNTUlPIEJBUnMKKwkgKi8KKwlpZighKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKSAmIElPUkVTT1VSQ0VfSU8pKSB7CisJCXByaW50ayhFUlJfUEZYCisJCSAgICAgICAiJXM6IHJlZ2lvbiAjMSBub3QgYSBQQ0kgSU8gcmVzb3VyY2UsIGFib3J0aW5nXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycm9yX291dF9td2k7CisJfQorCWlmKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgPCAxMjgpIHsKKwkJcHJpbnRrKEVSUl9QRlggIiVzOiBJbnZhbGlkIFBDSSBJTyByZWdpb24gc2l6ZSwgYWJvcnRpbmdcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3Jfb3V0X213aTsKKwl9CisJaWYoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMSkgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJcHJpbnRrKEVSUl9QRlgKKwkJICAgICAgICIlczogcmVnaW9uICMxIG5vdCBhIFBDSSBNTUlPIHJlc291cmNlLCBhYm9ydGluZ1xuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcl9vdXRfbXdpOworCX0KKwlpZihwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpIDwgMTI4KSB7CisJCXByaW50ayhFUlJfUEZYICIlczogSW52YWxpZCBQQ0kgTU1JTyByZWdpb24gc2l6ZSwgYWJvcnRpbmdcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3Jfb3V0X213aTsKKwl9CisKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsICJ0eXBob29uIik7CisJaWYoZXJyIDwgMCkgeworCQlwcmludGsoRVJSX1BGWCAiJXM6IGNvdWxkIG5vdCByZXF1ZXN0IHJlZ2lvbnNcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gZXJyb3Jfb3V0X213aTsKKwl9CisKKwkvKiBtYXAgb3VyIHJlZ2lzdGVycworCSAqLworCWlmKHVzZV9tbWlvICE9IDAgJiYgdXNlX21taW8gIT0gMSkKKwkJdXNlX21taW8gPSB0eXBob29uX3Rlc3RfbW1pbyhwZGV2KTsKKworCWlvYWRkciA9IHBjaV9pb21hcChwZGV2LCB1c2VfbW1pbywgMTI4KTsKKwlpZiAoIWlvYWRkcikgeworCQlwcmludGsoRVJSX1BGWCAiJXM6IGNhbm5vdCByZW1hcCByZWdpc3RlcnMsIGFib3J0aW5nXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycm9yX291dF9yZWdpb25zOworCX0KKworCS8qIGFsbG9jYXRlIHBjaSBkbWEgc3BhY2UgZm9yIHJ4IGFuZCB0eCBkZXNjcmlwdG9yIHJpbmdzCisJICovCisJc2hhcmVkID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCB0eXBob29uX3NoYXJlZCksCisJCQkJICAgICAgJnNoYXJlZF9kbWEpOworCWlmKCFzaGFyZWQpIHsKKwkJcHJpbnRrKEVSUl9QRlggIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgRE1BIG1lbW9yeVxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9vdXRfcmVtYXA7CisJfQorCisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXRwLT5zaGFyZWQgPSAoc3RydWN0IHR5cGhvb25fc2hhcmVkICopIHNoYXJlZDsKKwl0cC0+c2hhcmVkX2RtYSA9IHNoYXJlZF9kbWE7CisJdHAtPnBkZXYgPSBwZGV2OworCXRwLT50eF9wZGV2ID0gcGRldjsKKwl0cC0+aW9hZGRyID0gaW9hZGRyOworCXRwLT50eF9pb2FkZHIgPSBpb2FkZHI7CisJdHAtPmRldiA9IGRldjsKKworCS8qIEluaXQgc2VxdWVuY2U6CisJICogMSkgUmVzZXQgdGhlIGFkYXB0ZXIgdG8gY2xlYXIgYW55IGJhZCBqdWp1CisJICogMikgUmVsb2FkIHRoZSBzbGVlcCBpbWFnZQorCSAqIDMpIEJvb3QgdGhlIHNsZWVwIGltYWdlCisJICogNCkgR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzLgorCSAqIDUpIFB1dCB0aGUgY2FyZCB0byBzbGVlcC4KKwkgKi8KKwlpZiAodHlwaG9vbl9yZXNldChpb2FkZHIsIFdhaXRTbGVlcCkgPCAwKSB7CisJCXByaW50ayhFUlJfUEZYICIlczogY291bGQgbm90IHJlc2V0IDNYUFxuIiwgcGNpX25hbWUocGRldikpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycm9yX291dF9kbWE7CisJfQorCisJLyogTm93IHRoYXQgd2UndmUgcmVzZXQgdGhlIDNYUCBhbmQgYXJlIHN1cmUgaXQncyBub3QgZ29pbmcgdG8KKwkgKiB3cml0ZSBhbGwgb3ZlciBtZW1vcnksIGVuYWJsZSBidXMgbWFzdGVyaW5nLCBhbmQgc2F2ZSBvdXIKKwkgKiBzdGF0ZSBmb3IgcmVzdW1pbmcgYWZ0ZXIgYSBzdXNwZW5kLgorCSAqLworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCisJLyogZGV2LT5uYW1lIGlzIG5vdCB2YWxpZCB1bnRpbCB3ZSByZWdpc3RlciwgYnV0IHdlIG5lZWQgdG8KKwkgKiB1c2Ugc29tZSBjb21tb24gcm91dGluZXMgdG8gaW5pdGlhbGl6ZSB0aGUgY2FyZC4gU28gdGhhdCB0aG9zZQorCSAqIHJvdXRpbmVzIHByaW50IHRoZSByaWdodCBuYW1lLCB3ZSBrZWVwIG91ciBvdW4gcG9pbnRlciB0byB0aGUgbmFtZQorCSAqLworCXRwLT5uYW1lID0gcGNpX25hbWUocGRldik7CisKKwl0eXBob29uX2luaXRfaW50ZXJmYWNlKHRwKTsKKwl0eXBob29uX2luaXRfcmluZ3ModHApOworCisJaWYodHlwaG9vbl9ib290XzNYUCh0cCwgVFlQSE9PTl9TVEFUVVNfV0FJVElOR19GT1JfSE9TVCkgPCAwKSB7CisJCXByaW50ayhFUlJfUEZYICIlczogY2Fubm90IGJvb3QgM1hQIHNsZWVwIGltYWdlXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycm9yX291dF9yZXNldDsKKwl9CisKKwlJTklUX0NPTU1BTkRfV0lUSF9SRVNQT05TRSgmeHBfY21kLCBUWVBIT09OX0NNRF9SRUFEX01BQ19BRERSRVNTKTsKKwlpZih0eXBob29uX2lzc3VlX2NvbW1hbmQodHAsIDEsICZ4cF9jbWQsIDEsIHhwX3Jlc3ApIDwgMCkgeworCQlwcmludGsoRVJSX1BGWCAiJXM6IGNhbm5vdCByZWFkIE1BQyBhZGRyZXNzXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQllcnIgPSAtRUlPOworCQlnb3RvIGVycm9yX291dF9yZXNldDsKKwl9CisKKwkqKHUxNiAqKSZkZXYtPmRldl9hZGRyWzBdID0gaHRvbnMobGUxNl90b19jcHUoeHBfcmVzcFswXS5wYXJtMSkpOworCSoodTMyICopJmRldi0+ZGV2X2FkZHJbMl0gPSBodG9ubChsZTMyX3RvX2NwdSh4cF9yZXNwWzBdLnBhcm0yKSk7CisKKwlpZighaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkgeworCQlwcmludGsoRVJSX1BGWCAiJXM6IENvdWxkIG5vdCBvYnRhaW4gdmFsaWQgZXRoZXJuZXQgYWRkcmVzcywgIgorCQkgICAgICAgImFib3J0aW5nXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gZXJyb3Jfb3V0X3Jlc2V0OworCX0KKworCS8qIFJlYWQgdGhlIFNsZWVwIEltYWdlIHZlcnNpb24gbGFzdCwgc28gdGhlIHJlc3BvbnNlIGlzIHZhbGlkCisJICogbGF0ZXIgd2hlbiB3ZSBwcmludCBvdXQgdGhlIHZlcnNpb24gcmVwb3J0ZWQuCisJICovCisJSU5JVF9DT01NQU5EX1dJVEhfUkVTUE9OU0UoJnhwX2NtZCwgVFlQSE9PTl9DTURfUkVBRF9WRVJTSU9OUyk7CisJaWYodHlwaG9vbl9pc3N1ZV9jb21tYW5kKHRwLCAxLCAmeHBfY21kLCAzLCB4cF9yZXNwKSA8IDApIHsKKwkJcHJpbnRrKEVSUl9QRlggIiVzOiBDb3VsZCBub3QgZ2V0IFNsZWVwIEltYWdlIHZlcnNpb25cbiIsCisJCQlwY2lfbmFtZShwZGV2KSk7CisJCWdvdG8gZXJyb3Jfb3V0X3Jlc2V0OworCX0KKworCXRwLT5jYXBhYmlsaXRpZXMgPSB0eXBob29uX2NhcmRfaW5mb1tjYXJkX2lkXS5jYXBhYmlsaXRpZXM7CisJdHAtPnhjdnJfc2VsZWN0ID0gVFlQSE9PTl9YQ1ZSX0FVVE9ORUc7CisKKwkvKiBUeXBob29uIDEuMCBTbGVlcCBJbWFnZXMgcmV0dXJuIG9uZSByZXNwb25zZSBkZXNjcmlwdG9yIHRvIHRoZQorCSAqIFJFQURfVkVSU0lPTlMgY29tbWFuZC4gVGhvc2UgdmVyc2lvbnMgYXJlIE9LIGFmdGVyIHdha2luZyB1cAorCSAqIGZyb20gc2xlZXAgd2l0aG91dCBuZWVkaW5nIGEgcmVzZXQuIFR5cGhvb24gMS4xKyBTbGVlcCBJbWFnZXMKKwkgKiBzZWVtIHRvIG5lZWQgYSBsaXR0bGUgZXh0cmEgaGVscCB0byBnZXQgc3RhcnRlZC4gU2luY2Ugd2UgZG9uJ3QKKwkgKiBrbm93IGhvdyB0byBudWRnZSBpdCBhbG9uZywganVzdCBraWNrIGl0LgorCSAqLworCWlmKHhwX3Jlc3BbMF0ubnVtRGVzYyAhPSAwKQorCQl0cC0+Y2FwYWJpbGl0aWVzIHw9IFRZUEhPT05fV0FLRVVQX05FRURTX1JFU0VUOworCisJaWYodHlwaG9vbl9zbGVlcCh0cCwgUENJX0QzaG90LCAwKSA8IDApIHsKKwkJcHJpbnRrKEVSUl9QRlggIiVzOiBjYW5ub3QgcHV0IGFkYXB0ZXIgdG8gc2xlZXBcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyb3Jfb3V0X3Jlc2V0OworCX0KKworCS8qIFRoZSBjaGlwLXNwZWNpZmljIGVudHJpZXMgaW4gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJZGV2LT5vcGVuCQk9IHR5cGhvb25fb3BlbjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHR5cGhvb25fc3RhcnRfdHg7CisJZGV2LT5zdG9wCQk9IHR5cGhvb25fY2xvc2U7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QJPSB0eXBob29uX3NldF9yeF9tb2RlOworCWRldi0+dHhfdGltZW91dAkJPSB0eXBob29uX3R4X3RpbWVvdXQ7CisJZGV2LT5wb2xsCQk9IHR5cGhvb25fcG9sbDsKKwlkZXYtPndlaWdodAkJPSAxNjsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gVFhfVElNRU9VVDsKKwlkZXYtPmdldF9zdGF0cwkJPSB0eXBob29uX2dldF9zdGF0czsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcwk9IHR5cGhvb25fc2V0X21hY19hZGRyZXNzOworCWRldi0+dmxhbl9yeF9yZWdpc3Rlcgk9IHR5cGhvb25fdmxhbl9yeF9yZWdpc3RlcjsKKwlkZXYtPnZsYW5fcnhfa2lsbF92aWQJPSB0eXBob29uX3ZsYW5fcnhfa2lsbF92aWQ7CisJU0VUX0VUSFRPT0xfT1BTKGRldiwgJnR5cGhvb25fZXRodG9vbF9vcHMpOworCisJLyogV2UgY2FuIGhhbmRsZSBzY2F0dGVyIGdhdGhlciwgdXAgdG8gMTYgZW50cmllcywgYW5kCisJICogd2UgY2FuIGRvIElQIGNoZWNrc3VtbWluZyAob25seSB2ZXJzaW9uIDQsIGRvaC4uLikKKwkgKi8KKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0lQX0NTVU07CisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlg7CisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsKKworCWlmKHJlZ2lzdGVyX25ldGRldihkZXYpIDwgMCkKKwkJZ290byBlcnJvcl9vdXRfcmVzZXQ7CisKKwkvKiBmaXh1cCBvdXIgbG9jYWwgbmFtZSAqLworCXRwLT5uYW1lID0gZGV2LT5uYW1lOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogJXMgYXQgJXMgMHglbHgsICIsCisJICAgICAgIGRldi0+bmFtZSwgdHlwaG9vbl9jYXJkX2luZm9bY2FyZF9pZF0ubmFtZSwKKwkgICAgICAgdXNlX21taW8gPyAiTU1JTyIgOiAiSU8iLCBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgdXNlX21taW8pKTsKKwlmb3IoaSA9IDA7IGkgPCA1OyBpKyspCisJCXByaW50aygiJTIuMng6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCIlMi4yeFxuIiwgZGV2LT5kZXZfYWRkcltpXSk7CisKKwkvKiB4cF9yZXNwIHN0aWxsIGNvbnRhaW5zIHRoZSByZXNwb25zZSB0byB0aGUgUkVBRF9WRVJTSU9OUyBjb21tYW5kLgorCSAqIEZvciBkZWJ1Z2dpbmcsIGxldCB0aGUgdXNlciBrbm93IHdoYXQgdmVyc2lvbiBoZSBoYXMuCisJICovCisJaWYoeHBfcmVzcFswXS5udW1EZXNjID09IDApIHsKKwkJLyogVGhpcyBpcyB0aGUgVHlwaG9vbiAxLjAgdHlwZSBTbGVlcCBJbWFnZSwgbGFzdCAxNiBiaXRzCisJCSAqIG9mIHZlcnNpb24gaXMgTW9udGgvRGF5IG9mIGJ1aWxkLgorCQkgKi8KKwkJdTE2IG1vbnRoZGF5ID0gbGUzMl90b19jcHUoeHBfcmVzcFswXS5wYXJtMikgJiAweGZmZmY7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUeXBob29uIDEuMCBTbGVlcCBJbWFnZSBidWlsdCAiCisJCQkiJTAydS8lMDJ1LzIwMDBcbiIsIGRldi0+bmFtZSwgbW9udGhkYXkgPj4gOCwKKwkJCW1vbnRoZGF5ICYgMHhmZik7CisJfSBlbHNlIGlmKHhwX3Jlc3BbMF0ubnVtRGVzYyA9PSAyKSB7CisJCS8qIFRoaXMgaXMgdGhlIFR5cGhvb24gMS4xKyB0eXBlIFNsZWVwIEltYWdlCisJCSAqLworCQl1MzIgc2xlZXBfdmVyID0gbGUzMl90b19jcHUoeHBfcmVzcFswXS5wYXJtMik7CisJCXU4ICp2ZXJfc3RyaW5nID0gKHU4ICopICZ4cF9yZXNwWzFdOworCQl2ZXJfc3RyaW5nWzI1XSA9IDA7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUeXBob29uIDEuMSsgU2xlZXAgSW1hZ2UgdmVyc2lvbiAiCisJCQkiJTAyeC4lMDN4LiUwM3ggJXNcbiIsIGRldi0+bmFtZSwgc2xlZXBfdmVyID4+IDI0LAorCQkJKHNsZWVwX3ZlciA+PiAxMikgJiAweGZmZiwgc2xlZXBfdmVyICYgMHhmZmYsCisJCQl2ZXJfc3RyaW5nKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5rbm93biBTbGVlcCBJbWFnZSB2ZXJzaW9uICIKKwkJCSIoJXU6JTA0eClcbiIsIGRldi0+bmFtZSwgeHBfcmVzcFswXS5udW1EZXNjLAorCQkJbGUzMl90b19jcHUoeHBfcmVzcFswXS5wYXJtMikpOworCX0KKwkJCisJcmV0dXJuIDA7CisKK2Vycm9yX291dF9yZXNldDoKKwl0eXBob29uX3Jlc2V0KGlvYWRkciwgTm9XYWl0KTsKKworZXJyb3Jfb3V0X2RtYToKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemVvZihzdHJ1Y3QgdHlwaG9vbl9zaGFyZWQpLAorCQkJICAgIHNoYXJlZCwgc2hhcmVkX2RtYSk7CitlcnJvcl9vdXRfcmVtYXA6CisJcGNpX2lvdW5tYXAocGRldiwgaW9hZGRyKTsKK2Vycm9yX291dF9yZWdpb25zOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJvcl9vdXRfbXdpOgorCXBjaV9jbGVhcl9td2kocGRldik7CitlcnJvcl9vdXRfZGlzYWJsZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CitlcnJvcl9vdXRfZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CitlcnJvcl9vdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0Cit0eXBob29uX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdHlwaG9vbiAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJdHlwaG9vbl9yZXNldCh0cC0+aW9hZGRyLCBOb1dhaXQpOworCXBjaV9pb3VubWFwKHBkZXYsIHRwLT5pb2FkZHIpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKHN0cnVjdCB0eXBob29uX3NoYXJlZCksCisJCQkgICAgdHAtPnNoYXJlZCwgdHAtPnNoYXJlZF9kbWEpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2NsZWFyX213aShwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB0eXBob29uX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUlZfTU9EVUxFX05BTUUsCisJLmlkX3RhYmxlCT0gdHlwaG9vbl9wY2lfdGJsLAorCS5wcm9iZQkJPSB0eXBob29uX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodHlwaG9vbl9yZW1vdmVfb25lKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IHR5cGhvb25fc3VzcGVuZCwKKwkucmVzdW1lCQk9IHR5cGhvb25fcmVzdW1lLAorCS5lbmFibGVfd2FrZQk9IHR5cGhvb25fZW5hYmxlX3dha2UsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgX19pbml0Cit0eXBob29uX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZ0eXBob29uX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAordHlwaG9vbl9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ0eXBob29uX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHR5cGhvb25faW5pdCk7Cittb2R1bGVfZXhpdCh0eXBob29uX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHlwaG9vbi5oIGIvZHJpdmVycy9uZXQvdHlwaG9vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOGVlNzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC90eXBob29uLmgKQEAgLTAsMCArMSw2MTkgQEAKKy8qIHR5cGhvb24uaDoJY2hpcCBpbmZvIGZvciB0aGUgM0NvbSAzQ1I5OTAgZmFtaWx5IG9mIGNvbnRyb2xsZXJzICovCisvKgorCVdyaXR0ZW4gMjAwMi0yMDAzIGJ5IERhdmlkIERpbGxvdyA8ZGF2ZUB0aGVkaWxsb3dzLm9yZz4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKwl0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCURyaXZlcnMgYmFzZWQgb24gb3IgZGVyaXZlZCBmcm9tIHRoaXMgY29kZSBmYWxsIHVuZGVyIHRoZSBHUEwgYW5kIG11c3QKKwlyZXRhaW4gdGhlIGF1dGhvcnNoaXAsIGNvcHlyaWdodCBhbmQgbGljZW5zZSBub3RpY2UuICBUaGlzIGZpbGUgaXMgbm90CisJYSBjb21wbGV0ZSBwcm9ncmFtIGFuZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdGhlIGVudGlyZSBvcGVyYXRpbmcKKwlzeXN0ZW0gaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4KKworCVRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIG9uIGEgcHVibGljIHdlYiBzaXRlLiBJdCBtYXkgZW5hYmxlCisJY3J5cHRvZ3JhcGhpYyBjYXBhYmlsaXRpZXMgb2YgdGhlIDNDb20gaGFyZHdhcmUsIGFuZCBtYXkgYmUKKwlleHBvcnRlZCBmcm9tIHRoZSBVbml0ZWQgU3RhdGVzIHVuZGVyIExpY2Vuc2UgRXhjZXB0aW9uICJUU1UiCisJcHVyc3VhbnQgdG8gMTUgQy5GLlIuIFNlY3Rpb24gNzQwLjEzKGUpLgorCisJVGhpcyB3b3JrIHdhcyBmdW5kZWQgYnkgdGhlIE5hdGlvbmFsIExpYnJhcnkgb2YgTWVkaWNpbmUgdW5kZXIKKwl0aGUgRGVwYXJ0bWVudCBvZiBFbmVyZ3kgcHJvamVjdCBudW1iZXIgMDI3NEREMDZEMSBhbmQgTkxNIHByb2plY3QKKwludW1iZXIgWTEtTE0tMjAxNS0wMS4KKyovCisKKy8qIEFsbCBUeXBob29uIHJpbmcgcG9zaXRpb25zIGFyZSBzcGVjaWZpY2VkIGluIGJ5dGVzLCBhbmQgcG9pbnQgdG8gdGhlCisgKiBmaXJzdCAiY2xlYW4iIGVudHJ5IGluIHRoZSByaW5nIC0tIGllIHRoZSBuZXh0IGVudHJ5IHdlIHVzZSBmb3Igd2hhdGV2ZXIKKyAqIHB1cnBvc2UuCisgKi8KKworLyogVGhlIFR5cGhvb24gYmFzaWMgcmluZworICogcmluZ0Jhc2U6ICB3aGVyZSB0aGlzIHJpbmcgbGl2ZXMgKG91ciB2aXJ0dWFsIGFkZHJlc3MpCisgKiBsYXN0V3JpdGU6IHRoZSBuZXh0IGVudHJ5IHdlJ2xsIHVzZQorICovCitzdHJ1Y3QgYmFzaWNfcmluZyB7CisJdTggKnJpbmdCYXNlOworCXUzMiBsYXN0V3JpdGU7Cit9OworCisvKiBUaGUgVHlwb29uIHRyYW5zbWl0IHJpbmcgLS0gc2FtZSBhcyBhIGJhc2ljIHJpbmcsIHBsdXM6CisgKiBsYXN0UmVhZDogICAgICB3aGVyZSB3ZSdyZSBhdCBpbiByZWdhcmQgdG8gY2xlYW5pbmcgdXAgdGhlIHJpbmcKKyAqIHdyaXRlUmVnaXN0ZXI6IHJlZ2lzdGVyIHRvIHVzZSBmb3Igd3JpdGluZyAoZGlmZmVyZW50IGZvciBIaSAmIExvIHJpbmdzKQorICovCitzdHJ1Y3QgdHJhbnNtaXRfcmluZyB7CisJdTggKnJpbmdCYXNlOworCXUzMiBsYXN0V3JpdGU7CisJdTMyIGxhc3RSZWFkOworCWludCB3cml0ZVJlZ2lzdGVyOworfTsKKworLyogVGhlIGhvc3Q8LT5UeXBob29uIHJpbmcgaW5kZXggc3RydWN0dXJlCisgKiBUaGlzIGluZGljYXRlcyB0aGUgY3VycmVudCBwb3NpdGlvbnMgaW4gdGhlIHJpbmdzCisgKiAKKyAqIEFsbCB2YWx1ZXMgbXVzdCBiZSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCBmb3IgdGhlIDNYUAorICoKKyAqIHJ4SGlDbGVhcmVkOiAgIGVudHJ5IHdlJ3ZlIGNsZWFyZWQgdG8gaW4gdGhlIEhpIHJlY2VpdmUgcmluZworICogcnhMb0NsZWFyZWQ6ICAgZW50cnkgd2UndmUgY2xlYXJlZCB0byBpbiB0aGUgTG8gcmVjZWl2ZSByaW5nCisgKiByeEJ1ZmZSZWFkeTogICBuZXh0IGVudHJ5IHdlJ2xsIHB1dCBhIGZyZWUgYnVmZmVyIGluCisgKiByZXNwQ2xlYXJlZDogICBlbnRyeSB3ZSd2ZSBjbGVhcmVkIHRvIGluIHRoZSByZXNwb25zZSByaW5nCisgKgorICogdHhMb0NsZWFyZWQ6ICAgZW50cnkgdGhlIE5JQyBoYXMgY2xlYXJlZCB0byBpbiB0aGUgTG8gdHJhbnNtaXQgcmluZworICogdHhIaUNsZWFyZWQ6ICAgZW50cnkgdGhlIE5JQyBoYXMgY2xlYXJlZCB0byBpbiB0aGUgSGkgdHJhbnNtaXQgcmluZworICogcnhMb1JlYWR5OiAgICAgZW50cnkgdGhlIE5JQyBoYXMgZmlsbGVkIHRvIGluIHRoZSBMbyByZWNlaXZlIHJpbmcKKyAqIHJ4QnVmZkNsZWFyZWQ6IGVudHJ5IHRoZSBOSUMgaGFzIGNsZWFyZWQgaW4gdGhlIGZyZWUgYnVmZmVyIHJpbmcKKyAqIGNtZENsZWFyZWQ6ICAgIGVudHJ5IHRoZSBOSUMgaGFzIGNsZWFyZWQgaW4gdGhlIGNvbW1hbmQgcmluZworICogcmVzcFJlYWR5OiAgICAgZW50cnkgdGhlIE5JQyBoYXMgZmlsbGVkIHRvIGluIHRoZSByZXNwb25zZSByaW5nCisgKiByeEhpUmVhZHk6ICAgICBlbnRyeSB0aGUgTklDIGhhcyBmaWxsZWQgdG8gaW4gdGhlIEhpIHJlY2VpdmUgcmluZworICovCitzdHJ1Y3QgdHlwaG9vbl9pbmRleGVzIHsKKwkvKiBUaGUgZmlyc3QgZm91ciBhcmUgd3JpdHRlbiBieSB0aGUgaG9zdCwgYW5kIHJlYWQgYnkgdGhlIE5JQyAqLworCXZvbGF0aWxlIHUzMiByeEhpQ2xlYXJlZDsKKwl2b2xhdGlsZSB1MzIgcnhMb0NsZWFyZWQ7CisJdm9sYXRpbGUgdTMyIHJ4QnVmZlJlYWR5OworCXZvbGF0aWxlIHUzMiByZXNwQ2xlYXJlZDsKKworCS8qIFRoZSByZW1haW5pbmcgYXJlIHdyaXR0ZW4gYnkgdGhlIE5JQywgYW5kIHJlYWQgYnkgdGhlIGhvc3QgKi8KKwl2b2xhdGlsZSB1MzIgdHhMb0NsZWFyZWQ7CisJdm9sYXRpbGUgdTMyIHR4SGlDbGVhcmVkOworCXZvbGF0aWxlIHUzMiByeExvUmVhZHk7CisJdm9sYXRpbGUgdTMyIHJ4QnVmZkNsZWFyZWQ7CisJdm9sYXRpbGUgdTMyIGNtZENsZWFyZWQ7CisJdm9sYXRpbGUgdTMyIHJlc3BSZWFkeTsKKwl2b2xhdGlsZSB1MzIgcnhIaVJlYWR5OworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFRoZSBob3N0PC0+VHlwaG9vbiBpbnRlcmZhY2UKKyAqIE91ciBtZWFucyBvZiBjb21tdW5pY2F0aW5nIHdoZXJlIHRoaW5ncyBhcmUKKyAqCisgKiBBbGwgdmFsdWVzIG11c3QgYmUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQgZm9yIHRoZSAzWFAKKyAqCisgKiByaW5nSW5kZXg6ICAgNjQgYml0IGJ1cyBhZGRyZXNzIG9mIHRoZSBpbmRleCBzdHJ1Y3R1cmUKKyAqIHR4TG9BZGRyOiAgICA2NCBiaXQgYnVzIGFkZHJlc3Mgb2YgdGhlIExvIHRyYW5zbWl0IHJpbmcKKyAqIHR4TG9TaXplOiAgICBzaXplIChpbiBieXRlcykgb2YgdGhlIExvIHRyYW5zbWl0IHJpbmcKKyAqIHR4SGkqOiAgICAgICBhcyBhYm92ZSBmb3IgdGhlIEhpIHByaW9yaXR5IHRyYW5zbWl0IHJpbmcKKyAqIHJ4TG8qOiAgICAgICBhcyBhYm92ZSBmb3IgdGhlIExvIHByaW9yaXR5IHJlY2VpdmUgcmluZworICogcnhCdWZmKjogICAgIGFzIGFib3ZlIGZvciB0aGUgZnJlZSBidWZmZXIgcmluZworICogY21kKjogICAgICAgIGFzIGFib3ZlIGZvciB0aGUgY29tbWFuZCByaW5nCisgKiByZXNwKjogICAgICAgYXMgYWJvdmUgZm9yIHRoZSByZXNwb25zZSByaW5nCisgKiB6ZXJvQWRkcjogICAgNjQgYml0IGJ1cyBhZGRyZXNzIG9mIGEgemVybyB3b3JkIChmb3IgRE1BKQorICogcnhIaSo6ICAgICAgIGFzIGFib3ZlIGZvciB0aGUgSGkgUHJpb3JpdHkgcmVjZWl2ZSByaW5nCisgKgorICogV2hpbGUgdGhlcmUgaXMgcm9vbSBmb3IgNjQgYml0IGFkZHJlc3NlcywgY3VycmVudCB2ZXJzaW9ucyBvZiB0aGUgM1hQCisgKiBvbmx5IGRvIDMyIGJpdCBhZGRyZXNzZXMsIHNvIHRoZSAqSGkgZm9yIGVhY2ggb2YgdGhlIGFib3ZlIHdpbGwgYWx3YXlzCisgKiBiZSB6ZXJvLgorICovCitzdHJ1Y3QgdHlwaG9vbl9pbnRlcmZhY2UgeworCXUzMiByaW5nSW5kZXg7CisJdTMyIHJpbmdJbmRleEhpOworCXUzMiB0eExvQWRkcjsKKwl1MzIgdHhMb0FkZHJIaTsKKwl1MzIgdHhMb1NpemU7CisJdTMyIHR4SGlBZGRyOworCXUzMiB0eEhpQWRkckhpOworCXUzMiB0eEhpU2l6ZTsKKwl1MzIgcnhMb0FkZHI7CisJdTMyIHJ4TG9BZGRySGk7CisJdTMyIHJ4TG9TaXplOworCXUzMiByeEJ1ZmZBZGRyOworCXUzMiByeEJ1ZmZBZGRySGk7CisJdTMyIHJ4QnVmZlNpemU7CisJdTMyIGNtZEFkZHI7CisJdTMyIGNtZEFkZHJIaTsKKwl1MzIgY21kU2l6ZTsKKwl1MzIgcmVzcEFkZHI7CisJdTMyIHJlc3BBZGRySGk7CisJdTMyIHJlc3BTaXplOworCXUzMiB6ZXJvQWRkcjsKKwl1MzIgemVyb0FkZHJIaTsKKwl1MzIgcnhIaUFkZHI7CisJdTMyIHJ4SGlBZGRySGk7CisJdTMyIHJ4SGlTaXplOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFRoZSBUeXBob29uIHRyYW5zbWl0L2ZyYWdtZW50IGRlc2NyaXB0b3IKKyAqCisgKiBBIHBhY2tldCBpcyBkZXNjcmliZWQgYnkgYSBwYWNrZXQgZGVzY3JpcHRvciwgZm9sbG93ZWQgYnkgb3B0aW9uIGRlc2NyaXB0b3JzLAorICogaWYgYW55LCB0aGVuIG9uZSBvciBtb3JlIGZyYWdtZW50IGRlc2NyaXB0b3JzLgorICogCisgKiBQYWNrZXQgZGVzY3JpcHRvcjoKKyAqIGZsYWdzOglEZXNjcmlwdG9yIHR5cGUKKyAqIGxlbjppCXplcm8sIG9yIGxlbmd0aCBvZiB0aGlzIHBhY2tldAorICogYWRkcio6CTggYnl0ZXMgb2Ygb3BhcXVlIGRhdGEgdG8gdGhlIGZpcm13YXJlIC0tIGZvciBza2IgcG9pbnRlcgorICogcHJvY2Vzc0ZsYWdzOiBEZXRlcm1pbmUgb2ZmbG9hZCB0YXNrcyB0byBwZXJmb3JtIG9uIHRoaXMgcGFja2V0LgorICoKKyAqIEZyYWdtZW50IGRlc2NyaXB0b3I6CisgKiBmbGFnczoJRGVzY3JpcHRvciB0eXBlCisgKiBsZW46aQlsZW5ndGggb2YgdGhpcyBmcmFnbWVudAorICogYWRkcjoJbG93IGJ5dGVzIG9mIERNQSBhZGRyZXNzIGZvciB0aGlzIHBhcnQgb2YgdGhlIHBhY2tldAorICogYWRkckhpOgloaSBieXRlcyBvZiBETUEgYWRkcmVzcyBmb3IgdGhpcyBwYXJ0IG9mIHRoZSBwYWNrZXQKKyAqIHByb2Nlc3NGbGFnczogbXVzdCBiZSB6ZXJvCisgKgorICogVFlQSE9PTl9ERVNDX1ZBTElEIGlzIG5vdCBtZW50aW9uZWQgaW4gdGhlaXIgZG9jcywgYnV0IHRoZWlyIExpbnV4CisgKiBkcml2ZXIgdXNlcyBpdC4KKyAqLworc3RydWN0IHR4X2Rlc2MgeworCXU4ICBmbGFnczsKKyNkZWZpbmUgVFlQSE9PTl9UWVBFX01BU0sJMHgwNworI2RlZmluZSAJVFlQSE9PTl9GUkFHX0RFU0MJMHgwMAorI2RlZmluZSAJVFlQSE9PTl9UWF9ERVNDCQkweDAxCisjZGVmaW5lIAlUWVBIT09OX0NNRF9ERVNDCTB4MDIKKyNkZWZpbmUgCVRZUEhPT05fT1BUX0RFU0MJMHgwMworI2RlZmluZSAJVFlQSE9PTl9SWF9ERVNDCQkweDA0CisjZGVmaW5lIAlUWVBIT09OX1JFU1BfREVTQwkweDA1CisjZGVmaW5lIFRZUEhPT05fT1BUX1RZUEVfTUFTSwkweGYwCisjZGVmaW5lIAlUWVBIT09OX09QVF9JUFNFQwkweDAwCisjZGVmaW5lIAlUWVBIT09OX09QVF9UQ1BfU0VHCTB4MTAKKyNkZWZpbmUgVFlQSE9PTl9DTURfUkVTUE9ORAkweDQwCisjZGVmaW5lIFRZUEhPT05fUkVTUF9FUlJPUgkweDQwCisjZGVmaW5lIFRZUEhPT05fUlhfRVJST1IJMHg0MAorI2RlZmluZSBUWVBIT09OX0RFU0NfVkFMSUQJMHg4MAorCXU4ICBudW1EZXNjOworCXUxNiBsZW47CisJdTMyIGFkZHI7CisJdTMyIGFkZHJIaTsKKwl1MzIgcHJvY2Vzc0ZsYWdzOworI2RlZmluZSBUWVBIT09OX1RYX1BGX05PX0NSQwkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDAxKQorI2RlZmluZSBUWVBIT09OX1RYX1BGX0lQX0NIS1NVTQkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDAyKQorI2RlZmluZSBUWVBIT09OX1RYX1BGX1RDUF9DSEtTVU0JX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDA0KQorI2RlZmluZSBUWVBIT09OX1RYX1BGX1RDUF9TRUdNRU5UCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwOCkKKyNkZWZpbmUgVFlQSE9PTl9UWF9QRl9JTlNFUlRfVkxBTglfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMTApCisjZGVmaW5lIFRZUEhPT05fVFhfUEZfSVBTRUMJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAyMCkKKyNkZWZpbmUgVFlQSE9PTl9UWF9QRl9WTEFOX1BSSU9SSVRZCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDA0MCkKKyNkZWZpbmUgVFlQSE9PTl9UWF9QRl9VRFBfQ0hLU1VNCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDA4MCkKKyNkZWZpbmUgVFlQSE9PTl9UWF9QRl9QQURfRlJBTUUJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDEwMCkKKyNkZWZpbmUgVFlQSE9PTl9UWF9QRl9SRVNFUlZFRAkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwZTAwKQorI2RlZmluZSBUWVBIT09OX1RYX1BGX1ZMQU5fTUFTSwkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDBmZmZmMDAwKQorI2RlZmluZSBUWVBIT09OX1RYX1BGX0lOVEVSTkFMCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4ZjAwMDAwMDApCisjZGVmaW5lIFRZUEhPT05fVFhfUEZfVkxBTl9UQUdfU0hJRlQJMTIKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBUaGUgVENQIFNlZ21lbnRhdGlvbiBvZmZsb2FkIG9wdGlvbiBkZXNjcmlwdG9yCisgKgorICogZmxhZ3M6CWRlc2NyaXB0b3IgdHlwZQorICogbnVtRGVzYzoJbXVzdCBiZSAxCisgKiBtc3NfZmxhZ3M6CWJpdHMgMC0xMSAobGl0dGxlIGVuZGlhbikgYXJlIE1TUywgMTIgaXMgZmlyc3QgVFNPIGRlc2NyaXB0b3IKKyAqCQkJMTMgaXMgbGlzdCBUU08gZGVzY3JpcHRvciwgc2V0IGJvdGggaWYgb25seSBvbmUgVFNPCisgKiByZXNwQWRkckxvOglsb3cgYnl0ZXMgb2YgYWRkcmVzcyBvZiB0aGUgYnl0ZXNUeCBmaWVsZCBvZiB0aGlzIGRlc2NyaXB0b3IKKyAqIGJ5dGVzVHg6CXRvdGFsIG51bWJlciBvZiBieXRlcyBpbiB0aGlzIFRTTyByZXF1ZXN0CisgKiBzdGF0dXM6CTAgb24gY29tcGxldGlvbgorICovCitzdHJ1Y3QgdGNwb3B0X2Rlc2MgeworCXU4ICBmbGFnczsKKwl1OCAgbnVtRGVzYzsKKwl1MTYgbXNzX2ZsYWdzOworI2RlZmluZSBUWVBIT09OX1RTT19GSVJTVAkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDEwMDApCisjZGVmaW5lIFRZUEhPT05fVFNPX0xBU1QJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgyMDAwKQorCXUzMiByZXNwQWRkckxvOworCXUzMiBieXRlc1R4OworCXUzMiBzdGF0dXM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVGhlIElQU0VDIE9mZmxvYWQgZGVzY3JpcHRvcgorICoKKyAqIGZsYWdzOglkZXNjcmlwdG9yIHR5cGUKKyAqIG51bURlc2M6CW11c3QgYmUgMQorICogaXBzZWNGbGFnczoJYml0IDA6IDAgLS0gZ2VuZXJhdGUgSVYsIDEgLS0gdXNlIHN1cHBsaWVkIElWCisgKiBzYTEsIHNhMjoJU2VjdXJpdHkgQXNzb2NpYXRpb24gSURzIGZvciB0aGlzIHBhY2tldAorICogcmVzZXJ2ZWQ6CXNldCB0byAwCisgKi8KK3N0cnVjdCBpcHNlY19kZXNjIHsKKwl1OCAgZmxhZ3M7CisJdTggIG51bURlc2M7CisJdTE2IGlwc2VjRmxhZ3M7CisjZGVmaW5lIFRZUEhPT05fSVBTRUNfR0VOX0lWCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDAwKQorI2RlZmluZSBUWVBIT09OX0lQU0VDX1VTRV9JVglfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwMSkKKwl1MzIgc2ExOworCXUzMiBzYTI7CisJdTMyIHJlc2VydmVkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFRoZSBUeXBob29uIHJlY2VpdmUgZGVzY3JpcHRvciAoVXBkYXRlZCBieSBOSUMpCisgKgorICogZmxhZ3M6ICAgICAgICAgRGVzY3JpcHRvciB0eXBlLCBlcnJvciBpbmRpY2F0aW9uCisgKiBudW1EZXNjOiAgICAgICBBbHdheXMgemVybworICogZnJhbWVMZW46ICAgICAgdGhlIHNpemUgb2YgdGhlIHBhY2tldCByZWNlaXZlZAorICogYWRkcjogICAgICAgICAgbG93IDMyIGJ5dGVzIG9mIHRoZSB2aXJ0dWFsIGFkZHIgcGFzc2VkIGluIGZvciB0aGlzIGJ1ZmZlcgorICogYWRkckhpOiAgICAgICAgaGlnaCAzMiBieXRlcyBvZiB0aGUgdmlydHVhbCBhZGRyIHBhc3NlZCBpbiBmb3IgdGhpcyBidWZmZXIKKyAqIHJ4U3RhdHVzOiAgICAgIEVycm9yIGlmIHNldCBpbiBmbGFncywgb3RoZXJ3aXNlIHJlc3VsdCBvZiBvZmZsb2FkIHByb2Nlc3NpbmcKKyAqIGZpbHRlclJlc3VsdHM6IHJlc3VsdHMgb2YgZmlsdGVyaW5nIG9uIHBhY2tldCwgbm90IHVzZWQKKyAqIGlwc2VjUmVzdWx0czogIFJlc3VsdHMgb2YgSVBTRUMgcHJvY2Vzc2luZworICogdmxhblRhZzogICAgICAgdGhlIDgwMS4ycSBUQ0kgZnJvbSB0aGUgcGFja2V0CisgKi8KK3N0cnVjdCByeF9kZXNjIHsKKwl1OCAgZmxhZ3M7CisJdTggIG51bURlc2M7CisJdTE2IGZyYW1lTGVuOworCXUzMiBhZGRyOworCXUzMiBhZGRySGk7CisJdTMyIHJ4U3RhdHVzOworI2RlZmluZSBUWVBIT09OX1JYX0VSUl9JTlRFUk5BTAkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDAwKQorI2RlZmluZSBUWVBIT09OX1JYX0VSUl9GSUZPX1VOREVSUlVOCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwMSkKKyNkZWZpbmUgVFlQSE9PTl9SWF9FUlJfQkFEX1NTRAkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDAyKQorI2RlZmluZSBUWVBIT09OX1JYX0VSUl9SVU5UCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDMpCisjZGVmaW5lIFRZUEhPT05fUlhfRVJSX0NSQwkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDA0KQorI2RlZmluZSBUWVBIT09OX1JYX0VSUl9PVkVSU0laRQkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDA1KQorI2RlZmluZSBUWVBIT09OX1JYX0VSUl9BTElHTgkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDA2KQorI2RlZmluZSBUWVBIT09OX1JYX0VSUl9EUklCQkxFCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDcpCisjZGVmaW5lIFRZUEhPT05fUlhfUFJPVE9fTUFTSwkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDAzKQorI2RlZmluZSBUWVBIT09OX1JYX1BST1RPX1VOS05PV04JX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDAwKQorI2RlZmluZSBUWVBIT09OX1JYX1BST1RPX0lQCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDEpCisjZGVmaW5lIFRZUEhPT05fUlhfUFJPVE9fSVBYCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDIpCisjZGVmaW5lIFRZUEhPT05fUlhfVkxBTgkJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwNCkKKyNkZWZpbmUgVFlQSE9PTl9SWF9JUF9GUkFHCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDgpCisjZGVmaW5lIFRZUEhPT05fUlhfSVBTRUMJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAxMCkKKyNkZWZpbmUgVFlQSE9PTl9SWF9JUF9DSEtfRkFJTAkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDIwKQorI2RlZmluZSBUWVBIT09OX1JYX1RDUF9DSEtfRkFJTAkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDQwKQorI2RlZmluZSBUWVBIT09OX1JYX1VEUF9DSEtfRkFJTAkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDgwKQorI2RlZmluZSBUWVBIT09OX1JYX0lQX0NIS19HT09ECQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAxMDApCisjZGVmaW5lIFRZUEhPT05fUlhfVENQX0NIS19HT09ECQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAyMDApCisjZGVmaW5lIFRZUEhPT05fUlhfVURQX0NIS19HT09ECQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDA0MDApCisJdTE2IGZpbHRlclJlc3VsdHM7CisjZGVmaW5lIFRZUEhPT05fUlhfRklMVEVSX01BU0sJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHg3ZmZmKQorI2RlZmluZSBUWVBIT09OX1JYX0ZJTFRFUkVECQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4ODAwMCkKKwl1MTYgaXBzZWNSZXN1bHRzOworI2RlZmluZSBUWVBIT09OX1JYX09VVEVSX0FIX0dPT0QJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDEpCisjZGVmaW5lIFRZUEhPT05fUlhfT1VURVJfRVNQX0dPT0QJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDIpCisjZGVmaW5lIFRZUEhPT05fUlhfSU5ORVJfQUhfR09PRAlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwNCkKKyNkZWZpbmUgVFlQSE9PTl9SWF9JTk5FUl9FU1BfR09PRAlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwOCkKKyNkZWZpbmUgVFlQSE9PTl9SWF9PVVRFUl9BSF9GQUlMCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDEwKQorI2RlZmluZSBUWVBIT09OX1JYX09VVEVSX0VTUF9GQUlMCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDIwKQorI2RlZmluZSBUWVBIT09OX1JYX0lOTkVSX0FIX0ZBSUwJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwNDApCisjZGVmaW5lIFRZUEhPT05fUlhfSU5ORVJfRVNQX0ZBSUwJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwODApCisjZGVmaW5lIFRZUEhPT05fUlhfVU5LTk9XTl9TQQkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAxMDApCisjZGVmaW5lIFRZUEhPT05fUlhfRVNQX0ZPUk1BVF9FUlIJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAyMDApCisJdTMyIHZsYW5UYWc7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVGhlIFR5cGhvb24gZnJlZSBidWZmZXIgZGVzY3JpcHRvciwgdXNlZCB0byBnaXZlIGEgYnVmZmVyIHRvIHRoZSBOSUMKKyAqCisgKiBwaHlzQWRkcjogICAgbG93IDMyIGJpdHMgb2YgdGhlIGJ1cyBhZGRyZXNzIG9mIHRoZSBidWZmZXIKKyAqIHBoeXNBZGRySGk6ICBoaWdoIDMyIGJpdHMgb2YgdGhlIGJ1cyBhZGRyZXNzIG9mIHRoZSBidWZmZXIsIGFsd2F5cyB6ZXJvCisgKiB2aXJ0QWRkcjogICAgbG93IDMyIGJpdHMgb2YgdGhlIHNrYiBhZGRyZXNzCisgKiB2aXJ0QWRkckhpOiAgaGlnaCAzMiBiaXRzIG9mIHRoZSBza2IgYWRkcmVzcywgYWx3YXlzIHplcm8KKyAqCisgKiB0aGUgdmlydCogYWRkcmVzcyBpcyBiYXNpY2FsbHkgdHdvIDMyIGJpdCBjb29raWVzLCBqdXN0IHBhc3NlZCBiYWNrCisgKiBmcm9tIHRoZSBOSUMKKyAqLworc3RydWN0IHJ4X2ZyZWUgeworCXUzMiBwaHlzQWRkcjsKKwl1MzIgcGh5c0FkZHJIaTsKKwl1MzIgdmlydEFkZHI7CisJdTMyIHZpcnRBZGRySGk7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVGhlIFR5cGhvb24gY29tbWFuZCBkZXNjcmlwdG9yLCB1c2VkIGZvciBjb21tYW5kcyBhbmQgcmVzcG9uc2VzCisgKgorICogZmxhZ3M6ICAgZGVzY3JpcHRvciB0eXBlCisgKiBudW1EZXNjOiBudW1iZXIgb2YgZGVzY3JpcHRvcnMgZm9sbG93aW5nIGluIHRoaXMgY29tbWFuZC9yZXNwb25zZSwKKyAqCQkJCWllLCB6ZXJvIGZvciBhIG9uZSBkZXNjcmlwdG9yIGNvbW1hbmQKKyAqIGNtZDogICAgIHRoZSBjb21tYW5kCisgKiBzZXFObzogICBzZXF1ZW5jZSBudW1iZXIgKHVudXNlZCkKKyAqIHBhcm0xOiAgIHVzZSB2YXJpZXMgYnkgY29tbWFuZAorICogcGFybTI6ICAgdXNlIHZhcmllcyBieSBjb21tYW5kCisgKiBwYXJtMzogICB1c2UgdmFyaWVzIGJ5IGNvbW1hbmQKKyAqLworc3RydWN0IGNtZF9kZXNjIHsKKwl1OCAgZmxhZ3M7CisJdTggIG51bURlc2M7CisJdTE2IGNtZDsKKyNkZWZpbmUgVFlQSE9PTl9DTURfVFhfRU5BQkxFCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwMSkKKyNkZWZpbmUgVFlQSE9PTl9DTURfVFhfRElTQUJMRQkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDIpCisjZGVmaW5lIFRZUEhPT05fQ01EX1JYX0VOQUJMRQkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDMpCisjZGVmaW5lIFRZUEhPT05fQ01EX1JYX0RJU0FCTEUJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDA0KQorI2RlZmluZSBUWVBIT09OX0NNRF9TRVRfUlhfRklMVEVSCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDA1KQorI2RlZmluZSBUWVBIT09OX0NNRF9SRUFEX1NUQVRTCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwNykKKyNkZWZpbmUgVFlQSE9PTl9DTURfWENWUl9TRUxFQ1QJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDEzKQorI2RlZmluZSBUWVBIT09OX0NNRF9TRVRfTUFYX1BLVF9TSVpFCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDFhKQorI2RlZmluZSBUWVBIT09OX0NNRF9SRUFEX01FRElBX1NUQVRVUwlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAxYikKKyNkZWZpbmUgVFlQSE9PTl9DTURfR09UT19TTEVFUAkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMjMpCisjZGVmaW5lIFRZUEhPT05fQ01EX1NFVF9NVUxUSUNBU1RfSEFTSAlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAyNSkKKyNkZWZpbmUgVFlQSE9PTl9DTURfU0VUX01BQ19BRERSRVNTCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDI2KQorI2RlZmluZSBUWVBIT09OX0NNRF9SRUFEX01BQ19BRERSRVNTCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDI3KQorI2RlZmluZSBUWVBIT09OX0NNRF9WTEFOX1RZUEVfV1JJVEUJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMmIpCisjZGVmaW5lIFRZUEhPT05fQ01EX0NSRUFURV9TQQkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMzQpCisjZGVmaW5lIFRZUEhPT05fQ01EX0RFTEVURV9TQQkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMzUpCisjZGVmaW5lIFRZUEhPT05fQ01EX1JFQURfVkVSU0lPTlMJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwNDMpCisjZGVmaW5lIFRZUEhPT05fQ01EX0lSUV9DT0FMRVNDRV9DVFJMCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDQ1KQorI2RlZmluZSBUWVBIT09OX0NNRF9FTkFCTEVfV0FLRV9FVkVOVFMJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwNDkpCisjZGVmaW5lIFRZUEhPT05fQ01EX1NFVF9PRkZMT0FEX1RBU0tTCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDRmKQorI2RlZmluZSBUWVBIT09OX0NNRF9IRUxMT19SRVNQCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDA1NykKKyNkZWZpbmUgVFlQSE9PTl9DTURfSEFMVAkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwNWQpCisjZGVmaW5lIFRZUEhPT05fQ01EX1JFQURfSVBTRUNfSU5GTwlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDA1ZSkKKyNkZWZpbmUgVFlQSE9PTl9DTURfR0VUX0lQU0VDX0VOQUJMRQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDA2NykKKyNkZWZpbmUgVFlQSE9PTl9DTURfR0VUX0NNRF9MVkwJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDY5KQorCXUxNiBzZXFObzsKKwl1MTYgcGFybTE7CisJdTMyIHBhcm0yOworCXUzMiBwYXJtMzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBUaGUgVHlwaG9vbiByZXNwb25zZSBkZXNjcmlwdG9yLCBzZWUgY29tbWFuZCBkZXNjcmlwdG9yIGZvciBkZXRhaWxzCisgKi8KK3N0cnVjdCByZXNwX2Rlc2MgeworCXU4ICBmbGFnczsKKwl1OCAgbnVtRGVzYzsKKwl1MTYgY21kOworCXUxNiBzZXFObzsKKwl1MTYgcGFybTE7CisJdTMyIHBhcm0yOworCXUzMiBwYXJtMzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIElOSVRfQ09NTUFORF9OT19SRVNQT05TRSh4LCBjb21tYW5kKQkJCQlcCisJZG8geyBzdHJ1Y3QgY21kX2Rlc2MgKl9wdHIgPSAoeCk7CQkJCVwKKwkJbWVtc2V0KF9wdHIsIDAsIHNpemVvZihzdHJ1Y3QgY21kX2Rlc2MpKTsJCVwKKwkJX3B0ci0+ZmxhZ3MgPSBUWVBIT09OX0NNRF9ERVNDIHwgVFlQSE9PTl9ERVNDX1ZBTElEOwlcCisJCV9wdHItPmNtZCA9IGNvbW1hbmQ7CQkJCQlcCisJfSB3aGlsZSgwKQorCisvKiBXZSBzZXQgc2VxTm8gdG8gMSBpZiB3ZSdyZSBleHBlY3RpbmcgYSByZXNwb25zZSBmcm9tIHRoaXMgY29tbWFuZCAqLworI2RlZmluZSBJTklUX0NPTU1BTkRfV0lUSF9SRVNQT05TRSh4LCBjb21tYW5kKQkJCQlcCisJZG8geyBzdHJ1Y3QgY21kX2Rlc2MgKl9wdHIgPSAoeCk7CQkJCVwKKwkJbWVtc2V0KF9wdHIsIDAsIHNpemVvZihzdHJ1Y3QgY21kX2Rlc2MpKTsJCVwKKwkJX3B0ci0+ZmxhZ3MgPSBUWVBIT09OX0NNRF9SRVNQT05EIHwgVFlQSE9PTl9DTURfREVTQzsJXAorCQlfcHRyLT5mbGFncyB8PSBUWVBIT09OX0RFU0NfVkFMSUQ7IAkJCVwKKwkJX3B0ci0+Y21kID0gY29tbWFuZDsJCQkJCVwKKwkJX3B0ci0+c2VxTm8gPSAxOwkJCQkJXAorCX0gd2hpbGUoMCkKKworLyogVFlQSE9PTl9DTURfU0VUX1JYX0ZJTFRFUiBmaWx0ZXIgYml0cyAoY21kLnBhcm0xKQorICovCisjZGVmaW5lIFRZUEhPT05fUlhfRklMVEVSX0RJUkVDVEVECV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDAxKQorI2RlZmluZSBUWVBIT09OX1JYX0ZJTFRFUl9BTExfTUNBU1QJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDIpCisjZGVmaW5lIFRZUEhPT05fUlhfRklMVEVSX0JST0FEQ0FTVAlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwNCkKKyNkZWZpbmUgVFlQSE9PTl9SWF9GSUxURVJfUFJPTUlTQ09VUwlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwOCkKKyNkZWZpbmUgVFlQSE9PTl9SWF9GSUxURVJfTUNBU1RfSEFTSAlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAxMCkKKworLyogVFlQSE9PTl9DTURfUkVBRF9TVEFUUyByZXNwb25zZSBmb3JtYXQKKyAqLworc3RydWN0IHN0YXRzX3Jlc3AgeworCXU4ICBmbGFnczsKKwl1OCAgbnVtRGVzYzsKKwl1MTYgY21kOworCXUxNiBzZXFObzsKKwl1MTYgdW51c2VkOworCXUzMiB0eFBhY2tldHM7CisJdTY0IHR4Qnl0ZXM7CisJdTMyIHR4RGVmZXJyZWQ7CisJdTMyIHR4TGF0ZUNvbGxpc2lvbnM7CisJdTMyIHR4Q29sbGlzaW9uczsKKwl1MzIgdHhDYXJyaWVyTG9zdDsKKwl1MzIgdHhNdWx0aXBsZUNvbGxpc2lvbnM7CisJdTMyIHR4RXhjZXNzaXZlQ29sbGlzaW9uczsKKwl1MzIgdHhGaWZvVW5kZXJydW5zOworCXUzMiB0eE11bHRpY2FzdFR4T3ZlcmZsb3dzOworCXUzMiB0eEZpbHRlcmVkOworCXUzMiByeFBhY2tldHNHb29kOworCXU2NCByeEJ5dGVzR29vZDsKKwl1MzIgcnhGaWZvT3ZlcnJ1bnM7CisJdTMyIEJhZFNTRDsKKwl1MzIgcnhDcmNFcnJvcnM7CisJdTMyIHJ4T3ZlcnNpemVkOworCXUzMiByeEJyb2FkY2FzdDsKKwl1MzIgcnhNdWx0aWNhc3Q7CisJdTMyIHJ4T3ZlcmZsb3c7CisJdTMyIHJ4RmlsdGVyZWQ7CisJdTMyIGxpbmtTdGF0dXM7CisjZGVmaW5lIFRZUEhPT05fTElOS19TVEFUX01BU0sJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwMSkKKyNkZWZpbmUgVFlQSE9PTl9MSU5LX0dPT0QJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwMSkKKyNkZWZpbmUgVFlQSE9PTl9MSU5LX0JBRAkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDAwKQorI2RlZmluZSBUWVBIT09OX0xJTktfU1BFRURfTUFTSwkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDAyKQorI2RlZmluZSBUWVBIT09OX0xJTktfMTAwTUJQUwkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDAyKQorI2RlZmluZSBUWVBIT09OX0xJTktfMTBNQlBTCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDApCisjZGVmaW5lIFRZUEhPT05fTElOS19EVVBMRVhfTUFTSwlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDQpCisjZGVmaW5lIFRZUEhPT05fTElOS19GVUxMX0RVUExFWAlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDQpCisjZGVmaW5lIFRZUEhPT05fTElOS19IQUxGX0RVUExFWAlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDApCisJdTMyIHVudXNlZDI7CisJdTMyIHVudXNlZDM7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVFlQSE9PTl9DTURfWENWUl9TRUxFQ1QgeGN2ciB2YWx1ZXMgKHJlc3AucGFybTEpCisgKi8KKyNkZWZpbmUgVFlQSE9PTl9YQ1ZSXzEwSEFMRglfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwMCkKKyNkZWZpbmUgVFlQSE9PTl9YQ1ZSXzEwRlVMTAlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwMSkKKyNkZWZpbmUgVFlQSE9PTl9YQ1ZSXzEwMEhBTEYJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDIpCisjZGVmaW5lIFRZUEhPT05fWENWUl8xMDBGVUxMCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDAzKQorI2RlZmluZSBUWVBIT09OX1hDVlJfQVVUT05FRwlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwNCkKKworLyogVFlQSE9PTl9DTURfUkVBRF9NRURJQV9TVEFUVVMgKHJlc3AucGFybTEpCisgKi8KKyNkZWZpbmUgVFlQSE9PTl9NRURJQV9TVEFUX0NSQ19TVFJJUF9ESVNBQkxFCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDA0KQorI2RlZmluZSBUWVBIT09OX01FRElBX1NUQVRfQ09MTElTSU9OX0RFVEVDVAlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAxMCkKKyNkZWZpbmUgVFlQSE9PTl9NRURJQV9TVEFUX0NBUlJJRVJfU0VOU0UJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMjApCisjZGVmaW5lIFRZUEhPT05fTUVESUFfU1RBVF9QT0xBUklUWV9SRVYJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwNDAwKQorI2RlZmluZSBUWVBIT09OX01FRElBX1NUQVRfTk9fTElOSwkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDA4MDApCisKKy8qIFRZUEhPT05fQ01EX1NFVF9NVUxUSUNBU1RfSEFTSCBlbmFibGUgdmFsdWVzIChjbWQucGFybTEpCisgKi8KKyNkZWZpbmUgVFlQSE9PTl9NQ0FTVF9IQVNIX0RJU0FCTEUJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDApCisjZGVmaW5lIFRZUEhPT05fTUNBU1RfSEFTSF9FTkFCTEUJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAwMDEpCisjZGVmaW5lIFRZUEhPT05fTUNBU1RfSEFTSF9TRVQJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDAyKQorCisvKiBUWVBIT09OX0NNRF9DUkVBVEVfU0EgZGVzY3JpcHRvciBhbmQgc2V0dGluZ3MKKyAqLworc3RydWN0IHNhX2Rlc2NyaXB0b3IgeworCXU4ICBmbGFnczsKKwl1OCAgbnVtRGVzYzsKKwl1MTYgY21kOworCXUxNiBzZXFObzsKKwl1MTYgbW9kZTsKKyNkZWZpbmUgVFlQSE9PTl9TQV9NT0RFX05VTEwJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDAwKQorI2RlZmluZSBUWVBIT09OX1NBX01PREVfQUgJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwMDAxKQorI2RlZmluZSBUWVBIT09OX1NBX01PREVfRVNQCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDAwMikKKwl1OCAgaGFzaEZsYWdzOworI2RlZmluZSBUWVBIT09OX1NBX0hBU0hfRU5BQkxFCQkweDAxCisjZGVmaW5lIFRZUEhPT05fU0FfSEFTSF9TSEExCQkweDAyCisjZGVmaW5lIFRZUEhPT05fU0FfSEFTSF9NRDUJCTB4MDQKKwl1OCAgZGlyZWN0aW9uOworI2RlZmluZSBUWVBIT09OX1NBX0RJUl9SWAkJMHgwMAorI2RlZmluZSBUWVBIT09OX1NBX0RJUl9UWAkJMHgwMQorCXU4ICBlbmNyeXB0aW9uRmxhZ3M7CisjZGVmaW5lIFRZUEhPT05fU0FfRU5DUllQVF9FTkFCTEUJMHgwMQorI2RlZmluZSBUWVBIT09OX1NBX0VOQ1JZUFRfREVTCQkweDAyCisjZGVmaW5lIFRZUEhPT05fU0FfRU5DUllQVF8zREVTCQkweDAwCisjZGVmaW5lIFRZUEhPT05fU0FfRU5DUllQVF8zREVTXzJLRVkJMHgwMAorI2RlZmluZSBUWVBIT09OX1NBX0VOQ1JZUFRfM0RFU18zS0VZCTB4MDQKKyNkZWZpbmUgVFlQSE9PTl9TQV9FTkNSWVBUX0NCQwkJMHgwOAorI2RlZmluZSBUWVBIT09OX1NBX0VOQ1JZUFRfRUNCCQkweDAwCisJdTggIHNwZWNpZnlJbmRleDsKKyNkZWZpbmUgVFlQSE9PTl9TQV9TUEVDSUZZX0lOREVYCTB4MDEKKyNkZWZpbmUgVFlQSE9PTl9TQV9HRU5FUkFURV9JTkRFWAkweDAwCisJdTMyIFNQSTsKKwl1MzIgZGVzdEFkZHI7CisJdTMyIGRlc3RNYXNrOworCXU4ICBpbnRlZ0tleVsyMF07CisJdTggIGNvbmZLZXlbMjRdOworCXUzMiBpbmRleDsKKwl1MzIgdW51c2VkOworCXUzMiB1bnVzZWQyOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFRZUEhPT05fQ01EX1NFVF9PRkZMT0FEX1RBU0tTIGJpdHMgKGNtZC5wYXJtMiAoVHgpICYgY21kLnBhcm0zIChSeCkpCisgKiBUaGlzIGlzIGFsbCBmb3IgSVB2NC4KKyAqLworI2RlZmluZSBUWVBIT09OX09GRkxPQURfVENQX0NIS1NVTQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDIpCisjZGVmaW5lIFRZUEhPT05fT0ZGTE9BRF9VRFBfQ0hLU1VNCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDAwNCkKKyNkZWZpbmUgVFlQSE9PTl9PRkZMT0FEX0lQX0NIS1NVTQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAwMDgpCisjZGVmaW5lIFRZUEhPT05fT0ZGTE9BRF9JUFNFQwkJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDEwKQorI2RlZmluZSBUWVBIT09OX09GRkxPQURfQkNBU1RfVEhST1RUTEUJX19jb25zdGFudF9jcHVfdG9fbGUzMigweDAwMDAwMDIwKQorI2RlZmluZSBUWVBIT09OX09GRkxPQURfREhDUF9QUkVWRU5UCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDA0MCkKKyNkZWZpbmUgVFlQSE9PTl9PRkZMT0FEX1ZMQU4JCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMHgwMDAwMDA4MCkKKyNkZWZpbmUgVFlQSE9PTl9PRkZMT0FEX0ZJTFRFUklORwlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAxMDApCisjZGVmaW5lIFRZUEhPT05fT0ZGTE9BRF9UQ1BfU0VHTUVOVAlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4MDAwMDAyMDApCisKKy8qIFRZUEhPT05fQ01EX0VOQUJMRV9XQUtFX0VWRU5UUyBiaXRzIChjbWQucGFybTEpCisgKi8KKyNkZWZpbmUgVFlQSE9PTl9XQUtFX01BR0lDX1BLVAkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAxKQorI2RlZmluZSBUWVBIT09OX1dBS0VfTElOS19FVkVOVAkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAyKQorI2RlZmluZSBUWVBIT09OX1dBS0VfSUNNUF9FQ0hPCQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDQpCisjZGVmaW5lIFRZUEhPT05fV0FLRV9BUlAJCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHgwOCkKKworLyogVGhlc2UgYXJlIHVzZWQgdG8gbG9hZCB0aGUgZmlybXdhcmUgaW1hZ2Ugb24gdGhlIE5JQworICovCitzdHJ1Y3QgdHlwaG9vbl9maWxlX2hlYWRlciB7CisJdTggIHRhZ1s4XTsKKwl1MzIgdmVyc2lvbjsKKwl1MzIgbnVtU2VjdGlvbnM7CisJdTMyIHN0YXJ0QWRkcjsKKwl1MzIgaG1hY0RpZ2VzdFs1XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgdHlwaG9vbl9zZWN0aW9uX2hlYWRlciB7CisJdTMyIGxlbjsKKwl1MTYgY2hlY2tzdW07CisJdTE2IHJlc2VydmVkOworCXUzMiBzdGFydEFkZHI7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVGhlIFR5cGhvb24gUmVnaXN0ZXIgb2Zmc2V0cworICovCisjZGVmaW5lIFRZUEhPT05fUkVHX1NPRlRfUkVTRVQJCQkweDAwCisjZGVmaW5lIFRZUEhPT05fUkVHX0lOVFJfU1RBVFVTCQkJMHgwNAorI2RlZmluZSBUWVBIT09OX1JFR19JTlRSX0VOQUJMRQkJCTB4MDgKKyNkZWZpbmUgVFlQSE9PTl9SRUdfSU5UUl9NQVNLCQkJMHgwYworI2RlZmluZSBUWVBIT09OX1JFR19TRUxGX0lOVEVSUlVQVAkJMHgxMAorI2RlZmluZSBUWVBIT09OX1JFR19IT1NUMkFSTTcJCQkweDE0CisjZGVmaW5lIFRZUEhPT05fUkVHX0hPU1QyQVJNNgkJCTB4MTgKKyNkZWZpbmUgVFlQSE9PTl9SRUdfSE9TVDJBUk01CQkJMHgxYworI2RlZmluZSBUWVBIT09OX1JFR19IT1NUMkFSTTQJCQkweDIwCisjZGVmaW5lIFRZUEhPT05fUkVHX0hPU1QyQVJNMwkJCTB4MjQKKyNkZWZpbmUgVFlQSE9PTl9SRUdfSE9TVDJBUk0yCQkJMHgyOAorI2RlZmluZSBUWVBIT09OX1JFR19IT1NUMkFSTTEJCQkweDJjCisjZGVmaW5lIFRZUEhPT05fUkVHX0hPU1QyQVJNMAkJCTB4MzAKKyNkZWZpbmUgVFlQSE9PTl9SRUdfQVJNMkhPU1QzCQkJMHgzNAorI2RlZmluZSBUWVBIT09OX1JFR19BUk0ySE9TVDIJCQkweDM4CisjZGVmaW5lIFRZUEhPT05fUkVHX0FSTTJIT1NUMQkJCTB4M2MKKyNkZWZpbmUgVFlQSE9PTl9SRUdfQVJNMkhPU1QwCQkJMHg0MAorCisjZGVmaW5lIFRZUEhPT05fUkVHX0JPT1RfREFUQV9MTwkJVFlQSE9PTl9SRUdfSE9TVDJBUk01CisjZGVmaW5lIFRZUEhPT05fUkVHX0JPT1RfREFUQV9ISQkJVFlQSE9PTl9SRUdfSE9TVDJBUk00CisjZGVmaW5lIFRZUEhPT05fUkVHX0JPT1RfREVTVF9BRERSCQlUWVBIT09OX1JFR19IT1NUMkFSTTMKKyNkZWZpbmUgVFlQSE9PTl9SRUdfQk9PVF9DSEVDS1NVTQkJVFlQSE9PTl9SRUdfSE9TVDJBUk0yCisjZGVmaW5lIFRZUEhPT05fUkVHX0JPT1RfTEVOR1RICQkJVFlQSE9PTl9SRUdfSE9TVDJBUk0xCisKKyNkZWZpbmUgVFlQSE9PTl9SRUdfRE9XTkxPQURfQk9PVF9BRERSCQlUWVBIT09OX1JFR19IT1NUMkFSTTEKKyNkZWZpbmUgVFlQSE9PTl9SRUdfRE9XTkxPQURfSE1BQ18wCQlUWVBIT09OX1JFR19IT1NUMkFSTTIKKyNkZWZpbmUgVFlQSE9PTl9SRUdfRE9XTkxPQURfSE1BQ18xCQlUWVBIT09OX1JFR19IT1NUMkFSTTMKKyNkZWZpbmUgVFlQSE9PTl9SRUdfRE9XTkxPQURfSE1BQ18yCQlUWVBIT09OX1JFR19IT1NUMkFSTTQKKyNkZWZpbmUgVFlQSE9PTl9SRUdfRE9XTkxPQURfSE1BQ18zCQlUWVBIT09OX1JFR19IT1NUMkFSTTUKKyNkZWZpbmUgVFlQSE9PTl9SRUdfRE9XTkxPQURfSE1BQ180CQlUWVBIT09OX1JFR19IT1NUMkFSTTYKKworI2RlZmluZSBUWVBIT09OX1JFR19CT09UX1JFQ09SRF9BRERSX0hJCQlUWVBIT09OX1JFR19IT1NUMkFSTTIKKyNkZWZpbmUgVFlQSE9PTl9SRUdfQk9PVF9SRUNPUkRfQUREUl9MTwkJVFlQSE9PTl9SRUdfSE9TVDJBUk0xCisKKyNkZWZpbmUgVFlQSE9PTl9SRUdfVFhfTE9fUkVBRFkJCQlUWVBIT09OX1JFR19IT1NUMkFSTTMKKyNkZWZpbmUgVFlQSE9PTl9SRUdfQ01EX1JFQURZCQkJVFlQSE9PTl9SRUdfSE9TVDJBUk0yCisjZGVmaW5lIFRZUEhPT05fUkVHX1RYX0hJX1JFQURZCQkJVFlQSE9PTl9SRUdfSE9TVDJBUk0xCisKKyNkZWZpbmUgVFlQSE9PTl9SRUdfQ09NTUFORAkJCVRZUEhPT05fUkVHX0hPU1QyQVJNMAorI2RlZmluZSBUWVBIT09OX1JFR19IRUFSVEJFQVQJCQlUWVBIT09OX1JFR19BUk0ySE9TVDMKKyNkZWZpbmUgVFlQSE9PTl9SRUdfU1RBVFVTCQkJVFlQSE9PTl9SRUdfQVJNMkhPU1QwCisKKy8qIDNYUCBSZXNldCB2YWx1ZXMgKFRZUEhPT05fUkVHX1NPRlRfUkVTRVQpCisgKi8KKyNkZWZpbmUgVFlQSE9PTl9SRVNFVF9BTEwJMHg3ZgorI2RlZmluZSBUWVBIT09OX1JFU0VUX05PTkUJMHgwMAorCisvKiAzWFAgaXJxIGJpdHMgKFRZUEhPT05fUkVHX0lOVFJ7U1RBVFVTLEVOQUJMRSxNQVNLfSkKKyAqCisgKiBTb21lIG9mIHRoZXNlIGNhbWUgZnJvbSBPcGVuQlNELCBhcyB0aGUgM0NvbSBkb2NzIGhhdmUgaXQgd3JvbmcKKyAqIChJTlRSX1NFTEYpIG9yIGRvbid0IGxpc3QgaXQgYXQgYWxsIChJTlRSXypfQUJPUlQpCisgKgorICogRW5hYmxpbmcgaXJxcyBvbiB0aGUgSGVhcnRiZWF0IHJlZyAoQXJtVG9Ib3N0MykgZ2V0cyB5b3UgYW4gaXJxCisgKiBhYm91dCBldmVyeSA4bXMsIHNvIGRvbid0IGRvIGl0LgorICovCisjZGVmaW5lIFRZUEhPT05fSU5UUl9IT1NUX0lOVAkJMHgwMDAwMDAwMQorI2RlZmluZSBUWVBIT09OX0lOVFJfQVJNMkhPU1QwCQkweDAwMDAwMDAyCisjZGVmaW5lIFRZUEhPT05fSU5UUl9BUk0ySE9TVDEJCTB4MDAwMDAwMDQKKyNkZWZpbmUgVFlQSE9PTl9JTlRSX0FSTTJIT1NUMgkJMHgwMDAwMDAwOAorI2RlZmluZSBUWVBIT09OX0lOVFJfQVJNMkhPU1QzCQkweDAwMDAwMDEwCisjZGVmaW5lIFRZUEhPT05fSU5UUl9ETUEwCQkweDAwMDAwMDIwCisjZGVmaW5lIFRZUEhPT05fSU5UUl9ETUExCQkweDAwMDAwMDQwCisjZGVmaW5lIFRZUEhPT05fSU5UUl9ETUEyCQkweDAwMDAwMDgwCisjZGVmaW5lIFRZUEhPT05fSU5UUl9ETUEzCQkweDAwMDAwMTAwCisjZGVmaW5lIFRZUEhPT05fSU5UUl9NQVNURVJfQUJPUlQJMHgwMDAwMDIwMAorI2RlZmluZSBUWVBIT09OX0lOVFJfVEFSR0VUX0FCT1JUCTB4MDAwMDA0MDAKKyNkZWZpbmUgVFlQSE9PTl9JTlRSX1NFTEYJCTB4MDAwMDA4MDAKKyNkZWZpbmUgVFlQSE9PTl9JTlRSX1JFU0VSVkVECQkweGZmZmZmMDAwCisKKyNkZWZpbmUgVFlQSE9PTl9JTlRSX0JPT1RDTUQJCVRZUEhPT05fSU5UUl9BUk0ySE9TVDAKKworI2RlZmluZSBUWVBIT09OX0lOVFJfRU5BQkxFX0FMTAkJMHhmZmZmZmZlZgorI2RlZmluZSBUWVBIT09OX0lOVFJfQUxMCQkweGZmZmZmZmZmCisjZGVmaW5lIFRZUEhPT05fSU5UUl9OT05FCQkweDAwMDAwMDAwCisKKy8qIFRoZSBjb21tYW5kcyBmb3IgdGhlIDNYUCBjaGlwIChUWVBIT09OX1JFR19DT01NQU5EKQorICovCisjZGVmaW5lIFRZUEhPT05fQk9PVENNRF9CT09UCQkJMHgwMAorI2RlZmluZSBUWVBIT09OX0JPT1RDTURfV0FLRVVQCQkJMHhmYQorI2RlZmluZSBUWVBIT09OX0JPT1RDTURfRE5MRF9DT01QTEVURQkJMHhmYgorI2RlZmluZSBUWVBIT09OX0JPT1RDTURfU0VHX0FWQUlMQUJMRQkJMHhmYworI2RlZmluZSBUWVBIT09OX0JPT1RDTURfUlVOVElNRV9JTUFHRQkJMHhmZAorI2RlZmluZSBUWVBIT09OX0JPT1RDTURfUkVHX0JPT1RfUkVDT1JECQkweGZmCisKKy8qIDNYUCBTdGF0dXMgdmFsdWVzIChUWVBIT09OX1JFR19TVEFUVVMpCisgKi8KKyNkZWZpbmUgVFlQSE9PTl9TVEFUVVNfV0FJVElOR19GT1JfQk9PVAkJMHgwNworI2RlZmluZSBUWVBIT09OX1NUQVRVU19TRUNPTkRfSU5JVAkJMHgwOAorI2RlZmluZSBUWVBIT09OX1NUQVRVU19SVU5OSU5HCQkJMHgwOQorI2RlZmluZSBUWVBIT09OX1NUQVRVU19XQUlUSU5HX0ZPUl9IT1NUCQkweDBkCisjZGVmaW5lIFRZUEhPT05fU1RBVFVTX1dBSVRJTkdfRk9SX1NFR01FTlQJMHgxMAorI2RlZmluZSBUWVBIT09OX1NUQVRVU19TTEVFUElORwkJCTB4MTEKKyNkZWZpbmUgVFlQSE9PTl9TVEFUVVNfSEFMVEVECQkJMHgxNApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmlhLXJoaW5lLmMgYi9kcml2ZXJzL25ldC92aWEtcmhpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjU3ZDU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdmlhLXJoaW5lLmMKQEAgLTAsMCArMSwyMDM1IEBACisvKiB2aWEtcmhpbmUuYzogQSBMaW51eCBFdGhlcm5ldCBkZXZpY2UgZHJpdmVyIGZvciBWSUEgUmhpbmUgZmFtaWx5IGNoaXBzLiAqLworLyoKKwlXcml0dGVuIDE5OTgtMjAwMSBieSBEb25hbGQgQmVja2VyLgorCisJQ3VycmVudCBNYWludGFpbmVyOiBSb2dlciBMdWV0aGkgPHJsQGhlbGxnYXRlLmNoPgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorCXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisJRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdAorCXJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZS4gIFRoaXMgZmlsZSBpcyBub3QKKwlhIGNvbXBsZXRlIHByb2dyYW0gYW5kIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgZW50aXJlIG9wZXJhdGluZworCXN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorCisJVGhpcyBkcml2ZXIgaXMgZGVzaWduZWQgZm9yIHRoZSBWSUEgVlQ4NkMxMDBBIFJoaW5lLUkuCisJSXQgYWxzbyB3b3JrcyB3aXRoIHRoZSBSaGluZS1JSSAoNjEwMikgYW5kIFJoaW5lLUlJSSAoNjEwNS82MTA1TC82MTA1TE9NCisJYW5kIG1hbmFnZW1lbnQgTklDIDYxMDVNKS4KKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbSwgb3IgQy9PCisJU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uCisJNDEwIFNldmVybiBBdmUuLCBTdWl0ZSAyMTAKKwlBbm5hcG9saXMgTUQgMjE0MDMKKworCisJVGhpcyBkcml2ZXIgY29udGFpbnMgc29tZSBjaGFuZ2VzIGZyb20gdGhlIG9yaWdpbmFsIERvbmFsZCBCZWNrZXIKKwl2ZXJzaW9uLiBIZSBtYXkgb3IgbWF5IG5vdCBiZSBpbnRlcmVzdGVkIGluIGJ1ZyByZXBvcnRzIG9uIHRoaXMKKwljb2RlLiBZb3UgY2FuIGZpbmQgaGlzIHZlcnNpb25zIGF0OgorCWh0dHA6Ly93d3cuc2N5bGQuY29tL25ldHdvcmsvdmlhLXJoaW5lLmh0bWwKKworCisJTGludXgga2VybmVsIHZlcnNpb24gaGlzdG9yeToKKworCUxLMS4xLjA6CisJLSBKZWZmIEdhcnppazogc29mdG5ldCAnbiBzdHVmZgorCisJTEsxLjEuMToKKwktIEp1c3RpbiBHdXlldHQ6IHNvZnRuZXQgYW5kIGxvY2tpbmcgZml4ZXMKKwktIEplZmYgR2FyemlrOiB1c2UgUENJIGludGVyZmFjZQorCisJTEsxLjEuMjoKKwktIFVyYmFuIFdpZG1hcms6IG1pbm9yIGNsZWFudXBzLCBtZXJnZXMgZnJvbSBCZWNrZXIgMS4wM2EvMS4wNCB2ZXJzaW9ucworCisJTEsxLjEuMzoKKwktIFVyYmFuIFdpZG1hcms6IHVzZSBQQ0kgRE1BIGludGVyZmFjZSAod2l0aCB0aGFua3MgdG8gdGhlIGVlcHJvMTAwLmMKKwkJCSBjb2RlKSB1cGRhdGUgIlRoZW9yeSBvZiBPcGVyYXRpb24iIHdpdGgKKwkJCSBzb2Z0bmV0L2xvY2tpbmcgY2hhbmdlcworCS0gRGF2ZSBNaWxsZXI6IFBDSSBETUEgYW5kIGVuZGlhbiBmaXh1cHMKKwktIEplZmYgR2FyemlrOiBNT0RfeHh4IHJhY2UgZml4ZXMsIHVwZGF0ZWQgUENJIHJlc291cmNlIGFsbG9jYXRpb24KKworCUxLMS4xLjQ6CisJLSBVcmJhbiBXaWRtYXJrOiBmaXggZ2NjIDIuOTUuMiBwcm9ibGVtIGFuZAorCSAgICAgICAgICAgICAgICAgcmVtb3ZlIHdyaXRlbCdzIHRvIGZpeGVkIGFkZHJlc3MgMHg3YworCisJTEsxLjEuNToKKwktIFVyYmFuIFdpZG1hcms6IG1kaW8gbG9ja2luZywgYm91bmNlIGJ1ZmZlciBjaGFuZ2VzCisJICAgICAgICAgICAgICAgICBtZXJnZXMgZnJvbSBCZWNrZXJzIDEuMDUgdmVyc2lvbgorCSAgICAgICAgICAgICAgICAgYWRkZWQgbmV0aWZfcnVubmluZ19vbi9vZmYgc3VwcG9ydAorCisJTEsxLjEuNjoKKwktIFVyYmFuIFdpZG1hcms6IG1lcmdlcyBmcm9tIEJlY2tlcnMgMS4wOGIgdmVyc2lvbiAoVlQ2MTAyICsgbWRpbykKKwkgICAgICAgICAgICAgICAgIHNldCBuZXRpZl9ydW5uaW5nX29uL29mZiBvbiBzdGFydHVwLCBkZWxfdGltZXJfc3luYworCisJTEsxLjEuNzoKKwktIE1hbmZyZWQgU3ByYXVsOiBhZGRlZCByZXNldCBpbnRvIHR4X3RpbWVvdXQKKworCUxLMS4xLjk6CisJLSBVcmJhbiBXaWRtYXJrOiBtZXJnZXMgZnJvbSBCZWNrZXJzIDEuMTAgdmVyc2lvbgorCSAgICAgICAgICAgICAgICAgKG1lZGlhIHNlbGVjdGlvbiArIGVlcHJvbSByZWxvYWQpCisJLSBEYXZpZCBWcmFiZWw6ICBtZXJnZXMgZnJvbSBELUxpbmsgIjEuMTEiIHZlcnNpb24KKwkgICAgICAgICAgICAgICAgIChkaXNhYmxlIFdPTCBhbmQgUE1FIG9uIHN0YXJ0dXApCisKKwlMSzEuMS4xMDoKKwktIE1hbmZyZWQgU3ByYXVsOiB1c2UgInNpbmdsZWNvcHkiIGZvciB1bmFsaWduZWQgYnVmZmVycworCSAgICAgICAgICAgICAgICAgIGRvbid0IGFsbG9jYXRlIGJvdW5jZSBidWZmZXJzIGZvciAhUmVxVHhBbGlnbiBjYXJkcworCisJTEsxLjEuMTE6CisJLSBEYXZpZCBXb29kaG91c2U6IFNldCBkZXYtPmJhc2VfYWRkciBiZWZvcmUgdGhlIGZpcnN0IHRpbWUgd2UgY2FsbAorCQkJICAgd2FpdF9mb3JfcmVzZXQoKS4gSXQncyBhIGxvdCBoYXBwaWVyIHRoYXQgd2F5LgorCQkJICAgRnJlZSBucC0+dHhfYnVmcyBvbmx5IGlmIHdlIGFjdHVhbGx5IGFsbG9jYXRlZCBpdC4KKworCUxLMS4xLjEyOgorCS0gTWFydGluIEVyaWtzc29uOiBBbGxvdyBNZW1vcnktTWFwcGVkIElPIHRvIGJlIGVuYWJsZWQuCisKKwlMSzEuMS4xMyAoamdhcnppayk6CisJLSBBZGQgZXRodG9vbCBzdXBwb3J0CisJLSBSZXBsYWNlIHNvbWUgTUlJLXJlbGF0ZWQgbWFnaWMgbnVtYmVycyB3aXRoIGNvbnN0YW50cworCisJTEsxLjEuMTQgKEl2YW4gRy4pOgorCS0gZml4ZXMgY29tbWVudHMgZm9yIFJoaW5lLUlJSQorCS0gcmVtb3ZlcyBXX01BWF9USU1FT1VUICh1bnVzZWQpCisJLSBhZGRzIEhhc0Rhdmljb21QaHkgZm9yIFJoaW5lLUkgKGJhc2lzOiBsaW51eGZldCBkcml2ZXI7IG15IGNhcmQKKwkgIGlzIFItSSBhbmQgaGFzIERhdmljb20gY2hpcCwgZmxhZyBpcyByZWZlcmVuY2VkIGluIGtlcm5lbCBkcml2ZXIpCisJLSBzZW5kcyBjaGlwX2lkIGFzIGEgcGFyYW1ldGVyIHRvIHdhaXRfZm9yX3Jlc2V0IHNpbmNlIG5wIGlzIG5vdAorCSAgaW5pdGlhbGl6ZWQgb24gZmlyc3QgY2FsbAorCS0gY2hhbmdlcyBtbWlvICJlbHNlIGlmIChjaGlwX2lkPT1WVDYxMDIpIiB0byAiZWxzZSIgc28gaXQgd2lsbCB3b3JrCisJICBmb3IgUmhpbmUtSUlJJ3MgKGRvY3VtZW50YXRpb24gc2F5cyBzYW1lIGJpdCBpcyBjb3JyZWN0KQorCS0gdHJhbnNtaXQgZnJhbWUgcXVldWUgbWVzc2FnZSBpcyBvZmYgYnkgb25lIC0gZml4ZWQKKwktIGFkZHMgSW50ck5vcm1hbFN1bW1hcnkgdG8gIlNvbWV0aGluZyBXaWNrZWQiIGV4Y2x1c2lvbiBsaXN0CisJICBzbyBub3JtYWwgaW50ZXJydXB0cyB3aWxsIG5vdCB0cmlnZ2VyIHRoZSBtZXNzYWdlIChzcmM6IERvbmFsZCBCZWNrZXIpCisJKFJvZ2VyIEx1ZXRoaSkKKwktIHNob3cgY29uZnVzZWQgY2hpcCB3aGVyZSB0byBjb250aW51ZSBhZnRlciBUeCBlcnJvcgorCS0gbG9jYXRpb24gb2YgY29sbGlzaW9uIGNvdW50ZXIgaXMgY2hpcCBzcGVjaWZpYworCS0gYWxsb3cgc2VsZWN0aW5nIGJhY2tvZmYgYWxnb3JpdGhtIChtb2R1bGUgcGFyYW1ldGVyKQorCisJTEsxLjEuMTUgKGpnYXJ6aWspOgorCS0gVXNlIG5ldyBNSUkgbGliIGhlbHBlciBnZW5lcmljX21paV9pb2N0bAorCisJTEsxLjEuMTYgKFJvZ2VyIEx1ZXRoaSkKKwktIEV0aGVybGVhayBmaXgKKwktIEhhbmRsZSBUeCBidWZmZXIgdW5kZXJydW4KKwktIEZpeCBidWdzIGluIGZ1bGwgZHVwbGV4IGhhbmRsaW5nCisJLSBOZXcgcmVzZXQgY29kZSB1c2VzICJmb3JjZSByZXNldCIgY21kIG9uIFJoaW5lLUlJCisJLSBWYXJpb3VzIGNsZWFuIHVwcworCisJTEsxLjEuMTcgKFJvZ2VyIEx1ZXRoaSkKKwktIEZpeCByYWNlIGluIHZpYV9yaGluZV9zdGFydF90eCgpCisJLSBPbiBlcnJvcnMsIHdhaXQgZm9yIFR4IGVuZ2luZSB0byB0dXJuIG9mZiBiZWZvcmUgc2NhdmVuZ2luZworCS0gSGFuZGxlIFR4IGRlc2NyaXB0b3Igd3JpdGUtYmFjayByYWNlIG9uIFJoaW5lLUlJCisJLSBGb3JjZSBmbHVzaGluZyBmb3IgUENJIHBvc3RlZCB3cml0ZXMKKwktIE1vcmUgcmVzZXQgY29kZSBjaGFuZ2VzCisKKwlMSzEuMS4xOCAoUm9nZXIgTHVldGhpKQorCS0gTm8gZmlsdGVyaW5nIG11bHRpY2FzdCBpbiBwcm9taXNjIG1vZGUgKEVkd2FyZCBQZW5nKQorCS0gRml4IGZvciBSaGluZS1JIFR4IHRpbWVvdXRzCisKKwlMSzEuMS4xOSAoUm9nZXIgTHVldGhpKQorCS0gSW5jcmVhc2UgVHggdGhyZXNob2xkIGZvciB1bnNwZWNpZmllZCBlcnJvcnMKKworCUxLMS4yLjAtMi42IChSb2dlciBMdWV0aGkpCisJLSBNYXNzaXZlIGNsZWFuLXVwCisJLSBSZXdyaXRlIFBIWSwgbWVkaWEgaGFuZGxpbmcgKHJlbW92ZSBvcHRpb25zLCBmdWxsX2R1cGxleCwgYmFja29mZikKKwktIEZpeCBUeCBlbmdpbmUgcmFjZSBmb3IgZ29vZAorCisqLworCisjZGVmaW5lIERSVl9OQU1FCSJ2aWEtcmhpbmUiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjIuMC0yLjYiCisjZGVmaW5lIERSVl9SRUxEQVRFCSJKdW5lLTEwLTIwMDQiCisKKworLyogQSBmZXcgdXNlci1jb25maWd1cmFibGUgdmFsdWVzLgorICAgVGhlc2UgbWF5IGJlIG1vZGlmaWVkIHdoZW4gYSBkcml2ZXIgbW9kdWxlIGlzIGxvYWRlZC4gKi8KKworc3RhdGljIGludCBkZWJ1ZyA9IDE7CS8qIDEgbm9ybWFsIG1lc3NhZ2VzLCAwIHF1aWV0IC4uIDcgdmVyYm9zZS4gKi8KK3N0YXRpYyBpbnQgbWF4X2ludGVycnVwdF93b3JrID0gMjA7CisKKy8qIFNldCB0aGUgY29weSBicmVha3BvaW50IGZvciB0aGUgY29weS1vbmx5LXRpbnktZnJhbWVzIHNjaGVtZS4KKyAgIFNldHRpbmcgdG8gPiAxNTE4IGVmZmVjdGl2ZWx5IGRpc2FibGVzIHRoaXMgZmVhdHVyZS4gKi8KK3N0YXRpYyBpbnQgcnhfY29weWJyZWFrOworCisvKgorICogSW4gY2FzZSB5b3UgYXJlIGxvb2tpbmcgZm9yICdvcHRpb25zW10nIG9yICdmdWxsX2R1cGxleFtdJywgdGhleQorICogYXJlIGdvbmUuIFVzZSBldGh0b29sKDgpIGluc3RlYWQuCisgKi8KKworLyogTWF4aW11bSBudW1iZXIgb2YgbXVsdGljYXN0IGFkZHJlc3NlcyB0byBmaWx0ZXIgKHZzLiByeC1hbGwtbXVsdGljYXN0KS4KKyAgIFRoZSBSaGluZSBoYXMgYSA2NCBlbGVtZW50IDgzOTAtbGlrZSBoYXNoIHRhYmxlLiAqLworc3RhdGljIGNvbnN0IGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gMzI7CisKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IGFyZSBzZXQgYXQgY29tcGlsZSB0aW1lLiAqLworCisvKiBLZWVwIHRoZSByaW5nIHNpemVzIGEgcG93ZXIgb2YgdHdvIGZvciBjb21waWxlIGVmZmljaWVuY3kuCisgICBUaGUgY29tcGlsZXIgd2lsbCBjb252ZXJ0IDx1bnNpZ25lZD4nJSc8Ml5OPiBpbnRvIGEgYml0IG1hc2suCisgICBNYWtpbmcgdGhlIFR4IHJpbmcgdG9vIGxhcmdlIGRlY3JlYXNlcyB0aGUgZWZmZWN0aXZlbmVzcyBvZiBjaGFubmVsCisgICBib25kaW5nIGFuZCBwYWNrZXQgcHJpb3JpdHkuCisgICBUaGVyZSBhcmUgbm8gaWxsIGVmZmVjdHMgZnJvbSB0b28tbGFyZ2UgcmVjZWl2ZSByaW5ncy4gKi8KKyNkZWZpbmUgVFhfUklOR19TSVpFCTE2CisjZGVmaW5lIFRYX1FVRVVFX0xFTgkxMAkvKiBMaW1pdCByaW5nIGVudHJpZXMgYWN0dWFsbHkgdXNlZC4gKi8KKyNkZWZpbmUgUlhfUklOR19TSVpFCTE2CisKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworCisvKiBUaW1lIGluIGppZmZpZXMgYmVmb3JlIGNvbmNsdWRpbmcgdGhlIHRyYW5zbWl0dGVyIGlzIGh1bmcuICovCisjZGVmaW5lIFRYX1RJTUVPVVQJKDIqSFopCisKKyNkZWZpbmUgUEtUX0JVRl9TWgkxNTM2CS8qIFNpemUgb2YgZWFjaCB0ZW1wb3JhcnkgUnggYnVmZmVyLiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CS8qIFByb2Nlc3NvciB0eXBlIGZvciBjYWNoZSBhbGlnbm1lbnQuICovCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qIFRoZXNlIGlkZW50aWZ5IHRoZSBkcml2ZXIgYmFzZSB2ZXJzaW9uIGFuZCBtYXkgbm90IGJlIHJlbW92ZWQuICovCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CitLRVJOX0lORk8gRFJWX05BTUUgIi5jOnYxLjEwLUxLIiBEUlZfVkVSU0lPTiAiICIgRFJWX1JFTERBVEUgIiBXcml0dGVuIGJ5IERvbmFsZCBCZWNrZXJcbiI7CisKKy8qIFRoaXMgZHJpdmVyIHdhcyB3cml0dGVuIHRvIHVzZSBQQ0kgbWVtb3J5IHNwYWNlLiBTb21lIGVhcmx5IHZlcnNpb25zCisgICBvZiB0aGUgUmhpbmUgbWF5IG9ubHkgd29yayBjb3JyZWN0bHkgd2l0aCBJL08gc3BhY2UgYWNjZXNzZXMuICovCisjaWZkZWYgQ09ORklHX1ZJQV9SSElORV9NTUlPCisjZGVmaW5lIFVTRV9NTUlPCisjZWxzZQorI2VuZGlmCisKK01PRFVMRV9BVVRIT1IoIkRvbmFsZCBCZWNrZXIgPGJlY2tlckBzY3lsZC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlZJQSBSaGluZSBQQ0kgRmFzdCBFdGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyeF9jb3B5YnJlYWssIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9pbnRlcnJ1cHRfd29yaywgIlZJQSBSaGluZSBtYXhpbXVtIGV2ZW50cyBoYW5kbGVkIHBlciBpbnRlcnJ1cHQiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJWSUEgUmhpbmUgZGVidWcgbGV2ZWwgKDAtNykiKTsKK01PRFVMRV9QQVJNX0RFU0MocnhfY29weWJyZWFrLCAiVklBIFJoaW5lIGNvcHkgYnJlYWtwb2ludCBmb3IgY29weS1vbmx5LXRpbnktZnJhbWVzIik7CisKKy8qCisJCVRoZW9yeSBvZiBPcGVyYXRpb24KKworSS4gQm9hcmQgQ29tcGF0aWJpbGl0eQorCitUaGlzIGRyaXZlciBpcyBkZXNpZ25lZCBmb3IgdGhlIFZJQSA4NmMxMDBBIFJoaW5lLUlJIFBDSSBGYXN0IEV0aGVybmV0Citjb250cm9sbGVyLgorCitJSS4gQm9hcmQtc3BlY2lmaWMgc2V0dGluZ3MKKworQm9hcmRzIHdpdGggdGhpcyBjaGlwIGFyZSBmdW5jdGlvbmFsIG9ubHkgaW4gYSBidXMtbWFzdGVyIFBDSSBzbG90LgorCitNYW55IG9wZXJhdGlvbmFsIHNldHRpbmdzIGFyZSBsb2FkZWQgZnJvbSB0aGUgRUVQUk9NIHRvIHRoZSBDb25maWcgd29yZCBhdAorb2Zmc2V0IDB4NzguIEZvciBtb3N0IG9mIHRoZXNlIHNldHRpbmdzLCB0aGlzIGRyaXZlciBhc3N1bWVzIHRoYXQgdGhleSBhcmUKK2NvcnJlY3QuCitJZiB0aGlzIGRyaXZlciBpcyBjb21waWxlZCB0byB1c2UgUENJIG1lbW9yeSBzcGFjZSBvcGVyYXRpb25zIHRoZSBFRVBST00KK211c3QgYmUgY29uZmlndXJlZCB0byBlbmFibGUgbWVtb3J5IG9wcy4KKworSUlJLiBEcml2ZXIgb3BlcmF0aW9uCisKK0lJSWEuIFJpbmcgYnVmZmVycworCitUaGlzIGRyaXZlciB1c2VzIHR3byBzdGF0aWNhbGx5IGFsbG9jYXRlZCBmaXhlZC1zaXplIGRlc2NyaXB0b3IgbGlzdHMKK2Zvcm1lZCBpbnRvIHJpbmdzIGJ5IGEgYnJhbmNoIGZyb20gdGhlIGZpbmFsIGRlc2NyaXB0b3IgdG8gdGhlIGJlZ2lubmluZyBvZgordGhlIGxpc3QuIFRoZSByaW5nIHNpemVzIGFyZSBzZXQgYXQgY29tcGlsZSB0aW1lIGJ5IFJYL1RYX1JJTkdfU0laRS4KKworSUlJYi9jLiBUcmFuc21pdC9SZWNlaXZlIFN0cnVjdHVyZQorCitUaGlzIGRyaXZlciBhdHRlbXB0cyB0byB1c2UgYSB6ZXJvLWNvcHkgcmVjZWl2ZSBhbmQgdHJhbnNtaXQgc2NoZW1lLgorCitBbGFzLCBhbGwgZGF0YSBidWZmZXJzIGFyZSByZXF1aXJlZCB0byBzdGFydCBvbiBhIDMyIGJpdCBib3VuZGFyeSwgc28KK3RoZSBkcml2ZXIgbXVzdCBvZnRlbiBjb3B5IHRyYW5zbWl0IHBhY2tldHMgaW50byBib3VuY2UgYnVmZmVycy4KKworVGhlIGRyaXZlciBhbGxvY2F0ZXMgZnVsbCBmcmFtZSBzaXplIHNrYnVmZnMgZm9yIHRoZSBSeCByaW5nIGJ1ZmZlcnMgYXQKK29wZW4oKSB0aW1lIGFuZCBwYXNzZXMgdGhlIHNrYi0+ZGF0YSBmaWVsZCB0byB0aGUgY2hpcCBhcyByZWNlaXZlIGRhdGEKK2J1ZmZlcnMuIFdoZW4gYW4gaW5jb21pbmcgZnJhbWUgaXMgbGVzcyB0aGFuIFJYX0NPUFlCUkVBSyBieXRlcyBsb25nLAorYSBmcmVzaCBza2J1ZmYgaXMgYWxsb2NhdGVkIGFuZCB0aGUgZnJhbWUgaXMgY29waWVkIHRvIHRoZSBuZXcgc2tidWZmLgorV2hlbiB0aGUgaW5jb21pbmcgZnJhbWUgaXMgbGFyZ2VyLCB0aGUgc2tidWZmIGlzIHBhc3NlZCBkaXJlY3RseSB1cCB0aGUKK3Byb3RvY29sIHN0YWNrLiBCdWZmZXJzIGNvbnN1bWVkIHRoaXMgd2F5IGFyZSByZXBsYWNlZCBieSBuZXdseSBhbGxvY2F0ZWQKK3NrYnVmZnMgaW4gdGhlIGxhc3QgcGhhc2Ugb2YgcmhpbmVfcngoKS4KKworVGhlIFJYX0NPUFlCUkVBSyB2YWx1ZSBpcyBjaG9zZW4gdG8gdHJhZGUtb2ZmIHRoZSBtZW1vcnkgd2FzdGVkIGJ5Cit1c2luZyBhIGZ1bGwtc2l6ZWQgc2tidWZmIGZvciBzbWFsbCBmcmFtZXMgdnMuIHRoZSBjb3B5aW5nIGNvc3RzIG9mIGxhcmdlcgorZnJhbWVzLiBOZXcgYm9hcmRzIGFyZSB0eXBpY2FsbHkgdXNlZCBpbiBnZW5lcm91c2x5IGNvbmZpZ3VyZWQgbWFjaGluZXMKK2FuZCB0aGUgdW5kZXJmaWxsZWQgYnVmZmVycyBoYXZlIG5lZ2xpZ2libGUgaW1wYWN0IGNvbXBhcmVkIHRvIHRoZSBiZW5lZml0IG9mCithIHNpbmdsZSBhbGxvY2F0aW9uIHNpemUsIHNvIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHplcm8gcmVzdWx0cyBpbiBuZXZlcgorY29weWluZyBwYWNrZXRzLiBXaGVuIGNvcHlpbmcgaXMgZG9uZSwgdGhlIGNvc3QgaXMgdXN1YWxseSBtaXRpZ2F0ZWQgYnkgdXNpbmcKK2EgY29tYmluZWQgY29weS9jaGVja3N1bSByb3V0aW5lLiBDb3B5aW5nIGFsc28gcHJlbG9hZHMgdGhlIGNhY2hlLCB3aGljaCBpcworbW9zdCB1c2VmdWwgd2l0aCBzbWFsbCBmcmFtZXMuCisKK1NpbmNlIHRoZSBWSUEgY2hpcHMgYXJlIG9ubHkgYWJsZSB0byB0cmFuc2ZlciBkYXRhIHRvIGJ1ZmZlcnMgb24gMzIgYml0Citib3VuZGFyaWVzLCB0aGUgSVAgaGVhZGVyIGF0IG9mZnNldCAxNCBpbiBhbiBldGhlcm5ldCBmcmFtZSBpc24ndAorbG9uZ3dvcmQgYWxpZ25lZCBmb3IgZnVydGhlciBwcm9jZXNzaW5nLiBDb3B5aW5nIHRoZXNlIHVuYWxpZ25lZCBidWZmZXJzCitoYXMgdGhlIGJlbmVmaWNpYWwgZWZmZWN0IG9mIDE2LWJ5dGUgYWxpZ25pbmcgdGhlIElQIGhlYWRlci4KKworSUlJZC4gU3luY2hyb25pemF0aW9uCisKK1RoZSBkcml2ZXIgcnVucyBhcyB0d28gaW5kZXBlbmRlbnQsIHNpbmdsZS10aHJlYWRlZCBmbG93cyBvZiBjb250cm9sLiBPbmUKK2lzIHRoZSBzZW5kLXBhY2tldCByb3V0aW5lLCB3aGljaCBlbmZvcmNlcyBzaW5nbGUtdGhyZWFkZWQgdXNlIGJ5IHRoZQorZGV2LT5wcml2LT5sb2NrIHNwaW5sb2NrLiBUaGUgb3RoZXIgdGhyZWFkIGlzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgd2hpY2gKK2lzIHNpbmdsZSB0aHJlYWRlZCBieSB0aGUgaGFyZHdhcmUgYW5kIGludGVycnVwdCBoYW5kbGluZyBzb2Z0d2FyZS4KKworVGhlIHNlbmQgcGFja2V0IHRocmVhZCBoYXMgcGFydGlhbCBjb250cm9sIG92ZXIgdGhlIFR4IHJpbmcuIEl0IGxvY2tzIHRoZQorZGV2LT5wcml2LT5sb2NrIHdoZW5ldmVyIGl0J3MgcXVldWluZyBhIFR4IHBhY2tldC4gSWYgdGhlIG5leHQgc2xvdCBpbiB0aGUgcmluZworaXMgbm90IGF2YWlsYWJsZSBpdCBzdG9wcyB0aGUgdHJhbnNtaXQgcXVldWUgYnkgY2FsbGluZyBuZXRpZl9zdG9wX3F1ZXVlLgorCitUaGUgaW50ZXJydXB0IGhhbmRsZXIgaGFzIGV4Y2x1c2l2ZSBjb250cm9sIG92ZXIgdGhlIFJ4IHJpbmcgYW5kIHJlY29yZHMgc3RhdHMKK2Zyb20gdGhlIFR4IHJpbmcuIEFmdGVyIHJlYXBpbmcgdGhlIHN0YXRzLCBpdCBtYXJrcyB0aGUgVHggcXVldWUgZW50cnkgYXMKK2VtcHR5IGJ5IGluY3JlbWVudGluZyB0aGUgZGlydHlfdHggbWFyay4gSWYgYXQgbGVhc3QgaGFsZiBvZiB0aGUgZW50cmllcyBpbgordGhlIFJ4IHJpbmcgYXJlIGF2YWlsYWJsZSB0aGUgdHJhbnNtaXQgcXVldWUgaXMgd29rZW4gdXAgaWYgaXQgd2FzIHN0b3BwZWQuCisKK0lWLiBOb3RlcworCitJVmIuIFJlZmVyZW5jZXMKKworUHJlbGltaW5hcnkgVlQ4NkMxMDBBIG1hbnVhbCBmcm9tIGh0dHA6Ly93d3cudmlhLmNvbS50dy8KK2h0dHA6Ly93d3cuc2N5bGQuY29tL2V4cGVydC8xMDBtYnBzLmh0bWwKK2h0dHA6Ly93d3cuc2N5bGQuY29tL2V4cGVydC9OV2F5Lmh0bWwKK2Z0cDovL2Z0cC52aWEuY29tLnR3L3B1YmxpYy9sYW4vUHJvZHVjdHMvTklDL1ZUODZDMTAwQS9EYXRhc2hlZXQvVlQ4NkMxMDBBMDMucGRmCitmdHA6Ly9mdHAudmlhLmNvbS50dy9wdWJsaWMvbGFuL1Byb2R1Y3RzL05JQy9WVDYxMDIvRGF0YXNoZWV0L1ZUNjEwMl8wMjEuUERGCisKKworSVZjLiBFcnJhdGEKKworVGhlIFZUODZDMTAwQSBtYW51YWwgaXMgbm90IHJlbGlhYmxlIGluZm9ybWF0aW9uLgorVGhlIDMwNDMgY2hpcCBkb2VzIG5vdCBoYW5kbGUgdW5hbGlnbmVkIHRyYW5zbWl0IG9yIHJlY2VpdmUgYnVmZmVycywgcmVzdWx0aW5nCitpbiBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiBmb3IgYm91bmNlIGJ1ZmZlciBjb3BpZXMgb24gdHJhbnNtaXQKK2FuZCB1bmFsaWduZWQgSVAgaGVhZGVycyBvbiByZWNlaXZlLgorVGhlIGNoaXAgZG9lcyBub3QgcGFkIHRvIG1pbmltdW0gdHJhbnNtaXQgbGVuZ3RoLgorCisqLworCisKKy8qIFRoaXMgdGFibGUgZHJpdmVzIHRoZSBQQ0kgcHJvYmUgcm91dGluZXMuIEl0J3MgbW9zdGx5IGJvaWxlcnBsYXRlIGluIGFsbAorICAgb2YgdGhlIGRyaXZlcnMsIGFuZCB3aWxsIGxpa2VseSBiZSBwcm92aWRlZCBieSBzb21lIGZ1dHVyZSBrZXJuZWwuCisgICBOb3RlIHRoZSBtYXRjaGluZyBjb2RlIC0tIHRoZSBmaXJzdCB0YWJsZSBlbnRyeSBtYXRjaHMgYWxsIDU2KiogY2FyZHMgYnV0CisgICBzZWNvbmQgb25seSB0aGUgMTIzNCBjYXJkLgorKi8KKworZW51bSByaGluZV9yZXZzIHsKKwlWVDg2QzEwMEEJPSAweDAwLAorCVZUdW5rbm93bjAJPSAweDIwLAorCVZUNjEwMgkJPSAweDQwLAorCVZUODIzMQkJPSAweDUwLAkvKiBJbnRlZ3JhdGVkIE1BQyAqLworCVZUODIzMwkJPSAweDYwLAkvKiBJbnRlZ3JhdGVkIE1BQyAqLworCVZUODIzNQkJPSAweDc0LAkvKiBJbnRlZ3JhdGVkIE1BQyAqLworCVZUODIzNwkJPSAweDc4LAkvKiBJbnRlZ3JhdGVkIE1BQyAqLworCVZUdW5rbm93bjEJPSAweDdDLAorCVZUNjEwNQkJPSAweDgwLAorCVZUNjEwNV9CMAk9IDB4ODMsCisJVlQ2MTA1TAkJPSAweDhBLAorCVZUNjEwNwkJPSAweDhDLAorCVZUdW5rbm93bjIJPSAweDhFLAorCVZUNjEwNU0JCT0gMHg5MCwJLyogTWFuYWdlbWVudCBhZGFwdGVyICovCit9OworCitlbnVtIHJoaW5lX3F1aXJrcyB7CisJcnFXT0wJCT0gMHgwMDAxLAkvKiBXYWtlLU9uLUxBTiBzdXBwb3J0ICovCisJcnFGb3JjZVJlc2V0CT0gMHgwMDAyLAorCXJxNnBhdHRlcm5zCT0gMHgwMDQwLAkvKiA2IGluc3RlYWQgb2YgNCBwYXR0ZXJucyBmb3IgV09MICovCisJcnFTdGF0dXNXQlJhY2UJPSAweDAwODAsCS8qIFR4IFN0YXR1cyBXcml0ZWJhY2sgRXJyb3IgcG9zc2libGUgKi8KKwlycVJoaW5lSQk9IDB4MDEwMCwJLyogU2VlIGNvbW1lbnQgYmVsb3cgKi8KK307CisvKgorICogcnFSaGluZUk6IFZUODZDMTAwQSAoYWthIFJoaW5lLUkpIHVzZXMgZGlmZmVyZW50IGJpdHMgdG8gZW5hYmxlCisgKiBNTUlPIGFzIHdlbGwgYXMgZm9yIHRoZSBjb2xsaXNpb24gY291bnRlciBhbmQgdGhlIFR4IEZJRk8gdW5kZXJmbG93CisgKiBpbmRpY2F0b3IuIEluIGFkZGl0aW9uLCBUeCBhbmQgUnggYnVmZmVycyBuZWVkIHRvIDQgYnl0ZSBhbGlnbmVkLgorICovCisKKy8qIEJld2FyZSBvZiBQQ0kgcG9zdGVkIHdyaXRlcyAqLworI2RlZmluZSBJT1NZTkMJZG8geyBpb3JlYWQ4KGlvYWRkciArIFN0YXRpb25BZGRyKTsgfSB3aGlsZSAoMCkKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJoaW5lX3BjaV90YmxbXSA9Cit7CisJezB4MTEwNiwgMHgzMDQzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCB9LCAvKiBWVDg2QzEwMEEgKi8KKwl7MHgxMTA2LCAweDMwNjUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIH0sIC8qIFZUNjEwMiAqLworCXsweDExMDYsIDB4MzEwNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgfSwgLyogNjEwNXssTCxMT019ICovCisJezB4MTEwNiwgMHgzMDUzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCB9LCAvKiBWVDYxMDVNICovCisJeyB9CS8qIHRlcm1pbmF0ZSBsaXN0ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHJoaW5lX3BjaV90YmwpOworCisKKy8qIE9mZnNldHMgdG8gdGhlIGRldmljZSByZWdpc3RlcnMuICovCitlbnVtIHJlZ2lzdGVyX29mZnNldHMgeworCVN0YXRpb25BZGRyPTB4MDAsIFJ4Q29uZmlnPTB4MDYsIFR4Q29uZmlnPTB4MDcsIENoaXBDbWQ9MHgwOCwKKwlDaGlwQ21kMT0weDA5LAorCUludHJTdGF0dXM9MHgwQywgSW50ckVuYWJsZT0weDBFLAorCU11bHRpY2FzdEZpbHRlcjA9MHgxMCwgTXVsdGljYXN0RmlsdGVyMT0weDE0LAorCVJ4UmluZ1B0cj0weDE4LCBUeFJpbmdQdHI9MHgxQywgR0ZJRk9UZXN0PTB4NTQsCisJTUlJUGh5QWRkcj0weDZDLCBNSUlTdGF0dXM9MHg2RCwgUENJQnVzQ29uZmlnPTB4NkUsCisJTUlJQ21kPTB4NzAsIE1JSVJlZ0FkZHI9MHg3MSwgTUlJRGF0YT0weDcyLCBNQUNSZWdFRWNzcj0weDc0LAorCUNvbmZpZ0E9MHg3OCwgQ29uZmlnQj0weDc5LCBDb25maWdDPTB4N0EsIENvbmZpZ0Q9MHg3QiwKKwlSeE1pc3NlZD0weDdDLCBSeENSQ0VycnM9MHg3RSwgTWlzY0NtZD0weDgxLAorCVN0aWNreUhXPTB4ODMsIEludHJTdGF0dXMyPTB4ODQsCisJV09MY3JTZXQ9MHhBMCwgUHdjZmdTZXQ9MHhBMSwgV09MY2dTZXQ9MHhBMywgV09MY3JDbHI9MHhBNCwKKwlXT0xjckNscjE9MHhBNiwgV09MY2dDbHI9MHhBNywKKwlQd3Jjc3JTZXQ9MHhBOCwgUHdyY3NyU2V0MT0weEE5LCBQd3Jjc3JDbHI9MHhBQywgUHdyY3NyQ2xyMT0weEFELAorfTsKKworLyogQml0cyBpbiBDb25maWdEICovCitlbnVtIGJhY2tvZmZfYml0cyB7CisJQmFja09wdGlvbmFsPTB4MDEsIEJhY2tNb2RpZnk9MHgwMiwKKwlCYWNrQ2FwdHVyZUVmZmVjdD0weDA0LCBCYWNrUmFuZG9tPTB4MDgKK307CisKKyNpZmRlZiBVU0VfTU1JTworLyogUmVnaXN0ZXJzIHdlIGNoZWNrIHRoYXQgbW1pbyBhbmQgcmVnIGFyZSB0aGUgc2FtZS4gKi8KK3N0YXRpYyBjb25zdCBpbnQgbW1pb192ZXJpZnlfcmVnaXN0ZXJzW10gPSB7CisJUnhDb25maWcsIFR4Q29uZmlnLCBJbnRyRW5hYmxlLCBDb25maWdBLCBDb25maWdCLCBDb25maWdDLCBDb25maWdELAorCTAKK307CisjZW5kaWYKKworLyogQml0cyBpbiB0aGUgaW50ZXJydXB0IHN0YXR1cy9tYXNrIHJlZ2lzdGVycy4gKi8KK2VudW0gaW50cl9zdGF0dXNfYml0cyB7CisJSW50clJ4RG9uZT0weDAwMDEsIEludHJSeEVycj0weDAwMDQsIEludHJSeEVtcHR5PTB4MDAyMCwKKwlJbnRyVHhEb25lPTB4MDAwMiwgSW50clR4RXJyb3I9MHgwMDA4LCBJbnRyVHhVbmRlcnJ1bj0weDAyMTAsCisJSW50clBDSUVycj0weDAwNDAsCisJSW50clN0YXRzTWF4PTB4MDA4MCwgSW50clJ4RWFybHk9MHgwMTAwLAorCUludHJSeE92ZXJmbG93PTB4MDQwMCwgSW50clJ4RHJvcHBlZD0weDA4MDAsIEludHJSeE5vQnVmPTB4MTAwMCwKKwlJbnRyVHhBYm9ydGVkPTB4MjAwMCwgSW50ckxpbmtDaGFuZ2U9MHg0MDAwLAorCUludHJSeFdha2VVcD0weDgwMDAsCisJSW50ck5vcm1hbFN1bW1hcnk9MHgwMDAzLCBJbnRyQWJub3JtYWxTdW1tYXJ5PTB4QzI2MCwKKwlJbnRyVHhEZXNjUmFjZT0weDA4MDAwMCwJLyogbWFwcGVkIGZyb20gSW50clN0YXR1czIgKi8KKwlJbnRyVHhFcnJTdW1tYXJ5PTB4MDgyMjE4LAorfTsKKworLyogQml0cyBpbiBXT0xjclNldC9XT0xjckNsciBhbmQgUHdyY3NyU2V0L1B3cmNzckNsciAqLworZW51bSB3b2xfYml0cyB7CisJV09MdWNhc3QJPSAweDEwLAorCVdPTG1hZ2ljCT0gMHgyMCwKKwlXT0xibWNhc3QJPSAweDMwLAorCVdPTGxua29uCT0gMHg0MCwKKwlXT0xsbmtvZmYJPSAweDgwLAorfTsKKworLyogVGhlIFJ4IGFuZCBUeCBidWZmZXIgZGVzY3JpcHRvcnMuICovCitzdHJ1Y3QgcnhfZGVzYyB7CisJczMyIHJ4X3N0YXR1czsKKwl1MzIgZGVzY19sZW5ndGg7IC8qIENoYWluIGZsYWcsIEJ1ZmZlci9mcmFtZSBsZW5ndGggKi8KKwl1MzIgYWRkcjsKKwl1MzIgbmV4dF9kZXNjOworfTsKK3N0cnVjdCB0eF9kZXNjIHsKKwlzMzIgdHhfc3RhdHVzOworCXUzMiBkZXNjX2xlbmd0aDsgLyogQ2hhaW4gZmxhZywgVHggQ29uZmlnLCBGcmFtZSBsZW5ndGggKi8KKwl1MzIgYWRkcjsKKwl1MzIgbmV4dF9kZXNjOworfTsKKworLyogSW5pdGlhbCB2YWx1ZSBmb3IgdHhfZGVzYy5kZXNjX2xlbmd0aCwgQnVmZmVyIHNpemUgZ29lcyB0byBiaXRzIDAtMTAgKi8KKyNkZWZpbmUgVFhERVNDCQkweDAwZTA4MDAwCisKK2VudW0gcnhfc3RhdHVzX2JpdHMgeworCVJ4T0s9MHg4MDAwLCBSeFdob2xlUGt0PTB4MDMwMCwgUnhFcnI9MHgwMDhGCit9OworCisvKiBCaXRzIGluICpfZGVzYy4qX3N0YXR1cyAqLworZW51bSBkZXNjX3N0YXR1c19iaXRzIHsKKwlEZXNjT3duPTB4ODAwMDAwMDAKK307CisKKy8qIEJpdHMgaW4gQ2hpcENtZC4gKi8KK2VudW0gY2hpcF9jbWRfYml0cyB7CisJQ21kSW5pdD0weDAxLCBDbWRTdGFydD0weDAyLCBDbWRTdG9wPTB4MDQsIENtZFJ4T249MHgwOCwKKwlDbWRUeE9uPTB4MTAsIENtZDFUeERlbWFuZD0weDIwLCBDbWRSeERlbWFuZD0weDQwLAorCUNtZDFFYXJseVJ4PTB4MDEsIENtZDFFYXJseVR4PTB4MDIsIENtZDFGRHVwbGV4PTB4MDQsCisJQ21kMU5vVHhQb2xsPTB4MDgsIENtZDFSZXNldD0weDgwLAorfTsKKworc3RydWN0IHJoaW5lX3ByaXZhdGUgeworCS8qIERlc2NyaXB0b3IgcmluZ3MgKi8KKwlzdHJ1Y3QgcnhfZGVzYyAqcnhfcmluZzsKKwlzdHJ1Y3QgdHhfZGVzYyAqdHhfcmluZzsKKwlkbWFfYWRkcl90IHJ4X3JpbmdfZG1hOworCWRtYV9hZGRyX3QgdHhfcmluZ19kbWE7CisKKwkvKiBUaGUgYWRkcmVzc2VzIG9mIHJlY2VpdmUtaW4tcGxhY2Ugc2tidWZmcy4gKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tidWZmW1JYX1JJTkdfU0laRV07CisJZG1hX2FkZHJfdCByeF9za2J1ZmZfZG1hW1JYX1JJTkdfU0laRV07CisKKwkvKiBUaGUgc2F2ZWQgYWRkcmVzcyBvZiBhIHNlbnQtaW4tcGxhY2UgcGFja2V0L2J1ZmZlciwgZm9yIGxhdGVyIGZyZWUoKS4gKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tidWZmW1RYX1JJTkdfU0laRV07CisJZG1hX2FkZHJfdCB0eF9za2J1ZmZfZG1hW1RYX1JJTkdfU0laRV07CisKKwkvKiBUeCBib3VuY2UgYnVmZmVycyAqLworCXVuc2lnbmVkIGNoYXIgKnR4X2J1ZltUWF9SSU5HX1NJWkVdOworCXVuc2lnbmVkIGNoYXIgKnR4X2J1ZnM7CisJZG1hX2FkZHJfdCB0eF9idWZzX2RtYTsKKworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCWxvbmcgcGlvYWRkcjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzcGlubG9ja190IGxvY2s7CisKKwkvKiBGcmVxdWVudGx5IHVzZWQgdmFsdWVzOiBrZWVwIHNvbWUgYWRqYWNlbnQgZm9yIGNhY2hlIGVmZmVjdC4gKi8KKwl1MzIgcXVpcmtzOworCXN0cnVjdCByeF9kZXNjICpyeF9oZWFkX2Rlc2M7CisJdW5zaWduZWQgaW50IGN1cl9yeCwgZGlydHlfcng7CS8qIFByb2R1Y2VyL2NvbnN1bWVyIHJpbmcgaW5kaWNlcyAqLworCXVuc2lnbmVkIGludCBjdXJfdHgsIGRpcnR5X3R4OworCXVuc2lnbmVkIGludCByeF9idWZfc3o7CQkvKiBCYXNlZCBvbiBNVFUrc2xhY2suICovCisJdTggd29sb3B0czsKKworCXU4IHR4X3RocmVzaCwgcnhfdGhyZXNoOworCisJc3RydWN0IG1paV9pZl9pbmZvIG1paV9pZjsKKwl2b2lkIF9faW9tZW0gKmJhc2U7Cit9OworCitzdGF0aWMgaW50ICBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpOworc3RhdGljIGludCAgcmhpbmVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJoaW5lX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICByaGluZV9zdGFydF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCByaGluZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCByaGluZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJoaW5lX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcmhpbmVfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGludHJfc3RhdHVzKTsKK3N0YXRpYyB2b2lkIHJoaW5lX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpyaGluZV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IG5ldGRldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOworc3RhdGljIGludCAgcmhpbmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCByaGluZV9zaHV0ZG93biAoc3RydWN0IGRldmljZSAqZ2Rldik7CisKKyNkZWZpbmUgUkhJTkVfV0FJVF9GT1IoY29uZGl0aW9uKSBkbyB7CQkJCQlcCisJaW50IGk9MTAyNDsJCQkJCQkJXAorCXdoaWxlICghKGNvbmRpdGlvbikgJiYgLS1pKQkJCQkJXAorCQk7CQkJCQkJCVwKKwlpZiAoZGVidWcgPiAxICYmIGkgPCA1MTIpCQkJCQlcCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlNGQgY3ljbGVzIHVzZWQgQCAlczolZFxuIiwJXAorCQkJCURSVl9OQU1FLCAxMDI0LWksIF9fZnVuY19fLCBfX0xJTkVfXyk7CVwKK30gd2hpbGUoMCkKKworc3RhdGljIGlubGluZSB1MzIgZ2V0X2ludHJfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHJwLT5iYXNlOworCXUzMiBpbnRyX3N0YXR1czsKKworCWludHJfc3RhdHVzID0gaW9yZWFkMTYoaW9hZGRyICsgSW50clN0YXR1cyk7CisJLyogT24gUmhpbmUtSUksIEJpdCAzIGluZGljYXRlcyBUeCBkZXNjcmlwdG9yIHdyaXRlLWJhY2sgcmFjZS4gKi8KKwlpZiAocnAtPnF1aXJrcyAmIHJxU3RhdHVzV0JSYWNlKQorCQlpbnRyX3N0YXR1cyB8PSBpb3JlYWQ4KGlvYWRkciArIEludHJTdGF0dXMyKSA8PCAxNjsKKwlyZXR1cm4gaW50cl9zdGF0dXM7Cit9CisKKy8qCisgKiBHZXQgcG93ZXIgcmVsYXRlZCByZWdpc3RlcnMgaW50byBzYW5lIHN0YXRlLgorICogTm90aWZ5IHVzZXIgYWJvdXQgcGFzdCBXT0wgZXZlbnQuCisgKi8KK3N0YXRpYyB2b2lkIHJoaW5lX3Bvd2VyX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CisJdTE2IHdvbHN0YXQ7CisKKwlpZiAocnAtPnF1aXJrcyAmIHJxV09MKSB7CisJCS8qIE1ha2Ugc3VyZSBjaGlwIGlzIGluIHBvd2VyIHN0YXRlIEQwICovCisJCWlvd3JpdGU4KGlvcmVhZDgoaW9hZGRyICsgU3RpY2t5SFcpICYgMHhGQywgaW9hZGRyICsgU3RpY2t5SFcpOworCisJCS8qIERpc2FibGUgImZvcmNlIFBNRS1lbmFibGUiICovCisJCWlvd3JpdGU4KDB4ODAsIGlvYWRkciArIFdPTGNnQ2xyKTsKKworCQkvKiBDbGVhciBwb3dlci1ldmVudCBjb25maWcgYml0cyAoV09MKSAqLworCQlpb3dyaXRlOCgweEZGLCBpb2FkZHIgKyBXT0xjckNscik7CisJCS8qIE1vcmUgcmVjZW50IGNhcmRzIGNhbiBtYW5hZ2UgdHdvIGFkZGl0aW9uYWwgcGF0dGVybnMgKi8KKwkJaWYgKHJwLT5xdWlya3MgJiBycTZwYXR0ZXJucykKKwkJCWlvd3JpdGU4KDB4MDMsIGlvYWRkciArIFdPTGNyQ2xyMSk7CisKKwkJLyogU2F2ZSBwb3dlci1ldmVudCBzdGF0dXMgYml0cyAqLworCQl3b2xzdGF0ID0gaW9yZWFkOChpb2FkZHIgKyBQd3Jjc3JTZXQpOworCQlpZiAocnAtPnF1aXJrcyAmIHJxNnBhdHRlcm5zKQorCQkJd29sc3RhdCB8PSAoaW9yZWFkOChpb2FkZHIgKyBQd3Jjc3JTZXQxKSAmIDB4MDMpIDw8IDg7CisKKwkJLyogQ2xlYXIgcG93ZXItZXZlbnQgc3RhdHVzIGJpdHMgKi8KKwkJaW93cml0ZTgoMHhGRiwgaW9hZGRyICsgUHdyY3NyQ2xyKTsKKwkJaWYgKHJwLT5xdWlya3MgJiBycTZwYXR0ZXJucykKKwkJCWlvd3JpdGU4KDB4MDMsIGlvYWRkciArIFB3cmNzckNscjEpOworCisJCWlmICh3b2xzdGF0KSB7CisJCQljaGFyICpyZWFzb247CisJCQlzd2l0Y2ggKHdvbHN0YXQpIHsKKwkJCWNhc2UgV09MbWFnaWM6CisJCQkJcmVhc29uID0gIk1hZ2ljIHBhY2tldCI7CisJCQkJYnJlYWs7CisJCQljYXNlIFdPTGxua29uOgorCQkJCXJlYXNvbiA9ICJMaW5rIHdlbnQgdXAiOworCQkJCWJyZWFrOworCQkJY2FzZSBXT0xsbmtvZmY6CisJCQkJcmVhc29uID0gIkxpbmsgd2VudCBkb3duIjsKKwkJCQlicmVhazsKKwkJCWNhc2UgV09MdWNhc3Q6CisJCQkJcmVhc29uID0gIlVuaWNhc3QgcGFja2V0IjsKKwkJCQlicmVhazsKKwkJCWNhc2UgV09MYm1jYXN0OgorCQkJCXJlYXNvbiA9ICJNdWx0aWNhc3QvYnJvYWRjYXN0IHBhY2tldCI7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJlYXNvbiA9ICJVbmtub3duIjsKKwkJCX0KKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBXb2tlIHN5c3RlbSB1cC4gUmVhc29uOiAlcy5cbiIsCisJCQkgICAgICAgRFJWX05BTUUsIHJlYXNvbik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJoaW5lX2NoaXBfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CisKKwlpb3dyaXRlOChDbWQxUmVzZXQsIGlvYWRkciArIENoaXBDbWQxKTsKKwlJT1NZTkM7CisKKwlpZiAoaW9yZWFkOChpb2FkZHIgKyBDaGlwQ21kMSkgJiBDbWQxUmVzZXQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlc2V0IG5vdCBjb21wbGV0ZSB5ZXQuICIKKwkJCSJUcnlpbmcgaGFyZGVyLlxuIiwgRFJWX05BTUUpOworCisJCS8qIEZvcmNlIHJlc2V0ICovCisJCWlmIChycC0+cXVpcmtzICYgcnFGb3JjZVJlc2V0KQorCQkJaW93cml0ZTgoMHg0MCwgaW9hZGRyICsgTWlzY0NtZCk7CisKKwkJLyogUmVzZXQgY2FuIHRha2Ugc29tZXdoYXQgbG9uZ2VyIChyYXJlKSAqLworCQlSSElORV9XQUlUX0ZPUighKGlvcmVhZDgoaW9hZGRyICsgQ2hpcENtZDEpICYgQ21kMVJlc2V0KSk7CisJfQorCisJaWYgKGRlYnVnID4gMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlc2V0ICVzLlxuIiwgZGV2LT5uYW1lLAorCQkJKGlvcmVhZDgoaW9hZGRyICsgQ2hpcENtZDEpICYgQ21kMVJlc2V0KSA/CisJCQkiZmFpbGVkIiA6ICJzdWNjZWVkZWQiKTsKK30KKworI2lmZGVmIFVTRV9NTUlPCitzdGF0aWMgdm9pZCBlbmFibGVfbW1pbyhsb25nIHBpb2FkZHIsIHUzMiBxdWlya3MpCit7CisJaW50IG47CisJaWYgKHF1aXJrcyAmIHJxUmhpbmVJKSB7CisJCS8qIE1vcmUgcmVjZW50IGRvY3Mgc2F5IHRoYXQgdGhpcyBiaXQgaXMgcmVzZXJ2ZWQgLi4uICovCisJCW4gPSBpbmIocGlvYWRkciArIENvbmZpZ0EpIHwgMHgyMDsKKwkJb3V0YihuLCBwaW9hZGRyICsgQ29uZmlnQSk7CisJfSBlbHNlIHsKKwkJbiA9IGluYihwaW9hZGRyICsgQ29uZmlnRCkgfCAweDgwOworCQlvdXRiKG4sIHBpb2FkZHIgKyBDb25maWdEKTsKKwl9Cit9CisjZW5kaWYKKworLyoKKyAqIExvYWRzIGJ5dGVzIDB4MDAtMHgwNSwgMHg2RS0weDZGLCAweDc4LTB4N0IgZnJvbSBFRVBST00KKyAqIChwbHVzIDB4NkMgZm9yIFJoaW5lLUkvSUkpCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCByaGluZV9yZWxvYWRfZWVwcm9tKGxvbmcgcGlvYWRkciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CisKKwlvdXRiKDB4MjAsIHBpb2FkZHIgKyBNQUNSZWdFRWNzcik7CisJUkhJTkVfV0FJVF9GT1IoIShpbmIocGlvYWRkciArIE1BQ1JlZ0VFY3NyKSAmIDB4MjApKTsKKworI2lmZGVmIFVTRV9NTUlPCisJLyoKKwkgKiBSZWxvYWRpbmcgZnJvbSBFRVBST00gb3ZlcndyaXRlcyBDb25maWdBLUQsIHNvIHdlIG11c3QgcmUtZW5hYmxlCisJICogTU1JTy4gSWYgcmVsb2FkaW5nIEVFUFJPTSB3YXMgZG9uZSBmaXJzdCB0aGlzIGNvdWxkIGJlIGF2b2lkZWQsIGJ1dAorCSAqIGl0IGlzIG5vdCBrbm93biBpZiB0aGF0IHN0aWxsIHdvcmtzIHdpdGggdGhlICJ3aW45OC1yZWJvb3QiIHByb2JsZW0uCisJICovCisJZW5hYmxlX21taW8ocGlvYWRkciwgcnAtPnF1aXJrcyk7CisjZW5kaWYKKworCS8qIFR1cm4gb2ZmIEVFUFJPTS1jb250cm9sbGVkIHdha2UtdXAgKG1hZ2ljIHBhY2tldCkgKi8KKwlpZiAocnAtPnF1aXJrcyAmIHJxV09MKQorCQlpb3dyaXRlOChpb3JlYWQ4KGlvYWRkciArIENvbmZpZ0EpICYgMHhGQywgaW9hZGRyICsgQ29uZmlnQSk7CisKK30KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCByaGluZV9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCXJoaW5lX2ludGVycnVwdChkZXYtPmlycSwgKHZvaWQgKilkZXYsIE5VTEwpOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHJoaW5lX2h3X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbG9uZyBwaW9hZGRyKQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBSZXNldCB0aGUgY2hpcCB0byBlcmFzZSBwcmV2aW91cyBtaXNjb25maWd1cmF0aW9uLiAqLworCXJoaW5lX2NoaXBfcmVzZXQoZGV2KTsKKworCS8qIFJoaW5lLUkgbmVlZHMgZXh0cmEgdGltZSB0byByZWN1cGVyYXRlIGJlZm9yZSBFRVBST00gcmVsb2FkICovCisJaWYgKHJwLT5xdWlya3MgJiBycVJoaW5lSSkKKwkJbXNsZWVwKDUpOworCisJLyogUmVsb2FkIEVFUFJPTSBjb250cm9sbGVkIGJ5dGVzIGNsZWFyZWQgYnkgc29mdCByZXNldCAqLworCXJoaW5lX3JlbG9hZF9lZXByb20ocGlvYWRkciwgZGV2KTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcmhpbmVfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnA7CisJaW50IGksIHJjOworCXU4IHBjaV9yZXY7CisJdTMyIHF1aXJrczsKKwlsb25nIHBpb2FkZHI7CisJbG9uZyBtZW1hZGRyOworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCWludCBpb19zaXplLCBwaHlfaWQ7CisJY29uc3QgY2hhciAqbmFtZTsKKyNpZmRlZiBVU0VfTU1JTworCWludCBiYXIgPSAxOworI2Vsc2UKKwlpbnQgYmFyID0gMDsKKyNlbmRpZgorCisvKiB3aGVuIGJ1aWx0IGludG8gdGhlIGtlcm5lbCwgd2Ugb25seSBwcmludCB2ZXJzaW9uIGlmIGRldmljZSBpcyBmb3VuZCAqLworI2lmbmRlZiBNT0RVTEUKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnBjaV9yZXYpOworCisJaW9fc2l6ZSA9IDI1NjsKKwlwaHlfaWQgPSAwOworCXF1aXJrcyA9IDA7CisJbmFtZSA9ICJSaGluZSI7CisJaWYgKHBjaV9yZXYgPCBWVHVua25vd24wKSB7CisJCXF1aXJrcyA9IHJxUmhpbmVJOworCQlpb19zaXplID0gMTI4OworCX0KKwllbHNlIGlmIChwY2lfcmV2ID49IFZUNjEwMikgeworCQlxdWlya3MgPSBycVdPTCB8IHJxRm9yY2VSZXNldDsKKwkJaWYgKHBjaV9yZXYgPCBWVDYxMDUpIHsKKwkJCW5hbWUgPSAiUmhpbmUgSUkiOworCQkJcXVpcmtzIHw9IHJxU3RhdHVzV0JSYWNlOwkvKiBSaGluZS1JSSBleGNsdXNpdmUgKi8KKwkJfQorCQllbHNlIHsKKwkJCXBoeV9pZCA9IDE7CS8qIEludGVncmF0ZWQgUEhZLCBwaHlfaWQgZml4ZWQgdG8gMSAqLworCQkJaWYgKHBjaV9yZXYgPj0gVlQ2MTA1X0IwKQorCQkJCXF1aXJrcyB8PSBycTZwYXR0ZXJuczsKKwkJCWlmIChwY2lfcmV2IDwgVlQ2MTA1TSkKKwkJCQluYW1lID0gIlJoaW5lIElJSSI7CisJCQllbHNlCisJCQkJbmFtZSA9ICJSaGluZSBJSUkgKE1hbmFnZW1lbnQgQWRhcHRlcikiOworCQl9CisJfQorCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dDsKKworCS8qIHRoaXMgc2hvdWxkIGFsd2F5cyBiZSBzdXBwb3J0ZWQgKi8KKwlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiMzItYml0IFBDSSBETUEgYWRkcmVzc2VzIG5vdCBzdXBwb3J0ZWQgYnkgIgorCQkgICAgICAgInRoZSBjYXJkIT9cbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogc2FuaXR5IGNoZWNrICovCisJaWYgKChwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApIDwgaW9fc2l6ZSkgfHwKKwkgICAgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkgPCBpb19zaXplKSkgeworCQlyYyA9IC1FSU87CisJCXByaW50ayhLRVJOX0VSUiAiSW5zdWZmaWNpZW50IFBDSSByZXNvdXJjZXMsIGFib3J0aW5nXG4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXBpb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJbWVtYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCByaGluZV9wcml2YXRlKSk7CisJaWYgKCFkZXYpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlwcmludGsoS0VSTl9FUlIgImFsbG9jX2V0aGVyZGV2IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlycCA9IG5ldGRldl9wcml2KGRldik7CisJcnAtPnF1aXJrcyA9IHF1aXJrczsKKwlycC0+cGlvYWRkciA9IHBpb2FkZHI7CisJcnAtPnBkZXYgPSBwZGV2OworCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKworCWlvYWRkciA9IHBjaV9pb21hcChwZGV2LCBiYXIsIGlvX3NpemUpOworCWlmICghaW9hZGRyKSB7CisJCXJjID0gLUVJTzsKKwkJcHJpbnRrKEtFUk5fRVJSICJpb3JlbWFwIGZhaWxlZCBmb3IgZGV2aWNlICVzLCByZWdpb24gMHglWCAiCisJCSAgICAgICAiQCAweCVsWFxuIiwgcGNpX25hbWUocGRldiksIGlvX3NpemUsIG1lbWFkZHIpOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CisJfQorCisjaWZkZWYgVVNFX01NSU8KKwllbmFibGVfbW1pbyhwaW9hZGRyLCBxdWlya3MpOworCisJLyogQ2hlY2sgdGhhdCBzZWxlY3RlZCBNTUlPIHJlZ2lzdGVycyBtYXRjaCB0aGUgUElPIG9uZXMgKi8KKwlpID0gMDsKKwl3aGlsZSAobW1pb192ZXJpZnlfcmVnaXN0ZXJzW2ldKSB7CisJCWludCByZWcgPSBtbWlvX3ZlcmlmeV9yZWdpc3RlcnNbaSsrXTsKKwkJdW5zaWduZWQgY2hhciBhID0gaW5iKHBpb2FkZHIrcmVnKTsKKwkJdW5zaWduZWQgY2hhciBiID0gcmVhZGIoaW9hZGRyK3JlZyk7CisJCWlmIChhICE9IGIpIHsKKwkJCXJjID0gLUVJTzsKKwkJCXByaW50ayhLRVJOX0VSUiAiTU1JTyBkbyBub3QgbWF0Y2ggUElPIFslMDJ4XSAiCisJCQkgICAgICAgIiglMDJ4ICE9ICUwMngpXG4iLCByZWcsIGEsIGIpOworCQkJZ290byBlcnJfb3V0X3VubWFwOworCQl9CisJfQorI2VuZGlmIC8qIFVTRV9NTUlPICovCisKKwlkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvYWRkcjsKKwlycC0+YmFzZSA9IGlvYWRkcjsKKworCS8qIEdldCBjaGlwIHJlZ2lzdGVycyBpbnRvIGEgc2FuZSBzdGF0ZSAqLworCXJoaW5lX3Bvd2VyX2luaXQoZGV2KTsKKwlyaGluZV9od19pbml0KGRldiwgcGlvYWRkcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0gaW9yZWFkOChpb2FkZHIgKyBTdGF0aW9uQWRkciArIGkpOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKSB7CisJCXJjID0gLUVJTzsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIE1BQyBhZGRyZXNzXG4iKTsKKwkJZ290byBlcnJfb3V0X3VubWFwOworCX0KKworCS8qIEZvciBSaGluZS1JL0lJLCBwaHlfaWQgaXMgbG9hZGVkIGZyb20gRUVQUk9NICovCisJaWYgKCFwaHlfaWQpCisJCXBoeV9pZCA9IGlvcmVhZDgoaW9hZGRyICsgMHg2Qyk7CisKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKworCXNwaW5fbG9ja19pbml0KCZycC0+bG9jayk7CisJcnAtPm1paV9pZi5kZXYgPSBkZXY7CisJcnAtPm1paV9pZi5tZGlvX3JlYWQgPSBtZGlvX3JlYWQ7CisJcnAtPm1paV9pZi5tZGlvX3dyaXRlID0gbWRpb193cml0ZTsKKwlycC0+bWlpX2lmLnBoeV9pZF9tYXNrID0gMHgxZjsKKwlycC0+bWlpX2lmLnJlZ19udW1fbWFzayA9IDB4MWY7CisKKwkvKiBUaGUgY2hpcC1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+b3BlbiA9IHJoaW5lX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSByaGluZV9zdGFydF90eDsKKwlkZXYtPnN0b3AgPSByaGluZV9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9IHJoaW5lX2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHJoaW5lX3NldF9yeF9tb2RlOworCWRldi0+ZG9faW9jdGwgPSBuZXRkZXZfaW9jdGw7CisJZGV2LT5ldGh0b29sX29wcyA9ICZuZXRkZXZfZXRodG9vbF9vcHM7CisJZGV2LT50eF90aW1lb3V0ID0gcmhpbmVfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gcmhpbmVfcG9sbDsKKyNlbmRpZgorCWlmIChycC0+cXVpcmtzICYgcnFSaGluZUkpCisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9TR3xORVRJRl9GX0hXX0NTVU07CisKKwkvKiBkZXYtPm5hbWUgbm90IGRlZmluZWQgYmVmb3JlIHJlZ2lzdGVyX25ldGRldigpISAqLworCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfdW5tYXA7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogVklBICVzIGF0IDB4JWx4LCAiLAorCSAgICAgICBkZXYtPm5hbWUsIG5hbWUsCisjaWZkZWYgVVNFX01NSU8KKwkJbWVtYWRkcgorI2Vsc2UKKwkJKGxvbmcpaW9hZGRyCisjZW5kaWYKKwkJICk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlwcmludGsoIiUyLjJ4OiIsIGRldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiJTIuMngsIElSUSAlZC5cbiIsIGRldi0+ZGV2X2FkZHJbaV0sIHBkZXYtPmlycSk7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCXsKKwkJdTE2IG1paV9jbWQ7CisJCWludCBtaWlfc3RhdHVzID0gbWRpb19yZWFkKGRldiwgcGh5X2lkLCAxKTsKKwkJbWlpX2NtZCA9IG1kaW9fcmVhZChkZXYsIHBoeV9pZCwgTUlJX0JNQ1IpICYgfkJNQ1JfSVNPTEFURTsKKwkJbWRpb193cml0ZShkZXYsIHBoeV9pZCwgTUlJX0JNQ1IsIG1paV9jbWQpOworCQlpZiAobWlpX3N0YXR1cyAhPSAweGZmZmYgJiYgbWlpX3N0YXR1cyAhPSAweDAwMDApIHsKKwkJCXJwLT5taWlfaWYuYWR2ZXJ0aXNpbmcgPSBtZGlvX3JlYWQoZGV2LCBwaHlfaWQsIDQpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1JSSBQSFkgZm91bmQgYXQgYWRkcmVzcyAiCisJCQkgICAgICAgIiVkLCBzdGF0dXMgMHglNC40eCBhZHZlcnRpc2luZyAlNC40eCAiCisJCQkgICAgICAgIkxpbmsgJTQuNHguXG4iLCBkZXYtPm5hbWUsIHBoeV9pZCwKKwkJCSAgICAgICBtaWlfc3RhdHVzLCBycC0+bWlpX2lmLmFkdmVydGlzaW5nLAorCQkJICAgICAgIG1kaW9fcmVhZChkZXYsIHBoeV9pZCwgNSkpOworCisJCQkvKiBzZXQgSUZGX1JVTk5JTkcgKi8KKwkJCWlmIChtaWlfc3RhdHVzICYgQk1TUl9MU1RBVFVTKQorCQkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKwkJCWVsc2UKKwkJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJCX0KKwl9CisJcnAtPm1paV9pZi5waHlfaWQgPSBwaHlfaWQ7CisKKwlyZXR1cm4gMDsKKworZXJyX291dF91bm1hcDoKKwlwY2lfaW91bm1hcChwZGV2LCBpb2FkZHIpOworZXJyX291dF9mcmVlX3JlczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX291dF9mcmVlX25ldGRldjoKKwlmcmVlX25ldGRldihkZXYpOworZXJyX291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCAqcmluZzsKKwlkbWFfYWRkcl90IHJpbmdfZG1hOworCisJcmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHJwLT5wZGV2LAorCQkJCSAgICBSWF9SSU5HX1NJWkUgKiBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpICsKKwkJCQkgICAgVFhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSwKKwkJCQkgICAgJnJpbmdfZG1hKTsKKwlpZiAoIXJpbmcpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgYWxsb2NhdGUgRE1BIG1lbW9yeS5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKHJwLT5xdWlya3MgJiBycVJoaW5lSSkgeworCQlycC0+dHhfYnVmcyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHJwLT5wZGV2LAorCQkJCQkJICAgUEtUX0JVRl9TWiAqIFRYX1JJTkdfU0laRSwKKwkJCQkJCSAgICZycC0+dHhfYnVmc19kbWEpOworCQlpZiAocnAtPnR4X2J1ZnMgPT0gTlVMTCkgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChycC0+cGRldiwKKwkJCQkgICAgUlhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSArCisJCQkJICAgIFRYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYyksCisJCQkJICAgIHJpbmcsIHJpbmdfZG1hKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJcnAtPnJ4X3JpbmcgPSByaW5nOworCXJwLT50eF9yaW5nID0gcmluZyArIFJYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYyk7CisJcnAtPnJ4X3JpbmdfZG1hID0gcmluZ19kbWE7CisJcnAtPnR4X3JpbmdfZG1hID0gcmluZ19kbWEgKyBSWF9SSU5HX1NJWkUgKiBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHJwLT5wZGV2LAorCQkJICAgIFJYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYykgKworCQkJICAgIFRYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYyksCisJCQkgICAgcnAtPnJ4X3JpbmcsIHJwLT5yeF9yaW5nX2RtYSk7CisJcnAtPnR4X3JpbmcgPSBOVUxMOworCisJaWYgKHJwLT50eF9idWZzKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHJwLT5wZGV2LCBQS1RfQlVGX1NaICogVFhfUklOR19TSVpFLAorCQkJCSAgICBycC0+dHhfYnVmcywgcnAtPnR4X2J1ZnNfZG1hKTsKKworCXJwLT50eF9idWZzID0gTlVMTDsKKworfQorCitzdGF0aWMgdm9pZCBhbGxvY19yYnVmcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJZG1hX2FkZHJfdCBuZXh0OworCWludCBpOworCisJcnAtPmRpcnR5X3J4ID0gcnAtPmN1cl9yeCA9IDA7CisKKwlycC0+cnhfYnVmX3N6ID0gKGRldi0+bXR1IDw9IDE1MDAgPyBQS1RfQlVGX1NaIDogZGV2LT5tdHUgKyAzMik7CisJcnAtPnJ4X2hlYWRfZGVzYyA9ICZycC0+cnhfcmluZ1swXTsKKwluZXh0ID0gcnAtPnJ4X3JpbmdfZG1hOworCisJLyogSW5pdCB0aGUgcmluZyBlbnRyaWVzICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXJwLT5yeF9yaW5nW2ldLnJ4X3N0YXR1cyA9IDA7CisJCXJwLT5yeF9yaW5nW2ldLmRlc2NfbGVuZ3RoID0gY3B1X3RvX2xlMzIocnAtPnJ4X2J1Zl9zeik7CisJCW5leHQgKz0gc2l6ZW9mKHN0cnVjdCByeF9kZXNjKTsKKwkJcnAtPnJ4X3JpbmdbaV0ubmV4dF9kZXNjID0gY3B1X3RvX2xlMzIobmV4dCk7CisJCXJwLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCX0KKwkvKiBNYXJrIHRoZSBsYXN0IGVudHJ5IGFzIHdyYXBwaW5nIHRoZSByaW5nLiAqLworCXJwLT5yeF9yaW5nW2ktMV0ubmV4dF9kZXNjID0gY3B1X3RvX2xlMzIocnAtPnJ4X3JpbmdfZG1hKTsKKworCS8qIEZpbGwgaW4gdGhlIFJ4IGJ1ZmZlcnMuICBIYW5kbGUgYWxsb2NhdGlvbiBmYWlsdXJlIGdyYWNlZnVsbHkuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKHJwLT5yeF9idWZfc3opOworCQlycC0+cnhfc2tidWZmW2ldID0gc2tiOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlicmVhazsKKwkJc2tiLT5kZXYgPSBkZXY7ICAgICAgICAgICAgICAgICAvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisKKwkJcnAtPnJ4X3NrYnVmZl9kbWFbaV0gPQorCQkJcGNpX21hcF9zaW5nbGUocnAtPnBkZXYsIHNrYi0+dGFpbCwgcnAtPnJ4X2J1Zl9zeiwKKwkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQlycC0+cnhfcmluZ1tpXS5hZGRyID0gY3B1X3RvX2xlMzIocnAtPnJ4X3NrYnVmZl9kbWFbaV0pOworCQlycC0+cnhfcmluZ1tpXS5yeF9zdGF0dXMgPSBjcHVfdG9fbGUzMihEZXNjT3duKTsKKwl9CisJcnAtPmRpcnR5X3J4ID0gKHVuc2lnbmVkIGludCkoaSAtIFJYX1JJTkdfU0laRSk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcmJ1ZnMoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJLyogRnJlZSBhbGwgdGhlIHNrYnVmZnMgaW4gdGhlIFJ4IHF1ZXVlLiAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlycC0+cnhfcmluZ1tpXS5yeF9zdGF0dXMgPSAwOworCQlycC0+cnhfcmluZ1tpXS5hZGRyID0gY3B1X3RvX2xlMzIoMHhCQURGMDBEMCk7IC8qIEFuIGludmFsaWQgYWRkcmVzcy4gKi8KKwkJaWYgKHJwLT5yeF9za2J1ZmZbaV0pIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUocnAtPnBkZXYsCisJCQkJCSBycC0+cnhfc2tidWZmX2RtYVtpXSwKKwkJCQkJIHJwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKHJwLT5yeF9za2J1ZmZbaV0pOworCQl9CisJCXJwLT5yeF9za2J1ZmZbaV0gPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgYWxsb2NfdGJ1ZnMoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWRtYV9hZGRyX3QgbmV4dDsKKwlpbnQgaTsKKworCXJwLT5kaXJ0eV90eCA9IHJwLT5jdXJfdHggPSAwOworCW5leHQgPSBycC0+dHhfcmluZ19kbWE7CisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCXJwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCQlycC0+dHhfcmluZ1tpXS50eF9zdGF0dXMgPSAwOworCQlycC0+dHhfcmluZ1tpXS5kZXNjX2xlbmd0aCA9IGNwdV90b19sZTMyKFRYREVTQyk7CisJCW5leHQgKz0gc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKTsKKwkJcnAtPnR4X3JpbmdbaV0ubmV4dF9kZXNjID0gY3B1X3RvX2xlMzIobmV4dCk7CisJCXJwLT50eF9idWZbaV0gPSAmcnAtPnR4X2J1ZnNbaSAqIFBLVF9CVUZfU1pdOworCX0KKwlycC0+dHhfcmluZ1tpLTFdLm5leHRfZGVzYyA9IGNwdV90b19sZTMyKHJwLT50eF9yaW5nX2RtYSk7CisKK30KKworc3RhdGljIHZvaWQgZnJlZV90YnVmcyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJcnAtPnR4X3JpbmdbaV0udHhfc3RhdHVzID0gMDsKKwkJcnAtPnR4X3JpbmdbaV0uZGVzY19sZW5ndGggPSBjcHVfdG9fbGUzMihUWERFU0MpOworCQlycC0+dHhfcmluZ1tpXS5hZGRyID0gY3B1X3RvX2xlMzIoMHhCQURGMDBEMCk7IC8qIEFuIGludmFsaWQgYWRkcmVzcy4gKi8KKwkJaWYgKHJwLT50eF9za2J1ZmZbaV0pIHsKKwkJCWlmIChycC0+dHhfc2tidWZmX2RtYVtpXSkgeworCQkJCXBjaV91bm1hcF9zaW5nbGUocnAtPnBkZXYsCisJCQkJCQkgcnAtPnR4X3NrYnVmZl9kbWFbaV0sCisJCQkJCQkgcnAtPnR4X3NrYnVmZltpXS0+bGVuLAorCQkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJfQorCQkJZGV2X2tmcmVlX3NrYihycC0+dHhfc2tidWZmW2ldKTsKKwkJfQorCQlycC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJcnAtPnR4X2J1ZltpXSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCByaGluZV9jaGVja19tZWRpYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaW5pdF9tZWRpYSkKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CisKKwltaWlfY2hlY2tfbWVkaWEoJnJwLT5taWlfaWYsIGRlYnVnLCBpbml0X21lZGlhKTsKKworCWlmIChycC0+bWlpX2lmLmZ1bGxfZHVwbGV4KQorCSAgICBpb3dyaXRlOChpb3JlYWQ4KGlvYWRkciArIENoaXBDbWQxKSB8IENtZDFGRHVwbGV4LAorCQkgICBpb2FkZHIgKyBDaGlwQ21kMSk7CisJZWxzZQorCSAgICBpb3dyaXRlOChpb3JlYWQ4KGlvYWRkciArIENoaXBDbWQxKSAmIH5DbWQxRkR1cGxleCwKKwkJICAgaW9hZGRyICsgQ2hpcENtZDEpOworfQorCitzdGF0aWMgdm9pZCBpbml0X3JlZ2lzdGVycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBycC0+YmFzZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWlvd3JpdGU4KGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIFN0YXRpb25BZGRyICsgaSk7CisKKwkvKiBJbml0aWFsaXplIG90aGVyIHJlZ2lzdGVycy4gKi8KKwlpb3dyaXRlMTYoMHgwMDA2LCBpb2FkZHIgKyBQQ0lCdXNDb25maWcpOwkvKiBUdW5lIGNvbmZpZ3VyYXRpb24/Pz8gKi8KKwkvKiBDb25maWd1cmUgaW5pdGlhbCBGSUZPIHRocmVzaG9sZHMuICovCisJaW93cml0ZTgoMHgyMCwgaW9hZGRyICsgVHhDb25maWcpOworCXJwLT50eF90aHJlc2ggPSAweDIwOworCXJwLT5yeF90aHJlc2ggPSAweDYwOwkJLyogV3JpdHRlbiBpbiByaGluZV9zZXRfcnhfbW9kZSgpLiAqLworCisJaW93cml0ZTMyKHJwLT5yeF9yaW5nX2RtYSwgaW9hZGRyICsgUnhSaW5nUHRyKTsKKwlpb3dyaXRlMzIocnAtPnR4X3JpbmdfZG1hLCBpb2FkZHIgKyBUeFJpbmdQdHIpOworCisJcmhpbmVfc2V0X3J4X21vZGUoZGV2KTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCWlvd3JpdGUxNihJbnRyUnhEb25lIHwgSW50clJ4RXJyIHwgSW50clJ4RW1wdHl8IEludHJSeE92ZXJmbG93IHwKKwkgICAgICAgSW50clJ4RHJvcHBlZCB8IEludHJSeE5vQnVmIHwgSW50clR4QWJvcnRlZCB8CisJICAgICAgIEludHJUeERvbmUgfCBJbnRyVHhFcnJvciB8IEludHJUeFVuZGVycnVuIHwKKwkgICAgICAgSW50clBDSUVyciB8IEludHJTdGF0c01heCB8IEludHJMaW5rQ2hhbmdlLAorCSAgICAgICBpb2FkZHIgKyBJbnRyRW5hYmxlKTsKKworCWlvd3JpdGUxNihDbWRTdGFydCB8IENtZFR4T24gfCBDbWRSeE9uIHwgKENtZDFOb1R4UG9sbCA8PCA4KSwKKwkgICAgICAgaW9hZGRyICsgQ2hpcENtZCk7CisJcmhpbmVfY2hlY2tfbWVkaWEoZGV2LCAxKTsKK30KKworLyogRW5hYmxlIE1JSSBsaW5rIHN0YXR1cyBhdXRvLXBvbGxpbmcgKHJlcXVpcmVkIGZvciBJbnRyTGlua0NoYW5nZSkgKi8KK3N0YXRpYyB2b2lkIHJoaW5lX2VuYWJsZV9saW5rbW9uKHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCWlvd3JpdGU4KDAsIGlvYWRkciArIE1JSUNtZCk7CisJaW93cml0ZTgoTUlJX0JNU1IsIGlvYWRkciArIE1JSVJlZ0FkZHIpOworCWlvd3JpdGU4KDB4ODAsIGlvYWRkciArIE1JSUNtZCk7CisKKwlSSElORV9XQUlUX0ZPUigoaW9yZWFkOChpb2FkZHIgKyBNSUlSZWdBZGRyKSAmIDB4MjApKTsKKworCWlvd3JpdGU4KE1JSV9CTVNSIHwgMHg0MCwgaW9hZGRyICsgTUlJUmVnQWRkcik7Cit9CisKKy8qIERpc2FibGUgTUlJIGxpbmsgc3RhdHVzIGF1dG8tcG9sbGluZyAocmVxdWlyZWQgZm9yIE1ESU8gYWNjZXNzKSAqLworc3RhdGljIHZvaWQgcmhpbmVfZGlzYWJsZV9saW5rbW9uKHZvaWQgX19pb21lbSAqaW9hZGRyLCB1MzIgcXVpcmtzKQoreworCWlvd3JpdGU4KDAsIGlvYWRkciArIE1JSUNtZCk7CisKKwlpZiAocXVpcmtzICYgcnFSaGluZUkpIHsKKwkJaW93cml0ZTgoMHgwMSwgaW9hZGRyICsgTUlJUmVnQWRkcik7CS8vIE1JSV9CTVNSCisKKwkJLyogQ2FuIGJlIGNhbGxlZCBmcm9tIElTUi4gRXZpbC4gKi8KKwkJbWRlbGF5KDEpOworCisJCS8qIDB4ODAgbXVzdCBiZSBzZXQgaW1tZWRpYXRlbHkgYmVmb3JlIHR1cm5pbmcgaXQgb2ZmICovCisJCWlvd3JpdGU4KDB4ODAsIGlvYWRkciArIE1JSUNtZCk7CisKKwkJUkhJTkVfV0FJVF9GT1IoaW9yZWFkOChpb2FkZHIgKyBNSUlSZWdBZGRyKSAmIDB4MjApOworCisJCS8qIEhlaC4gTm93IGNsZWFyIDB4ODAgYWdhaW4uICovCisJCWlvd3JpdGU4KDAsIGlvYWRkciArIE1JSUNtZCk7CisJfQorCWVsc2UKKwkJUkhJTkVfV0FJVF9GT1IoaW9yZWFkOChpb2FkZHIgKyBNSUlSZWdBZGRyKSAmIDB4ODApOworfQorCisvKiBSZWFkIGFuZCB3cml0ZSBvdmVyIHRoZSBNSUkgTWFuYWdlbWVudCBEYXRhIEkvTyAoTURJTykgaW50ZXJmYWNlLiAqLworCitzdGF0aWMgaW50IG1kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcGh5X2lkLCBpbnQgcmVnbnVtKQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBycC0+YmFzZTsKKwlpbnQgcmVzdWx0OworCisJcmhpbmVfZGlzYWJsZV9saW5rbW9uKGlvYWRkciwgcnAtPnF1aXJrcyk7CisKKwkvKiByaGluZV9kaXNhYmxlX2xpbmttb24gYWxyZWFkeSBjbGVhcmVkIE1JSUNtZCAqLworCWlvd3JpdGU4KHBoeV9pZCwgaW9hZGRyICsgTUlJUGh5QWRkcik7CisJaW93cml0ZTgocmVnbnVtLCBpb2FkZHIgKyBNSUlSZWdBZGRyKTsKKwlpb3dyaXRlOCgweDQwLCBpb2FkZHIgKyBNSUlDbWQpOwkJLyogVHJpZ2dlciByZWFkICovCisJUkhJTkVfV0FJVF9GT1IoIShpb3JlYWQ4KGlvYWRkciArIE1JSUNtZCkgJiAweDQwKSk7CisJcmVzdWx0ID0gaW9yZWFkMTYoaW9hZGRyICsgTUlJRGF0YSk7CisKKwlyaGluZV9lbmFibGVfbGlua21vbihpb2FkZHIpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIG1kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IHJlZ251bSwgaW50IHZhbHVlKQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBycC0+YmFzZTsKKworCXJoaW5lX2Rpc2FibGVfbGlua21vbihpb2FkZHIsIHJwLT5xdWlya3MpOworCisJLyogcmhpbmVfZGlzYWJsZV9saW5rbW9uIGFscmVhZHkgY2xlYXJlZCBNSUlDbWQgKi8KKwlpb3dyaXRlOChwaHlfaWQsIGlvYWRkciArIE1JSVBoeUFkZHIpOworCWlvd3JpdGU4KHJlZ251bSwgaW9hZGRyICsgTUlJUmVnQWRkcik7CisJaW93cml0ZTE2KHZhbHVlLCBpb2FkZHIgKyBNSUlEYXRhKTsKKwlpb3dyaXRlOCgweDIwLCBpb2FkZHIgKyBNSUlDbWQpOwkJLyogVHJpZ2dlciB3cml0ZSAqLworCVJISU5FX1dBSVRfRk9SKCEoaW9yZWFkOChpb2FkZHIgKyBNSUlDbWQpICYgMHgyMCkpOworCisJcmhpbmVfZW5hYmxlX2xpbmttb24oaW9hZGRyKTsKK30KKworc3RhdGljIGludCByaGluZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHJwLT5iYXNlOworCWludCByYzsKKworCXJjID0gcmVxdWVzdF9pcnEocnAtPnBkZXYtPmlycSwgJnJoaW5lX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwKKwkJCWRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJoaW5lX29wZW4oKSBpcnEgJWQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBycC0+cGRldi0+aXJxKTsKKworCXJjID0gYWxsb2NfcmluZyhkZXYpOworCWlmIChyYykgeworCQlmcmVlX2lycShycC0+cGRldi0+aXJxLCBkZXYpOworCQlyZXR1cm4gcmM7CisJfQorCWFsbG9jX3JidWZzKGRldik7CisJYWxsb2NfdGJ1ZnMoZGV2KTsKKwlyaGluZV9jaGlwX3Jlc2V0KGRldik7CisJaW5pdF9yZWdpc3RlcnMoZGV2KTsKKwlpZiAoZGVidWcgPiAyKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERvbmUgcmhpbmVfb3BlbigpLCBzdGF0dXMgJTQuNHggIgorCQkgICAgICAgIk1JSSBzdGF0dXM6ICU0LjR4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgaW9yZWFkMTYoaW9hZGRyICsgQ2hpcENtZCksCisJCSAgICAgICBtZGlvX3JlYWQoZGV2LCBycC0+bWlpX2lmLnBoeV9pZCwgTUlJX0JNU1IpKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmhpbmVfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBycC0+YmFzZTsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQsIHN0YXR1cyAlNC40eCwgUEhZIHN0YXR1cyAiCisJICAgICAgICIlNC40eCwgcmVzZXR0aW5nLi4uXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGlvcmVhZDE2KGlvYWRkciArIEludHJTdGF0dXMpLAorCSAgICAgICBtZGlvX3JlYWQoZGV2LCBycC0+bWlpX2lmLnBoeV9pZCwgTUlJX0JNU1IpKTsKKworCS8qIHByb3RlY3QgYWdhaW5zdCBjb25jdXJyZW50IHJ4IGludGVycnVwdHMgKi8KKwlkaXNhYmxlX2lycShycC0+cGRldi0+aXJxKTsKKworCXNwaW5fbG9jaygmcnAtPmxvY2spOworCisJLyogY2xlYXIgYWxsIGRlc2NyaXB0b3JzICovCisJZnJlZV90YnVmcyhkZXYpOworCWZyZWVfcmJ1ZnMoZGV2KTsKKwlhbGxvY190YnVmcyhkZXYpOworCWFsbG9jX3JidWZzKGRldik7CisKKwkvKiBSZWluaXRpYWxpemUgdGhlIGhhcmR3YXJlLiAqLworCXJoaW5lX2NoaXBfcmVzZXQoZGV2KTsKKwlpbml0X3JlZ2lzdGVycyhkZXYpOworCisJc3Bpbl91bmxvY2soJnJwLT5sb2NrKTsKKwllbmFibGVfaXJxKHJwLT5wZGV2LT5pcnEpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcnAtPnN0YXRzLnR4X2Vycm9ycysrOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCByaGluZV9zdGFydF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBycC0+YmFzZTsKKwl1bnNpZ25lZCBlbnRyeTsKKworCS8qIENhdXRpb246IHRoZSB3cml0ZSBvcmRlciBpcyBpbXBvcnRhbnQgaGVyZSwgc2V0IHRoZSBmaWVsZAorCSAgIHdpdGggdGhlICJvd25lcnNoaXAiIGJpdHMgbGFzdC4gKi8KKworCS8qIENhbGN1bGF0ZSB0aGUgbmV4dCBUeCBkZXNjcmlwdG9yIGVudHJ5LiAqLworCWVudHJ5ID0gcnAtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKKworCWlmIChza2ItPmxlbiA8IEVUSF9aTEVOKSB7CisJCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJfQorCisJcnAtPnR4X3NrYnVmZltlbnRyeV0gPSBza2I7CisKKwlpZiAoKHJwLT5xdWlya3MgJiBycVJoaW5lSSkgJiYKKwkgICAgKCgodW5zaWduZWQgbG9uZylza2ItPmRhdGEgJiAzKSB8fCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICE9IDAgfHwgc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpKSB7CisJCS8qIE11c3QgdXNlIGFsaWdubWVudCBidWZmZXIuICovCisJCWlmIChza2ItPmxlbiA+IFBLVF9CVUZfU1opIHsKKwkJCS8qIHBhY2tldCB0b28gbG9uZywgZHJvcCBpdCAqLworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJcnAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQkJcnAtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJCXJldHVybiAwOworCQl9CisJCXNrYl9jb3B5X2FuZF9jc3VtX2Rldihza2IsIHJwLT50eF9idWZbZW50cnldKTsKKwkJcnAtPnR4X3NrYnVmZl9kbWFbZW50cnldID0gMDsKKwkJcnAtPnR4X3JpbmdbZW50cnldLmFkZHIgPSBjcHVfdG9fbGUzMihycC0+dHhfYnVmc19kbWEgKworCQkJCQkJICAgICAgKHJwLT50eF9idWZbZW50cnldIC0KKwkJCQkJCSAgICAgICBycC0+dHhfYnVmcykpOworCX0gZWxzZSB7CisJCXJwLT50eF9za2J1ZmZfZG1hW2VudHJ5XSA9CisJCQlwY2lfbWFwX3NpbmdsZShycC0+cGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwKKwkJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisJCXJwLT50eF9yaW5nW2VudHJ5XS5hZGRyID0gY3B1X3RvX2xlMzIocnAtPnR4X3NrYnVmZl9kbWFbZW50cnldKTsKKwl9CisKKwlycC0+dHhfcmluZ1tlbnRyeV0uZGVzY19sZW5ndGggPQorCQljcHVfdG9fbGUzMihUWERFU0MgfCAoc2tiLT5sZW4gPj0gRVRIX1pMRU4gPyBza2ItPmxlbiA6IEVUSF9aTEVOKSk7CisKKwkvKiBsb2NrIGV0aCBpcnEgKi8KKwlzcGluX2xvY2tfaXJxKCZycC0+bG9jayk7CisJd21iKCk7CisJcnAtPnR4X3JpbmdbZW50cnldLnR4X3N0YXR1cyA9IGNwdV90b19sZTMyKERlc2NPd24pOworCXdtYigpOworCisJcnAtPmN1cl90eCsrOworCisJLyogTm9uLXg4NiBUb2RvOiBleHBsaWNpdGx5IGZsdXNoIGNhY2hlIGxpbmVzIGhlcmUuICovCisKKwkvKiBXYWtlIHRoZSBwb3RlbnRpYWxseS1pZGxlIHRyYW5zbWl0IGNoYW5uZWwgKi8KKwlpb3dyaXRlOChpb3JlYWQ4KGlvYWRkciArIENoaXBDbWQxKSB8IENtZDFUeERlbWFuZCwKKwkgICAgICAgaW9hZGRyICsgQ2hpcENtZDEpOworCUlPU1lOQzsKKworCWlmIChycC0+Y3VyX3R4ID09IHJwLT5kaXJ0eV90eCArIFRYX1FVRVVFX0xFTikKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlzcGluX3VubG9ja19pcnEoJnJwLT5sb2NrKTsKKworCWlmIChkZWJ1ZyA+IDQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdCBmcmFtZSAjJWQgcXVldWVkIGluIHNsb3QgJWQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBycC0+Y3VyX3R4LTEsIGVudHJ5KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBkb2VzIGFsbCBvZiB0aGUgUnggdGhyZWFkIHdvcmsgYW5kIGNsZWFucyB1cAorICAgYWZ0ZXIgdGhlIFR4IHRocmVhZC4gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCByaGluZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaW5zdGFuY2U7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHJwLT5iYXNlOworCXUzMiBpbnRyX3N0YXR1czsKKwlpbnQgYm9ndXNjbnQgPSBtYXhfaW50ZXJydXB0X3dvcms7CisJaW50IGhhbmRsZWQgPSAwOworCisJd2hpbGUgKChpbnRyX3N0YXR1cyA9IGdldF9pbnRyX3N0YXR1cyhkZXYpKSkgeworCQloYW5kbGVkID0gMTsKKworCQkvKiBBY2tub3dsZWRnZSBhbGwgb2YgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHNvdXJjZXMgQVNBUC4gKi8KKwkJaWYgKGludHJfc3RhdHVzICYgSW50clR4RGVzY1JhY2UpCisJCQlpb3dyaXRlOCgweDA4LCBpb2FkZHIgKyBJbnRyU3RhdHVzMik7CisJCWlvd3JpdGUxNihpbnRyX3N0YXR1cyAmIDB4ZmZmZiwgaW9hZGRyICsgSW50clN0YXR1cyk7CisJCUlPU1lOQzsKKworCQlpZiAoZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJbnRlcnJ1cHQsIHN0YXR1cyAlOC44eC5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7CisKKwkJaWYgKGludHJfc3RhdHVzICYgKEludHJSeERvbmUgfCBJbnRyUnhFcnIgfCBJbnRyUnhEcm9wcGVkIHwKKwkJICAgIEludHJSeFdha2VVcCB8IEludHJSeEVtcHR5IHwgSW50clJ4Tm9CdWYpKQorCQkJcmhpbmVfcngoZGV2KTsKKworCQlpZiAoaW50cl9zdGF0dXMgJiAoSW50clR4RXJyU3VtbWFyeSB8IEludHJUeERvbmUpKSB7CisJCQlpZiAoaW50cl9zdGF0dXMgJiBJbnRyVHhFcnJTdW1tYXJ5KSB7CisJCQkJLyogQXZvaWQgc2NhdmVuZ2luZyBiZWZvcmUgVHggZW5naW5lIHR1cm5lZCBvZmYgKi8KKwkJCQlSSElORV9XQUlUX0ZPUighKGlvcmVhZDgoaW9hZGRyK0NoaXBDbWQpICYgQ21kVHhPbikpOworCQkJCWlmIChkZWJ1ZyA+IDIgJiYKKwkJCQkgICAgaW9yZWFkOChpb2FkZHIrQ2hpcENtZCkgJiBDbWRUeE9uKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogIgorCQkJCQkgICAgICAgInJoaW5lX2ludGVycnVwdCgpIFR4IGVuZ2luZSIKKwkJCQkJICAgICAgICJzdGlsbCBvbi5cbiIsIGRldi0+bmFtZSk7CisJCQl9CisJCQlyaGluZV90eChkZXYpOworCQl9CisKKwkJLyogQWJub3JtYWwgZXJyb3Igc3VtbWFyeS91bmNvbW1vbiBldmVudHMgaGFuZGxlcnMuICovCisJCWlmIChpbnRyX3N0YXR1cyAmIChJbnRyUENJRXJyIHwgSW50ckxpbmtDaGFuZ2UgfAorCQkJCSAgIEludHJTdGF0c01heCB8IEludHJUeEVycm9yIHwgSW50clR4QWJvcnRlZCB8CisJCQkJICAgSW50clR4VW5kZXJydW4gfCBJbnRyVHhEZXNjUmFjZSkpCisJCQlyaGluZV9lcnJvcihkZXYsIGludHJfc3RhdHVzKTsKKworCQlpZiAoLS1ib2d1c2NudCA8IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUb28gbXVjaCB3b3JrIGF0IGludGVycnVwdCwgIgorCQkJICAgICAgICJzdGF0dXM9JSM4Ljh4LlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGludHJfc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGRlYnVnID4gMykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleGl0aW5nIGludGVycnVwdCwgc3RhdHVzPSU4Ljh4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgaW9yZWFkMTYoaW9hZGRyICsgSW50clN0YXR1cykpOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKiBUaGlzIHJvdXRpbmUgaXMgbG9naWNhbGx5IHBhcnQgb2YgdGhlIGludGVycnVwdCBoYW5kbGVyLCBidXQgaXNvbGF0ZWQKKyAgIGZvciBjbGFyaXR5LiAqLworc3RhdGljIHZvaWQgcmhpbmVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCB0eHN0YXR1cyA9IDAsIGVudHJ5ID0gcnAtPmRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworCisJc3Bpbl9sb2NrKCZycC0+bG9jayk7CisKKwkvKiBmaW5kIGFuZCBjbGVhbnVwIGRpcnR5IHR4IGRlc2NyaXB0b3JzICovCisJd2hpbGUgKHJwLT5kaXJ0eV90eCAhPSBycC0+Y3VyX3R4KSB7CisJCXR4c3RhdHVzID0gbGUzMl90b19jcHUocnAtPnR4X3JpbmdbZW50cnldLnR4X3N0YXR1cyk7CisJCWlmIChkZWJ1ZyA+IDYpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiIFR4IHNjYXZlbmdlICVkIHN0YXR1cyAlOC44eC5cbiIsCisJCQkgICAgICAgZW50cnksIHR4c3RhdHVzKTsKKwkJaWYgKHR4c3RhdHVzICYgRGVzY093bikKKwkJCWJyZWFrOworCQlpZiAodHhzdGF0dXMgJiAweDgwMDApIHsKKwkJCWlmIChkZWJ1ZyA+IDEpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdCBlcnJvciwgIgorCQkJCSAgICAgICAiVHggc3RhdHVzICU4Ljh4LlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCB0eHN0YXR1cyk7CisJCQlycC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQlpZiAodHhzdGF0dXMgJiAweDA0MDApIHJwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJaWYgKHR4c3RhdHVzICYgMHgwMjAwKSBycC0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQkJaWYgKHR4c3RhdHVzICYgMHgwMTAwKSBycC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCWlmICh0eHN0YXR1cyAmIDB4MDA4MCkgcnAtPnN0YXRzLnR4X2hlYXJ0YmVhdF9lcnJvcnMrKzsKKwkJCWlmICgoKHJwLT5xdWlya3MgJiBycVJoaW5lSSkgJiYgdHhzdGF0dXMgJiAweDAwMDIpIHx8CisJCQkgICAgKHR4c3RhdHVzICYgMHgwODAwKSB8fCAodHhzdGF0dXMgJiAweDEwMDApKSB7CisJCQkJcnAtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQkJcnAtPnR4X3JpbmdbZW50cnldLnR4X3N0YXR1cyA9IGNwdV90b19sZTMyKERlc2NPd24pOworCQkJCWJyZWFrOyAvKiBLZWVwIHRoZSBza2IgLSB3ZSB0cnkgYWdhaW4gKi8KKwkJCX0KKwkJCS8qIFRyYW5zbWl0dGVyIHJlc3RhcnRlZCBpbiAnYWJub3JtYWwnIGhhbmRsZXIuICovCisJCX0gZWxzZSB7CisJCQlpZiAocnAtPnF1aXJrcyAmIHJxUmhpbmVJKQorCQkJCXJwLT5zdGF0cy5jb2xsaXNpb25zICs9ICh0eHN0YXR1cyA+PiAzKSAmIDB4MEY7CisJCQllbHNlCisJCQkJcnAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gdHhzdGF0dXMgJiAweDBGOworCQkJaWYgKGRlYnVnID4gNikKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiY29sbGlzaW9uczogJTEuMXg6JTEuMXhcbiIsCisJCQkJICAgICAgICh0eHN0YXR1cyA+PiAzKSAmIDB4RiwKKwkJCQkgICAgICAgdHhzdGF0dXMgJiAweEYpOworCQkJcnAtPnN0YXRzLnR4X2J5dGVzICs9IHJwLT50eF9za2J1ZmZbZW50cnldLT5sZW47CisJCQlycC0+c3RhdHMudHhfcGFja2V0cysrOworCQl9CisJCS8qIEZyZWUgdGhlIG9yaWdpbmFsIHNrYi4gKi8KKwkJaWYgKHJwLT50eF9za2J1ZmZfZG1hW2VudHJ5XSkgeworCQkJcGNpX3VubWFwX3NpbmdsZShycC0+cGRldiwKKwkJCQkJIHJwLT50eF9za2J1ZmZfZG1hW2VudHJ5XSwKKwkJCQkJIHJwLT50eF9za2J1ZmZbZW50cnldLT5sZW4sCisJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJfQorCQlkZXZfa2ZyZWVfc2tiX2lycShycC0+dHhfc2tidWZmW2VudHJ5XSk7CisJCXJwLT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJZW50cnkgPSAoKytycC0+ZGlydHlfdHgpICUgVFhfUklOR19TSVpFOworCX0KKwlpZiAoKHJwLT5jdXJfdHggLSBycC0+ZGlydHlfdHgpIDwgVFhfUVVFVUVfTEVOIC0gNCkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJc3Bpbl91bmxvY2soJnJwLT5sb2NrKTsKK30KKworLyogVGhpcyByb3V0aW5lIGlzIGxvZ2ljYWxseSBwYXJ0IG9mIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgYnV0IGlzb2xhdGVkCisgICBmb3IgY2xhcml0eSBhbmQgYmV0dGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24uICovCitzdGF0aWMgdm9pZCByaGluZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVudHJ5ID0gcnAtPmN1cl9yeCAlIFJYX1JJTkdfU0laRTsKKwlpbnQgYm9ndXNjbnQgPSBycC0+ZGlydHlfcnggKyBSWF9SSU5HX1NJWkUgLSBycC0+Y3VyX3J4OworCisJaWYgKGRlYnVnID4gNCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJoaW5lX3J4KCksIGVudHJ5ICVkIHN0YXR1cyAlOC44eC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVudHJ5LAorCQkgICAgICAgbGUzMl90b19jcHUocnAtPnJ4X2hlYWRfZGVzYy0+cnhfc3RhdHVzKSk7CisJfQorCisJLyogSWYgRU9QIGlzIHNldCBvbiB0aGUgbmV4dCBlbnRyeSwgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCisJd2hpbGUgKCEocnAtPnJ4X2hlYWRfZGVzYy0+cnhfc3RhdHVzICYgY3B1X3RvX2xlMzIoRGVzY093bikpKSB7CisJCXN0cnVjdCByeF9kZXNjICpkZXNjID0gcnAtPnJ4X2hlYWRfZGVzYzsKKwkJdTMyIGRlc2Nfc3RhdHVzID0gbGUzMl90b19jcHUoZGVzYy0+cnhfc3RhdHVzKTsKKwkJaW50IGRhdGFfc2l6ZSA9IGRlc2Nfc3RhdHVzID4+IDE2OworCisJCWlmIChkZWJ1ZyA+IDQpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiIHJoaW5lX3J4KCkgc3RhdHVzIGlzICU4Ljh4LlxuIiwKKwkJCSAgICAgICBkZXNjX3N0YXR1cyk7CisJCWlmICgtLWJvZ3VzY250IDwgMCkKKwkJCWJyZWFrOworCQlpZiAoKGRlc2Nfc3RhdHVzICYgKFJ4V2hvbGVQa3QgfCBSeEVycikpICE9IFJ4V2hvbGVQa3QpIHsKKwkJCWlmICgoZGVzY19zdGF0dXMgJiBSeFdob2xlUGt0KSAhPSBSeFdob2xlUGt0KSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE92ZXJzaXplZCBFdGhlcm5ldCAiCisJCQkJICAgICAgICJmcmFtZSBzcGFubmVkIG11bHRpcGxlIGJ1ZmZlcnMsIGVudHJ5ICIKKwkJCQkgICAgICAgIiUjeCBsZW5ndGggJWQgc3RhdHVzICU4Ljh4IVxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBlbnRyeSwgZGF0YV9zaXplLAorCQkJCSAgICAgICBkZXNjX3N0YXR1cyk7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE92ZXJzaXplZCBFdGhlcm5ldCAiCisJCQkJICAgICAgICJmcmFtZSAlcCB2cyAlcC5cbiIsIGRldi0+bmFtZSwKKwkJCQkgICAgICAgcnAtPnJ4X2hlYWRfZGVzYywgJnJwLT5yeF9yaW5nW2VudHJ5XSk7CisJCQkJcnAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCX0gZWxzZSBpZiAoZGVzY19zdGF0dXMgJiBSeEVycikgeworCQkJCS8qIFRoZXJlIHdhcyBhIGVycm9yLiAqLworCQkJCWlmIChkZWJ1ZyA+IDIpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIgcmhpbmVfcngoKSBSeCAiCisJCQkJCSAgICAgICAiZXJyb3Igd2FzICU4Ljh4LlxuIiwKKwkJCQkJICAgICAgIGRlc2Nfc3RhdHVzKTsKKwkJCQlycC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJaWYgKGRlc2Nfc3RhdHVzICYgMHgwMDMwKSBycC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCWlmIChkZXNjX3N0YXR1cyAmIDB4MDA0OCkgcnAtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCQkJaWYgKGRlc2Nfc3RhdHVzICYgMHgwMDA0KSBycC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkJaWYgKGRlc2Nfc3RhdHVzICYgMHgwMDAyKSB7CisJCQkJCS8qIHRoaXMgY2FuIGFsc28gYmUgdXBkYXRlZCBvdXRzaWRlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLworCQkJCQlzcGluX2xvY2soJnJwLT5sb2NrKTsKKwkJCQkJcnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQkJc3Bpbl91bmxvY2soJnJwLT5sb2NrKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJLyogTGVuZ3RoIHNob3VsZCBvbWl0IHRoZSBDUkMgKi8KKwkJCWludCBwa3RfbGVuID0gZGF0YV9zaXplIC0gNDsKKworCQkJLyogQ2hlY2sgaWYgdGhlIHBhY2tldCBpcyBsb25nIGVub3VnaCB0byBhY2NlcHQgd2l0aG91dAorCQkJICAgY29weWluZyB0byBhIG1pbmltYWxseS1zaXplZCBza2J1ZmYuICovCisJCQlpZiAocGt0X2xlbiA8IHJ4X2NvcHlicmVhayAmJgorCQkJCShza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyAyKSkgIT0gTlVMTCkgeworCQkJCXNrYi0+ZGV2ID0gZGV2OworCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlciAqLworCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShycC0+cGRldiwKKwkJCQkJCQkgICAgcnAtPnJ4X3NrYnVmZl9kbWFbZW50cnldLAorCQkJCQkJCSAgICBycC0+cnhfYnVmX3N6LAorCQkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsCisJCQkJCQkgcnAtPnJ4X3NrYnVmZltlbnRyeV0tPnRhaWwsCisJCQkJCQkgcGt0X2xlbiwgMCk7CisJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShycC0+cGRldiwKKwkJCQkJCQkgICAgICAgcnAtPnJ4X3NrYnVmZl9kbWFbZW50cnldLAorCQkJCQkJCSAgICAgICBycC0+cnhfYnVmX3N6LAorCQkJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJfSBlbHNlIHsKKwkJCQlza2IgPSBycC0+cnhfc2tidWZmW2VudHJ5XTsKKwkJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSW5jb25zaXN0ZW50IFJ4ICIKKwkJCQkJICAgICAgICJkZXNjcmlwdG9yIGNoYWluLlxuIiwKKwkJCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlycC0+cnhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJCXBjaV91bm1hcF9zaW5nbGUocnAtPnBkZXYsCisJCQkJCQkgcnAtPnJ4X3NrYnVmZl9kbWFbZW50cnldLAorCQkJCQkJIHJwLT5yeF9idWZfc3osCisJCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCX0KKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCXJwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOworCQkJcnAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJfQorCQllbnRyeSA9ICgrK3JwLT5jdXJfcngpICUgUlhfUklOR19TSVpFOworCQlycC0+cnhfaGVhZF9kZXNjID0gJnJwLT5yeF9yaW5nW2VudHJ5XTsKKwl9CisKKwkvKiBSZWZpbGwgdGhlIFJ4IHJpbmcgYnVmZmVycy4gKi8KKwlmb3IgKDsgcnAtPmN1cl9yeCAtIHJwLT5kaXJ0eV9yeCA+IDA7IHJwLT5kaXJ0eV9yeCsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWVudHJ5ID0gcnAtPmRpcnR5X3J4ICUgUlhfUklOR19TSVpFOworCQlpZiAocnAtPnJ4X3NrYnVmZltlbnRyeV0gPT0gTlVMTCkgeworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihycC0+cnhfYnVmX3N6KTsKKwkJCXJwLT5yeF9za2J1ZmZbZW50cnldID0gc2tiOworCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJCWJyZWFrOwkvKiBCZXR0ZXIgbHVjayBuZXh0IHJvdW5kLiAqLworCQkJc2tiLT5kZXYgPSBkZXY7CS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKwkJCXJwLT5yeF9za2J1ZmZfZG1hW2VudHJ5XSA9CisJCQkJcGNpX21hcF9zaW5nbGUocnAtPnBkZXYsIHNrYi0+dGFpbCwKKwkJCQkJICAgICAgIHJwLT5yeF9idWZfc3osCisJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJcnAtPnJ4X3JpbmdbZW50cnldLmFkZHIgPSBjcHVfdG9fbGUzMihycC0+cnhfc2tidWZmX2RtYVtlbnRyeV0pOworCQl9CisJCXJwLT5yeF9yaW5nW2VudHJ5XS5yeF9zdGF0dXMgPSBjcHVfdG9fbGUzMihEZXNjT3duKTsKKwl9Cit9CisKKy8qCisgKiBDbGVhcnMgdGhlICJ0YWxseSBjb3VudGVycyIgZm9yIENSQyBlcnJvcnMgYW5kIG1pc3NlZCBmcmFtZXMoPykuCisgKiBJdCBoYXMgYmVlbiByZXBvcnRlZCB0aGF0IHNvbWUgY2hpcHMgbmVlZCBhIHdyaXRlIG9mIDAgdG8gY2xlYXIKKyAqIHRoZXNlLCBmb3Igb3RoZXJzIHRoZSBjb3VudGVycyBhcmUgc2V0IHRvIDEgd2hlbiB3cml0dGVuIHRvIGFuZAorICogaW5zdGVhZCBjbGVhcmVkIHdoZW4gcmVhZC4gU28gd2UgY2xlYXIgdGhlbSBib3RoIHdheXMgLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl90YWxseV9jb3VudGVycyh2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwlpb3dyaXRlMzIoMCwgaW9hZGRyICsgUnhNaXNzZWQpOworCWlvcmVhZDE2KGlvYWRkciArIFJ4Q1JDRXJycyk7CisJaW9yZWFkMTYoaW9hZGRyICsgUnhNaXNzZWQpOworfQorCitzdGF0aWMgdm9pZCByaGluZV9yZXN0YXJ0X3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CisJaW50IGVudHJ5ID0gcnAtPmRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworCXUzMiBpbnRyX3N0YXR1czsKKworCS8qCisJICogSWYgbmV3IGVycm9ycyBvY2N1cmVkLCB3ZSBuZWVkIHRvIHNvcnQgdGhlbSBvdXQgYmVmb3JlIGRvaW5nIFR4LgorCSAqIEluIHRoYXQgY2FzZSB0aGUgSVNSIHdpbGwgYmUgYmFjayBoZXJlIFJTTiBhbnl3YXkuCisJICovCisJaW50cl9zdGF0dXMgPSBnZXRfaW50cl9zdGF0dXMoZGV2KTsKKworCWlmICgoaW50cl9zdGF0dXMgJiBJbnRyVHhFcnJTdW1tYXJ5KSA9PSAwKSB7CisKKwkJLyogV2Uga25vdyBiZXR0ZXIgdGhhbiB0aGUgY2hpcCB3aGVyZSBpdCBzaG91bGQgY29udGludWUuICovCisJCWlvd3JpdGUzMihycC0+dHhfcmluZ19kbWEgKyBlbnRyeSAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYyksCisJCSAgICAgICBpb2FkZHIgKyBUeFJpbmdQdHIpOworCisJCWlvd3JpdGU4KGlvcmVhZDgoaW9hZGRyICsgQ2hpcENtZCkgfCBDbWRUeE9uLAorCQkgICAgICAgaW9hZGRyICsgQ2hpcENtZCk7CisJCWlvd3JpdGU4KGlvcmVhZDgoaW9hZGRyICsgQ2hpcENtZDEpIHwgQ21kMVR4RGVtYW5kLAorCQkgICAgICAgaW9hZGRyICsgQ2hpcENtZDEpOworCQlJT1NZTkM7CisJfQorCWVsc2UgeworCQkvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJaWYgKGRlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByaGluZV9yZXN0YXJ0X3R4KCkgIgorCQkJICAgICAgICJBbm90aGVyIGVycm9yIG9jY3VyZWQgJTguOHguXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgaW50cl9zdGF0dXMpOworCX0KKworfQorCitzdGF0aWMgdm9pZCByaGluZV9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW50cl9zdGF0dXMpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHJwLT5iYXNlOworCisJc3Bpbl9sb2NrKCZycC0+bG9jayk7CisKKwlpZiAoaW50cl9zdGF0dXMgJiBJbnRyTGlua0NoYW5nZSkKKwkJcmhpbmVfY2hlY2tfbWVkaWEoZGV2LCAwKTsKKwlpZiAoaW50cl9zdGF0dXMgJiBJbnRyU3RhdHNNYXgpIHsKKwkJcnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gaW9yZWFkMTYoaW9hZGRyICsgUnhDUkNFcnJzKTsKKwkJcnAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gaW9yZWFkMTYoaW9hZGRyICsgUnhNaXNzZWQpOworCQljbGVhcl90YWxseV9jb3VudGVycyhpb2FkZHIpOworCX0KKwlpZiAoaW50cl9zdGF0dXMgJiBJbnRyVHhBYm9ydGVkKSB7CisJCWlmIChkZWJ1ZyA+IDEpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQWJvcnQgJTguOHgsIGZyYW1lIGRyb3BwZWQuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgaW50cl9zdGF0dXMpOworCX0KKwlpZiAoaW50cl9zdGF0dXMgJiBJbnRyVHhVbmRlcnJ1bikgeworCQlpZiAocnAtPnR4X3RocmVzaCA8IDB4RTApCisJCQlpb3dyaXRlOChycC0+dHhfdGhyZXNoICs9IDB4MjAsIGlvYWRkciArIFR4Q29uZmlnKTsKKwkJaWYgKGRlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUcmFuc21pdHRlciB1bmRlcnJ1biwgVHggIgorCQkJICAgICAgICJ0aHJlc2hvbGQgbm93ICUyLjJ4LlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHJwLT50eF90aHJlc2gpOworCX0KKwlpZiAoaW50cl9zdGF0dXMgJiBJbnRyVHhEZXNjUmFjZSkgeworCQlpZiAoZGVidWcgPiAyKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFR4IGRlc2NyaXB0b3Igd3JpdGUtYmFjayByYWNlLlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCX0KKwlpZiAoKGludHJfc3RhdHVzICYgSW50clR4RXJyb3IpICYmCisJICAgIChpbnRyX3N0YXR1cyAmIChJbnRyVHhBYm9ydGVkIHwKKwkgICAgIEludHJUeFVuZGVycnVuIHwgSW50clR4RGVzY1JhY2UpKSA9PSAwKSB7CisJCWlmIChycC0+dHhfdGhyZXNoIDwgMHhFMCkgeworCQkJaW93cml0ZTgocnAtPnR4X3RocmVzaCArPSAweDIwLCBpb2FkZHIgKyBUeENvbmZpZyk7CisJCX0KKwkJaWYgKGRlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbnNwZWNpZmllZCBlcnJvci4gVHggIgorCQkJICAgICAgICJ0aHJlc2hvbGQgbm93ICUyLjJ4LlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHJwLT50eF90aHJlc2gpOworCX0KKwlpZiAoaW50cl9zdGF0dXMgJiAoSW50clR4QWJvcnRlZCB8IEludHJUeFVuZGVycnVuIHwgSW50clR4RGVzY1JhY2UgfAorCQkJICAgSW50clR4RXJyb3IpKQorCQlyaGluZV9yZXN0YXJ0X3R4KGRldik7CisKKwlpZiAoaW50cl9zdGF0dXMgJiB+KEludHJMaW5rQ2hhbmdlIHwgSW50clN0YXRzTWF4IHwgSW50clR4VW5kZXJydW4gfAorCQkJICAgIEludHJUeEVycm9yIHwgSW50clR4QWJvcnRlZCB8IEludHJOb3JtYWxTdW1tYXJ5IHwKKwkJCSAgICBJbnRyVHhEZXNjUmFjZSkpIHsKKwkJaWYgKGRlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFNvbWV0aGluZyBXaWNrZWQgaGFwcGVuZWQhICIKKwkJCSAgICAgICAiJTguOHguXG4iLCBkZXYtPm5hbWUsIGludHJfc3RhdHVzKTsKKwl9CisKKwlzcGluX3VubG9jaygmcnAtPmxvY2spOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnJoaW5lX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBycC0+YmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJwLT5sb2NrLCBmbGFncyk7CisJcnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gaW9yZWFkMTYoaW9hZGRyICsgUnhDUkNFcnJzKTsKKwlycC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPSBpb3JlYWQxNihpb2FkZHIgKyBSeE1pc3NlZCk7CisJY2xlYXJfdGFsbHlfY291bnRlcnMoaW9hZGRyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuICZycC0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIHJoaW5lX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHJwLT5iYXNlOworCXUzMiBtY19maWx0ZXJbMl07CS8qIE11bHRpY2FzdCBoYXNoIGZpbHRlciAqLworCXU4IHJ4X21vZGU7CQkvKiBOb3RlOiAweDAyPWFjY2VwdCBydW50LCAweDAxPWFjY2VwdCBlcnJzICovCisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CQkvKiBTZXQgcHJvbWlzY3VvdXMuICovCisJCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICovCisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyeF9tb2RlID0gMHgxQzsKKwkJaW93cml0ZTMyKDB4ZmZmZmZmZmYsIGlvYWRkciArIE11bHRpY2FzdEZpbHRlcjApOworCQlpb3dyaXRlMzIoMHhmZmZmZmZmZiwgaW9hZGRyICsgTXVsdGljYXN0RmlsdGVyMSk7CisJfSBlbHNlIGlmICgoZGV2LT5tY19jb3VudCA+IG11bHRpY2FzdF9maWx0ZXJfbGltaXQpCisJCSAgIHx8IChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQkvKiBUb28gbWFueSB0byBtYXRjaCwgb3IgYWNjZXB0IGFsbCBtdWx0aWNhc3RzLiAqLworCQlpb3dyaXRlMzIoMHhmZmZmZmZmZiwgaW9hZGRyICsgTXVsdGljYXN0RmlsdGVyMCk7CisJCWlvd3JpdGUzMigweGZmZmZmZmZmLCBpb2FkZHIgKyBNdWx0aWNhc3RGaWx0ZXIxKTsKKwkJcnhfbW9kZSA9IDB4MEM7CisJfSBlbHNlIHsKKwkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJCWludCBpOworCQltZW1zZXQobWNfZmlsdGVyLCAwLCBzaXplb2YobWNfZmlsdGVyKSk7CisJCWZvciAoaSA9IDAsIG1jbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNsaXN0ICYmIGkgPCBkZXYtPm1jX2NvdW50OworCQkgICAgIGkrKywgbWNsaXN0ID0gbWNsaXN0LT5uZXh0KSB7CisJCQlpbnQgYml0X25yID0gZXRoZXJfY3JjKEVUSF9BTEVOLCBtY2xpc3QtPmRtaV9hZGRyKSA+PiAyNjsKKworCQkJbWNfZmlsdGVyW2JpdF9uciA+PiA1XSB8PSAxIDw8IChiaXRfbnIgJiAzMSk7CisJCX0KKwkJaW93cml0ZTMyKG1jX2ZpbHRlclswXSwgaW9hZGRyICsgTXVsdGljYXN0RmlsdGVyMCk7CisJCWlvd3JpdGUzMihtY19maWx0ZXJbMV0sIGlvYWRkciArIE11bHRpY2FzdEZpbHRlcjEpOworCQlyeF9tb2RlID0gMHgwQzsKKwl9CisJaW93cml0ZTgocnAtPnJ4X3RocmVzaCB8IHJ4X21vZGUsIGlvYWRkciArIFJ4Q29uZmlnKTsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocnAtPnBkZXYpKTsKK30KKworc3RhdGljIGludCBuZXRkZXZfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmcnAtPmxvY2spOworCXJjID0gbWlpX2V0aHRvb2xfZ3NldCgmcnAtPm1paV9pZiwgY21kKTsKKwlzcGluX3VubG9ja19pcnEoJnJwLT5sb2NrKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBuZXRkZXZfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycSgmcnAtPmxvY2spOworCXJjID0gbWlpX2V0aHRvb2xfc3NldCgmcnAtPm1paV9pZiwgY21kKTsKKwlzcGluX3VubG9ja19pcnEoJnJwLT5sb2NrKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBuZXRkZXZfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gbWlpX253YXlfcmVzdGFydCgmcnAtPm1paV9pZik7Cit9CisKK3N0YXRpYyB1MzIgbmV0ZGV2X2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiBtaWlfbGlua19vaygmcnAtPm1paV9pZik7Cit9CisKK3N0YXRpYyB1MzIgbmV0ZGV2X2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBkZWJ1ZzsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdmFsdWUpCit7CisJZGVidWcgPSB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQgcmhpbmVfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghKHJwLT5xdWlya3MgJiBycVdPTCkpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnEoJnJwLT5sb2NrKTsKKwl3b2wtPnN1cHBvcnRlZCA9IFdBS0VfUEhZIHwgV0FLRV9NQUdJQyB8CisJCQkgV0FLRV9VQ0FTVCB8IFdBS0VfTUNBU1QgfCBXQUtFX0JDQVNUOwkvKiBVbnRlc3RlZCAqLworCXdvbC0+d29sb3B0cyA9IHJwLT53b2xvcHRzOworCXNwaW5fdW5sb2NrX2lycSgmcnAtPmxvY2spOworfQorCitzdGF0aWMgaW50IHJoaW5lX3NldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIHN1cHBvcnQgPSBXQUtFX1BIWSB8IFdBS0VfTUFHSUMgfAorCQkgICAgICBXQUtFX1VDQVNUIHwgV0FLRV9NQ0FTVCB8IFdBS0VfQkNBU1Q7CS8qIFVudGVzdGVkICovCisKKwlpZiAoIShycC0+cXVpcmtzICYgcnFXT0wpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh3b2wtPndvbG9wdHMgJiB+c3VwcG9ydCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxKCZycC0+bG9jayk7CisJcnAtPndvbG9wdHMgPSB3b2wtPndvbG9wdHM7CisJc3Bpbl91bmxvY2tfaXJxKCZycC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKKwkuZ2V0X3NldHRpbmdzCQk9IG5ldGRldl9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJPSBuZXRkZXZfc2V0X3NldHRpbmdzLAorCS5ud2F5X3Jlc2V0CQk9IG5ldGRldl9ud2F5X3Jlc2V0LAorCS5nZXRfbGluawkJPSBuZXRkZXZfZ2V0X2xpbmssCisJLmdldF9tc2dsZXZlbAkJPSBuZXRkZXZfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gbmV0ZGV2X3NldF9tc2dsZXZlbCwKKwkuZ2V0X3dvbAkJPSByaGluZV9nZXRfd29sLAorCS5zZXRfd29sCQk9IHJoaW5lX3NldF93b2wsCisJLmdldF9zZwkJCT0gZXRodG9vbF9vcF9nZXRfc2csCisJLmdldF90eF9jc3VtCQk9IGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0sCit9OworCitzdGF0aWMgaW50IG5ldGRldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycSgmcnAtPmxvY2spOworCXJjID0gZ2VuZXJpY19taWlfaW9jdGwoJnJwLT5taWlfaWYsIGlmX21paShycSksIGNtZCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxKCZycC0+bG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcmhpbmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CisKKwlzcGluX2xvY2tfaXJxKCZycC0+bG9jayk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAoZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLCAiCisJCSAgICAgICAic3RhdHVzIHdhcyAlNC40eC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGlvcmVhZDE2KGlvYWRkciArIENoaXBDbWQpKTsKKworCS8qIFN3aXRjaCB0byBsb29wYmFjayBtb2RlIHRvIGF2b2lkIGhhcmR3YXJlIHJhY2VzLiAqLworCWlvd3JpdGU4KHJwLT50eF90aHJlc2ggfCAweDAyLCBpb2FkZHIgKyBUeENvbmZpZyk7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYnkgY2xlYXJpbmcgdGhlIGludGVycnVwdCBtYXNrLiAqLworCWlvd3JpdGUxNigweDAwMDAsIGlvYWRkciArIEludHJFbmFibGUpOworCisJLyogU3RvcCB0aGUgY2hpcCdzIFR4IGFuZCBSeCBwcm9jZXNzZXMuICovCisJaW93cml0ZTE2KENtZFN0b3AsIGlvYWRkciArIENoaXBDbWQpOworCisJc3Bpbl91bmxvY2tfaXJxKCZycC0+bG9jayk7CisKKwlmcmVlX2lycShycC0+cGRldi0+aXJxLCBkZXYpOworCWZyZWVfcmJ1ZnMoZGV2KTsKKwlmcmVlX3RidWZzKGRldik7CisJZnJlZV9yaW5nKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcmhpbmVfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJcGNpX2lvdW5tYXAocGRldiwgcnAtPmJhc2UpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKKwlmcmVlX25ldGRldihkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIHJoaW5lX3NodXRkb3duIChzdHJ1Y3QgZGV2aWNlICpnZW5kZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGdlbmRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcnAtPmJhc2U7CisKKwlpZiAoIShycC0+cXVpcmtzICYgcnFXT0wpKQorCQlyZXR1cm47IC8qIE5vdGhpbmcgdG8gZG8gZm9yIG5vbi1XT0wgYWRhcHRlcnMgKi8KKworCXJoaW5lX3Bvd2VyX2luaXQoZGV2KTsKKworCS8qIE1ha2Ugc3VyZSB3ZSB1c2UgcGF0dGVybiAwLCAxIGFuZCBub3QgNCwgNSAqLworCWlmIChycC0+cXVpcmtzICYgcnE2cGF0dGVybnMpCisJCWlvd3JpdGU4KDB4MDQsIGlvYWRkciArIDB4QTcpOworCisJaWYgKHJwLT53b2xvcHRzICYgV0FLRV9NQUdJQykgeworCQlpb3dyaXRlOChXT0xtYWdpYywgaW9hZGRyICsgV09MY3JTZXQpOworCQkvKgorCQkgKiBUdXJuIEVFUFJPTS1jb250cm9sbGVkIHdha2UtdXAgYmFjayBvbiAtLSBzb21lIGhhcmR3YXJlIG1heQorCQkgKiBub3QgY29vcGVyYXRlIG90aGVyd2lzZS4KKwkJICovCisJCWlvd3JpdGU4KGlvcmVhZDgoaW9hZGRyICsgQ29uZmlnQSkgfCAweDAzLCBpb2FkZHIgKyBDb25maWdBKTsKKwl9CisKKwlpZiAocnAtPndvbG9wdHMgJiAoV0FLRV9CQ0FTVHxXQUtFX01DQVNUKSkKKwkJaW93cml0ZTgoV09MYm1jYXN0LCBpb2FkZHIgKyBXT0xjZ1NldCk7CisKKwlpZiAocnAtPndvbG9wdHMgJiBXQUtFX1BIWSkKKwkJaW93cml0ZTgoV09MbG5rb24gfCBXT0xsbmtvZmYsIGlvYWRkciArIFdPTGNyU2V0KTsKKworCWlmIChycC0+d29sb3B0cyAmIFdBS0VfVUNBU1QpCisJCWlvd3JpdGU4KFdPTHVjYXN0LCBpb2FkZHIgKyBXT0xjclNldCk7CisKKwlpZiAocnAtPndvbG9wdHMpIHsKKwkJLyogRW5hYmxlIGxlZ2FjeSBXT0wgKGZvciBvbGQgbW90aGVyYm9hcmRzKSAqLworCQlpb3dyaXRlOCgweDAxLCBpb2FkZHIgKyBQd2NmZ1NldCk7CisJCWlvd3JpdGU4KGlvcmVhZDgoaW9hZGRyICsgU3RpY2t5SFcpIHwgMHgwNCwgaW9hZGRyICsgU3RpY2t5SFcpOworCX0KKworCS8qIEhpdCBwb3dlciBzdGF0ZSBEMyAoc2xlZXApICovCisJaW93cml0ZTgoaW9yZWFkOChpb2FkZHIgKyBTdGlja3lIVykgfCAweDAzLCBpb2FkZHIgKyBTdGlja3lIVyk7CisKKwkvKiBUT0RPOiBDaGVjayB1c2Ugb2YgcGNpX2VuYWJsZV93YWtlKCkgKi8KKworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHJoaW5lX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gMDsKKworCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZycC0+bG9jaywgZmxhZ3MpOworCXJoaW5lX3NodXRkb3duKCZwZGV2LT5kZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwLT5sb2NrLCBmbGFncyk7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByaGluZV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gMDsKKworICAgICAgICBpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIHJoaW5lX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KSkKKwkJcHJpbnRrKEtFUk5fRVJSICJ2aWEtcmhpbmUgJXM6IHJlcXVlc3RfaXJxIGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKKworCXJldCA9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlpZiAoZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogRW50ZXJpbmcgcG93ZXIgc3RhdGUgRDAgJXMgKCVkKS5cbiIsCisJCQlkZXYtPm5hbWUsIHJldCA/ICJmYWlsZWQiIDogInN1Y2NlZWRlZCIsIHJldCk7CisKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZycC0+bG9jaywgZmxhZ3MpOworI2lmZGVmIFVTRV9NTUlPCisJZW5hYmxlX21taW8ocnAtPnBpb2FkZHIsIHJwLT5xdWlya3MpOworI2VuZGlmCisJcmhpbmVfcG93ZXJfaW5pdChkZXYpOworCWZyZWVfdGJ1ZnMoZGV2KTsKKwlmcmVlX3JidWZzKGRldik7CisJYWxsb2NfdGJ1ZnMoZGV2KTsKKwlhbGxvY19yYnVmcyhkZXYpOworCWluaXRfcmVnaXN0ZXJzKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnAtPmxvY2ssIGZsYWdzKTsKKworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcmhpbmVfZHJpdmVyID0geworCS5uYW1lCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQk9IHJoaW5lX3BjaV90YmwsCisJLnByb2JlCQk9IHJoaW5lX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocmhpbmVfcmVtb3ZlX29uZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSByaGluZV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gcmhpbmVfcmVzdW1lLAorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCS5kcml2ZXIgPSB7CisJCS5zaHV0ZG93biA9IHJoaW5lX3NodXRkb3duLAorCX0KK307CisKKworc3RhdGljIGludCBfX2luaXQgcmhpbmVfaW5pdCh2b2lkKQoreworLyogd2hlbiBhIG1vZHVsZSwgdGhpcyBpcyBwcmludGVkIHdoZXRoZXIgb3Igbm90IGRldmljZXMgYXJlIGZvdW5kIGluIHByb2JlICovCisjaWZkZWYgTU9EVUxFCisJcHJpbnRrKHZlcnNpb24pOworI2VuZGlmCisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcmhpbmVfZHJpdmVyKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgcmhpbmVfY2xlYW51cCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcmhpbmVfZHJpdmVyKTsKK30KKworCittb2R1bGVfaW5pdChyaGluZV9pbml0KTsKK21vZHVsZV9leGl0KHJoaW5lX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMgYi9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWU3MTAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMKQEAgLTAsMCArMSwzMzAzIEBACisvKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgVklBIHJlZmVyZW5jZSBkcml2ZXIgKGNvcHlyaWdodCBtZXNzYWdlCisgKiBiZWxvdykgcHJvdmlkZWQgdG8gUmVkIEhhdCBieSBWSUEgTmV0d29ya2luZyBUZWNobm9sb2dpZXMsIEluYy4gZm9yCisgKiBhZGRpdGlvbiB0byB0aGUgTGludXgga2VybmVsLgorICoKKyAqIFRoZSBjb2RlIGhhcyBiZWVuIG1lcmdlZCBpbnRvIG9uZSBzb3VyY2UgZmlsZSwgY2xlYW5lZCB1cCB0byBmb2xsb3cKKyAqIExpbnV4IGNvZGluZyBzdHlsZSwgIHBvcnRlZCB0byB0aGUgTGludXggMi42IGtlcm5lbCB0cmVlIGFuZCBjbGVhbmVkCisgKiBmb3IgNjRiaXQgaGFyZHdhcmUgcGxhdGZvcm1zLgorICoKKyAqIFRPRE8KKyAqCUJpZy1lbmRpYW4gc3VwcG9ydAorICoJcnhfY29weWJyZWFrL2FsaWdubWVudAorICoJU2NhdHRlciBnYXRoZXIKKyAqCU1vcmUgdGVzdGluZworICoKKyAqIFRoZSBjaGFuZ2VzIGFyZSAoYykgQ29weXJpZ2h0IDIwMDQsIFJlZCBIYXQgSW5jLiA8YWxhbkByZWRoYXQuY29tPgorICogQWRkaXRpb25hbCBmaXhlcyBhbmQgY2xlYW4gdXA6IEZyYW5jb2lzIFJvbWlldQorICoKKyAqIFRoaXMgc291cmNlIGhhcyBub3QgYmVlbiB2ZXJpZmllZCBmb3IgdXNlIGluIHNhZmV0eSBjcml0aWNhbCBzeXN0ZW1zLgorICoKKyAqIFBsZWFzZSBkaXJlY3QgcXVlcmllcyBhYm91dCB0aGUgcmV2YW1wZWQgZHJpdmVyIHRvIHRoZSBsaW51eC1rZXJuZWwKKyAqIGxpc3Qgbm90IFZJQS4KKyAqCisgKiBPcmlnaW5hbCBjb2RlOgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NiwgMjAwMyBWSUEgTmV0d29ya2luZyBUZWNobm9sb2dpZXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKKyAqIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIEF1dGhvcjogQ2h1YW5nIExpYW5nLVNoaW5nLCBBSiBKaWFuZworICoKKyAqIERhdGU6IEphbiAyNCwgMjAwMworICoKKyAqIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyAqCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvY3JjLWNjaXR0Lmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKworI2luY2x1ZGUgInZpYS12ZWxvY2l0eS5oIgorCisKK3N0YXRpYyBpbnQgdmVsb2NpdHlfbmljcyA9IDA7CitzdGF0aWMgaW50IG1zZ2xldmVsID0gTVNHX0xFVkVMX0lORk87CisKKworc3RhdGljIGludCB2ZWxvY2l0eV9taWlfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB2ZWxvY2l0eV9ldGh0b29sX29wczsKKworLyoKKyAgICBEZWZpbmUgbW9kdWxlIG9wdGlvbnMKKyovCisKK01PRFVMRV9BVVRIT1IoIlZJQSBOZXR3b3JraW5nIFRlY2hub2xvZ2llcywgSW5jLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJWSUEgTmV0d29ya2luZyBWZWxvY2l0eSBGYW1pbHkgR2lnYWJpdCBFdGhlcm5ldCBBZGFwdGVyIERyaXZlciIpOworCisjZGVmaW5lIFZFTE9DSVRZX1BBUkFNKE4sRCkgXAorICAgICAgICBzdGF0aWMgaW50IE5bTUFYX1VOSVRTXT1PUFRJT05fREVGQVVMVDtcCisJbW9kdWxlX3BhcmFtX2FycmF5KE4sIGludCwgTlVMTCwgMCk7IFwKKyAgICAgICAgTU9EVUxFX1BBUk1fREVTQyhOLCBEKTsKKworI2RlZmluZSBSWF9ERVNDX01JTiAgICAgNjQKKyNkZWZpbmUgUlhfREVTQ19NQVggICAgIDI1NQorI2RlZmluZSBSWF9ERVNDX0RFRiAgICAgNjQKK1ZFTE9DSVRZX1BBUkFNKFJ4RGVzY3JpcHRvcnMsICJOdW1iZXIgb2YgcmVjZWl2ZSBkZXNjcmlwdG9ycyIpOworCisjZGVmaW5lIFRYX0RFU0NfTUlOICAgICAxNgorI2RlZmluZSBUWF9ERVNDX01BWCAgICAgMjU2CisjZGVmaW5lIFRYX0RFU0NfREVGICAgICA2NAorVkVMT0NJVFlfUEFSQU0oVHhEZXNjcmlwdG9ycywgIk51bWJlciBvZiB0cmFuc21pdCBkZXNjcmlwdG9ycyIpOworCisjZGVmaW5lIFZMQU5fSURfTUlOICAgICAwCisjZGVmaW5lIFZMQU5fSURfTUFYICAgICA0MDk1CisjZGVmaW5lIFZMQU5fSURfREVGICAgICAwCisvKiBWSURfc2V0dGluZ1tdIGlzIHVzZWQgZm9yIHNldHRpbmcgdGhlIFZJRCBvZiBOSUMuCisgICAwOiBkZWZhdWx0IFZJRC4KKyAgIDEtNDA5NDogb3RoZXIgVklEcy4KKyovCitWRUxPQ0lUWV9QQVJBTShWSURfc2V0dGluZywgIjgwMi4xUSBWTEFOIElEIik7CisKKyNkZWZpbmUgUlhfVEhSRVNIX01JTiAgIDAKKyNkZWZpbmUgUlhfVEhSRVNIX01BWCAgIDMKKyNkZWZpbmUgUlhfVEhSRVNIX0RFRiAgIDAKKy8qIHJ4X3RocmVzaFtdIGlzIHVzZWQgZm9yIGNvbnRyb2xsaW5nIHRoZSByZWNlaXZlIGZpZm8gdGhyZXNob2xkLgorICAgMDogaW5kaWNhdGUgdGhlIHJ4ZmlmbyB0aHJlc2hvbGQgaXMgMTI4IGJ5dGVzLgorICAgMTogaW5kaWNhdGUgdGhlIHJ4ZmlmbyB0aHJlc2hvbGQgaXMgNTEyIGJ5dGVzLgorICAgMjogaW5kaWNhdGUgdGhlIHJ4ZmlmbyB0aHJlc2hvbGQgaXMgMTAyNCBieXRlcy4KKyAgIDM6IGluZGljYXRlIHRoZSByeGZpZm8gdGhyZXNob2xkIGlzIHN0b3JlICYgZm9yd2FyZC4KKyovCitWRUxPQ0lUWV9QQVJBTShyeF90aHJlc2gsICJSZWNlaXZlIGZpZm8gdGhyZXNob2xkIik7CisKKyNkZWZpbmUgRE1BX0xFTkdUSF9NSU4gIDAKKyNkZWZpbmUgRE1BX0xFTkdUSF9NQVggIDcKKyNkZWZpbmUgRE1BX0xFTkdUSF9ERUYgIDAKKworLyogRE1BX2xlbmd0aFtdIGlzIHVzZWQgZm9yIGNvbnRyb2xsaW5nIHRoZSBETUEgbGVuZ3RoCisgICAwOiA4IERXT1JEcworICAgMTogMTYgRFdPUkRzCisgICAyOiAzMiBEV09SRHMKKyAgIDM6IDY0IERXT1JEcworICAgNDogMTI4IERXT1JEcworICAgNTogMjU2IERXT1JEcworICAgNjogU0YoZmx1c2ggdGlsbCBlbXBseSkKKyAgIDc6IFNGKGZsdXNoIHRpbGwgZW1wbHkpCisqLworVkVMT0NJVFlfUEFSQU0oRE1BX2xlbmd0aCwgIkRNQSBsZW5ndGgiKTsKKworI2RlZmluZSBUQUdHSU5HX0RFRiAgICAgMAorLyogZW5hYmxlX3RhZ2dpbmdbXSBpcyB1c2VkIGZvciBlbmFibGluZyA4MDIuMVEgVklEIHRhZ2dpbmcuCisgICAwOiBkaXNhYmxlIFZJRCBzZWV0aW5nKGRlZmF1bHQpLgorICAgMTogZW5hYmxlIFZJRCBzZXR0aW5nLgorKi8KK1ZFTE9DSVRZX1BBUkFNKGVuYWJsZV90YWdnaW5nLCAiRW5hYmxlIDgwMi4xUSB0YWdnaW5nIik7CisKKyNkZWZpbmUgSVBfQUxJR19ERUYgICAgIDAKKy8qIElQX2J5dGVfYWxpZ25bXSBpcyB1c2VkIGZvciBJUCBoZWFkZXIgRFdPUkQgYnl0ZSBhbGlnbmVkCisgICAwOiBpbmRpY2F0ZSB0aGUgSVAgaGVhZGVyIHdvbid0IGJlIERXT1JEIGJ5dGUgYWxpZ25lZC4oRGVmYXVsdCkgLgorICAgMTogaW5kaWNhdGUgdGhlIElQIGhlYWRlciB3aWxsIGJlIERXT1JEIGJ5dGUgYWxpZ25lZC4KKyAgICAgIEluIHNvbWUgZW52aXJvbWVudCwgdGhlIElQIGhlYWRlciBzaG91bGQgYmUgRFdPUkQgYnl0ZSBhbGlnbmVkLAorICAgICAgb3IgdGhlIHBhY2tldCB3aWxsIGJlIGRyb3BlZCB3aGVuIHdlIHJlY2VpdmUgaXQuIChlZzogSVBWUykKKyovCitWRUxPQ0lUWV9QQVJBTShJUF9ieXRlX2FsaWduLCAiRW5hYmxlIElQIGhlYWRlciBkd29yZCBhbGlnbmVkIik7CisKKyNkZWZpbmUgVFhfQ1NVTV9ERUYgICAgIDEKKy8qIHR4Y3N1bV9vZmZsb2FkW10gaXMgdXNlZCBmb3Igc2V0dGluZyB0aGUgY2hlY2tzdW0gb2ZmbG9hZCBhYmlsaXR5IG9mIE5JQy4KKyAgIChXZSBvbmx5IHN1cHBvcnQgUlggY2hlY2tzdW0gb2ZmbG9hZCBub3cpCisgICAwOiBkaXNhYmxlIGNzdW1fb2ZmbG9hZFtjaGVja3N1bSBvZmZsb2FkCisgICAxOiBlbmFibGUgY2hlY2tzdW0gb2ZmbG9hZC4gKERlZmF1bHQpCisqLworVkVMT0NJVFlfUEFSQU0odHhjc3VtX29mZmxvYWQsICJFbmFibGUgdHJhbnNtaXQgcGFja2V0IGNoZWNrc3VtIG9mZmxvYWQiKTsKKworI2RlZmluZSBGTE9XX0NOVExfREVGICAgMQorI2RlZmluZSBGTE9XX0NOVExfTUlOICAgMQorI2RlZmluZSBGTE9XX0NOVExfTUFYICAgNQorCisvKiBmbG93X2NvbnRyb2xbXSBpcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBmbG93IGNvbnRyb2wgYWJpbGl0eSBvZiBOSUMuCisgICAxOiBoYXJkd2FyZSBkZWFmdWx0IC0gQVVUTyAoZGVmYXVsdCkuIFVzZSBIYXJkd2FyZSBkZWZhdWx0IHZhbHVlIGluIEFOQVIuCisgICAyOiBlbmFibGUgVFggZmxvdyBjb250cm9sLgorICAgMzogZW5hYmxlIFJYIGZsb3cgY29udHJvbC4KKyAgIDQ6IGVuYWJsZSBSWC9UWCBmbG93IGNvbnRyb2wuCisgICA1OiBkaXNhYmxlCisqLworVkVMT0NJVFlfUEFSQU0oZmxvd19jb250cm9sLCAiRW5hYmxlIGZsb3cgY29udHJvbCBhYmlsaXR5Iik7CisKKyNkZWZpbmUgTUVEX0xOS19ERUYgMAorI2RlZmluZSBNRURfTE5LX01JTiAwCisjZGVmaW5lIE1FRF9MTktfTUFYIDQKKy8qIHNwZWVkX2R1cGxleFtdIGlzIHVzZWQgZm9yIHNldHRpbmcgdGhlIHNwZWVkIGFuZCBkdXBsZXggbW9kZSBvZiBOSUMuCisgICAwOiBpbmRpY2F0ZSBhdXRvbmVnb3RpYXRpb24gZm9yIGJvdGggc3BlZWQgYW5kIGR1cGxleCBtb2RlCisgICAxOiBpbmRpY2F0ZSAxMDBNYnBzIGhhbGYgZHVwbGV4IG1vZGUKKyAgIDI6IGluZGljYXRlIDEwME1icHMgZnVsbCBkdXBsZXggbW9kZQorICAgMzogaW5kaWNhdGUgMTBNYnBzIGhhbGYgZHVwbGV4IG1vZGUKKyAgIDQ6IGluZGljYXRlIDEwTWJwcyBmdWxsIGR1cGxleCBtb2RlCisKKyAgIE5vdGU6CisgICAgICAgIGlmIEVFUFJPTSBoYXZlIGJlZW4gc2V0IHRvIHRoZSBmb3JjZSBtb2RlLCB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkCisgICAgICAgICAgICBieSBkcml2ZXIuCisqLworVkVMT0NJVFlfUEFSQU0oc3BlZWRfZHVwbGV4LCAiU2V0dGluZyB0aGUgc3BlZWQgYW5kIGR1cGxleCBtb2RlIik7CisKKyNkZWZpbmUgVkFMX1BLVF9MRU5fREVGICAgICAwCisvKiBWYWxQa3RMZW5bXSBpcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBjaGVja3N1bSBvZmZsb2FkIGFiaWxpdHkgb2YgTklDLgorICAgMDogUmVjZWl2ZSBmcmFtZSB3aXRoIGludmFsaWQgbGF5ZXIgMiBsZW5ndGggKERlZmF1bHQpCisgICAxOiBEcm9wIGZyYW1lIHdpdGggaW52YWxpZCBsYXllciAyIGxlbmd0aAorKi8KK1ZFTE9DSVRZX1BBUkFNKFZhbFBrdExlbiwgIlJlY2VpdmluZyBvciBEcm9wIGludmFsaWQgODAyLjMgZnJhbWUiKTsKKworI2RlZmluZSBXT0xfT1BUX0RFRiAgICAgMAorI2RlZmluZSBXT0xfT1BUX01JTiAgICAgMAorI2RlZmluZSBXT0xfT1BUX01BWCAgICAgNworLyogd29sX29wdHNbXSBpcyB1c2VkIGZvciBjb250cm9sbGluZyB3YWtlIG9uIGxhbiBiZWhhdmlvci4KKyAgIDA6IFdha2UgdXAgaWYgcmVjZXZpZWQgYSBtYWdpYyBwYWNrZXQuIChEZWZhdWx0KQorICAgMTogV2FrZSB1cCBpZiBsaW5rIHN0YXR1cyBpcyBvbi9vZmYuCisgICAyOiBXYWtlIHVwIGlmIHJlY2V2aWVkIGFuIGFycCBwYWNrZXQuCisgICA0OiBXYWtlIHVwIGlmIHJlY2V2aWVkIGFueSB1bmljYXN0IHBhY2tldC4KKyAgIFRob3NlIHZhbHVlIGNhbiBiZSBzdW1lZCB1cCB0byBzdXBwb3J0IG1vcmUgdGhhbiBvbmUgb3B0aW9uLgorKi8KK1ZFTE9DSVRZX1BBUkFNKHdvbF9vcHRzLCAiV2FrZSBPbiBMYW4gb3B0aW9ucyIpOworCisjZGVmaW5lIElOVF9XT1JLU19ERUYgICAyMAorI2RlZmluZSBJTlRfV09SS1NfTUlOICAgMTAKKyNkZWZpbmUgSU5UX1dPUktTX01BWCAgIDY0CisKK1ZFTE9DSVRZX1BBUkFNKGludF93b3JrcywgIk51bWJlciBvZiBwYWNrZXRzIHBlciBpbnRlcnJ1cHQgc2VydmljZXMiKTsKKworc3RhdGljIGludCByeF9jb3B5YnJlYWsgPSAyMDA7Cittb2R1bGVfcGFyYW0ocnhfY29weWJyZWFrLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhyeF9jb3B5YnJlYWssICJDb3B5IGJyZWFrcG9pbnQgZm9yIGNvcHktb25seS10aW55LWZyYW1lcyIpOworCitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9pbml0X2luZm8oc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLCBzdHJ1Y3QgdmVsb2NpdHlfaW5mb190YmwgKmluZm8pOworc3RhdGljIGludCB2ZWxvY2l0eV9nZXRfcGNpX2luZm8oc3RydWN0IHZlbG9jaXR5X2luZm8gKiwgc3RydWN0IHBjaV9kZXYgKnBkZXYpOworc3RhdGljIHZvaWQgdmVsb2NpdHlfcHJpbnRfaW5mbyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cik7CitzdGF0aWMgaW50IHZlbG9jaXR5X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHZlbG9jaXR5X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG10dSk7CitzdGF0aWMgaW50IHZlbG9jaXR5X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHZlbG9jaXR5X2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnZlbG9jaXR5X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgdmVsb2NpdHlfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgaW50IHZlbG9jaXR5X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCB2ZWxvY2l0eV9yZWNlaXZlX2ZyYW1lKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICosIGludCBpZHgpOworc3RhdGljIGludCB2ZWxvY2l0eV9hbGxvY19yeF9idWYoc3RydWN0IHZlbG9jaXR5X2luZm8gKiwgaW50IGlkeCk7CitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9mcmVlX3JkX3Jpbmcoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpOworc3RhdGljIHZvaWQgdmVsb2NpdHlfZnJlZV90eF9idWYoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIsIHN0cnVjdCB2ZWxvY2l0eV90ZF9pbmZvICopOworc3RhdGljIGludCB2ZWxvY2l0eV9zb2Z0X3Jlc2V0KHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKTsKK3N0YXRpYyB2b2lkIG1paV9pbml0KHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLCB1MzIgbWlpX3N0YXR1cyk7CitzdGF0aWMgdTMyIHZlbG9jaXR5X2dldF9vcHRfbWVkaWFfbW9kZShzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cik7CitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9wcmludF9saW5rX3N0YXR1cyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cik7CitzdGF0aWMgdm9pZCBzYWZlX2Rpc2FibGVfbWlpX2F1dG9wb2xsKHN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncyk7CitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9zaHV0ZG93bihzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cik7CitzdGF0aWMgdm9pZCBlbmFibGVfZmxvd19jb250cm9sX2FiaWxpdHkoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpOworc3RhdGljIHZvaWQgZW5hYmxlX21paV9hdXRvcG9sbChzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MpOworc3RhdGljIGludCB2ZWxvY2l0eV9taWlfcmVhZChzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqLCB1OCBieUlkeCwgdTE2ICogcGRhdGEpOworc3RhdGljIGludCB2ZWxvY2l0eV9taWlfd3JpdGUoc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiwgdTggYnlNaWlBZGRyLCB1MTYgZGF0YSk7CitzdGF0aWMgdTMyIG1paV9jaGVja19tZWRpYV9tb2RlKHN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncyk7CitzdGF0aWMgdTMyIGNoZWNrX2Nvbm5lY3Rpb25fdHlwZShzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MpOworc3RhdGljIGludCB2ZWxvY2l0eV9zZXRfbWVkaWFfbW9kZShzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwgdTMyIG1paV9zdGF0dXMpOworCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgdmVsb2NpdHlfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK3N0YXRpYyBpbnQgdmVsb2NpdHlfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKworc3RhdGljIGludCB2ZWxvY2l0eV9uZXRkZXZfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBub3RpZmljYXRpb24sIHZvaWQgKnB0cik7CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdmVsb2NpdHlfaW5ldGFkZHJfbm90aWZpZXIgPSB7CisgICAgICAubm90aWZpZXJfY2FsbAk9IHZlbG9jaXR5X25ldGRldl9ldmVudCwKK307CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodmVsb2NpdHlfZGV2X2xpc3RfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKHZlbG9jaXR5X2Rldl9saXN0KTsKKworc3RhdGljIHZvaWQgdmVsb2NpdHlfcmVnaXN0ZXJfbm90aWZpZXIodm9pZCkKK3sKKwlyZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcigmdmVsb2NpdHlfaW5ldGFkZHJfbm90aWZpZXIpOworfQorCitzdGF0aWMgdm9pZCB2ZWxvY2l0eV91bnJlZ2lzdGVyX25vdGlmaWVyKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcigmdmVsb2NpdHlfaW5ldGFkZHJfbm90aWZpZXIpOworfQorCisjZWxzZQkJCQkvKiBDT05GSUdfUE0gKi8KKworI2RlZmluZSB2ZWxvY2l0eV9yZWdpc3Rlcl9ub3RpZmllcigpCWRvIHt9IHdoaWxlICgwKQorI2RlZmluZSB2ZWxvY2l0eV91bnJlZ2lzdGVyX25vdGlmaWVyKCkJZG8ge30gd2hpbGUgKDApCisKKyNlbmRpZgkJCQkvKiAhQ09ORklHX1BNICovCisKKy8qCisgKglJbnRlcm5hbCBib2FyZCB2YXJpYW50cy4gQXQgdGhlIG1vbWVudCB3ZSBoYXZlIG9ubHkgb25lCisgKi8KKworc3RhdGljIHN0cnVjdCB2ZWxvY2l0eV9pbmZvX3RibCBjaGlwX2luZm9fdGFibGVbXSA9IHsKKwl7Q0hJUF9UWVBFX1ZUNjExMCwgIlZJQSBOZXR3b3JraW5nIFZlbG9jaXR5IEZhbWlseSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIiLCAyNTYsIDEsIDB4MDBGRkZGRkZVTH0sCisJezAsIE5VTEx9Cit9OworCisvKgorICoJRGVzY3JpYmUgdGhlIFBDSSBkZXZpY2UgaWRlbnRpZmllcnMgdGhhdCB3ZSBzdXBwb3J0IGluIHRoaXMKKyAqCWRldmljZSBkcml2ZXIuIFVzZWQgZm9yIGhvdHBsdWcgYXV0b2xvYWRpbmcuCisgKi8KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZlbG9jaXR5X2lkX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzYxMlgsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsICh1bnNpZ25lZCBsb25nKSBjaGlwX2luZm9fdGFibGV9LAorCXswLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdmVsb2NpdHlfaWRfdGFibGUpOworCisvKioKKyAqCWdldF9jaGlwX25hbWUJLSAJaWRlbnRpZmllciB0byBuYW1lCisgKglAaWQ6IGNoaXAgaWRlbnRpZmllcgorICoKKyAqCUdpdmVuIGEgY2hpcCBpZGVudGlmaWVyIHJldHVybiBhIHN1aXRhYmxlIGRlc2NyaXB0aW9uLiBSZXR1cm5zCisgKglhIHBvaW50ZXIgYSBzdGF0aWMgc3RyaW5nIHZhbGlkIHdoaWxlIHRoZSBkcml2ZXIgaXMgbG9hZGVkLgorICovCisKK3N0YXRpYyBjaGFyIF9fZGV2aW5pdCAqZ2V0X2NoaXBfbmFtZShlbnVtIGNoaXBfdHlwZSBjaGlwX2lkKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGNoaXBfaW5mb190YWJsZVtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwkJaWYgKGNoaXBfaW5mb190YWJsZVtpXS5jaGlwX2lkID09IGNoaXBfaWQpCisJCQlicmVhazsKKwlyZXR1cm4gY2hpcF9pbmZvX3RhYmxlW2ldLm5hbWU7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfcmVtb3ZlMQktCWRldmljZSB1bnBsdWcKKyAqCUBwZGV2OiBQQ0kgZGV2aWNlIGJlaW5nIHJlbW92ZWQKKyAqCisgKglEZXZpY2UgdW5sb2FkIGNhbGxiYWNrLiBDYWxsZWQgb24gYW4gdW5wbHVnIG9yIG9uIG1vZHVsZQorICoJdW5sb2FkIGZvciBlYWNoIGFjdGl2ZSBkZXZpY2UgdGhhdCBpcyBwcmVzZW50LiBEaXNjb25uZWN0cworICoJdGhlIGRldmljZSBmcm9tIHRoZSBuZXR3b3JrIGxheWVyIGFuZCBmcmVlcyBhbGwgdGhlIHJlc291cmNlcworICovCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB2ZWxvY2l0eV9yZW1vdmUxKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBkZXYtPnByaXY7CisKKyNpZmRlZiBDT05GSUdfUE0KKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZlbG9jaXR5X2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKKwlpZiAoIWxpc3RfZW1wdHkoJnZlbG9jaXR5X2Rldl9saXN0KSkKKwkJbGlzdF9kZWwoJnZwdHItPmxpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZlbG9jaXR5X2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKKyNlbmRpZgorCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaW91bm1hcCh2cHRyLT5tYWNfcmVncyk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfbmV0ZGV2KGRldik7CisKKwl2ZWxvY2l0eV9uaWNzLS07Cit9CisKKy8qKgorICoJdmVsb2NpdHlfc2V0X2ludF9vcHQJLQlwYXJzZXIgZm9yIGludGVnZXIgb3B0aW9ucworICoJQG9wdDogcG9pbnRlciB0byBvcHRpb24gdmFsdWUKKyAqCUB2YWw6IHZhbHVlIHRoZSB1c2VyIHJlcXVlc3RlZCAob3IgLTEgZm9yIGRlZmF1bHQpCisgKglAbWluOiBsb3dlc3QgdmFsdWUgYWxsb3dlZAorICoJQG1heDogaGlnaGVzdCB2YWx1ZSBhbGxvd2VkCisgKglAZGVmOiBkZWZhdWx0IHZhbHVlCisgKglAbmFtZTogcHJvcGVydHkgbmFtZQorICoJQGRldjogZGV2aWNlIG5hbWUKKyAqCisgKglTZXQgYW4gaW50ZWdlciBwcm9wZXJ0eSBpbiB0aGUgbW9kdWxlIG9wdGlvbnMuIFRoaXMgZnVuY3Rpb24gZG9lcworICoJYWxsIHRoZSB2ZXJpZmljYXRpb24gYW5kIGNoZWNraW5nIGFzIHdlbGwgYXMgcmVwb3J0aW5nIHNvIHRoYXQKKyAqCXdlIGRvbid0IGR1cGxpY2F0ZSBjb2RlIGZvciBlYWNoIG9wdGlvbi4KKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdmVsb2NpdHlfc2V0X2ludF9vcHQoaW50ICpvcHQsIGludCB2YWwsIGludCBtaW4sIGludCBtYXgsIGludCBkZWYsIGNoYXIgKm5hbWUsIGNoYXIgKmRldm5hbWUpCit7CisJaWYgKHZhbCA9PSAtMSkKKwkJKm9wdCA9IGRlZjsKKwllbHNlIGlmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KSB7CisJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgS0VSTl9OT1RJQ0UgIiVzOiB0aGUgdmFsdWUgb2YgcGFyYW1ldGVyICVzIGlzIGludmFsaWQsIHRoZSB2YWxpZCByYW5nZSBpcyAoJWQtJWQpXG4iLAorCQkJCQlkZXZuYW1lLCBuYW1lLCBtaW4sIG1heCk7CisJCSpvcHQgPSBkZWY7CisJfSBlbHNlIHsKKwkJVkVMT0NJVFlfUFJUKE1TR19MRVZFTF9JTkZPLCBLRVJOX0lORk8gIiVzOiBzZXQgdmFsdWUgb2YgcGFyYW1ldGVyICVzIHRvICVkXG4iLAorCQkJCQlkZXZuYW1lLCBuYW1lLCB2YWwpOworCQkqb3B0ID0gdmFsOworCX0KK30KKworLyoqCisgKgl2ZWxvY2l0eV9zZXRfYm9vbF9vcHQJLQlwYXJzZXIgZm9yIGJvb2xlYW4gb3B0aW9ucworICoJQG9wdDogcG9pbnRlciB0byBvcHRpb24gdmFsdWUKKyAqCUB2YWw6IHZhbHVlIHRoZSB1c2VyIHJlcXVlc3RlZCAob3IgLTEgZm9yIGRlZmF1bHQpCisgKglAZGVmOiBkZWZhdWx0IHZhbHVlICh5ZXMvbm8pCisgKglAZmxhZzogbnVtZXJpYyB2YWx1ZSB0byBzZXQgZm9yIHRydWUuCisgKglAbmFtZTogcHJvcGVydHkgbmFtZQorICoJQGRldjogZGV2aWNlIG5hbWUKKyAqCisgKglTZXQgYSBib29sZWFuIHByb3BlcnR5IGluIHRoZSBtb2R1bGUgb3B0aW9ucy4gVGhpcyBmdW5jdGlvbiBkb2VzCisgKglhbGwgdGhlIHZlcmlmaWNhdGlvbiBhbmQgY2hlY2tpbmcgYXMgd2VsbCBhcyByZXBvcnRpbmcgc28gdGhhdAorICoJd2UgZG9uJ3QgZHVwbGljYXRlIGNvZGUgZm9yIGVhY2ggb3B0aW9uLgorICovCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB2ZWxvY2l0eV9zZXRfYm9vbF9vcHQodTMyICogb3B0LCBpbnQgdmFsLCBpbnQgZGVmLCB1MzIgZmxhZywgY2hhciAqbmFtZSwgY2hhciAqZGV2bmFtZSkKK3sKKwkoKm9wdCkgJj0gKH5mbGFnKTsKKwlpZiAodmFsID09IC0xKQorCQkqb3B0IHw9IChkZWYgPyBmbGFnIDogMCk7CisJZWxzZSBpZiAodmFsIDwgMCB8fCB2YWwgPiAxKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHRoZSB2YWx1ZSBvZiBwYXJhbWV0ZXIgJXMgaXMgaW52YWxpZCwgdGhlIHZhbGlkIHJhbmdlIGlzICgwLTEpXG4iLCAKKwkJCWRldm5hbWUsIG5hbWUpOworCQkqb3B0IHw9IChkZWYgPyBmbGFnIDogMCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNldCBwYXJhbWV0ZXIgJXMgdG8gJXNcbiIsIAorCQkJZGV2bmFtZSwgbmFtZSwgdmFsID8gIlRSVUUiIDogIkZBTFNFIik7CisJCSpvcHQgfD0gKHZhbCA/IGZsYWcgOiAwKTsKKwl9Cit9CisKKy8qKgorICoJdmVsb2NpdHlfZ2V0X29wdGlvbnMJLQlzZXQgb3B0aW9ucyBvbiBkZXZpY2UKKyAqCUBvcHRzOiBvcHRpb24gc3RydWN0dXJlIGZvciB0aGUgZGV2aWNlCisgKglAaW5kZXg6IGluZGV4IG9mIG9wdGlvbiB0byB1c2UgaW4gbW9kdWxlIG9wdGlvbnMgYXJyYXkKKyAqCUBkZXZuYW1lOiBkZXZpY2UgbmFtZQorICoKKyAqCVR1cm4gdGhlIG1vZHVsZSBhbmQgY29tbWFuZCBvcHRpb25zIGludG8gYSBzaW5nbGUgc3RydWN0dXJlCisgKglmb3IgdGhlIGN1cnJlbnQgZGV2aWNlCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHZlbG9jaXR5X2dldF9vcHRpb25zKHN0cnVjdCB2ZWxvY2l0eV9vcHQgKm9wdHMsIGludCBpbmRleCwgY2hhciAqZGV2bmFtZSkKK3sKKworCXZlbG9jaXR5X3NldF9pbnRfb3B0KCZvcHRzLT5yeF90aHJlc2gsIHJ4X3RocmVzaFtpbmRleF0sIFJYX1RIUkVTSF9NSU4sIFJYX1RIUkVTSF9NQVgsIFJYX1RIUkVTSF9ERUYsICJyeF90aHJlc2giLCBkZXZuYW1lKTsKKwl2ZWxvY2l0eV9zZXRfaW50X29wdCgmb3B0cy0+RE1BX2xlbmd0aCwgRE1BX2xlbmd0aFtpbmRleF0sIERNQV9MRU5HVEhfTUlOLCBETUFfTEVOR1RIX01BWCwgRE1BX0xFTkdUSF9ERUYsICJETUFfbGVuZ3RoIiwgZGV2bmFtZSk7CisJdmVsb2NpdHlfc2V0X2ludF9vcHQoJm9wdHMtPm51bXJ4LCBSeERlc2NyaXB0b3JzW2luZGV4XSwgUlhfREVTQ19NSU4sIFJYX0RFU0NfTUFYLCBSWF9ERVNDX0RFRiwgIlJ4RGVzY3JpcHRvcnMiLCBkZXZuYW1lKTsKKwl2ZWxvY2l0eV9zZXRfaW50X29wdCgmb3B0cy0+bnVtdHgsIFR4RGVzY3JpcHRvcnNbaW5kZXhdLCBUWF9ERVNDX01JTiwgVFhfREVTQ19NQVgsIFRYX0RFU0NfREVGLCAiVHhEZXNjcmlwdG9ycyIsIGRldm5hbWUpOworCXZlbG9jaXR5X3NldF9pbnRfb3B0KCZvcHRzLT52aWQsIFZJRF9zZXR0aW5nW2luZGV4XSwgVkxBTl9JRF9NSU4sIFZMQU5fSURfTUFYLCBWTEFOX0lEX0RFRiwgIlZJRF9zZXR0aW5nIiwgZGV2bmFtZSk7CisJdmVsb2NpdHlfc2V0X2Jvb2xfb3B0KCZvcHRzLT5mbGFncywgZW5hYmxlX3RhZ2dpbmdbaW5kZXhdLCBUQUdHSU5HX0RFRiwgVkVMT0NJVFlfRkxBR1NfVEFHR0lORywgImVuYWJsZV90YWdnaW5nIiwgZGV2bmFtZSk7CisJdmVsb2NpdHlfc2V0X2Jvb2xfb3B0KCZvcHRzLT5mbGFncywgdHhjc3VtX29mZmxvYWRbaW5kZXhdLCBUWF9DU1VNX0RFRiwgVkVMT0NJVFlfRkxBR1NfVFhfQ1NVTSwgInR4Y3N1bV9vZmZsb2FkIiwgZGV2bmFtZSk7CisJdmVsb2NpdHlfc2V0X2ludF9vcHQoJm9wdHMtPmZsb3dfY250bCwgZmxvd19jb250cm9sW2luZGV4XSwgRkxPV19DTlRMX01JTiwgRkxPV19DTlRMX01BWCwgRkxPV19DTlRMX0RFRiwgImZsb3dfY29udHJvbCIsIGRldm5hbWUpOworCXZlbG9jaXR5X3NldF9ib29sX29wdCgmb3B0cy0+ZmxhZ3MsIElQX2J5dGVfYWxpZ25baW5kZXhdLCBJUF9BTElHX0RFRiwgVkVMT0NJVFlfRkxBR1NfSVBfQUxJR04sICJJUF9ieXRlX2FsaWduIiwgZGV2bmFtZSk7CisJdmVsb2NpdHlfc2V0X2Jvb2xfb3B0KCZvcHRzLT5mbGFncywgVmFsUGt0TGVuW2luZGV4XSwgVkFMX1BLVF9MRU5fREVGLCBWRUxPQ0lUWV9GTEFHU19WQUxfUEtUX0xFTiwgIlZhbFBrdExlbiIsIGRldm5hbWUpOworCXZlbG9jaXR5X3NldF9pbnRfb3B0KChpbnQgKikgJm9wdHMtPnNwZF9kcHgsIHNwZWVkX2R1cGxleFtpbmRleF0sIE1FRF9MTktfTUlOLCBNRURfTE5LX01BWCwgTUVEX0xOS19ERUYsICJNZWRpYSBsaW5rIG1vZGUiLCBkZXZuYW1lKTsKKwl2ZWxvY2l0eV9zZXRfaW50X29wdCgoaW50ICopICZvcHRzLT53b2xfb3B0cywgd29sX29wdHNbaW5kZXhdLCBXT0xfT1BUX01JTiwgV09MX09QVF9NQVgsIFdPTF9PUFRfREVGLCAiV2FrZSBPbiBMYW4gb3B0aW9ucyIsIGRldm5hbWUpOworCXZlbG9jaXR5X3NldF9pbnRfb3B0KChpbnQgKikgJm9wdHMtPmludF93b3JrcywgaW50X3dvcmtzW2luZGV4XSwgSU5UX1dPUktTX01JTiwgSU5UX1dPUktTX01BWCwgSU5UX1dPUktTX0RFRiwgIkludGVycnVwdCBzZXJ2aWNlIHdvcmtzIiwgZGV2bmFtZSk7CisJb3B0cy0+bnVtcnggPSAob3B0cy0+bnVtcnggJiB+Myk7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfaW5pdF9jYW1fZmlsdGVyCS0JaW5pdGlhbGlzZSBDQU0KKyAqCUB2cHRyOiB2ZWxvY2l0eSB0byBwcm9ncmFtCisgKgorICoJSW5pdGlhbGl6ZSB0aGUgY29udGVudCBhZGRyZXNzYWJsZSBtZW1vcnkgdXNlZCBmb3IgZmlsdGVycy4gTG9hZAorICoJYXBwcm9wcmlhdGVseSBhY2NvcmRpbmcgdG8gdGhlIHByZXNlbmNlIG9mIFZMQU4KKyAqLworCitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9pbml0X2NhbV9maWx0ZXIoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzID0gdnB0ci0+bWFjX3JlZ3M7CisKKwkvKiBUdXJuIG9uIE1DRkdfUFFFTiwgdHVybiBvZmYgTUNGR19SVEdPUFQgKi8KKwlXT1JEX1JFR19CSVRTX1NFVChNQ0ZHX1BRRU4sIE1DRkdfUlRHT1BULCAmcmVncy0+TUNGRyk7CisJV09SRF9SRUdfQklUU19PTihNQ0ZHX1ZJREZSLCAmcmVncy0+TUNGRyk7CisKKwkvKiBEaXNhYmxlIGFsbCBDQU1zICovCisJbWVtc2V0KHZwdHItPnZDQU1tYXNrLCAwLCBzaXplb2YodTgpICogOCk7CisJbWVtc2V0KHZwdHItPm1DQU1tYXNrLCAwLCBzaXplb2YodTgpICogOCk7CisJbWFjX3NldF9jYW1fbWFzayhyZWdzLCB2cHRyLT52Q0FNbWFzaywgVkVMT0NJVFlfVkxBTl9JRF9DQU0pOworCW1hY19zZXRfY2FtX21hc2socmVncywgdnB0ci0+bUNBTW1hc2ssIFZFTE9DSVRZX01VTFRJQ0FTVF9DQU0pOworCisJLyogRW5hYmxlIGZpcnN0IFZDQU0gKi8KKwlpZiAodnB0ci0+ZmxhZ3MgJiBWRUxPQ0lUWV9GTEFHU19UQUdHSU5HKSB7CisJCS8qIElmIFRhZ2dpbmcgb3B0aW9uIGlzIGVuYWJsZWQgYW5kIFZMQU4gSUQgaXMgbm90IHplcm8sIHRoZW4KKwkJICAgdHVybiBvbiBNQ0ZHX1JUR09QVCBhbHNvICovCisJCWlmICh2cHRyLT5vcHRpb25zLnZpZCAhPSAwKQorCQkJV09SRF9SRUdfQklUU19PTihNQ0ZHX1JUR09QVCwgJnJlZ3MtPk1DRkcpOworCisJCW1hY19zZXRfY2FtKHJlZ3MsIDAsICh1OCAqKSAmICh2cHRyLT5vcHRpb25zLnZpZCksIFZFTE9DSVRZX1ZMQU5fSURfQ0FNKTsKKwkJdnB0ci0+dkNBTW1hc2tbMF0gfD0gMTsKKwkJbWFjX3NldF9jYW1fbWFzayhyZWdzLCB2cHRyLT52Q0FNbWFzaywgVkVMT0NJVFlfVkxBTl9JRF9DQU0pOworCX0gZWxzZSB7CisJCXUxNiB0ZW1wID0gMDsKKwkJbWFjX3NldF9jYW0ocmVncywgMCwgKHU4ICopICZ0ZW1wLCBWRUxPQ0lUWV9WTEFOX0lEX0NBTSk7CisJCXRlbXAgPSAxOworCQltYWNfc2V0X2NhbV9tYXNrKHJlZ3MsICh1OCAqKSAmdGVtcCwgVkVMT0NJVFlfVkxBTl9JRF9DQU0pOworCX0KK30KKworLyoqCisgKgl2ZWxvY2l0eV9yeF9yZXNldAktCWhhbmRsZSBhIHJlY2VpdmUgcmVzZXQKKyAqCUB2cHRyOiB2ZWxvY2l0eSB3ZSBhcmUgcmVzZXR0aW5nCisgKgorICoJUmVzZXQgdGhlIG93bmVyc2hpcCBhbmQgc3RhdHVzIGZvciB0aGUgcmVjZWl2ZSByaW5nIHNpZGUuCisgKglIYW5kIGFsbCB0aGUgcmVjZWl2ZSBxdWV1ZSB0byB0aGUgTklDLgorICovCisKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X3J4X3Jlc2V0KHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzID0gdnB0ci0+bWFjX3JlZ3M7CisJaW50IGk7CisKKwl2cHRyLT5yZF9kaXJ0eSA9IHZwdHItPnJkX2ZpbGxlZCA9IHZwdHItPnJkX2N1cnIgPSAwOworCisJLyoKKwkgKglJbml0IHN0YXRlLCBhbGwgUkQgZW50cmllcyBiZWxvbmcgdG8gdGhlIE5JQworCSAqLworCWZvciAoaSA9IDA7IGkgPCB2cHRyLT5vcHRpb25zLm51bXJ4OyArK2kpCisJCXZwdHItPnJkX3JpbmdbaV0ucmRlc2MwLm93bmVyID0gT1dORURfQllfTklDOworCisJd3JpdGV3KHZwdHItPm9wdGlvbnMubnVtcngsICZyZWdzLT5SQlJEVSk7CisJd3JpdGVsKHZwdHItPnJkX3Bvb2xfZG1hLCAmcmVncy0+UkRCYXNlTG8pOworCXdyaXRldygwLCAmcmVncy0+UkRJZHgpOworCXdyaXRldyh2cHRyLT5vcHRpb25zLm51bXJ4IC0gMSwgJnJlZ3MtPlJEQ1NpemUpOworfQorCisvKioKKyAqCXZlbG9jaXR5X2luaXRfcmVnaXN0ZXJzCS0JaW5pdGlhbGlzZSBNQUMgcmVnaXN0ZXJzCisgKglAdnB0cjogdmVsb2NpdHkgdG8gaW5pdAorICoJQHR5cGU6IHR5cGUgb2YgaW5pdGlhbGlzYXRpb24gKGhvdCBvciBjb2xkKQorICoKKyAqCUluaXRpYWxpc2UgdGhlIE1BQyBvbiBhIHJlc2V0IG9yIG9uIGZpcnN0IHNldCB1cCBvbiB0aGUKKyAqCWhhcmR3YXJlLgorICovCisKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X2luaXRfcmVnaXN0ZXJzKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLCAKKwkJCQkgICAgZW51bSB2ZWxvY2l0eV9pbml0X3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKwlpbnQgaSwgbWlpX3N0YXR1czsKKworCW1hY193b2xfcmVzZXQocmVncyk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFZFTE9DSVRZX0lOSVRfUkVTRVQ6CisJY2FzZSBWRUxPQ0lUWV9JTklUX1dPTDoKKworCQluZXRpZl9zdG9wX3F1ZXVlKHZwdHItPmRldik7CisKKwkJLyoKKwkJICoJUmVzZXQgUlggdG8gcHJldmVudCBSWCBwb2ludGVyIG5vdCBvbiB0aGUgNFggbG9jYXRpb24KKwkJICovCisJCXZlbG9jaXR5X3J4X3Jlc2V0KHZwdHIpOworCQltYWNfcnhfcXVldWVfcnVuKHJlZ3MpOworCQltYWNfcnhfcXVldWVfd2FrZShyZWdzKTsKKworCQltaWlfc3RhdHVzID0gdmVsb2NpdHlfZ2V0X29wdF9tZWRpYV9tb2RlKHZwdHIpOworCQlpZiAodmVsb2NpdHlfc2V0X21lZGlhX21vZGUodnB0ciwgbWlpX3N0YXR1cykgIT0gVkVMT0NJVFlfTElOS19DSEFOR0UpIHsKKwkJCXZlbG9jaXR5X3ByaW50X2xpbmtfc3RhdHVzKHZwdHIpOworCQkJaWYgKCEodnB0ci0+bWlpX3N0YXR1cyAmIFZFTE9DSVRZX0xJTktfRkFJTCkpCisJCQkJbmV0aWZfd2FrZV9xdWV1ZSh2cHRyLT5kZXYpOworCQl9CisKKwkJZW5hYmxlX2Zsb3dfY29udHJvbF9hYmlsaXR5KHZwdHIpOworCisJCW1hY19jbGVhcl9pc3IocmVncyk7CisJCXdyaXRlbChDUjBfU1RPUCwgJnJlZ3MtPkNSMENscik7CisJCXdyaXRlbCgoQ1IwX0RQT0xMIHwgQ1IwX1RYT04gfCBDUjBfUlhPTiB8IENSMF9TVFJUKSwgCisJCQkJCQkJJnJlZ3MtPkNSMFNldCk7CisKKwkJYnJlYWs7CisKKwljYXNlIFZFTE9DSVRZX0lOSVRfQ09MRDoKKwlkZWZhdWx0OgorCQkvKgorCQkgKglEbyByZXNldAorCQkgKi8KKwkJdmVsb2NpdHlfc29mdF9yZXNldCh2cHRyKTsKKwkJbWRlbGF5KDUpOworCisJCW1hY19lZXByb21fcmVsb2FkKHJlZ3MpOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCQl3cml0ZWIodnB0ci0+ZGV2LT5kZXZfYWRkcltpXSwgJihyZWdzLT5QQVJbaV0pKTsKKwkJfQorCQkvKgorCQkgKgljbGVhciBQcmVfQUNQSSBiaXQuCisJCSAqLworCQlCWVRFX1JFR19CSVRTX09GRihDRkdBX1BBQ1BJLCAmKHJlZ3MtPkNGR0EpKTsKKwkJbWFjX3NldF9yeF90aHJlc2gocmVncywgdnB0ci0+b3B0aW9ucy5yeF90aHJlc2gpOworCQltYWNfc2V0X2RtYV9sZW5ndGgocmVncywgdnB0ci0+b3B0aW9ucy5ETUFfbGVuZ3RoKTsKKworCQl3cml0ZWIoV09MQ0ZHX1NBTSB8IFdPTENGR19TQUIsICZyZWdzLT5XT0xDRkdTZXQpOworCQkvKgorCQkgKglCYWNrIG9mZiBhbGdvcml0aG0gdXNlIG9yaWdpbmFsIElFRUUgc3RhbmRhcmQKKwkJICovCisJCUJZVEVfUkVHX0JJVFNfU0VUKENGR0JfT0ZTRVQsIChDRkdCX0NSQU5ET00gfCBDRkdCX0NBUCB8IENGR0JfTUJBIHwgQ0ZHQl9CQUtPUFQpLCAmcmVncy0+Q0ZHQik7CisKKwkJLyoKKwkJICoJSW5pdCBDQU0gZmlsdGVyCisJCSAqLworCQl2ZWxvY2l0eV9pbml0X2NhbV9maWx0ZXIodnB0cik7CisKKwkJLyoKKwkJICoJU2V0IHBhY2tldCBmaWx0ZXI6IFJlY2VpdmUgZGlyZWN0ZWQgYW5kIGJyb2FkY2FzdCBhZGRyZXNzCisJCSAqLworCQl2ZWxvY2l0eV9zZXRfbXVsdGkodnB0ci0+ZGV2KTsKKworCQkvKgorCQkgKglFbmFibGUgTUlJIGF1dG8tcG9sbGluZworCQkgKi8KKwkJZW5hYmxlX21paV9hdXRvcG9sbChyZWdzKTsKKworCQl2cHRyLT5pbnRfbWFzayA9IElOVF9NQVNLX0RFRjsKKworCQl3cml0ZWwoY3B1X3RvX2xlMzIodnB0ci0+cmRfcG9vbF9kbWEpLCAmcmVncy0+UkRCYXNlTG8pOworCQl3cml0ZXcodnB0ci0+b3B0aW9ucy5udW1yeCAtIDEsICZyZWdzLT5SRENTaXplKTsKKwkJbWFjX3J4X3F1ZXVlX3J1bihyZWdzKTsKKwkJbWFjX3J4X3F1ZXVlX3dha2UocmVncyk7CisKKwkJd3JpdGV3KHZwdHItPm9wdGlvbnMubnVtdHggLSAxLCAmcmVncy0+VERDU2l6ZSk7CisKKwkJZm9yIChpID0gMDsgaSA8IHZwdHItPm51bV90eHE7IGkrKykgeworCQkJd3JpdGVsKGNwdV90b19sZTMyKHZwdHItPnRkX3Bvb2xfZG1hW2ldKSwgJihyZWdzLT5UREJhc2VMb1tpXSkpOworCQkJbWFjX3R4X3F1ZXVlX3J1bihyZWdzLCBpKTsKKwkJfQorCisJCWluaXRfZmxvd19jb250cm9sX3JlZ2lzdGVyKHZwdHIpOworCisJCXdyaXRlbChDUjBfU1RPUCwgJnJlZ3MtPkNSMENscik7CisJCXdyaXRlbCgoQ1IwX0RQT0xMIHwgQ1IwX1RYT04gfCBDUjBfUlhPTiB8IENSMF9TVFJUKSwgJnJlZ3MtPkNSMFNldCk7CisKKwkJbWlpX3N0YXR1cyA9IHZlbG9jaXR5X2dldF9vcHRfbWVkaWFfbW9kZSh2cHRyKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZSh2cHRyLT5kZXYpOworCisJCW1paV9pbml0KHZwdHIsIG1paV9zdGF0dXMpOworCisJCWlmICh2ZWxvY2l0eV9zZXRfbWVkaWFfbW9kZSh2cHRyLCBtaWlfc3RhdHVzKSAhPSBWRUxPQ0lUWV9MSU5LX0NIQU5HRSkgeworCQkJdmVsb2NpdHlfcHJpbnRfbGlua19zdGF0dXModnB0cik7CisJCQlpZiAoISh2cHRyLT5taWlfc3RhdHVzICYgVkVMT0NJVFlfTElOS19GQUlMKSkKKwkJCQluZXRpZl93YWtlX3F1ZXVlKHZwdHItPmRldik7CisJCX0KKworCQllbmFibGVfZmxvd19jb250cm9sX2FiaWxpdHkodnB0cik7CisJCW1hY19od19taWJzX2luaXQocmVncyk7CisJCW1hY193cml0ZV9pbnRfbWFzayh2cHRyLT5pbnRfbWFzaywgcmVncyk7CisJCW1hY19jbGVhcl9pc3IocmVncyk7CisKKwl9Cit9CisKKy8qKgorICoJdmVsb2NpdHlfc29mdF9yZXNldAktCXNvZnQgcmVzZXQKKyAqCUB2cHRyOiB2ZWxvY2l0eSB0byByZXNldAorICoKKyAqCUtpY2sgb2ZmIGEgc29mdCByZXNldCBvZiB0aGUgdmVsb2NpdHkgYWRhcHRlciBhbmQgdGhlbiBwb2xsCisgKgl1bnRpbCB0aGUgcmVzZXQgc2VxdWVuY2UgaGFzIGNvbXBsZXRlZCBiZWZvcmUgcmV0dXJuaW5nLgorICovCisKK3N0YXRpYyBpbnQgdmVsb2NpdHlfc29mdF9yZXNldChzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKwlpbnQgaSA9IDA7CisKKwl3cml0ZWwoQ1IwX1NGUlNULCAmcmVncy0+Q1IwU2V0KTsKKworCWZvciAoaSA9IDA7IGkgPCBXX01BWF9USU1FT1VUOyBpKyspIHsKKwkJdWRlbGF5KDUpOworCQlpZiAoIURXT1JEX1JFR19CSVRTX0lTX09OKENSMF9TRlJTVCwgJnJlZ3MtPkNSMFNldCkpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSBXX01BWF9USU1FT1VUKSB7CisJCXdyaXRlbChDUjBfRk9SU1JTVCwgJnJlZ3MtPkNSMFNldCk7CisJCS8qIEZJWE1FOiBQQ0kgUE9TVElORyAqLworCQkvKiBkZWxheSAybXMgKi8KKwkJbWRlbGF5KDIpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9mb3VuZDEJCS0Jc2V0IHVwIGRpc2NvdmVyZWQgdmVsb2NpdHkgY2FyZAorICoJQHBkZXY6IFBDSSBkZXZpY2UKKyAqCUBlbnQ6IFBDSSBkZXZpY2UgdGFibGUgZW50cnkgdGhhdCBtYXRjaGVkCisgKgorICoJQ29uZmlndXJlIGEgZGlzY292ZXJlZCBhZGFwdGVyIGZyb20gc2NyYXRjaC4gUmV0dXJuIGEgbmVnYXRpdmUKKyAqCWVycm5vIGVycm9yIGNvZGUgb24gZmFpbHVyZSBwYXRocy4KKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2ZWxvY2l0eV9mb3VuZDEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBmaXJzdCA9IDE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaTsKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mb190YmwgKmluZm8gPSAoc3RydWN0IHZlbG9jaXR5X2luZm9fdGJsICopIGVudC0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHI7CisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzOworCWludCByZXQgPSAtRU5PTUVNOworCisJaWYgKHZlbG9jaXR5X25pY3MgPj0gTUFYX1VOSVRTKSB7CisJCXByaW50ayhLRVJOX05PVElDRSBWRUxPQ0lUWV9OQU1FICI6IGFscmVhZHkgZm91bmQgJWQgTklDcy5cbiIsIAorCQkJCXZlbG9jaXR5X25pY3MpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHZlbG9jaXR5X2luZm8pKTsKKworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgVkVMT0NJVFlfTkFNRSAiOiBhbGxvY2F0ZSBuZXQgZGV2aWNlIGZhaWxlZC5cbiIpOworCQlnb3RvIG91dDsKKwl9CisJCisJLyogQ2hhaW4gaXQgYWxsIHRvZ2V0aGVyICovCisJCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisJdnB0ciA9IGRldi0+cHJpdjsKKworCisJaWYgKGZpcnN0KSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIFZlci4gJXNcbiIsIAorCQkJVkVMT0NJVFlfRlVMTF9EUlZfTkFNLCBWRUxPQ0lUWV9WRVJTSU9OKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzIFZJQSBOZXR3b3JraW5nIFRlY2hub2xvZ2llcywgSW5jLlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gIkNvcHlyaWdodCAoYykgMjAwNCBSZWQgSGF0IEluYy5cbiIpOworCQlmaXJzdCA9IDA7CisJfQorCisJdmVsb2NpdHlfaW5pdF9pbmZvKHBkZXYsIHZwdHIsIGluZm8pOworCisJdnB0ci0+ZGV2ID0gZGV2OworCisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisKKwlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0IDwgMCkgCisJCWdvdG8gZXJyX2ZyZWVfZGV2OworCisJcmV0ID0gdmVsb2NpdHlfZ2V0X3BjaV9pbmZvKHZwdHIsIHBkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBWRUxPQ0lUWV9OQU1FICI6IEZhaWxlZCB0byBmaW5kIFBDSSBkZXZpY2UuXG4iKTsKKwkJZ290byBlcnJfZGlzYWJsZTsKKwl9CisKKwlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIFZFTE9DSVRZX05BTUUpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBWRUxPQ0lUWV9OQU1FICI6IEZhaWxlZCB0byBmaW5kIFBDSSBkZXZpY2UuXG4iKTsKKwkJZ290byBlcnJfZGlzYWJsZTsKKwl9CisKKwlyZWdzID0gaW9yZW1hcCh2cHRyLT5tZW1hZGRyLCB2cHRyLT5pb19zaXplKTsKKwlpZiAocmVncyA9PSBOVUxMKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyX3JlbGVhc2VfcmVzOworCX0KKworCXZwdHItPm1hY19yZWdzID0gcmVnczsKKworCW1hY193b2xfcmVzZXQocmVncyk7CisKKwlkZXYtPmJhc2VfYWRkciA9IHZwdHItPmlvYWRkcjsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWRldi0+ZGV2X2FkZHJbaV0gPSByZWFkYigmcmVncy0+UEFSW2ldKTsKKworCisJdmVsb2NpdHlfZ2V0X29wdGlvbnMoJnZwdHItPm9wdGlvbnMsIHZlbG9jaXR5X25pY3MsIGRldi0+bmFtZSk7CisKKwkvKiAKKwkgKglNYXNrIG91dCB0aGUgb3B0aW9ucyBjYW5ub3QgYmUgc2V0IHRvIHRoZSBjaGlwCisJICovCisJIAorCXZwdHItPm9wdGlvbnMuZmxhZ3MgJj0gaW5mby0+ZmxhZ3M7CisKKwkvKgorCSAqCUVuYWJsZSB0aGUgY2hpcCBzcGVjaWZpZWQgY2FwYmlsaXRpZXMKKwkgKi8KKwkgCisJdnB0ci0+ZmxhZ3MgPSB2cHRyLT5vcHRpb25zLmZsYWdzIHwgKGluZm8tPmZsYWdzICYgMHhGRjAwMDAwMFVMKTsKKworCXZwdHItPndvbF9vcHRzID0gdnB0ci0+b3B0aW9ucy53b2xfb3B0czsKKwl2cHRyLT5mbGFncyB8PSBWRUxPQ0lUWV9GTEFHU19XT0xfRU5BQkxFRDsKKworCXZwdHItPnBoeV9pZCA9IE1JSV9HRVRfUEhZX0lEKHZwdHItPm1hY19yZWdzKTsKKworCWRldi0+aXJxID0gcGRldi0+aXJxOworCWRldi0+b3BlbiA9IHZlbG9jaXR5X29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB2ZWxvY2l0eV94bWl0OworCWRldi0+c3RvcCA9IHZlbG9jaXR5X2Nsb3NlOworCWRldi0+Z2V0X3N0YXRzID0gdmVsb2NpdHlfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gdmVsb2NpdHlfc2V0X211bHRpOworCWRldi0+ZG9faW9jdGwgPSB2ZWxvY2l0eV9pb2N0bDsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJnZlbG9jaXR5X2V0aHRvb2xfb3BzOworCWRldi0+Y2hhbmdlX210dSA9IHZlbG9jaXR5X2NoYW5nZV9tdHU7CisjaWZkZWYgIFZFTE9DSVRZX1pFUk9fQ09QWV9TVVBQT1JUCisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHOworI2VuZGlmCisKKwlpZiAodnB0ci0+ZmxhZ3MgJiBWRUxPQ0lUWV9GTEFHU19UWF9DU1VNKSB7CisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19DU1VNOworCX0KKworCXJldCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9pb3VubWFwOworCisJdmVsb2NpdHlfcHJpbnRfaW5mbyh2cHRyKTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKwkKKwkvKiBhbmQgbGVhdmUgdGhlIGNoaXAgcG93ZXJlZCBkb3duICovCisJCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDNob3QpOworI2lmZGVmIENPTkZJR19QTQorCXsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmVsb2NpdHlfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOworCQlsaXN0X2FkZCgmdnB0ci0+bGlzdCwgJnZlbG9jaXR5X2Rldl9saXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmVsb2NpdHlfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOworCX0KKyNlbmRpZgorCXZlbG9jaXR5X25pY3MrKzsKK291dDoKKwlyZXR1cm4gcmV0OworCitlcnJfaW91bm1hcDoKKwlpb3VubWFwKHJlZ3MpOworZXJyX3JlbGVhc2VfcmVzOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfZGlzYWJsZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CitlcnJfZnJlZV9kZXY6CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlnb3RvIG91dDsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9wcmludF9pbmZvCS0JcGVyIGRyaXZlciBkYXRhCisgKglAdnB0cjogdmVsb2NpdHkKKyAqCisgKglQcmludCBwZXIgZHJpdmVyIGRhdGEgYXMgdGhlIGtlcm5lbCBkcml2ZXIgZmluZHMgVmVsb2NpdHkKKyAqCWhhcmR3YXJlCisgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHZlbG9jaXR5X3ByaW50X2luZm8oc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHZwdHItPmRldjsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBnZXRfY2hpcF9uYW1lKHZwdHItPmNoaXBfaWQpKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogRXRoZXJuZXQgQWRkcmVzczogJTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg6JTIuMlhcbiIsIAorCQlkZXYtPm5hbWUsIAorCQlkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLCBkZXYtPmRldl9hZGRyWzJdLCAKKwkJZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfaW5pdF9pbmZvCS0JaW5pdCBwcml2YXRlIGRhdGEKKyAqCUBwZGV2OiBQQ0kgZGV2aWNlCisgKglAdnB0cjogVmVsb2NpdHkgaW5mbworICoJQGluZm86IEJvYXJkIHR5cGUKKyAqCisgKglTZXQgdXAgdGhlIGluaXRpYWwgdmVsb2NpdHlfaW5mbyBzdHJ1Y3QgZm9yIHRoZSBkZXZpY2UgdGhhdCBoYXMgYmVlbgorICoJZGlzY292ZXJlZC4KKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdmVsb2NpdHlfaW5pdF9pbmZvKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwgc3RydWN0IHZlbG9jaXR5X2luZm9fdGJsICppbmZvKQoreworCW1lbXNldCh2cHRyLCAwLCBzaXplb2Yoc3RydWN0IHZlbG9jaXR5X2luZm8pKTsKKworCXZwdHItPnBkZXYgPSBwZGV2OworCXZwdHItPmNoaXBfaWQgPSBpbmZvLT5jaGlwX2lkOworCXZwdHItPmlvX3NpemUgPSBpbmZvLT5pb19zaXplOworCXZwdHItPm51bV90eHEgPSBpbmZvLT50eHF1ZXVlOworCXZwdHItPm11bHRpY2FzdF9saW1pdCA9IE1DQU1fU0laRTsKKwlzcGluX2xvY2tfaW5pdCgmdnB0ci0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnZwdHItPmxpc3QpOworfQorCisvKioKKyAqCXZlbG9jaXR5X2dldF9wY2lfaW5mbwktCXJldHJpZXZlIFBDSSBpbmZvIGZvciBkZXZpY2UKKyAqCUB2cHRyOiB2ZWxvY2l0eSBkZXZpY2UKKyAqCUBwZGV2OiBQQ0kgZGV2aWNlIGl0IG1hdGNoZXMKKyAqCisgKglSZXRyaWV2ZSB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgZGF0YSB0aGF0IGludGVyZXN0cyB1cyBmcm9tCisgKgl0aGUga2VybmVsIFBDSSBsYXllcgorICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZlbG9jaXR5X2dldF9wY2lfaW5mbyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisKKwlpZihwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZ2cHRyLT5yZXZfaWQpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisJCQorCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJdnB0ci0+aW9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCXZwdHItPm1lbWFkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisJCisJaWYoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX0lPKSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlZ2lvbiAjMCBpcyBub3QgYW4gSS9PIHJlc291cmNlLCBhYm9ydGluZy5cbiIsCisJCQkJcGNpX25hbWUocGRldikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZigocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDEpICYgSU9SRVNPVVJDRV9JTykpCisJeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWdpb24gIzEgaXMgYW4gSS9PIHJlc291cmNlLCBhYm9ydGluZy5cbiIsCisJCQkJcGNpX25hbWUocGRldikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZihwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpIDwgMjU2KQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVnaW9uICMxIGlzIHRvbyBzbWFsbC5cbiIsIAorCQkJCXBjaV9uYW1lKHBkZXYpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXZwdHItPnBkZXYgPSBwZGV2OworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfaW5pdF9yaW5ncwktCXNldCB1cCBETUEgcmluZ3MKKyAqCUB2cHRyOiBWZWxvY2l0eSB0byBzZXQgdXAKKyAqCisgKglBbGxvY2F0ZSBQQ0kgbWFwcGVkIERNQSByaW5ncyBmb3IgdGhlIHJlY2VpdmUgYW5kIHRyYW5zbWl0IGxheWVyCisgKgl0byB1c2UuCisgKi8KKworc3RhdGljIGludCB2ZWxvY2l0eV9pbml0X3JpbmdzKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBwc2l6ZTsKKwl1bnNpZ25lZCBpbnQgdHNpemU7CisJZG1hX2FkZHJfdCBwb29sX2RtYTsKKwl1OCAqcG9vbDsKKworCS8qCisJICoJQWxsb2NhdGUgYWxsIFJEL1REIHJpbmdzIGEgc2luZ2xlIHBvb2wgCisJICovCisJIAorCXBzaXplID0gdnB0ci0+b3B0aW9ucy5udW1yeCAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYykgKyAKKwkJdnB0ci0+b3B0aW9ucy5udW10eCAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYykgKiB2cHRyLT5udW1fdHhxOworCisJLyoKKwkgKiBwY2lfYWxsb2NfY29uc2lzdGVudCgpIGZ1bGZpbGxzIHRoZSByZXF1aXJlbWVudCBmb3IgNjQgYnl0ZXMKKwkgKiBhbGlnbm1lbnQKKwkgKi8KKwlwb29sID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQodnB0ci0+cGRldiwgcHNpemUsICZwb29sX2RtYSk7CisKKwlpZiAocG9vbCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXMgOiBETUEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLlxuIiwgCisJCQkJCXZwdHItPmRldi0+bmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChwb29sLCAwLCBwc2l6ZSk7CisKKwl2cHRyLT5yZF9yaW5nID0gKHN0cnVjdCByeF9kZXNjICopIHBvb2w7CisKKwl2cHRyLT5yZF9wb29sX2RtYSA9IHBvb2xfZG1hOworCisJdHNpemUgPSB2cHRyLT5vcHRpb25zLm51bXR4ICogUEtUX0JVRl9TWiAqIHZwdHItPm51bV90eHE7CisJdnB0ci0+dHhfYnVmcyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHZwdHItPnBkZXYsIHRzaXplLCAKKwkJCQkJCSZ2cHRyLT50eF9idWZzX2RtYSk7CisKKwlpZiAodnB0ci0+dHhfYnVmcyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IERNQSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXG4iLCAKKwkJCQkJdnB0ci0+ZGV2LT5uYW1lKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudCh2cHRyLT5wZGV2LCBwc2l6ZSwgcG9vbCwgcG9vbF9kbWEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQodnB0ci0+dHhfYnVmcywgMCwgdnB0ci0+b3B0aW9ucy5udW10eCAqIFBLVF9CVUZfU1ogKiB2cHRyLT5udW1fdHhxKTsKKworCWkgPSB2cHRyLT5vcHRpb25zLm51bXJ4ICogc2l6ZW9mKHN0cnVjdCByeF9kZXNjKTsKKwlwb29sICs9IGk7CisJcG9vbF9kbWEgKz0gaTsKKwlmb3IgKGkgPSAwOyBpIDwgdnB0ci0+bnVtX3R4cTsgaSsrKSB7CisJCWludCBvZmZzZXQgPSB2cHRyLT5vcHRpb25zLm51bXR4ICogc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKTsKKworCQl2cHRyLT50ZF9wb29sX2RtYVtpXSA9IHBvb2xfZG1hOworCQl2cHRyLT50ZF9yaW5nc1tpXSA9IChzdHJ1Y3QgdHhfZGVzYyAqKSBwb29sOworCQlwb29sICs9IG9mZnNldDsKKwkJcG9vbF9kbWEgKz0gb2Zmc2V0OworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9mcmVlX3JpbmdzCS0JZnJlZSBQQ0kgcmluZyBwb2ludGVycworICoJQHZwdHI6IFZlbG9jaXR5IHRvIGZyZWUgZnJvbQorICoKKyAqCUNsZWFuIHVwIHRoZSBQQ0kgcmluZyBidWZmZXJzIGFsbG9jYXRlZCB0byB0aGlzIHZlbG9jaXR5LgorICovCisKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X2ZyZWVfcmluZ3Moc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJaW50IHNpemU7CisKKwlzaXplID0gdnB0ci0+b3B0aW9ucy5udW1yeCAqIHNpemVvZihzdHJ1Y3QgcnhfZGVzYykgKyAKKwkgICAgICAgdnB0ci0+b3B0aW9ucy5udW10eCAqIHNpemVvZihzdHJ1Y3QgdHhfZGVzYykgKiB2cHRyLT5udW1fdHhxOworCisJcGNpX2ZyZWVfY29uc2lzdGVudCh2cHRyLT5wZGV2LCBzaXplLCB2cHRyLT5yZF9yaW5nLCB2cHRyLT5yZF9wb29sX2RtYSk7CisKKwlzaXplID0gdnB0ci0+b3B0aW9ucy5udW10eCAqIFBLVF9CVUZfU1ogKiB2cHRyLT5udW1fdHhxOworCisJcGNpX2ZyZWVfY29uc2lzdGVudCh2cHRyLT5wZGV2LCBzaXplLCB2cHRyLT50eF9idWZzLCB2cHRyLT50eF9idWZzX2RtYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2ZWxvY2l0eV9naXZlX21hbnlfcnhfZGVzY3Moc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKnJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKwlpbnQgYXZhaWwsIGRpcnR5LCB1bnVzYWJsZTsKKworCS8qCisJICogUkQgbnVtYmVyIG11c3QgYmUgZXF1YWwgdG8gNFggcGVyIGhhcmR3YXJlIHNwZWMKKwkgKiAocHJvZ3JhbW1pbmcgZ3VpZGUgcmV2IDEuMjAsIHAuMTMpCisJICovCisJaWYgKHZwdHItPnJkX2ZpbGxlZCA8IDQpCisJCXJldHVybjsKKworCXdtYigpOworCisJdW51c2FibGUgPSB2cHRyLT5yZF9maWxsZWQgJiAweDAwMDM7CisJZGlydHkgPSB2cHRyLT5yZF9kaXJ0eSAtIHVudXNhYmxlOworCWZvciAoYXZhaWwgPSB2cHRyLT5yZF9maWxsZWQgJiAweGZmZmM7IGF2YWlsOyBhdmFpbC0tKSB7CisJCWRpcnR5ID0gKGRpcnR5ID4gMCkgPyBkaXJ0eSAtIDEgOiB2cHRyLT5vcHRpb25zLm51bXJ4IC0gMTsKKwkJdnB0ci0+cmRfcmluZ1tkaXJ0eV0ucmRlc2MwLm93bmVyID0gT1dORURfQllfTklDOworCX0KKworCXdyaXRldyh2cHRyLT5yZF9maWxsZWQgJiAweGZmZmMsICZyZWdzLT5SQlJEVSk7CisJdnB0ci0+cmRfZmlsbGVkID0gdW51c2FibGU7Cit9CisKK3N0YXRpYyBpbnQgdmVsb2NpdHlfcnhfcmVmaWxsKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCWludCBkaXJ0eSA9IHZwdHItPnJkX2RpcnR5LCBkb25lID0gMCwgcmV0ID0gMDsKKworCWRvIHsKKwkJc3RydWN0IHJ4X2Rlc2MgKnJkID0gdnB0ci0+cmRfcmluZyArIGRpcnR5OworCisJCS8qIEZpbmUgZm9yIGFuIGFsbCB6ZXJvIFJ4IGRlc2MgYXQgaW5pdCB0aW1lIGFzIHdlbGwgKi8KKwkJaWYgKHJkLT5yZGVzYzAub3duZXIgPT0gT1dORURfQllfTklDKQorCQkJYnJlYWs7CisKKwkJaWYgKCF2cHRyLT5yZF9pbmZvW2RpcnR5XS5za2IpIHsKKwkJCXJldCA9IHZlbG9jaXR5X2FsbG9jX3J4X2J1Zih2cHRyLCBkaXJ0eSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlicmVhazsKKwkJfQorCQlkb25lKys7CisJCWRpcnR5ID0gKGRpcnR5IDwgdnB0ci0+b3B0aW9ucy5udW1yeCAtIDEpID8gZGlydHkgKyAxIDogMDsJCisJfSB3aGlsZSAoZGlydHkgIT0gdnB0ci0+cmRfY3Vycik7CisKKwlpZiAoZG9uZSkgeworCQl2cHRyLT5yZF9kaXJ0eSA9IGRpcnR5OworCQl2cHRyLT5yZF9maWxsZWQgKz0gZG9uZTsKKwkJdmVsb2NpdHlfZ2l2ZV9tYW55X3J4X2Rlc2NzKHZwdHIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfaW5pdF9yZF9yaW5nCS0Jc2V0IHVwIHJlY2VpdmUgcmluZworICoJQHZwdHI6IHZlbG9jaXR5IHRvIGNvbmZpZ3VyZQorICoKKyAqCUFsbG9jYXRlIGFuZCBzZXQgdXAgdGhlIHJlY2VpdmUgYnVmZmVycyBmb3IgZWFjaCByaW5nIHNsb3QgYW5kCisgKglhc3NpZ24gdGhlbSB0byB0aGUgbmV0d29yayBhZGFwdGVyLgorICovCisKK3N0YXRpYyBpbnQgdmVsb2NpdHlfaW5pdF9yZF9yaW5nKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCWludCByZXQgPSAtRU5PTUVNOworCXVuc2lnbmVkIGludCByc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdmVsb2NpdHlfcmRfaW5mbykgKiAKKwkJCQkJdnB0ci0+b3B0aW9ucy5udW1yeDsKKworCXZwdHItPnJkX2luZm8gPSBrbWFsbG9jKHJzaXplLCBHRlBfS0VSTkVMKTsKKwlpZih2cHRyLT5yZF9pbmZvID09IE5VTEwpCisJCWdvdG8gb3V0OworCW1lbXNldCh2cHRyLT5yZF9pbmZvLCAwLCByc2l6ZSk7CisKKwl2cHRyLT5yZF9maWxsZWQgPSB2cHRyLT5yZF9kaXJ0eSA9IHZwdHItPnJkX2N1cnIgPSAwOworCisJcmV0ID0gdmVsb2NpdHlfcnhfcmVmaWxsKHZwdHIpOworCWlmIChyZXQgPCAwKSB7CisJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfRVJSLCBLRVJOX0VSUgorCQkJIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgUlggYnVmZmVyLlxuIiwgdnB0ci0+ZGV2LT5uYW1lKTsKKwkJdmVsb2NpdHlfZnJlZV9yZF9yaW5nKHZwdHIpOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqCXZlbG9jaXR5X2ZyZWVfcmRfcmluZwktCWZyZWUgcmVjZWl2ZSByaW5nCisgKglAdnB0cjogdmVsb2NpdHkgdG8gY2xlYW4gdXAKKyAqCisgKglGcmVlIHRoZSByZWNlaXZlIGJ1ZmZlcnMgZm9yIGVhY2ggcmluZyBzbG90IGFuZCBhbnkKKyAqCWF0dGFjaGVkIHNvY2tldCBidWZmZXJzIHRoYXQgbmVlZCB0byBnbyBhd2F5LgorICovCisKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X2ZyZWVfcmRfcmluZyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKwlpbnQgaTsKKworCWlmICh2cHRyLT5yZF9pbmZvID09IE5VTEwpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCB2cHRyLT5vcHRpb25zLm51bXJ4OyBpKyspIHsKKwkJc3RydWN0IHZlbG9jaXR5X3JkX2luZm8gKnJkX2luZm8gPSAmKHZwdHItPnJkX2luZm9baV0pOworCisJCWlmICghcmRfaW5mby0+c2tiKQorCQkJY29udGludWU7CisJCXBjaV91bm1hcF9zaW5nbGUodnB0ci0+cGRldiwgcmRfaW5mby0+c2tiX2RtYSwgdnB0ci0+cnhfYnVmX3N6LAorCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlyZF9pbmZvLT5za2JfZG1hID0gKGRtYV9hZGRyX3QpIE5VTEw7CisKKwkJZGV2X2tmcmVlX3NrYihyZF9pbmZvLT5za2IpOworCQlyZF9pbmZvLT5za2IgPSBOVUxMOworCX0KKworCWtmcmVlKHZwdHItPnJkX2luZm8pOworCXZwdHItPnJkX2luZm8gPSBOVUxMOworfQorCisvKioKKyAqCXZlbG9jaXR5X2luaXRfdGRfcmluZwktCXNldCB1cCB0cmFuc21pdCByaW5nCisgKglAdnB0cjoJdmVsb2NpdHkKKyAqCisgKglTZXQgdXAgdGhlIHRyYW5zbWl0IHJpbmcgYW5kIGNoYWluIHRoZSByaW5nIHBvaW50ZXJzIHRvZ2V0aGVyLgorICoJUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBwb3NpeCBlcnJubyBjb2RlIGZvcgorICoJZmFpbHVyZS4KKyAqLworIAorc3RhdGljIGludCB2ZWxvY2l0eV9pbml0X3RkX3Jpbmcoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJaW50IGksIGo7CisJZG1hX2FkZHJfdCBjdXJyOworCXN0cnVjdCB0eF9kZXNjICp0ZDsKKwlzdHJ1Y3QgdmVsb2NpdHlfdGRfaW5mbyAqdGRfaW5mbzsKKwl1bnNpZ25lZCBpbnQgdHNpemUgPSBzaXplb2Yoc3RydWN0IHZlbG9jaXR5X3RkX2luZm8pICogCisJCQkJCXZwdHItPm9wdGlvbnMubnVtdHg7CisKKwkvKiBJbml0IHRoZSBURCByaW5nIGVudHJpZXMgKi8KKwlmb3IgKGogPSAwOyBqIDwgdnB0ci0+bnVtX3R4cTsgaisrKSB7CisJCWN1cnIgPSB2cHRyLT50ZF9wb29sX2RtYVtqXTsKKworCQl2cHRyLT50ZF9pbmZvc1tqXSA9IGttYWxsb2ModHNpemUsIEdGUF9LRVJORUwpOworCQlpZih2cHRyLT50ZF9pbmZvc1tqXSA9PSBOVUxMKQorCQl7CisJCQl3aGlsZSgtLWogPj0gMCkKKwkJCQlrZnJlZSh2cHRyLT50ZF9pbmZvc1tqXSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQltZW1zZXQodnB0ci0+dGRfaW5mb3Nbal0sIDAsIHRzaXplKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgdnB0ci0+b3B0aW9ucy5udW10eDsgaSsrLCBjdXJyICs9IHNpemVvZihzdHJ1Y3QgdHhfZGVzYykpIHsKKwkJCXRkID0gJih2cHRyLT50ZF9yaW5nc1tqXVtpXSk7CisJCQl0ZF9pbmZvID0gJih2cHRyLT50ZF9pbmZvc1tqXVtpXSk7CisJCQl0ZF9pbmZvLT5idWYgPSB2cHRyLT50eF9idWZzICsKKwkJCQkoaiAqIHZwdHItPm9wdGlvbnMubnVtdHggKyBpKSAqIFBLVF9CVUZfU1o7CisJCQl0ZF9pbmZvLT5idWZfZG1hID0gdnB0ci0+dHhfYnVmc19kbWEgKworCQkJCShqICogdnB0ci0+b3B0aW9ucy5udW10eCArIGkpICogUEtUX0JVRl9TWjsKKwkJfQorCQl2cHRyLT50ZF90YWlsW2pdID0gdnB0ci0+dGRfY3VycltqXSA9IHZwdHItPnRkX3VzZWRbal0gPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCUZJWE1FOiBjb3VsZCB3ZSBtZXJnZSB0aGlzIHdpdGggdmVsb2NpdHlfZnJlZV90eF9idWYgPworICovCisKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X2ZyZWVfdGRfcmluZ19lbnRyeShzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwKKwkJCQkJCQkgaW50IHEsIGludCBuKQoreworCXN0cnVjdCB2ZWxvY2l0eV90ZF9pbmZvICogdGRfaW5mbyA9ICYodnB0ci0+dGRfaW5mb3NbcV1bbl0pOworCWludCBpOworCQorCWlmICh0ZF9pbmZvID09IE5VTEwpCisJCXJldHVybjsKKwkJCisJaWYgKHRkX2luZm8tPnNrYikgeworCQlmb3IgKGkgPSAwOyBpIDwgdGRfaW5mby0+bnNrYl9kbWE7IGkrKykKKwkJeworCQkJaWYgKHRkX2luZm8tPnNrYl9kbWFbaV0pIHsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHZwdHItPnBkZXYsIHRkX2luZm8tPnNrYl9kbWFbaV0sIAorCQkJCQl0ZF9pbmZvLT5za2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJdGRfaW5mby0+c2tiX2RtYVtpXSA9IChkbWFfYWRkcl90KSBOVUxMOworCQkJfQorCQl9CisJCWRldl9rZnJlZV9za2IodGRfaW5mby0+c2tiKTsKKwkJdGRfaW5mby0+c2tiID0gTlVMTDsKKwl9Cit9CisKKy8qKgorICoJdmVsb2NpdHlfZnJlZV90ZF9yaW5nCS0JZnJlZSB0ZCByaW5nCisgKglAdnB0cjogdmVsb2NpdHkKKyAqCisgKglGcmVlIHVwIHRoZSB0cmFuc21pdCByaW5nIGZvciB0aGlzIHBhcnRpY3VsYXIgdmVsb2NpdHkgYWRhcHRlci4KKyAqCVdlIGZyZWUgdGhlIHJpbmcgY29udGVudHMgYnV0IG5vdCB0aGUgcmluZyBpdHNlbGYuCisgKi8KKyAKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X2ZyZWVfdGRfcmluZyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKwlpbnQgaSwgajsKKworCWZvciAoaiA9IDA7IGogPCB2cHRyLT5udW1fdHhxOyBqKyspIHsKKwkJaWYgKHZwdHItPnRkX2luZm9zW2pdID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJZm9yIChpID0gMDsgaSA8IHZwdHItPm9wdGlvbnMubnVtdHg7IGkrKykgeworCQkJdmVsb2NpdHlfZnJlZV90ZF9yaW5nX2VudHJ5KHZwdHIsIGosIGkpOworCisJCX0KKwkJaWYgKHZwdHItPnRkX2luZm9zW2pdKSB7CisJCQlrZnJlZSh2cHRyLT50ZF9pbmZvc1tqXSk7CisJCQl2cHRyLT50ZF9pbmZvc1tqXSA9IE5VTEw7CisJCX0KKwl9Cit9CisKKy8qKgorICoJdmVsb2NpdHlfcnhfc3J2CQktCXNlcnZpY2UgUlggaW50ZXJydXB0CisgKglAdnB0cjogdmVsb2NpdHkKKyAqCUBzdGF0dXM6IGFkYXB0ZXIgc3RhdHVzICh1bnVzZWQpCisgKgorICoJV2FsayB0aGUgcmVjZWl2ZSByaW5nIG9mIHRoZSB2ZWxvY2l0eSBhZGFwdGVyIGFuZCByZW1vdmUKKyAqCWFueSByZWNlaXZlZCBwYWNrZXRzIGZyb20gdGhlIHJlY2VpdmUgcXVldWUuIEhhbmQgdGhlIHJpbmcKKyAqCXNsb3RzIGJhY2sgdG8gdGhlIGFkYXB0ZXIgZm9yIHJldXNlLgorICovCisgCitzdGF0aWMgaW50IHZlbG9jaXR5X3J4X3NydihzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwgaW50IHN0YXR1cykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmdnB0ci0+c3RhdHM7CisJaW50IHJkX2N1cnIgPSB2cHRyLT5yZF9jdXJyOworCWludCB3b3JrcyA9IDA7CisKKwlkbyB7CisJCXN0cnVjdCByeF9kZXNjICpyZCA9IHZwdHItPnJkX3JpbmcgKyByZF9jdXJyOworCisJCWlmICghdnB0ci0+cmRfaW5mb1tyZF9jdXJyXS5za2IpCisJCQlicmVhazsKKworCQlpZiAocmQtPnJkZXNjMC5vd25lciA9PSBPV05FRF9CWV9OSUMpCisJCQlicmVhazsKKworCQlybWIoKTsKKworCQkvKgorCQkgKglEb24ndCBkcm9wIENFIG9yIFJMIGVycm9yIGZyYW1lIGFsdGhvdWdoIFJYT0sgaXMgb2ZmCisJCSAqLworCQlpZiAoKHJkLT5yZGVzYzAuUlNSICYgUlNSX1JYT0spIHx8ICghKHJkLT5yZGVzYzAuUlNSICYgUlNSX1JYT0spICYmIChyZC0+cmRlc2MwLlJTUiAmIChSU1JfQ0UgfCBSU1JfUkwpKSkpIHsKKwkJCWlmICh2ZWxvY2l0eV9yZWNlaXZlX2ZyYW1lKHZwdHIsIHJkX2N1cnIpIDwgMCkKKwkJCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCQl9IGVsc2UgeworCQkJaWYgKHJkLT5yZGVzYzAuUlNSICYgUlNSX0NSQykKKwkJCQlzdGF0cy0+cnhfY3JjX2Vycm9ycysrOworCQkJaWYgKHJkLT5yZGVzYzAuUlNSICYgUlNSX0ZBRSkKKwkJCQlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzKys7CisKKwkJCXN0YXRzLT5yeF9kcm9wcGVkKys7CisJCX0KKworCQlyZC0+aW50ZW4gPSAxOworCisJCXZwdHItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisKKwkJcmRfY3VycisrOworCQlpZiAocmRfY3VyciA+PSB2cHRyLT5vcHRpb25zLm51bXJ4KQorCQkJcmRfY3VyciA9IDA7CisJfSB3aGlsZSAoKyt3b3JrcyA8PSAxNSk7CisKKwl2cHRyLT5yZF9jdXJyID0gcmRfY3VycjsKKworCWlmICh3b3JrcyA+IDAgJiYgdmVsb2NpdHlfcnhfcmVmaWxsKHZwdHIpIDwgMCkgeworCQlWRUxPQ0lUWV9QUlQoTVNHX0xFVkVMX0VSUiwgS0VSTl9FUlIKKwkJCSIlczogcnggYnVmIGFsbG9jYXRpb24gZmFpbHVyZVxuIiwgdnB0ci0+ZGV2LT5uYW1lKTsKKwl9CisKKwlWQVJfVVNFRChzdGF0cyk7CisJcmV0dXJuIHdvcmtzOworfQorCisvKioKKyAqCXZlbG9jaXR5X3J4X2NzdW0JLQljaGVja3N1bSBwcm9jZXNzCisgKglAcmQ6IHJlY2VpdmUgcGFja2V0IGRlc2NyaXB0b3IKKyAqCUBza2I6IG5ldHdvcmsgbGF5ZXIgcGFja2V0IGJ1ZmZlcgorICoKKyAqCVByb2Nlc3MgdGhlIHN0YXR1cyBiaXRzIGZvciB0aGUgcmVjZWl2ZWQgcGFja2V0IGFuZCBkZXRlcm1pbmUKKyAqCWlmIHRoZSBjaGVja3N1bSB3YXMgY29tcHV0ZWQgYW5kIHZlcmlmaWVkIGJ5IHRoZSBoYXJkd2FyZQorICovCisgCitzdGF0aWMgaW5saW5lIHZvaWQgdmVsb2NpdHlfcnhfY3N1bShzdHJ1Y3QgcnhfZGVzYyAqcmQsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCisJaWYgKHJkLT5yZGVzYzEuQ1NNICYgQ1NNX0lQS1QpIHsKKwkJaWYgKHJkLT5yZGVzYzEuQ1NNICYgQ1NNX0lQT0spIHsKKwkJCWlmICgocmQtPnJkZXNjMS5DU00gJiBDU01fVENQS1QpIHx8IAorCQkJCQkocmQtPnJkZXNjMS5DU00gJiBDU01fVURQS1QpKSB7CisJCQkJaWYgKCEocmQtPnJkZXNjMS5DU00gJiBDU01fVFVQT0spKSB7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCQl9CisJfQorfQorCisvKioKKyAqCXZlbG9jaXR5X3J4X2NvcHkJLQlpbiBwbGFjZSBSeCBjb3B5IGZvciBzbWFsbCBwYWNrZXRzCisgKglAcnhfc2tiOiBuZXR3b3JrIGxheWVyIHBhY2tldCBidWZmZXIgY2FuZGlkYXRlCisgKglAcGt0X3NpemU6IHJlY2VpdmVkIGRhdGEgc2l6ZQorICoJQHJkOiByZWNlaXZlIHBhY2tldCBkZXNjcmlwdG9yCisgKglAZGV2OiBuZXR3b3JrIGRldmljZQorICoKKyAqCVJlcGxhY2UgdGhlIGN1cnJlbnQgc2tiIHRoYXQgaXMgc2NoZWR1bGVkIGZvciBSeCBwcm9jZXNzaW5nIGJ5IGEKKyAqCXNob3J0ZXIsIGltbWVkaWF0bHkgYWxsb2NhdGVkIHNrYiwgaWYgdGhlIHJlY2VpdmVkIHBhY2tldCBpcyBzbWFsbAorICoJZW5vdWdoLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGUgcmVjZWl2ZWQKKyAqCXBhY2tldCBpcyB0b28gYmlnIG9yIGlmIG1lbW9yeSBpcyBleGhhdXN0ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHZlbG9jaXR5X3J4X2NvcHkoc3RydWN0IHNrX2J1ZmYgKipyeF9za2IsIGludCBwa3Rfc2l6ZSwKKwkJCQkgICBzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKwlpbnQgcmV0ID0gLTE7CisKKwlpZiAocGt0X3NpemUgPCByeF9jb3B5YnJlYWspIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisKKwkJbmV3X3NrYiA9IGRldl9hbGxvY19za2IocGt0X3NpemUgKyAyKTsKKwkJaWYgKG5ld19za2IpIHsKKwkJCW5ld19za2ItPmRldiA9IHZwdHItPmRldjsKKwkJCW5ld19za2ItPmlwX3N1bW1lZCA9IHJ4X3NrYlswXS0+aXBfc3VtbWVkOworCisJCQlpZiAodnB0ci0+ZmxhZ3MgJiBWRUxPQ0lUWV9GTEFHU19JUF9BTElHTikKKwkJCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCAyKTsKKworCQkJbWVtY3B5KG5ld19za2ItPmRhdGEsIHJ4X3NrYlswXS0+dGFpbCwgcGt0X3NpemUpOworCQkJKnJ4X3NrYiA9IG5ld19za2I7CisJCQlyZXQgPSAwOworCQl9CisJCQorCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqCXZlbG9jaXR5X2lwaF9yZWFsaWduCS0JSVAgaGVhZGVyIGFsaWdubWVudAorICoJQHZwdHI6IHZlbG9jaXR5IHdlIGFyZSBoYW5kbGluZworICoJQHNrYjogbmV0d29yayBsYXllciBwYWNrZXQgYnVmZmVyCisgKglAcGt0X3NpemU6IHJlY2VpdmVkIGRhdGEgc2l6ZQorICoKKyAqCUFsaWduIElQIGhlYWRlciBvbiBhIDIgYnl0ZXMgYm91bmRhcnkuIFRoaXMgYmVoYXZpb3IgY2FuIGJlCisgKgljb25maWd1cmVkIGJ5IHRoZSB1c2VyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdmVsb2NpdHlfaXBoX3JlYWxpZ24oc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIsCisJCQkJCXN0cnVjdCBza19idWZmICpza2IsIGludCBwa3Rfc2l6ZSkKK3sKKwkvKiBGSVhNRSAtIG1lbW1vdmUgPyAqLworCWlmICh2cHRyLT5mbGFncyAmIFZFTE9DSVRZX0ZMQUdTX0lQX0FMSUdOKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IHBrdF9zaXplOyBpID49IDA7IGktLSkKKwkJCSooc2tiLT5kYXRhICsgaSArIDIpID0gKihza2ItPmRhdGEgKyBpKTsKKwkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwl9Cit9CisKKy8qKgorICoJdmVsb2NpdHlfcmVjZWl2ZV9mcmFtZQktCXJlY2VpdmVkIHBhY2tldCBwcm9jZXNzb3IKKyAqCUB2cHRyOiB2ZWxvY2l0eSB3ZSBhcmUgaGFuZGxpbmcKKyAqCUBpZHg6IHJpbmcgaW5kZXgKKyAqCQorICoJQSBwYWNrZXQgaGFzIGFycml2ZWQuIFdlIHByb2Nlc3MgdGhlIHBhY2tldCBhbmQgaWYgYXBwcm9wcmlhdGUKKyAqCXBhc3MgdGhlIGZyYW1lIHVwIHRoZSBuZXR3b3JrIHN0YWNrCisgKi8KKyAKK3N0YXRpYyBpbnQgdmVsb2NpdHlfcmVjZWl2ZV9mcmFtZShzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwgaW50IGlkeCkKK3sKKwl2b2lkICgqcGNpX2FjdGlvbikoc3RydWN0IHBjaV9kZXYgKiwgZG1hX2FkZHJfdCwgc2l6ZV90LCBpbnQpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZ2cHRyLT5zdGF0czsKKwlzdHJ1Y3QgdmVsb2NpdHlfcmRfaW5mbyAqcmRfaW5mbyA9ICYodnB0ci0+cmRfaW5mb1tpZHhdKTsKKwlzdHJ1Y3QgcnhfZGVzYyAqcmQgPSAmKHZwdHItPnJkX3JpbmdbaWR4XSk7CisJaW50IHBrdF9sZW4gPSByZC0+cmRlc2MwLmxlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJaWYgKHJkLT5yZGVzYzAuUlNSICYgKFJTUl9TVFAgfCBSU1JfRURQKSkgeworCQlWRUxPQ0lUWV9QUlQoTVNHX0xFVkVMX1ZFUkJPU0UsIEtFUk5fRVJSICIgJXMgOiB0aGUgcmVjZWl2ZWQgZnJhbWUgc3BhbiBtdWx0cGxlIFJEcy5cbiIsIHZwdHItPmRldi0+bmFtZSk7CisJCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzKys7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChyZC0+cmRlc2MwLlJTUiAmIFJTUl9NQVIpCisJCXZwdHItPnN0YXRzLm11bHRpY2FzdCsrOworCisJc2tiID0gcmRfaW5mby0+c2tiOworCXNrYi0+ZGV2ID0gdnB0ci0+ZGV2OworCisJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHZwdHItPnBkZXYsIHJkX2luZm8tPnNrYl9kbWEsCisJCQkJICAgIHZwdHItPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCS8qCisJICoJRHJvcCBmcmFtZSBub3QgbWVldGluZyBJRUVFIDgwMi4zCisJICovCisJIAorCWlmICh2cHRyLT5mbGFncyAmIFZFTE9DSVRZX0ZMQUdTX1ZBTF9QS1RfTEVOKSB7CisJCWlmIChyZC0+cmRlc2MwLlJTUiAmIFJTUl9STCkgeworCQkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJcGNpX2FjdGlvbiA9IHBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZTsKKworCXZlbG9jaXR5X3J4X2NzdW0ocmQsIHNrYik7CisKKwlpZiAodmVsb2NpdHlfcnhfY29weSgmc2tiLCBwa3RfbGVuLCB2cHRyKSA8IDApIHsKKwkJdmVsb2NpdHlfaXBoX3JlYWxpZ24odnB0ciwgc2tiLCBwa3RfbGVuKTsKKwkJcGNpX2FjdGlvbiA9IHBjaV91bm1hcF9zaW5nbGU7CisJCXJkX2luZm8tPnNrYiA9IE5VTEw7CisJfQorCisJcGNpX2FjdGlvbih2cHRyLT5wZGV2LCByZF9pbmZvLT5za2JfZG1hLCB2cHRyLT5yeF9idWZfc3osCisJCSAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwlza2JfcHV0KHNrYiwgcGt0X2xlbiAtIDQpOworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHNrYi0+ZGV2KTsJCisKKwlzdGF0cy0+cnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwluZXRpZl9yeChza2IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfYWxsb2NfcnhfYnVmCS0JYWxsb2NhdGUgYWxpZ25lZCByZWNlaXZlIGJ1ZmZlcgorICoJQHZwdHI6IHZlbG9jaXR5CisgKglAaWR4OiByaW5nIGluZGV4CisgKgorICoJQWxsb2NhdGUgYSBuZXcgZnVsbCBzaXplZCBidWZmZXIgZm9yIHRoZSByZWNlcHRpb24gb2YgYSBmcmFtZSBhbmQKKyAqCW1hcCBpdCBpbnRvIFBDSSBzcGFjZSBmb3IgdGhlIGhhcmR3YXJlIHRvIHVzZS4gVGhlIGhhcmR3YXJlCisgKglyZXF1aXJlcyAqNjQqIGJ5dGUgYWxpZ25tZW50IG9mIHRoZSBidWZmZXIgd2hpY2ggbWFrZXMgbGlmZQorICoJbGVzcyBmdW4gdGhhbiB3b3VsZCBiZSBpZGVhbC4KKyAqLworIAorc3RhdGljIGludCB2ZWxvY2l0eV9hbGxvY19yeF9idWYoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIsIGludCBpZHgpCit7CisJc3RydWN0IHJ4X2Rlc2MgKnJkID0gJih2cHRyLT5yZF9yaW5nW2lkeF0pOworCXN0cnVjdCB2ZWxvY2l0eV9yZF9pbmZvICpyZF9pbmZvID0gJih2cHRyLT5yZF9pbmZvW2lkeF0pOworCisJcmRfaW5mby0+c2tiID0gZGV2X2FsbG9jX3NrYih2cHRyLT5yeF9idWZfc3ogKyA2NCk7CisJaWYgKHJkX2luZm8tPnNrYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qCisJICoJRG8gdGhlIGd5bW5hc3RpY3MgdG8gZ2V0IHRoZSBidWZmZXIgaGVhZCBmb3IgZGF0YSBhdAorCSAqCTY0Ynl0ZSBhbGlnbm1lbnQuCisJICovCisJc2tiX3Jlc2VydmUocmRfaW5mby0+c2tiLCAodW5zaWduZWQgbG9uZykgcmRfaW5mby0+c2tiLT50YWlsICYgNjMpOworCXJkX2luZm8tPnNrYi0+ZGV2ID0gdnB0ci0+ZGV2OworCXJkX2luZm8tPnNrYl9kbWEgPSBwY2lfbWFwX3NpbmdsZSh2cHRyLT5wZGV2LCByZF9pbmZvLT5za2ItPnRhaWwsIHZwdHItPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkKKwkvKgorCSAqCUZpbGwgaW4gdGhlIGRlc2NyaXB0b3IgdG8gbWF0Y2gKKyAJICovCQorIAkgCisJKigodTMyICopICYgKHJkLT5yZGVzYzApKSA9IDA7CisJcmQtPmxlbiA9IGNwdV90b19sZTMyKHZwdHItPnJ4X2J1Zl9zeik7CisJcmQtPmludGVuID0gMTsKKwlyZC0+cGFfbG93ID0gY3B1X3RvX2xlMzIocmRfaW5mby0+c2tiX2RtYSk7CisJcmQtPnBhX2hpZ2ggPSAwOworCXJldHVybiAwOworfQorCisvKioKKyAqCXR4X3NydgkJLQl0cmFuc21pdCBpbnRlcnJ1cHQgc2VydmljZQorICoJQHZwdHI7IFZlbG9jaXR5CisgKglAc3RhdHVzOgorICoKKyAqCVNjYW4gdGhlIHF1ZXVlcyBsb29raW5nIGZvciB0cmFuc21pdHRlZCBwYWNrZXRzIHRoYXQKKyAqCXdlIGNhbiBjb21wbGV0ZSBhbmQgY2xlYW4gdXAuIFVwZGF0ZSBhbnkgc3RhdGlzdGljcyBhcworICoJbmVjY2Vzc2FyeS8KKyAqLworIAorc3RhdGljIGludCB2ZWxvY2l0eV90eF9zcnYoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIsIHUzMiBzdGF0dXMpCit7CisJc3RydWN0IHR4X2Rlc2MgKnRkOworCWludCBxbnVtOworCWludCBmdWxsID0gMDsKKwlpbnQgaWR4OworCWludCB3b3JrcyA9IDA7CisJc3RydWN0IHZlbG9jaXR5X3RkX2luZm8gKnRkaW5mbzsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmdnB0ci0+c3RhdHM7CisKKwlmb3IgKHFudW0gPSAwOyBxbnVtIDwgdnB0ci0+bnVtX3R4cTsgcW51bSsrKSB7CisJCWZvciAoaWR4ID0gdnB0ci0+dGRfdGFpbFtxbnVtXTsgdnB0ci0+dGRfdXNlZFtxbnVtXSA+IDA7IAorCQkJaWR4ID0gKGlkeCArIDEpICUgdnB0ci0+b3B0aW9ucy5udW10eCkgeworCisJCQkvKgorCQkJICoJR2V0IFR4IERlc2NyaXB0b3IKKwkJCSAqLworCQkJdGQgPSAmKHZwdHItPnRkX3JpbmdzW3FudW1dW2lkeF0pOworCQkJdGRpbmZvID0gJih2cHRyLT50ZF9pbmZvc1txbnVtXVtpZHhdKTsKKworCQkJaWYgKHRkLT50ZGVzYzAub3duZXIgPT0gT1dORURfQllfTklDKQorCQkJCWJyZWFrOworCisJCQlpZiAoKHdvcmtzKysgPiAxNSkpCisJCQkJYnJlYWs7CisKKwkJCWlmICh0ZC0+dGRlc2MwLlRTUiAmIFRTUjBfVEVSUikgeworCQkJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJCQlzdGF0cy0+dHhfZHJvcHBlZCsrOworCQkJCWlmICh0ZC0+dGRlc2MwLlRTUiAmIFRTUjBfQ0RIKQorCQkJCQlzdGF0cy0+dHhfaGVhcnRiZWF0X2Vycm9ycysrOworCQkJCWlmICh0ZC0+dGRlc2MwLlRTUiAmIFRTUjBfQ1JTKQorCQkJCQlzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJCQlpZiAodGQtPnRkZXNjMC5UU1IgJiBUU1IwX0FCVCkKKwkJCQkJc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCQkJaWYgKHRkLT50ZGVzYzAuVFNSICYgVFNSMF9PV0MpCisJCQkJCXN0YXRzLT50eF93aW5kb3dfZXJyb3JzKys7CisJCQl9IGVsc2UgeworCQkJCXN0YXRzLT50eF9wYWNrZXRzKys7CisJCQkJc3RhdHMtPnR4X2J5dGVzICs9IHRkaW5mby0+c2tiLT5sZW47CisJCQl9CisJCQl2ZWxvY2l0eV9mcmVlX3R4X2J1Zih2cHRyLCB0ZGluZm8pOworCQkJdnB0ci0+dGRfdXNlZFtxbnVtXS0tOworCQl9CisJCXZwdHItPnRkX3RhaWxbcW51bV0gPSBpZHg7CisKKwkJaWYgKEFWQUlMX1REKHZwdHIsIHFudW0pIDwgMSkgeworCQkJZnVsbCA9IDE7CisJCX0KKwl9CisJLyoKKwkgKglMb29rIHRvIHNlZSBpZiB3ZSBzaG91bGQga2ljayB0aGUgdHJhbnNtaXQgbmV0d29yaworCSAqCWxheWVyIGZvciBtb3JlIHdvcmsuCisJICovCisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQodnB0ci0+ZGV2KSAmJiAoZnVsbCA9PSAwKQorCSAgICAmJiAoISh2cHRyLT5taWlfc3RhdHVzICYgVkVMT0NJVFlfTElOS19GQUlMKSkpIHsKKwkJbmV0aWZfd2FrZV9xdWV1ZSh2cHRyLT5kZXYpOworCX0KKwlyZXR1cm4gd29ya3M7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfcHJpbnRfbGlua19zdGF0dXMJLQlsaW5rIHN0YXR1cyByZXBvcnRpbmcKKyAqCUB2cHRyOiB2ZWxvY2l0eSB0byByZXBvcnQgb24KKyAqCisgKglUdXJuIHRoZSBsaW5rIHN0YXR1cyBvZiB0aGUgdmVsb2NpdHkgY2FyZCBpbnRvIGEga2VybmVsIGxvZworICoJZGVzY3JpcHRpb24gb2YgdGhlIG5ldyBsaW5rIHN0YXRlLCBkZXRhaWxpbmcgc3BlZWQgYW5kIGR1cGxleAorICoJc3RhdHVzCisgKi8KKworc3RhdGljIHZvaWQgdmVsb2NpdHlfcHJpbnRfbGlua19zdGF0dXMoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisKKwlpZiAodnB0ci0+bWlpX3N0YXR1cyAmIFZFTE9DSVRZX0xJTktfRkFJTCkgeworCQlWRUxPQ0lUWV9QUlQoTVNHX0xFVkVMX0lORk8sIEtFUk5fTk9USUNFICIlczogZmFpbGVkIHRvIGRldGVjdCBjYWJsZSBsaW5rXG4iLCB2cHRyLT5kZXYtPm5hbWUpOworCX0gZWxzZSBpZiAodnB0ci0+b3B0aW9ucy5zcGRfZHB4ID09IFNQRF9EUFhfQVVUTykgeworCQlWRUxPQ0lUWV9QUlQoTVNHX0xFVkVMX0lORk8sIEtFUk5fTk9USUNFICIlczogTGluayBhdXRvbmVnYXRpb24iLCB2cHRyLT5kZXYtPm5hbWUpOworCisJCWlmICh2cHRyLT5taWlfc3RhdHVzICYgVkVMT0NJVFlfU1BFRURfMTAwMCkKKwkJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgIiBzcGVlZCAxMDAwTSBicHMiKTsKKwkJZWxzZSBpZiAodnB0ci0+bWlpX3N0YXR1cyAmIFZFTE9DSVRZX1NQRUVEXzEwMCkKKwkJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgIiBzcGVlZCAxMDBNIGJwcyIpOworCQllbHNlCisJCQlWRUxPQ0lUWV9QUlQoTVNHX0xFVkVMX0lORk8sICIgc3BlZWQgMTBNIGJwcyIpOworCisJCWlmICh2cHRyLT5taWlfc3RhdHVzICYgVkVMT0NJVFlfRFVQTEVYX0ZVTEwpCisJCQlWRUxPQ0lUWV9QUlQoTVNHX0xFVkVMX0lORk8sICIgZnVsbCBkdXBsZXhcbiIpOworCQllbHNlCisJCQlWRUxPQ0lUWV9QUlQoTVNHX0xFVkVMX0lORk8sICIgaGFsZiBkdXBsZXhcbiIpOworCX0gZWxzZSB7CisJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgS0VSTl9OT1RJQ0UgIiVzOiBMaW5rIGZvcmNlZCIsIHZwdHItPmRldi0+bmFtZSk7CisJCXN3aXRjaCAodnB0ci0+b3B0aW9ucy5zcGRfZHB4KSB7CisJCWNhc2UgU1BEX0RQWF8xMDBfSEFMRjoKKwkJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgIiBzcGVlZCAxMDBNIGJwcyBoYWxmIGR1cGxleFxuIik7CisJCQlicmVhazsKKwkJY2FzZSBTUERfRFBYXzEwMF9GVUxMOgorCQkJVkVMT0NJVFlfUFJUKE1TR19MRVZFTF9JTkZPLCAiIHNwZWVkIDEwME0gYnBzIGZ1bGwgZHVwbGV4XG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFNQRF9EUFhfMTBfSEFMRjoKKwkJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgIiBzcGVlZCAxME0gYnBzIGhhbGYgZHVwbGV4XG4iKTsKKwkJCWJyZWFrOworCQljYXNlIFNQRF9EUFhfMTBfRlVMTDoKKwkJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgIiBzcGVlZCAxME0gYnBzIGZ1bGwgZHVwbGV4XG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qKgorICoJdmVsb2NpdHlfZXJyb3IJLQloYW5kbGUgZXJyb3IgZnJvbSBjb250cm9sbGVyCisgKglAdnB0cjogdmVsb2NpdHkKKyAqCUBzdGF0dXM6IGNhcmQgc3RhdHVzCisgKgorICoJUHJvY2VzcyBhbiBlcnJvciByZXBvcnQgZnJvbSB0aGUgaGFyZHdhcmUgYW5kIGF0dGVtcHQgdG8gcmVjb3ZlcgorICoJdGhlIGNhcmQgaXRzZWxmLiBBdCB0aGUgbW9tZW50IHdlIGNhbm5vdCByZWNvdmVyIGZyb20gc29tZSAKKyAqCXRoZW9yZXRpY2FsbHkgaW1wb3NzaWJsZSBlcnJvcnMgYnV0IHRoaXMgY291bGQgYmUgZml4ZWQgdXNpbmcKKyAqCXRoZSBwY2lfZGV2aWNlX2ZhaWxlZCBsb2dpYyB0byBib3VuY2UgdGhlIGhhcmR3YXJlCisgKgorICovCisgCitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9lcnJvcihzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwgaW50IHN0YXR1cykKK3sKKworCWlmIChzdGF0dXMgJiBJU1JfVFhTVExJKSB7CisJCXN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncyA9IHZwdHItPm1hY19yZWdzOworCisJCXByaW50ayhLRVJOX0VSUiAiVEQgc3RydWN0dXJlIGVycnJvciBURGluZGV4PSVoeFxuIiwgcmVhZHcoJnJlZ3MtPlRESWR4WzBdKSk7CisJCUJZVEVfUkVHX0JJVFNfT04oVFhFU1JfVERTVFIsICZyZWdzLT5UWEVTUik7CisJCXdyaXRldyhUUkRDU1JfUlVOLCAmcmVncy0+VERDU1JDbHIpOworCQluZXRpZl9zdG9wX3F1ZXVlKHZwdHItPmRldik7CisJCQorCQkvKiBGSVhNRTogcG9ydCBvdmVyIHRoZSBwY2lfZGV2aWNlX2ZhaWxlZCBjb2RlIGFuZCB1c2UgaXQKKwkJICAgaGVyZSAqLworCX0KKworCWlmIChzdGF0dXMgJiBJU1JfU1JDSSkgeworCQlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKwkJaW50IGxpbmtlZDsKKworCQlpZiAodnB0ci0+b3B0aW9ucy5zcGRfZHB4ID09IFNQRF9EUFhfQVVUTykgeworCQkJdnB0ci0+bWlpX3N0YXR1cyA9IGNoZWNrX2Nvbm5lY3Rpb25fdHlwZShyZWdzKTsKKworCQkJLyoKKwkJCSAqCUlmIGl0IGlzIGEgMzExOSwgZGlzYWJsZSBmcmFtZSBidXJzdGluZyBpbiAKKwkJCSAqCWhhbGZkdXBsZXggbW9kZSBhbmQgZW5hYmxlIGl0IGluIGZ1bGxkdXBsZXgKKwkJCSAqCSBtb2RlCisJCQkgKi8KKwkJCWlmICh2cHRyLT5yZXZfaWQgPCBSRVZfSURfVlQzMjE2X0EwKSB7CisJCQkJaWYgKHZwdHItPm1paV9zdGF0dXMgfCBWRUxPQ0lUWV9EVVBMRVhfRlVMTCkKKwkJCQkJQllURV9SRUdfQklUU19PTihUQ1JfVEIyQkRJUywgJnJlZ3MtPlRDUik7CisJCQkJZWxzZQorCQkJCQlCWVRFX1JFR19CSVRTX09GRihUQ1JfVEIyQkRJUywgJnJlZ3MtPlRDUik7CisJCQl9CisJCQkvKgorCQkJICoJT25seSBlbmFibGUgQ0QgaGVhcnQgYmVhdCBjb3VudGVyIGluIDEwSEQgbW9kZQorCQkJICovCisJCQlpZiAoISh2cHRyLT5taWlfc3RhdHVzICYgVkVMT0NJVFlfRFVQTEVYX0ZVTEwpICYmICh2cHRyLT5taWlfc3RhdHVzICYgVkVMT0NJVFlfU1BFRURfMTApKSB7CisJCQkJQllURV9SRUdfQklUU19PRkYoVEVTVENGR19IQkRJUywgJnJlZ3MtPlRFU1RDRkcpOworCQkJfSBlbHNlIHsKKwkJCQlCWVRFX1JFR19CSVRTX09OKFRFU1RDRkdfSEJESVMsICZyZWdzLT5URVNUQ0ZHKTsKKwkJCX0KKwkJfQorCQkvKgorCQkgKglHZXQgbGluayBzdGF0dXMgZnJvbSBQSFlTUjAKKwkJICovCisJCWxpbmtlZCA9IHJlYWRiKCZyZWdzLT5QSFlTUjApICYgUEhZU1IwX0xJTktHRDsKKworCQlpZiAobGlua2VkKSB7CisJCQl2cHRyLT5taWlfc3RhdHVzICY9IH5WRUxPQ0lUWV9MSU5LX0ZBSUw7CisJCX0gZWxzZSB7CisJCQl2cHRyLT5taWlfc3RhdHVzIHw9IFZFTE9DSVRZX0xJTktfRkFJTDsKKwkJfQorCisJCXZlbG9jaXR5X3ByaW50X2xpbmtfc3RhdHVzKHZwdHIpOworCQllbmFibGVfZmxvd19jb250cm9sX2FiaWxpdHkodnB0cik7CisKKwkJLyoKKwkJICoJUmUtZW5hYmxlIGF1dG8tcG9sbGluZyBiZWNhdXNlIFNSQ0kgd2lsbCBkaXNhYmxlIAorCQkgKglhdXRvLXBvbGxpbmcKKwkJICovCisJCSAKKwkJZW5hYmxlX21paV9hdXRvcG9sbChyZWdzKTsKKworCQlpZiAodnB0ci0+bWlpX3N0YXR1cyAmIFZFTE9DSVRZX0xJTktfRkFJTCkKKwkJCW5ldGlmX3N0b3BfcXVldWUodnB0ci0+ZGV2KTsKKwkJZWxzZQorCQkJbmV0aWZfd2FrZV9xdWV1ZSh2cHRyLT5kZXYpOworCisJfTsKKwlpZiAoc3RhdHVzICYgSVNSX01JQkZJKQorCQl2ZWxvY2l0eV91cGRhdGVfaHdfbWlicyh2cHRyKTsKKwlpZiAoc3RhdHVzICYgSVNSX0xTVEVJKQorCQltYWNfcnhfcXVldWVfd2FrZSh2cHRyLT5tYWNfcmVncyk7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfZnJlZV90eF9idWYJLQlmcmVlIHRyYW5zbWl0IGJ1ZmZlcgorICoJQHZwdHI6IHZlbG9jaXR5CisgKglAdGRpbmZvOiBidWZmZXIKKyAqCisgKglSZWxlYXNlIGFuIHRyYW5zbWl0IGJ1ZmZlci4gSWYgdGhlIGJ1ZmZlciB3YXMgcHJlYWxsb2NhdGVkIHRoZW4KKyAqCXJlY3ljbGUgaXQsIGlmIG5vdCB0aGVuIHVubWFwIHRoZSBidWZmZXIuCisgKi8KKyAKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X2ZyZWVfdHhfYnVmKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLCBzdHJ1Y3QgdmVsb2NpdHlfdGRfaW5mbyAqdGRpbmZvKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSB0ZGluZm8tPnNrYjsKKwlpbnQgaTsKKworCS8qCisJICoJRG9uJ3QgdW5tYXAgdGhlIHByZS1hbGxvY2F0ZWQgdHhfYnVmcworCSAqLworCWlmICh0ZGluZm8tPnNrYl9kbWEgJiYgKHRkaW5mby0+c2tiX2RtYVswXSAhPSB0ZGluZm8tPmJ1Zl9kbWEpKSB7CisKKwkJZm9yIChpID0gMDsgaSA8IHRkaW5mby0+bnNrYl9kbWE7IGkrKykgeworI2lmZGVmIFZFTE9DSVRZX1pFUk9fQ09QWV9TVVBQT1JUCisJCQlwY2lfdW5tYXBfc2luZ2xlKHZwdHItPnBkZXYsIHRkaW5mby0+c2tiX2RtYVtpXSwgdGQtPnRkZXNjMS5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworI2Vsc2UKKwkJCXBjaV91bm1hcF9zaW5nbGUodnB0ci0+cGRldiwgdGRpbmZvLT5za2JfZG1hW2ldLCBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisjZW5kaWYKKwkJCXRkaW5mby0+c2tiX2RtYVtpXSA9IDA7CisJCX0KKwl9CisJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwl0ZGluZm8tPnNrYiA9IE5VTEw7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfb3BlbgkJLQlpbnRlcmZhY2UgYWN0aXZhdGlvbiBjYWxsYmFjaworICoJQGRldjogbmV0d29yayBsYXllciBkZXZpY2UgdG8gb3BlbgorICoKKyAqCUNhbGxlZCB3aGVuIHRoZSBuZXR3b3JrIGxheWVyIGJyaW5ncyB0aGUgaW50ZXJmYWNlIHVwLiBSZXR1cm5zCisgKglhIG5lZ2F0aXZlIHBvc2l4IGVycm9yIGNvZGUgb24gZmFpbHVyZSwgb3IgemVybyBvbiBzdWNjZXNzLgorICoKKyAqCUFsbCB0aGUgcmluZyBhbGxvY2F0aW9uIGFuZCBzZXQgdXAgaXMgZG9uZSBvbiBvcGVuIGZvciB0aGlzCisgKglhZGFwdGVyIHRvIG1pbmltaXNlIG1lbW9yeSB1c2FnZSB3aGVuIGluYWN0aXZlCisgKi8KKyAKK3N0YXRpYyBpbnQgdmVsb2NpdHlfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyID0gZGV2LT5wcml2OworCWludCByZXQ7CisKKwl2cHRyLT5yeF9idWZfc3ogPSAoZGV2LT5tdHUgPD0gMTUwNCA/IFBLVF9CVUZfU1ogOiBkZXYtPm10dSArIDMyKTsKKworCXJldCA9IHZlbG9jaXR5X2luaXRfcmluZ3ModnB0cik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gdmVsb2NpdHlfaW5pdF9yZF9yaW5nKHZwdHIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9mcmVlX2Rlc2NfcmluZ3M7CisKKwlyZXQgPSB2ZWxvY2l0eV9pbml0X3RkX3JpbmcodnB0cik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2ZyZWVfcmRfcmluZzsKKwkKKwkvKiBFbnN1cmUgY2hpcCBpcyBydW5uaW5nICovCQorCXBjaV9zZXRfcG93ZXJfc3RhdGUodnB0ci0+cGRldiwgUENJX0QwKTsKKwkKKwl2ZWxvY2l0eV9pbml0X3JlZ2lzdGVycyh2cHRyLCBWRUxPQ0lUWV9JTklUX0NPTEQpOworCisJcmV0ID0gcmVxdWVzdF9pcnEodnB0ci0+cGRldi0+aXJxLCAmdmVsb2NpdHlfaW50ciwgU0FfU0hJUlEsCisJCQkgIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQkvKiBQb3dlciBkb3duIHRoZSBjaGlwICovCisJCXBjaV9zZXRfcG93ZXJfc3RhdGUodnB0ci0+cGRldiwgUENJX0QzaG90KTsKKwkJZ290byBlcnJfZnJlZV90ZF9yaW5nOworCX0KKworCW1hY19lbmFibGVfaW50KHZwdHItPm1hY19yZWdzKTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXZwdHItPmZsYWdzIHw9IFZFTE9DSVRZX0ZMQUdTX09QRU5FRDsKK291dDoKKwlyZXR1cm4gcmV0OworCitlcnJfZnJlZV90ZF9yaW5nOgorCXZlbG9jaXR5X2ZyZWVfdGRfcmluZyh2cHRyKTsKK2Vycl9mcmVlX3JkX3Jpbmc6CisJdmVsb2NpdHlfZnJlZV9yZF9yaW5nKHZwdHIpOworZXJyX2ZyZWVfZGVzY19yaW5nczoKKwl2ZWxvY2l0eV9mcmVlX3JpbmdzKHZwdHIpOworCWdvdG8gb3V0OworfQorCisvKiogCisgKgl2ZWxvY2l0eV9jaGFuZ2VfbXR1CS0JTVRVIGNoYW5nZSBjYWxsYmFjaworICoJQGRldjogbmV0d29yayBkZXZpY2UKKyAqCUBuZXdfbXR1OiBkZXNpcmVkIE1UVQorICoKKyAqCUhhbmRsZSByZXF1ZXN0cyBmcm9tIHRoZSBuZXR3b3JraW5nIGxheWVyIGZvciBNVFUgY2hhbmdlIG9uCisgKgl0aGlzIGludGVyZmFjZS4gSXQgZ2V0cyBjYWxsZWQgb24gYSBjaGFuZ2UgYnkgdGhlIG5ldHdvcmsgbGF5ZXIuCisgKglSZXR1cm4gemVybyBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBwb3NpeCBlcnJvciBjb2RlLgorICovCisgCitzdGF0aWMgaW50IHZlbG9jaXR5X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgb2xkbXR1ID0gZGV2LT5tdHU7CisJaW50IHJldCA9IDA7CisKKwlpZiAoKG5ld19tdHUgPCBWRUxPQ0lUWV9NSU5fTVRVKSB8fCBuZXdfbXR1ID4gKFZFTE9DSVRZX01BWF9NVFUpKSB7CisJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfRVJSLCBLRVJOX05PVElDRSAiJXM6IEludmFsaWQgTVRVLlxuIiwgCisJCQkJdnB0ci0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG5ld19tdHUgIT0gb2xkbXR1KSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2cHRyLT5sb2NrLCBmbGFncyk7CisKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQl2ZWxvY2l0eV9zaHV0ZG93bih2cHRyKTsKKworCQl2ZWxvY2l0eV9mcmVlX3RkX3JpbmcodnB0cik7CisJCXZlbG9jaXR5X2ZyZWVfcmRfcmluZyh2cHRyKTsKKworCQlkZXYtPm10dSA9IG5ld19tdHU7CisJCWlmIChuZXdfbXR1ID4gODE5MikKKwkJCXZwdHItPnJ4X2J1Zl9zeiA9IDkgKiAxMDI0OworCQllbHNlIGlmIChuZXdfbXR1ID4gNDA5NikKKwkJCXZwdHItPnJ4X2J1Zl9zeiA9IDgxOTI7CisJCWVsc2UKKwkJCXZwdHItPnJ4X2J1Zl9zeiA9IDQgKiAxMDI0OworCisJCXJldCA9IHZlbG9jaXR5X2luaXRfcmRfcmluZyh2cHRyKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dF91bmxvY2s7CisKKwkJcmV0ID0gdmVsb2NpdHlfaW5pdF90ZF9yaW5nKHZwdHIpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0X3VubG9jazsKKworCQl2ZWxvY2l0eV9pbml0X3JlZ2lzdGVycyh2cHRyLCBWRUxPQ0lUWV9JTklUX0NPTEQpOworCisJCW1hY19lbmFibGVfaW50KHZwdHItPm1hY19yZWdzKTsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKK291dF91bmxvY2s6CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwdHItPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqCXZlbG9jaXR5X3NodXRkb3duCS0Jc2h1dCBkb3duIHRoZSBjaGlwCisgKglAdnB0cjogdmVsb2NpdHkgdG8gZGVhY3RpdmF0ZQorICoKKyAqCVNodXRzIGRvd24gdGhlIGludGVybmFsIG9wZXJhdGlvbnMgb2YgdGhlIHZlbG9jaXR5IGFuZAorICoJZGlzYWJsZXMgaW50ZXJydXB0cywgYXV0b3BvbGxpbmcsIHRyYW5zbWl0IGFuZCByZWNlaXZlCisgKi8KKyAKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X3NodXRkb3duKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCXN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncyA9IHZwdHItPm1hY19yZWdzOworCW1hY19kaXNhYmxlX2ludChyZWdzKTsKKwl3cml0ZWwoQ1IwX1NUT1AsICZyZWdzLT5DUjBTZXQpOworCXdyaXRldygweEZGRkYsICZyZWdzLT5URENTUkNscik7CisJd3JpdGViKDB4RkYsICZyZWdzLT5SRENTUkNscik7CisJc2FmZV9kaXNhYmxlX21paV9hdXRvcG9sbChyZWdzKTsKKwltYWNfY2xlYXJfaXNyKHJlZ3MpOworfQorCisvKioKKyAqCXZlbG9jaXR5X2Nsb3NlCQktCWNsb3NlIGFkYXB0ZXIgY2FsbGJhY2sKKyAqCUBkZXY6IG5ldHdvcmsgZGV2aWNlCisgKgorICoJQ2FsbGJhY2sgZnJvbSB0aGUgbmV0d29yayBsYXllciB3aGVuIHRoZSB2ZWxvY2l0eSBpcyBiZWluZworICoJZGVhY3RpdmF0ZWQgYnkgdGhlIG5ldHdvcmsgbGF5ZXIKKyAqLworCitzdGF0aWMgaW50IHZlbG9jaXR5X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBkZXYtPnByaXY7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJdmVsb2NpdHlfc2h1dGRvd24odnB0cik7CisKKwlpZiAodnB0ci0+ZmxhZ3MgJiBWRUxPQ0lUWV9GTEFHU19XT0xfRU5BQkxFRCkKKwkJdmVsb2NpdHlfZ2V0X2lwKHZwdHIpOworCWlmIChkZXYtPmlycSAhPSAwKQorCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJCisJLyogUG93ZXIgZG93biB0aGUgY2hpcCAqLworCXBjaV9zZXRfcG93ZXJfc3RhdGUodnB0ci0+cGRldiwgUENJX0QzaG90KTsKKwkKKwkvKiBGcmVlIHRoZSByZXNvdXJjZXMgKi8KKwl2ZWxvY2l0eV9mcmVlX3RkX3JpbmcodnB0cik7CisJdmVsb2NpdHlfZnJlZV9yZF9yaW5nKHZwdHIpOworCXZlbG9jaXR5X2ZyZWVfcmluZ3ModnB0cik7CisKKwl2cHRyLT5mbGFncyAmPSAoflZFTE9DSVRZX0ZMQUdTX09QRU5FRCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfeG1pdAkJLQl0cmFuc21pdCBwYWNrZXQgY2FsbGJhY2sKKyAqCUBza2I6IGJ1ZmZlciB0byB0cmFuc21pdAorICoJQGRldjogbmV0d29yayBkZXZpY2UKKyAqCisgKglDYWxsZWQgYnkgdGhlIG5ldHdvciBsYXllciB0byByZXF1ZXN0IGEgcGFja2V0IGlzIHF1ZXVlZCB0bworICoJdGhlIHZlbG9jaXR5LiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcy4KKyAqLworIAorc3RhdGljIGludCB2ZWxvY2l0eV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBkZXYtPnByaXY7CisJaW50IHFudW0gPSAwOworCXN0cnVjdCB0eF9kZXNjICp0ZF9wdHI7CisJc3RydWN0IHZlbG9jaXR5X3RkX2luZm8gKnRkaW5mbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpbmRleDsKKworCWludCBwa3RsZW4gPSBza2ItPmxlbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2cHRyLT5sb2NrLCBmbGFncyk7CisKKwlpbmRleCA9IHZwdHItPnRkX2N1cnJbcW51bV07CisJdGRfcHRyID0gJih2cHRyLT50ZF9yaW5nc1txbnVtXVtpbmRleF0pOworCXRkaW5mbyA9ICYodnB0ci0+dGRfaW5mb3NbcW51bV1baW5kZXhdKTsKKworCXRkX3B0ci0+dGRlc2MxLlRDUExTID0gVENQTFNfTk9STUFMOworCXRkX3B0ci0+dGRlc2MxLlRDUiA9IFRDUjBfVElDOworCXRkX3B0ci0+dGRfYnVmWzBdLnF1ZXVlID0gMDsKKworCS8qCisJICoJUGFkIHNob3J0IGZyYW1lcy4gCisJICovCisJaWYgKHBrdGxlbiA8IEVUSF9aTEVOKSB7CisJCS8qIENhbm5vdCBvY2N1ciB1bnRpbCBaQyBzdXBwb3J0ICovCisJCWlmKHNrYl9saW5lYXJpemUoc2tiLCBHRlBfQVRPTUlDKSkKKwkJCXJldHVybiAwOyAKKwkJcGt0bGVuID0gRVRIX1pMRU47CisJCW1lbWNweSh0ZGluZm8tPmJ1Ziwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCW1lbXNldCh0ZGluZm8tPmJ1ZiArIHNrYi0+bGVuLCAwLCBFVEhfWkxFTiAtIHNrYi0+bGVuKTsKKwkJdGRpbmZvLT5za2IgPSBza2I7CisJCXRkaW5mby0+c2tiX2RtYVswXSA9IHRkaW5mby0+YnVmX2RtYTsKKwkJdGRfcHRyLT50ZGVzYzAucGt0c2l6ZSA9IHBrdGxlbjsKKwkJdGRfcHRyLT50ZF9idWZbMF0ucGFfbG93ID0gY3B1X3RvX2xlMzIodGRpbmZvLT5za2JfZG1hWzBdKTsKKwkJdGRfcHRyLT50ZF9idWZbMF0ucGFfaGlnaCA9IDA7CisJCXRkX3B0ci0+dGRfYnVmWzBdLmJ1ZnNpemUgPSB0ZF9wdHItPnRkZXNjMC5wa3RzaXplOworCQl0ZGluZm8tPm5za2JfZG1hID0gMTsKKwkJdGRfcHRyLT50ZGVzYzEuQ01EWiA9IDI7CisJfSBlbHNlCisjaWZkZWYgVkVMT0NJVFlfWkVST19DT1BZX1NVUFBPUlQKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA+IDApIHsKKwkJaW50IG5mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJCXRkaW5mby0+c2tiID0gc2tiOworCQlpZiAobmZyYWdzID4gNikgeworCQkJc2tiX2xpbmVhcml6ZShza2IsIEdGUF9BVE9NSUMpOworCQkJbWVtY3B5KHRkaW5mby0+YnVmLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCXRkaW5mby0+c2tiX2RtYVswXSA9IHRkaW5mby0+YnVmX2RtYTsKKwkJCXRkX3B0ci0+dGRlc2MwLnBrdHNpemUgPSAKKwkJCXRkX3B0ci0+dGRfYnVmWzBdLnBhX2xvdyA9IGNwdV90b19sZTMyKHRkaW5mby0+c2tiX2RtYVswXSk7CisJCQl0ZF9wdHItPnRkX2J1ZlswXS5wYV9oaWdoID0gMDsKKwkJCXRkX3B0ci0+dGRfYnVmWzBdLmJ1ZnNpemUgPSB0ZF9wdHItPnRkZXNjMC5wa3RzaXplOworCQkJdGRpbmZvLT5uc2tiX2RtYSA9IDE7CisJCQl0ZF9wdHItPnRkZXNjMS5DTURaID0gMjsKKwkJfSBlbHNlIHsKKwkJCWludCBpID0gMDsKKwkJCXRkaW5mby0+bnNrYl9kbWEgPSAwOworCQkJdGRpbmZvLT5za2JfZG1hW2ldID0gcGNpX21hcF9zaW5nbGUodnB0ci0+cGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCQl0ZF9wdHItPnRkZXNjMC5wa3RzaXplID0gcGt0bGVuOworCisJCQkvKiBGSVhNRTogc3VwcG9ydCA0OGJpdCBETUEgbGF0ZXIgKi8KKwkJCXRkX3B0ci0+dGRfYnVmW2ldLnBhX2xvdyA9IGNwdV90b19sZTMyKHRkaW5mby0+c2tiX2RtYSk7CisJCQl0ZF9wdHItPnRkX2J1ZltpXS5wYV9oaWdoID0gMDsKKwkJCXRkX3B0ci0+dGRfYnVmW2ldLmJ1ZnNpemUgPSBza2ItPmxlbi0+c2tiLT5kYXRhX2xlbjsKKworCQkJZm9yIChpID0gMDsgaSA8IG5mcmFnczsgaSsrKSB7CisJCQkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCQkJCXZvaWQgKmFkZHIgPSAoKHZvaWQgKikgcGFnZV9hZGRyZXNzKGZyYWctPnBhZ2UgKyBmcmFnLT5wYWdlX29mZnNldCkpOworCisJCQkJdGRpbmZvLT5za2JfZG1hW2kgKyAxXSA9IHBjaV9tYXBfc2luZ2xlKHZwdHItPnBkZXYsIGFkZHIsIGZyYWctPnNpemUsIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCQkJdGRfcHRyLT50ZF9idWZbaSArIDFdLnBhX2xvdyA9IGNwdV90b19sZTMyKHRkaW5mby0+c2tiX2RtYVtpICsgMV0pOworCQkJCXRkX3B0ci0+dGRfYnVmW2kgKyAxXS5wYV9oaWdoID0gMDsKKwkJCQl0ZF9wdHItPnRkX2J1ZltpICsgMV0uYnVmc2l6ZSA9IGZyYWctPnNpemU7CisJCQl9CisJCQl0ZGluZm8tPm5za2JfZG1hID0gaSAtIDE7CisJCQl0ZF9wdHItPnRkZXNjMS5DTURaID0gaTsKKwkJfQorCisJfSBlbHNlCisjZW5kaWYKKwl7CisJCS8qCisJCSAqCU1hcCB0aGUgbGluZWFyIG5ldHdvcmsgYnVmZmVyIGludG8gUENJIHNwYWNlIGFuZAorCQkgKglhZGQgaXQgdG8gdGhlIHRyYW5zbWl0IHJpbmcuCisJCSAqLworCQl0ZGluZm8tPnNrYiA9IHNrYjsKKwkJdGRpbmZvLT5za2JfZG1hWzBdID0gcGNpX21hcF9zaW5nbGUodnB0ci0+cGRldiwgc2tiLT5kYXRhLCBwa3RsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQl0ZF9wdHItPnRkZXNjMC5wa3RzaXplID0gcGt0bGVuOworCQl0ZF9wdHItPnRkX2J1ZlswXS5wYV9sb3cgPSBjcHVfdG9fbGUzMih0ZGluZm8tPnNrYl9kbWFbMF0pOworCQl0ZF9wdHItPnRkX2J1ZlswXS5wYV9oaWdoID0gMDsKKwkJdGRfcHRyLT50ZF9idWZbMF0uYnVmc2l6ZSA9IHRkX3B0ci0+dGRlc2MwLnBrdHNpemU7CisJCXRkaW5mby0+bnNrYl9kbWEgPSAxOworCQl0ZF9wdHItPnRkZXNjMS5DTURaID0gMjsKKwl9CisKKwlpZiAodnB0ci0+ZmxhZ3MgJiBWRUxPQ0lUWV9GTEFHU19UQUdHSU5HKSB7CisJCXRkX3B0ci0+dGRlc2MxLnBxaW5mLlZJRCA9ICh2cHRyLT5vcHRpb25zLnZpZCAmIDB4ZmZmKTsKKwkJdGRfcHRyLT50ZGVzYzEucHFpbmYucHJpb3JpdHkgPSAwOworCQl0ZF9wdHItPnRkZXNjMS5wcWluZi5DRkkgPSAwOworCQl0ZF9wdHItPnRkZXNjMS5UQ1IgfD0gVENSMF9WRVRBRzsKKwl9CisKKwkvKgorCSAqCUhhbmRsZSBoYXJkd2FyZSBjaGVja3N1bQorCSAqLworCWlmICgodnB0ci0+ZmxhZ3MgJiBWRUxPQ0lUWV9GTEFHU19UWF9DU1VNKQorCQkJCSAmJiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpKSB7CisJCXN0cnVjdCBpcGhkciAqaXAgPSBza2ItPm5oLmlwaDsKKwkJaWYgKGlwLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKKwkJCXRkX3B0ci0+dGRlc2MxLlRDUiB8PSBUQ1IwX1RDUENLOworCQllbHNlIGlmIChpcC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApCisJCQl0ZF9wdHItPnRkZXNjMS5UQ1IgfD0gKFRDUjBfVURQQ0spOworCQl0ZF9wdHItPnRkZXNjMS5UQ1IgfD0gVENSMF9JUENLOworCX0KKwl7CisKKwkJaW50IHByZXYgPSBpbmRleCAtIDE7CisKKwkJaWYgKHByZXYgPCAwKQorCQkJcHJldiA9IHZwdHItPm9wdGlvbnMubnVtdHggLSAxOworCQl0ZF9wdHItPnRkZXNjMC5vd25lciA9IE9XTkVEX0JZX05JQzsKKwkJdnB0ci0+dGRfdXNlZFtxbnVtXSsrOworCQl2cHRyLT50ZF9jdXJyW3FudW1dID0gKGluZGV4ICsgMSkgJSB2cHRyLT5vcHRpb25zLm51bXR4OworCisJCWlmIChBVkFJTF9URCh2cHRyLCBxbnVtKSA8IDEpCisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkJdGRfcHRyID0gJih2cHRyLT50ZF9yaW5nc1txbnVtXVtwcmV2XSk7CisJCXRkX3B0ci0+dGRfYnVmWzBdLnF1ZXVlID0gMTsKKwkJbWFjX3R4X3F1ZXVlX3dha2UodnB0ci0+bWFjX3JlZ3MsIHFudW0pOworCX0KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cHRyLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJdmVsb2NpdHlfaW50cgkJLQlpbnRlcnJ1cHQgY2FsbGJhY2sKKyAqCUBpcnE6IGludGVycnVwdCBudW1iZXIKKyAqCUBkZXZfaW5zdGFuY2U6IGludGVycnVwdGluZyBkZXZpY2UKKyAqCUBwdF9yZWdzOiBDUFUgcmVnaXN0ZXIgc3RhdGUgYXQgaW50ZXJydXB0CisgKgorICoJQ2FsbGVkIHdoZW5ldmVyIGFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgYnkgdGhlIHZlbG9jaXR5CisgKglhZGFwdGVyIElSUSBsaW5lLiBXZSBtYXkgbm90IGJlIHRoZSBzb3VyY2Ugb2YgdGhlIGludGVycnVwdAorICoJYW5kIG5lZWQgdG8gaWRlbnRpZnkgaW5pdGlhbGx5IGlmIHdlIGFyZSwgYW5kIGlmIG5vdCBleGl0IGFzCisgKgllZmZpY2llbnRseSBhcyBwb3NzaWJsZS4KKyAqLworIAorc3RhdGljIGludCB2ZWxvY2l0eV9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IGRldi0+cHJpdjsKKwl1MzIgaXNyX3N0YXR1czsKKwlpbnQgbWF4X2NvdW50ID0gMDsKKworCisJc3Bpbl9sb2NrKCZ2cHRyLT5sb2NrKTsKKwlpc3Jfc3RhdHVzID0gbWFjX3JlYWRfaXNyKHZwdHItPm1hY19yZWdzKTsKKworCS8qIE5vdCB1cyA/ICovCisJaWYgKGlzcl9zdGF0dXMgPT0gMCkgeworCQlzcGluX3VubG9jaygmdnB0ci0+bG9jayk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwltYWNfZGlzYWJsZV9pbnQodnB0ci0+bWFjX3JlZ3MpOworCisJLyoKKwkgKglLZWVwIHByb2Nlc3NpbmcgdGhlIElTUiB1bnRpbCB3ZSBoYXZlIGNvbXBsZXRlZAorCSAqCXByb2Nlc3NpbmcgYW5kIHRoZSBpc3Jfc3RhdHVzIGJlY29tZXMgemVybworCSAqLworCSAKKwl3aGlsZSAoaXNyX3N0YXR1cyAhPSAwKSB7CisJCW1hY193cml0ZV9pc3IodnB0ci0+bWFjX3JlZ3MsIGlzcl9zdGF0dXMpOworCQlpZiAoaXNyX3N0YXR1cyAmICh+KElTUl9QUlhJIHwgSVNSX1BQUlhJIHwgSVNSX1BUWEkgfCBJU1JfUFBUWEkpKSkKKwkJCXZlbG9jaXR5X2Vycm9yKHZwdHIsIGlzcl9zdGF0dXMpOworCQlpZiAoaXNyX3N0YXR1cyAmIChJU1JfUFJYSSB8IElTUl9QUFJYSSkpCisJCQltYXhfY291bnQgKz0gdmVsb2NpdHlfcnhfc3J2KHZwdHIsIGlzcl9zdGF0dXMpOworCQlpZiAoaXNyX3N0YXR1cyAmIChJU1JfUFRYSSB8IElTUl9QUFRYSSkpCisJCQltYXhfY291bnQgKz0gdmVsb2NpdHlfdHhfc3J2KHZwdHIsIGlzcl9zdGF0dXMpOworCQlpc3Jfc3RhdHVzID0gbWFjX3JlYWRfaXNyKHZwdHItPm1hY19yZWdzKTsKKwkJaWYgKG1heF9jb3VudCA+IHZwdHItPm9wdGlvbnMuaW50X3dvcmtzKQorCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZXhjZXNzaXZlIHdvcmsgYXQgaW50ZXJydXB0LlxuIiwgCisJCQkJZGV2LT5uYW1lKTsKKwkJCW1heF9jb3VudCA9IDA7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJnZwdHItPmxvY2spOworCW1hY19lbmFibGVfaW50KHZwdHItPm1hY19yZWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKK30KKworCisvKioKKyAqCXZlbG9jaXR5X3NldF9tdWx0aQktCWZpbHRlciBsaXN0IGNoYW5nZSBjYWxsYmFjaworICoJQGRldjogbmV0d29yayBkZXZpY2UKKyAqCisgKglDYWxsZWQgYnkgdGhlIG5ldHdvcmsgbGF5ZXIgd2hlbiB0aGUgZmlsdGVyIGxpc3RzIG5lZWQgdG8gY2hhbmdlCisgKglmb3IgYSB2ZWxvY2l0eSBhZGFwdGVyLiBSZWxvYWQgdGhlIENBTXMgd2l0aCB0aGUgbmV3IGFkZHJlc3MKKyAqCWZpbHRlciBydWxlc2V0LgorICovCisgCitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9zZXRfbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKwl1OCByeF9tb2RlOworCWludCBpOworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewkvKiBTZXQgcHJvbWlzY3VvdXMuICovCisJCS8qIFVuY29uZGl0aW9uYWxseSBsb2cgbmV0IHRhcHMuICovCisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFByb21pc2N1b3VzIG1vZGUgZW5hYmxlZC5cbiIsIGRldi0+bmFtZSk7CisJCXdyaXRlbCgweGZmZmZmZmZmLCAmcmVncy0+TUFSQ0FNWzBdKTsKKwkJd3JpdGVsKDB4ZmZmZmZmZmYsICZyZWdzLT5NQVJDQU1bNF0pOworCQlyeF9tb2RlID0gKFJDUl9BTSB8IFJDUl9BQiB8IFJDUl9QUk9NKTsKKwl9IGVsc2UgaWYgKChkZXYtPm1jX2NvdW50ID4gdnB0ci0+bXVsdGljYXN0X2xpbWl0KQorCQkgICB8fCAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKKwkJd3JpdGVsKDB4ZmZmZmZmZmYsICZyZWdzLT5NQVJDQU1bMF0pOworCQl3cml0ZWwoMHhmZmZmZmZmZiwgJnJlZ3MtPk1BUkNBTVs0XSk7CisJCXJ4X21vZGUgPSAoUkNSX0FNIHwgUkNSX0FCKTsKKwl9IGVsc2UgeworCQlpbnQgb2Zmc2V0ID0gTUNBTV9TSVpFIC0gdnB0ci0+bXVsdGljYXN0X2xpbWl0OworCQltYWNfZ2V0X2NhbV9tYXNrKHJlZ3MsIHZwdHItPm1DQU1tYXNrLCBWRUxPQ0lUWV9NVUxUSUNBU1RfQ0FNKTsKKworCQlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IG1jbGlzdCAmJiBpIDwgZGV2LT5tY19jb3VudDsgaSsrLCBtY2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKwkJCW1hY19zZXRfY2FtKHJlZ3MsIGkgKyBvZmZzZXQsIG1jbGlzdC0+ZG1pX2FkZHIsIFZFTE9DSVRZX01VTFRJQ0FTVF9DQU0pOworCQkJdnB0ci0+bUNBTW1hc2tbKG9mZnNldCArIGkpIC8gOF0gfD0gMSA8PCAoKG9mZnNldCArIGkpICYgNyk7CisJCX0KKworCQltYWNfc2V0X2NhbV9tYXNrKHJlZ3MsIHZwdHItPm1DQU1tYXNrLCBWRUxPQ0lUWV9NVUxUSUNBU1RfQ0FNKTsKKwkJcnhfbW9kZSA9IChSQ1JfQU0gfCBSQ1JfQUIpOworCX0KKwlpZiAoZGV2LT5tdHUgPiAxNTAwKQorCQlyeF9tb2RlIHw9IFJDUl9BTDsKKworCUJZVEVfUkVHX0JJVFNfT04ocnhfbW9kZSwgJnJlZ3MtPlJDUik7CisKK30KKworLyoqCisgKgl2ZWxvY2l0eV9nZXRfc3RhdHVzCS0Jc3RhdGlzdGljcyBjYWxsYmFjaworICoJQGRldjogbmV0d29yayBkZXZpY2UKKyAqCisgKglDYWxsYmFjayBmcm9tIHRoZSBuZXR3b3JrIGxheWVyIHRvIGFsbG93IGRyaXZlciBzdGF0aXN0aWNzCisgKgl0byBiZSByZXN5bmNocm9uaXplZCB3aXRoIGhhcmR3YXJlIGNvbGxlY3RlZCBzdGF0ZS4gSW4gdGhlCisgKgljYXNlIG9mIHRoZSB2ZWxvY2l0eSB3ZSBuZWVkIHRvIHB1bGwgdGhlIE1JQiBjb3VudGVycyBmcm9tCisgKgl0aGUgaGFyZHdhcmUgaW50byB0aGUgY291bnRlcnMgYmVmb3JlIGxldHRpbmcgdGhlIG5ldHdvcmsKKyAqCWxheWVyIGRpc3BsYXkgdGhlbS4KKyAqLworIAorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp2ZWxvY2l0eV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IGRldi0+cHJpdjsKKwkKKwkvKiBJZiB0aGUgaGFyZHdhcmUgaXMgZG93biwgZG9uJ3QgdG91Y2ggTUlJICovCisJaWYoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuICZ2cHRyLT5zdGF0czsKKworCXNwaW5fbG9ja19pcnEoJnZwdHItPmxvY2spOworCXZlbG9jaXR5X3VwZGF0ZV9od19taWJzKHZwdHIpOworCXNwaW5fdW5sb2NrX2lycSgmdnB0ci0+bG9jayk7CisKKwl2cHRyLT5zdGF0cy5yeF9wYWNrZXRzID0gdnB0ci0+bWliX2NvdW50ZXJbSFdfTUlCX2lmUnhBbGxQa3RzXTsKKwl2cHRyLT5zdGF0cy5yeF9lcnJvcnMgPSB2cHRyLT5taWJfY291bnRlcltIV19NSUJfaWZSeEVycm9yUGt0c107CisJdnB0ci0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycyA9IHZwdHItPm1pYl9jb3VudGVyW0hXX01JQl9pZkluUmFuZ2VMZW5ndGhFcnJvcnNdOworCisvLyAgdW5zaWduZWQgbG9uZyAgIHJ4X2Ryb3BwZWQ7ICAgICAvKiBubyBzcGFjZSBpbiBsaW51eCBidWZmZXJzICAgICovCisJdnB0ci0+c3RhdHMuY29sbGlzaW9ucyA9IHZwdHItPm1pYl9jb3VudGVyW0hXX01JQl9pZlR4RXRoZXJDb2xsaXNpb25zXTsKKwkvKiBkZXRhaWxlZCByeF9lcnJvcnM6ICovCisvLyAgdW5zaWduZWQgbG9uZyAgIHJ4X2xlbmd0aF9lcnJvcnM7CisvLyAgdW5zaWduZWQgbG9uZyAgIHJ4X292ZXJfZXJyb3JzOyAgICAgLyogcmVjZWl2ZXIgcmluZyBidWZmIG92ZXJmbG93ICAqLworCXZwdHItPnN0YXRzLnJ4X2NyY19lcnJvcnMgPSB2cHRyLT5taWJfY291bnRlcltIV19NSUJfaWZSeFBrdENSQ0VdOworLy8gIHVuc2lnbmVkIGxvbmcgICByeF9mcmFtZV9lcnJvcnM7ICAgIC8qIHJlY3YnZCBmcmFtZSBhbGlnbm1lbnQgZXJyb3IgKi8KKy8vICB1bnNpZ25lZCBsb25nICAgcnhfZmlmb19lcnJvcnM7ICAgICAvKiByZWN2J3IgZmlmbyBvdmVycnVuICAgICAgKi8KKy8vICB1bnNpZ25lZCBsb25nICAgcnhfbWlzc2VkX2Vycm9yczsgICAvKiByZWNlaXZlciBtaXNzZWQgcGFja2V0ICAgKi8KKworCS8qIGRldGFpbGVkIHR4X2Vycm9ycyAqLworLy8gIHVuc2lnbmVkIGxvbmcgICB0eF9maWZvX2Vycm9yczsKKworCXJldHVybiAmdnB0ci0+c3RhdHM7Cit9CisKKworLyoqCisgKgl2ZWxvY2l0eV9pb2N0bAkJLQlpb2N0bCBlbnRyeSBwb2ludAorICoJQGRldjogbmV0d29yayBkZXZpY2UKKyAqCUBycTogaW50ZXJmYWNlIHJlcXVlc3QgaW9jdGwKKyAqCUBjbWQ6IGNvbW1hbmQgY29kZQorICoKKyAqCUNhbGxlZCB3aGVuIHRoZSB1c2VyIGlzc3VlcyBhbiBpb2N0bCByZXF1ZXN0IHRvIHRoZSBuZXR3b3JrCisgKglkZXZpY2UgaW4gcXVlc3Rpb24uIFRoZSB2ZWxvY2l0eSBpbnRlcmZhY2Ugc3VwcG9ydHMgTUlJLgorICovCisgCitzdGF0aWMgaW50IHZlbG9jaXR5X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBkZXYtPnByaXY7CisJaW50IHJldDsKKworCS8qIElmIHdlIGFyZSBhc2tlZCBmb3IgaW5mb3JtYXRpb24gYW5kIHRoZSBkZXZpY2UgaXMgcG93ZXIKKwkgICBzYXZpbmcgdGhlbiB3ZSBuZWVkIHRvIGJyaW5nIHRoZSBkZXZpY2UgYmFjayB1cCB0byB0YWxrIHRvIGl0ICovCisJICAgCQorCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHZwdHItPnBkZXYsIFBDSV9EMCk7CisJCQorCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR01JSVBIWToJLyogR2V0IGFkZHJlc3Mgb2YgTUlJIFBIWSBpbiB1c2UuICovCisJY2FzZSBTSU9DR01JSVJFRzoJLyogUmVhZCBNSUkgUEhZIHJlZ2lzdGVyLiAqLworCWNhc2UgU0lPQ1NNSUlSRUc6CS8qIFdyaXRlIHRvIE1JSSBQSFkgcmVnaXN0ZXIuICovCisJCXJldCA9IHZlbG9jaXR5X21paV9pb2N0bChkZXYsIHJxLCBjbWQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcGNpX3NldF9wb3dlcl9zdGF0ZSh2cHRyLT5wZGV2LCBQQ0lfRDNob3QpOworCQkKKwkJCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqCURlZmluaXRpb24gZm9yIG91ciBkZXZpY2UgZHJpdmVyLiBUaGUgUENJIGxheWVyIGludGVyZmFjZQorICoJdXNlcyB0aGlzIHRvIGhhbmRsZSBhbGwgb3VyIGNhcmQgZGlzY292ZXIgYW5kIHBsdWdnaW5nCisgKi8KKyAKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB2ZWxvY2l0eV9kcml2ZXIgPSB7CisgICAgICAubmFtZQk9IFZFTE9DSVRZX05BTUUsCisgICAgICAuaWRfdGFibGUJPSB2ZWxvY2l0eV9pZF90YWJsZSwKKyAgICAgIC5wcm9iZQk9IHZlbG9jaXR5X2ZvdW5kMSwKKyAgICAgIC5yZW1vdmUJPSBfX2RldmV4aXRfcCh2ZWxvY2l0eV9yZW1vdmUxKSwKKyNpZmRlZiBDT05GSUdfUE0KKyAgICAgIC5zdXNwZW5kCT0gdmVsb2NpdHlfc3VzcGVuZCwKKyAgICAgIC5yZXN1bWUJPSB2ZWxvY2l0eV9yZXN1bWUsCisjZW5kaWYKK307CisKKy8qKgorICoJdmVsb2NpdHlfaW5pdF9tb2R1bGUJLQlsb2FkIHRpbWUgZnVuY3Rpb24KKyAqCisgKglDYWxsZWQgd2hlbiB0aGUgdmVsb2NpdHkgbW9kdWxlIGlzIGxvYWRlZC4gVGhlIFBDSSBkcml2ZXIKKyAqCWlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgUENJIGxheWVyLCBhbmQgaW4gdHVybiB3aWxsIGNhbGwKKyAqCXRoZSBwcm9iZSBmdW5jdGlvbnMgZm9yIGVhY2ggdmVsb2NpdHkgYWRhcHRlciBpbnN0YWxsZWQKKyAqCWluIHRoZSBzeXN0ZW0uCisgKi8KKyAKK3N0YXRpYyBpbnQgX19pbml0IHZlbG9jaXR5X2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldDsKKworCXZlbG9jaXR5X3JlZ2lzdGVyX25vdGlmaWVyKCk7CisJcmV0ID0gcGNpX21vZHVsZV9pbml0KCZ2ZWxvY2l0eV9kcml2ZXIpOworCWlmIChyZXQgPCAwKQorCQl2ZWxvY2l0eV91bnJlZ2lzdGVyX25vdGlmaWVyKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9jbGVhbnVwCS0JbW9kdWxlIHVubG9hZAorICoKKyAqCVdoZW4gdGhlIHZlbG9jaXR5IGhhcmR3YXJlIGlzIHVubG9hZGVkIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorICoJSXQgd2lsbCBjbGVhbiB1cCB0aGUgbm90aWZpZXJzIGFuZCB0aGUgdW5yZWdpc3RlciB0aGUgUENJIAorICoJZHJpdmVyIGludGVyZmFjZSBmb3IgdGhpcyBoYXJkd2FyZS4gVGhpcyBpbiB0dXJuIGNsZWFucyB1cAorICoJYWxsIGRpc2NvdmVyZWQgaW50ZXJmYWNlcyBiZWZvcmUgcmV0dXJuaW5nIGZyb20gdGhlIGZ1bmN0aW9uCisgKi8KKyAKK3N0YXRpYyB2b2lkIF9fZXhpdCB2ZWxvY2l0eV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXZlbG9jaXR5X3VucmVnaXN0ZXJfbm90aWZpZXIoKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnZlbG9jaXR5X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHZlbG9jaXR5X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHZlbG9jaXR5X2NsZWFudXBfbW9kdWxlKTsKKworCisvKgorICogTUlJIGFjY2VzcyAsIG1lZGlhIGxpbmsgbW9kZSBzZXR0aW5nIGZ1bmN0aW9ucworICovCisgCisgCisvKioKKyAqCW1paV9pbml0CS0Jc2V0IHVwIE1JSQorICoJQHZwdHI6IHZlbG9jaXR5IGFkYXB0ZXIKKyAqCUBtaWlfc3RhdHVzOiAgbGlua3MgdGF0dXMKKyAqCisgKglTZXQgdXAgdGhlIFBIWSBmb3IgdGhlIGN1cnJlbnQgbGluayBzdGF0ZS4KKyAqLworIAorc3RhdGljIHZvaWQgbWlpX2luaXQoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIsIHUzMiBtaWlfc3RhdHVzKQoreworCXUxNiBCTUNSOworCisJc3dpdGNoIChQSFlJRF9HRVRfUEhZX0lEKHZwdHItPnBoeV9pZCkpIHsKKwljYXNlIFBIWUlEX0NJQ0FEQV9DUzgyMDE6CisJCS8qCisJCSAqCVJlc2V0IHRvIGhhcmR3YXJlIGRlZmF1bHQKKwkJICovCisJCU1JSV9SRUdfQklUU19PRkYoKEFOQVJfQVNNRElSIHwgQU5BUl9QQVVTRSksIE1JSV9SRUdfQU5BUiwgdnB0ci0+bWFjX3JlZ3MpOworCQkvKgorCQkgKglUdXJuIG9uIEVDSE9ESVMgYml0IGluIE5XYXktZm9yY2VkIGZ1bGwgbW9kZSBhbmQgdHVybiBpdAorCQkgKglvZmYgaXQgaW4gTldheS1mb3JjZWQgaGFsZiBtb2RlIGZvciBOV2F5LWZvcmNlZCB2LnMuIAorCQkgKglsZWdhY3ktZm9yY2VkIGlzc3VlLgorCQkgKi8KKwkJaWYgKHZwdHItPm1paV9zdGF0dXMgJiBWRUxPQ0lUWV9EVVBMRVhfRlVMTCkKKwkJCU1JSV9SRUdfQklUU19PTihUQ1NSX0VDSE9ESVMsIE1JSV9SRUdfVENTUiwgdnB0ci0+bWFjX3JlZ3MpOworCQllbHNlCisJCQlNSUlfUkVHX0JJVFNfT0ZGKFRDU1JfRUNIT0RJUywgTUlJX1JFR19UQ1NSLCB2cHRyLT5tYWNfcmVncyk7CisJCS8qCisJCSAqCVR1cm4gb24gTGluay9BY3Rpdml0eSBMRUQgZW5hYmxlIGJpdCBmb3IgQ0lTODIwMQorCQkgKi8KKwkJTUlJX1JFR19CSVRTX09OKFBMRURfTEFMQkUsIE1JSV9SRUdfUExFRCwgdnB0ci0+bWFjX3JlZ3MpOworCQlicmVhazsKKwljYXNlIFBIWUlEX1ZUMzIxNl8zMkJJVDoKKwljYXNlIFBIWUlEX1ZUMzIxNl82NEJJVDoKKwkJLyoKKwkJICoJUmVzZXQgdG8gaGFyZHdhcmUgZGVmYXVsdAorCQkgKi8KKwkJTUlJX1JFR19CSVRTX09OKChBTkFSX0FTTURJUiB8IEFOQVJfUEFVU0UpLCBNSUlfUkVHX0FOQVIsIHZwdHItPm1hY19yZWdzKTsKKwkJLyoKKwkJICoJVHVybiBvbiBFQ0hPRElTIGJpdCBpbiBOV2F5LWZvcmNlZCBmdWxsIG1vZGUgYW5kIHR1cm4gaXQKKwkJICoJb2ZmIGl0IGluIE5XYXktZm9yY2VkIGhhbGYgbW9kZSBmb3IgTldheS1mb3JjZWQgdi5zLiAKKwkJICoJbGVnYWN5LWZvcmNlZCBpc3N1ZQorCQkgKi8KKwkJaWYgKHZwdHItPm1paV9zdGF0dXMgJiBWRUxPQ0lUWV9EVVBMRVhfRlVMTCkKKwkJCU1JSV9SRUdfQklUU19PTihUQ1NSX0VDSE9ESVMsIE1JSV9SRUdfVENTUiwgdnB0ci0+bWFjX3JlZ3MpOworCQllbHNlCisJCQlNSUlfUkVHX0JJVFNfT0ZGKFRDU1JfRUNIT0RJUywgTUlJX1JFR19UQ1NSLCB2cHRyLT5tYWNfcmVncyk7CisJCWJyZWFrOworCisJY2FzZSBQSFlJRF9NQVJWRUxMXzEwMDA6CisJY2FzZSBQSFlJRF9NQVJWRUxMXzEwMDBTOgorCQkvKgorCQkgKglBc3NlcnQgQ1JTIG9uIFRyYW5zbWl0IAorCQkgKi8KKwkJTUlJX1JFR19CSVRTX09OKFBTQ1JfQUNSU1RYLCBNSUlfUkVHX1BTQ1IsIHZwdHItPm1hY19yZWdzKTsKKwkJLyoKKwkJICoJUmVzZXQgdG8gaGFyZHdhcmUgZGVmYXVsdCAKKwkJICovCisJCU1JSV9SRUdfQklUU19PTigoQU5BUl9BU01ESVIgfCBBTkFSX1BBVVNFKSwgTUlJX1JFR19BTkFSLCB2cHRyLT5tYWNfcmVncyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsKKwl9CisJdmVsb2NpdHlfbWlpX3JlYWQodnB0ci0+bWFjX3JlZ3MsIE1JSV9SRUdfQk1DUiwgJkJNQ1IpOworCWlmIChCTUNSICYgQk1DUl9JU08pIHsKKwkJQk1DUiAmPSB+Qk1DUl9JU087CisJCXZlbG9jaXR5X21paV93cml0ZSh2cHRyLT5tYWNfcmVncywgTUlJX1JFR19CTUNSLCBCTUNSKTsKKwl9Cit9CisKKy8qKgorICoJc2FmZV9kaXNhYmxlX21paV9hdXRvcG9sbAktCWF1dG9wb2xsIG9mZgorICoJQHJlZ3M6IHZlbG9jaXR5IHJlZ2lzdGVycworICoKKyAqCVR1cm4gb2ZmIHRoZSBhdXRvcG9sbCBhbmQgd2FpdCBmb3IgaXQgdG8gZGlzYWJsZSBvbiB0aGUgY2hpcAorICovCisgCitzdGF0aWMgdm9pZCBzYWZlX2Rpc2FibGVfbWlpX2F1dG9wb2xsKHN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncykKK3sKKwl1MTYgd3c7CisKKwkvKiAgdHVybiBvZmYgTUFVVE8gKi8KKwl3cml0ZWIoMCwgJnJlZ3MtPk1JSUNSKTsKKwlmb3IgKHd3ID0gMDsgd3cgPCBXX01BWF9USU1FT1VUOyB3dysrKSB7CisJCXVkZWxheSgxKTsKKwkJaWYgKEJZVEVfUkVHX0JJVFNfSVNfT04oTUlJU1JfTUlETEUsICZyZWdzLT5NSUlTUikpCisJCQlicmVhazsKKwl9Cit9CisKKy8qKgorICoJZW5hYmxlX21paV9hdXRvcG9sbAktCXR1cm4gb24gYXV0b3BvbGxpbmcKKyAqCUByZWdzOiB2ZWxvY2l0eSByZWdpc3RlcnMKKyAqCisgKglFbmFibGUgdGhlIE1JSSBsaW5rIHN0YXR1cyBhdXRvcG9sbCBmZWF0dXJlIG9uIHRoZSBWZWxvY2l0eQorICoJaGFyZHdhcmUuIFdhaXQgZm9yIGl0IHRvIGVuYWJsZS4KKyAqLworCitzdGF0aWMgdm9pZCBlbmFibGVfbWlpX2F1dG9wb2xsKHN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncykKK3sKKwlpbnQgaWk7CisKKwl3cml0ZWIoMCwgJihyZWdzLT5NSUlDUikpOworCXdyaXRlYihNSUlBRFJfU1dNUEwsICZyZWdzLT5NSUlBRFIpOworCisJZm9yIChpaSA9IDA7IGlpIDwgV19NQVhfVElNRU9VVDsgaWkrKykgeworCQl1ZGVsYXkoMSk7CisJCWlmIChCWVRFX1JFR19CSVRTX0lTX09OKE1JSVNSX01JRExFLCAmcmVncy0+TUlJU1IpKQorCQkJYnJlYWs7CisJfQorCisJd3JpdGViKE1JSUNSX01BVVRPLCAmcmVncy0+TUlJQ1IpOworCisJZm9yIChpaSA9IDA7IGlpIDwgV19NQVhfVElNRU9VVDsgaWkrKykgeworCQl1ZGVsYXkoMSk7CisJCWlmICghQllURV9SRUdfQklUU19JU19PTihNSUlTUl9NSURMRSwgJnJlZ3MtPk1JSVNSKSkKKwkJCWJyZWFrOworCX0KKworfQorCisvKioKKyAqCXZlbG9jaXR5X21paV9yZWFkCS0JcmVhZCBNSUkgZGF0YQorICoJQHJlZ3M6IHZlbG9jaXR5IHJlZ2lzdGVycworICoJQGluZGV4OiBNSUkgcmVnaXN0ZXIgaW5kZXgKKyAqCUBkYXRhOiBidWZmZXIgZm9yIHJlY2VpdmVkIGRhdGEKKyAqCisgKglQZXJmb3JtIGEgc2luZ2xlIHJlYWQgb2YgYW4gTUlJIDE2Yml0IHJlZ2lzdGVyLiBSZXR1cm5zIHplcm8KKyAqCW9uIHN1Y2Nlc3Mgb3IgLUVUSU1FRE9VVCBpZiB0aGUgUEhZIGRpZCBub3QgcmVzcG9uZC4KKyAqLworIAorc3RhdGljIGludCB2ZWxvY2l0eV9taWlfcmVhZChzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqcmVncywgdTggaW5kZXgsIHUxNiAqZGF0YSkKK3sKKwl1MTYgd3c7CisKKwkvKgorCSAqCURpc2FibGUgTUlJQ1JfTUFVVE8sIHNvIHRoYXQgbWlpIGFkZHIgY2FuIGJlIHNldCBub3JtYWxseQorCSAqLworCXNhZmVfZGlzYWJsZV9taWlfYXV0b3BvbGwocmVncyk7CisKKwl3cml0ZWIoaW5kZXgsICZyZWdzLT5NSUlBRFIpOworCisJQllURV9SRUdfQklUU19PTihNSUlDUl9SQ01ELCAmcmVncy0+TUlJQ1IpOworCisJZm9yICh3dyA9IDA7IHd3IDwgV19NQVhfVElNRU9VVDsgd3crKykgeworCQlpZiAoIShyZWFkYigmcmVncy0+TUlJQ1IpICYgTUlJQ1JfUkNNRCkpCisJCQlicmVhazsKKwl9CisKKwkqZGF0YSA9IHJlYWR3KCZyZWdzLT5NSUlEQVRBKTsKKworCWVuYWJsZV9taWlfYXV0b3BvbGwocmVncyk7CisJaWYgKHd3ID09IFdfTUFYX1RJTUVPVVQpCisJCXJldHVybiAtRVRJTUVET1VUOworCXJldHVybiAwOworfQorCisvKioKKyAqCXZlbG9jaXR5X21paV93cml0ZQktCXdyaXRlIE1JSSBkYXRhCisgKglAcmVnczogdmVsb2NpdHkgcmVnaXN0ZXJzCisgKglAaW5kZXg6IE1JSSByZWdpc3RlciBpbmRleAorICoJQGRhdGE6IDE2Yml0IGRhdGEgZm9yIHRoZSBNSUkgcmVnaXN0ZXIKKyAqCisgKglQZXJmb3JtIGEgc2luZ2xlIHdyaXRlIHRvIGFuIE1JSSAxNmJpdCByZWdpc3Rlci4gUmV0dXJucyB6ZXJvCisgKglvbiBzdWNjZXNzIG9yIC1FVElNRURPVVQgaWYgdGhlIFBIWSBkaWQgbm90IHJlc3BvbmQuCisgKi8KKyAKK3N0YXRpYyBpbnQgdmVsb2NpdHlfbWlpX3dyaXRlKHN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICpyZWdzLCB1OCBtaWlfYWRkciwgdTE2IGRhdGEpCit7CisJdTE2IHd3OworCisJLyoKKwkgKglEaXNhYmxlIE1JSUNSX01BVVRPLCBzbyB0aGF0IG1paSBhZGRyIGNhbiBiZSBzZXQgbm9ybWFsbHkKKwkgKi8KKwlzYWZlX2Rpc2FibGVfbWlpX2F1dG9wb2xsKHJlZ3MpOworCisJLyogTUlJIHJlZyBvZmZzZXQgKi8KKwl3cml0ZWIobWlpX2FkZHIsICZyZWdzLT5NSUlBRFIpOworCS8qIHNldCBNSUkgZGF0YSAqLworCXdyaXRldyhkYXRhLCAmcmVncy0+TUlJREFUQSk7CisKKwkvKiB0dXJuIG9uIE1JSUNSX1dDTUQgKi8KKwlCWVRFX1JFR19CSVRTX09OKE1JSUNSX1dDTUQsICZyZWdzLT5NSUlDUik7CisKKwkvKiBXX01BWF9USU1FT1VUIGlzIHRoZSB0aW1lb3V0IHBlcmlvZCAqLworCWZvciAod3cgPSAwOyB3dyA8IFdfTUFYX1RJTUVPVVQ7IHd3KyspIHsKKwkJdWRlbGF5KDUpOworCQlpZiAoIShyZWFkYigmcmVncy0+TUlJQ1IpICYgTUlJQ1JfV0NNRCkpCisJCQlicmVhazsKKwl9CisJZW5hYmxlX21paV9hdXRvcG9sbChyZWdzKTsKKworCWlmICh3dyA9PSBXX01BWF9USU1FT1VUKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9nZXRfb3B0X21lZGlhX21vZGUJLQlnZXQgbWVkaWEgc2VsZWN0aW9uCisgKglAdnB0cjogdmVsb2NpdHkgYWRhcHRlcgorICoKKyAqCUdldCB0aGUgbWVkaWEgbW9kZSBzdG9yZWQgaW4gRUVQUk9NIG9yIG1vZHVsZSBvcHRpb25zIGFuZCBsb2FkCisgKgltaWlfc3RhdHVzIGFjY29yZGluZ2x5LiBUaGUgcmVxdWVzdGVkIGxpbmsgc3RhdGUgaW5mb3JtYXRpb24KKyAqCWlzIGFsc28gcmV0dXJuZWQuCisgKi8KKyAKK3N0YXRpYyB1MzIgdmVsb2NpdHlfZ2V0X29wdF9tZWRpYV9tb2RlKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCXUzMiBzdGF0dXMgPSAwOworCisJc3dpdGNoICh2cHRyLT5vcHRpb25zLnNwZF9kcHgpIHsKKwljYXNlIFNQRF9EUFhfQVVUTzoKKwkJc3RhdHVzID0gVkVMT0NJVFlfQVVUT05FR19FTkFCTEU7CisJCWJyZWFrOworCWNhc2UgU1BEX0RQWF8xMDBfRlVMTDoKKwkJc3RhdHVzID0gVkVMT0NJVFlfU1BFRURfMTAwIHwgVkVMT0NJVFlfRFVQTEVYX0ZVTEw7CisJCWJyZWFrOworCWNhc2UgU1BEX0RQWF8xMF9GVUxMOgorCQlzdGF0dXMgPSBWRUxPQ0lUWV9TUEVFRF8xMCB8IFZFTE9DSVRZX0RVUExFWF9GVUxMOworCQlicmVhazsKKwljYXNlIFNQRF9EUFhfMTAwX0hBTEY6CisJCXN0YXR1cyA9IFZFTE9DSVRZX1NQRUVEXzEwMDsKKwkJYnJlYWs7CisJY2FzZSBTUERfRFBYXzEwX0hBTEY6CisJCXN0YXR1cyA9IFZFTE9DSVRZX1NQRUVEXzEwOworCQlicmVhazsKKwl9CisJdnB0ci0+bWlpX3N0YXR1cyA9IHN0YXR1czsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqCW1paV9zZXRfYXV0b19vbgkJLQlhdXRvbmVnb3RpYXRlIG9uCisgKglAdnB0cjogdmVsb2NpdHkKKyAqCisgKglFbmFibGUgYXV0b25lZ290YXRpb24gb24gdGhpcyBpbnRlcmZhY2UKKyAqLworIAorc3RhdGljIHZvaWQgbWlpX3NldF9hdXRvX29uKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCWlmIChNSUlfUkVHX0JJVFNfSVNfT04oQk1DUl9BVVRPLCBNSUlfUkVHX0JNQ1IsIHZwdHItPm1hY19yZWdzKSkKKwkJTUlJX1JFR19CSVRTX09OKEJNQ1JfUkVBVVRPLCBNSUlfUkVHX0JNQ1IsIHZwdHItPm1hY19yZWdzKTsKKwllbHNlCisJCU1JSV9SRUdfQklUU19PTihCTUNSX0FVVE8sIE1JSV9SRUdfQk1DUiwgdnB0ci0+bWFjX3JlZ3MpOworfQorCisKKy8qCitzdGF0aWMgdm9pZCBtaWlfc2V0X2F1dG9fb2ZmKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICogdnB0cikKK3sKKyAgICBNSUlfUkVHX0JJVFNfT0ZGKEJNQ1JfQVVUTywgTUlJX1JFR19CTUNSLCB2cHRyLT5tYWNfcmVncyk7Cit9CisqLworCisvKioKKyAqCXNldF9taWlfZmxvd19jb250cm9sCS0JZmxvdyBjb250cm9sIHNldHVwCisgKglAdnB0cjogdmVsb2NpdHkgaW50ZXJmYWNlCisgKgorICoJU2V0IHVwIHRoZSBmbG93IGNvbnRyb2wgb24gdGhpcyBpbnRlcmZhY2UgYWNjb3JkaW5nIHRvCisgKgl0aGUgc3VwcGxpZWQgdXNlci9lZXByb20gb3B0aW9ucy4KKyAqLworIAorc3RhdGljIHZvaWQgc2V0X21paV9mbG93X2NvbnRyb2woc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJLypFbmFibGUgb3IgRGlzYWJsZSBQQVVTRSBpbiBBTkFSICovCisJc3dpdGNoICh2cHRyLT5vcHRpb25zLmZsb3dfY250bCkgeworCWNhc2UgRkxPV19DTlRMX1RYOgorCQlNSUlfUkVHX0JJVFNfT0ZGKEFOQVJfUEFVU0UsIE1JSV9SRUdfQU5BUiwgdnB0ci0+bWFjX3JlZ3MpOworCQlNSUlfUkVHX0JJVFNfT04oQU5BUl9BU01ESVIsIE1JSV9SRUdfQU5BUiwgdnB0ci0+bWFjX3JlZ3MpOworCQlicmVhazsKKworCWNhc2UgRkxPV19DTlRMX1JYOgorCQlNSUlfUkVHX0JJVFNfT04oQU5BUl9QQVVTRSwgTUlJX1JFR19BTkFSLCB2cHRyLT5tYWNfcmVncyk7CisJCU1JSV9SRUdfQklUU19PTihBTkFSX0FTTURJUiwgTUlJX1JFR19BTkFSLCB2cHRyLT5tYWNfcmVncyk7CisJCWJyZWFrOworCisJY2FzZSBGTE9XX0NOVExfVFhfUlg6CisJCU1JSV9SRUdfQklUU19PTihBTkFSX1BBVVNFLCBNSUlfUkVHX0FOQVIsIHZwdHItPm1hY19yZWdzKTsKKwkJTUlJX1JFR19CSVRTX09OKEFOQVJfQVNNRElSLCBNSUlfUkVHX0FOQVIsIHZwdHItPm1hY19yZWdzKTsKKwkJYnJlYWs7CisKKwljYXNlIEZMT1dfQ05UTF9ESVNBQkxFOgorCQlNSUlfUkVHX0JJVFNfT0ZGKEFOQVJfUEFVU0UsIE1JSV9SRUdfQU5BUiwgdnB0ci0+bWFjX3JlZ3MpOworCQlNSUlfUkVHX0JJVFNfT0ZGKEFOQVJfQVNNRElSLCBNSUlfUkVHX0FOQVIsIHZwdHItPm1hY19yZWdzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqCXZlbG9jaXR5X3NldF9tZWRpYV9tb2RlCQktCXNldCBtZWRpYSBtb2RlCisgKglAbWlpX3N0YXR1czogb2xkIE1JSSBsaW5rIHN0YXRlCisgKgorICoJQ2hlY2sgdGhlIG1lZGlhIGxpbmsgc3RhdGUgYW5kIGNvbmZpZ3VyZSB0aGUgZmxvdyBjb250cm9sCisgKglQSFkgYW5kIGFsc28gdmVsb2NpdHkgaGFyZHdhcmUgc2V0dXAgYWNjb3JkaW5nbHkuIEluIHBhcnRpY3VsYXIKKyAqCXdlIG5lZWQgdG8gc2V0IHVwIENEIHBvbGxpbmcgYW5kIGZyYW1lIGJ1cnN0aW5nLgorICovCisgCitzdGF0aWMgaW50IHZlbG9jaXR5X3NldF9tZWRpYV9tb2RlKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLCB1MzIgbWlpX3N0YXR1cykKK3sKKwl1MzIgY3Vycl9zdGF0dXM7CisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzID0gdnB0ci0+bWFjX3JlZ3M7CisKKwl2cHRyLT5taWlfc3RhdHVzID0gbWlpX2NoZWNrX21lZGlhX21vZGUodnB0ci0+bWFjX3JlZ3MpOworCWN1cnJfc3RhdHVzID0gdnB0ci0+bWlpX3N0YXR1cyAmICh+VkVMT0NJVFlfTElOS19GQUlMKTsKKworCS8qIFNldCBtaWkgbGluayBzdGF0dXMgKi8KKwlzZXRfbWlpX2Zsb3dfY29udHJvbCh2cHRyKTsKKworCS8qCisJICAgQ2hlY2sgaWYgbmV3IHN0YXR1cyBpcyBjb25zaXNlbnQgd2l0aCBjdXJyZW50IHN0YXR1cworCSAgIGlmICgoKG1paV9zdGF0dXMgJiBjdXJyX3N0YXR1cykgJiBWRUxPQ0lUWV9BVVRPTkVHX0VOQUJMRSkKKwkgICB8fCAobWlpX3N0YXR1cz09Y3Vycl9zdGF0dXMpKSB7CisJICAgdnB0ci0+bWlpX3N0YXR1cz1taWlfY2hlY2tfbWVkaWFfbW9kZSh2cHRyLT5tYWNfcmVncyk7CisJICAgdnB0ci0+bWlpX3N0YXR1cz1jaGVja19jb25uZWN0aW9uX3R5cGUodnB0ci0+bWFjX3JlZ3MpOworCSAgIFZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgIlZlbG9jaXR5IGxpbmsgbm8gY2hhbmdlXG4iKTsKKwkgICByZXR1cm4gMDsKKwkgICB9CisJICovCisKKwlpZiAoUEhZSURfR0VUX1BIWV9JRCh2cHRyLT5waHlfaWQpID09IFBIWUlEX0NJQ0FEQV9DUzgyMDEpIHsKKwkJTUlJX1JFR19CSVRTX09OKEFVWENSX01EUFBTLCBNSUlfUkVHX0FVWENSLCB2cHRyLT5tYWNfcmVncyk7CisJfQorCisJLyoKKwkgKglJZiBjb25uZWN0aW9uIHR5cGUgaXMgQVVUTworCSAqLworCWlmIChtaWlfc3RhdHVzICYgVkVMT0NJVFlfQVVUT05FR19FTkFCTEUpIHsKKwkJVkVMT0NJVFlfUFJUKE1TR19MRVZFTF9JTkZPLCAiVmVsb2NpdHkgaXMgQVVUTyBtb2RlXG4iKTsKKwkJLyogY2xlYXIgZm9yY2UgTUFDIG1vZGUgYml0ICovCisJCUJZVEVfUkVHX0JJVFNfT0ZGKENISVBHQ1JfRkNNT0RFLCAmcmVncy0+Q0hJUEdDUik7CisJCS8qIHNldCBkdXBsZXggbW9kZSBvZiBNQUMgYWNjb3JkaW5nIHRvIGR1cGxleCBtb2RlIG9mIE1JSSAqLworCQlNSUlfUkVHX0JJVFNfT04oQU5BUl9UWEZEIHwgQU5BUl9UWCB8IEFOQVJfMTBGRCB8IEFOQVJfMTAsIE1JSV9SRUdfQU5BUiwgdnB0ci0+bWFjX3JlZ3MpOworCQlNSUlfUkVHX0JJVFNfT04oRzEwMDBDUl8xMDAwRkQgfCBHMTAwMENSXzEwMDAsIE1JSV9SRUdfRzEwMDBDUiwgdnB0ci0+bWFjX3JlZ3MpOworCQlNSUlfUkVHX0JJVFNfT04oQk1DUl9TUEVFRDFHLCBNSUlfUkVHX0JNQ1IsIHZwdHItPm1hY19yZWdzKTsKKworCQkvKiBlbmFibGUgQVVUTy1ORUdPIG1vZGUgKi8KKwkJbWlpX3NldF9hdXRvX29uKHZwdHIpOworCX0gZWxzZSB7CisJCXUxNiBBTkFSOworCQl1OCBDSElQR0NSOworCisJCS8qCisJCSAqIDEuIGlmIGl0J3MgMzExOSwgZGlzYWJsZSBmcmFtZSBidXJzdGluZyBpbiBoYWxmZHVwbGV4IG1vZGUKKwkJICogICAgYW5kIGVuYWJsZSBpdCBpbiBmdWxsZHVwbGV4IG1vZGUKKwkJICogMi4gc2V0IGNvcnJlY3QgTUlJL0dNSUkgYW5kIGhhbGYvZnVsbCBkdXBsZXggbW9kZSBpbiBDSElQR0NSCisJCSAqIDMuIG9ubHkgZW5hYmxlIENEIGhlYXJ0IGJlYXQgY291bnRlciBpbiAxMEhEIG1vZGUKKwkJICovCisKKwkJLyogc2V0IGZvcmNlIE1BQyBtb2RlIGJpdCAqLworCQlCWVRFX1JFR19CSVRTX09OKENISVBHQ1JfRkNNT0RFLCAmcmVncy0+Q0hJUEdDUik7CisKKwkJQ0hJUEdDUiA9IHJlYWRiKCZyZWdzLT5DSElQR0NSKTsKKwkJQ0hJUEdDUiAmPSB+Q0hJUEdDUl9GQ0dNSUk7CisKKwkJaWYgKG1paV9zdGF0dXMgJiBWRUxPQ0lUWV9EVVBMRVhfRlVMTCkgeworCQkJQ0hJUEdDUiB8PSBDSElQR0NSX0ZDRkRYOworCQkJd3JpdGViKENISVBHQ1IsICZyZWdzLT5DSElQR0NSKTsKKwkJCVZFTE9DSVRZX1BSVChNU0dfTEVWRUxfSU5GTywgInNldCBWZWxvY2l0eSB0byBmb3JjZWQgZnVsbCBtb2RlXG4iKTsKKwkJCWlmICh2cHRyLT5yZXZfaWQgPCBSRVZfSURfVlQzMjE2X0EwKQorCQkJCUJZVEVfUkVHX0JJVFNfT0ZGKFRDUl9UQjJCRElTLCAmcmVncy0+VENSKTsKKwkJfSBlbHNlIHsKKwkJCUNISVBHQ1IgJj0gfkNISVBHQ1JfRkNGRFg7CisJCQlWRUxPQ0lUWV9QUlQoTVNHX0xFVkVMX0lORk8sICJzZXQgVmVsb2NpdHkgdG8gZm9yY2VkIGhhbGYgbW9kZVxuIik7CisJCQl3cml0ZWIoQ0hJUEdDUiwgJnJlZ3MtPkNISVBHQ1IpOworCQkJaWYgKHZwdHItPnJldl9pZCA8IFJFVl9JRF9WVDMyMTZfQTApCisJCQkJQllURV9SRUdfQklUU19PTihUQ1JfVEIyQkRJUywgJnJlZ3MtPlRDUik7CisJCX0KKworCQlNSUlfUkVHX0JJVFNfT0ZGKEcxMDAwQ1JfMTAwMEZEIHwgRzEwMDBDUl8xMDAwLCBNSUlfUkVHX0cxMDAwQ1IsIHZwdHItPm1hY19yZWdzKTsKKworCQlpZiAoIShtaWlfc3RhdHVzICYgVkVMT0NJVFlfRFVQTEVYX0ZVTEwpICYmIChtaWlfc3RhdHVzICYgVkVMT0NJVFlfU1BFRURfMTApKSB7CisJCQlCWVRFX1JFR19CSVRTX09GRihURVNUQ0ZHX0hCRElTLCAmcmVncy0+VEVTVENGRyk7CisJCX0gZWxzZSB7CisJCQlCWVRFX1JFR19CSVRTX09OKFRFU1RDRkdfSEJESVMsICZyZWdzLT5URVNUQ0ZHKTsKKwkJfQorCQkvKiBNSUlfUkVHX0JJVFNfT0ZGKEJNQ1JfU1BFRUQxRywgTUlJX1JFR19CTUNSLCB2cHRyLT5tYWNfcmVncyk7ICovCisJCXZlbG9jaXR5X21paV9yZWFkKHZwdHItPm1hY19yZWdzLCBNSUlfUkVHX0FOQVIsICZBTkFSKTsKKwkJQU5BUiAmPSAofihBTkFSX1RYRkQgfCBBTkFSX1RYIHwgQU5BUl8xMEZEIHwgQU5BUl8xMCkpOworCQlpZiAobWlpX3N0YXR1cyAmIFZFTE9DSVRZX1NQRUVEXzEwMCkgeworCQkJaWYgKG1paV9zdGF0dXMgJiBWRUxPQ0lUWV9EVVBMRVhfRlVMTCkKKwkJCQlBTkFSIHw9IEFOQVJfVFhGRDsKKwkJCWVsc2UKKwkJCQlBTkFSIHw9IEFOQVJfVFg7CisJCX0gZWxzZSB7CisJCQlpZiAobWlpX3N0YXR1cyAmIFZFTE9DSVRZX0RVUExFWF9GVUxMKQorCQkJCUFOQVIgfD0gQU5BUl8xMEZEOworCQkJZWxzZQorCQkJCUFOQVIgfD0gQU5BUl8xMDsKKwkJfQorCQl2ZWxvY2l0eV9taWlfd3JpdGUodnB0ci0+bWFjX3JlZ3MsIE1JSV9SRUdfQU5BUiwgQU5BUik7CisJCS8qIGVuYWJsZSBBVVRPLU5FR08gbW9kZSAqLworCQltaWlfc2V0X2F1dG9fb24odnB0cik7CisJCS8qIE1JSV9SRUdfQklUU19PTihCTUNSX0FVVE8sIE1JSV9SRUdfQk1DUiwgdnB0ci0+bWFjX3JlZ3MpOyAqLworCX0KKwkvKiB2cHRyLT5taWlfc3RhdHVzPW1paV9jaGVja19tZWRpYV9tb2RlKHZwdHItPm1hY19yZWdzKTsgKi8KKwkvKiB2cHRyLT5taWlfc3RhdHVzPWNoZWNrX2Nvbm5lY3Rpb25fdHlwZSh2cHRyLT5tYWNfcmVncyk7ICovCisJcmV0dXJuIFZFTE9DSVRZX0xJTktfQ0hBTkdFOworfQorCisvKioKKyAqCW1paV9jaGVja19tZWRpYV9tb2RlCS0JY2hlY2sgbWVkaWEgc3RhdGUKKyAqCUByZWdzOiB2ZWxvY2l0eSByZWdpc3RlcnMKKyAqCisgKglDaGVjayB0aGUgY3VycmVudCBNSUkgc3RhdHVzIGFuZCBkZXRlcm1pbmUgdGhlIGxpbmsgc3RhdHVzCisgKglhY2NvcmRpbmdseQorICovCisgCitzdGF0aWMgdTMyIG1paV9jaGVja19tZWRpYV9tb2RlKHN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncykKK3sKKwl1MzIgc3RhdHVzID0gMDsKKwl1MTYgQU5BUjsKKworCWlmICghTUlJX1JFR19CSVRTX0lTX09OKEJNU1JfTE5LLCBNSUlfUkVHX0JNU1IsIHJlZ3MpKQorCQlzdGF0dXMgfD0gVkVMT0NJVFlfTElOS19GQUlMOworCisJaWYgKE1JSV9SRUdfQklUU19JU19PTihHMTAwMENSXzEwMDBGRCwgTUlJX1JFR19HMTAwMENSLCByZWdzKSkKKwkJc3RhdHVzIHw9IFZFTE9DSVRZX1NQRUVEXzEwMDAgfCBWRUxPQ0lUWV9EVVBMRVhfRlVMTDsKKwllbHNlIGlmIChNSUlfUkVHX0JJVFNfSVNfT04oRzEwMDBDUl8xMDAwLCBNSUlfUkVHX0cxMDAwQ1IsIHJlZ3MpKQorCQlzdGF0dXMgfD0gKFZFTE9DSVRZX1NQRUVEXzEwMDApOworCWVsc2UgeworCQl2ZWxvY2l0eV9taWlfcmVhZChyZWdzLCBNSUlfUkVHX0FOQVIsICZBTkFSKTsKKwkJaWYgKEFOQVIgJiBBTkFSX1RYRkQpCisJCQlzdGF0dXMgfD0gKFZFTE9DSVRZX1NQRUVEXzEwMCB8IFZFTE9DSVRZX0RVUExFWF9GVUxMKTsKKwkJZWxzZSBpZiAoQU5BUiAmIEFOQVJfVFgpCisJCQlzdGF0dXMgfD0gVkVMT0NJVFlfU1BFRURfMTAwOworCQllbHNlIGlmIChBTkFSICYgQU5BUl8xMEZEKQorCQkJc3RhdHVzIHw9IChWRUxPQ0lUWV9TUEVFRF8xMCB8IFZFTE9DSVRZX0RVUExFWF9GVUxMKTsKKwkJZWxzZQorCQkJc3RhdHVzIHw9IChWRUxPQ0lUWV9TUEVFRF8xMCk7CisJfQorCisJaWYgKE1JSV9SRUdfQklUU19JU19PTihCTUNSX0FVVE8sIE1JSV9SRUdfQk1DUiwgcmVncykpIHsKKwkJdmVsb2NpdHlfbWlpX3JlYWQocmVncywgTUlJX1JFR19BTkFSLCAmQU5BUik7CisJCWlmICgoQU5BUiAmIChBTkFSX1RYRkQgfCBBTkFSX1RYIHwgQU5BUl8xMEZEIHwgQU5BUl8xMCkpCisJCSAgICA9PSAoQU5BUl9UWEZEIHwgQU5BUl9UWCB8IEFOQVJfMTBGRCB8IEFOQVJfMTApKSB7CisJCQlpZiAoTUlJX1JFR19CSVRTX0lTX09OKEcxMDAwQ1JfMTAwMCB8IEcxMDAwQ1JfMTAwMEZELCBNSUlfUkVHX0cxMDAwQ1IsIHJlZ3MpKQorCQkJCXN0YXR1cyB8PSBWRUxPQ0lUWV9BVVRPTkVHX0VOQUJMRTsKKwkJfQorCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB1MzIgY2hlY2tfY29ubmVjdGlvbl90eXBlKHN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncykKK3sKKwl1MzIgc3RhdHVzID0gMDsKKwl1OCBQSFlTUjA7CisJdTE2IEFOQVI7CisJUEhZU1IwID0gcmVhZGIoJnJlZ3MtPlBIWVNSMCk7CisKKwkvKgorCSAgIGlmICghKFBIWVNSMCAmIFBIWVNSMF9MSU5LR0QpKQorCSAgIHN0YXR1c3w9VkVMT0NJVFlfTElOS19GQUlMOworCSAqLworCisJaWYgKFBIWVNSMCAmIFBIWVNSMF9GRFBYKQorCQlzdGF0dXMgfD0gVkVMT0NJVFlfRFVQTEVYX0ZVTEw7CisKKwlpZiAoUEhZU1IwICYgUEhZU1IwX1NQREcpCisJCXN0YXR1cyB8PSBWRUxPQ0lUWV9TUEVFRF8xMDAwOworCWlmIChQSFlTUjAgJiBQSFlTUjBfU1BEMTApCisJCXN0YXR1cyB8PSBWRUxPQ0lUWV9TUEVFRF8xMDsKKwllbHNlCisJCXN0YXR1cyB8PSBWRUxPQ0lUWV9TUEVFRF8xMDA7CisKKwlpZiAoTUlJX1JFR19CSVRTX0lTX09OKEJNQ1JfQVVUTywgTUlJX1JFR19CTUNSLCByZWdzKSkgeworCQl2ZWxvY2l0eV9taWlfcmVhZChyZWdzLCBNSUlfUkVHX0FOQVIsICZBTkFSKTsKKwkJaWYgKChBTkFSICYgKEFOQVJfVFhGRCB8IEFOQVJfVFggfCBBTkFSXzEwRkQgfCBBTkFSXzEwKSkKKwkJICAgID09IChBTkFSX1RYRkQgfCBBTkFSX1RYIHwgQU5BUl8xMEZEIHwgQU5BUl8xMCkpIHsKKwkJCWlmIChNSUlfUkVHX0JJVFNfSVNfT04oRzEwMDBDUl8xMDAwIHwgRzEwMDBDUl8xMDAwRkQsIE1JSV9SRUdfRzEwMDBDUiwgcmVncykpCisJCQkJc3RhdHVzIHw9IFZFTE9DSVRZX0FVVE9ORUdfRU5BQkxFOworCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKgllbmFibGVfZmxvd19jb250cm9sX2FiaWxpdHkJLQlmbG93IGNvbnRyb2wKKyAqCUB2cHRyOiB2ZWxvaXR5IHRvIGNvbmZpZ3VyZQorICoKKyAqCVNldCB1cCBmbG93IGNvbnRyb2wgYWNjb3JkaW5nIHRvIHRoZSBmbG93IGNvbnRyb2wgb3B0aW9ucworICoJZGV0ZXJtaW5lZCBieSB0aGUgZWVwcm9tL2NvbmZpZ3VyYXRpb24uCisgKi8KKworc3RhdGljIHZvaWQgZW5hYmxlX2Zsb3dfY29udHJvbF9hYmlsaXR5KHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzID0gdnB0ci0+bWFjX3JlZ3M7CisKKwlzd2l0Y2ggKHZwdHItPm9wdGlvbnMuZmxvd19jbnRsKSB7CisKKwljYXNlIEZMT1dfQ05UTF9ERUZBVUxUOgorCQlpZiAoQllURV9SRUdfQklUU19JU19PTihQSFlTUjBfUlhGTEMsICZyZWdzLT5QSFlTUjApKQorCQkJd3JpdGVsKENSMF9GRFhSRkNFTiwgJnJlZ3MtPkNSMFNldCk7CisJCWVsc2UKKwkJCXdyaXRlbChDUjBfRkRYUkZDRU4sICZyZWdzLT5DUjBDbHIpOworCisJCWlmIChCWVRFX1JFR19CSVRTX0lTX09OKFBIWVNSMF9UWEZMQywgJnJlZ3MtPlBIWVNSMCkpCisJCQl3cml0ZWwoQ1IwX0ZEWFRGQ0VOLCAmcmVncy0+Q1IwU2V0KTsKKwkJZWxzZQorCQkJd3JpdGVsKENSMF9GRFhURkNFTiwgJnJlZ3MtPkNSMENscik7CisJCWJyZWFrOworCisJY2FzZSBGTE9XX0NOVExfVFg6CisJCXdyaXRlbChDUjBfRkRYVEZDRU4sICZyZWdzLT5DUjBTZXQpOworCQl3cml0ZWwoQ1IwX0ZEWFJGQ0VOLCAmcmVncy0+Q1IwQ2xyKTsKKwkJYnJlYWs7CisKKwljYXNlIEZMT1dfQ05UTF9SWDoKKwkJd3JpdGVsKENSMF9GRFhSRkNFTiwgJnJlZ3MtPkNSMFNldCk7CisJCXdyaXRlbChDUjBfRkRYVEZDRU4sICZyZWdzLT5DUjBDbHIpOworCQlicmVhazsKKworCWNhc2UgRkxPV19DTlRMX1RYX1JYOgorCQl3cml0ZWwoQ1IwX0ZEWFRGQ0VOLCAmcmVncy0+Q1IwU2V0KTsKKwkJd3JpdGVsKENSMF9GRFhSRkNFTiwgJnJlZ3MtPkNSMFNldCk7CisJCWJyZWFrOworCisJY2FzZSBGTE9XX0NOVExfRElTQUJMRToKKwkJd3JpdGVsKENSMF9GRFhSRkNFTiwgJnJlZ3MtPkNSMENscik7CisJCXdyaXRlbChDUjBfRkRYVEZDRU4sICZyZWdzLT5DUjBDbHIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworfQorCisKKy8qKgorICoJdmVsb2NpdHlfZXRodG9vbF91cAktCXByZSBob29rIGZvciBldGh0b29sCisgKglAZGV2OiBuZXR3b3JrIGRldmljZQorICoKKyAqCUNhbGxlZCBiZWZvcmUgYW4gZXRodG9vbCBvcGVyYXRpb24uIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZQorICoJY2hpcCBpcyBvdXQgb2YgRDMgc3RhdGUgYmVmb3JlIHdlIHBva2UgYXQgaXQuCisgKi8KKyAKK3N0YXRpYyBpbnQgdmVsb2NpdHlfZXRodG9vbF91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyID0gZGV2LT5wcml2OworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHZwdHItPnBkZXYsIFBDSV9EMCk7CisJcmV0dXJuIDA7Cit9CQorCisvKioKKyAqCXZlbG9jaXR5X2V0aHRvb2xfZG93bgktCXBvc3QgaG9vayBmb3IgZXRodG9vbAorICoJQGRldjogbmV0d29yayBkZXZpY2UKKyAqCisgKglDYWxsZWQgYWZ0ZXIgYW4gZXRodG9vbCBvcGVyYXRpb24uIFJlc3RvcmUgdGhlIGNoaXAgYmFjayB0byBEMworICoJc3RhdGUgaWYgaXQgaXNuJ3QgcnVubmluZy4KKyAqLworIAorc3RhdGljIHZvaWQgdmVsb2NpdHlfZXRodG9vbF9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBkZXYtPnByaXY7CisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXBjaV9zZXRfcG93ZXJfc3RhdGUodnB0ci0+cGRldiwgUENJX0QzaG90KTsKK30KKworc3RhdGljIGludCB2ZWxvY2l0eV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBkZXYtPnByaXY7CisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzID0gdnB0ci0+bWFjX3JlZ3M7CisJdTMyIHN0YXR1czsKKwlzdGF0dXMgPSBjaGVja19jb25uZWN0aW9uX3R5cGUodnB0ci0+bWFjX3JlZ3MpOworCisJY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfVFAgfCBTVVBQT1JURURfQXV0b25lZyB8IFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbDsKKwlpZiAoc3RhdHVzICYgVkVMT0NJVFlfU1BFRURfMTAwKQorCQljbWQtPnNwZWVkID0gU1BFRURfMTAwOworCWVsc2UKKwkJY21kLT5zcGVlZCA9IFNQRUVEXzEwOworCWNtZC0+YXV0b25lZyA9IChzdGF0dXMgJiBWRUxPQ0lUWV9BVVRPTkVHX0VOQUJMRSkgPyBBVVRPTkVHX0VOQUJMRSA6IEFVVE9ORUdfRElTQUJMRTsKKwljbWQtPnBvcnQgPSBQT1JUX1RQOworCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCWNtZC0+cGh5X2FkZHJlc3MgPSByZWFkYigmcmVncy0+TUlJQURSKSAmIDB4MUY7CisKKwlpZiAoc3RhdHVzICYgVkVMT0NJVFlfRFVQTEVYX0ZVTEwpCisJCWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJZWxzZQorCQljbWQtPmR1cGxleCA9IERVUExFWF9IQUxGOworCQkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZWxvY2l0eV9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBkZXYtPnByaXY7CisJdTMyIGN1cnJfc3RhdHVzOworCXUzMiBuZXdfc3RhdHVzID0gMDsKKwlpbnQgcmV0ID0gMDsKKwkKKwljdXJyX3N0YXR1cyA9IGNoZWNrX2Nvbm5lY3Rpb25fdHlwZSh2cHRyLT5tYWNfcmVncyk7CisJY3Vycl9zdGF0dXMgJj0gKH5WRUxPQ0lUWV9MSU5LX0ZBSUwpOworCisJbmV3X3N0YXR1cyB8PSAoKGNtZC0+YXV0b25lZykgPyBWRUxPQ0lUWV9BVVRPTkVHX0VOQUJMRSA6IDApOworCW5ld19zdGF0dXMgfD0gKChjbWQtPnNwZWVkID09IFNQRUVEXzEwMCkgPyBWRUxPQ0lUWV9TUEVFRF8xMDAgOiAwKTsKKwluZXdfc3RhdHVzIHw9ICgoY21kLT5zcGVlZCA9PSBTUEVFRF8xMCkgPyBWRUxPQ0lUWV9TUEVFRF8xMCA6IDApOworCW5ld19zdGF0dXMgfD0gKChjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkgPyBWRUxPQ0lUWV9EVVBMRVhfRlVMTCA6IDApOworCisJaWYgKChuZXdfc3RhdHVzICYgVkVMT0NJVFlfQVVUT05FR19FTkFCTEUpICYmIChuZXdfc3RhdHVzICE9IChjdXJyX3N0YXR1cyB8IFZFTE9DSVRZX0FVVE9ORUdfRU5BQkxFKSkpCisJCXJldCA9IC1FSU5WQUw7CisJZWxzZQorCQl2ZWxvY2l0eV9zZXRfbWVkaWFfbW9kZSh2cHRyLCBuZXdfc3RhdHVzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1MzIgdmVsb2NpdHlfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKwlyZXR1cm4gQllURV9SRUdfQklUU19JU19PTihQSFlTUjBfTElOS0dELCAmcmVncy0+UEhZU1IwKSAgPyAwIDogMTsKK30KKworc3RhdGljIHZvaWQgdmVsb2NpdHlfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IGRldi0+cHJpdjsKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCBWRUxPQ0lUWV9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgVkVMT0NJVFlfVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZSh2cHRyLT5wZGV2KSk7Cit9CisKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X2V0aHRvb2xfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBkZXYtPnByaXY7CisJd29sLT5zdXBwb3J0ZWQgPSBXQUtFX1BIWSB8IFdBS0VfTUFHSUMgfCBXQUtFX1VDQVNUIHwgV0FLRV9BUlA7CisJd29sLT53b2xvcHRzIHw9IFdBS0VfTUFHSUM7CisJLyoKKwkgICBpZiAodnB0ci0+d29sX29wdHMgJiBWRUxPQ0lUWV9XT0xfUEhZKQorCQkgICB3b2wud29sb3B0c3w9V0FLRV9QSFk7CisJCQkgKi8KKwlpZiAodnB0ci0+d29sX29wdHMgJiBWRUxPQ0lUWV9XT0xfVUNBU1QpCisJCXdvbC0+d29sb3B0cyB8PSBXQUtFX1VDQVNUOworCWlmICh2cHRyLT53b2xfb3B0cyAmIFZFTE9DSVRZX1dPTF9BUlApCisJCXdvbC0+d29sb3B0cyB8PSBXQUtFX0FSUDsKKwltZW1jcHkoJndvbC0+c29wYXNzLCB2cHRyLT53b2xfcGFzc3dkLCA2KTsKK30KKworc3RhdGljIGludCB2ZWxvY2l0eV9ldGh0b29sX3NldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyID0gZGV2LT5wcml2OworCisJaWYgKCEod29sLT53b2xvcHRzICYgKFdBS0VfUEhZIHwgV0FLRV9NQUdJQyB8IFdBS0VfVUNBU1QgfCBXQUtFX0FSUCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwl2cHRyLT53b2xfb3B0cyA9IFZFTE9DSVRZX1dPTF9NQUdJQzsKKworCS8qCisJICAgaWYgKHdvbC53b2xvcHRzICYgV0FLRV9QSFkpIHsKKwkgICB2cHRyLT53b2xfb3B0c3w9VkVMT0NJVFlfV09MX1BIWTsKKwkgICB2cHRyLT5mbGFncyB8PVZFTE9DSVRZX0ZMQUdTX1dPTF9FTkFCTEVEOworCSAgIH0KKwkgKi8KKworCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX01BR0lDKSB7CisJCXZwdHItPndvbF9vcHRzIHw9IFZFTE9DSVRZX1dPTF9NQUdJQzsKKwkJdnB0ci0+ZmxhZ3MgfD0gVkVMT0NJVFlfRkxBR1NfV09MX0VOQUJMRUQ7CisJfQorCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX1VDQVNUKSB7CisJCXZwdHItPndvbF9vcHRzIHw9IFZFTE9DSVRZX1dPTF9VQ0FTVDsKKwkJdnB0ci0+ZmxhZ3MgfD0gVkVMT0NJVFlfRkxBR1NfV09MX0VOQUJMRUQ7CisJfQorCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX0FSUCkgeworCQl2cHRyLT53b2xfb3B0cyB8PSBWRUxPQ0lUWV9XT0xfQVJQOworCQl2cHRyLT5mbGFncyB8PSBWRUxPQ0lUWV9GTEFHU19XT0xfRU5BQkxFRDsKKwl9CisJbWVtY3B5KHZwdHItPndvbF9wYXNzd2QsIHdvbC0+c29wYXNzLCA2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiB2ZWxvY2l0eV9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gbXNnbGV2ZWw7Cit9CisKK3N0YXRpYyB2b2lkIHZlbG9jaXR5X3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgdmFsdWUpCit7CisJIG1zZ2xldmVsID0gdmFsdWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgdmVsb2NpdHlfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncwk9CXZlbG9jaXR5X2dldF9zZXR0aW5ncywKKwkuc2V0X3NldHRpbmdzCT0JdmVsb2NpdHlfc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbwk9CXZlbG9jaXR5X2dldF9kcnZpbmZvLAorCS5nZXRfd29sCT0JdmVsb2NpdHlfZXRodG9vbF9nZXRfd29sLAorCS5zZXRfd29sCT0JdmVsb2NpdHlfZXRodG9vbF9zZXRfd29sLAorCS5nZXRfbXNnbGV2ZWwJPQl2ZWxvY2l0eV9nZXRfbXNnbGV2ZWwsCisJLnNldF9tc2dsZXZlbAk9CXZlbG9jaXR5X3NldF9tc2dsZXZlbCwKKwkuZ2V0X2xpbmsJPQl2ZWxvY2l0eV9nZXRfbGluaywKKwkuYmVnaW4JCT0JdmVsb2NpdHlfZXRodG9vbF91cCwKKwkuY29tcGxldGUJPQl2ZWxvY2l0eV9ldGh0b29sX2Rvd24KK307CisKKy8qKgorICoJdmVsb2NpdHlfbWlpX2lvY3RsCQktCU1JSSBpb2N0bCBoYW5kbGVyCisgKglAZGV2OiBuZXR3b3JrIGRldmljZQorICoJQGlmcjogdGhlIGlmcmVxIGJsb2NrIGZvciB0aGUgaW9jdGwKKyAqCUBjbWQ6IHRoZSBjb21tYW5kCisgKgorICoJUHJvY2VzcyBNSUkgcmVxdWVzdHMgbWFkZSB2aWEgaW9jdGwgZnJvbSB0aGUgbmV0d29yayBsYXllci4gVGhlc2UKKyAqCWFyZSB1c2VkIGJ5IHRvb2xzIGxpa2Uga3VkenUgdG8gaW50ZXJyb2dhdGUgdGhlIGxpbmsgc3RhdGUgb2YgdGhlCisgKgloYXJkd2FyZQorICovCisgCitzdGF0aWMgaW50IHZlbG9jaXR5X21paV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MgPSB2cHRyLT5tYWNfcmVnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqbWlpZGF0YSA9IGlmX21paShpZnIpOworCWludCBlcnI7CisJCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgorCQltaWlkYXRhLT5waHlfaWQgPSByZWFkYigmcmVncy0+TUlJQURSKSAmIDB4MWY7CisJCWJyZWFrOworCWNhc2UgU0lPQ0dNSUlSRUc6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmKHZlbG9jaXR5X21paV9yZWFkKHZwdHItPm1hY19yZWdzLCBtaWlkYXRhLT5yZWdfbnVtICYgMHgxZiwgJihtaWlkYXRhLT52YWxfb3V0KSkgPCAwKQorCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCWJyZWFrOworCWNhc2UgU0lPQ1NNSUlSRUc6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2cHRyLT5sb2NrLCBmbGFncyk7CisJCWVyciA9IHZlbG9jaXR5X21paV93cml0ZSh2cHRyLT5tYWNfcmVncywgbWlpZGF0YS0+cmVnX251bSAmIDB4MWYsIG1paWRhdGEtPnZhbF9pbik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZwdHItPmxvY2ssIGZsYWdzKTsKKwkJY2hlY2tfY29ubmVjdGlvbl90eXBlKHZwdHItPm1hY19yZWdzKTsKKwkJaWYoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorCisvKioKKyAqCXZlbG9jaXR5X3NhdmVfY29udGV4dAktCXNhdmUgcmVnaXN0ZXJzCisgKglAdnB0cjogdmVsb2NpdHkgCisgKglAY29udGV4dDogYnVmZmVyIGZvciBzdG9yZWQgY29udGV4dAorICoKKyAqCVJldHJpZXZlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgdmVsb2NpdHkgaGFyZHdhcmUKKyAqCWFuZCBzdGFzaCBpdCBpbiB0aGUgY29udGV4dCBzdHJ1Y3R1cmUsIGZvciB1c2UgYnkgdGhlIGNvbnRleHQKKyAqCXJlc3RvcmUgZnVuY3Rpb25zLiBUaGlzIGFsbG93cyB1cyB0byBzYXZlIHRoaW5ncyB3ZSBuZWVkIGFjcm9zcworICoJcG93ZXIgZG93biBzdGF0ZXMKKyAqLworIAorc3RhdGljIHZvaWQgdmVsb2NpdHlfc2F2ZV9jb250ZXh0KHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLCBzdHJ1Y3QgdmVsb2NpdHlfY29udGV4dCAqIGNvbnRleHQpCit7CisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzID0gdnB0ci0+bWFjX3JlZ3M7CisJdTE2IGk7CisJdTggX19pb21lbSAqcHRyID0gKHU4IF9faW9tZW0gKilyZWdzOworCisJZm9yIChpID0gTUFDX1JFR19QQVI7IGkgPCBNQUNfUkVHX0NSMF9DTFI7IGkgKz0gNCkKKwkJKigodTMyICopIChjb250ZXh0LT5tYWNfcmVnICsgaSkpID0gcmVhZGwocHRyICsgaSk7CisKKwlmb3IgKGkgPSBNQUNfUkVHX01BUjsgaSA8IE1BQ19SRUdfVERDU1JfQ0xSOyBpICs9IDQpCisJCSooKHUzMiAqKSAoY29udGV4dC0+bWFjX3JlZyArIGkpKSA9IHJlYWRsKHB0ciArIGkpOworCisJZm9yIChpID0gTUFDX1JFR19SREJBU0VfTE87IGkgPCBNQUNfUkVHX0ZJRk9fVEVTVDA7IGkgKz0gNCkKKwkJKigodTMyICopIChjb250ZXh0LT5tYWNfcmVnICsgaSkpID0gcmVhZGwocHRyICsgaSk7CisKK30KKworLyoqCisgKgl2ZWxvY2l0eV9yZXN0b3JlX2NvbnRleHQJLQlyZXN0b3JlIHJlZ2lzdGVycworICoJQHZwdHI6IHZlbG9jaXR5IAorICoJQGNvbnRleHQ6IGJ1ZmZlciBmb3Igc3RvcmVkIGNvbnRleHQKKyAqCisgKglSZWxvYWQgdGhlIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgdmVsb2NpdHkgY29udGV4dCAKKyAqCWNyZWF0ZWQgYnkgdmVsb2NpdHlfc2F2ZV9jb250ZXh0LgorICovCisgCitzdGF0aWMgdm9pZCB2ZWxvY2l0eV9yZXN0b3JlX2NvbnRleHQoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIsIHN0cnVjdCB2ZWxvY2l0eV9jb250ZXh0ICpjb250ZXh0KQoreworCXN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncyA9IHZwdHItPm1hY19yZWdzOworCWludCBpOworCXU4IF9faW9tZW0gKnB0ciA9ICh1OCBfX2lvbWVtICopcmVnczsKKworCWZvciAoaSA9IE1BQ19SRUdfUEFSOyBpIDwgTUFDX1JFR19DUjBfU0VUOyBpICs9IDQpIHsKKwkJd3JpdGVsKCooKHUzMiAqKSAoY29udGV4dC0+bWFjX3JlZyArIGkpKSwgcHRyICsgaSk7CisJfQorCisJLyogSnVzdCBza2lwIGNyMCAqLworCWZvciAoaSA9IE1BQ19SRUdfQ1IxX1NFVDsgaSA8IE1BQ19SRUdfQ1IwX0NMUjsgaSsrKSB7CisJCS8qIENsZWFyICovCisJCXdyaXRlYih+KCooKHU4ICopIChjb250ZXh0LT5tYWNfcmVnICsgaSkpKSwgcHRyICsgaSArIDQpOworCQkvKiBTZXQgKi8KKwkJd3JpdGViKCooKHU4ICopIChjb250ZXh0LT5tYWNfcmVnICsgaSkpLCBwdHIgKyBpKTsKKwl9CisKKwlmb3IgKGkgPSBNQUNfUkVHX01BUjsgaSA8IE1BQ19SRUdfSU1SOyBpICs9IDQpIHsKKwkJd3JpdGVsKCooKHUzMiAqKSAoY29udGV4dC0+bWFjX3JlZyArIGkpKSwgcHRyICsgaSk7CisJfQorCisJZm9yIChpID0gTUFDX1JFR19SREJBU0VfTE87IGkgPCBNQUNfUkVHX0ZJRk9fVEVTVDA7IGkgKz0gNCkgeworCQl3cml0ZWwoKigodTMyICopIChjb250ZXh0LT5tYWNfcmVnICsgaSkpLCBwdHIgKyBpKTsKKwl9CisKKwlmb3IgKGkgPSBNQUNfUkVHX1REQ1NSX1NFVDsgaSA8PSBNQUNfUkVHX1JEQ1NSX1NFVDsgaSsrKSB7CisJCXdyaXRlYigqKCh1OCAqKSAoY29udGV4dC0+bWFjX3JlZyArIGkpKSwgcHRyICsgaSk7CisJfQorCit9CisKKy8qKgorICoJd29sX2NhbGNfY3JjCQktCVdPTCBDUkMKKyAqCUBwYXR0ZXJuOiBkYXRhIHBhdHRlcm4KKyAqCUBtYXNrX3BhdHRlcm46IG1hc2sKKyAqCisgKglDb21wdXRlIHRoZSB3YWtlIG9uIGxhbiBjcmMgaGFzaGVzIGZvciB0aGUgcGFja2V0IGhlYWRlcgorICoJd2UgYXJlIGludGVyZXN0ZWQgaW4uCisgKi8KKworc3RhdGljIHUxNiB3b2xfY2FsY19jcmMoaW50IHNpemUsIHU4ICogcGF0dGVybiwgdTggKm1hc2tfcGF0dGVybikKK3sKKwl1MTYgY3JjID0gMHhGRkZGOworCXU4IG1hc2s7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCW1hc2sgPSBtYXNrX3BhdHRlcm5baV07CisKKwkJLyogU2tpcCB0aGlzIGxvb3AgaWYgdGhlIG1hc2sgZXF1YWxzIHRvIHplcm8gKi8KKwkJaWYgKG1hc2sgPT0gMHgwMCkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJCWlmICgobWFzayAmIDB4MDEpID09IDApIHsKKwkJCQltYXNrID4+PSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbWFzayA+Pj0gMTsKKwkJCWNyYyA9IGNyY19jY2l0dChjcmMsICYocGF0dGVybltpICogOCArIGpdKSwgMSk7CisJCX0KKwl9CisJLyoJRmluYWxseSwgaW52ZXJ0IHRoZSByZXN1bHQgb25jZSB0byBnZXQgdGhlIGNvcnJlY3QgZGF0YSAqLworCWNyYyA9IH5jcmM7CisJcmV0dXJuIGJpdHJldmVyc2UoY3JjKSA+PiAxNjsKK30KKworLyoqCisgKgl2ZWxvY2l0eV9zZXRfd29sCS0Jc2V0IHVwIGZvciB3YWtlIG9uIGxhbgorICoJQHZwdHI6IHZlbG9jaXR5IHRvIHNldCBXT0wgc3RhdHVzIG9uCisgKgorICoJU2V0IGEgY2FyZCB1cCBmb3Igd2FrZSBvbiBsYW4gZWl0aGVyIGJ5IHVuaWNhc3Qgb3IgYnkKKyAqCUFSUCBwYWNrZXQuCisgKgorICoJRklYTUU6IGNoZWNrIHN0YXRpYyBidWZmZXIgaXMgc2FmZSBoZXJlCisgKi8KKworc3RhdGljIGludCB2ZWxvY2l0eV9zZXRfd29sKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCXN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncyA9IHZwdHItPm1hY19yZWdzOworCXN0YXRpYyB1OCBidWZbMjU2XTsKKwlpbnQgaTsKKworCXN0YXRpYyB1MzIgbWFza19wYXR0ZXJuWzJdWzRdID0geworCQl7MHgwMDIwMzAwMCwgMHgwMDAwMDNDMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwfSwgLyogQVJQICovCisJCXsweGZmZmZmMDAwLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweDAwMGZmZmZ9CSAvKiBNYWdpYyBQYWNrZXQgKi8KKwl9OworCisJd3JpdGV3KDB4RkZGRiwgJnJlZ3MtPldPTENSQ2xyKTsKKwl3cml0ZWIoV09MQ0ZHX1NBQiB8IFdPTENGR19TQU0sICZyZWdzLT5XT0xDRkdTZXQpOworCXdyaXRldyhXT0xDUl9NQUdJQ19FTiwgJnJlZ3MtPldPTENSU2V0KTsKKworCS8qCisJICAgaWYgKHZwdHItPndvbF9vcHRzICYgVkVMT0NJVFlfV09MX1BIWSkKKwkgICB3cml0ZXcoKFdPTENSX0xJTktPTl9FTnxXT0xDUl9MSU5LT0ZGX0VOKSwgJnJlZ3MtPldPTENSU2V0KTsKKwkgKi8KKworCWlmICh2cHRyLT53b2xfb3B0cyAmIFZFTE9DSVRZX1dPTF9VQ0FTVCkgeworCQl3cml0ZXcoV09MQ1JfVU5JQ0FTVF9FTiwgJnJlZ3MtPldPTENSU2V0KTsKKwl9CisKKwlpZiAodnB0ci0+d29sX29wdHMgJiBWRUxPQ0lUWV9XT0xfQVJQKSB7CisJCXN0cnVjdCBhcnBfcGFja2V0ICphcnAgPSAoc3RydWN0IGFycF9wYWNrZXQgKikgYnVmOworCQl1MTYgY3JjOworCQltZW1zZXQoYnVmLCAwLCBzaXplb2Yoc3RydWN0IGFycF9wYWNrZXQpICsgNyk7CisKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJCXdyaXRlbChtYXNrX3BhdHRlcm5bMF1baV0sICZyZWdzLT5CeXRlTWFza1swXVtpXSk7CisKKwkJYXJwLT50eXBlID0gaHRvbnMoRVRIX1BfQVJQKTsKKwkJYXJwLT5hcl9vcCA9IGh0b25zKDEpOworCisJCW1lbWNweShhcnAtPmFyX3RpcCwgdnB0ci0+aXBfYWRkciwgNCk7CisKKwkJY3JjID0gd29sX2NhbGNfY3JjKChzaXplb2Yoc3RydWN0IGFycF9wYWNrZXQpICsgNykgLyA4LCBidWYsCisJCQkJKHU4ICopICYgbWFza19wYXR0ZXJuWzBdWzBdKTsKKworCQl3cml0ZXcoY3JjLCAmcmVncy0+UGF0dGVybkNSQ1swXSk7CisJCXdyaXRldyhXT0xDUl9BUlBfRU4sICZyZWdzLT5XT0xDUlNldCk7CisJfQorCisJQllURV9SRUdfQklUU19PTihQV0NGR19XT0xUWVBFLCAmcmVncy0+UFdDRkdTZXQpOworCUJZVEVfUkVHX0JJVFNfT04oUFdDRkdfTEVHQUNZX1dPTEVOLCAmcmVncy0+UFdDRkdTZXQpOworCisJd3JpdGV3KDB4MEZGRiwgJnJlZ3MtPldPTFNSQ2xyKTsKKworCWlmICh2cHRyLT5taWlfc3RhdHVzICYgVkVMT0NJVFlfQVVUT05FR19FTkFCTEUpIHsKKwkJaWYgKFBIWUlEX0dFVF9QSFlfSUQodnB0ci0+cGh5X2lkKSA9PSBQSFlJRF9DSUNBREFfQ1M4MjAxKQorCQkJTUlJX1JFR19CSVRTX09OKEFVWENSX01EUFBTLCBNSUlfUkVHX0FVWENSLCB2cHRyLT5tYWNfcmVncyk7CisKKwkJTUlJX1JFR19CSVRTX09GRihHMTAwMENSXzEwMDBGRCB8IEcxMDAwQ1JfMTAwMCwgTUlJX1JFR19HMTAwMENSLCB2cHRyLT5tYWNfcmVncyk7CisJfQorCisJaWYgKHZwdHItPm1paV9zdGF0dXMgJiBWRUxPQ0lUWV9TUEVFRF8xMDAwKQorCQlNSUlfUkVHX0JJVFNfT04oQk1DUl9SRUFVVE8sIE1JSV9SRUdfQk1DUiwgdnB0ci0+bWFjX3JlZ3MpOworCisJQllURV9SRUdfQklUU19PTihDSElQR0NSX0ZDTU9ERSwgJnJlZ3MtPkNISVBHQ1IpOworCisJeworCQl1OCBHQ1I7CisJCUdDUiA9IHJlYWRiKCZyZWdzLT5DSElQR0NSKTsKKwkJR0NSID0gKEdDUiAmIH5DSElQR0NSX0ZDR01JSSkgfCBDSElQR0NSX0ZDRkRYOworCQl3cml0ZWIoR0NSLCAmcmVncy0+Q0hJUEdDUik7CisJfQorCisJQllURV9SRUdfQklUU19PRkYoSVNSX1BXRUksICZyZWdzLT5JU1IpOworCS8qIFR1cm4gb24gU1dQVEFHIGp1c3QgYmVmb3JlIGVudGVyaW5nIHBvd2VyIG1vZGUgKi8KKwlCWVRFX1JFR19CSVRTX09OKFNUSUNLSFdfU1dQVEFHLCAmcmVncy0+U1RJQ0tIVyk7CisJLyogR28gdG8gYmVkIC4uLi4uICovCisJQllURV9SRUdfQklUU19PTigoU1RJQ0tIV19EUzEgfCBTVElDS0hXX0RTMCksICZyZWdzLT5TVElDS0hXKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZlbG9jaXR5X3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYoIW5ldGlmX3J1bm5pbmcodnB0ci0+ZGV2KSkKKwkJcmV0dXJuIDA7CisKKwluZXRpZl9kZXZpY2VfZGV0YWNoKHZwdHItPmRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdnB0ci0+bG9jaywgZmxhZ3MpOworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworI2lmZGVmIEVUSFRPT0xfR1dPTAorCWlmICh2cHRyLT5mbGFncyAmIFZFTE9DSVRZX0ZMQUdTX1dPTF9FTkFCTEVEKSB7CisJCXZlbG9jaXR5X2dldF9pcCh2cHRyKTsKKwkJdmVsb2NpdHlfc2F2ZV9jb250ZXh0KHZwdHIsICZ2cHRyLT5jb250ZXh0KTsKKwkJdmVsb2NpdHlfc2h1dGRvd24odnB0cik7CisJCXZlbG9jaXR5X3NldF93b2wodnB0cik7CisJCXBjaV9lbmFibGVfd2FrZShwZGV2LCAzLCAxKTsKKwkJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDNob3QpOworCX0gZWxzZSB7CisJCXZlbG9jaXR5X3NhdmVfY29udGV4dCh2cHRyLCAmdnB0ci0+Y29udGV4dCk7CisJCXZlbG9jaXR5X3NodXRkb3duKHZwdHIpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOworCX0KKyNlbHNlCisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CisjZW5kaWYKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cHRyLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVsb2NpdHlfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlpZighbmV0aWZfcnVubmluZyh2cHRyLT5kZXYpKQorCQlyZXR1cm4gMDsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgMCwgMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisKKwltYWNfd29sX3Jlc2V0KHZwdHItPm1hY19yZWdzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2cHRyLT5sb2NrLCBmbGFncyk7CisJdmVsb2NpdHlfcmVzdG9yZV9jb250ZXh0KHZwdHIsICZ2cHRyLT5jb250ZXh0KTsKKwl2ZWxvY2l0eV9pbml0X3JlZ2lzdGVycyh2cHRyLCBWRUxPQ0lUWV9JTklUX1dPTCk7CisJbWFjX2Rpc2FibGVfaW50KHZwdHItPm1hY19yZWdzKTsKKworCXZlbG9jaXR5X3R4X3Nydih2cHRyLCAwKTsKKworCWZvciAoaSA9IDA7IGkgPCB2cHRyLT5udW1fdHhxOyBpKyspIHsKKwkJaWYgKHZwdHItPnRkX3VzZWRbaV0pIHsKKwkJCW1hY190eF9xdWV1ZV93YWtlKHZwdHItPm1hY19yZWdzLCBpKTsKKwkJfQorCX0KKworCW1hY19lbmFibGVfaW50KHZwdHItPm1hY19yZWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2cHRyLT5sb2NrLCBmbGFncyk7CisJbmV0aWZfZGV2aWNlX2F0dGFjaCh2cHRyLT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVsb2NpdHlfbmV0ZGV2X2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgbm90aWZpY2F0aW9uLCB2b2lkICpwdHIpCit7CisJc3RydWN0IGluX2lmYWRkciAqaWZhID0gKHN0cnVjdCBpbl9pZmFkZHIgKikgcHRyOworCisJaWYgKGlmYSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWZhLT5pZmFfZGV2LT5kZXY7CisJCXN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZWxvY2l0eV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodnB0ciwgJnZlbG9jaXR5X2Rldl9saXN0LCBsaXN0KSB7CisJCQlpZiAodnB0ci0+ZGV2ID09IGRldikgeworCQkJCXZlbG9jaXR5X2dldF9pcCh2cHRyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2ZWxvY2l0eV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmggYi9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjcwYjdjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmgKQEAgLTAsMCArMSwxODc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LCAyMDAzIFZJQSBOZXR3b3JraW5nIFRlY2hub2xvZ2llcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWQorICogb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogRmlsZTogdmlhLXZlbG9jaXR5LmgKKyAqCisgKiBQdXJwb3NlOiBIZWFkZXIgZmlsZSB0byBkZWZpbmUgZHJpdmVyJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmVzLgorICoKKyAqIEF1dGhvcjogQ2h1YW5nIExpYW5nLVNoaW5nLCBBSiBKaWFuZworICoKKyAqIERhdGU6IEphbiAyNCwgMjAwMworICovCisKKworI2lmbmRlZiBWRUxPQ0lUWV9ICisjZGVmaW5lIFZFTE9DSVRZX0gKKworI2RlZmluZSBWRUxPQ0lUWV9UWF9DU1VNX1NVUFBPUlQKKworI2RlZmluZSBWRUxPQ0lUWV9OQU1FICAgICAgICAgICJ2aWEtdmVsb2NpdHkiCisjZGVmaW5lIFZFTE9DSVRZX0ZVTExfRFJWX05BTSAgIlZJQSBOZXR3b3JraW5nIFZlbG9jaXR5IEZhbWlseSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIgRHJpdmVyIgorI2RlZmluZSBWRUxPQ0lUWV9WRVJTSU9OICAgICAgICIxLjEzIgorCisjZGVmaW5lIFBLVF9CVUZfU1ogICAgICAgICAgMTU0MAorCisjZGVmaW5lIE1BWF9VTklUUyAgICAgICAgICAgOAorI2RlZmluZSBPUFRJT05fREVGQVVMVCAgICAgIHsgWzAgLi4uIE1BWF9VTklUUy0xXSA9IC0xfQorCisjZGVmaW5lIFJFVl9JRF9WVDYxMTAgICAgICAgKDApCisKKyNkZWZpbmUgQllURV9SRUdfQklUU19PTih4LHApICAgICAgIGRvIHsgd3JpdGViKHJlYWRiKChwKSl8KHgpLChwKSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgV09SRF9SRUdfQklUU19PTih4LHApICAgICAgIGRvIHsgd3JpdGV3KHJlYWR3KChwKSl8KHgpLChwKSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgRFdPUkRfUkVHX0JJVFNfT04oeCxwKSAgICAgIGRvIHsgd3JpdGVsKHJlYWRsKChwKSl8KHgpLChwKSk7fSB3aGlsZSAoMCkKKworI2RlZmluZSBCWVRFX1JFR19CSVRTX0lTX09OKHgscCkgICAgKHJlYWRiKChwKSkgJiAoeCkpCisjZGVmaW5lIFdPUkRfUkVHX0JJVFNfSVNfT04oeCxwKSAgICAocmVhZHcoKHApKSAmICh4KSkKKyNkZWZpbmUgRFdPUkRfUkVHX0JJVFNfSVNfT04oeCxwKSAgIChyZWFkbCgocCkpICYgKHgpKQorCisjZGVmaW5lIEJZVEVfUkVHX0JJVFNfT0ZGKHgscCkgICAgICBkbyB7IHdyaXRlYihyZWFkYigocCkpICYgKH4oeCkpLChwKSk7fSB3aGlsZSAoMCkKKyNkZWZpbmUgV09SRF9SRUdfQklUU19PRkYoeCxwKSAgICAgIGRvIHsgd3JpdGV3KHJlYWR3KChwKSkgJiAofih4KSksKHApKTt9IHdoaWxlICgwKQorI2RlZmluZSBEV09SRF9SRUdfQklUU19PRkYoeCxwKSAgICAgZG8geyB3cml0ZWwocmVhZGwoKHApKSAmICh+KHgpKSwocCkpO30gd2hpbGUgKDApCisKKyNkZWZpbmUgQllURV9SRUdfQklUU19TRVQoeCxtLHApICAgIGRvIHsgd3JpdGViKCAocmVhZGIoKHApKSAmICh+KG0pKSkgfCh4KSwocCkpO30gd2hpbGUgKDApCisjZGVmaW5lIFdPUkRfUkVHX0JJVFNfU0VUKHgsbSxwKSAgICBkbyB7IHdyaXRldyggKHJlYWR3KChwKSkgJiAofihtKSkpIHwoeCksKHApKTt9IHdoaWxlICgwKQorI2RlZmluZSBEV09SRF9SRUdfQklUU19TRVQoeCxtLHApICAgZG8geyB3cml0ZWwoIChyZWFkbCgocCkpICYgKH4obSkpKXwoeCksKHApKTt9ICB3aGlsZSAoMCkKKworI2RlZmluZSBWQVJfVVNFRChwKSAgICAgZG8geyhwKT0ocCk7fSB3aGlsZSAoMCkKKworLyoKKyAqIFB1cnBvc2U6IFN0cnVjdHVyZXMgZm9yIE1BWCBSWC9UWCBkZXNjcmlwdG9ycy4KKyAqLworCisKKyNkZWZpbmUgQl9PV05FRF9CWV9DSElQICAgICAxCisjZGVmaW5lIEJfT1dORURfQllfSE9TVCAgICAgMAorCisvKgorICogQml0cyBpbiB0aGUgUlNSMCByZWdpc3RlcgorICovCisKKyNkZWZpbmUgUlNSX0RFVEFHICAgICAgICAgIDB4MDA4MAorI2RlZmluZSBSU1JfU05UQUcgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIFJTUl9SWEVSICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgUlNSX1JMICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBSU1JfQ0UgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFJTUl9GQUUgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgUlNSX0NSQyAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBSU1JfVklETSAgICAgICAgICAgMHgwMDAxCisKKy8qCisgKiBCaXRzIGluIHRoZSBSU1IxIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBSU1JfUlhPSyAgICAgICAgICAgMHg4MDAwCS8vIHJ4IE9LCisjZGVmaW5lIFJTUl9QRlQgICAgICAgICAgICAweDQwMDAJLy8gUGVyZmVjdCBmaWx0ZXJpbmcgYWRkcmVzcyBtYXRjaAorI2RlZmluZSBSU1JfTUFSICAgICAgICAgICAgMHgyMDAwCS8vIE1BQyBhY2NlcHQgbXVsdGljYXN0IGFkZHJlc3MgcGFja2V0CisjZGVmaW5lIFJTUl9CQVIgICAgICAgICAgICAweDEwMDAJLy8gTUFDIGFjY2VwdCBicm9hZGNhc3QgYWRkcmVzcyBwYWNrZXQKKyNkZWZpbmUgUlNSX1BIWSAgICAgICAgICAgIDB4MDgwMAkvLyBNQUMgYWNjZXB0IHBoeXNpY2FsIGFkZHJlc3MgcGFja2V0CisjZGVmaW5lIFJTUl9WVEFHICAgICAgICAgICAweDA0MDAJLy8gODAyLjFwLzFxIHRhZ2dpbmcgcGFja2V0IGluZGljYXRvcgorI2RlZmluZSBSU1JfU1RQICAgICAgICAgICAgMHgwMjAwCS8vIHN0YXJ0IG9mIHBhY2tldAorI2RlZmluZSBSU1JfRURQICAgICAgICAgICAgMHgwMTAwCS8vIGVuZCBvZiBwYWNrZXQKKworLyoKKyAqIEJpdHMgaW4gdGhlIFJTUjEgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIFJTUjFfUlhPSyAgICAgICAgICAgMHg4MAkvLyByeCBPSworI2RlZmluZSBSU1IxX1BGVCAgICAgICAgICAgIDB4NDAJLy8gUGVyZmVjdCBmaWx0ZXJpbmcgYWRkcmVzcyBtYXRjaAorI2RlZmluZSBSU1IxX01BUiAgICAgICAgICAgIDB4MjAJLy8gTUFDIGFjY2VwdCBtdWx0aWNhc3QgYWRkcmVzcyBwYWNrZXQKKyNkZWZpbmUgUlNSMV9CQVIgICAgICAgICAgICAweDEwCS8vIE1BQyBhY2NlcHQgYnJvYWRjYXN0IGFkZHJlc3MgcGFja2V0CisjZGVmaW5lIFJTUjFfUEhZICAgICAgICAgICAgMHgwOAkvLyBNQUMgYWNjZXB0IHBoeXNpY2FsIGFkZHJlc3MgcGFja2V0CisjZGVmaW5lIFJTUjFfVlRBRyAgICAgICAgICAgMHgwNAkvLyA4MDIuMXAvMXEgdGFnZ2luZyBwYWNrZXQgaW5kaWNhdG9yCisjZGVmaW5lIFJTUjFfU1RQICAgICAgICAgICAgMHgwMgkvLyBzdGFydCBvZiBwYWNrZXQKKyNkZWZpbmUgUlNSMV9FRFAgICAgICAgICAgICAweDAxCS8vIGVuZCBvZiBwYWNrZXQKKworLyoKKyAqIEJpdHMgaW4gdGhlIENTTSByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ1NNX0lQT0sgICAgICAgICAgICAweDQwCS8vSVAgQ2hlY2t1c20gdmFsaWRhdGlhb24gb2sKKyNkZWZpbmUgQ1NNX1RVUE9LICAgICAgICAgICAweDIwCS8vVENQL1VEUCBDaGVja3VzbSB2YWxpZGF0aWFvbiBvaworI2RlZmluZSBDU01fRlJBRyAgICAgICAgICAgIDB4MTAJLy9GcmFnbWVudCBJUCBkYXRhZ3JhbQorI2RlZmluZSBDU01fSVBLVCAgICAgICAgICAgIDB4MDQJLy9SZWNlaXZlZCBhbiBJUCBwYWNrZXQKKyNkZWZpbmUgQ1NNX1RDUEtUICAgICAgICAgICAweDAyCS8vUmVjZWl2ZWQgYSBUQ1AgcGFja2V0CisjZGVmaW5lIENTTV9VRFBLVCAgICAgICAgICAgMHgwMQkvL1JlY2VpdmVkIGEgVURQIHBhY2tldAorCisvKgorICogQml0cyBpbiB0aGUgVFNSMCByZWdpc3RlcgorICovCisKKyNkZWZpbmUgVFNSMF9BQlQgICAgICAgICAgICAweDAwODAJLy8gVHggYWJvcnQgYmVjYXVzZSBvZiBleGNlc3NpdmUgY29sbGlzaW9uCisjZGVmaW5lIFRTUjBfT1dUICAgICAgICAgICAgMHgwMDQwCS8vIEp1bWJvIGZyYW1lIFR4IGFib3J0CisjZGVmaW5lIFRTUjBfT1dDICAgICAgICAgICAgMHgwMDIwCS8vIE91dCBvZiB3aW5kb3cgY29sbGlzaW9uCisjZGVmaW5lIFRTUjBfQ09MUyAgICAgICAgICAgMHgwMDEwCS8vIGV4cGVyaWVuY2UgY29sbGlzaW9uIGluIHRoaXMgdHJhbnNtaXQgZXZlbnQKKyNkZWZpbmUgVFNSMF9OQ1IzICAgICAgICAgICAweDAwMDgJLy8gY29sbGlzaW9uIHJldHJ5IGNvdW50ZXJbM10KKyNkZWZpbmUgVFNSMF9OQ1IyICAgICAgICAgICAweDAwMDQJLy8gY29sbGlzaW9uIHJldHJ5IGNvdW50ZXJbMl0KKyNkZWZpbmUgVFNSMF9OQ1IxICAgICAgICAgICAweDAwMDIJLy8gY29sbGlzaW9uIHJldHJ5IGNvdW50ZXJbMV0KKyNkZWZpbmUgVFNSMF9OQ1IwICAgICAgICAgICAweDAwMDEJLy8gY29sbGlzaW9uIHJldHJ5IGNvdW50ZXJbMF0KKyNkZWZpbmUgVFNSMF9URVJSICAgICAgICAgICAweDgwMDAJLy8KKyNkZWZpbmUgVFNSMF9GRFggICAgICAgICAgICAweDQwMDAJLy8gY3VycmVudCB0cmFuc2FjdGlvbiBpcyBzZXJ2aWNlZCBieSBmdWxsIGR1cGxleCBtb2RlCisjZGVmaW5lIFRTUjBfR01JSSAgICAgICAgICAgMHgyMDAwCS8vIGN1cnJlbnQgdHJhbnNhY3Rpb24gaXMgc2VydmljZWQgYnkgR01JSSBtb2RlCisjZGVmaW5lIFRTUjBfTE5LRkwgICAgICAgICAgMHgxMDAwCS8vIHBhY2tldCBzZXJ2aWNlZCBkdXJpbmcgbGluayBkb3duCisjZGVmaW5lIFRTUjBfU0hETiAgICAgICAgICAgMHgwNDAwCS8vIHNodXRkb3duIGNhc2UKKyNkZWZpbmUgVFNSMF9DUlMgICAgICAgICAgICAweDAyMDAJLy8gY2FycmllciBzZW5zZSBsb3N0CisjZGVmaW5lIFRTUjBfQ0RIICAgICAgICAgICAgMHgwMTAwCS8vIEFRRSB0ZXN0IGZhaWwgKENEIGhlYXJ0YmVhdCkKKworLyoKKyAqIEJpdHMgaW4gdGhlIFRTUjEgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIFRTUjFfVEVSUiAgICAgICAgICAgMHg4MAkvLworI2RlZmluZSBUU1IxX0ZEWCAgICAgICAgICAgIDB4NDAJLy8gY3VycmVudCB0cmFuc2FjdGlvbiBpcyBzZXJ2aWNlZCBieSBmdWxsIGR1cGxleCBtb2RlCisjZGVmaW5lIFRTUjFfR01JSSAgICAgICAgICAgMHgyMAkvLyBjdXJyZW50IHRyYW5zYWN0aW9uIGlzIHNlcnZpY2VkIGJ5IEdNSUkgbW9kZQorI2RlZmluZSBUU1IxX0xOS0ZMICAgICAgICAgIDB4MTAJLy8gcGFja2V0IHNlcnZpY2VkIGR1cmluZyBsaW5rIGRvd24KKyNkZWZpbmUgVFNSMV9TSEROICAgICAgICAgICAweDA0CS8vIHNodXRkb3duIGNhc2UKKyNkZWZpbmUgVFNSMV9DUlMgICAgICAgICAgICAweDAyCS8vIGNhcnJpZXIgc2Vuc2UgbG9zdAorI2RlZmluZSBUU1IxX0NESCAgICAgICAgICAgIDB4MDEJLy8gQVFFIHRlc3QgZmFpbCAoQ0QgaGVhcnRiZWF0KQorCisvLworLy8gQml0cyBpbiB0aGUgVENSMCByZWdpc3RlcgorLy8KKyNkZWZpbmUgVENSMF9USUMgICAgICAgICAgICAweDgwCS8vIGFzc2VydCBpbnRlcnJ1cHQgaW1tZWRpYXRlbHkgd2hpbGUgZGVzY3JpcHRvciBoYXMgYmVlbiBzZW5kIGNvbXBsZXRlCisjZGVmaW5lIFRDUjBfUElDICAgICAgICAgICAgMHg0MAkvLyBwcmlvcml0eSBpbnRlcnJ1cHQgcmVxdWVzdCwgSU5BIyBpcyBpc3N1ZWQgb3ZlciBhZGFwdGl2ZSBpbnRlcnJ1cHQgc2NoZW1lCisjZGVmaW5lIFRDUjBfVkVUQUcgICAgICAgICAgMHgyMAkvLyBlbmFibGUgVkxBTiB0YWcKKyNkZWZpbmUgVENSMF9JUENLICAgICAgICAgICAweDEwCS8vIHJlcXVlc3QgSVAgIGNoZWNrc3VtIGNhbGN1bGF0aW9uLgorI2RlZmluZSBUQ1IwX1VEUENLICAgICAgICAgIDB4MDgJLy8gcmVxdWVzdCBVRFAgY2hlY2tzdW0gY2FsY3VsYXRpb24uCisjZGVmaW5lIFRDUjBfVENQQ0sgICAgICAgICAgMHgwNAkvLyByZXF1ZXN0IFRDUCBjaGVja3N1bSBjYWxjdWxhdGlvbi4KKyNkZWZpbmUgVENSMF9KTUJPICAgICAgICAgICAweDAyCS8vIGluZGljYXRlIGEganVtYm8gcGFja2V0IGluIEdNQUMgc2lkZQorI2RlZmluZSBUQ1IwX0NSQyAgICAgICAgICAgIDB4MDEJLy8gZGlzYWJsZSBDUkMgZ2VuZXJhdGlvbgorCisjZGVmaW5lIFRDUExTX05PUk1BTCAgICAgICAgMworI2RlZmluZSBUQ1BMU19TVEFSVCAgICAgICAgIDIKKyNkZWZpbmUgVENQTFNfRU5EICAgICAgICAgICAxCisjZGVmaW5lIFRDUExTX01FRCAgICAgICAgICAgMAorCisKKy8vIG1heCB0cmFuc21pdCBvciByZWNlaXZlIGJ1ZmZlciBzaXplCisjZGVmaW5lIENCX1JYX0JVRl9TSVpFICAgICAyMDQ4VUwJLy8gbWF4IGJ1ZmZlciBzaXplCisJCQkJCS8vIE5PVEU6IG11c3QgYmUgbXVsdGlwbGUgb2YgNAorCisjZGVmaW5lIENCX01BWF9SRF9OVU0gICAgICAgNTEyCS8vIE1BWCAjIG9mIFJECisjZGVmaW5lIENCX01BWF9URF9OVU0gICAgICAgMjU2CS8vIE1BWCAjIG9mIFRECisKKyNkZWZpbmUgQ0JfSU5JVF9SRF9OVU1fMzExOSAxMjgJLy8gaW5pdCAjIG9mIFJELCBmb3Igc2V0dXAgVlQzMTE5CisjZGVmaW5lIENCX0lOSVRfVERfTlVNXzMxMTkgNjQJLy8gaW5pdCAjIG9mIFRELCBmb3Igc2V0dXAgVlQzMTE5CisKKyNkZWZpbmUgQ0JfSU5JVF9SRF9OVU0gICAgICAxMjgJLy8gaW5pdCAjIG9mIFJELCBmb3Igc2V0dXAgZGVmYXVsdAorI2RlZmluZSBDQl9JTklUX1REX05VTSAgICAgIDY0CS8vIGluaXQgIyBvZiBURCwgZm9yIHNldHVwIGRlZmF1bHQKKworLy8gZm9yIDMxMTkKKyNkZWZpbmUgQ0JfVERfUklOR19OVU0gICAgICA0CS8vICMgb2YgVEQgcmluZ3MuCisjZGVmaW5lIENCX01BWF9TRUdfUEVSX1BLVCAgNwkvLyBtYXggZGF0YSBzZWcgcGVyIHBhY2tldCAoVHgpCisKKworLyoKKyAqCUlmIGNvbGxpc2lvbnMgZXhjZXNzIDE1IHRpbWVzICwgdHggd2lsbCBhYm9ydCwgYW5kCisgKglpZiB0eCBmaWZvIHVuZGVyZmxvdywgdHggd2lsbCBmYWlsCisgKgl3ZSBzaG91bGQgdHJ5IHRvIHJlc2VuZCBpdAorICovCisKKyNkZWZpbmUgQ0JfTUFYX1RYX0FCT1JUX1JFVFJZICAgMworCisvKgorICoJUmVjZWl2ZSBkZXNjcmlwdG9yCisgKi8KKworc3RydWN0IHJkZXNjMCB7CisJdTE2IFJTUjsJCS8qIFJlY2VpdmUgc3RhdHVzICovCisJdTE2IGxlbjoxNDsJCS8qIFJlY2VpdmVkIHBhY2tldCBsZW5ndGggKi8KKwl1MTYgcmVzZXJ2ZWQ6MTsKKwl1MTYgb3duZXI6MTsJCS8qIFdobyBvd25zIHRoaXMgYnVmZmVyID8gKi8KK307CisKK3N0cnVjdCByZGVzYzEgeworCXUxNiBQUVRBRzsKKwl1OCBDU007CisJdTggSVBLVDsKK307CisKK3N0cnVjdCByeF9kZXNjIHsKKwlzdHJ1Y3QgcmRlc2MwIHJkZXNjMDsKKwlzdHJ1Y3QgcmRlc2MxIHJkZXNjMTsKKwl1MzIgcGFfbG93OwkJLyogTG93IDMyIGJpdCBQQ0kgYWRkcmVzcyAqLworCXUxNiBwYV9oaWdoOwkJLyogTmV4dCAxNiBiaXQgUENJIGFkZHJlc3MgKDQ4IHRvdGFsKSAqLworCXUxNiBsZW46MTU7CQkvKiBGcmFtZSBzaXplICovCisJdTE2IGludGVuOjE7CQkvKiBFbmFibGUgaW50ZXJydXB0ICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKy8qCisgKglUcmFuc21pdCBkZXNjcmlwdG9yCisgKi8KKworc3RydWN0IHRkZXNjMCB7CisJdTE2IFRTUjsJCS8qIFRyYW5zbWl0IHN0YXR1cyByZWdpc3RlciAqLworCXUxNiBwa3RzaXplOjE0OwkJLyogU2l6ZSBvZiBmcmFtZSAqLworCXUxNiByZXNlcnZlZDoxOworCXUxNiBvd25lcjoxOwkJLyogV2hvIG93bnMgdGhlIGJ1ZmZlciAqLworfTsKKworc3RydWN0IHBxaW5mIHsJCQkvKiBQcmlvcml0eSBxdWV1ZSBpbmZvICovCisJdTE2IFZJRDoxMjsKKwl1MTYgQ0ZJOjE7CisJdTE2IHByaW9yaXR5OjM7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCB0ZGVzYzEgeworCXN0cnVjdCBwcWluZiBwcWluZjsKKwl1OCBUQ1I7CisJdTggVENQTFM6MjsKKwl1OCByZXNlcnZlZDoyOworCXU4IENNRFo6NDsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IHRkX2J1ZiB7CisJdTMyIHBhX2xvdzsKKwl1MTYgcGFfaGlnaDsKKwl1MTYgYnVmc2l6ZToxNDsJCisJdTE2IHJlc2VydmVkOjE7CisJdTE2IHF1ZXVlOjE7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCB0eF9kZXNjIHsKKwlzdHJ1Y3QgdGRlc2MwIHRkZXNjMDsKKwlzdHJ1Y3QgdGRlc2MxIHRkZXNjMTsKKwlzdHJ1Y3QgdGRfYnVmIHRkX2J1Zls3XTsKK307CisKK3N0cnVjdCB2ZWxvY2l0eV9yZF9pbmZvIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWRtYV9hZGRyX3Qgc2tiX2RtYTsKK307CisKKy8qKgorICoJYWxsb2NfcmRfaW5mbwkJLQlhbGxvY2F0ZSBhbiByZCBpbmZvIGJsb2NrCisgKgorICoJQWxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIHJlY2VpdmUgaW5mbyBzdHJ1Y3R1cmUgdXNlZCBmb3Iga2VlcGluZworICoJdHJhY2sgb2Yga2VybmVsIHNpZGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBlYWNoIHJlY2VpdmUKKyAqCWRlc2NyaXB0b3Igd2UgYXJlIHVzaW5nCisgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdmVsb2NpdHlfcmRfaW5mbyAqYWxsb2NfcmRfaW5mbyh2b2lkKQoreworCXN0cnVjdCB2ZWxvY2l0eV9yZF9pbmZvICpwdHI7CisJaWYgKChwdHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmVsb2NpdHlfcmRfaW5mbyksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwllbHNlIHsKKwkJbWVtc2V0KHB0ciwgMCwgc2l6ZW9mKHN0cnVjdCB2ZWxvY2l0eV9yZF9pbmZvKSk7CisJCXJldHVybiBwdHI7CisJfQorfQorCisvKgorICoJVXNlZCB0byB0cmFjayB0cmFuc21pdCBzaWRlIGJ1ZmZlcnMuCisgKi8KKworc3RydWN0IHZlbG9jaXR5X3RkX2luZm8geworCXN0cnVjdCBza19idWZmICpza2I7CisJdTggKmJ1ZjsKKwlpbnQgbnNrYl9kbWE7CisJZG1hX2FkZHJfdCBza2JfZG1hWzddOworCWRtYV9hZGRyX3QgYnVmX2RtYTsKK307CisKK2VudW0gIHZlbG9jaXR5X293bmVyIHsKKwlPV05FRF9CWV9IT1NUID0gMCwKKwlPV05FRF9CWV9OSUMgPSAxCit9OworCisKKy8qCisgKglNQUMgcmVnaXN0ZXJzIGFuZCBtYWNyb3MuCisgKi8KKworCisjZGVmaW5lIE1DQU1fU0laRSAgICAgICAgICAgNjQKKyNkZWZpbmUgVkNBTV9TSVpFICAgICAgICAgICA2NAorI2RlZmluZSBUWF9RVUVVRV9OTyAgICAgICAgIDQKKworI2RlZmluZSBNQVhfSFdfTUlCX0NPVU5URVIgIDMyCisjZGVmaW5lIFZFTE9DSVRZX01JTl9NVFUgICAgKDE1MTQtMTQpCisjZGVmaW5lIFZFTE9DSVRZX01BWF9NVFUgICAgKDkwMDApCisKKy8qCisgKglSZWdpc3RlcnMgaW4gdGhlIE1BQworICovCisKKyNkZWZpbmUgTUFDX1JFR19QQVIgICAgICAgICAweDAwCS8vIHBoeXNpY2FsIGFkZHJlc3MKKyNkZWZpbmUgTUFDX1JFR19SQ1IgICAgICAgICAweDA2CisjZGVmaW5lIE1BQ19SRUdfVENSICAgICAgICAgMHgwNworI2RlZmluZSBNQUNfUkVHX0NSMF9TRVQgICAgIDB4MDgKKyNkZWZpbmUgTUFDX1JFR19DUjFfU0VUICAgICAweDA5CisjZGVmaW5lIE1BQ19SRUdfQ1IyX1NFVCAgICAgMHgwQQorI2RlZmluZSBNQUNfUkVHX0NSM19TRVQgICAgIDB4MEIKKyNkZWZpbmUgTUFDX1JFR19DUjBfQ0xSICAgICAweDBDCisjZGVmaW5lIE1BQ19SRUdfQ1IxX0NMUiAgICAgMHgwRAorI2RlZmluZSBNQUNfUkVHX0NSMl9DTFIgICAgIDB4MEUKKyNkZWZpbmUgTUFDX1JFR19DUjNfQ0xSICAgICAweDBGCisjZGVmaW5lIE1BQ19SRUdfTUFSICAgICAgICAgMHgxMAorI2RlZmluZSBNQUNfUkVHX0NBTSAgICAgICAgIDB4MTAKKyNkZWZpbmUgTUFDX1JFR19ERUNfQkFTRV9ISSAweDE4CisjZGVmaW5lIE1BQ19SRUdfREJGX0JBU0VfSEkgMHgxQworI2RlZmluZSBNQUNfUkVHX0lTUl9DVEwgICAgIDB4MjAKKyNkZWZpbmUgTUFDX1JFR19JU1JfSE9UTVIgICAweDIwCisjZGVmaW5lIE1BQ19SRUdfSVNSX1RTVVBUSFIgMHgyMAorI2RlZmluZSBNQUNfUkVHX0lTUl9SU1VQVEhSIDB4MjAKKyNkZWZpbmUgTUFDX1JFR19JU1JfQ1RMMSAgICAweDIxCisjZGVmaW5lIE1BQ19SRUdfVFhFX1NSICAgICAgMHgyMgorI2RlZmluZSBNQUNfUkVHX1JYRV9TUiAgICAgIDB4MjMKKyNkZWZpbmUgTUFDX1JFR19JU1IgICAgICAgICAweDI0CisjZGVmaW5lIE1BQ19SRUdfSVNSMCAgICAgICAgMHgyNAorI2RlZmluZSBNQUNfUkVHX0lTUjEgICAgICAgIDB4MjUKKyNkZWZpbmUgTUFDX1JFR19JU1IyICAgICAgICAweDI2CisjZGVmaW5lIE1BQ19SRUdfSVNSMyAgICAgICAgMHgyNworI2RlZmluZSBNQUNfUkVHX0lNUiAgICAgICAgIDB4MjgKKyNkZWZpbmUgTUFDX1JFR19JTVIwICAgICAgICAweDI4CisjZGVmaW5lIE1BQ19SRUdfSU1SMSAgICAgICAgMHgyOQorI2RlZmluZSBNQUNfUkVHX0lNUjIgICAgICAgIDB4MkEKKyNkZWZpbmUgTUFDX1JFR19JTVIzICAgICAgICAweDJCCisjZGVmaW5lIE1BQ19SRUdfVERDU1JfU0VUICAgMHgzMAorI2RlZmluZSBNQUNfUkVHX1JEQ1NSX1NFVCAgIDB4MzIKKyNkZWZpbmUgTUFDX1JFR19URENTUl9DTFIgICAweDM0CisjZGVmaW5lIE1BQ19SRUdfUkRDU1JfQ0xSICAgMHgzNgorI2RlZmluZSBNQUNfUkVHX1JEQkFTRV9MTyAgIDB4MzgKKyNkZWZpbmUgTUFDX1JFR19SRElORFggICAgICAweDNDCisjZGVmaW5lIE1BQ19SRUdfVERCQVNFX0xPICAgMHg0MAorI2RlZmluZSBNQUNfUkVHX1JEQ1NJWkUgICAgIDB4NTAKKyNkZWZpbmUgTUFDX1JFR19URENTSVpFICAgICAweDUyCisjZGVmaW5lIE1BQ19SRUdfVERJTkRYICAgICAgMHg1NAorI2RlZmluZSBNQUNfUkVHX1RESURYMCAgICAgIDB4NTQKKyNkZWZpbmUgTUFDX1JFR19URElEWDEgICAgICAweDU2CisjZGVmaW5lIE1BQ19SRUdfVERJRFgyICAgICAgMHg1OAorI2RlZmluZSBNQUNfUkVHX1RESURYMyAgICAgIDB4NUEKKyNkZWZpbmUgTUFDX1JFR19QQVVTRV9USU1FUiAweDVDCisjZGVmaW5lIE1BQ19SRUdfUkJSRFUgICAgICAgMHg1RQorI2RlZmluZSBNQUNfUkVHX0ZJRk9fVEVTVDAgIDB4NjAKKyNkZWZpbmUgTUFDX1JFR19GSUZPX1RFU1QxICAweDY0CisjZGVmaW5lIE1BQ19SRUdfQ0FNQUREUiAgICAgMHg2OAorI2RlZmluZSBNQUNfUkVHX0NBTUNSICAgICAgIDB4NjkKKyNkZWZpbmUgTUFDX1JFR19HRlRFU1QgICAgICAweDZBCisjZGVmaW5lIE1BQ19SRUdfRlRTVENNRCAgICAgMHg2QgorI2RlZmluZSBNQUNfUkVHX01JSUNGRyAgICAgIDB4NkMKKyNkZWZpbmUgTUFDX1JFR19NSUlTUiAgICAgICAweDZECisjZGVmaW5lIE1BQ19SRUdfUEhZU1IwICAgICAgMHg2RQorI2RlZmluZSBNQUNfUkVHX1BIWVNSMSAgICAgIDB4NkYKKyNkZWZpbmUgTUFDX1JFR19NSUlDUiAgICAgICAweDcwCisjZGVmaW5lIE1BQ19SRUdfTUlJQURSICAgICAgMHg3MQorI2RlZmluZSBNQUNfUkVHX01JSURBVEEgICAgIDB4NzIKKyNkZWZpbmUgTUFDX1JFR19TT0ZUX1RJTUVSMCAweDc0CisjZGVmaW5lIE1BQ19SRUdfU09GVF9USU1FUjEgMHg3NgorI2RlZmluZSBNQUNfUkVHX0NGR0EgICAgICAgIDB4NzgKKyNkZWZpbmUgTUFDX1JFR19DRkdCICAgICAgICAweDc5CisjZGVmaW5lIE1BQ19SRUdfQ0ZHQyAgICAgICAgMHg3QQorI2RlZmluZSBNQUNfUkVHX0NGR0QgICAgICAgIDB4N0IKKyNkZWZpbmUgTUFDX1JFR19EQ0ZHMCAgICAgICAweDdDCisjZGVmaW5lIE1BQ19SRUdfRENGRzEgICAgICAgMHg3RAorI2RlZmluZSBNQUNfUkVHX01DRkcwICAgICAgIDB4N0UKKyNkZWZpbmUgTUFDX1JFR19NQ0ZHMSAgICAgICAweDdGCisKKyNkZWZpbmUgTUFDX1JFR19UQklTVCAgICAgICAweDgwCisjZGVmaW5lIE1BQ19SRUdfUkJJU1QgICAgICAgMHg4MQorI2RlZmluZSBNQUNfUkVHX1BNQ0MgICAgICAgIDB4ODIKKyNkZWZpbmUgTUFDX1JFR19TVElDS0hXICAgICAweDgzCisjZGVmaW5lIE1BQ19SRUdfTUlCQ1IgICAgICAgMHg4NAorI2RlZmluZSBNQUNfUkVHX0VFUlNWICAgICAgIDB4ODUKKyNkZWZpbmUgTUFDX1JFR19SRVZJRCAgICAgICAweDg2CisjZGVmaW5lIE1BQ19SRUdfTUlCUkVBRCAgICAgMHg4OAorI2RlZmluZSBNQUNfUkVHX0JQTUEgICAgICAgIDB4OEMKKyNkZWZpbmUgTUFDX1JFR19FRVdSX0RBVEEgICAweDhDCisjZGVmaW5lIE1BQ19SRUdfQlBNRF9XUiAgICAgMHg4RgorI2RlZmluZSBNQUNfUkVHX0JQQ01EICAgICAgIDB4OTAKKyNkZWZpbmUgTUFDX1JFR19CUE1EX1JEICAgICAweDkxCisjZGVmaW5lIE1BQ19SRUdfRUVDSEtTVU0gICAgMHg5MgorI2RlZmluZSBNQUNfUkVHX0VFQ1NSICAgICAgIDB4OTMKKyNkZWZpbmUgTUFDX1JFR19FRVJEX0RBVEEgICAweDk0CisjZGVmaW5lIE1BQ19SRUdfRUFERFIgICAgICAgMHg5NgorI2RlZmluZSBNQUNfUkVHX0VNQkNNRCAgICAgIDB4OTcKKyNkZWZpbmUgTUFDX1JFR19KTVBTUjAgICAgICAweDk4CisjZGVmaW5lIE1BQ19SRUdfSk1QU1IxICAgICAgMHg5OQorI2RlZmluZSBNQUNfUkVHX0pNUFNSMiAgICAgIDB4OUEKKyNkZWZpbmUgTUFDX1JFR19KTVBTUjMgICAgICAweDlCCisjZGVmaW5lIE1BQ19SRUdfQ0hJUEdTUiAgICAgMHg5QworI2RlZmluZSBNQUNfUkVHX1RFU1RDRkcgICAgIDB4OUQKKyNkZWZpbmUgTUFDX1JFR19ERUJVRyAgICAgICAweDlFCisjZGVmaW5lIE1BQ19SRUdfQ0hJUEdDUiAgICAgMHg5RgorI2RlZmluZSBNQUNfUkVHX1dPTENSMF9TRVQgIDB4QTAKKyNkZWZpbmUgTUFDX1JFR19XT0xDUjFfU0VUICAweEExCisjZGVmaW5lIE1BQ19SRUdfUFdDRkdfU0VUICAgMHhBMgorI2RlZmluZSBNQUNfUkVHX1dPTENGR19TRVQgIDB4QTMKKyNkZWZpbmUgTUFDX1JFR19XT0xDUjBfQ0xSICAweEE0CisjZGVmaW5lIE1BQ19SRUdfV09MQ1IxX0NMUiAgMHhBNQorI2RlZmluZSBNQUNfUkVHX1BXQ0ZHX0NMUiAgIDB4QTYKKyNkZWZpbmUgTUFDX1JFR19XT0xDRkdfQ0xSICAweEE3CisjZGVmaW5lIE1BQ19SRUdfV09MU1IwX1NFVCAgMHhBOAorI2RlZmluZSBNQUNfUkVHX1dPTFNSMV9TRVQgIDB4QTkKKyNkZWZpbmUgTUFDX1JFR19XT0xTUjBfQ0xSICAweEFDCisjZGVmaW5lIE1BQ19SRUdfV09MU1IxX0NMUiAgMHhBRAorI2RlZmluZSBNQUNfUkVHX1BBVFJOX0NSQzAgIDB4QjAKKyNkZWZpbmUgTUFDX1JFR19QQVRSTl9DUkMxICAweEIyCisjZGVmaW5lIE1BQ19SRUdfUEFUUk5fQ1JDMiAgMHhCNAorI2RlZmluZSBNQUNfUkVHX1BBVFJOX0NSQzMgIDB4QjYKKyNkZWZpbmUgTUFDX1JFR19QQVRSTl9DUkM0ICAweEI4CisjZGVmaW5lIE1BQ19SRUdfUEFUUk5fQ1JDNSAgMHhCQQorI2RlZmluZSBNQUNfUkVHX1BBVFJOX0NSQzYgIDB4QkMKKyNkZWZpbmUgTUFDX1JFR19QQVRSTl9DUkM3ICAweEJFCisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzBfMCAgMHhDMAorI2RlZmluZSBNQUNfUkVHX0JZVEVNU0swXzEgIDB4QzQKKyNkZWZpbmUgTUFDX1JFR19CWVRFTVNLMF8yICAweEM4CisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzBfMyAgMHhDQworI2RlZmluZSBNQUNfUkVHX0JZVEVNU0sxXzAgIDB4RDAKKyNkZWZpbmUgTUFDX1JFR19CWVRFTVNLMV8xICAweEQ0CisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzFfMiAgMHhEOAorI2RlZmluZSBNQUNfUkVHX0JZVEVNU0sxXzMgIDB4REMKKyNkZWZpbmUgTUFDX1JFR19CWVRFTVNLMl8wICAweEUwCisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzJfMSAgMHhFNAorI2RlZmluZSBNQUNfUkVHX0JZVEVNU0syXzIgIDB4RTgKKyNkZWZpbmUgTUFDX1JFR19CWVRFTVNLMl8zICAweEVDCisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzNfMCAgMHhGMAorI2RlZmluZSBNQUNfUkVHX0JZVEVNU0szXzEgIDB4RjQKKyNkZWZpbmUgTUFDX1JFR19CWVRFTVNLM18yICAweEY4CisjZGVmaW5lIE1BQ19SRUdfQllURU1TSzNfMyAgMHhGQworCisvKgorICoJQml0cyBpbiB0aGUgUkNSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBSQ1JfQVMgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgUkNSX0FQICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIFJDUl9BTCAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBSQ1JfUFJPTSAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgUkNSX0FCICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIFJDUl9BTSAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBSQ1JfQVIgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgUkNSX1NFUCAgICAgICAgICAgICAweDAxCisKKy8qCisgKglCaXRzIGluIHRoZSBUQ1IgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIFRDUl9UQjJCRElTICAgICAgICAgMHg4MAorI2RlZmluZSBUQ1JfQ09MVE1DMSAgICAgICAgIDB4MDgKKyNkZWZpbmUgVENSX0NPTFRNQzAgICAgICAgICAweDA0CisjZGVmaW5lIFRDUl9MQjEgICAgICAgICAgICAgMHgwMgkvKiBsb29wYmFja1sxXSAqLworI2RlZmluZSBUQ1JfTEIwICAgICAgICAgICAgIDB4MDEJLyogbG9vcGJhY2tbMF0gKi8KKworLyoKKyAqCUJpdHMgaW4gdGhlIENSMCByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ1IwX1RYT04gICAgICAgICAgICAweDAwMDAwMDA4VUwKKyNkZWZpbmUgQ1IwX1JYT04gICAgICAgICAgICAweDAwMDAwMDA0VUwKKyNkZWZpbmUgQ1IwX1NUT1AgICAgICAgICAgICAweDAwMDAwMDAyVUwJLyogc3RvcCBNQUMsIGRlZmF1bHQgPSAxICovCisjZGVmaW5lIENSMF9TVFJUICAgICAgICAgICAgMHgwMDAwMDAwMVVMCS8qIHN0YXJ0IE1BQyAqLworI2RlZmluZSBDUjBfU0ZSU1QgICAgICAgICAgIDB4MDAwMDgwMDBVTAkvKiBzb2Z0d2FyZSByZXNldCAqLworI2RlZmluZSBDUjBfVE0xRU4gICAgICAgICAgIDB4MDAwMDQwMDBVTAorI2RlZmluZSBDUjBfVE0wRU4gICAgICAgICAgIDB4MDAwMDIwMDBVTAorI2RlZmluZSBDUjBfRFBPTEwgICAgICAgICAgIDB4MDAwMDA4MDBVTAkvKiBkaXNhYmxlIHJ4L3R4IGF1dG8gcG9sbGluZyAqLworI2RlZmluZSBDUjBfRElTQVUgICAgICAgICAgIDB4MDAwMDAxMDBVTAorI2RlZmluZSBDUjBfWE9ORU4gICAgICAgICAgIDB4MDA4MDAwMDBVTAorI2RlZmluZSBDUjBfRkRYVEZDRU4gICAgICAgIDB4MDA0MDAwMDBVTAkvKiBmdWxsLWR1cGxleCBUWCBmbG93IGNvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lIENSMF9GRFhSRkNFTiAgICAgICAgMHgwMDIwMDAwMFVMCS8qIGZ1bGwtZHVwbGV4IFJYIGZsb3cgY29udHJvbCBlbmFibGUgKi8KKyNkZWZpbmUgQ1IwX0hEWEZDRU4gICAgICAgICAweDAwMTAwMDAwVUwJLyogaGFsZi1kdXBsZXggZmxvdyBjb250cm9sIGVuYWJsZSAqLworI2RlZmluZSBDUjBfWEhJVEgxICAgICAgICAgIDB4MDAwODAwMDBVTAkvKiBUWCBYT04gaGlnaCB0aHJlc2hvbGQgMSAqLworI2RlZmluZSBDUjBfWEhJVEgwICAgICAgICAgIDB4MDAwNDAwMDBVTAkvKiBUWCBYT04gaGlnaCB0aHJlc2hvbGQgMCAqLworI2RlZmluZSBDUjBfWExUSDEgICAgICAgICAgIDB4MDAwMjAwMDBVTAkvKiBUWCBwYXVzZSBmcmFtZSBsb3cgdGhyZXNob2xkIDEgKi8KKyNkZWZpbmUgQ1IwX1hMVEgwICAgICAgICAgICAweDAwMDEwMDAwVUwJLyogVFggcGF1c2UgZnJhbWUgbG93IHRocmVzaG9sZCAwICovCisjZGVmaW5lIENSMF9HU1BSU1QgICAgICAgICAgMHg4MDAwMDAwMFVMCisjZGVmaW5lIENSMF9GT1JTUlNUICAgICAgICAgMHg0MDAwMDAwMFVMCisjZGVmaW5lIENSMF9GUEhZUlNUICAgICAgICAgMHgyMDAwMDAwMFVMCisjZGVmaW5lIENSMF9ESUFHICAgICAgICAgICAgMHgxMDAwMDAwMFVMCisjZGVmaW5lIENSMF9JTlRQQ1RMICAgICAgICAgMHgwNDAwMDAwMFVMCisjZGVmaW5lIENSMF9HSU5UTVNLMSAgICAgICAgMHgwMjAwMDAwMFVMCisjZGVmaW5lIENSMF9HSU5UTVNLMCAgICAgICAgMHgwMTAwMDAwMFVMCisKKy8qCisgKglCaXRzIGluIHRoZSBDUjEgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIENSMV9TRlJTVCAgICAgICAgICAgMHg4MAkvKiBzb2Z0d2FyZSByZXNldCAqLworI2RlZmluZSBDUjFfVE0xRU4gICAgICAgICAgIDB4NDAKKyNkZWZpbmUgQ1IxX1RNMEVOICAgICAgICAgICAweDIwCisjZGVmaW5lIENSMV9EUE9MTCAgICAgICAgICAgMHgwOAkvKiBkaXNhYmxlIHJ4L3R4IGF1dG8gcG9sbGluZyAqLworI2RlZmluZSBDUjFfRElTQVUgICAgICAgICAgIDB4MDEKKworLyoKKyAqCUJpdHMgaW4gdGhlIENSMiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ1IyX1hPTkVOICAgICAgICAgICAweDgwCisjZGVmaW5lIENSMl9GRFhURkNFTiAgICAgICAgMHg0MAkvKiBmdWxsLWR1cGxleCBUWCBmbG93IGNvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lIENSMl9GRFhSRkNFTiAgICAgICAgMHgyMAkvKiBmdWxsLWR1cGxleCBSWCBmbG93IGNvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lIENSMl9IRFhGQ0VOICAgICAgICAgMHgxMAkvKiBoYWxmLWR1cGxleCBmbG93IGNvbnRyb2wgZW5hYmxlICovCisjZGVmaW5lIENSMl9YSElUSDEgICAgICAgICAgMHgwOAkvKiBUWCBYT04gaGlnaCB0aHJlc2hvbGQgMSAqLworI2RlZmluZSBDUjJfWEhJVEgwICAgICAgICAgIDB4MDQJLyogVFggWE9OIGhpZ2ggdGhyZXNob2xkIDAgKi8KKyNkZWZpbmUgQ1IyX1hMVEgxICAgICAgICAgICAweDAyCS8qIFRYIHBhdXNlIGZyYW1lIGxvdyB0aHJlc2hvbGQgMSAqLworI2RlZmluZSBDUjJfWExUSDAgICAgICAgICAgIDB4MDEJLyogVFggcGF1c2UgZnJhbWUgbG93IHRocmVzaG9sZCAwICovCisKKy8qCisgKglCaXRzIGluIHRoZSBDUjMgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIENSM19HU1BSU1QgICAgICAgICAgMHg4MAorI2RlZmluZSBDUjNfRk9SU1JTVCAgICAgICAgIDB4NDAKKyNkZWZpbmUgQ1IzX0ZQSFlSU1QgICAgICAgICAweDIwCisjZGVmaW5lIENSM19ESUFHICAgICAgICAgICAgMHgxMAorI2RlZmluZSBDUjNfSU5UUENUTCAgICAgICAgIDB4MDQKKyNkZWZpbmUgQ1IzX0dJTlRNU0sxICAgICAgICAweDAyCisjZGVmaW5lIENSM19HSU5UTVNLMCAgICAgICAgMHgwMQorCisjZGVmaW5lIElTUkNUTF9VRFBJTlQgICAgICAgMHg4MDAwCisjZGVmaW5lIElTUkNUTF9UU1VQRElTICAgICAgMHg0MDAwCisjZGVmaW5lIElTUkNUTF9SU1VQRElTICAgICAgMHgyMDAwCisjZGVmaW5lIElTUkNUTF9QTVNLMSAgICAgICAgMHgxMDAwCisjZGVmaW5lIElTUkNUTF9QTVNLMCAgICAgICAgMHgwODAwCisjZGVmaW5lIElTUkNUTF9JTlRQRCAgICAgICAgMHgwNDAwCisjZGVmaW5lIElTUkNUTF9IQ1JMRCAgICAgICAgMHgwMjAwCisjZGVmaW5lIElTUkNUTF9TQ1JMRCAgICAgICAgMHgwMTAwCisKKy8qCisgKglCaXRzIGluIHRoZSBJU1JfQ1RMMSByZWdpc3RlcgorICovCisKKyNkZWZpbmUgSVNSQ1RMMV9VRFBJTlQgICAgICAweDgwCisjZGVmaW5lIElTUkNUTDFfVFNVUERJUyAgICAgMHg0MAorI2RlZmluZSBJU1JDVEwxX1JTVVBESVMgICAgIDB4MjAKKyNkZWZpbmUgSVNSQ1RMMV9QTVNLMSAgICAgICAweDEwCisjZGVmaW5lIElTUkNUTDFfUE1TSzAgICAgICAgMHgwOAorI2RlZmluZSBJU1JDVEwxX0lOVFBEICAgICAgIDB4MDQKKyNkZWZpbmUgSVNSQ1RMMV9IQ1JMRCAgICAgICAweDAyCisjZGVmaW5lIElTUkNUTDFfU0NSTEQgICAgICAgMHgwMQorCisvKgorICoJQml0cyBpbiB0aGUgVFhFX1NSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBUWEVTUl9URkRCUyAgICAgICAgIDB4MDgKKyNkZWZpbmUgVFhFU1JfVERXQlMgICAgICAgICAweDA0CisjZGVmaW5lIFRYRVNSX1REUkJTICAgICAgICAgMHgwMgorI2RlZmluZSBUWEVTUl9URFNUUiAgICAgICAgIDB4MDEKKworLyoKKyAqCUJpdHMgaW4gdGhlIFJYRV9TUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgUlhFU1JfUkZEQlMgICAgICAgICAweDA4CisjZGVmaW5lIFJYRVNSX1JEV0JTICAgICAgICAgMHgwNAorI2RlZmluZSBSWEVTUl9SRFJCUyAgICAgICAgIDB4MDIKKyNkZWZpbmUgUlhFU1JfUkRTVFIgICAgICAgICAweDAxCisKKy8qCisgKglCaXRzIGluIHRoZSBJU1IgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIElTUl9JU1IzICAgICAgICAgICAgMHg4MDAwMDAwMFVMCisjZGVmaW5lIElTUl9JU1IyICAgICAgICAgICAgMHg0MDAwMDAwMFVMCisjZGVmaW5lIElTUl9JU1IxICAgICAgICAgICAgMHgyMDAwMDAwMFVMCisjZGVmaW5lIElTUl9JU1IwICAgICAgICAgICAgMHgxMDAwMDAwMFVMCisjZGVmaW5lIElTUl9UWFNUTEkgICAgICAgICAgMHgwMjAwMDAwMFVMCisjZGVmaW5lIElTUl9SWFNUTEkgICAgICAgICAgMHgwMTAwMDAwMFVMCisjZGVmaW5lIElTUl9IRkxEICAgICAgICAgICAgMHgwMDgwMDAwMFVMCisjZGVmaW5lIElTUl9VRFBJICAgICAgICAgICAgMHgwMDQwMDAwMFVMCisjZGVmaW5lIElTUl9NSUJGSSAgICAgICAgICAgMHgwMDIwMDAwMFVMCisjZGVmaW5lIElTUl9TSEROSSAgICAgICAgICAgMHgwMDEwMDAwMFVMCisjZGVmaW5lIElTUl9QSFlJICAgICAgICAgICAgMHgwMDA4MDAwMFVMCisjZGVmaW5lIElTUl9QV0VJICAgICAgICAgICAgMHgwMDA0MDAwMFVMCisjZGVmaW5lIElTUl9UTVIxSSAgICAgICAgICAgMHgwMDAyMDAwMFVMCisjZGVmaW5lIElTUl9UTVIwSSAgICAgICAgICAgMHgwMDAxMDAwMFVMCisjZGVmaW5lIElTUl9TUkNJICAgICAgICAgICAgMHgwMDAwODAwMFVMCisjZGVmaW5lIElTUl9MU1RQRUkgICAgICAgICAgMHgwMDAwNDAwMFVMCisjZGVmaW5lIElTUl9MU1RFSSAgICAgICAgICAgMHgwMDAwMjAwMFVMCisjZGVmaW5lIElTUl9PVkZJICAgICAgICAgICAgMHgwMDAwMTAwMFVMCisjZGVmaW5lIElTUl9GTE9OSSAgICAgICAgICAgMHgwMDAwMDgwMFVMCisjZGVmaW5lIElTUl9SQUNFSSAgICAgICAgICAgMHgwMDAwMDQwMFVMCisjZGVmaW5lIElTUl9UWFdCMUkgICAgICAgICAgMHgwMDAwMDIwMFVMCisjZGVmaW5lIElTUl9UWFdCMEkgICAgICAgICAgMHgwMDAwMDEwMFVMCisjZGVmaW5lIElTUl9QVFgzSSAgICAgICAgICAgMHgwMDAwMDA4MFVMCisjZGVmaW5lIElTUl9QVFgySSAgICAgICAgICAgMHgwMDAwMDA0MFVMCisjZGVmaW5lIElTUl9QVFgxSSAgICAgICAgICAgMHgwMDAwMDAyMFVMCisjZGVmaW5lIElTUl9QVFgwSSAgICAgICAgICAgMHgwMDAwMDAxMFVMCisjZGVmaW5lIElTUl9QVFhJICAgICAgICAgICAgMHgwMDAwMDAwOFVMCisjZGVmaW5lIElTUl9QUlhJICAgICAgICAgICAgMHgwMDAwMDAwNFVMCisjZGVmaW5lIElTUl9QUFRYSSAgICAgICAgICAgMHgwMDAwMDAwMlVMCisjZGVmaW5lIElTUl9QUFJYSSAgICAgICAgICAgMHgwMDAwMDAwMVVMCisKKy8qCisgKglCaXRzIGluIHRoZSBJTVIgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIElNUl9UWFNUTE0gICAgICAgICAgMHgwMjAwMDAwMFVMCisjZGVmaW5lIElNUl9VRFBJTSAgICAgICAgICAgMHgwMDQwMDAwMFVMCisjZGVmaW5lIElNUl9NSUJGSU0gICAgICAgICAgMHgwMDIwMDAwMFVMCisjZGVmaW5lIElNUl9TSEROSU0gICAgICAgICAgMHgwMDEwMDAwMFVMCisjZGVmaW5lIElNUl9QSFlJTSAgICAgICAgICAgMHgwMDA4MDAwMFVMCisjZGVmaW5lIElNUl9QV0VJTSAgICAgICAgICAgMHgwMDA0MDAwMFVMCisjZGVmaW5lIElNUl9UTVIxSU0gICAgICAgICAgMHgwMDAyMDAwMFVMCisjZGVmaW5lIElNUl9UTVIwSU0gICAgICAgICAgMHgwMDAxMDAwMFVMCisKKyNkZWZpbmUgSU1SX1NSQ0lNICAgICAgICAgICAweDAwMDA4MDAwVUwKKyNkZWZpbmUgSU1SX0xTVFBFSU0gICAgICAgICAweDAwMDA0MDAwVUwKKyNkZWZpbmUgSU1SX0xTVEVJTSAgICAgICAgICAweDAwMDAyMDAwVUwKKyNkZWZpbmUgSU1SX09WRklNICAgICAgICAgICAweDAwMDAxMDAwVUwKKyNkZWZpbmUgSU1SX0ZMT05JTSAgICAgICAgICAweDAwMDAwODAwVUwKKyNkZWZpbmUgSU1SX1JBQ0VJTSAgICAgICAgICAweDAwMDAwNDAwVUwKKyNkZWZpbmUgSU1SX1RYV0IxSU0gICAgICAgICAweDAwMDAwMjAwVUwKKyNkZWZpbmUgSU1SX1RYV0IwSU0gICAgICAgICAweDAwMDAwMTAwVUwKKworI2RlZmluZSBJTVJfUFRYM0lNICAgICAgICAgIDB4MDAwMDAwODBVTAorI2RlZmluZSBJTVJfUFRYMklNICAgICAgICAgIDB4MDAwMDAwNDBVTAorI2RlZmluZSBJTVJfUFRYMUlNICAgICAgICAgIDB4MDAwMDAwMjBVTAorI2RlZmluZSBJTVJfUFRYMElNICAgICAgICAgIDB4MDAwMDAwMTBVTAorI2RlZmluZSBJTVJfUFRYSU0gICAgICAgICAgIDB4MDAwMDAwMDhVTAorI2RlZmluZSBJTVJfUFJYSU0gICAgICAgICAgIDB4MDAwMDAwMDRVTAorI2RlZmluZSBJTVJfUFBUWElNICAgICAgICAgIDB4MDAwMDAwMDJVTAorI2RlZmluZSBJTVJfUFBSWElNICAgICAgICAgIDB4MDAwMDAwMDFVTAorCisvKiAweDAwMTNGQjBGVUwgID0gIGluaXRpYWwgdmFsdWUgb2YgSU1SICovCisKKyNkZWZpbmUgSU5UX01BU0tfREVGICAgICAgICAoSU1SX1BQVFhJTXxJTVJfUFBSWElNfElNUl9QVFhJTXxJTVJfUFJYSU18XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNUl9QV0VJTXxJTVJfVFhXQjBJTXxJTVJfVFhXQjFJTXxJTVJfRkxPTklNfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTVJfT1ZGSU18SU1SX0xTVEVJTXxJTVJfTFNUUEVJTXxJTVJfU1JDSU18SU1SX01JQkZJTXxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1SX1NIRE5JTXxJTVJfVE1SMUlNfElNUl9UTVIwSU18SU1SX1RYU1RMTSkKKworLyoKKyAqCUJpdHMgaW4gdGhlIFREQ1NSMC8xLCBSRENTUjAgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIFRSRENTUl9ERUFEICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFRSRENTUl9XQUsgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIFRSRENTUl9BQ1QgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFRSRENTUl9SVU4JICAgIDB4MDAwMQorCisvKgorICoJQml0cyBpbiB0aGUgQ0FNQUREUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ0FNQUREUl9DQU1FTiAgICAgICAweDgwCisjZGVmaW5lIENBTUFERFJfVkNBTVNMICAgICAgMHg0MAorCisvKgorICoJQml0cyBpbiB0aGUgQ0FNQ1IgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIENBTUNSX1BTMSAgICAgICAgICAgMHg4MAorI2RlZmluZSBDQU1DUl9QUzAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgQ0FNQ1JfQUlUUlBLVCAgICAgICAweDIwCisjZGVmaW5lIENBTUNSX0FJVFIxNiAgICAgICAgMHgxMAorI2RlZmluZSBDQU1DUl9DQU1SRCAgICAgICAgIDB4MDgKKyNkZWZpbmUgQ0FNQ1JfQ0FNV1IgICAgICAgICAweDA0CisjZGVmaW5lIENBTUNSX1BTX0NBTV9NQVNLICAgMHg0MAorI2RlZmluZSBDQU1DUl9QU19DQU1fREFUQSAgIDB4ODAKKyNkZWZpbmUgQ0FNQ1JfUFNfTUFSICAgICAgICAweDAwCisKKy8qCisgKglCaXRzIGluIHRoZSBNSUlDRkcgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIE1JSUNGR19NUE8xICAgICAgICAgMHg4MAorI2RlZmluZSBNSUlDRkdfTVBPMCAgICAgICAgIDB4NDAKKyNkZWZpbmUgTUlJQ0ZHX01GREMgICAgICAgICAweDIwCisKKy8qCisgKglCaXRzIGluIHRoZSBNSUlTUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgTUlJU1JfTUlETEUgICAgICAgICAweDgwCisKKy8qCisgKgkgQml0cyBpbiB0aGUgUEhZU1IwIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBQSFlTUjBfUEhZUlNUICAgICAgIDB4ODAKKyNkZWZpbmUgUEhZU1IwX0xJTktHRCAgICAgICAweDQwCisjZGVmaW5lIFBIWVNSMF9GRFBYICAgICAgICAgMHgxMAorI2RlZmluZSBQSFlTUjBfU1BERyAgICAgICAgIDB4MDgKKyNkZWZpbmUgUEhZU1IwX1NQRDEwICAgICAgICAweDA0CisjZGVmaW5lIFBIWVNSMF9SWEZMQyAgICAgICAgMHgwMgorI2RlZmluZSBQSFlTUjBfVFhGTEMgICAgICAgIDB4MDEKKworLyoKKyAqCUJpdHMgaW4gdGhlIFBIWVNSMSByZWdpc3RlcgorICovCisKKyNkZWZpbmUgUEhZU1IxX1BIWVRCSSAgICAgICAweDAxCisKKy8qCisgKglCaXRzIGluIHRoZSBNSUlDUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgTUlJQ1JfTUFVVE8gICAgICAgICAweDgwCisjZGVmaW5lIE1JSUNSX1JDTUQgICAgICAgICAgMHg0MAorI2RlZmluZSBNSUlDUl9XQ01EICAgICAgICAgIDB4MjAKKyNkZWZpbmUgTUlJQ1JfTURQTSAgICAgICAgICAweDEwCisjZGVmaW5lIE1JSUNSX01PVVQgICAgICAgICAgMHgwOAorI2RlZmluZSBNSUlDUl9NRE8gICAgICAgICAgIDB4MDQKKyNkZWZpbmUgTUlJQ1JfTURJICAgICAgICAgICAweDAyCisjZGVmaW5lIE1JSUNSX01EQyAgICAgICAgICAgMHgwMQorCisvKgorICoJQml0cyBpbiB0aGUgTUlJQURSIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBNSUlBRFJfU1dNUEwgICAgICAgIDB4ODAKKworLyoKKyAqCUJpdHMgaW4gdGhlIENGR0EgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIENGR0FfUE1IQ1RHICAgICAgICAgMHgwOAorI2RlZmluZSBDRkdBX0dQSU8xUEQgICAgICAgIDB4MDQKKyNkZWZpbmUgQ0ZHQV9BQlNIRE4gICAgICAgICAweDAyCisjZGVmaW5lIENGR0FfUEFDUEkgICAgICAgICAgMHgwMQorCisvKgorICoJQml0cyBpbiB0aGUgQ0ZHQiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ0ZHQl9HVENLT1BUICAgICAgICAweDgwCisjZGVmaW5lIENGR0JfTUlJT1BUICAgICAgICAgMHg0MAorI2RlZmluZSBDRkdCX0NSU0VPUFQgICAgICAgIDB4MjAKKyNkZWZpbmUgQ0ZHQl9PRlNFVCAgICAgICAgICAweDEwCisjZGVmaW5lIENGR0JfQ1JBTkRPTSAgICAgICAgMHgwOAorI2RlZmluZSBDRkdCX0NBUCAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgQ0ZHQl9NQkEgICAgICAgICAgICAweDAyCisjZGVmaW5lIENGR0JfQkFLT1BUICAgICAgICAgMHgwMQorCisvKgorICoJQml0cyBpbiB0aGUgQ0ZHQyByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ0ZHQ19FRUxPQUQgICAgICAgICAweDgwCisjZGVmaW5lIENGR0NfQlJPUFQgICAgICAgICAgMHg0MAorI2RlZmluZSBDRkdDX0RMWUVOICAgICAgICAgIDB4MjAKKyNkZWZpbmUgQ0ZHQ19EVFNFTCAgICAgICAgICAweDEwCisjZGVmaW5lIENGR0NfQlRTRUwgICAgICAgICAgMHgwOAorI2RlZmluZSBDRkdDX0JQUzIgICAgICAgICAgIDB4MDQJLyogYm9vdHJvbSBzZWxlY3RbMl0gKi8KKyNkZWZpbmUgQ0ZHQ19CUFMxICAgICAgICAgICAweDAyCS8qIGJvb3Ryb20gc2VsZWN0WzFdICovCisjZGVmaW5lIENGR0NfQlBTMCAgICAgICAgICAgMHgwMQkvKiBib290cm9tIHNlbGVjdFswXSAqLworCisvKgorICogQml0cyBpbiB0aGUgQ0ZHRCByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ0ZHRF9JT0RJUyAgICAgICAgICAweDgwCisjZGVmaW5lIENGR0RfTVNMVkRBQ0VOICAgICAgMHg0MAorI2RlZmluZSBDRkdEX0NGR0RBQ0VOICAgICAgIDB4MjAKKyNkZWZpbmUgQ0ZHRF9QQ0k2NEVOICAgICAgICAweDEwCisjZGVmaW5lIENGR0RfSFRNUkw0ICAgICAgICAgMHgwOAorCisvKgorICoJQml0cyBpbiB0aGUgRENGRzEgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIERDRkdfWE1XSSAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIERDRkdfWE1STSAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIERDRkdfWE1STCAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIERDRkdfUEVSRElTICAgICAgICAgMHgxMDAwCisjZGVmaW5lIERDRkdfTVJXQUlUICAgICAgICAgMHgwNDAwCisjZGVmaW5lIERDRkdfTVdXQUlUICAgICAgICAgMHgwMjAwCisjZGVmaW5lIERDRkdfTEFUTUVOICAgICAgICAgMHgwMTAwCisKKy8qCisgKglCaXRzIGluIHRoZSBNQ0ZHMCByZWdpc3RlcgorICovCisKKyNkZWZpbmUgTUNGR19SWEFSQiAgICAgICAgICAweDAwODAKKyNkZWZpbmUgTUNGR19SRlQxICAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgTUNGR19SRlQwICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgTUNGR19MT1dUSE9QVCAgICAgICAweDAwMDgKKyNkZWZpbmUgTUNGR19QUUVOICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgTUNGR19SVEdPUFQgICAgICAgICAweDAwMDIKKyNkZWZpbmUgTUNGR19WSURGUiAgICAgICAgICAweDAwMDEKKworLyoKKyAqCUJpdHMgaW4gdGhlIE1DRkcxIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBNQ0ZHX1RYQVJCICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBNQ0ZHX1RYUUJLMSAgICAgICAgIDB4MDgwMAorI2RlZmluZSBNQ0ZHX1RYUUJLMCAgICAgICAgIDB4MDQwMAorI2RlZmluZSBNQ0ZHX1RYUU5PQksgICAgICAgIDB4MDIwMAorI2RlZmluZSBNQ0ZHX1NOQVBPUFQgICAgICAgIDB4MDEwMAorCisvKgorICoJQml0cyBpbiB0aGUgUE1DQyAgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIFBNQ0NfRFNJICAgICAgICAgICAgMHg4MAorI2RlZmluZSBQTUNDX0QyX0RJUyAgICAgICAgIDB4NDAKKyNkZWZpbmUgUE1DQ19EMV9ESVMgICAgICAgICAweDIwCisjZGVmaW5lIFBNQ0NfRDNDX0VOICAgICAgICAgMHgxMAorI2RlZmluZSBQTUNDX0QzSF9FTiAgICAgICAgIDB4MDgKKyNkZWZpbmUgUE1DQ19EMl9FTiAgICAgICAgICAweDA0CisjZGVmaW5lIFBNQ0NfRDFfRU4gICAgICAgICAgMHgwMgorI2RlZmluZSBQTUNDX0QwX0VOICAgICAgICAgIDB4MDEKKworLyoKKyAqCUJpdHMgaW4gU1RJQ0tIVworICovCisKKyNkZWZpbmUgU1RJQ0tIV19TV1BUQUcgICAgICAweDEwCisjZGVmaW5lIFNUSUNLSFdfV09MU1IgICAgICAgMHgwOAorI2RlZmluZSBTVElDS0hXX1dPTEVOICAgICAgIDB4MDQKKyNkZWZpbmUgU1RJQ0tIV19EUzEgICAgICAgICAweDAyCS8qIFIvVyBieSBzb2Z0d2FyZS9jZmcgY3ljbGUgKi8KKyNkZWZpbmUgU1RJQ0tIV19EUzAgICAgICAgICAweDAxCS8qIHN1c3BlbmQgd2VsbCBEUyB3cml0ZSBwb3J0ICovCisKKy8qCisgKglCaXRzIGluIHRoZSBNSUJDUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgTUlCQ1JfTUlCSVNUT0sgICAgICAweDgwCisjZGVmaW5lIE1JQkNSX01JQklTVEdPICAgICAgMHg0MAorI2RlZmluZSBNSUJDUl9NSUJJTkMgICAgICAgIDB4MjAKKyNkZWZpbmUgTUlCQ1JfTUlCSEkgICAgICAgICAweDEwCisjZGVmaW5lIE1JQkNSX01JQkZSWiAgICAgICAgMHgwOAorI2RlZmluZSBNSUJDUl9NSUJGTFNIICAgICAgIDB4MDQKKyNkZWZpbmUgTUlCQ1JfTVBUUklOSSAgICAgICAweDAyCisjZGVmaW5lIE1JQkNSX01JQkNMUiAgICAgICAgMHgwMQorCisvKgorICoJQml0cyBpbiB0aGUgRUVSU1YgcmVnaXN0ZXIKKyAqLworCisjZGVmaW5lIEVFUlNWX0JPT1RfUlBMICAgICAgKCh1OCkgMHgwMSkJIC8qIEJvb3QgbWV0aG9kIHNlbGVjdGlvbiBmb3IgVlQ2MTEwICovCisKKyNkZWZpbmUgRUVSU1ZfQk9PVF9NQVNLICAgICAoKHU4KSAweDA2KQorI2RlZmluZSBFRVJTVl9CT09UX0lOVDE5ICAgICgodTgpIDB4MDApCisjZGVmaW5lIEVFUlNWX0JPT1RfSU5UMTggICAgKCh1OCkgMHgwMikKKyNkZWZpbmUgRUVSU1ZfQk9PVF9MT0NBTCAgICAoKHU4KSAweDA0KQorI2RlZmluZSBFRVJTVl9CT09UX0JFViAgICAgICgodTgpIDB4MDYpCisKKworLyoKKyAqCUJpdHMgaW4gQlBDTUQKKyAqLworCisjZGVmaW5lIEJQQ01EX0JQRE5FICAgICAgICAgMHg4MAorI2RlZmluZSBCUENNRF9FQlBXUiAgICAgICAgIDB4MDIKKyNkZWZpbmUgQlBDTURfRUJQUkQgICAgICAgICAweDAxCisKKy8qCisgKglCaXRzIGluIHRoZSBFRUNTUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgRUVDU1JfRU1CUCAgICAgICAgICAweDQwCS8qIGVlcHJvbSBlbWJlZGVkIHByb2dyYW1taW5nICovCisjZGVmaW5lIEVFQ1NSX1JFTE9BRCAgICAgICAgMHgyMAkvKiBlZXByb20gY29udGVudCByZWxvYWQgKi8KKyNkZWZpbmUgRUVDU1JfRFBNICAgICAgICAgICAweDEwCS8qIGVlcHJvbSBkaXJlY3QgcHJvZ3JhbW1pbmcgKi8KKyNkZWZpbmUgRUVDU1JfRUNTICAgICAgICAgICAweDA4CS8qIGVlcHJvbSBDUyBwaW4gKi8KKyNkZWZpbmUgRUVDU1JfRUNLICAgICAgICAgICAweDA0CS8qIGVlcHJvbSBDSyBwaW4gKi8KKyNkZWZpbmUgRUVDU1JfRURJICAgICAgICAgICAweDAyCS8qIGVlcHJvbSBESSBwaW4gKi8KKyNkZWZpbmUgRUVDU1JfRURPICAgICAgICAgICAweDAxCS8qIGVlcHJvbSBETyBwaW4gKi8KKworLyoKKyAqCUJpdHMgaW4gdGhlIEVNQkNNRCByZWdpc3RlcgorICovCisKKyNkZWZpbmUgRU1CQ01EX0VET05FICAgICAgICAweDgwCisjZGVmaW5lIEVNQkNNRF9FV0RJUyAgICAgICAgMHgwOAorI2RlZmluZSBFTUJDTURfRVdFTiAgICAgICAgIDB4MDQKKyNkZWZpbmUgRU1CQ01EX0VXUiAgICAgICAgICAweDAyCisjZGVmaW5lIEVNQkNNRF9FUkQgICAgICAgICAgMHgwMQorCisvKgorICoJQml0cyBpbiBURVNUQ0ZHIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBURVNUQ0ZHX0hCRElTICAgICAgIDB4ODAKKworLyoKKyAqCUJpdHMgaW4gQ0hJUEdDUiByZWdpc3RlcgorICovCisKKyNkZWZpbmUgQ0hJUEdDUl9GQ0dNSUkgICAgICAweDgwCisjZGVmaW5lIENISVBHQ1JfRkNGRFggICAgICAgMHg0MAorI2RlZmluZSBDSElQR0NSX0ZDUkVTViAgICAgIDB4MjAKKyNkZWZpbmUgQ0hJUEdDUl9GQ01PREUgICAgICAweDEwCisjZGVmaW5lIENISVBHQ1JfTFBTT1BUICAgICAgMHgwOAorI2RlZmluZSBDSElQR0NSX1RNMVVTICAgICAgIDB4MDQKKyNkZWZpbmUgQ0hJUEdDUl9UTTBVUyAgICAgICAweDAyCisjZGVmaW5lIENISVBHQ1JfUEhZSU5URU4gICAgMHgwMQorCisvKgorICoJQml0cyBpbiBXT0xDUjAKKyAqLworCisjZGVmaW5lIFdPTENSX01TV09MRU43ICAgICAgMHgwMDgwCS8qIGVuYWJsZSBwYXR0ZXJuIG1hdGNoIGZpbHRlcmluZyAqLworI2RlZmluZSBXT0xDUl9NU1dPTEVONiAgICAgIDB4MDA0MAorI2RlZmluZSBXT0xDUl9NU1dPTEVONSAgICAgIDB4MDAyMAorI2RlZmluZSBXT0xDUl9NU1dPTEVONCAgICAgIDB4MDAxMAorI2RlZmluZSBXT0xDUl9NU1dPTEVOMyAgICAgIDB4MDAwOAorI2RlZmluZSBXT0xDUl9NU1dPTEVOMiAgICAgIDB4MDAwNAorI2RlZmluZSBXT0xDUl9NU1dPTEVOMSAgICAgIDB4MDAwMgorI2RlZmluZSBXT0xDUl9NU1dPTEVOMCAgICAgIDB4MDAwMQorI2RlZmluZSBXT0xDUl9BUlBfRU4gICAgICAgIDB4MDAwMQorCisvKgorICoJQml0cyBpbiBXT0xDUjEKKyAqLworCisjZGVmaW5lIFdPTENSX0xJTktPRkZfRU4gICAgICAweDA4MDAJLyogbGluayBvZmYgZGV0ZWN0ZWQgZW5hYmxlICovCisjZGVmaW5lIFdPTENSX0xJTktPTl9FTiAgICAgICAweDA0MDAJLyogbGluayBvbiBkZXRlY3RlZCBlbmFibGUgKi8KKyNkZWZpbmUgV09MQ1JfTUFHSUNfRU4gICAgICAgIDB4MDIwMAkvKiBtYWdpYyBwYWNrZXQgZmlsdGVyIGVuYWJsZSAqLworI2RlZmluZSBXT0xDUl9VTklDQVNUX0VOICAgICAgMHgwMTAwCS8qIHVuaWNhc3QgZmlsdGVyIGVuYWJsZSAqLworCisKKy8qCisgKglCaXRzIGluIFBXQ0ZHCisgKi8KKworI2RlZmluZSBQV0NGR19QSFlQV09QVCAgICAgICAgICAweDgwCS8qIGludGVybmFsIE1JSSBJL0YgdGltaW5nICovCisjZGVmaW5lIFBXQ0ZHX1BDSVNUSUNLICAgICAgICAgIDB4NDAJLyogUENJIHN0aWNreSBSL1cgZW5hYmxlICovCisjZGVmaW5lIFBXQ0ZHX1dPTFRZUEUgICAgICAgICAgIDB4MjAJLyogcHVsc2UoMSkgb3IgYnV0dG9uICgwKSAqLworI2RlZmluZSBQV0NGR19MRUdDWV9XT0wgICAgICAgICAweDEwCisjZGVmaW5lIFBXQ0ZHX1BNQ1NSX1BNRV9TUiAgICAgIDB4MDgKKyNkZWZpbmUgUFdDRkdfUE1DU1JfUE1FX0VOICAgICAgMHgwNAkvKiBjb250cm9sIGJ5IFBDSVNUSUNLICovCisjZGVmaW5lIFBXQ0ZHX0xFR0FDWV9XT0xTUiAgICAgIDB4MDIJLyogTGVnYWN5IFdPTF9TUiBzaGFkb3cgKi8KKyNkZWZpbmUgUFdDRkdfTEVHQUNZX1dPTEVOICAgICAgMHgwMQkvKiBMZWdhY3kgV09MX0VOIHNoYWRvdyAqLworCisvKgorICoJQml0cyBpbiBXT0xDRkcKKyAqLworCisjZGVmaW5lIFdPTENGR19QTUVPVlIgICAgICAgICAgIDB4ODAJLyogZm9yIGxlZ2FjeSB1c2UsIGZvcmNlIFBNRUVOIGFsd2F5cyAqLworI2RlZmluZSBXT0xDRkdfU0FNICAgICAgICAgICAgICAweDIwCS8qIGFjY2VwdCBtdWx0aWNhc3QgY2FzZSByZXNldCwgZGVmYXVsdD0wICovCisjZGVmaW5lIFdPTENGR19TQUIgICAgICAgICAgICAgIDB4MTAJLyogYWNjZXB0IGJyb2FkY2FzdCBjYXNlIHJlc2V0LCBkZWZhdWx0PTAgKi8KKyNkZWZpbmUgV09MQ0ZHX1NNSUlBQ0MgICAgICAgICAgMHgwOAkvKiA/PyAqLworI2RlZmluZSBXT0xDRkdfU0dFTldIICAgICAgICAgICAweDAyCisjZGVmaW5lIFdPTENGR19QSFlJTlRFTiAgICAgICAgIDB4MDEJLyogMDpQSFlJTlQgdHJpZ2dlciBlbmFibGUsIDE6dXNlIGludGVybmFsIE1JSQorCQkJCQkgIHRvIHJlcG9ydCBzdGF0dXMgY2hhbmdlICovCisvKgorICoJQml0cyBpbiBXT0xTUjEKKyAqLworCisjZGVmaW5lIFdPTFNSX0xJTktPRkZfSU5UICAgICAgMHgwODAwCisjZGVmaW5lIFdPTFNSX0xJTktPTl9JTlQgICAgICAgMHgwNDAwCisjZGVmaW5lIFdPTFNSX01BR0lDX0lOVCAgICAgICAgMHgwMjAwCisjZGVmaW5lIFdPTFNSX1VOSUNBU1RfSU5UICAgICAgMHgwMTAwCisKKy8qCisgKglFdGhlcm5ldCBhZGRyZXNzIGZpbHRlciB0eXBlCisgKi8KKworI2RlZmluZSBQS1RfVFlQRV9OT05FICAgICAgICAgICAgICAgMHgwMDAwCS8qIFR1cm4gb2ZmIHJlY2VpdmVyICovCisjZGVmaW5lIFBLVF9UWVBFX0RJUkVDVEVEICAgICAgICAgICAweDAwMDEJLyogb2JzZWxldGUsIGRpcmVjdGVkIGFkZHJlc3MgaXMgYWx3YXlzIGFjY2VwdGVkICovCisjZGVmaW5lIFBLVF9UWVBFX01VTFRJQ0FTVCAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgUEtUX1RZUEVfQUxMX01VTFRJQ0FTVCAgICAgIDB4MDAwNAorI2RlZmluZSBQS1RfVFlQRV9CUk9BRENBU1QgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIFBLVF9UWVBFX1BST01JU0NVT1VTICAgICAgICAweDAwMjAKKyNkZWZpbmUgUEtUX1RZUEVfTE9ORyAgICAgICAgICAgICAgIDB4MjAwMAkvKiBOT1RFLi4uLiB0aGUgZGVmaW5pdGlvbiBvZiBMT05HIGlzID4yMDQ4IGJ5dGVzIGluIG91ciBjaGlwICovCisjZGVmaW5lIFBLVF9UWVBFX1JVTlQgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgUEtUX1RZUEVfRVJST1IgICAgICAgICAgICAgIDB4ODAwMAkvKiBBY2NlcHQgZXJyb3IgcGFja2V0cywgZS5nLiBDUkMgZXJyb3IgKi8KKworLyoKKyAqCUxvb3BiYWNrIG1vZGUKKyAqLworCisjZGVmaW5lIE1BQ19MQl9OT05FICAgICAgICAgMHgwMAorI2RlZmluZSBNQUNfTEJfSU5URVJOQUwgICAgIDB4MDEKKyNkZWZpbmUgTUFDX0xCX0VYVEVSTkFMICAgICAweDAyCisKKy8qCisgKglFbmFibGVkIG1hc2sgdmFsdWUgb2YgaXJxCisgKi8KKworI2lmIGRlZmluZWQoX1NJTSkKKyNkZWZpbmUgSU1SX01BU0tfVkFMVUUgICAgICAweDAwMzNGRjBGVUwJLyogaW5pdGlhbCB2YWx1ZSBvZiBJTVIKKwkJCQkJCSAgIHNldCBJTVIwIHRvIDB4MEYgYWNjb3JkaW5nIHRvIHNwZWMgKi8KKworI2Vsc2UKKyNkZWZpbmUgSU1SX01BU0tfVkFMVUUgICAgICAweDAwMTNGQjBGVUwJLyogaW5pdGlhbCB2YWx1ZSBvZiBJTVIKKwkJCQkJCSAgIGlnbm9yZSBNSUJGSSxSQUNFSSB0bworCQkJCQkJICAgcmVkdWNlIGludHIuIGZyZXF1ZW5jeQorCQkJCQkJICAgTk9URS4uLi4gZG8gbm90IGVuYWJsZSBOb0J1ZiBpbnQgbWFzayBhdCBkcml2ZXIgZHJpdmVyCisJCQkJCQkgICAgICB3aGVuICgxKSBOb0J1ZiAtPiBSeFRocmVzaG9sZCA9IFNGCisJCQkJCQkJICAgKDIpIE9LICAgIC0+IFJ4VGhyZXNob2xkID0gb3JpZ2luYWwgdmFsdWUKKwkJCQkJCSAqLworI2VuZGlmCisKKy8qCisgKglSZXZpc2lvbiBpZAorICovCisKKyNkZWZpbmUgUkVWX0lEX1ZUMzExOV9BMAkweDAwCisjZGVmaW5lIFJFVl9JRF9WVDMxMTlfQTEJMHgwMQorI2RlZmluZSBSRVZfSURfVlQzMjE2X0EwCTB4MTAKKworLyoKKyAqCU1heCB0aW1lIG91dCBkZWxheSB0aW1lCisgKi8KKworI2RlZmluZSBXX01BWF9USU1FT1VUICAgICAgIDB4MEZGRlUKKworCisvKgorICoJTUFDIHJlZ2lzdGVycyBhcyBhIHN0cnVjdHVyZS4gQ2Fubm90IGJlIGRpcmVjdGx5IGFjY2Vzc2VkIHRoaXMKKyAqCXdheSBidXQgZ2VuZXJhdGVzIG9mZnNldHMgZm9yIHJlYWRsL3dyaXRlbCgpIGNhbGxzCisgKi8KKworc3RydWN0IG1hY19yZWdzIHsKKwl2b2xhdGlsZSB1OCBQQVJbNl07CQkvKiAweDAwICovCisJdm9sYXRpbGUgdTggUkNSOworCXZvbGF0aWxlIHU4IFRDUjsKKworCXZvbGF0aWxlIHUzMiBDUjBTZXQ7CQkvKiAweDA4ICovCisJdm9sYXRpbGUgdTMyIENSMENscjsJCS8qIDB4MEMgKi8KKworCXZvbGF0aWxlIHU4IE1BUkNBTVs4XTsJCS8qIDB4MTAgKi8KKworCXZvbGF0aWxlIHUzMiBEZWNCYXNlSGk7CQkvKiAweDE4ICovCisJdm9sYXRpbGUgdTE2IERiZkJhc2VIaTsJCS8qIDB4MUMgKi8KKwl2b2xhdGlsZSB1MTYgcmVzZXJ2ZWRfMUU7CisKKwl2b2xhdGlsZSB1MTYgSVNSQ1RMOwkJLyogMHgyMCAqLworCXZvbGF0aWxlIHU4IFRYRVNSOworCXZvbGF0aWxlIHU4IFJYRVNSOworCisJdm9sYXRpbGUgdTMyIElTUjsJCS8qIDB4MjQgKi8KKwl2b2xhdGlsZSB1MzIgSU1SOworCisJdm9sYXRpbGUgdTMyIFREU3RhdHVzUG9ydDsJLyogMHgyQyAqLworCisJdm9sYXRpbGUgdTE2IFREQ1NSU2V0OwkJLyogMHgzMCAqLworCXZvbGF0aWxlIHU4IFJEQ1NSU2V0OworCXZvbGF0aWxlIHU4IHJlc2VydmVkXzMzOworCXZvbGF0aWxlIHUxNiBURENTUkNscjsKKwl2b2xhdGlsZSB1OCBSRENTUkNscjsKKwl2b2xhdGlsZSB1OCByZXNlcnZlZF8zNzsKKworCXZvbGF0aWxlIHUzMiBSREJhc2VMbzsJCS8qIDB4MzggKi8KKwl2b2xhdGlsZSB1MTYgUkRJZHg7CQkvKiAweDNDICovCisJdm9sYXRpbGUgdTE2IHJlc2VydmVkXzNFOworCisJdm9sYXRpbGUgdTMyIFREQmFzZUxvWzRdOwkvKiAweDQwICovCisKKwl2b2xhdGlsZSB1MTYgUkRDU2l6ZTsJCS8qIDB4NTAgKi8KKwl2b2xhdGlsZSB1MTYgVERDU2l6ZTsJCS8qIDB4NTIgKi8KKwl2b2xhdGlsZSB1MTYgVERJZHhbNF07CQkvKiAweDU0ICovCisJdm9sYXRpbGUgdTE2IHR4X3BhdXNlX3RpbWVyOwkvKiAweDVDICovCisJdm9sYXRpbGUgdTE2IFJCUkRVOwkJLyogMHg1RSAqLworCisJdm9sYXRpbGUgdTMyIEZJRk9UZXN0MDsJCS8qIDB4NjAgKi8KKwl2b2xhdGlsZSB1MzIgRklGT1Rlc3QxOwkJLyogMHg2NCAqLworCisJdm9sYXRpbGUgdTggQ0FNQUREUjsJCS8qIDB4NjggKi8KKwl2b2xhdGlsZSB1OCBDQU1DUjsJCS8qIDB4NjkgKi8KKwl2b2xhdGlsZSB1OCBHRlRFU1Q7CQkvKiAweDZBICovCisJdm9sYXRpbGUgdTggRlRTVENNRDsJCS8qIDB4NkIgKi8KKworCXZvbGF0aWxlIHU4IE1JSUNGRzsJCS8qIDB4NkMgKi8KKwl2b2xhdGlsZSB1OCBNSUlTUjsKKwl2b2xhdGlsZSB1OCBQSFlTUjA7CisJdm9sYXRpbGUgdTggUEhZU1IxOworCXZvbGF0aWxlIHU4IE1JSUNSOworCXZvbGF0aWxlIHU4IE1JSUFEUjsKKwl2b2xhdGlsZSB1MTYgTUlJREFUQTsKKworCXZvbGF0aWxlIHUxNiBTb2Z0VGltZXIwOwkvKiAweDc0ICovCisJdm9sYXRpbGUgdTE2IFNvZnRUaW1lcjE7CisKKwl2b2xhdGlsZSB1OCBDRkdBOwkJLyogMHg3OCAqLworCXZvbGF0aWxlIHU4IENGR0I7CisJdm9sYXRpbGUgdTggQ0ZHQzsKKwl2b2xhdGlsZSB1OCBDRkdEOworCisJdm9sYXRpbGUgdTE2IERDRkc7CQkvKiAweDdDICovCisJdm9sYXRpbGUgdTE2IE1DRkc7CisKKwl2b2xhdGlsZSB1OCBUQklTVDsJCS8qIDB4ODAgKi8KKwl2b2xhdGlsZSB1OCBSQklTVDsKKwl2b2xhdGlsZSB1OCBQTUNQT1JUOworCXZvbGF0aWxlIHU4IFNUSUNLSFc7CisKKwl2b2xhdGlsZSB1OCBNSUJDUjsJCS8qIDB4ODQgKi8KKwl2b2xhdGlsZSB1OCByZXNlcnZlZF84NTsKKwl2b2xhdGlsZSB1OCByZXZfaWQ7CisJdm9sYXRpbGUgdTggUE9SU1RTOworCisJdm9sYXRpbGUgdTMyIE1JQkRhdGE7CQkvKiAweDg4ICovCisKKwl2b2xhdGlsZSB1MTYgRUVXckRhdGE7CisKKwl2b2xhdGlsZSB1OCByZXNlcnZlZF84RTsKKwl2b2xhdGlsZSB1OCBCUE1EV3I7CisJdm9sYXRpbGUgdTggQlBDTUQ7CisJdm9sYXRpbGUgdTggQlBNRFJkOworCisJdm9sYXRpbGUgdTggRUVDSEtTVU07CQkvKiAweDkyICovCisJdm9sYXRpbGUgdTggRUVDU1I7CisKKwl2b2xhdGlsZSB1MTYgRUVSZERhdGE7CQkvKiAweDk0ICovCisJdm9sYXRpbGUgdTggRUFERFI7CisJdm9sYXRpbGUgdTggRU1CQ01EOworCisKKwl2b2xhdGlsZSB1OCBKTVBTUjA7CQkvKiAweDk4ICovCisJdm9sYXRpbGUgdTggSk1QU1IxOworCXZvbGF0aWxlIHU4IEpNUFNSMjsKKwl2b2xhdGlsZSB1OCBKTVBTUjM7CisJdm9sYXRpbGUgdTggQ0hJUEdTUjsJCS8qIDB4OUMgKi8KKwl2b2xhdGlsZSB1OCBURVNUQ0ZHOworCXZvbGF0aWxlIHU4IERFQlVHOworCXZvbGF0aWxlIHU4IENISVBHQ1I7CisKKwl2b2xhdGlsZSB1MTYgV09MQ1JTZXQ7CQkvKiAweEEwICovCisJdm9sYXRpbGUgdTggUFdDRkdTZXQ7CisJdm9sYXRpbGUgdTggV09MQ0ZHU2V0OworCisJdm9sYXRpbGUgdTE2IFdPTENSQ2xyOwkJLyogMHhBNCAqLworCXZvbGF0aWxlIHU4IFBXQ0ZHQ0xSOworCXZvbGF0aWxlIHU4IFdPTENGR0NscjsKKworCXZvbGF0aWxlIHUxNiBXT0xTUlNldDsJCS8qIDB4QTggKi8KKwl2b2xhdGlsZSB1MTYgcmVzZXJ2ZWRfQUE7CisKKwl2b2xhdGlsZSB1MTYgV09MU1JDbHI7CQkvKiAweEFDICovCisJdm9sYXRpbGUgdTE2IHJlc2VydmVkX0FFOworCisJdm9sYXRpbGUgdTE2IFBhdHRlcm5DUkNbOF07CS8qIDB4QjAgKi8KKwl2b2xhdGlsZSB1MzIgQnl0ZU1hc2tbNF1bNF07CS8qIDB4QzAgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworCitlbnVtIGh3X21pYiB7CisJSFdfTUlCX2lmUnhBbGxQa3RzID0gMCwKKwlIV19NSUJfaWZSeE9rUGt0cywKKwlIV19NSUJfaWZUeE9rUGt0cywKKwlIV19NSUJfaWZSeEVycm9yUGt0cywKKwlIV19NSUJfaWZSeFJ1bnRPa1BrdCwKKwlIV19NSUJfaWZSeFJ1bnRFcnJQa3QsCisJSFdfTUlCX2lmUng2NFBrdHMsCisJSFdfTUlCX2lmVHg2NFBrdHMsCisJSFdfTUlCX2lmUng2NVRvMTI3UGt0cywKKwlIV19NSUJfaWZUeDY1VG8xMjdQa3RzLAorCUhXX01JQl9pZlJ4MTI4VG8yNTVQa3RzLAorCUhXX01JQl9pZlR4MTI4VG8yNTVQa3RzLAorCUhXX01JQl9pZlJ4MjU2VG81MTFQa3RzLAorCUhXX01JQl9pZlR4MjU2VG81MTFQa3RzLAorCUhXX01JQl9pZlJ4NTEyVG8xMDIzUGt0cywKKwlIV19NSUJfaWZUeDUxMlRvMTAyM1BrdHMsCisJSFdfTUlCX2lmUngxMDI0VG8xNTE4UGt0cywKKwlIV19NSUJfaWZUeDEwMjRUbzE1MThQa3RzLAorCUhXX01JQl9pZlR4RXRoZXJDb2xsaXNpb25zLAorCUhXX01JQl9pZlJ4UGt0Q1JDRSwKKwlIV19NSUJfaWZSeEp1bWJvUGt0cywKKwlIV19NSUJfaWZUeEp1bWJvUGt0cywKKwlIV19NSUJfaWZSeE1hY0NvbnRyb2xGcmFtZXMsCisJSFdfTUlCX2lmVHhNYWNDb250cm9sRnJhbWVzLAorCUhXX01JQl9pZlJ4UGt0RkFFLAorCUhXX01JQl9pZlJ4TG9uZ09rUGt0LAorCUhXX01JQl9pZlJ4TG9uZ1BrdEVyclBrdCwKKwlIV19NSUJfaWZUWFNRRUVycm9ycywKKwlIV19NSUJfaWZSeE5vYnVmLAorCUhXX01JQl9pZlJ4U3ltYm9sRXJyb3JzLAorCUhXX01JQl9pZkluUmFuZ2VMZW5ndGhFcnJvcnMsCisJSFdfTUlCX2lmTGF0ZUNvbGxpc2lvbnMsCisJSFdfTUlCX1NJWkUKK307CisKK2VudW0gY2hpcF90eXBlIHsKKwlDSElQX1RZUEVfVlQ2MTEwID0gMSwKK307CisKK3N0cnVjdCB2ZWxvY2l0eV9pbmZvX3RibCB7CisJZW51bSBjaGlwX3R5cGUgY2hpcF9pZDsKKwljaGFyICpuYW1lOworCWludCBpb19zaXplOworCWludCB0eHF1ZXVlOworCXUzMiBmbGFnczsKK307CisKKyNkZWZpbmUgbWFjX2h3X21pYnNfaW5pdChyZWdzKSB7XAorCUJZVEVfUkVHX0JJVFNfT04oTUlCQ1JfTUlCRlJaLCYoKHJlZ3MpLT5NSUJDUikpO1wKKwlCWVRFX1JFR19CSVRTX09OKE1JQkNSX01JQkNMUiwmKChyZWdzKS0+TUlCQ1IpKTtcCisJZG8ge31cCisJCXdoaWxlIChCWVRFX1JFR19CSVRTX0lTX09OKE1JQkNSX01JQkNMUiwmKChyZWdzKS0+TUlCQ1IpKSk7XAorCUJZVEVfUkVHX0JJVFNfT0ZGKE1JQkNSX01JQkZSWiwmKChyZWdzKS0+TUlCQ1IpKTtcCit9CisKKyNkZWZpbmUgbWFjX3JlYWRfaXNyKHJlZ3MpICAJCXJlYWRsKCYoKHJlZ3MpLT5JU1IpKQorI2RlZmluZSBtYWNfd3JpdGVfaXNyKHJlZ3MsIHgpICAJd3JpdGVsKCh4KSwmKChyZWdzKS0+SVNSKSkKKyNkZWZpbmUgbWFjX2NsZWFyX2lzcihyZWdzKSAJCXdyaXRlbCgweGZmZmZmZmZmTCwmKChyZWdzKS0+SVNSKSkKKworI2RlZmluZSBtYWNfd3JpdGVfaW50X21hc2sobWFzaywgcmVncykgCXdyaXRlbCgobWFzayksJigocmVncyktPklNUikpOworI2RlZmluZSBtYWNfZGlzYWJsZV9pbnQocmVncykgICAgICAgCXdyaXRlbChDUjBfR0lOVE1TSzEsJigocmVncyktPkNSMENscikpCisjZGVmaW5lIG1hY19lbmFibGVfaW50KHJlZ3MpICAgIAl3cml0ZWwoQ1IwX0dJTlRNU0sxLCYoKHJlZ3MpLT5DUjBTZXQpKQorCisjZGVmaW5lIG1hY19od19taWJzX3JlYWQocmVncywgTUlCcykge1wKKwlpbnQgaTtcCisJQllURV9SRUdfQklUU19PTihNSUJDUl9NUFRSSU5JLCYoKHJlZ3MpLT5NSUJDUikpO1wKKwlmb3IgKGk9MDtpPEhXX01JQl9TSVpFO2krKykge1wKKwkJKE1JQnMpW2ldPXJlYWRsKCYoKHJlZ3MpLT5NSUJEYXRhKSk7XAorCX1cCit9CisKKyNkZWZpbmUgbWFjX3NldF9kbWFfbGVuZ3RoKHJlZ3MsIG4pIHtcCisJQllURV9SRUdfQklUU19TRVQoKG4pLDB4MDcsJigocmVncyktPkRDRkcpKTtcCit9CisKKyNkZWZpbmUgbWFjX3NldF9yeF90aHJlc2gocmVncywgbikge1wKKwlCWVRFX1JFR19CSVRTX1NFVCgobiksKE1DRkdfUkZUMHxNQ0ZHX1JGVDEpLCYoKHJlZ3MpLT5NQ0ZHKSk7XAorfQorCisjZGVmaW5lIG1hY19yeF9xdWV1ZV9ydW4ocmVncykge1wKKwl3cml0ZWIoVFJEQ1NSX1JVTiwgJigocmVncyktPlJEQ1NSU2V0KSk7XAorfQorCisjZGVmaW5lIG1hY19yeF9xdWV1ZV93YWtlKHJlZ3MpIHtcCisJd3JpdGViKFRSRENTUl9XQUssICYoKHJlZ3MpLT5SRENTUlNldCkpO1wKK30KKworI2RlZmluZSBtYWNfdHhfcXVldWVfcnVuKHJlZ3MsIG4pIHtcCisJd3JpdGV3KFRSRENTUl9SVU48PCgobikqNCksJigocmVncyktPlREQ1NSU2V0KSk7XAorfQorCisjZGVmaW5lIG1hY190eF9xdWV1ZV93YWtlKHJlZ3MsIG4pIHtcCisJd3JpdGV3KFRSRENTUl9XQUs8PChuKjQpLCYoKHJlZ3MpLT5URENTUlNldCkpO1wKK30KKworI2RlZmluZSBtYWNfZWVwcm9tX3JlbG9hZChyZWdzKSB7XAorCWludCBpPTA7XAorCUJZVEVfUkVHX0JJVFNfT04oRUVDU1JfUkVMT0FELCYoKHJlZ3MpLT5FRUNTUikpO1wKKwlkbyB7XAorCQl1ZGVsYXkoMTApO1wKKwkJaWYgKGkrKz4weDEwMDApIHtcCisJCQlicmVhaztcCisJCX1cCisJfXdoaWxlIChCWVRFX1JFR19CSVRTX0lTX09OKEVFQ1NSX1JFTE9BRCwmKChyZWdzKS0+RUVDU1IpKSk7XAorfQorCitlbnVtIHZlbG9jaXR5X2NhbV90eXBlIHsKKwlWRUxPQ0lUWV9WTEFOX0lEX0NBTSA9IDAsCisJVkVMT0NJVFlfTVVMVElDQVNUX0NBTQorfTsKKworLyoqCisgKgltYWNfZ2V0X2NhbV9tYXNrCS0JUmVhZCBhIENBTSBtYXNrCisgKglAcmVnczogcmVnaXN0ZXIgYmxvY2sgZm9yIHRoaXMgdmVsb2NpdHkKKyAqCUBtYXNrOiBidWZmZXIgdG8gc3RvcmUgbWFzaworICoJQGNhbV90eXBlOiBDQU0gdG8gZmV0Y2gKKyAqCisgKglGZXRjaCB0aGUgbWFzayBiaXRzIG9mIHRoZSBzZWxlY3RlZCBDQU0gYW5kIHN0b3JlIHRoZW0gaW50byB0aGUKKyAqCXByb3ZpZGVkIG1hc2sgYnVmZmVyLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYWNfZ2V0X2NhbV9tYXNrKHN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICogcmVncywgdTggKiBtYXNrLCBlbnVtIHZlbG9jaXR5X2NhbV90eXBlIGNhbV90eXBlKQoreworCWludCBpOworCS8qIFNlbGVjdCBDQU0gbWFzayAqLworCUJZVEVfUkVHX0JJVFNfU0VUKENBTUNSX1BTX0NBTV9NQVNLLCBDQU1DUl9QUzEgfCBDQU1DUl9QUzAsICZyZWdzLT5DQU1DUik7CisKKwlpZiAoY2FtX3R5cGUgPT0gVkVMT0NJVFlfVkxBTl9JRF9DQU0pCisJCXdyaXRlYihDQU1BRERSX1ZDQU1TTCwgJnJlZ3MtPkNBTUFERFIpOworCWVsc2UKKwkJd3JpdGViKDAsICZyZWdzLT5DQU1BRERSKTsKKworCS8qIHJlYWQgbWFzayAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCSptYXNrKysgPSByZWFkYigmKHJlZ3MtPk1BUkNBTVtpXSkpOworCisJLyogZGlzYWJsZSBDQU1FTiAqLworCXdyaXRlYigwLCAmcmVncy0+Q0FNQUREUik7CisKKwkvKiBTZWxlY3QgbWFyICovCisJQllURV9SRUdfQklUU19TRVQoQ0FNQ1JfUFNfTUFSLCBDQU1DUl9QUzEgfCBDQU1DUl9QUzAsICZyZWdzLT5DQU1DUik7CisKK30KKworLyoqCisgKgltYWNfc2V0X2NhbV9tYXNrCS0JU2V0IGEgQ0FNIG1hc2sKKyAqCUByZWdzOiByZWdpc3RlciBibG9jayBmb3IgdGhpcyB2ZWxvY2l0eQorICoJQG1hc2s6IENBTSBtYXNrIHRvIGxvYWQKKyAqCUBjYW1fdHlwZTogQ0FNIHRvIHN0b3JlCisgKgorICoJU3RvcmUgYSBuZXcgbWFzayBpbnRvIGEgQ0FNCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIG1hY19zZXRfY2FtX21hc2soc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzLCB1OCAqIG1hc2ssIGVudW0gdmVsb2NpdHlfY2FtX3R5cGUgY2FtX3R5cGUpCit7CisJaW50IGk7CisJLyogU2VsZWN0IENBTSBtYXNrICovCisJQllURV9SRUdfQklUU19TRVQoQ0FNQ1JfUFNfQ0FNX01BU0ssIENBTUNSX1BTMSB8IENBTUNSX1BTMCwgJnJlZ3MtPkNBTUNSKTsKKworCWlmIChjYW1fdHlwZSA9PSBWRUxPQ0lUWV9WTEFOX0lEX0NBTSkKKwkJd3JpdGViKENBTUFERFJfQ0FNRU4gfCBDQU1BRERSX1ZDQU1TTCwgJnJlZ3MtPkNBTUFERFIpOworCWVsc2UKKwkJd3JpdGViKENBTUFERFJfQ0FNRU4sICZyZWdzLT5DQU1BRERSKTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJd3JpdGViKCptYXNrKyssICYocmVncy0+TUFSQ0FNW2ldKSk7CisJfQorCS8qIGRpc2FibGUgQ0FNRU4gKi8KKwl3cml0ZWIoMCwgJnJlZ3MtPkNBTUFERFIpOworCisJLyogU2VsZWN0IG1hciAqLworCUJZVEVfUkVHX0JJVFNfU0VUKENBTUNSX1BTX01BUiwgQ0FNQ1JfUFMxIHwgQ0FNQ1JfUFMwLCAmcmVncy0+Q0FNQ1IpOworfQorCisvKioKKyAqCW1hY19zZXRfY2FtCS0Jc2V0IENBTSBkYXRhCisgKglAcmVnczogcmVnaXN0ZXIgYmxvY2sgb2YgdGhpcyB2ZWxvY2l0eQorICoJQGlkeDogQ2FtIGluZGV4CisgKglAYWRkcjogMiBvciA2IGJ5dGVzIG9mIENBTSBkYXRhCisgKglAY2FtX3R5cGU6IENBTSB0byBsb2FkCisgKgorICoJTG9hZCBhbiBhZGRyZXNzIG9yIHZsYW4gdGFnIGludG8gYSBDQU0KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbWFjX3NldF9jYW0oc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzLCBpbnQgaWR4LCB1OCAqYWRkciwgZW51bSB2ZWxvY2l0eV9jYW1fdHlwZSBjYW1fdHlwZSkKK3sKKwlpbnQgaTsKKworCS8qIFNlbGVjdCBDQU0gbWFzayAqLworCUJZVEVfUkVHX0JJVFNfU0VUKENBTUNSX1BTX0NBTV9EQVRBLCBDQU1DUl9QUzEgfCBDQU1DUl9QUzAsICZyZWdzLT5DQU1DUik7CisKKwlpZHggJj0gKDY0IC0gMSk7CisKKwlpZiAoY2FtX3R5cGUgPT0gVkVMT0NJVFlfVkxBTl9JRF9DQU0pCisJCXdyaXRlYihDQU1BRERSX0NBTUVOIHwgQ0FNQUREUl9WQ0FNU0wgfCBpZHgsICZyZWdzLT5DQU1BRERSKTsKKwllbHNlCisJCXdyaXRlYihDQU1BRERSX0NBTUVOIHwgaWR4LCAmcmVncy0+Q0FNQUREUik7CisKKwlpZiAoY2FtX3R5cGUgPT0gVkVMT0NJVFlfVkxBTl9JRF9DQU0pCisJCXdyaXRldygqKCh1MTYgKikgYWRkciksICZyZWdzLT5NQVJDQU1bMF0pOworCWVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCQl3cml0ZWIoKmFkZHIrKywgJihyZWdzLT5NQVJDQU1baV0pKTsKKwkJfQorCX0KKwlCWVRFX1JFR19CSVRTX09OKENBTUNSX0NBTVdSLCAmcmVncy0+Q0FNQ1IpOworCisJdWRlbGF5KDEwKTsKKworCXdyaXRlYigwLCAmcmVncy0+Q0FNQUREUik7CisKKwkvKiBTZWxlY3QgbWFyICovCisJQllURV9SRUdfQklUU19TRVQoQ0FNQ1JfUFNfTUFSLCBDQU1DUl9QUzEgfCBDQU1DUl9QUzAsICZyZWdzLT5DQU1DUik7Cit9CisKKy8qKgorICoJbWFjX2dldF9jYW0JLQlmZXRjaCBDQU0gZGF0YQorICoJQHJlZ3M6IHJlZ2lzdGVyIGJsb2NrIG9mIHRoaXMgdmVsb2NpdHkKKyAqCUBpZHg6IENhbSBpbmRleAorICoJQGFkZHI6IGJ1ZmZlciB0byBob2xkIHVwIHRvIDYgYnl0ZXMgb2YgQ0FNIGRhdGEKKyAqCUBjYW1fdHlwZTogQ0FNIHRvIGxvYWQKKyAqCisgKglMb2FkIGFuIGFkZHJlc3Mgb3IgdmxhbiB0YWcgZnJvbSBhIENBTSBpbnRvIHRoZSBidWZmZXIgcHJvdmlkZWQgYnkKKyAqCXRoZSBjYWxsZXIuIFZMQU4gdGFncyBhcmUgMiBieXRlcyB0aGUgYWRkcmVzcyBjYW0gZW50cmllcyBhcmUgNi4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgbWFjX2dldF9jYW0oc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzLCBpbnQgaWR4LCB1OCAqYWRkciwgZW51bSB2ZWxvY2l0eV9jYW1fdHlwZSBjYW1fdHlwZSkKK3sKKwlpbnQgaTsKKworCS8qIFNlbGVjdCBDQU0gbWFzayAqLworCUJZVEVfUkVHX0JJVFNfU0VUKENBTUNSX1BTX0NBTV9EQVRBLCBDQU1DUl9QUzEgfCBDQU1DUl9QUzAsICZyZWdzLT5DQU1DUik7CisKKwlpZHggJj0gKDY0IC0gMSk7CisKKwlpZiAoY2FtX3R5cGUgPT0gVkVMT0NJVFlfVkxBTl9JRF9DQU0pCisJCXdyaXRlYihDQU1BRERSX0NBTUVOIHwgQ0FNQUREUl9WQ0FNU0wgfCBpZHgsICZyZWdzLT5DQU1BRERSKTsKKwllbHNlCisJCXdyaXRlYihDQU1BRERSX0NBTUVOIHwgaWR4LCAmcmVncy0+Q0FNQUREUik7CisKKwlCWVRFX1JFR19CSVRTX09OKENBTUNSX0NBTVJELCAmcmVncy0+Q0FNQ1IpOworCisJdWRlbGF5KDEwKTsKKworCWlmIChjYW1fdHlwZSA9PSBWRUxPQ0lUWV9WTEFOX0lEX0NBTSkKKwkJKigodTE2ICopIGFkZHIpID0gcmVhZHcoJihyZWdzLT5NQVJDQU1bMF0pKTsKKwllbHNlCisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyssIGFkZHIrKykKKwkJCSooKHU4ICopIGFkZHIpID0gcmVhZGIoJihyZWdzLT5NQVJDQU1baV0pKTsKKworCXdyaXRlYigwLCAmcmVncy0+Q0FNQUREUik7CisKKwkvKiBTZWxlY3QgbWFyICovCisJQllURV9SRUdfQklUU19TRVQoQ0FNQ1JfUFNfTUFSLCBDQU1DUl9QUzEgfCBDQU1DUl9QUzAsICZyZWdzLT5DQU1DUik7Cit9CisKKy8qKgorICoJbWFjX3dvbF9yZXNldAktCXJlc2V0IFdPTCBhZnRlciBleGl0aW5nIGxvdyBwb3dlcgorICoJQHJlZ3M6IHJlZ2lzdGVyIGJsb2NrIG9mIHRoaXMgdmVsb2NpdHkKKyAqCisgKglDYWxsZWQgYWZ0ZXIgd2UgZHJvcCBvdXQgb2Ygd2FrZSBvbiBsYW4gbW9kZSBpbiBvcmRlciB0bworICoJcmVzZXQgdGhlIFdha2Ugb24gbGFuIGZlYXR1cmVzLiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmVzdG9yZQorICoJdGhlIHJlc3Qgb2YgdGhlIGxvZ2ljIGZyb20gdGhlIHJlc3VsdCBvZiBzbGVlcC93YWtldXAKKyAqLworCitpbmxpbmUgc3RhdGljIHZvaWQgbWFjX3dvbF9yZXNldChzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqIHJlZ3MpCit7CisKKwkvKiBUdXJuIG9mZiBTV1BUQUcgcmlnaHQgYWZ0ZXIgbGVhdmluZyBwb3dlciBtb2RlICovCisJQllURV9SRUdfQklUU19PRkYoU1RJQ0tIV19TV1BUQUcsICZyZWdzLT5TVElDS0hXKTsKKwkvKiBjbGVhciBzdGlja3kgYml0cyAqLworCUJZVEVfUkVHX0JJVFNfT0ZGKChTVElDS0hXX0RTMSB8IFNUSUNLSFdfRFMwKSwgJnJlZ3MtPlNUSUNLSFcpOworCisJQllURV9SRUdfQklUU19PRkYoQ0hJUEdDUl9GQ0dNSUksICZyZWdzLT5DSElQR0NSKTsKKwlCWVRFX1JFR19CSVRTX09GRihDSElQR0NSX0ZDTU9ERSwgJnJlZ3MtPkNISVBHQ1IpOworCS8qIGRpc2FibGUgZm9yY2UgUE1FLWVuYWJsZSAqLworCXdyaXRlYihXT0xDRkdfUE1FT1ZSLCAmcmVncy0+V09MQ0ZHQ2xyKTsKKwkvKiBkaXNhYmxlIHBvd2VyLWV2ZW50IGNvbmZpZyBiaXQgKi8KKwl3cml0ZXcoMHhGRkZGLCAmcmVncy0+V09MQ1JDbHIpOworCS8qIGNsZWFyIHBvd2VyIHN0YXR1cyAqLworCXdyaXRldygweEZGRkYsICZyZWdzLT5XT0xTUkNscik7Cit9CisKKworLyoKKyAqIEhlYWRlciBmb3IgV09MIGRlZmluaXRpb25zLiBVc2VkIHRvIGNvbXB1dGUgaGFzaGVzCisgKi8KKwordHlwZWRlZiB1OCBNQ0FNX0FERFJbRVRIX0FMRU5dOworCitzdHJ1Y3QgYXJwX3BhY2tldCB7CisJdTggZGVzdF9tYWNbRVRIX0FMRU5dOworCXU4IHNyY19tYWNbRVRIX0FMRU5dOworCXUxNiB0eXBlOworCXUxNiBhcl9ocmQ7CisJdTE2IGFyX3BybzsKKwl1OCBhcl9obG47CisJdTggYXJfcGxuOworCXUxNiBhcl9vcDsKKwl1OCBhcl9zaGFbRVRIX0FMRU5dOworCXU4IGFyX3NpcFs0XTsKKwl1OCBhcl90aGFbRVRIX0FMRU5dOworCXU4IGFyX3RpcFs0XTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IF9tYWdpY19wYWNrZXQgeworCXU4IGRlc3RfbWFjWzZdOworCXU4IHNyY19tYWNbNl07CisJdTE2IHR5cGU7CisJdTggTUFDWzE2XVs2XTsKKwl1OCBwYXNzd29yZFs2XTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworLyoKKyAqCVN0b3JlIGZvciBjaGlwIGNvbnRleHQgd2hlbiBzYXZpbmcgYW5kIHJlc3RvcmluZyBzdGF0dXMuIE5vdAorICoJYWxsIGZpZWxkcyBhcmUgc2F2ZWQvcmVzdG9yZWQgY3VycmVudGx5LgorICovCisKK3N0cnVjdCB2ZWxvY2l0eV9jb250ZXh0IHsKKwl1OCBtYWNfcmVnWzI1Nl07CisJTUNBTV9BRERSIGNhbV9hZGRyW01DQU1fU0laRV07CisJdTE2IHZjYW1bVkNBTV9TSVpFXTsKKwl1MzIgY2FtbWFza1syXTsKKwl1MzIgcGF0Y3JjWzJdOworCXUzMiBwYXR0ZXJuWzhdOworfTsKKworCisvKgorICoJTUlJIHJlZ2lzdGVycy4KKyAqLworCisKKy8qCisgKglSZWdpc3RlcnMgaW4gdGhlIE1JSSAob2Zmc2V0IHVuaXQgaXMgV09SRCkKKyAqLworCisjZGVmaW5lIE1JSV9SRUdfQk1DUiAgICAgICAgMHgwMAkvLyBwaHlzaWNhbCBhZGRyZXNzCisjZGVmaW5lIE1JSV9SRUdfQk1TUiAgICAgICAgMHgwMQkvLworI2RlZmluZSBNSUlfUkVHX1BIWUlEMSAgICAgIDB4MDIJLy8gT1VJCisjZGVmaW5lIE1JSV9SRUdfUEhZSUQyICAgICAgMHgwMwkvLyBPVUkgKyBNb2R1bGUgSUQgKyBSRVYgSUQKKyNkZWZpbmUgTUlJX1JFR19BTkFSICAgICAgICAweDA0CS8vCisjZGVmaW5lIE1JSV9SRUdfQU5MUEFSICAgICAgMHgwNQkvLworI2RlZmluZSBNSUlfUkVHX0cxMDAwQ1IgICAgIDB4MDkJLy8KKyNkZWZpbmUgTUlJX1JFR19HMTAwMFNSICAgICAweDBBCS8vCisjZGVmaW5lIE1JSV9SRUdfTU9EQ0ZHICAgICAgMHgxMAkvLworI2RlZmluZSBNSUlfUkVHX1RDU1IgICAgICAgIDB4MTYJLy8KKyNkZWZpbmUgTUlJX1JFR19QTEVEICAgICAgICAweDFCCS8vCisvLyBOUywgTVlTT04gb25seQorI2RlZmluZSBNSUlfUkVHX1BDUiAgICAgICAgIDB4MTcJLy8KKy8vIEVTSSBvbmx5CisjZGVmaW5lIE1JSV9SRUdfUENTUiAgICAgICAgMHgxNwkvLworI2RlZmluZSBNSUlfUkVHX0FVWENSICAgICAgIDB4MUMJLy8KKworLy8gTWFydmVsbCA4OEUxMDAwLzg4RTEwMDBTCisjZGVmaW5lIE1JSV9SRUdfUFNDUiAgICAgICAgMHgxMAkvLyBQSFkgc3BlY2lmaWMgY29udHJvbCByZWdpc3RlcgorCisvLworLy8gQml0cyBpbiB0aGUgQk1DUiByZWdpc3RlcgorLy8KKyNkZWZpbmUgQk1DUl9SRVNFVCAgICAgICAgICAweDgwMDAJLy8KKyNkZWZpbmUgQk1DUl9MQksgICAgICAgICAgICAweDQwMDAJLy8KKyNkZWZpbmUgQk1DUl9TUEVFRDEwMCAgICAgICAweDIwMDAJLy8KKyNkZWZpbmUgQk1DUl9BVVRPICAgICAgICAgICAweDEwMDAJLy8KKyNkZWZpbmUgQk1DUl9QRCAgICAgICAgICAgICAweDA4MDAJLy8KKyNkZWZpbmUgQk1DUl9JU08gICAgICAgICAgICAweDA0MDAJLy8KKyNkZWZpbmUgQk1DUl9SRUFVVE8gICAgICAgICAweDAyMDAJLy8KKyNkZWZpbmUgQk1DUl9GRFggICAgICAgICAgICAweDAxMDAJLy8KKyNkZWZpbmUgQk1DUl9TUEVFRDFHICAgICAgICAweDAwNDAJLy8KKy8vCisvLyBCaXRzIGluIHRoZSBCTVNSIHJlZ2lzdGVyCisvLworI2RlZmluZSBCTVNSX0FVVE9DTSAgICAgICAgIDB4MDAyMAkvLworI2RlZmluZSBCTVNSX0xOSyAgICAgICAgICAgIDB4MDAwNAkvLworCisvLworLy8gQml0cyBpbiB0aGUgQU5BUiByZWdpc3RlcgorLy8KKyNkZWZpbmUgQU5BUl9BU01ESVIgICAgICAgICAweDA4MDAJLy8gQXN5bW1ldHJpYyBQQVVTRSBzdXBwb3J0CisjZGVmaW5lIEFOQVJfUEFVU0UgICAgICAgICAgMHgwNDAwCS8vIFN5bW1ldHJpYyBQQVVTRSBTdXBwb3J0CisjZGVmaW5lIEFOQVJfVDQgICAgICAgICAgICAgMHgwMjAwCS8vCisjZGVmaW5lIEFOQVJfVFhGRCAgICAgICAgICAgMHgwMTAwCS8vCisjZGVmaW5lIEFOQVJfVFggICAgICAgICAgICAgMHgwMDgwCS8vCisjZGVmaW5lIEFOQVJfMTBGRCAgICAgICAgICAgMHgwMDQwCS8vCisjZGVmaW5lIEFOQVJfMTAgICAgICAgICAgICAgMHgwMDIwCS8vCisvLworLy8gQml0cyBpbiB0aGUgQU5MUEFSIHJlZ2lzdGVyCisvLworI2RlZmluZSBBTkxQQVJfQVNNRElSICAgICAgIDB4MDgwMAkvLyBBc3ltbWV0cmljIFBBVVNFIHN1cHBvcnQKKyNkZWZpbmUgQU5MUEFSX1BBVVNFICAgICAgICAweDA0MDAJLy8gU3ltbWV0cmljIFBBVVNFIFN1cHBvcnQKKyNkZWZpbmUgQU5MUEFSX1Q0ICAgICAgICAgICAweDAyMDAJLy8KKyNkZWZpbmUgQU5MUEFSX1RYRkQgICAgICAgICAweDAxMDAJLy8KKyNkZWZpbmUgQU5MUEFSX1RYICAgICAgICAgICAweDAwODAJLy8KKyNkZWZpbmUgQU5MUEFSXzEwRkQgICAgICAgICAweDAwNDAJLy8KKyNkZWZpbmUgQU5MUEFSXzEwICAgICAgICAgICAweDAwMjAJLy8KKworLy8KKy8vIEJpdHMgaW4gdGhlIEcxMDAwQ1IgcmVnaXN0ZXIKKy8vCisjZGVmaW5lIEcxMDAwQ1JfMTAwMEZEICAgICAgMHgwMjAwCS8vIFBIWSBpcyAxMDAwLVQgRnVsbC1kdXBsZXggY2FwYWJsZQorI2RlZmluZSBHMTAwMENSXzEwMDAgICAgICAgIDB4MDEwMAkvLyBQSFkgaXMgMTAwMC1UIEhhbGYtZHVwbGV4IGNhcGFibGUKKworLy8KKy8vIEJpdHMgaW4gdGhlIEcxMDAwU1IgcmVnaXN0ZXIKKy8vCisjZGVmaW5lIEcxMDAwU1JfMTAwMEZEICAgICAgMHgwODAwCS8vIExQIFBIWSBpcyAxMDAwLVQgRnVsbC1kdXBsZXggY2FwYWJsZQorI2RlZmluZSBHMTAwMFNSXzEwMDAgICAgICAgIDB4MDQwMAkvLyBMUCBQSFkgaXMgMTAwMC1UIEhhbGYtZHVwbGV4IGNhcGFibGUKKworI2RlZmluZSBUQ1NSX0VDSE9ESVMgICAgICAgIDB4MjAwMAkvLworI2RlZmluZSBBVVhDUl9NRFBQUyAgICAgICAgIDB4MDAwNAkvLworCisvLyBCaXRzIGluIHRoZSBQTEVEIHJlZ2lzdGVyCisjZGVmaW5lIFBMRURfTEFMQkUJCQkweDAwMDQJLy8KKworLy8gTWFydmVsbCA4OEUxMDAwLzg4RTEwMDBTIEJpdHMgaW4gdGhlIFBIWSBzcGVjaWZpYyBjb250cm9sIHJlZ2lzdGVyICgxMGgpCisjZGVmaW5lIFBTQ1JfQUNSU1RYICAgICAgICAgMHgwODAwCS8vIEFzc2VydCBDUlMgb24gVHJhbnNtaXQKKworI2RlZmluZSBQSFlJRF9DSUNBREFfQ1M4MjAxIDB4MDAwRkM0MTBVTAorI2RlZmluZSBQSFlJRF9WVDMyMTZfMzJCSVQgIDB4MDAwRkM2MTBVTAorI2RlZmluZSBQSFlJRF9WVDMyMTZfNjRCSVQgIDB4MDAwRkM2MDBVTAorI2RlZmluZSBQSFlJRF9NQVJWRUxMXzEwMDAgIDB4MDE0MTBDNTBVTAorI2RlZmluZSBQSFlJRF9NQVJWRUxMXzEwMDBTIDB4MDE0MTBDNDBVTAorCisjZGVmaW5lIFBIWUlEX1JFVl9JRF9NQVNLICAgMHgwMDAwMDAwRlVMCisKKyNkZWZpbmUgUEhZSURfR0VUX1BIWV9SRVZfSUQoaSkgICAgICgoaSkgJiBQSFlJRF9SRVZfSURfTUFTSykKKyNkZWZpbmUgUEhZSURfR0VUX1BIWV9JRChpKSAgICAgICAgICgoaSkgJiB+UEhZSURfUkVWX0lEX01BU0spCisKKyNkZWZpbmUgTUlJX1JFR19CSVRTX09OKHgsaSxwKSBkbyB7XAorICAgIHUxNiB3O1wKKyAgICB2ZWxvY2l0eV9taWlfcmVhZCgocCksKGkpLCYodykpO1wKKyAgICAodyl8PSh4KTtcCisgICAgdmVsb2NpdHlfbWlpX3dyaXRlKChwKSwoaSksKHcpKTtcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE1JSV9SRUdfQklUU19PRkYoeCxpLHApIGRvIHtcCisgICAgdTE2IHc7XAorICAgIHZlbG9jaXR5X21paV9yZWFkKChwKSwoaSksJih3KSk7XAorICAgICh3KSY9KH4oeCkpO1wKKyAgICB2ZWxvY2l0eV9taWlfd3JpdGUoKHApLChpKSwodykpO1wKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTUlJX1JFR19CSVRTX0lTX09OKHgsaSxwKSAoe1wKKyAgICB1MTYgdztcCisgICAgdmVsb2NpdHlfbWlpX3JlYWQoKHApLChpKSwmKHcpKTtcCisgICAgKChpbnQpICgodykgJiAoeCkpKTt9KQorCisjZGVmaW5lIE1JSV9HRVRfUEhZX0lEKHApICh7XAorICAgIHUzMiBpZDtcCisgICAgdmVsb2NpdHlfbWlpX3JlYWQoKHApLE1JSV9SRUdfUEhZSUQyLCh1MTYgKikgJmlkKTtcCisgICAgdmVsb2NpdHlfbWlpX3JlYWQoKHApLE1JSV9SRUdfUEhZSUQxLCgodTE2ICopICZpZCkrMSk7XAorICAgIChpZCk7fSkKKworLyoKKyAqIElubGluZSBkZWJ1ZyByb3V0aW5lCisgKi8KKworCitlbnVtIHZlbG9jaXR5X21zZ19sZXZlbCB7CisJTVNHX0xFVkVMX0VSUiA9IDAsCS8vRXJyb3JzIHRoYXQgd2lsbCBjYXVzZSBhYm5vcm1hbCBvcGVyYXRpb24uCisJTVNHX0xFVkVMX05PVElDRSA9IDEsCS8vU29tZSBlcnJvcnMgbmVlZCB1c2VycyB0byBiZSBub3RpZmllZC4KKwlNU0dfTEVWRUxfSU5GTyA9IDIsCS8vTm9ybWFsIG1lc3NhZ2UuCisJTVNHX0xFVkVMX1ZFUkJPU0UgPSAzLAkvL1dpbGwgcmVwb3J0IGFsbCB0cml2YWwgZXJyb3JzLgorCU1TR19MRVZFTF9ERUJVRyA9IDQJLy9Pbmx5IGZvciBkZWJ1ZyBwdXJwb3NlLgorfTsKKworI2lmZGVmIFZFTE9DSVRZX0RFQlVHCisjZGVmaW5lIEFTU0VSVCh4KSB7IFwKKwlpZiAoISh4KSkgeyBcCisJCXByaW50ayhLRVJOX0VSUiAiYXNzZXJ0aW9uICVzIGZhaWxlZDogZmlsZSAlcyBsaW5lICVkXG4iLCAjeCxcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fKTtcCisJCUJVRygpOyBcCisJfVwKK30KKyNkZWZpbmUgVkVMT0NJVFlfREJHKHAsYXJncy4uLikgcHJpbnRrKHAsICMjYXJncykKKyNlbHNlCisjZGVmaW5lIEFTU0VSVCh4KQorI2RlZmluZSBWRUxPQ0lUWV9EQkcoeCkKKyNlbmRpZgorCisjZGVmaW5lIFZFTE9DSVRZX1BSVChsLCBwLCBhcmdzLi4uKSBkbyB7aWYgKGw8PW1zZ2xldmVsKSBwcmludGsoIHAgLCMjYXJncyk7fSB3aGlsZSAoMCkKKworI2RlZmluZSBWRUxPQ0lUWV9QUlRfQ0FNTUFTSyhwLHQpIHtcCisJaW50IGk7XAorCWlmICgodCk9PVZFTE9DSVRZX01VTFRJQ0FTVF9DQU0pIHtcCisgICAgICAgIAlmb3IgKGk9MDtpPChNQ0FNX1NJWkUvOCk7aSsrKVwKKwkJCXByaW50aygiJTAyWCIsKHApLT5tQ0FNbWFza1tpXSk7XAorCX1cCisJZWxzZSB7XAorCQlmb3IgKGk9MDtpPChWQ0FNX1NJWkUvOCk7aSsrKVwKKwkJCXByaW50aygiJTAyWCIsKHApLT52Q0FNbWFza1tpXSk7XAorCX1cCisJcHJpbnRrKCJcbiIpO1wKK30KKworCisKKyNkZWZpbmUgICAgIFZFTE9DSVRZX1dPTF9NQUdJQyAgICAgICAgICAgICAweDAwMDAwMDAwVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX1dPTF9QSFkgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX1dPTF9BUlAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX1dPTF9VQ0FTVCAgICAgICAgICAgICAweDAwMDAwMDA0VUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX1dPTF9CQ0FTVCAgICAgICAgICAgICAweDAwMDAwMDEwVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX1dPTF9NQ0FTVCAgICAgICAgICAgICAweDAwMDAwMDIwVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX1dPTF9NQUdJQ19TRUMgICAgICAgICAweDAwMDAwMDQwVUwKKworLyoKKyAqCUZsYWdzIGZvciBvcHRpb25zCisgKi8KKworI2RlZmluZSAgICAgVkVMT0NJVFlfRkxBR1NfVEFHR0lORyAgICAgICAgIDB4MDAwMDAwMDFVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfRkxBR1NfVFhfQ1NVTSAgICAgICAgIDB4MDAwMDAwMDJVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfRkxBR1NfUlhfQ1NVTSAgICAgICAgIDB4MDAwMDAwMDRVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfRkxBR1NfSVBfQUxJR04gICAgICAgIDB4MDAwMDAwMDhVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfRkxBR1NfVkFMX1BLVF9MRU4gICAgIDB4MDAwMDAwMTBVTAorCisjZGVmaW5lICAgICBWRUxPQ0lUWV9GTEFHU19GTE9XX0NUUkwgICAgICAgMHgwMTAwMDAwMFVMCisKKy8qCisgKglGbGFncyBmb3IgZHJpdmVyIHN0YXR1cworICovCisKKyNkZWZpbmUgICAgIFZFTE9DSVRZX0ZMQUdTX09QRU5FRCAgICAgICAgICAweDAwMDEwMDAwVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX0ZMQUdTX1ZNTlNfQ09OTkVDVEVEICAweDAwMDIwMDAwVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX0ZMQUdTX1ZNTlNfQ09NTUlUVEVEICAweDAwMDQwMDAwVUwKKyNkZWZpbmUgICAgIFZFTE9DSVRZX0ZMQUdTX1dPTF9FTkFCTEVEICAgICAweDAwMDgwMDAwVUwKKworLyoKKyAqCUZsYWdzIGZvciBNSUkgc3RhdHVzCisgKi8KKworI2RlZmluZSAgICAgVkVMT0NJVFlfTElOS19GQUlMICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfU1BFRURfMTAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfU1BFRURfMTAwICAgICAgICAgICAgIDB4MDAwMDAwMDRVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfU1BFRURfMTAwMCAgICAgICAgICAgIDB4MDAwMDAwMDhVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfRFVQTEVYX0ZVTEwgICAgICAgICAgIDB4MDAwMDAwMTBVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfQVVUT05FR19FTkFCTEUgICAgICAgIDB4MDAwMDAwMjBVTAorI2RlZmluZSAgICAgVkVMT0NJVFlfRk9SQ0VEX0JZX0VFUFJPTSAgICAgIDB4MDAwMDAwNDBVTAorCisvKgorICoJRm9yIHZlbG9jaXR5X3NldF9tZWRpYV9kdXBsZXgKKyAqLworCisjZGVmaW5lICAgICBWRUxPQ0lUWV9MSU5LX0NIQU5HRSAgICAgICAgICAgMHgwMDAwMDAwMVVMCisKK2VudW0gc3BlZWRfb3B0IHsKKwlTUERfRFBYX0FVVE8gPSAwLAorCVNQRF9EUFhfMTAwX0hBTEYgPSAxLAorCVNQRF9EUFhfMTAwX0ZVTEwgPSAyLAorCVNQRF9EUFhfMTBfSEFMRiA9IDMsCisJU1BEX0RQWF8xMF9GVUxMID0gNAorfTsKKworZW51bSB2ZWxvY2l0eV9pbml0X3R5cGUgeworCVZFTE9DSVRZX0lOSVRfQ09MRCA9IDAsCisJVkVMT0NJVFlfSU5JVF9SRVNFVCwKKwlWRUxPQ0lUWV9JTklUX1dPTAorfTsKKworZW51bSB2ZWxvY2l0eV9mbG93X2NudGxfdHlwZSB7CisJRkxPV19DTlRMX0RFRkFVTFQgPSAxLAorCUZMT1dfQ05UTF9UWCwKKwlGTE9XX0NOVExfUlgsCisJRkxPV19DTlRMX1RYX1JYLAorCUZMT1dfQ05UTF9ESVNBQkxFLAorfTsKKworc3RydWN0IHZlbG9jaXR5X29wdCB7CisJaW50IG51bXJ4OwkJCS8qIE51bWJlciBvZiBSWCBkZXNjcmlwdG9ycyAqLworCWludCBudW10eDsJCQkvKiBOdW1iZXIgb2YgVFggZGVzY3JpcHRvcnMgKi8KKwllbnVtIHNwZWVkX29wdCBzcGRfZHB4OwkJLyogTWVkaWEgbGluayBtb2RlICovCisJaW50IHZpZDsJCQkvKiB2bGFuIGlkICovCisJaW50IERNQV9sZW5ndGg7CQkJLyogRE1BIGxlbmd0aCAqLworCWludCByeF90aHJlc2g7CQkJLyogUlhfVEhSRVNIICovCisJaW50IGZsb3dfY250bDsKKwlpbnQgd29sX29wdHM7CQkJLyogV2FrZSBvbiBsYW4gb3B0aW9ucyAqLworCWludCB0ZF9pbnRfY291bnQ7CisJaW50IGludF93b3JrczsKKwlpbnQgcnhfYmFuZHdpZHRoX2hpOworCWludCByeF9iYW5kd2lkdGhfbG87CisJaW50IHJ4X2JhbmR3aWR0aF9lbjsKKwl1MzIgZmxhZ3M7Cit9OworCitzdHJ1Y3QgdmVsb2NpdHlfaW5mbyB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKworCWRtYV9hZGRyX3QgcmRfcG9vbF9kbWE7CisJZG1hX2FkZHJfdCB0ZF9wb29sX2RtYVtUWF9RVUVVRV9OT107CisKKwlkbWFfYWRkcl90IHR4X2J1ZnNfZG1hOworCXU4ICp0eF9idWZzOworCisJdTggaXBfYWRkcls0XTsKKwllbnVtIGNoaXBfdHlwZSBjaGlwX2lkOworCisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiBtYWNfcmVnczsKKwl1bnNpZ25lZCBsb25nIG1lbWFkZHI7CisJdW5zaWduZWQgbG9uZyBpb2FkZHI7CisJdTMyIGlvX3NpemU7CisKKwl1OCByZXZfaWQ7CisKKyNkZWZpbmUgQVZBSUxfVEQocCxxKSAgICgocCktPm9wdGlvbnMubnVtdHgtKChwKS0+dGRfdXNlZFsocSldKSkKKworCWludCBudW1fdHhxOworCisJdm9sYXRpbGUgaW50IHRkX3VzZWRbVFhfUVVFVUVfTk9dOworCWludCB0ZF9jdXJyW1RYX1FVRVVFX05PXTsKKwlpbnQgdGRfdGFpbFtUWF9RVUVVRV9OT107CisJc3RydWN0IHR4X2Rlc2MgKnRkX3JpbmdzW1RYX1FVRVVFX05PXTsKKwlzdHJ1Y3QgdmVsb2NpdHlfdGRfaW5mbyAqdGRfaW5mb3NbVFhfUVVFVUVfTk9dOworCisJaW50IHJkX2N1cnI7CisJaW50IHJkX2RpcnR5OworCXUzMiByZF9maWxsZWQ7CisJc3RydWN0IHJ4X2Rlc2MgKnJkX3Jpbmc7CisJc3RydWN0IHZlbG9jaXR5X3JkX2luZm8gKnJkX2luZm87CS8qIEl0J3MgYW4gYXJyYXkgKi8KKworI2RlZmluZSBHRVRfUkRfQllfSURYKHZwdHIsIGlkeCkgICAodnB0ci0+cmRfcmluZ1tpZHhdKQorCXUzMiBtaWJfY291bnRlcltNQVhfSFdfTUlCX0NPVU5URVJdOworCXN0cnVjdCB2ZWxvY2l0eV9vcHQgb3B0aW9uczsKKworCXUzMiBpbnRfbWFzazsKKworCXUzMiBmbGFnczsKKworCWludCByeF9idWZfc3o7CisJdTMyIG1paV9zdGF0dXM7CisJdTMyIHBoeV9pZDsKKwlpbnQgbXVsdGljYXN0X2xpbWl0OworCisJdTggdkNBTW1hc2tbKFZDQU1fU0laRSAvIDgpXTsKKwl1OCBtQ0FNbWFza1soTUNBTV9TSVpFIC8gOCldOworCisJc3BpbmxvY2tfdCBsb2NrOworCisJaW50IHdvbF9vcHRzOworCXU4IHdvbF9wYXNzd2RbNl07CisKKwlzdHJ1Y3QgdmVsb2NpdHlfY29udGV4dCBjb250ZXh0OworCisJdTMyIHRpY2tzOworCXUzMiByeF9ieXRlczsKKworfTsKKworLyoqCisgKgl2ZWxvY2l0eV9nZXRfaXAJCS0JZmluZCBhbiBJUCBhZGRyZXNzIGZvciB0aGUgZGV2aWNlCisgKglAdnB0cjogVmVsb2NpdHkgdG8gcXVlcnkKKyAqCisgKglEaWcgb3V0IGFuIElQIGFkZHJlc3MgZm9yIHRoaXMgaW50ZXJmYWNlIHNvIHRoYXQgd2UgY2FuCisgKgljb25maWd1cmUgd2FrZXVwIHdpdGggV09MIGZvciBBUlAuIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBJUAorICoJYWRkcmVzc2VzIG9uIHRoaXMgY2hhaW4gdGhlbiB3ZSB1c2UgdGhlIGZpcnN0IC0gbXVsdGktSVAgV09MIGlzIG5vdAorICoJc3VwcG9ydGVkLgorICoKKyAqCUNIRUNLIE1FOiBsb2NraW5nCisgKi8KKworaW5saW5lIHN0YXRpYyBpbnQgdmVsb2NpdHlfZ2V0X2lwKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQoreworCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IChzdHJ1Y3QgaW5fZGV2aWNlICopIHZwdHItPmRldi0+aXBfcHRyOworCXN0cnVjdCBpbl9pZmFkZHIgKmlmYTsKKworCWlmIChpbl9kZXYgIT0gTlVMTCkgeworCQlpZmEgPSAoc3RydWN0IGluX2lmYWRkciAqKSBpbl9kZXYtPmlmYV9saXN0OworCQlpZiAoaWZhICE9IE5VTEwpIHsKKwkJCW1lbWNweSh2cHRyLT5pcF9hZGRyLCAmaWZhLT5pZmFfYWRkcmVzcywgNCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT0VOVDsKK30KKworLyoqCisgKgl2ZWxvY2l0eV91cGRhdGVfaHdfbWlicwktCWZldGNoIE1JQiBjb3VudGVycyBmcm9tIGNoaXAKKyAqCUB2cHRyOiB2ZWxvY2l0eSB0byB1cGRhdGUKKyAqCisgKglUaGUgdmVsb2NpdHkgaGFyZHdhcmUga2VlcHMgY2VydGFpbiBjb3VudGVycyBpbiB0aGUgaGFyZHdhcmUKKyAqIAlzaWRlLiBXZSBuZWVkIHRvIHJlYWQgdGhlc2Ugd2hlbiB0aGUgdXNlciBhc2tzIGZvciBzdGF0aXN0aWNzCisgKglvciB3aGVuIHRoZXkgb3ZlcmZsb3cgKGNhdXNpbmcgYW4gaW50ZXJydXB0KS4gVGhlIHJlYWQgb2YgdGhlCisgKglzdGF0aXN0aWMgY2xlYXJzIGl0LCBzbyB3ZSBrZWVwIHJ1bm5pbmcgbWFzdGVyIGNvdW50ZXJzIGluIHVzZXIKKyAqCXNwYWNlLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2ZWxvY2l0eV91cGRhdGVfaHdfbWlicyhzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cikKK3sKKwl1MzIgdG1wOworCWludCBpOworCUJZVEVfUkVHX0JJVFNfT04oTUlCQ1JfTUlCRkxTSCwgJih2cHRyLT5tYWNfcmVncy0+TUlCQ1IpKTsKKworCXdoaWxlIChCWVRFX1JFR19CSVRTX0lTX09OKE1JQkNSX01JQkZMU0gsICYodnB0ci0+bWFjX3JlZ3MtPk1JQkNSKSkpOworCisJQllURV9SRUdfQklUU19PTihNSUJDUl9NUFRSSU5JLCAmKHZwdHItPm1hY19yZWdzLT5NSUJDUikpOworCWZvciAoaSA9IDA7IGkgPCBIV19NSUJfU0laRTsgaSsrKSB7CisJCXRtcCA9IHJlYWRsKCYodnB0ci0+bWFjX3JlZ3MtPk1JQkRhdGEpKSAmIDB4MDBGRkZGRkZVTDsKKwkJdnB0ci0+bWliX2NvdW50ZXJbaV0gKz0gdG1wOworCX0KK30KKworLyoqCisgKglpbml0X2Zsb3dfY29udHJvbF9yZWdpc3RlciAJLQlzZXQgdXAgZmxvdyBjb250cm9sCisgKglAdnB0cjogdmVsb2NpdHkgdG8gY29uZmlndXJlCisgKgorICoJQ29uZmlndXJlIHRoZSBmbG93IGNvbnRyb2wgcmVnaXN0ZXJzIGZvciB0aGlzIHZlbG9jaXR5IGRldmljZS4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9mbG93X2NvbnRyb2xfcmVnaXN0ZXIoc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIpCit7CisJc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzID0gdnB0ci0+bWFjX3JlZ3M7CisKKwkvKiBTZXQge1hISVRIMSwgWEhJVEgwLCBYTFRIMSwgWExUSDB9IGluIEZsb3dDUjEgdG8gezEsIDAsIDEsIDF9CisJICAgZGVwZW5kIG9uIFJEPTY0LCBhbmQgVHVybiBvbiBYTk9FTiBpbiBGbG93Q1IxICovCisJd3JpdGVsKChDUjBfWE9ORU4gfCBDUjBfWEhJVEgxIHwgQ1IwX1hMVEgxIHwgQ1IwX1hMVEgwKSwgJnJlZ3MtPkNSMFNldCk7CisJd3JpdGVsKChDUjBfRkRYVEZDRU4gfCBDUjBfRkRYUkZDRU4gfCBDUjBfSERYRkNFTiB8IENSMF9YSElUSDApLCAmcmVncy0+Q1IwQ2xyKTsKKworCS8qIFNldCBUeFBhdXNlVGltZXIgdG8gMHhGRkZGICovCisJd3JpdGV3KDB4RkZGRiwgJnJlZ3MtPnR4X3BhdXNlX3RpbWVyKTsKKworCS8qIEluaXRpYWxpemUgUkJSRFUgdG8gUnggYnVmZmVyIGNvdW50LiAqLworCXdyaXRldyh2cHRyLT5vcHRpb25zLm51bXJ4LCAmcmVncy0+UkJSRFUpOworfQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL0tjb25maWcgYi9kcml2ZXJzL25ldC93YW4vS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTc5MTkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL0tjb25maWcKQEAgLTAsMCArMSw2MDcgQEAKKyMKKyMgd2FuIGRldmljZXMgY29uZmlndXJhdGlvbgorIworCittZW51ICJXYW4gaW50ZXJmYWNlcyIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMKKworY29uZmlnIFdBTgorCWJvb2wgIldhbiBpbnRlcmZhY2VzIHN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgV2lkZSBBcmVhIE5ldHdvcmtzIChXQU5zKSwgc3VjaCBhcyBYLjI1LCBGcmFtZSBSZWxheSBhbmQgbGVhc2VkCisJICBsaW5lcywgYXJlIHVzZWQgdG8gaW50ZXJjb25uZWN0IExvY2FsIEFyZWEgTmV0d29ya3MgKExBTnMpIG92ZXIgdmFzdAorCSAgZGlzdGFuY2VzIHdpdGggZGF0YSB0cmFuc2ZlciByYXRlcyBzaWduaWZpY2FudGx5IGhpZ2hlciB0aGFuIHRob3NlCisJICBhY2hpZXZhYmxlIHdpdGggY29tbW9ubHkgdXNlZCBhc3luY2hyb25vdXMgbW9kZW0gY29ubmVjdGlvbnMuCisKKwkgIFVzdWFsbHksIGEgcXVpdGUgZXhwZW5zaXZlIGV4dGVybmFsIGRldmljZSBjYWxsZWQgYSBgV0FOIHJvdXRlcicgaXMKKwkgIG5lZWRlZCB0byBjb25uZWN0IHRvIGEgV0FOLiBBcyBhbiBhbHRlcm5hdGl2ZSwgYSByZWxhdGl2ZWx5CisJICBpbmV4cGVuc2l2ZSBXQU4gaW50ZXJmYWNlIGNhcmQgY2FuIGFsbG93IHlvdXIgTGludXggYm94IHRvIGRpcmVjdGx5CisJICBjb25uZWN0IHRvIGEgV0FOLgorCisJICBJZiB5b3UgaGF2ZSBvbmUgb2YgdGhvc2UgY2FyZHMgYW5kIHdpc2ggdG8gdXNlIGl0IHVuZGVyIExpbnV4LAorCSAgc2F5IFkgaGVyZSBhbmQgYWxzbyB0byB0aGUgV0FOIGRyaXZlciBmb3IgeW91ciBjYXJkLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCisjIFRoZXJlIGlzIG5vIHdheSB0byBkZXRlY3QgYSBjb210cm9sIHN2MTEgLSBmb3JjZSBpdCBtb2R1bGFyIGZvciBub3cuCitjb25maWcgSE9TVEVTU19TVjExCisJdHJpc3RhdGUgIkNvbXRyb2wgSG9zdGVzcyBTVi0xMSBzdXBwb3J0IgorCWRlcGVuZHMgb24gV0FOICYmIElTQSAmJiBtCisJaGVscAorCSAgRHJpdmVyIGZvciBDb210cm9sIEhvc3Rlc3MgU1YtMTEgbmV0d29yayBjYXJkIHdoaWNoCisJICBvcGVyYXRlcyBvbiBsb3cgc3BlZWQgc3luY2hyb25vdXMgc2VyaWFsIGxpbmtzIGF0IHVwIHRvCisJICAyNTZLYnBzLCBzdXBwb3J0aW5nIFBQUCBhbmQgQ2lzY28gSERMQy4KKworCSAgVGhlIGRyaXZlciB3aWxsIGJlIGNvbXBpbGVkIGFzIGEgbW9kdWxlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBob3N0ZXNzX3N2MTEuCisKKyMgVGhlIENPU0EvU1JQIGRyaXZlciBoYXMgbm90IGJlZW4gdGVzdGVkIGFzIG5vbi1tb2R1bGFyIHlldC4KK2NvbmZpZyBDT1NBCisJdHJpc3RhdGUgIkNPU0EvU1JQIHN5bmMgc2VyaWFsIGJvYXJkcyBzdXBwb3J0IgorCWRlcGVuZHMgb24gV0FOICYmIElTQSAmJiBtCisJLS0taGVscC0tLQorCSAgRHJpdmVyIGZvciBDT1NBIGFuZCBTUlAgc3luY2hyb25vdXMgc2VyaWFsIGJvYXJkcy4KKworCSAgVGhlc2UgYm9hcmRzIGFsbG93IHRvIGNvbm5lY3Qgc3luY2hyb25vdXMgc2VyaWFsIGRldmljZXMgKGZvciBleGFtcGxlCisJICBiYXNlLWJhbmQgbW9kZW1zLCBvciBhbnkgb3RoZXIgZGV2aWNlIHdpdGggdGhlIFguMjEsIFYuMjQsIFYuMzUgb3IKKwkgIFYuMzYgaW50ZXJmYWNlKSB0byB5b3VyIExpbnV4IGJveC4gVGhlIGNhcmRzIGNhbiB3b3JrIGFzIHRoZQorCSAgY2hhcmFjdGVyIGRldmljZSwgc3luY2hyb25vdXMgUFBQIG5ldHdvcmsgZGV2aWNlLCBvciB0aGUgQ2lzY28gSERMQworCSAgbmV0d29yayBkZXZpY2UuCisKKwkgIFlvdSB3aWxsIG5lZWQgdXNlci1zcGFjZSB1dGlsaXRpZXMgQ09TQSBvciBTUlAgYm9hcmRzIGZvciBkb3dubG9hZGluZworIAkgIHRoZSBmaXJtd2FyZSB0byB0aGUgY2FyZHMgYW5kIHRvIHNldCB0aGVtIHVwLiBMb29rIGF0IHRoZQorCSAgPGh0dHA6Ly93d3cuZmkubXVuaS5jei9+a2FzL2Nvc2EvPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gWW91IGNhbiBhbHNvCisJICByZWFkIHRoZSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIDxmaWxlOmRyaXZlcnMvbmV0L3dhbi9jb3NhLmM+IGZvcgorCSAgZGV0YWlscyBhYm91dCB0aGUgY2FyZHMgYW5kIHRoZSBkcml2ZXIgaXRzZWxmLgorCisJICBUaGUgZHJpdmVyIHdpbGwgYmUgY29tcGlsZWQgYXMgYSBtb2R1bGU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGNvc2EuCisKK2NvbmZpZyBEU0NDNAorCXRyaXN0YXRlICJFdGluYyBQQ0lTWU5DIHNlcmlhbCBib2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gV0FOICYmIFBDSSAmJiBtCisJaGVscAorCSAgRHJpdmVyIGZvciBFdGluYyBQQ0lTWU5DIGJvYXJkcyBiYXNlZCBvbiB0aGUgSW5maW5lb24gKGV4LiBTaWVtZW5zKQorCSAgRFNDQzQgY2hpcHNldC4KKworCSAgVGhpcyBpcyBzdXBwb3NlZCB0byB3b3JrIHdpdGggdGhlIGZvdXIgcG9ydCBjYXJkLiBUYWtlIGEgbG9vayBhdAorCSAgPGh0dHA6Ly93d3cuY29nZW5pdC5mci9kc2NjNC8+IGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZQorCSAgZHJpdmVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBkc2NjNC4KKworY29uZmlnIERTQ0M0X1BDSVNZTkMKKwlib29sICJFdGluYyBQQ0lTWU5DIGZlYXR1cmVzIgorCWRlcGVuZHMgb24gRFNDQzQKKwloZWxwCisJICBEdWUgdG8gRXRpbmMncyBkZXNpZ24gY2hvaWNlIGZvciBpdHMgUENJU1lOQyBjYXJkcywgc29tZSBvcGVyYXRpb25zCisJICBhcmUgb25seSBhbGxvd2VkIG9uIHNwZWNpZmljIHBvcnRzIG9mIHRoZSBEU0NDNC4gVGhpcyBvcHRpb24gaXMgdGhlCisJICBvbmx5IHdheSBmb3IgdGhlIGRyaXZlciB0byBrbm93IHRoYXQgaXQgc2hvdWxkbid0IHJldHVybiBhIHN1Y2Nlc3MKKwkgIGNvZGUgZm9yIHRoZXNlIG9wZXJhdGlvbnMuCisKKwkgIFBsZWFzZSBzYXkgWSBpZiB5b3VyIGNhcmQgaXMgYW4gRXRpbmMncyBQQ0lTWU5DLgorCitjb25maWcgRFNDQzRfUENJX1JTVAorCWJvb2wgIkhhcmQgcmVzZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIERTQ0M0CisJaGVscAorCSAgVmFyaW91cyBEU0NDNCBidWdzIGZvcmJpZCBhbnkgcmVsaWFibGUgc29mdHdhcmUgcmVzZXQgb2YgdGhlIEFTSUMuCisJICBBcyBhIHJlcGxhY2VtZW50LCBzb21lIHZlbmRvcnMgcHJvdmlkZSBhIHdheSB0byBhc3NlcnQgdGhlIFBDSSAjUlNUCisJICBwaW4gb2YgRFNDQzQgdGhyb3VnaCB0aGUgR1BJTyBwb3J0IG9mIHRoZSBjYXJkLiBJZiB5b3UgY2hvb3NlIFksCisJICB0aGUgZHJpdmVyIHdpbGwgbWFrZSB1c2Ugb2YgdGhpcyBmZWF0dXJlIGJlZm9yZSBtb2R1bGUgcmVtb3ZhbAorCSAgKGkuZS4gcm1tb2QpLiBUaGUgZmVhdHVyZSBpcyBrbm93biB0byBiZSBhdmFpbGFibGUgb24gQ29tbXRlY2gncworCSAgY2FyZHMuIENvbnRhY3QgeW91ciBtYW51ZmFjdHVyZXIgZm9yIGRldGFpbHMuCisKKwkgIFNheSBZIGlmIHlvdXIgY2FyZCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuCisKKyMKKyMgTGFuIE1lZGlhJ3MgYm9hcmQuIEN1cnJlbnRseSAxMDAwLCAxMjAwLCA1MjAwLCA1MjQ1CisjCitjb25maWcgTEFOTUVESUEKKwl0cmlzdGF0ZSAiTGFuTWVkaWEgQ29ycC4gU1NJL1YuMzUsIFQxL0UxLCBIU1NJLCBUMyBib2FyZHMiCisJZGVwZW5kcyBvbiBXQU4gJiYgUENJCisJLS0taGVscC0tLQorCSAgRHJpdmVyIGZvciB0aGUgZm9sbG93aW5nIExhbiBNZWRpYSBmYW1pbHkgb2Ygc2VyaWFsIGJvYXJkczoKKworCSAgLSBMTUMgMTAwMCBib2FyZCBhbGxvd3MgeW91IHRvIGNvbm5lY3Qgc3luY2hyb25vdXMgc2VyaWFsIGRldmljZXMKKwkgIChmb3IgZXhhbXBsZSBiYXNlLWJhbmQgbW9kZW1zLCBvciBhbnkgb3RoZXIgZGV2aWNlIHdpdGggdGhlIFguMjEsCisJICBWLjI0LCBWLjM1IG9yIFYuMzYgaW50ZXJmYWNlKSB0byB5b3VyIExpbnV4IGJveC4KKworCSAgLSBMTUMgMTIwMCB3aXRoIG9uIGJvYXJkIERTVSBib2FyZCBhbGxvd3MgeW91IHRvIGNvbm5lY3QgeW91ciBMaW51eAorCSAgYm94IGRpcmVjdGx5IHRvIGEgVDEgb3IgRTEgY2lyY3VpdC4KKworCSAgLSBMTUMgNTIwMCBib2FyZCBwcm92aWRlcyBhIEhTU0kgaW50ZXJmYWNlIGNhcGFibGUgb2YgcnVubmluZyB1cCB0bworCSAgNTIgTWJpdHMgcGVyIHNlY29uZC4KKworCSAgLSBMTUMgNTI0NSBib2FyZCBjb25uZWN0cyBkaXJlY3RseSB0byBhIFQzIGNpcmN1aXQgc2F2aW5nIHRoZQorCSAgYWRkaXRpb25hbCBleHRlcm5hbCBoYXJkd2FyZS4KKworCSAgVG8gY2hhbmdlIHNldHRpbmcgc3VjaCBhcyBzeW5jUFBQIHZzIENpc2NvIEhETEMgb3IgY2xvY2sgc291cmNlIHlvdQorCSAgd2lsbCBuZWVkIGxtY2N0bC4gIEl0IGlzIGF2YWlsYWJsZSBhdCA8ZnRwOi8vZnRwLmxhbm1lZGlhLmNvbS8+CisJICAoYnJva2VuIGxpbmspLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBsbWMuCisKKyMgVGhlcmUgaXMgbm8gd2F5IHRvIGRldGVjdCBhIFNlYWxldmVsIGJvYXJkLiBGb3JjZSBpdCBtb2R1bGFyCitjb25maWcgU0VBTEVWRUxfNDAyMQorCXRyaXN0YXRlICJTZWFsZXZlbCBTeXN0ZW1zIDQwMjEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFdBTiAmJiBJU0EgJiYgbQorCWhlbHAKKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBTZWFsZXZlbCBTeXN0ZW1zIEFDQiA1NiBzZXJpYWwgSS9PIGFkYXB0ZXIuCisKKwkgIFRoZSBkcml2ZXIgd2lsbCBiZSBjb21waWxlZCBhcyBhIG1vZHVsZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2VhbGV2ZWwuCisKK2NvbmZpZyBTWU5DTElOS19TWU5DUFBQCisJdHJpc3RhdGUgIlN5bmNMaW5rIEhETEMvU1lOQ1BQUCBzdXBwb3J0IgorCWRlcGVuZHMgb24gV0FOCisJaGVscAorCSAgRW5hYmxlcyBIRExDL1NZTkNQUFAgc3VwcG9ydCBmb3IgdGhlIFN5bmNMaW5rIFdBTiBkcml2ZXIuCisKKwkgIE5vcm1hbGx5IHRoZSBTeW5jTGluayBXQU4gZHJpdmVyIHdvcmtzIHdpdGggdGhlIG1haW4gUFBQIGRyaXZlcgorCSAgPGZpbGU6ZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYz4gYW5kIHBwcGQgcHJvZ3JhbS4KKwkgIEhETEMvU1lOQ1BQUCBzdXBwb3J0IGFsbG93cyB1c2Ugb2YgdGhlIENpc2NvIEhETEMvUFBQIGRyaXZlcgorCSAgPGZpbGU6ZHJpdmVycy9uZXQvd2FuL3N5bmNwcHAuYz4uIFRoZSBTeW5jTGluayBXQU4gZHJpdmVyIChpbgorCSAgY2hhcmFjdGVyIGRldmljZXMpIG11c3QgYWxzbyBiZSBlbmFibGVkLgorCisjIEdlbmVyaWMgSERMQworY29uZmlnIEhETEMKKwl0cmlzdGF0ZSAiR2VuZXJpYyBIRExDIGxheWVyIgorCWRlcGVuZHMgb24gV0FOCisJaGVscAorCSAgU2F5IFkgdG8gdGhpcyBvcHRpb24gaWYgeW91ciBMaW51eCBib3ggY29udGFpbnMgYSBXQU4gKFdpZGUgQXJlYQorCSAgTmV0d29yaykgY2FyZCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIgYW5kIHlvdSBhcmUgcGxhbm5pbmcgdG8KKwkgIGNvbm5lY3QgdGhlIGJveCB0byBhIFdBTi4KKworCSAgWW91IHdpbGwgbmVlZCBzdXBwb3J0aW5nIHNvZnR3YXJlIGZyb20KKwkgIDxodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL25ldC9oZGxjLz4uCisJICBHZW5lcmljIEhETEMgZHJpdmVyIGN1cnJlbnRseSBzdXBwb3J0cyByYXcgSERMQywgQ2lzY28gSERMQywgRnJhbWUKKwkgIFJlbGF5LCBzeW5jaHJvbm91cyBQb2ludC10by1Qb2ludCBQcm90b2NvbCAoUFBQKSBhbmQgWC4yNS4KKworIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGhkbGMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBIRExDX1JBVworCWJvb2wgIlJhdyBIRExDIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIRExDCisJaGVscAorCSAgR2VuZXJpYyBIRExDIGRyaXZlciBzdXBwb3J0aW5nIHJhdyBIRExDIG92ZXIgV0FOIGNvbm5lY3Rpb25zLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgSERMQ19SQVdfRVRICisJYm9vbCAiUmF3IEhETEMgRXRoZXJuZXQgZGV2aWNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIRExDCisJaGVscAorCSAgR2VuZXJpYyBIRExDIGRyaXZlciBzdXBwb3J0aW5nIHJhdyBIRExDIEV0aGVybmV0IGRldmljZSBlbXVsYXRpb24KKwkgIG92ZXIgV0FOIGNvbm5lY3Rpb25zLgorCisJICBZb3Ugd2lsbCBuZWVkIGl0IGZvciBFdGhlcm5ldCBvdmVyIEhETEMgYnJpZGdlcy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEhETENfQ0lTQ08KKwlib29sICJDaXNjbyBIRExDIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIRExDCisJaGVscAorCSAgR2VuZXJpYyBIRExDIGRyaXZlciBzdXBwb3J0aW5nIENpc2NvIEhETEMgb3ZlciBXQU4gY29ubmVjdGlvbnMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBIRExDX0ZSCisJYm9vbCAiRnJhbWUgUmVsYXkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhETEMKKwloZWxwCisJICBHZW5lcmljIEhETEMgZHJpdmVyIHN1cHBvcnRpbmcgRnJhbWUgUmVsYXkgb3ZlciBXQU4gY29ubmVjdGlvbnMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBIRExDX1BQUAorCWJvb2wgIlN5bmNocm9ub3VzIFBvaW50LXRvLVBvaW50IFByb3RvY29sIChQUFApIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIRExDCisJaGVscAorCSAgR2VuZXJpYyBIRExDIGRyaXZlciBzdXBwb3J0aW5nIFBQUCBvdmVyIFdBTiBjb25uZWN0aW9ucy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEhETENfWDI1CisJYm9vbCAiWC4yNSBwcm90b2NvbCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSERMQyAmJiAoTEFQQj1tICYmIEhETEM9bSB8fCBMQVBCPXkpCisJaGVscAorCSAgR2VuZXJpYyBIRExDIGRyaXZlciBzdXBwb3J0aW5nIFguMjUgb3ZlciBXQU4gY29ubmVjdGlvbnMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbW1lbnQgIlguMjUvTEFQQiBzdXBwb3J0IGlzIGRpc2FibGVkIgorCWRlcGVuZHMgb24gV0FOICYmIEhETEMgJiYgKExBUEIhPW0gfHwgSERMQyE9bSkgJiYgTEFQQiE9eQorCitjb25maWcgUENJMjAwU1lOCisJdHJpc3RhdGUgIkdvcmFtbyBQQ0kyMDBTWU4gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhETEMgJiYgUENJCisJaGVscAorCSAgRHJpdmVyIGZvciBQQ0kyMDBTWU4gY2FyZHMgYnkgR29yYW1vIHNwLiBqLgorCisJICBJZiB5b3UgaGF2ZSBzdWNoIGEgY2FyZCwgc2F5IFkgaGVyZSBhbmQgc2VlCisJICA8aHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9uZXQvaGRsYy8+LgorCisJICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBjaTIwMHN5bi4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFdBTlhMCisJdHJpc3RhdGUgIlNCRSBJbmMuIHdhblhMIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIRExDICYmIFBDSQorCWhlbHAKKwkgIERyaXZlciBmb3Igd2FuWEwgUENJIGNhcmRzIGJ5IFNCRSBJbmMuCisKKwkgIElmIHlvdSBoYXZlIHN1Y2ggYSBjYXJkLCBzYXkgWSBoZXJlIGFuZCBzZWUKKwkgIDxodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL25ldC9oZGxjLz4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgd2FueGwuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBXQU5YTF9CVUlMRF9GSVJNV0FSRQorCWJvb2wgInJlYnVpbGQgd2FuWEwgZmlybXdhcmUiCisJZGVwZW5kcyBvbiBXQU5YTCAmJiAhUFJFVkVOVF9GSVJNV0FSRV9CVUlMRAorCWhlbHAKKwkgIEFsbG93cyB5b3UgdG8gcmVidWlsZCBmaXJtd2FyZSBydW4gYnkgdGhlIFFVSUNDIHByb2Nlc3Nvci4KKwkgIEl0IHJlcXVpcmVzIGFzNjhrLCBsZDY4ayBhbmQgaGV4ZHVtcCBwcm9ncmFtcy4KKworCSAgWW91IHNob3VsZCBuZXZlciBuZWVkIHRoaXMgb3B0aW9uLCBzYXkgTi4KKworY29uZmlnIFBDMzAwCisJdHJpc3RhdGUgIkN5Y2xhZGVzLVBDMzAwIHN1cHBvcnQgKFJTLTIzMi9WLjM1LCBYLjIxLCBUMS9FMSBib2FyZHMpIgorCWRlcGVuZHMgb24gSERMQyAmJiBQQ0kKKwktLS1oZWxwLS0tCisJICBEcml2ZXIgZm9yIHRoZSBDeWNsYWRlcy1QQzMwMCBzeW5jaHJvbm91cyBjb21tdW5pY2F0aW9uIGJvYXJkcy4KKworCSAgVGhlc2UgYm9hcmRzIHByb3ZpZGUgc3luY2hyb25vdXMgc2VyaWFsIGludGVyZmFjZXMgdG8geW91cgorCSAgTGludXggYm94IChpbnRlcmZhY2VzIGN1cnJlbnRseSBhdmFpbGFibGUgYXJlIFJTLTIzMi9WLjM1LCBYLjIxIGFuZAorCSAgVDEvRTEpLiBJZiB5b3Ugd2lzaCB0byBzdXBwb3J0IE11bHRpbGluayBQUFAsIHBsZWFzZSBzZWxlY3QgdGhlCisJICBvcHRpb24gbGF0ZXIgYW5kIHJlYWQgdGhlIGZpbGUgUkVBRE1FLm1scHBwIHByb3ZpZGVkIGJ5IFBDMzAwCisJICBwYWNrYWdlLgorCisJICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHBjMzAwLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgUEMzMDBfTUxQUFAKKwlib29sICJDeWNsYWRlcy1QQzMwMCBNTFBQUCBzdXBwb3J0IgorCWRlcGVuZHMgb24gUEMzMDAgJiYgUFBQX01VTFRJTElOSyAmJiBQUFBfU1lOQ19UVFkgJiYgSERMQ19QUFAKKwloZWxwCisJICBNdWx0aWxpbmsgUFBQIG92ZXIgdGhlIFBDMzAwIHN5bmNocm9ub3VzIGNvbW11bmljYXRpb24gYm9hcmRzLgorCitjb21tZW50ICJDeWNsYWRlcy1QQzMwMCBNTFBQUCBzdXBwb3J0IGlzIGRpc2FibGVkLiIKKwlkZXBlbmRzIG9uIFdBTiAmJiBIRExDICYmIFBDMzAwICYmIChQUFA9biB8fCAhUFBQX01VTFRJTElOSyB8fCBQUFBfU1lOQ19UVFk9biB8fCAhSERMQ19QUFApCisKK2NvbW1lbnQgIlJlZmVyIHRvIHRoZSBmaWxlIFJFQURNRS5tbHBwcCwgcHJvdmlkZWQgYnkgUEMzMDAgcGFja2FnZS4iCisJZGVwZW5kcyBvbiBXQU4gJiYgSERMQyAmJiBQQzMwMCAmJiAoUFBQPW4gfHwgIVBQUF9NVUxUSUxJTksgfHwgUFBQX1NZTkNfVFRZPW4gfHwgIUhETENfUFBQKQorCitjb25maWcgTjIKKwl0cmlzdGF0ZSAiU0RMIFJJU0NvbS9OMiBzdXBwb3J0IgorCWRlcGVuZHMgb24gSERMQyAmJiBJU0EKKwloZWxwCisJICBEcml2ZXIgZm9yIFJJU0NvbS9OMiBzaW5nbGUgb3IgZHVhbCBjaGFubmVsIElTQSBjYXJkcyBieQorCSAgU0RMIENvbW11bmljYXRpb25zIEluYy4KKworCSAgSWYgeW91IGhhdmUgc3VjaCBhIGNhcmQsIHNheSBZIGhlcmUgYW5kIHNlZQorCSAgPGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMvbmV0L2hkbGMvPi4KKworCSAgTm90ZSB0aGF0IE4yY3N1IGFuZCBOMmRkcyBjYXJkcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbjIuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBDMTAxCisJdHJpc3RhdGUgIk1veGEgQzEwMSBzdXBwb3J0IgorCWRlcGVuZHMgb24gSERMQyAmJiBJU0EKKwloZWxwCisJICBEcml2ZXIgZm9yIEMxMDEgU3VwZXJTeW5jIElTQSBjYXJkcyBieSBNb3hhIFRlY2hub2xvZ2llcyBDby4sIEx0ZC4KKworCSAgSWYgeW91IGhhdmUgc3VjaCBhIGNhcmQsIHNheSBZIGhlcmUgYW5kIHNlZQorCSAgPGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMvbmV0L2hkbGMvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYzEwMS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEZBUlNZTkMKKwl0cmlzdGF0ZSAiRmFyU3luYyBULVNlcmllcyBzdXBwb3J0IgorCWRlcGVuZHMgb24gSERMQyAmJiBQQ0kKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciB0aGUgRmFyU3luYyBULVNlcmllcyBYLjIxIChhbmQgVi4zNS9WLjI0KSBjYXJkcyBieQorCSAgRmFyU2l0ZSBDb21tdW5pY2F0aW9ucyBMdGQuCisKKwkgIFN5bmNocm9ub3VzIGNvbW11bmljYXRpb24gaXMgc3VwcG9ydGVkIG9uIGFsbCBwb3J0cyBhdCBzcGVlZHMgdXAgdG8KKwkgIDhNYi9zICgxMjhLIG9uIFYuMjQpIHVzaW5nIHN5bmNocm9ub3VzIFBQUCwgQ2lzY28gSERMQywgcmF3IEhETEMsCisJICBGcmFtZSBSZWxheSBvciBYLjI1L0xBUEIuCisKKwkgIElmIHlvdSB3YW50IHRoZSBtb2R1bGUgdG8gYmUgYXV0b21hdGljYWxseSBsb2FkZWQgd2hlbiB0aGUgaW50ZXJmYWNlCisJICBpcyByZWZlcmVuY2VkIHRoZW4geW91IHNob3VsZCBhZGQgImFsaWFzIGhkbGNYIGZhcnN5bmMiIHRvCisJICAvZXRjL21vZHByb2JlLmNvbmYgZm9yIGVhY2ggaW50ZXJmYWNlLCB3aGVyZSBYIGlzIDAsIDEsIDIsIC4uLiwgb3IKKwkgIHNpbXBseSB1c2UgImFsaWFzIGhkbGMqIGZhcnN5bmMiIHRvIGluZGljYXRlIGFsbCBvZiB0aGVtLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBmYXJzeW5jLgorCitjb25maWcgRExDSQorCXRyaXN0YXRlICJGcmFtZSBSZWxheSBETENJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBXQU4KKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciB0aGUgRnJhbWUgUmVsYXkgcHJvdG9jb2wuCisKKwkgIEZyYW1lIFJlbGF5IGlzIGEgZmFzdCBsb3ctY29zdCB3YXkgdG8gY29ubmVjdCB0byBhIHJlbW90ZSBJbnRlcm5ldAorCSAgYWNjZXNzIHByb3ZpZGVyIG9yIHRvIGZvcm0gYSBwcml2YXRlIHdpZGUgYXJlYSBuZXR3b3JrLiBUaGUgb25lCisJICBwaHlzaWNhbCBsaW5lIGZyb20geW91ciBib3ggdG8gdGhlIGxvY2FsICJzd2l0Y2giIChpLmUuIHRoZSBlbnRyeQorCSAgcG9pbnQgdG8gdGhlIEZyYW1lIFJlbGF5IG5ldHdvcmssIHVzdWFsbHkgYXQgdGhlIHBob25lIGNvbXBhbnkpIGNhbgorCSAgY2Fycnkgc2V2ZXJhbCBsb2dpY2FsIHBvaW50LXRvLXBvaW50IGNvbm5lY3Rpb25zIHRvIG90aGVyIGNvbXB1dGVycworCSAgY29ubmVjdGVkIHRvIHRoZSBGcmFtZSBSZWxheSBuZXR3b3JrLiBGb3IgYSBnZW5lcmFsIGV4cGxhbmF0aW9uIG9mCisJICB0aGUgcHJvdG9jb2wsIGNoZWNrIG91dCA8aHR0cDovL3d3dy5tcGxzZm9ydW0ub3JnLz4uCisKKwkgIFRvIHVzZSBmcmFtZSByZWxheSwgeW91IG5lZWQgc3VwcG9ydGluZyBoYXJkd2FyZSAoY2FsbGVkIEZSQUQpIGFuZAorCSAgY2VydGFpbiBwcm9ncmFtcyBmcm9tIHRoZSBuZXQtdG9vbHMgcGFja2FnZSBhcyBleHBsYWluZWQgaW4KKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9mcmFtZXJlbGF5LnR4dD4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGRsY2kuCisKK2NvbmZpZyBETENJX0NPVU5UCisJaW50ICJNYXggb3BlbiBETENJIgorCWRlcGVuZHMgb24gRExDSQorCWRlZmF1bHQgIjI0IgorCWhlbHAKKwkgIE1heGltYWwgbnVtYmVyIG9mIGxvZ2ljYWwgcG9pbnQtdG8tcG9pbnQgZnJhbWUgcmVsYXkgY29ubmVjdGlvbnMKKwkgICh0aGUgaWRlbnRpZmllcnMgb2Ygd2hpY2ggYXJlIGNhbGxlZCBEQ0xJcykgdGhhdCB0aGUgZHJpdmVyIGNhbgorCSAgaGFuZGxlLgorCisJICBUaGUgZGVmYXVsdCBpcyBwcm9iYWJseSBmaW5lLgorCitjb25maWcgRExDSV9NQVgKKwlpbnQgIk1heCBETENJIHBlciBkZXZpY2UiCisJZGVwZW5kcyBvbiBETENJCisJZGVmYXVsdCAiOCIKKwloZWxwCisJICBIb3cgbWFueSBsb2dpY2FsIHBvaW50LXRvLXBvaW50IGZyYW1lIHJlbGF5IGNvbm5lY3Rpb25zICh0aGUKKwkgIGlkZW50aWZpZXJzIG9mIHdoaWNoIGFyZSBjYWxsZWQgRENMSXMpIHNob3VsZCBiZSBoYW5kbGVkIGJ5IGVhY2gKKwkgIG9mIHlvdXIgaGFyZHdhcmUgZnJhbWUgcmVsYXkgYWNjZXNzIGRldmljZXMuCisKKwkgIEdvIHdpdGggdGhlIGRlZmF1bHQuCisKK2NvbmZpZyBTRExBCisJdHJpc3RhdGUgIlNETEEgKFNhbmdvbWEgUzUwMi9TNTA4KSBzdXBwb3J0IgorCWRlcGVuZHMgb24gRExDSSAmJiBJU0EKKwloZWxwCisJICBEcml2ZXIgZm9yIHRoZSBTYW5nb21hIFM1MDJBLCBTNTAyRSwgYW5kIFM1MDggRnJhbWUgUmVsYXkgQWNjZXNzCisJICBEZXZpY2VzLgorCisJICBUaGVzZSBhcmUgbXVsdGktcHJvdG9jb2wgY2FyZHMsIGJ1dCBvbmx5IEZyYW1lIFJlbGF5IGlzIHN1cHBvcnRlZAorCSAgYnkgdGhlIGRyaXZlciBhdCB0aGlzIHRpbWUuIFBsZWFzZSByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZnJhbWVyZWxheS50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzZGxhLgorCisjIFdhbiByb3V0ZXIgY29yZS4KK2NvbmZpZyBXQU5fUk9VVEVSX0RSSVZFUlMKKwlib29sICJXQU4gcm91dGVyIGRyaXZlcnMiCisJZGVwZW5kcyBvbiBXQU4gJiYgV0FOX1JPVVRFUgorCS0tLWhlbHAtLS0KKwkgIENvbm5lY3QgTEFOIHRvIFdBTiB2aWEgTGludXggYm94LgorCisJICBTZWxlY3QgZHJpdmVyIHlvdXIgY2FyZCBhbmQgcmVtZW1iZXIgdG8gc2F5IFkgdG8gIldhbiBSb3V0ZXIuIgorCSAgWW91IHdpbGwgbmVlZCB0aGUgd2FuLXRvb2xzIHBhY2thZ2Ugd2hpY2ggaXMgYXZhaWxhYmxlIGZyb20KKwkgIDxmdHA6Ly9mdHAuc2FuZ29tYS5jb20vPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVhZDoKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy93YW4tcm91dGVyLnR4dD4uCisKKwkgIE5vdGUgdGhhdCB0aGUgYW5zd2VyIHRvIHRoaXMgcXVlc3Rpb24gd29uJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQorCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAorCSAgdGhlIHF1ZXN0aW9ucyBhYm91dCBXQU4gcm91dGVyIGRyaXZlcnMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBWRU5ET1JfU0FOR09NQQorCXRyaXN0YXRlICJTYW5nb21hIFdBTlBJUEUodG0pIG11bHRpcHJvdG9jb2wgY2FyZHMiCisJZGVwZW5kcyBvbiBXQU5fUk9VVEVSX0RSSVZFUlMgJiYgV0FOX1JPVVRFUiAmJiAoUENJIHx8IElTQSkgJiYgQlJPS0VOCisJLS0taGVscC0tLQorCSAgRHJpdmVyIGZvciBTNTE0LVBDSS9JU0EgU3luY2hyb25vdXMgRGF0YSBMaW5rIEFkYXB0ZXJzIChTRExBKS4KKworCSAgV0FOUElQRSBmcm9tIFNhbmdvbWEgVGVjaG5vbG9naWVzIEluYy4gPGh0dHA6Ly93d3cuc2FuZ29tYS5jb20vPgorCSAgaXMgYSBmYW1pbHkgb2YgaW50ZWxsaWdlbnQgbXVsdGlwcm90b2NvbCBXQU4gYWRhcHRlcnMgd2l0aCBkYXRhCisJICB0cmFuc2ZlciByYXRlcyB1cCB0byA0TWJwcy4gQ2FyZHMgc3VwcG9ydDoKKworCSAgLSBYLjI1LCBGcmFtZSBSZWxheSwgUFBQLCBDaXNjbyBIRExDIHByb3RvY29scy4KKworCSAgLSBBUEkgZm9yIHByb3RvY29scyBsaWtlIEhETEMgKExBUEIpLCBIRExDIFN0cmVhbWluZywgWC4yNSwKKwkgIEZyYW1lIFJlbGF5IGFuZCBCaVN5bmMuCisKKwkgIC0gRXRoZXJuZXQgQnJpZGdpbmcgb3ZlciBGcmFtZSBSZWxheSBwcm90b2NvbC4KKworCSAgLSBNVUxUSUxJTksgUFBQCisKKwkgIC0gQXN5bmMgUFBQIChNb2RlbSBEaWFsdXApCisKKwkgIFRoZSBuZXh0IHF1ZXN0aW9ucyB3aWxsIGFzayB5b3UgYWJvdXQgdGhlIHByb3RvY29scyB5b3Ugd2FudAorCSAgdGhlIGRyaXZlciB0byBzdXBwb3J0LgorCisJICBJZiB5b3UgaGF2ZSBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXJkcywgc2F5IE0gdG8gdGhpcyBvcHRpb247CisJICBhbmQgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvd2FucGlwZS50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3YW5waXBlLgorCitjb25maWcgV0FOUElQRV9DSERMQworCWJvb2wgIldBTlBJUEUgQ2lzY28gSERMQyBzdXBwb3J0IgorCWRlcGVuZHMgb24gVkVORE9SX1NBTkdPTUEKKwktLS1oZWxwLS0tCisJICBDb25uZWN0IGEgV0FOUElQRSBjYXJkIHRvIGEgbGVhc2VkIGxpbmUgdXNpbmcgdGhlIENpc2NvIEhETEMuCisKKwkgIC0gU3VwcG9ydHMgRHVhbCBQb3J0IENpc2NvIEhETEMgb24gdGhlIFM1MTQtUENJL1M1MDgtSVNBIGNhcmRzCisJICB3aGljaCBhbGxvd3MgdXNlciB0byBidWlsZCBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIEhETEMgc3RyZWFtaW5nIEFQSS4KKworCSAgLSBDSERMQyBTdHJlYW1pbmcgTVVMVElMSU5LIFBQUCB0aGF0IGNhbiBiaW5kIG11bHRpcGxlIFdBTlBJUEUgVDEKKwkgIGNhcmRzIGludG8gYSBzaW5nbGUgbG9naWNhbCBjaGFubmVsLgorCisJICBTYXkgWSBhbmQgdGhlIENpc2NvIEhETEMgc3VwcG9ydCwgSERMQyBzdHJlYW1pbmcgQVBJIGFuZAorCSAgTVVMVElMSU5LIFBQUCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkcml2ZXIuCisKK2NvbmZpZyBXQU5QSVBFX0ZSCisJYm9vbCAiV0FOUElQRSBGcmFtZSBSZWxheSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVkVORE9SX1NBTkdPTUEKKwloZWxwCisJICBDb25uZWN0IGEgV0FOUElQRSBjYXJkIHRvIGEgRnJhbWUgUmVsYXkgbmV0d29yaywgb3IgdXNlIEZyYW1lIEZlbGF5CisJICBBUEkgdG8gZGV2ZWxvcCBjdXN0b20gYXBwbGljYXRpb25zLgorCisJICBDb250YWlucyB0aGUgRXRoZXJuZXQgQnJpZGdpbmcgb3ZlciBGcmFtZSBSZWxheSBmZWF0dXJlLCB3aGVyZQorCSAgYSBXQU5QSVBFIGZyYW1lIHJlbGF5IGxpbmsgY2FuIGJlIGRpcmVjdGx5IGNvbm5lY3RlZCB0byB0aGUgTGludXgKKwkgIGtlcm5lbCBicmlkZ2UuIFRoZSBGcmFtZSBSZWxheSBvcHRpb24gaXMgc3VwcG9ydGVkIG9uIFM1MTQtUENJCisJICBhbmQgUzUwOC1JU0EgY2FyZHMuCisKKwkgIFNheSBZIGFuZCB0aGUgRnJhbWUgUmVsYXkgc3VwcG9ydCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkcml2ZXIuCisKK2NvbmZpZyBXQU5QSVBFX1gyNQorCWJvb2wgIldBTlBJUEUgWC4yNSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVkVORE9SX1NBTkdPTUEKKwloZWxwCisJICBDb25uZWN0IGEgV0FOUElQRSBjYXJkIHRvIGFuIFguMjUgbmV0d29yay4KKworCSAgSW5jbHVkZXMgdGhlIFguMjUgQVBJIHN1cHBvcnQgZm9yIGN1c3RvbSBhcHBsaWNhdGlvbnMgb3ZlciB0aGUKKwkgIFguMjUgcHJvdG9jb2wuIFRoZSBYLjI1IG9wdGlvbiBpcyBzdXBwb3J0ZWQgb24gUzUxNC1QQ0kgYW5kCisJICBTNTA4LUlTQSBjYXJkcy4KKworCSAgU2F5IFkgYW5kIHRoZSBYLjI1IHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZHJpdmVyLgorCitjb25maWcgV0FOUElQRV9QUFAKKwlib29sICJXQU5QSVBFIFBQUCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVkVORE9SX1NBTkdPTUEKKwloZWxwCisJICBDb25uZWN0IGEgV0FOUElQRSBjYXJkIHRvIGEgbGVhc2VkIGxpbmUgdXNpbmcgUG9pbnQtdG8tUG9pbnQKKwkgIFByb3RvY29sIChQUFApLgorCisJICBUaGUgUFBQIG9wdGlvbiBpcyBzdXBwb3J0ZWQgb24gUzUxNC1QQ0kvUzUwOC1JU0EgY2FyZHMuCisKKwkgIFNheSBZIGFuZCB0aGUgUFBQIHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZHJpdmVyLgorCitjb25maWcgV0FOUElQRV9NVUxUUFBQCisJYm9vbCAiV0FOUElQRSBNdWx0aS1Qb3J0IFBQUCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVkVORE9SX1NBTkdPTUEKKwloZWxwCisJICBDb25uZWN0IGEgV0FOUElQRSBjYXJkIHRvIGEgbGVhc2VkIGxpbmUgdXNpbmcgUG9pbnQtdG8tUG9pbnQKKwkgIFByb3RvY29sIChQUFApLgorCisJICBVc2VzIGluLWtlcm5lbCBTeW5jUFBQIHByb3RvY29sIG92ZXIgdGhlIFNhbmdvbWEgSERMQyBTdHJlYW1pbmcKKwkgIGFkYXB0ZXIuIEluIHRoaXMgY2FzZSBlYWNoIFNhbmdvbWEgYWRhcHRlciBwb3J0IGNhbiBzdXBwb3J0IGFuCisJICBpbmRlcGVuZGVudCBQUFAgY29ubmVjdGlvbi4gRm9yIGV4YW1wbGUsIGEgc2luZ2xlIFF1YWQtUG9ydCBQQ0kKKwkgIGFkYXB0ZXIgY2FuIHN1cHBvcnQgdXAgdG8gZm91ciBpbmRlcGVuZGVudCBQUFAgbGlua3MuIFRoZSBQUFAKKwkgIG9wdGlvbiBpcyBzdXBwb3J0ZWQgb24gUzUxNC1QQ0kvUzUwOC1JU0EgY2FyZHMuCisKKwkgIFNheSBZIGFuZCB0aGUgTXVsdGktUG9ydCBQUFAgc3VwcG9ydCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkcml2ZXIuCisKK2NvbmZpZyBDWUNMQURFU19TWU5DCisJdHJpc3RhdGUgIkN5Y2xvbSAyWCh0bSkgY2FyZHMgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBXQU5fUk9VVEVSX0RSSVZFUlMgJiYgKFBDSSB8fCBJU0EpCisJLS0taGVscC0tLQorCSAgQ3ljbG9tIDJYIGZyb20gQ3ljbGFkZXMgQ29ycG9yYXRpb24gPGh0dHA6Ly93d3cuY3ljbGFkZXMuY29tLz4gaXMgYW4KKwkgIGludGVsbGlnZW50IG11bHRpcHJvdG9jb2wgV0FOIGFkYXB0ZXIgd2l0aCBkYXRhIHRyYW5zZmVyIHJhdGVzIHVwIHRvCisJICA1MTIgS2Jwcy4gVGhlc2UgY2FyZHMgc3VwcG9ydCB0aGUgWC4yNSBhbmQgU05BIHJlbGF0ZWQgcHJvdG9jb2xzLgorCisJICBXaGlsZSBubyBkb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBhdCB0aGlzIHRpbWUgcGxlYXNlIGdyYWIgdGhlCisJICB3YW5jb25maWcgdGFyYmFsbCBpbgorCSAgPGh0dHA6Ly93d3cuY29uZWN0aXZhLmNvbS5ici9+YWNtZS9jeWNzeW4tZGV2ZWwvPiAod2l0aCBtaW5vciBjaGFuZ2VzCisJICB0byBtYWtlIGl0IGNvbXBpbGUgd2l0aCB0aGUgY3VycmVudCB3YW5yb3V0ZXIgaW5jbHVkZSBmaWxlczsgZWZmb3J0cworCSAgYXJlIGJlaW5nIG1hZGUgdG8gdXNlIHRoZSBvcmlnaW5hbCBwYWNrYWdlIGF2YWlsYWJsZSBhdAorCSAgPGZ0cDovL2Z0cC5zYW5nb21hLmNvbS8+KS4KKworCSAgRmVlbCBmcmVlIHRvIGNvbnRhY3QgbWUgb3IgdGhlIGN5Y3N5bi1kZXZlbCBtYWlsaW5nIGxpc3QgYXQKKwkgIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+IGFuZCA8Y3ljc3luLWRldmVsQGJhemFyLmNvbmVjdGl2YS5jb20uYnI+IGZvcgorCSAgYWRkaXRpb25hbCBkZXRhaWxzLCBJIGhvcGUgdG8gaGF2ZSBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBhcyBzb29uIGFzCisJICBwb3NzaWJsZS4gKEN5Y2xhZGVzIEJyYXppbCBpcyB3cml0aW5nIHRoZSBEb2N1bWVudGF0aW9uKS4KKworCSAgVGhlIG5leHQgcXVlc3Rpb25zIHdpbGwgYXNrIHlvdSBhYm91dCB0aGUgcHJvdG9jb2xzIHlvdSB3YW50IHRoZQorCSAgZHJpdmVyIHRvIHN1cHBvcnQgKGZvciBub3cgb25seSBYLjI1IGlzIHN1cHBvcnRlZCkuCisKKwkgIElmIHlvdSBoYXZlIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhcmRzLCBzYXkgWSB0byB0aGlzIG9wdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY3ljbG9teC4KKworY29uZmlnIENZQ0xPTVhfWDI1CisJYm9vbCAiQ3ljbG9tIDJYIFguMjUgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIENZQ0xBREVTX1NZTkMKKwloZWxwCisJICBDb25uZWN0IGEgQ3ljbG9tIDJYIGNhcmQgdG8gYW4gWC4yNSBuZXR3b3JrLgorCisJICBFbmFibGluZyBYLjI1IHN1cHBvcnQgd2lsbCBlbmxhcmdlIHlvdXIga2VybmVsIGJ5IGFib3V0IDExIGtCLgorCisjIFguMjUgbmV0d29yayBkcml2ZXJzCitjb25maWcgTEFQQkVUSEVSCisJdHJpc3RhdGUgIkxBUEIgb3ZlciBFdGhlcm5ldCBkcml2ZXIgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBXQU4gJiYgTEFQQiAmJiBYMjUKKwktLS1oZWxwLS0tCisJICBEcml2ZXIgZm9yIGEgcHNldWRvIGRldmljZSAodHlwaWNhbGx5IGNhbGxlZCAvZGV2L2xhcGIwKSB3aGljaCBhbGxvd3MKKwkgIHlvdSB0byBvcGVuIGFuIExBUEIgcG9pbnQtdG8tcG9pbnQgY29ubmVjdGlvbiB0byBzb21lIG90aGVyIGNvbXB1dGVyCisJICBvbiB5b3VyIEV0aGVybmV0IG5ldHdvcmsuCisKKwkgIEluIG9yZGVyIHRvIGRvIHRoaXMsIHlvdSBuZWVkIHRvIHNheSBZIG9yIE0gdG8gdGhlIGRyaXZlciBmb3IgeW91cgorCSAgRXRoZXJuZXQgY2FyZCBhcyB3ZWxsIGFzIHRvICJMQVBCIERhdGEgTGluayBEcml2ZXIiLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBsYXBiZXRoZXIuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBYMjVfQVNZCisJdHJpc3RhdGUgIlguMjUgYXN5bmMgZHJpdmVyIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gV0FOICYmIExBUEIgJiYgWDI1CisJLS0taGVscC0tLQorCSAgU2VuZCBhbmQgcmVjZWl2ZSBYLjI1IGZyYW1lcyBvdmVyIHJlZ3VsYXIgYXN5bmNocm9ub3VzIHNlcmlhbAorCSAgbGluZXMgc3VjaCBhcyB0ZWxlcGhvbmUgbGluZXMgZXF1aXBwZWQgd2l0aCBvcmRpbmFyeSBtb2RlbXMuCisKKwkgIEV4cGVydHMgc2hvdWxkIG5vdGUgdGhhdCB0aGlzIGRyaXZlciBkb2Vzbid0IGN1cnJlbnRseSBjb21wbHkgd2l0aAorCSAgdGhlIGFzeW5jaHJvbm91cyBIRExTIGZyYW1pbmcgcHJvdG9jb2xzIGluIENDSVRUIHJlY29tbWVuZGF0aW9uIFguMjUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHgyNV9hc3kuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBTQk5JCisJdHJpc3RhdGUgIkdyYW5jaCBTQk5JMTIgTGVhc2VkIExpbmUgYWRhcHRlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gV0FOICYmIFg4NgorCS0tLWhlbHAtLS0KKwkgIERyaXZlciBmb3IgSVNBIFNCTkkxMi14eCBjYXJkcyB3aGljaCBhcmUgbG93IGNvc3QgYWx0ZXJuYXRpdmVzIHRvCisJICBsZWFzZWQgbGluZSBtb2RlbXMuCisKKwkgIFlvdSBjYW4gZmluZCBtb3JlIGluZm9ybWF0aW9uIGFuZCBsYXN0IHZlcnNpb25zIG9mIGRyaXZlcnMgYW5kCisJICB1dGlsaXRpZXMgYXQgPGh0dHA6Ly93d3cuZ3JhbmNoLnJ1Lz4uIElmIHlvdSBoYXZlIGFueSBxdWVzdGlvbiB5b3UKKwkgIGNhbiBzZW5kIGVtYWlsIHRvIDxzYm5pQGdyYW5jaC5ydT4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNibmkuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBTQk5JX01VTFRJTElORQorCWJvb2wgIk11bHRpcGxlIGxpbmUgZmVhdHVyZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gU0JOSQorCWhlbHAKKwkgIFNjaGVkdWxlIHRyYWZmaWMgZm9yIHNvbWUgcGFyYWxsZWwgbGluZXMsIHZpYSBTQk5JMTIgYWRhcHRlcnMuCisKKwkgIElmIHlvdSBoYXZlIHR3byBjb21wdXRlcnMgY29ubmVjdGVkIHdpdGggdHdvIHBhcmFsbGVsIGxpbmVzIGl0J3MKKwkgIHBvc3NpYmxlIHRvIGluY3JlYXNlIHRyYW5zZmVyIHJhdGUgbmVhcmx5IHR3aWNlLiBZb3Ugc2hvdWxkIGhhdmUKKwkgIGEgcHJvZ3JhbSBuYW1lZCAnc2JuaWNvbmZpZycgdG8gY29uZmlndXJlIGFkYXB0ZXJzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitlbmRtZW51CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dhbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTZjNTZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL01ha2VmaWxlCkBAIC0wLDAgKzEsODYgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBuZXR3b3JrICh3YW4pIGRldmljZSBkcml2ZXJzLgorIworIyAzIEF1ZyAyMDAwLCBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGluZnJhZGVhZC5vcmc+CisjIFJld3JpdHRlbiB0byB1c2UgbGlzdHMgaW5zdGVhZCBvZiBpZi1zdGF0ZW1lbnRzLgorIworCit3YW5waXBlLXkJCQk6PSBzZGxhbWFpbi5vIHNkbGFfZnQxLm8KK3dhbnBpcGUtJChDT05GSUdfV0FOUElQRV9YMjUpCSs9IHNkbGFfeDI1Lm8KK3dhbnBpcGUtJChDT05GSUdfV0FOUElQRV9GUikJKz0gc2RsYV9mci5vCit3YW5waXBlLSQoQ09ORklHX1dBTlBJUEVfQ0hETEMpCSs9IHNkbGFfY2hkbGMubword2FucGlwZS0kKENPTkZJR19XQU5QSVBFX1BQUCkJKz0gc2RsYV9wcHAubword2FucGlwZS0kKENPTkZJR19XQU5QSVBFX01VTFRQUFApICs9IHdhbnBpcGVfbXVsdHBwcC5vCit3YW5waXBlLW9ianMJCQk6PSAkKHdhbnBpcGUteSkKKworY3ljbG9teC15ICAgICAgICAgICAgICAgICAgICAgICA6PSBjeWN4X21haW4ubworY3ljbG9teC0kKENPTkZJR19DWUNMT01YX1gyNSkJKz0gY3ljeF94MjUubworY3ljbG9teC1vYmpzCQkJOj0gJChjeWNsb214LXkpICAKKworaGRsYy15CQkJCTo9IGhkbGNfZ2VuZXJpYy5vCitoZGxjLSQoQ09ORklHX0hETENfUkFXKQkJKz0gaGRsY19yYXcubworaGRsYy0kKENPTkZJR19IRExDX1JBV19FVEgpCSs9IGhkbGNfcmF3X2V0aC5vCitoZGxjLSQoQ09ORklHX0hETENfQ0lTQ08pCSs9IGhkbGNfY2lzY28ubworaGRsYy0kKENPTkZJR19IRExDX0ZSKQkJKz0gaGRsY19mci5vCitoZGxjLSQoQ09ORklHX0hETENfUFBQKQkJKz0gaGRsY19wcHAubworaGRsYy0kKENPTkZJR19IRExDX1gyNSkJCSs9IGhkbGNfeDI1Lm8KK2hkbGMtb2JqcwkJCTo9ICQoaGRsYy15KQorCitwYzMwMC15CQkJCTo9IHBjMzAwX2Rydi5vCitwYzMwMC0kKENPTkZJR19QQzMwMF9NTFBQUCkJKz0gcGMzMDBfdHR5Lm8KK3BjMzAwLW9ianMJCQk6PSAkKHBjMzAwLXkpCisKK29iai0kKENPTkZJR19IT1NURVNTX1NWMTEpCSs9IHo4NTIzMC5vCXN5bmNwcHAubwlob3N0ZXNzX3N2MTEubworb2JqLSQoQ09ORklHX1NFQUxFVkVMXzQwMjEpCSs9IHo4NTIzMC5vCXN5bmNwcHAubwlzZWFsZXZlbC5vCitvYmotJChDT05GSUdfQ09TQSkJCSs9CQlzeW5jcHBwLm8JY29zYS5vCitvYmotJChDT05GSUdfRkFSU1lOQykJCSs9CQlzeW5jcHBwLm8JZmFyc3luYy5vCitvYmotJChDT05GSUdfRFNDQzQpICAgICAgICAgICAgICs9CQkJCWRzY2M0Lm8KK29iai0kKENPTkZJR19MQU5NRURJQSkJCSs9CQlzeW5jcHBwLm8KK29iai0kKENPTkZJR19TWU5DTElOS19TWU5DUFBQKQkrPQkJc3luY3BwcC5vCitvYmotJChDT05GSUdfWDI1X0FTWSkJCSs9IHgyNV9hc3kubworCitvYmotJChDT05GSUdfTEFOTUVESUEpCQkrPSBsbWMvCisKK29iai0kKENPTkZJR19ETENJKQkJKz0gZGxjaS5vIAorb2JqLSQoQ09ORklHX1NETEEpCQkrPSBzZGxhLm8KK2lmZXEgKCQoQ09ORklHX1dBTlBJUEVfTVVMVFBQUCkseSkKKyAgb2JqLSQoQ09ORklHX1ZFTkRPUl9TQU5HT01BKSArPSBzZGxhZHJ2Lm8gd2FucGlwZS5vIHN5bmNwcHAubwkKK2Vsc2UKKyAgb2JqLSQoQ09ORklHX1ZFTkRPUl9TQU5HT01BKSArPSBzZGxhZHJ2Lm8gd2FucGlwZS5vCitlbmRpZgorb2JqLSQoQ09ORklHX0NZQ0xBREVTX1NZTkMpCSs9IGN5Y3hfZHJ2Lm8gY3ljbG9teC5vCitvYmotJChDT05GSUdfTEFQQkVUSEVSKQkJKz0gbGFwYmV0aGVyLm8KK29iai0kKENPTkZJR19TQk5JKQkJKz0gc2JuaS5vCitvYmotJChDT05GSUdfUEMzMDApCQkrPSBwYzMwMC5vCitvYmotJChDT05GSUdfSERMQykJCSs9IGhkbGMubworaWZlcSAoJChDT05GSUdfSERMQ19QUFApLHkpCisgIG9iai0kKENPTkZJR19IRExDKQkJKz0gc3luY3BwcC5vCitlbmRpZgorb2JqLSQoQ09ORklHX04yKQkJKz0gbjIubworb2JqLSQoQ09ORklHX0MxMDEpCQkrPSBjMTAxLm8KK29iai0kKENPTkZJR19XQU5YTCkJCSs9IHdhbnhsLm8KK29iai0kKENPTkZJR19QQ0kyMDBTWU4pCQkrPSBwY2kyMDBzeW4ubworCitjbGVhbi1maWxlcyA6PSB3YW54bGZ3LmluYworJChvYmopL3dhbnhsLm86CSQob2JqKS93YW54bGZ3LmluYworCitpZmVxICgkKENPTkZJR19XQU5YTF9CVUlMRF9GSVJNV0FSRSkseSkKK2lmZXEgKCQoQVJDSCksbTY4aykKKyAgQVM2OEsgPSAkKEFTKQorICBMRDY4SyA9ICQoTEQpCitlbHNlCisgIEFTNjhLID0gYXM2OGsKKyAgTEQ2OEsgPSBsZDY4aworZW5kaWYKKworcXVpZXRfY21kX2J1aWxkX3dhbnhsZncgPSBCTEQgRlcgICRACisgICAgICBjbWRfYnVpbGRfd2FueGxmdyA9IFwKKwkkKENQUCkgLVdwLC1NRCwkKGRlcGZpbGUpIC1JJChzcmN0cmVlKS9pbmNsdWRlICQ8IHwgJChBUzY4SykgLW02ODM2MCAtbyAkKG9iaikvd2FueGxmdy5vOyBcCisJJChMRDY4SykgLS1vZm9ybWF0IGJpbmFyeSAtVHRleHQgMHgxMDAwICQob2JqKS93YW54bGZ3Lm8gLW8gJChvYmopL3dhbnhsZncuYmluOyBcCisJaGV4ZHVtcCAtdmUgJyJcbiIgMTYvMSAiMHglMDJYLCInICQob2JqKS93YW54bGZ3LmJpbiB8IHNlZCAncy8weCAgLC8vZzsxcy9eL3N0YXRpYyB1OCBmaXJtd2FyZVtdPXsvOyQkcy8sJCQvXG59O1xuLycgPiQob2JqKS93YW54bGZ3LmluYzsgXAorCXJtIC1mICQob2JqKS93YW54bGZ3LmJpbiAkKG9iaikvd2FueGxmdy5vCisKKyQob2JqKS93YW54bGZ3LmluYzoJJChzcmMpL3dhbnhsZncuUworCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxidWlsZF93YW54bGZ3KQordGFyZ2V0cyArPSB3YW54bGZ3LmluYworZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9jMTAxLmMgYi9kcml2ZXJzL25ldC93YW4vYzEwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZDg1NGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vYzEwMS5jCkBAIC0wLDAgKzEsNDQ2IEBACisvKgorICogTW94YSBDMTAxIHN5bmNocm9ub3VzIHNlcmlhbCBjYXJkIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMyBLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogRm9yIGluZm9ybWF0aW9uIHNlZSBodHRwOi8vaHEucG0ud2F3LnBsL2hkbGMvCisgKgorICogU291cmNlcyBvZiBpbmZvcm1hdGlvbjoKKyAqICAgIEhpdGFjaGkgSEQ2NDU3MCBTQ0EgVXNlcidzIE1hbnVhbAorICogICAgTW94YSBDMTAxIFVzZXIncyBNYW51YWwKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgImhkNjQ1NzAuaCIKKworCitzdGF0aWMgY29uc3QgY2hhciogdmVyc2lvbiA9ICJNb3hhIEMxMDEgZHJpdmVyIHZlcnNpb246IDEuMTUiOworc3RhdGljIGNvbnN0IGNoYXIqIGRldm5hbWUgPSAiQzEwMSI7CisKKyN1bmRlZiBERUJVR19QS1QKKyNkZWZpbmUgREVCVUdfUklOR1MKKworI2RlZmluZSBDMTAxX1BBR0UgMHgxRDAwCisjZGVmaW5lIEMxMDFfRFRSIDB4MUUwMAorI2RlZmluZSBDMTAxX1NDQSAweDFGMDAKKyNkZWZpbmUgQzEwMV9XSU5ET1dfU0laRSAweDIwMDAKKyNkZWZpbmUgQzEwMV9NQVBQRURfUkFNX1NJWkUgMHg0MDAwCisKKyNkZWZpbmUgUkFNX1NJWkUgKDI1NiAqIDEwMjQpCisjZGVmaW5lIFRYX1JJTkdfQlVGRkVSUyAxMAorI2RlZmluZSBSWF9SSU5HX0JVRkZFUlMgKChSQU1fU0laRSAtIEMxMDFfV0lORE9XX1NJWkUpIC8JCVwKKwkJCSAoc2l6ZW9mKHBrdF9kZXNjKSArIEhETENfTUFYX01SVSkgLSBUWF9SSU5HX0JVRkZFUlMpCisKKyNkZWZpbmUgQ0xPQ0tfQkFTRSA5ODMwNDAwCS8qIDkuODMwNCBNSHogKi8KKyNkZWZpbmUgUEFHRTBfQUxXQVlTX01BUFBFRAorCitzdGF0aWMgY2hhciAqaHc7CQkvKiBwb2ludGVyIHRvIGh3PXh4eCBjb21tYW5kIGxpbmUgc3RyaW5nICovCisKKwordHlwZWRlZiBzdHJ1Y3QgY2FyZF9zIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXNwaW5sb2NrX3QgbG9jazsJLyogVFggbG9jayAqLworCXU4IF9faW9tZW0gKndpbjBiYXNlOwkvKiBJU0Egd2luZG93IGJhc2UgYWRkcmVzcyAqLworCXUzMiBwaHlfd2luYmFzZTsJLyogSVNBIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyAqLworCXN5bmNfc2VyaWFsX3NldHRpbmdzIHNldHRpbmdzOworCWludCByeHBhcnQ7CQkvKiBwYXJ0aWFsIGZyYW1lIHJlY2VpdmVkLCBuZXh0IGZyYW1lIGludmFsaWQqLworCXVuc2lnbmVkIHNob3J0IGVuY29kaW5nOworCXVuc2lnbmVkIHNob3J0IHBhcml0eTsKKwl1MTYgcnhfcmluZ19idWZmZXJzOwkvKiBudW1iZXIgb2YgYnVmZmVycyBpbiBhIHJpbmcgKi8KKwl1MTYgdHhfcmluZ19idWZmZXJzOworCXUxNiBidWZmX29mZnNldDsJLyogb2Zmc2V0IG9mIGZpcnN0IGJ1ZmZlciBvZiBmaXJzdCBjaGFubmVsICovCisJdTE2IHJ4aW47CQkvKiByeCByaW5nIGJ1ZmZlciAnaW4nIHBvaW50ZXIgKi8KKwl1MTYgdHhpbjsJCS8qIHR4IHJpbmcgYnVmZmVyICdpbicgYW5kICdsYXN0JyBwb2ludGVycyAqLworCXUxNiB0eGxhc3Q7CisJdTggcnhzLCB0eHMsIHRtYzsJLyogU0NBIHJlZ2lzdGVycyAqLworCXU4IGlycTsJCQkvKiBJUlEgKDMtMTUpICovCisJdTggcGFnZTsKKworCXN0cnVjdCBjYXJkX3MgKm5leHRfY2FyZDsKK31jYXJkX3Q7CisKK3R5cGVkZWYgY2FyZF90IHBvcnRfdDsKKworc3RhdGljIGNhcmRfdCAqZmlyc3RfY2FyZDsKK3N0YXRpYyBjYXJkX3QgKipuZXdfY2FyZCA9ICZmaXJzdF9jYXJkOworCisKKyNkZWZpbmUgc2NhX2luKHJlZywgY2FyZCkJICAgcmVhZGIoKGNhcmQpLT53aW4wYmFzZSArIEMxMDFfU0NBICsgKHJlZykpCisjZGVmaW5lIHNjYV9vdXQodmFsdWUsIHJlZywgY2FyZCkgIHdyaXRlYih2YWx1ZSwgKGNhcmQpLT53aW4wYmFzZSArIEMxMDFfU0NBICsgKHJlZykpCisjZGVmaW5lIHNjYV9pbncocmVnLCBjYXJkKQkgICByZWFkdygoY2FyZCktPndpbjBiYXNlICsgQzEwMV9TQ0EgKyAocmVnKSkKKworLyogRURBIGFkZHJlc3MgcmVnaXN0ZXIgbXVzdCBiZSBzZXQgaW4gRURBTCwgRURBSCBvcmRlciAtIDggYml0IElTQSBidXMgKi8KKyNkZWZpbmUgc2NhX291dHcodmFsdWUsIHJlZywgY2FyZCkgZG8geyBcCisJd3JpdGViKHZhbHVlICYgMHhGRiwgKGNhcmQpLT53aW4wYmFzZSArIEMxMDFfU0NBICsgKHJlZykpOyBcCisJd3JpdGViKCh2YWx1ZSA+PiA4ICkgJiAweEZGLCAoY2FyZCktPndpbjBiYXNlICsgQzEwMV9TQ0EgKyAocmVnKzEpKTtcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgcG9ydF90b19jYXJkKHBvcnQpCSAgIChwb3J0KQorI2RlZmluZSBsb2dfbm9kZShwb3J0KQkJICAgKDApCisjZGVmaW5lIHBoeV9ub2RlKHBvcnQpCQkgICAoMCkKKyNkZWZpbmUgd2luc2l6ZShjYXJkKQkJICAgKEMxMDFfV0lORE9XX1NJWkUpCisjZGVmaW5lIHdpbjBiYXNlKGNhcmQpCQkgICAoKGNhcmQpLT53aW4wYmFzZSkKKyNkZWZpbmUgd2luYmFzZShjYXJkKSAgICAgIAkgICAoKGNhcmQpLT53aW4wYmFzZSArIDB4MjAwMCkKKyNkZWZpbmUgZ2V0X3BvcnQoY2FyZCwgcG9ydCkJICAgKGNhcmQpCitzdGF0aWMgdm9pZCBzY2FfbXNjaV9pbnRyKHBvcnRfdCAqcG9ydCk7CisKKworc3RhdGljIGlubGluZSB1OCBzY2FfZ2V0X3BhZ2UoY2FyZF90ICpjYXJkKQoreworCXJldHVybiBjYXJkLT5wYWdlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb3BlbndpbihjYXJkX3QgKmNhcmQsIHU4IHBhZ2UpCit7CisJY2FyZC0+cGFnZSA9IHBhZ2U7CisJd3JpdGViKHBhZ2UsIGNhcmQtPndpbjBiYXNlICsgQzEwMV9QQUdFKTsKK30KKworCisjaW5jbHVkZSAiaGQ2NDU3eC5jIgorCisKK3N0YXRpYyB2b2lkIHNjYV9tc2NpX2ludHIocG9ydF90ICpwb3J0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwb3J0X3RvX2Rldihwb3J0KTsKKwljYXJkX3QqIGNhcmQgPSBwb3J0X3RvX2NhcmQocG9ydCk7CisJdTggc3RhdCA9IHNjYV9pbihNU0NJMV9PRkZTRVQgKyBTVDEsIGNhcmQpOyAvKiByZWFkIE1TQ0kgU1QxIHN0YXR1cyAqLworCisJLyogUmVzZXQgTVNDSSBUWCB1bmRlcnJ1biBzdGF0dXMgYml0ICovCisJc2NhX291dChzdGF0ICYgU1QxX1VEUk4sIE1TQ0kwX09GRlNFVCArIFNUMSwgY2FyZCk7CisKKwlpZiAoc3RhdCAmIFNUMV9VRFJOKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwkJc3RhdHMtPnR4X2Vycm9ycysrOyAvKiBUWCBVbmRlcnJ1biBlcnJvciBkZXRlY3RlZCAqLworCQlzdGF0cy0+dHhfZmlmb19lcnJvcnMrKzsKKwl9CisKKwkvKiBSZXNldCBNU0NJIENEQ0Qgc3RhdHVzIGJpdCAtIHVzZXMgY2gjMiBEQ0QgaW5wdXQgKi8KKwlzY2Ffb3V0KHN0YXQgJiBTVDFfQ0RDRCwgTVNDSTFfT0ZGU0VUICsgU1QxLCBjYXJkKTsKKworCWlmIChzdGF0ICYgU1QxX0NEQ0QpCisJCWhkbGNfc2V0X2NhcnJpZXIoIShzY2FfaW4oTVNDSTFfT0ZGU0VUICsgU1QzLCBjYXJkKSAmIFNUM19EQ0QpLAorCQkJCSBkZXYpOworfQorCisKK3N0YXRpYyB2b2lkIGMxMDFfc2V0X2lmYWNlKHBvcnRfdCAqcG9ydCkKK3sKKwl1OCByeHMgPSBwb3J0LT5yeHMgJiBDTEtfQlJHX01BU0s7CisJdTggdHhzID0gcG9ydC0+dHhzICYgQ0xLX0JSR19NQVNLOworCisJc3dpdGNoKHBvcnQtPnNldHRpbmdzLmNsb2NrX3R5cGUpIHsKKwljYXNlIENMT0NLX0lOVDoKKwkJcnhzIHw9IENMS19CUkdfUlg7IC8qIFRYIGNsb2NrICovCisJCXR4cyB8PSBDTEtfUlhDTEtfVFg7IC8qIEJSRyBvdXRwdXQgKi8KKwkJYnJlYWs7CisKKwljYXNlIENMT0NLX1RYSU5UOgorCQlyeHMgfD0gQ0xLX0xJTkVfUlg7IC8qIFJYQyBpbnB1dCAqLworCQl0eHMgfD0gQ0xLX0JSR19UWDsgLyogQlJHIG91dHB1dCAqLworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfVFhGUk9NUlg6CisJCXJ4cyB8PSBDTEtfTElORV9SWDsgLyogUlhDIGlucHV0ICovCisJCXR4cyB8PSBDTEtfUlhDTEtfVFg7IC8qIFJYIGNsb2NrICovCisJCWJyZWFrOworCisJZGVmYXVsdDoJLyogRVhUZXJuYWwgY2xvY2sgKi8KKwkJcnhzIHw9IENMS19MSU5FX1JYOyAvKiBSWEMgaW5wdXQgKi8KKwkJdHhzIHw9IENMS19MSU5FX1RYOyAvKiBUWEMgaW5wdXQgKi8KKwl9CisKKwlwb3J0LT5yeHMgPSByeHM7CisJcG9ydC0+dHhzID0gdHhzOworCXNjYV9vdXQocnhzLCBNU0NJMV9PRkZTRVQgKyBSWFMsIHBvcnQpOworCXNjYV9vdXQodHhzLCBNU0NJMV9PRkZTRVQgKyBUWFMsIHBvcnQpOworCXNjYV9zZXRfcG9ydChwb3J0KTsKK30KKworCitzdGF0aWMgaW50IGMxMDFfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBvcnRfdCAqcG9ydCA9IGRldl90b19wb3J0KGRldik7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGhkbGNfb3BlbihkZXYpOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwl3cml0ZWIoMSwgcG9ydC0+d2luMGJhc2UgKyBDMTAxX0RUUik7CisJc2NhX291dCgwLCBNU0NJMV9PRkZTRVQgKyBDVEwsIHBvcnQpOyAvKiBSVFMgdXNlcyBjaCMyIG91dHB1dCAqLworCXNjYV9vcGVuKGRldik7CisJLyogRENEIGlzIGNvbm5lY3RlZCB0byBwb3J0IDIgIUAjJCVeJiAtIGRpc2FibGUgTVNDSTAgQ0RDRCBpbnRlcnJ1cHQgKi8KKwlzY2Ffb3V0KElFMV9VRFJOLCBNU0NJMF9PRkZTRVQgKyBJRTEsIHBvcnQpOworCXNjYV9vdXQoSUUwX1RYSU5ULCBNU0NJMF9PRkZTRVQgKyBJRTAsIHBvcnQpOworCisJaGRsY19zZXRfY2FycmllcighKHNjYV9pbihNU0NJMV9PRkZTRVQgKyBTVDMsIHBvcnQpICYgU1QzX0RDRCksIGRldik7CisJcHJpbnRrKEtFUk5fREVCVUcgIjB4JVhcbiIsIHNjYV9pbihNU0NJMV9PRkZTRVQgKyBTVDMsIHBvcnQpKTsKKworCS8qIGVuYWJsZSBNU0NJMSBDRENEIGludGVycnVwdCAqLworCXNjYV9vdXQoSUUxX0NEQ0QsIE1TQ0kxX09GRlNFVCArIElFMSwgcG9ydCk7CisJc2NhX291dChJRTBfUlhJTlRBLCBNU0NJMV9PRkZTRVQgKyBJRTAsIHBvcnQpOworCXNjYV9vdXQoMHg0OCwgSUVSMCwgcG9ydCk7IC8qIFRYSU5UICMwIGFuZCBSWElOVCAjMSAqLworCWMxMDFfc2V0X2lmYWNlKHBvcnQpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYzEwMV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBvcnRfdCAqcG9ydCA9IGRldl90b19wb3J0KGRldik7CisKKwlzY2FfY2xvc2UoZGV2KTsKKwl3cml0ZWIoMCwgcG9ydC0+d2luMGJhc2UgKyBDMTAxX0RUUik7CisJc2NhX291dChDVExfTk9SVFMsIE1TQ0kxX09GRlNFVCArIENUTCwgcG9ydCk7CisJaGRsY19jbG9zZShkZXYpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYzEwMV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihzeW5jX3NlcmlhbF9zZXR0aW5ncyk7CisJc3luY19zZXJpYWxfc2V0dGluZ3MgbmV3X2xpbmU7CisJc3luY19zZXJpYWxfc2V0dGluZ3MgX191c2VyICpsaW5lID0gaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3Uuc3luYzsKKwlwb3J0X3QgKnBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCisjaWZkZWYgREVCVUdfUklOR1MKKwlpZiAoY21kID09IFNJT0NERVZQUklWQVRFKSB7CisJCXNjYV9kdW1wX3JpbmdzKGRldik7CisJCXByaW50ayhLRVJOX0RFQlVHICJNU0NJMTogU1Q6ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCSAgICAgICBzY2FfaW4oTVNDSTFfT0ZGU0VUICsgU1QwLCBwb3J0KSwKKwkJICAgICAgIHNjYV9pbihNU0NJMV9PRkZTRVQgKyBTVDEsIHBvcnQpLAorCQkgICAgICAgc2NhX2luKE1TQ0kxX09GRlNFVCArIFNUMiwgcG9ydCksCisJCSAgICAgICBzY2FfaW4oTVNDSTFfT0ZGU0VUICsgU1QzLCBwb3J0KSk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCWlmIChjbWQgIT0gU0lPQ1dBTkRFVikKKwkJcmV0dXJuIGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisKKwlzd2l0Y2goaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCWNhc2UgSUZfR0VUX0lGQUNFOgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfU1lOQ19TRVJJQUw7CisJCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplIDwgc2l6ZSkgeworCQkJaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA9IHNpemU7IC8qIGRhdGEgc2l6ZSB3YW50ZWQgKi8KKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGxpbmUsICZwb3J0LT5zZXR0aW5ncywgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIElGX0lGQUNFX1NZTkNfU0VSSUFMOgorCQlpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfbGluZSwgbGluZSwgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAobmV3X2xpbmUuY2xvY2tfdHlwZSAhPSBDTE9DS19FWFQgJiYKKwkJICAgIG5ld19saW5lLmNsb2NrX3R5cGUgIT0gQ0xPQ0tfVFhGUk9NUlggJiYKKwkJICAgIG5ld19saW5lLmNsb2NrX3R5cGUgIT0gQ0xPQ0tfSU5UICYmCisJCSAgICBuZXdfbGluZS5jbG9ja190eXBlICE9IENMT0NLX1RYSU5UKQorCQlyZXR1cm4gLUVJTlZBTDsJLyogTm8gc3VjaCBjbG9jayBzZXR0aW5nICovCisKKwkJaWYgKG5ld19saW5lLmxvb3BiYWNrICE9IDAgJiYgbmV3X2xpbmUubG9vcGJhY2sgIT0gMSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCW1lbWNweSgmcG9ydC0+c2V0dGluZ3MsICZuZXdfbGluZSwgc2l6ZSk7IC8qIFVwZGF0ZSBzZXR0aW5ncyAqLworCQljMTAxX3NldF9pZmFjZShwb3J0KTsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKwl9Cit9CisKKworCitzdGF0aWMgdm9pZCBjMTAxX2Rlc3Ryb3lfY2FyZChjYXJkX3QgKmNhcmQpCit7CisJcmVhZGIoY2FyZC0+d2luMGJhc2UgKyBDMTAxX1BBR0UpOyAvKiBSZXNldHMgU0NBPyAqLworCisJaWYgKGNhcmQtPmlycSkKKwkJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKKworCWlmIChjYXJkLT53aW4wYmFzZSkgeworCQlpb3VubWFwKGNhcmQtPndpbjBiYXNlKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGNhcmQtPnBoeV93aW5iYXNlLCBDMTAxX01BUFBFRF9SQU1fU0laRSk7CisJfQorCisJZnJlZV9uZXRkZXYoY2FyZC0+ZGV2KTsKKworCWtmcmVlKGNhcmQpOworfQorCisKKworc3RhdGljIGludCBfX2luaXQgYzEwMV9ydW4odW5zaWduZWQgbG9uZyBpcnEsIHVuc2lnbmVkIGxvbmcgd2luYmFzZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWhkbGNfZGV2aWNlICpoZGxjOworCWNhcmRfdCAqY2FyZDsKKwlpbnQgcmVzdWx0OworCisJaWYgKGlycTwzIHx8IGlycT4xNSB8fCBpcnEgPT0gNikgLyogRklYTUUgKi8geworCQlwcmludGsoS0VSTl9FUlIgImMxMDE6IGludmFsaWQgSVJRIHZhbHVlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHdpbmJhc2UgPCAweEMwMDAwIHx8IHdpbmJhc2UgPiAweERGRkZGIHx8ICh3aW5iYXNlICYgMHgzRkZGKSAhPTApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjMTAxOiBpbnZhbGlkIFJBTSB2YWx1ZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWNhcmQgPSBrbWFsbG9jKHNpemVvZihjYXJkX3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2FyZCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYzEwMTogdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisJbWVtc2V0KGNhcmQsIDAsIHNpemVvZihjYXJkX3QpKTsKKworCWNhcmQtPmRldiA9IGFsbG9jX2hkbGNkZXYoY2FyZCk7CisJaWYgKCFjYXJkLT5kZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjMTAxOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJa2ZyZWUoY2FyZCk7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBzY2FfaW50ciwgMCwgZGV2bmFtZSwgY2FyZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjMTAxOiBjb3VsZCBub3QgYWxsb2NhdGUgSVJRXG4iKTsKKwkJYzEwMV9kZXN0cm95X2NhcmQoY2FyZCk7CisJCXJldHVybigtRUJVU1kpOworCX0KKwljYXJkLT5pcnEgPSBpcnE7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbih3aW5iYXNlLCBDMTAxX01BUFBFRF9SQU1fU0laRSwgZGV2bmFtZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjMTAxOiBjb3VsZCBub3QgcmVxdWVzdCBSQU0gd2luZG93XG4iKTsKKwkJYzEwMV9kZXN0cm95X2NhcmQoY2FyZCk7CisJCXJldHVybigtRUJVU1kpOworCX0KKwljYXJkLT5waHlfd2luYmFzZSA9IHdpbmJhc2U7CisJY2FyZC0+d2luMGJhc2UgPSBpb3JlbWFwKHdpbmJhc2UsIEMxMDFfTUFQUEVEX1JBTV9TSVpFKTsKKwlpZiAoIWNhcmQtPndpbjBiYXNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYzEwMTogY291bGQgbm90IG1hcCBJL08gYWRkcmVzc1xuIik7CisJCWMxMDFfZGVzdHJveV9jYXJkKGNhcmQpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWNhcmQtPnR4X3JpbmdfYnVmZmVycyA9IFRYX1JJTkdfQlVGRkVSUzsKKwljYXJkLT5yeF9yaW5nX2J1ZmZlcnMgPSBSWF9SSU5HX0JVRkZFUlM7CisJY2FyZC0+YnVmZl9vZmZzZXQgPSBDMTAxX1dJTkRPV19TSVpFOyAvKiBCeXRlcyAxRDAwLTFGRkYgcmVzZXJ2ZWQgKi8KKworCXJlYWRiKGNhcmQtPndpbjBiYXNlICsgQzEwMV9QQUdFKTsgLyogUmVzZXRzIFNDQT8gKi8KKwl1ZGVsYXkoMTAwKTsKKwl3cml0ZWIoMCwgY2FyZC0+d2luMGJhc2UgKyBDMTAxX1BBR0UpOworCXdyaXRlYigwLCBjYXJkLT53aW4wYmFzZSArIEMxMDFfRFRSKTsgLyogUG93ZXItdXAgZm9yIFJBTT8gKi8KKworCXNjYV9pbml0KGNhcmQsIDApOworCisJZGV2ID0gcG9ydF90b19kZXYoY2FyZCk7CisJaGRsYyA9IGRldl90b19oZGxjKGRldik7CisKKwlzcGluX2xvY2tfaW5pdCgmY2FyZC0+bG9jayk7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWRldi0+aXJxID0gaXJxOworCWRldi0+bWVtX3N0YXJ0ID0gd2luYmFzZTsKKwlkZXYtPm1lbV9lbmQgPSB3aW5iYXNlICsgQzEwMV9NQVBQRURfUkFNX1NJWkUgLSAxOworCWRldi0+dHhfcXVldWVfbGVuID0gNTA7CisJZGV2LT5kb19pb2N0bCA9IGMxMDFfaW9jdGw7CisJZGV2LT5vcGVuID0gYzEwMV9vcGVuOworCWRldi0+c3RvcCA9IGMxMDFfY2xvc2U7CisJaGRsYy0+YXR0YWNoID0gc2NhX2F0dGFjaDsKKwloZGxjLT54bWl0ID0gc2NhX3htaXQ7CisJY2FyZC0+c2V0dGluZ3MuY2xvY2tfdHlwZSA9IENMT0NLX0VYVDsKKworCXJlc3VsdCA9IHJlZ2lzdGVyX2hkbGNfZGV2aWNlKGRldik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJjMTAxOiB1bmFibGUgdG8gcmVnaXN0ZXIgaGRsYyBkZXZpY2VcbiIpOworCQljMTAxX2Rlc3Ryb3lfY2FyZChjYXJkKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlzY2FfaW5pdF9zeW5jX3BvcnQoY2FyZCk7IC8qIFNldCB1cCBDMTAxIG1lbW9yeSAqLworCWhkbGNfc2V0X2NhcnJpZXIoIShzY2FfaW4oTVNDSTFfT0ZGU0VUICsgU1QzLCBjYXJkKSAmIFNUM19EQ0QpLCBkZXYpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1veGEgQzEwMSBvbiBJUlEldSwiCisJICAgICAgICIgdXNpbmcgJXUgVFggKyAldSBSWCBwYWNrZXRzIHJpbmdzXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGNhcmQtPmlycSwKKwkgICAgICAgY2FyZC0+dHhfcmluZ19idWZmZXJzLCBjYXJkLT5yeF9yaW5nX2J1ZmZlcnMpOworCisJKm5ld19jYXJkID0gY2FyZDsKKwluZXdfY2FyZCA9ICZjYXJkLT5uZXh0X2NhcmQ7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IF9faW5pdCBjMTAxX2luaXQodm9pZCkKK3sKKwlpZiAoaHcgPT0gTlVMTCkgeworI2lmZGVmIE1PRFVMRQorCQlwcmludGsoS0VSTl9JTkZPICJjMTAxOiBubyBjYXJkIGluaXRpYWxpemVkXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gLUVOT1NZUzsJLyogbm8gcGFyYW1ldGVycyBzcGVjaWZpZWQsIGFib3J0ICovCisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIHZlcnNpb24pOworCisJZG8geworCQl1bnNpZ25lZCBsb25nIGlycSwgcmFtOworCisJCWlycSA9IHNpbXBsZV9zdHJ0b3VsKGh3LCAmaHcsIDApOworCisJCWlmICgqaHcrKyAhPSAnLCcpCisJCQlicmVhazsKKwkJcmFtID0gc2ltcGxlX3N0cnRvdWwoaHcsICZodywgMCk7CisKKwkJaWYgKCpodyA9PSAnOicgfHwgKmh3ID09ICdceDAnKQorCQkJYzEwMV9ydW4oaXJxLCByYW0pOworCisJCWlmICgqaHcgPT0gJ1x4MCcpCisJCQlyZXR1cm4gZmlyc3RfY2FyZCA/IDAgOiAtRU5PU1lTOworCX13aGlsZSgqaHcrKyA9PSAnOicpOworCisJcHJpbnRrKEtFUk5fRVJSICJjMTAxOiBpbnZhbGlkIGhhcmR3YXJlIHBhcmFtZXRlcnNcbiIpOworCXJldHVybiBmaXJzdF9jYXJkID8gMCA6IC1FTk9TWVM7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IGMxMDFfY2xlYW51cCh2b2lkKQoreworCWNhcmRfdCAqY2FyZCA9IGZpcnN0X2NhcmQ7CisKKwl3aGlsZSAoY2FyZCkgeworCQljYXJkX3QgKnB0ciA9IGNhcmQ7CisJCWNhcmQgPSBjYXJkLT5uZXh0X2NhcmQ7CisJCXVucmVnaXN0ZXJfaGRsY19kZXZpY2UocG9ydF90b19kZXYocHRyKSk7CisJCWMxMDFfZGVzdHJveV9jYXJkKHB0cik7CisJfQorfQorCisKK21vZHVsZV9pbml0KGMxMDFfaW5pdCk7Cittb2R1bGVfZXhpdChjMTAxX2NsZWFudXApOworCitNT0RVTEVfQVVUSE9SKCJLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNb3hhIEMxMDEgc2VyaWFsIHBvcnQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cittb2R1bGVfcGFyYW0oaHcsIGNoYXJwLCAwNDQ0KTsJLyogaHc9aXJxLHJhbTppcnEsLi4uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vY29zYS5jIGIvZHJpdmVycy9uZXQvd2FuL2Nvc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjFhNTczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2Nvc2EuYwpAQCAtMCwwICsxLDIxMDAgQEAKKy8qICRJZDogY29zYS5jLHYgMS4zMSAyMDAwLzAzLzA4IDE3OjQ3OjE2IGthcyBFeHAgJCAqLworCisvKgorICogIENvcHlyaWdodCAoQykgMTk5NS0xOTk3ICBKYW4gIlllbnlhIiBLYXNwcnphayA8a2FzQGZpLm11bmkuY3o+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogVGhlIGRyaXZlciBmb3IgdGhlIFNSUCBhbmQgQ09TQSBzeW5jaHJvbm91cyBzZXJpYWwgY2FyZHMuCisgKgorICogSEFSRFdBUkUgSU5GTworICoKKyAqIEJvdGggY2FyZHMgYXJlIGRldmVsb3BlZCBhdCB0aGUgSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UsCisgKiBNYXNhcnlrIFVuaXZlcnNpdHkgKGh0dHA6Ly93d3cuaWNzLm11bmkuY3ovKS4gVGhlIGhhcmR3YXJlIGlzCisgKiBkZXZlbG9wZWQgYnkgSmlyaSBOb3ZvdG55IDxub3ZvdG55QGljcy5tdW5pLmN6Pi4gTW9yZSBpbmZvcm1hdGlvbgorICogYW5kIHRoZSBwaG90byBvZiBib3RoIGNhcmRzIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5wYXZvdWNlay5jei9jb3NhLmh0bWwuIFRoZSBjYXJkIGRvY3VtZW50YXRpb24sIGZpcm13YXJlcworICogYW5kIG90aGVyIGdvb2RzIGNhbiBiZSBkb3dubG9hZGVkIGZyb20gZnRwOi8vZnRwLmljcy5tdW5pLmN6L3B1Yi9jb3NhLy4KKyAqIEZvciBMaW51eC1zcGVjaWZpYyB1dGlsaXRpZXMsIHNlZSBiZWxvdyBpbiB0aGUgIlNvZnR3YXJlIGluZm8iIHNlY3Rpb24uCisgKiBJZiB5b3Ugd2FudCB0byBvcmRlciB0aGUgY2FyZCwgY29udGFjdCBKaXJpIE5vdm90bnkuCisgKgorICogVGhlIFNSUCAoc2VyaWFsIHBvcnQ/LCB0aGUgQ3plY2ggd29yZCAic3JwIiBtZWFucyAic2lja2xlIikgY2FyZAorICogaXMgYSAyLXBvcnQgaW50ZWxsaWdlbnQgKHdpdGggaXRzIG93biA4LWJpdCBDUFUpIHN5bmNocm9ub3VzIHNlcmlhbCBjYXJkCisgKiB3aXRoIFYuMjQgaW50ZXJmYWNlcyB1cCB0byA4MGtiL3MgZWFjaC4KKyAqCisgKiBUaGUgQ09TQSAoY29tbXVuaWNhdGlvbiBzZXJpYWwgYWRhcHRlcj8sIHRoZSBDemVjaCB3b3JkICJrb3NhIiBtZWFucworICogInNjeXRoZSIpIGlzIGEgbmV4dC1nZW5lcmF0aW9uIHN5bmMvYXN5bmMgYm9hcmQgd2l0aCB0d28gaW50ZXJmYWNlcworICogLSBjdXJyZW50bHkgYW55IG9mIFYuMjQsIFguMjEsIFYuMzUgYW5kIFYuMzYgY2FuIGJlIHNlbGVjdGVkLgorICogSXQgaGFzIGEgMTYtYml0IFNBQjgwMTY2IENQVSBhbmQgY2FuIGRvIHVwIHRvIDEwIE1iL3MgcGVyIGNoYW5uZWwuCisgKiBUaGUgOC1jaGFubmVscyB2ZXJzaW9uIGlzIGluIGRldmVsb3BtZW50LgorICoKKyAqIEJvdGggdHlwZXMgaGF2ZSBkb3dubG9hZGFibGUgZmlybXdhcmUgYW5kIGNvbW11bmljYXRlIHZpYSBJU0EgRE1BLgorICogQ09TQSBjYW4gYmUgYWxzbyBhIGJ1cy1tYXN0ZXJpbmcgZGV2aWNlLgorICoKKyAqIFNPRlRXQVJFIElORk8KKyAqCisgKiBUaGUgaG9tZXBhZ2Ugb2YgdGhlIExpbnV4IGRyaXZlciBpcyBhdCBodHRwOi8vd3d3LmZpLm11bmkuY3ovfmthcy9jb3NhLy4KKyAqIFRoZSBDVlMgdHJlZSBvZiBMaW51eCBkcml2ZXIgY2FuIGJlIHZpZXdlZCB0aGVyZSwgYXMgd2VsbCBhcyB0aGUKKyAqIGZpcm13YXJlIGJpbmFyaWVzIGFuZCB1c2VyLXNwYWNlIHV0aWxpdGllcyBmb3IgZG93bmxvYWRpbmcgdGhlIGZpcm13YXJlCisgKiBpbnRvIHRoZSBjYXJkIGFuZCBzZXR0aW5nIHVwIHRoZSBjYXJkLgorICoKKyAqIFRoZSBMaW51eCBkcml2ZXIgKHVubGlrZSB0aGUgcHJlc2VudCAqQlNEIGRyaXZlcnMgOi0pIGNhbiB3b3JrIGV2ZW4KKyAqIGZvciB0aGUgQ09TQSBhbmQgU1JQIGluIG9uZSBjb21wdXRlciBhbmQgYWxsb3dzIGVhY2ggY2hhbm5lbCB0byB3b3JrCisgKiBpbiBvbmUgb2YgdGhlIHRocmVlIG1vZGVzIChjaGFyYWN0ZXIgZGV2aWNlLCBDaXNjbyBIRExDLCBTeW5jIFBQUCkuCisgKgorICogQVVUSE9SCisgKgorICogVGhlIExpbnV4IGRyaXZlciB3YXMgd3JpdHRlbiBieSBKYW4gIlllbnlhIiBLYXNwcnphayA8a2FzQGZpLm11bmkuY3o+LgorICoKKyAqIFlvdSBjYW4gbWFpbCBtZSBidWdmaXhlcyBhbmQgZXZlbiBzdWNjZXNzIHJlcG9ydHMuIEkgYW0gZXNwZWNpYWxseQorICogaW50ZXJlc3RlZCBpbiB0aGUgU01QIGFuZC9vciBtdWxpdGktY2hhbm5lbCBzdWNjZXNzL2ZhaWx1cmUgcmVwb3J0cworICogKEkgd29uZGVyIGlmIEkgZGlkIHRoZSBsb2NraW5nIHByb3Blcmx5IDotKS4KKyAqCisgKiBUSEUgQVVUSE9SIFVTRUQgVEhFIEZPTExPV0lORyBTT1VSQ0VTIFdIRU4gUFJPR1JBTU1JTkcgVEhFIERSSVZFUgorICoKKyAqIFRoZSBDT1NBL1NSUCBOZXRCU0QgZHJpdmVyIGJ5IFpkZW5layBTYWx2ZXQgYW5kIEl2b3MgQ2Vybm9obGF2ZWsKKyAqIFRoZSBza2VsZXRvbi5jIGJ5IERvbmFsZCBCZWNrZXIKKyAqIFRoZSBTREwgUmlzY29tL04yIGRyaXZlciBieSBNaWtlIE5hdGFsZQorICogVGhlIENvbXRyb2wgSG9zdGVzcyBTVjExIGRyaXZlciBieSBBbGFuIENveAorICogVGhlIFN5bmMgUFBQL0Npc2NvIEhETEMgbGF5ZXIgKHN5bmNwcHAuYykgcG9ydGVkIHRvIExpbnV4IGJ5IEFsYW4gQ294CisgKi8KKy8qCisgKiAgICAgNS8yNS8xOTk5IDogTWFyY2VsbyBUb3NhdHRpIDxtYXJjZWxvQGNvbmVjdGl2YS5jb20uYnI+CisgKiAgICAgICAgICAgICBmaXhlZCBhIGRlYWRsb2NrIGluIGNvc2Ffc3BwcF9vcGVuCisgKi8KKwwKKy8qIC0tLS0tLS0tLS0gSGVhZGVycywgbWFjcm9zLCBkYXRhIHN0cnVjdHVyZXMgLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyN1bmRlZiBDT1NBX1NMT1dfSU8JLyogZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seSAqLworI3VuZGVmIFJFQUxMWV9TTE9XX0lPCisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSA8bmV0L3N5bmNwcHAuaD4KKyNpbmNsdWRlICJjb3NhLmgiCisKKy8qIE1heGltdW0gbGVuZ3RoIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBzdHJpbmcuICovCisjZGVmaW5lIENPU0FfTUFYX0lEX1NUUklORwkxMjgKKworLyogTWF4aW11bSBsZW5ndGggb2YgdGhlIGNoYW5uZWwgbmFtZSAqLworI2RlZmluZSBDT1NBX01BWF9OQU1FCQkoc2l6ZW9mKCJjb3NhWFhYY1hYWCIpKzEpCisKKy8qIFBlci1jaGFubmVsIGRhdGEgc3RydWN0dXJlICovCisKK3N0cnVjdCBjaGFubmVsX2RhdGEgeworCXZvaWQgKmlmX3B0cjsJLyogR2VuZXJhbCBwdXJwb3NlIHBvaW50ZXIgKHVzZWQgYnkgU1BQUCkgKi8KKwlpbnQgdXNhZ2U7CS8qIFVzYWdlIGNvdW50OyA+MCBmb3IgY2hyZGV2LCAtMSBmb3IgbmV0ZGV2ICovCisJaW50IG51bTsJLyogTnVtYmVyIG9mIHRoZSBjaGFubmVsICovCisJc3RydWN0IGNvc2FfZGF0YSAqY29zYTsJLyogUG9pbnRlciB0byB0aGUgcGVyLWNhcmQgc3RydWN0dXJlICovCisJaW50IHR4c2l6ZTsJLyogU2l6ZSBvZiB0cmFuc21pdHRlZCBkYXRhICovCisJY2hhciAqdHhidWY7CS8qIFRyYW5zbWl0IGJ1ZmZlciAqLworCWNoYXIgbmFtZVtDT1NBX01BWF9OQU1FXTsJLyogY2hhbm5lbCBuYW1lICovCisKKwkvKiBUaGUgSFcgbGF5ZXIgaW50ZXJmYWNlICovCisJLyogcm91dGluZSBjYWxsZWQgZnJvbSB0aGUgUlggaW50ZXJydXB0ICovCisJY2hhciAqKCpzZXR1cF9yeCkoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbm5lbCwgaW50IHNpemUpOworCS8qIHJvdXRpbmUgY2FsbGVkIHdoZW4gdGhlIFJYIGlzIGRvbmUgKGZyb20gdGhlIEVPVCBpbnRlcnJ1cHQpICovCisJaW50ICgqcnhfZG9uZSkoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbm5lbCk7CisJLyogcm91dGluZSBjYWxsZWQgd2hlbiB0aGUgVFggaXMgZG9uZSAoZnJvbSB0aGUgRU9UIGludGVycnVwdCkgKi8KKwlpbnQgKCp0eF9kb25lKShzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFubmVsLCBpbnQgc2l6ZSk7CisKKwkvKiBDaGFyYWN0ZXIgZGV2aWNlIHBhcnRzICovCisJc3RydWN0IHNlbWFwaG9yZSByc2VtLCB3c2VtOworCWNoYXIgKnJ4ZGF0YTsKKwlpbnQgcnhzaXplOworCXdhaXRfcXVldWVfaGVhZF90IHR4d2FpdHEsIHJ4d2FpdHE7CisJaW50IHR4X3N0YXR1cywgcnhfc3RhdHVzOworCisJLyogU1BQUC9IRExDIGRldmljZSBwYXJ0cyAqLworCXN0cnVjdCBwcHBfZGV2aWNlIHBwcGRldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiLCAqdHhfc2tiOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworfTsKKworLyogY29zYS0+ZmlybXdhcmVfc3RhdHVzIGJpdHMgKi8KKyNkZWZpbmUgQ09TQV9GV19SRVNFVAkJKDE8PDApCS8qIElzIHRoZSBST00gbW9uaXRvciBhY3RpdmU/ICovCisjZGVmaW5lIENPU0FfRldfRE9XTkxPQUQJKDE8PDEpCS8qIElzIHRoZSBtaWNyb2NvZGUgZG93bmxvYWRlZD8gKi8KKyNkZWZpbmUgQ09TQV9GV19TVEFSVAkJKDE8PDIpCS8qIElzIHRoZSBtaWNyb2NvZGUgcnVubmluZz8gKi8KKworc3RydWN0IGNvc2FfZGF0YSB7CisJaW50IG51bTsJCQkvKiBDYXJkIG51bWJlciAqLworCWNoYXIgbmFtZVtDT1NBX01BWF9OQU1FXTsJLyogQ2FyZCBuYW1lIC0gZS5nICJjb3NhMCIgKi8KKwl1bnNpZ25lZCBpbnQgZGF0YXJlZywgc3RhdHVzcmVnOwkvKiBJL08gcG9ydHMgKi8KKwl1bnNpZ25lZCBzaG9ydCBpcnEsIGRtYTsJLyogSVJRIGFuZCBETUEgbnVtYmVyICovCisJdW5zaWduZWQgc2hvcnQgc3RhcnRhZGRyOwkvKiBGaXJtd2FyZSBzdGFydCBhZGRyZXNzICovCisJdW5zaWduZWQgc2hvcnQgYnVzbWFzdGVyOwkvKiBVc2UgYnVzbWFzdGVyaW5nPyAqLworCWludCBuY2hhbm5lbHM7CQkJLyogIyBvZiBjaGFubmVscyBvbiB0aGlzIGNhcmQgKi8KKwlpbnQgZHJpdmVyX3N0YXR1czsJCS8qIEZvciBjb21tdW5pY2F0aW5nIHdpdGggZmlybXdhcmUgKi8KKwlpbnQgZmlybXdhcmVfc3RhdHVzOwkJLyogRG93bmxvYWRlZCwgcmVzZXRlZCwgZXRjLiAqLworCWxvbmcgaW50IHJ4Yml0bWFwLCB0eGJpdG1hcDsJLyogQml0bWFwIG9mIGNoYW5uZWxzIHdobyBhcmUgd2lsbGluZyB0byBzZW5kL3JlY2VpdmUgZGF0YSAqLworCWxvbmcgaW50IHJ4dHg7CQkJLyogUlggb3IgVFggaW4gcHJvZ3Jlc3M/ICovCisJaW50IGVuYWJsZWQ7CisJaW50IHVzYWdlOwkJCQkvKiB1c2FnZSBjb3VudCAqLworCWludCB0eGNoYW4sIHR4c2l6ZSwgcnhzaXplOworCXN0cnVjdCBjaGFubmVsX2RhdGEgKnJ4Y2hhbjsKKwljaGFyICpib3VuY2VidWY7CisJY2hhciAqdHhidWYsICpyeGJ1ZjsKKwlzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuOworCXNwaW5sb2NrX3QgbG9jazsJLyogRm9yIGV4Y2x1c2l2ZSBvcGVyYXRpb25zIG9uIHRoaXMgc3RydWN0dXJlICovCisJY2hhciBpZF9zdHJpbmdbQ09TQV9NQVhfSURfU1RSSU5HXTsJLyogUk9NIG1vbml0b3IgSUQgc3RyaW5nICovCisJY2hhciAqdHlwZTsJCQkJLyogY2FyZCB0eXBlICovCit9OworCisvKgorICogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgYWxsIHRoZSBwb3NzaWJsZSBwb3J0cyB0byBiZSBhdXRvcHJvYmVkLgorICogSXQgaXMgaGVyZSBidXQgaXQgcHJvYmFibHkgaXMgbm90IGEgZ29vZCBpZGVhIHRvIHVzZSB0aGlzLgorICovCisvKiAjZGVmaW5lIENPU0FfSVNBX0FVVE9QUk9CRQkxICovCisKKy8qCisgKiBDaGFyYWN0ZXIgZGV2aWNlIG1ham9yIG51bWJlci4gMTE3IHdhcyBhbGxvY2F0ZWQgZm9yIHVzLgorICogVGhlIHZhbHVlIG9mIDAgbWVhbnMgdG8gYWxsb2NhdGUgYSBmaXJzdCBmcmVlIG9uZS4KKyAqLworc3RhdGljIGludCBjb3NhX21ham9yID0gMTE3OworCisvKgorICogRW5jb2Rpbmcgb2YgdGhlIG1pbm9yIG51bWJlcnM6CisgKiBUaGUgbG93ZXN0IENBUkRfTUlOT1JfQklUUyBiaXRzIG1lYW5zIHRoZSBjaGFubmVsIG9uIHRoZSBzaW5nbGUgY2FyZCwKKyAqIHRoZSBoaWdoZXN0IGJpdHMgbWVhbnMgdGhlIGNhcmQgbnVtYmVyLgorICovCisjZGVmaW5lIENBUkRfTUlOT1JfQklUUwk0CS8qIEhvdyBtYW55IGJpdHMgaW4gbWlub3IgbnVtYmVyIGFyZSByZXNlcnZlZAorCQkJCSAqIGZvciB0aGUgc2luZ2xlIGNhcmQgKi8KKy8qCisgKiBUaGUgZm9sbG93aW5nIGRlcGVuZHMgb24gQ0FSRF9NSU5PUl9CSVRTLiBVbmZvcnR1bmF0ZWx5LCB0aGUgIk1PRFVMRV9TVFJJTkciCisgKiBtYWNybyBkb2Vzbid0IGxpa2UgYW55dGhpbmcgb3RoZXIgdGhhbiB0aGUgcmF3IG51bWJlciBhcyBhbiBhcmd1bWVudCA6LSgKKyAqLworI2RlZmluZSBNQVhfQ0FSRFMJMTYKKy8qICNkZWZpbmUgTUFYX0NBUkRTCSgxIDw8ICg4LUNBUkRfTUlOT1JfQklUUykpICovCisKKyNkZWZpbmUgRFJJVkVSX1JYX1JFQURZCQkweDAwMDEKKyNkZWZpbmUgRFJJVkVSX1RYX1JFQURZCQkweDAwMDIKKyNkZWZpbmUgRFJJVkVSX1RYTUFQX1NISUZUCTIKKyNkZWZpbmUgRFJJVkVSX1RYTUFQX01BU0sJMHgwYwkvKiBGSVhNRTogMHhmYyBmb3IgOC1jaGFubmVsIHZlcnNpb24gKi8KKworLyoKKyAqIGZvciBjb3NhLT5yeHR4IC0gaW5kaWNhdGVzIHdoZXRoZXIgZWl0aGVyIHRyYW5zbWl0IG9yIHJlY2VpdmUgaXMKKyAqIGluIHByb2dyZXNzLiBUaGVzZSB2YWx1ZXMgYXJlIG1lYW4gbnVtYmVyIG9mIHRoZSBiaXQuCisgKi8KKyNkZWZpbmUgVFhCSVQgMAorI2RlZmluZSBSWEJJVCAxCisjZGVmaW5lIElSUUJJVCAyCisKKyNkZWZpbmUgQ09TQV9NVFUgMjAwMAkvKiBGSVhNRTogSSBkb24ndCBrbm93IHRoaXMgZXhhY3RseSAqLworCisjdW5kZWYgREVCVUdfREFUQSAvLzEJLyogRHVtcCB0aGUgZGF0YSByZWFkIG9yIHdyaXR0ZW4gdG8gdGhlIGNoYW5uZWwgKi8KKyN1bmRlZiBERUJVR19JUlFTIC8vMQkvKiBQcmludCB0aGUgbWVzc2FnZSB3aGVuIHRoZSBJUlEgaXMgcmVjZWl2ZWQgKi8KKyN1bmRlZiBERUJVR19JTyAgIC8vMQkvKiBEdW1wIHRoZSBJL08gdHJhZmZpYyAqLworCisjZGVmaW5lIFRYX1RJTUVPVVQJKDUqSFopCisKKy8qIE1heWJlIHRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIGFsbG9jYXRlZCBkeW5hbWljYWxseSAqLworc3RhdGljIHN0cnVjdCBjb3NhX2RhdGEgY29zYV9jYXJkc1tNQVhfQ0FSRFNdOworc3RhdGljIGludCBucl9jYXJkczsKKworI2lmZGVmIENPU0FfSVNBX0FVVE9QUk9CRQorc3RhdGljIGludCBpb1tNQVhfQ0FSRFMrMV0gID0geyAweDIyMCwgMHgyMjgsIDB4MjEwLCAweDIxOCwgMCwgfTsKKy8qIE5PVEU6IERNQSBpcyBub3QgYXV0b3Byb2JlZCEhISAqLworc3RhdGljIGludCBkbWFbTUFYX0NBUkRTKzFdID0geyAxLCA3LCAxLCA3LCAxLCA3LCAxLCA3LCAwLCB9OworI2Vsc2UKK3N0YXRpYyBpbnQgaW9bTUFYX0NBUkRTKzFdOworc3RhdGljIGludCBkbWFbTUFYX0NBUkRTKzFdOworI2VuZGlmCisvKiBJUlEgY2FuIGJlIHNhZmVseSBhdXRvcHJvYmVkICovCitzdGF0aWMgaW50IGlycVtNQVhfQ0FSRFMrMV0gPSB7IC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAsIH07CisKKy8qIGZvciBjbGFzcyBzdHVmZiovCitzdGF0aWMgc3RydWN0IGNsYXNzX3NpbXBsZSAqY29zYV9jbGFzczsKKworI2lmZGVmIE1PRFVMRQorbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgIlRoZSBJL08gYmFzZXMgb2YgdGhlIENPU0Egb3IgU1JQIGNhcmRzIik7Cittb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJUaGUgSVJRIGxpbmVzIG9mIHRoZSBDT1NBIG9yIFNSUCBjYXJkcyIpOworbW9kdWxlX3BhcmFtX2FycmF5KGRtYSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZG1hLCAiVGhlIERNQSBjaGFubmVscyBvZiB0aGUgQ09TQSBvciBTUlAgY2FyZHMiKTsKKworTU9EVUxFX0FVVEhPUigiSmFuIFwiWWVueWFcIiBLYXNwcnphaywgPGthc0BmaS5tdW5pLmN6PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNb2R1bGFyIGRyaXZlciBmb3IgdGhlIENPU0Egb3IgU1JQIHN5bmNocm9ub3VzIGNhcmQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNlbmRpZgorCisvKiBJIHVzZSB0aGlzIG1haW5seSBmb3IgdGVzdGluZyBwdXJwb3NlcyAqLworI2lmZGVmIENPU0FfU0xPV19JTworI2RlZmluZSBjb3NhX291dGIgb3V0Yl9wCisjZGVmaW5lIGNvc2Ffb3V0dyBvdXR3X3AKKyNkZWZpbmUgY29zYV9pbmIgIGluYl9wCisjZGVmaW5lIGNvc2FfaW53ICBpbndfcAorI2Vsc2UKKyNkZWZpbmUgY29zYV9vdXRiIG91dGIKKyNkZWZpbmUgY29zYV9vdXR3IG91dHcKKyNkZWZpbmUgY29zYV9pbmIgIGluYgorI2RlZmluZSBjb3NhX2ludyAgaW53CisjZW5kaWYKKworI2RlZmluZSBpc184Yml0KGNvc2EpCQkoIShjb3NhLT5kYXRhcmVnICYgMHgwOCkpCisKKyNkZWZpbmUgY29zYV9nZXRzdGF0dXMoY29zYSkJKGNvc2FfaW5iKGNvc2EtPnN0YXR1c3JlZykpCisjZGVmaW5lIGNvc2FfcHV0c3RhdHVzKGNvc2EsIHN0YXQpCShjb3NhX291dGIoc3RhdCwgY29zYS0+c3RhdHVzcmVnKSkKKyNkZWZpbmUgY29zYV9nZXRkYXRhMTYoY29zYSkJKGNvc2FfaW53KGNvc2EtPmRhdGFyZWcpKQorI2RlZmluZSBjb3NhX2dldGRhdGE4KGNvc2EpCShjb3NhX2luYihjb3NhLT5kYXRhcmVnKSkKKyNkZWZpbmUgY29zYV9wdXRkYXRhMTYoY29zYSwgZHQpCShjb3NhX291dHcoZHQsIGNvc2EtPmRhdGFyZWcpKQorI2RlZmluZSBjb3NhX3B1dGRhdGE4KGNvc2EsIGR0KQkoY29zYV9vdXRiKGR0LCBjb3NhLT5kYXRhcmVnKSkKKworLyogSW5pdGlhbGl6YXRpb24gc3R1ZmYgKi8KK3N0YXRpYyBpbnQgY29zYV9wcm9iZShpbnQgaW9hZGRyLCBpbnQgaXJxLCBpbnQgZG1hKTsKKworLyogSFcgaW50ZXJmYWNlICovCitzdGF0aWMgdm9pZCBjb3NhX2VuYWJsZV9yeChzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuKTsKK3N0YXRpYyB2b2lkIGNvc2FfZGlzYWJsZV9yeChzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuKTsKK3N0YXRpYyBpbnQgY29zYV9zdGFydF90eChzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFubmVsLCBjaGFyICpidWYsIGludCBzaXplKTsKK3N0YXRpYyB2b2lkIGNvc2Ffa2ljayhzdHJ1Y3QgY29zYV9kYXRhICpjb3NhKTsKK3N0YXRpYyBpbnQgY29zYV9kbWFfYWJsZShzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuLCBjaGFyICpidWYsIGludCBkYXRhKTsKKworLyogU1BQUC9IRExDIHN0dWZmICovCitzdGF0aWMgdm9pZCBzcHBwX2NoYW5uZWxfaW5pdChzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuKTsKK3N0YXRpYyB2b2lkIHNwcHBfY2hhbm5lbF9kZWxldGUoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbik7CitzdGF0aWMgaW50IGNvc2Ffc3BwcF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkKTsKK3N0YXRpYyBpbnQgY29zYV9zcHBwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkKTsKK3N0YXRpYyB2b2lkIGNvc2Ffc3BwcF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkKTsKK3N0YXRpYyBpbnQgY29zYV9zcHBwX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkKTsKK3N0YXRpYyBjaGFyICpzcHBwX3NldHVwX3J4KHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW5uZWwsIGludCBzaXplKTsKK3N0YXRpYyBpbnQgc3BwcF9yeF9kb25lKHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW5uZWwpOworc3RhdGljIGludCBzcHBwX3R4X2RvbmUoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbm5lbCwgaW50IHNpemUpOworc3RhdGljIGludCBjb3NhX3NwcHBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpjb3NhX25ldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogQ2hhcmFjdGVyIGRldmljZSAqLworc3RhdGljIHZvaWQgY2hhcmRldl9jaGFubmVsX2luaXQoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbik7CitzdGF0aWMgY2hhciAqY2hyZGV2X3NldHVwX3J4KHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW5uZWwsIGludCBzaXplKTsKK3N0YXRpYyBpbnQgY2hyZGV2X3J4X2RvbmUoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbm5lbCk7CitzdGF0aWMgaW50IGNocmRldl90eF9kb25lKHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW5uZWwsIGludCBzaXplKTsKK3N0YXRpYyBzc2l6ZV90IGNvc2FfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwljaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CitzdGF0aWMgc3NpemVfdCBjb3NhX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCWNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29zYV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICpwb2xsKTsKK3N0YXRpYyBpbnQgY29zYV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgY29zYV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgY29zYV9jaGFyZGV2X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKyNpZmRlZiBDT1NBX0ZBU1lOQ19XT1JLSU5HCitzdGF0aWMgaW50IGNvc2FfZmFzeW5jKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgb24pOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNvc2FfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gY29zYV9yZWFkLAorCS53cml0ZQkJPSBjb3NhX3dyaXRlLAorCS5wb2xsCQk9IGNvc2FfcG9sbCwKKwkuaW9jdGwJCT0gY29zYV9jaGFyZGV2X2lvY3RsLAorCS5vcGVuCQk9IGNvc2Ffb3BlbiwKKwkucmVsZWFzZQk9IGNvc2FfcmVsZWFzZSwKKyNpZmRlZiBDT1NBX0ZBU1lOQ19XT1JLSU5HCisJLmZhc3luYwkJPSBjb3NhX2Zhc3luYywKKyNlbmRpZgorfTsKKworLyogSW9jdGxzICovCitzdGF0aWMgaW50IGNvc2Ffc3RhcnQoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgaW50IGFkZHJlc3MpOworc3RhdGljIGludCBjb3NhX3Jlc2V0KHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EpOworc3RhdGljIGludCBjb3NhX2Rvd25sb2FkKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIHZvaWQgX191c2VyICphKTsKK3N0YXRpYyBpbnQgY29zYV9yZWFkbWVtKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIHZvaWQgX191c2VyICphKTsKKworLyogQ09TQS9TUlAgUk9NIG1vbml0b3IgKi8KK3N0YXRpYyBpbnQgZG93bmxvYWQoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsIGludCBhZGRyLCBpbnQgbGVuKTsKK3N0YXRpYyBpbnQgc3RhcnRtaWNyb2NvZGUoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgaW50IGFkZHJlc3MpOworc3RhdGljIGludCByZWFkbWVtKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGNoYXIgX191c2VyICpkYXRhLCBpbnQgYWRkciwgaW50IGxlbik7CitzdGF0aWMgaW50IGNvc2FfcmVzZXRfYW5kX3JlYWRfaWQoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgY2hhciAqaWQpOworCisvKiBBdXhpbGxpYXJ5IGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBnZXRfd2FpdF9kYXRhKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EpOworc3RhdGljIGludCBwdXRfd2FpdF9kYXRhKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBkYXRhKTsKK3N0YXRpYyBpbnQgcHV0aGV4bnVtYmVyKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBudW1iZXIpOworc3RhdGljIHZvaWQgcHV0X2RyaXZlcl9zdGF0dXMoc3RydWN0IGNvc2FfZGF0YSAqY29zYSk7CitzdGF0aWMgdm9pZCBwdXRfZHJpdmVyX3N0YXR1c19ub2xvY2soc3RydWN0IGNvc2FfZGF0YSAqY29zYSk7CisKKy8qIEludGVycnVwdCBoYW5kbGluZyAqLworc3RhdGljIGlycXJldHVybl90IGNvc2FfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmNvc2EsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworLyogSS9PIG9wcyBkZWJ1Z2dpbmcgKi8KKyNpZmRlZiBERUJVR19JTworc3RhdGljIHZvaWQgZGVidWdfZGF0YV9pbihzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgZGF0YSk7CitzdGF0aWMgdm9pZCBkZWJ1Z19kYXRhX291dChzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgZGF0YSk7CitzdGF0aWMgdm9pZCBkZWJ1Z19kYXRhX2NtZChzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgZGF0YSk7CitzdGF0aWMgdm9pZCBkZWJ1Z19zdGF0dXNfaW4oc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgaW50IHN0YXR1cyk7CitzdGF0aWMgdm9pZCBkZWJ1Z19zdGF0dXNfb3V0KHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBzdGF0dXMpOworI2VuZGlmCisKKwwKKy8qIC0tLS0tLS0tLS0gSW5pdGlhbGl6YXRpb24gc3R1ZmYgLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IF9faW5pdCBjb3NhX2luaXQodm9pZCkKK3sKKwlpbnQgaSwgZXJyID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gImNvc2EgdjEuMDggKGMpIDE5OTctMjAwMCBKYW4gS2FzcHJ6YWsgPGthc0BmaS5tdW5pLmN6PlxuIik7CisjaWZkZWYgQ09ORklHX1NNUAorCXByaW50ayhLRVJOX0lORk8gImNvc2E6IFNNUCBmb3VuZC4gUGxlYXNlIG1haWwgYW55IHN1Y2Nlc3MvZmFpbHVyZSByZXBvcnRzIHRvIHRoZSBhdXRob3IuXG4iKTsKKyNlbmRpZgorCWlmIChjb3NhX21ham9yID4gMCkgeworCQlpZiAocmVnaXN0ZXJfY2hyZGV2KGNvc2FfbWFqb3IsICJjb3NhIiwgJmNvc2FfZm9wcykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNvc2E6IHVuYWJsZSB0byBnZXQgbWFqb3IgJWRcbiIsCisJCQkJY29zYV9tYWpvcik7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIShjb3NhX21ham9yPXJlZ2lzdGVyX2NocmRldigwLCAiY29zYSIsICZjb3NhX2ZvcHMpKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY29zYTogdW5hYmxlIHRvIHJlZ2lzdGVyIGNoYXJkZXZcbiIpOworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWZvciAoaT0wOyBpPE1BWF9DQVJEUzsgaSsrKQorCQljb3NhX2NhcmRzW2ldLm51bSA9IC0xOworCWZvciAoaT0wOyBpb1tpXSAhPSAwICYmIGkgPCBNQVhfQ0FSRFM7IGkrKykKKwkJY29zYV9wcm9iZShpb1tpXSwgaXJxW2ldLCBkbWFbaV0pOworCWlmICghbnJfY2FyZHMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY29zYTogbm8gZGV2aWNlcyBmb3VuZC5cbiIpOworCQl1bnJlZ2lzdGVyX2NocmRldihjb3NhX21ham9yLCAiY29zYSIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisJZGV2ZnNfbWtfZGlyKCJjb3NhIik7CisJY29zYV9jbGFzcyA9IGNsYXNzX3NpbXBsZV9jcmVhdGUoVEhJU19NT0RVTEUsICJjb3NhIik7CisJaWYgKElTX0VSUihjb3NhX2NsYXNzKSkgeworCQllcnIgPSBQVFJfRVJSKGNvc2FfY2xhc3MpOworCQlnb3RvIG91dF9jaHJkZXY7CisJfQorCWZvciAoaT0wOyBpPG5yX2NhcmRzOyBpKyspIHsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoY29zYV9jbGFzcywgTUtERVYoY29zYV9tYWpvciwgaSksCisJCQkJTlVMTCwgImNvc2ElZCIsIGkpOworCQllcnIgPSBkZXZmc19ta19jZGV2KE1LREVWKGNvc2FfbWFqb3IsIGkpLAorCQkJCVNfSUZDSFJ8U19JUlVTUnxTX0lXVVNSLAorCQkJCSJjb3NhLyVkIiwgaSk7CisJCWlmIChlcnIpIHsKKwkJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKGNvc2FfbWFqb3IsIGkpKTsKKwkJCWdvdG8gb3V0X2NocmRldjsJCQorCQl9CisJfQorCWVyciA9IDA7CisJZ290byBvdXQ7CisJCitvdXRfY2hyZGV2OgorCXVucmVnaXN0ZXJfY2hyZGV2KGNvc2FfbWFqb3IsICJjb3NhIik7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KK21vZHVsZV9pbml0KGNvc2FfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjb3NhX2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgY29zYV9kYXRhICpjb3NhOworCWludCBpOworCXByaW50ayhLRVJOX0lORk8gIlVubG9hZGluZyB0aGUgY29zYSBtb2R1bGVcbiIpOworCisJZm9yIChpPTA7IGk8bnJfY2FyZHM7IGkrKykgeworCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihjb3NhX21ham9yLCBpKSk7CisJCWRldmZzX3JlbW92ZSgiY29zYS8lZCIsIGkpOworCX0KKwljbGFzc19zaW1wbGVfZGVzdHJveShjb3NhX2NsYXNzKTsKKwlkZXZmc19yZW1vdmUoImNvc2EiKTsKKwlmb3IgKGNvc2E9Y29zYV9jYXJkczsgbnJfY2FyZHMtLTsgY29zYSsrKSB7CisJCS8qIENsZWFuIHVwIHRoZSBwZXItY2hhbm5lbCBkYXRhICovCisJCWZvciAoaT0wOyBpPGNvc2EtPm5jaGFubmVsczsgaSsrKSB7CisJCQkvKiBDaGFyZGV2IGRyaXZlciBoYXMgbm8gYWxsb2MnZCBwZXItY2hhbm5lbCBkYXRhICovCisJCQlzcHBwX2NoYW5uZWxfZGVsZXRlKGNvc2EtPmNoYW4raSk7CisJCX0KKwkJLyogQ2xlYW4gdXAgdGhlIHBlci1jYXJkIGRhdGEgKi8KKwkJa2ZyZWUoY29zYS0+Y2hhbik7CisJCWtmcmVlKGNvc2EtPmJvdW5jZWJ1Zik7CisJCWZyZWVfaXJxKGNvc2EtPmlycSwgY29zYSk7CisJCWZyZWVfZG1hKGNvc2EtPmRtYSk7CisJCXJlbGVhc2VfcmVnaW9uKGNvc2EtPmRhdGFyZWcsaXNfOGJpdChjb3NhKT8yOjQpOworCX0KKwl1bnJlZ2lzdGVyX2NocmRldihjb3NhX21ham9yLCAiY29zYSIpOworfQorbW9kdWxlX2V4aXQoY29zYV9leGl0KTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJlZ2lzdGVyIGFsbCB0aGUgbmV0IGRldmljZXMgbmVlZGVkIGZvciB0aGUKKyAqIHNpbmdsZSBjaGFubmVsLgorICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGNoYW5uZWxfaW5pdChzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuKQoreworCXNwcmludGYoY2hhbi0+bmFtZSwgImNvc2ElZGMlZCIsIGNoYW4tPmNvc2EtPm51bSwgY2hhbi0+bnVtKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGNoYXJkZXYgZGF0YSBzdHJ1Y3R1cmVzICovCisJY2hhcmRldl9jaGFubmVsX2luaXQoY2hhbik7CisKKwkvKiBSZWdpc3RlciB0aGUgc3BwcCBpbnRlcmZhY2UgKi8KKwlzcHBwX2NoYW5uZWxfaW5pdChjaGFuKTsKK30KKwkKK3N0YXRpYyBpbnQgY29zYV9wcm9iZShpbnQgYmFzZSwgaW50IGlycSwgaW50IGRtYSkKK3sKKwlzdHJ1Y3QgY29zYV9kYXRhICpjb3NhID0gY29zYV9jYXJkcytucl9jYXJkczsKKwlpbnQgaSwgZXJyID0gMDsKKworCW1lbXNldChjb3NhLCAwLCBzaXplb2Yoc3RydWN0IGNvc2FfZGF0YSkpOworCisJLyogQ2hlY2tpbmcgdmFsaWRpdHkgb2YgcGFyYW1ldGVyczogKi8KKwkvKiBJUlEgc2hvdWxkIGJlIDItNyBvciAxMC0xNTsgbmVnYXRpdmUgSVJRIG1lYW5zIGF1dG9wcm9iZSAqLworCWlmICgoaXJxID49IDAgICYmIGlycSA8IDIpIHx8IGlycSA+IDE1IHx8IChpcnEgPCAxMCAmJiBpcnEgPiA3KSkgeworCQlwcmludGsgKEtFUk5fSU5GTyAiY29zYV9wcm9iZTogaW52YWxpZCBJUlEgJWRcbiIsIGlycSk7CisJCXJldHVybiAtMTsKKwl9CisJLyogSS9PIGFkZHJlc3Mgc2hvdWxkIGJlIGJldHdlZW4gMHgxMDAgYW5kIDB4M2ZmIGFuZCBzaG91bGQgYmUKKwkgKiBtdWx0aXBsZSBvZiA4LiAqLworCWlmIChiYXNlIDwgMHgxMDAgfHwgYmFzZSA+IDB4M2ZmIHx8IGJhc2UgJiAweDcpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gImNvc2FfcHJvYmU6IGludmFsaWQgSS9PIGFkZHJlc3MgMHgleFxuIiwKKwkJCWJhc2UpOworCQlyZXR1cm4gLTE7CisJfQorCS8qIERNQSBzaG91bGQgYmUgMCwxIG9yIDMtNyAqLworCWlmIChkbWEgPCAwIHx8IGRtYSA9PSA0IHx8IGRtYSA+IDcpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gImNvc2FfcHJvYmU6IGludmFsaWQgRE1BICVkXG4iLCBkbWEpOworCQlyZXR1cm4gLTE7CisJfQorCS8qIGFuZCBmaW5hbGx5LCBvbiAxNi1iaXQgQ09TQSBETUEgc2hvdWxkIGJlIDQtNyBhbmQgCisJICogSS9PIGJhc2Ugc2hvdWxkIG5vdCBiZSBtdWx0aXBsZSBvZiAweDEwICovCisJaWYgKCgoYmFzZSAmIDB4OCkgJiYgZG1hIDwgNCkgfHwgKCEoYmFzZSAmIDB4OCkgJiYgZG1hID4gMykpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gImNvc2FfcHJvYmU6IDgvMTYgYml0IGJhc2UgYW5kIERNQSBtaXNtYXRjaCIKKwkJCSIgKGJhc2U9MHgleCwgZG1hPSVkKVxuIiwgYmFzZSwgZG1hKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNvc2EtPmRtYSA9IGRtYTsKKwljb3NhLT5kYXRhcmVnID0gYmFzZTsKKwljb3NhLT5zdGF0dXNyZWcgPSBpc184Yml0KGNvc2EpP2Jhc2UrMTpiYXNlKzI7CisJc3Bpbl9sb2NrX2luaXQoJmNvc2EtPmxvY2spOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihiYXNlLCBpc184Yml0KGNvc2EpPzI6NCwiY29zYSIpKQorCQlyZXR1cm4gLTE7CisJCisJaWYgKGNvc2FfcmVzZXRfYW5kX3JlYWRfaWQoY29zYSwgY29zYS0+aWRfc3RyaW5nKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImNvc2E6IHByb2JlIGF0IDB4JXggZmFpbGVkLlxuIiwgYmFzZSk7CisJCWVyciA9IC0xOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogVGVzdCB0aGUgdmFsaWRpdHkgb2YgaWRlbnRpZmljYXRpb24gc3RyaW5nICovCisJaWYgKCFzdHJuY21wKGNvc2EtPmlkX3N0cmluZywgIlNSUCIsIDMpKQorCQljb3NhLT50eXBlID0gInNycCI7CisJZWxzZSBpZiAoIXN0cm5jbXAoY29zYS0+aWRfc3RyaW5nLCAiQ09TQSIsIDQpKQorCQljb3NhLT50eXBlID0gaXNfOGJpdChjb3NhKT8gImNvc2E4IjogImNvc2ExNiI7CisJZWxzZSB7CisvKiBQcmludCBhIHdhcm5pbmcgb25seSBpZiB3ZSBhcmUgbm90IGF1dG9wcm9iaW5nICovCisjaWZuZGVmIENPU0FfSVNBX0FVVE9QUk9CRQorCQlwcmludGsoS0VSTl9JTkZPICJjb3NhOiB2YWxpZCBzaWduYXR1cmUgbm90IGZvdW5kIGF0IDB4JXguXG4iLAorCQkJYmFzZSk7CisjZW5kaWYKKwkJZXJyID0gLTE7CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogVXBkYXRlIHRoZSBuYW1lIG9mIHRoZSByZWdpb24gbm93IHdlIGtub3cgdGhlIHR5cGUgb2YgY2FyZCAqLyAKKwlyZWxlYXNlX3JlZ2lvbihiYXNlLCBpc184Yml0KGNvc2EpPzI6NCk7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihiYXNlLCBpc184Yml0KGNvc2EpPzI6NCwgY29zYS0+dHlwZSkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImNvc2E6IGNoYW5naW5nIG5hbWUgYXQgMHgleCBmYWlsZWQuXG4iLCBiYXNlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIE5vdyBkbyBJUlEgYXV0b3Byb2JlICovCisJaWYgKGlycSA8IDApIHsKKwkJdW5zaWduZWQgbG9uZyBpcnFzOworLyoJCXByaW50ayhLRVJOX0lORk8gIklSUSBhdXRvcHJvYmVcbiIpOyAqLworCQlpcnFzID0gcHJvYmVfaXJxX29uKCk7CisJCS8qIAorCQkgKiBFbmFibGUgaW50ZXJydXB0IG9uIHR4IGJ1ZmZlciBlbXB0eSAoaXQgc3VyZSBpcykgCisJCSAqIHJlYWxseSBzdXJlID8KKwkJICogRklYTUU6IFdoZW4gdGhpcyBjb2RlIGlzIG5vdCB1c2VkIGFzIG1vZHVsZSwgd2Ugc2hvdWxkCisJCSAqIHByb2JhYmx5IGNhbGwgdWRlbGF5KCkgaW5zdGVhZCBvZiB0aGUgaW50ZXJydXB0aWJsZSBzbGVlcC4KKwkJICovCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWNvc2FfcHV0c3RhdHVzKGNvc2EsIFNSX1RYX0lOVF9FTkEpOworCQlzY2hlZHVsZV90aW1lb3V0KDMwKTsKKwkJaXJxID0gcHJvYmVfaXJxX29mZihpcnFzKTsKKwkJLyogRGlzYWJsZSBhbGwgSVJRcyBmcm9tIHRoZSBjYXJkICovCisJCWNvc2FfcHV0c3RhdHVzKGNvc2EsIDApOworCQkvKiBFbXB0eSB0aGUgcmVjZWl2ZWQgZGF0YSByZWdpc3RlciAqLworCQljb3NhX2dldGRhdGE4KGNvc2EpOworCisJCWlmIChpcnEgPCAwKSB7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiY29zYSBJUlEgYXV0b3Byb2JlOiBtdWx0aXBsZSBpbnRlcnJ1cHRzIG9idGFpbmVkICglZCwgYm9hcmQgYXQgMHgleClcbiIsCisJCQkJaXJxLCBjb3NhLT5kYXRhcmVnKTsKKwkJCWVyciA9IC0xOworCQkJZ290byBlcnJfb3V0OworCQl9CisJCWlmIChpcnEgPT0gMCkgeworCQkJcHJpbnRrIChLRVJOX0lORk8gImNvc2EgSVJRIGF1dG9wcm9iZTogbm8gaW50ZXJydXB0IG9idGFpbmVkIChib2FyZCBhdCAweCV4KVxuIiwKKwkJCQljb3NhLT5kYXRhcmVnKTsKKwkJLyoJcmV0dXJuIC0xOyAqLworCQl9CisJfQorCisJY29zYS0+aXJxID0gaXJxOworCWNvc2EtPm51bSA9IG5yX2NhcmRzOworCWNvc2EtPnVzYWdlID0gMDsKKwljb3NhLT5uY2hhbm5lbHMgPSAyOwkvKiBGSVhNRTogaG93IHRvIGRldGVybWluZSB0aGlzPyAqLworCisJaWYgKHJlcXVlc3RfaXJxKGNvc2EtPmlycSwgY29zYV9pbnRlcnJ1cHQsIDAsIGNvc2EtPnR5cGUsIGNvc2EpKSB7CisJCWVyciA9IC0xOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWlmIChyZXF1ZXN0X2RtYShjb3NhLT5kbWEsIGNvc2EtPnR5cGUpKSB7CisJCWVyciA9IC0xOworCQlnb3RvIGVycl9vdXQxOworCX0KKwkKKwljb3NhLT5ib3VuY2VidWYgPSBrbWFsbG9jKENPU0FfTVRVLCBHRlBfS0VSTkVMfEdGUF9ETUEpOworCWlmICghY29zYS0+Ym91bmNlYnVmKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDI7CisJfQorCXNwcmludGYoY29zYS0+bmFtZSwgImNvc2ElZCIsIGNvc2EtPm51bSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBwZXItY2hhbm5lbCBkYXRhICovCisJY29zYS0+Y2hhbiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2RhdGEpKmNvc2EtPm5jaGFubmVscywKKwkJCSAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb3NhLT5jaGFuKSB7CisJICAgICAgICBlcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQzOworCX0KKwltZW1zZXQoY29zYS0+Y2hhbiwgMCwgc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2RhdGEpKmNvc2EtPm5jaGFubmVscyk7CisJZm9yIChpPTA7IGk8Y29zYS0+bmNoYW5uZWxzOyBpKyspIHsKKwkJY29zYS0+Y2hhbltpXS5jb3NhID0gY29zYTsKKwkJY29zYS0+Y2hhbltpXS5udW0gPSBpOworCQljaGFubmVsX2luaXQoY29zYS0+Y2hhbitpKTsKKwl9CisKKwlwcmludGsgKEtFUk5fSU5GTyAiY29zYSVkOiAlcyAoJXMgYXQgMHgleCBpcnEgJWQgZG1hICVkKSwgJWQgY2hhbm5lbHNcbiIsCisJCWNvc2EtPm51bSwgY29zYS0+aWRfc3RyaW5nLCBjb3NhLT50eXBlLAorCQljb3NhLT5kYXRhcmVnLCBjb3NhLT5pcnEsIGNvc2EtPmRtYSwgY29zYS0+bmNoYW5uZWxzKTsKKworCXJldHVybiBucl9jYXJkcysrOworZXJyX291dDM6CisJa2ZyZWUoY29zYS0+Ym91bmNlYnVmKTsKK2Vycl9vdXQyOgorCWZyZWVfZG1hKGNvc2EtPmRtYSk7CitlcnJfb3V0MToKKwlmcmVlX2lycShjb3NhLT5pcnEsIGNvc2EpOworZXJyX291dDoJCisJcmVsZWFzZV9yZWdpb24oY29zYS0+ZGF0YXJlZyxpc184Yml0KGNvc2EpPzI6NCk7CisJcHJpbnRrKEtFUk5fTk9USUNFICJjb3NhJWQ6IGFsbG9jYXRpbmcgcmVzb3VyY2VzIGZhaWxlZFxuIiwKKwkgICAgICAgY29zYS0+bnVtKTsKKwlyZXR1cm4gZXJyOworfQorCisMCisvKi0tLS0tLS0tLS0gU1BQUC9IRExDIG5ldGRldmljZSAtLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGNvc2Ffc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmQpCit7CisJZC0+b3BlbiA9IGNvc2Ffc3BwcF9vcGVuOworCWQtPnN0b3AgPSBjb3NhX3NwcHBfY2xvc2U7CisJZC0+aGFyZF9zdGFydF94bWl0ID0gY29zYV9zcHBwX3R4OworCWQtPmRvX2lvY3RsID0gY29zYV9zcHBwX2lvY3RsOworCWQtPmdldF9zdGF0cyA9IGNvc2FfbmV0X3N0YXRzOworCWQtPnR4X3RpbWVvdXQgPSBjb3NhX3NwcHBfdGltZW91dDsKKwlkLT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7Cit9CisKK3N0YXRpYyB2b2lkIHNwcHBfY2hhbm5lbF9pbml0KHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmQ7CisJY2hhbi0+aWZfcHRyID0gJmNoYW4tPnBwcGRldjsKKwlkID0gYWxsb2NfbmV0ZGV2KDAsIGNoYW4tPm5hbWUsIGNvc2Ffc2V0dXApOworCWlmICghZCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogYWxsb2NfbmV0ZGV2IGZhaWxlZC5cbiIsIGNoYW4tPm5hbWUpOworCQlyZXR1cm47CisJfQorCWNoYW4tPnBwcGRldi5kZXYgPSBkOworCWQtPmJhc2VfYWRkciA9IGNoYW4tPmNvc2EtPmRhdGFyZWc7CisJZC0+aXJxID0gY2hhbi0+Y29zYS0+aXJxOworCWQtPmRtYSA9IGNoYW4tPmNvc2EtPmRtYTsKKwlkLT5wcml2ID0gY2hhbjsKKwlzcHBwX2F0dGFjaCgmY2hhbi0+cHBwZGV2KTsKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGQpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByZWdpc3Rlcl9uZXRkZXYgZmFpbGVkLlxuIiwgZC0+bmFtZSk7CisJCXNwcHBfZGV0YWNoKGQpOworCQlmcmVlX25ldGRldihkKTsKKwkJY2hhbi0+cHBwZGV2LmRldiA9IE5VTEw7CisJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNwcHBfY2hhbm5lbF9kZWxldGUoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbikKK3sKKwl1bnJlZ2lzdGVyX25ldGRldihjaGFuLT5wcHBkZXYuZGV2KTsKKwlzcHBwX2RldGFjaChjaGFuLT5wcHBkZXYuZGV2KTsKKwlmcmVlX25ldGRldihjaGFuLT5wcHBkZXYuZGV2KTsKKwljaGFuLT5wcHBkZXYuZGV2ID0gTlVMTDsKK30KKworc3RhdGljIGludCBjb3NhX3NwcHBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZCkKK3sKKwlzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuID0gZC0+cHJpdjsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIShjaGFuLT5jb3NhLT5maXJtd2FyZV9zdGF0dXMgJiBDT1NBX0ZXX1NUQVJUKSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBzdGFydCB0aGUgZmlybXdhcmUgZmlyc3QgKHN0YXR1cyAlZClcbiIsCisJCQljaGFuLT5jb3NhLT5uYW1lLCBjaGFuLT5jb3NhLT5maXJtd2FyZV9zdGF0dXMpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+Y29zYS0+bG9jaywgZmxhZ3MpOworCWlmIChjaGFuLT51c2FnZSAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBzcHBwX29wZW4gY2FsbGVkIHdpdGggdXNhZ2UgY291bnQgJWRcbiIsCisJCQljaGFuLT5uYW1lLCBjaGFuLT51c2FnZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmNvc2EtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJY2hhbi0+c2V0dXBfcnggPSBzcHBwX3NldHVwX3J4OworCWNoYW4tPnR4X2RvbmUgPSBzcHBwX3R4X2RvbmU7CisJY2hhbi0+cnhfZG9uZSA9IHNwcHBfcnhfZG9uZTsKKwljaGFuLT51c2FnZT0tMTsKKwljaGFuLT5jb3NhLT51c2FnZSsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmNvc2EtPmxvY2ssIGZsYWdzKTsKKworCWVyciA9IHNwcHBfb3BlbihkKTsKKwlpZiAoZXJyKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFuLT5jb3NhLT5sb2NrLCBmbGFncyk7CisJCWNoYW4tPnVzYWdlPTA7CisJCWNoYW4tPmNvc2EtPnVzYWdlLS07CisJCQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFuLT5jb3NhLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBlcnI7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUoZCk7CisJY29zYV9lbmFibGVfcngoY2hhbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29zYV9zcHBwX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbiA9IGRldi0+cHJpdjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWNoYW4tPnR4X3NrYiA9IHNrYjsKKwljb3NhX3N0YXJ0X3R4KGNoYW4sIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjb3NhX3NwcHBfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4gPSBkZXYtPnByaXY7CisKKwlpZiAodGVzdF9iaXQoUlhCSVQsICZjaGFuLT5jb3NhLT5yeHR4KSkgeworCQljaGFuLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJY2hhbi0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycysrOworCX0gZWxzZSB7CisJCWNoYW4tPnN0YXRzLnR4X2Vycm9ycysrOworCQljaGFuLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCX0KKwljb3NhX2tpY2soY2hhbi0+Y29zYSk7CisJaWYgKGNoYW4tPnR4X3NrYikgeworCQlkZXZfa2ZyZWVfc2tiKGNoYW4tPnR4X3NrYik7CisJCWNoYW4tPnR4X3NrYiA9IE5VTEw7CisJfQorCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIGludCBjb3NhX3NwcHBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmQpCit7CisJc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbiA9IGQtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW5ldGlmX3N0b3BfcXVldWUoZCk7CisJc3BwcF9jbG9zZShkKTsKKwljb3NhX2Rpc2FibGVfcngoY2hhbik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW4tPmNvc2EtPmxvY2ssIGZsYWdzKTsKKwlpZiAoY2hhbi0+cnhfc2tiKSB7CisJCWtmcmVlX3NrYihjaGFuLT5yeF9za2IpOworCQljaGFuLT5yeF9za2IgPSBOVUxMOworCX0KKwlpZiAoY2hhbi0+dHhfc2tiKSB7CisJCWtmcmVlX3NrYihjaGFuLT50eF9za2IpOworCQljaGFuLT50eF9za2IgPSBOVUxMOworCX0KKwljaGFuLT51c2FnZT0wOworCWNoYW4tPmNvc2EtPnVzYWdlLS07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+Y29zYS0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciAqc3BwcF9zZXR1cF9yeChzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuLCBpbnQgc2l6ZSkKK3sKKwkvKgorCSAqIFdlIGNhbiBzYWZlbHkgZmFsbCBiYWNrIHRvIG5vbi1kbWEtYWJsZSBtZW1vcnksIGJlY2F1c2Ugd2UgaGF2ZQorCSAqIHRoZSBjb3NhLT5ib3VuY2VidWYgcHJlLWFsbG9jYXRlZC4KKwkgKi8KKwlpZiAoY2hhbi0+cnhfc2tiKQorCQlrZnJlZV9za2IoY2hhbi0+cnhfc2tiKTsKKwljaGFuLT5yeF9za2IgPSBkZXZfYWxsb2Nfc2tiKHNpemUpOworCWlmIChjaGFuLT5yeF9za2IgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0XG4iLAorCQkJY2hhbi0+bmFtZSk7CisJCWNoYW4tPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWNoYW4tPnBwcGRldi5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlyZXR1cm4gc2tiX3B1dChjaGFuLT5yeF9za2IsIHNpemUpOworfQorCitzdGF0aWMgaW50IHNwcHBfcnhfZG9uZShzdHJ1Y3QgY2hhbm5lbF9kYXRhICpjaGFuKQoreworCWlmICghY2hhbi0+cnhfc2tiKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByeF9kb25lIHdpdGggZW1wdHkgc2tiIVxuIiwKKwkJCWNoYW4tPm5hbWUpOworCQljaGFuLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJY2hhbi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCXJldHVybiAwOworCX0KKwljaGFuLT5yeF9za2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfV0FOX1BQUCk7CisJY2hhbi0+cnhfc2tiLT5kZXYgPSBjaGFuLT5wcHBkZXYuZGV2OworCWNoYW4tPnJ4X3NrYi0+bWFjLnJhdyA9IGNoYW4tPnJ4X3NrYi0+ZGF0YTsKKwljaGFuLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJY2hhbi0+c3RhdHMucnhfYnl0ZXMgKz0gY2hhbi0+Y29zYS0+cnhzaXplOworCW5ldGlmX3J4KGNoYW4tPnJ4X3NrYik7CisJY2hhbi0+cnhfc2tiID0gTlVMTDsKKwljaGFuLT5wcHBkZXYuZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlyZXR1cm4gMDsKK30KKworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyBpbnQgc3BwcF90eF9kb25lKHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4sIGludCBzaXplKQoreworCWlmICghY2hhbi0+dHhfc2tiKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0eF9kb25lIHdpdGggZW1wdHkgc2tiIVxuIiwKKwkJCWNoYW4tPm5hbWUpOworCQljaGFuLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJY2hhbi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJcmV0dXJuIDE7CisJfQorCWRldl9rZnJlZV9za2JfaXJxKGNoYW4tPnR4X3NrYik7CisJY2hhbi0+dHhfc2tiID0gTlVMTDsKKwljaGFuLT5zdGF0cy50eF9wYWNrZXRzKys7CisJY2hhbi0+c3RhdHMudHhfYnl0ZXMgKz0gc2l6ZTsKKwluZXRpZl93YWtlX3F1ZXVlKGNoYW4tPnBwcGRldi5kZXYpOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmNvc2FfbmV0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbiA9IGRldi0+cHJpdjsKKwlyZXR1cm4gJmNoYW4tPnN0YXRzOworfQorCisMCisvKi0tLS0tLS0tLS0gQ2hhcmFjdGVyIGRldmljZSAtLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGNoYXJkZXZfY2hhbm5lbF9pbml0KHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4pCit7CisJaW5pdF9NVVRFWCgmY2hhbi0+cnNlbSk7CisJaW5pdF9NVVRFWCgmY2hhbi0+d3NlbSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNvc2FfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwljaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNvc2FfZGF0YSAqY29zYSA9IGNoYW4tPmNvc2E7CisJY2hhciAqa2J1ZjsKKworCWlmICghKGNvc2EtPmZpcm13YXJlX3N0YXR1cyAmIENPU0FfRldfU1RBUlQpKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHN0YXJ0IHRoZSBmaXJtd2FyZSBmaXJzdCAoc3RhdHVzICVkKVxuIiwKKwkJCWNvc2EtPm5hbWUsIGNvc2EtPmZpcm13YXJlX3N0YXR1cyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCWlmIChkb3duX2ludGVycnVwdGlibGUoJmNoYW4tPnJzZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQorCWlmICgoY2hhbi0+cnhkYXRhID0ga21hbGxvYyhDT1NBX01UVSwgR0ZQX0RNQXxHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogY29zYV9yZWFkKCkgLSBPT01cbiIsIGNvc2EtPm5hbWUpOworCQl1cCgmY2hhbi0+cnNlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNoYW4tPnJ4X3N0YXR1cyA9IDA7CisJY29zYV9lbmFibGVfcngoY2hhbik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwlhZGRfd2FpdF9xdWV1ZSgmY2hhbi0+cnh3YWl0cSwgJndhaXQpOworCXdoaWxlKCFjaGFuLT5yeF9zdGF0dXMpIHsKKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwkJc2NoZWR1bGUoKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpICYmIGNoYW4tPnJ4X3N0YXR1cyA9PSAwKSB7CisJCQljaGFuLT5yeF9zdGF0dXMgPSAxOworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmNoYW4tPnJ4d2FpdHEsICZ3YWl0KTsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCQkJdXAoJmNoYW4tPnJzZW0pOworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hhbi0+cnh3YWl0cSwgJndhaXQpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCWtidWYgPSBjaGFuLT5yeGRhdGE7CisJY291bnQgPSBjaGFuLT5yeHNpemU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCXVwKCZjaGFuLT5yc2VtKTsKKworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBrYnVmLCBjb3VudCkpIHsKKwkJa2ZyZWUoa2J1Zik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlrZnJlZShrYnVmKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjaGFyICpjaHJkZXZfc2V0dXBfcngoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbiwgaW50IHNpemUpCit7CisJLyogRXhwZWN0IHNpemUgPD0gQ09TQV9NVFUgKi8KKwljaGFuLT5yeHNpemUgPSBzaXplOworCXJldHVybiBjaGFuLT5yeGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgY2hyZGV2X3J4X2RvbmUoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbikKK3sKKwlpZiAoY2hhbi0+cnhfc3RhdHVzKSB7IC8qIFJlYWRlciBoYXMgZGllZCAqLworCQlrZnJlZShjaGFuLT5yeGRhdGEpOworCQl1cCgmY2hhbi0+d3NlbSk7CisJfQorCWNoYW4tPnJ4X3N0YXR1cyA9IDE7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaGFuLT5yeHdhaXRxKTsKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgc3NpemVfdCBjb3NhX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCWNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNvc2FfZGF0YSAqY29zYSA9IGNoYW4tPmNvc2E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljaGFyICprYnVmOworCisJaWYgKCEoY29zYS0+ZmlybXdhcmVfc3RhdHVzICYgQ09TQV9GV19TVEFSVCkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogc3RhcnQgdGhlIGZpcm13YXJlIGZpcnN0IChzdGF0dXMgJWQpXG4iLAorCQkJY29zYS0+bmFtZSwgY29zYS0+ZmlybXdhcmVfc3RhdHVzKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmY2hhbi0+d3NlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlpZiAoY291bnQgPiBDT1NBX01UVSkKKwkJY291bnQgPSBDT1NBX01UVTsKKwkKKwkvKiBBbGxvY2F0ZSB0aGUgYnVmZmVyICovCisJaWYgKChrYnVmID0ga21hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTHxHRlBfRE1BKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBjb3NhX3dyaXRlKCkgT09NIC0gZHJvcHBpbmcgcGFja2V0XG4iLAorCQkJY29zYS0+bmFtZSk7CisJCXVwKCZjaGFuLT53c2VtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmIChjb3B5X2Zyb21fdXNlcihrYnVmLCBidWYsIGNvdW50KSkgeworCQl1cCgmY2hhbi0+d3NlbSk7CisJCWtmcmVlKGtidWYpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJY2hhbi0+dHhfc3RhdHVzPTA7CisJY29zYV9zdGFydF90eChjaGFuLCBrYnVmLCBjb3VudCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCWFkZF93YWl0X3F1ZXVlKCZjaGFuLT50eHdhaXRxLCAmd2FpdCk7CisJd2hpbGUoIWNoYW4tPnR4X3N0YXR1cykgeworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCQlzY2hlZHVsZSgpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgJiYgY2hhbi0+dHhfc3RhdHVzID09IDApIHsKKwkJCWNoYW4tPnR4X3N0YXR1cyA9IDE7CisJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hhbi0+dHh3YWl0cSwgJndhaXQpOworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJCQljaGFuLT50eF9zdGF0dXMgPSAxOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hhbi0+dHh3YWl0cSwgJndhaXQpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCXVwKCZjaGFuLT53c2VtKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisJa2ZyZWUoa2J1Zik7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IGNocmRldl90eF9kb25lKHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4sIGludCBzaXplKQoreworCWlmIChjaGFuLT50eF9zdGF0dXMpIHsgLyogV3JpdGVyIHdhcyBpbnRlcnJ1cHRlZCAqLworCQlrZnJlZShjaGFuLT50eGJ1Zik7CisJCXVwKCZjaGFuLT53c2VtKTsKKwl9CisJY2hhbi0+dHhfc3RhdHVzID0gMTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoYW4tPnR4d2FpdHEpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGNvc2FfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqcG9sbCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJjb3NhX3BvbGwgaXMgaGVyZVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29zYV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBjb3NhX2RhdGEgKmNvc2E7CisJc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBuOworCisJaWYgKChuPWltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk+PkNBUkRfTUlOT1JfQklUUykKKwkJPj0gbnJfY2FyZHMpCisJCXJldHVybiAtRU5PREVWOworCWNvc2EgPSBjb3NhX2NhcmRzK247CisKKwlpZiAoKG49aW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKQorCQkmICgoMTw8Q0FSRF9NSU5PUl9CSVRTKS0xKSkgPj0gY29zYS0+bmNoYW5uZWxzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwljaGFuID0gY29zYS0+Y2hhbiArIG47CisJCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2hhbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoY2hhbi0+dXNhZ2UgPCAwKSB7IC8qIGluIG5ldGRldiBtb2RlICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJY29zYS0+dXNhZ2UrKzsKKwljaGFuLT51c2FnZSsrOworCisJY2hhbi0+dHhfZG9uZSA9IGNocmRldl90eF9kb25lOworCWNoYW4tPnNldHVwX3J4ID0gY2hyZGV2X3NldHVwX3J4OworCWNoYW4tPnJ4X2RvbmUgPSBjaHJkZXZfcnhfZG9uZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29zYV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW5uZWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNvc2FfZGF0YSAqY29zYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY29zYSA9IGNoYW5uZWwtPmNvc2E7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwljb3NhLT51c2FnZS0tOworCWNoYW5uZWwtPnVzYWdlLS07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09TQV9GQVNZTkNfV09SS0lORworc3RhdGljIHN0cnVjdCBmYXN5bmNfc3RydWN0ICpmYXN5bmNbMjU2XSA9IHsgTlVMTCwgfTsKKworLyogVG8gYmUgZG9uZSAuLi4gKi8KK3N0YXRpYyBpbnQgY29zYV9mYXN5bmMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBvbikKK3sKKyAgICAgICAgaW50IHBvcnQgPSBpbWlub3IoaW5vZGUpOworICAgICAgICBpbnQgcnYgPSBmYXN5bmNfaGVscGVyKGlub2RlLCBmaWxlLCBvbiwgJmZhc3luY1twb3J0XSk7CisgICAgICAgIHJldHVybiBydiA8IDAgPyBydiA6IDA7Cit9CisjZW5kaWYKKworDAorLyogLS0tLS0tLS0tLSBJb2N0bHMgLS0tLS0tLS0tLSAqLworCisvKgorICogSW9jdGwgc3Vicm91dGluZXMgY2FuIHNhZmVseSBiZSBtYWRlIGlubGluZSwgYmVjYXVzZSB0aGV5IGFyZSBjYWxsZWQKKyAqIG9ubHkgZnJvbSBjb3NhX2lvY3RsKCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvc2FfcmVzZXQoc3RydWN0IGNvc2FfZGF0YSAqY29zYSkKK3sKKwljaGFyIGlkc3RyaW5nW0NPU0FfTUFYX0lEX1NUUklOR107CisJaWYgKGNvc2EtPnVzYWdlID4gMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiBXQVJOSU5HOiByZXNldCByZXF1ZXN0ZWQgd2l0aCBjb3NhLT51c2FnZSA+IDEgKCVkKS4gT2RkIHRoaW5ncyBtYXkgaGFwcGVuLlxuIiwKKwkJCWNvc2EtPm51bSwgY29zYS0+dXNhZ2UpOworCWNvc2EtPmZpcm13YXJlX3N0YXR1cyAmPSB+KENPU0FfRldfUkVTRVR8Q09TQV9GV19TVEFSVCk7CisJaWYgKGNvc2FfcmVzZXRfYW5kX3JlYWRfaWQoY29zYSwgaWRzdHJpbmcpIDwgMCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImNvc2ElZDogcmVzZXQgZmFpbGVkXG4iLCBjb3NhLT5udW0pOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiByZXNldHRpbmcgZGV2aWNlOiAlc1xuIiwgY29zYS0+bnVtLAorCQlpZHN0cmluZyk7CisJY29zYS0+ZmlybXdhcmVfc3RhdHVzIHw9IENPU0FfRldfUkVTRVQ7CisJcmV0dXJuIDA7Cit9CisKKy8qIEhpZ2gtbGV2ZWwgZnVuY3Rpb24gdG8gZG93bmxvYWQgZGF0YSBpbnRvIENPU0EgbWVtb3J5LiBDYWxscyBkb3dubG9hZCgpICovCitzdGF0aWMgaW5saW5lIGludCBjb3NhX2Rvd25sb2FkKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGNvc2FfZG93bmxvYWQgZDsKKwlpbnQgaTsKKworCWlmIChjb3NhLT51c2FnZSA+IDEpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBXQVJOSU5HOiBkb3dubG9hZCBvZiBtaWNyb2NvZGUgcmVxdWVzdGVkIHdpdGggY29zYS0+dXNhZ2UgPiAxICglZCkuIE9kZCB0aGluZ3MgbWF5IGhhcHBlbi5cbiIsCisJCQljb3NhLT5uYW1lLCBjb3NhLT51c2FnZSk7CisJaWYgKCEoY29zYS0+ZmlybXdhcmVfc3RhdHVzICYgQ09TQV9GV19SRVNFVCkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogcmVzZXQgdGhlIGNhcmQgZmlyc3QgKHN0YXR1cyAlZCkuXG4iLAorCQkJY29zYS0+bmFtZSwgY29zYS0+ZmlybXdhcmVfc3RhdHVzKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisJCisJaWYgKGNvcHlfZnJvbV91c2VyKCZkLCBhcmcsIHNpemVvZihkKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGQuYWRkciA8IDAgfHwgZC5hZGRyID4gQ09TQV9NQVhfRklSTVdBUkVfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGQubGVuIDwgMCB8fCBkLmxlbiA+IENPU0FfTUFYX0ZJUk1XQVJFX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisKKwkvKiBJZiBzb21ldGhpbmcgZmFpbHMsIGZvcmNlIHRoZSB1c2VyIHRvIHJlc2V0IHRoZSBjYXJkICovCisJY29zYS0+ZmlybXdhcmVfc3RhdHVzICY9IH4oQ09TQV9GV19SRVNFVHxDT1NBX0ZXX0RPV05MT0FEKTsKKworCWkgPSBkb3dubG9hZChjb3NhLCBkLmNvZGUsIGQubGVuLCBkLmFkZHIpOworCWlmIChpIDwgMCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImNvc2ElZDogbWljcm9jb2RlIGRvd25sb2FkIGZhaWxlZDogJWRcbiIsCisJCQljb3NhLT5udW0sIGkpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiBkb3dubG9hZGluZyBtaWNyb2NvZGUgLSAweCUwNHggYnl0ZXMgYXQgMHglMDR4XG4iLAorCQljb3NhLT5udW0sIGQubGVuLCBkLmFkZHIpOworCWNvc2EtPmZpcm13YXJlX3N0YXR1cyB8PSBDT1NBX0ZXX1JFU0VUfENPU0FfRldfRE9XTkxPQUQ7CisJcmV0dXJuIDA7Cit9CisKKy8qIEhpZ2gtbGV2ZWwgZnVuY3Rpb24gdG8gcmVhZCBDT1NBIG1lbW9yeS4gQ2FsbHMgcmVhZG1lbSgpICovCitzdGF0aWMgaW5saW5lIGludCBjb3NhX3JlYWRtZW0oc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgY29zYV9kb3dubG9hZCBkOworCWludCBpOworCisJaWYgKGNvc2EtPnVzYWdlID4gMSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiBXQVJOSU5HOiByZWFkbWVtIHJlcXVlc3RlZCB3aXRoICIKKwkJCSJjb3NhLT51c2FnZSA+IDEgKCVkKS4gT2RkIHRoaW5ncyBtYXkgaGFwcGVuLlxuIiwKKwkJCWNvc2EtPm51bSwgY29zYS0+dXNhZ2UpOworCWlmICghKGNvc2EtPmZpcm13YXJlX3N0YXR1cyAmIENPU0FfRldfUkVTRVQpKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IHJlc2V0IHRoZSBjYXJkIGZpcnN0IChzdGF0dXMgJWQpLlxuIiwKKwkJCWNvc2EtPm5hbWUsIGNvc2EtPmZpcm13YXJlX3N0YXR1cyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCZkLCBhcmcsIHNpemVvZihkKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogSWYgc29tZXRoaW5nIGZhaWxzLCBmb3JjZSB0aGUgdXNlciB0byByZXNldCB0aGUgY2FyZCAqLworCWNvc2EtPmZpcm13YXJlX3N0YXR1cyAmPSB+Q09TQV9GV19SRVNFVDsKKworCWkgPSByZWFkbWVtKGNvc2EsIGQuY29kZSwgZC5sZW4sIGQuYWRkcik7CisJaWYgKGkgPCAwKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiY29zYSVkOiByZWFkaW5nIG1lbW9yeSBmYWlsZWQ6ICVkXG4iLAorCQkJY29zYS0+bnVtLCBpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXByaW50ayhLRVJOX0lORk8gImNvc2ElZDogcmVhZGluZyBjYXJkIG1lbW9yeSAtIDB4JTA0eCBieXRlcyBhdCAweCUwNHhcbiIsCisJCWNvc2EtPm51bSwgZC5sZW4sIGQuYWRkcik7CisJY29zYS0+ZmlybXdhcmVfc3RhdHVzIHw9IENPU0FfRldfUkVTRVQ7CisJcmV0dXJuIDA7Cit9CisKKy8qIEhpZ2gtbGV2ZWwgZnVuY3Rpb24gdG8gc3RhcnQgbWljcm9jb2RlLiBDYWxscyBzdGFydG1pY3JvY29kZSgpLiAqLworc3RhdGljIGlubGluZSBpbnQgY29zYV9zdGFydChzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgYWRkcmVzcykKK3sKKwlpbnQgaTsKKworCWlmIChjb3NhLT51c2FnZSA+IDEpCisJCXByaW50ayhLRVJOX0lORk8gImNvc2ElZDogV0FSTklORzogc3RhcnQgbWljcm9jb2RlIHJlcXVlc3RlZCB3aXRoIGNvc2EtPnVzYWdlID4gMSAoJWQpLiBPZGQgdGhpbmdzIG1heSBoYXBwZW4uXG4iLAorCQkJY29zYS0+bnVtLCBjb3NhLT51c2FnZSk7CisKKwlpZiAoKGNvc2EtPmZpcm13YXJlX3N0YXR1cyAmIChDT1NBX0ZXX1JFU0VUfENPU0FfRldfRE9XTkxPQUQpKQorCQkhPSAoQ09TQV9GV19SRVNFVHxDT1NBX0ZXX0RPV05MT0FEKSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBkb3dubG9hZCB0aGUgbWljcm9jb2RlIGFuZC9vciByZXNldCB0aGUgY2FyZCBmaXJzdCAoc3RhdHVzICVkKS5cbiIsCisJCQljb3NhLT5uYW1lLCBjb3NhLT5maXJtd2FyZV9zdGF0dXMpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKwljb3NhLT5maXJtd2FyZV9zdGF0dXMgJj0gfkNPU0FfRldfUkVTRVQ7CisJaWYgKChpPXN0YXJ0bWljcm9jb2RlKGNvc2EsIGFkZHJlc3MpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJjb3NhJWQ6IHN0YXJ0IG1pY3JvY29kZSBhdCAweCUwNHggZmFpbGVkOiAlZFxuIiwKKwkJCWNvc2EtPm51bSwgYWRkcmVzcywgaSk7CisJCXJldHVybiAtRUlPOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJjb3NhJWQ6IHN0YXJ0aW5nIG1pY3JvY29kZSBhdCAweCUwNHhcbiIsCisJCWNvc2EtPm51bSwgYWRkcmVzcyk7CisJY29zYS0+c3RhcnRhZGRyID0gYWRkcmVzczsKKwljb3NhLT5maXJtd2FyZV9zdGF0dXMgfD0gQ09TQV9GV19TVEFSVDsKKwlyZXR1cm4gMDsKK30KKwkJCisvKiBCdWZmZXIgb2Ygc2l6ZSBhdCBsZWFzdCBDT1NBX01BWF9JRF9TVFJJTkcgaXMgZXhwZWN0ZWQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvc2FfZ2V0aWRzdHIoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgY2hhciBfX3VzZXIgKnN0cmluZykKK3sKKwlpbnQgbCA9IHN0cmxlbihjb3NhLT5pZF9zdHJpbmcpKzE7CisJaWYgKGNvcHlfdG9fdXNlcihzdHJpbmcsIGNvc2EtPmlkX3N0cmluZywgbCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiBsOworfQorCisvKiBCdWZmZXIgb2Ygc2l6ZSBhdCBsZWFzdCBDT1NBX01BWF9JRF9TVFJJTkcgaXMgZXhwZWN0ZWQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvc2FfZ2V0dHlwZShzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBjaGFyIF9fdXNlciAqc3RyaW5nKQoreworCWludCBsID0gc3RybGVuKGNvc2EtPnR5cGUpKzE7CisJaWYgKGNvcHlfdG9fdXNlcihzdHJpbmcsIGNvc2EtPnR5cGUsIGwpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gbDsKK30KKworc3RhdGljIGludCBjb3NhX2lvY3RsX2NvbW1vbihzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLAorCXN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW5uZWwsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCXN3aXRjaChjbWQpIHsKKwljYXNlIENPU0FJT1JTRVQ6CS8qIFJlc2V0IHRoZSBkZXZpY2UgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCXJldHVybiBjb3NhX3Jlc2V0KGNvc2EpOworCWNhc2UgQ09TQUlPU1RSVDoJLyogU3RhcnQgdGhlIGZpcm13YXJlICovCisJCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQlyZXR1cm4gY29zYV9zdGFydChjb3NhLCBhcmcpOworCWNhc2UgQ09TQUlPRE9XTkxEOgkvKiBEb3dubG9hZCB0aGUgZmlybXdhcmUgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCQorCQlyZXR1cm4gY29zYV9kb3dubG9hZChjb3NhLCBhcmdwKTsKKwljYXNlIENPU0FJT1JNRU06CisJCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQlyZXR1cm4gY29zYV9yZWFkbWVtKGNvc2EsIGFyZ3ApOworCWNhc2UgQ09TQUlPUlRZUEU6CisJCXJldHVybiBjb3NhX2dldHR5cGUoY29zYSwgYXJncCk7CisJY2FzZSBDT1NBSU9SSURTVFI6CisJCXJldHVybiBjb3NhX2dldGlkc3RyKGNvc2EsIGFyZ3ApOworCWNhc2UgQ09TQUlPTlJDQVJEUzoKKwkJcmV0dXJuIG5yX2NhcmRzOworCWNhc2UgQ09TQUlPTlJDSEFOUzoKKwkJcmV0dXJuIGNvc2EtPm5jaGFubmVsczsKKwljYXNlIENPU0FJT0JNU0VUOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJaWYgKGlzXzhiaXQoY29zYSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGFyZyAhPSBDT1NBX0JNX09GRiAmJiBhcmcgIT0gQ09TQV9CTV9PTikKKwkJCXJldHVybiAtRUlOVkFMOworCQljb3NhLT5idXNtYXN0ZXIgPSBhcmc7CisJCXJldHVybiAwOworCWNhc2UgQ09TQUlPQk1HRVQ6CisJCXJldHVybiBjb3NhLT5idXNtYXN0ZXI7CisJfQorCXJldHVybiAtRU5PSU9DVExDTUQ7Cit9CisKK3N0YXRpYyBpbnQgY29zYV9zcHBwX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLAorCWludCBjbWQpCit7CisJaW50IHJ2OworCXN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4gPSBkZXYtPnByaXY7CisJcnYgPSBjb3NhX2lvY3RsX2NvbW1vbihjaGFuLT5jb3NhLCBjaGFuLCBjbWQsICh1bnNpZ25lZCBsb25nKWlmci0+aWZyX2RhdGEpOworCWlmIChydiA9PSAtRU5PSU9DVExDTUQpIHsKKwkJcmV0dXJuIHNwcHBfZG9faW9jdGwoZGV2LCBpZnIsIGNtZCk7CisJfQorCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBjb3NhX2NoYXJkZXZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbm5lbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY29zYV9kYXRhICpjb3NhID0gY2hhbm5lbC0+Y29zYTsKKwlyZXR1cm4gY29zYV9pb2N0bF9jb21tb24oY29zYSwgY2hhbm5lbCwgY21kLCBhcmcpOworfQorCisMCisvKi0tLS0tLS0tLS0gSFcgbGF5ZXIgaW50ZXJmYWNlIC0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFRoZSBoaWdoZXIgbGF5ZXIgY2FuIGJpbmQgaXRzZWxmIHRvIHRoZSBIVyBsYXllciBieSBzZXR0aW5nIHRoZSBjYWxsYmFja3MKKyAqIGluIHRoZSBjaGFubmVsX2RhdGEgc3RydWN0dXJlIGFuZCBieSB1c2luZyB0aGVzZSByb3V0aW5lcy4KKyAqLworc3RhdGljIHZvaWQgY29zYV9lbmFibGVfcngoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbikKK3sKKwlzdHJ1Y3QgY29zYV9kYXRhICpjb3NhID0gY2hhbi0+Y29zYTsKKworCWlmICghdGVzdF9hbmRfc2V0X2JpdChjaGFuLT5udW0sICZjb3NhLT5yeGJpdG1hcCkpCisJCXB1dF9kcml2ZXJfc3RhdHVzKGNvc2EpOworfQorCitzdGF0aWMgdm9pZCBjb3NhX2Rpc2FibGVfcngoc3RydWN0IGNoYW5uZWxfZGF0YSAqY2hhbikKK3sKKwlzdHJ1Y3QgY29zYV9kYXRhICpjb3NhID0gY2hhbi0+Y29zYTsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoY2hhbi0+bnVtLCAmY29zYS0+cnhiaXRtYXApKQorCQlwdXRfZHJpdmVyX3N0YXR1cyhjb3NhKTsKK30KKworLyoKKyAqIEZJWE1FOiBUaGlzIHJvdXRpbmUgcHJvYmFibHkgc2hvdWxkIGNoZWNrIGZvciBjb3NhX3N0YXJ0X3R4KCkgY2FsbGVkIHdoZW4KKyAqIHRoZSBwcmV2aW91cyB0cmFuc21pdCBpcyBzdGlsbCB1bmZpbmlzaGVkLiBJbiB0aGlzIGNhc2UgdGhlIG5vbi16ZXJvCisgKiByZXR1cm4gdmFsdWUgc2hvdWxkIGluZGljYXRlIHRvIHRoZSBjYWxsZXIgdGhhdCB0aGUgcXVldWluZyhzcD8pIHVwCisgKiB0aGUgdHJhbnNtaXQgaGFzIGZhaWxlZC4KKyAqLworc3RhdGljIGludCBjb3NhX3N0YXJ0X3R4KHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4sIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgY29zYV9kYXRhICpjb3NhID0gY2hhbi0+Y29zYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2lmZGVmIERFQlVHX0RBVEEKKwlpbnQgaTsKKworCXByaW50ayhLRVJOX0lORk8gImNvc2ElZGMlZDogc3RhcnRpbmcgdHgoMHgleCkiLCBjaGFuLT5jb3NhLT5udW0sCisJCWNoYW4tPm51bSwgbGVuKTsKKwlmb3IgKGk9MDsgaTxsZW47IGkrKykKKwkJcHJpbnRrKCIgJTAyeCIsIGJ1ZltpXSYweGZmKTsKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCWNoYW4tPnR4YnVmID0gYnVmOworCWNoYW4tPnR4c2l6ZSA9IGxlbjsKKwlpZiAobGVuID4gQ09TQV9NVFUpCisJCWNoYW4tPnR4c2l6ZSA9IENPU0FfTVRVOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKworCS8qIFRlbGwgdGhlIGZpcm13YXJlIHdlIGFyZSByZWFkeSAqLworCXNldF9iaXQoY2hhbi0+bnVtLCAmY29zYS0+dHhiaXRtYXApOworCXB1dF9kcml2ZXJfc3RhdHVzKGNvc2EpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9kcml2ZXJfc3RhdHVzKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc3RhdHVzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKworCXN0YXR1cyA9IChjb3NhLT5yeGJpdG1hcCA/IERSSVZFUl9SWF9SRUFEWSA6IDApCisJCXwgKGNvc2EtPnR4Yml0bWFwID8gRFJJVkVSX1RYX1JFQURZIDogMCkKKwkJfCAoY29zYS0+dHhiaXRtYXA/IH4oY29zYS0+dHhiaXRtYXA8PERSSVZFUl9UWE1BUF9TSElGVCkKKwkJCSZEUklWRVJfVFhNQVBfTUFTSyA6IDApOworCWlmICghY29zYS0+cnh0eCkgeworCQlpZiAoY29zYS0+cnhiaXRtYXB8Y29zYS0+dHhiaXRtYXApIHsKKwkJCWlmICghY29zYS0+ZW5hYmxlZCkgeworCQkJCWNvc2FfcHV0c3RhdHVzKGNvc2EsIFNSX1JYX0lOVF9FTkEpOworI2lmZGVmIERFQlVHX0lPCisJCQkJZGVidWdfc3RhdHVzX291dChjb3NhLCBTUl9SWF9JTlRfRU5BKTsKKyNlbmRpZgorCQkJCWNvc2EtPmVuYWJsZWQgPSAxOworCQkJfQorCQl9IGVsc2UgaWYgKGNvc2EtPmVuYWJsZWQpIHsKKwkJCWNvc2EtPmVuYWJsZWQgPSAwOworCQkJY29zYV9wdXRzdGF0dXMoY29zYSwgMCk7CisjaWZkZWYgREVCVUdfSU8KKwkJCWRlYnVnX3N0YXR1c19vdXQoY29zYSwgMCk7CisjZW5kaWYKKwkJfQorCQljb3NhX3B1dGRhdGE4KGNvc2EsIHN0YXR1cyk7CisjaWZkZWYgREVCVUdfSU8KKwkJZGVidWdfZGF0YV9jbWQoY29zYSwgc3RhdHVzKTsKKyNlbmRpZgorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3NhLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9kcml2ZXJfc3RhdHVzX25vbG9jayhzdHJ1Y3QgY29zYV9kYXRhICpjb3NhKQoreworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSAoY29zYS0+cnhiaXRtYXAgPyBEUklWRVJfUlhfUkVBRFkgOiAwKQorCQl8IChjb3NhLT50eGJpdG1hcCA/IERSSVZFUl9UWF9SRUFEWSA6IDApCisJCXwgKGNvc2EtPnR4Yml0bWFwPyB+KGNvc2EtPnR4Yml0bWFwPDxEUklWRVJfVFhNQVBfU0hJRlQpCisJCQkmRFJJVkVSX1RYTUFQX01BU0sgOiAwKTsKKworCWlmIChjb3NhLT5yeGJpdG1hcHxjb3NhLT50eGJpdG1hcCkgeworCQljb3NhX3B1dHN0YXR1cyhjb3NhLCBTUl9SWF9JTlRfRU5BKTsKKyNpZmRlZiBERUJVR19JTworCQlkZWJ1Z19zdGF0dXNfb3V0KGNvc2EsIFNSX1JYX0lOVF9FTkEpOworI2VuZGlmCisJCWNvc2EtPmVuYWJsZWQgPSAxOworCX0gZWxzZSB7CisJCWNvc2FfcHV0c3RhdHVzKGNvc2EsIDApOworI2lmZGVmIERFQlVHX0lPCisJCWRlYnVnX3N0YXR1c19vdXQoY29zYSwgMCk7CisjZW5kaWYKKwkJY29zYS0+ZW5hYmxlZCA9IDA7CisJfQorCWNvc2FfcHV0ZGF0YTgoY29zYSwgc3RhdHVzKTsKKyNpZmRlZiBERUJVR19JTworCWRlYnVnX2RhdGFfY21kKGNvc2EsIHN0YXR1cyk7CisjZW5kaWYKK30KKworLyoKKyAqIFRoZSAia2lja21lIiBmdW5jdGlvbjogV2hlbiB0aGUgRE1BIHRpbWVzIG91dCwgdGhpcyBpcyBjYWxsZWQgdG8KKyAqIGNsZWFuIHVwIHRoZSBkcml2ZXIgc3RhdHVzLgorICogRklYTUU6IFByZWxpbWluYXJ5IHN1cHBvcnQsIHRoZSBpbnRlcmZhY2UgaXMgcHJvYmFibHkgd3JvbmcuCisgKi8KK3N0YXRpYyB2b2lkIGNvc2Ffa2ljayhzdHJ1Y3QgY29zYV9kYXRhICpjb3NhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGZsYWdzMTsKKwljaGFyICpzID0gIihwcm9iYWJseSkgSVJRIjsKKworCWlmICh0ZXN0X2JpdChSWEJJVCwgJmNvc2EtPnJ4dHgpKQorCQlzID0gIlJYIERNQSI7CisJaWYgKHRlc3RfYml0KFRYQklULCAmY29zYS0+cnh0eCkpCisJCXMgPSAiVFggRE1BIjsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyB0aW1lb3V0IC0gcmVzdGFydGluZy5cbiIsIGNvc2EtPm5hbWUsIHMpOyAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCWNvc2EtPnJ4dHggPSAwOworCisJZmxhZ3MxID0gY2xhaW1fZG1hX2xvY2soKTsKKwlkaXNhYmxlX2RtYShjb3NhLT5kbWEpOworCWNsZWFyX2RtYV9mZihjb3NhLT5kbWEpOworCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MxKTsKKworCS8qIEZJWE1FOiBBbnl0aGluZyBlbHNlPyAqLworCXVkZWxheSgxMDApOworCWNvc2FfcHV0c3RhdHVzKGNvc2EsIDApOworCXVkZWxheSgxMDApOworCSh2b2lkKSBjb3NhX2dldGRhdGE4KGNvc2EpOworCXVkZWxheSgxMDApOworCWNvc2FfcHV0ZGF0YTgoY29zYSwgMCk7CisJdWRlbGF5KDEwMCk7CisJcHV0X2RyaXZlcl9zdGF0dXNfbm9sb2NrKGNvc2EpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZSB3aG9sZSBidWZmZXIgaXMgRE1BLWFibGUuIEl0IG1lYW5zIGl0IGlzIGJlbG93IHRoZSAxNk0gb2YKKyAqIHBoeXNpY2FsIG1lbW9yeSBhbmQgZG9lc24ndCBzcGFuIHRoZSA2NGsgYm91bmRhcnkuIEZvciBub3cgaXQgc2VlbXMKKyAqIFNLQidzIG5ldmVyIGRvIHRoaXMsIGJ1dCB3ZSdsbCBjaGVjayB0aGlzIGFueXdheS4KKyAqLworc3RhdGljIGludCBjb3NhX2RtYV9hYmxlKHN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4sIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdGF0aWMgaW50IGNvdW50OworCXVuc2lnbmVkIGxvbmcgYiA9ICh1bnNpZ25lZCBsb25nKWJ1ZjsKKwlpZiAoYitsZW4gPj0gTUFYX0RNQV9BRERSRVNTKQorCQlyZXR1cm4gMDsKKwlpZiAoKGJeIChiK2xlbikpICYgMHgxMDAwMCkgeworCQlpZiAoY291bnQrKyA8IDUpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcGFja2V0IHNwYW5uaW5nIGEgNjRrIGJvdW5kYXJ5XG4iLAorCQkJCWNoYW4tPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKwwKKy8qIC0tLS0tLS0tLS0gVGhlIFNSUC9DT1NBIFJPTSBtb25pdG9yIGZ1bmN0aW9ucyAtLS0tLS0tLS0tICovCisKKy8qCisgKiBEb3dubG9hZGluZyBTUlAgbWljcm9jb2RlOiBzYXkgInciIHRvIFNSUCBtb25pdG9yLCBpdCBhbnN3ZXJzIGJ5ICJ3PSIsCisgKiBkcml2ZXJzIG5lZWQgdG8gc2F5IDQtZGlnaXQgaGV4IG51bWJlciBtZWFuaW5nIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG1pY3JvY29kZQorICogc2VwYXJhdGVkIGJ5IGEgc2luZ2xlIHNwYWNlLiBNb25pdG9yIHJlcGxpZXMgYnkgc2F5aW5nICIgPSIuIE5vdyBkcml2ZXIKKyAqIGhhcyB0byB3cml0ZSA0LWRpZ2l0IGhleCBudW1iZXIgbWVhbmluZyB0aGUgbGFzdCBieXRlIGFkZHJlc3MgZW5kZWQKKyAqIGJ5IGEgc2luZ2xlIHNwYWNlLiBNb25pdG9yIGhhcyB0byByZXBseSB3aXRoIGEgc3BhY2UuIE5vdyB0aGUgZG93bmxvYWQKKyAqIGJlZ2lucy4gQWZ0ZXIgdGhlIGRvd25sb2FkIG1vbml0b3IgcmVwbGllcyB3aXRoICJcclxuLiIgKENSIExGIGRvdCkuCisgKi8KK3N0YXRpYyBpbnQgZG93bmxvYWQoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgY29uc3QgY2hhciBfX3VzZXIgKm1pY3JvY29kZSwgaW50IGxlbmd0aCwgaW50IGFkZHJlc3MpCit7CisJaW50IGk7CisKKwlpZiAocHV0X3dhaXRfZGF0YShjb3NhLCAndycpID09IC0xKSByZXR1cm4gLTE7CisJaWYgKChpPWdldF93YWl0X2RhdGEoY29zYSkpICE9ICd3JykgeyBwcmludGsoImRubGQ6IDB4JTA0eFxuIixpKTsgcmV0dXJuIC0yO30KKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnPScpIHJldHVybiAtMzsKKworCWlmIChwdXRoZXhudW1iZXIoY29zYSwgYWRkcmVzcykgPCAwKSByZXR1cm4gLTQ7CisJaWYgKHB1dF93YWl0X2RhdGEoY29zYSwgJyAnKSA9PSAtMSkgcmV0dXJuIC0xMDsKKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnICcpIHJldHVybiAtMTE7CisJaWYgKGdldF93YWl0X2RhdGEoY29zYSkgIT0gJz0nKSByZXR1cm4gLTEyOworCisJaWYgKHB1dGhleG51bWJlcihjb3NhLCBhZGRyZXNzK2xlbmd0aC0xKSA8IDApIHJldHVybiAtMTM7CisJaWYgKHB1dF93YWl0X2RhdGEoY29zYSwgJyAnKSA9PSAtMSkgcmV0dXJuIC0xODsKKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnICcpIHJldHVybiAtMTk7CisKKwl3aGlsZSAobGVuZ3RoLS0pIHsKKwkJY2hhciBjOworI2lmbmRlZiBTUlBfRE9XTkxPQURfQVRfQk9PVAorCQlpZiAoZ2V0X3VzZXIoYywgbWljcm9jb2RlKSkKKwkJCXJldHVybiAtMjM7IC8qID8/PyAqLworI2Vsc2UKKwkJYyA9ICptaWNyb2NvZGU7CisjZW5kaWYKKwkJaWYgKHB1dF93YWl0X2RhdGEoY29zYSwgYykgPT0gLTEpCisJCQlyZXR1cm4gLTIwOworCQltaWNyb2NvZGUrKzsKKwl9CisKKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnXHInKSByZXR1cm4gLTIxOworCWlmIChnZXRfd2FpdF9kYXRhKGNvc2EpICE9ICdcbicpIHJldHVybiAtMjI7CisJaWYgKGdldF93YWl0X2RhdGEoY29zYSkgIT0gJy4nKSByZXR1cm4gLTIzOworI2lmIDAKKwlwcmludGsoS0VSTl9ERUJVRyAiY29zYSVkOiBkb3dubG9hZCBjb21wbGV0ZWQuXG4iLCBjb3NhLT5udW0pOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFN0YXJ0aW5nIG1pY3JvY29kZSBpcyBkb25lIHZpYSB0aGUgImciIGNvbW1hbmQgb2YgdGhlIFNSUCBtb25pdG9yLgorICogVGhlIGNoYXQgc2hvdWxkIGJlIHRoZSBmb2xsb3dpbmc6ICJnIiAiZz0iICI8YWRkcj48Q1I+IgorICogIjxDUj48Q1I+PExGPjxDUj48TEY+Ii4KKyAqLworc3RhdGljIGludCBzdGFydG1pY3JvY29kZShzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgYWRkcmVzcykKK3sKKwlpZiAocHV0X3dhaXRfZGF0YShjb3NhLCAnZycpID09IC0xKSByZXR1cm4gLTE7CisJaWYgKGdldF93YWl0X2RhdGEoY29zYSkgIT0gJ2cnKSByZXR1cm4gLTI7CisJaWYgKGdldF93YWl0X2RhdGEoY29zYSkgIT0gJz0nKSByZXR1cm4gLTM7CisKKwlpZiAocHV0aGV4bnVtYmVyKGNvc2EsIGFkZHJlc3MpIDwgMCkgcmV0dXJuIC00OworCWlmIChwdXRfd2FpdF9kYXRhKGNvc2EsICdccicpID09IC0xKSByZXR1cm4gLTU7CisJCisJaWYgKGdldF93YWl0X2RhdGEoY29zYSkgIT0gJ1xyJykgcmV0dXJuIC02OworCWlmIChnZXRfd2FpdF9kYXRhKGNvc2EpICE9ICdccicpIHJldHVybiAtNzsKKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnXG4nKSByZXR1cm4gLTg7CisJaWYgKGdldF93YWl0X2RhdGEoY29zYSkgIT0gJ1xyJykgcmV0dXJuIC05OworCWlmIChnZXRfd2FpdF9kYXRhKGNvc2EpICE9ICdcbicpIHJldHVybiAtMTA7CisjaWYgMAorCXByaW50ayhLRVJOX0RFQlVHICJjb3NhJWQ6IG1pY3JvY29kZSBzdGFydGVkXG4iLCBjb3NhLT5udW0pOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkaW5nIG1lbW9yeSBpcyBkb25lIHZpYSB0aGUgInIiIGNvbW1hbmQgb2YgdGhlIFNSUCBtb25pdG9yLgorICogVGhlIGNoYXQgaXMgdGhlIGZvbGxvd2luZyAiciIgInI9IiAiPGFkZHI+ICIgIiA9IiAiPGxhc3RfYnl0ZT4gIiAiICIKKyAqIFRoZW4gZHJpdmVyIGNhbiByZWFkIHRoZSBkYXRhIGFuZCB0aGUgY29udmVyc2F0aW9uIGlzIGZpbmlzaGVkCisgKiBieSBTUlAgbW9uaXRvciBzZW5kaW5nICI8Q1I+PExGPi4iIChkb3QgYXQgdGhlIGVuZCkuCisgKgorICogVGhpcyByb3V0aW5lIGlzIG5vdCBuZWVkZWQgZHVyaW5nIHRoZSBub3JtYWwgb3BlcmF0aW9uIGFuZCBzZXJ2ZXMKKyAqIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seS4KKyAqLworc3RhdGljIGludCByZWFkbWVtKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGNoYXIgX191c2VyICptaWNyb2NvZGUsIGludCBsZW5ndGgsIGludCBhZGRyZXNzKQoreworCWlmIChwdXRfd2FpdF9kYXRhKGNvc2EsICdyJykgPT0gLTEpIHJldHVybiAtMTsKKwlpZiAoKGdldF93YWl0X2RhdGEoY29zYSkpICE9ICdyJykgcmV0dXJuIC0yOworCWlmICgoZ2V0X3dhaXRfZGF0YShjb3NhKSkgIT0gJz0nKSByZXR1cm4gLTM7CisKKwlpZiAocHV0aGV4bnVtYmVyKGNvc2EsIGFkZHJlc3MpIDwgMCkgcmV0dXJuIC00OworCWlmIChwdXRfd2FpdF9kYXRhKGNvc2EsICcgJykgPT0gLTEpIHJldHVybiAtNTsKKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnICcpIHJldHVybiAtNjsKKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnPScpIHJldHVybiAtNzsKKworCWlmIChwdXRoZXhudW1iZXIoY29zYSwgYWRkcmVzcytsZW5ndGgtMSkgPCAwKSByZXR1cm4gLTg7CisJaWYgKHB1dF93YWl0X2RhdGEoY29zYSwgJyAnKSA9PSAtMSkgcmV0dXJuIC05OworCWlmIChnZXRfd2FpdF9kYXRhKGNvc2EpICE9ICcgJykgcmV0dXJuIC0xMDsKKworCXdoaWxlIChsZW5ndGgtLSkgeworCQljaGFyIGM7CisJCWludCBpOworCQlpZiAoKGk9Z2V0X3dhaXRfZGF0YShjb3NhKSkgPT0gLTEpIHsKKwkJCXByaW50ayAoS0VSTl9JTkZPICJjb3NhOiAweCUwNHggYnl0ZXMgcmVtYWluaW5nXG4iLAorCQkJCWxlbmd0aCk7CisJCQlyZXR1cm4gLTExOworCQl9CisJCWM9aTsKKyNpZiAxCisJCWlmIChwdXRfdXNlcihjLCBtaWNyb2NvZGUpKQorCQkJcmV0dXJuIC0yMzsgLyogPz8/ICovCisjZWxzZQorCQkqbWljcm9jb2RlID0gYzsKKyNlbmRpZgorCQltaWNyb2NvZGUrKzsKKwl9CisKKwlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSAnXHInKSByZXR1cm4gLTIxOworCWlmIChnZXRfd2FpdF9kYXRhKGNvc2EpICE9ICdcbicpIHJldHVybiAtMjI7CisJaWYgKGdldF93YWl0X2RhdGEoY29zYSkgIT0gJy4nKSByZXR1cm4gLTIzOworI2lmIDAKKwlwcmludGsoS0VSTl9ERUJVRyAiY29zYSVkOiByZWFkbWVtIGNvbXBsZXRlZC5cbiIsIGNvc2EtPm51bSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBkZXZpY2UgYW5kIHJlYWRzIHRoZSBpbml0aWFsIHByb21wdAorICogb2YgdGhlIGRldmljZSdzIFJPTSBtb25pdG9yLgorICovCitzdGF0aWMgaW50IGNvc2FfcmVzZXRfYW5kX3JlYWRfaWQoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgY2hhciAqaWRzdHJpbmcpCit7CisJaW50IGk9MCwgaWQ9MCwgcHJldj0wLCBjdXJyPTA7CisKKwkvKiBSZXNldCB0aGUgY2FyZCAuLi4gKi8KKwljb3NhX3B1dHN0YXR1cyhjb3NhLCAwKTsKKwljb3NhX2dldGRhdGE4KGNvc2EpOworCWNvc2FfcHV0c3RhdHVzKGNvc2EsIFNSX1JTVCk7CisjaWZkZWYgTU9EVUxFCisJbXNsZWVwKDUwMCk7CisjZWxzZQorCXVkZWxheSg1KjEwMDAwMCk7CisjZW5kaWYKKwkvKiBEaXNhYmxlIGFsbCBJUlFzIGZyb20gdGhlIGNhcmQgKi8KKwljb3NhX3B1dHN0YXR1cyhjb3NhLCAwKTsKKworCS8qCisJICogVHJ5IHRvIHJlYWQgdGhlIElEIHN0cmluZy4gVGhlIGNhcmQgdGhlbiBwcmludHMgb3V0IHRoZQorCSAqIGlkZW50aWZpY2F0aW9uIHN0cmluZyBlbmRlZCBieSB0aGUgIlxuXHgyZSIuCisJICoKKwkgKiBUaGUgZm9sbG93aW5nIGxvb3AgaXMgaW5kZXhlZCB0aHJvdWdoIGkgKGluc3RlYWQgb2YgaWQpCisJICogdG8gYXZvaWQgbG9vcGluZyBmb3JldmVyIHdoZW4gZm9yIGFueSByZWFzb24KKwkgKiB0aGUgcG9ydCByZXR1cm5zICdccicsICdcbicgb3IgJ1x4MmUnIHBlcm1hbmVudGx5LgorCSAqLworCWZvciAoaT0wOyBpPENPU0FfTUFYX0lEX1NUUklORy0xOyBpKyssIHByZXY9Y3VycikgeworCQlpZiAoKGN1cnIgPSBnZXRfd2FpdF9kYXRhKGNvc2EpKSA9PSAtMSkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCWN1cnIgJj0gMHhmZjsKKwkJaWYgKGN1cnIgIT0gJ1xyJyAmJiBjdXJyICE9ICdcbicgJiYgY3VyciAhPSAweDJlKQorCQkJaWRzdHJpbmdbaWQrK10gPSBjdXJyOworCQlpZiAoY3VyciA9PSAweDJlICYmIHByZXYgPT0gJ1xuJykKKwkJCWJyZWFrOworCX0KKwkvKiBQZXJoYXBzIHdlIHNob3VsZCBmYWlsIHdoZW4gaT09Q09TQV9NQVhfSURfU1RSSU5HLTEgPyAqLworCWlkc3RyaW5nW2lkXSA9ICdcMCc7CisJcmV0dXJuIGlkOworfQorCisMCisvKiAtLS0tLS0tLS0tIEF1eGlsaWFyeSByb3V0aW5lcyBmb3IgQ09TQS9TUlAgbW9uaXRvciAtLS0tLS0tLS0tICovCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgZ2V0cyB0aGUgZGF0YSBieXRlIGZyb20gdGhlIGNhcmQgd2FpdGluZyBmb3IgdGhlIFNSX1JYX1JEWQorICogYml0IHRvIGJlIHNldCBpbiBhIGxvb3AuIEl0IHNob3VsZCBiZSB1c2VkIGluIHRoZSBleGNlcHRpb25hbCBjYXNlcworICogb25seSAoZm9yIGV4YW1wbGUgd2hlbiByZXNldHRpbmcgdGhlIGNhcmQgb3IgZG93bmxvYWRpbmcgdGhlIGZpcm13YXJlLgorICovCitzdGF0aWMgaW50IGdldF93YWl0X2RhdGEoc3RydWN0IGNvc2FfZGF0YSAqY29zYSkKK3sKKwlpbnQgcmV0cmllcyA9IDEwMDA7CisKKwl3aGlsZSAoLS1yZXRyaWVzKSB7CisJCS8qIHJlYWQgZGF0YSBhbmQgcmV0dXJuIHRoZW0gKi8KKwkJaWYgKGNvc2FfZ2V0c3RhdHVzKGNvc2EpICYgU1JfUlhfUkRZKSB7CisJCQlzaG9ydCByOworCQkJciA9IGNvc2FfZ2V0ZGF0YTgoY29zYSk7CisjaWYgMAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiY29zYTogZ2V0X3dhaXRfZGF0YSByZXR1cm5pbmcgYWZ0ZXIgJWQgcmV0cmllc1xuIiwgOTk5LXJldHJpZXMpOworI2VuZGlmCisJCQlyZXR1cm4gcjsKKwkJfQorCQkvKiBzbGVlcCBpZiBub3QgcmVhZHkgdG8gcmVhZCAqLworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJjb3NhOiB0aW1lb3V0IGluIGdldF93YWl0X2RhdGEgKHN0YXR1cyAweCV4KVxuIiwKKwkJY29zYV9nZXRzdGF0dXMoY29zYSkpOworCXJldHVybiAtMTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBwdXRzIHRoZSBkYXRhIGJ5dGUgdG8gdGhlIGNhcmQgd2FpdGluZyBmb3IgdGhlIFNSX1RYX1JEWQorICogYml0IHRvIGJlIHNldCBpbiBhIGxvb3AuIEl0IHNob3VsZCBiZSB1c2VkIGluIHRoZSBleGNlcHRpb25hbCBjYXNlcworICogb25seSAoZm9yIGV4YW1wbGUgd2hlbiByZXNldHRpbmcgdGhlIGNhcmQgb3IgZG93bmxvYWRpbmcgdGhlIGZpcm13YXJlKS4KKyAqLworc3RhdGljIGludCBwdXRfd2FpdF9kYXRhKHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBkYXRhKQoreworCWludCByZXRyaWVzID0gMTAwMDsKKwl3aGlsZSAoLS1yZXRyaWVzKSB7CisJCS8qIHJlYWQgZGF0YSBhbmQgcmV0dXJuIHRoZW0gKi8KKwkJaWYgKGNvc2FfZ2V0c3RhdHVzKGNvc2EpICYgU1JfVFhfUkRZKSB7CisJCQljb3NhX3B1dGRhdGE4KGNvc2EsIGRhdGEpOworI2lmIDAKKwkJCXByaW50ayhLRVJOX0lORk8gIlB1dGRhdGE6ICVkIHJldHJpZXNcbiIsIDk5OS1yZXRyaWVzKTsKKyNlbmRpZgorCQkJcmV0dXJuIDA7CisJCX0KKyNpZiAwCisJCS8qIHNsZWVwIGlmIG5vdCByZWFkeSB0byByZWFkICovCisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworI2VuZGlmCisJfQorCXByaW50ayhLRVJOX0lORk8gImNvc2ElZDogdGltZW91dCBpbiBwdXRfd2FpdF9kYXRhIChzdGF0dXMgMHgleClcbiIsCisJCWNvc2EtPm51bSwgY29zYV9nZXRzdGF0dXMoY29zYSkpOworCXJldHVybiAtMTsKK30KKwkKKy8qIAorICogVGhlIGZvbGxvd2luZyByb3V0aW5lIHB1dHMgdGhlIGhleGFkZWNpbWFsIG51bWJlciBpbnRvIHRoZSBTUlAgbW9uaXRvcgorICogYW5kIHZlcmlmaWVzIHRoZSBwcm9wZXIgZWNobyBvZiB0aGUgc2VudCBieXRlcy4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsCisgKiBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZSAoLTEsLTMsLTUsLTcpIG1lYW5zIHRoYXQgcHV0X3dhaXRfZGF0YSgpIGZhaWxlZCwKKyAqICgtMiwtNCwtNiwtOCkgbWVhbnMgdGhhdCByZWFkaW5nIGVjaG8gZmFpbGVkLgorICovCitzdGF0aWMgaW50IHB1dGhleG51bWJlcihzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgbnVtYmVyKQoreworCWNoYXIgdGVtcFs1XTsKKwlpbnQgaTsKKworCS8qIFdlbGwsIEkgc2hvdWxkIHByb2JhYmx5IHJlcGxhY2UgdGhpcyBieSBzb21ldGhpbmcgZmFzdGVyLiAqLworCXNwcmludGYodGVtcCwgIiUwNFgiLCBudW1iZXIpOworCWZvciAoaT0wOyBpPDQ7IGkrKykgeworCQlpZiAocHV0X3dhaXRfZGF0YShjb3NhLCB0ZW1wW2ldKSA9PSAtMSkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJjb3NhJWQ6IHB1dGhleG51bWJlciBmYWlsZWQgdG8gd3JpdGUgYnl0ZSAlZFxuIiwKKwkJCQljb3NhLT5udW0sIGkpOworCQkJcmV0dXJuIC0xLTIqaTsKKwkJfQorCQlpZiAoZ2V0X3dhaXRfZGF0YShjb3NhKSAhPSB0ZW1wW2ldKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgImNvc2ElZDogcHV0aGV4aHVtYmVyIGZhaWxlZCB0byByZWFkIGVjaG8gb2YgYnl0ZSAlZFxuIiwKKwkJCQljb3NhLT5udW0sIGkpOworCQkJcmV0dXJuIC0yLTIqaTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworDAorLyogLS0tLS0tLS0tLSBJbnRlcnJ1cHQgcm91dGluZXMgLS0tLS0tLS0tLSAqLworCisvKgorICogVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIGludGVycnVwdDoKKyAqIEF0IHRoZSBiZWdpbm5pbmcgb2YgdHJhbnNtaXQgLSB0aGlzIGhhbmRsZWQgaXMgaW4gdHhfaW50ZXJydXB0KCksCisgKiBhdCB0aGUgYmVnaW5uaW5nIG9mIHJlY2VpdmUgLSBpdCBpcyBpbiByeF9pbnRlcnJ1cHQoKSBhbmQKKyAqIGF0IHRoZSBlbmQgb2YgdHJhbnNtaXQvcmVjZWl2ZSAtIGl0IGlzIHRoZSBlb3RfaW50ZXJydXB0KCkgZnVuY3Rpb24uCisgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIG11bHRpcGxleGVkIGJ5IGNvc2FfaW50ZXJydXB0KCkgYWNjb3JkaW5nIHRvIHRoZQorICogQ09TQSBzdGF0dXMgYnl0ZS4gSSBoYXZlIG1vdmVkIHRoZSByeC90eC9lb3QgaW50ZXJydXB0IGhhbmRsaW5nIGludG8KKyAqIHNlcGFyYXRlIGZ1bmN0aW9ucyB0byBtYWtlIGl0IG1vcmUgcmVhZGFibGUuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaW5saW5lLAorICogc28gdGhlcmUgc2hvdWxkIGJlIG5vIG92ZXJoZWFkIG9mIGZ1bmN0aW9uIGNhbGwuCisgKiAKKyAqIEluIHRoZSBDT1NBIGJ1cy1tYXN0ZXIgbW9kZSwgd2UgbmVlZCB0byB0ZWxsIHRoZSBjYXJkIHRoZSBhZGRyZXNzIG9mIGEKKyAqIGJ1ZmZlci4gVW5mb3J0dW5hdGVseSwgQ09TQSBtYXkgYmUgdG9vIHNsb3cgZm9yIHVzLCBzbyB3ZSBtdXN0IGJ1c3ktd2FpdC4KKyAqIEl0J3MgdGltZSB0byB1c2UgdGhlIGJvdHRvbSBoYWxmIDotKAorICovCisKKy8qCisgKiBUcmFuc21pdCBpbnRlcnJ1cHQgcm91dGluZSAtIGNhbGxlZCB3aGVuIENPU0EgaXMgd2lsbGluZyB0byBvYnRhaW4KKyAqIGRhdGEgZnJvbSB0aGUgT1MuIFRoZSBtb3N0IHRyaWNreSBwYXJ0IG9mIHRoZSByb3V0aW5lIGlzIHNlbGVjdGlvbgorICogb2YgY2hhbm5lbCB3ZSAoT1MpIHdhbnQgdG8gc2VuZCBwYWNrZXQgZm9yLiBGb3IgU1JQIHdlIHNob3VsZCBwcm9iYWJseQorICogdXNlIHRoZSByb3VuZC1yb2JpbiBhcHByb2FjaC4gVGhlIG5ld2VyIENPU0EgZmlybXdhcmVzIGhhdmUgYSBzaW1wbGUKKyAqIGZsb3ctY29udHJvbCAtIGluIHRoZSBzdGF0dXMgd29yZCBoYXMgYml0cyAyIGFuZCAzIHNldCB0byAxIG1lYW5zIHRoYXQgdGhlCisgKiBjaGFubmVsIDAgb3IgMSBkb2Vzbid0IHdhbnQgdG8gcmVjZWl2ZSBkYXRhLgorICoKKyAqIEl0IHNlZW1zIHRoZXJlIGlzIGEgYnVnIGluIENPU0EgZmlybXdhcmUgKG5lZWQgdG8gdHJhY2UgaXQgZnVydGhlcik6CisgKiBXaGVuIHRoZSBkcml2ZXIgc3RhdHVzIHNheXMgdGhhdCB0aGUga2VybmVsIGhhcyBubyBtb3JlIGRhdGEgZm9yIHRyYW5zbWl0CisgKiAoZS5nLiBhdCB0aGUgZW5kIG9mIFRYIERNQSkgYW5kIHRoZW4gdGhlIGtlcm5lbCBjaGFuZ2VzIGl0cyBtaW5kCisgKiAoZS5nLiBuZXcgcGFja2V0IGlzIHF1ZXVlZCB0byBoYXJkX3N0YXJ0X3htaXQoKSksIHRoZSBjYXJkIGlzc3VlcworICogdGhlIFRYIGludGVycnVwdCBidXQgZG9lcyBub3QgbWFyayB0aGUgY2hhbm5lbCBhcyByZWFkeS10by10cmFuc21pdC4KKyAqIFRoZSBmaXggc2VlbXMgdG8gYmUgdG8gcHVzaCB0aGUgcGFja2V0IHRvIENPU0EgZGVzcGl0ZSBpdHMgcmVxdWVzdC4KKyAqIFdlIGZpcnN0IHRyeSB0byBvYmV5IHRoZSBjYXJkJ3Mgb3BpbmlvbiwgYW5kIHRoZW4gZmFsbCBiYWNrIHRvIGZvcmNlZCBUWC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHR4X2ludGVycnVwdChzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgc3RhdHVzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGZsYWdzMTsKKyNpZmRlZiBERUJVR19JUlFTCisJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiBTUl9ET1dOX1JFUVVFU1Qgc3RhdHVzPTB4JTA0eFxuIiwKKwkJY29zYS0+bnVtLCBzdGF0dXMpOworI2VuZGlmCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwlzZXRfYml0KFRYQklULCAmY29zYS0+cnh0eCk7CisJaWYgKCF0ZXN0X2JpdChJUlFCSVQsICZjb3NhLT5yeHR4KSkgeworCQkvKiBmbG93IGNvbnRyb2wsIHNlZSB0aGUgY29tbWVudCBhYm92ZSAqLworCQlpbnQgaT0wOworCQlpZiAoIWNvc2EtPnR4Yml0bWFwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8gY2hhbm5lbCB3YW50cyBkYXRhICIKKwkJCQkiaW4gVFggSVJRLiBFeHBlY3QgRE1BIHRpbWVvdXQuIiwKKwkJCQljb3NhLT5uYW1lKTsKKwkJCXB1dF9kcml2ZXJfc3RhdHVzX25vbG9jayhjb3NhKTsKKwkJCWNsZWFyX2JpdChUWEJJVCwgJmNvc2EtPnJ4dHgpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisJCXdoaWxlKDEpIHsKKwkJCWNvc2EtPnR4Y2hhbisrOworCQkJaSsrOworCQkJaWYgKGNvc2EtPnR4Y2hhbiA+PSBjb3NhLT5uY2hhbm5lbHMpCisJCQkJY29zYS0+dHhjaGFuID0gMDsKKwkJCWlmICghKGNvc2EtPnR4Yml0bWFwICYgKDE8PGNvc2EtPnR4Y2hhbikpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKH5zdGF0dXMgJiAoMSA8PCAoY29zYS0+dHhjaGFuK0RSSVZFUl9UWE1BUF9TSElGVCkpKQorCQkJCWJyZWFrOworCQkJLyogaW4gc2Vjb25kIHBhc3MsIGFjY2VwdCBmaXJzdCByZWFkeS10by1UWCBjaGFubmVsICovCisJCQlpZiAoaSA+IGNvc2EtPm5jaGFubmVscykgeworCQkJCS8qIENhbiBiZSBzYWZlbHkgaWdub3JlZCAqLworI2lmZGVmIERFQlVHX0lSUVMKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEZvcmNpbmcgVFggIgorCQkJCQkidG8gbm90LXJlYWR5IGNoYW5uZWwgJWRcbiIsCisJCQkJCWNvc2EtPm5hbWUsIGNvc2EtPnR4Y2hhbik7CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWNvc2EtPnR4c2l6ZSA9IGNvc2EtPmNoYW5bY29zYS0+dHhjaGFuXS50eHNpemU7CisJCWlmIChjb3NhX2RtYV9hYmxlKGNvc2EtPmNoYW4rY29zYS0+dHhjaGFuLAorCQkJY29zYS0+Y2hhbltjb3NhLT50eGNoYW5dLnR4YnVmLCBjb3NhLT50eHNpemUpKSB7CisJCQljb3NhLT50eGJ1ZiA9IGNvc2EtPmNoYW5bY29zYS0+dHhjaGFuXS50eGJ1ZjsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweShjb3NhLT5ib3VuY2VidWYsIGNvc2EtPmNoYW5bY29zYS0+dHhjaGFuXS50eGJ1ZiwKKwkJCQljb3NhLT50eHNpemUpOworCQkJY29zYS0+dHhidWYgPSBjb3NhLT5ib3VuY2VidWY7CisJCX0KKwl9CisKKwlpZiAoaXNfOGJpdChjb3NhKSkgeworCQlpZiAoIXRlc3RfYml0KElSUUJJVCwgJmNvc2EtPnJ4dHgpKSB7CisJCQljb3NhX3B1dHN0YXR1cyhjb3NhLCBTUl9UWF9JTlRfRU5BKTsKKwkJCWNvc2FfcHV0ZGF0YTgoY29zYSwgKChjb3NhLT50eGNoYW4gPDwgNSkgJiAweGUwKXwKKwkJCQkoKGNvc2EtPnR4c2l6ZSA+PiA4KSAmIDB4MWYpKTsKKyNpZmRlZiBERUJVR19JTworCQkJZGVidWdfc3RhdHVzX291dChjb3NhLCBTUl9UWF9JTlRfRU5BKTsKKwkJCWRlYnVnX2RhdGFfb3V0KGNvc2EsICgoY29zYS0+dHhjaGFuIDw8IDUpICYgMHhlMCl8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY29zYS0+dHhzaXplID4+IDgpICYgMHgxZikpOworCQkJZGVidWdfZGF0YV9pbihjb3NhLCBjb3NhX2dldGRhdGE4KGNvc2EpKTsKKyNlbHNlCisJCQljb3NhX2dldGRhdGE4KGNvc2EpOworI2VuZGlmCisJCQlzZXRfYml0KElSUUJJVCwgJmNvc2EtPnJ4dHgpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJY2xlYXJfYml0KElSUUJJVCwgJmNvc2EtPnJ4dHgpOworCQkJY29zYV9wdXRzdGF0dXMoY29zYSwgMCk7CisJCQljb3NhX3B1dGRhdGE4KGNvc2EsIGNvc2EtPnR4c2l6ZSYweGZmKTsKKyNpZmRlZiBERUJVR19JTworCQkJZGVidWdfc3RhdHVzX291dChjb3NhLCAwKTsKKwkJCWRlYnVnX2RhdGFfb3V0KGNvc2EsIGNvc2EtPnR4c2l6ZSYweGZmKTsKKyNlbmRpZgorCQl9CisJfSBlbHNlIHsKKwkJY29zYV9wdXRzdGF0dXMoY29zYSwgU1JfVFhfSU5UX0VOQSk7CisJCWNvc2FfcHV0ZGF0YTE2KGNvc2EsICgoY29zYS0+dHhjaGFuPDwxMykgJiAweGUwMDApCisJCQl8IChjb3NhLT50eHNpemUgJiAweDFmZmYpKTsKKyNpZmRlZiBERUJVR19JTworCQlkZWJ1Z19zdGF0dXNfb3V0KGNvc2EsIFNSX1RYX0lOVF9FTkEpOworCQlkZWJ1Z19kYXRhX291dChjb3NhLCAoKGNvc2EtPnR4Y2hhbjw8MTMpICYgMHhlMDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgfCAoY29zYS0+dHhzaXplICYgMHgxZmZmKSk7CisJCWRlYnVnX2RhdGFfaW4oY29zYSwgY29zYV9nZXRkYXRhOChjb3NhKSk7CisJCWRlYnVnX3N0YXR1c19vdXQoY29zYSwgMCk7CisjZWxzZQorCQljb3NhX2dldGRhdGE4KGNvc2EpOworI2VuZGlmCisJCWNvc2FfcHV0c3RhdHVzKGNvc2EsIDApOworCX0KKworCWlmIChjb3NhLT5idXNtYXN0ZXIpIHsKKwkJdW5zaWduZWQgbG9uZyBhZGRyID0gdmlydF90b19idXMoY29zYS0+dHhidWYpOworCQlpbnQgY291bnQ9MDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYnVzbWFzdGVyIElSUVxuIik7CisJCXdoaWxlICghKGNvc2FfZ2V0c3RhdHVzKGNvc2EpJlNSX1RYX1JEWSkpIHsKKwkJCWNvdW50Kys7CisJCQl1ZGVsYXkoMTApOworCQkJaWYgKGNvdW50ID4gMTAwMCkgYnJlYWs7CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAic3RhdHVzICV4XG4iLCBjb3NhX2dldHN0YXR1cyhjb3NhKSk7CisJCXByaW50ayhLRVJOX0lORk8gInJlYWR5IGFmdGVyICVkIGxvb3BzXG4iLCBjb3VudCk7CisJCWNvc2FfcHV0ZGF0YTE2KGNvc2EsIChhZGRyID4+IDE2KSYweGZmZmYpOworCisJCWNvdW50ID0gMDsKKwkJd2hpbGUgKCEoY29zYV9nZXRzdGF0dXMoY29zYSkmU1JfVFhfUkRZKSkgeworCQkJY291bnQrKzsKKwkJCWlmIChjb3VudCA+IDEwMDApIGJyZWFrOworCQkJdWRlbGF5KDEwKTsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICJyZWFkeSBhZnRlciAlZCBsb29wc1xuIiwgY291bnQpOworCQljb3NhX3B1dGRhdGExNihjb3NhLCBhZGRyICYweGZmZmYpOworCQlmbGFnczEgPSBjbGFpbV9kbWFfbG9jaygpOworCQlzZXRfZG1hX21vZGUoY29zYS0+ZG1hLCBETUFfTU9ERV9DQVNDQURFKTsKKwkJZW5hYmxlX2RtYShjb3NhLT5kbWEpOworCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzMSk7CisJfSBlbHNlIHsKKwkJLyogc3RhcnQgdGhlIERNQSAqLworCQlmbGFnczEgPSBjbGFpbV9kbWFfbG9jaygpOworCQlkaXNhYmxlX2RtYShjb3NhLT5kbWEpOworCQljbGVhcl9kbWFfZmYoY29zYS0+ZG1hKTsKKwkJc2V0X2RtYV9tb2RlKGNvc2EtPmRtYSwgRE1BX01PREVfV1JJVEUpOworCQlzZXRfZG1hX2FkZHIoY29zYS0+ZG1hLCB2aXJ0X3RvX2J1cyhjb3NhLT50eGJ1ZikpOworCQlzZXRfZG1hX2NvdW50KGNvc2EtPmRtYSwgY29zYS0+dHhzaXplKTsKKwkJZW5hYmxlX2RtYShjb3NhLT5kbWEpOworCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzMSk7CisJfQorCWNvc2FfcHV0c3RhdHVzKGNvc2EsIFNSX1RYX0RNQV9FTkF8U1JfVVNSX0lOVF9FTkEpOworI2lmZGVmIERFQlVHX0lPCisJZGVidWdfc3RhdHVzX291dChjb3NhLCBTUl9UWF9ETUFfRU5BfFNSX1VTUl9JTlRfRU5BKTsKKyNlbmRpZgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ4X2ludGVycnVwdChzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgc3RhdHVzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjaWZkZWYgREVCVUdfSVJRUworCXByaW50ayhLRVJOX0lORk8gImNvc2ElZDogU1JfVVBfUkVRVUVTVFxuIiwgY29zYS0+bnVtKTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwlzZXRfYml0KFJYQklULCAmY29zYS0+cnh0eCk7CisKKwlpZiAoaXNfOGJpdChjb3NhKSkgeworCQlpZiAoIXRlc3RfYml0KElSUUJJVCwgJmNvc2EtPnJ4dHgpKSB7CisJCQlzZXRfYml0KElSUUJJVCwgJmNvc2EtPnJ4dHgpOworCQkJcHV0X2RyaXZlcl9zdGF0dXNfbm9sb2NrKGNvc2EpOworCQkJY29zYS0+cnhzaXplID0gY29zYV9nZXRkYXRhOChjb3NhKSA8PDg7CisjaWZkZWYgREVCVUdfSU8KKwkJCWRlYnVnX2RhdGFfaW4oY29zYSwgY29zYS0+cnhzaXplID4+IDgpOworI2VuZGlmCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQljbGVhcl9iaXQoSVJRQklULCAmY29zYS0+cnh0eCk7CisJCQljb3NhLT5yeHNpemUgfD0gY29zYV9nZXRkYXRhOChjb3NhKSAmIDB4ZmY7CisjaWZkZWYgREVCVUdfSU8KKwkJCWRlYnVnX2RhdGFfaW4oY29zYSwgY29zYS0+cnhzaXplICYgMHhmZik7CisjZW5kaWYKKyNpZiAwCisJCQlwcmludGsoS0VSTl9JTkZPICJjb3NhJWQ6IHJlY2VpdmUgcnhzaXplID0gKDB4JTA0eCkuXG4iLAorCQkJCWNvc2EtPm51bSwgY29zYS0+cnhzaXplKTsKKyNlbmRpZgorCQl9CisJfSBlbHNlIHsKKwkJY29zYS0+cnhzaXplID0gY29zYV9nZXRkYXRhMTYoY29zYSk7CisjaWZkZWYgREVCVUdfSU8KKwkJZGVidWdfZGF0YV9pbihjb3NhLCBjb3NhLT5yeHNpemUpOworI2VuZGlmCisjaWYgMAorCQlwcmludGsoS0VSTl9JTkZPICJjb3NhJWQ6IHJlY2VpdmUgcnhzaXplID0gKDB4JTA0eCkuXG4iLAorCQkJY29zYS0+bnVtLCBjb3NhLT5yeHNpemUpOworI2VuZGlmCisJfQorCWlmICgoKGNvc2EtPnJ4c2l6ZSAmIDB4ZTAwMCkgPj4gMTMpID49IGNvc2EtPm5jaGFubmVscykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogcnggZm9yIHVua25vd24gY2hhbm5lbCAoMHglMDR4KVxuIiwKKwkJCWNvc2EtPm5hbWUsIGNvc2EtPnJ4c2l6ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwkJZ290byByZWplY3Q7CisJfQorCWNvc2EtPnJ4Y2hhbiA9IGNvc2EtPmNoYW4gKyAoKGNvc2EtPnJ4c2l6ZSAmIDB4ZTAwMCkgPj4gMTMpOworCWNvc2EtPnJ4c2l6ZSAmPSAweDFmZmY7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29zYS0+bG9jaywgZmxhZ3MpOworCisJY29zYS0+cnhidWYgPSBOVUxMOworCWlmIChjb3NhLT5yeGNoYW4tPnNldHVwX3J4KQorCQljb3NhLT5yeGJ1ZiA9IGNvc2EtPnJ4Y2hhbi0+c2V0dXBfcngoY29zYS0+cnhjaGFuLCBjb3NhLT5yeHNpemUpOworCisJaWYgKCFjb3NhLT5yeGJ1ZikgeworcmVqZWN0OgkJLyogUmVqZWN0IHRoZSBwYWNrZXQgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiByZWplY3RpbmcgcGFja2V0IG9uIGNoYW5uZWwgJWRcbiIsCisJCQljb3NhLT5udW0sIGNvc2EtPnJ4Y2hhbi0+bnVtKTsKKwkJY29zYS0+cnhidWYgPSBjb3NhLT5ib3VuY2VidWY7CisJfQorCisJLyogc3RhcnQgdGhlIERNQSAqLworCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKKwlkaXNhYmxlX2RtYShjb3NhLT5kbWEpOworCWNsZWFyX2RtYV9mZihjb3NhLT5kbWEpOworCXNldF9kbWFfbW9kZShjb3NhLT5kbWEsIERNQV9NT0RFX1JFQUQpOworCWlmIChjb3NhX2RtYV9hYmxlKGNvc2EtPnJ4Y2hhbiwgY29zYS0+cnhidWYsIGNvc2EtPnJ4c2l6ZSAmIDB4MWZmZikpIHsKKwkJc2V0X2RtYV9hZGRyKGNvc2EtPmRtYSwgdmlydF90b19idXMoY29zYS0+cnhidWYpKTsKKwl9IGVsc2UgeworCQlzZXRfZG1hX2FkZHIoY29zYS0+ZG1hLCB2aXJ0X3RvX2J1cyhjb3NhLT5ib3VuY2VidWYpKTsKKwl9CisJc2V0X2RtYV9jb3VudChjb3NhLT5kbWEsIChjb3NhLT5yeHNpemUmMHgxZmZmKSk7CisJZW5hYmxlX2RtYShjb3NhLT5kbWEpOworCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjb3NhLT5sb2NrLCBmbGFncyk7CisJY29zYV9wdXRzdGF0dXMoY29zYSwgU1JfUlhfRE1BX0VOQXxTUl9VU1JfSU5UX0VOQSk7CisJaWYgKCFpc184Yml0KGNvc2EpICYmIChzdGF0dXMgJiBTUl9UWF9SRFkpKQorCQljb3NhX3B1dGRhdGE4KGNvc2EsIERSSVZFUl9SWF9SRUFEWSk7CisjaWZkZWYgREVCVUdfSU8KKwlkZWJ1Z19zdGF0dXNfb3V0KGNvc2EsIFNSX1JYX0RNQV9FTkF8U1JfVVNSX0lOVF9FTkEpOworCWlmICghaXNfOGJpdChjb3NhKSAmJiAoc3RhdHVzICYgU1JfVFhfUkRZKSkKKwkJZGVidWdfZGF0YV9jbWQoY29zYSwgRFJJVkVSX1JYX1JFQURZKTsKKyNlbmRpZgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVvdF9pbnRlcnJ1cHQoc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgaW50IHN0YXR1cykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBmbGFnczE7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKKwlmbGFnczEgPSBjbGFpbV9kbWFfbG9jaygpOworCWRpc2FibGVfZG1hKGNvc2EtPmRtYSk7CisJY2xlYXJfZG1hX2ZmKGNvc2EtPmRtYSk7CisJcmVsZWFzZV9kbWFfbG9jayhmbGFnczEpOworCWlmICh0ZXN0X2JpdChUWEJJVCwgJmNvc2EtPnJ4dHgpKSB7CisJCXN0cnVjdCBjaGFubmVsX2RhdGEgKmNoYW4gPSBjb3NhLT5jaGFuK2Nvc2EtPnR4Y2hhbjsKKwkJaWYgKGNoYW4tPnR4X2RvbmUpCisJCQlpZiAoY2hhbi0+dHhfZG9uZShjaGFuLCBjb3NhLT50eHNpemUpKQorCQkJCWNsZWFyX2JpdChjaGFuLT5udW0sICZjb3NhLT50eGJpdG1hcCk7CisJfSBlbHNlIGlmICh0ZXN0X2JpdChSWEJJVCwgJmNvc2EtPnJ4dHgpKSB7CisjaWZkZWYgREVCVUdfREFUQQorCXsKKwkJaW50IGk7CisJCXByaW50ayhLRVJOX0lORk8gImNvc2ElZGMlZDogZG9uZSByeCgweCV4KSIsIGNvc2EtPm51bSwgCisJCQljb3NhLT5yeGNoYW4tPm51bSwgY29zYS0+cnhzaXplKTsKKwkJZm9yIChpPTA7IGk8Y29zYS0+cnhzaXplOyBpKyspCisJCQlwcmludGsgKCIgJTAyeCIsIGNvc2EtPnJ4YnVmW2ldJjB4ZmYpOworCQlwcmludGsoIlxuIik7CisJfQorI2VuZGlmCisJCS8qIFBhY2tldCBmb3IgdW5rbm93biBjaGFubmVsPyAqLworCQlpZiAoY29zYS0+cnhidWYgPT0gY29zYS0+Ym91bmNlYnVmKQorCQkJZ290byBvdXQ7CisJCWlmICghY29zYV9kbWFfYWJsZShjb3NhLT5yeGNoYW4sIGNvc2EtPnJ4YnVmLCBjb3NhLT5yeHNpemUpKQorCQkJbWVtY3B5KGNvc2EtPnJ4YnVmLCBjb3NhLT5ib3VuY2VidWYsIGNvc2EtPnJ4c2l6ZSk7CisJCWlmIChjb3NhLT5yeGNoYW4tPnJ4X2RvbmUpCisJCQlpZiAoY29zYS0+cnhjaGFuLT5yeF9kb25lKGNvc2EtPnJ4Y2hhbikpCisJCQkJY2xlYXJfYml0KGNvc2EtPnJ4Y2hhbi0+bnVtLCAmY29zYS0+cnhiaXRtYXApOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiY29zYSVkOiB1bmV4cGVjdGVkIEVPVCBpbnRlcnJ1cHRcbiIsCisJCQljb3NhLT5udW0pOworCX0KKwkvKgorCSAqIENsZWFyIHRoZSBSWEJJVCwgVFhCSVQgYW5kIElSUUJJVCAodGhlIGxhdGVzdCBzaG91bGQgYmUKKwkgKiBjbGVhcmVkIGFueXdheSkuIFdlIHNob3VsZCBkbyBpdCBhcyBzb29uIGFzIHBvc3NpYmxlCisJICogc28gdGhhdCB3ZSBjYW4gdGVsbCB0aGUgQ09TQSB3ZSBhcmUgZG9uZSBhbmQgdG8gZ2l2ZSBpdCBhIHRpbWUKKwkgKiBmb3IgcmVjb3ZlcnkuCisJICovCitvdXQ6CisJY29zYS0+cnh0eCA9IDA7CisJcHV0X2RyaXZlcl9zdGF0dXNfbm9sb2NrKGNvc2EpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvc2EtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGNvc2FfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmNvc2FfLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBzdGF0dXM7CisJaW50IGNvdW50ID0gMDsKKwlzdHJ1Y3QgY29zYV9kYXRhICpjb3NhID0gY29zYV87CithZ2FpbjoKKwlzdGF0dXMgPSBjb3NhX2dldHN0YXR1cyhjb3NhKTsKKyNpZmRlZiBERUJVR19JUlFTCisJcHJpbnRrKEtFUk5fSU5GTyAiY29zYSVkOiBnb3QgSVJRLCBzdGF0dXMgMHglMDJ4XG4iLCBjb3NhLT5udW0sCisJCXN0YXR1cyAmIDB4ZmYpOworI2VuZGlmCisjaWZkZWYgREVCVUdfSU8KKwlkZWJ1Z19zdGF0dXNfaW4oY29zYSwgc3RhdHVzKTsKKyNlbmRpZgorCXN3aXRjaCAoc3RhdHVzICYgU1JfQ01EX0ZST01fU1JQX01BU0spIHsKKwljYXNlIFNSX0RPV05fUkVRVUVTVDoKKwkJdHhfaW50ZXJydXB0KGNvc2EsIHN0YXR1cyk7CisJCWJyZWFrOworCWNhc2UgU1JfVVBfUkVRVUVTVDoKKwkJcnhfaW50ZXJydXB0KGNvc2EsIHN0YXR1cyk7CisJCWJyZWFrOworCWNhc2UgU1JfRU5EX09GX1RSQU5TRkVSOgorCQllb3RfaW50ZXJydXB0KGNvc2EsIHN0YXR1cyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFdlIG1heSBiZSB0b28gZmFzdCBmb3IgU1JQLiBUcnkgdG8gd2FpdCBhIGJpdCBtb3JlLiAqLworCQlpZiAoY291bnQrKyA8IDEwMCkgeworCQkJdWRlbGF5KDEwMCk7CisJCQlnb3RvIGFnYWluOworCQl9CisJCXByaW50ayhLRVJOX0lORk8gImNvc2ElZDogdW5rbm93biBzdGF0dXMgMHglMDJ4IGluIElSUSBhZnRlciAlZCByZXRyaWVzXG4iLAorCQkJY29zYS0+bnVtLCBzdGF0dXMgJiAweGZmLCBjb3VudCk7CisJfQorI2lmZGVmIERFQlVHX0lSUVMKKwlpZiAoY291bnQpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlZC10aW1lcyBnb3QgdW5rbm93biBzdGF0dXMgaW4gSVJRXG4iLAorCQkJY29zYS0+bmFtZSwgY291bnQpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJldHVybmluZyBmcm9tIElSUVxuIiwgY29zYS0+bmFtZSk7CisjZW5kaWYKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKwwKKy8qIC0tLS0tLS0tLS0gSS9PIGRlYnVnZ2luZyByb3V0aW5lcyAtLS0tLS0tLS0tICovCisvKgorICogVGhlc2Ugcm91dGluZXMgY2FuIGJlIHVzZWQgdG8gbW9uaXRvciBDT1NBL1NSUCBJL08gYW5kIHRvIHByaW50aygpCisgKiB0aGUgZGF0YSBiZWluZyB0cmFuc2ZlcnJlZCBvbiB0aGUgZGF0YSBhbmQgc3RhdHVzIEkvTyBwb3J0IGluIGEKKyAqIHJlYWRhYmxlIHdheS4KKyAqLworCisjaWZkZWYgREVCVUdfSU8KK3N0YXRpYyB2b2lkIGRlYnVnX3N0YXR1c19pbihzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgc3RhdHVzKQoreworCWNoYXIgKnM7CisJc3dpdGNoKHN0YXR1cyAmIFNSX0NNRF9GUk9NX1NSUF9NQVNLKSB7CisJY2FzZSBTUl9VUF9SRVFVRVNUOgorCQlzID0gIlJYX1JFUSI7CisJCWJyZWFrOworCWNhc2UgU1JfRE9XTl9SRVFVRVNUOgorCQlzID0gIlRYX1JFUSI7CisJCWJyZWFrOworCWNhc2UgU1JfRU5EX09GX1RSQU5TRkVSOgorCQlzID0gIkVUX1JFUSI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXMgPSAiTk9fUkVRIjsKKwkJYnJlYWs7CisJfQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBJTzogc3RhdHVzIC0+IDB4JTAyeCAoJXMlcyVzJXMpXG4iLAorCQljb3NhLT5uYW1lLAorCQlzdGF0dXMsCisJCXN0YXR1cyAmIFNSX1VTUl9SUSA/ICJVU1JfUlF8IjoiIiwKKwkJc3RhdHVzICYgU1JfVFhfUkRZID8gIlRYX1JEWXwiOiIiLAorCQlzdGF0dXMgJiBTUl9SWF9SRFkgPyAiUlhfUkRZfCI6IiIsCisJCXMpOworfQorCitzdGF0aWMgdm9pZCBkZWJ1Z19zdGF0dXNfb3V0KHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBzdGF0dXMpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElPOiBzdGF0dXMgPC0gMHglMDJ4ICglcyVzJXMlcyVzJXMpXG4iLAorCQljb3NhLT5uYW1lLAorCQlzdGF0dXMsCisJCXN0YXR1cyAmIFNSX1JYX0RNQV9FTkEgID8gIlJYRE1BfCI6IiFyeGRtYXwiLAorCQlzdGF0dXMgJiBTUl9UWF9ETUFfRU5BICA/ICJUWERNQXwiOiIhdHhkbWF8IiwKKwkJc3RhdHVzICYgU1JfUlNUICAgICAgICAgPyAiUkVTRVR8IjoiIiwKKwkJc3RhdHVzICYgU1JfVVNSX0lOVF9FTkEgPyAiVVNSSU5UfCI6IiF1c3JpbnR8IiwKKwkJc3RhdHVzICYgU1JfVFhfSU5UX0VOQSAgPyAiVFhJTlR8IjoiIXR4aW50fCIsCisJCXN0YXR1cyAmIFNSX1JYX0lOVF9FTkEgID8gIlJYSU5UIjoiIXJ4aW50Iik7Cit9CisKK3N0YXRpYyB2b2lkIGRlYnVnX2RhdGFfaW4oc3RydWN0IGNvc2FfZGF0YSAqY29zYSwgaW50IGRhdGEpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElPOiBkYXRhIC0+IDB4JTA0eFxuIiwgY29zYS0+bmFtZSwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGRlYnVnX2RhdGFfb3V0KHN0cnVjdCBjb3NhX2RhdGEgKmNvc2EsIGludCBkYXRhKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzOiBJTzogZGF0YSA8LSAweCUwNHhcbiIsIGNvc2EtPm5hbWUsIGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBkZWJ1Z19kYXRhX2NtZChzdHJ1Y3QgY29zYV9kYXRhICpjb3NhLCBpbnQgZGF0YSkKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlczogSU86IGRhdGEgPC0gMHglMDR4ICglc3wlcylcbiIsCisJCWNvc2EtPm5hbWUsIGRhdGEsCisJCWRhdGEgJiBTUl9SRFlfUkNWID8gIlJYX1JEWSIgOiAiIXJ4X3JkeSIsCisJCWRhdGEgJiBTUl9SRFlfU05EID8gIlRYX1JEWSIgOiAiIXR4X3JkeSIpOworfQorI2VuZGlmCisKKy8qIEVPRiAtLSB0aGlzIGZpbGUgaGFzIG5vdCBiZWVuIHRydW5jYXRlZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2Nvc2EuaCBiL2RyaXZlcnMvbmV0L3dhbi9jb3NhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI4ZjNkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9jb3NhLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qICRJZDogY29zYS5oLHYgMS42IDE5OTkvMDEvMDYgMTQ6MDI6NDQga2FzIEV4cCAkICovCisKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgIEphbiAiWWVueWEiIEthc3ByemFrIDxrYXNAZmkubXVuaS5jej4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgQ09TQV9IX18KKyNkZWZpbmUgQ09TQV9IX18KKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisvKiBzdGF0dXMgcmVnaXN0ZXIgLSBvdXRwdXQgYml0cyAqLworI2RlZmluZSBTUl9SWF9ETUFfRU5BICAgMHgwNCAgICAvKiByZWNlaXZlciBETUEgZW5hYmxlIGJpdCAqLworI2RlZmluZSBTUl9UWF9ETUFfRU5BICAgMHgwOCAgICAvKiB0cmFuc21pdHRlciBETUEgZW5hYmxlIGJpdCAqLworI2RlZmluZSBTUl9SU1QgICAgICAgICAgMHgxMCAgICAvKiBTUlAgcmVzZXQgKi8KKyNkZWZpbmUgU1JfVVNSX0lOVF9FTkEgIDB4MjAgICAgLyogdXNlciBpbnRlcnJ1cHQgZW5hYmxlIGJpdCAqLworI2RlZmluZSBTUl9UWF9JTlRfRU5BICAgMHg0MCAgICAvKiB0cmFuc21pdHRlciBpbnRlcnJ1cHQgZW5hYmxlIGJpdCAqLworI2RlZmluZSBTUl9SWF9JTlRfRU5BICAgMHg4MCAgICAvKiByZWNlaXZlciBpbnRlcnJ1cHQgZW5hYmxlIGJpdCAqLworCisvKiBzdGF0dXMgcmVnaXN0ZXIgLSBpbnB1dCBiaXRzICovCisjZGVmaW5lIFNSX1VTUl9SUSAgICAgICAweDIwICAgIC8qIHVzZXIgaW50ZXJydXB0IHJlcXVlc3QgcGVuZGluZyAqLworI2RlZmluZSBTUl9UWF9SRFkgICAgICAgMHg0MCAgICAvKiB0cmFuc21pdHRlciBlbXB0eSAocmVhZHkpICovCisjZGVmaW5lIFNSX1JYX1JEWSAgICAgICAweDgwICAgIC8qIHJlY2VpdmVyIGRhdGEgcmVhZHkgKi8KKworI2RlZmluZSBTUl9VUF9SRVFVRVNUICAgMHgwMiAgICAvKiByZXF1ZXN0IGZyb20gU1JQIHRvIHRyYW5zZmVyIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAgdG8gUEMgKi8KKyNkZWZpbmUgU1JfRE9XTl9SRVFVRVNUIDB4MDEgICAgLyogU1JQIGlzIGFibGUgdG8gdHJhbnNmZXIgZGF0YSBkb3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gUEMgdG8gU1JQICovCisjZGVmaW5lIFNSX0VORF9PRl9UUkFOU0ZFUiAgICAgIDB4MDMgICAgLyogU1JQIHNpZ25hbGl6ZSBlbmQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlciAodXAgb3IgZG93bikgKi8KKworI2RlZmluZSBTUl9DTURfRlJPTV9TUlBfTUFTSyAgICAweDAzICAgIC8qIG1hc2sgdG8gZ2V0IFNSUCBjb21tYW5kICovCisKKy8qIGJpdHMgaW4gZHJpdmVyIHN0YXR1cyBieXRlIGRlZmluaXRpb25zIDogKi8KKyNkZWZpbmUgU1JfUkRZX1JDViAgICAgIDB4MDEgICAgLyogcmVhZHkgdG8gcmVjZWl2ZSBwYWNrZXQgKi8KKyNkZWZpbmUgU1JfUkRZX1NORCAgICAgIDB4MDIgICAgLyogcmVhZHkgdG8gc2VuZCBwYWNrZXQgKi8KKyNkZWZpbmUgU1JfQ01EX1BORCAgICAgIDB4MDQgICAgLyogY29tbWFuZCBwZW5kaW5nICovIC8qIG5vdCBjdXJyZW50bHkgdXNlZCAqLworCisvKiA/Pz8/ICovCisjZGVmaW5lIFNSX1BLVF9VUCAgICAgICAweDAxICAgIC8qIHRyYW5zZmVyIG9mIHBhY2tldCB1cCBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBTUl9QS1RfRE9XTiAgICAgMHgwMiAgICAvKiB0cmFuc2ZlciBvZiBwYWNrZXQgZG93biBpbiBwcm9ncmVzcyAqLworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZGVmaW5lIFNSX0xPQURfQUREUiAgICAweDQ0MDAgIC8qIFNSUCBtaWNyb2NvZGUgbG9hZCBhZGRyZXNzICovCisjZGVmaW5lIFNSX1NUQVJUX0FERFIgICAweDQ0MDAgIC8qIFNSUCBtaWNyb2NvZGUgc3RhcnQgYWRkcmVzcyAqLworCisjZGVmaW5lIENPU0FfTE9BRF9BRERSICAgIDB4NDAwICAvKiBTUlAgbWljcm9jb2RlIGxvYWQgYWRkcmVzcyAqLworI2RlZmluZSBDT1NBX01BWF9GSVJNV0FSRV9TSVpFCTB4MTAwMDAKKworLyogaW9jdGxzICovCitzdHJ1Y3QgY29zYV9kb3dubG9hZCB7CisJaW50IGFkZHIsIGxlbjsKKwljaGFyIF9fdXNlciAqY29kZTsKK307CisKKy8qIFJlc2V0IHRoZSBkZXZpY2UgKi8KKyNkZWZpbmUgQ09TQUlPUlNFVAlfSU8oJ0MnLDB4ZjApCisKKy8qIFN0YXJ0IG1pY3JvY29kZSBhdCBnaXZlbiBhZGRyZXNzICovCisjZGVmaW5lIENPU0FJT1NUUlQJX0lPVygnQycsMHhmMSwgaW50KQorCisvKiBSZWFkIHRoZSBibG9jayBmcm9tIHRoZSBkZXZpY2UgbWVtb3J5ICovCisjZGVmaW5lIENPU0FJT1JNRU0JX0lPV1IoJ0MnLDB4ZjIsIHN0cnVjdCBjb3NhX2Rvd25sb2FkICopCisJLyogYWN0dWFsbHkgdGhlIHN0cnVjdCBjb3NhX2Rvd25sb2FkIGl0c2VsZjsgdGhpcyBpcyB0byBrZWVwCisJICogdGhlIGlvY3RsIG51bWJlciBzYW1lIGFzIGluIDIuNCBpbiBvcmRlciB0byBrZWVwIHRoZSB1c2VyLXNwYWNlCisJICogdXRpbHMgY29tcGF0aWJsZS4gKi8KKworLyogV3JpdGUgdGhlIGJsb2NrIHRvIHRoZSBkZXZpY2UgbWVtb3J5IChpLmUuIGRvd25sb2FkIHRoZSBtaWNyb2NvZGUpICovCisjZGVmaW5lIENPU0FJT0RPV05MRAlfSU9XKCdDJywweGYyLCBzdHJ1Y3QgY29zYV9kb3dubG9hZCAqKQorCS8qIGFjdHVhbGx5IHRoZSBzdHJ1Y3QgY29zYV9kb3dubG9hZCBpdHNlbGY7IHRoaXMgaXMgdG8ga2VlcAorCSAqIHRoZSBpb2N0bCBudW1iZXIgc2FtZSBhcyBpbiAyLjQgaW4gb3JkZXIgdG8ga2VlcCB0aGUgdXNlci1zcGFjZQorCSAqIHV0aWxzIGNvbXBhdGlibGUuICovCisKKy8qIFJlYWQgdGhlIGRldmljZSB0eXBlIChvbmUgb2YgInNycCIsICJjb3NhIiwgYW5kICJjb3NhOCIgZm9yIG5vdykgKi8KKyNkZWZpbmUgQ09TQUlPUlRZUEUJX0lPUignQycsMHhmMywgY2hhciAqKQorCisvKiBSZWFkIHRoZSBkZXZpY2UgaWRlbnRpZmljYXRpb24gc3RyaW5nICovCisjZGVmaW5lIENPU0FJT1JJRFNUUglfSU9SKCdDJywweGY0LCBjaGFyICopCisvKiBNYXhpbXVtIGxlbmd0aCBvZiB0aGUgaWRlbnRpZmljYXRpb24gc3RyaW5nLiAqLworI2RlZmluZSBDT1NBX01BWF9JRF9TVFJJTkcgMTI4CisKKy8qIEluY3JlbWVudC9kZWNyZW1lbnQgdGhlIG1vZHVsZSB1c2FnZSBjb3VudCA6LSkgKi8KKy8qICNkZWZpbmUgQ09TQUlPTUlOQwlfSU8oJ0MnLDB4ZjUpICovCisvKiAjZGVmaW5lIENPU0FJT01ERUMJX0lPKCdDJywweGY2KSAqLworCisvKiBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiBjYXJkcyBpbnN0YWxsZWQgKi8KKyNkZWZpbmUgQ09TQUlPTlJDQVJEUwlfSU8oJ0MnLDB4ZjcpCisKKy8qIEdldCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9uIHRoaXMgY2FyZCAqLworI2RlZmluZSBDT1NBSU9OUkNIQU5TCV9JTygnQycsMHhmOCkKKworLyogU2V0IHRoZSBkcml2ZXIgZm9yIHRoZSBidXMtbWFzdGVyIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgQ09TQUlPQk1TRVQJX0lPVygnQycsIDB4ZjksIHVuc2lnbmVkIHNob3J0KQorCisjZGVmaW5lIENPU0FfQk1fT0ZGCTAJLyogQnVzLW1hc3RlcmluZyBvZmYgLSB1c2UgSVNBIERNQSAoZGVmYXVsdCkgKi8KKyNkZWZpbmUgQ09TQV9CTV9PTgkxCS8qIEJ1cy1tYXN0ZXJpbmcgb24gLSBmYXN0ZXIgYnV0IHVudGVzdGVkICovCisKKy8qIEdldHMgdGhlIGJ1c21hc3RlciBzdGF0dXMgKi8KKyNkZWZpbmUgQ09TQUlPQk1HRVQJX0lPKCdDJywgMHhmYSkKKworI2VuZGlmIC8qICFDT1NBX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2N5Y3hfZHJ2LmMgYi9kcml2ZXJzL25ldC93YW4vY3ljeF9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTc0YWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2N5Y3hfZHJ2LmMKQEAgLTAsMCArMSw1ODYgQEAKKy8qCisqIGN5Y3hfZHJ2LmMJQ3ljbG9tIDJYIFN1cHBvcnQgTW9kdWxlLgorKgorKgkJVGhpcyBtb2R1bGUgaXMgYSBsaWJyYXJ5IG9mIGNvbW1vbiBoYXJkd2FyZSBzcGVjaWZpYworKgkJZnVuY3Rpb25zIHVzZWQgYnkgdGhlIEN5Y2xhZGVzIEN5Y2xvbSAyWCBzeW5jIGNhcmQuCisqCisqIEF1dGhvcjoJQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisqCisqIENvcHlyaWdodDoJKGMpIDE5OTgtMjAwMyBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8KKyoKKyogQmFzZWQgb24gc2RsYWRydi5jIGJ5IEdlbmUgS296aW4gPGdlbmVrQGNvbXB1c2VydmUuY29tPgorKgorKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiAxOTk5LzExLzExCWFjbWUJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSksIGNvZGUKKyoJCQkJY2xlYW51cAorKiAxOTk5LzExLzA4CWFjbWUJCWluaXRfY3ljMnggZGVsZXRlZCwgZG9pbmcgbm90aGluZworKiAxOTk5LzExLzA2CWFjbWUJCWJhY2sgdG8gcmVhZFtid10sIHdyaXRlW2J3XSBhbmQgbWVtY3B5X3RvIGFuZAorKgkJCQlmcm9taW8gdG8gdXNlIGRwbWJhc2UgaW9yZW1hcGVkCisqIDE5OTkvMTAvMjYJYWNtZQkJdXNlIGlzYV9yZWFkW2J3XSwgaXNhX3dyaXRlW2J3XSAmIGlzYV9tZW1jcHlfdG8KKyoJCQkJJiBmcm9taW8KKyogMTk5OS8xMC8yMwlhY21lCQljbGVhbnVwIHRvIG9ubHkgc3VwcG9ydHMgY3ljbG9tMng6IGFsbCB0aGUgb3RoZXIKKyoJCQkJYm9hcmRzIGFyZSBubyBsb25nZXIgbWFudWZhY3R1cmVkIGJ5IGN5Y2xhZGVzLAorKgkJCQlpZiBzb21lb25lIHdhbnRzIHRvIHN1cHBvcnQgdGhlbS4uLiBiZSBteSBndWVzdCEKKyogMTk5OS8wNS8yOCAgICBhY21lCQljeWN4X2ludGFjayAmIGN5Y3hfaW50ZGUgZ29uZSBmb3IgZ29vZAorKiAxOTk5LzA1LzE4CWFjbWUJCWxvdHMgb2YgdW5sb2dnZWQgd29yaywgc3VibWl0dGluZyB0byBMaW51cy4uLgorKiAxOTk5LzAxLzAzCWFjbWUJCW1vcmUganVkaWNpb3VzIHVzZSBvZiBkYXRhIHR5cGVzCisqIDE5OTkvMDEvMDMJYWNtZQkJanVkaWNpb3VzIHVzZSBvZiBkYXRhIHR5cGVzIDo+CisqCQkJCWN5Y3hfaW50ZW4gdHJ5aW5nIHRvIHJlc2V0IHBlbmRpbmcgaW50ZXJydXB0cworKgkJCQlmcm9tIGN5Y2xvbSAyeCAtIEkgdGhpbmsgdGhpcyBpc24ndCB0aGUgd2F5IHRvCisqCQkJCWdvLCBidXQgZm9yIG5vdy4uLgorKiAxOTk5LzAxLzAyCWFjbWUJCWN5Y3hfaW50YWNrIG9rLCBJIHRoaW5rIHRoZXJlJ3Mgbm90aGluZyB0byBkbworKgkJCQl0byBhY2sgYW4gaW50IGluIGN5Y3hfZHJ2LmMsIG9ubHkgaGFuZGxlIGl0IGluCisqCQkJCWN5eF9pc3IgKG9yIGluIHRoZSBvdGhlciBwcm90b2NvbHM6IGN5cF9pc3IsCisqCQkJCWN5Zl9pc3IsIHdoZW4gdGhleSBnZXQgaW1wbGVtZW50ZWQuCisqIERlYyAzMSwgMTk5OAlhY21lCQljeWN4X2RhdGFfYm9vdCAmIGN5Y3hfY29kZV9ib290IGZpeGVkLCBjcm9zc2luZworKgkJCQlmaW5nZXJzIHRvIHNlZSB4MjVfY29uZmlndXJlIGluIGN5Y3hfeDI1LmMKKyoJCQkJd29yay4uLiA6KQorKiBEZWMgMjYsIDE5OTgJYWNtZQkJbG9hZCBpbXBsZW1lbnRhdGlvbiBmaXhlZCwgc2VlbXMgdG8gd29yayEgOikKKyoJCQkJY3ljeF8yeF9kcG1iYXNlX29wdGlvbnMgd2l0aCBhbGwgdGhlIHBvc3NpYmxlCisqCQkJCURQTSBhZGRyZXNzZXMgKDIwKS4KKyoJCQkJY3ljeF9pbnRyIGltcGxlbWVudGVkICh0ZXN0IHRoaXMhKQorKgkJCQlnZW5lcmFsIGNvZGUgY2xlYW51cAorKiBEZWMgIDgsIDE5OTgJSXZhbiBQYXNzb3MJQ3ljbG9tLTJYIGZpcm13YXJlIGxvYWQgaW1wbGVtZW50YXRpb24uCisqIEF1ZyAgOCwgMTk5OAlhY21lCQlJbml0aWFsIHZlcnNpb24uCisqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgkJLyogX19pbml0ICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIHByaW50aygpLCBhbmQgb3RoZXIgdXNlZnVsIHN0dWZmICovCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CS8qIG9mZnNldG9mKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgkvKiByZXR1cm4gY29kZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkvKiBmb3IgamlmZmllcywgSFosIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9jeWN4X2Rydi5oPgkvKiBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9jeWN4X2NmbS5oPgkvKiBDWUNYIGZpcm13YXJlIG1vZHVsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIHVkZWxheSAqLworI2luY2x1ZGUgPGFzbS9pby5oPgkJLyogcmVhZFt3bF0sIHdyaXRlW3dsXSwgaW9yZW1hcCwgaW91bm1hcCAqLworCisjZGVmaW5lCU1PRF9WRVJTSU9OCTAKKyNkZWZpbmUJTU9EX1JFTEVBU0UJNgorCitNT0RVTEVfQVVUSE9SKCJBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ3ljbG9tIDJ4IFN5bmMgQ2FyZCBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogSGFyZHdhcmUtc3BlY2lmaWMgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IGxvYWRfY3ljMngoc3RydWN0IGN5Y3hfaHcgKmh3LCBzdHJ1Y3QgY3ljeF9maXJtd2FyZSAqY2ZtLCB1MzIgbGVuKTsKK3N0YXRpYyB2b2lkIGN5Y3hfYm9vdGNmZyhzdHJ1Y3QgY3ljeF9odyAqaHcpOworCitzdGF0aWMgaW50IHJlc2V0X2N5YzJ4KHZvaWQgX19pb21lbSAqYWRkcik7CitzdGF0aWMgaW50IGRldGVjdF9jeWMyeCh2b2lkIF9faW9tZW0gKmFkZHIpOworCisvKiBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgZGVsYXlfY3ljeChpbnQgc2VjKTsKK3N0YXRpYyBpbnQgZ2V0X29wdGlvbl9pbmRleChsb25nICpvcHRsaXN0LCBsb25nIG9wdHZhbCk7CitzdGF0aWMgdTE2IGNoZWNrc3VtKHU4ICpidWYsIHUzMiBsZW4pOworCisjZGVmaW5lIHdhaXRfY3ljKGFkZHIpIGN5Y3hfZXhlYyhhZGRyICsgQ01EX09GRlNFVCkKKworLyogR2xvYmFsIERhdGEgKi8KKworLyogcHJpdmF0ZSBkYXRhICovCitzdGF0aWMgY2hhciBtb2RuYW1lW10gPSAiY3ljeF9kcnYiOworc3RhdGljIGNoYXIgZnVsbG5hbWVbXSA9ICJDeWNsb20gMlggU3VwcG9ydCBNb2R1bGUiOworc3RhdGljIGNoYXIgY29weXJpZ2h0W10gPSAiKGMpIDE5OTgtMjAwMyBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gIgorCQkJICAiPGFjbWVAY29uZWN0aXZhLmNvbS5icj4iOworCisvKiBIYXJkd2FyZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuCisgKiBUaGVzZSBhcmUgYXJyYXlzIG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB1c2VkIGJ5IHZlcmlmaWNhdGlvbiByb3V0aW5lcy4KKyAqIFRoZSBmaXJzdCBlbGVtZW50IG9mIGVhY2ggYXJyYXkgaXMgaXRzIHNpemUgKGkuZS4gbnVtYmVyIG9mIG9wdGlvbnMpLgorICovCitzdGF0aWMgbG9uZyBjeWMyeF9kcG1iYXNlX29wdGlvbnNbXSA9IHsKKwkyMCwKKwkweEEwMDAwLCAweEE0MDAwLCAweEE4MDAwLCAweEFDMDAwLCAweEIwMDAwLCAweEI0MDAwLCAweEI4MDAwLAorCTB4QkMwMDAsIDB4QzAwMDAsIDB4QzQwMDAsIDB4QzgwMDAsIDB4Q0MwMDAsIDB4RDAwMDAsIDB4RDQwMDAsCisJMHhEODAwMCwgMHhEQzAwMCwgMHhFMDAwMCwgMHhFNDAwMCwgMHhFODAwMCwgMHhFQzAwMAorfTsKKworc3RhdGljIGxvbmcgY3ljeF8yeF9pcnFfb3B0aW9uc1tdICA9IHsgNywgMywgNSwgOSwgMTAsIDExLCAxMiwgMTUgfTsKKworLyogS2VybmVsIExvYWRhYmxlIE1vZHVsZSBFbnRyeSBQb2ludHMgKi8KKy8qIE1vZHVsZSAnaW5zZXJ0JyBlbnRyeSBwb2ludC4KKyAqIG8gcHJpbnQgYW5ub3VuY2VtZW50CisgKiBvIGluaXRpYWxpemUgc3RhdGljIGRhdGEKKyAqCisgKiBSZXR1cm46CTAJT2sKKyAqCQk8IDAJZXJyb3IuCisgKiBDb250ZXh0Oglwcm9jZXNzICovCisKK2ludCBfX2luaXQgY3ljeF9kcnZfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzIHYldS4ldSAlc1xuIiwgZnVsbG5hbWUsIE1PRF9WRVJTSU9OLCBNT0RfUkVMRUFTRSwKKwkJCSBjb3B5cmlnaHQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE1vZHVsZSAncmVtb3ZlJyBlbnRyeSBwb2ludC4KKyAqIG8gcmVsZWFzZSBhbGwgcmVtYWluaW5nIHN5c3RlbSByZXNvdXJjZXMgKi8KK3ZvaWQgY3ljeF9kcnZfY2xlYW51cCh2b2lkKQoreworfQorCisvKiBLZXJuZWwgQVBJcyAqLworLyogU2V0IHVwIGFkYXB0ZXIuCisgKiBvIGRldGVjdCBhZGFwdGVyIHR5cGUKKyAqIG8gdmVyaWZ5IGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworICogbyBjaGVjayBmb3IgaGFyZHdhcmUgY29uZmxpY3RzCisgKiBvIHNldCB1cCBhZGFwdGVyIHNoYXJlZCBtZW1vcnkKKyAqIG8gdGVzdCBhZGFwdGVyIG1lbW9yeQorICogbyBsb2FkIGZpcm13YXJlCisgKiBSZXR1cm46CTAJb2suCisgKgkJPCAwCWVycm9yICovCitFWFBPUlRfU1lNQk9MKGN5Y3hfc2V0dXApOworaW50IGN5Y3hfc2V0dXAoc3RydWN0IGN5Y3hfaHcgKmh3LCB2b2lkICpjZm0sIHUzMiBsZW4sIHVuc2lnbmVkIGxvbmcgZHBtYmFzZSkKK3sKKwlpbnQgZXJyOworCisJLyogVmVyaWZ5IElSUSBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKwlpZiAoIWdldF9vcHRpb25faW5kZXgoY3ljeF8yeF9pcnFfb3B0aW9ucywgaHctPmlycSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSVJRICVkIGlzIGludmFsaWQhXG4iLCBtb2RuYW1lLCBody0+aXJxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU2V0dXAgYWRhcHRlciBkdWFsLXBvcnQgbWVtb3J5IHdpbmRvdyBhbmQgdGVzdCBtZW1vcnkgKi8KKwlpZiAoIWRwbWJhc2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogeW91IG11c3Qgc3BlY2lmeSB0aGUgZHBtIGFkZHJlc3MhXG4iLAorCQkJCW1vZG5hbWUpOworIAkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmICghZ2V0X29wdGlvbl9pbmRleChjeWMyeF9kcG1iYXNlX29wdGlvbnMsIGRwbWJhc2UpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG1lbW9yeSBhZGRyZXNzIDB4JWxYIGlzIGludmFsaWQhXG4iLAorCQkJCW1vZG5hbWUsIGRwbWJhc2UpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlody0+ZHBtYmFzZSA9IGlvcmVtYXAoZHBtYmFzZSwgQ1lDWF9XSU5ET1dTSVpFKTsKKwlody0+ZHBtc2l6ZSA9IENZQ1hfV0lORE9XU0laRTsKKworCWlmICghZGV0ZWN0X2N5YzJ4KGh3LT5kcG1iYXNlKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhZGFwdGVyIEN5Y2xvbSAyWCBub3QgZm91bmQgYXQgIgorCQkJCSJhZGRyZXNzIDB4JWxYIVxuIiwgbW9kbmFtZSwgZHBtYmFzZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBmb3VuZCBDeWNsb20gMlggY2FyZCBhdCBhZGRyZXNzIDB4JWxYLlxuIiwKKwkJCSBtb2RuYW1lLCBkcG1iYXNlKTsKKworCS8qIExvYWQgZmlybXdhcmUuIElmIGxvYWRlciBmYWlscyB0aGVuIHNodXQgZG93biBhZGFwdGVyICovCisJZXJyID0gbG9hZF9jeWMyeChodywgY2ZtLCBsZW4pOworCisJaWYgKGVycikKKwkJY3ljeF9kb3duKGh3KTsgICAgICAgICAvKiBzaHV0ZG93biBhZGFwdGVyICovCisKKwlyZXR1cm4gZXJyOworfQorCitFWFBPUlRfU1lNQk9MKGN5Y3hfZG93bik7CitpbnQgY3ljeF9kb3duKHN0cnVjdCBjeWN4X2h3ICpodykKK3sKKwlpb3VubWFwKGh3LT5kcG1iYXNlKTsKKwlyZXR1cm4gMDsKK30KKworLyogRW5hYmxlIGludGVycnVwdCBnZW5lcmF0aW9uLiAgKi8KK0VYUE9SVF9TWU1CT0woY3ljeF9pbnRlbik7Cit2b2lkIGN5Y3hfaW50ZW4oc3RydWN0IGN5Y3hfaHcgKmh3KQoreworCXdyaXRlYigwLCBody0+ZHBtYmFzZSk7Cit9CisKKy8qIEdlbmVyYXRlIGFuIGludGVycnVwdCB0byBhZGFwdGVyJ3MgQ1BVLiAqLworRVhQT1JUX1NZTUJPTChjeWN4X2ludHIpOwordm9pZCBjeWN4X2ludHIoc3RydWN0IGN5Y3hfaHcgKmh3KQoreworCXdyaXRldygwLCBody0+ZHBtYmFzZSArIEdFTl9DWUNYX0lOVFIpOworfQorCisvKiBFeGVjdXRlIEFkYXB0ZXIgQ29tbWFuZC4KKyAqIG8gU2V0IGV4ZWMgZmxhZy4KKyAqIG8gQnVzeS13YWl0IHVudGlsIGZsYWcgaXMgcmVzZXQuICovCitFWFBPUlRfU1lNQk9MKGN5Y3hfZXhlYyk7CitpbnQgY3ljeF9leGVjKHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl1MTYgaSA9IDA7CisJLyogd2FpdCB0aWxsIGFkZHIgY29udGVudCBpcyB6ZXJvZWQgKi8KKworCXdoaWxlIChyZWFkdyhhZGRyKSkgeworCQl1ZGVsYXkoMTAwMCk7CisKKwkJaWYgKCsraSA+IDUwKQorCQkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKiBSZWFkIGFic29sdXRlIGFkYXB0ZXIgbWVtb3J5LgorICogVHJhbnNmZXIgZGF0YSBmcm9tIGFkYXB0ZXIncyBtZW1vcnkgdG8gZGF0YSBidWZmZXIuICovCitFWFBPUlRfU1lNQk9MKGN5Y3hfcGVlayk7CitpbnQgY3ljeF9wZWVrKHN0cnVjdCBjeWN4X2h3ICpodywgdTMyIGFkZHIsIHZvaWQgKmJ1ZiwgdTMyIGxlbikKK3sKKwlpZiAobGVuID09IDEpCisJCSoodTgqKWJ1ZiA9IHJlYWRiKGh3LT5kcG1iYXNlICsgYWRkcik7CisJZWxzZQorCQltZW1jcHlfZnJvbWlvKGJ1ZiwgaHctPmRwbWJhc2UgKyBhZGRyLCBsZW4pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFdyaXRlIEFic29sdXRlIEFkYXB0ZXIgTWVtb3J5LgorICogVHJhbnNmZXIgZGF0YSBmcm9tIGRhdGEgYnVmZmVyIHRvIGFkYXB0ZXIncyBtZW1vcnkuICovCitFWFBPUlRfU1lNQk9MKGN5Y3hfcG9rZSk7CitpbnQgY3ljeF9wb2tlKHN0cnVjdCBjeWN4X2h3ICpodywgdTMyIGFkZHIsIHZvaWQgKmJ1ZiwgdTMyIGxlbikKK3sKKwlpZiAobGVuID09IDEpCisJCXdyaXRlYigqKHU4KilidWYsIGh3LT5kcG1iYXNlICsgYWRkcik7CisJZWxzZQorCQltZW1jcHlfdG9pbyhody0+ZHBtYmFzZSArIGFkZHIsIGJ1ZiwgbGVuKTsKKworCXJldHVybiAwOworfQorCisvKiBIYXJkd2FyZS1TcGVjaWZpYyBGdW5jdGlvbnMgKi8KKworLyogTG9hZCBBdXggUm91dGluZXMgKi8KKy8qIFJlc2V0IGJvYXJkIGhhcmR3YXJlLgorICAgcmV0dXJuIDEgaWYgbWVtb3J5IGV4aXN0cyBhdCBhZGRyIGFuZCAwIGlmIG5vdC4gKi8KK3N0YXRpYyBpbnQgbWVtb3J5X2V4aXN0cyh2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJaW50IHRyaWVzID0gMDsKKworCWZvciAoOyB0cmllcyA8IDMgOyB0cmllcysrKSB7CisJCXdyaXRldyhURVNUX1BBVFRFUk4sIGFkZHIgKyAweDEwKTsKKworCQlpZiAocmVhZHcoYWRkciArIDB4MTApID09IFRFU1RfUEFUVEVSTikKKwkJCWlmIChyZWFkdyhhZGRyICsgMHgxMCkgPT0gVEVTVF9QQVRURVJOKQorCQkJCXJldHVybiAxOworCisJCWRlbGF5X2N5Y3goMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIExvYWQgcmVzZXQgY29kZS4gKi8KK3N0YXRpYyB2b2lkIHJlc2V0X2xvYWQodm9pZCBfX2lvbWVtICphZGRyLCB1OCAqYnVmZmVyLCB1MzIgY250KQoreworCXZvaWQgX19pb21lbSAqcHRfY29kZSA9IGFkZHIgKyBSRVNFVF9PRkZTRVQ7CisJdTE2IGk7IC8qLCBqOyAqLworCisJZm9yIChpID0gMCA7IGkgPCBjbnQgOyBpKyspIHsKKy8qCQlmb3IgKGogPSAwIDsgaiA8IDUwIDsgaisrKTsgRGVsYXkgLSBGSVhNRSBidXN5IHdhaXRpbmcuLi4gKi8KKwkJd3JpdGViKCpidWZmZXIrKywgcHRfY29kZSsrKTsKKwl9Cit9CisKKy8qIExvYWQgYnVmZmVyIHVzaW5nIGJvb3QgaW50ZXJmYWNlLgorICogbyBjb3B5IGRhdGEgZnJvbSBidWZmZXIgdG8gQ3ljbG9tLVggbWVtb3J5CisgKiBvIHdhaXQgZm9yIHJlc2V0IGNvZGUgdG8gY29weSBpdCB0byByaWdodCBwb3J0aW9uIG9mIG1lbW9yeSAqLworc3RhdGljIGludCBidWZmZXJfbG9hZCh2b2lkIF9faW9tZW0gKmFkZHIsIHU4ICpidWZmZXIsIHUzMiBjbnQpCit7CisJbWVtY3B5X3RvaW8oYWRkciArIERBVEFfT0ZGU0VULCBidWZmZXIsIGNudCk7CisJd3JpdGV3KEdFTl9CT09UX0RBVCwgYWRkciArIENNRF9PRkZTRVQpOworCisJcmV0dXJuIHdhaXRfY3ljKGFkZHIpOworfQorCisvKiBTZXQgdXAgZW50cnkgcG9pbnQgYW5kIGtpY2sgc3RhcnQgQ3ljbG9tLVggQ1BVLiAqLworc3RhdGljIHZvaWQgY3ljeF9zdGFydCh2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJLyogcHV0IGluIDB4MzAgb2Zmc2V0IHRoZSBqdW1wIGluc3RydWN0aW9uIHRvIHRoZSBjb2RlIGVudHJ5IHBvaW50ICovCisJd3JpdGViKDB4ZWEsIGFkZHIgKyAweDMwKTsKKwl3cml0ZWIoMHgwMCwgYWRkciArIDB4MzEpOworCXdyaXRlYigweGM0LCBhZGRyICsgMHgzMik7CisJd3JpdGViKDB4MDAsIGFkZHIgKyAweDMzKTsKKwl3cml0ZWIoMHgwMCwgYWRkciArIDB4MzQpOworCisJLyogY21kIHRvIHN0YXJ0IGV4ZWN1dGluZyBjb2RlICovCisJd3JpdGV3KEdFTl9TVEFSVCwgYWRkciArIENNRF9PRkZTRVQpOworfQorCisvKiBMb2FkIGFuZCBib290IHJlc2V0IGNvZGUuICovCitzdGF0aWMgdm9pZCBjeWN4X3Jlc2V0X2Jvb3Qodm9pZCBfX2lvbWVtICphZGRyLCB1OCAqY29kZSwgdTMyIGxlbikKK3sKKwl2b2lkIF9faW9tZW0gKnB0X3N0YXJ0ID0gYWRkciArIFNUQVJUX09GRlNFVDsKKworCXdyaXRlYigweGVhLCBwdF9zdGFydCsrKTsgLyogam1wIHRvIGYwMDA6M2YwMCAqLworCXdyaXRlYigweDAwLCBwdF9zdGFydCsrKTsKKwl3cml0ZWIoMHhmYywgcHRfc3RhcnQrKyk7CisJd3JpdGViKDB4MDAsIHB0X3N0YXJ0KyspOworCXdyaXRlYigweGYwLCBwdF9zdGFydCk7CisJcmVzZXRfbG9hZChhZGRyLCBjb2RlLCBsZW4pOworCisJLyogODAxODYgd2FzIGluIGhvbGQsIGdvICovCisJd3JpdGViKDAsIGFkZHIgKyBTVEFSVF9DUFUpOworCWRlbGF5X2N5Y3goMSk7Cit9CisKKy8qIExvYWQgZGF0YS5iaW4gZmlsZSB0aHJvdWdoIGJvb3QgKHJlc2V0KSBpbnRlcmZhY2UuICovCitzdGF0aWMgaW50IGN5Y3hfZGF0YV9ib290KHZvaWQgX19pb21lbSAqYWRkciwgdTggKmNvZGUsIHUzMiBsZW4pCit7CisJdm9pZCBfX2lvbWVtICpwdF9ib290X2NtZCA9IGFkZHIgKyBDTURfT0ZGU0VUOworCXUzMiBpOworCisJLyogYm9vdCBidWZmZXIgbGVuZ2h0ICovCisJd3JpdGV3KENGTV9MT0FEX0JVRlNaLCBwdF9ib290X2NtZCArIHNpemVvZih1MTYpKTsKKwl3cml0ZXcoR0VOX0RFRlBBUiwgcHRfYm9vdF9jbWQpOworCisJaWYgKHdhaXRfY3ljKGFkZHIpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJd3JpdGV3KDAsIHB0X2Jvb3RfY21kICsgc2l6ZW9mKHUxNikpOworCXdyaXRldygweDQwMDAsIHB0X2Jvb3RfY21kICsgMiAqIHNpemVvZih1MTYpKTsKKwl3cml0ZXcoR0VOX1NFVF9TRUcsIHB0X2Jvb3RfY21kKTsKKworCWlmICh3YWl0X2N5YyhhZGRyKSA8IDApCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDAgOyBpIDwgbGVuIDsgaSArPSBDRk1fTE9BRF9CVUZTWikKKwkJaWYgKGJ1ZmZlcl9sb2FkKGFkZHIsIGNvZGUgKyBpLAorCQkJCW1pbl90KHUzMiwgQ0ZNX0xPQURfQlVGU1osIChsZW4gLSBpKSkpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgISFcbiIsIG1vZG5hbWUpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBMb2FkIGNvZGUuYmluIGZpbGUgdGhyb3VnaCBib290IChyZXNldCkgaW50ZXJmYWNlLiAqLworc3RhdGljIGludCBjeWN4X2NvZGVfYm9vdCh2b2lkIF9faW9tZW0gKmFkZHIsIHU4ICpjb2RlLCB1MzIgbGVuKQoreworCXZvaWQgX19pb21lbSAqcHRfYm9vdF9jbWQgPSBhZGRyICsgQ01EX09GRlNFVDsKKwl1MzIgaTsKKworCS8qIGJvb3QgYnVmZmVyIGxlbmdodCAqLworCXdyaXRldyhDRk1fTE9BRF9CVUZTWiwgcHRfYm9vdF9jbWQgKyBzaXplb2YodTE2KSk7CisJd3JpdGV3KEdFTl9ERUZQQVIsIHB0X2Jvb3RfY21kKTsKKworCWlmICh3YWl0X2N5YyhhZGRyKSA8IDApCisJCXJldHVybiAtMTsKKworCXdyaXRldygweDAwMDAsIHB0X2Jvb3RfY21kICsgc2l6ZW9mKHUxNikpOworCXdyaXRldygweGM0MDAsIHB0X2Jvb3RfY21kICsgMiAqIHNpemVvZih1MTYpKTsKKwl3cml0ZXcoR0VOX1NFVF9TRUcsIHB0X2Jvb3RfY21kKTsKKworCWlmICh3YWl0X2N5YyhhZGRyKSA8IDApCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDAgOyBpIDwgbGVuIDsgaSArPSBDRk1fTE9BRF9CVUZTWikKKwkJaWYgKGJ1ZmZlcl9sb2FkKGFkZHIsIGNvZGUgKyBpLAorCQkJCW1pbl90KHUzMiwgQ0ZNX0xPQURfQlVGU1osIChsZW4gLSBpKSkpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAhIVxuIiwgbW9kbmFtZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCXJldHVybiAwOworfQorCisvKiBMb2FkIGFkYXB0ZXIgZnJvbSB0aGUgbWVtb3J5IGltYWdlIG9mIHRoZSBDWUNYIGZpcm13YXJlIG1vZHVsZS4KKyAqIG8gdmVyaWZ5IGZpcm13YXJlIGludGVncml0eSBhbmQgY29tcGF0aWJpbGl0eQorICogbyBzdGFydCBhZGFwdGVyIHVwICovCitzdGF0aWMgaW50IGxvYWRfY3ljMngoc3RydWN0IGN5Y3hfaHcgKmh3LCBzdHJ1Y3QgY3ljeF9maXJtd2FyZSAqY2ZtLCB1MzIgbGVuKQoreworCWludCBpLCBqOworCXN0cnVjdCBjeWN4X2Z3X2hlYWRlciAqaW1nX2hkcjsKKwl1OCAqcmVzZXRfaW1hZ2UsCisJICAgKmRhdGFfaW1hZ2UsCisJICAgKmNvZGVfaW1hZ2U7CisJdm9pZCBfX2lvbWVtICpwdF9jeWNsZCA9IGh3LT5kcG1iYXNlICsgMHg0MDA7CisJdTE2IGNrc3VtOworCisJLyogQW5ub3VuY2UgKi8KKwlwcmludGsoS0VSTl9JTkZPICIlczogZmlybXdhcmUgc2lnbmF0dXJlPVwiJXNcIlxuIiwgbW9kbmFtZSwKKwkJCQkJCQkgICAgY2ZtLT5zaWduYXR1cmUpOworCisJLyogVmVyaWZ5IGZpcm13YXJlIHNpZ25hdHVyZSAqLworCWlmIChzdHJjbXAoY2ZtLT5zaWduYXR1cmUsIENGTV9TSUdOQVRVUkUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6bG9hZF9jeWMyeDogbm90IEN5Y2xvbS0yWCBmaXJtd2FyZSFcbiIsCisJCQkJbW9kbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBmaXJtd2FyZSB2ZXJzaW9uPSV1XG4iLCBtb2RuYW1lLCBjZm0tPnZlcnNpb24pOworCisJLyogVmVyaWZ5IGZpcm13YXJlIG1vZHVsZSBmb3JtYXQgdmVyc2lvbiAqLworCWlmIChjZm0tPnZlcnNpb24gIT0gQ0ZNX1ZFUlNJT04pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczolczogZmlybXdhcmUgZm9ybWF0ICV1IHJlamVjdGVkISAiCisJCQkJIkV4cGVjdGluZyAldS5cbiIsCisJCQkJbW9kbmFtZSwgX19GVU5DVElPTl9fLCBjZm0tPnZlcnNpb24sIENGTV9WRVJTSU9OKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVmVyaWZ5IGZpcm13YXJlIG1vZHVsZSBsZW5ndGggYW5kIGNoZWNrc3VtICovCisJY2tzdW0gPSBjaGVja3N1bSgodTgqKSZjZm0tPmluZm8sIHNpemVvZihzdHJ1Y3QgY3ljeF9md19pbmZvKSArCisJCQkJCSAgY2ZtLT5pbmZvLmNvZGVzaXplKTsKKy8qCisJRklYTUUgY2ZtLT5pbmZvLmNvZGVzaXplIGlzIG9mZiBieSAyCisJaWYgKCgobGVuIC0gc2l6ZW9mKHN0cnVjdCBjeWN4X2Zpcm13YXJlKSAtIDEpICE9IGNmbS0+aW5mby5jb2Rlc2l6ZSkgfHwKKyovCisJaWYgKGNrc3VtICE9IGNmbS0+Y2hlY2tzdW0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczolczogZmlybXdhcmUgY29ycnVwdGVkIVxuIiwKKwkJCQltb2RuYW1lLCBfX0ZVTkNUSU9OX18pOworCQlwcmludGsoS0VSTl9FUlIgIiBjZHNpemUgPSAweCV4IChleHBlY3RlZCAweCVseClcbiIsCisJCQkJbGVuIC0gKGludClzaXplb2Yoc3RydWN0IGN5Y3hfZmlybXdhcmUpIC0gMSwKKwkJCQljZm0tPmluZm8uY29kZXNpemUpOworCQlwcmludGsoS0VSTl9FUlIgIiBjaGtzdW0gPSAweCV4IChleHBlY3RlZCAweCV4KVxuIiwKKwkJCQlja3N1bSwgY2ZtLT5jaGVja3N1bSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIElmIGV2ZXJ5dGhpbmcgaXMgb2ssIHNldCByZXNldCwgZGF0YSBhbmQgY29kZSBwb2ludGVycyAqLworCWltZ19oZHIgPSAoc3RydWN0IGN5Y3hfZndfaGVhZGVyICopJmNmbS0+aW1hZ2U7CisjaWZkZWYgRklSTVdBUkVfREVCVUcKKwlwcmludGsoS0VSTl9JTkZPICIlczolczogaW1hZ2Ugc2l6ZXNcbiIsIF9fRlVOQ1RJT05fXywgbW9kbmFtZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiIHJlc2V0PSVsdVxuIiwgaW1nX2hkci0+cmVzZXRfc2l6ZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiICBkYXRhPSVsdVxuIiwgaW1nX2hkci0+ZGF0YV9zaXplKTsKKwlwcmludGsoS0VSTl9JTkZPICIgIGNvZGU9JWx1XG4iLCBpbWdfaGRyLT5jb2RlX3NpemUpOworI2VuZGlmCisJcmVzZXRfaW1hZ2UgPSAoKHU4ICopaW1nX2hkcikgKyBzaXplb2Yoc3RydWN0IGN5Y3hfZndfaGVhZGVyKTsKKwlkYXRhX2ltYWdlID0gcmVzZXRfaW1hZ2UgKyBpbWdfaGRyLT5yZXNldF9zaXplOworCWNvZGVfaW1hZ2UgPSBkYXRhX2ltYWdlICsgaW1nX2hkci0+ZGF0YV9zaXplOworCisJLyotLS0tIFN0YXJ0IGxvYWQgLS0tLSovCisJLyogQW5ub3VuY2UgKi8KKwlwcmludGsoS0VSTl9JTkZPICIlczogbG9hZGluZyBmaXJtd2FyZSAlcyAoSUQ9JXUpLi4uXG4iLCBtb2RuYW1lLAorCQkJIGNmbS0+ZGVzY3JbMF0gPyBjZm0tPmRlc2NyIDogInVua25vd24gZmlybXdhcmUiLAorCQkJIGNmbS0+aW5mby5jb2RlaWQpOworCisJZm9yIChpID0gMCA7IGkgPCA1IDsgaSsrKSB7CisJCS8qIFJlc2V0IEN5Y2xvbSBoYXJkd2FyZSAqLworCQlpZiAoIXJlc2V0X2N5YzJ4KGh3LT5kcG1iYXNlKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZHBtIHByb2JsZW0gb3IgYm9hcmQgbm90IGZvdW5kXG4iLAorCQkJCQltb2RuYW1lKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogTG9hZCByZXNldC5iaW4gKi8KKwkJY3ljeF9yZXNldF9ib290KGh3LT5kcG1iYXNlLCByZXNldF9pbWFnZSwgaW1nX2hkci0+cmVzZXRfc2l6ZSk7CisJCS8qIHJlc2V0IGlzIHdhaXRpbmcgZm9yIGJvb3QgKi8KKwkJd3JpdGV3KEdFTl9QT1dFUl9PTiwgcHRfY3ljbGQpOworCQlkZWxheV9jeWN4KDEpOworCisJCWZvciAoaiA9IDAgOyBqIDwgMyA7IGorKykKKwkJCWlmICghcmVhZHcocHRfY3ljbGQpKQorCQkJCWdvdG8gcmVzZXRfbG9hZGVkOworCQkJZWxzZQorCQkJCWRlbGF5X2N5Y3goMSk7CisJfQorCisJcHJpbnRrKEtFUk5fRVJSICIlczogcmVzZXQgbm90IHN0YXJ0ZWQuXG4iLCBtb2RuYW1lKTsKKwlyZXR1cm4gLUVJTlZBTDsKKworcmVzZXRfbG9hZGVkOgorCS8qIExvYWQgZGF0YS5iaW4gKi8KKwlpZiAoY3ljeF9kYXRhX2Jvb3QoaHctPmRwbWJhc2UsIGRhdGFfaW1hZ2UsIGltZ19oZHItPmRhdGFfc2l6ZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IGxvYWQgZGF0YSBmaWxlLlxuIiwgbW9kbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIExvYWQgY29kZS5iaW4gKi8KKwlpZiAoY3ljeF9jb2RlX2Jvb3QoaHctPmRwbWJhc2UsIGNvZGVfaW1hZ2UsIGltZ19oZHItPmNvZGVfc2l6ZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IGxvYWQgY29kZSBmaWxlLlxuIiwgbW9kbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFByZXBhcmUgYm9vdC10aW1lIGNvbmZpZ3VyYXRpb24gZGF0YSAqLworCWN5Y3hfYm9vdGNmZyhodyk7CisKKwkvKiBraWNrLW9mZiBDUFUgKi8KKwljeWN4X3N0YXJ0KGh3LT5kcG1iYXNlKTsKKworCS8qIEFydGh1ciBHYW56ZXJ0J3MgdGlwOiB3YWl0IGEgd2hpbGUgYWZ0ZXIgdGhlIGZpcm13YXJlIGxvYWRpbmcuLi4KKwkgICBzZWcgYWJyIDI2IDE3OjE3OjEyIEVTVCAxOTk5IC0gYWNtZSAqLworCWRlbGF5X2N5Y3goNyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZpcm13YXJlIGxvYWRlZCFcbiIsIG1vZG5hbWUpOworCisJLyogZW5hYmxlIGludGVycnVwdHMgKi8KKwljeWN4X2ludGVuKGh3KTsKKworCXJldHVybiAwOworfQorCisvKiBQcmVwYXJlIGJvb3QtdGltZSBmaXJtd2FyZSBjb25maWd1cmF0aW9uIGRhdGEuCisgKiBvIGluaXRpYWxpemUgY29uZmlndXJhdGlvbiBkYXRhIGFyZWEKKyAgIEZyb20gYXN5bmMuZG9jIC0gVl8zLjQuMCAtIDA3LzE4LzE5OTQKKyAgIC0gQXMgb2Ygbm93LCBvbmx5IHN0YXRpYyBidWZmZXJzIGFyZSBhdmFpbGFibGUgdG8gdGhlIHVzZXIuCisgICAgIFNvLCB0aGUgYml0IFZEX1JYRElSQyBtdXN0IGJlIHNldCBpbiAndmFsaWQnLiBUaGF0IG1lYW5zIHRoYXQgdXNlcgorICAgICB3YW50cyB0byB1c2UgdGhlIHN0YXRpYyB0cmFuc21pc3Npb24gYW5kIHJlY2VwdGlvbiBidWZmZXJzLiAqLworc3RhdGljIHZvaWQgY3ljeF9ib290Y2ZnKHN0cnVjdCBjeWN4X2h3ICpodykKK3sKKwkvKiB1c2UgZml4ZWQgYnVmZmVycyAqLworCXdyaXRlYihGSVhFRF9CVUZGRVJTLCBody0+ZHBtYmFzZSArIENPTkZfT0ZGU0VUKTsKK30KKworLyogRGV0ZWN0IEN5Y2xvbSAyeCBhZGFwdGVyLgorICoJRm9sbG93aW5nIHRlc3RzIGFyZSB1c2VkIHRvIGRldGVjdCBDeWNsb20gMnggYWRhcHRlcjoKKyAqICAgICAgIHRvIGJlIGNvbXBsZXRlZCBiYXNlZCBvbiB0aGUgdGVzdHMgZG9uZSBiZWxvdworICoJUmV0dXJuIDEgaWYgZGV0ZWN0ZWQgby5rLiBvciAwIGlmIGZhaWxlZC4KKyAqCU5vdGU6CVRoaXMgdGVzdCBpcyBkZXN0cnVjdGl2ZSEgQWRhcHRlciB3aWxsIGJlIGxlZnQgaW4gc2h1dGRvd24KKyAqCQlzdGF0ZSBhZnRlciB0aGUgdGVzdC4gKi8KK3N0YXRpYyBpbnQgZGV0ZWN0X2N5YzJ4KHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlyZXNldF9jeWMyeChhZGRyKTsKKworCXJldHVybiBtZW1vcnlfZXhpc3RzKGFkZHIpOworfQorCisvKiBNaXNjZWxsYW5lb3VzICovCisvKiBHZXQgb3B0aW9uJ3MgaW5kZXggaW50byB0aGUgb3B0aW9ucyBsaXN0LgorICoJUmV0dXJuIG9wdGlvbidzIGluZGV4ICgxIC4uIE4pIG9yIHplcm8gaWYgb3B0aW9uIGlzIGludmFsaWQuICovCitzdGF0aWMgaW50IGdldF9vcHRpb25faW5kZXgobG9uZyAqb3B0bGlzdCwgbG9uZyBvcHR2YWwpCit7CisJaW50IGkgPSAxOworCisJZm9yICg7IGkgPD0gb3B0bGlzdFswXTsgKytpKQorCQlpZiAob3B0bGlzdFtpXSA9PSBvcHR2YWwpCisJCQlyZXR1cm4gaTsKKworCXJldHVybiAwOworfQorCisvKiBSZXNldCBhZGFwdGVyJ3MgQ1BVLiAqLworc3RhdGljIGludCByZXNldF9jeWMyeCh2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJd3JpdGViKDAsIGFkZHIgKyBSU1RfRU5BQkxFKTsKKwlkZWxheV9jeWN4KDIpOworCXdyaXRlYigwLCBhZGRyICsgUlNUX0RJU0FCTEUpOworCWRlbGF5X2N5Y3goMik7CisKKwlyZXR1cm4gbWVtb3J5X2V4aXN0cyhhZGRyKTsKK30KKworLyogRGVsYXkgKi8KK3N0YXRpYyB2b2lkIGRlbGF5X2N5Y3goaW50IHNlYykKK3sKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQoc2VjICogSFopOworfQorCisvKiBDYWxjdWxhdGUgMTYtYml0IENSQyB1c2luZyBDQ0lUVCBwb2x5bm9taWFsLiAqLworc3RhdGljIHUxNiBjaGVja3N1bSh1OCAqYnVmLCB1MzIgbGVuKQoreworCXUxNiBjcmMgPSAwOworCXUxNiBtYXNrLCBmbGFnOworCisJZm9yICg7IGxlbjsgLS1sZW4sICsrYnVmKQorCQlmb3IgKG1hc2sgPSAweDgwOyBtYXNrOyBtYXNrID4+PSAxKSB7CisJCQlmbGFnID0gKGNyYyAmIDB4ODAwMCk7CisJCQljcmMgPDw9IDE7CisJCQljcmMgfD0gKCgqYnVmICYgbWFzaykgPyAxIDogMCk7CisKKwkJCWlmIChmbGFnKQorCQkJCWNyYyBePSAweDEwMjE7CisJCX0KKworCXJldHVybiBjcmM7Cit9CisKK21vZHVsZV9pbml0KGN5Y3hfZHJ2X2luaXQpOworbW9kdWxlX2V4aXQoY3ljeF9kcnZfY2xlYW51cCk7CisKKy8qIEVuZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2N5Y3hfbWFpbi5jIGIvZHJpdmVycy9uZXQvd2FuL2N5Y3hfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNDgwNjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vY3ljeF9tYWluLmMKQEAgLTAsMCArMSwzNTEgQEAKKy8qCisqIGN5Y3hfbWFpbi5jCUN5Y2xhZGVzIEN5Y2xvbSAyWCBXQU4gTGluayBEcml2ZXIuIE1haW4gbW9kdWxlLgorKgorKiBBdXRob3I6CUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorKgorKiBDb3B5cmlnaHQ6CShjKSAxOTk4LTIwMDMgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvCisqCisqIEJhc2VkIG9uIHNkbGFtYWluLmMgYnkgR2VuZSBLb3ppbiA8Z2VuZWtAY29tcHVzZXJ2ZS5jb20+ICYKKyoJCQkgSmFzcHJlZXQgU2luZ2gJPGphc3ByZWV0QHNhbmdvbWEuY29tPgorKgorKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiBQbGVhc2UgbG9vayBhdCB0aGUgYml0a2VlcGVyIGNoYW5nZWxvZyAob3IgYW55IG90aGVyIHNjbSB0b29sIHRoYXQgZW5kcyB1cAorKiBpbXBvcnRpbmcgYml0a2VlcGVyIGNoYW5nZWxvZyBvciB0aGF0IHJlcGxhY2VzIGJpdGtlZXBlciBpbiB0aGUgZnV0dXJlIGFzCisqIG1haW4gdG9vbCBmb3IgbGludXggZGV2ZWxvcG1lbnQpLgorKiAKKyogMjAwMS8wNS8wOQlhY21lCQlGaXggTU9EVUxFX0RFU0MgZm9yIGRlYnVnLCAuYnNzIG5pdHBpY2tzLAorKiAJCQkJc29tZSBjbGVhbnVwcworKiAyMDAwLzA3LzEzCWFjbWUJCXJlbW92ZSB1c2VsZXNzICNpZmRlZiBNT0RVTEUgYW5kIGNyYXAKKyoJCQkJI2lmIEtFUk5FTF9WRVJTSU9OID4gYmxhaAorKiAyMDAwLzA3LzA2CWFjbWUJCV9fZXhpdCBhdCBjeWNsb214X2NsZWFudXAKKyogMjAwMC8wNC8wMglhY21lCQlkcHJpbnRrIGFuZCBjeWN4X2RlYnVnCisqIAkJCQltb2R1bGVfaW5pdC9tb2R1bGVfZXhpdAorKiAyMDAwLzAxLzIxCWFjbWUJCXJlbmFtZSBjeWNsb214X29wZW4gdG8gY3ljbG9teF9tb2RfaW5jX3VzZV9jb3VudAorKgkJCQlhbmQgY3ljbG9teF9jbG9zZSB0byBjeWNsb214X21vZF9kZWNfdXNlX2NvdW50CisqIDIwMDAvMDEvMDgJYWNtZQkJY2xlYW51cAorKiAxOTk5LzExLzA2CWFjbWUJCWN5Y3hfZG93biBiYWNrIHRvIGxpZmUgKGl0IG5lZWRzIHRvIGJlCisqCQkJCWNhbGxlZCB0byBpb3VubWFwIHRoZSBkcG1iYXNlKQorKiAxOTk5LzA4LzA5CWFjbWUJCXJlbW92ZWQgcmVmZXJlbmNlcyB0byBlbmFibGVfdHhfaW50CisqCQkJCXVzZSBzcGlubG9ja3MgaW5zdGVhZCBvZiBjbGkvc3RpIGluCisqCQkJCWN5Y2xvbXhfc2V0X3N0YXRlCisqIDE5OTkvMDUvMTkJYWNtZQkJd29ya3MgZGlyZWN0bHkgbGlua2VkIGludG8gdGhlIGtlcm5lbAorKgkJCQlpbml0X3dhaXRxdWV1ZV9oZWFkIGZvciAyLjMuKiBrZXJuZWwKKyogMTk5OS8wNS8xOAlhY21lCQltYWpvciBjbGVhbnVwIChwb2xsaW5nIG5vdCBuZWVkZWQpLCBldGMKKyogMTk5OC8wOC8yOAlhY21lCQltaW5vciBjbGVhbnVwIChpb2N0bHMgZm9yIGZpcm13YXJlIGRlbGV0ZWQpCisqCQkJCXF1ZXVlX3Rhc2sgYWN0aXZhdGVkCisqIDE5OTgvMDgvMDgJYWNtZQkJSW5pdGlhbCB2ZXJzaW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgkvKiBPUyBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4JLyogb2Zmc2V0b2YoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CS8qIHJldHVybiBjb2RlcyAqLworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgkvKiBpbmxpbmUgbWVtc2V0KCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CQkvKiBrbWFsbG9jKCksIGtmcmVlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4JLyogcHJpbnRrKCksIGFuZCBvdGhlciB1c2VmdWwgc3R1ZmYgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogc3VwcG9ydCBmb3IgbG9hZGFibGUgbW9kdWxlcyAqLworI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgkvKiByZXF1ZXN0X3JlZ2lvbigpLCByZWxlYXNlX3JlZ2lvbigpICovCisjaW5jbHVkZSA8bGludXgvd2Fucm91dGVyLmg+CS8qIFdBTiByb3V0ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9jeWNsb214Lmg+CS8qIGN5Y2xvbXggY29tbW9uIHVzZXIgQVBJIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPiAgICAgICAgIC8qIF9faW5pdCAod2hlbiBub3QgdXNpbmcgYXMgYSBtb2R1bGUpICovCisKK3Vuc2lnbmVkIGludCBjeWN4X2RlYnVnOworCitNT0RVTEVfQVVUSE9SKCJBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ3ljbG9tIDJYIFN5bmMgQ2FyZCBEcml2ZXIuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfcGFyYW0oY3ljeF9kZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY3ljeF9kZWJ1ZywgImN5Y2xvbXggZGVidWcgbGV2ZWwiKTsKKworLyogRGVmaW5lcyAmIE1hY3JvcyAqLworCisjZGVmaW5lCUNZQ1hfRFJWX1ZFUlNJT04JMAkvKiB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZQlDWUNYX0RSVl9SRUxFQVNFCTExCS8qIHJlbGVhc2UgKG1pbm9yIHZlcnNpb24pIG51bWJlciAqLworI2RlZmluZQlDWUNYX01BWF9DQVJEUwkJMQkvKiBtYXggbnVtYmVyIG9mIGFkYXB0ZXJzICovCisKKyNkZWZpbmUJQ09ORklHX0NZQ1hfQ0FSRFMgMQorCisvKiBGdW5jdGlvbiBQcm90b3R5cGVzICovCisKKy8qIFdBTiBsaW5rIGRyaXZlciBlbnRyeSBwb2ludHMgKi8KK3N0YXRpYyBpbnQgY3ljeF93YW5fc2V0dXAoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiwgd2FuZGV2X2NvbmZfdCAqY29uZik7CitzdGF0aWMgaW50IGN5Y3hfd2FuX3NodXRkb3duKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYpOworCisvKiBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyAqLworc3RhdGljIGlycXJldHVybl90IGN5Y3hfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisvKiBHbG9iYWwgRGF0YQorICogTm90ZTogQWxsIGRhdGEgbXVzdCBiZSBleHBsaWNpdGx5IGluaXRpYWxpemVkISEhCisgKi8KKworLyogcHJpdmF0ZSBkYXRhICovCitzdGF0aWMgY2hhciBjeWN4X2Rydm5hbWVbXSA9ICJjeWNsb214IjsKK3N0YXRpYyBjaGFyIGN5Y3hfZnVsbG5hbWVbXSA9ICJDWUNMT00gMlgodG0pIFN5bmMgQ2FyZCBEcml2ZXIiOworc3RhdGljIGNoYXIgY3ljeF9jb3B5cmlnaHRbXSA9ICIoYykgMTk5OC0yMDAzIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyAiCisJCQkgICI8YWNtZUBjb25lY3RpdmEuY29tLmJyPiI7CitzdGF0aWMgaW50IGN5Y3hfbmNhcmRzID0gQ09ORklHX0NZQ1hfQ0FSRFM7CitzdGF0aWMgc3RydWN0IGN5Y3hfZGV2aWNlICpjeWN4X2NhcmRfYXJyYXk7CS8qIGFkYXB0ZXIgZGF0YSBzcGFjZSAqLworCisvKiBLZXJuZWwgTG9hZGFibGUgTW9kdWxlIEVudHJ5IFBvaW50cyAqLworCisvKgorICogTW9kdWxlICdpbnNlcnQnIGVudHJ5IHBvaW50LgorICogbyBwcmludCBhbm5vdW5jZW1lbnQKKyAqIG8gYWxsb2NhdGUgYWRhcHRlciBkYXRhIHNwYWNlCisgKiBvIGluaXRpYWxpemUgc3RhdGljIGRhdGEKKyAqIG8gcmVnaXN0ZXIgYWxsIGNhcmRzIHdpdGggV0FOIHJvdXRlcgorICogbyBjYWxpYnJhdGUgQ3ljbG9tIDJYIHNoYXJlZCBtZW1vcnkgYWNjZXNzIGRlbGF5LgorICoKKyAqIFJldHVybjoJMAlPaworICoJCTwgMAllcnJvci4KKyAqIENvbnRleHQ6CXByb2Nlc3MKKyAqLworaW50IF9faW5pdCBjeWN4X2luaXQodm9pZCkKK3sKKwlpbnQgY250LCBlcnIgPSAtRU5PTUVNOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgdiV1LiV1ICVzXG4iLAorCQljeWN4X2Z1bGxuYW1lLCBDWUNYX0RSVl9WRVJTSU9OLCBDWUNYX0RSVl9SRUxFQVNFLAorCQljeWN4X2NvcHlyaWdodCk7CisKKwkvKiBWZXJpZnkgbnVtYmVyIG9mIGNhcmRzIGFuZCBhbGxvY2F0ZSBhZGFwdGVyIGRhdGEgc3BhY2UgKi8KKwljeWN4X25jYXJkcyA9IG1pbl90KGludCwgY3ljeF9uY2FyZHMsIENZQ1hfTUFYX0NBUkRTKTsKKwljeWN4X25jYXJkcyA9IG1heF90KGludCwgY3ljeF9uY2FyZHMsIDEpOworCWN5Y3hfY2FyZF9hcnJheSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjeWN4X2RldmljZSkgKiBjeWN4X25jYXJkcywKKwkJCQkgIEdGUF9LRVJORUwpOworCWlmICghY3ljeF9jYXJkX2FycmF5KQorCQlnb3RvIG91dDsKKworCW1lbXNldChjeWN4X2NhcmRfYXJyYXksIDAsIHNpemVvZihzdHJ1Y3QgY3ljeF9kZXZpY2UpICogY3ljeF9uY2FyZHMpOworCisJLyogUmVnaXN0ZXIgYWRhcHRlcnMgd2l0aCBXQU4gcm91dGVyICovCisJZm9yIChjbnQgPSAwOyBjbnQgPCBjeWN4X25jYXJkczsgKytjbnQpIHsKKwkJc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkID0gJmN5Y3hfY2FyZF9hcnJheVtjbnRdOworCQlzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2ID0gJmNhcmQtPndhbmRldjsKKworCQlzcHJpbnRmKGNhcmQtPmRldm5hbWUsICIlcyVkIiwgY3ljeF9kcnZuYW1lLCBjbnQgKyAxKTsKKwkJd2FuZGV2LT5tYWdpYyAgICA9IFJPVVRFUl9NQUdJQzsKKwkJd2FuZGV2LT5uYW1lICAgICA9IGNhcmQtPmRldm5hbWU7CisJCXdhbmRldi0+cHJpdmF0ZSAgPSBjYXJkOworCQl3YW5kZXYtPnNldHVwICAgID0gY3ljeF93YW5fc2V0dXA7CisJCXdhbmRldi0+c2h1dGRvd24gPSBjeWN4X3dhbl9zaHV0ZG93bjsKKwkJZXJyID0gcmVnaXN0ZXJfd2FuX2RldmljZSh3YW5kZXYpOworCisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzIHJlZ2lzdHJhdGlvbiBmYWlsZWQgd2l0aCAiCisJCQkJCSJlcnJvciAlZCFcbiIsCisJCQkJCWN5Y3hfZHJ2bmFtZSwgY2FyZC0+ZGV2bmFtZSwgZXJyKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZXJyID0gLUVOT0RFVjsKKwlpZiAoIWNudCkgeworCQlrZnJlZShjeWN4X2NhcmRfYXJyYXkpOworCQlnb3RvIG91dDsKKwl9CisJZXJyID0gMDsKKwljeWN4X25jYXJkcyA9IGNudDsJLyogYWRqdXN0IGFjdHVhbCBudW1iZXIgb2YgY2FyZHMgKi8KK291dDoJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIE1vZHVsZSAncmVtb3ZlJyBlbnRyeSBwb2ludC4KKyAqIG8gdW5yZWdpc3RlciBhbGwgYWRhcHRlcnMgZnJvbSB0aGUgV0FOIHJvdXRlcgorICogbyByZWxlYXNlIGFsbCByZW1haW5pbmcgc3lzdGVtIHJlc291cmNlcworICovCitzdGF0aWMgdm9pZCBfX2V4aXQgY3ljeF9leGl0KHZvaWQpCit7CisJaW50IGkgPSAwOworCisJZm9yICg7IGkgPCBjeWN4X25jYXJkczsgKytpKSB7CisJCXN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCA9ICZjeWN4X2NhcmRfYXJyYXlbaV07CisJCXVucmVnaXN0ZXJfd2FuX2RldmljZShjYXJkLT5kZXZuYW1lKTsKKwl9CisKKwlrZnJlZShjeWN4X2NhcmRfYXJyYXkpOworfQorCisvKiBXQU4gRGV2aWNlIERyaXZlciBFbnRyeSBQb2ludHMgKi8KKy8qCisgKiBTZXR1cC9jb25maWd1cmUgV0FOIGxpbmsgZHJpdmVyLgorICogbyBjaGVjayBhZGFwdGVyIHN0YXRlCisgKiBvIG1ha2Ugc3VyZSBmaXJtd2FyZSBpcyBwcmVzZW50IGluIGNvbmZpZ3VyYXRpb24KKyAqIG8gYWxsb2NhdGUgaW50ZXJydXB0IHZlY3RvcgorICogbyBzZXR1cCBDeWNsb20gMlggaGFyZHdhcmUKKyAqIG8gY2FsbCBhcHByb3ByaWF0ZSByb3V0aW5lIHRvIHBlcmZvcm0gcHJvdG9jb2wtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHJvdXRlciBoYW5kbGVzIFJPVVRFUl9TRVRVUCBJT0NUTC4gVGhlCisgKiBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBpcyBpbiBrZXJuZWwgbWVtb3J5IChpbmNsdWRpbmcgZXh0ZW5kZWQgZGF0YSwgaWYKKyAqIGFueSkuCisgKi8KK3N0YXRpYyBpbnQgY3ljeF93YW5fc2V0dXAoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiwgd2FuZGV2X2NvbmZfdCAqY29uZikKK3sKKwlpbnQgcmMgPSAtRUZBVUxUOworCXN0cnVjdCBjeWN4X2RldmljZSAqY2FyZDsKKwlpbnQgaXJxOworCisJLyogU2FuaXR5IGNoZWNrcyAqLworCisJaWYgKCF3YW5kZXYgfHwgIXdhbmRldi0+cHJpdmF0ZSB8fCAhY29uZikKKwkJZ290byBvdXQ7CisKKwljYXJkID0gd2FuZGV2LT5wcml2YXRlOworCXJjID0gLUVCVVNZOworCWlmICh3YW5kZXYtPnN0YXRlICE9IFdBTl9VTkNPTkZJR1VSRUQpCisJCWdvdG8gb3V0OworCisJcmMgPSAtRUlOVkFMOworCWlmICghY29uZi0+ZGF0YV9zaXplIHx8ICFjb25mLT5kYXRhKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZpcm13YXJlIG5vdCBmb3VuZCBpbiBjb25maWd1cmF0aW9uICIKKwkJCQkiZGF0YSFcbiIsIHdhbmRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChjb25mLT5pcnEgPD0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCBjb25maWd1cmUgd2l0aG91dCBJUlEhXG4iLAorCQkJCXdhbmRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEFsbG9jYXRlIElSUSAqLworCWlycSA9IGNvbmYtPmlycSA9PSAyID8gOSA6IGNvbmYtPmlycTsJLyogSVJRMiAtPiBJUlE5ICovCisKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBjeWN4X2lzciwgMCwgd2FuZGV2LT5uYW1lLCBjYXJkKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCByZXNlcnZlIElSUSAlZCFcbiIsCisJCQkJd2FuZGV2LT5uYW1lLCBpcnEpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBDb25maWd1cmUgaGFyZHdhcmUsIGxvYWQgZmlybXdhcmUsIGV0Yy4gKi8KKwltZW1zZXQoJmNhcmQtPmh3LCAwLCBzaXplb2YoY2FyZC0+aHcpKTsKKwljYXJkLT5ody5pcnEJID0gaXJxOworCWNhcmQtPmh3LmRwbXNpemUgPSBDWUNYX1dJTkRPV1NJWkU7CisJY2FyZC0+aHcuZndpZAkgPSBDRklEX1gyNV8yWDsKKwlzcGluX2xvY2tfaW5pdCgmY2FyZC0+bG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY2FyZC0+d2FpdF9zdGF0cyk7CisKKwlyYyA9IGN5Y3hfc2V0dXAoJmNhcmQtPmh3LCBjb25mLT5kYXRhLCBjb25mLT5kYXRhX3NpemUsIGNvbmYtPm1hZGRyKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X2lycTsKKworCS8qIEluaXRpYWxpemUgV0FOIGRldmljZSBkYXRhIHNwYWNlICovCisJd2FuZGV2LT5pcnEgICAgICAgPSBpcnE7CisJd2FuZGV2LT5kbWEgICAgICAgPSB3YW5kZXYtPmlvcG9ydCA9IDA7CisJd2FuZGV2LT5tYWRkciAgICAgPSAodW5zaWduZWQgbG9uZyljYXJkLT5ody5kcG1iYXNlOworCXdhbmRldi0+bXNpemUgICAgID0gY2FyZC0+aHcuZHBtc2l6ZTsKKwl3YW5kZXYtPmh3X29wdFsyXSA9IDA7CisJd2FuZGV2LT5od19vcHRbM10gPSBjYXJkLT5ody5md2lkOworCisJLyogUHJvdG9jb2wtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKi8KKwlzd2l0Y2ggKGNhcmQtPmh3LmZ3aWQpIHsKKyNpZmRlZiBDT05GSUdfQ1lDTE9NWF9YMjUKKwljYXNlIENGSURfWDI1XzJYOgorCQlyYyA9IGN5Y3hfeDI1X3dhbl9pbml0KGNhcmQsIGNvbmYpOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHRoaXMgZmlybXdhcmUgaXMgbm90IHN1cHBvcnRlZCFcbiIsCisJCQkJd2FuZGV2LT5uYW1lKTsKKwkJcmMgPSAtRUlOVkFMOworCX0KKworCWlmIChyYykgeworCQljeWN4X2Rvd24oJmNhcmQtPmh3KTsKKwkJZ290byBvdXRfaXJxOworCX0KKworCXJjID0gMDsKK291dDoKKwlyZXR1cm4gcmM7CitvdXRfaXJxOgorCWZyZWVfaXJxKGlycSwgY2FyZCk7CisJZ290byBvdXQ7Cit9CisKKy8qCisgKiBTaHV0IGRvd24gV0FOIGxpbmsgZHJpdmVyLgorICogbyBzaHV0IGRvd24gYWRhcHRlciBoYXJkd2FyZQorICogbyByZWxlYXNlIHN5c3RlbSByZXNvdXJjZXMuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHJvdXRlciB3aGVuIGRldmljZSBpcyBiZWluZyB1bnJlZ2lzdGVyZWQgb3IKKyAqIHdoZW4gaXQgaGFuZGxlcyBST1VURVJfRE9XTiBJT0NUTC4KKyAqLworc3RhdGljIGludCBjeWN4X3dhbl9zaHV0ZG93bihzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2KQoreworCWludCByZXQgPSAtRUZBVUxUOworCXN0cnVjdCBjeWN4X2RldmljZSAqY2FyZDsKKworCS8qIHNhbml0eSBjaGVja3MgKi8KKwlpZiAoIXdhbmRldiB8fCAhd2FuZGV2LT5wcml2YXRlKQorCQlnb3RvIG91dDsKKworCXJldCA9IDA7CisJaWYgKHdhbmRldi0+c3RhdGUgPT0gV0FOX1VOQ09ORklHVVJFRCkKKwkJZ290byBvdXQ7CisKKwljYXJkID0gd2FuZGV2LT5wcml2YXRlOworCXdhbmRldi0+c3RhdGUgPSBXQU5fVU5DT05GSUdVUkVEOworCWN5Y3hfZG93bigmY2FyZC0+aHcpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBpcnEgJWQgYmVpbmcgZnJlZWQhXG4iLCB3YW5kZXYtPm5hbWUsCisJCQl3YW5kZXYtPmlycSk7CisJZnJlZV9pcnEod2FuZGV2LT5pcnEsIGNhcmQpOworb3V0OglyZXR1cm4gcmV0OworfQorCisvKiBNaXNjZWxsYW5lb3VzICovCisvKgorICogQ3ljbG9tIDJYIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUuCisgKiBvIGFja25vd2xlZGdlIEN5Y2xvbSAyWCBoYXJkd2FyZSBpbnRlcnJ1cHQuCisgKiBvIGNhbGwgcHJvdG9jb2wtc3BlY2lmaWMgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSwgaWYgYW55LgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgY3ljeF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQgPSAoc3RydWN0IGN5Y3hfZGV2aWNlICopZGV2X2lkOworCisJaWYgKCFjYXJkIHx8IGNhcmQtPndhbmRldi5zdGF0ZSA9PSBXQU5fVU5DT05GSUdVUkVEKQorCQlnb3RvIG91dDsKKworCWlmIChjYXJkLT5pbl9pc3IpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGludGVycnVwdCByZS1lbnRyYW5jeSBvbiBJUlEgJWQhXG4iLAorCQkJCSAgICBjYXJkLT5kZXZuYW1lLCBjYXJkLT53YW5kZXYuaXJxKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGNhcmQtPmlzcikKKwkJY2FyZC0+aXNyKGNhcmQpOworCXJldHVybiBJUlFfSEFORExFRDsKK291dDoKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKKy8qIFNldCBXQU4gZGV2aWNlIHN0YXRlLiAgKi8KK3ZvaWQgY3ljeF9zZXRfc3RhdGUoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLCBpbnQgc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljaGFyICpzdHJpbmdfc3RhdGUgPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCWlmIChjYXJkLT53YW5kZXYuc3RhdGUgIT0gc3RhdGUpIHsKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIFdBTl9DT05ORUNURUQ6CisJCQlzdHJpbmdfc3RhdGUgPSAiY29ubmVjdGVkISI7CisJCQlicmVhazsKKwkJY2FzZSBXQU5fRElTQ09OTkVDVEVEOgorCQkJc3RyaW5nX3N0YXRlID0gImRpc2Nvbm5lY3RlZCEiOworCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgJXNcbiIsIGNhcmQtPmRldm5hbWUsIHN0cmluZ19zdGF0ZSk7CisJCWNhcmQtPndhbmRldi5zdGF0ZSA9IHN0YXRlOworCX0KKworCWNhcmQtPnN0YXRlX3RpY2sgPSBqaWZmaWVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworbW9kdWxlX2luaXQoY3ljeF9pbml0KTsKK21vZHVsZV9leGl0KGN5Y3hfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vY3ljeF94MjUuYyBiL2RyaXZlcnMvbmV0L3dhbi9jeWN4X3gyNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNDhjZDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vY3ljeF94MjUuYwpAQCAtMCwwICsxLDE2MDkgQEAKKy8qCisqIGN5Y3hfeDI1LmMJQ3ljbG9tIDJYIFdBTiBMaW5rIERyaXZlci4gIFguMjUgbW9kdWxlLgorKgorKiBBdXRob3I6CUFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorKgorKiBDb3B5cmlnaHQ6CShjKSAxOTk4LTIwMDMgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvCisqCisqIEJhc2VkIG9uIHNkbGFfeDI1LmMgYnkgR2VuZSBLb3ppbiA8Z2VuZWtAY29tcHVzZXJ2ZS5jb20+CisqCisqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIDIwMDEvMDEvMTIJYWNtZQkJdXNlIGRldl9rZnJlZV9za2JfaXJxIG9uIGludGVycnVwdCBjb250ZXh0CisqIDIwMDAvMDQvMDIJYWNtZQkJZHByaW50aywgY3ljeF9kZWJ1ZworKiAJCQkJZml4ZWQgdGhlIGJ1ZyBpbnRyb2R1Y2VkIGluIGdldF9kZXZfYnlfbGNuIGFuZAorKiAJCQkJZ2V0X2Rldl9ieV9kdGVfYWRkciBieSB0aGUgYW5vbnltb3VzIGhhY2tlcgorKiAJCQkJdGhhdCBjb252ZXJ0ZWQgdGhpcyBkcml2ZXIgdG8gc29mdG5ldAorKiAyMDAwLzAxLzA4CWFjbWUJCWNsZWFudXAKKyogMTk5OS8xMC8yNwlhY21lCQl1c2UgQVJQSFJEX0hXWDI1IHNvIHRoYXQgdGhlIFguMjUgc3RhY2sga25vdworKgkJCQl0aGF0IHdlIGhhdmUgYSBYLjI1IHN0YWNrIGltcGxlbWVudGVkIGluCisqCQkJCWZpcm13YXJlIG9uYm9hcmQKKyogMTk5OS8xMC8xOAlhY21lCQlzdXBwb3J0IGZvciBYLjI1IHNvY2tldHMgaW4gaWZfc2VuZCwKKyoJCQkJYmV3YXJlOiBzb2NrZXQoQUZfWDI1Li4uKSBJUyBXT1JLIElOIFBST0dSRVNTLAorKgkJCQlUQ1AvSVAgb3ZlciBYLjI1IHZpYSB3YW5yb3V0ZXIgbm90IGFmZmVjdGVkLAorKgkJCQl3b3JraW5nLgorKiAxOTk5LzEwLzA5CWFjbWUJCWNoYW5fZGlzYyByZW5hbWVkIHRvIGNoYW5fZGlzY29ubmVjdCwKKyogCQkJCWJlZ2FuIGFkZGluZyBzdXBwb3J0IGZvciBYLjI1IHNvY2tldHM6CisqIAkJCQljb25mLT5wcm90b2NvbCBpbiBuZXdfaWYKKyogMTk5OS8xMC8wNQlhY21lCQlmaXhlZCByZXR1cm4gRS4uLiB0byByZXR1cm4gLUUuLi4KKyogMTk5OS8wOC8xMAlhY21lCQlzZXJpYWxpemVkIGFjY2VzcyB0byB0aGUgY2FyZCB0aHJ1IGEgc3BpbmxvY2sKKyoJCQkJaW4geDI1X2V4ZWMKKyogMTk5OS8wOC8wOQlhY21lCQlyZW1vdmVkIHBlciBjaGFubmVsIHNwaW5sb2NrcworKgkJCQlyZW1vdmVkIHJlZmVyZW5jZXMgdG8gZW5hYmxlX3R4X2ludAorKiAxOTk5LzA1LzI4CWFjbWUJCWZpeGVkIG5pYmJsZV90b19ieXRlLCBhY2t2YyBub3cgcHJvcGVybHkgdHJlYXRlZAorKgkJCQlpZl9zZW5kIHNpbXBsaWZpZWQKKyogMTk5OS8wNS8yNQlhY21lCQlmaXhlZCB0MSwgdDIsIHQyMSAmIHQyMyBjb25maWd1cmF0aW9uCisqCQkJCXVzZSBzcGlubG9ja3MgaW5zdGVhZCBvZiBjbGkvc3RpIGluIHNvbWUgcG9pbnRzCisqIDE5OTkvMDUvMjQJYWNtZQkJZmluaXNoZWQgdGhlIHgyNV9nZXRfc3RhdCBmdW5jdGlvbgorKiAxOTk5LzA1LzIzCWFjbWUJCWRldi0+dHlwZSA9IEFSUEhSRF9YMjUgKHRjcGR1bXAgb25seSB3b3JrcywKKyoJCQkJQUZBSVQsIHdpdGggQVJQSFJEX0VUSEVSKS4gVGhpcyBzZWVtcyB0byBiZQorKgkJCQluZWVkZWQgdG8gdXNlIHNvY2tldChBRl9YMjUpLi4uCisqCQkJCU5vdyB0aGUgY29uZmlnIGZpbGUgbXVzdCBzcGVjaWZ5IGEgcGVlciBtZWRpYQorKgkJCQlhZGRyZXNzIGZvciBzdmMgY2hhbm5lbHMgb3ZlciBhIGNyb3Nzb3ZlciBjYWJsZS4KKyoJCQkJUmVtb3ZlZCBob2xkX3RpbWVvdXQgZnJvbSB4MjVfY2hhbm5lbF90LAorKgkJCQlub3QgdXNlZC4KKyoJCQkJQSBsaXR0bGUgZW5oYW5jZW1lbnQgaW4gdGhlIERFQlVHIHByb2Nlc3NpbmcKKyogMTk5OS8wNS8yMglhY21lCQlnbyB0byBESVNDT05ORUNURUQgaW4gZGlzY29ubmVjdF9jb25maXJtX2ludHIsCisqCQkJCWluc3RlYWQgb2YgY2hhbl9kaXNjLgorKiAxOTk5LzA1LzE2CW1hcmNlbG8JCWZpeGVkIHRpbWVyIGluaXRpYWxpemF0aW9uIGluIFNWQ3MKKyogMTk5OS8wMS8wNQlhY21lCQl4MjVfY29uZmlndXJlIG5vdyBnZXQgKG1vc3Qgb2YpIGFsbAorKgkJCQlwYXJhbWV0ZXJzLi4uCisqIDE5OTkvMDEvMDUJYWNtZQkJcGt0bGVuIG5vdyAoY29ycmVjdGx5KSB1c2VzIGxvZzIgKHZhbHVlCisqCQkJCWNvbmZpZ3VyZWQpCisqIDE5OTkvMDEvMDMJYWNtZQkJanVkaWNpb3VzIHVzZSBvZiBkYXRhIHR5cGVzICh1OCwgdTE2LCB1MzIsIGV0YykKKyogMTk5OS8wMS8wMwlhY21lCQljeXhfaXNyOiByZXNldCBkcG1iYXNlIHRvIGFja25vd2xlZGdlCisqCQkJCWluZGljYXRpb24gKGludGVycnVwdCBmcm9tIGN5Y2xvbSAyeCkKKyogMTk5OS8wMS8wMglhY21lCQljeXhfaXNyOiBmaXJzdCBoYWNraW5ncy4uLgorKiAxOTk5LzAxLzAyMDMgIGFjbWUgCQl3aGVuIGluaXRpYWxpemluZyBhbiBhcnJheSBkb24ndCBnaXZlIGxlc3MKKyoJCQkJZWxlbWVudHMgdGhhbiBkZWNsYXJlZC4uLgorKiAJCQkJZXhhbXBsZTogY2hhciBzZW5kX2NtZFs2XSA9ICI/XHhGRlx4MTAiOworKiAgICAgICAgICAJCQl5b3UnbGwgZ29ubmEgbG9zZSBhIGNvdXBsZSBob3VycywgJ2NhdXNlIHlvdXIKKyoJCQkJYnJhaW4gd29uJ3QgYWRtaXQgdGhhdCB0aGVyZSdzIGFuIGVycm9yIGluIHRoZQorKgkJCQlhYm92ZSBkZWNsYXJhdGlvbi4uLiAgdGhlIHNpZGUgZWZmZWN0IGlzIHRoYXQKKyoJCQkJbWVtc2V0IGlzIHB1dCBpbnRvIHRoZSB1bnJlc29sdmVkIHN5bWJvbHMKKyoJCQkJaW5zdGVhZCBvZiB1c2luZyB0aGUgaW5saW5lIG1lbXNldCBmdW5jdGlvbnMuLi4KKyogMTk5OS8wMS8wMiAgICBhY21lIAkJYmVnYW4gY2hhbl9jb25uZWN0LCBjaGFuX3NlbmQsIHgyNV9zZW5kCisqIDE5OTgvMTIvMzEJYWNtZQkJeDI1X2NvbmZpZ3VyZQorKgkJCQl0aGlzIGNvZGUgY2FuIGJlIGNvbXBpbGVkIGFzIG5vbiBtb2R1bGUKKyogMTk5OC8xMi8yNwlhY21lCQljb2RlIGNsZWFudXAKKyoJCQkJSVBYIGNvZGUgd2lwZWQgb3V0ISBsZXQncyBkZWNyZWFzZSBjb2RlCisqCQkJCWNvbXBsZXhpdHkgZm9yIG5vdywgcmVtZW1iZXI6IEknbSBsZWFybmluZyEgOikKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnBzX3RvX3NwZWVkX2NvZGUgT0sKKyogMTk5OC8xMi8yNglhY21lCQlNaW5pbWFsIGRlYnVnIGNvZGUgY2xlYW51cAorKiAxOTk4LzA4LzA4CWFjbWUJCUluaXRpYWwgdmVyc2lvbi4KKyovCisKKyNkZWZpbmUgQ1lDTE9NWF9YMjVfREVCVUcgMQorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4JLyogcmV0dXJuIGNvZGVzICovCisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+ICAgICAgIC8qIEFSUEhSRF9IV1gyNSAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkvKiBwcmludGsoKSwgYW5kIG90aGVyIHVzZWZ1bCBzdHVmZiAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgkvKiBpbmxpbmUgbWVtc2V0KCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CQkvKiBrbWFsbG9jKCksIGtmcmVlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4JLyogb2Zmc2V0b2YoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L3dhbnJvdXRlci5oPgkvKiBXQU4gcm91dGVyIGRlZmluaXRpb25zICovCisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CS8qIGh0b25zKCksIGV0Yy4gKi8KKworI2luY2x1ZGUgPGxpbnV4L2N5Y2xvbXguaD4JLyogQ3ljbG9tIDJYIGNvbW1vbiB1c2VyIEFQSSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L2N5Y3hfeDI1Lmg+CS8qIFguMjUgZmlybXdhcmUgQVBJIGRlZmluaXRpb25zICovCisKKyNpbmNsdWRlIDxuZXQveDI1ZGV2aWNlLmg+CisKKy8qIERlZmluZXMgJiBNYWNyb3MgKi8KKyNkZWZpbmUgQ1lDWF9YMjVfTUFYX0NNRF9SRVRSWSA1CisjZGVmaW5lIENZQ1hfWDI1X0NIQU5fTVRVIDIwNDgJLyogdW5mcmFnbWVudGVkIGxvZ2ljYWwgY2hhbm5lbCBNVFUgKi8KKworLyogRGF0YSBTdHJ1Y3R1cmVzICovCisvKiBUaGlzIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgJ3N0cnVjdCBuZXRfZGV2aWNlJyB3ZSBjcmVhdGUgZm9yIGVhY2ggbmV0d29yaworICAgaW50ZXJmYWNlIHRvIGtlZXAgdGhlIHJlc3Qgb2YgWC4yNSBjaGFubmVsLXNwZWNpZmljIGRhdGEuICovCitzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCB7CisJLyogVGhpcyBtZW1iZXIgbXVzdCBiZSBmaXJzdC4gKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmU7CS8qIFdBTiBzbGF2ZSAqLworCisJY2hhciBuYW1lW1dBTl9JRk5BTUVfU1orMV07CS8qIGludGVyZmFjZSBuYW1lLCBBU0NJSVogKi8KKwljaGFyIGFkZHJbV0FOX0FERFJFU1NfU1orMV07CS8qIG1lZGlhIGFkZHJlc3MsIEFTQ0lJWiAqLworCWNoYXIgKmxvY2FsX2FkZHI7CQkvKiBsb2NhbCBtZWRpYSBhZGRyZXNzLCBBU0NJSVogLQorCQkJCQkgICBzdmMgdGhydSBjcm9zc292ZXIgY2FibGUgKi8KKwlzMTYgbGNuOwkJCS8qIGxvZ2ljYWwgY2hhbm5lbCBudW1iZXIvY29ubi5yZXEua2V5Ki8KKwl1OCBsaW5rOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwkvKiB0aW1lciB1c2VkIGZvciBzdmMgY2hhbm5lbCBkaXNjLiAqLworCXUxNiBwcm90b2NvbDsJCQkvKiBldGhlcnR5cGUsIDAgLSBtdWx0aXBsZXhlZCAqLworCXU4IHN2YzsJCQkJLyogMCAtIHBlcm1hbmVudCwgMSAtIHN3aXRjaGVkICovCisJdTggc3RhdGU7CQkJLyogY2hhbm5lbCBzdGF0ZSAqLworCXU4IGRyb3Bfc2VxdWVuY2U7CQkvKiBtYXJrIHNlcXVlbmNlIGZvciBkcm9wcGluZyAqLworCXUzMiBpZGxlX3Rtb3V0OwkJCS8qIHNlYywgYmVmb3JlIGRpc2Nvbm5lY3RpbmcgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiOwkJLyogcmVjZWl2ZSBzb2NrZXQgYnVmZmVyICovCisJc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkOwkvKiAtPiBvd25lciAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIGlmc3RhdHM7LyogaW50ZXJmYWNlIHN0YXRpc3RpY3MgKi8KK307CisKKy8qIEZ1bmN0aW9uIFByb3RvdHlwZXMgKi8KKy8qIFdBTiBsaW5rIGRyaXZlciBlbnRyeSBwb2ludHMuIFRoZXNlIGFyZSBjYWxsZWQgYnkgdGhlIFdBTiByb3V0ZXIgbW9kdWxlLiAqLworc3RhdGljIGludCBjeWN4X3dhbl91cGRhdGUoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiksCisJICAgY3ljeF93YW5fbmV3X2lmKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICB3YW5pZl9jb25mX3QgKmNvbmYpLAorCSAgIGN5Y3hfd2FuX2RlbF9pZihzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogTmV0d29yayBkZXZpY2UgaW50ZXJmYWNlICovCitzdGF0aWMgaW50IGN5Y3hfbmV0ZGV2aWNlX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiksCisJICAgY3ljeF9uZXRkZXZpY2Vfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSwKKwkgICBjeWN4X25ldGRldmljZV9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpLAorCSAgIGN5Y3hfbmV0ZGV2aWNlX2hhcmRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgdHlwZSwKKwkJCQkgICAgIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwgdW5zaWduZWQgbGVuKSwKKwkgICBjeWN4X25ldGRldmljZV9yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSwKKwkgICBjeWN4X25ldGRldmljZV9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKKwkJCWN5Y3hfbmV0ZGV2aWNlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogSW50ZXJydXB0IGhhbmRsZXJzICovCitzdGF0aWMgdm9pZCBjeWN4X3gyNV9pcnFfaGFuZGxlcihzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQpLAorCSAgICBjeWN4X3gyNV9pcnFfdHgoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLCBzdHJ1Y3QgY3ljeF94MjVfY21kICpjbWQpLAorCSAgICBjeWN4X3gyNV9pcnFfcngoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLCBzdHJ1Y3QgY3ljeF94MjVfY21kICpjbWQpLAorCSAgICBjeWN4X3gyNV9pcnFfbG9nKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwKKwkJCSAgICAgc3RydWN0IGN5Y3hfeDI1X2NtZCAqY21kKSwKKwkgICAgY3ljeF94MjVfaXJxX3N0YXQoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLAorCQkJICAgICAgc3RydWN0IGN5Y3hfeDI1X2NtZCAqY21kKSwKKwkgICAgY3ljeF94MjVfaXJxX2Nvbm5lY3RfY29uZmlybShzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsCisJCQkJCSBzdHJ1Y3QgY3ljeF94MjVfY21kICpjbWQpLAorCSAgICBjeWN4X3gyNV9pcnFfZGlzY29ubmVjdF9jb25maXJtKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwKKwkJCQkJICAgIHN0cnVjdCBjeWN4X3gyNV9jbWQgKmNtZCksCisJICAgIGN5Y3hfeDI1X2lycV9jb25uZWN0KHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwKKwkJCQkgc3RydWN0IGN5Y3hfeDI1X2NtZCAqY21kKSwKKwkgICAgY3ljeF94MjVfaXJxX2Rpc2Nvbm5lY3Qoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLAorCQkJCSAgICBzdHJ1Y3QgY3ljeF94MjVfY21kICpjbWQpLAorCSAgICBjeWN4X3gyNV9pcnFfc3B1cmlvdXMoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLAorCQkJCSAgc3RydWN0IGN5Y3hfeDI1X2NtZCAqY21kKTsKKworLyogWC4yNSBmaXJtd2FyZSBpbnRlcmZhY2UgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IGN5Y3hfeDI1X2NvbmZpZ3VyZShzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsCisJCQkgICAgICBzdHJ1Y3QgY3ljeF94MjVfY29uZmlnICpjb25mKSwKKwkgICBjeWN4X3gyNV9nZXRfc3RhdHMoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkKSwKKwkgICBjeWN4X3gyNV9zZW5kKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwgdTggbGluaywgdTggbGNuLCB1OCBiaXRtLAorCQkJIGludCBsZW4sIHZvaWQgKmJ1ZiksCisJICAgY3ljeF94MjVfY29ubmVjdF9yZXNwb25zZShzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsCisJCQkJc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW4pLAorCSAgIGN5Y3hfeDI1X2Rpc2Nvbm5lY3RfcmVzcG9uc2Uoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLCB1OCBsaW5rLAorCQkJICAgCQl1OCBsY24pOworCisvKiBjaGFubmVsIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBjeWN4X3gyNV9jaGFuX2Nvbm5lY3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiksCisJICAgY3ljeF94MjVfY2hhbl9zZW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpOworCitzdGF0aWMgdm9pZCBjeWN4X3gyNV9jaGFuX2Rpc2Nvbm5lY3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiksCisJICAgIGN5Y3hfeDI1X2NoYW5fc2VuZF9ldmVudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBldmVudCk7CisKKy8qIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBjeWN4X3gyNV9zZXRfY2hhbl9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBzdGF0ZSksCisJICAgIGN5Y3hfeDI1X2NoYW5fdGltZXIodW5zaWduZWQgbG9uZyBkKTsKKworc3RhdGljIHZvaWQgbmliYmxlX3RvX2J5dGUodTggKnMsIHU4ICpkLCB1OCBsZW4sIHU4IG5pYmJsZSksCisJICAgIHJlc2V0X3RpbWVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgdTggYnBzX3RvX3NwZWVkX2NvZGUodTMyIGJwcyk7CitzdGF0aWMgdTggY3ljeF9sb2cyKHUzMiBuKTsKKworc3RhdGljIHVuc2lnbmVkIGRlY190b191aW50KHU4ICpzdHIsIGludCBsZW4pOworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmN5Y3hfeDI1X2dldF9kZXZfYnlfbGNuKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsCisJCQkJCQkgIHMxNiBsY24pOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICoKKwljeWN4X3gyNV9nZXRfZGV2X2J5X2R0ZV9hZGRyKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsIGNoYXIgKmR0ZSk7CisKKyNpZmRlZiBDWUNMT01YX1gyNV9ERUJVRworc3RhdGljIHZvaWQgaGV4X2R1bXAoY2hhciAqbXNnLCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2R1bXBfY29uZmlnKHN0cnVjdCBjeWN4X3gyNV9jb25maWcgKmNvbmYpOworc3RhdGljIHZvaWQgY3ljeF94MjVfZHVtcF9zdGF0cyhzdHJ1Y3QgY3ljeF94MjVfc3RhdHMgKnN0YXRzKTsKK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2R1bXBfZGV2cyhzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2KTsKKyNlbHNlCisjZGVmaW5lIGhleF9kdW1wKG1zZywgcCwgbGVuKQorI2RlZmluZSBjeWN4X3gyNV9kdW1wX2NvbmZpZyhjb25mKQorI2RlZmluZSBjeWN4X3gyNV9kdW1wX3N0YXRzKHN0YXRzKQorI2RlZmluZSBjeWN4X3gyNV9kdW1wX2RldnMod2FuZGV2KQorI2VuZGlmCisvKiBQdWJsaWMgRnVuY3Rpb25zICovCisKKy8qIFguMjUgUHJvdG9jb2wgSW5pdGlhbGl6YXRpb24gcm91dGluZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBtYWluIEN5Y2xvbSAyWCBtb2R1bGUgZHVyaW5nIHNldHVwLiAgQXQgdGhpcworICogcG9pbnQgYWRhcHRlciBpcyBjb21wbGV0ZWx5IGluaXRpYWxpemVkIGFuZCBYLjI1IGZpcm13YXJlIGlzIHJ1bm5pbmcuCisgKiAgbyBjb25maWd1cmUgYWRhcHRlcgorICogIG8gaW5pdGlhbGl6ZSBwcm90b2NvbC1zcGVjaWZpYyBmaWVsZHMgb2YgdGhlIGFkYXB0ZXIgZGF0YSBzcGFjZS4KKyAqCisgKiBSZXR1cm46CTAJby5rLgorICoJCTwgMAlmYWlsdXJlLiAgKi8KK2ludCBjeWN4X3gyNV93YW5faW5pdChzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsIHdhbmRldl9jb25mX3QgKmNvbmYpCit7CisJc3RydWN0IGN5Y3hfeDI1X2NvbmZpZyBjZmc7CisKKwkvKiBWZXJpZnkgY29uZmlndXJhdGlvbiBJRCAqLworCWlmIChjb25mLT5jb25maWdfaWQgIT0gV0FOQ09ORklHX1gyNSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogaW52YWxpZCBjb25maWd1cmF0aW9uIElEICV1IVxuIiwKKwkJCQkgY2FyZC0+ZGV2bmFtZSwgY29uZi0+Y29uZmlnX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogSW5pdGlhbGl6ZSBwcm90b2NvbC1zcGVjaWZpYyBmaWVsZHMgKi8KKwljYXJkLT5tYm94ICA9IGNhcmQtPmh3LmRwbWJhc2UgKyBYMjVfTUJPWF9PRkZTOworCWNhcmQtPnUueC5jb25uZWN0aW9uX2tleXMgPSAwOworCXNwaW5fbG9ja19pbml0KCZjYXJkLT51LngubG9jayk7CisKKwkvKiBDb25maWd1cmUgYWRhcHRlci4gSGVyZSB3ZSBzZXQgcmVhc29uYWJsZSBkZWZhdWx0cywgdGhlbiBwYXJzZQorCSAqIGRldmljZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBhbmQgc2V0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKwkgKiBNb3N0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdmVyaWZpZWQgYW5kIGNvcnJlY3RlZCAoaWYKKwkgKiBuZWNlc3NhcnkpIHNpbmNlIHdlIGNhbid0IHJlbHkgb24gdGhlIGFkYXB0ZXIgdG8gZG8gc28gYW5kIGRvbid0CisJICogd2FudCBpdCB0byBmYWlsIGVpdGhlci4gKi8KKwltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKGNmZykpOworCWNmZy5saW5rID0gMDsKKwljZmcuY2xvY2sgPSBjb25mLT5jbG9ja2luZyA9PSBXQU5PUFRfRVhURVJOQUwgPyA4IDogNTU7CisJY2ZnLnNwZWVkID0gYnBzX3RvX3NwZWVkX2NvZGUoY29uZi0+YnBzKTsKKwljZmcubjN3aW4gPSA3OworCWNmZy5uMndpbiA9IDI7CisJY2ZnLm4yID0gNTsKKwljZmcubnZjID0gMTsKKwljZmcubnB2YyA9IDE7CisJY2ZnLmZsYWdzID0gMHgwMjsgLyogZGVmYXVsdCA9IFYzNSAqLworCWNmZy50MSA9IDEwOyAgIC8qIGxpbmUgY2FycmllciB0aW1lb3V0ICovCisJY2ZnLnQyID0gMjk7ICAgLyogdHggdGltZW91dCAqLworCWNmZy50MjEgPSAxODA7IC8qIENBTEwgdGltZW91dCAqLworCWNmZy50MjMgPSAxODA7IC8qIENMRUFSIHRpbWVvdXQgKi8KKworCS8qIGFkanVzdCBNVFUgKi8KKwlpZiAoIWNvbmYtPm10dSB8fCBjb25mLT5tdHUgPj0gNTEyKQorCQljYXJkLT53YW5kZXYubXR1ID0gNTEyOworCWVsc2UgaWYgKGNvbmYtPm10dSA+PSAyNTYpCisJCWNhcmQtPndhbmRldi5tdHUgPSAyNTY7CisJZWxzZSBpZiAoY29uZi0+bXR1ID49IDEyOCkKKwkJY2FyZC0+d2FuZGV2Lm10dSA9IDEyODsKKwllbHNlCisJCWNhcmQtPndhbmRldi5tdHUgPSA2NDsKKworCWNmZy5wa3RsZW4gPSBjeWN4X2xvZzIoY2FyZC0+d2FuZGV2Lm10dSk7CisKKwlpZiAoY29uZi0+c3RhdGlvbiA9PSBXQU5PUFRfRFRFKSB7CisJCWNmZy5sb2NhZGRyID0gMzsgLyogRFRFICovCisJCWNmZy5yZW1hZGRyID0gMTsgLyogRENFICovCisJfSBlbHNlIHsKKwkJY2ZnLmxvY2FkZHIgPSAxOyAvKiBEQ0UgKi8KKwkJY2ZnLnJlbWFkZHIgPSAzOyAvKiBEVEUgKi8KKwl9CisKKwlpZiAoY29uZi0+aW50ZXJmYWNlID09IFdBTk9QVF9SUzIzMikKKwkgICAgICAgIGNmZy5mbGFncyA9IDA7ICAgICAgLyogRklYTUUganVzdCByZXNldCB0aGUgMm5kIGJpdCAqLworCisJaWYgKGNvbmYtPnUueDI1LmhpX3B2YykgeworCQljYXJkLT51LnguaGlfcHZjID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS5oaV9wdmMsIDQwOTUpOworCQljYXJkLT51LngubG9fcHZjID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS5sb19wdmMsIGNhcmQtPnUueC5oaV9wdmMpOworCX0KKworCWlmIChjb25mLT51LngyNS5oaV9zdmMpIHsKKwkJY2FyZC0+dS54LmhpX3N2YyA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUuaGlfc3ZjLCA0MDk1KTsKKwkJY2FyZC0+dS54LmxvX3N2YyA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUubG9fc3ZjLCBjYXJkLT51LnguaGlfc3ZjKTsKKwl9CisKKwlpZiAoY2FyZC0+dS54LmxvX3B2YyA9PSAyNTUpCisJCWNmZy5ucHZjID0gMDsKKwllbHNlCisJCWNmZy5ucHZjID0gY2FyZC0+dS54LmhpX3B2YyAtIGNhcmQtPnUueC5sb19wdmMgKyAxOworCisJY2ZnLm52YyA9IGNhcmQtPnUueC5oaV9zdmMgLSBjYXJkLT51LngubG9fc3ZjICsgMSArIGNmZy5ucHZjOworCisJaWYgKGNvbmYtPnUueDI1LmhkbGNfd2luZG93KQorCQljZmcubjJ3aW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LmhkbGNfd2luZG93LCA3KTsKKworCWlmIChjb25mLT51LngyNS5wa3Rfd2luZG93KQorCQljZmcubjN3aW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LnBrdF93aW5kb3csIDcpOworCisJaWYgKGNvbmYtPnUueDI1LnQxKQorCQljZmcudDEgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LnQxLCAzMCk7CisKKwlpZiAoY29uZi0+dS54MjUudDIpCisJCWNmZy50MiA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUudDIsIDMwKTsKKworCWlmIChjb25mLT51LngyNS50MTFfdDIxKQorCQljZmcudDIxID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS50MTFfdDIxLCAzMCk7CisKKwlpZiAoY29uZi0+dS54MjUudDEzX3QyMykKKwkJY2ZnLnQyMyA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUudDEzX3QyMywgMzApOworCisJaWYgKGNvbmYtPnUueDI1Lm4yKQorCQljZmcubjIgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1Lm4yLCAzMCk7CisKKwkvKiBpbml0aWFsaXplIGFkYXB0ZXIgKi8KKwlpZiAoY3ljeF94MjVfY29uZmlndXJlKGNhcmQsICZjZmcpKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIEluaXRpYWxpemUgcHJvdG9jb2wtc3BlY2lmaWMgZmllbGRzIG9mIGFkYXB0ZXIgZGF0YSBzcGFjZSAqLworCWNhcmQtPndhbmRldi5icHMJPSBjb25mLT5icHM7CisJY2FyZC0+d2FuZGV2LmludGVyZmFjZQk9IGNvbmYtPmludGVyZmFjZTsKKwljYXJkLT53YW5kZXYuY2xvY2tpbmcJPSBjb25mLT5jbG9ja2luZzsKKwljYXJkLT53YW5kZXYuc3RhdGlvbgk9IGNvbmYtPnN0YXRpb247CisJY2FyZC0+aXNyCQk9IGN5Y3hfeDI1X2lycV9oYW5kbGVyOworCWNhcmQtPmV4ZWMJCT0gTlVMTDsKKwljYXJkLT53YW5kZXYudXBkYXRlCT0gY3ljeF93YW5fdXBkYXRlOworCWNhcmQtPndhbmRldi5uZXdfaWYJPSBjeWN4X3dhbl9uZXdfaWY7CisJY2FyZC0+d2FuZGV2LmRlbF9pZgk9IGN5Y3hfd2FuX2RlbF9pZjsKKwljYXJkLT53YW5kZXYuc3RhdGUJPSBXQU5fRElTQ09OTkVDVEVEOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFdBTiBEZXZpY2UgRHJpdmVyIEVudHJ5IFBvaW50cyAqLworLyogVXBkYXRlIGRldmljZSBzdGF0dXMgJiBzdGF0aXN0aWNzLiAqLworc3RhdGljIGludCBjeWN4X3dhbl91cGRhdGUoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldikKK3sKKwkvKiBzYW5pdHkgY2hlY2tzICovCisJaWYgKCF3YW5kZXYgfHwgIXdhbmRldi0+cHJpdmF0ZSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAod2FuZGV2LT5zdGF0ZSA9PSBXQU5fVU5DT05GSUdVUkVEKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWN5Y3hfeDI1X2dldF9zdGF0cyh3YW5kZXYtPnByaXZhdGUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENyZWF0ZSBuZXcgbG9naWNhbCBjaGFubmVsLgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgcm91dGVyIHdoZW4gUk9VVEVSX0lGTkVXIElPQ1RMIGlzIGJlaW5nCisgKiBoYW5kbGVkLgorICogbyBwYXJzZSBtZWRpYS0gYW5kIGhhcmR3YXJlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24KKyAqIG8gbWFrZSBzdXJlIHRoYXQgYSBuZXcgY2hhbm5lbCBjYW4gYmUgY3JlYXRlZAorICogbyBhbGxvY2F0ZSByZXNvdXJjZXMsIGlmIG5lY2Vzc2FyeQorICogbyBwcmVwYXJlIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZSBmb3IgcmVnaXN0cmF0aW9uLgorICoKKyAqIFJldHVybjoJMAlvLmsuCisgKgkJPCAwCWZhaWx1cmUgKGNoYW5uZWwgd2lsbCBub3QgYmUgY3JlYXRlZCkgKi8KK3N0YXRpYyBpbnQgY3ljeF93YW5fbmV3X2lmKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICB3YW5pZl9jb25mX3QgKmNvbmYpCit7CisJc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkID0gd2FuZGV2LT5wcml2YXRlOworCXN0cnVjdCBjeWN4X3gyNV9jaGFubmVsICpjaGFuOworCWludCBlcnIgPSAwOworCisJaWYgKCFjb25mLT5uYW1lWzBdIHx8IHN0cmxlbihjb25mLT5uYW1lKSA+IFdBTl9JRk5BTUVfU1opIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludmFsaWQgaW50ZXJmYWNlIG5hbWUhXG4iLAorCQkgICAgICAgY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHByaXZhdGUgZGF0YSAqLworCWNoYW4gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCksIEdGUF9LRVJORUwpOworCWlmICghY2hhbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoY2hhbiwgMCwgc2l6ZW9mKCpjaGFuKSk7CisJc3RyY3B5KGNoYW4tPm5hbWUsIGNvbmYtPm5hbWUpOworCWNoYW4tPmNhcmQgPSBjYXJkOworCWNoYW4tPmxpbmsgPSBjb25mLT5wb3J0OworCWNoYW4tPnByb3RvY29sID0gY29uZi0+cHJvdG9jb2wgPyBFVEhfUF9YMjUgOiBFVEhfUF9JUDsKKwljaGFuLT5yeF9za2IgPSBOVUxMOworCS8qIG9ubHkgdXNlZCBpbiBzdmMgY29ubmVjdGVkIHRocnUgY3Jvc3NvdmVyIGNhYmxlICovCisJY2hhbi0+bG9jYWxfYWRkciA9IE5VTEw7CisKKwlpZiAoY29uZi0+YWRkclswXSA9PSAnQCcpIHsJLyogU1ZDICovCisJCWludCBsZW4gPSBzdHJsZW4oY29uZi0+bG9jYWxfYWRkcik7CisKKwkJaWYgKGxlbikgeworCQkJaWYgKGxlbiA+IFdBTl9BRERSRVNTX1NaKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgbG9jYWwgYWRkciB0b28gbG9uZyFcbiIsCisJCQkJCQl3YW5kZXYtPm5hbWUsIGNoYW4tPm5hbWUpOworCQkJCWtmcmVlKGNoYW4pOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfSBlbHNlIHsKKwkJCQljaGFuLT5sb2NhbF9hZGRyID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKworCQkJCWlmICghY2hhbi0+bG9jYWxfYWRkcikgeworCQkJCQlrZnJlZShjaGFuKTsKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJfQorCQkJfQorCisJCQlzdHJuY3B5KGNoYW4tPmxvY2FsX2FkZHIsIGNvbmYtPmxvY2FsX2FkZHIsCisJCQkJV0FOX0FERFJFU1NfU1opOworCQl9CisKKwkJY2hhbi0+c3ZjID0gMTsKKwkJc3RybmNweShjaGFuLT5hZGRyLCAmY29uZi0+YWRkclsxXSwgV0FOX0FERFJFU1NfU1opOworCQlpbml0X3RpbWVyKCZjaGFuLT50aW1lcik7CisJCWNoYW4tPnRpbWVyLmZ1bmN0aW9uCT0gY3ljeF94MjVfY2hhbl90aW1lcjsKKwkJY2hhbi0+dGltZXIuZGF0YQk9ICh1bnNpZ25lZCBsb25nKWRldjsKKworCQkvKiBTZXQgY2hhbm5lbCB0aW1lb3V0cyAoZGVmYXVsdCBpZiBub3Qgc3BlY2lmaWVkKSAqLworCQljaGFuLT5pZGxlX3Rtb3V0ID0gY29uZi0+aWRsZV90aW1lb3V0ID8gY29uZi0+aWRsZV90aW1lb3V0IDogOTA7CisJfSBlbHNlIGlmIChpc19kaWdpdChjb25mLT5hZGRyWzBdKSkgewkvKiBQVkMgKi8KKwkJczE2IGxjbiA9IGRlY190b191aW50KGNvbmYtPmFkZHIsIDApOworCisJCWlmIChsY24gPj0gY2FyZC0+dS54LmxvX3B2YyAmJiBsY24gPD0gY2FyZC0+dS54LmhpX3B2YykKKwkJCWNoYW4tPmxjbiA9IGxjbjsKKwkJZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiJXM6IFBWQyAldSBpcyBvdXQgb2YgcmFuZ2Ugb24gaW50ZXJmYWNlICVzIVxuIiwKKwkJCQl3YW5kZXYtPm5hbWUsIGxjbiwgY2hhbi0+bmFtZSk7CisJCQllcnIgPSAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaW52YWxpZCBtZWRpYSBhZGRyZXNzIG9uIGludGVyZmFjZSAlcyFcbiIsCisJCQkJd2FuZGV2LT5uYW1lLCBjaGFuLT5uYW1lKTsKKwkJZXJyID0gLUVJTlZBTDsKKwl9CisKKwlpZiAoZXJyKSB7CisJCWlmIChjaGFuLT5sb2NhbF9hZGRyKQorCQkJa2ZyZWUoY2hhbi0+bG9jYWxfYWRkcik7CisKKwkJa2ZyZWUoY2hhbik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogcHJlcGFyZSBuZXR3b3JrIGRldmljZSBkYXRhIHNwYWNlIGZvciByZWdpc3RyYXRpb24gKi8KKwlzdHJjcHkoZGV2LT5uYW1lLCBjaGFuLT5uYW1lKTsKKwlkZXYtPmluaXQgPSBjeWN4X25ldGRldmljZV9pbml0OworCWRldi0+cHJpdiA9IGNoYW47CisKKwlyZXR1cm4gMDsKK30KKworLyogRGVsZXRlIGxvZ2ljYWwgY2hhbm5lbC4gKi8KK3N0YXRpYyBpbnQgY3ljeF93YW5fZGVsX2lmKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+cHJpdikgeworCQlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbiA9IGRldi0+cHJpdjsKKworCQlpZiAoY2hhbi0+c3ZjKSB7CisJCQlpZiAoY2hhbi0+bG9jYWxfYWRkcikKKwkJCQlrZnJlZShjaGFuLT5sb2NhbF9hZGRyKTsKKworCQkJaWYgKGNoYW4tPnN0YXRlID09IFdBTl9DT05ORUNURUQpCisJCQkJZGVsX3RpbWVyKCZjaGFuLT50aW1lcik7CisJCX0KKworCQlrZnJlZShjaGFuKTsKKwkJZGV2LT5wcml2ID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogTmV0d29yayBEZXZpY2UgSW50ZXJmYWNlICovCisvKiBJbml0aWFsaXplIExpbnV4IG5ldHdvcmsgaW50ZXJmYWNlLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgb25seSBvbmNlIGZvciBlYWNoIGludGVyZmFjZSwgZHVyaW5nIExpbnV4IG5ldHdvcmsKKyAqIGludGVyZmFjZSByZWdpc3RyYXRpb24uICBSZXR1cm5pbmcgYW55dGhpbmcgYnV0IHplcm8gd2lsbCBmYWlsIGludGVyZmFjZQorICogcmVnaXN0cmF0aW9uLiAqLworc3RhdGljIGludCBjeWN4X25ldGRldmljZV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW4gPSBkZXYtPnByaXY7CisJc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkID0gY2hhbi0+Y2FyZDsKKwlzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2ID0gJmNhcmQtPndhbmRldjsKKworCS8qIEluaXRpYWxpemUgZGV2aWNlIGRyaXZlciBlbnRyeSBwb2ludHMgKi8KKwlkZXYtPm9wZW4JCT0gY3ljeF9uZXRkZXZpY2Vfb3BlbjsKKwlkZXYtPnN0b3AJCT0gY3ljeF9uZXRkZXZpY2Vfc3RvcDsKKwlkZXYtPmhhcmRfaGVhZGVyCT0gY3ljeF9uZXRkZXZpY2VfaGFyZF9oZWFkZXI7CisJZGV2LT5yZWJ1aWxkX2hlYWRlcgk9IGN5Y3hfbmV0ZGV2aWNlX3JlYnVpbGRfaGVhZGVyOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gY3ljeF9uZXRkZXZpY2VfaGFyZF9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzCQk9IGN5Y3hfbmV0ZGV2aWNlX2dldF9zdGF0czsKKworCS8qIEluaXRpYWxpemUgbWVkaWEtc3BlY2lmaWMgcGFyYW1ldGVycyAqLworCWRldi0+bXR1CQk9IENZQ1hfWDI1X0NIQU5fTVRVOworCWRldi0+dHlwZQkJPSBBUlBIUkRfSFdYMjU7CS8qIEFSUCBoL3cgdHlwZSAqLworCWRldi0+aGFyZF9oZWFkZXJfbGVuCT0gMDsJCS8qIG1lZGlhIGhlYWRlciBsZW5ndGggKi8KKwlkZXYtPmFkZHJfbGVuCQk9IDA7CQkvKiBoYXJkd2FyZSBhZGRyZXNzIGxlbmd0aCAqLworCisJaWYgKCFjaGFuLT5zdmMpCisJCSoodTE2KilkZXYtPmRldl9hZGRyID0gaHRvbnMoY2hhbi0+bGNuKTsKKworCS8qIEluaXRpYWxpemUgaGFyZHdhcmUgcGFyYW1ldGVycyAoanVzdCBmb3IgcmVmZXJlbmNlKSAqLworCWRldi0+aXJxCQk9IHdhbmRldi0+aXJxOworCWRldi0+ZG1hCQk9IHdhbmRldi0+ZG1hOworCWRldi0+YmFzZV9hZGRyCQk9IHdhbmRldi0+aW9wb3J0OworCWRldi0+bWVtX3N0YXJ0CQk9ICh1bnNpZ25lZCBsb25nKXdhbmRldi0+bWFkZHI7CisJZGV2LT5tZW1fZW5kCQk9ICh1bnNpZ25lZCBsb25nKSh3YW5kZXYtPm1hZGRyICsKKwkJCQkJCSAgd2FuZGV2LT5tc2l6ZSAtIDEpOworCWRldi0+ZmxhZ3MJCXw9IElGRl9OT0FSUDsKKworCS8qIFNldCB0cmFuc21pdCBidWZmZXIgcXVldWUgbGVuZ3RoICovCisJZGV2LT50eF9xdWV1ZV9sZW4JPSAxMDsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwkvKiBJbml0aWFsaXplIHNvY2tldCBidWZmZXJzICovCisJY3ljeF94MjVfc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fRElTQ09OTkVDVEVEKTsKKworCXJldHVybiAwOworfQorCisvKiBPcGVuIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyBwcmV2ZW50IG1vZHVsZSBmcm9tIHVubG9hZGluZyBieSBpbmNyZW1lbnRpbmcgdXNlIGNvdW50CisgKiBvIGlmIGxpbmsgaXMgZGlzY29ubmVjdGVkIHRoZW4gaW5pdGlhdGUgY29ubmVjdGlvbgorICoKKyAqIFJldHVybiAwIGlmIE8uay4gb3IgZXJybm8uICAqLworc3RhdGljIGludCBjeWN4X25ldGRldmljZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FQlVTWTsgLyogb25seSBvbmUgb3BlbiBpcyBhbGxvd2VkICovCisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCisvKiBDbG9zZSBuZXR3b3JrIGludGVyZmFjZS4KKyAqIG8gcmVzZXQgZmxhZ3MuCisgKiBvIGlmIHRoZXJlJ3Mgbm8gbW9yZSBvcGVuIGNoYW5uZWxzIHRoZW4gZGlzY29ubmVjdCBwaHlzaWNhbCBsaW5rLiAqLworc3RhdGljIGludCBjeWN4X25ldGRldmljZV9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW4gPSBkZXYtPnByaXY7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAoY2hhbi0+c3RhdGUgPT0gV0FOX0NPTk5FQ1RFRCB8fCBjaGFuLT5zdGF0ZSA9PSBXQU5fQ09OTkVDVElORykKKwkJY3ljeF94MjVfY2hhbl9kaXNjb25uZWN0KGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyogQnVpbGQgbWVkaWEgaGVhZGVyLgorICogbyBlbmNhcHN1bGF0ZSBwYWNrZXQgYWNjb3JkaW5nIHRvIGVuY2Fwc3VsYXRpb24gdHlwZS4KKyAqCisgKiBUaGUgdHJpY2sgaGVyZSBpcyB0byBwdXQgcGFja2V0IHR5cGUgKEV0aGVydHlwZSkgaW50byAncHJvdG9jb2wnIGZpZWxkIG9mCisgKiB0aGUgc29ja2V0IGJ1ZmZlciwgc28gdGhhdCB3ZSBkb24ndCBmb3JnZXQgaXQuICBJZiBlbmNhcHN1bGF0aW9uIGZhaWxzLAorICogc2V0IHNrYi0+cHJvdG9jb2wgdG8gMCBhbmQgZGlzY2FyZCBwYWNrZXQgbGF0ZXIuCisgKgorICogUmV0dXJuOgltZWRpYSBoZWFkZXIgbGVuZ3RoLiAqLworc3RhdGljIGludCBjeWN4X25ldGRldmljZV9oYXJkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiB0eXBlLAorCQkJCSAgICAgIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwgdW5zaWduZWQgbGVuKQoreworCXNrYi0+cHJvdG9jb2wgPSB0eXBlOworCisJcmV0dXJuIGRldi0+aGFyZF9oZWFkZXJfbGVuOworfQorCisvKiAqIFJlLWJ1aWxkIG1lZGlhIGhlYWRlci4KKyAqIFJldHVybjoJMQlwaHlzaWNhbCBhZGRyZXNzIHJlc29sdmVkLgorICoJCTAJcGh5c2ljYWwgYWRkcmVzcyBub3QgcmVzb2x2ZWQgKi8KK3N0YXRpYyBpbnQgY3ljeF9uZXRkZXZpY2VfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gMTsKK30KKworLyogU2VuZCBhIHBhY2tldCBvbiBhIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyBzZXQgYnVzeSBmbGFnIChtYXJrcyBzdGFydCBvZiB0aGUgdHJhbnNtaXNzaW9uKS4KKyAqIG8gY2hlY2sgbGluayBzdGF0ZS4gSWYgbGluayBpcyBub3QgdXAsIHRoZW4gZHJvcCB0aGUgcGFja2V0LgorICogbyBjaGVjayBjaGFubmVsIHN0YXR1cy4gSWYgaXQncyBkb3duIHRoZW4gaW5pdGlhdGUgYSBjYWxsLgorICogbyBwYXNzIGEgcGFja2V0IHRvIGNvcnJlc3BvbmRpbmcgV0FOIGRldmljZS4KKyAqIG8gZnJlZSBzb2NrZXQgYnVmZmVyCisgKgorICogUmV0dXJuOgkwCWNvbXBsZXRlIChzb2NrZXQgYnVmZmVyIG11c3QgYmUgZnJlZWQpCisgKgkJbm9uLTAJcGFja2V0IG1heSBiZSByZS10cmFuc21pdHRlZCAodGJ1c3kgbXVzdCBiZSBzZXQpCisgKgorICogTm90ZXM6CisgKiAxLiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGVpdGhlciBieSB0aGUgcHJvdG9jb2wgc3RhY2sgb3IgYnkgdGhlICJuZXQKKyAqICAgIGJvdHRvbSBoYWxmIiAod2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQpLgorICogMi4gU2V0dGluZyB0YnVzeSBmbGFnIHdpbGwgaW5oaWJpdCBmdXJ0aGVyIHRyYW5zbWl0IHJlcXVlc3RzIGZyb20gdGhlCisgKiAgICBwcm90b2NvbCBzdGFjayBhbmQgY2FuIGJlIHVzZWQgZm9yIGZsb3cgY29udHJvbCB3aXRoIHByb3RvY29sIGxheWVyLiAqLworc3RhdGljIGludCBjeWN4X25ldGRldmljZV9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjeWN4X3gyNV9jaGFubmVsICpjaGFuID0gZGV2LT5wcml2OworCXN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCA9IGNoYW4tPmNhcmQ7CisKKwlpZiAoIWNoYW4tPnN2YykKKwkJY2hhbi0+cHJvdG9jb2wgPSBza2ItPnByb3RvY29sOworCisJaWYgKGNhcmQtPndhbmRldi5zdGF0ZSAhPSBXQU5fQ09OTkVDVEVEKQorCQkrK2NoYW4tPmlmc3RhdHMudHhfZHJvcHBlZDsKKwllbHNlIGlmIChjaGFuLT5zdmMgJiYgY2hhbi0+cHJvdG9jb2wgJiYKKwkJIGNoYW4tPnByb3RvY29sICE9IHNrYi0+cHJvdG9jb2wpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiB1bnN1cHBvcnRlZCBFdGhlcnR5cGUgMHglMDRYIG9uIGludGVyZmFjZSAlcyFcbiIsCisJCSAgICAgICBjYXJkLT5kZXZuYW1lLCBza2ItPnByb3RvY29sLCBkZXYtPm5hbWUpOworCQkrK2NoYW4tPmlmc3RhdHMudHhfZXJyb3JzOworCX0gZWxzZSBpZiAoY2hhbi0+cHJvdG9jb2wgPT0gRVRIX1BfSVApIHsKKwkJc3dpdGNoIChjaGFuLT5zdGF0ZSkgeworCQljYXNlIFdBTl9ESVNDT05ORUNURUQ6CisJCQlpZiAoY3ljeF94MjVfY2hhbl9jb25uZWN0KGRldikpIHsKKwkJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJCS8qIGZhbGwgdGhydSAqLworCQljYXNlIFdBTl9DT05ORUNURUQ6CisJCQlyZXNldF90aW1lcihkZXYpOworCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkJCWlmIChjeWN4X3gyNV9jaGFuX3NlbmQoZGV2LCBza2IpKQorCQkJCXJldHVybiAtRUJVU1k7CisKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJKytjaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCX0KKwl9IGVsc2UgeyAvKiBjaGFuLT5wcm90b2NvbCA9PSBFVEhfUF9YMjUgKi8KKwkJc3dpdGNoIChza2ItPmRhdGFbMF0pIHsKKwkJY2FzZSAwOiBicmVhazsKKwkJY2FzZSAxOiAvKiBDb25uZWN0IHJlcXVlc3QgKi8KKwkJCWN5Y3hfeDI1X2NoYW5fY29ubmVjdChkZXYpOworCQkJZ290byBmcmVlX3BhY2tldDsKKwkJY2FzZSAyOiAvKiBEaXNjb25uZWN0IHJlcXVlc3QgKi8KKwkJCWN5Y3hfeDI1X2NoYW5fZGlzY29ubmVjdChkZXYpOworCQkJZ290byBmcmVlX3BhY2tldDsKKwkgICAgICAgIGRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgIiVzOiB1bmtub3duICVkIHgyNS1pZmFjZSByZXF1ZXN0IG9uICVzIVxuIiwKKwkJCSAgICAgICBjYXJkLT5kZXZuYW1lLCBza2ItPmRhdGFbMF0sIGRldi0+bmFtZSk7CisJCQkrK2NoYW4tPmlmc3RhdHMudHhfZXJyb3JzOworCQkJZ290byBmcmVlX3BhY2tldDsKKwkJfQorCisJCXNrYl9wdWxsKHNrYiwgMSk7IC8qIFJlbW92ZSBjb250cm9sIGJ5dGUgKi8KKwkJcmVzZXRfdGltZXIoZGV2KTsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQlpZiAoY3ljeF94MjVfY2hhbl9zZW5kKGRldiwgc2tiKSkgeworCQkJLyogcHJlcGFyZSBmb3IgZnV0dXJlIHJldHJhbnNtaXNzaW9ucyAqLworCQkJc2tiX3B1c2goc2tiLCAxKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKK2ZyZWVfcGFja2V0OgorCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCisvKiBHZXQgRXRoZXJuZXQtc3R5bGUgaW50ZXJmYWNlIHN0YXRpc3RpY3MuCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmN5Y3hfbmV0ZGV2aWNlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjeWN4X3gyNV9jaGFubmVsICpjaGFuID0gZGV2LT5wcml2OworCisJcmV0dXJuIGNoYW4gPyAmY2hhbi0+aWZzdGF0cyA6IE5VTEw7Cit9CisKKy8qIEludGVycnVwdCBIYW5kbGVycyAqLworLyogWC4yNSBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lLiAqLworc3RhdGljIHZvaWQgY3ljeF94MjVfaXJxX2hhbmRsZXIoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkKQoreworCXN0cnVjdCBjeWN4X3gyNV9jbWQgY21kOworCXUxNiB6ID0gMDsKKworCWNhcmQtPmluX2lzciA9IDE7CisJY2FyZC0+YnVmZl9pbnRfbW9kZV91bmJ1c3kgPSAwOworCWN5Y3hfcGVlaygmY2FyZC0+aHcsIFgyNV9SWE1CT1hfT0ZGUywgJmNtZCwgc2l6ZW9mKGNtZCkpOworCisJc3dpdGNoIChjbWQuY29tbWFuZCkgeworCWNhc2UgWDI1X0RBVEFfSU5ESUNBVElPTjoKKwkJY3ljeF94MjVfaXJxX3J4KGNhcmQsICZjbWQpOworCQlicmVhazsKKwljYXNlIFgyNV9BQ0tfRlJPTV9WQzoKKwkJY3ljeF94MjVfaXJxX3R4KGNhcmQsICZjbWQpOworCQlicmVhazsKKwljYXNlIFgyNV9MT0c6CisJCWN5Y3hfeDI1X2lycV9sb2coY2FyZCwgJmNtZCk7CisJCWJyZWFrOworCWNhc2UgWDI1X1NUQVRJU1RJQzoKKwkJY3ljeF94MjVfaXJxX3N0YXQoY2FyZCwgJmNtZCk7CisJCWJyZWFrOworCWNhc2UgWDI1X0NPTk5FQ1RfQ09ORklSTToKKwkJY3ljeF94MjVfaXJxX2Nvbm5lY3RfY29uZmlybShjYXJkLCAmY21kKTsKKwkJYnJlYWs7CisJY2FzZSBYMjVfQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQljeWN4X3gyNV9pcnFfY29ubmVjdChjYXJkLCAmY21kKTsKKwkJYnJlYWs7CisJY2FzZSBYMjVfRElTQ09OTkVDVF9JTkRJQ0FUSU9OOgorCQljeWN4X3gyNV9pcnFfZGlzY29ubmVjdChjYXJkLCAmY21kKTsKKwkJYnJlYWs7CisJY2FzZSBYMjVfRElTQ09OTkVDVF9DT05GSVJNOgorCQljeWN4X3gyNV9pcnFfZGlzY29ubmVjdF9jb25maXJtKGNhcmQsICZjbWQpOworCQlicmVhazsKKwljYXNlIFgyNV9MSU5FX09OOgorCQljeWN4X3NldF9zdGF0ZShjYXJkLCBXQU5fQ09OTkVDVEVEKTsKKwkJYnJlYWs7CisJY2FzZSBYMjVfTElORV9PRkY6CisJCWN5Y3hfc2V0X3N0YXRlKGNhcmQsIFdBTl9ESVNDT05ORUNURUQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljeWN4X3gyNV9pcnFfc3B1cmlvdXMoY2FyZCwgJmNtZCk7CisJCWJyZWFrOworCX0KKworCWN5Y3hfcG9rZSgmY2FyZC0+aHcsIDAsICZ6LCBzaXplb2YoeikpOworCWN5Y3hfcG9rZSgmY2FyZC0+aHcsIFgyNV9SWE1CT1hfT0ZGUywgJnosIHNpemVvZih6KSk7CisJY2FyZC0+aW5faXNyID0gMDsKK30KKworLyogVHJhbnNtaXQgaW50ZXJydXB0IGhhbmRsZXIuCisgKglvIFJlbGVhc2Ugc29ja2V0IGJ1ZmZlcgorICoJbyBDbGVhciAndGJ1c3knIGZsYWcgKi8KK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2lycV90eChzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsIHN0cnVjdCBjeWN4X3gyNV9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYgPSAmY2FyZC0+d2FuZGV2OworCXU4IGxjbjsKKworCWN5Y3hfcGVlaygmY2FyZC0+aHcsIGNtZC0+YnVmLCAmbGNuLCBzaXplb2YobGNuKSk7CisKKwkvKiB1bmJ1c3kgZGV2aWNlIGFuZCB0aGVuIGRldl90aW50KCk7ICovCisJZGV2ID0gY3ljeF94MjVfZ2V0X2Rldl9ieV9sY24od2FuZGV2LCBsY24pOworCWlmIChkZXYpIHsKKwkJY2FyZC0+YnVmZl9pbnRfbW9kZV91bmJ1c3kgPSAxOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0VSUiAiJXM6YWNrdmMgZm9yIGluZXhpc3RlbnQgbGNuICVkXG4iLAorCQkJCSBjYXJkLT5kZXZuYW1lLCBsY24pOworfQorCisvKiBSZWNlaXZlIGludGVycnVwdCBoYW5kbGVyLgorICogVGhpcyByb3V0aW5lIGhhbmRsZXMgZnJhZ21lbnRlZCBJUCBwYWNrZXRzIHVzaW5nIE0tYml0IGFjY29yZGluZyB0byB0aGUKKyAqIFJGQzEzNTYuCisgKiBvIG1hcCBsb2dpY2FsIGNoYW5uZWwgbnVtYmVyIHRvIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyBhbGxvY2F0ZSBzb2NrZXQgYnVmZmVyIG9yIGFwcGVuZCByZWNlaXZlZCBwYWNrZXQgdG8gdGhlIGV4aXN0aW5nIG9uZS4KKyAqIG8gaWYgTS1iaXQgaXMgcmVzZXQgKGkuZS4gaXQncyB0aGUgbGFzdCBwYWNrZXQgaW4gYSBzZXF1ZW5jZSkgdGhlbgorICogICBkZWNhcHN1bGF0ZSBwYWNrZXQgYW5kIHBhc3Mgc29ja2V0IGJ1ZmZlciB0byB0aGUgcHJvdG9jb2wgc3RhY2suCisgKgorICogTm90ZXM6CisgKiAxLiBXaGVuIGFsbG9jYXRpbmcgYSBzb2NrZXQgYnVmZmVyLCBpZiBNLWJpdCBpcyBzZXQgdGhlbiBtb3JlIGRhdGEgaXMKKyAqICAgIGNvbWluZyBhbmQgd2UgaGF2ZSB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBtYXhpbXVtIElQIHBhY2tldCBzaXplCisgKiAgICBleHBlY3RlZCBvbiB0aGlzIGNoYW5uZWwuCisgKiAyLiBJZiBzb21ldGhpbmcgZ29lcyB3cm9uZyBhbmQgWC4yNSBwYWNrZXQgaGFzIHRvIGJlIGRyb3BwZWQgKGUuZy4gbm8KKyAqICAgIHNvY2tldCBidWZmZXJzIGF2YWlsYWJsZSkgdGhlIHdob2xlIHBhY2tldCBzZXF1ZW5jZSBtdXN0IGJlIGRpc2NhcmRlZC4gKi8KK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2lycV9yeChzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsIHN0cnVjdCBjeWN4X3gyNV9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2ID0gJmNhcmQtPndhbmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBjeWN4X3gyNV9jaGFubmVsICpjaGFuOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTggYml0bSwgbGNuOworCWludCBwa3RsZW4gPSBjbWQtPmxlbiAtIDU7CisKKwljeWN4X3BlZWsoJmNhcmQtPmh3LCBjbWQtPmJ1ZiwgJmxjbiwgc2l6ZW9mKGxjbikpOworCWN5Y3hfcGVlaygmY2FyZC0+aHcsIGNtZC0+YnVmICsgNCwgJmJpdG0sIHNpemVvZihiaXRtKSk7CisJYml0bSAmPSAweDEwOworCisJZGV2ID0gY3ljeF94MjVfZ2V0X2Rldl9ieV9sY24od2FuZGV2LCBsY24pOworCWlmICghZGV2KSB7CisJCS8qIEludmFsaWQgY2hhbm5lbCwgZGlzY2FyZCBwYWNrZXQgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlY2VpdmluZyBvbiBvcnBoYW5lZCBMQ04gJWQhXG4iLAorCQkJCSBjYXJkLT5kZXZuYW1lLCBsY24pOworCQlyZXR1cm47CisJfQorCisJY2hhbiA9IGRldi0+cHJpdjsKKwlyZXNldF90aW1lcihkZXYpOworCisJaWYgKGNoYW4tPmRyb3Bfc2VxdWVuY2UpIHsKKwkJaWYgKCFiaXRtKQorCQkJY2hhbi0+ZHJvcF9zZXF1ZW5jZSA9IDA7CisJCWVsc2UKKwkJCXJldHVybjsKKwl9CisKKwlpZiAoKHNrYiA9IGNoYW4tPnJ4X3NrYikgPT0gTlVMTCkgeworCQkvKiBBbGxvY2F0ZSBuZXcgc29ja2V0IGJ1ZmZlciAqLworCQlpbnQgYnVmc2l6ZSA9IGJpdG0gPyBkZXYtPm10dSA6IHBrdGxlbjsKKworCQlpZiAoKHNrYiA9IGRldl9hbGxvY19za2IoKGNoYW4tPnByb3RvY29sID09IEVUSF9QX1gyNSA/IDEgOiAwKSArCisJCQkJCSBidWZzaXplICsKKwkJCQkJIGRldi0+aGFyZF9oZWFkZXJfbGVuKSkgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIHNvY2tldCBidWZmZXJzIGF2YWlsYWJsZSFcbiIsCisJCQkJCSBjYXJkLT5kZXZuYW1lKTsKKwkJCWNoYW4tPmRyb3Bfc2VxdWVuY2UgPSAxOworCQkJKytjaGFuLT5pZnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoY2hhbi0+cHJvdG9jb2wgPT0gRVRIX1BfWDI1KSAvKiBYLjI1IHNvY2tldCBsYXllciBjb250cm9sICovCisJCQkvKiAwID0gZGF0YSBwYWNrZXQgKGRldl9hbGxvY19za2IgemVyb2VkIHNrYi0+ZGF0YSkgKi8KKwkJCXNrYl9wdXQoc2tiLCAxKTsKKworCQlza2ItPmRldiA9IGRldjsKKwkJc2tiLT5wcm90b2NvbCA9IGh0b25zKGNoYW4tPnByb3RvY29sKTsKKwkJY2hhbi0+cnhfc2tiID0gc2tiOworCX0KKworCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IHBrdGxlbikgeworCQkvKiBObyByb29tIGZvciB0aGUgcGFja2V0LiBDYWxsIG9mZiB0aGUgd2hvbGUgdGhpbmchICovCisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCWNoYW4tPnJ4X3NrYiA9IE5VTEw7CisKKwkJaWYgKGJpdG0pCisJCQljaGFuLT5kcm9wX3NlcXVlbmNlID0gMTsKKworCQlwcmludGsoS0VSTl9JTkZPICIlczogdW5leHBlY3RlZGx5IGxvbmcgcGFja2V0IHNlcXVlbmNlICIKKwkJCSJvbiBpbnRlcmZhY2UgJXMhXG4iLCBjYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUpOworCQkrK2NoYW4tPmlmc3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKKwkJcmV0dXJuOworCX0KKworCS8qIEFwcGVuZCBwYWNrZXQgdG8gdGhlIHNvY2tldCBidWZmZXIgICovCisJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYgKyA1LCBza2JfcHV0KHNrYiwgcGt0bGVuKSwgcGt0bGVuKTsKKworCWlmIChiaXRtKQorCQlyZXR1cm47IC8qIG1vcmUgZGF0YSBpcyBjb21pbmcgKi8KKworCWNoYW4tPnJ4X3NrYiA9IE5VTEw7CQkvKiBkZXF1ZXVlIHBhY2tldCAqLworCisJKytjaGFuLT5pZnN0YXRzLnJ4X3BhY2tldHM7CisJY2hhbi0+aWZzdGF0cy5yeF9ieXRlcyArPSBwa3RsZW47CisKKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJbmV0aWZfcngoc2tiKTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwkJLyogdGltZXN0YW1wICovCit9CisKKy8qIENvbm5lY3QgaW50ZXJydXB0IGhhbmRsZXIuICovCitzdGF0aWMgdm9pZCBjeWN4X3gyNV9pcnFfY29ubmVjdChzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsCisJCQkJIHN0cnVjdCBjeWN4X3gyNV9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2ID0gJmNhcmQtPndhbmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbjsKKwl1OCBkWzMyXSwKKwkgICBsb2NbMjRdLAorCSAgIHJlbVsyNF07CisJdTggbGNuLCBzaXplbG9jLCBzaXplcmVtOworCisJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYsICZsY24sIHNpemVvZihsY24pKTsKKwljeWN4X3BlZWsoJmNhcmQtPmh3LCBjbWQtPmJ1ZiArIDUsICZzaXplbG9jLCBzaXplb2Yoc2l6ZWxvYykpOworCWN5Y3hfcGVlaygmY2FyZC0+aHcsIGNtZC0+YnVmICsgNiwgZCwgY21kLT5sZW4gLSA2KTsKKworCXNpemVyZW0gPSBzaXplbG9jID4+IDQ7CisJc2l6ZWxvYyAmPSAweDBGOworCisJbG9jWzBdID0gcmVtWzBdID0gJ1wwJzsKKworCWlmIChzaXplbG9jKQorCQluaWJibGVfdG9fYnl0ZShkLCBsb2MsIHNpemVsb2MsIDApOworCisJaWYgKHNpemVyZW0pCisJCW5pYmJsZV90b19ieXRlKGQgKyAoc2l6ZWxvYyA+PiAxKSwgcmVtLCBzaXplcmVtLCBzaXplbG9jICYgMSk7CisKKwlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6bGNuPSVkLCBsb2NhbD0lcywgcmVtb3RlPSVzXG4iLAorCQkJICBfX0ZVTkNUSU9OX18sIGxjbiwgbG9jLCByZW0pOworCisJZGV2ID0gY3ljeF94MjVfZ2V0X2Rldl9ieV9kdGVfYWRkcih3YW5kZXYsIHJlbSk7CisJaWYgKCFkZXYpIHsKKwkJLyogSW52YWxpZCBjaGFubmVsLCBkaXNjYXJkIHBhY2tldCAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogY29ubmVjdCBub3QgZXhwZWN0ZWQ6IHJlbW90ZSAlcyFcbiIsCisJCQkJIGNhcmQtPmRldm5hbWUsIHJlbSk7CisJCXJldHVybjsKKwl9CisKKwljaGFuID0gZGV2LT5wcml2OworCWNoYW4tPmxjbiA9IGxjbjsKKwljeWN4X3gyNV9jb25uZWN0X3Jlc3BvbnNlKGNhcmQsIGNoYW4pOworCWN5Y3hfeDI1X3NldF9jaGFuX3N0YXRlKGRldiwgV0FOX0NPTk5FQ1RFRCk7Cit9CisKKy8qIENvbm5lY3QgY29uZmlybSBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2lycV9jb25uZWN0X2NvbmZpcm0oc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLAorCQkJCQkgc3RydWN0IGN5Y3hfeDI1X2NtZCAqY21kKQoreworCXN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYgPSAmY2FyZC0+d2FuZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW47CisJdTggbGNuLCBrZXk7CisKKwljeWN4X3BlZWsoJmNhcmQtPmh3LCBjbWQtPmJ1ZiwgJmxjbiwgc2l6ZW9mKGxjbikpOworCWN5Y3hfcGVlaygmY2FyZC0+aHcsIGNtZC0+YnVmICsgMSwgJmtleSwgc2l6ZW9mKGtleSkpOworCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczogJXM6bGNuPSVkLCBrZXk9JWRcbiIsCisJCQkgIGNhcmQtPmRldm5hbWUsIF9fRlVOQ1RJT05fXywgbGNuLCBrZXkpOworCisJZGV2ID0gY3ljeF94MjVfZ2V0X2Rldl9ieV9sY24od2FuZGV2LCAta2V5KTsKKwlpZiAoIWRldikgeworCQkvKiBJbnZhbGlkIGNoYW5uZWwsIGRpc2NhcmQgcGFja2V0ICovCisJCWNsZWFyX2JpdCgtLWtleSwgKHZvaWQqKSZjYXJkLT51LnguY29ubmVjdGlvbl9rZXlzKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbm5lY3QgY29uZmlybSBub3QgZXhwZWN0ZWQ6IGxjbiAlZCwgIgorCQkJCSAia2V5PSVkIVxuIiwgY2FyZC0+ZGV2bmFtZSwgbGNuLCBrZXkpOworCQlyZXR1cm47CisJfQorCisJY2xlYXJfYml0KC0ta2V5LCAodm9pZCopJmNhcmQtPnUueC5jb25uZWN0aW9uX2tleXMpOworCWNoYW4gPSBkZXYtPnByaXY7CisJY2hhbi0+bGNuID0gbGNuOworCWN5Y3hfeDI1X3NldF9jaGFuX3N0YXRlKGRldiwgV0FOX0NPTk5FQ1RFRCk7Cit9CisKKy8qIERpc2Nvbm5lY3QgY29uZmlybSBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2lycV9kaXNjb25uZWN0X2NvbmZpcm0oc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLAorCQkJCQkgICAgc3RydWN0IGN5Y3hfeDI1X2NtZCAqY21kKQoreworCXN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYgPSAmY2FyZC0+d2FuZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJdTggbGNuOworCisJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYsICZsY24sIHNpemVvZihsY24pKTsKKwlkcHJpbnRrKDEsIEtFUk5fSU5GTyAiJXM6ICVzOmxjbj0lZFxuIiwKKwkJCSAgY2FyZC0+ZGV2bmFtZSwgX19GVU5DVElPTl9fLCBsY24pOworCWRldiA9IGN5Y3hfeDI1X2dldF9kZXZfYnlfbGNuKHdhbmRldiwgbGNuKTsKKwlpZiAoIWRldikgeworCQkvKiBJbnZhbGlkIGNoYW5uZWwsIGRpc2NhcmQgcGFja2V0ICovCisJCXByaW50ayhLRVJOX0lORk8gIiVzOmRpc2Nvbm5lY3QgY29uZmlybSBub3QgZXhwZWN0ZWQhOmxjbiAlZFxuIiwKKwkJCQkgY2FyZC0+ZGV2bmFtZSwgbGNuKTsKKwkJcmV0dXJuOworCX0KKworCWN5Y3hfeDI1X3NldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RFRCk7Cit9CisKKy8qIGRpc2Nvbm5lY3QgaW50ZXJydXB0IGhhbmRsZXIuICovCitzdGF0aWMgdm9pZCBjeWN4X3gyNV9pcnFfZGlzY29ubmVjdChzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsCisJCQkJICAgIHN0cnVjdCBjeWN4X3gyNV9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2ID0gJmNhcmQtPndhbmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXU4IGxjbjsKKworCWN5Y3hfcGVlaygmY2FyZC0+aHcsIGNtZC0+YnVmLCAmbGNuLCBzaXplb2YobGNuKSk7CisJZHByaW50aygxLCBLRVJOX0lORk8gIiVzOmxjbj0lZFxuIiwgX19GVU5DVElPTl9fLCBsY24pOworCisJZGV2ID0gY3ljeF94MjVfZ2V0X2Rldl9ieV9sY24od2FuZGV2LCBsY24pOworCWlmIChkZXYpIHsKKwkJc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW4gPSBkZXYtPnByaXY7CisKKwkJY3ljeF94MjVfZGlzY29ubmVjdF9yZXNwb25zZShjYXJkLCBjaGFuLT5saW5rLCBsY24pOworCQljeWN4X3gyNV9zZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9ESVNDT05ORUNURUQpOworCX0gZWxzZQorCQljeWN4X3gyNV9kaXNjb25uZWN0X3Jlc3BvbnNlKGNhcmQsIDAsIGxjbik7Cit9CisKKy8qIExPRyBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2lycV9sb2coc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkLCBzdHJ1Y3QgY3ljeF94MjVfY21kICpjbWQpCit7CisjaWYgQ1lDTE9NWF9YMjVfREVCVUcKKwljaGFyIGJmWzIwXTsKKwl1MTYgc2l6ZSwgdG9yZWFkLCBsaW5rLCBtc2dfY29kZTsKKwl1OCBjb2RlLCByb3V0aW5lOworCisJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYsICZtc2dfY29kZSwgc2l6ZW9mKG1zZ19jb2RlKSk7CisJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYgKyAyLCAmbGluaywgc2l6ZW9mKGxpbmspKTsKKwljeWN4X3BlZWsoJmNhcmQtPmh3LCBjbWQtPmJ1ZiArIDQsICZzaXplLCBzaXplb2Yoc2l6ZSkpOworCS8qIGF0IG1vc3QgMjAgYnl0ZXMgYXJlIGF2YWlsYWJsZS4uLiB0aGFua3MgdG8gRGFuaWVsYSA6KSAqLworCXRvcmVhZCA9IHNpemUgPCAyMCA/IHNpemUgOiAyMDsKKwljeWN4X3BlZWsoJmNhcmQtPmh3LCBjbWQtPmJ1ZiArIDEwLCAmYmYsIHRvcmVhZCk7CisJY3ljeF9wZWVrKCZjYXJkLT5odywgY21kLT5idWYgKyAxMCArIHRvcmVhZCwgJmNvZGUsIDEpOworCWN5Y3hfcGVlaygmY2FyZC0+aHcsIGNtZC0+YnVmICsgMTAgKyB0b3JlYWQgKyAxLCAmcm91dGluZSwgMSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJjeWN4X3gyNV9pcnFfaGFuZGxlcjogWDI1X0xPRyAoMHg0NTAwKSBpbmRpYy46XG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJjbWQtPmJ1Zj0weCVYXG4iLCBjbWQtPmJ1Zik7CisJcHJpbnRrKEtFUk5fSU5GTyAiTG9nIG1lc3NhZ2UgY29kZT0weCVYXG4iLCBtc2dfY29kZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiTGluaz0lZFxuIiwgbGluayk7CisJcHJpbnRrKEtFUk5fSU5GTyAibG9nIGNvZGU9MHglWFxuIiwgY29kZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAibG9nIHJvdXRpbmU9MHglWFxuIiwgcm91dGluZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiTWVzc2FnZSBzaXplPSVkXG4iLCBzaXplKTsKKwloZXhfZHVtcCgiTWVzc2FnZSIsIGJmLCB0b3JlYWQpOworI2VuZGlmCit9CisKKy8qIFNUQVRJU1RJQyBpbnRlcnJ1cHQgaGFuZGxlci4gKi8KK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2lycV9zdGF0KHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwKKwkJCSAgICAgIHN0cnVjdCBjeWN4X3gyNV9jbWQgKmNtZCkKK3sKKwljeWN4X3BlZWsoJmNhcmQtPmh3LCBjbWQtPmJ1ZiwgJmNhcmQtPnUueC5zdGF0cywKKwkJICBzaXplb2YoY2FyZC0+dS54LnN0YXRzKSk7CisJaGV4X2R1bXAoImN5Y3hfeDI1X2lycV9zdGF0IiwgKHVuc2lnbmVkIGNoYXIqKSZjYXJkLT51Lnguc3RhdHMsCisJCSBzaXplb2YoY2FyZC0+dS54LnN0YXRzKSk7CisJY3ljeF94MjVfZHVtcF9zdGF0cygmY2FyZC0+dS54LnN0YXRzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNhcmQtPndhaXRfc3RhdHMpOworfQorCisvKiBTcHVyaW91cyBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqIG8gcHJpbnQgYSB3YXJuaW5nCisgKiBJZiBudW1iZXIgb2Ygc3B1cmlvdXMgaW50ZXJydXB0cyBleGNlZWRlZCBzb21lIGxpbWl0LCB0aGVuID8/PyAqLworc3RhdGljIHZvaWQgY3ljeF94MjVfaXJxX3NwdXJpb3VzKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwKKwkJCQkgIHN0cnVjdCBjeWN4X3gyNV9jbWQgKmNtZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlczogc3B1cmlvdXMgaW50ZXJydXB0ICgweCVYKSFcbiIsCisJCQkgY2FyZC0+ZGV2bmFtZSwgY21kLT5jb21tYW5kKTsKK30KKyNpZmRlZiBDWUNMT01YX1gyNV9ERUJVRworc3RhdGljIHZvaWQgaGV4X2R1bXAoY2hhciAqbXNnLCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgaGV4WzEwMjRdLAorCSAgICAJKiBwaGV4ID0gaGV4OworCisJaWYgKGxlbiA+PSAoc2l6ZW9mKGhleCkgLyAyKSkKKwkJbGVuID0gKHNpemVvZihoZXgpIC8gMikgLSAxOworCisJd2hpbGUgKGxlbi0tKSB7CisJCXNwcmludGYocGhleCwgIiUwMngiLCAqcCsrKTsKKwkJcGhleCArPSAyOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlc1xuIiwgbXNnLCBoZXgpOworfQorI2VuZGlmCisKKy8qIEN5Y2xvbSAyWCBGaXJtd2FyZS1TcGVjaWZpYyBGdW5jdGlvbnMgKi8KKy8qIEV4ZWMgWC4yNSBjb21tYW5kLiAqLworc3RhdGljIGludCB4MjVfZXhlYyhzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsIGludCBjb21tYW5kLCBpbnQgbGluaywKKwkJICAgIHZvaWQgKmQxLCBpbnQgbGVuMSwgdm9pZCAqZDIsIGludCBsZW4yKQoreworCXN0cnVjdCBjeWN4X3gyNV9jbWQgYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBhZGRyID0gMHgxMjAwICsgMHgyRTAgKiBsaW5rICsgMHgxRTI7CisJdTggcmV0cnkgPSBDWUNYX1gyNV9NQVhfQ01EX1JFVFJZOworCWludCBlcnIgPSAwOworCisJYy5jb21tYW5kID0gY29tbWFuZDsKKwljLmxpbmsgPSBsaW5rOworCWMubGVuID0gbGVuMSArIGxlbjI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+dS54LmxvY2ssIGZsYWdzKTsKKworCS8qIHdyaXRlIGNvbW1hbmQgKi8KKwljeWN4X3Bva2UoJmNhcmQtPmh3LCBYMjVfTUJPWF9PRkZTLCAmYywgc2l6ZW9mKGMpIC0gc2l6ZW9mKGMuYnVmKSk7CisKKwkvKiB3cml0ZSBYLjI1IGRhdGEgKi8KKwlpZiAoZDEpIHsKKwkJY3ljeF9wb2tlKCZjYXJkLT5odywgYWRkciwgZDEsIGxlbjEpOworCisJCWlmIChkMikgeworCQkJaWYgKGxlbjIgPiAyNTQpIHsKKwkJCQl1MzIgYWRkcjEgPSAweEEwMCArIDB4NDAwICogbGluazsKKworCQkJCWN5Y3hfcG9rZSgmY2FyZC0+aHcsIGFkZHIgKyBsZW4xLCBkMiwgMjQ5KTsKKwkJCQljeWN4X3Bva2UoJmNhcmQtPmh3LCBhZGRyMSwgKCh1OCopZDIpICsgMjQ5LAorCQkJCQkgIGxlbjIgLSAyNDkpOworCQkJfSBlbHNlCisJCQkJY3ljeF9wb2tlKCZjYXJkLT5odywgYWRkciArIGxlbjEsIGQyLCBsZW4yKTsKKwkJfQorCX0KKworCS8qIGdlbmVyYXRlIGludGVycnVwdGlvbiwgZXhlY3V0aW5nIGNvbW1hbmQgKi8KKwljeWN4X2ludHIoJmNhcmQtPmh3KTsKKworCS8qIHdhaXQgdGlsbCBjYXJkLT5tYm94ID09IDAgKi8KKwlkbyB7CisJCWVyciA9IGN5Y3hfZXhlYyhjYXJkLT5tYm94KTsKKwl9IHdoaWxlIChyZXRyeS0tICYmIGVycik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT51LngubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworLyogQ29uZmlndXJlIGFkYXB0ZXIuICovCitzdGF0aWMgaW50IGN5Y3hfeDI1X2NvbmZpZ3VyZShzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsCisJCQkgICAgICBzdHJ1Y3QgY3ljeF94MjVfY29uZmlnICpjb25mKQoreworCXN0cnVjdCB7CisJCXUxNiBubGlua3M7CisJCXN0cnVjdCBjeWN4X3gyNV9jb25maWcgY29uZlsyXTsKKwl9IHgyNV9jbWRfY29uZjsKKworCW1lbXNldCgmeDI1X2NtZF9jb25mLCAwLCBzaXplb2YoeDI1X2NtZF9jb25mKSk7CisJeDI1X2NtZF9jb25mLm5saW5rcyA9IDI7CisJeDI1X2NtZF9jb25mLmNvbmZbMF0gPSAqY29uZjsKKwkvKiBGSVhNRTogd2UgbmVlZCB0byBmaW5kIGEgd2F5IGluIHRoZSB3YW5yb3V0ZXIgZnJhbWV3b3JrCisJCSAgdG8gY29uZmlndXJlIHRoZSBzZWNvbmQgbGluaywgZm9yIG5vdyBsZXRzIHVzZSBpdAorCQkgIHdpdGggdGhlIHNhbWUgY29uZmlnIGZyb20gdGhlIGZpcnN0IGxpbmssIGZpeGluZworCQkgIHRoZSBpbnRlcmZhY2UgdHlwZSB0byBSUzIzMiwgdGhlIHNwZWVkIGluIDM4NDAwIGFuZAorCQkgIHRoZSBjbG9jayB0byBleHRlcm5hbCAqLworCXgyNV9jbWRfY29uZi5jb25mWzFdID0gKmNvbmY7CisJeDI1X2NtZF9jb25mLmNvbmZbMV0ubGluayA9IDE7CisJeDI1X2NtZF9jb25mLmNvbmZbMV0uc3BlZWQgPSA1OyAvKiAzODQwMCAqLworCXgyNV9jbWRfY29uZi5jb25mWzFdLmNsb2NrID0gODsKKwl4MjVfY21kX2NvbmYuY29uZlsxXS5mbGFncyA9IDA7IC8qIGRlZmF1bHQgPSBSUzIzMiAqLworCisJY3ljeF94MjVfZHVtcF9jb25maWcoJngyNV9jbWRfY29uZi5jb25mWzBdKTsKKwljeWN4X3gyNV9kdW1wX2NvbmZpZygmeDI1X2NtZF9jb25mLmNvbmZbMV0pOworCisJcmV0dXJuIHgyNV9leGVjKGNhcmQsIFgyNV9DT05GSUcsIDAsCisJCQkmeDI1X2NtZF9jb25mLCBzaXplb2YoeDI1X2NtZF9jb25mKSwgTlVMTCwgMCk7Cit9CisKKy8qIEdldCBwcm90b2NvbCBzdGF0aXN0aWNzLiAqLworc3RhdGljIGludCBjeWN4X3gyNV9nZXRfc3RhdHMoc3RydWN0IGN5Y3hfZGV2aWNlICpjYXJkKQoreworCS8qIHRoZSBmaXJtd2FyZSBleHBlY3RzIDIwIGluIHRoZSBzaXplIGZpZWxkISEhCisJICAgdGhhbmtzIHRvIERhbmllbGEgKi8KKwlpbnQgZXJyID0geDI1X2V4ZWMoY2FyZCwgWDI1X1NUQVRJU1RJQywgMCwgTlVMTCwgMjAsIE5VTEwsIDApOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWludGVycnVwdGlibGVfc2xlZXBfb24oJmNhcmQtPndhaXRfc3RhdHMpOworCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVJTlRSOworCisJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X3BhY2tldHMgPSBjYXJkLT51Lnguc3RhdHMubjJfcnhfZnJhbWVzOworCWNhcmQtPndhbmRldi5zdGF0cy5yeF9vdmVyX2Vycm9ycyA9IGNhcmQtPnUueC5zdGF0cy5yeF9vdmVyX2Vycm9yczsKKwljYXJkLT53YW5kZXYuc3RhdHMucnhfY3JjX2Vycm9ycyA9IGNhcmQtPnUueC5zdGF0cy5yeF9jcmNfZXJyb3JzOworCWNhcmQtPndhbmRldi5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0gMDsgLyogbm90IGF2YWlsYWJsZSBmcm9tIGZ3ICovCisJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycyA9IDA7IC8qIG5vdCBhdmFpbGFibGUgZnJvbSBmdyAqLworCWNhcmQtPndhbmRldi5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0gY2FyZC0+dS54LnN0YXRzLnJ4X2Fib3J0czsKKwljYXJkLT53YW5kZXYuc3RhdHMucnhfZHJvcHBlZCA9IDA7IC8qIG5vdCBhdmFpbGFibGUgZnJvbSBmdyAqLworCWNhcmQtPndhbmRldi5zdGF0cy5yeF9lcnJvcnMgPSAwOyAvKiBub3QgYXZhaWxhYmxlIGZyb20gZncgKi8KKwljYXJkLT53YW5kZXYuc3RhdHMudHhfcGFja2V0cyA9IGNhcmQtPnUueC5zdGF0cy5uMl90eF9mcmFtZXM7CisJY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzID0gY2FyZC0+dS54LnN0YXRzLnR4X2Fib3J0czsKKwljYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZCA9IDA7IC8qIG5vdCBhdmFpbGFibGUgZnJvbSBmdyAqLworCWNhcmQtPndhbmRldi5zdGF0cy5jb2xsaXNpb25zID0gMDsgLyogbm90IGF2YWlsYWJsZSBmcm9tIGZ3ICovCisJY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Vycm9ycyA9IDA7IC8qIG5vdCBhdmFpbGFibGUgZnJvbSBmdyAqLworCisJY3ljeF94MjVfZHVtcF9kZXZzKCZjYXJkLT53YW5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHJldHVybiB0aGUgbnVtYmVyIG9mIG5pYmJsZXMgKi8KK3N0YXRpYyBpbnQgYnl0ZV90b19uaWJibGUodTggKnMsIHU4ICpkLCBjaGFyICpuaWJibGUpCit7CisJaW50IGkgPSAwOworCisJaWYgKCpuaWJibGUgJiYgKnMpIHsKKwkJZFtpXSB8PSAqcysrIC0gJzAnOworCQkqbmliYmxlID0gMDsKKwkJKytpOworCX0KKworCXdoaWxlICgqcykgeworCQlkW2ldID0gKCpzIC0gJzAnKSA8PCA0OworCQlpZiAoKihzICsgMSkpCisJCQlkW2ldIHw9ICoocyArIDEpIC0gJzAnOworCQllbHNlIHsKKwkJCSpuaWJibGUgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJKytpOworCQlzICs9IDI7CisJfQorCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkIG5pYmJsZV90b19ieXRlKHU4ICpzLCB1OCAqZCwgdTggbGVuLCB1OCBuaWJibGUpCit7CisJaWYgKG5pYmJsZSkgeworCQkqZCsrID0gJzAnICsgKCpzKysgJiAweDBGKTsKKwkJLS1sZW47CisJfQorCisJd2hpbGUgKGxlbikgeworCQkqZCsrID0gJzAnICsgKCpzID4+IDQpOworCisJCWlmICgtLWxlbikgeworCQkJKmQrKyA9ICcwJyArICgqcyAmIDB4MEYpOworCQkJLS1sZW47CisJCX0gZWxzZSBicmVhazsKKworCQkrK3M7CisJfQorCisJKmQgPSAnXDAnOworfQorCisvKiBQbGFjZSBYLjI1IGNhbGwuICovCitzdGF0aWMgaW50IHgyNV9wbGFjZV9jYWxsKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwKKwkJCSAgc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW4pCit7CisJaW50IGVyciA9IDAsCisJICAgIGxlbjsKKwljaGFyIGRbNjRdLAorCSAgICAgbmliYmxlID0gMCwKKwkgICAgIG15bGVuID0gY2hhbi0+bG9jYWxfYWRkciA/IHN0cmxlbihjaGFuLT5sb2NhbF9hZGRyKSA6IDAsCisJICAgICByZW1vdGVsZW4gPSBzdHJsZW4oY2hhbi0+YWRkcik7CisJdTgga2V5OworCisJaWYgKGNhcmQtPnUueC5jb25uZWN0aW9uX2tleXMgPT0gfjBVKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiB0b28gbWFueSBzaW11bHRhbmVvdXMgY29ubmVjdGlvbiAiCisJCQkJICJyZXF1ZXN0cyFcbiIsIGNhcmQtPmRldm5hbWUpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlrZXkgPSBmZnooY2FyZC0+dS54LmNvbm5lY3Rpb25fa2V5cyk7CisJc2V0X2JpdChrZXksICh2b2lkKikmY2FyZC0+dS54LmNvbm5lY3Rpb25fa2V5cyk7CisJKytrZXk7CisJZHByaW50aygxLCBLRVJOX0lORk8gIiVzOngyNV9wbGFjZV9jYWxsOmtleT0lZFxuIiwgY2FyZC0+ZGV2bmFtZSwga2V5KTsKKwltZW1zZXQoZCwgMCwgc2l6ZW9mKGQpKTsKKwlkWzFdID0ga2V5OyAvKiB1c2VyIGtleSAqLworCWRbMl0gPSAweDEwOworCWRbNF0gPSAweDBCOworCisJbGVuID0gYnl0ZV90b19uaWJibGUoY2hhbi0+YWRkciwgZCArIDYsICZuaWJibGUpOworCisJaWYgKGNoYW4tPmxvY2FsX2FkZHIpCisJCWxlbiArPSBieXRlX3RvX25pYmJsZShjaGFuLT5sb2NhbF9hZGRyLCBkICsgNiArIGxlbiwgJm5pYmJsZSk7CisKKwlpZiAobmliYmxlKQorCQkrK2xlbjsKKworCWRbNV0gPSBteWxlbiA8PCA0IHwgcmVtb3RlbGVuOworCWRbNiArIGxlbiArIDFdID0gMHhDQzsgLyogVENQL0lQIG92ZXIgWC4yNSwgdGhhbmtzIHRvIERhbmllbGEgOikgKi8KKworCWlmICgoZXJyID0geDI1X2V4ZWMoY2FyZCwgWDI1X0NPTk5FQ1RfUkVRVUVTVCwgY2hhbi0+bGluaywKKwkJCSAgICAmZCwgNyArIGxlbiArIDEsIE5VTEwsIDApKSAhPSAwKQorCQljbGVhcl9iaXQoLS1rZXksICh2b2lkKikmY2FyZC0+dS54LmNvbm5lY3Rpb25fa2V5cyk7CisJZWxzZQorCQljaGFuLT5sY24gPSAta2V5OworCisJcmV0dXJuIGVycjsKK30KKworLyogUGxhY2UgWC4yNSBDT05ORUNUIFJFU1BPTlNFLiAqLworc3RhdGljIGludCBjeWN4X3gyNV9jb25uZWN0X3Jlc3BvbnNlKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwKKwkJCQkgICAgIHN0cnVjdCBjeWN4X3gyNV9jaGFubmVsICpjaGFuKQoreworCXU4IGRbOF07CisKKwltZW1zZXQoZCwgMCwgc2l6ZW9mKGQpKTsKKwlkWzBdID0gZFszXSA9IGNoYW4tPmxjbjsKKwlkWzJdID0gMHgxMDsKKwlkWzRdID0gMHgwRjsKKwlkWzddID0gMHhDQzsgLyogVENQL0lQIG92ZXIgWC4yNSwgdGhhbmtzIERhbmllbGEgKi8KKworCXJldHVybiB4MjVfZXhlYyhjYXJkLCBYMjVfQ09OTkVDVF9SRVNQT05TRSwgY2hhbi0+bGluaywgJmQsIDgsIE5VTEwsIDApOworfQorCisvKiBQbGFjZSBYLjI1IERJU0NPTk5FQ1QgUkVTUE9OU0UuICAqLworc3RhdGljIGludCBjeWN4X3gyNV9kaXNjb25uZWN0X3Jlc3BvbnNlKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwgdTggbGluaywKKwkJCQkJdTggbGNuKQoreworCWNoYXIgZFs1XTsKKworCW1lbXNldChkLCAwLCBzaXplb2YoZCkpOworCWRbMF0gPSBkWzNdID0gbGNuOworCWRbMl0gPSAweDEwOworCWRbNF0gPSAweDE3OworCisJcmV0dXJuIHgyNV9leGVjKGNhcmQsIFgyNV9ESVNDT05ORUNUX1JFU1BPTlNFLCBsaW5rLCAmZCwgNSwgTlVMTCwgMCk7Cit9CisKKy8qIENsZWFyIFguMjUgY2FsbC4gICovCitzdGF0aWMgaW50IHgyNV9jbGVhcl9jYWxsKHN0cnVjdCBjeWN4X2RldmljZSAqY2FyZCwgdTggbGluaywgdTggbGNuLCB1OCBjYXVzZSwKKwkJCSAgdTggZGlhZ24pCit7CisJdTggZFs3XTsKKworCW1lbXNldChkLCAwLCBzaXplb2YoZCkpOworCWRbMF0gPSBkWzNdID0gbGNuOworCWRbMl0gPSAweDEwOworCWRbNF0gPSAweDEzOworCWRbNV0gPSBjYXVzZTsKKwlkWzZdID0gZGlhZ247CisKKwlyZXR1cm4geDI1X2V4ZWMoY2FyZCwgWDI1X0RJU0NPTk5FQ1RfUkVRVUVTVCwgbGluaywgZCwgNywgTlVMTCwgMCk7Cit9CisKKy8qIFNlbmQgWC4yNSBkYXRhIHBhY2tldC4gKi8KK3N0YXRpYyBpbnQgY3ljeF94MjVfc2VuZChzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQsIHU4IGxpbmssIHU4IGxjbiwgdTggYml0bSwKKwkJCSBpbnQgbGVuLCB2b2lkICpidWYpCit7CisJdTggZFtdID0gIj9ceEZGXHgxMD8/IjsKKworCWRbMF0gPSBkWzNdID0gbGNuOworCWRbNF0gPSBiaXRtOworCisJcmV0dXJuIHgyNV9leGVjKGNhcmQsIFgyNV9EQVRBX1JFUVVFU1QsIGxpbmssICZkLCA1LCBidWYsIGxlbik7Cit9CisKKy8qIE1pc2NlbGxhbmVvdXMgKi8KKy8qIEZpbmQgbmV0d29yayBkZXZpY2UgYnkgaXRzIGNoYW5uZWwgbnVtYmVyLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqY3ljeF94MjVfZ2V0X2Rldl9ieV9sY24oc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiwKKwkJCQkJCSAgczE2IGxjbikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2FuZGV2LT5kZXY7CisJc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW47CisKKwl3aGlsZSAoZGV2KSB7CisJCWNoYW4gPSAoc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwqKWRldi0+cHJpdjsKKworCQlpZiAoY2hhbi0+bGNuID09IGxjbikKKwkJCWJyZWFrOworCQlkZXYgPSBjaGFuLT5zbGF2ZTsKKwl9CisJcmV0dXJuIGRldjsKK30KKworLyogRmluZCBuZXR3b3JrIGRldmljZSBieSBpdHMgcmVtb3RlIGR0ZSBhZGRyZXNzLiAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICoKKwljeWN4X3gyNV9nZXRfZGV2X2J5X2R0ZV9hZGRyKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsIGNoYXIgKmR0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2FuZGV2LT5kZXY7CisJc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW47CisKKwl3aGlsZSAoZGV2KSB7CisJCWNoYW4gPSAoc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwqKWRldi0+cHJpdjsKKworCQlpZiAoIXN0cmNtcChjaGFuLT5hZGRyLCBkdGUpKQorCQkJYnJlYWs7CisJCWRldiA9IGNoYW4tPnNsYXZlOworCX0KKwlyZXR1cm4gZGV2OworfQorCisvKiBJbml0aWF0ZSBjb25uZWN0aW9uIG9uIHRoZSBsb2dpY2FsIGNoYW5uZWwuCisgKiBvIGZvciBQVkMgd2UganVzdCBnZXQgY2hhbm5lbCBjb25maWd1cmF0aW9uCisgKiBvIGZvciBTVkNzIHBsYWNlIGFuIFguMjUgY2FsbAorICoKKyAqIFJldHVybjoJMAljb25uZWN0ZWQKKyAqCQk+MAljb25uZWN0aW9uIGluIHByb2dyZXNzCisgKgkJPDAJZmFpbHVyZSAqLworc3RhdGljIGludCBjeWN4X3gyNV9jaGFuX2Nvbm5lY3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQgPSBjaGFuLT5jYXJkOworCisJaWYgKGNoYW4tPnN2YykgeworCQlpZiAoIWNoYW4tPmFkZHJbMF0pCisJCQlyZXR1cm4gLUVJTlZBTDsgLyogbm8gZGVzdGluYXRpb24gYWRkcmVzcyAqLworCisJCWRwcmludGsoMSwgS0VSTl9JTkZPICIlczogcGxhY2luZyBYLjI1IGNhbGwgdG8gJXMuLi5cbiIsCisJCQkJICBjYXJkLT5kZXZuYW1lLCBjaGFuLT5hZGRyKTsKKworCQlpZiAoeDI1X3BsYWNlX2NhbGwoY2FyZCwgY2hhbikpCisJCQlyZXR1cm4gLUVJTzsKKworCQljeWN4X3gyNV9zZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9DT05ORUNUSU5HKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlCisJCWN5Y3hfeDI1X3NldF9jaGFuX3N0YXRlKGRldiwgV0FOX0NPTk5FQ1RFRCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogRGlzY29ubmVjdCBsb2dpY2FsIGNoYW5uZWwuCisgKiBvIGlmIFNWQyB0aGVuIGNsZWFyIFguMjUgY2FsbCAqLworc3RhdGljIHZvaWQgY3ljeF94MjVfY2hhbl9kaXNjb25uZWN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGN5Y3hfeDI1X2NoYW5uZWwgKmNoYW4gPSBkZXYtPnByaXY7CisKKwlpZiAoY2hhbi0+c3ZjKSB7CisJCXgyNV9jbGVhcl9jYWxsKGNoYW4tPmNhcmQsIGNoYW4tPmxpbmssIGNoYW4tPmxjbiwgMCwgMCk7CisJCWN5Y3hfeDI1X3NldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RJTkcpOworCX0gZWxzZQorCQljeWN4X3gyNV9zZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9ESVNDT05ORUNURUQpOworfQorCisvKiBDYWxsZWQgYnkga2VybmVsIHRpbWVyICovCitzdGF0aWMgdm9pZCBjeWN4X3gyNV9jaGFuX3RpbWVyKHVuc2lnbmVkIGxvbmcgZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZDsKKwlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbiA9IGRldi0+cHJpdjsKKworCWlmIChjaGFuLT5zdGF0ZSA9PSBXQU5fQ09OTkVDVEVEKQorCQljeWN4X3gyNV9jaGFuX2Rpc2Nvbm5lY3QoZGV2KTsKKwllbHNlCisJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzIGZvciBzdmMgKCVzKSBub3QgY29ubmVjdGVkIVxuIiwKKwkJCQljaGFuLT5jYXJkLT5kZXZuYW1lLCBfX0ZVTkNUSU9OX18sIGRldi0+bmFtZSk7Cit9CisKKy8qIFNldCBsb2dpY2FsIGNoYW5uZWwgc3RhdGUuICovCitzdGF0aWMgdm9pZCBjeWN4X3gyNV9zZXRfY2hhbl9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQgPSBjaGFuLT5jYXJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY2hhciAqc3RyaW5nX3N0YXRlID0gTlVMTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoY2hhbi0+c3RhdGUgIT0gc3RhdGUpIHsKKwkJaWYgKGNoYW4tPnN2YyAmJiBjaGFuLT5zdGF0ZSA9PSBXQU5fQ09OTkVDVEVEKQorCQkJZGVsX3RpbWVyKCZjaGFuLT50aW1lcik7CisKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIFdBTl9DT05ORUNURUQ6CisJCQlzdHJpbmdfc3RhdGUgPSAiY29ubmVjdGVkISI7CisJCQkqKHUxNiopZGV2LT5kZXZfYWRkciA9IGh0b25zKGNoYW4tPmxjbik7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQlyZXNldF90aW1lcihkZXYpOworCisJCQlpZiAoY2hhbi0+cHJvdG9jb2wgPT0gRVRIX1BfWDI1KQorCQkJCWN5Y3hfeDI1X2NoYW5fc2VuZF9ldmVudChkZXYsIDEpOworCisJCQlicmVhazsKKwkJY2FzZSBXQU5fQ09OTkVDVElORzoKKwkJCXN0cmluZ19zdGF0ZSA9ICJjb25uZWN0aW5nLi4uIjsKKwkJCWJyZWFrOworCQljYXNlIFdBTl9ESVNDT05ORUNUSU5HOgorCQkJc3RyaW5nX3N0YXRlID0gImRpc2Nvbm5lY3RpbmcuLi4iOworCQkJYnJlYWs7CisJCWNhc2UgV0FOX0RJU0NPTk5FQ1RFRDoKKwkJCXN0cmluZ19zdGF0ZSA9ICJkaXNjb25uZWN0ZWQhIjsKKworCQkJaWYgKGNoYW4tPnN2YykgeworCQkJCSoodW5zaWduZWQgc2hvcnQqKWRldi0+ZGV2X2FkZHIgPSAwOworCQkJCWNoYW4tPmxjbiA9IDA7CisJCQl9CisKKwkJCWlmIChjaGFuLT5wcm90b2NvbCA9PSBFVEhfUF9YMjUpCisJCQkJY3ljeF94MjVfY2hhbl9zZW5kX2V2ZW50KGRldiwgMik7CisKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCWJyZWFrOworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludGVyZmFjZSAlcyAlc1xuIiwgY2FyZC0+ZGV2bmFtZSwKKwkJCQkgIGRldi0+bmFtZSwgc3RyaW5nX3N0YXRlKTsKKwkJY2hhbi0+c3RhdGUgPSBzdGF0ZTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIFNlbmQgcGFja2V0IG9uIGEgbG9naWNhbCBjaGFubmVsLgorICoJV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdHhfc2tiIGZpZWxkIG9mIHRoZSBjaGFubmVsIGRhdGEgc3BhY2UKKyAqCXBvaW50cyB0byB0aGUgdHJhbnNtaXQgc29ja2V0IGJ1ZmZlci4gIFdoZW4gdHJhbnNtaXNzaW9uIGlzIGNvbXBsZXRlLAorICoJcmVsZWFzZSBzb2NrZXQgYnVmZmVyIGFuZCByZXNldCAndGJ1c3knIGZsYWcuCisgKgorICogUmV0dXJuOgkwCS0gdHJhbnNtaXNzaW9uIGNvbXBsZXRlCisgKgkJMQktIGJ1c3kKKyAqCisgKiBOb3RlczoKKyAqIDEuIElmIHBhY2tldCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIE1UVSBmb3IgdGhpcyBjaGFubmVsLCB3ZSdsbCBmcmFnbWVudAorICogICAgdGhlIHBhY2tldCBpbnRvICdjb21wbGV0ZSBzZXF1ZW5jZScgdXNpbmcgTS1iaXQuCisgKiAyLiBXaGVuIHRyYW5zbWlzc2lvbiBpcyBjb21wbGV0ZSwgYW4gZXZlbnQgbm90aWZpY2F0aW9uIHNob3VsZCBiZSBpc3N1ZWQKKyAqICAgIHRvIHRoZSByb3V0ZXIuICAqLworc3RhdGljIGludCBjeWN4X3gyNV9jaGFuX3NlbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgY3ljeF9kZXZpY2UgKmNhcmQgPSBjaGFuLT5jYXJkOworCWludCBiaXRtID0gMDsJCS8qIGZpbmFsIHBhY2tldCAqLworCXVuc2lnbmVkIGxlbiA9IHNrYi0+bGVuOworCisJaWYgKHNrYi0+bGVuID4gY2FyZC0+d2FuZGV2Lm10dSkgeworCQlsZW4gPSBjYXJkLT53YW5kZXYubXR1OworCQliaXRtID0gMHgxMDsJCS8qIHNldCBNLWJpdCAobW9yZSBkYXRhKSAqLworCX0KKworCWlmIChjeWN4X3gyNV9zZW5kKGNhcmQsIGNoYW4tPmxpbmssIGNoYW4tPmxjbiwgYml0bSwgbGVuLCBza2ItPmRhdGEpKQorCQlyZXR1cm4gMTsKKworCWlmIChiaXRtKSB7CisJCXNrYl9wdWxsKHNrYiwgbGVuKTsKKwkJcmV0dXJuIDE7CisJfQorCisJKytjaGFuLT5pZnN0YXRzLnR4X3BhY2tldHM7CisJY2hhbi0+aWZzdGF0cy50eF9ieXRlcyArPSBsZW47CisKKwlyZXR1cm4gMDsKK30KKworLyogU2VuZCBldmVudCAoY29ubmVjdGlvbiwgZGlzY29ubmVjdGlvbiwgZXRjKSB0byBYLjI1IHNvY2tldCBsYXllciAqLworCitzdGF0aWMgdm9pZCBjeWN4X3gyNV9jaGFuX3NlbmRfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggZXZlbnQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisKKwlpZiAoKHNrYiA9IGRldl9hbGxvY19za2IoMSkpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogb3V0IG9mIG1lbW9yeVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCXB0ciAgPSBza2JfcHV0KHNrYiwgMSk7CisJKnB0ciA9IGV2ZW50OworCisJc2tiLT5wcm90b2NvbCA9IHgyNV90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwluZXRpZl9yeChza2IpOworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CQkvKiB0aW1lc3RhbXAgKi8KK30KKworLyogQ29udmVydCBsaW5lIHNwZWVkIGluIGJwcyB0byBhIG51bWJlciB1c2VkIGJ5IGN5Y2xvbSAyeCBjb2RlLiAqLworc3RhdGljIHU4IGJwc190b19zcGVlZF9jb2RlKHUzMiBicHMpCit7CisJdTggbnVtYmVyID0gMDsgLyogZGVmYXVsdHMgdG8gdGhlIGxvd2VzdCAoMTIwMCkgc3BlZWQgOz4gKi8KKworCSAgICAgaWYgKGJwcyA+PSA1MTIwMDApIG51bWJlciA9IDg7CisJZWxzZSBpZiAoYnBzID49IDI1NjAwMCkgbnVtYmVyID0gNzsKKwllbHNlIGlmIChicHMgPj0gNjQwMDApICBudW1iZXIgPSA2OworCWVsc2UgaWYgKGJwcyA+PSAzODQwMCkgIG51bWJlciA9IDU7CisJZWxzZSBpZiAoYnBzID49IDE5MjAwKSAgbnVtYmVyID0gNDsKKwllbHNlIGlmIChicHMgPj0gOTYwMCkgICBudW1iZXIgPSAzOworCWVsc2UgaWYgKGJwcyA+PSA0ODAwKSAgIG51bWJlciA9IDI7CisJZWxzZSBpZiAoYnBzID49IDI0MDApICAgbnVtYmVyID0gMTsKKworCXJldHVybiBudW1iZXI7Cit9CisKKy8qIGxvZyBiYXNlIDIgKi8KK3N0YXRpYyB1OCBjeWN4X2xvZzIodTMyIG4pCit7CisJdTggbG9nID0gMDsKKworCWlmICghbikKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAobiA+IDEpIHsKKwkJbiA+Pj0gMTsKKwkJKytsb2c7CisJfQorCisJcmV0dXJuIGxvZzsKK30KKworLyogQ29udmVydCBkZWNpbWFsIHN0cmluZyB0byB1bnNpZ25lZCBpbnRlZ2VyLgorICogSWYgbGVuICE9IDAgdGhlbiBvbmx5ICdsZW4nIGNoYXJhY3RlcnMgb2YgdGhlIHN0cmluZyBhcmUgY29udmVydGVkLiAqLworc3RhdGljIHVuc2lnbmVkIGRlY190b191aW50KHU4ICpzdHIsIGludCBsZW4pCit7CisJdW5zaWduZWQgdmFsID0gMDsKKworCWlmICghbGVuKQorCQlsZW4gPSBzdHJsZW4oc3RyKTsKKworCWZvciAoOyBsZW4gJiYgaXNfZGlnaXQoKnN0cik7ICsrc3RyLCAtLWxlbikKKwkJdmFsID0gKHZhbCAqIDEwKSArICgqc3RyIC0gKHVuc2lnbmVkKSAnMCcpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfdGltZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbiA9IGRldi0+cHJpdjsKKworCWlmIChjaGFuLT5zdmMpCisJCW1vZF90aW1lcigmY2hhbi0+dGltZXIsIGppZmZpZXMrY2hhbi0+aWRsZV90bW91dCpIWik7Cit9CisjaWZkZWYgQ1lDTE9NWF9YMjVfREVCVUcKK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2R1bXBfY29uZmlnKHN0cnVjdCBjeWN4X3gyNV9jb25maWcgKmNvbmYpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiWC4yNSBjb25maWd1cmF0aW9uXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICItLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAibGluayBudW1iZXI9JWRcbiIsIGNvbmYtPmxpbmspOworCXByaW50ayhLRVJOX0lORk8gImxpbmUgc3BlZWQ9JWRcbiIsIGNvbmYtPnNwZWVkKTsKKwlwcmludGsoS0VSTl9JTkZPICJjbG9jaz0lc3Rlcm5hbFxuIiwgY29uZi0+Y2xvY2sgPT0gOCA/ICJFeCIgOiAiSW4iKTsKKwlwcmludGsoS0VSTl9JTkZPICIjIGxldmVsIDIgcmV0cmFuc20uPSVkXG4iLCBjb25mLT5uMik7CisJcHJpbnRrKEtFUk5fSU5GTyAibGV2ZWwgMiB3aW5kb3c9JWRcbiIsIGNvbmYtPm4yd2luKTsKKwlwcmludGsoS0VSTl9JTkZPICJsZXZlbCAzIHdpbmRvdz0lZFxuIiwgY29uZi0+bjN3aW4pOworCXByaW50ayhLRVJOX0lORk8gIiMgbG9naWNhbCBjaGFubmVscz0lZFxuIiwgY29uZi0+bnZjKTsKKwlwcmludGsoS0VSTl9JTkZPICJsZXZlbCAzIHBrdCBsZW49JWRcbiIsIGNvbmYtPnBrdGxlbik7CisJcHJpbnRrKEtFUk5fSU5GTyAibXkgYWRkcmVzcz0lZFxuIiwgY29uZi0+bG9jYWRkcik7CisJcHJpbnRrKEtFUk5fSU5GTyAicmVtb3RlIGFkZHJlc3M9JWRcbiIsIGNvbmYtPnJlbWFkZHIpOworCXByaW50ayhLRVJOX0lORk8gInQxPSVkIHNlY29uZHNcbiIsIGNvbmYtPnQxKTsKKwlwcmludGsoS0VSTl9JTkZPICJ0Mj0lZCBzZWNvbmRzXG4iLCBjb25mLT50Mik7CisJcHJpbnRrKEtFUk5fSU5GTyAidDIxPSVkIHNlY29uZHNcbiIsIGNvbmYtPnQyMSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiIyBQVkNzPSVkXG4iLCBjb25mLT5ucHZjKTsKKwlwcmludGsoS0VSTl9JTkZPICJ0MjM9JWQgc2Vjb25kc1xuIiwgY29uZi0+dDIzKTsKKwlwcmludGsoS0VSTl9JTkZPICJmbGFncz0weCV4XG4iLCBjb25mLT5mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGN5Y3hfeDI1X2R1bXBfc3RhdHMoc3RydWN0IGN5Y3hfeDI1X3N0YXRzICpzdGF0cykKK3sKKwlwcmludGsoS0VSTl9JTkZPICJYLjI1IHN0YXRpc3RpY3NcbiIpOworCXByaW50ayhLRVJOX0lORk8gIi0tLS0tLS0tLS0tLS0tXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJyeF9jcmNfZXJyb3JzPSVkXG4iLCBzdGF0cy0+cnhfY3JjX2Vycm9ycyk7CisJcHJpbnRrKEtFUk5fSU5GTyAicnhfb3Zlcl9lcnJvcnM9JWRcbiIsIHN0YXRzLT5yeF9vdmVyX2Vycm9ycyk7CisJcHJpbnRrKEtFUk5fSU5GTyAibjJfdHhfZnJhbWVzPSVkXG4iLCBzdGF0cy0+bjJfdHhfZnJhbWVzKTsKKwlwcmludGsoS0VSTl9JTkZPICJuMl9yeF9mcmFtZXM9JWRcbiIsIHN0YXRzLT5uMl9yeF9mcmFtZXMpOworCXByaW50ayhLRVJOX0lORk8gInR4X3RpbWVvdXRzPSVkXG4iLCBzdGF0cy0+dHhfdGltZW91dHMpOworCXByaW50ayhLRVJOX0lORk8gInJ4X3RpbWVvdXRzPSVkXG4iLCBzdGF0cy0+cnhfdGltZW91dHMpOworCXByaW50ayhLRVJOX0lORk8gIm4zX3R4X3BhY2tldHM9JWRcbiIsIHN0YXRzLT5uM190eF9wYWNrZXRzKTsKKwlwcmludGsoS0VSTl9JTkZPICJuM19yeF9wYWNrZXRzPSVkXG4iLCBzdGF0cy0+bjNfcnhfcGFja2V0cyk7CisJcHJpbnRrKEtFUk5fSU5GTyAidHhfYWJvcnRzPSVkXG4iLCBzdGF0cy0+dHhfYWJvcnRzKTsKKwlwcmludGsoS0VSTl9JTkZPICJyeF9hYm9ydHM9JWRcbiIsIHN0YXRzLT5yeF9hYm9ydHMpOworfQorCitzdGF0aWMgdm9pZCBjeWN4X3gyNV9kdW1wX2RldnMoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2FuZGV2LT5kZXY7CisKKwlwcmludGsoS0VSTl9JTkZPICJYLjI1IGRldiBzdGF0ZXNcbiIpOworCXByaW50ayhLRVJOX0lORk8gIm5hbWU6IGFkZHI6ICAgICAgICAgICB0eG9mZjogIHByb3RvY29sOlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKworCXdoaWxlKGRldikgeworCQlzdHJ1Y3QgY3ljeF94MjVfY2hhbm5lbCAqY2hhbiA9IGRldi0+cHJpdjsKKworCQlwcmludGsoS0VSTl9JTkZPICIlLTUuNXMgJS0xNS4xNXMgICAlZCAgICAgRVRIX1BfJXNcbiIsCisJCQkJIGNoYW4tPm5hbWUsIGNoYW4tPmFkZHIsIG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSwKKwkJCQkgY2hhbi0+cHJvdG9jb2wgPT0gRVRIX1BfSVAgPyAiSVAiIDogIlgyNSIpOworCQlkZXYgPSBjaGFuLT5zbGF2ZTsKKwl9Cit9CisKKyNlbmRpZiAvKiBDWUNMT01YX1gyNV9ERUJVRyAqLworLyogRW5kICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vZGxjaS5jIGIvZHJpdmVycy9uZXQvd2FuL2RsY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTFlYzViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2RsY2kuYwpAQCAtMCwwICsxLDU2NiBAQAorLyoKKyAqIERMQ0kJCUltcGxlbWVudGF0aW9uIG9mIEZyYW1lIFJlbGF5IHByb3RvY29sIGZvciBMaW51eCwgYWNjb3JkaW5nIHRvCisgKgkJUkZDIDE0OTAuICBUaGlzIGdlbmVyaWMgZGV2aWNlIHByb3ZpZGVzIGVuL2RlY2Fwc3VsYXRpb24gZm9yIGFuCisgKgkJdW5kZXJseWluZyBoYXJkd2FyZSBkcml2ZXIuICBSb3V0ZXMgJiBJUHMgYXJlIGFzc2lnbmVkIHRvIHRoZXNlCisgKgkJaW50ZXJmYWNlcy4gIFJlcXVpcmVzICdkbGNpY2ZnJyBwcm9ncmFtIHRvIGNyZWF0ZSB1c2FibGUgCisgKgkJaW50ZXJmYWNlcywgdGhlIGluaXRpYWwgb25lLCAnZGxjaScgaXMgZm9yIElPQ1RMIHVzZSBvbmx5LgorICoKKyAqIFZlcnNpb246CUAoIylkbGNpLmMJMC4zNQk0IEphbiAxOTk3CisgKgorICogQXV0aG9yOglNaWtlIE1jTGFnYW4gPG1pa2UubWNsYWdhbkBsaW51eC5vcmc+CisgKgorICogQ2hhbmdlczoKKyAqCisgKgkJMC4xNQlNaWtlIE1jbGFnYW4JUGFja2V0IGZyZWVpbmcsIGJ1ZyBpbiBrbWFsbG9jIGNhbGwKKyAqCQkJCQlETENJX1JFVCBoYW5kbGluZworICoJCTAuMjAJTWlrZSBNY0xhZ2FuCU1vcmUgY29uc2VydmF0aXZlIG9uIHdoaWNoIHBhY2tldHMKKyAqCQkJCQlhcmUgcmV0dXJuZWQgZm9yIHJldHJ5IGFuZCB3aGljaCBhcmUKKyAqCQkJCQlhcmUgZHJvcHBlZC4gIElmIERMQ0lfUkVUX0RST1AgaXMKKyAqCQkJCQlyZXR1cm5lZCBmcm9tIHRoZSBGUkFELCB0aGUgcGFja2V0IGlzCisgKgkJCQkgCXNlbnQgYmFjayB0byBMaW51eCBmb3IgcmUtdHJhbnNtaXNzaW9uCisgKgkJMC4yNQlNaWtlIE1jTGFnYW4JQ29udmVydGVkIHRvIHVzZSBTSU9DIElPQ1RMIGNhbGxzCisgKgkJMC4zMAlKaW0gRnJlZW1hbglGaXhlZCB0byBhbGxvdyBJUFggdHJhZmZpYworICoJCTAuMzUJTWljaGFlbCBFbGl6YWJldGgJRml4ZWQgaW5jb3JyZWN0IG1lbWNweV9mcm9tZnMKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+IC8qIGZvciBDT05GSUdfRExDSV9DT1VOVCAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9mcmFkLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPSAiRExDSSBkcml2ZXIgdjAuMzUsIDQgSmFuIDE5OTcsIG1pa2UubWNsYWdhbkBsaW51eC5vcmciOworCitzdGF0aWMgTElTVF9IRUFEKGRsY2lfZGV2cyk7CisKK3N0YXRpYyB2b2lkIGRsY2lfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKik7CisKKy8qIAorICogdGhlc2UgZW5jYXBzdWxhdGUgdGhlIFJGQyAxNDkwIHJlcXVpcmVtZW50cyBhcyB3ZWxsIGFzIAorICogZGVhbCB3aXRoIHBhY2tldCB0cmFuc21pc3Npb24gYW5kIHJlY2VwdGlvbiwgd29ya2luZyB3aXRoCisgKiB0aGUgdXBwZXIgbmV0d29yayBsYXllcnMgCisgKi8KKworc3RhdGljIGludCBkbGNpX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsZW4pCit7CisJc3RydWN0IGZyaGRyCQloZHI7CisJc3RydWN0IGRsY2lfbG9jYWwJKmRscDsKKwl1bnNpZ25lZCBpbnQJCWhsZW47CisJY2hhcgkJCSpkZXN0OworCisJZGxwID0gZGV2LT5wcml2OworCisJaGRyLmNvbnRyb2wgPSBGUkFEX0lfVUk7CisJc3dpdGNoKHR5cGUpCisJeworCQljYXNlIEVUSF9QX0lQOgorCQkJaGRyLklQX05MUElEID0gRlJBRF9QX0lQOworCQkJaGxlbiA9IHNpemVvZihoZHIuY29udHJvbCkgKyBzaXplb2YoaGRyLklQX05MUElEKTsKKwkJCWJyZWFrOworCisJCS8qIGZlZWwgZnJlZSB0byBhZGQgb3RoZXIgdHlwZXMsIGlmIG5lY2Vzc2FyeSAqLworCisJCWRlZmF1bHQ6CisJCQloZHIucGFkID0gRlJBRF9QX1BBRERJTkc7CisJCQloZHIuTkxQSUQgPSBGUkFEX1BfU05BUDsKKwkJCW1lbXNldChoZHIuT1VJLCAwLCBzaXplb2YoaGRyLk9VSSkpOworCQkJaGRyLlBJRCA9IGh0b25zKHR5cGUpOworCQkJaGxlbiA9IHNpemVvZihoZHIpOworCQkJYnJlYWs7CisJfQorCisJZGVzdCA9IHNrYl9wdXNoKHNrYiwgaGxlbik7CisJaWYgKCFkZXN0KQorCQlyZXR1cm4oMCk7CisKKwltZW1jcHkoZGVzdCwgJmhkciwgaGxlbik7CisKKwlyZXR1cm4oaGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIGRsY2lfcmVjZWl2ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkbGNpX2xvY2FsICpkbHA7CisJc3RydWN0IGZyaGRyCQkqaGRyOworCWludAkJCQkJcHJvY2VzcywgaGVhZGVyOworCisJZGxwID0gZGV2LT5wcml2OworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqaGRyKSkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogaW52YWxpZCBkYXRhIG5vIGhlYWRlclxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWRscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCisJaGRyID0gKHN0cnVjdCBmcmhkciAqKSBza2ItPmRhdGE7CisJcHJvY2VzcyA9IDA7CisJaGVhZGVyID0gMDsKKwlza2ItPmRldiA9IGRldjsKKworCWlmIChoZHItPmNvbnRyb2wgIT0gRlJBRF9JX1VJKQorCXsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogSW52YWxpZCBoZWFkZXIgZmxhZyAweCUwMlguXG4iLCBkZXYtPm5hbWUsIGhkci0+Y29udHJvbCk7CisJCWRscC0+c3RhdHMucnhfZXJyb3JzKys7CisJfQorCWVsc2UKKwkJc3dpdGNoKGhkci0+SVBfTkxQSUQpCisJCXsKKwkJCWNhc2UgRlJBRF9QX1BBRERJTkc6CisJCQkJaWYgKGhkci0+TkxQSUQgIT0gRlJBRF9QX1NOQVApCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBVbnN1cHBvcnRlZCBOTFBJRCAweCUwMlguXG4iLCBkZXYtPm5hbWUsIGhkci0+TkxQSUQpOworCQkJCQlkbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCQlicmVhazsKKwkJCQl9CisJIAorCQkJCWlmIChoZHItPk9VSVswXSArIGhkci0+T1VJWzFdICsgaGRyLT5PVUlbMl0gIT0gMCkKKwkJCQl7CisJCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFVuc3VwcG9ydGVkIG9yZ2FuaXphdGlvbmFsbHkgdW5pcXVlIGlkZW50aWZpZXIgMHglMDJYLSUwMlgtJTAyWC5cbiIsIGRldi0+bmFtZSwgaGRyLT5PVUlbMF0sIGhkci0+T1VJWzFdLCBoZHItPk9VSVsyXSk7CisJCQkJCWRscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qIGF0IHRoaXMgcG9pbnQsIGl0J3MgYW4gRXRoZXJUeXBlIGZyYW1lICovCisJCQkJaGVhZGVyID0gc2l6ZW9mKHN0cnVjdCBmcmhkcik7CisJCQkJLyogQWxyZWFkeSBpbiBuZXR3b3JrIG9yZGVyICEgKi8KKwkJCQlza2ItPnByb3RvY29sID0gaGRyLT5QSUQ7CisJCQkJcHJvY2VzcyA9IDE7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRlJBRF9QX0lQOgorCQkJCWhlYWRlciA9IHNpemVvZihoZHItPmNvbnRyb2wpICsgc2l6ZW9mKGhkci0+SVBfTkxQSUQpOworCQkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisJCQkJcHJvY2VzcyA9IDE7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRlJBRF9QX1NOQVA6CisJCQljYXNlIEZSQURfUF9ROTMzOgorCQkJY2FzZSBGUkFEX1BfQ0xOUDoKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBVbnN1cHBvcnRlZCBOTFBJRCAweCUwMlguXG4iLCBkZXYtPm5hbWUsIGhkci0+cGFkKTsKKwkJCQlkbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IEludmFsaWQgcGFkIGJ5dGUgMHglMDJYLlxuIiwgZGV2LT5uYW1lLCBoZHItPnBhZCk7CisJCQkJZGxwLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQlicmVhazsJCQkJCisJCX0KKworCWlmIChwcm9jZXNzKQorCXsKKwkJLyogd2UndmUgc2V0IHVwIHRoZSBwcm90b2NvbCwgc28gZGlzY2FyZCB0aGUgaGVhZGVyICovCisJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsgCisJCXNrYl9wdWxsKHNrYiwgaGVhZGVyKTsKKwkJZGxwLT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJbmV0aWZfcngoc2tiKTsKKwkJZGxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJfQorCWVsc2UKKwkJZGV2X2tmcmVlX3NrYihza2IpOworfQorCitzdGF0aWMgaW50IGRsY2lfdHJhbnNtaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGxjaV9sb2NhbCAqZGxwOworCWludAkJCQkJcmV0OworCisJcmV0ID0gMDsKKworCWlmICghc2tiIHx8ICFkZXYpCisJCXJldHVybigwKTsKKworCWRscCA9IGRldi0+cHJpdjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwlyZXQgPSBkbHAtPnNsYXZlLT5oYXJkX3N0YXJ0X3htaXQoc2tiLCBkbHAtPnNsYXZlKTsKKwlzd2l0Y2ggKHJldCkKKwl7CisJCWNhc2UgRExDSV9SRVRfT0s6CisJCQlkbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJCWNhc2UgRExDSV9SRVRfRVJSOgorCQkJZGxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJCWNhc2UgRExDSV9SRVRfRFJPUDoKKwkJCWRscC0+c3RhdHMudHhfZHJvcHBlZCsrOworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCX0KKwkvKiBBbGFuIENveCByZWNvbW1lbmRzIGFsd2F5cyByZXR1cm5pbmcgMCwgYW5kIGFsd2F5cyBmcmVlaW5nIHRoZSBwYWNrZXQgKi8KKwkvKiBleHBlcmllbmNlIHN1Z2dlc3QgYSBzbGlnaHRseSBtb3JlIGNvbnNlcnZhdGl2ZSBhcHByb2FjaCAqLworCisJaWYgKCFyZXQpCisJeworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisJcmV0dXJuKHJldCk7Cit9CisKK3N0YXRpYyBpbnQgZGxjaV9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGRsY2lfY29uZiBfX3VzZXIgKmNvbmYsIGludCBnZXQpCit7CisJc3RydWN0IGRsY2lfY29uZgljb25maWc7CisJc3RydWN0IGRsY2lfbG9jYWwJKmRscDsKKwlzdHJ1Y3QgZnJhZF9sb2NhbAkqZmxwOworCWludAkJCWVycjsKKworCWRscCA9IGRldi0+cHJpdjsKKworCWZscCA9IGRscC0+c2xhdmUtPnByaXY7CisKKwlpZiAoIWdldCkKKwl7CisJCWlmKGNvcHlfZnJvbV91c2VyKCZjb25maWcsIGNvbmYsIHNpemVvZihzdHJ1Y3QgZGxjaV9jb25mKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGNvbmZpZy5mbGFncyAmIH5ETENJX1ZBTElEX0ZMQUdTKQorCQkJcmV0dXJuKC1FSU5WQUwpOworCQltZW1jcHkoJmRscC0+Y29uZmlnLCAmY29uZmlnLCBzaXplb2Yoc3RydWN0IGRsY2lfY29uZikpOworCQlkbHAtPmNvbmZpZ3VyZWQgPSAxOworCX0KKworCWVyciA9ICgqZmxwLT5kbGNpX2NvbmYpKGRscC0+c2xhdmUsIGRldiwgZ2V0KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4oZXJyKTsKKworCWlmIChnZXQpCisJeworCQlpZihjb3B5X3RvX3VzZXIoY29uZiwgJmRscC0+Y29uZmlnLCBzaXplb2Yoc3RydWN0IGRsY2lfY29uZikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IGRsY2lfZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCXN0cnVjdCBkbGNpX2xvY2FsICpkbHA7CisKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybigtRVBFUk0pOworCisJZGxwID0gZGV2LT5wcml2OworCisJc3dpdGNoKGNtZCkKKwl7CisJCWNhc2UgRExDSV9HRVRfU0xBVkU6CisJCQlpZiAoISooc2hvcnQgKikoZGV2LT5kZXZfYWRkcikpCisJCQkJcmV0dXJuKC1FSU5WQUwpOworCisJCQlzdHJuY3B5KGlmci0+aWZyX3NsYXZlLCBkbHAtPnNsYXZlLT5uYW1lLCBzaXplb2YoaWZyLT5pZnJfc2xhdmUpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRExDSV9HRVRfQ09ORjoKKwkJY2FzZSBETENJX1NFVF9DT05GOgorCQkJaWYgKCEqKHNob3J0ICopKGRldi0+ZGV2X2FkZHIpKQorCQkJCXJldHVybigtRUlOVkFMKTsKKworCQkJcmV0dXJuKGRsY2lfY29uZmlnKGRldiwgaWZyLT5pZnJfZGF0YSwgY21kID09IERMQ0lfR0VUX0NPTkYpKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6IAorCQkJcmV0dXJuKC1FT1BOT1RTVVBQKTsKKwl9CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IGRsY2lfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlzdHJ1Y3QgZGxjaV9sb2NhbCAqZGxwOworCisJZGxwID0gZGV2LT5wcml2OworCisJcmV0dXJuKCgqZGxwLT5zbGF2ZS0+Y2hhbmdlX210dSkoZGxwLT5zbGF2ZSwgbmV3X210dSkpOworfQorCitzdGF0aWMgaW50IGRsY2lfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkbGNpX2xvY2FsCSpkbHA7CisJc3RydWN0IGZyYWRfbG9jYWwJKmZscDsKKwlpbnQJCQllcnI7CisKKwlkbHAgPSBkZXYtPnByaXY7CisKKwlpZiAoISooc2hvcnQgKikoZGV2LT5kZXZfYWRkcikpCisJCXJldHVybigtRUlOVkFMKTsKKworCWlmICghbmV0aWZfcnVubmluZyhkbHAtPnNsYXZlKSkKKwkJcmV0dXJuKC1FTk9UQ09OTik7CisKKwlmbHAgPSBkbHAtPnNsYXZlLT5wcml2OworCWVyciA9ICgqZmxwLT5hY3RpdmF0ZSkoZGxwLT5zbGF2ZSwgZGV2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4oZXJyKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbGNpX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRsY2lfbG9jYWwJKmRscDsKKwlzdHJ1Y3QgZnJhZF9sb2NhbAkqZmxwOworCWludAkJCWVycjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWRscCA9IGRldi0+cHJpdjsKKworCWZscCA9IGRscC0+c2xhdmUtPnByaXY7CisJZXJyID0gKCpmbHAtPmRlYWN0aXZhdGUpKGRscC0+c2xhdmUsIGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpkbGNpX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkbGNpX2xvY2FsICpkbHA7CisKKwlkbHAgPSBkZXYtPnByaXY7CisKKwlyZXR1cm4oJmRscC0+c3RhdHMpOworfQorCitzdGF0aWMgaW50IGRsY2lfYWRkKHN0cnVjdCBkbGNpX2FkZCAqZGxjaSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZQkqbWFzdGVyLCAqc2xhdmU7CisJc3RydWN0IGRsY2lfbG9jYWwJKmRscDsKKwlzdHJ1Y3QgZnJhZF9sb2NhbAkqZmxwOworCWludAkJCWVyciA9IC1FSU5WQUw7CisKKworCS8qIHZhbGlkYXRlIHNsYXZlIGRldmljZSAqLworCXNsYXZlID0gZGV2X2dldF9ieV9uYW1lKGRsY2ktPmRldm5hbWUpOworCWlmICghc2xhdmUpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHNsYXZlLT50eXBlICE9IEFSUEhSRF9GUkFEIHx8IHNsYXZlLT5wcml2ID09IE5VTEwpCisJCWdvdG8gZXJyMTsKKworCS8qIGNyZWF0ZSBkZXZpY2UgbmFtZSAqLworCW1hc3RlciA9IGFsbG9jX25ldGRldiggc2l6ZW9mKHN0cnVjdCBkbGNpX2xvY2FsKSwgImRsY2klZCIsCisJCQkgICAgICBkbGNpX3NldHVwKTsKKwlpZiAoIW1hc3RlcikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycjE7CisJfQorCisJLyogbWFrZSBzdXJlIHNhbWUgc2xhdmUgbm90IGFscmVhZHkgcmVnaXN0ZXJlZCAqLworCXJ0bmxfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGxwLCAmZGxjaV9kZXZzLCBsaXN0KSB7CisJCWlmIChkbHAtPnNsYXZlID09IHNsYXZlKSB7CisJCQllcnIgPSAtRUJVU1k7CisJCQlnb3RvIGVycjI7CisJCX0KKwl9CisKKwllcnIgPSBkZXZfYWxsb2NfbmFtZShtYXN0ZXIsIG1hc3Rlci0+bmFtZSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyMjsKKworCSooc2hvcnQgKikobWFzdGVyLT5kZXZfYWRkcikgPSBkbGNpLT5kbGNpOworCisJZGxwID0gKHN0cnVjdCBkbGNpX2xvY2FsICopIG1hc3Rlci0+cHJpdjsKKwlkbHAtPnNsYXZlID0gc2xhdmU7CisJZGxwLT5tYXN0ZXIgPSBtYXN0ZXI7CisKKwlmbHAgPSBzbGF2ZS0+cHJpdjsKKwllcnIgPSAoKmZscC0+YXNzb2MpKHNsYXZlLCBtYXN0ZXIpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycjI7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXZpY2UobWFzdGVyKTsKKwlpZiAoZXJyIDwgMCkgCisJCWdvdG8gZXJyMjsKKworCXN0cmNweShkbGNpLT5kZXZuYW1lLCBtYXN0ZXItPm5hbWUpOworCisJbGlzdF9hZGQoJmRscC0+bGlzdCwgJmRsY2lfZGV2cyk7CisJcnRubF91bmxvY2soKTsKKworCXJldHVybigwKTsKKworIGVycjI6CisJcnRubF91bmxvY2soKTsKKwlmcmVlX25ldGRldihtYXN0ZXIpOworIGVycjE6CisJZGV2X3B1dChzbGF2ZSk7CisJcmV0dXJuKGVycik7Cit9CisKK3N0YXRpYyBpbnQgZGxjaV9kZWwoc3RydWN0IGRsY2lfYWRkICpkbGNpKQoreworCXN0cnVjdCBkbGNpX2xvY2FsCSpkbHA7CisJc3RydWN0IGZyYWRfbG9jYWwJKmZscDsKKwlzdHJ1Y3QgbmV0X2RldmljZQkqbWFzdGVyLCAqc2xhdmU7CisJaW50CQkJZXJyOworCisJLyogdmFsaWRhdGUgc2xhdmUgZGV2aWNlICovCisJbWFzdGVyID0gX19kZXZfZ2V0X2J5X25hbWUoZGxjaS0+ZGV2bmFtZSk7CisJaWYgKCFtYXN0ZXIpCisJCXJldHVybigtRU5PREVWKTsKKworCWlmIChuZXRpZl9ydW5uaW5nKG1hc3RlcikpIHsKKwkJcmV0dXJuKC1FQlVTWSk7CisJfQorCisJZGxwID0gbWFzdGVyLT5wcml2OworCXNsYXZlID0gZGxwLT5zbGF2ZTsKKwlmbHAgPSBzbGF2ZS0+cHJpdjsKKworCXJ0bmxfbG9jaygpOworCWVyciA9ICgqZmxwLT5kZWFzc29jKShzbGF2ZSwgbWFzdGVyKTsKKwlpZiAoIWVycikgeworCQlsaXN0X2RlbCgmZGxwLT5saXN0KTsKKworCQl1bnJlZ2lzdGVyX25ldGRldmljZShtYXN0ZXIpOworCisJCWRldl9wdXQoc2xhdmUpOworCX0KKwlydG5sX3VubG9jaygpOworCisJcmV0dXJuKGVycik7Cit9CisKK3N0YXRpYyBpbnQgZGxjaV9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBkbGNpX2FkZCBhZGQ7CisJaW50IGVycjsKKwkKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybigtRVBFUk0pOworCisJaWYoY29weV9mcm9tX3VzZXIoJmFkZCwgYXJnLCBzaXplb2Yoc3RydWN0IGRsY2lfYWRkKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3dpdGNoIChjbWQpCisJeworCQljYXNlIFNJT0NBRERETENJOgorCQkJZXJyID0gZGxjaV9hZGQoJmFkZCk7CisKKwkJCWlmICghZXJyKQorCQkJCWlmKGNvcHlfdG9fdXNlcihhcmcsICZhZGQsIHNpemVvZihzdHJ1Y3QgZGxjaV9hZGQpKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKworCQljYXNlIFNJT0NERUxETENJOgorCQkJZXJyID0gZGxjaV9kZWwoJmFkZCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZXJyID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4oZXJyKTsKK30KKworc3RhdGljIHZvaWQgZGxjaV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkbGNpX2xvY2FsICpkbHAgPSBkZXYtPnByaXY7CisKKwlkZXYtPmZsYWdzCQk9IDA7CisJZGV2LT5vcGVuCQk9IGRsY2lfb3BlbjsKKwlkZXYtPnN0b3AJCT0gZGxjaV9jbG9zZTsKKwlkZXYtPmRvX2lvY3RsCQk9IGRsY2lfZGV2X2lvY3RsOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gZGxjaV90cmFuc21pdDsKKwlkZXYtPmhhcmRfaGVhZGVyCT0gZGxjaV9oZWFkZXI7CisJZGV2LT5nZXRfc3RhdHMJCT0gZGxjaV9nZXRfc3RhdHM7CisJZGV2LT5jaGFuZ2VfbXR1CQk9IGRsY2lfY2hhbmdlX210dTsKKwlkZXYtPmRlc3RydWN0b3IJCT0gZnJlZV9uZXRkZXY7CisKKwlkbHAtPnJlY2VpdmUJCT0gZGxjaV9yZWNlaXZlOworCisJZGV2LT50eXBlCQk9IEFSUEhSRF9ETENJOworCWRldi0+aGFyZF9oZWFkZXJfbGVuCT0gc2l6ZW9mKHN0cnVjdCBmcmhkcik7CisJZGV2LT5hZGRyX2xlbgkJPSBzaXplb2Yoc2hvcnQpOworCit9CisKKy8qIGlmIHNsYXZlIGlzIHVucmVnaXN0ZXJpbmcsIHRoZW4gY2xlYW51cCBtYXN0ZXIgKi8KK3N0YXRpYyBpbnQgZGxjaV9kZXZfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp1bnVzZWQsCisJCQkgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIHB0cjsKKworCWlmIChldmVudCA9PSBORVRERVZfVU5SRUdJU1RFUikgeworCQlzdHJ1Y3QgZGxjaV9sb2NhbCAqZGxwOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGxwLCAmZGxjaV9kZXZzLCBsaXN0KSB7CisJCQlpZiAoZGxwLT5zbGF2ZSA9PSBkZXYpIHsKKwkJCQlsaXN0X2RlbCgmZGxwLT5saXN0KTsKKwkJCQl1bnJlZ2lzdGVyX25ldGRldmljZShkbHAtPm1hc3Rlcik7CisJCQkJZGV2X3B1dChkbHAtPnNsYXZlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZGxjaV9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGRsY2lfZGV2X2V2ZW50LAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9kbGNpKHZvaWQpCit7CisJZGxjaV9pb2N0bF9zZXQoZGxjaV9pb2N0bCk7CisJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZkbGNpX25vdGlmaWVyKTsKKworCXByaW50aygiJXMuXG4iLCB2ZXJzaW9uKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZGxjaV9leGl0KHZvaWQpCit7CisJc3RydWN0IGRsY2lfbG9jYWwJKmRscCwgKm54dDsKKwkKKwlkbGNpX2lvY3RsX3NldChOVUxMKTsKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmZGxjaV9ub3RpZmllcik7CisKKwlydG5sX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGxwLCBueHQsICZkbGNpX2RldnMsIGxpc3QpIHsKKwkJdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGxwLT5tYXN0ZXIpOworCQlkZXZfcHV0KGRscC0+c2xhdmUpOworCX0KKwlydG5sX3VubG9jaygpOworfQorCittb2R1bGVfaW5pdChpbml0X2RsY2kpOworbW9kdWxlX2V4aXQoZGxjaV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWlrZSBNY0xhZ2FuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZyYW1lIFJlbGF5IERMQ0kgbGF5ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9kc2NjNC5jIGIvZHJpdmVycy9uZXQvd2FuL2RzY2M0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwYTc3YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9kc2NjNC5jCkBAIC0wLDAgKzEsMjA3NCBAQAorLyoKKyAqIGRyaXZlcnMvbmV0L3dhbi9kc2NjNC9kc2NjNC5jOiBhIERTQ0M0IEhETEMgZHJpdmVyIGZvciBMaW51eAorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIHJvbWlldUBjb2dlbml0LmZyLgorICogU3BlY2lmaWMgYnVnIHJlcG9ydHMvYXNpYW4gZm9vZCB3aWxsIGJlIHdlbGNvbWUuCisgKgorICogU3BlY2lhbCB0aGFua3MgdG8gdGhlIG5pY2UgcGVvcGxlIGF0IENTLVRlbGVjb20gZm9yIHRoZSBoYXJkd2FyZSBhbmQgdGhlCisgKiBhY2Nlc3MgdG8gdGhlIHRlc3QvbWVhc3VyZSB0b29scy4KKyAqCisgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZW9yeSBvZiBPcGVyYXRpb24KKyAqCisgKiBJLiBCb2FyZCBDb21wYXRpYmlsaXR5CisgKgorICogVGhpcyBkZXZpY2UgZHJpdmVyIGlzIGRlc2lnbmVkIGZvciB0aGUgU2llbWVucyBQRUIyMDUzNCA0IHBvcnRzIHNlcmlhbAorICogY29udHJvbGxlciBhcyBmb3VuZCBvbiBFdGluYyBQQ0lTWU5DIGNhcmRzLiBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlCisgKiBjaGlwc2V0IGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmluZmluZW9uLmNvbToKKyAqIC0gRGF0YSBTaGVldCAiRFNDQzQsIERNQSBTdXBwb3J0ZWQgU2VyaWFsIENvbW11bmljYXRpb24gQ29udHJvbGxlciB3aXRoCisgKiA0IENoYW5uZWxzLCBQRUIgMjA1MzQgVmVyc2lvbiAyLjEsIFBFRiAyMDUzNCBWZXJzaW9uIDIuMSI7CisgKiAtIEFwcGxpY2F0aW9uIEhpbnQgIk1hbmFnZW1lbnQgb2YgRFNDQzQgb24tY2hpcCBGSUZPIHJlc291cmNlcyIuCisgKiAtIEVycmF0YSBzaGVldCBEUzUgKGNvdXJ0ZXN5IG9mIE1pY2hhZWwgU2tlcnJpdHQpLgorICogSmVucyBEYXZpZCBoYXMgYnVpbHQgYW4gYWRhcHRlciBiYXNlZCBvbiB0aGUgc2FtZSBjaGlwc2V0LiBUYWtlIGEgbG9vaworICogYXQgaHR0cDovL3d3dy5hZnRoZC50dS1kYXJtc3RhZHQuZGUvfmRnMWtqZC9wY2lzY2M0IGZvciBhIHNwZWNpZmljCisgKiBkcml2ZXIuCisgKiBTYW1wbGUgY29kZSAoMiByZXZpc2lvbnMpIGlzIGF2YWlsYWJsZSBhdCBJbmZpbmVvbi4KKyAqCisgKiBJSS4gQm9hcmQtc3BlY2lmaWMgc2V0dGluZ3MKKyAqCisgKiBQY2lzeW5jIGNhbiB0cmFuc21pdCBzb21lIGNsb2NrIHNpZ25hbCB0byB0aGUgb3V0c2lkZSB3b3JsZCBvbiB0aGUKKyAqICpmaXJzdCB0d28qIHBvcnRzIHByb3ZpZGVkIHlvdSBwdXQgYSBxdWFydHogYW5kIGEgbGluZSBkcml2ZXIgb24gaXQgYW5kCisgKiByZW1vdmUgdGhlIGp1bXBlcnMuIFRoZSBvcGVyYXRpb24gaXMgZGVzY3JpYmVkIG9uIEV0aW5jIHdlYiBzaXRlLiBJZiB5b3UKKyAqIGdvIERDRSBvbiB0aGVzZSBwb3J0cywgZG9uJ3QgZm9yZ2V0IHRvIHVzZSBhbiBhZGVxdWF0ZSBjYWJsZS4KKyAqCisgKiBTaGFyaW5nIG9mIHRoZSBQQ0kgaW50ZXJydXB0IGxpbmUgZm9yIHRoaXMgYm9hcmQgaXMgcG9zc2libGUuCisgKgorICogSUlJLiBEcml2ZXIgb3BlcmF0aW9uCisgKgorICogVGhlIHJ4L3R4IG9wZXJhdGlvbnMgYXJlIGJhc2VkIG9uIGEgbGlua2VkIGxpc3Qgb2YgZGVzY3JpcHRvcnMuIFRoZSBkcml2ZXIKKyAqIGRvZXNuJ3QgdXNlIEhPTEQgbW9kZSBhbnkgbW9yZS4gSE9MRCBtb2RlIGlzIGRlZmluaXRlbHkgYnVnZ3kgYW5kIHRoZSBtb3JlCisgKiBJIHRyaWVkIHRvIGZpeCBpdCwgdGhlIG1vcmUgaXQgc3RhcnRlZCB0byBsb29rIGxpa2UgKGNvbnZvbHV0ZWQpIHNvZnR3YXJlCisgKiBtdXRhdGlvbiBvZiBMeERBIG1ldGhvZC4gRXJyYXRhIHNoZWV0IERTNSBzdWdnZXN0cyB0byB1c2UgTHhEQTogY29uc2lkZXIKKyAqIHRoaXMgYSByZmMyMTE5IE1VU1QuCisgKgorICogVHggZGlyZWN0aW9uCisgKiBXaGVuIHRoZSB0eCByaW5nIGlzIGZ1bGwsIHRoZSB4bWl0IHJvdXRpbmUgaXNzdWVzIGEgY2FsbCB0byBuZXRkZXZfc3RvcC4KKyAqIFRoZSBkZXZpY2UgaXMgc3VwcG9zZWQgdG8gYmUgZW5hYmxlZCBhZ2FpbiBkdXJpbmcgYW4gQUxMUyBpcnEgKHdlIGNvdWxkCisgKiB1c2UgSEkgYnV0IGFzIGl0J3MgZWFzeSB0byBsb3NlIGV2ZW50cywgaXQncyBmc2NrZWQpLgorICoKKyAqIFJ4IGRpcmVjdGlvbgorICogVGhlIHJlY2VpdmVkIGZyYW1lcyBhcmVuJ3Qgc3VwcG9zZWQgdG8gc3BhbiBvdmVyIG11bHRpcGxlIHJlY2VpdmluZyBhcmVhcy4KKyAqIEkgbWF5IGltcGxlbWVudCBpdCBzb21lIGRheSBidXQgaXQgaXNuJ3QgdGhlIGhpZ2hlc3QgcmFua2VkIGl0ZW0uCisgKgorICogSVYuIE5vdGVzCisgKiBUaGUgY3VycmVudCBlcnJvciAoWERVLCBSRk8pIHJlY292ZXJ5IGNvZGUgaXMgdW50ZXN0ZWQuCisgKiBTbyBmYXIsIFJETyB0YWtlcyBoaXMgUlggY2hhbm5lbCBkb3duIGFuZCB0aGUgcmlnaHQgc2VxdWVuY2UgdG8gZW5hYmxlIGl0CisgKiBhZ2FpbiBpcyBzdGlsbCBhIG1pc3RlcnkuIElmIFJETyBoYXBwZW5zLCBwbGFuIGEgcmVib290LiBNb3JlIGRldGFpbHMKKyAqIGluIHRoZSBjb2RlIChOQjogYXMgdGhpcyBoYXBwZW5zLCBUWCBzdGlsbCB3b3JrcykuCisgKiBEb24ndCBtZXNzIHRoZSBjYWJsZXMgZHVyaW5nIG9wZXJhdGlvbiwgZXNwZWNpYWxseSBvbiBEVEUgcG9ydHMuIEkgZG9uJ3QKKyAqIHN1Z2dlc3QgaXQgZm9yIERDRSBlaXRoZXIgYnV0IGF0IGxlYXN0IG9uZSBjYW4gZ2V0IHNvbWUgbWVzc2FnZXMgaW5zdGVhZAorICogb2YgYSBjb21wbGV0ZSBpbnN0YW50IGZyZWV6ZS4KKyAqIFRlc3RzIGFyZSBkb25lIG9uIFJldi4gMjAgb2YgdGhlIHNpbGljaXVtLiBUaGUgUkRPIGhhbmRsaW5nIGNoYW5nZXMgd2l0aAorICogdGhlIGRvY3VtZW50YXRpb24vY2hpcHNldCByZWxlYXNlcy4KKyAqCisgKiBUT0RPOgorICogLSB0ZXN0IFgyNS4KKyAqIC0gdXNlIHBvbGxpbmcgYXQgaGlnaCBpcnEvcywKKyAqIC0gcGVyZm9ybWFuY2UgYW5hbHlzaXMsCisgKiAtIGVuZGlhbm5lc3MuCisgKgorICogMjAwMS8xMi8xMAlEYW5pZWxhIFNxdWFzc29uaSAgPGRhbmllbGFAY3ljbGFkZXMuY29tPgorICogLSBDb250cmlidXRpb24gdG8gc3VwcG9ydCB0aGUgbmV3IGdlbmVyaWMgSERMQyBsYXllci4KKyAqCisgKiAyMDAyLzAxCVVlaW1vcgorICogLSBvbGQgc3R5bGUgaW50ZXJmYWNlIHJlbW92YWwKKyAqIC0gZHNjYzRfcmVsZWFzZV9yaW5nIGZpeCAocmVsYXRlZCB0byBETUEgbWFwcGluZykKKyAqIC0gaGFyZF9zdGFydF94bWl0IGZpeCAoaGludDogVHhTaXplTWF4KQorICogLSBtaXNjIGNyYXBlY3RvbXkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPG5ldC9zeW5jcHBwLmg+CisjaW5jbHVkZSA8bGludXgvaGRsYy5oPgorCisvKiBWZXJzaW9uICovCitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uW10gPSAiJElkOiBkc2NjNC5jLHYgMS4xNzMgMjAwMy8wOS8yMCAyMzo1NTozNCByb21pZXUgRXhwICQgZm9yIExpbnV4XG4iOworc3RhdGljIGludCBkZWJ1ZzsKK3N0YXRpYyBpbnQgcXVhcnR6OworCisjaWZkZWYgQ09ORklHX0RTQ0M0X1BDSV9SU1QKK3N0YXRpYyBERUNMQVJFX01VVEVYKGRzY2M0X3NlbSk7CitzdGF0aWMgdTMyIGRzY2M0X3BjaV9jb25maWdfc3RvcmVbMTZdOworI2VuZGlmCisKKyNkZWZpbmUJRFJWX05BTUUJImRzY2M0IgorCisjdW5kZWYgRFNDQzRfUE9MTElORworCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworCitNT0RVTEVfQVVUSE9SKCJNYWludGFpbmVyOiBGcmFuY29pcyBSb21pZXUgPHJvbWlldUBjb2dlbml0LmZyPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTaWVtZW5zIFBFQjIwNTM0IFBDSSBDb250cm9sZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsIkVuYWJsZS9kaXNhYmxlIGV4dHJhIG1lc3NhZ2VzIik7Cittb2R1bGVfcGFyYW0ocXVhcnR6LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhxdWFydHosIklmIHByZXNlbnQsIG9uLWJvYXJkIHF1YXJ0eiBmcmVxdWVuY3kgKEh6KSIpOworCisvKiBTdHJ1Y3R1cmVzICovCisKK3N0cnVjdCB0aGluZ2llIHsKKwlpbnQgZGVmaW5lOworCXUzMiBiaXRzOworfTsKKworc3RydWN0IFR4RkQgeworCXUzMiBzdGF0ZTsKKwl1MzIgbmV4dDsKKwl1MzIgZGF0YTsKKwl1MzIgY29tcGxldGU7CisJdTMyIGppZmZpZXM7IC8qIEFsbG93cyBzaXplb2YoVHhGRCkgPT0gc2l6ZW9mKFJ4RkQpICsgZXh0cmEgaGFjayAqLworfTsKKworc3RydWN0IFJ4RkQgeworCXUzMiBzdGF0ZTE7CisJdTMyIG5leHQ7CisJdTMyIGRhdGE7CisJdTMyIHN0YXRlMjsKKwl1MzIgZW5kOworfTsKKworI2RlZmluZSBEVU1NWV9TS0JfU0laRQkJNjQKKyNkZWZpbmUgVFhfTE9XCQkJOAorI2RlZmluZSBUWF9SSU5HX1NJWkUJCTMyCisjZGVmaW5lIFJYX1JJTkdfU0laRQkJMzIKKyNkZWZpbmUgVFhfVE9UQUxfU0laRQkJVFhfUklOR19TSVpFKnNpemVvZihzdHJ1Y3QgVHhGRCkKKyNkZWZpbmUgUlhfVE9UQUxfU0laRQkJUlhfUklOR19TSVpFKnNpemVvZihzdHJ1Y3QgUnhGRCkKKyNkZWZpbmUgSVJRX1JJTkdfU0laRQkJNjQJCS8qIEtlZXAgaXQgYSBtdWx0aXBsZSBvZiAzMiAqLworI2RlZmluZSBUWF9USU1FT1VUCQkoSFovMTApCisjZGVmaW5lIERTQ0M0X0haX01BWAkJMzMwMDAwMDAKKyNkZWZpbmUgQlJSX0RJVklERVJfTUFYCQk2NCoweDAwMDA0MDAwCS8qIENmIGVycmF0YSBEUzUgcC4xMCAqLworI2RlZmluZSBkZXZfcGVyX2NhcmQJCTQKKyNkZWZpbmUgU0NDX1JFR0lTVEVSU19NQVgJMjMJCS8qIENmIGVycmF0YSBEUzUgcC40ICovCisKKyNkZWZpbmUgU09VUkNFX0lEKGZsYWdzKQkoKChmbGFncykgPj4gMjgpICYgMHgwMykKKyNkZWZpbmUgVE9fU0laRShzdGF0ZSkJCSgoKHN0YXRlKSA+PiAxNikgJiAweDFmZmYpCisKKy8qCisgKiBHaXZlbiB0aGUgb3BlcmF0aW5nIHJhbmdlIG9mIExpbnV4IEhETEMsIHRoZSAyIGRlZmluZXMgYmVsb3cgY291bGQgYmUKKyAqIG1hZGUgc2ltcGxlci4gSG93ZXZlciB0aGV5IGFyZSBhIGZpbmUgcmVtaW5kZXIgZm9yIHRoZSBsaW1pdGF0aW9ucyBvZgorICogdGhlIGRyaXZlcjogaXQncyBiZXR0ZXIgdG8gc3RheSA8IFR4U2l6ZU1heCBhbmQgPCBSeFNpemVNYXguCisgKi8KKyNkZWZpbmUgVE9fU1RBVEVfVFgobGVuKQljcHVfdG9fbGUzMigoKGxlbikgJiBUeFNpemVNYXgpIDw8IDE2KQorI2RlZmluZSBUT19TVEFURV9SWChsZW4pCWNwdV90b19sZTMyKChSWF9NQVgobGVuKSAlIFJ4U2l6ZU1heCkgPDwgMTYpCisjZGVmaW5lIFJYX01BWChsZW4pCQkoKCgobGVuKSA+PiA1KSArIDEpIDw8IDUpCS8qIENmIFJMQ1IgKi8KKyNkZWZpbmUgU0NDX1JFR19TVEFSVChkcHJpdikJKFNDQ19TVEFSVCsoZHByaXYtPmRldl9pZCkqU0NDX09GRlNFVCkKKworc3RydWN0IGRzY2M0X3BjaV9wcml2IHsKKyAgICAgICAgdTMyICppcWNmZzsKKyAgICAgICAgaW50IGNmZ19jdXI7CisgICAgICAgIHNwaW5sb2NrX3QgbG9jazsKKyAgICAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXY7CisKKyAgICAgICAgc3RydWN0IGRzY2M0X2Rldl9wcml2ICpyb290OworICAgICAgICBkbWFfYWRkcl90IGlxY2ZnX2RtYTsKKwl1MzIgeHRhbF9oejsKK307CisKK3N0cnVjdCBkc2NjNF9kZXZfcHJpdiB7CisgICAgICAgIHN0cnVjdCBza19idWZmICpyeF9za2J1ZmZbUlhfUklOR19TSVpFXTsKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnR4X3NrYnVmZltUWF9SSU5HX1NJWkVdOworCisgICAgICAgIHN0cnVjdCBSeEZEICpyeF9mZDsKKyAgICAgICAgc3RydWN0IFR4RkQgKnR4X2ZkOworICAgICAgICB1MzIgKmlxcng7CisgICAgICAgIHUzMiAqaXF0eDsKKworCS8qIEZJWE1FOiBjaGVjayBhbGwgdGhlIHZvbGF0aWxlIGFyZSByZXF1aXJlZCAqLworICAgICAgICB2b2xhdGlsZSB1MzIgdHhfY3VycmVudDsKKyAgICAgICAgdTMyIHJ4X2N1cnJlbnQ7CisgICAgICAgIHUzMiBpcXR4X2N1cnJlbnQ7CisgICAgICAgIHUzMiBpcXJ4X2N1cnJlbnQ7CisKKyAgICAgICAgdm9sYXRpbGUgdTMyIHR4X2RpcnR5OworICAgICAgICB2b2xhdGlsZSB1MzIgbHRkYTsKKyAgICAgICAgdTMyIHJ4X2RpcnR5OworICAgICAgICB1MzIgbHJkYTsKKworICAgICAgICBkbWFfYWRkcl90IHR4X2ZkX2RtYTsKKyAgICAgICAgZG1hX2FkZHJfdCByeF9mZF9kbWE7CisgICAgICAgIGRtYV9hZGRyX3QgaXF0eF9kbWE7CisgICAgICAgIGRtYV9hZGRyX3QgaXFyeF9kbWE7CisKKwl1MzIgc2NjX3JlZ3NbU0NDX1JFR0lTVEVSU19NQVhdOyAvKiBDZiBlcnJhdGEgRFM1IHAuNCAqLworCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisKKyAgICAgICAgc3RydWN0IGRzY2M0X3BjaV9wcml2ICpwY2lfcHJpdjsKKyAgICAgICAgc3BpbmxvY2tfdCBsb2NrOworCisgICAgICAgIGludCBkZXZfaWQ7CisJdm9sYXRpbGUgdTMyIGZsYWdzOworCXUzMiB0aW1lcl9oZWxwOworCisJdW5zaWduZWQgc2hvcnQgZW5jb2Rpbmc7CisJdW5zaWduZWQgc2hvcnQgcGFyaXR5OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3luY19zZXJpYWxfc2V0dGluZ3Mgc2V0dGluZ3M7CisJdm9pZCBfX2lvbWVtICpiYXNlX2FkZHI7CisJdTMyIF9fcGFkIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg0KSkpOworfTsKKworLyogR0xPQkFMIHJlZ2lzdGVycyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBHQ01EUiAgIDB4MDAKKyNkZWZpbmUgR1NUQVIgICAweDA0CisjZGVmaW5lIEdNT0RFICAgMHgwOAorI2RlZmluZSBJUUxFTlIwIDB4MEMKKyNkZWZpbmUgSVFMRU5SMSAweDEwCisjZGVmaW5lIElRUlgwICAgMHgxNAorI2RlZmluZSBJUVRYMCAgIDB4MjQKKyNkZWZpbmUgSVFDRkcgICAweDNjCisjZGVmaW5lIEZJRk9DUjEgMHg0NAorI2RlZmluZSBGSUZPQ1IyIDB4NDgKKyNkZWZpbmUgRklGT0NSMyAweDRjCisjZGVmaW5lIEZJRk9DUjQgMHgzNAorI2RlZmluZSBDSDBDRkcgIDB4NTAKKyNkZWZpbmUgQ0gwQlJEQSAweDU0CisjZGVmaW5lIENIMEJUREEgMHg1OAorI2RlZmluZSBDSDBGUkRBIDB4OTgKKyNkZWZpbmUgQ0gwRlREQSAweGIwCisjZGVmaW5lIENIMExSREEgMHhjOAorI2RlZmluZSBDSDBMVERBIDB4ZTAKKworLyogU0NDIHJlZ2lzdGVycyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBTQ0NfU1RBUlQJMHgwMTAwCisjZGVmaW5lIFNDQ19PRkZTRVQgICAgICAweDgwCisjZGVmaW5lIENNRFIgICAgMHgwMAorI2RlZmluZSBTVEFSICAgIDB4MDQKKyNkZWZpbmUgQ0NSMCAgICAweDA4CisjZGVmaW5lIENDUjEgICAgMHgwYworI2RlZmluZSBDQ1IyICAgIDB4MTAKKyNkZWZpbmUgQlJSICAgICAweDJDCisjZGVmaW5lIFJMQ1IgICAgMHg0MAorI2RlZmluZSBJTVIgICAgIDB4NTQKKyNkZWZpbmUgSVNSICAgICAweDU4CisKKyNkZWZpbmUgR1BESVIJMHgwNDAwCisjZGVmaW5lIEdQREFUQQkweDA0MDQKKyNkZWZpbmUgR1BJTQkweDA0MDgKKworLyogQml0IG1hc2tzICovCisjZGVmaW5lIEVuY29kaW5nTWFzawkweDAwNzAwMDAwCisjZGVmaW5lIENyY01hc2sJCTB4MDAwMDAwMDMKKworI2RlZmluZSBJbnRSeFNjYzAJMHgxMDAwMDAwMAorI2RlZmluZSBJbnRUeFNjYzAJMHgwMTAwMDAwMAorCisjZGVmaW5lIFR4UG9sbENtZAkweDAwMDAwNDAwCisjZGVmaW5lIFJ4QWN0aXZhdGUJMHgwODAwMDAwMAorI2RlZmluZSBNVEZpCQkweDA0MDAwMDAwCisjZGVmaW5lIFJkcgkJMHgwMDQwMDAwMAorI2RlZmluZSBSZHQJCTB4MDAyMDAwMDAKKyNkZWZpbmUgSWRyCQkweDAwMTAwMDAwCisjZGVmaW5lIElkdAkJMHgwMDA4MDAwMAorI2RlZmluZSBUeFNjY1JlcwkweDAxMDAwMDAwCisjZGVmaW5lIFJ4U2NjUmVzCTB4MDAwMTAwMDAKKyNkZWZpbmUgVHhTaXplTWF4CTB4MWZmZgkJLyogRGF0YXNoZWV0IERTMSAtIDExLjEuMS4xICovCisjZGVmaW5lIFJ4U2l6ZU1heAkweDFmZmMJCS8qIERhdGFzaGVldCBEUzEgLSAxMS4xLjIuMSAqLworCisjZGVmaW5lIENjcjBDbG9ja01hc2sJMHgwMDAwMDAzZgorI2RlZmluZSBDY3IxTG9vcE1hc2sJMHgwMDAwMDIwMAorI2RlZmluZSBJc3JNYXNrCQkweDAwMGZmZmZmCisjZGVmaW5lIEJyckV4cE1hc2sJMHgwMDAwMGYwMAorI2RlZmluZSBCcnJNdWx0TWFzawkweDAwMDAwMDNmCisjZGVmaW5lIEVuY29kaW5nTWFzawkweDAwNzAwMDAwCisjZGVmaW5lIEhvbGQJCTB4NDAwMDAwMDAKKyNkZWZpbmUgU2NjQnVzeQkJMHgxMDAwMDAwMAorI2RlZmluZSBQb3dlclVwCQkweDgwMDAwMDAwCisjZGVmaW5lIFZpcwkJMHgwMDAwMTAwMAorI2RlZmluZSBGcmFtZU9rCQkoRnJhbWVWZnIgfCBGcmFtZUNyYykKKyNkZWZpbmUgRnJhbWVWZnIJMHg4MAorI2RlZmluZSBGcmFtZVJkbwkweDQwCisjZGVmaW5lIEZyYW1lQ3JjCTB4MjAKKyNkZWZpbmUgRnJhbWVSYWIJMHgxMAorI2RlZmluZSBGcmFtZUFib3J0ZWQJMHgwMDAwMDIwMAorI2RlZmluZSBGcmFtZUVuZAkweDgwMDAwMDAwCisjZGVmaW5lIERhdGFDb21wbGV0ZQkweDQwMDAwMDAwCisjZGVmaW5lIExlbmd0aENoZWNrCTB4MDAwMDgwMDAKKyNkZWZpbmUgU2NjRXZ0CQkweDAyMDAwMDAwCisjZGVmaW5lIE5vQWNrCQkweDAwMDAwMjAwCisjZGVmaW5lIEFjdGlvbgkJMHgwMDAwMDAwMQorI2RlZmluZSBIaURlc2MJCTB4MjAwMDAwMDAKKworLyogU0NDIGV2ZW50cyAqLworI2RlZmluZSBSeEV2dAkJMHhmMDAwMDAwMAorI2RlZmluZSBUeEV2dAkJMHgwZjAwMDAwMAorI2RlZmluZSBBbGxzCQkweDAwMDQwMDAwCisjZGVmaW5lIFhkdQkJMHgwMDAxMDAwMAorI2RlZmluZSBDdHMJCTB4MDAwMDQwMDAKKyNkZWZpbmUgWG1yCQkweDAwMDAyMDAwCisjZGVmaW5lIFhwcgkJMHgwMDAwMTAwMAorI2RlZmluZSBSZG8JCTB4MDAwMDAwODAKKyNkZWZpbmUgUmZzCQkweDAwMDAwMDQwCisjZGVmaW5lIENkCQkweDAwMDAwMDA0CisjZGVmaW5lIFJmbwkJMHgwMDAwMDAwMgorI2RlZmluZSBGbGV4CQkweDAwMDAwMDAxCisKKy8qIERNQSBjb3JlIGV2ZW50cyAqLworI2RlZmluZSBDZmcJCTB4MDAyMDAwMDAKKyNkZWZpbmUgSGkJCTB4MDAwNDAwMDAKKyNkZWZpbmUgRmkJCTB4MDAwMjAwMDAKKyNkZWZpbmUgRXJyCQkweDAwMDEwMDAwCisjZGVmaW5lIEFyZgkJMHgwMDAwMDAwMgorI2RlZmluZSBBckFjawkJMHgwMDAwMDAwMQorCisvKiBTdGF0ZSBmbGFncyAqLworI2RlZmluZSBSZWFkeQkJMHgwMDAwMDAwMAorI2RlZmluZSBOZWVkSURSCQkweDAwMDAwMDAxCisjZGVmaW5lIE5lZWRJRFQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUmRvU2V0CQkweDAwMDAwMDA0CisjZGVmaW5lIEZha2VSZXNldAkweDAwMDAwMDA4CisKKy8qIERvbid0IG1hc2sgUkRPLiBFdmVyLiAqLworI2lmZGVmIERTQ0M0X1BPTExJTkcKKyNkZWZpbmUgRXZlbnRzTWFzawkweGZmZmVlZjdmCisjZWxzZQorI2RlZmluZSBFdmVudHNNYXNrCTB4ZmZmYThmN2EKKyNlbmRpZgorCisvKiBGdW5jdGlvbnMgcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQgZHNjYzRfcnhfaXJxKHN0cnVjdCBkc2NjNF9wY2lfcHJpdiAqLCBzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKik7CitzdGF0aWMgdm9pZCBkc2NjNF90eF9pcnEoc3RydWN0IGRzY2M0X3BjaV9wcml2ICosIHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqKTsKK3N0YXRpYyBpbnQgZHNjYzRfZm91bmQxKHN0cnVjdCBwY2lfZGV2ICosIHZvaWQgX19pb21lbSAqaW9hZGRyKTsKK3N0YXRpYyBpbnQgZHNjYzRfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgaW50IGRzY2M0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50IGRzY2M0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50IGRzY2M0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIGludCBkc2NjNF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKK3N0YXRpYyBpbnQgZHNjYzRfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHZvaWQgZHNjYzRfcmVsZWFzZV9yaW5nKHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqKTsKK3N0YXRpYyB2b2lkIGRzY2M0X3RpbWVyKHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgZHNjYzRfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBkc2NjNF9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcHRyZWdzKTsKK3N0YXRpYyBpbnQgZHNjYzRfaGRsY19hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKiwgdW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIHNob3J0KTsKK3N0YXRpYyBpbnQgZHNjYzRfc2V0X2lmYWNlKHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKyNpZmRlZiBEU0NDNF9QT0xMSU5HCitzdGF0aWMgaW50IGRzY2M0X3R4X3BvbGwoc3RydWN0IGRzY2M0X2Rldl9wcml2ICosIHN0cnVjdCBuZXRfZGV2aWNlICopOworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkc2NjNF9wcml2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldl90b19oZGxjKGRldiktPnByaXY7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldF9kZXZpY2UgKmRzY2M0X3RvX2RldihzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKnApCit7CisJcmV0dXJuIHAtPmRldjsKK30KKworc3RhdGljIHZvaWQgc2NjX3BhdGNobCh1MzIgbWFzaywgdTMyIHZhbHVlLCBzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2LAorCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG9mZnNldCkKK3sKKwl1MzIgc3RhdGU7CisKKwkvKiBDZiBzY2Nfd3JpdGVsIGZvciBjb25jZXJuIHJlZ2FyZGluZyB0aHJlYWQtc2FmZXR5ICovCisJc3RhdGUgPSBkcHJpdi0+c2NjX3JlZ3Nbb2Zmc2V0ID4+IDJdOworCXN0YXRlICY9IH5tYXNrOworCXN0YXRlIHw9IHZhbHVlOworCWRwcml2LT5zY2NfcmVnc1tvZmZzZXQgPj4gMl0gPSBzdGF0ZTsKKwl3cml0ZWwoc3RhdGUsIGRwcml2LT5iYXNlX2FkZHIgKyBTQ0NfUkVHX1NUQVJUKGRwcml2KSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjY193cml0ZWwodTMyIGJpdHMsIHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYsCisJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgb2Zmc2V0KQoreworCS8qCisJICogVGhyZWFkLVVOc2FmZS4KKwkgKiBBcyBvZiAyMDAyLzAyLzE2LCB0aGVyZSBhcmUgbm8gdGhyZWFkIHJhY2luZyBmb3IgYWNjZXNzLgorCSAqLworCWRwcml2LT5zY2NfcmVnc1tvZmZzZXQgPj4gMl0gPSBiaXRzOworCXdyaXRlbChiaXRzLCBkcHJpdi0+YmFzZV9hZGRyICsgU0NDX1JFR19TVEFSVChkcHJpdikgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBzY2NfcmVhZGwoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gZHByaXYtPnNjY19yZWdzW29mZnNldCA+PiAyXTsKK30KKworc3RhdGljIHUzMiBzY2NfcmVhZGxfc3RhcihzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIENmIGVycmF0YSBEUzUgcC40ICovCisJcmVhZGwoZHByaXYtPmJhc2VfYWRkciArIFNDQ19SRUdfU1RBUlQoZHByaXYpICsgU1RBUik7CisJcmV0dXJuIHJlYWRsKGRwcml2LT5iYXNlX2FkZHIgKyBTQ0NfUkVHX1NUQVJUKGRwcml2KSArIFNUQVIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHNjYzRfZG9fdHgoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRwcml2LT5sdGRhID0gZHByaXYtPnR4X2ZkX2RtYSArCisgICAgICAgICAgICAgICAgICAgICAgKChkcHJpdi0+dHhfY3VycmVudC0xKSVUWF9SSU5HX1NJWkUpKnNpemVvZihzdHJ1Y3QgVHhGRCk7CisJd3JpdGVsKGRwcml2LT5sdGRhLCBkcHJpdi0+YmFzZV9hZGRyICsgQ0gwTFREQSArIGRwcml2LT5kZXZfaWQqNCk7CisJLyogRmx1c2ggcG9zdGVkIHdyaXRlcyAqTk9XKiAqLworCXJlYWRsKGRwcml2LT5iYXNlX2FkZHIgKyBDSDBMVERBICsgZHByaXYtPmRldl9pZCo0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRzY2M0X3J4X3VwZGF0ZShzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2LAorCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZHByaXYtPmxyZGEgPSBkcHJpdi0+cnhfZmRfZG1hICsKKwkJICAgICAgKChkcHJpdi0+cnhfZGlydHkgLSAxKSVSWF9SSU5HX1NJWkUpKnNpemVvZihzdHJ1Y3QgUnhGRCk7CisJd3JpdGVsKGRwcml2LT5scmRhLCBkcHJpdi0+YmFzZV9hZGRyICsgQ0gwTFJEQSArIGRwcml2LT5kZXZfaWQqNCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGRzY2M0X3R4X2RvbmUoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdikKK3sKKwlyZXR1cm4gZHByaXYtPnR4X2N1cnJlbnQgPT0gZHByaXYtPnR4X2RpcnR5OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBkc2NjNF90eF9xdWllc2NlbnQoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwKKwkJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gcmVhZGwoZHByaXYtPmJhc2VfYWRkciArIENIMEZUREEgKyBkcHJpdi0+ZGV2X2lkKjQpID09IGRwcml2LT5sdGRhOworfQorCitpbnQgc3RhdGVfY2hlY2sodTMyIHN0YXRlLCBzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQljb25zdCBjaGFyICptc2cpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZGVidWcgPiAxKSB7CisJaWYgKFNPVVJDRV9JRChzdGF0ZSkgIT0gZHByaXYtPmRldl9pZCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKCVzKTogU291cmNlIElkPSVkLCBzdGF0ZT0lMDh4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBtc2csIFNPVVJDRV9JRChzdGF0ZSksIHN0YXRlICk7CisJCQlyZXQgPSAtMTsKKwl9CisJaWYgKHN0YXRlICYgMHgwZGY4MGMwMCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgKCVzKTogc3RhdGU9JTA4eCAoVUZPIGFsZXJ0KVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbXNnLCBzdGF0ZSk7CisJCQlyZXQgPSAtMTsKKwl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgZHNjYzRfdHhfcHJpbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwKKwkJICAgIGNoYXIgKm1zZykKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHR4X2N1cnJlbnQ9JTAyZCB0eF9kaXJ0eT0lMDJkICglcylcbiIsCisJICAgICAgIGRldi0+bmFtZSwgZHByaXYtPnR4X2N1cnJlbnQsIGRwcml2LT50eF9kaXJ0eSwgbXNnKTsKK30KKworc3RhdGljIHZvaWQgZHNjYzRfcmVsZWFzZV9yaW5nKHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkcHJpdi0+cGNpX3ByaXYtPnBkZXY7CisJc3RydWN0IFR4RkQgKnR4X2ZkID0gZHByaXYtPnR4X2ZkOworCXN0cnVjdCBSeEZEICpyeF9mZCA9IGRwcml2LT5yeF9mZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqKnNrYnVmZjsKKwlpbnQgaTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgdHhfZmQsIGRwcml2LT50eF9mZF9kbWEpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgcnhfZmQsIGRwcml2LT5yeF9mZF9kbWEpOworCisJc2tidWZmID0gZHByaXYtPnR4X3NrYnVmZjsKKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJaWYgKCpza2J1ZmYpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUocGRldiwgdHhfZmQtPmRhdGEsICgqc2tidWZmKS0+bGVuLAorCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYigqc2tidWZmKTsKKwkJfQorCQlza2J1ZmYrKzsKKwkJdHhfZmQrKzsKKwl9CisKKwlza2J1ZmYgPSBkcHJpdi0+cnhfc2tidWZmOworCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQlpZiAoKnNrYnVmZikgeworCQkJcGNpX3VubWFwX3NpbmdsZShwZGV2LCByeF9mZC0+ZGF0YSwKKwkJCQlSWF9NQVgoSERMQ19NQVhfTVJVKSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWRldl9rZnJlZV9za2IoKnNrYnVmZik7CisJCX0KKwkJc2tidWZmKys7CisJCXJ4X2ZkKys7CisJfQorfQorCitpbmxpbmUgaW50IHRyeV9nZXRfcnhfc2tiKHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgaW50IGRpcnR5ID0gZHByaXYtPnJ4X2RpcnR5JVJYX1JJTkdfU0laRTsKKwlzdHJ1Y3QgUnhGRCAqcnhfZmQgPSBkcHJpdi0+cnhfZmQgKyBkaXJ0eTsKKwljb25zdCBpbnQgbGVuID0gUlhfTUFYKEhETENfTUFYX01SVSk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgcmV0ID0gMDsKKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKwlkcHJpdi0+cnhfc2tidWZmW2RpcnR5XSA9IHNrYjsKKwlpZiAoc2tiKSB7CisJCXNrYi0+cHJvdG9jb2wgPSBoZGxjX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQlyeF9mZC0+ZGF0YSA9IHBjaV9tYXBfc2luZ2xlKGRwcml2LT5wY2lfcHJpdi0+cGRldiwgc2tiLT5kYXRhLAorCQkJCQkgICAgIGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwl9IGVsc2UgeworCQlyeF9mZC0+ZGF0YSA9ICh1MzIpIE5VTEw7CisJCXJldCA9IC0xOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogSVJRL3RocmVhZC93aGF0ZXZlciBzYWZlCisgKi8KK3N0YXRpYyBpbnQgZHNjYzRfd2FpdF9hY2tfY2VjKHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYsCisJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICptc2cpCit7CisJczggaSA9IDA7CisKKwlkbyB7CisJCWlmICghKHNjY19yZWFkbF9zdGFyKGRwcml2LCBkZXYpICYgU2NjQnVzeSkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogJXMgYWNrICglZCB0cnkpXG4iLCBkZXYtPm5hbWUsCisJCQkgICAgICAgbXNnLCBpKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMTApOworCQlybWIoKTsKKwl9IHdoaWxlICgrK2kgPiAwKTsKKwlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyB0aW1lb3V0XG4iLCBkZXYtPm5hbWUsIG1zZyk7Citkb25lOgorCXJldHVybiAoaSA+PSAwKSA/IGkgOiAtRUFHQUlOOworfQorCitzdGF0aWMgaW50IGRzY2M0X2RvX2FjdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICptc2cpCit7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBkc2NjNF9wcml2KGRldiktPmJhc2VfYWRkcjsKKwlzMTYgaSA9IDA7CisKKwl3cml0ZWwoQWN0aW9uLCBpb2FkZHIgKyBHQ01EUik7CisJaW9hZGRyICs9IEdTVEFSOworCWRvIHsKKwkJdTMyIHN0YXRlID0gcmVhZGwoaW9hZGRyKTsKKworCQlpZiAoc3RhdGUgJiBBckFjaykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcyBhY2tcbiIsIGRldi0+bmFtZSwgbXNnKTsKKwkJCXdyaXRlbChBckFjaywgaW9hZGRyKTsKKwkJCWdvdG8gZG9uZTsKKwkJfSBlbHNlIGlmIChzdGF0ZSAmIEFyZikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgZmFpbGVkXG4iLCBkZXYtPm5hbWUsIG1zZyk7CisJCQl3cml0ZWwoQXJmLCBpb2FkZHIpOworCQkJaSA9IC0xOworCQkJZ290byBkb25lOworCX0KKwkJcm1iKCk7CisJfSB3aGlsZSAoKytpID4gMCk7CisJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgdGltZW91dFxuIiwgZGV2LT5uYW1lLCBtc2cpOworZG9uZToKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZHNjYzRfeHByX2FjayhzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2KQoreworCWludCBjdXIgPSBkcHJpdi0+aXF0eF9jdXJyZW50JUlSUV9SSU5HX1NJWkU7CisJczggaSA9IDA7CisKKwlkbyB7CisJCWlmICghKGRwcml2LT5mbGFncyAmIChOZWVkSURSIHwgTmVlZElEVCkpIHx8CisJCSAgICAoZHByaXYtPmlxdHhbY3VyXSAmIFhwcikpCisJCQlicmVhazsKKwkJc21wX3JtYigpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMTApOworCX0gd2hpbGUgKCsraSA+IDApOworCisJcmV0dXJuIChpID49IDAgKSA/IGkgOiAtRUFHQUlOOworfQorCisjaWYgMCAvKiBkc2NjNF97cngvdHh9X3Jlc2V0IGFyZSBib3RoIHVucmVsaWFibGUgLSBtb3JlIHR3ZWFrIG5lZWRlZCAqLworc3RhdGljIHZvaWQgZHNjYzRfcnhfcmVzZXQoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRwcml2LT5wY2lfcHJpdi0+bG9jaywgZmxhZ3MpOworCS8qIENmIGVycmF0YSBEUzUgcC42ICovCisJd3JpdGVsKDB4MDAwMDAwMDAsIGRwcml2LT5iYXNlX2FkZHIgKyBDSDBMUkRBICsgZHByaXYtPmRldl9pZCo0KTsKKwlzY2NfcGF0Y2hsKFBvd2VyVXAsIDAsIGRwcml2LCBkZXYsIENDUjApOworCXJlYWRsKGRwcml2LT5iYXNlX2FkZHIgKyBDSDBMUkRBICsgZHByaXYtPmRldl9pZCo0KTsKKwl3cml0ZWwoTVRGaXxSZHIsIGRwcml2LT5iYXNlX2FkZHIgKyBkcHJpdi0+ZGV2X2lkKjB4MGMgKyBDSDBDRkcpOworCXdyaXRlbChBY3Rpb24sIGRwcml2LT5iYXNlX2FkZHIgKyBHQ01EUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHByaXYtPnBjaV9wcml2LT5sb2NrLCBmbGFncyk7Cit9CisKKyNlbmRpZgorCisjaWYgMAorc3RhdGljIHZvaWQgZHNjYzRfdHhfcmVzZXQoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1MTYgaSA9IDA7CisKKwkvKiBDZiBlcnJhdGEgRFM1IHAuNyAqLworCXNjY19wYXRjaGwoUG93ZXJVcCwgMCwgZHByaXYsIGRldiwgQ0NSMCk7CisJc2NjX3dyaXRlbCgweDAwMDUwMDAwLCBkcHJpdiwgZGV2LCBDQ1IyKTsKKwkvKgorCSAqIE11c3QgYmUgbG9uZ2VyIHRoYW4gdGhlIHRpbWUgcmVxdWlyZWQgdG8gZmlsbCB0aGUgZmlmby4KKwkgKi8KKwl3aGlsZSAoIWRzY2M0X3R4X3F1aWVzY2VudChkcHJpdiwgZGV2KSAmJiArK2kpIHsKKwkJdWRlbGF5KDEpOworCQl3bWIoKTsKKwl9CisKKwl3cml0ZWwoTVRGaXxSZHQsIGRwcml2LT5iYXNlX2FkZHIgKyBkcHJpdi0+ZGV2X2lkKjB4MGMgKyBDSDBDRkcpOworCWlmIChkc2NjNF9kb19hY3Rpb24oZGV2LCAiUmR0IikgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBUeCByZXNldCBmYWlsZWRcbiIsIGRldi0+bmFtZSk7Cit9CisjZW5kaWYKKworLyogVE9ETzogKGFiKXVzZSB0aGlzIGZ1bmN0aW9uIHRvIHJlZmlsbCBhIGNvbXBsZXRlbHkgZGVwbGV0ZWQgUlggcmluZy4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkc2NjNF9yeF9za2Ioc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwKKwkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBSeEZEICpyeF9mZCA9IGRwcml2LT5yeF9mZCArIGRwcml2LT5yeF9jdXJyZW50JVJYX1JJTkdfU0laRTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkcHJpdi0+cGNpX3ByaXYtPnBkZXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgcGt0X2xlbjsKKworCXNrYiA9IGRwcml2LT5yeF9za2J1ZmZbZHByaXYtPnJ4X2N1cnJlbnQrKyVSWF9SSU5HX1NJWkVdOworCWlmICghc2tiKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogc2tiPTAgKCVzKVxuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIHJlZmlsbDsKKwl9CisJcGt0X2xlbiA9IFRPX1NJWkUocnhfZmQtPnN0YXRlMik7CisJcGNpX3VubWFwX3NpbmdsZShwZGV2LCByeF9mZC0+ZGF0YSwgUlhfTUFYKEhETENfTUFYX01SVSksIFBDSV9ETUFfRlJPTURFVklDRSk7CisJaWYgKChza2ItPmRhdGFbLS1wa3RfbGVuXSAmIEZyYW1lT2spID09IEZyYW1lT2spIHsKKwkJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwkJc3RhdHMtPnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCXNrYi0+cHJvdG9jb2wgPSBoZGxjX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQlza2ItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCW5ldGlmX3J4KHNrYik7CisJfSBlbHNlIHsKKwkJaWYgKHNrYi0+ZGF0YVtwa3RfbGVuXSAmIEZyYW1lUmRvKQorCQkJc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzKys7CisJCWVsc2UgaWYgKCEoc2tiLT5kYXRhW3BrdF9sZW5dIHwgfkZyYW1lQ3JjKSkKKwkJCXN0YXRzLT5yeF9jcmNfZXJyb3JzKys7CisJCWVsc2UgaWYgKCEoc2tiLT5kYXRhW3BrdF9sZW5dIHwgfihGcmFtZVZmciB8IEZyYW1lUmFiKSkpCisJCQlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycysrOworCQllbHNlCisJCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJfQorcmVmaWxsOgorCXdoaWxlICgoZHByaXYtPnJ4X2RpcnR5IC0gZHByaXYtPnJ4X2N1cnJlbnQpICUgUlhfUklOR19TSVpFKSB7CisJCWlmICh0cnlfZ2V0X3J4X3NrYihkcHJpdiwgZGV2KSA8IDApCisJCQlicmVhazsKKwkJZHByaXYtPnJ4X2RpcnR5Kys7CisJfQorCWRzY2M0X3J4X3VwZGF0ZShkcHJpdiwgZGV2KTsKKwlyeF9mZC0+c3RhdGUyID0gMHgwMDAwMDAwMDsKKwlyeF9mZC0+ZW5kID0gMHhiYWJlZmFjZTsKK30KKworc3RhdGljIHZvaWQgZHNjYzRfZnJlZTEoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGRzY2M0X3BjaV9wcml2ICpwcHJpdjsKKwlzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKnJvb3Q7CisJaW50IGk7CisKKwlwcHJpdiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlyb290ID0gcHByaXYtPnJvb3Q7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2X3Blcl9jYXJkOyBpKyspCisJCXVucmVnaXN0ZXJfaGRsY19kZXZpY2UoZHNjYzRfdG9fZGV2KHJvb3QgKyBpKSk7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2X3Blcl9jYXJkOyBpKyspCisJCWZyZWVfbmV0ZGV2KHJvb3RbaV0uZGV2KTsKKwlrZnJlZShyb290KTsKKwlrZnJlZShwcHJpdik7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRzY2M0X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgZHNjYzRfcGNpX3ByaXYgKnByaXY7CisJc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdjsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwlpbnQgaSwgcmM7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMiLCB2ZXJzaW9uKTsKKworCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXQ7CisKKwlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCAwLCAicmVnaXN0ZXJzIik7CisJaWYgKHJjIDwgMCkgeworCSAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgcmVzZXJ2ZSBNTUlPIHJlZ2lvbiAocmVncylcbiIsCisJCQlEUlZfTkFNRSk7CisJICAgICAgICBnb3RvIGVycl9kaXNhYmxlXzA7CisJfQorCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIDEsICJMQkkgaW50ZXJmYWNlIik7CisJaWYgKHJjIDwgMCkgeworCSAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogY2FuJ3QgcmVzZXJ2ZSBNTUlPIHJlZ2lvbiAobGJpKVxuIiwKKwkJCURSVl9OQU1FKTsKKwkgICAgICAgIGdvdG8gZXJyX2ZyZWVfbW1pb19yZWdpb25fMTsKKwl9CisKKwlpb2FkZHIgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwKKwkJCQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7CisJaWYgKCFpb2FkZHIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2Fubm90IHJlbWFwIE1NSU8gcmVnaW9uICVseCBAICVseFxuIiwKKwkJCURSVl9OQU1FLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApLAorCQkJcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycl9mcmVlX21taW9fcmVnaW9uc18yOworCX0KKwlwcmludGsoS0VSTl9ERUJVRyAiU2llbWVucyBEU0NDNCwgTU1JTyBhdCAlI2x4IChyZWdzKSwgJSNseCAobGJpKSwgSVJRICVkXG4iLAorCSAgICAgICAgcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAorCSAgICAgICAgcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpLCBwZGV2LT5pcnEpOworCisJLyogQ2YgZXJyYXRhIERTNSBwLjIgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0xBVEVOQ1lfVElNRVIsIDB4ZjgpOworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcmMgPSBkc2NjNF9mb3VuZDEocGRldiwgaW9hZGRyKTsKKwlpZiAocmMgPCAwKQorCSAgICAgICAgZ290byBlcnJfaW91bm1hcF8zOworCisJcHJpdiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJjID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBkc2NjNF9pcnEsIFNBX1NISVJRLCBEUlZfTkFNRSwgcHJpdi0+cm9vdCk7CisJaWYgKHJjIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSVJRICVkIGJ1c3lcbiIsIERSVl9OQU1FLCBwZGV2LT5pcnEpOworCQlnb3RvIGVycl9yZWxlYXNlXzQ7CisJfQorCisJLyogcG93ZXIgdXAvbGl0dGxlIGVuZGlhbi9kbWEgY29yZSBjb250cm9sbGVkIHZpYSBscmRhL2x0ZGEgKi8KKwl3cml0ZWwoMHgwMDAwMDAwMSwgaW9hZGRyICsgR01PREUpOworCS8qIFNoYXJlZCBpbnRlcnJ1cHQgcXVldWUgKi8KKwl7CisJCXUzMiBiaXRzOworCisJCWJpdHMgPSAoSVJRX1JJTkdfU0laRSA+PiA1KSAtIDE7CisJCWJpdHMgfD0gYml0cyA8PCA0OworCQliaXRzIHw9IGJpdHMgPDwgODsKKwkJYml0cyB8PSBiaXRzIDw8IDE2OworCQl3cml0ZWwoYml0cywgaW9hZGRyICsgSVFMRU5SMCk7CisJfQorCS8qIEdsb2JhbCBpbnRlcnJ1cHQgcXVldWUgKi8KKwl3cml0ZWwoKHUzMikoKChJUlFfUklOR19TSVpFID4+IDUpIC0gMSkgPDwgMjApLCBpb2FkZHIgKyBJUUxFTlIxKTsKKwlwcml2LT5pcWNmZyA9ICh1MzIgKikgcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwKKwkJSVJRX1JJTkdfU0laRSpzaXplb2YodTMyKSwgJnByaXYtPmlxY2ZnX2RtYSk7CisJaWYgKCFwcml2LT5pcWNmZykKKwkJZ290byBlcnJfZnJlZV9pcnFfNTsKKwl3cml0ZWwocHJpdi0+aXFjZmdfZG1hLCBpb2FkZHIgKyBJUUNGRyk7CisKKwlyYyA9IC1FTk9NRU07CisKKwkvKgorCSAqIFNDQyAwLTMgcHJpdmF0ZSByeC90eCBpcnEgc3RydWN0dXJlcworCSAqIElRUlgvVFhpIG5lZWRzIHRvIGJlIHNldCBzb29uLiBMZWFybmVkIGl0IHRoZSBoYXJkIHdheS4uLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBkZXZfcGVyX2NhcmQ7IGkrKykgeworCQlkcHJpdiA9IHByaXYtPnJvb3QgKyBpOworCQlkcHJpdi0+aXF0eCA9ICh1MzIgKikgcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwKKwkJCUlSUV9SSU5HX1NJWkUqc2l6ZW9mKHUzMiksICZkcHJpdi0+aXF0eF9kbWEpOworCQlpZiAoIWRwcml2LT5pcXR4KQorCQkJZ290byBlcnJfZnJlZV9pcXR4XzY7CisJCXdyaXRlbChkcHJpdi0+aXF0eF9kbWEsIGlvYWRkciArIElRVFgwICsgaSo0KTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGRldl9wZXJfY2FyZDsgaSsrKSB7CisJCWRwcml2ID0gcHJpdi0+cm9vdCArIGk7CisJCWRwcml2LT5pcXJ4ID0gKHUzMiAqKSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LAorCQkJSVJRX1JJTkdfU0laRSpzaXplb2YodTMyKSwgJmRwcml2LT5pcXJ4X2RtYSk7CisJCWlmICghZHByaXYtPmlxcngpCisJCQlnb3RvIGVycl9mcmVlX2lxcnhfNzsKKwkJd3JpdGVsKGRwcml2LT5pcXJ4X2RtYSwgaW9hZGRyICsgSVFSWDAgKyBpKjQpOworCX0KKworCS8qIENmIGFwcGxpY2F0aW9uIGhpbnQuIEJld2FyZSBvZiBoYXJkLWxvY2sgY29uZGl0aW9uIG9uIHRocmVzaG9sZC4gKi8KKwl3cml0ZWwoMHg0MjEwNDAwMCwgaW9hZGRyICsgRklGT0NSMSk7CisJLy93cml0ZWwoMHg5Y2U2OTgwMCwgaW9hZGRyICsgRklGT0NSMik7CisJd3JpdGVsKDB4ZGVmNmQ4MDAsIGlvYWRkciArIEZJRk9DUjIpOworCS8vd3JpdGVsKDB4MTExMTExMTEsIGlvYWRkciArIEZJRk9DUjQpOworCXdyaXRlbCgweDE4MTgxODE4LCBpb2FkZHIgKyBGSUZPQ1I0KTsKKwkvLyBGSVhNRTogc2hvdWxkIGRlcGVuZCBvbiB0aGUgY2hpcHNldCByZXZpc2lvbgorCXdyaXRlbCgweDAwMDAwMDBlLCBpb2FkZHIgKyBGSUZPQ1IzKTsKKworCXdyaXRlbCgweGZmMjAwMDAxLCBpb2FkZHIgKyBHQ01EUik7CisKKwlyYyA9IDA7CitvdXQ6CisJcmV0dXJuIHJjOworCitlcnJfZnJlZV9pcXJ4Xzc6CisJd2hpbGUgKC0taSA+PSAwKSB7CisJCWRwcml2ID0gcHJpdi0+cm9vdCArIGk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgSVJRX1JJTkdfU0laRSpzaXplb2YodTMyKSwKKwkJCQkgICAgZHByaXYtPmlxcngsIGRwcml2LT5pcXJ4X2RtYSk7CisJfQorCWkgPSBkZXZfcGVyX2NhcmQ7CitlcnJfZnJlZV9pcXR4XzY6CisJd2hpbGUgKC0taSA+PSAwKSB7CisJCWRwcml2ID0gcHJpdi0+cm9vdCArIGk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgSVJRX1JJTkdfU0laRSpzaXplb2YodTMyKSwKKwkJCQkgICAgZHByaXYtPmlxdHgsIGRwcml2LT5pcXR4X2RtYSk7CisJfQorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgSVJRX1JJTkdfU0laRSpzaXplb2YodTMyKSwgcHJpdi0+aXFjZmcsCisJCQkgICAgcHJpdi0+aXFjZmdfZG1hKTsKK2Vycl9mcmVlX2lycV81OgorCWZyZWVfaXJxKHBkZXYtPmlycSwgcHJpdi0+cm9vdCk7CitlcnJfcmVsZWFzZV80OgorCWRzY2M0X2ZyZWUxKHBkZXYpOworZXJyX2lvdW5tYXBfMzoKKwlpb3VubWFwIChpb2FkZHIpOworZXJyX2ZyZWVfbW1pb19yZWdpb25zXzI6CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDEpOworZXJyX2ZyZWVfbW1pb19yZWdpb25fMToKKwlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMCk7CitlcnJfZGlzYWJsZV8wOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlnb3RvIG91dDsKK307CisKKy8qCisgKiBMZXQncyBob3BlIHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgZGVjZW50IGVub3VnaCB0byBwcm90ZWN0IG15CisgKiBmZWV0IGZyb20gdGhlIHVzZXIncyBndW4gLSBVZWltb3IKKyAqLworc3RhdGljIHZvaWQgZHNjYzRfaW5pdF9yZWdpc3RlcnMoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwKKwkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwkvKiBObyBpbnRlcnJ1cHRzLCBTQ0MgY29yZSBkaXNhYmxlZC4gTGV0J3MgcmVsYXggKi8KKwlzY2Nfd3JpdGVsKDB4MDAwMDAwMDAsIGRwcml2LCBkZXYsIENDUjApOworCisJc2NjX3dyaXRlbChMZW5ndGhDaGVjayB8IChIRExDX01BWF9NUlUgPj4gNSksIGRwcml2LCBkZXYsIFJMQ1IpOworCisJLyoKKwkgKiBObyBhZGRyZXNzIHJlY29nbml0aW9uL2NyYy1DQ0lUVC9jdHMgZW5hYmxlZAorCSAqIFNoYXJlZCBmbGFncyB0cmFuc21pc3Npb24gZGlzYWJsZWQgLSBjZiBlcnJhdGEgRFM1IHAuMTEKKwkgKiBDYXJyaWVyIGRldGVjdCBkaXNhYmxlZCAtIGNmIGVycmF0YSBwLjE0CisJICogRklYTUU6IGNhcnJpZXIgZGV0ZWN0aW9uL3BvbGFyaXR5IG1heSBiZSBoYW5kbGVkIG1vcmUgZ3JhY2VmdWxseS4KKwkgKi8KKwlzY2Nfd3JpdGVsKDB4MDI0MDgwMDAsIGRwcml2LCBkZXYsIENDUjEpOworCisJLyogY3JjIG5vdCBmb3J3YXJkZWQgLSBDZiBlcnJhdGEgRFM1IHAuMTEgKi8KKwlzY2Nfd3JpdGVsKDB4MDAwNTAwMDggJiB+UnhBY3RpdmF0ZSwgZHByaXYsIGRldiwgQ0NSMik7CisJLy8gY3JjIGZvcndhcmRlZAorCS8vc2NjX3dyaXRlbCgweDAwMjUwMDA4ICYgflJ4QWN0aXZhdGUsIGRwcml2LCBkZXYsIENDUjIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkc2NjNF9zZXRfcXVhcnR6KHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYsIGludCBoeikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICgoaHogPCAwKSB8fCAoaHogPiBEU0NDNF9IWl9NQVgpKQorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwllbHNlCisJCWRwcml2LT5wY2lfcHJpdi0+eHRhbF9oeiA9IGh6OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkc2NjNF9mb3VuZDEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCXN0cnVjdCBkc2NjNF9wY2lfcHJpdiAqcHByaXY7CisJc3RydWN0IGRzY2M0X2Rldl9wcml2ICpyb290OworCWludCBpLCByZXQgPSAtRU5PTUVNOworCisJcm9vdCA9IGttYWxsb2MoZGV2X3Blcl9jYXJkKnNpemVvZigqcm9vdCksIEdGUF9LRVJORUwpOworCWlmICghcm9vdCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCBhbGxvY2F0ZSBkYXRhXG4iLCBEUlZfTkFNRSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJbWVtc2V0KHJvb3QsIDAsIGRldl9wZXJfY2FyZCpzaXplb2YoKnJvb3QpKTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXZfcGVyX2NhcmQ7IGkrKykgeworCQlyb290W2ldLmRldiA9IGFsbG9jX2hkbGNkZXYocm9vdCArIGkpOworCQlpZiAoIXJvb3RbaV0uZGV2KQorCQkJZ290byBlcnJfZnJlZV9kZXY7CisJfQorCisJcHByaXYgPSBrbWFsbG9jKHNpemVvZigqcHByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBwcml2KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IGFsbG9jYXRlIHByaXZhdGUgZGF0YVxuIiwgRFJWX05BTUUpOworCQlnb3RvIGVycl9mcmVlX2RldjsKKwl9CisJbWVtc2V0KHBwcml2LCAwLCBzaXplb2Yoc3RydWN0IGRzY2M0X3BjaV9wcml2KSk7CisKKwlwcHJpdi0+cm9vdCA9IHJvb3Q7CisJc3Bpbl9sb2NrX2luaXQoJnBwcml2LT5sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXZfcGVyX2NhcmQ7IGkrKykgeworCQlzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2ID0gcm9vdCArIGk7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkID0gZHNjYzRfdG9fZGV2KGRwcml2KTsKKwkJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkKTsKKworCSAgICAgICAgZC0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW9hZGRyOworCQlkLT5pbml0ID0gTlVMTDsKKwkgICAgICAgIGQtPmlycSA9IHBkZXYtPmlycTsKKwkgICAgICAgIGQtPm9wZW4gPSBkc2NjNF9vcGVuOworCSAgICAgICAgZC0+c3RvcCA9IGRzY2M0X2Nsb3NlOworCQlkLT5zZXRfbXVsdGljYXN0X2xpc3QgPSBOVUxMOworCSAgICAgICAgZC0+ZG9faW9jdGwgPSBkc2NjNF9pb2N0bDsKKwkJZC0+dHhfdGltZW91dCA9IGRzY2M0X3R4X3RpbWVvdXQ7CisJCWQtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKwkJU0VUX01PRFVMRV9PV05FUihkKTsKKwkJU0VUX05FVERFVl9ERVYoZCwgJnBkZXYtPmRldik7CisKKwkJZHByaXYtPmRldl9pZCA9IGk7CisJCWRwcml2LT5wY2lfcHJpdiA9IHBwcml2OworCQlkcHJpdi0+YmFzZV9hZGRyID0gaW9hZGRyOworCQlzcGluX2xvY2tfaW5pdCgmZHByaXYtPmxvY2spOworCisJCWhkbGMtPnhtaXQgPSBkc2NjNF9zdGFydF94bWl0OworCQloZGxjLT5hdHRhY2ggPSBkc2NjNF9oZGxjX2F0dGFjaDsKKworCQlkc2NjNF9pbml0X3JlZ2lzdGVycyhkcHJpdiwgZCk7CisJCWRwcml2LT5wYXJpdHkgPSBQQVJJVFlfQ1JDMTZfUFIwX0NDSVRUOworCQlkcHJpdi0+ZW5jb2RpbmcgPSBFTkNPRElOR19OUlo7CisJCisJCXJldCA9IGRzY2M0X2luaXRfcmluZyhkKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycl91bnJlZ2lzdGVyOworCisJCXJldCA9IHJlZ2lzdGVyX2hkbGNfZGV2aWNlKGQpOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIHJlZ2lzdGVyXG4iLCBEUlZfTkFNRSk7CisJCQlkc2NjNF9yZWxlYXNlX3JpbmcoZHByaXYpOworCQkJZ290byBlcnJfdW5yZWdpc3RlcjsKKwkgICAgICAgIH0KKwl9CisKKwlyZXQgPSBkc2NjNF9zZXRfcXVhcnR6KHJvb3QsIHF1YXJ0eik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3VucmVnaXN0ZXI7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgcHByaXYpOworCXJldHVybiByZXQ7CisKK2Vycl91bnJlZ2lzdGVyOgorCXdoaWxlIChpLS0gPiAwKSB7CisJCWRzY2M0X3JlbGVhc2VfcmluZyhyb290ICsgaSk7CisJCXVucmVnaXN0ZXJfaGRsY19kZXZpY2UoZHNjYzRfdG9fZGV2KHJvb3QgKyBpKSk7CisJfQorCWtmcmVlKHBwcml2KTsKKwlpID0gZGV2X3Blcl9jYXJkOworZXJyX2ZyZWVfZGV2OgorCXdoaWxlIChpLS0gPiAwKQorCQlmcmVlX25ldGRldihyb290W2ldLmRldik7CisJa2ZyZWUocm9vdCk7CitlcnJfb3V0OgorCXJldHVybiByZXQ7Cit9OworCisvKiBGSVhNRTogZ2V0IHJpZCBvZiB0aGUgdW5uZWVkZWQgY29kZSAqLworc3RhdGljIHZvaWQgZHNjYzRfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYgPSBkc2NjNF9wcml2KGRldik7CisvLwlzdHJ1Y3QgZHNjYzRfcGNpX3ByaXYgKnBwcml2OworCisJZ290byBkb25lOworZG9uZToKKyAgICAgICAgZHByaXYtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgVFhfVElNRU9VVDsKKyAgICAgICAgYWRkX3RpbWVyKCZkcHJpdi0+dGltZXIpOworfQorCitzdGF0aWMgdm9pZCBkc2NjNF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogRklYTUU6IHNvbWV0aGluZyBpcyBtaXNzaW5nIHRoZXJlICovCit9CisKK3N0YXRpYyBpbnQgZHNjYzRfbG9vcGJhY2tfY2hlY2soc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdikKK3sKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyAqc2V0dGluZ3MgPSAmZHByaXYtPnNldHRpbmdzOworCisJaWYgKHNldHRpbmdzLT5sb29wYmFjayAmJiAoc2V0dGluZ3MtPmNsb2NrX3R5cGUgIT0gQ0xPQ0tfSU5UKSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHNjYzRfdG9fZGV2KGRwcml2KTsKKworCQlwcmludGsoS0VSTl9JTkZPICIlczogbG9vcGJhY2sgcmVxdWlyZXMgY2xvY2tcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfRFNDQzRfUENJX1JTVAorLyoKKyAqIFNvbWUgRFNDQzQtYmFzZWQgY2FyZHMgd2lyZXMgdGhlIEdQSU8gcG9ydCBhbmQgdGhlIFBDSSAjUlNUIHBpbiB0b2dldGhlcgorICogc28gYXMgdG8gcHJvdmlkZSBhIHNhZmUgd2F5IHRvIHJlc2V0IHRoZSBhc2ljIHdoaWxlIG5vdCB0aGUgd2hvbGUgbWFjaGluZQorICogcmVib290aW5nLgorICoKKyAqIFRoaXMgY29kZSBkb2Vzbid0IG5lZWQgdG8gYmUgZWZmaWNpZW50LiBLZWVwIEl0IFNpbXBsZQorICovCitzdGF0aWMgdm9pZCBkc2NjNF9wY2lfcmVzZXQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCWludCBpOworCisJZG93bigmZHNjYzRfc2VtKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGkgPDwgMiwgZHNjYzRfcGNpX2NvbmZpZ19zdG9yZSArIGkpOworCisJLyogTWF4aW1hbCBMQkkgY2xvY2sgZGl2aWRlciAod2hvIGNhcmVzID8pIGFuZCB3aG9sZSBHUElPIHJhbmdlLiAqLworCXdyaXRlbCgweDAwMWMwMDAwLCBpb2FkZHIgKyBHTU9ERSk7CisJLyogQ29uZmlndXJlIEdQSU8gcG9ydCBhcyBvdXRwdXQgKi8KKwl3cml0ZWwoMHgwMDAwZmZmZiwgaW9hZGRyICsgR1BESVIpOworCS8qIERpc2FibGUgaW50ZXJydXB0aW9uICovCisJd3JpdGVsKDB4MDAwMGZmZmYsIGlvYWRkciArIEdQSU0pOworCisJd3JpdGVsKDB4MDAwMGZmZmYsIGlvYWRkciArIEdQREFUQSk7CisJd3JpdGVsKDB4MDAwMDAwMDAsIGlvYWRkciArIEdQREFUQSk7CisKKwkvKiBGbHVzaCBwb3N0ZWQgd3JpdGVzICovCisJcmVhZGwoaW9hZGRyICsgR1NUQVIpOworCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQoMTApOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgaSA8PCAyLCBkc2NjNF9wY2lfY29uZmlnX3N0b3JlW2ldKTsKKwl1cCgmZHNjYzRfc2VtKTsKK30KKyNlbHNlCisjZGVmaW5lIGRzY2M0X3BjaV9yZXNldChwZGV2LGlvYWRkcikJZG8ge30gd2hpbGUgKDApCisjZW5kaWYgLyogQ09ORklHX0RTQ0M0X1BDSV9SU1QgKi8KKworc3RhdGljIGludCBkc2NjNF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiA9IGRzY2M0X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZHNjYzRfcGNpX3ByaXYgKnBwcml2OworCWludCByZXQgPSAtRUFHQUlOOworCisJaWYgKChkc2NjNF9sb29wYmFja19jaGVjayhkcHJpdikgPCAwKSB8fCAhZGV2LT5oYXJkX3N0YXJ0X3htaXQpCisJCWdvdG8gZXJyOworCisJaWYgKChyZXQgPSBoZGxjX29wZW4oZGV2KSkpCisJCWdvdG8gZXJyOworCisJcHByaXYgPSBkcHJpdi0+cGNpX3ByaXY7CisKKwkvKgorCSAqIER1ZSB0byB2YXJpb3VzIGJ1Z3MsIHRoZXJlIGlzIG5vIHdheSB0byByZWxpYWJseSByZXNldCBhCisJICogc3BlY2lmaWMgcG9ydCAobWFudWZhY3R1cmVyJ3MgZGVwZW5kYW50IHNwZWNpYWwgUENJICNSU1Qgd2lyaW5nCisJICogYXBhcnQ6IGl0IGFmZmVjdHMgYWxsIHBvcnRzKS4gVGh1cyB0aGUgZGV2aWNlIGdvZXMgaW4gdGhlIGJlc3QKKwkgKiBzaWxlbnQgbW9kZSBwb3NzaWJsZSBhdCBkc2NjNF9jbG9zZSgpIHRpbWUgYW5kIHNpbXBseSBjbGFpbXMgdG8KKwkgKiBiZSB1cCBpZiBpdCdzIG9wZW5lZCBhZ2Fpbi4gSXQgc3RpbGwgaXNuJ3QgcG9zc2libGUgdG8gY2hhbmdlCisJICogdGhlIEhETEMgY29uZmlndXJhdGlvbiB3aXRob3V0IHJlYm9vdGluZyBidXQgYXQgbGVhc3QgdGhlIHBvcnRzCisJICogY2FuIGJlIHVwL2Rvd24gaWZjb25maWcnZWQgd2l0aG91dCBraWxsaW5nIHRoZSBob3N0LgorCSAqLworCWlmIChkcHJpdi0+ZmxhZ3MgJiBGYWtlUmVzZXQpIHsKKwkJZHByaXYtPmZsYWdzICY9IH5GYWtlUmVzZXQ7CisJCXNjY19wYXRjaGwoMCwgUG93ZXJVcCwgZHByaXYsIGRldiwgQ0NSMCk7CisJCXNjY19wYXRjaGwoMCwgMHgwMDA1MDAwMCwgZHByaXYsIGRldiwgQ0NSMik7CisJCXNjY193cml0ZWwoRXZlbnRzTWFzaywgZHByaXYsIGRldiwgSU1SKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHVwIGFnYWluLlxuIiwgZGV2LT5uYW1lKTsKKwkJZ290byBkb25lOworCX0KKworCS8qIElEVCtJRFIgZHVyaW5nIFhQUiAqLworCWRwcml2LT5mbGFncyA9IE5lZWRJRFIgfCBOZWVkSURUOworCisJc2NjX3BhdGNobCgwLCBQb3dlclVwIHwgVmlzLCBkcHJpdiwgZGV2LCBDQ1IwKTsKKworCS8qCisJICogVGhlIGZvbGxvd2luZyBpcyBhIGJpdCBwYXJhbm9pZC4uLgorCSAqCisJICogTkI6IHRoZSBkYXRhc2hlZXQgIi4uLkNFQyB3aWxsIHN0YXkgYWN0aXZlIGlmIHRoZSBTQ0MgaXMgaW4KKwkgKiBwb3dlci1kb3duIG1vZGUgb3IuLi4iIGFuZCBDQ1IyLlJBQyA9IDEgYXJlIHR3byBkaWZmZXJlbnQKKwkgKiBzaXR1YXRpb25zLgorCSAqLworCWlmIChzY2NfcmVhZGxfc3RhcihkcHJpdiwgZGV2KSAmIFNjY0J1c3kpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyBidXN5LiBUcnkgbGF0ZXJcbiIsIGRldi0+bmFtZSk7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gZXJyX291dDsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGF2YWlsYWJsZS4gR29vZFxuIiwgZGV2LT5uYW1lKTsKKworCXNjY193cml0ZWwoRXZlbnRzTWFzaywgZHByaXYsIGRldiwgSU1SKTsKKworCS8qIFBvc3RlZCB3cml0ZSBpcyBmbHVzaGVkIGluIHRoZSB3YWl0X2FjayBsb29wICovCisJc2NjX3dyaXRlbChUeFNjY1JlcyB8IFJ4U2NjUmVzLCBkcHJpdiwgZGV2LCBDTURSKTsKKworCWlmICgocmV0ID0gZHNjYzRfd2FpdF9hY2tfY2VjKGRwcml2LCBkZXYsICJDZWMiKSkgPCAwKQorCQlnb3RvIGVycl9kaXNhYmxlX3NjY19ldmVudHM7CisKKwkvKgorCSAqIEkgd291bGQgZXhwZWN0IFhQUiBuZWFyIENFIGNvbXBsZXRpb24gKGJlZm9yZSA/IGFmdGVyID8pLgorCSAqIEF0IHdvcnN0LCB0aGlzIGNvZGUgd29uJ3Qgc2VlIGEgbGF0ZSBYUFIgYW5kIHBlb3BsZQorCSAqIHdpbGwgaGF2ZSB0byByZS1pc3N1ZSBhbiBpZmNvbmZpZyAodGhpcyBpcyBoYXJtbGVzcykuCisJICogV0FSTklORywgYSByZWFsbHkgbWlzc2luZyBYUFIgdXN1YWxseSBtZWFucyBhIGhhcmR3YXJlCisJICogcmVzZXQgaXMgbmVlZGVkLiBTdWdnZXN0aW9ucyBhbnlvbmUgPworCSAqLworCWlmICgocmV0ID0gZHNjYzRfeHByX2FjayhkcHJpdikpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyB0aW1lb3V0XG4iLCBEUlZfTkFNRSwgIlhQUiIpOworCQlnb3RvIGVycl9kaXNhYmxlX3NjY19ldmVudHM7CisJfQorCQorCWlmIChkZWJ1ZyA+IDIpCisJCWRzY2M0X3R4X3ByaW50KGRldiwgZHByaXYsICJPcGVuIik7CisKK2RvbmU6CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworICAgICAgICBpbml0X3RpbWVyKCZkcHJpdi0+dGltZXIpOworICAgICAgICBkcHJpdi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAxMCpIWjsKKyAgICAgICAgZHByaXYtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisgICAgICAgIGRwcml2LT50aW1lci5mdW5jdGlvbiA9ICZkc2NjNF90aW1lcjsKKyAgICAgICAgYWRkX3RpbWVyKCZkcHJpdi0+dGltZXIpOworCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKworCXJldHVybiAwOworCitlcnJfZGlzYWJsZV9zY2NfZXZlbnRzOgorCXNjY193cml0ZWwoMHhmZmZmZmZmZiwgZHByaXYsIGRldiwgSU1SKTsKKwlzY2NfcGF0Y2hsKFBvd2VyVXAgfCBWaXMsIDAsIGRwcml2LCBkZXYsIENDUjApOworZXJyX291dDoKKwloZGxjX2Nsb3NlKGRldik7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIERTQ0M0X1BPTExJTkcKK3N0YXRpYyBpbnQgZHNjYzRfdHhfcG9sbChzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIEZJWE1FOiBpdCdzIGdvbm5hIGJlIGVhc3kgKFRNKSwgZm9yIHN1cmUgKi8KK30KKyNlbmRpZiAvKiBEU0NDNF9QT0xMSU5HICovCisKK3N0YXRpYyBpbnQgZHNjYzRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYgPSBkc2NjNF9wcml2KGRldik7CisJc3RydWN0IGRzY2M0X3BjaV9wcml2ICpwcHJpdiA9IGRwcml2LT5wY2lfcHJpdjsKKwlzdHJ1Y3QgVHhGRCAqdHhfZmQ7CisJaW50IG5leHQ7CisKKwluZXh0ID0gZHByaXYtPnR4X2N1cnJlbnQlVFhfUklOR19TSVpFOworCWRwcml2LT50eF9za2J1ZmZbbmV4dF0gPSBza2I7CisJdHhfZmQgPSBkcHJpdi0+dHhfZmQgKyBuZXh0OworCXR4X2ZkLT5zdGF0ZSA9IEZyYW1lRW5kIHwgVE9fU1RBVEVfVFgoc2tiLT5sZW4pOworCXR4X2ZkLT5kYXRhID0gcGNpX21hcF9zaW5nbGUocHByaXYtPnBkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sCisJCQkJICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwl0eF9mZC0+Y29tcGxldGUgPSAweDAwMDAwMDAwOworCXR4X2ZkLT5qaWZmaWVzID0gamlmZmllczsKKwltYigpOworCisjaWZkZWYgRFNDQzRfUE9MTElORworCXNwaW5fbG9jaygmZHByaXYtPmxvY2spOworCXdoaWxlIChkc2NjNF90eF9wb2xsKGRwcml2LCBkZXYpKTsKKwlzcGluX3VubG9jaygmZHByaXYtPmxvY2spOworI2VuZGlmCisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCWlmIChkZWJ1ZyA+IDIpCisJCWRzY2M0X3R4X3ByaW50KGRldiwgZHByaXYsICJYbWl0Iik7CisJLyogVG8gYmUgY2xlYW5lZCh1bnNpZ25lZCBpbnQpL29wdGltaXplZC4gTGF0ZXIsIG9rID8gKi8KKwlpZiAoISgoKytkcHJpdi0+dHhfY3VycmVudCAtIGRwcml2LT50eF9kaXJ0eSklVFhfUklOR19TSVpFKSkKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKGRzY2M0X3R4X3F1aWVzY2VudChkcHJpdiwgZGV2KSkKKwkJZHNjYzRfZG9fdHgoZHByaXYsIGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkc2NjNF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYgPSBkc2NjNF9wcml2KGRldik7CisKKwlkZWxfdGltZXJfc3luYygmZHByaXYtPnRpbWVyKTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlzY2NfcGF0Y2hsKFBvd2VyVXAgfCBWaXMsIDAsIGRwcml2LCBkZXYsIENDUjApOworCXNjY19wYXRjaGwoMHgwMDA1MDAwMCwgMCwgZHByaXYsIGRldiwgQ0NSMik7CisJc2NjX3dyaXRlbCgweGZmZmZmZmZmLCBkcHJpdiwgZGV2LCBJTVIpOworCisJZHByaXYtPmZsYWdzIHw9IEZha2VSZXNldDsKKworCWhkbGNfY2xvc2UoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkc2NjNF9jaGVja19jbG9ja19hYmlsaXR5KGludCBwb3J0KQoreworCWludCByZXQgPSAwOworCisjaWZkZWYgQ09ORklHX0RTQ0M0X1BDSVNZTkMKKwlpZiAocG9ydCA+PSAyKQorCQlyZXQgPSAtMTsKKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBEUzEgcC4xMzc6ICJUaGVyZSBhcmUgYSB0b3RhbCBvZiAxMyBkaWZmZXJlbnQgY2xvY2tpbmcgbW9kZXMuLi4iCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXgorICogRGVzaWduIGNob2ljZXM6CisgKiAtIGJ5IGRlZmF1bHQsIGFzc3VtZSBhIGNsb2NrIGlzIHByb3ZpZGVkIG9uIHBpbiBSeENsay9UeENsayAoY2xvY2sgbW9kZSAwYSkuCisgKiAgIENsb2NrIG1vZGUgM2IgX3Nob3VsZF8gd29yayBidXQgdGhlIHRlc3Rpbmcgc2VlbXMgdG8gbWFrZSB0aGlzIHBvaW50CisgKiAgIGR1YmlvdXMgKERJWSB0ZXN0aW5nIHJlcXVpcmVzIHNldHRpbmcgQ0NSMCBhdCAweDAwMDAwMDMzKS4KKyAqICAgVGhpcyBpcyBzdXBwb3NlZCB0byBwcm92aWRlIGxlYXN0IHN1cnByaXNlICJEVEUgbGlrZSIgYmVoYXZpb3IuCisgKiAtIGlmIGxpbmUgcmF0ZSBpcyBzcGVjaWZpZWQsIGNsb2NrcyBhcmUgYXNzdW1lZCB0byBiZSBsb2NhbGx5IGdlbmVyYXRlZC4KKyAqICAgQSBxdWFydHogbXVzdCBiZSBhdmFpbGFibGUgKG9uIHBpbiBYVEFMMSkuIE1vZGVzIDZiLzdiIGFyZSB1c2VkLiBDaG9vc2luZworICogICBiZXR3ZWVuIHRoZXNlIGl0IGF1dG9tYWdpY2FsbHkgZG9uZSBhY2NvcmRpbmcgb24gdGhlIHJlcXVpcmVkIGZyZXF1ZW5jeQorICogICBzY2FsaW5nLiBPZiBjb3Vyc2Ugc29tZSByb3VuZGluZyBtYXkgdGFrZSBwbGFjZS4KKyAqIC0gbm8gaGlnaCBzcGVlZCBtb2RlICg0ME1iL3MpLiBNYXkgYmUgdHJpdmlhbCB0byBkbyBidXQgSSBkb24ndCBoYXZlIGFuCisgKiAgIGFwcHJvcHJpYXRlIGV4dGVybmFsIGNsb2NraW5nIGRldmljZSBmb3IgdGVzdGluZy4KKyAqIC0gbm8gdGltZS1zbG90L2Nsb2NrIG1vZGUgNTogc2hhbWVsZXNzIGxhenluZXNzLgorICoKKyAqIFRoZSBjbG9jayBzaWduYWxzIHdpcmluZyBjYW4gYmUgKGlzID8pIG1hbnVmYWN0dXJlciBkZXBlbmRhbnQuIEdvb2QgbHVjay4KKyAqCisgKiBCSUcgRkFUIFdBUk5JTkc6IGlmIHRoZSBkZXZpY2UgaXNuJ3QgcHJvdmlkZWQgZW5vdWdoIGNsb2NraW5nIHNpZ25hbCwgaXQKKyAqIHdvbid0IHBhc3MgdGhlIGluaXQgc2VxdWVuY2UuIEZvciBleGFtcGxlLCBzdHJhaWdodCBiYWNrLXRvLWJhY2sgRFRFIHdpdGhvdXQKKyAqIGV4dGVybmFsIGNsb2NrIHdpbGwgZmFpbCB3aGVuIGRzY2M0X29wZW4oKSAoPC0gJ2lmY29uZmlnIGhkbGN4IHh4eCcpIGlzCisgKiBjYWxsZWQuCisgKgorICogVHlwb3MgbHVyayBpbiBkYXRhc2hlZXQgKG1pc3NpbmcgZGl2aWVyIGluIGNsb2NrIG1vZGUgN2EgZmlndXJlIDUxIHAuMTUzCisgKiBEUzAgZm9yIGV4YW1wbGUpCisgKgorICogQ2xvY2sgbW9kZSByZWxhdGVkIGJpdHMgb2YgQ0NSMDoKKyAqICAgICArLS0tLS0tLS0tLS0tIFRPRTogb3V0cHV0IFR4Q2xrICgwYi8yYi8zYS8zYi82Yi83YS83YiBvbmx5KQorICogICAgIHwgKy0tLS0tLS0tLS0gU1NFTDogc3ViLW1vZGUgc2VsZWN0IDAgLT4gYSwgMSAtPiBiCisgKiAgICAgfCB8ICstLS0tLS0tLSBIaWdoIFNwZWVkOiBzYXkgMAorICogICAgIHwgfCB8ICstKy0rLS0gQ2xvY2sgTW9kZTogMC4uNworICogICAgIHwgfCB8IHwgfCB8CisgKiAtKy0rLSstKy0rLSstKy0rCisgKiB4fHh8NXw0fDN8MnwxfDB8IGxvd2VyIGJpdHMKKyAqCisgKiBEaXZpc2lvbiBmYWN0b3Igb2YgQlJSOiBrID0gKE4rMSl4Ml5NICh0b3RhbCBkaXZpZGVyID0gMTZ4ayBpbiBtb2RlIDZiKQorICogICAgICAgICAgICArLSstKy0rLS0tLS0tLS0tLS0tLS0tLS0tIE0gKDAuLjE1KQorICogICAgICAgICAgICB8IHwgfCB8ICAgICArLSstKy0rLSstKy0tIE4gKDAuLjYzKQorICogICAgMCAwIDAgMCB8IHwgfCB8IDAgMCB8IHwgfCB8IHwgfAorICogLi4uLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgIGZ8ZXxkfGN8YnxhfDl8OHw3fDZ8NXw0fDN8MnwxfDB8IGxvd2VyIGJpdHMKKyAqCisgKi8KK3N0YXRpYyBpbnQgZHNjYzRfc2V0X2Nsb2NrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiAqYnBzLCB1MzIgKnN0YXRlKQoreworCXN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYgPSBkc2NjNF9wcml2KGRldik7CisJaW50IHJldCA9IC0xOworCXUzMiBicnI7CisKKwkqc3RhdGUgJj0gfkNjcjBDbG9ja01hc2s7CisJaWYgKCpicHMpIHsgLyogQ2xvY2sgZ2VuZXJhdGVkIC0gcmVxdWlyZWQgZm9yIERDRSAqLworCQl1MzIgbiA9IDAsIG0gPSAwLCBkaXZpZGVyOworCQlpbnQgeHRhbDsKKworCQl4dGFsID0gZHByaXYtPnBjaV9wcml2LT54dGFsX2h6OworCQlpZiAoIXh0YWwpCisJCQlnb3RvIGRvbmU7CisJCWlmIChkc2NjNF9jaGVja19jbG9ja19hYmlsaXR5KGRwcml2LT5kZXZfaWQpIDwgMCkKKwkJCWdvdG8gZG9uZTsKKwkJZGl2aWRlciA9IHh0YWwgLyAqYnBzOworCQlpZiAoZGl2aWRlciA+IEJSUl9ESVZJREVSX01BWCkgeworCQkJZGl2aWRlciA+Pj0gNDsKKwkJCSpzdGF0ZSB8PSAweDAwMDAwMDM2OyAvKiBDbG9jayBtb2RlIDZiIChCUkcvMTYpICovCisJCX0gZWxzZQorCQkJKnN0YXRlIHw9IDB4MDAwMDAwMzc7IC8qIENsb2NrIG1vZGUgN2IgKEJSRykgKi8KKwkJaWYgKGRpdmlkZXIgPj4gMjIpIHsKKwkJCW4gPSA2MzsKKwkJCW0gPSAxNTsKKwkJfSBlbHNlIGlmIChkaXZpZGVyKSB7CisJCQkvKiBFeHRyYWN0aW9uIG9mIHRoZSA2IGhpZ2hlc3Qgd2VpZ2h0ZWQgYml0cyAqLworCQkJbSA9IDA7CisJCQl3aGlsZSAoMHhmZmZmZmZjMCAmIGRpdmlkZXIpIHsKKwkJCQltKys7CisJCQkJZGl2aWRlciA+Pj0gMTsKKwkJCX0KKwkJCW4gPSBkaXZpZGVyOworCQl9CisJCWJyciA9IChtIDw8IDgpIHwgbjsKKwkJZGl2aWRlciA9IG4gPDwgbTsKKwkJaWYgKCEoKnN0YXRlICYgMHgwMDAwMDAwMSkpIC8qID9iIG1vZGUgbWFzayA9PiBjbG9jayBtb2RlIDZiICovCisJCQlkaXZpZGVyIDw8PSA0OworCQkqYnBzID0geHRhbCAvIGRpdmlkZXI7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRXh0ZXJuYWwgY2xvY2sgLSBEVEUKKwkJICogInN0YXRlIiBhbHJlYWR5IHJlZmxlY3RzIENsb2NrIG1vZGUgMGEgKENDUjAgPSAweHp6enp6ejAwKS4KKwkJICogTm90aGluZyBtb3JlIHRvIGJlIGRvbmUKKwkJICovCisJCWJyciA9IDA7CisJfQorCXNjY193cml0ZWwoYnJyLCBkcHJpdiwgZGV2LCBCUlIpOworCXJldCA9IDA7Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHNjYzRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3luY19zZXJpYWxfc2V0dGluZ3MgX191c2VyICpsaW5lID0gaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3Uuc3luYzsKKwlzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2ID0gZHNjYzRfcHJpdihkZXYpOworCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKGRwcml2LT5zZXR0aW5ncyk7CisJaW50IHJldCA9IDA7CisKKyAgICAgICAgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKworCWlmIChjbWQgIT0gU0lPQ1dBTkRFVikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJc3dpdGNoKGlmci0+aWZyX3NldHRpbmdzLnR5cGUpIHsKKwljYXNlIElGX0dFVF9JRkFDRToKKwkJaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9IElGX0lGQUNFX1NZTkNfU0VSSUFMOworCQlpZiAoaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA8IHNpemUpIHsKKwkJCWlmci0+aWZyX3NldHRpbmdzLnNpemUgPSBzaXplOyAvKiBkYXRhIHNpemUgd2FudGVkICovCisJCQlyZXR1cm4gLUVOT0JVRlM7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihsaW5lLCAmZHByaXYtPnNldHRpbmdzLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKworCWNhc2UgSUZfSUZBQ0VfU1lOQ19TRVJJQUw6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKGRwcml2LT5mbGFncyAmIEZha2VSZXNldCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBsZWFzZSByZXNldCB0aGUgZGV2aWNlIgorCQkJICAgICAgICIgYmVmb3JlIHRoaXMgY29tbWFuZFxuIiwgZGV2LT5uYW1lKTsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZkcHJpdi0+c2V0dGluZ3MsIGxpbmUsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldCA9IGRzY2M0X3NldF9pZmFjZShkcHJpdiwgZGV2KTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRzY2M0X21hdGNoKHN0cnVjdCB0aGluZ2llICpwLCBpbnQgdmFsdWUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBwW2ldLmRlZmluZSAhPSAtMTsgaSsrKSB7CisJCWlmICh2YWx1ZSA9PSBwW2ldLmRlZmluZSkKKwkJCWJyZWFrOworCX0KKwlpZiAocFtpXS5kZWZpbmUgPT0gLTEpCisJCXJldHVybiAtMTsKKwllbHNlCisJCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IGRzY2M0X2Nsb2NrX3NldHRpbmcoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN5bmNfc2VyaWFsX3NldHRpbmdzICpzZXR0aW5ncyA9ICZkcHJpdi0+c2V0dGluZ3M7CisJaW50IHJldCA9IC1FT1BOT1RTVVBQOworCXUzMiBicHMsIHN0YXRlOworCisJYnBzID0gc2V0dGluZ3MtPmNsb2NrX3JhdGU7CisJc3RhdGUgPSBzY2NfcmVhZGwoZHByaXYsIENDUjApOworCWlmIChkc2NjNF9zZXRfY2xvY2soZGV2LCAmYnBzLCAmc3RhdGUpIDwgMCkKKwkJZ290byBkb25lOworCWlmIChicHMpIHsgLyogRENFICovCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZ2VuZXJhdGVkIFJ4Q2xrIChEQ0UpXG4iLCBkZXYtPm5hbWUpOworCQlpZiAoc2V0dGluZ3MtPmNsb2NrX3JhdGUgIT0gYnBzKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNsb2NrIGFkanVzdGVkICglMDhkIC0+ICUwOGQpXG4iLAorCQkJCWRldi0+bmFtZSwgc2V0dGluZ3MtPmNsb2NrX3JhdGUsIGJwcyk7CisJCQlzZXR0aW5ncy0+Y2xvY2tfcmF0ZSA9IGJwczsKKwkJfQorCX0gZWxzZSB7IC8qIERURSAqLworCQlzdGF0ZSB8PSBQb3dlclVwIHwgVmlzOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4dGVybmFsIFJ4Q2xrIChEVEUpXG4iLCBkZXYtPm5hbWUpOworCX0KKwlzY2Nfd3JpdGVsKHN0YXRlLCBkcHJpdiwgZGV2LCBDQ1IwKTsKKwlyZXQgPSAwOworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRzY2M0X2VuY29kaW5nX3NldHRpbmcoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRoaW5naWUgZW5jb2RpbmdbXSA9IHsKKwkJeyBFTkNPRElOR19OUlosCQkweDAwMDAwMDAwIH0sCisJCXsgRU5DT0RJTkdfTlJaSSwJMHgwMDIwMDAwMCB9LAorCQl7IEVOQ09ESU5HX0ZNX01BUkssCTB4MDA0MDAwMDAgfSwKKwkJeyBFTkNPRElOR19GTV9TUEFDRSwJMHgwMDUwMDAwMCB9LAorCQl7IEVOQ09ESU5HX01BTkNIRVNURVIsCTB4MDA2MDAwMDAgfSwKKwkJeyAtMSwJCQkwfQorCX07CisJaW50IGksIHJldCA9IDA7CisKKwlpID0gZHNjYzRfbWF0Y2goZW5jb2RpbmcsIGRwcml2LT5lbmNvZGluZyk7CisJaWYgKGkgPj0gMCkKKwkJc2NjX3BhdGNobChFbmNvZGluZ01hc2ssIGVuY29kaW5nW2ldLmJpdHMsIGRwcml2LCBkZXYsIENDUjApOworCWVsc2UKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkc2NjNF9sb29wYmFja19zZXR0aW5nKHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYsCisJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN5bmNfc2VyaWFsX3NldHRpbmdzICpzZXR0aW5ncyA9ICZkcHJpdi0+c2V0dGluZ3M7CisJdTMyIHN0YXRlOworCisJc3RhdGUgPSBzY2NfcmVhZGwoZHByaXYsIENDUjEpOworCWlmIChzZXR0aW5ncy0+bG9vcGJhY2spIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBsb29wYmFja1xuIiwgZGV2LT5uYW1lKTsKKwkJc3RhdGUgfD0gMHgwMDAwMDEwMDsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG5vcm1hbFxuIiwgZGV2LT5uYW1lKTsKKwkJc3RhdGUgJj0gfjB4MDAwMDAxMDA7CisJfQorCXNjY193cml0ZWwoc3RhdGUsIGRwcml2LCBkZXYsIENDUjEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzY2M0X2NyY19zZXR0aW5nKHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqZHByaXYsCisJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRoaW5naWUgY3JjW10gPSB7CisJCXsgUEFSSVRZX0NSQzE2X1BSMF9DQ0lUVCwJMHgwMDAwMDAxMCB9LAorCQl7IFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQsCTB4MDAwMDAwMDAgfSwKKwkJeyBQQVJJVFlfQ1JDMzJfUFIwX0NDSVRULAkweDAwMDAwMDExIH0sCisJCXsgUEFSSVRZX0NSQzMyX1BSMV9DQ0lUVCwJMHgwMDAwMDAwMSB9CisJfTsKKwlpbnQgaSwgcmV0ID0gMDsKKworCWkgPSBkc2NjNF9tYXRjaChjcmMsIGRwcml2LT5wYXJpdHkpOworCWlmIChpID49IDApCisJCXNjY19wYXRjaGwoQ3JjTWFzaywgY3JjW2ldLmJpdHMsIGRwcml2LCBkZXYsIENDUjEpOworCWVsc2UKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkc2NjNF9zZXRfaWZhY2Uoc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeworCQlpbnQgKCphY3Rpb24pKHN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKwl9ICpwLCBkb19zZXR0aW5nW10gPSB7CisJCXsgZHNjYzRfZW5jb2Rpbmdfc2V0dGluZyB9LAorCQl7IGRzY2M0X2Nsb2NrX3NldHRpbmcgfSwKKwkJeyBkc2NjNF9sb29wYmFja19zZXR0aW5nIH0sCisJCXsgZHNjYzRfY3JjX3NldHRpbmcgfSwKKwkJeyBOVUxMIH0KKwl9OworCWludCByZXQgPSAwOworCisJZm9yIChwID0gZG9fc2V0dGluZzsgcC0+YWN0aW9uOyBwKyspIHsKKwkJaWYgKChyZXQgPSBwLT5hY3Rpb24oZHByaXYsIGRldikpIDwgMCkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZHNjYzRfaXJxKGludCBpcnEsIHZvaWQgKnRva2VuLCBzdHJ1Y3QgcHRfcmVncyAqcHRyZWdzKQoreworCXN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqcm9vdCA9IHRva2VuOworCXN0cnVjdCBkc2NjNF9wY2lfcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCXUzMiBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpLCBoYW5kbGVkID0gMTsKKworCXByaXYgPSByb290LT5wY2lfcHJpdjsKKwlkZXYgPSBkc2NjNF90b19kZXYocm9vdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJaW9hZGRyID0gcm9vdC0+YmFzZV9hZGRyOworCisJc3RhdGUgPSByZWFkbChpb2FkZHIgKyBHU1RBUik7CisJaWYgKCFzdGF0ZSkgeworCQloYW5kbGVkID0gMDsKKwkJZ290byBvdXQ7CisJfQorCWlmIChkZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogR1NUQVIgPSAweCUwOHhcbiIsIERSVl9OQU1FLCBzdGF0ZSk7CisJd3JpdGVsKHN0YXRlLCBpb2FkZHIgKyBHU1RBUik7CisKKwlpZiAoc3RhdGUgJiBBcmYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbHVyZSAoQXJmKS4gSGFyYXNzIHRoZSBtYWludGVuZXJcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisJc3RhdGUgJj0gfkFyQWNrOworCWlmIChzdGF0ZSAmIENmZykgeworCQlpZiAoZGVidWcgPiAwKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDZmdJVlxuIiwgRFJWX05BTUUpOworCQlpZiAocHJpdi0+aXFjZmdbcHJpdi0+Y2ZnX2N1cisrJUlSUV9SSU5HX1NJWkVdICYgQXJmKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogJXMgZmFpbGVkXG4iLCBkZXYtPm5hbWUsICJDRkciKTsKKwkJaWYgKCEoc3RhdGUgJj0gfkNmZykpCisJCQlnb3RvIG91dDsKKwl9CisJaWYgKHN0YXRlICYgUnhFdnQpIHsKKwkJaSA9IGRldl9wZXJfY2FyZCAtIDE7CisJCWRvIHsKKwkJCWRzY2M0X3J4X2lycShwcml2LCByb290ICsgaSk7CisJCX0gd2hpbGUgKC0taSA+PSAwKTsKKwkJc3RhdGUgJj0gflJ4RXZ0OworCX0KKwlpZiAoc3RhdGUgJiBUeEV2dCkgeworCQlpID0gZGV2X3Blcl9jYXJkIC0gMTsKKwkJZG8geworCQkJZHNjYzRfdHhfaXJxKHByaXYsIHJvb3QgKyBpKTsKKwkJfSB3aGlsZSAoLS1pID49IDApOworCQlzdGF0ZSAmPSB+VHhFdnQ7CisJfQorb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIHZvaWQgZHNjYzRfdHhfaXJxKHN0cnVjdCBkc2NjNF9wY2lfcHJpdiAqcHByaXYsCisJCQkJc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHNjYzRfdG9fZGV2KGRwcml2KTsKKwl1MzIgc3RhdGU7CisJaW50IGN1ciwgbG9vcCA9IDA7CisKK3RyeToKKwljdXIgPSBkcHJpdi0+aXF0eF9jdXJyZW50JUlSUV9SSU5HX1NJWkU7CisJc3RhdGUgPSBkcHJpdi0+aXF0eFtjdXJdOworCWlmICghc3RhdGUpIHsKKwkJaWYgKGRlYnVnID4gNCkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHggSVNSID0gMHglMDh4XG4iLCBkZXYtPm5hbWUsCisJCQkgICAgICAgc3RhdGUpOworCQlpZiAoKGRlYnVnID4gMSkgJiYgKGxvb3AgPiAxKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHggaXJxIGxvb3A9JWRcbiIsIGRldi0+bmFtZSwgbG9vcCk7CisJCWlmIChsb29wICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJCWlmICgoZHByaXYtPnR4X2N1cnJlbnQgLSBkcHJpdi0+dHhfZGlydHkpJVRYX1JJTkdfU0laRSkKKwkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSAmJiBkc2NjNF90eF9xdWllc2NlbnQoZHByaXYsIGRldikgJiYKKwkJICAgICFkc2NjNF90eF9kb25lKGRwcml2KSkKKwkJCQlkc2NjNF9kb190eChkcHJpdiwgZGV2KTsKKwkJcmV0dXJuOworCX0KKwlsb29wKys7CisJZHByaXYtPmlxdHhbY3VyXSA9IDA7CisJZHByaXYtPmlxdHhfY3VycmVudCsrOworCisJaWYgKHN0YXRlX2NoZWNrKHN0YXRlLCBkcHJpdiwgZGV2LCAiVHgiKSA8IDApCisJCXJldHVybjsKKworCWlmIChzdGF0ZSAmIFNjY0V2dCkgeworCQlpZiAoc3RhdGUgJiBBbGxzKSB7CisJCQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJc3RydWN0IFR4RkQgKnR4X2ZkOworCisJCQlpZiAoZGVidWcgPiAyKQorCQkJCWRzY2M0X3R4X3ByaW50KGRldiwgZHByaXYsICJBbGxzIik7CisJCQkvKgorCQkJICogRGF0YUNvbXBsZXRlIGNhbid0IGJlIHRydXN0ZWQgZm9yIFR4IGNvbXBsZXRpb24uCisJCQkgKiBDZiBlcnJhdGEgRFM1IHAuOAorCQkJICovCisJCQljdXIgPSBkcHJpdi0+dHhfZGlydHklVFhfUklOR19TSVpFOworCQkJdHhfZmQgPSBkcHJpdi0+dHhfZmQgKyBjdXI7CisJCQlza2IgPSBkcHJpdi0+dHhfc2tidWZmW2N1cl07CisJCQlpZiAoc2tiKSB7CisJCQkJcGNpX3VubWFwX3NpbmdsZShwcHJpdi0+cGRldiwgdHhfZmQtPmRhdGEsCisJCQkJCQkgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCWlmICh0eF9mZC0+c3RhdGUgJiBGcmFtZUVuZCkgeworCQkJCQlzdGF0cy0+dHhfcGFja2V0cysrOworCQkJCQlzdGF0cy0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQkJfQorCQkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQkJZHByaXYtPnR4X3NrYnVmZltjdXJdID0gTlVMTDsKKwkJCQkrK2Rwcml2LT50eF9kaXJ0eTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGRlYnVnID4gMSkKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICIlcyBUeDogTlVMTCBza2IgJWRcbiIsCisJCQkJCQlkZXYtPm5hbWUsIGN1cik7CisJCQl9CisJCQkvKgorCQkJICogSWYgdGhlIGRyaXZlciBlbmRzIHNlbmRpbmcgY3JhcCBvbiB0aGUgd2lyZSwgaXQKKwkJCSAqIHdpbGwgYmUgd2F5IGVhc2llciB0byBkaWFnbm9zZSB0aGFuIHRoZSAobm90IHNvKQorCQkJICogcmFuZG9tIGZyZWV6ZSBpbmR1Y2VkIGJ5IG51bGwgc2l6ZWQgdHggZnJhbWVzLgorCQkJICovCisJCQl0eF9mZC0+ZGF0YSA9IHR4X2ZkLT5uZXh0OworCQkJdHhfZmQtPnN0YXRlID0gRnJhbWVFbmQgfCBUT19TVEFURV9UWCgyKkRVTU1ZX1NLQl9TSVpFKTsKKwkJCXR4X2ZkLT5jb21wbGV0ZSA9IDB4MDAwMDAwMDA7CisJCQl0eF9mZC0+amlmZmllcyA9IDA7CisKKwkJCWlmICghKHN0YXRlICY9IH5BbGxzKSkKKwkJCQlnb3RvIHRyeTsKKwkJfQorCQkvKgorCQkgKiBUcmFuc21pdCBEYXRhIFVuZGVycnVuCisJCSAqLworCQlpZiAoc3RhdGUgJiBYZHUpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFhEVS4gQXNrIG1haW50YWluZXJcbiIsIERSVl9OQU1FKTsKKwkJCWRwcml2LT5mbGFncyA9IE5lZWRJRFQ7CisJCQkvKiBUeCByZXNldCAqLworCQkJd3JpdGVsKE1URmkgfCBSZHQsCisJCQkgICAgICAgZHByaXYtPmJhc2VfYWRkciArIDB4MGMqZHByaXYtPmRldl9pZCArIENIMENGRyk7CisJCQl3cml0ZWwoQWN0aW9uLCBkcHJpdi0+YmFzZV9hZGRyICsgR0NNRFIpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChzdGF0ZSAmIEN0cykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENUUyB0cmFuc2l0aW9uXG4iLCBkZXYtPm5hbWUpOworCQkJaWYgKCEoc3RhdGUgJj0gfkN0cykpIC8qIERFQlVHICovCisJCQkJZ290byB0cnk7CisJCX0KKwkJaWYgKHN0YXRlICYgWG1yKSB7CisJCQkvKiBGcmFtZSBuZWVkcyB0byBiZSBzZW50IGFnYWluIC0gRklYTUUgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFhtci4gQXNrIG1haW50YWluZXJcbiIsIERSVl9OQU1FKTsKKwkJCWlmICghKHN0YXRlICY9IH5YbXIpKSAvKiBERUJVRyAqLworCQkJCWdvdG8gdHJ5OworCQl9CisJCWlmIChzdGF0ZSAmIFhwcikgeworCQkJdm9pZCBfX2lvbWVtICpzY2NfYWRkcjsKKwkJCXVuc2lnbmVkIGxvbmcgcmluZzsKKwkJCWludCBpOworCisJCQkvKgorCQkJICogLSB0aGUgYnVzeSBjb25kaXRpb24gaGFwcGVucyAoc29tZXRpbWVzKTsKKwkJCSAqIC0gaXQgZG9lc24ndCBzZWVtIHRvIG1ha2UgdGhlIGhhbmRsZXIgdW5yZWxpYWJsZS4KKwkJCSAqLworCQkJZm9yIChpID0gMTsgaTsgaSA8PD0gMSkgeworCQkJCWlmICghKHNjY19yZWFkbF9zdGFyKGRwcml2LCBkZXYpICYgU2NjQnVzeSkpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFpKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzIGJ1c3kgaW4gaXJxXG4iLCBkZXYtPm5hbWUpOworCisJCQlzY2NfYWRkciA9IGRwcml2LT5iYXNlX2FkZHIgKyAweDBjKmRwcml2LT5kZXZfaWQ7CisJCQkvKiBLZWVwIHRoaXMgb3JkZXI6IElEVCBiZWZvcmUgSURSICovCisJCQlpZiAoZHByaXYtPmZsYWdzICYgTmVlZElEVCkgeworCQkJCWlmIChkZWJ1ZyA+IDIpCisJCQkJCWRzY2M0X3R4X3ByaW50KGRldiwgZHByaXYsICJYcHIiKTsKKwkJCQlyaW5nID0gZHByaXYtPnR4X2ZkX2RtYSArCisJCQkJICAgICAgIChkcHJpdi0+dHhfZGlydHklVFhfUklOR19TSVpFKSoKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBUeEZEKTsKKwkJCQl3cml0ZWwocmluZywgc2NjX2FkZHIgKyBDSDBCVERBKTsKKwkJCQlkc2NjNF9kb190eChkcHJpdiwgZGV2KTsKKwkJCQl3cml0ZWwoTVRGaSB8IElkdCwgc2NjX2FkZHIgKyBDSDBDRkcpOworCQkJCWlmIChkc2NjNF9kb19hY3Rpb24oZGV2LCAiSURUIikgPCAwKQorCQkJCQlnb3RvIGVycl94cHI7CisJCQkJZHByaXYtPmZsYWdzICY9IH5OZWVkSURUOworCQkJfQorCQkJaWYgKGRwcml2LT5mbGFncyAmIE5lZWRJRFIpIHsKKwkJCQlyaW5nID0gZHByaXYtPnJ4X2ZkX2RtYSArCisJCQkJICAgICAgIChkcHJpdi0+cnhfY3VycmVudCVSWF9SSU5HX1NJWkUpKgorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IFJ4RkQpOworCQkJCXdyaXRlbChyaW5nLCBzY2NfYWRkciArIENIMEJSREEpOworCQkJCWRzY2M0X3J4X3VwZGF0ZShkcHJpdiwgZGV2KTsKKwkJCQl3cml0ZWwoTVRGaSB8IElkciwgc2NjX2FkZHIgKyBDSDBDRkcpOworCQkJCWlmIChkc2NjNF9kb19hY3Rpb24oZGV2LCAiSURSIikgPCAwKQorCQkJCQlnb3RvIGVycl94cHI7CisJCQkJZHByaXYtPmZsYWdzICY9IH5OZWVkSURSOworCQkJCXNtcF93bWIoKTsKKwkJCQkvKiBBY3RpdmF0ZSByZWNlaXZlciBhbmQgbWlzYyAqLworCQkJCXNjY193cml0ZWwoMHgwODA1MDAwOCwgZHByaXYsIGRldiwgQ0NSMik7CisJCQl9CisJCWVycl94cHI6CisJCQlpZiAoIShzdGF0ZSAmPSB+WHByKSkKKwkJCQlnb3RvIHRyeTsKKwkJfQorCQlpZiAoc3RhdGUgJiBDZCkgeworCQkJaWYgKGRlYnVnID4gMCkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ0QgdHJhbnNpdGlvblxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmICghKHN0YXRlICY9IH5DZCkpIC8qIERFQlVHICovCisJCQkJZ290byB0cnk7CisJCX0KKwl9IGVsc2UgeyAvKiAhIFNjY0V2dCAqLworCQlpZiAoc3RhdGUgJiBIaSkgeworI2lmZGVmIERTQ0M0X1BPTExJTkcKKwkJCXdoaWxlICghZHNjYzRfdHhfcG9sbChkcHJpdiwgZGV2KSk7CisjZW5kaWYKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUeCBIaVxuIiwgZGV2LT5uYW1lKTsKKwkJCXN0YXRlICY9IH5IaTsKKwkJfQorCQlpZiAoc3RhdGUgJiBFcnIpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUeCBFUlJcbiIsIGRldi0+bmFtZSk7CisJCQloZGxjX3N0YXRzKGRldiktPnR4X2Vycm9ycysrOworCQkJc3RhdGUgJj0gfkVycjsKKwkJfQorCX0KKwlnb3RvIHRyeTsKK30KKworc3RhdGljIHZvaWQgZHNjYzRfcnhfaXJxKHN0cnVjdCBkc2NjNF9wY2lfcHJpdiAqcHJpdiwKKwkJCQkgICAgc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHNjYzRfdG9fZGV2KGRwcml2KTsKKwl1MzIgc3RhdGU7CisJaW50IGN1cjsKKwordHJ5OgorCWN1ciA9IGRwcml2LT5pcXJ4X2N1cnJlbnQlSVJRX1JJTkdfU0laRTsKKwlzdGF0ZSA9IGRwcml2LT5pcXJ4W2N1cl07CisJaWYgKCFzdGF0ZSkKKwkJcmV0dXJuOworCWRwcml2LT5pcXJ4W2N1cl0gPSAwOworCWRwcml2LT5pcXJ4X2N1cnJlbnQrKzsKKworCWlmIChzdGF0ZV9jaGVjayhzdGF0ZSwgZHByaXYsIGRldiwgIlJ4IikgPCAwKQorCQlyZXR1cm47CisKKwlpZiAoIShzdGF0ZSAmIFNjY0V2dCkpeworCQlzdHJ1Y3QgUnhGRCAqcnhfZmQ7CisKKwkJaWYgKGRlYnVnID4gNCkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUnggSVNSID0gMHglMDh4XG4iLCBkZXYtPm5hbWUsCisJCQkgICAgICAgc3RhdGUpOworCQlzdGF0ZSAmPSAweDAwZmZmZmZmOworCQlpZiAoc3RhdGUgJiBFcnIpIHsgLyogSG9sZCBvciByZXNldCAqLworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSeCBFUlJcbiIsIGRldi0+bmFtZSk7CisJCQljdXIgPSBkcHJpdi0+cnhfY3VycmVudCVSWF9SSU5HX1NJWkU7CisJCQlyeF9mZCA9IGRwcml2LT5yeF9mZCArIGN1cjsKKwkJCS8qCisJCQkgKiBQcmVzdW1lIHdlJ3JlIG5vdCBmYWNpbmcgYSBETUFDIHJlY2VpdmVyIHJlc2V0LgorCQkJICogQXMgV2UgdXNlIHRoZSByeCBzaXplLWZpbHRlcmluZyBmZWF0dXJlIG9mIHRoZQorCQkJICogRFNDQzQsIHRoZSBiZWdpbm5pbmcgb2YgYSBuZXcgZnJhbWUgaXMgd2FpdGluZyBpbgorCQkJICogdGhlIHJ4IGZpZm8uIEkgYmV0IGEgUmVjZWl2ZSBEYXRhIE92ZXJmbG93IHdpbGwKKwkJCSAqIGhhcHBlbiBtb3N0IG9mIHRpbWUgYnV0IGxldCdzIHRyeSBhbmQgYXZvaWQgaXQuCisJCQkgKiBCdHcgKGFzIGZvciBSRE8pIGlmIG9uZSBleHBlcmllbmNlcyBFUlIgd2hlcmVhcworCQkJICogdGhlIHN5c3RlbSBsb29rcyByYXRoZXIgaWRsZSwgdGhlcmUgbWF5IGJlIGEKKwkJCSAqIHByb2JsZW0gd2l0aCBsYXRlbmN5LiBJbiB0aGlzIGNhc2UsIGluY3JlYXNpbmcKKwkJCSAqIFJYX1JJTkdfU0laRSBtYXkgaGVscC4KKwkJCSAqLworCQkJLy93aGlsZSAoZHByaXYtPnJ4X25lZWRzX3JlZmlsbCkgeworCQkJCXdoaWxlICghKHJ4X2ZkLT5zdGF0ZTEgJiBIb2xkKSkgeworCQkJCQlyeF9mZCsrOworCQkJCQljdXIrKzsKKwkJCQkJaWYgKCEoY3VyID0gY3VyJVJYX1JJTkdfU0laRSkpCisJCQkJCQlyeF9mZCA9IGRwcml2LT5yeF9mZDsKKwkJCQl9CisJCQkJLy9kcHJpdi0+cnhfbmVlZHNfcmVmaWxsLS07CisJCQkJdHJ5X2dldF9yeF9za2IoZHByaXYsIGRldik7CisJCQkJaWYgKCFyeF9mZC0+ZGF0YSkKKwkJCQkJZ290byB0cnk7CisJCQkJcnhfZmQtPnN0YXRlMSAmPSB+SG9sZDsKKwkJCQlyeF9mZC0+c3RhdGUyID0gMHgwMDAwMDAwMDsKKwkJCQlyeF9mZC0+ZW5kID0gMHhiYWJlZmFjZTsKKwkJCS8vfQorCQkJZ290byB0cnk7CisJCX0KKwkJaWYgKHN0YXRlICYgRmkpIHsKKwkJCWRzY2M0X3J4X3NrYihkcHJpdiwgZGV2KTsKKwkJCWdvdG8gdHJ5OworCQl9CisJCWlmIChzdGF0ZSAmIEhpICkgeyAvKiBISSBiaXQgKi8KKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSeCBIaVxuIiwgZGV2LT5uYW1lKTsKKwkJCXN0YXRlICY9IH5IaTsKKwkJCWdvdG8gdHJ5OworCQl9CisJfSBlbHNlIHsgLyogU2NjRXZ0ICovCisJCWlmIChkZWJ1ZyA+IDEpIHsKKwkJCS8vRklYTUU6IHZlcmlmaWVyIGxhIHByZXNlbmNlIGRlIHRvdXMgbGVzIGV2ZW5lbWVudHMKKwkJc3RhdGljIHN0cnVjdCB7CisJCQl1MzIgbWFzazsKKwkJCWNvbnN0IGNoYXIgKmlycV9uYW1lOworCQl9IGV2dHNbXSA9IHsKKwkJCXsgMHgwMDAwODAwMCwgIlRJTiJ9LAorCQkJeyAweDAwMDAwMDIwLCAiUlNDIn0sCisJCQl7IDB4MDAwMDAwMTAsICJQQ0UifSwKKwkJCXsgMHgwMDAwMDAwOCwgIlBMTEEifSwKKwkJCXsgMCwgTlVMTH0KKwkJfSwgKmV2dDsKKworCQlmb3IgKGV2dCA9IGV2dHM7IGV2dC0+aXJxX25hbWU7IGV2dCsrKSB7CisJCQlpZiAoc3RhdGUgJiBldnQtPm1hc2spIHsKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlc1xuIiwKKwkJCQkJCWRldi0+bmFtZSwgZXZ0LT5pcnFfbmFtZSk7CisJCQkJaWYgKCEoc3RhdGUgJj0gfmV2dC0+bWFzaykpCisJCQkJCWdvdG8gdHJ5OworCQkJfQorCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoIShzdGF0ZSAmPSB+MHgwMDAwYzAzYykpCisJCQkJZ290byB0cnk7CisJCX0KKwkJaWYgKHN0YXRlICYgQ3RzKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ1RTIHRyYW5zaXRpb25cbiIsIGRldi0+bmFtZSk7CisJCQlpZiAoIShzdGF0ZSAmPSB+Q3RzKSkgLyogREVCVUcgKi8KKwkJCQlnb3RvIHRyeTsKKwkJfQorCQkvKgorCQkgKiBSZWNlaXZlIERhdGEgT3ZlcmZsb3cgKEZJWE1FOiBmc2NrZWQpCisJCSAqLworCQlpZiAoc3RhdGUgJiBSZG8pIHsKKwkJCXN0cnVjdCBSeEZEICpyeF9mZDsKKwkJCXZvaWQgX19pb21lbSAqc2NjX2FkZHI7CisJCQlpbnQgY3VyOworCisJCQkvL2lmIChkZWJ1ZykKKwkJCS8vCWRzY2M0X3J4X2R1bXAoZHByaXYpOworCQkJc2NjX2FkZHIgPSBkcHJpdi0+YmFzZV9hZGRyICsgMHgwYypkcHJpdi0+ZGV2X2lkOworCisJCQlzY2NfcGF0Y2hsKFJ4QWN0aXZhdGUsIDAsIGRwcml2LCBkZXYsIENDUjIpOworCQkJLyoKKwkJCSAqIFRoaXMgaGFzIG5vIGVmZmVjdC4gV2h5ID8KKwkJCSAqIE9SZWQgd2l0aCBUeFNjY1Jlcywgb25lIHNlZXMgdGhlIENGRyBhY2sgKGZvcgorCQkJICogdGhlIFRYIHBhcnQgb25seSkuCisJCQkgKi8KKwkJCXNjY193cml0ZWwoUnhTY2NSZXMsIGRwcml2LCBkZXYsIENNRFIpOworCQkJZHByaXYtPmZsYWdzIHw9IFJkb1NldDsKKworCQkJLyoKKwkJCSAqIExldCdzIHRyeSBhbmQgc2F2ZSBzb21ldGhpbmcgaW4gdGhlIHJlY2VpdmVkIGRhdGEuCisJCQkgKiByeF9jdXJyZW50IG11c3QgYmUgaW5jcmVtZW50ZWQgYXQgbGVhc3Qgb25jZSB0bworCQkJICogYXZvaWQgSE9MRCBpbiB0aGUgQlJEQS10by1iZS1wb2ludGVkIGRlc2MuCisJCQkgKi8KKwkJCWRvIHsKKwkJCQljdXIgPSBkcHJpdi0+cnhfY3VycmVudCsrJVJYX1JJTkdfU0laRTsKKwkJCQlyeF9mZCA9IGRwcml2LT5yeF9mZCArIGN1cjsKKwkJCQlpZiAoIShyeF9mZC0+c3RhdGUyICYgRGF0YUNvbXBsZXRlKSkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKHJ4X2ZkLT5zdGF0ZTIgJiBGcmFtZUFib3J0ZWQpIHsKKwkJCQkJaGRsY19zdGF0cyhkZXYpLT5yeF9vdmVyX2Vycm9ycysrOworCQkJCQlyeF9mZC0+c3RhdGUxIHw9IEhvbGQ7CisJCQkJCXJ4X2ZkLT5zdGF0ZTIgPSAweDAwMDAwMDAwOworCQkJCQlyeF9mZC0+ZW5kID0gMHhiYWJlZmFjZTsKKwkJCQl9IGVsc2UKKwkJCQkJZHNjYzRfcnhfc2tiKGRwcml2LCBkZXYpOworCQkJfSB3aGlsZSAoMSk7CisKKwkJCWlmIChkZWJ1ZyA+IDApIHsKKwkJCQlpZiAoZHByaXYtPmZsYWdzICYgUmRvU2V0KQorCQkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCQkgICAgICAgIiVzOiBubyBSRE8gaW4gUnggZGF0YVxuIiwgRFJWX05BTUUpOworCQkJfQorI2lmZGVmIERTQ0M0X1JET19FWFBFUklNRU5UQUxfUkVDT1ZFUlkKKwkJCS8qCisJCQkgKiBGSVhNRTogbXVzdCB0aGUgcmVzZXQgYmUgdGhpcyB2aW9sZW50ID8KKwkJCSAqLworI3dhcm5pbmcgIkZJWE1FOiBDSDBCUkRBIgorCQkJd3JpdGVsKGRwcml2LT5yeF9mZF9kbWEgKworCQkJICAgICAgIChkcHJpdi0+cnhfY3VycmVudCVSWF9SSU5HX1NJWkUpKgorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgUnhGRCksIHNjY19hZGRyICsgQ0gwQlJEQSk7CisJCQl3cml0ZWwoTVRGaXxSZHJ8SWRyLCBzY2NfYWRkciArIENIMENGRyk7CisJCQlpZiAoZHNjYzRfZG9fYWN0aW9uKGRldiwgIlJEUiIpIDwgMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJETyByZWNvdmVyeSBmYWlsZWQoJXMpXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsICJSRFIiKTsKKwkJCQlnb3RvIHJkb19lbmQ7CisJCQl9CisJCQl3cml0ZWwoTVRGaXxJZHIsIHNjY19hZGRyICsgQ0gwQ0ZHKTsKKwkJCWlmIChkc2NjNF9kb19hY3Rpb24oZGV2LCAiSURSIikgPCAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUkRPIHJlY292ZXJ5IGZhaWxlZCglcylcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgIklEUiIpOworCQkJCWdvdG8gcmRvX2VuZDsKKwkJCX0KKwkJcmRvX2VuZDoKKyNlbmRpZgorCQkJc2NjX3BhdGNobCgwLCBSeEFjdGl2YXRlLCBkcHJpdiwgZGV2LCBDQ1IyKTsKKwkJCWdvdG8gdHJ5OworCQl9CisJCWlmIChzdGF0ZSAmIENkKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ0QgdHJhbnNpdGlvblxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmICghKHN0YXRlICY9IH5DZCkpIC8qIERFQlVHICovCisJCQkJZ290byB0cnk7CisJCX0KKwkJaWYgKHN0YXRlICYgRmxleCkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBGbGV4LiBUdHR0dC4uLlxuIiwgRFJWX05BTUUpOworCQkJaWYgKCEoc3RhdGUgJj0gfkZsZXgpKQorCQkJCWdvdG8gdHJ5OworCQl9CisJfQorfQorCisvKgorICogSSBoYWQgZXhwZWN0ZWQgdGhlIGZvbGxvd2luZyB0byB3b3JrIGZvciB0aGUgZmlyc3QgZGVzY3JpcHRvcgorICogKHR4X2ZkLT5zdGF0ZSA9IDB4YzAwMDAwMDApCisgKiAtIEhvbGQ9MSAoZG9uJ3QgdHJ5IGFuZCBicmFuY2ggdG8gdGhlIG5leHQgZGVzY3JpcHRvKTsKKyAqIC0gTm89MCAoSSB3YW50IGFuIGVtcHR5IGRhdGEgc2VjdGlvbiwgaS5lLiBzaXplPTApOworICogLSBGZT0xIChyZXF1aXJlZCBieSBObz0wIG9yIHdlIGdvdCBhbiBFcnIgaXJxIGFuZCBtdXN0IHJlc2V0KS4KKyAqIEl0IGZhaWxlZCBhbmQgbG9ja2VkIHNvbGlkLiBUaHVzIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYSBkdW1teSBza2IuCisgKiBQcm9ibGVtIGlzIGFja25vd2xlZGdlZCBpbiBlcnJhdGEgc2hlZXQgRFM1LiBKb3kgOm8vCisgKi8KK3N0cnVjdCBza19idWZmICpkc2NjNF9pbml0X2R1bW15X3NrYihzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKERVTU1ZX1NLQl9TSVpFKTsKKwlpZiAoc2tiKSB7CisJCWludCBsYXN0ID0gZHByaXYtPnR4X2RpcnR5JVRYX1JJTkdfU0laRTsKKwkJc3RydWN0IFR4RkQgKnR4X2ZkID0gZHByaXYtPnR4X2ZkICsgbGFzdDsKKworCQlza2ItPmxlbiA9IERVTU1ZX1NLQl9TSVpFOworCQltZW1jcHkoc2tiLT5kYXRhLCB2ZXJzaW9uLCBzdHJsZW4odmVyc2lvbiklRFVNTVlfU0tCX1NJWkUpOworCQl0eF9mZC0+c3RhdGUgPSBGcmFtZUVuZCB8IFRPX1NUQVRFX1RYKERVTU1ZX1NLQl9TSVpFKTsKKwkJdHhfZmQtPmRhdGEgPSBwY2lfbWFwX3NpbmdsZShkcHJpdi0+cGNpX3ByaXYtPnBkZXYsIHNrYi0+ZGF0YSwKKwkJCQkJICAgICBEVU1NWV9TS0JfU0laRSwgUENJX0RNQV9UT0RFVklDRSk7CisJCWRwcml2LT50eF9za2J1ZmZbbGFzdF0gPSBza2I7CisJfQorCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBpbnQgZHNjYzRfaW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiA9IGRzY2M0X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRwcml2LT5wY2lfcHJpdi0+cGRldjsKKwlzdHJ1Y3QgVHhGRCAqdHhfZmQ7CisJc3RydWN0IFJ4RkQgKnJ4X2ZkOworCXZvaWQgKnJpbmc7CisJaW50IGk7CisKKwlyaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgJmRwcml2LT5yeF9mZF9kbWEpOworCWlmICghcmluZykKKwkJZ290byBlcnJfb3V0OworCWRwcml2LT5yeF9mZCA9IHJ4X2ZkID0gKHN0cnVjdCBSeEZEICopIHJpbmc7CisKKwlyaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgJmRwcml2LT50eF9mZF9kbWEpOworCWlmICghcmluZykKKwkJZ290byBlcnJfZnJlZV9kbWFfcng7CisJZHByaXYtPnR4X2ZkID0gdHhfZmQgPSAoc3RydWN0IFR4RkQgKikgcmluZzsKKworCW1lbXNldChkcHJpdi0+dHhfc2tidWZmLCAwLCBzaXplb2Yoc3RydWN0IHNrX2J1ZmYgKikqVFhfUklOR19TSVpFKTsKKwlkcHJpdi0+dHhfZGlydHkgPSAweGZmZmZmZmZmOworCWkgPSBkcHJpdi0+dHhfY3VycmVudCA9IDA7CisJZG8geworCQl0eF9mZC0+c3RhdGUgPSBGcmFtZUVuZCB8IFRPX1NUQVRFX1RYKDIqRFVNTVlfU0tCX1NJWkUpOworCQl0eF9mZC0+Y29tcGxldGUgPSAweDAwMDAwMDAwOworCSAgICAgICAgLyogRklYTUU6IE5VTEwgc2hvdWxkIGJlIG9rIC0gdG8gYmUgdHJpZWQgKi8KKwkgICAgICAgIHR4X2ZkLT5kYXRhID0gZHByaXYtPnR4X2ZkX2RtYTsKKwkJKHR4X2ZkKyspLT5uZXh0ID0gKHUzMikoZHByaXYtPnR4X2ZkX2RtYSArCisJCQkJCSgrK2klVFhfUklOR19TSVpFKSpzaXplb2YoKnR4X2ZkKSk7CisJfSB3aGlsZSAoaSA8IFRYX1JJTkdfU0laRSk7CisKKwlpZiAoZHNjYzRfaW5pdF9kdW1teV9za2IoZHByaXYpIDwgMCkKKwkJZ290byBlcnJfZnJlZV9kbWFfdHg7CisKKwltZW1zZXQoZHByaXYtPnJ4X3NrYnVmZiwgMCwgc2l6ZW9mKHN0cnVjdCBza19idWZmICopKlJYX1JJTkdfU0laRSk7CisJaSA9IGRwcml2LT5yeF9kaXJ0eSA9IGRwcml2LT5yeF9jdXJyZW50ID0gMDsKKwlkbyB7CisJCS8qIHNpemUgc2V0IGJ5IHRoZSBob3N0LiBNdWx0aXBsZSBvZiA0IGJ5dGVzIHBsZWFzZSAqLworCSAgICAgICAgcnhfZmQtPnN0YXRlMSA9IEhpRGVzYzsKKwkgICAgICAgIHJ4X2ZkLT5zdGF0ZTIgPSAweDAwMDAwMDAwOworCSAgICAgICAgcnhfZmQtPmVuZCA9IDB4YmFiZWZhY2U7CisJICAgICAgICByeF9mZC0+c3RhdGUxIHw9IFRPX1NUQVRFX1JYKEhETENfTUFYX01SVSk7CisJCS8vIEZJWE1FOiByZXR1cm4gdmFsdWUgdmVyaWZpZWUgbWFpcyB0cmFpdGVtZW50IHN1c3BlY3QKKwkJaWYgKHRyeV9nZXRfcnhfc2tiKGRwcml2LCBkZXYpID49IDApCisJCQlkcHJpdi0+cnhfZGlydHkrKzsKKwkJKHJ4X2ZkKyspLT5uZXh0ID0gKHUzMikoZHByaXYtPnJ4X2ZkX2RtYSArCisJCQkJCSgrK2klUlhfUklOR19TSVpFKSpzaXplb2YoKnJ4X2ZkKSk7CisJfSB3aGlsZSAoaSA8IFJYX1JJTkdfU0laRSk7CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfZG1hX3R4OgorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgcmluZywgZHByaXYtPnR4X2ZkX2RtYSk7CitlcnJfZnJlZV9kbWFfcng6CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCByeF9mZCwgZHByaXYtPnJ4X2ZkX2RtYSk7CitlcnJfb3V0OgorCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZHNjYzRfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgZHNjYzRfcGNpX3ByaXYgKnBwcml2OworCXN0cnVjdCBkc2NjNF9kZXZfcHJpdiAqcm9vdDsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwlpbnQgaTsKKworCXBwcml2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXJvb3QgPSBwcHJpdi0+cm9vdDsKKworCWlvYWRkciA9IHJvb3QtPmJhc2VfYWRkcjsKKworCWRzY2M0X3BjaV9yZXNldChwZGV2LCBpb2FkZHIpOworCisJZnJlZV9pcnEocGRldi0+aXJxLCByb290KTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIElSUV9SSU5HX1NJWkUqc2l6ZW9mKHUzMiksIHBwcml2LT5pcWNmZywKKwkJCSAgICBwcHJpdi0+aXFjZmdfZG1hKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGV2X3Blcl9jYXJkOyBpKyspIHsKKwkJc3RydWN0IGRzY2M0X2Rldl9wcml2ICpkcHJpdiA9IHJvb3QgKyBpOworCisJCWRzY2M0X3JlbGVhc2VfcmluZyhkcHJpdik7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgSVJRX1JJTkdfU0laRSpzaXplb2YodTMyKSwKKwkJCQkgICAgZHByaXYtPmlxcngsIGRwcml2LT5pcXJ4X2RtYSk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgSVJRX1JJTkdfU0laRSpzaXplb2YodTMyKSwKKwkJCQkgICAgZHByaXYtPmlxdHgsIGRwcml2LT5pcXR4X2RtYSk7CisJfQorCisJZHNjYzRfZnJlZTEocGRldik7CisKKwlpb3VubWFwKGlvYWRkcik7CisKKwlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMSk7CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDApOworCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworfQorCitzdGF0aWMgaW50IGRzY2M0X2hkbGNfYXR0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IGVuY29kaW5nLAorCXVuc2lnbmVkIHNob3J0IHBhcml0eSkKK3sKKwlzdHJ1Y3QgZHNjYzRfZGV2X3ByaXYgKmRwcml2ID0gZHNjYzRfcHJpdihkZXYpOworCisJaWYgKGVuY29kaW5nICE9IEVOQ09ESU5HX05SWiAmJgorCSAgICBlbmNvZGluZyAhPSBFTkNPRElOR19OUlpJICYmCisJICAgIGVuY29kaW5nICE9IEVOQ09ESU5HX0ZNX01BUksgJiYKKwkgICAgZW5jb2RpbmcgIT0gRU5DT0RJTkdfRk1fU1BBQ0UgJiYKKwkgICAgZW5jb2RpbmcgIT0gRU5DT0RJTkdfTUFOQ0hFU1RFUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocGFyaXR5ICE9IFBBUklUWV9OT05FICYmCisJICAgIHBhcml0eSAhPSBQQVJJVFlfQ1JDMTZfUFIwX0NDSVRUICYmCisJICAgIHBhcml0eSAhPSBQQVJJVFlfQ1JDMTZfUFIxX0NDSVRUICYmCisJICAgIHBhcml0eSAhPSBQQVJJVFlfQ1JDMzJfUFIwX0NDSVRUICYmCisJICAgIHBhcml0eSAhPSBQQVJJVFlfQ1JDMzJfUFIxX0NDSVRUKQorCQlyZXR1cm4gLUVJTlZBTDsKKworICAgICAgICBkcHJpdi0+ZW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgICAgICAgZHByaXYtPnBhcml0eSA9IHBhcml0eTsKKwlyZXR1cm4gMDsKK30KKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IGRzY2M0X3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQgKmFyZ3NbXSA9IHsgJmRlYnVnLCAmcXVhcnR6LCBOVUxMIH0sICoqcCA9IGFyZ3M7CisKKwl3aGlsZSAoKnAgJiYgKGdldF9vcHRpb24oJnN0ciwgKnApID09IDIpKQorCQlwKys7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImRzY2M0LnNldHVwPSIsIGRzY2M0X3NldHVwKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZHNjYzRfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9TSUVNRU5TLCBQQ0lfREVWSUNFX0lEX1NJRU1FTlNfRFNDQzQsCisJICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgMCx9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGRzY2M0X3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHNjYzRfZHJpdmVyID0geworCS5uYW1lCQk9IERSVl9OQU1FLAorCS5pZF90YWJsZQk9IGRzY2M0X3BjaV90YmwsCisJLnByb2JlCQk9IGRzY2M0X2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZHNjYzRfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkc2NjNF9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmRzY2M0X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkc2NjNF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHNjYzRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZHNjYzRfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZHNjYzRfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuYyBiL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3NWI3OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMKQEAgLTAsMCArMSwyNzEyIEBACisvKgorICogICAgICBGYXJTeW5jIFdBTiBkcml2ZXIgZm9yIExpbnV4ICgyLjYueCBrZXJuZWwgdmVyc2lvbikKKyAqCisgKiAgICAgIEFjdHVhbGx5IHN5bmMgZHJpdmVyIGZvciBYLjIxLCBWLjM1IGFuZCBWLjI0IG9uIEZhclN5bmMgVC1zZXJpZXMgY2FyZHMKKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IEZhclNpdGUgQ29tbXVuaWNhdGlvbnMgTHRkLgorICogICAgICB3d3cuZmFyc2l0ZS5jby51aworICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIEF1dGhvcjogICAgICBSLkouRHVubG9wICAgIDxib2IuZHVubG9wQGZhcnNpdGUuY28udWs+CisgKiAgICAgIE1haW50YWluZXI6ICBLZXZpbiBDdXJ0aXMgIDxrZXZpbi5jdXJ0aXNAZmFyc2l0ZS5jby51az4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiZmFyc3luYy5oIgorCisvKgorICogICAgICBNb2R1bGUgaW5mbworICovCitNT0RVTEVfQVVUSE9SKCJSLkouRHVubG9wIDxib2IuZHVubG9wQGZhcnNpdGUuY28udWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZhclN5bmMgVC1TZXJpZXMgV0FOIGRyaXZlci4gRmFyU2l0ZSBDb21tdW5pY2F0aW9ucyBMdGQuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qICAgICAgRHJpdmVyIGNvbmZpZ3VyYXRpb24gYW5kIGdsb2JhbCBwYXJhbWV0ZXJzCisgKiAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qICAgICAgTnVtYmVyIG9mIHBvcnRzIChwZXIgY2FyZCkgYW5kIGNhcmRzIHN1cHBvcnRlZAorICovCisjZGVmaW5lIEZTVF9NQVhfUE9SVFMgICAgICAgICAgIDQKKyNkZWZpbmUgRlNUX01BWF9DQVJEUyAgICAgICAgICAgMzIKKworLyogICAgICBEZWZhdWx0IHBhcmFtZXRlcnMgZm9yIHRoZSBsaW5rCisgKi8KKyNkZWZpbmUgRlNUX1RYX1FVRVVFX0xFTiAgICAgICAgMTAwCS8qIEF0IDhNYnBzIGEgbG9uZ2VyIHF1ZXVlIGxlbmd0aCBpcworCQkJCQkgKiB1c2VmdWwsIHRoZSBzeW5jcHBwIG1vZHVsZSBmb3JjZXMKKwkJCQkJICogdGhpcyBkb3duIGFzc3VtaW5nIGEgc2xvd2VyIGxpbmUgSQorCQkJCQkgKiBndWVzcy4KKwkJCQkJICovCisjZGVmaW5lIEZTVF9UWFFfREVQVEggICAgICAgICAgIDE2CS8qIFRoaXMgb25lIGlzIGZvciB0aGUgYnVmZmVyaW5nCisJCQkJCSAqIG9mIGZyYW1lcyBvbiB0aGUgd2F5IGRvd24gdG8gdGhlIGNhcmQKKwkJCQkJICogc28gdGhhdCB3ZSBjYW4ga2VlcCB0aGUgY2FyZCBidXN5CisJCQkJCSAqIGFuZCBtYXhpbWlzZSB0aHJvdWdocHV0CisJCQkJCSAqLworI2RlZmluZSBGU1RfSElHSF9XQVRFUl9NQVJLICAgICAxMgkvKiBQb2ludCBhdCB3aGljaCB3ZSBmbG93IGNvbnRyb2wKKwkJCQkJICogbmV0d29yayBsYXllciAqLworI2RlZmluZSBGU1RfTE9XX1dBVEVSX01BUksgICAgICA4CS8qIFBvaW50IGF0IHdoaWNoIHdlIHJlbW92ZSBmbG93CisJCQkJCSAqIGNvbnRyb2wgZnJvbSBuZXR3b3JrIGxheWVyICovCisjZGVmaW5lIEZTVF9NQVhfTVRVICAgICAgICAgICAgIDgwMDAJLyogSHVnZSBidXQgcG9zc2libGUgKi8KKyNkZWZpbmUgRlNUX0RFRl9NVFUgICAgICAgICAgICAgMTUwMAkvKiBDb21tb24gc2FuZSB2YWx1ZSAqLworCisjZGVmaW5lIEZTVF9UWF9USU1FT1VUICAgICAgICAgICgyKkhaKQorCisjaWZkZWYgQVJQSFJEX1JBV0hETEMKKyNkZWZpbmUgQVJQSFJEX01ZVFlQRSAgIEFSUEhSRF9SQVdIRExDCS8qIFJhdyBmcmFtZXMgKi8KKyNlbHNlCisjZGVmaW5lIEFSUEhSRF9NWVRZUEUgICBBUlBIUkRfSERMQwkvKiBDaXNjby1IRExDIChrZWVwYWxpdmVzIGV0YykgKi8KKyNlbmRpZgorCisvKgorICogTW9kdWxlcyBwYXJhbWV0ZXJzIGFuZCBhc3NvY2lhdGVkIHZhcmFpYmxlcworICovCitpbnQgZnN0X3R4cV9sb3cgPSBGU1RfTE9XX1dBVEVSX01BUks7CitpbnQgZnN0X3R4cV9oaWdoID0gRlNUX0hJR0hfV0FURVJfTUFSSzsKK2ludCBmc3RfbWF4X3JlYWRzID0gNzsKK2ludCBmc3RfZXhjbHVkZWRfY2FyZHMgPSAwOworaW50IGZzdF9leGNsdWRlZF9saXN0W0ZTVF9NQVhfQ0FSRFNdOworCittb2R1bGVfcGFyYW0oZnN0X3R4cV9sb3csIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZnN0X3R4cV9oaWdoLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGZzdF9tYXhfcmVhZHMsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZnN0X2V4Y2x1ZGVkX2NhcmRzLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGZzdF9leGNsdWRlZF9saXN0LCBpbnQsIE5VTEwsIDApOworCisvKiAgICAgIENhcmQgc2hhcmVkIG1lbW9yeSBsYXlvdXQKKyAqICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisjcHJhZ21hIHBhY2soMSkKKworLyogICAgICBUaGlzIGluZm9ybWF0aW9uIGlzIGRlcml2ZWQgaW4gcGFydCBmcm9tIHRoZSBGYXJTaXRlIEZhclN5bmMgU21jLmgKKyAqICAgICAgZmlsZS4gVW5mb3J0dW5hdGVseSB2YXJpb3VzIG5hbWUgY2xhc2hlcyBhbmQgdGhlIG5vbi1wb3J0YWJpbGl0eSBvZiB0aGUKKyAqICAgICAgYml0IGZpZWxkIGRlY2xhcmF0aW9ucyBpbiB0aGF0IGZpbGUgaGF2ZSBtZWFudCB0aGF0IEkgaGF2ZSBjaG9zZW4gdG8KKyAqICAgICAgcmVjcmVhdGUgdGhlIGluZm9ybWF0aW9uIGhlcmUuCisgKgorICogICAgICBUaGUgU01DIChTaGFyZWQgTWVtb3J5IENvbmZpZ3VyYXRpb24pIGhhcyBhIHZlcnNpb24gbnVtYmVyIHRoYXQgaXMKKyAqICAgICAgaW5jcmVtZW50ZWQgZXZlcnkgdGltZSB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGNoYW5nZS4gVGhpcyBudW1iZXIgY2FuCisgKiAgICAgIGJlIHVzZWQgdG8gY2hlY2sgdGhhdCB3ZSBoYXZlIG5vdCBnb3Qgb3V0IG9mIHN0ZXAgd2l0aCB0aGUgZmlybXdhcmUKKyAqICAgICAgY29udGFpbmVkIGluIHRoZSAuQ0RFIGZpbGVzLgorICovCisjZGVmaW5lIFNNQ19WRVJTSU9OIDI0CisKKyNkZWZpbmUgRlNUX01FTVNJWkUgMHgxMDAwMDAJLyogU2l6ZSBvZiBjYXJkIG1lbW9yeSAoMU1iKSAqLworCisjZGVmaW5lIFNNQ19CQVNFIDB4MDAwMDIwMDBMCS8qIEJhc2Ugb2Zmc2V0IG9mIHRoZSBzaGFyZWQgbWVtb3J5IHdpbmRvdyBtYWluCisJCQkJICogY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgQkZNX0JBU0UgMHgwMDAxMDAwMEwJLyogQmFzZSBvZmZzZXQgb2YgdGhlIHNoYXJlZCBtZW1vcnkgd2luZG93IERNQQorCQkJCSAqIGJ1ZmZlcnMgKi8KKworI2RlZmluZSBMRU5fVFhfQlVGRkVSIDgxOTIJLyogU2l6ZSBvZiBwYWNrZXQgYnVmZmVycyAqLworI2RlZmluZSBMRU5fUlhfQlVGRkVSIDgxOTIKKworI2RlZmluZSBMRU5fU01BTExfVFhfQlVGRkVSIDI1NgkvKiBTaXplIG9mIG9ic29sZXRlIGJ1ZmZzIHVzZWQgZm9yIERPUyBkaWFncyAqLworI2RlZmluZSBMRU5fU01BTExfUlhfQlVGRkVSIDI1NgorCisjZGVmaW5lIE5VTV9UWF9CVUZGRVIgMgkJLyogTXVzdCBiZSBwb3dlciBvZiAyLiBGaXhlZCBieSBmaXJtd2FyZSAqLworI2RlZmluZSBOVU1fUlhfQlVGRkVSIDgKKworLyogSW50ZXJydXB0IHJldHJ5IHRpbWUgaW4gbWlsbGlzZWNvbmRzICovCisjZGVmaW5lIElOVF9SRVRSWV9USU1FIDIKKworLyogICAgICBUaGUgQW0xODZDSC9DQyBwcm9jZXNzb3JzIHN1cHBvcnQgYSBTbWFydERNQSBtb2RlIHVzaW5nIGNpcmN1bGFyIHBvb2xzCisgKiAgICAgIG9mIGJ1ZmZlciBkZXNjcmlwdG9ycy4gVGhlIHN0cnVjdHVyZSBpcyBhbG1vc3QgaWRlbnRpY2FsIHRvIHRoYXQgdXNlZAorICogICAgICBpbiB0aGUgTEFOQ0UgRXRoZXJuZXQgY29udHJvbGxlcnMuIERldGFpbHMgYXZhaWxhYmxlIGFzIFBERiBmcm9tIHRoZQorICogICAgICBBTUQgd2ViIHNpdGU6IGh0dHA6Ly93d3cuYW1kLmNvbS9wcm9kdWN0cy9lcGQvcHJvY2Vzc29ycy9cCisgKiAgICAgICAgICAgICAgICAgICAgMi4xNmJpdGNvbnQvMy5hbTE4NmN4ZmEvYTIxOTE0LzIxOTE0LnBkZgorICovCitzdHJ1Y3QgdHhkZXNjIHsJCQkvKiBUcmFuc21pdCBkZXNjcmlwdG9yICovCisJdm9sYXRpbGUgdTE2IGxhZHI7CS8qIExvdyBvcmRlciBhZGRyZXNzIG9mIHBhY2tldC4gVGhpcyBpcyBhCisJCQkJICogbGluZWFyIGFkZHJlc3MgaW4gdGhlIEFtMTg2IG1lbW9yeSBzcGFjZQorCQkJCSAqLworCXZvbGF0aWxlIHU4IGhhZHI7CS8qIEhpZ2ggb3JkZXIgYWRkcmVzcy4gTG93IDQgYml0cyBvbmx5LCBoaWdoIDQKKwkJCQkgKiBiaXRzIG11c3QgYmUgemVybworCQkJCSAqLworCXZvbGF0aWxlIHU4IGJpdHM7CS8qIFN0YXR1cyBhbmQgY29uZmlnICovCisJdm9sYXRpbGUgdTE2IGJjbnQ7CS8qIDJzIGNvbXBsZW1lbnQgb2YgcGFja2V0IHNpemUgaW4gbG93IDE1IGJpdHMuCisJCQkJICogVHJhbnNtaXQgdGVybWluYWwgY291bnQgaW50ZXJydXB0IGVuYWJsZSBpbgorCQkJCSAqIHRvcCBiaXQuCisJCQkJICovCisJdTE2IHVudXNlZDsJCS8qIE5vdCB1c2VkIGluIFR4ICovCit9OworCitzdHJ1Y3QgcnhkZXNjIHsJCQkvKiBSZWNlaXZlIGRlc2NyaXB0b3IgKi8KKwl2b2xhdGlsZSB1MTYgbGFkcjsJLyogTG93IG9yZGVyIGFkZHJlc3Mgb2YgcGFja2V0ICovCisJdm9sYXRpbGUgdTggaGFkcjsJLyogSGlnaCBvcmRlciBhZGRyZXNzICovCisJdm9sYXRpbGUgdTggYml0czsJLyogU3RhdHVzIGFuZCBjb25maWcgKi8KKwl2b2xhdGlsZSB1MTYgYmNudDsJLyogMnMgY29tcGxlbWVudCBvZiBidWZmZXIgc2l6ZSBpbiBsb3cgMTUgYml0cy4KKwkJCQkgKiBSZWNlaXZlIHRlcm1pbmFsIGNvdW50IGludGVycnVwdCBlbmFibGUgaW4KKwkJCQkgKiB0b3AgYml0LgorCQkJCSAqLworCXZvbGF0aWxlIHUxNiBtY250OwkvKiBNZXNzYWdlIGJ5dGUgY291bnQgKDE1IGJpdHMpICovCit9OworCisvKiBDb252ZXJ0IGEgbGVuZ3RoIGludG8gdGhlIDE1IGJpdCAyJ3MgY29tcGxlbWVudCAqLworLyogI2RlZmluZSBjbnZfYmNudChsZW4pICAgKCggfihsZW4pICsgMSApICYgMHg3RkZGICkgKi8KKy8qIFNpbmNlIHdlIG5lZWQgdG8gc2V0IHRoZSBoaWdoIGJpdCB0byBlbmFibGUgdGhlIGNvbXBsZXRpb24gaW50ZXJydXB0IHRoaXMKKyAqIGNhbiBiZSBtYWRlIGEgbG90IHNpbXBsZXIKKyAqLworI2RlZmluZSBjbnZfYmNudChsZW4pICAgKC0obGVuKSkKKworLyogU3RhdHVzIGFuZCBjb25maWcgYml0cyBmb3IgdGhlIGFib3ZlICovCisjZGVmaW5lIERNQV9PV04gICAgICAgICAweDgwCS8qIFNtYXJ0RE1BIG93bnMgdGhlIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgVFhfU1RQICAgICAgICAgIDB4MDIJLyogVHg6IHN0YXJ0IG9mIHBhY2tldCAqLworI2RlZmluZSBUWF9FTlAgICAgICAgICAgMHgwMQkvKiBUeDogZW5kIG9mIHBhY2tldCAqLworI2RlZmluZSBSWF9FUlIgICAgICAgICAgMHg0MAkvKiBSeDogZXJyb3IgKE9SIG9mIG5leHQgNCBiaXRzKSAqLworI2RlZmluZSBSWF9GUkFNICAgICAgICAgMHgyMAkvKiBSeDogZnJhbWluZyBlcnJvciAqLworI2RlZmluZSBSWF9PRkxPICAgICAgICAgMHgxMAkvKiBSeDogb3ZlcmZsb3cgZXJyb3IgKi8KKyNkZWZpbmUgUlhfQ1JDICAgICAgICAgIDB4MDgJLyogUng6IENSQyBlcnJvciAqLworI2RlZmluZSBSWF9IQlVGICAgICAgICAgMHgwNAkvKiBSeDogYnVmZmVyIGVycm9yICovCisjZGVmaW5lIFJYX1NUUCAgICAgICAgICAweDAyCS8qIFJ4OiBzdGFydCBvZiBwYWNrZXQgKi8KKyNkZWZpbmUgUlhfRU5QICAgICAgICAgIDB4MDEJLyogUng6IGVuZCBvZiBwYWNrZXQgKi8KKworLyogSW50ZXJydXB0cyBmcm9tIHRoZSBjYXJkIGFyZSBjYXVzZWQgYnkgdmFyaW91cyBldmVudHMgd2hpY2ggYXJlIHByZXNlbnRlZAorICogaW4gYSBjaXJjdWxhciBidWZmZXIgYXMgc2V2ZXJhbCBldmVudHMgbWF5IGJlIHByb2Nlc3NlZCBvbiBvbmUgcGh5c2ljYWwgaW50CisgKi8KKyNkZWZpbmUgTUFYX0NJUkJVRkYgICAgIDMyCisKK3N0cnVjdCBjaXJidWZmIHsKKwl1OCByZGluZGV4OwkJLyogcmVhZCwgdGhlbiBpbmNyZW1lbnQgYW5kIHdyYXAgKi8KKwl1OCB3cmluZGV4OwkJLyogd3JpdGUsIHRoZW4gaW5jcmVtZW50IGFuZCB3cmFwICovCisJdTggZXZudGJ1ZmZbTUFYX0NJUkJVRkZdOworfTsKKworLyogSW50ZXJydXB0IGV2ZW50IGNvZGVzLgorICogV2hlcmUgYXBwcm9wcmlhdGUgdGhlIHR3byBsb3cgb3JkZXIgYml0cyBpbmRpY2F0ZSB0aGUgcG9ydCBudW1iZXIKKyAqLworI2RlZmluZSBDVExBX0NIRyAgICAgICAgMHgxOAkvKiBDb250cm9sIHNpZ25hbCBjaGFuZ2VkICovCisjZGVmaW5lIENUTEJfQ0hHICAgICAgICAweDE5CisjZGVmaW5lIENUTENfQ0hHICAgICAgICAweDFBCisjZGVmaW5lIENUTERfQ0hHICAgICAgICAweDFCCisKKyNkZWZpbmUgSU5JVF9DUExUICAgICAgIDB4MjAJLyogSW5pdGlhbGlzYXRpb24gY29tcGxldGUgKi8KKyNkZWZpbmUgSU5JVF9GQUlMICAgICAgIDB4MjEJLyogSW5pdGlhbGlzYXRpb24gZmFpbGVkICovCisKKyNkZWZpbmUgQUJUQV9TRU5UICAgICAgIDB4MjQJLyogQWJvcnQgc2VudCAqLworI2RlZmluZSBBQlRCX1NFTlQgICAgICAgMHgyNQorI2RlZmluZSBBQlRDX1NFTlQgICAgICAgMHgyNgorI2RlZmluZSBBQlREX1NFTlQgICAgICAgMHgyNworCisjZGVmaW5lIFRYQV9VTkRGICAgICAgICAweDI4CS8qIFRyYW5zbWlzc2lvbiB1bmRlcmZsb3cgKi8KKyNkZWZpbmUgVFhCX1VOREYgICAgICAgIDB4MjkKKyNkZWZpbmUgVFhDX1VOREYgICAgICAgIDB4MkEKKyNkZWZpbmUgVFhEX1VOREYgICAgICAgIDB4MkIKKworI2RlZmluZSBGNTZfSU5UICAgICAgICAgMHgyQworI2RlZmluZSBNMzJfSU5UICAgICAgICAgMHgyRAorCisjZGVmaW5lIFRFMV9BTE1BICAgICAgICAweDMwCisKKy8qIFBvcnQgcGh5c2ljYWwgY29uZmlndXJhdGlvbi4gU2VlIGZhcnN5bmMuaCBmb3IgZmllbGQgdmFsdWVzICovCitzdHJ1Y3QgcG9ydF9jZmcgeworCXUxNiBsaW5lSW50ZXJmYWNlOwkvKiBQaHlzaWNhbCBpbnRlcmZhY2UgdHlwZSAqLworCXU4IHgyNW9wOwkJLyogVW51c2VkIGF0IHByZXNlbnQgKi8KKwl1OCBpbnRlcm5hbENsb2NrOwkvKiAxID0+IGludGVybmFsIGNsb2NrLCAwID0+IGV4dGVybmFsICovCisJdTggdHJhbnNwYXJlbnRNb2RlOwkvKiAxID0+IG9uLCAwID0+IG9mZiAqLworCXU4IGludmVydENsb2NrOwkJLyogMCA9PiBub3JtYWwsIDEgPT4gaW52ZXJ0ZWQgKi8KKwl1OCBwYWRCeXRlc1s2XTsJCS8qIFBhZGRpbmcgKi8KKwl1MzIgbGluZVNwZWVkOwkJLyogU3BlZWQgaW4gYnBzICovCit9OworCisvKiBURTEgcG9ydCBwaHlzaWNhbCBjb25maWd1cmF0aW9uICovCitzdHJ1Y3Qgc3VfY29uZmlnIHsKKwl1MzIgZGF0YVJhdGU7CisJdTggY2xvY2tpbmc7CisJdTggZnJhbWluZzsKKwl1OCBzdHJ1Y3R1cmU7CisJdTggaW50ZXJmYWNlOworCXU4IGNvZGluZzsKKwl1OCBsaW5lQnVpbGRPdXQ7CisJdTggZXF1YWxpemVyOworCXU4IHRyYW5zcGFyZW50TW9kZTsKKwl1OCBsb29wTW9kZTsKKwl1OCByYW5nZTsKKwl1OCB0eEJ1ZmZlck1vZGU7CisJdTggcnhCdWZmZXJNb2RlOworCXU4IHN0YXJ0aW5nU2xvdDsKKwl1OCBsb3NUaHJlc2hvbGQ7CisJdTggZW5hYmxlSWRsZUNvZGU7CisJdTggaWRsZUNvZGU7CisJdTggc3BhcmVbNDRdOworfTsKKworLyogVEUxIFN0YXR1cyAqLworc3RydWN0IHN1X3N0YXR1cyB7CisJdTMyIHJlY2VpdmVCdWZmZXJEZWxheTsKKwl1MzIgZnJhbWluZ0Vycm9yQ291bnQ7CisJdTMyIGNvZGVWaW9sYXRpb25Db3VudDsKKwl1MzIgY3JjRXJyb3JDb3VudDsKKwl1MzIgbGluZUF0dGVudWF0aW9uOworCXU4IHBvcnRTdGFydGVkOworCXU4IGxvc3NPZlNpZ25hbDsKKwl1OCByZWNlaXZlUmVtb3RlQWxhcm07CisJdTggYWxhcm1JbmRpY2F0aW9uU2lnbmFsOworCXU4IHNwYXJlWzQwXTsKK307CisKKy8qIEZpbmFsbHkgc2xpbmcgYWxsIHRoZSBhYm92ZSB0b2dldGhlciBpbnRvIHRoZSBzaGFyZWQgbWVtb3J5IHN0cnVjdHVyZS4KKyAqIFNvcnJ5IGl0J3MgYSBob2RnZSBwb2RnZSBvZiBhcnJheXMsIHN0cnVjdHVyZXMgYW5kIHVudXNlZCBiaXRzLCBpdCdzIGJlZW4KKyAqIGV2b2x2aW5nIHVuZGVyIE5UIGZvciBzb21lIHRpbWUgc28gSSBndWVzcyB3ZSdyZSBzdHVjayB3aXRoIGl0LgorICogVGhlIHN0cnVjdHVyZSBzdGFydHMgYXQgb2Zmc2V0IFNNQ19CQVNFLgorICogU2VlIGZhcnN5bmMuaCBmb3Igc29tZSBmaWVsZCB2YWx1ZXMuCisgKi8KK3N0cnVjdCBmc3Rfc2hhcmVkIHsKKwkvKiBETUEgZGVzY3JpcHRvciByaW5ncyAqLworCXN0cnVjdCByeGRlc2MgcnhEZXNjclJpbmdbRlNUX01BWF9QT1JUU11bTlVNX1JYX0JVRkZFUl07CisJc3RydWN0IHR4ZGVzYyB0eERlc2NyUmluZ1tGU1RfTUFYX1BPUlRTXVtOVU1fVFhfQlVGRkVSXTsKKworCS8qIE9ic29sZXRlIHNtYWxsIGJ1ZmZlcnMgKi8KKwl1OCBzbWFsbFJ4QnVmZmVyW0ZTVF9NQVhfUE9SVFNdW05VTV9SWF9CVUZGRVJdW0xFTl9TTUFMTF9SWF9CVUZGRVJdOworCXU4IHNtYWxsVHhCdWZmZXJbRlNUX01BWF9QT1JUU11bTlVNX1RYX0JVRkZFUl1bTEVOX1NNQUxMX1RYX0JVRkZFUl07CisKKwl1OCB0YXNrU3RhdHVzOwkJLyogMHgwMCA9PiBpbml0aWFsaXNpbmcsIDB4MDEgPT4gcnVubmluZywKKwkJCQkgKiAweEZGID0+IGhhbHRlZAorCQkJCSAqLworCisJdTggaW50ZXJydXB0SGFuZHNoYWtlOwkvKiBTZXQgdG8gMHgwMSBieSBhZGFwdGVyIHRvIHNpZ25hbCBpbnRlcnJ1cHQsCisJCQkJICogc2V0IHRvIDB4RUUgYnkgaG9zdCB0byBhY2tub3dsZWRnZSBpbnRlcnJ1cHQKKwkJCQkgKi8KKworCXUxNiBzbWNWZXJzaW9uOwkJLyogTXVzdCBtYXRjaCBTTUNfVkVSU0lPTiAqLworCisJdTMyIHNtY0Zpcm13YXJlVmVyc2lvbjsJLyogMHhJSVZWUlJCQiB3aGVyZSBJSSA9IHByb2R1Y3QgSUQsIFZWID0gbWFqb3IKKwkJCQkgKiB2ZXJzaW9uLCBSUiA9IHJldmlzaW9uIGFuZCBCQiA9IGJ1aWxkCisJCQkJICovCisKKwl1MTYgdHhhX2RvbmU7CQkvKiBPYnNvbGV0ZSBjb21wbGV0aW9uIGZsYWdzICovCisJdTE2IHJ4YV9kb25lOworCXUxNiB0eGJfZG9uZTsKKwl1MTYgcnhiX2RvbmU7CisJdTE2IHR4Y19kb25lOworCXUxNiByeGNfZG9uZTsKKwl1MTYgdHhkX2RvbmU7CisJdTE2IHJ4ZF9kb25lOworCisJdTE2IG1haWxib3hbNF07CQkvKiBEaWFnbm9zdGljcyBtYWlsYm94LiBOb3QgdXNlZCAqLworCisJc3RydWN0IGNpcmJ1ZmYgaW50ZXJydXB0RXZlbnQ7CS8qIGludGVycnVwdCBjYXVzZXMgKi8KKworCXUzMiB2MjRJcFN0c1tGU1RfTUFYX1BPUlRTXTsJLyogVi4yNCBjb250cm9sIGlucHV0IHN0YXR1cyAqLworCXUzMiB2MjRPcFN0c1tGU1RfTUFYX1BPUlRTXTsJLyogVi4yNCBjb250cm9sIG91dHB1dCBzdGF0dXMgKi8KKworCXN0cnVjdCBwb3J0X2NmZyBwb3J0Q29uZmlnW0ZTVF9NQVhfUE9SVFNdOworCisJdTE2IGNsb2NrU3RhdHVzW0ZTVF9NQVhfUE9SVFNdOwkvKiBsc2I6IDA9PiBwcmVzZW50LCAxPT4gYWJzZW50ICovCisKKwl1MTYgY2FibGVTdGF0dXM7CS8qIGxzYjogMD0+IHByZXNlbnQsIDE9PiBhYnNlbnQgKi8KKworCXUxNiB0eERlc2NySW5kZXhbRlNUX01BWF9QT1JUU107CS8qIHRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZyBpbmRleCAqLworCXUxNiByeERlc2NySW5kZXhbRlNUX01BWF9QT1JUU107CS8qIHJlY2VpdmUgZGVzY3JpcHRvciByaW5nIGluZGV4ICovCisKKwl1MTYgcG9ydE1haWxib3hbRlNUX01BWF9QT1JUU11bMl07CS8qIGNvbW1hbmQsIG1vZGlmaWVyICovCisJdTE2IGNhcmRNYWlsYm94WzRdOwkvKiBOb3QgdXNlZCAqLworCisJLyogTnVtYmVyIG9mIHRpbWVzIHRoZSBjYXJkIHRoaW5rcyB0aGUgaG9zdCBoYXMKKwkgKiBtaXNzZWQgYW4gaW50ZXJydXB0IGJ5IG5vdCBhY2tub3dsZWRnaW5nCisJICogd2l0aGluIDJtUyAoSSBndWVzcyBOVCBoYXMgcHJvYmxlbXMpCisJICovCisJdTMyIGludGVycnVwdFJldHJ5Q291bnQ7CisKKwkvKiBEcml2ZXIgcHJpdmF0ZSBkYXRhIHVzZWQgYXMgYW4gSUQuIFdlJ2xsIG5vdAorCSAqIHVzZSB0aGlzIGFzIEknZCByYXRoZXIga2VlcCBzdWNoIHRoaW5ncworCSAqIGluIG1haW4gbWVtb3J5IHJhdGhlciB0aGFuIG9uIHRoZSBQQ0kgYnVzCisJICovCisJdTMyIHBvcnRIYW5kbGVbRlNUX01BWF9QT1JUU107CisKKwkvKiBDb3VudCBvZiBUeCB1bmRlcmZsb3dzIGZvciBzdGF0cyAqLworCXUzMiB0cmFuc21pdEJ1ZmZlclVuZGVyZmxvd1tGU1RfTUFYX1BPUlRTXTsKKworCS8qIERlYm91bmNlZCBWLjI0IGNvbnRyb2wgaW5wdXQgc3RhdHVzICovCisJdTMyIHYyNERlYm91bmNlZFN0c1tGU1RfTUFYX1BPUlRTXTsKKworCS8qIEFkYXB0ZXIgZGVib3VuY2UgdGltZXJzLiBEb24ndCB0b3VjaCAqLworCXUzMiBjdHNUaW1lcltGU1RfTUFYX1BPUlRTXTsKKwl1MzIgY3RzVGltZXJSdW5bRlNUX01BWF9QT1JUU107CisJdTMyIGRjZFRpbWVyW0ZTVF9NQVhfUE9SVFNdOworCXUzMiBkY2RUaW1lclJ1bltGU1RfTUFYX1BPUlRTXTsKKworCXUzMiBudW1iZXJPZlBvcnRzOwkvKiBOdW1iZXIgb2YgcG9ydHMgZGV0ZWN0ZWQgYXQgc3RhcnR1cCAqLworCisJdTE2IF9yZXNlcnZlZFs2NF07CisKKwl1MTYgY2FyZE1vZGU7CQkvKiBCaXQtbWFzayB0byBlbmFibGUgZmVhdHVyZXM6CisJCQkJICogQml0IDA6IDEgZW5hYmxlcyBMRUQgaWRlbnRpZnkgbW9kZQorCQkJCSAqLworCisJdTE2IHBvcnRTY2hlZHVsZU9mZnNldDsKKworCXN0cnVjdCBzdV9jb25maWcgc3VDb25maWc7CS8qIFRFMSBCaXRzICovCisJc3RydWN0IHN1X3N0YXR1cyBzdVN0YXR1czsKKworCXUzMiBlbmRPZlNtY1NpZ25hdHVyZTsJLyogZW5kT2ZTbWNTaWduYXR1cmUgTVVTVCBiZSB0aGUgbGFzdCBtZW1iZXIgb2YKKwkJCQkgKiB0aGUgc3RydWN0dXJlIGFuZCBtYXJrcyB0aGUgZW5kIG9mIHNoYXJlZAorCQkJCSAqIG1lbW9yeS4gQWRhcHRlciBjb2RlIGluaXRpYWxpemVzIGl0IGFzCisJCQkJICogRU5EX1NJRy4KKwkJCQkgKi8KK307CisKKy8qIGVuZE9mU21jU2lnbmF0dXJlIHZhbHVlICovCisjZGVmaW5lIEVORF9TSUcgICAgICAgICAgICAgICAgIDB4MTIzNDU2NzgKKworLyogTWFpbGJveCB2YWx1ZXMuIChwb3J0TWFpbGJveCkgKi8KKyNkZWZpbmUgTk9QICAgICAgICAgICAgIDAJLyogTm8gb3BlcmF0aW9uICovCisjZGVmaW5lIEFDSyAgICAgICAgICAgICAxCS8qIFBvc2l0aXZlIGFja25vd2xlZGdlbWVudCB0byBQQyBkcml2ZXIgKi8KKyNkZWZpbmUgTkFLICAgICAgICAgICAgIDIJLyogTmVnYXRpdmUgYWNrbm93bGVkZ2VtZW50IHRvIFBDIGRyaXZlciAqLworI2RlZmluZSBTVEFSVFBPUlQgICAgICAgMwkvKiBTdGFydCBhbiBIRExDIHBvcnQgKi8KKyNkZWZpbmUgU1RPUFBPUlQgICAgICAgIDQJLyogU3RvcCBhbiBIRExDIHBvcnQgKi8KKyNkZWZpbmUgQUJPUlRUWCAgICAgICAgIDUJLyogQWJvcnQgdGhlIHRyYW5zbWl0dGVyIGZvciBhIHBvcnQgKi8KKyNkZWZpbmUgU0VUVjI0TyAgICAgICAgIDYJLyogU2V0IFYyNCBvdXRwdXRzICovCisKKy8qIFBMWCBDaGlwIFJlZ2lzdGVyIE9mZnNldHMgKi8KKyNkZWZpbmUgQ05UUkxfOTA1MiAgICAgIDB4NTAJLyogQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBDTlRSTF85MDU0ICAgICAgMHg2YwkvKiBDb250cm9sIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgSU5UQ1NSXzkwNTIgICAgIDB4NGMJLyogSW50ZXJydXB0IGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIElOVENTUl85MDU0ICAgICAweDY4CS8qIEludGVycnVwdCBjb250cm9sL3N0YXR1cyByZWdpc3RlciAqLworCisvKiA5MDU0IERNQSBSZWdpc3RlcnMgKi8KKy8qCisgKiBOb3RlIHRoYXQgd2Ugd2lsbCBiZSB1c2luZyBETUEgQ2hhbm5lbCAwIGZvciBjb3B5aW5nIHJ4IGRhdGEKKyAqIGFuZCBDaGFubmVsIDEgZm9yIGNvcHlpbmcgdHggZGF0YQorICovCisjZGVmaW5lIERNQU1PREUwICAgICAgICAweDgwCisjZGVmaW5lIERNQVBBRFIwICAgICAgICAweDg0CisjZGVmaW5lIERNQUxBRFIwICAgICAgICAweDg4CisjZGVmaW5lIERNQVNJWjAgICAgICAgICAweDhjCisjZGVmaW5lIERNQURQUjAgICAgICAgICAweDkwCisjZGVmaW5lIERNQU1PREUxICAgICAgICAweDk0CisjZGVmaW5lIERNQVBBRFIxICAgICAgICAweDk4CisjZGVmaW5lIERNQUxBRFIxICAgICAgICAweDljCisjZGVmaW5lIERNQVNJWjEgICAgICAgICAweGEwCisjZGVmaW5lIERNQURQUjEgICAgICAgICAweGE0CisjZGVmaW5lIERNQUNTUjAgICAgICAgICAweGE4CisjZGVmaW5lIERNQUNTUjEgICAgICAgICAweGE5CisjZGVmaW5lIERNQUFSQiAgICAgICAgICAweGFjCisjZGVmaW5lIERNQVRIUiAgICAgICAgICAweGIwCisjZGVmaW5lIERNQURBQzAgICAgICAgICAweGI0CisjZGVmaW5lIERNQURBQzEgICAgICAgICAweGI4CisjZGVmaW5lIERNQU1BUkJSICAgICAgICAweGFjCisKKyNkZWZpbmUgRlNUX01JTl9ETUFfTEVOIDY0CisjZGVmaW5lIEZTVF9SWF9ETUFfSU5UICAweDAxCisjZGVmaW5lIEZTVF9UWF9ETUFfSU5UICAweDAyCisjZGVmaW5lIEZTVF9DQVJEX0lOVCAgICAweDA0CisKKy8qIExhcmdlciBidWZmZXJzIGFyZSBwb3NpdGlvbmVkIGluIG1lbW9yeSBhdCBvZmZzZXQgQkZNX0JBU0UgKi8KK3N0cnVjdCBidWZfd2luZG93IHsKKwl1OCB0eEJ1ZmZlcltGU1RfTUFYX1BPUlRTXVtOVU1fVFhfQlVGRkVSXVtMRU5fVFhfQlVGRkVSXTsKKwl1OCByeEJ1ZmZlcltGU1RfTUFYX1BPUlRTXVtOVU1fUlhfQlVGRkVSXVtMRU5fUlhfQlVGRkVSXTsKK307CisKKy8qIENhbGN1bGF0ZSBvZmZzZXQgb2YgYSBidWZmZXIgb2JqZWN0IHdpdGhpbiB0aGUgc2hhcmVkIG1lbW9yeSB3aW5kb3cgKi8KKyNkZWZpbmUgQlVGX09GRlNFVChYKSAgIChCRk1fQkFTRSArIG9mZnNldG9mKHN0cnVjdCBidWZfd2luZG93LCBYKSkKKworI3ByYWdtYSBwYWNrKCkKKworLyogICAgICBEZXZpY2UgZHJpdmVyIHByaXZhdGUgaW5mb3JtYXRpb24KKyAqICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKy8qICAgICAgUGVyIHBvcnQgKGxpbmUgb3IgY2hhbm5lbCkgaW5mb3JtYXRpb24KKyAqLworc3RydWN0IGZzdF9wb3J0X2luZm8geworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OyAvKiBEZXZpY2Ugc3RydWN0IC0gbXVzdCBiZSBmaXJzdCAqLworCXN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOwkvKiBDYXJkIHdlJ3JlIGFzc29jaWF0ZWQgd2l0aCAqLworCWludCBpbmRleDsJCS8qIFBvcnQgaW5kZXggb24gdGhlIGNhcmQgKi8KKwlpbnQgaHdpZjsJCS8qIExpbmUgaGFyZHdhcmUgKGxpbmVJbnRlcmZhY2UgY29weSkgKi8KKwlpbnQgcnVuOwkJLyogUG9ydCBpcyBydW5uaW5nICovCisJaW50IG1vZGU7CQkvKiBOb3JtYWwgb3IgRmFyU3luYyByYXcgKi8KKwlpbnQgcnhwb3M7CQkvKiBOZXh0IFJ4IGJ1ZmZlciB0byB1c2UgKi8KKwlpbnQgdHhwb3M7CQkvKiBOZXh0IFR4IGJ1ZmZlciB0byB1c2UgKi8KKwlpbnQgdHhpcG9zOwkJLyogTmV4dCBUeCBidWZmZXIgdG8gY2hlY2sgZm9yIGZyZWUgKi8KKwlpbnQgc3RhcnQ7CQkvKiBJbmRpY2F0aW9uIG9mIHN0YXJ0L3N0b3AgdG8gbmV0d29yayAqLworCS8qCisJICogQSBzaXh0ZWVuIGVudHJ5IHRyYW5zbWl0IHF1ZXVlCisJICovCisJaW50IHR4cXM7CQkvKiBpbmRleCB0byBnZXQgbmV4dCBidWZmZXIgdG8gdHggKi8KKwlpbnQgdHhxZTsJCS8qIGluZGV4IHRvIHF1ZXVlIG5leHQgcGFja2V0ICovCisJc3RydWN0IHNrX2J1ZmYgKnR4cVtGU1RfVFhRX0RFUFRIXTsJLyogVGhlIHF1ZXVlICovCisJaW50IHJ4cWRlcHRoOworfTsKKworLyogICAgICBQZXIgY2FyZCBpbmZvcm1hdGlvbgorICovCitzdHJ1Y3QgZnN0X2NhcmRfaW5mbyB7CisJY2hhciBfX2lvbWVtICptZW07CS8qIENhcmQgbWVtb3J5IG1hcHBlZCB0byBrZXJuZWwgc3BhY2UgKi8KKwljaGFyIF9faW9tZW0gKmN0bG1lbTsJLyogQ29udHJvbCBtZW1vcnkgZm9yIFBDSSBjYXJkcyAqLworCXVuc2lnbmVkIGludCBwaHlzX21lbTsJLyogUGh5c2ljYWwgbWVtb3J5IHdpbmRvdyBhZGRyZXNzICovCisJdW5zaWduZWQgaW50IHBoeXNfY3RsbWVtOwkvKiBQaHlzaWNhbCBjb250cm9sIG1lbW9yeSBhZGRyZXNzICovCisJdW5zaWduZWQgaW50IGlycTsJLyogSW50ZXJydXB0IHJlcXVlc3QgbGluZSBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQgbnBvcnRzOwkvKiBOdW1iZXIgb2Ygc2VyaWFsIHBvcnRzICovCisJdW5zaWduZWQgaW50IHR5cGU7CS8qIFR5cGUgaW5kZXggb2YgY2FyZCAqLworCXVuc2lnbmVkIGludCBzdGF0ZTsJLyogU3RhdGUgb2YgY2FyZCAqLworCXNwaW5sb2NrX3QgY2FyZF9sb2NrOwkvKiBMb2NrIGZvciBTTVAgYWNjZXNzICovCisJdW5zaWduZWQgc2hvcnQgcGNpX2NvbmY7CS8qIFBDSSBjYXJkIGNvbmZpZyBpbiBJL08gc3BhY2UgKi8KKwkvKiBQZXIgcG9ydCBpbmZvICovCisJc3RydWN0IGZzdF9wb3J0X2luZm8gcG9ydHNbRlNUX01BWF9QT1JUU107CisJc3RydWN0IHBjaV9kZXYgKmRldmljZTsJLyogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHBjaSBkZXZpY2UgKi8KKwlpbnQgY2FyZF9ubzsJCS8qIEluc3Qgb2YgdGhlIGNhcmQgb24gdGhlIHN5c3RlbSAqLworCWludCBmYW1pbHk7CQkvKiBUeFAgb3IgVHhVICovCisJaW50IGRtYXJ4X2luX3Byb2dyZXNzOworCWludCBkbWF0eF9pbl9wcm9ncmVzczsKKwl1bnNpZ25lZCBsb25nIGludF9jb3VudDsKKwl1bnNpZ25lZCBsb25nIGludF90aW1lX2F2ZTsKKwl2b2lkICpyeF9kbWFfaGFuZGxlX2hvc3Q7CisJZG1hX2FkZHJfdCByeF9kbWFfaGFuZGxlX2NhcmQ7CisJdm9pZCAqdHhfZG1hX2hhbmRsZV9ob3N0OworCWRtYV9hZGRyX3QgdHhfZG1hX2hhbmRsZV9jYXJkOworCXN0cnVjdCBza19idWZmICpkbWFfc2tiX3J4OworCXN0cnVjdCBmc3RfcG9ydF9pbmZvICpkbWFfcG9ydF9yeDsKKwlzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqZG1hX3BvcnRfdHg7CisJaW50IGRtYV9sZW5fcng7CisJaW50IGRtYV9sZW5fdHg7CisJaW50IGRtYV90eHBvczsKKwlpbnQgZG1hX3J4cG9zOworfTsKKworLyogQ29udmVydCBhbiBIRExDIGRldmljZSBwb2ludGVyIGludG8gYSBwb3J0IGluZm8gcG9pbnRlciBhbmQgc2ltaWxhciAqLworI2RlZmluZSBkZXZfdG9fcG9ydChEKSAgKGRldl90b19oZGxjKEQpLT5wcml2KQorI2RlZmluZSBwb3J0X3RvX2RldihQKSAgKChQKS0+ZGV2KQorCisKKy8qCisgKiAgICAgIFNoYXJlZCBtZW1vcnkgd2luZG93IGFjY2VzcyBtYWNyb3MKKyAqCisgKiAgICAgIFdlIGhhdmUgYSBuaWNlIG1lbW9yeSBiYXNlZCBzdHJ1Y3R1cmUgYWJvdmUsIHdoaWNoIGNvdWxkIGJlIGRpcmVjdGx5CisgKiAgICAgIG1hcHBlZCBvbiBpMzg2IGJ1dCBtaWdodCBub3Qgd29yayBvbiBvdGhlciBhcmNoaXRlY3R1cmVzIHVubGVzcyB3ZSB1c2UKKyAqICAgICAgdGhlIHJlYWRiLHcsbCBhbmQgd3JpdGViLHcsbCBtYWNyb3MuIFVuZm9ydHVuYXRlbHkgdGhlc2UgbWFjcm9zIHRha2UKKyAqICAgICAgcGh5c2ljYWwgb2Zmc2V0cyBzbyB3ZSBoYXZlIHRvIGNvbnZlcnQuIFRoZSBvbmx5IHNhdmluZyBncmFjZSBpcyB0aGF0CisgKiAgICAgIHRoaXMgc2hvdWxkIGFsbCBjb2xsYXBzZSBiYWNrIHRvIGEgc2ltcGxlIGluZGlyZWN0aW9uIGV2ZW50dWFsbHkuCisgKi8KKyNkZWZpbmUgV0lOX09GRlNFVChYKSAgICgobG9uZykmKCgoc3RydWN0IGZzdF9zaGFyZWQgKilTTUNfQkFTRSktPlgpKQorCisjZGVmaW5lIEZTVF9SREIoQyxFKSAgICByZWFkYiAoKEMpLT5tZW0gKyBXSU5fT0ZGU0VUKEUpKQorI2RlZmluZSBGU1RfUkRXKEMsRSkgICAgcmVhZHcgKChDKS0+bWVtICsgV0lOX09GRlNFVChFKSkKKyNkZWZpbmUgRlNUX1JETChDLEUpICAgIHJlYWRsICgoQyktPm1lbSArIFdJTl9PRkZTRVQoRSkpCisKKyNkZWZpbmUgRlNUX1dSQihDLEUsQikgIHdyaXRlYiAoKEIpLCAoQyktPm1lbSArIFdJTl9PRkZTRVQoRSkpCisjZGVmaW5lIEZTVF9XUlcoQyxFLFcpICB3cml0ZXcgKChXKSwgKEMpLT5tZW0gKyBXSU5fT0ZGU0VUKEUpKQorI2RlZmluZSBGU1RfV1JMKEMsRSxMKSAgd3JpdGVsICgoTCksIChDKS0+bWVtICsgV0lOX09GRlNFVChFKSkKKworLyoKKyAqICAgICAgRGVidWcgc3VwcG9ydAorICovCisjaWYgRlNUX0RFQlVHCisKK3N0YXRpYyBpbnQgZnN0X2RlYnVnX21hc2sgPSB7IEZTVF9ERUJVRyB9OworCisvKiBNb3N0IGNvbW1vbiBkZWJ1ZyBhY3Rpdml0eSBpcyB0byBwcmludCBzb21ldGhpbmcgaWYgdGhlIGNvcnJlc3BvbmRpbmcgYml0CisgKiBpcyBzZXQgaW4gdGhlIGRlYnVnIG1hc2suIE5vdGU6IHRoaXMgdXNlcyBhIG5vbi1BTlNJIGV4dGVuc2lvbiBpbiBHQ0MgdG8KKyAqIHN1cHBvcnQgdmFyaWFibGUgbnVtYmVycyBvZiBtYWNybyBwYXJhbWV0ZXJzLiBUaGUgaW52ZXJ0ZWQgaWYgcHJldmVudHMgdXMKKyAqIGVhdGluZyBzb21lb25lIGVsc2UncyBlbHNlIGNsYXVzZS4KKyAqLworI2RlZmluZSBkYmcoRixmbXQsQS4uLikgaWYgKCAhICggZnN0X2RlYnVnX21hc2sgJiAoRikpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoIEtFUk5fREVCVUcgRlNUX05BTUUgIjogIiBmbXQsICMjIEEgKQorCisjZWxzZQorI2RlZmluZSBkYmcoWC4uLikJCS8qIE5PUCAqLworI2VuZGlmCisKKy8qICAgICAgUHJpbnRpbmcgc2hvcnQgY3V0cworICovCisjZGVmaW5lIHByaW50a19lcnIoZm10LEEuLi4pICAgIHByaW50ayAoIEtFUk5fRVJSICAgICBGU1RfTkFNRSAiOiAiIGZtdCwgIyMgQSApCisjZGVmaW5lIHByaW50a193YXJuKGZtdCxBLi4uKSAgIHByaW50ayAoIEtFUk5fV0FSTklORyBGU1RfTkFNRSAiOiAiIGZtdCwgIyMgQSApCisjZGVmaW5lIHByaW50a19pbmZvKGZtdCxBLi4uKSAgIHByaW50ayAoIEtFUk5fSU5GTyAgICBGU1RfTkFNRSAiOiAiIGZtdCwgIyMgQSApCisKKy8qCisgKiAgICAgIFBDSSBJRCBsb29rdXAgdGFibGUKKyAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGZzdF9wY2lfZGV2X2lkW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7UENJX1ZFTkRPUl9JRF9GQVJTSVRFLCBQQ0lfREVWSUNFX0lEX0ZBUlNJVEVfVDJQLCBQQ0lfQU5ZX0lELCAKKwkgUENJX0FOWV9JRCwgMCwgMCwgRlNUX1RZUEVfVDJQfSwKKworCXtQQ0lfVkVORE9SX0lEX0ZBUlNJVEUsIFBDSV9ERVZJQ0VfSURfRkFSU0lURV9UNFAsIFBDSV9BTllfSUQsIAorCSBQQ0lfQU5ZX0lELCAwLCAwLCBGU1RfVFlQRV9UNFB9LAorCisJe1BDSV9WRU5ET1JfSURfRkFSU0lURSwgUENJX0RFVklDRV9JRF9GQVJTSVRFX1QxVSwgUENJX0FOWV9JRCwgCisJIFBDSV9BTllfSUQsIDAsIDAsIEZTVF9UWVBFX1QxVX0sCisKKwl7UENJX1ZFTkRPUl9JRF9GQVJTSVRFLCBQQ0lfREVWSUNFX0lEX0ZBUlNJVEVfVDJVLCBQQ0lfQU5ZX0lELCAKKwkgUENJX0FOWV9JRCwgMCwgMCwgRlNUX1RZUEVfVDJVfSwKKworCXtQQ0lfVkVORE9SX0lEX0ZBUlNJVEUsIFBDSV9ERVZJQ0VfSURfRkFSU0lURV9UNFUsIFBDSV9BTllfSUQsIAorCSBQQ0lfQU5ZX0lELCAwLCAwLCBGU1RfVFlQRV9UNFV9LAorCisJe1BDSV9WRU5ET1JfSURfRkFSU0lURSwgUENJX0RFVklDRV9JRF9GQVJTSVRFX1RFMSwgUENJX0FOWV9JRCwgCisJIFBDSV9BTllfSUQsIDAsIDAsIEZTVF9UWVBFX1RFMX0sCisKKwl7UENJX1ZFTkRPUl9JRF9GQVJTSVRFLCBQQ0lfREVWSUNFX0lEX0ZBUlNJVEVfVEUxQywgUENJX0FOWV9JRCwgCisJIFBDSV9BTllfSUQsIDAsIDAsIEZTVF9UWVBFX1RFMX0sCisJezAsfQkJCS8qIEVuZCAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGZzdF9wY2lfZGV2X2lkKTsKKworLyoKKyAqICAgICAgRGV2aWNlIERyaXZlciBXb3JrIFF1ZXVlcworICoKKyAqICAgICAgU28gdGhhdCB3ZSBkb24ndCBzcGVuZCB0b28gbXVjaCB0aW1lIHByb2Nlc3NpbmcgZXZlbnRzIGluIHRoZSAKKyAqICAgICAgSW50ZXJydXB0IFNlcnZpY2Ugcm91dGluZSwgd2Ugd2lsbCBkZWNsYXJlIGEgd29yayBxdWV1ZSBwZXIgQ2FyZCAKKyAqICAgICAgYW5kIG1ha2UgdGhlIElTUiBzY2hlZHVsZSBhIHRhc2sgaW4gdGhlIHF1ZXVlIGZvciBsYXRlciBleGVjdXRpb24uCisgKiAgICAgIEluIHRoZSAyLjQgS2VybmVsIHdlIHVzZWQgdG8gdXNlIHRoZSBpbW1lZGlhdGUgcXVldWUgZm9yIEJIJ3MKKyAqICAgICAgTm93IHRoYXQgdGhleSBhcmUgZ29uZSwgdGFza2xldHMgc2VlbSB0byBiZSBtdWNoIGJldHRlciB0aGFuIHdvcmsgCisgKiAgICAgIHF1ZXVlcy4KKyAqLworCitzdGF0aWMgdm9pZCBkb19ib3R0b21faGFsZl90eChzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCk7CitzdGF0aWMgdm9pZCBkb19ib3R0b21faGFsZl9yeChzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCk7CitzdGF0aWMgdm9pZCBmc3RfcHJvY2Vzc190eF93b3JrX3EodW5zaWduZWQgbG9uZyB3b3JrX3EpOworc3RhdGljIHZvaWQgZnN0X3Byb2Nlc3NfaW50X3dvcmtfcSh1bnNpZ25lZCBsb25nIHdvcmtfcSk7CisKK0RFQ0xBUkVfVEFTS0xFVChmc3RfdHhfdGFzaywgZnN0X3Byb2Nlc3NfdHhfd29ya19xLCAwKTsKK0RFQ0xBUkVfVEFTS0xFVChmc3RfaW50X3Rhc2ssIGZzdF9wcm9jZXNzX2ludF93b3JrX3EsIDApOworCitzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqZnN0X2NhcmRfYXJyYXlbRlNUX01BWF9DQVJEU107CitzcGlubG9ja190IGZzdF93b3JrX3FfbG9jazsKK3U2NCBmc3Rfd29ya190eHE7Cit1NjQgZnN0X3dvcmtfaW50cTsKKworc3RhdGljIHZvaWQKK2ZzdF9xX3dvcmtfaXRlbSh1NjQgKiBxdWV1ZSwgaW50IGNhcmRfaW5kZXgpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1NjQgbWFzazsKKworCS8qCisJICogR3JhYiB0aGUgcXVldWUgZXhjbHVzaXZlbHkKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZnN0X3dvcmtfcV9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIE1ha2luZyBhbiBlbnRyeSBpbiB0aGUgcXVldWUgaXMgc2ltcGx5IGEgbWF0dGVyIG9mIHNldHRpbmcKKwkgKiBhIGJpdCBmb3IgdGhlIGNhcmQgaW5kaWNhdGluZyB0aGF0IHRoZXJlIGlzIHdvcmsgdG8gZG8gaW4gdGhlCisJICogYm90dG9tIGhhbGYgZm9yIHRoZSBjYXJkLiAgTm90ZSB0aGUgbGltaXRhdGlvbiBvZiA2NCBjYXJkcy4KKwkgKiBUaGF0IG91Z2h0IHRvIGJlIGVub3VnaAorCSAqLworCW1hc2sgPSAxIDw8IGNhcmRfaW5kZXg7CisJKnF1ZXVlIHw9IG1hc2s7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZnN0X3dvcmtfcV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitmc3RfcHJvY2Vzc190eF93b3JrX3EodW5zaWduZWQgbG9uZyAvKnZvaWQgKiovd29ya19xKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTY0IHdvcmtfdHhxOworCWludCBpOworCisJLyoKKwkgKiBHcmFiIHRoZSBxdWV1ZSBleGNsdXNpdmVseQorCSAqLworCWRiZyhEQkdfVFgsICJmc3RfcHJvY2Vzc190eF93b3JrX3FcbiIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZmc3Rfd29ya19xX2xvY2ssIGZsYWdzKTsKKwl3b3JrX3R4cSA9IGZzdF93b3JrX3R4cTsKKwlmc3Rfd29ya190eHEgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZzdF93b3JrX3FfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBDYWxsIHRoZSBib3R0b20gaGFsZiBmb3IgZWFjaCBjYXJkIHdpdGggd29yayB3YWl0aW5nCisJICovCisJZm9yIChpID0gMDsgaSA8IEZTVF9NQVhfQ0FSRFM7IGkrKykgeworCQlpZiAod29ya190eHEgJiAweDAxKSB7CisJCQlpZiAoZnN0X2NhcmRfYXJyYXlbaV0gIT0gTlVMTCkgeworCQkJCWRiZyhEQkdfVFgsICJDYWxsaW5nIHR4IGJoIGZvciBjYXJkICVkXG4iLCBpKTsKKwkJCQlkb19ib3R0b21faGFsZl90eChmc3RfY2FyZF9hcnJheVtpXSk7CisJCQl9CisJCX0KKwkJd29ya190eHEgPSB3b3JrX3R4cSA+PiAxOworCX0KK30KKworc3RhdGljIHZvaWQKK2ZzdF9wcm9jZXNzX2ludF93b3JrX3EodW5zaWduZWQgbG9uZyAvKnZvaWQgKiovd29ya19xKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTY0IHdvcmtfaW50cTsKKwlpbnQgaTsKKworCS8qCisJICogR3JhYiB0aGUgcXVldWUgZXhjbHVzaXZlbHkKKwkgKi8KKwlkYmcoREJHX0lOVFIsICJmc3RfcHJvY2Vzc19pbnRfd29ya19xXG4iKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZnN0X3dvcmtfcV9sb2NrLCBmbGFncyk7CisJd29ya19pbnRxID0gZnN0X3dvcmtfaW50cTsKKwlmc3Rfd29ya19pbnRxID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmc3Rfd29ya19xX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogQ2FsbCB0aGUgYm90dG9tIGhhbGYgZm9yIGVhY2ggY2FyZCB3aXRoIHdvcmsgd2FpdGluZworCSAqLworCWZvciAoaSA9IDA7IGkgPCBGU1RfTUFYX0NBUkRTOyBpKyspIHsKKwkJaWYgKHdvcmtfaW50cSAmIDB4MDEpIHsKKwkJCWlmIChmc3RfY2FyZF9hcnJheVtpXSAhPSBOVUxMKSB7CisJCQkJZGJnKERCR19JTlRSLAorCQkJCSAgICAiQ2FsbGluZyByeCAmIHR4IGJoIGZvciBjYXJkICVkXG4iLCBpKTsKKwkJCQlkb19ib3R0b21faGFsZl9yeChmc3RfY2FyZF9hcnJheVtpXSk7CisJCQkJZG9fYm90dG9tX2hhbGZfdHgoZnN0X2NhcmRfYXJyYXlbaV0pOworCQkJfQorCQl9CisJCXdvcmtfaW50cSA9IHdvcmtfaW50cSA+PiAxOworCX0KK30KKworLyogICAgICBDYXJkIGNvbnRyb2wgZnVuY3Rpb25zCisgKiAgICAgID09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLyogICAgICBQbGFjZSB0aGUgcHJvY2Vzc29yIGluIHJlc2V0IHN0YXRlCisgKgorICogVXNlZCB0byBiZSBhIHNpbXBsZSB3cml0ZSB0byBjYXJkIGNvbnRyb2wgc3BhY2UgYnV0IGEgZ2xpdGNoIGluIHRoZSBsYXRlc3QKKyAqIEFNRCBBbTE4NkNIIHByb2Nlc3NvciBtZWFucyB0aGF0IHdlIG5vdyBoYXZlIHRvIGRvIGl0IGJ5IGFzc2VydGluZyBhbmQgZGUtCisgKiBhc3NlcnRpbmcgdGhlIFBMWCBjaGlwIFBDSSBBZGFwdGVyIFNvZnR3YXJlIFJlc2V0LiBCaXQgMzAgaW4gQ05UUkwgcmVnaXN0ZXIKKyAqIGF0IG9mZnNldCA5MDUyX0NOVFJMLiAgTm90ZSB0aGUgdXBkYXRlcyBmb3IgdGhlIFRYVS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitmc3RfY3B1cmVzZXQoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQpCit7CisJdW5zaWduZWQgY2hhciBpbnRlcnJ1cHRfbGluZV9yZWdpc3RlcjsKKwl1bnNpZ25lZCBsb25nIGogPSBqaWZmaWVzICsgMTsKKwl1bnNpZ25lZCBpbnQgcmVndmFsOworCisJaWYgKGNhcmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RYVSkgeworCQlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUKKwkJICAgIChjYXJkLT5kZXZpY2UsIFBDSV9JTlRFUlJVUFRfTElORSwgJmludGVycnVwdF9saW5lX3JlZ2lzdGVyKSkgeworCQkJZGJnKERCR19BU1MsCisJCQkgICAgIkVycm9yIGluIHJlYWRpbmcgaW50ZXJydXB0IGxpbmUgcmVnaXN0ZXJcbiIpOworCQl9CisJCS8qCisJCSAqIEFzc2VydCBQTFggc29mdHdhcmUgcmVzZXQgYW5kIEFtMTg2IGhhcmR3YXJlIHJlc2V0CisJCSAqIGFuZCB0aGVuIGRlYXNzZXJ0IHRoZSBQTFggc29mdHdhcmUgcmVzZXQgYnV0IDE4NiBzdGlsbCBpbiByZXNldAorCQkgKi8KKwkJb3V0dygweDQ0MGYsIGNhcmQtPnBjaV9jb25mICsgQ05UUkxfOTA1NCArIDIpOworCQlvdXR3KDB4MDQwZiwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDU0ICsgMik7CisJCS8qCisJCSAqIFdlIGFyZSBkZWxheWluZyBoZXJlIHRvIGFsbG93IHRoZSA5MDU0IHRvIHJlc2V0IGl0c2VsZgorCQkgKi8KKwkJaiA9IGppZmZpZXMgKyAxOworCQl3aGlsZSAoamlmZmllcyA8IGopCisJCQkvKiBEbyBub3RoaW5nICovIDsKKwkJb3V0dygweDI0MGYsIGNhcmQtPnBjaV9jb25mICsgQ05UUkxfOTA1NCArIDIpOworCQkvKgorCQkgKiBXZSBhcmUgZGVsYXlpbmcgaGVyZSB0byBhbGxvdyB0aGUgOTA1NCB0byByZWxvYWQgaXRzIGVlcHJvbQorCQkgKi8KKwkJaiA9IGppZmZpZXMgKyAxOworCQl3aGlsZSAoamlmZmllcyA8IGopCisJCQkvKiBEbyBub3RoaW5nICovIDsKKwkJb3V0dygweDA0MGYsIGNhcmQtPnBjaV9jb25mICsgQ05UUkxfOTA1NCArIDIpOworCisJCWlmIChwY2lfd3JpdGVfY29uZmlnX2J5dGUKKwkJICAgIChjYXJkLT5kZXZpY2UsIFBDSV9JTlRFUlJVUFRfTElORSwgaW50ZXJydXB0X2xpbmVfcmVnaXN0ZXIpKSB7CisJCQlkYmcoREJHX0FTUywKKwkJCSAgICAiRXJyb3IgaW4gd3JpdGluZyBpbnRlcnJ1cHQgbGluZSByZWdpc3RlclxuIik7CisJCX0KKworCX0gZWxzZSB7CisJCXJlZ3ZhbCA9IGlubChjYXJkLT5wY2lfY29uZiArIENOVFJMXzkwNTIpOworCisJCW91dGwocmVndmFsIHwgMHg0MDAwMDAwMCwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDUyKTsKKwkJb3V0bChyZWd2YWwgJiB+MHg0MDAwMDAwMCwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDUyKTsKKwl9Cit9CisKKy8qICAgICAgUmVsZWFzZSB0aGUgcHJvY2Vzc29yIGZyb20gcmVzZXQKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitmc3RfY3B1cmVsZWFzZShzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCkKK3sKKwlpZiAoY2FyZC0+ZmFtaWx5ID09IEZTVF9GQU1JTFlfVFhVKSB7CisJCS8qCisJCSAqIEZvcmNlIHBvc3RlZCB3cml0ZXMgdG8gY29tcGxldGUKKwkJICovCisJCSh2b2lkKSByZWFkYihjYXJkLT5tZW0pOworCisJCS8qCisJCSAqIFJlbGVhc2UgTFJFU0VUIERPID0gMQorCQkgKiBUaGVuIHJlbGVhc2UgTG9jYWwgSG9sZCwgRE8gPSAxCisJCSAqLworCQlvdXR3KDB4MDQwZSwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDU0ICsgMik7CisJCW91dHcoMHgwNDBmLCBjYXJkLT5wY2lfY29uZiArIENOVFJMXzkwNTQgKyAyKTsKKwl9IGVsc2UgeworCQkodm9pZCkgcmVhZGIoY2FyZC0+Y3RsbWVtKTsKKwl9Cit9CisKKy8qICAgICAgQ2xlYXIgdGhlIGNhcmRzIGludGVycnVwdCBmbGFnCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZnN0X2NsZWFyX2ludHIoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQpCit7CisJaWYgKGNhcmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RYVSkgeworCQkodm9pZCkgcmVhZGIoY2FyZC0+Y3RsbWVtKTsKKwl9IGVsc2UgeworCQkvKiBQb2tlIHRoZSBhcHByb3ByaWF0ZSBQTFggY2hpcCByZWdpc3RlciAoc2FtZSBhcyBlbmFibGluZyBpbnRlcnJ1cHRzKQorCQkgKi8KKwkJb3V0dygweDA1NDMsIGNhcmQtPnBjaV9jb25mICsgSU5UQ1NSXzkwNTIpOworCX0KK30KKworLyogICAgICBFbmFibGUgY2FyZCBpbnRlcnJ1cHRzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZnN0X2VuYWJsZV9pbnRyKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkKQoreworCWlmIChjYXJkLT5mYW1pbHkgPT0gRlNUX0ZBTUlMWV9UWFUpIHsKKwkJb3V0bCgweDBmMGMwOTAwLCBjYXJkLT5wY2lfY29uZiArIElOVENTUl85MDU0KTsKKwl9IGVsc2UgeworCQlvdXR3KDB4MDU0MywgY2FyZC0+cGNpX2NvbmYgKyBJTlRDU1JfOTA1Mik7CisJfQorfQorCisvKiAgICAgIERpc2FibGUgY2FyZCBpbnRlcnJ1cHRzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZnN0X2Rpc2FibGVfaW50cihzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCkKK3sKKwlpZiAoY2FyZC0+ZmFtaWx5ID09IEZTVF9GQU1JTFlfVFhVKSB7CisJCW91dGwoMHgwMDAwMDAwMCwgY2FyZC0+cGNpX2NvbmYgKyBJTlRDU1JfOTA1NCk7CisJfSBlbHNlIHsKKwkJb3V0dygweDAwMDAsIGNhcmQtPnBjaV9jb25mICsgSU5UQ1NSXzkwNTIpOworCX0KK30KKworLyogICAgICBQcm9jZXNzIHRoZSByZXN1bHQgb2YgdHJ5aW5nIHRvIHBhc3MgYSByZWNlaXZlZCBmcmFtZSB1cCB0aGUgc3RhY2sKKyAqLworc3RhdGljIHZvaWQKK2ZzdF9wcm9jZXNzX3J4X3N0YXR1cyhpbnQgcnhfc3RhdHVzLCBjaGFyICpuYW1lKQoreworCXN3aXRjaCAocnhfc3RhdHVzKSB7CisJY2FzZSBORVRfUlhfU1VDQ0VTUzoKKwkJeworCQkJLyoKKwkJCSAqIE5vdGhpbmcgdG8gZG8gaGVyZQorCQkJICovCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBORVRfUlhfQ05fTE9XOgorCQl7CisJCQlkYmcoREJHX0FTUywgIiVzOiBSZWNlaXZlIExvdyBDb25nZXN0aW9uXG4iLCBuYW1lKTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNlIE5FVF9SWF9DTl9NT0Q6CisJCXsKKwkJCWRiZyhEQkdfQVNTLCAiJXM6IFJlY2VpdmUgTW9kZXJhdGUgQ29uZ2VzdGlvblxuIiwgbmFtZSk7CisJCQlicmVhazsKKwkJfQorCisJY2FzZSBORVRfUlhfQ05fSElHSDoKKwkJeworCQkJZGJnKERCR19BU1MsICIlczogUmVjZWl2ZSBIaWdoIENvbmdlc3Rpb25cbiIsIG5hbWUpOworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgTkVUX1JYX0RST1A6CisJCXsKKwkJCWRiZyhEQkdfQVNTLCAiJXM6IFJlY2VpdmVkIHBhY2tldCBkcm9wcGVkXG4iLCBuYW1lKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKiAgICAgIEluaXRpbGFpc2UgRE1BIGZvciBQTFggOTA1NAorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2ZzdF9pbml0X2RtYShzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCkKK3sKKwkvKgorCSAqIFRoaXMgaXMgb25seSByZXF1aXJlZCBmb3IgdGhlIFBMWCA5MDU0CisJICovCisJaWYgKGNhcmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RYVSkgeworCSAgICAgICAgcGNpX3NldF9tYXN0ZXIoY2FyZC0+ZGV2aWNlKTsKKwkJb3V0bCgweDAwMDIwNDQxLCBjYXJkLT5wY2lfY29uZiArIERNQU1PREUwKTsKKwkJb3V0bCgweDAwMDIwNDQxLCBjYXJkLT5wY2lfY29uZiArIERNQU1PREUxKTsKKwkJb3V0bCgweDAsIGNhcmQtPnBjaV9jb25mICsgRE1BVEhSKTsKKwl9Cit9CisKKy8qICAgICAgVHggZG1hIGNvbXBsZXRlIGludGVycnVwdAorICovCitzdGF0aWMgdm9pZAorZnN0X3R4X2RtYV9jb21wbGV0ZShzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCwgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQsCisJCSAgICBpbnQgbGVuLCBpbnQgdHhwb3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnRfdG9fZGV2KHBvcnQpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKworCS8qCisJICogRXZlcnl0aGluZyBpcyBub3cgc2V0LCBqdXN0IHRlbGwgdGhlIGNhcmQgdG8gZ28KKwkgKi8KKwlkYmcoREJHX1RYLCAiZnN0X3R4X2RtYV9jb21wbGV0ZVxuIik7CisJRlNUX1dSQihjYXJkLCB0eERlc2NyUmluZ1twb3J0LT5pbmRleF1bdHhwb3NdLmJpdHMsCisJCURNQV9PV04gfCBUWF9TVFAgfCBUWF9FTlApOworCXN0YXRzLT50eF9wYWNrZXRzKys7CisJc3RhdHMtPnR4X2J5dGVzICs9IGxlbjsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKK30KKworLyoKKyAqIE1hcmsgaXQgZm9yIG91ciBvd24gcmF3IHNvY2tldHMgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmYXJzeW5jX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2tiLT5kZXYgPSBkZXY7CisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKKwlyZXR1cm4gaHRvbnMoRVRIX1BfQ1VTVCk7Cit9CisKKy8qICAgICAgUnggZG1hIGNvbXBsZXRlIGludGVycnVwdAorICovCitzdGF0aWMgdm9pZAorZnN0X3J4X2RtYV9jb21wbGV0ZShzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCwgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQsCisJCSAgICBpbnQgbGVuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcnhwKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwb3J0X3RvX2Rldihwb3J0KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisJaW50IHBpOworCWludCByeF9zdGF0dXM7CisKKwlkYmcoREJHX1RYLCAiZnN0X3J4X2RtYV9jb21wbGV0ZVxuIik7CisJcGkgPSBwb3J0LT5pbmRleDsKKwltZW1jcHkoc2tiX3B1dChza2IsIGxlbiksIGNhcmQtPnJ4X2RtYV9oYW5kbGVfaG9zdCwgbGVuKTsKKworCS8qIFJlc2V0IGJ1ZmZlciBkZXNjcmlwdG9yICovCisJRlNUX1dSQihjYXJkLCByeERlc2NyUmluZ1twaV1bcnhwXS5iaXRzLCBETUFfT1dOKTsKKworCS8qIFVwZGF0ZSBzdGF0cyAqLworCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJc3RhdHMtPnJ4X2J5dGVzICs9IGxlbjsKKworCS8qIFB1c2ggdXBzdHJlYW0gKi8KKwlkYmcoREJHX1JYLCAiUHVzaGluZyB0aGUgZnJhbWUgdXAgdGhlIHN0YWNrXG4iKTsKKwlpZiAocG9ydC0+bW9kZSA9PSBGU1RfUkFXKQorCQlza2ItPnByb3RvY29sID0gZmFyc3luY190eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwllbHNlCisJCXNrYi0+cHJvdG9jb2wgPSBoZGxjX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCXJ4X3N0YXR1cyA9IG5ldGlmX3J4KHNrYik7CisJZnN0X3Byb2Nlc3Nfcnhfc3RhdHVzKHJ4X3N0YXR1cywgcG9ydF90b19kZXYocG9ydCktPm5hbWUpOworCWlmIChyeF9zdGF0dXMgPT0gTkVUX1JYX0RST1ApCisJCXN0YXRzLT5yeF9kcm9wcGVkKys7CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKK30KKworLyoKKyAqICAgICAgUmVjZWl2ZSBhIGZyYW1lIHRocm91Z2ggdGhlIERNQQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2ZzdF9yeF9kbWEoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHVuc2lnbmVkIGNoYXIgKnNrYiwKKwkgICB1bnNpZ25lZCBjaGFyICptZW0sIGludCBsZW4pCit7CisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgd2lsbCBzZXR1cCB0aGUgRE1BIGFuZCBzdGFydCBpdAorCSAqLworCisJZGJnKERCR19SWCwgIkluIGZzdF9yeF9kbWEgJXAgJXAgJWRcbiIsIHNrYiwgbWVtLCBsZW4pOworCWlmIChjYXJkLT5kbWFyeF9pbl9wcm9ncmVzcykgeworCQlkYmcoREJHX0FTUywgIkluIGZzdF9yeF9kbWEgd2hpbGUgZG1hIGluIHByb2dyZXNzXG4iKTsKKwl9CisKKwlvdXRsKCh1bnNpZ25lZCBsb25nKSBza2IsIGNhcmQtPnBjaV9jb25mICsgRE1BUEFEUjApOwkvKiBDb3B5IHRvIGhlcmUgKi8KKwlvdXRsKCh1bnNpZ25lZCBsb25nKSBtZW0sIGNhcmQtPnBjaV9jb25mICsgRE1BTEFEUjApOwkvKiBmcm9tIGhlcmUgKi8KKwlvdXRsKGxlbiwgY2FyZC0+cGNpX2NvbmYgKyBETUFTSVowKTsJLyogZm9yIHRoaXMgbGVuZ3RoICovCisJb3V0bCgweDAwMDAwMDAwYywgY2FyZC0+cGNpX2NvbmYgKyBETUFEUFIwKTsJLyogSW4gdGhpcyBkaXJlY3Rpb24gKi8KKworCS8qCisJICogV2UgdXNlIHRoZSBkbWFyeF9pbl9wcm9ncmVzcyBmbGFnIHRvIGZsYWcgdGhlIGNoYW5uZWwgYXMgYnVzeQorCSAqLworCWNhcmQtPmRtYXJ4X2luX3Byb2dyZXNzID0gMTsKKwlvdXRiKDB4MDMsIGNhcmQtPnBjaV9jb25mICsgRE1BQ1NSMCk7CS8qIFN0YXJ0IHRoZSB0cmFuc2ZlciAqLworfQorCisvKgorICogICAgICBTZW5kIGEgZnJhbWUgdGhyb3VnaCB0aGUgRE1BCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZnN0X3R4X2RtYShzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCwgdW5zaWduZWQgY2hhciAqc2tiLAorCSAgIHVuc2lnbmVkIGNoYXIgKm1lbSwgaW50IGxlbikKK3sKKwkvKgorCSAqIFRoaXMgcm91dGluZSB3aWxsIHNldHVwIHRoZSBETUEgYW5kIHN0YXJ0IGl0LgorCSAqLworCisJZGJnKERCR19UWCwgIkluIGZzdF90eF9kbWEgJXAgJXAgJWRcbiIsIHNrYiwgbWVtLCBsZW4pOworCWlmIChjYXJkLT5kbWF0eF9pbl9wcm9ncmVzcykgeworCQlkYmcoREJHX0FTUywgIkluIGZzdF90eF9kbWEgd2hpbGUgZG1hIGluIHByb2dyZXNzXG4iKTsKKwl9CisKKwlvdXRsKCh1bnNpZ25lZCBsb25nKSBza2IsIGNhcmQtPnBjaV9jb25mICsgRE1BUEFEUjEpOwkvKiBDb3B5IGZyb20gaGVyZSAqLworCW91dGwoKHVuc2lnbmVkIGxvbmcpIG1lbSwgY2FyZC0+cGNpX2NvbmYgKyBETUFMQURSMSk7CS8qIHRvIGhlcmUgKi8KKwlvdXRsKGxlbiwgY2FyZC0+cGNpX2NvbmYgKyBETUFTSVoxKTsJLyogZm9yIHRoaXMgbGVuZ3RoICovCisJb3V0bCgweDAwMDAwMDAwNCwgY2FyZC0+cGNpX2NvbmYgKyBETUFEUFIxKTsJLyogSW4gdGhpcyBkaXJlY3Rpb24gKi8KKworCS8qCisJICogV2UgdXNlIHRoZSBkbWF0eF9pbl9wcm9ncmVzcyB0byBmbGFnIHRoZSBjaGFubmVsIGFzIGJ1c3kKKwkgKi8KKwljYXJkLT5kbWF0eF9pbl9wcm9ncmVzcyA9IDE7CisJb3V0YigweDAzLCBjYXJkLT5wY2lfY29uZiArIERNQUNTUjEpOwkvKiBTdGFydCB0aGUgdHJhbnNmZXIgKi8KK30KKworLyogICAgICBJc3N1ZSBhIE1haWxib3ggY29tbWFuZCBmb3IgYSBwb3J0LgorICogICAgICBOb3RlIHdlIGlzc3VlIHRoZW0gb24gYSBmaXJlIGFuZCBmb3JnZXQgYmFzaXMsIG5vdCBleHBlY3RpbmcgdG8gc2VlIGFuCisgKiAgICAgIGVycm9yIGFuZCBub3Qgd2FpdGluZyBmb3IgY29tcGxldGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2ZzdF9pc3N1ZV9jbWQoc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQsIHVuc2lnbmVkIHNob3J0IGNtZCkKK3sKKwlzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZDsKKwl1bnNpZ25lZCBzaG9ydCBtYnZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzYWZldHk7CisKKwljYXJkID0gcG9ydC0+Y2FyZDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJbWJ2YWwgPSBGU1RfUkRXKGNhcmQsIHBvcnRNYWlsYm94W3BvcnQtPmluZGV4XVswXSk7CisKKwlzYWZldHkgPSAwOworCS8qIFdhaXQgZm9yIGFueSBwcmV2aW91cyBjb21tYW5kIHRvIGNvbXBsZXRlICovCisJd2hpbGUgKG1idmFsID4gTkFLKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisKKwkJaWYgKCsrc2FmZXR5ID4gMjAwMCkgeworCQkJcHJpbnRrX2VycigiTWFpbGJveCBzYWZldHkgdGltZW91dFxuIik7CisJCQlicmVhazsKKwkJfQorCisJCW1idmFsID0gRlNUX1JEVyhjYXJkLCBwb3J0TWFpbGJveFtwb3J0LT5pbmRleF1bMF0pOworCX0KKwlpZiAoc2FmZXR5ID4gMCkgeworCQlkYmcoREJHX0NNRCwgIk1haWxib3ggY2xlYXIgYWZ0ZXIgJWQgamlmZmllc1xuIiwgc2FmZXR5KTsKKwl9CisJaWYgKG1idmFsID09IE5BSykgeworCQlkYmcoREJHX0NNRCwgImlzc3VlX2NtZDogcHJldmlvdXMgY29tbWFuZCB3YXMgTkFLJ2RcbiIpOworCX0KKworCUZTVF9XUlcoY2FyZCwgcG9ydE1haWxib3hbcG9ydC0+aW5kZXhdWzBdLCBjbWQpOworCisJaWYgKGNtZCA9PSBBQk9SVFRYIHx8IGNtZCA9PSBTVEFSVFBPUlQpIHsKKwkJcG9ydC0+dHhwb3MgPSAwOworCQlwb3J0LT50eGlwb3MgPSAwOworCQlwb3J0LT5zdGFydCA9IDA7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7Cit9CisKKy8qICAgICAgUG9ydCBvdXRwdXQgc2lnbmFscyBjb250cm9sCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZnN0X29wX3JhaXNlKHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LCB1bnNpZ25lZCBpbnQgb3V0cHV0cykKK3sKKwlvdXRwdXRzIHw9IEZTVF9SREwocG9ydC0+Y2FyZCwgdjI0T3BTdHNbcG9ydC0+aW5kZXhdKTsKKwlGU1RfV1JMKHBvcnQtPmNhcmQsIHYyNE9wU3RzW3BvcnQtPmluZGV4XSwgb3V0cHV0cyk7CisKKwlpZiAocG9ydC0+cnVuKQorCQlmc3RfaXNzdWVfY21kKHBvcnQsIFNFVFYyNE8pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ZzdF9vcF9sb3dlcihzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCwgdW5zaWduZWQgaW50IG91dHB1dHMpCit7CisJb3V0cHV0cyA9IH5vdXRwdXRzICYgRlNUX1JETChwb3J0LT5jYXJkLCB2MjRPcFN0c1twb3J0LT5pbmRleF0pOworCUZTVF9XUkwocG9ydC0+Y2FyZCwgdjI0T3BTdHNbcG9ydC0+aW5kZXhdLCBvdXRwdXRzKTsKKworCWlmIChwb3J0LT5ydW4pCisJCWZzdF9pc3N1ZV9jbWQocG9ydCwgU0VUVjI0Tyk7Cit9CisKKy8qCisgKiAgICAgIFNldHVwIHBvcnQgUnggYnVmZmVycworICovCitzdGF0aWMgdm9pZAorZnN0X3J4X2NvbmZpZyhzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCkKK3sKKwlpbnQgaTsKKwlpbnQgcGk7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOworCisJcGkgPSBwb3J0LT5pbmRleDsKKwljYXJkID0gcG9ydC0+Y2FyZDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9CVUZGRVI7IGkrKykgeworCQlvZmZzZXQgPSBCVUZfT0ZGU0VUKHJ4QnVmZmVyW3BpXVtpXVswXSk7CisKKwkJRlNUX1dSVyhjYXJkLCByeERlc2NyUmluZ1twaV1baV0ubGFkciwgKHUxNikgb2Zmc2V0KTsKKwkJRlNUX1dSQihjYXJkLCByeERlc2NyUmluZ1twaV1baV0uaGFkciwgKHU4KSAob2Zmc2V0ID4+IDE2KSk7CisJCUZTVF9XUlcoY2FyZCwgcnhEZXNjclJpbmdbcGldW2ldLmJjbnQsIGNudl9iY250KExFTl9SWF9CVUZGRVIpKTsKKwkJRlNUX1dSVyhjYXJkLCByeERlc2NyUmluZ1twaV1baV0ubWNudCwgTEVOX1JYX0JVRkZFUik7CisJCUZTVF9XUkIoY2FyZCwgcnhEZXNjclJpbmdbcGldW2ldLmJpdHMsIERNQV9PV04pOworCX0KKwlwb3J0LT5yeHBvcyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiAgICAgIFNldHVwIHBvcnQgVHggYnVmZmVycworICovCitzdGF0aWMgdm9pZAorZnN0X3R4X2NvbmZpZyhzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCkKK3sKKwlpbnQgaTsKKwlpbnQgcGk7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOworCisJcGkgPSBwb3J0LT5pbmRleDsKKwljYXJkID0gcG9ydC0+Y2FyZDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IE5VTV9UWF9CVUZGRVI7IGkrKykgeworCQlvZmZzZXQgPSBCVUZfT0ZGU0VUKHR4QnVmZmVyW3BpXVtpXVswXSk7CisKKwkJRlNUX1dSVyhjYXJkLCB0eERlc2NyUmluZ1twaV1baV0ubGFkciwgKHUxNikgb2Zmc2V0KTsKKwkJRlNUX1dSQihjYXJkLCB0eERlc2NyUmluZ1twaV1baV0uaGFkciwgKHU4KSAob2Zmc2V0ID4+IDE2KSk7CisJCUZTVF9XUlcoY2FyZCwgdHhEZXNjclJpbmdbcGldW2ldLmJjbnQsIDApOworCQlGU1RfV1JCKGNhcmQsIHR4RGVzY3JSaW5nW3BpXVtpXS5iaXRzLCAwKTsKKwl9CisJcG9ydC0+dHhwb3MgPSAwOworCXBvcnQtPnR4aXBvcyA9IDA7CisJcG9ydC0+c3RhcnQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworfQorCisvKiAgICAgIFRFMSBBbGFybSBjaGFuZ2UgaW50ZXJydXB0IGV2ZW50CisgKi8KK3N0YXRpYyB2b2lkCitmc3RfaW50cl90ZTFfYWxhcm0oc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0KQoreworCXU4IGxvczsKKwl1OCBycmE7CisJdTggYWlzOworCisJbG9zID0gRlNUX1JEQihjYXJkLCBzdVN0YXR1cy5sb3NzT2ZTaWduYWwpOworCXJyYSA9IEZTVF9SREIoY2FyZCwgc3VTdGF0dXMucmVjZWl2ZVJlbW90ZUFsYXJtKTsKKwlhaXMgPSBGU1RfUkRCKGNhcmQsIHN1U3RhdHVzLmFsYXJtSW5kaWNhdGlvblNpZ25hbCk7CisKKwlpZiAobG9zKSB7CisJCS8qCisJCSAqIExvc3QgdGhlIGxpbmsKKwkJICovCisJCWlmIChuZXRpZl9jYXJyaWVyX29rKHBvcnRfdG9fZGV2KHBvcnQpKSkgeworCQkJZGJnKERCR19JTlRSLCAiTmV0IGNhcnJpZXIgb2ZmXG4iKTsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKHBvcnRfdG9fZGV2KHBvcnQpKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIExpbmsgYXZhaWxhYmxlCisJCSAqLworCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2socG9ydF90b19kZXYocG9ydCkpKSB7CisJCQlkYmcoREJHX0lOVFIsICJOZXQgY2FycmllciBvblxuIik7CisJCQluZXRpZl9jYXJyaWVyX29uKHBvcnRfdG9fZGV2KHBvcnQpKTsKKwkJfQorCX0KKworCWlmIChsb3MpCisJCWRiZyhEQkdfSU5UUiwgIkFzc2VydCBMT1MgQWxhcm1cbiIpOworCWVsc2UKKwkJZGJnKERCR19JTlRSLCAiRGUtYXNzZXJ0IExPUyBBbGFybVxuIik7CisJaWYgKHJyYSkKKwkJZGJnKERCR19JTlRSLCAiQXNzZXJ0IFJSQSBBbGFybVxuIik7CisJZWxzZQorCQlkYmcoREJHX0lOVFIsICJEZS1hc3NlcnQgUlJBIEFsYXJtXG4iKTsKKworCWlmIChhaXMpCisJCWRiZyhEQkdfSU5UUiwgIkFzc2VydCBBSVMgQWxhcm1cbiIpOworCWVsc2UKKwkJZGJnKERCR19JTlRSLCAiRGUtYXNzZXJ0IEFJUyBBbGFybVxuIik7Cit9CisKKy8qICAgICAgQ29udHJvbCBzaWduYWwgY2hhbmdlIGludGVycnVwdCBldmVudAorICovCitzdGF0aWMgdm9pZAorZnN0X2ludHJfY3RsY2hnKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCkKK3sKKwlpbnQgc2lnbmFsczsKKworCXNpZ25hbHMgPSBGU1RfUkRMKGNhcmQsIHYyNERlYm91bmNlZFN0c1twb3J0LT5pbmRleF0pOworCisJaWYgKHNpZ25hbHMgJiAoKChwb3J0LT5od2lmID09IFgyMSkgfHwgKHBvcnQtPmh3aWYgPT0gWDIxRCkpCisJCSAgICAgICA/IElQU1RTX0lORElDQVRFIDogSVBTVFNfRENEKSkgeworCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2socG9ydF90b19kZXYocG9ydCkpKSB7CisJCQlkYmcoREJHX0lOVFIsICJEQ0QgYWN0aXZlXG4iKTsKKwkJCW5ldGlmX2NhcnJpZXJfb24ocG9ydF90b19kZXYocG9ydCkpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKG5ldGlmX2NhcnJpZXJfb2socG9ydF90b19kZXYocG9ydCkpKSB7CisJCQlkYmcoREJHX0lOVFIsICJEQ0QgbG9zdFxuIik7CisJCQluZXRpZl9jYXJyaWVyX29mZihwb3J0X3RvX2Rldihwb3J0KSk7CisJCX0KKwl9Cit9CisKKy8qICAgICAgTG9nIFJ4IEVycm9ycworICovCitzdGF0aWMgdm9pZAorZnN0X2xvZ19yeF9lcnJvcihzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCwgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQsCisJCSB1bnNpZ25lZCBjaGFyIGRtYWJpdHMsIGludCByeHAsIHVuc2lnbmVkIHNob3J0IGxlbikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydF90b19kZXYocG9ydCk7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCisJLyogCisJICogSW5jcmVtZW50IHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb3VudGVyCisJICovCisJc3RhdHMtPnJ4X2Vycm9ycysrOworCWlmIChkbWFiaXRzICYgUlhfT0ZMTykgeworCQlzdGF0cy0+cnhfZmlmb19lcnJvcnMrKzsKKwkJZGJnKERCR19BU1MsICJSeCBmaWZvIGVycm9yIG9uIGNhcmQgJWQgcG9ydCAlZCBidWZmZXIgJWRcbiIsCisJCSAgICBjYXJkLT5jYXJkX25vLCBwb3J0LT5pbmRleCwgcnhwKTsKKwl9CisJaWYgKGRtYWJpdHMgJiBSWF9DUkMpIHsKKwkJc3RhdHMtPnJ4X2NyY19lcnJvcnMrKzsKKwkJZGJnKERCR19BU1MsICJSeCBjcmMgZXJyb3Igb24gY2FyZCAlZCBwb3J0ICVkXG4iLAorCQkgICAgY2FyZC0+Y2FyZF9ubywgcG9ydC0+aW5kZXgpOworCX0KKwlpZiAoZG1hYml0cyAmIFJYX0ZSQU0pIHsKKwkJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycysrOworCQlkYmcoREJHX0FTUywgIlJ4IGZyYW1lIGVycm9yIG9uIGNhcmQgJWQgcG9ydCAlZFxuIiwKKwkJICAgIGNhcmQtPmNhcmRfbm8sIHBvcnQtPmluZGV4KTsKKwl9CisJaWYgKGRtYWJpdHMgPT0gKFJYX1NUUCB8IFJYX0VOUCkpIHsKKwkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJZGJnKERCR19BU1MsICJSeCBsZW5ndGggZXJyb3IgKCVkKSBvbiBjYXJkICVkIHBvcnQgJWRcbiIsCisJCSAgICBsZW4sIGNhcmQtPmNhcmRfbm8sIHBvcnQtPmluZGV4KTsKKwl9Cit9CisKKy8qICAgICAgUnggRXJyb3IgUmVjb3ZlcnkKKyAqLworc3RhdGljIHZvaWQKK2ZzdF9yZWNvdmVyX3J4X2Vycm9yKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCwKKwkJICAgICB1bnNpZ25lZCBjaGFyIGRtYWJpdHMsIGludCByeHAsIHVuc2lnbmVkIHNob3J0IGxlbikKK3sKKwlpbnQgaTsKKwlpbnQgcGk7CisKKwlwaSA9IHBvcnQtPmluZGV4OworCS8qIAorCSAqIERpc2NhcmQgYnVmZmVyIGRlc2NyaXB0b3JzIHVudGlsIHdlIHNlZSB0aGUgc3RhcnQgb2YgdGhlCisJICogbmV4dCBmcmFtZS4gIE5vdGUgdGhhdCBmb3IgbG9uZyBmcmFtZXMgdGhpcyBjb3VsZCBiZSBpbgorCSAqIGEgc3Vic2VxdWVudCBpbnRlcnJ1cHQuIAorCSAqLworCWkgPSAwOworCXdoaWxlICgoZG1hYml0cyAmIChETUFfT1dOIHwgUlhfU1RQKSkgPT0gMCkgeworCQlGU1RfV1JCKGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtyeHBdLmJpdHMsIERNQV9PV04pOworCQlyeHAgPSAocnhwKzEpICUgTlVNX1JYX0JVRkZFUjsKKwkJaWYgKCsraSA+IE5VTV9SWF9CVUZGRVIpIHsKKwkJCWRiZyhEQkdfQVNTLCAiaW50cl9yeDogRGlzY2FyZGluZyBtb3JlIGJ1ZnMiCisJCQkgICAgIiB0aGFuIHdlIGhhdmVcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJZG1hYml0cyA9IEZTVF9SREIoY2FyZCwgcnhEZXNjclJpbmdbcGldW3J4cF0uYml0cyk7CisJCWRiZyhEQkdfQVNTLCAiRE1BIEJpdHMgb2YgbmV4dCBidWZmZXIgd2FzICV4XG4iLCBkbWFiaXRzKTsKKwl9CisJZGJnKERCR19BU1MsICJUaGVyZSB3ZXJlICVkIHN1YnNlcXVlbnQgYnVmZmVycyBpbiBlcnJvclxuIiwgaSk7CisKKwkvKiBEaXNjYXJkIHRoZSB0ZXJtaW5hbCBidWZmZXIgKi8KKwlpZiAoIShkbWFiaXRzICYgRE1BX09XTikpIHsKKwkJRlNUX1dSQihjYXJkLCByeERlc2NyUmluZ1twaV1bcnhwXS5iaXRzLCBETUFfT1dOKTsKKwkJcnhwID0gKHJ4cCsxKSAlIE5VTV9SWF9CVUZGRVI7CisJfQorCXBvcnQtPnJ4cG9zID0gcnhwOworCXJldHVybjsKKworfQorCisvKiAgICAgIFJ4IGNvbXBsZXRlIGludGVycnVwdAorICovCitzdGF0aWMgdm9pZAorZnN0X2ludHJfcngoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0KQoreworCXVuc2lnbmVkIGNoYXIgZG1hYml0czsKKwlpbnQgcGk7CisJaW50IHJ4cDsKKwlpbnQgcnhfc3RhdHVzOworCXVuc2lnbmVkIHNob3J0IGxlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwb3J0X3RvX2Rldihwb3J0KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisKKwkvKiBDaGVjayB3ZSBoYXZlIGEgYnVmZmVyIHRvIHByb2Nlc3MgKi8KKwlwaSA9IHBvcnQtPmluZGV4OworCXJ4cCA9IHBvcnQtPnJ4cG9zOworCWRtYWJpdHMgPSBGU1RfUkRCKGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtyeHBdLmJpdHMpOworCWlmIChkbWFiaXRzICYgRE1BX09XTikgeworCQlkYmcoREJHX1JYIHwgREJHX0lOVFIsICJpbnRyX3J4OiBObyBidWZmZXIgcG9ydCAlZCBwb3MgJWRcbiIsCisJCSAgICBwaSwgcnhwKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoY2FyZC0+ZG1hcnhfaW5fcHJvZ3Jlc3MpIHsKKwkJcmV0dXJuOworCX0KKworCS8qIEdldCBidWZmZXIgbGVuZ3RoICovCisJbGVuID0gRlNUX1JEVyhjYXJkLCByeERlc2NyUmluZ1twaV1bcnhwXS5tY250KTsKKwkvKiBEaXNjYXJkIHRoZSBDUkMgKi8KKwlsZW4gLT0gMjsKKwlpZiAobGVuID09IDApIHsKKwkJLyoKKwkJICogVGhpcyBzZWVtcyB0byBoYXBwZW4gb24gdGhlIFRFMSBpbnRlcmZhY2Ugc29tZXRpbWVzCisJCSAqIHNvIHRocm93IHRoZSBmcmFtZSBhd2F5IGFuZCBsb2cgdGhlIGV2ZW50LgorCQkgKi8KKwkJcHJpbnRrX2VycigiRnJhbWUgcmVjZWl2ZWQgd2l0aCAwIGxlbmd0aC4gQ2FyZCAlZCBQb3J0ICVkXG4iLAorCQkJICAgY2FyZC0+Y2FyZF9ubywgcG9ydC0+aW5kZXgpOworCQkvKiBSZXR1cm4gZGVzY3JpcHRvciB0byBjYXJkICovCisJCUZTVF9XUkIoY2FyZCwgcnhEZXNjclJpbmdbcGldW3J4cF0uYml0cywgRE1BX09XTik7CisKKwkJcnhwID0gKHJ4cCsxKSAlIE5VTV9SWF9CVUZGRVI7CisJCXBvcnQtPnJ4cG9zID0gcnhwOworCQlyZXR1cm47CisJfQorCisJLyogQ2hlY2sgYnVmZmVyIGxlbmd0aCBhbmQgZm9yIG90aGVyIGVycm9ycy4gV2UgaW5zaXN0IG9uIG9uZSBwYWNrZXQKKwkgKiBpbiBvbmUgYnVmZmVyLiBUaGlzIHNpbXBsaWZpZXMgdGhpbmdzIGdyZWF0bHkgYW5kIHNpbmNlIHdlJ3ZlCisJICogYWxsb2NhdGVkIDhLIGl0IHNob3VsZG4ndCBiZSBhIHJlYWwgd29ybGQgbGltaXRhdGlvbgorCSAqLworCWRiZyhEQkdfUlgsICJpbnRyX3J4OiAlZCwlZDogZmxhZ3MgJXggbGVuICVkXG4iLCBwaSwgcnhwLCBkbWFiaXRzLCBsZW4pOworCWlmIChkbWFiaXRzICE9IChSWF9TVFAgfCBSWF9FTlApIHx8IGxlbiA+IExFTl9SWF9CVUZGRVIgLSAyKSB7CisJCWZzdF9sb2dfcnhfZXJyb3IoY2FyZCwgcG9ydCwgZG1hYml0cywgcnhwLCBsZW4pOworCQlmc3RfcmVjb3Zlcl9yeF9lcnJvcihjYXJkLCBwb3J0LCBkbWFiaXRzLCByeHAsIGxlbik7CisJCXJldHVybjsKKwl9CisKKwkvKiBBbGxvY2F0ZSBTS0IgKi8KKwlpZiAoKHNrYiA9IGRldl9hbGxvY19za2IobGVuKSkgPT0gTlVMTCkgeworCQlkYmcoREJHX1JYLCAiaW50cl9yeDogY2FuJ3QgYWxsb2NhdGUgYnVmZmVyXG4iKTsKKworCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCisJCS8qIFJldHVybiBkZXNjcmlwdG9yIHRvIGNhcmQgKi8KKwkJRlNUX1dSQihjYXJkLCByeERlc2NyUmluZ1twaV1bcnhwXS5iaXRzLCBETUFfT1dOKTsKKworCQlyeHAgPSAocnhwKzEpICUgTlVNX1JYX0JVRkZFUjsKKwkJcG9ydC0+cnhwb3MgPSByeHA7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFdlIGtub3cgdGhlIGxlbmd0aCB3ZSBuZWVkIHRvIHJlY2VpdmUsIGxlbi4KKwkgKiBJdCdzIG5vdCB3b3J0aCB1c2luZyB0aGUgRE1BIGZvciByZWFkcyBvZiBsZXNzIHRoYW4KKwkgKiBGU1RfTUlOX0RNQV9MRU4KKwkgKi8KKworCWlmICgobGVuIDwgRlNUX01JTl9ETUFfTEVOKSB8fCAoY2FyZC0+ZmFtaWx5ID09IEZTVF9GQU1JTFlfVFhQKSkgeworCQltZW1jcHlfZnJvbWlvKHNrYl9wdXQoc2tiLCBsZW4pLAorCQkJICAgICAgY2FyZC0+bWVtICsgQlVGX09GRlNFVChyeEJ1ZmZlcltwaV1bcnhwXVswXSksCisJCQkgICAgICBsZW4pOworCisJCS8qIFJlc2V0IGJ1ZmZlciBkZXNjcmlwdG9yICovCisJCUZTVF9XUkIoY2FyZCwgcnhEZXNjclJpbmdbcGldW3J4cF0uYml0cywgRE1BX09XTik7CisKKwkJLyogVXBkYXRlIHN0YXRzICovCisJCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJCXN0YXRzLT5yeF9ieXRlcyArPSBsZW47CisKKwkJLyogUHVzaCB1cHN0cmVhbSAqLworCQlkYmcoREJHX1JYLCAiUHVzaGluZyBmcmFtZSB1cCB0aGUgc3RhY2tcbiIpOworCQlpZiAocG9ydC0+bW9kZSA9PSBGU1RfUkFXKQorCQkJc2tiLT5wcm90b2NvbCA9IGZhcnN5bmNfdHlwZV90cmFucyhza2IsIGRldik7CisJCWVsc2UKKwkJCXNrYi0+cHJvdG9jb2wgPSBoZGxjX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQlyeF9zdGF0dXMgPSBuZXRpZl9yeChza2IpOworCQlmc3RfcHJvY2Vzc19yeF9zdGF0dXMocnhfc3RhdHVzLCBwb3J0X3RvX2Rldihwb3J0KS0+bmFtZSk7CisJCWlmIChyeF9zdGF0dXMgPT0gTkVUX1JYX0RST1ApIHsKKwkJCXN0YXRzLT5yeF9kcm9wcGVkKys7CisJCX0KKwkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwl9IGVsc2UgeworCQljYXJkLT5kbWFfc2tiX3J4ID0gc2tiOworCQljYXJkLT5kbWFfcG9ydF9yeCA9IHBvcnQ7CisJCWNhcmQtPmRtYV9sZW5fcnggPSBsZW47CisJCWNhcmQtPmRtYV9yeHBvcyA9IHJ4cDsKKwkJZnN0X3J4X2RtYShjYXJkLCAoY2hhciAqKSBjYXJkLT5yeF9kbWFfaGFuZGxlX2NhcmQsCisJCQkgICAoY2hhciAqKSBCVUZfT0ZGU0VUKHJ4QnVmZmVyW3BpXVtyeHBdWzBdKSwgbGVuKTsKKwl9CisJaWYgKHJ4cCAhPSBwb3J0LT5yeHBvcykgeworCQlkYmcoREJHX0FTUywgIkFib3V0IHRvIGluY3JlbWVudCByeHBvcyBieSBtb3JlIHRoYW4gMVxuIik7CisJCWRiZyhEQkdfQVNTLCAicnhwID0gJWQgcnhwb3MgPSAlZFxuIiwgcnhwLCBwb3J0LT5yeHBvcyk7CisJfQorCXJ4cCA9IChyeHArMSkgJSBOVU1fUlhfQlVGRkVSOworCXBvcnQtPnJ4cG9zID0gcnhwOworfQorCisvKgorICogICAgICBUaGUgYm90dG9tIGhhbGZzIHRvIHRoZSBJU1IKKyAqCisgKi8KKworc3RhdGljIHZvaWQKK2RvX2JvdHRvbV9oYWxmX3R4KHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkKQoreworCXN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0OworCWludCBwaTsKKwlpbnQgdHhxX2xlbmd0aDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHM7CisKKwkvKgorCSAqICBGaW5kIGEgZnJlZSBidWZmZXIgZm9yIHRoZSB0cmFuc21pdAorCSAqICBTdGVwIHRocm91Z2ggZWFjaCBwb3J0IG9uIHRoaXMgY2FyZAorCSAqLworCisJZGJnKERCR19UWCwgImRvX2JvdHRvbV9oYWxmX3R4XG4iKTsKKwlmb3IgKHBpID0gMCwgcG9ydCA9IGNhcmQtPnBvcnRzOyBwaSA8IGNhcmQtPm5wb3J0czsgcGkrKywgcG9ydCsrKSB7CisJCWlmICghcG9ydC0+cnVuKQorCQkJY29udGludWU7CisKKyAgICAgICAgICAgICAgICBkZXYgPSBwb3J0X3RvX2Rldihwb3J0KTsKKyAgICAgICAgICAgICAgICBzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwkJd2hpbGUgKCEKKwkJICAgICAgIChGU1RfUkRCKGNhcmQsIHR4RGVzY3JSaW5nW3BpXVtwb3J0LT50eHBvc10uYml0cykgJgorCQkJRE1BX09XTikKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgIShjYXJkLT5kbWF0eF9pbl9wcm9ncmVzcykpIHsKKwkJCS8qCisJCQkgKiBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSB0eGRvbmUgZXZlbnQgcGVyLXNlCisJCQkgKiBXZSBzZWVtIHRvIGhhdmUgdG8gZGVkdWNlIGl0LCBieSBjaGVja2luZyB0aGUgRE1BX09XTgorCQkJICogYml0IG9uIHRoZSBuZXh0IGJ1ZmZlciB3ZSB0aGluayB3ZSBjYW4gdXNlCisJCQkgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJCWlmICgodHhxX2xlbmd0aCA9IHBvcnQtPnR4cWUgLSBwb3J0LT50eHFzKSA8IDApIHsKKwkJCQkvKgorCQkJCSAqIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgb25lIGhhcyB3cmFwcGVkIGFuZCB0aGUKKwkJCQkgKiBtYXRocyBnaXZlcyB1cyBhIG5lZ2F0aXZlIG51bWJlcgorCQkJCSAqLworCQkJCXR4cV9sZW5ndGggPSB0eHFfbGVuZ3RoICsgRlNUX1RYUV9ERVBUSDsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQkJaWYgKHR4cV9sZW5ndGggPiAwKSB7CisJCQkJLyoKKwkJCQkgKiBUaGVyZSBpcyBzb21ldGhpbmcgdG8gc2VuZAorCQkJCSAqLworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJCQlza2IgPSBwb3J0LT50eHFbcG9ydC0+dHhxc107CisJCQkJcG9ydC0+dHhxcysrOworCQkJCWlmIChwb3J0LT50eHFzID09IEZTVF9UWFFfREVQVEgpIHsKKwkJCQkJcG9ydC0+dHhxcyA9IDA7CisJCQkJfQorCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQkJCS8qCisJCQkJICogY29weSB0aGUgZGF0YSBhbmQgc2V0IHRoZSByZXF1aXJlZCBpbmRpY2F0b3JzIG9uIHRoZQorCQkJCSAqIGNhcmQuCisJCQkJICovCisJCQkJRlNUX1dSVyhjYXJkLCB0eERlc2NyUmluZ1twaV1bcG9ydC0+dHhwb3NdLmJjbnQsCisJCQkJCWNudl9iY250KHNrYi0+bGVuKSk7CisJCQkJaWYgKChza2ItPmxlbiA8IEZTVF9NSU5fRE1BX0xFTikKKwkJCQkgICAgfHwgKGNhcmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RYUCkpIHsKKwkJCQkJLyogRW5xdWV1ZSB0aGUgcGFja2V0IHdpdGggbm9ybWFsIGlvICovCisJCQkJCW1lbWNweV90b2lvKGNhcmQtPm1lbSArCisJCQkJCQkgICAgQlVGX09GRlNFVCh0eEJ1ZmZlcltwaV0KKwkJCQkJCQkgICAgICAgW3BvcnQtPgorCQkJCQkJCQl0eHBvc11bMF0pLAorCQkJCQkJICAgIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkJCQlGU1RfV1JCKGNhcmQsCisJCQkJCQl0eERlc2NyUmluZ1twaV1bcG9ydC0+dHhwb3NdLgorCQkJCQkJYml0cywKKwkJCQkJCURNQV9PV04gfCBUWF9TVFAgfCBUWF9FTlApOworCQkJCQlzdGF0cy0+dHhfcGFja2V0cysrOworCQkJCQlzdGF0cy0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIE9yIGRvIGl0IHRocm91Z2ggZG1hICovCisJCQkJCW1lbWNweShjYXJkLT50eF9kbWFfaGFuZGxlX2hvc3QsCisJCQkJCSAgICAgICBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCQkJY2FyZC0+ZG1hX3BvcnRfdHggPSBwb3J0OworCQkJCQljYXJkLT5kbWFfbGVuX3R4ID0gc2tiLT5sZW47CisJCQkJCWNhcmQtPmRtYV90eHBvcyA9IHBvcnQtPnR4cG9zOworCQkJCQlmc3RfdHhfZG1hKGNhcmQsCisJCQkJCQkgICAoY2hhciAqKSBjYXJkLT4KKwkJCQkJCSAgIHR4X2RtYV9oYW5kbGVfY2FyZCwKKwkJCQkJCSAgIChjaGFyICopCisJCQkJCQkgICBCVUZfT0ZGU0VUKHR4QnVmZmVyW3BpXQorCQkJCQkJCSAgICAgIFtwb3J0LT50eHBvc11bMF0pLAorCQkJCQkJICAgc2tiLT5sZW4pOworCQkJCX0KKwkJCQlpZiAoKytwb3J0LT50eHBvcyA+PSBOVU1fVFhfQlVGRkVSKQorCQkJCQlwb3J0LT50eHBvcyA9IDA7CisJCQkJLyoKKwkJCQkgKiBJZiB3ZSBoYXZlIGZsb3cgY29udHJvbCBvbiwgY2FuIHdlIG5vdyByZWxlYXNlIGl0PworCQkJCSAqLworCQkJCWlmIChwb3J0LT5zdGFydCkgeworCQkJCQlpZiAodHhxX2xlbmd0aCA8IGZzdF90eHFfbG93KSB7CisJCQkJCQluZXRpZl93YWtlX3F1ZXVlKHBvcnRfdG9fZGV2CisJCQkJCQkJCSAocG9ydCkpOworCQkJCQkJcG9ydC0+c3RhcnQgPSAwOworCQkJCQl9CisJCQkJfQorCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBOb3RoaW5nIHRvIHNlbmQgc28gYnJlYWsgb3V0IG9mIHRoZSB3aGlsZSBsb29wCisJCQkJICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitkb19ib3R0b21faGFsZl9yeChzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCkKK3sKKwlzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydDsKKwlpbnQgcGk7CisJaW50IHJ4X2NvdW50ID0gMDsKKworCS8qIENoZWNrIGZvciByeCBjb21wbGV0aW9ucyBvbiBhbGwgcG9ydHMgb24gdGhpcyBjYXJkICovCisJZGJnKERCR19SWCwgImRvX2JvdHRvbV9oYWxmX3J4XG4iKTsKKwlmb3IgKHBpID0gMCwgcG9ydCA9IGNhcmQtPnBvcnRzOyBwaSA8IGNhcmQtPm5wb3J0czsgcGkrKywgcG9ydCsrKSB7CisJCWlmICghcG9ydC0+cnVuKQorCQkJY29udGludWU7CisKKwkJd2hpbGUgKCEoRlNUX1JEQihjYXJkLCByeERlc2NyUmluZ1twaV1bcG9ydC0+cnhwb3NdLmJpdHMpCisJCQkgJiBETUFfT1dOKSAmJiAhKGNhcmQtPmRtYXJ4X2luX3Byb2dyZXNzKSkgeworCQkJaWYgKHJ4X2NvdW50ID4gZnN0X21heF9yZWFkcykgeworCQkJCS8qCisJCQkJICogRG9uJ3Qgc3BlbmQgZm9yZXZlciBpbiByZWNlaXZlIHByb2Nlc3NpbmcKKwkJCQkgKiBTY2hlZHVsZSBhbm90aGVyIGV2ZW50CisJCQkJICovCisJCQkJZnN0X3Ffd29ya19pdGVtKCZmc3Rfd29ya19pbnRxLCBjYXJkLT5jYXJkX25vKTsKKwkJCQl0YXNrbGV0X3NjaGVkdWxlKCZmc3RfaW50X3Rhc2spOworCQkJCWJyZWFrOwkvKiBMZWF2ZSB0aGUgbG9vcCAqLworCQkJfQorCQkJZnN0X2ludHJfcngoY2FyZCwgcG9ydCk7CisJCQlyeF9jb3VudCsrOworCQl9CisJfQorfQorCisvKgorICogICAgICBUaGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZQorICogICAgICBEZXZfaWQgaXMgb3VyIGZzdF9jYXJkX2luZm8gcG9pbnRlcgorICovCitpcnFyZXR1cm5fdAorZnN0X2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZDsKKwlzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydDsKKwlpbnQgcmRpZHg7CQkvKiBFdmVudCBidWZmZXIgaW5kaWNlcyAqLworCWludCB3cmlkeDsKKwlpbnQgZXZlbnQ7CQkvKiBBY3R1YWwgZXZlbnQgZm9yIHByb2Nlc3NpbmcgKi8KKwl1bnNpZ25lZCBpbnQgZG1hX2ludGNzciA9IDA7CisJdW5zaWduZWQgaW50IGRvX2NhcmRfaW50ZXJydXB0OworCXVuc2lnbmVkIGludCBpbnRfcmV0cnlfY291bnQ7CisKKwlpZiAoKGNhcmQgPSBkZXZfaWQpID09IE5VTEwpIHsKKwkJZGJnKERCR19JTlRSLCAiaW50cjogc3B1cmlvdXMgJWRcbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRvIHNlZSBpZiB0aGUgaW50ZXJydXB0IHdhcyBmb3IgdGhpcyBjYXJkCisJICogcmV0dXJuIGlmIG5vdAorCSAqIE5vdGUgdGhhdCB0aGUgY2FsbCB0byBjbGVhciB0aGUgaW50ZXJydXB0IGlzIGltcG9ydGFudAorCSAqLworCWRiZyhEQkdfSU5UUiwgImludHI6ICVkICVwXG4iLCBpcnEsIGNhcmQpOworCWlmIChjYXJkLT5zdGF0ZSAhPSBGU1RfUlVOTklORykgeworCQlwcmludGtfZXJyCisJCSAgICAoIkludGVycnVwdCByZWNlaXZlZCBmb3IgY2FyZCAlZCBpbiBhIG5vbiBydW5uaW5nIHN0YXRlICglZClcbiIsCisJCSAgICAgY2FyZC0+Y2FyZF9ubywgY2FyZC0+c3RhdGUpOworCisJCS8qIAorCQkgKiBJdCBpcyBwb3NzaWJsZSB0byByZWFsbHkgYmUgcnVubmluZywgaS5lLiB3ZSBoYXZlIHJlLWxvYWRlZAorCQkgKiBhIHJ1bm5pbmcgY2FyZAorCQkgKiBDbGVhciBhbmQgcmVwcmltZSB0aGUgaW50ZXJydXB0IHNvdXJjZSAKKwkJICovCisJCWZzdF9jbGVhcl9pbnRyKGNhcmQpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJLyogQ2xlYXIgYW5kIHJlcHJpbWUgdGhlIGludGVycnVwdCBzb3VyY2UgKi8KKwlmc3RfY2xlYXJfaW50cihjYXJkKTsKKworCS8qCisJICogSXMgdGhlIGludGVycnVwdCBmb3IgdGhpcyBjYXJkIChoYW5kc2hha2UgPT0gMSkKKwkgKi8KKwlkb19jYXJkX2ludGVycnVwdCA9IDA7CisJaWYgKEZTVF9SREIoY2FyZCwgaW50ZXJydXB0SGFuZHNoYWtlKSA9PSAxKSB7CisJCWRvX2NhcmRfaW50ZXJydXB0ICs9IEZTVF9DQVJEX0lOVDsKKwkJLyogU2V0IHRoZSBzb2Z0d2FyZSBhY2tub3dsZWRnZSAqLworCQlGU1RfV1JCKGNhcmQsIGludGVycnVwdEhhbmRzaGFrZSwgMHhFRSk7CisJfQorCWlmIChjYXJkLT5mYW1pbHkgPT0gRlNUX0ZBTUlMWV9UWFUpIHsKKwkJLyoKKwkJICogSXMgaXQgYSBETUEgSW50ZXJydXB0CisJCSAqLworCQlkbWFfaW50Y3NyID0gaW5sKGNhcmQtPnBjaV9jb25mICsgSU5UQ1NSXzkwNTQpOworCQlpZiAoZG1hX2ludGNzciAmIDB4MDAyMDAwMDApIHsKKwkJCS8qCisJCQkgKiBETUEgQ2hhbm5lbCAwIChSeCB0cmFuc2ZlciBjb21wbGV0ZSkKKwkJCSAqLworCQkJZGJnKERCR19SWCwgIkRNQSBSeCB4ZmVyIGNvbXBsZXRlXG4iKTsKKwkJCW91dGIoMHg4LCBjYXJkLT5wY2lfY29uZiArIERNQUNTUjApOworCQkJZnN0X3J4X2RtYV9jb21wbGV0ZShjYXJkLCBjYXJkLT5kbWFfcG9ydF9yeCwKKwkJCQkJICAgIGNhcmQtPmRtYV9sZW5fcngsIGNhcmQtPmRtYV9za2JfcngsCisJCQkJCSAgICBjYXJkLT5kbWFfcnhwb3MpOworCQkJY2FyZC0+ZG1hcnhfaW5fcHJvZ3Jlc3MgPSAwOworCQkJZG9fY2FyZF9pbnRlcnJ1cHQgKz0gRlNUX1JYX0RNQV9JTlQ7CisJCX0KKwkJaWYgKGRtYV9pbnRjc3IgJiAweDAwNDAwMDAwKSB7CisJCQkvKgorCQkJICogRE1BIENoYW5uZWwgMSAoVHggdHJhbnNmZXIgY29tcGxldGUpCisJCQkgKi8KKwkJCWRiZyhEQkdfVFgsICJETUEgVHggeGZlciBjb21wbGV0ZVxuIik7CisJCQlvdXRiKDB4OCwgY2FyZC0+cGNpX2NvbmYgKyBETUFDU1IxKTsKKwkJCWZzdF90eF9kbWFfY29tcGxldGUoY2FyZCwgY2FyZC0+ZG1hX3BvcnRfdHgsCisJCQkJCSAgICBjYXJkLT5kbWFfbGVuX3R4LCBjYXJkLT5kbWFfdHhwb3MpOworCQkJY2FyZC0+ZG1hdHhfaW5fcHJvZ3Jlc3MgPSAwOworCQkJZG9fY2FyZF9pbnRlcnJ1cHQgKz0gRlNUX1RYX0RNQV9JTlQ7CisJCX0KKwl9CisKKwkvKgorCSAqIEhhdmUgd2UgYmVlbiBtaXNzaW5nIEludGVycnVwdHMKKwkgKi8KKwlpbnRfcmV0cnlfY291bnQgPSBGU1RfUkRMKGNhcmQsIGludGVycnVwdFJldHJ5Q291bnQpOworCWlmIChpbnRfcmV0cnlfY291bnQpIHsKKwkJZGJnKERCR19BU1MsICJDYXJkICVkIGludF9yZXRyeV9jb3VudCBpcyAgJWRcbiIsCisJCSAgICBjYXJkLT5jYXJkX25vLCBpbnRfcmV0cnlfY291bnQpOworCQlGU1RfV1JMKGNhcmQsIGludGVycnVwdFJldHJ5Q291bnQsIDApOworCX0KKworCWlmICghZG9fY2FyZF9pbnRlcnJ1cHQpIHsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCS8qIFNjZWhkdWxlIHRoZSBib3R0b20gaGFsZiBvZiB0aGUgSVNSICovCisJZnN0X3Ffd29ya19pdGVtKCZmc3Rfd29ya19pbnRxLCBjYXJkLT5jYXJkX25vKTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZmc3RfaW50X3Rhc2spOworCisJLyogRHJhaW4gdGhlIGV2ZW50IHF1ZXVlICovCisJcmRpZHggPSBGU1RfUkRCKGNhcmQsIGludGVycnVwdEV2ZW50LnJkaW5kZXgpICYgMHgxZjsKKwl3cmlkeCA9IEZTVF9SREIoY2FyZCwgaW50ZXJydXB0RXZlbnQud3JpbmRleCkgJiAweDFmOworCXdoaWxlIChyZGlkeCAhPSB3cmlkeCkgeworCQlldmVudCA9IEZTVF9SREIoY2FyZCwgaW50ZXJydXB0RXZlbnQuZXZudGJ1ZmZbcmRpZHhdKTsKKwkJcG9ydCA9ICZjYXJkLT5wb3J0c1tldmVudCAmIDB4MDNdOworCisJCWRiZyhEQkdfSU5UUiwgIlByb2Nlc3NpbmcgSW50ZXJydXB0IGV2ZW50OiAleFxuIiwgZXZlbnQpOworCisJCXN3aXRjaCAoZXZlbnQpIHsKKwkJY2FzZSBURTFfQUxNQToKKwkJCWRiZyhEQkdfSU5UUiwgIlRFMSBBbGFybSBpbnRyXG4iKTsKKwkJCWlmIChwb3J0LT5ydW4pCisJCQkJZnN0X2ludHJfdGUxX2FsYXJtKGNhcmQsIHBvcnQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBDVExBX0NIRzoKKwkJY2FzZSBDVExCX0NIRzoKKwkJY2FzZSBDVExDX0NIRzoKKwkJY2FzZSBDVExEX0NIRzoKKwkJCWlmIChwb3J0LT5ydW4pCisJCQkJZnN0X2ludHJfY3RsY2hnKGNhcmQsIHBvcnQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQlRBX1NFTlQ6CisJCWNhc2UgQUJUQl9TRU5UOgorCQljYXNlIEFCVENfU0VOVDoKKwkJY2FzZSBBQlREX1NFTlQ6CisJCQlkYmcoREJHX1RYLCAiQWJvcnQgY29tcGxldGUgcG9ydCAlZFxuIiwgcG9ydC0+aW5kZXgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBUWEFfVU5ERjoKKwkJY2FzZSBUWEJfVU5ERjoKKwkJY2FzZSBUWENfVU5ERjoKKwkJY2FzZSBUWERfVU5ERjoKKwkJCS8qIERpZmZpY3VsdCB0byBzZWUgaG93IHdlJ2QgZ2V0IHRoaXMgZ2l2ZW4gdGhhdCB3ZQorCQkJICogYWx3YXlzIGxvYWQgdXAgdGhlIGVudGlyZSBwYWNrZXQgZm9yIERNQS4KKwkJCSAqLworCQkJZGJnKERCR19UWCwgIlR4IHVuZGVyZmxvdyBwb3J0ICVkXG4iLCBwb3J0LT5pbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZGxjX3N0YXRzKHBvcnRfdG9fZGV2KHBvcnQpKS0+dHhfZXJyb3JzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBoZGxjX3N0YXRzKHBvcnRfdG9fZGV2KHBvcnQpKS0+dHhfZmlmb19lcnJvcnMrKzsKKwkJCWRiZyhEQkdfQVNTLCAiVHggdW5kZXJmbG93IG9uIGNhcmQgJWQgcG9ydCAlZFxuIiwKKwkJCSAgICBjYXJkLT5jYXJkX25vLCBwb3J0LT5pbmRleCk7CisJCQlicmVhazsKKworCQljYXNlIElOSVRfQ1BMVDoKKwkJCWRiZyhEQkdfSU5JVCwgIkNhcmQgaW5pdCBPSyBpbnRyXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSU5JVF9GQUlMOgorCQkJZGJnKERCR19JTklULCAiQ2FyZCBpbml0IEZBSUxFRCBpbnRyXG4iKTsKKwkJCWNhcmQtPnN0YXRlID0gRlNUX0lGQUlMRUQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRrX2VycigiaW50cjogdW5rbm93biBjYXJkIGV2ZW50ICVkLiBpZ25vcmVkXG4iLAorCQkJCSAgIGV2ZW50KTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogQnVtcCBhbmQgd3JhcCB0aGUgaW5kZXggKi8KKwkJaWYgKCsrcmRpZHggPj0gTUFYX0NJUkJVRkYpCisJCQlyZGlkeCA9IDA7CisJfQorCUZTVF9XUkIoY2FyZCwgaW50ZXJydXB0RXZlbnQucmRpbmRleCwgcmRpZHgpOworICAgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qICAgICAgQ2hlY2sgdGhhdCB0aGUgc2hhcmVkIG1lbW9yeSBjb25maWd1cmF0aW9uIGlzIG9uZSB0aGF0IHdlIGNhbiBoYW5kbGUKKyAqICAgICAgYW5kIHRoYXQgc29tZSBiYXNpYyBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0CisgKi8KK3N0YXRpYyB2b2lkCitjaGVja19zdGFydGVkX29rKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkKQoreworCWludCBpOworCisJLyogQ2hlY2sgc3RydWN0dXJlIHZlcnNpb24gYW5kIGVuZCBtYXJrZXIgKi8KKwlpZiAoRlNUX1JEVyhjYXJkLCBzbWNWZXJzaW9uKSAhPSBTTUNfVkVSU0lPTikgeworCQlwcmludGtfZXJyKCJCYWQgc2hhcmVkIG1lbW9yeSB2ZXJzaW9uICVkIGV4cGVjdGVkICVkXG4iLAorCQkJICAgRlNUX1JEVyhjYXJkLCBzbWNWZXJzaW9uKSwgU01DX1ZFUlNJT04pOworCQljYXJkLT5zdGF0ZSA9IEZTVF9CQURWRVJTSU9OOworCQlyZXR1cm47CisJfQorCWlmIChGU1RfUkRMKGNhcmQsIGVuZE9mU21jU2lnbmF0dXJlKSAhPSBFTkRfU0lHKSB7CisJCXByaW50a19lcnIoIk1pc3Npbmcgc2hhcmVkIG1lbW9yeSBzaWduYXR1cmVcbiIpOworCQljYXJkLT5zdGF0ZSA9IEZTVF9CQURWRVJTSU9OOworCQlyZXR1cm47CisJfQorCS8qIEZpcm13YXJlIHN0YXR1cyBmbGFnLCAweDAwID0gaW5pdGlhbGlzaW5nLCAweDAxID0gT0ssIDB4RkYgPSBmYWlsICovCisJaWYgKChpID0gRlNUX1JEQihjYXJkLCB0YXNrU3RhdHVzKSkgPT0gMHgwMSkgeworCQljYXJkLT5zdGF0ZSA9IEZTVF9SVU5OSU5HOworCX0gZWxzZSBpZiAoaSA9PSAweEZGKSB7CisJCXByaW50a19lcnIoIkZpcm13YXJlIGluaXRpYWxpc2F0aW9uIGZhaWxlZC4gQ2FyZCBoYWx0ZWRcbiIpOworCQljYXJkLT5zdGF0ZSA9IEZTVF9IQUxURUQ7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKGkgIT0gMHgwMCkgeworCQlwcmludGtfZXJyKCJVbmtub3duIGZpcm13YXJlIHN0YXR1cyAweCV4XG4iLCBpKTsKKwkJY2FyZC0+c3RhdGUgPSBGU1RfSEFMVEVEOworCQlyZXR1cm47CisJfQorCisJLyogRmluYWxseSBjaGVjayB0aGUgbnVtYmVyIG9mIHBvcnRzIHJlcG9ydGVkIGJ5IGZpcm13YXJlIGFnYWluc3QgdGhlCisJICogbnVtYmVyIHdlIGFzc3VtZWQgYXQgY2FyZCBkZXRlY3Rpb24uIFNob3VsZCBuZXZlciBoYXBwZW4gd2l0aAorCSAqIGV4aXN0aW5nIGZpcm13YXJlIGV0YyBzbyB3ZSBqdXN0IHJlcG9ydCBpdCBmb3IgdGhlIG1vbWVudC4KKwkgKi8KKwlpZiAoRlNUX1JETChjYXJkLCBudW1iZXJPZlBvcnRzKSAhPSBjYXJkLT5ucG9ydHMpIHsKKwkJcHJpbnRrX3dhcm4oIlBvcnQgY291bnQgbWlzbWF0Y2ggb24gY2FyZCAlZC4iCisJCQkgICAgIiBGaXJtd2FyZSB0aGlua3MgJWQgd2Ugc2F5ICVkXG4iLCBjYXJkLT5jYXJkX25vLAorCQkJICAgIEZTVF9SREwoY2FyZCwgbnVtYmVyT2ZQb3J0cyksIGNhcmQtPm5wb3J0cyk7CisJfQorfQorCitzdGF0aWMgaW50CitzZXRfY29uZl9mcm9tX2luZm8oc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LAorCQkgICBzdHJ1Y3QgZnN0aW9jX2luZm8gKmluZm8pCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBjaGFyIG15X2ZyYW1pbmc7CisKKwkvKiBTZXQgdGhpbmdzIGFjY29yZGluZyB0byB0aGUgdXNlciBzZXQgdmFsaWQgZmxhZ3MgCisJICogU2V2ZXJhbCBvZiB0aGUgb2xkIG9wdGlvbnMgaGF2ZSBiZWVuIGludmFsaWRhdGVkL3JlcGxhY2VkIGJ5IHRoZSAKKwkgKiBnZW5lcmljIGhkbGMgcGFja2FnZS4KKwkgKi8KKwllcnIgPSAwOworCWlmIChpbmZvLT52YWxpZCAmIEZTVFZBTF9QUk9UTykgeworCQlpZiAoaW5mby0+cHJvdG8gPT0gRlNUX1JBVykKKwkJCXBvcnQtPm1vZGUgPSBGU1RfUkFXOworCQllbHNlCisJCQlwb3J0LT5tb2RlID0gRlNUX0dFTl9IRExDOworCX0KKworCWlmIChpbmZvLT52YWxpZCAmIEZTVFZBTF9DQUJMRSkKKwkJZXJyID0gLUVJTlZBTDsKKworCWlmIChpbmZvLT52YWxpZCAmIEZTVFZBTF9TUEVFRCkKKwkJZXJyID0gLUVJTlZBTDsKKworCWlmIChpbmZvLT52YWxpZCAmIEZTVFZBTF9QSEFTRSkKKwkJRlNUX1dSQihjYXJkLCBwb3J0Q29uZmlnW3BvcnQtPmluZGV4XS5pbnZlcnRDbG9jaywKKwkJCWluZm8tPmludmVydENsb2NrKTsKKwlpZiAoaW5mby0+dmFsaWQgJiBGU1RWQUxfTU9ERSkKKwkJRlNUX1dSVyhjYXJkLCBjYXJkTW9kZSwgaW5mby0+Y2FyZE1vZGUpOworCWlmIChpbmZvLT52YWxpZCAmIEZTVFZBTF9URTEpIHsKKwkJRlNUX1dSTChjYXJkLCBzdUNvbmZpZy5kYXRhUmF0ZSwgaW5mby0+bGluZVNwZWVkKTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5jbG9ja2luZywgaW5mby0+Y2xvY2tTb3VyY2UpOworCQlteV9mcmFtaW5nID0gRlJBTUlOR19FMTsKKwkJaWYgKGluZm8tPmZyYW1pbmcgPT0gRTEpCisJCQlteV9mcmFtaW5nID0gRlJBTUlOR19FMTsKKwkJaWYgKGluZm8tPmZyYW1pbmcgPT0gVDEpCisJCQlteV9mcmFtaW5nID0gRlJBTUlOR19UMTsKKwkJaWYgKGluZm8tPmZyYW1pbmcgPT0gSjEpCisJCQlteV9mcmFtaW5nID0gRlJBTUlOR19KMTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5mcmFtaW5nLCBteV9mcmFtaW5nKTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5zdHJ1Y3R1cmUsIGluZm8tPnN0cnVjdHVyZSk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcuaW50ZXJmYWNlLCBpbmZvLT5pbnRlcmZhY2UpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLmNvZGluZywgaW5mby0+Y29kaW5nKTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5saW5lQnVpbGRPdXQsIGluZm8tPmxpbmVCdWlsZE91dCk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcuZXF1YWxpemVyLCBpbmZvLT5lcXVhbGl6ZXIpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLnRyYW5zcGFyZW50TW9kZSwgaW5mby0+dHJhbnNwYXJlbnRNb2RlKTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5sb29wTW9kZSwgaW5mby0+bG9vcE1vZGUpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLnJhbmdlLCBpbmZvLT5yYW5nZSk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcudHhCdWZmZXJNb2RlLCBpbmZvLT50eEJ1ZmZlck1vZGUpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLnJ4QnVmZmVyTW9kZSwgaW5mby0+cnhCdWZmZXJNb2RlKTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5zdGFydGluZ1Nsb3QsIGluZm8tPnN0YXJ0aW5nU2xvdCk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcubG9zVGhyZXNob2xkLCBpbmZvLT5sb3NUaHJlc2hvbGQpOworCQlpZiAoaW5mby0+aWRsZUNvZGUpCisJCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLmVuYWJsZUlkbGVDb2RlLCAxKTsKKwkJZWxzZQorCQkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5lbmFibGVJZGxlQ29kZSwgMCk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcuaWRsZUNvZGUsIGluZm8tPmlkbGVDb2RlKTsKKyNpZiBGU1RfREVCVUcKKwkJaWYgKGluZm8tPnZhbGlkICYgRlNUVkFMX1RFMSkgeworCQkJcHJpbnRrKCJTZXR0aW5nIFRFMSBkYXRhXG4iKTsKKwkJCXByaW50aygiTGluZSBTcGVlZCA9ICVkXG4iLCBpbmZvLT5saW5lU3BlZWQpOworCQkJcHJpbnRrKCJTdGFydCBzbG90ID0gJWRcbiIsIGluZm8tPnN0YXJ0aW5nU2xvdCk7CisJCQlwcmludGsoIkNsb2NrIHNvdXJjZSA9ICVkXG4iLCBpbmZvLT5jbG9ja1NvdXJjZSk7CisJCQlwcmludGsoIkZyYW1pbmcgPSAlZFxuIiwgbXlfZnJhbWluZyk7CisJCQlwcmludGsoIlN0cnVjdHVyZSA9ICVkXG4iLCBpbmZvLT5zdHJ1Y3R1cmUpOworCQkJcHJpbnRrKCJpbnRlcmZhY2UgPSAlZFxuIiwgaW5mby0+aW50ZXJmYWNlKTsKKwkJCXByaW50aygiQ29kaW5nID0gJWRcbiIsIGluZm8tPmNvZGluZyk7CisJCQlwcmludGsoIkxpbmUgYnVpbGQgb3V0ID0gJWRcbiIsIGluZm8tPmxpbmVCdWlsZE91dCk7CisJCQlwcmludGsoIkVxdWFsaXNlciA9ICVkXG4iLCBpbmZvLT5lcXVhbGl6ZXIpOworCQkJcHJpbnRrKCJUcmFuc3BhcmVudCBtb2RlID0gJWRcbiIsCisJCQkgICAgICAgaW5mby0+dHJhbnNwYXJlbnRNb2RlKTsKKwkJCXByaW50aygiTG9vcCBtb2RlID0gJWRcbiIsIGluZm8tPmxvb3BNb2RlKTsKKwkJCXByaW50aygiUmFuZ2UgPSAlZFxuIiwgaW5mby0+cmFuZ2UpOworCQkJcHJpbnRrKCJUeCBCdWZmZXIgbW9kZSA9ICVkXG4iLCBpbmZvLT50eEJ1ZmZlck1vZGUpOworCQkJcHJpbnRrKCJSeCBCdWZmZXIgbW9kZSA9ICVkXG4iLCBpbmZvLT5yeEJ1ZmZlck1vZGUpOworCQkJcHJpbnRrKCJMT1MgVGhyZXNob2xkID0gJWRcbiIsIGluZm8tPmxvc1RocmVzaG9sZCk7CisJCQlwcmludGsoIklkbGUgQ29kZSA9ICVkXG4iLCBpbmZvLT5pZGxlQ29kZSk7CisJCX0KKyNlbmRpZgorCX0KKyNpZiBGU1RfREVCVUcKKwlpZiAoaW5mby0+dmFsaWQgJiBGU1RWQUxfREVCVUcpIHsKKwkJZnN0X2RlYnVnX21hc2sgPSBpbmZvLT5kZWJ1ZzsKKwl9CisjZW5kaWYKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkCitnYXRoZXJfY29uZl9pbmZvKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCwKKwkJIHN0cnVjdCBmc3Rpb2NfaW5mbyAqaW5mbykKK3sKKwlpbnQgaTsKKworCW1lbXNldChpbmZvLCAwLCBzaXplb2YgKHN0cnVjdCBmc3Rpb2NfaW5mbykpOworCisJaSA9IHBvcnQtPmluZGV4OworCWluZm8tPmtlcm5lbFZlcnNpb24gPSBMSU5VWF9WRVJTSU9OX0NPREU7CisJaW5mby0+bnBvcnRzID0gY2FyZC0+bnBvcnRzOworCWluZm8tPnR5cGUgPSBjYXJkLT50eXBlOworCWluZm8tPnN0YXRlID0gY2FyZC0+c3RhdGU7CisJaW5mby0+cHJvdG8gPSBGU1RfR0VOX0hETEM7CisJaW5mby0+aW5kZXggPSBpOworI2lmIEZTVF9ERUJVRworCWluZm8tPmRlYnVnID0gZnN0X2RlYnVnX21hc2s7CisjZW5kaWYKKworCS8qIE9ubHkgbWFyayBpbmZvcm1hdGlvbiBhcyB2YWxpZCBpZiBjYXJkIGlzIHJ1bm5pbmcuCisJICogQ29weSB0aGUgZGF0YSBhbnl3YXkgaW4gY2FzZSBpdCBpcyB1c2VmdWwgZm9yIGRpYWdub3N0aWNzCisJICovCisJaW5mby0+dmFsaWQgPSAoKGNhcmQtPnN0YXRlID09IEZTVF9SVU5OSU5HKSA/IEZTVFZBTF9BTEwgOiBGU1RWQUxfQ0FSRCkKKyNpZiBGU1RfREVCVUcKKwkgICAgfCBGU1RWQUxfREVCVUcKKyNlbmRpZgorCSAgICA7CisKKwlpbmZvLT5saW5lSW50ZXJmYWNlID0gRlNUX1JEVyhjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVJbnRlcmZhY2UpOworCWluZm8tPmludGVybmFsQ2xvY2sgPSBGU1RfUkRCKGNhcmQsIHBvcnRDb25maWdbaV0uaW50ZXJuYWxDbG9jayk7CisJaW5mby0+bGluZVNwZWVkID0gRlNUX1JETChjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVTcGVlZCk7CisJaW5mby0+aW52ZXJ0Q2xvY2sgPSBGU1RfUkRCKGNhcmQsIHBvcnRDb25maWdbaV0uaW52ZXJ0Q2xvY2spOworCWluZm8tPnYyNElwU3RzID0gRlNUX1JETChjYXJkLCB2MjRJcFN0c1tpXSk7CisJaW5mby0+djI0T3BTdHMgPSBGU1RfUkRMKGNhcmQsIHYyNE9wU3RzW2ldKTsKKwlpbmZvLT5jbG9ja1N0YXR1cyA9IEZTVF9SRFcoY2FyZCwgY2xvY2tTdGF0dXNbaV0pOworCWluZm8tPmNhYmxlU3RhdHVzID0gRlNUX1JEVyhjYXJkLCBjYWJsZVN0YXR1cyk7CisJaW5mby0+Y2FyZE1vZGUgPSBGU1RfUkRXKGNhcmQsIGNhcmRNb2RlKTsKKwlpbmZvLT5zbWNGaXJtd2FyZVZlcnNpb24gPSBGU1RfUkRMKGNhcmQsIHNtY0Zpcm13YXJlVmVyc2lvbik7CisKKwkvKgorCSAqIFRoZSBUMlUgY2FuIHJlcG9ydCBjYWJsZSBwcmVzZW5jZSBmb3IgYm90aCBBIG9yIEIKKwkgKiBpbiBiaXRzIDAgYW5kIDEgb2YgY2FibGVTdGF0dXMuICBTZWUgd2hpY2ggcG9ydCB3ZSBhcmUgYW5kIAorCSAqIGRvIHRoZSBtYXBwaW5nLgorCSAqLworCWlmIChjYXJkLT5mYW1pbHkgPT0gRlNUX0ZBTUlMWV9UWFUpIHsKKwkJaWYgKHBvcnQtPmluZGV4ID09IDApIHsKKwkJCS8qCisJCQkgKiBQb3J0IEEKKwkJCSAqLworCQkJaW5mby0+Y2FibGVTdGF0dXMgPSBpbmZvLT5jYWJsZVN0YXR1cyAmIDE7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogUG9ydCBCCisJCQkgKi8KKwkJCWluZm8tPmNhYmxlU3RhdHVzID0gaW5mby0+Y2FibGVTdGF0dXMgPj4gMTsKKwkJCWluZm8tPmNhYmxlU3RhdHVzID0gaW5mby0+Y2FibGVTdGF0dXMgJiAxOworCQl9CisJfQorCS8qCisJICogU29tZSBhZGRpdGlvbmFsIGJpdHMgaWYgd2UgYXJlIFRFMQorCSAqLworCWlmIChjYXJkLT50eXBlID09IEZTVF9UWVBFX1RFMSkgeworCQlpbmZvLT5saW5lU3BlZWQgPSBGU1RfUkRMKGNhcmQsIHN1Q29uZmlnLmRhdGFSYXRlKTsKKwkJaW5mby0+Y2xvY2tTb3VyY2UgPSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLmNsb2NraW5nKTsKKwkJaW5mby0+ZnJhbWluZyA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcuZnJhbWluZyk7CisJCWluZm8tPnN0cnVjdHVyZSA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcuc3RydWN0dXJlKTsKKwkJaW5mby0+aW50ZXJmYWNlID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5pbnRlcmZhY2UpOworCQlpbmZvLT5jb2RpbmcgPSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLmNvZGluZyk7CisJCWluZm8tPmxpbmVCdWlsZE91dCA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcubGluZUJ1aWxkT3V0KTsKKwkJaW5mby0+ZXF1YWxpemVyID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5lcXVhbGl6ZXIpOworCQlpbmZvLT5sb29wTW9kZSA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcubG9vcE1vZGUpOworCQlpbmZvLT5yYW5nZSA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcucmFuZ2UpOworCQlpbmZvLT50eEJ1ZmZlck1vZGUgPSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLnR4QnVmZmVyTW9kZSk7CisJCWluZm8tPnJ4QnVmZmVyTW9kZSA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcucnhCdWZmZXJNb2RlKTsKKwkJaW5mby0+c3RhcnRpbmdTbG90ID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5zdGFydGluZ1Nsb3QpOworCQlpbmZvLT5sb3NUaHJlc2hvbGQgPSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLmxvc1RocmVzaG9sZCk7CisJCWlmIChGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLmVuYWJsZUlkbGVDb2RlKSkKKwkJCWluZm8tPmlkbGVDb2RlID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5pZGxlQ29kZSk7CisJCWVsc2UKKwkJCWluZm8tPmlkbGVDb2RlID0gMDsKKwkJaW5mby0+cmVjZWl2ZUJ1ZmZlckRlbGF5ID0KKwkJICAgIEZTVF9SREwoY2FyZCwgc3VTdGF0dXMucmVjZWl2ZUJ1ZmZlckRlbGF5KTsKKwkJaW5mby0+ZnJhbWluZ0Vycm9yQ291bnQgPQorCQkgICAgRlNUX1JETChjYXJkLCBzdVN0YXR1cy5mcmFtaW5nRXJyb3JDb3VudCk7CisJCWluZm8tPmNvZGVWaW9sYXRpb25Db3VudCA9CisJCSAgICBGU1RfUkRMKGNhcmQsIHN1U3RhdHVzLmNvZGVWaW9sYXRpb25Db3VudCk7CisJCWluZm8tPmNyY0Vycm9yQ291bnQgPSBGU1RfUkRMKGNhcmQsIHN1U3RhdHVzLmNyY0Vycm9yQ291bnQpOworCQlpbmZvLT5saW5lQXR0ZW51YXRpb24gPSBGU1RfUkRMKGNhcmQsIHN1U3RhdHVzLmxpbmVBdHRlbnVhdGlvbik7CisJCWluZm8tPmxvc3NPZlNpZ25hbCA9IEZTVF9SREIoY2FyZCwgc3VTdGF0dXMubG9zc09mU2lnbmFsKTsKKwkJaW5mby0+cmVjZWl2ZVJlbW90ZUFsYXJtID0KKwkJICAgIEZTVF9SREIoY2FyZCwgc3VTdGF0dXMucmVjZWl2ZVJlbW90ZUFsYXJtKTsKKwkJaW5mby0+YWxhcm1JbmRpY2F0aW9uU2lnbmFsID0KKwkJICAgIEZTVF9SREIoY2FyZCwgc3VTdGF0dXMuYWxhcm1JbmRpY2F0aW9uU2lnbmFsKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2ZzdF9zZXRfaWZhY2Uoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LAorCSAgICAgIHN0cnVjdCBpZnJlcSAqaWZyKQoreworCXN5bmNfc2VyaWFsX3NldHRpbmdzIHN5bmM7CisJaW50IGk7CisKKwlpZiAoaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSAhPSBzaXplb2YgKHN5bmMpKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcgorCSAgICAoJnN5bmMsIGlmci0+aWZyX3NldHRpbmdzLmlmc19pZnN1LnN5bmMsIHNpemVvZiAoc3luYykpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWlmIChzeW5jLmxvb3BiYWNrKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWkgPSBwb3J0LT5pbmRleDsKKworCXN3aXRjaCAoaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCWNhc2UgSUZfSUZBQ0VfVjM1OgorCQlGU1RfV1JXKGNhcmQsIHBvcnRDb25maWdbaV0ubGluZUludGVyZmFjZSwgVjM1KTsKKwkJcG9ydC0+aHdpZiA9IFYzNTsKKwkJYnJlYWs7CisKKwljYXNlIElGX0lGQUNFX1YyNDoKKwkJRlNUX1dSVyhjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVJbnRlcmZhY2UsIFYyNCk7CisJCXBvcnQtPmh3aWYgPSBWMjQ7CisJCWJyZWFrOworCisJY2FzZSBJRl9JRkFDRV9YMjE6CisJCUZTVF9XUlcoY2FyZCwgcG9ydENvbmZpZ1tpXS5saW5lSW50ZXJmYWNlLCBYMjEpOworCQlwb3J0LT5od2lmID0gWDIxOworCQlicmVhazsKKworCWNhc2UgSUZfSUZBQ0VfWDIxRDoKKwkJRlNUX1dSVyhjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVJbnRlcmZhY2UsIFgyMUQpOworCQlwb3J0LT5od2lmID0gWDIxRDsKKwkJYnJlYWs7CisKKwljYXNlIElGX0lGQUNFX1QxOgorCQlGU1RfV1JXKGNhcmQsIHBvcnRDb25maWdbaV0ubGluZUludGVyZmFjZSwgVDEpOworCQlwb3J0LT5od2lmID0gVDE7CisJCWJyZWFrOworCisJY2FzZSBJRl9JRkFDRV9FMToKKwkJRlNUX1dSVyhjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVJbnRlcmZhY2UsIEUxKTsKKwkJcG9ydC0+aHdpZiA9IEUxOworCQlicmVhazsKKworCWNhc2UgSUZfSUZBQ0VfU1lOQ19TRVJJQUw6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChzeW5jLmNsb2NrX3R5cGUpIHsKKwljYXNlIENMT0NLX0VYVDoKKwkJRlNUX1dSQihjYXJkLCBwb3J0Q29uZmlnW2ldLmludGVybmFsQ2xvY2ssIEVYVENMSyk7CisJCWJyZWFrOworCisJY2FzZSBDTE9DS19JTlQ6CisJCUZTVF9XUkIoY2FyZCwgcG9ydENvbmZpZ1tpXS5pbnRlcm5hbENsb2NrLCBJTlRDTEspOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlGU1RfV1JMKGNhcmQsIHBvcnRDb25maWdbaV0ubGluZVNwZWVkLCBzeW5jLmNsb2NrX3JhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citmc3RfZ2V0X2lmYWNlKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCwKKwkgICAgICBzdHJ1Y3QgaWZyZXEgKmlmcikKK3sKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBzeW5jOworCWludCBpOworCisJLyogRmlyc3QgY2hlY2sgd2hhdCBsaW5lIHR5cGUgaXMgc2V0LCB3ZSdsbCBkZWZhdWx0IHRvIHJlcG9ydGluZyBYLjIxCisJICogaWYgbm90aGluZyBpcyBzZXQgYXMgSUZfSUZBQ0VfU1lOQ19TRVJJQUwgaW1wbGllcyBpdCBjYW4ndCBiZQorCSAqIGNoYW5nZWQKKwkgKi8KKwlzd2l0Y2ggKHBvcnQtPmh3aWYpIHsKKwljYXNlIEUxOgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfRTE7CisJCWJyZWFrOworCWNhc2UgVDE6CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9UMTsKKwkJYnJlYWs7CisJY2FzZSBWMzU6CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9WMzU7CisJCWJyZWFrOworCWNhc2UgVjI0OgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfVjI0OworCQlicmVhazsKKwljYXNlIFgyMUQ6CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9YMjFEOworCQlicmVhazsKKwljYXNlIFgyMToKKwlkZWZhdWx0OgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfWDIxOworCQlicmVhazsKKwl9CisJaWYgKGlmci0+aWZyX3NldHRpbmdzLnNpemUgPT0gMCkgeworCQlyZXR1cm4gMDsJLyogb25seSB0eXBlIHJlcXVlc3RlZCAqLworCX0KKwlpZiAoaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA8IHNpemVvZiAoc3luYykpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaSA9IHBvcnQtPmluZGV4OworCXN5bmMuY2xvY2tfcmF0ZSA9IEZTVF9SREwoY2FyZCwgcG9ydENvbmZpZ1tpXS5saW5lU3BlZWQpOworCS8qIEx1Y2t5IGNhcmQgYW5kIGxpbnV4IHVzZSBzYW1lIGVuY29kaW5nIGhlcmUgKi8KKwlzeW5jLmNsb2NrX3R5cGUgPSBGU1RfUkRCKGNhcmQsIHBvcnRDb25maWdbaV0uaW50ZXJuYWxDbG9jaykgPT0KKwkgICAgSU5UQ0xLID8gQ0xPQ0tfSU5UIDogQ0xPQ0tfRVhUOworCXN5bmMubG9vcGJhY2sgPSAwOworCisJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5zeW5jLCAmc3luYywgc2l6ZW9mIChzeW5jKSkpIHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA9IHNpemVvZiAoc3luYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2ZzdF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZDsKKwlzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydDsKKwlzdHJ1Y3QgZnN0aW9jX3dyaXRlIHdydGhkcjsKKwlzdHJ1Y3QgZnN0aW9jX2luZm8gaW5mbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGJnKERCR19JT0NUTCwgImlvY3RsOiAleCwgJXBcbiIsIGNtZCwgaWZyLT5pZnJfZGF0YSk7CisKKwlwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwljYXJkID0gcG9ydC0+Y2FyZDsKKworCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBGU1RDUFVSRVNFVDoKKwkJZnN0X2NwdXJlc2V0KGNhcmQpOworCQljYXJkLT5zdGF0ZSA9IEZTVF9SRVNFVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEZTVENQVVJFTEVBU0U6CisJCWZzdF9jcHVyZWxlYXNlKGNhcmQpOworCQljYXJkLT5zdGF0ZSA9IEZTVF9TVEFSVElORzsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEZTVFdSSVRFOgkJLyogQ29kZSB3cml0ZSAoZG93bmxvYWQpICovCisKKwkJLyogRmlyc3QgY29weSBpbiB0aGUgaGVhZGVyIHdpdGggdGhlIGxlbmd0aCBhbmQgb2Zmc2V0IG9mIGRhdGEKKwkJICogdG8gd3JpdGUKKwkJICovCisJCWlmIChpZnItPmlmcl9kYXRhID09IE5VTEwpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcigmd3J0aGRyLCBpZnItPmlmcl9kYXRhLAorCQkJCSAgIHNpemVvZiAoc3RydWN0IGZzdGlvY193cml0ZSkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCS8qIFNhbml0eSBjaGVjayB0aGUgcGFyYW1ldGVycy4gV2UgZG9uJ3Qgc3VwcG9ydCBwYXJ0aWFsIHdyaXRlcworCQkgKiB3aGVuIGdvaW5nIG92ZXIgdGhlIHRvcAorCQkgKi8KKwkJaWYgKHdydGhkci5zaXplID4gRlNUX01FTVNJWkUgfHwgd3J0aGRyLm9mZnNldCA+IEZTVF9NRU1TSVpFCisJCSAgICB8fCB3cnRoZHIuc2l6ZSArIHdydGhkci5vZmZzZXQgPiBGU1RfTUVNU0laRSkgeworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCisJCS8qIE5vdyBjb3B5IHRoZSBkYXRhIHRvIHRoZSBjYXJkLgorCQkgKiBUaGlzIHdpbGwgcHJvYmFibHkgYnJlYWsgb24gc29tZSBhcmNoaXRlY3R1cmVzLgorCQkgKiBJJ2xsIGZpeCBpdCB3aGVuIEkgaGF2ZSBzb21ldGhpbmcgdG8gdGVzdCBvbi4KKwkJICovCisJCWlmIChjb3B5X2Zyb21fdXNlcihjYXJkLT5tZW0gKyB3cnRoZHIub2Zmc2V0LAorCQkJCSAgIGlmci0+aWZyX2RhdGEgKyBzaXplb2YgKHN0cnVjdCBmc3Rpb2Nfd3JpdGUpLAorCQkJCSAgIHdydGhkci5zaXplKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQkvKiBXcml0ZXMgdG8gdGhlIG1lbW9yeSBvZiBhIGNhcmQgaW4gdGhlIHJlc2V0IHN0YXRlIGNvbnN0aXR1dGUKKwkJICogYSBkb3dubG9hZAorCQkgKi8KKwkJaWYgKGNhcmQtPnN0YXRlID09IEZTVF9SRVNFVCkgeworCQkJY2FyZC0+c3RhdGUgPSBGU1RfRE9XTkxPQUQ7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIEZTVEdFVENPTkY6CisKKwkJLyogSWYgY2FyZCBoYXMganVzdCBiZWVuIHN0YXJ0ZWQgY2hlY2sgdGhlIHNoYXJlZCBtZW1vcnkgY29uZmlnCisJCSAqIHZlcnNpb24gYW5kIG1hcmtlcgorCQkgKi8KKwkJaWYgKGNhcmQtPnN0YXRlID09IEZTVF9TVEFSVElORykgeworCQkJY2hlY2tfc3RhcnRlZF9vayhjYXJkKTsKKworCQkJLyogSWYgZXZlcnl0aGluZyBjaGVja2VkIG91dCBlbmFibGUgY2FyZCBpbnRlcnJ1cHRzICovCisJCQlpZiAoY2FyZC0+c3RhdGUgPT0gRlNUX1JVTk5JTkcpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCQkJZnN0X2VuYWJsZV9pbnRyKGNhcmQpOworCQkJCUZTVF9XUkIoY2FyZCwgaW50ZXJydXB0SGFuZHNoYWtlLCAweEVFKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJCX0KKwkJfQorCisJCWlmIChpZnItPmlmcl9kYXRhID09IE5VTEwpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZ2F0aGVyX2NvbmZfaW5mbyhjYXJkLCBwb3J0LCAmaW5mbyk7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCAmaW5mbywgc2l6ZW9mIChpbmZvKSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBGU1RTRVRDT05GOgorCisJCS8qCisJCSAqIE1vc3Qgb2YgdGhlIHNldHRpbmdzIGhhdmUgYmVlbiBtb3ZlZCB0byB0aGUgZ2VuZXJpYyBpb2N0bHMKKwkJICogdGhpcyBqdXN0IGNvdmVycyBkZWJ1ZyBhbmQgYm9hcmQgaWRlbnQgbm93CisJCSAqLworCisJCWlmIChjYXJkLT5zdGF0ZSAhPSBGU1RfUlVOTklORykgeworCQkJcHJpbnRrX2VycgorCQkJICAgICgiQXR0ZW1wdCB0byBjb25maWd1cmUgY2FyZCAlZCBpbiBub24tcnVubmluZyBzdGF0ZSAoJWQpXG4iLAorCQkJICAgICBjYXJkLT5jYXJkX25vLCBjYXJkLT5zdGF0ZSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGlmci0+aWZyX2RhdGEsIHNpemVvZiAoaW5mbykpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXJldHVybiBzZXRfY29uZl9mcm9tX2luZm8oY2FyZCwgcG9ydCwgJmluZm8pOworCisJY2FzZSBTSU9DV0FOREVWOgorCQlzd2l0Y2ggKGlmci0+aWZyX3NldHRpbmdzLnR5cGUpIHsKKwkJY2FzZSBJRl9HRVRfSUZBQ0U6CisJCQlyZXR1cm4gZnN0X2dldF9pZmFjZShjYXJkLCBwb3J0LCBpZnIpOworCisJCWNhc2UgSUZfSUZBQ0VfU1lOQ19TRVJJQUw6CisJCWNhc2UgSUZfSUZBQ0VfVjM1OgorCQljYXNlIElGX0lGQUNFX1YyNDoKKwkJY2FzZSBJRl9JRkFDRV9YMjE6CisJCWNhc2UgSUZfSUZBQ0VfWDIxRDoKKwkJY2FzZSBJRl9JRkFDRV9UMToKKwkJY2FzZSBJRl9JRkFDRV9FMToKKwkJCXJldHVybiBmc3Rfc2V0X2lmYWNlKGNhcmQsIHBvcnQsIGlmcik7CisKKwkJY2FzZSBJRl9QUk9UT19SQVc6CisJCQlwb3J0LT5tb2RlID0gRlNUX1JBVzsKKwkJCXJldHVybiAwOworCisJCWNhc2UgSUZfR0VUX1BST1RPOgorCQkJaWYgKHBvcnQtPm1vZGUgPT0gRlNUX1JBVykgeworCQkJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9QUk9UT19SQVc7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKworCQlkZWZhdWx0OgorCQkJcG9ydC0+bW9kZSA9IEZTVF9HRU5fSERMQzsKKwkJCWRiZyhEQkdfSU9DVEwsICJQYXNzaW5nIHRoaXMgdHlwZSB0byBoZGxjICV4XG4iLAorCQkJICAgIGlmci0+aWZyX3NldHRpbmdzLnR5cGUpOworCQkJcmV0dXJuIGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisJCX0KKworCWRlZmF1bHQ6CisJCS8qIE5vdCBvbmUgb2Ygb3Vycy4gUGFzcyB0aHJvdWdoIHRvIEhETEMgcGFja2FnZSAqLworCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitmc3Rfb3BlbnBvcnQoc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQpCit7CisJaW50IHNpZ25hbHM7CisJaW50IHR4cV9sZW5ndGg7CisKKwkvKiBPbmx5IGluaXQgdGhpbmdzIGlmIGNhcmQgaXMgYWN0dWFsbHkgcnVubmluZy4gVGhpcyBhbGxvd3Mgb3BlbiB0bworCSAqIHN1Y2NlZWQgZm9yIGRvd25sb2FkcyBldGMuCisJICovCisJaWYgKHBvcnQtPmNhcmQtPnN0YXRlID09IEZTVF9SVU5OSU5HKSB7CisJCWlmIChwb3J0LT5ydW4pIHsKKwkJCWRiZyhEQkdfT1BFTiwgIm9wZW46IGZvdW5kIHBvcnQgYWxyZWFkeSBydW5uaW5nXG4iKTsKKworCQkJZnN0X2lzc3VlX2NtZChwb3J0LCBTVE9QUE9SVCk7CisJCQlwb3J0LT5ydW4gPSAwOworCQl9CisKKwkJZnN0X3J4X2NvbmZpZyhwb3J0KTsKKwkJZnN0X3R4X2NvbmZpZyhwb3J0KTsKKwkJZnN0X29wX3JhaXNlKHBvcnQsIE9QU1RTX1JUUyB8IE9QU1RTX0RUUik7CisKKwkJZnN0X2lzc3VlX2NtZChwb3J0LCBTVEFSVFBPUlQpOworCQlwb3J0LT5ydW4gPSAxOworCisJCXNpZ25hbHMgPSBGU1RfUkRMKHBvcnQtPmNhcmQsIHYyNERlYm91bmNlZFN0c1twb3J0LT5pbmRleF0pOworCQlpZiAoc2lnbmFscyAmICgoKHBvcnQtPmh3aWYgPT0gWDIxKSB8fCAocG9ydC0+aHdpZiA9PSBYMjFEKSkKKwkJCSAgICAgICA/IElQU1RTX0lORElDQVRFIDogSVBTVFNfRENEKSkKKwkJCW5ldGlmX2NhcnJpZXJfb24ocG9ydF90b19kZXYocG9ydCkpOworCQllbHNlCisJCQluZXRpZl9jYXJyaWVyX29mZihwb3J0X3RvX2Rldihwb3J0KSk7CisKKwkJdHhxX2xlbmd0aCA9IHBvcnQtPnR4cWUgLSBwb3J0LT50eHFzOworCQlwb3J0LT50eHFlID0gMDsKKwkJcG9ydC0+dHhxcyA9IDA7CisJfQorCit9CisKK3N0YXRpYyB2b2lkCitmc3RfY2xvc2Vwb3J0KHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0KQoreworCWlmIChwb3J0LT5jYXJkLT5zdGF0ZSA9PSBGU1RfUlVOTklORykgeworCQlpZiAocG9ydC0+cnVuKSB7CisJCQlwb3J0LT5ydW4gPSAwOworCQkJZnN0X29wX2xvd2VyKHBvcnQsIE9QU1RTX1JUUyB8IE9QU1RTX0RUUik7CisKKwkJCWZzdF9pc3N1ZV9jbWQocG9ydCwgU1RPUFBPUlQpOworCQl9IGVsc2UgeworCQkJZGJnKERCR19PUEVOLCAiY2xvc2U6IHBvcnQgbm90IHJ1bm5pbmdcbiIpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50Citmc3Rfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBlcnI7CisJc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQ7CisKKwlwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkKKyAgICAgICAgICByZXR1cm4gLUVCVVNZOworCisJaWYgKHBvcnQtPm1vZGUgIT0gRlNUX1JBVykgeworCQllcnIgPSBoZGxjX29wZW4oZGV2KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJZnN0X29wZW5wb3J0KHBvcnQpOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZnN0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQ7CisJc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQ7CisJdW5zaWduZWQgY2hhciB0eF9kbWFfZG9uZTsKKwl1bnNpZ25lZCBjaGFyIHJ4X2RtYV9kb25lOworCisJcG9ydCA9IGRldl90b19wb3J0KGRldik7CisJY2FyZCA9IHBvcnQtPmNhcmQ7CisKKwl0eF9kbWFfZG9uZSA9IGluYihjYXJkLT5wY2lfY29uZiArIERNQUNTUjEpOworCXJ4X2RtYV9kb25lID0gaW5iKGNhcmQtPnBjaV9jb25mICsgRE1BQ1NSMCk7CisJZGJnKERCR19PUEVOLAorCSAgICAiUG9ydCBDbG9zZTogdHhfZG1hX2luX3Byb2dyZXNzID0gJWQgKCV4KSByeF9kbWFfaW5fcHJvZ3Jlc3MgPSAlZCAoJXgpXG4iLAorCSAgICBjYXJkLT5kbWF0eF9pbl9wcm9ncmVzcywgdHhfZG1hX2RvbmUsIGNhcmQtPmRtYXJ4X2luX3Byb2dyZXNzLAorCSAgICByeF9kbWFfZG9uZSk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJZnN0X2Nsb3NlcG9ydChkZXZfdG9fcG9ydChkZXYpKTsKKwlpZiAocG9ydC0+bW9kZSAhPSBGU1RfUkFXKSB7CisJCWhkbGNfY2xvc2UoZGV2KTsKKwl9CisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2ZzdF9hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgZW5jb2RpbmcsIHVuc2lnbmVkIHNob3J0IHBhcml0eSkKK3sKKwkvKgorCSAqIFNldHRpbmcgY3VycmVudGx5IGZpeGVkIGluIEZhclN5bmMgY2FyZCBzbyB3ZSBjaGVjayBhbmQgZm9yZ2V0CisJICovCisJaWYgKGVuY29kaW5nICE9IEVOQ09ESU5HX05SWiB8fCBwYXJpdHkgIT0gUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitmc3RfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0OworCXN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKworCXBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCWNhcmQgPSBwb3J0LT5jYXJkOworCXN0YXRzLT50eF9lcnJvcnMrKzsKKwlzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMrKzsKKwlkYmcoREJHX0FTUywgIlR4IHRpbWVvdXQgY2FyZCAlZCBwb3J0ICVkXG4iLAorCSAgICBjYXJkLT5jYXJkX25vLCBwb3J0LT5pbmRleCk7CisJZnN0X2lzc3VlX2NtZChwb3J0LCBBQk9SVFRYKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlwb3J0LT5zdGFydCA9IDA7Cit9CisKK3N0YXRpYyBpbnQKK2ZzdF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQ7CisJc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQ7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHR4cV9sZW5ndGg7CisKKwlwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwljYXJkID0gcG9ydC0+Y2FyZDsKKwlkYmcoREJHX1RYLCAiZnN0X3N0YXJ0X3htaXQ6IGxlbmd0aCA9ICVkXG4iLCBza2ItPmxlbik7CisKKwkvKiBEcm9wIHBhY2tldCB3aXRoIGVycm9yIGlmIHdlIGRvbid0IGhhdmUgY2FycmllciAqLworCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJc3RhdHMtPnR4X2Vycm9ycysrOworCQlzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJZGJnKERCR19BU1MsCisJCSAgICAiVHJpZWQgdG8gdHJhbnNtaXQgYnV0IG5vIGNhcnJpZXIgb24gY2FyZCAlZCBwb3J0ICVkXG4iLAorCQkgICAgY2FyZC0+Y2FyZF9ubywgcG9ydC0+aW5kZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBEcm9wIGl0IGlmIGl0J3MgdG9vIGJpZyEgTVRVIGZhaWx1cmUgPyAqLworCWlmIChza2ItPmxlbiA+IExFTl9UWF9CVUZGRVIpIHsKKwkJZGJnKERCR19BU1MsICJQYWNrZXQgdG9vIGxhcmdlICVkIHZzICVkXG4iLCBza2ItPmxlbiwKKwkJICAgIExFTl9UWF9CVUZGRVIpOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBXZSBhcmUgYWx3YXlzIGdvaW5nIHRvIHF1ZXVlIHRoZSBwYWNrZXQKKwkgKiBzbyB0aGF0IHRoZSBib3R0b20gaGFsZiBpcyB0aGUgb25seSBwbGFjZSB3ZSB0eCBmcm9tCisJICogQ2hlY2sgdGhlcmUgaXMgcm9vbSBpbiB0aGUgcG9ydCB0eHEKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJaWYgKCh0eHFfbGVuZ3RoID0gcG9ydC0+dHhxZSAtIHBvcnQtPnR4cXMpIDwgMCkgeworCQkvKgorCQkgKiBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIHRoZSBuZXh0IGZyZWUgaGFzIHdyYXBwZWQgYnV0IHRoZQorCQkgKiBsYXN0IHVzZWQgaGFzbid0CisJCSAqLworCQl0eHFfbGVuZ3RoID0gdHhxX2xlbmd0aCArIEZTVF9UWFFfREVQVEg7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCWlmICh0eHFfbGVuZ3RoID4gZnN0X3R4cV9oaWdoKSB7CisJCS8qCisJCSAqIFdlIGhhdmUgZ290IGVub3VnaCBidWZmZXJzIGluIHRoZSBwaXBlbGluZS4gIEFzayB0aGUgbmV0d29yaworCQkgKiBsYXllciB0byBzdG9wIHNlbmRpbmcgZnJhbWVzIGRvd24KKwkJICovCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJcG9ydC0+c3RhcnQgPSAxOwkvKiBJJ20gdXNpbmcgdGhpcyB0byBzaWduYWwgc3RvcCBzZW50IHVwICovCisJfQorCisJaWYgKHR4cV9sZW5ndGggPT0gRlNUX1RYUV9ERVBUSCAtIDEpIHsKKwkJLyoKKwkJICogVGhpcyBzaG91bGRuJ3QgaGF2ZSBoYXBwZW5lZCBidXQgc3VjaCBpcyBsaWZlCisJCSAqLworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJZGJnKERCR19BU1MsICJUeCBxdWV1ZSBvdmVyZmxvdyBjYXJkICVkIHBvcnQgJWRcbiIsCisJCSAgICBjYXJkLT5jYXJkX25vLCBwb3J0LT5pbmRleCk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogcXVldWUgdGhlIGJ1ZmZlcgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwlwb3J0LT50eHFbcG9ydC0+dHhxZV0gPSBza2I7CisJcG9ydC0+dHhxZSsrOworCWlmIChwb3J0LT50eHFlID09IEZTVF9UWFFfREVQVEgpCisJCXBvcnQtPnR4cWUgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCisJLyogU2NlaGR1bGUgdGhlIGJvdHRvbSBoYWxmIHdoaWNoIG5vdyBkb2VzIHRyYW5zbWl0IHByb2Nlc3NpbmcgKi8KKwlmc3RfcV93b3JrX2l0ZW0oJmZzdF93b3JrX3R4cSwgY2FyZC0+Y2FyZF9ubyk7CisJdGFza2xldF9zY2hlZHVsZSgmZnN0X3R4X3Rhc2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgICAgIENhcmQgc2V0dXAgaGF2aW5nIGNoZWNrZWQgaGFyZHdhcmUgcmVzb3VyY2VzLgorICogICAgICBTaG91bGQgYmUgcHJldHR5IGJpemFycmUgaWYgd2UgZ2V0IGFuIGVycm9yIGhlcmUgKGtlcm5lbCBtZW1vcnkKKyAqICAgICAgZXhoYXVzdGlvbiBpcyBvbmUgcG9zc2liaWxpdHkpLiBJZiB3ZSBkbyBzZWUgYSBwcm9ibGVtIHdlIHJlcG9ydCBpdAorICogICAgICB2aWEgYSBwcmludGsgYW5kIGxlYXZlIHRoZSBjb3JyZXNwb25kaW5nIGludGVyZmFjZSBhbmQgYWxsIHRoYXQgZm9sbG93CisgKiAgICAgIGRpc2FibGVkLgorICovCitzdGF0aWMgY2hhciAqdHlwZV9zdHJpbmdzW10gX19kZXZpbml0ZGF0YSA9IHsKKwkibm8gaGFyZHdhcmUiLAkJLyogU2hvdWxkIG5ldmVyIGJlIHNlZW4gKi8KKwkiRmFyU3luYyBUMlAiLAorCSJGYXJTeW5jIFQ0UCIsCisJIkZhclN5bmMgVDFVIiwKKwkiRmFyU3luYyBUMlUiLAorCSJGYXJTeW5jIFQ0VSIsCisJIkZhclN5bmMgVEUxIgorfTsKKworc3RhdGljIHZvaWQgX19kZXZpbml0Citmc3RfaW5pdF9jYXJkKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkKQoreworCWludCBpOworCWludCBlcnI7CisKKwkvKiBXZSdyZSB3b3JraW5nIG9uIGEgbnVtYmVyIG9mIHBvcnRzIGJhc2VkIG9uIHRoZSBjYXJkIElELiBJZiB0aGUKKwkgKiBmaXJtd2FyZSBkZXRlY3RzIHNvbWV0aGluZyBkaWZmZXJlbnQgbGF0ZXIgKHNob3VsZCBuZXZlciBoYXBwZW4pCisJICogd2UnbGwgaGF2ZSB0byByZXZpc2UgaXQgaW4gc29tZSB3YXkgdGhlbi4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bnBvcnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBlcnIgPSByZWdpc3Rlcl9oZGxjX2RldmljZShjYXJkLT5wb3J0c1tpXS5kZXYpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPCAwKSB7CisJCQlpbnQgajsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50a19lcnIgKCJDYW5ub3QgcmVnaXN0ZXIgSERMQyBkZXZpY2UgZm9yIHBvcnQgJWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIChlcnJubyAlZClcbiIsIGksIC1lcnIgKTsKKwkJCWZvciAoaiA9IGk7IGogPCBjYXJkLT5ucG9ydHM7IGorKykgeworCQkJCWZyZWVfbmV0ZGV2KGNhcmQtPnBvcnRzW2pdLmRldik7CisJCQkJY2FyZC0+cG9ydHNbal0uZGV2ID0gTlVMTDsKKwkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPm5wb3J0cyA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisJfQorCisJcHJpbnRrX2luZm8oIiVzLSVzOiAlcyBJUlElZCwgJWQgcG9ydHNcbiIsCisJICAgICAgIHBvcnRfdG9fZGV2KCZjYXJkLT5wb3J0c1swXSktPm5hbWUsCisJICAgICAgIHBvcnRfdG9fZGV2KCZjYXJkLT5wb3J0c1tjYXJkLT5ucG9ydHMgLSAxXSktPm5hbWUsCisJICAgICAgIHR5cGVfc3RyaW5nc1tjYXJkLT50eXBlXSwgY2FyZC0+aXJxLCBjYXJkLT5ucG9ydHMpOworfQorCisvKgorICogICAgICBJbml0aWFsaXNlIGNhcmQgd2hlbiBkZXRlY3RlZC4KKyAqICAgICAgUmV0dXJucyAwIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG9yIGVycm5vIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQKK2ZzdF9hZGRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0YXRpYyBpbnQgZmlyc3R0aW1lX2RvbmUgPSAwOworCXN0YXRpYyBpbnQgbm9fb2ZfY2FyZHNfYWRkZWQgPSAwOworCXN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOworCWludCBlcnIgPSAwOworCWludCBpOworCisJaWYgKCFmaXJzdHRpbWVfZG9uZSkgeworCQlwcmludGtfaW5mbygiRmFyU3luYyBXQU4gZHJpdmVyICIgRlNUX1VTRVJfVkVSU0lPTgorCQkgICAgICAgIiAoYykgMjAwMS0yMDA0IEZhclNpdGUgQ29tbXVuaWNhdGlvbnMgTHRkLlxuIik7CisJCWZpcnN0dGltZV9kb25lID0gMTsKKwkJZGJnKERCR19BU1MsICJUaGUgdmFsdWUgb2YgZGVidWcgbWFzayBpcyAleFxuIiwgZnN0X2RlYnVnX21hc2spOworCX0KKworCS8qCisJICogV2UgYXJlIGdvaW5nIHRvIGJlIGNsZXZlciBhbmQgYWxsb3cgY2VydGFpbiBjYXJkcyBub3QgdG8gYmUKKwkgKiBjb25maWd1cmVkLiAgQW4gZXhjbHVkZSBsaXN0IGNhbiBiZSBwcm92aWRlZCBpbiAvZXRjL21vZHVsZXMuY29uZgorCSAqLworCWlmIChmc3RfZXhjbHVkZWRfY2FyZHMgIT0gMCkgeworCQkvKgorCQkgKiBUaGVyZSBhcmUgY2FyZHMgdG8gZXhjbHVkZQorCQkgKgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IGZzdF9leGNsdWRlZF9jYXJkczsgaSsrKSB7CisJCQlpZiAoKHBkZXYtPmRldmZuKSA+PiAzID09IGZzdF9leGNsdWRlZF9saXN0W2ldKSB7CisJCQkJcHJpbnRrX2luZm8oIkZhclN5bmMgUENJIGRldmljZSAlZCBub3QgYXNzaWduZWRcbiIsCisJCQkJICAgICAgIChwZGV2LT5kZXZmbikgPj4gMyk7CisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJfQorCX0KKworCS8qIEFsbG9jYXRlIGRyaXZlciBwcml2YXRlIGRhdGEgKi8KKwljYXJkID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCBmc3RfY2FyZF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhcmQgPT0gTlVMTCkgeworCQlwcmludGtfZXJyKCJGYXJTeW5jIGNhcmQgZm91bmQgYnV0IGluc3VmZmljaWVudCBtZW1vcnkgZm9yIgorCQkJICAgIiBkcml2ZXIgc3RvcmFnZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoY2FyZCwgMCwgc2l6ZW9mIChzdHJ1Y3QgZnN0X2NhcmRfaW5mbykpOworCisJLyogVHJ5IHRvIGVuYWJsZSB0aGUgZGV2aWNlICovCisJaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgIT0gMCkgeworCQlwcmludGtfZXJyKCJGYWlsZWQgdG8gZW5hYmxlIGNhcmQuIEVyciAlZFxuIiwgLWVycik7CisJCWtmcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAiRmFyU3luYyIpKSAhPTApIHsKKwkgICAgICAgIHByaW50a19lcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSByZWdpb25zLiBFcnIgJWRcbiIsIC1lcnIpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCWtmcmVlKGNhcmQpOworCSAgICAgICAgcmV0dXJuIGVycjsKKwl9CisKKwkvKiBHZXQgdmlydHVhbCBhZGRyZXNzZXMgb2YgbWVtb3J5IHJlZ2lvbnMgKi8KKwljYXJkLT5wY2lfY29uZiA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKwljYXJkLT5waHlzX21lbSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKTsKKwljYXJkLT5waHlzX2N0bG1lbSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKTsKKwlpZiAoKGNhcmQtPm1lbSA9IGlvcmVtYXAoY2FyZC0+cGh5c19tZW0sIEZTVF9NRU1TSVpFKSkgPT0gTlVMTCkgeworCQlwcmludGtfZXJyKCJQaHlzaWNhbCBtZW1vcnkgcmVtYXAgZmFpbGVkXG4iKTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlrZnJlZShjYXJkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICgoY2FyZC0+Y3RsbWVtID0gaW9yZW1hcChjYXJkLT5waHlzX2N0bG1lbSwgMHgxMCkpID09IE5VTEwpIHsKKwkJcHJpbnRrX2VycigiQ29udHJvbCBtZW1vcnkgcmVtYXAgZmFpbGVkXG4iKTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlrZnJlZShjYXJkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWRiZyhEQkdfUENJLCAia2VybmVsIG1lbSAlcCwgY3RsbWVtICVwXG4iLCBjYXJkLT5tZW0sIGNhcmQtPmN0bG1lbSk7CisKKwkvKiBSZWdpc3RlciB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlpZiAocmVxdWVzdF9pcnEocGRldi0+aXJxLCBmc3RfaW50ciwgU0FfU0hJUlEsIEZTVF9ERVZfTkFNRSwgY2FyZCkpIHsKKwkJcHJpbnRrX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIGludGVycnVwdCAlZFxuIiwgY2FyZC0+aXJxKTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlpb3VubWFwKGNhcmQtPmN0bG1lbSk7CisJCWlvdW5tYXAoY2FyZC0+bWVtKTsKKwkJa2ZyZWUoY2FyZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFJlY29yZCBpbmZvIHdlIG5lZWQgKi8KKwljYXJkLT5pcnEgPSBwZGV2LT5pcnE7CisJY2FyZC0+dHlwZSA9IGVudC0+ZHJpdmVyX2RhdGE7CisJY2FyZC0+ZmFtaWx5ID0gKChlbnQtPmRyaXZlcl9kYXRhID09IEZTVF9UWVBFX1QyUCkgfHwKKwkJCShlbnQtPmRyaXZlcl9kYXRhID09IEZTVF9UWVBFX1Q0UCkpCisJICAgID8gRlNUX0ZBTUlMWV9UWFAgOiBGU1RfRkFNSUxZX1RYVTsKKwlpZiAoKGVudC0+ZHJpdmVyX2RhdGEgPT0gRlNUX1RZUEVfVDFVKSB8fAorCSAgICAoZW50LT5kcml2ZXJfZGF0YSA9PSBGU1RfVFlQRV9URTEpKQorCQljYXJkLT5ucG9ydHMgPSAxOworCWVsc2UKKwkJY2FyZC0+bnBvcnRzID0gKChlbnQtPmRyaXZlcl9kYXRhID09IEZTVF9UWVBFX1QyUCkgfHwKKwkJCQkoZW50LT5kcml2ZXJfZGF0YSA9PSBGU1RfVFlQRV9UMlUpKSA/IDIgOiA0OworCisJY2FyZC0+c3RhdGUgPSBGU1RfVU5JTklUOworICAgICAgICBzcGluX2xvY2tfaW5pdCAoICZjYXJkLT5jYXJkX2xvY2sgKTsKKworICAgICAgICBmb3IgKCBpID0gMCA7IGkgPCBjYXJkLT5ucG9ydHMgOyBpKysgKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19oZGxjZGV2KCZjYXJkLT5wb3J0c1tpXSk7CisJCWhkbGNfZGV2aWNlICpoZGxjOworCQlpZiAoIWRldikgeworCQkJd2hpbGUgKGktLSkKKwkJCQlmcmVlX25ldGRldihjYXJkLT5wb3J0c1tpXS5kZXYpOworCQkJcHJpbnRrX2VyciAoIkZhclN5bmM6IG91dCBvZiBtZW1vcnlcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisgICAgICAgICAgICAgICAgICAgICAgICBpb3VubWFwKGNhcmQtPmN0bG1lbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpb3VubWFwKGNhcmQtPm1lbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZShjYXJkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworCQl9CisJCWNhcmQtPnBvcnRzW2ldLmRldiAgICA9IGRldjsKKyAgICAgICAgICAgICAgICBjYXJkLT5wb3J0c1tpXS5jYXJkICAgPSBjYXJkOworICAgICAgICAgICAgICAgIGNhcmQtPnBvcnRzW2ldLmluZGV4ICA9IGk7CisgICAgICAgICAgICAgICAgY2FyZC0+cG9ydHNbaV0ucnVuICAgID0gMDsKKworCQloZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKworICAgICAgICAgICAgICAgIC8qIEZpbGwgaW4gdGhlIG5ldCBkZXZpY2UgaW5mbyAqLworCQkvKiBTaW5jZSB0aGlzIGlzIGEgUENJIHNldHVwIHRoaXMgaXMgcHVyZWx5CisJCSAqIGluZm9ybWF0aW9uYWwuIEdpdmUgdGhlbSB0aGUgYnVmZmVyIGFkZHJlc3NlcworCQkgKiBhbmQgYmFzaWMgY2FyZCBJL08uCisJCSAqLworICAgICAgICAgICAgICAgIGRldi0+bWVtX3N0YXJ0ICAgPSBjYXJkLT5waHlzX21lbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBCVUZfT0ZGU0VUICggdHhCdWZmZXJbaV1bMF1bMF0pOworICAgICAgICAgICAgICAgIGRldi0+bWVtX2VuZCAgICAgPSBjYXJkLT5waHlzX21lbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBCVUZfT0ZGU0VUICggdHhCdWZmZXJbaV1bTlVNX1RYX0JVRkZFUl1bMF0pOworICAgICAgICAgICAgICAgIGRldi0+YmFzZV9hZGRyICAgPSBjYXJkLT5wY2lfY29uZjsKKyAgICAgICAgICAgICAgICBkZXYtPmlycSAgICAgICAgID0gY2FyZC0+aXJxOworCisgICAgICAgICAgICAgICAgZGV2LT50eF9xdWV1ZV9sZW4gICAgICAgICAgPSBGU1RfVFhfUVVFVUVfTEVOOworICAgICAgICAgICAgICAgIGRldi0+b3BlbiAgICAgICAgICAgICAgICAgID0gZnN0X29wZW47CisgICAgICAgICAgICAgICAgZGV2LT5zdG9wICAgICAgICAgICAgICAgICAgPSBmc3RfY2xvc2U7CisgICAgICAgICAgICAgICAgZGV2LT5kb19pb2N0bCAgICAgICAgICAgICAgPSBmc3RfaW9jdGw7CisgICAgICAgICAgICAgICAgZGV2LT53YXRjaGRvZ190aW1lbyAgICAgICAgPSBGU1RfVFhfVElNRU9VVDsKKyAgICAgICAgICAgICAgICBkZXYtPnR4X3RpbWVvdXQgICAgICAgICAgICA9IGZzdF90eF90aW1lb3V0OworICAgICAgICAgICAgICAgIGhkbGMtPmF0dGFjaCA9IGZzdF9hdHRhY2g7CisgICAgICAgICAgICAgICAgaGRsYy0+eG1pdCAgID0gZnN0X3N0YXJ0X3htaXQ7CisJfQorCisJY2FyZC0+ZGV2aWNlID0gcGRldjsKKworCWRiZyhEQkdfUENJLCAidHlwZSAlZCBucG9ydHMgJWQgaXJxICVkXG4iLCBjYXJkLT50eXBlLAorCSAgICBjYXJkLT5ucG9ydHMsIGNhcmQtPmlycSk7CisJZGJnKERCR19QQ0ksICJjb25mICUwNHggbWVtICUwOHggY3RsbWVtICUwOHhcbiIsCisJICAgIGNhcmQtPnBjaV9jb25mLCBjYXJkLT5waHlzX21lbSwgY2FyZC0+cGh5c19jdGxtZW0pOworCisJLyogUmVzZXQgdGhlIGNhcmQncyBwcm9jZXNzb3IgKi8KKwlmc3RfY3B1cmVzZXQoY2FyZCk7CisJY2FyZC0+c3RhdGUgPSBGU1RfUkVTRVQ7CisKKwkvKiBJbml0aWFsaXNlIERNQSAoaWYgcmVxdWlyZWQpICovCisJZnN0X2luaXRfZG1hKGNhcmQpOworCisJLyogUmVjb3JkIGRyaXZlciBkYXRhIGZvciBsYXRlciB1c2UgKi8KKwlwY2lfc2V0X2RydmRhdGEocGRldiwgY2FyZCk7CisKKwkvKiBSZW1haW5kZXIgb2YgY2FyZCBzZXR1cCAqLworCWZzdF9jYXJkX2FycmF5W25vX29mX2NhcmRzX2FkZGVkXSA9IGNhcmQ7CisJY2FyZC0+Y2FyZF9ubyA9IG5vX29mX2NhcmRzX2FkZGVkKys7CS8qIFJlY29yZCBpbnN0YW5jZSBhbmQgYnVtcCBpdCAqLworCWZzdF9pbml0X2NhcmQoY2FyZCk7CisJaWYgKGNhcmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RYVSkgeworCQkvKgorCQkgKiBBbGxvY2F0ZSBhIGRtYSBidWZmZXIgZm9yIHRyYW5zbWl0IGFuZCByZWNlaXZlcworCQkgKi8KKwkJY2FyZC0+cnhfZG1hX2hhbmRsZV9ob3N0ID0KKwkJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KGNhcmQtPmRldmljZSwgRlNUX01BWF9NVFUsCisJCQkJCSAmY2FyZC0+cnhfZG1hX2hhbmRsZV9jYXJkKTsKKwkJaWYgKGNhcmQtPnJ4X2RtYV9oYW5kbGVfaG9zdCA9PSBOVUxMKSB7CisJCQlwcmludGtfZXJyKCJDb3VsZCBub3QgYWxsb2NhdGUgcnggZG1hIGJ1ZmZlclxuIik7CisJCQlmc3RfZGlzYWJsZV9pbnRyKGNhcmQpOworCQkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJCWlvdW5tYXAoY2FyZC0+Y3RsbWVtKTsKKwkJCWlvdW5tYXAoY2FyZC0+bWVtKTsKKwkJCWtmcmVlKGNhcmQpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJY2FyZC0+dHhfZG1hX2hhbmRsZV9ob3N0ID0KKwkJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KGNhcmQtPmRldmljZSwgRlNUX01BWF9NVFUsCisJCQkJCSAmY2FyZC0+dHhfZG1hX2hhbmRsZV9jYXJkKTsKKwkJaWYgKGNhcmQtPnR4X2RtYV9oYW5kbGVfaG9zdCA9PSBOVUxMKSB7CisJCQlwcmludGtfZXJyKCJDb3VsZCBub3QgYWxsb2NhdGUgdHggZG1hIGJ1ZmZlclxuIik7CisJCQlmc3RfZGlzYWJsZV9pbnRyKGNhcmQpOworCQkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJCWlvdW5tYXAoY2FyZC0+Y3RsbWVtKTsKKwkJCWlvdW5tYXAoY2FyZC0+bWVtKTsKKwkJCWtmcmVlKGNhcmQpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisJcmV0dXJuIDA7CQkvKiBTdWNjZXNzICovCit9CisKKy8qCisgKiAgICAgIENsZWFudXAgYW5kIGNsb3NlIGRvd24gYSBjYXJkCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdAorZnN0X3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQ7CisJaW50IGk7CisKKwljYXJkID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJZm9yIChpID0gMDsgaSA8IGNhcmQtPm5wb3J0czsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwb3J0X3RvX2RldigmY2FyZC0+cG9ydHNbaV0pOworCQl1bnJlZ2lzdGVyX2hkbGNfZGV2aWNlKGRldik7CisJfQorCisJZnN0X2Rpc2FibGVfaW50cihjYXJkKTsKKwlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOworCisJaW91bm1hcChjYXJkLT5jdGxtZW0pOworCWlvdW5tYXAoY2FyZC0+bWVtKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCWlmIChjYXJkLT5mYW1pbHkgPT0gRlNUX0ZBTUlMWV9UWFUpIHsKKwkJLyoKKwkJICogRnJlZSBkbWEgYnVmZmVycworCQkgKi8KKwkJcGNpX2ZyZWVfY29uc2lzdGVudChjYXJkLT5kZXZpY2UsIEZTVF9NQVhfTVRVLAorCQkJCSAgICBjYXJkLT5yeF9kbWFfaGFuZGxlX2hvc3QsCisJCQkJICAgIGNhcmQtPnJ4X2RtYV9oYW5kbGVfY2FyZCk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoY2FyZC0+ZGV2aWNlLCBGU1RfTUFYX01UVSwKKwkJCQkgICAgY2FyZC0+dHhfZG1hX2hhbmRsZV9ob3N0LAorCQkJCSAgICBjYXJkLT50eF9kbWFfaGFuZGxlX2NhcmQpOworCX0KKwlmc3RfY2FyZF9hcnJheVtjYXJkLT5jYXJkX25vXSA9IE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBmc3RfZHJpdmVyID0geworICAgICAgICAubmFtZQkJPSBGU1RfTkFNRSwKKyAgICAgICAgLmlkX3RhYmxlCT0gZnN0X3BjaV9kZXZfaWQsCisgICAgICAgIC5wcm9iZQkJPSBmc3RfYWRkX29uZSwKKyAgICAgICAgLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKGZzdF9yZW1vdmVfb25lKSwKKyAgICAgICAgLnN1c3BlbmQJPSBOVUxMLAorICAgICAgICAucmVzdW1lCT0gTlVMTCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0Citmc3RfaW5pdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEZTVF9NQVhfQ0FSRFM7IGkrKykKKwkJZnN0X2NhcmRfYXJyYXlbaV0gPSBOVUxMOworCXNwaW5fbG9ja19pbml0KCZmc3Rfd29ya19xX2xvY2spOworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmZzdF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2ZzdF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXByaW50a19pbmZvKCJGYXJTeW5jIFdBTiBkcml2ZXIgdW5sb2FkaW5nXG4iKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmZzdF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChmc3RfaW5pdCk7Cittb2R1bGVfZXhpdChmc3RfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuaCBiL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg3MWRhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmgKQEAgLTAsMCArMSwzNTcgQEAKKy8qCisgKiAgICAgIEZhclN5bmMgWDIxIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiAgICAgIEFjdHVhbGx5IHN5bmMgZHJpdmVyIGZvciBYLjIxLCBWLjM1IGFuZCBWLjI0IG9uIEZhclN5bmMgVC1zZXJpZXMgY2FyZHMKKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMjAwMSBGYXJTaXRlIENvbW11bmljYXRpb25zIEx0ZC4KKyAqICAgICAgd3d3LmZhcnNpdGUuY28udWsKKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBBdXRob3I6IFIuSi5EdW5sb3AgICAgICA8Ym9iLmR1bmxvcEBmYXJzaXRlLmNvLnVrPgorICoKKyAqICAgICAgRm9yIHRoZSBtb3N0IHBhcnQgdGhpcyBmaWxlIG9ubHkgY29udGFpbnMgc3RydWN0dXJlcyBhbmQgaW5mb3JtYXRpb24KKyAqICAgICAgdGhhdCBpcyB2aXNpYmxlIHRvIGFwcGxpY2F0aW9ucyBvdXRzaWRlIHRoZSBkcml2ZXIuIFNoYXJlZCBtZW1vcnkKKyAqICAgICAgbGF5b3V0IGV0YyBpcyBpbnRlcm5hbCB0byB0aGUgZHJpdmVyIGFuZCBkZXNjcmliZWQgd2l0aGluIGZhcnN5bmMuYy4KKyAqICAgICAgT3ZlcmxhcCBleGlzdHMgaW4gdGhhdCB0aGUgdmFsdWVzIHVzZWQgZm9yIHNvbWUgZmllbGRzIHdpdGhpbiB0aGUKKyAqICAgICAgaW9jdGwgaW50ZXJmYWNlIGV4dGVuZCBpbnRvIHRoZSBjYXJkcyBmaXJtd2FyZSBpbnRlcmZhY2Ugc28gdmFsdWVzIGluCisgKiAgICAgIHRoaXMgZmlsZSBtYXkgbm90IGJlIGNoYW5nZWQgYXJiaXRyYXJpbHkuCisgKi8KKworLyogICAgICBXaGF0J3MgaW4gYSBuYW1lCisgKgorICogICAgICBUaGUgcHJvamVjdCBuYW1lIGZvciB0aGlzIGRyaXZlciBpcyBPc2Nhci4gVGhlIGRyaXZlciBpcyBpbnRlbmRlZCB0byBiZQorICogICAgICB1c2VkIHdpdGggdGhlIEZhclNpdGUgVC1TZXJpZXMgY2FyZHMgKFQyUCAmIFQ0UCkgcnVubmluZyBpbiB0aGUgaGlnaAorICogICAgICBzcGVlZCBmcmFtZSBzaGlmdGVyIG1vZGUuIFRoaXMgaXMgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIFguMjEgbW9kZQorICogICAgICB3aGljaCBpcyBhIGNvbXBsZXRlIG1pc25vbWVyIGFzIHRoZSBjYXJkIGNvbnRpbnVlcyB0byBzdXBwb3J0IFYuMjQgYW5kCisgKiAgICAgIFYuMzUgYXMgd2VsbCBhcyBYLjIxLgorICoKKyAqICAgICAgQSBzaG9ydCBjb21tb24gcHJlZml4IGlzIHVzZWZ1bCBmb3Igcm91dGluZXMgd2l0aGluIHRoZSBkcml2ZXIgdG8gYXZvaWQKKyAqICAgICAgY29uZmxpY3Qgd2l0aCBvdGhlciBzaW1pbGFyIGRyaXZlcnMgYW5kIEkgY2hvc2VuIHRvIHVzZSAiZnN0XyIgZm9yIHRoaXMKKyAqICAgICAgcHVycG9zZSAoRmFyU2l0ZSBULXNlcmllcykuCisgKgorICogICAgICBGaW5hbGx5IHRoZSBkZXZpY2UgZHJpdmVyIG5lZWRzIGEgc2hvcnQgbmV0d29yayBpbnRlcmZhY2UgbmFtZS4gU2luY2UKKyAqICAgICAgImhkbGMiIGlzIGFscmVhZHkgaW4gdXNlIEkndmUgY2hvc2VuIHRoZSBldmVuIGxlc3MgaW5mb3JtYXRpdmUgInN5bmMiCisgKiAgICAgIGZvciB0aGUgcHJlc2VudC4KKyAqLworI2RlZmluZSBGU1RfTkFNRSAgICAgICAgICAgICAgICAiZnN0IiAgICAgICAgICAgLyogSW4gZGVidWcvaW5mbyBldGMgKi8KKyNkZWZpbmUgRlNUX05ERVZfTkFNRSAgICAgICAgICAgInN5bmMiICAgICAgICAgIC8qIEZvciBuZXQgaW50ZXJmYWNlICovCisjZGVmaW5lIEZTVF9ERVZfTkFNRSAgICAgICAgICAgICJmYXJzeW5jIiAgICAgICAvKiBGb3IgbWlzYyBpbnRlcmZhY2VzICovCisKKworLyogICAgICBVc2VyIHZlcnNpb24gbnVtYmVyCisgKgorICogICAgICBUaGlzIHZlcnNpb24gbnVtYmVyIGlzIGluY3JlbWVudGVkIHdpdGggZWFjaCBvZmZpY2lhbCByZWxlYXNlIG9mIHRoZQorICogICAgICBwYWNrYWdlIGFuZCBpcyBhIHNpbXBsaWZpZWQgbnVtYmVyIGZvciBub3JtYWwgdXNlciByZWZlcmVuY2UuCisgKiAgICAgIEluZGl2aWR1YWwgZmlsZXMgYXJlIHRyYWNrZWQgYnkgdGhlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gYW5kIG1heQorICogICAgICBoYXZlIGluZGl2aWR1YWwgdmVyc2lvbnMgKG9yIElEcykgdGhhdCBtb3ZlIG11Y2ggZmFzdGVyIHRoYW4gdGhlCisgKiAgICAgIHRoZSByZWxlYXNlIHZlcnNpb24gYXMgaW5kaXZpZHVhbCB1cGRhdGVzIGFyZSB0cmFja2VkLgorICovCisjZGVmaW5lIEZTVF9VU0VSX1ZFUlNJT04gICAgICAgICIxLjA0IgorCisKKy8qICAgICAgSW9jdGwgY2FsbCBjb21tYW5kIHZhbHVlcworICoKKyAqICAgICAgVGhlIGZpcnN0IHRocmVlIHByaXZhdGUgaW9jdGxzIGFyZSB1c2VkIGJ5IHRoZSBzeW5jLVBQUCBtb2R1bGUsCisgKiAgICAgIGFsbG93aW5nIGEgbGl0dGxlIHJvb20gZm9yIGV4cGFuc2lvbiB3ZSBzdGFydCBvdXIgbnVtYmVyaW5nIGF0IDEwLgorICovCisjZGVmaW5lIEZTVFdSSVRFICAgICAgICAoU0lPQ0RFVlBSSVZBVEUrMTApCisjZGVmaW5lIEZTVENQVVJFU0VUICAgICAoU0lPQ0RFVlBSSVZBVEUrMTEpCisjZGVmaW5lIEZTVENQVVJFTEVBU0UgICAoU0lPQ0RFVlBSSVZBVEUrMTIpCisjZGVmaW5lIEZTVEdFVENPTkYgICAgICAoU0lPQ0RFVlBSSVZBVEUrMTMpCisjZGVmaW5lIEZTVFNFVENPTkYgICAgICAoU0lPQ0RFVlBSSVZBVEUrMTQpCisKKworLyogICAgICBGU1RXUklURQorICoKKyAqICAgICAgVXNlZCB0byB3cml0ZSBhIGJsb2NrIG9mIGRhdGEgKGZpcm13YXJlIGV0YykgYmVmb3JlIHRoZSBjYXJkIGlzIHJ1bm5pbmcKKyAqLworc3RydWN0IGZzdGlvY193cml0ZSB7CisgICAgICAgIHVuc2lnbmVkIGludCAgc2l6ZTsKKyAgICAgICAgdW5zaWduZWQgaW50ICBvZmZzZXQ7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgZGF0YVswXTsKK307CisKKworLyogICAgICBGU1RDUFVSRVNFVCBhbmQgRlNUQ1BVUkVMRUFTRQorICoKKyAqICAgICAgVGhlc2UgdGFrZSBubyBhZGRpdGlvbmFsIGRhdGEuCisgKiAgICAgIEZTVENQVVJFU0VUIGZvcmNlcyB0aGUgY2FyZHMgQ1BVIGludG8gYSByZXNldCBzdGF0ZSBhbmQgaG9sZHMgaXQgdGhlcmUuCisgKiAgICAgIEZTVENQVVJFTEVBU0UgcmVsZWFzZXMgdGhlIENQVSBmcm9tIHRoaXMgcmVzZXQgc3RhdGUgYWxsb3dpbmcgaXQgdG8gcnVuLAorICogICAgICB0aGUgcmVzZXQgdmVjdG9yIHNob3VsZCBiZSBzZXR1cCBiZWZvcmUgdGhpcyBpb2N0bCBpcyBydW4uCisgKi8KKworLyogICAgICBGU1RHRVRDT05GIGFuZCBGU1RTRVRDT05GCisgKgorICogICAgICBHZXQgYW5kIHNldCBhIGNhcmQvcG9ydHMgY29uZmlndXJhdGlvbi4KKyAqICAgICAgSW4gb3JkZXIgdG8gYWxsb3cgc2VsZWN0aXZlIHNldHRpbmcgb2YgaXRlbXMgYW5kIGZvciB0aGUga2VybmVsIHRvCisgKiAgICAgIGluZGljYXRlIGEgcGFydGlhbCBzdGF0dXMgcmVzcG9uc2UgdGhlIGZpcnN0IGZpZWxkICJ2YWxpZCIgaXMgYSBiaXRtYXNrCisgKiAgICAgIGluZGljYXRpbmcgd2hpY2ggb3RoZXIgZmllbGRzIGluIHRoZSBzdHJ1Y3R1cmUgYXJlIHZhbGlkLgorICogICAgICBNYW55IG9mIHRoZSBmaWVsZCBuYW1lcyBpbiB0aGlzIHN0cnVjdHVyZSBtYXRjaCB0aG9zZSB1c2VkIGluIHRoZQorICogICAgICBmaXJtd2FyZSBzaGFyZWQgbWVtb3J5IGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGFuZCBjb21lIG9yaWdpbmFsbHkgZnJvbQorICogICAgICB0aGUgTlQgaGVhZGVyIGZpbGUgU21jLmgKKyAqCisgKiAgICAgIFdoZW4gdXNlZCB3aXRoIEZTVEdFVENPTkYgdGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIHplcm9lZCBiZWZvcmUgdXNlLgorICogICAgICBUaGlzIGlzIHRvIGFsbG93IGZvciBwb3NzaWJsZSBmdXR1cmUgZXhwYW5zaW9uIHdoZW4gc29tZSBvZiB0aGUgZmllbGRzCisgKiAgICAgIG1pZ2h0IGJlIHVzZWQgdG8gaW5kaWNhdGUgYSBkaWZmZXJlbnQgKGV4cGFuZGVkKSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBmc3Rpb2NfaW5mbyB7CisgICAgICAgIHVuc2lnbmVkIGludCAgIHZhbGlkOyAgICAgICAgICAgLyogQml0cyBvZiBzdHJ1Y3R1cmUgdGhhdCBhcmUgdmFsaWQgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgbnBvcnRzOyAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2VyaWFsIHBvcnRzICovCisgICAgICAgIHVuc2lnbmVkIGludCAgIHR5cGU7ICAgICAgICAgICAgLyogVHlwZSBpbmRleCBvZiBjYXJkICovCisgICAgICAgIHVuc2lnbmVkIGludCAgIHN0YXRlOyAgICAgICAgICAgLyogU3RhdGUgb2YgY2FyZCAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICBpbmRleDsgICAgICAgICAgIC8qIEluZGV4IG9mIHBvcnQgaW9jdGwgd2FzIGlzc3VlZCBvbiAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICBzbWNGaXJtd2FyZVZlcnNpb247CisgICAgICAgIHVuc2lnbmVkIGxvbmcgIGtlcm5lbFZlcnNpb247ICAgLyogV2hhdCBLZXJuZWwgdmVyc2lvbiB3ZSBhcmUgd29ya2luZyB3aXRoICovCisgICAgICAgIHVuc2lnbmVkIHNob3J0IGxpbmVJbnRlcmZhY2U7ICAgLyogUGh5c2ljYWwgaW50ZXJmYWNlIHR5cGUgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgcHJvdG87ICAgICAgICAgICAvKiBMaW5lIHByb3RvY29sICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgIGludGVybmFsQ2xvY2s7ICAgLyogMSA9PiBpbnRlcm5hbCBjbG9jaywgMCA9PiBleHRlcm5hbCAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICBsaW5lU3BlZWQ7ICAgICAgIC8qIFNwZWVkIGluIGJwcyAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICB2MjRJcFN0czsgICAgICAgIC8qIFYuMjQgY29udHJvbCBpbnB1dCBzdGF0dXMgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgdjI0T3BTdHM7ICAgICAgICAvKiBWLjI0IGNvbnRyb2wgb3V0cHV0IHN0YXR1cyAqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCBjbG9ja1N0YXR1czsgICAgIC8qIGxzYjogMD0+IHByZXNlbnQsIDE9PiBhYnNlbnQgKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgY2FibGVTdGF0dXM7ICAgICAvKiBsc2I6IDA9PiBwcmVzZW50LCAxPT4gYWJzZW50ICovCisgICAgICAgIHVuc2lnbmVkIHNob3J0IGNhcmRNb2RlOyAgICAgICAgLyogbHNiOiBMRUQgaWQgbW9kZSAqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCBkZWJ1ZzsgICAgICAgICAgIC8qIERlYnVnIGZsYWdzICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgIHRyYW5zcGFyZW50TW9kZTsgLyogTm90IHVzZWQgYWx3YXlzIDAgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgaW52ZXJ0Q2xvY2s7ICAgICAvKiBJbnZlcnQgY2xvY2sgZmVhdHVyZSBmb3Igc3luY2luZyAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBzdGFydGluZ1Nsb3Q7ICAgIC8qIFRpbWUgc2xvdCB0byB1c2UgZm9yIHN0YXJ0IG9mIHR4ICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgIGNsb2NrU291cmNlOyAgICAgLyogRXh0ZXJuYWwgb3IgaW50ZXJuYWwgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgZnJhbWluZzsgICAgICAgICAvKiBFMSwgVDEgb3IgSjEgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgc3RydWN0dXJlOyAgICAgICAvKiB1bmZyYW1lZCwgZG91YmxlLCBjcmM0LCBmNCwgZjEyLCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGYyNCBmNzIgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgaW50ZXJmYWNlOyAgICAgICAvKiByajQ4YyBvciBibmMgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgY29kaW5nOyAgICAgICAgICAvKiBoZGIzIGI4enMgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgbGluZUJ1aWxkT3V0OyAgICAvKiAwLCAtNy41LCAtMTUsIC0yMiAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBlcXVhbGl6ZXI7ICAgICAgIC8qIHNob3J0IG9yIGxvbiBoYXVsIHNldHRpbmdzICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgIGxvb3BNb2RlOyAgICAgICAgLyogdmFyaW91cyBsb29wYmFja3MgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgcmFuZ2U7ICAgICAgICAgICAvKiBjYWJsZSBsZW5ndGhzICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgIHR4QnVmZmVyTW9kZTsgICAgLyogdHggZWxhc3RpYyBidWZmZXIgZGVwdGggKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgcnhCdWZmZXJNb2RlOyAgICAvKiByeCBlbGFzdGljIGJ1ZmZlciBkZXB0aCAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBsb3NUaHJlc2hvbGQ7ICAgIC8qIEF0dGVudWF0aW9uIG9uIExPUyBzaWduYWwgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgaWRsZUNvZGU7ICAgICAgICAvKiBWYWx1ZSB0byBzZW5kIGFzIGlkbGUgdGltZXNsb3QgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgcmVjZWl2ZUJ1ZmZlckRlbGF5OyAvKiBkZWxheSB0aHJvIHJ4IGJ1ZmZlciB0aW1lc2xvdHMgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgZnJhbWluZ0Vycm9yQ291bnQ7IC8qIGZyYW1pbmcgZXJyb3JzICovCisgICAgICAgIHVuc2lnbmVkIGludCAgIGNvZGVWaW9sYXRpb25Db3VudDsgLyogY29kZSB2aW9sYXRpb25zICovCisgICAgICAgIHVuc2lnbmVkIGludCAgIGNyY0Vycm9yQ291bnQ7ICAgLyogQ1JDIGVycm9ycyAqLworICAgICAgICBpbnQgICAgICAgICAgICBsaW5lQXR0ZW51YXRpb247IC8qIGluIGRCKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgbG9zc09mU2lnbmFsOworICAgICAgICB1bnNpZ25lZCBzaG9ydCByZWNlaXZlUmVtb3RlQWxhcm07CisgICAgICAgIHVuc2lnbmVkIHNob3J0IGFsYXJtSW5kaWNhdGlvblNpZ25hbDsKK307CisKKy8qICJ2YWxpZCIgYml0bWFzayAqLworI2RlZmluZSBGU1RWQUxfTk9ORSAgICAgMHgwMDAwMDAwMCAgICAgIC8qIE5vdGhpbmcgdmFsaWQgKGZpcm13YXJlIG5vdCBydW5uaW5nKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBTbGlnaHQgbWlzbm9tZXIuIEluIGZhY3QgbnBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHR5cGUsIHN0YXRlIGFuZCBpbmRleCB3aWxsIGJlIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJhc2VkIG9uIGhhcmR3YXJlIGRldGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGU1RWQUxfT01PREVNICAgMHgwMDAwMDAxRiAgICAgIC8qIEZpcnN0IDUgYml0cyBjb3JyZXNwb25kIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG91dHB1dCBzdGF0dXMgYml0cyBkZWZpbmVkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHYyNE9wU3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZTVFZBTF9TUEVFRCAgICAweDAwMDAwMDIwICAgICAgLyogaW50ZXJuYWxDbG9jaywgbGluZVNwZWVkLCBjbG9ja1N0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGU1RWQUxfQ0FCTEUgICAgMHgwMDAwMDA0MCAgICAgIC8qIGxpbmVJbnRlcmZhY2UsIGNhYmxlU3RhdHVzICovCisjZGVmaW5lIEZTVFZBTF9JTU9ERU0gICAweDAwMDAwMDgwICAgICAgLyogdjI0SXBTdHMgKi8KKyNkZWZpbmUgRlNUVkFMX0NBUkQgICAgIDB4MDAwMDAxMDAgICAgICAvKiBucG9ydHMsIHR5cGUsIHN0YXRlLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzbWNGaXJtd2FyZVZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlNUVkFMX1BST1RPICAgIDB4MDAwMDAyMDAgICAgICAvKiBwcm90byAqLworI2RlZmluZSBGU1RWQUxfTU9ERSAgICAgMHgwMDAwMDQwMCAgICAgIC8qIGNhcmRNb2RlICovCisjZGVmaW5lIEZTVFZBTF9QSEFTRSAgICAweDAwMDAwODAwICAgICAgLyogQ2xvY2sgcGhhc2UgKi8KKyNkZWZpbmUgRlNUVkFMX1RFMSAgICAgIDB4MDAwMDEwMDAgICAgICAvKiBUMUUxIENvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgRlNUVkFMX0RFQlVHICAgIDB4ODAwMDAwMDAgICAgICAvKiBkZWJ1ZyAqLworI2RlZmluZSBGU1RWQUxfQUxMICAgICAgMHgwMDAwMUZGRiAgICAgIC8qIE5vdGU6IGRvZXMgbm90IGluY2x1ZGUgREVCVUcgZmxhZyAqLworCisvKiAidHlwZSIgKi8KKyNkZWZpbmUgRlNUX1RZUEVfTk9ORSAgIDAgICAgICAgICAgICAgICAvKiBQcm9iYWJseSBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisjZGVmaW5lIEZTVF9UWVBFX1QyUCAgICAxICAgICAgICAgICAgICAgLyogVDJQIFgyMSAyIHBvcnQgY2FyZCAqLworI2RlZmluZSBGU1RfVFlQRV9UNFAgICAgMiAgICAgICAgICAgICAgIC8qIFQ0UCBYMjEgNCBwb3J0IGNhcmQgKi8KKyNkZWZpbmUgRlNUX1RZUEVfVDFVICAgIDMgICAgICAgICAgICAgICAvKiBUMVUgWDIxIDEgcG9ydCBjYXJkICovCisjZGVmaW5lIEZTVF9UWVBFX1QyVSAgICA0ICAgICAgICAgICAgICAgLyogVDJVIFgyMSAyIHBvcnQgY2FyZCAqLworI2RlZmluZSBGU1RfVFlQRV9UNFUgICAgNSAgICAgICAgICAgICAgIC8qIFQ0VSBYMjEgNCBwb3J0IGNhcmQgKi8KKyNkZWZpbmUgRlNUX1RZUEVfVEUxICAgIDYgICAgICAgICAgICAgICAvKiBUMUUxIFgyMSAxIHBvcnQgY2FyZCAqLworCisvKiAiZmFtaWx5IiAqLworI2RlZmluZSBGU1RfRkFNSUxZX1RYUCAgMCAgICAgICAgICAgICAgIC8qIFQyUCBvciBUNFAgKi8KKyNkZWZpbmUgRlNUX0ZBTUlMWV9UWFUgIDEgICAgICAgICAgICAgICAvKiBUMVUgb3IgVDJVIG9yIFQ0VSAqLworCisvKiAic3RhdGUiICovCisjZGVmaW5lIEZTVF9VTklOSVQgICAgICAwICAgICAgICAgICAgICAgLyogUmF3IHVuaW5pdGlhbGlzZWQgc3RhdGUgZm9sbG93aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3lzdGVtIHN0YXJ0dXAgKi8KKyNkZWZpbmUgRlNUX1JFU0VUICAgICAgIDEgICAgICAgICAgICAgICAvKiBQcm9jZXNzb3IgaGVsZCBpbiByZXNldCBzdGF0ZSAqLworI2RlZmluZSBGU1RfRE9XTkxPQUQgICAgMiAgICAgICAgICAgICAgIC8qIENhcmQgYmVpbmcgZG93bmxvYWRlZCAqLworI2RlZmluZSBGU1RfU1RBUlRJTkcgICAgMyAgICAgICAgICAgICAgIC8qIFJlbGVhc2VkIGZvbGxvd2luZyBkb3dubG9hZCAqLworI2RlZmluZSBGU1RfUlVOTklORyAgICAgNCAgICAgICAgICAgICAgIC8qIFByb2Nlc3NvciBydW5uaW5nICovCisjZGVmaW5lIEZTVF9CQURWRVJTSU9OICA1ICAgICAgICAgICAgICAgLyogQmFkIHNoYXJlZCBtZW1vcnkgdmVyc2lvbiBkZXRlY3RlZCAqLworI2RlZmluZSBGU1RfSEFMVEVEICAgICAgNiAgICAgICAgICAgICAgIC8qIFByb2Nlc3NvciBmbGFnZ2VkIGEgaGFsdCAqLworI2RlZmluZSBGU1RfSUZBSUxFRCAgICAgNyAgICAgICAgICAgICAgIC8qIEZpcm13YXJlIGlzc3VlZCBpbml0aWFsaXNhdGlvbiBmYWlsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbnRlcnJ1cHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICJsaW5lSW50ZXJmYWNlIiAqLworI2RlZmluZSBWMjQgICAgICAgICAgICAgMQorI2RlZmluZSBYMjEgICAgICAgICAgICAgMgorI2RlZmluZSBWMzUgICAgICAgICAgICAgMworI2RlZmluZSBYMjFEICAgICAgICAgICAgNAorI2RlZmluZSBUMSAgICAgICAgICAgICAgNQorI2RlZmluZSBFMSAgICAgICAgICAgICAgNgorI2RlZmluZSBKMSAgICAgICAgICAgICAgNworCisvKiAicHJvdG8iICovCisjZGVmaW5lIEZTVF9IRExDICAgICAgICAxICAgICAgICAgICAgICAgLyogQ2lzY28gY29tcGF0aWJsZSBIRExDICovCisjZGVmaW5lIEZTVF9QUFAgICAgICAgICAyICAgICAgICAgICAgICAgLyogU3luYyBQUFAgKi8KKyNkZWZpbmUgRlNUX01PTklUT1IgICAgIDMgICAgICAgICAgICAgICAvKiBNb25pdG9yIG9ubHkgKHJhdyBwYWNrZXQgcmVjZXB0aW9uKSAqLworI2RlZmluZSBGU1RfUkFXICAgICAgICAgNCAgICAgICAgICAgICAgIC8qIFR3byB3YXkgcmF3IHBhY2tldHMgKi8KKyNkZWZpbmUgRlNUX0dFTl9IRExDICAgIDUgICAgICAgICAgICAgICAvKiBVc2luZyAiR2VuZXJpYyBIRExDIiBtb2R1bGUgKi8KKworLyogImludGVybmFsQ2xvY2siICovCisjZGVmaW5lIElOVENMSyAgICAgICAgICAxCisjZGVmaW5lIEVYVENMSyAgICAgICAgICAwCisKKy8qICJ2MjRJcFN0cyIgYml0bWFzayAqLworI2RlZmluZSBJUFNUU19DVFMgICAgICAgMHgwMDAwMDAwMSAgICAgIC8qIENsZWFyIFRvIFNlbmQgKEluZGljYXRlIGZvciBYLjIxKSAqLworI2RlZmluZSBJUFNUU19JTkRJQ0FURSAgSVBTVFNfQ1RTCisjZGVmaW5lIElQU1RTX0RTUiAgICAgICAweDAwMDAwMDAyICAgICAgLyogRGF0YSBTZXQgUmVhZHkgKFQyUCBQb3J0IEEpICovCisjZGVmaW5lIElQU1RTX0RDRCAgICAgICAweDAwMDAwMDA0ICAgICAgLyogRGF0YSBDYXJyaWVyIERldGVjdCAqLworI2RlZmluZSBJUFNUU19SSSAgICAgICAgMHgwMDAwMDAwOCAgICAgIC8qIFJpbmcgSW5kaWNhdG9yIChUMlAgUG9ydCBBKSAqLworI2RlZmluZSBJUFNUU19UTUkgICAgICAgMHgwMDAwMDAxMCAgICAgIC8qIFRlc3QgTW9kZSBJbmRpY2F0b3IgKE5vdCBTdXBwb3J0ZWQpKi8KKworLyogInYyNE9wU3RzIiBiaXRtYXNrICovCisjZGVmaW5lIE9QU1RTX1JUUyAgICAgICAweDAwMDAwMDAxICAgICAgLyogUmVxdWVzdCBUbyBTZW5kIChDb250cm9sIGZvciBYLjIxKSAqLworI2RlZmluZSBPUFNUU19DT05UUk9MICAgT1BTVFNfUlRTCisjZGVmaW5lIE9QU1RTX0RUUiAgICAgICAweDAwMDAwMDAyICAgICAgLyogRGF0YSBUZXJtaW5hbCBSZWFkeSAqLworI2RlZmluZSBPUFNUU19EU1JTICAgICAgMHgwMDAwMDAwNCAgICAgIC8qIERhdGEgU2lnbmFsbGluZyBSYXRlIFNlbGVjdCAoTm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU3VwcG9ydGVkKSAqLworI2RlZmluZSBPUFNUU19TUyAgICAgICAgMHgwMDAwMDAwOCAgICAgIC8qIFNlbGVjdCBTdGFuZGJ5IChOb3QgU3VwcG9ydGVkKSAqLworI2RlZmluZSBPUFNUU19MTCAgICAgICAgMHgwMDAwMDAxMCAgICAgIC8qIE1haW50ZW5hbmNlIFRlc3QgKE5vdCBTdXBwb3J0ZWQpICovCisKKy8qICJjYXJkTW9kZSIgYml0bWFzayAqLworI2RlZmluZSBDQVJEX01PREVfSURFTlRJRlkgICAgICAweDAwMDEKKworLyogCisgKiBDb25zdGFudHMgZm9yIFQxL0UxIGNvbmZpZ3VyYXRpb24KKyAqLworCisvKgorICogQ2xvY2sgc291cmNlCisgKi8KKyNkZWZpbmUgQ0xPQ0tJTkdfU0xBVkUgICAgICAgMAorI2RlZmluZSBDTE9DS0lOR19NQVNURVIgICAgICAxCisKKy8qCisgKiBGcmFtaW5nCisgKi8KKyNkZWZpbmUgRlJBTUlOR19FMSAgICAgICAgICAgMAorI2RlZmluZSBGUkFNSU5HX0oxICAgICAgICAgICAxCisjZGVmaW5lIEZSQU1JTkdfVDEgICAgICAgICAgIDIKKworLyoKKyAqIFN0cnVjdHVyZQorICovCisjZGVmaW5lIFNUUlVDVFVSRV9VTkZSQU1FRCAgIDAKKyNkZWZpbmUgU1RSVUNUVVJFX0UxX0RPVUJMRSAgMQorI2RlZmluZSBTVFJVQ1RVUkVfRTFfQ1JDNCAgICAyCisjZGVmaW5lIFNUUlVDVFVSRV9FMV9DUkM0TSAgIDMKKyNkZWZpbmUgU1RSVUNUVVJFX1QxXzQgICAgICAgNAorI2RlZmluZSBTVFJVQ1RVUkVfVDFfMTIgICAgICA1CisjZGVmaW5lIFNUUlVDVFVSRV9UMV8yNCAgICAgIDYKKyNkZWZpbmUgU1RSVUNUVVJFX1QxXzcyICAgICAgNworCisvKgorICogSW50ZXJmYWNlCisgKi8KKyNkZWZpbmUgSU5URVJGQUNFX1JKNDhDICAgICAgMAorI2RlZmluZSBJTlRFUkZBQ0VfQk5DICAgICAgICAxCisKKy8qCisgKiBDb2RpbmcKKyAqLworCisjZGVmaW5lIENPRElOR19IREIzICAgICAgICAgIDAKKyNkZWZpbmUgQ09ESU5HX05SWiAgICAgICAgICAgMQorI2RlZmluZSBDT0RJTkdfQ01JICAgICAgICAgICAyCisjZGVmaW5lIENPRElOR19DTUlfSERCMyAgICAgIDMKKyNkZWZpbmUgQ09ESU5HX0NNSV9COFpTICAgICAgNAorI2RlZmluZSBDT0RJTkdfQU1JICAgICAgICAgICA1CisjZGVmaW5lIENPRElOR19BTUlfWkNTICAgICAgIDYKKyNkZWZpbmUgQ09ESU5HX0I4WlMgICAgICAgICAgNworCisvKgorICogTGluZSBCdWlsZCBPdXQKKyAqLworI2RlZmluZSBMQk9fMGRCICAgICAgICAgICAgICAwCisjZGVmaW5lIExCT183ZEI1ICAgICAgICAgICAgIDEKKyNkZWZpbmUgTEJPXzE1ZEIgICAgICAgICAgICAgMgorI2RlZmluZSBMQk9fMjJkQjUgICAgICAgICAgICAzCisKKy8qCisgKiBSYW5nZSBmb3IgbG9uZyBoYXVsIHQxID4gNjU1ZnQKKyAqLworI2RlZmluZSBSQU5HRV8wXzEzM19GVCAgICAgICAwCisjZGVmaW5lIFJBTkdFXzBfNDBfTSAgICAgICAgIFJBTkdFXzBfMTMzX0ZUCisjZGVmaW5lIFJBTkdFXzEzM18yNjZfRlQgICAgIDEKKyNkZWZpbmUgUkFOR0VfNDBfODFfTSAgICAgICAgUkFOR0VfMTMzXzI2Nl9GVAorI2RlZmluZSBSQU5HRV8yNjZfMzk5X0ZUICAgICAyCisjZGVmaW5lIFJBTkdFXzgxXzEyMl9NICAgICAgIFJBTkdFXzI2Nl8zOTlfRlQKKyNkZWZpbmUgUkFOR0VfMzk5XzUzM19GVCAgICAgMworI2RlZmluZSBSQU5HRV8xMjJfMTYyX00gICAgICAgUkFOR0VfMzk5XzUzM19GVAorI2RlZmluZSBSQU5HRV81MzNfNjU1X0ZUICAgICA0CisjZGVmaW5lIFJBTkdFXzE2Ml8yMDBfTSAgICAgIFJBTkdFXzUzM182NTVfRlQKKy8qCisgKiBSZWNlaXZlIEVxdWFsaXNlcgorICovCisjZGVmaW5lIEVRVUFMSVpFUl9TSE9SVCAgICAgIDAKKyNkZWZpbmUgRVFVQUxJWkVSX0xPTkcgICAgICAgMQorCisvKgorICogTG9vcCBtb2RlcworICovCisjZGVmaW5lIExPT1BfTk9ORSAgICAgICAgICAgIDAKKyNkZWZpbmUgTE9PUF9MT0NBTCAgICAgICAgICAgMQorI2RlZmluZSBMT09QX1BBWUxPQURfRVhDX1RTMCAyCisjZGVmaW5lIExPT1BfUEFZTE9BRF9JTkNfVFMwIDMKKyNkZWZpbmUgTE9PUF9SRU1PVEUgICAgICAgICAgNAorCisvKgorICogQnVmZmVyIG1vZGVzCisgKi8KKyNkZWZpbmUgQlVGRkVSXzJfRlJBTUUgICAgICAgMAorI2RlZmluZSBCVUZGRVJfMV9GUkFNRSAgICAgICAxCisjZGVmaW5lIEJVRkZFUl85Nl9CSVQgICAgICAgIDIKKyNkZWZpbmUgQlVGRkVSX05PTkUgICAgICAgICAgMworCisvKiAgICAgIERlYnVnIHN1cHBvcnQKKyAqCisgKiAgICAgIFRoZXNlIHNob3VsZCBvbmx5IGJlIGVuYWJsZWQgZm9yIGRldmVsb3BtZW50IGtlcm5lbHMsIHByb2R1Y3Rpb24gY29kZQorICogICAgICBzaG91bGQgZGVmaW5lIEZTVF9ERUJVRz0wIGluIG9yZGVyIHRvIGV4Y2x1ZGUgdGhlIGNvZGUuCisgKiAgICAgIFNldHRpbmcgRlNUX0RFQlVHPTEgd2lsbCBpbmNsdWRlIGFsbCB0aGUgZGVidWcgY29kZSBidXQgaW4gYSBkaXNhYmxlZAorICogICAgICBzdGF0ZSwgdXNlIHRoZSBGU1RTRVRDT05GIGlvY3RsIHRvIGVuYWJsZSBzcGVjaWZpYyBkZWJ1ZyBhY3Rpb25zLCBvcgorICogICAgICBGU1RfREVCVUcgY2FuIGJlIHNldCB0byBwcmltZSB0aGUgZGVidWcgc2VsZWN0aW9uLgorICovCisjZGVmaW5lIEZTVF9ERUJVRyAgICAgICAweDAwMDAKKyNpZiBGU1RfREVCVUcKKworZXh0ZXJuIGludCBmc3RfZGVidWdfbWFzazsgICAgICAgICAgICAgIC8qIEJpdCBtYXNrIG9mIGFjdGlvbnMgdG8gZGVidWcsIGJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBsaXN0ZWQgYmVsb3cuIE5vdGU6IEJpdCAwIGlzIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0byB0cmlnZ2VyIHRoZSBpbmNsdXNpb24gb2YgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGNvZGUsIHdpdGhvdXQgZW5hYmxpbmcgYW55IGFjdGlvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERCR19JTklUICAgICAgICAweDAwMDIgICAgICAgICAgLyogQ2FyZCBkZXRlY3Rpb24gYW5kIGluaXRpYWxpc2F0aW9uICovCisjZGVmaW5lIERCR19PUEVOICAgICAgICAweDAwMDQgICAgICAgICAgLyogT3BlbiBhbmQgY2xvc2Ugc2VxdWVuY2VzICovCisjZGVmaW5lIERCR19QQ0kgICAgICAgICAweDAwMDggICAgICAgICAgLyogUENJIGNvbmZpZyBvcGVyYXRpb25zICovCisjZGVmaW5lIERCR19JT0NUTCAgICAgICAweDAwMTAgICAgICAgICAgLyogSW9jdGxzIGFuZCBvdGhlciBjb25maWcgKi8KKyNkZWZpbmUgREJHX0lOVFIgICAgICAgIDB4MDAyMCAgICAgICAgICAvKiBJbnRlcnJ1cHQgcm91dGluZXMgKGJlIGNhcmVmdWwpICovCisjZGVmaW5lIERCR19UWCAgICAgICAgICAweDAwNDAgICAgICAgICAgLyogUGFja2V0IHRyYW5zbWlzc2lvbiAqLworI2RlZmluZSBEQkdfUlggICAgICAgICAgMHgwMDgwICAgICAgICAgIC8qIFBhY2tldCByZWNlcHRpb24gKi8KKyNkZWZpbmUgREJHX0NNRCAgICAgICAgIDB4MDEwMCAgICAgICAgICAvKiBQb3J0IGNvbW1hbmQgaXNzdWluZyAqLworCisjZGVmaW5lIERCR19BU1MgICAgICAgICAweEZGRkYgICAgICAgICAgLyogQXNzZXJ0IGxpa2Ugc3RhdGVtZW50cy4gQ29kZSB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2hvdWxkIG5ldmVyIGJlIHJlYWNoZWQsIGlmIHlvdSBzZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvbmUgb2YgdGhlc2UgdGhlbiBJJ3ZlIGJlZW4gYW4gYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZW5kaWYgIC8qIEZTVF9ERUJVRyAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaGQ2NDU3MC5oIGIvZHJpdmVycy9uZXQvd2FuL2hkNjQ1NzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODM5NjYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2hkNjQ1NzAuaApAQCAtMCwwICsxLDI0MSBAQAorI2lmbmRlZiBfX0hENjQ1NzBfSAorI2RlZmluZSBfX0hENjQ1NzBfSAorCisvKiBTQ0EgSEQ2NDU3MCByZWdpc3RlciBkZWZpbml0aW9ucyAtIGFsbCBhZGRyZXNzZXMgZm9yIG1vZGUgMCAoODA4NiBNUFUpCisgICBhbmQgMSAoNjQxODAgTVBVKS4gRm9yIG1vZGVzIDIgYW5kIDMsIFhPUiB0aGUgYWRkcmVzcyB3aXRoIDB4MDEuCisKKyAgIFNvdXJjZTogSEQ2NDU3MCBTQ0EgVXNlcidzIE1hbnVhbAorKi8KKworCisKKy8qIFNDQSBDb250cm9sIFJlZ2lzdGVycyAqLworI2RlZmluZSBMUFIgICAgMHgwMAkJLyogTG93IFBvd2VyICovCisKKy8qIFdhaXQgY29udHJvbGxlciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUEFCUjAgIDB4MDIJCS8qIFBoeXNpY2FsIEFkZHJlc3MgQm91bmRhcnkgMCAqLworI2RlZmluZSBQQUJSMSAgMHgwMwkJLyogUGh5c2ljYWwgQWRkcmVzcyBCb3VuZGFyeSAxICovCisjZGVmaW5lIFdDUkwgICAweDA0CQkvKiBXYWl0IENvbnRyb2wgTCAqLworI2RlZmluZSBXQ1JNICAgMHgwNQkJLyogV2FpdCBDb250cm9sIE0gKi8KKyNkZWZpbmUgV0NSSCAgIDB4MDYJCS8qIFdhaXQgQ29udHJvbCBIICovCisKKyNkZWZpbmUgUENSICAgIDB4MDgJCS8qIERNQSBQcmlvcml0eSBDb250cm9sICovCisjZGVmaW5lIERNRVIgICAweDA5CQkvKiBETUEgTWFzdGVyIEVuYWJsZSAqLworCisKKy8qIEludGVycnVwdCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSVNSMCAgIDB4MTAJCS8qIEludGVycnVwdCBTdGF0dXMgMCAgKi8KKyNkZWZpbmUgSVNSMSAgIDB4MTEJCS8qIEludGVycnVwdCBTdGF0dXMgMSAgKi8KKyNkZWZpbmUgSVNSMiAgIDB4MTIJCS8qIEludGVycnVwdCBTdGF0dXMgMiAgKi8KKworI2RlZmluZSBJRVIwICAgMHgxNAkJLyogSW50ZXJydXB0IEVuYWJsZSAwICAqLworI2RlZmluZSBJRVIxICAgMHgxNQkJLyogSW50ZXJydXB0IEVuYWJsZSAxICAqLworI2RlZmluZSBJRVIyICAgMHgxNgkJLyogSW50ZXJydXB0IEVuYWJsZSAyICAqLworCisjZGVmaW5lIElUQ1IgICAweDE4CQkvKiBJbnRlcnJ1cHQgQ29udHJvbCAqLworI2RlZmluZSBJVlIgICAgMHgxQQkJLyogSW50ZXJydXB0IFZlY3RvciAqLworI2RlZmluZSBJTVZSICAgMHgxQwkJLyogSW50ZXJydXB0IE1vZGlmaWVkIFZlY3RvciAqLworCisKKworLyogTVNDSSBjaGFubmVsIChwb3J0KSAwIHJlZ2lzdGVycyAtIG9mZnNldCAweDIwCisgICBNU0NJIGNoYW5uZWwgKHBvcnQpIDEgcmVnaXN0ZXJzIC0gb2Zmc2V0IDB4NDAgKi8KKworI2RlZmluZSBNU0NJMF9PRkZTRVQgMHgyMAorI2RlZmluZSBNU0NJMV9PRkZTRVQgMHg0MAorCisjZGVmaW5lIFRSQkwgICAweDAwCQkvKiBUWC9SWCBidWZmZXIgTCAqLyAKKyNkZWZpbmUgVFJCSCAgIDB4MDEJCS8qIFRYL1JYIGJ1ZmZlciBIICovIAorI2RlZmluZSBTVDAgICAgMHgwMgkJLyogU3RhdHVzIDAgKi8KKyNkZWZpbmUgU1QxICAgIDB4MDMJCS8qIFN0YXR1cyAxICovCisjZGVmaW5lIFNUMiAgICAweDA0CQkvKiBTdGF0dXMgMiAqLworI2RlZmluZSBTVDMgICAgMHgwNQkJLyogU3RhdHVzIDMgKi8KKyNkZWZpbmUgRlNUICAgIDB4MDYJCS8qIEZyYW1lIFN0YXR1cyAgKi8KKyNkZWZpbmUgSUUwICAgIDB4MDgJCS8qIEludGVycnVwdCBFbmFibGUgMCAqLworI2RlZmluZSBJRTEgICAgMHgwOQkJLyogSW50ZXJydXB0IEVuYWJsZSAxICovCisjZGVmaW5lIElFMiAgICAweDBBCQkvKiBJbnRlcnJ1cHQgRW5hYmxlIDIgKi8KKyNkZWZpbmUgRklFICAgIDB4MEIJCS8qIEZyYW1lIEludGVycnVwdCBFbmFibGUgICovCisjZGVmaW5lIENNRCAgICAweDBDCQkvKiBDb21tYW5kICovCisjZGVmaW5lIE1EMCAgICAweDBFCQkvKiBNb2RlIDAgKi8KKyNkZWZpbmUgTUQxICAgIDB4MEYJCS8qIE1vZGUgMSAqLworI2RlZmluZSBNRDIgICAgMHgxMAkJLyogTW9kZSAyICovCisjZGVmaW5lIENUTCAgICAweDExCQkvKiBDb250cm9sICovCisjZGVmaW5lIFNBMCAgICAweDEyCQkvKiBTeW5jL0FkZHJlc3MgMCAqLworI2RlZmluZSBTQTEgICAgMHgxMwkJLyogU3luYy9BZGRyZXNzIDEgKi8KKyNkZWZpbmUgSURMICAgIDB4MTQJCS8qIElkbGUgUGF0dGVybiAqLworI2RlZmluZSBUTUMgICAgMHgxNQkJLyogVGltZSBDb25zdGFudCAqLworI2RlZmluZSBSWFMgICAgMHgxNgkJLyogUlggQ2xvY2sgU291cmNlICovCisjZGVmaW5lIFRYUyAgICAweDE3CQkvKiBUWCBDbG9jayBTb3VyY2UgKi8KKyNkZWZpbmUgVFJDMCAgIDB4MTgJCS8qIFRYIFJlYWR5IENvbnRyb2wgMCAqLyAKKyNkZWZpbmUgVFJDMSAgIDB4MTkJCS8qIFRYIFJlYWR5IENvbnRyb2wgMSAqLyAKKyNkZWZpbmUgUlJDICAgIDB4MUEJCS8qIFJYIFJlYWR5IENvbnRyb2wgKi8gCisjZGVmaW5lIENTVDAgICAweDFDCQkvKiBDdXJyZW50IFN0YXR1cyAwICovCisjZGVmaW5lIENTVDEgICAweDFECQkvKiBDdXJyZW50IFN0YXR1cyAxICovCisKKworLyogVGltZXIgY2hhbm5lbCAwIChwb3J0IDAgUlgpIHJlZ2lzdGVycyAtIG9mZnNldCAweDYwCisgICBUaW1lciBjaGFubmVsIDEgKHBvcnQgMCBUWCkgcmVnaXN0ZXJzIC0gb2Zmc2V0IDB4NjgKKyAgIFRpbWVyIGNoYW5uZWwgMiAocG9ydCAxIFJYKSByZWdpc3RlcnMgLSBvZmZzZXQgMHg3MAorICAgVGltZXIgY2hhbm5lbCAzIChwb3J0IDEgVFgpIHJlZ2lzdGVycyAtIG9mZnNldCAweDc4CisqLworCisjZGVmaW5lIFRJTUVSMFJYX09GRlNFVCAweDYwCisjZGVmaW5lIFRJTUVSMFRYX09GRlNFVCAweDY4CisjZGVmaW5lIFRJTUVSMVJYX09GRlNFVCAweDcwCisjZGVmaW5lIFRJTUVSMVRYX09GRlNFVCAweDc4CisKKyNkZWZpbmUgVENOVEwgIDB4MDAJCS8qIFVwLWNvdW50ZXIgTCAqLworI2RlZmluZSBUQ05USCAgMHgwMQkJLyogVXAtY291bnRlciBIICovCisjZGVmaW5lIFRDT05STCAweDAyCQkvKiBDb25zdGFudCBMICovCisjZGVmaW5lIFRDT05SSCAweDAzCQkvKiBDb25zdGFudCBIICovCisjZGVmaW5lIFRDU1IgICAweDA0CQkvKiBDb250cm9sL1N0YXR1cyAqLworI2RlZmluZSBURVBSICAgMHgwNQkJLyogRXhwYW5kIFByZXNjYWxlICovCisKKworCisvKiBETUEgY2hhbm5lbCAwIChwb3J0IDAgUlgpIHJlZ2lzdGVycyAtIG9mZnNldCAweDgwCisgICBETUEgY2hhbm5lbCAxIChwb3J0IDAgVFgpIHJlZ2lzdGVycyAtIG9mZnNldCAweEEwCisgICBETUEgY2hhbm5lbCAyIChwb3J0IDEgUlgpIHJlZ2lzdGVycyAtIG9mZnNldCAweEMwCisgICBETUEgY2hhbm5lbCAzIChwb3J0IDEgVFgpIHJlZ2lzdGVycyAtIG9mZnNldCAweEUwCisqLworCisjZGVmaW5lIERNQUMwUlhfT0ZGU0VUIDB4ODAKKyNkZWZpbmUgRE1BQzBUWF9PRkZTRVQgMHhBMAorI2RlZmluZSBETUFDMVJYX09GRlNFVCAweEMwCisjZGVmaW5lIERNQUMxVFhfT0ZGU0VUIDB4RTAKKworI2RlZmluZSBCQVJMICAgMHgwMAkJLyogQnVmZmVyIEFkZHJlc3MgTCAoY2hhaW5lZCBibG9jaykgKi8KKyNkZWZpbmUgQkFSSCAgIDB4MDEJCS8qIEJ1ZmZlciBBZGRyZXNzIEggKGNoYWluZWQgYmxvY2spICovCisjZGVmaW5lIEJBUkIgICAweDAyCQkvKiBCdWZmZXIgQWRkcmVzcyBCIChjaGFpbmVkIGJsb2NrKSAqLworCisjZGVmaW5lIERBUkwgICAweDAwCQkvKiBSWCBEZXN0aW5hdGlvbiBBZGRyIEwgKHNpbmdsZSBibG9jaykgKi8KKyNkZWZpbmUgREFSSCAgIDB4MDEJCS8qIFJYIERlc3RpbmF0aW9uIEFkZHIgSCAoc2luZ2xlIGJsb2NrKSAqLworI2RlZmluZSBEQVJCICAgMHgwMgkJLyogUlggRGVzdGluYXRpb24gQWRkciBCIChzaW5nbGUgYmxvY2spICovCisKKyNkZWZpbmUgU0FSTCAgIDB4MDQJCS8qIFRYIFNvdXJjZSBBZGRyZXNzIEwgKHNpbmdsZSBibG9jaykgKi8KKyNkZWZpbmUgU0FSSCAgIDB4MDUJCS8qIFRYIFNvdXJjZSBBZGRyZXNzIEggKHNpbmdsZSBibG9jaykgKi8KKyNkZWZpbmUgU0FSQiAgIDB4MDYJCS8qIFRYIFNvdXJjZSBBZGRyZXNzIEIgKHNpbmdsZSBibG9jaykgKi8KKworI2RlZmluZSBDUEIgICAgMHgwNgkJLyogQ2hhaW4gUG9pbnRlciBCYXNlIChjaGFpbmVkIGJsb2NrKSAqLworCisjZGVmaW5lIENEQUwgICAweDA4CQkvKiBDdXJyZW50IERlc2NyaXB0b3IgQWRkciBMIChjaGFpbmVkIGJsb2NrKSAqLworI2RlZmluZSBDREFIICAgMHgwOQkJLyogQ3VycmVudCBEZXNjcmlwdG9yIEFkZHIgSCAoY2hhaW5lZCBibG9jaykgKi8KKyNkZWZpbmUgRURBTCAgIDB4MEEJCS8qIEVycm9yIERlc2NyaXB0b3IgQWRkciBMIChjaGFpbmVkIGJsb2NrKSAqLworI2RlZmluZSBFREFIICAgMHgwQgkJLyogRXJyb3IgRGVzY3JpcHRvciBBZGRyIEggKGNoYWluZWQgYmxvY2spICovCisjZGVmaW5lIEJGTEwgICAweDBDCQkvKiBSWCBSZWNlaXZlIEJ1ZmZlciBMZW5ndGggTCAoY2hhaW5lZCBibG9jaykqLworI2RlZmluZSBCRkxIICAgMHgwRAkJLyogUlggUmVjZWl2ZSBCdWZmZXIgTGVuZ3RoIEggKGNoYWluZWQgYmxvY2spKi8KKyNkZWZpbmUgQkNSTCAgIDB4MEUJCS8qIEJ5dGUgQ291bnQgTCAqLworI2RlZmluZSBCQ1JIICAgMHgwRgkJLyogQnl0ZSBDb3VudCBIICovCisjZGVmaW5lIERTUiAgICAweDEwCQkvKiBETUEgU3RhdHVzICovCisjZGVmaW5lIERTUl9SWChub2RlKSAoRFNSICsgKG5vZGUgPyBETUFDMVJYX09GRlNFVCA6IERNQUMwUlhfT0ZGU0VUKSkKKyNkZWZpbmUgRFNSX1RYKG5vZGUpIChEU1IgKyAobm9kZSA/IERNQUMxVFhfT0ZGU0VUIDogRE1BQzBUWF9PRkZTRVQpKQorI2RlZmluZSBETVIgICAgMHgxMQkJLyogRE1BIE1vZGUgKi8KKyNkZWZpbmUgRE1SX1JYKG5vZGUpIChETVIgKyAobm9kZSA/IERNQUMxUlhfT0ZGU0VUIDogRE1BQzBSWF9PRkZTRVQpKQorI2RlZmluZSBETVJfVFgobm9kZSkgKERNUiArIChub2RlID8gRE1BQzFUWF9PRkZTRVQgOiBETUFDMFRYX09GRlNFVCkpCisjZGVmaW5lIEZDVCAgICAweDEzCQkvKiBGcmFtZSBFbmQgSW50ZXJydXB0IENvdW50ZXIgKi8KKyNkZWZpbmUgRkNUX1JYKG5vZGUpIChGQ1QgKyAobm9kZSA/IERNQUMxUlhfT0ZGU0VUIDogRE1BQzBSWF9PRkZTRVQpKQorI2RlZmluZSBGQ1RfVFgobm9kZSkgKEZDVCArIChub2RlID8gRE1BQzFUWF9PRkZTRVQgOiBETUFDMFRYX09GRlNFVCkpCisjZGVmaW5lIERJUiAgICAweDE0CQkvKiBETUEgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBESVJfUlgobm9kZSkgKERJUiArIChub2RlID8gRE1BQzFSWF9PRkZTRVQgOiBETUFDMFJYX09GRlNFVCkpCisjZGVmaW5lIERJUl9UWChub2RlKSAoRElSICsgKG5vZGUgPyBETUFDMVRYX09GRlNFVCA6IERNQUMwVFhfT0ZGU0VUKSkKKyNkZWZpbmUgRENSICAgIDB4MTUJCS8qIERNQSBDb21tYW5kICAqLworI2RlZmluZSBEQ1JfUlgobm9kZSkgKERDUiArIChub2RlID8gRE1BQzFSWF9PRkZTRVQgOiBETUFDMFJYX09GRlNFVCkpCisjZGVmaW5lIERDUl9UWChub2RlKSAoRENSICsgKG5vZGUgPyBETUFDMVRYX09GRlNFVCA6IERNQUMwVFhfT0ZGU0VUKSkKKworCisKKworLyogRGVzY3JpcHRvciBTdHJ1Y3R1cmUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBjcDsJCQkvKiBDaGFpbiBQb2ludGVyICovCisJdTMyIGJwOwkJCS8qIEJ1ZmZlciBQb2ludGVyICgyNCBiaXRzKSAqLworCXUxNiBsZW47CQkvKiBEYXRhIExlbmd0aCAqLworCXU4IHN0YXQ7CQkvKiBTdGF0dXMgKi8KKwl1OCB1bnVzZWQ7CQkvKiBwYWRzIHRvIDItYnl0ZSBib3VuZGFyeSAqLworfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBwa3RfZGVzYzsKKworCisvKiBQYWNrZXQgRGVzY3JpcHRvciBTdGF0dXMgYml0cyAqLworCisjZGVmaW5lIFNUX1RYX0VPTSAgICAgMHg4MAkvKiBFbmQgb2YgZnJhbWUgKi8KKyNkZWZpbmUgU1RfVFhfRU9UICAgICAweDAxCS8qIEVuZCBvZiB0cmFuc21pdGlvbiAqLworCisjZGVmaW5lIFNUX1JYX0VPTSAgICAgMHg4MAkvKiBFbmQgb2YgZnJhbWUgKi8KKyNkZWZpbmUgU1RfUlhfU0hPUlQgICAweDQwCS8qIFNob3J0IGZyYW1lICovCisjZGVmaW5lIFNUX1JYX0FCT1JUICAgMHgyMAkvKiBBYm9ydCAqLworI2RlZmluZSBTVF9SWF9SRVNCSVQgIDB4MTAJLyogUmVzaWR1YWwgYml0ICovCisjZGVmaW5lIFNUX1JYX09WRVJSVU4gMHgwOAkvKiBPdmVycnVuICovCisjZGVmaW5lIFNUX1JYX0NSQyAgICAgMHgwNAkvKiBDUkMgKi8KKworI2RlZmluZSBTVF9FUlJPUl9NQVNLIDB4N0MKKworI2RlZmluZSBESVJfRU9URSAgICAgIDB4ODAgICAgICAvKiBUcmFuc2ZlciBjb21wbGV0ZWQgKi8KKyNkZWZpbmUgRElSX0VPTUUgICAgICAweDQwICAgICAgLyogRnJhbWUgVHJhbnNmZXIgQ29tcGxldGVkIChjaGFpbmVkLWJsb2NrKSAqLworI2RlZmluZSBESVJfQk9GRSAgICAgIDB4MjAgICAgICAvKiBCdWZmZXIgT3ZlcmZsb3cvVW5kZXJmbG93IChjaGFpbmVkLWJsb2NrKSovCisjZGVmaW5lIERJUl9DT0ZFICAgICAgMHgxMCAgICAgIC8qIENvdW50ZXIgT3ZlcmZsb3cgKGNoYWluZWQtYmxvY2spICovCisKKworI2RlZmluZSBEU1JfRU9UICAgICAgIDB4ODAgICAgICAvKiBUcmFuc2ZlciBjb21wbGV0ZWQgKi8KKyNkZWZpbmUgRFNSX0VPTSAgICAgICAweDQwICAgICAgLyogRnJhbWUgVHJhbnNmZXIgQ29tcGxldGVkIChjaGFpbmVkLWJsb2NrKSAqLworI2RlZmluZSBEU1JfQk9GICAgICAgIDB4MjAgICAgICAvKiBCdWZmZXIgT3ZlcmZsb3cvVW5kZXJmbG93IChjaGFpbmVkLWJsb2NrKSovCisjZGVmaW5lIERTUl9DT0YgICAgICAgMHgxMCAgICAgIC8qIENvdW50ZXIgT3ZlcmZsb3cgKGNoYWluZWQtYmxvY2spICovCisjZGVmaW5lIERTUl9ERSAgICAgICAgMHgwMgkvKiBETUEgRW5hYmxlICovCisjZGVmaW5lIERTUl9EV0UgICAgICAgMHgwMSAgICAgIC8qIERNQSBXcml0ZSBEaXNhYmxlICovCisKKy8qIERNQSBNYXN0ZXIgRW5hYmxlIFJlZ2lzdGVyIChETUVSKSBiaXRzICovCisjZGVmaW5lIERNRVJfRE1FICAgICAgMHg4MAkvKiBETUEgTWFzdGVyIEVuYWJsZSAqLworCisKKyNkZWZpbmUgQ01EX1JFU0VUICAgICAweDIxCS8qIFJlc2V0IENoYW5uZWwgKi8KKyNkZWZpbmUgQ01EX1RYX0VOQUJMRSAweDAyCS8qIFN0YXJ0IHRyYW5zbWl0dGVyICovCisjZGVmaW5lIENNRF9SWF9FTkFCTEUgMHgxMgkvKiBTdGFydCByZWNlaXZlciAqLworCisjZGVmaW5lIE1EMF9IRExDICAgICAgMHg4MAkvKiBCaXQtc3luYyBIRExDIG1vZGUgKi8KKyNkZWZpbmUgTUQwX0NSQ19FTkEgICAweDA0CS8qIEVuYWJsZSBDUkMgY29kZSBjYWxjdWxhdGlvbiAqLworI2RlZmluZSBNRDBfQ1JDX0NDSVRUIDB4MDIJLyogQ0NJVFQgQ1JDIGluc3RlYWQgb2YgQ1JDLTE2ICovCisjZGVmaW5lIE1EMF9DUkNfUFIxICAgMHgwMQkvKiBJbml0aWFsIGFsbC1vbmVzIGluc3RlYWQgb2YgYWxsLXplcm9zICovCisKKyNkZWZpbmUgTUQwX0NSQ19OT05FICAweDAwCisjZGVmaW5lIE1EMF9DUkNfMTZfMCAgMHgwNAorI2RlZmluZSBNRDBfQ1JDXzE2ICAgIDB4MDUKKyNkZWZpbmUgTUQwX0NSQ19JVFVfMCAweDA2CisjZGVmaW5lIE1EMF9DUkNfSVRVICAgMHgwNworCisjZGVmaW5lIE1EMl9OUloJICAgICAgMHgwMAorI2RlZmluZSBNRDJfTlJaSSAgICAgIDB4MjAKKyNkZWZpbmUgTUQyX01BTkNIRVNURVIgMHg4MAorI2RlZmluZSBNRDJfRk1fTUFSSyAgIDB4QTAKKyNkZWZpbmUgTUQyX0ZNX1NQQUNFICAweEMwCisjZGVmaW5lIE1EMl9MT09QQkFDSyAgMHgwMyAgICAgIC8qIExvY2FsIGRhdGEgTG9vcGJhY2sgKi8KKworI2RlZmluZSBDVExfTk9SVFMgICAgIDB4MDEKKyNkZWZpbmUgQ1RMX0lETEUgICAgICAweDEwCS8qIFRyYW5zbWl0IGFuIGlkbGUgcGF0dGVybiAqLworI2RlZmluZSBDVExfVURSTkMgICAgIDB4MjAJLyogSWRsZSBhZnRlciBDUkMgb3IgRkNTK2ZsYWcgdHJhbnNtaXRpb24gKi8KKworI2RlZmluZSBTVDBfVFhSRFkgICAgIDB4MDIJLyogVFggcmVhZHkgKi8KKyNkZWZpbmUgU1QwX1JYUkRZICAgICAweDAxCS8qIFJYIHJlYWR5ICovCisKKyNkZWZpbmUgU1QxX1VEUk4gICAgICAweDgwCS8qIE1TQ0kgVFggdW5kZXJydW4gKi8KKyNkZWZpbmUgU1QxX0NEQ0QgICAgICAweDA0CS8qIERDRCBsZXZlbCBjaGFuZ2VkICovCisKKyNkZWZpbmUgU1QzX0NUUyAgICAgICAweDA4CS8qIG1vZGVtIGlucHV0IC0gL0NUUyAqLworI2RlZmluZSBTVDNfRENEICAgICAgIDB4MDQJLyogbW9kZW0gaW5wdXQgLSAvRENEICovCisKKyNkZWZpbmUgSUUwX1RYSU5UICAgICAweDgwCS8qIFRYIElOVCBNU0NJIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSUUwX1JYSU5UQSAgICAweDQwCS8qIFJYIElOVCBBIE1TQ0kgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBJRTFfVURSTiAgICAgIDB4ODAJLyogVFggdW5kZXJydW4gTVNDSSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIElFMV9DRENEICAgICAgMHgwNAkvKiBEQ0QgbGV2ZWwgY2hhbmdlZCAqLworCisjZGVmaW5lIERDUl9BQk9SVCAgICAgMHgwMQkvKiBTb2Z0d2FyZSBhYm9ydCBjb21tYW5kICovCisjZGVmaW5lIERDUl9DTEVBUl9FT0YgMHgwMgkvKiBDbGVhciBFT0YgaW50ZXJydXB0ICovCisKKy8qIFRYIGFuZCBSWCBDbG9jayBTb3VyY2UgLSBSWFMgYW5kIFRYUyAqLworI2RlZmluZSBDTEtfQlJHX01BU0sgIDB4MEYKKyNkZWZpbmUgQ0xLX0xJTkVfUlggICAweDAwCS8qIFRYL1JYIGNsb2NrIGxpbmUgaW5wdXQgKi8KKyNkZWZpbmUgQ0xLX0xJTkVfVFggICAweDAwCS8qIFRYL1JYIGxpbmUgaW5wdXQgKi8KKyNkZWZpbmUgQ0xLX0JSR19SWCAgICAweDQwCS8qIGludGVybmFsIGJhdWQgcmF0ZSBnZW5lcmF0b3IgKi8KKyNkZWZpbmUgQ0xLX0JSR19UWCAgICAweDQwCS8qIGludGVybmFsIGJhdWQgcmF0ZSBnZW5lcmF0b3IgKi8KKyNkZWZpbmUgQ0xLX1JYQ0xLX1RYICAweDYwCS8qIFRYIGNsb2NrIGZyb20gUlggY2xvY2sgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaGQ2NDU3Mi5oIGIvZHJpdmVycy9uZXQvd2FuL2hkNjQ1NzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjU2N2MyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2hkNjQ1NzIuaApAQCAtMCwwICsxLDUyNyBAQAorLyoKKyAqIGhkNjQ1NzIuaAlEZXNjcmlwdGlvbiBvZiB0aGUgSGl0YWNoaSBIRDY0NTcyIChTQ0EtSUkpLCB2YWxpZCBmb3IgCisgKiAJCUNQVSBtb2RlcyAwICYgMi4KKyAqCisgKiBBdXRob3I6CUl2YW4gUGFzc29zIDxpdmFuQGN5Y2xhZGVzLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQ6ICAgKGMpIDIwMDAtMjAwMSBDeWNsYWRlcyBDb3JwLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogJExvZzogaGQ2NDU3Mi5oLHYgJAorICogUmV2aXNpb24gMy4xICAyMDAxLzA2LzE1IDEyOjQxOjEwICByZWdpbmEKKyAqIHVwcGluZyBtYWpvciB2ZXJzaW9uIG51bWJlcgorICoKKyAqIFJldmlzaW9uIDEuMS4xLjEgIDIwMDEvMDYvMTMgMjA6MjQ6NDkgIGRhbmllbGEKKyAqIFBDMzAwIGluaXRpYWwgQ1ZTIHZlcnNpb24gKDMuNC4wLXByZTEpCisgKgorICogUmV2aXNpb24gMS4wIDIwMDAvMDEvMjUgaXZhbgorICogSW5pdGlhbCB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fSEQ2NDU3Ml9ICisjZGVmaW5lIF9fSEQ2NDU3Ml9ICisKKy8qIElsbGVnYWwgQWNjZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCUlMQVIJMHgwMAorCisvKiBXYWl0IENvbnRyb2xsZXIgUmVnaXN0ZXJzICovCisjZGVmaW5lIFBBQlIwTAkweDIwCS8qIFBoeXNpY2FsIEFkZHIgQm91bmRhcnkgUmVnaXN0ZXIgMCBMICovCisjZGVmaW5lIFBBQlIwSAkweDIxCS8qIFBoeXNpY2FsIEFkZHIgQm91bmRhcnkgUmVnaXN0ZXIgMCBIICovCisjZGVmaW5lIFBBQlIxTAkweDIyCS8qIFBoeXNpY2FsIEFkZHIgQm91bmRhcnkgUmVnaXN0ZXIgMSBMICovCisjZGVmaW5lIFBBQlIxSAkweDIzCS8qIFBoeXNpY2FsIEFkZHIgQm91bmRhcnkgUmVnaXN0ZXIgMSBIICovCisjZGVmaW5lIFdDUkwJMHgyNAkvKiBXYWl0IENvbnRyb2wgUmVnaXN0ZXIgTCAqLworI2RlZmluZSBXQ1JNCTB4MjUJLyogV2FpdCBDb250cm9sIFJlZ2lzdGVyIE0gKi8KKyNkZWZpbmUgV0NSSAkweDI2CS8qIFdhaXQgQ29udHJvbCBSZWdpc3RlciBIICovCisKKy8qIEludGVycnVwdCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgSVZSCTB4NjAJLyogSW50ZXJydXB0IFZlY3RvciBSZWdpc3RlciAqLworI2RlZmluZSBJTVZSCTB4NjQJLyogSW50ZXJydXB0IE1vZGlmaWVkIFZlY3RvciBSZWdpc3RlciAqLworI2RlZmluZSBJVENSCTB4NjgJLyogSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVNSMAkweDZjCS8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgMCAqLworI2RlZmluZSBJU1IxCTB4NzAJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAxICovCisjZGVmaW5lIElFUjAJMHg3NAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgSUVSMQkweDc4CS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgMSAqLworCisvKiBSZWdpc3RlciBBY2Nlc3MgTWFjcm9zIChjaGFuIGlzIDAgb3IgMSBpbiBfYW55XyBjYXNlKSAqLworI2RlZmluZQlNX1JFRyhyZWcsIGNoYW4pCShyZWcgKyAweDgwKmNoYW4pCQkvKiBNU0NJICovCisjZGVmaW5lCURSWF9SRUcocmVnLCBjaGFuKQkocmVnICsgMHg0MCpjaGFuKQkJLyogRE1BIFJ4ICovCisjZGVmaW5lCURUWF9SRUcocmVnLCBjaGFuKQkocmVnICsgMHgyMCooMipjaGFuICsgMSkpCS8qIERNQSBUeCAqLworI2RlZmluZQlUUlhfUkVHKHJlZywgY2hhbikJKHJlZyArIDB4MjAqY2hhbikJCS8qIFRpbWVyIFJ4ICovCisjZGVmaW5lCVRUWF9SRUcocmVnLCBjaGFuKQkocmVnICsgMHgxMCooMipjaGFuICsgMSkpCS8qIFRpbWVyIFR4ICovCisjZGVmaW5lCVNUX1JFRyhyZWcsIGNoYW4pCShyZWcgKyAweDgwKmNoYW4pCQkvKiBTdGF0dXMgQ250ICovCisjZGVmaW5lIElSMF9EUlgodmFsLCBjaGFuKQkoKHZhbCk8PCg4KihjaGFuKSkpCQkvKiBJbnQgRE1BIFJ4ICovCisjZGVmaW5lIElSMF9EVFgodmFsLCBjaGFuKQkoKHZhbCk8PCg0KigyKmNoYW4gKyAxKSkpCS8qIEludCBETUEgVHggKi8KKyNkZWZpbmUgSVIwX00odmFsLCBjaGFuKQkoKHZhbCk8PCg4KihjaGFuKSkpCQkvKiBJbnQgTVNDSSAqLworCisvKiBNU0NJIENoYW5uZWwgUmVnaXN0ZXJzICovCisjZGVmaW5lIE1TQ0kwX09GRlNFVCAweDAwCisjZGVmaW5lIE1TQ0kxX09GRlNFVCAweDgwCisKKyNkZWZpbmUgTUQwCTB4MTM4CS8qIE1vZGUgcmVnIDAgKi8KKyNkZWZpbmUgTUQxCTB4MTM5CS8qIE1vZGUgcmVnIDEgKi8KKyNkZWZpbmUgTUQyCTB4MTNhCS8qIE1vZGUgcmVnIDIgKi8KKyNkZWZpbmUgTUQzCTB4MTNiCS8qIE1vZGUgcmVnIDMgKi8KKyNkZWZpbmUgQ1RMCTB4MTMwCS8qIENvbnRyb2wgcmVnICovCisjZGVmaW5lIFJYUwkweDEzYwkvKiBSWCBjbG9jayBzb3VyY2UgKi8KKyNkZWZpbmUgVFhTCTB4MTNkCS8qIFRYIGNsb2NrIHNvdXJjZSAqLworI2RlZmluZSBFWFMJMHgxM2UJLyogRXh0ZXJuYWwgY2xvY2sgaW5wdXQgc2VsZWN0aW9uICovCisjZGVmaW5lIFRNQ1QJMHgxNDQJLyogVGltZSBjb25zdGFudCAoVHgpICovCisjZGVmaW5lIFRNQ1IJMHgxNDUJLyogVGltZSBjb25zdGFudCAoUngpICovCisjZGVmaW5lIENNRAkweDEyOAkvKiBDb21tYW5kIHJlZyAqLworI2RlZmluZSBTVDAJMHgxMTgJLyogU3RhdHVzIHJlZyAwICovCisjZGVmaW5lIFNUMQkweDExOQkvKiBTdGF0dXMgcmVnIDEgKi8KKyNkZWZpbmUgU1QyCTB4MTFhCS8qIFN0YXR1cyByZWcgMiAqLworI2RlZmluZSBTVDMJMHgxMWIJLyogU3RhdHVzIHJlZyAzICovCisjZGVmaW5lIFNUNAkweDExYwkvKiBTdGF0dXMgcmVnIDQgKi8KKyNkZWZpbmUgRlNUCTB4MTFkCS8qIGZyYW1lIFN0YXR1cyByZWcgICovCisjZGVmaW5lIElFMAkweDEyMAkvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZyAwICovCisjZGVmaW5lIElFMQkweDEyMQkvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZyAxICovCisjZGVmaW5lIElFMgkweDEyMgkvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZyAyICovCisjZGVmaW5lIElFNAkweDEyNAkvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZyA0ICovCisjZGVmaW5lIEZJRQkweDEyNQkvKiBGcmFtZSBJbnRlcnJ1cHQgZW5hYmxlIHJlZyAgKi8KKyNkZWZpbmUgU0EwCTB4MTQwCS8qIFN5biBBZGRyZXNzIHJlZyAwICovCisjZGVmaW5lIFNBMQkweDE0MQkvKiBTeW4gQWRkcmVzcyByZWcgMSAqLworI2RlZmluZSBJREwJMHgxNDIJLyogSWRsZSByZWdpc3RlciAqLworI2RlZmluZSBUUkJMCTB4MTAwCS8qIFRYL1JYIGJ1ZmZlciByZWcgTCAqLyAKKyNkZWZpbmUgVFJCSwkweDEwMQkvKiBUWC9SWCBidWZmZXIgcmVnIEsgKi8gCisjZGVmaW5lIFRSQkoJMHgxMDIJLyogVFgvUlggYnVmZmVyIHJlZyBKICovIAorI2RlZmluZSBUUkJICTB4MTAzCS8qIFRYL1JYIGJ1ZmZlciByZWcgSCAqLyAKKyNkZWZpbmUgVFJDMAkweDE0OAkvKiBUWCBSZWFkeSBjb250cm9sIHJlZyAwICovIAorI2RlZmluZSBUUkMxCTB4MTQ5CS8qIFRYIFJlYWR5IGNvbnRyb2wgcmVnIDEgKi8gCisjZGVmaW5lIFJSQwkweDE0YQkvKiBSWCBSZWFkeSBjb250cm9sIHJlZyAqLyAKKyNkZWZpbmUgQ1NUMAkweDEwOAkvKiBDdXJyZW50IFN0YXR1cyBSZWdpc3RlciAwICovIAorI2RlZmluZSBDU1QxCTB4MTA5CS8qIEN1cnJlbnQgU3RhdHVzIFJlZ2lzdGVyIDEgKi8gCisjZGVmaW5lIENTVDIJMHgxMGEJLyogQ3VycmVudCBTdGF0dXMgUmVnaXN0ZXIgMiAqLyAKKyNkZWZpbmUgQ1NUMwkweDEwYgkvKiBDdXJyZW50IFN0YXR1cyBSZWdpc3RlciAzICovIAorI2RlZmluZSBHUE8JMHgxMzEJLyogR2VuZXJhbCBQdXJwb3NlIE91dHB1dCBQaW4gQ3RsIFJlZyAqLworI2RlZmluZSBURlMJMHgxNGIJLyogVHggU3RhcnQgVGhyZXNob2xkIEN0bCBSZWcgKi8KKyNkZWZpbmUgVEZOCTB4MTQzCS8qIEludGVyLXRyYW5zbWl0LWZyYW1lIFRpbWUgRmlsbCBDdGwgUmVnICovCisjZGVmaW5lIFRCTgkweDExMAkvKiBUeCBCdWZmZXIgTnVtYmVyIFJlZyAqLworI2RlZmluZSBSQk4JMHgxMTEJLyogUnggQnVmZmVyIE51bWJlciBSZWcgKi8KKyNkZWZpbmUgVE5SMAkweDE1MAkvKiBUeCBETUEgUmVxdWVzdCBDdGwgUmVnIDAgKi8KKyNkZWZpbmUgVE5SMQkweDE1MQkvKiBUeCBETUEgUmVxdWVzdCBDdGwgUmVnIDEgKi8KKyNkZWZpbmUgVENSCTB4MTUyCS8qIFR4IERNQSBDcml0aWNhbCBSZXF1ZXN0IFJlZyAqLworI2RlZmluZSBSTlIJMHgxNTQJLyogUnggRE1BIFJlcXVlc3QgQ3RsIFJlZyAqLworI2RlZmluZSBSQ1IJMHgxNTYJLyogUnggRE1BIENyaXRpY2FsIFJlcXVlc3QgUmVnICovCisKKy8qIFRpbWVyIFJlZ2lzdGVycyAqLworI2RlZmluZSBUSU1FUjBSWF9PRkZTRVQgMHgwMAorI2RlZmluZSBUSU1FUjBUWF9PRkZTRVQgMHgxMAorI2RlZmluZSBUSU1FUjFSWF9PRkZTRVQgMHgyMAorI2RlZmluZSBUSU1FUjFUWF9PRkZTRVQgMHgzMAorCisjZGVmaW5lIFRDTlRMCTB4MjAwCS8qIFRpbWVyIFVwY291bnRlciBMICovCisjZGVmaW5lIFRDTlRICTB4MjAxCS8qIFRpbWVyIFVwY291bnRlciBIICovCisjZGVmaW5lIFRDT05STAkweDIwNAkvKiBUaW1lciBDb25zdGFudCBSZWdpc3RlciBMICovCisjZGVmaW5lIFRDT05SSAkweDIwNQkvKiBUaW1lciBDb25zdGFudCBSZWdpc3RlciBIICovCisjZGVmaW5lIFRDU1IJMHgyMDYJLyogVGltZXIgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgVEVQUgkweDIwNwkvKiBUaW1lciBFeHBhbmQgUHJlc2NhbGUgUmVnaXN0ZXIgKi8KKworLyogRE1BIHJlZ2lzdGVycyAqLworI2RlZmluZSBQQ1IJCTB4NDAJCS8qIERNQSBwcmlvcml0eSBjb250cm9sIHJlZyAqLworI2RlZmluZSBEUlIJCTB4NDQJCS8qIERNQSByZXNldCByZWcgKi8KKyNkZWZpbmUgRE1FUgkJMHgwNwkJLyogRE1BIE1hc3RlciBFbmFibGUgcmVnICovCisjZGVmaW5lIEJUQ1IJCTB4MDgJCS8qIEJ1cnN0IFR4IEN0bCBSZWcgKi8KKyNkZWZpbmUgQk9MUgkJMHgwYwkJLyogQmFjay1vZmYgTGVuZ3RoIFJlZyAqLworI2RlZmluZSBEU1JfUlgoY2hhbikJKDB4NDggKyAyKmNoYW4pCS8qIERNQSBTdGF0dXMgUmVnIChSeCkgKi8KKyNkZWZpbmUgRFNSX1RYKGNoYW4pCSgweDQ5ICsgMipjaGFuKQkvKiBETUEgU3RhdHVzIFJlZyAoVHgpICovCisjZGVmaW5lIERJUl9SWChjaGFuKQkoMHg0YyArIDIqY2hhbikJLyogRE1BIEludGVycnVwdCBFbmFibGUgUmVnIChSeCkgKi8KKyNkZWZpbmUgRElSX1RYKGNoYW4pCSgweDRkICsgMipjaGFuKQkvKiBETUEgSW50ZXJydXB0IEVuYWJsZSBSZWcgKFR4KSAqLworI2RlZmluZSBGQ1RfUlgoY2hhbikJKDB4NTAgKyAyKmNoYW4pCS8qIEZyYW1lIEVuZCBJbnRlcnJ1cHQgQ291bnRlciAoUngpICovCisjZGVmaW5lIEZDVF9UWChjaGFuKQkoMHg1MSArIDIqY2hhbikJLyogRnJhbWUgRW5kIEludGVycnVwdCBDb3VudGVyIChUeCkgKi8KKyNkZWZpbmUgRE1SX1JYKGNoYW4pCSgweDU0ICsgMipjaGFuKQkvKiBETUEgTW9kZSBSZWcgKFJ4KSAqLworI2RlZmluZSBETVJfVFgoY2hhbikJKDB4NTUgKyAyKmNoYW4pCS8qIERNQSBNb2RlIFJlZyAoVHgpICovCisjZGVmaW5lIERDUl9SWChjaGFuKQkoMHg1OCArIDIqY2hhbikJLyogRE1BIENvbW1hbmQgUmVnIChSeCkgKi8KKyNkZWZpbmUgRENSX1RYKGNoYW4pCSgweDU5ICsgMipjaGFuKQkvKiBETUEgQ29tbWFuZCBSZWcgKFR4KSAqLworCisvKiBETUEgQ2hhbm5lbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgRE1BQzBSWF9PRkZTRVQgMHgwMAorI2RlZmluZSBETUFDMFRYX09GRlNFVCAweDIwCisjZGVmaW5lIERNQUMxUlhfT0ZGU0VUIDB4NDAKKyNkZWZpbmUgRE1BQzFUWF9PRkZTRVQgMHg2MAorCisjZGVmaW5lIERBUkwJMHg4MAkvKiBEZXN0IEFkZHIgUmVnaXN0ZXIgTCAoc2luZ2xlLWJsb2NrLCBSWCBvbmx5KSAqLworI2RlZmluZSBEQVJICTB4ODEJLyogRGVzdCBBZGRyIFJlZ2lzdGVyIEggKHNpbmdsZS1ibG9jaywgUlggb25seSkgKi8KKyNkZWZpbmUgREFSQgkweDgyCS8qIERlc3QgQWRkciBSZWdpc3RlciBCIChzaW5nbGUtYmxvY2ssIFJYIG9ubHkpICovCisjZGVmaW5lIERBUkJICTB4ODMJLyogRGVzdCBBZGRyIFJlZ2lzdGVyIEJIIChzaW5nbGUtYmxvY2ssIFJYIG9ubHkpICovCisjZGVmaW5lIFNBUkwJMHg4MAkvKiBTb3VyY2UgQWRkciBSZWdpc3RlciBMIChzaW5nbGUtYmxvY2ssIFRYIG9ubHkpICovCisjZGVmaW5lIFNBUkgJMHg4MQkvKiBTb3VyY2UgQWRkciBSZWdpc3RlciBIIChzaW5nbGUtYmxvY2ssIFRYIG9ubHkpICovCisjZGVmaW5lIFNBUkIJMHg4MgkvKiBTb3VyY2UgQWRkciBSZWdpc3RlciBCIChzaW5nbGUtYmxvY2ssIFRYIG9ubHkpICovCisjZGVmaW5lIERBUkJICTB4ODMJLyogU291cmNlIEFkZHIgUmVnaXN0ZXIgQkggKHNpbmdsZS1ibG9jaywgVFggb25seSkgKi8KKyNkZWZpbmUgQkFSTAkweDgwCS8qIEJ1ZmZlciBBZGRyIFJlZ2lzdGVyIEwgKGNoYWluZWQtYmxvY2spICovCisjZGVmaW5lIEJBUkgJMHg4MQkvKiBCdWZmZXIgQWRkciBSZWdpc3RlciBIIChjaGFpbmVkLWJsb2NrKSAqLworI2RlZmluZSBCQVJCCTB4ODIJLyogQnVmZmVyIEFkZHIgUmVnaXN0ZXIgQiAoY2hhaW5lZC1ibG9jaykgKi8KKyNkZWZpbmUgQkFSQkgJMHg4MwkvKiBCdWZmZXIgQWRkciBSZWdpc3RlciBCSCAoY2hhaW5lZC1ibG9jaykgKi8KKyNkZWZpbmUgQ0RBTAkweDg0CS8qIEN1cnJlbnQgRGVzY3JpcHRvciBBZGRyIFJlZ2lzdGVyIEwgKi8KKyNkZWZpbmUgQ0RBSAkweDg1CS8qIEN1cnJlbnQgRGVzY3JpcHRvciBBZGRyIFJlZ2lzdGVyIEggKi8KKyNkZWZpbmUgQ0RBQgkweDg2CS8qIEN1cnJlbnQgRGVzY3JpcHRvciBBZGRyIFJlZ2lzdGVyIEIgKi8KKyNkZWZpbmUgQ0RBQkgJMHg4NwkvKiBDdXJyZW50IERlc2NyaXB0b3IgQWRkciBSZWdpc3RlciBCSCAqLworI2RlZmluZSBFREFMCTB4ODgJLyogRXJyb3IgRGVzY3JpcHRvciBBZGRyIFJlZ2lzdGVyIEwgKi8KKyNkZWZpbmUgRURBSAkweDg5CS8qIEVycm9yIERlc2NyaXB0b3IgQWRkciBSZWdpc3RlciBIICovCisjZGVmaW5lIEVEQUIJMHg4YQkvKiBFcnJvciBEZXNjcmlwdG9yIEFkZHIgUmVnaXN0ZXIgQiAqLworI2RlZmluZSBFREFCSAkweDhiCS8qIEVycm9yIERlc2NyaXB0b3IgQWRkciBSZWdpc3RlciBCSCAqLworI2RlZmluZSBCRkxMCTB4OTAJLyogUlggQnVmZmVyIExlbmd0aCBMIChvbmx5IFJYKSAqLworI2RlZmluZSBCRkxICTB4OTEJLyogUlggQnVmZmVyIExlbmd0aCBIIChvbmx5IFJYKSAqLworI2RlZmluZSBCQ1JMCTB4OGMJLyogQnl0ZSBDb3VudCBSZWdpc3RlciBMICovCisjZGVmaW5lIEJDUkgJMHg4ZAkvKiBCeXRlIENvdW50IFJlZ2lzdGVyIEggKi8KKworLyogQmxvY2sgRGVzY3JpcHRvciBTdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nCW5leHQ7CQkvKiBwb2ludGVyIHRvIG5leHQgYmxvY2sgZGVzY3JpcHRvciAqLworCXVuc2lnbmVkIGxvbmcJcHRidWY7CQkvKiBidWZmZXIgcG9pbnRlciAqLworCXVuc2lnbmVkIHNob3J0CWxlbjsJCS8qIGRhdGEgbGVuZ3RoICovCisJdW5zaWduZWQgY2hhcglzdGF0dXM7CQkvKiBzdGF0dXMgKi8KKwl1bnNpZ25lZCBjaGFyCWZpbGxlcls1XTsJLyogYWxpZ25tZW50IGZpbGxlciAoMTYgYnl0ZXMpICovIAorfSBwY3NjYV9iZF90OworCisvKiBCbG9jayBEZXNjcmlwdG9yIFN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBjcDsJCQkvKiBwb2ludGVyIHRvIG5leHQgYmxvY2sgZGVzY3JpcHRvciAqLworCXUzMiBicDsJCQkvKiBidWZmZXIgcG9pbnRlciAqLworCXUxNiBsZW47CQkvKiBkYXRhIGxlbmd0aCAqLworCXU4IHN0YXQ7CQkvKiBzdGF0dXMgKi8KKwl1OCB1bnVzZWQ7CQkvKiBwYWRzIHRvIDQtYnl0ZSBib3VuZGFyeSAqLworfXBrdF9kZXNjOworCisKKy8qCisJRGVzY3JpcHRvciBTdGF0dXMgZGVmaW5pdGlvbnM6CisKKwlCaXQJVHJhbnNtaXNzaW9uCVJlY2VwdGlvbgorCisJNwlFT00JCUVPTQorCTYJLQkJU2hvcnQgRnJhbWUKKwk1CS0JCUFib3J0CisJNAktCQlSZXNpZHVhbCBiaXQKKwkzCVVuZGVycnVuCU92ZXJydW4JCisJMgktCQlDUkMKKwkxCU93bmVyc2hpcAlPd25lcnNoaXAKKwkwCUVPVAkJLQorKi8KKyNkZWZpbmUgRFNUX0VPVAkJMHgwMQkvKiBFbmQgb2YgdHJhbnNtaXQgY29tbWFuZCAqLworI2RlZmluZSBEU1RfT1NCCQkweDAyCS8qIE93bmVyc2hpcCBiaXQgKi8KKyNkZWZpbmUgRFNUX0NSQwkJMHgwNAkvKiBDUkMgRXJyb3IgKi8KKyNkZWZpbmUgRFNUX09WUgkJMHgwOAkvKiBPdmVycnVuICovCisjZGVmaW5lIERTVF9VRFIJCTB4MDgJLyogVW5kZXJydW4gKi8KKyNkZWZpbmUgRFNUX1JCSVQJMHgxMAkvKiBSZXNpZHVhbCBiaXQgKi8KKyNkZWZpbmUgRFNUX0FCVAkJMHgyMAkvKiBBYm9ydCAqLworI2RlZmluZSBEU1RfU0hSVAkweDQwCS8qIFNob3J0IEZyYW1lICAqLworI2RlZmluZSBEU1RfRU9NCQkweDgwCS8qIEVuZCBvZiBNZXNzYWdlICAqLworCisvKiBQYWNrZXQgRGVzY3JpcHRvciBTdGF0dXMgYml0cyAqLworCisjZGVmaW5lIFNUX1RYX0VPTSAgICAgMHg4MAkvKiBFbmQgb2YgZnJhbWUgKi8KKyNkZWZpbmUgU1RfVFhfVU5EUlJVTiAweDA4CisjZGVmaW5lIFNUX1RYX09XTlJTSFAgMHgwMgorI2RlZmluZSBTVF9UWF9FT1QgICAgIDB4MDEJLyogRW5kIG9mIHRyYW5zbWl0aW9uICovCisKKyNkZWZpbmUgU1RfUlhfRU9NICAgICAweDgwCS8qIEVuZCBvZiBmcmFtZSAqLworI2RlZmluZSBTVF9SWF9TSE9SVCAgIDB4NDAJLyogU2hvcnQgZnJhbWUgKi8KKyNkZWZpbmUgU1RfUlhfQUJPUlQgICAweDIwCS8qIEFib3J0ICovCisjZGVmaW5lIFNUX1JYX1JFU0JJVCAgMHgxMAkvKiBSZXNpZHVhbCBiaXQgKi8KKyNkZWZpbmUgU1RfUlhfT1ZFUlJVTiAweDA4CS8qIE92ZXJydW4gKi8KKyNkZWZpbmUgU1RfUlhfQ1JDICAgICAweDA0CS8qIENSQyAqLworI2RlZmluZSBTVF9SWF9PV05SU0hQIDB4MDIKKworI2RlZmluZSBTVF9FUlJPUl9NQVNLIDB4N0MKKworLyogU3RhdHVzIENvdW50ZXIgUmVnaXN0ZXJzICovCisjZGVmaW5lIENNQ1IJMHgxNTgJLyogQ291bnRlciBNYXN0ZXIgQ3RsIFJlZyAqLworI2RlZmluZSBURUNOVEwJMHgxNjAJLyogVHggRU9NIENvdW50ZXIgTCAqLworI2RlZmluZSBURUNOVE0JMHgxNjEJLyogVHggRU9NIENvdW50ZXIgTSAqLworI2RlZmluZSBURUNOVEgJMHgxNjIJLyogVHggRU9NIENvdW50ZXIgSCAqLworI2RlZmluZSBURUNDUgkweDE2MwkvKiBUeCBFT00gQ291bnRlciBDdGwgUmVnICovCisjZGVmaW5lIFVSQ05UTAkweDE2NAkvKiBVbmRlcnJ1biBDb3VudGVyIEwgKi8KKyNkZWZpbmUgVVJDTlRICTB4MTY1CS8qIFVuZGVycnVuIENvdW50ZXIgSCAqLworI2RlZmluZSBVUkNDUgkweDE2NwkvKiBVbmRlcnJ1biBDb3VudGVyIEN0bCBSZWcgKi8KKyNkZWZpbmUgUkVDTlRMCTB4MTY4CS8qIFJ4IEVPTSBDb3VudGVyIEwgKi8KKyNkZWZpbmUgUkVDTlRNCTB4MTY5CS8qIFJ4IEVPTSBDb3VudGVyIE0gKi8KKyNkZWZpbmUgUkVDTlRICTB4MTZhCS8qIFJ4IEVPTSBDb3VudGVyIEggKi8KKyNkZWZpbmUgUkVDQ1IJMHgxNmIJLyogUnggRU9NIENvdW50ZXIgQ3RsIFJlZyAqLworI2RlZmluZSBPUkNOVEwJMHgxNmMJLyogT3ZlcnJ1biBDb3VudGVyIEwgKi8KKyNkZWZpbmUgT1JDTlRICTB4MTZkCS8qIE92ZXJydW4gQ291bnRlciBIICovCisjZGVmaW5lIE9SQ0NSCTB4MTZmCS8qIE92ZXJydW4gQ291bnRlciBDdGwgUmVnICovCisjZGVmaW5lIENFQ05UTAkweDE3MAkvKiBDUkMgQ291bnRlciBMICovCisjZGVmaW5lIENFQ05USAkweDE3MQkvKiBDUkMgQ291bnRlciBIICovCisjZGVmaW5lIENFQ0NSCTB4MTczCS8qIENSQyBDb3VudGVyIEN0bCBSZWcgKi8KKyNkZWZpbmUgQUJDTlRMCTB4MTc0CS8qIEFib3J0IGZyYW1lIENvdW50ZXIgTCAqLworI2RlZmluZSBBQkNOVEgJMHgxNzUJLyogQWJvcnQgZnJhbWUgQ291bnRlciBIICovCisjZGVmaW5lIEFCQ0NSCTB4MTc3CS8qIEFib3J0IGZyYW1lIENvdW50ZXIgQ3RsIFJlZyAqLworI2RlZmluZSBTSENOVEwJMHgxNzgJLyogU2hvcnQgZnJhbWUgQ291bnRlciBMICovCisjZGVmaW5lIFNIQ05USAkweDE3OQkvKiBTaG9ydCBmcmFtZSBDb3VudGVyIEggKi8KKyNkZWZpbmUgU0hDQ1IJMHgxN2IJLyogU2hvcnQgZnJhbWUgQ291bnRlciBDdGwgUmVnICovCisjZGVmaW5lIFJTQ05UTAkweDE3YwkvKiBSZXNpZHVhbCBiaXQgQ291bnRlciBMICovCisjZGVmaW5lIFJTQ05USAkweDE3ZAkvKiBSZXNpZHVhbCBiaXQgQ291bnRlciBIICovCisjZGVmaW5lIFJTQ0NSCTB4MTdmCS8qIFJlc2lkdWFsIGJpdCBDb3VudGVyIEN0bCBSZWcgKi8KKworLyogUmVnaXN0ZXIgUHJvZ3JhbW1pbmcgQ29uc3RhbnRzICovCisKKyNkZWZpbmUgSVIwX0RNSUMJMHgwMDAwMDAwMQorI2RlZmluZSBJUjBfRE1JQgkweDAwMDAwMDAyCisjZGVmaW5lIElSMF9ETUlBCTB4MDAwMDAwMDQKKyNkZWZpbmUgSVIwX0VGVAkJMHgwMDAwMDAwOAorI2RlZmluZSBJUjBfRE1BUkVRCTB4MDAwMTAwMDAKKyNkZWZpbmUgSVIwX1RYSU5UCTB4MDAwMjAwMDAKKyNkZWZpbmUgSVIwX1JYSU5UQgkweDAwMDQwMDAwCisjZGVmaW5lIElSMF9SWElOVEEJMHgwMDA4MDAwMAorI2RlZmluZSBJUjBfVFhSRFkJMHgwMDEwMDAwMAorI2RlZmluZSBJUjBfUlhSRFkJMHgwMDIwMDAwMAorCisjZGVmaW5lIE1EMF9DUkMxNl8wCTB4MDAKKyNkZWZpbmUgTUQwX0NSQzE2XzEJMHgwMQorI2RlZmluZSBNRDBfQ1JDMzIJMHgwMgorI2RlZmluZSBNRDBfQ1JDX0NDSVRUCTB4MDMKKyNkZWZpbmUgTUQwX0NSQ0MwCTB4MDQKKyNkZWZpbmUgTUQwX0NSQ0MxCTB4MDgKKyNkZWZpbmUgTUQwX0FVVE9fRU5BCTB4MTAKKyNkZWZpbmUgTUQwX0FTWU5DCTB4MDAKKyNkZWZpbmUgTUQwX0JZX01TWU5DCTB4MjAKKyNkZWZpbmUgTUQwX0JZX0JJU1lOQwkweDQwCisjZGVmaW5lIE1EMF9CWV9FWFQJMHg2MAorI2RlZmluZSBNRDBfQklUX1NZTkMJMHg4MAorI2RlZmluZSBNRDBfVFJBTlNQCTB4YzAKKworI2RlZmluZSBNRDBfSERMQyAgICAgICAgMHg4MAkvKiBCaXQtc3luYyBIRExDIG1vZGUgKi8KKworI2RlZmluZSBNRDBfQ1JDX05PTkUJMHgwMAorI2RlZmluZSBNRDBfQ1JDXzE2XzAJMHgwNAorI2RlZmluZSBNRDBfQ1JDXzE2CTB4MDUKKyNkZWZpbmUgTUQwX0NSQ19JVFUzMgkweDA2CisjZGVmaW5lIE1EMF9DUkNfSVRVCTB4MDcKKworI2RlZmluZSBNRDFfTk9BRERSCTB4MDAKKyNkZWZpbmUgTUQxX1NBRERSMQkweDQwCisjZGVmaW5lIE1EMV9TQUREUjIJMHg4MAorI2RlZmluZSBNRDFfREFERFIJMHhjMAorCisjZGVmaW5lIE1EMl9OUlpJX0lFRUUJMHg0MAorI2RlZmluZSBNRDJfTUFOQ0hFU1RFUgkweDgwCisjZGVmaW5lIE1EMl9GTV9NQVJLCTB4QTAKKyNkZWZpbmUgTUQyX0ZNX1NQQUNFCTB4QzAKKyNkZWZpbmUgTUQyX0xPT1BCQUNLCTB4MDMJLyogTG9jYWwgZGF0YSBMb29wYmFjayAqLworCisjZGVmaW5lIE1EMl9GX0RVUExFWAkweDAwCisjZGVmaW5lIE1EMl9BVVRPX0VDSE8JMHgwMQorI2RlZmluZSBNRDJfTE9PUF9ISV9aCTB4MDIKKyNkZWZpbmUgTUQyX0xPT1BfTUlSCTB4MDMKKyNkZWZpbmUgTUQyX0FEUExMX1g4CTB4MDAKKyNkZWZpbmUgTUQyX0FEUExMX1gxNgkweDA4CisjZGVmaW5lIE1EMl9BRFBMTF9YMzIJMHgxMAorI2RlZmluZSBNRDJfTlJaCQkweDAwCisjZGVmaW5lIE1EMl9OUlpJCTB4MjAKKyNkZWZpbmUgTUQyX05SWl9JRUVFCTB4NDAKKyNkZWZpbmUgTUQyX01BTkNICTB4MDAKKyNkZWZpbmUgTUQyX0ZNMQkJMHgyMAorI2RlZmluZSBNRDJfRk0wCQkweDQwCisjZGVmaW5lIE1EMl9GTQkJMHg4MAorCisjZGVmaW5lIENUTF9SVFMJCTB4MDEKKyNkZWZpbmUgQ1RMX0RUUgkJMHgwMgorI2RlZmluZSBDVExfU1lOCQkweDA0CisjZGVmaW5lIENUTF9JRExDCTB4MTAKKyNkZWZpbmUgQ1RMX1VEUk5DCTB4MjAKKyNkZWZpbmUgQ1RMX1VSU0tQCTB4NDAKKyNkZWZpbmUgQ1RMX1VSQ1QJMHg4MAorCisjZGVmaW5lIENUTF9OT1JUUwkweDAxCisjZGVmaW5lIENUTF9OT0RUUgkweDAyCisjZGVmaW5lIENUTF9JRExFCTB4MTAKKworI2RlZmluZQlSWFNfQlIwCQkweDAxCisjZGVmaW5lCVJYU19CUjEJCTB4MDIKKyNkZWZpbmUJUlhTX0JSMgkJMHgwNAorI2RlZmluZQlSWFNfQlIzCQkweDA4CisjZGVmaW5lCVJYU19FQ0xLCTB4MDAKKyNkZWZpbmUJUlhTX0VDTEtfTlMJMHgyMAorI2RlZmluZQlSWFNfSUJSRwkweDQwCisjZGVmaW5lCVJYU19QTEwxCTB4NTAKKyNkZWZpbmUJUlhTX1BMTDIJMHg2MAorI2RlZmluZQlSWFNfUExMMwkweDcwCisjZGVmaW5lCVJYU19EUlRYQwkweDgwCisKKyNkZWZpbmUJVFhTX0JSMAkJMHgwMQorI2RlZmluZQlUWFNfQlIxCQkweDAyCisjZGVmaW5lCVRYU19CUjIJCTB4MDQKKyNkZWZpbmUJVFhTX0JSMwkJMHgwOAorI2RlZmluZQlUWFNfRUNMSwkweDAwCisjZGVmaW5lCVRYU19JQlJHCTB4NDAKKyNkZWZpbmUJVFhTX1JDTEsJMHg2MAorI2RlZmluZQlUWFNfRFRSWEMJMHg4MAorCisjZGVmaW5lCUVYU19SRVMwCTB4MDEKKyNkZWZpbmUJRVhTX1JFUzEJMHgwMgorI2RlZmluZQlFWFNfUkVTMgkweDA0CisjZGVmaW5lCUVYU19URVMwCTB4MTAKKyNkZWZpbmUJRVhTX1RFUzEJMHgyMAorI2RlZmluZQlFWFNfVEVTMgkweDQwCisKKyNkZWZpbmUgQ0xLX0JSR19NQVNLCTB4MEYKKyNkZWZpbmUgQ0xLX1BJTl9PVVQJMHg4MAorI2RlZmluZSBDTEtfTElORSAgICAJMHgwMAkvKiBjbG9jayBsaW5lIGlucHV0ICovCisjZGVmaW5lIENMS19CUkcgICAgIAkweDQwCS8qIGludGVybmFsIGJhdWQgcmF0ZSBnZW5lcmF0b3IgKi8KKyNkZWZpbmUgQ0xLX1RYX1JYQ0xLCTB4NjAJLyogVFggY2xvY2sgZnJvbSBSWCBjbG9jayAqLworCisjZGVmaW5lIENNRF9SWF9SU1QJMHgxMQorI2RlZmluZSBDTURfUlhfRU5BCTB4MTIKKyNkZWZpbmUgQ01EX1JYX0RJUwkweDEzCisjZGVmaW5lIENNRF9SWF9DUkNfSU5JVAkweDE0CisjZGVmaW5lIENNRF9SWF9NU0dfUkVKCTB4MTUKKyNkZWZpbmUgQ01EX1JYX01QX1NSQ0gJMHgxNgorI2RlZmluZSBDTURfUlhfQ1JDX0VYQwkweDE3CisjZGVmaW5lIENNRF9SWF9DUkNfRlJDCTB4MTgKKyNkZWZpbmUgQ01EX1RYX1JTVAkweDAxCisjZGVmaW5lIENNRF9UWF9FTkEJMHgwMgorI2RlZmluZSBDTURfVFhfRElTQQkweDAzCisjZGVmaW5lIENNRF9UWF9DUkNfSU5JVAkweDA0CisjZGVmaW5lIENNRF9UWF9DUkNfRVhDCTB4MDUKKyNkZWZpbmUgQ01EX1RYX0VPTQkweDA2CisjZGVmaW5lIENNRF9UWF9BQk9SVAkweDA3CisjZGVmaW5lIENNRF9UWF9NUF9PTgkweDA4CisjZGVmaW5lIENNRF9UWF9CVUZfQ0xSCTB4MDkKKyNkZWZpbmUgQ01EX1RYX0RJU0IJMHgwYgorI2RlZmluZSBDTURfQ0hfUlNUCTB4MjEKKyNkZWZpbmUgQ01EX1NSQ0hfTU9ERQkweDMxCisjZGVmaW5lIENNRF9OT1AJCTB4MDAKKworI2RlZmluZSBDTURfUkVTRVQJMHgyMQorI2RlZmluZSBDTURfVFhfRU5BQkxFCTB4MDIKKyNkZWZpbmUgQ01EX1JYX0VOQUJMRQkweDEyCisKKyNkZWZpbmUgU1QwX1JYUkRZCTB4MDEKKyNkZWZpbmUgU1QwX1RYUkRZCTB4MDIKKyNkZWZpbmUgU1QwX1JYSU5UQgkweDIwCisjZGVmaW5lIFNUMF9SWElOVEEJMHg0MAorI2RlZmluZSBTVDBfVFhJTlQJMHg4MAorCisjZGVmaW5lIFNUMV9JRExFCTB4MDEKKyNkZWZpbmUgU1QxX0FCT1JUCTB4MDIKKyNkZWZpbmUgU1QxX0NEQ0QJMHgwNAorI2RlZmluZSBTVDFfQ0NUUwkweDA4CisjZGVmaW5lIFNUMV9TWU5fRkxBRwkweDEwCisjZGVmaW5lIFNUMV9DTE1ECTB4MjAKKyNkZWZpbmUgU1QxX1RYSURMRQkweDQwCisjZGVmaW5lIFNUMV9VRFJOCTB4ODAKKworI2RlZmluZSBTVDJfQ1JDRQkweDA0CisjZGVmaW5lIFNUMl9PTlJOCTB4MDgKKyNkZWZpbmUgU1QyX1JCSVQJMHgxMAorI2RlZmluZSBTVDJfQUJPUlQJMHgyMAorI2RlZmluZSBTVDJfU0hPUlQJMHg0MAorI2RlZmluZSBTVDJfRU9NCQkweDgwCisKKyNkZWZpbmUgU1QzX1JYX0VOQQkweDAxCisjZGVmaW5lIFNUM19UWF9FTkEJMHgwMgorI2RlZmluZSBTVDNfRENECQkweDA0CisjZGVmaW5lIFNUM19DVFMJCTB4MDgKKyNkZWZpbmUgU1QzX1NSQ0hfTU9ERQkweDEwCisjZGVmaW5lIFNUM19TTE9PUAkweDIwCisjZGVmaW5lIFNUM19HUEkJCTB4ODAKKworI2RlZmluZSBTVDRfUkROUgkweDAxCisjZGVmaW5lIFNUNF9SRENSCTB4MDIKKyNkZWZpbmUgU1Q0X1RETlIJMHgwNAorI2RlZmluZSBTVDRfVERDUgkweDA4CisjZGVmaW5lIFNUNF9PQ0xNCTB4MjAKKyNkZWZpbmUgU1Q0X0NGVAkJMHg0MAorI2RlZmluZSBTVDRfQ0dQSQkweDgwCisKKyNkZWZpbmUgRlNUX0NSQ0VGCTB4MDQKKyNkZWZpbmUgRlNUX09WUk5GCTB4MDgKKyNkZWZpbmUgRlNUX1JCSUYJMHgxMAorI2RlZmluZSBGU1RfQUJURgkweDIwCisjZGVmaW5lIEZTVF9TSFJURgkweDQwCisjZGVmaW5lIEZTVF9FT01GCTB4ODAKKworI2RlZmluZSBJRTBfUlhSRFkJMHgwMQorI2RlZmluZSBJRTBfVFhSRFkJMHgwMgorI2RlZmluZSBJRTBfUlhJTlRCCTB4MjAKKyNkZWZpbmUgSUUwX1JYSU5UQQkweDQwCisjZGVmaW5lIElFMF9UWElOVAkweDgwCisjZGVmaW5lIElFMF9VRFJOCTB4MDAwMDgwMDAgLyogVFggdW5kZXJydW4gTVNDSSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIElFMF9DRENECTB4MDAwMDA0MDAgLyogQ0QgbGV2ZWwgY2hhbmdlIGludGVycnVwdCBlbmFibGUgKi8KKworI2RlZmluZSBJRTFfSURMRAkweDAxCisjZGVmaW5lIElFMV9BQlRECTB4MDIKKyNkZWZpbmUgSUUxX0NEQ0QJMHgwNAorI2RlZmluZSBJRTFfQ0NUUwkweDA4CisjZGVmaW5lIElFMV9TWU5DRAkweDEwCisjZGVmaW5lIElFMV9DTE1ECTB4MjAKKyNkZWZpbmUgSUUxX0lETAkJMHg0MAorI2RlZmluZSBJRTFfVURSTgkweDgwCisKKyNkZWZpbmUgSUUyX0NSQ0UJMHgwNAorI2RlZmluZSBJRTJfT1ZSTgkweDA4CisjZGVmaW5lIElFMl9SQklUCTB4MTAKKyNkZWZpbmUgSUUyX0FCVAkJMHgyMAorI2RlZmluZSBJRTJfU0hSVAkweDQwCisjZGVmaW5lIElFMl9FT00JCTB4ODAKKworI2RlZmluZSBJRTRfUkROUgkweDAxCisjZGVmaW5lIElFNF9SRENSCTB4MDIKKyNkZWZpbmUgSUU0X1RETlIJMHgwNAorI2RlZmluZSBJRTRfVERDUgkweDA4CisjZGVmaW5lIElFNF9PQ0xNCTB4MjAKKyNkZWZpbmUgSUU0X0NGVAkJMHg0MAorI2RlZmluZSBJRTRfQ0dQSQkweDgwCisKKyNkZWZpbmUgRklFX0NSQ0VGCTB4MDQKKyNkZWZpbmUgRklFX09WUk5GCTB4MDgKKyNkZWZpbmUgRklFX1JCSUYJMHgxMAorI2RlZmluZSBGSUVfQUJURgkweDIwCisjZGVmaW5lIEZJRV9TSFJURgkweDQwCisjZGVmaW5lIEZJRV9FT01GCTB4ODAKKworI2RlZmluZSBEU1JfRFdFCQkweDAxCisjZGVmaW5lIERTUl9ERQkJMHgwMgorI2RlZmluZSBEU1JfUkVGCQkweDA0CisjZGVmaW5lIERTUl9VRFJGCTB4MDQKKyNkZWZpbmUgRFNSX0NPQQkJMHgwOAorI2RlZmluZSBEU1JfQ09GCQkweDEwCisjZGVmaW5lIERTUl9CT0YJCTB4MjAKKyNkZWZpbmUgRFNSX0VPTQkJMHg0MAorI2RlZmluZSBEU1JfRU9UCQkweDgwCisKKyNkZWZpbmUgRElSX1JFRgkJMHgwNAorI2RlZmluZSBESVJfVURSRgkweDA0CisjZGVmaW5lIERJUl9DT0EJCTB4MDgKKyNkZWZpbmUgRElSX0NPRgkJMHgxMAorI2RlZmluZSBESVJfQk9GCQkweDIwCisjZGVmaW5lIERJUl9FT00JCTB4NDAKKyNkZWZpbmUgRElSX0VPVAkJMHg4MAorCisjZGVmaW5lIERJUl9SRUZFCTB4MDQKKyNkZWZpbmUgRElSX1VEUkZFCTB4MDQKKyNkZWZpbmUgRElSX0NPQUUJMHgwOAorI2RlZmluZSBESVJfQ09GRQkweDEwCisjZGVmaW5lIERJUl9CT0ZFCTB4MjAKKyNkZWZpbmUgRElSX0VPTUUJMHg0MAorI2RlZmluZSBESVJfRU9URQkweDgwCisKKyNkZWZpbmUgRE1SX0NOVEUJMHgwMgorI2RlZmluZSBETVJfTkYJCTB4MDQKKyNkZWZpbmUgRE1SX1NFT01FCTB4MDgKKyNkZWZpbmUgRE1SX1RNT0QJMHgxMAorCisjZGVmaW5lIERNRVJfRE1FICAgICAgICAweDgwCS8qIERNQSBNYXN0ZXIgRW5hYmxlICovCisKKyNkZWZpbmUgRENSX1NXX0FCVAkweDAxCisjZGVmaW5lIERDUl9GQ1RfQ0xSCTB4MDIKKworI2RlZmluZSBEQ1JfQUJPUlQJMHgwMQorI2RlZmluZSBEQ1JfQ0xFQVJfRU9GCTB4MDIKKworI2RlZmluZSBQQ1JfQ09URQkweDgwCisjZGVmaW5lIFBDUl9QUjAJCTB4MDEKKyNkZWZpbmUgUENSX1BSMQkJMHgwMgorI2RlZmluZSBQQ1JfUFIyCQkweDA0CisjZGVmaW5lIFBDUl9DQ0MJCTB4MDgKKyNkZWZpbmUgUENSX0JSQwkJMHgxMAorI2RlZmluZSBQQ1JfT1NCCQkweDQwCisjZGVmaW5lIFBDUl9CVVJTVAkweDgwCisKKyNlbmRpZiAvKiAoX19IRDY0NTcyX0gpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaGQ2NDU3eC5jIGIvZHJpdmVycy9uZXQvd2FuL2hkNjQ1N3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzc0MzMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2hkNjQ1N3guYwpAQCAtMCwwICsxLDg1MyBAQAorLyoKKyAqIEhpdGFjaGkgU0NBIEhENjQ1NzAgYW5kIEhENjQ1NzIgY29tbW9uIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMyBLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogU291cmNlcyBvZiBpbmZvcm1hdGlvbjoKKyAqICAgIEhpdGFjaGkgSEQ2NDU3MCBTQ0EgVXNlcidzIE1hbnVhbAorICogICAgSGl0YWNoaSBIRDY0NTcyIFNDQS1JSSBVc2VyJ3MgTWFudWFsCisgKgorICogV2UgdXNlIHRoZSBmb2xsb3dpbmcgU0NBIG1lbW9yeSBtYXA6CisgKgorICogUGFja2V0IGJ1ZmZlciBkZXNjcmlwdG9yIHJpbmdzIC0gc3RhcnRpbmcgZnJvbSB3aW5iYXNlIG9yIHdpbjBiYXNlOgorICogcnhfcmluZ19idWZmZXJzICogc2l6ZW9mKHBrdF9kZXNjKSA9IGxvZ2ljYWwgY2hhbm5lbCAjMCBSWCByaW5nCisgKiB0eF9yaW5nX2J1ZmZlcnMgKiBzaXplb2YocGt0X2Rlc2MpID0gbG9naWNhbCBjaGFubmVsICMwIFRYIHJpbmcKKyAqIHJ4X3JpbmdfYnVmZmVycyAqIHNpemVvZihwa3RfZGVzYykgPSBsb2dpY2FsIGNoYW5uZWwgIzEgUlggcmluZyAoaWYgdXNlZCkKKyAqIHR4X3JpbmdfYnVmZmVycyAqIHNpemVvZihwa3RfZGVzYykgPSBsb2dpY2FsIGNoYW5uZWwgIzEgVFggcmluZyAoaWYgdXNlZCkKKyAqCisgKiBQYWNrZXQgZGF0YSBidWZmZXJzIC0gc3RhcnRpbmcgZnJvbSB3aW5iYXNlICsgYnVmZl9vZmZzZXQ6CisgKiByeF9yaW5nX2J1ZmZlcnMgKiBIRExDX01BWF9NUlUgICAgID0gbG9naWNhbCBjaGFubmVsICMwIFJYIGJ1ZmZlcnMKKyAqIHR4X3JpbmdfYnVmZmVycyAqIEhETENfTUFYX01SVSAgICAgPSBsb2dpY2FsIGNoYW5uZWwgIzAgVFggYnVmZmVycworICogcnhfcmluZ19idWZmZXJzICogSERMQ19NQVhfTVJVICAgICA9IGxvZ2ljYWwgY2hhbm5lbCAjMCBSWCBidWZmZXJzIChpZiB1c2VkKQorICogdHhfcmluZ19idWZmZXJzICogSERMQ19NQVhfTVJVICAgICA9IGxvZ2ljYWwgY2hhbm5lbCAjMCBUWCBidWZmZXJzIChpZiB1c2VkKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KKworI2lmICghZGVmaW5lZCAoX19IRDY0NTcwX0gpICYmICFkZWZpbmVkIChfX0hENjQ1NzJfSCkpIHx8IFwKKyAgICAoZGVmaW5lZCAoX19IRDY0NTcwX0gpICYmIGRlZmluZWQgKF9fSEQ2NDU3Ml9IKSkKKyNlcnJvciBFaXRoZXIgaGQ2NDU3MC5oIG9yIGhkNjQ1NzIuaCBtdXN0IGJlIGluY2x1ZGVkCisjZW5kaWYKKworI2RlZmluZSBnZXRfbXNjaShwb3J0KQkgIChwaHlfbm9kZShwb3J0KSA/ICAgTVNDSTFfT0ZGU0VUIDogICBNU0NJMF9PRkZTRVQpCisjZGVmaW5lIGdldF9kbWFjX3J4KHBvcnQpIChwaHlfbm9kZShwb3J0KSA/IERNQUMxUlhfT0ZGU0VUIDogRE1BQzBSWF9PRkZTRVQpCisjZGVmaW5lIGdldF9kbWFjX3R4KHBvcnQpIChwaHlfbm9kZShwb3J0KSA/IERNQUMxVFhfT0ZGU0VUIDogRE1BQzBUWF9PRkZTRVQpCisKKyNkZWZpbmUgU0NBX0lOVFJfTVNDSShub2RlKSAgICAobm9kZSA/IDB4MTAgOiAweDAxKQorI2RlZmluZSBTQ0FfSU5UUl9ETUFDX1JYKG5vZGUpIChub2RlID8gMHgyMCA6IDB4MDIpCisjZGVmaW5lIFNDQV9JTlRSX0RNQUNfVFgobm9kZSkgKG5vZGUgPyAweDQwIDogMHgwNCkKKworI2lmZGVmIF9fSEQ2NDU3MF9IIC8qIEhENjQ1NzAgKi8KKyNkZWZpbmUgc2NhX291dGEodmFsdWUsIHJlZywgY2FyZCkJc2NhX291dHcodmFsdWUsIHJlZywgY2FyZCkKKyNkZWZpbmUgc2NhX2luYShyZWcsIGNhcmQpCQlzY2FfaW53KHJlZywgY2FyZCkKKyNkZWZpbmUgd3JpdGVhKHZhbHVlLCBwdHIpCQl3cml0ZXcodmFsdWUsIHB0cikKKworI2Vsc2UgLyogSEQ2NDU3MiAqLworI2RlZmluZSBzY2Ffb3V0YSh2YWx1ZSwgcmVnLCBjYXJkKQlzY2Ffb3V0bCh2YWx1ZSwgcmVnLCBjYXJkKQorI2RlZmluZSBzY2FfaW5hKHJlZywgY2FyZCkJCXNjYV9pbmwocmVnLCBjYXJkKQorI2RlZmluZSB3cml0ZWEodmFsdWUsIHB0cikJCXdyaXRlbCh2YWx1ZSwgcHRyKQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldF9kZXZpY2UgKnBvcnRfdG9fZGV2KHBvcnRfdCAqcG9ydCkKK3sKKwlyZXR1cm4gcG9ydC0+ZGV2OworfQorCitzdGF0aWMgaW5saW5lIGludCBzY2FfaW50cl9zdGF0dXMoY2FyZF90ICpjYXJkKQoreworCXU4IHJlc3VsdCA9IDA7CisKKyNpZmRlZiBfX0hENjQ1NzBfSCAvKiBIRDY0NTcwICovCisJdTggaXNyMCA9IHNjYV9pbihJU1IwLCBjYXJkKTsKKwl1OCBpc3IxID0gc2NhX2luKElTUjEsIGNhcmQpOworCisJaWYgKGlzcjEgJiAweDAzKSByZXN1bHQgfD0gU0NBX0lOVFJfRE1BQ19SWCgwKTsKKwlpZiAoaXNyMSAmIDB4MEMpIHJlc3VsdCB8PSBTQ0FfSU5UUl9ETUFDX1RYKDApOworCWlmIChpc3IxICYgMHgzMCkgcmVzdWx0IHw9IFNDQV9JTlRSX0RNQUNfUlgoMSk7CisJaWYgKGlzcjEgJiAweEMwKSByZXN1bHQgfD0gU0NBX0lOVFJfRE1BQ19UWCgxKTsKKwlpZiAoaXNyMCAmIDB4MEYpIHJlc3VsdCB8PSBTQ0FfSU5UUl9NU0NJKDApOworCWlmIChpc3IwICYgMHhGMCkgcmVzdWx0IHw9IFNDQV9JTlRSX01TQ0koMSk7CisKKyNlbHNlIC8qIEhENjQ1NzIgKi8KKwl1MzIgaXNyMCA9IHNjYV9pbmwoSVNSMCwgY2FyZCk7CisKKwlpZiAoaXNyMCAmIDB4MDAwMDAwMEYpIHJlc3VsdCB8PSBTQ0FfSU5UUl9ETUFDX1JYKDApOworCWlmIChpc3IwICYgMHgwMDAwMDBGMCkgcmVzdWx0IHw9IFNDQV9JTlRSX0RNQUNfVFgoMCk7CisJaWYgKGlzcjAgJiAweDAwMDAwRjAwKSByZXN1bHQgfD0gU0NBX0lOVFJfRE1BQ19SWCgxKTsKKwlpZiAoaXNyMCAmIDB4MDAwMEYwMDApIHJlc3VsdCB8PSBTQ0FfSU5UUl9ETUFDX1RYKDEpOworCWlmIChpc3IwICYgMHgwMDNFMDAwMCkgcmVzdWx0IHw9IFNDQV9JTlRSX01TQ0koMCk7CisJaWYgKGlzcjAgJiAweDNFMDAwMDAwKSByZXN1bHQgfD0gU0NBX0lOVFJfTVNDSSgxKTsKKworI2VuZGlmIC8qIEhENjQ1NzAgdnMgSEQ2NDU3MiAqLworCisJaWYgKCEocmVzdWx0ICYgU0NBX0lOVFJfRE1BQ19UWCgwKSkpCisJCWlmIChzY2FfaW4oRFNSX1RYKDApLCBjYXJkKSAmIERTUl9FT00pCisJCQlyZXN1bHQgfD0gU0NBX0lOVFJfRE1BQ19UWCgwKTsKKwlpZiAoIShyZXN1bHQgJiBTQ0FfSU5UUl9ETUFDX1RYKDEpKSkKKwkJaWYgKHNjYV9pbihEU1JfVFgoMSksIGNhcmQpICYgRFNSX0VPTSkKKwkJCXJlc3VsdCB8PSBTQ0FfSU5UUl9ETUFDX1RYKDEpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSBwb3J0X3QqIGRldl90b19wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldl90b19oZGxjKGRldiktPnByaXY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IG5leHRfZGVzYyhwb3J0X3QgKnBvcnQsIHUxNiBkZXNjLCBpbnQgdHJhbnNtaXQpCit7CisJcmV0dXJuIChkZXNjICsgMSkgJSAodHJhbnNtaXQgPyBwb3J0X3RvX2NhcmQocG9ydCktPnR4X3JpbmdfYnVmZmVycworCQkJICAgICA6IHBvcnRfdG9fY2FyZChwb3J0KS0+cnhfcmluZ19idWZmZXJzKTsKK30KKworCisKK3N0YXRpYyBpbmxpbmUgdTE2IGRlc2NfYWJzX251bWJlcihwb3J0X3QgKnBvcnQsIHUxNiBkZXNjLCBpbnQgdHJhbnNtaXQpCit7CisJdTE2IHJ4X2J1ZmZzID0gcG9ydF90b19jYXJkKHBvcnQpLT5yeF9yaW5nX2J1ZmZlcnM7CisJdTE2IHR4X2J1ZmZzID0gcG9ydF90b19jYXJkKHBvcnQpLT50eF9yaW5nX2J1ZmZlcnM7CisKKwlkZXNjICU9ICh0cmFuc21pdCA/IHR4X2J1ZmZzIDogcnhfYnVmZnMpOyAvLyBjYWxsZWQgd2l0aCAiWCArIDEiIGV0Yy4KKwlyZXR1cm4gbG9nX25vZGUocG9ydCkgKiAocnhfYnVmZnMgKyB0eF9idWZmcykgKworCQl0cmFuc21pdCAqIHJ4X2J1ZmZzICsgZGVzYzsKK30KKworCisKK3N0YXRpYyBpbmxpbmUgdTE2IGRlc2Nfb2Zmc2V0KHBvcnRfdCAqcG9ydCwgdTE2IGRlc2MsIGludCB0cmFuc21pdCkKK3sKKwkvKiBEZXNjcmlwdG9yIG9mZnNldCBhbHdheXMgZml0cyBpbiAxNiBieXRlcyAqLworCXJldHVybiBkZXNjX2Fic19udW1iZXIocG9ydCwgZGVzYywgdHJhbnNtaXQpICogc2l6ZW9mKHBrdF9kZXNjKTsKK30KKworCisKK3N0YXRpYyBpbmxpbmUgcGt0X2Rlc2MgX19pb21lbSAqZGVzY19hZGRyZXNzKHBvcnRfdCAqcG9ydCwgdTE2IGRlc2MsIGludCB0cmFuc21pdCkKK3sKKyNpZmRlZiBQQUdFMF9BTFdBWVNfTUFQUEVECisJcmV0dXJuIChwa3RfZGVzYyBfX2lvbWVtICopKHdpbjBiYXNlKHBvcnRfdG9fY2FyZChwb3J0KSkKKwkJCSAgICsgZGVzY19vZmZzZXQocG9ydCwgZGVzYywgdHJhbnNtaXQpKTsKKyNlbHNlCisJcmV0dXJuIChwa3RfZGVzYyBfX2lvbWVtICopKHdpbmJhc2UocG9ydF90b19jYXJkKHBvcnQpKQorCQkJICAgKyBkZXNjX29mZnNldChwb3J0LCBkZXNjLCB0cmFuc21pdCkpOworI2VuZGlmCit9CisKKworCitzdGF0aWMgaW5saW5lIHUzMiBidWZmZXJfb2Zmc2V0KHBvcnRfdCAqcG9ydCwgdTE2IGRlc2MsIGludCB0cmFuc21pdCkKK3sKKwlyZXR1cm4gcG9ydF90b19jYXJkKHBvcnQpLT5idWZmX29mZnNldCArCisJCWRlc2NfYWJzX251bWJlcihwb3J0LCBkZXNjLCB0cmFuc21pdCkgKiAodTMyKUhETENfTUFYX01SVTsKK30KKworCisKK3N0YXRpYyB2b2lkIHNjYV9pbml0X3N5bmNfcG9ydChwb3J0X3QgKnBvcnQpCit7CisJY2FyZF90ICpjYXJkID0gcG9ydF90b19jYXJkKHBvcnQpOworCWludCB0cmFuc21pdCwgaTsKKworCXBvcnQtPnJ4aW4gPSAwOworCXBvcnQtPnR4aW4gPSAwOworCXBvcnQtPnR4bGFzdCA9IDA7CisKKyNpZiAhZGVmaW5lZChQQUdFMF9BTFdBWVNfTUFQUEVEKSAmJiAhZGVmaW5lZChBTExfUEFHRVNfQUxXQVlTX01BUFBFRCkKKwlvcGVud2luKGNhcmQsIDApOworI2VuZGlmCisKKwlmb3IgKHRyYW5zbWl0ID0gMDsgdHJhbnNtaXQgPCAyOyB0cmFuc21pdCsrKSB7CisJCXUxNiBkbWFjID0gdHJhbnNtaXQgPyBnZXRfZG1hY190eChwb3J0KSA6IGdldF9kbWFjX3J4KHBvcnQpOworCQl1MTYgYnVmZnMgPSB0cmFuc21pdCA/IGNhcmQtPnR4X3JpbmdfYnVmZmVycworCQkJOiBjYXJkLT5yeF9yaW5nX2J1ZmZlcnM7CisKKwkJZm9yIChpID0gMDsgaSA8IGJ1ZmZzOyBpKyspIHsKKwkJCXBrdF9kZXNjIF9faW9tZW0gKmRlc2MgPSBkZXNjX2FkZHJlc3MocG9ydCwgaSwgdHJhbnNtaXQpOworCQkJdTE2IGNoYWluX29mZiA9IGRlc2Nfb2Zmc2V0KHBvcnQsIGkgKyAxLCB0cmFuc21pdCk7CisJCQl1MzIgYnVmZl9vZmYgPSBidWZmZXJfb2Zmc2V0KHBvcnQsIGksIHRyYW5zbWl0KTsKKworCQkJd3JpdGVhKGNoYWluX29mZiwgJmRlc2MtPmNwKTsKKwkJCXdyaXRlbChidWZmX29mZiwgJmRlc2MtPmJwKTsKKwkJCXdyaXRldygwLCAmZGVzYy0+bGVuKTsKKwkJCXdyaXRlYigwLCAmZGVzYy0+c3RhdCk7CisJCX0KKworCQkvKiBETUEgZGlzYWJsZSAtIHRvIGhhbHQgc3RhdGUgKi8KKwkJc2NhX291dCgwLCB0cmFuc21pdCA/IERTUl9UWChwaHlfbm9kZShwb3J0KSkgOgorCQkJRFNSX1JYKHBoeV9ub2RlKHBvcnQpKSwgY2FyZCk7CisJCS8qIHNvZnR3YXJlIEFCT1JUIC0gdG8gaW5pdGlhbCBzdGF0ZSAqLworCQlzY2Ffb3V0KERDUl9BQk9SVCwgdHJhbnNtaXQgPyBEQ1JfVFgocGh5X25vZGUocG9ydCkpIDoKKwkJCURDUl9SWChwaHlfbm9kZShwb3J0KSksIGNhcmQpOworCisjaWZkZWYgX19IRDY0NTcwX0gKKwkJc2NhX291dCgwLCBkbWFjICsgQ1BCLCBjYXJkKTsgLyogcG9pbnRlciBiYXNlICovCisjZW5kaWYKKwkJLyogY3VycmVudCBkZXNjIGFkZHIgKi8KKwkJc2NhX291dGEoZGVzY19vZmZzZXQocG9ydCwgMCwgdHJhbnNtaXQpLCBkbWFjICsgQ0RBTCwgY2FyZCk7CisJCWlmICghdHJhbnNtaXQpCisJCQlzY2Ffb3V0YShkZXNjX29mZnNldChwb3J0LCBidWZmcyAtIDEsIHRyYW5zbWl0KSwKKwkJCQkgZG1hYyArIEVEQUwsIGNhcmQpOworCQllbHNlCisJCQlzY2Ffb3V0YShkZXNjX29mZnNldChwb3J0LCAwLCB0cmFuc21pdCksIGRtYWMgKyBFREFMLAorCQkJCSBjYXJkKTsKKworCQkvKiBjbGVhciBmcmFtZSBlbmQgaW50ZXJydXB0IGNvdW50ZXIgKi8KKwkJc2NhX291dChEQ1JfQ0xFQVJfRU9GLCB0cmFuc21pdCA/IERDUl9UWChwaHlfbm9kZShwb3J0KSkgOgorCQkJRENSX1JYKHBoeV9ub2RlKHBvcnQpKSwgY2FyZCk7CisKKwkJaWYgKCF0cmFuc21pdCkgeyAvKiBSZWNlaXZlICovCisJCQkvKiBzZXQgYnVmZmVyIGxlbmd0aCAqLworCQkJc2NhX291dHcoSERMQ19NQVhfTVJVLCBkbWFjICsgQkZMTCwgY2FyZCk7CisJCQkvKiBDaGFpbiBtb2RlLCBNdWx0aS1mcmFtZSAqLworCQkJc2NhX291dCgweDE0LCBETVJfUlgocGh5X25vZGUocG9ydCkpLCBjYXJkKTsKKwkJCXNjYV9vdXQoRElSX0VPTUUgfCBESVJfQk9GRSwgRElSX1JYKHBoeV9ub2RlKHBvcnQpKSwKKwkJCQljYXJkKTsKKwkJCS8qIERNQSBlbmFibGUgKi8KKwkJCXNjYV9vdXQoRFNSX0RFLCBEU1JfUlgocGh5X25vZGUocG9ydCkpLCBjYXJkKTsKKwkJfSBlbHNlIHsJLyogVHJhbnNtaXQgKi8KKwkJCS8qIENoYWluIG1vZGUsIE11bHRpLWZyYW1lICovCisJCQlzY2Ffb3V0KDB4MTQsIERNUl9UWChwaHlfbm9kZShwb3J0KSksIGNhcmQpOworCQkJLyogZW5hYmxlIHVuZGVyZmxvdyBpbnRlcnJ1cHRzICovCisJCQlzY2Ffb3V0KERJUl9CT0ZFLCBESVJfVFgocGh5X25vZGUocG9ydCkpLCBjYXJkKTsKKwkJfQorCX0KKworCWhkbGNfc2V0X2NhcnJpZXIoIShzY2FfaW4oZ2V0X21zY2kocG9ydCkgKyBTVDMsIGNhcmQpICYgU1QzX0RDRCksCisJCQkgcG9ydF90b19kZXYocG9ydCkpOworfQorCisKKworI2lmZGVmIE5FRURfU0NBX01TQ0lfSU5UUgorLyogTVNDSSBpbnRlcnJ1cHQgc2VydmljZSAqLworc3RhdGljIGlubGluZSB2b2lkIHNjYV9tc2NpX2ludHIocG9ydF90ICpwb3J0KQoreworCXUxNiBtc2NpID0gZ2V0X21zY2kocG9ydCk7CisJY2FyZF90KiBjYXJkID0gcG9ydF90b19jYXJkKHBvcnQpOworCXU4IHN0YXQgPSBzY2FfaW4obXNjaSArIFNUMSwgY2FyZCk7IC8qIHJlYWQgTVNDSSBTVDEgc3RhdHVzICovCisKKwkvKiBSZXNldCBNU0NJIFRYIHVuZGVycnVuIGFuZCBDRENEIHN0YXR1cyBiaXQgKi8KKwlzY2Ffb3V0KHN0YXQgJiAoU1QxX1VEUk4gfCBTVDFfQ0RDRCksIG1zY2kgKyBTVDEsIGNhcmQpOworCisJaWYgKHN0YXQgJiBTVDFfVURSTikgeworCQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKHBvcnRfdG9fZGV2KHBvcnQpKTsKKwkJc3RhdHMtPnR4X2Vycm9ycysrOyAvKiBUWCBVbmRlcnJ1biBlcnJvciBkZXRlY3RlZCAqLworCQlzdGF0cy0+dHhfZmlmb19lcnJvcnMrKzsKKwl9CisKKwlpZiAoc3RhdCAmIFNUMV9DRENEKQorCQloZGxjX3NldF9jYXJyaWVyKCEoc2NhX2luKG1zY2kgKyBTVDMsIGNhcmQpICYgU1QzX0RDRCksCisJCQkJIHBvcnRfdG9fZGV2KHBvcnQpKTsKK30KKyNlbmRpZgorCisKKworc3RhdGljIGlubGluZSB2b2lkIHNjYV9yeChjYXJkX3QgKmNhcmQsIHBvcnRfdCAqcG9ydCwgcGt0X2Rlc2MgX19pb21lbSAqZGVzYywgdTE2IHJ4aW4pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnRfdG9fZGV2KHBvcnQpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUxNiBsZW47CisJdTMyIGJ1ZmY7CisjaWZuZGVmIEFMTF9QQUdFU19BTFdBWVNfTUFQUEVECisJdTMyIG1heGxlbjsKKwl1OCBwYWdlOworI2VuZGlmCisKKwlsZW4gPSByZWFkdygmZGVzYy0+bGVuKTsKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbik7CisJaWYgKCFza2IpIHsKKwkJc3RhdHMtPnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKworCWJ1ZmYgPSBidWZmZXJfb2Zmc2V0KHBvcnQsIHJ4aW4sIDApOworI2lmbmRlZiBBTExfUEFHRVNfQUxXQVlTX01BUFBFRAorCXBhZ2UgPSBidWZmIC8gd2luc2l6ZShjYXJkKTsKKwlidWZmID0gYnVmZiAlIHdpbnNpemUoY2FyZCk7CisJbWF4bGVuID0gd2luc2l6ZShjYXJkKSAtIGJ1ZmY7CisKKwlvcGVud2luKGNhcmQsIHBhZ2UpOworCisJaWYgKGxlbiA+IG1heGxlbikgeworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgd2luYmFzZShjYXJkKSArIGJ1ZmYsIG1heGxlbik7CisJCW9wZW53aW4oY2FyZCwgcGFnZSArIDEpOworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSArIG1heGxlbiwgd2luYmFzZShjYXJkKSwgbGVuIC0gbWF4bGVuKTsKKwl9IGVsc2UKKyNlbmRpZgorCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhLCB3aW5iYXNlKGNhcmQpICsgYnVmZiwgbGVuKTsKKworI2lmICFkZWZpbmVkKFBBR0UwX0FMV0FZU19NQVBQRUQpICYmICFkZWZpbmVkKEFMTF9QQUdFU19BTFdBWVNfTUFQUEVEKQorCS8qIHNlbGVjdCBwa3RfZGVzYyB0YWJsZSBwYWdlIGJhY2sgKi8KKwlvcGVud2luKGNhcmQsIDApOworI2VuZGlmCisJc2tiX3B1dChza2IsIGxlbik7CisjaWZkZWYgREVCVUdfUEtUCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzIFJYKCVpKToiLCBkZXYtPm5hbWUsIHNrYi0+bGVuKTsKKwlkZWJ1Z19mcmFtZShza2IpOworI2VuZGlmCisJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlzdGF0cy0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlza2ItPnByb3RvY29sID0gaGRsY190eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwluZXRpZl9yeChza2IpOworfQorCisKKworLyogUmVjZWl2ZSBETUEgaW50ZXJydXB0IHNlcnZpY2UgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2FfcnhfaW50cihwb3J0X3QgKnBvcnQpCit7CisJdTE2IGRtYWMgPSBnZXRfZG1hY19yeChwb3J0KTsKKwljYXJkX3QgKmNhcmQgPSBwb3J0X3RvX2NhcmQocG9ydCk7CisJdTggc3RhdCA9IHNjYV9pbihEU1JfUlgocGh5X25vZGUocG9ydCkpLCBjYXJkKTsgLyogcmVhZCBETUEgU3RhdHVzICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhwb3J0X3RvX2Rldihwb3J0KSk7CisKKwkvKiBSZXNldCBEU1Igc3RhdHVzIGJpdHMgKi8KKwlzY2Ffb3V0KChzdGF0ICYgKERTUl9FT1QgfCBEU1JfRU9NIHwgRFNSX0JPRiB8IERTUl9DT0YpKSB8IERTUl9EV0UsCisJCURTUl9SWChwaHlfbm9kZShwb3J0KSksIGNhcmQpOworCisJaWYgKHN0YXQgJiBEU1JfQk9GKQorCQlzdGF0cy0+cnhfb3Zlcl9lcnJvcnMrKzsgLyogRHJvcHBlZCBvbmUgb3IgbW9yZSBmcmFtZXMgKi8KKworCXdoaWxlICgxKSB7CisJCXUzMiBkZXNjX29mZiA9IGRlc2Nfb2Zmc2V0KHBvcnQsIHBvcnQtPnJ4aW4sIDApOworCQlwa3RfZGVzYyBfX2lvbWVtICpkZXNjOworCQl1MzIgY2RhID0gc2NhX2luYShkbWFjICsgQ0RBTCwgY2FyZCk7CisKKwkJaWYgKChjZGEgPj0gZGVzY19vZmYpICYmIChjZGEgPCBkZXNjX29mZiArIHNpemVvZihwa3RfZGVzYykpKQorCQkJYnJlYWs7CS8qIE5vIGZyYW1lIHJlY2VpdmVkICovCisKKwkJZGVzYyA9IGRlc2NfYWRkcmVzcyhwb3J0LCBwb3J0LT5yeGluLCAwKTsKKwkJc3RhdCA9IHJlYWRiKCZkZXNjLT5zdGF0KTsKKwkJaWYgKCEoc3RhdCAmIFNUX1JYX0VPTSkpCisJCQlwb3J0LT5yeHBhcnQgPSAxOyAvKiBwYXJ0aWFsIGZyYW1lIHJlY2VpdmVkICovCisJCWVsc2UgaWYgKChzdGF0ICYgU1RfRVJST1JfTUFTSykgfHwgcG9ydC0+cnhwYXJ0KSB7CisJCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCQlpZiAoc3RhdCAmIFNUX1JYX09WRVJSVU4pIHN0YXRzLT5yeF9maWZvX2Vycm9ycysrOworCQkJZWxzZSBpZiAoKHN0YXQgJiAoU1RfUlhfU0hPUlQgfCBTVF9SWF9BQk9SVCB8CisJCQkJCSAgU1RfUlhfUkVTQklUKSkgfHwgcG9ydC0+cnhwYXJ0KQorCQkJCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCWVsc2UgaWYgKHN0YXQgJiBTVF9SWF9DUkMpIHN0YXRzLT5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAoc3RhdCAmIFNUX1JYX0VPTSkKKwkJCQlwb3J0LT5yeHBhcnQgPSAwOyAvKiByZWNlaXZlZCBsYXN0IGZyYWdtZW50ICovCisJCX0gZWxzZQorCQkJc2NhX3J4KGNhcmQsIHBvcnQsIGRlc2MsIHBvcnQtPnJ4aW4pOworCisJCS8qIFNldCBuZXcgZXJyb3IgZGVzY3JpcHRvciBhZGRyZXNzICovCisJCXNjYV9vdXRhKGRlc2Nfb2ZmLCBkbWFjICsgRURBTCwgY2FyZCk7CisJCXBvcnQtPnJ4aW4gPSBuZXh0X2Rlc2MocG9ydCwgcG9ydC0+cnhpbiwgMCk7CisJfQorCisJLyogbWFrZSBzdXJlIFJYIERNQSBpcyBlbmFibGVkICovCisJc2NhX291dChEU1JfREUsIERTUl9SWChwaHlfbm9kZShwb3J0KSksIGNhcmQpOworfQorCisKKworLyogVHJhbnNtaXQgRE1BIGludGVycnVwdCBzZXJ2aWNlICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2NhX3R4X2ludHIocG9ydF90ICpwb3J0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwb3J0X3RvX2Rldihwb3J0KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisJdTE2IGRtYWMgPSBnZXRfZG1hY190eChwb3J0KTsKKwljYXJkX3QqIGNhcmQgPSBwb3J0X3RvX2NhcmQocG9ydCk7CisJdTggc3RhdDsKKworCXNwaW5fbG9jaygmcG9ydC0+bG9jayk7CisKKwlzdGF0ID0gc2NhX2luKERTUl9UWChwaHlfbm9kZShwb3J0KSksIGNhcmQpOyAvKiByZWFkIERNQSBTdGF0dXMgKi8KKworCS8qIFJlc2V0IERTUiBzdGF0dXMgYml0cyAqLworCXNjYV9vdXQoKHN0YXQgJiAoRFNSX0VPVCB8IERTUl9FT00gfCBEU1JfQk9GIHwgRFNSX0NPRikpIHwgRFNSX0RXRSwKKwkJRFNSX1RYKHBoeV9ub2RlKHBvcnQpKSwgY2FyZCk7CisKKwl3aGlsZSAoMSkgeworCQlwa3RfZGVzYyBfX2lvbWVtICpkZXNjOworCisJCXUzMiBkZXNjX29mZiA9IGRlc2Nfb2Zmc2V0KHBvcnQsIHBvcnQtPnR4bGFzdCwgMSk7CisJCXUzMiBjZGEgPSBzY2FfaW5hKGRtYWMgKyBDREFMLCBjYXJkKTsKKwkJaWYgKChjZGEgPj0gZGVzY19vZmYpICYmIChjZGEgPCBkZXNjX29mZiArIHNpemVvZihwa3RfZGVzYykpKQorCQkJYnJlYWs7CS8qIFRyYW5zbWl0dGVyIGlzL3dpbGxfYmUgc2VuZGluZyB0aGlzIGZyYW1lICovCisKKwkJZGVzYyA9IGRlc2NfYWRkcmVzcyhwb3J0LCBwb3J0LT50eGxhc3QsIDEpOworCQlzdGF0cy0+dHhfcGFja2V0cysrOworCQlzdGF0cy0+dHhfYnl0ZXMgKz0gcmVhZHcoJmRlc2MtPmxlbik7CisJCXdyaXRlYigwLCAmZGVzYy0+c3RhdCk7CS8qIEZyZWUgZGVzY3JpcHRvciAqLworCQlwb3J0LT50eGxhc3QgPSBuZXh0X2Rlc2MocG9ydCwgcG9ydC0+dHhsYXN0LCAxKTsKKwl9CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOworfQorCisKKworc3RhdGljIGlycXJldHVybl90IHNjYV9pbnRyKGludCBpcnEsIHZvaWQqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJY2FyZF90ICpjYXJkID0gZGV2X2lkOworCWludCBpOworCXU4IHN0YXQ7CisJaW50IGhhbmRsZWQgPSAwOworCisjaWZuZGVmIEFMTF9QQUdFU19BTFdBWVNfTUFQUEVECisJdTggcGFnZSA9IHNjYV9nZXRfcGFnZShjYXJkKTsKKyNlbmRpZgorCisJd2hpbGUoKHN0YXQgPSBzY2FfaW50cl9zdGF0dXMoY2FyZCkpICE9IDApIHsKKwkJaGFuZGxlZCA9IDE7CisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCXBvcnRfdCAqcG9ydCA9IGdldF9wb3J0KGNhcmQsIGkpOworCQkJaWYgKHBvcnQpIHsKKwkJCQlpZiAoc3RhdCAmIFNDQV9JTlRSX01TQ0koaSkpCisJCQkJCXNjYV9tc2NpX2ludHIocG9ydCk7CisKKwkJCQlpZiAoc3RhdCAmIFNDQV9JTlRSX0RNQUNfUlgoaSkpCisJCQkJCXNjYV9yeF9pbnRyKHBvcnQpOworCisJCQkJaWYgKHN0YXQgJiBTQ0FfSU5UUl9ETUFDX1RYKGkpKQorCQkJCQlzY2FfdHhfaW50cihwb3J0KTsKKwkJCX0KKwkJfQorCX0KKworI2lmbmRlZiBBTExfUEFHRVNfQUxXQVlTX01BUFBFRAorCW9wZW53aW4oY2FyZCwgcGFnZSk7CQkvKiBSZXN0b3JlIG9yaWdpbmFsIHBhZ2UgKi8KKyNlbmRpZgorCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisKKworc3RhdGljIHZvaWQgc2NhX3NldF9wb3J0KHBvcnRfdCAqcG9ydCkKK3sKKwljYXJkX3QqIGNhcmQgPSBwb3J0X3RvX2NhcmQocG9ydCk7CisJdTE2IG1zY2kgPSBnZXRfbXNjaShwb3J0KTsKKwl1OCBtZDIgPSBzY2FfaW4obXNjaSArIE1EMiwgY2FyZCk7CisJdW5zaWduZWQgaW50IHRtYywgYnIgPSAxMCwgYnJ2ID0gMTAyNDsKKworCisJaWYgKHBvcnQtPnNldHRpbmdzLmNsb2NrX3JhdGUgPiAwKSB7CisJCS8qIFRyeSBsb3dlciBiciBmb3IgYmV0dGVyIGFjY3VyYWN5Ki8KKwkJZG8geworCQkJYnItLTsKKwkJCWJydiA+Pj0gMTsgLyogYnJ2ID0gMl45ID0gNTEyIG1heCBpbiBzcGVjcyAqLworCisJCQkvKiBCYXVkIFJhdGUgPSBDTE9DS19CQVNFIC8gVE1DIC8gMl5CUiAqLworCQkJdG1jID0gQ0xPQ0tfQkFTRSAvIGJydiAvIHBvcnQtPnNldHRpbmdzLmNsb2NrX3JhdGU7CisJCX13aGlsZSAoYnIgPiAxICYmIHRtYyA8PSAxMjgpOworCisJCWlmICh0bWMgPCAxKSB7CisJCQl0bWMgPSAxOworCQkJYnIgPSAwOwkvKiBGb3IgYmF1ZD1DTE9DS19CQVNFIHdlIHVzZSB0bWM9MSBicj0wICovCisJCQlicnYgPSAxOworCQl9IGVsc2UgaWYgKHRtYyA+IDI1NSkKKwkJCXRtYyA9IDI1NjsgLyogdG1jPTAgbWVhbnMgMjU2IC0gbG93IGJhdWQgcmF0ZXMgKi8KKworCQlwb3J0LT5zZXR0aW5ncy5jbG9ja19yYXRlID0gQ0xPQ0tfQkFTRSAvIGJydiAvIHRtYzsKKwl9IGVsc2UgeworCQliciA9IDk7IC8qIE1pbmltdW0gY2xvY2sgcmF0ZSAqLworCQl0bWMgPSAyNTY7CS8qIDhiaXQgPSAwICovCisJCXBvcnQtPnNldHRpbmdzLmNsb2NrX3JhdGUgPSBDTE9DS19CQVNFIC8gKDI1NiAqIDUxMik7CisJfQorCisJcG9ydC0+cnhzID0gKHBvcnQtPnJ4cyAmIH5DTEtfQlJHX01BU0spIHwgYnI7CisJcG9ydC0+dHhzID0gKHBvcnQtPnR4cyAmIH5DTEtfQlJHX01BU0spIHwgYnI7CisJcG9ydC0+dG1jID0gdG1jOworCisJLyogYmF1ZCBkaXZpc29yIC0gdGltZSBjb25zdGFudCovCisjaWZkZWYgX19IRDY0NTcwX0gKKwlzY2Ffb3V0KHBvcnQtPnRtYywgbXNjaSArIFRNQywgY2FyZCk7CisjZWxzZQorCXNjYV9vdXQocG9ydC0+dG1jLCBtc2NpICsgVE1DUiwgY2FyZCk7CisJc2NhX291dChwb3J0LT50bWMsIG1zY2kgKyBUTUNULCBjYXJkKTsKKyNlbmRpZgorCisJLyogU2V0IEJSRyBiaXRzICovCisJc2NhX291dChwb3J0LT5yeHMsIG1zY2kgKyBSWFMsIGNhcmQpOworCXNjYV9vdXQocG9ydC0+dHhzLCBtc2NpICsgVFhTLCBjYXJkKTsKKworCWlmIChwb3J0LT5zZXR0aW5ncy5sb29wYmFjaykKKwkJbWQyIHw9IE1EMl9MT09QQkFDSzsKKwllbHNlCisJCW1kMiAmPSB+TUQyX0xPT1BCQUNLOworCisJc2NhX291dChtZDIsIG1zY2kgKyBNRDIsIGNhcmQpOworCit9CisKKworCitzdGF0aWMgdm9pZCBzY2Ffb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBvcnRfdCAqcG9ydCA9IGRldl90b19wb3J0KGRldik7CisJY2FyZF90KiBjYXJkID0gcG9ydF90b19jYXJkKHBvcnQpOworCXUxNiBtc2NpID0gZ2V0X21zY2kocG9ydCk7CisJdTggbWQwLCBtZDI7CisKKwlzd2l0Y2gocG9ydC0+ZW5jb2RpbmcpIHsKKwljYXNlIEVOQ09ESU5HX05SWjoJbWQyID0gTUQyX05SWjsJCWJyZWFrOworCWNhc2UgRU5DT0RJTkdfTlJaSToJbWQyID0gTUQyX05SWkk7CQlicmVhazsKKwljYXNlIEVOQ09ESU5HX0ZNX01BUks6CW1kMiA9IE1EMl9GTV9NQVJLOwlicmVhazsKKwljYXNlIEVOQ09ESU5HX0ZNX1NQQUNFOgltZDIgPSBNRDJfRk1fU1BBQ0U7CWJyZWFrOworCWRlZmF1bHQ6CQltZDIgPSBNRDJfTUFOQ0hFU1RFUjsKKwl9CisKKwlpZiAocG9ydC0+c2V0dGluZ3MubG9vcGJhY2spCisJCW1kMiB8PSBNRDJfTE9PUEJBQ0s7CisKKwlzd2l0Y2gocG9ydC0+cGFyaXR5KSB7CisJY2FzZSBQQVJJVFlfQ1JDMTZfUFIwOgkgICAgIG1kMCA9IE1EMF9IRExDIHwgTUQwX0NSQ18xNl8wOyAgYnJlYWs7CisJY2FzZSBQQVJJVFlfQ1JDMTZfUFIxOgkgICAgIG1kMCA9IE1EMF9IRExDIHwgTUQwX0NSQ18xNjsgICAgYnJlYWs7CisjaWZkZWYgX19IRDY0NTcwX0gKKwljYXNlIFBBUklUWV9DUkMxNl9QUjBfQ0NJVFQ6IG1kMCA9IE1EMF9IRExDIHwgTUQwX0NSQ19JVFVfMDsgYnJlYWs7CisjZWxzZQorCWNhc2UgUEFSSVRZX0NSQzMyX1BSMV9DQ0lUVDogbWQwID0gTUQwX0hETEMgfCBNRDBfQ1JDX0lUVTMyOyBicmVhazsKKyNlbmRpZgorCWNhc2UgUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVDogbWQwID0gTUQwX0hETEMgfCBNRDBfQ1JDX0lUVTsgICBicmVhazsKKwlkZWZhdWx0OgkJICAgICBtZDAgPSBNRDBfSERMQyB8IE1EMF9DUkNfTk9ORTsKKwl9CisKKwlzY2Ffb3V0KENNRF9SRVNFVCwgbXNjaSArIENNRCwgY2FyZCk7CisJc2NhX291dChtZDAsIG1zY2kgKyBNRDAsIGNhcmQpOworCXNjYV9vdXQoMHgwMCwgbXNjaSArIE1EMSwgY2FyZCk7IC8qIG5vIGFkZHJlc3MgZmllbGQgY2hlY2sgKi8KKwlzY2Ffb3V0KG1kMiwgbXNjaSArIE1EMiwgY2FyZCk7CisJc2NhX291dCgweDdFLCBtc2NpICsgSURMLCBjYXJkKTsgLyogZmxhZyBjaGFyYWN0ZXIgMHg3RSAqLworI2lmZGVmIF9fSEQ2NDU3MF9ICisJc2NhX291dChDVExfSURMRSwgbXNjaSArIENUTCwgY2FyZCk7CisjZWxzZQorCS8qIFNraXAgdGhlIHJlc3Qgb2YgdW5kZXJydW4gZnJhbWUgKi8KKwlzY2Ffb3V0KENUTF9JRExFIHwgQ1RMX1VSQ1QgfCBDVExfVVJTS1AsIG1zY2kgKyBDVEwsIGNhcmQpOworI2VuZGlmCisKKyNpZmRlZiBfX0hENjQ1NzBfSAorCS8qIEFsbG93IGF0IGxlYXN0IDggYnl0ZXMgYmVmb3JlIHJlcXVlc3RpbmcgUlggRE1BIG9wZXJhdGlvbiAqLworCS8qIFRYIHdpdGggaGlnaGVyIHByaW9yaXR5IGFuZCBwb3NzaWJseSB3aXRoIHNob3J0ZXIgdHJhbnNmZXJzICovCisJc2NhX291dCgweDA3LCBtc2NpICsgUlJDLCBjYXJkKTsgLyogKzE9UlhSRFkvRE1BIGFjdGl2YXRpb24gY29uZGl0aW9uKi8KKwlzY2Ffb3V0KDB4MTAsIG1zY2kgKyBUUkMwLCBjYXJkKTsgLyogPSBUWFJEWS9ETUEgYWN0aXZhdGlvbiBjb25kaXRpb24qLworCXNjYV9vdXQoMHgxNCwgbXNjaSArIFRSQzEsIGNhcmQpOyAvKiArMT1UWFJEWS9ETUEgZGVhY3RpdiBjb25kaXRpb24gKi8KKyNlbHNlCisJc2NhX291dCgweDBGLCBtc2NpICsgUk5SLCBjYXJkKTsgLyogKzE9UlggRE1BIGFjdGl2YXRpb24gY29uZGl0aW9uICovCisJc2NhX291dCgweDNDLCBtc2NpICsgVEZTLCBjYXJkKTsgLyogKzEgPSBUWCBzdGFydCAqLworCXNjYV9vdXQoMHgzOCwgbXNjaSArIFRDUiwgY2FyZCk7IC8qID1Dcml0aWNhbCBUWCBETUEgYWN0aXYgY29uZGl0aW9uICovCisJc2NhX291dCgweDM4LCBtc2NpICsgVE5SMCwgY2FyZCk7IC8qID1UWCBETUEgYWN0aXZhdGlvbiBjb25kaXRpb24gKi8KKwlzY2Ffb3V0KDB4M0YsIG1zY2kgKyBUTlIxLCBjYXJkKTsgLyogKzE9VFggRE1BIGRlYWN0aXZhdGlvbiBjb25kaXRpb24qLworI2VuZGlmCisKKy8qIFdlJ3JlIHVzaW5nIHRoZSBmb2xsb3dpbmcgaW50ZXJydXB0czoKKyAgIC0gVFhJTlQgKERNQUMgY29tcGxldGVkIGFsbCB0cmFuc21pc2lvbnMsIHVuZGVycnVuIG9yIERDRCBjaGFuZ2UpCisgICAtIGFsbCBETUEgaW50ZXJydXB0cworKi8KKworCWhkbGNfc2V0X2NhcnJpZXIoIShzY2FfaW4obXNjaSArIFNUMywgY2FyZCkgJiBTVDNfRENEKSwgZGV2KTsKKworI2lmZGVmIF9fSEQ2NDU3MF9ICisJLyogTVNDSSBUWCBJTlQgYW5kIFJYIElOVCBBIElSUSBlbmFibGUgKi8KKwlzY2Ffb3V0KElFMF9UWElOVCB8IElFMF9SWElOVEEsIG1zY2kgKyBJRTAsIGNhcmQpOworCXNjYV9vdXQoSUUxX1VEUk4gfCBJRTFfQ0RDRCwgbXNjaSArIElFMSwgY2FyZCk7CisJc2NhX291dChzY2FfaW4oSUVSMCwgY2FyZCkgfCAocGh5X25vZGUocG9ydCkgPyAweEMwIDogMHgwQyksCisJCUlFUjAsIGNhcmQpOyAvKiBUWElOVCBhbmQgUlhJTlQgKi8KKwkvKiBlbmFibGUgRE1BIElSUSAqLworCXNjYV9vdXQoc2NhX2luKElFUjEsIGNhcmQpIHwgKHBoeV9ub2RlKHBvcnQpID8gMHhGMCA6IDB4MEYpLAorCQlJRVIxLCBjYXJkKTsKKyNlbHNlCisJLyogTVNDSSBUWElOVCBhbmQgUlhJTlRBIGludGVycnVwdCBlbmFibGUgKi8KKwlzY2Ffb3V0bChJRTBfVFhJTlQgfCBJRTBfUlhJTlRBIHwgSUUwX1VEUk4gfCBJRTBfQ0RDRCwgbXNjaSArIElFMCwKKwkJIGNhcmQpOworCS8qIERNQSAmIE1TQ0kgSVJRIGVuYWJsZSAqLworCXNjYV9vdXRsKHNjYV9pbmwoSUVSMCwgY2FyZCkgfAorCQkgKHBoeV9ub2RlKHBvcnQpID8gMHgwQTAwNjYwMCA6IDB4MDAwQTAwNjYpLCBJRVIwLCBjYXJkKTsKKyNlbmRpZgorCisjaWZkZWYgX19IRDY0NTcwX0gKKwlzY2Ffb3V0KHBvcnQtPnRtYywgbXNjaSArIFRNQywgY2FyZCk7IC8qIFJlc3RvcmUgcmVnaXN0ZXJzICovCisjZWxzZQorCXNjYV9vdXQocG9ydC0+dG1jLCBtc2NpICsgVE1DUiwgY2FyZCk7CisJc2NhX291dChwb3J0LT50bWMsIG1zY2kgKyBUTUNULCBjYXJkKTsKKyNlbmRpZgorCXNjYV9vdXQocG9ydC0+cnhzLCBtc2NpICsgUlhTLCBjYXJkKTsKKwlzY2Ffb3V0KHBvcnQtPnR4cywgbXNjaSArIFRYUywgY2FyZCk7CisJc2NhX291dChDTURfVFhfRU5BQkxFLCBtc2NpICsgQ01ELCBjYXJkKTsKKwlzY2Ffb3V0KENNRF9SWF9FTkFCTEUsIG1zY2kgKyBDTUQsIGNhcmQpOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKK30KKworCisKK3N0YXRpYyB2b2lkIHNjYV9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBvcnRfdCAqcG9ydCA9IGRldl90b19wb3J0KGRldik7CisJY2FyZF90KiBjYXJkID0gcG9ydF90b19jYXJkKHBvcnQpOworCisJLyogcmVzZXQgY2hhbm5lbCAqLworCXNjYV9vdXQoQ01EX1JFU0VULCBnZXRfbXNjaShwb3J0KSArIENNRCwgcG9ydF90b19jYXJkKHBvcnQpKTsKKyNpZmRlZiBfX0hENjQ1NzBfSAorCS8qIGRpc2FibGUgTVNDSSBpbnRlcnJ1cHRzICovCisJc2NhX291dChzY2FfaW4oSUVSMCwgY2FyZCkgJiAocGh5X25vZGUocG9ydCkgPyAweDBGIDogMHhGMCksCisJCUlFUjAsIGNhcmQpOworCS8qIGRpc2FibGUgRE1BIGludGVycnVwdHMgKi8KKwlzY2Ffb3V0KHNjYV9pbihJRVIxLCBjYXJkKSAmIChwaHlfbm9kZShwb3J0KSA/IDB4MEYgOiAweEYwKSwKKwkJSUVSMSwgY2FyZCk7CisjZWxzZQorCS8qIGRpc2FibGUgRE1BICYgTVNDSSBJUlEgKi8KKwlzY2Ffb3V0bChzY2FfaW5sKElFUjAsIGNhcmQpICYKKwkJIChwaHlfbm9kZShwb3J0KSA/IDB4MDBGRjAwRkYgOiAweEZGMDBGRjAwKSwgSUVSMCwgY2FyZCk7CisjZW5kaWYKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7Cit9CisKKworCitzdGF0aWMgaW50IHNjYV9hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgZW5jb2RpbmcsCisJCSAgICAgIHVuc2lnbmVkIHNob3J0IHBhcml0eSkKK3sKKwlpZiAoZW5jb2RpbmcgIT0gRU5DT0RJTkdfTlJaICYmCisJICAgIGVuY29kaW5nICE9IEVOQ09ESU5HX05SWkkgJiYKKwkgICAgZW5jb2RpbmcgIT0gRU5DT0RJTkdfRk1fTUFSSyAmJgorCSAgICBlbmNvZGluZyAhPSBFTkNPRElOR19GTV9TUEFDRSAmJgorCSAgICBlbmNvZGluZyAhPSBFTkNPRElOR19NQU5DSEVTVEVSKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwYXJpdHkgIT0gUEFSSVRZX05PTkUgJiYKKwkgICAgcGFyaXR5ICE9IFBBUklUWV9DUkMxNl9QUjAgJiYKKwkgICAgcGFyaXR5ICE9IFBBUklUWV9DUkMxNl9QUjEgJiYKKyNpZmRlZiBfX0hENjQ1NzBfSAorCSAgICBwYXJpdHkgIT0gUEFSSVRZX0NSQzE2X1BSMF9DQ0lUVCAmJgorI2Vsc2UKKwkgICAgcGFyaXR5ICE9IFBBUklUWV9DUkMzMl9QUjFfQ0NJVFQgJiYKKyNlbmRpZgorCSAgICBwYXJpdHkgIT0gUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXZfdG9fcG9ydChkZXYpLT5lbmNvZGluZyA9IGVuY29kaW5nOworCWRldl90b19wb3J0KGRldiktPnBhcml0eSA9IHBhcml0eTsKKwlyZXR1cm4gMDsKK30KKworCisKKyNpZmRlZiBERUJVR19SSU5HUworc3RhdGljIHZvaWQgc2NhX2R1bXBfcmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwb3J0X3QgKnBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCWNhcmRfdCAqY2FyZCA9IHBvcnRfdG9fY2FyZChwb3J0KTsKKwl1MTYgY250OworI2lmICFkZWZpbmVkKFBBR0UwX0FMV0FZU19NQVBQRUQpICYmICFkZWZpbmVkKEFMTF9QQUdFU19BTFdBWVNfTUFQUEVEKQorCXU4IHBhZ2U7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFBBR0UwX0FMV0FZU19NQVBQRUQpICYmICFkZWZpbmVkKEFMTF9QQUdFU19BTFdBWVNfTUFQUEVEKQorCXBhZ2UgPSBzY2FfZ2V0X3BhZ2UoY2FyZCk7CisJb3BlbndpbihjYXJkLCAwKTsKKyNlbmRpZgorCisJcHJpbnRrKEtFUk5fREVCVUcgIlJYIHJpbmc6IENEQT0ldSBFREE9JXUgRFNSPSUwMlggaW49JXUgJXNhY3RpdmUiLAorCSAgICAgICBzY2FfaW5hKGdldF9kbWFjX3J4KHBvcnQpICsgQ0RBTCwgY2FyZCksCisJICAgICAgIHNjYV9pbmEoZ2V0X2RtYWNfcngocG9ydCkgKyBFREFMLCBjYXJkKSwKKwkgICAgICAgc2NhX2luKERTUl9SWChwaHlfbm9kZShwb3J0KSksIGNhcmQpLCBwb3J0LT5yeGluLAorCSAgICAgICBzY2FfaW4oRFNSX1JYKHBoeV9ub2RlKHBvcnQpKSwgY2FyZCkgJiBEU1JfREU/IiI6ImluIik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBwb3J0X3RvX2NhcmQocG9ydCktPnJ4X3JpbmdfYnVmZmVyczsgY250KyspCisJCXByaW50aygiICUwMlgiLCByZWFkYigmKGRlc2NfYWRkcmVzcyhwb3J0LCBjbnQsIDApLT5zdGF0KSkpOworCisJcHJpbnRrKCJcbiIgS0VSTl9ERUJVRyAiVFggcmluZzogQ0RBPSV1IEVEQT0ldSBEU1I9JTAyWCBpbj0ldSAiCisJICAgICAgICJsYXN0PSV1ICVzYWN0aXZlIiwKKwkgICAgICAgc2NhX2luYShnZXRfZG1hY190eChwb3J0KSArIENEQUwsIGNhcmQpLAorCSAgICAgICBzY2FfaW5hKGdldF9kbWFjX3R4KHBvcnQpICsgRURBTCwgY2FyZCksCisJICAgICAgIHNjYV9pbihEU1JfVFgocGh5X25vZGUocG9ydCkpLCBjYXJkKSwgcG9ydC0+dHhpbiwgcG9ydC0+dHhsYXN0LAorCSAgICAgICBzY2FfaW4oRFNSX1RYKHBoeV9ub2RlKHBvcnQpKSwgY2FyZCkgJiBEU1JfREUgPyAiIiA6ICJpbiIpOworCisJZm9yIChjbnQgPSAwOyBjbnQgPCBwb3J0X3RvX2NhcmQocG9ydCktPnR4X3JpbmdfYnVmZmVyczsgY250KyspCisJCXByaW50aygiICUwMlgiLCByZWFkYigmKGRlc2NfYWRkcmVzcyhwb3J0LCBjbnQsIDEpLT5zdGF0KSkpOworCXByaW50aygiXG4iKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJNU0NJOiBNRDogJTAyeCAlMDJ4ICUwMngsICIKKwkgICAgICAgIlNUOiAlMDJ4ICUwMnggJTAyeCAlMDJ4IgorI2lmZGVmIF9fSEQ2NDU3Ml9ICisJICAgICAgICIgJTAyeCIKKyNlbmRpZgorCSAgICAgICAiLCBGU1Q6ICUwMnggQ1NUOiAlMDJ4ICUwMnhcbiIsCisJICAgICAgIHNjYV9pbihnZXRfbXNjaShwb3J0KSArIE1EMCwgY2FyZCksCisJICAgICAgIHNjYV9pbihnZXRfbXNjaShwb3J0KSArIE1EMSwgY2FyZCksCisJICAgICAgIHNjYV9pbihnZXRfbXNjaShwb3J0KSArIE1EMiwgY2FyZCksCisJICAgICAgIHNjYV9pbihnZXRfbXNjaShwb3J0KSArIFNUMCwgY2FyZCksCisJICAgICAgIHNjYV9pbihnZXRfbXNjaShwb3J0KSArIFNUMSwgY2FyZCksCisJICAgICAgIHNjYV9pbihnZXRfbXNjaShwb3J0KSArIFNUMiwgY2FyZCksCisJICAgICAgIHNjYV9pbihnZXRfbXNjaShwb3J0KSArIFNUMywgY2FyZCksCisjaWZkZWYgX19IRDY0NTcyX0gKKwkgICAgICAgc2NhX2luKGdldF9tc2NpKHBvcnQpICsgU1Q0LCBjYXJkKSwKKyNlbmRpZgorCSAgICAgICBzY2FfaW4oZ2V0X21zY2kocG9ydCkgKyBGU1QsIGNhcmQpLAorCSAgICAgICBzY2FfaW4oZ2V0X21zY2kocG9ydCkgKyBDU1QwLCBjYXJkKSwKKwkgICAgICAgc2NhX2luKGdldF9tc2NpKHBvcnQpICsgQ1NUMSwgY2FyZCkpOworCisjaWZkZWYgX19IRDY0NTcyX0gKKwlwcmludGsoS0VSTl9ERUJVRyAiSUxBUjogJTAyeCBJU1I6ICUwOHggJTA4eFxuIiwgc2NhX2luKElMQVIsIGNhcmQpLAorCSAgICAgICBzY2FfaW5sKElTUjAsIGNhcmQpLCBzY2FfaW5sKElTUjEsIGNhcmQpKTsKKyNlbHNlCisJcHJpbnRrKEtFUk5fREVCVUcgIklTUjogJTAyeCAlMDJ4ICUwMnhcbiIsIHNjYV9pbihJU1IwLCBjYXJkKSwKKwkgICAgICAgc2NhX2luKElTUjEsIGNhcmQpLCBzY2FfaW4oSVNSMiwgY2FyZCkpOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChQQUdFMF9BTFdBWVNfTUFQUEVEKSAmJiAhZGVmaW5lZChBTExfUEFHRVNfQUxXQVlTX01BUFBFRCkKKwlvcGVud2luKGNhcmQsIHBhZ2UpOyAvKiBSZXN0b3JlIG9yaWdpbmFsIHBhZ2UgKi8KKyNlbmRpZgorfQorI2VuZGlmIC8qIERFQlVHX1JJTkdTICovCisKKworCitzdGF0aWMgaW50IHNjYV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcG9ydF90ICpwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwljYXJkX3QgKmNhcmQgPSBwb3J0X3RvX2NhcmQocG9ydCk7CisJcGt0X2Rlc2MgX19pb21lbSAqZGVzYzsKKwl1MzIgYnVmZiwgbGVuOworI2lmbmRlZiBBTExfUEFHRVNfQUxXQVlTX01BUFBFRAorCXU4IHBhZ2U7CisJdTMyIG1heGxlbjsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycSgmcG9ydC0+bG9jayk7CisKKwlkZXNjID0gZGVzY19hZGRyZXNzKHBvcnQsIHBvcnQtPnR4aW4gKyAxLCAxKTsKKwlpZiAocmVhZGIoJmRlc2MtPnN0YXQpKSB7IC8qIGFsbG93IDEgcGFja2V0IGdhcCAqLworCQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuIC0gcHJldmlvdXMgeG1pdCBzaG91bGQgc3RvcCBxdWV1ZSAqLworI2lmZGVmIERFQlVHX1BLVAorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHRyYW5zbWl0dGVyIGJ1ZmZlciBmdWxsXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwb3J0LT5sb2NrKTsKKwkJcmV0dXJuIDE7CS8qIHJlcXVlc3QgcGFja2V0IHRvIGJlIHF1ZXVlZCAqLworCX0KKworI2lmZGVmIERFQlVHX1BLVAorCXByaW50ayhLRVJOX0RFQlVHICIlcyBUWCglaSk6IiwgZGV2LT5uYW1lLCBza2ItPmxlbik7CisJZGVidWdfZnJhbWUoc2tiKTsKKyNlbmRpZgorCisJZGVzYyA9IGRlc2NfYWRkcmVzcyhwb3J0LCBwb3J0LT50eGluLCAxKTsKKwlidWZmID0gYnVmZmVyX29mZnNldChwb3J0LCBwb3J0LT50eGluLCAxKTsKKwlsZW4gPSBza2ItPmxlbjsKKyNpZm5kZWYgQUxMX1BBR0VTX0FMV0FZU19NQVBQRUQKKwlwYWdlID0gYnVmZiAvIHdpbnNpemUoY2FyZCk7CisJYnVmZiA9IGJ1ZmYgJSB3aW5zaXplKGNhcmQpOworCW1heGxlbiA9IHdpbnNpemUoY2FyZCkgLSBidWZmOworCisJb3BlbndpbihjYXJkLCBwYWdlKTsKKwlpZiAobGVuID4gbWF4bGVuKSB7CisJCW1lbWNweV90b2lvKHdpbmJhc2UoY2FyZCkgKyBidWZmLCBza2ItPmRhdGEsIG1heGxlbik7CisJCW9wZW53aW4oY2FyZCwgcGFnZSArIDEpOworCQltZW1jcHlfdG9pbyh3aW5iYXNlKGNhcmQpLCBza2ItPmRhdGEgKyBtYXhsZW4sIGxlbiAtIG1heGxlbik7CisJfQorCWVsc2UKKyNlbmRpZgorCQltZW1jcHlfdG9pbyh3aW5iYXNlKGNhcmQpICsgYnVmZiwgc2tiLT5kYXRhLCBsZW4pOworCisjaWYgIWRlZmluZWQoUEFHRTBfQUxXQVlTX01BUFBFRCkgJiYgIWRlZmluZWQoQUxMX1BBR0VTX0FMV0FZU19NQVBQRUQpCisJb3BlbndpbihjYXJkLCAwKTsJLyogc2VsZWN0IHBrdF9kZXNjIHRhYmxlIHBhZ2UgYmFjayAqLworI2VuZGlmCisJd3JpdGV3KGxlbiwgJmRlc2MtPmxlbik7CisJd3JpdGViKFNUX1RYX0VPTSwgJmRlc2MtPnN0YXQpOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJcG9ydC0+dHhpbiA9IG5leHRfZGVzYyhwb3J0LCBwb3J0LT50eGluLCAxKTsKKwlzY2Ffb3V0YShkZXNjX29mZnNldChwb3J0LCBwb3J0LT50eGluLCAxKSwKKwkJIGdldF9kbWFjX3R4KHBvcnQpICsgRURBTCwgY2FyZCk7CisKKwlzY2Ffb3V0KERTUl9ERSwgRFNSX1RYKHBoeV9ub2RlKHBvcnQpKSwgY2FyZCk7IC8qIEVuYWJsZSBUWCBETUEgKi8KKworCWRlc2MgPSBkZXNjX2FkZHJlc3MocG9ydCwgcG9ydC0+dHhpbiArIDEsIDEpOworCWlmIChyZWFkYigmZGVzYy0+c3RhdCkpIC8qIGFsbG93IDEgcGFja2V0IGdhcCAqLworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlzcGluX3VubG9ja19pcnEoJnBvcnQtPmxvY2spOworCisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCisKKworI2lmZGVmIE5FRURfREVURUNUX1JBTQorc3RhdGljIHUzMiBfX2RldmluaXQgc2NhX2RldGVjdF9yYW0oY2FyZF90ICpjYXJkLCB1OCBfX2lvbWVtICpyYW1iYXNlLCB1MzIgcmFtc2l6ZSkKK3sKKwkvKiBSb3VuZCBSQU0gc2l6ZSB0byAzMiBiaXRzLCBmaWxsIGZyb20gZW5kIHRvIHN0YXJ0ICovCisJdTMyIGkgPSByYW1zaXplICY9IH4zOworCisjaWZuZGVmIEFMTF9QQUdFU19BTFdBWVNfTUFQUEVECisJdTMyIHNpemUgPSB3aW5zaXplKGNhcmQpOworCisJb3BlbndpbihjYXJkLCAoaSAtIDQpIC8gc2l6ZSk7IC8qIHNlbGVjdCBsYXN0IHdpbmRvdyAqLworI2VuZGlmCisJZG8geworCQlpIC09IDQ7CisjaWZuZGVmIEFMTF9QQUdFU19BTFdBWVNfTUFQUEVECisJCWlmICgoaSArIDQpICUgc2l6ZSA9PSAwKQorCQkJb3BlbndpbihjYXJkLCBpIC8gc2l6ZSk7CisJCXdyaXRlbChpIF4gMHgxMjM0NTY3OCwgcmFtYmFzZSArIGkgJSBzaXplKTsKKyNlbHNlCisJCXdyaXRlbChpIF4gMHgxMjM0NTY3OCwgcmFtYmFzZSArIGkpOworI2VuZGlmCisJfXdoaWxlIChpID4gMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmFtc2l6ZSA7IGkgKz0gNCkgeworI2lmbmRlZiBBTExfUEFHRVNfQUxXQVlTX01BUFBFRAorCQlpZiAoaSAlIHNpemUgPT0gMCkKKwkJCW9wZW53aW4oY2FyZCwgaSAvIHNpemUpOworCisJCWlmIChyZWFkbChyYW1iYXNlICsgaSAlIHNpemUpICE9IChpIF4gMHgxMjM0NTY3OCkpCisJCQlicmVhazsKKyNlbHNlCisJCWlmIChyZWFkbChyYW1iYXNlICsgaSkgIT0gKGkgXiAweDEyMzQ1Njc4KSkKKwkJCWJyZWFrOworI2VuZGlmCisJfQorCisJcmV0dXJuIGk7Cit9CisjZW5kaWYgLyogTkVFRF9ERVRFQ1RfUkFNICovCisKKworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc2NhX2luaXQoY2FyZF90ICpjYXJkLCBpbnQgd2FpdF9zdGF0ZXMpCit7CisJc2NhX291dCh3YWl0X3N0YXRlcywgV0NSTCwgY2FyZCk7IC8qIFdhaXQgQ29udHJvbCAqLworCXNjYV9vdXQod2FpdF9zdGF0ZXMsIFdDUk0sIGNhcmQpOworCXNjYV9vdXQod2FpdF9zdGF0ZXMsIFdDUkgsIGNhcmQpOworCisJc2NhX291dCgwLCBETUVSLCBjYXJkKTsJLyogRE1BIE1hc3RlciBkaXNhYmxlICovCisJc2NhX291dCgweDAzLCBQQ1IsIGNhcmQpOyAvKiBETUEgcHJpb3JpdHkgKi8KKwlzY2Ffb3V0KDAsIERTUl9SWCgwKSwgY2FyZCk7IC8qIERNQSBkaXNhYmxlIC0gdG8gaGFsdCBzdGF0ZSAqLworCXNjYV9vdXQoMCwgRFNSX1RYKDApLCBjYXJkKTsKKwlzY2Ffb3V0KDAsIERTUl9SWCgxKSwgY2FyZCk7CisJc2NhX291dCgwLCBEU1JfVFgoMSksIGNhcmQpOworCXNjYV9vdXQoRE1FUl9ETUUsIERNRVIsIGNhcmQpOyAvKiBETUEgTWFzdGVyIGVuYWJsZSAqLworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfY2lzY28uYyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2Npc2NvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFiNjg5NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2Npc2NvLmMKQEAgLTAsMCArMSwzMzAgQEAKKy8qCisgKiBHZW5lcmljIEhETEMgc3VwcG9ydCByb3V0aW5lcyBmb3IgTGludXgKKyAqIENpc2NvIEhETEMgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDMgS3J6eXN6dG9mIEhhbGFzYSA8a2hjQHBtLndhdy5wbD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9sYXBiLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaGRsYy5oPgorCisjdW5kZWYgREVCVUdfSEFSRF9IRUFERVIKKworI2RlZmluZSBDSVNDT19NVUxUSUNBU1QJCTB4OEYJLyogQ2lzY28gbXVsdGljYXN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0lTQ09fVU5JQ0FTVAkJMHgwRgkvKiBDaXNjbyB1bmljYXN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0lTQ09fS0VFUEFMSVZFCQkweDgwMzUJLyogQ2lzY28ga2VlcGFsaXZlIHByb3RvY29sICovCisjZGVmaW5lIENJU0NPX1NZU19JTkZPCQkweDIwMDAJLyogQ2lzY28gaW50ZXJmYWNlL3N5c3RlbSBpbmZvICovCisjZGVmaW5lIENJU0NPX0FERFJfUkVRCQkwCS8qIENpc2NvIGFkZHJlc3MgcmVxdWVzdCAqLworI2RlZmluZSBDSVNDT19BRERSX1JFUExZCTEJLyogQ2lzY28gYWRkcmVzcyByZXBseSAqLworI2RlZmluZSBDSVNDT19LRUVQQUxJVkVfUkVRCTIJLyogQ2lzY28ga2VlcGFsaXZlIHJlcXVlc3QgKi8KKworCitzdGF0aWMgaW50IGNpc2NvX2hhcmRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHUxNiB0eXBlLCB2b2lkICpkYWRkciwgdm9pZCAqc2FkZHIsCisJCQkgICAgIHVuc2lnbmVkIGludCBsZW4pCit7CisJaGRsY19oZWFkZXIgKmRhdGE7CisjaWZkZWYgREVCVUdfSEFSRF9IRUFERVIKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNpc2NvX2hhcmRfaGVhZGVyIGNhbGxlZFxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJc2tiX3B1c2goc2tiLCBzaXplb2YoaGRsY19oZWFkZXIpKTsKKwlkYXRhID0gKGhkbGNfaGVhZGVyKilza2ItPmRhdGE7CisJaWYgKHR5cGUgPT0gQ0lTQ09fS0VFUEFMSVZFKQorCQlkYXRhLT5hZGRyZXNzID0gQ0lTQ09fTVVMVElDQVNUOworCWVsc2UKKwkJZGF0YS0+YWRkcmVzcyA9IENJU0NPX1VOSUNBU1Q7CisJZGF0YS0+Y29udHJvbCA9IDA7CisJZGF0YS0+cHJvdG9jb2wgPSBodG9ucyh0eXBlKTsKKworCXJldHVybiBzaXplb2YoaGRsY19oZWFkZXIpOworfQorCisKKworc3RhdGljIHZvaWQgY2lzY29fa2VlcGFsaXZlX3NlbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHR5cGUsCisJCQkJIHUzMiBwYXIxLCB1MzIgcGFyMikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWNpc2NvX3BhY2tldCAqZGF0YTsKKworCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKGhkbGNfaGVhZGVyKSArIHNpemVvZihjaXNjb19wYWNrZXQpKTsKKwlpZiAoIXNrYikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IE1lbW9yeSBzcXVlZXplIG9uIGNpc2NvX2tlZXBhbGl2ZV9zZW5kKClcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCXNrYl9yZXNlcnZlKHNrYiwgNCk7CisJY2lzY29faGFyZF9oZWFkZXIoc2tiLCBkZXYsIENJU0NPX0tFRVBBTElWRSwgTlVMTCwgTlVMTCwgMCk7CisJZGF0YSA9IChjaXNjb19wYWNrZXQqKXNrYi0+dGFpbDsKKworCWRhdGEtPnR5cGUgPSBodG9ubCh0eXBlKTsKKwlkYXRhLT5wYXIxID0gaHRvbmwocGFyMSk7CisJZGF0YS0+cGFyMiA9IGh0b25sKHBhcjIpOworCWRhdGEtPnJlbCA9IDB4RkZGRjsKKwkvKiB3ZSB3aWxsIG5lZWQgZG9fZGl2IGhlcmUgaWYgMTAwMCAlIEhaICE9IDAgKi8KKwlkYXRhLT50aW1lID0gaHRvbmwoKGppZmZpZXMgLSBJTklUSUFMX0pJRkZJRVMpICogKDEwMDAgLyBIWikpOworCisJc2tiX3B1dChza2IsIHNpemVvZihjaXNjb19wYWNrZXQpKTsKKwlza2ItPnByaW9yaXR5ID0gVENfUFJJT19DT05UUk9MOworCXNrYi0+ZGV2ID0gZGV2OworCXNrYi0+bmgucmF3ID0gc2tiLT5kYXRhOworCisJZGV2X3F1ZXVlX3htaXQoc2tiKTsKK30KKworCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBjaXNjb190eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19oZWFkZXIgKmRhdGEgPSAoaGRsY19oZWFkZXIqKXNrYi0+ZGF0YTsKKworCWlmIChza2ItPmxlbiA8IHNpemVvZihoZGxjX2hlYWRlcikpCisJCXJldHVybiBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0hETEMpOworCisJaWYgKGRhdGEtPmFkZHJlc3MgIT0gQ0lTQ09fTVVMVElDQVNUICYmCisJICAgIGRhdGEtPmFkZHJlc3MgIT0gQ0lTQ09fVU5JQ0FTVCkKKwkJcmV0dXJuIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSERMQyk7CisKKwlzd2l0Y2goZGF0YS0+cHJvdG9jb2wpIHsKKwljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOgorCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFgpOgorCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KToKKwkJc2tiX3B1bGwoc2tiLCBzaXplb2YoaGRsY19oZWFkZXIpKTsKKwkJcmV0dXJuIGRhdGEtPnByb3RvY29sOworCWRlZmF1bHQ6CisJCXJldHVybiBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0hETEMpOworCX0KK30KKworCitzdGF0aWMgaW50IGNpc2NvX3J4KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwloZGxjX2hlYWRlciAqZGF0YSA9IChoZGxjX2hlYWRlciopc2tiLT5kYXRhOworCWNpc2NvX3BhY2tldCAqY2lzY29fZGF0YTsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisJdTMyIGFkZHIsIG1hc2s7CisKKwlpZiAoc2tiLT5sZW4gPCBzaXplb2YoaGRsY19oZWFkZXIpKQorCQlnb3RvIHJ4X2Vycm9yOworCisJaWYgKGRhdGEtPmFkZHJlc3MgIT0gQ0lTQ09fTVVMVElDQVNUICYmCisJICAgIGRhdGEtPmFkZHJlc3MgIT0gQ0lTQ09fVU5JQ0FTVCkKKwkJZ290byByeF9lcnJvcjsKKworCXN3aXRjaChudG9ocyhkYXRhLT5wcm90b2NvbCkpIHsKKwljYXNlIENJU0NPX1NZU19JTkZPOgorCQkvKiBQYWNrZXQgaXMgbm90IG5lZWRlZCwgZHJvcCBpdC4gKi8KKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOworCisJY2FzZSBDSVNDT19LRUVQQUxJVkU6CisJCWlmIChza2ItPmxlbiAhPSBzaXplb2YoaGRsY19oZWFkZXIpICsgQ0lTQ09fUEFDS0VUX0xFTiAmJgorCQkgICAgc2tiLT5sZW4gIT0gc2l6ZW9mKGhkbGNfaGVhZGVyKSArIENJU0NPX0JJR19QQUNLRVRfTEVOKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSW52YWxpZCBsZW5ndGggb2YgQ2lzY28gIgorCQkJICAgICAgICJjb250cm9sIHBhY2tldCAoJWQgYnl0ZXMpXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgc2tiLT5sZW4pOworCQkJZ290byByeF9lcnJvcjsKKwkJfQorCisJCWNpc2NvX2RhdGEgPSAoY2lzY29fcGFja2V0Kikoc2tiLT5kYXRhICsgc2l6ZW9mKGhkbGNfaGVhZGVyKSk7CisKKwkJc3dpdGNoKG50b2hsIChjaXNjb19kYXRhLT50eXBlKSkgeworCQljYXNlIENJU0NPX0FERFJfUkVROiAvKiBTdG9sZW4gZnJvbSBzeW5jcHBwLmMgOi0pICovCisJCQlpbl9kZXYgPSBkZXYtPmlwX3B0cjsKKwkJCWFkZHIgPSAwOworCQkJbWFzayA9IH4wOyAvKiBpcyB0aGUgbWFzayBjb3JyZWN0PyAqLworCisJCQlpZiAoaW5fZGV2ICE9IE5VTEwpIHsKKwkJCQlzdHJ1Y3QgaW5faWZhZGRyICoqaWZhcCA9ICZpbl9kZXYtPmlmYV9saXN0OworCisJCQkJd2hpbGUgKCppZmFwICE9IE5VTEwpIHsKKwkJCQkJaWYgKHN0cmNtcChkZXYtPm5hbWUsCisJCQkJCQkgICAoKmlmYXApLT5pZmFfbGFiZWwpID09IDApIHsKKwkJCQkJCWFkZHIgPSAoKmlmYXApLT5pZmFfbG9jYWw7CisJCQkJCQltYXNrID0gKCppZmFwKS0+aWZhX21hc2s7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZmFwID0gJigqaWZhcCktPmlmYV9uZXh0OworCQkJCX0KKworCQkJCWNpc2NvX2tlZXBhbGl2ZV9zZW5kKGRldiwgQ0lTQ09fQUREUl9SRVBMWSwKKwkJCQkJCSAgICAgYWRkciwgbWFzayk7CisJCQl9CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOworCisJCWNhc2UgQ0lTQ09fQUREUl9SRVBMWToKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbmV4cGVjdGVkIENpc2NvIElQIGFkZHJlc3MgIgorCQkJICAgICAgICJyZXBseVxuIiwgZGV2LT5uYW1lKTsKKwkJCWdvdG8gcnhfZXJyb3I7CisKKwkJY2FzZSBDSVNDT19LRUVQQUxJVkVfUkVROgorCQkJaGRsYy0+c3RhdGUuY2lzY28ucnhzZXEgPSBudG9obChjaXNjb19kYXRhLT5wYXIxKTsKKwkJCWlmIChoZGxjLT5zdGF0ZS5jaXNjby5yZXF1ZXN0X3NlbnQgJiYKKwkJCSAgICBudG9obChjaXNjb19kYXRhLT5wYXIyKT09aGRsYy0+c3RhdGUuY2lzY28udHhzZXEpIHsKKwkJCQloZGxjLT5zdGF0ZS5jaXNjby5sYXN0X3BvbGwgPSBqaWZmaWVzOworCQkJCWlmICghaGRsYy0+c3RhdGUuY2lzY28udXApIHsKKwkJCQkJdTMyIHNlYywgbWluLCBocnMsIGRheXM7CisJCQkJCXNlYyA9IG50b2hsKGNpc2NvX2RhdGEtPnRpbWUpIC8gMTAwMDsKKwkJCQkJbWluID0gc2VjIC8gNjA7IHNlYyAtPSBtaW4gKiA2MDsKKwkJCQkJaHJzID0gbWluIC8gNjA7IG1pbiAtPSBocnMgKiA2MDsKKwkJCQkJZGF5cyA9IGhycyAvIDI0OyBocnMgLT0gZGF5cyAqIDI0OworCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTGluayB1cCAocGVlciAiCisJCQkJCSAgICAgICAidXB0aW1lICV1ZCV1aCV1bSV1cylcbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUsIGRheXMsIGhycywKKwkJCQkJICAgICAgIG1pbiwgc2VjKTsKKwkJCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQkJCQloZGxjLT5zdGF0ZS5jaXNjby51cCA9IDE7CisJCQkJfQorCQkJfQorCisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOworCQl9IC8qIHN3aXRjaChrZWVwYWxpdmUgdHlwZSkgKi8KKwl9IC8qIHN3aXRjaChwcm90b2NvbCkgKi8KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbnN1cHBvcnRlZCBwcm90b2NvbCAleFxuIiwgZGV2LT5uYW1lLAorCSAgICAgICBkYXRhLT5wcm90b2NvbCk7CisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlyZXR1cm4gTkVUX1JYX0RST1A7CisKKyByeF9lcnJvcjoKKwloZGxjLT5zdGF0cy5yeF9lcnJvcnMrKzsgLyogTWFyayBlcnJvciAqLworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJcmV0dXJuIE5FVF9SWF9EUk9QOworfQorCisKKworc3RhdGljIHZvaWQgY2lzY29fdGltZXIodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWFyZzsKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisKKwlpZiAoaGRsYy0+c3RhdGUuY2lzY28udXAgJiYKKwkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBoZGxjLT5zdGF0ZS5jaXNjby5sYXN0X3BvbGwgKworCQkgICAgICAgaGRsYy0+c3RhdGUuY2lzY28uc2V0dGluZ3MudGltZW91dCAqIEhaKSkgeworCQloZGxjLT5zdGF0ZS5jaXNjby51cCA9IDA7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rIGRvd25cbiIsIGRldi0+bmFtZSk7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJfQorCisJY2lzY29fa2VlcGFsaXZlX3NlbmQoZGV2LCBDSVNDT19LRUVQQUxJVkVfUkVRLAorCQkJICAgICArK2hkbGMtPnN0YXRlLmNpc2NvLnR4c2VxLAorCQkJICAgICBoZGxjLT5zdGF0ZS5jaXNjby5yeHNlcSk7CisJaGRsYy0+c3RhdGUuY2lzY28ucmVxdWVzdF9zZW50ID0gMTsKKwloZGxjLT5zdGF0ZS5jaXNjby50aW1lci5leHBpcmVzID0gamlmZmllcyArCisJCWhkbGMtPnN0YXRlLmNpc2NvLnNldHRpbmdzLmludGVydmFsICogSFo7CisJaGRsYy0+c3RhdGUuY2lzY28udGltZXIuZnVuY3Rpb24gPSBjaXNjb190aW1lcjsKKwloZGxjLT5zdGF0ZS5jaXNjby50aW1lci5kYXRhID0gYXJnOworCWFkZF90aW1lcigmaGRsYy0+c3RhdGUuY2lzY28udGltZXIpOworfQorCisKKworc3RhdGljIHZvaWQgY2lzY29fc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJaGRsYy0+c3RhdGUuY2lzY28udXAgPSAwOworCWhkbGMtPnN0YXRlLmNpc2NvLnJlcXVlc3Rfc2VudCA9IDA7CisJaGRsYy0+c3RhdGUuY2lzY28udHhzZXEgPSBoZGxjLT5zdGF0ZS5jaXNjby5yeHNlcSA9IDA7CisKKwlpbml0X3RpbWVyKCZoZGxjLT5zdGF0ZS5jaXNjby50aW1lcik7CisJaGRsYy0+c3RhdGUuY2lzY28udGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsgLypGaXJzdCBwb2xsIGFmdGVyIDFzKi8KKwloZGxjLT5zdGF0ZS5jaXNjby50aW1lci5mdW5jdGlvbiA9IGNpc2NvX3RpbWVyOworCWhkbGMtPnN0YXRlLmNpc2NvLnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJYWRkX3RpbWVyKCZoZGxjLT5zdGF0ZS5jaXNjby50aW1lcik7Cit9CisKKworCitzdGF0aWMgdm9pZCBjaXNjb19zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCWRlbF90aW1lcl9zeW5jKCZoZGxjLT5zdGF0ZS5jaXNjby50aW1lcik7CisJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkKKwkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwloZGxjLT5zdGF0ZS5jaXNjby51cCA9IDA7CisJaGRsYy0+c3RhdGUuY2lzY28ucmVxdWVzdF9zZW50ID0gMDsKK30KKworCisKK2ludCBoZGxjX2Npc2NvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyKQoreworCWNpc2NvX3Byb3RvIF9fdXNlciAqY2lzY29fcyA9IGlmci0+aWZyX3NldHRpbmdzLmlmc19pZnN1LmNpc2NvOworCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKGNpc2NvX3Byb3RvKTsKKwljaXNjb19wcm90byBuZXdfc2V0dGluZ3M7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCWludCByZXN1bHQ7CisKKwlzd2l0Y2ggKGlmci0+aWZyX3NldHRpbmdzLnR5cGUpIHsKKwljYXNlIElGX0dFVF9QUk9UTzoKKwkJaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9IElGX1BST1RPX0NJU0NPOworCQlpZiAoaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA8IHNpemUpIHsKKwkJCWlmci0+aWZyX3NldHRpbmdzLnNpemUgPSBzaXplOyAvKiBkYXRhIHNpemUgd2FudGVkICovCisJCQlyZXR1cm4gLUVOT0JVRlM7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihjaXNjb19zLCAmaGRsYy0+c3RhdGUuY2lzY28uc2V0dGluZ3MsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBJRl9QUk9UT19DSVNDTzoKKwkJaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmKGRldi0+ZmxhZ3MgJiBJRkZfVVApCisJCQlyZXR1cm4gLUVCVVNZOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X3NldHRpbmdzLCBjaXNjb19zLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChuZXdfc2V0dGluZ3MuaW50ZXJ2YWwgPCAxIHx8CisJCSAgICBuZXdfc2V0dGluZ3MudGltZW91dCA8IDIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZXN1bHQ9aGRsYy0+YXR0YWNoKGRldiwgRU5DT0RJTkdfTlJaLFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQpOworCisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCisJCWhkbGNfcHJvdG9fZGV0YWNoKGhkbGMpOworCQltZW1jcHkoJmhkbGMtPnN0YXRlLmNpc2NvLnNldHRpbmdzLCAmbmV3X3NldHRpbmdzLCBzaXplKTsKKwkJbWVtc2V0KCZoZGxjLT5wcm90bywgMCwgc2l6ZW9mKGhkbGMtPnByb3RvKSk7CisKKwkJaGRsYy0+cHJvdG8uc3RhcnQgPSBjaXNjb19zdGFydDsKKwkJaGRsYy0+cHJvdG8uc3RvcCA9IGNpc2NvX3N0b3A7CisJCWhkbGMtPnByb3RvLm5ldGlmX3J4ID0gY2lzY29fcng7CisJCWhkbGMtPnByb3RvLnR5cGVfdHJhbnMgPSBjaXNjb190eXBlX3RyYW5zOworCQloZGxjLT5wcm90by5pZCA9IElGX1BST1RPX0NJU0NPOworCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGhkbGMtPnhtaXQ7CisJCWRldi0+aGFyZF9oZWFkZXIgPSBjaXNjb19oYXJkX2hlYWRlcjsKKwkJZGV2LT5oYXJkX2hlYWRlcl9jYWNoZSA9IE5VTEw7CisJCWRldi0+dHlwZSA9IEFSUEhSRF9DSVNDTzsKKwkJZGV2LT5mbGFncyA9IElGRl9QT0lOVE9QT0lOVCB8IElGRl9OT0FSUDsKKwkJZGV2LT5hZGRyX2xlbiA9IDA7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfZnIuYyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2ZyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y0NTBiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2ZyLmMKQEAgLTAsMCArMSwxMjM3IEBACisvKgorICogR2VuZXJpYyBIRExDIHN1cHBvcnQgcm91dGluZXMgZm9yIExpbnV4CisgKiBGcmFtZSBSZWxheSBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IC0gMjAwMyBLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorCisgICAgICAgICAgICBUaGVvcnkgb2YgUFZDIHN0YXRlCisKKyBEQ0UgbW9kZToKKworIChleGlzdCxuZXcpIC0+IDAsMCB3aGVuICJQVkMgY3JlYXRlIiBvciBpZiAibGluayB1bnJlbGlhYmxlIgorICAgICAgICAgMCx4IC0+IDEsMSBpZiAibGluayByZWxpYWJsZSIgd2hlbiBzZW5kaW5nIEZVTEwgU1RBVFVTCisgICAgICAgICAxLDEgLT4gMSwwIGlmIHJlY2VpdmVkIEZVTEwgU1RBVFVTIEFDSworCisgKGFjdGl2ZSkgICAgLT4gMCB3aGVuICJpZmNvbmZpZyBQVkMgZG93biIgb3IgImxpbmsgdW5yZWxpYWJsZSIgb3IgIlBWQyBjcmVhdGUiCisgICAgICAgICAgICAgLT4gMSB3aGVuICJQVkMgdXAiIGFuZCAoZXhpc3QsbmV3KSA9IDEsMAorCisgRFRFIG1vZGU6CisgKGV4aXN0LG5ldyxhY3RpdmUpID0gRlVMTCBTVEFUVVMgaWYgImxpbmsgcmVsaWFibGUiCisJCSAgICA9IDAsIDAsIDAgaWYgImxpbmsgdW5yZWxpYWJsZSIKKyBObyBMTUk6CisgYWN0aXZlID0gb3BlbiBhbmQgImxpbmsgcmVsaWFibGUiCisgZXhpc3QgPSBuZXcgPSBub3QgdXNlZAorCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGFwYi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGRsYy5oPgorCisjdW5kZWYgREVCVUdfUEtUCisjdW5kZWYgREVCVUdfRUNOCisjdW5kZWYgREVCVUdfTElOSworCisjZGVmaW5lIE1BWExFTl9MTUlTVEFUICAyMAkvKiBtYXggc2l6ZSBvZiBzdGF0dXMgZW5xdWlyeSBmcmFtZSAqLworCisjZGVmaW5lIFBWQ19TVEFURV9ORVcJIDB4MDEKKyNkZWZpbmUgUFZDX1NUQVRFX0FDVElWRSAweDAyCisjZGVmaW5lIFBWQ19TVEFURV9GRUNOCSAweDA4IC8qIEZFQ04gY29uZGl0aW9uICovCisjZGVmaW5lIFBWQ19TVEFURV9CRUNOCSAweDEwIC8qIEJFQ04gY29uZGl0aW9uICovCisKKworI2RlZmluZSBGUl9VSQkJIDB4MDMKKyNkZWZpbmUgRlJfUEFECQkgMHgwMAorCisjZGVmaW5lIE5MUElEX0lQCSAweENDCisjZGVmaW5lIE5MUElEX0lQVjYJIDB4OEUKKyNkZWZpbmUgTkxQSURfU05BUAkgMHg4MAorI2RlZmluZSBOTFBJRF9QQUQJIDB4MDAKKyNkZWZpbmUgTkxQSURfUTkzMwkgMHgwOAorCisKKyNkZWZpbmUgTE1JX0RMQ0kgICAgICAgICAgICAgICAgICAgMCAvKiBMTUkgRExDSSAqLworI2RlZmluZSBMTUlfUFJPVE8gICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIExNSV9DQUxMUkVGICAgICAgICAgICAgIDB4MDAgLyogQ2FsbCBSZWZlcmVuY2UgKi8KKyNkZWZpbmUgTE1JX0FOU0lfTE9DS1NISUZUICAgICAgMHg5NSAvKiBBTlNJIGxvY2tzaGlmdCAqLworI2RlZmluZSBMTUlfUkVQVFlQRSAgICAgICAgICAgICAgICAxIC8qIHJlcG9ydCB0eXBlICovCisjZGVmaW5lIExNSV9DQ0lUVF9SRVBUWVBFICAgICAgIDB4NTEKKyNkZWZpbmUgTE1JX0FMSVZFICAgICAgICAgICAgICAgICAgMyAvKiBrZWVwIGFsaXZlICovCisjZGVmaW5lIExNSV9DQ0lUVF9BTElWRSAgICAgICAgIDB4NTMKKyNkZWZpbmUgTE1JX1BWQ1NUQVQgICAgICAgICAgICAgICAgNyAvKiBwdmMgc3RhdHVzICovCisjZGVmaW5lIExNSV9DQ0lUVF9QVkNTVEFUICAgICAgIDB4NTcKKyNkZWZpbmUgTE1JX0ZVTExSRVAgICAgICAgICAgICAgICAgMCAvKiBmdWxsIHJlcG9ydCAgKi8KKyNkZWZpbmUgTE1JX0lOVEVHUklUWSAgICAgICAgICAgICAgMSAvKiBsaW5rIGludGVncml0eSByZXBvcnQgKi8KKyNkZWZpbmUgTE1JX1NJTkdMRSAgICAgICAgICAgICAgICAgMiAvKiBzaW5nbGUgcHZjIHJlcG9ydCAqLworI2RlZmluZSBMTUlfU1RBVFVTX0VOUVVJUlkgICAgICAweDc1CisjZGVmaW5lIExNSV9TVEFUVVMgICAgICAgICAgICAgIDB4N0QgLyogcmVwbHkgKi8KKworI2RlZmluZSBMTUlfUkVQVF9MRU4gICAgICAgICAgICAgICAxIC8qIHJlcG9ydCB0eXBlIGVsZW1lbnQgbGVuZ3RoICovCisjZGVmaW5lIExNSV9JTlRFR19MRU4gICAgICAgICAgICAgIDIgLyogbGluayBpbnRlZ3JpdHkgZWxlbWVudCBsZW5ndGggKi8KKworI2RlZmluZSBMTUlfTEVOR1RIICAgICAgICAgICAgICAgIDEzIC8qIHN0YW5kYXJkIExNSSBmcmFtZSBsZW5ndGggKi8KKyNkZWZpbmUgTE1JX0FOU0lfTEVOR1RIICAgICAgICAgICAxNAorCisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwl1bnNpZ25lZCBlYTE6CTE7CisJdW5zaWduZWQgY3I6CTE7CisJdW5zaWduZWQgZGxjaWg6CTY7CisgIAorCXVuc2lnbmVkIGVhMjoJMTsKKwl1bnNpZ25lZCBkZToJMTsKKwl1bnNpZ25lZCBiZWNuOgkxOworCXVuc2lnbmVkIGZlY246CTE7CisJdW5zaWduZWQgZGxjaWw6CTQ7CisjZWxzZQorCXVuc2lnbmVkIGRsY2loOgk2OworCXVuc2lnbmVkIGNyOgkxOworCXVuc2lnbmVkIGVhMToJMTsKKworCXVuc2lnbmVkIGRsY2lsOgk0OworCXVuc2lnbmVkIGZlY246CTE7CisJdW5zaWduZWQgYmVjbjoJMTsKKwl1bnNpZ25lZCBkZToJMTsKKwl1bnNpZ25lZCBlYTI6CTE7CisjZW5kaWYKK31fX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZnJfaGRyOworCisKK3N0YXRpYyBpbmxpbmUgdTE2IHE5MjJfdG9fZGxjaSh1OCAqaGRyKQoreworCXJldHVybiAoKGhkclswXSAmIDB4RkMpIDw8IDIpIHwgKChoZHJbMV0gJiAweEYwKSA+PiA0KTsKK30KKworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbGNpX3RvX3E5MjIodTggKmhkciwgdTE2IGRsY2kpCit7CisJaGRyWzBdID0gKGRsY2kgPj4gMikgJiAweEZDOworCWhkclsxXSA9ICgoZGxjaSA8PCA0KSAmIDB4RjApIHwgMHgwMTsKK30KKworCisKK3N0YXRpYyBpbmxpbmUgcHZjX2RldmljZSogZmluZF9wdmMoaGRsY19kZXZpY2UgKmhkbGMsIHUxNiBkbGNpKQoreworCXB2Y19kZXZpY2UgKnB2YyA9IGhkbGMtPnN0YXRlLmZyLmZpcnN0X3B2YzsKKworCXdoaWxlIChwdmMpIHsKKwkJaWYgKHB2Yy0+ZGxjaSA9PSBkbGNpKQorCQkJcmV0dXJuIHB2YzsKKwkJaWYgKHB2Yy0+ZGxjaSA+IGRsY2kpCisJCQlyZXR1cm4gTlVMTDsgLyogdGhlIGxpc3RlZCBpcyBzb3J0ZWQgKi8KKwkJcHZjID0gcHZjLT5uZXh0OworCX0KKworCXJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyBpbmxpbmUgcHZjX2RldmljZSogYWRkX3B2YyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgZGxjaSkKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJcHZjX2RldmljZSAqcHZjLCAqKnB2Y19wID0gJmhkbGMtPnN0YXRlLmZyLmZpcnN0X3B2YzsKKworCXdoaWxlICgqcHZjX3ApIHsKKwkJaWYgKCgqcHZjX3ApLT5kbGNpID09IGRsY2kpCisJCQlyZXR1cm4gKnB2Y19wOworCQlpZiAoKCpwdmNfcCktPmRsY2kgPiBkbGNpKQorCQkJYnJlYWs7CS8qIHRoZSBsaXN0IGlzIHNvcnRlZCAqLworCQlwdmNfcCA9ICYoKnB2Y19wKS0+bmV4dDsKKwl9CisKKwlwdmMgPSBrbWFsbG9jKHNpemVvZihwdmNfZGV2aWNlKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFwdmMpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KHB2YywgMCwgc2l6ZW9mKHB2Y19kZXZpY2UpKTsKKwlwdmMtPmRsY2kgPSBkbGNpOworCXB2Yy0+bWFzdGVyID0gZGV2OworCXB2Yy0+bmV4dCA9ICpwdmNfcDsJLyogUHV0IGl0IGluIHRoZSBjaGFpbiAqLworCSpwdmNfcCA9IHB2YzsKKwlyZXR1cm4gcHZjOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IHB2Y19pc191c2VkKHB2Y19kZXZpY2UgKnB2YykKK3sKKwlyZXR1cm4gcHZjLT5tYWluICE9IE5VTEwgfHwgcHZjLT5ldGhlciAhPSBOVUxMOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdmNfY2FycmllcihpbnQgb24sIHB2Y19kZXZpY2UgKnB2YykKK3sKKwlpZiAob24pIHsKKwkJaWYgKHB2Yy0+bWFpbikKKwkJCWlmICghbmV0aWZfY2Fycmllcl9vayhwdmMtPm1haW4pKQorCQkJCW5ldGlmX2NhcnJpZXJfb24ocHZjLT5tYWluKTsKKwkJaWYgKHB2Yy0+ZXRoZXIpCisJCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2socHZjLT5ldGhlcikpCisJCQkJbmV0aWZfY2Fycmllcl9vbihwdmMtPmV0aGVyKTsKKwl9IGVsc2UgeworCQlpZiAocHZjLT5tYWluKQorCQkJaWYgKG5ldGlmX2NhcnJpZXJfb2socHZjLT5tYWluKSkKKwkJCQluZXRpZl9jYXJyaWVyX29mZihwdmMtPm1haW4pOworCQlpZiAocHZjLT5ldGhlcikKKwkJCWlmIChuZXRpZl9jYXJyaWVyX29rKHB2Yy0+ZXRoZXIpKQorCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKHB2Yy0+ZXRoZXIpOworCX0KK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsZXRlX3VudXNlZF9wdmNzKGhkbGNfZGV2aWNlICpoZGxjKQoreworCXB2Y19kZXZpY2UgKipwdmNfcCA9ICZoZGxjLT5zdGF0ZS5mci5maXJzdF9wdmM7CisKKwl3aGlsZSAoKnB2Y19wKSB7CisJCWlmICghcHZjX2lzX3VzZWQoKnB2Y19wKSkgeworCQkJcHZjX2RldmljZSAqcHZjID0gKnB2Y19wOworCQkJKnB2Y19wID0gcHZjLT5uZXh0OworCQkJa2ZyZWUocHZjKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXB2Y19wID0gJigqcHZjX3ApLT5uZXh0OworCX0KK30KKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRfZGV2aWNlKiogZ2V0X2Rldl9wKHB2Y19kZXZpY2UgKnB2YywgaW50IHR5cGUpCit7CisJaWYgKHR5cGUgPT0gQVJQSFJEX0VUSEVSKQorCQlyZXR1cm4gJnB2Yy0+ZXRoZXI7CisJZWxzZQorCQlyZXR1cm4gJnB2Yy0+bWFpbjsKK30KKworCitzdGF0aWMgaW5saW5lIHUxNiBzdGF0dXNfdG9fZGxjaSh1OCAqc3RhdHVzLCBpbnQgKmFjdGl2ZSwgaW50ICpuZXcpCit7CisJKm5ldyA9IChzdGF0dXNbMl0gJiAweDA4KSA/IDEgOiAwOworCSphY3RpdmUgPSAoc3RhdHVzWzJdICYgMHgwMikgPyAxIDogMDsKKworCXJldHVybiAoKHN0YXR1c1swXSAmIDB4M0YpIDw8IDQpIHwgKChzdGF0dXNbMV0gJiAweDc4KSA+PiAzKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgZGxjaV90b19zdGF0dXModTE2IGRsY2ksIHU4ICpzdGF0dXMsIGludCBhY3RpdmUsIGludCBuZXcpCit7CisJc3RhdHVzWzBdID0gKGRsY2kgPj4gNCkgJiAweDNGOworCXN0YXR1c1sxXSA9ICgoZGxjaSA8PCAzKSAmIDB4NzgpIHwgMHg4MDsKKwlzdGF0dXNbMl0gPSAweDgwOworCisJaWYgKG5ldykKKwkJc3RhdHVzWzJdIHw9IDB4MDg7CisJZWxzZSBpZiAoYWN0aXZlKQorCQlzdGF0dXNbMl0gfD0gMHgwMjsKK30KKworCisKK3N0YXRpYyBpbnQgZnJfaGFyZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKipza2JfcCwgdTE2IGRsY2kpCit7CisJdTE2IGhlYWRfbGVuOworCXN0cnVjdCBza19idWZmICpza2IgPSAqc2tiX3A7CisKKwlzd2l0Y2ggKHNrYi0+cHJvdG9jb2wpIHsKKwljYXNlIF9fY29uc3RhbnRfbnRvaHMoRVRIX1BfSVApOgorCQloZWFkX2xlbiA9IDQ7CisJCXNrYl9wdXNoKHNrYiwgaGVhZF9sZW4pOworCQlza2ItPmRhdGFbM10gPSBOTFBJRF9JUDsKKwkJYnJlYWs7CisKKwljYXNlIF9fY29uc3RhbnRfbnRvaHMoRVRIX1BfSVBWNik6CisJCWhlYWRfbGVuID0gNDsKKwkJc2tiX3B1c2goc2tiLCBoZWFkX2xlbik7CisJCXNrYi0+ZGF0YVszXSA9IE5MUElEX0lQVjY7CisJCWJyZWFrOworCisJY2FzZSBfX2NvbnN0YW50X250b2hzKExNSV9QUk9UTyk6CisJCWhlYWRfbGVuID0gNDsKKwkJc2tiX3B1c2goc2tiLCBoZWFkX2xlbik7CisJCXNrYi0+ZGF0YVszXSA9IExNSV9QUk9UTzsKKwkJYnJlYWs7CisKKwljYXNlIF9fY29uc3RhbnRfbnRvaHMoRVRIX1BfODAyXzMpOgorCQloZWFkX2xlbiA9IDEwOworCQlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBoZWFkX2xlbikgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBza2JfcmVhbGxvY19oZWFkcm9vbShza2IsCisJCQkJCQkJCSAgICBoZWFkX2xlbik7CisJCQlpZiAoIXNrYjIpCisJCQkJcmV0dXJuIC1FTk9CVUZTOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJc2tiID0gKnNrYl9wID0gc2tiMjsKKwkJfQorCQlza2JfcHVzaChza2IsIGhlYWRfbGVuKTsKKwkJc2tiLT5kYXRhWzNdID0gRlJfUEFEOworCQlza2ItPmRhdGFbNF0gPSBOTFBJRF9TTkFQOworCQlza2ItPmRhdGFbNV0gPSBGUl9QQUQ7CisJCXNrYi0+ZGF0YVs2XSA9IDB4ODA7CisJCXNrYi0+ZGF0YVs3XSA9IDB4QzI7CisJCXNrYi0+ZGF0YVs4XSA9IDB4MDA7CisJCXNrYi0+ZGF0YVs5XSA9IDB4MDc7IC8qIGJyaWRnZWQgRXRoZXJuZXQgZnJhbWUgdy9vdXQgRkNTICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJaGVhZF9sZW4gPSAxMDsKKwkJc2tiX3B1c2goc2tiLCBoZWFkX2xlbik7CisJCXNrYi0+ZGF0YVszXSA9IEZSX1BBRDsKKwkJc2tiLT5kYXRhWzRdID0gTkxQSURfU05BUDsKKwkJc2tiLT5kYXRhWzVdID0gRlJfUEFEOworCQlza2ItPmRhdGFbNl0gPSBGUl9QQUQ7CisJCXNrYi0+ZGF0YVs3XSA9IEZSX1BBRDsKKwkJKih1MTYqKShza2ItPmRhdGEgKyA4KSA9IHNrYi0+cHJvdG9jb2w7CisJfQorCisJZGxjaV90b19xOTIyKHNrYi0+ZGF0YSwgZGxjaSk7CisJc2tiLT5kYXRhWzJdID0gRlJfVUk7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IHB2Y19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcHZjX2RldmljZSAqcHZjID0gZGV2X3RvX3B2YyhkZXYpOworCisJaWYgKChwdmMtPm1hc3Rlci0+ZmxhZ3MgJiBJRkZfVVApID09IDApCisJCXJldHVybiAtRUlPOyAgLyogTWFzdGVyIG11c3QgYmUgVVAgaW4gb3JkZXIgdG8gYWN0aXZhdGUgUFZDICovCisKKwlpZiAocHZjLT5vcGVuX2NvdW50KysgPT0gMCkgeworCQloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKHB2Yy0+bWFzdGVyKTsKKwkJaWYgKGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmxtaSA9PSBMTUlfTk9ORSkKKwkJCXB2Yy0+c3RhdGUuYWN0aXZlID0gaGRsYy0+Y2FycmllcjsKKworCQlwdmNfY2FycmllcihwdmMtPnN0YXRlLmFjdGl2ZSwgcHZjKTsKKwkJaGRsYy0+c3RhdGUuZnIuZGNlX2NoYW5nZWQgPSAxOworCX0KKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgcHZjX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcHZjX2RldmljZSAqcHZjID0gZGV2X3RvX3B2YyhkZXYpOworCisJaWYgKC0tcHZjLT5vcGVuX2NvdW50ID09IDApIHsKKwkJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhwdmMtPm1hc3Rlcik7CisJCWlmIChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5sbWkgPT0gTE1JX05PTkUpCisJCQlwdmMtPnN0YXRlLmFjdGl2ZSA9IDA7CisKKwkJaWYgKGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmRjZSkgeworCQkJaGRsYy0+c3RhdGUuZnIuZGNlX2NoYW5nZWQgPSAxOworCQkJcHZjLT5zdGF0ZS5hY3RpdmUgPSAwOworCQl9CisJfQorCXJldHVybiAwOworfQorCisKKworaW50IHB2Y19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlwdmNfZGV2aWNlICpwdmMgPSBkZXZfdG9fcHZjKGRldik7CisJZnJfcHJvdG9fcHZjX2luZm8gaW5mbzsKKworCWlmIChpZnItPmlmcl9zZXR0aW5ncy50eXBlID09IElGX0dFVF9QUk9UTykgeworCQlpZiAoZGV2LT50eXBlID09IEFSUEhSRF9FVEhFUikKKwkJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9QUk9UT19GUl9FVEhfUFZDOworCQllbHNlCisJCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfUFJPVE9fRlJfUFZDOworCisJCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplIDwgc2l6ZW9mKGluZm8pKSB7CisJCQkvKiBkYXRhIHNpemUgd2FudGVkICovCisJCQlpZnItPmlmcl9zZXR0aW5ncy5zaXplID0gc2l6ZW9mKGluZm8pOworCQkJcmV0dXJuIC1FTk9CVUZTOworCQl9CisKKwkJaW5mby5kbGNpID0gcHZjLT5kbGNpOworCQltZW1jcHkoaW5mby5tYXN0ZXIsIHB2Yy0+bWFzdGVyLT5uYW1lLCBJRk5BTVNJWik7CisJCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3UuZnJfcHZjX2luZm8sCisJCQkJICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnB2Y19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gbmV0ZGV2X3ByaXYoZGV2KTsKK30KKworCisKK3N0YXRpYyBpbnQgcHZjX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwdmNfZGV2aWNlICpwdmMgPSBkZXZfdG9fcHZjKGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gcHZjX2dldF9zdGF0cyhkZXYpOworCisJaWYgKHB2Yy0+c3RhdGUuYWN0aXZlKSB7CisJCWlmIChkZXYtPnR5cGUgPT0gQVJQSFJEX0VUSEVSKSB7CisJCQlpbnQgcGFkID0gRVRIX1pMRU4gLSBza2ItPmxlbjsKKwkJCWlmIChwYWQgPiAwKSB7IC8qIFBhZCB0aGUgZnJhbWUgd2l0aCB6ZXJvcyAqLworCQkJCWludCBsZW4gPSBza2ItPmxlbjsKKwkJCQlpZiAoc2tiX3RhaWxyb29tKHNrYikgPCBwYWQpCisJCQkJCWlmIChwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgcGFkLAorCQkJCQkJCSAgICAgR0ZQX0FUT01JQykpIHsKKwkJCQkJCXN0YXRzLT50eF9kcm9wcGVkKys7CisJCQkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCXNrYl9wdXQoc2tiLCBwYWQpOworCQkJCW1lbXNldChza2ItPmRhdGEgKyBsZW4sIDAsIHBhZCk7CisJCQl9CisJCQlza2ItPnByb3RvY29sID0gX19jb25zdGFudF9odG9ucyhFVEhfUF84MDJfMyk7CisJCX0KKwkJaWYgKCFmcl9oYXJkX2hlYWRlcigmc2tiLCBwdmMtPmRsY2kpKSB7CisJCQlzdGF0cy0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQlzdGF0cy0+dHhfcGFja2V0cysrOworCQkJaWYgKHB2Yy0+c3RhdGUuZmVjbikgLyogVFggQ29uZ2VzdGlvbiBjb3VudGVyICovCisJCQkJc3RhdHMtPnR4X2NvbXByZXNzZWQrKzsKKwkJCXNrYi0+ZGV2ID0gcHZjLT5tYXN0ZXI7CisJCQlkZXZfcXVldWVfeG1pdChza2IpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlzdGF0cy0+dHhfZHJvcHBlZCsrOworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgcHZjX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaWYgKChuZXdfbXR1IDwgNjgpIHx8IChuZXdfbXR1ID4gSERMQ19NQVhfTVRVKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGV2LT5tdHUgPSBuZXdfbXR1OworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGlubGluZSB2b2lkIGZyX2xvZ19kbGNpX2FjdGl2ZShwdmNfZGV2aWNlICpwdmMpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERMQ0kgJWQgWyVzJXMlc10lcyAlc1xuIiwKKwkgICAgICAgcHZjLT5tYXN0ZXItPm5hbWUsCisJICAgICAgIHB2Yy0+ZGxjaSwKKwkgICAgICAgcHZjLT5tYWluID8gcHZjLT5tYWluLT5uYW1lIDogIiIsCisJICAgICAgIHB2Yy0+bWFpbiAmJiBwdmMtPmV0aGVyID8gIiAiIDogIiIsCisJICAgICAgIHB2Yy0+ZXRoZXIgPyBwdmMtPmV0aGVyLT5uYW1lIDogIiIsCisJICAgICAgIHB2Yy0+c3RhdGUubmV3ID8gIiBuZXciIDogIiIsCisJICAgICAgICFwdmMtPnN0YXRlLmV4aXN0ID8gImRlbGV0ZWQiIDoKKwkgICAgICAgcHZjLT5zdGF0ZS5hY3RpdmUgPyAiYWN0aXZlIiA6ICJpbmFjdGl2ZSIpOworfQorCisKKworc3RhdGljIGlubGluZSB1OCBmcl9sbWlfbmV4dHNlcSh1OCB4KQoreworCXgrKzsKKwlyZXR1cm4geCA/IHggOiAxOworfQorCisKKworc3RhdGljIHZvaWQgZnJfbG1pX3NlbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZ1bGxyZXApCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCXN0cnVjdCBza19idWZmICpza2I7CisJcHZjX2RldmljZSAqcHZjID0gaGRsYy0+c3RhdGUuZnIuZmlyc3RfcHZjOworCWludCBsZW4gPSAoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubG1pID09IExNSV9BTlNJKSA/IExNSV9BTlNJX0xFTkdUSAorCQk6IExNSV9MRU5HVEg7CisJaW50IHN0YXRfbGVuID0gMzsKKwl1OCAqZGF0YTsKKwlpbnQgaSA9IDA7CisKKwlpZiAoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MuZGNlICYmIGZ1bGxyZXApIHsKKwkJbGVuICs9IGhkbGMtPnN0YXRlLmZyLmRjZV9wdmNfY291bnQgKiAoMiArIHN0YXRfbGVuKTsKKwkJaWYgKGxlbiA+IEhETENfTUFYX01SVSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRvbyBtYW55IFBWQ3Mgd2hpbGUgc2VuZGluZyAiCisJCQkgICAgICAgIkxNSSBmdWxsIHJlcG9ydFxuIiwgZGV2LT5uYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKwlpZiAoIXNrYikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWVtb3J5IHNxdWVlemUgb24gZnJfbG1pX3NlbmQoKVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJbWVtc2V0KHNrYi0+ZGF0YSwgMCwgbGVuKTsKKwlza2JfcmVzZXJ2ZShza2IsIDQpOworCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKExNSV9QUk9UTyk7CisJZnJfaGFyZF9oZWFkZXIoJnNrYiwgTE1JX0RMQ0kpOworCWRhdGEgPSBza2ItPnRhaWw7CisJZGF0YVtpKytdID0gTE1JX0NBTExSRUY7CisJZGF0YVtpKytdID0gaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MuZGNlCisJCT8gTE1JX1NUQVRVUyA6IExNSV9TVEFUVVNfRU5RVUlSWTsKKwlpZiAoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubG1pID09IExNSV9BTlNJKQorCQlkYXRhW2krK10gPSBMTUlfQU5TSV9MT0NLU0hJRlQ7CisJZGF0YVtpKytdID0gKGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmxtaSA9PSBMTUlfQ0NJVFQpCisJCT8gTE1JX0NDSVRUX1JFUFRZUEUgOiBMTUlfUkVQVFlQRTsKKwlkYXRhW2krK10gPSBMTUlfUkVQVF9MRU47CisJZGF0YVtpKytdID0gZnVsbHJlcCA/IExNSV9GVUxMUkVQIDogTE1JX0lOVEVHUklUWTsKKworCWRhdGFbaSsrXSA9IChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5sbWkgPT0gTE1JX0NDSVRUKQorCQk/IExNSV9DQ0lUVF9BTElWRSA6IExNSV9BTElWRTsKKwlkYXRhW2krK10gPSBMTUlfSU5URUdfTEVOOworCWRhdGFbaSsrXSA9IGhkbGMtPnN0YXRlLmZyLnR4c2VxID1mcl9sbWlfbmV4dHNlcShoZGxjLT5zdGF0ZS5mci50eHNlcSk7CisJZGF0YVtpKytdID0gaGRsYy0+c3RhdGUuZnIucnhzZXE7CisKKwlpZiAoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MuZGNlICYmIGZ1bGxyZXApIHsKKwkJd2hpbGUgKHB2YykgeworCQkJZGF0YVtpKytdID0gKGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmxtaSA9PSBMTUlfQ0NJVFQpCisJCQkJPyBMTUlfQ0NJVFRfUFZDU1RBVCA6IExNSV9QVkNTVEFUOworCQkJZGF0YVtpKytdID0gc3RhdF9sZW47CisKKwkJCS8qIExNSSBzdGFydC9yZXN0YXJ0ICovCisJCQlpZiAoaGRsYy0+c3RhdGUuZnIucmVsaWFibGUgJiYgIXB2Yy0+c3RhdGUuZXhpc3QpIHsKKwkJCQlwdmMtPnN0YXRlLmV4aXN0ID0gcHZjLT5zdGF0ZS5uZXcgPSAxOworCQkJCWZyX2xvZ19kbGNpX2FjdGl2ZShwdmMpOworCQkJfQorCisJCQkvKiBpZmNvbmZpZyBQVkMgdXAgKi8KKwkJCWlmIChwdmMtPm9wZW5fY291bnQgJiYgIXB2Yy0+c3RhdGUuYWN0aXZlICYmCisJCQkgICAgcHZjLT5zdGF0ZS5leGlzdCAmJiAhcHZjLT5zdGF0ZS5uZXcpIHsKKwkJCQlwdmNfY2FycmllcigxLCBwdmMpOworCQkJCXB2Yy0+c3RhdGUuYWN0aXZlID0gMTsKKwkJCQlmcl9sb2dfZGxjaV9hY3RpdmUocHZjKTsKKwkJCX0KKworCQkJZGxjaV90b19zdGF0dXMocHZjLT5kbGNpLCBkYXRhICsgaSwKKwkJCQkgICAgICAgcHZjLT5zdGF0ZS5hY3RpdmUsIHB2Yy0+c3RhdGUubmV3KTsKKwkJCWkgKz0gc3RhdF9sZW47CisJCQlwdmMgPSBwdmMtPm5leHQ7CisJCX0KKwl9CisKKwlza2JfcHV0KHNrYiwgaSk7CisJc2tiLT5wcmlvcml0eSA9IFRDX1BSSU9fQ09OVFJPTDsKKwlza2ItPmRldiA9IGRldjsKKwlza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKworCWRldl9xdWV1ZV94bWl0KHNrYik7Cit9CisKKworCitzdGF0aWMgdm9pZCBmcl9zZXRfbGlua19zdGF0ZShpbnQgcmVsaWFibGUsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCXB2Y19kZXZpY2UgKnB2YyA9IGhkbGMtPnN0YXRlLmZyLmZpcnN0X3B2YzsKKworCWhkbGMtPnN0YXRlLmZyLnJlbGlhYmxlID0gcmVsaWFibGU7CisJaWYgKHJlbGlhYmxlKSB7CisJCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKQorCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCisJCWhkbGMtPnN0YXRlLmZyLm4zOTFjbnQgPSAwOyAvKiBSZXF1ZXN0IGZ1bGwgc3RhdHVzICovCisJCWhkbGMtPnN0YXRlLmZyLmRjZV9jaGFuZ2VkID0gMTsKKworCQlpZiAoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubG1pID09IExNSV9OT05FKSB7CisJCQl3aGlsZSAocHZjKSB7CS8qIEFjdGl2YXRlIGFsbCBQVkNzICovCisJCQkJcHZjX2NhcnJpZXIoMSwgcHZjKTsKKwkJCQlwdmMtPnN0YXRlLmV4aXN0ID0gcHZjLT5zdGF0ZS5hY3RpdmUgPSAxOworCQkJCXB2Yy0+c3RhdGUubmV3ID0gMDsKKwkJCQlwdmMgPSBwdmMtPm5leHQ7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpKQorCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworCQl3aGlsZSAocHZjKSB7CQkvKiBEZWFjdGl2YXRlIGFsbCBQVkNzICovCisJCQlwdmNfY2FycmllcigwLCBwdmMpOworCQkJcHZjLT5zdGF0ZS5leGlzdCA9IHB2Yy0+c3RhdGUuYWN0aXZlID0gMDsKKwkJCXB2Yy0+c3RhdGUubmV3ID0gMDsKKwkJCXB2YyA9IHB2Yy0+bmV4dDsKKwkJfQorCX0KK30KKworCisKK3N0YXRpYyB2b2lkIGZyX3RpbWVyKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilhcmc7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCWludCBpLCBjbnQgPSAwLCByZWxpYWJsZTsKKwl1MzIgbGlzdDsKKworCWlmIChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5kY2UpCisJCXJlbGlhYmxlID0gaGRsYy0+c3RhdGUuZnIucmVxdWVzdCAmJgorCQkJdGltZV9iZWZvcmUoamlmZmllcywgaGRsYy0+c3RhdGUuZnIubGFzdF9wb2xsICsKKwkJCQkgICAgaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MudDM5MiAqIEhaKTsKKwllbHNlIHsKKwkJaGRsYy0+c3RhdGUuZnIubGFzdF9lcnJvcnMgPDw9IDE7IC8qIFNoaWZ0IHRoZSBsaXN0ICovCisJCWlmIChoZGxjLT5zdGF0ZS5mci5yZXF1ZXN0KSB7CisJCQlpZiAoaGRsYy0+c3RhdGUuZnIucmVsaWFibGUpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vIExNSSBzdGF0dXMgcmVwbHkgIgorCQkJCSAgICAgICAicmVjZWl2ZWRcbiIsIGRldi0+bmFtZSk7CisJCQloZGxjLT5zdGF0ZS5mci5sYXN0X2Vycm9ycyB8PSAxOworCQl9CisKKwkJbGlzdCA9IGhkbGMtPnN0YXRlLmZyLmxhc3RfZXJyb3JzOworCQlmb3IgKGkgPSAwOyBpIDwgaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubjM5MzsgaSsrLCBsaXN0ID4+PSAxKQorCQkJY250ICs9IChsaXN0ICYgMSk7CS8qIGVycm9ycyBjb3VudCAqLworCisJCXJlbGlhYmxlID0gKGNudCA8IGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLm4zOTIpOworCX0KKworCWlmIChoZGxjLT5zdGF0ZS5mci5yZWxpYWJsZSAhPSByZWxpYWJsZSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogTGluayAlc3JlbGlhYmxlXG4iLCBkZXYtPm5hbWUsCisJCSAgICAgICByZWxpYWJsZSA/ICIiIDogInVuIik7CisJCWZyX3NldF9saW5rX3N0YXRlKHJlbGlhYmxlLCBkZXYpOworCX0KKworCWlmIChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5kY2UpCisJCWhkbGMtPnN0YXRlLmZyLnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsKKwkJCWhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLnQzOTIgKiBIWjsKKwllbHNlIHsKKwkJaWYgKGhkbGMtPnN0YXRlLmZyLm4zOTFjbnQpCisJCQloZGxjLT5zdGF0ZS5mci5uMzkxY250LS07CisKKwkJZnJfbG1pX3NlbmQoZGV2LCBoZGxjLT5zdGF0ZS5mci5uMzkxY250ID09IDApOworCisJCWhkbGMtPnN0YXRlLmZyLmxhc3RfcG9sbCA9IGppZmZpZXM7CisJCWhkbGMtPnN0YXRlLmZyLnJlcXVlc3QgPSAxOworCQloZGxjLT5zdGF0ZS5mci50aW1lci5leHBpcmVzID0gamlmZmllcyArCisJCQloZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy50MzkxICogSFo7CisJfQorCisJaGRsYy0+c3RhdGUuZnIudGltZXIuZnVuY3Rpb24gPSBmcl90aW1lcjsKKwloZGxjLT5zdGF0ZS5mci50aW1lci5kYXRhID0gYXJnOworCWFkZF90aW1lcigmaGRsYy0+c3RhdGUuZnIudGltZXIpOworfQorCisKKworc3RhdGljIGludCBmcl9sbWlfcmVjdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwlpbnQgc3RhdF9sZW47CisJcHZjX2RldmljZSAqcHZjOworCWludCByZXB0eXBlID0gLTEsIGVycm9yLCBub19yYW07CisJdTggcnhzZXEsIHR4c2VxOworCWludCBpOworCisJaWYgKHNrYi0+bGVuIDwgKChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5sbWkgPT0gTE1JX0FOU0kpCisJCQk/IExNSV9BTlNJX0xFTkdUSCA6IExNSV9MRU5HVEgpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTaG9ydCBMTUkgZnJhbWVcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCWlmIChza2ItPmRhdGFbNV0gIT0gKCFoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5kY2UgPworCQkJICAgICBMTUlfU1RBVFVTIDogTE1JX1NUQVRVU19FTlFVSVJZKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogTE1JIG1zZ3R5cGU9JXgsIE5vdCBMTUkgc3RhdHVzICVzXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBza2ItPmRhdGFbMl0sCisJCSAgICAgICBoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5kY2UgPyAiZW5xdWlyeSIgOiAicmVwbHkiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaSA9IChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5sbWkgPT0gTE1JX0FOU0kpID8gNyA6IDY7CisKKwlpZiAoc2tiLT5kYXRhW2ldICE9CisJICAgICgoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubG1pID09IExNSV9DQ0lUVCkKKwkgICAgID8gTE1JX0NDSVRUX1JFUFRZUEUgOiBMTUlfUkVQVFlQRSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vdCBhIHJlcG9ydCB0eXBlPSV4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBza2ItPmRhdGFbaV0pOworCQlyZXR1cm4gMTsKKwl9CisJaSsrOworCisJaSsrOwkJCQkvKiBTa2lwIGxlbmd0aCBmaWVsZCAqLworCisJcmVwdHlwZSA9IHNrYi0+ZGF0YVtpKytdOworCisJaWYgKHNrYi0+ZGF0YVtpXSE9CisJICAgICgoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubG1pID09IExNSV9DQ0lUVCkKKwkgICAgID8gTE1JX0NDSVRUX0FMSVZFIDogTE1JX0FMSVZFKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5zdXBwb3J0ZWQgc3RhdHVzIGVsZW1lbnQ9JXhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHNrYi0+ZGF0YVtpXSk7CisJCXJldHVybiAxOworCX0KKwlpKys7CisKKwlpKys7CQkJLyogU2tpcCBsZW5ndGggZmllbGQgKi8KKworCWhkbGMtPnN0YXRlLmZyLnJ4c2VxID0gc2tiLT5kYXRhW2krK107IC8qIFRYIHNlcXVlbmNlIGZyb20gcGVlciAqLworCXJ4c2VxID0gc2tiLT5kYXRhW2krK107CS8qIFNob3VsZCBjb25maXJtIG91ciBzZXF1ZW5jZSAqLworCisJdHhzZXEgPSBoZGxjLT5zdGF0ZS5mci50eHNlcTsKKworCWlmIChoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5kY2UpIHsKKwkJaWYgKHJlcHR5cGUgIT0gTE1JX0ZVTExSRVAgJiYgcmVwdHlwZSAhPSBMTUlfSU5URUdSSVRZKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5zdXBwb3J0ZWQgcmVwb3J0IHR5cGU9JXhcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCByZXB0eXBlKTsKKwkJCXJldHVybiAxOworCQl9CisJCWhkbGMtPnN0YXRlLmZyLmxhc3RfcG9sbCA9IGppZmZpZXM7CisJfQorCisJZXJyb3IgPSAwOworCWlmICghaGRsYy0+c3RhdGUuZnIucmVsaWFibGUpCisJCWVycm9yID0gMTsKKworCWlmIChyeHNlcSA9PSAwIHx8IHJ4c2VxICE9IHR4c2VxKSB7CisJCWhkbGMtPnN0YXRlLmZyLm4zOTFjbnQgPSAwOyAvKiBBc2sgZm9yIGZ1bGwgcmVwb3J0IG5leHQgdGltZSAqLworCQllcnJvciA9IDE7CisJfQorCisJaWYgKGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmRjZSkgeworCQlpZiAoaGRsYy0+c3RhdGUuZnIuZnVsbHJlcF9zZW50ICYmICFlcnJvcikgeworLyogU3RvcCBzZW5kaW5nIGZ1bGwgcmVwb3J0IC0gdGhlIGxhc3Qgb25lIGhhcyBiZWVuIGNvbmZpcm1lZCBieSBEVEUgKi8KKwkJCWhkbGMtPnN0YXRlLmZyLmZ1bGxyZXBfc2VudCA9IDA7CisJCQlwdmMgPSBoZGxjLT5zdGF0ZS5mci5maXJzdF9wdmM7CisJCQl3aGlsZSAocHZjKSB7CisJCQkJaWYgKHB2Yy0+c3RhdGUubmV3KSB7CisJCQkJCXB2Yy0+c3RhdGUubmV3ID0gMDsKKworLyogVGVsbCBEVEUgdGhhdCBuZXcgUFZDIGlzIG5vdyBhY3RpdmUgKi8KKwkJCQkJaGRsYy0+c3RhdGUuZnIuZGNlX2NoYW5nZWQgPSAxOworCQkJCX0KKwkJCQlwdmMgPSBwdmMtPm5leHQ7CisJCQl9CisJCX0KKworCQlpZiAoaGRsYy0+c3RhdGUuZnIuZGNlX2NoYW5nZWQpIHsKKwkJCXJlcHR5cGUgPSBMTUlfRlVMTFJFUDsKKwkJCWhkbGMtPnN0YXRlLmZyLmZ1bGxyZXBfc2VudCA9IDE7CisJCQloZGxjLT5zdGF0ZS5mci5kY2VfY2hhbmdlZCA9IDA7CisJCX0KKworCQlmcl9sbWlfc2VuZChkZXYsIHJlcHR5cGUgPT0gTE1JX0ZVTExSRVAgPyAxIDogMCk7CisJCXJldHVybiAwOworCX0KKworCS8qIERURSAqLworCisJaGRsYy0+c3RhdGUuZnIucmVxdWVzdCA9IDA7IC8qIGdvdCByZXNwb25zZSwgbm8gcmVxdWVzdCBwZW5kaW5nICovCisKKwlpZiAoZXJyb3IpCisJCXJldHVybiAwOworCisJaWYgKHJlcHR5cGUgIT0gTE1JX0ZVTExSRVApCisJCXJldHVybiAwOworCisJc3RhdF9sZW4gPSAzOworCXB2YyA9IGhkbGMtPnN0YXRlLmZyLmZpcnN0X3B2YzsKKworCXdoaWxlIChwdmMpIHsKKwkJcHZjLT5zdGF0ZS5kZWxldGVkID0gMTsKKwkJcHZjID0gcHZjLT5uZXh0OworCX0KKworCW5vX3JhbSA9IDA7CisJd2hpbGUgKHNrYi0+bGVuID49IGkgKyAyICsgc3RhdF9sZW4pIHsKKwkJdTE2IGRsY2k7CisJCXVuc2lnbmVkIGludCBhY3RpdmUsIG5ldzsKKworCQlpZiAoc2tiLT5kYXRhW2ldICE9ICgoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubG1pID09IExNSV9DQ0lUVCkKKwkJCQkgICAgID8gTE1JX0NDSVRUX1BWQ1NUQVQgOiBMTUlfUFZDU1RBVCkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJbnZhbGlkIFBWQ1NUQVQgSUQ6ICV4XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgc2tiLT5kYXRhW2ldKTsKKwkJCXJldHVybiAxOworCQl9CisJCWkrKzsKKworCQlpZiAoc2tiLT5kYXRhW2ldICE9IHN0YXRfbGVuKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSW52YWxpZCBQVkNTVEFUIGxlbmd0aDogJXhcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBza2ItPmRhdGFbaV0pOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaSsrOworCisJCWRsY2kgPSBzdGF0dXNfdG9fZGxjaShza2ItPmRhdGEgKyBpLCAmYWN0aXZlLCAmbmV3KTsKKworCQlwdmMgPSBhZGRfcHZjKGRldiwgZGxjaSk7CisKKwkJaWYgKCFwdmMgJiYgIW5vX3JhbSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogTWVtb3J5IHNxdWVlemUgb24gZnJfbG1pX3JlY3YoKVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJbm9fcmFtID0gMTsKKwkJfQorCisJCWlmIChwdmMpIHsKKwkJCXB2Yy0+c3RhdGUuZXhpc3QgPSAxOworCQkJcHZjLT5zdGF0ZS5kZWxldGVkID0gMDsKKwkJCWlmIChhY3RpdmUgIT0gcHZjLT5zdGF0ZS5hY3RpdmUgfHwKKwkJCSAgICBuZXcgIT0gcHZjLT5zdGF0ZS5uZXcgfHwKKwkJCSAgICAhcHZjLT5zdGF0ZS5leGlzdCkgeworCQkJCXB2Yy0+c3RhdGUubmV3ID0gbmV3OworCQkJCXB2Yy0+c3RhdGUuYWN0aXZlID0gYWN0aXZlOworCQkJCXB2Y19jYXJyaWVyKGFjdGl2ZSwgcHZjKTsKKwkJCQlmcl9sb2dfZGxjaV9hY3RpdmUocHZjKTsKKwkJCX0KKwkJfQorCisJCWkgKz0gc3RhdF9sZW47CisJfQorCisJcHZjID0gaGRsYy0+c3RhdGUuZnIuZmlyc3RfcHZjOworCisJd2hpbGUgKHB2YykgeworCQlpZiAocHZjLT5zdGF0ZS5kZWxldGVkICYmIHB2Yy0+c3RhdGUuZXhpc3QpIHsKKwkJCXB2Y19jYXJyaWVyKDAsIHB2Yyk7CisJCQlwdmMtPnN0YXRlLmFjdGl2ZSA9IHB2Yy0+c3RhdGUubmV3ID0gMDsKKwkJCXB2Yy0+c3RhdGUuZXhpc3QgPSAwOworCQkJZnJfbG9nX2RsY2lfYWN0aXZlKHB2Yyk7CisJCX0KKwkJcHZjID0gcHZjLT5uZXh0OworCX0KKworCS8qIE5leHQgZnVsbCByZXBvcnQgYWZ0ZXIgTjM5MSBwb2xscyAqLworCWhkbGMtPnN0YXRlLmZyLm4zOTFjbnQgPSBoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncy5uMzkxOworCisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IGZyX3J4KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBza2ItPmRldjsKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKG5kZXYpOworCWZyX2hkciAqZmggPSAoZnJfaGRyKilza2ItPmRhdGE7CisJdTggKmRhdGEgPSBza2ItPmRhdGE7CisJdTE2IGRsY2k7CisJcHZjX2RldmljZSAqcHZjOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCisJaWYgKHNrYi0+bGVuIDw9IDQgfHwgZmgtPmVhMSB8fCBkYXRhWzJdICE9IEZSX1VJKQorCQlnb3RvIHJ4X2Vycm9yOworCisJZGxjaSA9IHE5MjJfdG9fZGxjaShza2ItPmRhdGEpOworCisJaWYgKGRsY2kgPT0gTE1JX0RMQ0kpIHsKKwkJaWYgKGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmxtaSA9PSBMTUlfTk9ORSkKKwkJCWdvdG8gcnhfZXJyb3I7IC8qIExNSSBwYWNrZXQgd2l0aCBubyBMTUk/ICovCisKKwkJaWYgKGRhdGFbM10gPT0gTE1JX1BST1RPKSB7CisJCQlpZiAoZnJfbG1pX3JlY3YobmRldiwgc2tiKSkKKwkJCQlnb3RvIHJ4X2Vycm9yOworCQkJZWxzZSB7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCQlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7CisJCQl9CisJCX0KKworCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVjZWl2ZWQgbm9uLUxNSSBmcmFtZSB3aXRoIExNSSBETENJXG4iLAorCQkgICAgICAgbmRldi0+bmFtZSk7CisJCWdvdG8gcnhfZXJyb3I7CisJfQorCisJcHZjID0gZmluZF9wdmMoaGRsYywgZGxjaSk7CisJaWYgKCFwdmMpIHsKKyNpZmRlZiBERUJVR19QS1QKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vIFBWQyBmb3IgcmVjZWl2ZWQgZnJhbWUncyBETENJICVkXG4iLAorCQkgICAgICAgbmRldi0+bmFtZSwgZGxjaSk7CisjZW5kaWYKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIE5FVF9SWF9EUk9QOworCX0KKworCWlmIChwdmMtPnN0YXRlLmZlY24gIT0gZmgtPmZlY24pIHsKKyNpZmRlZiBERUJVR19FQ04KKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBETENJICVkIEZFQ04gTyVzXG4iLCBuZGV2LT5uYW1lLAorCQkgICAgICAgZGxjaSwgZmgtPmZlY24gPyAiTiIgOiAiRkYiKTsKKyNlbmRpZgorCQlwdmMtPnN0YXRlLmZlY24gXj0gMTsKKwl9CisKKwlpZiAocHZjLT5zdGF0ZS5iZWNuICE9IGZoLT5iZWNuKSB7CisjaWZkZWYgREVCVUdfRUNOCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRExDSSAlZCBCRUNOIE8lc1xuIiwgbmRldi0+bmFtZSwKKwkJICAgICAgIGRsY2ksIGZoLT5iZWNuID8gIk4iIDogIkZGIik7CisjZW5kaWYKKwkJcHZjLT5zdGF0ZS5iZWNuIF49IDE7CisJfQorCisKKwlpZiAoKHNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCWhkbGMtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuIE5FVF9SWF9EUk9QOworCX0KKworCWlmIChkYXRhWzNdID09IE5MUElEX0lQKSB7CisJCXNrYl9wdWxsKHNrYiwgNCk7IC8qIFJlbW92ZSA0LWJ5dGUgaGVhZGVyIChoZHIsIFVJLCBOTFBJRCkgKi8KKwkJZGV2ID0gcHZjLT5tYWluOworCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOworCisJfSBlbHNlIGlmIChkYXRhWzNdID09IE5MUElEX0lQVjYpIHsKKwkJc2tiX3B1bGwoc2tiLCA0KTsgLyogUmVtb3ZlIDQtYnl0ZSBoZWFkZXIgKGhkciwgVUksIE5MUElEKSAqLworCQlkZXYgPSBwdmMtPm1haW47CisJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUFY2KTsKKworCX0gZWxzZSBpZiAoc2tiLT5sZW4gPiAxMCAmJiBkYXRhWzNdID09IEZSX1BBRCAmJgorCQkgICBkYXRhWzRdID09IE5MUElEX1NOQVAgJiYgZGF0YVs1XSA9PSBGUl9QQUQpIHsKKwkJdTE2IG91aSA9IG50b2hzKCoodTE2KikoZGF0YSArIDYpKTsKKwkJdTE2IHBpZCA9IG50b2hzKCoodTE2KikoZGF0YSArIDgpKTsKKwkJc2tiX3B1bGwoc2tiLCAxMCk7CisKKwkJc3dpdGNoICgoKCh1MzIpb3VpKSA8PCAxNikgfCBwaWQpIHsKKwkJY2FzZSBFVEhfUF9BUlA6IC8qIHJvdXRlZCBmcmFtZSB3aXRoIFNOQVAgKi8KKwkJY2FzZSBFVEhfUF9JUFg6CisJCWNhc2UgRVRIX1BfSVA6CS8qIGEgbG9uZyB2YXJpYW50ICovCisJCWNhc2UgRVRIX1BfSVBWNjoKKwkJCWRldiA9IHB2Yy0+bWFpbjsKKwkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhwaWQpOworCQkJYnJlYWs7CisKKwkJY2FzZSAweDgwQzIwMDA3OiAvKiBicmlkZ2VkIEV0aGVybmV0IGZyYW1lICovCisJCQlpZiAoKGRldiA9IHB2Yy0+ZXRoZXIpICE9IE5VTEwpCisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5zdXBwb3J0ZWQgcHJvdG9jb2wsIE9VST0leCAiCisJCQkgICAgICAgIlBJRD0leFxuIiwgbmRldi0+bmFtZSwgb3VpLCBwaWQpOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCXJldHVybiBORVRfUlhfRFJPUDsKKwkJfQorCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbnN1cHBvcnRlZCBwcm90b2NvbCwgTkxQSUQ9JXggIgorCQkgICAgICAgImxlbmd0aCA9ICVpXG4iLCBuZGV2LT5uYW1lLCBkYXRhWzNdLCBza2ItPmxlbik7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiBORVRfUlhfRFJPUDsKKwl9CisKKwlpZiAoZGV2KSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IHB2Y19nZXRfc3RhdHMoZGV2KTsKKwkJc3RhdHMtPnJ4X3BhY2tldHMrKzsgLyogUFZDIHRyYWZmaWMgKi8KKwkJc3RhdHMtPnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQlpZiAocHZjLT5zdGF0ZS5iZWNuKQorCQkJc3RhdHMtPnJ4X2NvbXByZXNzZWQrKzsKKwkJc2tiLT5kZXYgPSBkZXY7CisJCW5ldGlmX3J4KHNrYik7CisJCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKKwl9IGVsc2UgeworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlyZXR1cm4gTkVUX1JYX0RST1A7CisJfQorCisgcnhfZXJyb3I6CisJaGRsYy0+c3RhdHMucnhfZXJyb3JzKys7IC8qIE1hcmsgZXJyb3IgKi8KKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCXJldHVybiBORVRfUlhfRFJPUDsKK30KKworCisKK3N0YXRpYyB2b2lkIGZyX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworI2lmZGVmIERFQlVHX0xJTksKKwlwcmludGsoS0VSTl9ERUJVRyAiZnJfc3RhcnRcbiIpOworI2VuZGlmCisJaWYgKGhkbGMtPnN0YXRlLmZyLnNldHRpbmdzLmxtaSAhPSBMTUlfTk9ORSkgeworCQloZGxjLT5zdGF0ZS5mci5yZWxpYWJsZSA9IDA7CisJCWhkbGMtPnN0YXRlLmZyLmRjZV9jaGFuZ2VkID0gMTsKKwkJaGRsYy0+c3RhdGUuZnIucmVxdWVzdCA9IDA7CisJCWhkbGMtPnN0YXRlLmZyLmZ1bGxyZXBfc2VudCA9IDA7CisJCWhkbGMtPnN0YXRlLmZyLmxhc3RfZXJyb3JzID0gMHhGRkZGRkZGRjsKKwkJaGRsYy0+c3RhdGUuZnIubjM5MWNudCA9IDA7CisJCWhkbGMtPnN0YXRlLmZyLnR4c2VxID0gaGRsYy0+c3RhdGUuZnIucnhzZXEgPSAwOworCisJCWluaXRfdGltZXIoJmhkbGMtPnN0YXRlLmZyLnRpbWVyKTsKKwkJLyogRmlyc3QgcG9sbCBhZnRlciAxIHMgKi8KKwkJaGRsYy0+c3RhdGUuZnIudGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKwkJaGRsYy0+c3RhdGUuZnIudGltZXIuZnVuY3Rpb24gPSBmcl90aW1lcjsKKwkJaGRsYy0+c3RhdGUuZnIudGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwkJYWRkX3RpbWVyKCZoZGxjLT5zdGF0ZS5mci50aW1lcik7CisJfSBlbHNlCisJCWZyX3NldF9saW5rX3N0YXRlKDEsIGRldik7Cit9CisKKworCitzdGF0aWMgdm9pZCBmcl9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworI2lmZGVmIERFQlVHX0xJTksKKwlwcmludGsoS0VSTl9ERUJVRyAiZnJfc3RvcFxuIik7CisjZW5kaWYKKwlpZiAoaGRsYy0+c3RhdGUuZnIuc2V0dGluZ3MubG1pICE9IExNSV9OT05FKQorCQlkZWxfdGltZXJfc3luYygmaGRsYy0+c3RhdGUuZnIudGltZXIpOworCWZyX3NldF9saW5rX3N0YXRlKDAsIGRldik7Cit9CisKKworCitzdGF0aWMgdm9pZCBmcl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwlwdmNfZGV2aWNlICpwdmMgPSBoZGxjLT5zdGF0ZS5mci5maXJzdF9wdmM7CisKKwl3aGlsZSAocHZjKSB7CQkvKiBTaHV0ZG93biBhbGwgUFZDcyBmb3IgdGhpcyBGUkFEICovCisJCWlmIChwdmMtPm1haW4pCisJCQlkZXZfY2xvc2UocHZjLT5tYWluKTsKKwkJaWYgKHB2Yy0+ZXRoZXIpCisJCQlkZXZfY2xvc2UocHZjLT5ldGhlcik7CisJCXB2YyA9IHB2Yy0+bmV4dDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRsY2lfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkZXYtPnR5cGUgPSBBUlBIUkRfRExDSTsKKwlkZXYtPmZsYWdzID0gSUZGX1BPSU5UT1BPSU5UOworCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gMTA7CisJZGV2LT5hZGRyX2xlbiA9IDI7Cit9CisKK3N0YXRpYyBpbnQgZnJfYWRkX3B2YyhzdHJ1Y3QgbmV0X2RldmljZSAqbWFzdGVyLCB1bnNpZ25lZCBpbnQgZGxjaSwgaW50IHR5cGUpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhtYXN0ZXIpOworCXB2Y19kZXZpY2UgKnB2YyA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgcmVzdWx0LCB1c2VkOworCWNoYXIgKiBwcmVmaXggPSAicHZjJWQiOworCisJaWYgKHR5cGUgPT0gQVJQSFJEX0VUSEVSKQorCQlwcmVmaXggPSAicHZjZXRoJWQiOworCisJaWYgKChwdmMgPSBhZGRfcHZjKG1hc3RlciwgZGxjaSkpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1lbW9yeSBzcXVlZXplIG9uIGZyX2FkZF9wdmMoKVxuIiwKKwkJICAgICAgIG1hc3Rlci0+bmFtZSk7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisKKwlpZiAoKmdldF9kZXZfcChwdmMsIHR5cGUpKQorCQlyZXR1cm4gLUVFWElTVDsKKworCXVzZWQgPSBwdmNfaXNfdXNlZChwdmMpOworCisJaWYgKHR5cGUgPT0gQVJQSFJEX0VUSEVSKQorCQlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSwKKwkJCQkgICAicHZjZXRoJWQiLCBldGhlcl9zZXR1cCk7CisJZWxzZQorCQlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSwKKwkJCQkgICAicHZjJWQiLCBkbGNpX3NldHVwKTsKKworCWlmICghZGV2KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNZW1vcnkgc3F1ZWV6ZSBvbiBmcl9wdmMoKVxuIiwKKwkJICAgICAgIG1hc3Rlci0+bmFtZSk7CisJCWRlbGV0ZV91bnVzZWRfcHZjcyhoZGxjKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKworCWlmICh0eXBlID09IEFSUEhSRF9FVEhFUikgeworCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgIlx4MDBceDAxIiwgMik7CisgICAgICAgICAgICAgICAgZ2V0X3JhbmRvbV9ieXRlcyhkZXYtPmRldl9hZGRyICsgMiwgRVRIX0FMRU4gLSAyKTsKKwl9IGVsc2UgeworCQkqKHUxNiopZGV2LT5kZXZfYWRkciA9IGh0b25zKGRsY2kpOworCQlkbGNpX3RvX3E5MjIoZGV2LT5icm9hZGNhc3QsIGRsY2kpOworCX0KKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHB2Y194bWl0OworCWRldi0+Z2V0X3N0YXRzID0gcHZjX2dldF9zdGF0czsKKwlkZXYtPm9wZW4gPSBwdmNfb3BlbjsKKwlkZXYtPnN0b3AgPSBwdmNfY2xvc2U7CisJZGV2LT5kb19pb2N0bCA9IHB2Y19pb2N0bDsKKwlkZXYtPmNoYW5nZV9tdHUgPSBwdmNfY2hhbmdlX210dTsKKwlkZXYtPm10dSA9IEhETENfTUFYX01UVTsKKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IDA7CisJZGV2LT5wcml2ID0gcHZjOworCisJcmVzdWx0ID0gZGV2X2FsbG9jX25hbWUoZGV2LCBkZXYtPm5hbWUpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCWRlbGV0ZV91bnVzZWRfcHZjcyhoZGxjKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2aWNlKGRldikgIT0gMCkgeworCQlmcmVlX25ldGRldihkZXYpOworCQlkZWxldGVfdW51c2VkX3B2Y3MoaGRsYyk7CisJCXJldHVybiAtRUlPOworCX0KKworCWRldi0+ZGVzdHJ1Y3RvciA9IGZyZWVfbmV0ZGV2OworCSpnZXRfZGV2X3AocHZjLCB0eXBlKSA9IGRldjsKKwlpZiAoIXVzZWQpIHsKKwkJaGRsYy0+c3RhdGUuZnIuZGNlX2NoYW5nZWQgPSAxOworCQloZGxjLT5zdGF0ZS5mci5kY2VfcHZjX2NvdW50Kys7CisJfQorCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCBmcl9kZWxfcHZjKGhkbGNfZGV2aWNlICpoZGxjLCB1bnNpZ25lZCBpbnQgZGxjaSwgaW50IHR5cGUpCit7CisJcHZjX2RldmljZSAqcHZjOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwlpZiAoKHB2YyA9IGZpbmRfcHZjKGhkbGMsIGRsY2kpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWlmICgoZGV2ID0gKmdldF9kZXZfcChwdmMsIHR5cGUpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKQorCQlyZXR1cm4gLUVCVVNZOwkJLyogUFZDIGluIHVzZSAqLworCisJdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsgLyogdGhlIGRlc3RydWN0b3Igd2lsbCBmcmVlX25ldGRldihkZXYpICovCisJKmdldF9kZXZfcChwdmMsIHR5cGUpID0gTlVMTDsKKworCWlmICghcHZjX2lzX3VzZWQocHZjKSkgeworCQloZGxjLT5zdGF0ZS5mci5kY2VfcHZjX2NvdW50LS07CisJCWhkbGMtPnN0YXRlLmZyLmRjZV9jaGFuZ2VkID0gMTsKKwl9CisJZGVsZXRlX3VudXNlZF9wdmNzKGhkbGMpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIHZvaWQgZnJfZGVzdHJveShoZGxjX2RldmljZSAqaGRsYykKK3sKKwlwdmNfZGV2aWNlICpwdmM7CisKKwlwdmMgPSBoZGxjLT5zdGF0ZS5mci5maXJzdF9wdmM7CisJaGRsYy0+c3RhdGUuZnIuZmlyc3RfcHZjID0gTlVMTDsgLyogQWxsIFBWQ3MgZGVzdHJveWVkICovCisJaGRsYy0+c3RhdGUuZnIuZGNlX3B2Y19jb3VudCA9IDA7CisJaGRsYy0+c3RhdGUuZnIuZGNlX2NoYW5nZWQgPSAxOworCisJd2hpbGUgKHB2YykgeworCQlwdmNfZGV2aWNlICpuZXh0ID0gcHZjLT5uZXh0OworCQkvKiBkZXN0cnVjdG9ycyB3aWxsIGZyZWVfbmV0ZGV2KCkgbWFpbiBhbmQgZXRoZXIgKi8KKwkJaWYgKHB2Yy0+bWFpbikKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKHB2Yy0+bWFpbik7CisKKwkJaWYgKHB2Yy0+ZXRoZXIpCisJCQl1bnJlZ2lzdGVyX25ldGRldmljZShwdmMtPmV0aGVyKTsKKworCQlrZnJlZShwdmMpOworCQlwdmMgPSBuZXh0OworCX0KK30KKworCisKK2ludCBoZGxjX2ZyX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyKQoreworCWZyX3Byb3RvIF9fdXNlciAqZnJfcyA9IGlmci0+aWZyX3NldHRpbmdzLmlmc19pZnN1LmZyOworCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKGZyX3Byb3RvKTsKKwlmcl9wcm90byBuZXdfc2V0dGluZ3M7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCWZyX3Byb3RvX3B2YyBwdmM7CisJaW50IHJlc3VsdDsKKworCXN3aXRjaCAoaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCWNhc2UgSUZfR0VUX1BST1RPOgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfUFJPVE9fRlI7CisJCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplIDwgc2l6ZSkgeworCQkJaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA9IHNpemU7IC8qIGRhdGEgc2l6ZSB3YW50ZWQgKi8KKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGZyX3MsICZoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncywgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIElGX1BST1RPX0ZSOgorCQlpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYoZGV2LT5mbGFncyAmIElGRl9VUCkKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfc2V0dGluZ3MsIGZyX3MsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKG5ld19zZXR0aW5ncy5sbWkgPT0gTE1JX0RFRkFVTFQpCisJCQluZXdfc2V0dGluZ3MubG1pID0gTE1JX0FOU0k7CisKKwkJaWYgKChuZXdfc2V0dGluZ3MubG1pICE9IExNSV9OT05FICYmCisJCSAgICAgbmV3X3NldHRpbmdzLmxtaSAhPSBMTUlfQU5TSSAmJgorCQkgICAgIG5ld19zZXR0aW5ncy5sbWkgIT0gTE1JX0NDSVRUKSB8fAorCQkgICAgbmV3X3NldHRpbmdzLnQzOTEgPCAxIHx8CisJCSAgICBuZXdfc2V0dGluZ3MudDM5MiA8IDIgfHwKKwkJICAgIG5ld19zZXR0aW5ncy5uMzkxIDwgMSB8fAorCQkgICAgbmV3X3NldHRpbmdzLm4zOTIgPCAxIHx8CisJCSAgICBuZXdfc2V0dGluZ3MubjM5MyA8IG5ld19zZXR0aW5ncy5uMzkyIHx8CisJCSAgICBuZXdfc2V0dGluZ3MubjM5MyA+IDMyIHx8CisJCSAgICAobmV3X3NldHRpbmdzLmRjZSAhPSAwICYmCisJCSAgICAgbmV3X3NldHRpbmdzLmRjZSAhPSAxKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXJlc3VsdD1oZGxjLT5hdHRhY2goZGV2LCBFTkNPRElOR19OUlosUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVCk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCisJCWlmIChoZGxjLT5wcm90by5pZCAhPSBJRl9QUk9UT19GUikgeworCQkJaGRsY19wcm90b19kZXRhY2goaGRsYyk7CisJCQloZGxjLT5zdGF0ZS5mci5maXJzdF9wdmMgPSBOVUxMOworCQkJaGRsYy0+c3RhdGUuZnIuZGNlX3B2Y19jb3VudCA9IDA7CisJCX0KKwkJbWVtY3B5KCZoZGxjLT5zdGF0ZS5mci5zZXR0aW5ncywgJm5ld19zZXR0aW5ncywgc2l6ZSk7CisJCW1lbXNldCgmaGRsYy0+cHJvdG8sIDAsIHNpemVvZihoZGxjLT5wcm90bykpOworCisJCWhkbGMtPnByb3RvLmNsb3NlID0gZnJfY2xvc2U7CisJCWhkbGMtPnByb3RvLnN0YXJ0ID0gZnJfc3RhcnQ7CisJCWhkbGMtPnByb3RvLnN0b3AgPSBmcl9zdG9wOworCQloZGxjLT5wcm90by5kZXRhY2ggPSBmcl9kZXN0cm95OworCQloZGxjLT5wcm90by5uZXRpZl9yeCA9IGZyX3J4OworCQloZGxjLT5wcm90by5pZCA9IElGX1BST1RPX0ZSOworCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGhkbGMtPnhtaXQ7CisJCWRldi0+aGFyZF9oZWFkZXIgPSBOVUxMOworCQlkZXYtPnR5cGUgPSBBUlBIUkRfRlJBRDsKKwkJZGV2LT5mbGFncyA9IElGRl9QT0lOVE9QT0lOVCB8IElGRl9OT0FSUDsKKwkJZGV2LT5hZGRyX2xlbiA9IDA7CisJCXJldHVybiAwOworCisJY2FzZSBJRl9QUk9UT19GUl9BRERfUFZDOgorCWNhc2UgSUZfUFJPVE9fRlJfREVMX1BWQzoKKwljYXNlIElGX1BST1RPX0ZSX0FERF9FVEhfUFZDOgorCWNhc2UgSUZfUFJPVE9fRlJfREVMX0VUSF9QVkM6CisJCWlmKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnB2YywgaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3UuZnJfcHZjLAorCQkJCSAgIHNpemVvZihmcl9wcm90b19wdmMpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChwdmMuZGxjaSA8PSAwIHx8IHB2Yy5kbGNpID49IDEwMjQpCisJCQlyZXR1cm4gLUVJTlZBTDsJLyogT25seSAxMCBiaXRzLCBETENJIDAgcmVzZXJ2ZWQgKi8KKworCQlpZiAoaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9PSBJRl9QUk9UT19GUl9BRERfRVRIX1BWQyB8fAorCQkgICAgaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9PSBJRl9QUk9UT19GUl9ERUxfRVRIX1BWQykKKwkJCXJlc3VsdCA9IEFSUEhSRF9FVEhFUjsgLyogYnJpZGdlZCBFdGhlcm5ldCBkZXZpY2UgKi8KKwkJZWxzZQorCQkJcmVzdWx0ID0gQVJQSFJEX0RMQ0k7CisKKwkJaWYgKGlmci0+aWZyX3NldHRpbmdzLnR5cGUgPT0gSUZfUFJPVE9fRlJfQUREX1BWQyB8fAorCQkgICAgaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9PSBJRl9QUk9UT19GUl9BRERfRVRIX1BWQykKKwkJCXJldHVybiBmcl9hZGRfcHZjKGRldiwgcHZjLmRsY2ksIHJlc3VsdCk7CisJCWVsc2UKKwkJCXJldHVybiBmcl9kZWxfcHZjKGhkbGMsIHB2Yy5kbGNpLCByZXN1bHQpOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfZ2VuZXJpYy5jIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfZ2VuZXJpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZDA2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vaGRsY19nZW5lcmljLmMKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiBHZW5lcmljIEhETEMgc3VwcG9ydCByb3V0aW5lcyBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgLSAyMDAzIEtyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBDdXJyZW50bHkgc3VwcG9ydGVkOgorICoJKiByYXcgSVAtaW4tSERMQworICoJKiBDaXNjbyBIRExDCisgKgkqIEZyYW1lIFJlbGF5IHdpdGggQU5TSSBvciBDQ0lUVCBMTUkgKGJvdGggdXNlciBhbmQgbmV0d29yayBzaWRlKQorICoJKiBQUFAKKyAqCSogWC4yNQorICoKKyAqIFVzZSBzZXRoZGxjIHV0aWxpdHkgdG8gc2V0IGxpbmUgcGFyYW1ldGVycywgcHJvdG9jb2wgYW5kIFBWQ3MKKyAqCisgKiBIb3cgZG9lcyBpdCB3b3JrOgorICogLSBwcm90by5vcGVuKCksIGNsb3NlKCksIHN0YXJ0KCksIHN0b3AoKSBjYWxscyBhcmUgc2VyaWFsaXplZC4KKyAqICAgVGhlIG9yZGVyIGlzOiBvcGVuLCBbIHN0YXJ0LCBzdG9wIC4uLiBdIGNsb3NlIC4uLgorICogLSBwcm90by5zdGFydCgpIGFuZCBzdG9wKCkgYXJlIGNhbGxlZCB3aXRoIHNwaW5fbG9ja19pcnEgaGVsZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGFwYi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KKworCitzdGF0aWMgY29uc3QgY2hhciogdmVyc2lvbiA9ICJIRExDIHN1cHBvcnQgbW9kdWxlIHJldmlzaW9uIDEuMTciOworCisjdW5kZWYgREVCVUdfTElOSworCisKK3N0YXRpYyBpbnQgaGRsY19jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCWlmICgobmV3X210dSA8IDY4KSB8fCAobmV3X210dSA+IEhETENfTUFYX01UVSkpCisJCXJldHVybiAtRUlOVkFMOworCWRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaGRsY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gaGRsY19zdGF0cyhkZXYpOworfQorCisKKworc3RhdGljIGludCBoZGxjX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgc3RydWN0IHBhY2tldF90eXBlICpwKQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwlpZiAoaGRsYy0+cHJvdG8ubmV0aWZfcngpCisJCXJldHVybiBoZGxjLT5wcm90by5uZXRpZl9yeChza2IpOworCisJaGRsYy0+c3RhdHMucnhfZHJvcHBlZCsrOyAvKiBTaG91bGRuJ3QgaGFwcGVuICovCisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiBORVRfUlhfRFJPUDsKK30KKworCisKK3N0YXRpYyB2b2lkIF9faGRsY19zZXRfY2Fycmllcl9vbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwlpZiAoaGRsYy0+cHJvdG8uc3RhcnQpCisJCXJldHVybiBoZGxjLT5wcm90by5zdGFydChkZXYpOworI2lmZGVmIERFQlVHX0xJTksKKwlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpKQorCQlwcmludGsoS0VSTl9FUlIgImhkbGNfc2V0X2NhcnJpZXJfb24oKTogYWxyZWFkeSBvblxuIik7CisjZW5kaWYKKwluZXRpZl9jYXJyaWVyX29uKGRldik7Cit9CisKKworCitzdGF0aWMgdm9pZCBfX2hkbGNfc2V0X2NhcnJpZXJfb2ZmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCWlmIChoZGxjLT5wcm90by5zdG9wKQorCQlyZXR1cm4gaGRsYy0+cHJvdG8uc3RvcChkZXYpOworCisjaWZkZWYgREVCVUdfTElOSworCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKQorCQlwcmludGsoS0VSTl9FUlIgImhkbGNfc2V0X2NhcnJpZXJfb2ZmKCk6IGFscmVhZHkgb2ZmXG4iKTsKKyNlbmRpZgorCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7Cit9CisKKworCit2b2lkIGhkbGNfc2V0X2NhcnJpZXIoaW50IG9uLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCW9uID0gb24gPyAxIDogMDsKKworI2lmZGVmIERFQlVHX0xJTksKKwlwcmludGsoS0VSTl9ERUJVRyAiaGRsY19zZXRfY2FycmllciAlaVxuIiwgb24pOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGRsYy0+c3RhdGVfbG9jaywgZmxhZ3MpOworCisJaWYgKGhkbGMtPmNhcnJpZXIgPT0gb24pCisJCWdvdG8gY2Fycmllcl9leGl0OyAvKiBubyBjaGFuZ2UgaW4gRENEIGxpbmUgbGV2ZWwgKi8KKworI2lmZGVmIERFQlVHX0xJTksKKwlwcmludGsoS0VSTl9JTkZPICIlczogY2FycmllciAlc1xuIiwgZGV2LT5uYW1lLCBvbiA/ICJPTiIgOiAib2ZmIik7CisjZW5kaWYKKwloZGxjLT5jYXJyaWVyID0gb247CisKKwlpZiAoIWhkbGMtPm9wZW4pCisJCWdvdG8gY2Fycmllcl9leGl0OworCisJaWYgKGhkbGMtPmNhcnJpZXIpCisJCV9faGRsY19zZXRfY2Fycmllcl9vbihkZXYpOworCWVsc2UKKwkJX19oZGxjX3NldF9jYXJyaWVyX29mZihkZXYpOworCitjYXJyaWVyX2V4aXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGRsYy0+c3RhdGVfbG9jaywgZmxhZ3MpOworfQorCisKKworLyogTXVzdCBiZSBjYWxsZWQgYnkgaGFyZHdhcmUgZHJpdmVyIHdoZW4gSERMQyBkZXZpY2UgaXMgYmVpbmcgb3BlbmVkICovCitpbnQgaGRsY19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworI2lmZGVmIERFQlVHX0xJTksKKwlwcmludGsoS0VSTl9ERUJVRyAiaGRsY19vcGVuKCkgY2FycmllciAlaSBvcGVuICVpXG4iLAorCSAgICAgICBoZGxjLT5jYXJyaWVyLCBoZGxjLT5vcGVuKTsKKyNlbmRpZgorCisJaWYgKGhkbGMtPnByb3RvLmlkID09IC0xKQorCQlyZXR1cm4gLUVOT1NZUzsJLyogbm8gcHJvdG9jb2wgYXR0YWNoZWQgKi8KKworCWlmIChoZGxjLT5wcm90by5vcGVuKSB7CisJCWludCByZXN1bHQgPSBoZGxjLT5wcm90by5vcGVuKGRldik7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXNwaW5fbG9ja19pcnEoJmhkbGMtPnN0YXRlX2xvY2spOworCisJaWYgKGhkbGMtPmNhcnJpZXIpCisJCV9faGRsY19zZXRfY2Fycmllcl9vbihkZXYpOworCisJaGRsYy0+b3BlbiA9IDE7CisKKwlzcGluX3VubG9ja19pcnEoJmhkbGMtPnN0YXRlX2xvY2spOworCXJldHVybiAwOworfQorCisKKworLyogTXVzdCBiZSBjYWxsZWQgYnkgaGFyZHdhcmUgZHJpdmVyIHdoZW4gSERMQyBkZXZpY2UgaXMgYmVpbmcgY2xvc2VkICovCit2b2lkIGhkbGNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisjaWZkZWYgREVCVUdfTElOSworCXByaW50ayhLRVJOX0RFQlVHICJoZGxjX2Nsb3NlKCkgY2FycmllciAlaSBvcGVuICVpXG4iLAorCSAgICAgICBoZGxjLT5jYXJyaWVyLCBoZGxjLT5vcGVuKTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycSgmaGRsYy0+c3RhdGVfbG9jayk7CisKKwloZGxjLT5vcGVuID0gMDsKKwlpZiAoaGRsYy0+Y2FycmllcikKKwkJX19oZGxjX3NldF9jYXJyaWVyX29mZihkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxKCZoZGxjLT5zdGF0ZV9sb2NrKTsKKworCWlmIChoZGxjLT5wcm90by5jbG9zZSkKKwkJaGRsYy0+cHJvdG8uY2xvc2UoZGV2KTsKK30KKworCisKKyNpZm5kZWYgQ09ORklHX0hETENfUkFXCisjZGVmaW5lIGhkbGNfcmF3X2lvY3RsKGRldiwgaWZyKQktRU5PU1lTCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfSERMQ19SQVdfRVRICisjZGVmaW5lIGhkbGNfcmF3X2V0aF9pb2N0bChkZXYsIGlmcikJLUVOT1NZUworI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX0hETENfUFBQCisjZGVmaW5lIGhkbGNfcHBwX2lvY3RsKGRldiwgaWZyKQktRU5PU1lTCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfSERMQ19DSVNDTworI2RlZmluZSBoZGxjX2Npc2NvX2lvY3RsKGRldiwgaWZyKQktRU5PU1lTCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfSERMQ19GUgorI2RlZmluZSBoZGxjX2ZyX2lvY3RsKGRldiwgaWZyKQkJLUVOT1NZUworI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX0hETENfWDI1CisjZGVmaW5lIGhkbGNfeDI1X2lvY3RsKGRldiwgaWZyKQktRU5PU1lTCisjZW5kaWYKKworCitpbnQgaGRsY19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJdW5zaWduZWQgaW50IHByb3RvOworCisJaWYgKGNtZCAhPSBTSU9DV0FOREVWKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaChpZnItPmlmcl9zZXR0aW5ncy50eXBlKSB7CisJY2FzZSBJRl9QUk9UT19IRExDOgorCWNhc2UgSUZfUFJPVE9fSERMQ19FVEg6CisJY2FzZSBJRl9QUk9UT19QUFA6CisJY2FzZSBJRl9QUk9UT19DSVNDTzoKKwljYXNlIElGX1BST1RPX0ZSOgorCWNhc2UgSUZfUFJPVE9fWDI1OgorCQlwcm90byA9IGlmci0+aWZyX3NldHRpbmdzLnR5cGU7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJvdG8gPSBoZGxjLT5wcm90by5pZDsKKwl9CisKKwlzd2l0Y2gocHJvdG8pIHsKKwljYXNlIElGX1BST1RPX0hETEM6CXJldHVybiBoZGxjX3Jhd19pb2N0bChkZXYsIGlmcik7CisJY2FzZSBJRl9QUk9UT19IRExDX0VUSDoJcmV0dXJuIGhkbGNfcmF3X2V0aF9pb2N0bChkZXYsIGlmcik7CisJY2FzZSBJRl9QUk9UT19QUFA6CXJldHVybiBoZGxjX3BwcF9pb2N0bChkZXYsIGlmcik7CisJY2FzZSBJRl9QUk9UT19DSVNDTzoJcmV0dXJuIGhkbGNfY2lzY29faW9jdGwoZGV2LCBpZnIpOworCWNhc2UgSUZfUFJPVE9fRlI6CXJldHVybiBoZGxjX2ZyX2lvY3RsKGRldiwgaWZyKTsKKwljYXNlIElGX1BST1RPX1gyNToJcmV0dXJuIGhkbGNfeDI1X2lvY3RsKGRldiwgaWZyKTsKKwlkZWZhdWx0OgkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgdm9pZCBoZGxjX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCisJZGV2LT5nZXRfc3RhdHMgPSBoZGxjX2dldF9zdGF0czsKKwlkZXYtPmNoYW5nZV9tdHUgPSBoZGxjX2NoYW5nZV9tdHU7CisJZGV2LT5tdHUgPSBIRExDX01BWF9NVFU7CisKKwlkZXYtPnR5cGUgPSBBUlBIUkRfUkFXSERMQzsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IDE2OworCisJZGV2LT5mbGFncyA9IElGRl9QT0lOVE9QT0lOVCB8IElGRl9OT0FSUDsKKworCWhkbGMtPnByb3RvLmlkID0gLTE7CisJaGRsYy0+cHJvdG8uZGV0YWNoID0gTlVMTDsKKwloZGxjLT5jYXJyaWVyID0gMTsKKwloZGxjLT5vcGVuID0gMDsKKwlzcGluX2xvY2tfaW5pdCgmaGRsYy0+c3RhdGVfbG9jayk7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlICphbGxvY19oZGxjZGV2KHZvaWQgKnByaXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKGhkbGNfZGV2aWNlKSwgImhkbGMlZCIsIGhkbGNfc2V0dXApOworCWlmIChkZXYpCisJCWRldl90b19oZGxjKGRldiktPnByaXYgPSBwcml2OworCXJldHVybiBkZXY7Cit9CisKK2ludCByZWdpc3Rlcl9oZGxjX2RldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXN1bHQgPSBkZXZfYWxsb2NfbmFtZShkZXYsICJoZGxjJWQiKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXJlc3VsdCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXN1bHQgIT0gMCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpKQorCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOyAvKiBubyBjYXJyaWVyIHVudGlsIERDRCBnb2VzIHVwICovCisKKwlyZXR1cm4gMDsKK30KKworCisKK3ZvaWQgdW5yZWdpc3Rlcl9oZGxjX2RldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJ0bmxfbG9jaygpOworCWhkbGNfcHJvdG9fZGV0YWNoKGRldl90b19oZGxjKGRldikpOworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKGRldik7CisJcnRubF91bmxvY2soKTsKK30KKworCisKK01PRFVMRV9BVVRIT1IoIktyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkhETEMgc3VwcG9ydCBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworRVhQT1JUX1NZTUJPTChoZGxjX29wZW4pOworRVhQT1JUX1NZTUJPTChoZGxjX2Nsb3NlKTsKK0VYUE9SVF9TWU1CT0woaGRsY19zZXRfY2Fycmllcik7CitFWFBPUlRfU1lNQk9MKGhkbGNfaW9jdGwpOworRVhQT1JUX1NZTUJPTChhbGxvY19oZGxjZGV2KTsKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfaGRsY19kZXZpY2UpOworRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2hkbGNfZGV2aWNlKTsKKworc3RhdGljIHN0cnVjdCBwYWNrZXRfdHlwZSBoZGxjX3BhY2tldF90eXBlID0geworCS50eXBlID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9IRExDKSwKKwkuZnVuYyA9IGhkbGNfcmN2LAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBoZGxjX21vZHVsZV9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIHZlcnNpb24pOworICAgICAgICBkZXZfYWRkX3BhY2soJmhkbGNfcGFja2V0X3R5cGUpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIHZvaWQgX19leGl0IGhkbGNfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlkZXZfcmVtb3ZlX3BhY2soJmhkbGNfcGFja2V0X3R5cGUpOworfQorCisKK21vZHVsZV9pbml0KGhkbGNfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoaGRsY19tb2R1bGVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaGRsY19wcHAuYyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX3BwcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZDYxOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vaGRsY19wcHAuYwpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIEdlbmVyaWMgSERMQyBzdXBwb3J0IHJvdXRpbmVzIGZvciBMaW51eAorICogUG9pbnQtdG8tcG9pbnQgcHJvdG9jb2wgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSAtIDIwMDMgS3J6eXN6dG9mIEhhbGFzYSA8a2hjQHBtLndhdy5wbD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9sYXBiLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaGRsYy5oPgorCisKK3N0YXRpYyBpbnQgcHBwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJdm9pZCAqb2xkX2lvY3RsOworCWludCByZXN1bHQ7CisKKwlkZXYtPnByaXYgPSAmaGRsYy0+c3RhdGUucHBwLnN5bmNwcHBfcHRyOworCWhkbGMtPnN0YXRlLnBwcC5zeW5jcHBwX3B0ciA9ICZoZGxjLT5zdGF0ZS5wcHAucHBwZGV2OworCWhkbGMtPnN0YXRlLnBwcC5wcHBkZXYuZGV2ID0gZGV2OworCisJb2xkX2lvY3RsID0gZGV2LT5kb19pb2N0bDsKKwloZGxjLT5zdGF0ZS5wcHAub2xkX2NoYW5nZV9tdHUgPSBkZXYtPmNoYW5nZV9tdHU7CisJc3BwcF9hdHRhY2goJmhkbGMtPnN0YXRlLnBwcC5wcHBkZXYpOworCS8qIHNwcHBfYXR0YWNoIG51a2VzIHRoZW0uIFdlIGRvbid0IG5lZWQgc3luY3BwcCdzIGlvY3RsICovCisJZGV2LT5kb19pb2N0bCA9IG9sZF9pb2N0bDsKKwloZGxjLT5zdGF0ZS5wcHAucHBwZGV2LnNwcHAucHBfZmxhZ3MgJj0gflBQX0NJU0NPOworCWRldi0+dHlwZSA9IEFSUEhSRF9QUFA7CisJcmVzdWx0ID0gc3BwcF9vcGVuKGRldik7CisJaWYgKHJlc3VsdCkgeworCQlzcHBwX2RldGFjaChkZXYpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJldHVybiAwOworfQorCisKKworc3RhdGljIHZvaWQgcHBwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCisJc3BwcF9jbG9zZShkZXYpOworCXNwcHBfZGV0YWNoKGRldik7CisJZGV2LT5yZWJ1aWxkX2hlYWRlciA9IE5VTEw7CisJZGV2LT5jaGFuZ2VfbXR1ID0gaGRsYy0+c3RhdGUucHBwLm9sZF9jaGFuZ2VfbXR1OworCWRldi0+bXR1ID0gSERMQ19NQVhfTVRVOworCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gMTY7Cit9CisKKworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcHBwX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfV0FOX1BQUCk7Cit9CisKKworCitpbnQgaGRsY19wcHBfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCWludCByZXN1bHQ7CisKKwlzd2l0Y2ggKGlmci0+aWZyX3NldHRpbmdzLnR5cGUpIHsKKwljYXNlIElGX0dFVF9QUk9UTzoKKwkJaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9IElGX1BST1RPX1BQUDsKKwkJcmV0dXJuIDA7IC8qIHJldHVybiBwcm90b2NvbCBvbmx5LCBubyBzZXR0YWJsZSBwYXJhbWV0ZXJzICovCisKKwljYXNlIElGX1BST1RPX1BQUDoKKwkJaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmKGRldi0+ZmxhZ3MgJiBJRkZfVVApCisJCQlyZXR1cm4gLUVCVVNZOworCisJCS8qIG5vIHNldHRhYmxlIHBhcmFtZXRlcnMgKi8KKworCQlyZXN1bHQ9aGRsYy0+YXR0YWNoKGRldiwgRU5DT0RJTkdfTlJaLFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQpOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKworCQloZGxjX3Byb3RvX2RldGFjaChoZGxjKTsKKwkJbWVtc2V0KCZoZGxjLT5wcm90bywgMCwgc2l6ZW9mKGhkbGMtPnByb3RvKSk7CisKKwkJaGRsYy0+cHJvdG8ub3BlbiA9IHBwcF9vcGVuOworCQloZGxjLT5wcm90by5jbG9zZSA9IHBwcF9jbG9zZTsKKwkJaGRsYy0+cHJvdG8udHlwZV90cmFucyA9IHBwcF90eXBlX3RyYW5zOworCQloZGxjLT5wcm90by5pZCA9IElGX1BST1RPX1BQUDsKKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBoZGxjLT54bWl0OworCQlkZXYtPmhhcmRfaGVhZGVyID0gTlVMTDsKKwkJZGV2LT50eXBlID0gQVJQSFJEX1BQUDsKKwkJZGV2LT5hZGRyX2xlbiA9IDA7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfcmF3LmMgYi9kcml2ZXJzL25ldC93YW4vaGRsY19yYXcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDFmYjcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfcmF3LmMKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIEdlbmVyaWMgSERMQyBzdXBwb3J0IHJvdXRpbmVzIGZvciBMaW51eAorICogSERMQyBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IC0gMjAwMyBLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xhcGIuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CisKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IHJhd190eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKTsKK30KKworCisKK2ludCBoZGxjX3Jhd19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmcikKK3sKKwlyYXdfaGRsY19wcm90byBfX3VzZXIgKnJhd19zID0gaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3UucmF3X2hkbGM7CisJY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplb2YocmF3X2hkbGNfcHJvdG8pOworCXJhd19oZGxjX3Byb3RvIG5ld19zZXR0aW5nczsKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJaW50IHJlc3VsdDsKKworCXN3aXRjaCAoaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCWNhc2UgSUZfR0VUX1BST1RPOgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfUFJPVE9fSERMQzsKKwkJaWYgKGlmci0+aWZyX3NldHRpbmdzLnNpemUgPCBzaXplKSB7CisJCQlpZnItPmlmcl9zZXR0aW5ncy5zaXplID0gc2l6ZTsgLyogZGF0YSBzaXplIHdhbnRlZCAqLworCQkJcmV0dXJuIC1FTk9CVUZTOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIocmF3X3MsICZoZGxjLT5zdGF0ZS5yYXdfaGRsYy5zZXR0aW5ncywgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIElGX1BST1RPX0hETEM6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApCisJCQlyZXR1cm4gLUVCVVNZOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X3NldHRpbmdzLCByYXdfcywgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAobmV3X3NldHRpbmdzLmVuY29kaW5nID09IEVOQ09ESU5HX0RFRkFVTFQpCisJCQluZXdfc2V0dGluZ3MuZW5jb2RpbmcgPSBFTkNPRElOR19OUlo7CisKKwkJaWYgKG5ld19zZXR0aW5ncy5wYXJpdHkgPT0gUEFSSVRZX0RFRkFVTFQpCisJCQluZXdfc2V0dGluZ3MucGFyaXR5ID0gUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVDsKKworCQlyZXN1bHQgPSBoZGxjLT5hdHRhY2goZGV2LCBuZXdfc2V0dGluZ3MuZW5jb2RpbmcsCisJCQkJICAgICAgbmV3X3NldHRpbmdzLnBhcml0eSk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCisJCWhkbGNfcHJvdG9fZGV0YWNoKGhkbGMpOworCQltZW1jcHkoJmhkbGMtPnN0YXRlLnJhd19oZGxjLnNldHRpbmdzLCAmbmV3X3NldHRpbmdzLCBzaXplKTsKKwkJbWVtc2V0KCZoZGxjLT5wcm90bywgMCwgc2l6ZW9mKGhkbGMtPnByb3RvKSk7CisKKwkJaGRsYy0+cHJvdG8udHlwZV90cmFucyA9IHJhd190eXBlX3RyYW5zOworCQloZGxjLT5wcm90by5pZCA9IElGX1BST1RPX0hETEM7CisJCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaGRsYy0+eG1pdDsKKwkJZGV2LT5oYXJkX2hlYWRlciA9IE5VTEw7CisJCWRldi0+dHlwZSA9IEFSUEhSRF9SQVdIRExDOworCQlkZXYtPmZsYWdzID0gSUZGX1BPSU5UT1BPSU5UIHwgSUZGX05PQVJQOworCQlkZXYtPmFkZHJfbGVuID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaGRsY19yYXdfZXRoLmMgYi9kcml2ZXJzL25ldC93YW4vaGRsY19yYXdfZXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEyODVjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX3Jhd19ldGguYwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIEdlbmVyaWMgSERMQyBzdXBwb3J0IHJvdXRpbmVzIGZvciBMaW51eAorICogSERMQyBFdGhlcm5ldCBlbXVsYXRpb24gc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIEtyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGFwYi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGRsYy5oPgorCisKK3N0YXRpYyBpbnQgZXRoX3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHBhZCA9IEVUSF9aTEVOIC0gc2tiLT5sZW47CisJaWYgKHBhZCA+IDApIHsJCS8qIFBhZCB0aGUgZnJhbWUgd2l0aCB6ZXJvcyAqLworCQlpbnQgbGVuID0gc2tiLT5sZW47CisJCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IHBhZCkKKwkJCWlmIChwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgcGFkLCBHRlBfQVRPTUlDKSkgeworCQkJCWhkbGNfc3RhdHMoZGV2KS0+dHhfZHJvcHBlZCsrOworCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJc2tiX3B1dChza2IsIHBhZCk7CisJCW1lbXNldChza2ItPmRhdGEgKyBsZW4sIDAsIHBhZCk7CisJfQorCXJldHVybiBkZXZfdG9faGRsYyhkZXYpLT54bWl0KHNrYiwgZGV2KTsKK30KKworCitpbnQgaGRsY19yYXdfZXRoX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyKQoreworCXJhd19oZGxjX3Byb3RvIF9fdXNlciAqcmF3X3MgPSBpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5yYXdfaGRsYzsKKwljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihyYXdfaGRsY19wcm90byk7CisJcmF3X2hkbGNfcHJvdG8gbmV3X3NldHRpbmdzOworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwlpbnQgcmVzdWx0OworCXZvaWQgKm9sZF9jaF9tdHU7CisJaW50IG9sZF9xbGVuOworCisJc3dpdGNoIChpZnItPmlmcl9zZXR0aW5ncy50eXBlKSB7CisJY2FzZSBJRl9HRVRfUFJPVE86CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9QUk9UT19IRExDX0VUSDsKKwkJaWYgKGlmci0+aWZyX3NldHRpbmdzLnNpemUgPCBzaXplKSB7CisJCQlpZnItPmlmcl9zZXR0aW5ncy5zaXplID0gc2l6ZTsgLyogZGF0YSBzaXplIHdhbnRlZCAqLworCQkJcmV0dXJuIC1FTk9CVUZTOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIocmF3X3MsICZoZGxjLT5zdGF0ZS5yYXdfaGRsYy5zZXR0aW5ncywgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIElGX1BST1RPX0hETENfRVRIOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19zZXR0aW5ncywgcmF3X3MsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKG5ld19zZXR0aW5ncy5lbmNvZGluZyA9PSBFTkNPRElOR19ERUZBVUxUKQorCQkJbmV3X3NldHRpbmdzLmVuY29kaW5nID0gRU5DT0RJTkdfTlJaOworCisJCWlmIChuZXdfc2V0dGluZ3MucGFyaXR5ID09IFBBUklUWV9ERUZBVUxUKQorCQkJbmV3X3NldHRpbmdzLnBhcml0eSA9IFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQ7CisKKwkJcmVzdWx0ID0gaGRsYy0+YXR0YWNoKGRldiwgbmV3X3NldHRpbmdzLmVuY29kaW5nLAorCQkJCSAgICAgIG5ld19zZXR0aW5ncy5wYXJpdHkpOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKworCQloZGxjX3Byb3RvX2RldGFjaChoZGxjKTsKKwkJbWVtY3B5KCZoZGxjLT5zdGF0ZS5yYXdfaGRsYy5zZXR0aW5ncywgJm5ld19zZXR0aW5ncywgc2l6ZSk7CisJCW1lbXNldCgmaGRsYy0+cHJvdG8sIDAsIHNpemVvZihoZGxjLT5wcm90bykpOworCisJCWhkbGMtPnByb3RvLnR5cGVfdHJhbnMgPSBldGhfdHlwZV90cmFuczsKKwkJaGRsYy0+cHJvdG8uaWQgPSBJRl9QUk9UT19IRExDX0VUSDsKKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBldGhfdHg7CisJCW9sZF9jaF9tdHUgPSBkZXYtPmNoYW5nZV9tdHU7CisJCW9sZF9xbGVuID0gZGV2LT50eF9xdWV1ZV9sZW47CisJCWV0aGVyX3NldHVwKGRldik7CisJCWRldi0+Y2hhbmdlX210dSA9IG9sZF9jaF9tdHU7CisJCWRldi0+dHhfcXVldWVfbGVuID0gb2xkX3FsZW47CisJCW1lbWNweShkZXYtPmRldl9hZGRyLCAiXHgwMFx4MDEiLCAyKTsKKyAgICAgICAgICAgICAgICBnZXRfcmFuZG9tX2J5dGVzKGRldi0+ZGV2X2FkZHIgKyAyLCBFVEhfQUxFTiAtIDIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9oZGxjX3gyNS5jIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfeDI1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdlNWVlZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjX3gyNS5jCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogR2VuZXJpYyBIRExDIHN1cHBvcnQgcm91dGluZXMgZm9yIExpbnV4CisgKiBYLjI1IHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgLSAyMDAzIEtyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGFwYi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KKworI2luY2x1ZGUgPG5ldC94MjVkZXZpY2UuaD4KKworLyogVGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsYmFja3MgY2FsbGVkIGJ5IExBUEIgbGF5ZXIgKi8KKworc3RhdGljIHZvaWQgeDI1X2Nvbm5lY3RfZGlzY29ubmVjdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVhc29uLCBpbnQgY29kZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKworCWlmICgoc2tiID0gZGV2X2FsbG9jX3NrYigxKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvdXQgb2YgbWVtb3J5XG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJcHRyID0gc2tiX3B1dChza2IsIDEpOworCSpwdHIgPSBjb2RlOworCisJc2tiLT5wcm90b2NvbCA9IHgyNV90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwluZXRpZl9yeChza2IpOworfQorCisKKworc3RhdGljIHZvaWQgeDI1X2Nvbm5lY3RlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVhc29uKQoreworCXgyNV9jb25uZWN0X2Rpc2Nvbm5lY3QoZGV2LCByZWFzb24sIDEpOworfQorCisKKworc3RhdGljIHZvaWQgeDI1X2Rpc2Nvbm5lY3RlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVhc29uKQoreworCXgyNV9jb25uZWN0X2Rpc2Nvbm5lY3QoZGV2LCByZWFzb24sIDIpOworfQorCisKKworc3RhdGljIGludCB4MjVfZGF0YV9pbmRpY2F0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgY2hhciAqcHRyOworCisJc2tiX3B1c2goc2tiLCAxKTsKKworCWlmIChza2JfY293KHNrYiwgMSkpCisJCXJldHVybiBORVRfUlhfRFJPUDsKKworCXB0ciAgPSBza2ItPmRhdGE7CisJKnB0ciA9IDA7CisKKwlza2ItPnByb3RvY29sID0geDI1X3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCXJldHVybiBuZXRpZl9yeChza2IpOworfQorCisKKworc3RhdGljIHZvaWQgeDI1X2RhdGFfdHJhbnNtaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJaGRsYy0+eG1pdChza2IsIGRldik7IC8qIElnbm9yZSByZXR1cm4gdmFsdWUgOi0oICovCit9CisKKworCitzdGF0aWMgaW50IHgyNV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJlc3VsdDsKKworCisJLyogWC4yNSB0byBMQVBCICovCisJc3dpdGNoIChza2ItPmRhdGFbMF0pIHsKKwljYXNlIDA6CQkvKiBEYXRhIHRvIGJlIHRyYW5zbWl0dGVkICovCisJCXNrYl9wdWxsKHNrYiwgMSk7CisJCWlmICgocmVzdWx0ID0gbGFwYl9kYXRhX3JlcXVlc3QoZGV2LCBza2IpKSAhPSBMQVBCX09LKQorCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKworCWNhc2UgMToKKwkJaWYgKChyZXN1bHQgPSBsYXBiX2Nvbm5lY3RfcmVxdWVzdChkZXYpKSE9IExBUEJfT0spIHsKKwkJCWlmIChyZXN1bHQgPT0gTEFQQl9DT05ORUNURUQpCisJCQkJLyogU2VuZCBjb25uZWN0IGNvbmZpcm0uIG1zZyB0byBsZXZlbCAzICovCisJCQkJeDI1X2Nvbm5lY3RlZChkZXYsIDApOworCQkJZWxzZQorCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IExBUEIgY29ubmVjdCByZXF1ZXN0ICIKKwkJCQkgICAgICAgImZhaWxlZCwgZXJyb3IgY29kZSA9ICVpXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIHJlc3VsdCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCWlmICgocmVzdWx0ID0gbGFwYl9kaXNjb25uZWN0X3JlcXVlc3QoZGV2KSkgIT0gTEFQQl9PSykgeworCQkJaWYgKHJlc3VsdCA9PSBMQVBCX05PVENPTk5FQ1RFRCkKKwkJCQkvKiBTZW5kIGRpc2Nvbm5lY3QgY29uZmlybS4gbXNnIHRvIGxldmVsIDMgKi8KKwkJCQl4MjVfZGlzY29ubmVjdGVkKGRldiwgMCk7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogTEFQQiBkaXNjb25uZWN0IHJlcXVlc3QgIgorCQkJCSAgICAgICAiZmFpbGVkLCBlcnJvciBjb2RlID0gJWlcbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSwgcmVzdWx0KTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CQkvKiB0byBiZSBkZWZpbmVkICovCisJCWJyZWFrOworCX0KKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgeDI1X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFwYl9yZWdpc3Rlcl9zdHJ1Y3QgY2I7CisJaW50IHJlc3VsdDsKKworCWNiLmNvbm5lY3RfY29uZmlybWF0aW9uID0geDI1X2Nvbm5lY3RlZDsKKwljYi5jb25uZWN0X2luZGljYXRpb24gPSB4MjVfY29ubmVjdGVkOworCWNiLmRpc2Nvbm5lY3RfY29uZmlybWF0aW9uID0geDI1X2Rpc2Nvbm5lY3RlZDsKKwljYi5kaXNjb25uZWN0X2luZGljYXRpb24gPSB4MjVfZGlzY29ubmVjdGVkOworCWNiLmRhdGFfaW5kaWNhdGlvbiA9IHgyNV9kYXRhX2luZGljYXRpb247CisJY2IuZGF0YV90cmFuc21pdCA9IHgyNV9kYXRhX3RyYW5zbWl0OworCisJcmVzdWx0ID0gbGFwYl9yZWdpc3RlcihkZXYsICZjYik7CisJaWYgKHJlc3VsdCAhPSBMQVBCX09LKQorCQlyZXR1cm4gcmVzdWx0OworCXJldHVybiAwOworfQorCisKKworc3RhdGljIHZvaWQgeDI1X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbGFwYl91bnJlZ2lzdGVyKGRldik7Cit9CisKKworCitzdGF0aWMgaW50IHgyNV9yeChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoc2tiLT5kZXYpOworCisJaWYgKChza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkgeworCQloZGxjLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXJldHVybiBORVRfUlhfRFJPUDsKKwl9CisKKwlpZiAobGFwYl9kYXRhX3JlY2VpdmVkKHNrYi0+ZGV2LCBza2IpID09IExBUEJfT0spCisJCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKKworCWhkbGMtPnN0YXRzLnJ4X2Vycm9ycysrOworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJcmV0dXJuIE5FVF9SWF9EUk9QOworfQorCisKKworaW50IGhkbGNfeDI1X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyKQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwlpbnQgcmVzdWx0OworCisJc3dpdGNoIChpZnItPmlmcl9zZXR0aW5ncy50eXBlKSB7CisJY2FzZSBJRl9HRVRfUFJPVE86CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9QUk9UT19YMjU7CisJCXJldHVybiAwOyAvKiByZXR1cm4gcHJvdG9jb2wgb25seSwgbm8gc2V0dGFibGUgcGFyYW1ldGVycyAqLworCisJY2FzZSBJRl9QUk9UT19YMjU6CisJCWlmKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZihkZXYtPmZsYWdzICYgSUZGX1VQKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlyZXN1bHQ9aGRsYy0+YXR0YWNoKGRldiwgRU5DT0RJTkdfTlJaLFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQpOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKworCQloZGxjX3Byb3RvX2RldGFjaChoZGxjKTsKKwkJbWVtc2V0KCZoZGxjLT5wcm90bywgMCwgc2l6ZW9mKGhkbGMtPnByb3RvKSk7CisKKwkJaGRsYy0+cHJvdG8ub3BlbiA9IHgyNV9vcGVuOworCQloZGxjLT5wcm90by5jbG9zZSA9IHgyNV9jbG9zZTsKKwkJaGRsYy0+cHJvdG8ubmV0aWZfcnggPSB4MjVfcng7CisJCWhkbGMtPnByb3RvLnR5cGVfdHJhbnMgPSBOVUxMOworCQloZGxjLT5wcm90by5pZCA9IElGX1BST1RPX1gyNTsKKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB4MjVfeG1pdDsKKwkJZGV2LT5oYXJkX2hlYWRlciA9IE5VTEw7CisJCWRldi0+dHlwZSA9IEFSUEhSRF9YMjU7CisJCWRldi0+YWRkcl9sZW4gPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9ob3N0ZXNzX3N2MTEuYyBiL2RyaXZlcnMvbmV0L3dhbi9ob3N0ZXNzX3N2MTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGIxZDFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2hvc3Rlc3Nfc3YxMS5jCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICoJQ29tdHJvbCBTVjExIGNhcmQgZHJpdmVyCisgKgorICoJVGhpcyBpcyBhIHNsaWdodGx5IG9kZCBaODUyMzAgc3luY2hyb25vdXMgZHJpdmVyLiBBbGwgeW91IG5lZWQgdG8KKyAqCWtub3cgYmFzaWNhbGx5IGlzCisgKgorICoJSXRzIGEgZ2VudWluZSBaODUyMzAKKyAqCisgKglJdCBzdXBwb3J0cyBETUEgdXNpbmcgdHdvIERNQSBjaGFubmVscyBpbiBTWU5DIG1vZGUuIFRoZSBkcml2ZXIgZG9lc24ndAorICoJdXNlIHRoZXNlIGZhY2lsaXRpZXMKKyAqCQorICoJVGhlIGNvbnRyb2wgcG9ydCBpcyBhdCBpbysxLCB0aGUgZGF0YSBhdCBpbyszIGFuZCB0dXJuaW5nIG9mZiB0aGUgRE1BCisgKglpcyBkb25lIGJ5IHdyaXRpbmcgMCB0byBpbys0CisgKgorICoJVGhlIGhhcmR3YXJlIGRvZXMgdGhlIGJ1cyBoYW5kbGluZyB0byBhdm9pZCB0aGUgbmVlZCBmb3IgZGVsYXlzIGJldHdlZW4KKyAqCXRvdWNoaW5nIGNvbnRyb2wgcmVnaXN0ZXJzLgorICoKKyAqCVBvcnQgQiBpc250IHdpcmVkICh3aHkgLSBiZWF0cyBtZSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bmV0L3N5bmNwcHAuaD4KKyNpbmNsdWRlICJ6ODUyMzAuaCIKKworc3RhdGljIGludCBkbWE7CisKK3N0cnVjdCBzdjExX2RldmljZQoreworCXZvaWQgKmlmX3B0cjsJLyogR2VuZXJhbCBwdXJwb3NlIHBvaW50ZXIgKHVzZWQgYnkgU1BQUCkgKi8KKwlzdHJ1Y3Qgejg1MzBfZGV2IHN5bmM7CisJc3RydWN0IHBwcF9kZXZpY2UgbmV0ZGV2OworfTsKKworLyoKKyAqCU5ldHdvcmsgZHJpdmVyIHN1cHBvcnQgcm91dGluZXMKKyAqLworCisvKgorICoJRnJhbWUgcmVjZWl2ZS4gU2ltcGxlIGZvciBvdXIgY2FyZCBhcyB3ZSBkbyBzeW5jIHBwcCBhbmQgdGhlcmUKKyAqCWlzIG5vIGZ1bm55IGdhcmJhZ2UgaW52b2x2ZWQKKyAqLworIAorc3RhdGljIHZvaWQgaG9zdGVzc19pbnB1dChzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKiBEcm9wIHRoZSBDUkMgLSBpdCdzIG5vdCBhIGdvb2QgaWRlYSB0byB0cnkgYW5kIG5lZ290aWF0ZSBpdCA7KSAqLworCXNrYl90cmltKHNrYiwgc2tiLT5sZW4tMik7CisJc2tiLT5wcm90b2NvbD1fX2NvbnN0YW50X2h0b25zKEVUSF9QX1dBTl9QUFApOworCXNrYi0+bWFjLnJhdz1za2ItPmRhdGE7CisJc2tiLT5kZXY9Yy0+bmV0ZGV2aWNlOworCS8qCisJICoJU2VuZCBpdCB0byB0aGUgUFBQIGxheWVyLiBXZSBkb24ndCBoYXZlIHRpbWUgdG8gcHJvY2VzcworCSAqCWl0IHJpZ2h0IG5vdy4KKwkgKi8KKwluZXRpZl9yeChza2IpOworCWMtPm5ldGRldmljZS0+bGFzdF9yeCA9IGppZmZpZXM7Cit9CisgCisvKgorICoJV2UndmUgYmVlbiBwbGFjZWQgaW4gdGhlIFVQIHN0YXRlCisgKi8gCisgCitzdGF0aWMgaW50IGhvc3Rlc3Nfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZCkKK3sKKwlzdHJ1Y3Qgc3YxMV9kZXZpY2UgKnN2MTE9ZC0+cHJpdjsKKwlpbnQgZXJyID0gLTE7CisJCisJLyoKKwkgKglMaW5rIGxheWVyIHVwCisJICovCisJc3dpdGNoKGRtYSkKKwl7CisJCWNhc2UgMDoKKwkJCWVycj16ODUzMF9zeW5jX29wZW4oZCwgJnN2MTEtPnN5bmMuY2hhbkEpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWVycj16ODUzMF9zeW5jX2RtYV9vcGVuKGQsICZzdjExLT5zeW5jLmNoYW5BKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQllcnI9ejg1MzBfc3luY190eGRtYV9vcGVuKGQsICZzdjExLT5zeW5jLmNoYW5BKTsKKwkJCWJyZWFrOworCX0KKwkKKwlpZihlcnIpCisJCXJldHVybiBlcnI7CisJLyoKKwkgKglCZWdpbiBQUFAKKwkgKi8KKwllcnI9c3BwcF9vcGVuKGQpOworCWlmKGVycikKKwl7CisJCXN3aXRjaChkbWEpCisJCXsKKwkJCWNhc2UgMDoKKwkJCQl6ODUzMF9zeW5jX2Nsb3NlKGQsICZzdjExLT5zeW5jLmNoYW5BKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQl6ODUzMF9zeW5jX2RtYV9jbG9zZShkLCAmc3YxMS0+c3luYy5jaGFuQSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJejg1MzBfc3luY190eGRtYV9jbG9zZShkLCAmc3YxMS0+c3luYy5jaGFuQSk7CisJCQkJYnJlYWs7CisJCX0JCQkJCisJCXJldHVybiBlcnI7CisJfQorCXN2MTEtPnN5bmMuY2hhbkEucnhfZnVuY3Rpb249aG9zdGVzc19pbnB1dDsKKwkKKwkvKgorCSAqCUdvIGdvIGdvCisJICovCisKKwluZXRpZl9zdGFydF9xdWV1ZShkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBob3N0ZXNzX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkKQoreworCXN0cnVjdCBzdjExX2RldmljZSAqc3YxMT1kLT5wcml2OworCS8qCisJICoJRGlzY2FyZCBuZXcgZnJhbWVzCisJICovCisJc3YxMS0+c3luYy5jaGFuQS5yeF9mdW5jdGlvbj16ODUzMF9udWxsX3J4OworCS8qCisJICoJUFBQIG9mZgorCSAqLworCXNwcHBfY2xvc2UoZCk7CisJLyoKKwkgKglMaW5rIGxheWVyIGRvd24KKwkgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGQpOworCQkKKwlzd2l0Y2goZG1hKQorCXsKKwkJY2FzZSAwOgorCQkJejg1MzBfc3luY19jbG9zZShkLCAmc3YxMS0+c3luYy5jaGFuQSk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJejg1MzBfc3luY19kbWFfY2xvc2UoZCwgJnN2MTEtPnN5bmMuY2hhbkEpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXo4NTMwX3N5bmNfdHhkbWFfY2xvc2UoZCwgJnN2MTEtPnN5bmMuY2hhbkEpOworCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhvc3Rlc3NfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmQsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCS8qIHN0cnVjdCBzdjExX2RldmljZSAqc3YxMT1kLT5wcml2OworCSAgIHo4NTMwX2lvY3RsKGQsJnN2MTEtPnN5bmMuY2hhbkEsaWZyLGNtZCkgKi8KKwlyZXR1cm4gc3BwcF9kb19pb2N0bChkLCBpZnIsY21kKTsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpob3N0ZXNzX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZCkKK3sKKwlzdHJ1Y3Qgc3YxMV9kZXZpY2UgKnN2MTE9ZC0+cHJpdjsKKwlpZihzdjExKQorCQlyZXR1cm4gejg1MzBfZ2V0X3N0YXRzKCZzdjExLT5zeW5jLmNoYW5BKTsKKwllbHNlCisJCXJldHVybiBOVUxMOworfQorCisvKgorICoJUGFzc2VkIFBQUCBmcmFtZXMsIGZpcmUgdGhlbSBkb3dud2luZC4KKyAqLworIAorc3RhdGljIGludCBob3N0ZXNzX3F1ZXVlX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmQpCit7CisJc3RydWN0IHN2MTFfZGV2aWNlICpzdjExPWQtPnByaXY7CisJcmV0dXJuIHo4NTMwX3F1ZXVlX3htaXQoJnN2MTEtPnN5bmMuY2hhbkEsIHNrYik7Cit9CisKK3N0YXRpYyBpbnQgaG9zdGVzc19uZWlnaF9zZXR1cChzdHJ1Y3QgbmVpZ2hib3VyICpuKQoreworCWlmIChuLT5udWRfc3RhdGUgPT0gTlVEX05PTkUpIHsKKwkJbi0+b3BzID0gJmFycF9icm9rZW5fb3BzOworCQluLT5vdXRwdXQgPSBuLT5vcHMtPm91dHB1dDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaG9zdGVzc19uZWlnaF9zZXR1cF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5laWdoX3Bhcm1zICpwKQoreworCWlmIChwLT50YmwtPmZhbWlseSA9PSBBRl9JTkVUKSB7CisJCXAtPm5laWdoX3NldHVwID0gaG9zdGVzc19uZWlnaF9zZXR1cDsKKwkJcC0+dWNhc3RfcHJvYmVzID0gMDsKKwkJcC0+bWNhc3RfcHJvYmVzID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN2MTFfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sJCisJZGV2LT5vcGVuID0gaG9zdGVzc19vcGVuOworCWRldi0+c3RvcCA9IGhvc3Rlc3NfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBob3N0ZXNzX3F1ZXVlX3htaXQ7CisJZGV2LT5nZXRfc3RhdHMgPSBob3N0ZXNzX2dldF9zdGF0czsKKwlkZXYtPmRvX2lvY3RsID0gaG9zdGVzc19pb2N0bDsKKwlkZXYtPm5laWdoX3NldHVwID0gaG9zdGVzc19uZWlnaF9zZXR1cF9kZXY7Cit9CisKKy8qCisgKglEZXNjcmlwdGlvbiBibG9jayBmb3IgYSBDb210cm9sIEhvc3Rlc3MgU1YxMSBjYXJkCisgKi8KKyAKK3N0YXRpYyBzdHJ1Y3Qgc3YxMV9kZXZpY2UgKnN2MTFfaW5pdChpbnQgaW9iYXNlLCBpbnQgaXJxKQoreworCXN0cnVjdCB6ODUzMF9kZXYgKmRldjsKKwlzdHJ1Y3Qgc3YxMV9kZXZpY2UgKnN2OworCQorCS8qCisJICoJR2V0IHRoZSBuZWVkZWQgSS9PIHNwYWNlCisJICovCisJIAorCWlmKCFyZXF1ZXN0X3JlZ2lvbihpb2Jhc2UsIDgsICJDb210cm9sIFNWMTEiKSkKKwl7CQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJob3N0ZXNzOiBJL08gMHglWCBhbHJlYWR5IGluIHVzZS5cbiIsIGlvYmFzZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwlzdj0oc3RydWN0IHN2MTFfZGV2aWNlICopa21hbGxvYyhzaXplb2Yoc3RydWN0IHN2MTFfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYoIXN2KQorCQlnb3RvIGZhaWwzOworCQkJCisJbWVtc2V0KHN2LCAwLCBzaXplb2YoKnN2KSk7CisJc3YtPmlmX3B0cj0mc3YtPm5ldGRldjsKKwkKKwlzdi0+bmV0ZGV2LmRldiA9IGFsbG9jX25ldGRldigwLCAiaGRsYyVkIiwgc3YxMV9zZXR1cCk7CisJaWYoIXN2LT5uZXRkZXYuZGV2KQorCQlnb3RvIGZhaWwyOworCisJU0VUX01PRFVMRV9PV05FUihzdi0+bmV0ZGV2LmRldik7CisKKwlkZXY9JnN2LT5zeW5jOworCQorCS8qCisJICoJU3R1ZmYgaW4gdGhlIEkvTyBhZGRyZXNzaW5nCisJICovCisJIAorCWRldi0+YWN0aXZlID0gMDsKKwkKKwlkZXYtPmNoYW5BLmN0cmxpbz1pb2Jhc2UrMTsKKwlkZXYtPmNoYW5BLmRhdGFpbz1pb2Jhc2UrMzsKKwlkZXYtPmNoYW5CLmN0cmxpbz0tMTsKKwlkZXYtPmNoYW5CLmRhdGFpbz0tMTsKKwlkZXYtPmNoYW5BLmlycXM9Jno4NTMwX25vcDsKKwlkZXYtPmNoYW5CLmlycXM9Jno4NTMwX25vcDsKKwkKKwlvdXRiKDAsIGlvYmFzZSs0KTsJCS8qIERNQSBvZmYgKi8KKwkKKwkvKiBXZSB3YW50IGEgZmFzdCBJUlEgZm9yIHRoaXMgZGV2aWNlLiBBY3R1YWxseSB3ZSdkIGxpa2UgYW4gZXZlbiBmYXN0ZXIKKwkgICBJUlEgOykgLSBUaGlzIGlzIG9uZSBkcml2ZXIgUnRMaW51eCBpcyBtYWRlIGZvciAqLworCSAgIAorCWlmKHJlcXVlc3RfaXJxKGlycSwgJno4NTMwX2ludGVycnVwdCwgU0FfSU5URVJSVVBULCAiSG9zdGVzcyBTVjExIiwgZGV2KTwwKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaG9zdGVzczogSVJRICVkIGFscmVhZHkgaW4gdXNlLlxuIiwgaXJxKTsKKwkJZ290byBmYWlsMTsKKwl9CisJCisJZGV2LT5pcnE9aXJxOworCWRldi0+Y2hhbkEucHJpdmF0ZT1zdjsKKwlkZXYtPmNoYW5BLm5ldGRldmljZT1zdi0+bmV0ZGV2LmRldjsKKwlkZXYtPmNoYW5BLmRldj1kZXY7CisJZGV2LT5jaGFuQi5kZXY9ZGV2OworCQorCWlmKGRtYSkKKwl7CisJCS8qCisJCSAqCVlvdSBjYW4gaGF2ZSBETUEgb2ZmIG9yIDEgYW5kIDMgdGhhdHMgdGhlIGxvdAorCQkgKglvbiB0aGUgQ29tdHJvbC4KKwkJICovCisJCWRldi0+Y2hhbkEudHhkbWE9MzsKKwkJZGV2LT5jaGFuQS5yeGRtYT0xOworCQlvdXRiKDB4MDN8MHgwOCwgaW9iYXNlKzQpOwkJLyogRE1BIG9uICovCisJCWlmKHJlcXVlc3RfZG1hKGRldi0+Y2hhbkEudHhkbWEsICJIb3N0ZXNzIFNWLzExIChUWCkiKSE9MCkKKwkJCWdvdG8gZmFpbDsKKwkJCQorCQlpZihkbWE9PTEpCisJCXsKKwkJCWlmKHJlcXVlc3RfZG1hKGRldi0+Y2hhbkEucnhkbWEsICJIb3N0ZXNzIFNWLzExIChSWCkiKSE9MCkKKwkJCQlnb3RvIGRtYWZhaWw7CisJCX0KKwl9CisKKwkvKiBLaWxsIG91ciBwcml2YXRlIElSUSBsaW5lIHRoZSBob3N0ZXNzIGNhbiBlbmQgdXAgY2hhdHRlcmluZworCSAgIHVudGlsIHRoZSBjb25maWd1cmF0aW9uIGlzIHNldCAqLworCWRpc2FibGVfaXJxKGlycSk7CisJCQorCS8qCisJICoJQmVnaW4gbm9ybWFsIGluaXRpYWxpc2UKKwkgKi8KKwkgCisJaWYoejg1MzBfaW5pdChkZXYpIT0wKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJaODUzMCBzZXJpZXMgZGV2aWNlIG5vdCBmb3VuZC5cbiIpOworCQllbmFibGVfaXJxKGlycSk7CisJCWdvdG8gZG1hZmFpbDI7CisJfQorCXo4NTMwX2NoYW5uZWxfbG9hZCgmZGV2LT5jaGFuQiwgejg1MzBfZGVhZF9wb3J0KTsKKwlpZihkZXYtPnR5cGU9PVo4NUMzMCkKKwkJejg1MzBfY2hhbm5lbF9sb2FkKCZkZXYtPmNoYW5BLCB6ODUzMF9oZGxjX2tpbG9zdHJlYW0pOworCWVsc2UKKwkJejg1MzBfY2hhbm5lbF9sb2FkKCZkZXYtPmNoYW5BLCB6ODUzMF9oZGxjX2tpbG9zdHJlYW1fODUyMzApOworCQorCWVuYWJsZV9pcnEoaXJxKTsKKwkKKworCS8qCisJICoJTm93IHdlIGNhbiB0YWtlIHRoZSBJUlEKKwkgKi8KKwlpZihkZXZfYWxsb2NfbmFtZShkZXYtPmNoYW5BLm5ldGRldmljZSwiaGRsYyVkIik+PTApCisJeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZD1kZXYtPmNoYW5BLm5ldGRldmljZTsKKworCQkvKiAKKwkJICoJSW5pdGlhbGlzZSB0aGUgUFBQIGNvbXBvbmVudHMKKwkJICovCisJCXNwcHBfYXR0YWNoKCZzdi0+bmV0ZGV2KTsKKwkJCisJCS8qCisJCSAqCUxvY2FsIGZpZWxkcworCQkgKi8JCisJCQorCQlkLT5iYXNlX2FkZHIgPSBpb2Jhc2U7CisJCWQtPmlycSA9IGlycTsKKwkJZC0+cHJpdiA9IHN2OworCQkKKwkJaWYocmVnaXN0ZXJfbmV0ZGV2KGQpKQorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gcmVnaXN0ZXIgZGV2aWNlLlxuIiwKKwkJCQlkLT5uYW1lKTsKKwkJCXNwcHBfZGV0YWNoKGQpOworCQkJZ290byBkbWFmYWlsMjsKKwkJfQorCisJCXo4NTMwX2Rlc2NyaWJlKGRldiwgIkkvTyIsIGlvYmFzZSk7CisJCWRldi0+YWN0aXZlPTE7CisJCXJldHVybiBzdjsJCisJfQorZG1hZmFpbDI6CisJaWYoZG1hPT0xKQorCQlmcmVlX2RtYShkZXYtPmNoYW5BLnJ4ZG1hKTsKK2RtYWZhaWw6CisJaWYoZG1hKQorCQlmcmVlX2RtYShkZXYtPmNoYW5BLnR4ZG1hKTsKK2ZhaWw6CisJZnJlZV9pcnEoaXJxLCBkZXYpOworZmFpbDE6CisJZnJlZV9uZXRkZXYoc3YtPm5ldGRldi5kZXYpOworZmFpbDI6CisJa2ZyZWUoc3YpOworZmFpbDM6CisJcmVsZWFzZV9yZWdpb24oaW9iYXNlLDgpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBzdjExX3NodXRkb3duKHN0cnVjdCBzdjExX2RldmljZSAqZGV2KQoreworCXNwcHBfZGV0YWNoKGRldi0+bmV0ZGV2LmRldik7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2LT5uZXRkZXYuZGV2KTsKKwl6ODUzMF9zaHV0ZG93bigmZGV2LT5zeW5jKTsKKwlmcmVlX2lycShkZXYtPnN5bmMuaXJxLCBkZXYpOworCWlmKGRtYSkKKwl7CisJCWlmKGRtYT09MSkKKwkJCWZyZWVfZG1hKGRldi0+c3luYy5jaGFuQS5yeGRtYSk7CisJCWZyZWVfZG1hKGRldi0+c3luYy5jaGFuQS50eGRtYSk7CisJfQorCXJlbGVhc2VfcmVnaW9uKGRldi0+c3luYy5jaGFuQS5jdHJsaW8tMSwgOCk7CisJZnJlZV9uZXRkZXYoZGV2LT5uZXRkZXYuZGV2KTsKKwlrZnJlZShkZXYpOworfQorCisjaWZkZWYgTU9EVUxFCisKK3N0YXRpYyBpbnQgaW89MHgyMDA7CitzdGF0aWMgaW50IGlycT05OworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiVGhlIEkvTyBiYXNlIG9mIHRoZSBDb210cm9sIEhvc3Rlc3MgU1YxMSBjYXJkIik7Cittb2R1bGVfcGFyYW0oZG1hLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkbWEsICJTZXQgdGhpcyB0byAxIHRvIHVzZSBETUExL0RNQTMgZm9yIFRYL1JYIik7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJUaGUgaW50ZXJydXB0IGxpbmUgc2V0dGluZyBmb3IgdGhlIENvbXRyb2wgSG9zdGVzcyBTVjExIGNhcmQiKTsKKworTU9EVUxFX0FVVEhPUigiQWxhbiBDb3giKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTW9kdWxhciBkcml2ZXIgZm9yIHRoZSBDb210cm9sIEhvc3Rlc3MgU1YxMSIpOworCitzdGF0aWMgc3RydWN0IHN2MTFfZGV2aWNlICpzdjExX3VuaXQ7CisKK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIlNWLTExIFo4NTIzMCBTeW5jaHJvbm91cyBEcml2ZXIgdiAwLjAzLlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiKGMpIENvcHlyaWdodCAyMDAxLCBSZWQgSGF0IEluYy5cbiIpOwkKKwlpZigoc3YxMV91bml0PXN2MTFfaW5pdChpbyxpcnEpKT09TlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpZihzdjExX3VuaXQpCisJCXN2MTFfc2h1dGRvd24oc3YxMV91bml0KTsKK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9sYXBiZXRoZXIuYyBiL2RyaXZlcnMvbmV0L3dhbi9sYXBiZXRoZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjJlMzY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL2xhcGJldGhlci5jCkBAIC0wLDAgKzEsNDY1IEBACisvKgorICoJIkxBUEIgdmlhIGV0aGVybmV0IiBkcml2ZXIgcmVsZWFzZSAwMDEKKyAqCisgKglUaGlzIGNvZGUgUkVRVUlSRVMgMi4xLjE1IG9yIGhpZ2hlci8gTkVUMy4wMzgKKyAqCisgKglUaGlzIG1vZHVsZToKKyAqCQlUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBpcyBhICJwc2V1ZG8iIG5ldHdvcmsgZHJpdmVyIHRvIGFsbG93IExBUEIgb3ZlciBFdGhlcm5ldC4KKyAqCisgKglUaGlzIGRyaXZlciBjYW4gdXNlIGFueSBldGhlcm5ldCBkZXN0aW5hdGlvbiBhZGRyZXNzLCBhbmQgY2FuIGJlIAorICoJbGltaXRlZCB0byBhY2NlcHQgZnJhbWVzIGZyb20gb25lIGRlZGljYXRlZCBldGhlcm5ldCBjYXJkIG9ubHkuCisgKgorICoJSGlzdG9yeQorICoJTEFQQkVUSCAwMDEJSm9uYXRoYW4gTmF5bG9yCQlDbG9uZWQgZnJvbSBicHFldGhlci5jCisgKgkyMDAwLTEwLTI5CUhlbm5lciBFaXNlbglsYXBiX2RhdGFfaW5kaWNhdGlvbigpIHJldHVybiBzdGF0dXMuCisgKgkyMDAwLTExLTE0CUhlbm5lciBFaXNlbglkZXZfaG9sZC9wdXQsIE5FVERFVl9HT0lOR19ET1dOIHN1cHBvcnQKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9sYXBiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bmV0L3gyNWRldmljZS5oPgorCitzdGF0aWMgY2hhciBiY2FzdF9hZGRyWzZdID0geyAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH07CisKKy8qIElmIHRoaXMgbnVtYmVyIGlzIG1hZGUgbGFyZ2VyLCBjaGVjayB0aGF0IHRoZSB0ZW1wb3Jhcnkgc3RyaW5nIGJ1ZmZlcgorICogaW4gbGFwYmV0aF9uZXdfZGV2aWNlIGlzIGxhcmdlIGVub3VnaCB0byBzdG9yZSB0aGUgcHJvYmUgZGV2aWNlIG5hbWUuKi8KKyNkZWZpbmUgTUFYTEFQQkRFViAxMDAKKworc3RydWN0IGxhcGJldGhkZXYgeworCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKKwlzdHJ1Y3QgbmV0X2RldmljZQkqZXRoZGV2OwkvKiBsaW5rIHRvIGV0aGVybmV0IGRldmljZSAqLworCXN0cnVjdCBuZXRfZGV2aWNlCSpheGRldjsJCS8qIGxhcGJldGggZGV2aWNlIChsYXBiIykgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJCS8qIHNvbWUgc3RhdGlzdGljcyAqLworfTsKKworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgbGFwYmV0aF9kZXZpY2VzID0gTElTVF9IRUFEX0lOSVQobGFwYmV0aF9kZXZpY2VzKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKglHZXQgdGhlIExBUEIgZGV2aWNlIGZvciB0aGUgZXRoZXJuZXQgZGV2aWNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbGFwYmV0aGRldiAqbGFwYmV0aF9nZXRfeDI1X2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYXBiZXRoZGV2ICpsYXBiZXRoOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UobGFwYmV0aCwgJmxhcGJldGhfZGV2aWNlcywgbm9kZSkgeworCQlpZiAobGFwYmV0aC0+ZXRoZGV2ID09IGRldikgCisJCQlyZXR1cm4gbGFwYmV0aDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBkZXZfaXNfZXRoZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+dHlwZSA9PSBBUlBIUkRfRVRIRVIgJiYgc3RybmNtcChkZXYtPm5hbWUsICJkdW1teSIsIDUpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqCVJlY2VpdmUgYSBMQVBCIGZyYW1lIHZpYSBhbiBldGhlcm5ldCBpbnRlcmZhY2UuCisgKi8KK3N0YXRpYyBpbnQgbGFwYmV0aF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHBhY2tldF90eXBlICpwdHlwZSkKK3sKKwlpbnQgbGVuLCBlcnI7CisJc3RydWN0IGxhcGJldGhkZXYgKmxhcGJldGg7CisKKwlpZiAoKHNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlyZXR1cm4gTkVUX1JYX0RST1A7CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAyKSkKKwkJZ290byBkcm9wOworCisJcmN1X3JlYWRfbG9jaygpOworCWxhcGJldGggPSBsYXBiZXRoX2dldF94MjVfZGV2KGRldik7CisJaWYgKCFsYXBiZXRoKQorCQlnb3RvIGRyb3BfdW5sb2NrOworCWlmICghbmV0aWZfcnVubmluZyhsYXBiZXRoLT5heGRldikpCisJCWdvdG8gZHJvcF91bmxvY2s7CisKKwlsYXBiZXRoLT5zdGF0cy5yeF9wYWNrZXRzKys7CisKKwlsZW4gPSBza2ItPmRhdGFbMF0gKyBza2ItPmRhdGFbMV0gKiAyNTY7CisJbGFwYmV0aC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCisJc2tiX3B1bGwoc2tiLCAyKTsJLyogUmVtb3ZlIHRoZSBsZW5ndGggYnl0ZXMgKi8KKwlza2JfdHJpbShza2IsIGxlbik7CS8qIFNldCB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhICovCisKKwlpZiAoKGVyciA9IGxhcGJfZGF0YV9yZWNlaXZlZChsYXBiZXRoLT5heGRldiwgc2tiKSkgIT0gTEFQQl9PSykgeworCQlwcmludGsoS0VSTl9ERUJVRyAibGFwYmV0aGVyOiBsYXBiX2RhdGFfcmVjZWl2ZWQgZXJyIC0gJWRcbiIsIGVycik7CisJCWdvdG8gZHJvcF91bmxvY2s7CisJfQorb3V0OgorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiAwOworZHJvcF91bmxvY2s6CisJa2ZyZWVfc2tiKHNrYik7CisJZ290byBvdXQ7Citkcm9wOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhcGJldGhfZGF0YV9pbmRpY2F0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgY2hhciAqcHRyOworCisJc2tiX3B1c2goc2tiLCAxKTsKKworCWlmIChza2JfY293KHNrYiwgMSkpCisJCXJldHVybiBORVRfUlhfRFJPUDsKKworCXB0ciAgPSBza2ItPmRhdGE7CisJKnB0ciA9IDB4MDA7CisKKwlza2ItPnByb3RvY29sID0geDI1X3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCXNrYi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlyZXR1cm4gbmV0aWZfcngoc2tiKTsKK30KKworLyoKKyAqCVNlbmQgYSBMQVBCIGZyYW1lIHZpYSBhbiBldGhlcm5ldCBpbnRlcmZhY2UKKyAqLworc3RhdGljIGludCBsYXBiZXRoX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyID0gLUVOT0RFVjsKKworCS8qCisJICogSnVzdCB0byBiZSAqcmVhbGx5KiBzdXJlIG5vdCB0byBzZW5kIGFueXRoaW5nIGlmIHRoZSBpbnRlcmZhY2UKKwkgKiBpcyBkb3duLCB0aGUgZXRoZXJuZXQgZGV2aWNlIG1heSBoYXZlIGdvbmUuCisJICovCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJZ290byBkcm9wOworCX0KKworCXN3aXRjaCAoc2tiLT5kYXRhWzBdKSB7CisJY2FzZSAweDAwOgorCQllcnIgPSAwOworCQlicmVhazsKKwljYXNlIDB4MDE6CisJCWlmICgoZXJyID0gbGFwYl9jb25uZWN0X3JlcXVlc3QoZGV2KSkgIT0gTEFQQl9PSykKKwkJCXByaW50ayhLRVJOX0VSUiAibGFwYmV0aDogbGFwYl9jb25uZWN0X3JlcXVlc3QgIgorCQkJICAgICAgICJlcnJvcjogJWRcbiIsIGVycik7CisJCWdvdG8gZHJvcF9vazsKKwljYXNlIDB4MDI6CisJCWlmICgoZXJyID0gbGFwYl9kaXNjb25uZWN0X3JlcXVlc3QoZGV2KSkgIT0gTEFQQl9PSykKKwkJCXByaW50ayhLRVJOX0VSUiAibGFwYmV0aDogbGFwYl9kaXNjb25uZWN0X3JlcXVlc3QgIgorCQkJICAgICAgICJlcnI6ICVkXG4iLCBlcnIpOworCQkvKiBGYWxsIHRocnUgKi8KKwlkZWZhdWx0OgorCQlnb3RvIGRyb3Bfb2s7CisJfQorCisJc2tiX3B1bGwoc2tiLCAxKTsKKworCWlmICgoZXJyID0gbGFwYl9kYXRhX3JlcXVlc3QoZGV2LCBza2IpKSAhPSBMQVBCX09LKSB7CisJCXByaW50ayhLRVJOX0VSUiAibGFwYmV0aDogbGFwYl9kYXRhX3JlcXVlc3QgZXJyb3IgLSAlZFxuIiwgZXJyKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBkcm9wOworCX0KKwllcnIgPSAwOworb3V0OgorCXJldHVybiBlcnI7Citkcm9wX29rOgorCWVyciA9IDA7Citkcm9wOgorCWtmcmVlX3NrYihza2IpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZCBsYXBiZXRoX2RhdGFfdHJhbnNtaXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxhcGJldGhkZXYgKmxhcGJldGggPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgc2l6ZSA9IHNrYi0+bGVuOworCisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX1gyNSk7CisKKwlwdHIgPSBza2JfcHVzaChza2IsIDIpOworCisJKnB0cisrID0gc2l6ZSAlIDI1NjsKKwkqcHRyKysgPSBzaXplIC8gMjU2OworCisJbGFwYmV0aC0+c3RhdHMudHhfcGFja2V0cysrOworCWxhcGJldGgtPnN0YXRzLnR4X2J5dGVzICs9IHNpemU7CisKKwlza2ItPmRldiA9IGRldiA9IGxhcGJldGgtPmV0aGRldjsKKworCWRldi0+aGFyZF9oZWFkZXIoc2tiLCBkZXYsIEVUSF9QX0RFQywgYmNhc3RfYWRkciwgTlVMTCwgMCk7CisKKwlkZXZfcXVldWVfeG1pdChza2IpOworfQorCitzdGF0aWMgdm9pZCBsYXBiZXRoX2Nvbm5lY3RlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVhc29uKQoreworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYigxKTsKKworCWlmICghc2tiKSB7CisJCXByaW50ayhLRVJOX0VSUiAibGFwYmV0aDogb3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybjsKKwl9CisKKwlwdHIgID0gc2tiX3B1dChza2IsIDEpOworCSpwdHIgPSAweDAxOworCisJc2tiLT5wcm90b2NvbCA9IHgyNV90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwlza2ItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJbmV0aWZfcngoc2tiKTsKK30KKworc3RhdGljIHZvaWQgbGFwYmV0aF9kaXNjb25uZWN0ZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJlYXNvbikKK3sKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IoMSk7CisKKwlpZiAoIXNrYikgeworCQlwcmludGsoS0VSTl9FUlIgImxhcGJldGg6IG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm47CisJfQorCisJcHRyICA9IHNrYl9wdXQoc2tiLCAxKTsKKwkqcHRyID0gMHgwMjsKKworCXNrYi0+cHJvdG9jb2wgPSB4MjVfdHlwZV90cmFucyhza2IsIGRldik7CisJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCW5ldGlmX3J4KHNrYik7Cit9CisKKy8qCisgKglTdGF0aXN0aWNzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbGFwYmV0aF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFwYmV0aGRldiAqbGFwYmV0aCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuICZsYXBiZXRoLT5zdGF0czsKK30KKworLyoKKyAqCVNldCBBWC4yNSBjYWxsc2lnbgorICovCitzdGF0aWMgaW50IGxhcGJldGhfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCit7CisJc3RydWN0IHNvY2thZGRyICpzYSA9IGFkZHI7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHNhLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGxhcGJfcmVnaXN0ZXJfc3RydWN0IGxhcGJldGhfY2FsbGJhY2tzID0geworCS5jb25uZWN0X2NvbmZpcm1hdGlvbiAgICA9IGxhcGJldGhfY29ubmVjdGVkLAorCS5jb25uZWN0X2luZGljYXRpb24gICAgICA9IGxhcGJldGhfY29ubmVjdGVkLAorCS5kaXNjb25uZWN0X2NvbmZpcm1hdGlvbiA9IGxhcGJldGhfZGlzY29ubmVjdGVkLAorCS5kaXNjb25uZWN0X2luZGljYXRpb24gICA9IGxhcGJldGhfZGlzY29ubmVjdGVkLAorCS5kYXRhX2luZGljYXRpb24gICAgICAgICA9IGxhcGJldGhfZGF0YV9pbmRpY2F0aW9uLAorCS5kYXRhX3RyYW5zbWl0ICAgICAgICAgICA9IGxhcGJldGhfZGF0YV90cmFuc21pdCwKKworfTsKKworLyoKKyAqIG9wZW4vY2xvc2UgYSBkZXZpY2UKKyAqLworc3RhdGljIGludCBsYXBiZXRoX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBsYXBiX3JlZ2lzdGVyKGRldiwgJmxhcGJldGhfY2FsbGJhY2tzKSkgIT0gTEFQQl9PSykgeworCQlwcmludGsoS0VSTl9FUlIgImxhcGJldGg6IGxhcGJfcmVnaXN0ZXIgZXJyb3IgLSAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsYXBiZXRoX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGVycjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmICgoZXJyID0gbGFwYl91bnJlZ2lzdGVyKGRldikpICE9IExBUEJfT0spCisJCXByaW50ayhLRVJOX0VSUiAibGFwYmV0aDogbGFwYl91bnJlZ2lzdGVyIGVycm9yIC0gJWRcbiIsIGVycik7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGxhcGJldGhfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGxhcGJldGhfeG1pdDsKKwlkZXYtPm9wZW4JICAgICA9IGxhcGJldGhfb3BlbjsKKwlkZXYtPnN0b3AJICAgICA9IGxhcGJldGhfY2xvc2U7CisJZGV2LT5kZXN0cnVjdG9yCSAgICAgPSBmcmVlX25ldGRldjsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGxhcGJldGhfc2V0X21hY19hZGRyZXNzOworCWRldi0+Z2V0X3N0YXRzCSAgICAgPSBsYXBiZXRoX2dldF9zdGF0czsKKwlkZXYtPnR5cGUgICAgICAgICAgICA9IEFSUEhSRF9YMjU7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSAzOworCWRldi0+bXR1ICAgICAgICAgICAgID0gMTAwMDsKKwlkZXYtPmFkZHJfbGVuICAgICAgICA9IDA7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworfQorCisvKgorICoJU2V0dXAgYSBuZXcgZGV2aWNlLgorICovCitzdGF0aWMgaW50IGxhcGJldGhfbmV3X2RldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OworCXN0cnVjdCBsYXBiZXRoZGV2ICpsYXBiZXRoOworCWludCByYyA9IC1FTk9NRU07CisKKwlBU1NFUlRfUlROTCgpOworCisJbmRldiA9IGFsbG9jX25ldGRldihzaXplb2YoKmxhcGJldGgpLCAibGFwYiVkIiwgCisJCQkgICBsYXBiZXRoX3NldHVwKTsKKwlpZiAoIW5kZXYpCisJCWdvdG8gb3V0OworCisJbGFwYmV0aCA9IG5ldGRldl9wcml2KG5kZXYpOworCWxhcGJldGgtPmF4ZGV2ID0gbmRldjsKKworCWRldl9ob2xkKGRldik7CisJbGFwYmV0aC0+ZXRoZGV2ID0gZGV2OworCisJcmMgPSBkZXZfYWxsb2NfbmFtZShuZGV2LCBuZGV2LT5uYW1lKTsKKwlpZiAocmMgPCAwKSAKKwkJZ290byBmYWlsOworCisJcmMgPSAtRUlPOworCWlmIChyZWdpc3Rlcl9uZXRkZXZpY2UobmRldikpCisJCWdvdG8gZmFpbDsKKworCWxpc3RfYWRkX3JjdSgmbGFwYmV0aC0+bm9kZSwgJmxhcGJldGhfZGV2aWNlcyk7CisJcmMgPSAwOworb3V0OgorCXJldHVybiByYzsKK2ZhaWw6CisJZGV2X3B1dChkZXYpOworCWZyZWVfbmV0ZGV2KG5kZXYpOworCWtmcmVlKGxhcGJldGgpOworCWdvdG8gb3V0OworfQorCisvKgorICoJRnJlZSBhIGxhcGIgbmV0d29yayBkZXZpY2UuCisgKi8KK3N0YXRpYyB2b2lkIGxhcGJldGhfZnJlZV9kZXZpY2Uoc3RydWN0IGxhcGJldGhkZXYgKmxhcGJldGgpCit7CisJZGV2X3B1dChsYXBiZXRoLT5ldGhkZXYpOworCWxpc3RfZGVsX3JjdSgmbGFwYmV0aC0+bm9kZSk7CisJdW5yZWdpc3Rlcl9uZXRkZXZpY2UobGFwYmV0aC0+YXhkZXYpOworfQorCisvKgorICoJSGFuZGxlIGRldmljZSBzdGF0dXMgY2hhbmdlcy4KKyAqCisgKiBDYWxsZWQgZnJvbSBub3RpZmllciB3aXRoIFJUTkwgaGVsZC4KKyAqLworc3RhdGljIGludCBsYXBiZXRoX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisJCQkJdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBsYXBiZXRoZGV2ICpsYXBiZXRoOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwdHI7CisKKwlpZiAoIWRldl9pc19ldGhkZXYoZGV2KSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX1VQOgorCQkvKiBOZXcgZXRoZXJuZXQgZGV2aWNlIC0+IG5ldyBMQVBCIGludGVyZmFjZQkgKi8KKwkJaWYgKGxhcGJldGhfZ2V0X3gyNV9kZXYoZGV2KSA9PSBOVUxMKQorCQkJbGFwYmV0aF9uZXdfZGV2aWNlKGRldik7CisJCWJyZWFrOworCWNhc2UgTkVUREVWX0RPV046CQorCQkvKiBldGhlcm5ldCBkZXZpY2UgY2xvc2VkIC0+IGNsb3NlIExBUEIgaW50ZXJmYWNlICovCisJCWxhcGJldGggPSBsYXBiZXRoX2dldF94MjVfZGV2KGRldik7CisJCWlmIChsYXBiZXRoKSAKKwkJCWRldl9jbG9zZShsYXBiZXRoLT5heGRldik7CisJCWJyZWFrOworCWNhc2UgTkVUREVWX1VOUkVHSVNURVI6CisJCS8qIGV0aGVybmV0IGRldmljZSBkaXNhcHBlYXJzIC0+IHJlbW92ZSBMQVBCIGludGVyZmFjZSAqLworCQlsYXBiZXRoID0gbGFwYmV0aF9nZXRfeDI1X2RldihkZXYpOworCQlpZiAobGFwYmV0aCkKKwkJCWxhcGJldGhfZnJlZV9kZXZpY2UobGFwYmV0aCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgcGFja2V0X3R5cGUgbGFwYmV0aF9wYWNrZXRfdHlwZSA9IHsKKwkudHlwZSA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfREVDKSwKKwkuZnVuYyA9IGxhcGJldGhfcmN2LAorfTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBsYXBiZXRoX2Rldl9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGxhcGJldGhfZGV2aWNlX2V2ZW50LAorfTsKKworc3RhdGljIGNoYXIgYmFubmVyW10gX19pbml0ZGF0YSA9IEtFUk5fSU5GTyAiTEFQQiBFdGhlcm5ldCBkcml2ZXIgdmVyc2lvbiAwLjAyXG4iOworCitzdGF0aWMgaW50IF9faW5pdCBsYXBiZXRoX2luaXRfZHJpdmVyKHZvaWQpCit7CisJZGV2X2FkZF9wYWNrKCZsYXBiZXRoX3BhY2tldF90eXBlKTsKKworCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbGFwYmV0aF9kZXZfbm90aWZpZXIpOworCisJcHJpbnRrKGJhbm5lcik7CisKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KGxhcGJldGhfaW5pdF9kcml2ZXIpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbGFwYmV0aF9jbGVhbnVwX2RyaXZlcih2b2lkKQoreworCXN0cnVjdCBsYXBiZXRoZGV2ICpsYXBiZXRoOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqdG1wOworCisJZGV2X3JlbW92ZV9wYWNrKCZsYXBiZXRoX3BhY2tldF90eXBlKTsKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbGFwYmV0aF9kZXZfbm90aWZpZXIpOworCisJcnRubF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCB0bXAsICZsYXBiZXRoX2RldmljZXMpIHsKKwkJbGFwYmV0aCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBsYXBiZXRoZGV2LCBub2RlKTsKKworCQl1bnJlZ2lzdGVyX25ldGRldmljZShsYXBiZXRoLT5heGRldik7CisJfQorCXJ0bmxfdW5sb2NrKCk7Cit9Cittb2R1bGVfZXhpdChsYXBiZXRoX2NsZWFudXBfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSm9uYXRoYW4gTmF5bG9yIDxnNGtseEBnNGtseC5kZW1vbi5jby51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVGhlIHVub2ZmaWNpYWwgTEFQQiBvdmVyIEV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2xtYy9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFiZGNmZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvTWFrZWZpbGUKQEAgLTAsMCArMSwxNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExhbiBNZWRpYSAyMTE0MCBiYXNlZCBXQU4gY2FyZHMKKyMgU3BlY2lmaWNhbGx5IHRoZSAxMDAwLDEyMDAsNTIwMCw1MjQ1CisjCisKK29iai0kKENPTkZJR19MQU5NRURJQSkgKz0gbG1jLm8KKworbG1jLW9ianMgOj0gbG1jX2RlYnVnLm8gbG1jX21lZGlhLm8gbG1jX21haW4ubyBsbWNfcHJvdG8ubworCisjIExpa2UgYWJvdmUgZXhjZXB0IGV2ZXJ5IHBhY2tldCBnZXRzIGVjaG9lZCB0byBLRVJOX0RFQlVHCisjIGluIGhleAorIworIyBEQkRFRiA9IFwKKyMgLURERUJVRyBcCisjIC1ETE1DX1BBQ0tFVF9MT0cKKworRVhUUkFfQ0ZMQUdTICs9IC1JLiAkKERCR0RFRikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jLmggYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MmU1OGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtYy5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgX0xNQ19IXworI2RlZmluZSBfTE1DX0hfCisKKyNpbmNsdWRlICJsbWNfdmFyLmgiCisKKy8qCisgKiBwcm90b3R5cGVzIGZvciBldmVyeW9uZQorICovCitpbnQgbG1jX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KTsKK3Vuc2lnbmVkIGxtY19taWlfcmVhZHJlZyhsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCB1bnNpZ25lZAorICAgICAgCQkJICBkZXZhZGRyLCB1bnNpZ25lZCByZWdubyk7Cit2b2lkIGxtY19taWlfd3JpdGVyZWcobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgdW5zaWduZWQgZGV2YWRkciwKKwkJCSAgICAgICB1bnNpZ25lZCByZWdubywgdW5zaWduZWQgZGF0YSk7Cit2b2lkIGxtY19sZWRfb24obG1jX3NvZnRjX3QgKiBjb25zdCwgdV9pbnQzMl90KTsKK3ZvaWQgbG1jX2xlZF9vZmYobG1jX3NvZnRjX3QgKiBjb25zdCwgdV9pbnQzMl90KTsKK3Vuc2lnbmVkIGxtY19taWlfcmVhZHJlZyhsbWNfc29mdGNfdCAqIGNvbnN0LCB1bnNpZ25lZCwgdW5zaWduZWQpOwordm9pZCBsbWNfbWlpX3dyaXRlcmVnKGxtY19zb2Z0Y190ICogY29uc3QsIHVuc2lnbmVkLCB1bnNpZ25lZCwgdW5zaWduZWQpOwordm9pZCBsbWNfZ3Bpb19ta2lucHV0KGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIHVfaW50MzJfdCBiaXRzKTsKK3ZvaWQgbG1jX2dwaW9fbWtvdXRwdXQobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgdV9pbnQzMl90IGJpdHMpOworCitpbnQgbG1jX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKKworZXh0ZXJuIGxtY19tZWRpYV90IGxtY19kczNfbWVkaWE7CitleHRlcm4gbG1jX21lZGlhX3QgbG1jX3NzaV9tZWRpYTsKK2V4dGVybiBsbWNfbWVkaWFfdCBsbWNfdDFfbWVkaWE7CitleHRlcm4gbG1jX21lZGlhX3QgbG1jX2hzc2lfbWVkaWE7CisKKyNpZmRlZiBfREJHX0VWRU5UTE9HCitzdGF0aWMgdm9pZCBsbWNFdmVudExvZyggdV9pbnQzMl90IEV2ZW50TnVtLCB1X2ludDMyX3QgYXJnMiwgdV9pbnQzMl90IGFyZzMgKTsKKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfZGVidWcuYyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRjY2Q5NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX2RlYnVnLmMKQEAgLTAsMCArMSw4NSBAQAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgImxtY19kZWJ1Zy5oIgorCisvKgorICogUHJpbnRzIG91dCBsZW4sIG1heCB0byA4MCBvY3RldHMgdXNpbmcgcHJpbnRrLCAyMCBwZXIgbGluZQorICovCit2b2lkIGxtY0NvbnNvbGVMb2coY2hhciAqdHlwZSwgdW5zaWduZWQgY2hhciAqdWNEYXRhLCBpbnQgaUxlbikKK3sKKyNpZmRlZiBERUJVRworI2lmZGVmIExNQ19QQUNLRVRfTE9HCisgIGludCBpTmV3TGluZSA9IDE7CisgIGNoYXIgc3RyWzgwXSwgKnBzdHI7CisgIAorICBzcHJpbnRmKHN0ciwgS0VSTl9ERUJVRyAibG1jOiAlczogIiwgdHlwZSk7CisgIHBzdHIgPSBzdHIrc3RybGVuKHN0cik7CisgIAorICBpZihpTGVuID4gMjQwKXsKKyAgICAgIHByaW50ayhLRVJOX0RFQlVHICJsbWM6IFByaW50aW5nIDI0MCBjaGFycy4uLiBvdXQgb2Y6ICVkXG4iLCBpTGVuKTsKKyAgICBpTGVuID0gMjQwOworICB9CisgIGVsc2V7CisgICAgICBwcmludGsoS0VSTl9ERUJVRyAibG1jOiBQcmludGluZyAlZCBjaGFyc1xuIiwgaUxlbik7CisgIH0KKworICB3aGlsZShpTGVuID4gMCkgCisgICAgeworICAgICAgc3ByaW50Zihwc3RyLCAiJTAyeCAiLCAqdWNEYXRhKTsKKyAgICAgIHBzdHIrPTM7CisgICAgICB1Y0RhdGErKzsKKyAgICAgIGlmKCAhKGlOZXdMaW5lICUgMjApKQorCXsKKwkgIHNwcmludGYocHN0ciwgIlxuIik7CisJICBwcmludGsoc3RyKTsKKwkgIHNwcmludGYoc3RyLCBLRVJOX0RFQlVHICJsbWM6ICVzOiAiLCB0eXBlKTsKKwkgIHBzdHI9c3RyK3N0cmxlbihzdHIpOworCX0KKyAgICAgIGlOZXdMaW5lKys7CisgICAgICBpTGVuLS07CisgICAgfQorICBzcHJpbnRmKHBzdHIsICJcbiIpOworICBwcmludGsoc3RyKTsKKyNlbmRpZgorI2VuZGlmCit9CisKKyNpZmRlZiBERUJVRwordV9pbnQzMl90IGxtY0V2ZW50TG9nSW5kZXggPSAwOwordV9pbnQzMl90IGxtY0V2ZW50TG9nQnVmW0xNQ19FVkVOVExPR1NJWkUgKiBMTUNfRVZFTlRMT0dBUkdTXTsKKyNlbmRpZgorCit2b2lkIGxtY0V2ZW50TG9nICh1X2ludDMyX3QgRXZlbnROdW0sIHVfaW50MzJfdCBhcmcyLCB1X2ludDMyX3QgYXJnMykKK3sKKyNpZmRlZiBERUJVRworICBsbWNFdmVudExvZ0J1ZltsbWNFdmVudExvZ0luZGV4KytdID0gRXZlbnROdW07CisgIGxtY0V2ZW50TG9nQnVmW2xtY0V2ZW50TG9nSW5kZXgrK10gPSBhcmcyOworICBsbWNFdmVudExvZ0J1ZltsbWNFdmVudExvZ0luZGV4KytdID0gYXJnMzsKKyAgbG1jRXZlbnRMb2dCdWZbbG1jRXZlbnRMb2dJbmRleCsrXSA9IGppZmZpZXM7CisKKyAgbG1jRXZlbnRMb2dJbmRleCAmPSAoTE1DX0VWRU5UTE9HU0laRSAqIExNQ19FVkVOVExPR0FSR1MpIC0gMTsKKyNlbmRpZgorfQorCit2b2lkIGxtY190cmFjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICptc2cpeworI2lmZGVmIExNQ19UUkFDRQorICAgIHVuc2lnbmVkIGxvbmcgaiA9IGppZmZpZXMgKyAzOyAvKiBXYWl0IGZvciA1MCBtcyAqLworCisgICAgaWYoaW5faW50ZXJydXB0KCkpeworICAgICAgICBwcmludGsoIiVzOiAqICVzXG4iLCBkZXYtPm5hbWUsIG1zZyk7CisvLyAgICAgICAgd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgaisxMCkpCisvLyAgICAgICAgICAgIDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHByaW50aygiJXM6ICVzXG4iLCBkZXYtPm5hbWUsIG1zZyk7CisgICAgICAgIHdoaWxlKHRpbWVfYmVmb3JlKGppZmZpZXMsIGopKQorICAgICAgICAgICAgc2NoZWR1bGUoKTsKKyAgICB9CisjZW5kaWYKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZW5kIGlmX2xtY19saW51eC5jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfZGVidWcuaCBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YzNTYzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX2RlYnVnLmgKQEAgLTAsMCArMSw1MiBAQAorI2lmbmRlZiBfTE1DX0RFQlVHX0hfCisjZGVmaW5lIF9MTUNfREVCVUdfSF8KKworI2lmZGVmIERFQlVHCisjaWZkZWYgTE1DX1BBQ0tFVF9MT0cKKyNkZWZpbmUgTE1DX0NPTlNPTEVfTE9HKHgseSx6KSBsbWNDb25zb2xlTG9nKCh4KSwgKHkpLCAoeikpCisjZWxzZQorI2RlZmluZSBMTUNfQ09OU09MRV9MT0coeCx5LHopCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIExNQ19DT05TT0xFX0xPRyh4LHkseikKKyNlbmRpZgorCisKKworLyogRGVidWcgLS0tIEV2ZW50IGxvZyBkZWZpbml0aW9ucyAtLS0gKi8KKy8qIEVWRU5UTE9HU0laRSpFVkVOVExPR0FSR1MgbmVlZHMgdG8gYmUgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIExNQ19FVkVOVExPR1NJWkUgMTAyNAkvKiBudW1iZXIgb2YgZXZlbnRzIGluIGV2ZW50bG9nICovCisjZGVmaW5lIExNQ19FVkVOVExPR0FSR1MgNAkJLyogbnVtYmVyIG9mIGFyZ3MgZm9yIGVhY2ggZXZlbnQgKi8KKworLyogZXZlbnQgaW5kaWNhdG9ycyAqLworI2RlZmluZSBMTUNfRVZFTlRfWE1UICAgICAgICAgICAxCisjZGVmaW5lIExNQ19FVkVOVF9YTVRFTkQgICAgICAgIDIKKyNkZWZpbmUgTE1DX0VWRU5UX1hNVElOVCAgICAgICAgMworI2RlZmluZSBMTUNfRVZFTlRfUkNWSU5UICAgICAgICA0CisjZGVmaW5lIExNQ19FVkVOVF9SQ1ZFTkQgICAgICAgIDUKKyNkZWZpbmUgTE1DX0VWRU5UX0lOVCAgICAgICAgICAgNgorI2RlZmluZSBMTUNfRVZFTlRfWE1USU5UVE1PICAgICA3CisjZGVmaW5lIExNQ19FVkVOVF9YTVRQUkNUTU8gICAgIDgKKyNkZWZpbmUgTE1DX0VWRU5UX0lOVEVORCAgICAgICAgOQorI2RlZmluZSBMTUNfRVZFTlRfUkVTRVQxICAgICAgIDEwCisjZGVmaW5lIExNQ19FVkVOVF9SRVNFVDIgICAgICAgMTEKKyNkZWZpbmUgTE1DX0VWRU5UX0ZPUkNFRFJFU0VUICAxMgorI2RlZmluZSBMTUNfRVZFTlRfV0FUQ0hET0cgICAgIDEzCisjZGVmaW5lIExNQ19FVkVOVF9CQURQS1RTVVJHRSAgMTQKKyNkZWZpbmUgTE1DX0VWRU5UX1RCVVNZMCAgICAgICAxNQorI2RlZmluZSBMTUNfRVZFTlRfVEJVU1kxICAgICAgIDE2CisKKworI2lmZGVmIERFQlVHCitleHRlcm4gdV9pbnQzMl90IGxtY0V2ZW50TG9nSW5kZXg7CitleHRlcm4gdV9pbnQzMl90IGxtY0V2ZW50TG9nQnVmW0xNQ19FVkVOVExPR1NJWkUgKiBMTUNfRVZFTlRMT0dBUkdTXTsKKyNkZWZpbmUgTE1DX0VWRU5UX0xPRyh4LCB5LCB6KSBsbWNFdmVudExvZygoeCksICh5KSwgKHopKQorI2Vsc2UKKyNkZWZpbmUgTE1DX0VWRU5UX0xPRyh4LHkseikKKyNlbmRpZiAvKiBlbmQgaWZkZWYgX0RCR19FVkVOVExPRyAqLworCit2b2lkIGxtY0NvbnNvbGVMb2coY2hhciAqdHlwZSwgdW5zaWduZWQgY2hhciAqdWNEYXRhLCBpbnQgaUxlbik7Cit2b2lkIGxtY0V2ZW50TG9nICh1X2ludDMyX3QgRXZlbnROdW0sIHVfaW50MzJfdCBhcmcyLCB1X2ludDMyX3QgYXJnMyk7Cit2b2lkIGxtY190cmFjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICptc2cpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX2lvY3RsLmggYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZGQ4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19pb2N0bC5oCkBAIC0wLDAgKzEsMjU3IEBACisjaWZuZGVmIF9MTUNfSU9DVExfSF8KKyNkZWZpbmUgX0xNQ19JT0NUTF9IXworLyoJJElkOiBsbWNfaW9jdGwuaCx2IDEuMTUgMjAwMC8wNC8wNiAxMjoxNjo0MyBhc2ogRXhwICQJKi8KKworIC8qCisgICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDAgTEFOIE1lZGlhIENvcnBvcmF0aW9uIChMTUMpCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gIHd3dy5sYW5tZWRpYS5jb20KKyAgKgorICAqIFRoaXMgY29kZSBpcyB3cml0dGVuIGJ5OgorICAqIEFuZHJldyBTdGFubGV5LUpvbmVzIChhc2pAY2Jhbi5jb20pCisgICogUm9iIEJyYXVuIChiYnJhdW5Adml4LmNvbSksCisgICogTWljaGFlbCBHcmFmZiAoZXhwbG9yZXJAdml4LmNvbSkgYW5kCisgICogTWF0dCBUaG9tYXMgKG1hdHRAM2FtLXNvZnR3YXJlLmNvbSkuCisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgICovCisKKyNkZWZpbmUgTE1DSU9DR0lORk8gICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrMyAvKiBnZXQgY3VycmVudCBzdGF0ZSAqLworI2RlZmluZSBMTUNJT0NTSU5GTyAgICAgICAgICAgICBTSU9DREVWUFJJVkFURSs0IC8qIHNldCBzdGF0ZSB0byB1c2VyIHZhbHVlcyAqLworI2RlZmluZSBMTUNJT0NHRVRMTUNTVEFUUyAgICAgICBTSU9DREVWUFJJVkFURSs1CisjZGVmaW5lIExNQ0lPQ0NMRUFSTE1DU1RBVFMgICAgIFNJT0NERVZQUklWQVRFKzYKKyNkZWZpbmUgTE1DSU9DRFVNUEVWRU5UTE9HICAgICAgU0lPQ0RFVlBSSVZBVEUrNworI2RlZmluZSBMTUNJT0NHRVRYSU5GTyAgICAgICAgICBTSU9DREVWUFJJVkFURSs4CisjZGVmaW5lIExNQ0lPQ1NFVENJUkNVSVQgICAgICAgIFNJT0NERVZQUklWQVRFKzkKKyNkZWZpbmUgTE1DSU9DVU5VU0VEQVRNICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrMTAKKyNkZWZpbmUgTE1DSU9DUkVTRVQgICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrMTEKKyNkZWZpbmUgTE1DSU9DVDFDT05UUk9MICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrMTIKKyNkZWZpbmUgTE1DSU9DSUZUWVBFICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrMTMKKyNkZWZpbmUgTE1DSU9DWElMSU5YICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrMTQKKworI2RlZmluZSBMTUNfQ0FSRFRZUEVfVU5LTk9XTiAgICAgICAgICAgIC0xCisjZGVmaW5lIExNQ19DQVJEVFlQRV9IU1NJICAgICAgICAgICAgICAgMSAgICAgICAvKiBwcm9iZWQgY2FyZCBpcyBhIEhTU0kgY2FyZCAqLworI2RlZmluZSBMTUNfQ0FSRFRZUEVfRFMzICAgICAgICAgICAgICAgIDIgICAgICAgLyogcHJvYmVkIGNhcmQgaXMgYSBEUzMgY2FyZCAqLworI2RlZmluZSBMTUNfQ0FSRFRZUEVfU1NJICAgICAgICAgICAgICAgIDMgICAgICAgLyogcHJvYmVkIGNhcmQgaXMgYSBTU0kgY2FyZCAqLworI2RlZmluZSBMTUNfQ0FSRFRZUEVfVDEgICAgICAgICAgICAgICAgIDQgICAgICAgLyogcHJvYmVkIGNhcmQgaXMgYSBUMSBjYXJkICovCisKKyNkZWZpbmUgTE1DX0NUTF9DQVJEVFlQRV9MTUM1MjAwCTAJLyogSFNTSSAqLworI2RlZmluZSBMTUNfQ1RMX0NBUkRUWVBFX0xNQzUyNDUJMQkvKiBEUzMgKi8KKyNkZWZpbmUgTE1DX0NUTF9DQVJEVFlQRV9MTUMxMDAwCTIJLyogU1NJLCBWLjM1ICovCisjZGVmaW5lIExNQ19DVExfQ0FSRFRZUEVfTE1DMTIwMCAgICAgICAgMyAgICAgICAvKiBEUzEgKi8KKworI2RlZmluZSBMTUNfQ1RMX09GRgkJCTAJLyogZ2VuZXJpYyBPRkYgdmFsdWUgKi8KKyNkZWZpbmUgTE1DX0NUTF9PTgkJCTEJLyogZ2VuZXJpYyBPTiB2YWx1ZSAqLworCisjZGVmaW5lIExNQ19DVExfQ0xPQ0tfU09VUkNFX0VYVAkwCS8qIGNsb2NrIG9mZiBsaW5lICovCisjZGVmaW5lIExNQ19DVExfQ0xPQ0tfU09VUkNFX0lOVAkxCS8qIGludGVybmFsIGNsb2NrICovCisKKyNkZWZpbmUgTE1DX0NUTF9DUkNfTEVOR1RIXzE2CQkxNgorI2RlZmluZSBMTUNfQ1RMX0NSQ19MRU5HVEhfMzIJCTMyCisjZGVmaW5lIExNQ19DVExfQ1JDX0JZVEVTSVpFXzIgICAgICAgICAgMgorI2RlZmluZSBMTUNfQ1RMX0NSQ19CWVRFU0laRV80ICAgICAgICAgIDQKKworCisjZGVmaW5lIExNQ19DVExfQ0FCTEVfTEVOR1RIX0xUXzEwMEZUCTAJLyogRFMzIGNhYmxlIDwgMTAwIGZlZXQgKi8KKyNkZWZpbmUgTE1DX0NUTF9DQUJMRV9MRU5HVEhfR1RfMTAwRlQJMQkvKiBEUzMgY2FibGUgPj0gMTAwIGZlZXQgKi8KKworI2RlZmluZSBMTUNfQ1RMX0NJUkNVSVRfVFlQRV9FMSAwCisjZGVmaW5lIExNQ19DVExfQ0lSQ1VJVF9UWVBFX1QxIDEKKworLyoKKyAqIElGVFlQRSBkZWZpbmVzCisgKi8KKyNkZWZpbmUgTE1DX1BQUCAgICAgICAgIDEgICAgICAgICAgICAgICAvKiB1c2Ugc3BwcCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgTE1DX05FVCAgICAgICAgIDIgICAgICAgICAgICAgICAvKiB1c2UgZGlyZWN0IG5ldCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgTE1DX1JBVyAgICAgICAgIDMgICAgICAgICAgICAgICAvKiB1c2UgZGlyZWN0IG5ldCBpbnRlcmZhY2UgKi8KKworLyoKKyAqIFRoZXNlIGFyZSBub3QgaW4gdGhlIGxlYXN0IElPQ1RMIHJlbGF0ZWQsIGJ1dCBJIHdhbnQgdGhlbSBjb21tb24uCisgKi8KKy8qCisgKiBhc3NpZ25tZW50cyBmb3IgdGhlIEdQSU8gcmVnaXN0ZXIgb24gdGhlIERFQyBjaGlwIChjb21tb24pCisgKi8KKyNkZWZpbmUgTE1DX0dFUF9JTklUCQkweDAxIC8qIDA6ICovCisjZGVmaW5lIExNQ19HRVBfUkVTRVQJCTB4MDIgLyogMTogKi8KKyNkZWZpbmUgTE1DX0dFUF9NT0RFCQkweDEwIC8qIDQ6ICovCisjZGVmaW5lIExNQ19HRVBfRFAJCTB4MjAgLyogNTogKi8KKyNkZWZpbmUgTE1DX0dFUF9EQVRBCQkweDQwIC8qIDY6IHNlcmlhbCBvdXQgKi8KKyNkZWZpbmUgTE1DX0dFUF9DTEsJICAgICAgICAweDgwIC8qIDc6IHNlcmlhbCBjbG9jayAqLworCisvKgorICogSFNTSSBHUElPIGFzc2lnbm1lbnRzCisgKi8KKyNkZWZpbmUgTE1DX0dFUF9IU1NJX1NUCQkweDA0IC8qIDI6IHJlY2VpdmUgdGltaW5nIHNlbnNlIChkZXByZWNhdGVkKSAqLworI2RlZmluZSBMTUNfR0VQX0hTU0lfQ0xPQ0sJMHgwOCAvKiAzOiBjbG9jayBzb3VyY2UgKi8KKworLyoKKyAqIFQxIEdQSU8gYXNzaWdubWVudHMKKyAqLworI2RlZmluZSBMTUNfR0VQX1NTSV9HRU5FUkFUT1IJMHgwNCAvKiAyOiBlbmFibGUgcHJvZyBmcmVxIGdlbiBzZXJpYWwgaS9mICovCisjZGVmaW5lIExNQ19HRVBfU1NJX1RYQ0xPQ0sJMHgwOCAvKiAzOiBwcm92aWRlIGNsb2NrIG9uIFRYQ0xPQ0sgb3V0cHV0ICovCisKKy8qCisgKiBDb21tb24gTUlJMTYgYml0cworICovCisjZGVmaW5lIExNQ19NSUkxNl9MRUQwICAgICAgICAgMHgwMDgwCisjZGVmaW5lIExNQ19NSUkxNl9MRUQxICAgICAgICAgMHgwMTAwCisjZGVmaW5lIExNQ19NSUkxNl9MRUQyICAgICAgICAgMHgwMjAwCisjZGVmaW5lIExNQ19NSUkxNl9MRUQzICAgICAgICAgMHgwNDAwICAvKiBFcnJvciwgYW5kIHRoZSByZWQgb25lICovCisjZGVmaW5lIExNQ19NSUkxNl9MRURfQUxMICAgICAgMHgwNzgwICAvKiBMRUQgYml0IG1hc2sgKi8KKyNkZWZpbmUgTE1DX01JSTE2X0ZJRk9fUkVTRVQgICAweDA4MDAKKworLyoKKyAqIGRlZmluaXRpb25zIGZvciBIU1NJCisgKi8KKyNkZWZpbmUgTE1DX01JSTE2X0hTU0lfVEEgICAgICAweDAwMDEKKyNkZWZpbmUgTE1DX01JSTE2X0hTU0lfQ0EgICAgICAweDAwMDIKKyNkZWZpbmUgTE1DX01JSTE2X0hTU0lfTEEgICAgICAweDAwMDQKKyNkZWZpbmUgTE1DX01JSTE2X0hTU0lfTEIgICAgICAweDAwMDgKKyNkZWZpbmUgTE1DX01JSTE2X0hTU0lfTEMgICAgICAweDAwMTAKKyNkZWZpbmUgTE1DX01JSTE2X0hTU0lfVE0gICAgICAweDAwMjAKKyNkZWZpbmUgTE1DX01JSTE2X0hTU0lfQ1JDICAgICAweDAwNDAKKworLyoKKyAqIGFzc2lnbm1lbnRzIGZvciB0aGUgTUlJIHJlZ2lzdGVyIDE2IChEUzMpCisgKi8KKyNkZWZpbmUgTE1DX01JSTE2X0RTM19aRVJPCTB4MDAwMQorI2RlZmluZSBMTUNfTUlJMTZfRFMzX1RSTEJLCTB4MDAwMgorI2RlZmluZSBMTUNfTUlJMTZfRFMzX0xOTEJLCTB4MDAwNAorI2RlZmluZSBMTUNfTUlJMTZfRFMzX1JBSVMJMHgwMDA4CisjZGVmaW5lIExNQ19NSUkxNl9EUzNfVEFJUwkweDAwMTAKKyNkZWZpbmUgTE1DX01JSTE2X0RTM19CSVNUCTB4MDAyMAorI2RlZmluZSBMTUNfTUlJMTZfRFMzX0RMT1MJMHgwMDQwCisjZGVmaW5lIExNQ19NSUkxNl9EUzNfQ1JDCTB4MTAwMAorI2RlZmluZSBMTUNfTUlJMTZfRFMzX1NDUkFNCTB4MjAwMAorI2RlZmluZSBMTUNfTUlJMTZfRFMzX1NDUkFNX0xBUlMgMHg0MDAwCisKKy8qIE5vdGU6IDIgcGFpcnMgb2YgTEVEcyB3aGVyZSBzd2FwcGVkIGJ5IG1pc3Rha2UKKyAqIGluIFhpbGlueCBjb2RlIGZvciBEUzMgJiBEUzEgYWRhcHRlcnMgKi8KKyNkZWZpbmUgTE1DX0RTM19MRUQwICAgIDB4MDEwMCAgICAgICAgICAvKiBiaXQgMDggIHllbGxvdyAqLworI2RlZmluZSBMTUNfRFMzX0xFRDEgICAgMHgwMDgwICAgICAgICAgIC8qIGJpdCAwNyAgYmx1ZSAgICovCisjZGVmaW5lIExNQ19EUzNfTEVEMiAgICAweDA0MDAgICAgICAgICAgLyogYml0IDEwICBncmVlbiAgKi8KKyNkZWZpbmUgTE1DX0RTM19MRUQzICAgIDB4MDIwMCAgICAgICAgICAvKiBiaXQgMDkgIHJlZCAgICAqLworCisvKgorICogZnJhbWVyIHJlZ2lzdGVyIDAgYW5kIDcgKDcgaXMgbGF0Y2hlZCBhbmQgcmVzZXQgb24gcmVhZCkKKyAqLworI2RlZmluZSBMTUNfRlJBTUVSX1JFRzBfRExPUyAgICAgICAgICAgIDB4ODAgICAgLyogZGlnaXRhbCBsb3NzIG9mIHNlcnZpY2UgKi8KKyNkZWZpbmUgTE1DX0ZSQU1FUl9SRUcwX09PRlMgICAgICAgICAgICAweDQwICAgIC8qIG91dCBvZiBmcmFtZSBzeW5jICovCisjZGVmaW5lIExNQ19GUkFNRVJfUkVHMF9BSVMgICAgICAgICAgICAgMHgyMCAgICAvKiBhbGFybSBpbmRpY2F0aW9uIHNpZ25hbCAqLworI2RlZmluZSBMTUNfRlJBTUVSX1JFRzBfQ0lTICAgICAgICAgICAgIDB4MTAgICAgLyogY2hhbm5lbCBpZGxlICovCisjZGVmaW5lIExNQ19GUkFNRVJfUkVHMF9MT0MgICAgICAgICAgICAgMHgwOCAgICAvKiBsb3NzIG9mIGNsb2NrICovCisKKy8qCisgKiBGcmFtZXIgcmVnaXN0ZXIgOSBjb250YWlucyB0aGUgYmx1ZSBhbGFybSBzaWduYWwKKyAqLworI2RlZmluZSBMTUNfRlJBTUVSX1JFRzlfUkJMVUUgICAgICAgICAgMHgwMiAgICAgLyogQmx1ZSBhbGFybSBmYWlsdXJlICovCisKKy8qCisgKiBGcmFtZXIgcmVnaXN0ZXIgMHgxMCBjb250YWlucyB4Yml0IGVycm9yCisgKi8KKyNkZWZpbmUgTE1DX0ZSQU1FUl9SRUcxMF9YQklUICAgICAgICAgIDB4MDEgICAgIC8qIFggYml0IGVycm9yIGFsYXJtIGZhaWx1cmUgKi8KKworLyoKKyAqIEFuZCBTU0ksIExNQzEwMDAKKyAqLworI2RlZmluZSBMTUNfTUlJMTZfU1NJX0RUUgkweDAwMDEJLyogRFRSIG91dHB1dCBSVyAqLworI2RlZmluZSBMTUNfTUlJMTZfU1NJX0RTUgkweDAwMDIJLyogRFNSIGlucHV0IFJPICovCisjZGVmaW5lIExNQ19NSUkxNl9TU0lfUlRTCTB4MDAwNAkvKiBSVFMgb3V0cHV0IFJXICovCisjZGVmaW5lIExNQ19NSUkxNl9TU0lfQ1RTCTB4MDAwOAkvKiBDVFMgaW5wdXQgUk8gKi8KKyNkZWZpbmUgTE1DX01JSTE2X1NTSV9EQ0QJMHgwMDEwCS8qIERDRCBpbnB1dCBSTyAqLworI2RlZmluZSBMTUNfTUlJMTZfU1NJX1JJCQkweDAwMjAJLyogUkkgaW5wdXQgUk8gKi8KKyNkZWZpbmUgTE1DX01JSTE2X1NTSV9DUkMgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBDUkMgc2VsZWN0IC0gUlcgKi8KKworLyoKKyAqIGJpdHMgMHgwMDgwIHRocm91Z2ggMHgwODAwIGFyZSBnZW5lcmljLCBhbmQgZGVzY3JpYmVkCisgKiBhYm92ZSB3aXRoIExNQ19NSUkxNl9MRURbMDEyM10gX0xFRF9BTEwsIGFuZCBfRklGT19SRVNFVAorICovCisjZGVmaW5lIExNQ19NSUkxNl9TU0lfTEwJCTB4MTAwMAkvKiBMTCBvdXRwdXQgUlcgKi8KKyNkZWZpbmUgTE1DX01JSTE2X1NTSV9STAkJMHgyMDAwCS8qIFJMIG91dHB1dCBSVyAqLworI2RlZmluZSBMTUNfTUlJMTZfU1NJX1RNCQkweDQwMDAJLyogVE0gaW5wdXQgUk8gKi8KKyNkZWZpbmUgTE1DX01JSTE2X1NTSV9MT09QCTB4ODAwMAkvKiBsb29wYmFjayBlbmFibGUgUlcgKi8KKworLyoKKyAqIFNvbWUgb2YgdGhlIE1JSTE2IGJpdHMgYXJlIG1pcnJvcmVkIGluIHRoZSBNSUkxNyByZWdpc3RlciBhcyB3ZWxsLAorICogYnV0IGxldCdzIGtlZXAgdGhpbmcgc2VwYXJhdGUgZm9yIG5vdywgYW5kIGdldCBvbmx5IHRoZSBjYWJsZSBmcm9tCisgKiB0aGUgTUlJMTcuCisgKi8KKyNkZWZpbmUgTE1DX01JSTE3X1NTSV9DQUJMRV9NQVNLCTB4MDAzOAkvKiBtYXNrIHRvIGV4dHJhY3QgdGhlIGNhYmxlIHR5cGUgKi8KKyNkZWZpbmUgTE1DX01JSTE3X1NTSV9DQUJMRV9TSElGVCAzCS8qIHNoaWZ0IHRvIGV4dHJhY3QgdGhlIGNhYmxlIHR5cGUgKi8KKworLyoKKyAqIEFuZCBUMSwgTE1DMTIwMAorICovCisjZGVmaW5lIExNQ19NSUkxNl9UMV9VTlVTRUQxICAgIDB4MDAwMworI2RlZmluZSBMTUNfTUlJMTZfVDFfWE9FICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBMTUNfTUlJMTZfVDFfUlNUICAgICAgICAgICAgICAgIDB4MDAwOCAgLyogVDEgY2hpcCByZXNldCAtIFJXICovCisjZGVmaW5lIExNQ19NSUkxNl9UMV9aICAgICAgICAgICAgICAgICAgMHgwMDEwICAvKiBvdXRwdXQgaW1wZWRhbmNlIFQxPTEsIEUxPTAgb3V0cHV0IC0gUlcgKi8KKyNkZWZpbmUgTE1DX01JSTE2X1QxX0lOVFIgICAgICAgICAgICAgICAweDAwMjAgIC8qIGludGVycnVwdCBmcm9tIDgzNzAgLSBSTyAqLworI2RlZmluZSBMTUNfTUlJMTZfVDFfT05FU0VDICAgICAgICAgICAgIDB4MDA0MCAgLyogb25lIHNlY29uZCBzcXVhcmUgd2F2ZSAtIHJvICovCisKKyNkZWZpbmUgTE1DX01JSTE2X1QxX0xFRDAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUgTE1DX01JSTE2X1QxX0xFRDEgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgTE1DX01JSTE2X1QxX0xFRDIgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgTE1DX01JSTE2X1QxX0xFRDMgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgTE1DX01JSTE2X1QxX0ZJRk9fUkVTRVQgMHgwODAwCisKKyNkZWZpbmUgTE1DX01JSTE2X1QxX0NSQyAgICAgICAgICAgICAgICAweDEwMDAgIC8qIENSQyBzZWxlY3QgLSBSVyAqLworI2RlZmluZSBMTUNfTUlJMTZfVDFfVU5VU0VEMiAgICAweGUwMDAKKworCisvKiA4MzcwIGZyYW1lciByZWdpc3RlcnMgICovCisKKyNkZWZpbmUgVDFGUkFNRVJfQUxBUk0xX1NUQVRVUyAgMHg0NworI2RlZmluZSBUMUZSQU1FUl9BTEFSTTJfU1RBVFVTICAweDQ4CisjZGVmaW5lIFQxRlJBTUVSX0ZFUlJfTFNCICAgICAgICAgICAgICAgMHg1MAorI2RlZmluZSBUMUZSQU1FUl9GRVJSX01TQiAgICAgICAgICAgICAgIDB4NTEgICAgLyogZnJhbWluZyBiaXQgZXJyb3IgY291bnRlciAqLworI2RlZmluZSBUMUZSQU1FUl9MQ1ZfTFNCICAgICAgICAgICAgICAgIDB4NTQKKyNkZWZpbmUgVDFGUkFNRVJfTENWX01TQiAgICAgICAgICAgICAgICAweDU1ICAgIC8qIGxpbmUgY29kZSB2aW9sYXRpb24gY291bnRlciAqLworI2RlZmluZSBUMUZSQU1FUl9BRVJSICAgICAgICAgICAgICAgICAgIDB4NUEKKworLyogbWFzayBmb3IgdGhlIGFib3ZlIEFFUlIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVDFGUkFNRVJfTE9GX01BU0sgICAgICAgICAgICAgICAoMHgwZjApIC8qIHJlY2VpdmUgbG9zcyBvZiBmcmFtZSAqLworI2RlZmluZSBUMUZSQU1FUl9DT0ZBX01BU0sgICAgICAgICAgICAgICgweDBjMCkgLyogY2hhbmdlIG9mIGZyYW1lIGFsaWdubWVudCAqLworI2RlZmluZSBUMUZSQU1FUl9TRUZfTUFTSyAgICAgICAgICAgICAgICgweDAzKSAgLyogc2V2ZXJlbHkgZXJyb3JlZCBmcmFtZSAgKi8KKworLyogODM3MCBmcmFtZXIgcmVnaXN0ZXIgQUxNMSAoMHg0NykgdmFsdWVzCisgKiB1c2VkIHRvIGRldGVybWluZSBsaW5rIHN0YXR1cworICovCisKKyNkZWZpbmUgVDFGX1NJR0ZSWiAgICAgIDB4MDEgICAgLyogc2lnbmFsaW5nIGZyZWV6ZSAqLworI2RlZmluZSBUMUZfUkxPRiAgICAgICAgMHgwMiAgICAvKiByZWNlaXZlIGxvc3Mgb2YgZnJhbWUgYWxpZ25tZW50ICovCisjZGVmaW5lIFQxRl9STE9TICAgICAgICAweDA0ICAgIC8qIHJlY2VpdmUgbG9zcyBvZiBzaWduYWwgKi8KKyNkZWZpbmUgVDFGX1JBTE9TICAgICAgIDB4MDggICAgLyogcmVjZWl2ZSBhbmFsb2cgbG9zcyBvZiBzaWduYWwgb3IgUkNLSSBsb3NzIG9mIGNsb2NrICovCisjZGVmaW5lIFQxRl9SQUlTICAgICAgICAweDEwICAgIC8qIHJlY2VpdmUgYWxhcm0gaW5kaWNhdGlvbiBzaWduYWwgKi8KKyNkZWZpbmUgVDFGX1VOVVNFRCAgICAgIDB4MjAKKyNkZWZpbmUgVDFGX1JZRUwgICAgICAgIDB4NDAgICAgLyogcmVjZWl2ZSB5ZWxsb3cgYWxhcm0gKi8KKyNkZWZpbmUgVDFGX1JNWUVMICAgICAgIDB4ODAgICAgLyogcmVjZWl2ZSBtdWx0aWZyYW1lIHllbGxvdyBhbGFybSAqLworCisjZGVmaW5lIExNQ19UMUZfV1JJVEUgICAgICAgMAorI2RlZmluZSBMTUNfVDFGX1JFQUQgICAgICAgIDEKKwordHlwZWRlZiBzdHJ1Y3QgbG1jX3N0MWZfY29udHJvbCB7CisgIGludCBjb21tYW5kOworICBpbnQgYWRkcmVzczsKKyAgaW50IHZhbHVlOworICBjaGFyIF9fdXNlciAqZGF0YTsKK30gbG1jX3QxZl9jb250cm9sOworCitlbnVtIGxtY194aWxpbnhfYyB7CisgICAgbG1jX3hpbGlueF9yZXNldCA9IDEsCisgICAgbG1jX3hpbGlueF9sb2FkX3Byb20gPSAyLAorICAgIGxtY194aWxpbnhfbG9hZCA9IDMKK307CisKK3N0cnVjdCBsbWNfeGlsaW54X2NvbnRyb2wgeworICAgIGVudW0gbG1jX3hpbGlueF9jIGNvbW1hbmQ7CisgICAgaW50IGxlbjsKKyAgICBjaGFyIF9fdXNlciAqZGF0YTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLSBlbmQgVDEgZGVmcyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTE1DX01JSV9MZWRNYXNrICAgICAgICAgICAgICAgICAweDA3ODAKKyNkZWZpbmUgTE1DX01JSV9MZWRCaXRQb3MgICAgICAgICAgICAgICA3CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZTU0NWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19tYWluLmMKQEAgLTAsMCArMSwyMjAxIEBACisgLyoKKyAgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwMCBMQU4gTWVkaWEgQ29ycG9yYXRpb24gKExNQykKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgd3d3Lmxhbm1lZGlhLmNvbQorICAqCisgICogVGhpcyBjb2RlIGlzIHdyaXR0ZW4gYnk6CisgICogQW5kcmV3IFN0YW5sZXktSm9uZXMgKGFzakBjYmFuLmNvbSkKKyAgKiBSb2IgQnJhdW4gKGJicmF1bkB2aXguY29tKSwKKyAgKiBNaWNoYWVsIEdyYWZmIChleHBsb3JlckB2aXguY29tKSBhbmQKKyAgKiBNYXR0IFRob21hcyAobWF0dEAzYW0tc29mdHdhcmUuY29tKS4KKyAgKgorICAqIFdpdGggSGVscCBCeToKKyAgKiBEYXZpZCBCb2dncworICAqIFJvbiBDcmFuZQorICAqIEFsYW4gQ294CisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgICoKKyAgKiBEcml2ZXIgZm9yIHRoZSBMYW5NZWRpYSBMTUM1MjAwLCBMTUM1MjQ1LCBMTUMxMDAwLCBMTUMxMjAwIGNhcmRzLgorICAqCisgICogVG8gY29udHJvbCBsaW5rIHNwZWNpZmljIG9wdGlvbnMgbG1jY3RsIGlzIHJlcXVpcmVkLgorICAqIEl0IGNhbiBiZSBvYnRhaW5lZCBmcm9tIGZ0cC5sYW5tZWRpYS5jb20uCisgICoKKyAgKiBMaW51eCBkcml2ZXIgbm90ZXM6CisgICogTGludXggdXNlcyB0aGUgZGV2aWNlIHN0cnVjdCBsbWNfcHJpdmF0ZSB0byBwYXNzIHByaXZhdGUgaW5mb3JtYXRpb24KKyAgKiBhcnJvdW5kLgorICAqCisgICogVGhlIGluaXRpYWxpemF0aW9uIHBvcnRpb24gb2YgdGhpcyBkcml2ZXIgKHRoZSBsbWNfcmVzZXQoKSBhbmQgdGhlCisgICogbG1jX2RlY19yZXNldCgpIGZ1bmN0aW9ucywgYXMgd2VsbCBhcyB0aGUgbGVkIGNvbnRyb2xzIGFuZCB0aGUKKyAgKiBsbWNfaW5pdGNzcnMoKSBmdW5jdGlvbnMuCisgICoKKyAgKiBUaGUgd2F0Y2hkb2cgZnVuY3Rpb24gcnVucyBldmVyeSBzZWNvbmQgYW5kIGNoZWNrcyB0byBzZWUgaWYKKyAgKiB3ZSBzdGlsbCBoYXZlIGxpbmssIGFuZCB0aGF0IHRoZSB0aW1pbmcgc291cmNlIGlzIHdoYXQgd2UgZXhwZWN0ZWQKKyAgKiBpdCB0byBiZS4gIElmIGxpbmsgaXMgbG9zdCwgdGhlIGludGVyZmFjZSBpcyBtYXJrZWQgZG93biwgYW5kCisgICogd2Ugbm8gbG9uZ2VyIGNhbiB0cmFuc21pdC4KKyAgKgorICAqLworCisvKiAkSWQ6IGxtY19tYWluLmMsdiAxLjM2IDIwMDAvMDQvMTEgMDU6MjU6MjUgYXNqIEV4cCAkICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxuZXQvc3luY3BwcC5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPiAgICAgICAgICAgICAvKiBQcm9jZXNzb3IgdHlwZSBmb3IgY2FjaGUgYWxpZ25tZW50LiAqLworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorLy8jaW5jbHVkZSA8YXNtL3NwaW5sb2NrLmg+CisKKyNkZWZpbmUgRFJJVkVSX01BSk9SX1ZFUlNJT04gICAgIDEKKyNkZWZpbmUgRFJJVkVSX01JTk9SX1ZFUlNJT04gICAgMzQKKyNkZWZpbmUgRFJJVkVSX1NVQl9WRVJTSU9OICAgICAgIDAKKworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAgKChEUklWRVJfTUFKT1JfVkVSU0lPTiA8PCA4KSArIERSSVZFUl9NSU5PUl9WRVJTSU9OKQorCisjaW5jbHVkZSAibG1jLmgiCisjaW5jbHVkZSAibG1jX3Zhci5oIgorI2luY2x1ZGUgImxtY19pb2N0bC5oIgorI2luY2x1ZGUgImxtY19kZWJ1Zy5oIgorI2luY2x1ZGUgImxtY19wcm90by5oIgorCitzdGF0aWMgaW50IGxtY19maXJzdF9sb2FkID0gMDsKKworc3RhdGljIGludCBMTUNfUEtUX0JVRl9TWiA9IDE1NDI7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBsbWNfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9ERUMsIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX0ZBU1QsCisJICBQQ0lfVkVORE9SX0lEX0xNQywgUENJX0FOWV9JRCB9LAorCXsgUENJX1ZFTkRPUl9JRF9ERUMsIFBDSV9ERVZJQ0VfSURfREVDX1RVTElQX0ZBU1QsCisJICBQQ0lfQU5ZX0lELCBQQ0lfVkVORE9SX0lEX0xNQyB9LAorCXsgMCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbG1jX3BjaV90YmwpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKK3N0YXRpYyBpbnQgbG1jX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGxtY19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBsbWNfcnggKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBsbWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgbG1jX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpsbWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IGxtY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBsbWNfaW5pdGNzcnMobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgbG1jX2NzcnB0cl90IGNzcl9iYXNlLCBzaXplX3QgY3NyX3NpemUpOworc3RhdGljIHZvaWQgbG1jX3NvZnRyZXNldChsbWNfc29mdGNfdCAqIGNvbnN0KTsKK3N0YXRpYyB2b2lkIGxtY19ydW5uaW5nX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBsbWNfaWZkb3duKHN0cnVjdCBuZXRfZGV2aWNlICogY29uc3QpOworc3RhdGljIHZvaWQgbG1jX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBsbWNfcmVzZXQobG1jX3NvZnRjX3QgKiBjb25zdCBzYyk7CitzdGF0aWMgdm9pZCBsbWNfZGVjX3Jlc2V0KGxtY19zb2Z0Y190ICogY29uc3Qgc2MpOworc3RhdGljIHZvaWQgbG1jX2RyaXZlcl90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKgorICogbGludXggcmVzZXJ2ZXMgMTYgZGV2aWNlIHNwZWNpZmljIElPQ1RMcy4gIFdlIGNhbGwgdGhlbQorICogTE1DSU9DKiB0byBjb250cm9sIHZhcmlvdXMgYml0cyBvZiBvdXIgd29ybGQuCisgKi8KK2ludCBsbWNfaW9jdGwgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKSAvKmZvbGQwMCovCit7CisgICAgbG1jX3NvZnRjX3QgKnNjOworICAgIGxtY19jdGxfdCBjdGw7CisgICAgaW50IHJldDsKKyAgICB1X2ludDE2X3QgcmVnVmFsOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBzdHJ1Y3Qgc3BwcCAqc3A7CisKKyAgICByZXQgPSAtRU9QTk9UU1VQUDsKKworICAgIHNjID0gZGV2LT5wcml2OworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19pb2N0bCBpbiIpOworCisgICAgLyoKKyAgICAgKiBNb3N0IGZ1bmN0aW9ucyBtZXNzIHdpdGggdGhlIHN0cnVjdHVyZQorICAgICAqIERpc2FibGUgaW50ZXJydXB0cyB3aGlsZSB3ZSBkbyB0aGUgcG9sbGluZworICAgICAqLworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzYy0+bG1jX2xvY2ssIGZsYWdzKTsKKworICAgIHN3aXRjaCAoY21kKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFJldHVybiBjdXJyZW50IGRyaXZlciBzdGF0ZS4gIFNpbmNlIHdlIGtlZXAgdGhpcyB1cAorICAgICAgICAgKiBUbyBkYXRlIGludGVybmFsbHksIGp1c3QgY29weSB0aGlzIG91dCB0byB0aGUgdXNlci4KKyAgICAgICAgICovCisgICAgY2FzZSBMTUNJT0NHSU5GTzogLypmb2xkMDEqLworICAgICAgICBpZiAoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsICZzYy0+aWN0bCwgc2l6ZW9mIChsbWNfY3RsX3QpKSkKKyAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICByZXQgPSAwOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgTE1DSU9DU0lORk86IC8qZm9sZDAxKi8KKyAgICAgICAgc3AgPSAmKChzdHJ1Y3QgcHBwX2RldmljZSAqKSBkZXYpLT5zcHBwOworICAgICAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKyAgICAgICAgICAgIHJldCA9IC1FUEVSTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYoZGV2LT5mbGFncyAmIElGRl9VUCl7CisgICAgICAgICAgICByZXQgPSAtRUJVU1k7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmY3RsLCBpZnItPmlmcl9kYXRhLCBzaXplb2YgKGxtY19jdGxfdCkpKQorICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgICAgc2MtPmxtY19tZWRpYS0+c2V0X3N0YXR1cyAoc2MsICZjdGwpOworCisgICAgICAgIGlmKGN0bC5jcmNfbGVuZ3RoICE9IHNjLT5pY3RsLmNyY19sZW5ndGgpIHsKKyAgICAgICAgICAgIHNjLT5sbWNfbWVkaWEtPnNldF9jcmNfbGVuZ3RoKHNjLCBjdGwuY3JjX2xlbmd0aCk7CisJICAgIGlmIChzYy0+aWN0bC5jcmNfbGVuZ3RoID09IExNQ19DVExfQ1JDX0xFTkdUSF8xNikKKwkJc2MtPlR4RGVzY3JpcHRDb250cm9sSW5pdCB8PSAgTE1DX1RERVNfQUREX0NSQ19ESVNBQkxFOworCSAgICBlbHNlCisJCXNjLT5UeERlc2NyaXB0Q29udHJvbEluaXQgJj0gfkxNQ19UREVTX0FERF9DUkNfRElTQUJMRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdGwua2VlcGFsaXZlX29ub2ZmID09IExNQ19DVExfT0ZGKQorICAgICAgICAgICAgc3AtPnBwX2ZsYWdzICY9IH5QUF9LRUVQQUxJVkU7CS8qIFR1cm4gb2ZmICovCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNwLT5wcF9mbGFncyB8PSBQUF9LRUVQQUxJVkU7CS8qIFR1cm4gb24gKi8KKworICAgICAgICByZXQgPSAwOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgTE1DSU9DSUZUWVBFOiAvKmZvbGQwMSovCisgICAgICAgIHsKKyAgICAgICAgICAgIHVfaW50MTZfdAlvbGRfdHlwZSA9IHNjLT5pZl90eXBlOworICAgICAgICAgICAgdV9pbnQxNl90CW5ld190eXBlOworCisJICAgIGlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQlyZXQgPSAtRVBFUk07CisJCWJyZWFrOworCSAgICB9CisKKwkgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfdHlwZSwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKHVfaW50MTZfdCkpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworCisgICAgICAgICAgICAKKwkgICAgaWYgKG5ld190eXBlID09IG9sZF90eXBlKQorCSAgICB7CisJCXJldCA9IDAgOworCQlicmVhazsJCQkJLyogbm8gY2hhbmdlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGxtY19wcm90b19jbG9zZShzYyk7CisgICAgICAgICAgICBsbWNfcHJvdG9fZGV0YWNoKHNjKTsKKworICAgICAgICAgICAgc2MtPmlmX3R5cGUgPSBuZXdfdHlwZTsKKy8vICAgICAgICAgICAgbG1jX3Byb3RvX2luaXQoc2MpOworICAgICAgICAgICAgbG1jX3Byb3RvX2F0dGFjaChzYyk7CisgICAgICAgICAgICBsbWNfcHJvdG9fb3BlbihzYyk7CisKKwkgICAgcmV0ID0gMCA7CisJICAgIGJyZWFrIDsKKwl9CisKKyAgICBjYXNlIExNQ0lPQ0dFVFhJTkZPOiAvKmZvbGQwMSovCisgICAgICAgIHNjLT5sbWNfeGluZm8uTWFnaWMwID0gMHhCRUVGQ0FGRTsKKworICAgICAgICBzYy0+bG1jX3hpbmZvLlBjaUNhcmRUeXBlID0gc2MtPmxtY19jYXJkdHlwZTsKKyAgICAgICAgc2MtPmxtY194aW5mby5QY2lTbG90TnVtYmVyID0gMDsKKyAgICAgICAgc2MtPmxtY194aW5mby5Ecml2ZXJNYWpvclZlcnNpb24gPSBEUklWRVJfTUFKT1JfVkVSU0lPTjsKKyAgICAgICAgc2MtPmxtY194aW5mby5Ecml2ZXJNaW5vclZlcnNpb24gPSBEUklWRVJfTUlOT1JfVkVSU0lPTjsKKyAgICAgICAgc2MtPmxtY194aW5mby5Ecml2ZXJTdWJWZXJzaW9uID0gRFJJVkVSX1NVQl9WRVJTSU9OOworICAgICAgICBzYy0+bG1jX3hpbmZvLlhpbGlueFJldmlzaW9uTnVtYmVyID0KKyAgICAgICAgICAgIGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDMpICYgMHhmOworICAgICAgICBzYy0+bG1jX3hpbmZvLk1heEZyYW1lU2l6ZSA9IExNQ19QS1RfQlVGX1NaOworICAgICAgICBzYy0+bG1jX3hpbmZvLmxpbmtfc3RhdHVzID0gc2MtPmxtY19tZWRpYS0+Z2V0X2xpbmtfc3RhdHVzIChzYyk7CisgICAgICAgIHNjLT5sbWNfeGluZm8ubWlpX3JlZzE2ID0gbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTYpOworCisgICAgICAgIHNjLT5sbWNfeGluZm8uTWFnaWMxID0gMHhERUFEQkVFRjsKKworICAgICAgICBpZiAoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsICZzYy0+bG1jX3hpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IGxtY194aW5mbykpKQorICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgIHJldCA9IDA7CisKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExNQ0lPQ0dFVExNQ1NUQVRTOiAvKmZvbGQwMSovCisgICAgICAgIGlmIChzYy0+bG1jX2NhcmR0eXBlID09IExNQ19DQVJEVFlQRV9UMSl7CisgICAgICAgICAgICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTcsIFQxRlJBTUVSX0ZFUlJfTFNCKTsKKyAgICAgICAgICAgIHNjLT5zdGF0cy5mcmFtaW5nQml0RXJyb3JDb3VudCArPQorICAgICAgICAgICAgICAgIGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE4KSAmIDB4ZmY7CisgICAgICAgICAgICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTcsIFQxRlJBTUVSX0ZFUlJfTVNCKTsKKyAgICAgICAgICAgIHNjLT5zdGF0cy5mcmFtaW5nQml0RXJyb3JDb3VudCArPQorICAgICAgICAgICAgICAgIChsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxOCkgJiAweGZmKSA8PCA4OworICAgICAgICAgICAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE3LCBUMUZSQU1FUl9MQ1ZfTFNCKTsKKyAgICAgICAgICAgIHNjLT5zdGF0cy5saW5lQ29kZVZpb2xhdGlvbkNvdW50ICs9CisgICAgICAgICAgICAgICAgbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTgpICYgMHhmZjsKKyAgICAgICAgICAgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNywgVDFGUkFNRVJfTENWX01TQik7CisgICAgICAgICAgICBzYy0+c3RhdHMubGluZUNvZGVWaW9sYXRpb25Db3VudCArPQorICAgICAgICAgICAgICAgIChsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxOCkgJiAweGZmKSA8PCA4OworICAgICAgICAgICAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE3LCBUMUZSQU1FUl9BRVJSKTsKKyAgICAgICAgICAgIHJlZ1ZhbCA9IGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE4KSAmIDB4ZmY7CisKKyAgICAgICAgICAgIHNjLT5zdGF0cy5sb3NzT2ZGcmFtZUNvdW50ICs9CisgICAgICAgICAgICAgICAgKHJlZ1ZhbCAmIFQxRlJBTUVSX0xPRl9NQVNLKSA+PiA0OworICAgICAgICAgICAgc2MtPnN0YXRzLmNoYW5nZU9mRnJhbWVBbGlnbm1lbnRDb3VudCArPQorICAgICAgICAgICAgICAgIChyZWdWYWwgJiBUMUZSQU1FUl9DT0ZBX01BU0spID4+IDI7CisgICAgICAgICAgICBzYy0+c3RhdHMuc2V2ZXJlbHlFcnJvcmVkRnJhbWVDb3VudCArPQorICAgICAgICAgICAgICAgIHJlZ1ZhbCAmIFQxRlJBTUVSX1NFRl9NQVNLOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhLCAmc2MtPnN0YXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IGxtY19zdGF0aXN0aWNzKSkpCisgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKworICAgICAgICByZXQgPSAwOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgTE1DSU9DQ0xFQVJMTUNTVEFUUzogLypmb2xkMDEqLworICAgICAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpeworICAgICAgICAgICAgcmV0ID0gLUVQRVJNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQgKCZzYy0+c3RhdHMsIDAsIHNpemVvZiAoc3RydWN0IGxtY19zdGF0aXN0aWNzKSk7CisgICAgICAgIHNjLT5zdGF0cy5jaGVjayA9IFNUQVRDSEVDSzsKKyAgICAgICAgc2MtPnN0YXRzLnZlcnNpb25fc2l6ZSA9IChEUklWRVJfVkVSU0lPTiA8PCAxNikgKworICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgbG1jX3N0YXRpc3RpY3MpOworICAgICAgICBzYy0+c3RhdHMubG1jX2NhcmR0eXBlID0gc2MtPmxtY19jYXJkdHlwZTsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExNQ0lPQ1NFVENJUkNVSVQ6IC8qZm9sZDAxKi8KKyAgICAgICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKXsKKyAgICAgICAgICAgIHJldCA9IC1FUEVSTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYoZGV2LT5mbGFncyAmIElGRl9VUCl7CisgICAgICAgICAgICByZXQgPSAtRUJVU1k7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmY3RsLCBpZnItPmlmcl9kYXRhLCBzaXplb2YgKGxtY19jdGxfdCkpKQorICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgIHNjLT5sbWNfbWVkaWEtPnNldF9jaXJjdWl0X3R5cGUoc2MsIGN0bC5jaXJjdWl0X3R5cGUpOworICAgICAgICBzYy0+aWN0bC5jaXJjdWl0X3R5cGUgPSBjdGwuY2lyY3VpdF90eXBlOworICAgICAgICByZXQgPSAwOworCisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBMTUNJT0NSRVNFVDogLypmb2xkMDEqLworICAgICAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpeworICAgICAgICAgICAgcmV0ID0gLUVQRVJNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBSZXNldCBkcml2ZXIgYW5kIGJyaW5nIGJhY2sgdG8gY3VycmVudCBzdGF0ZSAqLworICAgICAgICBwcmludGsgKCIgUkVHMTYgYmVmb3JlIHJlc2V0ICslMDR4XG4iLCBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNikpOworICAgICAgICBsbWNfcnVubmluZ19yZXNldCAoZGV2KTsKKyAgICAgICAgcHJpbnRrICgiIFJFRzE2IGFmdGVyIHJlc2V0ICslMDR4XG4iLCBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNikpOworCisgICAgICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX0ZPUkNFRFJFU0VULCBMTUNfQ1NSX1JFQUQgKHNjLCBjc3Jfc3RhdHVzKSwgbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTYpKTsKKworICAgICAgICByZXQgPSAwOworICAgICAgICBicmVhazsKKworI2lmZGVmIERFQlVHCisgICAgY2FzZSBMTUNJT0NEVU1QRVZFTlRMT0c6CisgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgJmxtY0V2ZW50TG9nSW5kZXgsIHNpemVvZiAodTMyKSkpCisgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9kYXRhICsgc2l6ZW9mICh1MzIpLCBsbWNFdmVudExvZ0J1Ziwgc2l6ZW9mIChsbWNFdmVudExvZ0J1ZikpKQorICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogZW5kIGlmZGVmIF9EQkdfRVZFTlRMT0cgKi8KKyAgICBjYXNlIExNQ0lPQ1QxQ09OVFJPTDogLypmb2xkMDEqLworICAgICAgICBpZiAoc2MtPmxtY19jYXJkdHlwZSAhPSBMTUNfQ0FSRFRZUEVfVDEpeworICAgICAgICAgICAgcmV0ID0gLUVPUE5PVFNVUFA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIExNQ0lPQ1hJTElOWDogLypmb2xkMDEqLworICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3QgbG1jX3hpbGlueF9jb250cm9sIHhjOyAvKmZvbGQwMiovCisKKyAgICAgICAgICAgIGlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSl7CisgICAgICAgICAgICAgICAgcmV0ID0gLUVQRVJNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU3RvcCB0aGUgeHdpdHRlciB3aGxpZSB3ZSByZXN0YXJ0IHRoZSBoYXJkd2FyZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmeGMsIGlmci0+aWZyX2RhdGEsIHNpemVvZiAoc3RydWN0IGxtY194aWxpbnhfY29udHJvbCkpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgc3dpdGNoKHhjLmNvbW1hbmQpeworICAgICAgICAgICAgY2FzZSBsbWNfeGlsaW54X3Jlc2V0OiAvKmZvbGQwMiovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1MTYgbWlpOworICAgICAgICAgICAgICAgICAgICBtaWkgPSBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNik7CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogTWFrZSBhbGwgb2YgdGhlbSAwIGFuZCBtYWtlIGlucHV0CisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBsbWNfZ3Bpb19ta2lucHV0KHNjLCAweGZmKTsKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBtYWtlIHRoZSByZXNldCBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGxtY19ncGlvX21rb3V0cHV0KHNjLCBMTUNfR0VQX1JFU0VUKTsKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBSRVNFVCBsb3cgdG8gZm9yY2UgY29uZmlndXJhdGlvbi4gIFRoaXMgYWxzbyBmb3JjZXMKKyAgICAgICAgICAgICAgICAgICAgICogdGhlIHRyYW5zbWl0dGVyIGNsb2NrIHRvIGJlIGludGVybmFsLCBidXQgd2UgZXhwZWN0IHRvIHJlc2V0CisgICAgICAgICAgICAgICAgICAgICAqIHRoYXQgbGF0ZXIgYW55d2F5LgorICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgICAgICBzYy0+bG1jX2dwaW8gJj0gfkxNQ19HRVBfUkVTRVQ7CisgICAgICAgICAgICAgICAgICAgIExNQ19DU1JfV1JJVEUoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKKworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIGhvbGQgZm9yIG1vcmUgdGhhbiAxMCBtaWNyb3NlY29uZHMKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHVkZWxheSg1MCk7CisKKyAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19ncGlvIHw9IExNQ19HRVBfUkVTRVQ7CisgICAgICAgICAgICAgICAgICAgIExNQ19DU1JfV1JJVEUoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKKworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIHN0b3AgZHJpdmluZyBYaWxpbngtcmVsYXRlZCBzaWduYWxzCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBsbWNfZ3Bpb19ta2lucHV0KHNjLCAweGZmKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBSZXNldCB0aGUgZnJhbW1lciBoYXJkd2FyZSAqLworICAgICAgICAgICAgICAgICAgICBzYy0+bG1jX21lZGlhLT5zZXRfbGlua19zdGF0dXMgKHNjLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19tZWRpYS0+c2V0X3N0YXR1cyAoc2MsIE5VTEwpOworLy8gICAgICAgICAgICAgICAgICAgIGxtY19zb2Z0cmVzZXQoc2MpOworCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgNTsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kZWxheSgxMDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxtY19sZWRfb2ZmKHNjLCBMTUNfRFMzX0xFRDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxtY19sZWRfb24oc2MsIExNQ19EUzNfTEVEMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWRlbGF5KDEwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG1jX2xlZF9vZmYoc2MsIExNQ19EUzNfTEVEMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG1jX2xlZF9vbihzYywgTE1DX0RTM19MRUQzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZGVsYXkoMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbWNfbGVkX29mZihzYywgTE1DX0RTM19MRUQzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kZWxheSgxMDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxtY19sZWRfb2ZmKHNjLCBMTUNfRFMzX0xFRDIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgICAgICByZXQgPSAweDA7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgbG1jX3hpbGlueF9sb2FkX3Byb206IC8qZm9sZDAyKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHUxNiBtaWk7CisgICAgICAgICAgICAgICAgICAgIGludCB0aW1lb3V0ID0gNTAwMDAwOworICAgICAgICAgICAgICAgICAgICBtaWkgPSBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNik7CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogTWFrZSBhbGwgb2YgdGhlbSAwIGFuZCBtYWtlIGlucHV0CisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBsbWNfZ3Bpb19ta2lucHV0KHNjLCAweGZmKTsKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBtYWtlIHRoZSByZXNldCBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGxtY19ncGlvX21rb3V0cHV0KHNjLCAgTE1DX0dFUF9EUCB8IExNQ19HRVBfUkVTRVQpOworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIFJFU0VUIGxvdyB0byBmb3JjZSBjb25maWd1cmF0aW9uLiAgVGhpcyBhbHNvIGZvcmNlcworICAgICAgICAgICAgICAgICAgICAgKiB0aGUgdHJhbnNtaXR0ZXIgY2xvY2sgdG8gYmUgaW50ZXJuYWwsIGJ1dCB3ZSBleHBlY3QgdG8gcmVzZXQKKyAgICAgICAgICAgICAgICAgICAgICogdGhhdCBsYXRlciBhbnl3YXkuCisgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyAmPSB+KExNQ19HRVBfUkVTRVQgfCBMTUNfR0VQX0RQKTsKKyAgICAgICAgICAgICAgICAgICAgTE1DX0NTUl9XUklURShzYywgY3NyX2dwLCBzYy0+bG1jX2dwaW8pOworCisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogaG9sZCBmb3IgbW9yZSB0aGFuIDEwIG1pY3Jvc2Vjb25kcworICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgdWRlbGF5KDUwKTsKKworICAgICAgICAgICAgICAgICAgICBzYy0+bG1jX2dwaW8gfD0gTE1DX0dFUF9EUCB8IExNQ19HRVBfUkVTRVQ7CisgICAgICAgICAgICAgICAgICAgIExNQ19DU1JfV1JJVEUoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBidXN5IHdhaXQgZm9yIHRoZSBjaGlwIHRvIHJlc2V0CisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICB3aGlsZSggKExNQ19DU1JfUkVBRChzYywgY3NyX2dwKSAmIExNQ19HRVBfSU5JVCkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpbWVvdXQtLSA+IDApKQorICAgICAgICAgICAgICAgICAgICAgICAgOworCisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogc3RvcCBkcml2aW5nIFhpbGlueC1yZWxhdGVkIHNpZ25hbHMKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGxtY19ncGlvX21raW5wdXQoc2MsIDB4ZmYpOworCisgICAgICAgICAgICAgICAgICAgIHJldCA9IDB4MDsKKyAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgbG1jX3hpbGlueF9sb2FkOiAvKmZvbGQwMiovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFyICpkYXRhOworICAgICAgICAgICAgICAgICAgICBpbnQgcG9zOworICAgICAgICAgICAgICAgICAgICBpbnQgdGltZW91dCA9IDUwMDAwMDsKKworICAgICAgICAgICAgICAgICAgICBpZih4Yy5kYXRhID09IDB4MCl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBrbWFsbG9jKHhjLmxlbiwgR0ZQX0tFUk5FTCk7CisgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEgPT0gMHgwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgY29weVxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcihkYXRhLCB4Yy5kYXRhLCB4Yy5sZW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIAlrZnJlZShkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgCXJldCA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgICAgIAlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHByaW50aygiJXM6IFN0YXJ0aW5nIGxvYWQgb2YgZGF0YSBMZW46ICVkIGF0IDB4JXAgPT0gMHglcFxuIiwgZGV2LT5uYW1lLCB4Yy5sZW4sIHhjLmRhdGEsIGRhdGEpOworCisgICAgICAgICAgICAgICAgICAgIGxtY19ncGlvX21raW5wdXQoc2MsIDB4ZmYpOworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIENsZWFyIHRoZSBYaWxpbnggYW5kIHN0YXJ0IHByZ3JhbW1pbmcgZnJvbSB0aGUgREVDCisgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIFNldCBvdXB1dCBhczoKKyAgICAgICAgICAgICAgICAgICAgICogUmVzZXQ6IDAgKGFjdGl2ZSkKKyAgICAgICAgICAgICAgICAgICAgICogRFA6ICAgIDAgKGFjdGl2ZSkKKyAgICAgICAgICAgICAgICAgICAgICogTW9kZTogIDEKKyAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyAmPSB+TE1DX0dFUF9EUDsKKyAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19ncGlvICY9IH5MTUNfR0VQX1JFU0VUOworICAgICAgICAgICAgICAgICAgICBzYy0+bG1jX2dwaW8gfD0gIExNQ19HRVBfTU9ERTsKKyAgICAgICAgICAgICAgICAgICAgTE1DX0NTUl9XUklURShzYywgY3NyX2dwLCBzYy0+bG1jX2dwaW8pOworCisgICAgICAgICAgICAgICAgICAgIGxtY19ncGlvX21rb3V0cHV0KHNjLCBMTUNfR0VQX01PREUgfCBMTUNfR0VQX0RQIHwgTE1DX0dFUF9SRVNFVCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogV2FpdCBhdCBsZWFzdCAxMCB1cyAyMCB0byBiZSBzYWZlCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICB1ZGVsYXkoNTApOworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIENsZWFyIHJlc2V0IGFuZCBhY3RpdmF0ZSBwcm9ncmFtbWluZyBsaW5lcworICAgICAgICAgICAgICAgICAgICAgKiBSZXNldDogSW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICogRFA6ICAgIElucHV0CisgICAgICAgICAgICAgICAgICAgICAqIENsb2NrOiBPdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICogRGF0YTogIE91dHB1dAorICAgICAgICAgICAgICAgICAgICAgKiBNb2RlOiAgT3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBsbWNfZ3Bpb19ta2lucHV0KHNjLCBMTUNfR0VQX0RQIHwgTE1DX0dFUF9SRVNFVCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogU2V0IExPQUQsIERBVEEsIENsb2NrIHRvIDEKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX01PREU7CisgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX0RBVEE7CisgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX0NMSzsKKyAgICAgICAgICAgICAgICAgICAgTE1DX0NTUl9XUklURShzYywgY3NyX2dwLCBzYy0+bG1jX2dwaW8pOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgbG1jX2dwaW9fbWtvdXRwdXQoc2MsIExNQ19HRVBfREFUQSB8IExNQ19HRVBfQ0xLIHwgTE1DX0dFUF9NT0RFICk7CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogYnVzeSB3YWl0IGZvciB0aGUgY2hpcCB0byByZXNldAorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoIChMTUNfQ1NSX1JFQUQoc2MsIGNzcl9ncCkgJiBMTUNfR0VQX0lOSVQpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aW1lb3V0LS0gPiAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDsKKworICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IFdhaXRlZCAlZCBmb3IgdGhlIFhpbGlueCB0byBjbGVhciBpdCdzIG1lbW9yeVxuIiwgZGV2LT5uYW1lLCA1MDAwMDAtdGltZW91dCk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKHBvcyA9IDA7IHBvcyA8IHhjLmxlbjsgcG9zKyspeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGRhdGFbcG9zXSl7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19ncGlvICY9IH5MTUNfR0VQX0RBVEE7IC8qIERhdGEgaXMgMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX0RBVEE7IC8qIERhdGEgaXMgMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlcyBCYWQgZGF0YSBpbiB4aWxpbnggcHJvZ3JhbW1pbmcgZGF0YSBhdCAlZCwgZ290ICVkIHdhbnRlZCAwIG9yIDFcbiIsIGRldi0+bmFtZSwgcG9zLCBkYXRhW3Bvc10pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX0RBVEE7IC8qIEFzc3VtZSBpdCdzIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyAmPSB+TE1DX0dFUF9DTEs7IC8qIENsb2NrIHRvIHplcm8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX01PREU7CisgICAgICAgICAgICAgICAgICAgICAgICBMTUNfQ1NSX1dSSVRFKHNjLCBjc3JfZ3AsIHNjLT5sbWNfZ3Bpbyk7CisgICAgICAgICAgICAgICAgICAgICAgICB1ZGVsYXkoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX0NMSzsgLyogUHV0IHRoZSBjbGFjayBiYWNrIHRvIG9uZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19ncGlvIHw9IExNQ19HRVBfTU9ERTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExNQ19DU1JfV1JJVEUoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVkZWxheSgxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZigoTE1DX0NTUl9SRUFEKHNjLCBjc3JfZ3ApICYgTE1DX0dFUF9JTklUKSA9PSAwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZXByb2dyYW1taW5nIEZBSUxFRC4gTmVlZHMgdG8gYmUgcmVwcm9ncmFtbWVkLiAoY29ycnVwdGVkIGRhdGEpXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoKExNQ19DU1JfUkVBRChzYywgY3NyX2dwKSAmIExNQ19HRVBfRFApID09IDApeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlcHJvZ3JhbW1pbmcgRkFJTEVELiBOZWVkcyB0byBiZSByZXByb2dyYW1tZWQuIChkb25lKVxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogRG9uZSByZXByb2dyYW1taW5nIFhpbGlueCwgJWQgYml0cywgZ29vZCBsdWNrIVxuIiwgZGV2LT5uYW1lLCBwb3MpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbG1jX2dwaW9fbWtpbnB1dChzYywgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBzYy0+bG1jX21paXJlZzE2IHw9IExNQ19NSUkxNl9GSUZPX1JFU0VUOworICAgICAgICAgICAgICAgICAgICBsbWNfbWlpX3dyaXRlcmVnKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7CisKKyAgICAgICAgICAgICAgICAgICAgc2MtPmxtY19taWlyZWcxNiAmPSB+TE1DX01JSTE2X0ZJRk9fUkVTRVQ7CisgICAgICAgICAgICAgICAgICAgIGxtY19taWlfd3JpdGVyZWcoc2MsIDAsIDE2LCBzYy0+bG1jX21paXJlZzE2KTsKKworICAgICAgICAgICAgICAgICAgICBrZnJlZShkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OiAvKmZvbGQwMiovCisgICAgICAgICAgICAgICAgcmV0ID0gLUVCQURFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisgICAgICAgICAgICBzYy0+bG1jX3R4ZnVsbCA9IDA7CisKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAvKmZvbGQwMSovCisgICAgICAgIC8qIElmIHdlIGRvbid0IGtub3cgd2hhdCB0byBkbywgZ2l2ZSB0aGUgcHJvdG9jb2wgYSBzaG90LiAqLworICAgICAgICByZXQgPSBsbWNfcHJvdG9faW9jdGwgKHNjLCBpZnIsIGNtZCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjLT5sbWNfbG9jaywgZmxhZ3MpOyAvKmZvbGQwMSovCisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX2lvY3RsIG91dCIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworCisvKiB0aGUgd2F0Y2hkb2cgcHJvY2VzcyB0aGF0IGNydWlzZXMgYXJvdW5kICovCitzdGF0aWMgdm9pZCBsbWNfd2F0Y2hkb2cgKHVuc2lnbmVkIGxvbmcgZGF0YSkgLypmb2xkMDAqLworeworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKKyAgICBsbWNfc29mdGNfdCAqc2M7CisgICAgaW50IGxpbmtfc3RhdHVzOworICAgIHVfaW50MzJfdCB0aWNrczsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgc2MgPSBkZXYtPnByaXY7CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX3dhdGNoZG9nIGluIik7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmc2MtPmxtY19sb2NrLCBmbGFncyk7CisKKyAgICBpZihzYy0+Y2hlY2sgIT0gMHhCRUFGQ0FGRSl7CisgICAgICAgIHByaW50aygiTE1DOiBDb3JydXB0IG5ldF9kZXZpY2Ugc3R1Y3QsIGJyZWFraW5nIG91dFxuIik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2MtPmxtY19sb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIC8qIE1ha2Ugc3VyZSB0aGUgdHggamFiYmVyIGFuZCByeCB3YXRjaGRvZyBhcmUgb2ZmLAorICAgICAqIGFuZCB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgcHJvY2Vzc2VzIGFyZSBydW5uaW5nLgorICAgICAqLworCisgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl8xNSwgMHgwMDAwMDAxMSk7CisgICAgc2MtPmxtY19jbWRtb2RlIHw9IFRVTElQX0NNRF9UWFJVTiB8IFRVTElQX0NNRF9SWFJVTjsKKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2NvbW1hbmQsIHNjLT5sbWNfY21kbW9kZSk7CisKKyAgICBpZiAoc2MtPmxtY19vayA9PSAwKQorICAgICAgICBnb3RvIGtpY2tfdGltZXI7CisKKyAgICBMTUNfRVZFTlRfTE9HKExNQ19FVkVOVF9XQVRDSERPRywgTE1DX0NTUl9SRUFEIChzYywgY3NyX3N0YXR1cyksIGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE2KSk7CisKKyAgICAvKiAtLS0gYmVnaW4gdGltZSBvdXQgY2hlY2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBjaGVjayBmb3IgYSB0cmFuc21pdCBpbnRlcnJ1cHQgdGltZW91dAorICAgICAqIEhhcyB0aGUgcGFja2V0IHhtdCB2cyB4bXQgc2VydmljZWQgdGhyZXNob2xkIGJlZW4gZXhjZWVkZWQgKi8KKyAgICBpZiAoc2MtPmxtY190YWludF90eCA9PSBzYy0+bGFzdGxtY190YWludF90eCAmJgorICAgICAgICBzYy0+c3RhdHMudHhfcGFja2V0cyA+IHNjLT5sYXN0dHhfcGFja2V0cyAmJgorICAgICAgICBzYy0+dHhfVGltZW91dEluZCA9PSAwKQorICAgIHsKKworICAgICAgICAvKiB3YWl0IGZvciB0aGUgd2F0Y2hkb2cgdG8gY29tZSBhcm91bmQgYWdhaW4gKi8KKyAgICAgICAgc2MtPnR4X1RpbWVvdXRJbmQgPSAxOworICAgIH0KKyAgICBlbHNlIGlmIChzYy0+bG1jX3RhaW50X3R4ID09IHNjLT5sYXN0bG1jX3RhaW50X3R4ICYmCisgICAgICAgICAgICAgc2MtPnN0YXRzLnR4X3BhY2tldHMgPiBzYy0+bGFzdHR4X3BhY2tldHMgJiYKKyAgICAgICAgICAgICBzYy0+dHhfVGltZW91dEluZCkKKyAgICB7CisKKyAgICAgICAgTE1DX0VWRU5UX0xPRyhMTUNfRVZFTlRfWE1USU5UVE1PLCBMTUNfQ1NSX1JFQUQgKHNjLCBjc3Jfc3RhdHVzKSwgMCk7CisKKyAgICAgICAgc2MtPnR4X1RpbWVvdXREaXNwbGF5ID0gMTsKKyAgICAgICAgc2MtPnN0YXRzLnR4X1RpbWVvdXRDbnQrKzsKKworICAgICAgICAvKiBERUMgY2hpcCBpcyBzdHVjaywgaGl0IGl0IHdpdGggYSBSRVNFVCEhISEgKi8KKyAgICAgICAgbG1jX3J1bm5pbmdfcmVzZXQgKGRldik7CisKKworICAgICAgICAvKiBsb29rIGF0IHJlY2VpdmUgJiB0cmFuc21pdCBwcm9jZXNzIHN0YXRlIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBydW5uaW5nICovCisgICAgICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX1JFU0VUMSwgTE1DX0NTUl9SRUFEIChzYywgY3NyX3N0YXR1cyksIDApOworCisgICAgICAgIC8qIGxvb2sgYXQ6IERTUiAtIDAyICBmb3IgUmVnIDE2CisgICAgICAgICAqICAgICAgICAgICAgICAgICAgQ1RTIC0gMDgKKyAgICAgICAgICogICAgICAgICAgICAgICAgICBEQ0QgLSAxMAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgIFJJICAtIDIwCisgICAgICAgICAqIGZvciBSZWcgMTcKKyAgICAgICAgICovCisgICAgICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX1JFU0VUMiwgbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTYpLCBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNykpOworCisgICAgICAgIC8qIHJlc2V0IHRoZSB0cmFuc21pdCB0aW1lb3V0IGRldGVjdGlvbiBmbGFnICovCisgICAgICAgIHNjLT50eF9UaW1lb3V0SW5kID0gMDsKKyAgICAgICAgc2MtPmxhc3RsbWNfdGFpbnRfdHggPSBzYy0+bG1jX3RhaW50X3R4OworICAgICAgICBzYy0+bGFzdHR4X3BhY2tldHMgPSBzYy0+c3RhdHMudHhfcGFja2V0czsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc2MtPnR4X1RpbWVvdXRJbmQgPSAwOworICAgICAgICBzYy0+bGFzdGxtY190YWludF90eCA9IHNjLT5sbWNfdGFpbnRfdHg7CisgICAgICAgIHNjLT5sYXN0dHhfcGFja2V0cyA9IHNjLT5zdGF0cy50eF9wYWNrZXRzOworICAgIH0KKworICAgIC8qIC0tLSBlbmQgdGltZSBvdXQgY2hlY2sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisgICAgbGlua19zdGF0dXMgPSBzYy0+bG1jX21lZGlhLT5nZXRfbGlua19zdGF0dXMgKHNjKTsKKworICAgIC8qCisgICAgICogaGFyZHdhcmUgbGV2ZWwgbGluayBsb3N0LCBidXQgdGhlIGludGVyZmFjZSBpcyBtYXJrZWQgYXMgdXAuCisgICAgICogTWFyayBpdCBhcyBkb3duLgorICAgICAqLworICAgIGlmICgobGlua19zdGF0dXMgPT0gMCkgJiYgKHNjLT5sYXN0X2xpbmtfc3RhdHVzICE9IDApKSB7CisgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBoYXJkd2FyZS9waHlzaWNhbCBsaW5rIGRvd25cbiIsIGRldi0+bmFtZSk7CisgICAgICAgIHNjLT5sYXN0X2xpbmtfc3RhdHVzID0gMDsKKyAgICAgICAgLyogbG1jX3Jlc2V0IChzYyk7IFdoeSByZXNldD8/PyBUaGUgbGluayBjYW4gZ28gZG93biBvayAqLworCisgICAgICAgIC8qIEluZm9ybSB0aGUgd29ybGQgdGhhdCBsaW5rIGhhcyBiZWVuIGxvc3QgKi8KKyAgICAgICAgZGV2LT5mbGFncyAmPSB+SUZGX1JVTk5JTkc7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBoYXJkd2FyZSBsaW5rIGlzIHVwLCBidXQgdGhlIGludGVyZmFjZSBpcyBtYXJrZWQgYXMgZG93bi4KKyAgICAgKiBCcmluZyBpdCBiYWNrIHVwIGFnYWluLgorICAgICAqLworICAgICBpZiAobGlua19zdGF0dXMgIT0gMCAmJiBzYy0+bGFzdF9saW5rX3N0YXR1cyA9PSAwKSB7CisgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogaGFyZHdhcmUvcGh5c2ljYWwgbGluayB1cFxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgIHNjLT5sYXN0X2xpbmtfc3RhdHVzID0gMTsKKyAgICAgICAgIC8qIGxtY19yZXNldCAoc2MpOyBBZ2FpbiB3aHkgcmVzZXQ/Pz8gKi8KKworICAgICAgICAgLyogSW5mb3JtIHRoZSB3b3JsZCB0aGF0IGxpbmsgcHJvdG9jb2wgaXMgYmFjayB1cC4gKi8KKyAgICAgICAgIGRldi0+ZmxhZ3MgfD0gSUZGX1JVTk5JTkc7CisKKyAgICAgICAgIC8qIE5vdyB3ZSBoYXZlIHRvIHRlbGwgdGhlIHN5bmNwcHAgdGhhdCB3ZSBoYWQgYW4gb3V0YWdlCisgICAgICAgICAgKiBhbmQgdGhhdCBpdCBzaG91bGQgZGVhbC4gIENhbGxpbmcgc3BwcF9yZW9wZW4gaGVyZQorICAgICAgICAgICogc2hvdWxkIGRvIHRoZSB0cmljaywgYnV0IHdlIG1heSBoYXZlIHRvIGNhbGwgc3BwcF9jbG9zZQorICAgICAgICAgICogd2hlbiB0aGUgbGluayBnb2VzIGRvd24sIGFuZCBjYWxsIHNwcHBfb3BlbiBoZXJlLgorICAgICAgICAgICogU3ViamVjdCB0byBtb3JlIHRlc3RpbmcuCisgICAgICAgICAgKiAtLWJicmF1bgorICAgICAgICAgICovCisKKyAgICAgICAgIGxtY19wcm90b19yZW9wZW4oc2MpOworCisgICAgIH0KKworICAgIC8qIENhbGwgbWVkaWEgc3BlY2lmaWMgd2F0Y2hkb2cgZnVuY3Rpb25zICovCisgICAgc2MtPmxtY19tZWRpYS0+d2F0Y2hkb2coc2MpOworCisgICAgLyoKKyAgICAgKiBQb2tlIHRoZSB0cmFuc21pdHRlciB0byBtYWtlIHN1cmUgaXQKKyAgICAgKiBuZXZlciBzdG9wcywgZXZlbiBpZiB3ZSBydW4gb3V0IG9mIG1lbQorICAgICAqLworICAgIExNQ19DU1JfV1JJVEUoc2MsIGNzcl9yeHBvbGwsIDApOworCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgY29kZSB0aGF0IGZhaWxlZAorICAgICAqIGFuZCB0cnkgYW5kIGZpeCBpdCBhcyBhcHByb3ByaWF0ZQorICAgICAqLworICAgIGlmKHNjLT5mYWlsZWRfcmluZyA9PSAxKXsKKyAgICAgICAgLyoKKyAgICAgICAgICogRmFpbGVkIHRvIHNldHVwIHRoZSByZWN2L3htaXQgcmluCisgICAgICAgICAqIFRyeSBhZ2FpbgorICAgICAgICAgKi8KKyAgICAgICAgc2MtPmZhaWxlZF9yaW5nID0gMDsKKyAgICAgICAgbG1jX3NvZnRyZXNldChzYyk7CisgICAgfQorICAgIGlmKHNjLT5mYWlsZWRfcmVjdl9hbGxvYyA9PSAxKXsKKyAgICAgICAgLyoKKyAgICAgICAgICogV2UgZmFpbGVkIHRvIGFsbG9jIG1lbSBpbiB0aGUKKyAgICAgICAgICogaW50ZXJydXB0IGhhbmRsZXIsIGdvIHRocm91Z2ggdGhlIHJpbmdzCisgICAgICAgICAqIGFuZCByZWJ1aWxkIHRoZW0KKyAgICAgICAgICovCisgICAgICAgIHNjLT5mYWlsZWRfcmVjdl9hbGxvYyA9IDA7CisgICAgICAgIGxtY19zb2Z0cmVzZXQoc2MpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiByZW1lbWJlciB0aGUgdGltZXIgdmFsdWUKKyAgICAgKi8KK2tpY2tfdGltZXI6CisKKyAgICB0aWNrcyA9IExNQ19DU1JfUkVBRCAoc2MsIGNzcl9ncF90aW1lcik7CisgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9ncF90aW1lciwgMHhmZmZmZmZmZlVMKTsKKyAgICBzYy0+aWN0bC50aWNrcyA9IDB4MDAwMGZmZmYgLSAodGlja3MgJiAweDAwMDBmZmZmKTsKKworICAgIC8qCisgICAgICogcmVzdGFydCB0aGlzIHRpbWVyLgorICAgICAqLworICAgIHNjLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIChIWik7CisgICAgYWRkX3RpbWVyICgmc2MtPnRpbWVyKTsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjLT5sbWNfbG9jaywgZmxhZ3MpOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY193YXRjaGRvZyBvdXQiKTsKKworfQorCitzdGF0aWMgdm9pZCBsbWNfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKiBjb25zdCBkZXYpIC8qZm9sZDAwKi8KK3sKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX3NldHVwIGluIik7CisKKyAgICBkZXYtPnR5cGUgPSBBUlBIUkRfSERMQzsKKyAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGxtY19zdGFydF94bWl0OworICAgIGRldi0+b3BlbiA9IGxtY19vcGVuOworICAgIGRldi0+c3RvcCA9IGxtY19jbG9zZTsKKyAgICBkZXYtPmdldF9zdGF0cyA9IGxtY19nZXRfc3RhdHM7CisgICAgZGV2LT5kb19pb2N0bCA9IGxtY19pb2N0bDsKKyAgICBkZXYtPnR4X3RpbWVvdXQgPSBsbWNfZHJpdmVyX3RpbWVvdXQ7CisgICAgZGV2LT53YXRjaGRvZ190aW1lbyA9IChIWik7IC8qIDEgc2Vjb25kICovCisgICAgCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19zZXR1cCBvdXQiKTsKK30KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBsbWNfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgbG1jX3NvZnRjX3QgKnNjOworICAgIHUxNiBzdWJkZXZpY2U7CisgICAgdV9pbnQxNl90IEFkYXBNb2RlbE51bTsKKyAgICBpbnQgZXJyID0gLUVOT01FTTsKKyAgICBzdGF0aWMgaW50IGNhcmRzX2ZvdW5kOworI2lmbmRlZiBHQ09NCisgICAgLyogV2UgbmFtZSBieSB0eXBlIG5vdCBieSB2ZW5kb3IgKi8KKyAgICBzdGF0aWMgY29uc3QgY2hhciBsbWNuYW1lW10gPSAiaGRsYyVkIjsKKyNlbHNlCisgICAgLyogCisgICAgICogR0NPTSB1c2VzIExNQyB2ZW5kb3IgbmFtZSBzbyB0aGF0IGNsaWVudHMgY2FuIGtub3cgd2hpY2ggY2FyZAorICAgICAqIHRvIGF0dGFjaCB0by4KKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgY2hhciBsbWNuYW1lW10gPSAibG1jJWQiOworI2VuZGlmCisKKworICAgIC8qCisgICAgICogQWxsb2NhdGUgb3VyIG93biBkZXZpY2Ugc3RydWN0dXJlCisgICAgICovCisgICAgZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihsbWNfc29mdGNfdCksIGxtY25hbWUsIGxtY19zZXR1cCk7CisgICAgaWYgKCFkZXYpIHsKKyAgICAgICAgcHJpbnRrIChLRVJOX0VSUiAibG1jOmFsbG9jX25ldGRldiBmb3IgZGV2aWNlIGZhaWxlZFxuIik7CisJZ290byBvdXQxOworICAgIH0KKyAKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX2luaXRfb25lIGluIik7CisKKyAgICBlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKyAgICBpZiAoZXJyKSB7CisJICAgIHByaW50ayhLRVJOX0VSUiAibG1jOiBwY2kgZW5hYmxlIGZhaWxlZDolZFxuIiwgZXJyKTsKKwkgICAgZ290byBvdXQyOworICAgIH0KKyAgICAKKyAgICBpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAibG1jIikpIHsKKwkgICAgcHJpbnRrKEtFUk5fRVJSICJsbWM6IHBjaV9yZXF1ZXN0X3JlZ2lvbiBmYWlsZWRcbiIpOworCSAgICBlcnIgPSAtRUlPOworCSAgICBnb3RvIG91dDM7CisgICAgfQorCisgICAgcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKyAgICBpZihsbWNfZmlyc3RfbG9hZCA9PSAwKXsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiTGFuIE1lZGlhIENvcnBvcmF0aW9uIFdBTiBEcml2ZXIgVmVyc2lvbiAlZC4lZC4lZFxuIiwKKwkgICAgICAgRFJJVkVSX01BSk9SX1ZFUlNJT04sIERSSVZFUl9NSU5PUl9WRVJTSU9OLERSSVZFUl9TVUJfVkVSU0lPTik7CisgICAgICAgIGxtY19maXJzdF9sb2FkID0gMTsKKyAgICB9CisgICAgCisgICAgc2MgPSBkZXYtPnByaXY7CisgICAgc2MtPmxtY19kZXZpY2UgPSBkZXY7CisgICAgc2MtPm5hbWUgPSBkZXYtPm5hbWU7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBzcHBwIGxheWVyICovCisgICAgLyogQW4gaW9jdGwgY2FuIGNhdXNlIGEgc3Vic2VxdWVudCBkZXRhY2ggZm9yIHJhdyBmcmFtZSBpbnRlcmZhY2UgKi8KKyAgICBzYy0+aWZfdHlwZSA9IExNQ19QUFA7CisgICAgc2MtPmNoZWNrID0gMHhCRUFGQ0FGRTsKKyAgICBkZXYtPmJhc2VfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKyAgICBkZXYtPmlycSA9IHBkZXYtPmlycTsKKworICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgICBTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisgICAgLyoKKyAgICAgKiBUaGlzIHdpbGwgZ2V0IHRoZSBwcm90b2NvbCBsYXllciByZWFkeSBhbmQgZG8gYW55IDEgdGltZSBpbml0J3MKKyAgICAgKiBNdXN0IGhhdmUgYSB2YWxpZCBzYyBhbmQgZGV2IHN0cnVjdHVyZQorICAgICAqLworICAgIGxtY19wcm90b19pbml0KHNjKTsKKworICAgIGxtY19wcm90b19hdHRhY2goc2MpOworCisgICAgLyoKKyAgICAgKiBXaHkgd2VyZSB3ZSBjaGFuZ2luZyB0aGlzPz8/CisgICAgIGRldi0+dHhfcXVldWVfbGVuID0gMTAwOworICAgICAqLworCisgICAgLyogSW5pdCB0aGUgc3BpbiBsb2NrIHNvIGNhbiBjYWxsIGl0IGxhdHRlciAqLworCisgICAgc3Bpbl9sb2NrX2luaXQoJnNjLT5sbWNfbG9jayk7CisgICAgcGNpX3NldF9tYXN0ZXIocGRldik7CisKKyAgICBwcmludGsgKCIlczogZGV0ZWN0ZWQgYXQgJWx4LCBpcnEgJWRcbiIsIGRldi0+bmFtZSwKKwkgICAgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxKTsKKworICAgIGlmIChyZWdpc3Rlcl9uZXRkZXYgKGRldikgIT0gMCkgeworICAgICAgICBwcmludGsgKEtFUk5fRVJSICIlczogcmVnaXN0ZXJfbmV0ZGV2IGZhaWxlZC5cbiIsIGRldi0+bmFtZSk7CisJZ290byBvdXQ0OworICAgIH0KKworICAgIHNjLT5sbWNfY2FyZHR5cGUgPSBMTUNfQ0FSRFRZUEVfVU5LTk9XTjsKKyAgICBzYy0+bG1jX3RpbWluZyA9IExNQ19DVExfQ0xPQ0tfU09VUkNFX0VYVDsKKworICAgIC8qCisgICAgICoKKyAgICAgKiBDaGVjayBlaXRoZXIgdGhlIHN1YnZlbmRvciBvciB0aGUgc3ViZGV2aWNlLCBzb21lIHN5c3RlbXMgcmV2ZXJzZQorICAgICAqIHRoZSBzZXR0aW5nIGluIHRoZSBib2lzLCBzZWVtcyB0byBiZSB2ZXJzaW9uIGFuZCBhcmNoIGRlcGVuZGVudD8KKyAgICAgKiBGaXggdGhlIGVycm9yLCBleGNoYW5nZSB0aGUgdHdvIHZhbHVlcyAKKyAgICAgKi8KKyAgICBpZiAoKHN1YmRldmljZSA9IHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpID09IFBDSV9WRU5ET1JfSURfTE1DKQorCSAgICBzdWJkZXZpY2UgPSBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yOworCisgICAgc3dpdGNoIChzdWJkZXZpY2UpIHsKKyAgICBjYXNlIFBDSV9ERVZJQ0VfSURfTE1DX0hTU0k6CisgICAgICAgIHByaW50ayAoIiVzOiBMTUMgSFNTSVxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgc2MtPmxtY19jYXJkdHlwZSA9IExNQ19DQVJEVFlQRV9IU1NJOworICAgICAgICBzYy0+bG1jX21lZGlhID0gJmxtY19oc3NpX21lZGlhOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBDSV9ERVZJQ0VfSURfTE1DX0RTMzoKKyAgICAgICAgcHJpbnRrICgiJXM6IExNQyBEUzNcbiIsIGRldi0+bmFtZSk7CisgICAgICAgIHNjLT5sbWNfY2FyZHR5cGUgPSBMTUNfQ0FSRFRZUEVfRFMzOworICAgICAgICBzYy0+bG1jX21lZGlhID0gJmxtY19kczNfbWVkaWE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUENJX0RFVklDRV9JRF9MTUNfU1NJOgorICAgICAgICBwcmludGsgKCIlczogTE1DIFNTSVxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgc2MtPmxtY19jYXJkdHlwZSA9IExNQ19DQVJEVFlQRV9TU0k7CisgICAgICAgIHNjLT5sbWNfbWVkaWEgPSAmbG1jX3NzaV9tZWRpYTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0xNQ19UMToKKyAgICAgICAgcHJpbnRrICgiJXM6IExNQyBUMVxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgc2MtPmxtY19jYXJkdHlwZSA9IExNQ19DQVJEVFlQRV9UMTsKKyAgICAgICAgc2MtPmxtY19tZWRpYSA9ICZsbWNfdDFfbWVkaWE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHByaW50ayAoS0VSTl9XQVJOSU5HICIlczogTE1DIFVOS09XTiBDQVJEIVxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgbG1jX2luaXRjc3JzIChzYywgZGV2LT5iYXNlX2FkZHIsIDgpOworCisgICAgbG1jX2dwaW9fbWtpbnB1dCAoc2MsIDB4ZmYpOworICAgIHNjLT5sbWNfZ3BpbyA9IDA7CQkvKiBkcml2ZSBubyBzaWduYWxzIHlldCAqLworCisgICAgc2MtPmxtY19tZWRpYS0+ZGVmYXVsdHMgKHNjKTsKKworICAgIHNjLT5sbWNfbWVkaWEtPnNldF9saW5rX3N0YXR1cyAoc2MsIExNQ19MSU5LX1VQKTsKKworICAgIC8qIHZlcmlmeSB0aGF0IHRoZSBQQ0kgU3ViIFN5c3RlbSBJRCBtYXRjaGVzIHRoZSBBZGFwdGVyIE1vZGVsIG51bWJlcgorICAgICAqIGZyb20gdGhlIE1JSSByZWdpc3RlcgorICAgICAqLworICAgIEFkYXBNb2RlbE51bSA9IChsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAzKSAmIDB4M2YwKSA+PiA0OworCisgICAgaWYgKChBZGFwTW9kZWxOdW0gPT0gTE1DX0FEQVBfVDEKKyAgICAgICAgICYmIHN1YmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xNQ19UMSkgfHwJLyogZGV0ZWN0IExNQzEyMDAgKi8KKyAgICAgICAgKEFkYXBNb2RlbE51bSA9PSBMTUNfQURBUF9TU0kKKyAgICAgICAgICYmIHN1YmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xNQ19TU0kpIHx8CS8qIGRldGVjdCBMTUMxMDAwICovCisgICAgICAgIChBZGFwTW9kZWxOdW0gPT0gTE1DX0FEQVBfRFMzCisgICAgICAgICAmJiBzdWJkZXZpY2UgPT0gUENJX0RFVklDRV9JRF9MTUNfRFMzKSB8fAkvKiBkZXRlY3QgTE1DNTI0NSAqLworICAgICAgICAoQWRhcE1vZGVsTnVtID09IExNQ19BREFQX0hTU0kKKyAgICAgICAgICYmIHN1YmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0xNQ19IU1NJKSkKKyAgICB7CQkJCS8qIGRldGVjdCBMTUM1MjAwICovCisKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHByaW50ayAoIiVzOiBNb2RlbCBudW1iZXIgKCVkKSBtaXNjb21wYXJlIGZvciBQQ0kgU3Vic3lzdGVtIElEID0gMHglMDR4XG4iLAorICAgICAgICAgICAgICAgIGRldi0+bmFtZSwgQWRhcE1vZGVsTnVtLCBzdWJkZXZpY2UpOworLy8gICAgICAgIHJldHVybiAoTlVMTCk7CisgICAgfQorICAgIC8qCisgICAgICogcmVzZXQgY2xvY2sKKyAgICAgKi8KKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2dwX3RpbWVyLCAweEZGRkZGRkZGVUwpOworCisgICAgc2MtPmJvYXJkX2lkeCA9IGNhcmRzX2ZvdW5kKys7CisgICAgc2MtPnN0YXRzLmNoZWNrID0gU1RBVENIRUNLOworICAgIHNjLT5zdGF0cy52ZXJzaW9uX3NpemUgPSAoRFJJVkVSX1ZFUlNJT04gPDwgMTYpICsKKyAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgbG1jX3N0YXRpc3RpY3MpOworICAgIHNjLT5zdGF0cy5sbWNfY2FyZHR5cGUgPSBzYy0+bG1jX2NhcmR0eXBlOworCisgICAgc2MtPmxtY19vayA9IDA7CisgICAgc2MtPmxhc3RfbGlua19zdGF0dXMgPSAwOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19pbml0X29uZSBvdXQiKTsKKyAgICByZXR1cm4gMDsKKworIG91dDQ6CisgICAgbG1jX3Byb3RvX2RldGFjaChzYyk7Cisgb3V0MzoKKyAgICBpZiAocGRldikgeworCSAgICBwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCSAgICBwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisgICAgfQorIG91dDI6CisgICAgZnJlZV9uZXRkZXYoZGV2KTsKKyBvdXQxOgorICAgIHJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDYWxsZWQgZnJvbSBwY2kgd2hlbiByZW1vdmluZyBtb2R1bGUuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBsbWNfcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKyAgICAKKyAgICBpZiAoZGV2KSB7CisJICAgIGxtY19zb2Z0Y190ICpzYyA9IGRldi0+cHJpdjsKKwkgICAgCisJICAgIHByaW50aygiJXM6IHJlbW92aW5nLi4uXG4iLCBkZXYtPm5hbWUpOworCSAgICBsbWNfcHJvdG9fZGV0YWNoKHNjKTsKKwkgICAgdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkgICAgZnJlZV9uZXRkZXYoZGV2KTsKKwkgICAgcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkgICAgcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCSAgICBwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisgICAgfQorfQorCisvKiBBZnRlciB0aGlzIGlzIGNhbGxlZCwgcGFja2V0cyBjYW4gYmUgc2VudC4KKyAqIERvZXMgbm90IGluaXRpYWxpemUgdGhlIGFkZHJlc3NlcworICovCitzdGF0aWMgaW50IGxtY19vcGVuIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAvKmZvbGQwMCovCit7CisgICAgbG1jX3NvZnRjX3QgKnNjID0gZGV2LT5wcml2OworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19vcGVuIGluIik7CisKKyAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDApOworCisgICAgbG1jX2RlY19yZXNldCAoc2MpOworICAgIGxtY19yZXNldCAoc2MpOworCisgICAgTE1DX0VWRU5UX0xPRyhMTUNfRVZFTlRfUkVTRVQxLCBMTUNfQ1NSX1JFQUQgKHNjLCBjc3Jfc3RhdHVzKSwgMCk7CisgICAgTE1DX0VWRU5UX0xPRyhMTUNfRVZFTlRfUkVTRVQyLAorICAgICAgICAgICAgICAgICAgbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTYpLAorICAgICAgICAgICAgICAgICAgbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTcpKTsKKworCisgICAgaWYgKHNjLT5sbWNfb2speworICAgICAgICBsbWNfdHJhY2UoZGV2LCAibG1jX29wZW4gbG1jX29rIG91dCIpOworICAgICAgICByZXR1cm4gKDApOworICAgIH0KKworICAgIGxtY19zb2Z0cmVzZXQgKHNjKTsKKworICAgIC8qIFNpbmNlIHdlIGhhdmUgdG8gdXNlIFBDSSBidXMsIHRoaXMgc2hvdWxkIHdvcmsgb24geDg2LGFscGhhLHBwYyAqLworICAgIGlmIChyZXF1ZXN0X2lycSAoZGV2LT5pcnEsICZsbWNfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpKXsKKyAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNvdWxkIG5vdCBnZXQgaXJxOiAlZFxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisgICAgICAgIGxtY190cmFjZShkZXYsICJsbWNfb3BlbiBpcnEgZmFpbGVkIG91dCIpOworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CisgICAgc2MtPmdvdF9pcnEgPSAxOworCisgICAgLyogQXNzZXJ0IFRlcm1pbmFsIEFjdGl2ZSAqLworICAgIHNjLT5sbWNfbWlpcmVnMTYgfD0gTE1DX01JSTE2X0xFRF9BTEw7CisgICAgc2MtPmxtY19tZWRpYS0+c2V0X2xpbmtfc3RhdHVzIChzYywgTE1DX0xJTktfVVApOworCisgICAgLyoKKyAgICAgKiByZXNldCB0byBsYXN0IHN0YXRlLgorICAgICAqLworICAgIHNjLT5sbWNfbWVkaWEtPnNldF9zdGF0dXMgKHNjLCBOVUxMKTsKKworICAgIC8qIHNldHVwIGRlZmF1bHQgYml0cyB0byBiZSB1c2VkIGluIHR1bGlwX2Rlc2NfdCB0cmFuc21pdCBkZXNjcmlwdG9yCisgICAgICogLWJheiAqLworICAgIHNjLT5UeERlc2NyaXB0Q29udHJvbEluaXQgPSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTUNfVERFU19JTlRFUlJVUFRfT05fQ09NUExFVElPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTUNfVERFU19GSVJTVF9TRUdNRU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExNQ19UREVTX0xBU1RfU0VHTUVOVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTUNfVERFU19TRUNPTkRfQUREUl9DSEFJTkVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExNQ19UREVTX0RJU0FCTEVfUEFERElORworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgaWYgKHNjLT5pY3RsLmNyY19sZW5ndGggPT0gTE1DX0NUTF9DUkNfTEVOR1RIXzE2KSB7CisgICAgICAgIC8qIGRpc2FibGUgMzIgYml0IENSQyBnZW5lcmF0ZWQgYnkgQVNJQyAqLworICAgICAgICBzYy0+VHhEZXNjcmlwdENvbnRyb2xJbml0IHw9IExNQ19UREVTX0FERF9DUkNfRElTQUJMRTsKKyAgICB9CisgICAgc2MtPmxtY19tZWRpYS0+c2V0X2NyY19sZW5ndGgoc2MsIHNjLT5pY3RsLmNyY19sZW5ndGgpOworICAgIC8qIEFja25vbGVkZ2UgdGhlIFRlcm1pbmFsIEFjdGl2ZSBhbmQgbGlnaHQgTEVEcyAqLworCisgICAgLyogZGV2LT5mbGFncyB8PSBJRkZfVVA7ICovCisKKyAgICBsbWNfcHJvdG9fb3BlbihzYyk7CisKKyAgICBkZXYtPmRvX2lvY3RsID0gbG1jX2lvY3RsOworCisKKyAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworICAgIAorICAgIHNjLT5zdGF0cy50eF90YnVzeTArKyA7CisKKyAgICAvKgorICAgICAqIHNlbGVjdCB3aGF0IGludGVycnVwdHMgd2Ugd2FudCB0byBnZXQKKyAgICAgKi8KKyAgICBzYy0+bG1jX2ludHJtYXNrID0gMDsKKyAgICAvKiBTaG91bGQgYmUgdXNpbmcgdGhlIGRlZmF1bHQgaW50ZXJydXB0IG1hc2sgZGVmaW5lZCBpbiB0aGUgLmggZmlsZS4gKi8KKyAgICBzYy0+bG1jX2ludHJtYXNrIHw9IChUVUxJUF9TVFNfTk9STUFMSU5UUgorICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFVMSVBfU1RTX1JYSU5UUgorICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFVMSVBfU1RTX1RYSU5UUgorICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFVMSVBfU1RTX0FCTlJNTElOVFIKKyAgICAgICAgICAgICAgICAgICAgICAgICB8IFRVTElQX1NUU19TWVNFUlJPUgorICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFVMSVBfU1RTX1RYU1RPUFBFRAorICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFVMSVBfU1RTX1RYVU5ERVJGTE9XCisgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVUxJUF9TVFNfUlhTVE9QUEVECisJCSAgICAgICAgIHwgVFVMSVBfU1RTX1JYTk9CVUYKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9pbnRyLCBzYy0+bG1jX2ludHJtYXNrKTsKKworICAgIHNjLT5sbWNfY21kbW9kZSB8PSBUVUxJUF9DTURfVFhSVU47CisgICAgc2MtPmxtY19jbWRtb2RlIHw9IFRVTElQX0NNRF9SWFJVTjsKKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2NvbW1hbmQsIHNjLT5sbWNfY21kbW9kZSk7CisKKyAgICBzYy0+bG1jX29rID0gMTsgLyogUnVuIHdhdGNoZG9nICovCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgaWYgdXAgbm93IC0gcGZiCisgICAgICovCisKKyAgICBzYy0+bGFzdF9saW5rX3N0YXR1cyA9IDE7CisKKyAgICAvKgorICAgICAqIFNldHVwIGEgdGltZXIgZm9yIHRoZSB3YXRjaGRvZyBvbiBwcm9iZSwgYW5kIHN0YXJ0IGl0IHJ1bm5pbmcuCisgICAgICogU2luY2UgbG1jX29rID09IDAsIGl0IHdpbGwgYmUgYSBOT1AgZm9yIG5vdy4KKyAgICAgKi8KKyAgICBpbml0X3RpbWVyICgmc2MtPnRpbWVyKTsKKyAgICBzYy0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKKyAgICBzYy0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7CisgICAgc2MtPnRpbWVyLmZ1bmN0aW9uID0gJmxtY193YXRjaGRvZzsKKyAgICBhZGRfdGltZXIgKCZzYy0+dGltZXIpOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19vcGVuIG91dCIpOworCisgICAgcmV0dXJuICgwKTsKK30KKworLyogVG90YWwgcmVzZXQgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIEFkVHJhbiBEU1UgZG9pbmcgYmFkIHRoaW5ncworICogIHVuZGVyIGhlYXZ5IGxvYWQKKyAqLworCitzdGF0aWMgdm9pZCBsbWNfcnVubmluZ19yZXNldCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgLypmb2xkMDAqLworeworCisgICAgbG1jX3NvZnRjX3QgKnNjID0gKGxtY19zb2Z0Y190ICopIGRldi0+cHJpdjsKKworICAgIGxtY190cmFjZShkZXYsICJsbWNfcnVubmlnX3Jlc2V0IGluIik7CisKKyAgICAvKiBzdG9wIGludGVycnVwdHMgKi8KKyAgICAvKiBDbGVhciB0aGUgaW50ZXJydXB0IG1hc2sgKi8KKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2ludHIsIDB4MDAwMDAwMDApOworCisgICAgbG1jX2RlY19yZXNldCAoc2MpOworICAgIGxtY19yZXNldCAoc2MpOworICAgIGxtY19zb2Z0cmVzZXQgKHNjKTsKKyAgICAvKiBzYy0+bG1jX21paXJlZzE2IHw9IExNQ19NSUkxNl9MRURfQUxMOyAqLworICAgIHNjLT5sbWNfbWVkaWEtPnNldF9saW5rX3N0YXR1cyAoc2MsIDEpOworICAgIHNjLT5sbWNfbWVkaWEtPnNldF9zdGF0dXMgKHNjLCBOVUxMKTsKKworICAgIC8vZGV2LT5mbGFncyB8PSBJRkZfUlVOTklORzsKKyAgICAKKyAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKyAgICBzYy0+bG1jX3R4ZnVsbCA9IDA7CisgICAgc2MtPnN0YXRzLnR4X3RidXN5MCsrIDsKKworICAgIHNjLT5sbWNfaW50cm1hc2sgPSBUVUxJUF9ERUZBVUxUX0lOVFJfTUFTSzsKKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2ludHIsIHNjLT5sbWNfaW50cm1hc2spOworCisgICAgc2MtPmxtY19jbWRtb2RlIHw9IChUVUxJUF9DTURfVFhSVU4gfCBUVUxJUF9DTURfUlhSVU4pOworICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfY29tbWFuZCwgc2MtPmxtY19jbWRtb2RlKTsKKworICAgIGxtY190cmFjZShkZXYsICJsbWNfcnVubmluX3Jlc2V0X291dCIpOworfQorCisKKy8qIFRoaXMgaXMgd2hhdCBpcyBjYWxsZWQgd2hlbiB5b3UgaWZjb25maWcgZG93biBhIGRldmljZS4KKyAqIFRoaXMgZGlzYWJsZXMgdGhlIHRpbWVyIGZvciB0aGUgd2F0Y2hkb2cgYW5kIGtlZXBhbGl2ZXMsCisgKiBhbmQgZGlzYWJsZXMgdGhlIGlycSBmb3IgZGV2LgorICovCitzdGF0aWMgaW50IGxtY19jbG9zZSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgLypmb2xkMDAqLworeworICAgIC8qIG5vdCBjYWxsaW5nIHJlbGVhc2VfcmVnaW9uKCkgYXMgd2Ugc2hvdWxkICovCisgICAgbG1jX3NvZnRjX3QgKnNjOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19jbG9zZSBpbiIpOworICAgIAorICAgIHNjID0gZGV2LT5wcml2OworICAgIHNjLT5sbWNfb2sgPSAwOworICAgIHNjLT5sbWNfbWVkaWEtPnNldF9saW5rX3N0YXR1cyAoc2MsIDApOworICAgIGRlbF90aW1lciAoJnNjLT50aW1lcik7CisgICAgbG1jX3Byb3RvX2Nsb3NlKHNjKTsKKyAgICBsbWNfaWZkb3duIChkZXYpOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19jbG9zZSBvdXQiKTsKKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworLyogRW5kcyB0aGUgdHJhbnNmZXIgb2YgcGFja2V0cyAqLworLyogV2hlbiB0aGUgaW50ZXJmYWNlIGdvZXMgZG93biwgdGhpcyBpcyBjYWxsZWQgKi8KK3N0YXRpYyBpbnQgbG1jX2lmZG93biAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgLypmb2xkMDAqLworeworICAgIGxtY19zb2Z0Y190ICpzYyA9IGRldi0+cHJpdjsKKyAgICB1MzIgY3NyNjsKKyAgICBpbnQgaTsKKworICAgIGxtY190cmFjZShkZXYsICJsbWNfaWZkb3duIGluIik7CisgICAgCisgICAgLyogRG9uJ3QgbGV0IGFueXRoaW5nIGVsc2UgZ28gb24gcmlnaHQgbm93ICovCisgICAgLy8gICAgZGV2LT5zdGFydCA9IDA7CisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworICAgIHNjLT5zdGF0cy50eF90YnVzeTErKyA7CisKKyAgICAvKiBzdG9wIGludGVycnVwdHMgKi8KKyAgICAvKiBDbGVhciB0aGUgaW50ZXJydXB0IG1hc2sgKi8KKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2ludHIsIDB4MDAwMDAwMDApOworCisgICAgLyogU3RvcCBUeCBhbmQgUnggb24gdGhlIGNoaXAgKi8KKyAgICBjc3I2ID0gTE1DX0NTUl9SRUFEIChzYywgY3NyX2NvbW1hbmQpOworICAgIGNzcjYgJj0gfkxNQ19ERUNfU1Q7CQkvKiBUdXJuIG9mZiB0aGUgVHJhbnNtaXNzaW9uIGJpdCAqLworICAgIGNzcjYgJj0gfkxNQ19ERUNfU1I7CQkvKiBUdXJuIG9mZiB0aGUgUmVjZWl2ZSBiaXQgKi8KKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2NvbW1hbmQsIGNzcjYpOworCisgICAgZGV2LT5mbGFncyAmPSB+SUZGX1JVTk5JTkc7CisKKyAgICBzYy0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycyArPQorICAgICAgICBMTUNfQ1NSX1JFQUQgKHNjLCBjc3JfbWlzc2VkX2ZyYW1lcykgJiAweGZmZmY7CisKKyAgICAvKiByZWxlYXNlIHRoZSBpbnRlcnJ1cHQgKi8KKyAgICBpZihzYy0+Z290X2lycSA9PSAxKXsKKyAgICAgICAgZnJlZV9pcnEgKGRldi0+aXJxLCBkZXYpOworICAgICAgICBzYy0+Z290X2lycSA9IDA7CisgICAgfQorCisgICAgLyogZnJlZSBza2J1ZmZzIGluIHRoZSBSeCBxdWV1ZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBMTUNfUlhERVNDUzsgaSsrKQorICAgIHsKKyAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNjLT5sbWNfcnhxW2ldOworICAgICAgICBzYy0+bG1jX3J4cVtpXSA9IE5VTEw7CisgICAgICAgIHNjLT5sbWNfcnhyaW5nW2ldLnN0YXR1cyA9IDA7CisgICAgICAgIHNjLT5sbWNfcnhyaW5nW2ldLmxlbmd0aCA9IDA7CisgICAgICAgIHNjLT5sbWNfcnhyaW5nW2ldLmJ1ZmZlcjEgPSAweERFQURCRUVGOworICAgICAgICBpZiAoc2tiICE9IE5VTEwpCisgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiKHNrYik7CisgICAgICAgIHNjLT5sbWNfcnhxW2ldID0gTlVMTDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE1DX1RYREVTQ1M7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChzYy0+bG1jX3R4cVtpXSAhPSBOVUxMKQorICAgICAgICAgICAgZGV2X2tmcmVlX3NrYihzYy0+bG1jX3R4cVtpXSk7CisgICAgICAgIHNjLT5sbWNfdHhxW2ldID0gTlVMTDsKKyAgICB9CisKKyAgICBsbWNfbGVkX29mZiAoc2MsIExNQ19NSUkxNl9MRURfQUxMKTsKKworICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKKyAgICBzYy0+c3RhdHMudHhfdGJ1c3kwKysgOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19pZmRvd24gb3V0Iik7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogSW50ZXJydXB0IGhhbmRsaW5nIHJvdXRpbmUuICBUaGlzIHdpbGwgdGFrZSBhbiBpbmNvbWluZyBwYWNrZXQsIG9yIGNsZWFuCisgKiB1cCBhZnRlciBhIHRyYXNtaXQuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBsbWNfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKSAvKmZvbGQwMCovCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaW5zdGFuY2U7CisgICAgbG1jX3NvZnRjX3QgKnNjOworICAgIHUzMiBjc3I7CisgICAgaW50IGk7CisgICAgczMyIHN0YXQ7CisgICAgdW5zaWduZWQgaW50IGJhZHR4OworICAgIHUzMiBmaXJzdGNzcjsKKyAgICBpbnQgbWF4X3dvcmsgPSBMTUNfUlhERVNDUzsKKyAgICBpbnQgaGFuZGxlZCA9IDA7CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX2ludGVycnVwdCBpbiIpOworCisgICAgc2MgPSBkZXYtPnByaXY7CisgICAgCisgICAgc3Bpbl9sb2NrKCZzYy0+bG1jX2xvY2spOworCisgICAgLyoKKyAgICAgKiBSZWFkIHRoZSBjc3IgdG8gZmluZCB3aGF0IGludGVycnVwdHMgd2UgaGF2ZSAoaWYgYW55KQorICAgICAqLworICAgIGNzciA9IExNQ19DU1JfUkVBRCAoc2MsIGNzcl9zdGF0dXMpOworCisgICAgLyoKKyAgICAgKiBNYWtlIHN1cmUgdGhpcyBpcyBvdXIgaW50ZXJydXB0CisgICAgICovCisgICAgaWYgKCAhIChjc3IgJiBzYy0+bG1jX2ludHJtYXNrKSkgeworICAgICAgICBnb3RvIGxtY19pbnRfZmFpbF9vdXQ7CisgICAgfQorCisgICAgZmlyc3Rjc3IgPSBjc3I7CisKKyAgICAvKiBhbHdheXMgZ28gdGhyb3VnaCB0aGlzIGxvb3AgYXQgbGVhc3Qgb25jZSAqLworICAgIHdoaWxlIChjc3IgJiBzYy0+bG1jX2ludHJtYXNrKSB7CisJaGFuZGxlZCA9IDE7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2xlYXIgaW50ZXJydXB0IGJpdHMsIHdlIGhhbmRsZSBhbGwgY2FzZSBiZWxvdworICAgICAgICAgKi8KKyAgICAgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9zdGF0dXMsIGNzcik7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogT25lIG9mCisgICAgICAgICAqICAtIFRyYW5zbWl0IHByb2Nlc3MgdGltZWQgb3V0IENTUjU8MT4KKyAgICAgICAgICogIC0gVHJhbnNtaXQgamFiYmVyIHRpbWVvdXQgICAgQ1NSNTwzPgorICAgICAgICAgKiAgLSBUcmFuc21pdCB1bmRlcmZsb3cgICAgICAgICBDU1I1PDU+CisgICAgICAgICAqICAtIFRyYW5zbWl0IFJlY2VpdmVyIGJ1ZmZlciB1bmF2YWlsYWJsZSBDU1I1PDc+CisgICAgICAgICAqICAtIFJlY2VpdmUgcHJvY2VzcyBzdG9wcGVkICAgIENTUjU8OD4KKyAgICAgICAgICogIC0gUmVjZWl2ZSB3YXRjaGRvZyB0aW1lb3V0ICAgQ1NSNTw5PgorICAgICAgICAgKiAgLSBFYXJseSB0cmFuc21pdCBpbnRlcnJ1cHQgICBDU1I1PDEwPgorICAgICAgICAgKgorICAgICAgICAgKiBJcyB0aGlzIHJlYWxseSByaWdodD8gU2hvdWxkIHdlIGRvIGEgcnVubmluZyByZXNldCBmb3IgamFiYmVyPworICAgICAgICAgKiAoYmVpbmcgYSBXQU4gY2FyZCBhbmQgYWxsKQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGNzciAmIFRVTElQX1NUU19BQk5STUxJTlRSKXsKKyAgICAgICAgICAgIGxtY19ydW5uaW5nX3Jlc2V0IChkZXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChjc3IgJiBUVUxJUF9TVFNfUlhJTlRSKXsKKyAgICAgICAgICAgIGxtY190cmFjZShkZXYsICJyeCBpbnRlcnJ1cHQiKTsKKyAgICAgICAgICAgIGxtY19yeCAoZGV2KTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGlmIChjc3IgJiAoVFVMSVBfU1RTX1RYSU5UUiB8IFRVTElQX1NUU19UWE5PQlVGIHwgVFVMSVBfU1RTX1RYU1RPUFBFRCkpIHsKKworCSAgICBpbnQJCW5fY29tcGwgPSAwIDsKKyAgICAgICAgICAgIC8qIHJlc2V0IHRoZSB0cmFuc21pdCB0aW1lb3V0IGRldGVjdGlvbiBmbGFnIC1iYXogKi8KKyAgICAgICAgICAgIHNjLT5zdGF0cy50eF9Ob0NvbXBsZXRlQ250ID0gMDsKKworICAgICAgICAgICAgYmFkdHggPSBzYy0+bG1jX3RhaW50X3R4OworICAgICAgICAgICAgaSA9IGJhZHR4ICUgTE1DX1RYREVTQ1M7CisKKyAgICAgICAgICAgIHdoaWxlICgoYmFkdHggPCBzYy0+bG1jX25leHRfdHgpKSB7CisgICAgICAgICAgICAgICAgc3RhdCA9IHNjLT5sbWNfdHhyaW5nW2ldLnN0YXR1czsKKworICAgICAgICAgICAgICAgIExNQ19FVkVOVF9MT0cgKExNQ19FVkVOVF9YTVRJTlQsIHN0YXQsCisJCQkJCQkgc2MtPmxtY190eHJpbmdbaV0ubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIElmIGJpdCAzMSBpcyAxIHRoZSB0dWxpcCBvd25zIGl0IGJyZWFrIG91dCBvZiB0aGUgbG9vcAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChzdGF0ICYgMHg4MDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJbl9jb21wbCsrIDsJCS8qIGkuZS4sIGhhdmUgYW4gZW1wdHkgc2xvdCBpbiByaW5nICovCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBJZiB3ZSBoYXZlIG5vIHNrYnVmZiBvciBoYXZlIGNsZWFyZWQgaXQKKyAgICAgICAgICAgICAgICAgKiBBbHJlYWR5IGNvbnRpbnVlIHRvIHRoZSBuZXh0IGJ1ZmZlcgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChzYy0+bG1jX3R4cVtpXSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2hlY2sgdGhlIHRvdGFsIGVycm9yIHN1bW1hcnkgdG8gbG9vayBmb3IgYW55IGVycm9ycworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChzdGF0ICYgMHg4MDAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNjLT5zdGF0cy50eF9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXQgJiAweDQxMDQpCisgICAgICAgICAgICAgICAgICAgICAgICBzYy0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXQgJiAweDBDMDApCisgICAgICAgICAgICAgICAgICAgICAgICBzYy0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXQgJiAweDAyMDApCisgICAgICAgICAgICAgICAgICAgICAgICBzYy0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdCAmIDB4MDAwMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHNjLT5zdGF0cy50eF9ieXRlcyArPSBzYy0+bG1jX3R4cmluZ1tpXS5sZW5ndGggJiAweDdmZjsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHNjLT5zdGF0cy50eF9wYWNrZXRzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2Ioc2MtPmxtY190eHFbaV0pOworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfaXJxKHNjLT5sbWNfdHhxW2ldKTsKKyAgICAgICAgICAgICAgICBzYy0+bG1jX3R4cVtpXSA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICBiYWR0eCsrOworICAgICAgICAgICAgICAgIGkgPSBiYWR0eCAlIExNQ19UWERFU0NTOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2MtPmxtY19uZXh0X3R4IC0gYmFkdHggPiBMTUNfVFhERVNDUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludGsgKCIlczogb3V0IG9mIHN5bmMgcG9pbnRlclxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICBiYWR0eCArPSBMTUNfVFhERVNDUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX1RCVVNZMCwgbl9jb21wbCwgMCk7CisgICAgICAgICAgICBzYy0+bG1jX3R4ZnVsbCA9IDA7CisgICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisgICAgICAgICAgICBzYy0+c3RhdHMudHhfdGJ1c3kwKysgOworCisKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgc2MtPnN0YXRzLmRpcnR5VHggPSBiYWR0eDsKKyAgICAgICAgICAgIHNjLT5zdGF0cy5sbWNfbmV4dF90eCA9IHNjLT5sbWNfbmV4dF90eDsKKyAgICAgICAgICAgIHNjLT5zdGF0cy5sbWNfdHhmdWxsID0gc2MtPmxtY190eGZ1bGw7CisjZW5kaWYKKyAgICAgICAgICAgIHNjLT5sbWNfdGFpbnRfdHggPSBiYWR0eDsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFdoeSB3YXMgdGhlcmUgYSBicmVhayBoZXJlPz8/CisgICAgICAgICAgICAgKi8KKyAgICAgICAgfQkJCS8qIGVuZCBoYW5kbGUgdHJhbnNtaXQgaW50ZXJydXB0ICovCisKKyAgICAgICAgaWYgKGNzciAmIFRVTElQX1NUU19TWVNFUlJPUikgeworICAgICAgICAgICAgdTMyIGVycm9yOworICAgICAgICAgICAgcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBzeXN0ZW0gYnVzIGVycm9yIGNzcjogJSM4Ljh4XG4iLCBkZXYtPm5hbWUsIGNzcik7CisgICAgICAgICAgICBlcnJvciA9IGNzcj4+MjMgJiAweDc7CisgICAgICAgICAgICBzd2l0Y2goZXJyb3IpeworICAgICAgICAgICAgY2FzZSAweDAwMDoKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogUGFyaXR5IEZhdWx0IChiYWQpXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDAwMToKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWFzdGVyIEFib3J0IChuYXVnaHR5KVxuIiwgZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgwMTA6CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRhcmdldCBBYm9ydCAobm90IHNvIG5hdWdodHkpXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogVGhpcyBidXMgZXJyb3IgY29kZSB3YXMgc3VwcG9zZWQgdG8gYmUgcmVzZXJ2ZWQhXG4iLCBkZXYtPm5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG1jX2RlY19yZXNldCAoc2MpOworICAgICAgICAgICAgbG1jX3Jlc2V0IChzYyk7CisgICAgICAgICAgICBMTUNfRVZFTlRfTE9HKExNQ19FVkVOVF9SRVNFVDEsIExNQ19DU1JfUkVBRCAoc2MsIGNzcl9zdGF0dXMpLCAwKTsKKyAgICAgICAgICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX1JFU0VUMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNykpOworCisgICAgICAgIH0KKworICAgICAgICAKKyAgICAgICAgaWYobWF4X3dvcmstLSA8PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgICAgICAvKgorICAgICAgICAgKiBHZXQgY3VycmVudCBjc3Igc3RhdHVzIHRvIG1ha2Ugc3VyZQorICAgICAgICAgKiB3ZSd2ZSBjbGVhcmVkIGFsbCBpbnRlcnJ1cHRzCisgICAgICAgICAqLworICAgICAgICBjc3IgPSBMTUNfQ1NSX1JFQUQgKHNjLCBjc3Jfc3RhdHVzKTsKKyAgICB9CQkJCS8qIGVuZCBpbnRlcnJ1cHQgbG9vcCAqLworICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX0lOVCwgZmlyc3Rjc3IsIGNzcik7CisKK2xtY19pbnRfZmFpbF9vdXQ6CisKKyAgICBzcGluX3VubG9jaygmc2MtPmxtY19sb2NrKTsKKworICAgIGxtY190cmFjZShkZXYsICJsbWNfaW50ZXJydXB0IG91dCIpOworICAgIHJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgaW50IGxtY19zdGFydF94bWl0IChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSAvKmZvbGQwMCovCit7CisgICAgbG1jX3NvZnRjX3QgKnNjOworICAgIHUzMiBmbGFnOworICAgIGludCBlbnRyeTsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19zdGFydF94bWl0IGluIik7CisKKyAgICBzYyA9IGRldi0+cHJpdjsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzYy0+bG1jX2xvY2ssIGZsYWdzKTsKKworICAgIC8qIG5vcm1hbCBwYXRoLCB0YnVzeSBrbm93biB0byBiZSB6ZXJvICovCisKKyAgICBlbnRyeSA9IHNjLT5sbWNfbmV4dF90eCAlIExNQ19UWERFU0NTOworCisgICAgc2MtPmxtY190eHFbZW50cnldID0gc2tiOworICAgIHNjLT5sbWNfdHhyaW5nW2VudHJ5XS5idWZmZXIxID0gdmlydF90b19idXMgKHNrYi0+ZGF0YSk7CisKKyAgICBMTUNfQ09OU09MRV9MT0coInhtaXQiLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKworI2lmbmRlZiBHQ09NCisgICAgLyogSWYgdGhlIHF1ZXVlIGlzIGxlc3MgdGhhbiBoYWxmIGZ1bGwsIGRvbid0IGludGVycnVwdCAqLworICAgIGlmIChzYy0+bG1jX25leHRfdHggLSBzYy0+bG1jX3RhaW50X3R4IDwgTE1DX1RYREVTQ1MgLyAyKQorICAgIHsKKyAgICAgICAgLyogRG8gbm90IGludGVycnVwdCBvbiBjb21wbGV0aW9uIG9mIHRoaXMgcGFja2V0ICovCisgICAgICAgIGZsYWcgPSAweDYwMDAwMDAwOworICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisgICAgfQorICAgIGVsc2UgaWYgKHNjLT5sbWNfbmV4dF90eCAtIHNjLT5sbWNfdGFpbnRfdHggPT0gTE1DX1RYREVTQ1MgLyAyKQorICAgIHsKKyAgICAgICAgLyogVGhpcyBnZW5lcmF0ZXMgYW4gaW50ZXJydXB0IG9uIGNvbXBsZXRpb24gb2YgdGhpcyBwYWNrZXQgKi8KKyAgICAgICAgZmxhZyA9IDB4ZTAwMDAwMDA7CisgICAgICAgIG5ldGlmX3dha2VfcXVldWUoZGV2KTsKKyAgICB9CisgICAgZWxzZSBpZiAoc2MtPmxtY19uZXh0X3R4IC0gc2MtPmxtY190YWludF90eCA8IExNQ19UWERFU0NTIC0gMSkKKyAgICB7CisgICAgICAgIC8qIERvIG5vdCBpbnRlcnJ1cHQgb24gY29tcGxldGlvbiBvZiB0aGlzIHBhY2tldCAqLworICAgICAgICBmbGFnID0gMHg2MDAwMDAwMDsKKyAgICAgICAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBUaGlzIGdlbmVyYXRlcyBhbiBpbnRlcnJ1cHQgb24gY29tcGxldGlvbiBvZiB0aGlzIHBhY2tldCAqLworICAgICAgICBmbGFnID0gMHhlMDAwMDAwMDsKKyAgICAgICAgc2MtPmxtY190eGZ1bGwgPSAxOworICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgfQorI2Vsc2UKKyAgICBmbGFnID0gTE1DX1RERVNfSU5URVJSVVBUX09OX0NPTVBMRVRJT047CisKKyAgICBpZiAoc2MtPmxtY19uZXh0X3R4IC0gc2MtPmxtY190YWludF90eCA+PSBMTUNfVFhERVNDUyAtIDEpCisgICAgewkJCQkvKiByaW5nIGZ1bGwsIGdvIGJ1c3kgKi8KKyAgICAgICAgc2MtPmxtY190eGZ1bGwgPSAxOworICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgICAgIHNjLT5zdGF0cy50eF90YnVzeTErKyA7CisgICAgICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX1RCVVNZMSwgZW50cnksIDApOworICAgIH0KKyNlbmRpZgorCisKKyAgICBpZiAoZW50cnkgPT0gTE1DX1RYREVTQ1MgLSAxKQkvKiBsYXN0IGRlc2NyaXB0b3IgaW4gcmluZyAqLworCWZsYWcgfD0gTE1DX1RERVNfRU5EX09GX1JJTkc7CS8qIGZsYWcgYXMgc3VjaCBmb3IgVHVsaXAgKi8KKworICAgIC8qIGRvbid0IHBhZCBzbWFsbCBwYWNrZXRzIGVpdGhlciAqLworICAgIGZsYWcgPSBzYy0+bG1jX3R4cmluZ1tlbnRyeV0ubGVuZ3RoID0gKHNrYi0+bGVuKSB8IGZsYWcgfAorCQkJCQkJc2MtPlR4RGVzY3JpcHRDb250cm9sSW5pdDsKKworICAgIC8qIHNldCB0aGUgdHJhbnNtaXQgdGltZW91dCBmbGFnIHRvIGJlIGNoZWNrZWQgaW4KKyAgICAgKiB0aGUgd2F0Y2hkb2cgdGltZXIgaGFuZGxlci4gLWJhegorICAgICAqLworCisgICAgc2MtPnN0YXRzLnR4X05vQ29tcGxldGVDbnQrKzsKKyAgICBzYy0+bG1jX25leHRfdHgrKzsKKworICAgIC8qIGdpdmUgb3duZXJzaGlwIHRvIHRoZSBjaGlwICovCisgICAgTE1DX0VWRU5UX0xPRyhMTUNfRVZFTlRfWE1ULCBmbGFnLCBlbnRyeSk7CisgICAgc2MtPmxtY190eHJpbmdbZW50cnldLnN0YXR1cyA9IDB4ODAwMDAwMDA7CisKKyAgICAvKiBzZW5kIG5vdyEgKi8KKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX3R4cG9sbCwgMCk7CisKKyAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjLT5sbWNfbG9jaywgZmxhZ3MpOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19zdGFydF94bWl0X291dCIpOworICAgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBsbWNfcnggKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIC8qZm9sZDAwKi8KK3sKKyAgICBsbWNfc29mdGNfdCAqc2M7CisgICAgaW50IGk7CisgICAgaW50IHJ4X3dvcmtfbGltaXQgPSBMTUNfUlhERVNDUzsKKyAgICB1bnNpZ25lZCBpbnQgbmV4dF9yeDsKKyAgICBpbnQgcnhJbnRMb29wQ250OwkJLyogZGVidWcgLWJheiAqLworICAgIGludCBsb2NhbExlbmd0aEVyckNudCA9IDA7CisgICAgbG9uZyBzdGF0OworICAgIHN0cnVjdCBza19idWZmICpza2IsICpuc2I7CisgICAgdTE2IGxlbjsKKworICAgIGxtY190cmFjZShkZXYsICJsbWNfcnggaW4iKTsKKworICAgIHNjID0gZGV2LT5wcml2OworCisgICAgbG1jX2xlZF9vbihzYywgTE1DX0RTM19MRUQzKTsKKworICAgIHJ4SW50TG9vcENudCA9IDA7CQkvKiBkZWJ1ZyAtYmF6ICovCisKKyAgICBpID0gc2MtPmxtY19uZXh0X3J4ICUgTE1DX1JYREVTQ1M7CisgICAgbmV4dF9yeCA9IHNjLT5sbWNfbmV4dF9yeDsKKworICAgIHdoaWxlICgoKHN0YXQgPSBzYy0+bG1jX3J4cmluZ1tpXS5zdGF0dXMpICYgTE1DX1JERVNfT1dOX0JJVCkgIT0gREVTQ19PV05FRF9CWV9EQzIxWDQpCisgICAgeworICAgICAgICByeEludExvb3BDbnQrKzsJCS8qIGRlYnVnIC1iYXogKi8KKyAgICAgICAgbGVuID0gKChzdGF0ICYgTE1DX1JERVNfRlJBTUVfTEVOR1RIKSA+PiBSREVTX0ZSQU1FX0xFTkdUSF9CSVRfTlVNQkVSKTsKKyAgICAgICAgaWYgKChzdGF0ICYgMHgwMzAwKSAhPSAweDAzMDApIHsgIC8qIENoZWNrIGZpcnN0IHNlZ21lbnQgYW5kIGxhc3Qgc2VnbWVudCAqLworICAgICAgICAgICAgaWYgKChzdGF0ICYgMHgwMDAwZmZmZikgIT0gMHg3ZmZmKSB7CisgICAgICAgICAgICAgICAgLyogT3ZlcnNpemVkIGZyYW1lICovCisgICAgICAgICAgICAgICAgc2MtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKyAgICAgICAgICAgICAgICBnb3RvIHNraXBfcGFja2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoc3RhdCAmIDB4MDAwMDAwMDgpeyAvKiBDYXRjaCBhIGRyaWJibGluZyBiaXQgZXJyb3IgKi8KKyAgICAgICAgICAgIHNjLT5zdGF0cy5yeF9lcnJvcnMrKzsKKyAgICAgICAgICAgIHNjLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKyAgICAgICAgICAgIGdvdG8gc2tpcF9wYWNrZXQ7CisgICAgICAgIH0KKworCisgICAgICAgIGlmKHN0YXQgJiAweDAwMDAwMDA0KXsgLyogQ2F0Y2ggYSBDUkMgZXJyb3IgYnkgdGhlIFhpbGlueCAqLworICAgICAgICAgICAgc2MtPnN0YXRzLnJ4X2Vycm9ycysrOworICAgICAgICAgICAgc2MtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKyAgICAgICAgICAgIGdvdG8gc2tpcF9wYWNrZXQ7CisgICAgICAgIH0KKworCisgICAgICAgIGlmIChsZW4gPiBMTUNfUEtUX0JVRl9TWil7CisgICAgICAgICAgICBzYy0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworICAgICAgICAgICAgbG9jYWxMZW5ndGhFcnJDbnQrKzsKKyAgICAgICAgICAgIGdvdG8gc2tpcF9wYWNrZXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGVuIDwgc2MtPmxtY19jcmNTaXplICsgMikgeworICAgICAgICAgICAgc2MtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKyAgICAgICAgICAgIHNjLT5zdGF0cy5yeF9TbWFsbFBrdENudCsrOworICAgICAgICAgICAgbG9jYWxMZW5ndGhFcnJDbnQrKzsKKyAgICAgICAgICAgIGdvdG8gc2tpcF9wYWNrZXQ7CisgICAgICAgIH0KKworICAgICAgICBpZihzdGF0ICYgMHgwMDAwNDAwMCl7CisgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZXIgZGVzY3JpcHRvciBlcnJvciwgcmVjZWl2ZXIgb3V0IG9mIHN5bmM/XG4iLCBkZXYtPm5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgbGVuIC09IHNjLT5sbWNfY3JjU2l6ZTsKKworICAgICAgICBza2IgPSBzYy0+bG1jX3J4cVtpXTsKKworICAgICAgICAvKgorICAgICAgICAgKiBXZSByYW4gb3V0IG9mIG1lbW9yeSBhdCBzb21lIHBvaW50CisgICAgICAgICAqIGp1c3QgYWxsb2NhdGUgYW4gc2tiIGJ1ZmYgYW5kIGNvbnRpbnVlLgorICAgICAgICAgKi8KKyAgICAgICAgCisgICAgICAgIGlmKHNrYiA9PSAweDApeworICAgICAgICAgICAgbnNiID0gZGV2X2FsbG9jX3NrYiAoTE1DX1BLVF9CVUZfU1ogKyAyKTsKKyAgICAgICAgICAgIGlmIChuc2IpIHsKKyAgICAgICAgICAgICAgICBzYy0+bG1jX3J4cVtpXSA9IG5zYjsKKyAgICAgICAgICAgICAgICBuc2ItPmRldiA9IGRldjsKKyAgICAgICAgICAgICAgICBzYy0+bG1jX3J4cmluZ1tpXS5idWZmZXIxID0gdmlydF90b19idXMgKG5zYi0+dGFpbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYy0+ZmFpbGVkX3JlY3ZfYWxsb2MgPSAxOworICAgICAgICAgICAgZ290byBza2lwX3BhY2tldDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKyAgICAgICAgc2MtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKyAgICAgICAgc2MtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKworICAgICAgICBMTUNfQ09OU09MRV9MT0coInJlY3YiLCBza2ItPmRhdGEsIGxlbik7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSSdtIG5vdCBzdXJlIG9mIHRoZSBzYW5pdHkgb2YgdGhpcworICAgICAgICAgKiBQYWNrZXRzIGNvdWxkIGJlIGFycml2aW5nIGF0IGEgY29uc3RhbnQKKyAgICAgICAgICogNDQuMjEwbWJpdHMvc2VjIGFuZCB3ZSdyZSBnb2luZyB0byBjb3B5CisgICAgICAgICAqIHRoZW0gaW50byBhIG5ldyBidWZmZXI/PworICAgICAgICAgKi8KKyAgICAgICAgCisgICAgICAgIGlmKGxlbiA+IChMTUNfTVRVIC0gKExNQ19NVFU+PjIpKSl7IC8qIGxlbiA+IExNQ19NVFUgKiAwLjc1ICovCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSWYgaXQncyBhIGxhcmdlIHBhY2tldCBkb24ndCBjb3B5IGl0IGp1c3QgaGFuZCBpdCB1cAorICAgICAgICAgICAgICovCisgICAgICAgIGdpdmVfaXRfYW55d2F5czoKKworICAgICAgICAgICAgc2MtPmxtY19yeHFbaV0gPSBOVUxMOworICAgICAgICAgICAgc2MtPmxtY19yeHJpbmdbaV0uYnVmZmVyMSA9IDB4MDsKKworICAgICAgICAgICAgc2tiX3B1dCAoc2tiLCBsZW4pOworICAgICAgICAgICAgc2tiLT5wcm90b2NvbCA9IGxtY19wcm90b190eXBlKHNjLCBza2IpOworICAgICAgICAgICAgc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX1dBTl9QUFApOworICAgICAgICAgICAgc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworLy8gICAgICAgICAgICBza2ItPm5oLnJhdyA9IHNrYi0+ZGF0YTsKKyAgICAgICAgICAgIHNrYi0+ZGV2ID0gZGV2OworICAgICAgICAgICAgbG1jX3Byb3RvX25ldGlmKHNjLCBza2IpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhpcyBza2Igd2lsbCBiZSBkZXN0cm95ZWQgYnkgdGhlIHVwcGVyIGxheWVycywgbWFrZSBhIG5ldyBvbmUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbnNiID0gZGV2X2FsbG9jX3NrYiAoTE1DX1BLVF9CVUZfU1ogKyAyKTsKKyAgICAgICAgICAgIGlmIChuc2IpIHsKKyAgICAgICAgICAgICAgICBzYy0+bG1jX3J4cVtpXSA9IG5zYjsKKyAgICAgICAgICAgICAgICBuc2ItPmRldiA9IGRldjsKKyAgICAgICAgICAgICAgICBzYy0+bG1jX3J4cmluZ1tpXS5idWZmZXIxID0gdmlydF90b19idXMgKG5zYi0+dGFpbCk7CisgICAgICAgICAgICAgICAgLyogVHJhbnNmZXJyZWQgdG8gMjExNDAgYmVsb3cgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogV2UndmUgcnVuIG91dCBvZiBtZW1vcnksIHN0b3AgdHJ5aW5nIHRvIGFsbG9jYXRlCisgICAgICAgICAgICAgICAgICogbWVtb3J5IGFuZCBleGl0IHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogVGhlIGNoaXAgbWF5IHJ1biBvdXQgb2YgcmVjZWl2ZXJzIGFuZCBzdG9wCisgICAgICAgICAgICAgICAgICogaW4gd2hpY2ggY2FyZSB3ZSdsbCB0cnkgdG8gYWxsb2NhdGUgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAqIGFnYWluLiAgKG9uY2UgYSBzZWNvbmQpCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgc2MtPnN0YXRzLnJ4X0J1ZmZBbGxvY0VycisrOworICAgICAgICAgICAgICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX1JDVklOVCwgc3RhdCwgbGVuKTsKKyAgICAgICAgICAgICAgICBzYy0+ZmFpbGVkX3JlY3ZfYWxsb2MgPSAxOworICAgICAgICAgICAgICAgIGdvdG8gc2tpcF9vdXRfb2ZfbWVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbnNiID0gZGV2X2FsbG9jX3NrYihsZW4pOworICAgICAgICAgICAgaWYoIW5zYikgeworICAgICAgICAgICAgICAgIGdvdG8gZ2l2ZV9pdF9hbnl3YXlzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KHNrYl9wdXQobnNiLCBsZW4pLCBza2ItPmRhdGEsIGxlbik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG5zYi0+cHJvdG9jb2wgPSBsbWNfcHJvdG9fdHlwZShzYywgc2tiKTsKKyAgICAgICAgICAgIG5zYi0+bWFjLnJhdyA9IG5zYi0+ZGF0YTsKKy8vICAgICAgICAgICAgbnNiLT5uaC5yYXcgPSBuc2ItPmRhdGE7CisgICAgICAgICAgICBuc2ItPmRldiA9IGRldjsKKyAgICAgICAgICAgIGxtY19wcm90b19uZXRpZihzYywgbnNiKTsKKyAgICAgICAgfQorCisgICAgc2tpcF9wYWNrZXQ6CisgICAgICAgIExNQ19FVkVOVF9MT0coTE1DX0VWRU5UX1JDVklOVCwgc3RhdCwgbGVuKTsKKyAgICAgICAgc2MtPmxtY19yeHJpbmdbaV0uc3RhdHVzID0gREVTQ19PV05FRF9CWV9EQzIxWDQ7CisKKyAgICAgICAgc2MtPmxtY19uZXh0X3J4Kys7CisgICAgICAgIGkgPSBzYy0+bG1jX25leHRfcnggJSBMTUNfUlhERVNDUzsKKyAgICAgICAgcnhfd29ya19saW1pdC0tOworICAgICAgICBpZiAocnhfd29ya19saW1pdCA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBkZXRlY3QgY29uZGl0aW9uIGZvciBMTUMxMDAwIHdoZXJlIERTVSBjYWJsZSBhdHRhY2hlcyBhbmQgZmlsbHMKKyAgICAgKiBkZXNjcmlwdG9ycyB3aXRoIGJvZ3VzIHBhY2tldHMKKyAgICAgKgorICAgIGlmIChsb2NhbExlbmd0aEVyckNudCA+IExNQ19SWERFU0NTIC0gMykgeworICAgICAgICBzYy0+c3RhdHMucnhfQmFkUGt0U3VyZ2VDbnQrKzsKKyAgICAgICAgTE1DX0VWRU5UX0xPRyhMTUNfRVZFTlRfQkFEUEtUU1VSR0UsCisgICAgICAgICAgICAgICAgICAgICAgbG9jYWxMZW5ndGhFcnJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgc2MtPnN0YXRzLnJ4X0JhZFBrdFN1cmdlQ250KTsKKyAgICB9ICovCisKKyAgICAvKiBzYXZlIG1heCBjb3VudCBvZiByZWNlaXZlIGRlc2NyaXB0b3JzIHNlcnZpY2VkICovCisgICAgaWYgKHJ4SW50TG9vcENudCA+IHNjLT5zdGF0cy5yeEludExvb3BDbnQpIHsKKyAgICAgICAgc2MtPnN0YXRzLnJ4SW50TG9vcENudCA9IHJ4SW50TG9vcENudDsJLyogZGVidWcgLWJheiAqLworICAgIH0KKworI2lmZGVmIERFQlVHCisgICAgaWYgKHJ4SW50TG9vcENudCA9PSAwKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IExNQ19SWERFU0NTOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoc2MtPmxtY19yeHJpbmdbaV0uc3RhdHVzICYgTE1DX1JERVNfT1dOX0JJVCkKKyAgICAgICAgICAgICAgICAhPSBERVNDX09XTkVEX0JZX0RDMjFYNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByeEludExvb3BDbnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBMTUNfRVZFTlRfTE9HKExNQ19FVkVOVF9SQ1ZFTkQsIHJ4SW50TG9vcENudCwgMCk7CisgICAgfQorI2VuZGlmCisKKworICAgIGxtY19sZWRfb2ZmKHNjLCBMTUNfRFMzX0xFRDMpOworCitza2lwX291dF9vZl9tZW06CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX3J4IG91dCIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbG1jX2dldF9zdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgLypmb2xkMDAqLworeworICAgIGxtY19zb2Z0Y190ICpzYyA9IGRldi0+cHJpdjsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19nZXRfc3RhdHMgaW4iKTsKKworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnNjLT5sbWNfbG9jaywgZmxhZ3MpOworCisgICAgc2MtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgKz0gTE1DX0NTUl9SRUFEIChzYywgY3NyX21pc3NlZF9mcmFtZXMpICYgMHhmZmZmOworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2MtPmxtY19sb2NrLCBmbGFncyk7CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX2dldF9zdGF0cyBvdXQiKTsKKworICAgIHJldHVybiAoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKikgJnNjLT5zdGF0czsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGxtY19kcml2ZXIgPSB7CisJLm5hbWUJCT0gImxtYyIsCisJLmlkX3RhYmxlCT0gbG1jX3BjaV90YmwsCisJLnByb2JlCQk9IGxtY19pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGxtY19yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbG1jKHZvaWQpCit7CisgICAgcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmbG1jX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2xtYyh2b2lkKQoreworICAgIHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbG1jX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbG1jKTsKK21vZHVsZV9leGl0KGV4aXRfbG1jKTsKKwordW5zaWduZWQgbG1jX21paV9yZWFkcmVnIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCB1bnNpZ25lZCBkZXZhZGRyLCB1bnNpZ25lZCByZWdubykgLypmb2xkMDAqLworeworICAgIGludCBpOworICAgIGludCBjb21tYW5kID0gKDB4ZjYgPDwgMTApIHwgKGRldmFkZHIgPDwgNSkgfCByZWdubzsKKyAgICBpbnQgcmV0dmFsID0gMDsKKworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19taWlfcmVhZHJlZyBpbiIpOworCisgICAgTE1DX01JSV9TWU5DIChzYyk7CisKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfbWlpX3JlYWRyZWc6IGRvbmUgc3luYyIpOworCisgICAgZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgICAgaW50IGRhdGF2YWwgPSAoY29tbWFuZCAmICgxIDw8IGkpKSA/IDB4MjAwMDAgOiAwOworCisgICAgICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfOSwgZGF0YXZhbCk7CisgICAgICAgIGxtY19kZWxheSAoKTsKKyAgICAgICAgLyogX19TTE9XX0RPV05fSU87ICovCisgICAgICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfOSwgZGF0YXZhbCB8IDB4MTAwMDApOworICAgICAgICBsbWNfZGVsYXkgKCk7CisgICAgICAgIC8qIF9fU0xPV19ET1dOX0lPOyAqLworICAgIH0KKworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19taWlfcmVhZHJlZzogZG9uZTEiKTsKKworICAgIGZvciAoaSA9IDE5OyBpID4gMDsgaS0tKQorICAgIHsKKyAgICAgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl85LCAweDQwMDAwKTsKKyAgICAgICAgbG1jX2RlbGF5ICgpOworICAgICAgICAvKiBfX1NMT1dfRE9XTl9JTzsgKi8KKyAgICAgICAgcmV0dmFsID0gKHJldHZhbCA8PCAxKSB8ICgoTE1DX0NTUl9SRUFEIChzYywgY3NyXzkpICYgMHg4MDAwMCkgPyAxIDogMCk7CisgICAgICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfOSwgMHg0MDAwMCB8IDB4MTAwMDApOworICAgICAgICBsbWNfZGVsYXkgKCk7CisgICAgICAgIC8qIF9fU0xPV19ET1dOX0lPOyAqLworICAgIH0KKworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19taWlfcmVhZHJlZyBvdXQiKTsKKworICAgIHJldHVybiAocmV0dmFsID4+IDEpICYgMHhmZmZmOworfQorCit2b2lkIGxtY19taWlfd3JpdGVyZWcgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIHVuc2lnbmVkIGRldmFkZHIsIHVuc2lnbmVkIHJlZ25vLCB1bnNpZ25lZCBkYXRhKSAvKmZvbGQwMCovCit7CisgICAgaW50IGkgPSAzMjsKKyAgICBpbnQgY29tbWFuZCA9ICgweDUwMDIgPDwgMTYpIHwgKGRldmFkZHIgPDwgMjMpIHwgKHJlZ25vIDw8IDE4KSB8IGRhdGE7CisKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfbWlpX3dyaXRlcmVnIGluIik7CisKKyAgICBMTUNfTUlJX1NZTkMgKHNjKTsKKworICAgIGkgPSAzMTsKKyAgICB3aGlsZSAoaSA+PSAwKQorICAgIHsKKyAgICAgICAgaW50IGRhdGF2OworCisgICAgICAgIGlmIChjb21tYW5kICYgKDEgPDwgaSkpCisgICAgICAgICAgICBkYXRhdiA9IDB4MjAwMDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRhdGF2ID0gMHgwMDAwMDsKKworICAgICAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyXzksIGRhdGF2KTsKKyAgICAgICAgbG1jX2RlbGF5ICgpOworICAgICAgICAvKiBfX1NMT1dfRE9XTl9JTzsgKi8KKyAgICAgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl85LCAoZGF0YXYgfCAweDEwMDAwKSk7CisgICAgICAgIGxtY19kZWxheSAoKTsKKyAgICAgICAgLyogX19TTE9XX0RPV05fSU87ICovCisgICAgICAgIGktLTsKKyAgICB9CisKKyAgICBpID0gMjsKKyAgICB3aGlsZSAoaSA+IDApCisgICAgeworICAgICAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyXzksIDB4NDAwMDApOworICAgICAgICBsbWNfZGVsYXkgKCk7CisgICAgICAgIC8qIF9fU0xPV19ET1dOX0lPOyAqLworICAgICAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyXzksIDB4NTAwMDApOworICAgICAgICBsbWNfZGVsYXkgKCk7CisgICAgICAgIC8qIF9fU0xPV19ET1dOX0lPOyAqLworICAgICAgICBpLS07CisgICAgfQorCisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX21paV93cml0ZXJlZyBvdXQiKTsKK30KKworc3RhdGljIHZvaWQgbG1jX3NvZnRyZXNldCAobG1jX3NvZnRjX3QgKiBjb25zdCBzYykgLypmb2xkMDAqLworeworICAgIGludCBpOworCisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX3NvZnRyZXNldCBpbiIpOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgcmVjZWl2ZSByaW5ncyBhbmQgYnVmZmVycy4gKi8KKyAgICBzYy0+bG1jX3R4ZnVsbCA9IDA7CisgICAgc2MtPmxtY19uZXh0X3J4ID0gMDsKKyAgICBzYy0+bG1jX25leHRfdHggPSAwOworICAgIHNjLT5sbWNfdGFpbnRfcnggPSAwOworICAgIHNjLT5sbWNfdGFpbnRfdHggPSAwOworCisgICAgLyoKKyAgICAgKiBTZXR1cCBlYWNoIG9uZSBvZiB0aGUgcmVjZWl2ZXIgYnVmZmVycworICAgICAqIGFsbG9jYXRlIGFuIHNrYnVmZiBmb3IgZWFjaCBvbmUsIHNldHVwIHRoZSBkZXNjcmlwdG9yIHRhYmxlCisgICAgICogYW5kIHBvaW50IGVhY2ggYnVmZmVyIGF0IHRoZSBuZXh0IG9uZQorICAgICAqLworCisgICAgZm9yIChpID0gMDsgaSA8IExNQ19SWERFU0NTOyBpKyspCisgICAgeworICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisgICAgICAgIGlmIChzYy0+bG1jX3J4cVtpXSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBza2IgPSBkZXZfYWxsb2Nfc2tiIChMTUNfUEtUX0JVRl9TWiArIDIpOworICAgICAgICAgICAgaWYoc2tiID09IE5VTEwpeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgcmVjZWl2ZXIgcmluZywgd2lsbCB0cnkgYWdhaW5cbiIsIHNjLT5uYW1lKTsKKyAgICAgICAgICAgICAgICBzYy0+ZmFpbGVkX3JpbmcgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICBzYy0+bG1jX3J4cVtpXSA9IHNrYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNrYiA9IHNjLT5sbWNfcnhxW2ldOworICAgICAgICB9CisKKyAgICAgICAgc2tiLT5kZXYgPSBzYy0+bG1jX2RldmljZTsKKworICAgICAgICAvKiBvd25lZCBieSAyMTE0MCAqLworICAgICAgICBzYy0+bG1jX3J4cmluZ1tpXS5zdGF0dXMgPSAweDgwMDAwMDAwOworCisgICAgICAgIC8qIHVzZWQgdG8gYmUgUEtUX0JVRl9TWiBub3cgdXNlcyBza2Igc2luY2Ugd2UgbG9zZSBzb21lIHRvIGhlYWQgcm9vbSAqLworICAgICAgICBzYy0+bG1jX3J4cmluZ1tpXS5sZW5ndGggPSBza2ItPmVuZCAtIHNrYi0+ZGF0YTsKKworICAgICAgICAvKiB1c2UgdG8gYmUgdGFpbCB3aGljaCBpcyBkdW1iIHNpbmNlIHlvdSdyZSB0aGlua2luZyB3aHkgd3JpdGUKKyAgICAgICAgICogdG8gdGhlIGVuZCBvZiB0aGUgcGFja2osZXQgYnV0IHNpbmNlIHRoZXJlJ3Mgbm90aGluZyB0aGVyZSB0YWlsID09IGRhdGEKKyAgICAgICAgICovCisgICAgICAgIHNjLT5sbWNfcnhyaW5nW2ldLmJ1ZmZlcjEgPSB2aXJ0X3RvX2J1cyAoc2tiLT5kYXRhKTsKKworICAgICAgICAvKiBUaGlzIGlzIGZhaXIgc2luY2UgdGhlIHN0cnVjdHVyZSBpcyBzdGF0aWMgYW5kIHdlIGhhdmUgdGhlIG5leHQgYWRkcmVzcyAqLworICAgICAgICBzYy0+bG1jX3J4cmluZ1tpXS5idWZmZXIyID0gdmlydF90b19idXMgKCZzYy0+bG1jX3J4cmluZ1tpICsgMV0pOworCisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZXRzIGVuZCBvZiByaW5nCisgICAgICovCisgICAgc2MtPmxtY19yeHJpbmdbaSAtIDFdLmxlbmd0aCB8PSAweDAyMDAwMDAwOyAvKiBTZXQgZW5kIG9mIGJ1ZmZlcnMgZmxhZyAqLworICAgIHNjLT5sbWNfcnhyaW5nW2kgLSAxXS5idWZmZXIyID0gdmlydF90b19idXMgKCZzYy0+bG1jX3J4cmluZ1swXSk7IC8qIFBvaW50IGJhY2sgdG8gdGhlIHN0YXJ0ICovCisgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9yeGxpc3QsIHZpcnRfdG9fYnVzIChzYy0+bG1jX3J4cmluZykpOyAvKiB3cml0ZSBiYXNlIGFkZHJlc3MgKi8KKworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgdHJhbnNtaXQgcmluZ3MgYW5kIGJ1ZmZlcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTE1DX1RYREVTQ1M7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChzYy0+bG1jX3R4cVtpXSAhPSBOVUxMKXsJCS8qIGhhdmUgYnVmZmVyICovCisgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiKHNjLT5sbWNfdHhxW2ldKTsJLyogZnJlZSBpdCAqLworICAgICAgICAgICAgc2MtPnN0YXRzLnR4X2Ryb3BwZWQrKzsgICAgICAvKiBXZSBqdXN0IGRyb3BwZWQgYSBwYWNrZXQgKi8KKyAgICAgICAgfQorICAgICAgICBzYy0+bG1jX3R4cVtpXSA9IE5VTEw7CisgICAgICAgIHNjLT5sbWNfdHhyaW5nW2ldLnN0YXR1cyA9IDB4MDAwMDAwMDA7CisgICAgICAgIHNjLT5sbWNfdHhyaW5nW2ldLmJ1ZmZlcjIgPSB2aXJ0X3RvX2J1cyAoJnNjLT5sbWNfdHhyaW5nW2kgKyAxXSk7CisgICAgfQorICAgIHNjLT5sbWNfdHhyaW5nW2kgLSAxXS5idWZmZXIyID0gdmlydF90b19idXMgKCZzYy0+bG1jX3R4cmluZ1swXSk7CisgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl90eGxpc3QsIHZpcnRfdG9fYnVzIChzYy0+bG1jX3R4cmluZykpOworCisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX3NvZnRyZXNldCBvdXQiKTsKK30KKwordm9pZCBsbWNfZ3Bpb19ta2lucHV0KGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIHVfaW50MzJfdCBiaXRzKSAvKmZvbGQwMCovCit7CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX2dwaW9fbWtpbnB1dCBpbiIpOworICAgIHNjLT5sbWNfZ3Bpb19pbyAmPSB+Yml0czsKKyAgICBMTUNfQ1NSX1dSSVRFKHNjLCBjc3JfZ3AsIFRVTElQX0dQX1BJTlNFVCB8IChzYy0+bG1jX2dwaW9faW8pKTsKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfZ3Bpb19ta2lucHV0IG91dCIpOworfQorCit2b2lkIGxtY19ncGlvX21rb3V0cHV0KGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIHVfaW50MzJfdCBiaXRzKSAvKmZvbGQwMCovCit7CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX2dwaW9fbWtvdXRwdXQgaW4iKTsKKyAgICBzYy0+bG1jX2dwaW9faW8gfD0gYml0czsKKyAgICBMTUNfQ1NSX1dSSVRFKHNjLCBjc3JfZ3AsIFRVTElQX0dQX1BJTlNFVCB8IChzYy0+bG1jX2dwaW9faW8pKTsKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfZ3Bpb19ta291dHB1dCBvdXQiKTsKK30KKwordm9pZCBsbWNfbGVkX29uKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIHVfaW50MzJfdCBsZWQpIC8qZm9sZDAwKi8KK3sKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfbGVkX29uIGluIik7CisgICAgaWYoKH5zYy0+bG1jX21paXJlZzE2KSAmIGxlZCl7IC8qIEFscmVhZHkgb24hICovCisgICAgICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19sZWRfb24gYW9uIG91dCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIHNjLT5sbWNfbWlpcmVnMTYgJj0gfmxlZDsKKyAgICBsbWNfbWlpX3dyaXRlcmVnKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX2xlZF9vbiBvdXQiKTsKK30KKwordm9pZCBsbWNfbGVkX29mZihsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCB1X2ludDMyX3QgbGVkKSAvKmZvbGQwMCovCit7CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX2xlZF9vZmYgaW4iKTsKKyAgICBpZihzYy0+bG1jX21paXJlZzE2ICYgbGVkKXsgLyogQWxyZWFkeSBzZXQgZG9uJ3QgZG8gYW55dGhpbmcgKi8KKyAgICAgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX2xlZF9vZmYgYW9mZiBvdXQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBzYy0+bG1jX21paXJlZzE2IHw9IGxlZDsKKyAgICBsbWNfbWlpX3dyaXRlcmVnKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX2xlZF9vZmYgb3V0Iik7Cit9CisKK3N0YXRpYyB2b2lkIGxtY19yZXNldChsbWNfc29mdGNfdCAqIGNvbnN0IHNjKSAvKmZvbGQwMCovCit7CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX3Jlc2V0IGluIik7CisgICAgc2MtPmxtY19taWlyZWcxNiB8PSBMTUNfTUlJMTZfRklGT19SRVNFVDsKKyAgICBsbWNfbWlpX3dyaXRlcmVnKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7CisKKyAgICBzYy0+bG1jX21paXJlZzE2ICY9IH5MTUNfTUlJMTZfRklGT19SRVNFVDsKKyAgICBsbWNfbWlpX3dyaXRlcmVnKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7CisKKyAgICAvKgorICAgICAqIG1ha2Ugc29tZSBvZiB0aGUgR1BJTyBwaW5zIGJlIG91dHB1dHMKKyAgICAgKi8KKyAgICBsbWNfZ3Bpb19ta291dHB1dChzYywgTE1DX0dFUF9SRVNFVCk7CisKKyAgICAvKgorICAgICAqIFJFU0VUIGxvdyB0byBmb3JjZSBzdGF0ZSByZXNldC4gIFRoaXMgYWxzbyBmb3JjZXMKKyAgICAgKiB0aGUgdHJhbnNtaXR0ZXIgY2xvY2sgdG8gYmUgaW50ZXJuYWwsIGJ1dCB3ZSBleHBlY3QgdG8gcmVzZXQKKyAgICAgKiB0aGF0IGxhdGVyIGFueXdheS4KKyAgICAgKi8KKyAgICBzYy0+bG1jX2dwaW8gJj0gfihMTUNfR0VQX1JFU0VUKTsKKyAgICBMTUNfQ1NSX1dSSVRFKHNjLCBjc3JfZ3AsIHNjLT5sbWNfZ3Bpbyk7CisKKyAgICAvKgorICAgICAqIGhvbGQgZm9yIG1vcmUgdGhhbiAxMCBtaWNyb3NlY29uZHMKKyAgICAgKi8KKyAgICB1ZGVsYXkoNTApOworCisgICAgLyoKKyAgICAgKiBzdG9wIGRyaXZpbmcgWGlsaW54LXJlbGF0ZWQgc2lnbmFscworICAgICAqLworICAgIGxtY19ncGlvX21raW5wdXQoc2MsIExNQ19HRVBfUkVTRVQpOworCisgICAgLyoKKyAgICAgKiBDYWxsIG1lZGlhIHNwZWNpZmljIGluaXQgcm91dGluZQorICAgICAqLworICAgIHNjLT5sbWNfbWVkaWEtPmluaXQoc2MpOworCisgICAgc2MtPnN0YXRzLnJlc2V0Q291bnQrKzsKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfcmVzZXQgb3V0Iik7Cit9CisKK3N0YXRpYyB2b2lkIGxtY19kZWNfcmVzZXQobG1jX3NvZnRjX3QgKiBjb25zdCBzYykgLypmb2xkMDAqLworeworICAgIHVfaW50MzJfdCB2YWw7CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX2RlY19yZXNldCBpbiIpOworCisgICAgLyoKKyAgICAgKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzCisgICAgICovCisgICAgc2MtPmxtY19pbnRybWFzayA9IDA7CisgICAgTE1DX0NTUl9XUklURShzYywgY3NyX2ludHIsIHNjLT5sbWNfaW50cm1hc2spOworCisgICAgLyoKKyAgICAgKiBSZXNldCB0aGUgY2hpcCB3aXRoIGEgc29mdHdhcmUgcmVzZXQgY29tbWFuZC4KKyAgICAgKiBXYWl0IDEwIG1pY3Jvc2Vjb25kcyAoYWN0dWFsbHkgNTAgUENJIGN5Y2xlcyBidXQgYXQKKyAgICAgKiAzM01IeiB0aGF0IGNvbWVzIHRvIHR3byBtaWNyb3NlY29uZHMgYnV0IHdhaXQgYQorICAgICAqIGJpdCBsb25nZXIgYW55d2F5cykKKyAgICAgKi8KKyAgICBMTUNfQ1NSX1dSSVRFKHNjLCBjc3JfYnVzbW9kZSwgVFVMSVBfQlVTTU9ERV9TV1JFU0VUKTsKKyAgICB1ZGVsYXkoMjUpOworI2lmZGVmIF9fc3BhcmNfXworICAgIHNjLT5sbWNfYnVzbW9kZSA9IExNQ19DU1JfUkVBRChzYywgY3NyX2J1c21vZGUpOworICAgIHNjLT5sbWNfYnVzbW9kZSA9IDB4MDAxMDAwMDA7CisgICAgc2MtPmxtY19idXNtb2RlICY9IH5UVUxJUF9CVVNNT0RFX1NXUkVTRVQ7CisgICAgTE1DX0NTUl9XUklURShzYywgY3NyX2J1c21vZGUsIHNjLT5sbWNfYnVzbW9kZSk7CisjZW5kaWYKKyAgICBzYy0+bG1jX2NtZG1vZGUgPSBMTUNfQ1NSX1JFQUQoc2MsIGNzcl9jb21tYW5kKTsKKworICAgIC8qCisgICAgICogV2Ugd2FudDoKKyAgICAgKiAgIG5vIGV0aGVybmV0IGFkZHJlc3MgaW4gZnJhbWVzIHdlIHdyaXRlCisgICAgICogICBkaXNhYmxlIHBhZGRpbmcgKHR4ZGVzYywgcGFkZGluZyBkaXNhYmxlKQorICAgICAqICAgaWdub3JlIHJ1bnQgZnJhbWVzIChyZGVzMCBiaXQgMTUpCisgICAgICogICBubyByZWNlaXZlciB3YXRjaGRvZyBvciB0cmFuc21pdHRlciBqYWJiZXIgdGltZXIKKyAgICAgKiAgICAgICAoY3NyMTUgYml0IDAsMTQgPT0gMSkKKyAgICAgKiAgIGlmIHVzaW5nIDE2LWJpdCBDUkMsIHR1cm4gb2ZmIENSQyAodHJhbnMgZGVzYywgY3JjIGRpc2FibGUpCisgICAgICovCisKKyAgICBzYy0+bG1jX2NtZG1vZGUgfD0gKCBUVUxJUF9DTURfUFJPTUlTQ1VPVVMKKyAgICAgICAgICAgICAgICAgICAgICAgICB8IFRVTElQX0NNRF9GVUxMRFVQTEVYCisgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVUxJUF9DTURfUEFTU0JBRFBLVAorICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFVMSVBfQ01EX05PSEVBUlRCRUFUCisgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVUxJUF9DTURfUE9SVFNFTEVDVAorICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFVMSVBfQ01EX1JFQ0VJVkVBTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICB8IFRVTElQX0NNRF9NVVNUQkVPTkUKKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICBzYy0+bG1jX2NtZG1vZGUgJj0gfiggVFVMSVBfQ01EX09QRVJNT0RFCisgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFVMSVBfQ01EX1RIUkVTSE9MRENUTAorICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRVTElQX0NNRF9TVE9SRUZXRAorICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRVTElQX0NNRF9UWFRIUlNITERDVEwKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICBMTUNfQ1NSX1dSSVRFKHNjLCBjc3JfY29tbWFuZCwgc2MtPmxtY19jbWRtb2RlKTsKKworICAgIC8qCisgICAgICogZGlzYWJsZSByZWNlaXZlciB3YXRjaGRvZyBhbmQgdHJhbnNtaXQgamFiYmVyCisgICAgICovCisgICAgdmFsID0gTE1DX0NTUl9SRUFEKHNjLCBjc3Jfc2lhX2dlbmVyYWwpOworICAgIHZhbCB8PSAoVFVMSVBfV0FUQ0hET0dfVFhESVNBQkxFIHwgVFVMSVBfV0FUQ0hET0dfUlhESVNBQkxFKTsKKyAgICBMTUNfQ1NSX1dSSVRFKHNjLCBjc3Jfc2lhX2dlbmVyYWwsIHZhbCk7CisKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfZGVjX3Jlc2V0IG91dCIpOworfQorCitzdGF0aWMgdm9pZCBsbWNfaW5pdGNzcnMobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgbG1jX2NzcnB0cl90IGNzcl9iYXNlLCAvKmZvbGQwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNzcl9zaXplKQoreworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19pbml0Y3NycyBpbiIpOworICAgIHNjLT5sbWNfY3Nycy5jc3JfYnVzbW9kZQkgICAgICAgID0gY3NyX2Jhc2UgKyAgMCAqIGNzcl9zaXplOworICAgIHNjLT5sbWNfY3Nycy5jc3JfdHhwb2xsCQk9IGNzcl9iYXNlICsgIDEgKiBjc3Jfc2l6ZTsKKyAgICBzYy0+bG1jX2NzcnMuY3NyX3J4cG9sbAkJPSBjc3JfYmFzZSArICAyICogY3NyX3NpemU7CisgICAgc2MtPmxtY19jc3JzLmNzcl9yeGxpc3QJCT0gY3NyX2Jhc2UgKyAgMyAqIGNzcl9zaXplOworICAgIHNjLT5sbWNfY3Nycy5jc3JfdHhsaXN0CQk9IGNzcl9iYXNlICsgIDQgKiBjc3Jfc2l6ZTsKKyAgICBzYy0+bG1jX2NzcnMuY3NyX3N0YXR1cwkJPSBjc3JfYmFzZSArICA1ICogY3NyX3NpemU7CisgICAgc2MtPmxtY19jc3JzLmNzcl9jb21tYW5kCSAgICAgICAgPSBjc3JfYmFzZSArICA2ICogY3NyX3NpemU7CisgICAgc2MtPmxtY19jc3JzLmNzcl9pbnRyCQk9IGNzcl9iYXNlICsgIDcgKiBjc3Jfc2l6ZTsKKyAgICBzYy0+bG1jX2NzcnMuY3NyX21pc3NlZF9mcmFtZXMJPSBjc3JfYmFzZSArICA4ICogY3NyX3NpemU7CisgICAgc2MtPmxtY19jc3JzLmNzcl85CQkgICAgICAgID0gY3NyX2Jhc2UgKyAgOSAqIGNzcl9zaXplOworICAgIHNjLT5sbWNfY3Nycy5jc3JfMTAJCSAgICAgICAgPSBjc3JfYmFzZSArIDEwICogY3NyX3NpemU7CisgICAgc2MtPmxtY19jc3JzLmNzcl8xMQkJICAgICAgICA9IGNzcl9iYXNlICsgMTEgKiBjc3Jfc2l6ZTsKKyAgICBzYy0+bG1jX2NzcnMuY3NyXzEyCQkgICAgICAgID0gY3NyX2Jhc2UgKyAxMiAqIGNzcl9zaXplOworICAgIHNjLT5sbWNfY3Nycy5jc3JfMTMJCSAgICAgICAgPSBjc3JfYmFzZSArIDEzICogY3NyX3NpemU7CisgICAgc2MtPmxtY19jc3JzLmNzcl8xNAkJICAgICAgICA9IGNzcl9iYXNlICsgMTQgKiBjc3Jfc2l6ZTsKKyAgICBzYy0+bG1jX2NzcnMuY3NyXzE1CQkgICAgICAgID0gY3NyX2Jhc2UgKyAxNSAqIGNzcl9zaXplOworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19pbml0Y3NycyBvdXQiKTsKK30KKworc3RhdGljIHZvaWQgbG1jX2RyaXZlcl90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsgLypmb2xkMDAqLworICAgIGxtY19zb2Z0Y190ICpzYzsKKyAgICB1MzIgY3NyNjsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgbG1jX3RyYWNlKGRldiwgImxtY19kcml2ZXJfdGltZW91dCBpbiIpOworCisgICAgc2MgPSBkZXYtPnByaXY7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmc2MtPmxtY19sb2NrLCBmbGFncyk7CisKKyAgICBwcmludGsoIiVzOiBYbWl0dGVyIGJ1c3l8XG4iLCBkZXYtPm5hbWUpOworCisgICAgc2MtPnN0YXRzLnR4X3RidXN5X2NhbGxzKysgOworICAgIGlmIChqaWZmaWVzIC0gZGV2LT50cmFuc19zdGFydCA8IFRYX1RJTUVPVVQpIHsKKyAgICAgICAgZ290byBidWdfb3V0OworICAgIH0KKworICAgIC8qCisgICAgICogQ2hpcCBzZWVtcyB0byBoYXZlIGxvY2tlZCB1cAorICAgICAqIFJlc2V0IGl0CisgICAgICogVGhpcyB3aGlwcyBvdXQgYWxsIG91ciBkZWNyaXB0b3IKKyAgICAgKiB0YWJsZSBhbmQgc3RhcnRzIGZyb20gc2NhcnRjaAorICAgICAqLworCisgICAgTE1DX0VWRU5UX0xPRyhMTUNfRVZFTlRfWE1UUFJDVE1PLAorICAgICAgICAgICAgICAgICAgTE1DX0NTUl9SRUFEIChzYywgY3NyX3N0YXR1cyksCisgICAgICAgICAgICAgICAgICBzYy0+c3RhdHMudHhfUHJvY1RpbWVvdXQpOworCisgICAgbG1jX3J1bm5pbmdfcmVzZXQgKGRldik7CisKKyAgICBMTUNfRVZFTlRfTE9HKExNQ19FVkVOVF9SRVNFVDEsIExNQ19DU1JfUkVBRCAoc2MsIGNzcl9zdGF0dXMpLCAwKTsKKyAgICBMTUNfRVZFTlRfTE9HKExNQ19FVkVOVF9SRVNFVDIsCisgICAgICAgICAgICAgICAgICBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNiksCisgICAgICAgICAgICAgICAgICBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNykpOworCisgICAgLyogcmVzdGFydCB0aGUgdHggcHJvY2Vzc2VzICovCisgICAgY3NyNiA9IExNQ19DU1JfUkVBRCAoc2MsIGNzcl9jb21tYW5kKTsKKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2NvbW1hbmQsIGNzcjYgfCAweDAwMDIpOworICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfY29tbWFuZCwgY3NyNiB8IDB4MjAwMik7CisKKyAgICAvKiBpbW1lZGlhdGUgdHJhbnNtaXQgKi8KKyAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX3R4cG9sbCwgMCk7CisKKyAgICBzYy0+c3RhdHMudHhfZXJyb3JzKys7CisgICAgc2MtPnN0YXRzLnR4X1Byb2NUaW1lb3V0Kys7CS8qIC1iYXogKi8KKworICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCitidWdfb3V0OgorCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2MtPmxtY19sb2NrLCBmbGFncyk7CisKKyAgICBsbWNfdHJhY2UoZGV2LCAibG1jX2RyaXZlcl90aW1vdXQgb3V0Iik7CisKKworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfbWVkaWEuYyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX21lZGlhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1Y2U3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX21lZGlhLmMKQEAgLTAsMCArMSwxMjQ2IEBACisvKiAkSWQ6IGxtY19tZWRpYS5jLHYgMS4xMyAyMDAwLzA0LzExIDA1OjI1OjI2IGFzaiBFeHAgJCAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8bmV0L3N5bmNwcHAuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4gICAgICAgICAgICAgLyogUHJvY2Vzc29yIHR5cGUgZm9yIGNhY2hlIGFsaWdubWVudC4gKi8KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAibG1jLmgiCisjaW5jbHVkZSAibG1jX3Zhci5oIgorI2luY2x1ZGUgImxtY19pb2N0bC5oIgorI2luY2x1ZGUgImxtY19kZWJ1Zy5oIgorCisjZGVmaW5lIENPTkZJR19MTUNfSUdOT1JFX0hBUkRXQVJFX0hBTkRTSEFLRSAxCisKKyAvKgorICAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDAwIExBTiBNZWRpYSBDb3Jwb3JhdGlvbiAoTE1DKQorICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICB3d3cubGFubWVkaWEuY29tCisgICoKKyAgKiBUaGlzIGNvZGUgaXMgd3JpdHRlbiBieToKKyAgKiBBbmRyZXcgU3RhbmxleS1Kb25lcyAoYXNqQGNiYW4uY29tKQorICAqIFJvYiBCcmF1biAoYmJyYXVuQHZpeC5jb20pLAorICAqIE1pY2hhZWwgR3JhZmYgKGV4cGxvcmVyQHZpeC5jb20pIGFuZAorICAqIE1hdHQgVGhvbWFzIChtYXR0QDNhbS1zb2Z0d2FyZS5jb20pLgorICAqCisgICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICAqLworCisvKgorICogRm9yIGxhY2sgb2YgYSBiZXR0ZXIgcGxhY2UsIHB1dCB0aGUgU1NJIGNhYmxlIHN0dWZmIGhlcmUuCisgKi8KK2NoYXIgKmxtY190MV9jYWJsZXNbXSA9IHsKKyAgIlYuMTAvUlM0MjMiLCAiRUlBNTMwQSIsICJyZXNlcnZlZCIsICJYLjIxIiwgIlYuMzUiLAorICAiRUlBNDQ5L0VJQTUzMC9WLjM2IiwgIlYuMjgvRUlBMjMyIiwgIm5vbmUiLCBOVUxMCit9OworCisvKgorICogcHJvdG9jb2wgaW5kZXBlbmRlbnQgbWV0aG9kLgorICovCitzdGF0aWMgdm9pZCBsbWNfc2V0X3Byb3RvY29sIChsbWNfc29mdGNfdCAqIGNvbnN0LCBsbWNfY3RsX3QgKik7CisKKy8qCisgKiBtZWRpYSBpbmRlcGVuZGVudCBtZXRob2RzIHRvIGNoZWNrIG9uIG1lZGlhIHN0YXR1cywgbGluaywgbGlnaHQgTEVEcywKKyAqIGV0Yy4KKyAqLworc3RhdGljIHZvaWQgbG1jX2RzM19pbml0IChsbWNfc29mdGNfdCAqIGNvbnN0KTsKK3N0YXRpYyB2b2lkIGxtY19kczNfZGVmYXVsdCAobG1jX3NvZnRjX3QgKiBjb25zdCk7CitzdGF0aWMgdm9pZCBsbWNfZHMzX3NldF9zdGF0dXMgKGxtY19zb2Z0Y190ICogY29uc3QsIGxtY19jdGxfdCAqKTsKK3N0YXRpYyB2b2lkIGxtY19kczNfc2V0XzEwMGZ0IChsbWNfc29mdGNfdCAqIGNvbnN0LCBpbnQpOworc3RhdGljIGludCBsbWNfZHMzX2dldF9saW5rX3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCk7CitzdGF0aWMgdm9pZCBsbWNfZHMzX3NldF9jcmNfbGVuZ3RoIChsbWNfc29mdGNfdCAqIGNvbnN0LCBpbnQpOworc3RhdGljIHZvaWQgbG1jX2RzM19zZXRfc2NyYW0gKGxtY19zb2Z0Y190ICogY29uc3QsIGludCk7CitzdGF0aWMgdm9pZCBsbWNfZHMzX3dhdGNoZG9nIChsbWNfc29mdGNfdCAqIGNvbnN0KTsKKworc3RhdGljIHZvaWQgbG1jX2hzc2lfaW5pdCAobG1jX3NvZnRjX3QgKiBjb25zdCk7CitzdGF0aWMgdm9pZCBsbWNfaHNzaV9kZWZhdWx0IChsbWNfc29mdGNfdCAqIGNvbnN0KTsKK3N0YXRpYyB2b2lkIGxtY19oc3NpX3NldF9zdGF0dXMgKGxtY19zb2Z0Y190ICogY29uc3QsIGxtY19jdGxfdCAqKTsKK3N0YXRpYyB2b2lkIGxtY19oc3NpX3NldF9jbG9jayAobG1jX3NvZnRjX3QgKiBjb25zdCwgaW50KTsKK3N0YXRpYyBpbnQgbG1jX2hzc2lfZ2V0X2xpbmtfc3RhdHVzIChsbWNfc29mdGNfdCAqIGNvbnN0KTsKK3N0YXRpYyB2b2lkIGxtY19oc3NpX3NldF9saW5rX3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCwgaW50KTsKK3N0YXRpYyB2b2lkIGxtY19oc3NpX3NldF9jcmNfbGVuZ3RoIChsbWNfc29mdGNfdCAqIGNvbnN0LCBpbnQpOworc3RhdGljIHZvaWQgbG1jX2hzc2lfd2F0Y2hkb2cgKGxtY19zb2Z0Y190ICogY29uc3QpOworCitzdGF0aWMgdm9pZCBsbWNfc3NpX2luaXQgKGxtY19zb2Z0Y190ICogY29uc3QpOworc3RhdGljIHZvaWQgbG1jX3NzaV9kZWZhdWx0IChsbWNfc29mdGNfdCAqIGNvbnN0KTsKK3N0YXRpYyB2b2lkIGxtY19zc2lfc2V0X3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCwgbG1jX2N0bF90ICopOworc3RhdGljIHZvaWQgbG1jX3NzaV9zZXRfY2xvY2sgKGxtY19zb2Z0Y190ICogY29uc3QsIGludCk7CitzdGF0aWMgdm9pZCBsbWNfc3NpX3NldF9zcGVlZCAobG1jX3NvZnRjX3QgKiBjb25zdCwgbG1jX2N0bF90ICopOworc3RhdGljIGludCBsbWNfc3NpX2dldF9saW5rX3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCk7CitzdGF0aWMgdm9pZCBsbWNfc3NpX3NldF9saW5rX3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCwgaW50KTsKK3N0YXRpYyB2b2lkIGxtY19zc2lfc2V0X2NyY19sZW5ndGggKGxtY19zb2Z0Y190ICogY29uc3QsIGludCk7CitzdGF0aWMgdm9pZCBsbWNfc3NpX3dhdGNoZG9nIChsbWNfc29mdGNfdCAqIGNvbnN0KTsKKworc3RhdGljIHZvaWQgbG1jX3QxX2luaXQgKGxtY19zb2Z0Y190ICogY29uc3QpOworc3RhdGljIHZvaWQgbG1jX3QxX2RlZmF1bHQgKGxtY19zb2Z0Y190ICogY29uc3QpOworc3RhdGljIHZvaWQgbG1jX3QxX3NldF9zdGF0dXMgKGxtY19zb2Z0Y190ICogY29uc3QsIGxtY19jdGxfdCAqKTsKK3N0YXRpYyBpbnQgbG1jX3QxX2dldF9saW5rX3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCk7CitzdGF0aWMgdm9pZCBsbWNfdDFfc2V0X2NpcmN1aXRfdHlwZSAobG1jX3NvZnRjX3QgKiBjb25zdCwgaW50KTsKK3N0YXRpYyB2b2lkIGxtY190MV9zZXRfY3JjX2xlbmd0aCAobG1jX3NvZnRjX3QgKiBjb25zdCwgaW50KTsKK3N0YXRpYyB2b2lkIGxtY190MV9zZXRfY2xvY2sgKGxtY19zb2Z0Y190ICogY29uc3QsIGludCk7CitzdGF0aWMgdm9pZCBsbWNfdDFfd2F0Y2hkb2cgKGxtY19zb2Z0Y190ICogY29uc3QpOworCitzdGF0aWMgdm9pZCBsbWNfZHVtbXlfc2V0XzEgKGxtY19zb2Z0Y190ICogY29uc3QsIGludCk7CitzdGF0aWMgdm9pZCBsbWNfZHVtbXlfc2V0Ml8xIChsbWNfc29mdGNfdCAqIGNvbnN0LCBsbWNfY3RsX3QgKik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9hdjkxMTBfYml0IChsbWNfc29mdGNfdCAqLCBpbnQpOworc3RhdGljIHZvaWQgd3JpdGVfYXY5MTEwIChsbWNfc29mdGNfdCAqLCB1X2ludDMyX3QsIHVfaW50MzJfdCwgdV9pbnQzMl90LAorCQkJICB1X2ludDMyX3QsIHVfaW50MzJfdCk7CisKK2xtY19tZWRpYV90IGxtY19kczNfbWVkaWEgPSB7CisgIGxtY19kczNfaW5pdCwJCQkvKiBzcGVjaWFsIG1lZGlhIGluaXQgc3R1ZmYgKi8KKyAgbG1jX2RzM19kZWZhdWx0LAkJLyogcmVzZXQgdG8gZGVmYXVsdCBzdGF0ZSAqLworICBsbWNfZHMzX3NldF9zdGF0dXMsCQkvKiByZXNldCBzdGF0dXMgdG8gc3RhdGUgcHJvdmlkZWQgKi8KKyAgbG1jX2R1bW15X3NldF8xLAkJLyogc2V0IGNsb2NrIHNvdXJjZSAqLworICBsbWNfZHVtbXlfc2V0Ml8xLAkJLyogc2V0IGxpbmUgc3BlZWQgKi8KKyAgbG1jX2RzM19zZXRfMTAwZnQsCQkvKiBzZXQgY2FibGUgbGVuZ3RoICovCisgIGxtY19kczNfc2V0X3NjcmFtLAkJLyogc2V0IHNjcmFtYmxlciAqLworICBsbWNfZHMzX2dldF9saW5rX3N0YXR1cywJLyogZ2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBsaW5rIHN0YXR1cyAqLworICBsbWNfZHMzX3NldF9jcmNfbGVuZ3RoLAkvKiBzZXQgQ1JDIGxlbmd0aCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgVDEgb3IgRTEgY2lyY3VpdCB0eXBlICovCisgIGxtY19kczNfd2F0Y2hkb2cKK307CisKK2xtY19tZWRpYV90IGxtY19oc3NpX21lZGlhID0geworICBsbWNfaHNzaV9pbml0LAkJLyogc3BlY2lhbCBtZWRpYSBpbml0IHN0dWZmICovCisgIGxtY19oc3NpX2RlZmF1bHQsCQkvKiByZXNldCB0byBkZWZhdWx0IHN0YXRlICovCisgIGxtY19oc3NpX3NldF9zdGF0dXMsCQkvKiByZXNldCBzdGF0dXMgdG8gc3RhdGUgcHJvdmlkZWQgKi8KKyAgbG1jX2hzc2lfc2V0X2Nsb2NrLAkJLyogc2V0IGNsb2NrIHNvdXJjZSAqLworICBsbWNfZHVtbXlfc2V0Ml8xLAkJLyogc2V0IGxpbmUgc3BlZWQgKi8KKyAgbG1jX2R1bW15X3NldF8xLAkJLyogc2V0IGNhYmxlIGxlbmd0aCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgc2NyYW1ibGVyICovCisgIGxtY19oc3NpX2dldF9saW5rX3N0YXR1cywJLyogZ2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19oc3NpX3NldF9saW5rX3N0YXR1cywJLyogc2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19oc3NpX3NldF9jcmNfbGVuZ3RoLAkvKiBzZXQgQ1JDIGxlbmd0aCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgVDEgb3IgRTEgY2lyY3VpdCB0eXBlICovCisgIGxtY19oc3NpX3dhdGNoZG9nCit9OworCitsbWNfbWVkaWFfdCBsbWNfc3NpX21lZGlhID0geyBsbWNfc3NpX2luaXQsCS8qIHNwZWNpYWwgbWVkaWEgaW5pdCBzdHVmZiAqLworICBsbWNfc3NpX2RlZmF1bHQsCQkvKiByZXNldCB0byBkZWZhdWx0IHN0YXRlICovCisgIGxtY19zc2lfc2V0X3N0YXR1cywJCS8qIHJlc2V0IHN0YXR1cyB0byBzdGF0ZSBwcm92aWRlZCAqLworICBsbWNfc3NpX3NldF9jbG9jaywJCS8qIHNldCBjbG9jayBzb3VyY2UgKi8KKyAgbG1jX3NzaV9zZXRfc3BlZWQsCQkvKiBzZXQgbGluZSBzcGVlZCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgY2FibGUgbGVuZ3RoICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBzY3JhbWJsZXIgKi8KKyAgbG1jX3NzaV9nZXRfbGlua19zdGF0dXMsCS8qIGdldCBsaW5rIHN0YXR1cyAqLworICBsbWNfc3NpX3NldF9saW5rX3N0YXR1cywJLyogc2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19zc2lfc2V0X2NyY19sZW5ndGgsCS8qIHNldCBDUkMgbGVuZ3RoICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBUMSBvciBFMSBjaXJjdWl0IHR5cGUgKi8KKyAgbG1jX3NzaV93YXRjaGRvZworfTsKKworbG1jX21lZGlhX3QgbG1jX3QxX21lZGlhID0geworICBsbWNfdDFfaW5pdCwJCQkvKiBzcGVjaWFsIG1lZGlhIGluaXQgc3R1ZmYgKi8KKyAgbG1jX3QxX2RlZmF1bHQsCQkvKiByZXNldCB0byBkZWZhdWx0IHN0YXRlICovCisgIGxtY190MV9zZXRfc3RhdHVzLAkJLyogcmVzZXQgc3RhdHVzIHRvIHN0YXRlIHByb3ZpZGVkICovCisgIGxtY190MV9zZXRfY2xvY2ssCQkvKiBzZXQgY2xvY2sgc291cmNlICovCisgIGxtY19kdW1teV9zZXQyXzEsCQkvKiBzZXQgbGluZSBzcGVlZCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgY2FibGUgbGVuZ3RoICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBzY3JhbWJsZXIgKi8KKyAgbG1jX3QxX2dldF9saW5rX3N0YXR1cywJLyogZ2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBsaW5rIHN0YXR1cyAqLworICBsbWNfdDFfc2V0X2NyY19sZW5ndGgsCS8qIHNldCBDUkMgbGVuZ3RoICovCisgIGxtY190MV9zZXRfY2lyY3VpdF90eXBlLAkvKiBzZXQgVDEgb3IgRTEgY2lyY3VpdCB0eXBlICovCisgIGxtY190MV93YXRjaGRvZworfTsKKworc3RhdGljIHZvaWQKK2xtY19kdW1teV9zZXRfMSAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgaW50IGEpCit7Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfZHVtbXlfc2V0Ml8xIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBsbWNfY3RsX3QgKiBhKQoreworfQorCisvKgorICogIEhTU0kgbWV0aG9kcworICovCisKK3N0YXRpYyB2b2lkCitsbWNfaHNzaV9pbml0IChsbWNfc29mdGNfdCAqIGNvbnN0IHNjKQoreworICBzYy0+aWN0bC5jYXJkdHlwZSA9IExNQ19DVExfQ0FSRFRZUEVfTE1DNTIwMDsKKworICBsbWNfZ3Bpb19ta291dHB1dCAoc2MsIExNQ19HRVBfSFNTSV9DTE9DSyk7Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfaHNzaV9kZWZhdWx0IChsbWNfc29mdGNfdCAqIGNvbnN0IHNjKQoreworICBzYy0+bG1jX21paXJlZzE2ID0gTE1DX01JSTE2X0xFRF9BTEw7CisKKyAgc2MtPmxtY19tZWRpYS0+c2V0X2xpbmtfc3RhdHVzIChzYywgTE1DX0xJTktfRE9XTik7CisgIHNjLT5sbWNfbWVkaWEtPnNldF9jbG9ja19zb3VyY2UgKHNjLCBMTUNfQ1RMX0NMT0NLX1NPVVJDRV9FWFQpOworICBzYy0+bG1jX21lZGlhLT5zZXRfY3JjX2xlbmd0aCAoc2MsIExNQ19DVExfQ1JDX0xFTkdUSF8xNik7Cit9CisKKy8qCisgKiBHaXZlbiBhIHVzZXIgcHJvdmlkZWQgc3RhdGUsIHNldCBvdXJzZWx2ZXMgdXAgdG8gbWF0Y2ggaXQuICBUaGlzIHdpbGwKKyAqIGFsd2F5cyByZXNldCB0aGUgY2FyZCBpZiBuZWVkZWQuCisgKi8KK3N0YXRpYyB2b2lkCitsbWNfaHNzaV9zZXRfc3RhdHVzIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBsbWNfY3RsX3QgKiBjdGwpCit7CisgIGlmIChjdGwgPT0gTlVMTCkKKyAgICB7CisgICAgICBzYy0+bG1jX21lZGlhLT5zZXRfY2xvY2tfc291cmNlIChzYywgc2MtPmljdGwuY2xvY2tfc291cmNlKTsKKyAgICAgIGxtY19zZXRfcHJvdG9jb2wgKHNjLCBOVUxMKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKgorICAgKiBjaGVjayBmb3IgY2hhbmdlIGluIGNsb2NrIHNvdXJjZQorICAgKi8KKyAgaWYgKGN0bC0+Y2xvY2tfc291cmNlICYmICFzYy0+aWN0bC5jbG9ja19zb3VyY2UpCisgICAgeworICAgICAgc2MtPmxtY19tZWRpYS0+c2V0X2Nsb2NrX3NvdXJjZSAoc2MsIExNQ19DVExfQ0xPQ0tfU09VUkNFX0lOVCk7CisgICAgICBzYy0+bG1jX3RpbWluZyA9IExNQ19DVExfQ0xPQ0tfU09VUkNFX0lOVDsKKyAgICB9CisgIGVsc2UgaWYgKCFjdGwtPmNsb2NrX3NvdXJjZSAmJiBzYy0+aWN0bC5jbG9ja19zb3VyY2UpCisgICAgeworICAgICAgc2MtPmxtY190aW1pbmcgPSBMTUNfQ1RMX0NMT0NLX1NPVVJDRV9FWFQ7CisgICAgICBzYy0+bG1jX21lZGlhLT5zZXRfY2xvY2tfc291cmNlIChzYywgTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUKTsKKyAgICB9CisKKyAgbG1jX3NldF9wcm90b2NvbCAoc2MsIGN0bCk7Cit9CisKKy8qCisgKiAxID09IGludGVybmFsLCAwID09IGV4dGVybmFsCisgKi8KK3N0YXRpYyB2b2lkCitsbWNfaHNzaV9zZXRfY2xvY2sgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIGludCBpZSkKK3sKKyAgaW50IG9sZDsKKyAgb2xkID0gc2MtPmljdGwuY2xvY2tfc291cmNlOworICBpZiAoaWUgPT0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUKQorICAgIHsKKyAgICAgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX0hTU0lfQ0xPQ0s7CisgICAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2dwLCBzYy0+bG1jX2dwaW8pOworICAgICAgc2MtPmljdGwuY2xvY2tfc291cmNlID0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUOworICAgICAgaWYob2xkICE9IGllKQorICAgICAgICBwcmludGsgKExNQ19QUklOVEZfRk1UICI6IGNsb2NrIGV4dGVybmFsXG4iLCBMTUNfUFJJTlRGX0FSR1MpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNjLT5sbWNfZ3BpbyAmPSB+KExNQ19HRVBfSFNTSV9DTE9DSyk7CisgICAgICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2dwLCBzYy0+bG1jX2dwaW8pOworICAgICAgc2MtPmljdGwuY2xvY2tfc291cmNlID0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfSU5UOworICAgICAgaWYob2xkICE9IGllKQorICAgICAgICBwcmludGsgKExNQ19QUklOVEZfRk1UICI6IGNsb2NrIGludGVybmFsXG4iLCBMTUNfUFJJTlRGX0FSR1MpOworICAgIH0KK30KKworLyoKKyAqIHJldHVybiBoYXJkd2FyZSBsaW5rIHN0YXR1cy4KKyAqIDAgPT0gbGluayBpcyBkb3duLCAxID09IGxpbmsgaXMgdXAuCisgKi8KK3N0YXRpYyBpbnQKK2xtY19oc3NpX2dldF9saW5rX3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCBzYykKK3sKKyAgICAvKgorICAgICAqIFdlJ3JlIHVzaW5nIHRoZSBzYW1lIGNvZGUgYXMgU1NJIHNpbmNlCisgICAgICogdGhleSdyZSBwcmFjdGljYWxseSB0aGUgc2FtZQorICAgICAqLworICAgIHJldHVybiBsbWNfc3NpX2dldF9saW5rX3N0YXR1cyhzYyk7Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfaHNzaV9zZXRfbGlua19zdGF0dXMgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIGludCBzdGF0ZSkKK3sKKyAgaWYgKHN0YXRlID09IExNQ19MSU5LX1VQKQorICAgIHNjLT5sbWNfbWlpcmVnMTYgfD0gTE1DX01JSTE2X0hTU0lfVEE7CisgIGVsc2UKKyAgICBzYy0+bG1jX21paXJlZzE2ICY9IH5MTUNfTUlJMTZfSFNTSV9UQTsKKworICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTYsIHNjLT5sbWNfbWlpcmVnMTYpOworfQorCisvKgorICogMCA9PSAxNmJpdCwgMSA9PSAzMmJpdAorICovCitzdGF0aWMgdm9pZAorbG1jX2hzc2lfc2V0X2NyY19sZW5ndGggKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIGludCBzdGF0ZSkKK3sKKyAgaWYgKHN0YXRlID09IExNQ19DVExfQ1JDX0xFTkdUSF8zMikKKyAgICB7CisgICAgICAvKiAzMiBiaXQgKi8KKyAgICAgIHNjLT5sbWNfbWlpcmVnMTYgfD0gTE1DX01JSTE2X0hTU0lfQ1JDOworICAgICAgc2MtPmljdGwuY3JjX2xlbmd0aCA9IExNQ19DVExfQ1JDX0xFTkdUSF8zMjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiAxNiBiaXQgKi8KKyAgICAgIHNjLT5sbWNfbWlpcmVnMTYgJj0gfkxNQ19NSUkxNl9IU1NJX0NSQzsKKyAgICAgIHNjLT5pY3RsLmNyY19sZW5ndGggPSBMTUNfQ1RMX0NSQ19MRU5HVEhfMTY7CisgICAgfQorCisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfaHNzaV93YXRjaGRvZyAobG1jX3NvZnRjX3QgKiBjb25zdCBzYykKK3sKKyAgLyogSFNTSSBpcyBibGFuayAqLworfQorCisvKgorICogIERTMyBtZXRob2RzCisgKi8KKworLyoKKyAqIFNldCBjYWJsZSBsZW5ndGgKKyAqLworc3RhdGljIHZvaWQKK2xtY19kczNfc2V0XzEwMGZ0IChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBpbnQgaWUpCit7CisgIGlmIChpZSA9PSBMTUNfQ1RMX0NBQkxFX0xFTkdUSF9HVF8xMDBGVCkKKyAgICB7CisgICAgICBzYy0+bG1jX21paXJlZzE2ICY9IH5MTUNfTUlJMTZfRFMzX1pFUk87CisgICAgICBzYy0+aWN0bC5jYWJsZV9sZW5ndGggPSBMTUNfQ1RMX0NBQkxFX0xFTkdUSF9HVF8xMDBGVDsKKyAgICB9CisgIGVsc2UgaWYgKGllID09IExNQ19DVExfQ0FCTEVfTEVOR1RIX0xUXzEwMEZUKQorICAgIHsKKyAgICAgIHNjLT5sbWNfbWlpcmVnMTYgfD0gTE1DX01JSTE2X0RTM19aRVJPOworICAgICAgc2MtPmljdGwuY2FibGVfbGVuZ3RoID0gTE1DX0NUTF9DQUJMRV9MRU5HVEhfTFRfMTAwRlQ7CisgICAgfQorICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTYsIHNjLT5sbWNfbWlpcmVnMTYpOworfQorCitzdGF0aWMgdm9pZAorbG1jX2RzM19kZWZhdWx0IChsbWNfc29mdGNfdCAqIGNvbnN0IHNjKQoreworICBzYy0+bG1jX21paXJlZzE2ID0gTE1DX01JSTE2X0xFRF9BTEw7CisKKyAgc2MtPmxtY19tZWRpYS0+c2V0X2xpbmtfc3RhdHVzIChzYywgTE1DX0xJTktfRE9XTik7CisgIHNjLT5sbWNfbWVkaWEtPnNldF9jYWJsZV9sZW5ndGggKHNjLCBMTUNfQ1RMX0NBQkxFX0xFTkdUSF9MVF8xMDBGVCk7CisgIHNjLT5sbWNfbWVkaWEtPnNldF9zY3JhbWJsZXIgKHNjLCBMTUNfQ1RMX09GRik7CisgIHNjLT5sbWNfbWVkaWEtPnNldF9jcmNfbGVuZ3RoIChzYywgTE1DX0NUTF9DUkNfTEVOR1RIXzE2KTsKK30KKworLyoKKyAqIEdpdmVuIGEgdXNlciBwcm92aWRlZCBzdGF0ZSwgc2V0IG91cnNlbHZlcyB1cCB0byBtYXRjaCBpdC4gIFRoaXMgd2lsbAorICogYWx3YXlzIHJlc2V0IHRoZSBjYXJkIGlmIG5lZWRlZC4KKyAqLworc3RhdGljIHZvaWQKK2xtY19kczNfc2V0X3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgbG1jX2N0bF90ICogY3RsKQoreworICBpZiAoY3RsID09IE5VTEwpCisgICAgeworICAgICAgc2MtPmxtY19tZWRpYS0+c2V0X2NhYmxlX2xlbmd0aCAoc2MsIHNjLT5pY3RsLmNhYmxlX2xlbmd0aCk7CisgICAgICBzYy0+bG1jX21lZGlhLT5zZXRfc2NyYW1ibGVyIChzYywgc2MtPmljdGwuc2NyYW1ibGVyX29ub2ZmKTsKKyAgICAgIGxtY19zZXRfcHJvdG9jb2wgKHNjLCBOVUxMKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKgorICAgKiBjaGVjayBmb3IgY2hhbmdlIGluIGNhYmxlIGxlbmd0aCBzZXR0aW5nCisgICAqLworICBpZiAoY3RsLT5jYWJsZV9sZW5ndGggJiYgIXNjLT5pY3RsLmNhYmxlX2xlbmd0aCkKKyAgICBsbWNfZHMzX3NldF8xMDBmdCAoc2MsIExNQ19DVExfQ0FCTEVfTEVOR1RIX0dUXzEwMEZUKTsKKyAgZWxzZSBpZiAoIWN0bC0+Y2FibGVfbGVuZ3RoICYmIHNjLT5pY3RsLmNhYmxlX2xlbmd0aCkKKyAgICBsbWNfZHMzX3NldF8xMDBmdCAoc2MsIExNQ19DVExfQ0FCTEVfTEVOR1RIX0xUXzEwMEZUKTsKKworICAvKgorICAgKiBDaGVjayBmb3IgY2hhbmdlIGluIHNjcmFtYmxlciBzZXR0aW5nIChyZXF1aXJlcyByZXNldCkKKyAgICovCisgIGlmIChjdGwtPnNjcmFtYmxlcl9vbm9mZiAmJiAhc2MtPmljdGwuc2NyYW1ibGVyX29ub2ZmKQorICAgIGxtY19kczNfc2V0X3NjcmFtIChzYywgTE1DX0NUTF9PTik7CisgIGVsc2UgaWYgKCFjdGwtPnNjcmFtYmxlcl9vbm9mZiAmJiBzYy0+aWN0bC5zY3JhbWJsZXJfb25vZmYpCisgICAgbG1jX2RzM19zZXRfc2NyYW0gKHNjLCBMTUNfQ1RMX09GRik7CisKKyAgbG1jX3NldF9wcm90b2NvbCAoc2MsIGN0bCk7Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfZHMzX2luaXQgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MpCit7CisgIGludCBpOworCisgIHNjLT5pY3RsLmNhcmR0eXBlID0gTE1DX0NUTF9DQVJEVFlQRV9MTUM1MjQ1OworCisgIC8qIHdyaXRlcyB6ZXJvcyBldmVyeXdoZXJlICovCisgIGZvciAoaSA9IDA7IGkgPCAyMTsgaSsrKQorICAgIHsKKyAgICAgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNywgaSk7CisgICAgICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTgsIDApOworICAgIH0KKworICAvKiBzZXQgc29tZSBlc3NlbnRpYWwgYml0cyAqLworICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTcsIDEpOworICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTgsIDB4MjUpOwkvKiBzZXIsIHh0eCAqLworCisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNywgNSk7CisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxOCwgMHg4MCk7CS8qIGVtb2RlICovCisKKyAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE3LCAxNCk7CisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxOCwgMHgzMCk7CS8qIHJjZ2VuLCB0Y2dlbiAqLworCisgIC8qIGNsZWFyIGNvdW50ZXJzIGFuZCBsYXRjaGVkIGJpdHMgKi8KKyAgZm9yIChpID0gMDsgaSA8IDIxOyBpKyspCisgICAgeworICAgICAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE3LCBpKTsKKyAgICAgIGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE4KTsKKyAgICB9Cit9CisKKy8qCisgKiAxID09IERTMyBwYXlsb2FkIHNjcmFtYmxlZCwgMCA9PSBub3Qgc2NyYW1ibGVkCisgKi8KK3N0YXRpYyB2b2lkCitsbWNfZHMzX3NldF9zY3JhbSAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgaW50IGllKQoreworICBpZiAoaWUgPT0gTE1DX0NUTF9PTikKKyAgICB7CisgICAgICBzYy0+bG1jX21paXJlZzE2IHw9IExNQ19NSUkxNl9EUzNfU0NSQU07CisgICAgICBzYy0+aWN0bC5zY3JhbWJsZXJfb25vZmYgPSBMTUNfQ1RMX09OOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHNjLT5sbWNfbWlpcmVnMTYgJj0gfkxNQ19NSUkxNl9EUzNfU0NSQU07CisgICAgICBzYy0+aWN0bC5zY3JhbWJsZXJfb25vZmYgPSBMTUNfQ1RMX09GRjsKKyAgICB9CisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7Cit9CisKKy8qCisgKiByZXR1cm4gaGFyZHdhcmUgbGluayBzdGF0dXMuCisgKiAwID09IGxpbmsgaXMgZG93biwgMSA9PSBsaW5rIGlzIHVwLgorICovCitzdGF0aWMgaW50CitsbWNfZHMzX2dldF9saW5rX3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCBzYykKK3sKKyAgICB1X2ludDE2X3QgbGlua19zdGF0dXMsIGxpbmtfc3RhdHVzXzExOworICAgIGludCByZXQgPSAxOworCisgICAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE3LCA3KTsKKyAgICBsaW5rX3N0YXR1cyA9IGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE4KTsKKworICAgIC8qIExNQzUyNDUgKERTMykgJiBMTUMxMjAwIChEUzEpIExFRCBkZWZpbml0aW9ucworICAgICAqIGxlZDAgeWVsbG93ID0gZmFyLWVuZCBhZGFwdGVyIGlzIGluIFJlZCBhbGFybSBjb25kaXRpb24KKyAgICAgKiBsZWQxIGJsdWUgICA9IHJlY2VpdmVkIGFuIEFsYXJtIEluZGljYXRpb24gc2lnbmFsCisgICAgICogICAgICAgICAgICAgICAodXBzdHJlYW0gZmFpbHVyZSkKKyAgICAgKiBsZWQyIEdyZWVuICA9IHBvd2VyIHRvIGFkYXB0ZXIsIEdhdGUgQXJyYXkgbG9hZGVkICYgZHJpdmVyCisgICAgICogICAgICAgICAgICAgICBhdHRhY2hlZAorICAgICAqIGxlZDMgcmVkICAgID0gTG9zcyBvZiBTaWduYWwgKExPUykgb3Igb3V0IG9mIGZyYW1lIChPT0YpCisgICAgICogICAgICAgICAgICAgICBjb25kaXRpb25zIGRldGVjdGVkIG9uIFQzIHJlY2VpdmUgc2lnbmFsCisgICAgICovCisKKyAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDIpOworCisgICAgaWYgKChsaW5rX3N0YXR1cyAmIExNQ19GUkFNRVJfUkVHMF9ETE9TKSB8fAorICAgICAgICAobGlua19zdGF0dXMgJiBMTUNfRlJBTUVSX1JFRzBfT09GUykpeworICAgICAgICByZXQgPSAwOworICAgICAgICBpZihzYy0+bGFzdF9sZWRfZXJyWzNdICE9IDEpeworICAgICAgICAgICAgdTE2IHIxOworICAgICAgICAgICAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE3LCAwMSk7IC8qIFR1cm4gb24gWGJpdCBlcnJvciBhcyBvdXIgY2lzY28gZG9lcyAqLworICAgICAgICAgICAgcjEgPSBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxOCk7CisgICAgICAgICAgICByMSAmPSAweGZlOworICAgICAgICAgICAgbG1jX21paV93cml0ZXJlZyhzYywgMCwgMTgsIHIxKTsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZWQgQWxhcm0gLSBMb3NzIG9mIFNpZ25hbCBvciBMb3NzIG9mIEZyYW1pbmdcbiIsIHNjLT5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDMpOwkvKiB0dXJuIG9uIHJlZCBMRUQgKi8KKyAgICAgICAgc2MtPmxhc3RfbGVkX2VyclszXSA9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBsbWNfbGVkX29mZihzYywgTE1DX0RTM19MRUQzKTsJLyogdHVybiBvbiByZWQgTEVEICovCisgICAgICAgIGlmKHNjLT5sYXN0X2xlZF9lcnJbM10gPT0gMSl7CisgICAgICAgICAgICB1MTYgcjE7CisgICAgICAgICAgICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTcsIDAxKTsgLyogVHVybiBvZmYgWGJpdCBlcnJvciAqLworICAgICAgICAgICAgcjEgPSBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxOCk7CisgICAgICAgICAgICByMSB8PSAweDAxOworICAgICAgICAgICAgbG1jX21paV93cml0ZXJlZyhzYywgMCwgMTgsIHIxKTsKKyAgICAgICAgfQorICAgICAgICBzYy0+bGFzdF9sZWRfZXJyWzNdID0gMDsKKyAgICB9CisKKyAgICBsbWNfbWlpX3dyaXRlcmVnKHNjLCAwLCAxNywgMHgxMCk7CisgICAgbGlua19zdGF0dXNfMTEgPSBsbWNfbWlpX3JlYWRyZWcoc2MsIDAsIDE4KTsKKyAgICBpZigobGlua19zdGF0dXMgJiBMTUNfRlJBTUVSX1JFRzBfQUlTKSB8fAorICAgICAgIChsaW5rX3N0YXR1c18xMSAmIExNQ19GUkFNRVJfUkVHMTBfWEJJVCkpIHsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgaWYoc2MtPmxhc3RfbGVkX2VyclswXSAhPSAxKXsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBSVMgQWxhcm0gb3IgWEJpdCBFcnJvclxuIiwgc2MtPm5hbWUpOworICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlbW90ZSBlbmQgaGFzIGxvc3Mgb2Ygc2lnbmFsIG9yIGZyYW1pbmdcbiIsIHNjLT5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDApOworICAgICAgICBzYy0+bGFzdF9sZWRfZXJyWzBdID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGxtY19sZWRfb2ZmKHNjLCBMTUNfRFMzX0xFRDApOworICAgICAgICBzYy0+bGFzdF9sZWRfZXJyWzBdID0gMDsKKyAgICB9CisKKyAgICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTcsIDkpOworICAgIGxpbmtfc3RhdHVzID0gbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTgpOworICAgIAorICAgIGlmKGxpbmtfc3RhdHVzICYgTE1DX0ZSQU1FUl9SRUc5X1JCTFVFKXsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgaWYoc2MtPmxhc3RfbGVkX2VyclsxXSAhPSAxKXsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBCbHVlIEFsYXJtIC0gUmVjZWl2aW5nIGFsbCAxJ3NcbiIsIHNjLT5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDEpOworICAgICAgICBzYy0+bGFzdF9sZWRfZXJyWzFdID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGxtY19sZWRfb2ZmKHNjLCBMTUNfRFMzX0xFRDEpOworICAgICAgICBzYy0+bGFzdF9sZWRfZXJyWzFdID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKgorICogMCA9PSAxNmJpdCwgMSA9PSAzMmJpdAorICovCitzdGF0aWMgdm9pZAorbG1jX2RzM19zZXRfY3JjX2xlbmd0aCAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgaW50IHN0YXRlKQoreworICBpZiAoc3RhdGUgPT0gTE1DX0NUTF9DUkNfTEVOR1RIXzMyKQorICAgIHsKKyAgICAgIC8qIDMyIGJpdCAqLworICAgICAgc2MtPmxtY19taWlyZWcxNiB8PSBMTUNfTUlJMTZfRFMzX0NSQzsKKyAgICAgIHNjLT5pY3RsLmNyY19sZW5ndGggPSBMTUNfQ1RMX0NSQ19MRU5HVEhfMzI7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogMTYgYml0ICovCisgICAgICBzYy0+bG1jX21paXJlZzE2ICY9IH5MTUNfTUlJMTZfRFMzX0NSQzsKKyAgICAgIHNjLT5pY3RsLmNyY19sZW5ndGggPSBMTUNfQ1RMX0NSQ19MRU5HVEhfMTY7CisgICAgfQorCisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfZHMzX3dhdGNoZG9nIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjKQoreworICAgIAorfQorCisKKy8qCisgKiAgU1NJIG1ldGhvZHMKKyAqLworCitzdGF0aWMgdm9pZAorbG1jX3NzaV9pbml0IChsbWNfc29mdGNfdCAqIGNvbnN0IHNjKQoreworICB1X2ludDE2X3QgbWlpMTc7CisgIGludCBjYWJsZTsKKworICBzYy0+aWN0bC5jYXJkdHlwZSA9IExNQ19DVExfQ0FSRFRZUEVfTE1DMTAwMDsKKworICBtaWkxNyA9IGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE3KTsKKworICBjYWJsZSA9IChtaWkxNyAmIExNQ19NSUkxN19TU0lfQ0FCTEVfTUFTSykgPj4gTE1DX01JSTE3X1NTSV9DQUJMRV9TSElGVDsKKyAgc2MtPmljdGwuY2FibGVfdHlwZSA9IGNhYmxlOworCisgIGxtY19ncGlvX21rb3V0cHV0IChzYywgTE1DX0dFUF9TU0lfVFhDTE9DSyk7Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfc3NpX2RlZmF1bHQgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MpCit7CisgIHNjLT5sbWNfbWlpcmVnMTYgPSBMTUNfTUlJMTZfTEVEX0FMTDsKKworICAvKgorICAgKiBtYWtlIFRYQ0xPQ0sgYWx3YXlzIGJlIGFuIG91dHB1dAorICAgKi8KKyAgbG1jX2dwaW9fbWtvdXRwdXQgKHNjLCBMTUNfR0VQX1NTSV9UWENMT0NLKTsKKworICBzYy0+bG1jX21lZGlhLT5zZXRfbGlua19zdGF0dXMgKHNjLCBMTUNfTElOS19ET1dOKTsKKyAgc2MtPmxtY19tZWRpYS0+c2V0X2Nsb2NrX3NvdXJjZSAoc2MsIExNQ19DVExfQ0xPQ0tfU09VUkNFX0VYVCk7CisgIHNjLT5sbWNfbWVkaWEtPnNldF9zcGVlZCAoc2MsIE5VTEwpOworICBzYy0+bG1jX21lZGlhLT5zZXRfY3JjX2xlbmd0aCAoc2MsIExNQ19DVExfQ1JDX0xFTkdUSF8xNik7Cit9CisKKy8qCisgKiBHaXZlbiBhIHVzZXIgcHJvdmlkZWQgc3RhdGUsIHNldCBvdXJzZWx2ZXMgdXAgdG8gbWF0Y2ggaXQuICBUaGlzIHdpbGwKKyAqIGFsd2F5cyByZXNldCB0aGUgY2FyZCBpZiBuZWVkZWQuCisgKi8KK3N0YXRpYyB2b2lkCitsbWNfc3NpX3NldF9zdGF0dXMgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIGxtY19jdGxfdCAqIGN0bCkKK3sKKyAgaWYgKGN0bCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHNjLT5sbWNfbWVkaWEtPnNldF9jbG9ja19zb3VyY2UgKHNjLCBzYy0+aWN0bC5jbG9ja19zb3VyY2UpOworICAgICAgc2MtPmxtY19tZWRpYS0+c2V0X3NwZWVkIChzYywgJnNjLT5pY3RsKTsKKyAgICAgIGxtY19zZXRfcHJvdG9jb2wgKHNjLCBOVUxMKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKgorICAgKiBjaGVjayBmb3IgY2hhbmdlIGluIGNsb2NrIHNvdXJjZQorICAgKi8KKyAgaWYgKGN0bC0+Y2xvY2tfc291cmNlID09IExNQ19DVExfQ0xPQ0tfU09VUkNFX0lOVAorICAgICAgJiYgc2MtPmljdGwuY2xvY2tfc291cmNlID09IExNQ19DVExfQ0xPQ0tfU09VUkNFX0VYVCkKKyAgICB7CisgICAgICBzYy0+bG1jX21lZGlhLT5zZXRfY2xvY2tfc291cmNlIChzYywgTE1DX0NUTF9DTE9DS19TT1VSQ0VfSU5UKTsKKyAgICAgIHNjLT5sbWNfdGltaW5nID0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfSU5UOworICAgIH0KKyAgZWxzZSBpZiAoY3RsLT5jbG9ja19zb3VyY2UgPT0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUCisJICAgJiYgc2MtPmljdGwuY2xvY2tfc291cmNlID09IExNQ19DVExfQ0xPQ0tfU09VUkNFX0lOVCkKKyAgICB7CisgICAgICBzYy0+bG1jX21lZGlhLT5zZXRfY2xvY2tfc291cmNlIChzYywgTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUKTsKKyAgICAgIHNjLT5sbWNfdGltaW5nID0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUOworICAgIH0KKworICBpZiAoY3RsLT5jbG9ja19yYXRlICE9IHNjLT5pY3RsLmNsb2NrX3JhdGUpCisgICAgc2MtPmxtY19tZWRpYS0+c2V0X3NwZWVkIChzYywgY3RsKTsKKworICBsbWNfc2V0X3Byb3RvY29sIChzYywgY3RsKTsKK30KKworLyoKKyAqIDEgPT0gaW50ZXJuYWwsIDAgPT0gZXh0ZXJuYWwKKyAqLworc3RhdGljIHZvaWQKK2xtY19zc2lfc2V0X2Nsb2NrIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBpbnQgaWUpCit7CisgIGludCBvbGQ7CisgIG9sZCA9IGllOworICBpZiAoaWUgPT0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUKQorICAgIHsKKyAgICAgIHNjLT5sbWNfZ3BpbyAmPSB+KExNQ19HRVBfU1NJX1RYQ0xPQ0spOworICAgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKKyAgICAgIHNjLT5pY3RsLmNsb2NrX3NvdXJjZSA9IExNQ19DVExfQ0xPQ0tfU09VUkNFX0VYVDsKKyAgICAgIGlmKGllICE9IG9sZCkKKyAgICAgICAgcHJpbnRrIChMTUNfUFJJTlRGX0ZNVCAiOiBjbG9jayBleHRlcm5hbFxuIiwgTE1DX1BSSU5URl9BUkdTKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzYy0+bG1jX2dwaW8gfD0gTE1DX0dFUF9TU0lfVFhDTE9DSzsKKyAgICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfZ3AsIHNjLT5sbWNfZ3Bpbyk7CisgICAgICBzYy0+aWN0bC5jbG9ja19zb3VyY2UgPSBMTUNfQ1RMX0NMT0NLX1NPVVJDRV9JTlQ7CisgICAgICBpZihpZSAhPSBvbGQpCisgICAgICAgIHByaW50ayAoTE1DX1BSSU5URl9GTVQgIjogY2xvY2sgaW50ZXJuYWxcbiIsIExNQ19QUklOVEZfQVJHUyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorbG1jX3NzaV9zZXRfc3BlZWQgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIGxtY19jdGxfdCAqIGN0bCkKK3sKKyAgbG1jX2N0bF90ICppY3RsID0gJnNjLT5pY3RsOworICBsbWNfYXY5MTEwX3QgKmF2OworCisgIC8qIG9yaWdpbmFsIHNldHRpbmdzIGZvciBjbG9jayByYXRlIG9mOgorICAgKiAgMTAwIEtoeiAoOCwyNSwwLDAsMikgd2VyZSBpbmNvcnJlY3QKKyAgICogIHRoZXkgc2hvdWxkIGhhdmUgYmVlbiA4MCwxMjUsMSwzLDMKKyAgICogIFRoZXJlIGFyZSAxNyBwYXJhbSBjb21iaW5hdGlvbnMgdG8gcHJvZHVjZSB0aGlzIGZyZXEuCisgICAqICBGb3IgMS41IE1oeiB1c2UgMTIwLDEwMCwxLDEsMiAoMjI2IHBhcmFtLiBjb21iaW5hdGlvbnMpCisgICAqLworICBpZiAoY3RsID09IE5VTEwpCisgICAgeworICAgICAgYXYgPSAmaWN0bC0+Y2FyZHNwZWMuc3NpOworICAgICAgaWN0bC0+Y2xvY2tfcmF0ZSA9IDE1MDAwMDA7CisgICAgICBhdi0+ZiA9IGljdGwtPmNsb2NrX3JhdGU7CisgICAgICBhdi0+biA9IDEyMDsKKyAgICAgIGF2LT5tID0gMTAwOworICAgICAgYXYtPnYgPSAxOworICAgICAgYXYtPnggPSAxOworICAgICAgYXYtPnIgPSAyOworCisgICAgICB3cml0ZV9hdjkxMTAgKHNjLCBhdi0+biwgYXYtPm0sIGF2LT52LCBhdi0+eCwgYXYtPnIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBhdiA9ICZjdGwtPmNhcmRzcGVjLnNzaTsKKworICBpZiAoYXYtPmYgPT0gMCkKKyAgICByZXR1cm47CisKKyAgaWN0bC0+Y2xvY2tfcmF0ZSA9IGF2LT5mOwkvKiByZWFsbHksIHRoaXMgaXMgdGhlIHJhdGUgd2UgYXJlICovCisgIGljdGwtPmNhcmRzcGVjLnNzaSA9ICphdjsKKworICB3cml0ZV9hdjkxMTAgKHNjLCBhdi0+biwgYXYtPm0sIGF2LT52LCBhdi0+eCwgYXYtPnIpOworfQorCisvKgorICogcmV0dXJuIGhhcmR3YXJlIGxpbmsgc3RhdHVzLgorICogMCA9PSBsaW5rIGlzIGRvd24sIDEgPT0gbGluayBpcyB1cC4KKyAqLworc3RhdGljIGludAorbG1jX3NzaV9nZXRfbGlua19zdGF0dXMgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MpCit7CisgIHVfaW50MTZfdCBsaW5rX3N0YXR1czsKKyAgdV9pbnQzMl90IHRpY2tzOworICBpbnQgcmV0ID0gMTsKKyAgaW50IGh3X2hkc2sgPSAxOworICAKKyAgLyoKKyAgICogbWlzc2luZyBDVFM/ICBIbW0uICBJZiB3ZSByZXF1aXJlIENUUyBvbiwgd2UgbWF5IG5ldmVyIGdldCB0aGUKKyAgICogbGluayB0byBjb21lIHVwLCBzbyBvbWl0IGl0IGluIHRoaXMgdGVzdC4KKyAgICoKKyAgICogQWxzbywgaXQgc2VlbXMgdGhhdCB3aXRoIGEgbG9vcGJhY2sgY2FibGUsIERDRCBpc24ndCBhc3NlcnRlZCwKKyAgICogc28ganVzdCBjaGVjayBmb3IgdGhpbmdzIGxpa2UgdGhpczoKKyAgICogICAgICBEU1IgX211c3RfIGJlIGFzc2VydGVkLgorICAgKiAgICAgIE9uZSBvZiBEQ0Qgb3IgQ1RTIG11c3QgYmUgYXNzZXJ0ZWQuCisgICAqLworCisgIC8qIExNQyAxMDAwIChTU0kpIExFRCBkZWZpbml0aW9ucworICAgKiBsZWQwIEdyZWVuID0gcG93ZXIgdG8gYWRhcHRlciwgR2F0ZSBBcnJheSBsb2FkZWQgJgorICAgKiAgICAgICAgICAgICAgZHJpdmVyIGF0dGFjaGVkCisgICAqIGxlZDEgR3JlZW4gPSBEU1IgYW5kIERUUiBhbmQgUlRTIGFuZCBDVFMgYXJlIHNldAorICAgKiBsZWQyIEdyZWVuID0gQ2FibGUgZGV0ZWN0ZWQKKyAgICogbGVkMyByZWQgICA9IE5vIHRpbWluZyBpcyBhdmFpbGFibGUgZnJvbSB0aGUKKyAgICogICAgICAgICAgICAgIGNhYmxlIG9yIHRoZSBvbi1ib2FyZCBmcmVxdWVuY3kKKyAgICogICAgICAgICAgICAgIGdlbmVyYXRvci4KKyAgICovCisKKyAgbGlua19zdGF0dXMgPSBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxNik7CisKKyAgLyogSXMgdGhlIHRyYW5zbWl0IGNsb2NrIHN0aWxsIGF2YWlsYWJsZSAqLworICB0aWNrcyA9IExNQ19DU1JfUkVBRCAoc2MsIGNzcl9ncF90aW1lcik7CisgIHRpY2tzID0gMHgwMDAwZmZmZiAtICh0aWNrcyAmIDB4MDAwMGZmZmYpOworCisgIGxtY19sZWRfb24gKHNjLCBMTUNfTUlJMTZfTEVEMCk7CisKKyAgLyogPT09PT09IHRyYW5zbWl0IGNsb2NrIGRldGVybWluYXRpb24gPT09PT0gKi8KKyAgaWYgKHNjLT5sbWNfdGltaW5nID09IExNQ19DVExfQ0xPQ0tfU09VUkNFX0lOVCkgeworICAgICAgbG1jX2xlZF9vZmYoc2MsIExNQ19NSUkxNl9MRUQzKTsKKyAgfQorICBlbHNlIGlmICh0aWNrcyA9PSAwICkgewkJCQkvKiBubyBjbG9jayBmb3VuZCA/ICovCisgICAgICByZXQgPSAwOworICAgICAgaWYoc2MtPmxhc3RfbGVkX2VyclszXSAhPSAxKXsKKyAgICAgICAgICBzYy0+c3RhdHMudHhfbG9zc09mQ2xvY2tDbnQrKzsKKyAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogTG9zdCBDbG9jaywgTGluayBEb3duXG4iLCBzYy0+bmFtZSk7CisgICAgICB9CisgICAgICBzYy0+bGFzdF9sZWRfZXJyWzNdID0gMTsKKyAgICAgIGxtY19sZWRfb24gKHNjLCBMTUNfTUlJMTZfTEVEMyk7CS8qIHR1cm4gT04gcmVkIExFRCAqLworICB9CisgIGVsc2UgeworICAgICAgaWYoc2MtPmxhc3RfbGVkX2VyclszXSA9PSAxKQorICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDbG9jayBSZXR1cm5lZFxuIiwgc2MtPm5hbWUpOworICAgICAgc2MtPmxhc3RfbGVkX2VyclszXSA9IDA7CisgICAgICBsbWNfbGVkX29mZiAoc2MsIExNQ19NSUkxNl9MRUQzKTsJCS8qIHR1cm4gT0ZGIHJlZCBMRUQgKi8KKyAgfQorCisgIGlmICgobGlua19zdGF0dXMgJiBMTUNfTUlJMTZfU1NJX0RTUikgPT0gMCkgeyAvKiBBbHNvIEhTU0kgQ0EgKi8KKyAgICAgIHJldCA9IDA7CisgICAgICBod19oZHNrID0gMDsKKyAgfQorCisjaWZkZWYgQ09ORklHX0xNQ19JR05PUkVfSEFSRFdBUkVfSEFORFNIQUtFCisgIGlmICgobGlua19zdGF0dXMgJiAoTE1DX01JSTE2X1NTSV9DVFMgfCBMTUNfTUlJMTZfU1NJX0RDRCkpID09IDApeworICAgICAgcmV0ID0gMDsKKyAgICAgIGh3X2hkc2sgPSAwOworICB9CisjZW5kaWYKKworICBpZihod19oZHNrID09IDApeworICAgICAgaWYoc2MtPmxhc3RfbGVkX2VyclsxXSAhPSAxKQorICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBEU1Igbm90IGFzc2VydGVkXG4iLCBzYy0+bmFtZSk7CisgICAgICBzYy0+bGFzdF9sZWRfZXJyWzFdID0gMTsKKyAgICAgIGxtY19sZWRfb2ZmKHNjLCBMTUNfTUlJMTZfTEVEMSk7CisgIH0KKyAgZWxzZSB7CisgICAgICBpZihzYy0+bGFzdF9sZWRfZXJyWzFdICE9IDApCisgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IERTUiBub3cgYXNzZXJ0ZWRcbiIsIHNjLT5uYW1lKTsKKyAgICAgIHNjLT5sYXN0X2xlZF9lcnJbMV0gPSAwOworICAgICAgbG1jX2xlZF9vbihzYywgTE1DX01JSTE2X0xFRDEpOworICB9CisKKyAgaWYocmV0ID09IDEpIHsKKyAgICAgIGxtY19sZWRfb24oc2MsIExNQ19NSUkxNl9MRUQyKTsgLyogT3ZlciBhbGwgZ29vZCBzdGF0dXM/ICovCisgIH0KKyAgCisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitsbWNfc3NpX3NldF9saW5rX3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgaW50IHN0YXRlKQoreworICBpZiAoc3RhdGUgPT0gTE1DX0xJTktfVVApCisgICAgeworICAgICAgc2MtPmxtY19taWlyZWcxNiB8PSAoTE1DX01JSTE2X1NTSV9EVFIgfCBMTUNfTUlJMTZfU1NJX1JUUyk7CisgICAgICBwcmludGsgKExNQ19QUklOVEZfRk1UICI6IGFzc2VydGluZyBEVFIgYW5kIFJUU1xuIiwgTE1DX1BSSU5URl9BUkdTKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzYy0+bG1jX21paXJlZzE2ICY9IH4oTE1DX01JSTE2X1NTSV9EVFIgfCBMTUNfTUlJMTZfU1NJX1JUUyk7CisgICAgICBwcmludGsgKExNQ19QUklOVEZfRk1UICI6IGRlYXNzZXJ0aW5nIERUUiBhbmQgUlRTXG4iLCBMTUNfUFJJTlRGX0FSR1MpOworICAgIH0KKworICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTYsIHNjLT5sbWNfbWlpcmVnMTYpOworCit9CisKKy8qCisgKiAwID09IDE2Yml0LCAxID09IDMyYml0CisgKi8KK3N0YXRpYyB2b2lkCitsbWNfc3NpX3NldF9jcmNfbGVuZ3RoIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBpbnQgc3RhdGUpCit7CisgIGlmIChzdGF0ZSA9PSBMTUNfQ1RMX0NSQ19MRU5HVEhfMzIpCisgICAgeworICAgICAgLyogMzIgYml0ICovCisgICAgICBzYy0+bG1jX21paXJlZzE2IHw9IExNQ19NSUkxNl9TU0lfQ1JDOworICAgICAgc2MtPmljdGwuY3JjX2xlbmd0aCA9IExNQ19DVExfQ1JDX0xFTkdUSF8zMjsKKyAgICAgIHNjLT5sbWNfY3JjU2l6ZSA9IExNQ19DVExfQ1JDX0JZVEVTSVpFXzQ7CisKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiAxNiBiaXQgKi8KKyAgICAgIHNjLT5sbWNfbWlpcmVnMTYgJj0gfkxNQ19NSUkxNl9TU0lfQ1JDOworICAgICAgc2MtPmljdGwuY3JjX2xlbmd0aCA9IExNQ19DVExfQ1JDX0xFTkdUSF8xNjsKKyAgICAgIHNjLT5sbWNfY3JjU2l6ZSA9IExNQ19DVExfQ1JDX0JZVEVTSVpFXzI7CisgICAgfQorCisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7Cit9CisKKy8qCisgKiBUaGVzZSBhcmUgYml0cyB0byBwcm9ncmFtIHRoZSBzc2kgZnJlcXVlbmN5IGdlbmVyYXRvcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3dyaXRlX2F2OTExMF9iaXQgKGxtY19zb2Z0Y190ICogc2MsIGludCBjKQoreworICAvKgorICAgKiBzZXQgdGhlIGRhdGEgYml0IGFzIHdlIG5lZWQgaXQuCisgICAqLworICBzYy0+bG1jX2dwaW8gJj0gfihMTUNfR0VQX0NMSyk7CisgIGlmIChjICYgMHgwMSkKKyAgICBzYy0+bG1jX2dwaW8gfD0gTE1DX0dFUF9EQVRBOworICBlbHNlCisgICAgc2MtPmxtY19ncGlvICY9IH4oTE1DX0dFUF9EQVRBKTsKKyAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKKworICAvKgorICAgKiBzZXQgdGhlIGNsb2NrIHRvIGhpZ2gKKyAgICovCisgIHNjLT5sbWNfZ3BpbyB8PSBMTUNfR0VQX0NMSzsKKyAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKKworICAvKgorICAgKiBzZXQgdGhlIGNsb2NrIHRvIGxvdyBhZ2Fpbi4KKyAgICovCisgIHNjLT5sbWNfZ3BpbyAmPSB+KExNQ19HRVBfQ0xLKTsKKyAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlX2F2OTExMCAobG1jX3NvZnRjX3QgKiBzYywgdV9pbnQzMl90IG4sIHVfaW50MzJfdCBtLCB1X2ludDMyX3QgdiwKKwkgICAgICB1X2ludDMyX3QgeCwgdV9pbnQzMl90IHIpCit7CisgIGludCBpOworCisjaWYgMAorICBwcmludGsgKExNQ19QUklOVEZfRk1UICI6IHNwZWVkICV1LCAlZCAlZCAlZCAlZCAlZFxuIiwKKwkgIExNQ19QUklOVEZfQVJHUywgc2MtPmljdGwuY2xvY2tfcmF0ZSwgbiwgbSwgdiwgeCwgcik7CisjZW5kaWYKKworICBzYy0+bG1jX2dwaW8gfD0gTE1DX0dFUF9TU0lfR0VORVJBVE9SOworICBzYy0+bG1jX2dwaW8gJj0gfihMTUNfR0VQX0RBVEEgfCBMTUNfR0VQX0NMSyk7CisgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfZ3AsIHNjLT5sbWNfZ3Bpbyk7CisKKyAgLyoKKyAgICogU2V0IHRoZSBUWENMT0NLLCBHRU5FUkFUT1IsIFNFUklBTCwgYW5kIFNFUklBTENMSworICAgKiBhcyBvdXRwdXRzLgorICAgKi8KKyAgbG1jX2dwaW9fbWtvdXRwdXQgKHNjLCAoTE1DX0dFUF9EQVRBIHwgTE1DX0dFUF9DTEsKKwkJCSAgfCBMTUNfR0VQX1NTSV9HRU5FUkFUT1IpKTsKKworICBzYy0+bG1jX2dwaW8gJj0gfihMTUNfR0VQX1NTSV9HRU5FUkFUT1IpOworICBMTUNfQ1NSX1dSSVRFIChzYywgY3NyX2dwLCBzYy0+bG1jX2dwaW8pOworCisgIC8qCisgICAqIGEgc2hpZnRpbmcgd2Ugd2lsbCBnby4uLgorICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKyAgICB3cml0ZV9hdjkxMTBfYml0IChzYywgbiA+PiBpKTsKKyAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKyAgICB3cml0ZV9hdjkxMTBfYml0IChzYywgbSA+PiBpKTsKKyAgZm9yIChpID0gMDsgaSA8IDE7IGkrKykKKyAgICB3cml0ZV9hdjkxMTBfYml0IChzYywgdiA+PiBpKTsKKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB3cml0ZV9hdjkxMTBfYml0IChzYywgeCA+PiBpKTsKKyAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICB3cml0ZV9hdjkxMTBfYml0IChzYywgciA+PiBpKTsKKyAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICB3cml0ZV9hdjkxMTBfYml0IChzYywgMHgxNyA+PiBpKTsKKworICAvKgorICAgKiBzdG9wIGRyaXZpbmcgc2VyaWFsLXJlbGF0ZWQgc2lnbmFscworICAgKi8KKyAgbG1jX2dwaW9fbWtpbnB1dCAoc2MsCisJCSAgICAoTE1DX0dFUF9EQVRBIHwgTE1DX0dFUF9DTEsKKwkJICAgICB8IExNQ19HRVBfU1NJX0dFTkVSQVRPUikpOworfQorCitzdGF0aWMgdm9pZAorbG1jX3NzaV93YXRjaGRvZyAobG1jX3NvZnRjX3QgKiBjb25zdCBzYykKK3sKKyAgdV9pbnQxNl90IG1paTE3OworICBzdHJ1Y3Qgc3NpY3NyMgorICB7CisgICAgdW5zaWduZWQgc2hvcnQgZHRyOjEsIGRzcjoxLCBydHM6MSwgY2FibGU6MywgY3JjOjEsIGxlZDA6MSwgbGVkMToxLAorICAgICAgbGVkMjoxLCBsZWQzOjEsIGZpZm86MSwgbGw6MSwgcmw6MSwgdG06MSwgbG9vcDoxOworICB9OworICBzdHJ1Y3Qgc3NpY3NyMiAqc3NpY3NyOworICBtaWkxNyA9IGxtY19taWlfcmVhZHJlZyAoc2MsIDAsIDE3KTsKKyAgc3NpY3NyID0gKHN0cnVjdCBzc2ljc3IyICopICZtaWkxNzsKKyAgaWYgKHNzaWNzci0+Y2FibGUgPT0gNykKKyAgICB7CisgICAgICBsbWNfbGVkX29mZiAoc2MsIExNQ19NSUkxNl9MRUQyKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBsbWNfbGVkX29uIChzYywgTE1DX01JSTE2X0xFRDIpOworICAgIH0KKworfQorCisvKgorICogIFQxIG1ldGhvZHMKKyAqLworCisvKgorICogVGhlIGZyYW1lciByZWdzIGFyZSBtdWx0aXBsZXhlZCB0aHJvdWdoIE1JSSByZWdzIDE3ICYgMTgKKyAqICB3cml0ZSB0aGUgcmVnaXN0ZXIgYWRkcmVzcyB0byBNSUkgcmVnIDE3IGFuZCB0aGUgKiAgZGF0YSB0byBNSUkgcmVnIDE4LiAqLworc3RhdGljIHZvaWQKK2xtY190MV93cml0ZSAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgaW50IGEsIGludCBkKQoreworICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTcsIGEpOworICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTgsIGQpOworfQorCisvKiBTYXZlIGEgd2FybmluZworc3RhdGljIGludAorbG1jX3QxX3JlYWQgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MsIGludCBhKQoreworICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTcsIGEpOworICByZXR1cm4gbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTgpOworfQorKi8KKworCitzdGF0aWMgdm9pZAorbG1jX3QxX2luaXQgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MpCit7CisgIHVfaW50MTZfdCBtaWkxNjsKKyAgaW50IGk7CisKKyAgc2MtPmljdGwuY2FyZHR5cGUgPSBMTUNfQ1RMX0NBUkRUWVBFX0xNQzEyMDA7CisgIG1paTE2ID0gbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTYpOworCisgIC8qIHJlc2V0IDgzNzAgKi8KKyAgbWlpMTYgJj0gfkxNQ19NSUkxNl9UMV9SU1Q7CisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNiwgbWlpMTYgfCBMTUNfTUlJMTZfVDFfUlNUKTsKKyAgbG1jX21paV93cml0ZXJlZyAoc2MsIDAsIDE2LCBtaWkxNik7CisKKyAgLyogc2V0IFQxIG9yIEUxIGxpbmUuICBVc2VzIHNjLT5sbWNtaWkxNiByZWcgaW4gZnVuY3Rpb24gc28gdXBkYXRlIGl0ICovCisgIHNjLT5sbWNfbWlpcmVnMTYgPSBtaWkxNjsKKyAgbG1jX3QxX3NldF9jaXJjdWl0X3R5cGUoc2MsIExNQ19DVExfQ0lSQ1VJVF9UWVBFX1QxKTsKKyAgbWlpMTYgPSBzYy0+bG1jX21paXJlZzE2OworCisgIGxtY190MV93cml0ZSAoc2MsIDB4MDEsIDB4MUIpOwkvKiBDUjAgICAgIC0gcHJpbWFyeSBjb250cm9sICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4MDIsIDB4NDIpOwkvKiBKQVRfQ1IgIC0gaml0dGVyIGF0dGVuIGNvbmZpZyAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4MTQsIDB4MDApOwkvKiBMT09QICAgIC0gbG9vcGJhY2sgY29uZmlnICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4MTUsIDB4MDApOwkvKiBETDNfVFMgIC0gZXh0ZXJuYWwgZGF0YSBsaW5rIHRpbWVzbG90ICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4MTgsIDB4RkYpOwkvKiBQSU8gICAgIC0gcHJvZ3JhbW1hYmxlIEkvTyAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4MTksIDB4MzApOwkvKiBQT0UgICAgIC0gcHJvZ3JhbW1hYmxlIE9FICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4MUEsIDB4MEYpOwkvKiBDTVVYICAgIC0gY2xvY2sgaW5wdXQgbXV4ICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4MjAsIDB4NDEpOwkvKiBMSVVfQ1IgIC0gUlggTElVIGNvbmZpZyAgICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4MjIsIDB4NzYpOwkvKiBSTElVX0NSIC0gUlggTElVIGNvbmZpZyAgICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NDAsIDB4MDMpOwkvKiBSQ1IwICAgIC0gUlggY29uZmlnICAgICAgICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NDUsIDB4MDApOwkvKiBSQUxNICAgIC0gUlggYWxhcm0gY29uZmlnICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NDYsIDB4MDUpOwkvKiBMQVRDSCAgIC0gUlggYWxhcm0vZXJyL2NudHIgbGF0Y2ggICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NjgsIDB4NDApOwkvKiBUTElVX0NSIC0gVFggTElVIGNvbmZpZyAgICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NzAsIDB4MEQpOwkvKiBUQ1IwICAgIC0gVFggZnJhbWVyIGNvbmZpZyAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NzEsIDB4MDUpOwkvKiBUQ1IxICAgIC0gVFggY29uZmlnICAgICAgICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NzIsIDB4MEIpOwkvKiBURlJNICAgIC0gVFggZnJhbWUgZm9ybWF0ICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NzMsIDB4MDApOwkvKiBURVJST1IgIC0gVFggZXJyb3IgaW5zZXJ0ICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NzQsIDB4MDApOwkvKiBUTUFOICAgIC0gVFggbWFudWFsIFNhL0ZFQkUgY29uZmlnICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NzUsIDB4MDApOwkvKiBUQUxNICAgIC0gVFggYWxhcm0gc2lnbmFsIGNvbmZpZyAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NzYsIDB4MDApOwkvKiBUUEFUVCAgIC0gVFggdGVzdCBwYXR0ZXJuIGNvbmZpZyAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4NzcsIDB4MDApOwkvKiBUTEIgICAgIC0gVFggaW5iYW5kIGxvb3BiYWNrIGNvbmZpZyAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4OTAsIDB4MDUpOwkvKiBDTEFEX0NSIC0gY2xvY2sgcmF0ZSBhZGFwdGVyIGNvbmZpZyAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4OTEsIDB4MDUpOwkvKiBDU0VMICAgIC0gY2xhZCBmcmVxIHNlbCAgICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4QTYsIDB4MDApOwkvKiBETDFfQ1RMIC0gREwxIGNvbnRyb2wgICAgICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4QjEsIDB4MDApOwkvKiBETDJfQ1RMIC0gREwyIGNvbnRyb2wgICAgICAgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4RDAsIDB4NDcpOwkvKiBTQklfQ1IgIC0gc3lzIGJ1cyBpZmFjZSBjb25maWcgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4RDEsIDB4NzApOwkvKiBSU0JfQ1IgIC0gUlggc3lzIGJ1cyBjb25maWcgICAgICAgICAgICovCisgIGxtY190MV93cml0ZSAoc2MsIDB4RDQsIDB4MzApOwkvKiBUU0JfQ1IgIC0gVFggc3lzIGJ1cyBjb25maWcgICAgICAgICAgICovCisgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorICAgIHsKKyAgICAgIGxtY190MV93cml0ZSAoc2MsIDB4MEUwICsgaSwgMHgwMCk7CS8qIFNCQ24gLSBzeXMgYnVzIHBlci1jaGFubmVsIGN0bCAgICAqLworICAgICAgbG1jX3QxX3dyaXRlIChzYywgMHgxMDAgKyBpLCAweDAwKTsJLyogVFBDbiAtIFRYIHBlci1jaGFubmVsIGN0bCAgICAgICAgICovCisgICAgICBsbWNfdDFfd3JpdGUgKHNjLCAweDE4MCArIGksIDB4MDApOwkvKiBSUENuIC0gUlggcGVyLWNoYW5uZWwgY3RsICAgICAgICAgKi8KKyAgICB9CisgIGZvciAoaSA9IDE7IGkgPCAyNTsgaSsrKQorICAgIHsKKyAgICAgIGxtY190MV93cml0ZSAoc2MsIDB4MEUwICsgaSwgMHgwRCk7CS8qIFNCQ24gLSBzeXMgYnVzIHBlci1jaGFubmVsIGN0bCAgICAqLworICAgIH0KKworICBtaWkxNiB8PSBMTUNfTUlJMTZfVDFfWE9FOworICBsbWNfbWlpX3dyaXRlcmVnIChzYywgMCwgMTYsIG1paTE2KTsKKyAgc2MtPmxtY19taWlyZWcxNiA9IG1paTE2OworfQorCitzdGF0aWMgdm9pZAorbG1jX3QxX2RlZmF1bHQgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MpCit7CisgIHNjLT5sbWNfbWlpcmVnMTYgPSBMTUNfTUlJMTZfTEVEX0FMTDsKKyAgc2MtPmxtY19tZWRpYS0+c2V0X2xpbmtfc3RhdHVzIChzYywgTE1DX0xJTktfRE9XTik7CisgIHNjLT5sbWNfbWVkaWEtPnNldF9jaXJjdWl0X3R5cGUgKHNjLCBMTUNfQ1RMX0NJUkNVSVRfVFlQRV9UMSk7CisgIHNjLT5sbWNfbWVkaWEtPnNldF9jcmNfbGVuZ3RoIChzYywgTE1DX0NUTF9DUkNfTEVOR1RIXzE2KTsKKyAgLyogUmlnaHQgbm93IHdlIGNhbiBvbmx5IGNsb2NrIGZyb20gb3V0IGludGVybmFsIHNvdXJjZSAqLworICBzYy0+aWN0bC5jbG9ja19zb3VyY2UgPSBMTUNfQ1RMX0NMT0NLX1NPVVJDRV9JTlQ7Cit9CisvKiAqIEdpdmVuIGEgdXNlciBwcm92aWRlZCBzdGF0ZSwgc2V0IG91cnNlbHZlcyB1cCB0byBtYXRjaCBpdC4gIFRoaXMgd2lsbCAqIGFsd2F5cyByZXNldCB0aGUgY2FyZCBpZiBuZWVkZWQuCisgKi8KK3N0YXRpYyB2b2lkCitsbWNfdDFfc2V0X3N0YXR1cyAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgbG1jX2N0bF90ICogY3RsKQoreworICBpZiAoY3RsID09IE5VTEwpCisgICAgeworICAgICAgc2MtPmxtY19tZWRpYS0+c2V0X2NpcmN1aXRfdHlwZSAoc2MsIHNjLT5pY3RsLmNpcmN1aXRfdHlwZSk7CisgICAgICBsbWNfc2V0X3Byb3RvY29sIChzYywgTlVMTCk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisgIC8qCisgICAqIGNoZWNrIGZvciBjaGFuZ2UgaW4gY2lyY3VpdCB0eXBlICAgICAgICAgKi8KKyAgaWYgKGN0bC0+Y2lyY3VpdF90eXBlID09IExNQ19DVExfQ0lSQ1VJVF9UWVBFX1QxCisgICAgICAmJiBzYy0+aWN0bC5jaXJjdWl0X3R5cGUgPT0KKyAgICAgIExNQ19DVExfQ0lSQ1VJVF9UWVBFX0UxKSBzYy0+bG1jX21lZGlhLT5zZXRfY2lyY3VpdF90eXBlIChzYywKKwkJCQkJCQkJTE1DX0NUTF9DSVJDVUlUX1RZUEVfRTEpOworICBlbHNlIGlmIChjdGwtPmNpcmN1aXRfdHlwZSA9PSBMTUNfQ1RMX0NJUkNVSVRfVFlQRV9FMQorCSAgICYmIHNjLT5pY3RsLmNpcmN1aXRfdHlwZSA9PSBMTUNfQ1RMX0NJUkNVSVRfVFlQRV9UMSkKKyAgICBzYy0+bG1jX21lZGlhLT5zZXRfY2lyY3VpdF90eXBlIChzYywgTE1DX0NUTF9DSVJDVUlUX1RZUEVfVDEpOworICBsbWNfc2V0X3Byb3RvY29sIChzYywgY3RsKTsKK30KKy8qCisgKiByZXR1cm4gaGFyZHdhcmUgbGluayBzdGF0dXMuCisgKiAwID09IGxpbmsgaXMgZG93biwgMSA9PSBsaW5rIGlzIHVwLgorICovIHN0YXRpYyBpbnQKK2xtY190MV9nZXRfbGlua19zdGF0dXMgKGxtY19zb2Z0Y190ICogY29uc3Qgc2MpCit7CisgICAgdV9pbnQxNl90IGxpbmtfc3RhdHVzOworICAgIGludCByZXQgPSAxOworCisgIC8qIExNQzUyNDUgKERTMykgJiBMTUMxMjAwIChEUzEpIExFRCBkZWZpbml0aW9ucworICAgKiBsZWQwIHllbGxvdyA9IGZhci1lbmQgYWRhcHRlciBpcyBpbiBSZWQgYWxhcm0gY29uZGl0aW9uCisgICAqIGxlZDEgYmx1ZSAgID0gcmVjZWl2ZWQgYW4gQWxhcm0gSW5kaWNhdGlvbiBzaWduYWwKKyAgICogICAgICAgICAgICAgICAodXBzdHJlYW0gZmFpbHVyZSkKKyAgICogbGVkMiBHcmVlbiAgPSBwb3dlciB0byBhZGFwdGVyLCBHYXRlIEFycmF5IGxvYWRlZCAmIGRyaXZlcgorICAgKiAgICAgICAgICAgICAgIGF0dGFjaGVkCisgICAqIGxlZDMgcmVkICAgID0gTG9zcyBvZiBTaWduYWwgKExPUykgb3Igb3V0IG9mIGZyYW1lIChPT0YpCisgICAqICAgICAgICAgICAgICAgY29uZGl0aW9ucyBkZXRlY3RlZCBvbiBUMyByZWNlaXZlIHNpZ25hbAorICAgKi8KKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfdDFfZ2V0X2xpbmtfc3RhdHVzIGluIik7CisgICAgbG1jX2xlZF9vbihzYywgTE1DX0RTM19MRUQyKTsKKworICAgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNywgVDFGUkFNRVJfQUxBUk0xX1NUQVRVUyk7CisgICAgbGlua19zdGF0dXMgPSBsbWNfbWlpX3JlYWRyZWcgKHNjLCAwLCAxOCk7CisKKworICAgIGlmIChsaW5rX3N0YXR1cyAmIFQxRl9SQUlTKSB7CQkJLyogdHVybiBvbiBibHVlIExFRCAqLworICAgICAgICByZXQgPSAwOworICAgICAgICBpZihzYy0+bGFzdF9sZWRfZXJyWzFdICE9IDEpeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlY2VpdmUgQUlTL0JsdWUgQWxhcm0uIEZhciBlbmQgaW4gUkVEIGFsYXJtXG4iLCBzYy0+bmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgbG1jX2xlZF9vbihzYywgTE1DX0RTM19MRUQxKTsKKyAgICAgICAgc2MtPmxhc3RfbGVkX2VyclsxXSA9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZihzYy0+bGFzdF9sZWRfZXJyWzFdICE9IDApeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEVuZCBBSVMvQmx1ZSBBbGFybVxuIiwgc2MtPm5hbWUpOworICAgICAgICB9CisgICAgICAgIGxtY19sZWRfb2ZmIChzYywgTE1DX0RTM19MRUQxKTsKKyAgICAgICAgc2MtPmxhc3RfbGVkX2VyclsxXSA9IDA7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBZZWxsb3cgQWxhcm0gaXMgbmFzdHkgZXZpbCBzdHVmZiwgbG9va3MgYXQgZGF0YSBwYXR0ZXJucworICAgICAqIGluc2lkZSB0aGUgY2hhbm5lbCBhbmQgY29uZnVzZXMgaXQgd2l0aCBIRExDIGZyYW1pbmcKKyAgICAgKiBpZ25vcmUgYWxsIHllbGxvdyBhbGFybXMuCisgICAgICoKKyAgICAgKiBEbyBsaXN0ZW4gdG8gTXVsdGlGcmFtZSBZZWxsb3cgYWxhcm0gd2hpY2ggd2hpbGUgaW1wbGVtZW50ZWQKKyAgICAgKiBkaWZmZXJlbnQgd2F5cyBpc24ndCBpbiB0aGUgY2hhbm5lbCBhbmQgaGVuY2Ugc29tZXdoYXQKKyAgICAgKiBtb3JlIHJlbGlhYmxlCisgICAgICovCisKKyAgICBpZiAobGlua19zdGF0dXMgJiBUMUZfUk1ZRUwpIHsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgaWYoc2MtPmxhc3RfbGVkX2VyclswXSAhPSAxKXsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZWNlaXZlIFllbGxvdyBBSVMgQWxhcm1cbiIsIHNjLT5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDApOworICAgICAgICBzYy0+bGFzdF9sZWRfZXJyWzBdID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmKHNjLT5sYXN0X2xlZF9lcnJbMF0gIT0gMCl7CisgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogRW5kIG9mIFllbGxvdyBBSVMgQWxhcm1cbiIsIHNjLT5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBsbWNfbGVkX29mZihzYywgTE1DX0RTM19MRUQwKTsKKyAgICAgICAgc2MtPmxhc3RfbGVkX2VyclswXSA9IDA7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBMb3NzIG9mIHNpZ25hbCBhbmQgbG9zIG9mIGZyYW1lCisgICAgICogVXNlIHRoZSBncmVlbiBiaXQgdG8gaWRlbnRpZnkgd2hpY2ggb25lIGxpdCB0aGUgbGVkCisgICAgICovCisgICAgaWYobGlua19zdGF0dXMgJiBUMUZfUkxPRil7CisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGlmKHNjLT5sYXN0X2xlZF9lcnJbM10gIT0gMSl7CisgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogTG9jYWwgUmVkIEFsYXJtOiBMb3NzIG9mIEZyYW1pbmdcbiIsIHNjLT5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBsbWNfbGVkX29uKHNjLCBMTUNfRFMzX0xFRDMpOworICAgICAgICBzYy0+bGFzdF9sZWRfZXJyWzNdID0gMTsKKworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYoc2MtPmxhc3RfbGVkX2VyclszXSAhPSAwKXsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBFbmQgUmVkIEFsYXJtIChMT0YpXG4iLCBzYy0+bmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYoICEgKGxpbmtfc3RhdHVzICYgVDFGX1JMT1MpKQorICAgICAgICAgICAgbG1jX2xlZF9vZmYoc2MsIExNQ19EUzNfTEVEMyk7CisgICAgICAgIHNjLT5sYXN0X2xlZF9lcnJbM10gPSAwOworICAgIH0KKyAgICAKKyAgICBpZihsaW5rX3N0YXR1cyAmIFQxRl9STE9TKXsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgaWYoc2MtPmxhc3RfbGVkX2VyclsyXSAhPSAxKXsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBMb2NhbCBSZWQgQWxhcm06IExvc3Mgb2YgU2lnbmFsXG4iLCBzYy0+bmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgbG1jX2xlZF9vbihzYywgTE1DX0RTM19MRUQzKTsKKyAgICAgICAgc2MtPmxhc3RfbGVkX2VyclsyXSA9IDE7CisKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmKHNjLT5sYXN0X2xlZF9lcnJbMl0gIT0gMCl7CisgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogRW5kIFJlZCBBbGFybSAoTE9TKVxuIiwgc2MtPm5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmKCAhIChsaW5rX3N0YXR1cyAmIFQxRl9STE9GKSkKKyAgICAgICAgICAgIGxtY19sZWRfb2ZmKHNjLCBMTUNfRFMzX0xFRDMpOworICAgICAgICBzYy0+bGFzdF9sZWRfZXJyWzJdID0gMDsKKyAgICB9CisKKyAgICBzYy0+bG1jX3hpbmZvLnQxX2FsYXJtMV9zdGF0dXMgPSBsaW5rX3N0YXR1czsKKworICAgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNywgVDFGUkFNRVJfQUxBUk0yX1NUQVRVUyk7CisgICAgc2MtPmxtY194aW5mby50MV9hbGFybTJfc3RhdHVzID0gbG1jX21paV9yZWFkcmVnIChzYywgMCwgMTgpOworCisgICAgCisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX3QxX2dldF9saW5rX3N0YXR1cyBvdXQiKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiAxID09IFQxIENpcmN1aXQgVHlwZSAsIDAgPT0gRTEgQ2lyY3VpdCBUeXBlCisgKi8KK3N0YXRpYyB2b2lkCitsbWNfdDFfc2V0X2NpcmN1aXRfdHlwZSAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgaW50IGllKQoreworICBpZiAoaWUgPT0gTE1DX0NUTF9DSVJDVUlUX1RZUEVfVDEpIHsKKyAgICAgIHNjLT5sbWNfbWlpcmVnMTYgfD0gTE1DX01JSTE2X1QxX1o7CisgICAgICBzYy0+aWN0bC5jaXJjdWl0X3R5cGUgPSBMTUNfQ1RMX0NJUkNVSVRfVFlQRV9UMTsKKyAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBJbiBUMSBNb2RlXG4iLCBzYy0+bmFtZSk7CisgIH0KKyAgZWxzZSB7CisgICAgICBzYy0+bG1jX21paXJlZzE2ICY9IH5MTUNfTUlJMTZfVDFfWjsKKyAgICAgIHNjLT5pY3RsLmNpcmN1aXRfdHlwZSA9IExNQ19DVExfQ0lSQ1VJVF9UWVBFX0UxOworICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEluIEUxIE1vZGVcbiIsIHNjLT5uYW1lKTsKKyAgfQorCisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7CisgIAorfQorCisvKgorICogMCA9PSAxNmJpdCwgMSA9PSAzMmJpdCAqLworc3RhdGljIHZvaWQKK2xtY190MV9zZXRfY3JjX2xlbmd0aCAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgaW50IHN0YXRlKQoreworICBpZiAoc3RhdGUgPT0gTE1DX0NUTF9DUkNfTEVOR1RIXzMyKQorICAgIHsKKyAgICAgIC8qIDMyIGJpdCAqLworICAgICAgc2MtPmxtY19taWlyZWcxNiB8PSBMTUNfTUlJMTZfVDFfQ1JDOworICAgICAgc2MtPmljdGwuY3JjX2xlbmd0aCA9IExNQ19DVExfQ1JDX0xFTkdUSF8zMjsKKyAgICAgIHNjLT5sbWNfY3JjU2l6ZSA9IExNQ19DVExfQ1JDX0JZVEVTSVpFXzQ7CisKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiAxNiBiaXQgKi8gc2MtPmxtY19taWlyZWcxNiAmPSB+TE1DX01JSTE2X1QxX0NSQzsKKyAgICAgIHNjLT5pY3RsLmNyY19sZW5ndGggPSBMTUNfQ1RMX0NSQ19MRU5HVEhfMTY7CisgICAgICBzYy0+bG1jX2NyY1NpemUgPSBMTUNfQ1RMX0NSQ19CWVRFU0laRV8yOworCisgICAgfQorCisgIGxtY19taWlfd3JpdGVyZWcgKHNjLCAwLCAxNiwgc2MtPmxtY19taWlyZWcxNik7Cit9CisKKy8qCisgKiAxID09IGludGVybmFsLCAwID09IGV4dGVybmFsCisgKi8KK3N0YXRpYyB2b2lkCitsbWNfdDFfc2V0X2Nsb2NrIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjLCBpbnQgaWUpCit7CisgIGludCBvbGQ7CisgIG9sZCA9IGllOworICBpZiAoaWUgPT0gTE1DX0NUTF9DTE9DS19TT1VSQ0VfRVhUKQorICAgIHsKKyAgICAgIHNjLT5sbWNfZ3BpbyAmPSB+KExNQ19HRVBfU1NJX1RYQ0xPQ0spOworICAgICAgTE1DX0NTUl9XUklURSAoc2MsIGNzcl9ncCwgc2MtPmxtY19ncGlvKTsKKyAgICAgIHNjLT5pY3RsLmNsb2NrX3NvdXJjZSA9IExNQ19DVExfQ0xPQ0tfU09VUkNFX0VYVDsKKyAgICAgIGlmKG9sZCAhPSBpZSkKKyAgICAgICAgcHJpbnRrIChMTUNfUFJJTlRGX0ZNVCAiOiBjbG9jayBleHRlcm5hbFxuIiwgTE1DX1BSSU5URl9BUkdTKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBzYy0+bG1jX2dwaW8gfD0gTE1DX0dFUF9TU0lfVFhDTE9DSzsKKyAgICAgIExNQ19DU1JfV1JJVEUgKHNjLCBjc3JfZ3AsIHNjLT5sbWNfZ3Bpbyk7CisgICAgICBzYy0+aWN0bC5jbG9ja19zb3VyY2UgPSBMTUNfQ1RMX0NMT0NLX1NPVVJDRV9JTlQ7CisgICAgICBpZihvbGQgIT0gaWUpCisgICAgICAgIHByaW50ayAoTE1DX1BSSU5URl9GTVQgIjogY2xvY2sgaW50ZXJuYWxcbiIsIExNQ19QUklOVEZfQVJHUyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorbG1jX3QxX3dhdGNoZG9nIChsbWNfc29mdGNfdCAqIGNvbnN0IHNjKQoreworfQorCitzdGF0aWMgdm9pZAorbG1jX3NldF9wcm90b2NvbCAobG1jX3NvZnRjX3QgKiBjb25zdCBzYywgbG1jX2N0bF90ICogY3RsKQoreworICBpZiAoY3RsID09IDApCisgICAgeworICAgICAgc2MtPmljdGwua2VlcGFsaXZlX29ub2ZmID0gTE1DX0NUTF9PTjsKKworICAgICAgcmV0dXJuOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX21lZGlhLmggYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19tZWRpYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkY2MwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19tZWRpYS5oCkBAIC0wLDAgKzEsNjUgQEAKKyNpZm5kZWYgX0xNQ19NRURJQV9IXworI2RlZmluZSBfTE1DX01FRElBX0hfCisKK2xtY19tZWRpYV90IGxtY19kczNfbWVkaWEgPSB7CisgIGxtY19kczNfaW5pdCwJCQkvKiBzcGVjaWFsIG1lZGlhIGluaXQgc3R1ZmYgKi8KKyAgbG1jX2RzM19kZWZhdWx0LAkJLyogcmVzZXQgdG8gZGVmYXVsdCBzdGF0ZSAqLworICBsbWNfZHMzX3NldF9zdGF0dXMsCQkvKiByZXNldCBzdGF0dXMgdG8gc3RhdGUgcHJvdmlkZWQgKi8KKyAgbG1jX2R1bW15X3NldF8xLAkJLyogc2V0IGNsb2NrIHNvdXJjZSAqLworICBsbWNfZHVtbXlfc2V0Ml8xLAkJLyogc2V0IGxpbmUgc3BlZWQgKi8KKyAgbG1jX2RzM19zZXRfMTAwZnQsCQkvKiBzZXQgY2FibGUgbGVuZ3RoICovCisgIGxtY19kczNfc2V0X3NjcmFtLAkJLyogc2V0IHNjcmFtYmxlciAqLworICBsbWNfZHMzX2dldF9saW5rX3N0YXR1cywJLyogZ2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBsaW5rIHN0YXR1cyAqLworICBsbWNfZHMzX3NldF9jcmNfbGVuZ3RoLAkvKiBzZXQgQ1JDIGxlbmd0aCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgVDEgb3IgRTEgY2lyY3VpdCB0eXBlICovCisgIGxtY19kczNfd2F0Y2hkb2cKK307CisKK2xtY19tZWRpYV90IGxtY19oc3NpX21lZGlhID0geworICBsbWNfaHNzaV9pbml0LAkJLyogc3BlY2lhbCBtZWRpYSBpbml0IHN0dWZmICovCisgIGxtY19oc3NpX2RlZmF1bHQsCQkvKiByZXNldCB0byBkZWZhdWx0IHN0YXRlICovCisgIGxtY19oc3NpX3NldF9zdGF0dXMsCQkvKiByZXNldCBzdGF0dXMgdG8gc3RhdGUgcHJvdmlkZWQgKi8KKyAgbG1jX2hzc2lfc2V0X2Nsb2NrLAkJLyogc2V0IGNsb2NrIHNvdXJjZSAqLworICBsbWNfZHVtbXlfc2V0Ml8xLAkJLyogc2V0IGxpbmUgc3BlZWQgKi8KKyAgbG1jX2R1bW15X3NldF8xLAkJLyogc2V0IGNhYmxlIGxlbmd0aCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgc2NyYW1ibGVyICovCisgIGxtY19oc3NpX2dldF9saW5rX3N0YXR1cywJLyogZ2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19oc3NpX3NldF9saW5rX3N0YXR1cywJLyogc2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19oc3NpX3NldF9jcmNfbGVuZ3RoLAkvKiBzZXQgQ1JDIGxlbmd0aCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgVDEgb3IgRTEgY2lyY3VpdCB0eXBlICovCisgIGxtY19oc3NpX3dhdGNoZG9nCit9OworCitsbWNfbWVkaWFfdCBsbWNfc3NpX21lZGlhID0geyBsbWNfc3NpX2luaXQsCS8qIHNwZWNpYWwgbWVkaWEgaW5pdCBzdHVmZiAqLworICBsbWNfc3NpX2RlZmF1bHQsCQkvKiByZXNldCB0byBkZWZhdWx0IHN0YXRlICovCisgIGxtY19zc2lfc2V0X3N0YXR1cywJCS8qIHJlc2V0IHN0YXR1cyB0byBzdGF0ZSBwcm92aWRlZCAqLworICBsbWNfc3NpX3NldF9jbG9jaywJCS8qIHNldCBjbG9jayBzb3VyY2UgKi8KKyAgbG1jX3NzaV9zZXRfc3BlZWQsCQkvKiBzZXQgbGluZSBzcGVlZCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgY2FibGUgbGVuZ3RoICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBzY3JhbWJsZXIgKi8KKyAgbG1jX3NzaV9nZXRfbGlua19zdGF0dXMsCS8qIGdldCBsaW5rIHN0YXR1cyAqLworICBsbWNfc3NpX3NldF9saW5rX3N0YXR1cywJLyogc2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19zc2lfc2V0X2NyY19sZW5ndGgsCS8qIHNldCBDUkMgbGVuZ3RoICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBUMSBvciBFMSBjaXJjdWl0IHR5cGUgKi8KKyAgbG1jX3NzaV93YXRjaGRvZworfTsKKworbG1jX21lZGlhX3QgbG1jX3QxX21lZGlhID0geworICBsbWNfdDFfaW5pdCwJCQkvKiBzcGVjaWFsIG1lZGlhIGluaXQgc3R1ZmYgKi8KKyAgbG1jX3QxX2RlZmF1bHQsCQkvKiByZXNldCB0byBkZWZhdWx0IHN0YXRlICovCisgIGxtY190MV9zZXRfc3RhdHVzLAkJLyogcmVzZXQgc3RhdHVzIHRvIHN0YXRlIHByb3ZpZGVkICovCisgIGxtY190MV9zZXRfY2xvY2ssCQkvKiBzZXQgY2xvY2sgc291cmNlICovCisgIGxtY19kdW1teV9zZXQyXzEsCQkvKiBzZXQgbGluZSBzcGVlZCAqLworICBsbWNfZHVtbXlfc2V0XzEsCQkvKiBzZXQgY2FibGUgbGVuZ3RoICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBzY3JhbWJsZXIgKi8KKyAgbG1jX3QxX2dldF9saW5rX3N0YXR1cywJLyogZ2V0IGxpbmsgc3RhdHVzICovCisgIGxtY19kdW1teV9zZXRfMSwJCS8qIHNldCBsaW5rIHN0YXR1cyAqLworICBsbWNfdDFfc2V0X2NyY19sZW5ndGgsCS8qIHNldCBDUkMgbGVuZ3RoICovCisgIGxtY190MV9zZXRfY2lyY3VpdF90eXBlLAkvKiBzZXQgVDEgb3IgRTEgY2lyY3VpdCB0eXBlICovCisgIGxtY190MV93YXRjaGRvZworfTsKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfcHJvdC5oIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfcHJvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYjFkZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19wcm90LmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBfTE1DX1BST1RPX0hfCisjZGVmaW5lIF9MTUNfUFJPVE9fSF8KKwordm9pZCBsbWNfcHJvdG9faW5pdChsbWNfc29mdGNfdCAqIGNvbnN0KQordm9pZCBsbWNfcHJvdG9fYXR0YWNoKGxtY19zb2Z0Y190ICpzYyBjb25zdCkKK3ZvaWQgbG1jX3Byb3RvX2RldGFjaChsbWNfc29mdGMgKnNjIGNvbnN0KQordm9pZCBsbWNfcHJvdG9fcmVvcGVuKGxtY19zb2Z0Y190ICpzYyBjb25zdCkKK2ludCBsbWNfcHJvdG9faW9jdGwobG1jX3NvZnRjX3QgKnNjIGNvbnN0LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3ZvaWQgbG1jX3Byb3RvX29wZW4obG1jX3NvZnRjX3QgKnNjIGNvbnN0KQordm9pZCBsbWNfcHJvdG9fY2xvc2UobG1jX3NvZnRjX3QgKnNjIGNvbnN0KQordW5zaWduZWQgc2hvcnQgbG1jX3Byb3RvX3R5cGUobG1jX3NvZnRjX3QgKnNjIGNvbnN0LCBzdHJ1Y3Qgc2tidWZmICpza2IpCisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX3Byb3RvLmMgYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19wcm90by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ODc2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19wcm90by5jCkBAIC0wLDAgKzEsMjQ5IEBACisgLyoKKyAgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwMCBMQU4gTWVkaWEgQ29ycG9yYXRpb24gKExNQykKKyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgd3d3Lmxhbm1lZGlhLmNvbQorICAqCisgICogVGhpcyBjb2RlIGlzIHdyaXR0ZW4gYnk6CisgICogQW5kcmV3IFN0YW5sZXktSm9uZXMgKGFzakBjYmFuLmNvbSkKKyAgKiBSb2IgQnJhdW4gKGJicmF1bkB2aXguY29tKSwKKyAgKiBNaWNoYWVsIEdyYWZmIChleHBsb3JlckB2aXguY29tKSBhbmQKKyAgKiBNYXR0IFRob21hcyAobWF0dEAzYW0tc29mdHdhcmUuY29tKS4KKyAgKgorICAqIFdpdGggSGVscCBCeToKKyAgKiBEYXZpZCBCb2dncworICAqIFJvbiBDcmFuZQorICAqIEFsbGFuIENveAorICAqCisgICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICAqCisgICogRHJpdmVyIGZvciB0aGUgTGFuTWVkaWEgTE1DNTIwMCwgTE1DNTI0NSwgTE1DMTAwMCwgTE1DMTIwMCBjYXJkcy4KKyAgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxuZXQvc3luY3BwcC5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPiAgICAgICAgICAgICAvKiBQcm9jZXNzb3IgdHlwZSBmb3IgY2FjaGUgYWxpZ25tZW50LiAqLworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKworI2luY2x1ZGUgImxtYy5oIgorI2luY2x1ZGUgImxtY192YXIuaCIKKyNpbmNsdWRlICJsbWNfZGVidWcuaCIKKyNpbmNsdWRlICJsbWNfaW9jdGwuaCIKKyNpbmNsdWRlICJsbWNfcHJvdG8uaCIKKworLyoKKyAqIFRoZSBjb21waWxlLXRpbWUgdmFyaWFibGUgU1BQUFNUVVAgY2F1c2VzIHRoZSBtb2R1bGUgdG8gYmUKKyAqIGNvbXBpbGVkIHdpdGhvdXQgcmVmZXJlbmNpbmcgYW55IG9mIHRoZSBzeW5jIHBwcCByb3V0aW5lcy4KKyAqLworI2lmZGVmIFNQUFBTVFVCCisjZGVmaW5lIFNQUFBfZGV0YWNoKGQpCSh2b2lkKTAKKyNkZWZpbmUgU1BQUF9vcGVuKGQpCTAKKyNkZWZpbmUgU1BQUF9yZW9wZW4oZCkJKHZvaWQpMAorI2RlZmluZSBTUFBQX2Nsb3NlKGQpCSh2b2lkKTAKKyNkZWZpbmUgU1BQUF9hdHRhY2goZCkJKHZvaWQpMAorI2RlZmluZSBTUFBQX2RvX2lvY3RsKGQsaSxjKQktRU9QTk9UU1VQUAorI2Vsc2UKKyNkZWZpbmUgU1BQUF9hdHRhY2goeCkJc3BwcF9hdHRhY2goKHgpLT5wZCkKKyNkZWZpbmUgU1BQUF9kZXRhY2goeCkJc3BwcF9kZXRhY2goKHgpLT5wZC0+ZGV2KQorI2RlZmluZSBTUFBQX29wZW4oeCkJc3BwcF9vcGVuKCh4KS0+cGQtPmRldikKKyNkZWZpbmUgU1BQUF9yZW9wZW4oeCkJc3BwcF9yZW9wZW4oKHgpLT5wZC0+ZGV2KQorI2RlZmluZSBTUFBQX2Nsb3NlKHgpCXNwcHBfY2xvc2UoKHgpLT5wZC0+ZGV2KQorI2RlZmluZSBTUFBQX2RvX2lvY3RsKHgsIHksIHopCXNwcHBfZG9faW9jdGwoKHgpLT5wZC0+ZGV2LCAoeSksICh6KSkKKyNlbmRpZgorCisvLyBpbml0Cit2b2lkIGxtY19wcm90b19pbml0KGxtY19zb2Z0Y190ICpzYykgLypGT0xEMDAqLworeworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19wcm90b19pbml0IGluIik7CisgICAgc3dpdGNoKHNjLT5pZl90eXBlKXsKKyAgICBjYXNlIExNQ19QUFA6CisgICAgICAgIHNjLT5wZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcHBfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYy0+cGQpIHsKKwkJcHJpbnRrKCJsbWNfcHJvdG9faW5pdCgpOiBrbWFsbG9jIGZhaWx1cmUhXG4iKTsKKwkJcmV0dXJuOworCX0KKyAgICAgICAgc2MtPnBkLT5kZXYgPSBzYy0+bG1jX2RldmljZTsKKyAgICAgICAgc2MtPmlmX3B0ciA9IHNjLT5wZDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMTUNfUkFXOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX3Byb3RvX2luaXQgb3V0Iik7Cit9CisKKy8vIGF0dGFjaAordm9pZCBsbWNfcHJvdG9fYXR0YWNoKGxtY19zb2Z0Y190ICpzYykgLypGT0xEMDAqLworeworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19wcm90b19hdHRhY2ggaW4iKTsKKyAgICBzd2l0Y2goc2MtPmlmX3R5cGUpeworICAgIGNhc2UgTE1DX1BQUDoKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNjLT5sbWNfZGV2aWNlOworICAgICAgICAgICAgU1BQUF9hdHRhY2goc2MpOworICAgICAgICAgICAgZGV2LT5kb19pb2N0bCA9IGxtY19pb2N0bDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIExNQ19ORVQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzYy0+bG1jX2RldmljZTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGV5IHNldCBhIGZldyBiYXNpY3MgYmVjYXVzZSB0aGV5IGRvbid0IHVzZSBzeW5jX3BwcAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBkZXYtPmZsYWdzIHw9IElGRl9QT0lOVE9QT0lOVDsKKyAgICAgICAgICAgIGRldi0+aGFyZF9oZWFkZXIgPSBOVUxMOworICAgICAgICAgICAgZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSAwOworICAgICAgICAgICAgZGV2LT5hZGRyX2xlbiA9IDA7CisgICAgICAgIH0KKyAgICBjYXNlIExNQ19SQVc6IC8qIFNldHVwIHRoZSB0YXNrIHF1ZXVlLCBtYXliZSB3ZSBzaG91bGQgbm90aWZ5IHNvbWVvbmU/ICovCisgICAgICAgIHsKKyAgICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfcHJvdG9fYXR0YWNoIG91dCIpOworfQorCisvLyBkZXRhY2gKK3ZvaWQgbG1jX3Byb3RvX2RldGFjaChsbWNfc29mdGNfdCAqc2MpIC8qRk9MRDAwKi8KK3sKKyAgICBzd2l0Y2goc2MtPmlmX3R5cGUpeworICAgIGNhc2UgTE1DX1BQUDoKKyAgICAgICAgU1BQUF9kZXRhY2goc2MpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExNQ19SQVc6IC8qIFRlbGwgc29tZW9uZSB3ZSdyZSBkZXRhY2hpbmc/ICovCisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworfQorCisvLyByZW9wZW4KK3ZvaWQgbG1jX3Byb3RvX3Jlb3BlbihsbWNfc29mdGNfdCAqc2MpIC8qRk9MRDAwKi8KK3sKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfcHJvdG9fcmVvcGVuIGluIik7CisgICAgc3dpdGNoKHNjLT5pZl90eXBlKXsKKyAgICBjYXNlIExNQ19QUFA6CisgICAgICAgIFNQUFBfcmVvcGVuKHNjKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMTUNfUkFXOiAvKiBSZXNldCB0aGUgaW50ZXJmYWNlIGFmdGVyIGJlaW5nIGRvd24sIHByZXJhcGUgdG8gcmVjZWl2ZSBwYWNrZXRzIGFnYWluICovCisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfcHJvdG9fcmVvcGVuIG91dCIpOworfQorCisKKy8vIGlvY3RsCitpbnQgbG1jX3Byb3RvX2lvY3RsKGxtY19zb2Z0Y190ICpzYywgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpIC8qRk9MRDAwKi8KK3sKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfcHJvdG9faW9jdGwgb3V0Iik7CisgICAgc3dpdGNoKHNjLT5pZl90eXBlKXsKKyAgICBjYXNlIExNQ19QUFA6CisgICAgICAgIHJldHVybiBTUFBQX2RvX2lvY3RsIChzYywgaWZyLCBjbWQpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfcHJvdG9faW9jdGwgb3V0Iik7Cit9CisKKy8vIG9wZW4KK3ZvaWQgbG1jX3Byb3RvX29wZW4obG1jX3NvZnRjX3QgKnNjKSAvKkZPTEQwMCovCit7CisgICAgaW50IHJldDsKKworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19wcm90b19vcGVuIGluIik7CisgICAgc3dpdGNoKHNjLT5pZl90eXBlKXsKKyAgICBjYXNlIExNQ19QUFA6CisgICAgICAgIHJldCA9IFNQUFBfb3BlbihzYyk7CisgICAgICAgIGlmKHJldCA8IDApCisgICAgICAgICAgICBwcmludGsoIiVzOiBzeW5jUFBQIG9wZW4gZmFpbGVkOiAlZFxuIiwgc2MtPm5hbWUsIHJldCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTE1DX1JBVzogLyogV2UncmUgYWJvdXQgdG8gc3RhcnQgZ2V0dGluZyBwYWNrZXRzISAqLworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX3Byb3RvX29wZW4gb3V0Iik7Cit9CisKKy8vIGNsb3NlCisKK3ZvaWQgbG1jX3Byb3RvX2Nsb3NlKGxtY19zb2Z0Y190ICpzYykgLypGT0xEMDAqLworeworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19wcm90b19jbG9zZSBpbiIpOworICAgIHN3aXRjaChzYy0+aWZfdHlwZSl7CisgICAgY2FzZSBMTUNfUFBQOgorICAgICAgICBTUFBQX2Nsb3NlKHNjKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMTUNfUkFXOiAvKiBJbnRlcmZhY2UgZ29pbmcgZG93biAqLworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgbG1jX3RyYWNlKHNjLT5sbWNfZGV2aWNlLCAibG1jX3Byb3RvX2Nsb3NlIG91dCIpOworfQorCit1bnNpZ25lZCBzaG9ydCBsbWNfcHJvdG9fdHlwZShsbWNfc29mdGNfdCAqc2MsIHN0cnVjdCBza19idWZmICpza2IpIC8qRk9MRDAwKi8KK3sKKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfcHJvdG9fdHlwZSBpbiIpOworICAgIHN3aXRjaChzYy0+aWZfdHlwZSl7CisgICAgY2FzZSBMTUNfUFBQOgorICAgICAgICByZXR1cm4gaHRvbnMoRVRIX1BfV0FOX1BQUCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTE1DX05FVDoKKyAgICAgICAgcmV0dXJuIGh0b25zKEVUSF9QXzgwMl8yKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMTUNfUkFXOiAvKiBQYWNrZXQgdHlwZSBmb3Igc2tidWZmIGtpbmQgb2YgdXNlbGVzcyAqLworICAgICAgICByZXR1cm4gaHRvbnMoRVRIX1BfODAyXzIpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8gcHJvdG9jb2wgc2V0IGZvciB0aGlzIGludGVyZmFjZSwgYXNzdW1pbmcgODAyLjIgKHdoaWNoIGlzIHdyb25nISEpXG4iLCBzYy0+bmFtZSk7CisgICAgICAgIHJldHVybiBodG9ucyhFVEhfUF84MDJfMik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBsbWNfdHJhY2Uoc2MtPmxtY19kZXZpY2UsICJsbWNfcHJvdG9fdHllIG91dCIpOworCit9CisKK3ZvaWQgbG1jX3Byb3RvX25ldGlmKGxtY19zb2Z0Y190ICpzYywgc3RydWN0IHNrX2J1ZmYgKnNrYikgLypGT0xEMDAqLworeworICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19wcm90b19uZXRpZiBpbiIpOworICAgIHN3aXRjaChzYy0+aWZfdHlwZSl7CisgICAgY2FzZSBMTUNfUFBQOgorICAgIGNhc2UgTE1DX05FVDoKKyAgICBkZWZhdWx0OgorICAgICAgICBza2ItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisgICAgICAgIG5ldGlmX3J4KHNrYik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTE1DX1JBVzoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGxtY190cmFjZShzYy0+bG1jX2RldmljZSwgImxtY19wcm90b19uZXRpZiBvdXQiKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfcHJvdG8uaCBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX3Byb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwYTU1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX3Byb3RvLmgKQEAgLTAsMCArMSwxNiBAQAorI2lmbmRlZiBfTE1DX1BST1RPX0hfCisjZGVmaW5lIF9MTUNfUFJPVE9fSF8KKwordm9pZCBsbWNfcHJvdG9faW5pdChsbWNfc29mdGNfdCAqc2MpOwordm9pZCBsbWNfcHJvdG9fYXR0YWNoKGxtY19zb2Z0Y190ICpzYyk7Cit2b2lkIGxtY19wcm90b19kZXRhY2gobG1jX3NvZnRjX3QgKnNjKTsKK3ZvaWQgbG1jX3Byb3RvX3Jlb3BlbihsbWNfc29mdGNfdCAqc2MpOworaW50IGxtY19wcm90b19pb2N0bChsbWNfc29mdGNfdCAqc2MsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKK3ZvaWQgbG1jX3Byb3RvX29wZW4obG1jX3NvZnRjX3QgKnNjKTsKK3ZvaWQgbG1jX3Byb3RvX2Nsb3NlKGxtY19zb2Z0Y190ICpzYyk7Cit1bnNpZ25lZCBzaG9ydCBsbWNfcHJvdG9fdHlwZShsbWNfc29mdGNfdCAqc2MsIHN0cnVjdCBza19idWZmICpza2IpOwordm9pZCBsbWNfcHJvdG9fbmV0aWYobG1jX3NvZnRjX3QgKnNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2ludCBsbWNfc2tiX3Jhd3BhY2tldHMoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbiwgaW50IHVudXNlZCk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vbG1jL2xtY192YXIuaCBiL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX3Zhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMDAzYTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY192YXIuaApAQCAtMCwwICsxLDU3MCBAQAorI2lmbmRlZiBfTE1DX1ZBUl9IXworI2RlZmluZSBfTE1DX1ZBUl9IXworCisvKiAkSWQ6IGxtY192YXIuaCx2IDEuMTcgMjAwMC8wNC8wNiAxMjoxNjo0NyBhc2ogRXhwICQgKi8KKworIC8qCisgICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDAgTEFOIE1lZGlhIENvcnBvcmF0aW9uIChMTUMpCisgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gIHd3dy5sYW5tZWRpYS5jb20KKyAgKgorICAqIFRoaXMgY29kZSBpcyB3cml0dGVuIGJ5OgorICAqIEFuZHJldyBTdGFubGV5LUpvbmVzIChhc2pAY2Jhbi5jb20pCisgICogUm9iIEJyYXVuIChiYnJhdW5Adml4LmNvbSksCisgICogTWljaGFlbCBHcmFmZiAoZXhwbG9yZXJAdml4LmNvbSkgYW5kCisgICogTWF0dCBUaG9tYXMgKG1hdHRAM2FtLXNvZnR3YXJlLmNvbSkuCisgICoKKyAgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgICovCisKKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorCisjaWZuZGVmIF9fS0VSTkVMX18KK3R5cGVkZWYgc2lnbmVkIGNoYXIgczg7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdTg7CisKK3R5cGVkZWYgc2lnbmVkIHNob3J0IHMxNjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdTE2OworCit0eXBlZGVmIHNpZ25lZCBpbnQgczMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdTMyOworCit0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgczY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdTY0OworCisjZGVmaW5lIEJJVFNfUEVSX0xPTkcgMzIgCisKKyNlbmRpZgorCisvKgorICogYmFzaWMgZGVmaW5pdGlvbnMgdXNlZCBpbiBsbWMgaW5jbHVkZSBmaWxlcworICovCisKK3R5cGVkZWYgc3RydWN0IGxtY19fX3NvZnRjIGxtY19zb2Z0Y190OwordHlwZWRlZiBzdHJ1Y3QgbG1jX19fbWVkaWEgbG1jX21lZGlhX3Q7Cit0eXBlZGVmIHN0cnVjdCBsbWNfX19jdGwgbG1jX2N0bF90OworCisjZGVmaW5lIGxtY19jc3JwdHJfdCAgICB1bnNpZ25lZCBsb25nCisjZGVmaW5lIHVfaW50MTZfdAl1MTYKKyNkZWZpbmUgdV9pbnQ4X3QJdTgKKyNkZWZpbmUgdHVsaXBfdWludDMyX3QJdTMyCisKKyNkZWZpbmUgTE1DX1JFR19SQU5HRSAweDgwCisKKyNkZWZpbmUgTE1DX1BSSU5URl9GTVQgICIlcyIKKyNkZWZpbmUgTE1DX1BSSU5URl9BUkdTCShzYy0+bG1jX2RldmljZS0+bmFtZSkKKworI2RlZmluZSBUWF9USU1FT1VUICgyKkhaKQorCisjZGVmaW5lIExNQ19UWERFU0NTICAgICAgICAgICAgMzIKKyNkZWZpbmUgTE1DX1JYREVTQ1MgICAgICAgICAgICAzMgorCisjZGVmaW5lIExNQ19MSU5LX1VQICAgICAgICAgICAgMQorI2RlZmluZSBMTUNfTElOS19ET1dOICAgICAgICAgIDAKKworLyogVGhlc2UgbWFjcm9zIGZvciBnZW5lcmljIHJlYWQgYW5kIHdyaXRlIHRvIGFuZCBmcm9tIHRoZSBkZWMgY2hpcCAqLworI2RlZmluZSBMTUNfQ1NSX1JFQUQoc2MsIGNzcikgXAorCWlubCgoc2MpLT5sbWNfY3Nycy5jc3IpCisjZGVmaW5lIExNQ19DU1JfV1JJVEUoc2MsIHJlZywgdmFsKSBcCisJb3V0bCgodmFsKSwgKHNjKS0+bG1jX2NzcnMucmVnKQorCisvLyNpZmRlZiBfTElOVVhfREVMQVlfSAorLy8JI2RlZmluZSBTTE9XX0RPV05fSU8gdWRlbGF5KDIpOworLy8JI3VuZGVmIF9fU0xPV19ET1dOX0lPCisvLwkjZGVmaW5lIF9fU0xPV19ET1dOX0lPIHVkZWxheSgyKTsKKy8vI2VuZGlmCisKKyNkZWZpbmUgREVMQVkobikgU0xPV19ET1dOX0lPCisKKyNkZWZpbmUgbG1jX2RlbGF5KCkgaW5sKHNjLT5sbWNfY3Nycy5jc3JfOSkKKworLyogVGhpcyBtYWNybyBzeW5jJ3MgdXAgd2l0aCB0aGUgbWlpIHNvIHRoYXQgcmVhZHMgYW5kIHdyaXRlcyBjYW4gdGFrZSBwbGFjZSAqLworI2RlZmluZSBMTUNfTUlJX1NZTkMoc2MpIGRvIHtpbnQgbj0zMjsgd2hpbGUoIG4gPj0gMCApIHsgXAorICAgICAgICAgICAgICAgIExNQ19DU1JfV1JJVEUoKHNjKSwgY3NyXzksIDB4MjAwMDApOyBcCisJCWxtY19kZWxheSgpOyBcCisJCUxNQ19DU1JfV1JJVEUoKHNjKSwgY3NyXzksIDB4MzAwMDApOyBcCisgICAgICAgICAgICAgICAgbG1jX2RlbGF5KCk7IFwKKwkJbi0tOyB9fSB3aGlsZSgwKQorCitzdHJ1Y3QgbG1jX3JlZ2ZpbGVfdCB7CisgICAgbG1jX2NzcnB0cl90IGNzcl9idXNtb2RlOyAgICAgICAgICAgICAgICAgIC8qIENTUjAgKi8KKyAgICBsbWNfY3NycHRyX3QgY3NyX3R4cG9sbDsgICAgICAgICAgICAgICAgICAgLyogQ1NSMSAqLworICAgIGxtY19jc3JwdHJfdCBjc3Jfcnhwb2xsOyAgICAgICAgICAgICAgICAgICAvKiBDU1IyICovCisgICAgbG1jX2NzcnB0cl90IGNzcl9yeGxpc3Q7ICAgICAgICAgICAgICAgICAgIC8qIENTUjMgKi8KKyAgICBsbWNfY3NycHRyX3QgY3NyX3R4bGlzdDsgICAgICAgICAgICAgICAgICAgLyogQ1NSNCAqLworICAgIGxtY19jc3JwdHJfdCBjc3Jfc3RhdHVzOyAgICAgICAgICAgICAgICAgICAvKiBDU1I1ICovCisgICAgbG1jX2NzcnB0cl90IGNzcl9jb21tYW5kOyAgICAgICAgICAgICAgICAgIC8qIENTUjYgKi8KKyAgICBsbWNfY3NycHRyX3QgY3NyX2ludHI7ICAgICAgICAgICAgICAgICAgICAgLyogQ1NSNyAqLworICAgIGxtY19jc3JwdHJfdCBjc3JfbWlzc2VkX2ZyYW1lczsgICAgICAgICAgICAvKiBDU1I4ICovCisgICAgbG1jX2NzcnB0cl90IGNzcl85OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENTUjkgKi8KKyAgICBsbWNfY3NycHRyX3QgY3NyXzEwOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ1NSMTAgKi8KKyAgICBsbWNfY3NycHRyX3QgY3NyXzExOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ1NSMTEgKi8KKyAgICBsbWNfY3NycHRyX3QgY3NyXzEyOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ1NSMTIgKi8KKyAgICBsbWNfY3NycHRyX3QgY3NyXzEzOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ1NSMTMgKi8KKyAgICBsbWNfY3NycHRyX3QgY3NyXzE0OyAgICAgICAgICAgICAgICAgICAgICAgLyogQ1NSMTQgKi8KKyAgICBsbWNfY3NycHRyX3QgY3NyXzE1OyAgICAgICAgICAgICAgICAgICAgICAgLyogQ1NSMTUgKi8KK307CisKKyNkZWZpbmUgY3NyX2VuZXRyb20gICAgICAgICAgICAgY3NyXzkgICAvKiAyMTA0MCAqLworI2RlZmluZSBjc3JfcmVzZXJ2ZWQgICAgICAgICAgICBjc3JfMTAgIC8qIDIxMDQwICovCisjZGVmaW5lIGNzcl9mdWxsX2R1cGxleCAgICAgICAgIGNzcl8xMSAgLyogMjEwNDAgKi8KKyNkZWZpbmUgY3NyX2Jvb3Ryb20gICAgICAgICAgICAgY3NyXzEwICAvKiAyMTA0MS8yMTE0MEEvPz8gKi8KKyNkZWZpbmUgY3NyX2dwICAgICAgICAgICAgICAgICAgY3NyXzEyICAvKiAyMTE0MCogKi8KKyNkZWZpbmUgY3NyX3dhdGNoZG9nICAgICAgICAgICAgY3NyXzE1ICAvKiAyMTE0MCogKi8KKyNkZWZpbmUgY3NyX2dwX3RpbWVyICAgICAgICAgICAgY3NyXzExICAvKiAyMTA0MS8yMTE0MCogKi8KKyNkZWZpbmUgY3NyX3Nyb21fbWlpICAgICAgICAgICAgY3NyXzkgICAvKiAyMTA0MS8yMTE0MCogKi8KKyNkZWZpbmUgY3NyX3NpYV9zdGF0dXMgICAgICAgICAgY3NyXzEyICAvKiAyMTA0eCAqLworI2RlZmluZSBjc3Jfc2lhX2Nvbm5lY3Rpdml0eSAgICBjc3JfMTMgIC8qIDIxMDR4ICovCisjZGVmaW5lIGNzcl9zaWFfdHhfcnggICAgICAgICAgIGNzcl8xNCAgLyogMjEwNHggKi8KKyNkZWZpbmUgY3NyX3NpYV9nZW5lcmFsICAgICAgICAgY3NyXzE1ICAvKiAyMTA0eCAqLworCisvKiB0dWxpcCBsZW5ndGgvY29udHJvbCB0cmFuc21pdCBkZXNjcmlwdG9yIGRlZmluaXRpb25zCisgKiAgdXNlZCB0byBkZWZpbmUgYml0cyBpbiB0aGUgc2Vjb25kIHR1bGlwX2Rlc2NfdCBmaWVsZCAobGVuZ3RoKQorICogIGZvciB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvciAtYmF6ICovCisKKyNkZWZpbmUgTE1DX1RERVNfRklSU1RfQlVGRkVSX1NJWkUgICAgICAgKCh1X2ludDMyX3QpKDB4MDAwMDA3RkYpKQorI2RlZmluZSBMTUNfVERFU19TRUNPTkRfQlVGRkVSX1NJWkUgICAgICAoKHVfaW50MzJfdCkoMHgwMDNGRjgwMCkpCisjZGVmaW5lIExNQ19UREVTX0hBU0hfRklMVEVSSU5HICAgICAgICAgICgodV9pbnQzMl90KSgweDAwNDAwMDAwKSkKKyNkZWZpbmUgTE1DX1RERVNfRElTQUJMRV9QQURESU5HICAgICAgICAgKCh1X2ludDMyX3QpKDB4MDA4MDAwMDApKQorI2RlZmluZSBMTUNfVERFU19TRUNPTkRfQUREUl9DSEFJTkVEICAgICAoKHVfaW50MzJfdCkoMHgwMTAwMDAwMCkpCisjZGVmaW5lIExNQ19UREVTX0VORF9PRl9SSU5HICAgICAgICAgICAgICgodV9pbnQzMl90KSgweDAyMDAwMDAwKSkKKyNkZWZpbmUgTE1DX1RERVNfQUREX0NSQ19ESVNBQkxFICAgICAgICAgKCh1X2ludDMyX3QpKDB4MDQwMDAwMDApKQorI2RlZmluZSBMTUNfVERFU19TRVRVUF9QQUNLRVQgICAgICAgICAgICAoKHVfaW50MzJfdCkoMHgwODAwMDAwMCkpCisjZGVmaW5lIExNQ19UREVTX0lOVkVSU0VfRklMVEVSSU5HICAgICAgICgodV9pbnQzMl90KSgweDEwMDAwMDAwKSkKKyNkZWZpbmUgTE1DX1RERVNfRklSU1RfU0VHTUVOVCAgICAgICAgICAgKCh1X2ludDMyX3QpKDB4MjAwMDAwMDApKQorI2RlZmluZSBMTUNfVERFU19MQVNUX1NFR01FTlQgICAgICAgICAgICAoKHVfaW50MzJfdCkoMHg0MDAwMDAwMCkpCisjZGVmaW5lIExNQ19UREVTX0lOVEVSUlVQVF9PTl9DT01QTEVUSU9OICgodV9pbnQzMl90KSgweDgwMDAwMDAwKSkKKworI2RlZmluZSBUREVTX1NFQ09ORF9CVUZGRVJfU0laRV9CSVRfTlVNQkVSICAxMQorI2RlZmluZSBUREVTX0NPTExJU0lPTl9DT1VOVF9CSVRfTlVNQkVSICAgICAzCisKKy8qIENvbnN0YW50cyBmb3IgdGhlIFJDViBkZXNjcmlwdG9yIFJERVMgKi8KKworI2RlZmluZSBMTUNfUkRFU19PVkVSRkxPVyAgICAgICAgICAgICAoKHVfaW50MzJfdCkoMHgwMDAwMDAwMSkpCisjZGVmaW5lIExNQ19SREVTX0NSQ19FUlJPUiAgICAgICAgICAgICgodV9pbnQzMl90KSgweDAwMDAwMDAyKSkKKyNkZWZpbmUgTE1DX1JERVNfRFJJQkJMSU5HX0JJVCAgICAgICAgICAgICgodV9pbnQzMl90KSgweDAwMDAwMDA0KSkKKyNkZWZpbmUgTE1DX1JERVNfUkVQT1JUX09OX01JSV9FUlIgICAgKCh1X2ludDMyX3QpKDB4MDAwMDAwMDgpKQorI2RlZmluZSBMTUNfUkRFU19SQ1ZfV0FUQ0hET0dfVElNRU9VVCAoKHVfaW50MzJfdCkoMHgwMDAwMDAxMCkpCisjZGVmaW5lIExNQ19SREVTX0ZSQU1FX1RZUEUgICAgICAgICAgICgodV9pbnQzMl90KSgweDAwMDAwMDIwKSkKKyNkZWZpbmUgTE1DX1JERVNfQ09MTElTSU9OX1NFRU4gICAgICAgKCh1X2ludDMyX3QpKDB4MDAwMDAwNDApKQorI2RlZmluZSBMTUNfUkRFU19GUkFNRV9UT09fTE9ORyAgICAgICAoKHVfaW50MzJfdCkoMHgwMDAwMDA4MCkpCisjZGVmaW5lIExNQ19SREVTX0xBU1RfREVTQ1JJUFRPUiAgICAgICgodV9pbnQzMl90KSgweDAwMDAwMTAwKSkKKyNkZWZpbmUgTE1DX1JERVNfRklSU1RfREVTQ1JJUFRPUiAgICAgKCh1X2ludDMyX3QpKDB4MDAwMDAyMDApKQorI2RlZmluZSBMTUNfUkRFU19NVUxUSUNBU1RfRlJBTUUgICAgICAoKHVfaW50MzJfdCkoMHgwMDAwMDQwMCkpCisjZGVmaW5lIExNQ19SREVTX1JVTlRfRlJBTUUgICAgICAgICAgICgodV9pbnQzMl90KSgweDAwMDAwODAwKSkKKyNkZWZpbmUgTE1DX1JERVNfREFUQV9UWVBFICAgICAgICAgICAgKCh1X2ludDMyX3QpKDB4MDAwMDMwMDApKQorI2RlZmluZSBMTUNfUkRFU19MRU5HVEhfRVJST1IgICAgICAgICAoKHVfaW50MzJfdCkoMHgwMDAwNDAwMCkpCisjZGVmaW5lIExNQ19SREVTX0VSUk9SX1NVTU1BUlkgICAgICAgICgodV9pbnQzMl90KSgweDAwMDA4MDAwKSkKKyNkZWZpbmUgTE1DX1JERVNfRlJBTUVfTEVOR1RIICAgICAgICAgKCh1X2ludDMyX3QpKDB4M0ZGRjAwMDApKQorI2RlZmluZSBMTUNfUkRFU19PV05fQklUICAgICAgICAgICAgICAoKHVfaW50MzJfdCkoMHg4MDAwMDAwMCkpCisKKyNkZWZpbmUgUkRFU19GUkFNRV9MRU5HVEhfQklUX05VTUJFUiAgICAgICAxNgorCisjZGVmaW5lIExNQ19SREVTX0VSUk9SX01BU0sgKCAodV9pbnQzMl90KSggXAorCSAgTE1DX1JERVNfT1ZFUkZMT1cgXAorCXwgTE1DX1JERVNfRFJJQkJMSU5HX0JJVCBcCisJfCBMTUNfUkRFU19SRVBPUlRfT05fTUlJX0VSUiBcCisgICAgICAgIHwgTE1DX1JERVNfQ09MTElTSU9OX1NFRU4gKSApCisKKworLyoKKyAqIElvY3RsIGluZm8KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdV9pbnQzMl90CW47CisJdV9pbnQzMl90CW07CisJdV9pbnQzMl90CXY7CisJdV9pbnQzMl90CXg7CisJdV9pbnQzMl90CXI7CisJdV9pbnQzMl90CWY7CisJdV9pbnQzMl90CWV4YWN0OworfSBsbWNfYXY5MTEwX3Q7CisKKy8qCisgKiBDb21tb24gc3RydWN0dXJlIHBhc3NlZCB0byB0aGUgaW9jdGwgY29kZS4KKyAqLworc3RydWN0IGxtY19fX2N0bCB7CisJdV9pbnQzMl90CWNhcmR0eXBlOworCXVfaW50MzJfdAljbG9ja19zb3VyY2U7CQkvKiBIU1NJLCBUMSAqLworCXVfaW50MzJfdAljbG9ja19yYXRlOwkJLyogVDEgKi8KKwl1X2ludDMyX3QJY3JjX2xlbmd0aDsKKwl1X2ludDMyX3QJY2FibGVfbGVuZ3RoOwkJLyogRFMzICovCisJdV9pbnQzMl90CXNjcmFtYmxlcl9vbm9mZjsJLyogRFMzICovCisJdV9pbnQzMl90CWNhYmxlX3R5cGU7CQkvKiBUMSAqLworCXVfaW50MzJfdAlrZWVwYWxpdmVfb25vZmY7CS8qIHByb3RvY29sICovCisJdV9pbnQzMl90CXRpY2tzOwkJCS8qIHRpY2tzL3NlYyAqLworCXVuaW9uIHsKKwkJbG1jX2F2OTExMF90CXNzaTsKKwl9IGNhcmRzcGVjOworCXVfaW50MzJfdCAgICAgICBjaXJjdWl0X3R5cGU7ICAgLyogVDEgb3IgRTEgKi8KK307CisKKworLyoKKyAqIENhcmVmdWxsLCBsb29rIGF0IHRoZSBkYXRhIHNoZWV0LCB0aGVyZSdzIG1vcmUgdG8gdGhpcworICogc3RydWN0dXJlIHRoYW4gbWVldHMgdGhlIGV5ZS4gIEl0IHNob3VsZCBwcm9iYWJseSBiZToKKyAqCisgKiBzdHJ1Y3QgdHVsaXBfZGVzY190IHsKKyAqICAgICAgICAgdTggIG93bjoxOworICogICAgICAgICB1MzIgc3RhdHVzOjMxOworICogICAgICAgICB1MzIgY29udHJvbDoxMDsKKyAqICAgICAgICAgdTMyIGJ1ZmZlcjE7CisgKiAgICAgICAgIHUzMiBidWZmZXIyOworICogfTsKKyAqIFlvdSBjb3VsZCBhbHNvIGV4cGFuZCBzdGF0dXMgY29udHJvbCB0byBwcm92aWRlIG1vcmUgYml0IGluZm9ybWF0aW9uCisgKi8KKworc3RydWN0IHR1bGlwX2Rlc2NfdCB7CisJczMyIHN0YXR1czsKKwlzMzIgbGVuZ3RoOworCXUzMiBidWZmZXIxOworCXUzMiBidWZmZXIyOworfTsKKworLyoKKyAqIG1lZGlhIGluZGVwZW5kZW50IG1ldGhvZHMgdG8gY2hlY2sgb24gbWVkaWEgc3RhdHVzLCBsaW5rLCBsaWdodCBMRURzLAorICogZXRjLgorICovCitzdHJ1Y3QgbG1jX19fbWVkaWEgeworCXZvaWQJKCogaW5pdCkobG1jX3NvZnRjX3QgKiBjb25zdCk7CisJdm9pZAkoKiBkZWZhdWx0cykobG1jX3NvZnRjX3QgKiBjb25zdCk7CisJdm9pZAkoKiBzZXRfc3RhdHVzKShsbWNfc29mdGNfdCAqIGNvbnN0LCBsbWNfY3RsX3QgKik7CisJdm9pZAkoKiBzZXRfY2xvY2tfc291cmNlKShsbWNfc29mdGNfdCAqIGNvbnN0LCBpbnQpOworCXZvaWQJKCogc2V0X3NwZWVkKShsbWNfc29mdGNfdCAqIGNvbnN0LCBsbWNfY3RsX3QgKik7CisJdm9pZAkoKiBzZXRfY2FibGVfbGVuZ3RoKShsbWNfc29mdGNfdCAqIGNvbnN0LCBpbnQpOworCXZvaWQJKCogc2V0X3NjcmFtYmxlcikobG1jX3NvZnRjX3QgKiBjb25zdCwgaW50KTsKKwlpbnQJKCogZ2V0X2xpbmtfc3RhdHVzKShsbWNfc29mdGNfdCAqIGNvbnN0KTsKKwl2b2lkCSgqIHNldF9saW5rX3N0YXR1cykobG1jX3NvZnRjX3QgKiBjb25zdCwgaW50KTsKKwl2b2lkCSgqIHNldF9jcmNfbGVuZ3RoKShsbWNfc29mdGNfdCAqIGNvbnN0LCBpbnQpOworICAgICAgICB2b2lkICAgICgqIHNldF9jaXJjdWl0X3R5cGUpKGxtY19zb2Z0Y190ICogY29uc3QsIGludCk7CisgICAgICAgIHZvaWQJKCogd2F0Y2hkb2cpKGxtY19zb2Z0Y190ICogY29uc3QpOworfTsKKworCisjZGVmaW5lIFNUQVRDSEVDSyAgICAgMHhCRUVGQ0FGRQorCisvKiAgSW5jbHVkZWQgaW4gdGhpcyBzdHJ1Y3R1cmUgYXJlIGZpcnN0CisgKiAgIC0gc3RhbmRhcmQgbmV0X2RldmljZV9zdGF0cworICogICAtIHNvbWUgb3RoZXIgY291bnRlcnMgdXNlZCBmb3IgZGVidWcgYW5kIGRyaXZlciBwZXJmb3JtYW5jZQorICogIGV2YWx1YXRpb24gLWJhegorICovCitzdHJ1Y3QgbG1jX3N0YXRpc3RpY3MKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgcnhfcGFja2V0czsgICAgICAgICAgICAgLyogdG90YWwgcGFja2V0cyByZWNlaXZlZCAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBsb25nICAgICB0eF9wYWNrZXRzOyAgICAgICAgICAgICAvKiB0b3RhbCBwYWNrZXRzIHRyYW5zbWl0dGVkICAgICovCisJdW5zaWduZWQgbG9uZyAgICAgcnhfYnl0ZXM7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIHR4X2J5dGVzOworICAgICAgICAKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgcnhfZXJyb3JzOyAgICAgICAgICAgICAgLyogYmFkIHBhY2tldHMgcmVjZWl2ZWQgICAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBsb25nICAgICB0eF9lcnJvcnM7ICAgICAgICAgICAgICAvKiBwYWNrZXQgdHJhbnNtaXQgcHJvYmxlbXMgICAgICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIHJ4X2Ryb3BwZWQ7ICAgICAgICAgICAgIC8qIG5vIHNwYWNlIGluIGxpbnV4IGJ1ZmZlcnMgICAgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgdHhfZHJvcHBlZDsgICAgICAgICAgICAgLyogbm8gc3BhY2UgYXZhaWxhYmxlIGluIGxpbnV4ICAqLworICAgICAgICB1bnNpZ25lZCBsb25nICAgICBtdWx0aWNhc3Q7ICAgICAgICAgICAgICAvKiBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZCAgICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIGNvbGxpc2lvbnM7CisKKyAgICAgICAgLyogZGV0YWlsZWQgcnhfZXJyb3JzOiAqLworICAgICAgICB1bnNpZ25lZCBsb25nICAgICByeF9sZW5ndGhfZXJyb3JzOworICAgICAgICB1bnNpZ25lZCBsb25nICAgICByeF9vdmVyX2Vycm9yczsgICAgICAgICAvKiByZWNlaXZlciByaW5nIGJ1ZmYgb3ZlcmZsb3cgICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIHJ4X2NyY19lcnJvcnM7ICAgICAgICAgIC8qIHJlY3ZlZCBwa3Qgd2l0aCBjcmMgZXJyb3IgICAgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgcnhfZnJhbWVfZXJyb3JzOyAgICAgICAgLyogcmVjdidkIGZyYW1lIGFsaWdubWVudCBlcnJvciAqLworICAgICAgICB1bnNpZ25lZCBsb25nICAgICByeF9maWZvX2Vycm9yczsgICAgICAgICAvKiByZWN2J3IgZmlmbyBvdmVycnVuICAgICAgICAgICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIHJ4X21pc3NlZF9lcnJvcnM7ICAgICAgIC8qIHJlY2VpdmVyIG1pc3NlZCBwYWNrZXQgICAgICAgKi8KKworICAgICAgICAvKiBkZXRhaWxlZCB0eF9lcnJvcnMgKi8KKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgdHhfYWJvcnRlZF9lcnJvcnM7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgIHR4X2NhcnJpZXJfZXJyb3JzOworICAgICAgICB1bnNpZ25lZCBsb25nICAgICB0eF9maWZvX2Vycm9yczsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgdHhfaGVhcnRiZWF0X2Vycm9yczsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAgICAgdHhfd2luZG93X2Vycm9yczsKKworICAgICAgICAvKiBmb3IgY3NsaXAgZXRjICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgcnhfY29tcHJlc3NlZDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyB0eF9jb21wcmVzc2VkOworCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICogQ3VzdG9tIHN0YXRzICYgY291bnRlcnMgZm9sbG93IC1iYXogKi8KKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHZlcnNpb25fc2l6ZTsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIGxtY19jYXJkdHlwZTsKKworICAgICAgICB1X2ludDMyX3QgICAgICAgdHhfUHJvY1RpbWVvdXQ7CisgICAgICAgIHVfaW50MzJfdCAgICAgICB0eF9JbnRUaW1lb3V0OworICAgICAgICB1X2ludDMyX3QgICAgICAgdHhfTm9Db21wbGV0ZUNudDsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHR4X01heFhtdHNCNEludDsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHR4X1RpbWVvdXRDbnQ7CisgICAgICAgIHVfaW50MzJfdCAgICAgICB0eF9PdXRPZlN5bmNQdHI7CisgICAgICAgIHVfaW50MzJfdCAgICAgICB0eF90YnVzeTA7CisgICAgICAgIHVfaW50MzJfdCAgICAgICB0eF90YnVzeTE7CisgICAgICAgIHVfaW50MzJfdCAgICAgICB0eF90YnVzeV9jYWxsczsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHJlc2V0Q291bnQ7CisgICAgICAgIHVfaW50MzJfdCAgICAgICBsbWNfdHhmdWxsOworICAgICAgICB1X2ludDMyX3QgICAgICAgdGJ1c3k7CisgICAgICAgIHVfaW50MzJfdCAgICAgICBkaXJ0eVR4OworICAgICAgICB1X2ludDMyX3QgICAgICAgbG1jX25leHRfdHg7CisgICAgICAgIHVfaW50MzJfdCAgICAgICBvdGhlclR5cGVDbnQ7CisgICAgICAgIHVfaW50MzJfdCAgICAgICBsYXN0VHlwZTsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIGxhc3RUeXBlT0s7CisgICAgICAgIHVfaW50MzJfdCAgICAgICB0eExvb3BDbnQ7CisgICAgICAgIHVfaW50MzJfdCAgICAgICB1c2VkWG10RGVzY3JpcENudDsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHR4SW5kZXhDbnQ7CisgICAgICAgIHVfaW50MzJfdCAgICAgICByeEludExvb3BDbnQ7CisKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIHJ4X1NtYWxsUGt0Q250OworICAgICAgICB1X2ludDMyX3QgICAgICAgcnhfQmFkUGt0U3VyZ2VDbnQ7CisgICAgICAgIHVfaW50MzJfdCAgICAgICByeF9CdWZmQWxsb2NFcnI7CisgICAgICAgIHVfaW50MzJfdCAgICAgICB0eF9sb3NzT2ZDbG9ja0NudDsKKworICAgICAgICAvKiBUMSBlcnJvciBjb3VudGVycyAqLworICAgICAgICB1X2ludDMyX3QgICAgICAgZnJhbWluZ0JpdEVycm9yQ291bnQ7CisgICAgICAgIHVfaW50MzJfdCAgICAgICBsaW5lQ29kZVZpb2xhdGlvbkNvdW50OworCisgICAgICAgIHVfaW50MzJfdCAgICAgICBsb3NzT2ZGcmFtZUNvdW50OworICAgICAgICB1X2ludDMyX3QgICAgICAgY2hhbmdlT2ZGcmFtZUFsaWdubWVudENvdW50OworICAgICAgICB1X2ludDMyX3QgICAgICAgc2V2ZXJlbHlFcnJvcmVkRnJhbWVDb3VudDsKKworICAgICAgICB1X2ludDMyX3QgICAgICAgY2hlY2s7Cit9OworCisKK3R5cGVkZWYgc3RydWN0IGxtY194aW5mbyB7CisgICAgICAgIHVfaW50MzJfdCAgICAgICBNYWdpYzA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJFRUZDQUZFICovCisKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIFBjaUNhcmRUeXBlOworICAgICAgICB1X2ludDMyX3QgICAgICAgUGNpU2xvdE51bWJlcjsgICAgICAgICAgLyogUENJIHNsb3QgbnVtYmVyICAgICAgICovCisKKyAgICAgICAgdV9pbnQxNl90ICAgICAgIERyaXZlck1ham9yVmVyc2lvbjsKKyAgICAgICAgdV9pbnQxNl90ICAgICAgIERyaXZlck1pbm9yVmVyc2lvbjsKKyAgICAgICAgdV9pbnQxNl90ICAgICAgIERyaXZlclN1YlZlcnNpb247CisKKyAgICAgICAgdV9pbnQxNl90ICAgICAgIFhpbGlueFJldmlzaW9uTnVtYmVyOworICAgICAgICB1X2ludDE2X3QgICAgICAgTWF4RnJhbWVTaXplOworCisgICAgICAgIHVfaW50MTZfdCAgICAgICB0MV9hbGFybTFfc3RhdHVzOworICAgICAgICB1X2ludDE2X3QgICAgICAgdDFfYWxhcm0yX3N0YXR1czsKKworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBsaW5rX3N0YXR1czsKKyAgICAgICAgdV9pbnQzMl90ICAgICAgIG1paV9yZWcxNjsKKworICAgICAgICB1X2ludDMyX3QgICAgICAgTWFnaWMxOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBERUFEQkVFRiAqLworfSBMTUNfWElORk87CisKKworLyoKKyAqIGZvcndhcmQgZGVjbAorICovCitzdHJ1Y3QgbG1jX19fc29mdGMgeworICAgICAgICB2b2lkICppZl9wdHI7ICAgLyogR2VuZXJhbCBwdXJwb3NlIHBvaW50ZXIgKHVzZWQgYnkgU1BQUCkgKi8KKwljaGFyICAgICAgICAgICAgICAgICAgICpuYW1lOworCXU4CQkJYm9hcmRfaWR4OworCXN0cnVjdCBsbWNfc3RhdGlzdGljcyAgIHN0YXRzOworCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgICAgICpsbWNfZGV2aWNlOworCisJaW50ICAgICAgICAgICAgICAgICAgICAgaGFuZywgcnhkZXNjLCBiYWRfcGFja2V0LCBzb21lX2NvdW50ZXI7CisJdV9pbnQzMl90ICAgICAgICAgICAgICAgdHhnbzsKKwlzdHJ1Y3QgbG1jX3JlZ2ZpbGVfdAlsbWNfY3NyczsKKwl2b2xhdGlsZSB1X2ludDMyX3QJbG1jX3R4dGljazsKKwl2b2xhdGlsZSB1X2ludDMyX3QJbG1jX3J4dGljazsKKwl1X2ludDMyX3QJCWxtY19mbGFnczsKKwl1X2ludDMyX3QJCWxtY19pbnRybWFzazsJLyogb3VyIGNvcHkgb2YgY3NyX2ludHIgKi8KKwl1X2ludDMyX3QJCWxtY19jbWRtb2RlOwkvKiBvdXIgY29weSBvZiBjc3JfY21kbW9kZSAqLworCXVfaW50MzJfdAkJbG1jX2J1c21vZGU7CS8qIG91ciBjb3B5IG9mIGNzcl9idXNtb2RlICovCisJdV9pbnQzMl90CQlsbWNfZ3Bpb19pbzsJLyogc3RhdGUgb2YgaW4vb3V0IHNldHRpbmdzICovCisJdV9pbnQzMl90CQlsbWNfZ3BpbzsJLyogc3RhdGUgb2Ygb3V0cHV0cyAqLworCXN0cnVjdCBza19idWZmKgkJbG1jX3R4cVtMTUNfVFhERVNDU107CisJc3RydWN0IHNrX2J1ZmYqCQlsbWNfcnhxW0xNQ19SWERFU0NTXTsKKwl2b2xhdGlsZQorCXN0cnVjdCB0dWxpcF9kZXNjX3QJbG1jX3J4cmluZ1tMTUNfUlhERVNDU107CisJdm9sYXRpbGUKKwlzdHJ1Y3QgdHVsaXBfZGVzY190CWxtY190eHJpbmdbTE1DX1RYREVTQ1NdOworCXVuc2lnbmVkIGludAkJbG1jX25leHRfcngsIGxtY19uZXh0X3R4OworCXZvbGF0aWxlCisJdW5zaWduZWQgaW50CQlsbWNfdGFpbnRfdHgsIGxtY190YWludF9yeDsKKwlpbnQJCQlsbWNfdHhfc3RhcnQsIGxtY190eGZ1bGw7CisJaW50CQkJbG1jX3R4YnVzeTsKKwl1X2ludDE2X3QJCWxtY19taWlyZWcxNjsKKwlpbnQJCQlsbWNfb2s7CisJaW50CQkJbGFzdF9saW5rX3N0YXR1czsKKwlpbnQJCQlsbWNfY2FyZHR5cGU7CisJdV9pbnQzMl90ICAgICAgICAgICAgICAgbGFzdF9mcmFtZWVycjsKKwlsbWNfbWVkaWFfdAkgICAgICAgKmxtY19tZWRpYTsKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKKwlsbWNfY3RsX3QJCWljdGw7CisJdV9pbnQzMl90CQlUeERlc2NyaXB0Q29udHJvbEluaXQ7ICAKKworCWludCAgICAgICAgICAgICAgICAgICAgIHR4X1RpbWVvdXRJbmQ7IC8qIGFkZGl0aW9uYWwgZHJpdmVyIHN0YXRlICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgdHhfVGltZW91dERpc3BsYXk7CisJdW5zaWduZWQgaW50CQlsYXN0bG1jX3RhaW50X3R4OworCWludCAgICAgICAgICAgICAgICAgICAgIGxhc3R0eF9wYWNrZXRzOworCXVfaW50MzJfdAkJdHhfY2xvY2tTdGF0ZTsKKwl1X2ludDMyX3QJCWxtY19jcmNTaXplOworCUxNQ19YSU5GTwkJbG1jX3hpbmZvOyAKKwljaGFyICAgICAgICAgICAgICAgICAgICBsbWNfeWVsLCBsbWNfYmx1ZSwgbG1jX3JlZDsgLyogZm9yIFQxIGFuZCBEUzMgKi8KKyAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgbG1jX3RpbWluZzsgLyogZm9yIEhTU0kgYW5kIFNTSSAqLworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBnb3RfaXJxOworCisgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgIGxhc3RfbGVkX2Vycls0XTsKKworICAgICAgICB1MzIgICAgICAgICAgICAgICAgICAgICBsYXN0X2ludDsKKyAgICAgICAgdTMyICAgICAgICAgICAgICAgICAgICAgbnVtX2ludDsKKworCXNwaW5sb2NrX3QgICAgICAgICAgICAgIGxtY19sb2NrOworICAgICAgICB1X2ludDE2X3QgICAgICAgICAgICAgICBpZl90eXBlOyAgICAgICAvKiBQUFAgb3IgTkVUICovCisgICAgICAgIHN0cnVjdCBwcHBfZGV2aWNlICAgICAgICpwZDsKKworICAgICAgICAvKiBGYWlsdXJlIGNhc2VzICovCisgICAgICAgIHU4ICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWRfcmluZzsKKyAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZF9yZWN2X2FsbG9jOworCisgICAgICAgIC8qIFN0cnVjdHVyZSBjaGVjayAqLworICAgICAgICB1MzIgICAgICAgICAgICAgICAgICAgICBjaGVjazsKK307CisKKyNkZWZpbmUgTE1DX1BDSV9USU1FIDEKKyNkZWZpbmUgTE1DX0VYVF9USU1FIDAKKworI2RlZmluZSBQS1RfQlVGX1NaICAgICAgICAgICAgICAxNTQyICAvKiB3YXMgMTUzNiAqLworCisvKiBDU1I1IHNldHRpbmdzICovCisjZGVmaW5lIFRJTUVSX0lOVCAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBUUF9MSU5LX0ZBSUwgIDB4MDAwMDEwMDAKKyNkZWZpbmUgVFBfTElOS19QQVNTICAweDAwMDAwMDEwCisjZGVmaW5lIE5PUk1BTF9JTlQgICAgMHgwMDAxMDAwMAorI2RlZmluZSBBQk5PUk1BTF9JTlQgIDB4MDAwMDgwMDAKKyNkZWZpbmUgUlhfSkFCQkVSX0lOVCAweDAwMDAwMjAwCisjZGVmaW5lIFJYX0RJRUQgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBSWF9OT0JVRkYgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgUlhfSU5UICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFRYX0ZJRk9fVU5ERVIgMHgwMDAwMDAyMAorI2RlZmluZSBUWF9KQUJCRVIgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgVFhfTk9CVUZGICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFRYX0RJRUQgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBUWF9JTlQgICAgICAgIDB4MDAwMDAwMDEKKworLyogQ1NSNiBzZXR0aW5ncyAqLworI2RlZmluZSBPUEVSQVRJT05fTU9ERSAgMHgwMDAwMDIwMCAvKiBGdWxsIER1cGxleCAgICAgICovCisjZGVmaW5lIFBST01JU0NfTU9ERSAgICAweDAwMDAwMDQwIC8qIFByb21pc2N1b3VzIE1vZGUgKi8KKyNkZWZpbmUgUkVDSUVWRV9BTEwgICAgIDB4NDAwMDAwMDAgLyogUmVjaWV2ZSBBbGwgICAgICAqLworI2RlZmluZSBQQVNTX0JBRF9GUkFNRVMgMHgwMDAwMDAwOCAvKiBQYXNzIEJhZCBGcmFtZXMgICovCisKKy8qIERlYyBjb250cm9sIHJlZ2lzdGVycyAgQ1NSNiBhcyB3ZWxsICovCisjZGVmaW5lIExNQ19ERUNfU1QgMHgwMDAwMjAwMAorI2RlZmluZSBMTUNfREVDX1NSIDB4MDAwMDAwMDIKKworLyogQ1NSMTUgc2V0dGluZ3MgKi8KKyNkZWZpbmUgUkVDVl9XQVRDSERPR19ESVNBQkxFIDB4MDAwMDAwMTAKKyNkZWZpbmUgSkFCQkVSX0RJU0FCTEUgICAgICAgIDB4MDAwMDAwMDEKKworLyogTW9yZSBzZXR0aW5ncyAqLworLyoKKyAqIGFTUjYgLS0gQ29tbWFuZCAoT3BlcmF0aW9uIE1vZGUpIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgVFVMSVBfQ01EX1JFQ0VJVkVBTEwgICAgMHg0MDAwMDAwMEwgLyogKFJXKSAgUmVjZWl2ZWwgYWxsIGZyYW1lcz8gKi8KKyNkZWZpbmUgVFVMSVBfQ01EX01VU1RCRU9ORSAgICAgMHgwMjAwMDAwMEwgLyogKFJXKSAgTXVzdCBCZSBPbmUgKDIxMTQwKSAqLworI2RlZmluZSBUVUxJUF9DTURfVFhUSFJTSExEQ1RMICAweDAwNDAwMDAwTCAvKiAoUlcpICBUcmFuc21pdCBUaHJlc2hvbGQgTW9kZSAoMjExNDApICovCisjZGVmaW5lIFRVTElQX0NNRF9TVE9SRUZXRCAgICAgIDB4MDAyMDAwMDBMIC8qIChSVykgIFN0b3JlIGFuZCBGb3dhcmQgKDIxMTQwKSAqLworI2RlZmluZSBUVUxJUF9DTURfTk9IRUFSVEJFQVQgICAweDAwMDgwMDAwTCAvKiAoUlcpICBObyBIZWFydGJlYXQgKDIxMTQwKSAqLworI2RlZmluZSBUVUxJUF9DTURfUE9SVFNFTEVDVCAgICAweDAwMDQwMDAwTCAvKiAoUlcpICBQb3N0IFNlbGVjdCAoMTAwTWIpICgyMTE0MCkgKi8KKyNkZWZpbmUgVFVMSVBfQ01EX0ZVTExEVVBMRVggICAgMHgwMDAwMDIwMEwgLyogKFJXKSAgRnVsbCBEdXBsZXggTW9kZSAqLworI2RlZmluZSBUVUxJUF9DTURfT1BFUk1PREUgICAgICAweDAwMDAwQzAwTCAvKiAoUlcpICBPcGVyYXRpbmcgTW9kZSAqLworI2RlZmluZSBUVUxJUF9DTURfUFJPTUlTQ1VPVVMgICAweDAwMDAwMDQxTCAvKiAoUlcpICBQcm9taXNjdW91cyBNb2RlICovCisjZGVmaW5lIFRVTElQX0NNRF9QQVNTQkFEUEtUICAgIDB4MDAwMDAwMDhMIC8qIChSVykgIFBhc3MgQmFkIEZyYW1lcyAqLworI2RlZmluZSBUVUxJUF9DTURfVEhSRVNIT0xEQ1RMICAweDAwMDBDMDAwTCAvKiAoUlcpICBUaHJlc2hvbGQgQ29udHJvbCAqLworCisjZGVmaW5lIFRVTElQX0dQX1BJTlNFVCAgICAgICAgIDB4MDAwMDAxMDBMCisjZGVmaW5lIFRVTElQX0JVU01PREVfU1dSRVNFVCAgIDB4MDAwMDAwMDFMCisjZGVmaW5lIFRVTElQX1dBVENIRE9HX1RYRElTQUJMRSAweDAwMDAwMDAxTAorI2RlZmluZSBUVUxJUF9XQVRDSERPR19SWERJU0FCTEUgMHgwMDAwMDAxMEwKKworI2RlZmluZSBUVUxJUF9TVFNfTk9STUFMSU5UUiAgICAweDAwMDEwMDAwTCAvKiAoUlcpICBOb3JtYWwgSW50ZXJydXB0ICovCisjZGVmaW5lIFRVTElQX1NUU19BQk5STUxJTlRSICAgIDB4MDAwMDgwMDBMIC8qIChSVykgIEFibm9ybWFsIEludGVycnVwdCAqLworI2RlZmluZSBUVUxJUF9TVFNfRVJJICAgICAgICAgICAweDAwMDA0MDAwTCAvKiAoUlcpICBFYXJseSBSZWNlaXZlIEludGVycnVwdCAqLworI2RlZmluZSBUVUxJUF9TVFNfU1lTRVJST1IgICAgICAweDAwMDAyMDAwTCAvKiAoUlcpICBTeXN0ZW0gRXJyb3IgKi8KKyNkZWZpbmUgVFVMSVBfU1RTX0dURSAgICAgICAgICAgMHgwMDAwMDgwMEwgLyogKFJXKSAgR2VuZXJhbCBQdXBvc2UgVGltZXIgRXhwICovCisjZGVmaW5lIFRVTElQX1NUU19FVEkgICAgICAgICAgIDB4MDAwMDA0MDBMIC8qIChSVykgIEVhcmx5IFRyYW5zbWl0IEludGVycnVwdCAqLworI2RlZmluZSBUVUxJUF9TVFNfUlhXVCAgICAgICAgICAweDAwMDAwMjAwTCAvKiAoUlcpICBSZWNlaXZlciBXYXRjaGRvZyBUaW1lb3V0ICovCisjZGVmaW5lIFRVTElQX1NUU19SWFNUT1BQRUQgICAgIDB4MDAwMDAxMDBMIC8qIChSVykgIFJlY2VpdmVyIFByb2Nlc3MgU3RvcHBlZCAqLworI2RlZmluZSBUVUxJUF9TVFNfUlhOT0JVRiAgICAgICAweDAwMDAwMDgwTCAvKiAoUlcpICBSZWNlaXZlIEJ1ZiBVbmF2YWlsICovCisjZGVmaW5lIFRVTElQX1NUU19SWElOVFIgICAgICAgIDB4MDAwMDAwNDBMIC8qIChSVykgIFJlY2VpdmUgSW50ZXJydXB0ICovCisjZGVmaW5lIFRVTElQX1NUU19UWFVOREVSRkxPVyAgIDB4MDAwMDAwMjBMIC8qIChSVykgIFRyYW5zbWl0IFVuZGVyZmxvdyAqLworI2RlZmluZSBUVUxJUF9TVFNfVFhKQUJFUiAgICAgICAweDAwMDAwMDA4TCAvKiAoUlcpICBKYWJiZXIgdGltZW91dCAqLworI2RlZmluZSBUVUxJUF9TVFNfVFhOT0JVRiAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBUVUxJUF9TVFNfVFhTVE9QUEVEICAgICAweDAwMDAwMDAyTCAvKiAoUlcpICBUcmFuc21pdCBQcm9jZXNzIFN0b3BwZWQgKi8KKyNkZWZpbmUgVFVMSVBfU1RTX1RYSU5UUiAgICAgICAgMHgwMDAwMDAwMUwgLyogKFJXKSAgVHJhbnNtaXQgSW50ZXJydXB0ICovCisKKyNkZWZpbmUgVFVMSVBfU1RTX1JYU19TVE9QUEVEICAgMHgwMDAwMDAwMEwgLyogICAgICAgIDAwMCAtIFN0b3BwZWQgKi8KKworI2RlZmluZSBUVUxJUF9TVFNfUlhTVE9QUEVEICAgICAweDAwMDAwMTAwTCAgICAgICAgICAgICAvKiAoUlcpICBSZWNlaXZlIFByb2Nlc3MgU3RvcHBlZCAqLworI2RlZmluZSBUVUxJUF9TVFNfUlhOT0JVRiAgICAgICAweDAwMDAwMDgwTAorCisjZGVmaW5lIFRVTElQX0NNRF9UWFJVTiAgICAgICAgIDB4MDAwMDIwMDBMIC8qIChSVykgIFN0YXJ0L1N0b3AgVHJhbnNtaXR0ZXIgKi8KKyNkZWZpbmUgVFVMSVBfQ01EX1JYUlVOICAgICAgICAgMHgwMDAwMDAwMkwgLyogKFJXKSAgU3RhcnQvU3RvcCBSZWNlaXZlIEZpbHRlcmluZyAqLworI2RlZmluZSBUVUxJUF9EU1RTX1R4REVGRVJSRUQgICAweDAwMDAwMDAxICAgICAgLyogSW5pdGlhbGx5IERlZmVycmVkICovCisjZGVmaW5lIFRVTElQX0RTVFNfT1dORVIgICAgICAgIDB4ODAwMDAwMDAgICAgICAvKiBPd25lciAoMSA9IDIxMDQwKSAqLworI2RlZmluZSBUVUxJUF9EU1RTX1J4TUlJRVJSICAgICAweDAwMDAwMDA4CisjZGVmaW5lIExNQ19EU1RTX0VSUlNVTSAgICAgICAgIChUVUxJUF9EU1RTX1J4TUlJRVJSKQorCisjZGVmaW5lIFRVTElQX0RFRkFVTFRfSU5UUl9NQVNLICAoVFVMSVBfU1RTX05PUk1BTElOVFIgXAorICB8IFRVTElQX1NUU19SWElOVFIgICAgICAgXAorICB8IFRVTElQX1NUU19UWElOVFIgICAgIFwKKyAgfCBUVUxJUF9TVFNfQUJOUk1MSU5UUiBcCisgIHwgVFVMSVBfU1RTX1NZU0VSUk9SICAgXAorICB8IFRVTElQX1NUU19UWFNUT1BQRUQgIFwKKyAgfCBUVUxJUF9TVFNfVFhVTkRFUkZMT1dcCisgIHwgVFVMSVBfU1RTX1JYU1RPUFBFRCApCisKKyNkZWZpbmUgREVTQ19PV05FRF9CWV9TWVNURU0gICAoKHVfaW50MzJfdCkoMHgwMDAwMDAwMCkpCisjZGVmaW5lIERFU0NfT1dORURfQllfREMyMVg0ICAgKCh1X2ludDMyX3QpKDB4ODAwMDAwMDApKQorCisjaWZuZGVmIFRVTElQX0NNRF9SRUNFSVZFQUxMCisjZGVmaW5lIFRVTElQX0NNRF9SRUNFSVZFQUxMIDB4NDAwMDAwMDBMCisjZW5kaWYKKworLyogQWRhcHRlciBtb2R1bGUgbnVtYmVyICovCisjZGVmaW5lIExNQ19BREFQX0hTU0kgICAgICAgICAgIDIKKyNkZWZpbmUgTE1DX0FEQVBfRFMzICAgICAgICAgICAgMworI2RlZmluZSBMTUNfQURBUF9TU0kgICAgICAgICAgICA0CisjZGVmaW5lIExNQ19BREFQX1QxICAgICAgICAgICAgIDUKKworI2RlZmluZSBIRExDX0hEUl9MRU4gIDQKKyNkZWZpbmUgSERMQ19BRERSX0xFTiAxCisjZGVmaW5lIEhETENfU0xBUlAgICAgMHg4MDM1CisjZGVmaW5lIExNQ19NVFUgMTUwMAorI2RlZmluZSBTTEFSUF9MSU5FQ0hFQ0sgMgorCisjZGVmaW5lIExNQ19DUkNfTEVOXzE2IDIgIC8qIDE2LWJpdCBDUkMgKi8KKyNkZWZpbmUgTE1DX0NSQ19MRU5fMzIgNAorCisjaWZkZWYgTE1DX0hETEMKKy8qIGRlZmluaXRpb24gb2YgYW4gaGRsYyBoZWFkZXIuICovCitzdHJ1Y3QgaGRsY19oZHIKK3sKKwl1OCAgYWRkcmVzczsKKwl1OCAgY29udHJvbDsKKwl1MTYgdHlwZTsKK307CisKKy8qIGRlZmluaXRpb24gb2YgYSBzbGFycCBoZWFkZXIuICovCitzdHJ1Y3Qgc2xhcnAKK3sKKwlsb25nIGNvZGU7CisJdW5pb24gc2wKKwl7CisJCXN0cnVjdAorCQl7CisJCQl1bG9uZyBhZGRyZXNzOworCQkJdWxvbmcgbWFzazsKKwkJCXVzaG9ydCB1bnVzZWQ7CisJCX0gYWRkOworCQlzdHJ1Y3QKKwkJeworCQkJdWxvbmcgbXlzZXF1ZW5jZTsKKwkJCXVsb25nIHlvdXJzZXF1ZW5jZTsKKwkJCXVzaG9ydCByZWxpYWJpbGl0eTsKKwkJCXVsb25nIHRpbWU7CisJCX0gY2hrOworCX0gdDsKK307CisjZW5kaWYgLyogTE1DX0hETEMgKi8KKworCisjZW5kaWYgLyogX0xNQ19WQVJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9uMi5jIGIvZHJpdmVycy9uZXQvd2FuL24yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzMjc1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9uMi5jCkBAIC0wLDAgKzEsNTYyIEBACisvKgorICogU0RMIEluYy4gUklTQ29tL04yIHN5bmNocm9ub3VzIHNlcmlhbCBjYXJkIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMyBLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogRm9yIGluZm9ybWF0aW9uIHNlZSBodHRwOi8vaHEucG0ud2F3LnBsL2hkbGMvCisgKgorICogTm90ZTogaW50ZWdyYXRlZCBDU1UvRFNVL0REUyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlcgorICoKKyAqIFNvdXJjZXMgb2YgaW5mb3JtYXRpb246CisgKiAgICBIaXRhY2hpIEhENjQ1NzAgU0NBIFVzZXIncyBNYW51YWwKKyAqICAgIFNETCBJbmMuIFBQUC9IRExDL0NJU0NPIGRyaXZlcgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSAiaGQ2NDU3MC5oIgorCisKK3N0YXRpYyBjb25zdCBjaGFyKiB2ZXJzaW9uID0gIlNETCBSSVNDb20vTjIgZHJpdmVyIHZlcnNpb246IDEuMTUiOworc3RhdGljIGNvbnN0IGNoYXIqIGRldm5hbWUgPSAiUklTQ29tL04yIjsKKworI3VuZGVmIERFQlVHX1BLVAorI2RlZmluZSBERUJVR19SSU5HUworCisjZGVmaW5lIFVTRV9XSU5ET1dTSVpFIDE2Mzg0CisjZGVmaW5lIFVTRV9CVVMxNkJJVFMgMQorI2RlZmluZSBDTE9DS19CQVNFIDk4MzA0MDAJLyogOS44MzA0IE1IeiAqLworI2RlZmluZSBNQVhfUEFHRVMgICAgICAxNgkvKiAxNiBSQU0gcGFnZXMgYXQgbWF4ICovCisjZGVmaW5lIE1BWF9SQU1fU0laRSAweDgwMDAwCS8qIDUxMiBLQiAqLworI2lmIE1BWF9SQU1fU0laRSA+IE1BWF9QQUdFUyAqIFVTRV9XSU5ET1dTSVpFCisjdW5kZWYgTUFYX1JBTV9TSVpFCisjZGVmaW5lIE1BWF9SQU1fU0laRSAoTUFYX1BBR0VTICogVVNFX1dJTkRPV1NJWkUpCisjZW5kaWYKKyNkZWZpbmUgTjJfSU9QT1JUUyAweDEwCisjZGVmaW5lIE5FRURfREVURUNUX1JBTQorI2RlZmluZSBORUVEX1NDQV9NU0NJX0lOVFIKKyNkZWZpbmUgTUFYX1RYX0JVRkZFUlMgMTAKKworc3RhdGljIGNoYXIgKmh3ID0gTlVMTDsJLyogcG9pbnRlciB0byBodz14eHggY29tbWFuZCBsaW5lIHN0cmluZyAqLworCisvKiBSSVNDb20vTjIgQm9hcmQgUmVnaXN0ZXJzICovCisKKy8qIFBDIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTjJfUENSIDAKKyNkZWZpbmUgUENSX1JVTlNDQSAxICAgICAvKiBSdW4gNjQ1NzAgKi8KKyNkZWZpbmUgUENSX1ZQTSAgICAyICAgICAvKiBFbmFibGUgVlBNIC0gbmVlZGVkIGlmIHVzaW5nIFJBTSBhYm92ZSAxIE1CICovCisjZGVmaW5lIFBDUl9FTldJTiAgNCAgICAgLyogT3BlbiB3aW5kb3cgKi8KKyNkZWZpbmUgUENSX0JVUzE2ICA4ICAgICAvKiAxNi1iaXQgYnVzICovCisKKworLyogTWVtb3J5IEJhc2UgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZSBOMl9CQVIgMgorCisKKy8qIFBhZ2UgU2NhbiBSZWdpc3RlciAgKi8KKyNkZWZpbmUgTjJfUFNSIDQKKyNkZWZpbmUgV0lOMTZLICAgICAgIDB4MDAKKyNkZWZpbmUgV0lOMzJLICAgICAgIDB4MjAKKyNkZWZpbmUgV0lONjRLICAgICAgIDB4NDAKKyNkZWZpbmUgUFNSX1dJTkJJVFMgIDB4NjAKKyNkZWZpbmUgUFNSX0RNQUVOICAgIDB4ODAKKyNkZWZpbmUgUFNSX1BBR0VCSVRTIDB4MEYKKworCisvKiBNb2RlbSBDb250cm9sIFJlZyAqLworI2RlZmluZSBOMl9NQ1IgNgorI2RlZmluZSBDTE9DS19PVVRfUE9SVDEgMHg4MAorI2RlZmluZSBDTE9DS19PVVRfUE9SVDAgMHg0MAorI2RlZmluZSBUWDQyMl9QT1JUMSAgICAgMHgyMAorI2RlZmluZSBUWDQyMl9QT1JUMCAgICAgMHgxMAorI2RlZmluZSBEU1JfUE9SVDEgICAgICAgMHgwOAorI2RlZmluZSBEU1JfUE9SVDAgICAgICAgMHgwNAorI2RlZmluZSBEVFJfUE9SVDEgICAgICAgMHgwMgorI2RlZmluZSBEVFJfUE9SVDAgICAgICAgMHgwMQorCisKK3R5cGVkZWYgc3RydWN0IHBvcnRfcyB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgY2FyZF9zICpjYXJkOworCXNwaW5sb2NrX3QgbG9jazsJLyogVFggbG9jayAqLworCXN5bmNfc2VyaWFsX3NldHRpbmdzIHNldHRpbmdzOworCWludCB2YWxpZDsJCS8qIHBvcnQgZW5hYmxlZCAqLworCWludCByeHBhcnQ7CQkvKiBwYXJ0aWFsIGZyYW1lIHJlY2VpdmVkLCBuZXh0IGZyYW1lIGludmFsaWQqLworCXVuc2lnbmVkIHNob3J0IGVuY29kaW5nOworCXVuc2lnbmVkIHNob3J0IHBhcml0eTsKKwl1MTYgcnhpbjsJCS8qIHJ4IHJpbmcgYnVmZmVyICdpbicgcG9pbnRlciAqLworCXUxNiB0eGluOwkJLyogdHggcmluZyBidWZmZXIgJ2luJyBhbmQgJ2xhc3QnIHBvaW50ZXJzICovCisJdTE2IHR4bGFzdDsKKwl1OCByeHMsIHR4cywgdG1jOwkvKiBTQ0EgcmVnaXN0ZXJzICovCisJdTggcGh5X25vZGU7CQkvKiBwaHlzaWNhbCBwb3J0ICMgLSAwIG9yIDEgKi8KKwl1OCBsb2dfbm9kZTsJCS8qIGxvZ2ljYWwgcG9ydCAjICovCit9cG9ydF90OworCisKKwordHlwZWRlZiBzdHJ1Y3QgY2FyZF9zIHsKKwl1OCBfX2lvbWVtICp3aW5iYXNlOwkJLyogSVNBIHdpbmRvdyBiYXNlIGFkZHJlc3MgKi8KKwl1MzIgcGh5X3dpbmJhc2U7CS8qIElTQSBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgKi8KKwl1MzIgcmFtX3NpemU7CQkvKiBudW1iZXIgb2YgYnl0ZXMgKi8KKwl1MTYgaW87CQkJLyogSU8gQmFzZSBhZGRyZXNzICovCisJdTE2IGJ1ZmZfb2Zmc2V0OwkvKiBvZmZzZXQgb2YgZmlyc3QgYnVmZmVyIG9mIGZpcnN0IGNoYW5uZWwgKi8KKwl1MTYgcnhfcmluZ19idWZmZXJzOwkvKiBudW1iZXIgb2YgYnVmZmVycyBpbiBhIHJpbmcgKi8KKwl1MTYgdHhfcmluZ19idWZmZXJzOworCXU4IGlycTsJCQkvKiBJUlEgKDMtMTUpICovCisKKwlwb3J0X3QgcG9ydHNbMl07CisJc3RydWN0IGNhcmRfcyAqbmV4dF9jYXJkOworfWNhcmRfdDsKKworCitzdGF0aWMgY2FyZF90ICpmaXJzdF9jYXJkOworc3RhdGljIGNhcmRfdCAqKm5ld19jYXJkID0gJmZpcnN0X2NhcmQ7CisKKworI2RlZmluZSBzY2FfcmVnKHJlZywgY2FyZCkgKDB4ODAwMCB8IChjYXJkKS0+aW8gfCBcCisJCQkgICAgKChyZWcpICYgMHgwRikgfCAoKChyZWcpICYgMHhGMCkgPDwgNikpCisjZGVmaW5lIHNjYV9pbihyZWcsIGNhcmQpCQlpbmIoc2NhX3JlZyhyZWcsIGNhcmQpKQorI2RlZmluZSBzY2Ffb3V0KHZhbHVlLCByZWcsIGNhcmQpCW91dGIodmFsdWUsIHNjYV9yZWcocmVnLCBjYXJkKSkKKyNkZWZpbmUgc2NhX2ludyhyZWcsIGNhcmQpCQlpbncoc2NhX3JlZyhyZWcsIGNhcmQpKQorI2RlZmluZSBzY2Ffb3V0dyh2YWx1ZSwgcmVnLCBjYXJkKQlvdXR3KHZhbHVlLCBzY2FfcmVnKHJlZywgY2FyZCkpCisKKyNkZWZpbmUgcG9ydF90b19jYXJkKHBvcnQpCQkoKHBvcnQpLT5jYXJkKQorI2RlZmluZSBsb2dfbm9kZShwb3J0KQkJCSgocG9ydCktPmxvZ19ub2RlKQorI2RlZmluZSBwaHlfbm9kZShwb3J0KQkJCSgocG9ydCktPnBoeV9ub2RlKQorI2RlZmluZSB3aW5zaXplKGNhcmQpCQkJKFVTRV9XSU5ET1dTSVpFKQorI2RlZmluZSB3aW5iYXNlKGNhcmQpICAgICAgCSAgICAgCSgoY2FyZCktPndpbmJhc2UpCisjZGVmaW5lIGdldF9wb3J0KGNhcmQsIHBvcnQpCQkoKGNhcmQpLT5wb3J0c1twb3J0XS52YWxpZCA/IFwKKwkJCQkJICYoY2FyZCktPnBvcnRzW3BvcnRdIDogTlVMTCkKKworCisKK3N0YXRpYyBfX2lubGluZV9fIHU4IHNjYV9nZXRfcGFnZShjYXJkX3QgKmNhcmQpCit7CisJcmV0dXJuIGluYihjYXJkLT5pbyArIE4yX1BTUikgJiBQU1JfUEFHRUJJVFM7Cit9CisKKworc3RhdGljIF9faW5saW5lX18gdm9pZCBvcGVud2luKGNhcmRfdCAqY2FyZCwgdTggcGFnZSkKK3sKKwl1OCBwc3IgPSBpbmIoY2FyZC0+aW8gKyBOMl9QU1IpOworCW91dGIoKHBzciAmIH5QU1JfUEFHRUJJVFMpIHwgcGFnZSwgY2FyZC0+aW8gKyBOMl9QU1IpOworfQorCisKKworI2luY2x1ZGUgImhkNjQ1N3guYyIKKworCisKK3N0YXRpYyB2b2lkIG4yX3NldF9pZmFjZShwb3J0X3QgKnBvcnQpCit7CisJY2FyZF90ICpjYXJkID0gcG9ydC0+Y2FyZDsKKwlpbnQgaW8gPSBjYXJkLT5pbzsKKwl1OCBtY3IgPSBpbmIoaW8gKyBOMl9NQ1IpOworCXU4IG1zY2kgPSBnZXRfbXNjaShwb3J0KTsKKwl1OCByeHMgPSBwb3J0LT5yeHMgJiBDTEtfQlJHX01BU0s7CisJdTggdHhzID0gcG9ydC0+dHhzICYgQ0xLX0JSR19NQVNLOworCisJc3dpdGNoKHBvcnQtPnNldHRpbmdzLmNsb2NrX3R5cGUpIHsKKwljYXNlIENMT0NLX0lOVDoKKwkJbWNyIHw9IHBvcnQtPnBoeV9ub2RlID8gQ0xPQ0tfT1VUX1BPUlQxIDogQ0xPQ0tfT1VUX1BPUlQwOworCQlyeHMgfD0gQ0xLX0JSR19SWDsgLyogQlJHIG91dHB1dCAqLworCQl0eHMgfD0gQ0xLX1JYQ0xLX1RYOyAvKiBSWCBjbG9jayAqLworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfVFhJTlQ6CisJCW1jciB8PSBwb3J0LT5waHlfbm9kZSA/IENMT0NLX09VVF9QT1JUMSA6IENMT0NLX09VVF9QT1JUMDsKKwkJcnhzIHw9IENMS19MSU5FX1JYOyAvKiBSWEMgaW5wdXQgKi8KKwkJdHhzIHw9IENMS19CUkdfVFg7IC8qIEJSRyBvdXRwdXQgKi8KKwkJYnJlYWs7CisKKwljYXNlIENMT0NLX1RYRlJPTVJYOgorCQltY3IgfD0gcG9ydC0+cGh5X25vZGUgPyBDTE9DS19PVVRfUE9SVDEgOiBDTE9DS19PVVRfUE9SVDA7CisJCXJ4cyB8PSBDTEtfTElORV9SWDsgLyogUlhDIGlucHV0ICovCisJCXR4cyB8PSBDTEtfUlhDTEtfVFg7IC8qIFJYIGNsb2NrICovCisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8qIENsb2NrIEVYVGVybmFsICovCisJCW1jciAmPSBwb3J0LT5waHlfbm9kZSA/IH5DTE9DS19PVVRfUE9SVDEgOiB+Q0xPQ0tfT1VUX1BPUlQwOworCQlyeHMgfD0gQ0xLX0xJTkVfUlg7IC8qIFJYQyBpbnB1dCAqLworCQl0eHMgfD0gQ0xLX0xJTkVfVFg7IC8qIFRYQyBpbnB1dCAqLworCX0KKworCW91dGIobWNyLCBpbyArIE4yX01DUik7CisJcG9ydC0+cnhzID0gcnhzOworCXBvcnQtPnR4cyA9IHR4czsKKwlzY2Ffb3V0KHJ4cywgbXNjaSArIFJYUywgY2FyZCk7CisJc2NhX291dCh0eHMsIG1zY2kgKyBUWFMsIGNhcmQpOworCXNjYV9zZXRfcG9ydChwb3J0KTsKK30KKworCisKK3N0YXRpYyBpbnQgbjJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBvcnRfdCAqcG9ydCA9IGRldl90b19wb3J0KGRldik7CisJaW50IGlvID0gcG9ydC0+Y2FyZC0+aW87CisJdTggbWNyID0gaW5iKGlvICsgTjJfTUNSKSB8IChwb3J0LT5waHlfbm9kZSA/IFRYNDIyX1BPUlQxOlRYNDIyX1BPUlQwKTsKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gaGRsY19vcGVuKGRldik7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCW1jciAmPSBwb3J0LT5waHlfbm9kZSA/IH5EVFJfUE9SVDEgOiB+RFRSX1BPUlQwOyAvKiBzZXQgRFRSIE9OICovCisJb3V0YihtY3IsIGlvICsgTjJfTUNSKTsKKworCW91dGIoaW5iKGlvICsgTjJfUENSKSB8IFBDUl9FTldJTiwgaW8gKyBOMl9QQ1IpOyAvKiBvcGVuIHdpbmRvdyAqLworCW91dGIoaW5iKGlvICsgTjJfUFNSKSB8IFBTUl9ETUFFTiwgaW8gKyBOMl9QU1IpOyAvKiBlbmFibGUgZG1hICovCisJc2NhX29wZW4oZGV2KTsKKwluMl9zZXRfaWZhY2UocG9ydCk7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IG4yX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcG9ydF90ICpwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwlpbnQgaW8gPSBwb3J0LT5jYXJkLT5pbzsKKwl1OCBtY3IgPSBpbmIoaW8rTjJfTUNSKSB8IChwb3J0LT5waHlfbm9kZSA/IFRYNDIyX1BPUlQxIDogVFg0MjJfUE9SVDApOworCisJc2NhX2Nsb3NlKGRldik7CisJbWNyIHw9IHBvcnQtPnBoeV9ub2RlID8gRFRSX1BPUlQxIDogRFRSX1BPUlQwOyAvKiBzZXQgRFRSIE9GRiAqLworCW91dGIobWNyLCBpbyArIE4yX01DUik7CisJaGRsY19jbG9zZShkZXYpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCBuMl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihzeW5jX3NlcmlhbF9zZXR0aW5ncyk7CisJc3luY19zZXJpYWxfc2V0dGluZ3MgbmV3X2xpbmU7CisJc3luY19zZXJpYWxfc2V0dGluZ3MgX191c2VyICpsaW5lID0gaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3Uuc3luYzsKKwlwb3J0X3QgKnBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCisjaWZkZWYgREVCVUdfUklOR1MKKwlpZiAoY21kID09IFNJT0NERVZQUklWQVRFKSB7CisJCXNjYV9kdW1wX3JpbmdzKGRldik7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCWlmIChjbWQgIT0gU0lPQ1dBTkRFVikKKwkJcmV0dXJuIGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisKKwlzd2l0Y2goaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCWNhc2UgSUZfR0VUX0lGQUNFOgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfU1lOQ19TRVJJQUw7CisJCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplIDwgc2l6ZSkgeworCQkJaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA9IHNpemU7IC8qIGRhdGEgc2l6ZSB3YW50ZWQgKi8KKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGxpbmUsICZwb3J0LT5zZXR0aW5ncywgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIElGX0lGQUNFX1NZTkNfU0VSSUFMOgorCQlpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfbGluZSwgbGluZSwgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAobmV3X2xpbmUuY2xvY2tfdHlwZSAhPSBDTE9DS19FWFQgJiYKKwkJICAgIG5ld19saW5lLmNsb2NrX3R5cGUgIT0gQ0xPQ0tfVFhGUk9NUlggJiYKKwkJICAgIG5ld19saW5lLmNsb2NrX3R5cGUgIT0gQ0xPQ0tfSU5UICYmCisJCSAgICBuZXdfbGluZS5jbG9ja190eXBlICE9IENMT0NLX1RYSU5UKQorCQlyZXR1cm4gLUVJTlZBTDsJLyogTm8gc3VjaCBjbG9jayBzZXR0aW5nICovCisKKwkJaWYgKG5ld19saW5lLmxvb3BiYWNrICE9IDAgJiYgbmV3X2xpbmUubG9vcGJhY2sgIT0gMSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCW1lbWNweSgmcG9ydC0+c2V0dGluZ3MsICZuZXdfbGluZSwgc2l6ZSk7IC8qIFVwZGF0ZSBzZXR0aW5ncyAqLworCQluMl9zZXRfaWZhY2UocG9ydCk7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisJfQorfQorCisKKworc3RhdGljIHZvaWQgbjJfZGVzdHJveV9jYXJkKGNhcmRfdCAqY2FyZCkKK3sKKwlpbnQgY250OworCisJZm9yIChjbnQgPSAwOyBjbnQgPCAyOyBjbnQrKykKKwkJaWYgKGNhcmQtPnBvcnRzW2NudF0uY2FyZCkgeworCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnRfdG9fZGV2KCZjYXJkLT5wb3J0c1tjbnRdKTsKKwkJCXVucmVnaXN0ZXJfaGRsY19kZXZpY2UoZGV2KTsKKwkJfQorCisJaWYgKGNhcmQtPmlycSkKKwkJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKKworCWlmIChjYXJkLT53aW5iYXNlKSB7CisJCWlvdW5tYXAoY2FyZC0+d2luYmFzZSk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihjYXJkLT5waHlfd2luYmFzZSwgVVNFX1dJTkRPV1NJWkUpOworCX0KKworCWlmIChjYXJkLT5pbykKKwkJcmVsZWFzZV9yZWdpb24oY2FyZC0+aW8sIE4yX0lPUE9SVFMpOworCWlmIChjYXJkLT5wb3J0c1swXS5kZXYpCisJCWZyZWVfbmV0ZGV2KGNhcmQtPnBvcnRzWzBdLmRldik7CisJaWYgKGNhcmQtPnBvcnRzWzFdLmRldikKKwkJZnJlZV9uZXRkZXYoY2FyZC0+cG9ydHNbMV0uZGV2KTsKKwlrZnJlZShjYXJkKTsKK30KKworCisKK3N0YXRpYyBpbnQgX19pbml0IG4yX3J1bih1bnNpZ25lZCBsb25nIGlvLCB1bnNpZ25lZCBsb25nIGlycSwKKwkJCSB1bnNpZ25lZCBsb25nIHdpbmJhc2UsIGxvbmcgdmFsaWQwLCBsb25nIHZhbGlkMSkKK3sKKwljYXJkX3QgKmNhcmQ7CisJdTggY250LCBwY3I7CisJaW50IGk7CisKKwlpZiAoaW8gPCAweDIwMCB8fCBpbyA+IDB4M0ZGIHx8IChpbyAlIE4yX0lPUE9SVFMpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJuMjogaW52YWxpZCBJL08gcG9ydCB2YWx1ZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChpcnEgPCAzIHx8IGlycSA+IDE1IHx8IGlycSA9PSA2KSAvKiBGSVhNRSAqLyB7CisJCXByaW50ayhLRVJOX0VSUiAibjI6IGludmFsaWQgSVJRIHZhbHVlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHdpbmJhc2UgPCAweEEwMDAwIHx8IHdpbmJhc2UgPiAweEZGRkZGIHx8ICh3aW5iYXNlICYgMHhGRkYpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJuMjogaW52YWxpZCBSQU0gdmFsdWVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljYXJkID0ga21hbGxvYyhzaXplb2YoY2FyZF90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhcmQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIm4yOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKwltZW1zZXQoY2FyZCwgMCwgc2l6ZW9mKGNhcmRfdCkpOworCisJY2FyZC0+cG9ydHNbMF0uZGV2ID0gYWxsb2NfaGRsY2RldigmY2FyZC0+cG9ydHNbMF0pOworCWNhcmQtPnBvcnRzWzFdLmRldiA9IGFsbG9jX2hkbGNkZXYoJmNhcmQtPnBvcnRzWzFdKTsKKwlpZiAoIWNhcmQtPnBvcnRzWzBdLmRldiB8fCAhY2FyZC0+cG9ydHNbMV0uZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAibjI6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQluMl9kZXN0cm95X2NhcmQoY2FyZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmICghcmVxdWVzdF9yZWdpb24oaW8sIE4yX0lPUE9SVFMsIGRldm5hbWUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibjI6IEkvTyBwb3J0IHJlZ2lvbiBpbiB1c2VcbiIpOworCQluMl9kZXN0cm95X2NhcmQoY2FyZCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWNhcmQtPmlvID0gaW87CisKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCAmc2NhX2ludHIsIDAsIGRldm5hbWUsIGNhcmQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibjI6IGNvdWxkIG5vdCBhbGxvY2F0ZSBJUlFcbiIpOworCQluMl9kZXN0cm95X2NhcmQoY2FyZCk7CisJCXJldHVybigtRUJVU1kpOworCX0KKwljYXJkLT5pcnEgPSBpcnE7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbih3aW5iYXNlLCBVU0VfV0lORE9XU0laRSwgZGV2bmFtZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJuMjogY291bGQgbm90IHJlcXVlc3QgUkFNIHdpbmRvd1xuIik7CisJCW4yX2Rlc3Ryb3lfY2FyZChjYXJkKTsKKwkJcmV0dXJuKC1FQlVTWSk7CisJfQorCWNhcmQtPnBoeV93aW5iYXNlID0gd2luYmFzZTsKKwljYXJkLT53aW5iYXNlID0gaW9yZW1hcCh3aW5iYXNlLCBVU0VfV0lORE9XU0laRSk7CisKKwlvdXRiKDAsIGlvICsgTjJfUENSKTsKKwlvdXRiKHdpbmJhc2UgPj4gMTIsIGlvICsgTjJfQkFSKTsKKworCXN3aXRjaCAoVVNFX1dJTkRPV1NJWkUpIHsKKwljYXNlIDE2Mzg0OgorCQlvdXRiKFdJTjE2SywgaW8gKyBOMl9QU1IpOworCQlicmVhazsKKworCWNhc2UgMzI3Njg6CisJCW91dGIoV0lOMzJLLCBpbyArIE4yX1BTUik7CisJCWJyZWFrOworCisJY2FzZSA2NTUzNjoKKwkJb3V0YihXSU42NEssIGlvICsgTjJfUFNSKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIm4yOiBpbnZhbGlkIHdpbmRvdyBzaXplXG4iKTsKKwkJbjJfZGVzdHJveV9jYXJkKGNhcmQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwY3IgPSBQQ1JfRU5XSU4gfCBQQ1JfVlBNIHwgKFVTRV9CVVMxNkJJVFMgPyBQQ1JfQlVTMTYgOiAwKTsKKwlvdXRiKHBjciwgaW8gKyBOMl9QQ1IpOworCisJY2FyZC0+cmFtX3NpemUgPSBzY2FfZGV0ZWN0X3JhbShjYXJkLCBjYXJkLT53aW5iYXNlLCBNQVhfUkFNX1NJWkUpOworCisJLyogbnVtYmVyIG9mIFRYICsgUlggYnVmZmVycyBmb3Igb25lIHBvcnQgKi8KKwlpID0gY2FyZC0+cmFtX3NpemUgLyAoKHZhbGlkMCArIHZhbGlkMSkgKiAoc2l6ZW9mKHBrdF9kZXNjKSArCisJCQkJCQkgICBIRExDX01BWF9NUlUpKTsKKworCWNhcmQtPnR4X3JpbmdfYnVmZmVycyA9IG1pbihpIC8gMiwgTUFYX1RYX0JVRkZFUlMpOworCWNhcmQtPnJ4X3JpbmdfYnVmZmVycyA9IGkgLSBjYXJkLT50eF9yaW5nX2J1ZmZlcnM7CisKKwljYXJkLT5idWZmX29mZnNldCA9ICh2YWxpZDAgKyB2YWxpZDEpICogc2l6ZW9mKHBrdF9kZXNjKSAqCisJCShjYXJkLT50eF9yaW5nX2J1ZmZlcnMgKyBjYXJkLT5yeF9yaW5nX2J1ZmZlcnMpOworCisJcHJpbnRrKEtFUk5fSU5GTyAibjI6IFJJU0NvbS9OMiAldSBLQiBSQU0sIElSUSV1LCAiCisJICAgICAgICJ1c2luZyAldSBUWCArICV1IFJYIHBhY2tldHMgcmluZ3NcbiIsIGNhcmQtPnJhbV9zaXplIC8gMTAyNCwKKwkgICAgICAgY2FyZC0+aXJxLCBjYXJkLT50eF9yaW5nX2J1ZmZlcnMsIGNhcmQtPnJ4X3JpbmdfYnVmZmVycyk7CisKKwlpZiAoY2FyZC0+dHhfcmluZ19idWZmZXJzIDwgMSkgeworCQlwcmludGsoS0VSTl9FUlIgIm4yOiBSQU0gdGVzdCBmYWlsZWRcbiIpOworCQluMl9kZXN0cm95X2NhcmQoY2FyZCk7CisJCXJldHVybiAtRUlPOworCX0KKworCXBjciB8PSBQQ1JfUlVOU0NBOwkJLyogcnVuIFNDQSAqLworCW91dGIocGNyLCBpbyArIE4yX1BDUik7CisJb3V0YigwLCBpbyArIE4yX01DUik7CisKKwlzY2FfaW5pdChjYXJkLCAwKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IDI7IGNudCsrKSB7CisJCXBvcnRfdCAqcG9ydCA9ICZjYXJkLT5wb3J0c1tjbnRdOworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydF90b19kZXYocG9ydCk7CisJCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKworCQlpZiAoKGNudCA9PSAwICYmICF2YWxpZDApIHx8IChjbnQgPT0gMSAmJiAhdmFsaWQxKSkKKwkJCWNvbnRpbnVlOworCisJCXBvcnQtPnBoeV9ub2RlID0gY250OworCQlwb3J0LT52YWxpZCA9IDE7CisKKwkJaWYgKChjbnQgPT0gMSkgJiYgdmFsaWQwKQorCQkJcG9ydC0+bG9nX25vZGUgPSAxOworCisJCXNwaW5fbG9ja19pbml0KCZwb3J0LT5sb2NrKTsKKwkJU0VUX01PRFVMRV9PV05FUihkZXYpOworCQlkZXYtPmlycSA9IGlycTsKKwkJZGV2LT5tZW1fc3RhcnQgPSB3aW5iYXNlOworCQlkZXYtPm1lbV9lbmQgPSB3aW5iYXNlICsgVVNFX1dJTkRPV1NJWkUgLSAxOworCQlkZXYtPnR4X3F1ZXVlX2xlbiA9IDUwOworCQlkZXYtPmRvX2lvY3RsID0gbjJfaW9jdGw7CisJCWRldi0+b3BlbiA9IG4yX29wZW47CisJCWRldi0+c3RvcCA9IG4yX2Nsb3NlOworCQloZGxjLT5hdHRhY2ggPSBzY2FfYXR0YWNoOworCQloZGxjLT54bWl0ID0gc2NhX3htaXQ7CisJCXBvcnQtPnNldHRpbmdzLmNsb2NrX3R5cGUgPSBDTE9DS19FWFQ7CisJCXBvcnQtPmNhcmQgPSBjYXJkOworCisJCWlmIChyZWdpc3Rlcl9oZGxjX2RldmljZShkZXYpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJuMjogdW5hYmxlIHRvIHJlZ2lzdGVyIGhkbGMgIgorCQkJICAgICAgICJkZXZpY2VcbiIpOworCQkJcG9ydC0+Y2FyZCA9IE5VTEw7CisJCQluMl9kZXN0cm95X2NhcmQoY2FyZCk7CisJCQlyZXR1cm4gLUVOT0JVRlM7CisJCX0KKwkJc2NhX2luaXRfc3luY19wb3J0KHBvcnQpOyAvKiBTZXQgdXAgU0NBIG1lbW9yeSAqLworCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSSVNDb20vTjIgbm9kZSAlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcG9ydC0+cGh5X25vZGUpOworCX0KKworCSpuZXdfY2FyZCA9IGNhcmQ7CisJbmV3X2NhcmQgPSAmY2FyZC0+bmV4dF9jYXJkOworCisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IF9faW5pdCBuMl9pbml0KHZvaWQpCit7CisJaWYgKGh3PT1OVUxMKSB7CisjaWZkZWYgTU9EVUxFCisJCXByaW50ayhLRVJOX0lORk8gIm4yOiBubyBjYXJkIGluaXRpYWxpemVkXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gLUVOT1NZUzsJLyogbm8gcGFyYW1ldGVycyBzcGVjaWZpZWQsIGFib3J0ICovCisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIHZlcnNpb24pOworCisJZG8geworCQl1bnNpZ25lZCBsb25nIGlvLCBpcnEsIHJhbTsKKwkJbG9uZyB2YWxpZFsyXSA9IHsgMCwgMCB9OyAvKiBEZWZhdWx0ID0gYm90aCBwb3J0cyBkaXNhYmxlZCAqLworCisJCWlvID0gc2ltcGxlX3N0cnRvdWwoaHcsICZodywgMCk7CisKKwkJaWYgKCpodysrICE9ICcsJykKKwkJCWJyZWFrOworCQlpcnEgPSBzaW1wbGVfc3RydG91bChodywgJmh3LCAwKTsKKworCQlpZiAoKmh3KysgIT0gJywnKQorCQkJYnJlYWs7CisJCXJhbSA9IHNpbXBsZV9zdHJ0b3VsKGh3LCAmaHcsIDApOworCisJCWlmICgqaHcrKyAhPSAnLCcpCisJCQlicmVhazsKKwkJd2hpbGUoMSkgeworCQkJaWYgKCpodyA9PSAnMCcgJiYgIXZhbGlkWzBdKQorCQkJCXZhbGlkWzBdID0gMTsgLyogUG9ydCAwIGVuYWJsZWQgKi8KKwkJCWVsc2UgaWYgKCpodyA9PSAnMScgJiYgIXZhbGlkWzFdKQorCQkJCXZhbGlkWzFdID0gMTsgLyogUG9ydCAxIGVuYWJsZWQgKi8KKwkJCWVsc2UKKwkJCQlicmVhazsKKwkJCWh3Kys7CisJCX0KKworCQlpZiAoIXZhbGlkWzBdICYmICF2YWxpZFsxXSkKKwkJCWJyZWFrOwkvKiBhdCBsZWFzdCBvbmUgcG9ydCBtdXN0IGJlIHVzZWQgKi8KKworCQlpZiAoKmh3ID09ICc6JyB8fCAqaHcgPT0gJ1x4MCcpCisJCQluMl9ydW4oaW8sIGlycSwgcmFtLCB2YWxpZFswXSwgdmFsaWRbMV0pOworCisJCWlmICgqaHcgPT0gJ1x4MCcpCisJCQlyZXR1cm4gZmlyc3RfY2FyZCA/IDAgOiAtRU5PU1lTOworCX13aGlsZSgqaHcrKyA9PSAnOicpOworCisJcHJpbnRrKEtFUk5fRVJSICJuMjogaW52YWxpZCBoYXJkd2FyZSBwYXJhbWV0ZXJzXG4iKTsKKwlyZXR1cm4gZmlyc3RfY2FyZCA/IDAgOiAtRU5PU1lTOworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuMl9jbGVhbnVwKHZvaWQpCit7CisJY2FyZF90ICpjYXJkID0gZmlyc3RfY2FyZDsKKworCXdoaWxlIChjYXJkKSB7CisJCWNhcmRfdCAqcHRyID0gY2FyZDsKKwkJY2FyZCA9IGNhcmQtPm5leHRfY2FyZDsKKwkJbjJfZGVzdHJveV9jYXJkKHB0cik7CisJfQorfQorCisKK21vZHVsZV9pbml0KG4yX2luaXQpOworbW9kdWxlX2V4aXQobjJfY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoIktyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJJU0NvbS9OMiBzZXJpYWwgcG9ydCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK21vZHVsZV9wYXJhbShodywgY2hhcnAsIDA0NDQpOwkvKiBodz1pbyxpcnEscmFtLHBvcnRzOmlvLGlycSwuLi4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9wYzMwMC1mYWxjLWxoLmggYi9kcml2ZXJzL25ldC93YW4vcGMzMDAtZmFsYy1saC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZWQyM2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vcGMzMDAtZmFsYy1saC5oCkBAIC0wLDAgKzEsMTIzOCBAQAorLyoKKyAqIGZhbGMuaAlEZXNjcmlwdGlvbiBvZiB0aGUgU2llbWVucyBGQUxDIFQxL0UxIGZyYW1lci4KKyAqCisgKiBBdXRob3I6CUl2YW4gUGFzc29zIDxpdmFuQGN5Y2xhZGVzLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQ6CShjKSAyMDAwLTIwMDEgQ3ljbGFkZXMgQ29ycC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICRMb2c6IGZhbGMtbGguaCx2ICQKKyAqIFJldmlzaW9uIDMuMSAgMjAwMS8wNi8xNSAxMjo0MToxMCAgcmVnaW5hCisgKiB1cHBpbmcgbWFqb3IgdmVyc2lvbiBudW1iZXIKKyAqCisgKiBSZXZpc2lvbiAxLjEuMS4xICAyMDAxLzA2LzEzIDIwOjI0OjQ3ICBkYW5pZWxhCisgKiBQQzMwMCBpbml0aWFsIENWUyB2ZXJzaW9uICgzLjQuMC1wcmUxKQorICoKKyAqIFJldmlzaW9uIDEuMSAyMDAwLzA1LzE1IGl2YW4KKyAqIEluY2x1ZGVkIERKQSBiaXRzIGZvciB0aGUgTElNMiByZWdpc3Rlci4KKyAqCisgKiBSZXZpc2lvbiAxLjAgMjAwMC8wMi8yMiBpdmFuCisgKiBJbml0aWFsIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX0ZBTENfTEhfSAorI2RlZmluZSBfRkFMQ19MSF9ICisKKyNkZWZpbmUgTlVNX09GX1QxX0NIQU5ORUxTCTI0CisjZGVmaW5lIE5VTV9PRl9FMV9DSEFOTkVMUwkzMgorCisvKj4+Pj4+Pj4+Pj4+Pj4+Pj4+ICBGQUxDIFJlZ2lzdGVyIEJpdHMgKFRyYW5zbWl0IE1vZGUpICA8PDw8PDw8PDw8PDw8PDw8PDw8ICovCisKKy8qIENNRFIgKENvbW1hbmQgUmVnaXN0ZXIpCisgICAtLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIENNRFJfUk1DCTB4ODAKKyNkZWZpbmUgQ01EUl9SUkVTCTB4NDAKKyNkZWZpbmUgQ01EUl9YUkVQCTB4MjAKKyNkZWZpbmUgQ01EUl9YUkVTCTB4MTAKKyNkZWZpbmUgQ01EUl9YSEYJMHgwOAorI2RlZmluZSBDTURSX1hURgkweDA0CisjZGVmaW5lIENNRFJfWE1FCTB4MDIKKyNkZWZpbmUgQ01EUl9TUkVTCTB4MDEKKworLyogTU9ERSAoTW9kZSBSZWdpc3RlcikKKyAgIC0tLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgTU9ERV9NRFMyCTB4ODAKKyNkZWZpbmUgTU9ERV9NRFMxCTB4NDAKKyNkZWZpbmUgTU9ERV9NRFMwCTB4MjAKKyNkZWZpbmUgTU9ERV9CUkFDCTB4MTAKKyNkZWZpbmUgTU9ERV9IUkFDCTB4MDgKKworLyogSVBDIChJbnRlcnJ1cHQgUG9ydCBDb25maWd1cmF0aW9uKQorICAgLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBJUENfVklTCQkweDgwCisjZGVmaW5lIElQQ19TQ0kJCTB4MDQKKyNkZWZpbmUgSVBDX0lDMQkJMHgwMgorI2RlZmluZSBJUENfSUMwCQkweDAxCisKKy8qIENDUjEgKENvbW1vbiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEpCisgICAtLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIENDUjFfU0ZMRyAgICAgICAweDgwCisjZGVmaW5lIENDUjFfWFRTMTZSQSAgICAweDQwCisjZGVmaW5lIENDUjFfQlJNICAgICAgICAweDQwCisjZGVmaW5lIENDUjFfQ0FTU1lNICAgICAweDIwCisjZGVmaW5lIENDUjFfRURMWCAgICAgICAweDIwCisjZGVmaW5lIENDUjFfRUlUUyAgICAgICAweDEwCisjZGVmaW5lIENDUjFfSVRGICAgICAgICAweDA4CisjZGVmaW5lIENDUjFfUkZUMSAgICAgICAweDAyCisjZGVmaW5lIENDUjFfUkZUMCAgICAgICAweDAxCisKKy8qIENDUjMgKENvbW1vbiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDMpCisgICAtLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQ0NSM19QUkUxICAgICAgIDB4ODAKKyNkZWZpbmUgQ0NSM19QUkUwICAgICAgIDB4NDAKKyNkZWZpbmUgQ0NSM19FUFQgICAgICAgIDB4MjAKKyNkZWZpbmUgQ0NSM19SQUREICAgICAgIDB4MTAKKyNkZWZpbmUgQ0NSM19SQ1JDICAgICAgIDB4MDQKKyNkZWZpbmUgQ0NSM19YQ1JDICAgICAgIDB4MDIKKworCisvKiBSVFIxLTQgKFJlY2VpdmUgVGltZXNsb3QgUmVnaXN0ZXIgMS00KQorICAgLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFJUUjFfVFMwICAgICAgICAweDgwCisjZGVmaW5lIFJUUjFfVFMxICAgICAgICAweDQwCisjZGVmaW5lIFJUUjFfVFMyICAgICAgICAweDIwCisjZGVmaW5lIFJUUjFfVFMzICAgICAgICAweDEwCisjZGVmaW5lIFJUUjFfVFM0ICAgICAgICAweDA4CisjZGVmaW5lIFJUUjFfVFM1ICAgICAgICAweDA0CisjZGVmaW5lIFJUUjFfVFM2ICAgICAgICAweDAyCisjZGVmaW5lIFJUUjFfVFM3ICAgICAgICAweDAxCisKKyNkZWZpbmUgUlRSMl9UUzggICAgICAgIDB4ODAKKyNkZWZpbmUgUlRSMl9UUzkgICAgICAgIDB4NDAKKyNkZWZpbmUgUlRSMl9UUzEwICAgICAgIDB4MjAKKyNkZWZpbmUgUlRSMl9UUzExICAgICAgIDB4MTAKKyNkZWZpbmUgUlRSMl9UUzEyICAgICAgIDB4MDgKKyNkZWZpbmUgUlRSMl9UUzEzICAgICAgIDB4MDQKKyNkZWZpbmUgUlRSMl9UUzE0ICAgICAgIDB4MDIKKyNkZWZpbmUgUlRSMl9UUzE1ICAgICAgIDB4MDEKKworI2RlZmluZSBSVFIzX1RTMTYgICAgICAgMHg4MAorI2RlZmluZSBSVFIzX1RTMTcgICAgICAgMHg0MAorI2RlZmluZSBSVFIzX1RTMTggICAgICAgMHgyMAorI2RlZmluZSBSVFIzX1RTMTkgICAgICAgMHgxMAorI2RlZmluZSBSVFIzX1RTMjAgICAgICAgMHgwOAorI2RlZmluZSBSVFIzX1RTMjEgICAgICAgMHgwNAorI2RlZmluZSBSVFIzX1RTMjIgICAgICAgMHgwMgorI2RlZmluZSBSVFIzX1RTMjMgICAgICAgMHgwMQorCisjZGVmaW5lIFJUUjRfVFMyNCAgICAgICAweDgwCisjZGVmaW5lIFJUUjRfVFMyNSAgICAgICAweDQwCisjZGVmaW5lIFJUUjRfVFMyNiAgICAgICAweDIwCisjZGVmaW5lIFJUUjRfVFMyNyAgICAgICAweDEwCisjZGVmaW5lIFJUUjRfVFMyOCAgICAgICAweDA4CisjZGVmaW5lIFJUUjRfVFMyOSAgICAgICAweDA0CisjZGVmaW5lIFJUUjRfVFMzMCAgICAgICAweDAyCisjZGVmaW5lIFJUUjRfVFMzMSAgICAgICAweDAxCisKKworLyogVFRSMS00IChUcmFuc21pdCBUaW1lc2xvdCBSZWdpc3RlciAxLTQpCisgICAtLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgVFRSMV9UUzAgICAgICAgIDB4ODAKKyNkZWZpbmUgVFRSMV9UUzEgICAgICAgIDB4NDAKKyNkZWZpbmUgVFRSMV9UUzIgICAgICAgIDB4MjAKKyNkZWZpbmUgVFRSMV9UUzMgICAgICAgIDB4MTAKKyNkZWZpbmUgVFRSMV9UUzQgICAgICAgIDB4MDgKKyNkZWZpbmUgVFRSMV9UUzUgICAgICAgIDB4MDQKKyNkZWZpbmUgVFRSMV9UUzYgICAgICAgIDB4MDIKKyNkZWZpbmUgVFRSMV9UUzcgICAgICAgIDB4MDEKKworI2RlZmluZSBUVFIyX1RTOCAgICAgICAgMHg4MAorI2RlZmluZSBUVFIyX1RTOSAgICAgICAgMHg0MAorI2RlZmluZSBUVFIyX1RTMTAgICAgICAgMHgyMAorI2RlZmluZSBUVFIyX1RTMTEgICAgICAgMHgxMAorI2RlZmluZSBUVFIyX1RTMTIgICAgICAgMHgwOAorI2RlZmluZSBUVFIyX1RTMTMgICAgICAgMHgwNAorI2RlZmluZSBUVFIyX1RTMTQgICAgICAgMHgwMgorI2RlZmluZSBUVFIyX1RTMTUgICAgICAgMHgwMQorCisjZGVmaW5lIFRUUjNfVFMxNiAgICAgICAweDgwCisjZGVmaW5lIFRUUjNfVFMxNyAgICAgICAweDQwCisjZGVmaW5lIFRUUjNfVFMxOCAgICAgICAweDIwCisjZGVmaW5lIFRUUjNfVFMxOSAgICAgICAweDEwCisjZGVmaW5lIFRUUjNfVFMyMCAgICAgICAweDA4CisjZGVmaW5lIFRUUjNfVFMyMSAgICAgICAweDA0CisjZGVmaW5lIFRUUjNfVFMyMiAgICAgICAweDAyCisjZGVmaW5lIFRUUjNfVFMyMyAgICAgICAweDAxCisKKyNkZWZpbmUgVFRSNF9UUzI0ICAgICAgIDB4ODAKKyNkZWZpbmUgVFRSNF9UUzI1ICAgICAgIDB4NDAKKyNkZWZpbmUgVFRSNF9UUzI2ICAgICAgIDB4MjAKKyNkZWZpbmUgVFRSNF9UUzI3ICAgICAgIDB4MTAKKyNkZWZpbmUgVFRSNF9UUzI4ICAgICAgIDB4MDgKKyNkZWZpbmUgVFRSNF9UUzI5ICAgICAgIDB4MDQKKyNkZWZpbmUgVFRSNF9UUzMwICAgICAgIDB4MDIKKyNkZWZpbmUgVFRSNF9UUzMxICAgICAgIDB4MDEKKworCisKKy8qIElNUjAtNCAoSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgMC00KQorCisgICAtLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgSU1SMF9STUUgICAgICAgIDB4ODAKKyNkZWZpbmUgSU1SMF9SRlMgICAgICAgIDB4NDAKKyNkZWZpbmUgSU1SMF9UOE1TICAgICAgIDB4MjAKKyNkZWZpbmUgSU1SMF9JU0YgICAgICAgIDB4MjAKKyNkZWZpbmUgSU1SMF9STUIgICAgICAgIDB4MTAKKyNkZWZpbmUgSU1SMF9DQVNDICAgICAgIDB4MDgKKyNkZWZpbmUgSU1SMF9SU0MgICAgICAgIDB4MDgKKyNkZWZpbmUgSU1SMF9DUkM2ICAgICAgIDB4MDQKKyNkZWZpbmUgSU1SMF9DUkM0ICAgICAgIDB4MDQKKyNkZWZpbmUgSU1SMF9QREVOCTB4MDIKKyNkZWZpbmUgSU1SMF9SUEYgICAgICAgIDB4MDEKKworI2RlZmluZSBJTVIxX0NBU0UgICAgICAgMHg4MAorI2RlZmluZSBJTVIxX1JETyAgICAgICAgMHg0MAorI2RlZmluZSBJTVIxX0FMTFMgICAgICAgMHgyMAorI2RlZmluZSBJTVIxX1hEVSAgICAgICAgMHgxMAorI2RlZmluZSBJTVIxX1hNQiAgICAgICAgMHgwOAorI2RlZmluZSBJTVIxX1hMU0MgICAgICAgMHgwMgorI2RlZmluZSBJTVIxX1hQUiAgICAgICAgMHgwMQorI2RlZmluZSBJTVIxX0xMQlNDCTB4ODAKKworI2RlZmluZSBJTVIyX0ZBUiAgICAgICAgMHg4MAorI2RlZmluZSBJTVIyX0xGQSAgICAgICAgMHg0MAorI2RlZmluZSBJTVIyX01GQVIgICAgICAgMHgyMAorI2RlZmluZSBJTVIyX1Q0MDBNUyAgICAgMHgxMAorI2RlZmluZSBJTVIyX0xNRkEgICAgICAgMHgxMAorI2RlZmluZSBJTVIyX0FJUyAgICAgICAgMHgwOAorI2RlZmluZSBJTVIyX0xPUyAgICAgICAgMHgwNAorI2RlZmluZSBJTVIyX1JBUiAgICAgICAgMHgwMgorI2RlZmluZSBJTVIyX1JBICAgICAgICAgMHgwMQorCisjZGVmaW5lIElNUjNfRVMgICAgICAgICAweDgwCisjZGVmaW5lIElNUjNfU0VDICAgICAgICAweDQwCisjZGVmaW5lIElNUjNfTE1GQTE2ICAgICAweDIwCisjZGVmaW5lIElNUjNfQUlTMTYgICAgICAweDEwCisjZGVmaW5lIElNUjNfUkExNiAgICAgICAweDA4CisjZGVmaW5lIElNUjNfQVBJICAgICAgICAweDA0CisjZGVmaW5lIElNUjNfWFNMUCAgICAgICAweDIwCisjZGVmaW5lIElNUjNfWFNMTiAgICAgICAweDEwCisjZGVmaW5lIElNUjNfTExCU0MgICAgICAweDA4CisjZGVmaW5lIElNUjNfWFJTICAgICAgICAweDA0CisjZGVmaW5lIElNUjNfU0xOICAgICAgICAweDAyCisjZGVmaW5lIElNUjNfU0xQICAgICAgICAweDAxCisKKyNkZWZpbmUgSU1SNF9MRkEgICAgICAgIDB4ODAKKyNkZWZpbmUgSU1SNF9GRVIgICAgICAgIDB4NDAKKyNkZWZpbmUgSU1SNF9DRVIgICAgICAgIDB4MjAKKyNkZWZpbmUgSU1SNF9BSVMgICAgICAgIDB4MTAKKyNkZWZpbmUgSU1SNF9MT1MgICAgICAgIDB4MDgKKyNkZWZpbmUgSU1SNF9DVkUgICAgICAgIDB4MDQKKyNkZWZpbmUgSU1SNF9TTElQICAgICAgIDB4MDIKKyNkZWZpbmUgSU1SNF9FQkUgICAgICAgIDB4MDEKKworLyogRk1SMC01IGZvciBFMSBhbmQgVDEgIChGcmFtZXIgTW9kZSBSZWdpc3RlciApICovCisKKyNkZWZpbmUgRk1SMF9YQzEgICAgICAgIDB4ODAKKyNkZWZpbmUgRk1SMF9YQzAgICAgICAgIDB4NDAKKyNkZWZpbmUgRk1SMF9SQzEgICAgICAgIDB4MjAKKyNkZWZpbmUgRk1SMF9SQzAgICAgICAgIDB4MTAKKyNkZWZpbmUgRk1SMF9FWFREICAgICAgIDB4MDgKKyNkZWZpbmUgRk1SMF9BTE0gICAgICAgIDB4MDQKKyNkZWZpbmUgRTFfRk1SMF9GUlMgICAgIDB4MDIKKyNkZWZpbmUgVDFfRk1SMF9GUlMgICAgIDB4MDgKKyNkZWZpbmUgRk1SMF9TUkFGICAgICAgIDB4MDQKKyNkZWZpbmUgRk1SMF9FWExTICAgICAgIDB4MDIKKyNkZWZpbmUgRk1SMF9TSU0gICAgICAgIDB4MDEKKworI2RlZmluZSBGTVIxX01GQ1MgICAgICAgMHg4MAorI2RlZmluZSBGTVIxX0FGUiAgICAgICAgMHg0MAorI2RlZmluZSBGTVIxX0VOU0EgICAgICAgMHgyMAorI2RlZmluZSBGTVIxX0NUTSAgICAgICAgMHg4MAorI2RlZmluZSBGTVIxX1NJR00gICAgICAgMHg0MAorI2RlZmluZSBGTVIxX0VETCAgICAgICAgMHgyMAorI2RlZmluZSBGTVIxX1BNT0QgICAgICAgMHgxMAorI2RlZmluZSBGTVIxX1hGUyAgICAgICAgMHgwOAorI2RlZmluZSBGTVIxX0NSQyAgICAgICAgMHgwOAorI2RlZmluZSBGTVIxX0VDTSAgICAgICAgMHgwNAorI2RlZmluZSBGTVIxX0lNT0QgICAgICAgMHgwMgorI2RlZmluZSBGTVIxX1hBSVMgICAgICAgMHgwMQorCisjZGVmaW5lIEZNUjJfUkZTMSAgICAgICAweDgwCisjZGVmaW5lIEZNUjJfUkZTMCAgICAgICAweDQwCisjZGVmaW5lIEZNUjJfTUNTUAkweDQwCisjZGVmaW5lIEZNUjJfUlRNICAgICAgICAweDIwCisjZGVmaW5lIEZNUjJfU1NQICAgICAgICAweDIwCisjZGVmaW5lIEZNUjJfREFJUyAgICAgICAweDEwCisjZGVmaW5lIEZNUjJfU0FJUyAgICAgICAweDA4CisjZGVmaW5lIEZNUjJfUExCICAgICAgICAweDA0CisjZGVmaW5lIEZNUjJfQVhSQSAgICAgICAweDAyCisjZGVmaW5lIEZNUjJfQUxNRiAgICAgICAweDAxCisjZGVmaW5lIEZNUjJfRVhaRSAgICAgICAweDAxCisKKyNkZWZpbmUgTE9PUF9SVE0JMHg0MAorI2RlZmluZSBMT09QX1NGTQkweDQwCisjZGVmaW5lIExPT1BfRUNMQgkweDIwCisjZGVmaW5lIExPT1BfQ0xBCTB4MWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gRTEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIEZNUjNfWExECTB4MjAKKyNkZWZpbmUgRk1SM19YTFUJMHgxMAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgRk1SNF9BSVMzICAgICAgIDB4ODAKKyNkZWZpbmUgRk1SNF9UTSAgICAgICAgIDB4NDAKKyNkZWZpbmUgRk1SNF9YUkEgICAgICAgIDB4MjAKKyNkZWZpbmUgRk1SNF9TU0MxICAgICAgIDB4MTAKKyNkZWZpbmUgRk1SNF9TU0MwICAgICAgIDB4MDgKKyNkZWZpbmUgRk1SNF9BVVRPICAgICAgIDB4MDQKKyNkZWZpbmUgRk1SNF9GTTEgICAgICAgIDB4MDIKKyNkZWZpbmUgRk1SNF9GTTAgICAgICAgIDB4MDEKKworI2RlZmluZSBGTVI1X1NSUyAgICAgICAgMHg4MAorI2RlZmluZSBGTVI1X0VJQlIgICAgICAgMHg0MAorI2RlZmluZSBGTVI1X1hMRCAgICAgICAgMHgyMAorI2RlZmluZSBGTVI1X1hMVSAgICAgICAgMHgxMAorCisKKy8qIExPT1AgKENoYW5uZWwgTG9vcCBCYWNrKQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTE9PUF9TRk0gICAgICAgIDB4NDAKKyNkZWZpbmUgTE9PUF9FQ0xCICAgICAgIDB4MjAKKyNkZWZpbmUgTE9PUF9DTEE0ICAgICAgIDB4MTAKKyNkZWZpbmUgTE9PUF9DTEEzICAgICAgIDB4MDgKKyNkZWZpbmUgTE9PUF9DTEEyICAgICAgIDB4MDQKKyNkZWZpbmUgTE9PUF9DTEExICAgICAgIDB4MDIKKyNkZWZpbmUgTE9PUF9DTEEwICAgICAgIDB4MDEKKworCisKKy8qIFhTVyAoVHJhbnNtaXQgU2VydmljZSBXb3JkIFB1bHNlZnJhbWUpCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0gRTEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgWFNXX1hTSVMgICAgICAgIDB4ODAKKyNkZWZpbmUgWFNXX1hUTSAgICAgICAgIDB4NDAKKyNkZWZpbmUgWFNXX1hSQSAgICAgICAgIDB4MjAKKyNkZWZpbmUgWFNXX1hZMCAgICAgICAgIDB4MTAKKyNkZWZpbmUgWFNXX1hZMSAgICAgICAgIDB4MDgKKyNkZWZpbmUgWFNXX1hZMiAgICAgICAgIDB4MDQKKyNkZWZpbmUgWFNXX1hZMyAgICAgICAgIDB4MDIKKyNkZWZpbmUgWFNXX1hZNCAgICAgICAgIDB4MDEKKworCisvKiBYU1AgKFRyYW5zbWl0IFNwYXJlIEJpdHMpCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0gRTEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgWFNQX1hBUCAgICAgICAgIDB4ODAKKyNkZWZpbmUgWFNQX0NBU0VOICAgICAgIDB4NDAKKyNkZWZpbmUgWFNQX1RUMCAgICAgICAgIDB4MjAKKyNkZWZpbmUgWFNQX0VCUCAgICAgICAgIDB4MTAKKyNkZWZpbmUgWFNQX0FYUyAgICAgICAgIDB4MDgKKyNkZWZpbmUgWFNQX1hTSUYgICAgICAgIDB4MDQKKyNkZWZpbmUgWFNQX1hTMTMgICAgICAgIDB4MDIKKyNkZWZpbmUgWFNQX1hTMTUgICAgICAgIDB4MDEKKworCisvKiBYQzAvMSAoVHJhbnNtaXQgQ29udHJvbCAwLzEpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgWEMwX1NBOEUgICAgICAgIDB4ODAKKyNkZWZpbmUgWEMwX1NBN0UgICAgICAgIDB4NDAKKyNkZWZpbmUgWEMwX1NBNkUgICAgICAgIDB4MjAKKyNkZWZpbmUgWEMwX1NBNUUgICAgICAgIDB4MTAKKyNkZWZpbmUgWEMwX1NBNEUgICAgICAgIDB4MDgKKyNkZWZpbmUgWEMwX0JSTSAgICAgICAgIDB4ODAKKyNkZWZpbmUgWEMwX01GQlMgICAgICAgIDB4NDAKKyNkZWZpbmUgWEMwX1NGUlogICAgICAgIDB4MTAKKyNkZWZpbmUgWEMwX1hDTzIgICAgICAgIDB4MDQKKyNkZWZpbmUgWEMwX1hDTzEgICAgICAgIDB4MDIKKyNkZWZpbmUgWEMwX1hDTzAgICAgICAgIDB4MDEKKworI2RlZmluZSBYQzFfWFRPNSAgICAgICAgMHgyMAorI2RlZmluZSBYQzFfWFRPNCAgICAgICAgMHgxMAorI2RlZmluZSBYQzFfWFRPMyAgICAgICAgMHgwOAorI2RlZmluZSBYQzFfWFRPMiAgICAgICAgMHgwNAorI2RlZmluZSBYQzFfWFRPMSAgICAgICAgMHgwMgorI2RlZmluZSBYQzFfWFRPMCAgICAgICAgMHgwMQorCisKKy8qIFJDMC8xIChSZWNlaXZlIENvbnRyb2wgMC8xKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFJDMF9TSUNTICAgICAgICAweDQwCisjZGVmaW5lIFJDMF9DUkNJICAgICAgICAweDIwCisjZGVmaW5lIFJDMF9YQ1JDSSAgICAgICAweDEwCisjZGVmaW5lIFJDMF9SRElTICAgICAgICAweDA4CisjZGVmaW5lIFJDMF9SQ08yICAgICAgICAweDA0CisjZGVmaW5lIFJDMF9SQ08xICAgICAgICAweDAyCisjZGVmaW5lIFJDMF9SQ08wICAgICAgICAweDAxCisKKyNkZWZpbmUgUkMxX1NXRCAgICAgICAgIDB4ODAKKyNkZWZpbmUgUkMxX0FTWTQgICAgICAgIDB4NDAKKyNkZWZpbmUgUkMxX1JSQU0gICAgICAgIDB4NDAKKyNkZWZpbmUgUkMxX1JUTzUgICAgICAgIDB4MjAKKyNkZWZpbmUgUkMxX1JUTzQgICAgICAgIDB4MTAKKyNkZWZpbmUgUkMxX1JUTzMgICAgICAgIDB4MDgKKyNkZWZpbmUgUkMxX1JUTzIgICAgICAgIDB4MDQKKyNkZWZpbmUgUkMxX1JUTzEgICAgICAgIDB4MDIKKyNkZWZpbmUgUkMxX1JUTzAgICAgICAgIDB4MDEKKworCisKKy8qIFhQTTAtMiAoVHJhbnNtaXQgUHVsc2UgTWFzayAwLTIpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgWFBNMF9YUDEyICAgICAgIDB4ODAKKyNkZWZpbmUgWFBNMF9YUDExICAgICAgIDB4NDAKKyNkZWZpbmUgWFBNMF9YUDEwICAgICAgIDB4MjAKKyNkZWZpbmUgWFBNMF9YUDA0ICAgICAgIDB4MTAKKyNkZWZpbmUgWFBNMF9YUDAzICAgICAgIDB4MDgKKyNkZWZpbmUgWFBNMF9YUDAyICAgICAgIDB4MDQKKyNkZWZpbmUgWFBNMF9YUDAxICAgICAgIDB4MDIKKyNkZWZpbmUgWFBNMF9YUDAwICAgICAgIDB4MDEKKworI2RlZmluZSBYUE0xX1hQMzAgICAgICAgMHg4MAorI2RlZmluZSBYUE0xX1hQMjQgICAgICAgMHg0MAorI2RlZmluZSBYUE0xX1hQMjMgICAgICAgMHgyMAorI2RlZmluZSBYUE0xX1hQMjIgICAgICAgMHgxMAorI2RlZmluZSBYUE0xX1hQMjEgICAgICAgMHgwOAorI2RlZmluZSBYUE0xX1hQMjAgICAgICAgMHgwNAorI2RlZmluZSBYUE0xX1hQMTQgICAgICAgMHgwMgorI2RlZmluZSBYUE0xX1hQMTMgICAgICAgMHgwMQorCisjZGVmaW5lIFhQTTJfWExIUCAgICAgICAweDgwCisjZGVmaW5lIFhQTTJfWExUICAgICAgICAweDQwCisjZGVmaW5lIFhQTTJfREFYTFQgICAgICAweDIwCisjZGVmaW5lIFhQTTJfWFAzNCAgICAgICAweDA4CisjZGVmaW5lIFhQTTJfWFAzMyAgICAgICAweDA0CisjZGVmaW5lIFhQTTJfWFAzMiAgICAgICAweDAyCisjZGVmaW5lIFhQTTJfWFAzMSAgICAgICAweDAxCisKKworLyogVFNXTSAoVHJhbnNwYXJlbnQgU2VydmljZSBXb3JkIE1hc2spCisgICAtLS0tLS0tLS0tLS0tLS0tLS0gRTEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFRTV01fVFNJUyAgICAgICAweDgwCisjZGVmaW5lIFRTV01fVFNJRiAgICAgICAweDQwCisjZGVmaW5lIFRTV01fVFJBICAgICAgICAweDIwCisjZGVmaW5lIFRTV01fVFNBNCAgICAgICAweDEwCisjZGVmaW5lIFRTV01fVFNBNSAgICAgICAweDA4CisjZGVmaW5lIFRTV01fVFNBNiAgICAgICAweDA0CisjZGVmaW5lIFRTV01fVFNBNyAgICAgICAweDAyCisjZGVmaW5lIFRTV01fVFNBOCAgICAgICAweDAxCisKKy8qIElETEUgPElkbGUgQ2hhbm5lbCBDb2RlIFJlZ2lzdGVyPgorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIElETEVfSURMNyAgICAgICAweDgwCisjZGVmaW5lIElETEVfSURMNiAgICAgICAweDQwCisjZGVmaW5lIElETEVfSURMNSAgICAgICAweDIwCisjZGVmaW5lIElETEVfSURMNCAgICAgICAweDEwCisjZGVmaW5lIElETEVfSURMMyAgICAgICAweDA4CisjZGVmaW5lIElETEVfSURMMiAgICAgICAweDA0CisjZGVmaW5lIElETEVfSURMMSAgICAgICAweDAyCisjZGVmaW5lIElETEVfSURMMCAgICAgICAweDAxCisKKworLyogWFNBNC04IDxUcmFuc21pdCBTQTQtOCBSZWdpc3RlcihSZWFkL1dyaXRlKSA+CisgICAtLS0tLS0tLS0tLS0tLS0tLS0tRTEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBYU0E0X1hTNDcgICAgICAgMHg4MAorI2RlZmluZSBYU0E0X1hTNDYgICAgICAgMHg0MAorI2RlZmluZSBYU0E0X1hTNDUgICAgICAgMHgyMAorI2RlZmluZSBYU0E0X1hTNDQgICAgICAgMHgxMAorI2RlZmluZSBYU0E0X1hTNDMgICAgICAgMHgwOAorI2RlZmluZSBYU0E0X1hTNDIgICAgICAgMHgwNAorI2RlZmluZSBYU0E0X1hTNDEgICAgICAgMHgwMgorI2RlZmluZSBYU0E0X1hTNDAgICAgICAgMHgwMQorCisjZGVmaW5lIFhTQTVfWFM1NyAgICAgICAweDgwCisjZGVmaW5lIFhTQTVfWFM1NiAgICAgICAweDQwCisjZGVmaW5lIFhTQTVfWFM1NSAgICAgICAweDIwCisjZGVmaW5lIFhTQTVfWFM1NCAgICAgICAweDEwCisjZGVmaW5lIFhTQTVfWFM1MyAgICAgICAweDA4CisjZGVmaW5lIFhTQTVfWFM1MiAgICAgICAweDA0CisjZGVmaW5lIFhTQTVfWFM1MSAgICAgICAweDAyCisjZGVmaW5lIFhTQTVfWFM1MCAgICAgICAweDAxCisKKyNkZWZpbmUgWFNBNl9YUzY3ICAgICAgIDB4ODAKKyNkZWZpbmUgWFNBNl9YUzY2ICAgICAgIDB4NDAKKyNkZWZpbmUgWFNBNl9YUzY1ICAgICAgIDB4MjAKKyNkZWZpbmUgWFNBNl9YUzY0ICAgICAgIDB4MTAKKyNkZWZpbmUgWFNBNl9YUzYzICAgICAgIDB4MDgKKyNkZWZpbmUgWFNBNl9YUzYyICAgICAgIDB4MDQKKyNkZWZpbmUgWFNBNl9YUzYxICAgICAgIDB4MDIKKyNkZWZpbmUgWFNBNl9YUzYwICAgICAgIDB4MDEKKworI2RlZmluZSBYU0E3X1hTNzcgICAgICAgMHg4MAorI2RlZmluZSBYU0E3X1hTNzYgICAgICAgMHg0MAorI2RlZmluZSBYU0E3X1hTNzUgICAgICAgMHgyMAorI2RlZmluZSBYU0E3X1hTNzQgICAgICAgMHgxMAorI2RlZmluZSBYU0E3X1hTNzMgICAgICAgMHgwOAorI2RlZmluZSBYU0E3X1hTNzIgICAgICAgMHgwNAorI2RlZmluZSBYU0E3X1hTNzEgICAgICAgMHgwMgorI2RlZmluZSBYU0E3X1hTNzAgICAgICAgMHgwMQorCisjZGVmaW5lIFhTQThfWFM4NyAgICAgICAweDgwCisjZGVmaW5lIFhTQThfWFM4NiAgICAgICAweDQwCisjZGVmaW5lIFhTQThfWFM4NSAgICAgICAweDIwCisjZGVmaW5lIFhTQThfWFM4NCAgICAgICAweDEwCisjZGVmaW5lIFhTQThfWFM4MyAgICAgICAweDA4CisjZGVmaW5lIFhTQThfWFM4MiAgICAgICAweDA0CisjZGVmaW5lIFhTQThfWFM4MSAgICAgICAweDAyCisjZGVmaW5lIFhTQThfWFM4MCAgICAgICAweDAxCisKKworLyogWERMMS0zIChUcmFuc21pdCBETC1CaXQgUmVnaXN0ZXIxLTMgKHJlYWQvd3JpdGUpKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgWERMMV9YREwxNyAgICAgIDB4ODAKKyNkZWZpbmUgWERMMV9YREwxNiAgICAgIDB4NDAKKyNkZWZpbmUgWERMMV9YREwxNSAgICAgIDB4MjAKKyNkZWZpbmUgWERMMV9YREwxNCAgICAgIDB4MTAKKyNkZWZpbmUgWERMMV9YREwxMyAgICAgIDB4MDgKKyNkZWZpbmUgWERMMV9YREwxMiAgICAgIDB4MDQKKyNkZWZpbmUgWERMMV9YREwxMSAgICAgIDB4MDIKKyNkZWZpbmUgWERMMV9YREwxMCAgICAgIDB4MDEKKworI2RlZmluZSBYREwyX1hETDI3ICAgICAgMHg4MAorI2RlZmluZSBYREwyX1hETDI2ICAgICAgMHg0MAorI2RlZmluZSBYREwyX1hETDI1ICAgICAgMHgyMAorI2RlZmluZSBYREwyX1hETDI0ICAgICAgMHgxMAorI2RlZmluZSBYREwyX1hETDIzICAgICAgMHgwOAorI2RlZmluZSBYREwyX1hETDIyICAgICAgMHgwNAorI2RlZmluZSBYREwyX1hETDIxICAgICAgMHgwMgorI2RlZmluZSBYREwyX1hETDIwICAgICAgMHgwMQorCisjZGVmaW5lIFhETDNfWERMMzcgICAgICAweDgwCisjZGVmaW5lIFhETDNfWERMMzYgICAgICAweDQwCisjZGVmaW5lIFhETDNfWERMMzUgICAgICAweDIwCisjZGVmaW5lIFhETDNfWERMMzQgICAgICAweDEwCisjZGVmaW5lIFhETDNfWERMMzMgICAgICAweDA4CisjZGVmaW5lIFhETDNfWERMMzIgICAgICAweDA0CisjZGVmaW5lIFhETDNfWERMMzEgICAgICAweDAyCisjZGVmaW5lIFhETDNfWERMMzAgICAgICAweDAxCisKKworLyogSUNCMS00IChJZGxlIENoYW5uZWwgUmVnaXN0ZXIgMS00KQorICAgLS0tLS0tLS0tLS0tLS0tLS0tIEUxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBFMV9JQ0IxX0lDMAkweDgwCisjZGVmaW5lIEUxX0lDQjFfSUMxCTB4NDAKKyNkZWZpbmUgRTFfSUNCMV9JQzIJMHgyMAorI2RlZmluZSBFMV9JQ0IxX0lDMwkweDEwCisjZGVmaW5lIEUxX0lDQjFfSUM0CTB4MDgKKyNkZWZpbmUgRTFfSUNCMV9JQzUJMHgwNAorI2RlZmluZSBFMV9JQ0IxX0lDNgkweDAyCisjZGVmaW5lIEUxX0lDQjFfSUM3CTB4MDEKKworI2RlZmluZSBFMV9JQ0IyX0lDOAkweDgwCisjZGVmaW5lIEUxX0lDQjJfSUM5CTB4NDAKKyNkZWZpbmUgRTFfSUNCMl9JQzEwCTB4MjAKKyNkZWZpbmUgRTFfSUNCMl9JQzExCTB4MTAKKyNkZWZpbmUgRTFfSUNCMl9JQzEyCTB4MDgKKyNkZWZpbmUgRTFfSUNCMl9JQzEzCTB4MDQKKyNkZWZpbmUgRTFfSUNCMl9JQzE0CTB4MDIKKyNkZWZpbmUgRTFfSUNCMl9JQzE1CTB4MDEKKworI2RlZmluZSBFMV9JQ0IzX0lDMTYJMHg4MAorI2RlZmluZSBFMV9JQ0IzX0lDMTcJMHg0MAorI2RlZmluZSBFMV9JQ0IzX0lDMTgJMHgyMAorI2RlZmluZSBFMV9JQ0IzX0lDMTkJMHgxMAorI2RlZmluZSBFMV9JQ0IzX0lDMjAJMHgwOAorI2RlZmluZSBFMV9JQ0IzX0lDMjEJMHgwNAorI2RlZmluZSBFMV9JQ0IzX0lDMjIJMHgwMgorI2RlZmluZSBFMV9JQ0IzX0lDMjMJMHgwMQorCisjZGVmaW5lIEUxX0lDQjRfSUMyNAkweDgwCisjZGVmaW5lIEUxX0lDQjRfSUMyNQkweDQwCisjZGVmaW5lIEUxX0lDQjRfSUMyNgkweDIwCisjZGVmaW5lIEUxX0lDQjRfSUMyNwkweDEwCisjZGVmaW5lIEUxX0lDQjRfSUMyOAkweDA4CisjZGVmaW5lIEUxX0lDQjRfSUMyOQkweDA0CisjZGVmaW5lIEUxX0lDQjRfSUMzMAkweDAyCisjZGVmaW5lIEUxX0lDQjRfSUMzMQkweDAxCisKKy8qIElDQjEtNCAoSWRsZSBDaGFubmVsIFJlZ2lzdGVyIDEtNCkKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLSBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgVDFfSUNCMV9JQzEJMHg4MAorI2RlZmluZSBUMV9JQ0IxX0lDMgkweDQwCisjZGVmaW5lIFQxX0lDQjFfSUMzCTB4MjAKKyNkZWZpbmUgVDFfSUNCMV9JQzQJMHgxMAorI2RlZmluZSBUMV9JQ0IxX0lDNQkweDA4CisjZGVmaW5lIFQxX0lDQjFfSUM2CTB4MDQKKyNkZWZpbmUgVDFfSUNCMV9JQzcJMHgwMgorI2RlZmluZSBUMV9JQ0IxX0lDOAkweDAxCisKKyNkZWZpbmUgVDFfSUNCMl9JQzkJMHg4MAorI2RlZmluZSBUMV9JQ0IyX0lDMTAJMHg0MAorI2RlZmluZSBUMV9JQ0IyX0lDMTEJMHgyMAorI2RlZmluZSBUMV9JQ0IyX0lDMTIJMHgxMAorI2RlZmluZSBUMV9JQ0IyX0lDMTMJMHgwOAorI2RlZmluZSBUMV9JQ0IyX0lDMTQJMHgwNAorI2RlZmluZSBUMV9JQ0IyX0lDMTUJMHgwMgorI2RlZmluZSBUMV9JQ0IyX0lDMTYJMHgwMQorCisjZGVmaW5lIFQxX0lDQjNfSUMxNwkweDgwCisjZGVmaW5lIFQxX0lDQjNfSUMxOAkweDQwCisjZGVmaW5lIFQxX0lDQjNfSUMxOQkweDIwCisjZGVmaW5lIFQxX0lDQjNfSUMyMAkweDEwCisjZGVmaW5lIFQxX0lDQjNfSUMyMQkweDA4CisjZGVmaW5lIFQxX0lDQjNfSUMyMgkweDA0CisjZGVmaW5lIFQxX0lDQjNfSUMyMwkweDAyCisjZGVmaW5lIFQxX0lDQjNfSUMyNAkweDAxCisKKy8qIEZNUjMgKEZyYW1lciBNb2RlIFJlZ2lzdGVyIDMpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLUUxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgRk1SM19DTUkgICAgICAgIDB4MDgKKyNkZWZpbmUgRk1SM19TWU5TQSAgICAgIDB4MDQKKyNkZWZpbmUgRk1SM19DRlJaICAgICAgIDB4MDIKKyNkZWZpbmUgRk1SM19FWFRJVyAgICAgIDB4MDEKKworCisKKy8qIENDQjEtMyAoQ2xlYXIgQ2hhbm5lbCBSZWdpc3RlcikKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0gVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBDQ0IxX0NIMSAgICAgICAgMHg4MAorI2RlZmluZSBDQ0IxX0NIMiAgICAgICAgMHg0MAorI2RlZmluZSBDQ0IxX0NIMyAgICAgICAgMHgyMAorI2RlZmluZSBDQ0IxX0NINCAgICAgICAgMHgxMAorI2RlZmluZSBDQ0IxX0NINSAgICAgICAgMHgwOAorI2RlZmluZSBDQ0IxX0NINiAgICAgICAgMHgwNAorI2RlZmluZSBDQ0IxX0NINyAgICAgICAgMHgwMgorI2RlZmluZSBDQ0IxX0NIOCAgICAgICAgMHgwMQorCisjZGVmaW5lIENDQjJfQ0g5ICAgICAgICAweDgwCisjZGVmaW5lIENDQjJfQ0gxMCAgICAgICAweDQwCisjZGVmaW5lIENDQjJfQ0gxMSAgICAgICAweDIwCisjZGVmaW5lIENDQjJfQ0gxMiAgICAgICAweDEwCisjZGVmaW5lIENDQjJfQ0gxMyAgICAgICAweDA4CisjZGVmaW5lIENDQjJfQ0gxNCAgICAgICAweDA0CisjZGVmaW5lIENDQjJfQ0gxNSAgICAgICAweDAyCisjZGVmaW5lIENDQjJfQ0gxNiAgICAgICAweDAxCisKKyNkZWZpbmUgQ0NCM19DSDE3ICAgICAgIDB4ODAKKyNkZWZpbmUgQ0NCM19DSDE4ICAgICAgIDB4NDAKKyNkZWZpbmUgQ0NCM19DSDE5ICAgICAgIDB4MjAKKyNkZWZpbmUgQ0NCM19DSDIwICAgICAgIDB4MTAKKyNkZWZpbmUgQ0NCM19DSDIxICAgICAgIDB4MDgKKyNkZWZpbmUgQ0NCM19DSDIyICAgICAgIDB4MDQKKyNkZWZpbmUgQ0NCM19DSDIzICAgICAgIDB4MDIKKyNkZWZpbmUgQ0NCM19DSDI0ICAgICAgIDB4MDEKKworCisvKiBMSU0wLzEgKExpbmUgSW50ZXJmYWNlIE1vZGUgMC8xKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIExJTTBfWEZCICAgICAgICAweDgwCisjZGVmaW5lIExJTTBfWERPUyAgICAgICAweDQwCisjZGVmaW5lIExJTTBfU0NMMSAgICAgICAweDIwCisjZGVmaW5lIExJTTBfU0NMMCAgICAgICAweDEwCisjZGVmaW5lIExJTTBfRVFPTiAgICAgICAweDA4CisjZGVmaW5lIExJTTBfRUxPUyAgICAgICAweDA0CisjZGVmaW5lIExJTTBfTEwgICAgICAgICAweDAyCisjZGVmaW5lIExJTTBfTUFTICAgICAgICAweDAxCisKKyNkZWZpbmUgTElNMV9FRlNDICAgICAgIDB4ODAKKyNkZWZpbmUgTElNMV9SSUwyICAgICAgIDB4NDAKKyNkZWZpbmUgTElNMV9SSUwxICAgICAgIDB4MjAKKyNkZWZpbmUgTElNMV9SSUwwICAgICAgIDB4MTAKKyNkZWZpbmUgTElNMV9EQ09DICAgICAgIDB4MDgKKyNkZWZpbmUgTElNMV9KQVRUICAgICAgIDB4MDQKKyNkZWZpbmUgTElNMV9STCAgICAgICAgIDB4MDIKKyNkZWZpbmUgTElNMV9EUlMgICAgICAgIDB4MDEKKworCisvKiBQQ0RSIChQdWxzZSBDb3VudCBEZXRlY3Rpb24gUmVnaXN0ZXIoUmVhZC9Xcml0ZSkpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgUENEUl9QQ0Q3CTB4ODAKKyNkZWZpbmUgUENEUl9QQ0Q2CTB4NDAKKyNkZWZpbmUgUENEUl9QQ0Q1CTB4MjAKKyNkZWZpbmUgUENEUl9QQ0Q0CTB4MTAKKyNkZWZpbmUgUENEUl9QQ0QzCTB4MDgKKyNkZWZpbmUgUENEUl9QQ0QyCTB4MDQKKyNkZWZpbmUgUENEUl9QQ0QxCTB4MDIKKyNkZWZpbmUgUENEUl9QQ0QwCTB4MDEKKworI2RlZmluZSBQQ1JSX1BDUjcJMHg4MAorI2RlZmluZSBQQ1JSX1BDUjYJMHg0MAorI2RlZmluZSBQQ1JSX1BDUjUJMHgyMAorI2RlZmluZSBQQ1JSX1BDUjQJMHgxMAorI2RlZmluZSBQQ1JSX1BDUjMJMHgwOAorI2RlZmluZSBQQ1JSX1BDUjIJMHgwNAorI2RlZmluZSBQQ1JSX1BDUjEJMHgwMgorI2RlZmluZSBQQ1JSX1BDUjAJMHgwMQorCisKKy8qIExJTTIgKExpbmUgSW50ZXJmYWNlIE1vZGUgMikKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIExJTTJfREpBMgkweDIwCisjZGVmaW5lIExJTTJfREpBMQkweDEwCisjZGVmaW5lIExJTTJfTE9TMgkweDAyCisjZGVmaW5lIExJTTJfTE9TMQkweDAxCisKKy8qIExDUjEgKExvb3AgQ29kZSBSZWdpc3RlciAxKSAqLworCisjZGVmaW5lIExDUjFfRVBSTQkweDgwCisjZGVmaW5lCUxDUjFfWFBSQlMJMHg0MAorCisvKiBTSUMxIChTeXN0ZW0gSW50ZXJmYWNlIENvbnRyb2wgMSkgKi8KKyNkZWZpbmUgU0lDMV9TUlNDCTB4ODAKKyNkZWZpbmUgU0lDMV9SQlMxCTB4MjAKKyNkZWZpbmUgU0lDMV9SQlMwCTB4MTAKKyNkZWZpbmUgU0lDMV9TWFNDCTB4MDgKKyNkZWZpbmUgU0lDMV9YQlMxCTB4MDIKKyNkZWZpbmUgU0lDMV9YQlMwCTB4MDEKKworLyogREVDIChEaXNhYmxlIEVycm9yIENvdW50ZXIpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgREVDX0RDRUMzICAgICAgIDB4MjAKKyNkZWZpbmUgREVDX0RCRUMgICAgICAgIDB4MTAKKyNkZWZpbmUgREVDX0RDRUMxICAgICAgIDB4MDgKKyNkZWZpbmUgREVDX0RDRUMgICAgICAgIDB4MDgKKyNkZWZpbmUgREVDX0RFQkMgICAgICAgIDB4MDQKKyNkZWZpbmUgREVDX0RDVkMgICAgICAgIDB4MDIKKyNkZWZpbmUgREVDX0RGRUMgICAgICAgIDB4MDEKKworCisvKiBGQUxDIFJlZ2lzdGVyIEJpdHMgKFJlY2VpdmUgTW9kZSkKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiBGUlMwLzEgKEZyYW1lciBSZWNlaXZlIFN0YXR1cyBSZWdpc3RlciAwLzEpCisgICAtLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBGUlMwX0xPUyAgICAgICAgMHg4MAorI2RlZmluZSBGUlMwX0FJUyAgICAgICAgMHg0MAorI2RlZmluZSBGUlMwX0xGQSAgICAgICAgMHgyMAorI2RlZmluZSBGUlMwX1JSQSAgICAgICAgMHgxMAorI2RlZmluZSBGUlMwX0FQSSAgICAgICAgMHgwOAorI2RlZmluZSBGUlMwX05NRiAgICAgICAgMHgwNAorI2RlZmluZSBGUlMwX0xNRkEgICAgICAgMHgwMgorI2RlZmluZSBGUlMwX0ZTUkYgICAgICAgMHgwMQorCisjZGVmaW5lIEZSUzFfVFMxNlJBICAgICAweDQwCisjZGVmaW5lIEZSUzFfVFMxNkxPUyAgICAweDIwCisjZGVmaW5lIEZSUzFfVFMxNkFJUyAgICAweDEwCisjZGVmaW5lIEZSUzFfVFMxNkxGQSAgICAweDA4CisjZGVmaW5lIEZSUzFfRVhaRCAgICAgICAweDgwCisjZGVmaW5lIEZSUzFfTExCREQgICAgICAweDEwCisjZGVmaW5lIEZSUzFfTExCQUQgICAgICAweDA4CisjZGVmaW5lIEZSUzFfWExTICAgICAgICAweDAyCisjZGVmaW5lIEZSUzFfWExPICAgICAgICAweDAxCisjZGVmaW5lIEZSUzFfUERFTgkweDQwCisKKy8qIEZSUzIvMyAoRnJhbWVyIFJlY2VpdmUgU3RhdHVzIFJlZ2lzdGVyIDIvMykKKyAgIC0tLS0tLS0tLS0tLS0tLS0tIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBGUlMyX0VTQzIgICAgICAgMHg4MAorI2RlZmluZSBGUlMyX0VTQzEgICAgICAgMHg0MAorI2RlZmluZSBGUlMyX0VTQzAgICAgICAgMHgyMAorCisjZGVmaW5lIEZSUzNfRkVINSAgICAgICAweDIwCisjZGVmaW5lIEZSUzNfRkVINCAgICAgICAweDEwCisjZGVmaW5lIEZSUzNfRkVIMyAgICAgICAweDA4CisjZGVmaW5lIEZSUzNfRkVIMiAgICAgICAweDA0CisjZGVmaW5lIEZSUzNfRkVIMSAgICAgICAweDAyCisjZGVmaW5lIEZSUzNfRkVIMCAgICAgICAweDAxCisKKworLyogUlNXIChSZWNlaXZlIFNlcnZpY2UgV29yZCBQdWxzZWZyYW1lKQorICAgLS0tLS0tLS0tLS0tLS0tLS0gRTEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgUlNXX1JTSSAgICAgICAgIDB4ODAKKyNkZWZpbmUgUlNXX1JSQSAgICAgICAgIDB4MjAKKyNkZWZpbmUgUlNXX1JZTyAgICAgICAgIDB4MTAKKyNkZWZpbmUgUlNXX1JZMSAgICAgICAgIDB4MDgKKyNkZWZpbmUgUlNXX1JZMiAgICAgICAgIDB4MDQKKyNkZWZpbmUgUlNXX1JZMyAgICAgICAgIDB4MDIKKyNkZWZpbmUgUlNXX1JZNCAgICAgICAgIDB4MDEKKworCisvKiBSU1AgKFJlY2VpdmUgU3BhcmUgQml0cyAvIEFkZGl0aW9uYWwgU3RhdHVzKQorICAgLS0tLS0tLS0tLS0tLS0tLSBFMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgUlNQX1NJMSAgICAgICAgIDB4ODAKKyNkZWZpbmUgUlNQX1NJMiAgICAgICAgIDB4NDAKKyNkZWZpbmUgUlNQX0xMQkRECTB4MTAKKyNkZWZpbmUgUlNQX0xMQkFECTB4MDgKKyNkZWZpbmUgUlNQX1JTSUYgICAgICAgIDB4MDQKKyNkZWZpbmUgUlNQX1JTMTMgICAgICAgIDB4MDIKKyNkZWZpbmUgUlNQX1JTMTUgICAgICAgIDB4MDEKKworCisvKiBGRUNMIChGcmFtaW5nIEVycm9yIENvdW50ZXIpCisgICAtLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBGRUNMX0ZFNyAgICAgICAgMHg4MAorI2RlZmluZSBGRUNMX0ZFNiAgICAgICAgMHg0MAorI2RlZmluZSBGRUNMX0ZFNSAgICAgICAgMHgyMAorI2RlZmluZSBGRUNMX0ZFNCAgICAgICAgMHgxMAorI2RlZmluZSBGRUNMX0ZFMyAgICAgICAgMHgwOAorI2RlZmluZSBGRUNMX0ZFMiAgICAgICAgMHgwNAorI2RlZmluZSBGRUNMX0ZFMSAgICAgICAgMHgwMgorI2RlZmluZSBGRUNMX0ZFMCAgICAgICAgMHgwMQorCisjZGVmaW5lIEZFQ0hfRkUxNSAgICAgICAweDgwCisjZGVmaW5lIEZFQ0hfRkUxNCAgICAgICAweDQwCisjZGVmaW5lIEZFQ0hfRkUxMyAgICAgICAweDIwCisjZGVmaW5lIEZFQ0hfRkUxMiAgICAgICAweDEwCisjZGVmaW5lIEZFQ0hfRkUxMSAgICAgICAweDA4CisjZGVmaW5lIEZFQ0hfRkUxMCAgICAgICAweDA0CisjZGVmaW5lIEZFQ0hfRkU5ICAgICAgICAweDAyCisjZGVmaW5lIEZFQ0hfRkU4ICAgICAgICAweDAxCisKKworLyogQ1ZDbCAoQ29kZSBWaW9sYXRpb24gQ291bnRlcikKKyAgIC0tLS0tLS0tLS0tLS0tLS0tIEUxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBDVkNMX0NWNyAgICAgICAgMHg4MAorI2RlZmluZSBDVkNMX0NWNiAgICAgICAgMHg0MAorI2RlZmluZSBDVkNMX0NWNSAgICAgICAgMHgyMAorI2RlZmluZSBDVkNMX0NWNCAgICAgICAgMHgxMAorI2RlZmluZSBDVkNMX0NWMyAgICAgICAgMHgwOAorI2RlZmluZSBDVkNMX0NWMiAgICAgICAgMHgwNAorI2RlZmluZSBDVkNMX0NWMSAgICAgICAgMHgwMgorI2RlZmluZSBDVkNMX0NWMCAgICAgICAgMHgwMQorCisjZGVmaW5lIENWQ0hfQ1YxNSAgICAgICAweDgwCisjZGVmaW5lIENWQ0hfQ1YxNCAgICAgICAweDQwCisjZGVmaW5lIENWQ0hfQ1YxMyAgICAgICAweDIwCisjZGVmaW5lIENWQ0hfQ1YxMiAgICAgICAweDEwCisjZGVmaW5lIENWQ0hfQ1YxMSAgICAgICAweDA4CisjZGVmaW5lIENWQ0hfQ1YxMCAgICAgICAweDA0CisjZGVmaW5lIENWQ0hfQ1Y5ICAgICAgICAweDAyCisjZGVmaW5lIENWQ0hfQ1Y4ICAgICAgICAweDAxCisKKworLyogQ0VDMS0zTCAoQ1JDIEVycm9yIENvdW50ZXIpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0gRTEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBDRUMxTF9DUjcgICAgICAgMHg4MAorI2RlZmluZSBDRUMxTF9DUjYgICAgICAgMHg0MAorI2RlZmluZSBDRUMxTF9DUjUgICAgICAgMHgyMAorI2RlZmluZSBDRUMxTF9DUjQgICAgICAgMHgxMAorI2RlZmluZSBDRUMxTF9DUjMgICAgICAgMHgwOAorI2RlZmluZSBDRUMxTF9DUjIgICAgICAgMHgwNAorI2RlZmluZSBDRUMxTF9DUjEgICAgICAgMHgwMgorI2RlZmluZSBDRUMxTF9DUjAgICAgICAgMHgwMQorCisjZGVmaW5lIENFQzFIX0NSMTUgICAgICAweDgwCisjZGVmaW5lIENFQzFIX0NSMTQgICAgICAweDQwCisjZGVmaW5lIENFQzFIX0NSMTMgICAgICAweDIwCisjZGVmaW5lIENFQzFIX0NSMTIgICAgICAweDEwCisjZGVmaW5lIENFQzFIX0NSMTEgICAgICAweDA4CisjZGVmaW5lIENFQzFIX0NSMTAgICAgICAweDA0CisjZGVmaW5lIENFQzFIX0NSOSAgICAgICAweDAyCisjZGVmaW5lIENFQzFIX0NSOCAgICAgICAweDAxCisKKyNkZWZpbmUgQ0VDMkxfQ1I3ICAgICAgIDB4ODAKKyNkZWZpbmUgQ0VDMkxfQ1I2ICAgICAgIDB4NDAKKyNkZWZpbmUgQ0VDMkxfQ1I1ICAgICAgIDB4MjAKKyNkZWZpbmUgQ0VDMkxfQ1I0ICAgICAgIDB4MTAKKyNkZWZpbmUgQ0VDMkxfQ1IzICAgICAgIDB4MDgKKyNkZWZpbmUgQ0VDMkxfQ1IyICAgICAgIDB4MDQKKyNkZWZpbmUgQ0VDMkxfQ1IxICAgICAgIDB4MDIKKyNkZWZpbmUgQ0VDMkxfQ1IwICAgICAgIDB4MDEKKworI2RlZmluZSBDRUMySF9DUjE1ICAgICAgMHg4MAorI2RlZmluZSBDRUMySF9DUjE0ICAgICAgMHg0MAorI2RlZmluZSBDRUMySF9DUjEzICAgICAgMHgyMAorI2RlZmluZSBDRUMySF9DUjEyICAgICAgMHgxMAorI2RlZmluZSBDRUMySF9DUjExICAgICAgMHgwOAorI2RlZmluZSBDRUMySF9DUjEwICAgICAgMHgwNAorI2RlZmluZSBDRUMySF9DUjkgICAgICAgMHgwMgorI2RlZmluZSBDRUMySF9DUjggICAgICAgMHgwMQorCisjZGVmaW5lIENFQzNMX0NSNyAgICAgICAweDgwCisjZGVmaW5lIENFQzNMX0NSNiAgICAgICAweDQwCisjZGVmaW5lIENFQzNMX0NSNSAgICAgICAweDIwCisjZGVmaW5lIENFQzNMX0NSNCAgICAgICAweDEwCisjZGVmaW5lIENFQzNMX0NSMyAgICAgICAweDA4CisjZGVmaW5lIENFQzNMX0NSMiAgICAgICAweDA0CisjZGVmaW5lIENFQzNMX0NSMSAgICAgICAweDAyCisjZGVmaW5lIENFQzNMX0NSMCAgICAgICAweDAxCisKKyNkZWZpbmUgQ0VDM0hfQ1IxNSAgICAgIDB4ODAKKyNkZWZpbmUgQ0VDM0hfQ1IxNCAgICAgIDB4NDAKKyNkZWZpbmUgQ0VDM0hfQ1IxMyAgICAgIDB4MjAKKyNkZWZpbmUgQ0VDM0hfQ1IxMiAgICAgIDB4MTAKKyNkZWZpbmUgQ0VDM0hfQ1IxMSAgICAgIDB4MDgKKyNkZWZpbmUgQ0VDM0hfQ1IxMCAgICAgIDB4MDQKKyNkZWZpbmUgQ0VDM0hfQ1I5ICAgICAgIDB4MDIKKyNkZWZpbmUgQ0VDM0hfQ1I4ICAgICAgIDB4MDEKKworCisvKiBDRUNMIChDUkMgRXJyb3IgQ291bnRlcikKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQ0VDTF9DUjcgICAgICAgIDB4ODAKKyNkZWZpbmUgQ0VDTF9DUjYgICAgICAgIDB4NDAKKyNkZWZpbmUgQ0VDTF9DUjUgICAgICAgIDB4MjAKKyNkZWZpbmUgQ0VDTF9DUjQgICAgICAgIDB4MTAKKyNkZWZpbmUgQ0VDTF9DUjMgICAgICAgIDB4MDgKKyNkZWZpbmUgQ0VDTF9DUjIgICAgICAgIDB4MDQKKyNkZWZpbmUgQ0VDTF9DUjEgICAgICAgIDB4MDIKKyNkZWZpbmUgQ0VDTF9DUjAgICAgICAgIDB4MDEKKworI2RlZmluZSBDRUNIX0NSMTUgICAgICAgMHg4MAorI2RlZmluZSBDRUNIX0NSMTQgICAgICAgMHg0MAorI2RlZmluZSBDRUNIX0NSMTMgICAgICAgMHgyMAorI2RlZmluZSBDRUNIX0NSMTIgICAgICAgMHgxMAorI2RlZmluZSBDRUNIX0NSMTEgICAgICAgMHgwOAorI2RlZmluZSBDRUNIX0NSMTAgICAgICAgMHgwNAorI2RlZmluZSBDRUNIX0NSOSAgICAgICAgMHgwMgorI2RlZmluZSBDRUNIX0NSOCAgICAgICAgMHgwMQorCisvKiBFQkNMIChFIEJpdCBFcnJvciBDb3VudGVyKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBFQkNMX0VCNyAgICAgICAgMHg4MAorI2RlZmluZSBFQkNMX0VCNiAgICAgICAgMHg0MAorI2RlZmluZSBFQkNMX0VCNSAgICAgICAgMHgyMAorI2RlZmluZSBFQkNMX0VCNCAgICAgICAgMHgxMAorI2RlZmluZSBFQkNMX0VCMyAgICAgICAgMHgwOAorI2RlZmluZSBFQkNMX0VCMiAgICAgICAgMHgwNAorI2RlZmluZSBFQkNMX0VCMSAgICAgICAgMHgwMgorI2RlZmluZSBFQkNMX0VCMCAgICAgICAgMHgwMQorCisjZGVmaW5lIEVCQ0hfRUIxNSAgICAgICAweDgwCisjZGVmaW5lIEVCQ0hfRUIxNCAgICAgICAweDQwCisjZGVmaW5lIEVCQ0hfRUIxMyAgICAgICAweDIwCisjZGVmaW5lIEVCQ0hfRUIxMiAgICAgICAweDEwCisjZGVmaW5lIEVCQ0hfRUIxMSAgICAgICAweDA4CisjZGVmaW5lIEVCQ0hfRUIxMCAgICAgICAweDA0CisjZGVmaW5lIEVCQ0hfRUI5ICAgICAgICAweDAyCisjZGVmaW5lIEVCQ0hfRUI4ICAgICAgICAweDAxCisKKworLyogUlNBNC04IChSZWNlaXZlIFNhNC04LUJpdCBSZWdpc3RlcikKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEUxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFJTQTRfUlM0NyAgICAgICAweDgwCisjZGVmaW5lIFJTQTRfUlM0NiAgICAgICAweDQwCisjZGVmaW5lIFJTQTRfUlM0NSAgICAgICAweDIwCisjZGVmaW5lIFJTQTRfUlM0NCAgICAgICAweDEwCisjZGVmaW5lIFJTQTRfUlM0MyAgICAgICAweDA4CisjZGVmaW5lIFJTQTRfUlM0MiAgICAgICAweDA0CisjZGVmaW5lIFJTQTRfUlM0MSAgICAgICAweDAyCisjZGVmaW5lIFJTQTRfUlM0MCAgICAgICAweDAxCisKKyNkZWZpbmUgUlNBNV9SUzU3ICAgICAgIDB4ODAKKyNkZWZpbmUgUlNBNV9SUzU2ICAgICAgIDB4NDAKKyNkZWZpbmUgUlNBNV9SUzU1ICAgICAgIDB4MjAKKyNkZWZpbmUgUlNBNV9SUzU0ICAgICAgIDB4MTAKKyNkZWZpbmUgUlNBNV9SUzUzICAgICAgIDB4MDgKKyNkZWZpbmUgUlNBNV9SUzUyICAgICAgIDB4MDQKKyNkZWZpbmUgUlNBNV9SUzUxICAgICAgIDB4MDIKKyNkZWZpbmUgUlNBNV9SUzUwICAgICAgIDB4MDEKKworI2RlZmluZSBSU0E2X1JTNjcgICAgICAgMHg4MAorI2RlZmluZSBSU0E2X1JTNjYgICAgICAgMHg0MAorI2RlZmluZSBSU0E2X1JTNjUgICAgICAgMHgyMAorI2RlZmluZSBSU0E2X1JTNjQgICAgICAgMHgxMAorI2RlZmluZSBSU0E2X1JTNjMgICAgICAgMHgwOAorI2RlZmluZSBSU0E2X1JTNjIgICAgICAgMHgwNAorI2RlZmluZSBSU0E2X1JTNjEgICAgICAgMHgwMgorI2RlZmluZSBSU0E2X1JTNjAgICAgICAgMHgwMQorCisjZGVmaW5lIFJTQTdfUlM3NyAgICAgICAweDgwCisjZGVmaW5lIFJTQTdfUlM3NiAgICAgICAweDQwCisjZGVmaW5lIFJTQTdfUlM3NSAgICAgICAweDIwCisjZGVmaW5lIFJTQTdfUlM3NCAgICAgICAweDEwCisjZGVmaW5lIFJTQTdfUlM3MyAgICAgICAweDA4CisjZGVmaW5lIFJTQTdfUlM3MiAgICAgICAweDA0CisjZGVmaW5lIFJTQTdfUlM3MSAgICAgICAweDAyCisjZGVmaW5lIFJTQTdfUlM3MCAgICAgICAweDAxCisKKyNkZWZpbmUgUlNBOF9SUzg3ICAgICAgIDB4ODAKKyNkZWZpbmUgUlNBOF9SUzg2ICAgICAgIDB4NDAKKyNkZWZpbmUgUlNBOF9SUzg1ICAgICAgIDB4MjAKKyNkZWZpbmUgUlNBOF9SUzg0ICAgICAgIDB4MTAKKyNkZWZpbmUgUlNBOF9SUzgzICAgICAgIDB4MDgKKyNkZWZpbmUgUlNBOF9SUzgyICAgICAgIDB4MDQKKyNkZWZpbmUgUlNBOF9SUzgxICAgICAgIDB4MDIKKyNkZWZpbmUgUlNBOF9SUzgwICAgICAgIDB4MDEKKworLyogUlNBNlMgKFJlY2VpdmUgU2E2IEJpdCBTdGF0dXMgUmVnaXN0ZXIpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFJTQTZTX1NYICAgICAgICAweDIwCisjZGVmaW5lIFJTQTZTX1NGICAgICAgICAweDEwCisjZGVmaW5lIFJTQTZTX1NFICAgICAgICAweDA4CisjZGVmaW5lIFJTQTZTX1NDICAgICAgICAweDA0CisjZGVmaW5lIFJTQTZTX1NBICAgICAgICAweDAyCisjZGVmaW5lIFJTQTZTX1M4ICAgICAgICAweDAxCisKKworLyogUkRMMS0zIFJlY2VpdmUgREwtQml0IFJlZ2lzdGVyMS0zKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBSREwxX1JETDE3ICAgICAgMHg4MAorI2RlZmluZSBSREwxX1JETDE2ICAgICAgMHg0MAorI2RlZmluZSBSREwxX1JETDE1ICAgICAgMHgyMAorI2RlZmluZSBSREwxX1JETDE0ICAgICAgMHgxMAorI2RlZmluZSBSREwxX1JETDEzICAgICAgMHgwOAorI2RlZmluZSBSREwxX1JETDEyICAgICAgMHgwNAorI2RlZmluZSBSREwxX1JETDExICAgICAgMHgwMgorI2RlZmluZSBSREwxX1JETDEwICAgICAgMHgwMQorCisjZGVmaW5lIFJETDJfUkRMMjcgICAgICAweDgwCisjZGVmaW5lIFJETDJfUkRMMjYgICAgICAweDQwCisjZGVmaW5lIFJETDJfUkRMMjUgICAgICAweDIwCisjZGVmaW5lIFJETDJfUkRMMjQgICAgICAweDEwCisjZGVmaW5lIFJETDJfUkRMMjMgICAgICAweDA4CisjZGVmaW5lIFJETDJfUkRMMjIgICAgICAweDA0CisjZGVmaW5lIFJETDJfUkRMMjEgICAgICAweDAyCisjZGVmaW5lIFJETDJfUkRMMjAgICAgICAweDAxCisKKyNkZWZpbmUgUkRMM19SREwzNyAgICAgIDB4ODAKKyNkZWZpbmUgUkRMM19SREwzNiAgICAgIDB4NDAKKyNkZWZpbmUgUkRMM19SREwzNSAgICAgIDB4MjAKKyNkZWZpbmUgUkRMM19SREwzNCAgICAgIDB4MTAKKyNkZWZpbmUgUkRMM19SREwzMyAgICAgIDB4MDgKKyNkZWZpbmUgUkRMM19SREwzMiAgICAgIDB4MDQKKyNkZWZpbmUgUkRMM19SREwzMSAgICAgIDB4MDIKKyNkZWZpbmUgUkRMM19SREwzMCAgICAgIDB4MDEKKworCisvKiBTSVMgKFNpZ25hbGluZyBTdGF0dXMgUmVnaXN0ZXIpCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBTSVNfWERPViAgICAgICAgMHg4MAorI2RlZmluZSBTSVNfWEZXICAgICAgICAgMHg0MAorI2RlZmluZSBTSVNfWFJFUCAgICAgICAgMHgyMAorI2RlZmluZSBTSVNfUkxJICAgICAgICAgMHgwOAorI2RlZmluZSBTSVNfQ0VDICAgICAgICAgMHgwNAorI2RlZmluZSBTSVNfQk9NICAgICAgICAgMHgwMQorCisKKy8qIFJTSVMgKFJlY2VpdmUgU2lnbmFsaW5nIFN0YXR1cyBSZWdpc3RlcikKKworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBSU0lTX1ZGUiAgICAgICAgMHg4MAorI2RlZmluZSBSU0lTX1JETyAgICAgICAgMHg0MAorI2RlZmluZSBSU0lTX0NSQzE2ICAgICAgMHgyMAorI2RlZmluZSBSU0lTX1JBQiAgICAgICAgMHgxMAorI2RlZmluZSBSU0lTX0hBMSAgICAgICAgMHgwOAorI2RlZmluZSBSU0lTX0hBMCAgICAgICAgMHgwNAorI2RlZmluZSBSU0lTX0hGUiAgICAgICAgMHgwMgorI2RlZmluZSBSU0lTX0xBICAgICAgICAgMHgwMQorCisKKy8qIFJCQ0wvSCAoUmVjZWl2ZSBCeXRlIENvdW50IExvdy9IaWdoKQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tIEUxICYgVDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBSQkNMX1JCQzcgICAgICAgMHg4MAorI2RlZmluZSBSQkNMX1JCQzYgICAgICAgMHg0MAorI2RlZmluZSBSQkNMX1JCQzUgICAgICAgMHgyMAorI2RlZmluZSBSQkNMX1JCQzQgICAgICAgMHgxMAorI2RlZmluZSBSQkNMX1JCQzMgICAgICAgMHgwOAorI2RlZmluZSBSQkNMX1JCQzIgICAgICAgMHgwNAorI2RlZmluZSBSQkNMX1JCQzEgICAgICAgMHgwMgorI2RlZmluZSBSQkNMX1JCQzAgICAgICAgMHgwMQorCisjZGVmaW5lIFJCQ0hfT1YgICAgICAgICAweDEwCisjZGVmaW5lIFJCQ0hfUkJDMTEgICAgICAweDA4CisjZGVmaW5lIFJCQ0hfUkJDMTAgICAgICAweDA0CisjZGVmaW5lIFJCQ0hfUkJDOSAgICAgICAweDAyCisjZGVmaW5lIFJCQ0hfUkJDOCAgICAgICAweDAxCisKKworLyogSVNSMS0zICAoSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAxLTMpCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lICBGSVNSMF9STUUJMHg4MAorI2RlZmluZSAgRklTUjBfUkZTCTB4NDAKKyNkZWZpbmUgIEZJU1IwX1Q4TVMJMHgyMAorI2RlZmluZSAgRklTUjBfSVNGCTB4MjAKKyNkZWZpbmUgIEZJU1IwX1JNQgkweDEwCisjZGVmaW5lICBGSVNSMF9DQVNDCTB4MDgKKyNkZWZpbmUgIEZJU1IwX1JTQwkweDA4CisjZGVmaW5lICBGSVNSMF9DUkM2CTB4MDQKKyNkZWZpbmUgIEZJU1IwX0NSQzQJMHgwNAorI2RlZmluZSAgRklTUjBfUERFTgkweDAyCisjZGVmaW5lICBGSVNSMF9SUEYJMHgwMQorCisjZGVmaW5lICBGSVNSMV9DQVNFCTB4ODAKKyNkZWZpbmUgIEZJU1IxX0xMQlNDCTB4ODAKKyNkZWZpbmUgIEZJU1IxX1JETwkweDQwCisjZGVmaW5lICBGSVNSMV9BTExTCTB4MjAKKyNkZWZpbmUgIEZJU1IxX1hEVQkweDEwCisjZGVmaW5lICBGSVNSMV9YTUIJMHgwOAorI2RlZmluZSAgRklTUjFfWExTQwkweDAyCisjZGVmaW5lICBGSVNSMV9YUFIJMHgwMQorCisjZGVmaW5lICBGSVNSMl9GQVIJMHg4MAorI2RlZmluZSAgRklTUjJfTEZBCTB4NDAKKyNkZWZpbmUgIEZJU1IyX01GQVIJMHgyMAorI2RlZmluZSAgRklTUjJfVDQwME1TCTB4MTAKKyNkZWZpbmUgIEZJU1IyX0xNRkEJMHgxMAorI2RlZmluZSAgRklTUjJfQUlTCTB4MDgKKyNkZWZpbmUgIEZJU1IyX0xPUwkweDA0CisjZGVmaW5lICBGSVNSMl9SQVIJMHgwMgorI2RlZmluZSAgRklTUjJfUkEJMHgwMQorCisjZGVmaW5lICBGSVNSM19FUwkweDgwCisjZGVmaW5lICBGSVNSM19TRUMJMHg0MAorI2RlZmluZSAgRklTUjNfTE1GQTE2CTB4MjAKKyNkZWZpbmUgIEZJU1IzX0FJUzE2CTB4MTAKKyNkZWZpbmUgIEZJU1IzX1JBMTYJMHgwOAorI2RlZmluZSAgRklTUjNfQVBJCTB4MDQKKyNkZWZpbmUgIEZJU1IzX1hTTFAJMHgyMAorI2RlZmluZSAgRklTUjNfWFNMTgkweDEwCisjZGVmaW5lICBGSVNSM19MTEJTQwkweDA4CisjZGVmaW5lICBGSVNSM19YUlMJMHgwNAorI2RlZmluZSAgRklTUjNfU0xOCTB4MDIKKyNkZWZpbmUgIEZJU1IzX1NMUAkweDAxCisKKworLyogR0lTICAoR2xvYmFsIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIpCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFMSAmIFQxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lICBHSVNfSVNSMwkweDA4CisjZGVmaW5lICBHSVNfSVNSMgkweDA0CisjZGVmaW5lICBHSVNfSVNSMQkweDAyCisjZGVmaW5lICBHSVNfSVNSMAkweDAxCisKKworLyogVlNUUiAgKFZlcnNpb24gU3RhdHVzIFJlZ2lzdGVyKQorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRTEgJiBUMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSAgVlNUUl9WTjMJMHgwOAorI2RlZmluZSAgVlNUUl9WTjIJMHgwNAorI2RlZmluZSAgVlNUUl9WTjEJMHgwMgorI2RlZmluZSAgVlNUUl9WTjAJMHgwMQorCisKKy8qPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+ICBMb2NhbCBDb250cm9sIFN0cnVjdHVyZXMgIDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwgKi8KKworLyogV3JpdGUtb25seSBSZWdpc3RlcnMgKEUxL1QxIGNvbnRyb2wgbW9kZSB3cml0ZSByZWdpc3RlcnMpICovCisjZGVmaW5lIFhGSUZPSAkweDAwCQkvKiBUeCBGSUZPIEhpZ2ggQnl0ZSAqLworI2RlZmluZSBYRklGT0wJMHgwMQkJLyogVHggRklGTyBMb3cgQnl0ZSAqLworI2RlZmluZSBDTURSCTB4MDIJCS8qIENvbW1hbmQgUmVnICovCisjZGVmaW5lIERFQwkweDYwCQkvKiBEaXNhYmxlIEVycm9yIENvdW50ZXIgKi8KKyNkZWZpbmUgVEVTVDIJMHg2MgkJLyogTWFudWYuIFRlc3QgUmVnIDIgKi8KKyNkZWZpbmUgWFMobmJyKQkoMHg3MCArIChuYnIpKQkvKiBUeCBDQVMgUmVnICgwIHRvIDE1KSAqLworCisvKiBSZWFkLXdyaXRlIFJlZ2lzdGVycyAoRTEvVDEgc3RhdHVzIG1vZGUgcmVhZCByZWdpc3RlcnMpICovCisjZGVmaW5lIE1PREUJMHgwMwkvKiBNb2RlIFJlZyAqLworI2RlZmluZSBSQUgxCTB4MDQJLyogUmVjZWl2ZSBBZGRyZXNzIEhpZ2ggMSAqLworI2RlZmluZSBSQUgyCTB4MDUJLyogUmVjZWl2ZSBBZGRyZXNzIEhpZ2ggMiAqLworI2RlZmluZSBSQUwxCTB4MDYJLyogUmVjZWl2ZSBBZGRyZXNzIExvdyAxICovCisjZGVmaW5lIFJBTDIJMHgwNwkvKiBSZWNlaXZlIEFkZHJlc3MgTG93IDIgKi8KKyNkZWZpbmUgSVBDCTB4MDgJLyogSW50ZXJydXB0IFBvcnQgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSBDQ1IxCTB4MDkJLyogQ29tbW9uIENvbmZpZ3VyYXRpb24gUmVnIDEgKi8KKyNkZWZpbmUgQ0NSMwkweDBBCS8qIENvbW1vbiBDb25maWd1cmF0aW9uIFJlZyAzICovCisjZGVmaW5lIFBSRQkweDBCCS8qIFByZWFtYmxlIFJlZyAqLworI2RlZmluZSBSVFIxCTB4MEMJLyogUmVjZWl2ZSBUaW1lc2xvdCBSZWcgMSAqLworI2RlZmluZSBSVFIyCTB4MEQJLyogUmVjZWl2ZSBUaW1lc2xvdCBSZWcgMiAqLworI2RlZmluZSBSVFIzCTB4MEUJLyogUmVjZWl2ZSBUaW1lc2xvdCBSZWcgMyAqLworI2RlZmluZSBSVFI0CTB4MEYJLyogUmVjZWl2ZSBUaW1lc2xvdCBSZWcgNCAqLworI2RlZmluZSBUVFIxCTB4MTAJLyogVHJhbnNtaXQgVGltZXNsb3QgUmVnIDEgKi8KKyNkZWZpbmUgVFRSMgkweDExCS8qIFRyYW5zbWl0IFRpbWVzbG90IFJlZyAyICovCisjZGVmaW5lIFRUUjMJMHgxMgkvKiBUcmFuc21pdCBUaW1lc2xvdCBSZWcgMyAqLworI2RlZmluZSBUVFI0CTB4MTMJLyogVHJhbnNtaXQgVGltZXNsb3QgUmVnIDQgKi8KKyNkZWZpbmUgSU1SMAkweDE0CS8qIEludGVycnVwdCBNYXNrIFJlZyAwICovCisjZGVmaW5lIElNUjEJMHgxNQkvKiBJbnRlcnJ1cHQgTWFzayBSZWcgMSAqLworI2RlZmluZSBJTVIyCTB4MTYJLyogSW50ZXJydXB0IE1hc2sgUmVnIDIgKi8KKyNkZWZpbmUgSU1SMwkweDE3CS8qIEludGVycnVwdCBNYXNrIFJlZyAzICovCisjZGVmaW5lIElNUjQJMHgxOAkvKiBJbnRlcnJ1cHQgTWFzayBSZWcgNCAqLworI2RlZmluZSBJTVI1CTB4MTkJLyogSW50ZXJydXB0IE1hc2sgUmVnIDUgKi8KKyNkZWZpbmUgRk1SMAkweDFBCS8qIEZyYW1lciBNb2RlIFJlaWdzdGVyIDAgKi8KKyNkZWZpbmUgRk1SMQkweDFCCS8qIEZyYW1lciBNb2RlIFJlaWdzdGVyIDEgKi8KKyNkZWZpbmUgRk1SMgkweDFDCS8qIEZyYW1lciBNb2RlIFJlaWdzdGVyIDIgKi8KKyNkZWZpbmUgTE9PUAkweDFECS8qIENoYW5uZWwgTG9vcCBCYWNrICovCisjZGVmaW5lIFhTVwkweDFFCS8qIFRyYW5zbWl0IFNlcnZpY2UgV29yZCAqLworI2RlZmluZSBGTVI0CTB4MUUJLyogRnJhbWVyIE1vZGUgUmVnIDQgKi8KKyNkZWZpbmUgWFNQCTB4MUYJLyogVHJhbnNtaXQgU3BhcmUgQml0cyAqLworI2RlZmluZSBGTVI1CTB4MUYJLyogRnJhbWVyIE1vZGUgUmVnIDUgKi8KKyNkZWZpbmUgWEMwCTB4MjAJLyogVHJhbnNtaXQgQ29udHJvbCAwICovCisjZGVmaW5lIFhDMQkweDIxCS8qIFRyYW5zbWl0IENvbnRyb2wgMSAqLworI2RlZmluZSBSQzAJMHgyMgkvKiBSZWNlaXZlIENvbnRyb2wgMCAqLworI2RlZmluZSBSQzEJMHgyMwkvKiBSZWNlaXZlIENvbnRyb2wgMSAqLworI2RlZmluZSBYUE0wCTB4MjQJLyogVHJhbnNtaXQgUHVsc2UgTWFzayAwICovCisjZGVmaW5lIFhQTTEJMHgyNQkvKiBUcmFuc21pdCBQdWxzZSBNYXNrIDEgKi8KKyNkZWZpbmUgWFBNMgkweDI2CS8qIFRyYW5zbWl0IFB1bHNlIE1hc2sgMiAqLworI2RlZmluZSBUU1dNCTB4MjcJLyogVHJhbnNwYXJlbnQgU2VydmljZSBXb3JkIE1hc2sgKi8KKyNkZWZpbmUgVEVTVDEJMHgyOAkvKiBNYW51Zi4gVGVzdCBSZWcgMSAqLworI2RlZmluZSBJRExFCTB4MjkJLyogSWRsZSBDaGFubmVsIENvZGUgKi8KKyNkZWZpbmUgWFNBNCAgICAweDJBCS8qIFRyYW5zbWl0IFNBNCBCaXQgUmVnICovCisjZGVmaW5lIFhETDEJMHgyQQkvKiBUcmFuc21pdCBETC1CaXQgUmVnIDIgKi8KKyNkZWZpbmUgWFNBNSAgICAweDJCCS8qIFRyYW5zbWl0IFNBNCBCaXQgUmVnICovCisjZGVmaW5lIFhETDIJMHgyQgkvKiBUcmFuc21pdCBETC1CaXQgUmVnIDIgKi8KKyNkZWZpbmUgWFNBNiAgICAweDJDCS8qIFRyYW5zbWl0IFNBNCBCaXQgUmVnICovCisjZGVmaW5lIFhETDMJMHgyQwkvKiBUcmFuc21pdCBETC1CaXQgUmVnIDIgKi8KKyNkZWZpbmUgWFNBNyAgICAweDJECS8qIFRyYW5zbWl0IFNBNCBCaXQgUmVnICovCisjZGVmaW5lIENDQjEJMHgyRAkvKiBDbGVhciBDaGFubmVsIFJlZyAxICovCisjZGVmaW5lIFhTQTggICAgMHgyRQkvKiBUcmFuc21pdCBTQTQgQml0IFJlZyAqLworI2RlZmluZSBDQ0IyCTB4MkUJLyogQ2xlYXIgQ2hhbm5lbCBSZWcgMiAqLworI2RlZmluZSBGTVIzCTB4MkYJLyogRnJhbWVyIE1vZGUgUmVnLiAzICovCisjZGVmaW5lIENDQjMJMHgyRgkvKiBDbGVhciBDaGFubmVsIFJlZyAzICovCisjZGVmaW5lIElDQjEJMHgzMAkvKiBJZGxlIENoYW5uZWwgUmVnIDEgKi8KKyNkZWZpbmUgSUNCMgkweDMxCS8qIElkbGUgQ2hhbm5lbCBSZWcgMiAqLworI2RlZmluZSBJQ0IzCTB4MzIJLyogSWRsZSBDaGFubmVsIFJlZyAzICovCisjZGVmaW5lIElDQjQJMHgzMwkvKiBJZGxlIENoYW5uZWwgUmVnIDQgKi8KKyNkZWZpbmUgTElNMAkweDM0CS8qIExpbmUgSW50ZXJmYWNlIE1vZGUgMCAqLworI2RlZmluZSBMSU0xCTB4MzUJLyogTGluZSBJbnRlcmZhY2UgTW9kZSAxICovCisjZGVmaW5lIFBDRFIJMHgzNgkvKiBQdWxzZSBDb3VudCBEZXRlY3Rpb24gKi8KKyNkZWZpbmUgUENSUgkweDM3CS8qIFB1bHNlIENvdW50IFJlY292ZXJ5ICovCisjZGVmaW5lIExJTTIJMHgzOAkvKiBMaW5lIEludGVyZmFjZSBNb2RlIFJlZyAyICovCisjZGVmaW5lIExDUjEJMHgzOQkvKiBMb29wIENvZGUgUmVnIDEgKi8KKyNkZWZpbmUgTENSMgkweDNBCS8qIExvb3AgQ29kZSBSZWcgMiAqLworI2RlZmluZSBMQ1IzCTB4M0IJLyogTG9vcCBDb2RlIFJlZyAzICovCisjZGVmaW5lIFNJQzEJMHgzQwkvKiBTeXN0ZW0gSW50ZXJmYWNlIENvbnRyb2wgMSAqLworCisvKiBSZWFkLW9ubHkgUmVnaXN0ZXJzIChFMS9UMSBjb250cm9sIG1vZGUgcmVhZCByZWdpc3RlcnMpICovCisjZGVmaW5lIFJGSUZPSAkweDAwCQkvKiBSZWNlaXZlIEZJRk8gKi8KKyNkZWZpbmUgUkZJRk9MCTB4MDEJCS8qIFJlY2VpdmUgRklGTyAqLworI2RlZmluZSBGUlMwCTB4NEMJCS8qIEZyYW1lciBSZWNlaXZlIFN0YXR1cyAwICovCisjZGVmaW5lIEZSUzEJMHg0RAkJLyogRnJhbWVyIFJlY2VpdmUgU3RhdHVzIDEgKi8KKyNkZWZpbmUgUlNXCTB4NEUJCS8qIFJlY2VpdmUgU2VydmljZSBXb3JkICovCisjZGVmaW5lIEZSUzIJMHg0RQkJLyogRnJhbWVyIFJlY2VpdmUgU3RhdHVzIDIgKi8KKyNkZWZpbmUgUlNQCTB4NEYJCS8qIFJlY2VpdmUgU3BhcmUgQml0cyAqLworI2RlZmluZSBGUlMzCTB4NEYJCS8qIEZyYW1lciBSZWNlaXZlIFN0YXR1cyAzICovCisjZGVmaW5lIEZFQ0wJMHg1MAkJLyogRnJhbWluZyBFcnJvciBDb3VudGVyICovCisjZGVmaW5lIEZFQ0gJMHg1MQkJLyogRnJhbWluZyBFcnJvciBDb3VudGVyICovCisjZGVmaW5lIENWQ0wJMHg1MgkJLyogQ29kZSBWaW9sYXRpb24gQ291bnRlciAqLworI2RlZmluZSBDVkNICTB4NTMJCS8qIENvZGUgVmlvbGF0aW9uIENvdW50ZXIgKi8KKyNkZWZpbmUgQ0VDTAkweDU0CQkvKiBDUkMgRXJyb3IgQ291bnRlciAxICovCisjZGVmaW5lIENFQ0gJMHg1NQkJLyogQ1JDIEVycm9yIENvdW50ZXIgMSAqLworI2RlZmluZSBFQkNMCTB4NTYJCS8qIEUtQml0IEVycm9yIENvdW50ZXIgKi8KKyNkZWZpbmUgRUJDSAkweDU3CQkvKiBFLUJpdCBFcnJvciBDb3VudGVyICovCisjZGVmaW5lIEJFQ0wJMHg1OAkJLyogQml0IEVycm9yIENvdW50ZXIgTG93ICovCisjZGVmaW5lIEJFQ0gJMHg1OQkJLyogQml0IEVycm9yIENvdW50ZXIgTG93ICovCisjZGVmaW5lIENFQzMJMHg1QQkJLyogQ1JDIEVycm9yIENvdW50ZXIgMyAoMTYtYml0KSAqLworI2RlZmluZSBSU0E0CTB4NUMJCS8qIFJlY2VpdmUgU0E0IEJpdCBSZWcgKi8KKyNkZWZpbmUgUkRMMQkweDVDCQkvKiBSZWNlaXZlIERMLUJpdCBSZWcgMSAqLworI2RlZmluZSBSU0E1CTB4NUQJCS8qIFJlY2VpdmUgU0E1IEJpdCBSZWcgKi8KKyNkZWZpbmUgUkRMMgkweDVECQkvKiBSZWNlaXZlIERMLUJpdCBSZWcgMiAqLworI2RlZmluZSBSU0E2CTB4NUUJCS8qIFJlY2VpdmUgU0E2IEJpdCBSZWcgKi8KKyNkZWZpbmUgUkRMMwkweDVFCQkvKiBSZWNlaXZlIERMLUJpdCBSZWcgMyAqLworI2RlZmluZSBSU0E3CTB4NUYJCS8qIFJlY2VpdmUgU0E3IEJpdCBSZWcgKi8KKyNkZWZpbmUgUlNBOAkweDYwCQkvKiBSZWNlaXZlIFNBOCBCaXQgUmVnICovCisjZGVmaW5lIFJTQTZTCTB4NjEJCS8qIFJlY2VpdmUgU0E2IEJpdCBTdGF0dXMgUmVnICovCisjZGVmaW5lIFRTUjAJMHg2MgkJLyogTWFudWYuIFRlc3QgUmVnIDAgKi8KKyNkZWZpbmUgVFNSMQkweDYzCQkvKiBNYW51Zi4gVGVzdCBSZWcgMSAqLworI2RlZmluZSBTSVMJMHg2NAkJLyogU2lnbmFsaW5nIFN0YXR1cyBSZWcgKi8KKyNkZWZpbmUgUlNJUwkweDY1CQkvKiBSZWNlaXZlIFNpZ25hbGluZyBTdGF0dXMgUmVnICovCisjZGVmaW5lIFJCQ0wJMHg2NgkJLyogUmVjZWl2ZSBCeXRlIENvbnRyb2wgKi8KKyNkZWZpbmUgUkJDSAkweDY3CQkvKiBSZWNlaXZlIEJ5dGUgQ29udHJvbCAqLworI2RlZmluZSBGSVNSMAkweDY4CQkvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZyAwICovCisjZGVmaW5lIEZJU1IxCTB4NjkJCS8qIEludGVycnVwdCBTdGF0dXMgUmVnIDEgKi8KKyNkZWZpbmUgRklTUjIJMHg2QQkJLyogSW50ZXJydXB0IFN0YXR1cyBSZWcgMiAqLworI2RlZmluZSBGSVNSMwkweDZCCQkvKiBJbnRlcnJ1cHQgU3RhdHVzIFJlZyAzICovCisjZGVmaW5lIEdJUwkweDZFCQkvKiBHbG9iYWwgSW50ZXJydXB0IFN0YXR1cyAqLworI2RlZmluZSBWU1RSCTB4NkYJCS8qIFZlcnNpb24gU3RhdHVzICovCisjZGVmaW5lIFJTKG5icikJKDB4NzAgKyAobmJyKSkJLyogUnggQ0FTIFJlZyAoMCB0byAxNSkgKi8KKworI2VuZGlmCS8qIF9GQUxDX0xIX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3BjMzAwLmggYi9kcml2ZXJzL25ldC93YW4vcGMzMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzQwMWIwZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9wYzMwMC5oCkBAIC0wLDAgKzEsNDk3IEBACisvKgorICogcGMzMDAuaAlDeWNsYWRlcy1QQzMwMCh0bSkgS2VybmVsIEFQSSBEZWZpbml0aW9ucy4KKyAqCisgKiBBdXRob3I6CUl2YW4gUGFzc29zIDxpdmFuQGN5Y2xhZGVzLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQ6CShjKSAxOTk5LTIwMDIgQ3ljbGFkZXMgQ29ycC4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICRMb2c6IHBjMzAwLmgsdiAkCisgKiBSZXZpc2lvbiAzLjEyICAyMDAyLzAzLzA3IDE0OjE3OjA5ICBoZW5yaXF1ZQorICogTGljZW5zZSBkYXRhIGZpeGVkCisgKgorICogUmV2aXNpb24gMy4xMSAgMjAwMi8wMS8yOCAyMTowOTozOSAgZGFuaWVsYQorICogSW5jbHVkZWQgJzsnIGFmdGVyIHBjMzAwaHcuYnVzLgorICoKKyAqIFJldmlzaW9uIDMuMTAgIDIwMDIvMDEvMTcgMTc6NTg6NTIgIGl2YW4KKyAqIFN1cHBvcnQgZm9yIFBDMzAwLVRFL00gKFBNQykuCisgKgorICogUmV2aXNpb24gMy45ICAyMDAxLzA5LzI4IDEzOjMwOjUzICBkYW5pZWxhCisgKiBSZW5hbWVkIGRtYV9zdGFydCByb3V0aW5lIHRvIHJ4X2RtYV9zdGFydC4KKyAqCisgKiBSZXZpc2lvbiAzLjggIDIwMDEvMDkvMjQgMTM6MDM6NDUgIGRhbmllbGEKKyAqIEZpeGVkIEJPRiBpbnRlcnJ1cHQgdHJlYXRtZW50LiBDcmVhdGVkIGRtYV9zdGFydCByb3V0aW5lLgorICoKKyAqIFJldmlzaW9uIDMuNyAgMjAwMS8wOC8xMCAxNzoxOTo1OCAgZGFuaWVsYQorICogRml4ZWQgSU9DVExzIGRlZmluZXMuCisgKgorICogUmV2aXNpb24gMy42ICAyMDAxLzA3LzE4IDE5OjI0OjQyICBkYW5pZWxhCisgKiBJbmNsdWRlZCBrZXJuZWwgdmVyc2lvbi4KKyAqCisgKiBSZXZpc2lvbiAzLjUgIDIwMDEvMDcvMDUgMTg6Mzg6MDggIGRhbmllbGEKKyAqIERNQSB0cmFuc21pc3Npb24gYnVnIGZpeC4KKyAqCisgKiBSZXZpc2lvbiAzLjQgIDIwMDEvMDYvMjYgMTc6MTA6NDAgIGRhbmllbGEKKyAqIE5ldyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKGxpbmUgY29kZSwgQ1JDIGNhbGN1bGF0aW9uIGFuZCBjbG9jaykuCisgKgorICogUmV2aXNpb24gMy4zICAyMDAxLzA2LzIyIDEzOjEzOjAyICByZWdpbmEKKyAqIE1MUFBQIGltcGxlbWVudGF0aW9uCisgKgorICogUmV2aXNpb24gMy4yICAyMDAxLzA2LzE4IDE3OjU2OjA5ICBkYW5pZWxhCisgKiBJbmNyZWFzZWQgREVGX01UVSBhbmQgVFhfUVVFVUVfTEVOLgorICoKKyAqIFJldmlzaW9uIDMuMSAgMjAwMS8wNi8xNSAxMjo0MToxMCAgcmVnaW5hCisgKiB1cHBpbmcgbWFqb3IgdmVyc2lvbiBudW1iZXIKKyAqCisgKiBSZXZpc2lvbiAxLjEuMS4xICAyMDAxLzA2LzEzIDIwOjI1OjA2ICBkYW5pZWxhCisgKiBQQzMwMCBpbml0aWFsIENWUyB2ZXJzaW9uICgzLjQuMC1wcmUxKQorICoKKyAqIFJldmlzaW9uIDIuMyAyMDAxLzAzLzA1IGRhbmllbGEKKyAqIENyZWF0ZWQgc3RydWN0IHBjMzAwY29uZiwgdG8gcHJvdmlkZSB0aGUgaGFyZHdhcmUgaW5mb3JtYXRpb24gdG8gcGMzMDB1dGlsLgorICogSW5jbHVzaW9uIG9mICdhbGxvY19yYW1zaXplJyBmaWVsZCBvbiBzdHJ1Y3R1cmUgJ3BjMzAwaHcnLgorICogCisgKiBSZXZpc2lvbiAyLjIgMjAwMC8xMi8yMiBkYW5pZWxhCisgKiBTdHJ1Y3R1cmVzIGFuZCBkZWZpbmVzIHRvIHN1cHBvcnQgcGMzMDB1dGlsOiBzdGF0aXN0aWNzLCBzdGF0dXMsIAorICogbG9vcGJhY2sgdGVzdHMsIHRyYWNlLgorICogCisgKiBSZXZpc2lvbiAyLjEgMjAwMC8wOS8yOCBpdmFuCisgKiBJbmNsdXNpb24gb2YgJ2lvcGh5cycgYW5kICdpb3NpemUnIGZpZWxkcyBvbiBzdHJ1Y3R1cmUgJ3BjMzAwaHcnLCB0byAKKyAqIGFsbG93IHJlbGVhc2Ugb2YgSS9PIHJlZ2lvbiBhdCBtb2R1bGUgdW5sb2FkLgorICogQ2hhbmdlZCBsb2NhdGlvbiBvZiBpbmNsdWRlIGZpbGVzLgorICoKKyAqIFJldmlzaW9uIDIuMCAyMDAwLzAzLzI3IGl2YW4KKyAqIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBQQzMwMC9URSBjYXJkcy4KKyAqCisgKiBSZXZpc2lvbiAxLjEgMjAwMC8wMS8zMSBpdmFuCisgKiBSZXBsYWNlZCAncGMzMDBbZHJ2fHNjYV0uaCcgZm9ybWVyIFBDMzAwIGRyaXZlciBpbmNsdWRlIGZpbGVzLgorICoKKyAqIFJldmlzaW9uIDEuMCAxOTk5LzEyLzE2IGl2YW4KKyAqIEZpcnN0IG9mZmljaWFsIHJlbGVhc2UuCisgKiBJbmNsdXNpb24gb2YgJ25jaGFuJyBmaWVsZCBvbiBzdHJ1Y3R1cmUgJ3BjMzAwaHcnLCB0byBhbGxvdyB2YXJpYWJsZSAKKyAqIG51bWJlciBvZiBwb3J0cyBwZXIgY2FyZC4KKyAqIEluY2x1c2lvbiBvZiAnaWZfcHRyJyBmaWVsZCBvbiBzdHJ1Y3R1cmUgJ3BjMzAwZGV2Jy4KKyAqCisgKiBSZXZpc2lvbiAwLjYgMTk5OS8xMS8xNyBpdmFuCisgKiBDaGFuZ2VkIFguMjUtc3BlY2lmaWMgZnVuY3Rpb24gbmFtZXMgdG8gY29tcGx5IHdpdGggYWRvcHRlZCBjb252ZW50aW9uLgorICoKKyAqIFJldmlzaW9uIDAuNSAxOTk5LzExLzE2IERhbmllbGEgU3F1YXNzb25pCisgKiBYLjI1IHN1cHBvcnQuCisgKgorICogUmV2aXNpb24gMC40IDE5OTkvMTEvMTUgaXZhbgorICogSW5jbHVzaW9uIG9mICdjbG9jaycgZmllbGQgb24gc3RydWN0dXJlICdwYzMwMGh3Jy4KKyAqCisgKiBSZXZpc2lvbiAwLjMgMTk5OS8xMS8xMCBpdmFuCisgKiBJT0NUTCBuYW1lIGNoYW5naW5nLgorICogSW5jbHVzaW9uIG9mIGRyaXZlciBmdW5jdGlvbiBwcm90b3R5cGVzLgorICoKKyAqIFJldmlzaW9uIDAuMiAxOTk5LzExLzAzIGl2YW4KKyAqIEluY2x1c2lvbiBvZiAndHhfc2tiJyBhbmQgdW5pb24gJ2lmdScgb24gc3RydWN0dXJlICdwYzMwMGRldicuCisgKgorICogUmV2aXNpb24gMC4xIDE5OTkvMDEvMTUgaXZhbgorICogSW5pdGlhbCB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmCV9QQzMwMF9ICisjZGVmaW5lCV9QQzMwMF9ICisKKyNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CisjaW5jbHVkZSAiaGQ2NDU3Mi5oIgorI2luY2x1ZGUgInBjMzAwLWZhbGMtbGguaCIKKworI2lmbmRlZiBDWV9UWVBFUworI2RlZmluZSBDWV9UWVBFUwordHlwZWRlZglfX3U2NAl1Y2RvdWJsZTsJLyogNjQgYml0cywgdW5zaWduZWQgKi8KK3R5cGVkZWYJX191MzIJdWNsb25nOwkJLyogMzIgYml0cywgdW5zaWduZWQgKi8KK3R5cGVkZWYJX191MTYJdWNzaG9ydDsJLyogMTYgYml0cywgdW5zaWduZWQgKi8KK3R5cGVkZWYJX191OAl1Y2NoYXI7CQkvKiA4IGJpdHMsIHVuc2lnbmVkICovCisjZW5kaWYgLyogQ1lfVFlQRVMgKi8KKworI2RlZmluZSBQQzMwMF9QUk9UT19NTFBQUCAxCQkKKworI2RlZmluZSBQQzMwMF9LRVJORUwJIjIuNC54IgkvKiBLZXJuZWwgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyICovCisKKyNkZWZpbmUJUEMzMDBfREVWTkFNRQkiaGRsYyIJLyogRGV2LiBuYW1lIGJhc2UgKGZvciBoZGxjMCwgaGRsYzEsIGV0Yy4pICovCisjZGVmaW5lIFBDMzAwX01BWElOREVYCTEwMAkvKiBNYXggZGV2LiBuYW1lIGluZGV4ICh0aGUgJzAnIGluIGhkbGMwKSAqLworCisjZGVmaW5lCVBDMzAwX01BWENBUkRTCTQJLyogTWF4IG51bWJlciBvZiBjYXJkcyBwZXIgc3lzdGVtICovCisjZGVmaW5lCVBDMzAwX01BWENIQU4JMgkvKiBOdW1iZXIgb2YgY2hhbm5lbHMgcGVyIGNhcmQgKi8KKworI2RlZmluZQlQQzMwMF9QTFhfV0lOCTB4ODAgICAgLyogUExYIGNvbnRyb2wgd2luZG93IHNpemUgKDEyOGIpICovCisjZGVmaW5lCVBDMzAwX1JBTVNJWkUJMHg0MDAwMCAvKiBSQU0gd2luZG93IHNpemUgKDI1NktiKSAqLworI2RlZmluZQlQQzMwMF9TQ0FTSVpFCTB4NDAwICAgLyogU0NBIHdpbmRvdyBzaXplICgxS2IpICovCisjZGVmaW5lCVBDMzAwX0ZBTENTSVpFCTB4NDAwCS8qIEZBTEMgd2luZG93IHNpemUgKDFLYikgKi8KKworI2RlZmluZSBQQzMwMF9PU0NfQ0xPQ0sJMjQ1NzYwMDAKKyNkZWZpbmUgUEMzMDBfUENJX0NMT0NLCTMzMDAwMDAwCisKKyNkZWZpbmUgQkRfREVGX0xFTgkweDA4MDAJLyogRE1BIGJ1ZmZlciBsZW5ndGggKDJLQikgKi8KKyNkZWZpbmUgRE1BX1RYX01FTVNaCTB4ODAwMAkvKiBUb3RhbCBETUEgVHggbWVtb3J5IHNpemUgKDMyS0IvY2gpICovCisjZGVmaW5lIERNQV9SWF9NRU1TWgkweDEwMDAwCS8qIFRvdGFsIERNQSBSeCBtZW1vcnkgc2l6ZSAoNjRLQi9jaCkgKi8KKworI2RlZmluZSBOX0RNQV9UWF9CVUYJKERNQV9UWF9NRU1TWiAvIEJEX0RFRl9MRU4pCS8qIERNQSBUeCBidWZmZXJzICovCisjZGVmaW5lIE5fRE1BX1JYX0JVRgkoRE1BX1JYX01FTVNaIC8gQkRfREVGX0xFTikJLyogRE1BIFJ4IGJ1ZmZlcnMgKi8KKworLyogRE1BIEJ1ZmZlciBPZmZzZXRzICovCisjZGVmaW5lIERNQV9UWF9CQVNFCSgoTl9ETUFfVFhfQlVGICsgTl9ETUFfUlhfQlVGKSAqCVwKKwkJCSBQQzMwMF9NQVhDSEFOICogc2l6ZW9mKHBjc2NhX2JkX3QpKQorI2RlZmluZSBETUFfUlhfQkFTRQkoRE1BX1RYX0JBU0UgKyBQQzMwMF9NQVhDSEFOKkRNQV9UWF9NRU1TWikKKworLyogRE1BIERlc2NyaXB0b3IgT2Zmc2V0cyAqLworI2RlZmluZSBETUFfVFhfQkRfQkFTRQkweDAwMDAKKyNkZWZpbmUgRE1BX1JYX0JEX0JBU0UJKERNQV9UWF9CRF9CQVNFICsgKChQQzMwMF9NQVhDSEFOKkRNQV9UWF9NRU1TWiAvIFwKKwkJCQlCRF9ERUZfTEVOKSAqIHNpemVvZihwY3NjYV9iZF90KSkpCisKKy8qIERNQSBEZXNjcmlwdG9yIE1hY3JvcyAqLworI2RlZmluZSBUWF9CRF9BRERSKGNoYW4sIG4pCShETUFfVFhfQkRfQkFTRSArIFwKKwkJCQkgKChOX0RNQV9UWF9CVUYqY2hhbikgKyBuKSAqIHNpemVvZihwY3NjYV9iZF90KSkKKyNkZWZpbmUgUlhfQkRfQUREUihjaGFuLCBuKQkoRE1BX1JYX0JEX0JBU0UgKyBcCisJCQkJICgoTl9ETUFfUlhfQlVGKmNoYW4pICsgbikgKiBzaXplb2YocGNzY2FfYmRfdCkpCisKKy8qIE1hY3JvIHRvIGFjY2VzcyB0aGUgRkFMQyByZWdpc3RlcnMgKFRFIG9ubHkpICovCisjZGVmaW5lIEZfUkVHKHJlZywgY2hhbikJKDB4MjAwKihjaGFuKSArICgocmVnKTw8MikpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1lbW9yeSBhY2Nlc3MgZnVuY3Rpb25zL21hY3JvcyAgICAgICoKKyAqIChyZXF1aXJlZCB0byBzdXBwb3J0IEFscGhhIHN5c3RlbXMpICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19LRVJORUxfXworI2RlZmluZSBjcGNfd3JpdGViKHBvcnQsdmFsKQl7d3JpdGViKCh1Y2NoYXIpKHZhbCksKHBvcnQpKTsgbWIoKTt9CisjZGVmaW5lIGNwY193cml0ZXcocG9ydCx2YWwpCXt3cml0ZXcoKHVzaG9ydCkodmFsKSwocG9ydCkpOyBtYigpO30KKyNkZWZpbmUgY3BjX3dyaXRlbChwb3J0LHZhbCkJe3dyaXRlbCgodWNsb25nKSh2YWwpLChwb3J0KSk7IG1iKCk7fQorCisjZGVmaW5lIGNwY19yZWFkYihwb3J0KQkJcmVhZGIocG9ydCkKKyNkZWZpbmUgY3BjX3JlYWR3KHBvcnQpCQlyZWFkdyhwb3J0KQorI2RlZmluZSBjcGNfcmVhZGwocG9ydCkJCXJlYWRsKHBvcnQpCisKKyNlbHNlIC8qIF9fS0VSTkVMX18gKi8KKyNkZWZpbmUgY3BjX3dyaXRlYihwb3J0LHZhbCkJKCoodm9sYXRpbGUgdWNjaGFyICopKHBvcnQpID0gKHVjY2hhcikodmFsKSkKKyNkZWZpbmUgY3BjX3dyaXRldyhwb3J0LHZhbCkJKCoodm9sYXRpbGUgdWNzaG9ydCAqKShwb3J0KSA9ICh1Y3Nob3J0KSh2YWwpKQorI2RlZmluZSBjcGNfd3JpdGVsKHBvcnQsdmFsKQkoKih2b2xhdGlsZSB1Y2xvbmcgKikocG9ydCkgPSAodWNsb25nKSh2YWwpKQorCisjZGVmaW5lIGNwY19yZWFkYihwb3J0KQkJKCoodm9sYXRpbGUgdWNjaGFyICopKHBvcnQpKQorI2RlZmluZSBjcGNfcmVhZHcocG9ydCkJCSgqKHZvbGF0aWxlIHVjc2hvcnQgKikocG9ydCkpCisjZGVmaW5lIGNwY19yZWFkbChwb3J0KQkJKCoodm9sYXRpbGUgdWNsb25nICopKHBvcnQpKQorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisvKioqKioqIERhdGEgU3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICAgICAgUlVOVElNRV85MDUwIC0gUExYIFBDSTkwNTAtMSBsb2NhbCBjb25maWd1cmF0aW9uIGFuZCBzaGFyZWQgcnVudGltZQorICogICAgICByZWdpc3RlcnMuIFRoaXMgc3RydWN0dXJlIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgOTA1MCByZWdpc3RlcnMKKyAqICAgICAgKG1lbW9yeSBtYXBwZWQpLgorICovCitzdHJ1Y3QgUlVOVElNRV85MDUwIHsKKwl1Y2xvbmcJbG9jX2FkZHJfcmFuZ2VbNF07CS8qIDAwLTBDaCA6IExvY2FsIEFkZHJlc3MgUmFuZ2VzICovCisJdWNsb25nCWxvY19yb21fcmFuZ2U7CQkvKiAxMGggOiBMb2NhbCBST00gUmFuZ2UgKi8KKwl1Y2xvbmcJbG9jX2FkZHJfYmFzZVs0XTsJLyogMTQtMjBoIDogTG9jYWwgQWRkcmVzcyBCYXNlIEFkZHJzICovCisJdWNsb25nCWxvY19yb21fYmFzZTsJCS8qIDI0aCA6IExvY2FsIFJPTSBCYXNlICovCisJdWNsb25nCWxvY19idXNfZGVzY3JbNF07CS8qIDI4LTM0aCA6IExvY2FsIEJ1cyBEZXNjcmlwdG9ycyAqLworCXVjbG9uZwlyb21fYnVzX2Rlc2NyOwkJLyogMzhoIDogUk9NIEJ1cyBEZXNjcmlwdG9yICovCisJdWNsb25nCWNzX2Jhc2VbNF07CQkvKiAzQy00OGggOiBDaGlwIFNlbGVjdCBCYXNlIEFkZHJzICovCisJdWNsb25nCWludHJfY3RybF9zdGF0OwkJLyogNENoIDogSW50ZXJydXB0IENvbnRyb2wvU3RhdHVzICovCisJdWNsb25nCWluaXRfY3RybDsJCS8qIDUwaCA6IEVFUFJPTSBjdHJsLCBJbml0IEN0cmwsIGV0YyAqLworfTsKKworI2RlZmluZSBQTFhfOTA1MF9MSU5UMV9FTkFCTEUJMHgwMQorI2RlZmluZSBQTFhfOTA1MF9MSU5UMV9QT0wJMHgwMgorI2RlZmluZSBQTFhfOTA1MF9MSU5UMV9TVEFUVVMJMHgwNAorI2RlZmluZSBQTFhfOTA1MF9MSU5UMl9FTkFCTEUJMHgwOAorI2RlZmluZSBQTFhfOTA1MF9MSU5UMl9QT0wJMHgxMAorI2RlZmluZSBQTFhfOTA1MF9MSU5UMl9TVEFUVVMJMHgyMAorI2RlZmluZSBQTFhfOTA1MF9JTlRSX0VOQUJMRQkweDQwCisjZGVmaW5lIFBMWF85MDUwX1NXX0lOVFIJMHg4MAorCisvKiBNYXNrcyB0byBhY2Nlc3MgdGhlIGluaXRfY3RybCBQTFggcmVnaXN0ZXIgKi8KKyNkZWZpbmUJUEMzMDBfQ0xLU0VMX01BU0sJCSgweDAwMDAwMDA0VUwpCisjZGVmaW5lCVBDMzAwX0NITUVESUFfTUFTSyhjaGFuKQkoMHgwMDAwMDAyMFVMPDwoY2hhbiozKSkKKyNkZWZpbmUJUEMzMDBfQ1RZUEVfTUFTSwkJKDB4MDAwMDA4MDBVTCkKKworLyogQ1BMRCBSZWdpc3RlcnMgKGJhc2UgYWRkciA9IGZhbGNiYXNlLCBURSBvbmx5KSAqLworLyogQ1BMRCB2LiAwICovCisjZGVmaW5lIENQTERfUkVHMQkweDE0MAkvKiBDaGlwIHJlc2V0cywgRENEL0NUUyBzdGF0dXMgKi8KKyNkZWZpbmUgQ1BMRF9SRUcyCTB4MTQ0CS8qIENsb2NrIGVuYWJsZSAsIExFRCBjb250cm9sICovCisvKiBDUExEIHYuIDIgb3IgaGlnaGVyICovCisjZGVmaW5lIENQTERfVjJfUkVHMQkweDEwMAkvKiBDaGlwIHJlc2V0cywgRENEL0NUUyBzdGF0dXMgKi8KKyNkZWZpbmUgQ1BMRF9WMl9SRUcyCTB4MTA0CS8qIENsb2NrIGVuYWJsZSAsIExFRCBjb250cm9sICovCisjZGVmaW5lIENQTERfSURfUkVHCTB4MTA4CS8qIENQTEQgdmVyc2lvbiAqLworCisvKiBDUExEIFJlZ2lzdGVyIGJpdCBkZXNjcmlwdGlvbjogZm9yIHRoZSBGQUxDIGJpdHMsIHRoZXkgc2hvdWxkIGFsd2F5cyBiZSAKKyAgIHNldCBiYXNlZCBvbiB0aGUgY2hhbm5lbCAodXNlIChiaXQ8PCgyKmNoKSkgdG8gYWNjZXNzIHRoZSBjb3JyZWN0IGJpdCBmb3IgCisgICB0aGF0IGNoYW5uZWwpICovCisjZGVmaW5lIENQTERfUkVHMV9GQUxDX1JFU0VUCTB4MDEKKyNkZWZpbmUgQ1BMRF9SRUcxX1NDQV9SRVNFVAkweDAyCisjZGVmaW5lIENQTERfUkVHMV9HTE9CQUxfQ0xLCTB4MDgKKyNkZWZpbmUgQ1BMRF9SRUcxX0ZBTENfRENECTB4MTAKKyNkZWZpbmUgQ1BMRF9SRUcxX0ZBTENfQ1RTCTB4MjAKKworI2RlZmluZSBDUExEX1JFRzJfRkFMQ19UWF9DTEsJMHgwMQorI2RlZmluZSBDUExEX1JFRzJfRkFMQ19SWF9DTEsJMHgwMgorI2RlZmluZSBDUExEX1JFRzJfRkFMQ19MRUQxCTB4MTAKKyNkZWZpbmUgQ1BMRF9SRUcyX0ZBTENfTEVEMgkweDIwCisKKy8qIFN0cnVjdHVyZSB3aXRoIEZBTEMtcmVsYXRlZCBmaWVsZHMgKFRFIG9ubHkpICovCisjZGVmaW5lIFBDMzAwX0ZBTENfTUFYTE9PUAkweDAwMDBmZmZmCS8qIGZvciBmYWxjX2lzc3VlX2NtZCgpICovCisKK3R5cGVkZWYgc3RydWN0IGZhbGMgeworCXVjY2hhciBzeW5jOwkJLyogSWYgdHJ1ZSBGQUxDIGlzIHN5bmNocm9uaXplZCAqLworCXVjY2hhciBhY3RpdmU7CQkvKiBpZiBUUlVFIHRoZW4gYWxyZWFkeSBhY3RpdmUgKi8KKwl1Y2NoYXIgbG9vcF9hY3RpdmU7CS8qIGlmIFRSVUUgYSBsaW5lIGxvb3BiYWNrIFVQIHdhcyByZWNlaXZlZCAqLworCXVjY2hhciBsb29wX2dlbjsJLyogaWYgVFJVRSBhIGxpbmUgbG9vcGJhY2sgVVAgd2FzIGlzc3VlZCAqLworCisJdWNjaGFyIG51bV9jaGFubmVsczsKKwl1Y2NoYXIgb2Zmc2V0OwkJLyogMSBmb3IgVDEsIDAgZm9yIEUxICovCisJdWNjaGFyIGZ1bGxfYmFuZHdpZHRoOworCisJdWNjaGFyIHhtYl9jYXVzZTsKKwl1Y2NoYXIgbXVsdGlmcmFtZV9tb2RlOworCisJLyogU3RhdGlzdGljcyAqLworCXVjc2hvcnQgcGRlbjsJLyogUHVsc2UgRGVuc2l0eSB2aW9sYXRpb24gY291bnQgKi8KKwl1Y3Nob3J0IGxvczsJLyogTG9zcyBvZiBTaWduYWwgY291bnQgKi8KKwl1Y3Nob3J0IGxvc3I7CS8qIExvc3Mgb2YgU2lnbmFsIHJlY292ZXJ5IGNvdW50ICovCisJdWNzaG9ydCBsZmE7CS8qIExvc3Mgb2YgZnJhbWUgYWxpZ25tZW50IGNvdW50ICovCisJdWNzaG9ydCBmYXJlYzsJLyogRnJhbWUgQWxpZ25tZW50IFJlY292ZXJ5IGNvdW50ICovCisJdWNzaG9ydCBsbWZhOwkvKiBMb3NzIG9mIG11bHRpZnJhbWUgYWxpZ25tZW50IGNvdW50ICovCisJdWNzaG9ydCBhaXM7CS8qIFJlbW90ZSBBbGFybSBpbmRpY2F0aW9uIFNpZ25hbCBjb3VudCAqLworCXVjc2hvcnQgc2VjOwkvKiBPbmUtc2Vjb25kIHRpbWVyICovCisJdWNzaG9ydCBlczsJLyogRXJyb3JlZCBzZWNvbmQgKi8KKwl1Y3Nob3J0IHJhaTsJLyogcmVtb3RlIGFsYXJtIHJlY2VpdmVkICovCisJdWNzaG9ydCBiZWM7CisJdWNzaG9ydCBmZWM7CisJdWNzaG9ydCBjdmM7CisJdWNzaG9ydCBjZWM7CisJdWNzaG9ydCBlYmM7CisKKwkvKiBTdGF0dXMgKi8KKwl1Y2NoYXIgcmVkX2FsYXJtOworCXVjY2hhciBibHVlX2FsYXJtOworCXVjY2hhciBsb3NzX2ZhOworCXVjY2hhciB5ZWxsb3dfYWxhcm07CisJdWNjaGFyIGxvc3NfbWZhOworCXVjY2hhciBwcmJzOworfSBmYWxjX3Q7CisKK3R5cGVkZWYgc3RydWN0IGZhbGNfc3RhdHVzIHsKKwl1Y2NoYXIgc3luYzsgIC8qIElmIHRydWUgRkFMQyBpcyBzeW5jaHJvbml6ZWQgKi8KKwl1Y2NoYXIgcmVkX2FsYXJtOworCXVjY2hhciBibHVlX2FsYXJtOworCXVjY2hhciBsb3NzX2ZhOworCXVjY2hhciB5ZWxsb3dfYWxhcm07CisJdWNjaGFyIGxvc3NfbWZhOworCXVjY2hhciBwcmJzOworfSBmYWxjX3N0YXR1c190OworCit0eXBlZGVmIHN0cnVjdCByc3ZfeDIxX3N0YXR1cyB7CisJdWNjaGFyIGRjZDsKKwl1Y2NoYXIgZHNyOworCXVjY2hhciBjdHM7CisJdWNjaGFyIHJ0czsKKwl1Y2NoYXIgZHRyOworfSByc3ZfeDIxX3N0YXR1c190OworCit0eXBlZGVmIHN0cnVjdCBwYzMwMHN0YXRzIHsKKwlpbnQgaHdfdHlwZTsKKwl1Y2xvbmcgbGluZV9vbjsKKwl1Y2xvbmcgbGluZV9vZmY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgZ2VuX3N0YXRzOworCWZhbGNfdCB0ZV9zdGF0czsKK30gcGMzMDBzdGF0c190OworCit0eXBlZGVmIHN0cnVjdCBwYzMwMHN0YXR1cyB7CisJaW50IGh3X3R5cGU7CisJcnN2X3gyMV9zdGF0dXNfdCBnZW5fc3RhdHVzOworCWZhbGNfc3RhdHVzX3QgdGVfc3RhdHVzOworfSBwYzMwMHN0YXR1c190OworCit0eXBlZGVmIHN0cnVjdCBwYzMwMGxvb3BiYWNrIHsKKwljaGFyIGxvb3BfdHlwZTsKKwljaGFyIGxvb3Bfb247Cit9IHBjMzAwbG9vcGJhY2tfdDsKKwordHlwZWRlZiBzdHJ1Y3QgcGMzMDBwYXR0ZXJudHN0IHsKKwljaGFyIHBhdHJudHN0X29uOyAgICAgICAvKiAwIC0gb2ZmOyAxIC0gb247IDIgLSByZWFkIG51bV9lcnJvcnMgKi8KKwl1Y3Nob3J0IG51bV9lcnJvcnM7Cit9IHBjMzAwcGF0dGVybnRzdF90OworCit0eXBlZGVmIHN0cnVjdCBwYzMwMGRldiB7CisJdm9pZCAqaWZfcHRyOwkJLyogR2VuZXJhbCBwdXJwb3NlIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgcGMzMDBjaCAqY2hhbjsKKwl1Y2NoYXIgdHJhY2Vfb247CisJdWNsb25nIGxpbmVfb247CQkvKiBEQ0QoWC4yMSwgUlNWKSAvIHN5bmMoVEUpIGNoYW5nZSBjb3VudGVycyAqLworCXVjbG9uZyBsaW5lX29mZjsKKyNpZmRlZiBfX0tFUk5FTF9fCisJY2hhciBuYW1lWzE2XTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJdm9pZCAqcHJpdmF0ZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOworCXVuaW9uIHsJLyogVGhpcyB1bmlvbiBoYXMgYWxsIHRoZSBwcm90b2NvbC1zcGVjaWZpYyBzdHJ1Y3R1cmVzICovCisJCXN0cnVjdCBwcHBfZGV2aWNlIHBwcGRldjsKKwl9aWZ1OworI2lmZGVmIENPTkZJR19QQzMwMF9NTFBQUAorCXZvaWQgKmNwY190dHk7CS8qIGluZm9ybWF0aW9uIHRvIFBDMzAwIFRUWSBkcml2ZXIgKi8KKyNlbmRpZgorI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KK31wYzMwMGRldl90OworCit0eXBlZGVmIHN0cnVjdCBwYzMwMGh3IHsKKwlpbnQgdHlwZTsJCS8qIFJTViwgWDIxLCBldGMuICovCisJaW50IGJ1czsJCS8qIEJ1cyAoUENJLCBQTUMsIGV0Yy4pICovCisJaW50IG5jaGFuOwkJLyogbnVtYmVyIG9mIGNoYW5uZWxzICovCisJaW50IGlycTsJCS8qIGludGVycnVwdCByZXF1ZXN0IGxldmVsICovCisJdWNsb25nIGNsb2NrOwkJLyogQm9hcmQgY2xvY2sgKi8KKwl1Y2NoYXIgY3BsZF9pZDsJCS8qIENQTEQgSUQgKFRFIG9ubHkpICovCisJdWNzaG9ydCBjcGxkX3JlZzE7CS8qIENQTEQgcmVnIDEgKFRFIG9ubHkpICovCisJdWNzaG9ydCBjcGxkX3JlZzI7CS8qIENQTEQgcmVnIDIgKFRFIG9ubHkpICovCisJdWNzaG9ydCBncGlvY19yZWc7CS8qIFBMWCBHUElPQyByZWcgKi8KKwl1Y3Nob3J0IGludGN0bF9yZWc7CS8qIFBMWCBJbnQgQ3RybC9TdGF0dXMgcmVnICovCisJdWNsb25nIGlvcGh5czsJCS8qIFBMWCByZWdpc3RlcnMgSS9PIGJhc2UgKi8KKwl1Y2xvbmcgaW9zaXplOwkJLyogUExYIHJlZ2lzdGVycyBJL08gc2l6ZSAqLworCXVjbG9uZyBwbHhwaHlzOwkJLyogUExYIHJlZ2lzdGVycyBNTUlPIGJhc2UgKHBoeXNpY2FsKSAqLworCXZvaWQgX19pb21lbSAqIHBseGJhc2U7CS8qIFBMWCByZWdpc3RlcnMgTU1JTyBiYXNlICh2aXJ0dWFsKSAqLworCXVjbG9uZyBwbHhzaXplOwkJLyogUExYIHJlZ2lzdGVycyBNTUlPIHNpemUgKi8KKwl1Y2xvbmcgc2NhcGh5czsJCS8qIFNDQSByZWdpc3RlcnMgTU1JTyBiYXNlIChwaHlzaWNhbCkgKi8KKwl2b2lkIF9faW9tZW0gKiBzY2FiYXNlOwkvKiBTQ0EgcmVnaXN0ZXJzIE1NSU8gYmFzZSAodmlydHVhbCkgKi8KKwl1Y2xvbmcgc2Nhc2l6ZTsJCS8qIFNDQSByZWdpc3RlcnMgTU1JTyBzaXplICovCisJdWNsb25nIHJhbXBoeXM7CQkvKiBPbi1ib2FyZCBSQU0gTU1JTyBiYXNlIChwaHlzaWNhbCkgKi8KKwl2b2lkIF9faW9tZW0gKiByYW1iYXNlOwkvKiBPbi1ib2FyZCBSQU0gTU1JTyBiYXNlICh2aXJ0dWFsKSAqLworCXVjbG9uZyBhbGxvY19yYW1zaXplOwkvKiBSQU0gTU1JTyBzaXplIGFsbG9jYXRlZCBieSB0aGUgUENJIGJyaWRnZSAqLworCXVjbG9uZyByYW1zaXplOwkJLyogT24tYm9hcmQgUkFNIE1NSU8gc2l6ZSAqLworCXVjbG9uZyBmYWxjcGh5czsJLyogRkFMQyByZWdpc3RlcnMgTU1JTyBiYXNlIChwaHlzaWNhbCkgKi8KKwl2b2lkIF9faW9tZW0gKiBmYWxjYmFzZTsvKiBGQUxDIHJlZ2lzdGVycyBNTUlPIGJhc2UgKHZpcnR1YWwpICovCisJdWNsb25nIGZhbGNzaXplOwkvKiBGQUxDIHJlZ2lzdGVycyBNTUlPIHNpemUgKi8KK30gcGMzMDBod190OworCit0eXBlZGVmIHN0cnVjdCBwYzMwMGNoY29uZiB7CisJc3luY19zZXJpYWxfc2V0dGluZ3MJcGh5c19zZXR0aW5nczsJLyogQ2xvY2sgdHlwZS9yYXRlIChpbiBicHMpLCAKKwkJCQkJCSAgIGxvb3BiYWNrIG1vZGUgKi8KKwlyYXdfaGRsY19wcm90bwkJcHJvdG9fc2V0dGluZ3M7CS8qIEVuY29kaW5nLCBwYXJpdHkgKENSQykgKi8KKwl1Y2xvbmcgbWVkaWE7CQkvKiBIVyBtZWRpYSAoUlMyMzIsIFYuMzUsIGV0Yy4pICovCisJdWNsb25nIHByb3RvOwkJLyogUHJvdG9jb2wgKFBQUCwgWC4yNSwgZXRjLikgKi8KKwl1Y2NoYXIgbW9uaXRvcjsJCS8qIE1vbml0b3IgbW9kZSAoMCA9IG9mZiwgITAgPSBvbikgKi8KKworCS8qIFRFLXNwZWNpZmljIHBhcmFtZXRlcnMgKi8KKwl1Y2NoYXIgbGNvZGU7CQkvKiBMaW5lIENvZGUgKEFNSSwgQjhaUywgZXRjLikgKi8KKwl1Y2NoYXIgZnJfbW9kZTsJCS8qIEZyYW1lIE1vZGUgKEVTRiwgRDQsIGV0Yy4pICovCisJdWNjaGFyIGxibzsJCS8qIExpbmUgQnVpbGQgT3V0ICovCisJdWNjaGFyIHJ4X3NlbnM7CQkvKiBSeCBTZW5zaXRpdml0eSAobG9uZy0gb3Igc2hvcnQtaGF1bCkgKi8KKwl1Y2xvbmcgdHNsb3RfYml0bWFwOwkvKiBiaXRbaV09MSAgPT4gIHRpbWVzbG90IF9pXyBpcyBhY3RpdmUgKi8KK30gcGMzMDBjaGNvbmZfdDsKKwordHlwZWRlZiBzdHJ1Y3QgcGMzMDBjaCB7CisJc3RydWN0IHBjMzAwICpjYXJkOworCWludCBjaGFubmVsOworCXBjMzAwZGV2X3QgZDsKKwlwYzMwMGNoY29uZl90IGNvbmY7CisJdWNjaGFyIHR4X2ZpcnN0X2JkOwkvKiBGaXJzdCBUWCBETUEgYmxvY2sgZGVzY3IuIHcvIGRhdGEgKi8KKwl1Y2NoYXIgdHhfbmV4dF9iZDsJLyogTmV4dCBmcmVlIFRYIERNQSBibG9jayBkZXNjcmlwdG9yICovCisJdWNjaGFyIHJ4X2ZpcnN0X2JkOwkvKiBGaXJzdCBmcmVlIFJYIERNQSBibG9jayBkZXNjcmlwdG9yICovCisJdWNjaGFyIHJ4X2xhc3RfYmQ7CS8qIExhc3QgZnJlZSBSWCBETUEgYmxvY2sgZGVzY3JpcHRvciAqLworCXVjY2hhciBuZnJlZV90eF9iZDsJLyogTnVtYmVyIG9mIGZyZWUgVFggRE1BIGJsb2NrIGRlc2NyaXB0b3JzICovCisJZmFsY190IGZhbGM7CQkvKiBGQUxDIHN0cnVjdHVyZSAoVEUgb25seSkgKi8KK30gcGMzMDBjaF90OworCit0eXBlZGVmIHN0cnVjdCBwYzMwMCB7CisJcGMzMDBod190IGh3OwkJCS8qIGhhcmR3YXJlIGNvbmZpZy4gKi8KKwlwYzMwMGNoX3QgY2hhbltQQzMwMF9NQVhDSEFOXTsKKyNpZmRlZiBfX0tFUk5FTF9fCisJc3BpbmxvY2tfdCBjYXJkX2xvY2s7CisjZW5kaWYgLyogX19LRVJORUxfXyAqLworfSBwYzMwMF90OworCit0eXBlZGVmIHN0cnVjdCBwYzMwMGNvbmYgeworCXBjMzAwaHdfdCBodzsKKwlwYzMwMGNoY29uZl90IGNvbmY7Cit9IHBjMzAwY29uZl90OworCisvKiBERVYgaW9jdGwoKSBjb21tYW5kcyAqLworI2RlZmluZQlOX1NQUFBfSU9DVExTCTIKKworZW51bSBwYzMwMF9pb2N0bF9jbWRzIHsKKwlTSU9DQ1BDUkVTRVJWRUQgPSAoU0lPQ0RFVlBSSVZBVEUgKyBOX1NQUFBfSU9DVExTKSwKKwlTSU9DR1BDMzAwQ09ORiwKKwlTSU9DU1BDMzAwQ09ORiwKKwlTSU9DR1BDMzAwU1RBVFVTLAorCVNJT0NHUEMzMDBGQUxDU1RBVFVTLAorCVNJT0NHUEMzMDBVVElMU1RBVFMsCisJU0lPQ0dQQzMwMFVUSUxTVEFUVVMsCisJU0lPQ1NQQzMwMFRSQUNFLAorCVNJT0NTUEMzMDBMT09QQkFDSywKKwlTSU9DU1BDMzAwUEFUVEVSTlRFU1QsCit9OworCisvKiBMb29wYmFjayB0eXBlcyAtIFBDMzAwL1RFIGJvYXJkcyAqLworZW51bSBwYzMwMF9sb29wYmFja19jbWRzIHsKKwlQQzMwMExPQ0xPT1AgPSAxLAorCVBDMzAwUkVNTE9PUCwKKwlQQzMwMFBBWUxPQURMT09QLAorCVBDMzAwR0VOTE9PUFVQLAorCVBDMzAwR0VOTE9PUERPV04sCit9OworCisvKiBDb250cm9sIENvbnN0YW50IERlZmluaXRpb25zICovCisjZGVmaW5lCVBDMzAwX1JTVgkweDAxCisjZGVmaW5lCVBDMzAwX1gyMQkweDAyCisjZGVmaW5lCVBDMzAwX1RFCTB4MDMKKworI2RlZmluZQlQQzMwMF9QQ0kJMHgwMAorI2RlZmluZQlQQzMwMF9QTUMJMHgwMQorCisjZGVmaW5lIFBDMzAwX0xDX0FNSQkweDAxCisjZGVmaW5lIFBDMzAwX0xDX0I4WlMJMHgwMgorI2RlZmluZSBQQzMwMF9MQ19OUloJMHgwMworI2RlZmluZSBQQzMwMF9MQ19IREIzCTB4MDQKKworLyogRnJhbWluZyAoVDEpICovCisjZGVmaW5lIFBDMzAwX0ZSX0VTRgkJMHgwMQorI2RlZmluZSBQQzMwMF9GUl9ENAkJMHgwMgorI2RlZmluZSBQQzMwMF9GUl9FU0ZfSkFQQU4JMHgwMworCisvKiBGcmFtaW5nIChFMSkgKi8KKyNkZWZpbmUgUEMzMDBfRlJfTUZfQ1JDNAkweDA0CisjZGVmaW5lIFBDMzAwX0ZSX01GX05PTl9DUkM0CTB4MDUKKyNkZWZpbmUgUEMzMDBfRlJfVU5GUkFNRUQJMHgwNgorCisjZGVmaW5lIFBDMzAwX0xCT18wX0RCCQkweDAwCisjZGVmaW5lIFBDMzAwX0xCT183XzVfREIJMHgwMQorI2RlZmluZSBQQzMwMF9MQk9fMTVfREIJCTB4MDIKKyNkZWZpbmUgUEMzMDBfTEJPXzIyXzVfREIJMHgwMworCisjZGVmaW5lIFBDMzAwX1JYX1NFTlNfU0gJMHgwMQorI2RlZmluZSBQQzMwMF9SWF9TRU5TX0xICTB4MDIKKworI2RlZmluZSBQQzMwMF9UWF9USU1FT1VUCSgyKkhaKQorI2RlZmluZSBQQzMwMF9UWF9RVUVVRV9MRU4JMTAwCisjZGVmaW5lCVBDMzAwX0RFRl9NVFUJCTE2MDAKKworI2lmZGVmIF9fS0VSTkVMX18KKy8qIEZ1bmN0aW9uIFByb3RvdHlwZXMgKi8KK2ludCBkbWFfYnVmX3dyaXRlKHBjMzAwX3QgKiwgaW50LCB1Y2NoYXIgKiwgaW50KTsKK2ludCBkbWFfYnVmX3JlYWQocGMzMDBfdCAqLCBpbnQsIHN0cnVjdCBza19idWZmICopOwordm9pZCB0eF9kbWFfc3RhcnQocGMzMDBfdCAqLCBpbnQpOwordm9pZCByeF9kbWFfc3RhcnQocGMzMDBfdCAqLCBpbnQpOwordm9pZCB0eF9kbWFfc3RvcChwYzMwMF90ICosIGludCk7Cit2b2lkIHJ4X2RtYV9zdG9wKHBjMzAwX3QgKiwgaW50KTsKK2ludCBjcGNfcXVldWVfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3ZvaWQgY3BjX25ldF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3ZvaWQgY3BjX3NjYV9zdGF0dXMocGMzMDBfdCAqLCBpbnQpOworaW50IGNwY19jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICosIGludCk7CitpbnQgY3BjX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBpZnJlcSAqLCBpbnQpOworaW50IGNoX2NvbmZpZyhwYzMwMGRldl90ICopOworaW50IHJ4X2NvbmZpZyhwYzMwMGRldl90ICopOworaW50IHR4X2NvbmZpZyhwYzMwMGRldl90ICopOwordm9pZCBjcGNfb3BlbmNoKHBjMzAwZGV2X3QgKik7Cit2b2lkIGNwY19jbG9zZWNoKHBjMzAwZGV2X3QgKik7CitpbnQgY3BjX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgY3BjX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IGNwY19zZXRfbWVkaWEoaGRsY19kZXZpY2UgKiwgaW50KTsKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgkvKiBfUEMzMDBfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vcGMzMDBfZHJ2LmMgYi9kcml2ZXJzL25ldC93YW4vcGMzMDBfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY3YmUyNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF9kcnYuYwpAQCAtMCwwICsxLDM2OTIgQEAKKyNkZWZpbmUJVVNFX1BDSV9DTE9DSworc3RhdGljIGNoYXIgcmNzaWRbXSA9IAorIlJldmlzaW9uOiAzLjQuNSBEYXRlOiAyMDAyLzAzLzA3ICI7CisKKy8qCisgKiBwYzMwMC5jCUN5Y2xhZGVzLVBDMzAwKHRtKSBEcml2ZXIuCisgKgorICogQXV0aG9yOglJdmFuIFBhc3NvcyA8aXZhbkBjeWNsYWRlcy5jb20+CisgKiBNYWludGFpbmVyOglQQzMwMCBNYWludGFpbmVyIDxwYzMwMEBjeWNsYWRlcy5jb20+CisgKgorICogQ29weXJpZ2h0OgkoYykgMTk5OS0yMDAzIEN5Y2xhZGVzIENvcnAuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCQorICoJVXNpbmcgdGFic3RvcCA9IDQuCisgKiAKKyAqICRMb2c6IHBjMzAwX2Rydi5jLHYgJAorICogUmV2aXNpb24gMy4yMyAgMjAwMi8wMy8yMCAxMzo1ODo0MCAgaGVucmlxdWUKKyAqIEZpeGVkIG9ydG9ncmFwaGljIG1pc3Rha2VzCisgKgorICogUmV2aXNpb24gMy4yMiAgMjAwMi8wMy8xMyAxNjo1Njo1NiAgaGVucmlxdWUKKyAqIFRha2Ugb3V0IHRoZSBkZWJ1ZyBtZXNzYWdlcworICoKKyAqIFJldmlzaW9uIDMuMjEgIDIwMDIvMDMvMDcgMTQ6MTc6MDkgIGhlbnJpcXVlCisgKiBMaWNlbnNlIGRhdGEgZml4ZWQKKyAqCisgKiBSZXZpc2lvbiAzLjIwICAyMDAyLzAxLzE3IDE3OjU4OjUyICBpdmFuCisgKiBTdXBwb3J0IGZvciBQQzMwMC1URS9NIChQTUMpLgorICoKKyAqIFJldmlzaW9uIDMuMTkgIDIwMDIvMDEvMDMgMTc6MDg6NDcgIGRhbmllbGEKKyAqIEVuYWJsZXMgRE1BIHJlY2VwdGlvbiB3aGVuIHRoZSBTQ0EtSUkgZGlzYWJsZXMgaXQgaW1wcm9wZXJseS4KKyAqCisgKiBSZXZpc2lvbiAzLjE4ICAyMDAxLzEyLzAzIDE4OjQ3OjUwICBkYW5pZWxhCisgKiBFc3RoZXRpYyBjaGFuZ2VzLgorICoKKyAqIFJldmlzaW9uIDMuMTcgIDIwMDEvMTAvMTkgMTY6NTA6MTMgIGhlbnJpcXVlCisgKiBQYXRjaCB0byBrZXJuZWwgMi40LjEyIGFuZCBuZXcgZ2VuZXJpYyBoZGxjLgorICoKKyAqIFJldmlzaW9uIDMuMTYgIDIwMDEvMTAvMTYgMTU6MTI6MzEgIHJlZ2luYQorICogY2xlYXIgc3RhdGlzdGljcworICoKKyAqIFJldmlzaW9uIDMuMTEgdG8gMy4xNSAgMjAwMS8xMC8xMSAyMDoyNjowNCAgZGFuaWVsYQorICogTW9yZSBETUEgZml4ZXMgZm9yIG5vaXN5IGxpbmVzLgorICogUmV0dXJuIHRoZSBzaXplIG9mIGJhZCBmcmFtZXMgaW4gZG1hX2dldF9yeF9mcmFtZV9zaXplLCBzbyB0aGF0IHRoZSBSeCBidWZmZXIKKyAqIGRlc2NyaXB0b3JzIGNhbiBiZSBjbGVhbmVkIGJ5IGRtYV9idWZfcmVhZCAoY2FsbGVkIGluIGNwY19uZXRfcngpLgorICogUmVuYW1lZCBkbWFfc3RhcnQgcm91dGluZSB0byByeF9kbWFfc3RhcnQuIEltcHJvdmVkIFJ4IHN0YXRpc3RpY3MuCisgKiBGaXhlZCBCT0YgaW50ZXJydXB0IHRyZWF0bWVudC4gQ3JlYXRlZCBkbWFfc3RhcnQgcm91dGluZS4KKyAqIENoYW5nZWQgbWluIGFuZCBtYXggdG8gY3BjX21pbiBhbmQgY3BjX21heC4KKyAqCisgKiBSZXZpc2lvbiAzLjEwICAyMDAxLzA4LzA2IDEyOjAxOjUxICByZWdpbmEKKyAqIEZpeGVkIHByb2JsZW0gaW4gRFNSX0RFIGJpdC4KKyAqCisgKiBSZXZpc2lvbiAzLjkgIDIwMDEvMDcvMTggMTk6Mjc6MjYgIGRhbmllbGEKKyAqIEFkZGVkIHNvbWUgaGlzdG9yeSBjb21tZW50cy4KKyAqCisgKiBSZXZpc2lvbiAzLjggIDIwMDEvMDcvMTIgMTM6MTE6MTkgIHJlZ2luYQorICogYnVnIGZpeCAtIERDRC1PRkYgaW4gcGMzMDAgdHR5IGRyaXZlcgorICoKKyAqIFJldmlzaW9uIDMuMyB0byAzLjcgIDIwMDEvMDcvMDYgMTU6MDA6MjAgIGRhbmllbGEKKyAqIFJlbW92aW5nIGtlcm5lbCAyLjQuMyBhbmQgcHJldmlvdXMgc3VwcG9ydC4KKyAqIERNQSB0cmFuc21pc3Npb24gYnVnIGZpeC4KKyAqIE1UVSBjaGVjayBpbiBjcGNfbmV0X3J4IGZpeGVkLgorICogQm9vdCBtZXNzYWdlcyByZXZpZXdlZC4KKyAqIE5ldyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKGxpbmUgY29kZSwgQ1JDIGNhbGN1bGF0aW9uIGFuZCBjbG9jaykuCisgKgorICogUmV2aXNpb24gMy4yIDIwMDEvMDYvMjIgMTM6MTM6MDIgIHJlZ2luYQorICogTUxQUFAgaW1wbGVtZW50YXRpb24uIENoYW5nZWQgdGhlIGhlYWRlciBvZiBtZXNzYWdlIHRyYWNlIHRvIGluY2x1ZGUKKyAqIHRoZSBkZXZpY2UgbmFtZS4gTmV3IGZvcm1hdCA6ICJoZGxjWFtSL1RdOiAiLgorICogRGVmYXVsdCBjb25maWd1cmF0aW9uIGNoYW5nZWQuCisgKgorICogUmV2aXNpb24gMy4xIDIwMDEvMDYvMTUgcmVnaW5hCisgKiBpbiBjcGNfcXVldWVfeG1pdCwgbmV0aWZfc3RvcF9xdWV1ZSBpcyBjYWxsZWQgaWYgZG9uJ3QgaGF2ZSBmcmVlIGRlc2NyaXB0b3IKKyAqIHVwcGluZyBtYWpvciB2ZXJzaW9uIG51bWJlcgorICoKKyAqIFJldmlzaW9uIDEuMS4xLjEgIDIwMDEvMDYvMTMgMjA6MjU6MDQgIGRhbmllbGEKKyAqIFBDMzAwIGluaXRpYWwgQ1ZTIHZlcnNpb24gKDMuNC4wLXByZTEpCisgKgorICogUmV2aXNpb24gMy4wLjEuMiAyMDAxLzA2LzA4IGRhbmllbGEKKyAqIERpZCBzb21lIGNoYW5nZXMgaW4gdGhlIERNQSBwcm9ncmFtbWluZyBpbXBsZW1lbnRhdGlvbiB0byBhdm9pZCB0aGUgCisgKiBvY2N1cnJlbmNlIG9mIGEgU0NBLUlJIGJ1ZyB3aGVuIENEQSBpcyBhY2Nlc3NlZCBkdXJpbmcgYSBETUEgdHJhbnNmZXIuCisgKgorICogUmV2aXNpb24gMy4wLjEuMSAyMDAxLzA1LzAyIGRhbmllbGEKKyAqIEFkZGVkIGtlcm5lbCAyLjQuMyBzdXBwb3J0LgorICogCisgKiBSZXZpc2lvbiAzLjAuMS4wIDIwMDEvMDMvMTMgZGFuaWVsYSwgaGVucmlxdWUKKyAqIEFkZGVkIEZyYW1lIFJlbGF5IFN1cHBvcnQuCisgKiBEcml2ZXIgbm93IHVzZXMgSERMQyBnZW5lcmljIGRyaXZlciB0byBwcm92aWRlIHByb3RvY29sIHN1cHBvcnQuCisgKiAKKyAqIFJldmlzaW9uIDMuMC4wLjggMjAwMS8wMy8wMiBkYW5pZWxhCisgKiBGaXhlZCByYW0gc2l6ZSBkZXRlY3Rpb24uIAorICogQ2hhbmdlZCBTSU9DR1BDMzAwQ09ORiBpb2N0bCwgdG8gZ2l2ZSBodyBpbmZvcm1hdGlvbiB0byBwYzMwMHV0aWwuCisgKiAKKyAqIFJldmlzaW9uIDMuMC4wLjcgMjAwMS8wMi8yMyBkYW5pZWxhCisgKiBuZXRpZl9zdG9wX3F1ZXVlIGNhbGxlZCBiZWZvcmUgdGhlIFNDQS1JSSB0cmFuc21pdGlvbiBjb21tYW5kcyBpbiAKKyAqIGNwY19xdWV1ZV94bWl0LCBhbmQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucyB3aXRoIAorICogdHJhbnNtaXRpb24gaW50ZXJydXB0cy4KKyAqIEZpeGVkIGZhbGNfY2hlY2tfc3RhdHVzIGZvciBVbmZyYW1lZCBFMS4KKyAqIAorICogUmV2aXNpb24gMy4wLjAuNiAyMDAwLzEyLzEzIGRhbmllbGEKKyAqIEltcGxlbWVudGVkIHBjMzAwdXRpbCBzdXBwb3J0OiB0cmFjZSwgc3RhdGlzdGljcywgc3RhdHVzIGFuZCBsb29wYmFjaworICogdGVzdHMgZm9yIHRoZSBQQzMwMCBURSBib2FyZHMuCisgKiAKKyAqIFJldmlzaW9uIDMuMC4wLjUgMjAwMC8xMi8xMiBpdmFuCisgKiBBZGRlZCBzdXBwb3J0IGZvciBVbmZyYW1lZCBFMS4KKyAqIEltcGxlbWVudGVkIG1vbml0b3IgbW9kZS4KKyAqIEZpeGVkIERDRCBzZW5zaXRpdml0eSBvbiB0aGUgc2Vjb25kIGNoYW5uZWwuCisgKiBEcml2ZXIgbm93IGNvbXBsaWVzIHdpdGggbmV3IFBDSSBrZXJuZWwgYXJjaGl0ZWN0dXJlLgorICoKKyAqIFJldmlzaW9uIDMuMC4wLjQgMjAwMC8wOS8yOCBpdmFuCisgKiBJbXBsZW1lbnRlZCBEQ0Qgc2Vuc2l0aXZpdHkuCisgKiBNb3ZlZCBoYXJkd2FyZS1zcGVjaWZpYyBvcGVuIHRvIHRoZSBlbmQgb2YgY3BjX29wZW4sIHRvIGF2b2lkIHJhY2UKKyAqIGNvbmRpdGlvbnMgd2l0aCBlYXJseSByZWNlcHRpb24gaW50ZXJydXB0cy4KKyAqIEluY2x1ZGVkIGNvZGUgZm9yIFtyZXF1ZXN0fHJlbGVhc2VdX21lbV9yZWdpb24oKS4KKyAqIENoYW5nZWQgbG9jYXRpb24gb2YgcGMzMDAuaCAuCisgKiBNaW5vciBjb2RlIHJldmlzaW9uIChjb250cmliLiBvZiBKZWZmIEdhcnppaykuCisgKgorICogUmV2aXNpb24gMy4wLjAuMyAyMDAwLzA3LzAzIGl2YW4KKyAqIFByZXZpb3VzIGJ1Z2ZpeCBmb3IgdGhlIGZyYW1pbmcgZXJyb3JzIHdpdGggZXh0ZXJuYWwgY2xvY2sgbWFkZSBYMjEKKyAqIGJvYXJkcyBzdG9wIHdvcmtpbmcuIFRoaXMgdmVyc2lvbiBmaXhlcyBpdC4KKyAqCisgKiBSZXZpc2lvbiAzLjAuMC4yIDIwMDAvMDYvMjMgaXZhbgorICogUmV2aXNpdGVkIGNwY19xdWV1ZV94bWl0IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIG9uIFR4IERNQSBidWZmZXIKKyAqIGhhbmRsaW5nIHdoZW4gVHggdGltZW91dHMgb2NjdXIuCisgKiBSZXZpc2l0ZWQgUnggc3RhdGlzdGljcy4KKyAqIEZpeGVkIGEgYnVnIGluIHRoZSBTQ0EtSUkgcHJvZ3JhbW1pbmcgdGhhdCB3b3VsZCBjYXVzZSBmcmFtaW5nIGVycm9ycworICogd2hlbiBleHRlcm5hbCBjbG9jayB3YXMgY29uZmlndXJlZC4KKyAqCisgKiBSZXZpc2lvbiAzLjAuMC4xIDIwMDAvMDUvMjYgaXZhbgorICogQWRkZWQgbG9naWMgaW4gdGhlIFNDQSBpbnRlcnJ1cHQgaGFuZGxlciBzbyB0aGF0IG5vIGJvYXJkIGNhbiBtb25vcG9saXplCisgKiB0aGUgZHJpdmVyLgorICogUmVxdWVzdCBQTFggSS9PIHJlZ2lvbiwgYWx0aG91Z2ggZHJpdmVyIGRvZXNuJ3QgdXNlIGl0LCB0byBhdm9pZAorICogcHJvYmxlbXMgd2l0aCBvdGhlciBkcml2ZXJzIGFjY2Vzc2luZyBpdC4KKyAqCisgKiBSZXZpc2lvbiAzLjAuMC4wIDIwMDAvMDUvMTUgaXZhbgorICogRGlkIHNvbWUgY2hhbmdlcyBpbiB0aGUgRE1BIHByb2dyYW1taW5nIGltcGxlbWVudGF0aW9uIHRvIGF2b2lkIHRoZQorICogb2NjdXJyZW5jZSBvZiBhIFNDQS1JSSBidWcgaW4gdGhlIHNlY29uZCBjaGFubmVsLgorICogSW1wbGVtZW50ZWQgd29ya2Fyb3VuZCBmb3IgUExYOTA1MCBidWcgdGhhdCB3b3VsZCBjYXVzZSBhIHN5c3RlbSBsb2NrdXAKKyAqIGluIGNlcnRhaW4gc3lzdGVtcywgZGVwZW5kaW5nIG9uIHRoZSBNTUlPIGFkZHJlc3NlcyBhbGxvY2F0ZWQgdG8gdGhlCisgKiBib2FyZC4KKyAqIEZpeGVkIHRoZSBGQUxDIGNoaXAgcHJvZ3JhbW1pbmcgdG8gYXZvaWQgc3luY2hyb25pemF0aW9uIHByb2JsZW1zIGluIHRoZQorICogc2Vjb25kIGNoYW5uZWwgKFRFIG9ubHkpLgorICogSW1wbGVtZW50ZWQgYSBjbGVhbmVyIGFuZCBmYXN0ZXIgVHggRE1BIGRlc2NyaXB0b3IgY2xlYW51cCBwcm9jZWR1cmUgaW4KKyAqIGNwY19xdWV1ZV94bWl0KCkuCisgKiBDaGFuZ2VkIHRoZSBidWlsdC1pbiBkcml2ZXIgaW1wbGVtZW50YXRpb24gc28gdGhhdCB0aGUgZHJpdmVyIGNhbiB1c2UgdGhlCisgKiBnZW5lcmFsICdoZGxjTicgbmFtaW5nIGNvbnZlbnRpb24gaW5zdGVhZCBvZiBwcm9wcmlldGFyeSBkZXZpY2UgbmFtZXMuCisgKiBEcml2ZXIgbG9hZCBtZXNzYWdlcyBhcmUgbm93IGRldmljZS1jZW50cmljLCBpbnN0ZWFkIG9mIGJvYXJkLWNlbnRyaWMuCisgKiBEeW5hbWljIGFsbG9jYXRpb24gb2YgbmV0X2RldmljZSBzdHJ1Y3R1cmVzLgorICogQ29kZSBpcyBub3cgY29tcGxpYW50IHdpdGggdGhlIG5ldyBtb2R1bGUgaW50ZXJmYWNlIChtb2R1bGVfW2luaXR8ZXhpdF0pLgorICogTWFrZSB1c2Ugb2YgdGhlIFBDSSBoZWxwZXIgZnVuY3Rpb25zIHRvIGFjY2VzcyBQQ0kgcmVzb3VyY2VzLgorICoKKyAqIFJldmlzaW9uIDIuMC4wLjAgMjAwMC8wNC8xNSBpdmFuCisgKiBBZGRlZCBzdXBwb3J0IGZvciB0aGUgUEMzMDAvVEUgYm9hcmRzIChUMS9GVDEvRTEvRkUxKS4KKyAqCisgKiBSZXZpc2lvbiAxLjEuMC4wIDIwMDAvMDIvMjggaXZhbgorICogTWFqb3IgY2hhbmdlcyBpbiB0aGUgZHJpdmVyIGFyY2hpdGVjdHVyZS4KKyAqIFNvZnRuZXQgY29tcGxpYW5jeSBpbXBsZW1lbnRlZC4KKyAqIERyaXZlciBub3cgcmVwb3J0cyBwaHlzaWNhbCBpbnN0ZWFkIG9mIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3Nlcy4KKyAqIEFkZGVkIGNwY19jaGFuZ2VfbXR1IGZ1bmN0aW9uLgorICoKKyAqIFJldmlzaW9uIDEuMC4wLjAgMTk5OS8xMi8xNiBpdmFuCisgKiBGaXJzdCBvZmZpY2lhbCByZWxlYXNlLgorICogU3VwcG9ydCBmb3IgMS0gYW5kIDItY2hhbm5lbCBib2FyZHMgKHdoaWNoIHVzZSBkaXN0aW5jdCBQQ0kgRGV2aWNlIElEJ3MpLgorICogU3VwcG9ydCBmb3IgbW9ub2x5dGhpYyBpbnN0YWxsYXRpb24gKGkuZS4sIGRydiBidWlsdCBpbnRvIHRoZSBrZXJuZWwpLgorICogWC4yNSBhZGRpdGlvbmFsIGNoZWNraW5nIHdoZW4gbGFwYl9bZGlzXWNvbm5lY3RfcmVxdWVzdCByZXR1cm5zIGFuIGVycm9yLgorICogU0NBIHByb2dyYW1taW5nIG5vdyBjb3ZlcnMgWC4yMSBhcyB3ZWxsLgorICoKKyAqIFJldmlzaW9uIDAuMy4xLjAgMTk5OS8xMS8xOCBpdmFuCisgKiBNYWRlIFguMjUgc3VwcG9ydCBjb25maWd1cmF0aW9uLWRlcGVuZGVudCAoYXMgaXQgZGVwZW5kcyBvbiBleHRlcm5hbCAKKyAqIG1vZHVsZXMgdG8gd29yaykuCisgKiBDaGFuZ2VkIFguMjUtc3BlY2lmaWMgZnVuY3Rpb24gbmFtZXMgdG8gY29tcGx5IHdpdGggYWRvcHRlZCBjb252ZW50aW9uLgorICogRml4ZWQgdHlwb3MgaW4gWC4yNSBmdW5jdGlvbnMgdGhhdCB3b3VsZCBjYXVzZSBjb21waWxlIGVycm9ycyAoRGFuaWVsYSkuCisgKiBGaXhlZCBidWcgaW4gY2hfY29uZmlnIHRoYXQgd291bGQgZGlzYWJsZSBpbnRlcnJ1cHRzIG9uIGEgcHJldmlvdXNseSAKKyAqIGVuYWJsZWQgY2hhbm5lbCBpZiB0aGUgb3RoZXIgY2hhbm5lbCBvbiB0aGUgc2FtZSBib2FyZCB3YXMgZW5hYmxlZCBsYXRlci4KKyAqCisgKiBSZXZpc2lvbiAwLjMuMC4wIDE5OTkvMTEvMTYgZGFuaWVsYQorICogWC4yNSBzdXBwb3J0LgorICoKKyAqIFJldmlzaW9uIDAuMi4zLjAgMTk5OS8xMS8xNSBpdmFuCisgKiBGdW5jdGlvbiBjcGNfY2hfc3RhdHVzIG5vdyBwcm92aWRlcyBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uLgorICogQWRkZWQgc3VwcG9ydCBmb3IgWC4yMSBjbG9jayBjb25maWd1cmF0aW9uLgorICogQ2hhbmdlZCBUTlIxIHNldHRpbmcgaW4gb3JkZXIgdG8gcHJldmVudCBUeCBGSUZPIG92ZXJhY2Nlc3NlcyBieSB0aGUgU0NBLgorICogTm93IHVzaW5nIFBDSSBjbG9jayBpbnN0ZWFkIG9mIGludGVybmFsIG9zY2lsbGF0b3IgY2xvY2sgZm9yIHRoZSBTQ0EuCisgKgorICogUmV2aXNpb24gMC4yLjIuMCAxOTk5LzExLzEwIGl2YW4KKyAqIENoYW5nZWQgdGhlICpfZG1hX2J1Zl9jaGVjayBmdW5jdGlvbnMgc28gdGhhdCB0aGV5IHdvdWxkIHByaW50IG9ubHkgCisgKiB0aGUgdXNlZnVsIGluZm8gaW5zdGVhZCBvZiB0aGUgd2hvbGUgYnVmZmVyIGRlc2NyaXB0b3IgYmFuay4KKyAqIEZpeGVkIGJ1ZyBpbiBjcGNfcXVldWVfeG1pdCB0aGF0IHdvdWxkIGV2ZW50dWFsbHkgY3Jhc2ggdGhlIHN5c3RlbSAKKyAqIGluIGNhc2Ugb2YgYSBwYWNrZXQgZHJvcC4KKyAqIEltcGxlbWVudGVkIFRYIHVuZGVycnVuIGhhbmRsaW5nLgorICogSW1wcm92ZWQgU0NBIGZpbmUgdHVuaW5nIHRvIGJvb3N0IHVwIGl0cyBwZXJmb3JtYW5jZS4KKyAqCisgKiBSZXZpc2lvbiAwLjIuMS4wIDE5OTkvMTEvMDMgaXZhbgorICogQWRkZWQgZnVuY3Rpb25zICpkbWFfYnVmX3B0X2luaXQgdG8gYWxsb3cgaW5kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gCisgKiBvZiB0aGUgbmV4dC1kZXNjci4gYW5kIERNQSBidWZmZXIgcG9pbnRlcnMgb24gdGhlIERNQSBkZXNjcmlwdG9ycy4KKyAqIEtlcm5lbCBidWZmZXIgcmVsZWFzZSBhbmQgdGJ1c3kgY2xlYXJpbmcgaXMgbm93IGRvbmUgaW4gdGhlIGludGVycnVwdCAKKyAqIGhhbmRsZXIuCisgKiBGaXhlZCBidWcgaW4gY3BjX29wZW4gdGhhdCB3b3VsZCBjYXVzZSBhbiBpbnRlcmZhY2UgcmVvcGVuIHRvIGZhaWwuCisgKiBBZGRlZCBhIHByb3RvY29sLXNwZWNpZmljIGNvZGUgc2VjdGlvbiBpbiBjcGNfbmV0X3J4LgorICogUmVtb3ZlZCBwcmludGsgbGV2ZWwgZGVmcyAodGhleSBtaWdodCBiZSBhZGRlZCBiYWNrIGFmdGVyIHRoZSBiZXRhIHBoYXNlKS4KKyAqCisgKiBSZXZpc2lvbiAwLjIuMC4wIDE5OTkvMTAvMjggaXZhbgorICogUmV2aXNpdGVkIHRoZSBjb2RlIHNvIHRoYXQgbmV3IHByb3RvY29scyBjYW4gYmUgZWFzaWx5IGFkZGVkIC8gc3VwcG9ydGVkLiAKKyAqCisgKiBSZXZpc2lvbiAwLjEuMC4xIDE5OTkvMTAvMjAgaXZhbgorICogTW9zdGx5ICJlc3RoZXRpYyIgY2hhbmdlcy4KKyAqCisgKiBSZXZpc2lvbiAwLjEuMC4wIDE5OTkvMTAvMTEgaXZhbgorICogSW5pdGlhbCB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKworI2luY2x1ZGUgPG5ldC9zeW5jcHBwLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgInBjMzAwLmgiCisKKyNkZWZpbmUJQ1BDX0xPQ0soY2FyZCxmbGFncykJCVwKKwkJZG8gewkJCQkJCVwKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOwlcCisJCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgQ1BDX1VOTE9DSyhjYXJkLGZsYWdzKQkJCVwKKwkJZG8gewkJCQkJCQlcCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOwlcCisJCX0gd2hpbGUgKDApCisKKyN1bmRlZglQQzMwMF9ERUJVR19QQ0kKKyN1bmRlZglQQzMwMF9ERUJVR19JTlRSCisjdW5kZWYJUEMzMDBfREVCVUdfVFgKKyN1bmRlZglQQzMwMF9ERUJVR19SWAorI3VuZGVmCVBDMzAwX0RFQlVHX09USEVSCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjcGNfcGNpX2Rldl9pZFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJLyogUEMzMDAvUlNWIG9yIFBDMzAwL1gyMSwgMiBjaGFuICovCisJezB4MTIwZSwgMHgzMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB4MzAwfSwKKwkvKiBQQzMwMC9SU1Ygb3IgUEMzMDAvWDIxLCAxIGNoYW4gKi8KKwl7MHgxMjBlLCAweDMwMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMHgzMDF9LAorCS8qIFBDMzAwL1RFLCAyIGNoYW4gKi8KKwl7MHgxMjBlLCAweDMxMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMHgzMTB9LAorCS8qIFBDMzAwL1RFLCAxIGNoYW4gKi8KKwl7MHgxMjBlLCAweDMxMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMHgzMTF9LAorCS8qIFBDMzAwL1RFLU0sIDIgY2hhbiAqLworCXsweDEyMGUsIDB4MzIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAweDMyMH0sCisJLyogUEMzMDAvVEUtTSwgMSBjaGFuICovCisJezB4MTIwZSwgMHgzMjEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB4MzIxfSwKKwkvKiBFbmQgb2YgdGFibGUgKi8KKwl7MCx9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjcGNfcGNpX2Rldl9pZCk7CisKKyNpZm5kZWYgY3BjX21pbgorI2RlZmluZQljcGNfbWluKGEsYikJKCgoYSk8KGIpKT8oYSk6KGIpKQorI2VuZGlmCisjaWZuZGVmIGNwY19tYXgKKyNkZWZpbmUJY3BjX21heChhLGIpCSgoKGEpPihiKSk/KGEpOihiKSkKKyNlbmRpZgorCisvKiBwcm90b3R5cGVzICovCitzdGF0aWMgdm9pZCB0eF9kbWFfYnVmX3B0X2luaXQocGMzMDBfdCAqLCBpbnQpOworc3RhdGljIHZvaWQgdHhfZG1hX2J1Zl9pbml0KHBjMzAwX3QgKiwgaW50KTsKK3N0YXRpYyB2b2lkIHJ4X2RtYV9idWZfcHRfaW5pdChwYzMwMF90ICosIGludCk7CitzdGF0aWMgdm9pZCByeF9kbWFfYnVmX2luaXQocGMzMDBfdCAqLCBpbnQpOworc3RhdGljIHZvaWQgdHhfZG1hX2J1Zl9jaGVjayhwYzMwMF90ICosIGludCk7CitzdGF0aWMgdm9pZCByeF9kbWFfYnVmX2NoZWNrKHBjMzAwX3QgKiwgaW50KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBjcGNfaW50cihpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmNwY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKik7CitzdGF0aWMgaW50IGNsb2NrX3JhdGVfY2FsYyh1Y2xvbmcsIHVjbG9uZywgaW50ICopOworc3RhdGljIHVjbG9uZyBkZXRlY3RfcmFtKHBjMzAwX3QgKik7CitzdGF0aWMgdm9pZCBwbHhfaW5pdChwYzMwMF90ICopOworc3RhdGljIHZvaWQgY3BjX3RyYWNlKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBza19idWZmICosIGNoYXIpOworc3RhdGljIGludCBjcGNfYXR0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICosIHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBzaG9ydCk7CisKKyNpZmRlZiBDT05GSUdfUEMzMDBfTUxQUFAKK3ZvaWQgY3BjX3R0eV9pbml0KHBjMzAwZGV2X3QgKiBkZXYpOwordm9pZCBjcGNfdHR5X3VucmVnaXN0ZXJfc2VydmljZShwYzMwMGRldl90ICogcGMzMDBkZXYpOwordm9pZCBjcGNfdHR5X3JlY2VpdmUocGMzMDBkZXZfdCAqIHBjMzAwZGV2KTsKK3ZvaWQgY3BjX3R0eV90cmlnZ2VyX3BvbGwocGMzMDBkZXZfdCAqIHBjMzAwZGV2KTsKK3ZvaWQgY3BjX3R0eV9yZXNldF92YXIodm9pZCk7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiogICBETUEgUm91dGluZXMgICAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdHhfZG1hX2J1Zl9wdF9pbml0KHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJaW50IGk7CisJaW50IGNoX2ZhY3RvciA9IGNoICogTl9ETUFfVFhfQlVGOworCXZvbGF0aWxlIHBjc2NhX2JkX3QgX19pb21lbSAqcHRkZXNjciA9IChjYXJkLT5ody5yYW1iYXNlCisJCQkgICAgICAgICAgICAgICArIERNQV9UWF9CRF9CQVNFICsgY2hfZmFjdG9yICogc2l6ZW9mKHBjc2NhX2JkX3QpKTsKKworCWZvciAoaSA9IDA7IGkgPCBOX0RNQV9UWF9CVUY7IGkrKywgcHRkZXNjcisrKSB7CisJCWNwY193cml0ZWwoJnB0ZGVzY3ItPm5leHQsICh1Y2xvbmcpIChETUFfVFhfQkRfQkFTRSArCisJCQkoY2hfZmFjdG9yICsgKChpICsgMSkgJiAoTl9ETUFfVFhfQlVGIC0gMSkpKSAqIHNpemVvZihwY3NjYV9iZF90KSkpOworCQljcGNfd3JpdGVsKCZwdGRlc2NyLT5wdGJ1ZiwgCisJCQkJCQkodWNsb25nKSAoRE1BX1RYX0JBU0UgKyAoY2hfZmFjdG9yICsgaSkgKiBCRF9ERUZfTEVOKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB0eF9kbWFfYnVmX2luaXQocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlpbnQgaTsKKwlpbnQgY2hfZmFjdG9yID0gY2ggKiBOX0RNQV9UWF9CVUY7CisJdm9sYXRpbGUgcGNzY2FfYmRfdCBfX2lvbWVtICpwdGRlc2NyID0gKGNhcmQtPmh3LnJhbWJhc2UKKwkJCSAgICAgICArIERNQV9UWF9CRF9CQVNFICsgY2hfZmFjdG9yICogc2l6ZW9mKHBjc2NhX2JkX3QpKTsKKworCWZvciAoaSA9IDA7IGkgPCBOX0RNQV9UWF9CVUY7IGkrKywgcHRkZXNjcisrKSB7CisJCW1lbXNldF9pbyhwdGRlc2NyLCAwLCBzaXplb2YocGNzY2FfYmRfdCkpOworCQljcGNfd3JpdGV3KCZwdGRlc2NyLT5sZW4sIDApOworCQljcGNfd3JpdGViKCZwdGRlc2NyLT5zdGF0dXMsIERTVF9PU0IpOworCX0KKwl0eF9kbWFfYnVmX3B0X2luaXQoY2FyZCwgY2gpOworfQorCitzdGF0aWMgdm9pZCByeF9kbWFfYnVmX3B0X2luaXQocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlpbnQgaTsKKwlpbnQgY2hfZmFjdG9yID0gY2ggKiBOX0RNQV9SWF9CVUY7CisJdm9sYXRpbGUgcGNzY2FfYmRfdCBfX2lvbWVtICpwdGRlc2NyID0gKGNhcmQtPmh3LnJhbWJhc2UKKwkJCQkgICAgICAgKyBETUFfUlhfQkRfQkFTRSArIGNoX2ZhY3RvciAqIHNpemVvZihwY3NjYV9iZF90KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTl9ETUFfUlhfQlVGOyBpKyssIHB0ZGVzY3IrKykgeworCQljcGNfd3JpdGVsKCZwdGRlc2NyLT5uZXh0LCAodWNsb25nKSAoRE1BX1JYX0JEX0JBU0UgKworCSAgICAgCShjaF9mYWN0b3IgKyAoKGkgKyAxKSAmIChOX0RNQV9SWF9CVUYgLSAxKSkpICogc2l6ZW9mKHBjc2NhX2JkX3QpKSk7CisJCWNwY193cml0ZWwoJnB0ZGVzY3ItPnB0YnVmLAorCQkJICAgKHVjbG9uZykgKERNQV9SWF9CQVNFICsgKGNoX2ZhY3RvciArIGkpICogQkRfREVGX0xFTikpOworCX0KK30KKworc3RhdGljIHZvaWQgcnhfZG1hX2J1Zl9pbml0KHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJaW50IGk7CisJaW50IGNoX2ZhY3RvciA9IGNoICogTl9ETUFfUlhfQlVGOworCXZvbGF0aWxlIHBjc2NhX2JkX3QgX19pb21lbSAqcHRkZXNjciA9IChjYXJkLT5ody5yYW1iYXNlCisJCQkJICAgICAgICsgRE1BX1JYX0JEX0JBU0UgKyBjaF9mYWN0b3IgKiBzaXplb2YocGNzY2FfYmRfdCkpOworCisJZm9yIChpID0gMDsgaSA8IE5fRE1BX1JYX0JVRjsgaSsrLCBwdGRlc2NyKyspIHsKKwkJbWVtc2V0X2lvKHB0ZGVzY3IsIDAsIHNpemVvZihwY3NjYV9iZF90KSk7CisJCWNwY193cml0ZXcoJnB0ZGVzY3ItPmxlbiwgMCk7CisJCWNwY193cml0ZWIoJnB0ZGVzY3ItPnN0YXR1cywgMCk7CisJfQorCXJ4X2RtYV9idWZfcHRfaW5pdChjYXJkLCBjaCk7Cit9CisKK3N0YXRpYyB2b2lkIHR4X2RtYV9idWZfY2hlY2socGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwl2b2xhdGlsZSBwY3NjYV9iZF90IF9faW9tZW0gKnB0ZGVzY3I7CisJaW50IGk7CisJdWNzaG9ydCBmaXJzdF9iZCA9IGNhcmQtPmNoYW5bY2hdLnR4X2ZpcnN0X2JkOworCXVjc2hvcnQgbmV4dF9iZCA9IGNhcmQtPmNoYW5bY2hdLnR4X25leHRfYmQ7CisKKwlwcmludGsoIiNDSCVkOiBmX2JkID0gJWQoMHglMDh6eCksIG5fYmQgPSAlZCgweCUwOHp4KVxuIiwgY2gsCisJICAgICAgIGZpcnN0X2JkLCBUWF9CRF9BRERSKGNoLCBmaXJzdF9iZCksCisJICAgICAgIG5leHRfYmQsIFRYX0JEX0FERFIoY2gsIG5leHRfYmQpKTsKKwlmb3IgKGkgPSBmaXJzdF9iZCwKKwkgICAgIHB0ZGVzY3IgPSAoY2FyZC0+aHcucmFtYmFzZSArIFRYX0JEX0FERFIoY2gsIGZpcnN0X2JkKSk7CisJICAgICBpICE9ICgobmV4dF9iZCArIDEpICYgKE5fRE1BX1RYX0JVRiAtIDEpKTsKKwkgICAgIGkgPSAoaSArIDEpICYgKE5fRE1BX1RYX0JVRiAtIDEpLCAKKwkJIHB0ZGVzY3IgPSAoY2FyZC0+aHcucmFtYmFzZSArIFRYX0JEX0FERFIoY2gsIGkpKSkgeworCQlwcmludGsoIlxuIENIJWQgVFglZDogbmV4dD0weCV4LCBwdGJ1Zj0weCV4LCBTVD0weCV4LCBsZW49JWQiLAorCQkgICAgICAgY2gsIGksIGNwY19yZWFkbCgmcHRkZXNjci0+bmV4dCksCisJCSAgICAgICBjcGNfcmVhZGwoJnB0ZGVzY3ItPnB0YnVmKSwKKwkJICAgICAgIGNwY19yZWFkYigmcHRkZXNjci0+c3RhdHVzKSwgY3BjX3JlYWR3KCZwdGRlc2NyLT5sZW4pKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorCisjaWZkZWYJUEMzMDBfREVCVUdfT1RIRVIKKy8qIFNob3cgYWxsIFRYIGJ1ZmZlciBkZXNjcmlwdG9ycyAqLworc3RhdGljIHZvaWQgdHgxX2RtYV9idWZfY2hlY2socGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwl2b2xhdGlsZSBwY3NjYV9iZF90IF9faW9tZW0gKnB0ZGVzY3I7CisJaW50IGk7CisJdWNzaG9ydCBmaXJzdF9iZCA9IGNhcmQtPmNoYW5bY2hdLnR4X2ZpcnN0X2JkOworCXVjc2hvcnQgbmV4dF9iZCA9IGNhcmQtPmNoYW5bY2hdLnR4X25leHRfYmQ7CisJdWNsb25nIHNjYWJhc2UgPSBjYXJkLT5ody5zY2FiYXNlOworCisJcHJpbnRrICgiXG5uZnJlZV90eF9iZCA9ICVkIFxuIiwgY2FyZC0+Y2hhbltjaF0ubmZyZWVfdHhfYmQpOworCXByaW50aygiI0NIJWQ6IGZfYmQgPSAlZCgweCUwOHgpLCBuX2JkID0gJWQoMHglMDh4KVxuIiwgY2gsCisJICAgICAgIGZpcnN0X2JkLCBUWF9CRF9BRERSKGNoLCBmaXJzdF9iZCksCisJICAgICAgIG5leHRfYmQsIFRYX0JEX0FERFIoY2gsIG5leHRfYmQpKTsKKwlwcmludGsoIlRYX0NEQT0weCUwOHgsIFRYX0VEQT0weCUwOHhcbiIsCisJICAgICAgIGNwY19yZWFkbChzY2FiYXNlICsgRFRYX1JFRyhDREFMLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGwoc2NhYmFzZSArIERUWF9SRUcoRURBTCwgY2gpKSk7CisJZm9yIChpID0gMDsgaSA8IE5fRE1BX1RYX0JVRjsgaSsrKSB7CisJCXB0ZGVzY3IgPSAoY2FyZC0+aHcucmFtYmFzZSArIFRYX0JEX0FERFIoY2gsIGkpKTsKKwkJcHJpbnRrKCJcbiBDSCVkIFRYJWQ6IG5leHQ9MHgleCwgcHRidWY9MHgleCwgU1Q9MHgleCwgbGVuPSVkIiwKKwkJICAgICAgIGNoLCBpLCBjcGNfcmVhZGwoJnB0ZGVzY3ItPm5leHQpLAorCQkgICAgICAgY3BjX3JlYWRsKCZwdGRlc2NyLT5wdGJ1ZiksCisJCSAgICAgICBjcGNfcmVhZGIoJnB0ZGVzY3ItPnN0YXR1cyksIGNwY19yZWFkdygmcHRkZXNjci0+bGVuKSk7CisJfQorCXByaW50aygiXG4iKTsKK30KKyNlbmRpZgorCQkJIAorc3RhdGljIHZvaWQgcnhfZG1hX2J1Zl9jaGVjayhwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXZvbGF0aWxlIHBjc2NhX2JkX3QgX19pb21lbSAqcHRkZXNjcjsKKwlpbnQgaTsKKwl1Y3Nob3J0IGZpcnN0X2JkID0gY2FyZC0+Y2hhbltjaF0ucnhfZmlyc3RfYmQ7CisJdWNzaG9ydCBsYXN0X2JkID0gY2FyZC0+Y2hhbltjaF0ucnhfbGFzdF9iZDsKKwlpbnQgY2hfZmFjdG9yOworCisJY2hfZmFjdG9yID0gY2ggKiBOX0RNQV9SWF9CVUY7CisJcHJpbnRrKCIjQ0glZDogZl9iZCA9ICVkLCBsX2JkID0gJWRcbiIsIGNoLCBmaXJzdF9iZCwgbGFzdF9iZCk7CisJZm9yIChpID0gMCwgcHRkZXNjciA9IChjYXJkLT5ody5yYW1iYXNlICsKKwkJCQkJICAgICAgRE1BX1JYX0JEX0JBU0UgKyBjaF9mYWN0b3IgKiBzaXplb2YocGNzY2FfYmRfdCkpOworCSAgICAgaSA8IE5fRE1BX1JYX0JVRjsgaSsrLCBwdGRlc2NyKyspIHsKKwkJaWYgKGNwY19yZWFkYigmcHRkZXNjci0+c3RhdHVzKSAmIERTVF9PU0IpCisJCQlwcmludGsgKCJcbiBDSCVkIFJYJWQ6IG5leHQ9MHgleCwgcHRidWY9MHgleCwgU1Q9MHgleCwgbGVuPSVkIiwKKwkJCQkgY2gsIGksIGNwY19yZWFkbCgmcHRkZXNjci0+bmV4dCksCisJCQkJIGNwY19yZWFkbCgmcHRkZXNjci0+cHRidWYpLAorCQkJCSBjcGNfcmVhZGIoJnB0ZGVzY3ItPnN0YXR1cyksCisJCQkJIGNwY19yZWFkdygmcHRkZXNjci0+bGVuKSk7CisJfQorCXByaW50aygiXG4iKTsKK30KKworaW50IGRtYV9nZXRfcnhfZnJhbWVfc2l6ZShwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXZvbGF0aWxlIHBjc2NhX2JkX3QgX19pb21lbSAqcHRkZXNjcjsKKwl1Y3Nob3J0IGZpcnN0X2JkID0gY2FyZC0+Y2hhbltjaF0ucnhfZmlyc3RfYmQ7CisJaW50IHJjdmQgPSAwOworCXZvbGF0aWxlIHVjY2hhciBzdGF0dXM7CisKKwlwdGRlc2NyID0gKGNhcmQtPmh3LnJhbWJhc2UgKyBSWF9CRF9BRERSKGNoLCBmaXJzdF9iZCkpOworCXdoaWxlICgoc3RhdHVzID0gY3BjX3JlYWRiKCZwdGRlc2NyLT5zdGF0dXMpKSAmIERTVF9PU0IpIHsKKwkJcmN2ZCArPSBjcGNfcmVhZHcoJnB0ZGVzY3ItPmxlbik7CisJCWZpcnN0X2JkID0gKGZpcnN0X2JkICsgMSkgJiAoTl9ETUFfUlhfQlVGIC0gMSk7CisJCWlmICgoc3RhdHVzICYgRFNUX0VPTSkgfHwgKGZpcnN0X2JkID09IGNhcmQtPmNoYW5bY2hdLnJ4X2xhc3RfYmQpKSB7CisJCQkvKiBSZXR1cm4gdGhlIHNpemUgb2YgYSBnb29kIGZyYW1lIG9yIGluY29tcGxldGUgYmFkIGZyYW1lIAorCQkJKiAoZG1hX2J1Zl9yZWFkIHdpbGwgY2xlYW4gdGhlIGJ1ZmZlciBkZXNjcmlwdG9ycyBpbiB0aGlzIGNhc2UpLiAqLworCQkJcmV0dXJuIChyY3ZkKTsKKwkJfQorCQlwdGRlc2NyID0gKGNhcmQtPmh3LnJhbWJhc2UgKyBjcGNfcmVhZGwoJnB0ZGVzY3ItPm5leHQpKTsKKwl9CisJcmV0dXJuICgtMSk7Cit9CisKKy8qCisgKiBkbWFfYnVmX3dyaXRlOiB3cml0ZXMgYSBmcmFtZSB0byB0aGUgVHggRE1BIGJ1ZmZlcnMKKyAqIE5PVEU6IHRoaXMgZnVuY3Rpb24gd3JpdGVzIG9uZSBmcmFtZSBhdCBhIHRpbWUuCisgKi8KK2ludCBkbWFfYnVmX3dyaXRlKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gsIHVjY2hhciAqIHB0ZGF0YSwgaW50IGxlbikKK3sKKwlpbnQgaSwgbmNoYXI7CisJdm9sYXRpbGUgcGNzY2FfYmRfdCBfX2lvbWVtICpwdGRlc2NyOworCWludCB0b3NlbmQgPSBsZW47CisJdWNjaGFyIG5idWYgPSAoKGxlbiAtIDEpIC8gQkRfREVGX0xFTikgKyAxOworCisJaWYgKG5idWYgPj0gY2FyZC0+Y2hhbltjaF0ubmZyZWVfdHhfYmQpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5idWY7IGkrKykgeworCQlwdGRlc2NyID0gKGNhcmQtPmh3LnJhbWJhc2UgKworCQkJCQkgIFRYX0JEX0FERFIoY2gsIGNhcmQtPmNoYW5bY2hdLnR4X25leHRfYmQpKTsKKwkJbmNoYXIgPSBjcGNfbWluKEJEX0RFRl9MRU4sIHRvc2VuZCk7CisJCWlmIChjcGNfcmVhZGIoJnB0ZGVzY3ItPnN0YXR1cykgJiBEU1RfT1NCKSB7CisJCQltZW1jcHlfdG9pbygoY2FyZC0+aHcucmFtYmFzZSArIGNwY19yZWFkbCgmcHRkZXNjci0+cHRidWYpKSwKKwkJCQkgICAgJnB0ZGF0YVtsZW4gLSB0b3NlbmRdLCBuY2hhcik7CisJCQljcGNfd3JpdGV3KCZwdGRlc2NyLT5sZW4sIG5jaGFyKTsKKwkJCWNhcmQtPmNoYW5bY2hdLm5mcmVlX3R4X2JkLS07CisJCQlpZiAoKGkgKyAxKSA9PSBuYnVmKSB7CisJCQkJLyogVGhpcyBtdXN0IGJlIHRoZSBsYXN0IEJEIHRvIGJlIHVzZWQgKi8KKwkJCQljcGNfd3JpdGViKCZwdGRlc2NyLT5zdGF0dXMsIERTVF9FT00pOworCQkJfSBlbHNlIHsKKwkJCQljcGNfd3JpdGViKCZwdGRlc2NyLT5zdGF0dXMsIDApOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJdG9zZW5kIC09IG5jaGFyOworCQljYXJkLT5jaGFuW2NoXS50eF9uZXh0X2JkID0KKwkJCShjYXJkLT5jaGFuW2NoXS50eF9uZXh0X2JkICsgMSkgJiAoTl9ETUFfVFhfQlVGIC0gMSk7CisJfQorCS8qIElmIGl0IGdldHMgdG8gaGVyZSwgaXQgbWVhbnMgd2UgaGF2ZSBzZW50IHRoZSB3aG9sZSBmcmFtZSAqLworCXJldHVybiAwOworfQorCisvKgorICogZG1hX2J1Zl9yZWFkOiByZWFkcyBhIGZyYW1lIGZyb20gdGhlIFJ4IERNQSBidWZmZXJzCisgKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIHJlYWRzIG9uZSBmcmFtZSBhdCBhIHRpbWUuCisgKi8KK2ludCBkbWFfYnVmX3JlYWQocGMzMDBfdCAqIGNhcmQsIGludCBjaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgbmNoYXI7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCXZvbGF0aWxlIHBjc2NhX2JkX3QgX19pb21lbSAqcHRkZXNjcjsKKwlpbnQgcmN2ZCA9IDA7CisJdm9sYXRpbGUgdWNjaGFyIHN0YXR1czsKKworCXB0ZGVzY3IgPSAoY2FyZC0+aHcucmFtYmFzZSArCisJCQkJICBSWF9CRF9BRERSKGNoLCBjaGFuLT5yeF9maXJzdF9iZCkpOworCXdoaWxlICgoc3RhdHVzID0gY3BjX3JlYWRiKCZwdGRlc2NyLT5zdGF0dXMpKSAmIERTVF9PU0IpIHsKKwkJbmNoYXIgPSBjcGNfcmVhZHcoJnB0ZGVzY3ItPmxlbik7CisJCWlmICgoc3RhdHVzICYgKERTVF9PVlIgfCBEU1RfQ1JDIHwgRFNUX1JCSVQgfCBEU1RfU0hSVCB8IERTVF9BQlQpKQorCQkgICAgfHwgKG5jaGFyID4gQkRfREVGX0xFTikpIHsKKworCQkJaWYgKG5jaGFyID4gQkRfREVGX0xFTikKKwkJCQlzdGF0dXMgfD0gRFNUX1JCSVQ7CisJCQlyY3ZkID0gLXN0YXR1czsKKwkJCS8qIERpc2NhcmQgcmVtYWluaW5nIGRlc2NyaXB0b3JzIHVzZWQgYnkgdGhlIGJhZCBmcmFtZSAqLworCQkJd2hpbGUgKGNoYW4tPnJ4X2ZpcnN0X2JkICE9IGNoYW4tPnJ4X2xhc3RfYmQpIHsKKwkJCQljcGNfd3JpdGViKCZwdGRlc2NyLT5zdGF0dXMsIDApOworCQkJCWNoYW4tPnJ4X2ZpcnN0X2JkID0gKGNoYW4tPnJ4X2ZpcnN0X2JkKzEpICYgKE5fRE1BX1JYX0JVRi0xKTsKKwkJCQlpZiAoc3RhdHVzICYgRFNUX0VPTSkKKwkJCQkJYnJlYWs7CisJCQkJcHRkZXNjciA9IChjYXJkLT5ody5yYW1iYXNlICsKKwkJCQkJCQkgIGNwY19yZWFkbCgmcHRkZXNjci0+bmV4dCkpOworCQkJCXN0YXR1cyA9IGNwY19yZWFkYigmcHRkZXNjci0+c3RhdHVzKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWlmIChuY2hhciAhPSAwKSB7CisJCQlpZiAoc2tiKSB7CisJCQkJbWVtY3B5X2Zyb21pbyhza2JfcHV0KHNrYiwgbmNoYXIpLAorCQkJCSAoY2FyZC0+aHcucmFtYmFzZStjcGNfcmVhZGwoJnB0ZGVzY3ItPnB0YnVmKSksbmNoYXIpOworCQkJfQorCQkJcmN2ZCArPSBuY2hhcjsKKwkJfQorCQljcGNfd3JpdGViKCZwdGRlc2NyLT5zdGF0dXMsIDApOworCQljcGNfd3JpdGViKCZwdGRlc2NyLT5sZW4sIDApOworCQljaGFuLT5yeF9maXJzdF9iZCA9IChjaGFuLT5yeF9maXJzdF9iZCArIDEpICYgKE5fRE1BX1JYX0JVRiAtIDEpOworCisJCWlmIChzdGF0dXMgJiBEU1RfRU9NKQorCQkJYnJlYWs7CisKKwkJcHRkZXNjciA9IChjYXJkLT5ody5yYW1iYXNlICsgY3BjX3JlYWRsKCZwdGRlc2NyLT5uZXh0KSk7CisJfQorCisJaWYgKHJjdmQgIT0gMCkgeworCQkvKiBVcGRhdGUgcG9pbnRlciAqLworCQljaGFuLT5yeF9sYXN0X2JkID0gKGNoYW4tPnJ4X2ZpcnN0X2JkIC0gMSkgJiAoTl9ETUFfUlhfQlVGIC0gMSk7CisJCS8qIFVwZGF0ZSBFREEgKi8KKwkJY3BjX3dyaXRlbChjYXJkLT5ody5zY2FiYXNlICsgRFJYX1JFRyhFREFMLCBjaCksCisJCQkgICBSWF9CRF9BRERSKGNoLCBjaGFuLT5yeF9sYXN0X2JkKSk7CisJfQorCXJldHVybiAocmN2ZCk7Cit9CisKK3ZvaWQgdHhfZG1hX3N0b3AocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwl2b2lkIF9faW9tZW0gKnNjYWJhc2UgPSBjYXJkLT5ody5zY2FiYXNlOworCXVjY2hhciBkcnJfZW5hX2JpdCA9IDEgPDwgKDUgKyAyICogY2gpOworCXVjY2hhciBkcnJfcnN0X2JpdCA9IDEgPDwgKDEgKyAyICogY2gpOworCisJLyogRGlzYWJsZSBETUEgKi8KKwljcGNfd3JpdGViKHNjYWJhc2UgKyBEUlIsIGRycl9lbmFfYml0KTsKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBEUlIsIGRycl9yc3RfYml0ICYgfmRycl9lbmFfYml0KTsKK30KKwordm9pZCByeF9kbWFfc3RvcChwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXZvaWQgX19pb21lbSAqc2NhYmFzZSA9IGNhcmQtPmh3LnNjYWJhc2U7CisJdWNjaGFyIGRycl9lbmFfYml0ID0gMSA8PCAoNCArIDIgKiBjaCk7CisJdWNjaGFyIGRycl9yc3RfYml0ID0gMSA8PCAoMiAqIGNoKTsKKworCS8qIERpc2FibGUgRE1BICovCisJY3BjX3dyaXRlYihzY2FiYXNlICsgRFJSLCBkcnJfZW5hX2JpdCk7CisJY3BjX3dyaXRlYihzY2FiYXNlICsgRFJSLCBkcnJfcnN0X2JpdCAmIH5kcnJfZW5hX2JpdCk7Cit9CisKK3ZvaWQgcnhfZG1hX3N0YXJ0KHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJdm9pZCBfX2lvbWVtICpzY2FiYXNlID0gY2FyZC0+aHcuc2NhYmFzZTsKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJCisJLyogU3RhcnQgRE1BICovCisJY3BjX3dyaXRlbChzY2FiYXNlICsgRFJYX1JFRyhDREFMLCBjaCksCisJCSAgIFJYX0JEX0FERFIoY2gsIGNoYW4tPnJ4X2ZpcnN0X2JkKSk7CisJaWYgKGNwY19yZWFkbChzY2FiYXNlICsgRFJYX1JFRyhDREFMLGNoKSkgIT0KKwkJCQkgIFJYX0JEX0FERFIoY2gsIGNoYW4tPnJ4X2ZpcnN0X2JkKSkgeworCQljcGNfd3JpdGVsKHNjYWJhc2UgKyBEUlhfUkVHKENEQUwsIGNoKSwKKwkJCQkgICBSWF9CRF9BRERSKGNoLCBjaGFuLT5yeF9maXJzdF9iZCkpOworCX0KKwljcGNfd3JpdGVsKHNjYWJhc2UgKyBEUlhfUkVHKEVEQUwsIGNoKSwKKwkJICAgUlhfQkRfQUREUihjaCwgY2hhbi0+cnhfbGFzdF9iZCkpOworCWNwY193cml0ZXcoc2NhYmFzZSArIERSWF9SRUcoQkZMTCwgY2gpLCBCRF9ERUZfTEVOKTsKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBEU1JfUlgoY2gpLCBEU1JfREUpOworCWlmICghKGNwY19yZWFkYihzY2FiYXNlICsgRFNSX1JYKGNoKSkgJiBEU1JfREUpKSB7CisJY3BjX3dyaXRlYihzY2FiYXNlICsgRFNSX1JYKGNoKSwgRFNSX0RFKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiAgIEZBTEMgUm91dGluZXMgICAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZmFsY19pc3N1ZV9jbWQocGMzMDBfdCAqIGNhcmQsIGludCBjaCwgdWNjaGFyIGNtZCkKK3sKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisJdW5zaWduZWQgbG9uZyBpID0gMDsKKworCXdoaWxlIChjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhTSVMsIGNoKSkgJiBTSVNfQ0VDKSB7CisJCWlmIChpKysgPj0gUEMzMDBfRkFMQ19NQVhMT09QKSB7CisJCQlwcmludGsoIiVzOiBGQUxDIGNvbW1hbmQgbG9ja2VkKGNtZD0weCV4KS5cbiIsCisJCQkgICAgICAgY2FyZC0+Y2hhbltjaF0uZC5uYW1lLCBjbWQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKENNRFIsIGNoKSwgY21kKTsKK30KKwordm9pZCBmYWxjX2ludHJfZW5hYmxlKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCXBjMzAwY2hjb25mX3QgKmNvbmYgPSAocGMzMDBjaGNvbmZfdCAqKSAmIGNoYW4tPmNvbmY7CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKworCS8qIEludGVycnVwdCBwaW5zIGFyZSBvcGVuLWRyYWluICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElQQywgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJUEMsIGNoKSkgJiB+SVBDX0lDMCk7CisJLyogQ29udGVycyB1cGRhdGVkIGVhY2ggc2Vjb25kICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpKSB8IEZNUjFfRUNNKTsKKwkvKiBFbmFibGUgU0VDIGFuZCBFUyBpbnRlcnJ1cHRzICAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIzLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjMsIGNoKSkgJiB+KElNUjNfU0VDIHwgSU1SM19FUykpOworCWlmIChjb25mLT5mcl9tb2RlID09IFBDMzAwX0ZSX1VORlJBTUVEKSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVI0LCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVI0LCBjaCkpICYgfihJTVI0X0xPUykpOworCX0gZWxzZSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVI0LCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVI0LCBjaCkpICYKKwkJCSAgIH4oSU1SNF9MRkEgfCBJTVI0X0FJUyB8IElNUjRfTE9TIHwgSU1SNF9TTElQKSk7CisJfQorCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9UMSkgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SMywgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SMywgY2gpKSAmIH5JTVIzX0xMQlNDKTsKKwl9IGVsc2UgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSVBDLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJUEMsIGNoKSkgfCBJUENfU0NJKTsKKwkJaWYgKGNvbmYtPmZyX21vZGUgPT0gUEMzMDBfRlJfVU5GUkFNRUQpIHsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIyLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SMiwgY2gpKSAmIH4oSU1SMl9MT1MpKTsKKwkJfSBlbHNlIHsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIyLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SMiwgY2gpKSAmCisJCQkJICAgfihJTVIyX0ZBUiB8IElNUjJfTEZBIHwgSU1SMl9BSVMgfCBJTVIyX0xPUykpOworCQkJaWYgKHBmYWxjLT5tdWx0aWZyYW1lX21vZGUpIHsKKwkJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SMiwgY2gpLAorCQkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIyLCBjaCkpICYgCisJCQkJCSAgIH4oSU1SMl9UNDAwTVMgfCBJTVIyX01GQVIpKTsKKwkJCX0gZWxzZSB7CisJCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjIsIGNoKSwKKwkJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SMiwgY2gpKSB8IAorCQkJCQkgICBJTVIyX1Q0MDBNUyB8IElNUjJfTUZBUik7CisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQgZmFsY19vcGVuX3RpbWVzbG90KHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gsIGludCB0aW1lc2xvdCkKK3sKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisJdWNjaGFyIHRzaGYgPSBjYXJkLT5jaGFuW2NoXS5mYWxjLm9mZnNldDsKKworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRygoSUNCMSArICh0aW1lc2xvdCAtIHRzaGYpIC8gOCksIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoKElDQjEgKyAodGltZXNsb3QgLSB0c2hmKSAvIDgpLCBjaCkpICYgCisJCSAgIAl+KDB4ODAgPj4gKCh0aW1lc2xvdCAtIHRzaGYpICYgMHgwNykpKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoKFRUUjEgKyB0aW1lc2xvdCAvIDgpLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKChUVFIxICsgdGltZXNsb3QgLyA4KSwgY2gpKSB8IAorICAgCQkJKDB4ODAgPj4gKHRpbWVzbG90ICYgMHgwNykpKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoKFJUUjEgKyB0aW1lc2xvdCAvIDgpLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKChSVFIxICsgdGltZXNsb3QgLyA4KSwgY2gpKSB8IAorCQkJKDB4ODAgPj4gKHRpbWVzbG90ICYgMHgwNykpKTsKK30KKwordm9pZCBmYWxjX2Nsb3NlX3RpbWVzbG90KHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gsIGludCB0aW1lc2xvdCkKK3sKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisJdWNjaGFyIHRzaGYgPSBjYXJkLT5jaGFuW2NoXS5mYWxjLm9mZnNldDsKKworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRygoSUNCMSArICh0aW1lc2xvdCAtIHRzaGYpIC8gOCksIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoKElDQjEgKyAodGltZXNsb3QgLSB0c2hmKSAvIDgpLCBjaCkpIHwgCisJCSAgICgweDgwID4+ICgodGltZXNsb3QgLSB0c2hmKSAmIDB4MDcpKSk7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKChUVFIxICsgdGltZXNsb3QgLyA4KSwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRygoVFRSMSArIHRpbWVzbG90IC8gOCksIGNoKSkgJiAKKwkJICAgfigweDgwID4+ICh0aW1lc2xvdCAmIDB4MDcpKSk7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKChSVFIxICsgdGltZXNsb3QgLyA4KSwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRygoUlRSMSArIHRpbWVzbG90IC8gOCksIGNoKSkgJiAKKwkJICAgfigweDgwID4+ICh0aW1lc2xvdCAmIDB4MDcpKSk7Cit9CisKK3ZvaWQgZmFsY19jbG9zZV9hbGxfdGltZXNsb3RzKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCXBjMzAwY2hjb25mX3QgKmNvbmYgPSAocGMzMDBjaGNvbmZfdCAqKSAmIGNoYW4tPmNvbmY7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElDQjEsIGNoKSwgMHhmZik7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFRUUjEsIGNoKSwgMCk7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFJUUjEsIGNoKSwgMCk7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElDQjIsIGNoKSwgMHhmZik7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFRUUjIsIGNoKSwgMCk7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFJUUjIsIGNoKSwgMCk7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElDQjMsIGNoKSwgMHhmZik7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFRUUjMsIGNoKSwgMCk7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFJUUjMsIGNoKSwgMCk7CisJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX0UxKSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJQ0I0LCBjaCksIDB4ZmYpOworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoVFRSNCwgY2gpLCAwKTsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFJUUjQsIGNoKSwgMCk7CisJfQorfQorCit2b2lkIGZhbGNfb3Blbl9hbGxfdGltZXNsb3RzKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCXBjMzAwY2hjb25mX3QgKmNvbmYgPSAocGMzMDBjaGNvbmZfdCAqKSAmIGNoYW4tPmNvbmY7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElDQjEsIGNoKSwgMCk7CisJaWYgKGNvbmYtPmZyX21vZGUgPT0gUEMzMDBfRlJfVU5GUkFNRUQpIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFRUUjEsIGNoKSwgMHhmZik7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhSVFIxLCBjaCksIDB4ZmYpOworCX0gZWxzZSB7CisJCS8qIFRpbWVzbG90IDAgaXMgbmV2ZXIgZW5hYmxlZCAqLworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoVFRSMSwgY2gpLCAweDdmKTsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFJUUjEsIGNoKSwgMHg3Zik7CisJfQorCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJQ0IyLCBjaCksIDApOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhUVFIyLCBjaCksIDB4ZmYpOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhSVFIyLCBjaCksIDB4ZmYpOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJQ0IzLCBjaCksIDApOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhUVFIzLCBjaCksIDB4ZmYpOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhSVFIzLCBjaCksIDB4ZmYpOworCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9FMSkgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSUNCNCwgY2gpLCAwKTsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFRUUjQsIGNoKSwgMHhmZik7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhSVFI0LCBjaCksIDB4ZmYpOworCX0gZWxzZSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJQ0I0LCBjaCksIDB4ZmYpOworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoVFRSNCwgY2gpLCAweDgwKTsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFJUUjQsIGNoKSwgMHg4MCk7CisJfQorfQorCit2b2lkIGZhbGNfaW5pdF90aW1lc2xvdChwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlwYzMwMGNoY29uZl90ICpjb25mID0gKHBjMzAwY2hjb25mX3QgKikgJiBjaGFuLT5jb25mOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKwlpbnQgdHNsb3Q7CisKKwlmb3IgKHRzbG90ID0gMDsgdHNsb3QgPCBwZmFsYy0+bnVtX2NoYW5uZWxzOyB0c2xvdCsrKSB7CisJCWlmIChjb25mLT50c2xvdF9iaXRtYXAgJiAoMSA8PCB0c2xvdCkpIHsKKwkJCS8vIENoYW5uZWwgZW5hYmxlZAorCQkJZmFsY19vcGVuX3RpbWVzbG90KGNhcmQsIGNoLCB0c2xvdCArIDEpOworCQl9IGVsc2UgeworCQkJLy8gQ2hhbm5lbCBkaXNhYmxlZAorCQkJZmFsY19jbG9zZV90aW1lc2xvdChjYXJkLCBjaCwgdHNsb3QgKyAxKTsKKwkJfQorCX0KK30KKwordm9pZCBmYWxjX2VuYWJsZV9jb21tKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKworCWlmIChwZmFsYy0+ZnVsbF9iYW5kd2lkdGgpIHsKKwkJZmFsY19vcGVuX2FsbF90aW1lc2xvdHMoY2FyZCwgY2gpOworCX0gZWxzZSB7CisJCWZhbGNfaW5pdF90aW1lc2xvdChjYXJkLCBjaCk7CisJfQorCS8vIENUUy9EQ0QgT04KKwljcGNfd3JpdGViKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcxLAorCQkgICBjcGNfcmVhZGIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzEpICYKKwkJICAgfigoQ1BMRF9SRUcxX0ZBTENfRENEIHwgQ1BMRF9SRUcxX0ZBTENfQ1RTKSA8PCAoMiAqIGNoKSkpOworfQorCit2b2lkIGZhbGNfZGlzYWJsZV9jb21tKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKworCWlmIChwZmFsYy0+bG9vcF9hY3RpdmUgIT0gMikgeworCQlmYWxjX2Nsb3NlX2FsbF90aW1lc2xvdHMoY2FyZCwgY2gpOworCX0KKwkvLyBDVFMvRENEIE9GRgorCWNwY193cml0ZWIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzEsCisJCSAgIGNwY19yZWFkYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMSkgfAorCQkgICAoKENQTERfUkVHMV9GQUxDX0RDRCB8IENQTERfUkVHMV9GQUxDX0NUUykgPDwgKDIgKiBjaCkpKTsKK30KKwordm9pZCBmYWxjX2luaXRfdDEocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJcGMzMDBjaGNvbmZfdCAqY29uZiA9IChwYzMwMGNoY29uZl90ICopICYgY2hhbi0+Y29uZjsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCXVjY2hhciBkamEgPSAoY2ggPyAoTElNMl9ESkEyIHwgTElNMl9ESkExKSA6IDApOworCisJLyogU3dpdGNoIHRvIFQxIG1vZGUgKFBDTSAyNCkgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpLCBGTVIxX1BNT0QpOworCisJLyogV2FpdCAyMCB1cyBmb3Igc2V0dXAgKi8KKwl1ZGVsYXkoMjApOworCisJLyogVHJhbnNtaXQgQnVmZmVyIFNpemUgKDEgZnJhbWUpICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFNJQzEsIGNoKSwgU0lDMV9YQlMwKTsKKworCS8qIENsb2NrIG1vZGUgKi8KKwlpZiAoY29uZi0+cGh5c19zZXR0aW5ncy5jbG9ja190eXBlID09IENMT0NLX0lOVCkgeyAvKiBNYXN0ZXIgbW9kZSAqLworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpKSB8IExJTTBfTUFTKTsKKwl9IGVsc2UgeyAvKiBTbGF2ZSBtb2RlICovCisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCkpICYgfkxJTTBfTUFTKTsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExPT1AsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExPT1AsIGNoKSkgJiB+TE9PUF9SVE0pOworCX0KKworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJUEMsIGNoKSwgSVBDX1NDSSk7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjAsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMCwgY2gpKSAmCisJCSAgIH4oRk1SMF9YQzAgfCBGTVIwX1hDMSB8IEZNUjBfUkMwIHwgRk1SMF9SQzEpKTsKKworCXN3aXRjaCAoY29uZi0+bGNvZGUpIHsKKwkJY2FzZSBQQzMwMF9MQ19BTUk6CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMCwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjAsIGNoKSkgfAorCQkJCSAgIEZNUjBfWEMxIHwgRk1SMF9SQzEpOworCQkJLyogQ2xlYXIgQ2hhbm5lbCByZWdpc3RlciB0byBPTiBmb3IgYWxsIGNoYW5uZWxzICovCisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoQ0NCMSwgY2gpLCAweGZmKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhDQ0IyLCBjaCksIDB4ZmYpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKENDQjMsIGNoKSwgMHhmZik7CisJCQlicmVhazsKKworCQljYXNlIFBDMzAwX0xDX0I4WlM6CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMCwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjAsIGNoKSkgfAorCQkJCSAgIEZNUjBfWEMwIHwgRk1SMF9YQzEgfCBGTVIwX1JDMCB8IEZNUjBfUkMxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUEMzMDBfTENfTlJaOgorCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjAsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIwLCBjaCkpIHwgMHgwMCk7CisJCQlicmVhazsKKwl9CisKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCkpIHwgTElNMF9FTE9TKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCkpICYgfihMSU0wX1NDTDEgfCBMSU0wX1NDTDApKTsKKwkvKiBTZXQgaW50ZXJmYWNlIG1vZGUgdG8gMiBNQlBTICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpKSB8IEZNUjFfSU1PRCk7CisKKwlzd2l0Y2ggKGNvbmYtPmZyX21vZGUpIHsKKwkJY2FzZSBQQzMwMF9GUl9FU0Y6CisJCQlwZmFsYy0+bXVsdGlmcmFtZV9tb2RlID0gMDsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI0LCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SNCwgY2gpKSB8IEZNUjRfRk0xKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpKSB8IAorCQkJCSAgIEZNUjFfQ1JDIHwgRk1SMV9FREwpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhETDEsIGNoKSwgMCk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWERMMiwgY2gpLCAwKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYREwzLCBjaCksIDApOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjAsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIwLCBjaCkpICYgfkZNUjBfU1JBRik7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsY2gpKSB8IEZNUjJfTUNTUCB8IEZNUjJfU1NQKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUEMzMDBfRlJfRDQ6CisJCQlwZmFsYy0+bXVsdGlmcmFtZV9tb2RlID0gMTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI0LCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SNCwgY2gpKSAmCisJCQkJICAgfihGTVI0X0ZNMSB8IEZNUjRfRk0wKSk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMCwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjAsIGNoKSkgfCBGTVIwX1NSQUYpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCkpICYgfkZNUjJfU1NQKTsKKwkJCWJyZWFrOworCX0KKworCS8qIEVuYWJsZSBBdXRvbWF0aWMgUmVzeW5jaHJvbml6YXRpb24gKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SNCwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI0LCBjaCkpIHwgRk1SNF9BVVRPKTsKKworCS8qIFRyYW5zbWl0IEF1dG9tYXRpYyBSZW1vdGUgQWxhcm0gKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCkpIHwgRk1SMl9BWFJBKTsKKworCS8qIENoYW5uZWwgdHJhbnNsYXRpb24gbW9kZSAxIDogb25lIHRvIG9uZSAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSkgfCBGTVIxX0NUTSk7CisKKwkvKiBObyBzaWduYWxpbmcgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCkpICYgfkZNUjFfU0lHTSk7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjUsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SNSwgY2gpKSAmCisJCSAgIH4oRk1SNV9FSUJSIHwgRk1SNV9TUlMpKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoQ0NSMSwgY2gpLCAwKTsKKworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0xLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExJTTEsIGNoKSkgfCBMSU0xX1JJTDAgfCBMSU0xX1JJTDEpOworCisJc3dpdGNoIChjb25mLT5sYm8pIHsKKwkJCS8qIFByb3ZpZGVzIHByb3BlciBMaW5lIEJ1aWxkIE91dCAqLworCQljYXNlIFBDMzAwX0xCT18wX0RCOgorCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExJTTIsIGNoKSwgKExJTTJfTE9TMSB8IGRqYSkpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhQTTAsIGNoKSwgMHg1YSk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFBNMSwgY2gpLCAweDhmKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYUE0yLCBjaCksIDB4MjApOworCQkJYnJlYWs7CisJCWNhc2UgUEMzMDBfTEJPXzdfNV9EQjoKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0yLCBjaCksICgweDQwIHwgTElNMl9MT1MxIHwgZGphKSk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFBNMCwgY2gpLCAweDExKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYUE0xLCBjaCksIDB4MDIpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhQTTIsIGNoKSwgMHgyMCk7CisJCQlicmVhazsKKwkJY2FzZSBQQzMwMF9MQk9fMTVfREI6CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTElNMiwgY2gpLCAoMHg4MCB8IExJTTJfTE9TMSB8IGRqYSkpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhQTTAsIGNoKSwgMHg4ZSk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFBNMSwgY2gpLCAweDAxKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYUE0yLCBjaCksIDB4MjApOworCQkJYnJlYWs7CisJCWNhc2UgUEMzMDBfTEJPXzIyXzVfREI6CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTElNMiwgY2gpLCAoMHhjMCB8IExJTTJfTE9TMSB8IGRqYSkpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhQTTAsIGNoKSwgMHgwOSk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFBNMSwgY2gpLCAweDAxKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYUE0yLCBjaCksIDB4MjApOworCQkJYnJlYWs7CisJfQorCisJLyogVHJhbnNtaXQgQ2xvY2stU2xvdCBPZmZzZXQgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWEMwLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKFhDMCwgY2gpKSB8IDB4MDEpOworCS8qIFRyYW5zbWl0IFRpbWUtc2xvdCBPZmZzZXQgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWEMxLCBjaCksIDB4M2UpOworCS8qIFJlY2VpdmUgIENsb2NrLVNsb3Qgb2Zmc2V0ICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFJDMCwgY2gpLCAweDA1KTsKKwkvKiBSZWNlaXZlICBUaW1lLXNsb3Qgb2Zmc2V0ICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFJDMSwgY2gpLCAweDAwKTsKKworCS8qIExPUyBEZXRlY3Rpb24gYWZ0ZXIgMTc2IGNvbnNlY3V0aXZlIDBzICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFBDRFIsIGNoKSwgMHgwYSk7CisJLyogTE9TIFJlY292ZXJ5IGFmdGVyIDIyIG9uZXMgaW4gdGhlIHRpbWUgd2luZG93IG9mIFBDRCAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhQQ1JSLCBjaCksIDB4MTUpOworCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElETEUsIGNoKSwgMHg3Zik7CisKKwlpZiAoY29uZi0+ZnJfbW9kZSA9PSBQQzMwMF9GUl9FU0ZfSkFQQU4pIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFJDMSwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoUkMxLCBjaCkpIHwgMHg4MCk7CisJfQorCisJZmFsY19jbG9zZV9hbGxfdGltZXNsb3RzKGNhcmQsIGNoKTsKK30KKwordm9pZCBmYWxjX2luaXRfZTEocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJcGMzMDBjaGNvbmZfdCAqY29uZiA9IChwYzMwMGNoY29uZl90ICopICYgY2hhbi0+Y29uZjsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCXVjY2hhciBkamEgPSAoY2ggPyAoTElNMl9ESkEyIHwgTElNMl9ESkExKSA6IDApOworCisJLyogU3dpdGNoIHRvIEUxIG1vZGUgKFBDTSAzMCkgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCkpICYgfkZNUjFfUE1PRCk7CisKKwkvKiBDbG9jayBtb2RlICovCisJaWYgKGNvbmYtPnBoeXNfc2V0dGluZ3MuY2xvY2tfdHlwZSA9PSBDTE9DS19JTlQpIHsgLyogTWFzdGVyIG1vZGUgKi8KKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSkgfCBMSU0wX01BUyk7CisJfSBlbHNlIHsgLyogU2xhdmUgbW9kZSAqLworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpKSAmIH5MSU0wX01BUyk7CisJfQorCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMT09QLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExPT1AsIGNoKSkgJiB+TE9PUF9TRk0pOworCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElQQywgY2gpLCBJUENfU0NJKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMCwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIwLCBjaCkpICYKKwkJICAgfihGTVIwX1hDMCB8IEZNUjBfWEMxIHwgRk1SMF9SQzAgfCBGTVIwX1JDMSkpOworCisJc3dpdGNoIChjb25mLT5sY29kZSkgeworCQljYXNlIFBDMzAwX0xDX0FNSToKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIwLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMCwgY2gpKSB8CisJCQkJICAgRk1SMF9YQzEgfCBGTVIwX1JDMSk7CisJCQlicmVhazsKKworCQljYXNlIFBDMzAwX0xDX0hEQjM6CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMCwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjAsIGNoKSkgfAorCQkJCSAgIEZNUjBfWEMwIHwgRk1SMF9YQzEgfCBGTVIwX1JDMCB8IEZNUjBfUkMxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUEMzMDBfTENfTlJaOgorCQkJYnJlYWs7CisJfQorCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpKSAmIH4oTElNMF9TQ0wxIHwgTElNMF9TQ0wwKSk7CisJLyogU2V0IGludGVyZmFjZSBtb2RlIHRvIDIgTUJQUyAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSkgfCBGTVIxX0lNT0QpOworCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhQTTAsIGNoKSwgMHgxOCk7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhQTTEsIGNoKSwgMHgwMyk7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhQTTIsIGNoKSwgMHgwMCk7CisKKwlzd2l0Y2ggKGNvbmYtPmZyX21vZGUpIHsKKwkJY2FzZSBQQzMwMF9GUl9NRl9DUkM0OgorCQkJcGZhbGMtPm11bHRpZnJhbWVfbW9kZSA9IDE7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSkgfCBGTVIxX1hGUyk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSkgfCBGTVIyX1JGUzEpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCkpICYgfkZNUjJfUkZTMCk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMywgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjMsIGNoKSkgJiB+Rk1SM19FWFRJVyk7CisKKwkJCS8qIE11bHRpRnJhbWUgUmVzeW5jaHJvbml6YXRpb24gKi8KKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpKSB8IEZNUjFfTUZDUyk7CisKKwkJCS8qIEF1dG9tYXRpYyBMb3NzIG9mIE11bHRpZnJhbWUgPiA5MTQgQ1JDIGVycm9ycyAqLworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCkpIHwgRk1SMl9BTE1GKTsKKworCQkJLyogUzEgYW5kIFNJMS9TSTIgc3BhcmUgQml0cyBzZXQgdG8gMSAqLworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhTUCwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKFhTUCwgY2gpKSAmIH5YU1BfQVhTKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYU1AsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhYU1AsIGNoKSkgfCBYU1BfRUJQKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYU1AsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhYU1AsIGNoKSkgfCBYU1BfWFMxMyB8IFhTUF9YUzE1KTsKKworCQkJLyogQXV0b21hdGljIEZvcmNlIFJlc3luY2hyb25pemF0aW9uICovCisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSkgfCBGTVIxX0FGUik7CisKKwkJCS8qIFRyYW5zbWl0IEF1dG9tYXRpYyBSZW1vdGUgQWxhcm0gKi8KKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpKSB8IEZNUjJfQVhSQSk7CisKKwkJCS8qIFRyYW5zbWl0IFNwYXJlIEJpdHMgZm9yIE5hdGlvbmFsIFVzZSAoWSwgU24sIFNhKSAqLworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhTVywgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKFhTVywgY2gpKSB8CisJCQkJICAgWFNXX1hZMCB8IFhTV19YWTEgfCBYU1dfWFkyIHwgWFNXX1hZMyB8IFhTV19YWTQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQQzMwMF9GUl9NRl9OT05fQ1JDNDoKKwkJY2FzZSBQQzMwMF9GUl9ENDoKKwkJCXBmYWxjLT5tdWx0aWZyYW1lX21vZGUgPSAwOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCkpICYgfkZNUjFfWEZTKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpKSAmIAorCQkJCSAgIH4oRk1SMl9SRlMxIHwgRk1SMl9SRlMwKSk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFNXLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoWFNXLCBjaCkpIHwgWFNXX1hTSVMpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhTUCwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKFhTUCwgY2gpKSB8IFhTUF9YU0lGKTsKKworCQkJLyogQXV0b21hdGljIEZvcmNlIFJlc3luY2hyb25pemF0aW9uICovCisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSkgfCBGTVIxX0FGUik7CisKKwkJCS8qIFRyYW5zbWl0IEF1dG9tYXRpYyBSZW1vdGUgQWxhcm0gKi8KKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpKSB8IEZNUjJfQVhSQSk7CisKKwkJCS8qIFRyYW5zbWl0IFNwYXJlIEJpdHMgZm9yIE5hdGlvbmFsIFVzZSAoWSwgU24sIFNhKSAqLworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhTVywgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKFhTVywgY2gpKSB8CisJCQkJICAgWFNXX1hZMCB8IFhTV19YWTEgfCBYU1dfWFkyIHwgWFNXX1hZMyB8IFhTV19YWTQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQQzMwMF9GUl9VTkZSQU1FRDoKKwkJCXBmYWxjLT5tdWx0aWZyYW1lX21vZGUgPSAwOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIxLCBjaCkpICYgfkZNUjFfWEZTKTsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpKSAmIAorCQkJCSAgIH4oRk1SMl9SRlMxIHwgRk1SMl9SRlMwKSk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFNQLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoWFNQLCBjaCkpIHwgWFNQX1RUMCk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoWFNXLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoWFNXLCBjaCkpICYgCisJCQkJICAgfihYU1dfWFRNfFhTV19YWTB8WFNXX1hZMXxYU1dfWFkyfFhTV19YWTN8WFNXX1hZNCkpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFRTV00sIGNoKSwgMHhmZik7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMiwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSkgfAorCQkJCSAgIChGTVIyX1JUTSB8IEZNUjJfREFJUykpOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjIsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCkpICYgfkZNUjJfQVhSQSk7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SMSwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjEsIGNoKSkgJiB+Rk1SMV9BRlIpOworCQkJcGZhbGMtPnN5bmMgPSAxOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMiwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIpIHwKKwkJCQkgICAoQ1BMRF9SRUcyX0ZBTENfTEVEMiA8PCAoMiAqIGNoKSkpOworCQkJYnJlYWs7CisJfQorCisJLyogTm8gc2lnbmFsaW5nICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhTUCwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhYU1AsIGNoKSkgJiB+WFNQX0NBU0VOKTsKKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoQ0NSMSwgY2gpLCAwKTsKKworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0xLCBjaCksCisJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExJTTEsIGNoKSkgfCBMSU0xX1JJTDAgfCBMSU0xX1JJTDEpOworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0yLCBjaCksIChMSU0yX0xPUzEgfCBkamEpKTsKKworCS8qIFRyYW5zbWl0IENsb2NrLVNsb3QgT2Zmc2V0ICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhDMCwgY2gpLAorCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhYQzAsIGNoKSkgfCAweDAxKTsKKwkvKiBUcmFuc21pdCBUaW1lLXNsb3QgT2Zmc2V0ICovCisJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhDMSwgY2gpLCAweDNlKTsKKwkvKiBSZWNlaXZlICBDbG9jay1TbG90IG9mZnNldCAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhSQzAsIGNoKSwgMHgwNSk7CisJLyogUmVjZWl2ZSAgVGltZS1zbG90IG9mZnNldCAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhSQzEsIGNoKSwgMHgwMCk7CisKKwkvKiBMT1MgRGV0ZWN0aW9uIGFmdGVyIDE3NiBjb25zZWN1dGl2ZSAwcyAqLworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhQQ0RSLCBjaCksIDB4MGEpOworCS8qIExPUyBSZWNvdmVyeSBhZnRlciAyMiBvbmVzIGluIHRoZSB0aW1lIHdpbmRvdyBvZiBQQ0QgKi8KKwljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUENSUiwgY2gpLCAweDE1KTsKKworCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJRExFLCBjaCksIDB4N2YpOworCisJZmFsY19jbG9zZV9hbGxfdGltZXNsb3RzKGNhcmQsIGNoKTsKK30KKwordm9pZCBmYWxjX2luaXRfaGRsYyhwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJcGMzMDBjaGNvbmZfdCAqY29uZiA9IChwYzMwMGNoY29uZl90ICopICYgY2hhbi0+Y29uZjsKKworCS8qIEVuYWJsZSB0cmFuc3BhcmVudCBkYXRhIHRyYW5zZmVyICovCisJaWYgKGNvbmYtPmZyX21vZGUgPT0gUEMzMDBfRlJfVU5GUkFNRUQpIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKE1PREUsIGNoKSwgMCk7CisJfSBlbHNlIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKE1PREUsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKE1PREUsIGNoKSkgfAorCQkJICAgKE1PREVfSFJBQyB8IE1PREVfTURTMikpOworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUkFIMiwgY2gpLCAweGZmKTsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFJBSDEsIGNoKSwgMHhmZik7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhSQUwyLCBjaCksIDB4ZmYpOworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoUkFMMSwgY2gpLCAweGZmKTsKKwl9CisKKwkvKiBUeC9SeCByZXNldCAgKi8KKwlmYWxjX2lzc3VlX2NtZChjYXJkLCBjaCwgQ01EUl9SUkVTIHwgQ01EUl9YUkVTIHwgQ01EUl9TUkVTKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHQgc291cmNlcyAqLworCWZhbGNfaW50cl9lbmFibGUoY2FyZCwgY2gpOworfQorCit2b2lkIHRlX2NvbmZpZyhwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlwYzMwMGNoY29uZl90ICpjb25mID0gKHBjMzAwY2hjb25mX3QgKikgJiBjaGFuLT5jb25mOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisJdWNjaGFyIGR1bW15OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwltZW1zZXQocGZhbGMsIDAsIHNpemVvZihmYWxjX3QpKTsKKwlzd2l0Y2ggKGNvbmYtPm1lZGlhKSB7CisJCWNhc2UgSUZfSUZBQ0VfVDE6CisJCQlwZmFsYy0+bnVtX2NoYW5uZWxzID0gTlVNX09GX1QxX0NIQU5ORUxTOworCQkJcGZhbGMtPm9mZnNldCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBJRl9JRkFDRV9FMToKKwkJCXBmYWxjLT5udW1fY2hhbm5lbHMgPSBOVU1fT0ZfRTFfQ0hBTk5FTFM7CisJCQlwZmFsYy0+b2Zmc2V0ID0gMDsKKwkJCWJyZWFrOworCX0KKwlpZiAoY29uZi0+dHNsb3RfYml0bWFwID09IDB4ZmZmZmZmZmZVTCkKKwkJcGZhbGMtPmZ1bGxfYmFuZHdpZHRoID0gMTsKKwllbHNlCisJCXBmYWxjLT5mdWxsX2JhbmR3aWR0aCA9IDA7CisKKwlDUENfTE9DSyhjYXJkLCBmbGFncyk7CisJLyogUmVzZXQgdGhlIEZBTEMgY2hpcCAqLworCWNwY193cml0ZWIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzEsCisJCSAgIGNwY19yZWFkYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMSkgfAorCQkgICAoQ1BMRF9SRUcxX0ZBTENfUkVTRVQgPDwgKDIgKiBjaCkpKTsKKwl1ZGVsYXkoMTAwMDApOworCWNwY193cml0ZWIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzEsCisJCSAgIGNwY19yZWFkYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMSkgJgorCQkgICB+KENQTERfUkVHMV9GQUxDX1JFU0VUIDw8ICgyICogY2gpKSk7CisKKwlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfVDEpIHsKKwkJZmFsY19pbml0X3QxKGNhcmQsIGNoKTsKKwl9IGVsc2UgeworCQlmYWxjX2luaXRfZTEoY2FyZCwgY2gpOworCX0KKwlmYWxjX2luaXRfaGRsYyhjYXJkLCBjaCk7CisJaWYgKGNvbmYtPnJ4X3NlbnMgPT0gUEMzMDBfUlhfU0VOU19TSCkgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTElNMCwgY2gpKSAmIH5MSU0wX0VRT04pOworCX0gZWxzZSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCkpIHwgTElNMF9FUU9OKTsKKwl9CisJY3BjX3dyaXRlYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMiwKKwkJICAgY3BjX3JlYWRiKGNhcmQtPmh3LmZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyKSB8CisJCSAgICgoQ1BMRF9SRUcyX0ZBTENfVFhfQ0xLIHwgQ1BMRF9SRUcyX0ZBTENfUlhfQ0xLKSA8PCAoMiAqIGNoKSkpOworCisJLyogQ2xlYXIgYWxsIGludGVycnVwdCByZWdpc3RlcnMgKi8KKwlkdW1teSA9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZJU1IwLCBjaCkpICsKKwkJY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRklTUjEsIGNoKSkgKworCQljcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGSVNSMiwgY2gpKSArCisJCWNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZJU1IzLCBjaCkpOworCUNQQ19VTkxPQ0soY2FyZCwgZmxhZ3MpOworfQorCit2b2lkIGZhbGNfY2hlY2tfc3RhdHVzKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gsIHVuc2lnbmVkIGNoYXIgZnJzMCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJcGMzMDBjaGNvbmZfdCAqY29uZiA9IChwYzMwMGNoY29uZl90ICopICYgY2hhbi0+Y29uZjsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCisJLyogVmVyaWZ5IExPUyAqLworCWlmIChmcnMwICYgRlJTMF9MT1MpIHsKKwkJaWYgKCFwZmFsYy0+cmVkX2FsYXJtKSB7CisJCQlwZmFsYy0+cmVkX2FsYXJtID0gMTsKKwkJCXBmYWxjLT5sb3MrKzsKKwkJCWlmICghcGZhbGMtPmJsdWVfYWxhcm0pIHsKKwkJCQkvLyBFVkVOVF9GQUxDX0FCTk9STUFMCisJCQkJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX1QxKSB7CisJCQkJCS8qIERpc2FibGUgdGhpcyBpbnRlcnJ1cHQgYXMgaXQgbWF5IG90aGVyd2lzZSBpbnRlcmZlcmUgCisJCQkJCSAqIHdpdGggb3RoZXIgd29ya2luZyBib2FyZHMuICovCisJCQkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIwLCBjaCksIAorCQkJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SMCwgY2gpKQorCQkJCQkJICAgfCBJTVIwX1BERU4pOworCQkJCX0KKwkJCQlmYWxjX2Rpc2FibGVfY29tbShjYXJkLCBjaCk7CisJCQkJLy8gRVZFTlRfRkFMQ19BQk5PUk1BTAorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKHBmYWxjLT5yZWRfYWxhcm0pIHsKKwkJCXBmYWxjLT5yZWRfYWxhcm0gPSAwOworCQkJcGZhbGMtPmxvc3IrKzsKKwkJfQorCX0KKworCWlmIChjb25mLT5mcl9tb2RlICE9IFBDMzAwX0ZSX1VORlJBTUVEKSB7CisJCS8qIFZlcmlmeSBBSVMgYWxhcm0gKi8KKwkJaWYgKGZyczAgJiBGUlMwX0FJUykgeworCQkJaWYgKCFwZmFsYy0+Ymx1ZV9hbGFybSkgeworCQkJCXBmYWxjLT5ibHVlX2FsYXJtID0gMTsKKwkJCQlwZmFsYy0+YWlzKys7CisJCQkJLy8gRVZFTlRfQUlTCisJCQkJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX1QxKSB7CisJCQkJCS8qIERpc2FibGUgdGhpcyBpbnRlcnJ1cHQgYXMgaXQgbWF5IG90aGVyd2lzZSBpbnRlcmZlcmUgd2l0aCAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgd29ya2luZyBib2FyZHMuICovCisJCQkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIwLCBjaCksCisJCQkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIwLCBjaCkpIHwgSU1SMF9QREVOKTsKKwkJCQl9CisJCQkJZmFsY19kaXNhYmxlX2NvbW0oY2FyZCwgY2gpOworCQkJCS8vIEVWRU5UX0FJUworCQkJfQorCQl9IGVsc2UgeworCQkJcGZhbGMtPmJsdWVfYWxhcm0gPSAwOworCQl9CisKKwkJLyogVmVyaWZ5IExGQSAqLworCQlpZiAoZnJzMCAmIEZSUzBfTEZBKSB7CisJCQlpZiAoIXBmYWxjLT5sb3NzX2ZhKSB7CisJCQkJcGZhbGMtPmxvc3NfZmEgPSAxOworCQkJCXBmYWxjLT5sZmErKzsKKwkJCQlpZiAoIXBmYWxjLT5ibHVlX2FsYXJtICYmICFwZmFsYy0+cmVkX2FsYXJtKSB7CisJCQkJCS8vIEVWRU5UX0ZBTENfQUJOT1JNQUwKKwkJCQkJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX1QxKSB7CisJCQkJCQkvKiBEaXNhYmxlIHRoaXMgaW50ZXJydXB0IGFzIGl0IG1heSBvdGhlcndpc2UgCisJCQkJCQkgKiBpbnRlcmZlcmUgd2l0aCBvdGhlciB3b3JraW5nIGJvYXJkcy4gKi8KKwkJCQkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIwLCBjaCksCisJCQkJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SMCwgY2gpKQorCQkJCQkJCSAgIHwgSU1SMF9QREVOKTsKKwkJCQkJfQorCQkJCQlmYWxjX2Rpc2FibGVfY29tbShjYXJkLCBjaCk7CisJCQkJCS8vIEVWRU5UX0ZBTENfQUJOT1JNQUwKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAocGZhbGMtPmxvc3NfZmEpIHsKKwkJCQlwZmFsYy0+bG9zc19mYSA9IDA7CisJCQkJcGZhbGMtPmZhcmVjKys7CisJCQl9CisJCX0KKworCQkvKiBWZXJpZnkgTE1GQSAqLworCQlpZiAocGZhbGMtPm11bHRpZnJhbWVfbW9kZSAmJiAoZnJzMCAmIEZSUzBfTE1GQSkpIHsKKwkJCS8qIEQ0IG9yIENSQzQgZnJhbWUgbW9kZSAqLworCQkJaWYgKCFwZmFsYy0+bG9zc19tZmEpIHsKKwkJCQlwZmFsYy0+bG9zc19tZmEgPSAxOworCQkJCXBmYWxjLT5sbWZhKys7CisJCQkJaWYgKCFwZmFsYy0+Ymx1ZV9hbGFybSAmJiAhcGZhbGMtPnJlZF9hbGFybSAmJgorCQkJCSAgICAhcGZhbGMtPmxvc3NfZmEpIHsKKwkJCQkJLy8gRVZFTlRfRkFMQ19BQk5PUk1BTAorCQkJCQlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfVDEpIHsKKwkJCQkJCS8qIERpc2FibGUgdGhpcyBpbnRlcnJ1cHQgYXMgaXQgbWF5IG90aGVyd2lzZSAKKwkJCQkJCSAqIGludGVyZmVyZSB3aXRoIG90aGVyIHdvcmtpbmcgYm9hcmRzLiAqLworCQkJCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjAsIGNoKSwKKwkJCQkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIwLCBjaCkpCisJCQkJCQkJICAgfCBJTVIwX1BERU4pOworCQkJCQl9CisJCQkJCWZhbGNfZGlzYWJsZV9jb21tKGNhcmQsIGNoKTsKKwkJCQkJLy8gRVZFTlRfRkFMQ19BQk5PUk1BTAorCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXBmYWxjLT5sb3NzX21mYSA9IDA7CisJCX0KKworCQkvKiBWZXJpZnkgUmVtb3RlIEFsYXJtICovCisJCWlmIChmcnMwICYgRlJTMF9SUkEpIHsKKwkJCWlmICghcGZhbGMtPnllbGxvd19hbGFybSkgeworCQkJCXBmYWxjLT55ZWxsb3dfYWxhcm0gPSAxOworCQkJCXBmYWxjLT5yYWkrKzsKKwkJCQlpZiAocGZhbGMtPnN5bmMpIHsKKwkJCQkJLy8gRVZFTlRfUkFJCisJCQkJCWZhbGNfZGlzYWJsZV9jb21tKGNhcmQsIGNoKTsKKwkJCQkJLy8gRVZFTlRfUkFJCisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJcGZhbGMtPnllbGxvd19hbGFybSA9IDA7CisJCX0KKwl9IC8qIGlmICFQQzMwMF9VTkZSQU1FRCAqLworCisJaWYgKHBmYWxjLT5yZWRfYWxhcm0gfHwgcGZhbGMtPmxvc3NfZmEgfHwKKwkgICAgcGZhbGMtPmxvc3NfbWZhIHx8IHBmYWxjLT5ibHVlX2FsYXJtKSB7CisJCWlmIChwZmFsYy0+c3luYykgeworCQkJcGZhbGMtPnN5bmMgPSAwOworCQkJY2hhbi0+ZC5saW5lX29mZisrOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMiwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIpICYKKwkJCQkgICB+KENQTERfUkVHMl9GQUxDX0xFRDIgPDwgKDIgKiBjaCkpKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghcGZhbGMtPnN5bmMpIHsKKwkJCXBmYWxjLT5zeW5jID0gMTsKKwkJCWNoYW4tPmQubGluZV9vbisrOworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMiwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIpIHwKKwkJCQkgICAoQ1BMRF9SRUcyX0ZBTENfTEVEMiA8PCAoMiAqIGNoKSkpOworCQl9CisJfQorCisJaWYgKHBmYWxjLT5zeW5jICYmICFwZmFsYy0+eWVsbG93X2FsYXJtKSB7CisJCWlmICghcGZhbGMtPmFjdGl2ZSkgeworCQkJLy8gRVZFTlRfRkFMQ19OT1JNQUwKKwkJCWlmIChwZmFsYy0+bG9vcF9hY3RpdmUpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfVDEpIHsKKwkJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SMCwgY2gpLAorCQkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIwLCBjaCkpICYgfklNUjBfUERFTik7CisJCQl9CisJCQlmYWxjX2VuYWJsZV9jb21tKGNhcmQsIGNoKTsKKwkJCS8vIEVWRU5UX0ZBTENfTk9STUFMCisJCQlwZmFsYy0+YWN0aXZlID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChwZmFsYy0+YWN0aXZlKSB7CisJCQlwZmFsYy0+YWN0aXZlID0gMDsKKwkJfQorCX0KK30KKwordm9pZCBmYWxjX3VwZGF0ZV9zdGF0cyhwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlwYzMwMGNoY29uZl90ICpjb25mID0gKHBjMzAwY2hjb25mX3QgKikgJiBjaGFuLT5jb25mOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisJdWNzaG9ydCBjb3VudGVyOworCisJY291bnRlciA9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZFQ0wsIGNoKSk7CisJY291bnRlciB8PSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGRUNILCBjaCkpIDw8IDg7CisJcGZhbGMtPmZlYyArPSBjb3VudGVyOworCisJY291bnRlciA9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKENWQ0wsIGNoKSk7CisJY291bnRlciB8PSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhDVkNILCBjaCkpIDw8IDg7CisJcGZhbGMtPmN2YyArPSBjb3VudGVyOworCisJY291bnRlciA9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKENFQ0wsIGNoKSk7CisJY291bnRlciB8PSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhDRUNILCBjaCkpIDw8IDg7CisJcGZhbGMtPmNlYyArPSBjb3VudGVyOworCisJY291bnRlciA9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEVCQ0wsIGNoKSk7CisJY291bnRlciB8PSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhFQkNILCBjaCkpIDw8IDg7CisJcGZhbGMtPmViYyArPSBjb3VudGVyOworCisJaWYgKGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExDUjEsIGNoKSkgJiBMQ1IxX0VQUk0pIHsKKwkJbWRlbGF5KDEwKTsKKwkJY291bnRlciA9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEJFQ0wsIGNoKSk7CisJCWNvdW50ZXIgfD0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoQkVDSCwgY2gpKSA8PCA4OworCQlwZmFsYy0+YmVjICs9IGNvdW50ZXI7CisKKwkJaWYgKCgoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfVDEpICYmCisJCSAgICAgKGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZSUzEsIGNoKSkgJiBGUlMxX0xMQkFEKSAmJgorCQkgICAgICghKGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZSUzEsIGNoKSkgJiBGUlMxX1BERU4pKSkKKwkJICAgIHx8CisJCSAgICAoKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX0UxKSAmJgorCQkgICAgIChjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhSU1AsIGNoKSkgJiBSU1BfTExCQUQpKSkgeworCQkJcGZhbGMtPnByYnMgPSAyOworCQl9IGVsc2UgeworCQkJcGZhbGMtPnByYnMgPSAxOworCQl9CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGZhbGNfcmVtb3RlX2xvb3AKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVzY3JpcHRpb246CUluIHRoZSByZW1vdGUgbG9vcGJhY2sgbW9kZSB0aGUgY2xvY2sgYW5kIGRhdGEgcmVjb3ZlcmVkCisgKgkJZnJvbSB0aGUgbGluZSBpbnB1dHMgUkwxLzIgb3IgUkRJUC9SRElOIGFyZSByb3V0ZWQgYmFjaworICoJCXRvIHRoZSBsaW5lIG91dHB1dHMgWEwxLzIgb3IgWERPUC9YRE9OIHZpYSB0aGUgYW5hbG9nCisgKgkJdHJhbnNtaXR0ZXIuIEFzIGluIG5vcm1hbCBtb2RlIHRoZXkgYXJlIHByb2Nlc3NzZWQgYnkKKyAqCQl0aGUgc3luY2hyb25pemVyIGFuZCB0aGVuIHNlbnQgdG8gdGhlIHN5c3RlbSBpbnRlcmZhY2UuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBmYWxjX3JlbW90ZV9sb29wKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gsIGludCBsb29wX29uKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlwYzMwMGNoY29uZl90ICpjb25mID0gKHBjMzAwY2hjb25mX3QgKikgJiBjaGFuLT5jb25mOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisKKwlpZiAobG9vcF9vbikgeworCQkvLyBFVkVOVF9GQUxDX0FCTk9STUFMCisJCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9UMSkgeworCQkJLyogRGlzYWJsZSB0aGlzIGludGVycnVwdCBhcyBpdCBtYXkgb3RoZXJ3aXNlIGludGVyZmVyZSB3aXRoIAorCQkJICogb3RoZXIgd29ya2luZyBib2FyZHMuICovCisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SMCwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjAsIGNoKSkgfCBJTVIwX1BERU4pOworCQl9CisJCWZhbGNfZGlzYWJsZV9jb21tKGNhcmQsIGNoKTsKKwkJLy8gRVZFTlRfRkFMQ19BQk5PUk1BTAorCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoTElNMSwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTElNMSwgY2gpKSB8IExJTTFfUkwpOworCQlwZmFsYy0+bG9vcF9hY3RpdmUgPSAxOworCX0gZWxzZSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0xLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0xLCBjaCkpICYgfkxJTTFfUkwpOworCQlwZmFsYy0+c3luYyA9IDA7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIsCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIpICYKKwkJCSAgIH4oQ1BMRF9SRUcyX0ZBTENfTEVEMiA8PCAoMiAqIGNoKSkpOworCQlwZmFsYy0+YWN0aXZlID0gMDsKKwkJZmFsY19pc3N1ZV9jbWQoY2FyZCwgY2gsIENNRFJfWFJFUyk7CisJCXBmYWxjLT5sb29wX2FjdGl2ZSA9IDA7CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGZhbGNfbG9jYWxfbG9vcAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZXNjcmlwdGlvbjogVGhlIGxvY2FsIGxvb3BiYWNrIG1vZGUgZGlzY29ubmVjdHMgdGhlIHJlY2VpdmUgbGluZXMgCisgKgkJUkwxL1JMMiByZXNwLiBSRElQL1JESU4gZnJvbSB0aGUgcmVjZWl2ZXIuIEluc3RlYWQgb2YgdGhlCisgKgkJc2lnbmFscyBjb21pbmcgZnJvbSB0aGUgbGluZSB0aGUgZGF0YSBwcm92aWRlZCBieSBzeXN0ZW0KKyAqCQlpbnRlcmZhY2UgYXJlIHJvdXRlZCB0aHJvdWdoIHRoZSBhbmFsb2cgcmVjZWl2ZXIgYmFjayB0bworICoJCXRoZSBzeXN0ZW0gaW50ZXJmYWNlLiBUaGUgdW5pcG9sYXIgYml0IHN0cmVhbSB3aWxsIGJlCisgKgkJdW5kaXN0dXJiZWQgdHJhbnNtaXR0ZWQgb24gdGhlIGxpbmUuIFJlY2VpdmVyIGFuZCB0cmFuc21pdHRlcgorICoJCWNvZGluZyBtdXN0IGJlIGlkZW50aWNhbC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIGZhbGNfbG9jYWxfbG9vcChwYzMwMF90ICogY2FyZCwgaW50IGNoLCBpbnQgbG9vcF9vbikKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKworCWlmIChsb29wX29uKSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMSU0wLCBjaCkpIHwgTElNMF9MTCk7CisJCXBmYWxjLT5sb29wX2FjdGl2ZSA9IDE7CisJfSBlbHNlIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExJTTAsIGNoKSkgJiB+TElNMF9MTCk7CisJCXBmYWxjLT5sb29wX2FjdGl2ZSA9IDA7CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGZhbGNfcGF5bG9hZF9sb29wCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlc2NyaXB0aW9uOiBUaGlzIHJvdXRpbmUgYWxsb3dzIHRvIGVuYWJsZS9kaXNhYmxlIHBheWxvYWQgbG9vcGJhY2suCisgKgkJV2hlbiB0aGUgcGF5bG9hZCBsb29wIGlzIGFjdGl2YXRlZCwgdGhlIHJlY2VpdmVkIDE5MiBiaXRzCisgKgkJb2YgcGF5bG9hZCBkYXRhIHdpbGwgYmUgbG9vcGVkIGJhY2sgdG8gdGhlIHRyYW5zbWl0CisgKgkJZGlyZWN0aW9uLiBUaGUgZnJhbWluZyBiaXRzLCBDUkM2IGFuZCBETCBiaXRzIGFyZSBub3QgCisgKgkJbG9vcGVkLiBUaGV5IGFyZSBvcmlnaW5hdGVkIGJ5IHRoZSBGQUxDLUxIIHRyYW5zbWl0dGVyLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgZmFsY19wYXlsb2FkX2xvb3AocGMzMDBfdCAqIGNhcmQsIGludCBjaCwgaW50IGxvb3Bfb24pCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCXBjMzAwY2hjb25mX3QgKmNvbmYgPSAocGMzMDBjaGNvbmZfdCAqKSAmIGNoYW4tPmNvbmY7CisJZmFsY190ICpwZmFsYyA9IChmYWxjX3QgKikgJiBjaGFuLT5mYWxjOworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKworCWlmIChsb29wX29uKSB7CisJCS8vIEVWRU5UX0ZBTENfQUJOT1JNQUwKKwkJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX1QxKSB7CisJCQkvKiBEaXNhYmxlIHRoaXMgaW50ZXJydXB0IGFzIGl0IG1heSBvdGhlcndpc2UgaW50ZXJmZXJlIHdpdGggCisJCQkgKiBvdGhlciB3b3JraW5nIGJvYXJkcy4gKi8KKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIwLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SMCwgY2gpKSB8IElNUjBfUERFTik7CisJCX0KKwkJZmFsY19kaXNhYmxlX2NvbW0oY2FyZCwgY2gpOworCQkvLyBFVkVOVF9GQUxDX0FCTk9STUFMCisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCkpIHwgRk1SMl9QTEIpOworCQlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfVDEpIHsKKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI0LCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SNCwgY2gpKSB8IEZNUjRfVE0pOworCQl9IGVsc2UgeworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjUsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI1LCBjaCkpIHwgWFNQX1RUMCk7CisJCX0KKwkJZmFsY19vcGVuX2FsbF90aW1lc2xvdHMoY2FyZCwgY2gpOworCQlwZmFsYy0+bG9vcF9hY3RpdmUgPSAyOworCX0gZWxzZSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIyLCBjaCkpICYgfkZNUjJfUExCKTsKKwkJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX1QxKSB7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SNCwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjQsIGNoKSkgJiB+Rk1SNF9UTSk7CisJCX0gZWxzZSB7CisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SNSwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjUsIGNoKSkgJiB+WFNQX1RUMCk7CisJCX0KKwkJcGZhbGMtPnN5bmMgPSAwOworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyKSAmCisJCQkgICB+KENQTERfUkVHMl9GQUxDX0xFRDIgPDwgKDIgKiBjaCkpKTsKKwkJcGZhbGMtPmFjdGl2ZSA9IDA7CisJCWZhbGNfaXNzdWVfY21kKGNhcmQsIGNoLCBDTURSX1hSRVMpOworCQlwZmFsYy0+bG9vcF9hY3RpdmUgPSAwOworCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB0dXJuX29mZl94bHUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVzY3JpcHRpb246CVR1cm5zIFhMVSBiaXQgb2ZmIGluIHRoZSBwcm9wZXIgcmVnaXN0ZXIKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIHR1cm5fb2ZmX3hsdShwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlwYzMwMGNoY29uZl90ICpjb25mID0gKHBjMzAwY2hjb25mX3QgKikgJiBjaGFuLT5jb25mOworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKworCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9UMSkgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SNSwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SNSwgY2gpKSAmIH5GTVI1X1hMVSk7CisJfSBlbHNlIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjMsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjMsIGNoKSkgJiB+Rk1SM19YTFUpOworCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB0dXJuX29mZl94bGQKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVzY3JpcHRpb246IFR1cm5zIFhMRCBiaXQgb2ZmIGluIHRoZSBwcm9wZXIgcmVnaXN0ZXIKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIHR1cm5fb2ZmX3hsZChwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlwYzMwMGNoY29uZl90ICpjb25mID0gKHBjMzAwY2hjb25mX3QgKikgJiBjaGFuLT5jb25mOworCXZvaWQgX19pb21lbSAqZmFsY2Jhc2UgPSBjYXJkLT5ody5mYWxjYmFzZTsKKworCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9UMSkgeworCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoRk1SNSwgY2gpLAorCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRk1SNSwgY2gpKSAmIH5GTVI1X1hMRCk7CisJfSBlbHNlIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjMsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjMsIGNoKSkgJiB+Rk1SM19YTEQpOworCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBmYWxjX2dlbmVyYXRlX2xvb3BfdXBfY29kZQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZXNjcmlwdGlvbjoJVGhpcyByb3V0aW5lIHdyaXRlcyB0aGUgcHJvcGVyIEZBTEMgY2hpcCByZWdpc3RlciBpbiBvcmRlcgorICoJCXRvIGdlbmVyYXRlIGEgTE9PUCBhY3RpdmF0aW9uIGNvZGUgb3ZlciBhIFQxL0UxIGxpbmUuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBmYWxjX2dlbmVyYXRlX2xvb3BfdXBfY29kZShwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlwYzMwMGNoY29uZl90ICpjb25mID0gKHBjMzAwY2hjb25mX3QgKikgJiBjaGFuLT5jb25mOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisKKwlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfVDEpIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjUsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjUsIGNoKSkgfCBGTVI1X1hMVSk7CisJfSBlbHNlIHsKKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKEZNUjMsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZNUjMsIGNoKSkgfCBGTVIzX1hMVSk7CisJfQorCS8vIEVWRU5UX0ZBTENfQUJOT1JNQUwKKwlpZiAoY29uZi0+bWVkaWEgPT0gSUZfSUZBQ0VfVDEpIHsKKwkJLyogRGlzYWJsZSB0aGlzIGludGVycnVwdCBhcyBpdCBtYXkgb3RoZXJ3aXNlIGludGVyZmVyZSB3aXRoIAorCQkgKiBvdGhlciB3b3JraW5nIGJvYXJkcy4gKi8KKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjAsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjAsIGNoKSkgfCBJTVIwX1BERU4pOworCX0KKwlmYWxjX2Rpc2FibGVfY29tbShjYXJkLCBjaCk7CisJLy8gRVZFTlRfRkFMQ19BQk5PUk1BTAorCXBmYWxjLT5sb29wX2dlbiA9IDE7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZmFsY19nZW5lcmF0ZV9sb29wX2Rvd25fY29kZQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEZXNjcmlwdGlvbjoJVGhpcyByb3V0aW5lIHdyaXRlcyB0aGUgcHJvcGVyIEZBTEMgY2hpcCByZWdpc3RlciBpbiBvcmRlcgorICoJCXRvIGdlbmVyYXRlIGEgTE9PUCBkZWFjdGl2YXRpb24gY29kZSBvdmVyIGEgVDEvRTEgbGluZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIGZhbGNfZ2VuZXJhdGVfbG9vcF9kb3duX2NvZGUocGMzMDBfdCAqIGNhcmQsIGludCBjaCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJcGMzMDBjaGNvbmZfdCAqY29uZiA9IChwYzMwMGNoY29uZl90ICopICYgY2hhbi0+Y29uZjsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCisJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX1QxKSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI1LCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVI1LCBjaCkpIHwgRk1SNV9YTEQpOworCX0gZWxzZSB7CisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIzLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGTVIzLCBjaCkpIHwgRk1SM19YTEQpOworCX0KKwlwZmFsYy0+c3luYyA9IDA7CisJY3BjX3dyaXRlYihmYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMiwKKwkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgY2FyZC0+aHcuY3BsZF9yZWcyKSAmCisJCSAgIH4oQ1BMRF9SRUcyX0ZBTENfTEVEMiA8PCAoMiAqIGNoKSkpOworCXBmYWxjLT5hY3RpdmUgPSAwOworLy8/ICAgIGZhbGNfaXNzdWVfY21kKGNhcmQsIGNoLCBDTURSX1hSRVMpOworCXBmYWxjLT5sb29wX2dlbiA9IDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZmFsY19wYXR0ZXJuX3Rlc3QKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVzY3JpcHRpb246CVRoaXMgcm91dGluZSBnZW5lcmF0ZXMgYSBwYXR0ZXJuIGNvZGUgYW5kIGNoZWNrcworICoJCWl0IG9uIHRoZSByZWNlcHRpb24gc2lkZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit2b2lkIGZhbGNfcGF0dGVybl90ZXN0KHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gsIHVuc2lnbmVkIGludCBhY3RpdmF0ZSkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopICYgY2FyZC0+Y2hhbltjaF07CisJcGMzMDBjaGNvbmZfdCAqY29uZiA9IChwYzMwMGNoY29uZl90ICopICYgY2hhbi0+Y29uZjsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCisJaWYgKGFjdGl2YXRlKSB7CisJCXBmYWxjLT5wcmJzID0gMTsKKwkJcGZhbGMtPmJlYyA9IDA7CisJCWlmIChjb25mLT5tZWRpYSA9PSBJRl9JRkFDRV9UMSkgeworCQkJLyogRGlzYWJsZSBsb2NhbCBsb29wIGFjdGl2YXRpb24vZGVhY3RpdmF0aW9uIGRldGVjdCAqLworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjMsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIzLCBjaCkpIHwgSU1SM19MTEJTQyk7CisJCX0gZWxzZSB7CisJCQkvKiBEaXNhYmxlIGxvY2FsIGxvb3AgYWN0aXZhdGlvbi9kZWFjdGl2YXRpb24gZGV0ZWN0ICovCisJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SMSwgY2gpLAorCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjEsIGNoKSkgfCBJTVIxX0xMQlNDKTsKKwkJfQorCQkvKiBBY3RpdmF0ZXMgZ2VuZXJhdGlvbiBhbmQgbW9uaXRvcmluZyBvZiBQUkJTIAorCQkgKiAoUHNldWRvIFJhbmRvbSBCaXQgU2VxdWVuY2UpICovCisJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhMQ1IxLCBjaCksCisJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMQ1IxLCBjaCkpIHwgTENSMV9FUFJNIHwgTENSMV9YUFJCUyk7CisJfSBlbHNlIHsKKwkJcGZhbGMtPnByYnMgPSAwOworCQkvKiBEZWFjdGl2YXRlcyBnZW5lcmF0aW9uIGFuZCBtb25pdG9yaW5nIG9mIFBSQlMgCisJCSAqIChQc2V1ZG8gUmFuZG9tIEJpdCBTZXF1ZW5jZSkgKi8KKwkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKExDUjEsIGNoKSwKKwkJCSAgIGNwY19yZWFkYihmYWxjYmFzZStGX1JFRyhMQ1IxLGNoKSkgJiB+KExDUjFfRVBSTSB8IExDUjFfWFBSQlMpKTsKKwkJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX1QxKSB7CisJCQkvKiBFbmFibGUgbG9jYWwgbG9vcCBhY3RpdmF0aW9uL2RlYWN0aXZhdGlvbiBkZXRlY3QgKi8KKwkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIzLCBjaCksCisJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoSU1SMywgY2gpKSAmIH5JTVIzX0xMQlNDKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEVuYWJsZSBsb2NhbCBsb29wIGFjdGl2YXRpb24vZGVhY3RpdmF0aW9uIGRldGVjdCAqLworCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKElNUjEsIGNoKSwKKwkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIxLCBjaCkpICYgfklNUjFfTExCU0MpOworCQl9CisJfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGZhbGNfcGF0dGVybl90ZXN0X2Vycm9yCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlc2NyaXB0aW9uOglUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgYml0IGVycm9yIGNvdW50ZXIgdmFsdWUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCit1Y3Nob3J0IGZhbGNfcGF0dGVybl90ZXN0X2Vycm9yKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKworCXJldHVybiAocGZhbGMtPmJlYyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiAgIE5ldCBJbnRlcmZhY2UgUm91dGluZXMgICAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2NwY190cmFjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX21haW4sIGNoYXIgcnhfdHgpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlmICgoc2tiID0gZGV2X2FsbG9jX3NrYigxMCArIHNrYl9tYWluLT5sZW4pKSA9PSBOVUxMKSB7CisJCXByaW50aygiJXM6IG91dCBvZiBtZW1vcnlcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJc2tiX3B1dChza2IsIDEwICsgc2tiX21haW4tPmxlbik7CisKKwlza2ItPmRldiA9IGRldjsKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQ1VTVCk7CisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKKwlza2ItPmxlbiA9IDEwICsgc2tiX21haW4tPmxlbjsKKworCW1lbWNweShza2ItPmRhdGEsIGRldi0+bmFtZSwgNSk7CisJc2tiLT5kYXRhWzVdID0gJ1snOworCXNrYi0+ZGF0YVs2XSA9IHJ4X3R4OworCXNrYi0+ZGF0YVs3XSA9ICddJzsKKwlza2ItPmRhdGFbOF0gPSAnOic7CisJc2tiLT5kYXRhWzldID0gJyAnOworCW1lbWNweSgmc2tiLT5kYXRhWzEwXSwgc2tiX21haW4tPmRhdGEsIHNrYl9tYWluLT5sZW4pOworCisJbmV0aWZfcngoc2tiKTsKK30KKwordm9pZCBjcGNfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBjMzAwZGV2X3QgKmQgPSAocGMzMDBkZXZfdCAqKSBkZXYtPnByaXY7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSBkLT5jaGFuOworCXBjMzAwX3QgKmNhcmQgPSAocGMzMDBfdCAqKSBjaGFuLT5jYXJkOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwlpbnQgY2ggPSBjaGFuLT5jaGFubmVsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdWNjaGFyIGlsYXI7CisKKwlzdGF0cy0+dHhfZXJyb3JzKys7CisJc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJQ1BDX0xPQ0soY2FyZCwgZmxhZ3MpOworCWlmICgoaWxhciA9IGNwY19yZWFkYihjYXJkLT5ody5zY2FiYXNlICsgSUxBUikpICE9IDApIHsKKwkJcHJpbnRrKCIlczogSUxBUj0weCV4XG4iLCBkZXYtPm5hbWUsIGlsYXIpOworCQljcGNfd3JpdGViKGNhcmQtPmh3LnNjYWJhc2UgKyBJTEFSLCBpbGFyKTsKKwkJY3BjX3dyaXRlYihjYXJkLT5ody5zY2FiYXNlICsgRE1FUiwgMHg4MCk7CisJfQorCWlmIChjYXJkLT5ody50eXBlID09IFBDMzAwX1RFKSB7CisJCWNwY193cml0ZWIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIsCisJCQkgICBjcGNfcmVhZGIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIpICYKKwkJCSAgIH4oQ1BMRF9SRUcyX0ZBTENfTEVEMSA8PCAoMiAqIGNoKSkpOworCX0KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlDUENfVU5MT0NLKGNhcmQsIGZsYWdzKTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9CisKK2ludCBjcGNfcXVldWVfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBjMzAwZGV2X3QgKmQgPSAocGMzMDBkZXZfdCAqKSBkZXYtPnByaXY7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSBkLT5jaGFuOworCXBjMzAwX3QgKmNhcmQgPSAocGMzMDBfdCAqKSBjaGFuLT5jYXJkOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwlpbnQgY2ggPSBjaGFuLT5jaGFubmVsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjaWZkZWYgUEMzMDBfREVCVUdfVFgKKwlpbnQgaTsKKyNlbmRpZgorCisJaWYgKGNoYW4tPmNvbmYubW9uaXRvcikgeworCQkvKiBJbiBtb25pdG9yIG1vZGUgbm8gVHggaXMgZG9uZTogaWdub3JlIHBhY2tldCAqLworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoIW5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQkvKiBEQ0QgbXVzdCBiZSBPRkY6IGRyb3AgcGFja2V0ICovCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJc3RhdHMtPnR4X2Vycm9ycysrOworCQlzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChjcGNfcmVhZGIoY2FyZC0+aHcuc2NhYmFzZSArIE1fUkVHKFNUMywgY2gpKSAmIFNUM19EQ0QpIHsKKwkJcHJpbnRrKCIlczogRENEIGlzIE9GRi4gR29pbmcgYWRtaW5pc3RyYXRpdmUgZG93bi5cbiIsIGRldi0+bmFtZSk7CisJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzKys7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwkJQ1BDX0xPQ0soY2FyZCwgZmxhZ3MpOworCQljcGNfd3JpdGViKGNhcmQtPmh3LnNjYWJhc2UgKyBNX1JFRyhDTUQsIGNoKSwgQ01EX1RYX0JVRl9DTFIpOworCQlpZiAoY2FyZC0+aHcudHlwZSA9PSBQQzMwMF9URSkgeworCQkJY3BjX3dyaXRlYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMiwKKwkJCQkgICBjcGNfcmVhZGIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIpICYgCisJCQkJICAgCQkJfihDUExEX1JFRzJfRkFMQ19MRUQxIDw8ICgyICogY2gpKSk7CisJCX0KKwkJQ1BDX1VOTE9DSyhjYXJkLCBmbGFncyk7CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogV3JpdGUgYnVmZmVyIHRvIERNQSBidWZmZXJzICovCisJaWYgKGRtYV9idWZfd3JpdGUoY2FyZCwgY2gsICh1Y2NoYXIgKikgc2tiLT5kYXRhLCBza2ItPmxlbikgIT0gMCkgeworLy8JCXByaW50aygiJXM6IHdyaXRlIGVycm9yLiBEcm9wcGluZyBUWCBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJc3RhdHMtPnR4X2Vycm9ycysrOworCQlzdGF0cy0+dHhfZHJvcHBlZCsrOworCQlyZXR1cm4gMDsKKwl9CisjaWZkZWYgUEMzMDBfREVCVUdfVFgKKwlwcmludGsoIiVzIFQ6IiwgZGV2LT5uYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2tiLT5sZW47IGkrKykKKwkJcHJpbnRrKCIgJTAyeCIsICooc2tiLT5kYXRhICsgaSkpOworCXByaW50aygiXG4iKTsKKyNlbmRpZgorCisJaWYgKGQtPnRyYWNlX29uKSB7CisJCWNwY190cmFjZShkZXYsIHNrYiwgJ1QnKTsKKwl9CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwkvKiBTdGFydCB0cmFuc21pc3Npb24gKi8KKwlDUENfTE9DSyhjYXJkLCBmbGFncyk7CisJLyogdmVyaWZ5IGlmIGl0IGhhcyBtb3JlIHRoYW4gb25lIGZyZWUgZGVzY3JpcHRvciAqLworCWlmIChjYXJkLT5jaGFuW2NoXS5uZnJlZV90eF9iZCA8PSAxKSB7CisJCS8qIGRvbid0IGhhdmUgc28gc3RvcCB0aGUgcXVldWUgKi8KKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCX0KKwljcGNfd3JpdGVsKGNhcmQtPmh3LnNjYWJhc2UgKyBEVFhfUkVHKEVEQUwsIGNoKSwKKwkJICAgVFhfQkRfQUREUihjaCwgY2hhbi0+dHhfbmV4dF9iZCkpOworCWNwY193cml0ZWIoY2FyZC0+aHcuc2NhYmFzZSArIE1fUkVHKENNRCwgY2gpLCBDTURfVFhfRU5BKTsKKwljcGNfd3JpdGViKGNhcmQtPmh3LnNjYWJhc2UgKyBEU1JfVFgoY2gpLCBEU1JfREUpOworCWlmIChjYXJkLT5ody50eXBlID09IFBDMzAwX1RFKSB7CisJCWNwY193cml0ZWIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIsCisJCQkgICBjcGNfcmVhZGIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIpIHwKKwkJCSAgIChDUExEX1JFRzJfRkFMQ19MRUQxIDw8ICgyICogY2gpKSk7CisJfQorCUNQQ19VTkxPQ0soY2FyZCwgZmxhZ3MpOworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGNwY19uZXRfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwYzMwMGRldl90ICpkID0gKHBjMzAwZGV2X3QgKikgZGV2LT5wcml2OworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgZC0+Y2hhbjsKKwlwYzMwMF90ICpjYXJkID0gKHBjMzAwX3QgKikgY2hhbi0+Y2FyZDsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldik7CisJaW50IGNoID0gY2hhbi0+Y2hhbm5lbDsKKyNpZmRlZiBQQzMwMF9ERUJVR19SWAorCWludCBpOworI2VuZGlmCisJaW50IHJ4YjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKChyeGIgPSBkbWFfZ2V0X3J4X2ZyYW1lX3NpemUoY2FyZCwgY2gpKSA9PSAtMSkKKwkJCXJldHVybjsKKworCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQkJLyogRENEIG11c3QgYmUgT0ZGOiBkcm9wIHBhY2tldCAqLworCQkgICAgcHJpbnRrKCIlcyA6IERDRCBpcyBPRkYgLSBkcm9wICVkIHJ4IGJ5dGVzXG4iLCBkZXYtPm5hbWUsIHJ4Yik7IAorCQkJc2tiID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCWlmIChyeGIgPiAoZGV2LT5tdHUgKyA0MCkpIHsgLyogYWRkIGhlYWRlcnMgKi8KKwkJCQlwcmludGsoIiVzIDogTVRVIGV4Y2VlZGVkICVkXG4iLCBkZXYtPm5hbWUsIHJ4Yik7IAorCQkJCXNrYiA9IE5VTEw7CisJCQl9IGVsc2UgeworCQkJCXNrYiA9IGRldl9hbGxvY19za2IocnhiKTsKKwkJCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCQkJcHJpbnRrKCIlczogTWVtb3J5IHNxdWVlemUhIVxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCX0KKwkJfQorCisJCWlmICgoKHJ4YiA9IGRtYV9idWZfcmVhZChjYXJkLCBjaCwgc2tiKSkgPD0gMCkgfHwgKHNrYiA9PSBOVUxMKSkgeworI2lmZGVmIFBDMzAwX0RFQlVHX1JYCisJCQlwcmludGsoIiVzOiByeGIgPSAleFxuIiwgZGV2LT5uYW1lLCByeGIpOworI2VuZGlmCisJCQlpZiAoKHNrYiA9PSBOVUxMKSAmJiAocnhiID4gMCkpIHsKKwkJCQkvKiByeGIgPiBkZXYtPm10dSAqLworCQkJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJCQlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycysrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAocnhiIDwgMCkgewkvKiBJbnZhbGlkIGZyYW1lICovCisJCQkJcnhiID0gLXJ4YjsKKwkJCQlpZiAocnhiICYgRFNUX09WUikgeworCQkJCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCQkJCXN0YXRzLT5yeF9maWZvX2Vycm9ycysrOworCQkJCX0KKwkJCQlpZiAocnhiICYgRFNUX0NSQykgeworCQkJCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCQkJCXN0YXRzLT5yeF9jcmNfZXJyb3JzKys7CisJCQkJfQorCQkJCWlmIChyeGIgJiAoRFNUX1JCSVQgfCBEU1RfU0hSVCB8IERTVF9BQlQpKSB7CisJCQkJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJCQkJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCX0KKwkJCX0KKwkJCWlmIChza2IpIHsKKwkJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlzdGF0cy0+cnhfYnl0ZXMgKz0gcnhiOworCisjaWZkZWYgUEMzMDBfREVCVUdfUlgKKwkJcHJpbnRrKCIlcyBSOiIsIGRldi0+bmFtZSk7CisJCWZvciAoaSA9IDA7IGkgPCBza2ItPmxlbjsgaSsrKQorCQkJcHJpbnRrKCIgJTAyeCIsICooc2tiLT5kYXRhICsgaSkpOworCQlwcmludGsoIlxuIik7CisjZW5kaWYKKwkJaWYgKGQtPnRyYWNlX29uKSB7CisJCQljcGNfdHJhY2UoZGV2LCBza2IsICdSJyk7CisJCX0KKwkJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwkJc2tiLT5wcm90b2NvbCA9IGhkbGNfdHlwZV90cmFucyhza2IsIGRldik7CisJCW5ldGlmX3J4KHNrYik7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiAgIFBDMzAwIEludGVycnVwdCBSb3V0aW5lcyAgICoqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBzY2FfdHhfaW50cihwYzMwMGRldl90ICpkZXYpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKWRldi0+Y2hhbjsgCisJcGMzMDBfdCAqY2FyZCA9IChwYzMwMF90ICopY2hhbi0+Y2FyZDsgCisJaW50IGNoID0gY2hhbi0+Y2hhbm5lbDsgCisJdm9sYXRpbGUgcGNzY2FfYmRfdCBfX2lvbWVtICogcHRkZXNjcjsgCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYtPmRldik7CisKKyAgICAvKiBDbGVhbiB1cCBkZXNjcmlwdG9ycyBmcm9tIHByZXZpb3VzIHRyYW5zbWlzc2lvbiAqLworCXB0ZGVzY3IgPSAoY2FyZC0+aHcucmFtYmFzZSArCisJCQkJCQlUWF9CRF9BRERSKGNoLGNoYW4tPnR4X2ZpcnN0X2JkKSk7CisJd2hpbGUgKChjcGNfcmVhZGwoY2FyZC0+aHcuc2NhYmFzZSArIERUWF9SRUcoQ0RBTCxjaCkpICE9IAorCQkJCQkJCVRYX0JEX0FERFIoY2gsY2hhbi0+dHhfZmlyc3RfYmQpKSAmJiAKKwkJCShjcGNfcmVhZGIoJnB0ZGVzY3ItPnN0YXR1cykgJiBEU1RfT1NCKSkgeworCQlzdGF0cy0+dHhfcGFja2V0cysrOworCQlzdGF0cy0+dHhfYnl0ZXMgKz0gY3BjX3JlYWR3KCZwdGRlc2NyLT5sZW4pOworCQljcGNfd3JpdGViKCZwdGRlc2NyLT5zdGF0dXMsIERTVF9PU0IpOworCQljcGNfd3JpdGV3KCZwdGRlc2NyLT5sZW4sIDApOworCQljaGFuLT5uZnJlZV90eF9iZCsrOworCQljaGFuLT50eF9maXJzdF9iZCA9IChjaGFuLT50eF9maXJzdF9iZCArIDEpICYgKE5fRE1BX1RYX0JVRiAtIDEpOworCQlwdGRlc2NyID0gKGNhcmQtPmh3LnJhbWJhc2UgKyBUWF9CRF9BRERSKGNoLGNoYW4tPnR4X2ZpcnN0X2JkKSk7CisgICAgfQorCisjaWZkZWYgQ09ORklHX1BDMzAwX01MUFBQCisJaWYgKGNoYW4tPmNvbmYucHJvdG8gPT0gUEMzMDBfUFJPVE9fTUxQUFApIHsKKwkJCWNwY190dHlfdHJpZ2dlcl9wb2xsKGRldik7CisJfSBlbHNlIHsKKyNlbmRpZgorCS8qIFRlbGwgdGhlIHVwcGVyIGxheWVyIHdlIGFyZSByZWFkeSB0byB0cmFuc21pdCBtb3JlIHBhY2tldHMgKi8KKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYtPmRldik7CisjaWZkZWYgQ09ORklHX1BDMzAwX01MUFBQCisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHNjYV9pbnRyKHBjMzAwX3QgKiBjYXJkKQoreworCXZvaWQgX19pb21lbSAqc2NhYmFzZSA9IGNhcmQtPmh3LnNjYWJhc2U7CisJdm9sYXRpbGUgdWNsb25nIHN0YXR1czsKKwlpbnQgY2g7CisJaW50IGludHJfY291bnQgPSAwOworCXVuc2lnbmVkIGNoYXIgZHNyX3J4OworCisJd2hpbGUgKChzdGF0dXMgPSBjcGNfcmVhZGwoc2NhYmFzZSArIElTUjApKSAhPSAwKSB7CisJCWZvciAoY2ggPSAwOyBjaCA8IGNhcmQtPmh3Lm5jaGFuOyBjaCsrKSB7CisJCQlwYzMwMGNoX3QgKmNoYW4gPSAmY2FyZC0+Y2hhbltjaF07CisJCQlwYzMwMGRldl90ICpkID0gJmNoYW4tPmQ7CisJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZC0+ZGV2OworCQkJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCisJCQlzcGluX2xvY2soJmNhcmQtPmNhcmRfbG9jayk7CisKKwkgICAgLyoqKiogUmVjZXB0aW9uICoqKiovCisJCQlpZiAoc3RhdHVzICYgSVIwX0RSWCgoSVIwX0RNSUEgfCBJUjBfRE1JQiksIGNoKSkgeworCQkJCXVjY2hhciBkcnhfc3RhdCA9IGNwY19yZWFkYihzY2FiYXNlICsgRFNSX1JYKGNoKSk7CisKKwkJCQkvKiBDbGVhciBSWCBpbnRlcnJ1cHRzICovCisJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgRFNSX1JYKGNoKSwgZHJ4X3N0YXQgfCBEU1JfRFdFKTsKKworI2lmZGVmIFBDMzAwX0RFQlVHX0lOVFIKKwkJCQlwcmludGsgKCJzY2FfaW50cjogUlggaW50ciBjaGFuWyVkXSAoc3Q9MHglMDhseCwgZHNyPTB4JTAyeClcbiIsCisJCQkJCSBjaCwgc3RhdHVzLCBkcnhfc3RhdCk7CisjZW5kaWYKKwkJCQlpZiAoc3RhdHVzICYgSVIwX0RSWChJUjBfRE1JQSwgY2gpKSB7CisJCQkJCWlmIChkcnhfc3RhdCAmIERTUl9CT0YpIHsKKyNpZmRlZiBDT05GSUdfUEMzMDBfTUxQUFAKKwkJCQkJCWlmIChjaGFuLT5jb25mLnByb3RvID09IFBDMzAwX1BST1RPX01MUFBQKSB7CisJCQkJCQkJLyogdmVyaWZ5IGlmIGRyaXZlciBpcyBUVFkgKi8KKwkJCQkJCQlpZiAoKGNwY19yZWFkYihzY2FiYXNlICsgRFNSX1JYKGNoKSkgJiBEU1JfREUpKSB7CisJCQkJCQkJCXJ4X2RtYV9zdG9wKGNhcmQsIGNoKTsKKwkJCQkJCQl9CisJCQkJCQkJY3BjX3R0eV9yZWNlaXZlKGQpOworCQkJCQkJCXJ4X2RtYV9zdGFydChjYXJkLCBjaCk7CisJCQkJCQl9IGVsc2UgCisjZW5kaWYKKwkJCQkJCXsKKwkJCQkJCQlpZiAoKGNwY19yZWFkYihzY2FiYXNlICsgRFNSX1JYKGNoKSkgJiBEU1JfREUpKSB7CisJCQkJCQkJCXJ4X2RtYV9zdG9wKGNhcmQsIGNoKTsKKwkJCQkJCQl9CisJCQkJCQkJY3BjX25ldF9yeChkZXYpOworCQkJCQkJCS8qIERpc2NhcmQgaW52YWxpZCBmcmFtZXMgKi8KKwkJCQkJCQloZGxjLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQkJCQloZGxjLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCQkJCQkJCWNoYW4tPnJ4X2ZpcnN0X2JkID0gMDsKKwkJCQkJCQljaGFuLT5yeF9sYXN0X2JkID0gTl9ETUFfUlhfQlVGIC0gMTsKKwkJCQkJCQlyeF9kbWFfc3RhcnQoY2FyZCwgY2gpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmIChzdGF0dXMgJiBJUjBfRFJYKElSMF9ETUlCLCBjaCkpIHsKKwkJCQkJaWYgKGRyeF9zdGF0ICYgRFNSX0VPTSkgeworCQkJCQkJaWYgKGNhcmQtPmh3LnR5cGUgPT0gUEMzMDBfVEUpIHsKKwkJCQkJCQljcGNfd3JpdGViKGNhcmQtPmh3LmZhbGNiYXNlICsKKwkJCQkJCQkJICAgY2FyZC0+aHcuY3BsZF9yZWcyLAorCQkJCQkJCQkgICBjcGNfcmVhZGIgKGNhcmQtPmh3LmZhbGNiYXNlICsKKwkJCQkJCQkJICAgIAljYXJkLT5ody5jcGxkX3JlZzIpIHwKKwkJCQkJCQkJICAgKENQTERfUkVHMl9GQUxDX0xFRDEgPDwgKDIgKiBjaCkpKTsKKwkJCQkJCX0KKyNpZmRlZiBDT05GSUdfUEMzMDBfTUxQUFAKKwkJCQkJCWlmIChjaGFuLT5jb25mLnByb3RvID09IFBDMzAwX1BST1RPX01MUFBQKSB7CisJCQkJCQkJLyogdmVyaWZ5IGlmIGRyaXZlciBpcyBUVFkgKi8KKwkJCQkJCQljcGNfdHR5X3JlY2VpdmUoZCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWNwY19uZXRfcngoZGV2KTsKKwkJCQkJCX0KKyNlbHNlCisJCQkJCQljcGNfbmV0X3J4KGRldik7CisjZW5kaWYKKwkJCQkJCWlmIChjYXJkLT5ody50eXBlID09IFBDMzAwX1RFKSB7CisJCQkJCQkJY3BjX3dyaXRlYihjYXJkLT5ody5mYWxjYmFzZSArCisJCQkJCQkJCSAgIGNhcmQtPmh3LmNwbGRfcmVnMiwKKwkJCQkJCQkJICAgY3BjX3JlYWRiIChjYXJkLT5ody5mYWxjYmFzZSArCisJCQkJCQkJCSAgICAJCWNhcmQtPmh3LmNwbGRfcmVnMikgJgorCQkJCQkJCQkgICB+IChDUExEX1JFRzJfRkFMQ19MRUQxIDw8ICgyICogY2gpKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKCEoZHNyX3J4ID0gY3BjX3JlYWRiKHNjYWJhc2UgKyBEU1JfUlgoY2gpKSAmIERTUl9ERSkpIHsKKyNpZmRlZiBQQzMwMF9ERUJVR19JTlRSCisJCXByaW50aygiJXM6IFJYIGludHIgY2hhblslZF0gKHN0PTB4JTA4bHgsIGRzcj0weCUwMngsIGRzcjI9MHglMDJ4KVxuIiwKKwkJCWRldi0+bmFtZSwgY2gsIHN0YXR1cywgZHJ4X3N0YXQsIGRzcl9yeCk7CisjZW5kaWYKKwkJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgRFNSX1JYKGNoKSwgKGRzcl9yeCB8IERTUl9ERSkgJiAweGZlKTsKKwkJCQl9CisJCQl9CisKKwkgICAgLyoqKiogVHJhbnNtaXNzaW9uICoqKiovCisJCQlpZiAoc3RhdHVzICYgSVIwX0RUWCgoSVIwX0VGVCB8IElSMF9ETUlBIHwgSVIwX0RNSUIpLCBjaCkpIHsKKwkJCQl1Y2NoYXIgZHR4X3N0YXQgPSBjcGNfcmVhZGIoc2NhYmFzZSArIERTUl9UWChjaCkpOworCisJCQkJLyogQ2xlYXIgVFggaW50ZXJydXB0cyAqLworCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIERTUl9UWChjaCksIGR0eF9zdGF0IHwgRFNSX0RXRSk7CisKKyNpZmRlZiBQQzMwMF9ERUJVR19JTlRSCisJCQkJcHJpbnRrICgic2NhX2ludHI6IFRYIGludHIgY2hhblslZF0gKHN0PTB4JTA4bHgsIGRzcj0weCUwMngpXG4iLAorCQkJCQkgY2gsIHN0YXR1cywgZHR4X3N0YXQpOworI2VuZGlmCisJCQkJaWYgKHN0YXR1cyAmIElSMF9EVFgoSVIwX0VGVCwgY2gpKSB7CisJCQkJCWlmIChkdHhfc3RhdCAmIERTUl9VRFJGKSB7CisJCQkJCQlpZiAoY3BjX3JlYWRiIChzY2FiYXNlICsgTV9SRUcoVEJOLCBjaCkpICE9IDApIHsKKwkJCQkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhDTUQsY2gpLCBDTURfVFhfQlVGX0NMUik7CisJCQkJCQl9CisJCQkJCQlpZiAoY2FyZC0+aHcudHlwZSA9PSBQQzMwMF9URSkgeworCQkJCQkJCWNwY193cml0ZWIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIsCisJCQkJCQkJCSAgIGNwY19yZWFkYiAoY2FyZC0+aHcuZmFsY2Jhc2UgKyAKKwkJCQkJCQkJCQkgICBjYXJkLT5ody5jcGxkX3JlZzIpICYKKwkJCQkJCQkJICAgfiAoQ1BMRF9SRUcyX0ZBTENfTEVEMSA8PCAoMiAqIGNoKSkpOworCQkJCQkJfQorCQkJCQkJaGRsYy0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJCQloZGxjLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJCQkJc2NhX3R4X2ludHIoZCk7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKHN0YXR1cyAmIElSMF9EVFgoSVIwX0RNSUEsIGNoKSkgeworCQkJCQlpZiAoZHR4X3N0YXQgJiBEU1JfQk9GKSB7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKHN0YXR1cyAmIElSMF9EVFgoSVIwX0RNSUIsIGNoKSkgeworCQkJCQlpZiAoZHR4X3N0YXQgJiBEU1JfRU9NKSB7CisJCQkJCQlpZiAoY2FyZC0+aHcudHlwZSA9PSBQQzMwMF9URSkgeworCQkJCQkJCWNwY193cml0ZWIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIsCisJCQkJCQkJCSAgIGNwY19yZWFkYiAoY2FyZC0+aHcuZmFsY2Jhc2UgKworCQkJCQkJCQkgICAgCQkJY2FyZC0+aHcuY3BsZF9yZWcyKSAmCisJCQkJCQkJCSAgIH4gKENQTERfUkVHMl9GQUxDX0xFRDEgPDwgKDIgKiBjaCkpKTsKKwkJCQkJCX0KKwkJCQkJCXNjYV90eF9pbnRyKGQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJICAgIC8qKioqIE1TQ0kgKioqKi8KKwkJCWlmIChzdGF0dXMgJiBJUjBfTShJUjBfUlhJTlRBLCBjaCkpIHsKKwkJCQl1Y2NoYXIgc3QxID0gY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhTVDEsIGNoKSk7CisKKwkJCQkvKiBDbGVhciBNU0NJIGludGVycnVwdHMgKi8KKwkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhTVDEsIGNoKSwgc3QxKTsKKworI2lmZGVmIFBDMzAwX0RFQlVHX0lOVFIKKwkJCQlwcmludGsoInNjYV9pbnRyOiBNU0NJIGludHIgY2hhblslZF0gKHN0PTB4JTA4bHgsIHN0MT0weCUwMngpXG4iLAorCQkJCQkgY2gsIHN0YXR1cywgc3QxKTsKKyNlbmRpZgorCQkJCWlmIChzdDEgJiBTVDFfQ0RDRCkgewkvKiBEQ0QgY2hhbmdlZCAqLworCQkJCQlpZiAoY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhTVDMsIGNoKSkgJiBTVDNfRENEKSB7CisJCQkJCQlwcmludGsgKCIlczogRENEIGlzIE9GRi4gR29pbmcgYWRtaW5pc3RyYXRpdmUgZG93bi5cbiIsCisJCQkJCQkJIGRldi0+bmFtZSk7CisjaWZkZWYgQ09ORklHX1BDMzAwX01MUFBQCisJCQkJCQlpZiAoY2hhbi0+Y29uZi5wcm90byAhPSBQQzMwMF9QUk9UT19NTFBQUCkgeworCQkJCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJCQkJCQl9CisjZWxzZQorCQkJCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworI2VuZGlmCisJCQkJCQljYXJkLT5jaGFuW2NoXS5kLmxpbmVfb2ZmKys7CisJCQkJCX0gZWxzZSB7CS8qIERDRCA9IDEgKi8KKwkJCQkJCXByaW50ayAoIiVzOiBEQ0QgaXMgT04uIEdvaW5nIGFkbWluaXN0cmF0aXZlIHVwLlxuIiwKKwkJCQkJCQkgZGV2LT5uYW1lKTsKKyNpZmRlZiBDT05GSUdfUEMzMDBfTUxQUFAKKwkJCQkJCWlmIChjaGFuLT5jb25mLnByb3RvICE9IFBDMzAwX1BST1RPX01MUFBQKQorCQkJCQkJCS8qIHZlcmlmeSBpZiBkcml2ZXIgaXMgbm90IFRUWSAqLworI2VuZGlmCisJCQkJCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQkJCQkJY2FyZC0+Y2hhbltjaF0uZC5saW5lX29uKys7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlzcGluX3VubG9jaygmY2FyZC0+Y2FyZF9sb2NrKTsKKwkJfQorCQlpZiAoKytpbnRyX2NvdW50ID09IDEwKQorCQkJLyogVG9vIG11Y2ggd29yayBhdCB0aGlzIGJvYXJkLiBGb3JjZSBleGl0ICovCisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZhbGNfdDFfbG9vcF9kZXRlY3Rpb24ocGMzMDBfdCAqIGNhcmQsIGludCBjaCwgdWNjaGFyIGZyczEpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisKKwlpZiAoKChjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMQ1IxLCBjaCkpICYgTENSMV9YUFJCUykgPT0gMCkgJiYKKwkgICAgIXBmYWxjLT5sb29wX2dlbikgeworCQlpZiAoZnJzMSAmIEZSUzFfTExCREQpIHsKKwkJCS8vIEEgTGluZSBMb29wIEJhY2sgRGVhY3RpdmF0aW9uIHNpZ25hbCBkZXRlY3RlZAorCQkJaWYgKHBmYWxjLT5sb29wX2FjdGl2ZSkgeworCQkJCWZhbGNfcmVtb3RlX2xvb3AoY2FyZCwgY2gsIDApOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKChmcnMxICYgRlJTMV9MTEJBRCkgJiYKKwkJCSAgICAoKGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKExDUjEsIGNoKSkgJiBMQ1IxX0VQUk0pID09IDApKSB7CisJCQkJLy8gQSBMaW5lIExvb3AgQmFjayBBY3RpdmF0aW9uIHNpZ25hbCBkZXRlY3RlZCAgCisJCQkJaWYgKCFwZmFsYy0+bG9vcF9hY3RpdmUpIHsKKwkJCQkJZmFsY19yZW1vdGVfbG9vcChjYXJkLCBjaCwgMSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBmYWxjX2UxX2xvb3BfZGV0ZWN0aW9uKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gsIHVjY2hhciByc3ApCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSAmIGNhcmQtPmNoYW5bY2hdOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKwl2b2lkIF9faW9tZW0gKmZhbGNiYXNlID0gY2FyZC0+aHcuZmFsY2Jhc2U7CisKKwlpZiAoKChjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhMQ1IxLCBjaCkpICYgTENSMV9YUFJCUykgPT0gMCkgJiYKKwkgICAgIXBmYWxjLT5sb29wX2dlbikgeworCQlpZiAocnNwICYgUlNQX0xMQkREKSB7CisJCQkvLyBBIExpbmUgTG9vcCBCYWNrIERlYWN0aXZhdGlvbiBzaWduYWwgZGV0ZWN0ZWQKKwkJCWlmIChwZmFsYy0+bG9vcF9hY3RpdmUpIHsKKwkJCQlmYWxjX3JlbW90ZV9sb29wKGNhcmQsIGNoLCAwKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICgocnNwICYgUlNQX0xMQkFEKSAmJgorCQkJICAgICgoY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoTENSMSwgY2gpKSAmIExDUjFfRVBSTSkgPT0gMCkpIHsKKwkJCQkvLyBBIExpbmUgTG9vcCBCYWNrIEFjdGl2YXRpb24gc2lnbmFsIGRldGVjdGVkICAKKwkJCQlpZiAoIXBmYWxjLT5sb29wX2FjdGl2ZSkgeworCQkJCQlmYWxjX3JlbW90ZV9sb29wKGNhcmQsIGNoLCAxKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZhbGNfdDFfaW50cihwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCXVjY2hhciBpc3IwLCBpc3IzLCBnaXM7CisJdWNjaGFyIGR1bW15OworCisJd2hpbGUgKChnaXMgPSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhHSVMsIGNoKSkpICE9IDApIHsKKwkJaWYgKGdpcyAmIEdJU19JU1IwKSB7CisJCQlpc3IwID0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRklTUjAsIGNoKSk7CisJCQlpZiAoaXNyMCAmIEZJU1IwX1BERU4pIHsKKwkJCQkvKiBSZWFkIHRoZSBiaXQgdG8gY2xlYXIgdGhlIHNpdHVhdGlvbiAqLworCQkJCWlmIChjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGUlMxLCBjaCkpICYKKwkJCQkgICAgRlJTMV9QREVOKSB7CisJCQkJCXBmYWxjLT5wZGVuKys7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGdpcyAmIEdJU19JU1IxKSB7CisJCQlkdW1teSA9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZJU1IxLCBjaCkpOworCQl9CisKKwkJaWYgKGdpcyAmIEdJU19JU1IyKSB7CisJCQlkdW1teSA9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZJU1IyLCBjaCkpOworCQl9CisKKwkJaWYgKGdpcyAmIEdJU19JU1IzKSB7CisJCQlpc3IzID0gY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRklTUjMsIGNoKSk7CisJCQlpZiAoaXNyMyAmIEZJU1IzX1NFQykgeworCQkJCXBmYWxjLT5zZWMrKzsKKwkJCQlmYWxjX3VwZGF0ZV9zdGF0cyhjYXJkLCBjaCk7CisJCQkJZmFsY19jaGVja19zdGF0dXMoY2FyZCwgY2gsCisJCQkJCQkgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZSUzAsIGNoKSkpOworCQkJfQorCQkJaWYgKGlzcjMgJiBGSVNSM19FUykgeworCQkJCXBmYWxjLT5lcysrOworCQkJfQorCQkJaWYgKGlzcjMgJiBGSVNSM19MTEJTQykgeworCQkJCWZhbGNfdDFfbG9vcF9kZXRlY3Rpb24oY2FyZCwgY2gsCisJCQkJCQkgICAgICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRlJTMSwgY2gpKSk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZhbGNfZTFfaW50cihwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgJiBjYXJkLT5jaGFuW2NoXTsKKwlmYWxjX3QgKnBmYWxjID0gKGZhbGNfdCAqKSAmIGNoYW4tPmZhbGM7CisJdm9pZCBfX2lvbWVtICpmYWxjYmFzZSA9IGNhcmQtPmh3LmZhbGNiYXNlOworCXVjY2hhciBpc3IxLCBpc3IyLCBpc3IzLCBnaXMsIHJzcDsKKwl1Y2NoYXIgZHVtbXk7CisKKwl3aGlsZSAoKGdpcyA9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEdJUywgY2gpKSkgIT0gMCkgeworCQlyc3AgPSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhSU1AsIGNoKSk7CisKKwkJaWYgKGdpcyAmIEdJU19JU1IwKSB7CisJCQlkdW1teSA9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZJU1IwLCBjaCkpOworCQl9CisJCWlmIChnaXMgJiBHSVNfSVNSMSkgeworCQkJaXNyMSA9IGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKEZJU1IxLCBjaCkpOworCQkJaWYgKGlzcjEgJiBGSVNSMV9YTUIpIHsKKwkJCQlpZiAoKHBmYWxjLT54bWJfY2F1c2UgJiAyKQorCQkJCSAgICAmJiBwZmFsYy0+bXVsdGlmcmFtZV9tb2RlKSB7CisJCQkJCWlmIChjcGNfcmVhZGIgKGZhbGNiYXNlICsgRl9SRUcoRlJTMCwgY2gpKSAmIAorCQkJCQkJCQkJKEZSUzBfTE9TIHwgRlJTMF9BSVMgfCBGUlMwX0xGQSkpIHsKKwkJCQkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYU1AsIGNoKSwKKwkJCQkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhYU1AsIGNoKSkKKwkJCQkJCQkgICAmIH5YU1BfQVhTKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYU1AsIGNoKSwKKwkJCQkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhYU1AsIGNoKSkKKwkJCQkJCQkgICB8IFhTUF9BWFMpOworCQkJCQl9CisJCQkJfQorCQkJCXBmYWxjLT54bWJfY2F1c2UgPSAwOworCQkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIxLCBjaCksCisJCQkJCSAgIGNwY19yZWFkYihmYWxjYmFzZSArIEZfUkVHKElNUjEsIGNoKSkgfCBJTVIxX1hNQik7CisJCQl9CisJCQlpZiAoaXNyMSAmIEZJU1IxX0xMQlNDKSB7CisJCQkJZmFsY19lMV9sb29wX2RldGVjdGlvbihjYXJkLCBjaCwgcnNwKTsKKwkJCX0KKwkJfQorCQlpZiAoZ2lzICYgR0lTX0lTUjIpIHsKKwkJCWlzcjIgPSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGSVNSMiwgY2gpKTsKKwkJCWlmIChpc3IyICYgRklTUjJfVDQwME1TKSB7CisJCQkJY3BjX3dyaXRlYihmYWxjYmFzZSArIEZfUkVHKFhTVywgY2gpLAorCQkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhYU1csIGNoKSkgfCBYU1dfWFJBKTsKKwkJCX0KKwkJCWlmIChpc3IyICYgRklTUjJfTUZBUikgeworCQkJCWNwY193cml0ZWIoZmFsY2Jhc2UgKyBGX1JFRyhYU1csIGNoKSwKKwkJCQkJICAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoWFNXLCBjaCkpICYgflhTV19YUkEpOworCQkJfQorCQkJaWYgKGlzcjIgJiAoRklTUjJfRkFSIHwgRklTUjJfTEZBIHwgRklTUjJfQUlTIHwgRklTUjJfTE9TKSkgeworCQkJCXBmYWxjLT54bWJfY2F1c2UgfD0gMjsKKwkJCQljcGNfd3JpdGViKGZhbGNiYXNlICsgRl9SRUcoSU1SMSwgY2gpLAorCQkJCQkgICBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhJTVIxLCBjaCkpICYgfklNUjFfWE1CKTsKKwkJCX0KKwkJfQorCQlpZiAoZ2lzICYgR0lTX0lTUjMpIHsKKwkJCWlzcjMgPSBjcGNfcmVhZGIoZmFsY2Jhc2UgKyBGX1JFRyhGSVNSMywgY2gpKTsKKwkJCWlmIChpc3IzICYgRklTUjNfU0VDKSB7CisJCQkJcGZhbGMtPnNlYysrOworCQkJCWZhbGNfdXBkYXRlX3N0YXRzKGNhcmQsIGNoKTsKKwkJCQlmYWxjX2NoZWNrX3N0YXR1cyhjYXJkLCBjaCwKKwkJCQkJCSAgY3BjX3JlYWRiKGZhbGNiYXNlICsgRl9SRUcoRlJTMCwgY2gpKSk7CisJCQl9CisJCQlpZiAoaXNyMyAmIEZJU1IzX0VTKSB7CisJCQkJcGZhbGMtPmVzKys7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZhbGNfaW50cihwYzMwMF90ICogY2FyZCkKK3sKKwlpbnQgY2g7CisKKwlmb3IgKGNoID0gMDsgY2ggPCBjYXJkLT5ody5uY2hhbjsgY2grKykgeworCQlwYzMwMGNoX3QgKmNoYW4gPSAmY2FyZC0+Y2hhbltjaF07CisJCXBjMzAwY2hjb25mX3QgKmNvbmYgPSAocGMzMDBjaGNvbmZfdCAqKSAmIGNoYW4tPmNvbmY7CisKKwkJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX1QxKSB7CisJCQlmYWxjX3QxX2ludHIoY2FyZCwgY2gpOworCQl9IGVsc2UgeworCQkJZmFsY19lMV9pbnRyKGNhcmQsIGNoKTsKKwkJfQorCX0KK30KKworc3RhdGljIGlycXJldHVybl90IGNwY19pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcGMzMDBfdCAqY2FyZDsKKwl2b2xhdGlsZSB1Y2NoYXIgcGx4X3N0YXR1czsKKworCWlmICgoY2FyZCA9IChwYzMwMF90ICopIGRldl9pZCkgPT0gMCkgeworI2lmZGVmIFBDMzAwX0RFQlVHX0lOVFIKKwkJcHJpbnRrKCJjcGNfaW50cjogc3B1cmlvdXMgaW50ciAlZFxuIiwgaXJxKTsKKyNlbmRpZgorCQlyZXR1cm4gSVJRX05PTkU7CQkvKiBzcHVyaW91cyBpbnRyICovCisJfQorCisJaWYgKGNhcmQtPmh3LnJhbWJhc2UgPT0gMCkgeworI2lmZGVmIFBDMzAwX0RFQlVHX0lOVFIKKwkJcHJpbnRrKCJjcGNfaW50cjogc3B1cmlvdXMgaW50cjIgJWRcbiIsIGlycSk7CisjZW5kaWYKKwkJcmV0dXJuIElSUV9OT05FOwkJLyogc3B1cmlvdXMgaW50ciAqLworCX0KKworCXN3aXRjaCAoY2FyZC0+aHcudHlwZSkgeworCQljYXNlIFBDMzAwX1JTVjoKKwkJY2FzZSBQQzMwMF9YMjE6CisJCQlzY2FfaW50cihjYXJkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUEMzMDBfVEU6CisJCQl3aGlsZSAoIChwbHhfc3RhdHVzID0gKGNwY19yZWFkYihjYXJkLT5ody5wbHhiYXNlICsgY2FyZC0+aHcuaW50Y3RsX3JlZykgJgorCQkJCSAoUExYXzkwNTBfTElOVDFfU1RBVFVTIHwgUExYXzkwNTBfTElOVDJfU1RBVFVTKSkpICE9IDApIHsKKwkJCQlpZiAocGx4X3N0YXR1cyAmIFBMWF85MDUwX0xJTlQxX1NUQVRVUykgewkvKiBTQ0EgSW50ZXJydXB0ICovCisJCQkJCXNjYV9pbnRyKGNhcmQpOworCQkJCX0KKwkJCQlpZiAocGx4X3N0YXR1cyAmIFBMWF85MDUwX0xJTlQyX1NUQVRVUykgewkvKiBGQUxDIEludGVycnVwdCAqLworCQkJCQlmYWxjX2ludHIoY2FyZCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKwordm9pZCBjcGNfc2NhX3N0YXR1cyhwYzMwMF90ICogY2FyZCwgaW50IGNoKQoreworCXVjY2hhciBpbGFyOworCXZvaWQgX19pb21lbSAqc2NhYmFzZSA9IGNhcmQtPmh3LnNjYWJhc2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXR4X2RtYV9idWZfY2hlY2soY2FyZCwgY2gpOworCXJ4X2RtYV9idWZfY2hlY2soY2FyZCwgY2gpOworCWlsYXIgPSBjcGNfcmVhZGIoc2NhYmFzZSArIElMQVIpOworCXByaW50ayAoIklMQVI9MHglMDJ4LCBXQ1JMPTB4JTAyeCwgUENSPTB4JTAyeCwgQlRDUj0weCUwMngsIEJPTFI9MHglMDJ4XG4iLAorCQkgaWxhciwgY3BjX3JlYWRiKHNjYWJhc2UgKyBXQ1JMKSwgY3BjX3JlYWRiKHNjYWJhc2UgKyBQQ1IpLAorCQkgY3BjX3JlYWRiKHNjYWJhc2UgKyBCVENSKSwgY3BjX3JlYWRiKHNjYWJhc2UgKyBCT0xSKSk7CisJcHJpbnRrKCJUWF9DREE9MHglMDh4LCBUWF9FREE9MHglMDh4XG4iLAorCSAgICAgICBjcGNfcmVhZGwoc2NhYmFzZSArIERUWF9SRUcoQ0RBTCwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRsKHNjYWJhc2UgKyBEVFhfUkVHKEVEQUwsIGNoKSkpOworCXByaW50aygiUlhfQ0RBPTB4JTA4eCwgUlhfRURBPTB4JTA4eCwgQkZMPTB4JTA0eFxuIiwKKwkgICAgICAgY3BjX3JlYWRsKHNjYWJhc2UgKyBEUlhfUkVHKENEQUwsIGNoKSksCisJICAgICAgIGNwY19yZWFkbChzY2FiYXNlICsgRFJYX1JFRyhFREFMLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZHcoc2NhYmFzZSArIERSWF9SRUcoQkZMTCwgY2gpKSk7CisJcHJpbnRrKCJETUVSPTB4JTAyeCwgRFNSX1RYPTB4JTAyeCwgRFNSX1JYPTB4JTAyeFxuIiwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBETUVSKSwgY3BjX3JlYWRiKHNjYWJhc2UgKyBEU1JfVFgoY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBEU1JfUlgoY2gpKSk7CisJcHJpbnRrKCJETVJfVFg9MHglMDJ4LCBETVJfUlg9MHglMDJ4LCBESVJfVFg9MHglMDJ4LCBESVJfUlg9MHglMDJ4XG4iLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIERNUl9UWChjaCkpLCBjcGNfcmVhZGIoc2NhYmFzZSArIERNUl9SWChjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIERJUl9UWChjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIERJUl9SWChjaCkpKTsKKwlwcmludGsoIkRDUl9UWD0weCUwMngsIERDUl9SWD0weCUwMngsIEZDVF9UWD0weCUwMngsIEZDVF9SWD0weCUwMnhcbiIsCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgRENSX1RYKGNoKSksIGNwY19yZWFkYihzY2FiYXNlICsgRENSX1JYKGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgRkNUX1RYKGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgRkNUX1JYKGNoKSkpOworCXByaW50aygiTUQwPTB4JTAyeCwgTUQxPTB4JTAyeCwgTUQyPTB4JTAyeCwgTUQzPTB4JTAyeCwgSURMPTB4JTAyeFxuIiwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhNRDAsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoTUQxLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKE1EMiwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhNRDMsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoSURMLCBjaCkpKTsKKwlwcmludGsoIkNNRD0weCUwMngsIFNBMD0weCUwMngsIFNBMT0weCUwMngsIFRGTj0weCUwMngsIENUTD0weCUwMnhcbiIsCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoQ01ELCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFNBMCwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhTQTEsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoVEZOLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKENUTCwgY2gpKSk7CisJcHJpbnRrKCJTVDA9MHglMDJ4LCBTVDE9MHglMDJ4LCBTVDI9MHglMDJ4LCBTVDM9MHglMDJ4LCBTVDQ9MHglMDJ4XG4iLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFNUMCwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhTVDEsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoU1QyLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFNUMywgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhTVDQsIGNoKSkpOworCXByaW50ayAoIkNTVDA9MHglMDJ4LCBDU1QxPTB4JTAyeCwgQ1NUMj0weCUwMngsIENTVDM9MHglMDJ4LCBGU1Q9MHglMDJ4XG4iLAorCQkgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhDU1QwLCBjaCkpLAorCQkgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhDU1QxLCBjaCkpLAorCQkgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhDU1QyLCBjaCkpLAorCQkgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhDU1QzLCBjaCkpLAorCQkgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhGU1QsIGNoKSkpOworCXByaW50aygiVFJDMD0weCUwMngsIFRSQzE9MHglMDJ4LCBSUkM9MHglMDJ4LCBUQk49MHglMDJ4LCBSQk49MHglMDJ4XG4iLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFRSQzAsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoVFJDMSwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhSUkMsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoVEJOLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFJCTiwgY2gpKSk7CisJcHJpbnRrKCJURlM9MHglMDJ4LCBUTlIwPTB4JTAyeCwgVE5SMT0weCUwMngsIFJOUj0weCUwMnhcbiIsCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoVEZTLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFROUjAsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoVE5SMSwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhSTlIsIGNoKSkpOworCXByaW50aygiVENSPTB4JTAyeCwgUkNSPTB4JTAyeCwgVE5SMT0weCUwMngsIFJOUj0weCUwMnhcbiIsCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoVENSLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFJDUiwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhUTlIxLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFJOUiwgY2gpKSk7CisJcHJpbnRrKCJUWFM9MHglMDJ4LCBSWFM9MHglMDJ4LCBFWFM9MHglMDJ4LCBUTUNUPTB4JTAyeCwgVE1DUj0weCUwMnhcbiIsCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoVFhTLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKFJYUywgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhFWFMsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoVE1DVCwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhUTUNSLCBjaCkpKTsKKwlwcmludGsoIklFMD0weCUwMngsIElFMT0weCUwMngsIElFMj0weCUwMngsIElFND0weCUwMngsIEZJRT0weCUwMnhcbiIsCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoSUUwLCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKElFMSwgY2gpKSwKKwkgICAgICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhJRTIsIGNoKSksCisJICAgICAgIGNwY19yZWFkYihzY2FiYXNlICsgTV9SRUcoSUU0LCBjaCkpLAorCSAgICAgICBjcGNfcmVhZGIoc2NhYmFzZSArIE1fUkVHKEZJRSwgY2gpKSk7CisJcHJpbnRrKCJJRVIwPTB4JTA4eFxuIiwgY3BjX3JlYWRsKHNjYWJhc2UgKyBJRVIwKSk7CisKKwlpZiAoaWxhciAhPSAwKSB7CisJCUNQQ19MT0NLKGNhcmQsIGZsYWdzKTsKKwkJY3BjX3dyaXRlYihzY2FiYXNlICsgSUxBUiwgaWxhcik7CisJCWNwY193cml0ZWIoc2NhYmFzZSArIERNRVIsIDB4ODApOworCQlDUENfVU5MT0NLKGNhcmQsIGZsYWdzKTsKKwl9Cit9CisKK3ZvaWQgY3BjX2ZhbGNfc3RhdHVzKHBjMzAwX3QgKiBjYXJkLCBpbnQgY2gpCit7CisJcGMzMDBjaF90ICpjaGFuID0gJmNhcmQtPmNoYW5bY2hdOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJQ1BDX0xPQ0soY2FyZCwgZmxhZ3MpOworCXByaW50aygiQ0glZDogICAlcyAlcyAgJWQgY2hhbm5lbHNcbiIsCisJICAgICAgIGNoLCAocGZhbGMtPnN5bmMgPyAiU1lOQyIgOiAiIiksIChwZmFsYy0+YWN0aXZlID8gIkFDVElWRSIgOiAiIiksCisJICAgICAgIHBmYWxjLT5udW1fY2hhbm5lbHMpOworCisJcHJpbnRrKCIgICAgICAgIHBkZW49JWQsICBsb3M9JWQsICBsb3NyPSVkLCAgbGZhPSVkLCAgZmFyZWM9JWRcbiIsCisJICAgICAgIHBmYWxjLT5wZGVuLCBwZmFsYy0+bG9zLCBwZmFsYy0+bG9zciwgcGZhbGMtPmxmYSwgcGZhbGMtPmZhcmVjKTsKKwlwcmludGsoIiAgICAgICAgbG1mYT0lZCwgIGFpcz0lZCwgIHNlYz0lZCwgIGVzPSVkLCAgcmFpPSVkXG4iLAorCSAgICAgICBwZmFsYy0+bG1mYSwgcGZhbGMtPmFpcywgcGZhbGMtPnNlYywgcGZhbGMtPmVzLCBwZmFsYy0+cmFpKTsKKwlwcmludGsoIiAgICAgICAgYmVjPSVkLCAgZmVjPSVkLCAgY3ZjPSVkLCAgY2VjPSVkLCAgZWJjPSVkXG4iLAorCSAgICAgICBwZmFsYy0+YmVjLCBwZmFsYy0+ZmVjLCBwZmFsYy0+Y3ZjLCBwZmFsYy0+Y2VjLCBwZmFsYy0+ZWJjKTsKKworCXByaW50aygiXG4iKTsKKwlwcmludGsoIiAgICAgICAgU1RBVFVTOiAlcyAgJXMgICVzICAlcyAgJXMgICVzXG4iLAorCSAgICAgICAocGZhbGMtPnJlZF9hbGFybSA/ICJSRUQiIDogIiIpLAorCSAgICAgICAocGZhbGMtPmJsdWVfYWxhcm0gPyAiQkxVIiA6ICIiKSwKKwkgICAgICAgKHBmYWxjLT55ZWxsb3dfYWxhcm0gPyAiWUVMIiA6ICIiKSwKKwkgICAgICAgKHBmYWxjLT5sb3NzX2ZhID8gIkxGQSIgOiAiIiksCisJICAgICAgIChwZmFsYy0+bG9zc19tZmEgPyAiTE1GIiA6ICIiKSwgKHBmYWxjLT5wcmJzID8gIlBSQiIgOiAiIikpOworCUNQQ19VTkxPQ0soY2FyZCwgZmxhZ3MpOworfQorCitpbnQgY3BjX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaWYgKChuZXdfbXR1IDwgMTI4KSB8fCAobmV3X210dSA+IFBDMzAwX0RFRl9NVFUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZXYtPm10dSA9IG5ld19tdHU7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjcGNfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOworCXBjMzAwZGV2X3QgKmQgPSAocGMzMDBkZXZfdCAqKSBkZXYtPnByaXY7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSBkLT5jaGFuOworCXBjMzAwX3QgKmNhcmQgPSAocGMzMDBfdCAqKSBjaGFuLT5jYXJkOworCXBjMzAwY29uZl90IGNvbmZfYXV4OworCXBjMzAwY2hjb25mX3QgKmNvbmYgPSAocGMzMDBjaGNvbmZfdCAqKSAmIGNoYW4tPmNvbmY7CisJaW50IGNoID0gY2hhbi0+Y2hhbm5lbDsKKwl2b2lkIF9fdXNlciAqYXJnID0gaWZyLT5pZnJfZGF0YTsKKwlzdHJ1Y3QgaWZfc2V0dGluZ3MgKnNldHRpbmdzID0gJmlmci0+aWZyX3NldHRpbmdzOworCXZvaWQgX19pb21lbSAqc2NhYmFzZSA9IGNhcmQtPmh3LnNjYWJhc2U7CisKKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFNJT0NHUEMzMDBDT05GOgorI2lmZGVmIENPTkZJR19QQzMwMF9NTFBQUAorCQkJaWYgKGNvbmYtPnByb3RvICE9IFBDMzAwX1BST1RPX01MUFBQKSB7CisJCQkJY29uZi0+cHJvdG8gPSBoZGxjLT5wcm90by5pZDsKKwkJCX0KKyNlbHNlCisJCQljb25mLT5wcm90byA9IGhkbGMtPnByb3RvLmlkOworI2VuZGlmCisJCQltZW1jcHkoJmNvbmZfYXV4LmNvbmYsIGNvbmYsIHNpemVvZihwYzMwMGNoY29uZl90KSk7CisJCQltZW1jcHkoJmNvbmZfYXV4Lmh3LCAmY2FyZC0+aHcsIHNpemVvZihwYzMwMGh3X3QpKTsKKwkJCWlmICghYXJnIHx8IAorCQkJCWNvcHlfdG9fdXNlcihhcmcsICZjb25mX2F1eCwgc2l6ZW9mKHBjMzAwY29uZl90KSkpIAorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIDA7CisJCWNhc2UgU0lPQ1NQQzMwMENPTkY6CisJCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCWlmICghYXJnIHx8IAorCQkJCWNvcHlfZnJvbV91c2VyKCZjb25mX2F1eC5jb25mLCBhcmcsIHNpemVvZihwYzMwMGNoY29uZl90KSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoY2FyZC0+aHcuY3BsZF9pZCA8IDB4MDIgJiYKKwkJCSAgICBjb25mX2F1eC5jb25mLmZyX21vZGUgPT0gUEMzMDBfRlJfVU5GUkFNRUQpIHsKKwkJCQkvKiBDUExEX0lEIDwgMHgwMiBkb2Vzbid0IHN1cHBvcnQgVW5mcmFtZWQgRTEgKi8KKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKyNpZmRlZiBDT05GSUdfUEMzMDBfTUxQUFAKKwkJCWlmIChjb25mX2F1eC5jb25mLnByb3RvID09IFBDMzAwX1BST1RPX01MUFBQKSB7CisJCQkJaWYgKGNvbmYtPnByb3RvICE9IFBDMzAwX1BST1RPX01MUFBQKSB7CisJCQkJCW1lbWNweShjb25mLCAmY29uZl9hdXguY29uZiwgc2l6ZW9mKHBjMzAwY2hjb25mX3QpKTsKKwkJCQkJY3BjX3R0eV9pbml0KGQpOwkvKiBpbml0IFRUWSBkcml2ZXIgKi8KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChjb25mX2F1eC5jb25mLnByb3RvID09IDB4ZmZmZikgeworCQkJCQlpZiAoY29uZi0+cHJvdG8gPT0gUEMzMDBfUFJPVE9fTUxQUFApeyAKKwkJCQkJCS8qIGlmZG93biBpbnRlcmZhY2UgKi8KKwkJCQkJCWNwY19jbG9zZShkZXYpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJbWVtY3B5KGNvbmYsICZjb25mX2F1eC5jb25mLCBzaXplb2YocGMzMDBjaGNvbmZfdCkpOworCQkJCQloZGxjLT5wcm90by5pZCA9IGNvbmYtPnByb3RvOworCQkJCX0KKwkJCX0KKyNlbHNlCisJCQltZW1jcHkoY29uZiwgJmNvbmZfYXV4LmNvbmYsIHNpemVvZihwYzMwMGNoY29uZl90KSk7CisJCQloZGxjLT5wcm90by5pZCA9IGNvbmYtPnByb3RvOworI2VuZGlmCisJCQlyZXR1cm4gMDsKKwkJY2FzZSBTSU9DR1BDMzAwU1RBVFVTOgorCQkJY3BjX3NjYV9zdGF0dXMoY2FyZCwgY2gpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgU0lPQ0dQQzMwMEZBTENTVEFUVVM6CisJCQljcGNfZmFsY19zdGF0dXMoY2FyZCwgY2gpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTSU9DR1BDMzAwVVRJTFNUQVRTOgorCQkJeworCQkJCWlmICghYXJnKSB7CS8qIGNsZWFyIHN0YXRpc3RpY3MgKi8KKwkJCQkJbWVtc2V0KCZoZGxjLT5zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7CisJCQkJCWlmIChjYXJkLT5ody50eXBlID09IFBDMzAwX1RFKSB7CisJCQkJCQltZW1zZXQoJmNoYW4tPmZhbGMsIDAsIHNpemVvZihmYWxjX3QpKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXBjMzAwc3RhdHNfdCBwYzMwMHN0YXRzOworCisJCQkJCW1lbXNldCgmcGMzMDBzdGF0cywgMCwgc2l6ZW9mKHBjMzAwc3RhdHNfdCkpOworCQkJCQlwYzMwMHN0YXRzLmh3X3R5cGUgPSBjYXJkLT5ody50eXBlOworCQkJCQlwYzMwMHN0YXRzLmxpbmVfb24gPSBjYXJkLT5jaGFuW2NoXS5kLmxpbmVfb247CisJCQkJCXBjMzAwc3RhdHMubGluZV9vZmYgPSBjYXJkLT5jaGFuW2NoXS5kLmxpbmVfb2ZmOworCQkJCQltZW1jcHkoJnBjMzAwc3RhdHMuZ2VuX3N0YXRzLCAmaGRsYy0+c3RhdHMsCisJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKKwkJCQkJaWYgKGNhcmQtPmh3LnR5cGUgPT0gUEMzMDBfVEUpCisJCQkJCQltZW1jcHkoJnBjMzAwc3RhdHMudGVfc3RhdHMsJmNoYW4tPmZhbGMsc2l6ZW9mKGZhbGNfdCkpOworCQkJCSAgICAJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZwYzMwMHN0YXRzLCBzaXplb2YocGMzMDBzdGF0c190KSkpCisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJY2FzZSBTSU9DR1BDMzAwVVRJTFNUQVRVUzoKKwkJCXsKKwkJCQlzdHJ1Y3QgcGMzMDBzdGF0dXMgcGMzMDBzdGF0dXM7CisKKwkJCQlwYzMwMHN0YXR1cy5od190eXBlID0gY2FyZC0+aHcudHlwZTsKKwkJCQlpZiAoY2FyZC0+aHcudHlwZSA9PSBQQzMwMF9URSkgeworCQkJCQlwYzMwMHN0YXR1cy50ZV9zdGF0dXMuc3luYyA9IGNoYW4tPmZhbGMuc3luYzsKKwkJCQkJcGMzMDBzdGF0dXMudGVfc3RhdHVzLnJlZF9hbGFybSA9IGNoYW4tPmZhbGMucmVkX2FsYXJtOworCQkJCQlwYzMwMHN0YXR1cy50ZV9zdGF0dXMuYmx1ZV9hbGFybSA9IGNoYW4tPmZhbGMuYmx1ZV9hbGFybTsKKwkJCQkJcGMzMDBzdGF0dXMudGVfc3RhdHVzLmxvc3NfZmEgPSBjaGFuLT5mYWxjLmxvc3NfZmE7CisJCQkJCXBjMzAwc3RhdHVzLnRlX3N0YXR1cy55ZWxsb3dfYWxhcm0gPWNoYW4tPmZhbGMueWVsbG93X2FsYXJtOworCQkJCQlwYzMwMHN0YXR1cy50ZV9zdGF0dXMubG9zc19tZmEgPSBjaGFuLT5mYWxjLmxvc3NfbWZhOworCQkJCQlwYzMwMHN0YXR1cy50ZV9zdGF0dXMucHJicyA9IGNoYW4tPmZhbGMucHJiczsKKwkJCQl9IGVsc2UgeworCQkJCQlwYzMwMHN0YXR1cy5nZW5fc3RhdHVzLmRjZCA9CisJCQkJCQkhKGNwY19yZWFkYiAoc2NhYmFzZSArIE1fUkVHKFNUMywgY2gpKSAmIFNUM19EQ0QpOworCQkJCQlwYzMwMHN0YXR1cy5nZW5fc3RhdHVzLmN0cyA9CisJCQkJCQkhKGNwY19yZWFkYiAoc2NhYmFzZSArIE1fUkVHKFNUMywgY2gpKSAmIFNUM19DVFMpOworCQkJCQlwYzMwMHN0YXR1cy5nZW5fc3RhdHVzLnJ0cyA9CisJCQkJCQkhKGNwY19yZWFkYiAoc2NhYmFzZSArIE1fUkVHKENUTCwgY2gpKSAmIENUTF9SVFMpOworCQkJCQlwYzMwMHN0YXR1cy5nZW5fc3RhdHVzLmR0ciA9CisJCQkJCQkhKGNwY19yZWFkYiAoc2NhYmFzZSArIE1fUkVHKENUTCwgY2gpKSAmIENUTF9EVFIpOworCQkJCQkvKiBUaGVyZSBpcyBubyBEU1IgaW4gSEQ2NDU3MiAqLworCQkJCX0KKwkJCQlpZiAoIWFyZworCQkJCSAgICB8fCBjb3B5X3RvX3VzZXIoYXJnLCAmcGMzMDBzdGF0dXMsIHNpemVvZihwYzMwMHN0YXR1c190KSkpCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQljYXNlIFNJT0NTUEMzMDBUUkFDRToKKwkJCS8qIFNldHMvcmVzZXRzIGEgdHJhY2VfZmxhZyBmb3IgdGhlIHJlc3BlY3RpdmUgZGV2aWNlICovCisJCQlpZiAoIWFyZyB8fCBjb3B5X2Zyb21fdXNlcigmZC0+dHJhY2Vfb24sIGFyZyxzaXplb2YodW5zaWduZWQgY2hhcikpKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU0lPQ1NQQzMwMExPT1BCQUNLOgorCQkJeworCQkJCXN0cnVjdCBwYzMwMGxvb3BiYWNrIHBjMzAwbG9vcDsKKworCQkJCS8qIFRFIGJvYXJkcyBvbmx5ICovCisJCQkJaWYgKGNhcmQtPmh3LnR5cGUgIT0gUEMzMDBfVEUpCisJCQkJCXJldHVybiAtRUlOVkFMOworCisJCQkJaWYgKCFhcmcgfHwgCisJCQkJCWNvcHlfZnJvbV91c2VyKCZwYzMwMGxvb3AsIGFyZywgc2l6ZW9mKHBjMzAwbG9vcGJhY2tfdCkpKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJc3dpdGNoIChwYzMwMGxvb3AubG9vcF90eXBlKSB7CisJCQkJCWNhc2UgUEMzMDBMT0NMT09QOgkvKiBUdXJuIHRoZSBsb2NhbCBsb29wIG9uL29mZiAqLworCQkJCQkJZmFsY19sb2NhbF9sb29wKGNhcmQsIGNoLCBwYzMwMGxvb3AubG9vcF9vbik7CisJCQkJCQlyZXR1cm4gMDsKKworCQkJCQljYXNlIFBDMzAwUkVNTE9PUDoJLyogVHVybiB0aGUgcmVtb3RlIGxvb3Agb24vb2ZmICovCisJCQkJCQlmYWxjX3JlbW90ZV9sb29wKGNhcmQsIGNoLCBwYzMwMGxvb3AubG9vcF9vbik7CisJCQkJCQlyZXR1cm4gMDsKKworCQkJCQljYXNlIFBDMzAwUEFZTE9BRExPT1A6CS8qIFR1cm4gdGhlIHBheWxvYWQgbG9vcCBvbi9vZmYgKi8KKwkJCQkJCWZhbGNfcGF5bG9hZF9sb29wKGNhcmQsIGNoLCBwYzMwMGxvb3AubG9vcF9vbik7CisJCQkJCQlyZXR1cm4gMDsKKworCQkJCQljYXNlIFBDMzAwR0VOTE9PUFVQOgkvKiBHZW5lcmF0ZSBsb29wIFVQICovCisJCQkJCQlpZiAocGMzMDBsb29wLmxvb3Bfb24pIHsKKwkJCQkJCQlmYWxjX2dlbmVyYXRlX2xvb3BfdXBfY29kZSAoY2FyZCwgY2gpOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl0dXJuX29mZl94bHUoY2FyZCwgY2gpOworCQkJCQkJfQorCQkJCQkJcmV0dXJuIDA7CisKKwkJCQkJY2FzZSBQQzMwMEdFTkxPT1BET1dOOgkvKiBHZW5lcmF0ZSBsb29wIERPV04gKi8KKwkJCQkJCWlmIChwYzMwMGxvb3AubG9vcF9vbikgeworCQkJCQkJCWZhbGNfZ2VuZXJhdGVfbG9vcF9kb3duX2NvZGUgKGNhcmQsIGNoKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJdHVybl9vZmZfeGxkKGNhcmQsIGNoKTsKKwkJCQkJCX0KKwkJCQkJCXJldHVybiAwOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQl9CisKKwkJY2FzZSBTSU9DU1BDMzAwUEFUVEVSTlRFU1Q6CisJCQkvKiBUdXJuIHRoZSBwYXR0ZXJuIHRlc3Qgb24vb2ZmIGFuZCBzaG93IHRoZSBlcnJvcnMgY291bnRlciAqLworCQkJeworCQkJCXN0cnVjdCBwYzMwMHBhdHRlcm50c3QgcGMzMDBwYXRybnRzdDsKKworCQkJCS8qIFRFIGJvYXJkcyBvbmx5ICovCisJCQkJaWYgKGNhcmQtPmh3LnR5cGUgIT0gUEMzMDBfVEUpCisJCQkJCXJldHVybiAtRUlOVkFMOworCisJCQkJaWYgKGNhcmQtPmh3LmNwbGRfaWQgPCAweDAyKSB7CisJCQkJCS8qIENQTERfSUQgPCAweDAyIGRvZXNuJ3Qgc3VwcG9ydCBwYXR0ZXJuIHRlc3QgKi8KKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCisJCQkJaWYgKCFhcmcgfHwgCisJCQkJCWNvcHlfZnJvbV91c2VyKCZwYzMwMHBhdHJudHN0LGFyZyxzaXplb2YocGMzMDBwYXR0ZXJudHN0X3QpKSkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWlmIChwYzMwMHBhdHJudHN0LnBhdHJudHN0X29uID09IDIpIHsKKwkJCQkJaWYgKGNoYW4tPmZhbGMucHJicyA9PSAwKSB7CisJCQkJCQlmYWxjX3BhdHRlcm5fdGVzdChjYXJkLCBjaCwgMSk7CisJCQkJCX0KKwkJCQkJcGMzMDBwYXRybnRzdC5udW1fZXJyb3JzID0KKwkJCQkJCWZhbGNfcGF0dGVybl90ZXN0X2Vycm9yKGNhcmQsIGNoKTsKKwkJCQkJaWYgKCFhcmcKKwkJCQkJICAgIHx8IGNvcHlfdG9fdXNlcihhcmcsICZwYzMwMHBhdHJudHN0LAorCQkJCQkJCSAgICBzaXplb2YgKHBjMzAwcGF0dGVybnRzdF90KSkpCisJCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfSBlbHNlIHsKKwkJCQkJZmFsY19wYXR0ZXJuX3Rlc3QoY2FyZCwgY2gsIHBjMzAwcGF0cm50c3QucGF0cm50c3Rfb24pOworCQkJCX0KKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQljYXNlIFNJT0NXQU5ERVY6CisJCQlzd2l0Y2ggKGlmci0+aWZyX3NldHRpbmdzLnR5cGUpIHsKKwkJCQljYXNlIElGX0dFVF9JRkFDRToKKwkJCQl7CisJCQkJCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKHN5bmNfc2VyaWFsX3NldHRpbmdzKTsKKwkJCQkJaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9IGNvbmYtPm1lZGlhOworCQkJCQlpZiAoaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA8IHNpemUpIHsKKwkJCQkJCS8qIGRhdGEgc2l6ZSB3YW50ZWQgKi8KKwkJCQkJCWlmci0+aWZyX3NldHRpbmdzLnNpemUgPSBzaXplOworCQkJCQkJcmV0dXJuIC1FTk9CVUZTOworCQkJCQl9CisJCisJCQkJCWlmIChjb3B5X3RvX3VzZXIoc2V0dGluZ3MtPmlmc19pZnN1LnN5bmMsCisJCQkJCQkJICZjb25mLT5waHlzX3NldHRpbmdzLCBzaXplKSkgeworCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCX0KKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCisJCQkJY2FzZSBJRl9JRkFDRV9WMzU6CisJCQkJY2FzZSBJRl9JRkFDRV9WMjQ6CisJCQkJY2FzZSBJRl9JRkFDRV9YMjE6CisJCQkJeworCQkJCQljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihzeW5jX3NlcmlhbF9zZXR0aW5ncyk7CisKKwkJCQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQkJCQlyZXR1cm4gLUVQRVJNOworCQkJCQl9CisJCQkJCS8qIGluY29ycmVjdCBkYXRhIGxlbj8gKi8KKwkJCQkJaWYgKGlmci0+aWZyX3NldHRpbmdzLnNpemUgIT0gc2l6ZSkgeworCQkJCQkJcmV0dXJuIC1FTk9CVUZTOworCQkJCQl9CisKKwkJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjb25mLT5waHlzX3NldHRpbmdzLCAKKwkJCQkJCQkgICBzZXR0aW5ncy0+aWZzX2lmc3Uuc3luYywgc2l6ZSkpIHsKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9CisKKwkJCQkJaWYgKGNvbmYtPnBoeXNfc2V0dGluZ3MubG9vcGJhY2spIHsKKwkJCQkJCWNwY193cml0ZWIoY2FyZC0+aHcuc2NhYmFzZSArIE1fUkVHKE1EMiwgY2gpLAorCQkJCQkJCWNwY19yZWFkYihjYXJkLT5ody5zY2FiYXNlICsgTV9SRUcoTUQyLCBjaCkpIHwgCisJCQkJCQkJTUQyX0xPT1BfTUlSKTsKKwkJCQkJfQorCQkJCQljb25mLT5tZWRpYSA9IGlmci0+aWZyX3NldHRpbmdzLnR5cGU7CisJCQkJCXJldHVybiAwOworCQkJCX0KKworCQkJCWNhc2UgSUZfSUZBQ0VfVDE6CisJCQkJY2FzZSBJRl9JRkFDRV9FMToKKwkJCQl7CisJCQkJCWNvbnN0IHNpemVfdCB0ZV9zaXplID0gc2l6ZW9mKHRlMV9zZXR0aW5ncyk7CisJCQkJCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKHN5bmNfc2VyaWFsX3NldHRpbmdzKTsKKworCQkJCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCQkJCXJldHVybiAtRVBFUk07CisJCQkJCX0KKworCQkJCQkvKiBpbmNvcnJlY3QgZGF0YSBsZW4/ICovCisJCQkJCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplICE9IHRlX3NpemUpIHsKKwkJCQkJCXJldHVybiAtRU5PQlVGUzsKKwkJCQkJfQorCisJCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmY29uZi0+cGh5c19zZXR0aW5ncywgCisJCQkJCQkJICAgc2V0dGluZ3MtPmlmc19pZnN1LnRlMSwgc2l6ZSkpIHsKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl9LyogSWdub3JpbmcgSERMQyBzbG90X21hcCBmb3IgYSB3aGlsZSAqLworCQkJCQkKKwkJCQkJaWYgKGNvbmYtPnBoeXNfc2V0dGluZ3MubG9vcGJhY2spIHsKKwkJCQkJCWNwY193cml0ZWIoY2FyZC0+aHcuc2NhYmFzZSArIE1fUkVHKE1EMiwgY2gpLAorCQkJCQkJCWNwY19yZWFkYihjYXJkLT5ody5zY2FiYXNlICsgTV9SRUcoTUQyLCBjaCkpIHwgCisJCQkJCQkJTUQyX0xPT1BfTUlSKTsKKwkJCQkJfQorCQkJCQljb25mLT5tZWRpYSA9IGlmci0+aWZyX3NldHRpbmdzLnR5cGU7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKwkJCX0KKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmNwY19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gaGRsY19zdGF0cyhkZXYpOworfQorCitzdGF0aWMgaW50IGNsb2NrX3JhdGVfY2FsYyh1Y2xvbmcgcmF0ZSwgdWNsb25nIGNsb2NrLCBpbnQgKmJyX2lvKQoreworCWludCBiciwgdGM7CisJaW50IGJyX3B3ciwgZXJyb3I7CisKKwlpZiAocmF0ZSA9PSAwKQorCQlyZXR1cm4gKDApOworCisJZm9yIChiciA9IDAsIGJyX3B3ciA9IDE7IGJyIDw9IDk7IGJyKyssIGJyX3B3ciA8PD0gMSkgeworCQlpZiAoKHRjID0gY2xvY2sgLyBicl9wd3IgLyByYXRlKSA8PSAweGZmKSB7CisJCQkqYnJfaW8gPSBicjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHRjIDw9IDB4ZmYpIHsKKwkJZXJyb3IgPSAoKHJhdGUgLSAoY2xvY2sgLyBicl9wd3IgLyByYXRlKSkgLyByYXRlKSAqIDEwMDA7CisJCS8qIEVycm9ycyBiaWdnZXIgdGhhbiArLy0gMSUgd29uJ3QgYmUgdG9sZXJhdGVkICovCisJCWlmIChlcnJvciA8IC0xMCB8fCBlcnJvciA+IDEwKQorCQkJcmV0dXJuICgtMSk7CisJCWVsc2UKKwkJCXJldHVybiAodGMpOworCX0gZWxzZSB7CisJCXJldHVybiAoLTEpOworCX0KK30KKworaW50IGNoX2NvbmZpZyhwYzMwMGRldl90ICogZCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopIGQtPmNoYW47CisJcGMzMDBjaGNvbmZfdCAqY29uZiA9IChwYzMwMGNoY29uZl90ICopICYgY2hhbi0+Y29uZjsKKwlwYzMwMF90ICpjYXJkID0gKHBjMzAwX3QgKikgY2hhbi0+Y2FyZDsKKwl2b2lkIF9faW9tZW0gKnNjYWJhc2UgPSBjYXJkLT5ody5zY2FiYXNlOworCXZvaWQgX19pb21lbSAqcGx4YmFzZSA9IGNhcmQtPmh3LnBseGJhc2U7CisJaW50IGNoID0gY2hhbi0+Y2hhbm5lbDsKKwl1Y2xvbmcgY2xrcmF0ZSA9IGNoYW4tPmNvbmYucGh5c19zZXR0aW5ncy5jbG9ja19yYXRlOworCXVjbG9uZyBjbGt0eXBlID0gY2hhbi0+Y29uZi5waHlzX3NldHRpbmdzLmNsb2NrX3R5cGU7CisJdWNzaG9ydCBlbmNvZGluZyA9IGNoYW4tPmNvbmYucHJvdG9fc2V0dGluZ3MuZW5jb2Rpbmc7CisJdWNzaG9ydCBwYXJpdHkgPSBjaGFuLT5jb25mLnByb3RvX3NldHRpbmdzLnBhcml0eTsgICAKKwlpbnQgdG1jLCBicjsKKwl1Y2NoYXIgbWQwLCBtZDI7CisgICAgCisJLyogUmVzZXQgdGhlIGNoYW5uZWwgKi8KKwljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhDTUQsIGNoKSwgQ01EX0NIX1JTVCk7CisKKwkvKiBDb25maWd1cmUgdGhlIFNDQSByZWdpc3RlcnMgKi8KKwlzd2l0Y2ggKHBhcml0eSkgeworCQljYXNlIFBBUklUWV9OT05FOgorCQkJbWQwID0gTUQwX0JJVF9TWU5DOworCQkJYnJlYWs7CisJCWNhc2UgUEFSSVRZX0NSQzE2X1BSMDoKKwkJCW1kMCA9IE1EMF9DUkMxNl8wfE1EMF9DUkNDMHxNRDBfQklUX1NZTkM7CisJCQlicmVhazsKKwkJY2FzZSBQQVJJVFlfQ1JDMTZfUFIxOgorCQkJbWQwID0gTUQwX0NSQzE2XzF8TUQwX0NSQ0MwfE1EMF9CSVRfU1lOQzsKKwkJCWJyZWFrOworCQljYXNlIFBBUklUWV9DUkMzMl9QUjFfQ0NJVFQ6CisJCQltZDAgPSBNRDBfQ1JDMzJ8TUQwX0NSQ0MwfE1EMF9CSVRfU1lOQzsKKwkJCWJyZWFrOworCQljYXNlIFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQ6CisJCWRlZmF1bHQ6CisJCQltZDAgPSBNRDBfQ1JDX0NDSVRUfE1EMF9DUkNDMHxNRDBfQklUX1NZTkM7CisJCQlicmVhazsKKwl9CisJc3dpdGNoIChlbmNvZGluZykgeworCQljYXNlIEVOQ09ESU5HX05SWkk6CisJCQltZDIgPSBNRDJfRl9EVVBMRVh8TUQyX0FEUExMX1g4fE1EMl9OUlpJOworCQkJYnJlYWs7CisJCWNhc2UgRU5DT0RJTkdfRk1fTUFSSzoJLyogRk0xICovCisJCQltZDIgPSBNRDJfRl9EVVBMRVh8TUQyX0FEUExMX1g4fE1EMl9GTXxNRDJfRk0xOworCQkJYnJlYWs7CisJCWNhc2UgRU5DT0RJTkdfRk1fU1BBQ0U6CS8qIEZNMCAqLworCQkJbWQyID0gTUQyX0ZfRFVQTEVYfE1EMl9BRFBMTF9YOHxNRDJfRk18TUQyX0ZNMDsKKwkJCWJyZWFrOworCQljYXNlIEVOQ09ESU5HX01BTkNIRVNURVI6IC8qIEl0J3Mgbm90IHdvcmtpbmcuLi4gKi8KKwkJCW1kMiA9IE1EMl9GX0RVUExFWHxNRDJfQURQTExfWDh8TUQyX0ZNfE1EMl9NQU5DSDsKKwkJCWJyZWFrOworCQljYXNlIEVOQ09ESU5HX05SWjoKKwkJZGVmYXVsdDoKKwkJCW1kMiA9IE1EMl9GX0RVUExFWHxNRDJfQURQTExfWDh8TUQyX05SWjsKKwkJCWJyZWFrOworCX0KKwljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhNRDAsIGNoKSwgbWQwKTsKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhNRDEsIGNoKSwgMCk7CisJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoTUQyLCBjaCksIG1kMik7CisgCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKElETCwgY2gpLCAweDdlKTsKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhDVEwsIGNoKSwgQ1RMX1VSU0tQIHwgQ1RMX0lETEMpOworCisJLyogQ29uZmlndXJlIEhXIG1lZGlhICovCisJc3dpdGNoIChjYXJkLT5ody50eXBlKSB7CisJCWNhc2UgUEMzMDBfUlNWOgorCQkJaWYgKGNvbmYtPm1lZGlhID09IElGX0lGQUNFX1YzNSkgeworCQkJCWNwY193cml0ZWwoKHBseGJhc2UgKyBjYXJkLT5ody5ncGlvY19yZWcpLAorCQkJCQkgICBjcGNfcmVhZGwocGx4YmFzZSArIGNhcmQtPmh3LmdwaW9jX3JlZykgfCBQQzMwMF9DSE1FRElBX01BU0soY2gpKTsKKwkJCX0gZWxzZSB7CisJCQkJY3BjX3dyaXRlbCgocGx4YmFzZSArIGNhcmQtPmh3LmdwaW9jX3JlZyksCisJCQkJCSAgIGNwY19yZWFkbChwbHhiYXNlICsgY2FyZC0+aHcuZ3Bpb2NfcmVnKSAmIH5QQzMwMF9DSE1FRElBX01BU0soY2gpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUEMzMDBfWDIxOgorCQkJYnJlYWs7CisKKwkJY2FzZSBQQzMwMF9URToKKwkJCXRlX2NvbmZpZyhjYXJkLCBjaCk7CisJCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGNhcmQtPmh3LnR5cGUpIHsKKwkJY2FzZSBQQzMwMF9SU1Y6CisJCWNhc2UgUEMzMDBfWDIxOgorCQkJaWYgKGNsa3R5cGUgPT0gQ0xPQ0tfSU5UIHx8IGNsa3R5cGUgPT0gQ0xPQ0tfVFhJTlQpIHsKKwkJCQkvKiBDYWxjdWxhdGUgdGhlIGNsa3JhdGUgcGFyYW1ldGVycyAqLworCQkJCXRtYyA9IGNsb2NrX3JhdGVfY2FsYyhjbGtyYXRlLCBjYXJkLT5ody5jbG9jaywgJmJyKTsKKwkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhUTUNULCBjaCksIHRtYyk7CisJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoVFhTLCBjaCksCisJCQkJCSAgIChUWFNfRFRSWEMgfCBUWFNfSUJSRyB8IGJyKSk7CisJCQkJaWYgKGNsa3R5cGUgPT0gQ0xPQ0tfSU5UKSB7CisJCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFRNQ1IsIGNoKSwgdG1jKTsKKwkJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoUlhTLCBjaCksIAorCQkJCQkJICAgKFJYU19JQlJHIHwgYnIpKTsKKwkJCQl9IGVsc2UgeworCQkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhUTUNSLCBjaCksIDEpOworCQkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhSWFMsIGNoKSwgMCk7CisJCQkJfQorCSAgICAJCQlpZiAoY2FyZC0+aHcudHlwZSA9PSBQQzMwMF9YMjEpIHsKKwkJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoR1BPLCBjaCksIDEpOworCQkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhFWFMsIGNoKSwgRVhTX1RFUzEgfCBFWFNfUkVTMSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoRVhTLCBjaCksIEVYU19URVMxKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFRNQ1QsIGNoKSwgMSk7CisJCQkJaWYgKGNsa3R5cGUgPT0gQ0xPQ0tfRVhUKSB7CisJCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFRYUywgY2gpLCAKKwkJCQkJCSAgIFRYU19EVFJYQyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoVFhTLCBjaCksIAorCQkJCQkJICAgVFhTX0RUUlhDfFRYU19SQ0xLKTsKKwkJCQl9CisJICAgIAkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFRNQ1IsIGNoKSwgMSk7CisJCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoUlhTLCBjaCksIDApOworCQkJCWlmIChjYXJkLT5ody50eXBlID09IFBDMzAwX1gyMSkgeworCQkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhHUE8sIGNoKSwgMCk7CisJCQkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKEVYUywgY2gpLCBFWFNfVEVTMSB8IEVYU19SRVMxKTsKKwkJCQl9IGVsc2UgeworCQkJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhFWFMsIGNoKSwgRVhTX1RFUzEpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUEMzMDBfVEU6CisJCQkvKiBTQ0EgYWx3YXlzIHJlY2VpdmVzIGNsb2NrIGZyb20gdGhlIEZBTEMgY2hpcCAqLworCQkJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoVE1DVCwgY2gpLCAxKTsKKwkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFRYUywgY2gpLCAwKTsKKwkJCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFRNQ1IsIGNoKSwgMSk7CisJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhSWFMsIGNoKSwgMCk7CisJCQljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhFWFMsIGNoKSwgMCk7CisJCQlicmVhazsKKwl9CisKKwkvKiBFbmFibGUgSW50ZXJydXB0cyAqLworCWNwY193cml0ZWwoc2NhYmFzZSArIElFUjAsCisJCSAgIGNwY19yZWFkbChzY2FiYXNlICsgSUVSMCkgfAorCQkgICBJUjBfTShJUjBfUlhJTlRBLCBjaCkgfAorCQkgICBJUjBfRFJYKElSMF9FRlQgfCBJUjBfRE1JQSB8IElSMF9ETUlCLCBjaCkgfAorCQkgICBJUjBfRFRYKElSMF9FRlQgfCBJUjBfRE1JQSB8IElSMF9ETUlCLCBjaCkpOworCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKElFMCwgY2gpLAorCQkgICBjcGNfcmVhZGwoc2NhYmFzZSArIE1fUkVHKElFMCwgY2gpKSB8IElFMF9SWElOVEEpOworCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKElFMSwgY2gpLAorCQkgICBjcGNfcmVhZGwoc2NhYmFzZSArIE1fUkVHKElFMSwgY2gpKSB8IElFMV9DRENEKTsKKworCXJldHVybiAwOworfQorCitpbnQgcnhfY29uZmlnKHBjMzAwZGV2X3QgKiBkKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgZC0+Y2hhbjsKKwlwYzMwMF90ICpjYXJkID0gKHBjMzAwX3QgKikgY2hhbi0+Y2FyZDsKKwl2b2lkIF9faW9tZW0gKnNjYWJhc2UgPSBjYXJkLT5ody5zY2FiYXNlOworCWludCBjaCA9IGNoYW4tPmNoYW5uZWw7CisKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBEU1JfUlgoY2gpLCAwKTsKKworCS8qIEdlbmVyYWwgUlggc2V0dGluZ3MgKi8KKwljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhSUkMsIGNoKSwgMCk7CisJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoUk5SLCBjaCksIDE2KTsKKworCS8qIEVuYWJsZSByZWNlcHRpb24gKi8KKwljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhDTUQsIGNoKSwgQ01EX1JYX0NSQ19JTklUKTsKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhDTUQsIGNoKSwgQ01EX1JYX0VOQSk7CisKKwkvKiBJbml0aWFsaXplIERNQSBzdHVmZiAqLworCWNoYW4tPnJ4X2ZpcnN0X2JkID0gMDsKKwljaGFuLT5yeF9sYXN0X2JkID0gTl9ETUFfUlhfQlVGIC0gMTsKKwlyeF9kbWFfYnVmX2luaXQoY2FyZCwgY2gpOworCWNwY193cml0ZWIoc2NhYmFzZSArIERDUl9SWChjaCksIERDUl9GQ1RfQ0xSKTsKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBETVJfUlgoY2gpLCAoRE1SX1RNT0QgfCBETVJfTkYpKTsKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBESVJfUlgoY2gpLCAoRElSX0VPTSB8IERJUl9CT0YpKTsKKworCS8qIFN0YXJ0IERNQSAqLworCXJ4X2RtYV9zdGFydChjYXJkLCBjaCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHR4X2NvbmZpZyhwYzMwMGRldl90ICogZCkKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopIGQtPmNoYW47CisJcGMzMDBfdCAqY2FyZCA9IChwYzMwMF90ICopIGNoYW4tPmNhcmQ7CisJdm9pZCBfX2lvbWVtICpzY2FiYXNlID0gY2FyZC0+aHcuc2NhYmFzZTsKKwlpbnQgY2ggPSBjaGFuLT5jaGFubmVsOworCisJY3BjX3dyaXRlYihzY2FiYXNlICsgRFNSX1RYKGNoKSwgMCk7CisKKwkvKiBHZW5lcmFsIFRYIHNldHRpbmdzICovCisJY3BjX3dyaXRlYihzY2FiYXNlICsgTV9SRUcoVFJDMCwgY2gpLCAwKTsKKwljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhURlMsIGNoKSwgMzIpOworCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFROUjAsIGNoKSwgMjApOworCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFROUjEsIGNoKSwgNDgpOworCWNwY193cml0ZWIoc2NhYmFzZSArIE1fUkVHKFRDUiwgY2gpLCA4KTsKKworCS8qIEVuYWJsZSB0cmFuc21pc3Npb24gKi8KKwljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhDTUQsIGNoKSwgQ01EX1RYX0NSQ19JTklUKTsKKworCS8qIEluaXRpYWxpemUgRE1BIHN0dWZmICovCisJY2hhbi0+dHhfZmlyc3RfYmQgPSAwOworCWNoYW4tPnR4X25leHRfYmQgPSAwOworCXR4X2RtYV9idWZfaW5pdChjYXJkLCBjaCk7CisJY3BjX3dyaXRlYihzY2FiYXNlICsgRENSX1RYKGNoKSwgRENSX0ZDVF9DTFIpOworCWNwY193cml0ZWIoc2NhYmFzZSArIERNUl9UWChjaCksIChETVJfVE1PRCB8IERNUl9ORikpOworCWNwY193cml0ZWIoc2NhYmFzZSArIERJUl9UWChjaCksIChESVJfRU9NIHwgRElSX0JPRiB8IERJUl9VRFJGKSk7CisJY3BjX3dyaXRlbChzY2FiYXNlICsgRFRYX1JFRyhDREFMLCBjaCksIFRYX0JEX0FERFIoY2gsIGNoYW4tPnR4X2ZpcnN0X2JkKSk7CisJY3BjX3dyaXRlbChzY2FiYXNlICsgRFRYX1JFRyhFREFMLCBjaCksIFRYX0JEX0FERFIoY2gsIGNoYW4tPnR4X25leHRfYmQpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNwY19hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgZW5jb2RpbmcsCisJCSAgICAgIHVuc2lnbmVkIHNob3J0IHBhcml0eSkKK3sKKwlwYzMwMGRldl90ICpkID0gKHBjMzAwZGV2X3QgKilkZXYtPnByaXY7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKWQtPmNoYW47CisJcGMzMDBfdCAqY2FyZCA9IChwYzMwMF90ICopY2hhbi0+Y2FyZDsKKwlwYzMwMGNoY29uZl90ICpjb25mID0gKHBjMzAwY2hjb25mX3QgKikmY2hhbi0+Y29uZjsKKworCWlmIChjYXJkLT5ody50eXBlID09IFBDMzAwX1RFKSB7CisJCWlmIChlbmNvZGluZyAhPSBFTkNPRElOR19OUlogJiYgZW5jb2RpbmcgIT0gRU5DT0RJTkdfTlJaSSkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZW5jb2RpbmcgIT0gRU5DT0RJTkdfTlJaICYmIGVuY29kaW5nICE9IEVOQ09ESU5HX05SWkkgJiYKKwkJICAgIGVuY29kaW5nICE9IEVOQ09ESU5HX0ZNX01BUksgJiYgZW5jb2RpbmcgIT0gRU5DT0RJTkdfRk1fU1BBQ0UpIHsKKwkJCS8qIERyaXZlciBkb2Vzbid0IHN1cHBvcnQgRU5DT0RJTkdfTUFOQ0hFU1RFUiB5ZXQgKi8KKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJaWYgKHBhcml0eSAhPSBQQVJJVFlfTk9ORSAmJiBwYXJpdHkgIT0gUEFSSVRZX0NSQzE2X1BSMCAmJgorCSAgICBwYXJpdHkgIT0gUEFSSVRZX0NSQzE2X1BSMSAmJiBwYXJpdHkgIT0gUEFSSVRZX0NSQzMyX1BSMV9DQ0lUVCAmJgorCSAgICBwYXJpdHkgIT0gUEFSSVRZX0NSQzE2X1BSMV9DQ0lUVCkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljb25mLT5wcm90b19zZXR0aW5ncy5lbmNvZGluZyA9IGVuY29kaW5nOworCWNvbmYtPnByb3RvX3NldHRpbmdzLnBhcml0eSA9IHBhcml0eTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjcGNfb3BlbmNoKHBjMzAwZGV2X3QgKiBkKQoreworCXBjMzAwY2hfdCAqY2hhbiA9IChwYzMwMGNoX3QgKikgZC0+Y2hhbjsKKwlwYzMwMF90ICpjYXJkID0gKHBjMzAwX3QgKikgY2hhbi0+Y2FyZDsKKwlpbnQgY2ggPSBjaGFuLT5jaGFubmVsOworCXZvaWQgX19pb21lbSAqc2NhYmFzZSA9IGNhcmQtPmh3LnNjYWJhc2U7CisKKwljaF9jb25maWcoZCk7CisKKwlyeF9jb25maWcoZCk7CisKKwl0eF9jb25maWcoZCk7CisKKwkvKiBBc3NlcnQgUlRTIGFuZCBEVFIgKi8KKwljcGNfd3JpdGViKHNjYWJhc2UgKyBNX1JFRyhDVEwsIGNoKSwKKwkJICAgY3BjX3JlYWRiKHNjYWJhc2UgKyBNX1JFRyhDVEwsIGNoKSkgJiB+KENUTF9SVFMgfCBDVExfRFRSKSk7Cit9CisKK3ZvaWQgY3BjX2Nsb3NlY2gocGMzMDBkZXZfdCAqIGQpCit7CisJcGMzMDBjaF90ICpjaGFuID0gKHBjMzAwY2hfdCAqKSBkLT5jaGFuOworCXBjMzAwX3QgKmNhcmQgPSAocGMzMDBfdCAqKSBjaGFuLT5jYXJkOworCWZhbGNfdCAqcGZhbGMgPSAoZmFsY190ICopICYgY2hhbi0+ZmFsYzsKKwlpbnQgY2ggPSBjaGFuLT5jaGFubmVsOworCisJY3BjX3dyaXRlYihjYXJkLT5ody5zY2FiYXNlICsgTV9SRUcoQ01ELCBjaCksIENNRF9DSF9SU1QpOworCXJ4X2RtYV9zdG9wKGNhcmQsIGNoKTsKKwl0eF9kbWFfc3RvcChjYXJkLCBjaCk7CisKKwlpZiAoY2FyZC0+aHcudHlwZSA9PSBQQzMwMF9URSkgeworCQltZW1zZXQocGZhbGMsIDAsIHNpemVvZihmYWxjX3QpKTsKKwkJY3BjX3dyaXRlYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMiwKKwkJCSAgIGNwY19yZWFkYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMikgJgorCQkJICAgfigoQ1BMRF9SRUcyX0ZBTENfVFhfQ0xLIHwgQ1BMRF9SRUcyX0ZBTENfUlhfQ0xLIHwKKwkJCSAgICAgIENQTERfUkVHMl9GQUxDX0xFRDIpIDw8ICgyICogY2gpKSk7CisJCS8qIFJlc2V0IHRoZSBGQUxDIGNoaXAgKi8KKwkJY3BjX3dyaXRlYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMSwKKwkJCSAgIGNwY19yZWFkYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMSkgfAorCQkJICAgKENQTERfUkVHMV9GQUxDX1JFU0VUIDw8ICgyICogY2gpKSk7CisJCXVkZWxheSgxMDAwMCk7CisJCWNwY193cml0ZWIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzEsCisJCQkgICBjcGNfcmVhZGIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzEpICYKKwkJCSAgIH4oQ1BMRF9SRUcxX0ZBTENfUkVTRVQgPDwgKDIgKiBjaCkpKTsKKwl9Cit9CisKK2ludCBjcGNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwlwYzMwMGRldl90ICpkID0gKHBjMzAwZGV2X3QgKikgZGV2LT5wcml2OworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IHJlc3VsdDsKKworI2lmZGVmCVBDMzAwX0RFQlVHX09USEVSCisJcHJpbnRrKCJwYzMwMDogY3BjX29wZW4iKTsKKyNlbmRpZgorCisJaWYgKGhkbGMtPnByb3RvLmlkID09IElGX1BST1RPX1BQUCkgeworCQlkLT5pZl9wdHIgPSAmaGRsYy0+c3RhdGUucHBwLnBwcGRldjsKKwl9CisKKwlyZXN1bHQgPSBoZGxjX29wZW4oZGV2KTsKKwlpZiAoaGRsYy0+cHJvdG8uaWQgPT0gSUZfUFJPVE9fUFBQKSB7CisJCWRldi0+cHJpdiA9IGQ7CisJfQorCWlmIChyZXN1bHQpIHsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlzcHJpbnRmKGlmci5pZnJfbmFtZSwgIiVzIiwgZGV2LT5uYW1lKTsKKwljcGNfb3BlbmNoKGQpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjcGNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJcGMzMDBkZXZfdCAqZCA9IChwYzMwMGRldl90ICopIGRldi0+cHJpdjsKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopIGQtPmNoYW47CisJcGMzMDBfdCAqY2FyZCA9IChwYzMwMF90ICopIGNoYW4tPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmZGVmCVBDMzAwX0RFQlVHX09USEVSCisJcHJpbnRrKCJwYzMwMDogY3BjX2Nsb3NlIik7CisjZW5kaWYKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCUNQQ19MT0NLKGNhcmQsIGZsYWdzKTsKKwljcGNfY2xvc2VjaChkKTsKKwlDUENfVU5MT0NLKGNhcmQsIGZsYWdzKTsKKworCWhkbGNfY2xvc2UoZGV2KTsKKwlpZiAoaGRsYy0+cHJvdG8uaWQgPT0gSUZfUFJPVE9fUFBQKSB7CisJCWQtPmlmX3B0ciA9IE5VTEw7CisJfQorI2lmZGVmIENPTkZJR19QQzMwMF9NTFBQUAorCWlmIChjaGFuLT5jb25mLnByb3RvID09IFBDMzAwX1BST1RPX01MUFBQKSB7CisJCWNwY190dHlfdW5yZWdpc3Rlcl9zZXJ2aWNlKGQpOworCQljaGFuLT5jb25mLnByb3RvID0gMHhmZmZmOworCX0KKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1Y2xvbmcgZGV0ZWN0X3JhbShwYzMwMF90ICogY2FyZCkKK3sKKwl1Y2xvbmcgaTsKKwl1Y2NoYXIgZGF0YTsKKwl2b2lkIF9faW9tZW0gKnJhbWJhc2UgPSBjYXJkLT5ody5yYW1iYXNlOworCisJY2FyZC0+aHcucmFtc2l6ZSA9IFBDMzAwX1JBTVNJWkU7CisJLyogTGV0J3MgZmluZCBvdXQgaG93IG11Y2ggUkFNIGlzIHByZXNlbnQgb24gdGhpcyBib2FyZCAqLworCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5ody5yYW1zaXplOyBpKyspIHsKKwkJZGF0YSA9ICh1Y2NoYXIpIChpICYgMHhmZik7CisJCWNwY193cml0ZWIocmFtYmFzZSArIGksIGRhdGEpOworCQlpZiAoY3BjX3JlYWRiKHJhbWJhc2UgKyBpKSAhPSBkYXRhKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gKGkpOworfQorCitzdGF0aWMgdm9pZCBwbHhfaW5pdChwYzMwMF90ICogY2FyZCkKK3sKKwlzdHJ1Y3QgUlVOVElNRV85MDUwIF9faW9tZW0gKnBseF9jdGwgPSBjYXJkLT5ody5wbHhiYXNlOworCisJLyogUmVzZXQgUExYICovCisJY3BjX3dyaXRlbCgmcGx4X2N0bC0+aW5pdF9jdHJsLAorCQkgICBjcGNfcmVhZGwoJnBseF9jdGwtPmluaXRfY3RybCkgfCAweDQwMDAwMDAwKTsKKwl1ZGVsYXkoMTAwMDBMKTsKKwljcGNfd3JpdGVsKCZwbHhfY3RsLT5pbml0X2N0cmwsCisJCSAgIGNwY19yZWFkbCgmcGx4X2N0bC0+aW5pdF9jdHJsKSAmIH4weDQwMDAwMDAwKTsKKworCS8qIFJlbG9hZCBDb25maWcuIFJlZ2lzdGVycyBmcm9tIEVFUFJPTSAqLworCWNwY193cml0ZWwoJnBseF9jdGwtPmluaXRfY3RybCwKKwkJICAgY3BjX3JlYWRsKCZwbHhfY3RsLT5pbml0X2N0cmwpIHwgMHgyMDAwMDAwMCk7CisJdWRlbGF5KDEwMDAwTCk7CisJY3BjX3dyaXRlbCgmcGx4X2N0bC0+aW5pdF9jdHJsLAorCQkgICBjcGNfcmVhZGwoJnBseF9jdGwtPmluaXRfY3RybCkgJiB+MHgyMDAwMDAwMCk7CisKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNob3dfdmVyc2lvbih2b2lkKQoreworCWNoYXIgKnJjc3ZlcnMsICpyY3NkYXRlLCAqdG1wOworCisJcmNzdmVycyA9IHN0cmNocihyY3NpZCwgJyAnKTsKKwlyY3N2ZXJzKys7CisJdG1wID0gc3RyY2hyKHJjc3ZlcnMsICcgJyk7CisJKnRtcCsrID0gJ1wwJzsKKwlyY3NkYXRlID0gc3RyY2hyKHRtcCwgJyAnKTsKKwlyY3NkYXRlKys7CisJdG1wID0gc3RycmNocihyY3NkYXRlLCAnICcpOworCSp0bXAgPSAnXDAnOworCXByaW50ayhLRVJOX0lORk8gIkN5Y2xhZGVzLVBDMzAwIGRyaXZlciAlcyAlcyAoYnVpbHQgJXMgJXMpXG4iLCAKKwkJcmNzdmVycywgcmNzZGF0ZSwgX19EQVRFX18sIF9fVElNRV9fKTsKK30JCQkJLyogc2hvd192ZXJzaW9uICovCisKK3N0YXRpYyB2b2lkIGNwY19pbml0X2NhcmQocGMzMDBfdCAqIGNhcmQpCit7CisJaW50IGksIGRldmNvdW50ID0gMDsKKwlzdGF0aWMgaW50IGJvYXJkX25iciA9IDE7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBvbiB0aGUgUENJIGJyaWRnZSAqLworCXBseF9pbml0KGNhcmQpOworCWNwY193cml0ZXcoY2FyZC0+aHcucGx4YmFzZSArIGNhcmQtPmh3LmludGN0bF9yZWcsCisJCSAgIGNwY19yZWFkdyhjYXJkLT5ody5wbHhiYXNlICsgY2FyZC0+aHcuaW50Y3RsX3JlZykgfCAweDAwNDApOworCisjaWZkZWYgVVNFX1BDSV9DTE9DSworCS8qIFNldCBib2FyZCBjbG9jayB0byBQQ0kgY2xvY2sgKi8KKwljcGNfd3JpdGVsKGNhcmQtPmh3LnBseGJhc2UgKyBjYXJkLT5ody5ncGlvY19yZWcsCisJCSAgIGNwY19yZWFkbChjYXJkLT5ody5wbHhiYXNlICsgY2FyZC0+aHcuZ3Bpb2NfcmVnKSB8IDB4MDAwMDAwMDRVTCk7CisJY2FyZC0+aHcuY2xvY2sgPSBQQzMwMF9QQ0lfQ0xPQ0s7CisjZWxzZQorCS8qIFNldCBib2FyZCBjbG9jayB0byBpbnRlcm5hbCBvc2NpbGxhdG9yIGNsb2NrICovCisJY3BjX3dyaXRlbChjYXJkLT5ody5wbHhiYXNlICsgY2FyZC0+aHcuZ3Bpb2NfcmVnLAorCQkgICBjcGNfcmVhZGwoY2FyZC0+aHcucGx4YmFzZSArIGNhcmQtPmh3LmdwaW9jX3JlZykgJiB+MHgwMDAwMDAwNFVMKTsKKwljYXJkLT5ody5jbG9jayA9IFBDMzAwX09TQ19DTE9DSzsKKyNlbmRpZgorCisJLyogRGV0ZWN0IGFjdHVhbCBvbi1ib2FyZCBSQU0gc2l6ZSAqLworCWNhcmQtPmh3LnJhbXNpemUgPSBkZXRlY3RfcmFtKGNhcmQpOworCisJLyogU2V0IEdsb2JhbCBTQ0EtSUkgcmVnaXN0ZXJzICovCisJY3BjX3dyaXRlYihjYXJkLT5ody5zY2FiYXNlICsgUENSLCBQQ1JfUFIyKTsKKwljcGNfd3JpdGViKGNhcmQtPmh3LnNjYWJhc2UgKyBCVENSLCAweDEwKTsKKwljcGNfd3JpdGViKGNhcmQtPmh3LnNjYWJhc2UgKyBXQ1JMLCAwKTsKKwljcGNfd3JpdGViKGNhcmQtPmh3LnNjYWJhc2UgKyBETUVSLCAweDgwKTsKKworCWlmIChjYXJkLT5ody50eXBlID09IFBDMzAwX1RFKSB7CisJCXVjY2hhciByZWcxOworCisJCS8qIENoZWNrIENQTEQgdmVyc2lvbiAqLworCQlyZWcxID0gY3BjX3JlYWRiKGNhcmQtPmh3LmZhbGNiYXNlICsgQ1BMRF9SRUcxKTsKKwkJY3BjX3dyaXRlYihjYXJkLT5ody5mYWxjYmFzZSArIENQTERfUkVHMSwgKHJlZzEgKyAweDVhKSk7CisJCWlmIChjcGNfcmVhZGIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBDUExEX1JFRzEpID09IHJlZzEpIHsKKwkJCS8qIE5ldyBDUExEICovCisJCQljYXJkLT5ody5jcGxkX2lkID0gY3BjX3JlYWRiKGNhcmQtPmh3LmZhbGNiYXNlICsgQ1BMRF9JRF9SRUcpOworCQkJY2FyZC0+aHcuY3BsZF9yZWcxID0gQ1BMRF9WMl9SRUcxOworCQkJY2FyZC0+aHcuY3BsZF9yZWcyID0gQ1BMRF9WMl9SRUcyOworCQl9IGVsc2UgeworCQkJLyogb2xkIENQTEQgKi8KKwkJCWNhcmQtPmh3LmNwbGRfaWQgPSAwOworCQkJY2FyZC0+aHcuY3BsZF9yZWcxID0gQ1BMRF9SRUcxOworCQkJY2FyZC0+aHcuY3BsZF9yZWcyID0gQ1BMRF9SRUcyOworCQkJY3BjX3dyaXRlYihjYXJkLT5ody5mYWxjYmFzZSArIENQTERfUkVHMSwgcmVnMSk7CisJCX0KKworCQkvKiBFbmFibGUgdGhlIGJvYXJkJ3MgZ2xvYmFsIGNsb2NrICovCisJCWNwY193cml0ZWIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzEsCisJCQkgICBjcGNfcmVhZGIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzEpIHwKKwkJCSAgIENQTERfUkVHMV9HTE9CQUxfQ0xLKTsKKworCX0KKworCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5ody5uY2hhbjsgaSsrKSB7CisJCXBjMzAwY2hfdCAqY2hhbiA9ICZjYXJkLT5jaGFuW2ldOworCQlwYzMwMGRldl90ICpkID0gJmNoYW4tPmQ7CisJCWhkbGNfZGV2aWNlICpoZGxjOworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJCWNoYW4tPmNhcmQgPSBjYXJkOworCQljaGFuLT5jaGFubmVsID0gaTsKKwkJY2hhbi0+Y29uZi5waHlzX3NldHRpbmdzLmNsb2NrX3JhdGUgPSAwOworCQljaGFuLT5jb25mLnBoeXNfc2V0dGluZ3MuY2xvY2tfdHlwZSA9IENMT0NLX0VYVDsKKwkJY2hhbi0+Y29uZi5wcm90b19zZXR0aW5ncy5lbmNvZGluZyA9IEVOQ09ESU5HX05SWjsKKwkJY2hhbi0+Y29uZi5wcm90b19zZXR0aW5ncy5wYXJpdHkgPSBQQVJJVFlfQ1JDMTZfUFIxX0NDSVRUOworCQlzd2l0Y2ggKGNhcmQtPmh3LnR5cGUpIHsKKwkJCWNhc2UgUEMzMDBfVEU6CisJCQkJY2hhbi0+Y29uZi5tZWRpYSA9IElGX0lGQUNFX1QxOworCQkJCWNoYW4tPmNvbmYubGNvZGUgPSBQQzMwMF9MQ19COFpTOworCQkJCWNoYW4tPmNvbmYuZnJfbW9kZSA9IFBDMzAwX0ZSX0VTRjsKKwkJCQljaGFuLT5jb25mLmxibyA9IFBDMzAwX0xCT18wX0RCOworCQkJCWNoYW4tPmNvbmYucnhfc2VucyA9IFBDMzAwX1JYX1NFTlNfU0g7CisJCQkJY2hhbi0+Y29uZi50c2xvdF9iaXRtYXAgPSAweGZmZmZmZmZmVUw7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUEMzMDBfWDIxOgorCQkJCWNoYW4tPmNvbmYubWVkaWEgPSBJRl9JRkFDRV9YMjE7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUEMzMDBfUlNWOgorCQkJZGVmYXVsdDoKKwkJCQljaGFuLT5jb25mLm1lZGlhID0gSUZfSUZBQ0VfVjM1OworCQkJCWJyZWFrOworCQl9CisJCWNoYW4tPmNvbmYucHJvdG8gPSBJRl9QUk9UT19QUFA7CisJCWNoYW4tPnR4X2ZpcnN0X2JkID0gMDsKKwkJY2hhbi0+dHhfbmV4dF9iZCA9IDA7CisJCWNoYW4tPnJ4X2ZpcnN0X2JkID0gMDsKKwkJY2hhbi0+cnhfbGFzdF9iZCA9IE5fRE1BX1JYX0JVRiAtIDE7CisJCWNoYW4tPm5mcmVlX3R4X2JkID0gTl9ETUFfVFhfQlVGOworCisJCWQtPmNoYW4gPSBjaGFuOworCQlkLT50eF9za2IgPSBOVUxMOworCQlkLT50cmFjZV9vbiA9IDA7CisJCWQtPmxpbmVfb24gPSAwOworCQlkLT5saW5lX29mZiA9IDA7CisKKwkJZGV2ID0gYWxsb2NfaGRsY2RldihOVUxMKTsKKwkJaWYgKGRldiA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJCWhkbGMtPnhtaXQgPSBjcGNfcXVldWVfeG1pdDsKKwkJaGRsYy0+YXR0YWNoID0gY3BjX2F0dGFjaDsKKwkJZC0+ZGV2ID0gZGV2OworCQlkZXYtPm1lbV9zdGFydCA9IGNhcmQtPmh3LnJhbXBoeXM7CisJCWRldi0+bWVtX2VuZCA9IGNhcmQtPmh3LnJhbXBoeXMgKyBjYXJkLT5ody5yYW1zaXplIC0gMTsKKwkJZGV2LT5pcnEgPSBjYXJkLT5ody5pcnE7CisJCWRldi0+aW5pdCA9IE5VTEw7CisJCWRldi0+dHhfcXVldWVfbGVuID0gUEMzMDBfVFhfUVVFVUVfTEVOOworCQlkZXYtPm10dSA9IFBDMzAwX0RFRl9NVFU7CisKKwkJZGV2LT5vcGVuID0gY3BjX29wZW47CisJCWRldi0+c3RvcCA9IGNwY19jbG9zZTsKKwkJZGV2LT50eF90aW1lb3V0ID0gY3BjX3R4X3RpbWVvdXQ7CisJCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBQQzMwMF9UWF9USU1FT1VUOworCQlkZXYtPmdldF9zdGF0cyA9IGNwY19nZXRfc3RhdHM7CisJCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gTlVMTDsKKwkJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBOVUxMOworCQlkZXYtPmNoYW5nZV9tdHUgPSBjcGNfY2hhbmdlX210dTsKKwkJZGV2LT5kb19pb2N0bCA9IGNwY19pb2N0bDsKKworCQlpZiAocmVnaXN0ZXJfaGRsY19kZXZpY2UoZGV2KSA9PSAwKSB7CisJCQlkZXYtPnByaXYgPSBkOwkvKiBXZSBuZWVkICdwcml2JywgaGRsYyBkb2Vzbid0ICovCisJCQlwcmludGsoIiVzOiBDeWNsYWRlcy1QQzMwMC8iLCBkZXYtPm5hbWUpOworCQkJc3dpdGNoIChjYXJkLT5ody50eXBlKSB7CisJCQkJY2FzZSBQQzMwMF9URToKKwkJCQkJaWYgKGNhcmQtPmh3LmJ1cyA9PSBQQzMwMF9QTUMpIHsKKwkJCQkJCXByaW50aygiVEUtTSIpOworCQkJCQl9IGVsc2UgeworCQkJCQkJcHJpbnRrKCJURSAgIik7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFBDMzAwX1gyMToKKwkJCQkJcHJpbnRrKCJYMjEgIik7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBQQzMwMF9SU1Y6CisJCQkJZGVmYXVsdDoKKwkJCQkJcHJpbnRrKCJSU1YgIik7CisJCQkJCWJyZWFrOworCQkJfQorCQkJcHJpbnRrICgiICMlZCwgJWRLQiBvZiBSQU0gYXQgMHglMDh4LCBJUlElZCwgY2hhbm5lbCAlZC5cbiIsCisJCQkJIGJvYXJkX25iciwgY2FyZC0+aHcucmFtc2l6ZSAvIDEwMjQsCisJCQkJIGNhcmQtPmh3LnJhbXBoeXMsIGNhcmQtPmh3LmlycSwgaSArIDEpOworCQkJZGV2Y291bnQrKzsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayAoIkRldiVkIG9uIGNhcmQoMHglMDh4KTogdW5hYmxlIHRvIGFsbG9jYXRlIGkvZiBuYW1lLlxuIiwKKwkJCQkgaSArIDEsIGNhcmQtPmh3LnJhbXBoeXMpOworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCXNwaW5fbG9ja19pbml0KCZjYXJkLT5jYXJkX2xvY2spOworCisJYm9hcmRfbmJyKys7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitjcGNfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCBmaXJzdF90aW1lID0gMTsKKwl1Y2NoYXIgY3BjX3Jldl9pZDsKKwlpbnQgZXJyID0gMCwgZWVwcm9tX291dGRhdGVkID0gMDsKKwl1Y3Nob3J0IGRldmljZV9pZDsKKwlwYzMwMF90ICpjYXJkOworCisJaWYgKGZpcnN0X3RpbWUpIHsKKwkJZmlyc3RfdGltZSA9IDA7CisJCXNob3dfdmVyc2lvbigpOworI2lmZGVmIENPTkZJR19QQzMwMF9NTFBQUAorCQljcGNfdHR5X3Jlc2V0X3ZhcigpOworI2VuZGlmCisJfQorCisJY2FyZCA9IChwYzMwMF90ICopIGttYWxsb2Moc2l6ZW9mKHBjMzAwX3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2FyZCA9PSBOVUxMKSB7CisJCXByaW50aygiUEMzMDAgZm91bmQgYXQgUkFNIDB4JTA4bHgsICIKKwkJICAgICAgICJidXQgY291bGQgbm90IGFsbG9jYXRlIGNhcmQgc3RydWN0dXJlLlxuIiwKKwkJICAgICAgIHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoY2FyZCwgMCwgc2l6ZW9mKHBjMzAwX3QpKTsKKworCS8qIHJlYWQgUENJIGNvbmZpZ3VyYXRpb24gYXJlYSAqLworCWRldmljZV9pZCA9IGVudC0+ZGV2aWNlOworCWNhcmQtPmh3LmlycSA9IHBkZXYtPmlycTsKKwljYXJkLT5ody5pb3BoeXMgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisJY2FyZC0+aHcuaW9zaXplID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKTsKKwljYXJkLT5ody5zY2FwaHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpOworCWNhcmQtPmh3LnNjYXNpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDIpOworCWNhcmQtPmh3LnJhbXBoeXMgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMyk7CisJY2FyZC0+aHcuYWxsb2NfcmFtc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMyk7CisJY2FyZC0+aHcuZmFsY3BoeXMgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgNCk7CisJY2FyZC0+aHcuZmFsY3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDQpOworCWNhcmQtPmh3LnBseHBoeXMgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgNSk7CisJY2FyZC0+aHcucGx4c2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgNSk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmY3BjX3Jldl9pZCk7CisKKwlzd2l0Y2ggKGRldmljZV9pZCkgeworCQljYXNlIFBDSV9ERVZJQ0VfSURfUEMzMDBfUlhfMToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BDMzAwX1RFXzE6CisJCWNhc2UgUENJX0RFVklDRV9JRF9QQzMwMF9URV9NXzE6CisJCQljYXJkLT5ody5uY2hhbiA9IDE7CisJCQlicmVhazsKKworCQljYXNlIFBDSV9ERVZJQ0VfSURfUEMzMDBfUlhfMjoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BDMzAwX1RFXzI6CisJCWNhc2UgUENJX0RFVklDRV9JRF9QQzMwMF9URV9NXzI6CisJCWRlZmF1bHQ6CisJCQljYXJkLT5ody5uY2hhbiA9IFBDMzAwX01BWENIQU47CisJCQlicmVhazsKKwl9CisjaWZkZWYgUEMzMDBfREVCVUdfUENJCisJcHJpbnRrKCJjcGMgKGJ1cz0weDAleCxwY2lfaWQ9MHgleCwiLCBwZGV2LT5idXMtPm51bWJlciwgcGRldi0+ZGV2Zm4pOworCXByaW50aygicmV2X2lkPSVkKSBJUlElZFxuIiwgY3BjX3Jldl9pZCwgY2FyZC0+aHcuaXJxKTsKKwlwcmludGsoImNwYzpmb3VuZCAgcmFtYWRkcj0weCUwOGx4IHBseGFkZHI9MHglMDhseCAiCisJICAgICAgICJjdGxhZGRyPTB4JTA4bHggZmFsY2FkZHI9MHglMDhseFxuIiwKKwkgICAgICAgY2FyZC0+aHcucmFtcGh5cywgY2FyZC0+aHcucGx4cGh5cywgY2FyZC0+aHcuc2NhcGh5cywKKwkgICAgICAgY2FyZC0+aHcuZmFsY3BoeXMpOworI2VuZGlmCisJLyogQWx0aG91Z2ggd2UgZG9uJ3QgdXNlIHRoaXMgSS9PIHJlZ2lvbiwgd2Ugc2hvdWxkCisJICogcmVxdWVzdCBpdCBmcm9tIHRoZSBrZXJuZWwgYW55d2F5LCB0byBhdm9pZCBwcm9ibGVtcworCSAqIHdpdGggb3RoZXIgZHJpdmVycyBhY2Nlc3NpbmcgaXQuICovCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihjYXJkLT5ody5pb3BoeXMsIGNhcmQtPmh3Lmlvc2l6ZSwgIlBMWCBSZWdpc3RlcnMiKSkgeworCQkvKiBJbiBjYXNlIHdlIGNhbid0IGFsbG9jYXRlIGl0LCB3YXJuIHVzZXIgKi8KKwkJcHJpbnRrKCJXQVJOSU5HOiBjb3VsZG4ndCBhbGxvY2F0ZSBJL08gcmVnaW9uIGZvciBQQzMwMCBib2FyZCAiCisJCSAgICAgICAiYXQgMHglMDh4IVxuIiwgY2FyZC0+aHcucmFtcGh5cyk7CisJfQorCisJaWYgKGNhcmQtPmh3LnBseHBoeXMpIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAsIGNhcmQtPmh3LnBseHBoeXMpOworCX0gZWxzZSB7CisJCWVlcHJvbV9vdXRkYXRlZCA9IDE7CisJCWNhcmQtPmh3LnBseHBoeXMgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJCWNhcmQtPmh3LnBseHNpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOworCX0KKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGNhcmQtPmh3LnBseHBoeXMsIGNhcmQtPmh3LnBseHNpemUsCisJCQkJIlBMWCBSZWdpc3RlcnMiKSkgeworCQlwcmludGsoIlBDMzAwIGZvdW5kIGF0IFJBTSAweCUwOHgsICIKKwkJICAgICAgICJidXQgY291bGQgbm90IGFsbG9jYXRlIFBMWCBtZW0gcmVnaW9uLlxuIiwKKwkJICAgICAgIGNhcmQtPmh3LnJhbXBoeXMpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9yZWxlYXNlX2lvOworCX0KKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihjYXJkLT5ody5yYW1waHlzLCBjYXJkLT5ody5hbGxvY19yYW1zaXplLAorCQkJCSJPbi1ib2FyZCBSQU0iKSkgeworCQlwcmludGsoIlBDMzAwIGZvdW5kIGF0IFJBTSAweCUwOHgsICIKKwkJICAgICAgICJidXQgY291bGQgbm90IGFsbG9jYXRlIFJBTSBtZW0gcmVnaW9uLlxuIiwKKwkJICAgICAgIGNhcmQtPmh3LnJhbXBoeXMpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9yZWxlYXNlX3BseDsKKwl9CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oY2FyZC0+aHcuc2NhcGh5cywgY2FyZC0+aHcuc2Nhc2l6ZSwKKwkJCQkiU0NBLUlJIFJlZ2lzdGVycyIpKSB7CisJCXByaW50aygiUEMzMDAgZm91bmQgYXQgUkFNIDB4JTA4eCwgIgorCQkgICAgICAgImJ1dCBjb3VsZCBub3QgYWxsb2NhdGUgU0NBIG1lbSByZWdpb24uXG4iLAorCQkgICAgICAgY2FyZC0+aHcucmFtcGh5cyk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3JlbGVhc2VfcmFtOworCX0KKworCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldikpICE9IDApCisJCWdvdG8gZXJyX3JlbGVhc2Vfc2NhOworCisJY2FyZC0+aHcucGx4YmFzZSA9IGlvcmVtYXAoY2FyZC0+aHcucGx4cGh5cywgY2FyZC0+aHcucGx4c2l6ZSk7CisJY2FyZC0+aHcucmFtYmFzZSA9IGlvcmVtYXAoY2FyZC0+aHcucmFtcGh5cywgY2FyZC0+aHcuYWxsb2NfcmFtc2l6ZSk7CisJY2FyZC0+aHcuc2NhYmFzZSA9IGlvcmVtYXAoY2FyZC0+aHcuc2NhcGh5cywgY2FyZC0+aHcuc2Nhc2l6ZSk7CisJc3dpdGNoIChkZXZpY2VfaWQpIHsKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BDMzAwX1RFXzE6CisJCWNhc2UgUENJX0RFVklDRV9JRF9QQzMwMF9URV8yOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfUEMzMDBfVEVfTV8xOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfUEMzMDBfVEVfTV8yOgorCQkJcmVxdWVzdF9tZW1fcmVnaW9uKGNhcmQtPmh3LmZhbGNwaHlzLCBjYXJkLT5ody5mYWxjc2l6ZSwKKwkJCQkJICAgIkZBTEMgUmVnaXN0ZXJzIik7CisJCQljYXJkLT5ody5mYWxjYmFzZSA9IGlvcmVtYXAoY2FyZC0+aHcuZmFsY3BoeXMsIGNhcmQtPmh3LmZhbGNzaXplKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUENJX0RFVklDRV9JRF9QQzMwMF9SWF8xOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfUEMzMDBfUlhfMjoKKwkJZGVmYXVsdDoKKwkJCWNhcmQtPmh3LmZhbGNiYXNlID0gTlVMTDsKKwkJCWJyZWFrOworCX0KKworI2lmZGVmIFBDMzAwX0RFQlVHX1BDSQorCXByaW50aygiY3BjOiByZWxvY2F0ZSByYW1hZGRyPTB4JTA4bHggcGx4YWRkcj0weCUwOGx4ICIKKwkgICAgICAgImN0bGFkZHI9MHglMDhseCBmYWxjYWRkcj0weCUwOGx4XG4iLAorCSAgICAgICBjYXJkLT5ody5yYW1iYXNlLCBjYXJkLT5ody5wbHhiYXNlLCBjYXJkLT5ody5zY2FiYXNlLAorCSAgICAgICBjYXJkLT5ody5mYWxjYmFzZSk7CisjZW5kaWYKKworCS8qIFNldCBQQ0kgZHJ2IHBvaW50ZXIgdG8gdGhlIGNhcmQgc3RydWN0dXJlICovCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGNhcmQpOworCisJLyogU2V0IGJvYXJkIHR5cGUgKi8KKwlzd2l0Y2ggKGRldmljZV9pZCkgeworCQljYXNlIFBDSV9ERVZJQ0VfSURfUEMzMDBfVEVfMToKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BDMzAwX1RFXzI6CisJCWNhc2UgUENJX0RFVklDRV9JRF9QQzMwMF9URV9NXzE6CisJCWNhc2UgUENJX0RFVklDRV9JRF9QQzMwMF9URV9NXzI6CisJCQljYXJkLT5ody50eXBlID0gUEMzMDBfVEU7CisKKwkJCWlmICgoZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfUEMzMDBfVEVfTV8xKSB8fAorCQkJICAgIChkZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9QQzMwMF9URV9NXzIpKSB7CisJCQkJY2FyZC0+aHcuYnVzID0gUEMzMDBfUE1DOworCQkJCS8qIFNldCBQTFggcmVnaXN0ZXIgb2Zmc2V0cyAqLworCQkJCWNhcmQtPmh3LmdwaW9jX3JlZyA9IDB4NTQ7CisJCQkJY2FyZC0+aHcuaW50Y3RsX3JlZyA9IDB4NGM7CisJCQl9IGVsc2UgeworCQkJCWNhcmQtPmh3LmJ1cyA9IFBDMzAwX1BDSTsKKwkJCQkvKiBTZXQgUExYIHJlZ2lzdGVyIG9mZnNldHMgKi8KKwkJCQljYXJkLT5ody5ncGlvY19yZWcgPSAweDUwOworCQkJCWNhcmQtPmh3LmludGN0bF9yZWcgPSAweDRjOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1BDMzAwX1JYXzE6CisJCWNhc2UgUENJX0RFVklDRV9JRF9QQzMwMF9SWF8yOgorCQlkZWZhdWx0OgorCQkJY2FyZC0+aHcuYnVzID0gUEMzMDBfUENJOworCQkJLyogU2V0IFBMWCByZWdpc3RlciBvZmZzZXRzICovCisJCQljYXJkLT5ody5ncGlvY19yZWcgPSAweDUwOworCQkJY2FyZC0+aHcuaW50Y3RsX3JlZyA9IDB4NGM7CisKKwkJCWlmICgoY3BjX3JlYWRsKGNhcmQtPmh3LnBseGJhc2UgKyBjYXJkLT5ody5ncGlvY19yZWcpICYgUEMzMDBfQ1RZUEVfTUFTSykpIHsKKwkJCQljYXJkLT5ody50eXBlID0gUEMzMDBfWDIxOworCQkJfSBlbHNlIHsKKwkJCQljYXJkLT5ody50eXBlID0gUEMzMDBfUlNWOworCQkJfQorCQkJYnJlYWs7CisJfQorCisJLyogQWxsb2NhdGUgSVJRICovCisJaWYgKHJlcXVlc3RfaXJxKGNhcmQtPmh3LmlycSwgY3BjX2ludHIsIFNBX1NISVJRLCAiQ3ljbGFkZXMtUEMzMDAiLCBjYXJkKSkgeworCQlwcmludGsgKCJQQzMwMCBmb3VuZCBhdCBSQU0gMHglMDh4LCBidXQgY291bGQgbm90IGFsbG9jYXRlIElSUSVkLlxuIiwKKwkJCSBjYXJkLT5ody5yYW1waHlzLCBjYXJkLT5ody5pcnEpOworCQlnb3RvIGVycl9pb191bm1hcDsKKwl9CisKKwljcGNfaW5pdF9jYXJkKGNhcmQpOworCisJaWYgKGVlcHJvbV9vdXRkYXRlZCkKKwkJcHJpbnRrKCJXQVJOSU5HOiBQQzMwMCB3aXRoIG91dGRhdGVkIEVFUFJPTS5cbiIpOworCXJldHVybiAwOworCitlcnJfaW9fdW5tYXA6CisJaW91bm1hcChjYXJkLT5ody5wbHhiYXNlKTsKKwlpb3VubWFwKGNhcmQtPmh3LnNjYWJhc2UpOworCWlvdW5tYXAoY2FyZC0+aHcucmFtYmFzZSk7CisJaWYgKGNhcmQtPmh3LnR5cGUgPT0gUEMzMDBfVEUpIHsKKwkJaW91bm1hcChjYXJkLT5ody5mYWxjYmFzZSk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihjYXJkLT5ody5mYWxjcGh5cywgY2FyZC0+aHcuZmFsY3NpemUpOworCX0KK2Vycl9yZWxlYXNlX3NjYToKKwlyZWxlYXNlX21lbV9yZWdpb24oY2FyZC0+aHcuc2NhcGh5cywgY2FyZC0+aHcuc2Nhc2l6ZSk7CitlcnJfcmVsZWFzZV9yYW06CisJcmVsZWFzZV9tZW1fcmVnaW9uKGNhcmQtPmh3LnJhbXBoeXMsIGNhcmQtPmh3LmFsbG9jX3JhbXNpemUpOworZXJyX3JlbGVhc2VfcGx4OgorCXJlbGVhc2VfbWVtX3JlZ2lvbihjYXJkLT5ody5wbHhwaHlzLCBjYXJkLT5ody5wbHhzaXplKTsKK2Vycl9yZWxlYXNlX2lvOgorCXJlbGVhc2VfcmVnaW9uKGNhcmQtPmh3LmlvcGh5cywgY2FyZC0+aHcuaW9zaXplKTsKKwlrZnJlZShjYXJkKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGNwY19yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXBjMzAwX3QgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoY2FyZC0+aHcucmFtYmFzZSAhPSAwKSB7CisJCWludCBpOworCisJCS8qIERpc2FibGUgaW50ZXJydXB0cyBvbiB0aGUgUENJIGJyaWRnZSAqLworCQljcGNfd3JpdGV3KGNhcmQtPmh3LnBseGJhc2UgKyBjYXJkLT5ody5pbnRjdGxfcmVnLAorCQkJICAgY3BjX3JlYWR3KGNhcmQtPmh3LnBseGJhc2UgKyBjYXJkLT5ody5pbnRjdGxfcmVnKSAmIH4oMHgwMDQwKSk7CisKKwkJZm9yIChpID0gMDsgaSA8IGNhcmQtPmh3Lm5jaGFuOyBpKyspIHsKKwkJCXVucmVnaXN0ZXJfaGRsY19kZXZpY2UoY2FyZC0+Y2hhbltpXS5kLmRldik7CisJCX0KKwkJaW91bm1hcChjYXJkLT5ody5wbHhiYXNlKTsKKwkJaW91bm1hcChjYXJkLT5ody5zY2FiYXNlKTsKKwkJaW91bm1hcChjYXJkLT5ody5yYW1iYXNlKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGNhcmQtPmh3LnBseHBoeXMsIGNhcmQtPmh3LnBseHNpemUpOworCQlyZWxlYXNlX21lbV9yZWdpb24oY2FyZC0+aHcucmFtcGh5cywgY2FyZC0+aHcuYWxsb2NfcmFtc2l6ZSk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihjYXJkLT5ody5zY2FwaHlzLCBjYXJkLT5ody5zY2FzaXplKTsKKwkJcmVsZWFzZV9yZWdpb24oY2FyZC0+aHcuaW9waHlzLCBjYXJkLT5ody5pb3NpemUpOworCQlpZiAoY2FyZC0+aHcudHlwZSA9PSBQQzMwMF9URSkgeworCQkJaW91bm1hcChjYXJkLT5ody5mYWxjYmFzZSk7CisJCQlyZWxlYXNlX21lbV9yZWdpb24oY2FyZC0+aHcuZmFsY3BoeXMsIGNhcmQtPmh3LmZhbGNzaXplKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+aHcubmNoYW47IGkrKykKKwkJCWlmIChjYXJkLT5jaGFuW2ldLmQuZGV2KQorCQkJCWZyZWVfbmV0ZGV2KGNhcmQtPmNoYW5baV0uZC5kZXYpOworCQlpZiAoY2FyZC0+aHcuaXJxKQorCQkJZnJlZV9pcnEoY2FyZC0+aHcuaXJxLCBjYXJkKTsKKwkJa2ZyZWUoY2FyZCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY3BjX2RyaXZlciA9IHsKKwkubmFtZSAgICAgICAgICAgPSAicGMzMDAiLAorCS5pZF90YWJsZSAgICAgICA9IGNwY19wY2lfZGV2X2lkLAorCS5wcm9iZSAgICAgICAgICA9IGNwY19pbml0X29uZSwKKwkucmVtb3ZlICAgICAgICAgPSBfX2RldmV4aXRfcChjcGNfcmVtb3ZlX29uZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjcGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmNwY19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY3BjX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZjcGNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoY3BjX2luaXQpOworbW9kdWxlX2V4aXQoY3BjX2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJDeWNsYWRlcy1QQzMwMCBjYXJkcyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoICAiQXV0aG9yOiBJdmFuIFBhc3NvcyA8aXZhbkBjeWNsYWRlcy5jb20+XHJcbiIKKyAgICAgICAgICAgICAgICAiTWFpbnRhaW5lcjogUEMzMDAgTWFpbnRhaW5lciA8cGMzMDBAY3ljbGFkZXMuY29tIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF90dHkuYyBiL2RyaXZlcnMvbmV0L3dhbi9wYzMwMF90dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWY4NGFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3BjMzAwX3R0eS5jCkBAIC0wLDAgKzEsMTA5NSBAQAorLyoKKyAqIHBjMzAwX3R0eS5jCUN5Y2xhZGVzLVBDMzAwKHRtKSBUVFkgRHJpdmVyLgorICoKKyAqIEF1dGhvcjoJUmVnaW5hIEtvZGF0byA8cmVnaW5ha0BjeWNsYWRlcy5jb20+CisgKgorICogQ29weXJpZ2h0OgkoYykgMTk5OS0yMDAyIEN5Y2xhZGVzIENvcnAuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAgCisgKiAgJExvZzogcGMzMDBfdHR5LmMsdiAkCisgKiAgUmV2aXNpb24gMy43ICAyMDAyLzAzLzA3IDE0OjE3OjA5ICBoZW5yaXF1ZQorICogIExpY2Vuc2UgZGF0YSBmaXhlZAorICoKKyAqICBSZXZpc2lvbiAzLjYgIDIwMDEvMTIvMTAgMTI6Mjk6NDIgIHJlZ2luYQorICogIEZpeCB0aGUgTUxQUFAgYnVnCisgKgorICogIFJldmlzaW9uIDMuNSAgMjAwMS8xMC8zMSAxMToyMDowNSAgcmVnaW5hCisgKiAgYXV0b21hdGljIHBwcGQgc3RhcnRzCisgKgorICogIFJldmlzaW9uIDMuNCAgMjAwMS8wOC8wNiAxMjowMTo1MSAgcmVnaW5hCisgKiAgcHJvYmxlbSBpbiBEU1JfREUgYml0CisgKgorICogIFJldmlzaW9uIDMuMyAgMjAwMS8wNy8yNiAyMjo1ODo0MSAgcmVnaW5hCisgKiAgdXBkYXRlIEVEQSB2YWx1ZQorICoKKyAqICBSZXZpc2lvbiAzLjIgIDIwMDEvMDcvMTIgMTM6MTE6MjAgIHJlZ2luYQorICogIGJ1ZyBmaXggLSBEQ0QtT0ZGIGluIHBjMzAwIHR0eSBkcml2ZXIKKyAqCisgKglETUEgdHJhbnNtaXNzaW9uIGJ1ZyBmaXgKKyAqICAKKyAqICBSZXZpc2lvbiAzLjEgIDIwMDEvMDYvMjIgMTM6MTM6MDIgIHJlZ2luYQorICogIE1MUFBQIGltcGxlbWVudGF0aW9uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorLyogVFRZIGluY2x1ZGVzICovCisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJwYzMwMC5oIgorCisvKiBkZWZpbmVzIGFuZCBtYWNyb3MgKi8KKy8qIFRUWSBHbG9iYWwgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUJQ1BDX1RUWV9OUE9SVFMJOAkvKiBtYXhpbXVtIG51bWJlciBvZiB0aGUgc3luYyB0dHkgY29ubmVjdGlvbnMgKi8KKyNkZWZpbmUJQ1BDX1RUWV9NQUpPUglDWUNMQURFU19NQUpPUgkKKyNkZWZpbmUgQ1BDX1RUWV9NSU5PUl9TVEFSVAkyNDAJLyogbWlub3Igb2YgdGhlIGZpcnN0IFBDMzAwIGludGVyZmFjZSAqLworCisjZGVmaW5lIENQQ19UVFlfTUFYX01UVQkyMDAwCQorCisvKiB0dHkgaW50ZXJmYWNlIHN0YXRlICovCisjZGVmaW5lCUNQQ19UVFlfU1RfSURMRQkwCisjZGVmaW5lIENQQ19UVFlfU1RfSU5JVAkxCS8qIGNvbmZpZ3VyZWQgd2l0aCBNTFBQUCBhbmQgdXAgKi8KKyNkZWZpbmUgQ1BDX1RUWV9TVF9PUEVOCTIJLyogb3BlbmVkIGJ5IGFwcGxpY2F0aW9uICovCisKKyNkZWZpbmUJQ1BDX1RUWV9MT0NLKGNhcmQsZmxhZ3MpXAorCWRvIHtcCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgQ1BDX1RUWV9VTkxPQ0soY2FyZCxmbGFncykJXAorCWRvIHtcCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOwlcCisJfSB3aGlsZSAoMCkKKworLy8jZGVmaW5lCUNQQ19UVFlfREJHKGZvcm1hdCxhLi4uKQlwcmludGsoZm9ybWF0LCMjYSkKKyNkZWZpbmUJQ1BDX1RUWV9EQkcoZm9ybWF0LGEuLi4pCisKKy8qIGRhdGEgc3RydWN0dXJlcyAqLwordHlwZWRlZiBzdHJ1Y3QgX3N0X2NwY19yeF9idWYgeworCXN0cnVjdCBfc3RfY3BjX3J4X2J1ZgkqbmV4dDsKKwlpbnQJCXNpemU7CisJdW5zaWduZWQgY2hhcglkYXRhWzFdOworfSBzdF9jcGNfcnhfYnVmOworCitzdHJ1Y3Qgc3RfY3BjX3J4X2xpc3QgeworCXN0X2NwY19yeF9idWYJKmZpcnN0OworCXN0X2NwY19yeF9idWYJKmxhc3Q7Cit9OworCit0eXBlZGVmCXN0cnVjdCBfc3RfY3BjX3R0eV9hcmVhIHsKKwlpbnQJCXN0YXRlOwkJLyogc3RhdGUgb2YgdGhlIFRUWSBpbnRlcmZhY2UgKi8KKwlpbnQJCW51bV9vcGVuOwkKKwl1bnNpZ25lZCBpbnQgCXR0eV9taW5vcjsJLyogbWlub3IgdGhpcyBpbnRlcmZhY2UgKi8KKwl2b2xhdGlsZSBzdHJ1Y3Qgc3RfY3BjX3J4X2xpc3QgYnVmX3J4OwkvKiBwdHIuIHRvIHJlY2VwdGlvbiBidWZmZXIgKi8KKwl1bnNpZ25lZCBjaGFyKglidWZfdHg7CQkvKiBwdHIuIHRvIHRyYW5zbWlzc2lvbiBidWZmZXIgKi8KKwlwYzMwMGRldl90KglwYzMwMGRldjsJLyogcHRyLiB0byBpbmZvIHN0cnVjdCBpbiBQQzMwMCBkcml2ZXIgKi8KKwl1bnNpZ25lZCBjaGFyCW5hbWVbMjBdOwkvKiBpbnRlcmYuIG5hbWUgKyAiLXR0eSIgKi8KKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwkJCisJc3RydWN0IHdvcmtfc3RydWN0IHR0eV90eF93b3JrOyAvKiB0eCB3b3JrIC0gdHggaW50ZXJydXB0ICovCisJc3RydWN0IHdvcmtfc3RydWN0IHR0eV9yeF93b3JrOyAvKiByeCB3b3JrIC0gcnggaW50ZXJydXB0ICovCisJfSBzdF9jcGNfdHR5X2FyZWE7CisKKy8qIFRUWSBkYXRhIHN0cnVjdHVyZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciBzZXJpYWxfZHJ2OworCisvKiBsb2NhbCB2YXJpYWJsZXMgKi8KK3N0X2NwY190dHlfYXJlYQljcGNfdHR5X2FyZWFbQ1BDX1RUWV9OUE9SVFNdOworCitpbnQgY3BjX3R0eV9jbnQ9MDsJLyogbnVtYmVyIG9mIGludHJmYWNlcyBjb25maWd1cmVkIHdpdGggTUxQUFAgKi8KK2ludCBjcGNfdHR5X3VucmVnX2ZsYWcgPSAwOworCisvKiBUVFkgZnVuY3Rpb25zIHByb3RvdHlwZSAqLworc3RhdGljIGludCBjcGNfdHR5X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZsaXApOworc3RhdGljIHZvaWQgY3BjX3R0eV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmxpcCk7CitzdGF0aWMgaW50IGNwY190dHlfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpOworc3RhdGljIGludCBjcGNfdHR5X3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgaW50IGNwY190dHlfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOworc3RhdGljIHZvaWQgY3BjX3R0eV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgdm9pZCBjcGNfdHR5X2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKK3N0YXRpYyB2b2lkIGNwY190dHlfcnhfd29yayh2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIGNwY190dHlfdHhfd29yayh2b2lkICpkYXRhKTsKK3N0YXRpYyBpbnQgY3BjX3R0eV9zZW5kX3RvX2NhcmQocGMzMDBkZXZfdCAqZGV2LHZvaWQgKmJ1ZiwgaW50IGxlbik7CitzdGF0aWMgdm9pZCBjcGNfdHR5X3RyYWNlKHBjMzAwZGV2X3QgKmRldiwgY2hhciogYnVmLCBpbnQgbGVuLCBjaGFyIHJ4dHgpOworc3RhdGljIHZvaWQgY3BjX3R0eV9zaWduYWxfb2ZmKHBjMzAwZGV2X3QgKnBjMzAwZGV2LCB1bnNpZ25lZCBjaGFyKTsKK3N0YXRpYyB2b2lkIGNwY190dHlfc2lnbmFsX29uKHBjMzAwZGV2X3QgKnBjMzAwZGV2LCB1bnNpZ25lZCBjaGFyKTsKKworaW50IHBjMzAwX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICosCisJCQl1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CitpbnQgcGMzMDBfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKik7CisKKy8qIGZ1bmN0aW9ucyBjYWxsZWQgYnkgUEMzMDAgZHJpdmVyICovCit2b2lkIGNwY190dHlfaW5pdChwYzMwMGRldl90ICpkZXYpOwordm9pZCBjcGNfdHR5X3VucmVnaXN0ZXJfc2VydmljZShwYzMwMGRldl90ICpwYzMwMGRldik7Cit2b2lkIGNwY190dHlfcmVjZWl2ZShwYzMwMGRldl90ICpwYzMwMGRldik7Cit2b2lkIGNwY190dHlfdHJpZ2dlcl9wb2xsKHBjMzAwZGV2X3QgKnBjMzAwZGV2KTsKK3ZvaWQgY3BjX3R0eV9yZXNldF92YXIodm9pZCk7CisKKy8qCisgKiBQQzMwMCBUVFkgY2xlYXIgInNpZ25hbCIKKyAqLworc3RhdGljIHZvaWQgY3BjX3R0eV9zaWduYWxfb2ZmKHBjMzAwZGV2X3QgKnBjMzAwZGV2LCB1bnNpZ25lZCBjaGFyIHNpZ25hbCkKK3sKKwlwYzMwMGNoX3QgKnBjMzAwY2hhbiA9IChwYzMwMGNoX3QgKilwYzMwMGRldi0+Y2hhbjsgCisJcGMzMDBfdCAqY2FyZCA9IChwYzMwMF90ICopIHBjMzAwY2hhbi0+Y2FyZDsgCisJaW50IGNoID0gcGMzMDBjaGFuLT5jaGFubmVsOyAKKwl1bnNpZ25lZCBsb25nIGZsYWdzOyAKKworCUNQQ19UVFlfREJHKCIlcy10dHk6IENsZWFyIHNpZ25hbCAleFxuIiwKKwkJcGMzMDBkZXYtPmRldi0+bmFtZSwgc2lnbmFsKTsKKwlDUENfVFRZX0xPQ0soY2FyZCwgZmxhZ3MpOyAKKwljcGNfd3JpdGViKGNhcmQtPmh3LnNjYWJhc2UgKyBNX1JFRyhDVEwsY2gpLCAKKwkJY3BjX3JlYWRiKGNhcmQtPmh3LnNjYWJhc2UrTV9SRUcoQ1RMLGNoKSkmIHNpZ25hbCk7CisJQ1BDX1RUWV9VTkxPQ0soY2FyZCxmbGFncyk7IAorfQorCisvKgorICogUEMzMDAgVFRZIHNldCAic2lnbmFsIiB0byBPTgorICovCitzdGF0aWMgdm9pZCBjcGNfdHR5X3NpZ25hbF9vbihwYzMwMGRldl90ICpwYzMwMGRldiwgdW5zaWduZWQgY2hhciBzaWduYWwpCit7CisJcGMzMDBjaF90ICpwYzMwMGNoYW4gPSAocGMzMDBjaF90ICopcGMzMDBkZXYtPmNoYW47IAorCXBjMzAwX3QgKmNhcmQgPSAocGMzMDBfdCAqKSBwYzMwMGNoYW4tPmNhcmQ7IAorCWludCBjaCA9IHBjMzAwY2hhbi0+Y2hhbm5lbDsgCisJdW5zaWduZWQgbG9uZyBmbGFnczsgCisKKwlDUENfVFRZX0RCRygiJXMtdHR5OiBTZXQgc2lnbmFsICV4XG4iLAorCQlwYzMwMGRldi0+ZGV2LT5uYW1lLCBzaWduYWwpOworCUNQQ19UVFlfTE9DSyhjYXJkLCBmbGFncyk7IAorCWNwY193cml0ZWIoY2FyZC0+aHcuc2NhYmFzZSArIE1fUkVHKENUTCxjaCksIAorCQljcGNfcmVhZGIoY2FyZC0+aHcuc2NhYmFzZStNX1JFRyhDVEwsY2gpKSYgfnNpZ25hbCk7CisJQ1BDX1RUWV9VTkxPQ0soY2FyZCxmbGFncyk7IAorfQorCisvKgorICogUEMzMDAgVFRZIGluaXRpYWxpemF0aW9uIHJvdXRpbmUKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBQQzMwMCBkcml2ZXIgZHVyaW5nIGJvYXJkIGNvbmZpZ3VyYXRpb24gCisgKiAoaW9jdGw9U0lPQ1NQMzAwQ09ORikuIEF0IHRoaXMgcG9pbnQgdGhlIGFkYXB0ZXIgaXMgY29tcGxldGVseQorICogaW5pdGlhbGl6ZWQuCisgKiBvIHZlcmlmeSBrZXJuZWwgdmVyc2lvbiAob25seSAyLjQueCkKKyAqIG8gcmVnaXN0ZXIgVFRZIGRyaXZlcgorICogbyBpbml0IGNwY190dHlfYXJlYSBzdHJ1Y3QKKyAqLwordm9pZCBjcGNfdHR5X2luaXQocGMzMDBkZXZfdCAqcGMzMDBkZXYpCit7CisJdW5zaWduZWQgbG9uZyBwb3J0OworCWludCBhdXg7CisJc3RfY3BjX3R0eV9hcmVhICogY3BjX3R0eTsKKworCS8qIGhkbGNYIC0gWD1pbnRlcmZhY2UgbnVtYmVyICovCisJcG9ydCA9IHBjMzAwZGV2LT5kZXYtPm5hbWVbNF0gLSAnMCc7CisJaWYgKHBvcnQgPj0gQ1BDX1RUWV9OUE9SVFMpIHsKKwkJcHJpbnRrKCIlcy10dHk6IGludmFsaWQgaW50ZXJmYWNlIHNlbGVjdGVkICgwLSVpKTogJWxpIiwKKwkJCXBjMzAwZGV2LT5kZXYtPm5hbWUsCisJCQlDUENfVFRZX05QT1JUUy0xLHBvcnQpOworCQlyZXR1cm47CisJfQorCisJaWYgKGNwY190dHlfY250ID09IDApIHsgLyogZmlyc3QgVFRZIGNvbm5lY3Rpb24gLT4gcmVnaXN0ZXIgZHJpdmVyICovCisJCUNQQ19UVFlfREJHKCIlcy10dHk6IGRyaXZlciBpbml0LCBtYWpvcjolaSwgbWlub3IgcmFuZ2U6JWk9JWlcbiIsCisJCQlwYzMwMGRldi0+ZGV2LT5uYW1lLAorCQkJQ1BDX1RUWV9NQUpPUiwgQ1BDX1RUWV9NSU5PUl9TVEFSVCwKKwkJCUNQQ19UVFlfTUlOT1JfU1RBUlQrQ1BDX1RUWV9OUE9SVFMpOworCQkvKiBpbml0aWFsaXplIHR0eSBkcml2ZXIgc3RydWN0ICovCisJCW1lbXNldCgmc2VyaWFsX2RydiwwLHNpemVvZihzdHJ1Y3QgdHR5X2RyaXZlcikpOworCQlzZXJpYWxfZHJ2Lm1hZ2ljID0gVFRZX0RSSVZFUl9NQUdJQzsKKwkJc2VyaWFsX2Rydi5vd25lciA9IFRISVNfTU9EVUxFOworCQlzZXJpYWxfZHJ2LmRyaXZlcl9uYW1lID0gInBjMzAwX3R0eSI7CisJCXNlcmlhbF9kcnYubmFtZSA9ICJ0dHlDUCI7CisJCXNlcmlhbF9kcnYubWFqb3IgPSBDUENfVFRZX01BSk9SOworCQlzZXJpYWxfZHJ2Lm1pbm9yX3N0YXJ0ID0gQ1BDX1RUWV9NSU5PUl9TVEFSVDsKKwkJc2VyaWFsX2Rydi5udW0gPSBDUENfVFRZX05QT1JUUzsKKwkJc2VyaWFsX2Rydi50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwkJc2VyaWFsX2Rydi5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCisJCXNlcmlhbF9kcnYuaW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCQlzZXJpYWxfZHJ2LmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjk2MDB8Q1M4fENSRUFEfEhVUENMfENMT0NBTDsKKwkJc2VyaWFsX2Rydi5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisKKwkJLyogaW50ZXJmYWNlIHJvdXRpbmVzIGZyb20gdGhlIHVwcGVyIHR0eSBsYXllciB0byB0aGUgdHR5IGRyaXZlciAqLworCQlzZXJpYWxfZHJ2Lm9wZW4gPSBjcGNfdHR5X29wZW47CisJCXNlcmlhbF9kcnYuY2xvc2UgPSBjcGNfdHR5X2Nsb3NlOworCQlzZXJpYWxfZHJ2LndyaXRlID0gY3BjX3R0eV93cml0ZTsgCisJCXNlcmlhbF9kcnYud3JpdGVfcm9vbSA9IGNwY190dHlfd3JpdGVfcm9vbTsgCisJCXNlcmlhbF9kcnYuY2hhcnNfaW5fYnVmZmVyID0gY3BjX3R0eV9jaGFyc19pbl9idWZmZXI7IAorCQlzZXJpYWxfZHJ2LnRpb2Ntc2V0ID0gcGMzMDBfdGlvY21zZXQ7CisJCXNlcmlhbF9kcnYudGlvY21nZXQgPSBwYzMwMF90aW9jbWdldDsKKwkJc2VyaWFsX2Rydi5mbHVzaF9idWZmZXIgPSBjcGNfdHR5X2ZsdXNoX2J1ZmZlcjsgCisJCXNlcmlhbF9kcnYuaGFuZ3VwID0gY3BjX3R0eV9oYW5ndXA7CisKKwkJLyogcmVnaXN0ZXIgdGhlIFRUWSBkcml2ZXIgKi8KKwkJaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIoJnNlcmlhbF9kcnYpKSB7IAorCQkJcHJpbnRrKCIlcy10dHk6IEZhaWxlZCB0byByZWdpc3RlciBzZXJpYWwgZHJpdmVyISAiLAorCQkJCXBjMzAwZGV2LT5kZXYtPm5hbWUpOworCQkgICAJcmV0dXJuOworCQl9IAorCisJCW1lbXNldCgodm9pZCAqKWNwY190dHlfYXJlYSwgMCwKKwkJCQkJCQkJc2l6ZW9mKHN0X2NwY190dHlfYXJlYSkgKiBDUENfVFRZX05QT1JUUyk7CisJfQorCisJY3BjX3R0eSA9ICZjcGNfdHR5X2FyZWFbcG9ydF07CisJCisJaWYgKGNwY190dHktPnN0YXRlICE9IENQQ19UVFlfU1RfSURMRSkgeworCQlDUENfVFRZX0RCRygiJXMtdHR5OiBUVFkgcG9ydCAlaSwgYWxyZWFkeSBpbiB1c2UuXG4iLAorCQkJCXBjMzAwZGV2LT5kZXYtPm5hbWUsIHBvcnQpOworCQlyZXR1cm47CisJfQorCisJY3BjX3R0eV9jbnQrKzsKKwljcGNfdHR5LT5zdGF0ZSA9IENQQ19UVFlfU1RfSU5JVDsgCisJY3BjX3R0eS0+bnVtX29wZW49IDA7CisJY3BjX3R0eS0+dHR5X21pbm9yID0gcG9ydCArIENQQ19UVFlfTUlOT1JfU1RBUlQ7CisJY3BjX3R0eS0+cGMzMDBkZXYgPSBwYzMwMGRldjsgCisKKwlJTklUX1dPUksoJmNwY190dHktPnR0eV90eF93b3JrLCBjcGNfdHR5X3R4X3dvcmssICh2b2lkICopY3BjX3R0eSk7CisJSU5JVF9XT1JLKCZjcGNfdHR5LT50dHlfcnhfd29yaywgY3BjX3R0eV9yeF93b3JrLCAodm9pZCAqKXBvcnQpOworCQorCWNwY190dHktPmJ1Zl9yeC5maXJzdCA9IGNwY190dHktPmJ1Zl9yeC5sYXN0ID0gTlVMTDsKKworCXBjMzAwZGV2LT5jcGNfdHR5ID0gKHZvaWQgKiljcGNfdHR5OyAKKwkKKwlhdXggPSBzdHJsZW4ocGMzMDBkZXYtPmRldi0+bmFtZSk7CisJbWVtY3B5KGNwY190dHktPm5hbWUsIHBjMzAwZGV2LT5kZXYtPm5hbWUsIGF1eCk7CisJbWVtY3B5KCZjcGNfdHR5LT5uYW1lW2F1eF0sICItdHR5IiwgNSk7CisJCisJY3BjX29wZW4ocGMzMDBkZXYtPmRldik7CisJY3BjX3R0eV9zaWduYWxfb2ZmKHBjMzAwZGV2LCBDVExfRFRSKTsKKworCUNQQ19UVFlfREJHKCIlczogSW5pdGlhbGl6aW5nIFRUWSBTeW5jIERyaXZlciwgdHR5IG1ham9yIyVkIG1pbm9yIyVpXG4iLAorCQkJY3BjX3R0eS0+bmFtZSxDUENfVFRZX01BSk9SLGNwY190dHktPnR0eV9taW5vcik7IAorCXJldHVybjsgCit9IAorCisvKgorICogUEMzMDAgVFRZIE9QRU4gcm91dGluZQorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIHR0eSBkcml2ZXIgdG8gb3BlbiB0aGUgaW50ZXJmYWNlIAorICogbyB2ZXJpZnkgbWlub3IKKyAqIG8gYWxsb2NhdGUgYnVmZmVyIHRvIFJ4IGFuZCBUeAorICovCitzdGF0aWMgaW50IGNwY190dHlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmxpcCkKK3sKKwlpbnQgcG9ydCA7CisJc3RfY3BjX3R0eV9hcmVhICpjcGNfdHR5OworCisJaWYgKCF0dHkpIHsgCisJCXJldHVybiAtRU5PREVWOworCX0gCisKKwlwb3J0ID0gdHR5LT5pbmRleDsKKworCWlmICgocG9ydCA8IDApIHx8IChwb3J0ID49IENQQ19UVFlfTlBPUlRTKSl7IAorCQlDUENfVFRZX0RCRygicGMzMDBfdHR5OiBvcGVuIGludmFsaWQgcG9ydCAlZFxuIiwgcG9ydCk7CisJCXJldHVybiAtRU5PREVWOworCX0gCisKKwljcGNfdHR5ID0gJmNwY190dHlfYXJlYVtwb3J0XTsKKwkKKwlpZiAoY3BjX3R0eS0+c3RhdGUgPT0gQ1BDX1RUWV9TVF9JRExFKXsKKwkJQ1BDX1RUWV9EQkcoIiVzOiBvcGVuIC0gaW52YWxpZCBpbnRlcmZhY2UsIHBvcnQ9JWRcbiIsCisJCQkJCWNwY190dHktPm5hbWUsIHR0eS0+aW5kZXgpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoY3BjX3R0eS0+bnVtX29wZW4gPT0gMCkgeyAvKiBmaXJzdCBvcGVuIG9mIHRoaXMgdHR5ICovCisJCWlmICghY3BjX3R0eV9hcmVhW3BvcnRdLmJ1Zl90eCl7CisJCQljcGNfdHR5X2FyZWFbcG9ydF0uYnVmX3R4ID0ga21hbGxvYyhDUENfVFRZX01BWF9NVFUsR0ZQX0tFUk5FTCk7CisJCQlpZiAoY3BjX3R0eV9hcmVhW3BvcnRdLmJ1Zl90eCA9PSAwKXsKKwkJCQlDUENfVFRZX0RCRygiJXM6IGVycm9yIGluIG1lbW9yeSBhbGxvY2F0aW9uXG4iLGNwY190dHktPm5hbWUpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQl9IAorCisJCWlmIChjcGNfdHR5X2FyZWFbcG9ydF0uYnVmX3J4LmZpcnN0KSB7CisJCQl1bnNpZ25lZCBjaGFyICogYXV4OworCQkJd2hpbGUgKGNwY190dHlfYXJlYVtwb3J0XS5idWZfcnguZmlyc3QpIHsKKwkJCQlhdXggPSAodW5zaWduZWQgY2hhciAqKWNwY190dHlfYXJlYVtwb3J0XS5idWZfcnguZmlyc3Q7CisJCQkJY3BjX3R0eV9hcmVhW3BvcnRdLmJ1Zl9yeC5maXJzdCA9IGNwY190dHlfYXJlYVtwb3J0XS5idWZfcnguZmlyc3QtPm5leHQ7CisJCQkJa2ZyZWUoYXV4KTsKKwkJCX0KKwkJCWNwY190dHlfYXJlYVtwb3J0XS5idWZfcnguZmlyc3QgPSBOVUxMOworCQkJY3BjX3R0eV9hcmVhW3BvcnRdLmJ1Zl9yeC5sYXN0ID0gTlVMTDsKKwkJfQorCisJCWNwY190dHlfYXJlYVtwb3J0XS5zdGF0ZSA9IENQQ19UVFlfU1RfT1BFTjsKKwkJY3BjX3R0eV9hcmVhW3BvcnRdLnR0eSA9IHR0eTsKKwkJdHR5LT5kcml2ZXJfZGF0YSA9ICZjcGNfdHR5X2FyZWFbcG9ydF07CisKKwkJY3BjX3R0eV9zaWduYWxfb24oY3BjX3R0eS0+cGMzMDBkZXYsIENUTF9EVFIpOworCX0gCisKKwljcGNfdHR5LT5udW1fb3BlbisrOworCisJQ1BDX1RUWV9EQkcoIiVzOiBvcGVuaW5nIFRUWSBkcml2ZXJcbiIsIGNwY190dHktPm5hbWUpOworCQorCS8qIGF2aXNhciBkcml2ZXIgUEMzMDAgKi8gCisJcmV0dXJuIDA7IAorfQorCisvKgorICogUEMzMDAgVFRZIENMT1NFIHJvdXRpbmUKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSB0dHkgZHJpdmVyIHRvIGNsb3NlIHRoZSBpbnRlcmZhY2UgCisgKiBvIGNhbGwgY2xvc2UgY2hhbm5lbCBpbiBQQzMwMCBkcml2ZXIgKGNwY19jbG9zZWNoKQorICogbyBmcmVlIFJ4IGFuZCBUeCBidWZmZXJzCisgKi8KKworc3RhdGljIHZvaWQgY3BjX3R0eV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmxpcCkKK3sKKwlzdF9jcGNfdHR5X2FyZWEgICAgKmNwY190dHk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmVzOworCisJaWYgKCF0dHkgfHwgIXR0eS0+ZHJpdmVyX2RhdGEgKSB7CisJCUNQQ19UVFlfREJHKCJoZGx4LXR0eTogbm8gVFRZIGluIGNsb3NlIFxuIik7CisJCXJldHVybjsKKwl9CisKKwljcGNfdHR5ID0gKHN0X2NwY190dHlfYXJlYSAqKSB0dHktPmRyaXZlcl9kYXRhOworCisJaWYgKChjcGNfdHR5LT50dHkgIT0gdHR5KXx8IChjcGNfdHR5LT5zdGF0ZSAhPSBDUENfVFRZX1NUX09QRU4pKSB7CisJCUNQQ19UVFlfREJHKCIlczogVFRZIGlzIG5vdCBvcGVuZWRcbiIsY3BjX3R0eS0+bmFtZSk7CisJCXJldHVybjsKKwl9CisgICAJCisJaWYgKCFjcGNfdHR5LT5udW1fb3BlbikgeworCQlDUENfVFRZX0RCRygiJXM6IFRUWSBpcyBjbG9zZWRcbiIsY3BjX3R0eS0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoLS1jcGNfdHR5LT5udW1fb3BlbiA+IDApIHsKKwkJQ1BDX1RUWV9EQkcoIiVzOiBUVFkgY2xvc2VkXG4iLGNwY190dHktPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJY3BjX3R0eV9zaWduYWxfb2ZmKGNwY190dHktPnBjMzAwZGV2LCBDVExfRFRSKTsKKworCUNQQ19UVFlfTE9DSyhjcGNfdHR5LT5wYzMwMGRldi0+Y2hhbi0+Y2FyZCwgZmxhZ3MpOyAgLyogbG9jayBpcnEgKi8gCisJY3BjX3R0eS0+dHR5ID0gTlVMTDsKKwljcGNfdHR5LT5zdGF0ZSA9IENQQ19UVFlfU1RfSU5JVDsKKwlDUENfVFRZX1VOTE9DSyhjcGNfdHR5LT5wYzMwMGRldi0+Y2hhbi0+Y2FyZCwgZmxhZ3MpOyAvKiB1bmxvY2sgaXJxICovIAorCQorCWlmIChjcGNfdHR5LT5idWZfcnguZmlyc3QpIHsKKwkJdW5zaWduZWQgY2hhciAqIGF1eDsKKwkJd2hpbGUgKGNwY190dHktPmJ1Zl9yeC5maXJzdCkgeworCQkJYXV4ID0gKHVuc2lnbmVkIGNoYXIgKiljcGNfdHR5LT5idWZfcnguZmlyc3Q7CisJCQljcGNfdHR5LT5idWZfcnguZmlyc3QgPSBjcGNfdHR5LT5idWZfcnguZmlyc3QtPm5leHQ7CisJCQlrZnJlZShhdXgpOworCQl9CisJCWNwY190dHktPmJ1Zl9yeC5maXJzdCA9IE5VTEw7CisJCWNwY190dHktPmJ1Zl9yeC5sYXN0ID0gTlVMTDsKKwl9CisJCisJaWYgKGNwY190dHktPmJ1Zl90eCkgeworCQlrZnJlZShjcGNfdHR5LT5idWZfdHgpOworCQljcGNfdHR5LT5idWZfdHggPSBOVUxMOworCX0KKworCUNQQ19UVFlfREJHKCIlczogVFRZIGNsb3NlZFxuIixjcGNfdHR5LT5uYW1lKTsKKwkKKwlpZiAoIXNlcmlhbF9kcnYucmVmY291bnQgJiYgY3BjX3R0eV91bnJlZ19mbGFnKSB7CisJCWNwY190dHlfdW5yZWdfZmxhZyA9IDA7CisJCUNQQ19UVFlfREJHKCIlczogdW5yZWdpc3RlciB0aGUgdHR5IGRyaXZlclxuIiwgY3BjX3R0eS0+bmFtZSk7CisJCWlmICgocmVzPXR0eV91bnJlZ2lzdGVyX2RyaXZlcigmc2VyaWFsX2RydikpKSB7IAorCQkJQ1BDX1RUWV9EQkcoIiVzOiBFUlJPUiAtPnVucmVnaXN0ZXIgdGhlIHR0eSBkcml2ZXIgZXJyb3I9JWRcbiIsCisJCQkJCQkJY3BjX3R0eS0+bmFtZSxyZXMpOworCQl9CisJfQorCXJldHVybjsgCit9IAorCisvKgorICogUEMzMDAgVFRZIFdSSVRFIHJvdXRpbmUKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSB0dHkgZHJpdmVyIHRvIHdyaXRlIGEgc2VyaWVzIG9mIGNoYXJhY3RlcnMKKyAqIHRvIHRoZSB0dHkgZGV2aWNlLiBUaGUgY2hhcmFjdGVycyBtYXkgY29tZSBmcm9tIHVzZXIgb3Iga2VybmVsIHNwYWNlLgorICogbyB2ZXJpZnkgdGhlIERDRCBzaWduYWwKKyAqIG8gc2VuZCBjaGFyYWN0ZXJzIHRvIGJvYXJkIGFuZCBzdGFydCB0aGUgdHJhbnNtaXNzaW9uCisgKi8KK3N0YXRpYyBpbnQgY3BjX3R0eV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3sKKwlzdF9jcGNfdHR5X2FyZWEgICAgKmNwY190dHk7IAorCXBjMzAwY2hfdCAqcGMzMDBjaGFuOyAKKwlwYzMwMF90ICpjYXJkOyAKKwlpbnQgY2g7IAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7IAorCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0czsgCisKKwlpZiAoIXR0eSB8fCAhdHR5LT5kcml2ZXJfZGF0YSApIHsgCisJCUNQQ19UVFlfREJHKCJoZGxjWC10dHk6IG5vIFRUWSBpbiB3cml0ZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0gCisKKwljcGNfdHR5ID0gKHN0X2NwY190dHlfYXJlYSAqKSB0dHktPmRyaXZlcl9kYXRhOyAKKworCWlmICgoY3BjX3R0eS0+dHR5ICE9IHR0eSkgfHwgIChjcGNfdHR5LT5zdGF0ZSAhPSBDUENfVFRZX1NUX09QRU4pKSB7IAorCQlDUENfVFRZX0RCRygiJXM6IFRUWSBpcyBub3Qgb3BlbmVkXG4iLCBjcGNfdHR5LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9ERVY7IAorCX0KKworCWlmIChjb3VudCA+IENQQ19UVFlfTUFYX01UVSkgeyAKKwkJQ1BDX1RUWV9EQkcoIiVzOiBjb3VudCBpcyBpbnZhbGlkXG4iLGNwY190dHktPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsgICAgICAgIC8qIGZyYW1lIHRvbyBiaWcgKi8gCisJfQorCisJQ1BDX1RUWV9EQkcoIiVzOiBjcGNfdHR5X3dyaXRlIGRhdGEgbGVuPSVpXG4iLGNwY190dHktPm5hbWUsY291bnQpOworCQorCXBjMzAwY2hhbiA9IChwYzMwMGNoX3QgKikoKHBjMzAwZGV2X3QqKWNwY190dHktPnBjMzAwZGV2KS0+Y2hhbjsgCisJc3RhdHMgPSBoZGxjX3N0YXRzKCgocGMzMDBkZXZfdCopY3BjX3R0eS0+cGMzMDBkZXYpLT5kZXYpOworCWNhcmQgPSAocGMzMDBfdCAqKSBwYzMwMGNoYW4tPmNhcmQ7CisJY2ggPSBwYzMwMGNoYW4tPmNoYW5uZWw7IAorCisJLyogdmVyaWZ5IERDRCBzaWduYWwqLyAKKwlpZiAoY3BjX3JlYWRiKGNhcmQtPmh3LnNjYWJhc2UgKyBNX1JFRyhTVDMsY2gpKSAmIFNUM19EQ0QpIHsgCisJCS8qIERDRCBpcyBPRkYgKi8gCisJCUNQQ19UVFlfREJHKCIlcyA6IERDRCBpcyBPRkZcbiIsIGNwY190dHktPm5hbWUpOworCQlzdGF0cy0+dHhfZXJyb3JzKys7CisJCXN0YXRzLT50eF9jYXJyaWVyX2Vycm9ycysrOworCQlDUENfVFRZX0xPQ0soY2FyZCwgZmxhZ3MpOyAKKwkJY3BjX3dyaXRlYihjYXJkLT5ody5zY2FiYXNlICsgTV9SRUcoQ01ELCBjaCksIENNRF9UWF9CVUZfQ0xSKTsgCisJCQorCQlpZiAoY2FyZC0+aHcudHlwZSA9PSBQQzMwMF9URSkgeyAKKwkJCWNwY193cml0ZWIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIsIAorCQkJCWNwY19yZWFkYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMikgJiAKKwkJCQl+KENQTERfUkVHMl9GQUxDX0xFRDEgPDwgKDIgKmNoKSkpOyAKKwkJfQorCisJCUNQQ19UVFlfVU5MT0NLKGNhcmQsIGZsYWdzKTsgCisKKwkJcmV0dXJuIC1FSU5WQUw7IAorCX0KKworCWlmIChjcGNfdHR5X3NlbmRfdG9fY2FyZChjcGNfdHR5LT5wYzMwMGRldiwgKHZvaWQqKWJ1ZiwgY291bnQpKSB7IAorCSAgIC8qIGZhaWxlZCB0byBzZW5kICovCisJICAgQ1BDX1RUWV9EQkcoIiVzOiB0cmFzbWl0aW9uIGVycm9yXG4iLCBjcGNfdHR5LT5uYW1lKTsKKwkgICByZXR1cm4gMDsKKwl9CisJcmV0dXJuIGNvdW50OyAKK30gCisKKy8qCisgKiBQQzMwMCBUVFkgV3JpdGUgUm9vbSByb3V0aW5lCisgKiAKKyAqIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBudW1iZXJzIG9mIGNoYXJhY3RlcmVzIHRoZSB0dHkgZHJpdmVyIHdpbGwgYWNjZXB0CisgKiBmb3IgcXVldWluZyB0byBiZSB3cml0dGVuLiAKKyAqIG8gcmV0dXJuIE1UVQorICovCitzdGF0aWMgaW50IGNwY190dHlfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0X2NwY190dHlfYXJlYSAgICAqY3BjX3R0eTsgCisKKwlpZiAoIXR0eSB8fCAhdHR5LT5kcml2ZXJfZGF0YSApIHsgCisJCUNQQ19UVFlfREJHKCJoZGxjWC10dHk6IG5vIFRUWSB0byB3cml0ZSByb29tXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJY3BjX3R0eSA9IChzdF9jcGNfdHR5X2FyZWEgKikgdHR5LT5kcml2ZXJfZGF0YTsgCisKKwlpZiAoKGNwY190dHktPnR0eSAhPSB0dHkpIHx8ICAoY3BjX3R0eS0+c3RhdGUgIT0gQ1BDX1RUWV9TVF9PUEVOKSkgeyAKKwkJQ1BDX1RUWV9EQkcoIiVzOiBUVFkgaXMgbm90IG9wZW5lZFxuIixjcGNfdHR5LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9ERVY7IAorCX0KKyAgIAkKKwlDUENfVFRZX0RCRygiJXM6IHdyaXRlIHJvb21cbiIsY3BjX3R0eS0+bmFtZSk7CisJCisJcmV0dXJuIENQQ19UVFlfTUFYX01UVTsKK30gCisKKy8qCisgKiBQQzMwMCBUVFkgY2hhcnMgaW4gYnVmZmVyIHJvdXRpbmUKKyAqIAorICogVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGNoYXJzIG51bWJlciBpbiB0aGUgdHJhbnNtaXNzaW9uIGJ1ZmZlciAKKyAqIG8gcmV0dXJucyAwCisgKi8KK3N0YXRpYyBpbnQgY3BjX3R0eV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdF9jcGNfdHR5X2FyZWEgICAgKmNwY190dHk7IAorCisJaWYgKCF0dHkgfHwgIXR0eS0+ZHJpdmVyX2RhdGEgKSB7CisJCUNQQ19UVFlfREJHKCJoZGxjWC10dHk6IG5vIFRUWSB0byBjaGFycyBpbiBidWZmZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsgCisJfQorCisJY3BjX3R0eSA9IChzdF9jcGNfdHR5X2FyZWEgKikgdHR5LT5kcml2ZXJfZGF0YTsgCisKKwlpZiAoKGNwY190dHktPnR0eSAhPSB0dHkpIHx8IChjcGNfdHR5LT5zdGF0ZSAhPSBDUENfVFRZX1NUX09QRU4pKSB7IAorCQlDUENfVFRZX0RCRygiJXM6IFRUWSBpcyBub3Qgb3BlbmVkXG4iLGNwY190dHktPm5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsgCisJfQorICAgCisJcmV0dXJuKDApOyAKK30gCisKK2ludCBwYzMwMF90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwlzdF9jcGNfdHR5X2FyZWEgICAgKmNwY190dHk7IAorCisJQ1BDX1RUWV9EQkcoIiVzOiBzZXQ6JXggY2xlYXI6JXhcbiIsIF9fRlVOQ1RJT05fXywgc2V0LCBjbGVhcik7CisKKwlpZiAoIXR0eSB8fCAhdHR5LT5kcml2ZXJfZGF0YSApIHsKKwkgICAJQ1BDX1RUWV9EQkcoImhkbGNYLXR0eTogbm8gVFRZIHRvIGNoYXJzIGluIGJ1ZmZlclxuIik7CQorCQlyZXR1cm4gLUVOT0RFVjsgCisJfQorCisJY3BjX3R0eSA9IChzdF9jcGNfdHR5X2FyZWEgKikgdHR5LT5kcml2ZXJfZGF0YTsgCisKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQljcGNfdHR5X3NpZ25hbF9vbihjcGNfdHR5LT5wYzMwMGRldiwgQ1RMX1JUUyk7CisJaWYgKHNldCAmIFRJT0NNX0RUUikKKwkJY3BjX3R0eV9zaWduYWxfb24oY3BjX3R0eS0+cGMzMDBkZXYsIENUTF9EVFIpOworCisJaWYgKGNsZWFyICYgVElPQ01fUlRTKQorCQljcGNfdHR5X3NpZ25hbF9vZmYoY3BjX3R0eS0+cGMzMDBkZXYsIENUTF9SVFMpOworCWlmIChjbGVhciAmIFRJT0NNX0RUUikKKwkJY3BjX3R0eV9zaWduYWxfb2ZmKGNwY190dHktPnBjMzAwZGV2LCBDVExfRFRSKTsKKworCXJldHVybiAwOworfQorCitpbnQgcGMzMDBfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0X2NwY190dHlfYXJlYSAgKmNwY190dHkgPSAoc3RfY3BjX3R0eV9hcmVhICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJcGMzMDBkZXZfdCAqcGMzMDBkZXYgPSBjcGNfdHR5LT5wYzMwMGRldjsKKwlwYzMwMGNoX3QgKnBjMzAwY2hhbiA9IChwYzMwMGNoX3QgKilwYzMwMGRldi0+Y2hhbjsKKwlwYzMwMF90ICpjYXJkID0gKHBjMzAwX3QgKikgcGMzMDBjaGFuLT5jYXJkOworCWludCBjaCA9IHBjMzAwY2hhbi0+Y2hhbm5lbDsKKworCWNwY190dHkgPSAoc3RfY3BjX3R0eV9hcmVhICopIHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlDUENfVFRZX0RCRygiJXMtdHR5OiB0aW9jbWdldFxuIiwKKwkJKChzdHJ1Y3QgbmV0X2RldmljZSopKHBjMzAwZGV2LT5oZGxjKSktPm5hbWUpOworCisJQ1BDX1RUWV9MT0NLKGNhcmQsIGZsYWdzKTsKKwlzdGF0dXMgPSBjcGNfcmVhZGIoY2FyZC0+aHcuc2NhYmFzZStNX1JFRyhDVEwsY2gpKTsKKwlDUENfVFRZX1VOTE9DSyhjYXJkLGZsYWdzKTsKKworCXJlc3VsdCA9ICgoc3RhdHVzICYgQ1RMX0RUUikgPyBUSU9DTV9EVFIgOiAwKSB8CisJCSAoKHN0YXR1cyAmIENUTF9SVFMpID8gVElPQ01fUlRTIDogMCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogUEMzMDAgVFRZIEZsdXNoIEJ1ZmZlciByb3V0aW5lCisgKgorICogVGhpcyByb3V0aW5lIHJlc2V0cyB0aGUgdHJhbnNtaXNzaW9uIGJ1ZmZlciAKKyAqLworc3RhdGljIHZvaWQgY3BjX3R0eV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sgCisJc3RfY3BjX3R0eV9hcmVhICAgICpjcGNfdHR5OyAKKwkKKwlpZiAoIXR0eSB8fCAhdHR5LT5kcml2ZXJfZGF0YSApIHsKKwkgICAJQ1BDX1RUWV9EQkcoImhkbGNYLXR0eTogbm8gVFRZIHRvIGZsdXNoIGJ1ZmZlclxuIik7CQorCQlyZXR1cm47IAorCX0KKworCWNwY190dHkgPSAoc3RfY3BjX3R0eV9hcmVhICopIHR0eS0+ZHJpdmVyX2RhdGE7IAorCisJaWYgKChjcGNfdHR5LT50dHkgIT0gdHR5KSB8fCAgKGNwY190dHktPnN0YXRlICE9IENQQ19UVFlfU1RfT1BFTikpIHsgCisJCUNQQ19UVFlfREJHKCIlczogVFRZIGlzIG5vdCBvcGVuZWRcbiIsY3BjX3R0eS0+bmFtZSk7CisJCXJldHVybjsgCisJfQorCisJQ1BDX1RUWV9EQkcoIiVzOiBjYWxsIHdha2VfdXBfaW50ZXJydXB0aWJsZVxuIixjcGNfdHR5LT5uYW1lKTsKKworCXR0eV93YWtldXAodHR5KTsJCisJcmV0dXJuOyAKK30gCisKKy8qCisgKiBQQzMwMCBUVFkgSGFuZ3VwIHJvdXRpbmUKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSB0dHkgZHJpdmVyIHRvIGhhbmd1cCB0aGUgaW50ZXJmYWNlIAorICogbyBjbGVhciBEVFIgc2lnbmFsCisgKi8KKworc3RhdGljIHZvaWQgY3BjX3R0eV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sgCisJc3RfY3BjX3R0eV9hcmVhICAgICpjcGNfdHR5OyAKKwlpbnQgcmVzOworCisJaWYgKCF0dHkgfHwgIXR0eS0+ZHJpdmVyX2RhdGEgKSB7CisJCUNQQ19UVFlfREJHKCJoZGxjWC10dHk6IG5vIFRUWSB0byBoYW5ndXBcbiIpOwkKKwkJcmV0dXJuIDsgCisJfQorCisJY3BjX3R0eSA9IChzdF9jcGNfdHR5X2FyZWEgKikgdHR5LT5kcml2ZXJfZGF0YTsgCisKKwlpZiAoKGNwY190dHktPnR0eSAhPSB0dHkpIHx8IChjcGNfdHR5LT5zdGF0ZSAhPSBDUENfVFRZX1NUX09QRU4pKSB7CisJCUNQQ19UVFlfREJHKCIlczogVFRZIGlzIG5vdCBvcGVuZWRcbiIsY3BjX3R0eS0+bmFtZSk7CisJCXJldHVybiA7CisJfQorCWlmICghc2VyaWFsX2Rydi5yZWZjb3VudCAmJiBjcGNfdHR5X3VucmVnX2ZsYWcpIHsKKwkJY3BjX3R0eV91bnJlZ19mbGFnID0gMDsKKwkJQ1BDX1RUWV9EQkcoIiVzOiB1bnJlZ2lzdGVyIHRoZSB0dHkgZHJpdmVyXG4iLCBjcGNfdHR5LT5uYW1lKTsKKwkJaWYgKChyZXM9dHR5X3VucmVnaXN0ZXJfZHJpdmVyKCZzZXJpYWxfZHJ2KSkpIHsgCisJCQlDUENfVFRZX0RCRygiJXM6IEVSUk9SIC0+dW5yZWdpc3RlciB0aGUgdHR5IGRyaXZlciBlcnJvcj0lZFxuIiwKKwkJCQkJCQljcGNfdHR5LT5uYW1lLHJlcyk7CisJCX0KKwl9CisJY3BjX3R0eV9zaWduYWxfb2ZmKGNwY190dHktPnBjMzAwZGV2LCBDVExfRFRSKTsKK30KKworLyoKKyAqIFBDMzAwIFRUWSBSWCB3b3JrIHJvdXRpbmUKKyAqIFRoaXMgcm91dGluZSB0cmVhdHMgUlggd29yaworICogbyB2ZXJpZnkgcmVhZCBidWZmZXIKKyAqIG8gY2FsbCB0aGUgbGluZSBkaXNjLiByZWFkCisgKiBvIGZyZWUgbWVtb3J5CisgKi8KK3N0YXRpYyB2b2lkIGNwY190dHlfcnhfd29yayh2b2lkICogZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIHBvcnQ7CisJaW50IGksIGo7CisJc3RfY3BjX3R0eV9hcmVhICpjcGNfdHR5OyAKKwl2b2xhdGlsZSBzdF9jcGNfcnhfYnVmICogYnVmOworCWNoYXIgZmxhZ3M9MCxmbGdfcng9MTsgCisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CisKKwlpZiAoY3BjX3R0eV9jbnQgPT0gMCkgcmV0dXJuOworCisJCisJZm9yIChpPTA7IChpIDwgNCkgJiYgZmxnX3J4IDsgaSsrKSB7CisJCWZsZ19yeCA9IDA7CisJCXBvcnQgPSAodW5zaWduZWQgbG9uZylkYXRhOworCQlmb3IgKGo9MDsgaiA8IENQQ19UVFlfTlBPUlRTOyBqKyspIHsKKwkJCWNwY190dHkgPSAmY3BjX3R0eV9hcmVhW3BvcnRdOworCQkKKwkJCWlmICgoYnVmPWNwY190dHktPmJ1Zl9yeC5maXJzdCkgIT0gMCkgeworCQkJCWlmKGNwY190dHktPnR0eSkgeworCQkJCQlsZCA9IHR0eV9sZGlzY19yZWYoY3BjX3R0eS0+dHR5KTsKKwkJCQkJaWYobGQpIHsKKwkJCQkJCWlmIChsZC0+cmVjZWl2ZV9idWYpIHsKKwkJCQkJCQlDUENfVFRZX0RCRygiJXM6IGNhbGwgbGluZSBkaXNjLiByZWNlaXZlX2J1ZlxuIixjcGNfdHR5LT5uYW1lKTsKKwkJCQkJCQlsZC0+cmVjZWl2ZV9idWYoY3BjX3R0eS0+dHR5LCAoY2hhciAqKShidWYtPmRhdGEpLCAmZmxhZ3MsIGJ1Zi0+c2l6ZSk7CisJCQkJCQl9CisJCQkJCQl0dHlfbGRpc2NfZGVyZWYobGQpOworCQkJCQl9CisJCQkJfQkKKwkJCQljcGNfdHR5LT5idWZfcnguZmlyc3QgPSBjcGNfdHR5LT5idWZfcnguZmlyc3QtPm5leHQ7CisJCQkJa2ZyZWUoKHVuc2lnbmVkIGNoYXIgKilidWYpOworCQkJCWJ1ZiA9IGNwY190dHktPmJ1Zl9yeC5maXJzdDsKKwkJCQlmbGdfcnggPSAxOworCQkJfQorCQkJaWYgKCsrcG9ydCA9PSBDUENfVFRZX05QT1JUUykgcG9ydCA9IDA7CisJCX0KKwl9Cit9IAorCisvKgorICogUEMzMDAgVFRZIFJYIHdvcmsgcm91dGluZQorICoKKyAqIFRoaXMgcm91dGluZSB0cmVhdHMgUlggaW50ZXJydXB0LiAKKyAqIG8gcmVhZCBhbGwgZnJhbWVzIGluIGNhcmQKKyAqIG8gdmVyaWZ5IHRoZSBmcmFtZSBzaXplCisgKiBvIHJlYWQgdGhlIGZyYW1lIGluIHJ4IGJ1ZmZlcgorICovCitzdGF0aWMgdm9pZCBjcGNfdHR5X3J4X2Rpc2NfZnJhbWUocGMzMDBjaF90ICpwYzMwMGNoYW4pCit7CisJdm9sYXRpbGUgcGNzY2FfYmRfdCBfX2lvbWVtICogcHRkZXNjcjsgCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBzdGF0dXM7IAorCXBjMzAwX3QgKmNhcmQgPSAocGMzMDBfdCAqKXBjMzAwY2hhbi0+Y2FyZDsgCisJaW50IGNoID0gcGMzMDBjaGFuLT5jaGFubmVsOyAKKworCS8qIGRtYSBidWYgcmVhZCAqLyAKKwlwdGRlc2NyID0gKHBjc2NhX2JkX3QgX19pb21lbSAqKShjYXJkLT5ody5yYW1iYXNlICsgCisJCQkJUlhfQkRfQUREUihjaCwgcGMzMDBjaGFuLT5yeF9maXJzdF9iZCkpOyAKKwl3aGlsZSAocGMzMDBjaGFuLT5yeF9maXJzdF9iZCAhPSBwYzMwMGNoYW4tPnJ4X2xhc3RfYmQpIHsgCisJCXN0YXR1cyA9IGNwY19yZWFkYigmcHRkZXNjci0+c3RhdHVzKTsgCisJCWNwY193cml0ZWIoJnB0ZGVzY3ItPnN0YXR1cywgMCk7IAorCQljcGNfd3JpdGViKCZwdGRlc2NyLT5sZW4sIDApOyAKKwkJcGMzMDBjaGFuLT5yeF9maXJzdF9iZCA9IChwYzMwMGNoYW4tPnJ4X2ZpcnN0X2JkICsgMSkgJiAKKwkJCQkJKE5fRE1BX1JYX0JVRiAtIDEpOyAKKwkJaWYgKHN0YXR1cyAmIERTVF9FT00pIHsgCisJCQlicmVhazsgLyogZW5kIG9mIG1lc3NhZ2UgKi8KKwkJfQorCQlwdGRlc2NyID0gKHBjc2NhX2JkX3QgX19pb21lbSAqKShjYXJkLT5ody5yYW1iYXNlICsgY3BjX3JlYWRsKCZwdGRlc2NyLT5uZXh0KSk7IAorCX0KK30KKwordm9pZCBjcGNfdHR5X3JlY2VpdmUocGMzMDBkZXZfdCAqcGMzMDBkZXYpCit7CisJc3RfY3BjX3R0eV9hcmVhICAgICpjcGNfdHR5OyAKKwlwYzMwMGNoX3QgKnBjMzAwY2hhbiA9IChwYzMwMGNoX3QgKilwYzMwMGRldi0+Y2hhbjsgCisJcGMzMDBfdCAqY2FyZCA9IChwYzMwMF90ICopcGMzMDBjaGFuLT5jYXJkOyAKKwlpbnQgY2ggPSBwYzMwMGNoYW4tPmNoYW5uZWw7IAorCXZvbGF0aWxlIHBjc2NhX2JkX3QgIF9faW9tZW0gKiBwdGRlc2NyOyAKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKHBjMzAwZGV2LT5kZXYpOworCWludCByeF9sZW4sIHJ4X2F1eDsgCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBzdGF0dXM7IAorCXVuc2lnbmVkIHNob3J0IGZpcnN0X2JkID0gcGMzMDBjaGFuLT5yeF9maXJzdF9iZDsKKwlzdF9jcGNfcnhfYnVmCSpuZXc9TlVMTDsKKwl1bnNpZ25lZCBjaGFyIGRzcl9yeDsKKworCWlmIChwYzMwMGRldi0+Y3BjX3R0eSA9PSBOVUxMKSB7IAorCQlyZXR1cm47IAorCX0KKworCWRzcl9yeCA9IGNwY19yZWFkYihjYXJkLT5ody5zY2FiYXNlICsgRFNSX1JYKGNoKSk7CisKKwljcGNfdHR5ID0gKHN0X2NwY190dHlfYXJlYSAqKXBjMzAwZGV2LT5jcGNfdHR5OyAKKworCXdoaWxlICgxKSB7IAorCQlyeF9sZW4gPSAwOworCQlwdGRlc2NyID0gKHBjc2NhX2JkX3QgIF9faW9tZW0gKikoY2FyZC0+aHcucmFtYmFzZSArIFJYX0JEX0FERFIoY2gsIGZpcnN0X2JkKSk7CisJCXdoaWxlICgoc3RhdHVzID0gY3BjX3JlYWRiKCZwdGRlc2NyLT5zdGF0dXMpKSAmIERTVF9PU0IpIHsKKwkJCXJ4X2xlbiArPSBjcGNfcmVhZHcoJnB0ZGVzY3ItPmxlbik7CisJCQlmaXJzdF9iZCA9IChmaXJzdF9iZCArIDEpICYgKE5fRE1BX1JYX0JVRiAtIDEpOworCQkJaWYgKHN0YXR1cyAmIERTVF9FT00pIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXB0ZGVzY3I9KHBjc2NhX2JkX3QgX19pb21lbSAqKShjYXJkLT5ody5yYW1iYXNlK2NwY19yZWFkbCgmcHRkZXNjci0+bmV4dCkpOworCQl9CisJCQkKKwkJaWYgKCFyeF9sZW4pIHsgCisJCQlpZiAoZHNyX3J4ICYgRFNSX0JPRikgeworCQkJCS8qIHVwZGF0ZSBFREEgKi8gCisJCQkJY3BjX3dyaXRlbChjYXJkLT5ody5zY2FiYXNlICsgRFJYX1JFRyhFREFMLCBjaCksIAorCQkJCQkJUlhfQkRfQUREUihjaCwgcGMzMDBjaGFuLT5yeF9sYXN0X2JkKSk7IAorCQkJfQorCQkJaWYgKG5ldykgeworCQkJCWtmcmVlKG5ldyk7CisJCQkJbmV3ID0gTlVMTDsKKwkJCX0KKwkJCXJldHVybjsgCisJCX0KKwkJCisJCWlmIChyeF9sZW4gPiBDUENfVFRZX01BWF9NVFUpIHsgCisJCQkvKiBGcmVlIFJYIGRlc2NyaXB0b3JzICovIAorCQkJQ1BDX1RUWV9EQkcoIiVzOiBmcmFtZSBzaXplIGlzIGludmFsaWQuXG4iLGNwY190dHktPm5hbWUpOworCQkJc3RhdHMtPnJ4X2Vycm9ycysrOyAKKwkJCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMrKzsgCisJCQljcGNfdHR5X3J4X2Rpc2NfZnJhbWUocGMzMDBjaGFuKTsKKwkJCWNvbnRpbnVlOworCQl9IAorCQkKKwkJbmV3ID0gKHN0X2NwY19yeF9idWYgKikga21hbGxvYyhyeF9sZW4gKyBzaXplb2Yoc3RfY3BjX3J4X2J1ZiksIEdGUF9BVE9NSUMpOworCQlpZiAobmV3ID09IDApIHsKKwkJCWNwY190dHlfcnhfZGlzY19mcmFtZShwYzMwMGNoYW4pOworCQkJY29udGludWU7CisJCX0KKwkJCisJCS8qIGRtYSBidWYgcmVhZCAqLyAKKwkJcHRkZXNjciA9IChwY3NjYV9iZF90IF9faW9tZW0gKikoY2FyZC0+aHcucmFtYmFzZSArIAorCQkJCVJYX0JEX0FERFIoY2gsIHBjMzAwY2hhbi0+cnhfZmlyc3RfYmQpKTsgCisKKwkJcnhfbGVuID0gMDsJLyogY291bnRlciBmcmFtZSBzaXplICovCisJCQorCQl3aGlsZSAoKHN0YXR1cyA9IGNwY19yZWFkYigmcHRkZXNjci0+c3RhdHVzKSkgJiBEU1RfT1NCKSB7CisJCQlyeF9hdXggPSBjcGNfcmVhZHcoJnB0ZGVzY3ItPmxlbik7CisJCQlpZiAoKHN0YXR1cyAmIChEU1RfT1ZSIHwgRFNUX0NSQyB8IERTVF9SQklUIHwgIERTVF9TSFJUIHwgRFNUX0FCVCkpCisJCQkJfHwgKHJ4X2F1eCA+IEJEX0RFRl9MRU4pKSB7CisJCQkJQ1BDX1RUWV9EQkcoIiVzOiByZWNlcHRpb24gZXJyb3JcbiIsIGNwY190dHktPm5hbWUpOworCQkJCXN0YXRzLT5yeF9lcnJvcnMrKzsgCisJCQkJaWYgKHN0YXR1cyAmIERTVF9PVlIpIHsgCisJCQkJCXN0YXRzLT5yeF9maWZvX2Vycm9ycysrOyAKKwkJCQl9CisJCQkJaWYgKHN0YXR1cyAmIERTVF9DUkMpIHsgCisJCQkJCXN0YXRzLT5yeF9jcmNfZXJyb3JzKys7IAorCQkJCX0KKwkJCQlpZiAoKHN0YXR1cyAmIChEU1RfUkJJVCB8IERTVF9TSFJUIHwgRFNUX0FCVCkpIHx8CisJCQkJCShyeF9hdXggPiBCRF9ERUZfTEVOKSkJeyAKKwkJCQkJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycysrOyAKKwkJCQl9IAorCQkJCS8qIGRpc2NhcmQgcmVtYWluaWcgZGVzY3JpcHRvcnMgdXNlZCBieSB0aGUgYmFkIGZyYW1lICovIAorCQkJCUNQQ19UVFlfREJHKCIlczogcmVjZXB0aW9uIGVycm9yIC0gZGlzY2FyZCBkZXNjcmlwdG9ycyIsCisJCQkJCQljcGNfdHR5LT5uYW1lKTsKKwkJCQljcGNfdHR5X3J4X2Rpc2NfZnJhbWUocGMzMDBjaGFuKTsKKwkJCQlyeF9sZW4gPSAwOworCQkJCWtmcmVlKG5ldyk7CisJCQkJbmV3ID0gTlVMTDsKKwkJCQlicmVhazsgLyogcmVhZCBuZXh0IGZyYW1lIC0gd2hpbGUoMSkgKi8KKwkJCX0KKworCQkJaWYgKGNwY190dHktPnN0YXRlICE9IENQQ19UVFlfU1RfT1BFTikgeworCQkJCS8qIEZyZWUgUlggZGVzY3JpcHRvcnMgKi8gCisJCQkJY3BjX3R0eV9yeF9kaXNjX2ZyYW1lKHBjMzAwY2hhbik7CisJCQkJc3RhdHMtPnJ4X2Ryb3BwZWQrKzsgCisJCQkJcnhfbGVuID0gMDsgCisJCQkJa2ZyZWUobmV3KTsKKwkJCQluZXcgPSBOVUxMOworCQkJCWJyZWFrOyAvKiByZWFkIG5leHQgZnJhbWUgLSB3aGlsZSgxKSAqLworCQkJfQorCisJCQkvKiByZWFkIHRoZSBzZWdtZW50IG9mIHRoZSBmcmFtZSAqLworCQkJaWYgKHJ4X2F1eCAhPSAwKSB7CisJCQkJbWVtY3B5X2Zyb21pbygobmV3LT5kYXRhICsgcnhfbGVuKSwgCisJCQkJCSh2b2lkIF9faW9tZW0gKikoY2FyZC0+aHcucmFtYmFzZSArIAorCQkJCQkgY3BjX3JlYWRsKCZwdGRlc2NyLT5wdGJ1ZikpLCByeF9hdXgpOworCQkJCXJ4X2xlbiArPSByeF9hdXg7IAorCQkJfQorCQkJY3BjX3dyaXRlYigmcHRkZXNjci0+c3RhdHVzLDApOyAKKwkJCWNwY193cml0ZWIoJnB0ZGVzY3ItPmxlbiwgMCk7IAorCQkJcGMzMDBjaGFuLT5yeF9maXJzdF9iZCA9IChwYzMwMGNoYW4tPnJ4X2ZpcnN0X2JkICsgMSkgJiAKKwkJCQkJKE5fRE1BX1JYX0JVRiAtMSk7IAorCQkJaWYgKHN0YXR1cyAmIERTVF9FT00pYnJlYWs7CisJCQkKKwkJCXB0ZGVzY3IgPSAocGNzY2FfYmRfdCBfX2lvbWVtICopIChjYXJkLT5ody5yYW1iYXNlICsgCisJCQkJCWNwY19yZWFkbCgmcHRkZXNjci0+bmV4dCkpOyAKKwkJfQorCQkvKiB1cGRhdGUgcG9pbnRlciAqLyAKKwkJcGMzMDBjaGFuLT5yeF9sYXN0X2JkID0gKHBjMzAwY2hhbi0+cnhfZmlyc3RfYmQgLSAxKSAmIAorCQkJCQkoTl9ETUFfUlhfQlVGIC0gMSkgOyAKKwkJaWYgKCEoZHNyX3J4ICYgRFNSX0JPRikpIHsKKwkJCS8qIHVwZGF0ZSBFREEgKi8gCisJCQljcGNfd3JpdGVsKGNhcmQtPmh3LnNjYWJhc2UgKyBEUlhfUkVHKEVEQUwsIGNoKSwgCisJCQkJCVJYX0JEX0FERFIoY2gsIHBjMzAwY2hhbi0+cnhfbGFzdF9iZCkpOyAKKwkJfQorCQlpZiAocnhfbGVuICE9IDApIHsgCisJCQlzdGF0cy0+cnhfYnl0ZXMgKz0gcnhfbGVuOyAKKwkJCisJCQlpZiAocGMzMDBkZXYtPnRyYWNlX29uKSB7IAorCQkJCWNwY190dHlfdHJhY2UocGMzMDBkZXYsIG5ldy0+ZGF0YSxyeF9sZW4sICdSJyk7IAorCQkJfSAKKwkJCW5ldy0+c2l6ZSA9IHJ4X2xlbjsKKwkJCW5ldy0+bmV4dCA9IE5VTEw7CisJCQlpZiAoY3BjX3R0eS0+YnVmX3J4LmZpcnN0ID09IDApIHsKKwkJCQljcGNfdHR5LT5idWZfcnguZmlyc3QgPSBuZXc7CisJCQkJY3BjX3R0eS0+YnVmX3J4Lmxhc3QgPSBuZXc7CisJCQl9IGVsc2UgeworCQkJCWNwY190dHktPmJ1Zl9yeC5sYXN0LT5uZXh0ID0gbmV3OworCQkJCWNwY190dHktPmJ1Zl9yeC5sYXN0ID0gbmV3OworCQkJfQorCQkJc2NoZWR1bGVfd29yaygmKGNwY190dHktPnR0eV9yeF93b3JrKSk7CisJCQlzdGF0cy0+cnhfcGFja2V0cysrOworCQl9CisJfSAKK30gCisKKy8qCisgKiBQQzMwMCBUVFkgVFggd29yayByb3V0aW5lCisgKiAKKyAqIFRoaXMgcm91dGluZSB0cmVhdHMgVFggaW50ZXJydXB0LiAKKyAqIG8gaWYgbmVlZCBjYWxsIGxpbmUgZGlzY2lwbGluZSB3YWtldXAKKyAqIG8gY2FsbCB3YWtlX3VwX2ludGVycnVwdGlibGUKKyAqLworc3RhdGljIHZvaWQgY3BjX3R0eV90eF93b3JrKHZvaWQgKmRhdGEpCit7CisJc3RfY3BjX3R0eV9hcmVhICpjcGNfdHR5ID0gKHN0X2NwY190dHlfYXJlYSAqKSBkYXRhOyAKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OyAKKworCUNQQ19UVFlfREJHKCIlczogY3BjX3R0eV90eF93b3JrIGluaXRcbiIsY3BjX3R0eS0+bmFtZSk7CisJCisJaWYgKCh0dHkgPSBjcGNfdHR5LT50dHkpID09IDApIHsgCisJCUNQQ19UVFlfREJHKCIlczogdGhlIGludGVyZmFjZSBpcyBub3Qgb3BlbmVkXG4iLGNwY190dHktPm5hbWUpOworCQlyZXR1cm47IAorCX0KKwl0dHlfd2FrZXVwKHR0eSk7Cit9CisKKy8qCisgKiBQQzMwMCBUVFkgc2VuZCB0byBjYXJkIHJvdXRpbmUKKyAqIAorICogVGhpcyByb3V0aW5lIHNlbmQgZGF0YSB0byBjYXJkLiAKKyAqIG8gY2xlYXIgZGVzY3JpcHRvcnMKKyAqIG8gd3JpdGUgZGF0YSB0byBETUEgYnVmZmVycworICogbyBzdGFydCB0aGUgdHJhbnNtaXNzaW9uCisgKi8KK3N0YXRpYyBpbnQgY3BjX3R0eV9zZW5kX3RvX2NhcmQocGMzMDBkZXZfdCAqZGV2LHZvaWQqIGJ1ZiwgaW50IGxlbikKK3sKKwlwYzMwMGNoX3QgKmNoYW4gPSAocGMzMDBjaF90ICopZGV2LT5jaGFuOyAKKwlwYzMwMF90ICpjYXJkID0gKHBjMzAwX3QgKiljaGFuLT5jYXJkOyAKKwlpbnQgY2ggPSBjaGFuLT5jaGFubmVsOyAKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGRldi0+ZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOyAKKwl2b2xhdGlsZSBwY3NjYV9iZF90IF9faW9tZW0gKnB0ZGVzY3I7IAorCWludCBpLCBuY2hhcjsKKwlpbnQgdG9zZW5kID0gbGVuOworCWludCBuYnVmID0gKChsZW4gLSAxKS9CRF9ERUZfTEVOKSArIDE7CisJdW5zaWduZWQgY2hhciAqcGRhdGE9YnVmOworCisJQ1BDX1RUWV9EQkcoIiVzOmNwY190dHlfc2VuZF90b19jYXJzIGxlbj0laSIsIAorCQkJKHN0X2NwY190dHlfYXJlYSAqKWRldi0+Y3BjX3R0eS0+bmFtZSxsZW4pOwkKKworCWlmIChuYnVmID49IGNhcmQtPmNoYW5bY2hdLm5mcmVlX3R4X2JkKSB7CisJCXJldHVybiAxOworCX0KKwkKKwkvKiB3cml0ZSBidWZmZXIgdG8gRE1BIGJ1ZmZlcnMgKi8gCisJQ1BDX1RUWV9EQkcoIiVzOiBjYWxsIGRtYV9idWZfd3JpdGVcbiIsCisJCQkoc3RfY3BjX3R0eV9hcmVhICopZGV2LT5jcGNfdHR5LT5uYW1lKTsJCisJZm9yIChpID0gMCA7IGkgPCBuYnVmIDsgaSsrKSB7CisJCXB0ZGVzY3IgPSAocGNzY2FfYmRfdCBfX2lvbWVtICopKGNhcmQtPmh3LnJhbWJhc2UgKyAKKwkJCVRYX0JEX0FERFIoY2gsIGNhcmQtPmNoYW5bY2hdLnR4X25leHRfYmQpKTsKKwkJbmNoYXIgPSAoQkRfREVGX0xFTiA+IHRvc2VuZCkgPyB0b3NlbmQgOiBCRF9ERUZfTEVOOworCQlpZiAoY3BjX3JlYWRiKCZwdGRlc2NyLT5zdGF0dXMpICYgRFNUX09TQikgeworCQkJbWVtY3B5X3RvaW8oKHZvaWQgX19pb21lbSAqKShjYXJkLT5ody5yYW1iYXNlICsgCisJCQkJY3BjX3JlYWRsKCZwdGRlc2NyLT5wdGJ1ZikpLCAKKwkJCQkmcGRhdGFbbGVuIC0gdG9zZW5kXSwgCisJCQkJbmNoYXIpOworCQkJY2FyZC0+Y2hhbltjaF0ubmZyZWVfdHhfYmQtLTsKKwkJCWlmICgoaSArIDEpID09IG5idWYpIHsKKwkJCQkvKiBUaGlzIG11c3QgYmUgdGhlIGxhc3QgQkQgdG8gYmUgdXNlZCAqLworCQkJCWNwY193cml0ZWIoJnB0ZGVzY3ItPnN0YXR1cywgRFNUX0VPTSk7CisJCQl9IGVsc2UgeworCQkJCWNwY193cml0ZWIoJnB0ZGVzY3ItPnN0YXR1cywgMCk7CisJCQl9CisJCQljcGNfd3JpdGV3KCZwdGRlc2NyLT5sZW4sIG5jaGFyKTsKKwkJfSBlbHNlIHsKKwkJCUNQQ19UVFlfREJHKCIlczogZXJyb3IgaW4gZG1hX2J1Zl93cml0ZVxuIiwKKwkJCQkJKHN0X2NwY190dHlfYXJlYSAqKWRldi0+Y3BjX3R0eS0+bmFtZSk7CQorCQkJc3RhdHMtPnR4X2Ryb3BwZWQrKzsKKwkJCXJldHVybiAxOyAKKwkJfQorCQl0b3NlbmQgLT0gbmNoYXI7CisJCWNhcmQtPmNoYW5bY2hdLnR4X25leHRfYmQgPSAKKwkJCShjYXJkLT5jaGFuW2NoXS50eF9uZXh0X2JkICsgMSkgJiAoTl9ETUFfVFhfQlVGIC0gMSk7CisJfQorCisJaWYgKGRldi0+dHJhY2Vfb24pIHsgCisJCWNwY190dHlfdHJhY2UoZGV2LCBidWYsIGxlbiwnVCcpOyAKKwl9CisKKwkvKiBzdGFydCB0cmFuc21pc3Npb24gKi8gCisJQ1BDX1RUWV9EQkcoIiVzOiBzdGFydCB0cmFuc21pc3Npb25cbiIsCisJCShzdF9jcGNfdHR5X2FyZWEgKilkZXYtPmNwY190dHktPm5hbWUpOwkKKwkKKwlDUENfVFRZX0xPQ0soY2FyZCwgZmxhZ3MpOyAKKwljcGNfd3JpdGViKGNhcmQtPmh3LnNjYWJhc2UgKyBEVFhfUkVHKEVEQUwsIGNoKSwgCisJCQlUWF9CRF9BRERSKGNoLCBjaGFuLT50eF9uZXh0X2JkKSk7IAorCWNwY193cml0ZWIoY2FyZC0+aHcuc2NhYmFzZSArIE1fUkVHKENNRCwgY2gpLCBDTURfVFhfRU5BKTsgCisJY3BjX3dyaXRlYihjYXJkLT5ody5zY2FiYXNlICsgRFNSX1RYKGNoKSwgRFNSX0RFKTsgCisKKwlpZiAoY2FyZC0+aHcudHlwZSA9PSBQQzMwMF9URSkgeyAKKwkJY3BjX3dyaXRlYihjYXJkLT5ody5mYWxjYmFzZSArIGNhcmQtPmh3LmNwbGRfcmVnMiwgCisJCQljcGNfcmVhZGIoY2FyZC0+aHcuZmFsY2Jhc2UgKyBjYXJkLT5ody5jcGxkX3JlZzIpIHwKKwkJCShDUExEX1JFRzJfRkFMQ19MRUQxIDw8ICgyICogY2gpKSk7IAorCX0KKwlDUENfVFRZX1VOTE9DSyhjYXJkLCBmbGFncyk7IAorCXJldHVybiAwOyAKK30gCisKKy8qCisgKglQQzMwMCBUVFkgdHJhY2Ugcm91dGluZQorICoKKyAqICBUaGlzIHJvdXRpbmUgc2VuZCB0cmFjZSBvZiBjb25uZWN0aW9uIHRvIGFwcGxpY2F0aW9uLiAKKyAqICBvIGNsZWFyIGRlc2NyaXB0b3JzCisgKiAgbyB3cml0ZSBkYXRhIHRvIERNQSBidWZmZXJzCisgKiAgbyBzdGFydCB0aGUgdHJhbnNtaXNzaW9uCisgKi8KKworc3RhdGljIHZvaWQgY3BjX3R0eV90cmFjZShwYzMwMGRldl90ICpkZXYsIGNoYXIqIGJ1ZiwgaW50IGxlbiwgY2hhciByeHR4KQoreworCXN0cnVjdCBza19idWZmICpza2I7IAorCisJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKDEwICsgbGVuKSkgPT0gTlVMTCkgeyAKKwkJLyogb3V0IG9mIG1lbW9yeSAqLyAKKwkJQ1BDX1RUWV9EQkcoIiVzOiB0dHlfdHJhY2UgLSBvdXQgb2YgbWVtb3J5XG4iLCBkZXYtPmRldi0+bmFtZSk7CisJCXJldHVybjsgCisJfQorCisJc2tiX3B1dCAoc2tiLCAxMCArIGxlbik7IAorCXNrYi0+ZGV2ID0gZGV2LT5kZXY7IAorCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9DVVNUKTsgCisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOyAKKwlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7IAorCXNrYi0+bGVuID0gMTAgKyBsZW47IAorCisJbWVtY3B5KHNrYi0+ZGF0YSxkZXYtPmRldi0+bmFtZSw1KTsKKwlza2ItPmRhdGFbNV0gPSAnWyc7IAorCXNrYi0+ZGF0YVs2XSA9IHJ4dHg7IAorCXNrYi0+ZGF0YVs3XSA9ICddJzsgCisJc2tiLT5kYXRhWzhdID0gJzonOyAKKwlza2ItPmRhdGFbOV0gPSAnICc7IAorCW1lbWNweSgmc2tiLT5kYXRhWzEwXSwgYnVmLCBsZW4pOyAKKwluZXRpZl9yeChza2IpOyAKK30gCQorCisvKgorICoJUEMzMDAgVFRZIHVucmVnaXN0ZXIgc2VydmljZSByb3V0aW5lCisgKgorICoJVGhpcyByb3V0aW5lIHVucmVnaXN0ZXIgb25lIGludGVyZmFjZS4gCisgKi8KK3ZvaWQgY3BjX3R0eV91bnJlZ2lzdGVyX3NlcnZpY2UocGMzMDBkZXZfdCAqcGMzMDBkZXYpCit7CisJc3RfY3BjX3R0eV9hcmVhICpjcGNfdHR5OyAKKwl1bG9uZyBmbGFnczsKKwlpbnQgcmVzOworCisJaWYgKChjcGNfdHR5PSAoc3RfY3BjX3R0eV9hcmVhICopIHBjMzAwZGV2LT5jcGNfdHR5KSA9PSAwKSB7IAorCQlDUENfVFRZX0RCRygiJXM6IGludGVyZmFjZSBpcyBub3QgVFRZXG4iLCBwYzMwMGRldi0+ZGV2LT5uYW1lKTsKKwkJcmV0dXJuOyAKKwl9CisJQ1BDX1RUWV9EQkcoIiVzOiBjcGNfdHR5X3VucmVnaXN0ZXJfc2VydmljZSIsIGNwY190dHktPm5hbWUpOworCisJaWYgKGNwY190dHktPnBjMzAwZGV2ICE9IHBjMzAwZGV2KSB7IAorCQlDUENfVFRZX0RCRygiJXM6IGludmFsaWQgdHR5IHB0cj0lc1xuIiwgCisJCXBjMzAwZGV2LT5kZXYtPm5hbWUsIGNwY190dHktPm5hbWUpOworCQlyZXR1cm47IAorCX0KKworCWlmICgtLWNwY190dHlfY250ID09IDApIHsgCisJCWlmIChzZXJpYWxfZHJ2LnJlZmNvdW50KSB7CisJCQlDUENfVFRZX0RCRygiJXM6IHVucmVnaXN0ZXIgaXMgbm90IHBvc3NpYmxlLCByZWZjb3VudD0lZCIsCisJCQkJCQkJY3BjX3R0eS0+bmFtZSwgc2VyaWFsX2Rydi5yZWZjb3VudCk7CisJCQljcGNfdHR5X2NudCsrOworCQkJY3BjX3R0eV91bnJlZ19mbGFnID0gMTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsgCisJCQlDUENfVFRZX0RCRygiJXM6IHVucmVnaXN0ZXIgdGhlIHR0eSBkcml2ZXJcbiIsIGNwY190dHktPm5hbWUpOworCQkJaWYgKChyZXM9dHR5X3VucmVnaXN0ZXJfZHJpdmVyKCZzZXJpYWxfZHJ2KSkpIHsgCisJCQkJQ1BDX1RUWV9EQkcoIiVzOiBFUlJPUiAtPnVucmVnaXN0ZXIgdGhlIHR0eSBkcml2ZXIgZXJyb3I9JWRcbiIsCisJCQkJCQkJCWNwY190dHktPm5hbWUscmVzKTsKKwkJCX0KKwkJfQorCX0KKwlDUENfVFRZX0xPQ0socGMzMDBkZXYtPmNoYW4tPmNhcmQsZmxhZ3MpOworCWNwY190dHktPnR0eSA9IE5VTEw7IAorCUNQQ19UVFlfVU5MT0NLKHBjMzAwZGV2LT5jaGFuLT5jYXJkLCBmbGFncyk7CisJY3BjX3R0eS0+dHR5X21pbm9yID0gMDsgCisJY3BjX3R0eS0+c3RhdGUgPSBDUENfVFRZX1NUX0lETEU7IAorfSAKKworLyoKKyAqIFBDMzAwIFRUWSB0cmlnZ2VyIHBvbGwgcm91dGluZQorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBwYzMwMGRyaXZlciB0byB0cmVhdHMgVHggaW50ZXJydXB0LiAKKyAqLwordm9pZCBjcGNfdHR5X3RyaWdnZXJfcG9sbChwYzMwMGRldl90ICpwYzMwMGRldikKK3sKKwlzdF9jcGNfdHR5X2FyZWEgKmNwY190dHkgPSAoc3RfY3BjX3R0eV9hcmVhICopcGMzMDBkZXYtPmNwY190dHk7IAorCWlmICghY3BjX3R0eSkgeworCQlyZXR1cm47CisJfQorCXNjaGVkdWxlX3dvcmsoJihjcGNfdHR5LT50dHlfdHhfd29yaykpOyAKK30gCisKKy8qCisgKiBQQzMwMCBUVFkgcmVzZXQgdmFyIHJvdXRpbmUKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgcGMzMDBkcml2ZXIgdG8gaW5pdCB0aGUgVFRZIGFyZWEuIAorICovCisKK3ZvaWQgY3BjX3R0eV9yZXNldF92YXIodm9pZCkKK3sKKwlpbnQgaSA7IAorCisJQ1BDX1RUWV9EQkcoImhkbGNYLXR0eTogcmVzZXQgdmFyaWFibGVzXG4iKTsKKwkvKiByZXNldCAgdGhlIHR0eV9kcml2ZXIgc3RydWN0dXJlIC0gc2VyaWFsX2RydiAqLyAKKwltZW1zZXQoJnNlcmlhbF9kcnYsIDAsIHNpemVvZihzdHJ1Y3QgdHR5X2RyaXZlcikpOworCWZvciAoaT0wOyBpIDwgQ1BDX1RUWV9OUE9SVFM7IGkrKyl7CisJCW1lbXNldCgmY3BjX3R0eV9hcmVhW2ldLDAsIHNpemVvZihzdF9jcGNfdHR5X2FyZWEpKTsgCisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3BjaTIwMHN5bi5jIGIvZHJpdmVycy9uZXQvd2FuL3BjaTIwMHN5bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZWEwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vcGNpMjAwc3luLmMKQEAgLTAsMCArMSw0ODggQEAKKy8qCisgKiBHb3JhbW8gUENJMjAwU1lOIHN5bmNocm9ub3VzIHNlcmlhbCBjYXJkIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogRm9yIGluZm9ybWF0aW9uIHNlZSBodHRwOi8vaHEucG0ud2F3LnBsL2hkbGMvCisgKgorICogU291cmNlcyBvZiBpbmZvcm1hdGlvbjoKKyAqICAgIEhpdGFjaGkgSEQ2NDU3MiBTQ0EtSUkgVXNlcidzIE1hbnVhbAorICogICAgUExYIFRlY2hub2xvZ3kgSW5jLiBQQ0k5MDUyIERhdGEgQm9vaworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgImhkNjQ1NzIuaCIKKworc3RhdGljIGNvbnN0IGNoYXIqIHZlcnNpb24gPSAiR29yYW1vIFBDSTIwMFNZTiBkcml2ZXIgdmVyc2lvbjogMS4xNiI7CitzdGF0aWMgY29uc3QgY2hhciogZGV2bmFtZSA9ICJQQ0kyMDBTWU4iOworCisjdW5kZWYgREVCVUdfUEtUCisjZGVmaW5lIERFQlVHX1JJTkdTCisKKyNkZWZpbmUgUENJMjAwU1lOX1BMWF9TSVpFCTB4ODAJLyogUExYIGNvbnRyb2wgd2luZG93IHNpemUgKDEyOGIpICovCisjZGVmaW5lIFBDSTIwMFNZTl9TQ0FfU0laRQkweDQwMAkvKiBTQ0Egd2luZG93IHNpemUgKDFLYikgKi8KKyNkZWZpbmUgQUxMX1BBR0VTX0FMV0FZU19NQVBQRUQKKyNkZWZpbmUgTkVFRF9ERVRFQ1RfUkFNCisjZGVmaW5lIE5FRURfU0NBX01TQ0lfSU5UUgorI2RlZmluZSBNQVhfVFhfQlVGRkVSUwkJMTAKKworc3RhdGljIGludCBwY2lfY2xvY2tfZnJlcSA9IDMzMDAwMDAwOworI2RlZmluZSBDTE9DS19CQVNFIHBjaV9jbG9ja19mcmVxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9HT1JBTU8JMHgxMEI1CS8qIHVzZXMgUExYOjkwNTAgSUQgLSB0aGlzIGNhcmQJKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9QQ0kyMDBTWU4JMHg5MDUwCS8qIGRvZXNuJ3QgaGF2ZSBpdHMgb3duIElECSovCisKKworLyoKKyAqICAgICAgUExYIFBDSTkwNTIgbG9jYWwgY29uZmlndXJhdGlvbiBhbmQgc2hhcmVkIHJ1bnRpbWUgcmVnaXN0ZXJzLgorICogICAgICBUaGlzIHN0cnVjdHVyZSBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgOTA1MiByZWdpc3RlcnMgKG1lbW9yeSBtYXBwZWQpLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyIGxvY19hZGRyX3JhbmdlWzRdOwkvKiAwMC0wQ2ggOiBMb2NhbCBBZGRyZXNzIFJhbmdlcyAqLworCXUzMiBsb2Nfcm9tX3JhbmdlOwkvKiAxMGggOiBMb2NhbCBST00gUmFuZ2UgKi8KKwl1MzIgbG9jX2FkZHJfYmFzZVs0XTsJLyogMTQtMjBoIDogTG9jYWwgQWRkcmVzcyBCYXNlIEFkZHJzICovCisJdTMyIGxvY19yb21fYmFzZTsJLyogMjRoIDogTG9jYWwgUk9NIEJhc2UgKi8KKwl1MzIgbG9jX2J1c19kZXNjcls0XTsJLyogMjgtMzRoIDogTG9jYWwgQnVzIERlc2NyaXB0b3JzICovCisJdTMyIHJvbV9idXNfZGVzY3I7CS8qIDM4aCA6IFJPTSBCdXMgRGVzY3JpcHRvciAqLworCXUzMiBjc19iYXNlWzRdOwkJLyogM0MtNDhoIDogQ2hpcCBTZWxlY3QgQmFzZSBBZGRycyAqLworCXUzMiBpbnRyX2N0cmxfc3RhdDsJLyogNENoIDogSW50ZXJydXB0IENvbnRyb2wvU3RhdHVzICovCisJdTMyIGluaXRfY3RybDsJCS8qIDUwaCA6IEVFUFJPTSBjdHJsLCBJbml0IEN0cmwsIGV0YyAqLworfXBseDkwNTI7CisKKworCit0eXBlZGVmIHN0cnVjdCBwb3J0X3MgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGNhcmRfcyAqY2FyZDsKKwlzcGlubG9ja190IGxvY2s7CS8qIFRYIGxvY2sgKi8KKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBzZXR0aW5nczsKKwlpbnQgcnhwYXJ0OwkJLyogcGFydGlhbCBmcmFtZSByZWNlaXZlZCwgbmV4dCBmcmFtZSBpbnZhbGlkKi8KKwl1bnNpZ25lZCBzaG9ydCBlbmNvZGluZzsKKwl1bnNpZ25lZCBzaG9ydCBwYXJpdHk7CisJdTE2IHJ4aW47CQkvKiByeCByaW5nIGJ1ZmZlciAnaW4nIHBvaW50ZXIgKi8KKwl1MTYgdHhpbjsJCS8qIHR4IHJpbmcgYnVmZmVyICdpbicgYW5kICdsYXN0JyBwb2ludGVycyAqLworCXUxNiB0eGxhc3Q7CisJdTggcnhzLCB0eHMsIHRtYzsJLyogU0NBIHJlZ2lzdGVycyAqLworCXU4IHBoeV9ub2RlOwkJLyogcGh5c2ljYWwgcG9ydCAjIC0gMCBvciAxICovCit9cG9ydF90OworCisKKwordHlwZWRlZiBzdHJ1Y3QgY2FyZF9zIHsKKwl1OCBfX2lvbWVtICpyYW1iYXNlOwkvKiBidWZmZXIgbWVtb3J5IGJhc2UgKHZpcnR1YWwpICovCisJdTggX19pb21lbSAqc2NhYmFzZTsJLyogU0NBIG1lbW9yeSBiYXNlICh2aXJ0dWFsKSAqLworCXBseDkwNTIgX19pb21lbSAqcGx4YmFzZTsvKiBQTFggcmVnaXN0ZXJzIG1lbW9yeSBiYXNlICh2aXJ0dWFsKSAqLworCXUxNiByeF9yaW5nX2J1ZmZlcnM7CS8qIG51bWJlciBvZiBidWZmZXJzIGluIGEgcmluZyAqLworCXUxNiB0eF9yaW5nX2J1ZmZlcnM7CisJdTE2IGJ1ZmZfb2Zmc2V0OwkvKiBvZmZzZXQgb2YgZmlyc3QgYnVmZmVyIG9mIGZpcnN0IGNoYW5uZWwgKi8KKwl1OCBpcnE7CQkJLyogaW50ZXJydXB0IHJlcXVlc3QgbGV2ZWwgKi8KKworCXBvcnRfdCBwb3J0c1syXTsKK31jYXJkX3Q7CisKKworI2RlZmluZSBzY2FfaW4ocmVnLCBjYXJkKQkgICAgIHJlYWRiKGNhcmQtPnNjYWJhc2UgKyAocmVnKSkKKyNkZWZpbmUgc2NhX291dCh2YWx1ZSwgcmVnLCBjYXJkKSAgICB3cml0ZWIodmFsdWUsIGNhcmQtPnNjYWJhc2UgKyAocmVnKSkKKyNkZWZpbmUgc2NhX2ludyhyZWcsIGNhcmQpCSAgICAgcmVhZHcoY2FyZC0+c2NhYmFzZSArIChyZWcpKQorI2RlZmluZSBzY2Ffb3V0dyh2YWx1ZSwgcmVnLCBjYXJkKSAgIHdyaXRldyh2YWx1ZSwgY2FyZC0+c2NhYmFzZSArIChyZWcpKQorI2RlZmluZSBzY2FfaW5sKHJlZywgY2FyZCkJICAgICByZWFkbChjYXJkLT5zY2FiYXNlICsgKHJlZykpCisjZGVmaW5lIHNjYV9vdXRsKHZhbHVlLCByZWcsIGNhcmQpICAgd3JpdGVsKHZhbHVlLCBjYXJkLT5zY2FiYXNlICsgKHJlZykpCisKKyNkZWZpbmUgcG9ydF90b19jYXJkKHBvcnQpCSAgICAgKHBvcnQtPmNhcmQpCisjZGVmaW5lIGxvZ19ub2RlKHBvcnQpCQkgICAgIChwb3J0LT5waHlfbm9kZSkKKyNkZWZpbmUgcGh5X25vZGUocG9ydCkJCSAgICAgKHBvcnQtPnBoeV9ub2RlKQorI2RlZmluZSB3aW5iYXNlKGNhcmQpCQkgICAgIChjYXJkLT5yYW1iYXNlKQorI2RlZmluZSBnZXRfcG9ydChjYXJkLCBwb3J0KQkgICAgICgmY2FyZC0+cG9ydHNbcG9ydF0pCisjZGVmaW5lIHNjYV9mbHVzaChjYXJkKQkJICAgICAoc2NhX2luKElFUjAsIGNhcmQpKTsKKworc3RhdGljIGlubGluZSB2b2lkIG5ld19tZW1jcHlfdG9pbyhjaGFyIF9faW9tZW0gKmRlc3QsIGNoYXIgKnNyYywgaW50IGxlbmd0aCkKK3sKKwlpbnQgbGVuOworCWRvIHsKKwkJbGVuID0gbGVuZ3RoID4gMjU2ID8gMjU2IDogbGVuZ3RoOworCQltZW1jcHlfdG9pbyhkZXN0LCBzcmMsIGxlbik7CisJCWRlc3QgKz0gbGVuOworCQlzcmMgKz0gbGVuOworCQlsZW5ndGggLT0gbGVuOworCQlyZWFkYihkZXN0KTsKKwl9IHdoaWxlIChsZW4pOworfQorCisjdW5kZWYgbWVtY3B5X3RvaW8KKyNkZWZpbmUgbWVtY3B5X3RvaW8gbmV3X21lbWNweV90b2lvCisKKyNpbmNsdWRlICJoZDY0NTd4LmMiCisKKworc3RhdGljIHZvaWQgcGNpMjAwX3NldF9pZmFjZShwb3J0X3QgKnBvcnQpCit7CisJY2FyZF90ICpjYXJkID0gcG9ydC0+Y2FyZDsKKwl1MTYgbXNjaSA9IGdldF9tc2NpKHBvcnQpOworCXU4IHJ4cyA9IHBvcnQtPnJ4cyAmIENMS19CUkdfTUFTSzsKKwl1OCB0eHMgPSBwb3J0LT50eHMgJiBDTEtfQlJHX01BU0s7CisKKwlzY2Ffb3V0KEVYU19URVMxLCAocGh5X25vZGUocG9ydCkgPyBNU0NJMV9PRkZTRVQgOiBNU0NJMF9PRkZTRVQpICsgRVhTLAorCQlwb3J0X3RvX2NhcmQocG9ydCkpOworCXN3aXRjaChwb3J0LT5zZXR0aW5ncy5jbG9ja190eXBlKSB7CisJY2FzZSBDTE9DS19JTlQ6CisJCXJ4cyB8PSBDTEtfQlJHOyAvKiBCUkcgb3V0cHV0ICovCisJCXR4cyB8PSBDTEtfUElOX09VVCB8IENMS19UWF9SWENMSzsgLyogUlggY2xvY2sgKi8KKwkJYnJlYWs7CisKKwljYXNlIENMT0NLX1RYSU5UOgorCQlyeHMgfD0gQ0xLX0xJTkU7IC8qIFJYQyBpbnB1dCAqLworCQl0eHMgfD0gQ0xLX1BJTl9PVVQgfCBDTEtfQlJHOyAvKiBCUkcgb3V0cHV0ICovCisJCWJyZWFrOworCisJY2FzZSBDTE9DS19UWEZST01SWDoKKwkJcnhzIHw9IENMS19MSU5FOyAvKiBSWEMgaW5wdXQgKi8KKwkJdHhzIHw9IENMS19QSU5fT1VUIHwgQ0xLX1RYX1JYQ0xLOyAvKiBSWCBjbG9jayAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CQkvKiBFWFRlcm5hbCBjbG9jayAqLworCQlyeHMgfD0gQ0xLX0xJTkU7IC8qIFJYQyBpbnB1dCAqLworCQl0eHMgfD0gQ0xLX1BJTl9PVVQgfCBDTEtfTElORTsgLyogVFhDIGlucHV0ICovCisJCWJyZWFrOworCX0KKworCXBvcnQtPnJ4cyA9IHJ4czsKKwlwb3J0LT50eHMgPSB0eHM7CisJc2NhX291dChyeHMsIG1zY2kgKyBSWFMsIGNhcmQpOworCXNjYV9vdXQodHhzLCBtc2NpICsgVFhTLCBjYXJkKTsKKwlzY2Ffc2V0X3BvcnQocG9ydCk7Cit9CisKKworCitzdGF0aWMgaW50IHBjaTIwMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcG9ydF90ICpwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKworCWludCByZXN1bHQgPSBoZGxjX29wZW4oZGV2KTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCisJc2NhX29wZW4oZGV2KTsKKwlwY2kyMDBfc2V0X2lmYWNlKHBvcnQpOworCXNjYV9mbHVzaChwb3J0X3RvX2NhcmQocG9ydCkpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCBwY2kyMDBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzY2FfY2xvc2UoZGV2KTsKKwlzY2FfZmx1c2gocG9ydF90b19jYXJkKGRldl90b19wb3J0KGRldikpKTsKKwloZGxjX2Nsb3NlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IHBjaTIwMF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihzeW5jX3NlcmlhbF9zZXR0aW5ncyk7CisJc3luY19zZXJpYWxfc2V0dGluZ3MgbmV3X2xpbmU7CisJc3luY19zZXJpYWxfc2V0dGluZ3MgX191c2VyICpsaW5lID0gaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3Uuc3luYzsKKwlwb3J0X3QgKnBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCisjaWZkZWYgREVCVUdfUklOR1MKKwlpZiAoY21kID09IFNJT0NERVZQUklWQVRFKSB7CisJCXNjYV9kdW1wX3JpbmdzKGRldik7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCWlmIChjbWQgIT0gU0lPQ1dBTkRFVikKKwkJcmV0dXJuIGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisKKwlzd2l0Y2goaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCWNhc2UgSUZfR0VUX0lGQUNFOgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfVjM1OworCQlpZiAoaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA8IHNpemUpIHsKKwkJCWlmci0+aWZyX3NldHRpbmdzLnNpemUgPSBzaXplOyAvKiBkYXRhIHNpemUgd2FudGVkICovCisJCQlyZXR1cm4gLUVOT0JVRlM7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihsaW5lLCAmcG9ydC0+c2V0dGluZ3MsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBJRl9JRkFDRV9WMzU6CisJY2FzZSBJRl9JRkFDRV9TWU5DX1NFUklBTDoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJm5ld19saW5lLCBsaW5lLCBzaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChuZXdfbGluZS5jbG9ja190eXBlICE9IENMT0NLX0VYVCAmJgorCQkgICAgbmV3X2xpbmUuY2xvY2tfdHlwZSAhPSBDTE9DS19UWEZST01SWCAmJgorCQkgICAgbmV3X2xpbmUuY2xvY2tfdHlwZSAhPSBDTE9DS19JTlQgJiYKKwkJICAgIG5ld19saW5lLmNsb2NrX3R5cGUgIT0gQ0xPQ0tfVFhJTlQpCisJCXJldHVybiAtRUlOVkFMOwkvKiBObyBzdWNoIGNsb2NrIHNldHRpbmcgKi8KKworCQlpZiAobmV3X2xpbmUubG9vcGJhY2sgIT0gMCAmJiBuZXdfbGluZS5sb29wYmFjayAhPSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbWVtY3B5KCZwb3J0LT5zZXR0aW5ncywgJm5ld19saW5lLCBzaXplKTsgLyogVXBkYXRlIHNldHRpbmdzICovCisJCXBjaTIwMF9zZXRfaWZhY2UocG9ydCk7CisJCXNjYV9mbHVzaChwb3J0X3RvX2NhcmQocG9ydCkpOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCXJldHVybiBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCX0KK30KKworCisKK3N0YXRpYyB2b2lkIHBjaTIwMF9wY2lfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpbnQgaTsKKwljYXJkX3QgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlmb3IoaSA9IDA7IGkgPCAyOyBpKyspCisJCWlmIChjYXJkLT5wb3J0c1tpXS5jYXJkKSB7CisJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydF90b19kZXYoJmNhcmQtPnBvcnRzW2ldKTsKKwkJCXVucmVnaXN0ZXJfaGRsY19kZXZpY2UoZGV2KTsKKwkJfQorCisJaWYgKGNhcmQtPmlycSkKKwkJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKKworCWlmIChjYXJkLT5yYW1iYXNlKQorCQlpb3VubWFwKGNhcmQtPnJhbWJhc2UpOworCWlmIChjYXJkLT5zY2FiYXNlKQorCQlpb3VubWFwKGNhcmQtPnNjYWJhc2UpOworCWlmIChjYXJkLT5wbHhiYXNlKQorCQlpb3VubWFwKGNhcmQtPnBseGJhc2UpOworCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWlmIChjYXJkLT5wb3J0c1swXS5kZXYpCisJCWZyZWVfbmV0ZGV2KGNhcmQtPnBvcnRzWzBdLmRldik7CisJaWYgKGNhcmQtPnBvcnRzWzFdLmRldikKKwkJZnJlZV9uZXRkZXYoY2FyZC0+cG9ydHNbMV0uZGV2KTsKKwlrZnJlZShjYXJkKTsKK30KKworCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBjaTIwMF9wY2lfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCSBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWNhcmRfdCAqY2FyZDsKKwl1OCByZXZfaWQ7CisJdTMyIF9faW9tZW0gKnA7CisJaW50IGk7CisJdTMyIHJhbXNpemU7CisJdTMyIHJhbXBoeXM7CQkvKiBidWZmZXIgbWVtb3J5IGJhc2UgKi8KKwl1MzIgc2NhcGh5czsJCS8qIFNDQSBtZW1vcnkgYmFzZSAqLworCXUzMiBwbHhwaHlzOwkJLyogUExYIHJlZ2lzdGVycyBtZW1vcnkgYmFzZSAqLworCisjaWZuZGVmIE1PRFVMRQorCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayhLRVJOX0lORk8gIiVzXG4iLCB2ZXJzaW9uKTsKKyNlbmRpZgorCisJaSA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChpKQorCQlyZXR1cm4gaTsKKworCWkgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsICJQQ0kyMDBTWU4iKTsKKwlpZiAoaSkgeworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXJldHVybiBpOworCX0KKworCWNhcmQgPSBrbWFsbG9jKHNpemVvZihjYXJkX3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2FyZCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAicGNpMjAwc3luOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQorCW1lbXNldChjYXJkLCAwLCBzaXplb2YoY2FyZF90KSk7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGNhcmQpOworCWNhcmQtPnBvcnRzWzBdLmRldiA9IGFsbG9jX2hkbGNkZXYoJmNhcmQtPnBvcnRzWzBdKTsKKwljYXJkLT5wb3J0c1sxXS5kZXYgPSBhbGxvY19oZGxjZGV2KCZjYXJkLT5wb3J0c1sxXSk7CisJaWYgKCFjYXJkLT5wb3J0c1swXS5kZXYgfHwgIWNhcmQtPnBvcnRzWzFdLmRldikgeworCQlwcmludGsoS0VSTl9FUlIgInBjaTIwMHN5bjogdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCXBjaTIwMF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX1JFVklTSU9OX0lELCAmcmV2X2lkKTsKKwlpZiAocGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSAhPSBQQ0kyMDBTWU5fUExYX1NJWkUgfHwKKwkgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAyKSAhPSBQQ0kyMDBTWU5fU0NBX1NJWkUgfHwKKwkgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAzKSA8IDE2Mzg0KSB7CisJCXByaW50ayhLRVJOX0VSUiAicGNpMjAwc3luOiBpbnZhbGlkIGNhcmQgRUVQUk9NIHBhcmFtZXRlcnNcbiIpOworCQlwY2kyMDBfcGNpX3JlbW92ZV9vbmUocGRldik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXBseHBoeXMgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwwKSAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisJY2FyZC0+cGx4YmFzZSA9IGlvcmVtYXAocGx4cGh5cywgUENJMjAwU1lOX1BMWF9TSVpFKTsKKworCXNjYXBoeXMgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwyKSAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisJY2FyZC0+c2NhYmFzZSA9IGlvcmVtYXAoc2NhcGh5cywgUENJMjAwU1lOX1NDQV9TSVpFKTsKKworCXJhbXBoeXMgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwzKSAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisJY2FyZC0+cmFtYmFzZSA9IGlvcmVtYXAocmFtcGh5cywgcGNpX3Jlc291cmNlX2xlbihwZGV2LDMpKTsKKworCWlmIChjYXJkLT5wbHhiYXNlID09IE5VTEwgfHwKKwkgICAgY2FyZC0+c2NhYmFzZSA9PSBOVUxMIHx8CisJICAgIGNhcmQtPnJhbWJhc2UgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInBjaTIwMHN5bjogaW9yZW1hcCgpIGZhaWxlZFxuIik7CisJCXBjaTIwMF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwl9CisKKwkvKiBSZXNldCBQTFggKi8KKwlwID0gJmNhcmQtPnBseGJhc2UtPmluaXRfY3RybDsKKwl3cml0ZWwocmVhZGwocCkgfCAweDQwMDAwMDAwLCBwKTsKKwlyZWFkbChwKTsJCS8qIEZsdXNoIHRoZSB3cml0ZSAtIGRvIG5vdCB1c2Ugc2NhX2ZsdXNoICovCisJdWRlbGF5KDEpOworCisJd3JpdGVsKHJlYWRsKHApICYgfjB4NDAwMDAwMDAsIHApOworCXJlYWRsKHApOwkJLyogRmx1c2ggdGhlIHdyaXRlIC0gZG8gbm90IHVzZSBzY2FfZmx1c2ggKi8KKwl1ZGVsYXkoMSk7CisKKwlyYW1zaXplID0gc2NhX2RldGVjdF9yYW0oY2FyZCwgY2FyZC0+cmFtYmFzZSwKKwkJCQkgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAzKSk7CisKKwkvKiBudW1iZXIgb2YgVFggKyBSWCBidWZmZXJzIGZvciBvbmUgcG9ydCAtIHRoaXMgaXMgZHVhbCBwb3J0IGNhcmQgKi8KKwlpID0gcmFtc2l6ZSAvICgyICogKHNpemVvZihwa3RfZGVzYykgKyBIRExDX01BWF9NUlUpKTsKKwljYXJkLT50eF9yaW5nX2J1ZmZlcnMgPSBtaW4oaSAvIDIsIE1BWF9UWF9CVUZGRVJTKTsKKwljYXJkLT5yeF9yaW5nX2J1ZmZlcnMgPSBpIC0gY2FyZC0+dHhfcmluZ19idWZmZXJzOworCisJY2FyZC0+YnVmZl9vZmZzZXQgPSAyICogc2l6ZW9mKHBrdF9kZXNjKSAqIChjYXJkLT50eF9yaW5nX2J1ZmZlcnMgKworCQkJCQkJICAgIGNhcmQtPnJ4X3JpbmdfYnVmZmVycyk7CisKKwlwcmludGsoS0VSTl9JTkZPICJwY2kyMDBzeW46ICV1IEtCIFJBTSBhdCAweCV4LCBJUlEldSwgdXNpbmcgJXUgVFggKyIKKwkgICAgICAgIiAldSBSWCBwYWNrZXRzIHJpbmdzXG4iLCByYW1zaXplIC8gMTAyNCwgcmFtcGh5cywKKwkgICAgICAgcGRldi0+aXJxLCBjYXJkLT50eF9yaW5nX2J1ZmZlcnMsIGNhcmQtPnJ4X3JpbmdfYnVmZmVycyk7CisKKwlpZiAoY2FyZC0+dHhfcmluZ19idWZmZXJzIDwgMSkgeworCQlwcmludGsoS0VSTl9FUlIgInBjaTIwMHN5bjogUkFNIHRlc3QgZmFpbGVkXG4iKTsKKwkJcGNpMjAwX3BjaV9yZW1vdmVfb25lKHBkZXYpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBvbiB0aGUgUENJIGJyaWRnZSAqLworCXAgPSAmY2FyZC0+cGx4YmFzZS0+aW50cl9jdHJsX3N0YXQ7CisJd3JpdGV3KHJlYWR3KHApIHwgMHgwMDQwLCBwKTsKKworCS8qIEFsbG9jYXRlIElSUSAqLworCWlmKHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgc2NhX2ludHIsIFNBX1NISVJRLCBkZXZuYW1lLCBjYXJkKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJwY2kyMDBzeW46IGNvdWxkIG5vdCBhbGxvY2F0ZSBJUlElZC5cbiIsCisJCSAgICAgICBwZGV2LT5pcnEpOworCQlwY2kyMDBfcGNpX3JlbW92ZV9vbmUocGRldik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWNhcmQtPmlycSA9IHBkZXYtPmlycTsKKworCXNjYV9pbml0KGNhcmQsIDApOworCisJZm9yKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXBvcnRfdCAqcG9ydCA9ICZjYXJkLT5wb3J0c1tpXTsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnRfdG9fZGV2KHBvcnQpOworCQloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJCXBvcnQtPnBoeV9ub2RlID0gaTsKKworCQlzcGluX2xvY2tfaW5pdCgmcG9ydC0+bG9jayk7CisJCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwkJZGV2LT5pcnEgPSBjYXJkLT5pcnE7CisJCWRldi0+bWVtX3N0YXJ0ID0gcmFtcGh5czsKKwkJZGV2LT5tZW1fZW5kID0gcmFtcGh5cyArIHJhbXNpemUgLSAxOworCQlkZXYtPnR4X3F1ZXVlX2xlbiA9IDUwOworCQlkZXYtPmRvX2lvY3RsID0gcGNpMjAwX2lvY3RsOworCQlkZXYtPm9wZW4gPSBwY2kyMDBfb3BlbjsKKwkJZGV2LT5zdG9wID0gcGNpMjAwX2Nsb3NlOworCQloZGxjLT5hdHRhY2ggPSBzY2FfYXR0YWNoOworCQloZGxjLT54bWl0ID0gc2NhX3htaXQ7CisJCXBvcnQtPnNldHRpbmdzLmNsb2NrX3R5cGUgPSBDTE9DS19FWFQ7CisJCXBvcnQtPmNhcmQgPSBjYXJkOworCQlpZihyZWdpc3Rlcl9oZGxjX2RldmljZShkZXYpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInBjaTIwMHN5bjogdW5hYmxlIHRvIHJlZ2lzdGVyIGhkbGMgIgorCQkJICAgICAgICJkZXZpY2VcbiIpOworCQkJcG9ydC0+Y2FyZCA9IE5VTEw7CisJCQlwY2kyMDBfcGNpX3JlbW92ZV9vbmUocGRldik7CisJCQlyZXR1cm4gLUVOT0JVRlM7CisJCX0KKwkJc2NhX2luaXRfc3luY19wb3J0KHBvcnQpOwkvKiBTZXQgdXAgU0NBIG1lbW9yeSAqLworCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQQ0kyMDBTWU4gbm9kZSAlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcG9ydC0+cGh5X25vZGUpOworCX0KKworCXNjYV9mbHVzaChjYXJkKTsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2kyMDBfcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyBQQ0lfVkVORE9SX0lEX0dPUkFNTywgUENJX0RFVklDRV9JRF9QQ0kyMDBTWU4sIFBDSV9BTllfSUQsCisJICBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyAwLCB9Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBwY2kyMDBfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiUENJMjAwU1lOIiwKKwkuaWRfdGFibGUJPSBwY2kyMDBfcGNpX3RibCwKKwkucHJvYmUJCT0gcGNpMjAwX3BjaV9pbml0X29uZSwKKwkucmVtb3ZlCQk9IHBjaTIwMF9wY2lfcmVtb3ZlX29uZSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgcGNpMjAwX2luaXRfbW9kdWxlKHZvaWQpCit7CisjaWZkZWYgTU9EVUxFCisJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIHZlcnNpb24pOworI2VuZGlmCisJaWYgKHBjaV9jbG9ja19mcmVxIDwgMTAwMDAwMCB8fCBwY2lfY2xvY2tfZnJlcSA+IDgwMDAwMDAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAicGNpMjAwc3luOiBJbnZhbGlkIFBDSSBjbG9jayBmcmVxdWVuY3lcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmcGNpMjAwX3BjaV9kcml2ZXIpOworfQorCisKKworc3RhdGljIHZvaWQgX19leGl0IHBjaTIwMF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcGNpMjAwX3BjaV9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJHb3JhbW8gUENJMjAwU1lOIHNlcmlhbCBwb3J0IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBjaTIwMF9wY2lfdGJsKTsKK21vZHVsZV9wYXJhbShwY2lfY2xvY2tfZnJlcSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocGNpX2Nsb2NrX2ZyZXEsICJTeXN0ZW0gUENJIGNsb2NrIGZyZXF1ZW5jeSBpbiBIeiIpOworbW9kdWxlX2luaXQocGNpMjAwX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHBjaTIwMF9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vc2JuaS5jIGIvZHJpdmVycy9uZXQvd2FuL3NibmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjJjNzk4YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zYm5pLmMKQEAgLTAsMCArMSwxNzM1IEBACisvKiBzYm5pLmM6ICBHcmFuY2ggU0JOSTEyIGxlYXNlZCBsaW5lIGFkYXB0ZXJzIGRyaXZlciBmb3IgbGludXgKKyAqCisgKglXcml0dGVuIDIwMDEgYnkgRGVuaXMgSS5UaW1vZmVldiAodGltb2ZlZXZAZ3JhbmNoLnJ1KQorICoKKyAqCVByZXZpb3VzIHZlcnNpb25zIHdlcmUgd3JpdHRlbiBieSBZYXJvc2xhdiBQb2x5YWtvdiwKKyAqCUFsZXhleSBadmVyZXYgYW5kIE1heCBLaG9uLgorICoKKyAqCURyaXZlciBzdXBwb3J0cyBTQk5JMTItMDIsLTA0LC0wNSwtMTAsLTExIGNhcmRzLCBzaW5nbGUgYW5kCisgKglkb3VibGUtY2hhbm5lbCwgUENJIGFuZCBJU0EgbW9kaWZpY2F0aW9ucy4KKyAqCU1vcmUgaW5mbyBhbmQgdXNlZnVsIHV0aWxpdGllcyB0byB3b3JrIHdpdGggU0JOSTEyIGNhcmRzIHlvdSBjYW4gZmluZAorICoJYXQgaHR0cDovL3d3dy5ncmFuY2guY29tIChFbmdsaXNoKSBvciBodHRwOi8vd3d3LmdyYW5jaC5ydSAoUnVzc2lhbikKKyAqCisgKglUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKglvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICoKKyAqICA1LjAuMQlKdW4gMjIgMjAwMQorICoJICAtIEZpeGVkIGJ1ZyBpbiBwcm9iZQorICogIDUuMC4wCUp1biAwNiAyMDAxCisgKgkgIC0gRHJpdmVyIHdhcyBjb21wbGV0ZWx5IHJlZGVzaWduZWQgYnkgRGVuaXMgSS5UaW1vZmVldiwKKyAqCSAgLSBub3cgUENJL0R1YWwsIElTQS9EdWFsICh3aXRoIHNpbmdsZSBpbnRlcnJ1cHQgbGluZSkgbW9kZWxzIGFyZQorICoJICAtIHN1cHBvcnRlZAorICogIDMuMy4wCVRodSBGZWIgMjQgMjE6MzA6MjggTk9WVCAyMDAwIAorICogICAgICAgIC0gUENJIGNhcmRzIHN1cHBvcnQKKyAqICAzLjIuMAlNb24gRGVjIDEzIDIyOjI2OjUzIE5PVlQgMTk5OQorICogCSAgLSBDb21wbGV0ZWx5IHJlYnVpbHQgYWxsIHRoZSBwYWNrZXQgc3RvcmFnZSBzeXN0ZW0KKyAqIAkgIC0gICAgdG8gd29yayBpbiBFdGhlcm5ldC1saWtlIHN0eWxlLgorICogIDMuMS4xCWp1c3QgZml4ZWQgc29tZSBidWdzICg1IGF1ZyAxOTk5KQorICogIDMuMS4wCWFkZGVkIGJhbGFuY2luZyBmZWF0dXJlCSgyNiBhcHIgMTk5OSkKKyAqICAzLjAuMQlqdXN0IGZpeGVkIHNvbWUgYnVncyAoMTQgYXByIDE5OTkpLgorICogIDMuMC4wCUluaXRpYWwgUmV2aXNpb24sIFlhcm9zbGF2IFBvbHlha292ICgyNCBGZWIgMTk5OSkKKyAqICAgICAgICAtIGFkZGVkIHByZS1jYWxjdWxhdGlvbiBmb3IgQ1JDLCBmaXhlZCBidWcgd2l0aCAibGVuLTIiIGZyYW1lcywgCisgKiAgICAgICAgLSByZW1vdmVkIG91dGJvdW5kIGZyYWdtZW50YXRpb24gKE1UVT0xMDAwKSwgd3JpdHRlbiBDUkMtY2FsY3VsYXRpb24gCisgKiAgICAgICAgLSBvbiBhc20sIGFkZGVkIHdvcmsgd2l0aCBoYXJkX2hlYWRlcnMgYW5kIG5vdyB3ZSBoYXZlIG91ciBvd24gY2FjaGUgCisgKiAgICAgICAgLSBmb3IgdGhlbSwgb3B0aW9uYWxseSBzdXBwb3J0ZWQgd29yZC1pbnRlcmNoYW5nZSBvbiBzb21lIGNoaXBzZXRzLAorICogCisgKglLbm93biBwcm9ibGVtOiB0aGlzIGRyaXZlciB3YXNuJ3QgdGVzdGVkIG9uIG11bHRpcHJvY2Vzc29yIG1hY2hpbmUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bmV0L2FycC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAic2JuaS5oIgorCisvKiBkZXZpY2UgcHJpdmF0ZSBkYXRhICovCisKK3N0cnVjdCBuZXRfbG9jYWwgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOworCXN0cnVjdCB0aW1lcl9saXN0CXdhdGNoZG9nOworCisJc3BpbmxvY2tfdAlsb2NrOworCXN0cnVjdCBza19idWZmICAqcnhfYnVmX3A7CQkvKiByZWNlaXZlIGJ1ZmZlciBwdHIgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAgKnR4X2J1Zl9wOwkJLyogdHJhbnNtaXQgYnVmZmVyIHB0ciAqLworCQorCXVuc2lnbmVkIGludAlmcmFtZWxlbjsJCS8qIGN1cnJlbnQgZnJhbWUgbGVuZ3RoICovCisJdW5zaWduZWQgaW50CW1heGZyYW1lOwkJLyogbWF4aW11bSB2YWxpZCBmcmFtZSBsZW5ndGggKi8KKwl1bnNpZ25lZCBpbnQJc3RhdGU7CisJdW5zaWduZWQgaW50CWlucHBvcywgb3V0cG9zOwkJLyogcG9zaXRpb25zIGluIHJ4L3R4IGJ1ZmZlcnMgKi8KKworCS8qIHRyYW5zbWl0dGluZyBmcmFtZSBudW1iZXIgLSBmcm9tIGZyYW1lcyBxdHkgdG8gMSAqLworCXVuc2lnbmVkIGludAl0eF9mcmFtZW5vOworCisJLyogZXhwZWN0ZWQgbnVtYmVyIG9mIG5leHQgcmVjZWl2aW5nIGZyYW1lICovCisJdW5zaWduZWQgaW50CXdhaXRfZnJhbWVubzsKKworCS8qIGNvdW50IG9mIGZhaWxlZCBhdHRlbXB0cyB0byBmcmFtZSBzZW5kIC0gMzIgYXR0ZW1wdHMgZG8gYmVmb3JlCisJICAgZXJyb3IgLSB3aGlsZSByZWNlaXZlciB0dW5lcyBvbiBvcHBvc2l0ZSBzaWRlIG9mIHdpcmUgKi8KKwl1bnNpZ25lZCBpbnQJdHJhbnNfZXJyb3JzOworCisJLyogaWRsZSB0aW1lOyBzZW5kIHBvbmcgd2hlbiBsaW1pdCBleGNlZWRlZCAqLworCXVuc2lnbmVkIGludAl0aW1lcl90aWNrczsKKworCS8qIGZpZWxkcyB1c2VkIGZvciByZWNlaXZlIGxldmVsIGF1dG9zZWxlY3Rpb24gKi8KKwlpbnQJZGVsdGFfcnhsOworCXVuc2lnbmVkIGludAljdXJfcnhsX2luZGV4LCB0aW1lb3V0X3J4bDsKKwl1bnNpZ25lZCBsb25nCWN1cl9yeGxfcmN2ZCwgcHJldl9yeGxfcmN2ZDsKKworCXN0cnVjdCBzYm5pX2NzcjEJY3NyMTsJCS8qIGN1cnJlbnQgdmFsdWUgb2YgQ1NSMSAqLworCXN0cnVjdCBzYm5pX2luX3N0YXRzCWluX3N0YXRzOyAJLyogaW50ZXJuYWwgc3RhdGlzdGljcyAqLyAKKworCXN0cnVjdCBuZXRfZGV2aWNlCQkqc2Vjb25kOwkvKiBmb3IgSVNBL2R1YWwgY2FyZHMgKi8KKworI2lmZGVmIENPTkZJR19TQk5JX01VTFRJTElORQorCXN0cnVjdCBuZXRfZGV2aWNlCQkqbWFzdGVyOworCXN0cnVjdCBuZXRfZGV2aWNlCQkqbGluazsKKyNlbmRpZgorfTsKKworCitzdGF0aWMgaW50ICBzYm5pX2NhcmRfcHJvYmUoIHVuc2lnbmVkIGxvbmcgKTsKK3N0YXRpYyBpbnQgIHNibmlfcGNpX3Byb2JlKCBzdHJ1Y3QgbmV0X2RldmljZSAgKiApOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICAqc2JuaV9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZywgaW50KTsKK3N0YXRpYyBpbnQgIHNibmlfb3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIGludCAgc2JuaV9jbG9zZSggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIGludCAgc2JuaV9zdGFydF94bWl0KCBzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgaW50ICBzYm5pX2lvY3RsKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgaWZyZXEgKiwgaW50ICk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgICpzYm5pX2dldF9zdGF0cyggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHZvaWQgIHNldF9tdWx0aWNhc3RfbGlzdCggc3RydWN0IG5ldF9kZXZpY2UgKiApOworCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2JuaV9pbnRlcnJ1cHQoIGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqICk7CitzdGF0aWMgdm9pZCAgaGFuZGxlX2NoYW5uZWwoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyBpbnQgICByZWN2X2ZyYW1lKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZCAgc2VuZF9mcmFtZSggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIGludCAgIHVwbG9hZF9kYXRhKCBzdHJ1Y3QgbmV0X2RldmljZSAqLAorCQkJICB1bnNpZ25lZCwgdW5zaWduZWQsIHVuc2lnbmVkLCB1MzIgKTsKK3N0YXRpYyB2b2lkICBkb3dubG9hZF9kYXRhKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MzIgKiApOworc3RhdGljIHZvaWQgIHNibmlfd2F0Y2hkb2coIHVuc2lnbmVkIGxvbmcgKTsKK3N0YXRpYyB2b2lkICBpbnRlcnByZXRfYWNrKCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1bnNpZ25lZCApOworc3RhdGljIGludCAgIGFwcGVuZF9mcmFtZV90b19wa3QoIHN0cnVjdCBuZXRfZGV2aWNlICosIHVuc2lnbmVkLCB1MzIgKTsKK3N0YXRpYyB2b2lkICBpbmRpY2F0ZV9wa3QoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB2b2lkICBjYXJkX3N0YXJ0KCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZCAgcHJlcGFyZV90b19zZW5kKCBzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZCAgZHJvcF94bWl0X3F1ZXVlKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CitzdGF0aWMgdm9pZCAgc2VuZF9mcmFtZV9oZWFkZXIoIHN0cnVjdCBuZXRfZGV2aWNlICosIHUzMiAqICk7CitzdGF0aWMgaW50ICAgc2tpcF90YWlsKCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdTMyICk7CitzdGF0aWMgaW50ICAgY2hlY2tfZmhkciggdTMyLCB1MzIgKiwgdTMyICosIHUzMiAqLCB1MzIgKiwgdTMyICogKTsKK3N0YXRpYyB2b2lkICBjaGFuZ2VfbGV2ZWwoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyB2b2lkICB0aW1lb3V0X2NoYW5nZV9sZXZlbCggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIHUzMiAgIGNhbGNfY3JjMzIoIHUzMiwgdTggKiwgdTMyICk7CitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKiAgZ2V0X3J4X2J1Ziggc3RydWN0IG5ldF9kZXZpY2UgKiApOworc3RhdGljIGludCAgc2JuaV9pbml0KCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CisKKyNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKK3N0YXRpYyBpbnQgIGVuc2xhdmUoIHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKK3N0YXRpYyBpbnQgIGVtYW5jaXBhdGUoIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKKyNlbmRpZgorCisjaWZkZWYgX19pMzg2X18KKyNkZWZpbmUgQVNNX0NSQyAxCisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgIHZlcnNpb25bXSA9CisJIkdyYW5jaCBTQk5JMTIgZHJpdmVyIHZlciA1LjAuMSAgSnVuIDIyIDIwMDEgIERlbmlzIEkuVGltb2ZlZXYuXG4iOworCitzdGF0aWMgaW50ICBza2lwX3BjaV9wcm9iZQlfX2luaXRkYXRhID0gMDsKK3N0YXRpYyBpbnQgIHNjYW5kb25lCV9faW5pdGRhdGEgPSAwOworc3RhdGljIGludCAgbnVtCQlfX2luaXRkYXRhID0gMDsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgIHJ4bF90YWJbXTsKK3N0YXRpYyB1MzIgIGNyYzMydGFiW107CisKKy8qIEEgbGlzdCBvZiBhbGwgaW5zdGFsbGVkIGRldmljZXMsIGZvciByZW1vdmluZyB0aGUgZHJpdmVyIG1vZHVsZS4gKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAgKnNibmlfY2FyZHNbIFNCTklfTUFYX05VTV9DQVJEUyBdOworCisvKiBMaXN0cyBvZiBkZXZpY2UncyBwYXJhbWV0ZXJzICovCitzdGF0aWMgdTMyCWlvWyAgIFNCTklfTUFYX05VTV9DQVJEUyBdIF9faW5pdGRhdGEgPQorCXsgWzAgLi4uIFNCTklfTUFYX05VTV9DQVJEUy0xXSA9IC0xIH07CitzdGF0aWMgdTMyCWlycVsgIFNCTklfTUFYX05VTV9DQVJEUyBdIF9faW5pdGRhdGE7CitzdGF0aWMgdTMyCWJhdWRbIFNCTklfTUFYX05VTV9DQVJEUyBdIF9faW5pdGRhdGE7CitzdGF0aWMgdTMyCXJ4bFsgIFNCTklfTUFYX05VTV9DQVJEUyBdIF9faW5pdGRhdGEgPQorCXsgWzAgLi4uIFNCTklfTUFYX05VTV9DQVJEUy0xXSA9IC0xIH07CitzdGF0aWMgdTMyCW1hY1sgIFNCTklfTUFYX05VTV9DQVJEUyBdIF9faW5pdGRhdGE7CisKKyNpZm5kZWYgTU9EVUxFCit0eXBlZGVmIHUzMiAgaWFycltdOworc3RhdGljIGlhcnIgX19pbml0ZGF0YSAqZGVzdFs1XSA9IHsgJmlvLCAmaXJxLCAmYmF1ZCwgJnJ4bCwgJm1hYyB9OworI2VuZGlmCisKKy8qIEEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgSS9PIGFkZHJlc3NlcyB0byBiZSBwcm9iZWQgb24gSVNBIGJ1cyAqLworc3RhdGljIHVuc2lnbmVkIGludCAgbmV0Y2FyZF9wb3J0bGlzdFsgXSBfX2luaXRkYXRhID0geyAKKwkweDIxMCwgMHgyMTQsIDB4MjIwLCAweDIyNCwgMHgyMzAsIDB4MjM0LCAweDI0MCwgMHgyNDQsIDB4MjUwLCAweDI1NCwKKwkweDI2MCwgMHgyNjQsIDB4MjcwLCAweDI3NCwgMHgyODAsIDB4Mjg0LCAweDI5MCwgMHgyOTQsIDB4MmEwLCAweDJhNCwKKwkweDJiMCwgMHgyYjQsIDB4MmMwLCAweDJjNCwgMHgyZDAsIDB4MmQ0LCAweDJlMCwgMHgyZTQsIDB4MmYwLCAweDJmNCwKKwkwIH07CisKKworLyoKKyAqIExvb2sgZm9yIFNCTkkgY2FyZCB3aGljaCBhZGRyIHN0b3JlZCBpbiBkZXYtPmJhc2VfYWRkciwgaWYgbm9uemVyby4KKyAqIE90aGVyd2lzZSwgbG9vayB0aHJvdWdoIFBDSSBidXMuIElmIG5vbmUgUENJLWNhcmQgd2FzIGZvdW5kLCBzY2FuIElTQS4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBfX2luaXQKK3NibmlfaXNhX3Byb2JlKCBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiApCit7CisJaWYoIGRldi0+YmFzZV9hZGRyID4gMHgxZmYKKwkgICAgJiYgIHJlcXVlc3RfcmVnaW9uKCBkZXYtPmJhc2VfYWRkciwgU0JOSV9JT19FWFRFTlQsIGRldi0+bmFtZSApCisJICAgICYmICBzYm5pX3Byb2JlMSggZGV2LCBkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEgKSApCisKKwkJcmV0dXJuICAwOworCWVsc2UgeworCQlwcmludGsoIEtFUk5fRVJSICJzYm5pOiBiYXNlIGFkZHJlc3MgMHglbHggaXMgYnVzeSwgb3IgYWRhcHRlciAiCisJCQkiaXMgbWFsZnVuY3Rpb25hbCFcbiIsIGRldi0+YmFzZV9hZGRyICk7CisJCXJldHVybiAgLUVOT0RFVjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzYm5pX2RldnNldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZXRoZXJfc2V0dXAoIGRldiApOworCWRldi0+b3BlbgkJPSAmc2JuaV9vcGVuOworCWRldi0+c3RvcAkJPSAmc2JuaV9jbG9zZTsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9ICZzYm5pX3N0YXJ0X3htaXQ7CisJZGV2LT5nZXRfc3RhdHMJCT0gJnNibmlfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0CT0gJnNldF9tdWx0aWNhc3RfbGlzdDsKKwlkZXYtPmRvX2lvY3RsCQk9ICZzYm5pX2lvY3RsOworCisJU0VUX01PRFVMRV9PV05FUiggZGV2ICk7Cit9CisKK2ludCBfX2luaXQgc2JuaV9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0YXRpYyB1bnNpZ25lZCAgdmVyc2lvbl9wcmludGVkIF9faW5pdGRhdGEgPSAwOworCWludCBlcnI7CisKKwlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpLCAic2JuaSIsIHNibmlfZGV2c2V0dXApOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAic2JuaSVkIiwgdW5pdCk7CisJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKworCWVyciA9IHNibmlfaW5pdChkZXYpOworCWlmIChlcnIpIHsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXJlbGVhc2VfcmVnaW9uKCBkZXYtPmJhc2VfYWRkciwgU0JOSV9JT19FWFRFTlQgKTsKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYoIHZlcnNpb25fcHJpbnRlZCsrID09IDAgKQorCQlwcmludGsoIEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNibmlfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCAgaTsKKwlpZiggZGV2LT5iYXNlX2FkZHIgKQorCQlyZXR1cm4gIHNibmlfaXNhX3Byb2JlKCBkZXYgKTsKKwkvKiBvdGhlcndpc2Ugd2UgaGF2ZSB0byBwZXJmb3JtIHNlYXJjaCBvdXIgYWRhcHRlciAqLworCisJaWYoIGlvWyBudW0gXSAhPSAtMSApCisJCWRldi0+YmFzZV9hZGRyCT0gaW9bIG51bSBdLAorCQlkZXYtPmlycQk9IGlycVsgbnVtIF07CisJZWxzZSBpZiggc2NhbmRvbmUgIHx8ICBpb1sgMCBdICE9IC0xICkKKwkJcmV0dXJuICAtRU5PREVWOworCisJLyogaWYgaW9bIG51bSBdIGNvbnRhaW5zIG5vbi16ZXJvIGFkZHJlc3MsIHRoZW4gdGhhdCBpcyBvbiBJU0EgYnVzICovCisJaWYoIGRldi0+YmFzZV9hZGRyICkKKwkJcmV0dXJuICBzYm5pX2lzYV9wcm9iZSggZGV2ICk7CisKKwkvKiAuLi5vdGhlcndpc2UgLSBzY2FuIFBDSSBmaXJzdCAqLworCWlmKCAhc2tpcF9wY2lfcHJvYmUgICYmICAhc2JuaV9wY2lfcHJvYmUoIGRldiApICkKKwkJcmV0dXJuICAwOworCisJaWYoIGlvWyBudW0gXSA9PSAtMSApIHsKKwkJLyogQXV0by1zY2FuIHdpbGwgYmUgc3RvcHBlZCB3aGVuIGZpcnN0IElTQSBjYXJkIHdlcmUgZm91bmQgKi8KKwkJc2NhbmRvbmUgPSAxOworCQlpZiggbnVtID4gMCApCisJCQlyZXR1cm4gIC1FTk9ERVY7CisJfQorCisJZm9yKCBpID0gMDsgIG5ldGNhcmRfcG9ydGxpc3RbIGkgXTsgICsraSApIHsKKwkJaW50ICBpb2FkZHIgPSBuZXRjYXJkX3BvcnRsaXN0WyBpIF07CisJCWlmKCByZXF1ZXN0X3JlZ2lvbiggaW9hZGRyLCBTQk5JX0lPX0VYVEVOVCwgZGV2LT5uYW1lICkKKwkJICAgICYmICBzYm5pX3Byb2JlMSggZGV2LCBpb2FkZHIsIDAgKSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAgLUVOT0RFVjsKK30KKworCitpbnQgX19pbml0CitzYm5pX3BjaV9wcm9iZSggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYgKQoreworCXN0cnVjdCBwY2lfZGV2ICAqcGRldiA9IE5VTEw7CisKKwl3aGlsZSggKHBkZXYgPSBwY2lfZ2V0X2NsYXNzKCBQQ0lfQ0xBU1NfTkVUV09SS19PVEhFUiA8PCA4LCBwZGV2ICkpCisJICAgICAgICE9IE5VTEwgKSB7CisJCWludCAgcGNpX2lycV9saW5lOworCQl1bnNpZ25lZCBsb25nICBwY2lfaW9hZGRyOworCQl1MTYgIHN1YnN5czsKKworCQlpZiggcGRldi0+dmVuZG9yICE9IFNCTklfUENJX1ZFTkRPUgorCQkgICAgJiYgIHBkZXYtPmRldmljZSAhPSBTQk5JX1BDSV9ERVZJQ0UgKQorCQkJCWNvbnRpbnVlOworCisJCXBjaV9pb2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoIHBkZXYsIDAgKTsKKwkJcGNpX2lycV9saW5lID0gcGRldi0+aXJxOworCisJCS8qIEF2b2lkIGFscmVhZHkgZm91bmQgY2FyZHMgZnJvbSBwcmV2aW91cyBjYWxscyAqLworCQlpZiggIXJlcXVlc3RfcmVnaW9uKCBwY2lfaW9hZGRyLCBTQk5JX0lPX0VYVEVOVCwgZGV2LT5uYW1lICkgKSB7CisJCQlwY2lfcmVhZF9jb25maWdfd29yZCggcGRldiwgUENJX1NVQlNZU1RFTV9JRCwgJnN1YnN5cyApOworCisJCQlpZiAoc3Vic3lzICE9IDIpCisJCQkJY29udGludWU7CisKKwkJCS8qIER1YWwgYWRhcHRlciBpcyBwcmVzZW50ICovCisJCQlpZiAoIXJlcXVlc3RfcmVnaW9uKHBjaV9pb2FkZHIgKz0gNCwgU0JOSV9JT19FWFRFTlQsCisJCQkJCQkJZGV2LT5uYW1lICkgKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYoIHBjaV9pcnFfbGluZSA8PSAwICB8fCAgcGNpX2lycV9saW5lID49IE5SX0lSUVMgKQorCQkJcHJpbnRrKCBLRVJOX1dBUk5JTkcgIiAgV0FSTklORzogVGhlIFBDSSBCSU9TIGFzc2lnbmVkICIKKwkJCQkidGhpcyBQQ0kgY2FyZCB0byBJUlEgJWQsIHdoaWNoIGlzIHVubGlrZWx5ICIKKwkJCQkidG8gd29yayEuXG4iCisJCQkJS0VSTl9XQVJOSU5HICIgWW91IHNob3VsZCB1c2UgdGhlIFBDSSBCSU9TICIKKwkJCQkic2V0dXAgdG8gYXNzaWduIGEgdmFsaWQgSVJRIGxpbmUuXG4iLAorCQkJCXBjaV9pcnFfbGluZSApOworCisJCS8qIGF2b2lkaW5nIHJlLWVuYWJsZSBkdWFsIGFkYXB0ZXJzICovCisJCWlmKCAocGNpX2lvYWRkciAmIDcpID09IDAgICYmICBwY2lfZW5hYmxlX2RldmljZSggcGRldiApICkgeworCQkJcmVsZWFzZV9yZWdpb24oIHBjaV9pb2FkZHIsIFNCTklfSU9fRVhURU5UICk7CisJCQlwY2lfZGV2X3B1dCggcGRldiApOworCQkJcmV0dXJuICAtRUlPOworCQl9CisJCWlmKCBzYm5pX3Byb2JlMSggZGV2LCBwY2lfaW9hZGRyLCBwY2lfaXJxX2xpbmUgKSApIHsKKwkJCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisJCQkvKiBub3QgdGhlIGJlc3QgdGhpbmcgdG8gZG8sIGJ1dCB0aGlzIGlzIGFsbCBtZXNzZWQgdXAgCisJCQkgICBmb3IgaG90cGx1ZyBzeXN0ZW1zIGFueXdheS4uLiAqLworCQkJcGNpX2Rldl9wdXQoIHBkZXYgKTsKKwkJCXJldHVybiAgMDsKKwkJfQorCX0KKwlyZXR1cm4gIC1FTk9ERVY7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICogX19pbml0CitzYm5pX3Byb2JlMSggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYsICB1bnNpZ25lZCBsb25nICBpb2FkZHIsICBpbnQgIGlycSApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sOworCisJaWYoIHNibmlfY2FyZF9wcm9iZSggaW9hZGRyICkgKSB7CisJCXJlbGVhc2VfcmVnaW9uKCBpb2FkZHIsIFNCTklfSU9fRVhURU5UICk7CisJCXJldHVybiBOVUxMOworCX0KKworCW91dGIoIDAsIGlvYWRkciArIENTUjAgKTsKKworCWlmKCBpcnEgPCAyICkgeworCQl1bnNpZ25lZCBsb25nIGlycV9tYXNrOworCisJCWlycV9tYXNrID0gcHJvYmVfaXJxX29uKCk7CisJCW91dGIoIEVOX0lOVCB8IFRSX1JFUSwgaW9hZGRyICsgQ1NSMCApOworCQlvdXRiKCBQUl9SRVMsIGlvYWRkciArIENTUjEgKTsKKwkJbWRlbGF5KDUwKTsKKwkJaXJxID0gcHJvYmVfaXJxX29mZihpcnFfbWFzayk7CisJCW91dGIoIDAsIGlvYWRkciArIENTUjAgKTsKKworCQlpZiggIWlycSApIHsKKwkJCXByaW50ayggS0VSTl9FUlIgIiVzOiBjYW4ndCBkZXRlY3QgZGV2aWNlIGlycSFcbiIsCisJCQkJZGV2LT5uYW1lICk7CisJCQlyZWxlYXNlX3JlZ2lvbiggaW9hZGRyLCBTQk5JX0lPX0VYVEVOVCApOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9IGVsc2UgaWYoIGlycSA9PSAyICkKKwkJaXJxID0gOTsKKworCWRldi0+aXJxID0gaXJxOworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCisJLyogQWxsb2NhdGUgZGV2LT5wcml2IGFuZCBmaWxsIGluIHNibmktc3BlY2lmaWMgZGV2IGZpZWxkcy4gKi8KKwlubCA9IGRldi0+cHJpdjsKKwlpZiggIW5sICkgeworCQlwcmludGsoIEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGdldCBtZW1vcnkhXG4iLCBkZXYtPm5hbWUgKTsKKwkJcmVsZWFzZV9yZWdpb24oIGlvYWRkciwgU0JOSV9JT19FWFRFTlQgKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZGV2LT5wcml2ID0gbmw7CisJbWVtc2V0KCBubCwgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfbG9jYWwpICk7CisJc3Bpbl9sb2NrX2luaXQoICZubC0+bG9jayApOworCisJLyogc3RvcmUgTUFDIGFkZHJlc3MgKGdlbmVyYXRlIGlmIHRoYXQgaXNuJ3Qga25vd24pICovCisJKih1MTYgKilkZXYtPmRldl9hZGRyID0gaHRvbnMoIDB4MDBmZiApOworCSoodTMyICopKGRldi0+ZGV2X2FkZHIgKyAyKSA9IGh0b25sKCAweDAxMDAwMDAwIHwKKwkJKCAobWFjW251bV0gID8gIG1hY1tudW1dICA6ICAodTMyKSgobG9uZylkZXYtPnByaXYpKSAmIDB4MDBmZmZmZmYpICk7CisKKwkvKiBzdG9yZSBsaW5rIHNldHRpbmdzIChzcGVlZCwgcmVjZWl2ZSBsZXZlbCApICovCisJbmwtPm1heGZyYW1lICA9IERFRkFVTFRfRlJBTUVfTEVOOworCW5sLT5jc3IxLnJhdGUgPSBiYXVkWyBudW0gXTsKKworCWlmKCAobmwtPmN1cl9yeGxfaW5kZXggPSByeGxbIG51bSBdKSA9PSAtMSApCisJCS8qIGF1dG90dW5lIHJ4bCAqLworCQlubC0+Y3VyX3J4bF9pbmRleCA9IERFRl9SWEwsCisJCW5sLT5kZWx0YV9yeGwgPSBERUZfUlhMX0RFTFRBOworCWVsc2UKKwkJbmwtPmRlbHRhX3J4bCA9IDA7CisJbmwtPmNzcjEucnhsICA9IHJ4bF90YWJbIG5sLT5jdXJfcnhsX2luZGV4IF07CisJaWYoIGluYiggaW9hZGRyICsgQ1NSMCApICYgMHgwMSApCisJCW5sLT5zdGF0ZSB8PSBGTF9TTE9XX01PREU7CisKKwlwcmludGsoIEtFUk5fTk9USUNFICIlczogaW9hZGRyICUjbHgsIGlycSAlZCwgIgorCQkiTUFDOiAwMDpmZjowMTolMDJ4OiUwMng6JTAyeFxuIiwgCisJCWRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxLAorCQkoKHU4ICopIGRldi0+ZGV2X2FkZHIpIFszXSwKKwkJKCh1OCAqKSBkZXYtPmRldl9hZGRyKSBbNF0sCisJCSgodTggKikgZGV2LT5kZXZfYWRkcikgWzVdICk7CisKKwlwcmludGsoIEtFUk5fTk9USUNFICIlczogc3BlZWQgJWQsIHJlY2VpdmUgbGV2ZWwgIiwgZGV2LT5uYW1lLAorCQkoIChubC0+c3RhdGUgJiBGTF9TTE9XX01PREUpICA/ICA1MDAwMDAgOiAyMDAwMDAwKQorCQkvICgxIDw8IG5sLT5jc3IxLnJhdGUpICk7CisKKwlpZiggbmwtPmRlbHRhX3J4bCA9PSAwICkKKwkJcHJpbnRrKCAiMHgleCAoZml4ZWQpXG4iLCBubC0+Y3VyX3J4bF9pbmRleCApOyAKKwllbHNlCisJCXByaW50ayggIihhdXRvKVxuIik7CisKKyNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKKwlubC0+bWFzdGVyID0gZGV2OworCW5sLT5saW5rICAgPSBOVUxMOworI2VuZGlmCisgICAKKwlzYm5pX2NhcmRzWyBudW0rKyBdID0gZGV2OworCXJldHVybiAgZGV2OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisKK3N0YXRpYyBpbnQKK3Nibmlfc3RhcnRfeG1pdCggc3RydWN0IHNrX2J1ZmYgICpza2IsICBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgICpwOworCisJbmV0aWZfc3RvcF9xdWV1ZSggZGV2ICk7CisKKwkvKiBMb29raW5nIGZvciBpZGxlIGRldmljZSBpbiB0aGUgbGlzdCAqLworCWZvciggcCA9IGRldjsgIHA7ICkgeworCQlzdHJ1Y3QgbmV0X2xvY2FsICAqbmwgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBwLT5wcml2OworCQlzcGluX2xvY2soICZubC0+bG9jayApOworCQlpZiggbmwtPnR4X2J1Zl9wICB8fCAgKG5sLT5zdGF0ZSAmIEZMX0xJTkVfRE9XTikgKSB7CisJCQlwID0gbmwtPmxpbms7CisJCQlzcGluX3VubG9jayggJm5sLT5sb2NrICk7CisJCX0gZWxzZSB7CisJCQkvKiBJZGxlIGRldiBpcyBmb3VuZCAqLworCQkJcHJlcGFyZV90b19zZW5kKCBza2IsIHAgKTsKKwkJCXNwaW5fdW5sb2NrKCAmbmwtPmxvY2sgKTsKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKCBkZXYgKTsKKwkJCXJldHVybiAgMDsKKwkJfQorCX0KKworCXJldHVybiAgMTsKK30KKworI2Vsc2UJLyogQ09ORklHX1NCTklfTVVMVElMSU5FICovCisKK3N0YXRpYyBpbnQKK3Nibmlfc3RhcnRfeG1pdCggc3RydWN0IHNrX2J1ZmYgICpza2IsICBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sICA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKworCW5ldGlmX3N0b3BfcXVldWUoIGRldiApOworCXNwaW5fbG9jayggJm5sLT5sb2NrICk7CisKKwlwcmVwYXJlX3RvX3NlbmQoIHNrYiwgZGV2ICk7CisKKwlzcGluX3VubG9jayggJm5sLT5sb2NrICk7CisJcmV0dXJuICAwOworfQorCisjZW5kaWYJLyogQ09ORklHX1NCTklfTVVMVElMSU5FICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGludGVycnVwdCBoYW5kbGVyICovCisKKy8qCisgKiAJU0JOSTEyRC0xMCwgLTExL0lTQSBib2FyZHMgd2l0aGluICJjb21tb24gaW50ZXJydXB0IiBtb2RlIGNvdWxkIG5vdAorICogYmUgbG9va2VkIGFzIHR3byBpbmRlcGVuZGVudCBzaW5nbGUtY2hhbm5lbCBkZXZpY2VzLiBFdmVyeSBjaGFubmVsIHNlZW1zCisgKiBhcyBFdGhlcm5ldCBpbnRlcmZhY2UgYnV0IGludGVycnVwdCBoYW5kbGVyIG11c3QgYmUgY29tbW9uLiBSZWFsbHksIGZpcnN0CisgKiBjaGFubmVsICgibWFzdGVyIikgZHJpdmVyIG9ubHkgcmVnaXN0ZXJzIHRoZSBoYW5kbGVyLiBJbiBpdHMgc3RydWN0IG5ldF9sb2NhbAorICogaXQgaGFzIGdvdCBwb2ludGVyIHRvICJzbGF2ZSIgY2hhbm5lbCdzIHN0cnVjdCBuZXRfbG9jYWwgYW5kIGhhbmRsZXMgdGhhdCdzCisgKiBpbnRlcnJ1cHRzIHRvby4KKyAqCWRldiBvZiBzdWNjZXNzZnVsbHkgYXR0YWNoZWQgSVNBIFNCTkkgYm9hcmRzIGlzIGxpbmtlZCB0byBsaXN0LgorICogV2hpbGUgbmV4dCBib2FyZCBkcml2ZXIgaXMgaW5pdGlhbGl6ZWQsIGl0IHNjYW5zIHRoaXMgbGlzdC4gSWYgb25lCisgKiBoYXMgZm91bmQgZGV2IHdpdGggc2FtZSBpcnEgYW5kIGlvYWRkciBkaWZmZXJlbnQgYnkgNCB0aGVuIGl0IGFzc3VtZXMKKyAqIHRoaXMgYm9hcmQgdG8gYmUgIm1hc3RlciIuCisgKi8gCisKK3N0YXRpYyBpcnFyZXR1cm5fdAorc2JuaV9pbnRlcnJ1cHQoIGludCAgaXJxLCAgdm9pZCAgKmRldl9pZCwgIHN0cnVjdCBwdF9yZWdzICAqcmVncyApCit7CisJc3RydWN0IG5ldF9kZXZpY2UJICAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKKwlzdHJ1Y3QgbmV0X2xvY2FsICAqbmwgID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCWludAlyZXBlYXQ7CisKKwlzcGluX2xvY2soICZubC0+bG9jayApOworCWlmKCBubC0+c2Vjb25kICkKKwkJc3Bpbl9sb2NrKCAmKChzdHJ1Y3QgbmV0X2xvY2FsICopIG5sLT5zZWNvbmQtPnByaXYpLT5sb2NrICk7CisKKwlkbyB7CisJCXJlcGVhdCA9IDA7CisJCWlmKCBpbmIoIGRldi0+YmFzZV9hZGRyICsgQ1NSMCApICYgKFJDX1JEWSB8IFRSX1JEWSkgKQorCQkJaGFuZGxlX2NoYW5uZWwoIGRldiApLAorCQkJcmVwZWF0ID0gMTsKKwkJaWYoIG5sLT5zZWNvbmQgICYmIAkvKiBzZWNvbmQgY2hhbm5lbCBwcmVzZW50ICovCisJCSAgICAoaW5iKCBubC0+c2Vjb25kLT5iYXNlX2FkZHIrQ1NSMCApICYgKFJDX1JEWSB8IFRSX1JEWSkpICkKKwkJCWhhbmRsZV9jaGFubmVsKCBubC0+c2Vjb25kICksCisJCQlyZXBlYXQgPSAxOworCX0gd2hpbGUoIHJlcGVhdCApOworCisJaWYoIG5sLT5zZWNvbmQgKQorCQlzcGluX3VubG9jayggJigoc3RydWN0IG5ldF9sb2NhbCAqKW5sLT5zZWNvbmQtPnByaXYpLT5sb2NrICk7CisJc3Bpbl91bmxvY2soICZubC0+bG9jayApOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCitzdGF0aWMgdm9pZAoraGFuZGxlX2NoYW5uZWwoIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ICkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsCSpubCAgICA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nCQlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWludCAgcmVxX2FuczsKKwl1bnNpZ25lZCBjaGFyICBjc3IwOworCisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisJLyogTG9jayB0aGUgbWFzdGVyIGRldmljZSBiZWNhdXNlIHdlIGdvaW5nIHRvIGNoYW5nZSBpdHMgbG9jYWwgZGF0YSAqLworCWlmKCBubC0+c3RhdGUgJiBGTF9TTEFWRSApCisJCXNwaW5fbG9jayggJigoc3RydWN0IG5ldF9sb2NhbCAqKSBubC0+bWFzdGVyLT5wcml2KS0+bG9jayApOworI2VuZGlmCisKKwlvdXRiKCAoaW5iKCBpb2FkZHIgKyBDU1IwICkgJiB+RU5fSU5UKSB8IFRSX1JFUSwgaW9hZGRyICsgQ1NSMCApOworCisJbmwtPnRpbWVyX3RpY2tzID0gQ0hBTkdFX0xFVkVMX1NUQVJUX1RJQ0tTOworCWZvcig7OykgeworCQljc3IwID0gaW5iKCBpb2FkZHIgKyBDU1IwICk7CisJCWlmKCAoIGNzcjAgJiAoUkNfUkRZIHwgVFJfUkRZKSApID09IDAgKQorCQkJYnJlYWs7CisKKwkJcmVxX2FucyA9ICEobmwtPnN0YXRlICYgRkxfUFJFVl9PSyk7CisKKwkJaWYoIGNzcjAgJiBSQ19SRFkgKQorCQkJcmVxX2FucyA9IHJlY3ZfZnJhbWUoIGRldiApOworCisJCS8qCisJCSAqIFRSX1JEWSBhbHdheXMgZXF1YWxzIDEgaGVyZSBiZWNhdXNlIHdlIGhhdmUgb3duZWQgdGhlIG1hcmtlciwKKwkJICogYW5kIHdlIHNldCBUUl9SRVEgd2hlbiBkaXNhYmxlZCBpbnRlcnJ1cHRzCisJCSAqLworCQljc3IwID0gaW5iKCBpb2FkZHIgKyBDU1IwICk7CisJCWlmKCAhKGNzcjAgJiBUUl9SRFkpICB8fCAgKGNzcjAgJiBSQ19SRFkpICkKKwkJCXByaW50ayggS0VSTl9FUlIgIiVzOiBpbnRlcm5hbCBlcnJvciFcbiIsIGRldi0+bmFtZSApOworCisJCS8qIGlmIHN0YXRlICYgRkxfTkVFRF9SRVNFTkQgIT0gMCB0aGVuIHR4X2ZyYW1lbm8gIT0gMCAqLworCQlpZiggcmVxX2FucyAgfHwgIG5sLT50eF9mcmFtZW5vICE9IDAgKQorCQkJc2VuZF9mcmFtZSggZGV2ICk7CisJCWVsc2UKKwkJCS8qIHNlbmQgbWFya2VyIHdpdGhvdXQgYW55IGRhdGEgKi8KKwkJCW91dGIoIGluYiggaW9hZGRyICsgQ1NSMCApICYgflRSX1JFUSwgaW9hZGRyICsgQ1NSMCApOworCX0KKworCW91dGIoIGluYiggaW9hZGRyICsgQ1NSMCApIHwgRU5fSU5ULCBpb2FkZHIgKyBDU1IwICk7CisKKyNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKKwlpZiggbmwtPnN0YXRlICYgRkxfU0xBVkUgKQorCQlzcGluX3VubG9jayggJigoc3RydWN0IG5ldF9sb2NhbCAqKSBubC0+bWFzdGVyLT5wcml2KS0+bG9jayApOworI2VuZGlmCit9CisKKworLyoKKyAqIFJvdXRpbmUgcmV0dXJucyAxIGlmIGl0IG5lZWQgdG8gYWNrbm93ZWxlZGdlIHJlY2VpdmVkIGZyYW1lLgorICogRW1wdHkgZnJhbWUgcmVjZWl2ZWQgd2l0aG91dCBlcnJvcnMgd29uJ3QgYmUgYWNrbm93ZWxlZGdlZC4KKyAqLworCitzdGF0aWMgaW50CityZWN2X2ZyYW1lKCBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sICAgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyAgaW9hZGRyCT0gZGV2LT5iYXNlX2FkZHI7CisKKwl1MzIgIGNyYyA9IENSQzMyX0lOSVRJQUw7CisKKwl1bnNpZ25lZCAgZnJhbWVsZW4sIGZyYW1lbm8sIGFjazsKKwl1bnNpZ25lZCAgaXNfZmlyc3QsIGZyYW1lX29rOworCisJaWYoIGNoZWNrX2ZoZHIoIGlvYWRkciwgJmZyYW1lbGVuLCAmZnJhbWVubywgJmFjaywgJmlzX2ZpcnN0LCAmY3JjICkgKSB7CisJCWZyYW1lX29rID0gZnJhbWVsZW4gPiA0CisJCQk/ICB1cGxvYWRfZGF0YSggZGV2LCBmcmFtZWxlbiwgZnJhbWVubywgaXNfZmlyc3QsIGNyYyApCisJCQk6ICBza2lwX3RhaWwoIGlvYWRkciwgZnJhbWVsZW4sIGNyYyApOworCQlpZiggZnJhbWVfb2sgKQorCQkJaW50ZXJwcmV0X2FjayggZGV2LCBhY2sgKTsKKwl9IGVsc2UKKwkJZnJhbWVfb2sgPSAwOworCisJb3V0YiggaW5iKCBpb2FkZHIgKyBDU1IwICkgXiBDVF9aRVIsIGlvYWRkciArIENTUjAgKTsKKwlpZiggZnJhbWVfb2sgKSB7CisJCW5sLT5zdGF0ZSB8PSBGTF9QUkVWX09LOworCQlpZiggZnJhbWVsZW4gPiA0ICkKKwkJCW5sLT5pbl9zdGF0cy5hbGxfcnhfbnVtYmVyKys7CisJfSBlbHNlCisJCW5sLT5zdGF0ZSAmPSB+RkxfUFJFVl9PSywKKwkJY2hhbmdlX2xldmVsKCBkZXYgKSwKKwkJbmwtPmluX3N0YXRzLmFsbF9yeF9udW1iZXIrKywKKwkJbmwtPmluX3N0YXRzLmJhZF9yeF9udW1iZXIrKzsKKworCXJldHVybiAgIWZyYW1lX29rICB8fCAgZnJhbWVsZW4gPiA0OworfQorCisKK3N0YXRpYyB2b2lkCitzZW5kX2ZyYW1lKCBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sICAgID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCisJdTMyICBjcmMgPSBDUkMzMl9JTklUSUFMOworCisJaWYoIG5sLT5zdGF0ZSAmIEZMX05FRURfUkVTRU5EICkgeworCisJCS8qIGlmIGZyYW1lIHdhcyBzZW5kZWQgYnV0IG5vdCBBQ0snZWQgLSByZXNlbmQgaXQgKi8KKwkJaWYoIG5sLT50cmFuc19lcnJvcnMgKSB7CisJCQktLW5sLT50cmFuc19lcnJvcnM7CisJCQlpZiggbmwtPmZyYW1lbGVuICE9IDAgKQorCQkJCW5sLT5pbl9zdGF0cy5yZXNlbmRfdHhfbnVtYmVyKys7CisJCX0gZWxzZSB7CisJCQkvKiBjYW5ub3QgeG1pdCB3aXRoIG1hbnkgYXR0ZW1wdHMgKi8KKyNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKKwkJCWlmKCAobmwtPnN0YXRlICYgRkxfU0xBVkUpICB8fCAgbmwtPmxpbmsgKQorI2VuZGlmCisJCQlubC0+c3RhdGUgfD0gRkxfTElORV9ET1dOOworCQkJZHJvcF94bWl0X3F1ZXVlKCBkZXYgKTsKKwkJCWdvdG8gIGRvX3NlbmQ7CisJCX0KKwl9IGVsc2UKKwkJbmwtPnRyYW5zX2Vycm9ycyA9IFRSX0VSUk9SX0NPVU5UOworCisJc2VuZF9mcmFtZV9oZWFkZXIoIGRldiwgJmNyYyApOworCW5sLT5zdGF0ZSB8PSBGTF9ORUVEX1JFU0VORDsKKwkvKgorCSAqIEZMX05FRURfUkVTRU5EIHdpbGwgYmUgY2xlYXJlZCBhZnRlciBBQ0ssIGJ1dCBpZiBlbXB0eQorCSAqIGZyYW1lIHNlbmRlZCB0aGVuIGluIHByZXBhcmVfdG9fc2VuZCBuZXh0IGZyYW1lCisJICovCisKKworCWlmKCBubC0+ZnJhbWVsZW4gKSB7CisJCWRvd25sb2FkX2RhdGEoIGRldiwgJmNyYyApOworCQlubC0+aW5fc3RhdHMuYWxsX3R4X251bWJlcisrOworCQlubC0+c3RhdGUgfD0gRkxfV0FJVF9BQ0s7CisJfQorCisJb3V0c2IoIGRldi0+YmFzZV9hZGRyICsgREFULCAodTggKikmY3JjLCBzaXplb2YgY3JjICk7CisKK2RvX3NlbmQ6CisJb3V0YiggaW5iKCBkZXYtPmJhc2VfYWRkciArIENTUjAgKSAmIH5UUl9SRVEsIGRldi0+YmFzZV9hZGRyICsgQ1NSMCApOworCisJaWYoIG5sLT50eF9mcmFtZW5vICkKKwkJLyogbmV4dCBmcmFtZSBleGlzdHMgLSB3ZSByZXF1ZXN0IGNhcmQgdG8gc2VuZCBpdCAqLworCQlvdXRiKCBpbmIoIGRldi0+YmFzZV9hZGRyICsgQ1NSMCApIHwgVFJfUkVRLAorCQkgICAgICBkZXYtPmJhc2VfYWRkciArIENTUjAgKTsKK30KKworCisvKgorICogV3JpdGUgdGhlIGZyYW1lIGRhdGEgaW50byBhZGFwdGVyJ3MgYnVmZmVyIG1lbW9yeSwgYW5kIGNhbGN1bGF0ZSBDUkMuCisgKiBEbyBwYWRkaW5nIGlmIG5lY2Vzc2FyeS4KKyAqLworCitzdGF0aWMgdm9pZAorZG93bmxvYWRfZGF0YSggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYsICB1MzIgICpjcmNfcCApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sICAgID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXN0cnVjdCBza19idWZmICAgICpza2IJID0gbmwtPnR4X2J1Zl9wOworCisJdW5zaWduZWQgIGxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgc2tiLT5sZW4gLSBubC0+b3V0cG9zLCBubC0+ZnJhbWVsZW4pOworCisJb3V0c2IoIGRldi0+YmFzZV9hZGRyICsgREFULCBza2ItPmRhdGEgKyBubC0+b3V0cG9zLCBsZW4gKTsKKwkqY3JjX3AgPSBjYWxjX2NyYzMyKCAqY3JjX3AsIHNrYi0+ZGF0YSArIG5sLT5vdXRwb3MsIGxlbiApOworCisJLyogaWYgcGFja2V0IHRvbyBzaG9ydCB3ZSBzaG91bGQgd3JpdGUgc29tZSBtb3JlIGJ5dGVzIHRvIHBhZCAqLworCWZvciggbGVuID0gbmwtPmZyYW1lbGVuIC0gbGVuOyAgbGVuLS07ICkKKwkJb3V0YiggMCwgZGV2LT5iYXNlX2FkZHIgKyBEQVQgKSwKKwkJKmNyY19wID0gQ1JDMzIoIDAsICpjcmNfcCApOworfQorCisKK3N0YXRpYyBpbnQKK3VwbG9hZF9kYXRhKCBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiwgIHVuc2lnbmVkICBmcmFtZWxlbiwgIHVuc2lnbmVkICBmcmFtZW5vLAorCSAgICAgdW5zaWduZWQgIGlzX2ZpcnN0LCAgdTMyICBjcmMgKQoreworCXN0cnVjdCBuZXRfbG9jYWwgICpubCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKworCWludCAgZnJhbWVfb2s7CisKKwlpZiggaXNfZmlyc3QgKQorCQlubC0+d2FpdF9mcmFtZW5vID0gZnJhbWVubywKKwkJbmwtPmlucHBvcyA9IDA7CisKKwlpZiggbmwtPndhaXRfZnJhbWVubyA9PSBmcmFtZW5vICkgeworCisJCWlmKCBubC0+aW5wcG9zICsgZnJhbWVsZW4gIDw9ICBFVEhFUl9NQVhfTEVOICkKKwkJCWZyYW1lX29rID0gYXBwZW5kX2ZyYW1lX3RvX3BrdCggZGV2LCBmcmFtZWxlbiwgY3JjICk7CisKKwkJLyoKKwkJICogaWYgQ1JDIGlzIHJpZ2h0IGJ1dCBmcmFtZWxlbiBpbmNvcnJlY3QgdGhlbiB0cmFuc21pdHRlcgorCQkgKiBlcnJvciB3YXMgb2NjdXJyZWQuLi4gZHJvcCBlbnRpcmUgcGFja2V0CisJCSAqLworCQllbHNlIGlmKCAoZnJhbWVfb2sgPSBza2lwX3RhaWwoIGRldi0+YmFzZV9hZGRyLCBmcmFtZWxlbiwgY3JjICkpCisJCQkgIT0gMCApCisJCQlubC0+d2FpdF9mcmFtZW5vID0gMCwKKwkJCW5sLT5pbnBwb3MgPSAwLAorI2lmZGVmIENPTkZJR19TQk5JX01VTFRJTElORQorCQkJKChzdHJ1Y3QgbmV0X2xvY2FsICopIG5sLT5tYXN0ZXItPnByaXYpCisJCQkJLT5zdGF0cy5yeF9lcnJvcnMrKywKKwkJCSgoc3RydWN0IG5ldF9sb2NhbCAqKSBubC0+bWFzdGVyLT5wcml2KQorCQkJCS0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycysrOworI2Vsc2UKKwkJCW5sLT5zdGF0cy5yeF9lcnJvcnMrKywKKwkJCW5sLT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzKys7CisjZW5kaWYKKwkJCS8qIG5vdyBza2lwIGFsbCBmcmFtZXMgdW50aWwgaXNfZmlyc3QgIT0gMCAqLworCX0gZWxzZQorCQlmcmFtZV9vayA9IHNraXBfdGFpbCggZGV2LT5iYXNlX2FkZHIsIGZyYW1lbGVuLCBjcmMgKTsKKworCWlmKCBpc19maXJzdCAgJiYgICFmcmFtZV9vayApCisJCS8qCisJCSAqIEZyYW1lIGhhcyBiZWVuIGJyb2tlbiwgYnV0IHdlIGhhZCBhbHJlYWR5IHN0b3JlZAorCQkgKiBpc19maXJzdC4uLiBEcm9wIGVudGlyZSBwYWNrZXQuCisJCSAqLworCQlubC0+d2FpdF9mcmFtZW5vID0gMCwKKyNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKKwkJKChzdHJ1Y3QgbmV0X2xvY2FsICopIG5sLT5tYXN0ZXItPnByaXYpLT5zdGF0cy5yeF9lcnJvcnMrKywKKwkJKChzdHJ1Y3QgbmV0X2xvY2FsICopIG5sLT5tYXN0ZXItPnByaXYpLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisjZWxzZQorCQlubC0+c3RhdHMucnhfZXJyb3JzKyssCisJCW5sLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisjZW5kaWYKKworCXJldHVybiAgZnJhbWVfb2s7Cit9CisKKworc3RhdGljIF9faW5saW5lIHZvaWQKK3NlbmRfY29tcGxldGUoIHN0cnVjdCBuZXRfbG9jYWwgICpubCApCit7CisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisJKChzdHJ1Y3QgbmV0X2xvY2FsICopIG5sLT5tYXN0ZXItPnByaXYpLT5zdGF0cy50eF9wYWNrZXRzKys7CisJKChzdHJ1Y3QgbmV0X2xvY2FsICopIG5sLT5tYXN0ZXItPnByaXYpLT5zdGF0cy50eF9ieXRlcworCQkrPSBubC0+dHhfYnVmX3AtPmxlbjsKKyNlbHNlCisJbmwtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlubC0+c3RhdHMudHhfYnl0ZXMgKz0gbmwtPnR4X2J1Zl9wLT5sZW47CisjZW5kaWYKKwlkZXZfa2ZyZWVfc2tiX2lycSggbmwtPnR4X2J1Zl9wICk7CisKKwlubC0+dHhfYnVmX3AgPSBOVUxMOworCisJbmwtPm91dHBvcyA9IDA7CisJbmwtPnN0YXRlICY9IH4oRkxfV0FJVF9BQ0sgfCBGTF9ORUVEX1JFU0VORCk7CisJbmwtPmZyYW1lbGVuICAgPSAwOworfQorCisKK3N0YXRpYyB2b2lkCitpbnRlcnByZXRfYWNrKCBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiwgIHVuc2lnbmVkICBhY2sgKQoreworCXN0cnVjdCBuZXRfbG9jYWwgICpubCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKworCWlmKCBhY2sgPT0gRlJBTUVfU0VOVF9PSyApIHsKKwkJbmwtPnN0YXRlICY9IH5GTF9ORUVEX1JFU0VORDsKKworCQlpZiggbmwtPnN0YXRlICYgRkxfV0FJVF9BQ0sgKSB7CisJCQlubC0+b3V0cG9zICs9IG5sLT5mcmFtZWxlbjsKKworCQkJaWYoIC0tbmwtPnR4X2ZyYW1lbm8gKQorCQkJCW5sLT5mcmFtZWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkJCSAgIG5sLT5tYXhmcmFtZSwKKwkJCQkJCSAgIG5sLT50eF9idWZfcC0+bGVuIC0gbmwtPm91dHBvcyk7CisJCQllbHNlCisJCQkJc2VuZF9jb21wbGV0ZSggbmwgKSwKKyNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKKwkJCQluZXRpZl93YWtlX3F1ZXVlKCBubC0+bWFzdGVyICk7CisjZWxzZQorCQkJCW5ldGlmX3dha2VfcXVldWUoIGRldiApOworI2VuZGlmCisJCX0KKwl9CisKKwlubC0+c3RhdGUgJj0gfkZMX1dBSVRfQUNLOworfQorCisKKy8qCisgKiBHbHVlIHJlY2VpdmVkIGZyYW1lIHdpdGggcHJldmlvdXMgZnJhZ21lbnRzIG9mIHBhY2tldC4KKyAqIEluZGljYXRlIHBhY2tldCB3aGVuIGxhc3QgZnJhbWUgd291bGQgYmUgYWNjZXB0ZWQuCisgKi8KKworc3RhdGljIGludAorYXBwZW5kX2ZyYW1lX3RvX3BrdCggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYsICB1bnNpZ25lZCAgZnJhbWVsZW4sICB1MzIgIGNyYyApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCisJdTggICpwOworCisJaWYoIG5sLT5pbnBwb3MgKyBmcmFtZWxlbiAgPiAgRVRIRVJfTUFYX0xFTiApCisJCXJldHVybiAgMDsKKworCWlmKCAhbmwtPnJ4X2J1Zl9wICAmJiAgIShubC0+cnhfYnVmX3AgPSBnZXRfcnhfYnVmKCBkZXYgKSkgKQorCQlyZXR1cm4gIDA7CisKKwlwID0gbmwtPnJ4X2J1Zl9wLT5kYXRhICsgbmwtPmlucHBvczsKKwlpbnNiKCBkZXYtPmJhc2VfYWRkciArIERBVCwgcCwgZnJhbWVsZW4gKTsKKwlpZiggY2FsY19jcmMzMiggY3JjLCBwLCBmcmFtZWxlbiApICE9IENSQzMyX1JFTUFJTkRFUiApCisJCXJldHVybiAgMDsKKworCW5sLT5pbnBwb3MgKz0gZnJhbWVsZW4gLSA0OworCWlmKCAtLW5sLT53YWl0X2ZyYW1lbm8gPT0gMCApCQkvKiBsYXN0IGZyYW1lIHJlY2VpdmVkICovCisJCWluZGljYXRlX3BrdCggZGV2ICk7CisKKwlyZXR1cm4gIDE7Cit9CisKKworLyoKKyAqIFByZXBhcmUgdG8gc3RhcnQgb3V0cHV0IG9uIGFkYXB0ZXIuCisgKiBUcmFuc21pdHRlciB3aWxsIGJlIGFjdHVhbGx5IGFjdGl2YXRlZCB3aGVuIG1hcmtlciBpcyBhY2NlcHRlZC4KKyAqLworCitzdGF0aWMgdm9pZAorcHJlcGFyZV90b19zZW5kKCBzdHJ1Y3Qgc2tfYnVmZiAgKnNrYiwgIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ICkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICAqbmwgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisKKwl1bnNpZ25lZCBpbnQgIGxlbjsKKworCS8qIG5sLT50eF9idWZfcCA9PSBOVUxMIGhlcmUhICovCisJaWYoIG5sLT50eF9idWZfcCApCisJCXByaW50ayggS0VSTl9FUlIgIiVzOiBtZW1vcnkgbGVhayFcbiIsIGRldi0+bmFtZSApOworCisJbmwtPm91dHBvcyA9IDA7CisJbmwtPnN0YXRlICY9IH4oRkxfV0FJVF9BQ0sgfCBGTF9ORUVEX1JFU0VORCk7CisKKwlsZW4gPSBza2ItPmxlbjsKKwlpZiggbGVuIDwgU0JOSV9NSU5fTEVOICkKKwkJbGVuID0gU0JOSV9NSU5fTEVOOworCisJbmwtPnR4X2J1Zl9wCT0gc2tiOworCW5sLT50eF9mcmFtZW5vCT0gKGxlbiArIG5sLT5tYXhmcmFtZSAtIDEpIC8gbmwtPm1heGZyYW1lOworCW5sLT5mcmFtZWxlbgk9IGxlbiA8IG5sLT5tYXhmcmFtZSAgPyAgbGVuICA6ICBubC0+bWF4ZnJhbWU7CisKKwlvdXRiKCBpbmIoIGRldi0+YmFzZV9hZGRyICsgQ1NSMCApIHwgVFJfUkVRLCAgZGV2LT5iYXNlX2FkZHIgKyBDU1IwICk7CisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisJbmwtPm1hc3Rlci0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworI2Vsc2UKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyNlbmRpZgorfQorCisKK3N0YXRpYyB2b2lkCitkcm9wX3htaXRfcXVldWUoIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ICkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICAqbmwgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisKKwlpZiggbmwtPnR4X2J1Zl9wICkKKwkJZGV2X2tmcmVlX3NrYl9hbnkoIG5sLT50eF9idWZfcCApLAorCQlubC0+dHhfYnVmX3AgPSBOVUxMLAorI2lmZGVmIENPTkZJR19TQk5JX01VTFRJTElORQorCQkoKHN0cnVjdCBuZXRfbG9jYWwgKikgbmwtPm1hc3Rlci0+cHJpdikKKwkJCS0+c3RhdHMudHhfZXJyb3JzKyssCisJCSgoc3RydWN0IG5ldF9sb2NhbCAqKSBubC0+bWFzdGVyLT5wcml2KQorCQkJLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworI2Vsc2UKKwkJbmwtPnN0YXRzLnR4X2Vycm9ycysrLAorCQlubC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKyNlbmRpZgorCisJbmwtPnR4X2ZyYW1lbm8JPSAwOworCW5sLT5mcmFtZWxlbgk9IDA7CisJbmwtPm91dHBvcwk9IDA7CisJbmwtPnN0YXRlICY9IH4oRkxfV0FJVF9BQ0sgfCBGTF9ORUVEX1JFU0VORCk7CisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisJbmV0aWZfc3RhcnRfcXVldWUoIG5sLT5tYXN0ZXIgKTsKKwlubC0+bWFzdGVyLT50cmFuc19zdGFydCA9IGppZmZpZXM7CisjZWxzZQorCW5ldGlmX3N0YXJ0X3F1ZXVlKCBkZXYgKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyNlbmRpZgorfQorCisKK3N0YXRpYyB2b2lkCitzZW5kX2ZyYW1lX2hlYWRlciggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYsICB1MzIgICpjcmNfcCApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sICA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKworCXUzMiAgY3JjID0gKmNyY19wOworCXUzMiAgbGVuX2ZpZWxkID0gbmwtPmZyYW1lbGVuICsgNjsJLyogQ1JDICsgZnJhbWVubyArIHJlc2VydmVkICovCisJdTggICB2YWx1ZTsKKworCWlmKCBubC0+c3RhdGUgJiBGTF9ORUVEX1JFU0VORCApCisJCWxlbl9maWVsZCB8PSBGUkFNRV9SRVRSWTsJLyogbm9uLWZpcnN0IGF0dGVtcHQuLi4gKi8KKworCWlmKCBubC0+b3V0cG9zID09IDAgKQorCQlsZW5fZmllbGQgfD0gRlJBTUVfRklSU1Q7CisKKwlsZW5fZmllbGQgfD0gKG5sLT5zdGF0ZSAmIEZMX1BSRVZfT0spID8gRlJBTUVfU0VOVF9PSyA6IEZSQU1FX1NFTlRfQkFEOworCW91dGIoIFNCTklfU0lHLCBkZXYtPmJhc2VfYWRkciArIERBVCApOworCisJdmFsdWUgPSAodTgpIGxlbl9maWVsZDsKKwlvdXRiKCB2YWx1ZSwgZGV2LT5iYXNlX2FkZHIgKyBEQVQgKTsKKwljcmMgPSBDUkMzMiggdmFsdWUsIGNyYyApOworCXZhbHVlID0gKHU4KSAobGVuX2ZpZWxkID4+IDgpOworCW91dGIoIHZhbHVlLCBkZXYtPmJhc2VfYWRkciArIERBVCApOworCWNyYyA9IENSQzMyKCB2YWx1ZSwgY3JjICk7CisKKwlvdXRiKCBubC0+dHhfZnJhbWVubywgZGV2LT5iYXNlX2FkZHIgKyBEQVQgKTsKKwljcmMgPSBDUkMzMiggbmwtPnR4X2ZyYW1lbm8sIGNyYyApOworCW91dGIoIDAsIGRldi0+YmFzZV9hZGRyICsgREFUICk7CisJY3JjID0gQ1JDMzIoIDAsIGNyYyApOworCSpjcmNfcCA9IGNyYzsKK30KKworCisvKgorICogaWYgZnJhbWUgdGFpbCBub3QgbmVlZGVkIChpbmNvcnJlY3QgbnVtYmVyIG9yIHJlY2VpdmVkIHR3aWNlKSwKKyAqIGl0IHdvbid0IHN0b3JlLCBidXQgQ1JDIHdpbGwgYmUgY2FsY3VsYXRlZAorICovCisKK3N0YXRpYyBpbnQKK3NraXBfdGFpbCggdW5zaWduZWQgaW50ICBpb2FkZHIsICB1bnNpZ25lZCBpbnQgIHRhaWxfbGVuLCAgdTMyIGNyYyApCit7CisJd2hpbGUoIHRhaWxfbGVuLS0gKQorCQljcmMgPSBDUkMzMiggaW5iKCBpb2FkZHIgKyBEQVQgKSwgY3JjICk7CisKKwlyZXR1cm4gIGNyYyA9PSBDUkMzMl9SRU1BSU5ERVI7Cit9CisKKworLyoKKyAqIFByZWxpbWluYXJ5IGNoZWNrcyBpZiBmcmFtZSBoZWFkZXIgaXMgY29ycmVjdCwgY2FsY3VsYXRlcyBpdHMgQ1JDCisgKiBhbmQgc3BsaXQgaXQgdG8gc2ltcGxlIGZpZWxkcworICovCisKK3N0YXRpYyBpbnQKK2NoZWNrX2ZoZHIoIHUzMiAgaW9hZGRyLCAgdTMyICAqZnJhbWVsZW4sICB1MzIgICpmcmFtZW5vLCAgdTMyICAqYWNrLAorCSAgICB1MzIgICppc19maXJzdCwgIHUzMiAgKmNyY19wICkKK3sKKwl1MzIgIGNyYyA9ICpjcmNfcDsKKwl1OCAgIHZhbHVlOworCisJaWYoIGluYiggaW9hZGRyICsgREFUICkgIT0gU0JOSV9TSUcgKQorCQlyZXR1cm4gIDA7CisKKwl2YWx1ZSA9IGluYiggaW9hZGRyICsgREFUICk7CisJKmZyYW1lbGVuID0gKHUzMil2YWx1ZTsKKwljcmMgPSBDUkMzMiggdmFsdWUsIGNyYyApOworCXZhbHVlID0gaW5iKCBpb2FkZHIgKyBEQVQgKTsKKwkqZnJhbWVsZW4gfD0gKCh1MzIpdmFsdWUpIDw8IDg7CisJY3JjID0gQ1JDMzIoIHZhbHVlLCBjcmMgKTsKKworCSphY2sgPSAqZnJhbWVsZW4gJiBGUkFNRV9BQ0tfTUFTSzsKKwkqaXNfZmlyc3QgPSAoKmZyYW1lbGVuICYgRlJBTUVfRklSU1QpICE9IDA7CisKKwlpZiggKCpmcmFtZWxlbiAmPSBGUkFNRV9MRU5fTUFTSykgPCA2CisJICAgIHx8ICAqZnJhbWVsZW4gPiBTQk5JX01BWF9GUkFNRSAtIDMgKQorCQlyZXR1cm4gIDA7CisKKwl2YWx1ZSA9IGluYiggaW9hZGRyICsgREFUICk7CisJKmZyYW1lbm8gPSAodTMyKXZhbHVlOworCWNyYyA9IENSQzMyKCB2YWx1ZSwgY3JjICk7CisKKwljcmMgPSBDUkMzMiggaW5iKCBpb2FkZHIgKyBEQVQgKSwgY3JjICk7CS8qIHJlc2VydmVkIGJ5dGUgKi8KKwkqZnJhbWVsZW4gLT0gMjsKKworCSpjcmNfcCA9IGNyYzsKKwlyZXR1cm4gIDE7Cit9CisKKworc3RhdGljIHN0cnVjdCBza19idWZmICoKK2dldF9yeF9idWYoIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ICkKK3sKKwkvKiArMiBpcyB0byBjb21wZW5zYXRlIGZvciB0aGUgYWxpZ25tZW50IGZpeHVwIGJlbG93ICovCisJc3RydWN0IHNrX2J1ZmYgICpza2IgPSBkZXZfYWxsb2Nfc2tiKCBFVEhFUl9NQVhfTEVOICsgMiApOworCWlmKCAhc2tiICkKKwkJcmV0dXJuICBOVUxMOworCisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisJc2tiLT5kZXYgPSAoKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2KS0+bWFzdGVyOworI2Vsc2UKKwlza2ItPmRldiA9IGRldjsKKyNlbmRpZgorCXNrYl9yZXNlcnZlKCBza2IsIDIgKTsJCS8qIEFsaWduIElQIG9uIGxvbmd3b3JkIGJvdW5kYXJpZXMgKi8KKwlyZXR1cm4gIHNrYjsKK30KKworCitzdGF0aWMgdm9pZAoraW5kaWNhdGVfcGt0KCBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sICA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAgICAqc2tiID0gbmwtPnJ4X2J1Zl9wOworCisJc2tiX3B1dCggc2tiLCBubC0+aW5wcG9zICk7CisKKyNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoIHNrYiwgbmwtPm1hc3RlciApOworCW5ldGlmX3J4KCBza2IgKTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCSsrKChzdHJ1Y3QgbmV0X2xvY2FsICopIG5sLT5tYXN0ZXItPnByaXYpLT5zdGF0cy5yeF9wYWNrZXRzOworCSgoc3RydWN0IG5ldF9sb2NhbCAqKSBubC0+bWFzdGVyLT5wcml2KS0+c3RhdHMucnhfYnl0ZXMgKz0gbmwtPmlucHBvczsKKyNlbHNlCisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKCBza2IsIGRldiApOworCW5ldGlmX3J4KCBza2IgKTsKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCSsrbmwtPnN0YXRzLnJ4X3BhY2tldHM7CisJbmwtPnN0YXRzLnJ4X2J5dGVzICs9IG5sLT5pbnBwb3M7CisjZW5kaWYKKwlubC0+cnhfYnVmX3AgPSBOVUxMOwkvKiBwcm90b2NvbCBkcml2ZXIgd2lsbCBjbGVhciB0aGlzIHNrX2J1ZmYgKi8KK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogUm91dGluZSBjaGVja3MgcGVyaW9kaWNhbGx5IHdpcmUgYWN0aXZpdHkgYW5kIHJlZ2VuZXJhdGVzIG1hcmtlciBpZgorICogY29ubmVjdCB3YXMgaW5hY3RpdmUgZm9yIGEgbG9uZyB0aW1lLgorICovCisKK3N0YXRpYyB2b2lkCitzYm5pX3dhdGNoZG9nKCB1bnNpZ25lZCBsb25nICBhcmcgKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGFyZzsKKwlzdHJ1Y3QgbmV0X2xvY2FsICAgKm5sICA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCAgKncgICA9ICZubC0+d2F0Y2hkb2c7IAorCXVuc2lnbmVkIGxvbmcJICAgZmxhZ3M7CisJdW5zaWduZWQgY2hhcgkgICBjc3IwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoICZubC0+bG9jaywgZmxhZ3MgKTsKKworCWNzcjAgPSBpbmIoIGRldi0+YmFzZV9hZGRyICsgQ1NSMCApOworCWlmKCBjc3IwICYgUkNfQ0hLICkgeworCisJCWlmKCBubC0+dGltZXJfdGlja3MgKSB7CisJCQlpZiggY3NyMCAmIChSQ19SRFkgfCBCVV9FTVApICkKKwkJCQkvKiByZWNlaXZpbmcgbm90IGFjdGl2ZSAqLworCQkJCW5sLT50aW1lcl90aWNrcy0tOworCQl9IGVsc2UgeworCQkJbmwtPmluX3N0YXRzLnRpbWVvdXRfbnVtYmVyKys7CisJCQlpZiggbmwtPmRlbHRhX3J4bCApCisJCQkJdGltZW91dF9jaGFuZ2VfbGV2ZWwoIGRldiApOworCisJCQlvdXRiKCAqKHVfY2hhciAqKSZubC0+Y3NyMSB8IFBSX1JFUywKKwkJCSAgICAgIGRldi0+YmFzZV9hZGRyICsgQ1NSMSApOworCQkJY3NyMCA9IGluYiggZGV2LT5iYXNlX2FkZHIgKyBDU1IwICk7CisJCX0KKwl9IGVsc2UKKwkJbmwtPnN0YXRlICY9IH5GTF9MSU5FX0RPV047CisKKwlvdXRiKCBjc3IwIHwgUkNfQ0hLLCBkZXYtPmJhc2VfYWRkciArIENTUjAgKTsgCisKKwlpbml0X3RpbWVyKCB3ICk7CisJdy0+ZXhwaXJlcwk9IGppZmZpZXMgKyBTQk5JX1RJTUVPVVQ7CisJdy0+ZGF0YQkJPSBhcmc7CisJdy0+ZnVuY3Rpb24JPSBzYm5pX3dhdGNoZG9nOworCWFkZF90aW1lciggdyApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSggJm5sLT5sb2NrLCBmbGFncyApOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICByeGxfdGFiW10gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwOCwKKwkweDBhLCAweDBjLCAweDBmLCAweDE2LCAweDE4LCAweDFhLCAweDFjLCAweDFmCit9OworCisjZGVmaW5lIFNJWkVfT0ZfVElNRU9VVF9SWExfVEFCIDQKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICB0aW1lb3V0X3J4bF90YWJbXSA9IHsKKwkweDAzLCAweDA1LCAweDA4LCAweDBiCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZAorY2FyZF9zdGFydCggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYgKQoreworCXN0cnVjdCBuZXRfbG9jYWwgICpubCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKworCW5sLT50aW1lcl90aWNrcyA9IENIQU5HRV9MRVZFTF9TVEFSVF9USUNLUzsKKwlubC0+c3RhdGUgJj0gfihGTF9XQUlUX0FDSyB8IEZMX05FRURfUkVTRU5EKTsKKwlubC0+c3RhdGUgfD0gRkxfUFJFVl9PSzsKKworCW5sLT5pbnBwb3MgPSBubC0+b3V0cG9zID0gMDsKKwlubC0+d2FpdF9mcmFtZW5vID0gMDsKKwlubC0+dHhfZnJhbWVubwkgPSAwOworCW5sLT5mcmFtZWxlbgkgPSAwOworCisJb3V0YiggKih1X2NoYXIgKikmbmwtPmNzcjEgfCBQUl9SRVMsIGRldi0+YmFzZV9hZGRyICsgQ1NSMSApOworCW91dGIoIEVOX0lOVCwgZGV2LT5iYXNlX2FkZHIgKyBDU1IwICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFJlY2VpdmUgbGV2ZWwgYXV0by1zZWxlY3Rpb24gKi8KKworc3RhdGljIHZvaWQKK2NoYW5nZV9sZXZlbCggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYgKQoreworCXN0cnVjdCBuZXRfbG9jYWwgICpubCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKworCWlmKCBubC0+ZGVsdGFfcnhsID09IDAgKQkvKiBkbyBub3QgYXV0by1uZWdvdGlhdGUgUnhMICovCisJCXJldHVybjsKKworCWlmKCBubC0+Y3VyX3J4bF9pbmRleCA9PSAwICkKKwkJbmwtPmRlbHRhX3J4bCA9IDE7CisJZWxzZSBpZiggbmwtPmN1cl9yeGxfaW5kZXggPT0gMTUgKQorCQlubC0+ZGVsdGFfcnhsID0gLTE7CisJZWxzZSBpZiggbmwtPmN1cl9yeGxfcmN2ZCA8IG5sLT5wcmV2X3J4bF9yY3ZkICkKKwkJbmwtPmRlbHRhX3J4bCA9IC1ubC0+ZGVsdGFfcnhsOworCisJbmwtPmNzcjEucnhsID0gcnhsX3RhYlsgbmwtPmN1cl9yeGxfaW5kZXggKz0gbmwtPmRlbHRhX3J4bCBdOworCWluYiggZGV2LT5iYXNlX2FkZHIgKyBDU1IwICk7CS8qIG5lZWRzIGZvciBQQ0kgY2FyZHMgKi8KKwlvdXRiKCAqKHU4ICopJm5sLT5jc3IxLCBkZXYtPmJhc2VfYWRkciArIENTUjEgKTsKKworCW5sLT5wcmV2X3J4bF9yY3ZkID0gbmwtPmN1cl9yeGxfcmN2ZDsKKwlubC0+Y3VyX3J4bF9yY3ZkICA9IDA7Cit9CisKKworc3RhdGljIHZvaWQKK3RpbWVvdXRfY2hhbmdlX2xldmVsKCBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCisJbmwtPmN1cl9yeGxfaW5kZXggPSB0aW1lb3V0X3J4bF90YWJbIG5sLT50aW1lb3V0X3J4bCBdOworCWlmKCArK25sLT50aW1lb3V0X3J4bCA+PSA0ICkKKwkJbmwtPnRpbWVvdXRfcnhsID0gMDsKKworCW5sLT5jc3IxLnJ4bCA9IHJ4bF90YWJbIG5sLT5jdXJfcnhsX2luZGV4IF07CisJaW5iKCBkZXYtPmJhc2VfYWRkciArIENTUjAgKTsKKwlvdXRiKCAqKHVuc2lnbmVkIGNoYXIgKikmbmwtPmNzcjEsIGRldi0+YmFzZV9hZGRyICsgQ1NSMSApOworCisJbmwtPnByZXZfcnhsX3JjdmQgPSBubC0+Y3VyX3J4bF9yY3ZkOworCW5sLT5jdXJfcnhsX3JjdmQgID0gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqCU9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuIAorICovCisKK3N0YXRpYyBpbnQKK3Nibmlfb3Blbiggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYgKQoreworCXN0cnVjdCBuZXRfbG9jYWwJKm5sID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXN0cnVjdCB0aW1lcl9saXN0CSp3ICA9ICZubC0+d2F0Y2hkb2c7CisKKwkvKgorCSAqIEZvciBkb3VibGUgSVNBIGFkYXB0ZXJzIHdpdGhpbiAiY29tbW9uIGlycSIgbW9kZSwgd2UgaGF2ZSB0bworCSAqIGRldGVybWluZSB3aGV0aGVyIHByaW1hcnkgb3Igc2Vjb25kYXJ5IGNoYW5uZWwgaXMgaW5pdGlhbGl6ZWQsCisJICogYW5kIHNldCB0aGUgaXJxIGhhbmRsZXIgb25seSBpbiBmaXJzdCBjYXNlLgorCSAqLworCWlmKCBkZXYtPmJhc2VfYWRkciA8IDB4NDAwICkgewkJLyogSVNBIG9ubHkgKi8KKwkJc3RydWN0IG5ldF9kZXZpY2UgICoqcCA9IHNibmlfY2FyZHM7CisJCWZvciggOyAgKnAgICYmICBwIDwgc2JuaV9jYXJkcyArIFNCTklfTUFYX05VTV9DQVJEUzsgICsrcCApCisJCQlpZiggKCpwKS0+aXJxID09IGRldi0+aXJxCisJCQkgICAgJiYgICgoKnApLT5iYXNlX2FkZHIgPT0gZGV2LT5iYXNlX2FkZHIgKyA0CisJCQkJIHx8ICAoKnApLT5iYXNlX2FkZHIgPT0gZGV2LT5iYXNlX2FkZHIgLSA0KQorCQkJICAgICYmICAoKnApLT5mbGFncyAmIElGRl9VUCApIHsKKworCQkJCSgoc3RydWN0IG5ldF9sb2NhbCAqKSAoKCpwKS0+cHJpdikpCisJCQkJCS0+c2Vjb25kID0gZGV2OworCQkJCXByaW50ayggS0VSTl9OT1RJQ0UgIiVzOiB1c2luZyBzaGFyZWQgaXJxICIKKwkJCQkJIndpdGggJXNcbiIsIGRldi0+bmFtZSwgKCpwKS0+bmFtZSApOworCQkJCW5sLT5zdGF0ZSB8PSBGTF9TRUNPTkRBUlk7CisJCQkJZ290byAgaGFuZGxlcl9hdHRhY2hlZDsKKwkJCX0KKwl9CisKKwlpZiggcmVxdWVzdF9pcnEoZGV2LT5pcnEsIHNibmlfaW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpICkgeworCQlwcmludGsoIEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGdldCBJUlEgJWQuXG4iLAorCQkJZGV2LT5uYW1lLCBkZXYtPmlycSApOworCQlyZXR1cm4gIC1FQUdBSU47CisJfQorCitoYW5kbGVyX2F0dGFjaGVkOgorCisJc3Bpbl9sb2NrKCAmbmwtPmxvY2sgKTsKKwltZW1zZXQoICZubC0+c3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykgKTsKKwltZW1zZXQoICZubC0+aW5fc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3Qgc2JuaV9pbl9zdGF0cykgKTsKKworCWNhcmRfc3RhcnQoIGRldiApOworCisJbmV0aWZfc3RhcnRfcXVldWUoIGRldiApOworCisJLyogc2V0IHRpbWVyIHdhdGNoZG9nICovCisJaW5pdF90aW1lciggdyApOworCXctPmV4cGlyZXMJPSBqaWZmaWVzICsgU0JOSV9USU1FT1VUOworCXctPmRhdGEJCT0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKwl3LT5mdW5jdGlvbgk9IHNibmlfd2F0Y2hkb2c7CisJYWRkX3RpbWVyKCB3ICk7CisgICAKKwlzcGluX3VubG9jayggJm5sLT5sb2NrICk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorc2JuaV9jbG9zZSggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYgKQoreworCXN0cnVjdCBuZXRfbG9jYWwgICpubCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKworCWlmKCBubC0+c2Vjb25kICAmJiAgbmwtPnNlY29uZC0+ZmxhZ3MgJiBJRkZfVVAgKSB7CisJCXByaW50ayggS0VSTl9OT1RJQ0UgIlNlY29uZGFyeSBjaGFubmVsICglcykgaXMgYWN0aXZlIVxuIiwKKwkJCW5sLT5zZWNvbmQtPm5hbWUgKTsKKwkJcmV0dXJuICAtRUJVU1k7CisJfQorCisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisJaWYoIG5sLT5zdGF0ZSAmIEZMX1NMQVZFICkKKwkJZW1hbmNpcGF0ZSggZGV2ICk7CisJZWxzZQorCQl3aGlsZSggbmwtPmxpbmsgKQkvKiBpdCdzIG1hc3RlciBkZXZpY2UhICovCisJCQllbWFuY2lwYXRlKCBubC0+bGluayApOworI2VuZGlmCisKKwlzcGluX2xvY2soICZubC0+bG9jayApOworCisJbmwtPnNlY29uZCA9IE5VTEw7CisJZHJvcF94bWl0X3F1ZXVlKCBkZXYgKTsJCisJbmV0aWZfc3RvcF9xdWV1ZSggZGV2ICk7CisgICAKKwlkZWxfdGltZXIoICZubC0+d2F0Y2hkb2cgKTsKKworCW91dGIoIDAsIGRldi0+YmFzZV9hZGRyICsgQ1NSMCApOworCisJaWYoICEobmwtPnN0YXRlICYgRkxfU0VDT05EQVJZKSApCisJCWZyZWVfaXJxKCBkZXYtPmlycSwgZGV2ICk7CisJbmwtPnN0YXRlICY9IEZMX1NFQ09OREFSWTsKKworCXNwaW5fdW5sb2NrKCAmbmwtPmxvY2sgKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorCVZhbGlkIGNvbWJpbmF0aW9ucyBpbiBDU1IwIChmb3IgcHJvYmluZyk6CisKKwlWQUxJRF9ERUNPREVSCTAwMDAsMDAxMSwxMDExLDEwMTAKKworCQkJCSAgICAJOyAwICAgOyAtCisJCQkJVFJfUkVRCTsgMSAgIDsgKworCQkJVFJfUkRZCSAgICAJOyAyICAgOyAtCisJCQlUUl9SRFkJVFJfUkVRCTsgMyAgIDsgKworCQlCVV9FTVAJCSAgICAJOyA0ICAgOyArCisJCUJVX0VNUAkgICAgIAlUUl9SRVEJOyA1ICAgOyArCisJCUJVX0VNUAlUUl9SRFkJICAgIAk7IDYgICA7IC0KKwkJQlVfRU1QCVRSX1JEWQlUUl9SRVEJOyA3ICAgOyArCisJUkNfUkRZIAkJICAgICAJCTsgOCAgIDsgKworCVJDX1JEWQkJCVRSX1JFUQk7IDkgICA7ICsKKwlSQ19SRFkJCVRSX1JEWQkJOyAxMCAgOyAtCisJUkNfUkRZCQlUUl9SRFkJVFJfUkVRCTsgMTEgIDsgLQorCVJDX1JEWQlCVV9FTVAJCQk7IDEyICA7IC0KKwlSQ19SRFkJQlVfRU1QCQlUUl9SRVEJOyAxMyAgOyAtCisJUkNfUkRZCUJVX0VNUAlUUl9SRFkJCTsgMTQgIDsgLQorCVJDX1JEWQlCVV9FTVAJVFJfUkRZCVRSX1JFUQk7IDE1ICA7IC0KKyovCisKKyNkZWZpbmUgVkFMSURfREVDT0RFUiAoMiArIDggKyAweDEwICsgMHgyMCArIDB4ODAgKyAweDEwMCArIDB4MjAwKQorCisKK3N0YXRpYyBpbnQKK3NibmlfY2FyZF9wcm9iZSggdW5zaWduZWQgbG9uZyAgaW9hZGRyICkKK3sKKwl1bnNpZ25lZCBjaGFyICBjc3IwOworCisJY3NyMCA9IGluYiggaW9hZGRyICsgQ1NSMCApOworCWlmKCBjc3IwICE9IDB4ZmYgICYmICBjc3IwICE9IDB4MDAgKSB7CisJCWNzcjAgJj0gfkVOX0lOVDsKKwkJaWYoIGNzcjAgJiBCVV9FTVAgKQorCQkJY3NyMCB8PSBFTl9JTlQ7CisgICAgICAKKwkJaWYoIFZBTElEX0RFQ09ERVIgJiAoMSA8PCAoY3NyMCA+PiA0KSkgKQorCQkJcmV0dXJuICAwOworCX0KKyAgIAorCXJldHVybiAgLUVOT0RFVjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludAorc2JuaV9pb2N0bCggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYsICBzdHJ1Y3QgaWZyZXEgICppZnIsICBpbnQgIGNtZCApCit7CisJc3RydWN0IG5ldF9sb2NhbCAgKm5sID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OyAKKwlzdHJ1Y3Qgc2JuaV9mbGFncyAgZmxhZ3M7CisJaW50ICBlcnJvciA9IDA7CisKKyNpZmRlZiBDT05GSUdfU0JOSV9NVUxUSUxJTkUKKwlzdHJ1Y3QgbmV0X2RldmljZSAgKnNsYXZlX2RldjsKKwljaGFyICBzbGF2ZV9uYW1lWyA4IF07CisjZW5kaWYKKyAgCisJc3dpdGNoKCBjbWQgKSB7CisJY2FzZSAgU0lPQ0RFVkdFVElOU1RBVFMgOgorCQlpZiAoY29weV90b191c2VyKCBpZnItPmlmcl9kYXRhLCAmbmwtPmluX3N0YXRzLAorCQkJCQlzaXplb2Yoc3RydWN0IHNibmlfaW5fc3RhdHMpICkpCisJCQllcnJvciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSAgU0lPQ0RFVlJFU0lOU1RBVFMgOgorCQlpZiggY3VycmVudC0+ZXVpZCAhPSAwICkJLyogcm9vdCBvbmx5ICovCisJCQlyZXR1cm4gIC1FUEVSTTsKKwkJbWVtc2V0KCAmbmwtPmluX3N0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHNibmlfaW5fc3RhdHMpICk7CisJCWJyZWFrOworCisJY2FzZSAgU0lPQ0RFVkdIV1NUQVRFIDoKKwkJZmxhZ3MubWFjX2FkZHIJPSAqKHUzMiAqKShkZXYtPmRldl9hZGRyICsgMyk7CisJCWZsYWdzLnJhdGUJPSBubC0+Y3NyMS5yYXRlOworCQlmbGFncy5zbG93X21vZGUJPSAobmwtPnN0YXRlICYgRkxfU0xPV19NT0RFKSAhPSAwOworCQlmbGFncy5yeGwJPSBubC0+Y3VyX3J4bF9pbmRleDsKKwkJZmxhZ3MuZml4ZWRfcnhsCT0gbmwtPmRlbHRhX3J4bCA9PSAwOworCisJCWlmIChjb3B5X3RvX3VzZXIoIGlmci0+aWZyX2RhdGEsICZmbGFncywgc2l6ZW9mIGZsYWdzICkpCisJCQllcnJvciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSAgU0lPQ0RFVlNIV1NUQVRFIDoKKwkJaWYoIGN1cnJlbnQtPmV1aWQgIT0gMCApCS8qIHJvb3Qgb25seSAqLworCQkJcmV0dXJuICAtRVBFUk07CisKKwkJc3Bpbl9sb2NrKCAmbmwtPmxvY2sgKTsKKwkJZmxhZ3MgPSAqKHN0cnVjdCBzYm5pX2ZsYWdzKikgJmlmci0+aWZyX2lmcnU7CisJCWlmKCBmbGFncy5maXhlZF9yeGwgKQorCQkJbmwtPmRlbHRhX3J4bCA9IDAsCisJCQlubC0+Y3VyX3J4bF9pbmRleCA9IGZsYWdzLnJ4bDsKKwkJZWxzZQorCQkJbmwtPmRlbHRhX3J4bCA9IERFRl9SWExfREVMVEEsCisJCQlubC0+Y3VyX3J4bF9pbmRleCA9IERFRl9SWEw7CisKKwkJbmwtPmNzcjEucnhsID0gcnhsX3RhYlsgbmwtPmN1cl9yeGxfaW5kZXggXTsKKwkJbmwtPmNzcjEucmF0ZSA9IGZsYWdzLnJhdGU7CisJCW91dGIoICoodTggKikmbmwtPmNzcjEgfCBQUl9SRVMsIGRldi0+YmFzZV9hZGRyICsgQ1NSMSApOworCQlzcGluX3VubG9jayggJm5sLT5sb2NrICk7CisJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisKKwljYXNlICBTSU9DREVWRU5TTEFWRSA6CisJCWlmKCBjdXJyZW50LT5ldWlkICE9IDAgKQkvKiByb290IG9ubHkgKi8KKwkJCXJldHVybiAgLUVQRVJNOworCisJCWlmIChjb3B5X2Zyb21fdXNlciggc2xhdmVfbmFtZSwgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mIHNsYXZlX25hbWUgKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzbGF2ZV9kZXYgPSBkZXZfZ2V0X2J5X25hbWUoIHNsYXZlX25hbWUgKTsKKwkJaWYoICFzbGF2ZV9kZXYgIHx8ICAhKHNsYXZlX2Rldi0+ZmxhZ3MgJiBJRkZfVVApICkgeworCQkJcHJpbnRrKCBLRVJOX0VSUiAiJXM6IHRyeWluZyB0byBlbnNsYXZlIG5vbi1hY3RpdmUgIgorCQkJCSJkZXZpY2UgJXNcbiIsIGRldi0+bmFtZSwgc2xhdmVfbmFtZSApOworCQkJcmV0dXJuICAtRVBFUk07CisJCX0KKworCQlyZXR1cm4gIGVuc2xhdmUoIGRldiwgc2xhdmVfZGV2ICk7CisKKwljYXNlICBTSU9DREVWRU1BTlNJUEFURSA6CisJCWlmKCBjdXJyZW50LT5ldWlkICE9IDAgKQkvKiByb290IG9ubHkgKi8KKwkJCXJldHVybiAgLUVQRVJNOworCisJCXJldHVybiAgZW1hbmNpcGF0ZSggZGV2ICk7CisKKyNlbmRpZgkvKiBDT05GSUdfU0JOSV9NVUxUSUxJTkUgKi8KKworCWRlZmF1bHQgOgorCQlyZXR1cm4gIC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiAgZXJyb3I7Cit9CisKKworI2lmZGVmIENPTkZJR19TQk5JX01VTFRJTElORQorCitzdGF0aWMgaW50CitlbnNsYXZlKCBzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiwgIHN0cnVjdCBuZXRfZGV2aWNlICAqc2xhdmVfZGV2ICkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICAqbmwgID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXN0cnVjdCBuZXRfbG9jYWwgICpzbmwgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBzbGF2ZV9kZXYtPnByaXY7CisKKwlpZiggbmwtPnN0YXRlICYgRkxfU0xBVkUgKQkvKiBUaGlzIGlzbid0IG1hc3RlciBvciBmcmVlIGRldmljZSAqLworCQlyZXR1cm4gIC1FQlVTWTsKKworCWlmKCBzbmwtPnN0YXRlICYgRkxfU0xBVkUgKQkvKiBUaGF0IHdhcyBhbHJlYWR5IGVuc2xhdmVkICovCisJCXJldHVybiAgLUVCVVNZOworCisJc3Bpbl9sb2NrKCAmbmwtPmxvY2sgKTsKKwlzcGluX2xvY2soICZzbmwtPmxvY2sgKTsKKworCS8qIGFwcGVuZCB0byBsaXN0ICovCisJc25sLT5saW5rID0gbmwtPmxpbms7CisJbmwtPmxpbmsgID0gc2xhdmVfZGV2OworCXNubC0+bWFzdGVyID0gZGV2OworCXNubC0+c3RhdGUgfD0gRkxfU0xBVkU7CisKKwkvKiBTdW1tYXJ5IHN0YXRpc3RpY3Mgb2YgTXVsdGlMaW5lIG9wZXJhdGlvbiB3aWxsIGJlIHN0b3JlZAorCSAgIGluIG1hc3RlcidzIGNvdW50ZXJzICovCisJbWVtc2V0KCAmc25sLT5zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSApOworCW5ldGlmX3N0b3BfcXVldWUoIHNsYXZlX2RldiApOworCW5ldGlmX3dha2VfcXVldWUoIGRldiApOwkvKiBOb3cgd2UgYXJlIGFibGUgdG8gdHJhbnNtaXQgKi8KKworCXNwaW5fdW5sb2NrKCAmc25sLT5sb2NrICk7CisJc3Bpbl91bmxvY2soICZubC0+bG9jayApOworCXByaW50ayggS0VSTl9OT1RJQ0UgIiVzOiBzbGF2ZSBkZXZpY2UgKCVzKSBhdHRhY2hlZC5cbiIsCisJCWRldi0+bmFtZSwgc2xhdmVfZGV2LT5uYW1lICk7CisJcmV0dXJuICAwOworfQorCisKK3N0YXRpYyBpbnQKK2VtYW5jaXBhdGUoIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ICkKK3sKKwlzdHJ1Y3QgbmV0X2xvY2FsICAgKnNubCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAgKnAgICA9IHNubC0+bWFzdGVyOworCXN0cnVjdCBuZXRfbG9jYWwgICAqbmwgID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgcC0+cHJpdjsKKworCWlmKCAhKHNubC0+c3RhdGUgJiBGTF9TTEFWRSkgKQorCQlyZXR1cm4gIC1FSU5WQUw7CisKKwlzcGluX2xvY2soICZubC0+bG9jayApOworCXNwaW5fbG9jayggJnNubC0+bG9jayApOworCWRyb3BfeG1pdF9xdWV1ZSggZGV2ICk7CisKKwkvKiBleGNsdWRlIGZyb20gbGlzdCAqLworCWZvcig7OykgewkvKiBtdXN0IGJlIGluIGxpc3QgKi8KKwkJc3RydWN0IG5ldF9sb2NhbCAgKnQgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBwLT5wcml2OworCQlpZiggdC0+bGluayA9PSBkZXYgKSB7CisJCQl0LT5saW5rID0gc25sLT5saW5rOworCQkJYnJlYWs7CisJCX0KKwkJcCA9IHQtPmxpbms7CisJfQorCisJc25sLT5saW5rID0gTlVMTDsKKwlzbmwtPm1hc3RlciA9IGRldjsKKwlzbmwtPnN0YXRlICY9IH5GTF9TTEFWRTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKCBkZXYgKTsKKworCXNwaW5fdW5sb2NrKCAmc25sLT5sb2NrICk7CisJc3Bpbl91bmxvY2soICZubC0+bG9jayApOworCisJZGV2X3B1dCggZGV2ICk7CisJcmV0dXJuICAwOworfQorCisjZW5kaWYKKworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgorc2JuaV9nZXRfc3RhdHMoIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2ICkKK3sKKwlyZXR1cm4gICYoKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2KS0+c3RhdHM7Cit9CisKKworc3RhdGljIHZvaWQKK3NldF9tdWx0aWNhc3RfbGlzdCggc3RydWN0IG5ldF9kZXZpY2UgICpkZXYgKQoreworCXJldHVybjsJCS8qIHNibmkgYWx3YXlzIG9wZXJhdGUgaW4gcHJvbWlzY3VvcyBtb2RlICovCit9CisKKworI2lmZGVmIE1PRFVMRQorbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShiYXVkLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KHJ4bCwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShtYWMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0oc2tpcF9wY2lfcHJvYmUsIGJvb2wsIDApOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworaW50Citpbml0X21vZHVsZSggdm9pZCApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgICpkZXY7CisJaW50IGVycjsKKworCXdoaWxlKCBudW0gPCBTQk5JX01BWF9OVU1fQ0FSRFMgKSB7CisJCWRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IG5ldF9sb2NhbCksIAorCQkJCSAgICJzYm5pJWQiLCBzYm5pX2RldnNldHVwKTsKKwkJaWYoICFkZXYpCisJCQlicmVhazsKKworCQlzcHJpbnRmKCBkZXYtPm5hbWUsICJzYm5pJWQiLCBudW0gKTsKKworCQllcnIgPSBzYm5pX2luaXQoZGV2KTsKKwkJaWYgKGVycikgeworCQkJZnJlZV9uZXRkZXYoZGV2KTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYoIHJlZ2lzdGVyX25ldGRldiggZGV2ICkgKSB7CisJCQlyZWxlYXNlX3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIFNCTklfSU9fRVhURU5UICk7CisJCQlmcmVlX25ldGRldiggZGV2ICk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAgKnNibmlfY2FyZHMgID8gIDAgIDogIC1FTk9ERVY7Cit9CisKK3ZvaWQKK2NsZWFudXBfbW9kdWxlKCB2b2lkICkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAgKmRldjsKKwlpbnQgIG51bTsKKworCWZvciggbnVtID0gMDsgIG51bSA8IFNCTklfTUFYX05VTV9DQVJEUzsgICsrbnVtICkKKwkJaWYoIChkZXYgPSBzYm5pX2NhcmRzWyBudW0gXSkgIT0gTlVMTCApIHsKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KCBkZXYgKTsKKwkJCXJlbGVhc2VfcmVnaW9uKCBkZXYtPmJhc2VfYWRkciwgU0JOSV9JT19FWFRFTlQgKTsKKwkJCWZyZWVfbmV0ZGV2KCBkZXYgKTsKKwkJfQorfQorCisjZWxzZQkvKiBNT0RVTEUgKi8KKworc3RhdGljIGludCBfX2luaXQKK3Nibmlfc2V0dXAoIGNoYXIgICpwICkKK3sKKwlpbnQgIG4sIHBhcm07CisKKwlpZiggKnArKyAhPSAnKCcgKQorCQlnb3RvICBiYWRfcGFyYW07CisKKwlmb3IoIG4gPSAwLCBwYXJtID0gMDsgICpwICAmJiAgbiA8IDg7ICkgeworCQkoKmRlc3RbIHBhcm0gXSlbIG4gXSA9IHNpbXBsZV9zdHJ0b2woIHAsICZwLCAwICk7CisJCWlmKCAhKnAgIHx8ICAqcCA9PSAnKScgKQorCQkJcmV0dXJuIDE7CisJCWlmKCAqcCA9PSAnOycgKQorCQkJKytwLCArK24sIHBhcm0gPSAwOworCQllbHNlIGlmKCAqcCsrICE9ICcsJyApCisJCQlicmVhazsKKwkJZWxzZQorCQkJaWYoICsrcGFybSA+PSA1ICkKKwkJCQlicmVhazsKKwl9CitiYWRfcGFyYW06CisJcHJpbnRrKCBLRVJOX0VSUiAiRXJyb3IgaW4gc2JuaSBrZXJuZWwgcGFyYW1ldGVyIVxuIiApOworCXJldHVybiAwOworfQorCitfX3NldHVwKCAic2JuaT0iLCBzYm5pX3NldHVwICk7CisKKyNlbmRpZgkvKiBNT0RVTEUgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIEFTTV9DUkMKKworc3RhdGljIHUzMgorY2FsY19jcmMzMiggdTMyICBjcmMsICB1OCAgKnAsICB1MzIgIGxlbiApCit7CisJcmVnaXN0ZXIgdTMyICBfY3JjOworCV9jcmMgPSBjcmM7CisJCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkieG9ybAklJWVieCwgJSVlYnhcbiIKKwkJIm1vdmwJJTIsICUlZXNpXG4iIAorCQkibW92bAklMywgJSVlY3hcbiIgCisJCSJtb3ZsCSRjcmMzMnRhYiwgJSVlZGlcbiIKKwkJInNocmwJJDIsICUlZWN4XG4iCisJCSJqegkxZlxuIgorCisJCSIuYWxpZ24gNFxuIgorCSIwOlxuIgorCQkibW92YgklJWFsLCAlJWJsXG4iCisJCSJtb3ZsCSglJWVzaSksICUlZWR4XG4iCisJCSJzaHJsCSQ4LCAlJWVheFxuIgorCQkieG9yYgklJWRsLCAlJWJsXG4iCisJCSJzaHJsCSQ4LCAlJWVkeFxuIgorCQkieG9ybAkoJSVlZGksJSVlYngsNCksICUlZWF4XG4iCisKKwkJIm1vdmIJJSVhbCwgJSVibFxuIgorCQkic2hybAkkOCwgJSVlYXhcbiIKKwkJInhvcmIJJSVkbCwgJSVibFxuIgorCQkic2hybAkkOCwgJSVlZHhcbiIKKwkJInhvcmwJKCUlZWRpLCUlZWJ4LDQpLCAlJWVheFxuIgorCisJCSJtb3ZiCSUlYWwsICUlYmxcbiIKKwkJInNocmwJJDgsICUlZWF4XG4iCisJCSJ4b3JiCSUlZGwsICUlYmxcbiIKKwkJIm1vdmIJJSVkaCwgJSVkbFxuIiAKKwkJInhvcmwJKCUlZWRpLCUlZWJ4LDQpLCAlJWVheFxuIgorCisJCSJtb3ZiCSUlYWwsICUlYmxcbiIKKwkJInNocmwJJDgsICUlZWF4XG4iCisJCSJ4b3JiCSUlZGwsICUlYmxcbiIKKwkJImFkZGwJJDQsICUlZXNpXG4iCisJCSJ4b3JsCSglJWVkaSwlJWVieCw0KSwgJSVlYXhcbiIKKworCQkiZGVjbAklJWVjeFxuIgorCQkiam56CTBiXG4iCisKKwkiMTpcbiIKKwkJIm1vdmwJJTMsICUlZWN4XG4iCisJCSJhbmRsCSQzLCAlJWVjeFxuIgorCQkianoJMmZcbiIKKworCQkibW92YgklJWFsLCAlJWJsXG4iCisJCSJzaHJsCSQ4LCAlJWVheFxuIgorCQkieG9yYgkoJSVlc2kpLCAlJWJsXG4iCisJCSJ4b3JsCSglJWVkaSwlJWVieCw0KSwgJSVlYXhcbiIKKworCQkiZGVjbAklJWVjeFxuIgorCQkianoJMmZcbiIKKworCQkibW92YgklJWFsLCAlJWJsXG4iCisJCSJzaHJsCSQ4LCAlJWVheFxuIgorCQkieG9yYgkxKCUlZXNpKSwgJSVibFxuIgorCQkieG9ybAkoJSVlZGksJSVlYngsNCksICUlZWF4XG4iCisKKwkJImRlY2wJJSVlY3hcbiIKKwkJImp6CTJmXG4iCisKKwkJIm1vdmIJJSVhbCwgJSVibFxuIgorCQkic2hybAkkOCwgJSVlYXhcbiIKKwkJInhvcmIJMiglJWVzaSksICUlYmxcbiIKKwkJInhvcmwJKCUlZWRpLCUlZWJ4LDQpLCAlJWVheFxuIgorCSIyOlxuIgorCQk6ICI9YSIgKF9jcmMpCisJCTogIjAiIChfY3JjKSwgImciIChwKSwgImciIChsZW4pCisJCTogImJ4IiwgImN4IiwgImR4IiwgInNpIiwgImRpIgorCSk7CisKKwlyZXR1cm4gIF9jcmM7Cit9CisKKyNlbHNlCS8qIEFTTV9DUkMgKi8KKworc3RhdGljIHUzMgorY2FsY19jcmMzMiggdTMyICBjcmMsICB1OCAgKnAsICB1MzIgIGxlbiApCit7CisJd2hpbGUoIGxlbi0tICkKKwkJY3JjID0gQ1JDMzIoICpwKyssIGNyYyApOworCisJcmV0dXJuICBjcmM7Cit9CisKKyNlbmRpZgkvKiBBU01fQ1JDICovCisKKworc3RhdGljIHUzMiAgY3JjMzJ0YWJbXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpID0geworCTB4RDIwMkVGOEQsICAweEE1MDVERjFCLCAgMHgzQzBDOEVBMSwgIDB4NEIwQkJFMzcsCisJMHhENTZGMkI5NCwgIDB4QTI2ODFCMDIsICAweDNCNjE0QUI4LCAgMHg0QzY2N0EyRSwKKwkweERDRDk2N0JGLCAgMHhBQkRFNTcyOSwgIDB4MzJENzA2OTMsICAweDQ1RDAzNjA1LAorCTB4REJCNEEzQTYsICAweEFDQjM5MzMwLCAgMHgzNUJBQzI4QSwgIDB4NDJCREYyMUMsCisJMHhDRkI1RkZFOSwgIDB4QjhCMkNGN0YsICAweDIxQkI5RUM1LCAgMHg1NkJDQUU1MywKKwkweEM4RDgzQkYwLCAgMHhCRkRGMEI2NiwgIDB4MjZENjVBREMsICAweDUxRDE2QTRBLAorCTB4QzE2RTc3REIsICAweEI2Njk0NzRELCAgMHgyRjYwMTZGNywgIDB4NTg2NzI2NjEsCisJMHhDNjAzQjNDMiwgIDB4QjEwNDgzNTQsICAweDI4MEREMkVFLCAgMHg1RjBBRTI3OCwKKwkweEU5NkNDRjQ1LCAgMHg5RTZCRkZEMywgIDB4MDc2MkFFNjksICAweDcwNjU5RUZGLAorCTB4RUUwMTBCNUMsICAweDk5MDYzQkNBLCAgMHgwMDBGNkE3MCwgIDB4NzcwODVBRTYsCisJMHhFN0I3NDc3NywgIDB4OTBCMDc3RTEsICAweDA5QjkyNjVCLCAgMHg3RUJFMTZDRCwKKwkweEUwREE4MzZFLCAgMHg5N0REQjNGOCwgIDB4MEVENEUyNDIsICAweDc5RDNEMkQ0LAorCTB4RjREQkRGMjEsICAweDgzRENFRkI3LCAgMHgxQUQ1QkUwRCwgIDB4NkREMjhFOUIsCisJMHhGM0I2MUIzOCwgIDB4ODRCMTJCQUUsICAweDFEQjg3QTE0LCAgMHg2QUJGNEE4MiwKKwkweEZBMDA1NzEzLCAgMHg4RDA3Njc4NSwgIDB4MTQwRTM2M0YsICAweDYzMDkwNkE5LAorCTB4RkQ2RDkzMEEsICAweDhBNkFBMzlDLCAgMHgxMzYzRjIyNiwgIDB4NjQ2NEMyQjAsCisJMHhBNERFQUUxRCwgIDB4RDNEOTlFOEIsICAweDRBRDBDRjMxLCAgMHgzREQ3RkZBNywKKwkweEEzQjM2QTA0LCAgMHhENEI0NUE5MiwgIDB4NERCRDBCMjgsICAweDNBQkEzQkJFLAorCTB4QUEwNTI2MkYsICAweEREMDIxNkI5LCAgMHg0NDBCNDcwMywgIDB4MzMwQzc3OTUsCisJMHhBRDY4RTIzNiwgIDB4REE2RkQyQTAsICAweDQzNjY4MzFBLCAgMHgzNDYxQjM4QywKKwkweEI5NjlCRTc5LCAgMHhDRTZFOEVFRiwgIDB4NTc2N0RGNTUsICAweDIwNjBFRkMzLAorCTB4QkUwNDdBNjAsICAweEM5MDM0QUY2LCAgMHg1MDBBMUI0QywgIDB4MjcwRDJCREEsCisJMHhCN0IyMzY0QiwgIDB4QzBCNTA2REQsICAweDU5QkM1NzY3LCAgMHgyRUJCNjdGMSwKKwkweEIwREZGMjUyLCAgMHhDN0Q4QzJDNCwgIDB4NUVEMTkzN0UsICAweDI5RDZBM0U4LAorCTB4OUZCMDhFRDUsICAweEU4QjdCRTQzLCAgMHg3MUJFRUZGOSwgIDB4MDZCOURGNkYsCisJMHg5OERENEFDQywgIDB4RUZEQTdBNUEsICAweDc2RDMyQkUwLCAgMHgwMUQ0MUI3NiwKKwkweDkxNkIwNkU3LCAgMHhFNjZDMzY3MSwgIDB4N0Y2NTY3Q0IsICAweDA4NjI1NzVELAorCTB4OTYwNkMyRkUsICAweEUxMDFGMjY4LCAgMHg3ODA4QTNEMiwgIDB4MEYwRjkzNDQsCisJMHg4MjA3OUVCMSwgIDB4RjUwMEFFMjcsICAweDZDMDlGRjlELCAgMHgxQjBFQ0YwQiwKKwkweDg1NkE1QUE4LCAgMHhGMjZENkEzRSwgIDB4NkI2NDNCODQsICAweDFDNjMwQjEyLAorCTB4OENEQzE2ODMsICAweEZCREIyNjE1LCAgMHg2MkQyNzdBRiwgIDB4MTVENTQ3MzksCisJMHg4QkIxRDI5QSwgIDB4RkNCNkUyMEMsICAweDY1QkZCM0I2LCAgMHgxMkI4ODMyMCwKKwkweDNGQkE2Q0FELCAgMHg0OEJENUMzQiwgIDB4RDFCNDBEODEsICAweEE2QjMzRDE3LAorCTB4MzhEN0E4QjQsICAweDRGRDA5ODIyLCAgMHhENkQ5Qzk5OCwgIDB4QTFERUY5MEUsCisJMHgzMTYxRTQ5RiwgIDB4NDY2NkQ0MDksICAweERGNkY4NUIzLCAgMHhBODY4QjUyNSwKKwkweDM2MEMyMDg2LCAgMHg0MTBCMTAxMCwgIDB4RDgwMjQxQUEsICAweEFGMDU3MTNDLAorCTB4MjIwRDdDQzksICAweDU1MEE0QzVGLCAgMHhDQzAzMURFNSwgIDB4QkIwNDJENzMsCisJMHgyNTYwQjhEMCwgIDB4NTI2Nzg4NDYsICAweENCNkVEOUZDLCAgMHhCQzY5RTk2QSwKKwkweDJDRDZGNEZCLCAgMHg1QkQxQzQ2RCwgIDB4QzJEODk1RDcsICAweEI1REZBNTQxLAorCTB4MkJCQjMwRTIsICAweDVDQkMwMDc0LCAgMHhDNUI1NTFDRSwgIDB4QjJCMjYxNTgsCisJMHgwNEQ0NEM2NSwgIDB4NzNEMzdDRjMsICAweEVBREEyRDQ5LCAgMHg5REREMURERiwKKwkweDAzQjk4ODdDLCAgMHg3NEJFQjhFQSwgIDB4RURCN0U5NTAsICAweDlBQjBEOUM2LAorCTB4MEEwRkM0NTcsICAweDdEMDhGNEMxLCAgMHhFNDAxQTU3QiwgIDB4OTMwNjk1RUQsCisJMHgwRDYyMDA0RSwgIDB4N0E2NTMwRDgsICAweEUzNkM2MTYyLCAgMHg5NDZCNTFGNCwKKwkweDE5NjM1QzAxLCAgMHg2RTY0NkM5NywgIDB4Rjc2RDNEMkQsICAweDgwNkEwREJCLAorCTB4MUUwRTk4MTgsICAweDY5MDlBODhFLCAgMHhGMDAwRjkzNCwgIDB4ODcwN0M5QTIsCisJMHgxN0I4RDQzMywgIDB4NjBCRkU0QTUsICAweEY5QjZCNTFGLCAgMHg4RUIxODU4OSwKKwkweDEwRDUxMDJBLCAgMHg2N0QyMjBCQywgIDB4RkVEQjcxMDYsICAweDg5REM0MTkwLAorCTB4NDk2NjJEM0QsICAweDNFNjExREFCLCAgMHhBNzY4NEMxMSwgIDB4RDA2RjdDODcsCisJMHg0RTBCRTkyNCwgIDB4MzkwQ0Q5QjIsICAweEEwMDU4ODA4LCAgMHhENzAyQjg5RSwKKwkweDQ3QkRBNTBGLCAgMHgzMEJBOTU5OSwgIDB4QTlCM0M0MjMsICAweERFQjRGNEI1LAorCTB4NDBEMDYxMTYsICAweDM3RDc1MTgwLCAgMHhBRURFMDAzQSwgIDB4RDlEOTMwQUMsCisJMHg1NEQxM0Q1OSwgIDB4MjNENjBEQ0YsICAweEJBREY1Qzc1LCAgMHhDREQ4NkNFMywKKwkweDUzQkNGOTQwLCAgMHgyNEJCQzlENiwgIDB4QkRCMjk4NkMsICAweENBQjVBOEZBLAorCTB4NUEwQUI1NkIsICAweDJEMEQ4NUZELCAgMHhCNDA0RDQ0NywgIDB4QzMwM0U0RDEsCisJMHg1RDY3NzE3MiwgIDB4MkE2MDQxRTQsICAweEIzNjkxMDVFLCAgMHhDNDZFMjBDOCwKKwkweDcyMDgwREY1LCAgMHgwNTBGM0Q2MywgIDB4OUMwNjZDRDksICAweEVCMDE1QzRGLAorCTB4NzU2NUM5RUMsICAweDAyNjJGOTdBLCAgMHg5QjZCQThDMCwgIDB4RUM2Qzk4NTYsCisJMHg3Q0QzODVDNywgIDB4MEJENEI1NTEsICAweDkyRERFNEVCLCAgMHhFNURBRDQ3RCwKKwkweDdCQkU0MURFLCAgMHgwQ0I5NzE0OCwgIDB4OTVCMDIwRjIsICAweEUyQjcxMDY0LAorCTB4NkZCRjFEOTEsICAweDE4QjgyRDA3LCAgMHg4MUIxN0NCRCwgIDB4RjZCNjRDMkIsCisJMHg2OEQyRDk4OCwgIDB4MUZENUU5MUUsICAweDg2RENCOEE0LCAgMHhGMURCODgzMiwKKwkweDYxNjQ5NUEzLCAgMHgxNjYzQTUzNSwgIDB4OEY2QUY0OEYsICAweEY4NkRDNDE5LAorCTB4NjYwOTUxQkEsICAweDExMEU2MTJDLCAgMHg4ODA3MzA5NiwgIDB4RkYwMDAwMDAKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zYm5pLmggYi9kcml2ZXJzL25ldC93YW4vc2JuaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NzE1ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vc2JuaS5oCkBAIC0wLDAgKzEsMTQxIEBACisvKiBzYm5pLmg6ICBkZWZpbml0aW9ucyBmb3IgYSBHcmFuY2ggU0JOSTEyIGRyaXZlciwgdmVyc2lvbiA1LjAuMAorICogV3JpdHRlbiAyMDAxIERlbmlzIEkuVGltb2ZlZXYgKHRpbW9mZWV2QGdyYW5jaC5ydSkKKyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdQTAorICovCisKKyNpZm5kZWYgU0JOSV9ICisjZGVmaW5lIFNCTklfSAorCisjaWZkZWYgU0JOSV9ERUJVRworI2RlZmluZSBEUCggQSApIEEKKyNlbHNlCisjZGVmaW5lIERQKCBBICkKKyNlbmRpZgorCisKKy8qIFdlIGRvbid0IGhhdmUgb2ZmaWNpYWwgdmVuZG9yIGlkIHlldC4uLiAqLworI2RlZmluZSBTQk5JX1BDSV9WRU5ET1IgCTB4NTUgCisjZGVmaW5lIFNCTklfUENJX0RFVklDRSAJMHg5ZgorCisjZGVmaW5lIElTQV9NT0RFIDB4MDAKKyNkZWZpbmUgUENJX01PREUgMHgwMQorCisjZGVmaW5lCVNCTklfSU9fRVhURU5UCTQKKworZW51bSBzYm5pX3JlZyB7CisJQ1NSMCA9IDAsCisJQ1NSMSA9IDEsCisJREFUICA9IDIKK307CisKKy8qIENTUjAgbWFwcGluZyAqLworZW51bSB7CisJQlVfRU1QID0gMHgwMiwKKwlSQ19DSEsgPSAweDA0LAorCUNUX1pFUiA9IDB4MDgsCisJVFJfUkVRID0gMHgxMCwKKwlUUl9SRFkgPSAweDIwLAorCUVOX0lOVCA9IDB4NDAsCisJUkNfUkRZID0gMHg4MAorfTsKKworCisvKiBDU1IxIG1hcHBpbmcgKi8KKyNkZWZpbmUgUFJfUkVTIDB4ODAKKworc3RydWN0IHNibmlfY3NyMSB7CisJdW5zaWduZWQgcnhsCTogNTsKKwl1bnNpZ25lZCByYXRlCTogMjsKKwl1bnNpZ25lZCAJOiAxOworfTsKKworLyogZmllbGRzIGluIGZyYW1lIGhlYWRlciAqLworI2RlZmluZSBGUkFNRV9BQ0tfTUFTSyAgKHVuc2lnbmVkIHNob3J0KTB4NzAwMAorI2RlZmluZSBGUkFNRV9MRU5fTUFTSyAgKHVuc2lnbmVkIHNob3J0KTB4MDNGRgorI2RlZmluZSBGUkFNRV9GSVJTVCAgICAgKHVuc2lnbmVkIHNob3J0KTB4ODAwMAorI2RlZmluZSBGUkFNRV9SRVRSWSAgICAgKHVuc2lnbmVkIHNob3J0KTB4MDgwMAorCisjZGVmaW5lIEZSQU1FX1NFTlRfQkFEICAodW5zaWduZWQgc2hvcnQpMHg0MDAwCisjZGVmaW5lIEZSQU1FX1NFTlRfT0sgICAodW5zaWduZWQgc2hvcnQpMHgzMDAwCisKKworLyogc3RhdGUgZmxhZ3MgKi8KK2VudW0geworCUZMX1dBSVRfQUNLICAgID0gMHgwMSwKKwlGTF9ORUVEX1JFU0VORCA9IDB4MDIsCisJRkxfUFJFVl9PSyAgICAgPSAweDA0LAorCUZMX1NMT1dfTU9ERSAgID0gMHgwOCwKKwlGTF9TRUNPTkRBUlkgICA9IDB4MTAsCisjaWZkZWYgQ09ORklHX1NCTklfTVVMVElMSU5FCisJRkxfU0xBVkUgICAgICAgPSAweDIwLAorI2VuZGlmCisJRkxfTElORV9ET1dOICAgPSAweDQwCit9OworCisKK2VudW0geworCURFRkFVTFRfSU9CQVNFQUREUiA9IDB4MjEwLAorCURFRkFVTFRfSU5URVJSVVBUTlVNQkVSID0gNSwKKwlERUZBVUxUX1JBVEUgPSAwLAorCURFRkFVTFRfRlJBTUVfTEVOID0gMTAxMgorfTsKKworI2RlZmluZSBERUZfUlhMX0RFTFRBCS0xCisjZGVmaW5lIERFRl9SWEwJCTB4ZgorCisjZGVmaW5lIFNCTklfU0lHIDB4NWEKKworI2RlZmluZQlTQk5JX01JTl9MRU4JNjAJLyogU2hvcnRlc3QgRXRoZXJuZXQgZnJhbWUgd2l0aG91dCBGQ1MgKi8KKyNkZWZpbmUgU0JOSV9NQVhfRlJBTUUJMTAyMworI2RlZmluZSBFVEhFUl9NQVhfTEVOCTE1MTgKKworI2RlZmluZSBTQk5JX1RJTUVPVVQJKEhaLzEwKQorCisjZGVmaW5lIFRSX0VSUk9SX0NPVU5UCTMyCisjZGVmaW5lIENIQU5HRV9MRVZFTF9TVEFSVF9USUNLUyA0CisKKyNkZWZpbmUgU0JOSV9NQVhfTlVNX0NBUkRTCTE2CisKKy8qIGludGVybmFsIFNCTkktc3BlY2lmaWMgc3RhdGlzdGljcyAqLworc3RydWN0IHNibmlfaW5fc3RhdHMgeworCXUzMglhbGxfcnhfbnVtYmVyOworCXUzMgliYWRfcnhfbnVtYmVyOworCXUzMgl0aW1lb3V0X251bWJlcjsKKwl1MzIJYWxsX3R4X251bWJlcjsKKwl1MzIJcmVzZW5kX3R4X251bWJlcjsKK307CisKKy8qIFNCTkkgaW9jdGwgcGFyYW1zICovCisjZGVmaW5lIFNJT0NERVZHRVRJTlNUQVRTIAlTSU9DREVWUFJJVkFURQorI2RlZmluZSBTSU9DREVWUkVTSU5TVEFUUyAJU0lPQ0RFVlBSSVZBVEUrMQorI2RlZmluZSBTSU9DREVWR0hXU1RBVEUgICAJU0lPQ0RFVlBSSVZBVEUrMgorI2RlZmluZSBTSU9DREVWU0hXU1RBVEUgICAJU0lPQ0RFVlBSSVZBVEUrMworI2RlZmluZSBTSU9DREVWRU5TTEFWRSAgCVNJT0NERVZQUklWQVRFKzQKKyNkZWZpbmUgU0lPQ0RFVkVNQU5TSVBBVEUgIAlTSU9DREVWUFJJVkFURSs1CisKKworLyogZGF0YSBwYWNrZXQgZm9yIFNJT0NERVZHSFdTVEFURS9TSU9DREVWU0hXU1RBVEUgaW9jdGwgcmVxdWVzdHMgKi8KK3N0cnVjdCBzYm5pX2ZsYWdzIHsKKwl1MzIJcnhsCQk6IDQ7CisJdTMyCXJhdGUJCTogMjsKKwl1MzIJZml4ZWRfcnhsCTogMTsKKwl1MzIJc2xvd19tb2RlCTogMTsKKwl1MzIJbWFjX2FkZHIJOiAyNDsKK307CisKKy8qCisgKiBDUkMtMzIgc3R1ZmYKKyAqLworI2RlZmluZSBDUkMzMihjLGNyYykgKGNyYzMydGFiWygoc2l6ZV90KShjcmMpIF4gKGMpKSAmIDB4ZmZdIF4gKCgoY3JjKSA+PiA4KSAmIDB4MDBGRkZGRkYpKQorICAgICAgLyogQ1JDIGdlbmVyYXRvciAweEVEQjg4MzIwICovCisgICAgICAvKiBDUkMgcmVtYWluZGVyIDB4MjE0NERGMUMgKi8KKyAgICAgIC8qIENSQyBpbml0aWFsIHZhbHVlIDB4MDAwMDAwMDAgKi8KKyNkZWZpbmUgQ1JDMzJfUkVNQUlOREVSIDB4MjE0NERGMUMKKyNkZWZpbmUgQ1JDMzJfSU5JVElBTCAweDAwMDAwMDAwCisKKyNpZm5kZWYgX19pbml0ZGF0YQorI2RlZmluZSBfX2luaXRkYXRhCisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zZGxhLmMgYi9kcml2ZXJzL25ldC93YW4vc2RsYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYzlhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vc2RsYS5jCkBAIC0wLDAgKzEsMTY3NiBAQAorLyoKKyAqIFNETEEJCUFuIGltcGxlbWVudGF0aW9uIG9mIGEgZHJpdmVyIGZvciB0aGUgU2FuZ29tYSBTNTAyL1M1MDggc2VyaWVzCisgKgkJbXVsdGktcHJvdG9jb2wgUEMgaW50ZXJmYWNlIGNhcmQuICBJbml0aWFsIG9mZmVyaW5nIGlzIHdpdGggCisgKgkJdGhlIERMQ0kgZHJpdmVyLCBwcm92aWRpbmcgRnJhbWUgUmVsYXkgc3VwcG9ydCBmb3IgbGludXguCisgKgorICoJCUdsb2JhbCBkZWZpbml0aW9ucyBmb3IgdGhlIEZyYW1lIHJlbGF5IGludGVyZmFjZS4KKyAqCisgKiBWZXJzaW9uOglAKCMpc2RsYS5jICAgMC4zMAkxMiBTZXAgMTk5NgorICoKKyAqIENyZWRpdHM6CVNhbmdvbWEgVGVjaG5vbG9naWVzLCBmb3IgdGhlIHVzZSBvZiAyIGNhcmRzIGZvciBhbiBleHRlbmRlZAorICoJCQlwZXJpb2Qgb2YgdGltZS4KKyAqCQlEYXZpZCBNYW5kZWxzdGFtIDxkbUBzYW5nb21hLmNvbT4gZm9yIGdldHRpbmcgbWUgc3RhcnRlZCBvbiAKKyAqCQkJdGhpcyBwcm9qZWN0LCBhbmQgaW5jZW50aXZlIHRvIGNvbXBsZXRlIGl0LgorICoJCUdlbmUgS296ZW4gPDc0NjA0LjE1MkBjb21wdXNlcnZlLmNvbT4gZm9yIHByb3ZpZGluZyBtZSB3aXRoCisgKgkJCWltcG9ydGFudCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2FyZHMuCisgKgorICogQXV0aG9yOglNaWtlIE1jTGFnYW4gPG1pa2UubWNsYWdhbkBsaW51eC5vcmc+CisgKgorICogQ2hhbmdlczoKKyAqCQkwLjE1CU1pa2UgTWNMYWdhbglJbXByb3ZlZCBlcnJvciBoYW5kbGluZywgcGFja2V0IGRyb3BwaW5nCisgKgkJMC4yMAlNaWtlIE1jTGFnYW4JTmV3IHRyYW5zbWl0L3JlY2VpdmUgZmxhZ3MgZm9yIGNvbmZpZworICoJCQkJCUlmIGluIEZSIG1vZGUsIGRvbid0IGFjY2VwdCBwYWNrZXRzIGZyb20KKyAqCQkJCQlub24gRExDSSBkZXZpY2VzLgorICoJCTAuMjUJTWlrZSBNY0xhZ2FuCUZpeGVkIHByb2JsZW0gd2l0aCByZWplY3RpbmcgcGFja2V0cworICoJCQkJCWZyb20gbm9uIERMQ0kgZGV2aWNlcy4KKyAqCQkwLjMwCU1pa2UgTWNMYWdhbglGaXhlZCBrZXJuZWwgcGFuaWMgd2hlbiB1c2VkIHdpdGggbW9kaWZpZWQKKyAqCQkJCQlpZmNvbmZpZworICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4gLyogZm9yIENPTkZJR19ETENJX01BWCAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2ZyYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZGxhLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0YXRpYyBjb25zdCBjaGFyKiB2ZXJzaW9uID0gIlNETEEgZHJpdmVyIHYwLjMwLCAxMiBTZXAgMTk5NiwgbWlrZS5tY2xhZ2FuQGxpbnV4Lm9yZyI7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmFsaWRfcG9ydFtdIF9faW5pdGRhdGEgPSB7IDB4MjUwLCAweDI3MCwgMHgyODAsIDB4MzAwLCAweDM1MCwgMHgzNjAsIDB4MzgwLCAweDM5MH07CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmFsaWRfbWVtW10gIF9faW5pdGRhdGEgPSB7CisJCQkJICAgIDB4QTAwMDAsIDB4QTIwMDAsIDB4QTQwMDAsIDB4QTYwMDAsIDB4QTgwMDAsIDB4QUEwMDAsIDB4QUMwMDAsIDB4QUUwMDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCMDAwMCwgMHhCMjAwMCwgMHhCNDAwMCwgMHhCNjAwMCwgMHhCODAwMCwgMHhCQTAwMCwgMHhCQzAwMCwgMHhCRTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QzAwMDAsIDB4QzIwMDAsIDB4QzQwMDAsIDB4QzYwMDAsIDB4QzgwMDAsIDB4Q0EwMDAsIDB4Q0MwMDAsIDB4Q0UwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEQwMDAwLCAweEQyMDAwLCAweEQ0MDAwLCAweEQ2MDAwLCAweEQ4MDAwLCAweERBMDAwLCAweERDMDAwLCAweERFMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFMDAwMCwgMHhFMjAwMCwgMHhFNDAwMCwgMHhFNjAwMCwgMHhFODAwMCwgMHhFQTAwMCwgMHhFQzAwMCwgMHhFRTAwMH07IAorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNkbGFfbG9jayk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0aGVzZSBhcmUgdGhlIGNvcmUgcm91dGluZXMgdGhhdCBhY2Nlc3MgdGhlIGNhcmQgaXRzZWxmIAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU0RMQV9XSU5ET1coZGV2LGFkZHIpIG91dGIoKCgoYWRkcikgPj4gMTMpICYgMHgxRiksIChkZXYpLT5iYXNlX2FkZHIgKyBTRExBX1JFR19aODBfV0lORE9XKQorCitzdGF0aWMgdm9pZCBfX3NkbGFfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYWRkciwgdm9pZCAqYnVmLCBzaG9ydCBsZW4pCit7CisJY2hhciAgICAgICAgICAqdGVtcDsKKwljb25zdCB2b2lkICAgICpiYXNlOworCWludCAgICAgICAgICAgb2Zmc2V0LCBieXRlczsKKworCXRlbXAgPSBidWY7CisJd2hpbGUobGVuKQorCXsJCisJCW9mZnNldCA9IGFkZHIgJiBTRExBX0FERFJfTUFTSzsKKwkJYnl0ZXMgPSBvZmZzZXQgKyBsZW4gPiBTRExBX1dJTkRPV19TSVpFID8gU0RMQV9XSU5ET1dfU0laRSAtIG9mZnNldCA6IGxlbjsKKwkJYmFzZSA9IChjb25zdCB2b2lkICopIChkZXYtPm1lbV9zdGFydCArIG9mZnNldCk7CisKKwkJU0RMQV9XSU5ET1coZGV2LCBhZGRyKTsKKwkJbWVtY3B5KHRlbXAsIGJhc2UsIGJ5dGVzKTsKKworCQlhZGRyICs9IGJ5dGVzOworCQl0ZW1wICs9IGJ5dGVzOworCQlsZW4gIC09IGJ5dGVzOworCX0gIAorfQorCitzdGF0aWMgdm9pZCBzZGxhX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFkZHIsIHZvaWQgKmJ1Ziwgc2hvcnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNkbGFfbG9jaywgZmxhZ3MpOworCV9fc2RsYV9yZWFkKGRldiwgYWRkciwgYnVmLCBsZW4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkbGFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBfX3NkbGFfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFkZHIsIAorCQkJIGNvbnN0IHZvaWQgKmJ1Ziwgc2hvcnQgbGVuKQoreworCWNvbnN0IGNoYXIgICAgKnRlbXA7CisJdm9pZCAJICAgICAgKmJhc2U7CisJaW50ICAgICAgICAgICBvZmZzZXQsIGJ5dGVzOworCisJdGVtcCA9IGJ1ZjsKKwl3aGlsZShsZW4pCisJeworCQlvZmZzZXQgPSBhZGRyICYgU0RMQV9BRERSX01BU0s7CisJCWJ5dGVzID0gb2Zmc2V0ICsgbGVuID4gU0RMQV9XSU5ET1dfU0laRSA/IFNETEFfV0lORE9XX1NJWkUgLSBvZmZzZXQgOiBsZW47CisJCWJhc2UgPSAodm9pZCAqKSAoZGV2LT5tZW1fc3RhcnQgKyBvZmZzZXQpOworCisJCVNETEFfV0lORE9XKGRldiwgYWRkcik7CisJCW1lbWNweShiYXNlLCB0ZW1wLCBieXRlcyk7CisKKwkJYWRkciArPSBieXRlczsKKwkJdGVtcCArPSBieXRlczsKKwkJbGVuICAtPSBieXRlczsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNkbGFfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFkZHIsIAorCQkgICAgICAgY29uc3Qgdm9pZCAqYnVmLCBzaG9ydCBsZW4pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZGxhX2xvY2ssIGZsYWdzKTsKKwlfX3NkbGFfd3JpdGUoZGV2LCBhZGRyLCBidWYsIGxlbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RsYV9sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgc2RsYV9jbGVhcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY2hhciAgICAgICAgICAqYmFzZTsKKwlpbnQgICAgICAgICAgIGxlbiwgYWRkciwgYnl0ZXM7CisKKwlsZW4gPSA2NTUzNjsJCisJYWRkciA9IDA7CisJYnl0ZXMgPSBTRExBX1dJTkRPV19TSVpFOworCWJhc2UgPSAodm9pZCAqKSBkZXYtPm1lbV9zdGFydDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZGxhX2xvY2ssIGZsYWdzKTsKKwl3aGlsZShsZW4pCisJeworCQlTRExBX1dJTkRPVyhkZXYsIGFkZHIpOworCQltZW1zZXQoYmFzZSwgMCwgYnl0ZXMpOworCisJCWFkZHIgKz0gYnl0ZXM7CisJCWxlbiAgLT0gYnl0ZXM7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkbGFfbG9jaywgZmxhZ3MpOworCit9CisKK3N0YXRpYyBjaGFyIHNkbGFfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNoYXIgICAgICAgICAgYnl0ZSwgKnRlbXA7CisKKwl0ZW1wID0gKHZvaWQgKikgKGRldi0+bWVtX3N0YXJ0ICsgKGFkZHIgJiBTRExBX0FERFJfTUFTSykpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNkbGFfbG9jaywgZmxhZ3MpOworCVNETEFfV0lORE9XKGRldiwgYWRkcik7CisJYnl0ZSA9ICp0ZW1wOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkbGFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuKGJ5dGUpOworfQorCit2b2lkIHNkbGFfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmcmFkX2xvY2FsICpmbHA7CisKKwlmbHAgPSBkZXYtPnByaXY7CisJc3dpdGNoKGZscC0+dHlwZSkKKwl7CisJCWNhc2UgU0RMQV9TNTAyQToKKwkJCW91dGIoU0RMQV9TNTAyQV9IQUxULCBkZXYtPmJhc2VfYWRkciArIFNETEFfUkVHX0NPTlRST0wpOworCQkJZmxwLT5zdGF0ZSA9IFNETEFfSEFMVDsKKwkJCWJyZWFrOworCQljYXNlIFNETEFfUzUwMkU6CisJCQlvdXRiKFNETEFfSEFMVCwgZGV2LT5iYXNlX2FkZHIgKyBTRExBX1JFR19aODBfQ09OVFJPTCk7CisJCQlvdXRiKFNETEFfUzUwMkVfRU5BQkxFLCBkZXYtPmJhc2VfYWRkciArIFNETEFfUkVHX0NPTlRST0wpOworCQkJZmxwLT5zdGF0ZSA9IFNETEFfUzUwMkVfRU5BQkxFOworCQkJYnJlYWs7CisJCWNhc2UgU0RMQV9TNTA3OgorCQkJZmxwLT5zdGF0ZSAmPSB+U0RMQV9DUFVFTjsKKwkJCW91dGIoZmxwLT5zdGF0ZSwgZGV2LT5iYXNlX2FkZHIgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJCWJyZWFrOworCQljYXNlIFNETEFfUzUwODoKKwkJCWZscC0+c3RhdGUgJj0gflNETEFfQ1BVRU47CisJCQlvdXRiKGZscC0+c3RhdGUsIGRldi0+YmFzZV9hZGRyICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgc2RsYV9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBmcmFkX2xvY2FsICpmbHA7CisKKwlmbHAgPSBkZXYtPnByaXY7CisJc3dpdGNoKGZscC0+dHlwZSkKKwl7CisJCWNhc2UgU0RMQV9TNTAyQToKKwkJCW91dGIoU0RMQV9TNTAyQV9OTUksIGRldi0+YmFzZV9hZGRyICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQlvdXRiKFNETEFfUzUwMkFfU1RBUlQsIGRldi0+YmFzZV9hZGRyICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQlmbHAtPnN0YXRlID0gU0RMQV9TNTAyQV9TVEFSVDsKKwkJCWJyZWFrOworCQljYXNlIFNETEFfUzUwMkU6CisJCQlvdXRiKFNETEFfUzUwMkVfQ1BVRU4sIGRldi0+YmFzZV9hZGRyICsgU0RMQV9SRUdfWjgwX0NPTlRST0wpOworCQkJb3V0YigweDAwLCBkZXYtPmJhc2VfYWRkciArIFNETEFfUkVHX0NPTlRST0wpOworCQkJZmxwLT5zdGF0ZSA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBTRExBX1M1MDc6CisJCQlmbHAtPnN0YXRlIHw9IFNETEFfQ1BVRU47CisJCQlvdXRiKGZscC0+c3RhdGUsIGRldi0+YmFzZV9hZGRyICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQlicmVhazsKKwkJY2FzZSBTRExBX1M1MDg6CisJCQlmbHAtPnN0YXRlIHw9IFNETEFfQ1BVRU47CisJCQlvdXRiKGZscC0+c3RhdGUsIGRldi0+YmFzZV9hZGRyICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQlicmVhazsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdGhpcyBpcyB1c2VkIGZvciB0aGUgUzUwMkEvRSBjYXJkcyB0byBkZXRlcm1pbmUKKyAqIHRoZSBzcGVlZCBvZiB0aGUgb25ib2FyZCBDUFUuICBDYWxpYnJhdGlvbiBpcworICogbmVjZXNzYXJ5IGZvciB0aGUgRnJhbWUgUmVsYXkgY29kZSB1cGxvYWRlZCAKKyAqIGxhdGVyLiAgSW5jb3JyZWN0IHJlc3VsdHMgY2F1c2UgdGltaW5nIHByb2JsZW1zCisgKiB3aXRoIGxpbmsgY2hlY2tzICYgc3RhdHVzIG1lc3NhZ2VzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IHNkbGFfejgwX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHo4MF9hZGRyLCBpbnQgamlmZnMsIGNoYXIgcmVzcDEsIGNoYXIgcmVzcDIpCit7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgZG9uZSwgbm93OworCWNoYXIgICAgICAgICAgcmVzcCwgKnRlbXA7CisKKwlzdGFydCA9IG5vdyA9IGppZmZpZXM7CisJZG9uZSA9IGppZmZpZXMgKyBqaWZmczsKKworCXRlbXAgPSAodm9pZCAqKWRldi0+bWVtX3N0YXJ0OworCXRlbXAgKz0gejgwX2FkZHIgJiBTRExBX0FERFJfTUFTSzsKKwkKKwlyZXNwID0gfnJlc3AxOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBkb25lKSAmJiAocmVzcCAhPSByZXNwMSkgJiYgKCFyZXNwMiB8fCAocmVzcCAhPSByZXNwMikpKQorCXsKKwkJaWYgKGppZmZpZXMgIT0gbm93KQorCQl7CisJCQlTRExBX1dJTkRPVyhkZXYsIHo4MF9hZGRyKTsKKwkJCW5vdyA9IGppZmZpZXM7CisJCQlyZXNwID0gKnRlbXA7CisJCX0KKwl9CisJcmV0dXJuKHRpbWVfYmVmb3JlKGppZmZpZXMsIGRvbmUpID8gamlmZmllcyAtIHN0YXJ0IDogLTEpOworfQorCisvKiBjb25zdGFudHMgZm9yIFo4MCBDUFUgc3BlZWQgKi8KKyNkZWZpbmUgWjgwX1JFQURZIAkJJzEnCS8qIFo4MCBpcyByZWFkeSB0byBiZWdpbiAqLworI2RlZmluZSBMT0FERVJfUkVBRFkgCQknMicJLyogZHJpdmVyIGlzIHJlYWR5IHRvIGJlZ2luICovCisjZGVmaW5lIFo4MF9TQ0NfT0sgCQknMycJLyogU0NDIGlzIG9uIGJvYXJkICovCisjZGVmaW5lIFo4MF9TQ0NfQkFECSAJJzQnCS8qIFNDQyB3YXMgbm90IGZvdW5kICovCisKK3N0YXRpYyBpbnQgc2RsYV9jcHVzcGVlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmcikKK3sKKwlpbnQgIGppZmZzOworCWNoYXIgZGF0YTsKKworCXNkbGFfc3RhcnQoZGV2KTsKKwlpZiAoc2RsYV96ODBfcG9sbChkZXYsIDAsIDMqSFosIFo4MF9SRUFEWSwgMCkgPCAwKQorCQlyZXR1cm4oLUVJTyk7CisKKwlkYXRhID0gTE9BREVSX1JFQURZOworCXNkbGFfd3JpdGUoZGV2LCAwLCAmZGF0YSwgMSk7CisKKwlpZiAoKGppZmZzID0gc2RsYV96ODBfcG9sbChkZXYsIDAsIDgqSFosIFo4MF9TQ0NfT0ssIFo4MF9TQ0NfQkFEKSkgPCAwKQorCQlyZXR1cm4oLUVJTyk7CisKKwlzZGxhX3N0b3AoZGV2KTsKKwlzZGxhX3JlYWQoZGV2LCAwLCAmZGF0YSwgMSk7CisKKwlpZiAoZGF0YSA9PSBaODBfU0NDX0JBRCkKKwl7CisJCXByaW50aygiJXM6IFNDQyBiYWRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybigtRUlPKTsKKwl9CisKKwlpZiAoZGF0YSAhPSBaODBfU0NDX09LKQorCQlyZXR1cm4oLUVJTlZBTCk7CisKKwlpZiAoamlmZnMgPCAxNjUpCisJCWlmci0+aWZyX210dSA9IFNETEFfQ1BVXzE2TTsKKwllbHNlIGlmIChqaWZmcyA8IDIyMCkKKwkJaWZyLT5pZnJfbXR1ID0gU0RMQV9DUFVfMTBNOworCWVsc2UgaWYgKGppZmZzIDwgMjU4KQorCQlpZnItPmlmcl9tdHUgPSBTRExBX0NQVV84TTsKKwllbHNlIGlmIChqaWZmcyA8IDM1NykKKwkJaWZyLT5pZnJfbXR1ID0gU0RMQV9DUFVfN007CisJZWxzZSBpZiAoamlmZnMgPCA0NjcpCisJCWlmci0+aWZyX210dSA9IFNETEFfQ1BVXzVNOworCWVsc2UKKwkJaWZyLT5pZnJfbXR1ID0gU0RMQV9DUFVfM007CisgCisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIERpcmVjdCBpbnRlcmFjdGlvbiB3aXRoIHRoZSBGcmFtZSBSZWxheSBjb2RlIAorICogIHN0YXJ0cyBoZXJlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBfZGxjaV9zdGF0IAoreworCXNob3J0IGRsY2kJCV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCWNoYXIgIGZsYWdzCQlfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK307CisKK3N0cnVjdCBfZnJhZF9zdGF0IAoreworCWNoYXIgICAgZmxhZ3M7CisJc3RydWN0IF9kbGNpX3N0YXQgZGxjaXNbU0RMQV9NQVhfRExDSV07Cit9OworCitzdGF0aWMgdm9pZCBzZGxhX2Vycm9ycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY21kLCBpbnQgZGxjaSwgaW50IHJldCwgaW50IGxlbiwgdm9pZCAqZGF0YSkgCit7CisJc3RydWN0IF9kbGNpX3N0YXQgKnBzdGF0dXM7CisJc2hvcnQgICAgICAgICAgICAgKnBkbGNpOworCWludCAgICAgICAgICAgICAgIGk7CisJY2hhciAgICAgICAgICAgICAgKnN0YXRlLCBsaW5lWzMwXTsKKworCXN3aXRjaCAocmV0KQorCXsKKwkJY2FzZSBTRExBX1JFVF9NT0RFTToKKwkJCXN0YXRlID0gZGF0YTsKKwkJCWlmICgqc3RhdGUgJiBTRExBX01PREVNX0RDRF9MT1cpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1vZGVtIERDRCB1bmV4cGVjdGVkbHkgbG93IVxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmICgqc3RhdGUgJiBTRExBX01PREVNX0NUU19MT1cpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1vZGVtIENUUyB1bmV4cGVjdGVkbHkgbG93IVxuIiwgZGV2LT5uYW1lKTsKKwkJCS8qIEkgc2hvdWxkIHByb2JhYmx5IGRvIHNvbWV0aGluZyBhYm91dCB0aGlzISAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBTRExBX1JFVF9DSEFOTkVMX09GRjoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDaGFubmVsIGJlY2FtZSBpbm9wZXJhdGl2ZSFcbiIsIGRldi0+bmFtZSk7CisJCQkvKiBzYW1lIGhlcmUgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgU0RMQV9SRVRfQ0hBTk5FTF9PTjoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDaGFubmVsIGJlY2FtZSBvcGVyYXRpdmUhXG4iLCBkZXYtPm5hbWUpOworCQkJLyogc2FtZSBoZXJlICovCisJCQlicmVhazsKKworCQljYXNlIFNETEFfUkVUX0RMQ0lfU1RBVFVTOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN0YXR1cyBjaGFuZ2UgcmVwb3J0ZWQgYnkgQWNjZXNzIE5vZGUuXG4iLCBkZXYtPm5hbWUpOworCQkJbGVuIC89IHNpemVvZihzdHJ1Y3QgX2RsY2lfc3RhdCk7CisJCQlmb3IocHN0YXR1cyA9IGRhdGEsIGk9MDtpIDwgbGVuO2krKyxwc3RhdHVzKyspCisJCQl7CisJCQkJaWYgKHBzdGF0dXMtPmZsYWdzICYgU0RMQV9ETENJX05FVykKKwkJCQkJc3RhdGUgPSAibmV3IjsKKwkJCQllbHNlIGlmIChwc3RhdHVzLT5mbGFncyAmIFNETEFfRExDSV9ERUxFVEVEKQorCQkJCQlzdGF0ZSA9ICJkZWxldGVkIjsKKwkJCQllbHNlIGlmIChwc3RhdHVzLT5mbGFncyAmIFNETEFfRExDSV9BQ1RJVkUpCisJCQkJCXN0YXRlID0gImFjdGl2ZSI7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJc3ByaW50ZihsaW5lLCAidW5rbm93biBzdGF0dXM6ICUwMlgiLCBwc3RhdHVzLT5mbGFncyk7CisJCQkJCXN0YXRlID0gbGluZTsKKwkJCQl9CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERMQ0kgJWk6ICVzLlxuIiwgZGV2LT5uYW1lLCBwc3RhdHVzLT5kbGNpLCBzdGF0ZSk7CisJCQkJLyogc2FtZSBoZXJlICovCisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNETEFfUkVUX0RMQ0lfVU5LTk9XTjoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZWNlaXZlZCB1bmtub3duIERMQ0lzOiIsIGRldi0+bmFtZSk7CisJCQlsZW4gLz0gc2l6ZW9mKHNob3J0KTsKKwkJCWZvcihwZGxjaSA9IGRhdGEsaT0wO2kgPCBsZW47aSsrLHBkbGNpKyspCisJCQkJcHJpbnRrKCIgJWkiLCAqcGRsY2kpOworCQkJcHJpbnRrKCJcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRExBX1JFVF9USU1FT1VUOgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ29tbWFuZCB0aW1lZCBvdXQhXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRExBX1JFVF9CVUZfT1ZFUlNJWkU6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQmMvQ0lSIG92ZXJmbG93LCBhY2NlcHRhYmxlIHNpemUgaXMgJWlcbiIsIGRldi0+bmFtZSwgbGVuKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0RMQV9SRVRfQlVGX1RPT19CSUc6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQnVmZmVyIHNpemUgb3ZlciBzcGVjaWZpZWQgbWF4IG9mICVpXG4iLCBkZXYtPm5hbWUsIGxlbik7CisJCQlicmVhazsKKworCQljYXNlIFNETEFfUkVUX0NIQU5ORUxfSU5BQ1RJVkU6CisJCWNhc2UgU0RMQV9SRVRfRExDSV9JTkFDVElWRToKKwkJY2FzZSBTRExBX1JFVF9DSVJfT1ZFUkZMT1c6CisJCWNhc2UgU0RMQV9SRVRfTk9fQlVGUzoKKwkJCWlmIChjbWQgPT0gU0RMQV9JTkZPUk1BVElPTl9XUklURSkKKwkJCQlicmVhazsKKworCQlkZWZhdWx0OiAKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogQ21kIDB4JTIuMlggZ2VuZXJhdGVkIHJldHVybiBjb2RlIDB4JTIuMlhcbiIsIGRldi0+bmFtZSwgY21kLCByZXQpOworCQkJLyogRnVydGhlciBwcm9jZXNzaW5nIGNvdWxkIGJlIGRvbmUgaGVyZSAqLworCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IHNkbGFfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjbWQsIHNob3J0IGRsY2ksIHNob3J0IGZsYWdzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmluYnVmLCBzaG9ydCBpbmxlbiwgdm9pZCAqb3V0YnVmLCBzaG9ydCAqb3V0bGVuKQoreworCXN0YXRpYyBzdHJ1Y3QgX2ZyYWRfc3RhdCBzdGF0dXM7CisJc3RydWN0IGZyYWRfbG9jYWwgICAgICAgICpmbHA7CisJc3RydWN0IHNkbGFfY21kICAgICAgICAgICpjbWRfYnVmOworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICBwZmxhZ3M7CisJdW5zaWduZWQgbG9uZwkJIGppZmZzOworCWludCAgICAgICAgICAgICAgICAgICAgICByZXQsIHdhaXRpbmcsIGxlbjsKKwlsb25nICAgICAgICAgICAgICAgICAgICAgd2luZG93OworCisJZmxwID0gZGV2LT5wcml2OworCXdpbmRvdyA9IGZscC0+dHlwZSA9PSBTRExBX1M1MDggPyBTRExBXzUwOF9DTURfQlVGIDogU0RMQV81MDJfQ01EX0JVRjsKKwljbWRfYnVmID0gKHN0cnVjdCBzZGxhX2NtZCAqKShkZXYtPm1lbV9zdGFydCArICh3aW5kb3cgJiBTRExBX0FERFJfTUFTSykpOworCXJldCA9IDA7CisJbGVuID0gMDsKKwlqaWZmcyA9IGppZmZpZXMgKyBIWjsgIC8qIDEgc2Vjb25kIGlzIHBsZW50eSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNkbGFfbG9jaywgcGZsYWdzKTsKKwlTRExBX1dJTkRPVyhkZXYsIHdpbmRvdyk7CisJY21kX2J1Zi0+Y21kID0gY21kOworCWNtZF9idWYtPmRsY2kgPSBkbGNpOworCWNtZF9idWYtPmZsYWdzID0gZmxhZ3M7CisKKwlpZiAoaW5idWYpCisJCW1lbWNweShjbWRfYnVmLT5kYXRhLCBpbmJ1ZiwgaW5sZW4pOworCisJY21kX2J1Zi0+bGVuZ3RoID0gaW5sZW47CisKKwljbWRfYnVmLT5vcHBfZmxhZyA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RsYV9sb2NrLCBwZmxhZ3MpOworCisJd2FpdGluZyA9IDE7CisJbGVuID0gMDsKKwl3aGlsZSAod2FpdGluZyAmJiB0aW1lX2JlZm9yZV9lcShqaWZmaWVzLCBqaWZmcykpCisJeworCQlpZiAod2FpdGluZysrICUgMykgCisJCXsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzZGxhX2xvY2ssIHBmbGFncyk7CisJCQlTRExBX1dJTkRPVyhkZXYsIHdpbmRvdyk7CisJCQl3YWl0aW5nID0gKCh2b2xhdGlsZSBpbnQpKGNtZF9idWYtPm9wcF9mbGFnKSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGxhX2xvY2ssIHBmbGFncyk7CisJCX0KKwl9CisJCisJaWYgKCF3YWl0aW5nKQorCXsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2RsYV9sb2NrLCBwZmxhZ3MpOworCQlTRExBX1dJTkRPVyhkZXYsIHdpbmRvdyk7CisJCXJldCA9IGNtZF9idWYtPnJldHZhbDsKKwkJbGVuID0gY21kX2J1Zi0+bGVuZ3RoOworCQlpZiAob3V0YnVmICYmIG91dGxlbikKKwkJeworCQkJKm91dGxlbiA9ICpvdXRsZW4gPj0gbGVuID8gbGVuIDogKm91dGxlbjsKKworCQkJaWYgKCpvdXRsZW4pCisJCQkJbWVtY3B5KG91dGJ1ZiwgY21kX2J1Zi0+ZGF0YSwgKm91dGxlbik7CisJCX0KKworCQkvKiBUaGlzIGlzIGEgbG9jYWwgY29weSB0aGF0J3MgdXNlZCBmb3IgZXJyb3IgaGFuZGxpbmcgKi8KKwkJaWYgKHJldCkKKwkJCW1lbWNweSgmc3RhdHVzLCBjbWRfYnVmLT5kYXRhLCBsZW4gPiBzaXplb2Yoc3RhdHVzKSA/IHNpemVvZihzdGF0dXMpIDogbGVuKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZGxhX2xvY2ssIHBmbGFncyk7CisJfQorCWVsc2UKKwkJcmV0ID0gU0RMQV9SRVRfVElNRU9VVDsKKworCWlmIChyZXQgIT0gU0RMQV9SRVRfT0spCisJICAgCXNkbGFfZXJyb3JzKGRldiwgY21kLCBkbGNpLCByZXQsIGxlbiwgJnN0YXR1cyk7CisKKwlyZXR1cm4ocmV0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgYnkgdGhlIERMQ0kgZHJpdmVyIAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBzZGxhX3JlY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitpbnQgc2RsYV9hY3RpdmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmUsIHN0cnVjdCBuZXRfZGV2aWNlICptYXN0ZXIpCit7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKwlpbnQgaTsKKworCWZscCA9IHNsYXZlLT5wcml2OworCisJZm9yKGk9MDtpPENPTkZJR19ETENJX01BWDtpKyspCisJCWlmIChmbHAtPm1hc3RlcltpXSA9PSBtYXN0ZXIpCisJCQlicmVhazsKKworCWlmIChpID09IENPTkZJR19ETENJX01BWCkKKwkJcmV0dXJuKC1FTk9ERVYpOworCisJZmxwLT5kbGNpW2ldID0gYWJzKGZscC0+ZGxjaVtpXSk7CisKKwlpZiAobmV0aWZfcnVubmluZyhzbGF2ZSkgJiYgKGZscC0+Y29uZmlnLnN0YXRpb24gPT0gRlJBRF9TVEFUSU9OX05PREUpKQorCQlzZGxhX2NtZChzbGF2ZSwgU0RMQV9BQ1RJVkFURV9ETENJLCAwLCAwLCAmZmxwLT5kbGNpW2ldLCBzaXplb2Yoc2hvcnQpLCBOVUxMLCBOVUxMKTsKKworCXJldHVybigwKTsKK30KKworaW50IHNkbGFfZGVhY3RpdmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmUsIHN0cnVjdCBuZXRfZGV2aWNlICptYXN0ZXIpCit7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKwlpbnQgICAgICAgICAgICAgICBpOworCisJZmxwID0gc2xhdmUtPnByaXY7CisKKwlmb3IoaT0wO2k8Q09ORklHX0RMQ0lfTUFYO2krKykKKwkJaWYgKGZscC0+bWFzdGVyW2ldID09IG1hc3RlcikKKwkJCWJyZWFrOworCisJaWYgKGkgPT0gQ09ORklHX0RMQ0lfTUFYKQorCQlyZXR1cm4oLUVOT0RFVik7CisKKwlmbHAtPmRsY2lbaV0gPSAtYWJzKGZscC0+ZGxjaVtpXSk7CisKKwlpZiAobmV0aWZfcnVubmluZyhzbGF2ZSkgJiYgKGZscC0+Y29uZmlnLnN0YXRpb24gPT0gRlJBRF9TVEFUSU9OX05PREUpKQorCQlzZGxhX2NtZChzbGF2ZSwgU0RMQV9ERUFDVElWQVRFX0RMQ0ksIDAsIDAsICZmbHAtPmRsY2lbaV0sIHNpemVvZihzaG9ydCksIE5VTEwsIE5VTEwpOworCisJcmV0dXJuKDApOworfQorCitpbnQgc2RsYV9hc3NvYyhzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmUsIHN0cnVjdCBuZXRfZGV2aWNlICptYXN0ZXIpCit7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKwlpbnQgICAgICAgICAgICAgICBpOworCisJaWYgKG1hc3Rlci0+dHlwZSAhPSBBUlBIUkRfRExDSSkKKwkJcmV0dXJuKC1FSU5WQUwpOworCisJZmxwID0gc2xhdmUtPnByaXY7CisKKwlmb3IoaT0wO2k8Q09ORklHX0RMQ0lfTUFYO2krKykKKwl7CisJCWlmICghZmxwLT5tYXN0ZXJbaV0pCisJCQlicmVhazsKKwkJaWYgKGFicyhmbHAtPmRsY2lbaV0pID09ICooc2hvcnQgKikobWFzdGVyLT5kZXZfYWRkcikpCisJCQlyZXR1cm4oLUVBRERSSU5VU0UpOworCX0gCisKKwlpZiAoaSA9PSBDT05GSUdfRExDSV9NQVgpCisJCXJldHVybigtRU1MSU5LKTsgIC8qICMjIyMgQWxhbjogQ29tbWVudHMgb24gdGhpcyA/PyAqLworCisKKwlmbHAtPm1hc3RlcltpXSA9IG1hc3RlcjsKKwlmbHAtPmRsY2lbaV0gPSAtKihzaG9ydCAqKShtYXN0ZXItPmRldl9hZGRyKTsKKwltYXN0ZXItPm10dSA9IHNsYXZlLT5tdHU7CisKKwlpZiAobmV0aWZfcnVubmluZyhzbGF2ZSkpIHsKKwkJaWYgKGZscC0+Y29uZmlnLnN0YXRpb24gPT0gRlJBRF9TVEFUSU9OX0NQRSkKKwkJCXNkbGFfcmVjb25maWcoc2xhdmUpOworCQllbHNlCisJCQlzZGxhX2NtZChzbGF2ZSwgU0RMQV9BRERfRExDSSwgMCwgMCwgbWFzdGVyLT5kZXZfYWRkciwgc2l6ZW9mKHNob3J0KSwgTlVMTCwgTlVMTCk7CisJfQorCisJcmV0dXJuKDApOworfQorCitpbnQgc2RsYV9kZWFzc29jKHN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZSwgc3RydWN0IG5ldF9kZXZpY2UgKm1hc3RlcikKK3sKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwOworCWludCAgICAgICAgICAgICAgIGk7CisKKwlmbHAgPSBzbGF2ZS0+cHJpdjsKKworCWZvcihpPTA7aTxDT05GSUdfRExDSV9NQVg7aSsrKQorCQlpZiAoZmxwLT5tYXN0ZXJbaV0gPT0gbWFzdGVyKQorCQkJYnJlYWs7CisKKwlpZiAoaSA9PSBDT05GSUdfRExDSV9NQVgpCisJCXJldHVybigtRU5PREVWKTsKKworCWZscC0+bWFzdGVyW2ldID0gTlVMTDsKKwlmbHAtPmRsY2lbaV0gPSAwOworCisKKwlpZiAobmV0aWZfcnVubmluZyhzbGF2ZSkpIHsKKwkJaWYgKGZscC0+Y29uZmlnLnN0YXRpb24gPT0gRlJBRF9TVEFUSU9OX0NQRSkKKwkJCXNkbGFfcmVjb25maWcoc2xhdmUpOworCQllbHNlCisJCQlzZGxhX2NtZChzbGF2ZSwgU0RMQV9ERUxFVEVfRExDSSwgMCwgMCwgbWFzdGVyLT5kZXZfYWRkciwgc2l6ZW9mKHNob3J0KSwgTlVMTCwgTlVMTCk7CisJfQorCisJcmV0dXJuKDApOworfQorCitpbnQgc2RsYV9kbGNpX2NvbmYoc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlLCBzdHJ1Y3QgbmV0X2RldmljZSAqbWFzdGVyLCBpbnQgZ2V0KQoreworCXN0cnVjdCBmcmFkX2xvY2FsICpmbHA7CisJc3RydWN0IGRsY2lfbG9jYWwgKmRscDsKKwlpbnQgICAgICAgICAgICAgICBpOworCXNob3J0ICAgICAgICAgICAgIGxlbiwgcmV0OworCisJZmxwID0gc2xhdmUtPnByaXY7CisKKwlmb3IoaT0wO2k8Q09ORklHX0RMQ0lfTUFYO2krKykKKwkJaWYgKGZscC0+bWFzdGVyW2ldID09IG1hc3RlcikKKwkJCWJyZWFrOworCisJaWYgKGkgPT0gQ09ORklHX0RMQ0lfTUFYKQorCQlyZXR1cm4oLUVOT0RFVik7CisKKwlkbHAgPSBtYXN0ZXItPnByaXY7CisKKwlyZXQgPSBTRExBX1JFVF9PSzsKKwlsZW4gPSBzaXplb2Yoc3RydWN0IGRsY2lfY29uZik7CisJaWYgKG5ldGlmX3J1bm5pbmcoc2xhdmUpKSB7CisJCWlmIChnZXQpCisJCQlyZXQgPSBzZGxhX2NtZChzbGF2ZSwgU0RMQV9SRUFEX0RMQ0lfQ09ORklHVVJBVElPTiwgYWJzKGZscC0+ZGxjaVtpXSksIDAsICAKKwkJCSAgICAgICAgICAgIE5VTEwsIDAsICZkbHAtPmNvbmZpZywgJmxlbik7CisJCWVsc2UKKwkJCXJldCA9IHNkbGFfY21kKHNsYXZlLCBTRExBX1NFVF9ETENJX0NPTkZJR1VSQVRJT04sIGFicyhmbHAtPmRsY2lbaV0pLCAwLCAgCisJCQkgICAgICAgICAgICAmZGxwLT5jb25maWcsIHNpemVvZihzdHJ1Y3QgZGxjaV9jb25mKSAtIDQgKiBzaXplb2Yoc2hvcnQpLCBOVUxMLCBOVUxMKTsKKwl9CisKKwlyZXR1cm4ocmV0ID09IFNETEFfUkVUX09LID8gMCA6IC1FSU8pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBub3cgZm9yIHRoZSBMaW51eCBkcml2ZXIgCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBOT1RFOiB0aGUgRExDSSBkcml2ZXIgZGVhbHMgd2l0aCBmcmVlaW5nIHRoZSBTS0IhISAqLworc3RhdGljIGludCBzZGxhX3RyYW5zbWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKwlpbnQgICAgICAgICAgICAgICByZXQsIGFkZHIsIGFjY2VwdCwgaTsKKwlzaG9ydCAgICAgICAgICAgICBzaXplOworCXVuc2lnbmVkIGxvbmcgICAgIGZsYWdzOworCXN0cnVjdCBidWZfZW50cnkgICpwYnVmOworCisJZmxwID0gZGV2LT5wcml2OworCXJldCA9IDA7CisJYWNjZXB0ID0gMTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qCisJICogc3R1cGlkIEdhdGVEIGluc2lzdHMgb24gc2V0dGluZyB1cCB0aGUgbXVsdGljYXN0IHJvdXRlciB0aHJ1IHVzCisJICogYW5kIHdlJ3JlIGlsbCBlcXVpcHBlZCB0byBoYW5kbGUgYSBub24gRnJhbWUgUmVsYXkgcGFja2V0IGF0IHRoaXMKKwkgKiB0aW1lIQorCSAqLworCisJYWNjZXB0ID0gMTsKKwlzd2l0Y2ggKGRldi0+dHlwZSkKKwl7CisJCWNhc2UgQVJQSFJEX0ZSQUQ6CisJCQlpZiAoc2tiLT5kZXYtPnR5cGUgIT0gQVJQSFJEX0RMQ0kpCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vbiBETENJIGRldmljZSwgdHlwZSAlaSwgdHJpZWQgdG8gc2VuZCBvbiBGUkFEIG1vZHVsZS5cbiIsIGRldi0+bmFtZSwgc2tiLT5kZXYtPnR5cGUpOworCQkJCWFjY2VwdCA9IDA7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmtub3duIGZpcm13YXJlIHR5cGUgMHglNC40WFxuIiwgZGV2LT5uYW1lLCBkZXYtPnR5cGUpOworCQkJYWNjZXB0ID0gMDsKKwkJCWJyZWFrOworCX0KKwlpZiAoYWNjZXB0KQorCXsKKwkJLyogdGhpcyBpcyBmcmFtZSBzcGVjaWZpYywgYnV0IHRpbGwgdGhlcmUncyBhIFBQUCBtb2R1bGUsIGl0J3MgdGhlIGRlZmF1bHQgKi8KKwkJc3dpdGNoIChmbHAtPnR5cGUpCisJCXsKKwkJCWNhc2UgU0RMQV9TNTAyQToKKwkJCWNhc2UgU0RMQV9TNTAyRToKKwkJCQlyZXQgPSBzZGxhX2NtZChkZXYsIFNETEFfSU5GT1JNQVRJT05fV1JJVEUsICooc2hvcnQgKikoc2tiLT5kZXYtPmRldl9hZGRyKSwgMCwgc2tiLT5kYXRhLCBza2ItPmxlbiwgTlVMTCwgTlVMTCk7CisJCQkJYnJlYWs7CisJCQkJY2FzZSBTRExBX1M1MDg6CisJCQkJc2l6ZSA9IHNpemVvZihhZGRyKTsKKwkJCQlyZXQgPSBzZGxhX2NtZChkZXYsIFNETEFfSU5GT1JNQVRJT05fV1JJVEUsICooc2hvcnQgKikoc2tiLT5kZXYtPmRldl9hZGRyKSwgMCwgTlVMTCwgc2tiLT5sZW4sICZhZGRyLCAmc2l6ZSk7CisJCQkJaWYgKHJldCA9PSBTRExBX1JFVF9PSykKKwkJCQl7CisKKwkJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNkbGFfbG9jaywgZmxhZ3MpOworCQkJCQlTRExBX1dJTkRPVyhkZXYsIGFkZHIpOworCQkJCQlwYnVmID0gKHZvaWQgKikoKChpbnQpIGRldi0+bWVtX3N0YXJ0KSArIChhZGRyICYgU0RMQV9BRERSX01BU0spKTsKKwkJCQkJX19zZGxhX3dyaXRlKGRldiwgcGJ1Zi0+YnVmX2FkZHIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkJCQlTRExBX1dJTkRPVyhkZXYsIGFkZHIpOworCQkJCQlwYnVmLT5vcHBfZmxhZyA9IDE7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkbGFfbG9jaywgZmxhZ3MpOworCQkJCX0KKwkJCQlicmVhazsKKwkJfQorCQlzd2l0Y2ggKHJldCkKKwkJeworCQkJY2FzZSBTRExBX1JFVF9PSzoKKwkJCQlmbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCQlyZXQgPSBETENJX1JFVF9PSzsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTRExBX1JFVF9DSVJfT1ZFUkZMT1c6CisJCQljYXNlIFNETEFfUkVUX0JVRl9PVkVSU0laRToKKwkJCWNhc2UgU0RMQV9SRVRfTk9fQlVGUzoKKwkJCQlmbHAtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJCQlyZXQgPSBETENJX1JFVF9EUk9QOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWZscC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJcmV0ID0gRExDSV9SRVRfRVJSOworCQkJCWJyZWFrOworCQl9CisJfQorCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwlmb3IoaT0wO2k8Q09ORklHX0RMQ0lfTUFYO2krKykKKwl7CisJCWlmKGZscC0+bWFzdGVyW2ldIT1OVUxMKQorCQkJbmV0aWZfd2FrZV9xdWV1ZShmbHAtPm1hc3RlcltpXSk7CisJfQkJCisJcmV0dXJuKHJldCk7Cit9CisKK3N0YXRpYyB2b2lkIHNkbGFfcmVjZWl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlCSAgKm1hc3RlcjsKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwOworCXN0cnVjdCBkbGNpX2xvY2FsICpkbHA7CisJc3RydWN0IHNrX2J1ZmYJICpza2I7CisKKwlzdHJ1Y3Qgc2RsYV9jbWQJKmNtZDsKKwlzdHJ1Y3QgYnVmX2luZm8JKnBidWZpOworCXN0cnVjdCBidWZfZW50cnkgICpwYnVmOworCisJdW5zaWduZWQgbG9uZwkgIGZsYWdzOworCWludCAgICAgICAgICAgICAgIGk9MCwgcmVjZWl2ZWQsIHN1Y2Nlc3MsIGFkZHIsIGJ1Zl9iYXNlLCBidWZfdG9wOworCXNob3J0ICAgICAgICAgICAgIGRsY2ksIGxlbiwgbGVuMiwgc3BsaXQ7CisKKwlmbHAgPSBkZXYtPnByaXY7CisJc3VjY2VzcyA9IDE7CisJcmVjZWl2ZWQgPSBhZGRyID0gYnVmX3RvcCA9IGJ1Zl9iYXNlID0gMDsKKwlsZW4gPSBkbGNpID0gMDsKKwlza2IgPSBOVUxMOworCW1hc3RlciA9IE5VTEw7CisJY21kID0gTlVMTDsKKwlwYnVmaSA9IE5VTEw7CisJcGJ1ZiA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2RsYV9sb2NrLCBmbGFncyk7CisKKwlzd2l0Y2ggKGZscC0+dHlwZSkKKwl7CisJCWNhc2UgU0RMQV9TNTAyQToKKwkJY2FzZSBTRExBX1M1MDJFOgorCQkJY21kID0gKHZvaWQgKikgKGRldi0+bWVtX3N0YXJ0ICsgKFNETEFfNTAyX1JDVl9CVUYgJiBTRExBX0FERFJfTUFTSykpOworCQkJU0RMQV9XSU5ET1coZGV2LCBTRExBXzUwMl9SQ1ZfQlVGKTsKKwkJCXN1Y2Nlc3MgPSBjbWQtPm9wcF9mbGFnOworCQkJaWYgKCFzdWNjZXNzKQorCQkJCWJyZWFrOworCisJCQlkbGNpID0gY21kLT5kbGNpOworCQkJbGVuID0gY21kLT5sZW5ndGg7CisJCQlicmVhazsKKworCQljYXNlIFNETEFfUzUwODoKKwkJCXBidWZpID0gKHZvaWQgKikgKGRldi0+bWVtX3N0YXJ0ICsgKFNETEFfNTA4X1JYQlVGX0lORk8gJiBTRExBX0FERFJfTUFTSykpOworCQkJU0RMQV9XSU5ET1coZGV2LCBTRExBXzUwOF9SWEJVRl9JTkZPKTsKKwkJCXBidWYgPSAodm9pZCAqKSAoZGV2LT5tZW1fc3RhcnQgKyAoKHBidWZpLT5yc2VfYmFzZSArIGZscC0+YnVmZmVyICogc2l6ZW9mKHN0cnVjdCBidWZfZW50cnkpKSAmIFNETEFfQUREUl9NQVNLKSk7CisJCQlzdWNjZXNzID0gcGJ1Zi0+b3BwX2ZsYWc7CisJCQlpZiAoIXN1Y2Nlc3MpCisJCQkJYnJlYWs7CisKKwkJCWJ1Zl90b3AgPSBwYnVmaS0+YnVmX3RvcDsKKwkJCWJ1Zl9iYXNlID0gcGJ1ZmktPmJ1Zl9iYXNlOworCQkJZGxjaSA9IHBidWYtPmRsY2k7CisJCQlsZW4gPSBwYnVmLT5sZW5ndGg7CisJCQlhZGRyID0gcGJ1Zi0+YnVmX2FkZHI7CisJCQlicmVhazsKKwl9CisKKwkvKiBjb21tb24gY29kZSwgZmluZCB0aGUgRExDSSBhbmQgZ2V0IHRoZSBTS0IgKi8KKwlpZiAoc3VjY2VzcykKKwl7CisJCWZvciAoaT0wO2k8Q09ORklHX0RMQ0lfTUFYO2krKykKKwkJCWlmIChmbHAtPmRsY2lbaV0gPT0gZGxjaSkKKwkJCQlicmVhazsKKworCQlpZiAoaSA9PSBDT05GSUdfRExDSV9NQVgpCisJCXsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFJlY2VpdmVkIHBhY2tldCBmcm9tIGludmFsaWQgRExDSSAlaSwgaWdub3JpbmcuIiwgZGV2LT5uYW1lLCBkbGNpKTsKKwkJCWZscC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlzdWNjZXNzID0gMDsKKwkJfQorCX0KKworCWlmIChzdWNjZXNzKQorCXsKKwkJbWFzdGVyID0gZmxwLT5tYXN0ZXJbaV07CisJCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgc2l6ZW9mKHN0cnVjdCBmcmhkcikpOworCQlpZiAoc2tiID09IE5VTEwpIAorCQl7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKwkJCWZscC0+c3RhdHMucnhfZHJvcHBlZCsrOyAKKwkJCXN1Y2Nlc3MgPSAwOworCQl9CisJCWVsc2UKKwkJCXNrYl9yZXNlcnZlKHNrYiwgc2l6ZW9mKHN0cnVjdCBmcmhkcikpOworCX0KKworCS8qIHBpY2sgdXAgdGhlIGRhdGEgKi8KKwlzd2l0Y2ggKGZscC0+dHlwZSkKKwl7CisJCWNhc2UgU0RMQV9TNTAyQToKKwkJY2FzZSBTRExBX1M1MDJFOgorCQkJaWYgKHN1Y2Nlc3MpCisJCQkJX19zZGxhX3JlYWQoZGV2LCBTRExBXzUwMl9SQ1ZfQlVGICsgU0RMQV81MDJfREFUQV9PRlMsIHNrYl9wdXQoc2tiLGxlbiksIGxlbik7CisKKwkJCVNETEFfV0lORE9XKGRldiwgU0RMQV81MDJfUkNWX0JVRik7CisJCQljbWQtPm9wcF9mbGFnID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgU0RMQV9TNTA4OgorCQkJaWYgKHN1Y2Nlc3MpCisJCQl7CisJCQkJLyogaXMgdGhpcyBidWZmZXIgc3BsaXQgb2ZmIHRoZSBlbmQgb2YgdGhlIGludGVybmFsIHJpbmcgYnVmZmVyICovCisJCQkJc3BsaXQgPSBhZGRyICsgbGVuID4gYnVmX3RvcCArIDEgPyBsZW4gLSAoYnVmX3RvcCAtIGFkZHIgKyAxKSA6IDA7CisJCQkJbGVuMiA9IGxlbiAtIHNwbGl0OworCisJCQkJX19zZGxhX3JlYWQoZGV2LCBhZGRyLCBza2JfcHV0KHNrYiwgbGVuMiksIGxlbjIpOworCQkJCWlmIChzcGxpdCkKKwkJCQkJX19zZGxhX3JlYWQoZGV2LCBidWZfYmFzZSwgc2tiX3B1dChza2IsIHNwbGl0KSwgc3BsaXQpOworCQkJfQorCisJCQkvKiBpbmNyZW1lbnQgdGhlIGJ1ZmZlciB3ZSdyZSBsb29raW5nIGF0ICovCisJCQlTRExBX1dJTkRPVyhkZXYsIFNETEFfNTA4X1JYQlVGX0lORk8pOworCQkJZmxwLT5idWZmZXIgPSAoZmxwLT5idWZmZXIgKyAxKSAlIHBidWZpLT5yc2VfbnVtOworCQkJcGJ1Zi0+b3BwX2ZsYWcgPSAwOworCQkJYnJlYWs7CisJfQorCisJaWYgKHN1Y2Nlc3MpCisJeworCQlmbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJZGxwID0gbWFzdGVyLT5wcml2OworCQkoKmRscC0+cmVjZWl2ZSkoc2tiLCBtYXN0ZXIpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkbGFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2RsYV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgICAgICpkZXY7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKwljaGFyICAgICAgICAgICAgICBieXRlOworCisJZGV2ID0gZGV2X2lkOworCisJaWYgKGRldiA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2RsYV9pc3IoKTogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlmbHAgPSBkZXYtPnByaXY7CisKKwlpZiAoIWZscC0+aW5pdGlhbGl6ZWQpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaXJxICVkIGZvciB1bmluaXRpYWxpemVkIGRldmljZS5cbiIsIGRldi0+bmFtZSwgaXJxKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWJ5dGUgPSBzZGxhX2J5dGUoZGV2LCBmbHAtPnR5cGUgPT0gU0RMQV9TNTA4ID8gU0RMQV81MDhfSVJRX0lOVEVSRkFDRSA6IFNETEFfNTAyX0lSUV9JTlRFUkZBQ0UpOworCXN3aXRjaCAoYnl0ZSkKKwl7CisJCWNhc2UgU0RMQV9JTlRSX1JYOgorCQkJc2RsYV9yZWNlaXZlKGRldik7CisJCQlicmVhazsKKworCQkvKiB0aGUgY29tbWFuZCB3aWxsIGdldCBhbiBlcnJvciByZXR1cm4sIHdoaWNoIGlzIHByb2Nlc3NlZCBhYm92ZSAqLworCQljYXNlIFNETEFfSU5UUl9NT0RFTToKKwkJY2FzZSBTRExBX0lOVFJfU1RBVFVTOgorCQkJc2RsYV9jbWQoZGV2LCBTRExBX1JFQURfRExDX1NUQVRVUywgMCwgMCwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisJCQlicmVhazsKKworCQljYXNlIFNETEFfSU5UUl9UWDoKKwkJY2FzZSBTRExBX0lOVFJfQ09NUExFVEU6CisJCWNhc2UgU0RMQV9JTlRSX1RJTUVSOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGludmFsaWQgaXJxIGZsYWcgMHglMDJYLlxuIiwgZGV2LT5uYW1lLCBieXRlKTsKKwkJCWJyZWFrOworCX0KKworCS8qIHRoZSBTNTAyRSByZXF1aXJlcyBhIG1hbnVhbCBhY2tub3dsZWRnZW1lbnQgb2YgdGhlIGludGVycnVwdCAqLyAKKwlpZiAoZmxwLT50eXBlID09IFNETEFfUzUwMkUpCisJeworCQlmbHAtPnN0YXRlICY9IH5TRExBX1M1MDJFX0lOVEFDSzsKKwkJb3V0YihmbHAtPnN0YXRlLCBkZXYtPmJhc2VfYWRkciArIFNETEFfUkVHX0NPTlRST0wpOworCQlmbHAtPnN0YXRlIHw9IFNETEFfUzUwMkVfSU5UQUNLOworCQlvdXRiKGZscC0+c3RhdGUsIGRldi0+YmFzZV9hZGRyICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJfQorCisJLyogdGhpcyBjbGVhcnMgdGhlIGJ5dGUsIGluZm9ybWluZyB0aGUgWjgwIHdlJ3JlIGRvbmUgKi8KKwlieXRlID0gMDsKKwlzZGxhX3dyaXRlKGRldiwgZmxwLT50eXBlID09IFNETEFfUzUwOCA/IFNETEFfNTA4X0lSUV9JTlRFUkZBQ0UgOiBTRExBXzUwMl9JUlFfSU5URVJGQUNFLCAmYnl0ZSwgc2l6ZW9mKGJ5dGUpKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHNkbGFfcG9sbCh1bnNpZ25lZCBsb25nIGRldmljZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZQkgICpkZXY7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKworCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZpY2U7CisJZmxwID0gZGV2LT5wcml2OworCisJaWYgKHNkbGFfYnl0ZShkZXYsIFNETEFfNTAyX1JDVl9CVUYpKQorCQlzZGxhX3JlY2VpdmUoZGV2KTsKKworCWZscC0+dGltZXIuZXhwaXJlcyA9IDE7CisJYWRkX3RpbWVyKCZmbHAtPnRpbWVyKTsKK30KKworc3RhdGljIGludCBzZGxhX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKwlzdHJ1Y3QgaW50cl9pbmZvICBpbnRyOworCWludCAgICAgICAgICAgICAgIGxlbiwgaTsKKwlzaG9ydCAgICAgICAgICAgICBkbGNpc1tDT05GSUdfRExDSV9NQVhdOworCisJZmxwID0gZGV2LT5wcml2OworCisJbGVuID0gMDsKKwlmb3IoaT0wO2k8Q09ORklHX0RMQ0lfTUFYO2krKykKKwkJaWYgKGZscC0+ZGxjaVtpXSkKKwkJCWRsY2lzW2xlbisrXSA9IGFicyhmbHAtPmRsY2lbaV0pOworCWxlbiAqPSAyOworCisJaWYgKGZscC0+Y29uZmlnLnN0YXRpb24gPT0gRlJBRF9TVEFUSU9OX05PREUpCisJeworCQlmb3IoaT0wO2k8Q09ORklHX0RMQ0lfTUFYO2krKykKKwkJCWlmIChmbHAtPmRsY2lbaV0gPiAwKSAKKwkJCQlzZGxhX2NtZChkZXYsIFNETEFfREVBQ1RJVkFURV9ETENJLCAwLCAwLCBkbGNpcywgbGVuLCBOVUxMLCBOVUxMKTsKKwkJc2RsYV9jbWQoZGV2LCBTRExBX0RFTEVURV9ETENJLCAwLCAwLCAmZmxwLT5kbGNpW2ldLCBzaXplb2YoZmxwLT5kbGNpW2ldKSwgTlVMTCwgTlVMTCk7CisJfQorCisJbWVtc2V0KCZpbnRyLCAwLCBzaXplb2YoaW50cikpOworCS8qIGxldCdzIHN0YXJ0IHVwIHRoZSByZWNlcHRpb24gKi8KKwlzd2l0Y2goZmxwLT50eXBlKQorCXsKKwkJY2FzZSBTRExBX1M1MDJBOgorCQkJZGVsX3RpbWVyKCZmbHAtPnRpbWVyKTsgCisJCQlicmVhazsKKworCQljYXNlIFNETEFfUzUwMkU6CisJCQlzZGxhX2NtZChkZXYsIFNETEFfU0VUX0lSUV9UUklHR0VSLCAwLCAwLCAmaW50ciwgc2l6ZW9mKGNoYXIpICsgc2l6ZW9mKHNob3J0KSwgTlVMTCwgTlVMTCk7CisJCQlmbHAtPnN0YXRlICY9IH5TRExBX1M1MDJFX0lOVEFDSzsKKwkJCW91dGIoZmxwLT5zdGF0ZSwgZGV2LT5iYXNlX2FkZHIgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0RMQV9TNTA3OgorCQkJYnJlYWs7CisKKwkJY2FzZSBTRExBX1M1MDg6CisJCQlzZGxhX2NtZChkZXYsIFNETEFfU0VUX0lSUV9UUklHR0VSLCAwLCAwLCAmaW50ciwgc2l6ZW9mKHN0cnVjdCBpbnRyX2luZm8pLCBOVUxMLCBOVUxMKTsKKwkJCWZscC0+c3RhdGUgJj0gflNETEFfUzUwOF9JTlRFTjsKKwkJCW91dGIoZmxwLT5zdGF0ZSwgZGV2LT5iYXNlX2FkZHIgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJCWJyZWFrOworCX0KKworCXNkbGFfY21kKGRldiwgU0RMQV9ESVNBQkxFX0NPTU1VTklDQVRJT05TLCAwLCAwLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKwlyZXR1cm4oMCk7Cit9CisKK3N0cnVjdCBjb25mX2RhdGEgeworCXN0cnVjdCBmcmFkX2NvbmYgY29uZmlnOworCXNob3J0ICAgICAgICAgICAgZGxjaVtDT05GSUdfRExDSV9NQVhdOworfTsKKworc3RhdGljIGludCBzZGxhX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwOworCXN0cnVjdCBkbGNpX2xvY2FsICpkbHA7CisJc3RydWN0IGNvbmZfZGF0YSAgZGF0YTsKKwlzdHJ1Y3QgaW50cl9pbmZvICBpbnRyOworCWludCAgICAgICAgICAgICAgIGxlbiwgaTsKKwljaGFyICAgICAgICAgICAgICBieXRlOworCisJZmxwID0gZGV2LT5wcml2OworCisJaWYgKCFmbHAtPmluaXRpYWxpemVkKQorCQlyZXR1cm4oLUVQRVJNKTsKKworCWlmICghZmxwLT5jb25maWd1cmVkKQorCQlyZXR1cm4oLUVQRVJNKTsKKworCS8qIHRpbWUgdG8gc2VuZCBpbiB0aGUgY29uZmlndXJhdGlvbiAqLworCWxlbiA9IDA7CisJZm9yKGk9MDtpPENPTkZJR19ETENJX01BWDtpKyspCisJCWlmIChmbHAtPmRsY2lbaV0pCisJCQlkYXRhLmRsY2lbbGVuKytdID0gYWJzKGZscC0+ZGxjaVtpXSk7CisJbGVuICo9IDI7CisKKwltZW1jcHkoJmRhdGEuY29uZmlnLCAmZmxwLT5jb25maWcsIHNpemVvZihzdHJ1Y3QgZnJhZF9jb25mKSk7CisJbGVuICs9IHNpemVvZihzdHJ1Y3QgZnJhZF9jb25mKTsKKworCXNkbGFfY21kKGRldiwgU0RMQV9ESVNBQkxFX0NPTU1VTklDQVRJT05TLCAwLCAwLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKwlzZGxhX2NtZChkZXYsIFNETEFfU0VUX0RMQ0lfQ09ORklHVVJBVElPTiwgMCwgMCwgJmRhdGEsIGxlbiwgTlVMTCwgTlVMTCk7CisKKwlpZiAoZmxwLT50eXBlID09IFNETEFfUzUwOCkKKwkJZmxwLT5idWZmZXIgPSAwOworCisJc2RsYV9jbWQoZGV2LCBTRExBX0VOQUJMRV9DT01NVU5JQ0FUSU9OUywgMCwgMCwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisKKwkvKiBsZXQncyBzdGFydCB1cCB0aGUgcmVjZXB0aW9uICovCisJbWVtc2V0KCZpbnRyLCAwLCBzaXplb2YoaW50cikpOworCXN3aXRjaChmbHAtPnR5cGUpCisJeworCQljYXNlIFNETEFfUzUwMkE6CisJCQlmbHAtPnRpbWVyLmV4cGlyZXMgPSAxOworCQkJYWRkX3RpbWVyKCZmbHAtPnRpbWVyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0RMQV9TNTAyRToKKwkJCWZscC0+c3RhdGUgfD0gU0RMQV9TNTAyRV9FTkFCTEU7CisJCQlvdXRiKGZscC0+c3RhdGUsIGRldi0+YmFzZV9hZGRyICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQlmbHAtPnN0YXRlIHw9IFNETEFfUzUwMkVfSU5UQUNLOworCQkJb3V0YihmbHAtPnN0YXRlLCBkZXYtPmJhc2VfYWRkciArIFNETEFfUkVHX0NPTlRST0wpOworCQkJYnl0ZSA9IDA7CisJCQlzZGxhX3dyaXRlKGRldiwgU0RMQV81MDJfSVJRX0lOVEVSRkFDRSwgJmJ5dGUsIHNpemVvZihieXRlKSk7CisJCQlpbnRyLmZsYWdzID0gU0RMQV9JTlRSX1JYIHwgU0RMQV9JTlRSX1NUQVRVUyB8IFNETEFfSU5UUl9NT0RFTTsKKwkJCXNkbGFfY21kKGRldiwgU0RMQV9TRVRfSVJRX1RSSUdHRVIsIDAsIDAsICZpbnRyLCBzaXplb2YoY2hhcikgKyBzaXplb2Yoc2hvcnQpLCBOVUxMLCBOVUxMKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0RMQV9TNTA3OgorCQkJYnJlYWs7CisKKwkJY2FzZSBTRExBX1M1MDg6CisJCQlmbHAtPnN0YXRlIHw9IFNETEFfUzUwOF9JTlRFTjsKKwkJCW91dGIoZmxwLT5zdGF0ZSwgZGV2LT5iYXNlX2FkZHIgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJCWJ5dGUgPSAwOworCQkJc2RsYV93cml0ZShkZXYsIFNETEFfNTA4X0lSUV9JTlRFUkZBQ0UsICZieXRlLCBzaXplb2YoYnl0ZSkpOworCQkJaW50ci5mbGFncyA9IFNETEFfSU5UUl9SWCB8IFNETEFfSU5UUl9TVEFUVVMgfCBTRExBX0lOVFJfTU9ERU07CisJCQlpbnRyLmlycSA9IGRldi0+aXJxOworCQkJc2RsYV9jbWQoZGV2LCBTRExBX1NFVF9JUlFfVFJJR0dFUiwgMCwgMCwgJmludHIsIHNpemVvZihzdHJ1Y3QgaW50cl9pbmZvKSwgTlVMTCwgTlVMTCk7CisJCQlicmVhazsKKwl9CisKKwlpZiAoZmxwLT5jb25maWcuc3RhdGlvbiA9PSBGUkFEX1NUQVRJT05fQ1BFKQorCXsKKwkJYnl0ZSA9IFNETEFfSUNTX1NUQVRVU19FTlE7CisJCXNkbGFfY21kKGRldiwgU0RMQV9JU1NVRV9JTl9DSEFOTkVMX1NJR05BTCwgMCwgMCwgJmJ5dGUsIHNpemVvZihieXRlKSwgTlVMTCwgTlVMTCk7CisJfQorCWVsc2UKKwl7CisJCXNkbGFfY21kKGRldiwgU0RMQV9BRERfRExDSSwgMCwgMCwgZGF0YS5kbGNpLCBsZW4gLSBzaXplb2Yoc3RydWN0IGZyYWRfY29uZiksIE5VTEwsIE5VTEwpOworCQlmb3IoaT0wO2k8Q09ORklHX0RMQ0lfTUFYO2krKykKKwkJCWlmIChmbHAtPmRsY2lbaV0gPiAwKQorCQkJCXNkbGFfY21kKGRldiwgU0RMQV9BQ1RJVkFURV9ETENJLCAwLCAwLCAmZmxwLT5kbGNpW2ldLCAyKnNpemVvZihmbHAtPmRsY2lbaV0pLCBOVUxMLCBOVUxMKTsKKwl9CisKKwkvKiBjb25maWd1cmUgYW55IHNwZWNpZmljIERMQ0kgc2V0dGluZ3MgKi8KKwlmb3IoaT0wO2k8Q09ORklHX0RMQ0lfTUFYO2krKykKKwkJaWYgKGZscC0+ZGxjaVtpXSkKKwkJeworCQkJZGxwID0gZmxwLT5tYXN0ZXJbaV0tPnByaXY7CisJCQlpZiAoZGxwLT5jb25maWd1cmVkKQorCQkJCXNkbGFfY21kKGRldiwgU0RMQV9TRVRfRExDSV9DT05GSUdVUkFUSU9OLCBhYnMoZmxwLT5kbGNpW2ldKSwgMCwgJmRscC0+Y29uZmlnLCBzaXplb2Yoc3RydWN0IGRsY2lfY29uZiksIE5VTEwsIE5VTEwpOworCQl9CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQorCXJldHVybigwKTsKK30KKworc3RhdGljIGludCBzZGxhX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZnJhZF9jb25mIF9fdXNlciAqY29uZiwgaW50IGdldCkKK3sKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwOworCXN0cnVjdCBjb25mX2RhdGEgIGRhdGE7CisJaW50ICAgICAgICAgICAgICAgaTsKKwlzaG9ydCAgICAgICAgICAgICBzaXplOworCisJaWYgKGRldi0+dHlwZSA9PSAweEZGRkYpCisJCXJldHVybigtRVVOQVRDSCk7CisKKwlmbHAgPSBkZXYtPnByaXY7CisKKwlpZiAoIWdldCkKKwl7CisJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCQlyZXR1cm4oLUVCVVNZKTsKKworCQlpZihjb3B5X2Zyb21fdXNlcigmZGF0YS5jb25maWcsIGNvbmYsIHNpemVvZihzdHJ1Y3QgZnJhZF9jb25mKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoZGF0YS5jb25maWcuc3RhdGlvbiAmIH5GUkFEX1NUQVRJT05fTk9ERSkKKwkJCXJldHVybigtRUlOVkFMKTsKKworCQlpZiAoZGF0YS5jb25maWcuZmxhZ3MgJiB+RlJBRF9WQUxJRF9GTEFHUykKKwkJCXJldHVybigtRUlOVkFMKTsKKworCQlpZiAoKGRhdGEuY29uZmlnLmtiYXVkIDwgMCkgfHwgCisJCQkgKChkYXRhLmNvbmZpZy5rYmF1ZCA+IDEyOCkgJiYgKGZscC0+dHlwZSAhPSBTRExBX1M1MDgpKSkKKwkJCXJldHVybigtRUlOVkFMKTsKKworCQlpZiAoZGF0YS5jb25maWcuY2xvY2tpbmcgJiB+KEZSQURfQ0xPQ0tfSU5UIHwgU0RMQV9TNTA4X1BPUlRfUlMyMzIpKQorCQkJcmV0dXJuKC1FSU5WQUwpOworCisJCWlmICgoZGF0YS5jb25maWcubXR1IDwgMCkgfHwgKGRhdGEuY29uZmlnLm10dSA+IFNETEFfTUFYX01UVSkpCisJCQlyZXR1cm4oLUVJTlZBTCk7CisKKwkJaWYgKChkYXRhLmNvbmZpZy5UMzkxIDwgNSkgfHwgKGRhdGEuY29uZmlnLlQzOTEgPiAzMCkpCisJCQlyZXR1cm4oLUVJTlZBTCk7CisKKwkJaWYgKChkYXRhLmNvbmZpZy5UMzkyIDwgNSkgfHwgKGRhdGEuY29uZmlnLlQzOTIgPiAzMCkpCisJCQlyZXR1cm4oLUVJTlZBTCk7CisKKwkJaWYgKChkYXRhLmNvbmZpZy5OMzkxIDwgMSkgfHwgKGRhdGEuY29uZmlnLk4zOTEgPiAyNTUpKQorCQkJcmV0dXJuKC1FSU5WQUwpOworCisJCWlmICgoZGF0YS5jb25maWcuTjM5MiA8IDEpIHx8IChkYXRhLmNvbmZpZy5OMzkyID4gMTApKQorCQkJcmV0dXJuKC1FSU5WQUwpOworCisJCWlmICgoZGF0YS5jb25maWcuTjM5MyA8IDEpIHx8IChkYXRhLmNvbmZpZy5OMzkzID4gMTApKQorCQkJcmV0dXJuKC1FSU5WQUwpOworCisJCW1lbWNweSgmZmxwLT5jb25maWcsICZkYXRhLmNvbmZpZywgc2l6ZW9mKHN0cnVjdCBmcmFkX2NvbmYpKTsKKwkJZmxwLT5jb25maWcuZmxhZ3MgfD0gU0RMQV9ESVJFQ1RfUkVDVjsKKworCQlpZiAoZmxwLT50eXBlID09IFNETEFfUzUwOCkKKwkJCWZscC0+Y29uZmlnLmZsYWdzIHw9IFNETEFfVFg3MF9SWDMwOworCisJCWlmIChkZXYtPm10dSAhPSBmbHAtPmNvbmZpZy5tdHUpCisJCXsKKwkJCS8qIHRoaXMgaXMgcmVxdWlyZWQgdG8gY2hhbmdlIHRoZSBNVFUgKi8KKwkJCWRldi0+bXR1ID0gZmxwLT5jb25maWcubXR1OworCQkJZm9yKGk9MDtpPENPTkZJR19ETENJX01BWDtpKyspCisJCQkJaWYgKGZscC0+bWFzdGVyW2ldKQorCQkJCQlmbHAtPm1hc3RlcltpXS0+bXR1ID0gZmxwLT5jb25maWcubXR1OworCQl9CisKKwkJZmxwLT5jb25maWcubXR1ICs9IHNpemVvZihzdHJ1Y3QgZnJoZHIpOworCisJCS8qIG9mZiB0byB0aGUgcmFjZXMhICovCisJCWlmICghZmxwLT5jb25maWd1cmVkKQorCQkJc2RsYV9zdGFydChkZXYpOworCisJCWZscC0+Y29uZmlndXJlZCA9IDE7CisJfQorCWVsc2UKKwl7CisJCS8qIG5vIHNlbnNlIHJlYWRpbmcgaWYgdGhlIENQVSBpc24ndCBzdGFydGVkICovCisJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXsKKwkJCXNpemUgPSBzaXplb2YoZGF0YSk7CisJCQlpZiAoc2RsYV9jbWQoZGV2LCBTRExBX1JFQURfRExDSV9DT05GSUdVUkFUSU9OLCAwLCAwLCBOVUxMLCAwLCAmZGF0YSwgJnNpemUpICE9IFNETEFfUkVUX09LKQorCQkJCXJldHVybigtRUlPKTsKKwkJfQorCQllbHNlCisJCQlpZiAoZmxwLT5jb25maWd1cmVkKQorCQkJCW1lbWNweSgmZGF0YS5jb25maWcsICZmbHAtPmNvbmZpZywgc2l6ZW9mKHN0cnVjdCBmcmFkX2NvbmYpKTsKKwkJCWVsc2UKKwkJCQltZW1zZXQoJmRhdGEuY29uZmlnLCAwLCBzaXplb2Yoc3RydWN0IGZyYWRfY29uZikpOworCisJCW1lbWNweSgmZmxwLT5jb25maWcsICZkYXRhLmNvbmZpZywgc2l6ZW9mKHN0cnVjdCBmcmFkX2NvbmYpKTsKKwkJZGF0YS5jb25maWcuZmxhZ3MgJj0gRlJBRF9WQUxJRF9GTEFHUzsKKwkJZGF0YS5jb25maWcubXR1IC09IGRhdGEuY29uZmlnLm10dSA+IHNpemVvZihzdHJ1Y3QgZnJoZHIpID8gc2l6ZW9mKHN0cnVjdCBmcmhkcikgOiBkYXRhLmNvbmZpZy5tdHU7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoY29uZiwgJmRhdGEuY29uZmlnLCBzaXplb2Yoc3RydWN0IGZyYWRfY29uZikpPy1FRkFVTFQ6MDsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgc2RsYV94ZmVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBzZGxhX21lbSBfX3VzZXIgKmluZm8sIGludCByZWFkKQoreworCXN0cnVjdCBzZGxhX21lbSBtZW07CisJY2hhcgkqdGVtcDsKKworCWlmKGNvcHlfZnJvbV91c2VyKCZtZW0sIGluZm8sIHNpemVvZihtZW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCQorCWlmIChyZWFkKQorCXsJCisJCXRlbXAgPSBrbWFsbG9jKG1lbS5sZW4sIEdGUF9LRVJORUwpOworCQlpZiAoIXRlbXApCisJCQlyZXR1cm4oLUVOT01FTSk7CisJCW1lbXNldCh0ZW1wLCAwLCBtZW0ubGVuKTsKKwkJc2RsYV9yZWFkKGRldiwgbWVtLmFkZHIsIHRlbXAsIG1lbS5sZW4pOworCQlpZihjb3B5X3RvX3VzZXIobWVtLmRhdGEsIHRlbXAsIG1lbS5sZW4pKQorCQl7CisJCQlrZnJlZSh0ZW1wKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWtmcmVlKHRlbXApOworCX0KKwllbHNlCisJeworCQl0ZW1wID0ga21hbGxvYyhtZW0ubGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF0ZW1wKQorCQkJcmV0dXJuKC1FTk9NRU0pOworCQlpZihjb3B5X2Zyb21fdXNlcih0ZW1wLCBtZW0uZGF0YSwgbWVtLmxlbikpCisJCXsKKwkJCWtmcmVlKHRlbXApOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJc2RsYV93cml0ZShkZXYsIG1lbS5hZGRyLCB0ZW1wLCBtZW0ubGVuKTsKKwkJa2ZyZWUodGVtcCk7CisJfQorCXJldHVybigwKTsKK30KKworc3RhdGljIGludCBzZGxhX3JlY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZyYWRfbG9jYWwgKmZscDsKKwlzdHJ1Y3QgY29uZl9kYXRhICBkYXRhOworCWludCAgICAgICAgICAgICAgIGksIGxlbjsKKworCWZscCA9IGRldi0+cHJpdjsKKworCWxlbiA9IDA7CisJZm9yKGk9MDtpPENPTkZJR19ETENJX01BWDtpKyspCisJCWlmIChmbHAtPmRsY2lbaV0pCisJCQlkYXRhLmRsY2lbbGVuKytdID0gZmxwLT5kbGNpW2ldOworCWxlbiAqPSAyOworCisJbWVtY3B5KCZkYXRhLCAmZmxwLT5jb25maWcsIHNpemVvZihzdHJ1Y3QgZnJhZF9jb25mKSk7CisJbGVuICs9IHNpemVvZihzdHJ1Y3QgZnJhZF9jb25mKTsKKworCXNkbGFfY21kKGRldiwgU0RMQV9ESVNBQkxFX0NPTU1VTklDQVRJT05TLCAwLCAwLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKwlzZGxhX2NtZChkZXYsIFNETEFfU0VUX0RMQ0lfQ09ORklHVVJBVElPTiwgMCwgMCwgJmRhdGEsIGxlbiwgTlVMTCwgTlVMTCk7CisJc2RsYV9jbWQoZGV2LCBTRExBX0VOQUJMRV9DT01NVU5JQ0FUSU9OUywgMCwgMCwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgc2RsYV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwOworCisJaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJCQorCWZscCA9IGRldi0+cHJpdjsKKworCWlmICghZmxwLT5pbml0aWFsaXplZCkKKwkJcmV0dXJuKC1FSU5WQUwpOworCisJc3dpdGNoIChjbWQpCisJeworCQljYXNlIEZSQURfR0VUX0NPTkY6CisJCWNhc2UgRlJBRF9TRVRfQ09ORjoKKwkJCXJldHVybihzZGxhX2NvbmZpZyhkZXYsIGlmci0+aWZyX2RhdGEsIGNtZCA9PSBGUkFEX0dFVF9DT05GKSk7CisKKwkJY2FzZSBTRExBX0lERU5USUZZOgorCQkJaWZyLT5pZnJfZmxhZ3MgPSBmbHAtPnR5cGU7CisJCQlicmVhazsKKworCQljYXNlIFNETEFfQ1BVU1BFRUQ6CisJCQlyZXR1cm4oc2RsYV9jcHVzcGVlZChkZXYsIGlmcikpOyAKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTk9URTogIFRoaXMgaXMgcmF0aGVyIGEgdXNlbGVzcyBhY3Rpb24gcmlnaHQgbm93LCBhcyB0aGUKKyAgICAgICBjdXJyZW50IGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHByb3RvY29scyBvdGhlciB0aGFuCisgICAgICAgRlIuICBIb3dldmVyLCBTYW5nb21hIGhhcyBtb2R1bGVzIGZvciBhIG51bWJlciBvZgorICAgICAgIG90aGVyIHByb3RvY29scyBpbiB0aGUgd29ya3MuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCQljYXNlIFNETEFfUFJPVE9DT0w6CisJCQlpZiAoZmxwLT5jb25maWd1cmVkKQorCQkJCXJldHVybigtRUFMUkVBRFkpOworCisJCQlzd2l0Y2ggKGlmci0+aWZyX2ZsYWdzKQorCQkJeworCQkJCWNhc2UgQVJQSFJEX0ZSQUQ6CisJCQkJCWRldi0+dHlwZSA9IGlmci0+aWZyX2ZsYWdzOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4oLUVOT1BST1RPT1BUKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU0RMQV9DTEVBUk1FTToKKwkJCXNkbGFfY2xlYXIoZGV2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0RMQV9XUklURU1FTToKKwkJY2FzZSBTRExBX1JFQURNRU06CisJCQlpZighY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJcmV0dXJuKHNkbGFfeGZlcihkZXYsIGlmci0+aWZyX2RhdGEsIGNtZCA9PSBTRExBX1JFQURNRU0pKTsKKworCQljYXNlIFNETEFfU1RBUlQ6CisJCQlzZGxhX3N0YXJ0KGRldik7CisJCQlicmVhazsKKworCQljYXNlIFNETEFfU1RPUDoKKwkJCXNkbGFfc3RvcChkZXYpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybigtRU9QTk9UU1VQUCk7CisJfQorCXJldHVybigwKTsKK30KKworaW50IHNkbGFfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwOworCisJZmxwID0gZGV2LT5wcml2OworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuKC1FQlVTWSk7CisKKwkvKiBmb3Igbm93LCB5b3UgY2FuJ3QgY2hhbmdlIHRoZSBNVFUhICovCisJcmV0dXJuKC1FT1BOT1RTVVBQKTsKK30KKworaW50IHNkbGFfc2V0X2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZtYXAgKm1hcCkKK3sKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwOworCWludCAgICAgICAgICAgICAgIGk7CisJY2hhciAgICAgICAgICAgICAgYnl0ZTsKKwl1bnNpZ25lZCBiYXNlOworCWludCBlcnIgPSAtRUlOVkFMOworCisJZmxwID0gZGV2LT5wcml2OworCisJaWYgKGZscC0+aW5pdGlhbGl6ZWQpCisJCXJldHVybigtRUlOVkFMKTsKKworCWZvcihpPTA7aSA8IHNpemVvZih2YWxpZF9wb3J0KSAvIHNpemVvZiAoaW50KSA7IGkrKykKKwkJaWYgKHZhbGlkX3BvcnRbaV0gPT0gbWFwLT5iYXNlX2FkZHIpCisJCQlicmVhazsgICAKKworCWlmIChpID09IHNpemVvZih2YWxpZF9wb3J0KSAvIHNpemVvZihpbnQpKQorCQlyZXR1cm4oLUVJTlZBTCk7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKG1hcC0+YmFzZV9hZGRyLCBTRExBX0lPX0VYVEVOVFMsIGRldi0+bmFtZSkpeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJTRExBOiBpby1wb3J0IDB4JTA0bHggaW4gdXNlIFxuIiwgZGV2LT5iYXNlX2FkZHIpOworCQlyZXR1cm4oLUVJTlZBTCk7CisJfQorCWJhc2UgPSBtYXAtPmJhc2VfYWRkcjsKKworCS8qIHRlc3QgZm9yIGNhcmQgdHlwZXMsIFM1MDJBLCBTNTAyRSwgUzUwNywgUzUwOCAgICAgICAgICAgICAgICAgKi8KKwkvKiB0aGVzZSB0ZXN0cyBzaHV0IGRvd24gdGhlIGNhcmQgY29tcGxldGVseSwgc28gY2xlYXIgdGhlIHN0YXRlICovCisJZmxwLT50eXBlID0gU0RMQV9VTktOT1dOOworCWZscC0+c3RhdGUgPSAwOworICAgCisJZm9yKGk9MTtpPFNETEFfSU9fRVhURU5UUztpKyspCisJCWlmIChpbmIoYmFzZSArIGkpICE9IDB4RkYpCisJCQlicmVhazsKKworCWlmIChpID09IFNETEFfSU9fRVhURU5UUykgeyAgIAorCQlvdXRiKFNETEFfSEFMVCwgYmFzZSArIFNETEFfUkVHX1o4MF9DT05UUk9MKTsKKwkJaWYgKChpbmIoYmFzZSArIFNETEFfUzUwMl9TVFMpICYgMHgwRikgPT0gMHgwOCkgeworCQkJb3V0YihTRExBX1M1MDJFX0lOVEFDSywgYmFzZSArIFNETEFfUkVHX0NPTlRST0wpOworCQkJaWYgKChpbmIoYmFzZSArIFNETEFfUzUwMl9TVFMpICYgMHgwRikgPT0gMHgwQykgeworCQkJCW91dGIoU0RMQV9IQUxULCBiYXNlICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQkJZmxwLT50eXBlID0gU0RMQV9TNTAyRTsKKwkJCQlnb3RvIGdvdF90eXBlOworCQkJfQorCQl9CisJfQorCisJZm9yKGJ5dGU9aW5iKGJhc2UpLGk9MDtpPFNETEFfSU9fRVhURU5UUztpKyspCisJCWlmIChpbmIoYmFzZSArIGkpICE9IGJ5dGUpCisJCQlicmVhazsKKworCWlmIChpID09IFNETEFfSU9fRVhURU5UUykgeworCQlvdXRiKFNETEFfSEFMVCwgYmFzZSArIFNETEFfUkVHX0NPTlRST0wpOworCQlpZiAoKGluYihiYXNlICsgU0RMQV9TNTAyX1NUUykgJiAweDdFKSA9PSAweDMwKSB7CisJCQlvdXRiKFNETEFfUzUwN19FTkFCTEUsIGJhc2UgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJCWlmICgoaW5iKGJhc2UgKyBTRExBX1M1MDJfU1RTKSAmIDB4N0UpID09IDB4MzIpIHsKKwkJCQlvdXRiKFNETEFfSEFMVCwgYmFzZSArIFNETEFfUkVHX0NPTlRST0wpOworCQkJCWZscC0+dHlwZSA9IFNETEFfUzUwNzsKKwkJCQlnb3RvIGdvdF90eXBlOworCQkJfQorCQl9CisJfQorCisJb3V0YihTRExBX0hBTFQsIGJhc2UgKyBTRExBX1JFR19DT05UUk9MKTsKKwlpZiAoKGluYihiYXNlICsgU0RMQV9TNTA4X1NUUykgJiAweDNGKSA9PSAweDAwKSB7CisJCW91dGIoU0RMQV9TNTA4X0lOVEVOLCBiYXNlICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCWlmICgoaW5iKGJhc2UgKyBTRExBX1M1MDhfU1RTKSAmIDB4M0YpID09IDB4MTApIHsKKwkJCW91dGIoU0RMQV9IQUxULCBiYXNlICsgU0RMQV9SRUdfQ09OVFJPTCk7CisJCQlmbHAtPnR5cGUgPSBTRExBX1M1MDg7CisJCQlnb3RvIGdvdF90eXBlOworCQl9CisJfQorCisJb3V0YihTRExBX1M1MDJBX0hBTFQsIGJhc2UgKyBTRExBX1JFR19DT05UUk9MKTsKKwlpZiAoaW5iKGJhc2UgKyBTRExBX1M1MDJfU1RTKSA9PSAweDQwKSB7CisJCW91dGIoU0RMQV9TNTAyQV9TVEFSVCwgYmFzZSArIFNETEFfUkVHX0NPTlRST0wpOworCQlpZiAoaW5iKGJhc2UgKyBTRExBX1M1MDJfU1RTKSA9PSAweDQwKSB7CisJCQlvdXRiKFNETEFfUzUwMkFfSU5URU4sIGJhc2UgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJCWlmIChpbmIoYmFzZSArIFNETEFfUzUwMl9TVFMpID09IDB4NDQpIHsKKwkJCQlvdXRiKFNETEFfUzUwMkFfU1RBUlQsIGJhc2UgKyBTRExBX1JFR19DT05UUk9MKTsKKwkJCQlmbHAtPnR5cGUgPSBTRExBX1M1MDJBOworCQkJCWdvdG8gZ290X3R5cGU7CisJCQl9CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBVbmtub3duIGNhcmQgdHlwZVxuIiwgZGV2LT5uYW1lKTsKKwllcnIgPSAtRU5PREVWOworCWdvdG8gZmFpbDsKKworZ290X3R5cGU6CisJc3dpdGNoKGJhc2UpIHsKKwkJY2FzZSAweDI3MDoKKwkJY2FzZSAweDI4MDoKKwkJY2FzZSAweDM4MDogCisJCWNhc2UgMHgzOTA6CisJCQlpZiAoZmxwLT50eXBlICE9IFNETEFfUzUwOCAmJiBmbHAtPnR5cGUgIT0gU0RMQV9TNTA3KQorCQkJCWdvdG8gZmFpbDsKKwl9CisKKwlzd2l0Y2ggKG1hcC0+aXJxKSB7CisJCWNhc2UgMjoKKwkJCWlmIChmbHAtPnR5cGUgIT0gU0RMQV9TNTAyRSkKKwkJCQlnb3RvIGZhaWw7CisJCQlicmVhazsKKworCQljYXNlIDEwOgorCQljYXNlIDExOgorCQljYXNlIDEyOgorCQljYXNlIDE1OgorCQljYXNlIDQ6CisJCQlpZiAoZmxwLT50eXBlICE9IFNETEFfUzUwOCAmJiBmbHAtPnR5cGUgIT0gU0RMQV9TNTA3KQorCQkJCWdvdG8gZmFpbDsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCWNhc2UgNToKKwkJY2FzZSA3OgorCQkJaWYgKGZscC0+dHlwZSA9PSBTRExBX1M1MDJBKQorCQkJCWdvdG8gZmFpbDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlnb3RvIGZhaWw7CisJfQorCisJZXJyID0gLUVBR0FJTjsKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICZzZGxhX2lzciwgMCwgZGV2LT5uYW1lLCBkZXYpKSAKKwkJZ290byBmYWlsOworCisJaWYgKGZscC0+dHlwZSA9PSBTRExBX1M1MDcpIHsKKwkJc3dpdGNoKGRldi0+aXJxKSB7CisJCQljYXNlIDM6CisJCQkJZmxwLT5zdGF0ZSA9IFNETEFfUzUwN19JUlEzOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCWZscC0+c3RhdGUgPSBTRExBX1M1MDdfSVJRNDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCQlmbHAtPnN0YXRlID0gU0RMQV9TNTA3X0lSUTU7CisJCQkJYnJlYWs7CisJCQljYXNlIDc6CisJCQkJZmxwLT5zdGF0ZSA9IFNETEFfUzUwN19JUlE3OworCQkJCWJyZWFrOworCQkJY2FzZSAxMDoKKwkJCQlmbHAtPnN0YXRlID0gU0RMQV9TNTA3X0lSUTEwOworCQkJCWJyZWFrOworCQkJY2FzZSAxMToKKwkJCQlmbHAtPnN0YXRlID0gU0RMQV9TNTA3X0lSUTExOworCQkJCWJyZWFrOworCQkJY2FzZSAxMjoKKwkJCQlmbHAtPnN0YXRlID0gU0RMQV9TNTA3X0lSUTEyOworCQkJCWJyZWFrOworCQkJY2FzZSAxNToKKwkJCQlmbHAtPnN0YXRlID0gU0RMQV9TNTA3X0lSUTE1OworCQkJCWJyZWFrOworCQl9CisJfQorCisJZm9yKGk9MDtpIDwgc2l6ZW9mKHZhbGlkX21lbSkgLyBzaXplb2YgKGludCkgOyBpKyspCisJCWlmICh2YWxpZF9tZW1baV0gPT0gbWFwLT5tZW1fc3RhcnQpCisJCQlicmVhazsgICAKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKGkgPT0gc2l6ZW9mKHZhbGlkX21lbSkgLyBzaXplb2YoaW50KSkKKwkJZ290byBmYWlsMjsKKworCWlmIChmbHAtPnR5cGUgPT0gU0RMQV9TNTAyQSAmJiAobWFwLT5tZW1fc3RhcnQgJiAweEYwMDApID4+IDEyID09IDB4MEUpCisJCWdvdG8gZmFpbDI7CisKKwlpZiAoZmxwLT50eXBlICE9IFNETEFfUzUwNyAmJiBtYXAtPm1lbV9zdGFydCA+PiAxNiA9PSAweDBCKQorCQlnb3RvIGZhaWwyOworCisJaWYgKGZscC0+dHlwZSA9PSBTRExBX1M1MDcgJiYgbWFwLT5tZW1fc3RhcnQgPj4gMTYgPT0gMHgwRCkKKwkJZ290byBmYWlsMjsKKworCWJ5dGUgPSBmbHAtPnR5cGUgIT0gU0RMQV9TNTA4ID8gU0RMQV84S19XSU5ET1cgOiAwOworCWJ5dGUgfD0gKG1hcC0+bWVtX3N0YXJ0ICYgMHhGMDAwKSA+PiAoMTIgKyAoZmxwLT50eXBlID09IFNETEFfUzUwOCA/IDEgOiAwKSk7CisJc3dpdGNoKGZscC0+dHlwZSkgeworCQljYXNlIFNETEFfUzUwMkE6CisJCWNhc2UgU0RMQV9TNTAyRToKKwkJCXN3aXRjaCAobWFwLT5tZW1fc3RhcnQgPj4gMTYpIHsKKwkJCQljYXNlIDB4MEE6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTAyX1NFR19BOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MEM6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTAyX1NFR19DOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MEQ6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTAyX1NFR19EOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MEU6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTAyX1NFR19FOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNETEFfUzUwNzoKKwkJCXN3aXRjaCAobWFwLT5tZW1fc3RhcnQgPj4gMTYpIHsKKwkJCQljYXNlIDB4MEE6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTA3X1NFR19BOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MEI6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTA3X1NFR19COworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MEM6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTA3X1NFR19DOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MEU6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTA3X1NFR19FOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNETEFfUzUwODoKKwkJCXN3aXRjaCAobWFwLT5tZW1fc3RhcnQgPj4gMTYpIHsKKwkJCQljYXNlIDB4MEE6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTA4X1NFR19BOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MEM6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTA4X1NFR19DOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MEQ6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTA4X1NFR19EOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MEU6CisJCQkJCWJ5dGUgfD0gU0RMQV9TNTA4X1NFR19FOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCX0KKworCS8qIHNldCB0aGUgbWVtb3J5IGJpdHMsIGFuZCBlbmFibGUgYWNjZXNzICovCisJb3V0YihieXRlLCBiYXNlICsgU0RMQV9SRUdfUENfV0lORE9XKTsKKworCXN3aXRjaChmbHAtPnR5cGUpCisJeworCQljYXNlIFNETEFfUzUwMkU6CisJCQlmbHAtPnN0YXRlID0gU0RMQV9TNTAyRV9FTkFCTEU7CisJCQlicmVhazsKKwkJY2FzZSBTRExBX1M1MDc6CisJCQlmbHAtPnN0YXRlIHw9IFNETEFfTUVNRU47CisJCQlicmVhazsKKwkJY2FzZSBTRExBX1M1MDg6CisJCQlmbHAtPnN0YXRlID0gU0RMQV9NRU1FTjsKKwkJCWJyZWFrOworCX0KKwlvdXRiKGZscC0+c3RhdGUsIGJhc2UgKyBTRExBX1JFR19DT05UUk9MKTsKKworCWRldi0+aXJxID0gbWFwLT5pcnE7CisJZGV2LT5iYXNlX2FkZHIgPSBiYXNlOworCWRldi0+bWVtX3N0YXJ0ID0gbWFwLT5tZW1fc3RhcnQ7CisJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyAweDIwMDA7CisJZmxwLT5pbml0aWFsaXplZCA9IDE7CisJcmV0dXJuIDA7CisKK2ZhaWwyOgorCWZyZWVfaXJxKG1hcC0+aXJxLCBkZXYpOworZmFpbDoKKwlyZWxlYXNlX3JlZ2lvbihiYXNlLCBTRExBX0lPX0VYVEVOVFMpOworCXJldHVybiBlcnI7Cit9CisgCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnNkbGFfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwOworCWZscCA9IGRldi0+cHJpdjsKKworCXJldHVybigmZmxwLT5zdGF0cyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX3NkbGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwID0gZGV2LT5wcml2OworCisJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlkZXYtPmZsYWdzCQk9IDA7CisJZGV2LT50eXBlCQk9IDB4RkZGRjsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbgk9IDA7CisJZGV2LT5hZGRyX2xlbgkJPSAwOworCWRldi0+bXR1CQk9IFNETEFfTUFYX01UVTsKKworCWRldi0+b3BlbgkJPSBzZGxhX29wZW47CisJZGV2LT5zdG9wCQk9IHNkbGFfY2xvc2U7CisJZGV2LT5kb19pb2N0bAkJPSBzZGxhX2lvY3RsOworCWRldi0+c2V0X2NvbmZpZwkJPSBzZGxhX3NldF9jb25maWc7CisJZGV2LT5nZXRfc3RhdHMJCT0gc2RsYV9zdGF0czsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9IHNkbGFfdHJhbnNtaXQ7CisJZGV2LT5jaGFuZ2VfbXR1CQk9IHNkbGFfY2hhbmdlX210dTsKKworCWZscC0+YWN0aXZhdGUJCT0gc2RsYV9hY3RpdmF0ZTsKKwlmbHAtPmRlYWN0aXZhdGUJCT0gc2RsYV9kZWFjdGl2YXRlOworCWZscC0+YXNzb2MJCT0gc2RsYV9hc3NvYzsKKwlmbHAtPmRlYXNzb2MJCT0gc2RsYV9kZWFzc29jOworCWZscC0+ZGxjaV9jb25mCQk9IHNkbGFfZGxjaV9jb25mOworCisJaW5pdF90aW1lcigmZmxwLT50aW1lcik7CisJZmxwLT50aW1lci5leHBpcmVzCT0gMTsKKwlmbHAtPnRpbWVyLmRhdGEJCT0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKwlmbHAtPnRpbWVyLmZ1bmN0aW9uCT0gc2RsYV9wb2xsOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnNkbGE7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfc2RsYSh2b2lkKQoreworCWludCBlcnI7CisKKwlwcmludGsoIiVzLlxuIiwgdmVyc2lvbik7CisKKwlzZGxhID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgZnJhZF9sb2NhbCksICJzZGxhMCIsIHNldHVwX3NkbGEpOworCWlmICghc2RsYSkgCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KHNkbGEpOworCWlmIChlcnIpIAorCQlmcmVlX25ldGRldihzZGxhKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3NkbGEodm9pZCkKK3sKKwlzdHJ1Y3QgZnJhZF9sb2NhbCAqZmxwID0gc2RsYS0+cHJpdjsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KHNkbGEpOworCWlmIChmbHAtPmluaXRpYWxpemVkKSB7CisJCWZyZWVfaXJxKHNkbGEtPmlycSwgc2RsYSk7CisJCXJlbGVhc2VfcmVnaW9uKHNkbGEtPmJhc2VfYWRkciwgU0RMQV9JT19FWFRFTlRTKTsKKwl9CisJZGVsX3RpbWVyX3N5bmMoJmZscC0+dGltZXIpOworCWZyZWVfbmV0ZGV2KHNkbGEpOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGluaXRfc2RsYSk7Cittb2R1bGVfZXhpdChleGl0X3NkbGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NkbGFfY2hkbGMuYyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhX2NoZGxjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiZTAwMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhX2NoZGxjLmMKQEAgLTAsMCArMSw0NDMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogc2RsYV9jaGRsYy5jCVdBTlBJUEUodG0pIE11bHRpcHJvdG9jb2wgV0FOIExpbmsgRHJpdmVyLiBDaXNjbyBIRExDIG1vZHVsZS4KKyoKKyogQXV0aG9yczogCU5lbmFkIENvcmJpYyA8bmNvcmJpY0BzYW5nb21hLmNvbT4KKyoJCUdpZGVvbiBIYWNrICAKKyoKKyogQ29weXJpZ2h0OgkoYykgMTk5NS0yMDAxIFNhbmdvbWEgVGVjaG5vbG9naWVzIEluYy4KKyoKKyoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogRmViIDI4LCAyMDAxICBOZW5hZCBDb3JiaWMJVXBkYXRlZCBpZl90eF90aW1lb3V0KCkgcm91dGluZSBmb3IgCisqIAkJCQkyLjQuWCBrZXJuZWxzLgorKiBKYW4gMjUsIDIwMDEgIE5lbmFkIENvcmJpYwlBZGRlZCBhIFRUWSBTeW5jIHNlcmlhbCBkcml2ZXIgb3ZlciB0aGUKKyogCQkJCUhETEMgc3RyZWFtaW5nIHByb3RvY29sCisqIAkJCQlBZGRlZCBhIFRUWSBBc3luYyBzZXJpYWwgZHJpdmVyIG92ZXIgdGhlCisqIAkJCQlBc3luYyBwcm90b2NvbC4KKyogRGVjIDE1LCAyMDAwICBOZW5hZCBDb3JiaWMgICAgVXBkYXRlZCBmb3IgMi40LlggS2VybmVsIHN1cHBvcnQKKyogTm92IDEzLCAyMDAwICBOZW5hZCBDb3JiaWMgICAgQWRkZWQgdHJ1ZSBpbnRlcmZhY2UgdHlwZSBlbmNvZGluZyBvcHRpb24uCisqIAkJCQlUY3BkdW1wIGRvZXNuJ3Qgc3VwcG9ydCBDSERMQyBpbnRlZmFjZQorKiAJCQkJdHlwZXMsIHRvIGZpeCB0aGlzICJ0cnVlIHR5cGUiIG9wdGlvbiB3aWxsIHNldAorKiAJCQkJdGhlIGludGVyZmFjZSB0eXBlIHRvIFJBVyBJUCBtb2RlLgorKiBOb3YgMDcsIDIwMDAgIE5lbmFkIENvcmJpYwlBZGRlZCBzZWN1cml0eSBmZWF0dXJlcyBmb3IgVURQIGRlYnVnZ2luZzoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVueSBhbGwgYW5kIHNwZWNpZnkgYWxsb3dlZCByZXF1ZXN0cy4KKyogSnVuIDIwLCAyMDAwICBOZW5hZCBDb3JiaWMJRml4ZWQgdGhlIEFQSSBJUCBFUlJPUiBidWcuIENhdXNlZCBieSB0aGUgCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdCB1cGRhdGUuCisqIE1heSAwOSwgMjAwMAlOZW5hZCBDb3JiaWMJT3B0aW9uIHRvIGJyaW5nIGRvd24gYW4gaW50ZXJmYWNlCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwb24gZGlzY29ubmVjdC4KKyogTWFyIDIzLCAyMDAwICBOZW5hZCBDb3JiaWMJSW1wcm92ZWQgdGFzayBxdWV1ZSwgYmggaGFuZGxpbmcuCisqIE1hciAxNiwgMjAwMAlOZW5hZCBDb3JiaWMJRml4ZWQgdGhlIFNMQVJQIER5bmFtaWMgSVAgYWRkcmVzc2luZy4KKyogTWFyIDA2LCAyMDAwICBOZW5hZCBDb3JiaWMJQnVnIEZpeDogY29ycnVwdGVkIG1ib3ggcmVjb3ZlcnkuCisqIEZlYiAxMCwgMjAwMCAgR2lkZW9uIEhhY2sgICAgIEFkZGVkIEFTWU5DIHN1cHBvcnQuCisqIEZlYiAwOSwgMjAwMCAgTmVuYWQgQ29yYmljICAgIEZpeGVkIHR3byBzaHV0ZG93biBidWdzIGluIHVwZGF0ZSgpIGFuZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9zdGF0cygpIGZ1bmN0aW9ucy4KKyogSmFuIDI0LCAyMDAwICBOZW5hZCBDb3JiaWMgICAgRml4ZWQgYSBzdGFydHVwIHdhbnBpcGUgc3RhdGUgcmFjaW5nLCAgCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiBiZXR3ZWVuIGlmX29wZW4gYW5kIGlzci4gCisqIEphbiAxMCwgMjAwMCAgTmVuYWQgQ29yYmljICAgIEFkZGVkIG5ldyBzb2NrZXQgQVBJIHN1cHBvcnQuCisqIERldiAxNSwgMTk5OSAgTmVuYWQgQ29yYmljICAgIEZpeGVkIHVwIGhlYWRlciBmaWxlcyBmb3IgMi4wLlgga2VybmVscworKiBOb3YgMjAsIDE5OTkgIE5lbmFkIENvcmJpYyAJRml4ZWQgemVybyBsZW5ndGggQVBJIGJ1Zy4KKyogU2VwIDMwLCAxOTk5ICBOZW5hZCBDb3JiaWMgICAgRml4ZWQgZHluYW1pYyBJUCBhbmQgcm91dGUgc2V0dXAuCisqIFNlcCAyMywgMTk5OSAgTmVuYWQgQ29yYmljICAgIEFkZGVkIFNNUCBzdXBwb3J0LCBmaXhlZCB0cmFjaW5nIAorKiBTZXAgMTMsIDE5OTkgIE5lbmFkIENvcmJpYwlTcGxpdCB1cCBQb3J0IDAgYW5kIDEgaW50byBzZXBhcmF0ZSBkZXZpY2VzLgorKiBKdW4gMDIsIDE5OTkgIEdpZGVvbiBIYWNrICAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgUzUxNCBhZGFwdGVyLgorKiBPY3QgMzAsIDE5OTgJSmFzcHJlZXQgU2luZ2gJQWRkZWQgU3VwcG9ydCBmb3IgQ0hETEMgQVBJIChIRExDIFNUUkVBTUlORykuCisqIE9jdCAyOCwgMTk5OAlKYXNwcmVldCBTaW5naAlBZGRlZCBTdXBwb3J0IGZvciBEdWFsIFBvcnQgQ0hETEMuCisqIEF1ZyAwNywgMTk5OAlEYXZpZCBGb25nCUluaXRpYWwgdmVyc2lvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIHByaW50aygpLCBhbmQgb3RoZXIgdXNlZnVsIHN0dWZmICovCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CS8qIG9mZnNldG9mKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgkvKiByZXR1cm4gY29kZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4JLyogaW5saW5lIG1lbXNldCgpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgkvKiBrbWFsbG9jKCksIGtmcmVlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC93YW5yb3V0ZXIuaD4JLyogV0FOIHJvdXRlciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L3dhbnBpcGUuaD4JLyogV0FOUElQRSBjb21tb24gdXNlciBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4JLyogQVJQSFJEXyogZGVmaW5lcyAqLworCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L2luLmg+CQkvKiBzb2NrYWRkcl9pbiAqLworI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4JCisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CS8qIGh0b25zKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9zZGxhcGNpLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zZGxhX2NoZGxjLmg+CQkvKiBDSERMQyBmaXJtd2FyZSBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9zZGxhX2FzeS5oPiAgICAgICAgICAgCS8qIENIRExDIChhc3luYykgQVBJIGRlZmluaXRpb25zICovCisKKyNpbmNsdWRlIDxsaW51eC9pZl93YW5waXBlX2NvbW1vbi5oPiAgICAvKiBTb2NrZXQgRHJpdmVyIGNvbW1vbiBhcmVhICovCisjaW5jbHVkZSA8bGludXgvaWZfd2FucGlwZS5oPgkJCisKKy8qIFRUWSBJbmNsdWRlcyAqLworI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisKKworLyoqKioqKiBEZWZpbmVzICYgTWFjcm9zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHJlYXNvbnMgZm9yIGVuYWJsaW5nIHRoZSB0aW1lciBpbnRlcnJ1cHQgb24gdGhlIGFkYXB0ZXIgKi8KKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX1VEUCAgIAkJMHgwMQorI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfVVBEQVRFCQkweDAyCisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9DT05GSUcJCTB4MTAKKworI2RlZmluZSBNQVhfSVBfRVJST1JTCTEwCisKKyNkZWZpbmUgVFRZX0NIRExDX01BWF9NVFUJMjAwMAorI2RlZmluZQlDSERMQ19ERkxUX0RBVEFfTEVOCTE1MDAJCS8qIGRlZmF1bHQgTVRVICovCisjZGVmaW5lIENIRExDX0hEUl9MRU4JCTEKKworI2RlZmluZSBDSERMQ19BUEkgMHgwMQorCisjZGVmaW5lIFBPUlQoeCkgICAoeCA9PSAwID8gIlBSSU1BUlkiIDogIlNFQ09OREFSWSIgKQorI2RlZmluZSBNQVhfQkhfQlVGRgkxMAorCisvLyNkZWZpbmUgUFJJTlRfREVCVUcKKyNpZmRlZiBQUklOVF9ERUJVRworI2RlZmluZSBkYmdfcHJpbnRrKGZvcm1hdCwgYS4uLikgcHJpbnRrKGZvcm1hdCwgIyMgYSkKKyNlbHNlCisjZGVmaW5lIGRiZ19wcmludGsoZm9ybWF0LCBhLi4uKQorI2VuZGlmICAKKworLyoqKioqKkRhdGEgU3RydWN0dXJlcyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGlzIHN0cnVjdHVyZSBpcyBwbGFjZWQgaW4gdGhlIHByaXZhdGUgZGF0YSBhcmVhIG9mIHRoZSBkZXZpY2Ugc3RydWN0dXJlLgorICogVGhlIGNhcmQgc3RydWN0dXJlIHVzZWQgdG8gb2NjdXB5IHRoZSBwcml2YXRlIGFyZWEgYnV0IG5vdyB0aGUgZm9sbG93aW5nIAorICogc3RydWN0dXJlIHdpbGwgaW5jb3Jwb3JhdGUgdGhlIGNhcmQgc3RydWN0dXJlIGFsb25nIHdpdGggQ0hETEMgc3BlY2lmaWMgZGF0YQorICovCisKK3R5cGVkZWYgc3RydWN0IGNoZGxjX3ByaXZhdGVfYXJlYQoreworCXdhbnBpcGVfY29tbW9uX3QgY29tbW9uOworCXNkbGFfdAkJKmNhcmQ7CisJaW50IAkJVHJhY2luZ0VuYWJsZWQ7CQkvKiBGb3IgZW5hYmxpbmcgVHJhY2luZyAqLworCXVuc2lnbmVkIGxvbmcgCWN1cnJfdHJhY2VfYWRkcjsJLyogVXNlZCBmb3IgVHJhY2luZyAqLworCXVuc2lnbmVkIGxvbmcgCXN0YXJ0X3RyYWNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyAJZW5kX3RyYWNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyAJYmFzZV9hZGRyX3RyYWNlX2J1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIAllbmRfYWRkcl90cmFjZV9idWZmZXI7CisJdW5zaWduZWQgc2hvcnQgCW51bWJlcl90cmFjZV9lbGVtZW50czsKKwl1bnNpZ25lZCAgCWF2YWlsYWJsZV9idWZmZXJfc3BhY2U7CisJdW5zaWduZWQgbG9uZyAJcm91dGVyX3N0YXJ0X3RpbWU7CisJdW5zaWduZWQgY2hhciAJcm91dGVfc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgCXJvdXRlX3JlbW92ZWQ7CisJdW5zaWduZWQgbG9uZyAJdGlja19jb3VudGVyOwkJLyogRm9yIDVzIHRpbWVvdXQgY291bnRlciAqLworCXVuc2lnbmVkIGxvbmcgCXJvdXRlcl91cF90aW1lOworICAgICAgICB1MzIgICAgICAgICAgICAgSVBfYWRkcmVzczsJCS8qIElQIGFkZHJlc3NpbmcgKi8KKyAgICAgICAgdTMyICAgICAgICAgICAgIElQX25ldG1hc2s7CisJdTMyCQlpcF9sb2NhbDsKKwl1MzIJCWlwX3JlbW90ZTsKKwl1MzIgCQlpcF9sb2NhbF90bXA7CisJdTMyCQlpcF9yZW1vdGVfdG1wOworCXU4CQlpcF9lcnJvcjsKKwl1OAkJY29uZmlnX2NoZGxjOworCXU4IAkJY29uZmlnX2NoZGxjX3RpbWVvdXQ7CisJdW5zaWduZWQgY2hhciAgbWM7CQkJLyogTXVsaXRjYXN0IHN1cHBvcnQgb24vb2ZmICovCisJdW5zaWduZWQgc2hvcnQgdWRwX3BrdF9sZ3RoOwkJLyogdWRwIHBhY2tldCBwcm9jZXNzaW5nICovCisJY2hhciB1ZHBfcGt0X3NyYzsKKwljaGFyIHVkcF9wa3RfZGF0YVtNQVhfTEdUSF9VRFBfTUdOVF9QS1RdOworCXVuc2lnbmVkIHNob3J0IHRpbWVyX2ludF9lbmFibGVkOworCWNoYXIgdXBkYXRlX2NvbW1zX3N0YXRzOwkJLyogdXBkYXRpbmcgY29tbXMgc3RhdHMgKi8KKworCWJoX2RhdGFfdCAqYmhfaGVhZDsJICAJICAvKiBDaXJjdWxhciBidWZmZXIgZm9yIGNoZGxjX2JoICovCisJdW5zaWduZWQgbG9uZyAgdHFfd29ya2luZzsKKwl2b2xhdGlsZSBpbnQgIGJoX3dyaXRlOworCXZvbGF0aWxlIGludCAgYmhfcmVhZDsKKwlhdG9taWNfdCAgYmhfYnVmZl91c2VkOworCQorCXVuc2lnbmVkIGNoYXIgaW50ZXJmYWNlX2Rvd247CisKKwkvKiBQb2xsaW5nIHdvcmsgcXVldWUgZW50cnkuIEVhY2ggaW50ZXJmYWNlCisgICAgICAgICAqIGhhcyBpdHMgb3duIHdvcmsgcXVldWUgZW50cnksIHdoaWNoIGlzIHVzZWQKKyAgICAgICAgICogdG8gZGVmZXIgZXZlbnRzIGZyb20gdGhlIGludGVycnVwdCAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCBwb2xsX3dvcms7CisJc3RydWN0IHRpbWVyX2xpc3QgcG9sbF9kZWxheV90aW1lcjsKKworCXU4IGdhdGV3YXk7CisJdTggdHJ1ZV9pZl9lbmNvZGluZzsKKwkvL0ZJWE1FOiBhZGQgZHJpdmVyIHN0YXRzIGFzIHBlciBmcmFtZSByZWxheSEKKworfSBjaGRsY19wcml2YXRlX2FyZWFfdDsKKworLyogUm91dGUgU3RhdHVzIG9wdGlvbnMgKi8KKyNkZWZpbmUgTk9fUk9VVEUJMHgwMAorI2RlZmluZSBBRERfUk9VVEUJMHgwMQorI2RlZmluZSBST1VURV9BRERFRAkweDAyCisjZGVmaW5lIFJFTU9WRV9ST1VURQkweDAzCisKKworLyogdmFyaWFibGUgZm9yIGtlZXBpbmcgdHJhY2sgb2YgZW5hYmxpbmcvZGlzYWJsaW5nIEZUMSBtb25pdG9yIHN0YXR1cyAqLworc3RhdGljIGludCByQ291bnQgPSAwOworCisvKiB2YXJpYWJsZSBmb3IgdHJhY2tpbmcgaG93IG1hbnkgaW50ZXJmYWNlcyB0byBvcGVuIGZvciBXQU5QSVBFIG9uIHRoZQorICAgdHdvIHBvcnRzICovCisKK2V4dGVybiB2b2lkIGRpc2FibGVfaXJxKHVuc2lnbmVkIGludCk7CitleHRlcm4gdm9pZCBlbmFibGVfaXJxKHVuc2lnbmVkIGludCk7CisKKy8qKioqKiogRnVuY3Rpb24gUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogV0FOIGxpbmsgZHJpdmVyIGVudHJ5IHBvaW50cy4gVGhlc2UgYXJlIGNhbGxlZCBieSB0aGUgV0FOIHJvdXRlciBtb2R1bGUuICovCitzdGF0aWMgaW50IHVwZGF0ZShzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2KTsKK3N0YXRpYyBpbnQgbmV3X2lmKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCSAgd2FuaWZfY29uZl90KiBjb25mKTsKKworLyogTmV0d29yayBkZXZpY2UgaW50ZXJmYWNlICovCitzdGF0aWMgaW50IGlmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitzdGF0aWMgaW50IGlmX29wZW4oc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitzdGF0aWMgaW50IGlmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworc3RhdGljIGludCBpZl9oZWFkZXIoc3RydWN0IHNrX2J1ZmYqIHNrYiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKwkJICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLCB2b2lkKiBkYWRkciwgdm9pZCogc2FkZHIsCisJCSAgICAgdW5zaWduZWQgbGVuKTsKKworc3RhdGljIGludCBpZl9yZWJ1aWxkX2hkciAoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqIGlmX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworICAKK3N0YXRpYyBpbnQgaWZfc2VuZChzdHJ1Y3Qgc2tfYnVmZiogc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKKworLyogQ0hETEMgRmlybXdhcmUgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBjaGRsY19jb25maWd1cmUgCShzZGxhX3QqIGNhcmQsIHZvaWQqIGRhdGEpOworc3RhdGljIGludCBjaGRsY19jb21tX2VuYWJsZSAJKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IGNoZGxjX3JlYWRfdmVyc2lvbiAJKHNkbGFfdCogY2FyZCwgY2hhciogc3RyKTsKK3N0YXRpYyBpbnQgY2hkbGNfc2V0X2ludHJfbW9kZSAJKHNkbGFfdCogY2FyZCwgdW5zaWduZWQgbW9kZSk7CitzdGF0aWMgaW50IGNoZGxjX3NlbmQgKHNkbGFfdCogY2FyZCwgdm9pZCogZGF0YSwgdW5zaWduZWQgbGVuKTsKK3N0YXRpYyBpbnQgY2hkbGNfcmVhZF9jb21tX2Vycl9zdGF0cyAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBpbnQgY2hkbGNfcmVhZF9vcF9zdGF0cyAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBpbnQgY2hkbGNfZXJyb3IgKHNkbGFfdCAqY2FyZCwgaW50IGVyciwgQ0hETENfTUFJTEJPWF9TVFJVQ1QgKm1iKTsKKworCitzdGF0aWMgaW50IGNoZGxjX2Rpc2FibGVfY29tbV9zaHV0ZG93biAoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIGlmX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIE1pc2NlbGxhbmVvdXMgQ0hETEMgRnVuY3Rpb25zICovCitzdGF0aWMgaW50IHNldF9jaGRsY19jb25maWcgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgdm9pZCBpbml0X2NoZGxjX3R4X3J4X2J1ZmYoIHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IHByb2Nlc3NfY2hkbGNfZXhjZXB0aW9uKHNkbGFfdCAqY2FyZCk7CitzdGF0aWMgaW50IHByb2Nlc3NfZ2xvYmFsX2V4Y2VwdGlvbihzZGxhX3QgKmNhcmQpOworc3RhdGljIGludCB1cGRhdGVfY29tbXNfc3RhdHMoc2RsYV90KiBjYXJkLAorICAgICAgICBjaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhKTsKK3N0YXRpYyBpbnQgY29uZmlndXJlX2lwIChzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCB1bmNvbmZpZ3VyZV9pcCAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyB2b2lkIHByb2Nlc3Nfcm91dGUoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIHBvcnRfc2V0X3N0YXRlIChzZGxhX3QgKmNhcmQsIGludCk7CitzdGF0aWMgaW50IGNvbmZpZ19jaGRsYyAoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIGRpc2FibGVfY29tbSAoc2RsYV90ICpjYXJkKTsKKworc3RhdGljIHZvaWQgdHJpZ2dlcl9jaGRsY19wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgY2hkbGNfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGNoZGxjX3BvbGxfZGVsYXkgKHVuc2lnbmVkIGxvbmcgZGV2X3B0cik7CisKKworLyogTWlzY2VsbGFuZW91cyBhc3luY2hyb25vdXMgaW50ZXJmYWNlIEZ1bmN0aW9ucyAqLworc3RhdGljIGludCBzZXRfYXN5X2NvbmZpZyAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBpbnQgYXN5X2NvbW1fZW5hYmxlIChzZGxhX3QqIGNhcmQpOworCisvKiBJbnRlcnJ1cHQgaGFuZGxlcnMgKi8KK3N0YXRpYyB2b2lkIHdwY19pc3IgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgdm9pZCByeF9pbnRyIChzZGxhX3QqIGNhcmQpOworc3RhdGljIHZvaWQgdGltZXJfaW50cihzZGxhX3QgKik7CisKKy8qIEJvdHRvbSBoYWxmIGhhbmRsZXJzICovCitzdGF0aWMgdm9pZCBjaGRsY193b3JrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBjaGRsY193b3JrX2NsZWFudXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGJoX2VucXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKy8qIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IGNoa19iY2FzdF9tY2FzdF9hZGRyKHNkbGFfdCogY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgcmVwbHlfdWRwKCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgbWJveF9sZW4gKTsKK3N0YXRpYyBpbnQgaW50cl90ZXN0KCBzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCB1ZHBfcGt0X3R5cGUoIHN0cnVjdCBza19idWZmICpza2IgLCBzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCBzdG9yZV91ZHBfbWdtdF9wa3QoY2hhciB1ZHBfcGt0X3NyYywgc2RsYV90KiBjYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhKTsKK3N0YXRpYyBpbnQgcHJvY2Vzc191ZHBfbWdtdF9wa3Qoc2RsYV90KiBjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCAgCisJCQkJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSk7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgY2FsY19jaGVja3N1bSAoY2hhciAqLCBpbnQpOworc3RhdGljIHZvaWQgczUwOF9sb2NrIChzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncyk7CitzdGF0aWMgdm9pZCBzNTA4X3VubG9jayAoc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpOworCisKK3N0YXRpYyBpbnQgIEludHJfdGVzdF9jb3VudGVyOworCisvKiBUVFkgR2xvYmFsIERlZmluaXRpb25zICovCisKKyNkZWZpbmUgTlJfUE9SVFMgNAorI2RlZmluZSBXQU5fVFRZX01BSk9SIDIyNgorI2RlZmluZSBXQU5fVFRZX01JTk9SIDAKKworI2RlZmluZSBXQU5fQ0FSRChwb3J0KSAodHR5X2NhcmRfbWFwW3BvcnRdKQorI2RlZmluZSBNSU5fUE9SVCAwCisjZGVmaW5lIE1BWF9QT1JUIE5SX1BPUlRTLTEgCisKKyNkZWZpbmUgQ1JDX0xFTkdUSCAyCisKK3N0YXRpYyBpbnQgd2FucGlwZV90dHlfaW5pdChzZGxhX3QgKmNhcmQpOworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfcmVjZWl2ZShzZGxhX3QgKiwgdW5zaWduZWQsIHVuc2lnbmVkIGludCk7CitzdGF0aWMgdm9pZCB3YW5waXBlX3R0eV90cmlnZ2VyX3BvbGwoc2RsYV90ICpjYXJkKTsKKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyIHNlcmlhbF9kcml2ZXI7CitzdGF0aWMgaW50IHR0eV9pbml0X2NudD0wOworCitzdGF0aWMgc3RydWN0IHNlcmlhbF9zdGF0ZSByc190YWJsZVtOUl9QT1JUU107CisKK3N0YXRpYyBjaGFyIHR0eV9kcml2ZXJfbW9kZT1XQU5PUFRfVFRZX1NZTkM7CisKK3N0YXRpYyBjaGFyICpvcHRfZGVjb2RlW10gPSB7Ik5PTkUiLCJDUlRTQ1RTIiwiWE9OWE9GRi1SWCIsCisJICAJICAgICAgICAgICAgICJDUlRTQ1RTIFhPTlhPRkYtUlgiLCJYT05YT0ZGLVRYIiwKKwkJICAgICAgICAgICAgICJDUlRTQ1RTIFhPTlhPRkYtVFgiLCJDUlRTQ1RTIFhPTlhPRkYifTsKK3N0YXRpYyBjaGFyICpwX2RlY29kZVtdID0geyJOT05FIiwiT0REIiwiRVZFTiJ9OworCitzdGF0aWMgdm9pZCogdHR5X2NhcmRfbWFwW05SX1BPUlRTXSA9IHtOVUxMLE5VTEwsTlVMTCxOVUxMfTsKKworCisvKioqKioqIFB1YmxpYyBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDaXNjbyBIRExDIHByb3RvY29sIGluaXRpYWxpemF0aW9uIHJvdXRpbmUuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgbWFpbiBXQU5QSVBFIG1vZHVsZSBkdXJpbmcgc2V0dXAuICBBdCB0aGlzCisgKiBwb2ludCBhZGFwdGVyIGlzIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgYW5kIGZpcm13YXJlIGlzIHJ1bm5pbmcuCisgKiAgbyByZWFkIGZpcm13YXJlIHZlcnNpb24gKHRvIG1ha2Ugc3VyZSBpdCdzIGFsaXZlKQorICogIG8gY29uZmlndXJlIGFkYXB0ZXIKKyAqICBvIGluaXRpYWxpemUgcHJvdG9jb2wtc3BlY2lmaWMgZmllbGRzIG9mIHRoZSBhZGFwdGVyIGRhdGEgc3BhY2UuCisgKgorICogUmV0dXJuOgkwCW8uay4KKyAqCQk8IDAJZmFpbHVyZS4KKyAqLworaW50IHdwY19pbml0IChzZGxhX3QqIGNhcmQsIHdhbmRldl9jb25mX3QqIGNvbmYpCit7CisJdW5zaWduZWQgY2hhciBwb3J0X251bTsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgbWF4X3Blcm1pdHRlZF9iYXVkID0gMDsKKwlTSEFSRURfTUVNT1JZX0lORk9fU1RSVUNUICpmbGFnczsKKworCXVuaW9uCisJCXsKKwkJY2hhciBzdHJbODBdOworCQl9IHU7CisJdm9sYXRpbGUgQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iOworCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYjE7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJLyogVmVyaWZ5IGNvbmZpZ3VyYXRpb24gSUQgKi8KKwlpZiAoY29uZi0+Y29uZmlnX2lkICE9IFdBTkNPTkZJR19DSERMQykgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogaW52YWxpZCBjb25maWd1cmF0aW9uIElEICV1IVxuIiwKKwkJCQkgIGNhcmQtPmRldm5hbWUsIGNvbmYtPmNvbmZpZ19pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEZpbmQgb3V0IHdoaWNoIFBvcnQgdG8gdXNlICovCisJaWYgKChjb25mLT5jb21tX3BvcnQgPT0gV0FOT1BUX1BSSSkgfHwgKGNvbmYtPmNvbW1fcG9ydCA9PSBXQU5PUFRfU0VDKSl7CisJCWlmIChjYXJkLT5uZXh0KXsKKworCQkJaWYgKGNvbmYtPmNvbW1fcG9ydCAhPSBjYXJkLT5uZXh0LT51LmMuY29tbV9wb3J0KXsKKwkJCQljYXJkLT51LmMuY29tbV9wb3J0ID0gY29uZi0+Y29tbV9wb3J0OworCQkJfWVsc2V7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVSUk9SIC0gJXMgcG9ydCB1c2VkIVxuIiwKKyAgICAgICAgCQkgICAgICAgIAljYXJkLT53YW5kZXYubmFtZSwgUE9SVChjb25mLT5jb21tX3BvcnQpKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfWVsc2V7CisJCQljYXJkLT51LmMuY29tbV9wb3J0ID0gY29uZi0+Y29tbV9wb3J0OworCQl9CisJfWVsc2V7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFUlJPUiAtIEludmFsaWQgUG9ydCBTZWxlY3RlZCFcbiIsCisgICAgICAgICAgICAgICAgCQkJY2FyZC0+d2FuZGV2Lm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJCisKKwkvKiBJbml0aWFsaXplIHByb3RvY29sLXNwZWNpZmljIGZpZWxkcyAqLworCWlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KXsKKworCQlpZiAoY2FyZC0+dS5jLmNvbW1fcG9ydCA9PSBXQU5PUFRfUFJJKXsJCisJCQljYXJkLT5tYm94ICA9ICh2b2lkICopIGNhcmQtPmh3LmRwbWJhc2U7CisJCX1lbHNleworCQkJY2FyZC0+bWJveCAgPSAodm9pZCAqKSBjYXJkLT5ody5kcG1iYXNlICsgCisJCQkJU0VDX0JBU0VfQUREUl9NQl9TVFJVQ1QgLSBQUklfQkFTRV9BRERSX01CX1NUUlVDVDsKKwkJfQkKKwl9ZWxzZXsgCisJCS8qIGZvciBhIFM1MTQgYWRhcHRlciwgc2V0IGEgcG9pbnRlciB0byB0aGUgYWN0dWFsIG1haWxib3ggaW4gdGhlICovCisJCS8qIGFsbG9jYXRlZCB2aXJ0dWFsIG1lbW9yeSBhcmVhICovCisJCWlmIChjYXJkLT51LmMuY29tbV9wb3J0ID09IFdBTk9QVF9QUkkpeworCQkJY2FyZC0+bWJveCA9ICh2b2lkICopIGNhcmQtPmh3LmRwbWJhc2UgKyBQUklfQkFTRV9BRERSX01CX1NUUlVDVDsKKwkJfWVsc2V7CisJCQljYXJkLT5tYm94ID0gKHZvaWQgKikgY2FyZC0+aHcuZHBtYmFzZSArIFNFQ19CQVNFX0FERFJfTUJfU1RSVUNUOworCQl9CQorCX0KKworCW1iID0gbWIxID0gY2FyZC0+bWJveDsKKworCWlmICghY2FyZC0+Y29uZmlndXJlZCl7CisKKwkJLyogVGhlIGJvYXJkIHdpbGwgcGxhY2UgYW4gJ0knIGluIHRoZSByZXR1cm4gY29kZSB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzCisJICAgCXJlYWR5IHRvIGFjY2VwdCBjb21tYW5kcy4gIFdlIGV4cGVjdCB0aGlzIHRvIGJlIGNvbXBsZXRlZCBpbiBsZXNzCisgICAgICAgICAgIAl0aGFuIDEgc2Vjb25kLiAqLworCisJCXRpbWVvdXQgPSBqaWZmaWVzOworCQl3aGlsZSAobWItPnJldHVybl9jb2RlICE9ICdJJykJLyogV2FpdCAxcyBmb3IgYm9hcmQgdG8gaW5pdGlhbGl6ZSAqLworCQkJaWYgKChqaWZmaWVzIC0gdGltZW91dCkgPiAxKkhaKSBicmVhazsKKworCQlpZiAobWItPnJldHVybl9jb2RlICE9ICdJJykgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSIlczogSW5pdGlhbGl6YXRpb24gbm90IGNvbXBsZXRlZCBieSBhZGFwdGVyXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiUGxlYXNlIGNvbnRhY3QgU2FuZ29tYSByZXByZXNlbnRhdGl2ZS5cbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwkvKiBSZWFkIGZpcm13YXJlIHZlcnNpb24uICBOb3RlIHRoYXQgd2hlbiBhZGFwdGVyIGluaXRpYWxpemVzLCBpdAorCSAqIGNsZWFycyB0aGUgbWFpbGJveCwgc28gaXQgbWF5IGFwcGVhciB0aGF0IHRoZSBmaXJzdCBjb21tYW5kIHdhcworCSAqIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSB3aGVuIGluIGZhY3QgaXQgd2FzIG1lcmVseSBlcmFzZWQuIFRvIHdvcmsKKwkgKiBhcm91bmQgdGhpcywgd2UgZXhlY3V0ZSB0aGUgZmlyc3QgY29tbWFuZCB0d2ljZS4KKwkgKi8KKworCWlmIChjaGRsY19yZWFkX3ZlcnNpb24oY2FyZCwgdS5zdHIpKQorCQlyZXR1cm4gLUVJTzsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBSdW5uaW5nIENpc2NvIEhETEMgZmlybXdhcmUgdiVzXG4iLAorCQljYXJkLT5kZXZuYW1lLCB1LnN0cik7IAorCisJY2FyZC0+aXNyCQkJPSAmd3BjX2lzcjsKKwljYXJkLT5wb2xsCQkJPSBOVUxMOworCWNhcmQtPmV4ZWMJCQk9IE5VTEw7CisJY2FyZC0+d2FuZGV2LnVwZGF0ZQkJPSAmdXBkYXRlOworIAljYXJkLT53YW5kZXYubmV3X2lmCQk9ICZuZXdfaWY7CisJY2FyZC0+d2FuZGV2LmRlbF9pZgkJPSBOVUxMOworCWNhcmQtPndhbmRldi51ZHBfcG9ydCAgIAk9IGNvbmYtPnVkcF9wb3J0OworCWNhcmQtPmRpc2FibGVfY29tbQkJPSAmZGlzYWJsZV9jb21tOworCWNhcmQtPndhbmRldi5uZXdfaWZfY250ID0gMDsKKworCS8qIHJlc2V0IHRoZSBudW1iZXIgb2YgdGltZXMgdGhlICd1cGRhdGUoKScgcHJvYyBoYXMgYmVlbiBjYWxsZWQgKi8KKwljYXJkLT51LmMudXBkYXRlX2NhbGxfY291bnQgPSAwOworCQorCWNhcmQtPndhbmRldi50dGwgPSBjb25mLT50dGw7CisJY2FyZC0+d2FuZGV2LmludGVyZmFjZSA9IGNvbmYtPmludGVyZmFjZTsgCisKKwlpZiAoKGNhcmQtPnUuYy5jb21tX3BvcnQgPT0gV0FOT1BUX1NFQyAmJiBjb25mLT5pbnRlcmZhY2UgPT0gV0FOT1BUX1YzNSkmJgorCSAgICBjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFUlJPUiAtIFYzNSBJbnRlcmZhY2Ugbm90IHN1cHBvcnRlZCBvbiBTNTA4ICVzIHBvcnQgXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgUE9SVChjYXJkLT51LmMuY29tbV9wb3J0KSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWNhcmQtPndhbmRldi5jbG9ja2luZyA9IGNvbmYtPmNsb2NraW5nOworCisJcG9ydF9udW0gPSBjYXJkLT51LmMuY29tbV9wb3J0OworCisJLyogaW4gQVBJIG1vZGUsIHdlIGNhbiBjb25maWd1cmUgZm9yICJyZWNlaXZlIG9ubHkiIGJ1ZmZlcmluZyAqLworCWlmKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KSB7CisJCWNhcmQtPnUuYy5yZWNlaXZlX29ubHkgPSBjb25mLT5yZWNlaXZlX29ubHk7CisJCWlmKGNvbmYtPnJlY2VpdmVfb25seSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSIlczogQ29uZmlndXJlZCBmb3IgJ3JlY2VpdmUgb25seScgbW9kZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+ZGV2bmFtZSk7CisJCX0KKwl9CisKKwkvKiBTZXR1cCBQb3J0IEJwcyAqLworCisJaWYoY2FyZC0+d2FuZGV2LmNsb2NraW5nKSB7CisJCWlmKChwb3J0X251bSA9PSBXQU5PUFRfUFJJKSB8fCBjYXJkLT51LmMucmVjZWl2ZV9vbmx5KSB7CisJCQkvKiBGb3IgUHJpbWFyeSBQb3J0IDAgKi8KKyAgICAgICAgICAgICAgIAkJbWF4X3Blcm1pdHRlZF9iYXVkID0KKwkJCQkoY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpID8KKwkJCQlQUklfTUFYX0JBVURfUkFURV9TNTE0IDogCisJCQkJUFJJX01BWF9CQVVEX1JBVEVfUzUwODsKKworCQl9ZWxzZSBpZihwb3J0X251bSA9PSBXQU5PUFRfU0VDKSB7CisJCQkvKiBGb3IgU2Vjb25kYXJ5IFBvcnQgMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3Blcm1pdHRlZF9iYXVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX01BWF9CQVVEX1JBVEVfUzUxNCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19NQVhfQkFVRF9SQVRFX1M1MDg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgIAorCQkJaWYoY29uZi0+YnBzID4gbWF4X3Blcm1pdHRlZF9iYXVkKSB7CisJCQkJY29uZi0+YnBzID0gbWF4X3Blcm1pdHRlZF9iYXVkOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBCYXVkIHRvbyBoaWdoIVxuIiwKKwkJCQkJY2FyZC0+d2FuZGV2Lm5hbWUpOworIAkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQmF1ZCByYXRlIHNldCB0byAlbHUgYnBzXG4iLCAKKwkJCQkJY2FyZC0+d2FuZGV2Lm5hbWUsIG1heF9wZXJtaXR0ZWRfYmF1ZCk7CisJCQl9CisJCQljYXJkLT53YW5kZXYuYnBzID0gY29uZi0+YnBzOworCX1lbHNleworICAgICAgICAJY2FyZC0+d2FuZGV2LmJwcyA9IDA7CisgIAl9CisKKwkvKiBTZXR1cCB0aGUgUG9ydCBNVFUgKi8KKwlpZigocG9ydF9udW0gPT0gV0FOT1BUX1BSSSkgfHwgY2FyZC0+dS5jLnJlY2VpdmVfb25seSkgeworCisJCS8qIEZvciBQcmltYXJ5IFBvcnQgMCAqLworCQljYXJkLT53YW5kZXYubXR1ID0KKwkJCShjb25mLT5tdHUgPj0gTUlOX0xHVEhfQ0hETENfREFUQV9DRkcpID8KKwkJCW1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+bXR1LCBQUklfTUFYX05PX0RBVEFfQllURVNfSU5fRlJBTUUpIDoKKwkJCUNIRExDX0RGTFRfREFUQV9MRU47CisJfSBlbHNlIGlmKHBvcnRfbnVtID09IFdBTk9QVF9TRUMpIHsgCisJCS8qIEZvciBTZWNvbmRhcnkgUG9ydCAxICovCisJCWNhcmQtPndhbmRldi5tdHUgPQorCQkJKGNvbmYtPm10dSA+PSBNSU5fTEdUSF9DSERMQ19EQVRBX0NGRykgPworCQkJbWluX3QodW5zaWduZWQgaW50LCBjb25mLT5tdHUsIFNFQ19NQVhfTk9fREFUQV9CWVRFU19JTl9GUkFNRSkgOgorCQkJQ0hETENfREZMVF9EQVRBX0xFTjsKKwl9CisKKwkvKiBTZXQgdXAgdGhlIGludGVycnVwdCBzdGF0dXMgYXJlYSAqLworCS8qIFJlYWQgdGhlIENIRExDIENvbmZpZ3VyYXRpb24gYW5kIG9idGFpbjogCisJICoJUHRyIHRvIHNoYXJlZCBtZW1vcnkgaW5mb3Igc3RydWN0CisgICAgICAgICAqIFVzZSB0aGlzIHBvaW50ZXIgdG8gY2FsY3VsYXRlIHRoZSB2YWx1ZSBvZiBjYXJkLT51LmMuZmxhZ3MgIQorIAkgKi8KKwltYjEtPmJ1ZmZlcl9sZW5ndGggPSAwOworCW1iMS0+Y29tbWFuZCA9IFJFQURfQ0hETENfQ09ORklHVVJBVElPTjsKKwllcnIgPSBzZGxhX2V4ZWMobWIxKSA/IG1iMS0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwlpZihlcnIgIT0gQ09NTUFORF9PSykgeworICAgICAgICAgICAgICAgIGlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KQorICAgICAgICAgICAgICAgIAllbmFibGVfaXJxKGNhcmQtPmh3LmlycSk7CisKKwkJY2hkbGNfZXJyb3IoY2FyZCwgZXJyLCBtYjEpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZihjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCl7CisgICAgICAgICAgICAgICAJY2FyZC0+dS5jLmZsYWdzID0gKHZvaWQgKikoY2FyZC0+aHcuZHBtYmFzZSArCisgICAgICAgICAgICAgICAJCSgoKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICopbWIxLT5kYXRhKS0+CisJCQlwdHJfc2hhcmVkX21lbV9pbmZvX3N0cnVjdCkpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBjYXJkLT51LmMuZmxhZ3MgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICopbWIxLT5kYXRhKS0+CisJCQlwdHJfc2hhcmVkX21lbV9pbmZvX3N0cnVjdCAlIFNETEFfV0lORE9XU0laRSkpOworCX0KKworCWZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCQorCS8qIFRoaXMgaXMgZm9yIHRoZSBwb3J0cyBsaW5rIHN0YXRlICovCisJY2FyZC0+d2FuZGV2LnN0YXRlID0gV0FOX0RVQUxQT1JUOworCWNhcmQtPnUuYy5zdGF0ZSA9IFdBTl9ESVNDT05ORUNURUQ7CisKKworCWlmICghY2FyZC0+d2FuZGV2LnBpZ2d5YmFjayl7CQorCQlpbnQgZXJyOworCisJCS8qIFBlcmZvcm0gaW50ZXJydXB0IHRlc3RpbmcgKi8KKwkJZXJyID0gaW50cl90ZXN0KGNhcmQpOworCisJCWlmKGVyciB8fCAoSW50cl90ZXN0X2NvdW50ZXIgPCBNQVhfSU5UUl9URVNUX0NPVU5URVIpKSB7IAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludGVycnVwdCB0ZXN0IGZhaWxlZCAoJWkpXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lLCBJbnRyX3Rlc3RfY291bnRlcik7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUGxlYXNlIGNob29zZSBhbm90aGVyIGludGVycnVwdFxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludGVycnVwdCB0ZXN0IHBhc3NlZCAoJWkpXG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lLCBJbnRyX3Rlc3RfY291bnRlcik7CisJCWNhcmQtPmNvbmZpZ3VyZWQgPSAxOworCX0KKworCWlmICgoY2FyZC0+dHR5X29wdD1jb25mLT50dHkpID09IFdBTk9QVF9ZRVMpeworCQlpbnQgZXJyOworCQljYXJkLT50dHlfbWlub3IgPSBjb25mLT50dHlfbWlub3I7CisKKwkJLyogT24gQVNZTkMgY29ubmVjdGlvbnMgaW50ZXJuYWwgY2xvY2tpbmcgCisJCSAqIGlzIG1hbmRhdG9yeSAqLworCQlpZiAoKGNhcmQtPnUuYy5hc3luY19tb2RlID0gY29uZi0+dHR5X21vZGUpKXsKKwkJCWNhcmQtPndhbmRldi5jbG9ja2luZyA9IDE7CisJCX0KKwkJZXJyPXdhbnBpcGVfdHR5X2luaXQoY2FyZCk7CisJCWlmIChlcnIpeworCQkJcmV0dXJuIGVycjsKKwkJfQorCX1lbHNleworCQorCisJCWlmIChjaGRsY19zZXRfaW50cl9tb2RlKGNhcmQsIEFQUF9JTlRfT05fVElNRVIpKXsKKwkJCXByaW50ayAoS0VSTl9JTkZPICIlczogIgorCQkJCSJGYWlsZWQgdG8gc2V0IGludGVycnVwdCB0cmlnZ2VycyFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gLUVJTzsJCisgICAgICAgIAl9CisJCisJCS8qIE1hc2sgdGhlIFRpbWVyIGludGVycnVwdCAqLworCQlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF9wZXJtaXNzaW9uICY9IAorCQkJfkFQUF9JTlRfT05fVElNRVI7CisJfQorCisJLyogSWYgd2UgYXJlIHVzaW5nIENIRExDIGluIGJhY2t1cCBtb2RlLCB0aGlzIGZsYWcgd2lsbAorCSAqIGluZGljYXRlIG5vdCB0byBsb29rIGZvciBJUCBhZGRyZXNzZXMgaW4gY29uZmlnX2NoZGxjKCkqLworCWNhcmQtPnUuYy5iYWNrdXAgPSBjb25mLT5iYWNrdXA7CisJCisJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKiBXQU4gRGV2aWNlIERyaXZlciBFbnRyeSBQb2ludHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBVcGRhdGUgZGV2aWNlIHN0YXR1cyAmIHN0YXRpc3RpY3MKKyAqIFRoaXMgcHJvY2VkdXJlIGlzIGNhbGxlZCB3aGVuIHVwZGF0aW5nIHRoZSBQUk9DIGZpbGUgc3lzdGVtIGFuZCByZXR1cm5zCisgKiB2YXJpb3VzIGNvbW11bmljYXRpb25zIHN0YXRpc3RpY3MuIFRoZXNlIHN0YXRpc3RpY3MgYXJlIGFjY3VtdWxhdGVkIGZyb20gMyAKKyAqIGRpZmZlcmVudCBsb2NhdGlvbnM6CisgKiAJMSkgVGhlICdpZl9zdGF0cycgcmVjb3JkZWQgZm9yIHRoZSBkZXZpY2UuCisgKiAJMikgQ29tbXVuaWNhdGlvbiBlcnJvciBzdGF0aXN0aWNzIG9uIHRoZSBhZGFwdGVyLgorICogICAgICAzKSBDSERMQyBvcGVyYXRpb25hbCBzdGF0aXN0aWNzIG9uIHRoZSBhZGFwdGVyLgorICogVGhlIGJvYXJkIGxldmVsIHN0YXRpc3RpY3MgYXJlIHJlYWQgZHVyaW5nIGEgdGltZXIgaW50ZXJydXB0LiBOb3RlIHRoYXQgd2UgCisgKiByZWFkIHRoZSBlcnJvciBhbmQgb3BlcmF0aW9uYWwgc3RhdGlzdGljcyBkdXJpbmcgY29uc2VjaXRpdmUgdGltZXIgdGlja3Mgc28KKyAqIGFzIHRvIG1pbmltaXplIHRoZSB0aW1lIHRoYXQgd2UgYXJlIGluc2lkZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIuCisgKgorICovCitzdGF0aWMgaW50IHVwZGF0ZShzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2KQoreworCXNkbGFfdCogY2FyZCA9IHdhbmRldi0+cHJpdmF0ZTsKKyAJc3RydWN0IG5ldF9kZXZpY2UqIGRldjsKKyAgICAgICAgdm9sYXRpbGUgY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYTsKKyAgICAgICAgU0hBUkVEX01FTU9SWV9JTkZPX1NUUlVDVCAqZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJLyogc2FuaXR5IGNoZWNrcyAqLworCWlmKCh3YW5kZXYgPT0gTlVMTCkgfHwgKHdhbmRldi0+cHJpdmF0ZSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisJaWYod2FuZGV2LT5zdGF0ZSA9PSBXQU5fVU5DT05GSUdVUkVEKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIG1vcmUgc2FuaXR5IGNoZWNrcyAqLworICAgICAgICBpZighY2FyZC0+dS5jLmZsYWdzKQorICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworCisJaWYodGVzdF9iaXQoUEVSSV9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47CisKKwlpZigoZGV2PWNhcmQtPndhbmRldi5kZXYpID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJaWYoKGNoZGxjX3ByaXZfYXJlYT1kZXYtPnByaXYpID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisgICAgICAJZmxhZ3MgPSBjYXJkLT51LmMuZmxhZ3M7CisgICAgICAgCWlmKGNoZGxjX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzKXsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCQkJCisJLyogd2Ugd2lsbCBuZWVkIDIgdGltZXIgaW50ZXJydXB0cyB0byBjb21wbGV0ZSB0aGUgKi8KKwkvKiByZWFkaW5nIG9mIHRoZSBzdGF0aXN0aWNzICovCisJY2hkbGNfcHJpdl9hcmVhLT51cGRhdGVfY29tbXNfc3RhdHMgPSAyOworICAgICAgIAlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF9wZXJtaXNzaW9uIHw9IEFQUF9JTlRfT05fVElNRVI7CisJY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCA9IFRNUl9JTlRfRU5BQkxFRF9VUERBVEU7CisgIAorCS8qIHdhaXQgYSBtYXhpbXVtIG9mIDEgc2Vjb25kIGZvciB0aGUgc3RhdGlzdGljcyB0byBiZSB1cGRhdGVkICovIAorICAgICAgICB0aW1lb3V0ID0gamlmZmllczsKKyAgICAgICAgZm9yKDs7KSB7CisJCWlmKGNoZGxjX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzID09IDApCisJCQlicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoKGppZmZpZXMgLSB0aW1lb3V0KSA+ICgxICogSFopKXsKKyAgICAJCQljaGRsY19wcml2X2FyZWEtPnVwZGF0ZV9jb21tc19zdGF0cyA9IDA7CisgCQkJY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmPQorCQkJCX5UTVJfSU5UX0VOQUJMRURfVVBEQVRFOyAKKyAJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorICAgICAgICB9CisKKwlyZXR1cm4gMDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENyZWF0ZSBuZXcgbG9naWNhbCBjaGFubmVsLgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgcm91dGVyIHdoZW4gUk9VVEVSX0lGTkVXIElPQ1RMIGlzIGJlaW5nCisgKiBoYW5kbGVkLgorICogbyBwYXJzZSBtZWRpYS0gYW5kIGhhcmR3YXJlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24KKyAqIG8gbWFrZSBzdXJlIHRoYXQgYSBuZXcgY2hhbm5lbCBjYW4gYmUgY3JlYXRlZAorICogbyBhbGxvY2F0ZSByZXNvdXJjZXMsIGlmIG5lY2Vzc2FyeQorICogbyBwcmVwYXJlIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZSBmb3IgcmVnaXN0YXJhdGlvbi4KKyAqCisgKiBSZXR1cm46CTAJby5rLgorICoJCTwgMAlmYWlsdXJlIChjaGFubmVsIHdpbGwgbm90IGJlIGNyZWF0ZWQpCisgKi8KK3N0YXRpYyBpbnQgbmV3X2lmKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCSAgd2FuaWZfY29uZl90KiBjb25mKQoreworCXNkbGFfdCogY2FyZCA9IHdhbmRldi0+cHJpdmF0ZTsKKwljaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhOworCisKKwlwcmludGsoS0VSTl9JTkZPICIlczogQ29uZmlndXJpbmcgSW50ZXJmYWNlOiAlc1xuIiwKKwkJCWNhcmQtPmRldm5hbWUsIGNvbmYtPm5hbWUpOworIAorCWlmICgoY29uZi0+bmFtZVswXSA9PSAnXDAnKSB8fCAoc3RybGVuKGNvbmYtPm5hbWUpID4gV0FOX0lGTkFNRV9TWikpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludmFsaWQgaW50ZXJmYWNlIG5hbWUhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkJCisJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcHJpdmF0ZSBkYXRhICovCisJY2hkbGNfcHJpdl9hcmVhID0ga21hbGxvYyhzaXplb2YoY2hkbGNfcHJpdmF0ZV9hcmVhX3QpLCBHRlBfS0VSTkVMKTsKKwkKKwlpZihjaGRsY19wcml2X2FyZWEgPT0gTlVMTCkgCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KGNoZGxjX3ByaXZfYXJlYSwgMCwgc2l6ZW9mKGNoZGxjX3ByaXZhdGVfYXJlYV90KSk7CisKKwljaGRsY19wcml2X2FyZWEtPmNhcmQgPSBjYXJkOyAKKwljaGRsY19wcml2X2FyZWEtPmNvbW1vbi5zayA9IE5VTEw7CisJY2hkbGNfcHJpdl9hcmVhLT5jb21tb24uZnVuYyA9IE5VTEw7CQorCisJLyogaW5pdGlhbGl6ZSBkYXRhICovCisJc3RyY3B5KGNhcmQtPnUuYy5pZl9uYW1lLCBjb25mLT5uYW1lKTsKKworCWlmKGNhcmQtPndhbmRldi5uZXdfaWZfY250ID4gMCkgeworICAgICAgICAgICAgICAgIGtmcmVlKGNoZGxjX3ByaXZfYXJlYSk7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCWNhcmQtPndhbmRldi5uZXdfaWZfY250Kys7CisKKwljaGRsY19wcml2X2FyZWEtPlRyYWNpbmdFbmFibGVkID0gMDsKKwljaGRsY19wcml2X2FyZWEtPnJvdXRlX3N0YXR1cyA9IE5PX1JPVVRFOworCWNoZGxjX3ByaXZfYXJlYS0+cm91dGVfcmVtb3ZlZCA9IDA7CisKKwljYXJkLT51LmMuYXN5bmNfbW9kZSA9IGNvbmYtPmFzeW5jX21vZGU7CisJCisJLyogc2V0dXAgZm9yIGFzeW5jaHJvbm91cyBtb2RlICovCisJaWYoY29uZi0+YXN5bmNfbW9kZSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogQ29uZmlndXJpbmcgZm9yIGFzeW5jaHJvbm91cyBtb2RlXG4iLAorCQkJd2FuZGV2LT5uYW1lKTsKKworCQlpZihjYXJkLT51LmMuY29tbV9wb3J0ID09IFdBTk9QVF9QUkkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6QXN5bmNocm9ub3VzIG1vZGUgb24gc2Vjb25kYXJ5IHBvcnQgb25seVxuIiwKKwkJCQkJd2FuZGV2LT5uYW1lKTsKKwkJCWtmcmVlKGNoZGxjX3ByaXZfYXJlYSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJICAgICAgIAlpZihzdHJjbXAoY29uZi0+dXNlZGJ5LCAiV0FOUElQRSIpID09IDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBSdW5uaW5nIGluIFdBTklQRSBBc3luYyBNb2RlXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQl3YW5kZXYtPm5hbWUpOworCQkJY2FyZC0+dS5jLnVzZWRieSA9IFdBTlBJUEU7CisJCX1lbHNleworCQkJY2FyZC0+dS5jLnVzZWRieSA9IEFQSTsKKwkJfQorCisJCWlmKCFjYXJkLT53YW5kZXYuY2xvY2tpbmcpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IEFzeW5jaC4gY2xvY2tpbmcgbXVzdCBiZSAnSW50ZXJuYWwnXG4iLAorCQkJCXdhbmRldi0+bmFtZSk7CisJCQlrZnJlZShjaGRsY19wcml2X2FyZWEpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZigoY2FyZC0+d2FuZGV2LmJwcyA8IE1JTl9BU1lfQkFVRF9SQVRFKSB8fAorCQkJKGNhcmQtPndhbmRldi5icHMgPiBNQVhfQVNZX0JBVURfUkFURSkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTZWxlY3RlZCBiYXVkIHJhdGUgaXMgaW52YWxpZC5cbiIsCisJCQkJd2FuZGV2LT5uYW1lKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIk11c3QgYmUgYmV0d2VlbiAldSBhbmQgJXUgYnBzLlxuIiwKKwkJCQlNSU5fQVNZX0JBVURfUkFURSwgTUFYX0FTWV9CQVVEX1JBVEUpOworCQkJa2ZyZWUoY2hkbGNfcHJpdl9hcmVhKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJY2FyZC0+dS5jLmFwaV9vcHRpb25zID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoY29uZi0+YXN5X2RhdGFfdHJhbnMgPT0gV0FOT1BUX1lFUykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+dS5jLmFwaV9vcHRpb25zIHw9IEFTWV9SWF9EQVRBX1RSQU5TUEFSRU5UOworICAgICAgICAgICAgICAgIH0KKwkJCisJCWNhcmQtPnUuYy5wcm90b2NvbF9vcHRpb25zID0gMDsKKwkJaWYgKGNvbmYtPnJ0c19oc19mb3JfcmVjZWl2ZSA9PSBXQU5PUFRfWUVTKSB7CisJCQljYXJkLT51LmMucHJvdG9jb2xfb3B0aW9ucyB8PSBBU1lfUlRTX0hTX0ZPUl9SWDsKKwkgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29uZi0+eG9uX3hvZmZfaHNfZm9yX3JlY2VpdmUgPT0gV0FOT1BUX1lFUykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnByb3RvY29sX29wdGlvbnMgfD0gQVNZX1hPTl9YT0ZGX0hTX0ZPUl9SWDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvbmYtPnhvbl94b2ZmX2hzX2Zvcl90cmFuc21pdCA9PSBXQU5PUFRfWUVTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT51LmMucHJvdG9jb2xfb3B0aW9ucyB8PSBBU1lfWE9OX1hPRkZfSFNfRk9SX1RYOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29uZi0+ZGNkX2hzX2Zvcl90cmFuc21pdCA9PSBXQU5PUFRfWUVTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT51LmMucHJvdG9jb2xfb3B0aW9ucyB8PSBBU1lfRENEX0hTX0ZPUl9UWDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvbmYtPmN0c19oc19mb3JfdHJhbnNtaXQgPT0gV0FOT1BUX1lFUykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnByb3RvY29sX29wdGlvbnMgfD0gQVNZX0NUU19IU19GT1JfVFg7CisgICAgICAgICAgICAgICAgfQorCisJCWNhcmQtPnUuYy50eF9iaXRzX3Blcl9jaGFyID0gY29uZi0+dHhfYml0c19wZXJfY2hhcjsKKyAgICAgICAgICAgICAgICBjYXJkLT51LmMucnhfYml0c19wZXJfY2hhciA9IGNvbmYtPnJ4X2JpdHNfcGVyX2NoYXI7CisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnN0b3BfYml0cyA9IGNvbmYtPnN0b3BfYml0czsKKwkJY2FyZC0+dS5jLnBhcml0eSA9IGNvbmYtPnBhcml0eTsKKwkJY2FyZC0+dS5jLmJyZWFrX3RpbWVyID0gY29uZi0+YnJlYWtfdGltZXI7CisJCWNhcmQtPnUuYy5pbnRlcl9jaGFyX3RpbWVyID0gY29uZi0+aW50ZXJfY2hhcl90aW1lcjsKKwkJY2FyZC0+dS5jLnJ4X2NvbXBsZXRlX2xlbmd0aCA9IGNvbmYtPnJ4X2NvbXBsZXRlX2xlbmd0aDsKKwkJY2FyZC0+dS5jLnhvbl9jaGFyID0gY29uZi0+eG9uX2NoYXI7CisKKwl9IGVsc2UgewkvKiBzZXR1cCBmb3Igc3luY2hyb25vdXMgbW9kZSAqLworCisJCWNhcmQtPnUuYy5wcm90b2NvbF9vcHRpb25zID0gMDsKKwkJaWYgKGNvbmYtPmlnbm9yZV9kY2QgPT0gV0FOT1BUX1lFUyl7CisJCQljYXJkLT51LmMucHJvdG9jb2xfb3B0aW9ucyB8PSBJR05PUkVfRENEX0ZPUl9MSU5LX1NUQVQ7CisJCX0KKwkJaWYgKGNvbmYtPmlnbm9yZV9jdHMgPT0gV0FOT1BUX1lFUyl7CisJCQljYXJkLT51LmMucHJvdG9jb2xfb3B0aW9ucyB8PSBJR05PUkVfQ1RTX0ZPUl9MSU5LX1NUQVQ7CisJCX0KKworCQlpZiAoY29uZi0+aWdub3JlX2tlZXBhbGl2ZSA9PSBXQU5PUFRfWUVTKSB7CisJCQljYXJkLT51LmMucHJvdG9jb2xfb3B0aW9ucyB8PQorCQkJCUlHTk9SRV9LUEFMVl9GT1JfTElOS19TVEFUOworCQkJY2FyZC0+dS5jLmtwYWx2X3R4ICA9IE1JTl9UeF9LUEFMVl9USU1FUjsgCisJCQljYXJkLT51LmMua3BhbHZfcnggID0gTUlOX1J4X0tQQUxWX1RJTUVSOyAKKwkJCWNhcmQtPnUuYy5rcGFsdl9lcnIgPSBNSU5fS1BBTFZfRVJSX1RPTDsgCisKKwkJfSBlbHNlIHsgICAvKiBEbyBub3QgaWdub3JlIGtlZXBhbGl2ZXMgKi8KKwkJCWNhcmQtPnUuYy5rcGFsdl90eCA9CisJCQkJKChjb25mLT5rZWVwYWxpdmVfdHhfdG1yIC0gTUlOX1R4X0tQQUxWX1RJTUVSKQorCQkJCT49IDApID8KKwkgICAJCQltaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPmtlZXBhbGl2ZV90eF90bXIsTUFYX1R4X0tQQUxWX1RJTUVSKSA6CisJCQkJREVGQVVMVF9UeF9LUEFMVl9USU1FUjsKKworCQkJY2FyZC0+dS5jLmtwYWx2X3J4ID0KKwkJICAgCQkoKGNvbmYtPmtlZXBhbGl2ZV9yeF90bXIgLSBNSU5fUnhfS1BBTFZfVElNRVIpCisJCQkJPj0gMCkgPworCSAgIAkJCW1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+a2VlcGFsaXZlX3J4X3RtcixNQVhfUnhfS1BBTFZfVElNRVIpIDoKKwkJCQlERUZBVUxUX1J4X0tQQUxWX1RJTUVSOworCisJCQljYXJkLT51LmMua3BhbHZfZXJyID0KKwkJICAgCQkoKGNvbmYtPmtlZXBhbGl2ZV9lcnJfbWFyZ2luLU1JTl9LUEFMVl9FUlJfVE9MKQorCQkJCT49IDApID8KKwkgICAJCQltaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPmtlZXBhbGl2ZV9lcnJfbWFyZ2luLAorCQkJCU1BWF9LUEFMVl9FUlJfVE9MKSA6IAorCSAgIAkJCURFRkFVTFRfS1BBTFZfRVJSX1RPTDsKKwkJfQorCisJCS8qIFNldHVwIHNsYXJwIHRpbWVyIHRvIGNvbnRyb2wgZGVsYXkgYmV0d2VlbiBzbGFycHMgKi8KKwkJY2FyZC0+dS5jLnNsYXJwX3RpbWVyID0gCisJCQkoKGNvbmYtPnNsYXJwX3RpbWVyIC0gTUlOX1NMQVJQX1JFUV9USU1FUikgPj0gMCkgPworCQkJbWluX3QodW5zaWduZWQgaW50LCBjb25mLT5zbGFycF90aW1lciwgTUFYX1NMQVJQX1JFUV9USU1FUikgOgorCQkJREVGQVVMVF9TTEFSUF9SRVFfVElNRVI7CisKKwkJaWYgKGNvbmYtPmhkbGNfc3RyZWFtaW5nID09IFdBTk9QVF9ZRVMpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFbmFibGluZyBIRExDIFNUUkVBTUlORyBNb2RlXG4iLAorCQkJCXdhbmRldi0+bmFtZSk7CisJCQljYXJkLT51LmMucHJvdG9jb2xfb3B0aW9ucyA9IEhETENfU1RSRUFNSU5HX01PREU7CisJCX0KKworCQlpZiAoKGNoZGxjX3ByaXZfYXJlYS0+dHJ1ZV9pZl9lbmNvZGluZyA9IGNvbmYtPnRydWVfaWZfZW5jb2RpbmcpID09IFdBTk9QVF9ZRVMpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IEVuYWJsaW5nLCB0cnVlIGludGVyZmFjZSB0eXBlIGVuY29kaW5nLlxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJfQorCQkKKyAgICAgICAgCS8qIFNldHVwIHdhbnBpcGUgYXMgYSByb3V0ZXIgKFdBTlBJUEUpIG9yIGFzIGFuIEFQSSAqLworCQlpZiggc3RyY21wKGNvbmYtPnVzZWRieSwgIldBTlBJUEUiKSA9PSAwKSB7CisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSdW5uaW5nIGluIFdBTlBJUEUgbW9kZSFcbiIsCisJCQkJd2FuZGV2LT5uYW1lKTsKKwkJCWNhcmQtPnUuYy51c2VkYnkgPSBXQU5QSVBFOworCisJCQkvKiBPcHRpb24gdG8gYnJpbmcgZG93biB0aGUgaW50ZXJmYWNlIHdoZW4gCisgICAgICAgIAkJICogdGhlIGxpbmsgZ29lcyBkb3duICovCisJCQlpZiAoY29uZi0+aWZfZG93bil7CisJCQkJc2V0X2JpdChEWU5fT1BUX09OLCZjaGRsY19wcml2X2FyZWEtPmludGVyZmFjZV9kb3duKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSAiJXM6IER5bmFtaWMgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gZW5hYmxlZFxuIiwKKwkJCQkgICBjYXJkLT5kZXZuYW1lKTsKKwkJCX0gCisKKwkJfSBlbHNlIGlmKCBzdHJjbXAoY29uZi0+dXNlZGJ5LCAiQVBJIikgPT0gMCkgeworCQkJY2FyZC0+dS5jLnVzZWRieSA9IEFQSTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSdW5uaW5nIGluIEFQSSBtb2RlICFcbiIsCisJCQkJd2FuZGV2LT5uYW1lKTsKKwkJfQorCX0KKworCS8qIFRlbGxzIHVzIHRoYXQgaWYgdGhpcyBpbnRlcmZhY2UgaXMgYQorICAgICAgICAgKiBnYXRld2F5IG9yIG5vdCAqLworCWlmICgoY2hkbGNfcHJpdl9hcmVhLT5nYXRld2F5ID0gY29uZi0+Z2F0ZXdheSkgPT0gV0FOT1BUX1lFUyl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnRlcmZhY2UgJXMgaXMgc2V0IGFzIGEgZ2F0ZXdheS5cbiIsCisJCQljYXJkLT5kZXZuYW1lLGNhcmQtPnUuYy5pZl9uYW1lKTsKKwl9CisKKwkvKiBHZXQgTXVsdGljYXN0IEluZm9ybWF0aW9uICovCisJY2hkbGNfcHJpdl9hcmVhLT5tYyA9IGNvbmYtPm1jOworCisJLyogcHJlcGFyZSBuZXR3b3JrIGRldmljZSBkYXRhIHNwYWNlIGZvciByZWdpc3RyYXRpb24gKi8KKwlzdHJjcHkoZGV2LT5uYW1lLGNhcmQtPnUuYy5pZl9uYW1lKTsKKworCWRldi0+aW5pdCA9ICZpZl9pbml0OworCWRldi0+cHJpdiA9IGNoZGxjX3ByaXZfYXJlYTsKKworCS8qIEluaXRpYWxpemUgdGhlIHBvbGxpbmcgd29yayByb3V0aW5lICovCisJSU5JVF9XT1JLKCZjaGRsY19wcml2X2FyZWEtPnBvbGxfd29yaywgKHZvaWQqKSh2b2lkKiljaGRsY19wb2xsLCBkZXYpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcG9sbGluZyBkZWxheSB0aW1lciAqLworCWluaXRfdGltZXIoJmNoZGxjX3ByaXZfYXJlYS0+cG9sbF9kZWxheV90aW1lcik7CisJY2hkbGNfcHJpdl9hcmVhLT5wb2xsX2RlbGF5X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJY2hkbGNfcHJpdl9hcmVhLT5wb2xsX2RlbGF5X3RpbWVyLmZ1bmN0aW9uID0gY2hkbGNfcG9sbF9kZWxheTsKKwkKKwlwcmludGsoS0VSTl9JTkZPICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKiBOZXR3b3JrIERldmljZSBJbnRlcmZhY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBMaW51eCBuZXR3b3JrIGludGVyZmFjZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIG9ubHkgb25jZSBmb3IgZWFjaCBpbnRlcmZhY2UsIGR1cmluZyBMaW51eCBuZXR3b3JrCisgKiBpbnRlcmZhY2UgcmVnaXN0cmF0aW9uLiAgUmV0dXJuaW5nIGFueXRoaW5nIGJ1dCB6ZXJvIHdpbGwgZmFpbCBpbnRlcmZhY2UKKyAqIHJlZ2lzdHJhdGlvbi4KKyAqLworc3RhdGljIGludCBpZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwlzZGxhX3QqIGNhcmQgPSBjaGRsY19wcml2X2FyZWEtPmNhcmQ7CisJc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiA9ICZjYXJkLT53YW5kZXY7CisKKwkvKiBJbml0aWFsaXplIGRldmljZSBkcml2ZXIgZW50cnkgcG9pbnRzICovCisJZGV2LT5vcGVuCQk9ICZpZl9vcGVuOworCWRldi0+c3RvcAkJPSAmaWZfY2xvc2U7CisJZGV2LT5oYXJkX2hlYWRlcgk9ICZpZl9oZWFkZXI7CisJZGV2LT5yZWJ1aWxkX2hlYWRlcgk9ICZpZl9yZWJ1aWxkX2hkcjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9ICZpZl9zZW5kOworCWRldi0+Z2V0X3N0YXRzCQk9ICZpZl9zdGF0czsKKwlkZXYtPnR4X3RpbWVvdXQJCT0gJmlmX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwk9IFRYX1RJTUVPVVQ7CisJCisJLyogSW5pdGlhbGl6ZSBtZWRpYS1zcGVjaWZpYyBwYXJhbWV0ZXJzICovCisJZGV2LT5mbGFncwkJfD0gSUZGX1BPSU5UT1BPSU5UOworCWRldi0+ZmxhZ3MJCXw9IElGRl9OT0FSUDsKKworCS8qIEVuYWJsZSBNdWxpdGNhc3RpbmcgaWYgdXNlciBzZWxlY3RlZCAqLworCWlmIChjaGRsY19wcml2X2FyZWEtPm1jID09IFdBTk9QVF9ZRVMpeworCQlkZXYtPmZsYWdzIAl8PSBJRkZfTVVMVElDQVNUOworCX0KKwkKKwlpZiAoY2hkbGNfcHJpdl9hcmVhLT50cnVlX2lmX2VuY29kaW5nKXsKKwkJZGV2LT50eXBlCT0gQVJQSFJEX0hETEM7IC8qIFRoaXMgYnJlYWtzIHRoZSB0Y3BkdW1wICovCisJfWVsc2V7CisJCWRldi0+dHlwZQk9IEFSUEhSRF9QUFA7CisJfQorCQorCWRldi0+bXR1CQk9IGNhcmQtPndhbmRldi5tdHU7CisJLyogZm9yIEFQSSB1c2FnZSwgYWRkIHRoZSBBUEkgaGVhZGVyIHNpemUgdG8gdGhlIHJlcXVlc3RlZCBNVFUgc2l6ZSAqLworCWlmKGNhcmQtPnUuYy51c2VkYnkgPT0gQVBJKSB7CisJCWRldi0+bXR1ICs9IHNpemVvZihhcGlfdHhfaGRyX3QpOworCX0KKyAKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbgk9IENIRExDX0hEUl9MRU47CisKKwkvKiBJbml0aWFsaXplIGhhcmR3YXJlIHBhcmFtZXRlcnMgKi8KKwlkZXYtPmlycQk9IHdhbmRldi0+aXJxOworCWRldi0+ZG1hCT0gd2FuZGV2LT5kbWE7CisJZGV2LT5iYXNlX2FkZHIJPSB3YW5kZXYtPmlvcG9ydDsKKwlkZXYtPm1lbV9zdGFydAk9IHdhbmRldi0+bWFkZHI7CisJZGV2LT5tZW1fZW5kCT0gd2FuZGV2LT5tYWRkciArIHdhbmRldi0+bXNpemUgLSAxOworCisJLyogU2V0IHRyYW5zbWl0IGJ1ZmZlciBxdWV1ZSBsZW5ndGggCisJICogSWYgdG9vIGxvdyBwYWNrZXRzIHdpbGwgbm90IGJlIHJldHJhbnNtaXR0ZWQgCisgICAgICAgICAqIGJ5IHN0YWNrLgorCSAqLworICAgICAgICBkZXYtPnR4X3F1ZXVlX2xlbiA9IDEwMDsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisgICAKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBPcGVuIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyBlbmFibGUgY29tbXVuaWNhdGlvbnMgYW5kIGludGVycnVwdHMuCisgKiBvIHByZXZlbnQgbW9kdWxlIGZyb20gdW5sb2FkaW5nIGJ5IGluY3JlbWVudGluZyB1c2UgY291bnQKKyAqCisgKiBSZXR1cm4gMCBpZiBPLmsuIG9yIGVycm5vLgorICovCitzdGF0aWMgaW50IGlmX29wZW4oc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwljaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoZGxjX3ByaXZfYXJlYS0+Y2FyZDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlpbnQgZXJyID0gMDsKKworCS8qIE9ubHkgb25lIG9wZW4gcGVyIGludGVyZmFjZSBpcyBhbGxvd2VkICovCisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogSW5pdGlhbGl6ZSB0aGUgd29yayBxdWV1ZSBlbnRyeSAqLworCWNoZGxjX3ByaXZfYXJlYS0+dHFfd29ya2luZz0wOworCisJSU5JVF9XT1JLKCZjaGRsY19wcml2X2FyZWEtPmNvbW1vbi53YW5waXBlX3dvcmssCisJCQkodm9pZCAqKSh2b2lkICopY2hkbGNfd29yaywgZGV2KTsKKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIEJIIGNpcmN1bGFyIGJ1ZmZlciAqLworCS8qIEFkZCAxIHRvIE1BWF9CSF9CVUZGIHNvIHdlIGRvbid0IGhhdmUgdGVzdCB3aXRoIChNQVhfQkhfQlVGRi0xKSAqLworCWNoZGxjX3ByaXZfYXJlYS0+YmhfaGVhZCA9IGttYWxsb2MoKHNpemVvZihiaF9kYXRhX3QpKihNQVhfQkhfQlVGRisxKSksR0ZQX0FUT01JQyk7CisJbWVtc2V0KGNoZGxjX3ByaXZfYXJlYS0+YmhfaGVhZCwwLChzaXplb2YoYmhfZGF0YV90KSooTUFYX0JIX0JVRkYrMSkpKTsKKwlhdG9taWNfc2V0KCZjaGRsY19wcml2X2FyZWEtPmJoX2J1ZmZfdXNlZCwgMCk7CisgCisJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJY2hkbGNfcHJpdl9hcmVhLT5yb3V0ZXJfc3RhcnRfdGltZSA9IHR2LnR2X3NlYzsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwl3YW5waXBlX29wZW4oY2FyZCk7CisKKwkvKiBUVFkgaXMgY29uZmlndXJlZCBkdXJpbmcgd2FucGlwZV9zZXRfdGVybWlvcworCSAqIGNhbGwsIG5vdCBoZXJlICovCisJaWYgKGNhcmQtPnR0eV9vcHQpCisJCXJldHVybiBlcnI7CisJCisJc2V0X2JpdCgwLCZjaGRsY19wcml2X2FyZWEtPmNvbmZpZ19jaGRsYyk7CisJY2hkbGNfcHJpdl9hcmVhLT5jb25maWdfY2hkbGNfdGltZW91dD1qaWZmaWVzOworCisJLyogU3RhcnQgdGhlIENIRExDIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgMXNlYyBkZWxheS4KKwkgKiBUaGlzIHdpbGwgZ2l2ZSB0aGUgaW50ZXJmYWNlIGluaXRpbGl6YXRpb24gdGltZQorCSAqIHRvIGZpbmlzaCBpdHMgY29uZmlndXJhdGlvbiAqLworCW1vZF90aW1lcigmY2hkbGNfcHJpdl9hcmVhLT5wb2xsX2RlbGF5X3RpbWVyLCBqaWZmaWVzICsgSFopOworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2xvc2UgbmV0d29yayBpbnRlcmZhY2UuCisgKiBvIGlmIHRoaXMgaXMgdGhlIGxhc3QgY2xvc2UsIHRoZW4gZGlzYWJsZSBjb21tdW5pY2F0aW9ucyBhbmQgaW50ZXJydXB0cy4KKyAqIG8gcmVzZXQgZmxhZ3MuCisgKi8KK3N0YXRpYyBpbnQgaWZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwljaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoZGxjX3ByaXZfYXJlYS0+Y2FyZDsKKworCWlmIChjaGRsY19wcml2X2FyZWEtPmJoX2hlYWQpeworCQlpbnQgaTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkKKwkJZm9yIChpPTA7IGk8KE1BWF9CSF9CVUZGKzEpOyBpKyspeworCQkJc2tiID0gKChiaF9kYXRhX3QgKikmY2hkbGNfcHJpdl9hcmVhLT5iaF9oZWFkW2ldKS0+c2tiOworCQkJaWYgKHNrYiAhPSBOVUxMKXsKKyAgICAgICAgICAgICAgICAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQl9CisJCX0KKwkJa2ZyZWUoY2hkbGNfcHJpdl9hcmVhLT5iaF9oZWFkKTsKKwkJY2hkbGNfcHJpdl9hcmVhLT5iaF9oZWFkPU5VTEw7CisJfQorCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXdhbnBpcGVfY2xvc2UoY2FyZCk7CisJZGVsX3RpbWVyKCZjaGRsY19wcml2X2FyZWEtPnBvbGxfZGVsYXlfdGltZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX2NvbW0gKHNkbGFfdCAqY2FyZCkKK3sKKwlTSEFSRURfTUVNT1JZX0lORk9fU1RSVUNUICpmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKwkKKwlpZiAoY2FyZC0+dS5jLmNvbW1fZW5hYmxlZCl7CisJCWNoZGxjX2Rpc2FibGVfY29tbV9zaHV0ZG93biAoY2FyZCk7CisJfWVsc2V7CisJCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gPSAwOwkKKwl9CisKKwlpZiAoIXR0eV9pbml0X2NudCkKKwkJcmV0dXJuOworCisJaWYgKGNhcmQtPnR0eV9vcHQpeworCQlzdHJ1Y3Qgc2VyaWFsX3N0YXRlICogc3RhdGU7CisJCWlmICghKC0tdHR5X2luaXRfY250KSl7CisJCQlpbnQgZTE7CisJCQlzZXJpYWxfZHJpdmVyLnJlZmNvdW50PTA7CisJCQkKKwkJCWlmICgoZTEgPSB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoJnNlcmlhbF9kcml2ZXIpKSkKKwkJCQlwcmludGsoIlNFUklBTDogZmFpbGVkIHRvIHVucmVnaXN0ZXIgc2VyaWFsIGRyaXZlciAoJWQpXG4iLAorCQkJCSAgICAgICBlMSk7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5yZWdpc3RlcmluZyBUVFkgRHJpdmVyLCBNYWpvciAlaVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSxXQU5fVFRZX01BSk9SKTsKKwkJfQorCQljYXJkLT50dHk9TlVMTDsKKwkJdHR5X2NhcmRfbWFwW2NhcmQtPnR0eV9taW5vcl09TlVMTDsKKwkJc3RhdGUgPSAmcnNfdGFibGVbY2FyZC0+dHR5X21pbm9yXTsKKwkJbWVtc2V0KHN0YXRlLCAwLCBzaXplb2YoKnN0YXRlKSk7CisJfQorCXJldHVybjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEJ1aWxkIG1lZGlhIGhlYWRlci4KKyAqCisgKiBUaGUgdHJpY2sgaGVyZSBpcyB0byBwdXQgcGFja2V0IHR5cGUgKEV0aGVydHlwZSkgaW50byAncHJvdG9jb2wnIGZpZWxkIG9mCisgKiB0aGUgc29ja2V0IGJ1ZmZlciwgc28gdGhhdCB3ZSBkb24ndCBmb3JnZXQgaXQuICBJZiBwYWNrZXQgdHlwZSBpcyBub3QKKyAqIHN1cHBvcnRlZCwgc2V0IHNrYi0+cHJvdG9jb2wgdG8gMCBhbmQgZGlzY2FyZCBwYWNrZXQgbGF0ZXIuCisgKgorICogUmV0dXJuOgltZWRpYSBoZWFkZXIgbGVuZ3RoLgorICovCitzdGF0aWMgaW50IGlmX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiogc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQqIGRhZGRyLCB2b2lkKiBzYWRkciwKKwkJICAgICB1bnNpZ25lZCBsZW4pCit7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKHR5cGUpOworCisJcmV0dXJuIENIRExDX0hEUl9MRU47Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBIYW5kbGUgdHJhbnNtaXQgdGltZW91dCBldmVudCBmcm9tIG5ldGlmIHdhdGNoZG9nCisgKi8KK3N0YXRpYyB2b2lkIGlmX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90ICpjYXJkID0gY2hhbi0+Y2FyZDsKKwkKKwkvKiBJZiBvdXIgZGV2aWNlIHN0YXlzIGJ1c3kgZm9yIGF0IGxlYXN0IDUgc2Vjb25kcyB0aGVuIHdlIHdpbGwKKwkgKiBraWNrIHN0YXJ0IHRoZSBkZXZpY2UgYnkgbWFraW5nIGRldi0+dGJ1c3kgPSAwLiAgV2UgZXhwZWN0CisJICogdGhhdCBvdXIgZGV2aWNlIG5ldmVyIHN0YXlzIGJ1c3kgbW9yZSB0aGFuIDUgc2Vjb25kcy4gU28gdGhpcyAgICAgICAgICAgICAgICAgCisJICogaXMgb25seSB1c2VkIGFzIGEgbGFzdCByZXNvcnQuCisJICovCisKKwkrK2NhcmQtPndhbmRldi5zdGF0cy5jb2xsaXNpb25zOworCisJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQgb24gJXNcbiIsIGNhcmQtPmRldm5hbWUsZGV2LT5uYW1lKTsKKwluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZS1idWlsZCBtZWRpYSBoZWFkZXIuCisgKgorICogUmV0dXJuOgkxCXBoeXNpY2FsIGFkZHJlc3MgcmVzb2x2ZWQuCisgKgkJMAlwaHlzaWNhbCBhZGRyZXNzIG5vdCByZXNvbHZlZAorICovCitzdGF0aWMgaW50IGlmX3JlYnVpbGRfaGRyIChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAxOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCBhIHBhY2tldCBvbiBhIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyBzZXQgdGJ1c3kgZmxhZyAobWFya3Mgc3RhcnQgb2YgdGhlIHRyYW5zbWlzc2lvbikgdG8gYmxvY2sgYSB0aW1lci1iYXNlZAorICogICB0cmFuc21pdCBmcm9tIG92ZXJsYXBwaW5nLgorICogbyBjaGVjayBsaW5rIHN0YXRlLiBJZiBsaW5rIGlzIG5vdCB1cCwgdGhlbiBkcm9wIHRoZSBwYWNrZXQuCisgKiBvIGV4ZWN1dGUgYWRhcHRlciBzZW5kIGNvbW1hbmQuCisgKiBvIGZyZWUgc29ja2V0IGJ1ZmZlcgorICoKKyAqIFJldHVybjoJMAljb21wbGV0ZSAoc29ja2V0IGJ1ZmZlciBtdXN0IGJlIGZyZWVkKQorICoJCW5vbi0wCXBhY2tldCBtYXkgYmUgcmUtdHJhbnNtaXR0ZWQgKHRidXN5IG11c3QgYmUgc2V0KQorICoKKyAqIE5vdGVzOgorICogMS4gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBlaXRoZXIgYnkgdGhlIHByb3RvY29sIHN0YWNrIG9yIGJ5IHRoZSAibmV0CisgKiAgICBib3R0b20gaGFsZiIgKHdpdGggaW50ZXJydXB0cyBlbmFibGVkKS4KKyAqIDIuIFNldHRpbmcgdGJ1c3kgZmxhZyB3aWxsIGluaGliaXQgZnVydGhlciB0cmFuc21pdCByZXF1ZXN0cyBmcm9tIHRoZQorICogICAgcHJvdG9jb2wgc3RhY2sgYW5kIGNhbiBiZSB1c2VkIGZvciBmbG93IGNvbnRyb2wgd2l0aCBwcm90b2NvbCBsYXllci4KKyAqLworc3RhdGljIGludCBpZl9zZW5kKHN0cnVjdCBza19idWZmKiBza2IsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QgKmNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwlzZGxhX3QgKmNhcmQgPSBjaGRsY19wcml2X2FyZWEtPmNhcmQ7CisJU0hBUkVEX01FTU9SWV9JTkZPX1NUUlVDVCAqZmxhZ3MgPSBjYXJkLT51LmMuZmxhZ3M7CisJSU5URVJSVVBUX0lORk9STUFUSU9OX1NUUlVDVCAqY2hkbGNfaW50ID0gJmZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3Q7CisJaW50IHVkcF90eXBlID0gMDsKKwl1bnNpZ25lZCBsb25nIHNtcF9mbGFnczsKKwlpbnQgZXJyPTA7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCisJaWYgKHNrYiA9PSBOVUxMKXsKKwkJLyogSWYgd2UgZ2V0IGhlcmUsIHNvbWUgaGlnaGVyIGxheWVyIHRoaW5rcyB3ZSd2ZSBtaXNzZWQgYW4KKwkJICogdHgtZG9uZSBpbnRlcnJ1cHQuCisJCSAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogaW50ZXJmYWNlICVzIGdvdCBraWNrZWQhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lKTsKKworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCXJldHVybiAwOworCX0KKworICAgCWlmIChudG9ocyhza2ItPnByb3RvY29sKSAhPSBodG9ucyhQVkNfUFJPVCkpeworCisJCS8qIGNoZWNrIHRoZSB1ZHAgcGFja2V0IHR5cGUgKi8KKwkJCisJCXVkcF90eXBlID0gdWRwX3BrdF90eXBlKHNrYiwgY2FyZCk7CisKKwkJaWYgKHVkcF90eXBlID09IFVEUF9DUElQRV9UWVBFKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0b3JlX3VkcF9tZ210X3BrdChVRFBfUEtUX0ZSTV9TVEFDSywgY2FyZCwgc2tiLCBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZGxjX3ByaXZfYXJlYSkpeworCSAgICAgICAgICAgICAgICAJY2hkbGNfaW50LT5pbnRlcnJ1cHRfcGVybWlzc2lvbiB8PQorCQkJCQlBUFBfSU5UX09OX1RJTUVSOworCQkJfQorCQkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogY2hlY2sgdG8gc2VlIGlmIHRoZSBzb3VyY2UgSVAgYWRkcmVzcyBpcyBhIGJyb2FkY2FzdCBvciAqLworCQkvKiBtdWx0aWNhc3QgSVAgYWRkcmVzcyAqLworICAgICAgICAgICAgICAgIGlmKGNoa19iY2FzdF9tY2FzdF9hZGRyKGNhcmQsIGRldiwgc2tiKSl7CisJCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCQlyZXR1cm4gMDsKKwkJfQorICAgICAgICB9CisKKwkvKiBMb2NrIHRoZSA1MDggQ2FyZDogU01QIGlzIHN1cHBvcnRlZCAqLworICAgICAgCWlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KXsKKwkJczUwOF9sb2NrKGNhcmQsJnNtcF9mbGFncyk7CisJfSAKKworICAgIAlpZih0ZXN0X2FuZF9zZXRfYml0KFNFTkRfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKSB7CisJCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDcml0aWNhbCBpbiBpZl9zZW5kOiAlbHhcbiIsCisJCQkJCWNhcmQtPndhbmRldi5uYW1lLGNhcmQtPndhbmRldi5jcml0aWNhbCk7CisgICAgICAgICAgICAgICAgKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJZ290byBpZl9zZW5kX2V4aXRfY3JpdDsKKwl9CisKKwlpZihjYXJkLT51LmMuc3RhdGUgIT0gV0FOX0NPTk5FQ1RFRCl7CisgICAgICAgCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkKKwl9ZWxzZSBpZighc2tiLT5wcm90b2NvbCl7CisgICAgICAgIAkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9lcnJvcnM7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCQorCX1lbHNlIHsKKwkJdm9pZCogZGF0YSA9IHNrYi0+ZGF0YTsKKwkJdW5zaWduZWQgbGVuID0gc2tiLT5sZW47CisJCXVuc2lnbmVkIGNoYXIgYXR0cjsKKworCQkvKiBJZiBpdCdzIGFuIEFQSSBwYWNrZXQgcHVsbCBvZmYgdGhlIEFQSQorCQkgKiBoZWFkZXIuIEFsc28gY2hlY2sgdGhhdCB0aGUgcGFja2V0IHNpemUKKwkJICogaXMgbGFyZ2VyIHRoYW4gdGhlIEFQSSBoZWFkZXIKKwkgICAgICAgICAqLworCQlpZiAoY2FyZC0+dS5jLnVzZWRieSA9PSBBUEkpeworCQkJYXBpX3R4X2hkcl90KiBhcGlfdHhfaGRyOworCisJCQkvKiBkaXNjYXJkIHRoZSBmcmFtZSBpZiB3ZSBhcmUgY29uZmlndXJlZCBmb3IgKi8KKwkJCS8qICdyZWNlaXZlIG9ubHknIG1vZGUgb3IgaWYgdGhlcmUgaXMgbm8gZGF0YSAqLworCQkJaWYgKGNhcmQtPnUuYy5yZWNlaXZlX29ubHkgfHwKKwkJCQkobGVuIDw9IHNpemVvZihhcGlfdHhfaGRyX3QpKSkgeworCQkJCQorCQkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJCQlnb3RvIGlmX3NlbmRfZXhpdF9jcml0OworCQkJfQorCQkJCQorCQkJYXBpX3R4X2hkciA9IChhcGlfdHhfaGRyX3QgKilkYXRhOworCQkJYXR0ciA9IGFwaV90eF9oZHItPmF0dHI7CisJCQlkYXRhICs9IHNpemVvZihhcGlfdHhfaGRyX3QpOworCQkJbGVuIC09IHNpemVvZihhcGlfdHhfaGRyX3QpOworCQl9CisKKwkJaWYoY2hkbGNfc2VuZChjYXJkLCBkYXRhLCBsZW4pKSB7CisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCX1lbHNleworCQkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfcGFja2V0czsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPndhbmRldi5zdGF0cy50eF9ieXRlcyArPSBsZW47CisJCQkKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCQkKKwkJIAlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwkJfQkKKwl9CisKK2lmX3NlbmRfZXhpdF9jcml0OgorCQorCWlmICghKGVycj1uZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpKSB7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfWVsc2V7CisJCWNoZGxjX3ByaXZfYXJlYS0+dGlja19jb3VudGVyID0gamlmZmllczsKKwkJY2hkbGNfaW50LT5pbnRlcnJ1cHRfcGVybWlzc2lvbiB8PSBBUFBfSU5UX09OX1RYX0ZSQU1FOworCX0KKworCWNsZWFyX2JpdChTRU5EX0NSSVQsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwlpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCl7CisJCXM1MDhfdW5sb2NrKGNhcmQsJnNtcF9mbGFncyk7CisJfQorCQorCXJldHVybiBlcnI7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDaGVjayB0byBzZWUgaWYgdGhlIHBhY2tldCB0byBiZSB0cmFuc21pdHRlZCBjb250YWlucyBhIGJyb2FkY2FzdCBvcgorICogbXVsdGljYXN0IHNvdXJjZSBJUCBhZGRyZXNzLgorICovCisKK3N0YXRpYyBpbnQgY2hrX2JjYXN0X21jYXN0X2FkZHIoc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJdTMyIHNyY19pcF9hZGRyOworICAgICAgICB1MzIgYnJvYWRjYXN0X2lwX2FkZHIgPSAwOworICAgICAgICBzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisKKyAgICAgICAgLyogcmVhZCB0aGUgSVAgc291cmNlIGFkZHJlc3MgZnJvbSB0aGUgb3V0Z29pbmcgcGFja2V0ICovCisgICAgICAgIHNyY19pcF9hZGRyID0gKih1MzIgKikoc2tiLT5kYXRhICsgMTIpOworCisJLyogcmVhZCB0aGUgSVAgYnJvYWRjYXN0IGFkZHJlc3MgZm9yIHRoZSBkZXZpY2UgKi8KKyAgICAgICAgaW5fZGV2ID0gZGV2LT5pcF9wdHI7CisgICAgICAgIGlmKGluX2RldiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IGluX2lmYWRkciAqaWZhPSBpbl9kZXYtPmlmYV9saXN0OworICAgICAgICAgICAgICAgIGlmKGlmYSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0X2lwX2FkZHIgPSBpZmEtPmlmYV9icm9hZGNhc3Q7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAKKyAgICAgICAgLyogY2hlY2sgaWYgdGhlIElQIFNvdXJjZSBBZGRyZXNzIGlzIGEgQnJvYWRjYXN0IGFkZHJlc3MgKi8KKyAgICAgICAgaWYoKGRldi0+ZmxhZ3MgJiBJRkZfQlJPQURDQVNUKSAmJiAoc3JjX2lwX2FkZHIgPT0gYnJvYWRjYXN0X2lwX2FkZHIpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJyb2FkY2FzdCBTb3VyY2UgQWRkcmVzcyBzaWxlbnRseSBkaXNjYXJkZWRcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gCisKKyAgICAgICAgLyogY2hlY2sgaWYgdGhlIElQIFNvdXJjZSBBZGRyZXNzIGlzIGEgTXVsdGljYXN0IGFkZHJlc3MgKi8KKyAgICAgICAgaWYoKG50b2hsKHNyY19pcF9hZGRyKSA+PSAweEUwMDAwMDAxKSAmJgorCQkobnRvaGwoc3JjX2lwX2FkZHIpIDw9IDB4RkZGRkZGRkUpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE11bHRpY2FzdCBTb3VyY2UgQWRkcmVzcyBzaWxlbnRseSBkaXNjYXJkZWRcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlcGx5IHRvIFVEUCBNYW5hZ2VtZW50IHN5c3RlbS4KKyAqIFJldHVybiBsZW5ndGggb2YgcmVwbHkuCisgKi8KK3N0YXRpYyBpbnQgcmVwbHlfdWRwKCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgbWJveF9sZW4gKQoreworCisJdW5zaWduZWQgc2hvcnQgbGVuLCB1ZHBfbGVuZ3RoLCB0ZW1wLCBpcF9sZW5ndGg7CisJdW5zaWduZWQgbG9uZyBpcF90ZW1wOworCWludCBldmVuX2JvdW5kID0gMDsKKyAgCWNoZGxjX3VkcF9wa3RfdCAqY191ZHBfcGt0ID0gKGNoZGxjX3VkcF9wa3RfdCAqKWRhdGE7CisJIAorCS8qIFNldCBsZW5ndGggb2YgcGFja2V0ICovCisJbGVuID0gc2l6ZW9mKGlwX3BrdF90KSsgCisJICAgICAgc2l6ZW9mKHVkcF9wa3RfdCkrCisJICAgICAgc2l6ZW9mKHdwX21nbXRfdCkrCisJICAgICAgc2l6ZW9mKGNibG9ja190KSsKKwkgICAgICBzaXplb2YodHJhY2VfaW5mb190KSsgCisJICAgICAgbWJveF9sZW47CisKKwkvKiBmaWxsIGluIFVEUCByZXBseSAqLworCWNfdWRwX3BrdC0+d3BfbWdtdC5yZXF1ZXN0X3JlcGx5ID0gVURQTUdNVF9SRVBMWTsKKyAgIAorCS8qIGZpbGwgaW4gVURQIGxlbmd0aCAqLworCXVkcF9sZW5ndGggPSBzaXplb2YodWRwX3BrdF90KSsgCisJCSAgICAgc2l6ZW9mKHdwX21nbXRfdCkrCisJCSAgICAgc2l6ZW9mKGNibG9ja190KSsKKwkgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlX2luZm9fdCkrCisJCSAgICAgbWJveF9sZW47IAorCisgCS8qIHB1dCBpdCBvbiBhbiBldmVuIGJvdW5kYXJ5ICovCisJaWYgKCB1ZHBfbGVuZ3RoICYgMHgwMDAxICkgeworCQl1ZHBfbGVuZ3RoICs9IDE7CisJCWxlbiArPSAxOworCQlldmVuX2JvdW5kID0gMTsKKwl9ICAKKworCXRlbXAgPSAodWRwX2xlbmd0aDw8OCl8KHVkcF9sZW5ndGg+PjgpOworCWNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfbGVuZ3RoID0gdGVtcDsKKwkJIAorCS8qIHN3YXAgVURQIHBvcnRzICovCisJdGVtcCA9IGNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfc3JjX3BvcnQ7CisJY191ZHBfcGt0LT51ZHBfcGt0LnVkcF9zcmNfcG9ydCA9IAorCQkJY191ZHBfcGt0LT51ZHBfcGt0LnVkcF9kc3RfcG9ydDsgCisJY191ZHBfcGt0LT51ZHBfcGt0LnVkcF9kc3RfcG9ydCA9IHRlbXA7CisKKwkvKiBhZGQgVURQIHBzZXVkbyBoZWFkZXIgKi8KKwl0ZW1wID0gMHgxMTAwOworCSooKHVuc2lnbmVkIHNob3J0ICopKGNfdWRwX3BrdC0+ZGF0YSttYm94X2xlbitldmVuX2JvdW5kKSkgPSB0ZW1wOwkKKwl0ZW1wID0gKHVkcF9sZW5ndGg8PDgpfCh1ZHBfbGVuZ3RoPj44KTsKKwkqKCh1bnNpZ25lZCBzaG9ydCAqKShjX3VkcF9wa3QtPmRhdGErbWJveF9sZW4rZXZlbl9ib3VuZCsyKSkgPSB0ZW1wOworCisJCSAKKwkvKiBjYWxjdWxhdGUgVURQIGNoZWNrc3VtICovCisJY191ZHBfcGt0LT51ZHBfcGt0LnVkcF9jaGVja3N1bSA9IDA7CisJY191ZHBfcGt0LT51ZHBfcGt0LnVkcF9jaGVja3N1bSA9IGNhbGNfY2hlY2tzdW0oJmRhdGFbVURQX09GRlNFVF0sdWRwX2xlbmd0aCtVRFBfT0ZGU0VUKTsKKworCS8qIGZpbGwgaW4gSVAgbGVuZ3RoICovCisJaXBfbGVuZ3RoID0gbGVuOworCXRlbXAgPSAoaXBfbGVuZ3RoPDw4KXwoaXBfbGVuZ3RoPj44KTsKKwljX3VkcF9wa3QtPmlwX3BrdC50b3RhbF9sZW5ndGggPSB0ZW1wOworICAKKwkvKiBzd2FwIElQIGFkZHJlc3NlcyAqLworCWlwX3RlbXAgPSBjX3VkcF9wa3QtPmlwX3BrdC5pcF9zcmNfYWRkcmVzczsKKwljX3VkcF9wa3QtPmlwX3BrdC5pcF9zcmNfYWRkcmVzcyA9IGNfdWRwX3BrdC0+aXBfcGt0LmlwX2RzdF9hZGRyZXNzOworCWNfdWRwX3BrdC0+aXBfcGt0LmlwX2RzdF9hZGRyZXNzID0gaXBfdGVtcDsKKworCS8qIGZpbGwgaW4gSVAgY2hlY2tzdW0gKi8KKwljX3VkcF9wa3QtPmlwX3BrdC5oZHJfY2hlY2tzdW0gPSAwOworCWNfdWRwX3BrdC0+aXBfcGt0Lmhkcl9jaGVja3N1bSA9IGNhbGNfY2hlY2tzdW0oZGF0YSxzaXplb2YoaXBfcGt0X3QpKTsKKworCXJldHVybiBsZW47CisKK30gLyogcmVwbHlfdWRwICovCisKK3Vuc2lnbmVkIHNob3J0IGNhbGNfY2hlY2tzdW0gKGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJdW5zaWduZWQgc2hvcnQgdGVtcDsgCisJdW5zaWduZWQgbG9uZyBzdW09MDsKKwlpbnQgaTsKKworCWZvciggaSA9IDA7IGkgPGxlbjsgaSs9MiApIHsKKwkJbWVtY3B5KCZ0ZW1wLCZkYXRhW2ldLDIpOworCQlzdW0gKz0gKHVuc2lnbmVkIGxvbmcpdGVtcDsKKwl9CisKKwl3aGlsZSAoc3VtID4+IDE2ICkgeworCQlzdW0gPSAoc3VtICYgMHhmZmZmVUwpICsgKHN1bSA+PiAxNik7CisJfQorCisJdGVtcCA9ICh1bnNpZ25lZCBzaG9ydClzdW07CisJdGVtcCA9IH50ZW1wOworCisJaWYoIHRlbXAgPT0gMCApIAorCQl0ZW1wID0gMHhmZmZmOworCisJcmV0dXJuIHRlbXA7CQorfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogR2V0IGV0aGVybmV0LXN0eWxlIGludGVyZmFjZSBzdGF0aXN0aWNzLgorICogUmV0dXJuIGEgcG9pbnRlciB0byBzdHJ1Y3QgZW5ldF9zdGF0aXN0aWNzLgorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqIGlmX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJc2RsYV90ICpteV9jYXJkOworCWNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGRsY19wcml2X2FyZWE7CisKKwlpZiAoKGNoZGxjX3ByaXZfYXJlYT1kZXYtPnByaXYpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbXlfY2FyZCA9IGNoZGxjX3ByaXZfYXJlYS0+Y2FyZDsKKwlyZXR1cm4gJm15X2NhcmQtPndhbmRldi5zdGF0czsgCit9CisKKworLyoqKioqKiBDaXNjbyBIRExDIEZpcm13YXJlIEludGVyZmFjZSBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZWFkIGZpcm13YXJlIGNvZGUgdmVyc2lvbi4KKyAqCVB1dCBjb2RlIHZlcnNpb24gYXMgQVNDSUkgc3RyaW5nIGluIHN0ci4gCisgKi8KK3N0YXRpYyBpbnQgY2hkbGNfcmVhZF92ZXJzaW9uIChzZGxhX3QqIGNhcmQsIGNoYXIqIHN0cikKK3sKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworCWludCBsZW47CisJY2hhciBlcnI7CisJbWItPmJ1ZmZlcl9sZW5ndGggPSAwOworCW1iLT5jb21tYW5kID0gUkVBRF9DSERMQ19DT0RFX1ZFUlNJT047CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCisJaWYoZXJyICE9IENPTU1BTkRfT0spIHsKKwkJY2hkbGNfZXJyb3IoY2FyZCxlcnIsbWIpOworCX0KKwllbHNlIGlmIChzdHIpIHsgIC8qIGlzIG5vdCBudWxsICovCisJCWxlbiA9IG1iLT5idWZmZXJfbGVuZ3RoOworCQltZW1jcHkoc3RyLCBtYi0+ZGF0YSwgbGVuKTsKKwkJc3RyW2xlbl0gPSAnXDAnOworCX0KKwlyZXR1cm4gKGVycik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBDb25maWd1cmUgQ0hETEMgZmlybXdhcmUuCisgKi8KK3N0YXRpYyBpbnQgY2hkbGNfY29uZmlndXJlIChzZGxhX3QqIGNhcmQsIHZvaWQqIGRhdGEpCit7CisJaW50IGVycjsKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCAqbWFpbGJveCA9IGNhcmQtPm1ib3g7CisJaW50IGRhdGFfbGVuZ3RoID0gc2l6ZW9mKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUKTsKKwkKKwltYWlsYm94LT5idWZmZXJfbGVuZ3RoID0gZGF0YV9sZW5ndGg7ICAKKwltZW1jcHkobWFpbGJveC0+ZGF0YSwgZGF0YSwgZGF0YV9sZW5ndGgpOworCW1haWxib3gtPmNvbW1hbmQgPSBTRVRfQ0hETENfQ09ORklHVVJBVElPTjsKKwllcnIgPSBzZGxhX2V4ZWMobWFpbGJveCkgPyBtYWlsYm94LT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCQorCWlmIChlcnIgIT0gQ09NTUFORF9PSykgY2hkbGNfZXJyb3IgKGNhcmQsIGVyciwgbWFpbGJveCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlyZXR1cm4gZXJyOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IGludGVycnVwdCBtb2RlIC0tIEhETEMgVmVyc2lvbi4KKyAqLworCitzdGF0aWMgaW50IGNoZGxjX3NldF9pbnRyX21vZGUgKHNkbGFfdCogY2FyZCwgdW5zaWduZWQgbW9kZSkKK3sKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworCUNIRExDX0lOVF9UUklHR0VSU19TVFJVQ1QqIGludF9kYXRhID0KKwkJIChDSERMQ19JTlRfVFJJR0dFUlNfU1RSVUNUICopbWItPmRhdGE7CisJaW50IGVycjsKKworCWludF9kYXRhLT5DSERMQ19pbnRlcnJ1cHRfdHJpZ2dlcnMgCT0gbW9kZTsKKwlpbnRfZGF0YS0+SVJRCQkJCT0gY2FyZC0+aHcuaXJxOworCWludF9kYXRhLT5pbnRlcnJ1cHRfdGltZXIgICAgICAgICAgICAgICA9IDE7CisgICAKKwltYi0+YnVmZmVyX2xlbmd0aCA9IHNpemVvZihDSERMQ19JTlRfVFJJR0dFUlNfU1RSVUNUKTsKKwltYi0+Y29tbWFuZCA9IFNFVF9DSERMQ19JTlRFUlJVUFRfVFJJR0dFUlM7CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCWlmIChlcnIgIT0gQ09NTUFORF9PSykKKwkJY2hkbGNfZXJyb3IgKGNhcmQsIGVyciwgbWIpOworCXJldHVybiBlcnI7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogY2hkbGNfZGlzYWJsZV9jb21tX3NodXRkb3duCisgKgorICogU2h1dGRvd24oKSBkaXNhYmxlcyB0aGUgY29tbXVuaWNhdGlvbnMuIFdlIG11c3QKKyAqIGhhdmUgYSBzcGFyYXRlIGZ1bmN0aW9ucywgYmVjYXVzZSB3ZSBtdXN0IG5vdAorICogY2FsbCBjaGRsY19lcnJvcigpIGhhbmRlciBzaW5jZSB0aGUgcHJpdmF0ZQorICogYXJlYSBoYXMgYWxyZWFkeSBiZWVuIHJlcGxhY2VkICovCisKK3N0YXRpYyBpbnQgY2hkbGNfZGlzYWJsZV9jb21tX3NodXRkb3duIChzZGxhX3QgKmNhcmQpCit7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKwlDSERMQ19JTlRfVFJJR0dFUlNfU1RSVUNUKiBpbnRfZGF0YSA9CisJCSAoQ0hETENfSU5UX1RSSUdHRVJTX1NUUlVDVCAqKW1iLT5kYXRhOworCWludCBlcnI7CisKKwkvKiBEaXNhYmxlIEludGVycnV0cHMgKi8KKwlpbnRfZGF0YS0+Q0hETENfaW50ZXJydXB0X3RyaWdnZXJzIAk9IDA7CisJaW50X2RhdGEtPklSUQkJCQk9IGNhcmQtPmh3LmlycTsKKwlpbnRfZGF0YS0+aW50ZXJydXB0X3RpbWVyICAgICAgICAgICAgICAgPSAxOworICAgCisJbWItPmJ1ZmZlcl9sZW5ndGggPSBzaXplb2YoQ0hETENfSU5UX1RSSUdHRVJTX1NUUlVDVCk7CisJbWItPmNvbW1hbmQgPSBTRVRfQ0hETENfSU5URVJSVVBUX1RSSUdHRVJTOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKworCS8qIERpc2FibGUgQ29tbXVuaWNhdGlvbnMgKi8KKworCWlmIChjYXJkLT51LmMuYXN5bmNfbW9kZSkgeworCQltYi0+Y29tbWFuZCA9IERJU0FCTEVfQVNZX0NPTU1VTklDQVRJT05TOworCX1lbHNleworCQltYi0+Y29tbWFuZCA9IERJU0FCTEVfQ0hETENfQ09NTVVOSUNBVElPTlM7CisJfQorCQorCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJCisJY2FyZC0+dS5jLmNvbW1fZW5hYmxlZCA9IDA7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRW5hYmxlIGNvbW11bmljYXRpb25zLgorICovCisKK3N0YXRpYyBpbnQgY2hkbGNfY29tbV9lbmFibGUgKHNkbGFfdCogY2FyZCkKK3sKKwlpbnQgZXJyOworCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYiA9IGNhcmQtPm1ib3g7CisKKwltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJbWItPmNvbW1hbmQgPSBFTkFCTEVfQ0hETENfQ09NTVVOSUNBVElPTlM7CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCWlmIChlcnIgIT0gQ09NTUFORF9PSykKKwkJY2hkbGNfZXJyb3IoY2FyZCwgZXJyLCBtYik7CisJZWxzZQorCQljYXJkLT51LmMuY29tbV9lbmFibGVkID0gMTsKKwkKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlYWQgY29tbXVuaWNhdGlvbiBlcnJvciBzdGF0aXN0aWNzLgorICovCitzdGF0aWMgaW50IGNoZGxjX3JlYWRfY29tbV9lcnJfc3RhdHMgKHNkbGFfdCogY2FyZCkKK3sKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKworICAgICAgICBtYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisgICAgICAgIG1iLT5jb21tYW5kID0gUkVBRF9DT01NU19FUlJPUl9TVEFUUzsKKyAgICAgICAgZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworICAgICAgICBpZiAoZXJyICE9IENPTU1BTkRfT0spCisgICAgICAgICAgICAgICAgY2hkbGNfZXJyb3IoY2FyZCxlcnIsbWIpOworICAgICAgICByZXR1cm4gZXJyOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBDSERMQyBvcGVyYXRpb25hbCBzdGF0aXN0aWNzLgorICovCitzdGF0aWMgaW50IGNoZGxjX3JlYWRfb3Bfc3RhdHMgKHNkbGFfdCogY2FyZCkKK3sKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKworICAgICAgICBtYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisgICAgICAgIG1iLT5jb21tYW5kID0gUkVBRF9DSERMQ19PUEVSQVRJT05BTF9TVEFUUzsKKyAgICAgICAgZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworICAgICAgICBpZiAoZXJyICE9IENPTU1BTkRfT0spCisgICAgICAgICAgICAgICAgY2hkbGNfZXJyb3IoY2FyZCxlcnIsbWIpOworICAgICAgICByZXR1cm4gZXJyOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXBkYXRlIGNvbW11bmljYXRpb25zIGVycm9yIGFuZCBnZW5lcmFsIHBhY2tldCBzdGF0aXN0aWNzLgorICovCitzdGF0aWMgaW50IHVwZGF0ZV9jb21tc19zdGF0cyhzZGxhX3QqIGNhcmQsCisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSkKK3sKKyAgICAgICAgQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKyAgCUNPTU1TX0VSUk9SX1NUQVRTX1NUUlVDVCogZXJyX3N0YXRzOworICAgICAgICBDSERMQ19PUEVSQVRJT05BTF9TVEFUU19TVFJVQ1QgKm9wX3N0YXRzOworCisJLyogb24gdGhlIGZpcnN0IHRpbWVyIGludGVycnVwdCwgcmVhZCB0aGUgY29tbXMgZXJyb3Igc3RhdGlzdGljcyAqLworCWlmKGNoZGxjX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzID09IDIpIHsKKwkJaWYoY2hkbGNfcmVhZF9jb21tX2Vycl9zdGF0cyhjYXJkKSkKKwkJCXJldHVybiAxOworCQllcnJfc3RhdHMgPSAoQ09NTVNfRVJST1JfU1RBVFNfU1RSVUNUICopbWItPmRhdGE7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9vdmVyX2Vycm9ycyA9IAorCQkJCWVycl9zdGF0cy0+Unhfb3ZlcnJ1bl9lcnJfY291bnQ7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9jcmNfZXJyb3JzID0gCisJCQkJZXJyX3N0YXRzLT5DUkNfZXJyX2NvdW50OworCQljYXJkLT53YW5kZXYuc3RhdHMucnhfZnJhbWVfZXJyb3JzID0gCisJCQkJZXJyX3N0YXRzLT5SeF9hYm9ydF9jb3VudDsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2ZpZm9fZXJyb3JzID0gCisJCQkJZXJyX3N0YXRzLT5SeF9kaXNfcHJpX2JmcnNfZnVsbF9jb3VudDsgCisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0KKwkJCQljYXJkLT53YW5kZXYuc3RhdHMucnhfZmlmb19lcnJvcnM7CisJCWNhcmQtPndhbmRldi5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9CisJCQkJZXJyX3N0YXRzLT5zZWNfVHhfYWJvcnRfY291bnQ7CisJfQorCisgICAgICAgIC8qIG9uIHRoZSBzZWNvbmQgdGltZXIgaW50ZXJydXB0LCByZWFkIHRoZSBvcGVyYXRpb25hbCBzdGF0aXN0aWNzICovCisJZWxzZSB7CisgICAgICAgIAlpZihjaGRsY19yZWFkX29wX3N0YXRzKGNhcmQpKQorICAgICAgICAgICAgICAgIAlyZXR1cm4gMTsKKwkJb3Bfc3RhdHMgPSAoQ0hETENfT1BFUkFUSU9OQUxfU1RBVFNfU1RSVUNUICopbWItPmRhdGE7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0KKwkJCShvcF9zdGF0cy0+UnhfRGF0YV9kaXNjYXJkX3Nob3J0X2NvdW50ICsKKwkJCW9wX3N0YXRzLT5SeF9EYXRhX2Rpc2NhcmRfbG9uZ19jb3VudCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCBwYWNrZXQuCisgKglSZXR1cm46CTAgLSBvLmsuCisgKgkJMSAtIG5vIHRyYW5zbWl0IGJ1ZmZlcnMgYXZhaWxhYmxlCisgKi8KK3N0YXRpYyBpbnQgY2hkbGNfc2VuZCAoc2RsYV90KiBjYXJkLCB2b2lkKiBkYXRhLCB1bnNpZ25lZCBsZW4pCit7CisJQ0hETENfREFUQV9UWF9TVEFUVVNfRUxfU1RSVUNUICp0eGJ1ZiA9IGNhcmQtPnUuYy50eGJ1ZjsKKworCWlmICh0eGJ1Zi0+b3BwX2ZsYWcpCisJCXJldHVybiAxOworCQorCXNkbGFfcG9rZSgmY2FyZC0+aHcsIHR4YnVmLT5wdHJfZGF0YV9iZnIsIGRhdGEsIGxlbik7CisKKwl0eGJ1Zi0+ZnJhbWVfbGVuZ3RoID0gbGVuOworCXR4YnVmLT5vcHBfZmxhZyA9IDE7CQkvKiBzdGFydCB0cmFuc21pc3Npb24gKi8KKwkKKwkvKiBVcGRhdGUgdHJhbnNtaXQgYnVmZmVyIGNvbnRyb2wgZmllbGRzICovCisJY2FyZC0+dS5jLnR4YnVmID0gKyt0eGJ1ZjsKKwkKKwlpZiAoKHZvaWQqKXR4YnVmID4gY2FyZC0+dS5jLnR4YnVmX2xhc3QpCisJCWNhcmQtPnUuYy50eGJ1ZiA9IGNhcmQtPnUuYy50eGJ1Zl9iYXNlOworCQorCXJldHVybiAwOworfQorCisvKioqKioqIEZpcm13YXJlIEVycm9yIEhhbmRsZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGaXJtd2FyZSBlcnJvciBoYW5kbGVyLgorICoJVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuZXZlciBmaXJtd2FyZSBjb21tYW5kIHJldHVybnMgbm9uLXplcm8KKyAqCXJldHVybiBjb2RlLgorICoKKyAqIFJldHVybiB6ZXJvIGlmIHByZXZpb3VzIGNvbW1hbmQgaGFzIHRvIGJlIGNhbmNlbGxlZC4KKyAqLworc3RhdGljIGludCBjaGRsY19lcnJvciAoc2RsYV90ICpjYXJkLCBpbnQgZXJyLCBDSERMQ19NQUlMQk9YX1NUUlVDVCAqbWIpCit7CisJdW5zaWduZWQgY21kID0gbWItPmNvbW1hbmQ7CisKKwlzd2l0Y2ggKGVycikgeworCisJY2FzZSBDTURfVElNRU9VVDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbW1hbmQgMHglMDJYIHRpbWVkIG91dCFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBjbWQpOworCQlicmVhazsKKworCWNhc2UgUzUxNF9CT1RIX1BPUlRTX1NBTUVfQ0xLX01PREU6CisJCWlmKGNtZCA9PSBTRVRfQ0hETENfQ09ORklHVVJBVElPTikgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICIlczogQ29uZmlndXJlIGJvdGggcG9ydHMgZm9yIHRoZSBzYW1lIGNsb2NrIHNvdXJjZVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICIlczogY29tbWFuZCAweCUwMlggcmV0dXJuZWQgMHglMDJYIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIGNtZCwgZXJyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKiBCb3R0b20gSGFsZiBIYW5kbGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTk9URTogVGhlcmUgaXMgbm8gQVBJLCBCSCBzdXBwb3J0IGZvciBLZXJuZWxzIGxvd2VyIHRoYW4gMi4yLlguCisgKiAgICAgICBETyBOT1QgSU5TRVJUIEFOWSBDT0RFIEhFUkUsIE5PVElDRSBUSEUgCisgKiAgICAgICBQUkVQUk9DRVNTT1IgU1RBVEVNRU5UIEFCT1ZFLCBVTkxFU1MgWU9VIEtOT1cgV0hBVCBZT1UgQVJFCisgKiAgICAgICBET0lORyAqLworCitzdGF0aWMgdm9pZCBjaGRsY193b3JrKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCWNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCAqY2FyZCA9IGNoYW4tPmNhcmQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlmIChhdG9taWNfcmVhZCgmY2hhbi0+YmhfYnVmZl91c2VkKSA9PSAwKXsKKwkJY2xlYXJfYml0KDAsICZjaGFuLT50cV93b3JraW5nKTsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlIChhdG9taWNfcmVhZCgmY2hhbi0+YmhfYnVmZl91c2VkKSl7CisKKwkJc2tiICA9ICgoYmhfZGF0YV90ICopJmNoYW4tPmJoX2hlYWRbY2hhbi0+YmhfcmVhZF0pLT5za2I7CisKKwkJaWYgKHNrYiAhPSBOVUxMKXsKKworCQkJaWYgKGNoYW4tPmNvbW1vbi5zayA9PSBOVUxMIHx8IGNoYW4tPmNvbW1vbi5mdW5jID09IE5VTEwpeworCQkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCQljaGRsY193b3JrX2NsZWFudXAoZGV2KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKGNoYW4tPmNvbW1vbi5mdW5jKHNrYixkZXYsY2hhbi0+Y29tbW9uLnNrKSAhPSAwKXsKKwkJCQkvKiBTb2NrIGZ1bGwgY2Fubm90IHNlbmQsIHF1ZXVlIHVzIGZvciBhbm90aGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRyeSAqLworCQkJCWF0b21pY19zZXQoJmNoYW4tPmNvbW1vbi5yZWNlaXZlX2Jsb2NrLDEpOworCQkJCXJldHVybjsKKwkJCX1lbHNleworCQkJCWNoZGxjX3dvcmtfY2xlYW51cChkZXYpOworCQkJfQorCQl9ZWxzZXsKKwkJCWNoZGxjX3dvcmtfY2xlYW51cChkZXYpOworCQl9CisJfQkKKwljbGVhcl9iaXQoMCwgJmNoYW4tPnRxX3dvcmtpbmcpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IGNoZGxjX3dvcmtfY2xlYW51cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGFuID0gZGV2LT5wcml2OworCisJKChiaF9kYXRhX3QgKikmY2hhbi0+YmhfaGVhZFtjaGFuLT5iaF9yZWFkXSktPnNrYiA9IE5VTEw7CisKKwlpZiAoY2hhbi0+YmhfcmVhZCA9PSBNQVhfQkhfQlVGRil7CisJCWNoYW4tPmJoX3JlYWQ9MDsKKwl9ZWxzZXsKKwkJKytjaGFuLT5iaF9yZWFkOwkKKwl9CisKKwlhdG9taWNfZGVjKCZjaGFuLT5iaF9idWZmX3VzZWQpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCBiaF9lbnF1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJLyogQ2hlY2sgZm9yIGZ1bGwgKi8KKwljaGRsY19wcml2YXRlX2FyZWFfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzZGxhX3QgKmNhcmQgPSBjaGFuLT5jYXJkOworCisJaWYgKGF0b21pY19yZWFkKCZjaGFuLT5iaF9idWZmX3VzZWQpID09IChNQVhfQkhfQlVGRisxKSl7CisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybiAxOyAKKwl9CisKKwkoKGJoX2RhdGFfdCAqKSZjaGFuLT5iaF9oZWFkW2NoYW4tPmJoX3dyaXRlXSktPnNrYiA9IHNrYjsKKworCWlmIChjaGFuLT5iaF93cml0ZSA9PSBNQVhfQkhfQlVGRil7CisJCWNoYW4tPmJoX3dyaXRlPTA7CisJfWVsc2V7CisJCSsrY2hhbi0+Ymhfd3JpdGU7CisJfQorCisJYXRvbWljX2luYygmY2hhbi0+YmhfYnVmZl91c2VkKTsKKworCXJldHVybiAwOworfQorCisvKiBFTkQgT0YgQVBJIEJIIFN1cHBvcnQgKi8KKworCisvKioqKioqIEludGVycnVwdCBIYW5kbGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDaXNjbyBIRExDIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUuCisgKi8KK3N0YXRpYyB2b2lkIHdwY19pc3IgKHNkbGFfdCogY2FyZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2OworCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QqIGZsYWdzID0gTlVMTDsKKwlpbnQgaTsKKwlzZGxhX3QgKm15X2NhcmQ7CisKKworCS8qIENoZWNrIGZvciB3aGljaCBwb3J0IHRoZSBpbnRlcnJ1cHQgaGFzIGJlZW4gZ2VuZXJhdGVkCisJICogU2luY2UgU2Vjb25kYXJ5IFBvcnQgaXMgcGlnZ3liYWNraW5nIG9uIHRoZSBQcmltYXJ5CisgICAgICAgICAqIHRoZSBjaGVjayBtdXN0IGJlIGRvbmUgaGVyZS4gCisJICovCisKKwlmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKwlpZiAoIWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3R5cGUpeworCQkvKiBDaGVjayBmb3IgYSBzZWNvbmQgcG9ydCAocGlnZ3liYWNraW5nKSAqLworCQlpZiAoKG15X2NhcmQgPSBjYXJkLT5uZXh0KSl7CisJCQlmbGFncyA9IG15X2NhcmQtPnUuYy5mbGFnczsKKwkJCWlmIChmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF90eXBlKXsKKwkJCQljYXJkID0gbXlfY2FyZDsKKwkJCQljYXJkLT5pc3IoY2FyZCk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorCisJZmxhZ3MgPSBjYXJkLT51LmMuZmxhZ3M7CisJY2FyZC0+aW5faXNyID0gMTsKKwlkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCQorCS8qIElmIHdlIGdldCBhbiBpbnRlcnJ1cHQgd2l0aCBubyBuZXR3b3JrIGRldmljZSwgc3RvcCB0aGUgaW50ZXJydXB0cworCSAqIGFuZCBpc3N1ZSBhbiBlcnJvciAqLworCWlmICghY2FyZC0+dHR5X29wdCAmJiAhZGV2ICYmIAorCSAgICBmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF90eXBlICE9IAorCSAgICAJQ09NTUFORF9DT01QTEVURV9BUFBfSU5UX1BFTkQpeworCisJCWdvdG8gaXNyX2RvbmU7CisJfQorCQorCS8qIGlmIGNyaXRpY2FsIGR1ZSB0byBwZXJpcGhlcmFsIG9wZXJhdGlvbnMKKwkgKiBpZS4gdXBkYXRlKCkgb3IgZ2V0c3RhdHMoKSB0aGVuIHJlc2V0IHRoZSBpbnRlcnJ1cHQgYW5kCisJICogd2FpdCBmb3IgdGhlIGJvYXJkIHRvIHJldHJpZ2dlci4KKwkgKi8KKwlpZih0ZXN0X2JpdChQRVJJX0NSSVQsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJJU1IgQ1JJVCBUTyBQRVJJXG4iKTsKKwkJZ290byBpc3JfZG9uZTsKKwl9CisKKwkvKiBPbiBhIDUwOCBDYXJkLCBpZiBjcml0aWNhbCBkdWUgdG8gaWZfc2VuZCAKKyAgICAgICAgICogTWFqb3IgRXJyb3IgISEhICovCisJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpIHsKKwkJaWYodGVzdF9iaXQoU0VORF9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDcml0aWNhbCB3aGlsZSBpbiBJU1I6ICVseFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCBjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQkJY2FyZC0+aW5faXNyID0gMDsKKwkJCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3R5cGUgPSAwOworCQkJcmV0dXJuOworCQl9CisJfQorCisJc3dpdGNoKGZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3R5cGUpIHsKKworCWNhc2UgUlhfQVBQX0lOVF9QRU5EOgkvKiAweDAxOiByZWNlaXZlIGludGVycnVwdCAqLworCQlyeF9pbnRyKGNhcmQpOworCQlicmVhazsKKworCWNhc2UgVFhfQVBQX0lOVF9QRU5EOgkvKiAweDAyOiB0cmFuc21pdCBpbnRlcnJ1cHQgKi8KKwkJZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfcGVybWlzc2lvbiAmPQorCQkJIH5BUFBfSU5UX09OX1RYX0ZSQU1FOworCisJCWlmIChjYXJkLT50dHlfb3B0KXsKKwkJCXdhbnBpcGVfdHR5X3RyaWdnZXJfcG9sbChjYXJkKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGRldiAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpeworCQkJaWYgKGNhcmQtPnUuYy51c2VkYnkgPT0gQVBJKXsKKwkJCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkJCXdha2V1cF9za19iaChkZXYpOworCQkJfWVsc2V7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBDT01NQU5EX0NPTVBMRVRFX0FQUF9JTlRfUEVORDovKiAweDA0OiBjbWQgY3BsdCAqLworCQkrKyBJbnRyX3Rlc3RfY291bnRlcjsKKwkJYnJlYWs7CisKKwljYXNlIENIRExDX0VYQ0VQX0NPTkRfQVBQX0lOVF9QRU5EOgkvKiAweDIwICovCisJCXByb2Nlc3NfY2hkbGNfZXhjZXB0aW9uKGNhcmQpOworCQlicmVhazsKKworCWNhc2UgR0xPQkFMX0VYQ0VQX0NPTkRfQVBQX0lOVF9QRU5EOgorCQlwcm9jZXNzX2dsb2JhbF9leGNlcHRpb24oY2FyZCk7CisJCWJyZWFrOworCisJY2FzZSBUSU1FUl9BUFBfSU5UX1BFTkQ6CisJCXRpbWVyX2ludHIoY2FyZCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNwdXJpb3VzIGludGVycnVwdCAweCUwMlghXG4iLCAKKwkJCWNhcmQtPmRldm5hbWUsCisJCQlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF90eXBlKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ29kZSBuYW1lOiAiKTsKKwkJZm9yKGkgPSAwOyBpIDwgNDsgaSArKykKKwkJCXByaW50ayhLRVJOX0lORk8gIiVjIiwKKwkJCQlmbGFncy0+Z2xvYmFsX2luZm9fc3RydWN0LmNvZGVuYW1lW2ldKTsgCisJCXByaW50ayhLRVJOX0lORk8gIlxuQ29kZSB2ZXJzaW9uOiAiKTsKKwkgCWZvcihpID0gMDsgaSA8IDQ7IGkgKyspCisJCQlwcmludGsoS0VSTl9JTkZPICIlYyIsIAorCQkJCWZsYWdzLT5nbG9iYWxfaW5mb19zdHJ1Y3QuY29kZXZlcnNpb25baV0pOyAKKwkJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsJCisJCWJyZWFrOworCX0KKworaXNyX2RvbmU6CisKKwljYXJkLT5pbl9pc3IgPSAwOworCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3R5cGUgPSAwOworCXJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZWNlaXZlIGludGVycnVwdCBoYW5kbGVyLgorICovCitzdGF0aWMgdm9pZCByeF9pbnRyIChzZGxhX3QqIGNhcmQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwljaGRsY19wcml2YXRlX2FyZWFfdCAqY2hkbGNfcHJpdl9hcmVhOworCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QgKmZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCUNIRExDX0RBVEFfUlhfU1RBVFVTX0VMX1NUUlVDVCAqcnhidWYgPSBjYXJkLT51LmMucnhtYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGxlbjsKKwl1bnNpZ25lZCBhZGRyID0gcnhidWYtPnB0cl9kYXRhX2JmcjsKKwl2b2lkICpidWY7CisJaW50IGksdWRwX3R5cGU7CisKKwlpZiAocnhidWYtPm9wcF9mbGFnICE9IDB4MDEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogY29ycnVwdGVkIFJ4IGJ1ZmZlciBAIDB4JVgsIGZsYWcgPSAweCUwMlghXG4iLCAKKwkJCWNhcmQtPmRldm5hbWUsICh1bnNpZ25lZClyeGJ1ZiwgcnhidWYtPm9wcF9mbGFnKTsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJDb2RlIG5hbWU6ICIpOworICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkgKyspCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLT5nbG9iYWxfaW5mb19zdHJ1Y3QuY29kZW5hbWVbaV0pOworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIlxuQ29kZSB2ZXJzaW9uOiAiKTsKKyAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCA0OyBpICsrKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy0+Z2xvYmFsX2luZm9fc3RydWN0LmNvZGV2ZXJzaW9uW2ldKTsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJcbiIpOworCisKKwkJLyogQnVnIEZpeDogTWFyIDYgMjAwMAorICAgICAgICAgICAgICAgICAqIElmIHdlIGdldCBhIGNvcnJ1cHRlZCBtYWlsYm94LCBpdCBtZWFzbiB0aGF0IGRyaXZlciAKKyAgICAgICAgICAgICAgICAgKiBpcyBvdXQgb2Ygc3luYyB3aXRoIHRoZSBmaXJtd2FyZS4gVGhlcmUgaXMgbm8gcmVjb3ZlcnkuCisgICAgICAgICAgICAgICAgICogSWYgd2UgZG9uJ3QgdHVybiBvZmYgYWxsIGludGVycnVwdHMgZm9yIHRoaXMgY2FyZAorICAgICAgICAgICAgICAgICAqIHRoZSBtYWNoaW5lIHdpbGwgY3Jhc2guIAorICAgICAgICAgICAgICAgICAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogQ3JpdGljYWwgcm91dGVyIGZhaWx1cmUgLi4uISEhXG4iLCBjYXJkLT5kZXZuYW1lKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUGxlYXNlIGNvbnRhY3QgU2FuZ29tYSBUZWNobm9sb2dpZXMgIVxuIik7CisJCWNoZGxjX3NldF9pbnRyX21vZGUoY2FyZCwwKTsJCisJCXJldHVybjsKKwl9CisKKwlsZW4gID0gcnhidWYtPmZyYW1lX2xlbmd0aDsKKworCWlmIChjYXJkLT50dHlfb3B0KXsKKworCQlpZiAocnhidWYtPmVycm9yX2ZsYWcpewkKKwkJCWdvdG8gcnhfZXhpdDsKKwkJfQorCisJCWlmIChsZW4gPD0gQ1JDX0xFTkdUSCl7CisJCQlnb3RvIHJ4X2V4aXQ7CisJCX0KKwkJCisJCWlmICghY2FyZC0+dS5jLmFzeW5jX21vZGUpeworCQkJbGVuIC09IENSQ19MRU5HVEg7CisJCX0KKworCQl3YW5waXBlX3R0eV9yZWNlaXZlKGNhcmQsYWRkcixsZW4pOworCQlnb3RvIHJ4X2V4aXQ7CisJfQorCisJZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKworCWlmICghZGV2KXsKKwkJZ290byByeF9leGl0OworCX0KKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlnb3RvIHJ4X2V4aXQ7CisKKwljaGRsY19wcml2X2FyZWEgPSBkZXYtPnByaXY7CisKKwkKKwkvKiBBbGxvY2F0ZSBzb2NrZXQgYnVmZmVyICovCisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOworCisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBubyBzb2NrZXQgYnVmZmVycyBhdmFpbGFibGUhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJKytjYXJkLT53YW5kZXYuc3RhdHMucnhfZHJvcHBlZDsKKwkJZ290byByeF9leGl0OworCX0KKworCS8qIENvcHkgZGF0YSB0byB0aGUgc29ja2V0IGJ1ZmZlciAqLworCWlmKChhZGRyICsgbGVuKSA+IGNhcmQtPnUuYy5yeF90b3AgKyAxKSB7CisJCXVuc2lnbmVkIHRtcCA9IGNhcmQtPnUuYy5yeF90b3AgLSBhZGRyICsgMTsKKwkJYnVmID0gc2tiX3B1dChza2IsIHRtcCk7CisJCXNkbGFfcGVlaygmY2FyZC0+aHcsIGFkZHIsIGJ1ZiwgdG1wKTsKKwkJYWRkciA9IGNhcmQtPnUuYy5yeF9iYXNlOworCQlsZW4gLT0gdG1wOworCX0KKwkJCisJYnVmID0gc2tiX3B1dChza2IsIGxlbik7CisJc2RsYV9wZWVrKCZjYXJkLT5odywgYWRkciwgYnVmLCBsZW4pOworCisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKworCWNhcmQtPndhbmRldi5zdGF0cy5yeF9wYWNrZXRzICsrOworCWNhcmQtPndhbmRldi5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwl1ZHBfdHlwZSA9IHVkcF9wa3RfdHlwZSggc2tiLCBjYXJkICk7CisKKwlpZih1ZHBfdHlwZSA9PSBVRFBfQ1BJUEVfVFlQRSkgeworCQlpZihzdG9yZV91ZHBfbWdtdF9wa3QoVURQX1BLVF9GUk1fTkVUV09SSywKKyAgIAkJCQkgICAgICBjYXJkLCBza2IsIGRldiwgY2hkbGNfcHJpdl9hcmVhKSkgeworICAgICAJCSAgICAgICAgZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC4KKwkJCQkJCWludGVycnVwdF9wZXJtaXNzaW9uIHw9IAorCQkJCQkJCUFQUF9JTlRfT05fVElNRVI7IAorCQl9CisJfSBlbHNlIGlmKGNhcmQtPnUuYy51c2VkYnkgPT0gQVBJKSB7CisKKwkJYXBpX3J4X2hkcl90KiBhcGlfcnhfaGRyOworICAgICAgIAkJc2tiX3B1c2goc2tiLCBzaXplb2YoYXBpX3J4X2hkcl90KSk7CisgICAgICAgICAgICAgICAgYXBpX3J4X2hkciA9IChhcGlfcnhfaGRyX3QqKSZza2ItPmRhdGFbMHgwMF07CisJCWFwaV9yeF9oZHItPmVycm9yX2ZsYWcgPSByeGJ1Zi0+ZXJyb3JfZmxhZzsKKyAgICAgCQlhcGlfcnhfaGRyLT50aW1lX3N0YW1wID0gcnhidWYtPnRpbWVfc3RhbXA7CisKKyAgICAgICAgICAgICAgICBza2ItPnByb3RvY29sID0gaHRvbnMoUFZDX1BST1QpOworICAgICAJCXNrYi0+bWFjLnJhdyAgPSBza2ItPmRhdGE7CisJCXNrYi0+ZGV2ICAgICAgPSBkZXY7CisgICAgICAgICAgICAgICAJc2tiLT5wa3RfdHlwZSA9IFdBTl9QQUNLRVRfREFUQTsKKworCQliaF9lbnF1ZXVlKGRldiwgc2tiKTsKKworCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoMCwmY2hkbGNfcHJpdl9hcmVhLT50cV93b3JraW5nKSkKKwkJCXdhbnBpcGVfcXVldWVfd29yaygmY2hkbGNfcHJpdl9hcmVhLT5jb21tb24ud2FucGlwZV93b3JrKTsKKwl9ZWxzZXsKKwkJLyogRklYTUU6IHdlIHNob3VsZCBjaGVjayB0byBzZWUgaWYgdGhlIHJlY2VpdmVkIHBhY2tldCBpcyBhIAorICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWNhc3QgcGFja2V0IHNvIHRoYXQgd2UgY2FuIGluY3JlbWVudCB0aGUgbXVsdGljYXN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aXN0aWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKysgY2hkbGNfcHJpdl9hcmVhLT5pZl9zdGF0cy5tdWx0aWNhc3Q7CisJCSovCisgICAgICAgICAgICAgICAJLyogUGFzcyBpdCB1cCB0aGUgcHJvdG9jb2wgc3RhY2sgKi8KKwkKKyAgICAgICAgICAgICAgICBza2ItPmRldiA9IGRldjsKKyAgICAgICAgICAgICAgICBza2ItPm1hYy5yYXcgID0gc2tiLT5kYXRhOworICAgICAgICAgICAgICAgIG5ldGlmX3J4KHNrYik7CisgICAgICAgICAgICAgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwl9CisKK3J4X2V4aXQ6CisJLyogUmVsZWFzZSBidWZmZXIgZWxlbWVudCBhbmQgY2FsY3VsYXRlIGEgcG9pbnRlciB0byB0aGUgbmV4dCBvbmUgKi8KKwlyeGJ1Zi0+b3BwX2ZsYWcgPSAweDAwOworCWNhcmQtPnUuYy5yeG1iID0gKysgcnhidWY7CisJaWYoKHZvaWQqKXJ4YnVmID4gY2FyZC0+dS5jLnJ4YnVmX2xhc3QpeworCQljYXJkLT51LmMucnhtYiA9IGNhcmQtPnUuYy5yeGJ1Zl9iYXNlOworCX0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUaW1lciBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqIFRoZSB0aW1lciBpbnRlcnJ1cHQgaXMgdXNlZCBmb3IgdHdvIHB1cnBvc2VzOgorICogICAgMSkgUHJvY2Vzc2luZyB1ZHAgY2FsbHMgZnJvbSAnY3BpcGVtb24nLgorICogICAgMikgUmVhZGluZyBib2FyZC1sZXZlbCBzdGF0aXN0aWNzIGZvciB1cGRhdGluZyB0aGUgcHJvYyBmaWxlIHN5c3RlbS4KKyAqLwordm9pZCB0aW1lcl9pbnRyKHNkbGFfdCAqY2FyZCkKK3sKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UqIGRldjsKKyAgICAgICAgY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSA9IE5VTEw7CisgICAgICAgIFNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QqIGZsYWdzID0gTlVMTDsKKworICAgICAgICBpZiAoKGRldiA9IGNhcmQtPndhbmRldi5kZXYpPT1OVUxMKXsKKwkJZmxhZ3MgPSBjYXJkLT51LmMuZmxhZ3M7CisgICAgICAgICAgICAgICAgZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfcGVybWlzc2lvbiAmPQorICAgICAgICAgICAgICAgICAgICAgICAgfkFQUF9JTlRfT05fVElNRVI7CisJCXJldHVybjsKKwl9CisJCisgICAgICAgIGNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKworCWlmIChjaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX0NPTkZJRykgeworCQlpZiAoIWNvbmZpZ19jaGRsYyhjYXJkKSl7CisJCQljaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfQ09ORklHOworCQl9CisJfQorCisJLyogcHJvY2VzcyBhIHVkcCBjYWxsIGlmIHBlbmRpbmcgKi8KKyAgICAgICAJaWYoY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9VRFApIHsKKyAgICAgICAgICAgICAgIAlwcm9jZXNzX3VkcF9tZ210X3BrdChjYXJkLCBkZXYsCisgICAgICAgICAgICAgICAgICAgICAgIGNoZGxjX3ByaXZfYXJlYSk7CisJCWNoZGxjX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9VRFA7CisgICAgICAgIH0KKworCS8qIHJlYWQgdGhlIGNvbW11bmljYXRpb25zIHN0YXRpc3RpY3MgaWYgcmVxdWlyZWQgKi8KKwlpZihjaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX1VQREFURSkgeworCQl1cGRhdGVfY29tbXNfc3RhdHMoY2FyZCwgY2hkbGNfcHJpdl9hcmVhKTsKKyAgICAgICAgICAgICAgICBpZighKC0tIGNoZGxjX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzKSkgeworCQkJY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmPSAKKwkJCQl+VE1SX0lOVF9FTkFCTEVEX1VQREFURTsKKwkJfQorICAgICAgICB9CisKKwkvKiBvbmx5IGRpc2FibGUgdGhlIHRpbWVyIGludGVycnVwdCBpZiB0aGVyZSBhcmUgbm8gdWRwIG9yIHN0YXRpc3RpYyAqLworCS8qIHVwZGF0ZXMgcGVuZGluZyAqLworICAgICAgICBpZighY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCkgeworICAgICAgICAgICAgICAgIGZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworICAgICAgICAgICAgICAgIGZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gJj0KKyAgICAgICAgICAgICAgICAgICAgICAgIH5BUFBfSU5UX09OX1RJTUVSOworICAgICAgICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIE1pc2NlbGxhbmVvdXMgRnVuY3Rpb25zCisJLSBzZXRfY2hkbGNfY29uZmlnKCkgdXNlZCB0byBzZXQgY29uZmlndXJhdGlvbiBvcHRpb25zIG9uIHRoZSBib2FyZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBzZXRfY2hkbGNfY29uZmlnKHNkbGFfdCogY2FyZCkKK3sKKwlDSERMQ19DT05GSUdVUkFUSU9OX1NUUlVDVCBjZmc7CisKKwltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUKSk7CisKKwlpZihjYXJkLT53YW5kZXYuY2xvY2tpbmcpeworCQljZmcuYmF1ZF9yYXRlID0gY2FyZC0+d2FuZGV2LmJwczsKKwl9CisJCQorCWNmZy5saW5lX2NvbmZpZ19vcHRpb25zID0gKGNhcmQtPndhbmRldi5pbnRlcmZhY2UgPT0gV0FOT1BUX1JTMjMyKSA/CisJCUlOVEVSRkFDRV9MRVZFTF9SUzIzMiA6IElOVEVSRkFDRV9MRVZFTF9WMzU7CisKKwljZmcubW9kZW1fY29uZmlnX29wdGlvbnMJPSAwOworCWNmZy5tb2RlbV9zdGF0dXNfdGltZXIJCT0gMTAwOworCisJY2ZnLkNIRExDX3Byb3RvY29sX29wdGlvbnMJPSBjYXJkLT51LmMucHJvdG9jb2xfb3B0aW9uczsKKworCWlmIChjYXJkLT50dHlfb3B0KXsKKwkJY2ZnLkNIRExDX0FQSV9vcHRpb25zCT0gRElTQ0FSRF9SWF9FUlJPUl9GUkFNRVM7CisJfQorCQorCWNmZy5wZXJjZW50X2RhdGFfYnVmZmVyX2Zvcl9UeCAgPSAoY2FyZC0+dS5jLnJlY2VpdmVfb25seSkgPyAwIDogNTA7CisJY2ZnLkNIRExDX3N0YXRpc3RpY3Nfb3B0aW9ucwk9IChDSERMQ19UWF9EQVRBX0JZVEVfQ09VTlRfU1RBVCB8CisJCUNIRExDX1JYX0RBVEFfQllURV9DT1VOVF9TVEFUKTsKKwkKKwlpZiAoY2FyZC0+dHR5X29wdCl7CisJCWNhcmQtPndhbmRldi5tdHUgPSBUVFlfQ0hETENfTUFYX01UVTsKKwl9CisJY2ZnLm1heF9DSERMQ19kYXRhX2ZpZWxkX2xlbmd0aAk9IGNhcmQtPndhbmRldi5tdHU7CisJY2ZnLnRyYW5zbWl0X2tlZXBhbGl2ZV90aW1lcgk9IGNhcmQtPnUuYy5rcGFsdl90eDsKKwljZmcucmVjZWl2ZV9rZWVwYWxpdmVfdGltZXIJPSBjYXJkLT51LmMua3BhbHZfcng7CisJY2ZnLmtlZXBhbGl2ZV9lcnJvcl90b2xlcmFuY2UJPSBjYXJkLT51LmMua3BhbHZfZXJyOworCWNmZy5TTEFSUF9yZXF1ZXN0X3RpbWVyCQk9IGNhcmQtPnUuYy5zbGFycF90aW1lcjsKKworCWlmIChjZmcuU0xBUlBfcmVxdWVzdF90aW1lcikgeworCQljZmcuSVBfYWRkcmVzcwkJPSAwOworCQljZmcuSVBfbmV0bWFzawkJPSAwOworCQkKKwl9ZWxzZSBpZiAoY2FyZC0+d2FuZGV2LmRldil7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCQljaGRsY19wcml2YXRlX2FyZWFfdCAqY2hkbGNfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCQkKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBkZXYtPmlwX3B0cjsKKworCQlpZihpbl9kZXYgIT0gTlVMTCkgeworCQkJc3RydWN0IGluX2lmYWRkciAqaWZhID0gaW5fZGV2LT5pZmFfbGlzdDsKKworCQkJaWYgKGlmYSAhPSBOVUxMICkgeworCQkJCWNmZy5JUF9hZGRyZXNzCT0gbnRvaGwoaWZhLT5pZmFfbG9jYWwpOworCQkJCWNmZy5JUF9uZXRtYXNrCT0gbnRvaGwoaWZhLT5pZmFfbWFzayk7IAorCQkJCWNoZGxjX3ByaXZfYXJlYS0+SVBfYWRkcmVzcyA9IG50b2hsKGlmYS0+aWZhX2xvY2FsKTsKKwkJCQljaGRsY19wcml2X2FyZWEtPklQX25ldG1hc2sgPSBudG9obChpZmEtPmlmYV9tYXNrKTsgCisJCQl9CisJCX0KKworCQkvKiBGSVhNRTogV2UgbXVzdCByZS10aGluayB0aGlzIG1lc3NhZ2UgaW4gbmV4dCByZWxlYXNlCisJCWlmKChjZmcuSVBfYWRkcmVzcyAmIDB4MDAwMDAwRkYpID4gMikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiXG4iKTsKKwkgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiICBXQVJOSU5HOiVzIGNvbmZpZ3VyZWQgd2l0aCBhblxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiAgaW52YWxpZCBsb2NhbCBJUCBhZGRyZXNzLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIgIFNsYXJwIHByYWdtYXRpY3Mgd2lsbCBmYWlsLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIgIElQIGFkZHJlc3Mgc2hvdWxkIGJlIG9mIHRoZVxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIgIGZvcm1hdCBBLkIuQy4xIG9yIEEuQi5DLjIuXG4iKTsKKwkJfQorCQkqLwkJCisJfQorCQorCXJldHVybiBjaGRsY19jb25maWd1cmUoY2FyZCwgJmNmZyk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgc2V0X2FzeV9jb25maWcoKSB1c2VkIHRvIHNldCBhc3luY2hyb25vdXMgY29uZmlndXJhdGlvbiBvcHRpb25zIG9uIHRoZSBib2FyZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBzZXRfYXN5X2NvbmZpZyhzZGxhX3QqIGNhcmQpCit7CisKKyAgICAgICAgQVNZX0NPTkZJR1VSQVRJT05fU1RSVUNUIGNmZzsKKyAJQ0hETENfTUFJTEJPWF9TVFJVQ1QgKm1haWxib3ggPSBjYXJkLT5tYm94OworCWludCBlcnI7CisKKwltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKEFTWV9DT05GSUdVUkFUSU9OX1NUUlVDVCkpOworCisJaWYoY2FyZC0+d2FuZGV2LmNsb2NraW5nKQorCQljZmcuYmF1ZF9yYXRlID0gY2FyZC0+d2FuZGV2LmJwczsKKworCWNmZy5saW5lX2NvbmZpZ19vcHRpb25zID0gKGNhcmQtPndhbmRldi5pbnRlcmZhY2UgPT0gV0FOT1BUX1JTMjMyKSA/CisJCUlOVEVSRkFDRV9MRVZFTF9SUzIzMiA6IElOVEVSRkFDRV9MRVZFTF9WMzU7CisKKwljZmcubW9kZW1fY29uZmlnX29wdGlvbnMJPSAwOworCWNmZy5hc3lfQVBJX29wdGlvbnMgCQk9IGNhcmQtPnUuYy5hcGlfb3B0aW9uczsKKwljZmcuYXN5X3Byb3RvY29sX29wdGlvbnMJPSBjYXJkLT51LmMucHJvdG9jb2xfb3B0aW9uczsKKwljZmcuVHhfYml0c19wZXJfY2hhcgkJPSBjYXJkLT51LmMudHhfYml0c19wZXJfY2hhcjsKKwljZmcuUnhfYml0c19wZXJfY2hhcgkJPSBjYXJkLT51LmMucnhfYml0c19wZXJfY2hhcjsKKwljZmcuc3RvcF9iaXRzCQkJPSBjYXJkLT51LmMuc3RvcF9iaXRzOworCWNmZy5wYXJpdHkJCQk9IGNhcmQtPnUuYy5wYXJpdHk7CisJY2ZnLmJyZWFrX3RpbWVyCQkJPSBjYXJkLT51LmMuYnJlYWtfdGltZXI7CisJY2ZnLmFzeV9SeF9pbnRlcl9jaGFyX3RpbWVyCT0gY2FyZC0+dS5jLmludGVyX2NoYXJfdGltZXI7IAorCWNmZy5hc3lfUnhfY29tcGxldGVfbGVuZ3RoCT0gY2FyZC0+dS5jLnJ4X2NvbXBsZXRlX2xlbmd0aDsgCisJY2ZnLlhPTl9jaGFyCQkJPSBjYXJkLT51LmMueG9uX2NoYXI7CisJY2ZnLlhPRkZfY2hhcgkJCT0gY2FyZC0+dS5jLnhvZmZfY2hhcjsKKwljZmcuYXN5X3N0YXRpc3RpY3Nfb3B0aW9ucwk9IChDSERMQ19UWF9EQVRBX0JZVEVfQ09VTlRfU1RBVCB8CisJCUNIRExDX1JYX0RBVEFfQllURV9DT1VOVF9TVEFUKTsKKworCW1haWxib3gtPmJ1ZmZlcl9sZW5ndGggPSBzaXplb2YoQVNZX0NPTkZJR1VSQVRJT05fU1RSVUNUKTsKKwltZW1jcHkobWFpbGJveC0+ZGF0YSwgJmNmZywgbWFpbGJveC0+YnVmZmVyX2xlbmd0aCk7CisJbWFpbGJveC0+Y29tbWFuZCA9IFNFVF9BU1lfQ09ORklHVVJBVElPTjsKKwllcnIgPSBzZGxhX2V4ZWMobWFpbGJveCkgPyBtYWlsYm94LT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCWlmIChlcnIgIT0gQ09NTUFORF9PSykgCisJCWNoZGxjX2Vycm9yIChjYXJkLCBlcnIsIG1haWxib3gpOworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRW5hYmxlIGFzeW5jaHJvbm91cyBjb21tdW5pY2F0aW9ucy4KKyAqLworCitzdGF0aWMgaW50IGFzeV9jb21tX2VuYWJsZSAoc2RsYV90KiBjYXJkKQoreworCisJaW50IGVycjsKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworCisJbWItPmJ1ZmZlcl9sZW5ndGggPSAwOworCW1iLT5jb21tYW5kID0gRU5BQkxFX0FTWV9DT01NVU5JQ0FUSU9OUzsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJaWYgKGVyciAhPSBDT01NQU5EX09LICYmIGNhcmQtPndhbmRldi5kZXYpCisJCWNoZGxjX2Vycm9yKGNhcmQsIGVyciwgbWIpOworCQorCWlmICghZXJyKQorCQljYXJkLT51LmMuY29tbV9lbmFibGVkID0gMTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJvY2VzcyBnbG9iYWwgZXhjZXB0aW9uIGNvbmRpdGlvbgorICovCitzdGF0aWMgaW50IHByb2Nlc3NfZ2xvYmFsX2V4Y2VwdGlvbihzZGxhX3QgKmNhcmQpCit7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1ib3ggPSBjYXJkLT5tYm94OworCWludCBlcnI7CisKKwltYm94LT5idWZmZXJfbGVuZ3RoID0gMDsKKwltYm94LT5jb21tYW5kID0gUkVBRF9HTE9CQUxfRVhDRVBUSU9OX0NPTkRJVElPTjsKKwllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCisJaWYoZXJyICE9IENNRF9USU1FT1VUICl7CisJCisJCXN3aXRjaChtYm94LT5yZXR1cm5fY29kZSkgeworICAgICAgICAgCisJICAgICAgCWNhc2UgRVhDRVBfTU9ERU1fU1RBVFVTX0NIQU5HRToKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1vZGVtIHN0YXR1cyBjaGFuZ2VcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisKKwkJCXN3aXRjaChtYm94LT5kYXRhWzBdICYgKERDRF9ISUdIIHwgQ1RTX0hJR0gpKSB7CisJCQkJY2FzZSAoRENEX0hJR0gpOgorCQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogRENEIGhpZ2gsIENUUyBsb3dcbiIsY2FyZC0+ZGV2bmFtZSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgKENUU19ISUdIKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogRENEIGxvdywgQ1RTIGhpZ2hcbiIsY2FyZC0+ZGV2bmFtZSk7IAorCQkJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoKERDRF9ISUdIIHwgQ1RTX0hJR0gpKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogRENEIGhpZ2gsIENUUyBoaWdoXG4iLGNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkJCWRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERDRCBsb3csIENUUyBsb3dcbiIsY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRVhDRVBfVFJDX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpbmUgdHJhY2UgZGlzYWJsZWRcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworCQljYXNlIEVYQ0VQX0lSUV9USU1FT1VUOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElSUSB0aW1lb3V0IG9jY3VycmVkXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOyAKKwkJCWJyZWFrOworCisJCWNhc2UgMHgxNzoKKwkJCWlmIChjYXJkLT50dHlfb3B0KXsKKwkJCQlpZiAoY2FyZC0+dHR5ICYmIGNhcmQtPnR0eV9vcGVuKXsgCisJCQkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJCQkiJXM6IE1vZGVtIEhhbmd1cCBFeGNlcHRpb246IEhhbmdpbmcgVXAhXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQkJCXR0eV9oYW5ndXAoY2FyZC0+dHR5KTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIElmIFRUWSBpcyBub3QgdXNlZCBqdXN0IGRyb3AgdGhyb3VnaHQgKi8KKwkJCQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogR2xvYmFsIGV4Y2VwdGlvbiAleFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCBtYm94LT5yZXR1cm5fY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisJfQorCXJldHVybiAwOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJvY2VzcyBjaGRsYyBleGNlcHRpb24gY29uZGl0aW9uCisgKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19jaGRsY19leGNlcHRpb24oc2RsYV90ICpjYXJkKQoreworCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYiA9IGNhcmQtPm1ib3g7CisJaW50IGVycjsKKworCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwltYi0+Y29tbWFuZCA9IFJFQURfQ0hETENfRVhDRVBUSU9OX0NPTkRJVElPTjsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJaWYoZXJyICE9IENNRF9USU1FT1VUKSB7CisJCisJCXN3aXRjaCAoZXJyKSB7CisKKwkJY2FzZSBFWENFUF9MSU5LX0FDVElWRToKKwkJCXBvcnRfc2V0X3N0YXRlKGNhcmQsIFdBTl9DT05ORUNURUQpOworCQkJdHJpZ2dlcl9jaGRsY19wb2xsKGNhcmQtPndhbmRldi5kZXYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBFWENFUF9MSU5LX0lOQUNUSVZFX01PREVNOgorCQkJcG9ydF9zZXRfc3RhdGUoY2FyZCwgV0FOX0RJU0NPTk5FQ1RFRCk7CisJCQl1bmNvbmZpZ3VyZV9pcChjYXJkKTsKKwkJCXRyaWdnZXJfY2hkbGNfcG9sbChjYXJkLT53YW5kZXYuZGV2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgRVhDRVBfTElOS19JTkFDVElWRV9LUEFMVjoKKwkJCXBvcnRfc2V0X3N0YXRlKGNhcmQsIFdBTl9ESVNDT05ORUNURUQpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEtlZXBhbGl2ZSB0aW1lciBleHBpcmVkLlxuIiwKKwkJCQkgCQljYXJkLT5kZXZuYW1lKTsKKwkJCXVuY29uZmlndXJlX2lwKGNhcmQpOworCQkJdHJpZ2dlcl9jaGRsY19wb2xsKGNhcmQtPndhbmRldi5kZXYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBFWENFUF9JUF9BRERSRVNTX0RJU0NPVkVSRUQ6CisJCQlpZiAoY29uZmlndXJlX2lwKGNhcmQpKSAKKwkJCQlyZXR1cm4gLTE7CisJCQlicmVhazsKKworCQljYXNlIEVYQ0VQX0xPT1BCQUNLX0NPTkRJVElPTjoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMb29wYmFjayBDb25kaXRpb24gRGV0ZWN0ZWQuXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlicmVhazsKKworCQljYXNlIE5PX0NIRExDX0VYQ0VQX0NPTkRfVE9fUkVQT1JUOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vIGV4Y2VwdGlvbnMgcmVwb3J0ZWQuXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlicmVhazsKKwkJfQorCisJfQorCXJldHVybiAwOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29uZmlndXJlIElQIGZyb20gU0xBUlAgbmVnb3RpYXRpb24KKyAqIFRoaXMgYWRkcyBkeW5hbWljIHJvdXRlcyB3aGVuIFNMQVJQIGhhcyBwcm92aWRlZCB2YWxpZCBhZGRyZXNzZXMKKyAqLworCitzdGF0aWMgaW50IGNvbmZpZ3VyZV9pcCAoc2RsYV90KiBjYXJkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworICAgICAgICBjaGRsY19wcml2YXRlX2FyZWFfdCAqY2hkbGNfcHJpdl9hcmVhOworICAgICAgICBjaGFyIGVycjsKKworCWlmICghZGV2KQorCQlyZXR1cm4gMDsKKworCWNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwkKKwkKKyAgICAgICAgLyogc2V0IHRvIGRpc2NvdmVyICovCisgICAgICAgIGlmKGNhcmQtPnUuYy5zbGFycF90aW1lciAhPSAweDAwKSB7CisJCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYiA9IGNhcmQtPm1ib3g7CisJCUNIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICpjZmc7CisKKyAgICAgCQltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJCW1iLT5jb21tYW5kID0gUkVBRF9DSERMQ19DT05GSUdVUkFUSU9OOworCQllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJCisJCWlmKGVyciAhPSBDT01NQU5EX09LKSB7CisJCQljaGRsY19lcnJvcihjYXJkLGVycixtYik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQljZmcgPSAoQ0hETENfQ09ORklHVVJBVElPTl9TVFJVQ1QgKiltYi0+ZGF0YTsKKyAgICAgICAgICAgICAgICBjaGRsY19wcml2X2FyZWEtPklQX2FkZHJlc3MgPSBjZmctPklQX2FkZHJlc3M7CisgICAgICAgICAgICAgICAgY2hkbGNfcHJpdl9hcmVhLT5JUF9uZXRtYXNrID0gY2ZnLT5JUF9uZXRtYXNrOworCisJCS8qIFNldCBmbGFnIHRvIGFkZCByb3V0ZSAqLworCQljaGRsY19wcml2X2FyZWEtPnJvdXRlX3N0YXR1cyA9IEFERF9ST1VURTsKKworCQkvKiBUaGUgaWRlYSBoZXJlIGlzIHRvIGFkZCB0aGUgcm91dGUgaW4gdGhlIHBvbGwgcm91dGluZS4KKwkgICAJVGhpcyB3YXksIHdlIGFyZW4ndCBpbiBpbnRlcnJ1cHQgY29udGV4dCB3aGVuIGFkZGluZyByb3V0ZXMgKi8KKwkJdHJpZ2dlcl9jaGRsY19wb2xsKGRldik7CisgICAgICAgIH0KKworCXJldHVybiAwOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVW4tQ29uZmlndXJlIElQIG5lZ290aWF0ZWQgYnkgU0xBUlAKKyAqIFRoaXMgcmVtb3ZlcyBkeW5hbWljIHJvdXRlcyB3aGVuIHRoZSBsaW5rIGJlY29tZXMgaW5hY3RpdmUuCisgKi8KKworc3RhdGljIGludCB1bmNvbmZpZ3VyZV9pcCAoc2RsYV90KiBjYXJkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCWNoZGxjX3ByaXZhdGVfYXJlYV90ICpjaGRsY19wcml2X2FyZWE7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIDA7CisKKwljaGRsY19wcml2X2FyZWE9IGRldi0+cHJpdjsKKwkKKwlpZiAoY2hkbGNfcHJpdl9hcmVhLT5yb3V0ZV9zdGF0dXMgPT0gUk9VVEVfQURERUQpIHsKKworCQkvKiBOb3RlOiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIAorICAgICAgICAgICAgICAgICAqIHBvcnQgc3RhdGUgaGFzIGJlZW4gRElTQ09OTkVDVEVELiAgVGhpcyBzdGF0ZQorICAgICAgICAgICAgICAgICAqIGNoYW5nZSB3aWxsIHRyaWdnZXIgYSBwb2xsX2Rpc2Nvbm5lY3RlZCAKKyAgICAgICAgICAgICAgICAgKiBmdW5jdGlvbiwgdGhhdCB3aWxsIGNoZWNrIGZvciB0aGlzIGNvbmRpdGlvbi4gCisJCSAqLworCQljaGRsY19wcml2X2FyZWEtPnJvdXRlX3N0YXR1cyA9IFJFTU9WRV9ST1VURTsKKworCX0KKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSb3V0aW5lIHRvIGFkZC9yZW1vdmUgcm91dGVzIAorICogQ2FsbGVkIGxpa2UgYSBwb2xsaW5nIHJvdXRpbmUgd2hlbiBSb3V0ZXMgYXJlIGZsYWdnZWQgdG8gYmUgYWRkZWQvcmVtb3ZlZC4KKyAqLworCitzdGF0aWMgdm9pZCBwcm9jZXNzX3JvdXRlIChzZGxhX3QgKmNhcmQpCit7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworICAgICAgICB1bnNpZ25lZCBjaGFyIHBvcnRfbnVtOworICAgICAgICBjaGRsY19wcml2YXRlX2FyZWFfdCAqY2hkbGNfcHJpdl9hcmVhID0gTlVMTDsKKwl1MzIgbG9jYWxfSVBfYWRkciA9IDA7CisJdTMyIHJlbW90ZV9JUF9hZGRyID0gMDsKKwl1MzIgSVBfbmV0bWFzaywgSVBfYWRkcjsKKyAgICAgICAgaW50IGVyciA9IDA7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCW1tX3NlZ21lbnRfdCBmczsKKwlzdHJ1Y3QgaWZyZXEgaWZfaW5mbzsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX2luICppZl9kYXRhMSwgKmlmX2RhdGEyOworCQorICAgICAgICBjaGRsY19wcml2X2FyZWEgPSBkZXYtPnByaXY7CisgICAgICAgIHBvcnRfbnVtID0gY2FyZC0+dS5jLmNvbW1fcG9ydDsKKworCS8qIEJ1ZyBGaXggTWFyIDE2IDIwMDAKKwkgKiBBTkQgdGhlIElQIGFkZHJlc3MgdG8gdGhlIE1hc2sgYmVmb3JlIGNoZWNraW5nCisgICAgICAgICAqIHRoZSBsYXN0IHR3byBiaXRzLiAqLworCisJaWYoKGNoZGxjX3ByaXZfYXJlYS0+cm91dGVfc3RhdHVzID09IEFERF9ST1VURSkgJiYKKwkJKChjaGRsY19wcml2X2FyZWEtPklQX2FkZHJlc3MgJiB+Y2hkbGNfcHJpdl9hcmVhLT5JUF9uZXRtYXNrKSA+IDIpKSB7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IER5bmFtaWMgcm91dGUgZmFpbHVyZS5cbiIsY2FyZC0+ZGV2bmFtZSk7CisKKyAgICAgICAgICAgICAgICBpZihjYXJkLT51LmMuc2xhcnBfdGltZXIpIHsKKwkJCXUzMiBhZGRyX25ldCA9IGh0b25sKGNoZGxjX3ByaXZfYXJlYS0+SVBfYWRkcmVzcyk7CisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBCYWQgSVAgYWRkcmVzcyAldS4ldS4ldS4ldSByZWNlaXZlZFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLAorCQkJICAgICAgIE5JUFFVQUQoYWRkcl9uZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBmcm9tIHJlbW90ZSBzdGF0aW9uLlxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKworICAgICAgICAgICAgICAgIH1lbHNleyAKKwkJCXUzMiBhZGRyX25ldCA9IGh0b25sKGNoZGxjX3ByaXZfYXJlYS0+SVBfYWRkcmVzcyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBCYWQgSVAgYWRkcmVzcyAldS4ldS4ldS4ldSBpc3N1ZWRcbiIsCisJCQkgICAgICAgY2FyZC0+ZGV2bmFtZSwKKwkJCSAgICAgICBOSVBRVUFEKGFkZHJfbmV0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogdG8gcmVtb3RlIHN0YXRpb24uIExvY2FsXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElQIGFkZHJlc3MgbXVzdCBiZSBBLkIuQy4xXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG9yIEEuQi5DLjIuXG4iLGNhcmQtPmRldm5hbWUpOworCQl9CisKKwkJLyogcmVtb3ZlIHRoZSByb3V0ZSBkdWUgdG8gdGhlIElQIGFkZHJlc3MgZXJyb3IgY29uZGl0aW9uICovCisJCWNoZGxjX3ByaXZfYXJlYS0+cm91dGVfc3RhdHVzID0gUkVNT1ZFX1JPVVRFOworCQllcnIgPSAxOworICAgCX0KKworCS8qIElmIHdlIGFyZSByZW1vdmluZyBhIHJvdXRlIHdpdGggYmFkIElQIGFkZHJlc3NpbmcsIHRoZW4gdXNlIHRoZSAqLworCS8qIGxvY2FsbHkgY29uZmlndXJlZCBJUCBhZGRyZXNzZXMgKi8KKyAgICAgICAgaWYoKGNoZGxjX3ByaXZfYXJlYS0+cm91dGVfc3RhdHVzID09IFJFTU9WRV9ST1VURSkgJiYgZXJyKSB7CisKKyAJICAgICAgICAvKiBkbyBub3QgcmVtb3ZlIGEgYmFkIHJvdXRlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkICovCisgICAgICAgIAlpZihjaGRsY19wcml2X2FyZWEtPnJvdXRlX3JlbW92ZWQpIHsKKwkgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAJfQorCisgICAgICAgICAgICAgICAgaW5fZGV2ID0gZGV2LT5pcF9wdHI7CisKKyAgICAgICAgICAgICAgICBpZihpbl9kZXYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGluX2lmYWRkciAqaWZhID0gaW5fZGV2LT5pZmFfbGlzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZmEgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfSVBfYWRkciA9IGlmYS0+aWZhX2xvY2FsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUF9uZXRtYXNrICA9IGlmYS0+aWZhX21hc2s7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCX1lbHNleyAKKyAgICAgICAJCS8qIEFjY29yZGluZyB0byBDaXNjbyBIRExDLCBpZiB0aGUgcG9pbnQtdG8tcG9pbnQgYWRkcmVzcyBpcworCQkgICBBLkIuQy4xLCB0aGVuIHdlIGFyZSB0aGUgb3Bwb3NpdGUgKEEuQi5DLjIpLCBhbmQgdmljZS12ZXJzYS4KKwkJKi8KKwkJSVBfbmV0bWFzayA9IG50b2hsKGNoZGxjX3ByaXZfYXJlYS0+SVBfbmV0bWFzayk7CisJICAgICAgICByZW1vdGVfSVBfYWRkciA9IG50b2hsKGNoZGxjX3ByaXZfYXJlYS0+SVBfYWRkcmVzcyk7CisJCisKKwkJLyogSWYgTmV0bWFzayBpcyAyNTUuMjU1LjI1NS4yNTUgdGhlIGxvY2FsIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgKiBjYWxjdWxhdGlvbiB3aWxsIGZhaWwuIERlZmF1bHQgaXQgYmFjayB0byAyNTUuMjU1LjI1NS4wICovCisJCWlmIChJUF9uZXRtYXNrID09IDB4ZmZmZmZmZmYpCisJCQlJUF9uZXRtYXNrICY9IDB4MDBmZmZmZmY7CisKKwkJLyogQnVnIEZpeCBNYXIgMTYgMjAwMAorCQkgKiBBTkQgdGhlIFJlbW90ZSBJUCBhZGRyZXNzIHdpdGggSVAgbmV0bWFzaywgaW5zdGVhZAorICAgICAgICAgICAgICAgICAqIG9mIHN0YXRpYyBuZXRtYXNrIG9mIDI1NS4yNTUuMjU1LjAgKi8KKyAgICAgICAgCWxvY2FsX0lQX2FkZHIgPSAocmVtb3RlX0lQX2FkZHIgJiBJUF9uZXRtYXNrKSArCisgICAgICAgICAgICAgICAgCSh+cmVtb3RlX0lQX2FkZHIgJiBudG9obCgweDAwMDMpKTsKKworCSAgICAgICAgaWYoIWNhcmQtPnUuYy5zbGFycF90aW1lcikgeworCQkJSVBfYWRkciA9IGxvY2FsX0lQX2FkZHI7CisJCQlsb2NhbF9JUF9hZGRyID0gcmVtb3RlX0lQX2FkZHI7CisJCQlyZW1vdGVfSVBfYWRkciA9IElQX2FkZHI7CisgICAgICAgCQl9CisJfQorCisgICAgICAgIGZzID0gZ2V0X2ZzKCk7ICAgICAgICAgICAgICAgICAgLyogU2F2ZSBmaWxlIHN5c3RlbSAgKi8KKyAgICAgICAgc2V0X2ZzKGdldF9kcygpKTsgICAgICAgICAgICAgICAvKiBHZXQgdXNlciBzcGFjZSBibG9jayAqLworCisgICAgICAgIC8qIFNldHVwIGEgc3RydWN0dXJlIGZvciBhZGRpbmcvcmVtb3Zpbmcgcm91dGVzICovCisgICAgICAgIG1lbXNldCgmaWZfaW5mbywgMCwgc2l6ZW9mKGlmX2luZm8pKTsKKyAgICAgICAgc3RyY3B5KGlmX2luZm8uaWZyX25hbWUsIGRldi0+bmFtZSk7CisKKwlzd2l0Y2ggKGNoZGxjX3ByaXZfYXJlYS0+cm91dGVfc3RhdHVzKSB7CisKKwljYXNlIEFERF9ST1VURToKKworCQlpZighY2FyZC0+dS5jLnNsYXJwX3RpbWVyKSB7CisJCQlpZl9kYXRhMiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaWZfaW5mby5pZnJfZHN0YWRkcjsKKwkJCWlmX2RhdGEyLT5zaW5fYWRkci5zX2FkZHIgPSByZW1vdGVfSVBfYWRkcjsKKwkJCWlmX2RhdGEyLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJCWVyciA9IGRldmluZXRfaW9jdGwoU0lPQ1NJRkRTVEFERFIsICZpZl9pbmZvKTsKKwkJfSBlbHNlIHsgCisJCQlpZl9kYXRhMSA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaWZfaW5mby5pZnJfYWRkcjsKKwkJCWlmX2RhdGExLT5zaW5fYWRkci5zX2FkZHIgPSBsb2NhbF9JUF9hZGRyOworCQkJaWZfZGF0YTEtPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJaWYoIShlcnIgPSBkZXZpbmV0X2lvY3RsKFNJT0NTSUZBRERSLCAmaWZfaW5mbykpKXsKKwkJCQlpZl9kYXRhMiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaWZfaW5mby5pZnJfZHN0YWRkcjsKKwkJCQlpZl9kYXRhMi0+c2luX2FkZHIuc19hZGRyID0gcmVtb3RlX0lQX2FkZHI7CisJCQkJaWZfZGF0YTItPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJCWVyciA9IGRldmluZXRfaW9jdGwoU0lPQ1NJRkRTVEFERFIsICZpZl9pbmZvKTsKKwkJCX0KKwkJfQorCisgICAgICAgICAgICAgICBpZihlcnIpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBZGQgcm91dGUgJXUuJXUuJXUuJXUgZmFpbGVkICglZClcbiIsIAorCQkJCWNhcmQtPmRldm5hbWUsIE5JUFFVQUQocmVtb3RlX0lQX2FkZHIpLCBlcnIpOworCQl9IGVsc2UgeworCQkJKChjaGRsY19wcml2YXRlX2FyZWFfdCAqKWRldi0+cHJpdiktPnJvdXRlX3N0YXR1cyA9IFJPVVRFX0FEREVEOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IER5bmFtaWMgcm91dGUgYWRkZWQuXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICAgIExvY2FsIElQIGFkZHIgOiAldS4ldS4ldS4ldVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCBOSVBRVUFEKGxvY2FsX0lQX2FkZHIpKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAgICBSZW1vdGUgSVAgYWRkcjogJXUuJXUuJXUuJXVcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSwgTklQUVVBRChyZW1vdGVfSVBfYWRkcikpOworCQkJY2hkbGNfcHJpdl9hcmVhLT5yb3V0ZV9yZW1vdmVkID0gMDsKKwkJfQorCQlicmVhazsKKworCisJY2FzZSBSRU1PVkVfUk9VVEU6CisJCisJCS8qIENoYW5nZSB0aGUgbG9jYWwgaXAgYWRkcmVzcyBvZiB0aGUgaW50ZXJmYWNlIHRvIDAuCisJCSAqIFRoaXMgd2lsbCBhbHNvIGRlbGV0ZSB0aGUgZGVzdGluYXRpb24gcm91dGUuCisJCSAqLworCQlpZighY2FyZC0+dS5jLnNsYXJwX3RpbWVyKSB7CisJCQlpZl9kYXRhMiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaWZfaW5mby5pZnJfZHN0YWRkcjsKKwkJCWlmX2RhdGEyLT5zaW5fYWRkci5zX2FkZHIgPSAwOworCQkJaWZfZGF0YTItPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJZXJyID0gZGV2aW5ldF9pb2N0bChTSU9DU0lGRFNUQUREUiwgJmlmX2luZm8pOworCQl9IGVsc2UgeworCQkJaWZfZGF0YTEgPSAoc3RydWN0IHNvY2thZGRyX2luICopJmlmX2luZm8uaWZyX2FkZHI7CisJCQlpZl9kYXRhMS0+c2luX2FkZHIuc19hZGRyID0gMDsKKwkJCWlmX2RhdGExLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJCWVyciA9IGRldmluZXRfaW9jdGwoU0lPQ1NJRkFERFIsJmlmX2luZm8pOworCQkKKwkJfQorCQlpZihlcnIpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IFJlbW92ZSByb3V0ZSAldS4ldS4ldS4ldSBmYWlsZWQsIChlcnIgJWQpXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lLCBOSVBRVUFEKHJlbW90ZV9JUF9hZGRyKSwKKwkJCQkJZXJyKTsKKwkJfSBlbHNlIHsKKwkJCSgoY2hkbGNfcHJpdmF0ZV9hcmVhX3QgKilkZXYtPnByaXYpLT5yb3V0ZV9zdGF0dXMgPQorCQkJCU5PX1JPVVRFOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IER5bmFtaWMgcm91dGUgcmVtb3ZlZDogJXUuJXUuJXUuJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+ZGV2bmFtZSwgTklQUVVBRChsb2NhbF9JUF9hZGRyKSk7IAorCQkJY2hkbGNfcHJpdl9hcmVhLT5yb3V0ZV9yZW1vdmVkID0gMTsKKwkJfQorCQlicmVhazsKKwl9CisKKyAgICAgICAgc2V0X2ZzKGZzKTsgICAgICAgICAgICAgICAgICAgICAvKiBSZXN0b3JlIGZpbGUgc3lzdGVtICovCisKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdG9yZSBhIFVEUCBtYW5hZ2VtZW50IHBhY2tldCBmb3IgbGF0ZXIgcHJvY2Vzc2luZy4KKyAqLworCitzdGF0aWMgaW50IHN0b3JlX3VkcF9tZ210X3BrdChjaGFyIHVkcF9wa3Rfc3JjLCBzZGxhX3QqIGNhcmQsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkJICAgICAgY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSkKK3sKKwlpbnQgdWRwX3BrdF9zdG9yZWQgPSAwOworCisJaWYoIWNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9sZ3RoICYmCisJICAoc2tiLT5sZW4gPD0gTUFYX0xHVEhfVURQX01HTlRfUEtUKSkgeworICAgICAgICAJY2hkbGNfcHJpdl9hcmVhLT51ZHBfcGt0X2xndGggPSBza2ItPmxlbjsKKwkJY2hkbGNfcHJpdl9hcmVhLT51ZHBfcGt0X3NyYyA9IHVkcF9wa3Rfc3JjOworICAgICAgIAkJbWVtY3B5KGNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9kYXRhLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCA9IFRNUl9JTlRfRU5BQkxFRF9VRFA7CisJCXVkcF9wa3Rfc3RvcmVkID0gMTsKKwl9CisKKwlpZih1ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9TVEFDSyl7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfWVsc2V7CisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwl9CisJCQorCXJldHVybih1ZHBfcGt0X3N0b3JlZCk7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJvY2VzcyBVRFAgbWFuYWdlbWVudCBwYWNrZXQuCisgKi8KKworc3RhdGljIGludCBwcm9jZXNzX3VkcF9tZ210X3BrdChzZGxhX3QqIGNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCQkJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSApIAoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBpbnQgZnJhbWVzLCBsZW47CisJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisJdW5zaWduZWQgc2hvcnQgYnVmZmVyX2xlbmd0aCwgcmVhbF9sZW47CisJdW5zaWduZWQgbG9uZyBkYXRhX3B0cjsKKwl1bnNpZ25lZCBkYXRhX2xlbmd0aDsKKwlpbnQgdWRwX21nbXRfcmVxX3ZhbGlkID0gMTsKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCAqbWIgPSBjYXJkLT5tYm94OworCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QgKmZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCWNoZGxjX3VkcF9wa3RfdCAqY2hkbGNfdWRwX3BrdDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlpbnQgZXJyOworCWNoYXIgdXRfY2hhcjsKKworCWNoZGxjX3VkcF9wa3QgPSAoY2hkbGNfdWRwX3BrdF90ICopIGNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9kYXRhOworCisJaWYoY2hkbGNfcHJpdl9hcmVhLT51ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9ORVRXT1JLKXsKKworCQkvKiBPbmx5IHRoZXNlIGNvbW1hbmRzIGFyZSBzdXBwb3J0IGZvciByZW1vdGUgZGVidWdnaW5nLgorCQkgKiBBbGwgb3RoZXJzIGFyZSBub3QgKi8KKwkJc3dpdGNoKGNoZGxjX3VkcF9wa3QtPmNibG9jay5jb21tYW5kKSB7CisKKwkJCWNhc2UgUkVBRF9HTE9CQUxfU1RBVElTVElDUzoKKwkJCWNhc2UgUkVBRF9NT0RFTV9TVEFUVVM6ICAKKwkJCWNhc2UgUkVBRF9DSERMQ19MSU5LX1NUQVRVUzoKKwkJCWNhc2UgQ1BJUEVfUk9VVEVSX1VQX1RJTUU6CisJCQljYXNlIFJFQURfQ09NTVNfRVJST1JfU1RBVFM6CisJCQljYXNlIFJFQURfQ0hETENfT1BFUkFUSU9OQUxfU1RBVFM6CisKKwkJCS8qIFRoZXNlIHR3byBjb21tYW5kcyBhcmUgZXhlY3V0ZWQgZm9yCisJCQkgKiBlYWNoIHJlcXVlc3QgKi8KKwkJCWNhc2UgUkVBRF9DSERMQ19DT05GSUdVUkFUSU9OOgorCQkJY2FzZSBSRUFEX0NIRExDX0NPREVfVkVSU0lPTjoKKwkJCQl1ZHBfbWdtdF9yZXFfdmFsaWQgPSAxOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl1ZHBfbWdtdF9yZXFfdmFsaWQgPSAwOworCQkJCWJyZWFrOworCQl9IAorCX0KKwkKKyAgCWlmKCF1ZHBfbWdtdF9yZXFfdmFsaWQpIHsKKworCQkvKiBzZXQgbGVuZ3RoIHRvIDAgKi8KKwkJY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLmJ1ZmZlcl9sZW5ndGggPSAwOworCisgICAgCQkvKiBzZXQgcmV0dXJuIGNvZGUgKi8KKwkJY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLnJldHVybl9jb2RlID0gMHhDRDsKKworCQlpZiAobmV0X3JhdGVsaW1pdCgpKXsJCisJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJIiVzOiBXYXJuaW5nLCBJbGxlZ2FsIFVEUCBjb21tYW5kIGF0dGVtcHRlZCBmcm9tIG5ldHdvcms6ICV4XG4iLAorCQkJY2FyZC0+ZGV2bmFtZSxjaGRsY191ZHBfcGt0LT5jYmxvY2suY29tbWFuZCk7CisJCX0KKworICAgCX0gZWxzZSB7CisJICAgCXVuc2lnbmVkIGxvbmcgdHJhY2Vfc3RhdHVzX2NmZ19hZGRyID0gMDsKKwkJVFJBQ0VfU1RBVFVTX0VMX0NGR19TVFJVQ1QgdHJhY2VfY2ZnX3N0cnVjdDsKKwkJVFJBQ0VfU1RBVFVTX0VMRU1FTlRfU1RSVUNUIHRyYWNlX2VsZW1lbnRfc3RydWN0OworCisJCXN3aXRjaChjaGRsY191ZHBfcGt0LT5jYmxvY2suY29tbWFuZCkgeworCisJCWNhc2UgQ1BJUEVfRU5BQkxFX1RSQUNJTkc6CisJCSAgICAgaWYgKCFjaGRsY19wcml2X2FyZWEtPlRyYWNpbmdFbmFibGVkKSB7CisKKwkJCS8qIE9QRVJBVEVfREFUQUxJTkVfTU9OSVRPUiAqLworCisJCQltYi0+YnVmZmVyX2xlbmd0aCA9IHNpemVvZihMSU5FX1RSQUNFX0NPTkZJR19TVFJVQ1QpOworCQkJbWItPmNvbW1hbmQgPSBTRVRfVFJBQ0VfQ09ORklHVVJBVElPTjsKKworICAgIAkJCSgoTElORV9UUkFDRV9DT05GSUdfU1RSVUNUICopbWItPmRhdGEpLT4KKwkJCQl0cmFjZV9jb25maWcgPSBUUkFDRV9BQ1RJVkU7CisJCQkvKiBUcmFjZSBkZWxheSBtb2RlIGlzIG5vdCB1c2VkIGJlY2F1c2UgaXQgc2xvd3MKKwkJCSAgIGRvd24gdHJhbnNmZXIgYW5kIHJlc3VsdHMgaW4gYSBzdGFuZG9mZiBzaXR1YXRpb24KKwkJCSAgIHdoZW4gdGhlcmUgaXMgYSBsb3Qgb2YgZGF0YSAqLworCisJCQkvKiBDb25maWd1cmUgdGhlIFRyYWNlIGJhc2VkIG9uIHVzZXIgaW5wdXRzICovCisJCQkoKExJTkVfVFJBQ0VfQ09ORklHX1NUUlVDVCAqKW1iLT5kYXRhKS0+dHJhY2VfY29uZmlnIHw9IAorCQkJCQljaGRsY191ZHBfcGt0LT5kYXRhWzBdOworCisJCQkoKExJTkVfVFJBQ0VfQ09ORklHX1NUUlVDVCAqKW1iLT5kYXRhKS0+CisJCQkgICB0cmFjZV9kZWFjdGl2YXRpb25fdGltZXIgPSA0MDAwOworCisKKwkJCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwkJCWlmIChlcnIgIT0gQ09NTUFORF9PSykgeworCQkJCWNoZGxjX2Vycm9yKGNhcmQsZXJyLG1iKTsKKwkJCQljYXJkLT5UcmFjaW5nRW5hYmxlZCA9IDA7CisJCQkJY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLnJldHVybl9jb2RlID0gZXJyOworCQkJCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwkJCQlicmVhazsKKwkgICAgCQl9IAorCisJCQkvKiBHZXQgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgdHJhY2UgZWxlbWVudCBsaXN0ICovCisJCQltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJCQltYi0+Y29tbWFuZCA9IFJFQURfVFJBQ0VfQ09ORklHVVJBVElPTjsKKwkJCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKworCQkJaWYgKGVyciAhPSBDT01NQU5EX09LKSB7CisJCQkJY2hkbGNfZXJyb3IoY2FyZCxlcnIsbWIpOworCQkJCWNoZGxjX3ByaXZfYXJlYS0+VHJhY2luZ0VuYWJsZWQgPSAwOworCQkJCWNoZGxjX3VkcF9wa3QtPmNibG9jay5yZXR1cm5fY29kZSA9IGVycjsKKwkJCQltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJCQkJYnJlYWs7CisJICAgIAkJfSAJCisKKwkgICAJCXRyYWNlX3N0YXR1c19jZmdfYWRkciA9KChMSU5FX1RSQUNFX0NPTkZJR19TVFJVQ1QgKikKKwkJCQltYi0+ZGF0YSkgLT4gcHRyX3RyYWNlX3N0YXRfZWxfY2ZnX3N0cnVjdDsKKworCQkJc2RsYV9wZWVrKCZjYXJkLT5odywgdHJhY2Vfc3RhdHVzX2NmZ19hZGRyLAorCQkJCSAmdHJhY2VfY2ZnX3N0cnVjdCwgc2l6ZW9mKHRyYWNlX2NmZ19zdHJ1Y3QpKTsKKwkJICAgIAorCQkJY2hkbGNfcHJpdl9hcmVhLT5zdGFydF90cmFjZV9hZGRyID0gdHJhY2VfY2ZnX3N0cnVjdC4KKwkJCQliYXNlX2FkZHJfdHJhY2Vfc3RhdHVzX2VsZW1lbnRzOworCisJCQljaGRsY19wcml2X2FyZWEtPm51bWJlcl90cmFjZV9lbGVtZW50cyA9IAorCQkJCQl0cmFjZV9jZmdfc3RydWN0Lm51bWJlcl90cmFjZV9zdGF0dXNfZWxlbWVudHM7CisKKwkJCWNoZGxjX3ByaXZfYXJlYS0+ZW5kX3RyYWNlX2FkZHIgPSAodW5zaWduZWQgbG9uZykKKwkJCQkJKChUUkFDRV9TVEFUVVNfRUxFTUVOVF9TVFJVQ1QgKikKKwkJCQkJIGNoZGxjX3ByaXZfYXJlYS0+c3RhcnRfdHJhY2VfYWRkciArIAorCQkJCQkgKGNoZGxjX3ByaXZfYXJlYS0+bnVtYmVyX3RyYWNlX2VsZW1lbnRzIC0gMSkpOworCisJCQljaGRsY19wcml2X2FyZWEtPmJhc2VfYWRkcl90cmFjZV9idWZmZXIgPSAKKwkJCQkJdHJhY2VfY2ZnX3N0cnVjdC5iYXNlX2FkZHJfdHJhY2VfYnVmZmVyOworCisJCQljaGRsY19wcml2X2FyZWEtPmVuZF9hZGRyX3RyYWNlX2J1ZmZlciA9IAorCQkJCQl0cmFjZV9jZmdfc3RydWN0LmVuZF9hZGRyX3RyYWNlX2J1ZmZlcjsKKworCQkgICAgCWNoZGxjX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyID0gCisJCQkJCXRyYWNlX2NmZ19zdHJ1Y3QubmV4dF90cmFjZV9lbGVtZW50X3RvX3VzZTsKKworCSAgICAJCWNoZGxjX3ByaXZfYXJlYS0+YXZhaWxhYmxlX2J1ZmZlcl9zcGFjZSA9IDIwMDAgLSAKKwkJCQkJCQkJICBzaXplb2YoaXBfcGt0X3QpIC0KKwkJCQkJCQkJICBzaXplb2YodWRwX3BrdF90KSAtCisJCQkJCQkJICAgICAgCSAgc2l6ZW9mKHdwX21nbXRfdCkgLQorCQkJCQkJCQkgIHNpemVvZihjYmxvY2tfdCkgLQorCQkJCQkJCSAgICAgICAgICBzaXplb2YodHJhY2VfaW5mb190KTsJCisJICAgICAgIAkgICAgIH0KKwkJICAgICBjaGRsY191ZHBfcGt0LT5jYmxvY2sucmV0dXJuX2NvZGUgPSBDT01NQU5EX09LOworCQkgICAgIG1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwkgICAgICAgCSAgICAgY2hkbGNfcHJpdl9hcmVhLT5UcmFjaW5nRW5hYmxlZCA9IDE7CisJICAgICAgIAkgICAgIGJyZWFrOworCSAgIAorCisJCWNhc2UgQ1BJUEVfRElTQUJMRV9UUkFDSU5HOgorCQkgICAgIGlmIChjaGRsY19wcml2X2FyZWEtPlRyYWNpbmdFbmFibGVkKSB7CisKKwkJCS8qIE9QRVJBVEVfREFUQUxJTkVfTU9OSVRPUiAqLworCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSBzaXplb2YoTElORV9UUkFDRV9DT05GSUdfU1RSVUNUKTsKKwkJCW1iLT5jb21tYW5kID0gU0VUX1RSQUNFX0NPTkZJR1VSQVRJT047CisgICAgCQkJKChMSU5FX1RSQUNFX0NPTkZJR19TVFJVQ1QgKiltYi0+ZGF0YSktPgorCQkJCXRyYWNlX2NvbmZpZyA9IFRSQUNFX0lOQUNUSVZFOworCQkJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCQkgICAgIH0JCQorCisJCSAgICAgY2hkbGNfcHJpdl9hcmVhLT5UcmFjaW5nRW5hYmxlZCA9IDA7CisJCSAgICAgY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLnJldHVybl9jb2RlID0gQ09NTUFORF9PSzsKKwkJICAgICBtYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJCSAgICAgYnJlYWs7CisJICAgCisKKwkJY2FzZSBDUElQRV9HRVRfVFJBQ0VfSU5GTzoKKworCQkgICAgIGlmICghY2hkbGNfcHJpdl9hcmVhLT5UcmFjaW5nRW5hYmxlZCkgeworCQkJY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLnJldHVybl9jb2RlID0gMTsKKwkJCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwkJCWJyZWFrOworCQkgICAgIH0KKworICAJCSAgICAgY2hkbGNfdWRwX3BrdC0+dHJhY2VfaW5mby5pc21vcmVkYXRhID0gMHgwMDsKKwkJICAgICBidWZmZXJfbGVuZ3RoID0gMDsJLyogb2Zmc2V0IG9mIHBhY2tldCBhbHJlYWR5IG9jY3VwaWVkICovCisKKwkJICAgICBmb3IgKGZyYW1lcz0wOyBmcmFtZXMgPCBjaGRsY19wcml2X2FyZWEtPm51bWJlcl90cmFjZV9lbGVtZW50czsgZnJhbWVzKyspeworCisJCQl0cmFjZV9wa3RfdCAqdHJhY2VfcGt0ID0gKHRyYWNlX3BrdF90ICopCisJCQkJJmNoZGxjX3VkcF9wa3QtPmRhdGFbYnVmZmVyX2xlbmd0aF07CisKKwkJCXNkbGFfcGVlaygmY2FyZC0+aHcsIGNoZGxjX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyLAorCQkJICAgCSAgKHVuc2lnbmVkIGNoYXIgKikmdHJhY2VfZWxlbWVudF9zdHJ1Y3QsCisJCQkgICAJICBzaXplb2YoVFJBQ0VfU1RBVFVTX0VMRU1FTlRfU1RSVUNUKSk7CisKKyAgICAgCQkJaWYgKHRyYWNlX2VsZW1lbnRfc3RydWN0Lm9wcF9mbGFnID09IDB4MDApIHsKKwkJCSAJYnJlYWs7CisJCQl9CisKKwkJCS8qIGdldCBwb2ludGVyIHRvIHJlYWwgZGF0YSAqLworCQkJZGF0YV9wdHIgPSB0cmFjZV9lbGVtZW50X3N0cnVjdC5wdHJfZGF0YV9iZnI7CisKKwkJCS8qIFNlZSBpZiB0aGVyZSBpcyBhY3R1YWwgZGF0YSBvbiB0aGUgdHJhY2UgYnVmZmVyICovCisJCQlpZiAoZGF0YV9wdHIpeworCQkJCWRhdGFfbGVuZ3RoID0gdHJhY2VfZWxlbWVudF9zdHJ1Y3QudHJhY2VfbGVuZ3RoOworCQkJfWVsc2V7CisJCQkJZGF0YV9sZW5ndGggPSAwOworCQkJCWNoZGxjX3VkcF9wa3QtPnRyYWNlX2luZm8uaXNtb3JlZGF0YSA9IDB4MDE7CisJCQl9CisJCisgICAJCQlpZiggKGNoZGxjX3ByaXZfYXJlYS0+YXZhaWxhYmxlX2J1ZmZlcl9zcGFjZSAtIGJ1ZmZlcl9sZW5ndGgpCisJCQkJPCAoIHNpemVvZih0cmFjZV9wa3RfdCkgKyBkYXRhX2xlbmd0aCkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRpY2F0ZSB0aGVyZSBhcmUgbW9yZSBmcmFtZXMgb24gYm9hcmQgJiBleGl0ICovCisJCQkJY2hkbGNfdWRwX3BrdC0+dHJhY2VfaW5mby5pc21vcmVkYXRhID0gMHgwMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisJCQl0cmFjZV9wa3QtPnN0YXR1cyA9IHRyYWNlX2VsZW1lbnRfc3RydWN0LnRyYWNlX3R5cGU7CisKKwkJCXRyYWNlX3BrdC0+dGltZV9zdGFtcCA9CisJCQkJdHJhY2VfZWxlbWVudF9zdHJ1Y3QudHJhY2VfdGltZV9zdGFtcDsKKworCQkJdHJhY2VfcGt0LT5yZWFsX2xlbmd0aCA9CisJCQkJdHJhY2VfZWxlbWVudF9zdHJ1Y3QudHJhY2VfbGVuZ3RoOworCisJCQkvKiBzZWUgaWYgd2UgY2FuIGZpdCB0aGUgZnJhbWUgaW50byB0aGUgdXNlciBidWZmZXIgKi8KKwkJCXJlYWxfbGVuID0gdHJhY2VfcGt0LT5yZWFsX2xlbmd0aDsKKworCQkJaWYgKGRhdGFfcHRyID09IDApIHsKKwkJCSAgICAgCXRyYWNlX3BrdC0+ZGF0YV9hdmFpbCA9IDB4MDA7CisJCQl9IGVsc2UgeworCQkJCXVuc2lnbmVkIHRtcCA9IDA7CisKKwkJCQkvKiBnZXQgdGhlIGRhdGEgZnJvbSBjaXJjdWxhciBidWZmZXIKKwkJCQkgICAgbXVzdCBjaGVjayBmb3IgZW5kIG9mIGJ1ZmZlciAqLworCQkJICAgICAgICB0cmFjZV9wa3QtPmRhdGFfYXZhaWwgPSAweDAxOworCisJCQkJaWYgKChkYXRhX3B0ciArIHJlYWxfbGVuKSA+CisJCQkJCSAgICAgY2hkbGNfcHJpdl9hcmVhLT5lbmRfYWRkcl90cmFjZV9idWZmZXIgKyAxKXsKKworCQkJCSAgICAJdG1wID0gY2hkbGNfcHJpdl9hcmVhLT5lbmRfYWRkcl90cmFjZV9idWZmZXIgLSBkYXRhX3B0ciArIDE7CisJCQkJICAgIAlzZGxhX3BlZWsoJmNhcmQtPmh3LCBkYXRhX3B0ciwKKwkJCQkJICAgICAgIAkgIHRyYWNlX3BrdC0+ZGF0YSx0bXApOworCQkJCSAgICAJZGF0YV9wdHIgPSBjaGRsY19wcml2X2FyZWEtPmJhc2VfYWRkcl90cmFjZV9idWZmZXI7CisJCQkJfQorCQorCQkgICAgICAgIAlzZGxhX3BlZWsoJmNhcmQtPmh3LCBkYXRhX3B0ciwKKwkJCQkJICAmdHJhY2VfcGt0LT5kYXRhW3RtcF0sIHJlYWxfbGVuIC0gdG1wKTsKKwkJCX0JCisKKwkJCS8qIHplcm8gdGhlIG9wcCBmbGFnIHRvIHNob3cgd2UgZ290IHRoZSBmcmFtZSAqLworCQkJdXRfY2hhciA9IDB4MDA7CisJCQlzZGxhX3Bva2UoJmNhcmQtPmh3LCBjaGRsY19wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciwgJnV0X2NoYXIsIDEpOworCisgICAgICAgCQkJLyogbm93IG1vdmUgb250byB0aGUgbmV4dCBmcmFtZSAqLworICAgICAgIAkJCWNoZGxjX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyICs9IHNpemVvZihUUkFDRV9TVEFUVVNfRUxFTUVOVF9TVFJVQ1QpOworCisgICAgICAgCQkJLyogY2hlY2sgaWYgd2Ugd2VudCBvdmVyIHRoZSBsYXN0IGFkZHJlc3MgKi8KKwkJCWlmICggY2hkbGNfcHJpdl9hcmVhLT5jdXJyX3RyYWNlX2FkZHIgPiBjaGRsY19wcml2X2FyZWEtPmVuZF90cmFjZV9hZGRyICkgeworCQkJCWNoZGxjX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyID0gY2hkbGNfcHJpdl9hcmVhLT5zdGFydF90cmFjZV9hZGRyOworICAgICAgIAkJCX0KKworICAgICAgICAgICAgCQlpZih0cmFjZV9wa3QtPmRhdGFfYXZhaWwgPT0gMHgwMSkgeworCQkJCWJ1ZmZlcl9sZW5ndGggKz0gcmVhbF9sZW4gLSAxOworCQkJfQorCSAKKwkgICAgICAgCSAgICAJLyogZm9yIHRoZSBoZWFkZXIgKi8KKwkgICAgICAgICAgICAJYnVmZmVyX2xlbmd0aCArPSBzaXplb2YodHJhY2VfcGt0X3QpOworCisJCSAgICAgfSAgLyogRm9yIExvb3AgKi8KKworCQkgICAgIGlmIChmcmFtZXMgPT0gY2hkbGNfcHJpdl9hcmVhLT5udW1iZXJfdHJhY2VfZWxlbWVudHMpeworCQkJY2hkbGNfdWRwX3BrdC0+dHJhY2VfaW5mby5pc21vcmVkYXRhID0gMHgwMTsKKwkgICAgICAgICAgICAgfQorIAkJICAgICBjaGRsY191ZHBfcGt0LT50cmFjZV9pbmZvLm51bV9mcmFtZXMgPSBmcmFtZXM7CisJCSAKKyAgICAJCSAgICAgbWItPmJ1ZmZlcl9sZW5ndGggPSBidWZmZXJfbGVuZ3RoOworCQkgICAgIGNoZGxjX3VkcF9wa3QtPmNibG9jay5idWZmZXJfbGVuZ3RoID0gYnVmZmVyX2xlbmd0aDsgCisJCSAKKwkJICAgICBjaGRsY191ZHBfcGt0LT5jYmxvY2sucmV0dXJuX2NvZGUgPSBDT01NQU5EX09LOyAKKwkJICAgICAKKwkJICAgICBicmVhazsKKworCisJCWNhc2UgQ1BJUEVfRlQxX1JFQURfU1RBVFVTOgorCQkJKCh1bnNpZ25lZCBjaGFyICopY2hkbGNfdWRwX3BrdC0+ZGF0YSApWzBdID0KKwkJCQlmbGFncy0+RlQxX2luZm9fc3RydWN0LnBhcmFsbGVsX3BvcnRfQV9pbnB1dDsKKworCQkJKCh1bnNpZ25lZCBjaGFyICopY2hkbGNfdWRwX3BrdC0+ZGF0YSApWzFdID0KKwkJCQlmbGFncy0+RlQxX2luZm9fc3RydWN0LnBhcmFsbGVsX3BvcnRfQl9pbnB1dDsKKwkJCQkKKwkJCWNoZGxjX3VkcF9wa3QtPmNibG9jay5yZXR1cm5fY29kZSA9IENPTU1BTkRfT0s7CisJCQljaGRsY191ZHBfcGt0LT5jYmxvY2suYnVmZmVyX2xlbmd0aCA9IDI7CisJCQltYi0+YnVmZmVyX2xlbmd0aCA9IDI7CisJCQlicmVhazsKKworCQljYXNlIENQSVBFX1JPVVRFUl9VUF9USU1FOgorCQkJZG9fZ2V0dGltZW9mZGF5KCAmdHYgKTsKKwkJCWNoZGxjX3ByaXZfYXJlYS0+cm91dGVyX3VwX3RpbWUgPSB0di50dl9zZWMgLSAKKwkJCQkJY2hkbGNfcHJpdl9hcmVhLT5yb3V0ZXJfc3RhcnRfdGltZTsKKwkJCSoodW5zaWduZWQgbG9uZyAqKSZjaGRsY191ZHBfcGt0LT5kYXRhID0gCisJCQkJCWNoZGxjX3ByaXZfYXJlYS0+cm91dGVyX3VwX3RpbWU7CQorCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJCQljaGRsY191ZHBfcGt0LT5jYmxvY2suYnVmZmVyX2xlbmd0aCA9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwkJCWNoZGxjX3VkcF9wa3QtPmNibG9jay5yZXR1cm5fY29kZSA9IENPTU1BTkRfT0s7CisJCQlicmVhazsKKworICAgCQljYXNlIEZUMV9NT05JVE9SX1NUQVRVU19DVFJMOgorCQkJLyogRW5hYmxlIEZUMSBNT05JVE9SIFNUQVRVUyAqLworCSAgICAgICAgCWlmICgoY2hkbGNfdWRwX3BrdC0+ZGF0YVswXSAmIEVOQUJMRV9SRUFEX0ZUMV9TVEFUVVMpIHx8ICAKKwkJCQkoY2hkbGNfdWRwX3BrdC0+ZGF0YVswXSAmIEVOQUJMRV9SRUFEX0ZUMV9PUF9TVEFUUykpIHsKKwkJCQorCQkJICAgICAJaWYoIHJDb3VudCsrICE9IDAgKSB7CisJCQkJCWNoZGxjX3VkcF9wa3QtPmNibG9jay4KKwkJCQkJcmV0dXJuX2NvZGUgPSBDT01NQU5EX09LOworCQkJCQltYi0+YnVmZmVyX2xlbmd0aCA9IDE7CisJCSAgCQkJYnJlYWs7CisJCSAgICAJICAgICAJfQorCSAgICAgIAkJfQorCisJICAgICAgCQkvKiBEaXNhYmxlIEZUMSBNT05JVE9SIFNUQVRVUyAqLworCSAgICAgIAkJaWYoIGNoZGxjX3VkcF9wa3QtPmRhdGFbMF0gPT0gMCkgeworCisJICAgICAgCSAgIAkgICAgIAlpZiggLS1yQ291bnQgIT0gMCkgeworCQkgIAkJCWNoZGxjX3VkcF9wa3QtPmNibG9jay4KKwkJCQkJcmV0dXJuX2NvZGUgPSBDT01NQU5EX09LOworCQkJCQltYi0+YnVmZmVyX2xlbmd0aCA9IDE7CisJCSAgCQkJYnJlYWs7CisJICAgCSAgICAJICAgICAJfSAKKwkgICAgICAJCX0gCQorCQkJZ290byBkZmx0XzE7CisKKwkJZGVmYXVsdDoKK2RmbHRfMToKKwkJCS8qIGl0J3MgYSBib2FyZCBjb21tYW5kICovCisJCQltYi0+Y29tbWFuZCA9IGNoZGxjX3VkcF9wa3QtPmNibG9jay5jb21tYW5kOworCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSBjaGRsY191ZHBfcGt0LT5jYmxvY2suYnVmZmVyX2xlbmd0aDsKKwkJCWlmIChtYi0+YnVmZmVyX2xlbmd0aCkgeworCQkJCW1lbWNweSgmbWItPmRhdGEsICh1bnNpZ25lZCBjaGFyICopIGNoZGxjX3VkcF9wa3QtPgorCQkJCQkJCWRhdGEsIG1iLT5idWZmZXJfbGVuZ3RoKTsKKwkgICAgICAJCX0gCisJCQkvKiBydW4gdGhlIGNvbW1hbmQgb24gdGhlIGJvYXJkICovCisJCQllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJCQlpZiAoZXJyICE9IENPTU1BTkRfT0spIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogY29weSB0aGUgcmVzdWx0IGJhY2sgdG8gb3VyIGJ1ZmZlciAqLworCSAgICAgICAgIAltZW1jcHkoJmNoZGxjX3VkcF9wa3QtPmNibG9jaywgbWIsIHNpemVvZihjYmxvY2tfdCkpOyAKKwkJCQorCQkJaWYgKG1iLT5idWZmZXJfbGVuZ3RoKSB7CisJICAgICAgICAgCQltZW1jcHkoJmNoZGxjX3VkcF9wa3QtPmRhdGEsICZtYi0+ZGF0YSwgCisJCQkJCQkJCW1iLT5idWZmZXJfbGVuZ3RoKTsgCisJICAgICAgCQl9CisKKwkJfSAvKiBlbmQgb2Ygc3dpdGNoICovCisgICAgIAl9IC8qIGVuZCBvZiBlbHNlICovCisKKyAgICAgCS8qIEZpbGwgVURQIFRUTCAqLworCWNoZGxjX3VkcF9wa3QtPmlwX3BrdC50dGwgPSBjYXJkLT53YW5kZXYudHRsOyAKKworICAgICAJbGVuID0gcmVwbHlfdWRwKGNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9kYXRhLCBtYi0+YnVmZmVyX2xlbmd0aCk7CisJCisKKyAgICAgCWlmKGNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9zcmMgPT0gVURQX1BLVF9GUk1fTkVUV09SSyl7CisKKwkJLyogTXVzdCBjaGVjayBpZiB3ZSBpbnRlcnJ1cHRlZCBpZl9zZW5kKCkgcm91dGluZS4gVGhlCisJCSAqIHR4IGJ1ZmZlcnMgbWlnaHQgYmUgdXNlZC4gSWYgc28gZHJvcCB0aGUgcGFja2V0ICovCisJICAgCWlmICghdGVzdF9iaXQoU0VORF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKSB7CisJCQorCQkJaWYoIWNoZGxjX3NlbmQoY2FyZCwgY2hkbGNfcHJpdl9hcmVhLT51ZHBfcGt0X2RhdGEsIGxlbikpIHsKKwkJCQkrKyBjYXJkLT53YW5kZXYuc3RhdHMudHhfcGFja2V0czsKKwkJCQljYXJkLT53YW5kZXYuc3RhdHMudHhfYnl0ZXMgKz0gbGVuOworCQkJfQorCQl9CisJfSBlbHNlIHsJCisJCisJCS8qIFBhc3MgaXQgdXAgdGhlIHN0YWNrCisgICAgCQkgICBBbGxvY2F0ZSBzb2NrZXQgYnVmZmVyICovCisJCWlmICgobmV3X3NrYiA9IGRldl9hbGxvY19za2IobGVuKSkgIT0gTlVMTCkgeworCQkJLyogY29weSBkYXRhIGludG8gbmV3X3NrYiAqLworCisgCSAgICAJCWJ1ZiA9IHNrYl9wdXQobmV3X3NrYiwgbGVuKTsKKyAgCSAgICAJCW1lbWNweShidWYsIGNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9kYXRhLCBsZW4pOworCisgICAgICAgICAgICAJCS8qIERlY2Fwc3VsYXRlIHBrdCBhbmQgcGFzcyBpdCB1cCB0aGUgcHJvdG9jb2wgc3RhY2sgKi8KKwkgICAgCQluZXdfc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKyAgICAgICAgICAgIAkJbmV3X3NrYi0+ZGV2ID0gZGV2OworCSAgICAJCW5ld19za2ItPm1hYy5yYXcgID0gbmV3X3NrYi0+ZGF0YTsKKwkKKwkJCW5ldGlmX3J4KG5ld19za2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJfSBlbHNlIHsKKwkgICAgCQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIHNvY2tldCBidWZmZXJzIGF2YWlsYWJsZSFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworICAJCX0KKyAgICAJfQorIAorCWNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9sZ3RoID0gMDsKKyAJCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBSZWNlaXZlIGFuZCBUcmFuc21pdCBCdWZmZXJzLgorICovCisKK3N0YXRpYyB2b2lkIGluaXRfY2hkbGNfdHhfcnhfYnVmZiggc2RsYV90KiBjYXJkKQoreworCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYiA9IGNhcmQtPm1ib3g7CisJQ0hETENfVFhfU1RBVFVTX0VMX0NGR19TVFJVQ1QgKnR4X2NvbmZpZzsKKwlDSERMQ19SWF9TVEFUVVNfRUxfQ0ZHX1NUUlVDVCAqcnhfY29uZmlnOworCWNoYXIgZXJyOworCQorCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwltYi0+Y29tbWFuZCA9IFJFQURfQ0hETENfQ09ORklHVVJBVElPTjsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisKKwlpZihlcnIgIT0gQ09NTUFORF9PSykgeworCQlpZiAoY2FyZC0+d2FuZGV2LmRldil7CisJCQljaGRsY19lcnJvcihjYXJkLGVycixtYik7CisJCX0KKwkJcmV0dXJuOworCX0KKworCWlmKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KSB7CisJCXR4X2NvbmZpZyA9IChDSERMQ19UWF9TVEFUVVNfRUxfQ0ZHX1NUUlVDVCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgICAoKChDSERMQ19DT05GSUdVUkFUSU9OX1NUUlVDVCAqKW1iLT5kYXRhKS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX0NIRExDX1R4X3N0YXRfZWxfY2ZnX3N0cnVjdCkpOworICAgICAgICAJcnhfY29uZmlnID0gKENIRExDX1JYX1NUQVRVU19FTF9DRkdfU1RSVUNUICopKGNhcmQtPmh3LmRwbWJhc2UgKworICAgICAgICAgICAgICAgICgoKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICopbWItPmRhdGEpLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfQ0hETENfUnhfc3RhdF9lbF9jZmdfc3RydWN0KSk7CisKKyAgICAgICAJCS8qIFNldHVwIEhlYWQgYW5kIFRhaWxzIGZvciBidWZmZXJzICovCisgICAgICAgIAljYXJkLT51LmMudHhidWZfYmFzZSA9ICh2b2lkICopKGNhcmQtPmh3LmRwbWJhc2UgKworICAgICAgICAgICAgICAgIHR4X2NvbmZpZy0+YmFzZV9hZGRyX1R4X3N0YXR1c19lbGVtZW50cyk7CisgICAgICAgIAljYXJkLT51LmMudHhidWZfbGFzdCA9IAorCQkoQ0hETENfREFUQV9UWF9TVEFUVVNfRUxfU1RSVUNUICopICAKKyAgICAgICAgICAgICAgICBjYXJkLT51LmMudHhidWZfYmFzZSArCisJCSh0eF9jb25maWctPm51bWJlcl9UeF9zdGF0dXNfZWxlbWVudHMgLSAxKTsKKworICAgICAgICAJY2FyZC0+dS5jLnJ4YnVmX2Jhc2UgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgICByeF9jb25maWctPmJhc2VfYWRkcl9SeF9zdGF0dXNfZWxlbWVudHMpOworICAgICAgICAJY2FyZC0+dS5jLnJ4YnVmX2xhc3QgPQorCQkoQ0hETENfREFUQV9SWF9TVEFUVVNfRUxfU1RSVUNUICopCisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnJ4YnVmX2Jhc2UgKworCQkocnhfY29uZmlnLT5udW1iZXJfUnhfc3RhdHVzX2VsZW1lbnRzIC0gMSk7CisKKyAJCS8qIFNldCB1cCBuZXh0IHBvaW50ZXIgdG8gYmUgdXNlZCAqLworICAgICAgICAJY2FyZC0+dS5jLnR4YnVmID0gKHZvaWQgKikoY2FyZC0+aHcuZHBtYmFzZSArCisgICAgICAgICAgICAgICAgdHhfY29uZmlnLT5uZXh0X1R4X3N0YXR1c19lbGVtZW50X3RvX3VzZSk7CisgICAgICAgIAljYXJkLT51LmMucnhtYiA9ICh2b2lkICopKGNhcmQtPmh3LmRwbWJhc2UgKworICAgICAgICAgICAgICAgIHJ4X2NvbmZpZy0+bmV4dF9SeF9zdGF0dXNfZWxlbWVudF90b191c2UpOworCX0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdHhfY29uZmlnID0gKENIRExDX1RYX1NUQVRVU19FTF9DRkdfU1RSVUNUICopKGNhcmQtPmh3LmRwbWJhc2UgKworCQkJKCgoQ0hETENfQ09ORklHVVJBVElPTl9TVFJVQ1QgKiltYi0+ZGF0YSktPgorCQkJcHRyX0NIRExDX1R4X3N0YXRfZWxfY2ZnX3N0cnVjdCAlIFNETEFfV0lORE9XU0laRSkpOworCisgICAgICAgICAgICAgICAgcnhfY29uZmlnID0gKENIRExDX1JYX1NUQVRVU19FTF9DRkdfU1RSVUNUICopKGNhcmQtPmh3LmRwbWJhc2UgKworCQkJKCgoQ0hETENfQ09ORklHVVJBVElPTl9TVFJVQ1QgKiltYi0+ZGF0YSktPgorCQkJcHRyX0NIRExDX1J4X3N0YXRfZWxfY2ZnX3N0cnVjdCAlIFNETEFfV0lORE9XU0laRSkpOworCisgICAgICAgICAgICAgICAgLyogU2V0dXAgSGVhZCBhbmQgVGFpbHMgZm9yIGJ1ZmZlcnMgKi8KKyAgICAgICAgICAgICAgICBjYXJkLT51LmMudHhidWZfYmFzZSA9ICh2b2lkICopKGNhcmQtPmh3LmRwbWJhc2UgKworCQkodHhfY29uZmlnLT5iYXNlX2FkZHJfVHhfc3RhdHVzX2VsZW1lbnRzICUgU0RMQV9XSU5ET1dTSVpFKSk7CisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnR4YnVmX2xhc3QgPQorCQkoQ0hETENfREFUQV9UWF9TVEFUVVNfRUxfU1RSVUNUICopY2FyZC0+dS5jLnR4YnVmX2Jhc2UKKwkJKyAodHhfY29uZmlnLT5udW1iZXJfVHhfc3RhdHVzX2VsZW1lbnRzIC0gMSk7CisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnJ4YnVmX2Jhc2UgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKwkJKHJ4X2NvbmZpZy0+YmFzZV9hZGRyX1J4X3N0YXR1c19lbGVtZW50cyAlIFNETEFfV0lORE9XU0laRSkpOworICAgICAgICAgICAgICAgIGNhcmQtPnUuYy5yeGJ1Zl9sYXN0ID0gCisJCShDSERMQ19EQVRBX1JYX1NUQVRVU19FTF9TVFJVQ1QgKiljYXJkLT51LmMucnhidWZfYmFzZQorCQkrIChyeF9jb25maWctPm51bWJlcl9SeF9zdGF0dXNfZWxlbWVudHMgLSAxKTsKKworICAgICAgICAgICAgICAgICAvKiBTZXQgdXAgbmV4dCBwb2ludGVyIHRvIGJlIHVzZWQgKi8KKyAgICAgICAgICAgICAgICBjYXJkLT51LmMudHhidWYgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKwkJKHR4X2NvbmZpZy0+bmV4dF9UeF9zdGF0dXNfZWxlbWVudF90b191c2UgJSBTRExBX1dJTkRPV1NJWkUpKTsKKyAgICAgICAgICAgICAgICBjYXJkLT51LmMucnhtYiA9ICh2b2lkICopKGNhcmQtPmh3LmRwbWJhc2UgKworCQkocnhfY29uZmlnLT5uZXh0X1J4X3N0YXR1c19lbGVtZW50X3RvX3VzZSAlIFNETEFfV0lORE9XU0laRSkpOworICAgICAgICB9CisKKyAgICAgICAgLyogU2V0dXAgQWN0dWFsIEJ1ZmZlciBTdGFydCBhbmQgZW5kIGFkZHJlc3NlcyAqLworICAgICAgICBjYXJkLT51LmMucnhfYmFzZSA9IHJ4X2NvbmZpZy0+YmFzZV9hZGRyX1J4X2J1ZmZlcjsKKyAgICAgICAgY2FyZC0+dS5jLnJ4X3RvcCAgPSByeF9jb25maWctPmVuZF9hZGRyX1J4X2J1ZmZlcjsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQZXJmb3JtIEludGVycnVwdCBUZXN0IGJ5IHJ1bm5pbmcgUkVBRF9DSERMQ19DT0RFX1ZFUlNJT04gY29tbWFuZCBNQVhfSU5UUgorICogX1RFU1RfQ09VTlRFUiB0aW1lcy4KKyAqLworc3RhdGljIGludCBpbnRyX3Rlc3QoIHNkbGFfdCogY2FyZCkKK3sKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworCWludCBlcnIsaTsKKworCUludHJfdGVzdF9jb3VudGVyID0gMDsKKwkKKwllcnIgPSBjaGRsY19zZXRfaW50cl9tb2RlKGNhcmQsIEFQUF9JTlRfT05fQ09NTUFORF9DT01QTEVURSk7CisKKwlpZiAoZXJyID09IENNRF9PSykgeyAKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9JTlRSX1RFU1RfQ09VTlRFUjsgaSArKykgewkKKwkJCW1iLT5idWZmZXJfbGVuZ3RoICA9IDA7CisJCQltYi0+Y29tbWFuZCA9IFJFQURfQ0hETENfQ09ERV9WRVJTSU9OOworCQkJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCQkJaWYgKGVyciAhPSBDTURfT0spIAorCQkJCWNoZGxjX2Vycm9yKGNhcmQsIGVyciwgbWIpOworCQl9CisJfQorCWVsc2UgeworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IGNoZGxjX3NldF9pbnRyX21vZGUoY2FyZCwgMCk7CisKKwlpZiAoZXJyICE9IENNRF9PSykKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiBVRFAgY2FsbCBpdCBpcy4gQ1BJUEVBQiA/CisgKi8KK3N0YXRpYyBpbnQgdWRwX3BrdF90eXBlKHN0cnVjdCBza19idWZmICpza2IsIHNkbGFfdCogY2FyZCkKK3sKKwkgY2hkbGNfdWRwX3BrdF90ICpjaGRsY191ZHBfcGt0ID0gKGNoZGxjX3VkcF9wa3RfdCAqKXNrYi0+ZGF0YTsKKworI2lmZGVmIF9XQU5fVURQX0RFQlVHCisJCXByaW50ayhLRVJOX0lORk8gIlNJRyAlcyA9ICVzXG5cCisJCQkJICBVUFAgJXggPSAleFxuXAorCQkJCSAgUFJUICV4ID0gJXhcblwKKwkJCQkgIFJFUSAlaSA9ICVpXG5cCisJCQkJICAzNiB0aCA9ICV4IDM3dGggPSAleFxuIiwKKwkJCQkgIGNoZGxjX3VkcF9wa3QtPndwX21nbXQuc2lnbmF0dXJlLAorCQkJCSAgVURQTUdNVF9TSUdOQVRVUkUsCisJCQkJICBjaGRsY191ZHBfcGt0LT51ZHBfcGt0LnVkcF9kc3RfcG9ydCwKKwkJCQkgIG50b2hzKGNhcmQtPndhbmRldi51ZHBfcG9ydCksCisJCQkJICBjaGRsY191ZHBfcGt0LT5pcF9wa3QucHJvdG9jb2wsCisJCQkJICBVRFBNR01UX1VEUF9QUk9UT0NPTCwKKwkJCQkgIGNoZGxjX3VkcF9wa3QtPndwX21nbXQucmVxdWVzdF9yZXBseSwKKwkJCQkgIFVEUE1HTVRfUkVRVUVTVCwKKwkJCQkgIHNrYi0+ZGF0YVszNl0sIHNrYi0+ZGF0YVszN10pOworI2VuZGlmCQorCQkKKwlpZiAoIXN0cm5jbXAoY2hkbGNfdWRwX3BrdC0+d3BfbWdtdC5zaWduYXR1cmUsVURQTUdNVF9TSUdOQVRVUkUsOCkgJiYKKwkgICAoY2hkbGNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfZHN0X3BvcnQgPT0gbnRvaHMoY2FyZC0+d2FuZGV2LnVkcF9wb3J0KSkgJiYKKwkgICAoY2hkbGNfdWRwX3BrdC0+aXBfcGt0LnByb3RvY29sID09IFVEUE1HTVRfVURQX1BST1RPQ09MKSAmJgorCSAgIChjaGRsY191ZHBfcGt0LT53cF9tZ210LnJlcXVlc3RfcmVwbHkgPT0gVURQTUdNVF9SRVFVRVNUKSkgeworCisJCXJldHVybiBVRFBfQ1BJUEVfVFlQRTsKKworCX1lbHNleyAKKwkJcmV0dXJuIFVEUF9JTlZBTElEX1RZUEU7CisJfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBQT1JUIHN0YXRlLgorICovCitzdGF0aWMgdm9pZCBwb3J0X3NldF9zdGF0ZSAoc2RsYV90ICpjYXJkLCBpbnQgc3RhdGUpCit7CisgICAgICAgIGlmIChjYXJkLT51LmMuc3RhdGUgIT0gc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFdBTl9DT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsgKEtFUk5fSU5GTyAiJXM6IExpbmsgY29ubmVjdGVkIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgCWJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBXQU5fQ09OTkVDVElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoS0VSTl9JTkZPICIlczogTGluayBjb25uZWN0aW5nLi4uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBXQU5fRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrIChLRVJOX0lORk8gIiVzOiBMaW5rIGRpc2Nvbm5lY3RlZCFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FyZC0+d2FuZGV2LnN0YXRlID0gY2FyZC0+dS5jLnN0YXRlID0gc3RhdGU7CisJCWlmIChjYXJkLT53YW5kZXYuZGV2KXsKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCQkJY2hkbGNfcHJpdmF0ZV9hcmVhX3QgKmNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwkJCWNoZGxjX3ByaXZfYXJlYS0+Y29tbW9uLnN0YXRlID0gc3RhdGU7CisJCX0KKyAgICAgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogY29uZmlnX2NoZGxjCisgKgorICoJQ29uZmlndXJlIHRoZSBjaGRsYyBwcm90b2NvbCBhbmQgZW5hYmxlIGNvbW11bmljYXRpb25zLgkJCisgKgorICogICAJVGhlIGlmX29wZW4oKSBmdW5jdGlvbiBiaW5kcyB0aGlzIGZ1bmN0aW9uIHRvIHRoZSBwb2xsIHJvdXRpbmUuCisgKiAgICAgIFRoZXJlZm9yZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHJ1biBldmVyeSB0aW1lIHRoZSBjaGRsYyBpbnRlcmZhY2UKKyAqICAgICAgaXMgYnJvdWdodCB1cC4gV2UgY2Fubm90IHJ1biB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGlmX29wZW4gCisgKiAgICAgIGJlY2F1c2UgaWZfb3BlbiBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgcmVtb3RlIElQIGFkZHJlc3MuCisgKiAgICAgIAorICoJSWYgdGhlIGNvbW11bmljYXRpb25zIGFyZSBub3QgZW5hYmxlZCwgcHJvY2VlZCB0byBjb25maWd1cmUKKyAqICAgICAgdGhlIGNhcmQgYW5kIGVuYWJsZSBjb21tdW5pY2F0aW9ucy4KKyAqCisgKiAgICAgIElmIHRoZSBjb21tdW5pY2F0aW9ucyBhcmUgZW5hYmxlZCwgaXQgbWVhbnMgdGhhdCB0aGUgaW50ZXJmYWNlCisgKiAgICAgIHdhcyBzaHV0ZG93biBieSBldGhlciB0aGUgdXNlciBvciBkcml2ZXIuIEluIHRoaXMgY2FzZSwgd2UgCisgKiAgICAgIGhhdmUgdG8gY2hlY2sgdGhhdCB0aGUgSVAgYWRkcmVzc2VzIGhhdmUgbm90IGNoYW5nZWQuICBJZgorICogICAgICB0aGUgSVAgYWRkcmVzc2VzIGhhdmUgY2hhbmdlZCwgd2UgaGF2ZSB0byByZWNvbmZpZ3VyZSB0aGUgZmlybXdhcmUKKyAqICAgICAgYW5kIHVwZGF0ZSB0aGUgY2hhbmdlZCBJUCBhZGRyZXNzZXMuICBPdGhlcndpc2UsIGp1c3QgZXhpdC4KKyAqCisgKi8KKworc3RhdGljIGludCBjb25maWdfY2hkbGMgKHNkbGFfdCAqY2FyZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKwljaGRsY19wcml2YXRlX2FyZWFfdCAqY2hkbGNfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QgKmZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCisJaWYgKGNhcmQtPnUuYy5jb21tX2VuYWJsZWQpeworCisJCS8qIEp1biAyMC4gMjAwMDogTkMKKwkJICogSVAgYWRkcmVzc2VzIGFyZSBub3QgdXNlZCBpbiB0aGUgQVBJIG1vZGUgKi8KKwkJCisJCWlmICgoY2hkbGNfcHJpdl9hcmVhLT5pcF9sb2NhbF90bXAgIT0gY2hkbGNfcHJpdl9hcmVhLT5pcF9sb2NhbCB8fAorCQkgICAgIGNoZGxjX3ByaXZfYXJlYS0+aXBfcmVtb3RlX3RtcCAhPSBjaGRsY19wcml2X2FyZWEtPmlwX3JlbW90ZSkgJiYgCisJCSAgICAgY2FyZC0+dS5jLnVzZWRieSA9PSBXQU5QSVBFKSB7CisJCQkKKwkJCS8qIFRoZSBJUCBhZGRlcnNzZXMgaGF2ZSBjaGFuZ2VkLCB3ZSBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdG9wIHRoZSBjb21tdW5pY2F0aW9ucyBhbmQgcmVjb25maWd1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBjYXJkLiBSZWFzb246IHRoZSBmaXJtd2FyZSBtdXN0IGtub3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBsb2NhbCBhbmQgcmVtb3RlIElQIGFkZHJlc3Nlcy4gKi8KKwkJCWRpc2FibGVfY29tbShjYXJkKTsKKwkJCXBvcnRfc2V0X3N0YXRlKGNhcmQsIFdBTl9ESVNDT05ORUNURUQpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IElQIGFkZHJlc3NlcyBjaGFuZ2VkIVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogUmVzdGFydGluZyBjb21tdW5pY2F0aW9ucyAuLi5cbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQl9ZWxzZXsgCisJCQkvKiBJUCBhZGRyZXNzZXMgYXJlIHRoZSBzYW1lIGFuZCB0aGUgbGluayBpcyB1cCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgKiB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGhlcmUuIFRoZXJlZm9yZSwgZXhpdCAqLworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwljaGRsY19wcml2X2FyZWEtPmlwX2xvY2FsID0gY2hkbGNfcHJpdl9hcmVhLT5pcF9sb2NhbF90bXA7CisJY2hkbGNfcHJpdl9hcmVhLT5pcF9yZW1vdGUgPSBjaGRsY19wcml2X2FyZWEtPmlwX3JlbW90ZV90bXA7CisKKworCS8qIFNldHVwIHRoZSBCb2FyZCBmb3IgYXN5bmNocm9ub3VzIG1vZGUgKi8KKwlpZiAoY2FyZC0+dS5jLmFzeW5jX21vZGUpeworCQkKKwkJaWYgKHNldF9hc3lfY29uZmlnKGNhcmQpKSB7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCBDSERMQyBBc3luYyBjb25maWd1cmF0aW9uIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfWVsc2V7CisJCS8qIFNldHVwIHRoZSBCb2FyZCBmb3IgQ0hETEMgKi8KKwkJaWYgKHNldF9jaGRsY19jb25maWcoY2FyZCkpIHsKKwkJCXByaW50ayAoS0VSTl9JTkZPICIlczogRmFpbGVkIENIRExDIGNvbmZpZ3VyYXRpb24hXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBTZXQgaW50ZXJydXB0IG1vZGUgYW5kIG1hc2sgKi8KKyAgICAgICAgaWYgKGNoZGxjX3NldF9pbnRyX21vZGUoY2FyZCwgQVBQX0lOVF9PTl9SWF9GUkFNRSB8CisgICAgICAgICAgICAgICAgCQlBUFBfSU5UX09OX0dMT0JBTF9FWENFUF9DT05EIHwKKyAgICAgICAgICAgICAgICAJCUFQUF9JTlRfT05fVFhfRlJBTUUgfAorICAgICAgICAgICAgICAgIAkJQVBQX0lOVF9PTl9DSERMQ19FWENFUF9DT05EIHwgQVBQX0lOVF9PTl9USU1FUikpeworCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCB0byBzZXQgaW50ZXJydXB0IHRyaWdnZXJzIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuIDA7CQorICAgICAgICB9CisJCisKKwkvKiBNYXNrIHRoZSBUcmFuc21pdCBhbmQgVGltZXIgaW50ZXJydXB0ICovCisJZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfcGVybWlzc2lvbiAmPSAKKwkJfihBUFBfSU5UX09OX1RYX0ZSQU1FIHwgQVBQX0lOVF9PTl9USU1FUik7CisKKwkvKiBJbiBUVFkgbW9kZSwgcmVjZWl2ZSBpbnRlcnJ1cHQgd2lsbCBiZSBlbmFibGVkIGR1cmluZworCSAqIHdhbnBpcGVfdHR5X29wZW4oKSBvcGVyYXRpb24gKi8KKwlpZiAoY2FyZC0+dHR5X29wdCl7CisJCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gJj0gfkFQUF9JTlRfT05fUlhfRlJBTUU7CisJfQorCisJLyogRW5hYmxlIGNvbW11bmljYXRpb25zICovCisgCWlmIChjYXJkLT51LmMuYXN5bmNfbW9kZSl7CisJCWlmIChhc3lfY29tbV9lbmFibGUoY2FyZCkgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCB0byBlbmFibGUgYXN5bmMgY29tbW51bmljYXRpb24hXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gPSAwOworCQkJY2FyZC0+dS5jLmNvbW1fZW5hYmxlZD0wOworCQkJY2hkbGNfc2V0X2ludHJfbW9kZShjYXJkLDApOworCQkJcmV0dXJuIDA7CisJCX0KKyAgICAgICAgfWVsc2V7IAorCQlpZiAoY2hkbGNfY29tbV9lbmFibGUoY2FyZCkgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCB0byBlbmFibGUgY2hkbGMgY29tbXVuaWNhdGlvbnMhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gPSAwOworCQkJY2FyZC0+dS5jLmNvbW1fZW5hYmxlZD0wOworCQkJY2hkbGNfc2V0X2ludHJfbW9kZShjYXJkLDApOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBJbml0aWFsaXplIFJ4L1R4IGJ1ZmZlciBjb250cm9sIGZpZWxkcyAqLworCWluaXRfY2hkbGNfdHhfcnhfYnVmZihjYXJkKTsKKwlwb3J0X3NldF9zdGF0ZShjYXJkLCBXQU5fQ09OTkVDVElORyk7CisJcmV0dXJuIDA7IAorfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBjaGRsY19wb2xsCisgKgkKKyAqIFJhdGlvbmFsZToKKyAqIAlXZSBjYW5ub3QgbWFuaXB1bGF0ZSB0aGUgcm91dGluZyB0YWJsZXMsIG9yCisgKiAgICAgIGlwIGFkZHJlc3NlcyB3aXRoaW5nIHRoZSBpbnRlcnJ1cHQuIFRoZXJlZm9yZQorICogICAgICB3ZSBtdXN0IHBlcmZvcm0gc3VjaCBhY3RvbnMgb3V0c2lkZSBhbiBpbnRlcnJ1cHQgCisgKiAgICAgIGF0IGEgbGF0ZXIgdGltZS4gCisgKgorICogRGVzY3JpcHRpb246CQorICoJQ0hETEMgcG9sbGluZyByb3V0aW5lLCByZXNwb25zaWJsZSBmb3IgCisgKiAgICAgCXNodXR0aW5nIGRvd24gaW50ZXJmYWNlcyB1cG9uIGRpc2Nvbm5lY3QKKyAqICAgICAJYW5kIGFkZGluZy9yZW1vdmluZyByb3V0ZXMuIAorICogICAgICAKKyAqIFVzYWdlOiAgICAgICAgCisgKiAJVGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZCBmb3IgZWFjaCBDSERMQyAgCisgKiAJaW50ZXJmYWNlIHRocm91Z2ggYSB0cV9zY2hlZHVsZSBib3R0b20gaGFsZi4KKyAqICAgICAgCisgKiAgICAgIHRyaWdnZXJfY2hkbGNfcG9sbCgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8ga2ljaworICogICAgICB0aGUgY2hsZGNfcG9sbCByb3V0aW5lLiAgCisgKi8KKworc3RhdGljIHZvaWQgY2hkbGNfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWNoZGxjX3ByaXZhdGVfYXJlYV90ICpjaGRsY19wcml2X2FyZWE7CisJc2RsYV90ICpjYXJkOworCXU4IGNoZWNrX2dhdGV3YXk9MDsJCisJU0hBUkVEX01FTU9SWV9JTkZPX1NUUlVDVCogZmxhZ3M7CisKKwkKKwlpZiAoIWRldiB8fCAoY2hkbGNfcHJpdl9hcmVhPWRldi0+cHJpdikgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJY2FyZCA9IGNoZGxjX3ByaXZfYXJlYS0+Y2FyZDsKKwlmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKwkKKwkvKiAoUmUpQ29uZmlndXJhaXRvbiBpcyBpbiBwcm9ncmVzcywgc3RvcCB3aGF0IHlvdSBhcmUgCisJICogZG9pbmcgYW5kIGdldCBvdXQgKi8KKwlpZiAodGVzdF9iaXQoUEVSSV9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJY2xlYXJfYml0KFBPTExfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkJcmV0dXJuOworCX0KKwkKKwkvKiBpZl9vcGVuKCkgZnVuY3Rpb24gaGFzIHRyaWdnZXJlZCB0aGUgcG9sbGluZyByb3V0aW5lCisJICogdG8gZGV0ZXJtaW5lIHRoZSBjb25maWd1cmVkIElQIGFkZHJlc3Nlcy4gIE9uY2UgdGhlCisJICogYWRkcmVzc2VzIGFyZSBmb3VuZCwgdHJpZ2dlciB0aGUgY2hkbGMgY29uZmlndXJhdGlvbiAqLworCWlmICh0ZXN0X2JpdCgwLCZjaGRsY19wcml2X2FyZWEtPmNvbmZpZ19jaGRsYykpeworCisJCWNoZGxjX3ByaXZfYXJlYS0+aXBfbG9jYWxfdG1wICA9IGdldF9pcF9hZGRyZXNzKGRldixXQU5fTE9DQUxfSVApOworCQljaGRsY19wcml2X2FyZWEtPmlwX3JlbW90ZV90bXAgPSBnZXRfaXBfYWRkcmVzcyhkZXYsV0FOX1BPSU5UT1BPSU5UX0lQKTsKKwkKKwkgICAgICAgLyogSnVuIDIwLiAyMDAwIEJ1ZyBGaXgKKwkgCSogT25seSBwZXJmb3JtIHRoaXMgY2hlY2sgaW4gV0FOUElQRSBtb2RlLCBzaW5jZQorCSAJKiBJUCBhZGRyZXNzZXMgYXJlIG5vdCB1c2VkIGluIHRoZSBBUEkgbW9kZS4gKi8KKwkKKwkJaWYgKGNoZGxjX3ByaXZfYXJlYS0+aXBfbG9jYWxfdG1wID09IGNoZGxjX3ByaXZfYXJlYS0+aXBfcmVtb3RlX3RtcCAmJiAKKwkJICAgIGNhcmQtPnUuYy5zbGFycF90aW1lciA9PSAweDAwICYmIAorCQkgICAgIWNhcmQtPnUuYy5iYWNrdXAgJiYgCisJCSAgICBjYXJkLT51LmMudXNlZGJ5ID09IFdBTlBJUEUpeworCisJCQlpZiAoKytjaGRsY19wcml2X2FyZWEtPmlwX2Vycm9yID4gTUFYX0lQX0VSUk9SUyl7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiXG4lczogLS0tIFdBUk5JTkcgLS0tXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IFRoZSBsb2NhbCBJUCBhZGRyZXNzIGlzIHRoZSBzYW1lIGFzIHRoZVxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBQb2ludC10by1Qb2ludCBJUCBhZGRyZXNzLlxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAtLS0gV0FSTklORyAtLS1cblxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJfWVsc2V7CisJCQkJY2xlYXJfYml0KFBPTExfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkJCQljaGRsY19wcml2X2FyZWEtPnBvbGxfZGVsYXlfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMrSFo7CisJCQkJYWRkX3RpbWVyKCZjaGRsY19wcml2X2FyZWEtPnBvbGxfZGVsYXlfdGltZXIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCWNsZWFyX2JpdCgwLCZjaGRsY19wcml2X2FyZWEtPmNvbmZpZ19jaGRsYyk7CisJCWNsZWFyX2JpdChQT0xMX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJCQorCQljaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9DT05GSUc7CisJCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gfD0gQVBQX0lOVF9PTl9USU1FUjsKKwkJcmV0dXJuOworCX0KKwkvKiBEeW5hbWljIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiwgYXMgd2VsbCBhcyBkeW5hbWljCisJICogcm91dGluZy4gICovCisJCisJc3dpdGNoIChjYXJkLT51LmMuc3RhdGUpeworCisJY2FzZSBXQU5fRElTQ09OTkVDVEVEOgorCisJCS8qIElmIHRoZSBkeW5hbWljIGludGVyZmFjZSBjb25maWd1cmF0aW9uIGlzIG9uLCBhbmQgaW50ZXJmYWNlIAorCQkgKiBpcyB1cCwgdGhlbiBicmluZyBkb3duIHRoZSBuZXRvd3JrIGludGVyZmFjZSAqLworCQkKKwkJaWYgKHRlc3RfYml0KERZTl9PUFRfT04sJmNoZGxjX3ByaXZfYXJlYS0+aW50ZXJmYWNlX2Rvd24pICYmIAorCQkgICAgIXRlc3RfYml0KERFVl9ET1dOLCAgJmNoZGxjX3ByaXZfYXJlYS0+aW50ZXJmYWNlX2Rvd24pICYmCQkKKwkJICAgIGNhcmQtPndhbmRldi5kZXYtPmZsYWdzICYgSUZGX1VQKXsJCisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnRlcmZhY2UgJXMgZG93bi5cbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSxjYXJkLT53YW5kZXYuZGV2LT5uYW1lKTsKKwkJCWNoYW5nZV9kZXZfZmxhZ3MoY2FyZC0+d2FuZGV2LmRldiwoY2FyZC0+d2FuZGV2LmRldi0+ZmxhZ3MmfklGRl9VUCkpOworCQkJc2V0X2JpdChERVZfRE9XTiwmY2hkbGNfcHJpdl9hcmVhLT5pbnRlcmZhY2VfZG93bik7CisJCQljaGRsY19wcml2X2FyZWEtPnJvdXRlX3N0YXR1cyA9IE5PX1JPVVRFOworCisJCX1lbHNleworCQkJLyogV2UgbmVlZCB0byBjaGVjayBpZiB0aGUgbG9jYWwgSVAgYWRkcmVzcyBpcworICAgICAgICAgICAgICAgCSAgCSAqIHplcm8uIElmIGl0IGlzLCB3ZSBzaG91bGRuJ3QgdHJ5IHRvIHJlbW92ZSBpdC4KKyAgICAgICAgICAgICAgICAgCSAqLworCisJCQlpZiAoY2FyZC0+d2FuZGV2LmRldi0+ZmxhZ3MgJiBJRkZfVVAgJiYgCisJCSAgICAJICAgIGdldF9pcF9hZGRyZXNzKGNhcmQtPndhbmRldi5kZXYsV0FOX0xPQ0FMX0lQKSAmJiAKKwkJICAgIAkgICAgY2hkbGNfcHJpdl9hcmVhLT5yb3V0ZV9zdGF0dXMgIT0gTk9fUk9VVEUgJiYKKwkJCSAgICBjYXJkLT51LmMuc2xhcnBfdGltZXIpeworCisJCQkJcHJvY2Vzc19yb3V0ZShjYXJkKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgV0FOX0NPTk5FQ1RFRDoKKworCQkvKiBJbiBTTVAgbWFjaGluZSB0aGlzIGNvZGUgY2FuIGV4ZWN1dGUgYmVmb3JlIHRoZSBpbnRlcmZhY2UKKwkJICogY29tZXMgdXAuICBJbiB0aGlzIGNhc2UsIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90CisJCSAqIHRyeSB0byBicmluZyB1cCB0aGUgaW50ZXJmYWNlIGJlZm9yZSBkZXZfb3BlbigpIGlzIGZpbmlzaGVkICovCisKKworCQkvKiBERVZfRE9XTiB3aWxsIGJlIHNldCBvbmx5IHdoZW4gd2UgYnJpbmcgZG93biB0aGUgaW50ZXJmYWNlCisJCSAqIGZvciB0aGUgdmVyeSBmaXJzdCB0aW1lLiBUaGlzIHdheSB3ZSBrbm93IHRoYXQgaXQgd2FzIHVzCisJCSAqIHRoYXQgYnJvdWdodCB0aGUgaW50ZXJmYWNlIGRvd24gKi8KKwkJCisJCWlmICh0ZXN0X2JpdChEWU5fT1BUX09OLCZjaGRsY19wcml2X2FyZWEtPmludGVyZmFjZV9kb3duKSAmJgorCQkgICAgdGVzdF9iaXQoREVWX0RPV04sICAmY2hkbGNfcHJpdl9hcmVhLT5pbnRlcmZhY2VfZG93bikgJiYKKwkJICAgICEoY2FyZC0+d2FuZGV2LmRldi0+ZmxhZ3MgJiBJRkZfVVApKXsKKwkJCQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludGVyZmFjZSAlcyB1cC5cbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSxjYXJkLT53YW5kZXYuZGV2LT5uYW1lKTsKKwkJCWNoYW5nZV9kZXZfZmxhZ3MoY2FyZC0+d2FuZGV2LmRldiwoY2FyZC0+d2FuZGV2LmRldi0+ZmxhZ3N8SUZGX1VQKSk7CisJCQljbGVhcl9iaXQoREVWX0RPV04sJmNoZGxjX3ByaXZfYXJlYS0+aW50ZXJmYWNlX2Rvd24pOworCQkJY2hlY2tfZ2F0ZXdheT0xOworCQl9CisKKwkJaWYgKGNoZGxjX3ByaXZfYXJlYS0+cm91dGVfc3RhdHVzID09IEFERF9ST1VURSAmJiAKKwkJICAgIGNhcmQtPnUuYy5zbGFycF90aW1lcil7IAorCisJCQlwcm9jZXNzX3JvdXRlKGNhcmQpOworCQkJY2hlY2tfZ2F0ZXdheT0xOworCQl9CisKKwkJaWYgKGNoZGxjX3ByaXZfYXJlYS0+Z2F0ZXdheSAmJiBjaGVja19nYXRld2F5KQorCQkJYWRkX2dhdGV3YXkoY2FyZCxkZXYpOworCisJCWJyZWFrOworCX0JCisKKwljbGVhcl9iaXQoUE9MTF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogdHJpZ2dlcl9jaGRsY19wb2xsCisgKgorICogRGVzY3JpcHRpb246CisgKiAJQWRkIGEgY2hkbGNfcG9sbCgpIHdvcmsgZW50cnkgaW50byB0aGUga2V2ZW50ZCB3b3JrIHF1ZXVlCisgKiAgICAgIGZvciBhIHNwZWNpZmljIGRsY2kvaW50ZXJmYWNlLiAgVGhpcyB3aWxsIGtpY2sKKyAqICAgICAgdGhlIGZyX3BvbGwoKSByb3V0aW5lIGF0IGEgbGF0ZXIgdGltZS4gCisgKgorICogVXNhZ2U6CisgKiAJSW50ZXJydXB0cyB1c2UgdGhpcyB0byBkZWZlciBhIHRha3MgdG8gCisgKiAgICAgIGEgcG9sbGluZyByb3V0aW5lLgorICoKKyAqLwkKK3N0YXRpYyB2b2lkIHRyaWdnZXJfY2hkbGNfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWNoZGxjX3ByaXZhdGVfYXJlYV90ICpjaGRsY19wcml2X2FyZWE7CisJc2RsYV90ICpjYXJkOworCisJaWYgKCFkZXYpCisJCXJldHVybjsKKwkKKwlpZiAoKGNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdik9PU5VTEwpCisJCXJldHVybjsKKworCWNhcmQgPSBjaGRsY19wcml2X2FyZWEtPmNhcmQ7CisJCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoUE9MTF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJcmV0dXJuOworCX0KKwlpZiAodGVzdF9iaXQoUEVSSV9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJcmV0dXJuOyAKKwl9CisJc2NoZWR1bGVfd29yaygmY2hkbGNfcHJpdl9hcmVhLT5wb2xsX3dvcmspOworfQorCisKK3N0YXRpYyB2b2lkIGNoZGxjX3BvbGxfZGVsYXkgKHVuc2lnbmVkIGxvbmcgZGV2X3B0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X3B0cjsKKwl0cmlnZ2VyX2NoZGxjX3BvbGwoZGV2KTsKK30KKworCit2b2lkIHM1MDhfbG9jayAoc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpCit7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPndhbmRldi5sb2NrLCAqc21wX2ZsYWdzKTsKKyAgICAgICAgaWYgKGNhcmQtPm5leHQpeworICAgICAgICAJc3Bpbl9sb2NrKCZjYXJkLT5uZXh0LT53YW5kZXYubG9jayk7CisJfQorfQorCit2b2lkIHM1MDhfdW5sb2NrIChzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncykKK3sKKyAgICAgICAgaWYgKGNhcmQtPm5leHQpeworICAgICAgICAJc3Bpbl91bmxvY2soJmNhcmQtPm5leHQtPndhbmRldi5sb2NrKTsKKyAgICAgICAgfQorICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT53YW5kZXYubG9jaywgKnNtcF9mbGFncyk7Cit9CisKKy8vKioqKioqKioqKiogVFRZIFNFQ1RJT04gKioqKioqKioqKioqKioqKgorCitzdGF0aWMgdm9pZCB3YW5waXBlX3R0eV90cmlnZ2VyX3R4X2lycShzZGxhX3QgKmNhcmQpCit7CisJU0hBUkVEX01FTU9SWV9JTkZPX1NUUlVDVCAqZmxhZ3MgPSBjYXJkLT51LmMuZmxhZ3M7CisJSU5URVJSVVBUX0lORk9STUFUSU9OX1NUUlVDVCAqY2hkbGNfaW50ID0gJmZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3Q7CisJY2hkbGNfaW50LT5pbnRlcnJ1cHRfcGVybWlzc2lvbiB8PSBBUFBfSU5UX09OX1RYX0ZSQU1FOworfQorCitzdGF0aWMgdm9pZCB3YW5waXBlX3R0eV90cmlnZ2VyX3BvbGwoc2RsYV90ICpjYXJkKQoreworCXNjaGVkdWxlX3dvcmsoJmNhcmQtPnR0eV93b3JrKTsKK30KKworc3RhdGljIHZvaWQgdHR5X3BvbGxfd29yayAodm9pZCogZGF0YSkKK3sKKwlzZGxhX3QgKmNhcmQgPSAoc2RsYV90KilkYXRhOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKKwlpZiAoKHR0eT1jYXJkLT50dHkpPT1OVUxMKQorCQlyZXR1cm47CisJCisJdHR5X3dha2V1cCh0dHkpOworI2lmIGRlZmluZWQoU0VSSUFMX0hBVkVfUE9MTF9XQUlUKQorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdHR5LT5wb2xsX3dhaXQpOworI2VuZGlmCQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXNkbGFfdCAqY2FyZDsKKwl1bnNpZ25lZCBsb25nIHNtcF9mbGFnczsKKwkKKwlpZiAoIXR0eSB8fCAhdHR5LT5kcml2ZXJfZGF0YSl7CisJCXJldHVybjsKKwl9CisJCisJY2FyZCA9IChzZGxhX3QqKXR0eS0+ZHJpdmVyX2RhdGE7CisJCisJaWYgKCFjYXJkKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogQ2xvc2luZyBUVFkgRHJpdmVyIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUpOworCisJLyogU2FuaXR5IENoZWNrICovCisJaWYgKCFjYXJkLT50dHlfb3BlbikKKwkJcmV0dXJuOworCQorCXdhbnBpcGVfY2xvc2UoY2FyZCk7CisJaWYgKC0tY2FyZC0+dHR5X29wZW4gPT0gMCl7CisKKwkJbG9ja19hZGFwdGVyX2lycSgmY2FyZC0+d2FuZGV2LmxvY2ssJnNtcF9mbGFncyk7CQorCQljYXJkLT50dHk9TlVMTDsKKwkJY2hkbGNfZGlzYWJsZV9jb21tX3NodXRkb3duKGNhcmQpOworCQl1bmxvY2tfYWRhcHRlcl9pcnEoJmNhcmQtPndhbmRldi5sb2NrLCZzbXBfZmxhZ3MpOworCisJCWlmIChjYXJkLT50dHlfYnVmKXsKKwkJCWtmcmVlKGNhcmQtPnR0eV9idWYpOworCQkJY2FyZC0+dHR5X2J1Zj1OVUxMOwkJCQorCQl9CisKKwkJaWYgKGNhcmQtPnR0eV9yeCl7CisJCQlrZnJlZShjYXJkLT50dHlfcngpOworCQkJY2FyZC0+dHR5X3J4PU5VTEw7CisJCX0KKwl9CisJcmV0dXJuOworfQorc3RhdGljIGludCB3YW5waXBlX3R0eV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwl1bnNpZ25lZCBsb25nIHNtcF9mbGFnczsKKwlzZGxhX3QgKmNhcmQ7CisJCisJaWYgKCF0dHkpeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJCisJaWYgKCF0dHktPmRyaXZlcl9kYXRhKXsKKwkJaW50IHBvcnQ7CisJCXBvcnQgPSB0dHktPmluZGV4OworCQlpZiAoKHBvcnQgPCAwKSB8fCAocG9ydCA+PSBOUl9QT1JUUykpIAorCQkJcmV0dXJuIC1FTk9ERVY7CisJCQorCQl0dHktPmRyaXZlcl9kYXRhID0gV0FOX0NBUkQocG9ydCk7CisJCWlmICghdHR5LT5kcml2ZXJfZGF0YSkKKwkJCXJldHVybiAtRU5PREVWOworCX0KKworCWNhcmQgPSAoc2RsYV90Kil0dHktPmRyaXZlcl9kYXRhOworCisJaWYgKCFjYXJkKXsKKwkJbG9ja19hZGFwdGVyX2lycSgmY2FyZC0+d2FuZGV2LmxvY2ssJnNtcF9mbGFncyk7CQorCQljYXJkLT50dHk9TlVMTDsKKwkJdW5sb2NrX2FkYXB0ZXJfaXJxKCZjYXJkLT53YW5kZXYubG9jaywmc21wX2ZsYWdzKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE9wZW5pbmcgVFRZIERyaXZlciFcbiIsCisJCQljYXJkLT5kZXZuYW1lKTsKKworCWlmIChjYXJkLT50dHlfb3BlbiA9PSAwKXsKKwkJbG9ja19hZGFwdGVyX2lycSgmY2FyZC0+d2FuZGV2LmxvY2ssJnNtcF9mbGFncyk7CQorCQljYXJkLT50dHk9dHR5OworCQl1bmxvY2tfYWRhcHRlcl9pcnEoJmNhcmQtPndhbmRldi5sb2NrLCZzbXBfZmxhZ3MpOworCisJCWlmICghY2FyZC0+dHR5X2J1Zil7CisJCQljYXJkLT50dHlfYnVmID0ga21hbGxvYyhUVFlfQ0hETENfTUFYX01UVSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWNhcmQtPnR0eV9idWYpeworCQkJCWNhcmQtPnR0eV9idWY9TlVMTDsKKwkJCQljYXJkLT50dHk9TlVMTDsKKwkJCQlyZXR1cm4gLUVOT01FTTsJCisJCQl9CisJCX0KKworCQlpZiAoIWNhcmQtPnR0eV9yeCl7CisJCQljYXJkLT50dHlfcnggPSBrbWFsbG9jKFRUWV9DSERMQ19NQVhfTVRVLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghY2FyZC0+dHR5X3J4KXsKKwkJCQkvKiBGcmVlIHRoZSBidWZmZXIgYWJvdmUgKi8KKwkJCQlrZnJlZShjYXJkLT50dHlfYnVmKTsKKwkJCQljYXJkLT50dHlfYnVmPU5VTEw7CisJCQkJY2FyZC0+dHR5PU5VTEw7CisJCQkJcmV0dXJuIC1FTk9NRU07CQorCQkJfQorCQl9CisJfQorCisJKytjYXJkLT50dHlfb3BlbjsKKwl3YW5waXBlX29wZW4oY2FyZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2FucGlwZV90dHlfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgc21wX2ZsYWdzPTA7CisJc2RsYV90ICpjYXJkPU5VTEw7CisKKwlpZiAoIXR0eSl7CisJCWRiZ19wcmludGsoS0VSTl9JTkZPICJOTyBUVFkgaW4gV3JpdGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljYXJkID0gKHNkbGFfdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJCQkKKwlpZiAoIWNhcmQpeworCQlkYmdfcHJpbnRrKEtFUk5fSU5GTyAiTm8gQ2FyZCBpbiBUVFkgV3JpdGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CQorCisJaWYgKGNvdW50ID4gY2FyZC0+d2FuZGV2Lm10dSl7CisJCWRiZ19wcmludGsoS0VSTl9JTkZPICJGcmFtZSB0b28gYmlnIGluIFdyaXRlICVpIE1heDogJWlcbiIsCisJCQkJY291bnQsY2FyZC0+d2FuZGV2Lm10dSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKwlpZiAoY2FyZC0+d2FuZGV2LnN0YXRlICE9IFdBTl9DT05ORUNURUQpeworCQlkYmdfcHJpbnRrKEtFUk5fSU5GTyAiQ2FyZCBub3QgY29ubmVjdGVkIGluIFRUWSBXcml0ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIExvY2sgdGhlIDUwOCBDYXJkOiBTTVAgaXMgc3VwcG9ydGVkICovCisgICAgICAJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpeworCQlzNTA4X2xvY2soY2FyZCwmc21wX2ZsYWdzKTsKKwl9IAorCQorCWlmICh0ZXN0X2FuZF9zZXRfYml0KFNFTkRfQ1JJVCwodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogQ3JpdGljYWwgaW4gVFRZIFdyaXRlXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkKKwkJLyogTG9jayB0aGUgNTA4IENhcmQ6IFNNUCBpcyBzdXBwb3J0ZWQgKi8KKwkJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpCisJCQlzNTA4X3VubG9jayhjYXJkLCZzbXBfZmxhZ3MpOworCQkKKwkJcmV0dXJuIC1FSU5WQUw7IAorCX0KKwkKKyAJaWYgKGNoZGxjX3NlbmQoY2FyZCwodm9pZCopYnVmLGNvdW50KSl7CisJCWRiZ19wcmludGsoS0VSTl9JTkZPICIlczogRmFpbGVkIHRvIHNlbmQsIHJldHJ5IGxhdGVyOiBrZXJuZWwhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQljbGVhcl9iaXQoU0VORF9DUklULCh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKworCQl3YW5waXBlX3R0eV90cmlnZ2VyX3R4X2lycShjYXJkKTsKKwkJCisJCWlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KQorCQkJczUwOF91bmxvY2soY2FyZCwmc21wX2ZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCWRiZ19wcmludGsoS0VSTl9JTkZPICIlczogUGFja2V0IHNlbnQgT0s6ICVpXG4iLGNhcmQtPmRldm5hbWUsY291bnQpOworCWNsZWFyX2JpdChTRU5EX0NSSVQsKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQorCWlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KQorCQlzNTA4X3VubG9jayhjYXJkLCZzbXBfZmxhZ3MpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdm9pZCB3YW5waXBlX3R0eV9yZWNlaXZlKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgYWRkciwgdW5zaWduZWQgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBvZmZzZXQ9MDsKKwl1bnNpZ25lZCBvbGVuPWxlbjsKKwljaGFyIGZwPTA7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlpbnQgaTsKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKKwkKKwlpZiAoIWNhcmQtPnR0eV9vcGVuKXsKKwkJZGJnX3ByaW50ayhLRVJOX0lORk8gIiVzOiBUVFkgbm90IG9wZW4gZHVyaW5nIHJlY2VpdmVcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybjsKKwl9CisJCisJaWYgKCh0dHk9Y2FyZC0+dHR5KSA9PSBOVUxMKXsKKwkJZGJnX3ByaW50ayhLRVJOX0lORk8gIiVzOiBObyBUVFkgb24gcmVjZWl2ZVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoIXR0eS0+ZHJpdmVyX2RhdGEpeworCQlkYmdfcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vIERyaXZlciBEYXRhLCBvciBGbGlwIG9uIHJlY2VpdmVcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybjsKKwl9CisJCisKKwlpZiAoY2FyZC0+dS5jLmFzeW5jX21vZGUpeworCQlpZiAoKHR0eS0+ZmxpcC5jb3VudCtsZW4pID49IFRUWV9GTElQQlVGX1NJWkUpeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSl7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkJIiVzOiBSZWNlaXZlZCBwYWNrZXQgc2l6ZSB0b28gYmlnOiAlaSBieXRlcywgTWF4OiAlaSFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsbGVuLFRUWV9GTElQQlVGX1NJWkUpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisKKwkJCisJCWlmKChhZGRyICsgbGVuKSA+IGNhcmQtPnUuYy5yeF90b3AgKyAxKSB7CisJCQlvZmZzZXQgPSBjYXJkLT51LmMucnhfdG9wIC0gYWRkciArIDE7CisJCQkKKwkJCXNkbGFfcGVlaygmY2FyZC0+aHcsIGFkZHIsIHR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIsIG9mZnNldCk7CisJCQkKKwkJCWFkZHIgPSBjYXJkLT51LmMucnhfYmFzZTsKKwkJCWxlbiAtPSBvZmZzZXQ7CisJCQkKKwkJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrPW9mZnNldDsKKwkJCXR0eS0+ZmxpcC5jb3VudCs9b2Zmc2V0OworCQkJZm9yIChpPTA7aTxvZmZzZXQ7aSsrKXsKKwkJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IDA7CisJCQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0cisrOworCQkJfQorCQl9CisJCQorCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCBhZGRyLCB0dHktPmZsaXAuY2hhcl9idWZfcHRyLCBsZW4pOworCQkJCisJCXR0eS0+ZmxpcC5jaGFyX2J1Zl9wdHIrPWxlbjsKKwkJY2FyZC0+dHR5LT5mbGlwLmNvdW50Kz1sZW47CisJCWZvciAoaT0wO2k8bGVuO2krKyl7CisJCQkqdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciA9IDA7CisJCQl0dHktPmZsaXAuZmxhZ19idWZfcHRyKys7CisJCX0KKworCQl0dHktPmxvd19sYXRlbmN5PTE7CisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisJfWVsc2V7CisJCWlmICghY2FyZC0+dHR5X3J4KXsJCisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKXsKKwkJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogUmVjZWl2ZSBzeW5jIGJ1ZmZlciBub3QgYXZhaWxhYmxlIVxuIiwKKwkJCQkgY2FyZC0+ZGV2bmFtZSk7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwkKKwkJaWYgKGxlbiA+IFRUWV9DSERMQ19NQVhfTVRVKXsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpeworCQkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBSZWNlaXZlZCBwYWNrZXQgc2l6ZSB0b28gYmlnOiAlaSBieXRlcywgTWF4OiAlaSFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsbGVuLFRUWV9GTElQQlVGX1NJWkUpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisKKwkJCisJCWlmKChhZGRyICsgbGVuKSA+IGNhcmQtPnUuYy5yeF90b3AgKyAxKSB7CisJCQlvZmZzZXQgPSBjYXJkLT51LmMucnhfdG9wIC0gYWRkciArIDE7CisJCQkKKwkJCXNkbGFfcGVlaygmY2FyZC0+aHcsIGFkZHIsIGNhcmQtPnR0eV9yeCwgb2Zmc2V0KTsKKwkJCQorCQkJYWRkciA9IGNhcmQtPnUuYy5yeF9iYXNlOworCQkJbGVuIC09IG9mZnNldDsKKwkJfQorCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCBhZGRyLCBjYXJkLT50dHlfcngrb2Zmc2V0LCBsZW4pOworCQlsZCA9IHR0eV9sZGlzY19yZWYodHR5KTsKKwkJaWYgKGxkKSB7CisJCQlpZiAobGQtPnJlY2VpdmVfYnVmKQorCQkJCWxkLT5yZWNlaXZlX2J1Zih0dHksY2FyZC0+dHR5X3J4LCZmcCxvbGVuKTsKKwkJCXR0eV9sZGlzY19kZXJlZihsZCk7CisJCX1lbHNleworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSl7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkJIiVzOiBOTyBUVFkgU3luYyBsaW5lIGRpc2NpcGxpbmUhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCX0KKwkJfQorCX0KKworCWRiZ19wcmludGsoS0VSTl9JTkZPICIlczogUmVjZWl2ZWQgRGF0YSAlaVxuIixjYXJkLT5kZXZuYW1lLG9sZW4pOworCXJldHVybjsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgd2FucGlwZV90dHlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIC1FTk9JT0NUTENNRDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB3YW5waXBlX3R0eV9zdG9wKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCB3YW5waXBlX3R0eV9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXJldHVybjsKK30KKworc3RhdGljIGludCBjb25maWdfdHR5IChzZGxhX3QgKmNhcmQpCit7CisJU0hBUkVEX01FTU9SWV9JTkZPX1NUUlVDVCAqZmxhZ3MgPSBjYXJkLT51LmMuZmxhZ3M7CisKKwkvKiBTZXR1cCB0aGUgQm9hcmQgZm9yIGFzeW5jaHJvbm91cyBtb2RlICovCisJaWYgKGNhcmQtPnUuYy5hc3luY19tb2RlKXsKKwkJCisJCWlmIChzZXRfYXN5X2NvbmZpZyhjYXJkKSkgeworCQkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBGYWlsZWQgQ0hETEMgQXN5bmMgY29uZmlndXJhdGlvbiFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX1lbHNleworCQkvKiBTZXR1cCB0aGUgQm9hcmQgZm9yIENIRExDICovCisJCWlmIChzZXRfY2hkbGNfY29uZmlnKGNhcmQpKSB7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCBDSERMQyBjb25maWd1cmF0aW9uIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJLyogU2V0IGludGVycnVwdCBtb2RlIGFuZCBtYXNrICovCisgICAgICAgIGlmIChjaGRsY19zZXRfaW50cl9tb2RlKGNhcmQsIEFQUF9JTlRfT05fUlhfRlJBTUUgfAorICAgICAgICAgICAgICAgIAkJQVBQX0lOVF9PTl9HTE9CQUxfRVhDRVBfQ09ORCB8CisgICAgICAgICAgICAgICAgCQlBUFBfSU5UX09OX1RYX0ZSQU1FIHwKKyAgICAgICAgICAgICAgICAJCUFQUF9JTlRfT05fQ0hETENfRVhDRVBfQ09ORCB8IEFQUF9JTlRfT05fVElNRVIpKXsKKwkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBGYWlsZWQgdG8gc2V0IGludGVycnVwdCB0cmlnZ2VycyFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOwkKKyAgICAgICAgfQorCQorCisJLyogTWFzayB0aGUgVHJhbnNtaXQgYW5kIFRpbWVyIGludGVycnVwdCAqLworCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gJj0gCisJCX4oQVBQX0lOVF9PTl9UWF9GUkFNRSB8IEFQUF9JTlRfT05fVElNRVIpOworCisJCisJLyogRW5hYmxlIGNvbW11bmljYXRpb25zICovCisgCWlmIChjYXJkLT51LmMuYXN5bmNfbW9kZSl7CisJCWlmIChhc3lfY29tbV9lbmFibGUoY2FyZCkgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCB0byBlbmFibGUgYXN5bmMgY29tbW51bmljYXRpb24hXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gPSAwOworCQkJY2FyZC0+dS5jLmNvbW1fZW5hYmxlZD0wOworCQkJY2hkbGNfc2V0X2ludHJfbW9kZShjYXJkLDApOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKyAgICAgICAgfWVsc2V7IAorCQlpZiAoY2hkbGNfY29tbV9lbmFibGUoY2FyZCkgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCB0byBlbmFibGUgY2hkbGMgY29tbXVuaWNhdGlvbnMhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gPSAwOworCQkJY2FyZC0+dS5jLmNvbW1fZW5hYmxlZD0wOworCQkJY2hkbGNfc2V0X2ludHJfbW9kZShjYXJkLDApOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKiBJbml0aWFsaXplIFJ4L1R4IGJ1ZmZlciBjb250cm9sIGZpZWxkcyAqLworCWluaXRfY2hkbGNfdHhfcnhfYnVmZihjYXJkKTsKKwlwb3J0X3NldF9zdGF0ZShjYXJkLCBXQU5fQ09OTkVDVElORyk7CisJcmV0dXJuIDA7IAorfQorCisKK3N0YXRpYyBpbnQgY2hhbmdlX3NwZWVkKHNkbGFfdCAqY2FyZCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCSBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisJaW50CWJhdWQsIHJldD0wOworCXVuc2lnbmVkIGNmbGFnOyAKKwlpbnQJZGJpdHMsc2JpdHMscGFyaXR5LGhhbmRzaGFraW5nOworCisJY2ZsYWcgPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisKKwkvKiBUaGVyZSBpcyBhbHdheXMgb25lIHN0b3AgYml0ICovCisJc2JpdHM9V0FOT1BUX09ORTsKKwkKKwkvKiBQYXJpdHkgaXMgZGVmYXVsdGVkIHRvIE5PTkUgKi8KKwlwYXJpdHkgPSBXQU5PUFRfTk9ORTsKKworCWhhbmRzaGFraW5nPTA7CisJCisJLyogYnl0ZSBzaXplIGFuZCBwYXJpdHkgKi8KKwlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKKwkgICAgICBjYXNlIENTNTogZGJpdHMgPSA1OyBicmVhazsKKwkgICAgICBjYXNlIENTNjogZGJpdHMgPSA2OyBicmVhazsKKwkgICAgICBjYXNlIENTNzogZGJpdHMgPSA3OyBicmVhazsKKwkgICAgICBjYXNlIENTODogZGJpdHMgPSA4OyBicmVhazsKKwkgICAgICAvKiBOZXZlciBoYXBwZW5zLCBidXQgR0NDIGlzIHRvbyBkdW1iIHRvIGZpZ3VyZSBpdCBvdXQgKi8KKwkgICAgICBkZWZhdWx0OiAgZGJpdHMgPSA4OyBicmVhazsKKwl9CisJCisJLyogT25lIG1vcmUgc3RvcCBiaXQgc2hvdWxkIGJlIHN1cHBvcnRlZCwgdGh1cyBpbmNyZW1lbnQKKwkgKiB0aGUgbnVtYmVyIG9mIHN0b3AgYml0cyBNYXg9MiAqLworCWlmIChjZmxhZyAmIENTVE9QQikgeworCQlzYml0cyA9IFdBTk9QVF9UV087CisJfQorCWlmIChjZmxhZyAmIFBBUkVOQikgeworCQlwYXJpdHkgPSBXQU5PUFRfRVZFTjsKKwl9CisJaWYgKGNmbGFnICYgUEFST0REKXsKKwkJcGFyaXR5ID0gV0FOT1BUX09ERDsKKwl9CisKKwkvKiBEZXRlcm1pbmUgZGl2aXNvciBiYXNlZCBvbiBiYXVkIHJhdGUgKi8KKwliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUodHR5KTsKKworCWlmICghYmF1ZCkKKwkJYmF1ZCA9IDk2MDA7CS8qIEIwIHRyYW5zaXRpb24gaGFuZGxlZCBpbiByc19zZXRfdGVybWlvcyAqLworCisJaWYgKGNmbGFnICYgQ1JUU0NUUykgeworCQloYW5kc2hha2luZ3w9QVNZX1JUU19IU19GT1JfUlg7CisJfQorCQorCWlmIChJX0lHTlBBUih0dHkpKQorCQlwYXJpdHkgPSBXQU5PUFRfTk9ORTsKKworCWlmIChJX0lYT0ZGKHR0eSkpeworCQloYW5kc2hha2luZ3w9QVNZX1hPTl9YT0ZGX0hTX0ZPUl9SWDsKKwkJaGFuZHNoYWtpbmd8PUFTWV9YT05fWE9GRl9IU19GT1JfVFg7CisJfQorCisJaWYgKElfSVhPTih0dHkpKXsKKwkJaGFuZHNoYWtpbmd8PUFTWV9YT05fWE9GRl9IU19GT1JfUlg7CisJCWhhbmRzaGFraW5nfD1BU1lfWE9OX1hPRkZfSFNfRk9SX1RYOworCX0KKworCWlmIChjYXJkLT51LmMuYXN5bmNfbW9kZSl7CisJCWlmIChjYXJkLT53YW5kZXYuYnBzICE9IGJhdWQpCisJCQlyZXQ9MTsKKwkJY2FyZC0+d2FuZGV2LmJwcyA9IGJhdWQ7CisJfQorCisJaWYgKGNhcmQtPnUuYy5hc3luY19tb2RlKXsKKwkJaWYgKGNhcmQtPnUuYy5wcm90b2NvbF9vcHRpb25zICE9IGhhbmRzaGFraW5nKQorCQkJcmV0PTE7CisJCWNhcmQtPnUuYy5wcm90b2NvbF9vcHRpb25zID0gaGFuZHNoYWtpbmc7CisKKwkJaWYgKGNhcmQtPnUuYy50eF9iaXRzX3Blcl9jaGFyICE9IGRiaXRzKQorCQkJcmV0PTE7CisJCWNhcmQtPnUuYy50eF9iaXRzX3Blcl9jaGFyID0gZGJpdHM7CisKKwkJaWYgKGNhcmQtPnUuYy5yeF9iaXRzX3Blcl9jaGFyICE9IGRiaXRzKQorCQkJcmV0PTE7CisJCWNhcmQtPnUuYy5yeF9iaXRzX3Blcl9jaGFyID0gZGJpdHM7CisJCQorCQlpZiAoY2FyZC0+dS5jLnN0b3BfYml0cyAhPSBzYml0cykKKwkJCXJldD0xOworCQljYXJkLT51LmMuc3RvcF9iaXRzID0gc2JpdHM7CisKKwkJaWYgKGNhcmQtPnUuYy5wYXJpdHkgIT0gcGFyaXR5KQorCQkJcmV0PTE7CisJCWNhcmQtPnUuYy5wYXJpdHkgPSBwYXJpdHk7CQorCisJCWNhcmQtPnUuYy5icmVha190aW1lciA9IDUwOworCQljYXJkLT51LmMuaW50ZXJfY2hhcl90aW1lciA9IDEwOworCQljYXJkLT51LmMucnhfY29tcGxldGVfbGVuZ3RoID0gMTAwOworCQljYXJkLT51LmMueG9uX2NoYXIgPSAweEZFOworCX1lbHNleworCQljYXJkLT51LmMucHJvdG9jb2xfb3B0aW9ucyA9IEhETENfU1RSRUFNSU5HX01PREU7CisJfQorCQorCXJldHVybiByZXQ7Cit9CisKKwkKK3N0YXRpYyB2b2lkIHdhbnBpcGVfdHR5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwlzZGxhX3QgKmNhcmQ7CisJaW50IGVycj0xOworCisJaWYgKCF0dHkpeworCQlyZXR1cm47CisJfQorCisJY2FyZCA9IChzZGxhX3QgKil0dHktPmRyaXZlcl9kYXRhOworCQkJCisJaWYgKCFjYXJkKQorCQlyZXR1cm47CisKKwlpZiAoY2hhbmdlX3NwZWVkKGNhcmQsIHR0eSwgb2xkX3Rlcm1pb3MpIHx8ICFjYXJkLT51LmMuY29tbV9lbmFibGVkKXsKKwkJdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M7CisJCQorCQlpZiAoY2FyZC0+dS5jLmNvbW1fZW5hYmxlZCl7CisJCQlsb2NrX2FkYXB0ZXJfaXJxKCZjYXJkLT53YW5kZXYubG9jaywmc21wX2ZsYWdzKTsKKwkJCWNoZGxjX2Rpc2FibGVfY29tbV9zaHV0ZG93bihjYXJkKTsKKwkJCXVubG9ja19hZGFwdGVyX2lycSgmY2FyZC0+d2FuZGV2LmxvY2ssJnNtcF9mbGFncyk7CisJCX0KKwkJbG9ja19hZGFwdGVyX2lycSgmY2FyZC0+d2FuZGV2LmxvY2ssJnNtcF9mbGFncyk7CisJCWVyciA9IGNvbmZpZ190dHkoY2FyZCk7CisJCXVubG9ja19hZGFwdGVyX2lycSgmY2FyZC0+d2FuZGV2LmxvY2ssJnNtcF9mbGFncyk7CisJCWlmIChjYXJkLT51LmMuYXN5bmNfbW9kZSl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVFRZIEFzeW5jIENvbmZpZ3VyYXRpb246XG4iCisJCQkJICIgICBCYXVkICAgICAgICA9JWlcbiIKKwkJCQkgIiAgIEhhbmRzaGFraW5nID0lc1xuIgorCQkJCSAiICAgVHggRGJpdHMgICAgPSVpXG4iCisJCQkJICIgICBSeCBEYml0cyAgICA9JWlcbiIKKwkJCQkgIiAgIFBhcml0eSAgICAgID0lc1xuIgorCQkJCSAiICAgU3RvcCBCaXRzICAgPSVpXG4iLAorCQkJCSBjYXJkLT5kZXZuYW1lLAorCQkJCSBjYXJkLT53YW5kZXYuYnBzLAorCQkJCSBvcHRfZGVjb2RlW2NhcmQtPnUuYy5wcm90b2NvbF9vcHRpb25zXSwKKwkJCQkgY2FyZC0+dS5jLnR4X2JpdHNfcGVyX2NoYXIsCisJCQkJIGNhcmQtPnUuYy5yeF9iaXRzX3Blcl9jaGFyLAorCQkJCSBwX2RlY29kZVtjYXJkLT51LmMucGFyaXR5XSAsCisJCQkJIGNhcmQtPnUuYy5zdG9wX2JpdHMpOworCQl9ZWxzZXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUVFkgU3luYyBDb25maWd1cmF0aW9uOlxuIgorCQkJCSAiICAgQmF1ZCAgICAgICAgPSVpXG4iCisJCQkJICIgICBQcm90b2NvbCAgICA9SERMQ19TVFJFQU1JTkdcbiIsCisJCQkJIGNhcmQtPmRldm5hbWUsY2FyZC0+d2FuZGV2LmJwcyk7CisJCX0KKwkJaWYgKCFlcnIpeworCQkJcG9ydF9zZXRfc3RhdGUoY2FyZCxXQU5fQ09OTkVDVEVEKTsKKwkJfWVsc2V7CisJCQlwb3J0X3NldF9zdGF0ZShjYXJkLFdBTl9ESVNDT05ORUNURUQpOworCQl9CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCkKK3sKKwlzZGxhX3QgKmNhcmQ7CisJdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M9MDsKKworCWlmICghdHR5KXsKKwkJcmV0dXJuOworCX0KKwkKKwljYXJkID0gKHNkbGFfdCAqKXR0eS0+ZHJpdmVyX2RhdGE7CisJCQkKKwlpZiAoIWNhcmQpCisJCXJldHVybjsKKworCWlmIChjYXJkLT53YW5kZXYuc3RhdGUgIT0gV0FOX0NPTk5FQ1RFRCkKKwkJcmV0dXJuOworCisJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpCisJCXM1MDhfbG9jayhjYXJkLCZzbXBfZmxhZ3MpOworCQorCWlmICh0ZXN0X2FuZF9zZXRfYml0KFNFTkRfQ1JJVCwodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpeworCQkKKwkJd2FucGlwZV90dHlfdHJpZ2dlcl90eF9pcnEoY2FyZCk7CisKKwkJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpCisJCQlzNTA4X3VubG9jayhjYXJkLCZzbXBfZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJaWYgKGNoZGxjX3NlbmQoY2FyZCwodm9pZCopJmNoLDEpKXsKKwkJd2FucGlwZV90dHlfdHJpZ2dlcl90eF9pcnEoY2FyZCk7CisJCWRiZ19wcmludGsoIiVzOiBGYWlsZWQgdG8gVFggY2hhciFcbiIsY2FyZC0+ZGV2bmFtZSk7CisJfQorCQorCWRiZ19wcmludGsoIiVzOiBDaGFyIFRYIE9LXG4iLGNhcmQtPmRldm5hbWUpOworCQorCWNsZWFyX2JpdChTRU5EX0NSSVQsKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQorCWlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KQorCQlzNTA4X3VubG9jayhjYXJkLCZzbXBfZmxhZ3MpOworCQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHdhbnBpcGVfdHR5X2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWlmICghdHR5KQorCQlyZXR1cm47CisJCisjaWYgZGVmaW5lZChTRVJJQUxfSEFWRV9QT0xMX1dBSVQpCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPnBvbGxfd2FpdCk7CisjZW5kaWYKKwl0dHlfd2FrZXVwKHR0eSk7CisJcmV0dXJuOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgYSBoaWdoLXByaW9yaXR5IFhPTi9YT0ZGIGNoYXJhY3RlciB0bworICogdGhlIGRldmljZQorICovCitzdGF0aWMgdm9pZCB3YW5waXBlX3R0eV9zZW5kX3hjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgY2gpCit7CisJcmV0dXJuOworfQorCisKK3N0YXRpYyBpbnQgd2FucGlwZV90dHlfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB3YW5waXBlX3R0eV93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc2RsYV90ICpjYXJkOworCisJcHJpbnRrKEtFUk5fSU5GTyAiVFRZIFdyaXRlIFJvb21cbiIpOworCQorCWlmICghdHR5KXsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FyZCA9IChzZGxhX3QgKil0dHktPmRyaXZlcl9kYXRhOworCWlmICghY2FyZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY2FyZC0+d2FuZGV2LnN0YXRlICE9IFdBTl9DT05ORUNURUQpCisJCXJldHVybiAwOworCQorCXJldHVybiBTRUNfTUFYX05PX0RBVEFfQllURVNfSU5fRlJBTUU7Cit9CisKKworc3RhdGljIGludCBzZXRfbW9kZW1fc3RhdHVzKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgY2hhciBkYXRhKQoreworCUNIRExDX01BSUxCT1hfU1RSVUNUICptYiA9IGNhcmQtPm1ib3g7CisJaW50IGVycjsKKworCW1iLT5idWZmZXJfbGVuZ3RoPTE7CisJbWItPmNvbW1hbmQ9U0VUX01PREVNX1NUQVRVUzsKKwltYi0+ZGF0YVswXT1kYXRhOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyICE9IENPTU1BTkRfT0spIAorCQljaGRsY19lcnJvciAoY2FyZCwgZXJyLCBtYik7CisJCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc2RsYV90ICpjYXJkOworCXVuc2lnbmVkIGxvbmcgc21wX2ZsYWdzOworCisJcHJpbnRrKEtFUk5fSU5GTyAiVFRZIEhhbmd1cCFcbiIpOworCQorCWlmICghdHR5KXsKKwkJcmV0dXJuOworCX0KKworCWNhcmQgPSAoc2RsYV90ICopdHR5LT5kcml2ZXJfZGF0YTsKKwlpZiAoIWNhcmQpCisJCXJldHVybjsKKworCWxvY2tfYWRhcHRlcl9pcnEoJmNhcmQtPndhbmRldi5sb2NrLCZzbXBfZmxhZ3MpOworCXNldF9tb2RlbV9zdGF0dXMoY2FyZCwwKTsKKwl1bmxvY2tfYWRhcHRlcl9pcnEoJmNhcmQtPndhbmRldi5sb2NrLCZzbXBfZmxhZ3MpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJyZWFrX3N0YXRlKQoreworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQoreworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgd2FucGlwZV90dHlfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCB3YW5waXBlX3R0eV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQoreworCXJldHVybjsKK30KKworaW50IHdhbnBpcGVfdHR5X3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LAorCQkgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgc2VyaWFsIGRyaXZlciBib290LXRpbWUgaW5pdGlhbGl6YXRpb24gY29kZSEKKyAqLworaW50IHdhbnBpcGVfdHR5X2luaXQoc2RsYV90ICpjYXJkKQoreworCXN0cnVjdCBzZXJpYWxfc3RhdGUgKiBzdGF0ZTsKKwkKKwkvKiBJbml0aWFsaXplIHRoZSB0dHlfZHJpdmVyIHN0cnVjdHVyZSAqLworCisJaWYgKGNhcmQtPnR0eV9taW5vciA8IDAgfHwgY2FyZC0+dHR5X21pbm9yID4gTlJfUE9SVFMpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogSWxsZWdhbCBNaW5vciBUVFkgbnVtYmVyICgwLTQpOiAlaVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLGNhcmQtPnR0eV9taW5vcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChXQU5fQ0FSRChjYXJkLT50dHlfbWlub3IpKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRUWSBNaW5vciAlaSwgYWxyZWFkeSBpbiB1c2VcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSxjYXJkLT50dHlfbWlub3IpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICh0dHlfaW5pdF9jbnQ9PTApeworCQkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRUWSAlcyBEcml2ZXIgSW5pdDogTWFqb3IgJWksIE1pbm9yIFJhbmdlICVpLSVpXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsCisJCQkJY2FyZC0+dS5jLmFzeW5jX21vZGUgPyAiQVNZTkMiIDogIlNZTkMiLAorCQkJCVdBTl9UVFlfTUFKT1IsTUlOX1BPUlQsTUFYX1BPUlQpOworCQkKKwkJdHR5X2RyaXZlcl9tb2RlID0gY2FyZC0+dS5jLmFzeW5jX21vZGU7CisJCQorCQltZW1zZXQoJnNlcmlhbF9kcml2ZXIsIDAsIHNpemVvZihzdHJ1Y3QgdHR5X2RyaXZlcikpOworCQlzZXJpYWxfZHJpdmVyLm1hZ2ljID0gVFRZX0RSSVZFUl9NQUdJQzsKKwkJc2VyaWFsX2RyaXZlci5vd25lciA9IFRISVNfTU9EVUxFOworCQlzZXJpYWxfZHJpdmVyLmRyaXZlcl9uYW1lID0gIndhbnBpcGVfdHR5IjsgCisJCXNlcmlhbF9kcml2ZXIubmFtZSA9ICJ0dHlXIjsKKwkJc2VyaWFsX2RyaXZlci5tYWpvciA9IFdBTl9UVFlfTUFKT1I7CisJCXNlcmlhbF9kcml2ZXIubWlub3Jfc3RhcnQgPSBXQU5fVFRZX01JTk9SOworCQlzZXJpYWxfZHJpdmVyLm51bSA9IE5SX1BPUlRTOyAKKwkJc2VyaWFsX2RyaXZlci50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwkJc2VyaWFsX2RyaXZlci5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCQkKKwkJc2VyaWFsX2RyaXZlci5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJCXNlcmlhbF9kcml2ZXIuaW5pdF90ZXJtaW9zLmNfY2ZsYWcgPQorCQkJQjk2MDAgfCBDUzggfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOworCQlzZXJpYWxfZHJpdmVyLmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKKwkJCisJCXNlcmlhbF9kcml2ZXIucmVmY291bnQgPSAxOwkvKiAhQCFAXiNeJiEhICovCisKKwkJc2VyaWFsX2RyaXZlci5vcGVuID0gd2FucGlwZV90dHlfb3BlbjsKKwkJc2VyaWFsX2RyaXZlci5jbG9zZSA9IHdhbnBpcGVfdHR5X2Nsb3NlOworCQlzZXJpYWxfZHJpdmVyLndyaXRlID0gd2FucGlwZV90dHlfd3JpdGU7CisJCQorCQlzZXJpYWxfZHJpdmVyLnB1dF9jaGFyID0gd2FucGlwZV90dHlfcHV0X2NoYXI7CisJCXNlcmlhbF9kcml2ZXIuZmx1c2hfY2hhcnMgPSB3YW5waXBlX3R0eV9mbHVzaF9jaGFyczsKKwkJc2VyaWFsX2RyaXZlci53cml0ZV9yb29tID0gd2FucGlwZV90dHlfd3JpdGVfcm9vbTsKKwkJc2VyaWFsX2RyaXZlci5jaGFyc19pbl9idWZmZXIgPSB3YW5waXBlX3R0eV9jaGFyc19pbl9idWZmZXI7CisJCXNlcmlhbF9kcml2ZXIuZmx1c2hfYnVmZmVyID0gd2FucGlwZV90dHlfZmx1c2hfYnVmZmVyOworCQkvL3NlcmlhbF9kcml2ZXIuaW9jdGwgPSB3YW5waXBlX3R0eV9pb2N0bDsKKwkJc2VyaWFsX2RyaXZlci50aHJvdHRsZSA9IHdhbnBpcGVfdHR5X3Rocm90dGxlOworCQlzZXJpYWxfZHJpdmVyLnVudGhyb3R0bGUgPSB3YW5waXBlX3R0eV91bnRocm90dGxlOworCQlzZXJpYWxfZHJpdmVyLnNlbmRfeGNoYXIgPSB3YW5waXBlX3R0eV9zZW5kX3hjaGFyOworCQlzZXJpYWxfZHJpdmVyLnNldF90ZXJtaW9zID0gd2FucGlwZV90dHlfc2V0X3Rlcm1pb3M7CisJCXNlcmlhbF9kcml2ZXIuc3RvcCA9IHdhbnBpcGVfdHR5X3N0b3A7CisJCXNlcmlhbF9kcml2ZXIuc3RhcnQgPSB3YW5waXBlX3R0eV9zdGFydDsKKwkJc2VyaWFsX2RyaXZlci5oYW5ndXAgPSB3YW5waXBlX3R0eV9oYW5ndXA7CisJCXNlcmlhbF9kcml2ZXIuYnJlYWtfY3RsID0gd2FucGlwZV90dHlfYnJlYWs7CisJCXNlcmlhbF9kcml2ZXIud2FpdF91bnRpbF9zZW50ID0gd2FucGlwZV90dHlfd2FpdF91bnRpbF9zZW50OworCQlzZXJpYWxfZHJpdmVyLnJlYWRfcHJvYyA9IHdhbnBpcGVfdHR5X3JlYWRfcHJvYzsKKwkJCisJCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKCZzZXJpYWxfZHJpdmVyKSl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIHNlcmlhbCBkcml2ZXIhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJfQorCX0KKworCisJLyogVGhlIHN1YnNlcXVlbnQgcG9ydHMgbXVzdCBjb21wbHkgdG8gdGhlIGluaXRpYWwgY29uZmlndXJhdGlvbiAqLworCWlmICh0dHlfZHJpdmVyX21vZGUgIT0gY2FyZC0+dS5jLmFzeW5jX21vZGUpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRXJyb3I6IFRUWSBEcml2ZXIgb3BlcmF0aW9uIG1vZGUgbWlzbWF0Y2ghXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQlwcmludGsoS0VSTl9JTkZPICIlczogVGhlIFRUWSBkcml2ZXIgaXMgY29uZmlndXJlZCBmb3IgJXMhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIHR0eV9kcml2ZXJfbW9kZSA/ICJBU1lOQyIgOiAiU1lOQyIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJCisJdHR5X2luaXRfY250Kys7CisJCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEluaXRpYWxpemluZyBUVFkgJXMgRHJpdmVyIE1pbm9yICVpXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwKKwkJCXR0eV9kcml2ZXJfbW9kZSA/ICJBU1lOQyIgOiAiU1lOQyIsCisJCQljYXJkLT50dHlfbWlub3IpOworCQorCXR0eV9jYXJkX21hcFtjYXJkLT50dHlfbWlub3JdID0gY2FyZDsKKwlzdGF0ZSA9ICZyc190YWJsZVtjYXJkLT50dHlfbWlub3JdOworCQorCXN0YXRlLT5tYWdpYyA9IFNTVEFURV9NQUdJQzsKKwlzdGF0ZS0+bGluZSA9IDA7CisJc3RhdGUtPnR5cGUgPSBQT1JUX1VOS05PV047CisJc3RhdGUtPmN1c3RvbV9kaXZpc29yID0gMDsKKwlzdGF0ZS0+Y2xvc2VfZGVsYXkgPSA1KkhaLzEwOworCXN0YXRlLT5jbG9zaW5nX3dhaXQgPSAzMCpIWjsKKwlzdGF0ZS0+aWNvdW50LmN0cyA9IHN0YXRlLT5pY291bnQuZHNyID0gCisJCXN0YXRlLT5pY291bnQucm5nID0gc3RhdGUtPmljb3VudC5kY2QgPSAwOworCXN0YXRlLT5pY291bnQucnggPSBzdGF0ZS0+aWNvdW50LnR4ID0gMDsKKwlzdGF0ZS0+aWNvdW50LmZyYW1lID0gc3RhdGUtPmljb3VudC5wYXJpdHkgPSAwOworCXN0YXRlLT5pY291bnQub3ZlcnJ1biA9IHN0YXRlLT5pY291bnQuYnJrID0gMDsKKwlzdGF0ZS0+aXJxID0gY2FyZC0+d2FuZGV2LmlycTsgCisKKwlJTklUX1dPUksoJmNhcmQtPnR0eV93b3JrLCB0dHlfcG9sbF93b3JrLCAodm9pZCopY2FyZCk7CisJcmV0dXJuIDA7Cit9CisKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKioqKioqIEVuZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NkbGFfZnIuYyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhX2ZyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVmY2NiMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhX2ZyLmMKQEAgLTAsMCArMSw1MDY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogc2RsYV9mci5jCVdBTlBJUEUodG0pIE11bHRpcHJvdG9jb2wgV0FOIExpbmsgRHJpdmVyLiBGcmFtZSByZWxheSBtb2R1bGUuCisqCisqIEF1dGhvcihzKToJTmVuYWQgQ29yYmljICA8bmNvcmJpY0BzYW5nb21hLmNvbT4KKyoJCUdpZGVvbiBIYWNrCisqCisqIENvcHlyaWdodDoJKGMpIDE5OTUtMjAwMSBTYW5nb21hIFRlY2hub2xvZ2llcyBJbmMuCisqCisqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIE5vdiAyMywgMjAwMCAgTmVuYWQgQ29yYmljICAgIG8gQWRkZWQgc3VwcG9ydCBmb3IgMi40Llgga2VybmVscworKiBOb3YgMTUsIDIwMDAgIERhdmlkIFJva2F2YXJnICAKKyogICAgICAgICAgICAgICBOZW5hZCBDb3JiaWMJbyBBZGRlZCBmcmFtZSByZWxheSBicmlkZ2luZyBzdXBwb3J0LgorKiAJCQkJICBPcmlnaW5hbCBjb2RlIGZyb20gTWFyayBXZWxscyBhbmQgS3Jpc3RpYW4gSG9mZm1hbm4gaGFzCisqIAkJCQkgIGJlZW4gaW50ZWdyYXRlZCBpbnRvIHRoZSBmcmFtZSByZWxheSBkcml2ZXIuCisqIE5vdiAxMywgMjAwMCAgTmVuYWQgQ29yYmljICAgIG8gQWRkZWQgdHJ1ZSBpbnRlcmZhY2UgdHlwZSBlbmNvZGluZyBvcHRpb24uCisqIAkJCQkgIFRjcGR1bXAgZG9lc24ndCBzdXBwb3J0IEZyYW1lIFJlbGF5IGludGVmYWNlCisqIAkJCQkgIHR5cGVzLCB0byBmaXggdGhpcyB0cnVlIHR5cGUgb3B0aW9uIHdpbGwgc2V0CisqIAkJCQkgIHRoZSBpbnRlcmZhY2UgdHlwZSB0byBSQVcgSVAgbW9kZS4KKyogTm92IDA3LCAyMDAwICBOZW5hZCBDb3JiaWMJbyBBZGRlZCBzZWN1cml0eSBmZWF0dXJlcyBmb3IgVURQIGRlYnVnZ2luZzoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW55IGFsbCBhbmQgc3BlY2lmeSBhbGxvd2VkIHJlcXVlc3RzLgorKiBOb3YgMDYsIDIwMDAgIE5lbmFkIENvcmJpYwlvIFdhbnBpcGUgaW50ZXJmYWNlcyBjb25mb3JtIHRvIHJhdyBwYWNrZXQgaW50ZXJmYWNlcy4gIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmVkIHRoZSBpZl9oZWFkZXIgaW50byB0aGUgaWZfc2VuZCgpIHJvdXRpbmUuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGlmX2hlYWRlcigpIHdhcyBicmVha2luZyB0aGUgbGlicGNhcCAKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LiBpLmUuIHN1cHBvcnQgZm9yIHRjcGR1bXAsIGV0aGVyZWFsIC4uLgorKiBPY3QgMTIuIDIwMDAgIE5lbmFkIENvcmJpYyAgICBvIEFkZGVkIGVycm9yIG1lc3NhZ2UgaW4gZnJfY29uZmlndXJlCisqIEp1bCAzMSwgMjAwMCAgTmVuYWQgQ29yYmljCW8gRml4ZWQgdGhlIFJvdXRlciBVUCBUaW1lLgorKiBBcHIgMjgsIDIwMDAgIE5lbmFkIENvcmJpYwlvIEFkZGVkIHRoZSBvcHRpb24gdG8gc2h1dGRvd24gYW4gaW50ZXJmYWNlCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgY2hhbm5lbCBnZXRzIGRpc2Nvbm5lY3RlZC4KKyogQXByIDI4LCAyMDAwICBOZW5hZCBDb3JiaWMgCW8gQWRkZWQgTS5HcmFudHMgcGF0Y2g6IGRpc2FsbG93IGR1cGxpY2F0ZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSBzZXR1cHMuIAorKiBBcHIgMjUsIDIwMDAgIE5lbmFkIENvcmJpYwlvIEFkZGVkIE0uR3JhbnRzIHBhdGNoOiBkeW5hbWljYWxseSBhZGQvcmVtb3ZlIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBkbGNpcy9pbnRlcmZhY2VzLgorKiBNYXIgMjMsIDIwMDAgIE5lbmFkIENvcmJpYyAJbyBJbXByb3ZlZCB0YXNrIHF1ZXVlLCBiaCBoYW5kbGluZy4KKyogTWFyIDE2LCAyMDAwCU5lbmFkIENvcmJpYwlvIEFkZGVkIEludmVyc2UgQVJQIHN1cHBvcnQKKyogTWFyIDEzLCAyMDAwICBOZW5hZCBDb3JiaWMJbyBBZGRlZCBuZXcgc29ja2V0IEFQSSBzdXBwb3J0LgorKiBNYXIgMDYsIDIwMDAgIE5lbmFkIENvcmJpYwlvIEJ1ZyBGaXg6IGNvcnJ1cHRlZCBtYm94IHJlY292ZXJ5LgorKiBGZWIgMjQsIDIwMDAgIE5lbmFkIENvcmJpYyAgICBvIEZpeGVkIHVwIEZUMSBVRFAgZGVidWdnaW5nIHByb2JsZW0uCisqIERldiAxNSwgMTk5OSAgTmVuYWQgQ29yYmljICAgIG8gRml4ZWQgdXAgaGVhZGVyIGZpbGVzIGZvciAyLjAuWCBrZXJuZWxzCisqCisqIE5vdiAwOCwgMTk5OSAgTmVuYWQgQ29yYmljICAgIG8gQ29tYmluZWQgYWxsIGRlYnVnIFVEUCBjYWxscyBpbnRvIG9uZSBmdW5jdGlvbgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvIFJlbW92ZWQgdGhlIEFSUCBzdXBwb3J0LiBUaGlzIGhhcyB0byBiZSBkb25lCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIG5leHQgdmVyc2lvbi4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBPbmx5IGEgTm9kZSBjYW4gaW1wbGVtZW50IE5PIHNpZ25hbGxpbmcuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdGlhbGl6ZSBETENJIGR1cmluZyBpZl9vcGVuKCkgaWYgTk8gCisqCQkJCSAgc2lnbmFsbGluZy4KKyoJCQkJbyBUb29rIG91dCBJUFggc3VwcG9ydCwgaW1wbGVtZW50IGluIG5leHQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uCisqIFNlcCAyOSwgMTk5OSAgTmVuYWQgQ29yYmljCW8gQWRkZWQgU01QIHN1cHBvcnQgYW5kIGNoYW5nZWQgdGhlIHVwZGF0ZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRvIHVzZSB0aW1lciBpbnRlcnJ1cHQuCisqCQkJCW8gRml4ZWQgdGhlIENJUiBidWc6ICBTZXQgdGhlIHZhbHVlIG9mIEJDCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gQ0lSIHdoZW4gdGhlIENJUiBpcyBlbmFibGVkLgorKiAgCQkJCW8gVXBkYXRlZCBjb21tZW50cywgc3RhdGlzdGljcyBhbmQgdHJhY2luZy4KKyogSnVuIDAyLCAxOTk5CUdpZGVvbiBIYWNrCW8gVXBkYXRlZCBmb3IgUzUxNCBzdXBwb3J0LgorKiBTZXAgMTgsIDE5OTgJSmFzcHJlZXQgU2luZ2gJbyBVcGRhdGVkIGZvciAyLjIuWCBrZXJuZWxzLgorKiBKdWwgMzEsIDE5OTgJSmFzcHJlZXQgU2luZ2gJbyBSZW1vdmVkIHdwZl9wb2xsIHJvdXRpbmUuICBUaGUgY2hhbm5lbC9ETENJIAorKgkJCQkgIHN0YXR1cyBpcyByZWNlaXZlZCB0aHJvdWdoIGFuIGV2ZW50IGludGVycnVwdC4KKyogSnVsIDA4LCAxOTk4CURhdmlkIEZvbmcJbyBBZGRlZCBpbnZlcnNlIEFSUCBzdXBwb3J0LgorKiBNYXIgMjYsIDE5OTcJSmFzcHJlZXQgU2luZ2gJbyBSZXR1cm5pbmcgcmV0dXJuIGNvZGVzIGZvciBmYWlsZWQgVURQIGNtZHMuCisqIEphbiAyOCwgMTk5NwlKYXNwcmVldCBTaW5naCAgbyBJbXByb3ZlZCBoYW5kbGluZyBvZiBpbmFjdGl2ZSBETENJcy4KKyogRGVjIDMwLCAxOTk3CUphc3ByZWV0IFNpbmdoCW8gUmVwbGFjZWQgZGV2X3RpbnQoKSB3aXRoIG1hcmtfYmgoTkVUX0JIKQorKiBEZWMgMTYsIDE5OTcJSmFzcHJlZXQgU2luZ2gJbyBJbXBsZW1lbnRlZCBNdWx0aXBsZSBJUFggc3VwcG9ydC4KKyogTm92IDI2LCAxOTk3CUphc3ByZWV0IFNpbmdoCW8gSW1wcm92ZWQgbG9hZCBzaGFyaW5nIHdpdGggbXVsdGlwbGUgYm9hcmRzCisqCQkJCW8gQWRkZWQgQ2xpKCkgdG8gcHJvdGVjdCBlbmFibGluZyBvZiBpbnRlcnJ1cHRzCisqCQkJCSAgd2hpbGUgcG9sbGluZyBpcyBjYWxsZWQuCisqIE5vdiAyNCwgMTk5NwlKYXNwcmVldCBTaW5naAlvIEFkZGVkIGNvdW50ZXJzIHRvIGF2b2lkIGVuYWJsaW5nIG9mIGludGVycnVwdHMKKyoJCQkJICB3aGVuIHRoZXkgaGF2ZSBiZWVuIGRpc2FibGVkIGJ5IGFub3RoZXIKKyoJCQkJICBpbnRlcmZhY2Ugb3Igcm91dGluZSAoZWcuIHdwZl9wb2xsKS4KKyogTm92IDA2LCAxOTk3CUphc3ByZWV0IFNpbmdoCW8gQWRkZWQgSU5UUl9URVNUX01PREUgdG8gYXZvaWQgcG9sbGluZwkKKyoJCQkJICByb3V0aW5lIGRpc2FibGUgaW50ZXJydXB0cyBkdXJpbmcgaW50ZXJydXB0CisqCQkJCSAgdGVzdGluZy4KKyogT2N0IDIwLCAxOTk3ICBKYXNwcmVldCBTaW5naCAgbyBBZGRlZCBob29rcyBpbiBmb3IgUm91dGVyIFVQIHRpbWUuCisqIE9jdCAxNiwgMTk5NyAgSmFzcHJlZXQgU2luZ2ggIG8gVGhlIGNyaXRpY2FsIGZsYWcgaXMgdXNlZCB0byBtYWludGFpbiBmbG93CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCBieSBhdm9pZGluZyBSQUNFIGNvbmRpdGlvbnMuICBUaGUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGkoKSBhbmQgcmVzdG9yZV9mbGFncygpIGFyZSB0YWtlbiBvdXQuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZyX2NoYW5uZWwgc3RydWN0dXJlIGlzIGFwcGVuZGVkIGZvciAKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXIgU3RhdGlzdGljcy4KKyogT2N0IDE1LCAxOTk3ICBGYXJoYW4gVGhhd2FyICAgIG8gdXBkYXRlZCBpZl9zZW5kKCkgYW5kIHJlY2VpdmUgZm9yIElQWAorKiBBdWcgMjksIDE5OTcgIEZhcmhhbiBUaGF3YXIgICAgbyBSZW1vdmVkIG1vc3Qgb2YgdGhlIGNsaSgpIGFuZCBzdGkoKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBBYnN0cmFjdGVkIHRoZSBVRFAgbWFuYWdlbWVudCBzdHVmZgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBOb3cgdXNlIHRidXN5IGFuZCBjcml0aWNhbCBtb3JlIGludGVsbGlnZW50bHkKKyogSnVsIDIxLCAxOTk3ICBKYXNwcmVldCBTaW5naAkgbyBDYW4gY29uZmlndXJlIFQzOTEsIFQzOTIsIE4zOTEsIE4zOTIgJiBOMzkzCisqCQkJCSAgIHRocm91Z2ggcm91dGVyLmNvbmYuCisqCQkJCSBvIFByb3RlY3RlZCBjYWxscyB0byBzZGxhX3BlZWsoKSBieSBhZERpbmcgCisqCQkJCSAgIHNhdmVfZmxhZ3MoKSwgY2xpKCkgYW5kIHJlc3RvcmVfZmxhZ3MoKS4KKyoJCQkJIG8gQWRkZWQgZXJyb3IgbWVzc2FnZSBmb3IgSW5hY3RpdmUgRExDSXMgaW4KKyoJCQkJICAgZnJfZXZlbnQoKSBhbmQgdXBkYXRlX2NoYW5fc3RhdGUoKS4KKyoJCQkJIG8gRml4ZWQgZnJlZWluZyB1cCBvZiBidWZmZXJzIHVzaW5nIGtmcmVlKCkgCisqCQkJICAgICAgICAgICB3aGVuIHBhY2tldHMgYXJlIHJlY2VpdmVkLgorKiBKdWwgMDcsIDE5OTcJSmFzcHJlZXQgU2luZ2gJIG8gQWRkZWQgY29uZmlndXJhYmxlIFRUTCBmb3IgVURQIHBhY2tldHMgCisqCQkJCSBvIEFkZGVkIGFiaWxpdHkgdG8gZGlzY2FyZCBtdWx0aWNhc3QgYW5kIAorKgkJCQkgICBicm9hZGNhc3Qgc291cmNlIGFkZHJlc3NlZCBwYWNrZXRzCisqIEp1biAyNywgMTk5NwlKYXNwcmVldCBTaW5naAkgbyBBZGRlZCBGVDEgbW9uaXRvciBjYXBhYmlsaXRpZXMgCisqCQkJCSAgIE5ldyBjYXNlICgweDQ0KSBzdGF0ZW1lbnQgaW4gaWZfc2VuZCByb3V0aW5lIAorKgkJCQkgICBBZGRlZCBhIGdsb2JhbCB2YXJpYWJsZSByQ291bnQgdG8ga2VlcCB0cmFjaworKgkJCSAJICAgb2YgRlQxIHN0YXR1cyBlbmFibGVkIG9uIHRoZSBib2FyZC4KKyogTWF5IDI5LCAxOTk3CUphc3ByZWV0IFNpbmdoCSBvIEZpeGVkIG1ham9yIEZsb3cgQ29udHJvbCBQcm9ibGVtCisqCQkJCSAgIFdpdGggbXVsdGlwbGUgYm9hcmRzIGEgcHJvYmxlbSB3YXMgc2VlbiB3aGVyZQorKgkJCQkgICB0aGUgc2Vjb25kIGJvYXJkIGFsd2F5cyBzdG9wcGVkIHRyYW5zbWl0dGluZworKgkJCQkgICBwYWNrZXQgYWZ0ZXIgcnVubmluZyBmb3IgYSB3aGlsZS4gVGhlIGNvZGUKKyoJCQkJICAgZ290IGludG8gYSBzdGFnZSB3aGVyZSB0aGUgaW50ZXJydXB0cyB3ZXJlCisqCQkJCSAgIGRpc2FibGVkIGFuZCBkZXYtPnRidXN5IHdhcyBzZXQgdG8gMS4KKyogICAgICAgICAgICAgICAgICAJCSAgIFRoaXMgY2F1c2VkIHRoZSBJZl9zZW5kKCkgcm91dGluZSB0byBnZXQgaW50bworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaWYgY2xhdXNlIGZvciBpdCgwLGRldi0+dGJ1c3kpIAorKgkJCQkgICBmb3JldmVyLgorKgkJCQkgICBUaGUgY29kZSBnb3QgaW50byB0aGlzIHN0YWdlIGR1ZSB0byBhbiAKKyoJCQkJICAgaW50ZXJydXB0IG9jY3VycmluZyB3aXRoaW4gdGhlIGlmIGNsYXVzZSBmb3IgCisqCQkJCSAgIHNldF9iaXQoMCxkZXYtPnRidXN5KS4gIFNpbmNlIGFuIGludGVycnVwdCAKKyoJCQkJICAgZGlzYWJsZXMgZnVyaHRlciB0cmFuc21pdCBpbnRlcnJ1cHQgYW5kIAorKiAJCQkJICAgbWFrZXMgZGV2LT50YnVzeSA9IDAsIHRoaXMgZWZmZWN0IHdhcyB1bmRvbmUgCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IG1ha2luZyBkZXYtPnRidXN5ID0gMSBpbiB0aGUgaWYgY2xhdXNlLgorKgkJCQkgICBUaGUgRml4IGNoZWNrcyB0byBzZWUgaWYgVHJhbnNtaXQgaW50ZXJydXB0cworKgkJCQkgICBhcmUgZGlzYWJsZWQgdGhlbiBkbyBub3QgbWFrZSBkZXYtPnRidXN5ID0gMQorKiAJICAgCQkJICAgSW50cm9kdWNlZCBhIGdsb2JhbCB2YXJpYWJsZTogaW50X29jY3VyIGFuZAorKgkJCQkgICBhZGRlZCB0eF9pbnRfZW5hYmxlZCBpbiB0aGUgd2FuX2RldmljZSAKKyoJCQkJICAgc3RydWN0dXJlLgkKKyogTWF5IDIxLCAxOTk3ICBKYXNwcmVldCBTaW5naCAgIG8gRml4ZWQgVURQIE1hbmFnZW1lbnQgZm9yIG11bHRpcGxlCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkcy4KKyoKKyogQXByIDI1LCAxOTk3ICBGYXJoYW4gVGhhd2FyICAgIG8gYWRkZWQgVURQIE1hbmFnZW1lbnQgc3R1ZmYKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gZml4ZWQgYnVnIGluIGlmX3NlbmQoKSBhbmQgdHhfaW50cigpIHRvCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwIGFuZCB3YWtldXAgYWxsIGRldmljZXMKKyogTWFyIDExLCAxOTk3ICBGYXJoYW4gVGhhd2FyICAgVmVyc2lvbiAzLjEuMQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBmaXhlZCAoKzEpIGJ1ZyBpbiBmcjUwOF9yeF9pbnRyKCkKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gY2hhbmdlZCBpZl9zZW5kKCkgdG8gcmV0dXJuIDAgaWYKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FuZGV2LmNyaXRpY2FsKCkgaXMgdHJ1ZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBmcmVlIHNvY2tldCBidWZmZXIgaW4gaWZfc2VuZCgpIGlmCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAwIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBhZGRlZCB0eF9pbnRyKCkgcm91dGluZQorKiBKYW4gMzAsIDE5OTcJR2VuZSBLb3ppbglWZXJzaW9uIDMuMS4wCisqCQkJCSBvIGltcGxlbWVudGVkIGV4ZWMoKSBlbnRyeSBwb2ludAorKgkJCQkgbyBmaXhlZCBhIGJ1ZyBjYXVzaW5nIGRyaXZlciBjb25maWd1cmVkIGFzCisqCQkJCSAgIGEgRlIgc3dpdGNoIHRvIGJlIHN0dWNrIGluIFdBTl8KKyoJCQkJICAgbW9kZQorKiBKYW4gMDIsIDE5OTcJR2VuZSBLb3ppbglJbml0aWFsIHZlcnNpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkvKiBwcmludGsoKSwgYW5kIG90aGVyIHVzZWZ1bCBzdHVmZiAqLworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgkvKiBvZmZzZXRvZigpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4JLyogcmV0dXJuIGNvZGVzICovCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CS8qIGlubGluZSBtZW1zZXQoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4JLyoga21hbGxvYygpLCBrZnJlZSgpICovCisjaW5jbHVkZSA8bGludXgvd2Fucm91dGVyLmg+CS8qIFdBTiByb3V0ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC93YW5waXBlLmg+CS8qIFdBTlBJUEUgY29tbW9uIHVzZXIgQVBJIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CS8qIEFSUEhSRF8qIGRlZmluZXMgKi8KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CS8qIGh0b25zKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxhc20vaW8uaD4JCS8qIGZvciBpbmIoKSwgb3V0YigpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgkgCS8qIGZvciBkb19nZXR0aW1lb2ZkYXkgKi8JCisjaW5jbHVkZSA8bGludXgvaW4uaD4JCS8qIHNvY2thZGRyX2luICovCisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pZl93YW5waXBlX2NvbW1vbi5oPgkvKiBXYW5waXBlIFNvY2tldCAqLworI2luY2x1ZGUgPGxpbnV4L2lmX3dhbnBpcGUuaD4JCisKKyNpbmNsdWRlIDxsaW51eC9zZGxhX2ZyLmg+CQkvKiBmcmFtZSByZWxheSBmaXJtd2FyZSBBUEkgZGVmaW5pdGlvbnMgKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+ICAgICAgICAgIAkvKiBEeW5hbWljIFJvdXRlIENyZWF0aW9uICovCisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4JCS8qIGV0aF90eXBlX3RyYW5zKCkgdXNlZCBmb3IgYnJpZGdpbmcgKi8KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKworLyoqKioqKiBEZWZpbmVzICYgTWFjcm9zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUJTUFYX0NNRF9SRVRSWQkxMAkJLyogbWF4IG51bWJlciBvZiBmaXJtd2FyZSByZXRyaWVzICovCisKKyNkZWZpbmUJRlJfSEVBREVSX0xFTgk4CQkvKiBtYXggZW5jYXBzdWxhdGlvbiBoZWFkZXIgc2l6ZSAqLworI2RlZmluZQlGUl9DSEFOTkVMX01UVQkxNTAwCQkvKiB1bmZyYWdtZW50ZWQgbG9naWNhbCBjaGFubmVsIE1UVSAqLworCisvKiBRLjkyMiBmcmFtZSB0eXBlcyAqLworI2RlZmluZQlROTIyX1VJCQkweDAzCQkvKiBVbm51bWJlcmVkIEluZm8gZnJhbWUgKi8KKyNkZWZpbmUJUTkyMl9YSUQJMHhBRgkJCisKKy8qIERMQ0kgY29uZmlndXJlZCBvciBub3QgKi8KKyNkZWZpbmUgRExDSV9OT1RfQ09ORklHVVJFRAkweDAwCisjZGVmaW5lIERMQ0lfQ09ORklHX1BFTkRJTkcJMHgwMQorI2RlZmluZSBETENJX0NPTkZJR1VSRUQJCTB4MDIKKworLyogQ0lSIGVuYWJsZWQgb3Igbm90ICovCisjZGVmaW5lIENJUl9FTkFCTEVECTB4MDAKKyNkZWZpbmUgQ0lSX0RJU0FCTEVECTB4MDEKKworI2RlZmluZSBGUkFNRV9SRUxBWV9BUEkgMQorI2RlZmluZSBNQVhfQkhfQlVGRgkxMAorCisvKiBGb3IgaGFuZGxlX0lQWFdBTigpICovCisjZGVmaW5lIENWSGV4VG9Bc2NpaShiKSAoKCh1bnNpZ25lZCBjaGFyKShiKSA+ICh1bnNpZ25lZCBjaGFyKTkpID8gKCh1bnNpZ25lZCBjaGFyKSdBJyArICgodW5zaWduZWQgY2hhcikoYikgLSAodW5zaWduZWQgY2hhcikxMCkpIDogKCh1bnNpZ25lZCBjaGFyKScwJyArICh1bnNpZ25lZCBjaGFyKShiKSkpCisgCisvKioqKioqIERhdGEgU3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyBpcyBhbiBleHRlbnRpb24gb2YgdGhlICdzdHJ1Y3QgZGV2aWNlJyB3ZSBjcmVhdGUgZm9yIGVhY2ggbmV0d29yaworICogaW50ZXJmYWNlIHRvIGtlZXAgdGhlIHJlc3Qgb2YgY2hhbm5lbC1zcGVjaWZpYyBkYXRhLgorICovCit0eXBlZGVmIHN0cnVjdCBmcl9jaGFubmVsCit7CisJd2FucGlwZV9jb21tb25fdCBjb21tb247CisJY2hhciBuYW1lW1dBTl9JRk5BTUVfU1orMV07CS8qIGludGVyZmFjZSBuYW1lLCBBU0NJSVogKi8KKwl1bnNpZ25lZCBkbGNpX2NvbmZpZ3VyZWQgIDsJLyogY2hlY2sgd2hldGhlciBjb25maWd1cmVkIG9yIG5vdCAqLworCXVuc2lnbmVkIGNpcl9zdGF0dXM7CQkvKiBjaGVjayB3aGV0aGVyIENJUiBlbmFibGVkIG9yIG5vdCAqLworCXVuc2lnbmVkIGRsY2k7CQkJLyogbG9naWNhbCBjaGFubmVsIG51bWJlciAqLworCXVuc2lnbmVkIGNpcjsJCQkvKiBjb21taXR0ZWQgaW5mb3JtYXRpb24gcmF0ZSAqLworCXVuc2lnbmVkIGJjOwkJCS8qIGNvbW1pdHRlZCBidXJzdCBzaXplICovCisJdW5zaWduZWQgYmU7CQkJLyogZXhjZXNzIGJ1cnN0IHNpemUgKi8KKwl1bnNpZ25lZCBtYzsJCQkvKiBtdWx0aWNhc3Qgc3VwcG9ydCBvbiBvciBvZmYgKi8KKwl1bnNpZ25lZCB0eF9pbnRfc3RhdHVzOwkJLyogVHJhbnNtaXQgSW50ZXJydXB0IFN0YXR1cyAqLwkKKwl1bnNpZ25lZCBzaG9ydCBwa3RfbGVuZ3RoOwkvKiBQYWNrZXQgTGVuZ3RoICovCisJdW5zaWduZWQgbG9uZyByb3V0ZXJfc3RhcnRfdGltZTsvKiBSb3V0ZXIgc3RhcnQgdGltZSBpbiBzZWNvbmRzICovCisJdW5zaWduZWQgbG9uZyB0aWNrX2NvdW50ZXI7CS8qIGNvdW50ZXIgZm9yIHRyYW5zbWl0IHRpbWUgb3V0ICovCisJY2hhciBkZXZfcGVuZGluZ19kZXZ0aW50OwkvKiBpbnRlcmZhY2UgcGVuZGluZyBkZXZfdGludCgpICovCisJdm9pZCAqZGxjaV9pbnRfaW50ZXJmYWNlOwkvKiBwb2ludGVyIHRvIHRoZSBETENJIEludGVyZmFjZSAqLyAKKwl1bnNpZ25lZCBsb25nIElCX2FkZHI7CQkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIEludGVyZmFjZSBCeXRlICovCisJdW5zaWduZWQgbG9uZyBzdGF0ZV90aWNrOwkvKiB0aW1lIG9mIHRoZSBsYXN0IHN0YXRlIGNoYW5nZSAqLworCXVuc2lnbmVkIGNoYXIgZW5hYmxlX0lQWDsJLyogRW5hYmxlL0Rpc2FibGUgdGhlIHVzZSBvZiBJUFggKi8KKwl1bnNpZ25lZCBsb25nIG5ldHdvcmtfbnVtYmVyOwkvKiBJbnRlcm5hbCBOZXR3b3JrIE51bWJlciBmb3IgSVBYKi8KKwlzZGxhX3QgKmNhcmQ7CQkJLyogLT4gb3duZXIgKi8KKwl1bnNpZ25lZCByb3V0ZV9mbGFnOwkJLyogQWRkL1JlbSBkZXN0IGFkZHIgaW4gcm91dGUgdGFibGVzICovCisJdW5zaWduZWQgaW5hcnA7CQkJLyogSW52ZXJzZSBBcnAgUmVxdWVzdCBzdGF0dXMgKi8gCisJbG9uZyBpbmFycF9yZWFkeTsJCS8qIFJlYWR5IHRvIHNlbmQgcmVxdWVzdHMgKi8KKwlpbnQgaW5hcnBfaW50ZXJ2YWw7CQkvKiBUaW1lIGJldHdlZW4gSW5BcnAgUmVxdWVzdHMgKi8KKwl1bnNpZ25lZCBsb25nIGluYXJwX3RpY2s7CS8qIEluQXJwIGppZmZpZXMgdGljayBjb3VudGVyICovCisJbG9uZyBpbnRlcmZhY2VfZG93bjsJCS8qIEJyaW5nIGludGVyZmFjZSBkb3duIG9uIGRpc2Nvbm5lY3QgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBpZnN0YXRzOwkvKiBpbnRlcmZhY2Ugc3RhdGlzdGljcyAqLworCWlmX3NlbmRfc3RhdF90IGRydnN0YXRzX2lmX3NlbmQ7CisgICAgICAgIHJ4X2ludHJfc3RhdF90IGRydnN0YXRzX3J4X2ludHI7CisgICAgICAgIHBpcGVfbWdtdF9zdGF0X3QgZHJ2c3RhdHNfZ2VuOworCXVuc2lnbmVkIGxvbmcgcm91dGVyX3VwX3RpbWU7CisKKwl1bnNpZ25lZCBzaG9ydCB0cmFuc21pdF9sZW5ndGg7CisJc3RydWN0IHNrX2J1ZmYgKmRlbGF5X3NrYjsKKworCWJoX2RhdGFfdCAqYmhfaGVhZDsJICAJICAvKiBDaXJjdWxhciBidWZmZXIgZm9yIGNoZGxjX2JoICovCisJdW5zaWduZWQgbG9uZyAgdHFfd29ya2luZzsKKwl2b2xhdGlsZSBpbnQgIGJoX3dyaXRlOworCXZvbGF0aWxlIGludCAgYmhfcmVhZDsKKwlhdG9taWNfdCAgYmhfYnVmZl91c2VkOworCisJLyogUG9sbGluZyB0YXNrIHF1ZXVlLiBFYWNoIGludGVyZmFjZQorICAgICAgICAgKiBoYXMgaXRzIG93biB0YXNrIHF1ZXVlLCB3aGljaCBpcyB1c2VkCisgICAgICAgICAqIHRvIGRlZmVyIGV2ZW50cyBmcm9tIHRoZSBpbnRlcnJ1cHQgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZnJfcG9sbF93b3JrOworCXN0cnVjdCB0aW1lcl9saXN0IGZyX2FycF90aW1lcjsKKworCXUzMiBpcF9sb2NhbDsKKwl1MzIgaXBfcmVtb3RlOworCWxvbmcgY29uZmlnX2RsY2k7CisJbG9uZyB1bmNvbmZpZ19kbGNpOworCisJLyogV2hldGhlciB0aGlzIGludGVyZmFjZSBzaG91bGQgYmUgc2V0dXAgYXMgYSBnYXRld2F5LgorCSAqIFVzZWQgYnkgZHluYW1pYyByb3V0ZSBzZXR1cCBjb2RlICovCisJdTggIGdhdGV3YXk7CisKKwkvKiBUcnVlIGludGVyZmFjZSB0eXBlICovCisJdTggdHJ1ZV9pZl9lbmNvZGluZzsKKwl1OCBmcl9oZWFkZXJbRlJfSEVBREVSX0xFTl07CisJY2hhciBmcl9oZWFkZXJfbGVuOworCit9IGZyX2NoYW5uZWxfdDsKKworLyogUm91dGUgRmxhZyBvcHRpb25zICovCisjZGVmaW5lIE5PX1JPVVRFCTB4MDAKKyNkZWZpbmUgQUREX1JPVVRFIAkweDAxCisjZGVmaW5lIFJPVVRFX0FEREVECTB4MDIKKyNkZWZpbmUgUkVNT1ZFX1JPVVRFIAkweDAzCisjZGVmaW5lIEFSUF9SRVEJCTB4MDQKKworLyogaW5hcnAgb3B0aW9ucyAqLworI2RlZmluZSBJTkFSUF9OT05FCQkweDAwCisjZGVmaW5lIElOQVJQX1JFUVVFU1QJCTB4MDEKKyNkZWZpbmUgSU5BUlBfQ09ORklHVVJFRAkweDAyCisKKy8qIHJlYXNvbnMgZm9yIGVuYWJsaW5nIHRoZSB0aW1lciBpbnRlcnJ1cHQgb24gdGhlIGFkYXB0ZXIgKi8KKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX1VEUCAgIAkweDAxCisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9VUERBVEUgCTB4MDIKKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX0FSUAkweDA0CisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9VUERBVEVfU1RBVEUgCTB4MDgKKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX0NPTkZJRwkweDEwCisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9VTkNPTkZJRwkweDIwCisKKwordHlwZWRlZiBzdHJ1Y3QgZGxjaV9zdGF0dXMKK3sKKwl1bnNpZ25lZCBzaG9ydCBkbGNpCVBBQ0tFRDsKKwl1bnNpZ25lZCBjaGFyIHN0YXRlCVBBQ0tFRDsKK30gZGxjaV9zdGF0dXNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZGxjaV9JQl9tYXBwaW5nCit7CisJdW5zaWduZWQgc2hvcnQgZGxjaQkJUEFDS0VEOworCXVuc2lnbmVkIGxvbmcgIGFkZHJfdmFsdWUJUEFDS0VEOworfSBkbGNpX0lCX21hcHBpbmdfdDsKKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgRExDSSBsaXN0IFR4IGludGVycnVwdCBtb2RlLiAgSXQgaXMgdXNlZCB0bworICAgZW5hYmxlIGludGVycnVwdCBiaXQgYW5kIHNldCB0aGUgcGFja2V0IGxlbmd0aCBmb3IgdHJhbnNtaXNzaW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IGZyX2RsY2lfaW50ZXJmYWNlIAoreworCXVuc2lnbmVkIGNoYXIgZ2VuX2ludGVycnVwdAlQQUNLRUQ7CisJdW5zaWduZWQgc2hvcnQgcGFja2V0X2xlbmd0aAlQQUNLRUQ7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZAkJUEFDS0VEOworfSBmcl9kbGNpX2ludGVyZmFjZV90OyAKKworLyogdmFyaWFibGUgZm9yIGtlZXBpbmcgdHJhY2sgb2YgZW5hYmxpbmcvZGlzYWJsaW5nIEZUMSBtb25pdG9yIHN0YXR1cyAqLworc3RhdGljIGludCByQ291bnQgPSAwOworCitleHRlcm4gdm9pZCBkaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQpOworCisvKiB2YXJpYWJsZSBmb3Iga2VlcGluZyB0cmFjayBvZiBudW1iZXIgb2YgaW50ZXJydXB0cyBnZW5lcmF0ZWQgZHVyaW5nIAorICogaW50ZXJydXB0IHRlc3Qgcm91dGluZSAKKyAqLworc3RhdGljIGludCBJbnRyX3Rlc3RfY291bnRlcjsKKworLyoqKioqKiBGdW5jdGlvbiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFdBTiBsaW5rIGRyaXZlciBlbnRyeSBwb2ludHMuIFRoZXNlIGFyZSBjYWxsZWQgYnkgdGhlIFdBTiByb3V0ZXIgbW9kdWxlLiAqLworc3RhdGljIGludCB1cGRhdGUoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldik7CitzdGF0aWMgaW50IG5ld19pZihzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgIHdhbmlmX2NvbmZfdCAqY29uZik7CitzdGF0aWMgaW50IGRlbF9pZihzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGRpc2FibGVfY29tbSAoc2RsYV90ICpjYXJkKTsKKworLyogV0FOUElQRS1zcGVjaWZpYyBlbnRyeSBwb2ludHMgKi8KK3N0YXRpYyBpbnQgd3BmX2V4ZWMoc3RydWN0IHNkbGEgKmNhcmQsIHZvaWQgKnVfY21kLCB2b2lkICp1X2RhdGEpOworCisvKiBOZXR3b3JrIGRldmljZSBpbnRlcmZhY2UgKi8KK3N0YXRpYyBpbnQgaWZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaWZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaWZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyB2b2lkIGlmX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBpbnQgaWZfcmVidWlsZF9oZHIgKHN0cnVjdCBza19idWZmICpza2IpOworCitzdGF0aWMgaW50IGlmX3NlbmQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGNoa19iY2FzdF9tY2FzdF9hZGRyKHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlmX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBJbnRlcnJ1cHQgaGFuZGxlcnMgKi8KK3N0YXRpYyB2b2lkIGZyX2lzcihzZGxhX3QgKmNhcmQpOworc3RhdGljIHZvaWQgcnhfaW50cihzZGxhX3QgKmNhcmQpOworc3RhdGljIHZvaWQgdHhfaW50cihzZGxhX3QgKmNhcmQpOworc3RhdGljIHZvaWQgdGltZXJfaW50cihzZGxhX3QgKmNhcmQpOworc3RhdGljIHZvaWQgc3B1cl9pbnRyKHNkbGFfdCAqY2FyZCk7CisKKy8qIEZyYW1lIHJlbGF5IGZpcm13YXJlIGludGVyZmFjZSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgZnJfcmVhZF92ZXJzaW9uKHNkbGFfdCAqY2FyZCwgY2hhciAqc3RyKTsKK3N0YXRpYyBpbnQgZnJfY29uZmlndXJlKHNkbGFfdCAqY2FyZCwgZnJfY29uZl90ICpjb25mKTsKK3N0YXRpYyBpbnQgZnJfZGxjaV9jb25maWd1cmUoc2RsYV90ICpjYXJkLCBmcl9kbGNfY29uZl90ICpjb25mLCB1bnNpZ25lZCBkbGNpKTsKK3N0YXRpYyBpbnQgZnJfaW5pdF9kbGNpIChzZGxhX3QgKmNhcmQsIGZyX2NoYW5uZWxfdCAqY2hhbik7CitzdGF0aWMgaW50IGZyX3NldF9pbnRyX21vZGUgKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbW9kZSwgdW5zaWduZWQgbXR1LCB1bnNpZ25lZCBzaG9ydCB0aW1lb3V0KTsKK3N0YXRpYyBpbnQgZnJfY29tbV9lbmFibGUoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIGZyX2NvbW1fZGlzYWJsZShzZGxhX3QgKmNhcmQpOworc3RhdGljIGludCBmcl9nZXRfZXJyX3N0YXRzKHNkbGFfdCAqY2FyZCk7CitzdGF0aWMgaW50IGZyX2dldF9zdGF0cyhzZGxhX3QgKmNhcmQpOworc3RhdGljIGludCBmcl9hZGRfZGxjaShzZGxhX3QgKmNhcmQsIGludCBkbGNpKTsKK3N0YXRpYyBpbnQgZnJfYWN0aXZhdGVfZGxjaShzZGxhX3QgKmNhcmQsIGludCBkbGNpKTsKK3N0YXRpYyBpbnQgZnJfZGVsZXRlX2RsY2kgKHNkbGFfdCogY2FyZCwgaW50IGRsY2kpOworc3RhdGljIGludCBmcl9pc3N1ZV9pc2Yoc2RsYV90ICpjYXJkLCBpbnQgaXNmKTsKK3N0YXRpYyBpbnQgZnJfc2VuZChzZGxhX3QgKmNhcmQsIGludCBkbGNpLCB1bnNpZ25lZCBjaGFyIGF0dHIsIGludCBsZW4sCisJdm9pZCAqYnVmKTsKK3N0YXRpYyBpbnQgZnJfc2VuZF9kYXRhX2hlYWRlcihzZGxhX3QgKmNhcmQsIGludCBkbGNpLCB1bnNpZ25lZCBjaGFyIGF0dHIsIGludCBsZW4sCisJdm9pZCAqYnVmLHVuc2lnbmVkIGNoYXIgaGRyX2xlbik7CitzdGF0aWMgdW5zaWduZWQgaW50IGZyX3NlbmRfaGRyKHNkbGFfdCAqY2FyZCwgaW50IGRsY2ksIHVuc2lnbmVkIGludCBvZmZzZXQpOworCitzdGF0aWMgaW50IGNoZWNrX2RsY2lfY29uZmlnIChzZGxhX3QgKmNhcmQsIGZyX2NoYW5uZWxfdCAqY2hhbik7CitzdGF0aWMgdm9pZCBpbml0aWFsaXplX3J4X3R4X2J1ZmZlcnMgKHNkbGFfdCAqY2FyZCk7CisKKworLyogRmlybXdhcmUgYXN5bmNocm9ub3VzIGV2ZW50IGhhbmRsZXJzICovCitzdGF0aWMgaW50IGZyX2V2ZW50KHNkbGFfdCAqY2FyZCwgaW50IGV2ZW50LCBmcl9tYm94X3QgKm1ib3gpOworc3RhdGljIGludCBmcl9tb2RlbV9mYWlsdXJlKHNkbGFfdCAqY2FyZCwgZnJfbWJveF90ICptYm94KTsKK3N0YXRpYyBpbnQgZnJfZGxjaV9jaGFuZ2Uoc2RsYV90ICpjYXJkLCBmcl9tYm94X3QgKm1ib3gpOworCisvKiBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCB1cGRhdGVfY2hhbl9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9jaGFuX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdGF0ZSk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmZpbmRfY2hhbm5lbChzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGRsY2kpOworc3RhdGljIGludCBpc190eF9yZWFkeShzZGxhX3QgKmNhcmQsIGZyX2NoYW5uZWxfdCAqY2hhbik7CitzdGF0aWMgdW5zaWduZWQgaW50IGRlY190b191aW50KHVuc2lnbmVkIGNoYXIgKnN0ciwgaW50IGxlbik7CitzdGF0aWMgaW50IHJlcGx5X3VkcCggdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IG1ib3hfbGVuICk7CisKK3N0YXRpYyBpbnQgaW50cl90ZXN0KCBzZGxhX3QqIGNhcmQgKTsKK3N0YXRpYyB2b2lkIGluaXRfY2hhbl9zdGF0aXN0aWNzKCBmcl9jaGFubmVsX3QqIGNoYW4gKTsKK3N0YXRpYyB2b2lkIGluaXRfZ2xvYmFsX3N0YXRpc3RpY3MoIHNkbGFfdCogY2FyZCApOworc3RhdGljIHZvaWQgcmVhZF9ETENJX0lCX21hcHBpbmcoIHNkbGFfdCogY2FyZCwgZnJfY2hhbm5lbF90KiBjaGFuICk7CitzdGF0aWMgaW50IHNldHVwX2Zvcl9kZWxheWVkX3RyYW5zbWl0KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKK3N0cnVjdCBuZXRfZGV2aWNlICptb3ZlX2Rldl90b19uZXh0KHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGNoZWNrX3R4X3N0YXR1cyhzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBGcmFtZSBSZWxheSBTb2NrZXQgQVBJICovCitzdGF0aWMgdm9pZCB0cmlnZ2VyX2ZyX2JoIChmcl9jaGFubmVsX3QgKik7CitzdGF0aWMgdm9pZCBmcl9iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgZnJfYmhfY2xlYW51cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYmhfZW5xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworc3RhdGljIHZvaWQgdHJpZ2dlcl9mcl9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZnJfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8vc3RhdGljIHZvaWQgYWRkX2dhdGV3YXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyB2b2lkIHRyaWdnZXJfdW5jb25maWdfZnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB1bmNvbmZpZ19mciAoc2RsYV90ICopOworCitzdGF0aWMgdm9pZCB0cmlnZ2VyX2NvbmZpZ19mciAoc2RsYV90ICopOworc3RhdGljIHZvaWQgY29uZmlnX2ZyIChzZGxhX3QgKik7CisKKworLyogSW52ZXJzZSBBUlAgYW5kIER5bmFtaWMgcm91dGluZyBmdW5jdGlvbnMgKi8KK2ludCBwcm9jZXNzX0FSUChhcnBoZHJfMTQ5MF90ICpBcnBQYWNrZXQsIHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgaXNfYXJwKHZvaWQgKmJ1Zik7CitpbnQgc2VuZF9pbmFycF9yZXF1ZXN0KHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyB2b2lkIHRyaWdnZXJfZnJfYXJwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgZnJfYXJwICh1bnNpZ25lZCBsb25nIGRhdGEpOworCisKKy8qIFVkcCBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBwcm9jZXNzX3VkcF9tZ210X3BrdChzZGxhX3QgKmNhcmQpOworc3RhdGljIGludCB1ZHBfcGt0X3R5cGUoIHN0cnVjdCBza19idWZmICpza2IsIHNkbGFfdCAqY2FyZCApOworc3RhdGljIGludCBzdG9yZV91ZHBfbWdtdF9wa3QoaW50IHVkcF90eXBlLCBjaGFyIHVkcF9wa3Rfc3JjLCBzZGxhX3QqIGNhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGludCBkbGNpKTsKKworLyogSVBYIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgc3dpdGNoX25ldF9udW1iZXJzKHVuc2lnbmVkIGNoYXIgKnNlbmRwYWNrZXQsCisJdW5zaWduZWQgbG9uZyBuZXR3b3JrX251bWJlciwgdW5zaWduZWQgY2hhciBpbmNvbWluZyk7CisKK3N0YXRpYyBpbnQgaGFuZGxlX0lQWFdBTih1bnNpZ25lZCBjaGFyICpzZW5kcGFja2V0LCBjaGFyICpkZXZuYW1lLAorCXVuc2lnbmVkIGNoYXIgZW5hYmxlX0lQWCwgdW5zaWduZWQgbG9uZyBuZXR3b3JrX251bWJlcik7CisKKy8qIExvY2sgRnVuY3Rpb25zOiBTTVAgc3VwcG9ydGVkICovCit2b2lkIAlzNTA4X3M1MTRfdW5sb2NrKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKTsKK3ZvaWQgCXM1MDhfczUxNF9sb2NrKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKTsKKwordW5zaWduZWQgc2hvcnQgY2FsY19jaGVja3N1bSAoY2hhciAqLCBpbnQpOworc3RhdGljIGludCBzZXR1cF9mcl9oZWFkZXIoc3RydWN0IHNrX2J1ZmYqKiBza2IsCisJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBjaGFyIG9wX21vZGUpOworCisKKy8qKioqKiogUHVibGljIEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZyYW1lIHJlbGF5IHByb3RvY29sIGluaXRpYWxpemF0aW9uIHJvdXRpbmUuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgbWFpbiBXQU5QSVBFIG1vZHVsZSBkdXJpbmcgc2V0dXAuICBBdCB0aGlzCisgKiBwb2ludCBhZGFwdGVyIGlzIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgYW5kIGZpcm13YXJlIGlzIHJ1bm5pbmcuCisgKiAgbyByZWFkIGZpcm13YXJlIHZlcnNpb24gKHRvIG1ha2Ugc3VyZSBpdCdzIGFsaXZlKQorICogIG8gY29uZmlndXJlIGFkYXB0ZXIKKyAqICBvIGluaXRpYWxpemUgcHJvdG9jb2wtc3BlY2lmaWMgZmllbGRzIG9mIHRoZSBhZGFwdGVyIGRhdGEgc3BhY2UuCisgKgorICogUmV0dXJuOgkwCW8uay4KKyAqCQk8IDAJZmFpbHVyZS4KKyAqLworaW50IHdwZl9pbml0KHNkbGFfdCAqY2FyZCwgd2FuZGV2X2NvbmZfdCAqY29uZikKK3sKKworCWludCBlcnI7CisJZnI1MDhfZmxhZ3NfdCogZmxhZ3M7CisKKwl1bmlvbgorCXsKKwkJY2hhciBzdHJbODBdOworCQlmcl9jb25mX3QgY2ZnOworCX0gdTsKKworCWZyX2J1Zl9pbmZvX3QqIGJ1Zl9pbmZvOworCWludCBpOworCisKKwlwcmludGsoS0VSTl9JTkZPICJcbiIpOworCisJLyogVmVyaWZ5IGNvbmZpZ3VyYXRpb24gSUQgKi8KKwlpZiAoY29uZi0+Y29uZmlnX2lkICE9IFdBTkNPTkZJR19GUikgeworCQkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludmFsaWQgY29uZmlndXJhdGlvbiBJRCAldSFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBjb25mLT5jb25maWdfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwkKKwl9CisKKwkvKiBJbml0aWFsaXplIHByb3RvY29sLXNwZWNpZmljIGZpZWxkcyBvZiBhZGFwdGVyIGRhdGEgc3BhY2UgKi8KKwlzd2l0Y2ggKGNhcmQtPmh3LmZ3aWQpIHsKKwkKKwkJY2FzZSBTRklEX0ZSNTA4OgorCQkJY2FyZC0+bWJveCAgPSAodm9pZCopKGNhcmQtPmh3LmRwbWJhc2UgKyAKKwkJCQkJRlI1MDhfTUJPWF9PRkZTKTsKKwkJCWNhcmQtPmZsYWdzID0gKHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsgCisJCQkJCUZSNTA4X0ZMQUdfT0ZGUyk7CisJCQlpZihjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCkgeworCQkJCWNhcmQtPm1ib3ggKz0gRlJfTUJfVkVDVE9SOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5mbGFncyArPSBGUl9NQl9WRUNUT1I7CisJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5pc3IgPSAmZnJfaXNyOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZsYWdzID0gY2FyZC0+ZmxhZ3M7CisKKwkvKiBSZWFkIGZpcm13YXJlIHZlcnNpb24uICBOb3RlIHRoYXQgd2hlbiBhZGFwdGVyIGluaXRpYWxpemVzLCBpdAorCSAqIGNsZWFycyB0aGUgbWFpbGJveCwgc28gaXQgbWF5IGFwcGVhciB0aGF0IHRoZSBmaXJzdCBjb21tYW5kIHdhcworCSAqIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSB3aGVuIGluIGZhY3QgaXQgd2FzIG1lcmVseSBlcmFzZWQuIFRvIHdvcmsKKwkgKiBhcm91bmQgdGhpcywgd2UgZXhlY3V0ZSB0aGUgZmlyc3QgY29tbWFuZCB0d2ljZS4KKwkgKi8KKworCWlmIChmcl9yZWFkX3ZlcnNpb24oY2FyZCwgTlVMTCkgfHwgZnJfcmVhZF92ZXJzaW9uKGNhcmQsIHUuc3RyKSkKKwkJcmV0dXJuIC1FSU87CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogcnVubmluZyBmcmFtZSByZWxheSBmaXJtd2FyZSB2JXNcbiIsCisJCWNhcmQtPmRldm5hbWUsIHUuc3RyKTsKKworCS8qIEFkanVzdCBjb25maWd1cmF0aW9uICovCisJY29uZi0+bXR1ICs9IEZSX0hFQURFUl9MRU47CisJY29uZi0+bXR1ID0gKGNvbmYtPm10dSA+PSBNSU5fTEdUSF9GUl9EQVRBX0NGRykgPworCQkJbWluX3QodW5zaWduZWQgaW50LCBjb25mLT5tdHUsIEZSX01BWF9OT19EQVRBX0JZVEVTX0lOX0ZSQU1FKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBGUl9DSEFOTkVMX01UVSArIEZSX0hFQURFUl9MRU47CisgICAgIAorCWNvbmYtPmJwcyA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+YnBzLCAyMDQ4MDAwKTsKKworCS8qIEluaXRpYWx6ZSB0aGUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgc2VudCB0byB0aGUgYm9hcmQgdG8gemVybyAqLworCW1lbXNldCgmdS5jZmcsIDAsIHNpemVvZih1LmNmZykpOworCisJbWVtc2V0KGNhcmQtPnUuZi5kbGNpX3RvX2Rldl9tYXAsIDAsIHNpemVvZihjYXJkLT51LmYuZGxjaV90b19kZXZfbWFwKSk7CisgCQorCS8qIENvbmZpZ3VyZSBhZGFwdGVyIGZpcm13YXJlICovCisKKwl1LmNmZy5tdHUJPSBjb25mLT5tdHU7CisJdS5jZmcua2Jwcwk9IGNvbmYtPmJwcyAvIDEwMDA7CisKKyAgICAJdS5jZmcuY2lyX2Z3ZCA9IHUuY2ZnLmNpcl9id2QgPSAxNjsKKyAgICAgICAgdS5jZmcuYmNfZndkICA9IHUuY2ZnLmJjX2J3ZCA9IDE2OworCQorCXUuY2ZnLm9wdGlvbnMJPSAweDAwMDA7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdsb2JhbCBDSVIgZW5hYmxlZCBieSBEZWZhdWx0XG4iLCBjYXJkLT5kZXZuYW1lKTsKKwkKKwlzd2l0Y2ggKGNvbmYtPnUuZnIuc2lnbmFsbGluZykgeworCisJCWNhc2UgV0FOT1BUX0ZSX0FOU0k6CisJCQl1LmNmZy5vcHRpb25zID0gMHgwMDAwOyAKKwkJCWJyZWFrOwkJCisJCisJCWNhc2UgV0FOT1BUX0ZSX1E5MzM6CQorCQkJdS5jZmcub3B0aW9ucyB8PSAweDAyMDA7IAorCQkJYnJlYWs7CisJCisJCWNhc2UgV0FOT1BUX0ZSX0xNSToJCisJCQl1LmNmZy5vcHRpb25zIHw9IDB4MDQwMDsgCisJCQlicmVhazsKKworCQljYXNlIFdBTk9QVF9OTzoKKwkJCXUuY2ZnLm9wdGlvbnMgfD0gMHgwODAwOyAKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElsbGVnYWwgU2lnbmFsbGluZyBvcHRpb25cbiIsCisJCQkJCWNhcmQtPndhbmRldi5uYW1lKTsKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCisJY2FyZC0+d2FuZGV2LnNpZ25hbGxpbmcgPSBjb25mLT51LmZyLnNpZ25hbGxpbmc7CisKKwlpZiAoY29uZi0+c3RhdGlvbiA9PSBXQU5PUFRfQ1BFKSB7CisKKworCQlpZiAoY29uZi0+dS5mci5zaWduYWxsaW5nID09IFdBTk9QVF9OTyl7CisJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogRVJST1IgLSBGb3IgTk8gc2lnbmFsbGluZywgc3RhdGlvbiBtdXN0IGJlIHNldCB0byBOb2RlISIsCisJCQkJIAkgY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXUuY2ZnLnN0YXRpb24gPSAwOworCQl1LmNmZy5vcHRpb25zIHw9IDB4ODAwMDsJLyogYXV0byBjb25maWcgRExDSSAqLworCQljYXJkLT51LmYuZGxjaV9udW0gID0gMDsKKwkKKwl9IGVsc2UgeworCisJCXUuY2ZnLnN0YXRpb24gPSAxOwkvKiBzd2l0Y2ggZW11bGF0aW9uIG1vZGUgKi8KKworCQkvKiBGb3Igc3dpdGNoIGVtdWxhdGlvbiB3ZSBoYXZlIHRvIGNyZWF0ZSBhIGxpc3Qgb2YgZGxjaShzKQorCQkgKiB0aGF0IHdpbGwgYmUgc2VudCB0byBiZSBnbG9iYWwgU0VUX0RMQ0lfQ09ORklHVVJBVElPTiAKKwkJICogY29tbWFuZCBpbiBmcl9jb25maWd1cmUoKSByb3V0aW5lLiAKKwkJICovCisKKwkJY2FyZC0+dS5mLmRsY2lfbnVtICA9IG1pbl90KHVuc2lnbmVkIGludCwgbWF4X3QodW5zaWduZWQgaW50LCBjb25mLT51LmZyLmRsY2lfbnVtLCAxKSwgMTAwKTsKKwkKKwkJZm9yICggaSA9IDA7IGkgPCBjYXJkLT51LmYuZGxjaV9udW07IGkrKykgeworCisJCQljYXJkLT51LmYubm9kZV9kbGNpW2ldID0gKHVuc2lnbmVkIHNob3J0KSAKKwkJCQljb25mLT51LmZyLmRsY2lbaV0gPyBjb25mLT51LmZyLmRsY2lbaV0gOiAxNjsKKwkKKwkJfQorCX0KKworCWlmIChjb25mLT5jbG9ja2luZyA9PSBXQU5PUFRfSU5URVJOQUwpCisJCXUuY2ZnLnBvcnQgfD0gMHgwMDAxOworCisJaWYgKGNvbmYtPmludGVyZmFjZSA9PSBXQU5PUFRfUlMyMzIpCisJCXUuY2ZnLnBvcnQgfD0gMHgwMDAyOworCisJaWYgKGNvbmYtPnUuZnIudDM5MSkKKwkJdS5jZmcudDM5MSA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS5mci50MzkxLCAzMCk7CisJZWxzZQorCQl1LmNmZy50MzkxID0gNTsKKworCWlmIChjb25mLT51LmZyLnQzOTIpCisJCXUuY2ZnLnQzOTIgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUuZnIudDM5MiwgMzApOworCWVsc2UKKwkJdS5jZmcudDM5MiA9IDE1OworCisJaWYgKGNvbmYtPnUuZnIubjM5MSkKKwkJdS5jZmcubjM5MSA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS5mci5uMzkxLCAyNTUpOworCWVsc2UKKwkJdS5jZmcubjM5MSA9IDI7CisKKwlpZiAoY29uZi0+dS5mci5uMzkyKQorCQl1LmNmZy5uMzkyID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LmZyLm4zOTIsIDEwKTsKKwllbHNlCisJCXUuY2ZnLm4zOTIgPSAzOwkKKworCWlmIChjb25mLT51LmZyLm4zOTMpCisJCXUuY2ZnLm4zOTMgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUuZnIubjM5MywgMTApOworCWVsc2UKKwkJdS5jZmcubjM5MyA9IDQ7CisKKwlpZiAoZnJfY29uZmlndXJlKGNhcmQsICZ1LmNmZykpCisJCXJldHVybiAtRUlPOworCisJaWYgKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KSB7CisJCisgICAgICAgICAgICAgICAgYnVmX2luZm8gPSAodm9pZCopKGNhcmQtPmh3LmRwbWJhc2UgKyBGUl9NQl9WRUNUT1IgKworCQkJRlI1MDhfUlhCQ19PRkZTKTsKKworICAgICAgICAgICAgICAgIGNhcmQtPnJ4bWIgPSAodm9pZCopKGJ1Zl9pbmZvLT5yc2VfbmV4dCArIGNhcmQtPmh3LmRwbWJhc2UpOworCisgICAgICAgICAgICAgICAgY2FyZC0+dS5mLnJ4bWJfYmFzZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopKGJ1Zl9pbmZvLT5yc2VfYmFzZSArIGNhcmQtPmh3LmRwbWJhc2UpOyAKKworICAgICAgICAgICAgICAgIGNhcmQtPnUuZi5yeG1iX2xhc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKShidWZfaW5mby0+cnNlX2Jhc2UgKworICAgICAgICAgICAgICAgICAgICAgICAgKGJ1Zl9pbmZvLT5yc2VfbnVtIC0gMSkgKiBzaXplb2YoZnJfcnhfYnVmX2N0bF90KSArCisgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5ody5kcG1iYXNlKTsKKwl9ZWxzZXsJCisJCWJ1Zl9pbmZvID0gKHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsgRlI1MDhfUlhCQ19PRkZTKTsKKworCQljYXJkLT5yeG1iID0gKHZvaWQqKShidWZfaW5mby0+cnNlX25leHQgLQorCQkJRlJfTUJfVkVDVE9SICsgY2FyZC0+aHcuZHBtYmFzZSk7CisJCQorCQljYXJkLT51LmYucnhtYl9iYXNlID0KKwkJCSh2b2lkKikoYnVmX2luZm8tPnJzZV9iYXNlIC0KKwkJCUZSX01CX1ZFQ1RPUiArIGNhcmQtPmh3LmRwbWJhc2UpOworCQkKKwkJY2FyZC0+dS5mLnJ4bWJfbGFzdCA9CisJCQkodm9pZCopKGJ1Zl9pbmZvLT5yc2VfYmFzZSArCisJCQkoYnVmX2luZm8tPnJzZV9udW0gLSAxKSAqIHNpemVvZihmcl9yeF9idWZfY3RsX3QpIC0KKwkJCUZSX01CX1ZFQ1RPUiArIGNhcmQtPmh3LmRwbWJhc2UpOworCX0KKworCWNhcmQtPnUuZi5yeF9iYXNlID0gYnVmX2luZm8tPmJ1Zl9iYXNlOworCWNhcmQtPnUuZi5yeF90b3AgID0gYnVmX2luZm8tPmJ1Zl90b3A7CisKKwljYXJkLT51LmYudHhfaW50ZXJydXB0c19wZW5kaW5nID0gMDsKKworCWNhcmQtPndhbmRldi5tdHUJPSBjb25mLT5tdHU7CisJY2FyZC0+d2FuZGV2LmJwcwk9IGNvbmYtPmJwczsKKwljYXJkLT53YW5kZXYuaW50ZXJmYWNlCT0gY29uZi0+aW50ZXJmYWNlOworCWNhcmQtPndhbmRldi5jbG9ja2luZwk9IGNvbmYtPmNsb2NraW5nOworCWNhcmQtPndhbmRldi5zdGF0aW9uCT0gY29uZi0+c3RhdGlvbjsKKwljYXJkLT5wb2xsCQk9IE5VTEw7IAorCWNhcmQtPmV4ZWMJCT0gJndwZl9leGVjOworCWNhcmQtPndhbmRldi51cGRhdGUJPSAmdXBkYXRlOworCWNhcmQtPndhbmRldi5uZXdfaWYJPSAmbmV3X2lmOworCWNhcmQtPndhbmRldi5kZWxfaWYJPSAmZGVsX2lmOworCWNhcmQtPndhbmRldi5zdGF0ZQk9IFdBTl9ESVNDT05ORUNURUQ7CisJY2FyZC0+d2FuZGV2LnR0bAk9IGNvbmYtPnR0bDsKKyAgICAgICAgY2FyZC0+d2FuZGV2LnVkcF9wb3J0IAk9IGNvbmYtPnVkcF9wb3J0OyAgICAgICAKKwljYXJkLT5kaXNhYmxlX2NvbW0JPSAmZGlzYWJsZV9jb21tOwkKKwljYXJkLT51LmYuYXJwX2RldiAJPSBOVUxMOworCisJLyogSW50aWFsaXplIGdsb2JhbCBzdGF0aXN0aWNzIGZvciBhIGNhcmQgKi8KKwlpbml0X2dsb2JhbF9zdGF0aXN0aWNzKCBjYXJkICk7CisKKyAgICAgICAgY2FyZC0+VHJhY2luZ0VuYWJsZWQgICAgICAgICAgPSAwOworCisJLyogSW50ZXJydXB0IFRlc3QgKi8KKwlJbnRyX3Rlc3RfY291bnRlciA9IDA7CisJY2FyZC0+aW50cl9tb2RlID0gSU5UUl9URVNUX01PREU7CisJZXJyID0gaW50cl90ZXN0KCBjYXJkICk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogRW5kIG9mIEludGVycnVwdCBUZXN0IHJjPTB4JXggIGNvdW50PSVpXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSxlcnIsSW50cl90ZXN0X2NvdW50ZXIpOyAKKwkKKwlpZiAoZXJyIHx8IChJbnRyX3Rlc3RfY291bnRlciA8IE1BWF9JTlRSX1RFU1RfQ09VTlRFUikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW50ZXJydXB0IFRlc3QgRmFpbGVkLCBDb3VudGVyOiAlaVxuIiwgCisJCQljYXJkLT5kZXZuYW1lLCBJbnRyX3Rlc3RfY291bnRlcik7CisJCXByaW50ayhLRVJOX0VSUiAiUGxlYXNlIGNob29zZSBhbm90aGVyIGludGVycnVwdFxuIik7CisJCWVyciA9IC1FSU87CisJCXJldHVybiBlcnI7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludGVycnVwdCBUZXN0IFBhc3NlZCwgQ291bnRlcjogJWlcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBJbnRyX3Rlc3RfY291bnRlcik7CisKKworCS8qIEFwciAyOCAyMDAwLiBOZW5hZCBDb3JiaWMKKwkgKiBFbmFibGUgY29tbW51bmljYXRpb25zIGhlcmUsIG5vdCBpbiBpZl9vcGVuIG9yIG5ld19pZiwgc2luY2UKKyAgICAgICAgICogaW50ZXJmYWNlcyBjb21lIGRvd24gd2hlbiB0aGUgbGluayBpcyBkaXNjb25uZWN0ZWQuIAorICAgICAgICAgKi8KKwkgCisJLyogSWYgeW91IGVuYWJsZSBjb21tcyBhbmQgdGhlbiBzZXQgaW50cywgeW91IGdldCBhIFR4IGludCBhcyB5b3UKKwkgKiBwZXJmb3JtIHRoZSBTRVRfSU5UX1RSSUdHRVJTIGNvbW1hbmQuIFNvLCB3ZSBvbmx5IHNldCBpbnQKKwkgKiB0cmlnZ2VycyBhbmQgdGhlbiBhZGp1c3QgdGhlIGludGVycnVwdCBtYXNrICh0byBkaXNhYmxlIFR4IGludHMpCisJICogYmVmb3JlIGVuYWJsaW5nIGNvbW1zLiAKKwkgKi8JCisgICAgICAgIGlmIChmcl9zZXRfaW50cl9tb2RlKGNhcmQsIChGUl9JTlRSX1JYUkRZIHwgRlJfSU5UUl9UWFJEWSB8CisJCUZSX0lOVFJfRExDIHwgRlJfSU5UUl9USU1FUiB8IEZSX0lOVFJfVFhfTVVMVF9ETENJcykgLAorCQljYXJkLT53YW5kZXYubXR1LCAwKSkgeworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlmbGFncy0+aW1hc2sgJj0gfihGUl9JTlRSX1RYUkRZIHwgRlJfSU5UUl9USU1FUik7CisgCisJaWYgKGZyX2NvbW1fZW5hYmxlKGNhcmQpKSB7CisJCXJldHVybiAtRUlPOworCX0JCisJd2FucGlwZV9zZXRfc3RhdGUoY2FyZCwgV0FOX0NPTk5FQ1RFRCk7CisJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPnUuZi5pZl9zZW5kX2xvY2spOworCQorCXByaW50ayhLRVJOX0lORk8gIlxuIik7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqIFdBTiBEZXZpY2UgRHJpdmVyIEVudHJ5IFBvaW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVwZGF0ZSBkZXZpY2Ugc3RhdHVzICYgc3RhdGlzdGljcy4KKyAqLworc3RhdGljIGludCB1cGRhdGUoc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldikKK3sKKwl2b2xhdGlsZSBzZGxhX3QqIGNhcmQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWZyNTA4X2ZsYWdzX3QqIGZsYWdzOworCisJLyogc2FuaXR5IGNoZWNrcyAqLworCWlmICgod2FuZGV2ID09IE5VTEwpIHx8ICh3YW5kZXYtPnByaXZhdGUgPT0gTlVMTCkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHdhbmRldi0+c3RhdGUgPT0gV0FOX1VOQ09ORklHVVJFRCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljYXJkID0gd2FuZGV2LT5wcml2YXRlOworCWZsYWdzID0gY2FyZC0+ZmxhZ3M7CisKKworCWNhcmQtPnUuZi51cGRhdGVfY29tbXNfc3RhdHMgPSAxOworCWNhcmQtPnUuZi50aW1lcl9pbnRfZW5hYmxlZCB8PSBUTVJfSU5UX0VOQUJMRURfVVBEQVRFOworCWZsYWdzLT5pbWFzayB8PSBGUl9JTlRSX1RJTUVSOworICAgICAgIAl0aW1lb3V0ID0gamlmZmllczsKKyAgICAgICAJZm9yKDs7KSB7CisJCWlmKGNhcmQtPnUuZi51cGRhdGVfY29tbXNfc3RhdHMgPT0gMCkKKwkJCWJyZWFrOworICAgICAgICAgICAgICAgIGlmICgoamlmZmllcyAtIHRpbWVvdXQpID4gKDEgKiBIWikpeworICAgIAkJCWNhcmQtPnUuZi51cGRhdGVfY29tbXNfc3RhdHMgPSAwOworIAkJCXJldHVybiAtRUFHQUlOOworCQl9CisgICAgICAgIH0KKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENyZWF0ZSBuZXcgbG9naWNhbCBjaGFubmVsLgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgcm91dGVyIHdoZW4gUk9VVEVSX0lGTkVXIElPQ1RMIGlzIGJlaW5nCisgKiBoYW5kbGVkLgorICogbyBwYXJzZSBtZWRpYS0gYW5kIGhhcmR3YXJlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24KKyAqIG8gbWFrZSBzdXJlIHRoYXQgYSBuZXcgY2hhbm5lbCBjYW4gYmUgY3JlYXRlZAorICogbyBhbGxvY2F0ZSByZXNvdXJjZXMsIGlmIG5lY2Vzc2FyeQorICogbyBwcmVwYXJlIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZSBmb3IgcmVnaXN0YXJhdGlvbi4KKyAqCisgKiBSZXR1cm46CTAJby5rLgorICoJCTwgMAlmYWlsdXJlIChjaGFubmVsIHdpbGwgbm90IGJlIGNyZWF0ZWQpCisgKi8KK3N0YXRpYyBpbnQgbmV3X2lmKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCSAgd2FuaWZfY29uZl90KiBjb25mKQoreworCXNkbGFfdCogY2FyZCA9IHdhbmRldi0+cHJpdmF0ZTsKKwlmcl9jaGFubmVsX3QqIGNoYW47CisJaW50IGRsY2kgPSAwOworCWludCBlcnIgPSAwOworCisJCisJaWYgKChjb25mLT5uYW1lWzBdID09ICdcMCcpIHx8IChzdHJsZW4oY29uZi0+bmFtZSkgPiBXQU5fSUZOQU1FX1NaKSkgeworCQkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludmFsaWQgaW50ZXJmYWNlIG5hbWUhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHByaXZhdGUgZGF0YSAqLworCWNoYW4gPSBrbWFsbG9jKHNpemVvZihmcl9jaGFubmVsX3QpLCBHRlBfS0VSTkVMKTsKKworCWlmIChjaGFuID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KGNoYW4sIDAsIHNpemVvZihmcl9jaGFubmVsX3QpKTsKKwlzdHJjcHkoY2hhbi0+bmFtZSwgY29uZi0+bmFtZSk7CisJY2hhbi0+Y2FyZCA9IGNhcmQ7CisKKwkvKiB2ZXJpZnkgbWVkaWEgYWRkcmVzcyAqLworCWlmIChpc19kaWdpdChjb25mLT5hZGRyWzBdKSkgeworCisJCWRsY2kgPSBkZWNfdG9fdWludChjb25mLT5hZGRyLCAwKTsKKworCQlpZiAoZGxjaSAmJiAoZGxjaSA8PSBISUdIRVNUX1ZBTElEX0RMQ0kpKSB7CisJCQorCQkJY2hhbi0+ZGxjaSA9IGRsY2k7CisJCQorCQl9IGVsc2UgeworCQkKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSIlczogSW52YWxpZCBETENJICV1IG9uIGludGVyZmFjZSAlcyFcbiIsCisJCQkJd2FuZGV2LT5uYW1lLCBkbGNpLCBjaGFuLT5uYW1lKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCX0KKworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJIiVzOiBJbnZhbGlkIG1lZGlhIGFkZHJlc3Mgb24gaW50ZXJmYWNlICVzIVxuIiwKKwkJCXdhbmRldi0+bmFtZSwgY2hhbi0+bmFtZSk7CisJCWVyciA9IC1FSU5WQUw7CisJfQorCisJaWYgKChjaGFuLT50cnVlX2lmX2VuY29kaW5nID0gY29uZi0+dHJ1ZV9pZl9lbmNvZGluZykgPT0gV0FOT1BUX1lFUyl7CisJCXByaW50ayhLRVJOX0lORk8gCisJCQkiJXM6IEVuYWJsaW5nLCB0cnVlIGludGVyZmFjZSB0eXBlIGVuY29kaW5nLlxuIiwKKwkJCWNhcmQtPmRldm5hbWUpOworCX0KKwkKKworCisgICAgLyogU2V0dXAgd2FucGlwZSBhcyBhIHJvdXRlciAoV0FOUElQRSkgZXZlbiBpZiBpdCBpcworCSAqIGEgYnJpZGdlZCBETENJLCBvciBhcyBhbiBBUEkgCisJICovCisgICAgICAgIGlmIChzdHJjbXAoY29uZi0+dXNlZGJ5LCAiV0FOUElQRSIpICA9PSAwICB8fCAKKwkgICAgc3RyY21wKGNvbmYtPnVzZWRieSwgIkJSSURHRSIpICAgPT0gMCAgfHwKKwkgICAgc3RyY21wKGNvbmYtPnVzZWRieSwgIkJSSURHRV9OIikgPT0gMCl7CisJCQorCQlpZihzdHJjbXAoY29uZi0+dXNlZGJ5LCAiV0FOUElQRSIpID09IDApeworCQkJY2hhbi0+Y29tbW9uLnVzZWRieSA9IFdBTlBJUEU7CisJCQkKKwkgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJ1bm5pbmcgaW4gV0FOUElQRSBtb2RlLlxuIiwgCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJCisJCX1lbHNlIGlmKHN0cmNtcChjb25mLT51c2VkYnksICJCUklER0UiKSA9PSAwKXsKKwkJCQorCQkJY2hhbi0+Y29tbW9uLnVzZWRieSA9IEJSSURHRTsKKwkJCQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJ1bm5pbmcgaW4gV0FOUElQRSAoQlJJREdFKSBtb2RlLlxuIiwgCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQl9ZWxzZSBpZiggc3RyY21wKGNvbmYtPnVzZWRieSwgIkJSSURHRV9OIikgPT0gMCApeworCQkJCisJCQljaGFuLT5jb21tb24udXNlZGJ5ID0gQlJJREdFX05PREU7CisJCQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJ1bm5pbmcgaW4gV0FOUElQRSAoQlJJREdFX05PREUpIG1vZGUuXG4iLCAKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCX0KKworCQlpZiAoIWVycil7CisJCQkvKiBEeW5hbWljIGludGVyZmFjZSBjb25maWd1cmF0aW9uIG9wdGlvbi4KKwkJCSAqIE9uIGRpc2Nvbm5lY3QsIGlmIHRoZSBvcHRpb25zIGlzIHNlbGVjdGVkLAorCQkJICogdGhlIGludGVyZmFjZSB3aWxsIGJlIGJyb3VnaHQgZG93biAqLworCQkJaWYgKGNvbmYtPmlmX2Rvd24gPT0gV0FOT1BUX1lFUyl7IAorCQkJCXNldF9iaXQoRFlOX09QVF9PTiwmY2hhbi0+aW50ZXJmYWNlX2Rvd24pOworCQkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJICAgICIlczogRHluYW1pYyBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBlbmFibGVkLlxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQl9CisJCX0KKworICAgICAgICB9IGVsc2UgaWYoc3RyY21wKGNvbmYtPnVzZWRieSwgIkFQSSIpID09IDApeworCisgICAgICAgICAgICAgICAgY2hhbi0+Y29tbW9uLnVzZWRieSA9IEFQSTsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogUnVubmluZyBpbiBBUEkgbW9kZS5cbiIsCisJCQl3YW5kZXYtPm5hbWUpOworICAgICAgICB9CisKKwlpZiAoZXJyKSB7CisJCQorCQlrZnJlZShjaGFuKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBwbGFjZSBjaXIsYmUsYmMgYW5kIG90aGVyIGNoYW5uZWwgc3BlY2lmaWMgaW5mb3JtYXRpb24gaW50byB0aGUKKwkgKiBjaGFuIHN0cnVjdHVyZSAKKyAgICAgICAgICovCisJaWYgKGNvbmYtPmNpcikgeworCisJCWNoYW4tPmNpciA9IG1heF90KHVuc2lnbmVkIGludCwgMSwKKwkJCQltaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPmNpciwgNTEyKSk7CisJCWNoYW4tPmNpcl9zdGF0dXMgPSBDSVJfRU5BQkxFRDsgCisKKwkJCisJCS8qIElmIENJUiBpcyBlbmFibGVkLCBmb3JjZSBCQyB0byBlcXVhbCBDSVIKKyAgICAgICAgICAgICAgICAgKiB0aGlzIHNvbHZlcyBudW1iZXIgb2YgcG90ZW50aWFsIHByb2JsZW1zIGlmIENJUiBpcyAKKyAgICAgICAgICAgICAgICAgKiBzZXQgYW5kIEJDIGlzIG5vdCAKKwkJICovCisJCWNoYW4tPmJjID0gY2hhbi0+Y2lyOworCisJCWlmIChjb25mLT5iZSl7CisJCQljaGFuLT5iZSA9IG1heF90KHVuc2lnbmVkIGludCwKKwkJCQkgICAgICAgMCwgbWluX3QodW5zaWduZWQgaW50LCBjb25mLT5iZSwgNTExKSk7CisJCX1lbHNlewkKKwkJCWNvbmYtPmJlID0gMDsKKwkJfQorCisJCXByaW50ayAoS0VSTl9JTkZPICIlczogQ0lSIGVuYWJsZWQgZm9yIERMQ0kgJWkgXG4iLAorCQkJCXdhbmRldi0+bmFtZSxjaGFuLT5kbGNpKTsKKwkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiAgICAgQ0lSID0gJWkgOyBCQyA9ICVpIDsgQkUgPSAlaVxuIiwKKwkJCQl3YW5kZXYtPm5hbWUsY2hhbi0+Y2lyLGNoYW4tPmJjLGNoYW4tPmJlKTsKKworCisJfWVsc2V7CisJCWNoYW4tPmNpcl9zdGF0dXMgPSBDSVJfRElTQUJMRUQ7CisJCXByaW50ayAoS0VSTl9JTkZPICIlczogQ0lSIGRpc2FibGVkIGZvciBETENJICVpXG4iLAorCQkJCXdhbmRldi0+bmFtZSxjaGFuLT5kbGNpKTsKKwl9CisKKwljaGFuLT5tYyA9IGNvbmYtPm1jOworCisJaWYgKGNvbmYtPmluYXJwID09IFdBTk9QVF9ZRVMpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogSW52ZXJzZSBBUlAgU3VwcG9ydCBFbmFibGVkXG4iLGNhcmQtPmRldm5hbWUpOworCQljaGFuLT5pbmFycCA9IGNvbmYtPmluYXJwID8gSU5BUlBfUkVRVUVTVCA6IElOQVJQX05PTkU7CisJCWNoYW4tPmluYXJwX2ludGVydmFsID0gY29uZi0+aW5hcnBfaW50ZXJ2YWwgPyBjb25mLT5pbmFycF9pbnRlcnZhbCA6IDEwOworCX1lbHNleworCQlwcmludGsoS0VSTl9JTkZPICIlczogSW52ZXJzZSBBUlAgU3VwcG9ydCBEaXNhYmxlZFxuIixjYXJkLT5kZXZuYW1lKTsKKwkJY2hhbi0+aW5hcnAgPSBJTkFSUF9OT05FOworCQljaGFuLT5pbmFycF9pbnRlcnZhbCA9IDEwOworCX0KKworCisJY2hhbi0+ZGxjaV9jb25maWd1cmVkID0gRExDSV9OT1RfQ09ORklHVVJFRDsJCisKKworCS8qRklYTUU6IElQWCBkaXNhYmxlZCBpbiB0aGlzIFdBTlBJUEUgdmVyc2lvbiAqLworCWlmIChjb25mLT5lbmFibGVfSVBYID09IFdBTk9QVF9ZRVMpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRVJST1IgLSBUaGlzIHZlcnNpb24gb2YgV0FOUElQRSBkb2Vzbid0IHN1cHBvcnQgSVBYXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQlrZnJlZShjaGFuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfWVsc2V7CisJCWNoYW4tPmVuYWJsZV9JUFggPSBXQU5PUFRfTk87CisJfQkKKworCWlmIChjb25mLT5uZXR3b3JrX251bWJlcil7CisJCWNoYW4tPm5ldHdvcmtfbnVtYmVyID0gY29uZi0+bmV0d29ya19udW1iZXI7CisJfWVsc2V7CisJCWNoYW4tPm5ldHdvcmtfbnVtYmVyID0gMHhERUFEQkVFRjsKKwl9CisKKwljaGFuLT5yb3V0ZV9mbGFnID0gTk9fUk9VVEU7CisJCisJaW5pdF9jaGFuX3N0YXRpc3RpY3MoY2hhbik7CisKKwljaGFuLT50cmFuc21pdF9sZW5ndGggPSAwOworCisJLyogcHJlcGFyZSBuZXR3b3JrIGRldmljZSBkYXRhIHNwYWNlIGZvciByZWdpc3RyYXRpb24gKi8KKwlzdHJjcHkoZGV2LT5uYW1lLGNoYW4tPm5hbWUpOworCQorCWRldi0+aW5pdCA9ICZpZl9pbml0OworCWRldi0+cHJpdiA9IGNoYW47CisKKwkvKiBJbml0aWFsaXplIEZSIFBvbGxpbmcgVGFzayBRdWV1ZQorICAgICAgICAgKiBXZSBuZWVkIGEgcG9sbCByb3V0aW5lIGZvciBlYWNoIG5ldHdvcmsKKyAgICAgICAgICogaW50ZXJmYWNlLiAKKyAgICAgICAgICovCisJSU5JVF9XT1JLKCZjaGFuLT5mcl9wb2xsX3dvcmssICh2b2lkICopZnJfcG9sbCwgZGV2KTsKKworCWluaXRfdGltZXIoJmNoYW4tPmZyX2FycF90aW1lcik7CisJY2hhbi0+ZnJfYXJwX3RpbWVyLmRhdGE9KHVuc2lnbmVkIGxvbmcpZGV2OworCWNoYW4tPmZyX2FycF90aW1lci5mdW5jdGlvbiA9IGZyX2FycDsKKworCXdhbmRldi0+bmV3X2lmX2NudCsrOworCisJLyogVGVsbHMgdXMgdGhhdCBpZiB0aGlzIGludGVyZmFjZSBpcyBhCisgICAgICAgICAqIGdhdGV3YXkgb3Igbm90ICovCisJaWYgKChjaGFuLT5nYXRld2F5ID0gY29uZi0+Z2F0ZXdheSkgPT0gV0FOT1BUX1lFUyl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnRlcmZhY2UgJXMgaXMgc2V0IGFzIGEgZ2F0ZXdheS5cbiIsCisJCQljYXJkLT5kZXZuYW1lLGRldi0+bmFtZSk7CisJfQorCisJLyogTS4gR3JhbnQgUGF0Y2ggQXByIDI4IDIwMDAgCisgICAgICAgICAqIERpc2FsbG93IGR1cGxpY2F0ZSBkbGNpIGNvbmZpZ3VyYXRpb25zLiAqLworCWlmIChjYXJkLT51LmYuZGxjaV90b19kZXZfbWFwW2NoYW4tPmRsY2ldICE9IE5VTEwpIHsKKwkJa2ZyZWUoY2hhbik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogQ29uZmlndXJlIHRoaXMgZGxjaSBhdCBhIGxhdGVyIGRhdGUsIHdoZW4KKyAgICAgICAgICogdGhlIGludGVyZmFjZSBjb21lcyB1cC4gaS5lLiB3aGVuIGlmX29wZW4oKSAKKyAgICAgICAgICogZXhlY3V0ZXMgKi8KKwlzZXRfYml0KDAsJmNoYW4tPmNvbmZpZ19kbGNpKTsKKwkKKwlwcmludGsoS0VSTl9JTkZPICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGVsZXRlIGxvZ2ljYWwgY2hhbm5lbC4KKyAqLworc3RhdGljIGludCBkZWxfaWYoc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlmcl9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M9MDsKKworCS8qIFRoaXMgaW50ZXJmYWNlIGlzIGRlYWQsIG1ha2Ugc3VyZSB0aGUgCisJICogQVJQIHRpbWVyIGlzIHN0b3BwZWQgKi8KKwlkZWxfdGltZXIoJmNoYW4tPmZyX2FycF90aW1lcik7CisJCisJLyogSWYgd2UgYXJlIGEgTk9ERSwgd2UgbXVzdCB1bmNvbmZpZ3VyZSB0aGlzIERMQ0kKKwkgKiBUcmlnZ2VyIGFuIHVuY29uZmlndXJlIGNvbW1hbmQgdGhhdCB3aWxsCisJICogYmUgZXhlY3V0ZWQgaW4gdGltZXIgaW50ZXJydXB0LiBXZSBtdXN0IHdhaXQKKwkgKiBmb3IgdGhlIGNvbW1hbmQgdG8gY29tcGxldGUuICovCisJdHJpZ2dlcl91bmNvbmZpZ19mcihkZXYpOworCisJbG9ja19hZGFwdGVyX2lycSgmd2FuZGV2LT5sb2NrLCAmc21wX2ZsYWdzKTsKKwl3YW5kZXYtPm5ld19pZl9jbnQtLTsKKwl1bmxvY2tfYWRhcHRlcl9pcnEoJndhbmRldi0+bG9jaywgJnNtcF9mbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogZGlzYWJsZV9jb21tCisgKgorICogRGVzY3JpcHRpb246CisgKglEaXNhYmxlIGNvbW11bmljYXRpb25zLgorICogCVRoaXMgY29kZSBydW5zIGluIHNodXRkb3duIChzZGxhbWFpbi5jKQorICogICAgICB1bmRlciBjcml0aWNhbCBmbGFnLiBUaGVyZWZvcmUgaXQgaXMgbm90CisgKiAgICAgIG5lY2Vzc2FyeSB0byBzZXQgYSBjcml0aWNhbCBmbGFnIGhlcmUgCisgKgorICogVXNhZ2U6CisgKiAJQ29tbW51bmljYXRpb25zIGFyZSBkaXNhYmxlZCBvbmx5IG9uIGEgY2FyZAorICogICAgICBzaHV0ZG93bi4KKyAqLworCitzdGF0aWMgdm9pZCBkaXNhYmxlX2NvbW0gKHNkbGFfdCAqY2FyZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlczogRGlzYWJsaW5nIENvbW11bmljYXRpb25zIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUpOworCWZyX2NvbW1fZGlzYWJsZShjYXJkKTsKK30KKworLyoqKioqKiBXQU5QSVBFLXNwZWNpZmljIGVudHJ5IHBvaW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRXhlY3V0ZSBhZGFwdGVyIGludGVyZmFjZSBjb21tYW5kLgorICovCitzdGF0aWMgaW50IHdwZl9leGVjIChzdHJ1Y3Qgc2RsYSogY2FyZCwgdm9pZCogdV9jbWQsIHZvaWQqIHVfZGF0YSkKK3sKKwlmcl9tYm94X3QqIG1ib3ggPSBjYXJkLT5tYm94OworCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVyciwgbGVuOworCWZyX2NtZF90IGNtZDsKKworCWlmKGNvcHlfZnJvbV91c2VyKCh2b2lkKikmY21kLCB1X2NtZCwgc2l6ZW9mKGNtZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkKKwkvKiBleGVjdXRlIGNvbW1hbmQgKi8KKwlkbworCXsKKwkJbWVtY3B5KCZtYm94LT5jbWQsICZjbWQsIHNpemVvZihjbWQpKTsKKwkJCisJCWlmIChjbWQubGVuZ3RoKXsKKwkJCWlmKCBjb3B5X2Zyb21fdXNlcigodm9pZCopJm1ib3gtPmRhdGEsIHVfZGF0YSwgY21kLmxlbmd0aCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJCisJCWlmIChzZGxhX2V4ZWMobWJveCkpCisJCQllcnIgPSBtYm94LT5jbWQucmVzdWx0OworCisJCWVsc2UgcmV0dXJuIC1FSU87CisJCisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KSk7CisKKwkvKiByZXR1cm4gcmVzdWx0ICovCisJaWYgKGNvcHlfdG9fdXNlcih1X2NtZCwgKHZvaWQqKSZtYm94LT5jbWQsIHNpemVvZihmcl9jbWRfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWxlbiA9IG1ib3gtPmNtZC5sZW5ndGg7CisKKwlpZiAobGVuICYmIHVfZGF0YSAmJiAhY29weV90b191c2VyKHVfZGF0YSwgKHZvaWQqKSZtYm94LT5kYXRhLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKiBOZXR3b3JrIERldmljZSBJbnRlcmZhY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBMaW51eCBuZXR3b3JrIGludGVyZmFjZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIG9ubHkgb25jZSBmb3IgZWFjaCBpbnRlcmZhY2UsIGR1cmluZyBMaW51eCBuZXR3b3JrCisgKiBpbnRlcmZhY2UgcmVnaXN0cmF0aW9uLiAgUmV0dXJuaW5nIGFueXRoaW5nIGJ1dCB6ZXJvIHdpbGwgZmFpbCBpbnRlcmZhY2UKKyAqIHJlZ2lzdHJhdGlvbi4KKyAqLworc3RhdGljIGludCBpZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJZnJfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisJc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiA9ICZjYXJkLT53YW5kZXY7CisKKwkvKiBJbml0aWFsaXplIGRldmljZSBkcml2ZXIgZW50cnkgcG9pbnRzICovCisJZGV2LT5vcGVuCQk9ICZpZl9vcGVuOworCWRldi0+c3RvcAkJPSAmaWZfY2xvc2U7CisJZGV2LT5oYXJkX2hlYWRlcgk9IE5VTEw7CisJZGV2LT5yZWJ1aWxkX2hlYWRlcgk9ICZpZl9yZWJ1aWxkX2hkcjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9ICZpZl9zZW5kOworCWRldi0+Z2V0X3N0YXRzCQk9ICZpZl9zdGF0czsKKwlkZXYtPnR4X3RpbWVvdXQJCT0gJmlmX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwk9IFRYX1RJTUVPVVQ7CisJCisJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gV0FOUElQRSB8fCBjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSl7CisKKwkJLyogSW5pdGlhbGl6ZSBtZWRpYS1zcGVjaWZpYyBwYXJhbWV0ZXJzICovCisJCWlmIChjaGFuLT50cnVlX2lmX2VuY29kaW5nKXsKKwkJCWRldi0+dHlwZSAJCT0gQVJQSFJEX0RMQ0k7ICAvKiBUaGlzIGJyZWFrcyB0Y3BkdW1wICovCisJCX1lbHNleworCQkJZGV2LT50eXBlCQk9IEFSUEhSRF9QUFA7IAkvKiBBUlAgaC93IHR5cGUgKi8KKwkJfQorCQkKKwkJZGV2LT5mbGFncwkJfD0gSUZGX1BPSU5UT1BPSU5UOworCQlkZXYtPmZsYWdzCQl8PSBJRkZfTk9BUlA7CisKKwkJLyogRW5hYmxlIE11bHRpY2FzdCBhZGRyZXNzaW5nICovCisJCWlmIChjaGFuLT5tYyA9PSBXQU5PUFRfWUVTKXsKKwkJCWRldi0+ZmxhZ3MgCXw9IElGRl9NVUxUSUNBU1Q7CisJCX0KKworCQlkZXYtPm10dQkJPSB3YW5kZXYtPm10dSAtIEZSX0hFQURFUl9MRU47CisJCS8qIEZvciBhbiBBUEksIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IHRoZSBzdGFjayB3aWxsIHBhc3MKKwkJICAgdG8gdGhlIGRyaXZlciBpcyAoZGV2LT5tdHUgKyBkZXYtPmhhcmRfaGVhZGVyX2xlbikuIFNvLCBhZGp1c3QgdGhlCisJCSAgIG10dSBzbyB0aGF0IGEgZnJhbWUgb2YgbWF4aW11bSBzaXplIGNhbiBiZSB0cmFuc21pdHRlZCBieSB0aGUgQVBJLiAKKwkJKi8KKwkJaWYoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpIHsKKwkJCWRldi0+bXR1ICs9IChzaXplb2YoYXBpX3R4X2hkcl90KSAtIEZSX0hFQURFUl9MRU4pOworCQl9CisJCQorCQlkZXYtPmhhcmRfaGVhZGVyX2xlbgk9IEZSX0hFQURFUl9MRU47LyogbWVkaWEgaGVhZGVyIGxlbmd0aCAqLworCQlkZXYtPmFkZHJfbGVuCQk9IDI7IAkJLyogaGFyZHdhcmUgYWRkcmVzcyBsZW5ndGggKi8KKwkJKih1bnNpZ25lZCBzaG9ydCopZGV2LT5kZXZfYWRkciA9IGh0b25zKGNoYW4tPmRsY2kpOworCisJCS8qIFNldCB0cmFuc21pdCBidWZmZXIgcXVldWUgbGVuZ3RoICovCisgICAgICAgIAlkZXYtPnR4X3F1ZXVlX2xlbiA9IDEwMDsKKworCX1lbHNleworCisJCS8qIFNldHVwIHRoZSBpbnRlcmZhY2UgZm9yIEJyaWRnaW5nICovCisJCWludCBod19hZGRyPTA7CisJCWV0aGVyX3NldHVwKGRldik7CisJCQorCQkvKiBVc2UgYSByYW5kb20gbnVtYmVyIHRvIGdlbmVyYXRlIHRoZSBNQUMgYWRkcmVzcyAqLworCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgIlx4RkVceEZDXHgwMFx4MDBceDAwXHgwMCIsIDYpOworCQlnZXRfcmFuZG9tX2J5dGVzKCZod19hZGRyLCBzaXplb2YoaHdfYWRkcikpOworCQkqKGludCAqKShkZXYtPmRldl9hZGRyICsgMikgKz0gaHdfYWRkcjsKKwl9CisJCQorCS8qIEluaXRpYWxpemUgaGFyZHdhcmUgcGFyYW1ldGVycyAoanVzdCBmb3IgcmVmZXJlbmNlKSAqLworCWRldi0+aXJxCT0gd2FuZGV2LT5pcnE7CisJZGV2LT5kbWEJPSB3YW5kZXYtPmRtYTsKKwlkZXYtPmJhc2VfYWRkcgk9IHdhbmRldi0+aW9wb3J0OworCWRldi0+bWVtX3N0YXJ0CT0gd2FuZGV2LT5tYWRkcjsKKwlkZXYtPm1lbV9lbmQJPSB3YW5kZXYtPm1hZGRyICsgd2FuZGV2LT5tc2l6ZSAtIDE7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogT3BlbiBuZXR3b3JrIGludGVyZmFjZS4KKyAqIG8gaWYgdGhpcyBpcyB0aGUgZmlyc3Qgb3BlbiwgdGhlbiBlbmFibGUgY29tbXVuaWNhdGlvbnMgYW5kIGludGVycnVwdHMuCisgKiBvIHByZXZlbnQgbW9kdWxlIGZyb20gdW5sb2FkaW5nIGJ5IGluY3JlbWVudGluZyB1c2UgY291bnQKKyAqCisgKiBSZXR1cm4gMCBpZiBPLmsuIG9yIGVycm5vLgorICovCitzdGF0aWMgaW50IGlmX29wZW4oc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlmcl9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90KiBjYXJkID0gY2hhbi0+Y2FyZDsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUJVU1k7CisJCisJLyogSW5pdGlhbGl6ZSB0aGUgdGFzayBxdWV1ZSAqLworCWNoYW4tPnRxX3dvcmtpbmc9MDsKKworCUlOSVRfV09SSygmY2hhbi0+Y29tbW9uLndhbnBpcGVfd29yaywgKHZvaWQgKilmcl9iaCwgZGV2KTsKKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIEJIIGNpcmN1bGFyIGJ1ZmZlciAqLworCWNoYW4tPmJoX2hlYWQgPSBrbWFsbG9jKChzaXplb2YoYmhfZGF0YV90KSpNQVhfQkhfQlVGRiksR0ZQX0FUT01JQyk7CisJbWVtc2V0KGNoYW4tPmJoX2hlYWQsMCwoc2l6ZW9mKGJoX2RhdGFfdCkqTUFYX0JIX0JVRkYpKTsKKwlhdG9taWNfc2V0KCZjaGFuLT5iaF9idWZmX3VzZWQsIDApOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXdhbnBpcGVfb3BlbihjYXJkKTsKKwlkb19nZXR0aW1lb2ZkYXkoICZ0diApOworCWNoYW4tPnJvdXRlcl9zdGFydF90aW1lID0gdHYudHZfc2VjOworCQorCWlmICh0ZXN0X2JpdCgwLCZjaGFuLT5jb25maWdfZGxjaSkpeworCQl0cmlnZ2VyX2NvbmZpZ19mciAoY2FyZCk7CisJfWVsc2UgaWYgKGNoYW4tPmluYXJwID09IElOQVJQX1JFUVVFU1QpeworCQl0cmlnZ2VyX2ZyX2FycChkZXYpOworCX0KKwkKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENsb3NlIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyBpZiB0aGlzIGlzIHRoZSBsYXN0IG9wZW4sIHRoZW4gZGlzYWJsZSBjb21tdW5pY2F0aW9ucyBhbmQgaW50ZXJydXB0cy4KKyAqIG8gcmVzZXQgZmxhZ3MuCisgKi8KK3N0YXRpYyBpbnQgaWZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwlmcl9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90KiBjYXJkID0gY2hhbi0+Y2FyZDsKKworCWlmIChjaGFuLT5pbmFycCA9PSBJTkFSUF9DT05GSUdVUkVEKSB7CisJCWNoYW4tPmluYXJwID0gSU5BUlBfUkVRVUVTVDsKKwl9CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJd2FucGlwZV9jbG9zZShjYXJkKTsKKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlLWJ1aWxkIG1lZGlhIGhlYWRlci4KKyAqCisgKiBSZXR1cm46CTEJcGh5c2ljYWwgYWRkcmVzcyByZXNvbHZlZC4KKyAqCQkwCXBoeXNpY2FsIGFkZHJlc3Mgbm90IHJlc29sdmVkCisgKi8KK3N0YXRpYyBpbnQgaWZfcmVidWlsZF9oZHIgKHN0cnVjdCBza19idWZmKiBza2IpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCWZyX2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzZGxhX3QqIGNhcmQgPSBjaGFuLT5jYXJkOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlYnVpbGRfaGVhZGVyKCkgY2FsbGVkIGZvciBpbnRlcmZhY2UgJXMhXG4iLAorCQljYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUpOworCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEhhbmRsZSB0cmFuc21pdCB0aW1lb3V0IGV2ZW50IGZyb20gbmV0aWYgd2F0Y2hkb2cKKyAqLworc3RhdGljIHZvaWQgaWZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIAlmcl9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90ICpjYXJkID0gY2hhbi0+Y2FyZDsKKworCS8qIElmIG91ciBkZXZpY2Ugc3RheXMgYnVzeSBmb3IgYXQgbGVhc3QgNSBzZWNvbmRzIHRoZW4gd2Ugd2lsbAorCSAqIGtpY2sgc3RhcnQgdGhlIGRldmljZSBieSBtYWtpbmcgZGV2LT50YnVzeSA9IDAuICBXZSBleHBlY3QKKwkgKiB0aGF0IG91ciBkZXZpY2UgbmV2ZXIgc3RheXMgYnVzeSBtb3JlIHRoYW4gNSBzZWNvbmRzLiBTbyB0aGlzICAgICAgICAgICAgICAgICAKKwkgKiBpcyBvbmx5IHVzZWQgYXMgYSBsYXN0IHJlc29ydC4KKwkgKi8KKworCWNoYW4tPmRydnN0YXRzX2lmX3NlbmQuaWZfc2VuZF90YnVzeSsrOworCSsrY2hhbi0+aWZzdGF0cy5jb2xsaXNpb25zOworCisJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQgb24gJXNcbiIsIAorCQkJY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lKTsKKwljaGFuLT5kcnZzdGF0c19pZl9zZW5kLmlmX3NlbmRfdGJ1c3lfdGltZW91dCsrOworCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgYSBwYWNrZXQgb24gYSBuZXR3b3JrIGludGVyZmFjZS4KKyAqIG8gc2V0IHRidXN5IGZsYWcgKG1hcmtzIHN0YXJ0IG9mIHRoZSB0cmFuc21pc3Npb24pIHRvIGJsb2NrIGEgdGltZXItYmFzZWQKKyAqICAgdHJhbnNtaXQgZnJvbSBvdmVybGFwcGluZy4KKyAqIG8gc2V0IGNyaXRpY2FsIGZsYWcgd2hlbiBhY2Nlc3NpbmcgYm9hcmQuCisgKiBvIGNoZWNrIGxpbmsgc3RhdGUuIElmIGxpbmsgaXMgbm90IHVwLCB0aGVuIGRyb3AgdGhlIHBhY2tldC4KKyAqIG8gY2hlY2sgY2hhbm5lbCBzdGF0dXMuIElmIGl0J3MgZG93biB0aGVuIGluaXRpYXRlIGEgY2FsbC4KKyAqIG8gcGFzcyBhIHBhY2tldCB0byBjb3JyZXNwb25kaW5nIFdBTiBkZXZpY2UuCisgKiBvIGZyZWUgc29ja2V0IGJ1ZmZlcgorICoKKyAqIFJldHVybjoJMAljb21wbGV0ZSAoc29ja2V0IGJ1ZmZlciBtdXN0IGJlIGZyZWVkKQorICoJCW5vbi0wCXBhY2tldCBtYXkgYmUgcmUtdHJhbnNtaXR0ZWQgKHRidXN5IG11c3QgYmUgc2V0KQorICoKKyAqIE5vdGVzOgorICogMS4gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBlaXRoZXIgYnkgdGhlIHByb3RvY29sIHN0YWNrIG9yIGJ5IHRoZSAibmV0CisgKiAgICBib3R0b20gaGFsZiIgKHdpdGggaW50ZXJydXB0cyBlbmFibGVkKS4KKyAqIAorICogMi4gVXNpbmcgbmV0aWZfc3RhcnRfcXVldWUoKSBhbmQgbmV0aWZfc3RvcF9xdWV1ZSgpCisgKiAgICB3aWxsIGluaGliaXQgZnVydGhlciB0cmFuc21pdCByZXF1ZXN0cyBmcm9tIHRoZSBwcm90b2NvbCBzdGFjayAKKyAqICAgIGFuZCBjYW4gYmUgdXNlZCBmb3IgZmxvdyBjb250cm9sIHdpdGggcHJvdG9jb2wgbGF5ZXIuCisgKi8KK3N0YXRpYyBpbnQgaWZfc2VuZChzdHJ1Y3Qgc2tfYnVmZiogc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworICAgIAlmcl9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisgICAgCXNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisgICAgICAgIGludCBlcnI7CisgICAgCXVuc2lnbmVkIGNoYXIgKnNlbmRwYWNrZXQ7CisgICAgCWZyNTA4X2ZsYWdzX3QqIGFkcHRyX2ZsYWdzID0gY2FyZC0+ZmxhZ3M7CisJaW50IHVkcF90eXBlOworCWxvbmcgZGVsYXlfdHhfcXVldWVkID0gMDsKKwl1bnNpZ25lZCBsb25nIHNtcF9mbGFncz0wOworCXVuc2lnbmVkIGNoYXIgYXR0ciA9IDA7CisKKwljaGFuLT5kcnZzdGF0c19pZl9zZW5kLmlmX3NlbmRfZW50cnkrKzsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkKKyAgICAgICAgaWYgKHNrYiA9PSBOVUxMKSB7ICAgICAgICAgICAgIAorCQkvKiBpZiB3ZSBnZXQgaGVyZSwgc29tZSBoaWdoZXIgbGF5ZXIgdGhpbmtzIHdlJ3ZlIG1pc3NlZCBhbgorCQkgKiB0eC1kb25lIGludGVycnVwdC4KKwkJICovCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnRlcmZhY2UgJXMgZ290IGtpY2tlZCFcbiIsIAorCQkJY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lKTsKKwkJY2hhbi0+ZHJ2c3RhdHNfaWZfc2VuZC5pZl9zZW5kX3NrYl9udWxsICsrOworCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSWYgYSBwZXJpcGhlcmFsIHRhc2sgaXMgcnVubmluZyBqdXN0IGRyb3AgcGFja2V0cyAqLworCWlmICh0ZXN0X2JpdChQRVJJX0NSSVQsICZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDcml0aWNhbCBpbiBpZl9zZW5kKCk6IFBlcmlwaGVyYWwgcnVubmluZyFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQorCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBXZSBtdXN0IHNldCB0aGUgJ3RidXN5JyBmbGFnIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHBhY2tldCBxdWV1ZWQgZm9yCisJICAgdHJhbnNtaXNzaW9uIGluIHRoZSB0cmFuc21pdCBpbnRlcnJ1cHQgaGFuZGxlci4gSG93ZXZlciwgd2UgbXVzdAorCSAgIGVuc3VyZSB0aGF0IHRoZSB0cmFuc21pdCBpbnRlcnJ1cHQgZG9lcyBub3QgcmVzZXQgdGhlICd0YnVzeScgZmxhZworCSAgIGp1c3QgYmVmb3JlIHdlIHNldCBpdCwgYXMgdGhpcyB3aWxsIHJlc3VsdCBpbiBhICJ0cmFuc21pdCB0aW1lb3V0Ii4KKwkqLworCXNldF9iaXQoU0VORF9UWElSUV9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisgICAgICAgIGlmKGNoYW4tPnRyYW5zbWl0X2xlbmd0aCkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCWNoYW4tPnRpY2tfY291bnRlciA9IGppZmZpZXM7CisgCQljbGVhcl9iaXQoU0VORF9UWElSUV9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJCXJldHVybiAxOworCX0KKyAgICAgICAJY2xlYXJfYml0KFNFTkRfVFhJUlFfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworIAorCS8qIE1vdmUgdGhlIGlmX2hlYWRlcigpIGNvZGUgdG8gaGVyZS4gQnkgaW5zZXJ0aW5nIGZyYW1lCisJICogcmVsYXkgaGVhZGVyIGluIGlmX2hlYWRlcigpIHdlIHdvdWxkIGJyZWFrIHRoZQorCSAqIHRjcGR1bXAgYW5kIG90aGVyIHBhY2tldCBzbmlmZmVycyAqLworCWNoYW4tPmZyX2hlYWRlcl9sZW4gPSBzZXR1cF9mcl9oZWFkZXIoJnNrYixkZXYsY2hhbi0+Y29tbW9uLnVzZWRieSk7CisJaWYgKGNoYW4tPmZyX2hlYWRlcl9sZW4gPCAwICl7CisJCSsrY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkOworCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQkKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsJCisJCXJldHVybiAwOworCX0KKworCXNlbmRwYWNrZXQgPSBza2ItPmRhdGE7CisKKwl1ZHBfdHlwZSA9IHVkcF9wa3RfdHlwZShza2IsIGNhcmQpOworCisgICAgICAgIGlmKHVkcF90eXBlICE9IFVEUF9JTlZBTElEX1RZUEUpIHsKKwkJaWYoc3RvcmVfdWRwX21nbXRfcGt0KHVkcF90eXBlLCBVRFBfUEtUX0ZSTV9TVEFDSywgY2FyZCwgc2tiLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbi0+ZGxjaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkcHRyX2ZsYWdzLT5pbWFzayB8PSBGUl9JTlRSX1RJTUVSOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVkcF90eXBlID09IFVEUF9GUElQRV9UWVBFKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbi0+ZHJ2c3RhdHNfaWZfc2VuZC4KKwkJCQkJaWZfc2VuZF9QSVBFX3JlcXVlc3QgKys7CisJCQl9CisgICAgICAgICAgICAgICAgfQorCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvL0ZJWE1FOiBjYW4gd2UgZG8gYmV0dGVyIHRoYW4gc2VuZHBhY2tldFsyXT8KKyAgCWlmICgoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBXQU5QSVBFKSAmJiAoc2VuZHBhY2tldFsyXSA9PSAweDQ1KSkgeworCQkKKyAgICAgICAgICAgICAgIAkvKiBjaGVjayB0byBzZWUgaWYgdGhlIHNvdXJjZSBJUCBhZGRyZXNzIGlzIGEgYnJvYWRjYXN0IG9yICovCisgICAgICAgICAgICAgICAgLyogbXVsdGljYXN0IElQIGFkZHJlc3MgKi8KKyAgICAgICAgICAgICAgICBpZihjaGtfYmNhc3RfbWNhc3RfYWRkcihjYXJkLCBkZXYsIHNrYikpeworICAgICAgICAgICAgCQkrK2NoYW4tPmlmc3RhdHMudHhfZHJvcHBlZDsKKwkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisgICAgICAgICAgICAgICAgCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkKKwkvKiBMb2NrIHRoZSBTNTE0L1M1MDggY2FyZDogU01QIFN1cHBvcnRlZCAqLworICAgIAlzNTA4X3M1MTRfbG9jayhjYXJkLCZzbXBfZmxhZ3MpOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoU0VORF9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpIHsKKwkJCisJCWNoYW4tPmRydnN0YXRzX2lmX3NlbmQuaWZfc2VuZF9jcml0aWNhbF9ub25fSVNSICsrOworCQljaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQgKys7CisJCXByaW50ayhLRVJOX0lORk8gIiVzIENyaXRpY2FsIGluIElGX1NFTkQ6IGlmX3NlbmQoKSBhbHJlYWR5IHJ1bm5pbmchXG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJZ290byBpZl9zZW5kX3N0YXJ0X2FuZF9leGl0OworCX0KKwkKKwkvKiBBUEkgcGFja2V0IGNoZWNrOiBtaW5pbXVtIHBhY2tldCBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIAorCSAqIDE2IGJ5dGUgQVBJIGhlYWRlciAqLworCWlmKChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSkgJiYgKHNrYi0+bGVuIDw9IHNpemVvZihhcGlfdHhfaGRyX3QpKSkgeworCQkrK2NoYW4tPmlmc3RhdHMudHhfZHJvcHBlZDsKKwkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkgICAgCisJCQorCQlnb3RvIGlmX3NlbmRfc3RhcnRfYW5kX2V4aXQ7CisKKyAJfWVsc2V7CisJCS8qIER1cmluZyBBUEkgdHJhbnNtaXNzaW9uLCBnZXQgcmlkIG9mIHRoZSBBUEkgaGVhZGVyICovCisJCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSkgeworCQkJYXBpX3R4X2hkcl90KiBhcGlfdHhfaGRyOworCQkJYXBpX3R4X2hkciA9IChhcGlfdHhfaGRyX3QqKSZza2ItPmRhdGFbMHgwMF07CisJCQlhdHRyID0gYXBpX3R4X2hkci0+YXR0cjsKKwkJCXNrYl9wdWxsKHNrYixzaXplb2YoYXBpX3R4X2hkcl90KSk7CisJCX0KKwl9CisKKwlpZiAoY2FyZC0+d2FuZGV2LnN0YXRlICE9IFdBTl9DT05ORUNURUQpIHsKKwkJY2hhbi0+ZHJ2c3RhdHNfaWZfc2VuZC5pZl9zZW5kX3dhbl9kaXNjb25uZWN0ZWQgKys7CisJCSsrY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkOworICAgICAgICAJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkKKwl9IGVsc2UgaWYgKGNoYW4tPmNvbW1vbi5zdGF0ZSAhPSBXQU5fQ09OTkVDVEVEKSB7CisJCWNoYW4tPmRydnN0YXRzX2lmX3NlbmQuaWZfc2VuZF9kbGNpX2Rpc2Nvbm5lY3RlZCArKzsKKworCQkvKiBVcGRhdGUgdGhlIERMQ0kgc3RhdGUgaW4gdGltZXIgaW50ZXJydXB0ICovCisJCWNhcmQtPnUuZi50aW1lcl9pbnRfZW5hYmxlZCB8PSBUTVJfSU5UX0VOQUJMRURfVVBEQVRFX1NUQVRFOwkKKwkJYWRwdHJfZmxhZ3MtPmltYXNrIHw9IEZSX0lOVFJfVElNRVI7CisKKyAgICAgICAgCSsrY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkOworICAgICAgICAJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJCisJfSBlbHNlIGlmICghaXNfdHhfcmVhZHkoY2FyZCwgY2hhbikpIHsKKwkJLyogTm8gdHggYnVmZmVycyBhdmFpbGFibGUsIHN0b3JlIGZvciBkZWxheWVkIHRyYW5zbWl0ICovCisJCWlmICghc2V0dXBfZm9yX2RlbGF5ZWRfdHJhbnNtaXQoZGV2LCBza2IpKXsKKwkJCXNldF9iaXQoMSwmZGVsYXlfdHhfcXVldWVkKTsKKwkJfQorCQljaGFuLT5kcnZzdGF0c19pZl9zZW5kLmlmX3NlbmRfbm9fYmZycysrOworCQkKKwl9IGVsc2UgaWYgKCFza2ItPnByb3RvY29sKSB7CisJCS8qIE5vIHByb3RvY29scyBkcm9wIHBhY2tldCAqLworCQljaGFuLT5kcnZzdGF0c19pZl9zZW5kLmlmX3NlbmRfcHJvdG9jb2xfZXJyb3IgKys7CisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Vycm9yczsKKwkKKwl9IGVsc2UgaWYgKHRlc3RfYml0KEFSUF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJLyogV2UgYXJlIHRyeWluZyB0byBzZW5kIGFuIEFSUCBQYWNrZXQsIGJsb2NrIElQIGRhdGEgdW50aWwKKwkJICogQVJQIGlzIHNlbnQgKi8KKwkJKytjaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQ7CisgICAgICAgIAkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQkKKwl9IGVsc2UgeworCQkvL0ZJWE1FOiBJUFggaXMgbm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiBvZiBGcmFtZSBSZWxheSA/CisJCWlmKChjaGFuLT5jb21tb24udXNlZGJ5ID09IFdBTlBJUEUpICYmCisJCSAJc2VuZHBhY2tldFsxXSA9PSAweDAwICYmCisJCSAgICAJc2VuZHBhY2tldFsyXSA9PSAweDgwICYmCisJCSAgICAJc2VuZHBhY2tldFs2XSA9PSAweDgxICYmCisJCSAgICAJc2VuZHBhY2tldFs3XSA9PSAweDM3KSB7CisJCQkKKwkJCWlmKCBjaGFuLT5lbmFibGVfSVBYICkgeworCQkJCXN3aXRjaF9uZXRfbnVtYmVycyhzZW5kcGFja2V0LCAKKwkJCQkJCWNoYW4tPm5ldHdvcmtfbnVtYmVyLCAwKTsKKwkJCX0gZWxzZSB7CisJCQkJLy9GSVhNRTogVGFrZSB0aGlzIG91dCB3aGVuIElQWCBpcyBmaXhlZCAKKwkJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogV0FSTklORzogVW5zdXBwb3J0ZWQgSVBYIGRhdGEgaW4gc2VuZCwgcGFja2V0IGRyb3BwZWRcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJfQorCQkJCisJCX1lbHNleworICAgICAgICAJCWVyciA9IGZyX3NlbmRfZGF0YV9oZWFkZXIoY2FyZCwgY2hhbi0+ZGxjaSwgYXR0ciwgc2tiLT5sZW4sIHNrYi0+ZGF0YSwgY2hhbi0+ZnJfaGVhZGVyX2xlbik7CisJCQlpZiAoZXJyKSB7CisJCQkJc3dpdGNoKGVycikgeworCQkJCWNhc2UgRlJSRVNfQ0lSX09WRVJGTE9XOgorCQkJCWNhc2UgRlJSRVNfQlVGRkVSX09WRVJGTE9XOgorICAgICAgICAgICAgICAgIAkJCWlmICghc2V0dXBfZm9yX2RlbGF5ZWRfdHJhbnNtaXQoZGV2LCBza2IpKXsKKwkJCQkJCXNldF9iaXQoMSwmZGVsYXlfdHhfcXVldWVkKTsKKwkJCQkJfQorICAgICAgICAgICAJCQkJY2hhbi0+ZHJ2c3RhdHNfaWZfc2VuZC4KKwkJCQkJCWlmX3NlbmRfYWRwdHJfYmZyc19mdWxsICsrOworCQkJCQlicmVhazsKKwkJCQkJCisJCQkJY2FzZSBGUlJFU19UT09fTE9ORzoKKwkJCQkJaWYgKG5ldF9yYXRlbGltaXQoKSl7CisJCQkJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCQkJIiVzOiBFcnJvcjogRnJhbWUgdG9vIGxvbmcsIHRyYW5zbWlzc2lvbiBmYWlsZWQgJWlcbiIsCisJCQkJCQkgY2FyZC0+ZGV2bmFtZSwgKHVuc2lnbmVkIGludClza2ItPmxlbik7CisJCQkJCX0KKwkJCQkJLyogRHJvcCBkb3duIHRvIGRlZmF1bHQgKi8KKwkJCQlkZWZhdWx0OgorCQkJCQljaGFuLT5kcnZzdGF0c19pZl9zZW5kLgorCQkJCQkJaWZfc2VuZF9kbGNpX2Rpc2Nvbm5lY3RlZCArKzsKKyAgICAgICAgCQkJCSsrY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkOworICAgICAgICAJCQkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQljaGFuLT5kcnZzdGF0c19pZl9zZW5kLgorCQkJCQlpZl9zZW5kX2Jmcl9wYXNzZWRfdG9fYWRwdHIrKzsKKwkJCQkrK2NoYW4tPmlmc3RhdHMudHhfcGFja2V0czsKKwkJCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9wYWNrZXRzOworCQkJCQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuLT5pZnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT53YW5kZXYuc3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQl9CisJCX0KKwl9CisKK2lmX3NlbmRfc3RhcnRfYW5kX2V4aXQ6CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQorCS8qIElmIHdlIHF1ZXVlZCB0aGUgcGFja2V0IGZvciB0cmFuc21pc3Npb24sIHdlIG11c3Qgbm90CisJICogZGVhbGxvY2F0ZSBpdC4gVGhlIHBhY2tldCBpcyB1bmxpbmtlZCBmcm9tIHRoZSBJUCBzdGFjaworCSAqIG5vdCBjb3BpZWQuIFRoZXJlZm9yZSwgd2UgbXVzdCBrZWVwIHRoZSBvcmlnaW5hbCBwYWNrZXQgKi8KKwlpZiAoIXRlc3RfYml0KDEsJmRlbGF5X3R4X3F1ZXVlZCkpIHsKKyAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX1lbHNleworCQlhZHB0cl9mbGFncy0+aW1hc2sgfD0gRlJfSU5UUl9UWFJEWTsKKwkJY2FyZC0+dS5mLnR4X2ludGVycnVwdHNfcGVuZGluZyArKzsKKwl9CisKKyAgICAgICAgY2xlYXJfYml0KFNFTkRfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCisJczUwOF9zNTE0X3VubG9jayhjYXJkLCZzbXBfZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldHVwIHNvIHRoYXQgYSBmcmFtZSBjYW4gYmUgdHJhbnNtaXR0ZWQgb24gdGhlIG9jY3VycmVuY2Ugb2YgYSB0cmFuc21pdAorICogaW50ZXJydXB0LgorICovCitzdGF0aWMgaW50IHNldHVwX2Zvcl9kZWxheWVkX3RyYW5zbWl0KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyAgICAgICAgZnJfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworICAgICAgICBzZGxhX3QqIGNhcmQgPSBjaGFuLT5jYXJkOworICAgICAgICBmcl9kbGNpX2ludGVyZmFjZV90KiBkbGNpX2ludGVyZmFjZTsKKwlpbnQgbGVuID0gc2tiLT5sZW47CisKKwkvKiBDaGVjayB0aGF0IHRoZSBkbGNpIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQsCisgICAgICAgICAqIGJlZm9yZSB1c2luZyB0eCBpbnRlcnJ1cHQgKi8KKwlpZiAoIWNoYW4tPmRsY2lfaW50X2ludGVyZmFjZSl7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpeyAKKwkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBFUlJPUiBvbiBETENJICVpOiBOb3QgY29uZmlndXJlZCBwcm9wZXJseSAhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lLCBjaGFuLT5kbGNpKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQbGVhc2UgY29udGFjdCBTYW5nb21hIFRlY2hub2xvZ2llc1xuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCQkKKwlkbGNpX2ludGVyZmFjZSA9IGNoYW4tPmRsY2lfaW50X2ludGVyZmFjZTsKKworICAgICAgICBpZihjaGFuLT50cmFuc21pdF9sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogQmlnIG1lc3MgaW4gc2V0dXBfZm9yX2RlbC4uLlxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisJaWYobGVuID4gRlJfTUFYX05PX0RBVEFfQllURVNfSU5fRlJBTUUpIHsKKwkJLy9GSVhNRTogaW5jcmVtZW50IHNvbWUgc3RhdGlzdGljICovCisJCXJldHVybiAxOworCX0KKworCXNrYl91bmxpbmsoc2tiKTsKKwkKKyAgICAgICAgY2hhbi0+dHJhbnNtaXRfbGVuZ3RoID0gbGVuOworCWNoYW4tPmRlbGF5X3NrYiA9IHNrYjsKKyAgICAgICAgCisgICAgICAgIGRsY2lfaW50ZXJmYWNlLT5nZW5faW50ZXJydXB0IHw9IEZSX0lOVFJfVFhSRFk7CisgICAgICAgIGRsY2lfaW50ZXJmYWNlLT5wYWNrZXRfbGVuZ3RoID0gbGVuOworCisJLyogVHVybiBvbiBUWCBpbnRlcnJ1cHQgYXQgdGhlIGVuZCBvZiBpZl9zZW5kICovCisJcmV0dXJuIDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDaGVjayB0byBzZWUgaWYgdGhlIHBhY2tldCB0byBiZSB0cmFuc21pdHRlZCBjb250YWlucyBhIGJyb2FkY2FzdCBvcgorICogbXVsdGljYXN0IHNvdXJjZSBJUCBhZGRyZXNzLgorICogUmV0dXJuIDAgaWYgbm90IGJyb2FkY2FzdC9tdWx0aWNhc3QgYWRkcmVzcywgb3RoZXJ3aXNlIHJldHVybiAxLgorICovCisKK3N0YXRpYyBpbnQgY2hrX2JjYXN0X21jYXN0X2FkZHIoc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworICAgICAgICB1MzIgc3JjX2lwX2FkZHI7CisgICAgICAgIHUzMiBicm9hZGNhc3RfaXBfYWRkciA9IDA7CisgICAgICAgIHN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKyAgICAgICAgZnJfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworIAorICAgICAgICAvKiByZWFkIHRoZSBJUCBzb3VyY2UgYWRkcmVzcyBmcm9tIHRoZSBvdXRnb2luZyBwYWNrZXQgKi8KKyAgICAgICAgc3JjX2lwX2FkZHIgPSAqKHUzMiAqKShza2ItPmRhdGEgKyAxNCk7CisKKyAgICAgICAgLyogcmVhZCB0aGUgSVAgYnJvYWRjYXN0IGFkZHJlc3MgZm9yIHRoZSBkZXZpY2UgKi8KKyAgICAgICAgaW5fZGV2ID0gZGV2LT5pcF9wdHI7CisgICAgICAgIGlmKGluX2RldiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IGluX2lmYWRkciAqaWZhPSBpbl9kZXYtPmlmYV9saXN0OworICAgICAgICAgICAgICAgIGlmKGlmYSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0X2lwX2FkZHIgPSBpZmEtPmlmYV9icm9hZGNhc3Q7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBjaGVjayBpZiB0aGUgSVAgU291cmNlIEFkZHJlc3MgaXMgYSBCcm9hZGNhc3QgYWRkcmVzcyAqLworICAgICAgICBpZigoZGV2LT5mbGFncyAmIElGRl9CUk9BRENBU1QpICYmIChzcmNfaXBfYWRkciA9PSBicm9hZGNhc3RfaXBfYWRkcikpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPCisgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IEJyb2FkY2FzdCBTb3VyY2UgQWRkcmVzcyBzaWxlbnRseSBkaXNjYXJkZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNoZWNrIGlmIHRoZSBJUCBTb3VyY2UgQWRkcmVzcyBpcyBhIE11bHRpY2FzdCBhZGRyZXNzICovCisgICAgICAgIGlmKChjaGFuLT5tYyA9PSBXQU5PUFRfTk8pICYmIChudG9obChzcmNfaXBfYWRkcikgPj0gMHhFMDAwMDAwMSkgJiYKKyAgICAgICAgICAgICAgICAobnRvaGwoc3JjX2lwX2FkZHIpIDw9IDB4RkZGRkZGRkUpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTworICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBNdWx0aWNhc3QgU291cmNlIEFkZHJlc3Mgc2lsZW50bHkgZGlzY2FyZGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZXBseSB0byBVRFAgTWFuYWdlbWVudCBzeXN0ZW0uCisgKiBSZXR1cm4gbm90aGluZy4KKyAqLworc3RhdGljIGludCByZXBseV91ZHAoIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBtYm94X2xlbiApIAoreworCXVuc2lnbmVkIHNob3J0IGxlbiwgdWRwX2xlbmd0aCwgdGVtcCwgaXBfbGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgaXBfdGVtcDsKKwlpbnQgZXZlbl9ib3VuZCA9IDA7CisKKyAgCisJZnJfdWRwX3BrdF90ICpmcl91ZHBfcGt0ID0gKGZyX3VkcF9wa3RfdCAqKWRhdGE7IAorCisJLyogU2V0IGxlbmd0aCBvZiBwYWNrZXQgKi8KKwlsZW4gPSAvL3NpemVvZihmcl9lbmNhcF9oZHJfdCkrCisJICAgICAgc2l6ZW9mKGlwX3BrdF90KSsgCisJICAgICAgc2l6ZW9mKHVkcF9wa3RfdCkrCisJICAgICAgc2l6ZW9mKHdwX21nbXRfdCkrCisJICAgICAgc2l6ZW9mKGNibG9ja190KSsKKwkgICAgICBtYm94X2xlbjsKKyAKKworCS8qIGZpbGwgaW4gVURQIHJlcGx5ICovCisJZnJfdWRwX3BrdC0+d3BfbWdtdC5yZXF1ZXN0X3JlcGx5ID0gVURQTUdNVF9SRVBMWTsKKyAgCisJLyogZmlsbCBpbiBVRFAgbGVuZ3RoICovCisJdWRwX2xlbmd0aCA9IHNpemVvZih1ZHBfcGt0X3QpKyAKKwkJICAgICBzaXplb2Yod3BfbWdtdF90KSsKKwkJICAgICBzaXplb2YoY2Jsb2NrX3QpKworCQkgICAgIG1ib3hfbGVuOyAKKworCisJLyogcHV0IGl0IG9uIGFuIGV2ZW4gYm91bmRhcnkgKi8KKwlpZiAoIHVkcF9sZW5ndGggJiAweDAwMDEgKSB7CisJCXVkcF9sZW5ndGggKz0gMTsKKwkJbGVuICs9IDE7CisJCWV2ZW5fYm91bmQgPSAxOworCX0KKworCXRlbXAgPSAodWRwX2xlbmd0aDw8OCl8KHVkcF9sZW5ndGg+PjgpOworCWZyX3VkcF9wa3QtPnVkcF9wa3QudWRwX2xlbmd0aCA9IHRlbXA7CisJIAorCS8qIHN3YXAgVURQIHBvcnRzICovCisJdGVtcCA9IGZyX3VkcF9wa3QtPnVkcF9wa3QudWRwX3NyY19wb3J0OworCWZyX3VkcF9wa3QtPnVkcF9wa3QudWRwX3NyY19wb3J0ID0gCisJCQlmcl91ZHBfcGt0LT51ZHBfcGt0LnVkcF9kc3RfcG9ydDsgCisJZnJfdWRwX3BrdC0+dWRwX3BrdC51ZHBfZHN0X3BvcnQgPSB0ZW1wOworCisKKworCS8qIGFkZCBVRFAgcHNldWRvIGhlYWRlciAqLworCXRlbXAgPSAweDExMDA7CisJKigodW5zaWduZWQgc2hvcnQgKikKKwkJKGZyX3VkcF9wa3QtPmRhdGErbWJveF9sZW4rZXZlbl9ib3VuZCkpID0gdGVtcDsJCisJdGVtcCA9ICh1ZHBfbGVuZ3RoPDw4KXwodWRwX2xlbmd0aD4+OCk7CisJKigodW5zaWduZWQgc2hvcnQgKikKKwkJKGZyX3VkcF9wa3QtPmRhdGErbWJveF9sZW4rZXZlbl9ib3VuZCsyKSkgPSB0ZW1wOworCQkgCisJLyogY2FsY3VsYXRlIFVEUCBjaGVja3N1bSAqLworCWZyX3VkcF9wa3QtPnVkcF9wa3QudWRwX2NoZWNrc3VtID0gMDsKKworCWZyX3VkcF9wa3QtPnVkcF9wa3QudWRwX2NoZWNrc3VtID0gCisJCWNhbGNfY2hlY2tzdW0oJmRhdGFbVURQX09GRlNFVC8qK3NpemVvZihmcl9lbmNhcF9oZHJfdCkqL10sCisJCQkgICAgICB1ZHBfbGVuZ3RoK1VEUF9PRkZTRVQpOworCisJLyogZmlsbCBpbiBJUCBsZW5ndGggKi8KKwlpcF9sZW5ndGggPSB1ZHBfbGVuZ3RoICsgc2l6ZW9mKGlwX3BrdF90KTsKKwl0ZW1wID0gKGlwX2xlbmd0aDw8OCl8KGlwX2xlbmd0aD4+OCk7CisJZnJfdWRwX3BrdC0+aXBfcGt0LnRvdGFsX2xlbmd0aCA9IHRlbXA7CisgIAorCS8qIHN3YXAgSVAgYWRkcmVzc2VzICovCisJaXBfdGVtcCA9IGZyX3VkcF9wa3QtPmlwX3BrdC5pcF9zcmNfYWRkcmVzczsKKwlmcl91ZHBfcGt0LT5pcF9wa3QuaXBfc3JjX2FkZHJlc3MgPSAKKwkJCQlmcl91ZHBfcGt0LT5pcF9wa3QuaXBfZHN0X2FkZHJlc3M7CisJZnJfdWRwX3BrdC0+aXBfcGt0LmlwX2RzdF9hZGRyZXNzID0gaXBfdGVtcDsKKworCQkgCisJLyogZmlsbCBpbiBJUCBjaGVja3N1bSAqLworCWZyX3VkcF9wa3QtPmlwX3BrdC5oZHJfY2hlY2tzdW0gPSAwOworCWZyX3VkcF9wa3QtPmlwX3BrdC5oZHJfY2hlY2tzdW0gPSAKKwkJY2FsY19jaGVja3N1bSgmZGF0YVsvKnNpemVvZihmcl9lbmNhcF9oZHJfdCkqLzBdLAorCQkgICAgICAJICAgICAgc2l6ZW9mKGlwX3BrdF90KSk7CisKKwlyZXR1cm4gbGVuOworfSAvKiByZXBseV91ZHAgKi8KKwordW5zaWduZWQgc2hvcnQgY2FsY19jaGVja3N1bSAoY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBzaG9ydCB0ZW1wOyAKKwl1bnNpZ25lZCBsb25nIHN1bT0wOworCWludCBpOworCisJZm9yKCBpID0gMDsgaSA8bGVuOyBpKz0yICkgeworCQltZW1jcHkoJnRlbXAsJmRhdGFbaV0sMik7CisJCXN1bSArPSAodW5zaWduZWQgbG9uZyl0ZW1wOworCX0KKworCXdoaWxlIChzdW0gPj4gMTYgKSB7CisJCXN1bSA9IChzdW0gJiAweGZmZmZVTCkgKyAoc3VtID4+IDE2KTsKKwl9CisKKwl0ZW1wID0gKHVuc2lnbmVkIHNob3J0KXN1bTsKKwl0ZW1wID0gfnRlbXA7CisKKwlpZiggdGVtcCA9PSAwICkgCisJCXRlbXAgPSAweGZmZmY7CisKKwlyZXR1cm4gdGVtcDsJCit9CisKKy8qCisgICBJZiBpbmNvbWluZyBpcyAwIChvdXRnb2luZyktIGlmIHRoZSBuZXQgbnVtYmVycyBpcyBvdXJzIG1ha2UgaXQgMAorICAgaWYgaW5jb21pbmcgaXMgMSAtIGlmIHRoZSBuZXQgbnVtYmVyIGlzIDAgbWFrZSBpdCBvdXJzIAorCisqLworc3RhdGljIHZvaWQgc3dpdGNoX25ldF9udW1iZXJzKHVuc2lnbmVkIGNoYXIgKnNlbmRwYWNrZXQsIHVuc2lnbmVkIGxvbmcgbmV0d29ya19udW1iZXIsIHVuc2lnbmVkIGNoYXIgaW5jb21pbmcpCit7CisJdW5zaWduZWQgbG9uZyBwbmV0d29ya19udW1iZXI7CisKKwlwbmV0d29ya19udW1iZXIgPSAodW5zaWduZWQgbG9uZykoKHNlbmRwYWNrZXRbMTRdIDw8IDI0KSArIAorCQkJICAoc2VuZHBhY2tldFsxNV0gPDwgMTYpICsgKHNlbmRwYWNrZXRbMTZdIDw8IDgpICsgCisJCQkgIHNlbmRwYWNrZXRbMTddKTsKKworCWlmICghaW5jb21pbmcpIHsKKwkJLyogSWYgdGhlIGRlc3RpbmF0aW9uIG5ldHdvcmsgbnVtYmVyIGlzIG91cnMsIG1ha2UgaXQgMCAqLworCQlpZiggcG5ldHdvcmtfbnVtYmVyID09IG5ldHdvcmtfbnVtYmVyKSB7CisJCQlzZW5kcGFja2V0WzE0XSA9IHNlbmRwYWNrZXRbMTVdID0gc2VuZHBhY2tldFsxNl0gPSAKKwkJCQkJIHNlbmRwYWNrZXRbMTddID0gMHgwMDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIElmIHRoZSBpbmNvbWluZyBuZXR3b3JrIGlzIDAsIG1ha2UgaXQgb3VycyAqLworCQlpZiggcG5ldHdvcmtfbnVtYmVyID09IDApIHsKKwkJCXNlbmRwYWNrZXRbMTRdID0gKHVuc2lnbmVkIGNoYXIpKG5ldHdvcmtfbnVtYmVyID4+IDI0KTsKKwkJCXNlbmRwYWNrZXRbMTVdID0gKHVuc2lnbmVkIGNoYXIpKChuZXR3b3JrX251bWJlciAmIAorCQkJCQkgMHgwMEZGMDAwMCkgPj4gMTYpOworCQkJc2VuZHBhY2tldFsxNl0gPSAodW5zaWduZWQgY2hhcikoKG5ldHdvcmtfbnVtYmVyICYgCisJCQkJCSAweDAwMDBGRjAwKSA+PiA4KTsKKwkJCXNlbmRwYWNrZXRbMTddID0gKHVuc2lnbmVkIGNoYXIpKG5ldHdvcmtfbnVtYmVyICYgCisJCQkJCSAweDAwMDAwMEZGKTsKKwkJfQorCX0KKworCisJcG5ldHdvcmtfbnVtYmVyID0gKHVuc2lnbmVkIGxvbmcpKChzZW5kcGFja2V0WzI2XSA8PCAyNCkgKyAKKwkJCSAgKHNlbmRwYWNrZXRbMjddIDw8IDE2KSArIChzZW5kcGFja2V0WzI4XSA8PCA4KSArIAorCQkJICBzZW5kcGFja2V0WzI5XSk7CisKKwlpZiggIWluY29taW5nICkgeworCQkvKiBJZiB0aGUgc291cmNlIG5ldHdvcmsgaXMgb3VycywgbWFrZSBpdCAwICovCisJCWlmKCBwbmV0d29ya19udW1iZXIgPT0gbmV0d29ya19udW1iZXIpIHsKKwkJCXNlbmRwYWNrZXRbMjZdID0gc2VuZHBhY2tldFsyN10gPSBzZW5kcGFja2V0WzI4XSA9IAorCQkJCQkgc2VuZHBhY2tldFsyOV0gPSAweDAwOworCQl9CisJfSBlbHNlIHsKKwkJLyogSWYgdGhlIHNvdXJjZSBuZXR3b3JrIGlzIDAsIG1ha2UgaXQgb3VycyAqLworCQlpZiggcG5ldHdvcmtfbnVtYmVyID09IDAgKSB7CisJCQlzZW5kcGFja2V0WzI2XSA9ICh1bnNpZ25lZCBjaGFyKShuZXR3b3JrX251bWJlciA+PiAyNCk7CisJCQlzZW5kcGFja2V0WzI3XSA9ICh1bnNpZ25lZCBjaGFyKSgobmV0d29ya19udW1iZXIgJiAKKwkJCQkJIDB4MDBGRjAwMDApID4+IDE2KTsKKwkJCXNlbmRwYWNrZXRbMjhdID0gKHVuc2lnbmVkIGNoYXIpKChuZXR3b3JrX251bWJlciAmIAorCQkJCQkgMHgwMDAwRkYwMCkgPj4gOCk7CisJCQlzZW5kcGFja2V0WzI5XSA9ICh1bnNpZ25lZCBjaGFyKShuZXR3b3JrX251bWJlciAmIAorCQkJCQkgMHgwMDAwMDBGRik7CisJCX0KKwl9Cit9IC8qIHN3aXRjaF9uZXRfbnVtYmVycyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEdldCBldGhlcm5ldC1zdHlsZSBpbnRlcmZhY2Ugc3RhdGlzdGljcy4KKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gc3RydWN0IGVuZXRfc3RhdGlzdGljcy4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppZl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWZyX2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKwkKKwlpZihjaGFuID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZjaGFuLT5pZnN0YXRzOworfQorCisvKioqKioqIEludGVycnVwdCBIYW5kbGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBmcl9pc3I6CVM1MDggZnJhbWUgcmVsYXkgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCUZyYW1lIHJlbGF5IG1haW4gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGUuIFRoaXMKKyAqICAgICAgZnVuY3Rpb24gY2hlY2sgdGhlIGludGVycnVwdCB0eXBlIGFuZCB0YWtlcworICogICAgICB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uLgorICovCitzdGF0aWMgdm9pZCBmcl9pc3IgKHNkbGFfdCogY2FyZCkKK3sKKwlmcjUwOF9mbGFnc190KiBmbGFncyA9IGNhcmQtPmZsYWdzOworCWNoYXIgKnB0ciA9ICZmbGFncy0+aWZsYWc7CisJaW50IGksZXJyOworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisKKwkvKiBUaGlzIGZsYWcgcHJldmVudHMgbmVzdGluZyBvZiBpbnRlcnJ1cHRzLiAgU2VlIHNkbGFfaXNyKCkgcm91dGluZQorICAgICAgICAgKiBpbiBzZGxhbWFpbi5jLiAgKi8KKwljYXJkLT5pbl9pc3IgPSAxOworCQorCSsrY2FyZC0+c3RhdGlzdGljcy5pc3JfZW50cnk7CisKKworCS8qIEFsbCBwZXJpcGhlcmFsIChjb25maWd1cmFpdG9uLCByZS1jb25maWd1cmF0aW9uKSBldmVudHMKKwkgKiB0YWtlIHByZXNpZGVuY2Ugb3ZlciB0aGUgSVNSLiAgVGh1cywgcmV0cmlnZ2VyICovCisJaWYgKHRlc3RfYml0KFBFUklfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKSB7CisJCSsrY2FyZC0+c3RhdGlzdGljcy5pc3JfYWxyZWFkeV9jcml0aWNhbDsKKwkJZ290byBmcl9pc3JfZXhpdDsKKwl9CisJCisgICAgICAgIGlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KSB7CisJCWlmICh0ZXN0X2JpdChTRU5EX0NSSVQsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENyaXRpY2FsIHdoaWxlIGluIElTUjogSWYgU2VuZCBSdW5uaW5nIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+ZGV2bmFtZSk7CisJCQkrK2NhcmQtPnN0YXRpc3RpY3MuaXNyX2FscmVhZHlfY3JpdGljYWw7CisJCQlnb3RvIGZyX2lzcl9leGl0OworCQl9CisJfQorCisJc3dpdGNoIChmbGFncy0+aWZsYWcpIHsKKworICAgICAgICAgICAgICAgIGNhc2UgRlJfSU5UUl9SWFJEWTogIC8qIHJlY2VpdmUgaW50ZXJydXB0ICovCisJICAgIAkJKytjYXJkLT5zdGF0aXN0aWNzLmlzcl9yeDsKKyAgICAgICAgICAJCXJ4X2ludHIoY2FyZCk7CisgICAgICAgICAgICAJCWJyZWFrOworCisKKyAgICAgICAgICAgICAgICBjYXNlIEZSX0lOVFJfVFhSRFk6ICAvKiB0cmFuc21pdCBpbnRlcnJ1cHQgKi8KKwkgICAgCQkrKyBjYXJkLT5zdGF0aXN0aWNzLmlzcl90eDsgCisJCQl0eF9pbnRyKGNhcmQpOyAKKyAgICAgICAgICAgIAkJYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEZSX0lOVFJfUkVBRFk6ICAJCisJICAgIAkJSW50cl90ZXN0X2NvdW50ZXIrKzsKKwkJCSsrY2FyZC0+c3RhdGlzdGljcy5pc3JfaW50cl90ZXN0OworCSAgICAJCWJyZWFrOwkKKworICAgICAgICAgICAgICAgIGNhc2UgRlJfSU5UUl9ETEM6IC8qIEV2ZW50IGludGVycnVwdCBvY2N1cnJlZCAqLworCQkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9SRUFEX1NUQVRVUzsKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSAwOworCQkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCQkJaWYgKGVycikKKwkJCQlmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpOworCQkJYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEZSX0lOVFJfVElNRVI6ICAvKiBUaW1lciBpbnRlcnJ1cHQgKi8KKwkJCXRpbWVyX2ludHIoY2FyZCk7CisJCQlicmVhazsKKwkKKwkJZGVmYXVsdDoKKwkgICAgCQkrK2NhcmQtPnN0YXRpc3RpY3MuaXNyX3NwdXJpb3VzOworICAgICAgICAgICAgCQlzcHVyX2ludHIoY2FyZCk7CisJICAgIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludGVycnVwdCBUeXBlIDB4JTAyWCFcbiIsIAorCQkJCWNhcmQtPmRldm5hbWUsIGZsYWdzLT5pZmxhZyk7CisJICAgIAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElEIEJ5dGVzID0gIixjYXJkLT5kZXZuYW1lKTsKKyAJICAgIAkJZm9yKGkgPSAwOyBpIDwgODsgaSArKykKKwkJCQlwcmludGsoS0VSTl9JTkZPICIweCUwMlggIiwgKihwdHIgKyAweDI4ICsgaSkpOworCSAgIAkgCXByaW50ayhLRVJOX0lORk8gIlxuIik7CQorICAgICAgICAgICAgCisJCQlicmVhazsKKyAgICAJfQorCitmcl9pc3JfZXhpdDoKKwkKKwljYXJkLT5pbl9pc3IgPSAwOworCWZsYWdzLT5pZmxhZyA9IDA7CisJcmV0dXJuOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogcnhfaW50cglSZWNlaXZlIGludGVycnVwdCBoYW5kbGVyLgorICoKKyAqIERlc2NyaXB0aW9uCisgKiAJVXBvbiByZWNlaXZlaW5nIGFuIGludGVycnVwdDogCisgKgkxLiBDaGVjayB0aGF0IHRoZSBmaXJtd2FyZSBpcyBpbiBzeW5jIHdpdGggCisgKiAgICAgCSAgIHRoZSBkcml2ZXIuIAorICogICAgICAyLiBGaW5kIGFuIGFwcHJvcHJpYXRlIG5ldHdvcmsgaW50ZXJmYWNlCisgKiAgICAgICAgIGJhc2VkIG9uIHRoZSByZWNlaXZlZCBkbGNpIG51bWJlci4KKyAqCTMuIENoZWNrIHRoYXQgdGhlIG5ldG93cmsgaW50ZXJmYWNlIGV4aXN0cworICogICAgICAgICBhbmQgdGhhdCBpdCdzIHNldHVwIHByb3Blcmx5LgorICoJNC4gQ29weSB0aGUgZGF0YSBpbnRvIGFuIHNrYiBidWZmZXIuCisgKgk1LiBDaGVjayB0aGUgcGFja2V0IHR5cGUgYW5kIHRha2UKKyAqICAgICAgICAgYXBwcm9wcmlhdGUgYWN0b246IFVQRCwgQVBJLCBBUlAgb3IgRGF0YS4KKyAqLworCitzdGF0aWMgdm9pZCByeF9pbnRyIChzZGxhX3QqIGNhcmQpCit7CisJZnJfcnhfYnVmX2N0bF90KiBmcmJ1ZiA9IGNhcmQtPnJ4bWI7CisJZnI1MDhfZmxhZ3NfdCogZmxhZ3MgPSBjYXJkLT5mbGFnczsKKwlmcl9jaGFubmVsX3QqIGNoYW47CisJY2hhciAqcHRyID0gJmZsYWdzLT5pZmxhZzsKKwlzdHJ1Y3Qgc2tfYnVmZiogc2tiOworCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXY7CisJdm9pZCogYnVmOworCXVuc2lnbmVkIGRsY2ksIGxlbiwgb2ZmcywgbGVuX2luY2xfaGRyOworCWludCBpLCB1ZHBfdHlwZTsJCisKKworCS8qIENoZWNrIHRoYXQgZmlybXdhcmUgYnVmZmVycyBhcmUgaW4gc3luYyAqLworCWlmIChmcmJ1Zi0+ZmxhZyAhPSAweDAxKSB7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogY29ycnVwdGVkIFJ4IGJ1ZmZlciBAIDB4JVgsIGZsYWcgPSAweCUwMlghXG4iLCAKKwkJCWNhcmQtPmRldm5hbWUsICh1bnNpZ25lZClmcmJ1ZiwgZnJidWYtPmZsYWcpOworICAgICAgCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJRCBCeXRlcyA9ICIsY2FyZC0+ZGV2bmFtZSk7CisgCQlmb3IoaSA9IDA7IGkgPCA4OyBpICsrKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiMHglMDJYICIsICoocHRyICsgMHgyOCArIGkpKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKKwkKKwkJKytjYXJkLT5zdGF0aXN0aWNzLnJ4X2ludHJfY29ycnVwdF9yeF9iZnI7CisKKwkJLyogQnVnIEZpeDogTWFyIDYgMjAwMAorICAgICAgICAgICAgICAgICAqIElmIHdlIGdldCBhIGNvcnJ1cHRlZCBtYWlsYm94LCBpdCBtZWFucyB0aGF0IGRyaXZlciAKKyAgICAgICAgICAgICAgICAgKiBpcyBvdXQgb2Ygc3luYyB3aXRoIHRoZSBmaXJtd2FyZS4gVGhlcmUgaXMgbm8gcmVjb3ZlcnkuCisgICAgICAgICAgICAgICAgICogSWYgd2UgZG9uJ3QgdHVybiBvZmYgYWxsIGludGVycnVwdHMgZm9yIHRoaXMgY2FyZAorICAgICAgICAgICAgICAgICAqIHRoZSBtYWNoaW5lIHdpbGwgY3Jhc2guIAorICAgICAgICAgICAgICAgICAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogQ3JpdGljYWwgcm91dGVyIGZhaWx1cmUgLi4uISEhXG4iLCBjYXJkLT5kZXZuYW1lKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUGxlYXNlIGNvbnRhY3QgU2FuZ29tYSBUZWNobm9sb2dpZXMgIVxuIik7CisJCWZyX3NldF9pbnRyX21vZGUoY2FyZCwgMCwgMCwgMCk7CQorCQlyZXR1cm47CisJfQorCisJbGVuICA9IGZyYnVmLT5sZW5ndGg7CisJZGxjaSA9IGZyYnVmLT5kbGNpOworCW9mZnMgPSBmcmJ1Zi0+b2Zmc2V0OworCisJLyogRmluZCB0aGUgbmV0d29yayBpbnRlcmZhY2UgZm9yIHRoaXMgcGFja2V0ICovCisJZGV2ID0gZmluZF9jaGFubmVsKGNhcmQsIGRsY2kpOworICAgCisKKwkvKiBDaGVjayB0aGF0IHRoZSBuZXR3b3JrIGludGVyZmFjZSBpcyBhY3RpdmUgYW5kCisgICAgICAgICAqIHByb3Blcmx5IHNldHVwICovCisJaWYgKGRldiA9PSBOVUxMKSB7CisgICAJCWlmKCBuZXRfcmF0ZWxpbWl0KCkpIHsgCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVjZWl2ZWQgZGF0YSBvbiB1bmNvbmZpZ3VyZWQgRExDSSAlZCFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5kZXZuYW1lLCBkbGNpKTsKKwkJfQorCQkrK2NhcmQtPnN0YXRpc3RpY3MucnhfaW50cl9vbl9vcnBoYW5lZF9ETENJOyAKKwkJKytjYXJkLT53YW5kZXYuc3RhdHMucnhfZHJvcHBlZDsKKwkJZ290byByeF9kb25lOworCX0KKworCWlmICgoY2hhbiA9IGRldi0+cHJpdikgPT0gTlVMTCl7CisJCWlmKCBuZXRfcmF0ZWxpbWl0KCkpIHsgCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVjZWl2ZWQgZGF0YSBvbiB1bmNvbmZpZ3VyZWQgRExDSSAlZCFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5kZXZuYW1lLCBkbGNpKTsKKwkJfQorCQkrK2NhcmQtPnN0YXRpc3RpY3MucnhfaW50cl9vbl9vcnBoYW5lZF9ETENJOyAKKwkJKytjYXJkLT53YW5kZXYuc3RhdHMucnhfZHJvcHBlZDsKKwkJZ290byByeF9kb25lOworCX0KKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsgCisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSB8fCAoc2tiID09IE5VTEwpKXsKKworCQkrK2NoYW4tPmlmc3RhdHMucnhfZHJvcHBlZDsKKwkKKwkJaWYoc2tiID09IE5VTEwpIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsgCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkJIiVzOiBubyBzb2NrZXQgYnVmZmVycyBhdmFpbGFibGUhXG4iLCAKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJfQorCQkJY2hhbi0+ZHJ2c3RhdHNfcnhfaW50ci5yeF9pbnRyX25vX3NvY2tldCArKzsKKwkJfSAKKworCQlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSl7CisJCQljaGFuLT5kcnZzdGF0c19yeF9pbnRyLgorCQkJCXJ4X2ludHJfZGV2X25vdF9zdGFydGVkICsrOworCQkJaWYgKHNrYil7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCX0KKwkJfQorCQlnb3RvIHJ4X2RvbmU7CisJfQorCisJLyogQ29weSBkYXRhIGZyb20gdGhlIGJvYXJkIGludG8gdGhlIHNvY2tldCBidWZmZXIgKi8KKwlpZiAoKG9mZnMgKyBsZW4pID4gY2FyZC0+dS5mLnJ4X3RvcCArIDEpIHsKKwkJdW5zaWduZWQgdG1wID0gY2FyZC0+dS5mLnJ4X3RvcCAtIG9mZnMgKyAxOworCisJCWJ1ZiA9IHNrYl9wdXQoc2tiLCB0bXApOworCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCBvZmZzLCBidWYsIHRtcCk7CisJCW9mZnMgPSBjYXJkLT51LmYucnhfYmFzZTsKKwkJbGVuIC09IHRtcDsKKwl9CisKKwlidWYgPSBza2JfcHV0KHNrYiwgbGVuKTsKKwlzZGxhX3BlZWsoJmNhcmQtPmh3LCBvZmZzLCBidWYsIGxlbik7CisKKworCS8qIFdlIGdvdCB0aGUgcGFja2V0IGZyb20gdGhlIGJhcmQuIAorICAgICAgICAgKiBDaGVjayB0aGUgcGFja2V0IHR5cGUgYW5kIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uICovCisKKwl1ZHBfdHlwZSA9IHVkcF9wa3RfdHlwZSggc2tiLCBjYXJkICk7CisKKwlpZih1ZHBfdHlwZSAhPSBVRFBfSU5WQUxJRF9UWVBFKSB7CisKKwkJLyogVURQIERlYnVnIHBhY2tldCByZWNlaXZlZCwgc3RvcmUgdGhlCisJCSAqIHBhY2tldCBhbmQgaGFuZGxlIGl0IGluIHRpbWVyIGludGVycnVwdCAqLworCisJCXNrYl9wdWxsKHNrYiwgMSk7IAorCQlpZiAod2Fucm91dGVyX3R5cGVfdHJhbnMoc2tiLCBkZXYpKXsgCisJCQlpZihzdG9yZV91ZHBfbWdtdF9wa3QodWRwX3R5cGUsVURQX1BLVF9GUk1fTkVUV09SSyxjYXJkLHNrYixkbGNpKSl7CisKKwkJCQlmbGFncy0+aW1hc2sgfD0gRlJfSU5UUl9USU1FUjsKKworCQkJCWlmICh1ZHBfdHlwZSA9PSBVRFBfRlBJUEVfVFlQRSl7CisJCQkJCSsrY2hhbi0+ZHJ2c3RhdHNfcnhfaW50ci5yeF9pbnRyX1BJUEVfcmVxdWVzdDsKKwkJCQl9CisJCQl9CisJCX0KKworCX1lbHNlIGlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSkgeworCisJCS8qIFdlIGFyZSBpbiBBUEkgbW9kZS4gCisgICAgICAgICAgICAgICAgICogQWRkIGFuIEFQSSBoZWFkZXIgdG8gdGhlIFJBVyBwYWNrZXQKKyAgICAgICAgICAgICAgICAgKiBhbmQgcXVldWUgaXQgaW50byBhIGNpcmN1bGFyIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgKiBUaGVuIGtpY2sgdGhlIGZyX2JoKCkgYm90dG9tIGhhbGYgaGFuZGxlciAqLworCisJCWFwaV9yeF9oZHJfdCogYXBpX3J4X2hkcjsKKwkJY2hhbi0+ZHJ2c3RhdHNfcnhfaW50ci5yeF9pbnRyX2Jmcl9wYXNzZWRfdG9fc3RhY2sgKys7CisJCWNoYW4tPmlmc3RhdHMucnhfcGFja2V0cyArKzsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X3BhY2tldHMgKys7CisKKwkJY2hhbi0+aWZzdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCisJCXNrYl9wdXNoKHNrYiwgc2l6ZW9mKGFwaV9yeF9oZHJfdCkpOworCQlhcGlfcnhfaGRyID0gKGFwaV9yeF9oZHJfdCopJnNrYi0+ZGF0YVsweDAwXTsKKwkJYXBpX3J4X2hkci0+YXR0ciA9IGZyYnVmLT5hdHRyOworCQlhcGlfcnhfaGRyLT50aW1lX3N0YW1wID0gZnJidWYtPnRtc3RhbXA7CisKKwkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKwkJc2tiLT5tYWMucmF3ICA9IHNrYi0+ZGF0YTsKKwkJc2tiLT5kZXYgICAgICA9IGRldjsKKwkJc2tiLT5wa3RfdHlwZSA9IFdBTl9QQUNLRVRfREFUQTsKKworCQliaF9lbnF1ZXVlKGRldiwgc2tiKTsKKworCQl0cmlnZ2VyX2ZyX2JoKGNoYW4pOworCisJfWVsc2UgaWYgKGhhbmRsZV9JUFhXQU4oc2tiLT5kYXRhLGNoYW4tPm5hbWUsY2hhbi0+ZW5hYmxlX0lQWCwgY2hhbi0+bmV0d29ya19udW1iZXIpKXsKKworCQkvL0ZJWE1FOiBGcmFtZSBSZWxheSBJUFggaXMgbm90IHN1cHBvcnRlZCwgWWV0ICEKKwkJLy9pZiAoY2hhbi0+ZW5hYmxlX0lQWCkgeworCQkvLwlmcl9zZW5kKGNhcmQsIGRsY2ksIDAsIHNrYi0+bGVuLHNrYi0+ZGF0YSk7CisJCS8vfQorCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCisJfSBlbHNlIGlmIChpc19hcnAoc2tiLT5kYXRhKSkgeworCisJCS8qIEFSUCBzdXBwb3J0IGVuYWJsZWQgTWFyIDE2IDIwMDAgCisJCSAqIFByb2Nlc3MgaW5jb21pbmcgQVJQIHJlcGx5L3JlcXVlc3QsIHNldHVwCisJCSAqIGR5bmFtaWMgcm91dGVzLiAqLyAKKworCQlpZiAocHJvY2Vzc19BUlAoKGFycGhkcl8xNDkwX3QgKilza2ItPmRhdGEsIGNhcmQsIGRldikpIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpeyAgCisJCQkJcHJpbnRrIChLRVJOX0lORk8gCisJCQkJICAgIiVzOiBFcnJvciBwcm9jZXNzaW5nIEFSUCBQYWNrZXQuXG4iLCAKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQl9CisJCX0KKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKworCX0gZWxzZSBpZiAoc2tiLT5kYXRhWzBdICE9IDB4MDMpIHsKKworCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7IAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vbiBJRVRGIHBhY2tldCBkaXNjYXJkZWQuXG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJfQorCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCisJfSBlbHNlIHsKKworCQlsZW5faW5jbF9oZHIgPSBza2ItPmxlbjsKKwkJLyogRGVjYXBzdWxhdGUgcGFja2V0IGFuZCBwYXNzIGl0IHVwIHRoZQorCQkgICBwcm90b2NvbCBzdGFjayAqLworCQlza2ItPmRldiA9IGRldjsKKwkJCisJCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEJSSURHRSB8fCBjaGFuLT5jb21tb24udXNlZGJ5ID09IEJSSURHRV9OT0RFKXsKKwkJCisJCQkvKiBNYWtlIHN1cmUgaXQncyBhbiBFdGhlcm5ldCBmcmFtZSwgb3RoZXJ3aXNlIGRyb3AgaXQgKi8KKwkJCWlmICghbWVtY21wKHNrYi0+ZGF0YSwgIlx4MDNceDAwXHg4MFx4MDBceDgwXHhDMlx4MDBceDA3IiwgOCkpIHsKKwkJCQlza2JfcHVsbChza2IsIDgpOworCQkJCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJCQl9ZWxzZXsKKwkJCQkrK2NoYW4tPmRydnN0YXRzX3J4X2ludHIucnhfaW50cl9iZnJfbm90X3Bhc3NlZF90b19zdGFjazsKKwkJCQkrK2NoYW4tPmlmc3RhdHMucnhfZXJyb3JzOworCQkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2Vycm9yczsKKwkJCQlnb3RvIHJ4X2RvbmU7CisJCQl9CisJCX1lbHNleworCQkKKwkJCS8qIHJlbW92ZSBoYXJkd2FyZSBoZWFkZXIgKi8KKwkJCWJ1ZiA9IHNrYl9wdWxsKHNrYiwgMSk7IAorCQkJCisJCQlpZiAoIXdhbnJvdXRlcl90eXBlX3RyYW5zKHNrYiwgZGV2KSkgeworCQkJCQorCQkJCS8qIGNhbid0IGRlY2Fwc3VsYXRlIHBhY2tldCAqLworCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisKKwkJCQkrK2NoYW4tPmRydnN0YXRzX3J4X2ludHIucnhfaW50cl9iZnJfbm90X3Bhc3NlZF90b19zdGFjazsKKwkJCQkrK2NoYW4tPmlmc3RhdHMucnhfZXJyb3JzOworCQkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2Vycm9yczsKKwkJCQlnb3RvIHJ4X2RvbmU7CQorCQkJfQorCQkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCQl9IAorCQkKKworCQkvKiBTZW5kIGEgcGFja2V0IHVwIHRoZSBJUCBzdGFjayAqLworCQlza2ItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCW5ldGlmX3J4KHNrYik7CisJCSsrY2hhbi0+ZHJ2c3RhdHNfcnhfaW50ci5yeF9pbnRyX2Jmcl9wYXNzZWRfdG9fc3RhY2s7CisJCSsrY2hhbi0+aWZzdGF0cy5yeF9wYWNrZXRzOworCQkrK2NhcmQtPndhbmRldi5zdGF0cy5yeF9wYWNrZXRzOworCisJCWNoYW4tPmlmc3RhdHMucnhfYnl0ZXMgKz0gbGVuX2luY2xfaGRyOworCQljYXJkLT53YW5kZXYuc3RhdHMucnhfYnl0ZXMgKz0gbGVuX2luY2xfaGRyOworCX0KKworcnhfZG9uZToKKworICAgICAgIAkvKiBSZWxlYXNlIGJ1ZmZlciBlbGVtZW50IGFuZCBjYWxjdWxhdGUgYSBwb2ludGVyIHRvIHRoZSBuZXh0IG9uZSAqLyAKKyAgICAgICAJZnJidWYtPmZsYWcgPSAwOworCWNhcmQtPnJ4bWIgPSArK2ZyYnVmOworCWlmICgodm9pZCopZnJidWYgPiBjYXJkLT51LmYucnhtYl9sYXN0KQorCQljYXJkLT5yeG1iID0gY2FyZC0+dS5mLnJ4bWJfYmFzZTsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogdHhfaW50cjoJVHJhbnNtaXQgaW50ZXJydXB0IGhhbmRsZXIuCisgKgorICogUmF0aW9uYWxlOgorICogICAgICBJZiB0aGUgYm9hcmQgaXMgYnVzeSB0cmFuc21pdHRpbmcsIGlmX3NlbmQoKSB3aWxsCisgKiAgICAgIGJ1ZmZlcnMgYSBzaW5nbGUgcGFja2V0IGFuZCB0dXJuIG9uCisgKiAgICAgIHRoZSB0eCBpbnRlcnJ1cHQuIFR4IGludGVycnVwdCB3aWxsIGJlIGNhbGxlZAorICogICAgICBieSB0aGUgYm9hcmQsIG9uY2UgdGhlIGZpcm13YXJlIGNhbiBzZW5kIG1vcmUKKyAqICAgICAgZGF0YS4gVGh1cywgbm8gcG9sbGluZyBpcyByZXF1aXJlZC4JIAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVHggaW50ZXJydXB0IGlzIGNhbGxlZCBmb3IgZWFjaCAKKyAqICAgICAgY29uZmlndXJlZCBkbGNpIGNoYW5uZWwuIFRodXM6IAorICogCTEuIE9idGFpbiB0aGUgbmV0b3dyayBpbnRlcmZhY2UgYmFzZWQgb24gdGhlCisgKiAgICAgICAgIGRsY2kgbnVtYmVyLgorICogICAgICAyLiBDaGVjayB0aGF0IG5ldHdvcmsgaW50ZXJmYWNlIGlzIHVwIGFuZAorICogICAgICAgICBwcm9wZXJseSBzZXR1cC4KKyAqIAkzLiBDaGVjayBmb3IgYSBidWZmZXJlZCBwYWNrZXQuCisgKiAgICAgIDQuIFRyYW5zbWl0IHRoZSBwYWNrZXQuCisgKgk1LiBJZiB3ZSBhcmUgaW4gV0FOUElQRSBtb2RlLCBtYXJrIHRoZSAKKyAqICAgICAgICAgTkVUX0JIIGhhbmRsZXIuIAorICogICAgICA2LiBJZiB3ZSBhcmUgaW4gQVBJIG1vZGUsIGtpY2sKKyAqICAgICAgICAgdGhlIEFGX1dBTlBJUEUgc29ja2V0IGZvciBtb3JlIGRhdGEuIAorICoJICAgCisgKi8KK3N0YXRpYyB2b2lkIHR4X2ludHIoc2RsYV90ICpjYXJkKQoreworICAgICAgICBmcjUwOF9mbGFnc190KiBmbGFncyA9IGNhcmQtPmZsYWdzOworICAgICAgICBmcl90eF9idWZfY3RsX3QqIGJjdGw7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXY7CisgICAgICAgIGZyX2NoYW5uZWxfdCogY2hhbjsKKworICAgICAgICBpZihjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCl7CisgICAgICAgICAgICAgICAgYmN0bCA9ICh2b2lkKikoZmxhZ3MtPnRzZV9vZmZzICsgY2FyZC0+aHcuZHBtYmFzZSk7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGJjdGwgPSAodm9pZCopKGZsYWdzLT50c2Vfb2ZmcyAtIEZSX01CX1ZFQ1RPUiArCisgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5ody5kcG1iYXNlKTsKKwl9CisKKyAgICAgICAgLyogRmluZCB0aGUgc3RydWN0dXJlIGFuZCBtYWtlIGl0IHVuYnVzeSAqLworICAgICAgICBkZXYgPSBmaW5kX2NoYW5uZWwoY2FyZCwgZmxhZ3MtPmRsY2kpOworCWlmIChkZXYgPT0gTlVMTCl7CisJCXByaW50ayhLRVJOX0lORk8gIk5PIERFViBJTiBUWCBJbnRlcnJ1cHRcbiIpOwkKKwkJZ290byBlbmRfb2ZfdHhfaW50cjsKKwl9CisKKyAgICAgICAgaWYgKChjaGFuID0gZGV2LT5wcml2KSA9PSBOVUxMKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiTk8gQ0hBTiBJTiBUWCBJbnRlcnJ1cHRcbiIpOwkKKwkJZ290byBlbmRfb2ZfdHhfaW50cjsKKwl9CisKKyAgICAgICAgaWYoIWNoYW4tPnRyYW5zbWl0X2xlbmd0aCB8fCAhY2hhbi0+ZGVsYXlfc2tiKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHR4IGludCBlcnJvciAtIHRyYW5zbWl0IGxlbmd0aCB6ZXJvXG4iLAorCQkJCWNhcmQtPndhbmRldi5uYW1lKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZF9vZl90eF9pbnRyOworICAgICAgICB9CisKKwkvKiBJZiB0aGUgJ2lmX3NlbmQoKScgcHJvY2VkdXJlIGlzIGN1cnJlbnRseSBjaGVja2luZyB0aGUgJ3RidXN5JworCSAgIHN0YXR1cywgdGhlbiB3ZSBjYW5ub3QgdHJhbnNtaXQuIEluc3RlYWQsIHdlIGNvbmZpZ3VyZSB0aGUgbWljcm9jb2RlCisJICAgc28gYXMgdG8gcmUtaXNzdWUgdGhpcyB0cmFuc21pdCBpbnRlcnJ1cHQgYXQgYSBsYXRlciBzdGFnZS4gCisJKi8KKwlpZiAodGVzdF9iaXQoU0VORF9UWElSUV9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpIHsKKworCQlmcl9kbGNpX2ludGVyZmFjZV90KiBkbGNpX2ludGVyZmFjZSA9IGNoYW4tPmRsY2lfaW50X2ludGVyZmFjZTsKKwkJYmN0bC0+ZmxhZyA9IDB4QTA7CisJCWRsY2lfaW50ZXJmYWNlLT5nZW5faW50ZXJydXB0IHw9IEZSX0lOVFJfVFhSRFk7CisJCXJldHVybjsKKworIAl9ZWxzZXsKKyAgICAgICAgCWJjdGwtPmRsY2kgPSBmbGFncy0+ZGxjaTsKKwkgICAgICAgIGJjdGwtPmxlbmd0aCA9IGNoYW4tPnRyYW5zbWl0X2xlbmd0aCtjaGFuLT5mcl9oZWFkZXJfbGVuOworICAgICAgICAJc2RsYV9wb2tlKCZjYXJkLT5odywgCisJCSAgICAgICAgICBmcl9zZW5kX2hkcihjYXJkLGJjdGwtPmRsY2ksYmN0bC0+b2Zmc2V0KSwgCisJCQkgIGNoYW4tPmRlbGF5X3NrYi0+ZGF0YSwKKyAJICAgICAgICAgICAgICAJICBjaGFuLT5kZWxheV9za2ItPmxlbik7CisJICAgICAgICBiY3RsLT5mbGFnID0gMHhDMDsKKworCQkrK2NoYW4tPmlmc3RhdHMudHhfcGFja2V0czsKKwkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfcGFja2V0czsKKwkJY2hhbi0+aWZzdGF0cy50eF9ieXRlcyArPSBjaGFuLT50cmFuc21pdF9sZW5ndGg7CisJCWNhcmQtPndhbmRldi5zdGF0cy50eF9ieXRlcyArPSBjaGFuLT50cmFuc21pdF9sZW5ndGg7CisKKwkJLyogV2UgbXVzdCBmcmVlIGFuIHNrIGJ1ZmZlciwgd2hpY2ggd2UgdXNlZAorCQkgKiBmb3IgZGVsYXllZCB0cmFuc21pc3Npb247IE90aGVyd2lzZSwgdGhlIHNvY2sKKwkJICogd2lsbCBydW4gb3V0IG9mIG1lbW9yeSAqLworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KGNoYW4tPmRlbGF5X3NrYik7CisKKwkJY2hhbi0+ZGVsYXlfc2tiID0gTlVMTDsJCQkJCisgICAgICAgIAljaGFuLT50cmFuc21pdF9sZW5ndGggPSAwOworCisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpeworCQkJLyogSWYgdXNpbmcgQVBJLCB0aGFuIHdha2V1cCBzb2NrZXQgQkggaGFuZGxlciAqLworCQkJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKXsKKwkJCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkJCXdha2V1cF9za19iaChkZXYpOworCQkJfWVsc2V7CisJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJfQorCQl9CisJfQorCitlbmRfb2ZfdHhfaW50cjoKKworIAkvKiBpZiBhbnkgb3RoZXIgaW50ZXJmYWNlcyBoYXZlIHRyYW5zbWl0IGludGVycnVwdHMgcGVuZGluZywgCisJICogZG8gbm90IGRpc2FibGUgdGhlIGdsb2JhbCB0cmFuc21pdCBpbnRlcnJ1cHQgKi8KKwlpZighKC0tIGNhcmQtPnUuZi50eF9pbnRlcnJ1cHRzX3BlbmRpbmcpKQorICAgICAgIAkgICAgICAgIGZsYWdzLT5pbWFzayAmPSB+RlJfSU5UUl9UWFJEWTsKKworCit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB0aW1lcl9pbnRyOglUaW1lciBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqCisgKiBSYXRpb25hbGU6CisgKglBbGwgY29tbWFucyBtdXN0IGJlIGV4ZWN1dGVkIHdpdGhpbiB0aGUgdGltZXIKKyAqICAgICAgaW50ZXJydXB0IHNpbmNlIG5vIHR3byBjb21tYW5kcyBzaG91bGQgZXhlY3V0ZQorICogICAgICBhdCB0aGUgc2FtZSB0aW1lLgorICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhlIHRpbWVyIGludGVycnVwdCBpcyB1c2VkIHRvOgorICogICAgCTEuIFByb2Nlc3NpbmcgdWRwIGNhbGxzIGZyb20gJ2ZwaXBlbW9uJy4KKyAqICAgIAkyLiBQcm9jZXNzaW5nIHVwZGF0ZSBjYWxscyBmcm9tIC9wcm9jIGZpbGUgc3lzdGVtCisgKiAgIAkzLiBSZWFkaW5nIGJvYXJkLWxldmVsIHN0YXRpc3RpY3MgZm9yIAorICogICAgICAgICB1cGRhdGluZyB0aGUgcHJvYyBmaWxlIHN5c3RlbS4KKyAqICAgIAk0LiBTZW5kaW5nIGludmVyc2UgQVJQIHJlcXVlc3QgcGFja2V0cy4KKyAqCTUuIENvbmZpZ3VyZSBhIGRsY2kvY2hhbm5lbC4KKyAqCTYuIFVuY29uZmlndXJlIGEgZGxjaS9jaGFubmVsLiAoTm9kZSBvbmx5KQorICovCisKK3N0YXRpYyB2b2lkIHRpbWVyX2ludHIoc2RsYV90ICpjYXJkKQoreworCWZyNTA4X2ZsYWdzX3QqIGZsYWdzID0gY2FyZC0+ZmxhZ3M7CisKKwkvKiBVRFAgRGVidWdpbmc6IGZwaXBlbW9uIGNhbGwgKi8KKyAgICAgICAgaWYgKGNhcmQtPnUuZi50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9VRFApIHsKKwkJaWYoY2FyZC0+dS5mLnVkcF90eXBlID09IFVEUF9GUElQRV9UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIAlpZihwcm9jZXNzX3VkcF9tZ210X3BrdChjYXJkKSkgeworCQkgICAgICAgICAgICAgICAgY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkICY9CisJCQkJCX5UTVJfSU5UX0VOQUJMRURfVURQOworCQkJfQorCQl9CisgICAgICAgIH0KKworCS8qIC9wcm9jIHVwZGF0ZSBjYWxsIDogdHJpZ2dlcmVkIGZyb20gdXBkYXRlKCkgKi8KKwlpZiAoY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX1VQREFURSkgeworCQlmcl9nZXRfZXJyX3N0YXRzKGNhcmQpOworCQlmcl9nZXRfc3RhdHMoY2FyZCk7CisJCWNhcmQtPnUuZi51cGRhdGVfY29tbXNfc3RhdHMgPSAwOworCQljYXJkLT51LmYudGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9VUERBVEU7CisJfQorCisJLyogVXBkYXRlIHRoZSBjaGFubmVsIHN0YXRlIGNhbGwuICBUaGlzIGlzIGNhbGwgaXMKKyAgICAgICAgICogdHJpZ2dlcmVkIGJ5IGlmX3NlbmQoKSBmdW5jdGlvbiAqLworCWlmIChjYXJkLT51LmYudGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfVVBEQVRFX1NUQVRFKXsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwkJaWYgKGNhcmQtPndhbmRldi5zdGF0ZSA9PSBXQU5fQ09OTkVDVEVEKXsKKwkJCWZvciAoZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsgZGV2OworCQkJICAgICBkZXYgPSAqKChzdHJ1Y3QgbmV0X2RldmljZSAqKilkZXYtPnByaXYpKXsKKwkJCQlmcl9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CQorCQkJCWlmIChjaGFuLT5jb21tb24uc3RhdGUgIT0gV0FOX0NPTk5FQ1RFRCl7CisJCQkJCXVwZGF0ZV9jaGFuX3N0YXRlKGRldik7CisJCQkJfQorCQkJfQorCQl9CisJCWNhcmQtPnUuZi50aW1lcl9pbnRfZW5hYmxlZCAmPSB+VE1SX0lOVF9FTkFCTEVEX1VQREFURV9TVEFURTsKKwl9CisKKwkvKiBjb25maWd1cmUgYSBkbGNpL2NoYW5uZWwgKi8KKwlpZiAoY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX0NPTkZJRyl7CisJCWNvbmZpZ19mcihjYXJkKTsKKwkJY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfQ09ORklHOworCX0KKworCS8qIHVuY29uZmlndXJlIGEgZGxjaS9jaGFubmVsICovCisJaWYgKGNhcmQtPnUuZi50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9VTkNPTkZJRyl7CisJCXVuY29uZmlnX2ZyKGNhcmQpOworCQljYXJkLT51LmYudGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9VTkNPTkZJRzsKKwl9CisKKwkKKwkvKiBUcmFuc21pdCBBUlAgcGFja2V0cyAqLworCWlmIChjYXJkLT51LmYudGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfQVJQKXsKKwkJaW50IGk9MDsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCQlpZiAoY2FyZC0+dS5mLmFycF9kZXYgPT0gTlVMTCkKKwkJCWNhcmQtPnUuZi5hcnBfZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKworCQlkZXYgPSBjYXJkLT51LmYuYXJwX2RldjsKKworCQlmb3IgKDs7KXsgCisKKwkJCWZyX2NoYW5uZWxfdCAqY2hhbiA9IGRldi0+cHJpdjsKKworCQkJLyogSWYgdGhlIGludGVyZmFjZSBpcyBicm91Z2h0IGRvd24gY2FuY2VsIHNlbmRpbmcgSW4tQVJQcyAqLworCQkJaWYgKCEoZGV2LT5mbGFncyZJRkZfVVApKXsKKwkJCQljbGVhcl9iaXQoMCwmY2hhbi0+aW5hcnBfcmVhZHkpOwkKKwkJCX0KKworCQkJaWYgKHRlc3RfYml0KDAsJmNoYW4tPmluYXJwX3JlYWR5KSl7CisKKwkJCQlpZiAoY2hlY2tfdHhfc3RhdHVzKGNhcmQsZGV2KSl7CisJCQkJCXNldF9iaXQoQVJQX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmICghc2VuZF9pbmFycF9yZXF1ZXN0KGNhcmQsZGV2KSl7CisJCQkJCXRyaWdnZXJfZnJfYXJwKGRldik7CisJCQkJCWNoYW4tPmluYXJwX3RpY2sgPSBqaWZmaWVzOworCQkJCX0KKworCQkJCWNsZWFyX2JpdCgwLCZjaGFuLT5pbmFycF9yZWFkeSk7CisJCQkJZGV2ID0gbW92ZV9kZXZfdG9fbmV4dChjYXJkLGRldik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkZXYgPSBtb3ZlX2Rldl90b19uZXh0KGNhcmQsZGV2KTsKKworCQkJaWYgKCsraSA9PSBjYXJkLT53YW5kZXYubmV3X2lmX2NudCl7CisJCQkJY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfQVJQOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWNhcmQtPnUuZi5hcnBfZGV2ID0gZGV2OworCX0KKworICAgICAgICBpZighY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkKQorICAgICAgICAgICAgICAgIGZsYWdzLT5pbWFzayAmPSB+RlJfSU5UUl9USU1FUjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHNwdXJfaW50cjoJU3B1cmlvdXMgaW50ZXJydXB0IGhhbmRsZXIuCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogIAlXZSBkb24ndCBrbm93IHRoaXMgaW50ZXJydXB0LgorICogICAgICBQcmludCBhIHdhcm5pbmcuCisgKi8KKworc3RhdGljIHZvaWQgc3B1cl9pbnRyIChzZGxhX3QqIGNhcmQpCit7CisJaWYgKG5ldF9yYXRlbGltaXQoKSl7IAorCQlwcmludGsoS0VSTl9JTkZPICIlczogc3B1cmlvdXMgaW50ZXJydXB0IVxuIiwgY2FyZC0+ZGV2bmFtZSk7CisJfQorfQorCisKKy8vRklYTUU6IEZpeCB0aGUgSVBYIGluIG5leHQgdmVyc2lvbgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICBSZXR1cm4gMCBmb3Igbm9uLUlQWFdBTiBwYWNrZXQKKyAqICAgICAgICAgMSBmb3IgSVBYV0FOIHBhY2tldCBvciBJUFggaXMgbm90IGVuYWJsZWQhCisgKiAgRklYTUU6IFVzZSBhIElQWCBzdHJ1Y3R1cmUgaGVyZSBub3Qgb2Zmc2V0cworICovCitzdGF0aWMgaW50IGhhbmRsZV9JUFhXQU4odW5zaWduZWQgY2hhciAqc2VuZHBhY2tldCwgCisJCQkgY2hhciAqZGV2bmFtZSwgdW5zaWduZWQgY2hhciBlbmFibGVfSVBYLCAKKwkJCSB1bnNpZ25lZCBsb25nIG5ldHdvcmtfbnVtYmVyKQoreworCWludCBpOworCisJaWYoIHNlbmRwYWNrZXRbMV0gPT0gMHgwMCAmJiBzZW5kcGFja2V0WzJdID09IDB4ODAgJiYKKwkgICAgc2VuZHBhY2tldFs2XSA9PSAweDgxICYmIHNlbmRwYWNrZXRbN10gPT0gMHgzNykgeyAKKworCQkvKiBJdCdzIGFuIElQWCBwYWNrZXQgKi8KKwkJaWYgKCFlbmFibGVfSVBYKXsKKwkJCS8qIFJldHVybiAxIHNvIHdlIGRvbid0IHBhc3MgaXQgdXAgdGhlIHN0YWNrLiAqLworCQkJLy9GSVhNRTogVGFrZSB0aGlzIG91dCB3aGVuIElQWCBpcyBmaXhlZAorCQkJaWYgKG5ldF9yYXRlbGltaXQoKSl7IAorCQkJCXByaW50ayAoS0VSTl9JTkZPIAorCQkJCSIlczogV0FSTklORzogVW5zdXBwb3J0ZWQgSVBYIHBhY2tldCByZWNlaXZlZCBhbmQgZHJvcHBlZFxuIiwKKwkJCQkJZGV2bmFtZSk7CisJCQl9CisJCQlyZXR1cm4gMTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEl0J3Mgbm90IElQWCBzbyByZXR1cm4gYW5kIHBhc3MgaXQgdXAgdGhlIHN0YWNrLiAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiggc2VuZHBhY2tldFsyNF0gPT0gMHg5MCAmJiBzZW5kcGFja2V0WzI1XSA9PSAweDA0KXsKKwkJLyogSXQncyBJUFhXQU4gKi8KKworCQlpZiggc2VuZHBhY2tldFsxMF0gPT0gMHgwMiAmJiBzZW5kcGFja2V0WzQyXSA9PSAweDAwKXsKKworCQkJLyogSXQncyBhIHRpbWVyIHJlcXVlc3QgcGFja2V0ICovCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVjZWl2ZWQgSVBYV0FOIFRpbWVyIFJlcXVlc3QgcGFja2V0XG4iLAorCQkJCQlkZXZuYW1lKTsKKworCQkJLyogR28gdGhyb3VnaCB0aGUgcm91dGluZyBvcHRpb25zIGFuZCBhbnN3ZXIgbm8gdG8gZXZlcnkKKwkJCSAqIG9wdGlvbiBleGNlcHQgVW5udW1iZXJlZCBSSVAvU0FQCisJCQkgKi8KKwkJCWZvcihpID0gNDk7IHNlbmRwYWNrZXRbaV0gPT0gMHgwMDsgaSArPSA1KXsKKwkJCQkvKiAweDAyIGlzIHRoZSBvcHRpb24gZm9yIFVubnVtYmVyZWQgUklQL1NBUCAqLworCQkJCWlmKCBzZW5kcGFja2V0W2kgKyA0XSAhPSAweDAyKXsKKwkJCQkJc2VuZHBhY2tldFtpICsgMV0gPSAwOworCQkJCX0KKwkJCX0KKworCQkJLyogU2tpcCBvdmVyIHRoZSBleHRlbmRlZCBOb2RlIElEIG9wdGlvbiAqLworCQkJaWYoIHNlbmRwYWNrZXRbaV0gPT0gMHgwNCApeworCQkJCWkgKz0gODsKKwkJCX0KKworCQkJLyogV2UgYWxzbyB3YW50IHRvIHR1cm4gb2ZmIGFsbCBoZWFkZXIgY29tcHJlc3Npb24gb3B0LgorCQkJICovCisJCQlmb3IoOyBzZW5kcGFja2V0W2ldID09IDB4ODAgOyl7CisJCQkJc2VuZHBhY2tldFtpICsgMV0gPSAwOworCQkJCWkgKz0gKHNlbmRwYWNrZXRbaSArIDJdIDw8IDgpICsgKHNlbmRwYWNrZXRbaSArIDNdKSArIDQ7CisJCQl9CisKKwkJCS8qIFNldCB0aGUgcGFja2V0IHR5cGUgdG8gdGltZXIgcmVzcG9uc2UgKi8KKwkJCXNlbmRwYWNrZXRbNDJdID0gMHgwMTsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNlbmRpbmcgSVBYV0FOIFRpbWVyIFJlc3BvbnNlXG4iLAorCQkJCQlkZXZuYW1lKTsKKworCQl9IGVsc2UgaWYoIHNlbmRwYWNrZXRbNDJdID09IDB4MDIgKXsKKworCQkJLyogVGhpcyBpcyBhbiBpbmZvcm1hdGlvbiByZXF1ZXN0IHBhY2tldCAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IFJlY2VpdmVkIElQWFdBTiBJbmZvcm1hdGlvbiBSZXF1ZXN0IHBhY2tldFxuIiwKKwkJCQkJCWRldm5hbWUpOworCisJCQkvKiBTZXQgdGhlIHBhY2tldCB0eXBlIHRvIGluZm9ybWF0aW9uIHJlc3BvbnNlICovCisJCQlzZW5kcGFja2V0WzQyXSA9IDB4MDM7CisKKwkJCS8qIFNldCB0aGUgcm91dGVyIG5hbWUgKi8KKwkJCXNlbmRwYWNrZXRbNTldID0gJ0YnOworCQkJc2VuZHBhY2tldFs2MF0gPSAnUCc7CisJCQlzZW5kcGFja2V0WzYxXSA9ICdJJzsKKwkJCXNlbmRwYWNrZXRbNjJdID0gJ1AnOworCQkJc2VuZHBhY2tldFs2M10gPSAnRSc7CisJCQlzZW5kcGFja2V0WzY0XSA9ICctJzsKKwkJCXNlbmRwYWNrZXRbNjVdID0gQ1ZIZXhUb0FzY2lpKG5ldHdvcmtfbnVtYmVyID4+IDI4KTsKKwkJCXNlbmRwYWNrZXRbNjZdID0gQ1ZIZXhUb0FzY2lpKChuZXR3b3JrX251bWJlciAmIDB4MEYwMDAwMDApPj4gMjQpOworCQkJc2VuZHBhY2tldFs2N10gPSBDVkhleFRvQXNjaWkoKG5ldHdvcmtfbnVtYmVyICYgMHgwMEYwMDAwMCk+PiAyMCk7CisJCQlzZW5kcGFja2V0WzY4XSA9IENWSGV4VG9Bc2NpaSgobmV0d29ya19udW1iZXIgJiAweDAwMEYwMDAwKT4+IDE2KTsKKwkJCXNlbmRwYWNrZXRbNjldID0gQ1ZIZXhUb0FzY2lpKChuZXR3b3JrX251bWJlciAmIDB4MDAwMEYwMDApPj4gMTIpOworCQkJc2VuZHBhY2tldFs3MF0gPSBDVkhleFRvQXNjaWkoKG5ldHdvcmtfbnVtYmVyICYgMHgwMDAwMEYwMCk+PiA4KTsKKwkJCXNlbmRwYWNrZXRbNzFdID0gQ1ZIZXhUb0FzY2lpKChuZXR3b3JrX251bWJlciAmIDB4MDAwMDAwRjApPj4gNCk7CisJCQlzZW5kcGFja2V0WzcyXSA9IENWSGV4VG9Bc2NpaShuZXR3b3JrX251bWJlciAmIDB4MDAwMDAwMEYpOworCQkJZm9yKGkgPSA3MzsgaSA8IDEwNzsgaSs9IDEpCisJCQl7CisJCQkJc2VuZHBhY2tldFtpXSA9IDA7CisJCQl9CisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTZW5kaW5nIElQWFdBTiBJbmZvcm1hdGlvbiBSZXNwb25zZSBwYWNrZXRcbiIsCisJCQkJCWRldm5hbWUpOworCQl9IGVsc2UgeworCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5rbm93biBJUFhXQU4gcGFja2V0IVxuIixkZXZuYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogU2V0IHRoZSBXTm9kZUlEIHRvIG91ciBuZXR3b3JrIGFkZHJlc3MgKi8KKwkJc2VuZHBhY2tldFs0M10gPSAodW5zaWduZWQgY2hhcikobmV0d29ya19udW1iZXIgPj4gMjQpOworCQlzZW5kcGFja2V0WzQ0XSA9ICh1bnNpZ25lZCBjaGFyKSgobmV0d29ya19udW1iZXIgJiAweDAwRkYwMDAwKSA+PiAxNik7CisJCXNlbmRwYWNrZXRbNDVdID0gKHVuc2lnbmVkIGNoYXIpKChuZXR3b3JrX251bWJlciAmIDB4MDAwMEZGMDApID4+IDgpOworCQlzZW5kcGFja2V0WzQ2XSA9ICh1bnNpZ25lZCBjaGFyKShuZXR3b3JrX251bWJlciAmIDB4MDAwMDAwRkYpOworCisJCXJldHVybiAxOworCX0KKworCS8qIElmIHdlIGdldCBoZXJlLCBpdCdzIGFuIElQWC1kYXRhIHBhY2tldCBzbyBpdCdsbCBnZXQgcGFzc2VkIHVwIHRoZSAKKwkgKiBzdGFjay4KKwkgKiBzd2l0Y2ggdGhlIG5ldHdvcmsgbnVtYmVycyAKKwkgKi8KKwlzd2l0Y2hfbmV0X251bWJlcnMoc2VuZHBhY2tldCwgbmV0d29ya19udW1iZXIgLDEpOworCXJldHVybiAwOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBwcm9jZXNzX3JvdXRlCisgKiAKKyAqIFJhdGlvbmFsZToKKyAqCUlmIHRoZSBpbnRlcmZhY2UgZ29lcyBkb3duLCBvciB3ZSByZWNlaXZlIGFuIEFSUCByZXF1ZXN0LAorICogICAgICB3ZSBoYXZlIHRvIGNoYW5nZSB0aGUgbmV0d29yayBpbnRlcmZhY2UgaXAgYWRkcmVzc2VzLgorICogCVRoaXMgY2Fubm90IGJlIGRvbmUgd2l0aGluIHRoZSBpbnRlcnJ1cHQuCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgYXMgYSBwb2xsaW5nIHJvdXRpbmUgdG8gZHluYW1pY2FsbHkgCisgKglhZGQvZGVsZXRlIHJvdXRlcyBuZWdvdGlhdGVkIGJ5IGludmVyc2UgQVJQLiAgSXQgaXMgaW4gdGhpcyAKKyAqICAgIAkidGFzayIgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHJvdXRlcyB0byBiZSBhZGRlZCB3aGlsZSBpbiAKKyAqICAgICAgaW50ZXJydXB0IGNvbnRleHQuCisgKgorICogVXNhZ2U6CisgKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBmcl9wb2xsKCkgcG9sbGluZyBmdW50aW9uLgorICovCisKK3N0YXRpYyB2b2lkIHByb2Nlc3Nfcm91dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlmcl9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90ICpjYXJkID0gY2hhbi0+Y2FyZDsKKworCXN0cnVjdCBpZnJlcSBpZl9pbmZvOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqaWZfZGF0YTsKKwltbV9zZWdtZW50X3QgZnMgPSBnZXRfZnMoKTsKKwl1MzIgaXBfdG1wOworCWludCBlcnI7CisKKworCXN3aXRjaChjaGFuLT5yb3V0ZV9mbGFnKXsKKworCWNhc2UgQUREX1JPVVRFOgorCQkJCQorCQkvKiBTZXQgcmVtb3RlIGFkZHJlc3NlcyAqLworCQltZW1zZXQoJmlmX2luZm8sIDAsIHNpemVvZihpZl9pbmZvKSk7CisJCXN0cmNweShpZl9pbmZvLmlmcl9uYW1lLCBkZXYtPm5hbWUpOworCisJCXNldF9mcyhnZXRfZHMoKSk7ICAgICAvKiBnZXQgdXNlciBzcGFjZSBibG9jayAqLyAKKwkJCisJCWlmX2RhdGEgPSAoc3RydWN0IHNvY2thZGRyX2luICopJmlmX2luZm8uaWZyX2RzdGFkZHI7CisJCWlmX2RhdGEtPnNpbl9hZGRyLnNfYWRkciA9IGNoYW4tPmlwX3JlbW90ZTsKKwkJaWZfZGF0YS0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCWVyciA9IGRldmluZXRfaW9jdGwoIFNJT0NTSUZEU1RBRERSLCAmaWZfaW5mbyApOworCisJCXNldF9mcyhmcyk7ICAgICAgICAgICAvKiByZXN0b3JlIG9sZCBibG9jayAqLworCisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBSb3V0ZSBBZGQgZmFpbGVkLiAgRXJyb3I6ICVkXG4iLCAKKwkJCQkJY2FyZC0+ZGV2bmFtZSxlcnIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFkZHJlc3M6ICV1LiV1LiV1LiV1XG4iLAorCQkJCWNoYW4tPm5hbWUsIE5JUFFVQUQoY2hhbi0+aXBfcmVtb3RlKSk7CisKKwkJfWVsc2UgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJvdXRlIEFkZGVkIFN1Y2Nlc3NmdWxseTogJXUuJXUuJXUuJXVcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSxOSVBRVUFEKGNoYW4tPmlwX3JlbW90ZSkpOworCQkJY2hhbi0+cm91dGVfZmxhZyA9IFJPVVRFX0FEREVEOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSRU1PVkVfUk9VVEU6CisKKwkJLyogU2V0IHJlbW90ZSBhZGRyZXNzZXMgKi8KKwkJbWVtc2V0KCZpZl9pbmZvLCAwLCBzaXplb2YoaWZfaW5mbykpOworCQlzdHJjcHkoaWZfaW5mby5pZnJfbmFtZSwgZGV2LT5uYW1lKTsKKworCQlpcF90bXAgPSBnZXRfaXBfYWRkcmVzcyhkZXYsV0FOX1BPSU5UT1BPSU5UX0lQKTsJCisKKwkJc2V0X2ZzKGdldF9kcygpKTsgICAgIC8qIGdldCB1c2VyIHNwYWNlIGJsb2NrICovIAorCQkKKwkJaWZfZGF0YSA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaWZfaW5mby5pZnJfZHN0YWRkcjsKKwkJaWZfZGF0YS0+c2luX2FkZHIuc19hZGRyID0gMDsKKwkJaWZfZGF0YS0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCWVyciA9IGRldmluZXRfaW9jdGwoIFNJT0NTSUZEU1RBRERSLCAmaWZfaW5mbyApOworCisJCXNldF9mcyhmcyk7ICAgIAorCQkKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IERlbGV0aW5nIG9mIHJvdXRlIGZhaWxlZC4gIEVycm9yOiAlZFxuIiwgCisJCQkJCWNhcmQtPmRldm5hbWUsZXJyKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBZGRyZXNzOiAldS4ldS4ldS4ldVxuIiwKKwkJCQlkZXYtPm5hbWUsTklQUVVBRChjaGFuLT5pcF9yZW1vdGUpICk7CisKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSb3V0ZSBSZW1vdmVkIFN1Y2Vzc2Z1bHk6ICV1LiV1LiV1LiV1XG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lLE5JUFFVQUQoaXBfdG1wKSk7CisJCQljaGFuLT5yb3V0ZV9mbGFnID0gTk9fUk9VVEU7CisJCX0KKwkJYnJlYWs7CisKKwl9IC8qIENhc2UgU3RhdGVtZW50ICovCisKK30KKworCisKKy8qKioqKiogRnJhbWUgUmVsYXkgRmlybXdhcmUtU3BlY2lmaWMgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlYWQgZmlybXdhcmUgY29kZSB2ZXJzaW9uLgorICogbyBmaWxsIHN0cmluZyBzdHIgd2l0aCBmaXJtd2FyZSB2ZXJzaW9uIGluZm8uIAorICovCitzdGF0aWMgaW50IGZyX3JlYWRfdmVyc2lvbiAoc2RsYV90KiBjYXJkLCBjaGFyKiBzdHIpCit7CisJZnJfbWJveF90KiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkbworCXsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9SRUFEX0NPREVfVkVSU0lPTjsKKwkJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiBmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpKTsKKwkKKwlpZiAoIWVyciAmJiBzdHIpIHsKKwkJaW50IGxlbiA9IG1ib3gtPmNtZC5sZW5ndGg7CisJCW1lbWNweShzdHIsIG1ib3gtPmRhdGEsIGxlbik7CisJICAgICAgICBzdHJbbGVuXSA9ICdcMCc7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IGdsb2JhbCBjb25maWd1cmF0aW9uLgorICovCitzdGF0aWMgaW50IGZyX2NvbmZpZ3VyZSAoc2RsYV90KiBjYXJkLCBmcl9jb25mX3QgKmNvbmYpCit7CisJZnJfbWJveF90KiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBkbGNpX251bSA9IGNhcmQtPnUuZi5kbGNpX251bTsKKwlpbnQgZXJyLCBpOworCisJZG8KKwl7CisJCW1lbWNweShtYm94LT5kYXRhLCBjb25mLCBzaXplb2YoZnJfY29uZl90KSk7CisKKwkJaWYgKGRsY2lfbnVtKSBmb3IgKGkgPSAwOyBpIDwgZGxjaV9udW07ICsraSkKKwkJCSgoZnJfY29uZl90KiltYm94LT5kYXRhKS0+ZGxjaVtpXSA9IAorCQkJCQljYXJkLT51LmYubm9kZV9kbGNpW2ldOyAKKwkJCisJCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfU0VUX0NPTkZJRzsKKwkJbWJveC0+Y21kLmxlbmd0aCA9CisJCQlzaXplb2YoZnJfY29uZl90KSArIGRsY2lfbnVtICogc2l6ZW9mKHNob3J0KTsKKworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJCisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KSk7CisKKwkvKk5DIE9jdCAxMiAyMDAwICovCisJaWYgKGVyciAhPSBDTURfT0speworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGcmFtZSBSZWxheSBDb25maWd1cmF0aW9uIEZhaWxlZDogcmM9MHgleFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLGVycik7CisJfQorCQorCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IERMQ0kgY29uZmlndXJhdGlvbi4KKyAqLworc3RhdGljIGludCBmcl9kbGNpX2NvbmZpZ3VyZSAoc2RsYV90KiBjYXJkLCBmcl9kbGNfY29uZl90ICpjb25mLCB1bnNpZ25lZCBkbGNpKQoreworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1lbWNweShtYm94LT5kYXRhLCBjb25mLCBzaXplb2YoZnJfZGxjX2NvbmZfdCkpOworCQltYm94LT5jbWQuZGxjaSA9ICh1bnNpZ25lZCBzaG9ydCkgZGxjaTsgCisJCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfU0VUX0NPTkZJRzsKKwkJbWJveC0+Y21kLmxlbmd0aCA9IHNpemVvZihmcl9kbGNfY29uZl90KTsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tKTsKKwkKKwlyZXR1cm4gZXJyOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXQgaW50ZXJydXB0IG1vZGUuCisgKi8KK3N0YXRpYyBpbnQgZnJfc2V0X2ludHJfbW9kZSAoc2RsYV90KiBjYXJkLCB1bnNpZ25lZCBtb2RlLCB1bnNpZ25lZCBtdHUsCisJdW5zaWduZWQgc2hvcnQgdGltZW91dCkKK3sKKwlmcl9tYm94X3QqIG1ib3ggPSBjYXJkLT5tYm94OworCWZyNTA4X2ludHJfY3RsX3QqIGljdGwgPSAodm9pZCopbWJveC0+ZGF0YTsKKwlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkbworCXsKKwkJbWVtc2V0KGljdGwsIDAsIHNpemVvZihmcjUwOF9pbnRyX2N0bF90KSk7CisJCWljdGwtPm1vZGUgICA9IG1vZGU7CisJCWljdGwtPnR4X2xlbiA9IG10dTsKKwkJaWN0bC0+aXJxICAgID0gY2FyZC0+aHcuaXJxOworCisJCS8qIGluZGljYXRlIHRpbWVvdXQgb24gdGltZXIgKi8KKwkJaWYgKG1vZGUgJiAweDIwKSBpY3RsLT50aW1lb3V0ID0gdGltZW91dDsgCisKKwkJbWJveC0+Y21kLmxlbmd0aCA9IHNpemVvZihmcjUwOF9pbnRyX2N0bF90KTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9TRVRfSU5UUl9NT0RFOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiBmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpKTsKKwkKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEVuYWJsZSBjb21tdW5pY2F0aW9ucy4KKyAqLworc3RhdGljIGludCBmcl9jb21tX2VuYWJsZSAoc2RsYV90KiBjYXJkKQoreworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfQ09NTV9FTkFCTEU7CisJCW1ib3gtPmNtZC5sZW5ndGggPSAwOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KSk7CisJCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBmcl9jb21tX2Rpc2FibGUgCisgKgorICogV2FybmluZzogVGhpcyBmdW5jdGluIGlzIGNhbGxlZCBieSB0aGUgc2h1dGRvd24oKSBwcm9jZWR1cmUuIEl0IGlzIHZvaWQKKyAqICAgICAgICAgIHNpbmNlIGRldi0+cHJpdiBhcmUgaGFzIGFscmVhZHkgYmVlbiBkZWFsbG9jYXRlZCBhbmQgbm8KKyAqICAgICAgICAgIGVycm9yIGNoZWNraW5nIGlzIHBvc3NpYmxlIHVzaW5nIGZyX2V2ZW50KCkgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIGZyX2NvbW1fZGlzYWJsZSAoc2RsYV90KiBjYXJkKQoreworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8geworCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfU0VUX01PREVNX1NUQVRVUzsKKwltYm94LT5jbWQubGVuZ3RoID0gMTsKKwltYm94LT5kYXRhWzBdID0gMDsKKwllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0pOworCQorCXJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwkKKwlkbworCXsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9DT01NX0RJU0FCTEU7CisJCW1ib3gtPmNtZC5sZW5ndGggPSAwOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0pOworCisJcmV0dXJuOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBHZXQgY29tbXVuaWNhdGlvbnMgZXJyb3Igc3RhdGlzdGljcy4gCisgKi8KK3N0YXRpYyBpbnQgZnJfZ2V0X2Vycl9zdGF0cyAoc2RsYV90KiBjYXJkKQoreworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisKKwlkbworCXsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9SRUFEX0VSUk9SX1NUQVRTOworCQltYm94LT5jbWQubGVuZ3RoID0gMDsKKwkJbWJveC0+Y21kLmRsY2kgPSAwOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KSk7CisKKwlpZiAoIWVycikgeworCQlmcl9jb21tX3N0YXRfdCogc3RhdHMgPSAodm9pZCopbWJveC0+ZGF0YTsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X292ZXJfZXJyb3JzICAgID0gc3RhdHMtPnJ4X292ZXJydW5zOworCQljYXJkLT53YW5kZXYuc3RhdHMucnhfY3JjX2Vycm9ycyAgICAgPSBzdGF0cy0+cnhfYmFkX2NyYzsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMgID0gc3RhdHMtPnJ4X2Fib3J0czsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgID0gc3RhdHMtPnJ4X3Rvb19sb25nOworCQljYXJkLT53YW5kZXYuc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgPSBzdGF0cy0+dHhfYWJvcnRzOworCQorCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogR2V0IHN0YXRpc3RpY3MuIAorICovCitzdGF0aWMgaW50IGZyX2dldF9zdGF0cyAoc2RsYV90KiBjYXJkKQoreworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisKKwlkbworCXsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9SRUFEX1NUQVRJU1RJQ1M7CisJCW1ib3gtPmNtZC5sZW5ndGggPSAwOworCQltYm94LT5jbWQuZGxjaSA9IDA7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiBmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpKTsKKworCWlmICghZXJyKSB7CisJCWZyX2xpbmtfc3RhdF90KiBzdGF0cyA9ICh2b2lkKiltYm94LT5kYXRhOworCQljYXJkLT53YW5kZXYuc3RhdHMucnhfZnJhbWVfZXJyb3JzID0gc3RhdHMtPnJ4X2JhZF9mb3JtYXQ7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9kcm9wcGVkID0KKwkJCXN0YXRzLT5yeF9kcm9wcGVkICsgc3RhdHMtPnJ4X2Ryb3BwZWQyOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQWRkIERMQ0kocykgKEFjY2VzcyBOb2RlIG9ubHkhKS4KKyAqIFRoaXMgcm91dGluZSB3aWxsIHBlcmZvcm0gdGhlIEFERF9ETENJcyBjb21tYW5kIGZvciB0aGUgc3BlY2lmaWVkIERMQ0kuCisgKi8KK3N0YXRpYyBpbnQgZnJfYWRkX2RsY2kgKHNkbGFfdCogY2FyZCwgaW50IGRsY2kpCit7CisJZnJfbWJveF90KiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkbworCXsKKwkJdW5zaWduZWQgc2hvcnQqIGRsY2lfbGlzdCA9ICh2b2lkKiltYm94LT5kYXRhOworCisJCW1ib3gtPmNtZC5sZW5ndGggID0gc2l6ZW9mKHNob3J0KTsKKwkJZGxjaV9saXN0WzBdID0gZGxjaTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9BRERfRExDSTsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KSk7CisJCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBBY3RpdmF0ZSBETENJKHMpIChBY2Nlc3MgTm9kZSBvbmx5ISkuIAorICogVGhpcyByb3V0aW5lIHdpbGwgcGVyZm9ybSB0aGUgQUNUSVZBVEVfRExDSXMgY29tbWFuZCB3aXRoIGEgRExDSSBudW1iZXIuIAorICovCitzdGF0aWMgaW50IGZyX2FjdGl2YXRlX2RsY2kgKHNkbGFfdCogY2FyZCwgaW50IGRsY2kpCit7CisJZnJfbWJveF90KiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkbworCXsKKwkJdW5zaWduZWQgc2hvcnQqIGRsY2lfbGlzdCA9ICh2b2lkKiltYm94LT5kYXRhOworCisJCW1ib3gtPmNtZC5sZW5ndGggID0gc2l6ZW9mKHNob3J0KTsKKwkJZGxjaV9saXN0WzBdID0gZGxjaTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9BQ1RJVkFURV9ETENJOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiBmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpKTsKKwkKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERlbGV0ZSBETENJKHMpIChBY2Nlc3MgTm9kZSBvbmx5ISkuIAorICogVGhpcyByb3V0aW5lIHdpbGwgcGVyZm9ybSB0aGUgREVMRVRFX0RMQ0lzIGNvbW1hbmQgd2l0aCBhIERMQ0kgbnVtYmVyLiAKKyAqLworc3RhdGljIGludCBmcl9kZWxldGVfZGxjaSAoc2RsYV90KiBjYXJkLCBpbnQgZGxjaSkKK3sKKwlmcl9tYm94X3QqIG1ib3ggPSBjYXJkLT5tYm94OworCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCWRvCisJeworCQl1bnNpZ25lZCBzaG9ydCogZGxjaV9saXN0ID0gKHZvaWQqKW1ib3gtPmRhdGE7CisKKwkJbWJveC0+Y21kLmxlbmd0aCAgPSBzaXplb2Yoc2hvcnQpOworCQlkbGNpX2xpc3RbMF0gPSBkbGNpOworCQltYm94LT5jbWQuY29tbWFuZCA9IEZSX0RFTEVURV9ETENJOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiBmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpKTsKKwkKKwlyZXR1cm4gZXJyOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJc3N1ZSBpbi1jaGFubmVsIHNpZ25hbGxpbmcgZnJhbWUuIAorICovCitzdGF0aWMgaW50IGZyX2lzc3VlX2lzZiAoc2RsYV90KiBjYXJkLCBpbnQgaXNmKQoreworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1ib3gtPmRhdGFbMF0gPSBpc2Y7CisJCW1ib3gtPmNtZC5sZW5ndGggID0gMTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9JU1NVRV9JU19GUkFNRTsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIGZyX2V2ZW50KGNhcmQsIGVyciwgbWJveCkpOworCQorCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCBmcl9zZW5kX2hkciAoc2RsYV90KmNhcmQsIGludCBkbGNpLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBmaW5kX2NoYW5uZWwoY2FyZCxkbGNpKTsJCisJZnJfY2hhbm5lbF90ICpjaGFuOworCisJaWYgKCFkZXYgfHwgIShjaGFuPWRldi0+cHJpdikpCisJCXJldHVybiBvZmZzZXQ7CisJCisJaWYgKGNoYW4tPmZyX2hlYWRlcl9sZW4peworCQlzZGxhX3Bva2UoJmNhcmQtPmh3LCBvZmZzZXQsIGNoYW4tPmZyX2hlYWRlciwgY2hhbi0+ZnJfaGVhZGVyX2xlbik7CisJfQorCQorCXJldHVybiBvZmZzZXQrY2hhbi0+ZnJfaGVhZGVyX2xlbjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIGEgZnJhbWUgb24gYSBzZWxlY3RlZCBETENJLiAgCisgKi8KK3N0YXRpYyBpbnQgZnJfc2VuZF9kYXRhX2hlYWRlciAoc2RsYV90KiBjYXJkLCBpbnQgZGxjaSwgdW5zaWduZWQgY2hhciBhdHRyLCBpbnQgbGVuLAorCXZvaWQgKmJ1ZiwgdW5zaWduZWQgY2hhciBoZHJfbGVuKQoreworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3ggKyAweDgwMDsKKwlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkbworCXsKKwkJbWJveC0+Y21kLmRsY2kgICAgPSBkbGNpOworCQltYm94LT5jbWQuYXR0ciAgICA9IGF0dHI7CisJCW1ib3gtPmNtZC5sZW5ndGggID0gbGVuK2hkcl9sZW47CisJCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfV1JJVEU7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiBmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpKTsKKworCWlmICghZXJyKSB7CisJCWZyX3R4X2J1Zl9jdGxfdCogZnJidWY7CisgCisgICAgICAgICAgICAgICAJaWYoY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpCisJCQlmcmJ1ZiA9ICh2b2lkKikoKih1bnNpZ25lZCBsb25nKiltYm94LT5kYXRhICsKKyAgICAgICAgICAgICAgICAgICAgICAgIAljYXJkLT5ody5kcG1iYXNlKTsKKwkJZWxzZQorCQkJZnJidWYgPSAodm9pZCopKCoodW5zaWduZWQgbG9uZyopbWJveC0+ZGF0YSAtCisgICAgICAgICAgICAgICAgICAgICAgICAJRlJfTUJfVkVDVE9SICsgY2FyZC0+aHcuZHBtYmFzZSk7CisKKwkJc2RsYV9wb2tlKCZjYXJkLT5odywgZnJfc2VuZF9oZHIoY2FyZCxkbGNpLGZyYnVmLT5vZmZzZXQpLCBidWYsIGxlbik7CisJCWZyYnVmLT5mbGFnID0gMHgwMTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGZyX3NlbmQgKHNkbGFfdCogY2FyZCwgaW50IGRsY2ksIHVuc2lnbmVkIGNoYXIgYXR0ciwgaW50IGxlbiwKKwl2b2lkICpidWYpCit7CisJZnJfbWJveF90KiBtYm94ID0gY2FyZC0+bWJveCArIDB4ODAwOworCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCWRvCisJeworCQltYm94LT5jbWQuZGxjaSAgICA9IGRsY2k7CisJCW1ib3gtPmNtZC5hdHRyICAgID0gYXR0cjsKKwkJbWJveC0+Y21kLmxlbmd0aCAgPSBsZW47CisJCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfV1JJVEU7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiBmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpKTsKKworCWlmICghZXJyKSB7CisJCWZyX3R4X2J1Zl9jdGxfdCogZnJidWY7CisgCisgICAgICAgICAgICAgICAJaWYoY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpCisJCQlmcmJ1ZiA9ICh2b2lkKikoKih1bnNpZ25lZCBsb25nKiltYm94LT5kYXRhICsKKyAgICAgICAgICAgICAgICAgICAgICAgIAljYXJkLT5ody5kcG1iYXNlKTsKKwkJZWxzZQorCQkJZnJidWYgPSAodm9pZCopKCoodW5zaWduZWQgbG9uZyopbWJveC0+ZGF0YSAtCisgICAgICAgICAgICAgICAgICAgICAgICAJRlJfTUJfVkVDVE9SICsgY2FyZC0+aHcuZHBtYmFzZSk7CisKKwkJc2RsYV9wb2tlKCZjYXJkLT5odywgZnJidWYtPm9mZnNldCwgYnVmLCBsZW4pOworCQlmcmJ1Zi0+ZmxhZyA9IDB4MDE7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworCisvKioqKioqIEZpcm13YXJlIEFzeW5jaHJvbm91cyBFdmVudCBIYW5kbGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBNYWluIGFzeW5jcm9ub3VzIGV2ZW50L2Vycm9yIGhhbmRsZXIuCisgKglUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW5ldmVyIGZpcm13YXJlIGNvbW1hbmQgcmV0dXJucyBub24temVybworICoJcmV0dXJuIGNvZGUuCisgKgorICogUmV0dXJuIHplcm8gaWYgcHJldmlvdXMgY29tbWFuZCBoYXMgdG8gYmUgY2FuY2VsbGVkLgorICovCitzdGF0aWMgaW50IGZyX2V2ZW50IChzZGxhX3QgKmNhcmQsIGludCBldmVudCwgZnJfbWJveF90KiBtYm94KQoreworCWZyNTA4X2ZsYWdzX3QqIGZsYWdzID0gY2FyZC0+ZmxhZ3M7CisJY2hhciAqcHRyID0gJmZsYWdzLT5pZmxhZzsKKwlpbnQgaTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKworCQljYXNlIEZSUkVTX01PREVNX0ZBSUxVUkU6CisJCQlyZXR1cm4gZnJfbW9kZW1fZmFpbHVyZShjYXJkLCBtYm94KTsKKworCQljYXNlIEZSUkVTX0NIQU5ORUxfRE9XTjogeworCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCQkJLyogUmVtb3ZlIGFsbCByb3V0ZXMgZnJvbSBhc3NvY2lhdGVkIERMQ0kncyAqLworCQkJZm9yIChkZXYgPSBjYXJkLT53YW5kZXYuZGV2OyBkZXY7CisJCQkgICAgIGRldiA9ICooKHN0cnVjdCBuZXRfZGV2aWNlICoqKWRldi0+cHJpdikpIHsKKwkJCQlmcl9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CisJCQkJaWYgKGNoYW4tPnJvdXRlX2ZsYWcgPT0gUk9VVEVfQURERUQpIHsKKwkJCQkJY2hhbi0+cm91dGVfZmxhZyA9IFJFTU9WRV9ST1VURTsKKwkJCQl9CisKKwkJCQlpZiAoY2hhbi0+aW5hcnAgPT0gSU5BUlBfQ09ORklHVVJFRCkgeworCQkJCQljaGFuLT5pbmFycCA9IElOQVJQX1JFUVVFU1Q7CisJCQkJfQorCisJCQkJLyogSWYgdGhlIGxpbmsgYmVjb21lcyBkaXNjb25uZWN0ZWQgdGhlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWxsIGNoYW5uZWxzIHdpbGwgYmUgZGlzY29ubmVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFzIHdlbGwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQkJCXNldF9jaGFuX3N0YXRlKGRldixXQU5fRElTQ09OTkVDVEVEKTsKKwkJCX0KKwkJCQkKKwkJCXdhbnBpcGVfc2V0X3N0YXRlKGNhcmQsIFdBTl9ESVNDT05ORUNURUQpOworCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJY2FzZSBGUlJFU19DSEFOTkVMX1VQOiB7CisJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJCQkvKiBGSVhNRTogT25seSBzdGFydHVwIGRldmljZXMgdGhhdCBhcmUgb24gdGhlIGxpc3QgKi8KKwkJCQorCQkJZm9yIChkZXYgPSBjYXJkLT53YW5kZXYuZGV2OyBkZXY7CisJCQkgICAgIGRldiA9ICooKHN0cnVjdCBuZXRfZGV2aWNlICoqKWRldi0+cHJpdikpIHsKKwkJCQkKKwkJCQlzZXRfY2hhbl9zdGF0ZShkZXYsV0FOX0NPTk5FQ1RFRCk7CisJCQl9CisKKwkJCXdhbnBpcGVfc2V0X3N0YXRlKGNhcmQsIFdBTl9DT05ORUNURUQpOworCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJY2FzZSBGUlJFU19ETENJX0NIQU5HRToKKwkJCXJldHVybiBmcl9kbGNpX2NoYW5nZShjYXJkLCBtYm94KTsKKworCQljYXNlIEZSUkVTX0RMQ0lfTUlTTUFUQ0g6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRExDSSBsaXN0IG1pc21hdGNoIVxuIiwgCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gMTsKKworCQljYXNlIENNRF9USU1FT1VUOgorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY29tbWFuZCAweCUwMlggdGltZWQgb3V0IVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCBtYm94LT5jbWQuY29tbWFuZCk7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSUQgQnl0ZXMgPSAiLGNhcmQtPmRldm5hbWUpOworIAkgICAgCQlmb3IoaSA9IDA7IGkgPCA4OyBpICsrKQorCQkJCXByaW50ayhLRVJOX0lORk8gIjB4JTAyWCAiLCAqKHB0ciArIDB4MTggKyBpKSk7CisJICAgCSAJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsJCisgICAgICAgICAgICAKKwkJCWJyZWFrOworCisJCWNhc2UgRlJSRVNfRExDSV9JTkFDVElWRToKKwkJCWJyZWFrOworIAorCQljYXNlIEZSUkVTX0NJUl9PVkVSRkxPVzoKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgRlJSRVNfQlVGRkVSX09WRVJGTE9XOgorCQkJYnJlYWs7IAorCQkJCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogY29tbWFuZCAweCUwMlggcmV0dXJuZWQgMHglMDJYIVxuIgorCQkJCSwgY2FyZC0+ZGV2bmFtZSwgbWJveC0+Y21kLmNvbW1hbmQsIGV2ZW50KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBIYW5kbGUgbW9kZW0gZXJyb3IuCisgKgorICogUmV0dXJuIHplcm8gaWYgcHJldmlvdXMgY29tbWFuZCBoYXMgdG8gYmUgY2FuY2VsbGVkLgorICovCitzdGF0aWMgaW50IGZyX21vZGVtX2ZhaWx1cmUgKHNkbGFfdCAqY2FyZCwgZnJfbWJveF90KiBtYm94KQoreworCXByaW50ayhLRVJOX0lORk8gIiVzOiBwaHlzaWNhbCBsaW5rIGRvd24hIChtb2RlbSBlcnJvciAweCUwMlgpXG4iLAorCQljYXJkLT5kZXZuYW1lLCBtYm94LT5kYXRhWzBdKTsKKworCXN3aXRjaCAobWJveC0+Y21kLmNvbW1hbmQpeworCQljYXNlIEZSX1dSSVRFOgorCQorCQljYXNlIEZSX1JFQUQ6CisJCQlyZXR1cm4gMDsKKwl9CisJCisJcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSGFuZGxlIERMQ0kgc3RhdHVzIGNoYW5nZS4KKyAqCisgKiBSZXR1cm4gemVybyBpZiBwcmV2aW91cyBjb21tYW5kIGhhcyB0byBiZSBjYW5jZWxsZWQuCisgKi8KK3N0YXRpYyBpbnQgZnJfZGxjaV9jaGFuZ2UgKHNkbGFfdCAqY2FyZCwgZnJfbWJveF90KiBtYm94KQoreworCWRsY2lfc3RhdHVzX3QqIHN0YXR1cyA9ICh2b2lkKiltYm94LT5kYXRhOworCWludCBjbnQgPSBtYm94LT5jbWQubGVuZ3RoIC8gc2l6ZW9mKGRsY2lfc3RhdHVzX3QpOworCWZyX2NoYW5uZWxfdCAqY2hhbjsKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2MjsKKwkKKworCWZvciAoOyBjbnQ7IC0tY250LCArK3N0YXR1cykgeworCisJCXVuc2lnbmVkIHNob3J0IGRsY2k9IHN0YXR1cy0+ZGxjaTsKKwkJc3RydWN0IG5ldF9kZXZpY2UqIGRldiA9IGZpbmRfY2hhbm5lbChjYXJkLCBkbGNpKTsKKwkJCisJCWlmIChkZXYgPT0gTlVMTCl7CisJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogQ1BFIGNvbnRhaW5zIHVuY29uZmlndXJlZCBETENJPSAlZFxuIiwgCisJCQkJY2FyZC0+ZGV2bmFtZSwgZGxjaSk7IAkKKworICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiB1bmNvbmZpZ3VyZWQgRExDSSAlZCByZXBvcnRlZCBieSBuZXR3b3JrXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgY2FyZC0+ZGV2bmFtZSwgZGxjaSk7CisgCisJCX1lbHNleworCQkJaWYgKHN0YXR1cy0+c3RhdGUgPT0gRlJfTElOS19JTk9QRVIpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCSIlczogRExDSSAldSBpcyBpbmFjdGl2ZSFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsIGRsY2kpOworCisJCQkJaWYgKGRldiAmJiBuZXRpZl9ydW5uaW5nKGRldikpCisJCQkJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RFRCk7CisJCQl9CisJCisJCQlpZiAoc3RhdHVzLT5zdGF0ZSAmIEZSX0RMQ0lfREVMRVRFRCkgeworCisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkiJXM6IERMQ0kgJXUgaGFzIGJlZW4gZGVsZXRlZCFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsIGRsY2kpOworCisJCQkJaWYgKGRldiAmJiBuZXRpZl9ydW5uaW5nKGRldikpeworCisJCQkJCWZyX2NoYW5uZWxfdCAqY2hhbiA9IGRldi0+cHJpdjsKKworCQkJCQlpZiAoY2hhbi0+cm91dGVfZmxhZyA9PSBST1VURV9BRERFRCkgeworCQkJCQkJY2hhbi0+cm91dGVfZmxhZyA9IFJFTU9WRV9ST1VURTsKKwkJCQkJCS8qIFRoZSBzdGF0ZSBjaGFuZ2Ugd2lsbCB0cmlnZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZnIgcG9sbGluZyByb3V0aW5lICovCisJCQkJCX0KKworCQkJCQlpZiAoY2hhbi0+aW5hcnAgPT0gSU5BUlBfQ09ORklHVVJFRCkgeworCQkJCQkJY2hhbi0+aW5hcnAgPSBJTkFSUF9SRVFVRVNUOworCQkJCQl9CisKKwkJCQkJc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fRElTQ09OTkVDVEVEKTsKKwkJCQl9CisKKwkJCX0gZWxzZSBpZiAoc3RhdHVzLT5zdGF0ZSAmIEZSX0RMQ0lfQUNUSVZFKSB7CisKKwkJCQljaGFuID0gZGV2LT5wcml2OworCQkJCisJCQkJLyogVGhpcyBmbGFnIGlzIHVzZWQgZm9yIGNvbmZpZ3VyaW5nIHNwZWNpZmljIAorCQkJCSAgIERMQ0kocykgd2hlbiB0aGV5IGJlY29tZSBhY3RpdmUuCisJCQkgCSovIAorCQkJCWNoYW4tPmRsY2lfY29uZmlndXJlZCA9IERMQ0lfQ09ORklHX1BFTkRJTkc7CisJCisJCQkJc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fQ09OTkVDVEVEKTsKKwkJCisJCQl9CisJCX0KKwl9CisJCisJZm9yIChkZXYyID0gY2FyZC0+d2FuZGV2LmRldjsgZGV2MjsKKwkgICAgIGRldjIgPSAqKChzdHJ1Y3QgbmV0X2RldmljZSAqKilkZXYyLT5wcml2KSl7CisJCQorCQljaGFuID0gZGV2Mi0+cHJpdjsKKwkKKwkJaWYgKGNoYW4tPmRsY2lfY29uZmlndXJlZCA9PSBETENJX0NPTkZJR19QRU5ESU5HKSB7CisJCQlpZiAoZnJfaW5pdF9kbGNpKGNhcmQsIGNoYW4pKXsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCisJfQorCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgZnJfaW5pdF9kbGNpIChzZGxhX3QgKmNhcmQsIGZyX2NoYW5uZWxfdCAqY2hhbikKK3sKKwlmcl9kbGNfY29uZl90IGNmZzsKKwkKKwltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKGNmZykpOworCisJaWYgKCBjaGFuLT5jaXJfc3RhdHVzID09IENJUl9ESVNBQkxFRCkgeworCisJCWNmZy5jaXJfZndkID0gY2ZnLmNpcl9id2QgID0gMTY7CisJCWNmZy5iY19md2QgPSBjZmcuYmNfYndkID0gMTY7CisJCWNmZy5jb25mX2ZsYWdzID0gMHgwMDAxOwkKKworCX1lbHNlIGlmIChjaGFuLT5jaXJfc3RhdHVzID09IENJUl9FTkFCTEVEKSB7CisJCisJCWNmZy5jaXJfZndkID0gY2ZnLmNpcl9id2QgPSBjaGFuLT5jaXI7CisJCWNmZy5iY19md2QgID0gY2ZnLmJjX2J3ZCAgPSBjaGFuLT5iYzsKKwkJY2ZnLmJlX2Z3ZCAgPSBjZmcuYmVfYndkICA9IGNoYW4tPmJlOworCQljZmcuY29uZl9mbGFncyA9IDB4MDAwMDsKKwl9CisJCisJaWYgKGZyX2RsY2lfY29uZmlndXJlKCBjYXJkLCAmY2ZnICwgY2hhbi0+ZGxjaSkpeworCQlwcmludGsoS0VSTl9JTkZPIAorCQkJIiVzOiBETENJIENvbmZpZ3VyZSBmYWlsZWQgZm9yICVkXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIGNoYW4tPmRsY2kpOworCQlyZXR1cm4gMTsJCisJfQorCQorCWNoYW4tPmRsY2lfY29uZmlndXJlZCA9IERMQ0lfQ09ORklHVVJFRDsKKworCS8qIFJlYWQgdGhlIGludGVyZmFjZSBieXRlIG1hcHBpbmcgaW50byB0aGUgY2hhbm5lbCAKKwkgKiBzdHJ1Y3R1cmUuCisJICovCisJcmVhZF9ETENJX0lCX21hcHBpbmcoIGNhcmQsIGNoYW4gKTsKKworCXJldHVybiAwOworfQorLyoqKioqKiogTWlzY2VsbGFuZW91cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXBkYXRlIGNoYW5uZWwgc3RhdGUuIAorICovCitzdGF0aWMgaW50IHVwZGF0ZV9jaGFuX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJZnJfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisJZnJfbWJveF90KiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkbworCXsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9MSVNUX0FDVElWRV9ETENJOworCQltYm94LT5jbWQubGVuZ3RoID0gMDsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIGZyX2V2ZW50KGNhcmQsIGVyciwgbWJveCkpOworCisJaWYgKCFlcnIpIHsKKwkJCisJCXVuc2lnbmVkIHNob3J0KiBsaXN0ID0gKHZvaWQqKW1ib3gtPmRhdGE7CisJCWludCBjbnQgPSBtYm94LT5jbWQubGVuZ3RoIC8gc2l6ZW9mKHNob3J0KTsKKwkJCisJCWVycj0xOworCQkKKwkJZm9yICg7IGNudDsgLS1jbnQsICsrbGlzdCkgeworCisJCQlpZiAoKmxpc3QgPT0gY2hhbi0+ZGxjaSkgeworIAkJCQlzZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9DT05ORUNURUQpOworCisKKwkJCQkvKiBNYXkgMjMgMjAwMC4gTkMKKwkJCQkgKiBXaGVuIGEgZGxjaSBpcyBhZGRlZCBvciByZXN0YXJ0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBkbGNpX2ludF9pbnRlcmZhY2UgcG9pbnRlciBtdXN0CisJCQkJICogYmUgcmVpbml0aWFsaXplZC4gICovCisJCQkJaWYgKCFjaGFuLT5kbGNpX2ludF9pbnRlcmZhY2UpeworCQkJCQllcnI9ZnJfaW5pdF9kbGNpIChjYXJkLGNoYW4pOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IGNoYW5uZWwgc3RhdGUuCisgKi8KK3N0YXRpYyB2b2lkIHNldF9jaGFuX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIGludCBzdGF0ZSkKK3sKKwlmcl9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90KiBjYXJkID0gY2hhbi0+Y2FyZDsKKworCWlmIChjaGFuLT5jb21tb24uc3RhdGUgIT0gc3RhdGUpIHsKKworCQlzd2l0Y2ggKHN0YXRlKSB7CisKKwkJCWNhc2UgV0FOX0NPTk5FQ1RFRDoKKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCSIlczogSW50ZXJmYWNlICVzOiBETENJICVkIGNvbm5lY3RlZFxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lLCBjaGFuLT5kbGNpKTsKKworCQkJCS8qIElmIHRoZSBpbnRlcmZhY2Ugd2FzIHByZXZpb3Vsc3kgZG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYnJpbmcgaXQgdXAsIHNpbmNlIHRoZSBjaGFubmVsIGlzIGFjdGl2ZSAqLworCisJCQkJdHJpZ2dlcl9mcl9wb2xsIChkZXYpOworCQkJCXRyaWdnZXJfZnJfYXJwICAoZGV2KTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBXQU5fQ09OTkVDVElORzoKKwkJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSAgICAgICIlczogSW50ZXJmYWNlICVzOiBETENJICVkIGNvbm5lY3RpbmdcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsIGRldi0+bmFtZSwgY2hhbi0+ZGxjaSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgV0FOX0RJU0NPTk5FQ1RFRDoKKwkJCQlwcmludGsgKEtFUk5fSU5GTyAKKwkJCQkgICAgIiVzOiBJbnRlcmZhY2UgJXM6IERMQ0kgJWQgZGlzY29ubmVjdGVkIVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lLCBjaGFuLT5kbGNpKTsKKwkJCQorCQkJCS8qIElmIHRoZSBpbnRlcmZhY2UgaXMgdXAsIGJyaW5nIGl0IGRvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpbmNlIHRoZSBjaGFubmVsIGlzIG5vdyBkaXNjb25uZWN0ZWQgKi8KKwkJCQl0cmlnZ2VyX2ZyX3BvbGwgKGRldik7CisJCQkJYnJlYWs7CisJCX0KKworCQljaGFuLT5jb21tb24uc3RhdGUgPSBzdGF0ZTsKKwl9CisKKwljaGFuLT5zdGF0ZV90aWNrID0gamlmZmllczsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGaW5kIG5ldHdvcmsgZGV2aWNlIGJ5IGl0cyBjaGFubmVsIG51bWJlci4KKyAqCisgKiBXZSBuZWVkIHRoaXMgY3JpdGljYWwgZmxhZyBiZWNhdXNlIHdlIGNoYW5nZQorICogdGhlIGRsY2lfdG9fZGV2X21hcCBvdXRzaWRlIHRoZSBpbnRlcnJ1cHQuCisgKgorICogTk9URTogZGVsX2lmKCkgZnVuY3Rpb25zIHVwZGF0ZXMgdGhpcyBhcnJheSwgaXQgdXNlcworICogICAgICAgdGhlIHNwaW4gbG9ja3MgdG8gYXZvaWQgY29ycnVwdGlvbi4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlKiBmaW5kX2NoYW5uZWwoc2RsYV90KiBjYXJkLCB1bnNpZ25lZCBkbGNpKQoreworCWlmKGRsY2kgPiBISUdIRVNUX1ZBTElEX0RMQ0kpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuKGNhcmQtPnUuZi5kbGNpX3RvX2Rldl9tYXBbZGxjaV0pOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENoZWNrIHRvIHNlZSBpZiBhIGZyYW1lIGNhbiBiZSBzZW50LiBJZiBubyB0cmFuc21pdCBidWZmZXJzIGF2YWlsYWJsZSwKKyAqIGVuYWJsZSB0cmFuc21pdCBpbnRlcnJ1cHRzLgorICoKKyAqIFJldHVybjoJMSAtIFR4IGJ1ZmZlcihzKSBhdmFpbGFibGUKKyAqCQkwIC0gbm8gYnVmZmVycyBhdmFpbGFibGUKKyAqLworc3RhdGljIGludCBpc190eF9yZWFkeSAoc2RsYV90KiBjYXJkLCBmcl9jaGFubmVsX3QqIGNoYW4pCit7CisJdW5zaWduZWQgY2hhciBzYjsKKworICAgICAgICBpZihjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCkKKwkJcmV0dXJuIDE7CisKKwlzYiA9IGluYihjYXJkLT5ody5wb3J0KTsKKwlpZiAoc2IgJiAweDAyKSAKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb252ZXJ0IGRlY2ltYWwgc3RyaW5nIHRvIHVuc2lnbmVkIGludGVnZXIuCisgKiBJZiBsZW4gIT0gMCB0aGVuIG9ubHkgJ2xlbicgY2hhcmFjdGVycyBvZiB0aGUgc3RyaW5nIGFyZSBjb252ZXJ0ZWQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVjX3RvX3VpbnQgKHVuc2lnbmVkIGNoYXIqIHN0ciwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCB2YWw7CisKKwlpZiAoIWxlbikgCisJCWxlbiA9IHN0cmxlbihzdHIpOworCisJZm9yICh2YWwgPSAwOyBsZW4gJiYgaXNfZGlnaXQoKnN0cik7ICsrc3RyLCAtLWxlbikKKwkJdmFsID0gKHZhbCAqIDEwKSArICgqc3RyIC0gKHVuc2lnbmVkKScwJyk7CisKKwlyZXR1cm4gdmFsOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RvcmUgYSBVRFAgbWFuYWdlbWVudCBwYWNrZXQgZm9yIGxhdGVyIHByb2Nlc3NpbmcuCisgKi8KKworc3RhdGljIGludCBzdG9yZV91ZHBfbWdtdF9wa3QoaW50IHVkcF90eXBlLCBjaGFyIHVkcF9wa3Rfc3JjLCBzZGxhX3QqIGNhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGludCBkbGNpKQoreworICAgICAgICBpbnQgdWRwX3BrdF9zdG9yZWQgPSAwOworCQorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBmaW5kX2NoYW5uZWwoY2FyZCwgZGxjaSk7CisJZnJfY2hhbm5lbF90ICpjaGFuOworCQorCWlmICghZGV2IHx8ICEoY2hhbj1kZXYtPnByaXYpKQorCQlyZXR1cm4gMTsKKwkKKyAgICAgICAgaWYoIWNhcmQtPnUuZi51ZHBfcGt0X2xndGggJiYgKHNrYi0+bGVuIDw9IE1BWF9MR1RIX1VEUF9NR05UX1BLVCkpeworICAgICAgICAgICAgICAgIGNhcmQtPnUuZi51ZHBfcGt0X2xndGggPSBza2ItPmxlbiArIGNoYW4tPmZyX2hlYWRlcl9sZW47CisgICAgICAgICAgICAgICAgY2FyZC0+dS5mLnVkcF90eXBlID0gdWRwX3R5cGU7CisgICAgICAgICAgICAgICAgY2FyZC0+dS5mLnVkcF9wa3Rfc3JjID0gdWRwX3BrdF9zcmM7CisgICAgICAgICAgICAgICAgY2FyZC0+dS5mLnVkcF9kbGNpID0gZGxjaTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoY2FyZC0+dS5mLnVkcF9wa3RfZGF0YSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisgICAgICAgICAgICAgICAgY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9VRFA7CisgICAgICAgICAgICAgICAgdWRwX3BrdF9zdG9yZWQgPSAxOworCisgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIkVSUk9SOiBVRFAgcGFja2V0IG5vdCBzdG9yZWQgZm9yIERMQ0kgJWRcbiIsIAorCQkJCQkJCWRsY2kpOworCX0KKworICAgICAgICBpZih1ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9TVEFDSyl7CisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwl9ZWxzZXsKKyAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX0KKwkJCisgICAgICAgIHJldHVybih1ZHBfcGt0X3N0b3JlZCk7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFByb2Nlc3MgVURQIGNhbGwgb2YgdHlwZSBGUElQRThORAorICovCitzdGF0aWMgaW50IHByb2Nlc3NfdWRwX21nbXRfcGt0KHNkbGFfdCogY2FyZCkKK3sKKworCWludCBjX3JldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJdW5zaWduZWQgY2hhciBmcmFtZXM7CisJdW5zaWduZWQgaW50IGxlbjsKKwl1bnNpZ25lZCBzaG9ydCBidWZmZXJfbGVuZ3RoOworCXN0cnVjdCBza19idWZmICpuZXdfc2tiOworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IGVycjsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlpbnQgdWRwX21nbXRfcmVxX3ZhbGlkID0gMTsKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UqIGRldjsKKyAgICAgICAgZnJfY2hhbm5lbF90KiBjaGFuOworICAgICAgICBmcl91ZHBfcGt0X3QgKmZyX3VkcF9wa3Q7CisJdW5zaWduZWQgc2hvcnQgbnVtX3RyY19lbHM7CisJZnJfdHJjX2VsX3QqIHB0cl90cmNfZWw7CisJZnJfdHJjX2VsX3QgdHJjX2VsOworCWZwaXBlbW9uX3RyY190KiBmcGlwZW1vbl90cmM7CisKKwljaGFyIHVkcF9wa3Rfc3JjID0gY2FyZC0+dS5mLnVkcF9wa3Rfc3JjOyAKKwlpbnQgZGxjaSA9IGNhcmQtPnUuZi51ZHBfZGxjaTsKKworCS8qIEZpbmQgbmV0d29yayBpbnRlcmZhY2UgZm9yIHRoaXMgcGFja2V0ICovCisJZGV2ID0gZmluZF9jaGFubmVsKGNhcmQsIGRsY2kpOworCWlmICghZGV2KXsKKwkJY2FyZC0+dS5mLnVkcF9wa3RfbGd0aCA9IDA7CisJCXJldHVybiAxOworCX0KKyAgICAgICAgaWYgKChjaGFuID0gZGV2LT5wcml2KSA9PSBOVUxMKXsKKwkJY2FyZC0+dS5mLnVkcF9wa3RfbGd0aCA9IDA7CisJCXJldHVybiAxOworCX0KKworCS8qIElmIHRoZSBVRFAgcGFja2V0IGlzIGZyb20gdGhlIG5ldHdvcmssIHdlIGFyZSBnb2luZyB0byBoYXZlIHRvIAorCSAgIHRyYW5zbWl0IGEgcmVzcG9uc2UuIEJlZm9yZSBkb2luZyBzbywgd2UgbXVzdCBjaGVjayB0byBzZWUgdGhhdAorCSAgIHdlIGFyZSBub3QgY3VycmVudGx5IHRyYW5zbWl0dGluZyBhIGZyYW1lIChpbiAnaWZfc2VuZCgpJykgYW5kCisJICAgdGhhdCB3ZSBhcmUgbm90IGFscmVhZHkgaW4gYSAnZGVsYXllZCB0cmFuc21pdCcgc3RhdGUuCisJKi8KKwlpZih1ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9ORVRXT1JLKSB7CisJCWlmIChjaGVja190eF9zdGF0dXMoY2FyZCxkZXYpKXsKKwkJCWNhcmQtPnUuZi51ZHBfcGt0X2xndGggPSAwOworCQkJcmV0dXJuIDE7CisJCX0KKyAgICAgICAgfQorCisgICAgICAgIGZyX3VkcF9wa3QgPSAoZnJfdWRwX3BrdF90ICopY2FyZC0+dS5mLnVkcF9wa3RfZGF0YTsKKworCWlmKHVkcF9wa3Rfc3JjID09IFVEUF9QS1RfRlJNX05FVFdPUkspIHsKKwkKKwkJc3dpdGNoKGZyX3VkcF9wa3QtPmNibG9jay5jb21tYW5kKSB7CisKKwkJCWNhc2UgRlJfUkVBRF9NT0RFTV9TVEFUVVM6CisJCQljYXNlIEZSX1JFQURfU1RBVFVTOgorCQkJY2FzZSBGUElQRV9ST1VURVJfVVBfVElNRToKKwkJCWNhc2UgRlJfUkVBRF9FUlJPUl9TVEFUUzoKKwkJCWNhc2UgRlBJUEVfRFJJVkVSX1NUQVRfR0VOOgorCQkJY2FzZSBGUl9SRUFEX1NUQVRJU1RJQ1M6CisJCQljYXNlIEZSX1JFQURfQUREX0RMQ19TVEFUUzoKKwkJCWNhc2UgRlJfUkVBRF9DT05GSUc6CisJCQljYXNlIEZSX1JFQURfQ09ERV9WRVJTSU9OOgorCQkJCXVkcF9tZ210X3JlcV92YWxpZCA9IDE7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXVkcF9tZ210X3JlcV92YWxpZCA9IDA7CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZighdWRwX21nbXRfcmVxX3ZhbGlkKSB7CisJCS8qIHNldCBsZW5ndGggdG8gMCAqLworCQlmcl91ZHBfcGt0LT5jYmxvY2subGVuZ3RoID0gMDsKKwkJLyogc2V0IHJldHVybiBjb2RlICovCisJCWZyX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAweENEOyAKKwkJCisJCWNoYW4tPmRydnN0YXRzX2dlbi5VRFBfUElQRV9tZ210X2RpcmVjdGlvbl9lcnIgKys7CisKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSl7CQorCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogV2FybmluZywgSWxsZWdhbCBVRFAgY29tbWFuZCBhdHRlbXB0ZWQgZnJvbSBuZXR3b3JrOiAleFxuIiwKKwkJCWNhcmQtPmRldm5hbWUsZnJfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQpOworCQl9CisJCQorCX0gZWxzZSB7ICAgCisgICAgICAgICAgIAorCQlzd2l0Y2goZnJfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQpIHsKKworCQljYXNlIEZQSVBFX0VOQUJMRV9UUkFDSU5HOgorCQkJaWYoIWNhcmQtPlRyYWNpbmdFbmFibGVkKSB7CisJCQkJZG8geworICAgICAgICAgICAgICAgICAgICAgICAJCQltYm94LT5jbWQuY29tbWFuZCA9IEZSX1NFVF9UUkFDRV9DT05GSUc7CisgICAgICAgICAgICAgICAgICAgICAgIAkJCW1ib3gtPmNtZC5sZW5ndGggPSAxOworICAgICAgICAgICAgICAgICAgICAgCQkJbWJveC0+Y21kLmRsY2kgPSAweDAwOworICAgICAgICAgICAgICAgICAgIAkJCW1ib3gtPmRhdGFbMF0gPSBmcl91ZHBfcGt0LT5kYXRhWzBdIHwgCisJCQkJCQlSRVNFVF9UUkM7CisgICAgICAgICAgICAgICAgICAgIAkJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IAorCQkJCQkgICAgIAkJbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworICAgICAgICAgICAgICAgICAgICAgICAJCX0gd2hpbGUgKGVyciAmJiBjX3JldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLAorCQkJCQkgbWJveCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAJaWYoZXJyKSB7CisJCQkJCWNhcmQtPlRyYWNpbmdFbmFibGVkID0gMDsKKwkJCQkJLyogc2V0IHRoZSByZXR1cm4gY29kZSAqLworCQkJCQlmcl91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0KKyAgCQkJCQkJbWJveC0+Y21kLnJlc3VsdDsKKwkJCQkJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXNkbGFfcGVlaygmY2FyZC0+aHcsIE5PX1RSQ19FTEVNRU5UU19PRkYsCisJCQkJCQkmbnVtX3RyY19lbHMsIDIpOworCQkJCXNkbGFfcGVlaygmY2FyZC0+aHcsIEJBU0VfVFJDX0VMRU1FTlRTX09GRiwKKwkJCQkJCSZjYXJkLT51LmYudHJjX2VsX2Jhc2UsIDQpOworCQkJCWNhcmQtPnUuZi5jdXJyX3RyY19lbCA9IGNhcmQtPnUuZi50cmNfZWxfYmFzZTsKKyAgICAgICAgICAgICAJCQljYXJkLT51LmYudHJjX2VsX2xhc3QgPSBjYXJkLT51LmYuY3Vycl90cmNfZWwgKworCQkJCQkJCSgobnVtX3RyY19lbHMgLSAxKSAqIAorCQkJCQkJCXNpemVvZihmcl90cmNfZWxfdCkpOworICAgCisJCQkJLyogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHRyYWNlIGRhdGEgYXJlYSBpbiAqLworCQkJCS8qIHRoZSBVRFAgcGFja2V0ICovCisJCQkJY2FyZC0+dS5mLnRyY19iZnJfc3BhY2U9KE1BWF9MR1RIX1VEUF9NR05UX1BLVCAtCisJCQkJCS8vc2l6ZW9mKGZyX2VuY2FwX2hkcl90KSAtCisJCQkJCXNpemVvZihpcF9wa3RfdCkgLQorCQkJCQlzaXplb2YodWRwX3BrdF90KSAtCisJCQkJCXNpemVvZih3cF9tZ210X3QpIC0KKwkJCQkJc2l6ZW9mKGNibG9ja190KSk7CisKKwkJCQkvKiBzZXQgcmV0dXJuIGNvZGUgKi8KKwkJCQlmcl91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCQorCQkJfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIAkvKiBzZXQgcmV0dXJuIGNvZGUgdG8gbGluZSB0cmFjZSBhbHJlYWR5IAorCQkJCSAgIGVuYWJsZWQgKi8KKwkJCQlmcl91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKworCQkJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJCQljYXJkLT5UcmFjaW5nRW5hYmxlZCA9IDE7CisJCQlicmVhazsKKworCisgICAgICAgICAgICAgICAgY2FzZSBGUElQRV9ESVNBQkxFX1RSQUNJTkc6CisJCQlpZihjYXJkLT5UcmFjaW5nRW5hYmxlZCkgeworCQkJCisJCQkJZG8geworCQkJCQltYm94LT5jbWQuY29tbWFuZCA9IEZSX1NFVF9UUkFDRV9DT05GSUc7CisJCQkJCW1ib3gtPmNtZC5sZW5ndGggPSAxOworCQkJCQltYm94LT5jbWQuZGxjaSA9IDB4MDA7CisJCQkJCW1ib3gtPmRhdGFbMF0gPSB+QUNUSVZBVEVfVFJDOworCQkJCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyAKKwkJCQkJCQltYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJCQkJfSB3aGlsZSAoZXJyICYmIGNfcmV0cnktLSAmJiBmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpKTsKKyAgICAgICAgICAgICAgICAgICAgCX0KKworICAgICAgICAgICAgICAgICAgICAJLyogc2V0IHJldHVybiBjb2RlICovCisJCQlmcl91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSAwOworCQkJY2FyZC0+VHJhY2luZ0VuYWJsZWQgPSAwOworCQkJYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEZQSVBFX0dFVF9UUkFDRV9JTkZPOgorCisJCSAgICAgICAgLyogTGluZSB0cmFjZSBjYW5ub3QgYmUgcGVyZm9ybWVkIG9uIHRoZSA1MDIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFjYXJkLT5UcmFjaW5nRW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgcmV0dXJuIGNvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ib3gtPmNtZC5sZW5ndGggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCQkJcHRyX3RyY19lbCA9ICh2b2lkICopY2FyZC0+dS5mLmN1cnJfdHJjX2VsOworCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfbGVuZ3RoID0gMDsKKwkJCWZyX3VkcF9wa3QtPmRhdGFbMHgwMF0gPSAweDAwOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoZnJhbWVzID0gMDsgZnJhbWVzIDwgTUFYX0ZSTVNfVFJBQ0VEOyBmcmFtZXMgKyspIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZGxhX3BlZWsoJmNhcmQtPmh3LCAodW5zaWduZWQgbG9uZylwdHJfdHJjX2VsLAorCQkJCQkgICh2b2lkICopJnRyY19lbC5mbGFnLAorCQkJCQkgIHNpemVvZihmcl90cmNfZWxfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0cmNfZWwuZmxhZyA9PSAweDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoY2FyZC0+dS5mLnRyY19iZnJfc3BhY2UgLSBidWZmZXJfbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwgc2l6ZW9mKGZwaXBlbW9uX3RyY19oZHJfdCkpIHsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJfdWRwX3BrdC0+ZGF0YVsweDAwXSB8PSBNT1JFX1RSQ19EQVRBOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKwkJCQlmcGlwZW1vbl90cmMgPSAKKwkJCQkJKGZwaXBlbW9uX3RyY190ICopJmZyX3VkcF9wa3QtPmRhdGFbYnVmZmVyX2xlbmd0aF07IAorCQkJCWZwaXBlbW9uX3RyYy0+ZnBpcGVtb25fdHJjX2hkci5zdGF0dXMgPQorCQkJCQl0cmNfZWwuYXR0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJZnBpcGVtb25fdHJjLT5mcGlwZW1vbl90cmNfaGRyLnRtc3RhbXAgPQorCQkJCQl0cmNfZWwudG1zdGFtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJZnBpcGVtb25fdHJjLT5mcGlwZW1vbl90cmNfaGRyLmxlbmd0aCA9IAorCQkJCQl0cmNfZWwubGVuZ3RoOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF0cmNfZWwub2Zmc2V0IHx8ICF0cmNfZWwubGVuZ3RoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJZnBpcGVtb25fdHJjLT5mcGlwZW1vbl90cmNfaGRyLmRhdGFfcGFzc2VkID0gMHgwMDsKKworIAkJCQl9ZWxzZSBpZigodHJjX2VsLmxlbmd0aCArIHNpemVvZihmcGlwZW1vbl90cmNfaGRyX3QpICsgMSkgPgorCQkJCQkoY2FyZC0+dS5mLnRyY19iZnJfc3BhY2UgLSBidWZmZXJfbGVuZ3RoKSl7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcGlwZW1vbl90cmMtPmZwaXBlbW9uX3RyY19oZHIuZGF0YV9wYXNzZWQgPSAweDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWZyX3VkcF9wa3QtPmRhdGFbMHgwMF0gfD0gTU9SRV9UUkNfREFUQTsKKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwaXBlbW9uX3RyYy0+ZnBpcGVtb25fdHJjX2hkci5kYXRhX3Bhc3NlZCA9IDB4MDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RsYV9wZWVrKCZjYXJkLT5odywgdHJjX2VsLm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSAgZnBpcGVtb25fdHJjLT5kYXRhLAorCQkJCQkJICB0cmNfZWwubGVuZ3RoKTsKKwkJCQl9CQkJCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJjX2VsLmZsYWcgPSAweDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZGxhX3Bva2UoJmNhcmQtPmh3LCAodW5zaWduZWQgbG9uZylwdHJfdHJjX2VsLAorCQkJCQkgICZ0cmNfZWwuZmxhZywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJcHRyX3RyY19lbCArKzsKKwkJCQlpZigodm9pZCAqKXB0cl90cmNfZWwgPiBjYXJkLT51LmYudHJjX2VsX2xhc3QpCisJCQkJCXB0cl90cmNfZWwgPSAodm9pZCopY2FyZC0+dS5mLnRyY19lbF9iYXNlOworCisJCQkJYnVmZmVyX2xlbmd0aCArPSBzaXplb2YoZnBpcGVtb25fdHJjX2hkcl90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJaWYoZnBpcGVtb25fdHJjLT5mcGlwZW1vbl90cmNfaGRyLmRhdGFfcGFzc2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlidWZmZXJfbGVuZ3RoICs9IHRyY19lbC5sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCX0KKworCQkJCWlmKGZyX3VkcF9wa3QtPmRhdGFbMHgwMF0gJiBNT1JFX1RSQ19EQVRBKSB7CisJCQkJCWJyZWFrOworCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAKKwkJCWlmKGZyYW1lcyA9PSBNQVhfRlJNU19UUkFDRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIAlmcl91ZHBfcGt0LT5kYXRhWzB4MDBdIHw9IE1PUkVfVFJDX0RBVEE7CisJCQl9CisgICAgICAgICAgICAgCisJCQljYXJkLT51LmYuY3Vycl90cmNfZWwgPSAodm9pZCAqKXB0cl90cmNfZWw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCB0aGUgdG90YWwgbnVtYmVyIG9mIGZyYW1lcyBwYXNzZWQgKi8KKwkJCWZyX3VkcF9wa3QtPmRhdGFbMHgwMF0gfD0KKwkJCQkoKGZyYW1lcyA8PCAxKSAmIChNQVhfRlJNU19UUkFDRUQgPDwgMSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgdGhlIGRhdGEgbGVuZ3RoIGFuZCByZXR1cm4gY29kZSAqLworCQkJZnJfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9IG1ib3gtPmNtZC5sZW5ndGggPSBidWZmZXJfbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgZnJfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRlBJUEVfRlQxX1JFQURfU1RBVFVTOgorCQkJc2RsYV9wZWVrKCZjYXJkLT5odywgMHhGMDIwLAorCQkJCSZmcl91ZHBfcGt0LT5kYXRhWzB4MDBdICwgMik7CisJCQlmcl91ZHBfcGt0LT5jYmxvY2subGVuZ3RoID0gbWJveC0+Y21kLmxlbmd0aCA9IDI7CisJCQlmcl91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgRlBJUEVfRkxVU0hfRFJJVkVSX1NUQVRTOgorCQkJaW5pdF9jaGFuX3N0YXRpc3RpY3MoY2hhbik7CisJCQlpbml0X2dsb2JhbF9zdGF0aXN0aWNzKGNhcmQpOworCQkJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJCQlicmVhazsKKwkJCisJCWNhc2UgRlBJUEVfUk9VVEVSX1VQX1RJTUU6CisJCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJCWNoYW4tPnJvdXRlcl91cF90aW1lID0gdHYudHZfc2VjIC0gCisJCQkJCQljaGFuLT5yb3V0ZXJfc3RhcnRfdGltZTsKKyAgICAJICAgICAgICAgICAgICAgICoodW5zaWduZWQgbG9uZyAqKSZmcl91ZHBfcGt0LT5kYXRhID0KKyAgICAJCQkJY2hhbi0+cm91dGVyX3VwX3RpbWU7CQorCQkJbWJveC0+Y21kLmxlbmd0aCA9IGZyX3VkcF9wa3QtPmNibG9jay5sZW5ndGggPSA0OworCQkJZnJfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDA7CisJCQlicmVhazsKKworCQljYXNlIEZQSVBFX0RSSVZFUl9TVEFUX0lGU0VORDoKKwkJCW1lbWNweShmcl91ZHBfcGt0LT5kYXRhLAorCQkJCSZjaGFuLT5kcnZzdGF0c19pZl9zZW5kLmlmX3NlbmRfZW50cnksCisJCQkJc2l6ZW9mKGlmX3NlbmRfc3RhdF90KSk7CisJCQltYm94LT5jbWQubGVuZ3RoID0gZnJfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9c2l6ZW9mKGlmX3NlbmRfc3RhdF90KTsJCisJCQlmcl91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCWJyZWFrOworCQorCQljYXNlIEZQSVBFX0RSSVZFUl9TVEFUX0lOVFI6CisKKwkJCW1lbWNweShmcl91ZHBfcGt0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FyZC0+c3RhdGlzdGljcy5pc3JfZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihnbG9iYWxfc3RhdHNfdCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJmZyX3VkcF9wa3QtPmRhdGFbc2l6ZW9mKGdsb2JhbF9zdGF0c190KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFuLT5kcnZzdGF0c19yeF9pbnRyLnJ4X2ludHJfbm9fc29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocnhfaW50cl9zdGF0X3QpKTsKKworCQkJbWJveC0+Y21kLmxlbmd0aCA9IGZyX3VkcF9wa3QtPmNibG9jay5sZW5ndGggPSAKKwkJCQkJc2l6ZW9mKGdsb2JhbF9zdGF0c190KSArCisJCQkJCXNpemVvZihyeF9pbnRyX3N0YXRfdCk7CisJCQlmcl91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgRlBJUEVfRFJJVkVSX1NUQVRfR0VOOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGZyX3VkcF9wa3QtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFuLT5kcnZzdGF0c19nZW4uVURQX1BJUEVfbWdtdF9rbWFsbG9jX2VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBpcGVfbWdtdF9zdGF0X3QpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZmcl91ZHBfcGt0LT5kYXRhW3NpemVvZihwaXBlX21nbXRfc3RhdF90KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhcmQtPnN0YXRpc3RpY3MsIHNpemVvZihnbG9iYWxfc3RhdHNfdCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBtYm94LT5jbWQubGVuZ3RoID0gZnJfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9IHNpemVvZihnbG9iYWxfc3RhdHNfdCkrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyeF9pbnRyX3N0YXRfdCk7CisJCQlmcl91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisKKwkJY2FzZSBGUl9GVDFfU1RBVFVTX0NUUkw6CisJCQlpZihmcl91ZHBfcGt0LT5kYXRhWzBdID09IDEpIHsKKwkJCQlpZihyQ291bnQrKyAhPSAwICl7CisJCQkJCWZyX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAwOworCQkJCQltYm94LT5jbWQubGVuZ3RoID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfSAKKwkJCX0KKyAgICAgICAgICAgCisJCQkvKiBEaXNhYmxlIEZUMSBNT05JVE9SIFNUQVRVUyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYoZnJfdWRwX3BrdC0+ZGF0YVswXSA9PSAwKSB7CisJCQkJaWYoIC0tckNvdW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcl91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCQkJbWJveC0+Y21kLmxlbmd0aCA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0gCisJCQl9ICAKKwkJCWdvdG8gdWRwX21nbXRfZGZsdDsKKworCQkJCisJCWRlZmF1bHQ6Cit1ZHBfbWdtdF9kZmx0OgorIAkJCWRvIHsKKwkJCQltZW1jcHkoJm1ib3gtPmNtZCwKKwkJCQkJJmZyX3VkcF9wa3QtPmNibG9jay5jb21tYW5kLAorCQkJCQlzaXplb2YoZnJfY21kX3QpKTsKKwkJCQlpZihtYm94LT5jbWQubGVuZ3RoKSB7CisJCQkJCW1lbWNweSgmbWJveC0+ZGF0YSwKKwkJCQkJCShjaGFyICopZnJfdWRwX3BrdC0+ZGF0YSwKKwkJCQkJCW1ib3gtPmNtZC5sZW5ndGgpOworCQkJCX0KKyAJCQkJCisJCQkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IAorCQkJCQlDTURfVElNRU9VVDsKKwkJCX0gd2hpbGUgKGVyciAmJiBjX3JldHJ5LS0gJiYgZnJfZXZlbnQoY2FyZCwgZXJyLCBtYm94KSk7CisKKwkJCWlmKCFlcnIpCisJCQkJY2hhbi0+ZHJ2c3RhdHNfZ2VuLgorCQkJCQlVRFBfUElQRV9tZ210X2FkcHRyX2NtbmRfT0sgKys7CisJCQllbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW4tPmRydnN0YXRzX2dlbi4KKwkJCQkJVURQX1BJUEVfbWdtdF9hZHB0cl9jbW5kX3RpbWVvdXQgKys7CisKKyAgICAgICAJICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIHJlc3VsdCBiYWNrIHRvIG91ciBidWZmZXIgKi8KKwkJCW1lbWNweSgmZnJfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQsCisJCQkJJm1ib3gtPmNtZCwgc2l6ZW9mKGZyX2NtZF90KSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgCWlmKG1ib3gtPmNtZC5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJbWVtY3B5KCZmcl91ZHBfcGt0LT5kYXRhLAorCQkJCQkmbWJveC0+ZGF0YSwgbWJveC0+Y21kLmxlbmd0aCk7CisJCQl9CisJCX0gCisgICAgICAgIH0KKyAgIAorICAgICAgICAvKiBGaWxsIFVEUCBUVEwgKi8KKyAgICAgICAgZnJfdWRwX3BrdC0+aXBfcGt0LnR0bCA9IGNhcmQtPndhbmRldi50dGw7CisgICAgICAgIGxlbiA9IHJlcGx5X3VkcChjYXJkLT51LmYudWRwX3BrdF9kYXRhLCBtYm94LT5jbWQubGVuZ3RoKTsKKworICAgICAgICBpZih1ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9ORVRXT1JLKSB7CisKKwkJY2hhbi0+ZnJfaGVhZGVyX2xlbj0yOworCQljaGFuLT5mcl9oZWFkZXJbMF09UTkyMl9VSTsKKwkJY2hhbi0+ZnJfaGVhZGVyWzFdPU5MUElEX0lQOworCQkJCisJCWVyciA9IGZyX3NlbmRfZGF0YV9oZWFkZXIoY2FyZCwgZGxjaSwgMCwgbGVuLCAKKwkJCWNhcmQtPnUuZi51ZHBfcGt0X2RhdGEsY2hhbi0+ZnJfaGVhZGVyX2xlbik7CisJCWlmIChlcnIpeyAKKwkJCWNoYW4tPmRydnN0YXRzX2dlbi5VRFBfUElQRV9tZ210X2FkcHRyX3NlbmRfcGFzc2VkICsrOworCQl9ZWxzZXsKKwkJCWNoYW4tPmRydnN0YXRzX2dlbi5VRFBfUElQRV9tZ210X2FkcHRyX3NlbmRfZmFpbGVkICsrOworCQl9CisJCQorCX0gZWxzZSB7CisJCS8qIEFsbG9jYXRlIHNvY2tldCBidWZmZXIgKi8KKwkJaWYoKG5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKGxlbikpICE9IE5VTEwpIHsKKworCQkJLyogY29weSBkYXRhIGludG8gbmV3X3NrYiAqLworCQkJYnVmID0gc2tiX3B1dChuZXdfc2tiLCBsZW4pOworCQkJbWVtY3B5KGJ1ZiwgY2FyZC0+dS5mLnVkcF9wa3RfZGF0YSwgbGVuKTsKKyAgICAgICAgCisJCQljaGFuLT5kcnZzdGF0c19nZW4uCisJCQkJVURQX1BJUEVfbWdtdF9wYXNzZWRfdG9fc3RhY2sgKys7CisJCQluZXdfc2tiLT5kZXYgPSBkZXY7CisJCQluZXdfc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKwkJCW5ld19za2ItPm1hYy5yYXcgPSBuZXdfc2tiLT5kYXRhOworCQkJbmV0aWZfcngobmV3X3NrYik7CisgICAgICAgICAgICAJCisJCX0gZWxzZSB7CisJCQljaGFuLT5kcnZzdGF0c19nZW4uVURQX1BJUEVfbWdtdF9ub19zb2NrZXQgKys7CisJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJIiVzOiBVRFAgbWdtdCBjbW5kLCBubyBzb2NrZXQgYnVmZmVycyBhdmFpbGFibGUhXG4iLCAKKwkJCWNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgCX0KKyAgICAgICAgfQorCisJY2FyZC0+dS5mLnVkcF9wa3RfbGd0aCA9IDA7CisKKwlyZXR1cm4gMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgSW52ZXJzZSBBUlAgUmVxdWVzdAorICovCisKK2ludCBzZW5kX2luYXJwX3JlcXVlc3Qoc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBlcnI9MDsKKworCWFycGhkcl8xNDkwX3QgKkFycFBhY2tldDsKKwlhcnBoZHJfZnJfdCAqYXJwaGRyOworCWZyX2NoYW5uZWxfdCAqY2hhbiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisKKwlpbl9kZXYgPSBkZXYtPmlwX3B0cjsKKworCWlmKGluX2RldiAhPSBOVUxMICkgewkKKworCQlBcnBQYWNrZXQgPSBrbWFsbG9jKHNpemVvZihhcnBoZHJfMTQ5MF90KSArIHNpemVvZihhcnBoZHJfZnJfdCksIEdGUF9BVE9NSUMpOworCQkvKiBTTkFQIEhlYWRlciBpbmRpY2F0aW5nIEFSUCAqLworCQlBcnBQYWNrZXQtPmNvbnRyb2wJPSAweDAzOworCQlBcnBQYWNrZXQtPnBhZAkJPSAweDAwOworCQlBcnBQYWNrZXQtPk5MUElECT0gMHg4MDsKKwkJQXJwUGFja2V0LT5PVUlbMF0JPSAwOworCQlBcnBQYWNrZXQtPk9VSVsxXQk9IDA7CisJCUFycFBhY2tldC0+T1VJWzJdCT0gMDsKKwkJQXJwUGFja2V0LT5QSUQJCT0gMHgwNjA4OworCisJCWFycGhkciA9IChhcnBoZHJfZnJfdCAqKShBcnBQYWNrZXQgKyAxKTsgLy8gR28gdG8gQVJQIFBhY2tldAorCisJCS8qIEluQVJQIHJlcXVlc3QgKi8JCQorCQlhcnBoZHItPmFyX2hyZCA9IDB4MEYwMDsJLyogRnJhbWUgUmVsYXkgSFcgdHlwZSAqLworCQlhcnBoZHItPmFyX3BybyA9IDB4MDAwODsJLyogSVAgUHJvdG9jb2wJICAgICAgICovCisJCWFycGhkci0+YXJfaGxuID0gMjsJCS8qIEhXIGFkZHIgbGVuZ3RoICAgICAgKi8KKwkJYXJwaGRyLT5hcl9wbG4gPSA0OwkJLyogSVAgYWRkciBsZW5ndGggICAgICAqLworCQlhcnBoZHItPmFyX29wID0gaHRvbnMoMHgwOCk7CS8qIEluQVJQIFJlcXVlc3QgICAgICAgKi8KKwkJYXJwaGRyLT5hcl9zaGEgPSAwOyAJCS8qIHNyYyBIVyBETENJIC0gRG9lc24ndCBtYXR0ZXIgKi8KKwkJaWYoaW5fZGV2LT5pZmFfbGlzdCAhPSBOVUxMKQorCQkJYXJwaGRyLT5hcl9zaXAgPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWw7ICAvKiBMb2NhbCBBZGRyZXNzICAgICAgICovZWxzZQorCQkJYXJwaGRyLT5hcl9zaXAgPSAwOworCQlhcnBoZHItPmFyX3RoYSA9IDA7IAkJLyogZHN0IEhXIERMQ0kgLSBEb2Vzbid0IG1hdHRlciAqLworCQlhcnBoZHItPmFyX3RpcCA9IDA7CQkvKiBSZW1vdGUgQWRkcmVzcyAtLSB3aGF0IHdlIHdhbnQgKi8KKworCQllcnIgPSBmcl9zZW5kKGNhcmQsIGNoYW4tPmRsY2ksIDAsIHNpemVvZihhcnBoZHJfMTQ5MF90KSArIHNpemVvZihhcnBoZHJfZnJfdCksCisJCSAgIAkJCSh2b2lkICopQXJwUGFja2V0KTsKKworCQlpZiAoIWVycil7CisJCQlwcmludGsoS0VSTl9JTkZPICJcbiVzOiBTZW5kaW5nIEluQVJQIHJlcXVlc3Qgb24gRExDSSAlZC5cbiIsIAorCQkJCWNhcmQtPmRldm5hbWUsIGNoYW4tPmRsY2kpOworCQkJY2xlYXJfYml0KEFSUF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQl9CisKKwkJa2ZyZWUoQXJwUGFja2V0KTsKKwl9ZWxzZXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElOQVJQIEVSUk9SOiAlcyBkb2Vzbid0IGhhdmUgYSBsb2NhbCBJUCBhZGRyZXNzIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2hlY2sgcGFja2V0IGZvciBBUlAgVHlwZQorICovCisKK2ludCBpc19hcnAodm9pZCAqYnVmKQoreworCWFycGhkcl8xNDkwX3QgKmFycGhkciA9IChhcnBoZHJfMTQ5MF90ICopYnVmOworCQorCWlmIChhcnBoZHItPnBhZCAgID09IDB4MDAgICYmCisJICAgIGFycGhkci0+TkxQSUQgPT0gMHg4MCAgJiYKKwkgICAgYXJwaGRyLT5QSUQgICA9PSAweDA2MDgpIAorCQlyZXR1cm4gMTsKKwllbHNlIHJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJvY2VzcyBBUlAgUGFja2V0IFR5cGUKKyAqLworCitpbnQgcHJvY2Vzc19BUlAoYXJwaGRyXzE0OTBfdCAqQXJwUGFja2V0LCBzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisKKworCWFycGhkcl9mcl90ICphcnBoZHIgPSAoYXJwaGRyX2ZyX3QgKikoQXJwUGFja2V0ICsgMSk7IC8qIFNraXAgaGVhZGVyICovCisJZnJfcnhfYnVmX2N0bF90KiBmcmJ1ZiA9IGNhcmQtPnJ4bWI7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCWZyX2NoYW5uZWxfdCAqY2hhbiA9IGRldi0+cHJpdjsJCQorCQorCS8qIEJlZm9yZSB3ZSB0cmFuc21pdCBBUlAgcGFja2V0LCB3ZSBtdXN0IGNoZWNrIAorCSAqIHRvIHNlZSB0aGF0IHdlIGFyZSBub3QgY3VycmVudGx5IHRyYW5zbWl0dGluZyBhIAorCSAqIGZyYW1lIChpbiAnaWZfc2VuZCgpJykgYW5kIHRoYXQgd2UgYXJlIG5vdCAKKwkgKiBhbHJlYWR5IGluIGEgJ2RlbGF5ZWQgdHJhbnNtaXQnIHN0YXRlLiAqLworCWlmIChjaGVja190eF9zdGF0dXMoY2FyZCxkZXYpKXsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSl7IAkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBEaXNhYmxpbmcgY29tbWluaWNhdGlvbiB0byBwcm9jZXNzIEFSUFxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCX0KKwkJc2V0X2JpdChBUlBfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaW5fZGV2ID0gZGV2LT5pcF9wdHI7CisKKwkvKiBDaGVjayB0aGF0IElQIGFkZHJlc3NlcyBleGlzdCBmb3Igb3VyIG5ldHdvcmsgYWRkcmVzcyAqLworCWlmIChpbl9kZXYgPT0gTlVMTCB8fCBpbl9kZXYtPmlmYV9saXN0ID09IE5VTEwpIAorCQlyZXR1cm4gLTE7CisKKwlzd2l0Y2ggKG50b2hzKGFycGhkci0+YXJfb3ApKSB7CisKKwljYXNlIDB4MDg6ICAvLyBJbnZlcnNlIEFSUCByZXF1ZXN0ICAtLSBTZW5kIFJlcGx5LCBhZGQgcm91dGUuCisJCQkKKwkJLyogQ2hlY2sgZm9yIHZhbGlkIEFkZHJlc3MgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlY3ZkIFB0UCBhZGRyIC1JbkFycCBSZXE6ICV1LiV1LiV1LiV1XG4iLCAKKwkJCWNhcmQtPmRldm5hbWUsIE5JUFFVQUQoYXJwaGRyLT5hcl9zaXApKTsKKworCisJCS8qIENoZWNrIHRoYXQgdGhlIG5ldHdvcmsgYWRkcmVzcyBpcyB0aGUgc2FtZSBhcyBvdXJzLCBvbmx5CisgICAgICAgICAgICAgICAgICogaWYgdGhlIG5ldG93cmsgbWFzayBpcyBub3QgMjU1LjI1NS4yNTUuMjU1LiBPdGhlcndpc2UKKyAgICAgICAgICAgICAgICAgKiB0aGlzIGNoZWNrIHdvdWxkIG5vdCBtYWtlIHNlbnNlICovCisKKwkJaWYgKGluX2Rldi0+aWZhX2xpc3QtPmlmYV9tYXNrICE9IDB4RkZGRkZGRkYgJiYgCisJCSAgICAoaW5fZGV2LT5pZmFfbGlzdC0+aWZhX21hc2sgJiBhcnBoZHItPmFyX3NpcCkgIT0gCisJCSAgICAoaW5fZGV2LT5pZmFfbGlzdC0+aWZhX21hc2sgJiBpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWwpKXsKKwkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBJbnZhbGlkIFB0UCBhZGRyZXNzLiAldS4ldS4ldS4ldSAgSW5BUlAgaWdub3JlZC5cbiIsIAorCQkJCQljYXJkLT5kZXZuYW1lLE5JUFFVQUQoYXJwaGRyLT5hcl9zaXApKTsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG1hc2sgJXUuJXUuJXUuJXVcbiIsIAorCQkJCWNhcmQtPmRldm5hbWUsIE5JUFFVQUQoaW5fZGV2LT5pZmFfbGlzdC0+aWZhX21hc2spKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogbG9jYWwgJXUuJXUuJXUuJXVcbiIsIAorCQkJCWNhcmQtPmRldm5hbWUsTklQUVVBRChpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWwpKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWwgPT0gYXJwaGRyLT5hcl9zaXApeworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IExvY2FsIGFkZHIgPSBQdFAgYWRkci4gIEluQVJQIGlnbm9yZWQuXG4iLCAKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkKKwkJYXJwaGRyLT5hcl9vcCA9IGh0b25zKDB4MDkpOwkvKiBJbkFSUCBSZXBseSAqLworCisJCS8qIFNldCBhZGRyZXNzZXMgKi8KKwkJYXJwaGRyLT5hcl90aXAgPSBhcnBoZHItPmFyX3NpcDsKKwkJYXJwaGRyLT5hcl9zaXAgPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWw7CisKKwkJY2hhbi0+aXBfbG9jYWwgPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWw7CisJCWNoYW4tPmlwX3JlbW90ZSA9IGFycGhkci0+YXJfc2lwOworCisJCWZyX3NlbmQoY2FyZCwgZnJidWYtPmRsY2ksIDAsIGZyYnVmLT5sZW5ndGgsICh2b2lkICopQXJwUGFja2V0KTsKKworCQlpZiAodGVzdF9iaXQoQVJQX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCkpeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSl7IAkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQVJQIFByb2Nlc3NlZCBFbmFibGluZyBDb21tdW5pY2F0aW9uIVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQl9CisJCX0KKwkJY2xlYXJfYml0KEFSUF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQkKKwkJY2hhbi0+aXBfbG9jYWwgPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWw7CisJCWNoYW4tPmlwX3JlbW90ZSA9IGFycGhkci0+YXJfc2lwOworCisJCS8qIEFkZCBSb3V0ZSBGbGFnICovCisJCS8qIFRoZSByb3V0ZSB3aWxsIGJlIGFkZGVkIGluIHRoZSBwb2xsaW5nIHJvdXRpbmUgc28KKwkJICAgdGhhdCBpdCBpcyBub3QgaW50ZXJydXB0IGNvbnRleHQuICovCisKKwkJY2hhbi0+cm91dGVfZmxhZyA9IEFERF9ST1VURTsKKwkJdHJpZ2dlcl9mcl9wb2xsIChkZXYpOworCisJCWJyZWFrOworCisJY2FzZSAweDA5OiAgLy8gSW52ZXJzZSBBUlAgcmVwbHkKKworCQkvKiBDaGVjayBmb3IgdmFsaWQgQWRkcmVzcyAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVjdmQgUHRQIGFkZHIgJXUuJXUuJXUuJXUgLUluQXJwIFJlcGx5XG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lLCBOSVBRVUFEKGFycGhkci0+YXJfc2lwKSk7CisKKworCQkvKiBDb21wYXJlIG5ldHdvcmsgYWRkcmVzc2VzLCBvbmx5IGlmIG5ldHdvcmsgbWFzaworICAgICAgICAgICAgICAgICAqIGlzIG5vdCAyNTUuMjU1LjI1NS4yNTUgIEl0IHdvdWxkIG5vdCBtYWtlIHNlbnNlCisgICAgICAgICAgICAgICAgICogdG8gcGVyZm9ybSB0aGlzIHRlc3QgaWYgdGhlIG1hc2sgd2FzIGFsbCAxJ3MgKi8KKworCQlpZiAoaW5fZGV2LT5pZmFfbGlzdC0+aWZhX21hc2sgIT0gMHhmZmZmZmZmZiAmJgorCQkgICAgKGluX2Rldi0+aWZhX2xpc3QtPmlmYV9tYXNrICYgYXJwaGRyLT5hcl9zaXApICE9IAorCQkJKGluX2Rldi0+aWZhX2xpc3QtPmlmYV9tYXNrICYgaW5fZGV2LT5pZmFfbGlzdC0+aWZhX2xvY2FsKSkgeworCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSW52YWxpZCBQdFAgYWRkcmVzcy4gIEluQVJQIGlnbm9yZWQuXG4iLCAKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgcmVjZWl2ZWQgSVAgYWRkcmVzcyBpcyBub3QKKyAgICAgICAgICAgICAgICAgKiB0aGUgc2FtZSBhcyBvdXIgb3duIGxvY2FsIGFkZHJlc3MgKi8KKwkJaWYgKGluX2Rldi0+aWZhX2xpc3QtPmlmYV9sb2NhbCA9PSBhcnBoZHItPmFyX3NpcCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExvY2FsIGFkZHIgPSBQdFAgYWRkci4gIEluQVJQIGlnbm9yZWQuXG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCXJldHVybiAtMTsKKwkJfQkJCQorCisJCWNoYW4tPmlwX2xvY2FsICA9IGluX2Rldi0+aWZhX2xpc3QtPmlmYV9sb2NhbDsKKwkJY2hhbi0+aXBfcmVtb3RlID0gYXJwaGRyLT5hcl9zaXA7CisKKwkJLyogQWRkIFJvdXRlIEZsYWcgKi8KKwkJLyogVGhlIHJvdXRlIHdpbGwgYmUgYWRkZWQgaW4gdGhlIHBvbGxpbmcgcm91dGluZSBzbworCQkgICB0aGF0IGl0IGlzIG5vdCBpbnRlcnJ1cHQgY29udGV4dC4gKi8KKworCQljaGFuLT5yb3V0ZV9mbGFnID0gQUREX1JPVVRFOworCQljaGFuLT5pbmFycCA9IElOQVJQX0NPTkZJR1VSRUQ7CisJCXRyaWdnZXJfZnJfcG9sbChkZXYpOworCQkKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7IC8vIEFSUCdzIGFuZCBSQVJQJ3MgLS0gU2hvdWxkbid0IGhhcHBlbi4KKwl9CisKKwlyZXR1cm4gMDsJCit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHRyaWdnZXJfZnJfYXJwCisgKgorICogRGVzY3JpcHRpb246CisgKiAJQWRkIGFuIGZyX2FycCgpIHRhc2sgaW50byBhIGFycAorICogICAgICB0aW1lciBoYW5kbGVyIGZvciBhIHNwZWNpZmljIGRsY2kvaW50ZXJmYWNlLiAgCisgKiAgICAgIFRoaXMgd2lsbCBraWNrIHRoZSBmcl9hcnAoKSByb3V0aW5lIAorICogICAgICB3aXRoaW4gdGhlIHNwZWNpZmllZCB0aW1lIGludGVydmFsLiAKKyAqCisgKiBVc2FnZToKKyAqIAlUaGlzIHRpbWVyIGlzIHVzZWQgdG8gc2VuZCBBUlAgcmVxdWVzdHMgYXQKKyAqICAgICAgY2VydGFpbiB0aW1lIGludGVydmFscy4gCisgKiAJQ2FsbGVkIGJ5IGFuIGludGVycnVwdCB0byByZXF1ZXN0IGFuIGFjdGlvbgorICogICAgICBhdCBhIGxhdGVyIGRhdGUuCisgKi8JCisKK3N0YXRpYyB2b2lkIHRyaWdnZXJfZnJfYXJwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZnJfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCisJbW9kX3RpbWVyKCZjaGFuLT5mcl9hcnBfdGltZXIsIGppZmZpZXMgKyBjaGFuLT5pbmFycF9pbnRlcnZhbCAqIEhaKTsKKwlyZXR1cm47Cit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQVJQIFJlcXVlc3QgQWN0aW9uCisgKgorICoJVGhpcyBmdW5jaXRvbiBpcyBjYWxsZWQgYnkgdGltZXIgaW50ZXJydXB0IHRvIHNlbmQgYW4gYXJwIHJlcXVlc3QKKyAqICAgICAgdG8gdGhlIHJlbW90ZSBlbmQuCisgKi8KKworc3RhdGljIHZvaWQgZnJfYXJwICh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJZnJfY2hhbm5lbF90ICpjaGFuID0gZGV2LT5wcml2OworCXZvbGF0aWxlIHNkbGFfdCAqY2FyZCA9IGNoYW4tPmNhcmQ7CisJZnI1MDhfZmxhZ3NfdCogZmxhZ3MgPSBjYXJkLT5mbGFnczsKKworCS8qIFNlbmQgQVJQIHBhY2tldHMgZm9yIGFsbCBkZXZzJyB1bnRpbAorICAgICAgICAgKiBBUlAgc3RhdGUgY2hhbmdlcyB0byBDT05GSUdVUkVEICovCisKKwlpZiAoY2hhbi0+aW5hcnAgPT0gSU5BUlBfUkVRVUVTVCAmJgorCSAgICBjaGFuLT5jb21tb24uc3RhdGUgPT0gV0FOX0NPTk5FQ1RFRCAmJiAKKwkgICAgY2FyZC0+d2FuZGV2LnN0YXRlID09IFdBTl9DT05ORUNURUQpeworCQlzZXRfYml0KDAsJmNoYW4tPmluYXJwX3JlYWR5KTsKKwkJY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9BUlA7CisJCWZsYWdzLT5pbWFzayB8PSBGUl9JTlRSX1RJTUVSOwkKKwl9CisgCisJcmV0dXJuOworfQorCQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUGVyZm9ybSB0aGUgSW50ZXJydXB0IFRlc3QgYnkgcnVubmluZyB0aGUgUkVBRF9DT0RFX1ZFUlNJT04gY29tbWFuZCBNQVhfSU5UUl8KKyAqIFRFU1RfQ09VTlRFUiB0aW1lcy4KKyAqLworc3RhdGljIGludCBpbnRyX3Rlc3QoIHNkbGFfdCogY2FyZCApCit7CisJZnJfbWJveF90KiBtYiA9IGNhcmQtPm1ib3g7CisJaW50IGVycixpOworCisgICAgICAgIGVyciA9IGZyX3NldF9pbnRyX21vZGUoY2FyZCwgRlJfSU5UUl9SRUFEWSwgY2FyZC0+d2FuZGV2Lm10dSwgMCApOworCQorCWlmIChlcnIgPT0gQ01EX09LKSB7CisKKwkJZm9yICggaSA9IDA7IGkgPCBNQVhfSU5UUl9URVNUX0NPVU5URVI7IGkrKyApIHsKKyAJCQkvKiBSdW4gY29tbWFuZCBSRUFEX0NPREVfVkVSU0lPTiAqLworCQkJbWItPmNtZC5sZW5ndGggID0gMDsKKwkJCW1iLT5jbWQuY29tbWFuZCA9IEZSX1JFQURfQ09ERV9WRVJTSU9OOworCQkJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJCQlpZiAoZXJyICE9IENNRF9PSykgCisJCQkJZnJfZXZlbnQoY2FyZCwgZXJyLCBtYik7CisJCX0KKwkKKwl9IGVsc2UgeworCQlyZXR1cm4gZXJyOwkKKwl9CisKKwllcnIgPSBmcl9zZXRfaW50cl9tb2RlKCBjYXJkLCAwLCBjYXJkLT53YW5kZXYubXR1LCAwICk7CisKKwlpZiggZXJyICE9IENNRF9PSyApIAorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZXRlcm1pbmUgd2hhdCB0eXBlIG9mIFVEUCBjYWxsIGl0IGlzLiBGUElQRThORCA/CisgKi8KK3N0YXRpYyBpbnQgdWRwX3BrdF90eXBlKCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzZGxhX3QqIGNhcmQgKQoreworCWZyX3VkcF9wa3RfdCAqZnJfdWRwX3BrdCA9IChmcl91ZHBfcGt0X3QgKilza2ItPmRhdGE7CisKKwkvKiBRdWljayBIQUNLICovCisJCisJCisgICAgICAgIGlmKChmcl91ZHBfcGt0LT5pcF9wa3QucHJvdG9jb2wgPT0gVURQTUdNVF9VRFBfUFJPVE9DT0wpICYmCisJCShmcl91ZHBfcGt0LT5pcF9wa3QudmVyX2luZXRfaGRyX2xlbmd0aCA9PSAweDQ1KSAmJgorCQkoZnJfdWRwX3BrdC0+dWRwX3BrdC51ZHBfZHN0X3BvcnQgPT0gCisJCW50b2hzKGNhcmQtPndhbmRldi51ZHBfcG9ydCkpICYmCisJCShmcl91ZHBfcGt0LT53cF9tZ210LnJlcXVlc3RfcmVwbHkgPT0gCisJCVVEUE1HTVRfUkVRVUVTVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFzdHJuY21wKGZyX3VkcF9wa3QtPndwX21nbXQuc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRFBNR01UX0ZQSVBFX1NJR05BVFVSRSwgOCkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVURQX0ZQSVBFX1RZUEU7CisJCQl9CisJfQorICAgICAgICByZXR1cm4gVURQX0lOVkFMSURfVFlQRTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZXMgdGhlIFN0YXRpc3RpY3MgdmFsdWVzIGluIHRoZSBmcl9jaGFubmVsIHN0cnVjdHVyZS4KKyAqLwordm9pZCBpbml0X2NoYW5fc3RhdGlzdGljcyggZnJfY2hhbm5lbF90KiBjaGFuKQoreworICAgICAgICBtZW1zZXQoJmNoYW4tPmRydnN0YXRzX2lmX3NlbmQuaWZfc2VuZF9lbnRyeSwgMCwKKwkJc2l6ZW9mKGlmX3NlbmRfc3RhdF90KSk7CisgICAgICAgIG1lbXNldCgmY2hhbi0+ZHJ2c3RhdHNfcnhfaW50ci5yeF9pbnRyX25vX3NvY2tldCwgMCwKKyAgICAgICAgICAgICAgICBzaXplb2YocnhfaW50cl9zdGF0X3QpKTsKKyAgICAgICAgbWVtc2V0KCZjaGFuLT5kcnZzdGF0c19nZW4uVURQX1BJUEVfbWdtdF9rbWFsbG9jX2VyciwgMCwKKyAgICAgICAgICAgICAgICBzaXplb2YocGlwZV9tZ210X3N0YXRfdCkpOworfQorCQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemVzIHRoZSBTdGF0aXN0aWNzIHZhbHVlcyBpbiB0aGUgU2RsYV90IHN0cnVjdHVyZS4KKyAqLwordm9pZCBpbml0X2dsb2JhbF9zdGF0aXN0aWNzKCBzZGxhX3QqIGNhcmQgKQoreworCS8qIEludGlhbGl6ZSBnbG9iYWwgc3RhdGlzdGljcyBmb3IgYSBjYXJkICovCisgICAgICAgIG1lbXNldCgmY2FyZC0+c3RhdGlzdGljcy5pc3JfZW50cnksIDAsIHNpemVvZihnbG9iYWxfc3RhdHNfdCkpOworfQorCitzdGF0aWMgdm9pZCByZWFkX0RMQ0lfSUJfbWFwcGluZyggc2RsYV90KiBjYXJkLCBmcl9jaGFubmVsX3QqIGNoYW4gKQoreworCWZyX21ib3hfdCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsJCisJZGxjaV9JQl9tYXBwaW5nX3QqIHJlc3VsdDsgCisJaW50IGVyciwgY291bnRlciwgZm91bmQ7CQorCisJZG8geworCQltYm94LT5jbWQuY29tbWFuZCA9IEZSX1JFQURfRExDSV9JQl9NQVBQSU5HOworCQltYm94LT5jbWQubGVuZ3RoID0gMDsJCisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiBmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpKTsKKworCWlmKCBtYm94LT5jbWQucmVzdWx0ICE9IDApeworCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVhZCBETENJIElCIE1hcHBpbmcgZmFpbGVkXG4iLCAKKwkJCWNoYW4tPm5hbWUpOworCX0KKworCWNvdW50ZXIgPSBtYm94LT5jbWQubGVuZ3RoIC8gc2l6ZW9mKGRsY2lfSUJfbWFwcGluZ190KTsKKwlyZXN1bHQgPSAodm9pZCAqKW1ib3gtPmRhdGE7CisJCisJZm91bmQgPSAwOworCWZvciAoOyBjb3VudGVyOyAtLWNvdW50ZXIsICsrcmVzdWx0KSB7CisJCWlmICggcmVzdWx0LT5kbGNpID09IGNoYW4tPmRsY2kgKSB7CisJCQljaGFuLT5JQl9hZGRyID0gcmVzdWx0LT5hZGRyX3ZhbHVlOworCQkJaWYoY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpeworCSAgICAgICAgICAgICAJCWNoYW4tPmRsY2lfaW50X2ludGVyZmFjZSA9CisJCQkJCSh2b2lkKikoY2FyZC0+aHcuZHBtYmFzZSArCisJCQkJCWNoYW4tPklCX2FkZHIpOworICAgICAgIAkJCX1lbHNleyAKKwkJCQljaGFuLT5kbGNpX2ludF9pbnRlcmZhY2UgPSAKKwkJCQkJKHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsgCisJCQkJCShjaGFuLT5JQl9hZGRyICYgMHgwMDAwMUZGRikpOworCisJCQl9CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsJCisJCX0gCisJfQorCWlmICghZm91bmQpCisJCXByaW50ayggS0VSTl9JTkZPICIlczogRExDSSAlZCBub3QgZm91bmQgYnkgSUIgTUFQUElORyBjbWRcbiIsIAorCQljYXJkLT5kZXZuYW1lLCBjaGFuLT5kbGNpKTsKK30KKworCisKK3ZvaWQgczUwOF9zNTE0X2xvY2soc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpCit7CisJaWYgKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KXsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+d2FuZGV2LmxvY2ssICpzbXBfZmxhZ3MpOworCX1lbHNleworCQlzcGluX2xvY2soJmNhcmQtPnUuZi5pZl9zZW5kX2xvY2spOworCX0KKwlyZXR1cm47Cit9CisKKwordm9pZCBzNTA4X3M1MTRfdW5sb2NrKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKQoreworCWlmIChjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCl7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmNhcmQtPndhbmRldi5sb2NrLCAqc21wX2ZsYWdzKTsKKwl9ZWxzZXsKKwkJc3Bpbl91bmxvY2soJmNhcmQtPnUuZi5pZl9zZW5kX2xvY2spOworCX0KKwlyZXR1cm47Cit9CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgIFJFQ0VJVkUgSU5URVJSVVBUOiBCT1RUT00gSEFMRiBIQU5ETEVSUyAKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBiaF9lbnF1ZXVlCisgKgorICogRGVzY3JpcHRpb246CisgKglJbnNlcnQgYSByZWNlaXZlZCBwYWNrZXQgaW50byBhIGNpcmN1bGFyCisgKiAgICAgIHJ4IHF1ZXVlLiAgVGhpcyBwYWNrZXQgd2lsbCBiZSBwaWNrZWQgdXAgCisgKiAgICAgIGJ5IGZyX2JoKCkgYW5kIHNlbnQgdXAgdGhlIHN0YWNrIHRvIHRoZQorICogICAgICB1c2VyLgorICogICAgICAgCQorICogVXNhZ2U6IAorICoJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgcnggaW50ZXJydXB0LAorICogICAgICBpbiBBUEkgbW9kZS4KKyAqCisgKi8KKworc3RhdGljIGludCBiaF9lbnF1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJLyogQ2hlY2sgZm9yIGZ1bGwgKi8KKwlmcl9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90ICpjYXJkID0gY2hhbi0+Y2FyZDsKKworCisJaWYgKGF0b21pY19yZWFkKCZjaGFuLT5iaF9idWZmX3VzZWQpID09IE1BWF9CSF9CVUZGKXsKKwkJKytjYXJkLT53YW5kZXYuc3RhdHMucnhfZHJvcHBlZDsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIDE7IAorCX0KKworCSgoYmhfZGF0YV90ICopJmNoYW4tPmJoX2hlYWRbY2hhbi0+Ymhfd3JpdGVdKS0+c2tiID0gc2tiOworCisJaWYgKGNoYW4tPmJoX3dyaXRlID09IChNQVhfQkhfQlVGRi0xKSl7CisJCWNoYW4tPmJoX3dyaXRlPTA7CisJfWVsc2V7CisJCSsrY2hhbi0+Ymhfd3JpdGU7CisJfQorCisJYXRvbWljX2luYygmY2hhbi0+YmhfYnVmZl91c2VkKTsKKworCXJldHVybiAwOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHRyaWdnZXJfZnJfYmgKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIAlLaWNrIHRoZSBmcl9iaCgpIGhhbmRsZXIKKyAqCisgKiBVc2FnZToKKyAqCXJ4IGludGVycnVwdCBjYWxscyB0aGlzIGZ1bmN0aW9uIGR1cmluZworICogICAgICB0aGUgQVBJIG1vZGUuIAorICovCisKK3N0YXRpYyB2b2lkIHRyaWdnZXJfZnJfYmggKGZyX2NoYW5uZWxfdCAqY2hhbikKK3sKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoMCwmY2hhbi0+dHFfd29ya2luZykpeworCQl3YW5waXBlX3F1ZXVlX3dvcmsoJmNoYW4tPmNvbW1vbi53YW5waXBlX3dvcmspOworCX0KK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBmcl9iaAorICoKKyAqIERlc2NyaXB0aW9uOgorICoJRnJhbWUgcmVsYXkgcmVjZWl2ZSBCSCBoYW5kbGVyLiAKKyAqCURlcXVldWUgZGF0YSBmcm9tIHRoZSBCSCBjaXJjdWxhciAKKyAqCWJ1ZmZlciBhbmQgcGFzcyBpdCB1cCB0aGUgQVBJIHNvY2suCisgKiAgICAgICAJCisgKiBSYXRpb25hbGU6IAorICoJVGhpcyBmdWN0aW9uIGlzIHVzZWQgdG8gb2ZmbG9hZCB0aGUgCisgKglyeF9pbnRlcnJ1cHQgZHVyaW5nIEFQSSBvcGVyYXRpb24gbW9kZS4gIAorICoJVGhlIGZyX2JoKCkgZnVuY3Rpb24gZXhlY3V0ZXMgZm9yIGVhY2ggCisgKglkbGNpL2ludGVyZmFjZS4gIAorICogCisgKiAgICAgIE9uY2UgcmVjZWl2ZSBpbnRlcnJ1cHQgY29waWVzIGRhdGEgZnJvbSB0aGUKKyAqICAgICAgY2FyZCBpbnRvIGFuIHNrYiBidWZmZXIsIHRoZSBza2IgYnVmZmVyCisgKiAgCWlzIGFwcGVuZGVkIHRvIGEgY2lyY3VsYXIgQkggYnVmZmVyLgorICogIAlUaGVuIHRoZSBpbnRlcnJ1cHQga2lja3MgZnJfYmgoKSB0byBmaW5pc2ggdGhlCisgKiAgICAgIGpvYiBhdCBhIGxhdGVyIHRpbWUgKG5vdCB3aXRoaW4gdGhlIGludGVycnVwdCkuCisgKiAgICAgICAKKyAqIFVzYWdlOgorICogCUludGVycnVwdHMgdXNlIHRoaXMgdG8gZGVmZXIgYSB0YXNrIHRvIAorICogICAgICBhIHBvbGxpbmcgcm91dGluZS4KKyAqCisgKi8JCisKK3N0YXRpYyB2b2lkIGZyX2JoKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCWZyX2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzZGxhX3QgKmNhcmQgPSBjaGFuLT5jYXJkOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlpZiAoYXRvbWljX3JlYWQoJmNoYW4tPmJoX2J1ZmZfdXNlZCkgPT0gMCl7CisJCWNsZWFyX2JpdCgwLCAmY2hhbi0+dHFfd29ya2luZyk7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoYXRvbWljX3JlYWQoJmNoYW4tPmJoX2J1ZmZfdXNlZCkpeworCisJCWlmIChjaGFuLT5jb21tb24uc2sgPT0gTlVMTCB8fCBjaGFuLT5jb21tb24uZnVuYyA9PSBOVUxMKXsKKwkJCWNsZWFyX2JpdCgwLCAmY2hhbi0+dHFfd29ya2luZyk7CisJCQlyZXR1cm47CisJCX0KKworCQlza2IgID0gKChiaF9kYXRhX3QgKikmY2hhbi0+YmhfaGVhZFtjaGFuLT5iaF9yZWFkXSktPnNrYjsKKworCQlpZiAoc2tiICE9IE5VTEwpeworCisJCQlpZiAoY2hhbi0+Y29tbW9uLnNrID09IE5VTEwgfHwgY2hhbi0+Y29tbW9uLmZ1bmMgPT0gTlVMTCl7CisJCQkJKytjYXJkLT53YW5kZXYuc3RhdHMucnhfZHJvcHBlZDsKKwkJCQkrK2NoYW4tPmlmc3RhdHMucnhfZHJvcHBlZDsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJCWZyX2JoX2NsZWFudXAoZGV2KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKGNoYW4tPmNvbW1vbi5mdW5jKHNrYixkZXYsY2hhbi0+Y29tbW9uLnNrKSAhPSAwKXsKKwkJCQkvKiBTb2NrIGZ1bGwgY2Fubm90IHNlbmQsIHF1ZXVlIHVzIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbm90aGVyIHRyeSAqLworCQkJCWF0b21pY19zZXQoJmNoYW4tPmNvbW1vbi5yZWNlaXZlX2Jsb2NrLDEpOworCQkJCXJldHVybjsKKwkJCX1lbHNleworCQkJCWZyX2JoX2NsZWFudXAoZGV2KTsKKwkJCX0KKwkJfWVsc2V7CisJCQlmcl9iaF9jbGVhbnVwKGRldik7CisJCX0KKwl9CQorCWNsZWFyX2JpdCgwLCAmY2hhbi0+dHFfd29ya2luZyk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgZnJfYmhfY2xlYW51cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWZyX2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKworCSgoYmhfZGF0YV90ICopJmNoYW4tPmJoX2hlYWRbY2hhbi0+YmhfcmVhZF0pLT5za2IgPSBOVUxMOworCisJaWYgKGNoYW4tPmJoX3JlYWQgPT0gKE1BWF9CSF9CVUZGLTEpKXsKKwkJY2hhbi0+YmhfcmVhZD0wOworCX1lbHNleworCQkrK2NoYW4tPmJoX3JlYWQ7CQorCX0KKworCWF0b21pY19kZWMoJmNoYW4tPmJoX2J1ZmZfdXNlZCk7CisJcmV0dXJuIDA7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICBQT0xMIEJIIEhBTkRMRVJTIEFORCBLSUNLIFJPVVRJTkVTIAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogdHJpZ2dlcl9mcl9wb2xsCisgKgorICogRGVzY3JpcHRpb246CisgKiAJQWRkIGEgZnJfcG9sbCgpIHRhc2sgaW50byBhIHRxX3NjaGVkdWxlciBiaCBoYW5kbGVyCisgKiAgICAgIGZvciBhIHNwZWNpZmljIGRsY2kvaW50ZXJmYWNlLiAgVGhpcyB3aWxsIGtpY2sKKyAqICAgICAgdGhlIGZyX3BvbGwoKSByb3V0aW5lIGF0IGEgbGF0ZXIgdGltZS4gCisgKgorICogVXNhZ2U6CisgKiAJSW50ZXJydXB0cyB1c2UgdGhpcyB0byBkZWZlciBhIHRha3MgdG8gCisgKiAgICAgIGEgcG9sbGluZyByb3V0aW5lLgorICoKKyAqLwkKK3N0YXRpYyB2b2lkIHRyaWdnZXJfZnJfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWZyX2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzY2hlZHVsZV93b3JrKCZjaGFuLT5mcl9wb2xsX3dvcmspOworCXJldHVybjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogZnJfcG9sbAorICoJCisgKiBSYXRpb25hbGU6CisgKiAJV2UgY2Fubm90IG1hbmlwdWxhdGUgdGhlIHJvdXRpbmcgdGFibGVzLCBvcgorICogICAgICBpcCBhZGRyZXNzZXMgd2l0aGluZyB0aGUgaW50ZXJydXB0LiBUaGVyZWZvcmUKKyAqICAgICAgd2UgbXVzdCBwZXJmb3JtIHN1Y2ggYWN0b25zIG91dHNpZGUgYW4gaW50ZXJydXB0IAorICogICAgICBhdCBhIGxhdGVyIHRpbWUuIAorICoKKyAqIERlc2NyaXB0aW9uOgkKKyAqCUZyYW1lIHJlbGF5IHBvbGxpbmcgcm91dGluZSwgcmVzcG9uc2libGUgZm9yIAorICogICAgIAlzaHV0dGluZyBkb3duIGludGVyZmFjZXMgdXBvbiBkaXNjb25uZWN0CisgKiAgICAgCWFuZCBhZGRpbmcvcmVtb3Zpbmcgcm91dGVzLiAKKyAqICAgICAgCisgKiBVc2FnZTogICAgICAgIAorICogCVRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgZm9yIGVhY2ggZnJhbWUgcmVsYXkKKyAqIAlkbGNpL2ludGVyZmFjZSB0aHJvdWdoIGEgdHFfc2NoZWR1bGUgYm90dG9tIGhhbGYuCisgKiAgICAgIAorICogICAgICB0cmlnZ2VyX2ZyX3BvbGwoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGtpY2sKKyAqICAgICAgdGhlIGZyX3BvbGwgcm91dGluZS4gIAorICovCisKK3N0YXRpYyB2b2lkIGZyX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCWZyX2NoYW5uZWxfdCogY2hhbjsKKwlzZGxhX3QgKmNhcmQ7CisJdTggY2hlY2tfZ2F0ZXdheT0wOworCisJaWYgKCFkZXYgfHwgKGNoYW4gPSBkZXYtPnByaXYpID09IE5VTEwpCisJCXJldHVybjsKKworCWNhcmQgPSBjaGFuLT5jYXJkOworCQorCS8qIChSZSlDb25maWd1cmFpdG9uIGlzIGluIHByb2dyZXNzLCBzdG9wIHdoYXQgeW91IGFyZSAKKwkgKiBkb2luZyBhbmQgZ2V0IG91dCAqLworCWlmICh0ZXN0X2JpdChQRVJJX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCkpeworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChjaGFuLT5jb21tb24uc3RhdGUpeworCisJY2FzZSBXQU5fRElTQ09OTkVDVEVEOgorCisJCWlmICh0ZXN0X2JpdChEWU5fT1BUX09OLCZjaGFuLT5pbnRlcmZhY2VfZG93bikgJiYKKwkJICAgICF0ZXN0X2JpdChERVZfRE9XTiwgJmNoYW4tPmludGVyZmFjZV9kb3duKSAmJgorCQkgICAgZGV2LT5mbGFncyZJRkZfVVApeworCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSW50ZXJmYWNlICVzIGlzIERvd24uXG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lLGRldi0+bmFtZSk7CisJCQljaGFuZ2VfZGV2X2ZsYWdzKGRldixkZXYtPmZsYWdzJn5JRkZfVVApOworCQkJc2V0X2JpdChERVZfRE9XTiwgJmNoYW4tPmludGVyZmFjZV9kb3duKTsKKwkJCWNoYW4tPnJvdXRlX2ZsYWcgPSBOT19ST1VURTsKKwkJCQorCQl9ZWxzZXsKKwkJCWlmIChjaGFuLT5pbmFycCAhPSBJTkFSUF9OT05FKQorCQkJCXByb2Nlc3Nfcm91dGUoZGV2KTsJCisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdBTl9DT05ORUNURUQ6CisKKwkJaWYgKHRlc3RfYml0KERZTl9PUFRfT04sJmNoYW4tPmludGVyZmFjZV9kb3duKSAmJgorCQkgICAgdGVzdF9iaXQoREVWX0RPV04sICZjaGFuLT5pbnRlcmZhY2VfZG93bikgJiYKKwkJICAgICEoZGV2LT5mbGFncyZJRkZfVVApKXsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludGVyZmFjZSAlcyBpcyBVcC5cbiIsIAorCQkJCQljYXJkLT5kZXZuYW1lLGRldi0+bmFtZSk7CisKKwkJCWNoYW5nZV9kZXZfZmxhZ3MoZGV2LGRldi0+ZmxhZ3N8SUZGX1VQKTsKKwkJCWNsZWFyX2JpdChERVZfRE9XTiwgJmNoYW4tPmludGVyZmFjZV9kb3duKTsKKwkJCWNoZWNrX2dhdGV3YXk9MTsKKwkJfQorCisJCWlmIChjaGFuLT5pbmFycCAhPSBJTkFSUF9OT05FKXsKKwkJCXByb2Nlc3Nfcm91dGUoZGV2KTsKKwkJCWNoZWNrX2dhdGV3YXk9MTsKKwkJfQorCisJCWlmIChjaGFuLT5nYXRld2F5ICYmIGNoZWNrX2dhdGV3YXkpCisJCQlhZGRfZ2F0ZXdheShjYXJkLGRldik7CisKKwkJYnJlYWs7CisKKwl9CisKKwlyZXR1cm47CQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBjaGVja190eF9zdGF0dXMKKyAqCisgKiBSYXRpb25hbGU6CisgKglXZSBjYW5ub3QgdHJhbnNtaXQgZnJvbSBhbiBpbnRlcnJ1cHQgd2hpbGUKKyAqICAgICAgdGhlIGlmX3NlbmQgaXMgdHJhbnNtaXR0aW5nIGRhdGEuICBUaGVyZWZvcmUsCisgKiAgICAgIHdlIG11c3QgY2hlY2sgd2hldGhlciB0aGUgdHggYnVmZmVycyBhcmUKKyAqICAgICAgYmVnaW4gdXNlZCwgYmVmb3JlIHdlIHRyYW5zbWl0IGZyb20gYW4KKyAqICAgICAgaW50ZXJydXB0LgkKKyAqIAorICogRGVzY3JpcHRpb246CQorICoJQ2hlY2tzIHdoZXRoZXIgaXQncyBzYWZlIHRvIHVzZSB0aGUgdHJhbnNtaXQgCisgKiAgICAgIGJ1ZmZlcnMuIAorICoKKyAqIFVzYWdlOgorICogCUFSUCBhbmQgVURQIGhhbmRsaW5nIHJvdXRpbmVzIHVzZSB0aGlzIGZ1bmN0aW9uCisgKiAgICAgIGJlY2F1c2UsIHRoZXkgbmVlZCB0byB0cmFuc21pdCBkYXRhIGR1cmluZworICogICAgICBhbiBpbnRlcnJ1cHQuCisgKi8KKworc3RhdGljIGludCBjaGVja190eF9zdGF0dXMoc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJaWYgKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KXsKKwkJaWYgKHRlc3RfYml0KFNFTkRfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpIHx8CisJCQl0ZXN0X2JpdChTRU5EX1RYSVJRX0NSSVQsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSkgeworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpIHx8IChjYXJkLT51LmYudHhfaW50ZXJydXB0c19wZW5kaW5nKSkKKyAgICAgCQlyZXR1cm4gMTsgCisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIG1vdmVfZGV2X3RvX25leHQKKyAqICAKKyAqIERlc2NyaXB0aW9uOgorICoJTW92ZSB0aGUgZGV2IHBvaW50ZXIgdG8gdGhlIG5leHQgbG9jYXRpb24gaW4gdGhlCisgKiAgICAgIGxpbmsgbGlzdC4gIENoZWNrIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSAKKyAqICAgICAgbGlzdCwgaWYgc28gc3RhcnQgZnJvbSB0aGUgYmVnaW5pbmcuCisgKgorICogVXNhZ2U6CisgKiAJVGltZXIgaW50ZXJydXB0IHVzZXMgdGhpcyBmdW5jdGlvbiB0byBlZmZpY2llbnRseQorICogICAgICBzdGVwIHRocm91Z2ggdGhlIGRldmljZXMgdGhhdCBuZWVkIHRvIHNlbmQgQVJQIGRhdGEuCisgKgorICovCisKK3N0cnVjdCBuZXRfZGV2aWNlICptb3ZlX2Rldl90b19uZXh0KHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpZiAoY2FyZC0+d2FuZGV2Lm5ld19pZl9jbnQgIT0gMSl7CisJCWlmICghKigoc3RydWN0IG5ldF9kZXZpY2UgKiopZGV2LT5wcml2KSkKKwkJCXJldHVybiBjYXJkLT53YW5kZXYuZGV2OworCQllbHNlCisJCQlyZXR1cm4gKigoc3RydWN0IG5ldF9kZXZpY2UgKiopZGV2LT5wcml2KTsKKwl9CisJcmV0dXJuIGRldjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogdHJpZ2dlcl9jb25maWdfZnIKKyAqCisgKiBSYXRpb25hbGU6CisgKglBbGwgY29tbWFuZHMgbXVzdCBiZSBwZXJmb3JtZWQgaW5zaWRlIG9mIGEgIAorICogICAgICBpbnRlcnJ1cHQuICAgCisgKgorICogRGVzY3JpcHRpb246CisgKglLaWNrIHRoZSBjb25maWdfZnIoKSByb3V0aW5lIHRocm91Z2h0IHRoZQorICogICAgICB0aW1lciBpbnRlcnJ1cHQuCisgKi8KKworCitzdGF0aWMgdm9pZCB0cmlnZ2VyX2NvbmZpZ19mciAoc2RsYV90ICpjYXJkKQoreworCWZyNTA4X2ZsYWdzX3QqIGZsYWdzID0gY2FyZC0+ZmxhZ3M7CisKKwljYXJkLT51LmYudGltZXJfaW50X2VuYWJsZWQgfD0gVE1SX0lOVF9FTkFCTEVEX0NPTkZJRzsKKwlmbGFncy0+aW1hc2sgfD0gRlJfSU5UUl9USU1FUjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBjb25maWdfZnIKKyAqCisgKiBSYXRpb25hbGU6CisgKiAJQWxsIGNvbW1hbmRzIG11c3QgYmUgcGVyZm9ybWVkIGluc2lkZSBvZiBhICAKKyAqICAgICAgaW50ZXJydXB0LiAgCisgJgorICogRGVzY3JpcHRpb246CQorICogCUNvbmZpZ3VyZSBhIERMQ0kuIFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQKKyAqICAgICAgYnkgYSB0aW1lcl9pbnRlcnJ1cHQuICBUaGUgaWZfb3BlbigpIGZ1bmN0aW9uCisgKiAgICAgIHRyaWdnZXJzIGl0LgorICoKKyAqIFVzYWdlOgorICoJbmV3X2lmKCkgY29sbGVjdHMgYWxsIGRhdGEgbmVjZXNzYXJ5IHRvCisgKiAgICAgIGNvbmZpZ3VyZSB0aGUgRExDSS4gSXQgc2V0cyB0aGUgY2hhbi0+ZGxjaV9yZWFkeSAKKyAqICAgICAgYml0LiAgV2hlbiB0aGUgaWZfb3BlbigpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkCisgKiAgICAgIGl0IGNoZWNrcyB0aGlzIGJpdCwgYW5kIGlmIGl0cyBzZXQgaXQgdHJpZ2dlcnMKKyAqICAgICAgdGhlIHRpbWVyIGludGVycnVwdCB0byBleGVjdXRlIHRoZSBjb25maWdfZnIoKQorICogICAgICBmdW5jdGlvbi4KKyAqLworCitzdGF0aWMgdm9pZCBjb25maWdfZnIgKHNkbGFfdCAqY2FyZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWZyX2NoYW5uZWxfdCAqY2hhbjsKKworCWZvciAoZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsgZGV2OworCSAgICAgZGV2ID0gKigoc3RydWN0IG5ldF9kZXZpY2UgKiopZGV2LT5wcml2KSkgeworCQorCQlpZiAoKGNoYW49ZGV2LT5wcml2KSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCQorCQlpZiAoIXRlc3RfYml0KDAsJmNoYW4tPmNvbmZpZ19kbGNpKSkKKwkJCWNvbnRpbnVlOworCisJCWNsZWFyX2JpdCgwLCZjaGFuLT5jb25maWdfZGxjaSk7CisKKwkJLyogSWYgc2lnbmFsbGluZyBpcyBzZXQgdG8gTk8sIHRoZW4gc2V0dXAgCisgICAgICAgIAkgKiBETENJIGFkZHJlc3NlcyByaWdodCBhd2F5LiAgRG9uJ3QgaGF2ZSB0byB3YWl0IGZvcgorCQkgKiBsaW5rIHRvIGNvbm5lY3QuIAorCQkgKi8KKwkJaWYgKGNhcmQtPndhbmRldi5zaWduYWxsaW5nID09IFdBTk9QVF9OTyl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogU2lnbmFsbGluZyBzZXQgdG8gTk86IE1hcHBpbmcgRExDSSdzXG4iLAorCQkJCQljYXJkLT53YW5kZXYubmFtZSk7CisJCQlpZiAoZnJfaW5pdF9kbGNpKGNhcmQsY2hhbikpeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFUlJPUjogRmFpbGVkIHRvIGNvbmZpZ3VyZSBETENJICVpICFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsIGNoYW4tPmRsY2kpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCWlmIChjYXJkLT53YW5kZXYuc3RhdGlvbiA9PSBXQU5PUFRfQ1BFKSB7CisJCisJCQl1cGRhdGVfY2hhbl9zdGF0ZShkZXYpOwkKKwkJCQorCQkJLyogQ1BFOiBpc3N1ZSBmdWxsIHN0YXR1cyBlbnF1aXJ5ICovCisJCQlmcl9pc3N1ZV9pc2YoY2FyZCwgRlJfSVNGX0ZTRSk7CisKKwkJfSBlbHNlIHsJCisJCQkvKiBGUiBzd2l0Y2g6IGFjdGl2YXRlIERMQ0kocykgKi8KKwkKKwkJCS8qIEZvciBTd2l0Y2ggZW11bGF0aW9uIHdlIGhhdmUgdG8gQUREIGFuZCBBQ1RJVkFURQorCQkJICogdGhlIERMQ0kocykgdGhhdCB3ZXJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgU0VUX0RMQ0lfCisJCQkgKiBDT05GSUdVUkFUSU9OIGNvbW1hbmQuIEFkZCBhbmQgQWN0aXZhdGUgd2lsbCBmYWlsIGlmCisJCQkgKiBETENJIHNwZWNpZmllZCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGxpc3QuCisJCQkgKgorCQkJICogQWxzbyBJZl9vcGVuIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIGludGVyZmFjZS4gQnV0CisJCQkgKiBpdCBkb2VzIG5vdCBnZXQgaW4gaGVyZSBmb3IgYWxsIHRoZSBpbnRlcmZhY2UuIFNvCisJCSAJICogd2UgaGF2ZSB0byBwYXNzIHRoZSBlbnRpcmUgbGlzdCBvZiBETENJKHMpIHRvIGFkZCAKKwkJCSAqIGFjdGl2YXRlIHJvdXRpbmVzLiAgCisJCQkgKi8gCisJCQkKKwkJCWlmICghY2hlY2tfZGxjaV9jb25maWcgKGNhcmQsIGNoYW4pKXsKKwkJCQlmcl9hZGRfZGxjaShjYXJkLCBjaGFuLT5kbGNpKTsKKwkJCQlmcl9hY3RpdmF0ZV9kbGNpKGNhcmQsIGNoYW4tPmRsY2kpOworCQkJfQorCQl9CisKKwkJY2FyZC0+dS5mLmRsY2lfdG9fZGV2X21hcFtjaGFuLT5kbGNpXSA9IGRldjsKKwl9CisJcmV0dXJuOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIGNvbmZpZ19mcgorICoKKyAqIFJhdGlvbmFsZToKKyAqCUFsbCBjb21tYW5kcyBtdXN0IGJlIGV4ZWN1dGVkIGR1cmluZyBhbiBpbnRlcnJ1cHQuCisgKiAKKyAqIERlc2NyaXB0aW9uOgkKKyAqCVRyaWdnZXIgdW5jb2ZpZ19mcigpIGZ1bmN0aW9uIHRocm91Z2ggCisgKiAgICAgIHRoZSB0aW1lciBpbnRlcnJ1cHQuCisgKgorICovCisKK3N0YXRpYyB2b2lkIHRyaWdnZXJfdW5jb25maWdfZnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlmcl9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CisJdm9sYXRpbGUgc2RsYV90ICpjYXJkID0gY2hhbi0+Y2FyZDsKKwl1MzIgdGltZW91dDsKKwlmcjUwOF9mbGFnc190KiBmbGFncyA9IGNhcmQtPmZsYWdzOworCWludCByZXNldF9jcml0aWNhbD0wOworCQorCWlmICh0ZXN0X2JpdChQRVJJX0NSSVQsKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJY2xlYXJfYml0KFBFUklfQ1JJVCwodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJCXJlc2V0X2NyaXRpY2FsPTE7CisJfQorCQkKKwkvKiBydW4gdW5jb25maWdfZGxjaSgpIGZ1bmN0aW9uIAorICAgICAgICAgKiB0aHJvdWdodCB0aGUgdGltZXIgaW50ZXJydXB0ICovCisJc2V0X2JpdCgwLCh2b2lkKikmY2hhbi0+dW5jb25maWdfZGxjaSk7CisJY2FyZC0+dS5mLnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9VTkNPTkZJRzsKKwlmbGFncy0+aW1hc2sgfD0gRlJfSU5UUl9USU1FUjsKKworCS8qIFdhaXQgZm9yIHRoZSBjb21tYW5kIHRvIGNvbXBsZXRlICovCisJdGltZW91dCA9IGppZmZpZXM7CisgICAgIAlmb3IoOzspIHsKKworCQlpZighKGNhcmQtPnUuZi50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9VTkNPTkZJRykpCisJCQlicmVhazsKKworICAgICAgICAgICAgIAlpZiAoKGppZmZpZXMgLSB0aW1lb3V0KSA+ICgxICogSFopKXsKKyAgICAJCQljYXJkLT51LmYudGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9VTkNPTkZJRzsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGYWlsZWQgdG8gZGVsZXRlIERMQ0kgJWlcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSxjaGFuLT5kbGNpKTsKKyAJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChyZXNldF9jcml0aWNhbCl7CisJCXNldF9iaXQoUEVSSV9DUklULCh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwl9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHVuY29uZmlnX2ZyCisgKgorICogUmF0aW9uYWxlOgorICoJQWxsIGNvbW1hbmRzIG11c3QgYmUgZXhlY3V0ZWQgZHVyaW5nIGFuIGludGVycnVwdC4KKyAqIAorICogRGVzY3JpcHRpb246CQorICoJUmVtb3ZlIHRoZSBkbGNpIGZyb20gZmlybXdhcmUuCisgKglUaGlzIGZ1bmNpdG9uIGlzIHVzZWQgaW4gTk9ERSBzaHV0ZG93bi4KKyAqLworCitzdGF0aWMgdm9pZCB1bmNvbmZpZ19mciAoc2RsYV90ICpjYXJkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJZnJfY2hhbm5lbF90ICpjaGFuOworCisJZm9yIChkZXYgPSBjYXJkLT53YW5kZXYuZGV2OyBkZXY7CisJICAgICBkZXYgPSAqKChzdHJ1Y3QgbmV0X2RldmljZSAqKilkZXYtPnByaXYpKXsKKwkKKwkJaWYgKChjaGFuPWRldi0+cHJpdikgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQkKKwkJaWYgKCF0ZXN0X2JpdCgwLCZjaGFuLT51bmNvbmZpZ19kbGNpKSkKKwkJCWNvbnRpbnVlOworCisJCWNsZWFyX2JpdCgwLCZjaGFuLT51bmNvbmZpZ19kbGNpKTsKKworCQlpZiAoY2FyZC0+d2FuZGV2LnN0YXRpb24gPT0gV0FOT1BUX05PREUpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVuY29uZmlndXJpbmcgRExDSSAlaVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSxjaGFuLT5kbGNpKTsKKwkJCWZyX2RlbGV0ZV9kbGNpKGNhcmQsY2hhbi0+ZGxjaSk7CisJCX0KKwkJY2FyZC0+dS5mLmRsY2lfdG9fZGV2X21hcFtjaGFuLT5kbGNpXSA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IHNldHVwX2ZyX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqKnNrYl9vcmlnLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkJICAgY2hhciBvcF9tb2RlKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSAqc2tiX29yaWc7CisJZnJfY2hhbm5lbF90ICpjaGFuPWRldi0+cHJpdjsKKworCWlmIChvcF9tb2RlID09IFdBTlBJUEUpeworCisJCWNoYW4tPmZyX2hlYWRlclswXT1ROTIyX1VJOworCQkKKwkJc3dpdGNoIChodG9ucyhza2ItPnByb3RvY29sKSl7CisJCQkKKwkJY2FzZSBFVEhfUF9JUDoKKwkJCWNoYW4tPmZyX2hlYWRlclsxXT1OTFBJRF9JUDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJCQorCQlyZXR1cm4gMjsKKwl9CisKKwkvKiBJZiB3ZSBhcmUgaW4gYnJpZGdpbmcgbW9kZSwgd2UgbXVzdCBhcHBseQorCSAqIGFuIEV0aGVybmV0IGhlYWRlciAqLworCWlmIChvcF9tb2RlID09IEJSSURHRSB8fCBvcF9tb2RlID09IEJSSURHRV9OT0RFKXsKKworCisJCS8qIEVuY2Fwc3VsYXRlIHRoZSBwYWNrZXQgYXMgYSBicmlkZ2VkIEV0aGVybmV0IGZyYW1lLiAqLworI2lmZGVmIERFQlVHCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBlbmNhcHN1bGF0aW5nIHNrYiBmb3IgZnJhbWUgcmVsYXlcbiIsIAorCQkJZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkKKwkJY2hhbi0+ZnJfaGVhZGVyWzBdID0gMHgwMzsKKwkJY2hhbi0+ZnJfaGVhZGVyWzFdID0gMHgwMDsKKwkJY2hhbi0+ZnJfaGVhZGVyWzJdID0gMHg4MDsKKwkJY2hhbi0+ZnJfaGVhZGVyWzNdID0gMHgwMDsKKwkJY2hhbi0+ZnJfaGVhZGVyWzRdID0gMHg4MDsKKwkJY2hhbi0+ZnJfaGVhZGVyWzVdID0gMHhDMjsKKwkJY2hhbi0+ZnJfaGVhZGVyWzZdID0gMHgwMDsKKwkJY2hhbi0+ZnJfaGVhZGVyWzddID0gMHgwNzsKKworCQkvKiBZdWNrLiAqLworCQlza2ItPnByb3RvY29sID0gRVRIX1BfODAyXzM7CisJCXJldHVybiA4OworCisJfQorCQkKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGNoZWNrX2RsY2lfY29uZmlnIChzZGxhX3QgKmNhcmQsIGZyX2NoYW5uZWxfdCAqY2hhbikKK3sKKwlmcl9tYm94X3QqIG1ib3ggPSBjYXJkLT5tYm94OworCWludCBlcnI9MDsKKwlmcl9jb25mX3QgKmNvbmY9TlVMTDsKKwl1bnNpZ25lZCBzaG9ydCBkbGNpX251bSA9IGNoYW4tPmRsY2k7CisJaW50IGRsY2lfb2Zmc2V0PTA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJCisJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9SRUFEX0NPTkZJRzsKKwltYm94LT5jbWQubGVuZ3RoID0gMDsKKwltYm94LT5jbWQuZGxjaSA9IGRsY2lfbnVtOyAJCisKKwllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJCisJaWYgKGVyciA9PSBDTURfT0speworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGRldiA9IGNhcmQtPndhbmRldi5kZXY7IGRldjsKKwkgICAgIGRldj0qKChzdHJ1Y3QgbmV0X2RldmljZSAqKilkZXYtPnByaXYpKQorCQlzZXRfY2hhbl9zdGF0ZShkZXYsV0FOX0RJU0NPTk5FQ1RFRCk7CisJCisJcHJpbnRrKEtFUk5fSU5GTyAiRExDSSAlaSBOb3QgY29uZmlndXJlZCwgY29uZmlndXJpbmdcbiIsZGxjaV9udW0pOworCQorCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfQ09NTV9ESVNBQkxFOworCW1ib3gtPmNtZC5sZW5ndGggPSAwOworCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyICE9IENNRF9PSyl7CisJCWZyX2V2ZW50KGNhcmQsIGVyciwgbWJveCk7CisJCXJldHVybiAyOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIkRpc2FibGVkIENvbW11bmljYXRpb25zIFxuIik7CisJCisJbWJveC0+Y21kLmNvbW1hbmQgPSBGUl9SRUFEX0NPTkZJRzsKKwltYm94LT5jbWQubGVuZ3RoID0gMDsKKwltYm94LT5jbWQuZGxjaSA9IDA7IAkKKworCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwkKKwlpZiAoZXJyICE9IENNRF9PSyl7CisJCWZyX2V2ZW50KGNhcmQsIGVyciwgbWJveCk7CisJCXJldHVybiAyOworCX0KKwkKKwljb25mID0gKGZyX2NvbmZfdCAqKW1ib3gtPmRhdGE7CisKKwlkbGNpX29mZnNldD0wOworCWZvciAoZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsgZGV2OworCSAgICAgZGV2ID0gKigoc3RydWN0IG5ldF9kZXZpY2UgKiopZGV2LT5wcml2KSkgeworCQlmcl9jaGFubmVsX3QgKmNoYW5fdG1wID0gZGV2LT5wcml2OworCQljb25mLT5kbGNpW2RsY2lfb2Zmc2V0XSA9IGNoYW5fdG1wLT5kbGNpOwkJCisJCWRsY2lfb2Zmc2V0Kys7CisJfQorCQorCXByaW50ayhLRVJOX0lORk8gIkdvdCBGciBjb25maWd1cmF0aW9uIEJ1ZmZlciBMZW5ndGggaXMgJXggRGxjaSAlaSBEbGNpIE9mZiAlaVxuIiwKKwkJbWJveC0+Y21kLmxlbmd0aCwKKwkJbWJveC0+Y21kLmxlbmd0aCA+IDB4MjAgPyBjb25mLT5kbGNpWzBdIDogLTEsIAorCQlkbGNpX29mZnNldCApOworCQorCW1ib3gtPmNtZC5sZW5ndGggPSAweDIwICsgZGxjaV9vZmZzZXQqMjsKKworCW1ib3gtPmNtZC5jb21tYW5kID0gRlJfU0VUX0NPTkZJRzsKKwltYm94LT5jbWQuZGxjaSA9IDA7IAorCisJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCisJaWYgKGVyciAhPSBDTURfT0speworCQlmcl9ldmVudChjYXJkLCBlcnIsIG1ib3gpOworCQlyZXR1cm4gMjsKKwl9CisKKwlpbml0aWFsaXplX3J4X3R4X2J1ZmZlcnMgKGNhcmQpOworCisJCisJcHJpbnRrKEtFUk5fSU5GTyAiQ29uZmlndXJhaXRvbiBTdWNjZWRlZCBmb3IgbmV3IERMQ0kgJWlcbiIsZGxjaV9udW0pOworCisJaWYgKGZyX2NvbW1fZW5hYmxlIChjYXJkKSl7CisJCXJldHVybiAyOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIkVuYWJsaW5nIENvbW11bmljYXRpb25zIFxuIik7CisKKwlmb3IgKGRldiA9IGNhcmQtPndhbmRldi5kZXY7IGRldjsKKwkgICAgIGRldiA9ICooKHN0cnVjdCBuZXRfZGV2aWNlICoqKWRldi0+cHJpdikpIHsKKwkJZnJfY2hhbm5lbF90ICpjaGFuX3RtcCA9IGRldi0+cHJpdjsKKwkJZnJfaW5pdF9kbGNpKGNhcmQsY2hhbl90bXApOworCQlmcl9hZGRfZGxjaShjYXJkLCBjaGFuX3RtcC0+ZGxjaSk7CisJCWZyX2FjdGl2YXRlX2RsY2koY2FyZCwgY2hhbl90bXAtPmRsY2kpOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIkVORCBPRiBDT05GSUdVUkFJVE9OICVpXG4iLGRsY2lfbnVtKTsKKwkKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9yeF90eF9idWZmZXJzIChzZGxhX3QgKmNhcmQpCit7CisJZnJfYnVmX2luZm9fdCogYnVmX2luZm87CisJCisJaWYgKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KSB7CisJCisgICAgICAgICAgICAgICAgYnVmX2luZm8gPSAodm9pZCopKGNhcmQtPmh3LmRwbWJhc2UgKyBGUl9NQl9WRUNUT1IgKworCQkJRlI1MDhfUlhCQ19PRkZTKTsKKworICAgICAgICAgICAgICAgIGNhcmQtPnJ4bWIgPSAodm9pZCopKGJ1Zl9pbmZvLT5yc2VfbmV4dCArIGNhcmQtPmh3LmRwbWJhc2UpOworCisgICAgICAgICAgICAgICAgY2FyZC0+dS5mLnJ4bWJfYmFzZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopKGJ1Zl9pbmZvLT5yc2VfYmFzZSArIGNhcmQtPmh3LmRwbWJhc2UpOyAKKworICAgICAgICAgICAgICAgIGNhcmQtPnUuZi5yeG1iX2xhc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKShidWZfaW5mby0+cnNlX2Jhc2UgKworICAgICAgICAgICAgICAgICAgICAgICAgKGJ1Zl9pbmZvLT5yc2VfbnVtIC0gMSkgKiBzaXplb2YoZnJfcnhfYnVmX2N0bF90KSArCisgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5ody5kcG1iYXNlKTsKKwl9ZWxzZXsJCisJCWJ1Zl9pbmZvID0gKHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsgRlI1MDhfUlhCQ19PRkZTKTsKKworCQljYXJkLT5yeG1iID0gKHZvaWQqKShidWZfaW5mby0+cnNlX25leHQgLQorCQkJRlJfTUJfVkVDVE9SICsgY2FyZC0+aHcuZHBtYmFzZSk7CisJCQorCQljYXJkLT51LmYucnhtYl9iYXNlID0KKwkJCSh2b2lkKikoYnVmX2luZm8tPnJzZV9iYXNlIC0KKwkJCUZSX01CX1ZFQ1RPUiArIGNhcmQtPmh3LmRwbWJhc2UpOworCQkKKwkJY2FyZC0+dS5mLnJ4bWJfbGFzdCA9CisJCQkodm9pZCopKGJ1Zl9pbmZvLT5yc2VfYmFzZSArCisJCQkoYnVmX2luZm8tPnJzZV9udW0gLSAxKSAqIHNpemVvZihmcl9yeF9idWZfY3RsX3QpIC0KKwkJCUZSX01CX1ZFQ1RPUiArIGNhcmQtPmh3LmRwbWJhc2UpOworCX0KKworCWNhcmQtPnUuZi5yeF9iYXNlID0gYnVmX2luZm8tPmJ1Zl9iYXNlOworCWNhcmQtPnUuZi5yeF90b3AgID0gYnVmX2luZm8tPmJ1Zl90b3A7CisKKwljYXJkLT51LmYudHhfaW50ZXJydXB0c19wZW5kaW5nID0gMDsKKworCXJldHVybjsKK30KKworCQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qKioqKiogRW5kICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NkbGFfZnQxLmMgYi9kcml2ZXJzL25ldC93YW4vc2RsYV9mdDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTMxMjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3NkbGFfZnQxLmMKQEAgLTAsMCArMSwzNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBzZGxhX2NoZGxjLmMJV0FOUElQRSh0bSkgTXVsdGlwcm90b2NvbCBXQU4gTGluayBEcml2ZXIuIENpc2NvIEhETEMgbW9kdWxlLgorKgorKiBBdXRob3JzOiAJTmVuYWQgQ29yYmljIDxuY29yYmljQHNhbmdvbWEuY29tPgorKgkJR2lkZW9uIEhhY2sgIAorKgorKiBDb3B5cmlnaHQ6CShjKSAxOTk1LTE5OTkgU2FuZ29tYSBUZWNobm9sb2dpZXMgSW5jLgorKgorKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiBTZXAgMzAsIDE5OTkgIE5lbmFkIENvcmJpYyAgICBGaXhlZCBkeW5hbWljIElQIGFuZCByb3V0ZSBzZXR1cC4KKyogU2VwIDIzLCAxOTk5ICBOZW5hZCBDb3JiaWMgICAgQWRkZWQgU01QIHN1cHBvcnQsIGZpeGVkIHRyYWNpbmcgCisqIFNlcCAxMywgMTk5OSAgTmVuYWQgQ29yYmljCVNwbGl0IHVwIFBvcnQgMCBhbmQgMSBpbnRvIHNlcGFyYXRlIGRldmljZXMuCisqIEp1biAwMiwgMTk5OSAgR2lkZW9uIEhhY2sgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBTNTE0IGFkYXB0ZXIuCisqIE9jdCAzMCwgMTk5OAlKYXNwcmVldCBTaW5naAlBZGRlZCBTdXBwb3J0IGZvciBDSERMQyBBUEkgKEhETEMgU1RSRUFNSU5HKS4KKyogT2N0IDI4LCAxOTk4CUphc3ByZWV0IFNpbmdoCUFkZGVkIFN1cHBvcnQgZm9yIER1YWwgUG9ydCBDSERMQy4KKyogQXVnIDA3LCAxOTk4CURhdmlkIEZvbmcJSW5pdGlhbCB2ZXJzaW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4JLyogcHJpbnRrKCksIGFuZCBvdGhlciB1c2VmdWwgc3R1ZmYgKi8KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4JLyogb2Zmc2V0b2YoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CS8qIHJldHVybiBjb2RlcyAqLworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgkvKiBpbmxpbmUgbWVtc2V0KCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CQkvKiBrbWFsbG9jKCksIGtmcmVlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC93YW5yb3V0ZXIuaD4JLyogV0FOIHJvdXRlciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L3dhbnBpcGUuaD4JLyogV0FOUElQRSBjb21tb24gdXNlciBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4JLyogQVJQSFJEXyogZGVmaW5lcyAqLworCisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbi5oPgkJLyogc29ja2FkZHJfaW4gKi8KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CQorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgkvKiBodG9ucygpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvc2RsYXBjaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8bGludXgvc2RsYV9jaGRsYy5oPgkJLyogQ0hETEMgZmlybXdhcmUgQVBJIGRlZmluaXRpb25zICovCisKKy8qKioqKiogRGVmaW5lcyAmIE1hY3JvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiByZWFzb25zIGZvciBlbmFibGluZyB0aGUgdGltZXIgaW50ZXJydXB0IG9uIHRoZSBhZGFwdGVyICovCisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9VRFAgICAJMHgwMDAxCisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9VUERBVEUJMHgwMDAyCisgCisjZGVmaW5lCUNIRExDX0RGTFRfREFUQV9MRU4JMTUwMAkJLyogZGVmYXVsdCBNVFUgKi8KKyNkZWZpbmUgQ0hETENfSERSX0xFTgkJMQorCisjZGVmaW5lIElGRl9QT0lOVFRPUE9JTlQgMHgxMAorCisjZGVmaW5lIFdBTlBJUEUgMHgwMAorI2RlZmluZSBBUEkJMHgwMQorI2RlZmluZSBDSERMQ19BUEkgMHgwMQorCisjZGVmaW5lIFBPUlQoeCkgICAoeCA9PSAwID8gIlBSSU1BUlkiIDogIlNFQ09OREFSWSIgKQorCisgCisvKioqKioqRGF0YSBTdHJ1Y3R1cmVzKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHBsYWNlZCBpbiB0aGUgcHJpdmF0ZSBkYXRhIGFyZWEgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUuCisgKiBUaGUgY2FyZCBzdHJ1Y3R1cmUgdXNlZCB0byBvY2N1cHkgdGhlIHByaXZhdGUgYXJlYSBidXQgbm93IHRoZSBmb2xsb3dpbmcgCisgKiBzdHJ1Y3R1cmUgd2lsbCBpbmNvcnBvcmF0ZSB0aGUgY2FyZCBzdHJ1Y3R1cmUgYWxvbmcgd2l0aCBDSERMQyBzcGVjaWZpYyBkYXRhCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgY2hkbGNfcHJpdmF0ZV9hcmVhCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlOworCXNkbGFfdAkJKmNhcmQ7CisJaW50IAkJVHJhY2luZ0VuYWJsZWQ7CQkvKiBGb3IgZW5hYmxpbmcgVHJhY2luZyAqLworCXVuc2lnbmVkIGxvbmcgCWN1cnJfdHJhY2VfYWRkcjsJLyogVXNlZCBmb3IgVHJhY2luZyAqLworCXVuc2lnbmVkIGxvbmcgCXN0YXJ0X3RyYWNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyAJZW5kX3RyYWNlX2FkZHI7CisJdW5zaWduZWQgbG9uZyAJYmFzZV9hZGRyX3RyYWNlX2J1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIAllbmRfYWRkcl90cmFjZV9idWZmZXI7CisJdW5zaWduZWQgc2hvcnQgCW51bWJlcl90cmFjZV9lbGVtZW50czsKKwl1bnNpZ25lZCAgCWF2YWlsYWJsZV9idWZmZXJfc3BhY2U7CisJdW5zaWduZWQgbG9uZyAJcm91dGVyX3N0YXJ0X3RpbWU7CisJdW5zaWduZWQgY2hhciAJcm91dGVfc3RhdHVzOworCXVuc2lnbmVkIGNoYXIgCXJvdXRlX3JlbW92ZWQ7CisJdW5zaWduZWQgbG9uZyAJdGlja19jb3VudGVyOwkJLyogRm9yIDVzIHRpbWVvdXQgY291bnRlciAqLworCXVuc2lnbmVkIGxvbmcgCXJvdXRlcl91cF90aW1lOworICAgICAgICB1MzIgICAgICAgICAgICAgSVBfYWRkcmVzczsJCS8qIElQIGFkZHJlc3NpbmcgKi8KKyAgICAgICAgdTMyICAgICAgICAgICAgIElQX25ldG1hc2s7CisJdW5zaWduZWQgY2hhciAgbWM7CQkJLyogTXVsaXRjYXN0IHN1cHBvcnQgb24vb2ZmICovCisJdW5zaWduZWQgc2hvcnQgdWRwX3BrdF9sZ3RoOwkJLyogdWRwIHBhY2tldCBwcm9jZXNzaW5nICovCisJY2hhciB1ZHBfcGt0X3NyYzsKKwljaGFyIHVkcF9wa3RfZGF0YVtNQVhfTEdUSF9VRFBfTUdOVF9QS1RdOworCXVuc2lnbmVkIHNob3J0IHRpbWVyX2ludF9lbmFibGVkOworCWNoYXIgdXBkYXRlX2NvbW1zX3N0YXRzOwkJLyogdXBkYXRpbmcgY29tbXMgc3RhdHMgKi8KKwkvL0ZJWE1FOiBhZGQgZHJpdmVyIHN0YXRzIGFzIHBlciBmcmFtZSByZWxheSEKKworfSBjaGRsY19wcml2YXRlX2FyZWFfdDsKKworLyogUm91dGUgU3RhdHVzIG9wdGlvbnMgKi8KKyNkZWZpbmUgTk9fUk9VVEUJMHgwMAorI2RlZmluZSBBRERfUk9VVEUJMHgwMQorI2RlZmluZSBST1VURV9BRERFRAkweDAyCisjZGVmaW5lIFJFTU9WRV9ST1VURQkweDAzCisKKworLyoqKioqKiBGdW5jdGlvbiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBXQU4gbGluayBkcml2ZXIgZW50cnkgcG9pbnRzLiBUaGVzZSBhcmUgY2FsbGVkIGJ5IHRoZSBXQU4gcm91dGVyIG1vZHVsZS4gKi8KK3N0YXRpYyBpbnQgd3BmdDFfZXhlYyAoc3RydWN0IHNkbGEgKmNhcmQsIHZvaWQgKnVfY21kLCB2b2lkICp1X2RhdGEpOworc3RhdGljIGludCBjaGRsY19yZWFkX3ZlcnNpb24gKHNkbGFfdCogY2FyZCwgY2hhciogc3RyKTsKK3N0YXRpYyBpbnQgY2hkbGNfZXJyb3IgKHNkbGFfdCAqY2FyZCwgaW50IGVyciwgQ0hETENfTUFJTEJPWF9TVFJVQ1QgKm1iKTsKKworLyoqKioqKiBQdWJsaWMgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2lzY28gSERMQyBwcm90b2NvbCBpbml0aWFsaXphdGlvbiByb3V0aW5lLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIG1haW4gV0FOUElQRSBtb2R1bGUgZHVyaW5nIHNldHVwLiAgQXQgdGhpcworICogcG9pbnQgYWRhcHRlciBpcyBjb21wbGV0ZWx5IGluaXRpYWxpemVkIGFuZCBmaXJtd2FyZSBpcyBydW5uaW5nLgorICogIG8gcmVhZCBmaXJtd2FyZSB2ZXJzaW9uICh0byBtYWtlIHN1cmUgaXQncyBhbGl2ZSkKKyAqICBvIGNvbmZpZ3VyZSBhZGFwdGVyCisgKiAgbyBpbml0aWFsaXplIHByb3RvY29sLXNwZWNpZmljIGZpZWxkcyBvZiB0aGUgYWRhcHRlciBkYXRhIHNwYWNlLgorICoKKyAqIFJldHVybjoJMAlvLmsuCisgKgkJPCAwCWZhaWx1cmUuCisgKi8KK2ludCB3cGZ0MV9pbml0IChzZGxhX3QqIGNhcmQsIHdhbmRldl9jb25mX3QqIGNvbmYpCit7CisJdW5zaWduZWQgY2hhciBwb3J0X251bTsKKwlpbnQgZXJyOworCisJdW5pb24KKwkJeworCQljaGFyIHN0cls4MF07CisJCX0gdTsKKwl2b2xhdGlsZSBDSERMQ19NQUlMQk9YX1NUUlVDVCogbWI7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iMTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwkvKiBWZXJpZnkgY29uZmlndXJhdGlvbiBJRCAqLworCWlmIChjb25mLT5jb25maWdfaWQgIT0gV0FOQ09ORklHX0NIRExDKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gSUQgJXUhXG4iLAorCQkJCSAgY2FyZC0+ZGV2bmFtZSwgY29uZi0+Y29uZmlnX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVXNlIHByaW1hcnkgcG9ydCAqLworCWNhcmQtPnUuYy5jb21tX3BvcnQgPSAwOworCQorCisJLyogSW5pdGlhbGl6ZSBwcm90b2NvbC1zcGVjaWZpYyBmaWVsZHMgKi8KKwlpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCl7CisJCWNhcmQtPm1ib3ggID0gKHZvaWQgKikgY2FyZC0+aHcuZHBtYmFzZTsKKwl9ZWxzZXsgCisJCWNhcmQtPm1ib3ggPSAodm9pZCAqKSBjYXJkLT5ody5kcG1iYXNlICsgUFJJX0JBU0VfQUREUl9NQl9TVFJVQ1Q7CisJfQorCisJbWIgPSBtYjEgPSBjYXJkLT5tYm94OworCisJaWYgKCFjYXJkLT5jb25maWd1cmVkKXsKKworCQkvKiBUaGUgYm9hcmQgd2lsbCBwbGFjZSBhbiAnSScgaW4gdGhlIHJldHVybiBjb2RlIHRvIGluZGljYXRlIHRoYXQgaXQgaXMKKwkgICAJcmVhZHkgdG8gYWNjZXB0IGNvbW1hbmRzLiAgV2UgZXhwZWN0IHRoaXMgdG8gYmUgY29tcGxldGVkIGluIGxlc3MKKyAgICAgICAgICAgCXRoYW4gMSBzZWNvbmQuICovCisKKwkJdGltZW91dCA9IGppZmZpZXM7CisJCXdoaWxlIChtYi0+cmV0dXJuX2NvZGUgIT0gJ0knKQkvKiBXYWl0IDFzIGZvciBib2FyZCB0byBpbml0aWFsaXplICovCisJCQlpZiAoKGppZmZpZXMgLSB0aW1lb3V0KSA+IDEqSFopIGJyZWFrOworCisJCWlmIChtYi0+cmV0dXJuX2NvZGUgIT0gJ0knKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJIiVzOiBJbml0aWFsaXphdGlvbiBub3QgY29tcGxldGVkIGJ5IGFkYXB0ZXJcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJQbGVhc2UgY29udGFjdCBTYW5nb21hIHJlcHJlc2VudGF0aXZlLlxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCS8qIFJlYWQgZmlybXdhcmUgdmVyc2lvbi4gIE5vdGUgdGhhdCB3aGVuIGFkYXB0ZXIgaW5pdGlhbGl6ZXMsIGl0CisJICogY2xlYXJzIHRoZSBtYWlsYm94LCBzbyBpdCBtYXkgYXBwZWFyIHRoYXQgdGhlIGZpcnN0IGNvbW1hbmQgd2FzCisJICogZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IHdoZW4gaW4gZmFjdCBpdCB3YXMgbWVyZWx5IGVyYXNlZC4gVG8gd29yaworCSAqIGFyb3VuZCB0aGlzLCB3ZSBleGVjdXRlIHRoZSBmaXJzdCBjb21tYW5kIHR3aWNlLgorCSAqLworCisJaWYgKGNoZGxjX3JlYWRfdmVyc2lvbihjYXJkLCB1LnN0cikpCisJCXJldHVybiAtRUlPOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJ1bm5pbmcgRlQxIENvbmZpZ3VyYXRpb24gZmlybXdhcmUgdiVzXG4iLAorCQljYXJkLT5kZXZuYW1lLCB1LnN0cik7IAorCisJY2FyZC0+aXNyCQkJPSBOVUxMOworCWNhcmQtPnBvbGwJCQk9IE5VTEw7CisJY2FyZC0+ZXhlYwkJCT0gJndwZnQxX2V4ZWM7CisJY2FyZC0+d2FuZGV2LnVwZGF0ZQkJPSBOVUxMOworIAljYXJkLT53YW5kZXYubmV3X2lmCQk9IE5VTEw7CisJY2FyZC0+d2FuZGV2LmRlbF9pZgkJPSBOVUxMOworCWNhcmQtPndhbmRldi5zdGF0ZQkJPSBXQU5fRFVBTFBPUlQ7CisJY2FyZC0+d2FuZGV2LnVkcF9wb3J0ICAgCT0gY29uZi0+dWRwX3BvcnQ7CisKKwljYXJkLT53YW5kZXYubmV3X2lmX2NudCA9IDA7CisKKwkvKiBUaGlzIGlzIGZvciB0aGUgcG9ydHMgbGluayBzdGF0ZSAqLworCWNhcmQtPnUuYy5zdGF0ZSA9IFdBTl9ESVNDT05ORUNURUQ7CisJCisJLyogcmVzZXQgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgJ3VwZGF0ZSgpJyBwcm9jIGhhcyBiZWVuIGNhbGxlZCAqLworCWNhcmQtPnUuYy51cGRhdGVfY2FsbF9jb3VudCA9IDA7CisJCisJY2FyZC0+d2FuZGV2LnR0bCA9IDB4N0Y7CisJY2FyZC0+d2FuZGV2LmludGVyZmFjZSA9IDA7IAorCisJY2FyZC0+d2FuZGV2LmNsb2NraW5nID0gMDsKKworCXBvcnRfbnVtID0gY2FyZC0+dS5jLmNvbW1fcG9ydDsKKworCS8qIFNldHVwIFBvcnQgQnBzICovCisKKyAgICAgICAJY2FyZC0+d2FuZGV2LmJwcyA9IDA7CisKKwljYXJkLT53YW5kZXYubXR1ID0gTUlOX0xHVEhfQ0hETENfREFUQV9DRkc7CisKKwkvKiBTZXQgdXAgdGhlIGludGVycnVwdCBzdGF0dXMgYXJlYSAqLworCS8qIFJlYWQgdGhlIENIRExDIENvbmZpZ3VyYXRpb24gYW5kIG9idGFpbjogCisJICoJUHRyIHRvIHNoYXJlZCBtZW1vcnkgaW5mb3Igc3RydWN0CisgICAgICAgICAqIFVzZSB0aGlzIHBvaW50ZXIgdG8gY2FsY3VsYXRlIHRoZSB2YWx1ZSBvZiBjYXJkLT51LmMuZmxhZ3MgIQorIAkgKi8KKwltYjEtPmJ1ZmZlcl9sZW5ndGggPSAwOworCW1iMS0+Y29tbWFuZCA9IFJFQURfQ0hETENfQ09ORklHVVJBVElPTjsKKwllcnIgPSBzZGxhX2V4ZWMobWIxKSA/IG1iMS0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwlpZihlcnIgIT0gQ09NTUFORF9PSykgeworCQljaGRsY19lcnJvcihjYXJkLCBlcnIsIG1iMSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KXsKKyAgICAgICAgICAgICAgIAljYXJkLT51LmMuZmxhZ3MgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgIAkJKCgoQ0hETENfQ09ORklHVVJBVElPTl9TVFJVQ1QgKiltYjEtPmRhdGEpLT4KKwkJCXB0cl9zaGFyZWRfbWVtX2luZm9fc3RydWN0KSk7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGNhcmQtPnUuYy5mbGFncyA9ICh2b2lkICopKGNhcmQtPmh3LmRwbWJhc2UgKworICAgICAgICAgICAgICAgICAgICAgICAgKCgoQ0hETENfQ09ORklHVVJBVElPTl9TVFJVQ1QgKiltYjEtPmRhdGEpLT4KKwkJCXB0cl9zaGFyZWRfbWVtX2luZm9fc3RydWN0ICUgU0RMQV9XSU5ET1dTSVpFKSk7CisJfQorCisJY2FyZC0+d2FuZGV2LnN0YXRlID0gV0FOX0ZUMV9SRUFEWTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogRlQxIENvbmZpZyBSZWFkeSAhXG4iLGNhcmQtPmRldm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3BmdDFfZXhlYyhzZGxhX3QgKmNhcmQsIHZvaWQgKnVfY21kLCB2b2lkICp1X2RhdGEpCit7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1ib3ggPSBjYXJkLT5tYm94OworCWludCBsZW47CisKKwlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQqKSZtYm94LT5jb21tYW5kLCB1X2NtZCwgc2l6ZW9mKGZ0MV9leGVjX2NtZF90KSkpeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlsZW4gPSBtYm94LT5idWZmZXJfbGVuZ3RoOworCisJaWYgKGxlbikgeworCQlpZiggY29weV9mcm9tX3VzZXIoKHZvaWQqKSZtYm94LT5kYXRhLCB1X2RhdGEsIGxlbikpeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisKKwkvKiBleGVjdXRlIGNvbW1hbmQgKi8KKwlpZiAoIXNkbGFfZXhlYyhtYm94KSl7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIHJldHVybiByZXN1bHQgKi8KKwlpZiggY29weV90b191c2VyKHVfY21kLCAodm9pZCopJm1ib3gtPmNvbW1hbmQsIHNpemVvZihmdDFfZXhlY19jbWRfdCkpKXsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJbGVuID0gbWJveC0+YnVmZmVyX2xlbmd0aDsKKworCWlmIChsZW4gJiYgdV9kYXRhICYmIGNvcHlfdG9fdXNlcih1X2RhdGEsICh2b2lkKikmbWJveC0+ZGF0YSwgbGVuKSl7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBmaXJtd2FyZSBjb2RlIHZlcnNpb24uCisgKglQdXQgY29kZSB2ZXJzaW9uIGFzIEFTQ0lJIHN0cmluZyBpbiBzdHIuIAorICovCitzdGF0aWMgaW50IGNoZGxjX3JlYWRfdmVyc2lvbiAoc2RsYV90KiBjYXJkLCBjaGFyKiBzdHIpCit7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKwlpbnQgbGVuOworCWNoYXIgZXJyOworCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwltYi0+Y29tbWFuZCA9IFJFQURfQ0hETENfQ09ERV9WRVJTSU9OOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKworCWlmKGVyciAhPSBDT01NQU5EX09LKSB7CisJCWNoZGxjX2Vycm9yKGNhcmQsZXJyLG1iKTsKKwl9CisJZWxzZSBpZiAoc3RyKSB7ICAvKiBpcyBub3QgbnVsbCAqLworCQlsZW4gPSBtYi0+YnVmZmVyX2xlbmd0aDsKKwkJbWVtY3B5KHN0ciwgbWItPmRhdGEsIGxlbik7CisJCXN0cltsZW5dID0gJ1wwJzsKKwl9CisJcmV0dXJuIChlcnIpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZpcm13YXJlIGVycm9yIGhhbmRsZXIuCisgKglUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW5ldmVyIGZpcm13YXJlIGNvbW1hbmQgcmV0dXJucyBub24temVybworICoJcmV0dXJuIGNvZGUuCisgKgorICogUmV0dXJuIHplcm8gaWYgcHJldmlvdXMgY29tbWFuZCBoYXMgdG8gYmUgY2FuY2VsbGVkLgorICovCitzdGF0aWMgaW50IGNoZGxjX2Vycm9yIChzZGxhX3QgKmNhcmQsIGludCBlcnIsIENIRExDX01BSUxCT1hfU1RSVUNUICptYikKK3sKKwl1bnNpZ25lZCBjbWQgPSBtYi0+Y29tbWFuZDsKKworCXN3aXRjaCAoZXJyKSB7CisKKwljYXNlIENNRF9USU1FT1VUOgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb21tYW5kIDB4JTAyWCB0aW1lZCBvdXQhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgY21kKTsKKwkJYnJlYWs7CisKKwljYXNlIFM1MTRfQk9USF9QT1JUU19TQU1FX0NMS19NT0RFOgorCQlpZihjbWQgPT0gU0VUX0NIRExDX0NPTkZJR1VSQVRJT04pIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAiJXM6IENvbmZpZ3VyZSBib3RoIHBvcnRzIGZvciB0aGUgc2FtZSBjbG9jayBzb3VyY2VcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbW1hbmQgMHglMDJYIHJldHVybmVkIDB4JTAyWCFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBjbWQsIGVycik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zZGxhX3BwcC5jIGIvZHJpdmVycy9uZXQvd2FuL3NkbGFfcHBwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2MWNiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhX3BwcC5jCkBAIC0wLDAgKzEsMzQyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHNkbGFfcHBwLmMJV0FOUElQRSh0bSkgTXVsdGlwcm90b2NvbCBXQU4gTGluayBEcml2ZXIuIFBQUCBtb2R1bGUuCisqCisqIEF1dGhvcjogCU5lbmFkIENvcmJpYyA8bmNvcmJpY0BzYW5nb21hLmNvbT4KKyoKKyogQ29weXJpZ2h0OgkoYykgMTk5NS0yMDAxIFNhbmdvbWEgVGVjaG5vbG9naWVzIEluYy4KKyoKKyoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogRmViIDI4LCAyMDAxICBOZW5hZCBDb3JiaWMJbyBVcGRhdGVkIGlmX3R4X3RpbWVvdXQoKSByb3V0aW5lIGZvciAKKyogCQkJCSAgMi40Llgga2VybmVscy4KKyogTm92IDI5LCAyMDAwICBOZW5hZCBDb3JiaWMJbyBBZGRlZCB0aGUgMi40Lngga2VybmVsIHN1cHBvcnQ6CisqIAkJCQkgIGdldF9pcF9hZGRyZXNzKCkgZnVuY3Rpb24gaGFzIG1vdmVkCisqIAkJCQkgIGludG8gdGhlIHBwcF9wb2xsKCkgcm91dGluZS4gSXQgY2Fubm90CisqIAkJCQkgIGJlIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdC4KKyogTm92IDA3LCAyMDAwICBOZW5hZCBDb3JiaWMJbyBBZGRlZCBzZWN1cml0eSBmZWF0dXJlcyBmb3IgVURQIGRlYnVnZ2luZzoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW55IGFsbCBhbmQgc3BlY2lmeSBhbGxvd2VkIHJlcXVlc3RzLgorKiBNYXkgMDIsIDIwMDAgIE5lbmFkIENvcmJpYwlvIEFkZGVkIHRoZSBkeW5hbWljIGludGVyZmFjZSBzaHV0ZG93bgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbi4gV2hlbiB0aGUgbGluayBnb2VzIGRvd24sIHRoZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmsgaW50ZXJmYWNlIElGRl9VUCBmbGFnIGlzIHJlc2V0LgorKiBNYXIgMDYsIDIwMDAgIE5lbmFkIENvcmJpYwlvIEJ1ZyBGaXg6IGNvcnJ1cHRlZCBtYm94IHJlY292ZXJ5LgorKiBGZWIgMjUsIDIwMDAgIE5lbmFkIENvcmJpYyAgICBvIEZpeGVkIHRoZSBGVDEgVURQIGRlYnVnZ2VyIHByb2JsZW0uCisqIEZlYiAwOSwgMjAwMCAgTmVuYWQgQ29yaWJjICAgIG8gU2h1dGRvd24gYnVnIGZpeC4gdXBkYXRlKCkgd2FzIGNhbGxlZAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggTlVMTCBkZXYgcG9pbnRlcjogbm8gY2hlY2suCisqIEphbiAyNCwgMjAwMCAgTmVuYWQgQ29yYmljICAgIG8gRGlzYWJsZWQgdXNlIG9mIENNRCBjb21wbGV0ZSBpbnRlci4KKyogRGV2IDE1LCAxOTk5ICBOZW5hZCBDb3JiaWMgICAgbyBGaXhlZCB1cCBoZWFkZXIgZmlsZXMgZm9yIDIuMC5YIGtlcm5lbHMKKyogT2N0IDI1LCAxOTk5ICBOZW5hZCBDb3JiaWMgICAgbyBTdXBwb3J0IGZvciAyLjAuWCBrZXJuZWxzCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW92ZWQgZHluYW1pYyByb3V0ZSBwcm9jZXNzaW5nIGludG8gCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2xsaW5nIHJvdXRpbmUuCisqIE9jdCAwNywgMTk5OSAgTmVuYWQgQ29yYmljICAgIG8gU3VwcG9ydCBmb3IgUzUxNCBQQ0kgY2FyZC4gIAorKiAgICAgICAgICAgICAgIEdpZGVvbiBIYWNrICAgICBvIFVQRCBhbmQgVXBkYXRlcyBleGVjdXRlZCB1c2luZyB0aW1lciBpbnRlcnJ1cHQKKyogU2VwIDEwLCAxOTk5ICBOZW5hZCBDb3JiaWMgICAgbyBGaXhlZCB1cCB0aGUgL3Byb2Mgc3RhdGlzdGljcworKiBKdWwgMjAsIDE5OTkgIE5lbmFkIENvcmJpYyAgICBvIFJlbW92ZSB0aGUgcG9sbGluZyByb3V0aW5lcyBhbmQgdXNlIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdHMgaW5zdGVhZC4KKyogU2VwIDE3LCAxOTk4CUphc3ByZWV0IFNpbmdoCW8gVXBkYXRlcyBmb3IgMi4yLlggS2VybmVscy4KKyogQXVnIDEzLCAxOTk4CUphc3ByZWV0IFNpbmdoCW8gSW1wcm92ZWQgTGluZSBUcmFjaW5nLgorKiBKdW4gMjIsIDE5OTgJRGF2aWQgRm9uZwlvIEFkZGVkIHJlbW90ZSBJUCBhZGRyZXNzIGFzc2lnbm1lbnQKKyogTWFyIDE1LCAxOTk4CUFsYW4gQ294CW8gMi4xLjh4IGJhc2ljIHBvcnQuCisqIEFwciAxNiwgMTk5OAlKYXNwcmVldCBTaW5naAlvIHVzaW5nIGh0b25zKCkgZm9yIHRoZSBJUFggcHJvdG9jb2wuCisqIERlYyAwOSwgMTk5NwlKYXNwcmVldCBTaW5naAlvIEFkZGVkIFBBUCBhbmQgQ0hBUC4KKyoJCQkJbyBJbXBsZW1lbnRlZCBuZXcgcm91dGluZXMgbGlrZSAKKyoJCQkJICBwcHBfc2V0X2luYm5kX2F1dGgoKSwgcHBwX3NldF9vdXRibmRfYXV0aCgpLAorKgkJCQkgIHRva2VuaXplKCkgYW5kIHN0cnN0cmlwKCkuCisqIE5vdiAyNywgMTk5NwlKYXNwcmVldCBTaW5naAlvIEFkZGVkIHByb3RlY3Rpb24gYWdhaW5zdCBlbmFibGluZyBvZiBpcnFzIAorKgkJCQkgIHdoaWxlIHRoZXkgaGF2ZSBiZWVuIGRpc2FibGVkLgorKiBOb3YgMjQsIDE5OTcgIEphc3ByZWV0IFNpbmdoICBvIEZpeGVkIGFub3RoZXIgUkFDRSBjb25kaXRpb24gY2F1c2VkIGJ5CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsaW5nIGFuZCBlbmFibGluZyBvZiBpcnFzLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvIEFkZGVkIG5ldyBjb3VudGVycyBmb3Igc3RhdHMgb24gZGlzYWJsZS9lbmFibGUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUlFzLgorKiBOb3YgMTAsIDE5OTcJSmFzcHJlZXQgU2luZ2gJbyBJbml0aWFsaXplZCAnc2tiLT5tYWMucmF3JyB0byAnc2tiLT5kYXRhJworKgkJCQkgIGJlZm9yZSBldmVyeSBuZXRpZl9yeCgpLgorKgkJCQlvIEZyZWUgdXAgdGhlIGRldmljZSBzdHJ1Y3R1cmUgaW4gZGVsX2lmKCkuCisqIE5vdiAwNywgMTk5NwlKYXNwcmVldCBTaW5naAlvIENoYW5nZWQgdGhlIGRlbGF5IHRvIHplcm8gZm9yIExpbmUgdHJhY2luZworKgkJCQkgIGNvbW1hbmQuCisqIE9jdCAyMCwgMTk5NyAJSmFzcHJlZXQgU2luZ2gJbyBBZGRlZCBob29rcyBpbiBmb3IgUm91dGVyIFVQIHRpbWUuCisqIE9jdCAxNiwgMTk5NwlKYXNwcmVldCBTaW5naCAgbyBUaGUgY3JpdGljYWwgZmxhZyBpcyB1c2VkIHRvIG1haW50YWluIGZsb3cKKyoJCQkJICBjb250cm9sIGJ5IGF2b2lkaW5nIFJBQ0UgY29uZGl0aW9ucy4gIFRoZSAKKyoJCQkJICBjbGkoKSBhbmQgcmVzdG9yZV9mbGFncygpIGFyZSB0YWtlbiBvdXQuCisqCQkJCSAgQSBuZXcgc3RydWN0dXJlLCAicHBwX3ByaXZhdGVfYXJlYSIsIGlzIGFkZGVkIAorKgkJCQkgIHRvIHByb3ZpZGUgRHJpdmVyIFN0YXRpc3RpY3MuICAgCisqIEp1bCAyMSwgMTk5NyAJSmFzcHJlZXQgU2luZ2gJbyBQcm90ZWN0ZWQgY2FsbHMgdG8gc2RsYV9wZWVrKCkgYnkgYWRkaW5nIAorKgkJCQkgIHNhdmVfZmxhZ3MoKSwgY2xpKCkgYW5kIHJlc3RvcmVfZmxhZ3MoKS4KKyogSnVsIDA3LCAxOTk3CUphc3ByZWV0IFNpbmdoICBvIEFkZGVkIGNvbmZpZ3VyYWJsZSBUVEwgZm9yIFVEUCBwYWNrZXRzCisqCQkJCW8gQWRkZWQgYWJpbGl0eSB0byBkaXNjYXJkIG11bGl0Y2FzdCBhbmQKKyoJCQkJICBicm9hY2FzdCBzb3VyY2UgYWRkcmVzc2VkIHBhY2tldHMuCisqIEp1biAyNywgMTk5NyAJSmFzcHJlZXQgU2luZ2gJbyBBZGRlZCBGVDEgbW9uaXRvciBjYXBhYmlsaXRpZXMKKyoJCQkJICBOZXcgY2FzZSAoMHgyNSkgc3RhdGVtZW50IGluIGlmX3NlbmQgcm91dGluZS4KKyoJCQkJICBBZGRlZCBhIGdsb2JhbCB2YXJpYWJsZSByQ291bnQgdG8ga2VlcCB0cmFjaworKgkJCQkgIG9mIEZUMSBzdGF0dXMgZW5hYmxlZCBvbiB0aGUgYm9hcmQuCisqIE1heSAyMiwgMTk5NwlKYXNwcmVldCBTaW5naAlvIEFkZGVkIGNoYW5nZSBpbiB0aGUgUFBQX1NFVF9DT05GSUcgY29tbWFuZCBmb3IKKyoJCQkJNTA4IGNhcmQgdG8gcmVmbGVjdCBjaGFuZ2VzIGluIHRoZSBuZXcgCisqCQkJCXBwcDUwOC5zZm0gZm9yIHN1cHBvcnRpbmc6Y29udGlub3VzIHRyYW5zbWlzc2lvbgorKgkJCQlvZiBDb25maWd1cmUtUmVxdWVzdCBwYWNrZXRzIHdpdGhvdXQgcmVjZWl2aW5nIGEKKyoJCQkJcmVwbHkgCQkJCQorKgkJCQlPUi1lZCAweDMwMCB0byBjb25mX2ZsYWdzIAorKgkJCSAgICAgICAgbyBDaGFuZ2VkIGNvbm5lY3RfdG1vdXQgZnJvbSA5MDAgdG8gMAorKiBNYXkgMjEsIDE5OTcJSmFzcHJlZXQgU2luZ2ggIG8gRml4ZWQgVURQIE1hbmFnZW1lbnQgZm9yIG11bHRpcGxlIGJvYXJkcworKiBBcHIgMjUsIDE5OTcgIEZhcmhhbiBUaGF3YXIgICAgbyBhZGRlZCBVRFAgTWFuYWdlbWVudCBzdHVmZgorKiBNYXIgMTEsIDE5OTcgIEZhcmhhbiBUaGF3YXIgICBWZXJzaW9uIDMuMS4xCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvIGZpeGVkICgrMSkgYnVnIGluIHJ4X2ludHIoKQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBjaGFuZ2VkIGlmX3NlbmQoKSB0byByZXR1cm4gMCBpZgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW5kZXYuY3JpdGljYWwoKSBpcyB0cnVlCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvIGZyZWUgc29ja2V0IGJ1ZmZlciBpbiBpZl9zZW5kKCkgaWYKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuaW5nIDAgCisqIEphbiAxNSwgMTk5NwlHZW5lIEtvemluCVZlcnNpb24gMy4xLjAKKyoJCQkJIG8gaW1wbGVtZW50ZWQgZXhlYygpIGVudHJ5IHBvaW50CisqIEphbiAwNiwgMTk5NwlHZW5lIEtvemluCUluaXRpYWwgdmVyc2lvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIHByaW50aygpLCBhbmQgb3RoZXIgdXNlZnVsIHN0dWZmICovCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CS8qIG9mZnNldG9mKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgkvKiByZXR1cm4gY29kZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4JLyogaW5saW5lIG1lbXNldCgpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgkvKiBrbWFsbG9jKCksIGtmcmVlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC93YW5yb3V0ZXIuaD4JLyogV0FOIHJvdXRlciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L3dhbnBpcGUuaD4JLyogV0FOUElQRSBjb21tb24gdXNlciBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4JLyogQVJQSFJEXyogZGVmaW5lcyAqLworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4JLyogaHRvbnMoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L2luLmg+CQkvKiBzb2NrYWRkcl9pbiAqLworCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvc2RsYV9wcHAuaD4JCS8qIFBQUCBmaXJtd2FyZSBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9zZGxhc2ZtLmg+CQkvKiBTNTE0IFR5cGUgRGVmaW5pdGlvbiAqLworLyoqKioqKiBEZWZpbmVzICYgTWFjcm9zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUJUFBQX0RGTFRfTVRVCTE1MDAJCS8qIGRlZmF1bHQgTVRVICovCisjZGVmaW5lCVBQUF9NQVhfTVRVCTQwMDAJCS8qIG1heGltdW0gTVRVICovCisjZGVmaW5lIFBQUF9IRFJfTEVOCTEKKworI2RlZmluZSBNQVhfSVBfRVJST1JTIDEwMCAKKworI2RlZmluZQlDT05ORUNUX1RJTUVPVVQJKDkwKkhaKQkJLyogbGluayBjb25uZWN0aW9uIHRpbWVvdXQgKi8KKyNkZWZpbmUJSE9MRF9ET1dOX1RJTUUJKDUqSFopCQkvKiBsaW5rIGhvbGQgZG93biB0aW1lIDogQ2hhbmdlZCBmcm9tIDMwIHRvIDUgKi8KKworLyogRm9yIGhhbmRsZV9JUFhXQU4oKSAqLworI2RlZmluZSBDVkhleFRvQXNjaWkoYikgKCgodW5zaWduZWQgY2hhcikoYikgPiAodW5zaWduZWQgY2hhcik5KSA/ICgodW5zaWduZWQgY2hhciknQScgKyAoKHVuc2lnbmVkIGNoYXIpKGIpIC0gKHVuc2lnbmVkIGNoYXIpMTApKSA6ICgodW5zaWduZWQgY2hhciknMCcgKyAodW5zaWduZWQgY2hhcikoYikpKQorCisvKiBNYWNybyBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIGRlYnVnZ2luZyBjb21tZW50cyAqLworLy8jZGVmaW5lIE5FWF9ERUJVRworI2lmZGVmIE5FWF9ERUJVRworI2RlZmluZSBORVhfUFJJTlRLKGZvcm1hdCwgYS4uLikgcHJpbnRrKGZvcm1hdCwgIyMgYSkKKyNlbHNlCisjZGVmaW5lIE5FWF9QUklOVEsoZm9ybWF0LCBhLi4uKQorI2VuZGlmIC8qIE5FWF9ERUJVRyAqLyAKKworI2RlZmluZSBEQ0QoYSkgICAoIGEgJiAweDA4ID8gIkhJR0giIDogIkxPVyIgKQorI2RlZmluZSBDVFMoYSkgICAoIGEgJiAweDIwID8gIkhJR0giIDogIkxPVyIgKQorI2RlZmluZSBMQ1AoYSkgICAoIGEgPT0gMHgwOSA/ICJPUEVOIiA6ICJDTE9TRUQiICkKKyNkZWZpbmUgSVAoYSkgICAgKCBhID09IDB4MDkgPyAiRU5BQkxFRCIgOiAiRElTQUJMRUQiICkKKworI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfVVBEQVRFICAJMHgwMQorI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfUFBQX0VWRU5UCTB4MDIKKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX1VEUAkJMHgwNAorI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfQ09ORklHCQkweDIwCisKKy8qIFNldCBDb25maWd1cmF0b24gQ29tbWFuZCBEZWZpbml0aW9ucyAqLworI2RlZmluZSBQRVJDRU5UX1RYX0JVRkYJCQk2MAorI2RlZmluZSBUSU1FX0JFVFdFRU5fQ09ORl9SRVEgIAkJMzAKKyNkZWZpbmUgVElNRV9CRVRXRUVOX1BBUF9DSEFQX1JFUQkzMAorI2RlZmluZSBXQUlUX1BBUF9DSEFQX1dJVEhPVVRfUkVQTFkgICAgIDMwMAorI2RlZmluZSBXQUlUX0FGVEVSX0RDRF9DVFNfTE9XICAgICAgICAgIDUKKyNkZWZpbmUgVElNRV9EQ0RfQ1RTX0xPV19BRlRFUl9MTktfRE9XTiAxMAorI2RlZmluZSBXQUlUX0RDRF9ISUdIX0FGVEVSX0VOQUJMRV9DT01NIDkwMAorI2RlZmluZSBNQVhfQ09ORl9SRVFfV0lUSE9VVF9SRVBMWSAgICAgIDEwCisjZGVmaW5lIE1BWF9URVJNX1JFUV9XSVRIT1VUX1JFUExZICAgICAgMgorI2RlZmluZSBOVU1fQ09ORl9OQUtfV0lUSE9VVF9SRVBMWSAgICAgIDUKKyNkZWZpbmUgTlVNX0FVVEhfUkVRX1dJVEhPVVRfUkVQTFkgICAgICAxMAorCisjZGVmaW5lIEVORF9PRkZTRVQgMHgxRjAKKworCisvKioqKioqRGF0YSBTdHJ1Y3R1cmVzKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIHBsYWNlZCBpbiB0aGUgcHJpdmF0ZSBkYXRhIGFyZWEgb2YgdGhlIGRldmljZSBzdHJ1Y3R1cmUuCisgKiBUaGUgY2FyZCBzdHJ1Y3R1cmUgdXNlZCB0byBvY2N1cHkgdGhlIHByaXZhdGUgYXJlYSBidXQgbm93IHRoZSBmb2xsb3dpbmcgCisgKiBzdHJ1Y3R1cmUgd2lsbCBpbmNvcnBvcmF0ZSB0aGUgY2FyZCBzdHJ1Y3R1cmUgYWxvbmcgd2l0aCBQUFAgc3BlY2lmaWMgZGF0YQorICovCisgIAordHlwZWRlZiBzdHJ1Y3QgcHBwX3ByaXZhdGVfYXJlYQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZTsKKwlzZGxhX3QqIGNhcmQ7CQorCXVuc2lnbmVkIGxvbmcgcm91dGVyX3N0YXJ0X3RpbWU7CS8qcm91dGVyIHN0YXJ0IHRpbWUgaW4gc2VjICovCisJdW5zaWduZWQgbG9uZyB0aWNrX2NvdW50ZXI7CQkvKnVzZWQgZm9yIDUgc2Vjb25kIGNvdW50ZXIqLworCXVuc2lnbmVkIG1jOwkJCQkvKm11bHRpY2FzdCBzdXBwb3J0IG9uIG9yIG9mZiovCisJdW5zaWduZWQgY2hhciBlbmFibGVfSVBYOworCXVuc2lnbmVkIGxvbmcgbmV0d29ya19udW1iZXI7CisJdW5zaWduZWQgY2hhciBwYXA7CisJdW5zaWduZWQgY2hhciBjaGFwOworCXVuc2lnbmVkIGNoYXIgc3lzbmFtZVszMV07CQkvKiBzeXN0ZW0gbmFtZSBmb3IgaW4tYm5kIGF1dGgqLworCXVuc2lnbmVkIGNoYXIgdXNlcmlkWzUxMV07CQkvKiBsaXN0IG9mIHVzZXIgaWRzICovCisJdW5zaWduZWQgY2hhciBwYXNzd2RbNTExXTsJCS8qIGxpc3Qgb2YgcGFzc3dvcmRzICovCisJdW5zaWduZWQgcHJvdG9jb2w7CQkJLyogU0tCIFByb3RvY29sICovCisJdTMyIGlwX2xvY2FsOwkJCQkvKiBMb2NhbCBJUCBBZGRyZXNzICovCisJdTMyIGlwX3JlbW90ZTsJCQkJLyogcmVtb3RlIElQIEFkZHJlc3MgKi8KKworCXUzMiBpcF9sb2NhbF90bXA7CisJdTMyIGlwX3JlbW90ZV90bXA7CisJCisJdW5zaWduZWQgY2hhciB0aW1lcl9pbnRfZW5hYmxlZDsJLyogV2hvIGVuYWJsZWQgdGhlIHRpbWVyIGludGVyKi8KKwl1bnNpZ25lZCBjaGFyIHVwZGF0ZV9jb21tc19zdGF0czsJLyogVXNlZCBieSB1cGRhdGUgZnVuY3Rpb24gKi8KKwl1bnNpZ25lZCBsb25nIGN1cnJfdHJhY2VfYWRkcjsJCS8qIFRyYWNlIGluZm9ybWF0aW9uICovCisJdW5zaWduZWQgbG9uZyBzdGFydF90cmFjZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgZW5kX3RyYWNlX2FkZHI7CisKKwl1bnNpZ25lZCBjaGFyIGludGVyZmFjZV9kb3duOwkJLyogQnJpbmQgZG93biBpbnRlcmZhY2Ugd2hlbiBjaGFubmVsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29lcyBkb3duICovCisJdW5zaWduZWQgbG9uZyBjb25maWdfd2FpdF90aW1lb3V0OwkvKiBBZnRlciBpZl9vcGVuKCkgaWYgaW4gZHluYW1pYyBpZiBtb2RlLAorCQkJCQkJICAgd2FpdCBhIGZldyBzZWNvbmRzIGJlZm9yZSBjb25maWd1cmluZyAqLworCQorCXVuc2lnbmVkIHNob3J0IHVkcF9wa3RfbGd0aDsKKwljaGFyICB1ZHBfcGt0X3NyYzsKKyAgICAgIAljaGFyICB1ZHBfcGt0X2RhdGFbTUFYX0xHVEhfVURQX01HTlRfUEtUXTsKKworCS8qIFBQUCBzcGVjaWZpYyBzdGF0aXN0aWNzICovCisKKwlpZl9zZW5kX3N0YXRfdCBpZl9zZW5kX3N0YXQ7CisJcnhfaW50cl9zdGF0X3QgcnhfaW50cl9zdGF0OworCXBpcGVfbWdtdF9zdGF0X3QgcGlwZV9tZ210X3N0YXQ7CisKKwl1bnNpZ25lZCBsb25nIHJvdXRlcl91cF90aW1lOyAKKworCS8qIFBvbGxpbmcgd29yayBxdWV1ZSBlbnRyeS4gRWFjaCBpbnRlcmZhY2UKKyAgICAgICAgICogaGFzIGl0cyBvd24gd29yayBxdWV1ZSBlbnRyeSwgd2hpY2ggaXMgdXNlZAorICAgICAgICAgKiB0byBkZWZlciBldmVudHMgZnJvbSB0aGUgaW50ZXJydXB0ICovCisJc3RydWN0IHdvcmtfc3RydWN0IHBvbGxfd29yazsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBwb2xsX2RlbGF5X3RpbWVyOworCisJdTggZ2F0ZXdheTsKKwl1OCBjb25maWdfcHBwOworCXU4IGlwX2Vycm9yOworCQorfXBwcF9wcml2YXRlX2FyZWFfdDsKKworLyogdmFyaWFibGUgZm9yIGtlZXBpbmcgdHJhY2sgb2YgZW5hYmxpbmcvZGlzYWJsaW5nIEZUMSBtb25pdG9yIHN0YXR1cyAqLworc3RhdGljIGludCByQ291bnQgPSAwOworCitleHRlcm4gdm9pZCBkaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQpOworCisvKioqKioqIEZ1bmN0aW9uIFByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogV0FOIGxpbmsgZHJpdmVyIGVudHJ5IHBvaW50cy4gVGhlc2UgYXJlIGNhbGxlZCBieSB0aGUgV0FOIHJvdXRlciBtb2R1bGUuICovCitzdGF0aWMgaW50IHVwZGF0ZShzdHJ1Y3Qgd2FuX2RldmljZSAqd2FuZGV2KTsKK3N0YXRpYyBpbnQgbmV3X2lmKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgd2FuaWZfY29uZl90ICpjb25mKTsKK3N0YXRpYyBpbnQgZGVsX2lmKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBXQU5QSVBFLXNwZWNpZmljIGVudHJ5IHBvaW50cyAqLworc3RhdGljIGludCB3cHBfZXhlYyAoc3RydWN0IHNkbGEgKmNhcmQsIHZvaWQgKnVfY21kLCB2b2lkICp1X2RhdGEpOworCisvKiBOZXR3b3JrIGRldmljZSBpbnRlcmZhY2UgKi8KK3N0YXRpYyBpbnQgaWZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaWZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaWZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGlmX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIAorCQkgICAgIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwgdW5zaWduZWQgbGVuKTsKKworc3RhdGljIHZvaWQgaWZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljIGludCBpZl9yZWJ1aWxkX2hkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaWZfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGlmX3NlbmQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworLyogUFBQIGZpcm13YXJlIGludGVyZmFjZSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgcHBwX3JlYWRfdmVyc2lvbihzZGxhX3QgKmNhcmQsIGNoYXIgKnN0cik7CitzdGF0aWMgaW50IHBwcF9zZXRfb3V0Ym5kX2F1dGgoc2RsYV90ICpjYXJkLCBwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWEpOworc3RhdGljIGludCBwcHBfc2V0X2luYm5kX2F1dGgoc2RsYV90ICpjYXJkLCBwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWEpOworc3RhdGljIGludCBwcHBfY29uZmlndXJlKHNkbGFfdCAqY2FyZCwgdm9pZCAqZGF0YSk7CitzdGF0aWMgaW50IHBwcF9zZXRfaW50cl9tb2RlKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgY2hhciBtb2RlKTsKK3N0YXRpYyBpbnQgcHBwX2NvbW1fZW5hYmxlKHNkbGFfdCAqY2FyZCk7CitzdGF0aWMgaW50IHBwcF9jb21tX2Rpc2FibGUoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyBpbnQgcHBwX2NvbW1fZGlzYWJsZV9zaHV0ZG93bihzZGxhX3QgKmNhcmQpOworc3RhdGljIGludCBwcHBfZ2V0X2Vycl9zdGF0cyhzZGxhX3QgKmNhcmQpOworc3RhdGljIGludCBwcHBfc2VuZChzZGxhX3QgKmNhcmQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgcHJvdG8pOworc3RhdGljIGludCBwcHBfZXJyb3Ioc2RsYV90ICpjYXJkLCBpbnQgZXJyLCBwcHBfbWJveF90ICptYik7CisKK3N0YXRpYyB2b2lkIHdwcF9pc3Ioc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIHJ4X2ludHIoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIGV2ZW50X2ludHIoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIHRpbWVyX2ludHIoc2RsYV90ICpjYXJkKTsKKworLyogQmFja2dyb3VuZCBwb2xsaW5nIHJvdXRpbmVzICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX3JvdXRlKHNkbGFfdCAqY2FyZCk7CitzdGF0aWMgdm9pZCByZXRyaWdnZXJfY29tbShzZGxhX3QgKmNhcmQpOworCisvKiBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCByZWFkX2luZm8oIHNkbGFfdCAqY2FyZCApOworc3RhdGljIGludCByZWFkX2Nvbm5lY3Rpb25faW5mbyAoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIHJlbW92ZV9yb3V0ZSggc2RsYV90ICpjYXJkICk7CitzdGF0aWMgaW50IGNvbmZpZzUwOChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzZGxhX3QgKmNhcmQpOworc3RhdGljIHZvaWQgc2hvd19kaXNjX2NhdXNlKHNkbGFfdCAqIGNhcmQsIHVuc2lnbmVkIGNhdXNlKTsKK3N0YXRpYyBpbnQgcmVwbHlfdWRwKCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgbWJveF9sZW4gKTsKK3N0YXRpYyB2b2lkIHByb2Nlc3NfdWRwX21nbXRfcGt0KHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCisJCQkJcHBwX3ByaXZhdGVfYXJlYV90ICpwcHBfcHJpdl9hcmVhKTsKK3N0YXRpYyB2b2lkIGluaXRfcHBwX3R4X3J4X2J1ZmYoIHNkbGFfdCAqY2FyZCApOworc3RhdGljIGludCBpbnRyX3Rlc3QoIHNkbGFfdCAqY2FyZCApOworc3RhdGljIGludCB1ZHBfcGt0X3R5cGUoIHN0cnVjdCBza19idWZmICpza2IgLCBzZGxhX3QgKmNhcmQpOworc3RhdGljIHZvaWQgaW5pdF9wcHBfcHJpdl9zdHJ1Y3QoIHBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSk7CitzdGF0aWMgdm9pZCBpbml0X2dsb2JhbF9zdGF0aXN0aWNzKCBzZGxhX3QgKmNhcmQgKTsKK3N0YXRpYyBpbnQgdG9rZW5pemUoY2hhciAqc3RyLCBjaGFyICoqdG9rZW5zKTsKK3N0YXRpYyBjaGFyKiBzdHJzdHJpcChjaGFyICpzdHIsIGNoYXIgKnMpOworc3RhdGljIGludCBjaGtfYmNhc3RfbWNhc3RfYWRkcihzZGxhX3QqIGNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKK3N0YXRpYyBpbnQgY29uZmlnX3BwcCAoc2RsYV90ICopOworc3RhdGljIHZvaWQgcHBwX3BvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB0cmlnZ2VyX3BwcF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcHBwX3BvbGxfZGVsYXkgKHVuc2lnbmVkIGxvbmcgZGV2X3B0cik7CisKKworc3RhdGljIGludCBSZWFkX2Nvbm5lY3Rpb25faW5mbzsKK3N0YXRpYyBpbnQgSW50cl90ZXN0X2NvdW50ZXI7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgYXZhaWxhYmxlX2J1ZmZlcl9zcGFjZTsKKworCisvKiBJUFggZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBzd2l0Y2hfbmV0X251bWJlcnModW5zaWduZWQgY2hhciAqc2VuZHBhY2tldCwgdW5zaWduZWQgbG9uZyBuZXR3b3JrX251bWJlciwgCisJCQkgICAgICAgdW5zaWduZWQgY2hhciBpbmNvbWluZyk7CitzdGF0aWMgaW50IGhhbmRsZV9JUFhXQU4odW5zaWduZWQgY2hhciAqc2VuZHBhY2tldCwgY2hhciAqZGV2bmFtZSwgdW5zaWduZWQgY2hhciBlbmFibGVfUFgsIAorCQkJIHVuc2lnbmVkIGxvbmcgbmV0d29ya19udW1iZXIsIHVuc2lnbmVkIHNob3J0IHByb3RvKTsKKworLyogTG9jayBGdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIHM1MDhfbG9jayAoc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpOworc3RhdGljIHZvaWQgczUwOF91bmxvY2sgKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKTsKKworc3RhdGljIGludCBzdG9yZV91ZHBfbWdtdF9wa3QoY2hhciB1ZHBfcGt0X3NyYywgc2RsYV90KiBjYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcHBfcHJpdmF0ZV9hcmVhX3QqIHBwcF9wcml2X2FyZWEgKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBjYWxjX2NoZWNrc3VtIChjaGFyICpkYXRhLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIGRpc2FibGVfY29tbSAoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyBpbnQgZGV0ZWN0X2FuZF9maXhfdHhfYnVnIChzZGxhX3QgKmNhcmQpOworCisvKioqKioqIFB1YmxpYyBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQUFAgcHJvdG9jb2wgaW5pdGlhbGl6YXRpb24gcm91dGluZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBtYWluIFdBTlBJUEUgbW9kdWxlIGR1cmluZyBzZXR1cC4gIEF0IHRoaXMKKyAqIHBvaW50IGFkYXB0ZXIgaXMgY29tcGxldGVseSBpbml0aWFsaXplZCBhbmQgZmlybXdhcmUgaXMgcnVubmluZy4KKyAqICBvIHJlYWQgZmlybXdhcmUgdmVyc2lvbiAodG8gbWFrZSBzdXJlIGl0J3MgYWxpdmUpCisgKiAgbyBjb25maWd1cmUgYWRhcHRlcgorICogIG8gaW5pdGlhbGl6ZSBwcm90b2NvbC1zcGVjaWZpYyBmaWVsZHMgb2YgdGhlIGFkYXB0ZXIgZGF0YSBzcGFjZS4KKyAqCisgKiBSZXR1cm46CTAJby5rLgorICoJCTwgMAlmYWlsdXJlLgorICovCitpbnQgd3BwX2luaXQoc2RsYV90ICpjYXJkLCB3YW5kZXZfY29uZl90ICpjb25mKQoreworCXBwcF9mbGFnc190ICpmbGFnczsKKwl1bmlvbgorCXsKKwkJY2hhciBzdHJbODBdOworCX0gdTsKKworCS8qIFZlcmlmeSBjb25maWd1cmF0aW9uIElEICovCisJaWYgKGNvbmYtPmNvbmZpZ19pZCAhPSBXQU5DT05GSUdfUFBQKSB7CisJCQorCQlwcmludGsoS0VSTl9JTkZPICIlczogaW52YWxpZCBjb25maWd1cmF0aW9uIElEICV1IVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIGNvbmYtPmNvbmZpZ19pZCk7CisJCXJldHVybiAtRUlOVkFMOworCisJfQorCisJLyogSW5pdGlhbGl6ZSBtaXNjZWxsYW5lb3VzIHBvaW50ZXJzIHRvIHN0cnVjdHVyZXMgb24gdGhlIGFkYXB0ZXIgKi8KKwlzd2l0Y2ggKGNhcmQtPmh3LnR5cGUpIHsKKworCQljYXNlIFNETEFfUzUwODoKKwkJCWNhcmQtPm1ib3ggPSh2b2lkKikoY2FyZC0+aHcuZHBtYmFzZSArIFBQUDUwOF9NQl9PRkZTKTsKKwkJCWNhcmQtPmZsYWdzPSh2b2lkKikoY2FyZC0+aHcuZHBtYmFzZSArIFBQUDUwOF9GTEdfT0ZGUyk7CisJCQlicmVhazsKKwkJCisJCWNhc2UgU0RMQV9TNTE0OgorCQkJY2FyZC0+bWJveCA9KHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsgUFBQNTE0X01CX09GRlMpOworCQkJY2FyZC0+ZmxhZ3M9KHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsgUFBQNTE0X0ZMR19PRkZTKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCX0KKwlmbGFncyA9IGNhcmQtPmZsYWdzOworCisJLyogUmVhZCBmaXJtd2FyZSB2ZXJzaW9uLiAgTm90ZSB0aGF0IHdoZW4gYWRhcHRlciBpbml0aWFsaXplcywgaXQKKwkgKiBjbGVhcnMgdGhlIG1haWxib3gsIHNvIGl0IG1heSBhcHBlYXIgdGhhdCB0aGUgZmlyc3QgY29tbWFuZCB3YXMKKwkgKiBleGVjdXRlZCBzdWNjZXNzZnVsbHkgd2hlbiBpbiBmYWN0IGl0IHdhcyBtZXJlbHkgZXJhc2VkLiBUbyB3b3JrCisJICogYXJvdW5kIHRoaXMsIHdlIGV4ZWN1dGUgdGhlIGZpcnN0IGNvbW1hbmQgdHdpY2UuCisJICovCisJaWYgKHBwcF9yZWFkX3ZlcnNpb24oY2FyZCwgTlVMTCkgfHwgcHBwX3JlYWRfdmVyc2lvbihjYXJkLCB1LnN0cikpCisJCXJldHVybiAtRUlPOworCQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBydW5uaW5nIFBQUCBmaXJtd2FyZSB2JXNcbiIsY2FyZC0+ZGV2bmFtZSwgdS5zdHIpOyAKKwkvKiBBZGp1c3QgY29uZmlndXJhdGlvbiBhbmQgc2V0IGRlZmF1bHRzICovCisJY2FyZC0+d2FuZGV2Lm10dSA9IChjb25mLT5tdHUpID8KKwkJbWluX3QodW5zaWduZWQgaW50LCBjb25mLT5tdHUsIFBQUF9NQVhfTVRVKSA6IFBQUF9ERkxUX01UVTsKKworCWNhcmQtPndhbmRldi5icHMJPSBjb25mLT5icHM7CisJY2FyZC0+d2FuZGV2LmludGVyZmFjZQk9IGNvbmYtPmludGVyZmFjZTsKKwljYXJkLT53YW5kZXYuY2xvY2tpbmcJPSBjb25mLT5jbG9ja2luZzsKKwljYXJkLT53YW5kZXYuc3RhdGlvbgk9IGNvbmYtPnN0YXRpb247CisJY2FyZC0+aXNyCQk9ICZ3cHBfaXNyOworCWNhcmQtPnBvbGwJCT0gTlVMTDsgCisJY2FyZC0+ZXhlYwkJPSAmd3BwX2V4ZWM7CisJY2FyZC0+d2FuZGV2LnVwZGF0ZQk9ICZ1cGRhdGU7CisJY2FyZC0+d2FuZGV2Lm5ld19pZgk9ICZuZXdfaWY7CisJY2FyZC0+d2FuZGV2LmRlbF9pZgk9ICZkZWxfaWY7CisgICAgICAgIGNhcmQtPndhbmRldi51ZHBfcG9ydCAgID0gY29uZi0+dWRwX3BvcnQ7CisJY2FyZC0+d2FuZGV2LnR0bAk9IGNvbmYtPnR0bDsKKwljYXJkLT53YW5kZXYuc3RhdGUgICAgICA9IFdBTl9ESVNDT05ORUNURUQ7CisJY2FyZC0+ZGlzYWJsZV9jb21tCT0gJmRpc2FibGVfY29tbTsKKwljYXJkLT5pcnFfZGlzX2lmX3NlbmRfY291bnQgPSAwOworICAgICAgICBjYXJkLT5pcnFfZGlzX3BvbGxfY291bnQgPSAwOworCWNhcmQtPnUucC5hdXRoZW50aWNhdG9yID0gY29uZi0+dS5wcHAuYXV0aGVudGljYXRvcjsKKwljYXJkLT51LnAuaXBfbW9kZSAJPSBjb25mLT51LnBwcC5pcF9tb2RlID8KKwkJCQkgY29uZi0+dS5wcHAuaXBfbW9kZSA6IFdBTk9QVF9QUFBfU1RBVElDOworICAgICAgICBjYXJkLT5UcmFjaW5nRW5hYmxlZCAgICA9IDA7CisJUmVhZF9jb25uZWN0aW9uX2luZm8gICAgPSAxOworCisJLyogaW5pdGlhbGl6ZSBnbG9iYWwgc3RhdGlzdGljcyAqLworCWluaXRfZ2xvYmFsX3N0YXRpc3RpY3MoIGNhcmQgKTsKKworCisKKwlpZiAoIWNhcmQtPmNvbmZpZ3VyZWQpeworCQlpbnQgZXJyOworCisJCUludHJfdGVzdF9jb3VudGVyID0gMDsKKwkJZXJyID0gaW50cl90ZXN0KGNhcmQpOworCisJCWlmKGVyciB8fCAoSW50cl90ZXN0X2NvdW50ZXIgPCBNQVhfSU5UUl9URVNUX0NPVU5URVIpKSB7CisJCQlwcmludGsoIiVzOiBJbnRlcnJ1cHQgVGVzdCBGYWlsZWQsIENvdW50ZXI6ICVpXG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lLCBJbnRyX3Rlc3RfY291bnRlcik7CisJCQlwcmludGsoICIlczogUGxlYXNlIGNob29zZSBhbm90aGVyIGludGVycnVwdFxuIixjYXJkLT5kZXZuYW1lKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCQorCQlwcmludGsoS0VSTl9JTkZPICIlczogSW50ZXJydXB0IFRlc3QgUGFzc2VkLCBDb3VudGVyOiAlaVxuIiwgCisJCQljYXJkLT5kZXZuYW1lLCBJbnRyX3Rlc3RfY291bnRlcik7CisJCWNhcmQtPmNvbmZpZ3VyZWQgPSAxOworCX0KKworCXBwcF9zZXRfaW50cl9tb2RlKGNhcmQsIFBQUF9JTlRSX1RJTUVSKTsgCisKKwkvKiBUdXJuIG9mZiB0aGUgdHJhbnNtaXQgYW5kIHRpbWVyIGludGVycnVwdCAqLworCWZsYWdzLT5pbWFzayAmPSB+UFBQX0lOVFJfVElNRVI7CisKKwlwcmludGsoS0VSTl9JTkZPICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqIFdBTiBEZXZpY2UgRHJpdmVyIEVudHJ5IFBvaW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVwZGF0ZSBkZXZpY2Ugc3RhdHVzICYgc3RhdGlzdGljcy4KKyAqLworc3RhdGljIGludCB1cGRhdGUoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldikKK3sKKwlzZGxhX3QqIGNhcmQgPSB3YW5kZXYtPnByaXZhdGU7CisgCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXY7CisgICAgICAgIHZvbGF0aWxlIHBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYTsKKwlwcHBfZmxhZ3NfdCAqZmxhZ3MgPSBjYXJkLT5mbGFnczsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwkvKiBzYW5pdHkgY2hlY2tzICovCisJaWYgKCh3YW5kZXYgPT0gTlVMTCkgfHwgKHdhbmRldi0+cHJpdmF0ZSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisJaWYgKHdhbmRldi0+c3RhdGUgPT0gV0FOX1VOQ09ORklHVVJFRCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJCisJLyogU2h1dGRvd24gYnVnIGZpeC4gVGhpcyBmdW5jdGlvbiBjYW4gYmUKKyAgICAgICAgICogY2FsbGVkIHdpdGggTlVMTCBkZXYgcG9pbnRlciBkdXJpbmcKKyAgICAgICAgICogc2h1dGRvd24gCisJICovCisJaWYgKChkZXY9Y2FyZC0+d2FuZGV2LmRldikgPT0gTlVMTCl7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICgocHBwX3ByaXZfYXJlYT1kZXYtPnByaXYpID09IE5VTEwpeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJCisJcHBwX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzID0gMjsKKwlwcHBfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCB8PSBUTVJfSU5UX0VOQUJMRURfVVBEQVRFOworCWZsYWdzLT5pbWFzayB8PSBQUFBfSU5UUl9USU1FUjsJCisJCisJLyogd2FpdCBhIG1heGltdW0gb2YgMSBzZWNvbmQgZm9yIHRoZSBzdGF0aXN0aWNzIHRvIGJlIHVwZGF0ZWQgKi8gCisgICAgICAgIHRpbWVvdXQgPSBqaWZmaWVzOworICAgICAgICBmb3IoOzspIHsKKwkJaWYocHBwX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzID09IDApeworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgICAgICAgICBpZiAoKGppZmZpZXMgLSB0aW1lb3V0KSA+ICgxICogSFopKXsKKyAgICAJCQlwcHBfcHJpdl9hcmVhLT51cGRhdGVfY29tbXNfc3RhdHMgPSAwOworIAkJCXBwcF9wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICY9CisJCQkJflRNUl9JTlRfRU5BQkxFRF9VUERBVEU7IAorIAkJCXJldHVybiAtRUFHQUlOOworCQl9CisgICAgICAgIH0KKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENyZWF0ZSBuZXcgbG9naWNhbCBjaGFubmVsLgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgcm91dGVyIHdoZW4gUk9VVEVSX0lGTkVXIElPQ1RMIGlzIGJlaW5nCisgKiBoYW5kbGVkLgorICogbyBwYXJzZSBtZWRpYS0gYW5kIGhhcmR3YXJlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24KKyAqIG8gbWFrZSBzdXJlIHRoYXQgYSBuZXcgY2hhbm5lbCBjYW4gYmUgY3JlYXRlZAorICogbyBhbGxvY2F0ZSByZXNvdXJjZXMsIGlmIG5lY2Vzc2FyeQorICogbyBwcmVwYXJlIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZSBmb3IgcmVnaXN0YXJhdGlvbi4KKyAqCisgKiBSZXR1cm46CTAJby5rLgorICoJCTwgMAlmYWlsdXJlIChjaGFubmVsIHdpbGwgbm90IGJlIGNyZWF0ZWQpCisgKi8KK3N0YXRpYyBpbnQgbmV3X2lmKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgd2FuaWZfY29uZl90ICpjb25mKQoreworCXNkbGFfdCAqY2FyZCA9IHdhbmRldi0+cHJpdmF0ZTsKKwlwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWE7CisKKwlpZiAod2FuZGV2LT5uZGV2KQorCQlyZXR1cm4gLUVFWElTVDsKKwkKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb25maWd1cmluZyBJbnRlcmZhY2U6ICVzXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgY29uZi0+bmFtZSk7CisKKwlpZiAoKGNvbmYtPm5hbWVbMF0gPT0gJ1wwJykgfHwgKHN0cmxlbihjb25mLT5uYW1lKSA+IFdBTl9JRk5BTUVfU1opKSB7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludmFsaWQgaW50ZXJmYWNlIG5hbWUhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCisJfQorCisJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcHJpdmF0ZSBkYXRhICovCisJcHBwX3ByaXZfYXJlYSA9IGttYWxsb2Moc2l6ZW9mKHBwcF9wcml2YXRlX2FyZWFfdCksIEdGUF9LRVJORUwpOworCQorCWlmKCBwcHBfcHJpdl9hcmVhID09IE5VTEwgKQorCQlyZXR1cm4JLUVOT01FTTsKKwkKKwltZW1zZXQocHBwX3ByaXZfYXJlYSwgMCwgc2l6ZW9mKHBwcF9wcml2YXRlX2FyZWFfdCkpOworCQorCXBwcF9wcml2X2FyZWEtPmNhcmQgPSBjYXJkOyAKKwkKKwkvKiBpbml0aWFsaXplIGRhdGEgKi8KKwlzdHJjcHkoY2FyZC0+dS5wLmlmX25hbWUsIGNvbmYtPm5hbWUpOworCisJLyogaW5pdGlhbGl6ZSBkYXRhIGluIHBwcF9wcml2YXRlX2FyZWEgc3RydWN0dXJlICovCisJCisJaW5pdF9wcHBfcHJpdl9zdHJ1Y3QoIHBwcF9wcml2X2FyZWEgKTsKKworCXBwcF9wcml2X2FyZWEtPm1jID0gY29uZi0+bWM7CisJcHBwX3ByaXZfYXJlYS0+cGFwID0gY29uZi0+cGFwOworCXBwcF9wcml2X2FyZWEtPmNoYXAgPSBjb25mLT5jaGFwOworCisJLyogT3B0aW9uIHRvIGJyaW5nIGRvd24gdGhlIGludGVyZmFjZSB3aGVuIAorICAgICAgICAgKiB0aGUgbGluayBnb2VzIGRvd24gKi8KKwlpZiAoY29uZi0+aWZfZG93bil7CisJCXNldF9iaXQoRFlOX09QVF9PTiwmcHBwX3ByaXZfYXJlYS0+aW50ZXJmYWNlX2Rvd24pOworCQlwcmludGsoIiVzOiBEeW5hbWljIGludGVyZmFjZSBjb25maWd1cmF0aW9uIGVuYWJsZWRcbiIsCisJCQljYXJkLT5kZXZuYW1lKTsKKwl9IAorCisJLyogSWYgbm8gdXNlciBpZHMgYXJlIHNwZWNpZmllZCAqLworCWlmKCFzdHJsZW4oY29uZi0+dXNlcmlkKSAmJiAocHBwX3ByaXZfYXJlYS0+cGFwfHxwcHBfcHJpdl9hcmVhLT5jaGFwKSl7CisJCWtmcmVlKHBwcF9wcml2X2FyZWEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBJZiBubyBwYXNzd29yZHMgYXJlIHNwZWNpZmllZCAqLworCWlmKCFzdHJsZW4oY29uZi0+cGFzc3dkKSAmJiAocHBwX3ByaXZfYXJlYS0+cGFwfHxwcHBfcHJpdl9hcmVhLT5jaGFwKSl7CisJCWtmcmVlKHBwcF9wcml2X2FyZWEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZihzdHJsZW4oY29uZi0+c3lzbmFtZSkgPiAzMSl7CisJCWtmcmVlKHBwcF9wcml2X2FyZWEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBJZiBubyBzeXN0ZW0gbmFtZSBpcyBzcGVjaWZpZWQgKi8KKwlpZighc3RybGVuKGNvbmYtPnN5c25hbWUpICYmIChjYXJkLT51LnAuYXV0aGVudGljYXRvcikpeworCQlrZnJlZShwcHBfcHJpdl9hcmVhKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogY29weSB0aGUgZGF0YSBpbnRvIHRoZSBwcHAgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KKwltZW1jcHkocHBwX3ByaXZfYXJlYS0+dXNlcmlkLCBjb25mLT51c2VyaWQsIHN0cmxlbihjb25mLT51c2VyaWQpKTsKKwltZW1jcHkocHBwX3ByaXZfYXJlYS0+cGFzc3dkLCBjb25mLT5wYXNzd2QsIHN0cmxlbihjb25mLT5wYXNzd2QpKTsKKwltZW1jcHkocHBwX3ByaXZfYXJlYS0+c3lzbmFtZSwgY29uZi0+c3lzbmFtZSwgc3RybGVuKGNvbmYtPnN5c25hbWUpKTsKKworCQorCXBwcF9wcml2X2FyZWEtPmVuYWJsZV9JUFggPSBjb25mLT5lbmFibGVfSVBYOworCWlmIChjb25mLT5uZXR3b3JrX251bWJlcil7CisJCXBwcF9wcml2X2FyZWEtPm5ldHdvcmtfbnVtYmVyID0gY29uZi0+bmV0d29ya19udW1iZXI7CisJfWVsc2V7CisJCXBwcF9wcml2X2FyZWEtPm5ldHdvcmtfbnVtYmVyID0gMHhERUFEQkVFRjsKKwl9CisKKwkvKiBUZWxscyB1cyB0aGF0IGlmIHRoaXMgaW50ZXJmYWNlIGlzIGEKKyAgICAgICAgICogZ2F0ZXdheSBvciBub3QgKi8KKwlpZiAoKHBwcF9wcml2X2FyZWEtPmdhdGV3YXkgPSBjb25mLT5nYXRld2F5KSA9PSBXQU5PUFRfWUVTKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludGVyZmFjZSAlcyBpcyBzZXQgYXMgYSBnYXRld2F5LlxuIiwKKwkJCWNhcmQtPmRldm5hbWUsY2FyZC0+dS5wLmlmX25hbWUpOworCX0KKworCS8qIHByZXBhcmUgbmV0d29yayBkZXZpY2UgZGF0YSBzcGFjZSBmb3IgcmVnaXN0cmF0aW9uICovCisgCXN0cmNweShkZXYtPm5hbWUsY2FyZC0+dS5wLmlmX25hbWUpOworCQorCWRldi0+aW5pdCA9ICZpZl9pbml0OworCWRldi0+cHJpdiA9IHBwcF9wcml2X2FyZWE7CisJZGV2LT5tdHUgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGRldi0+bXR1LCBjYXJkLT53YW5kZXYubXR1KTsKKworCS8qIEluaXRpYWxpemUgdGhlIHBvbGxpbmcgd29yayByb3V0aW5lICovCisJSU5JVF9XT1JLKCZwcHBfcHJpdl9hcmVhLT5wb2xsX3dvcmssICh2b2lkKikodm9pZCopcHBwX3BvbGwsIGRldik7CisKKwkvKiBJbml0aWFsaXplIHRoZSBwb2xsaW5nIGRlbGF5IHRpbWVyICovCisJaW5pdF90aW1lcigmcHBwX3ByaXZfYXJlYS0+cG9sbF9kZWxheV90aW1lcik7CisJcHBwX3ByaXZfYXJlYS0+cG9sbF9kZWxheV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCXBwcF9wcml2X2FyZWEtPnBvbGxfZGVsYXlfdGltZXIuZnVuY3Rpb24gPSBwcHBfcG9sbF9kZWxheTsKKwkKKwkKKwkvKiBTaW5jZSB3ZSBzdGFydCB3aXRoIGR1bW15IElQIGFkZHJlc3NlcyB3ZSBjYW4gc2F5CisJICogdGhhdCByb3V0ZSBleGlzdHMgKi8KKwlwcmludGsoS0VSTl9JTkZPICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGVsZXRlIGxvZ2ljYWwgY2hhbm5lbC4KKyAqLworc3RhdGljIGludCBkZWxfaWYoc3RydWN0IHdhbl9kZXZpY2UgKndhbmRldiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGlzYWJsZV9jb21tIChzZGxhX3QgKmNhcmQpCit7CisJcHBwX2NvbW1fZGlzYWJsZV9zaHV0ZG93bihjYXJkKTsKKwlyZXR1cm47Cit9CisKKy8qKioqKiogV0FOUElQRS1zcGVjaWZpYyBlbnRyeSBwb2ludHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEV4ZWN1dGUgYWRhcHRlciBpbnRlcmZhY2UgY29tbWFuZC4KKyAqLworCisvL0ZJWE1FOiBXaHkgZG8gd2UgbmVlZCB0aGlzID8/Pz8KK3N0YXRpYyBpbnQgd3BwX2V4ZWMoc3RydWN0IHNkbGEgKmNhcmQsIHZvaWQgKnVfY21kLCB2b2lkICp1X2RhdGEpCit7CisJcHBwX21ib3hfdCAqbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IGxlbjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCopJm1ib3gtPmNtZCwgdV9jbWQsIHNpemVvZihwcHBfY21kX3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlsZW4gPSBtYm94LT5jbWQubGVuZ3RoOworCisJaWYgKGxlbikgeworCisJCWlmKCBjb3B5X2Zyb21fdXNlcigodm9pZCopJm1ib3gtPmRhdGEsIHVfZGF0YSwgbGVuKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJfQorCisJLyogZXhlY3V0ZSBjb21tYW5kICovCisJaWYgKCFzZGxhX2V4ZWMobWJveCkpCisJCXJldHVybiAtRUlPOworCisJLyogcmV0dXJuIHJlc3VsdCAqLworCWlmKCBjb3B5X3RvX3VzZXIodV9jbWQsICh2b2lkKikmbWJveC0+Y21kLCBzaXplb2YocHBwX2NtZF90KSkpCisJCXJldHVybiAtRUZBVUxUOworCWxlbiA9IG1ib3gtPmNtZC5sZW5ndGg7CisKKwlpZiAobGVuICYmIHVfZGF0YSAmJiBjb3B5X3RvX3VzZXIodV9kYXRhLCAodm9pZCopJm1ib3gtPmRhdGEsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKiogTmV0d29yayBEZXZpY2UgSW50ZXJmYWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgTGludXggbmV0d29yayBpbnRlcmZhY2UuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBvbmx5IG9uY2UgZm9yIGVhY2ggaW50ZXJmYWNlLCBkdXJpbmcgTGludXggbmV0d29yaworICogaW50ZXJmYWNlIHJlZ2lzdHJhdGlvbi4gIFJldHVybmluZyBhbnl0aGluZyBidXQgemVybyB3aWxsIGZhaWwgaW50ZXJmYWNlCisgKiByZWdpc3RyYXRpb24uCisgKi8KK3N0YXRpYyBpbnQgaWZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwlzZGxhX3QgKmNhcmQgPSBwcHBfcHJpdl9hcmVhLT5jYXJkOworCXN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYgPSAmY2FyZC0+d2FuZGV2OworCisJLyogSW5pdGlhbGl6ZSBkZXZpY2UgZHJpdmVyIGVudHJ5IHBvaW50cyAqLworCWRldi0+b3BlbgkJPSAmaWZfb3BlbjsKKwlkZXYtPnN0b3AJCT0gJmlmX2Nsb3NlOworCWRldi0+aGFyZF9oZWFkZXIJPSAmaWZfaGVhZGVyOworCWRldi0+cmVidWlsZF9oZWFkZXIJPSAmaWZfcmVidWlsZF9oZHI7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSAmaWZfc2VuZDsKKwlkZXYtPmdldF9zdGF0cwkJPSAmaWZfc3RhdHM7CisJZGV2LT50eF90aW1lb3V0CQk9ICZpZl90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBUWF9USU1FT1VUOworCisJLyogSW5pdGlhbGl6ZSBtZWRpYS1zcGVjaWZpYyBwYXJhbWV0ZXJzICovCisJZGV2LT50eXBlCQk9IEFSUEhSRF9QUFA7CS8qIEFSUCBoL3cgdHlwZSAqLworCWRldi0+ZmxhZ3MJCXw9IElGRl9QT0lOVE9QT0lOVDsKKwlkZXYtPmZsYWdzCQl8PSBJRkZfTk9BUlA7CisKKwkvKiBFbmFibGUgTXVsaXRjYXN0aW5nIGlmIHNwZWNpZmllZCBieSB1c2VyKi8KKwlpZiAocHBwX3ByaXZfYXJlYS0+bWMgPT0gV0FOT1BUX1lFUyl7CisJCWRldi0+ZmxhZ3MJfD0gSUZGX01VTFRJQ0FTVDsKKwl9CisKKwlkZXYtPm10dQkJPSB3YW5kZXYtPm10dTsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbgk9IFBQUF9IRFJfTEVOOwkvKiBtZWRpYSBoZWFkZXIgbGVuZ3RoICovCisKKwkvKiBJbml0aWFsaXplIGhhcmR3YXJlIHBhcmFtZXRlcnMgKGp1c3QgZm9yIHJlZmVyZW5jZSkgKi8KKwlkZXYtPmlycQkJPSB3YW5kZXYtPmlycTsKKwlkZXYtPmRtYQkJPSB3YW5kZXYtPmRtYTsKKwlkZXYtPmJhc2VfYWRkcgkJPSB3YW5kZXYtPmlvcG9ydDsKKwlkZXYtPm1lbV9zdGFydAkJPSB3YW5kZXYtPm1hZGRyOworCWRldi0+bWVtX2VuZAkJPSB3YW5kZXYtPm1hZGRyICsgd2FuZGV2LT5tc2l6ZSAtIDE7CisKKyAgICAgICAgLyogU2V0IHRyYW5zbWl0IGJ1ZmZlciBxdWV1ZSBsZW5ndGggKi8KKyAgICAgICAgZGV2LT50eF9xdWV1ZV9sZW4gPSAxMDA7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworICAgCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogT3BlbiBuZXR3b3JrIGludGVyZmFjZS4KKyAqIG8gZW5hYmxlIGNvbW11bmljYXRpb25zIGFuZCBpbnRlcnJ1cHRzLgorICogbyBwcmV2ZW50IG1vZHVsZSBmcm9tIHVubG9hZGluZyBieSBpbmNyZW1lbnRpbmcgdXNlIGNvdW50CisgKgorICogUmV0dXJuIDAgaWYgTy5rLiBvciBlcnJuby4KKyAqLworc3RhdGljIGludCBpZl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcHBwX3ByaXZhdGVfYXJlYV90ICpwcHBfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCXNkbGFfdCAqY2FyZCA9IHBwcF9wcml2X2FyZWEtPmNhcmQ7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJLy91bnNpZ25lZCBsb25nIHNtcF9mbGFnczsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUJVU1k7CisKKwl3YW5waXBlX29wZW4oY2FyZCk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQorCWRvX2dldHRpbWVvZmRheSggJnR2ICk7CisJcHBwX3ByaXZfYXJlYS0+cm91dGVyX3N0YXJ0X3RpbWUgPSB0di50dl9zZWM7CisKKwkvKiBXZSBjYW5ub3QgY29uZmlndXJlIHRoZSBjYXJkIGhlcmUgYmVjYXVzZSB3ZSBkb24ndAorCSAqIGhhdmUgYWNjZXNzIHRvIHRoZSBpbnRlcmZhY2UgSVAgYWRkcmVzc2VzLgorICAgICAgICAgKiBPbmNlIHRoZSBpbnRlcmZhY2UgaW5pdGlsaXphdGlvbiBpcyBjb21wbGV0ZSwgd2Ugd2lsbCBiZQorICAgICAgICAgKiBhYmxlIHRvIGFjY2VzcyB0aGUgSVAgYWRkcmVzc2VzLiAgVGhlcmVmb3JlLAorICAgICAgICAgKiBjb25maWd1cmUgdGhlIHBwcCBsaW5rIGluIHRoZSBwb2xsIHJvdXRpbmUgKi8KKwlzZXRfYml0KDAsJnBwcF9wcml2X2FyZWEtPmNvbmZpZ19wcHApOworCXBwcF9wcml2X2FyZWEtPmNvbmZpZ193YWl0X3RpbWVvdXQ9amlmZmllczsKKworCS8qIFN0YXJ0IHRoZSBQUFAgY29uZmlndXJhdGlvbiBhZnRlciAxc2VjIGRlbGF5LgorCSAqIFRoaXMgd2lsbCBnaXZlIHRoZSBpbnRlcmZhY2UgaW5pdGlsaXphdGlvbiB0aW1lCisJICogdG8gZmluaXNoIGl0cyBjb25maWd1cmF0aW9uICovCisJbW9kX3RpbWVyKCZwcHBfcHJpdl9hcmVhLT5wb2xsX2RlbGF5X3RpbWVyLCBqaWZmaWVzICsgSFopOworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENsb3NlIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyBpZiB0aGlzIGlzIHRoZSBsYXN0IG9wZW4sIHRoZW4gZGlzYWJsZSBjb21tdW5pY2F0aW9ucyBhbmQgaW50ZXJydXB0cy4KKyAqIG8gcmVzZXQgZmxhZ3MuCisgKi8KK3N0YXRpYyBpbnQgaWZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWEgPSBkZXYtPnByaXY7CisJc2RsYV90ICpjYXJkID0gcHBwX3ByaXZfYXJlYS0+Y2FyZDsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl3YW5waXBlX2Nsb3NlKGNhcmQpOworCisJZGVsX3RpbWVyICgmcHBwX3ByaXZfYXJlYS0+cG9sbF9kZWxheV90aW1lcik7CisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQnVpbGQgbWVkaWEgaGVhZGVyLgorICoKKyAqIFRoZSB0cmljayBoZXJlIGlzIHRvIHB1dCBwYWNrZXQgdHlwZSAoRXRoZXJ0eXBlKSBpbnRvICdwcm90b2NvbCcgZmllbGQgb2YKKyAqIHRoZSBzb2NrZXQgYnVmZmVyLCBzbyB0aGF0IHdlIGRvbid0IGZvcmdldCBpdC4gIElmIHBhY2tldCB0eXBlIGlzIG5vdAorICogc3VwcG9ydGVkLCBzZXQgc2tiLT5wcm90b2NvbCB0byAwIGFuZCBkaXNjYXJkIHBhY2tldCBsYXRlci4KKyAqCisgKiBSZXR1cm46CW1lZGlhIGhlYWRlciBsZW5ndGguCisgKi8KK3N0YXRpYyBpbnQgaWZfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdW5zaWduZWQgc2hvcnQgdHlwZSwgdm9pZCAqZGFkZHIsIHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pCit7CisJc3dpdGNoICh0eXBlKQorCXsKKwkJY2FzZSBFVEhfUF9JUDoKKwkJY2FzZSBFVEhfUF9JUFg6CisJCQlza2ItPnByb3RvY29sID0gaHRvbnModHlwZSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJc2tiLT5wcm90b2NvbCA9IDA7CisJfQorCisJcmV0dXJuIFBQUF9IRFJfTEVOOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlLWJ1aWxkIG1lZGlhIGhlYWRlci4KKyAqCisgKiBSZXR1cm46CTEJcGh5c2ljYWwgYWRkcmVzcyByZXNvbHZlZC4KKyAqCQkwCXBoeXNpY2FsIGFkZHJlc3Mgbm90IHJlc29sdmVkCisgKi8KK3N0YXRpYyBpbnQgaWZfcmVidWlsZF9oZHIgKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCXBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwlzZGxhX3QgKmNhcmQgPSBwcHBfcHJpdl9hcmVhLT5jYXJkOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlYnVpbGRfaGVhZGVyKCkgY2FsbGVkIGZvciBpbnRlcmZhY2UgJXMhXG4iLAorCQljYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUpOworCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEhhbmRsZSB0cmFuc21pdCB0aW1lb3V0IGV2ZW50IGZyb20gbmV0aWYgd2F0Y2hkb2cKKyAqLworc3RhdGljIHZvaWQgaWZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIAlwcHBfcHJpdmF0ZV9hcmVhX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90ICpjYXJkID0gY2hhbi0+Y2FyZDsKKwkKKwkvKiBJZiBvdXIgZGV2aWNlIHN0YXlzIGJ1c3kgZm9yIGF0IGxlYXN0IDUgc2Vjb25kcyB0aGVuIHdlIHdpbGwKKwkgKiBraWNrIHN0YXJ0IHRoZSBkZXZpY2UgYnkgbWFraW5nIGRldi0+dGJ1c3kgPSAwLiAgV2UgZXhwZWN0CisJICogdGhhdCBvdXIgZGV2aWNlIG5ldmVyIHN0YXlzIGJ1c3kgbW9yZSB0aGFuIDUgc2Vjb25kcy4gU28gdGhpcyAgICAgICAgICAgICAgICAgCisJICogaXMgb25seSB1c2VkIGFzIGEgbGFzdCByZXNvcnQuCisJICovCisKKwkrKyBjaGFuLT5pZl9zZW5kX3N0YXQuaWZfc2VuZF90YnVzeTsKKwkrK2NhcmQtPndhbmRldi5zdGF0cy5jb2xsaXNpb25zOworCisJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQgb24gJXNcbiIsIGNhcmQtPmRldm5hbWUsZGV2LT5uYW1lKTsKKwkrK2NoYW4tPmlmX3NlbmRfc3RhdC5pZl9zZW5kX3RidXN5X3RpbWVvdXQ7CisJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKK30KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCBhIHBhY2tldCBvbiBhIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyBzZXQgdGJ1c3kgZmxhZyAobWFya3Mgc3RhcnQgb2YgdGhlIHRyYW5zbWlzc2lvbikgdG8gYmxvY2sgYSB0aW1lci1iYXNlZAorICogICB0cmFuc21pdCBmcm9tIG92ZXJsYXBwaW5nLgorICogbyBjaGVjayBsaW5rIHN0YXRlLiBJZiBsaW5rIGlzIG5vdCB1cCwgdGhlbiBkcm9wIHRoZSBwYWNrZXQuCisgKiBvIGV4ZWN1dGUgYWRhcHRlciBzZW5kIGNvbW1hbmQuCisgKiBvIGZyZWUgc29ja2V0IGJ1ZmZlcgorICoKKyAqIFJldHVybjoJMAljb21wbGV0ZSAoc29ja2V0IGJ1ZmZlciBtdXN0IGJlIGZyZWVkKQorICoJCW5vbi0wCXBhY2tldCBtYXkgYmUgcmUtdHJhbnNtaXR0ZWQgKHRidXN5IG11c3QgYmUgc2V0KQorICoKKyAqIE5vdGVzOgorICogMS4gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBlaXRoZXIgYnkgdGhlIHByb3RvY29sIHN0YWNrIG9yIGJ5IHRoZSAibmV0CisgKiAgICBib3R0b20gaGFsZiIgKHdpdGggaW50ZXJydXB0cyBlbmFibGVkKS4KKyAqIDIuIFNldHRpbmcgdGJ1c3kgZmxhZyB3aWxsIGluaGliaXQgZnVydGhlciB0cmFuc21pdCByZXF1ZXN0cyBmcm9tIHRoZQorICogICAgcHJvdG9jb2wgc3RhY2sgYW5kIGNhbiBiZSB1c2VkIGZvciBmbG93IGNvbnRyb2wgd2l0aCBwcm90b2NvbCBsYXllci4KKyAqLworc3RhdGljIGludCBpZl9zZW5kIChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwlzZGxhX3QgKmNhcmQgPSBwcHBfcHJpdl9hcmVhLT5jYXJkOworCXVuc2lnbmVkIGNoYXIgKnNlbmRwYWNrZXQ7CisJdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M7CisJcHBwX2ZsYWdzX3QgKmZsYWdzID0gY2FyZC0+ZmxhZ3M7CisJaW50IHVkcF90eXBlOworCWludCBlcnI9MDsKKwkKKwkrK3BwcF9wcml2X2FyZWEtPmlmX3NlbmRfc3RhdC5pZl9zZW5kX2VudHJ5OworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQorCWlmIChza2IgPT0gTlVMTCkgeworCisJCS8qIElmIHdlIGdldCBoZXJlLCBzb21lIGhpZ2hlciBsYXllciB0aGlua3Mgd2UndmUgbWlzc2VkIGFuCisJCSAqIHR4LWRvbmUgaW50ZXJydXB0LgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludGVyZmFjZSAlcyBnb3Qga2lja2VkIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIGRldi0+bmFtZSk7CisJCQorCQkrK3BwcF9wcml2X2FyZWEtPmlmX3NlbmRfc3RhdC5pZl9zZW5kX3NrYl9udWxsOworCQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCXJldHVybiAwOworCX0KKworCXNlbmRwYWNrZXQgPSBza2ItPmRhdGE7CisKKwl1ZHBfdHlwZSA9IHVkcF9wa3RfdHlwZSggc2tiLCBjYXJkICk7CisKKworCWlmICh1ZHBfdHlwZSA9PSBVRFBfUFRQSVBFX1RZUEUpeworCQlpZihzdG9yZV91ZHBfbWdtdF9wa3QoVURQX1BLVF9GUk1fU1RBQ0ssIGNhcmQsIHNrYiwgZGV2LAorICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgIHBwcF9wcml2X2FyZWEpKXsKKwkgICAgICAgICAgICAgICAJZmxhZ3MtPmltYXNrIHw9IFBQUF9JTlRSX1RJTUVSOworCQl9CisJCSsrcHBwX3ByaXZfYXJlYS0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfUElQRV9yZXF1ZXN0OworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDaGVjayBmb3IgYnJvYWRjYXN0IGFuZCBtdWx0aWNhc3QgYWRkcmVzc2VzIAorCSAqIElmIGZvdW5kLCBkcm9wIChkZWFsbG9jYXRlKSBhIHBhY2tldCBhbmQgcmV0dXJuLgorCSAqLworCWlmKGNoa19iY2FzdF9tY2FzdF9hZGRyKGNhcmQsIGRldiwgc2tiKSl7CisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCXJldHVybiAwOworCX0KKworCisgCWlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KXsKKwkJczUwOF9sb2NrKGNhcmQsJnNtcF9mbGFncyk7CisJfQorCisgICAgCWlmICh0ZXN0X2FuZF9zZXRfYml0KFNFTkRfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKSB7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENyaXRpY2FsIGluIGlmX3NlbmQ6ICVseFxuIiwKKwkJCQljYXJkLT53YW5kZXYubmFtZSxjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQkKKwkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJKytwcHBfcHJpdl9hcmVhLT5pZl9zZW5kX3N0YXQuaWZfc2VuZF9jcml0aWNhbF9ub25fSVNSOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQlnb3RvIGlmX3NlbmRfZXhpdF9jcml0OworCX0KKworCWlmIChjYXJkLT53YW5kZXYuc3RhdGUgIT0gV0FOX0NPTk5FQ1RFRCkgeworCisJCSsrcHBwX3ByaXZfYXJlYS0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfd2FuX2Rpc2Nvbm5lY3RlZDsKKyAgICAgICAgCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCQorICAgICAJfSBlbHNlIGlmICghc2tiLT5wcm90b2NvbCkgeworCQkrK3BwcF9wcml2X2FyZWEtPmlmX3NlbmRfc3RhdC5pZl9zZW5kX3Byb3RvY29sX2Vycm9yOworICAgICAgICAJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZXJyb3JzOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkKKwl9IGVsc2UgeworCisJCS8qSWYgaXQncyBJUFggY2hhbmdlIHRoZSBuZXR3b3JrIG51bWJlcnMgdG8gMCBpZiB0aGV5J3JlIG91cnMuKi8KKwkJaWYoIHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBYKSApIHsKKwkJCWlmKHBwcF9wcml2X2FyZWEtPmVuYWJsZV9JUFgpIHsKKwkJCQlzd2l0Y2hfbmV0X251bWJlcnMoIHNrYi0+ZGF0YSwgCisJCQkJCXBwcF9wcml2X2FyZWEtPm5ldHdvcmtfbnVtYmVyLCAwKTsKKwkJCX0gZWxzZSB7CisJCQkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkJCWdvdG8gaWZfc2VuZF9leGl0X2NyaXQ7CisJCQl9CisJCX0KKworCQlpZiAocHBwX3NlbmQoY2FyZCwgc2tiLT5kYXRhLCBza2ItPmxlbiwgc2tiLT5wcm90b2NvbCkpIHsKKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCSsrcHBwX3ByaXZfYXJlYS0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfYWRwdHJfYmZyc19mdWxsOworCQkJKytwcHBfcHJpdl9hcmVhLT5pZl9zZW5kX3N0YXQuaWZfc2VuZF90eF9pbnRfZW5hYmxlZDsKKwkJfSBlbHNlIHsKKwkJCSsrcHBwX3ByaXZfYXJlYS0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfYmZyX3Bhc3NlZF90b19hZHB0cjsKKwkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X3BhY2tldHM7CisJCQljYXJkLT53YW5kZXYuc3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCX0KKyAgICAJfQorCQoraWZfc2VuZF9leGl0X2NyaXQ6CisJCisJaWYgKCEoZXJyPW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkpeworICAgICAgCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX1lbHNleworCQlwcHBfcHJpdl9hcmVhLT50aWNrX2NvdW50ZXIgPSBqaWZmaWVzOworCQlmbGFncy0+aW1hc2sgfD0gUFBQX0lOVFJfVFhSRFk7CS8qIHVubWFzayBUeCBpbnRlcnJ1cHRzICovCisJfQorCQorCWNsZWFyX2JpdChTRU5EX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpewkKKwkJczUwOF91bmxvY2soY2FyZCwmc21wX2ZsYWdzKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0b3JlIGEgVURQIG1hbmFnZW1lbnQgcGFja2V0IGZvciBsYXRlciBwcm9jZXNzaW5nLgorICovCisKK3N0YXRpYyBpbnQgc3RvcmVfdWRwX21nbXRfcGt0KGNoYXIgdWRwX3BrdF9zcmMsIHNkbGFfdCogY2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBwX3ByaXZhdGVfYXJlYV90KiBwcHBfcHJpdl9hcmVhICkKK3sKKwlpbnQgdWRwX3BrdF9zdG9yZWQgPSAwOworCisJaWYoIXBwcF9wcml2X2FyZWEtPnVkcF9wa3RfbGd0aCAmJiAoc2tiLT5sZW48PU1BWF9MR1RIX1VEUF9NR05UX1BLVCkpeworICAgICAgICAJcHBwX3ByaXZfYXJlYS0+dWRwX3BrdF9sZ3RoID0gc2tiLT5sZW47CisJCXBwcF9wcml2X2FyZWEtPnVkcF9wa3Rfc3JjID0gdWRwX3BrdF9zcmM7CisgICAgICAgCQltZW1jcHkocHBwX3ByaXZfYXJlYS0+dWRwX3BrdF9kYXRhLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJcHBwX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgfD0gVE1SX0lOVF9FTkFCTEVEX1VEUDsKKwkJcHBwX3ByaXZfYXJlYS0+cHJvdG9jb2wgPSBza2ItPnByb3RvY29sOworCQl1ZHBfcGt0X3N0b3JlZCA9IDE7CisJfWVsc2V7CisJCWlmIChza2ItPmxlbiA+IE1BWF9MR1RIX1VEUF9NR05UX1BLVCl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUElQRU1PTiBVRFAgcmVxdWVzdCB0b28gbG9uZyA6ICVpXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIHNrYi0+bGVuKTsKKwkJfWVsc2V7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUElQRU1PTiBVUEQgcmVxdWVzdCBhbHJlYWR5IHBlbmRpbmdcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCX0KKwkJcHBwX3ByaXZfYXJlYS0+dWRwX3BrdF9sZ3RoID0gMDsKKwl9CisKKwlpZih1ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9TVEFDSyl7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfWVsc2V7CisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwl9CisKKwlyZXR1cm4odWRwX3BrdF9zdG9yZWQpOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZXBseSB0byBVRFAgTWFuYWdlbWVudCBzeXN0ZW0uCisgKiBSZXR1cm4gbGVuZ3RoIG9mIHJlcGx5LgorICovCitzdGF0aWMgaW50IHJlcGx5X3VkcCggdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IG1ib3hfbGVuICkgCit7CisJdW5zaWduZWQgc2hvcnQgbGVuLCB1ZHBfbGVuZ3RoLCB0ZW1wLCBpcF9sZW5ndGg7CisJdW5zaWduZWQgbG9uZyBpcF90ZW1wOworCWludCBldmVuX2JvdW5kID0gMDsKKwlwcHBfdWRwX3BrdF90ICpwX3VkcF9wa3QgPSAocHBwX3VkcF9wa3RfdCAqKWRhdGE7CisgCisJLyogU2V0IGxlbmd0aCBvZiBwYWNrZXQgKi8KKwlsZW4gPSBzaXplb2YoaXBfcGt0X3QpKyAKKwkgICAgICBzaXplb2YodWRwX3BrdF90KSsKKwkgICAgICBzaXplb2Yod3BfbWdtdF90KSsKKwkgICAgICBzaXplb2YoY2Jsb2NrX3QpKworCSAgICAgIG1ib3hfbGVuOworCisJLyogZmlsbCBpbiBVRFAgcmVwbHkgKi8KKyAgCXBfdWRwX3BrdC0+d3BfbWdtdC5yZXF1ZXN0X3JlcGx5ID0gVURQTUdNVF9SRVBMWTsgCisKKwkvKiBmaWxsIGluIFVEUCBsZW5ndGggKi8KKwl1ZHBfbGVuZ3RoID0gc2l6ZW9mKHVkcF9wa3RfdCkrIAorCQkgICAgIHNpemVvZih3cF9tZ210X3QpKworCQkgICAgIHNpemVvZihjYmxvY2tfdCkrCisJCSAgICAgbWJveF9sZW47IAorICAKKyAKKwkvKiBwdXQgaXQgb24gYW4gZXZlbiBib3VuZGFyeSAqLworCWlmICggdWRwX2xlbmd0aCAmIDB4MDAwMSApIHsKKwkJdWRwX2xlbmd0aCArPSAxOworCQlsZW4gKz0gMTsKKwkJZXZlbl9ib3VuZD0xOworCX0gCisJCisJdGVtcCA9ICh1ZHBfbGVuZ3RoPDw4KXwodWRwX2xlbmd0aD4+OCk7CisJcF91ZHBfcGt0LT51ZHBfcGt0LnVkcF9sZW5ndGggPSB0ZW1wOwkJCisKKyAKKwkvKiBzd2FwIFVEUCBwb3J0cyAqLworCXRlbXAgPSBwX3VkcF9wa3QtPnVkcF9wa3QudWRwX3NyY19wb3J0OworCXBfdWRwX3BrdC0+dWRwX3BrdC51ZHBfc3JjX3BvcnQgPSAKKwkJCXBfdWRwX3BrdC0+dWRwX3BrdC51ZHBfZHN0X3BvcnQ7IAorCXBfdWRwX3BrdC0+dWRwX3BrdC51ZHBfZHN0X3BvcnQgPSB0ZW1wOworCisKKwkvKiBhZGQgVURQIHBzZXVkbyBoZWFkZXIgKi8KKwl0ZW1wID0gMHgxMTAwOworCSooKHVuc2lnbmVkIHNob3J0ICopKHBfdWRwX3BrdC0+ZGF0YSttYm94X2xlbitldmVuX2JvdW5kKSkgPSB0ZW1wOworCXRlbXAgPSAodWRwX2xlbmd0aDw8OCl8KHVkcF9sZW5ndGg+PjgpOworCSooKHVuc2lnbmVkIHNob3J0ICopKHBfdWRwX3BrdC0+ZGF0YSttYm94X2xlbitldmVuX2JvdW5kKzIpKSA9IHRlbXA7CisgCisJLyogY2FsY3VsYXRlIFVEUCBjaGVja3N1bSAqLworCXBfdWRwX3BrdC0+dWRwX3BrdC51ZHBfY2hlY2tzdW0gPSAwOworCXBfdWRwX3BrdC0+dWRwX3BrdC51ZHBfY2hlY2tzdW0gPSAKKwkJY2FsY19jaGVja3N1bSgmZGF0YVtVRFBfT0ZGU0VUXSx1ZHBfbGVuZ3RoK1VEUF9PRkZTRVQpOworCisJLyogZmlsbCBpbiBJUCBsZW5ndGggKi8KKwlpcF9sZW5ndGggPSB1ZHBfbGVuZ3RoICsgc2l6ZW9mKGlwX3BrdF90KTsKKwl0ZW1wID0gKGlwX2xlbmd0aDw8OCl8KGlwX2xlbmd0aD4+OCk7CisgIAlwX3VkcF9wa3QtPmlwX3BrdC50b3RhbF9sZW5ndGggPSB0ZW1wOworIAorCS8qIHN3YXAgSVAgYWRkcmVzc2VzICovCisJaXBfdGVtcCA9IHBfdWRwX3BrdC0+aXBfcGt0LmlwX3NyY19hZGRyZXNzOworCXBfdWRwX3BrdC0+aXBfcGt0LmlwX3NyY19hZGRyZXNzID0gcF91ZHBfcGt0LT5pcF9wa3QuaXBfZHN0X2FkZHJlc3M7CisJcF91ZHBfcGt0LT5pcF9wa3QuaXBfZHN0X2FkZHJlc3MgPSBpcF90ZW1wOworCisJLyogZmlsbCBpbiBJUCBjaGVja3N1bSAqLworCXBfdWRwX3BrdC0+aXBfcGt0Lmhkcl9jaGVja3N1bSA9IDA7CisJcF91ZHBfcGt0LT5pcF9wa3QuaGRyX2NoZWNrc3VtID0gY2FsY19jaGVja3N1bShkYXRhLHNpemVvZihpcF9wa3RfdCkpOworCisJcmV0dXJuIGxlbjsKKworfSAvKiByZXBseV91ZHAgKi8KKwordW5zaWduZWQgc2hvcnQgY2FsY19jaGVja3N1bSAoY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBzaG9ydCB0ZW1wOyAKKwl1bnNpZ25lZCBsb25nIHN1bT0wOworCWludCBpOworCisJZm9yKCBpID0gMDsgaSA8bGVuOyBpKz0yICkgeworCQltZW1jcHkoJnRlbXAsJmRhdGFbaV0sMik7CisJCXN1bSArPSAodW5zaWduZWQgbG9uZyl0ZW1wOworCX0KKworCXdoaWxlIChzdW0gPj4gMTYgKSB7CisJCXN1bSA9IChzdW0gJiAweGZmZmZVTCkgKyAoc3VtID4+IDE2KTsKKwl9CisKKwl0ZW1wID0gKHVuc2lnbmVkIHNob3J0KXN1bTsKKwl0ZW1wID0gfnRlbXA7CisKKwlpZiggdGVtcCA9PSAwICkgCisJCXRlbXAgPSAweGZmZmY7CisKKwlyZXR1cm4gdGVtcDsJCit9CisKKy8qCisgICBJZiBpbmNvbWluZyBpcyAwIChvdXRnb2luZyktIGlmIHRoZSBuZXQgbnVtYmVycyBpcyBvdXJzIG1ha2UgaXQgMAorICAgaWYgaW5jb21pbmcgaXMgMSAtIGlmIHRoZSBuZXQgbnVtYmVyIGlzIDAgbWFrZSBpdCBvdXJzIAorCisqLworc3RhdGljIHZvaWQgc3dpdGNoX25ldF9udW1iZXJzKHVuc2lnbmVkIGNoYXIgKnNlbmRwYWNrZXQsIHVuc2lnbmVkIGxvbmcgbmV0d29ya19udW1iZXIsIHVuc2lnbmVkIGNoYXIgaW5jb21pbmcpCit7CisJdW5zaWduZWQgbG9uZyBwbmV0d29ya19udW1iZXI7CisKKwlwbmV0d29ya19udW1iZXIgPSAodW5zaWduZWQgbG9uZykoKHNlbmRwYWNrZXRbNl0gPDwgMjQpICsgCisJCQkgIChzZW5kcGFja2V0WzddIDw8IDE2KSArIChzZW5kcGFja2V0WzhdIDw8IDgpICsgCisJCQkgIHNlbmRwYWNrZXRbOV0pOworCisJaWYgKCFpbmNvbWluZykgeworCQkvL0lmIHRoZSBkZXN0aW5hdGlvbiBuZXR3b3JrIG51bWJlciBpcyBvdXJzLCBtYWtlIGl0IDAKKwkJaWYoIHBuZXR3b3JrX251bWJlciA9PSBuZXR3b3JrX251bWJlcikgeworCQkJc2VuZHBhY2tldFs2XSA9IHNlbmRwYWNrZXRbN10gPSBzZW5kcGFja2V0WzhdID0gCisJCQkJCSBzZW5kcGFja2V0WzldID0gMHgwMDsKKwkJfQorCX0gZWxzZSB7CisJCS8vSWYgdGhlIGluY29taW5nIG5ldHdvcmsgaXMgMCwgbWFrZSBpdCBvdXJzCisJCWlmKCBwbmV0d29ya19udW1iZXIgPT0gMCkgeworCQkJc2VuZHBhY2tldFs2XSA9ICh1bnNpZ25lZCBjaGFyKShuZXR3b3JrX251bWJlciA+PiAyNCk7CisJCQlzZW5kcGFja2V0WzddID0gKHVuc2lnbmVkIGNoYXIpKChuZXR3b3JrX251bWJlciAmIAorCQkJCQkgMHgwMEZGMDAwMCkgPj4gMTYpOworCQkJc2VuZHBhY2tldFs4XSA9ICh1bnNpZ25lZCBjaGFyKSgobmV0d29ya19udW1iZXIgJiAKKwkJCQkJIDB4MDAwMEZGMDApID4+IDgpOworCQkJc2VuZHBhY2tldFs5XSA9ICh1bnNpZ25lZCBjaGFyKShuZXR3b3JrX251bWJlciAmIAorCQkJCQkgMHgwMDAwMDBGRik7CisJCX0KKwl9CisKKworCXBuZXR3b3JrX251bWJlciA9ICh1bnNpZ25lZCBsb25nKSgoc2VuZHBhY2tldFsxOF0gPDwgMjQpICsgCisJCQkgIChzZW5kcGFja2V0WzE5XSA8PCAxNikgKyAoc2VuZHBhY2tldFsyMF0gPDwgOCkgKyAKKwkJCSAgc2VuZHBhY2tldFsyMV0pOworCisJaWYoICFpbmNvbWluZyApIHsKKwkJLy9JZiB0aGUgc291cmNlIG5ldHdvcmsgaXMgb3VycywgbWFrZSBpdCAwCisJCWlmKCBwbmV0d29ya19udW1iZXIgPT0gbmV0d29ya19udW1iZXIpIHsKKwkJCXNlbmRwYWNrZXRbMThdID0gc2VuZHBhY2tldFsxOV0gPSBzZW5kcGFja2V0WzIwXSA9IAorCQkJCQkgc2VuZHBhY2tldFsyMV0gPSAweDAwOworCQl9CisJfSBlbHNlIHsKKwkJLy9JZiB0aGUgc291cmNlIG5ldHdvcmsgaXMgMCwgbWFrZSBpdCBvdXJzCisJCWlmKCBwbmV0d29ya19udW1iZXIgPT0gMCApIHsKKwkJCXNlbmRwYWNrZXRbMThdID0gKHVuc2lnbmVkIGNoYXIpKG5ldHdvcmtfbnVtYmVyID4+IDI0KTsKKwkJCXNlbmRwYWNrZXRbMTldID0gKHVuc2lnbmVkIGNoYXIpKChuZXR3b3JrX251bWJlciAmIAorCQkJCQkgMHgwMEZGMDAwMCkgPj4gMTYpOworCQkJc2VuZHBhY2tldFsyMF0gPSAodW5zaWduZWQgY2hhcikoKG5ldHdvcmtfbnVtYmVyICYgCisJCQkJCSAweDAwMDBGRjAwKSA+PiA4KTsKKwkJCXNlbmRwYWNrZXRbMjFdID0gKHVuc2lnbmVkIGNoYXIpKG5ldHdvcmtfbnVtYmVyICYgCisJCQkJCSAweDAwMDAwMEZGKTsKKwkJfQorCX0KK30gLyogc3dpdGNoX25ldF9udW1iZXJzICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogR2V0IGV0aGVybmV0LXN0eWxlIGludGVyZmFjZSBzdGF0aXN0aWNzLgorICogUmV0dXJuIGEgcG9pbnRlciB0byBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cy4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppZl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJcHBwX3ByaXZhdGVfYXJlYV90ICpwcHBfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZDsKKwkKKwlpZiggcHBwX3ByaXZfYXJlYSA9PSBOVUxMICkKKwkJcmV0dXJuIE5VTEw7CisKKwljYXJkID0gcHBwX3ByaXZfYXJlYS0+Y2FyZDsKKwlyZXR1cm4gJmNhcmQtPndhbmRldi5zdGF0czsKK30KKworLyoqKioqKiBQUFAgRmlybXdhcmUgSW50ZXJmYWNlIEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBmaXJtd2FyZSBjb2RlIHZlcnNpb24uCisgKglQdXQgY29kZSB2ZXJzaW9uIGFzIEFTQ0lJIHN0cmluZyBpbiBzdHIuIAorICovCitzdGF0aWMgaW50IHBwcF9yZWFkX3ZlcnNpb24oc2RsYV90ICpjYXJkLCBjaGFyICpzdHIpCit7CisJcHBwX21ib3hfdCAqbWIgPSBjYXJkLT5tYm94OworCWludCBlcnI7CisKKwltZW1zZXQoJm1iLT5jbWQsIDAsIHNpemVvZihwcHBfY21kX3QpKTsKKwltYi0+Y21kLmNvbW1hbmQgPSBQUFBfUkVBRF9DT0RFX1ZFUlNJT047CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisKKwlpZiAoZXJyICE9IENNRF9PSykKKyAKKwkJcHBwX2Vycm9yKGNhcmQsIGVyciwgbWIpOworCisJZWxzZSBpZiAoc3RyKSB7CisKKwkJaW50IGxlbiA9IG1iLT5jbWQubGVuZ3RoOworCisJCW1lbWNweShzdHIsIG1iLT5kYXRhLCBsZW4pOworCQlzdHJbbGVuXSA9ICdcMCc7CisKKwl9CisKKwlyZXR1cm4gZXJyOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBPdXQtQm91bmQgQXV0aGVudGljYXRpb24uCisqLworc3RhdGljIGludCBwcHBfc2V0X291dGJuZF9hdXRoIChzZGxhX3QgKmNhcmQsIHBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSkKK3sKKwlwcHBfbWJveF90ICptYiA9IGNhcmQtPm1ib3g7CisJaW50IGVycjsKKworCW1lbXNldCgmbWItPmNtZCwgMCwgc2l6ZW9mKHBwcF9jbWRfdCkpOworCW1lbXNldCgmbWItPmRhdGEsIDAsIChzdHJsZW4ocHBwX3ByaXZfYXJlYS0+dXNlcmlkKSArIAorCQkJCQlzdHJsZW4ocHBwX3ByaXZfYXJlYS0+cGFzc3dkKSArIDIgKSApOworCW1lbWNweShtYi0+ZGF0YSwgcHBwX3ByaXZfYXJlYS0+dXNlcmlkLCBzdHJsZW4ocHBwX3ByaXZfYXJlYS0+dXNlcmlkKSk7CisJbWVtY3B5KChtYi0+ZGF0YSArIHN0cmxlbihwcHBfcHJpdl9hcmVhLT51c2VyaWQpICsgMSksIAorCQlwcHBfcHJpdl9hcmVhLT5wYXNzd2QsIHN0cmxlbihwcHBfcHJpdl9hcmVhLT5wYXNzd2QpKTsJCisJCisJbWItPmNtZC5sZW5ndGggID0gc3RybGVuKHBwcF9wcml2X2FyZWEtPnVzZXJpZCkgKyAKKwkJCQkJc3RybGVuKHBwcF9wcml2X2FyZWEtPnBhc3N3ZCkgKyAyIDsKKwkKKwltYi0+Y21kLmNvbW1hbmQgPSBQUFBfU0VUX09VVEJPVU5EX0FVVEg7CisKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKworCWlmIChlcnIgIT0gQ01EX09LKQorCQlwcHBfZXJyb3IoY2FyZCwgZXJyLCBtYik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IEluLUJvdW5kIEF1dGhlbnRpY2F0aW9uLgorKi8KK3N0YXRpYyBpbnQgcHBwX3NldF9pbmJuZF9hdXRoIChzZGxhX3QgKmNhcmQsIHBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSkKK3sKKwlwcHBfbWJveF90ICptYiA9IGNhcmQtPm1ib3g7CisJaW50IGVyciwgaTsKKwljaGFyKiB1c2VyX3Rva2Vuc1szMl07CisJY2hhciogcGFzc190b2tlbnNbMzJdOworCWludCB1c2VyaWRzLCBwYXNzd2RzOworCWludCBhZGRfcHRyOworCisJbWVtc2V0KCZtYi0+Y21kLCAwLCBzaXplb2YocHBwX2NtZF90KSk7CisJbWVtc2V0KCZtYi0+ZGF0YSwgMCwgMTAwOCk7CisJbWVtY3B5KG1iLT5kYXRhLCBwcHBfcHJpdl9hcmVhLT5zeXNuYW1lLCAKKwkJCQkJCXN0cmxlbihwcHBfcHJpdl9hcmVhLT5zeXNuYW1lKSk7CisJCisJLyogUGFyc2UgdGhlIHVzZXJpZCBzdHJpbmcgYW5kIHRoZSBwYXNzd29yZCBzdHJpbmcgYW5kIGJ1aWxkIGEgc3RyaW5nCisJICAgdG8gY29weSBpdCB0byB0aGUgZGF0YSBhcmVhIG9mIHRoZSBjb21tYW5kIHN0cnVjdHVyZS4gICBUaGUgc3RyaW5nCisJICAgd2lsbCBsb29rIGxpa2UgIlNZU19OQU1FPE5VTEw+VVNFUjE8TlVMTD5QQVNTMTxOVUxMPlVTRVIyPE5VTEw+UEFTUzIKKwkgICAuLi4uPE5VTEw+ICIgCisJICovCisJdXNlcmlkcyA9IHRva2VuaXplKCBwcHBfcHJpdl9hcmVhLT51c2VyaWQsIHVzZXJfdG9rZW5zKTsKKwlwYXNzd2RzID0gdG9rZW5pemUoIHBwcF9wcml2X2FyZWEtPnBhc3N3ZCwgcGFzc190b2tlbnMpOworCQorCWlmICh1c2VyaWRzICE9IHBhc3N3ZHMpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogTnVtYmVyIG9mIHBhc3N3b3JkcyBkb2VzIG5vdCBlcXVhbCB0aGUgbnVtYmVyIG9mIHVzZXIgaWRzXG4iLCBjYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuIDE7CQorCX0KKworCWFkZF9wdHIgPSBzdHJsZW4ocHBwX3ByaXZfYXJlYS0+c3lzbmFtZSkgKyAxOworCWZvciAoaT0wOyBpPHVzZXJpZHM7IGkrKyl7CisJCW1lbWNweSgobWItPmRhdGEgKyBhZGRfcHRyKSwgdXNlcl90b2tlbnNbaV0sIAorCQkJCQkJCXN0cmxlbih1c2VyX3Rva2Vuc1tpXSkpOworCQltZW1jcHkoKG1iLT5kYXRhICsgYWRkX3B0ciArIHN0cmxlbih1c2VyX3Rva2Vuc1tpXSkgKyAxKSwgCisJCQkJCXBhc3NfdG9rZW5zW2ldLCBzdHJsZW4ocGFzc190b2tlbnNbaV0pKTsKKwkJYWRkX3B0ciA9IGFkZF9wdHIgKyBzdHJsZW4odXNlcl90b2tlbnNbaV0pICsgMSArIAorCQkJCQkJc3RybGVuKHBhc3NfdG9rZW5zW2ldKSArIDE7CisJfQorCisJbWItPmNtZC5sZW5ndGggID0gYWRkX3B0ciArIDE7CisJbWItPmNtZC5jb21tYW5kID0gUFBQX1NFVF9JTkJPVU5EX0FVVEg7CisKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKworCWlmIChlcnIgIT0gQ01EX09LKQorCQlwcHBfZXJyb3IoY2FyZCwgZXJyLCBtYik7CisKKwlyZXR1cm4gZXJyOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVG9rZW5pemUgc3RyaW5nLgorICogICAgICBQYXJzZSBhIHN0cmluZyBvZiB0aGUgZm9sbG93aW5nIHN5bnRheDoKKyAqICAgICAgICAgICAgICA8YXJnMT4sPGFyZzI+LC4uLgorICogICAgICBhbmQgZmlsbCBhcnJheSBvZiB0b2tlbnMgd2l0aCBwb2ludGVycyB0byBzdHJpbmcgZWxlbWVudHMuCisgKgorICovCitzdGF0aWMgaW50IHRva2VuaXplIChjaGFyICpzdHIsIGNoYXIgKip0b2tlbnMpCit7CisgICAgICAgIGludCBjbnQgPSAwOworCisgICAgICAgIHRva2Vuc1swXSA9IHN0cnNlcCgmc3RyLCAiLyIpOworICAgICAgICB3aGlsZSAodG9rZW5zW2NudF0gJiYgKGNudCA8IDMyIC0gMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0b2tlbnNbY250XSA9IHN0cnN0cmlwKHRva2Vuc1tjbnRdLCAiIFx0Iik7CisgICAgICAgICAgICAgICAgdG9rZW5zWysrY250XSA9IHN0cnNlcCgmc3RyLCAiLyIpOworICAgICAgICB9CisJcmV0dXJuIGNudDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgb2ZmIHRoZSBzdHJpbmcgc3RyLgorICovCitzdGF0aWMgY2hhciogc3Ryc3RyaXAgKGNoYXIgKnN0ciwgY2hhciogcykKK3sKKyAgICAgICAgY2hhciAqZW9zID0gc3RyICsgc3RybGVuKHN0cik7ICAgICAgICAgIC8qIC0+IGVuZCBvZiBzdHJpbmcgKi8KKworICAgICAgICB3aGlsZSAoKnN0ciAmJiBzdHJjaHIocywgKnN0cikpCisgICAgICAgICAgICAgICAgKytzdHIgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdHJpcCBsZWFkaW5nIHNwYWNlcyAqLworICAgICAgICA7CisgICAgICAgIHdoaWxlICgoZW9zID4gc3RyKSAmJiBzdHJjaHIocywgKihlb3MgLSAxKSkpCisgICAgICAgICAgICAgICAgLS1lb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdHJpcCB0cmFpbGluZyBzcGFjZXMgKi8KKyAgICAgICAgOworICAgICAgICAqZW9zID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIHN0cjsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29uZmlndXJlIFBQUCBmaXJtd2FyZS4KKyAqLworc3RhdGljIGludCBwcHBfY29uZmlndXJlKHNkbGFfdCAqY2FyZCwgdm9pZCAqZGF0YSkKK3sKKwlwcHBfbWJveF90ICptYiA9IGNhcmQtPm1ib3g7CisJaW50IGRhdGFfbGVuID0gc2l6ZW9mKHBwcDUwOF9jb25mX3QpOyAKKwlpbnQgZXJyOworCisJbWVtc2V0KCZtYi0+Y21kLCAwLCBzaXplb2YocHBwX2NtZF90KSk7CisJbWVtY3B5KG1iLT5kYXRhLCBkYXRhLCBkYXRhX2xlbik7CisJbWItPmNtZC5sZW5ndGggID0gZGF0YV9sZW47CisJbWItPmNtZC5jb21tYW5kID0gUFBQX1NFVF9DT05GSUc7CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisKKwlpZiAoZXJyICE9IENNRF9PSykgCisJCXBwcF9lcnJvcihjYXJkLCBlcnIsIG1iKTsKKwkKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBpbnRlcnJ1cHQgbW9kZS4KKyAqLworc3RhdGljIGludCBwcHBfc2V0X2ludHJfbW9kZShzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGNoYXIgbW9kZSkKK3sKKwlwcHBfbWJveF90ICptYiA9IGNhcmQtPm1ib3g7CisgICAgICAgIHBwcF9pbnRyX2luZm9fdCAqcHBwX2ludHJfZGF0YSA9IChwcHBfaW50cl9pbmZvX3QgKikgJm1iLT5kYXRhWzBdOworCWludCBlcnI7CisKKwltZW1zZXQoJm1iLT5jbWQsIDAsIHNpemVvZihwcHBfY21kX3QpKTsKKwlwcHBfaW50cl9kYXRhLT5pX2VuYWJsZSA9IG1vZGU7CisKKwlwcHBfaW50cl9kYXRhLT5pcnEgPSBjYXJkLT5ody5pcnE7CisJbWItPmNtZC5sZW5ndGggPSAyOworCisgICAgICAgLyogSWYgdGltZXIgaGFzIGJlZW4gZW5hYmxlZCwgc2V0IHRoZSB0aW1lciBkZWxheSB0byAxc2VjICovCisgICAgICAgaWYgKG1vZGUgJiAweDgwKXsKKyAgICAgICAJCXBwcF9pbnRyX2RhdGEtPnRpbWVyX2xlbiA9IDI1MDsgLy81Oy8vMTAwOyAvLzI1MDsKKyAgICAgICAgICAgICAgICBtYi0+Y21kLmxlbmd0aCA9IDQ7CisgICAgICAgIH0KKwkKKwltYi0+Y21kLmNvbW1hbmQgPSBQUFBfU0VUX0lOVFJfRkxBR1M7CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJCisJaWYgKGVyciAhPSBDTURfT0spIAorCQlwcHBfZXJyb3IoY2FyZCwgZXJyLCBtYik7CisgCQkKKworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRW5hYmxlIGNvbW11bmljYXRpb25zLgorICovCitzdGF0aWMgaW50IHBwcF9jb21tX2VuYWJsZShzZGxhX3QgKmNhcmQpCit7CisJcHBwX21ib3hfdCAqbWIgPSBjYXJkLT5tYm94OworCWludCBlcnI7CisKKwltZW1zZXQoJm1iLT5jbWQsIDAsIHNpemVvZihwcHBfY21kX3QpKTsKKwltYi0+Y21kLmNvbW1hbmQgPSBQUFBfQ09NTV9FTkFCTEU7CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJCisJaWYgKGVyciAhPSBDTURfT0spIAorCQlwcHBfZXJyb3IoY2FyZCwgZXJyLCBtYik7CisJZWxzZQkKKwkJY2FyZC0+dS5wLmNvbW1fZW5hYmxlZCA9IDE7CQorCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEaXNhYmxlIGNvbW11bmljYXRpb25zLgorICovCitzdGF0aWMgaW50IHBwcF9jb21tX2Rpc2FibGUoc2RsYV90ICpjYXJkKQoreworCXBwcF9tYm94X3QgKm1iID0gY2FyZC0+bWJveDsKKwlpbnQgZXJyOworCisJbWVtc2V0KCZtYi0+Y21kLCAwLCBzaXplb2YocHBwX2NtZF90KSk7CisJbWItPmNtZC5jb21tYW5kID0gUFBQX0NPTU1fRElTQUJMRTsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyICE9IENNRF9PSykgCisJCXBwcF9lcnJvcihjYXJkLCBlcnIsIG1iKTsKKwllbHNlCisJCWNhcmQtPnUucC5jb21tX2VuYWJsZWQgPSAwOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBwcHBfY29tbV9kaXNhYmxlX3NodXRkb3duKHNkbGFfdCAqY2FyZCkKK3sKKwlwcHBfbWJveF90ICptYiA9IGNhcmQtPm1ib3g7CisJcHBwX2ludHJfaW5mb190ICpwcHBfaW50cl9kYXRhOworCWludCBlcnI7CisKKwlpZiAoIW1iKXsKKwkJcmV0dXJuIDE7CisJfQorCQorCXBwcF9pbnRyX2RhdGEgPSAocHBwX2ludHJfaW5mb190ICopICZtYi0+ZGF0YVswXTsKKwkKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJbWVtc2V0KCZtYi0+Y21kLCAwLCBzaXplb2YocHBwX2NtZF90KSk7CisJcHBwX2ludHJfZGF0YS0+aV9lbmFibGUgPSAwOworCisJcHBwX2ludHJfZGF0YS0+aXJxID0gY2FyZC0+aHcuaXJxOworCW1iLT5jbWQubGVuZ3RoID0gMjsKKworCW1iLT5jbWQuY29tbWFuZCA9IFBQUF9TRVRfSU5UUl9GTEFHUzsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKworCS8qIERpc2FibGUgY29tbXVuaWNhdGlub25zICovCisJbWVtc2V0KCZtYi0+Y21kLCAwLCBzaXplb2YocHBwX2NtZF90KSk7CisJbWItPmNtZC5jb21tYW5kID0gUFBQX0NPTU1fRElTQUJMRTsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKworCWNhcmQtPnUucC5jb21tX2VuYWJsZWQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEdldCBjb21tdW5pY2F0aW9ucyBlcnJvciBzdGF0aXN0aWNzLgorICovCitzdGF0aWMgaW50IHBwcF9nZXRfZXJyX3N0YXRzKHNkbGFfdCAqY2FyZCkKK3sKKwlwcHBfbWJveF90ICptYiA9IGNhcmQtPm1ib3g7CisJaW50IGVycjsKKworCW1lbXNldCgmbWItPmNtZCwgMCwgc2l6ZW9mKHBwcF9jbWRfdCkpOworCW1iLT5jbWQuY29tbWFuZCA9IFBQUF9SRUFEX0VSUk9SX1NUQVRTOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCQorCWlmIChlcnIgPT0gQ01EX09LKSB7CisJCQorCQlwcHBfZXJyX3N0YXRzX3QqIHN0YXRzID0gKHZvaWQqKW1iLT5kYXRhOworCQljYXJkLT53YW5kZXYuc3RhdHMucnhfb3Zlcl9lcnJvcnMgICAgPSBzdGF0cy0+cnhfb3ZlcnJ1bjsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2NyY19lcnJvcnMgICAgID0gc3RhdHMtPnJ4X2JhZF9jcmM7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICA9IHN0YXRzLT5yeF9hYm9ydDsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgID0gc3RhdHMtPnJ4X2xvc3Q7CisJCWNhcmQtPndhbmRldi5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9IHN0YXRzLT50eF9hYm9ydDsKKwkKKwl9IGVsc2UgCisJCXBwcF9lcnJvcihjYXJkLCBlcnIsIG1iKTsKKwkKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgcGFja2V0LgorICoJUmV0dXJuOgkwIC0gby5rLgorICoJCTEgLSBubyB0cmFuc21pdCBidWZmZXJzIGF2YWlsYWJsZQorICovCitzdGF0aWMgaW50IHBwcF9zZW5kIChzZGxhX3QgKmNhcmQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgcHJvdG8pCit7CisJcHBwX2J1Zl9jdGxfdCAqdHhidWYgPSBjYXJkLT51LnAudHhidWY7CisKKwlpZiAodHhidWYtPmZsYWcpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisJCisJc2RsYV9wb2tlKCZjYXJkLT5odywgdHhidWYtPmJ1Zi5wdHIsIGRhdGEsIGxlbik7CisKKwl0eGJ1Zi0+bGVuZ3RoID0gbGVuOwkJLyogZnJhbWUgbGVuZ3RoICovCisJCisJaWYgKHByb3RvID09IGh0b25zKEVUSF9QX0lQWCkpCisJCXR4YnVmLT5wcm90byA9IDB4MDE7CS8qIHByb3RvY29sIElEICovCisJZWxzZQorCQl0eGJ1Zi0+cHJvdG8gPSAweDAwOwkvKiBwcm90b2NvbCBJRCAqLworCQorCXR4YnVmLT5mbGFnID0gMTsJCS8qIHN0YXJ0IHRyYW5zbWlzc2lvbiAqLworCisJLyogVXBkYXRlIHRyYW5zbWl0IGJ1ZmZlciBjb250cm9sIGZpZWxkcyAqLworCWNhcmQtPnUucC50eGJ1ZiA9ICsrdHhidWY7CisKKwlpZiAoKHZvaWQqKXR4YnVmID4gY2FyZC0+dS5wLnR4YnVmX2xhc3QpCisJCWNhcmQtPnUucC50eGJ1ZiA9IGNhcmQtPnUucC50eGJ1Zl9iYXNlOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKiogRmlybXdhcmUgRXJyb3IgSGFuZGxlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZpcm13YXJlIGVycm9yIGhhbmRsZXIuCisgKglUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW5ldmVyIGZpcm13YXJlIGNvbW1hbmQgcmV0dXJucyBub24temVybworICoJcmV0dXJuIGNvZGUuCisgKgorICogUmV0dXJuIHplcm8gaWYgcHJldmlvdXMgY29tbWFuZCBoYXMgdG8gYmUgY2FuY2VsbGVkLgorICovCitzdGF0aWMgaW50IHBwcF9lcnJvcihzZGxhX3QgKmNhcmQsIGludCBlcnIsIHBwcF9tYm94X3QgKm1iKQoreworCXVuc2lnbmVkIGNtZCA9IG1iLT5jbWQuY29tbWFuZDsKKworCXN3aXRjaCAoZXJyKSB7CisKKwkJY2FzZSBDTURfVElNRU9VVDoKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvbW1hbmQgMHglMDJYIHRpbWVkIG91dCFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSwgY21kKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogY29tbWFuZCAweCUwMlggcmV0dXJuZWQgMHglMDJYIVxuIgorCQkJCSwgY2FyZC0+ZGV2bmFtZSwgY21kLCBlcnIpOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqIEludGVycnVwdCBIYW5kbGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQUFAgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQgd3BwX2lzciAoc2RsYV90ICpjYXJkKQoreworCXBwcF9mbGFnc190ICpmbGFncyA9IGNhcmQtPmZsYWdzOworCWNoYXIgKnB0ciA9ICZmbGFncy0+aWZsYWc7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGNhcmQtPndhbmRldi5kZXY7CisJaW50IGk7CisKKwljYXJkLT5pbl9pc3IgPSAxOworCSsrY2FyZC0+c3RhdGlzdGljcy5pc3JfZW50cnk7CisKKwlpZiAoIWRldiAmJiBmbGFncy0+aWZsYWcgIT0gUFBQX0lOVFJfQ01EKXsKKwkJY2FyZC0+aW5faXNyID0gMDsKKwkJZmxhZ3MtPmlmbGFnID0gMDsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAodGVzdF9iaXQoUEVSSV9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpIHsKKwkJY2FyZC0+aW5faXNyID0gMDsKKwkJZmxhZ3MtPmlmbGFnID0gMDsKKwkJcmV0dXJuOworCX0KKwkKKwkKKwlpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCl7CisJCWlmICh0ZXN0X2JpdChTRU5EX0NSSVQsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSkgeworCQkJKytjYXJkLT5zdGF0aXN0aWNzLmlzcl9hbHJlYWR5X2NyaXRpY2FsOworCQkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBDcml0aWNhbCB3aGlsZSBpbiBJU1IhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCWNhcmQtPmluX2lzciA9IDA7CisJCQlmbGFncy0+aWZsYWcgPSAwOworCQkJcmV0dXJuOworCQl9CisJfQorCisJc3dpdGNoIChmbGFncy0+aWZsYWcpIHsKKworCQljYXNlIFBQUF9JTlRSX1JYUkRZOgkvKiByZWNlaXZlIGludGVycnVwdCAgMHgwMSAgKGJpdCAwKSovCisJCQkrK2NhcmQtPnN0YXRpc3RpY3MuaXNyX3J4OworCQkJcnhfaW50cihjYXJkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUFBQX0lOVFJfVFhSRFk6CS8qIHRyYW5zbWl0IGludGVycnVwdCAgMHgwMiAoYml0IDEpKi8KKwkJCSsrY2FyZC0+c3RhdGlzdGljcy5pc3JfdHg7CisJCQlmbGFncy0+aW1hc2sgJj0gflBQUF9JTlRSX1RYUkRZOworCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQUFBfSU5UUl9DTUQ6ICAgICAgLyogaW50ZXJmYWNlIGNvbW1hbmQgY29tcGxldGVkICovCisJCQkrK0ludHJfdGVzdF9jb3VudGVyOworCQkJKytjYXJkLT5zdGF0aXN0aWNzLmlzcl9pbnRyX3Rlc3Q7CisJCQlicmVhazsKKworCQljYXNlIFBQUF9JTlRSX01PREVNOiAgICAvKiBtb2RlbSBzdGF0dXMgY2hhbmdlIChEQ0QsIENUUykgMHgwNCAoYml0IDIpKi8KKwkJY2FzZSBQUFBfSU5UUl9ESVNDOiAgCS8qIERhdGEgbGluayBkaXNjb25uZWN0ZWQgMHgxMCAgKGJpdCA0KSovCQorCQljYXNlIFBQUF9JTlRSX09QRU46ICAgCS8qIERhdGEgbGluayBvcGVuIDB4MjAgIChiaXQgNSkqLworCQljYXNlIFBQUF9JTlRSX0RST1BfRFRSOgkvKiBEVFIgZHJvcCB0aW1lb3V0IGV4cGlyZWQgIDB4NDAgYml0IDYgKi8KKwkJCWV2ZW50X2ludHIoY2FyZCk7CisJCQlicmVhazsKKwkKKwkJY2FzZSBQUFBfSU5UUl9USU1FUjoKKwkJCXRpbWVyX2ludHIoY2FyZCk7CisJCQlicmVhazsJIAorCisJCWRlZmF1bHQ6CS8qIHVuZXhwZWN0ZWQgaW50ZXJydXB0ICovCisJCQkrK2NhcmQtPnN0YXRpc3RpY3MuaXNyX3NwdXJpb3VzOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNwdXJpb3VzIGludGVycnVwdCAweCUwMlghXG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lLCBmbGFncy0+aWZsYWcpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElEIEJ5dGVzID0gIixjYXJkLT5kZXZuYW1lKTsKKwkgCQlmb3IoaSA9IDA7IGkgPCA4OyBpICsrKQorCQkJCXByaW50ayhLRVJOX0lORk8gIjB4JTAyWCAiLCAqKHB0ciArIDB4MjggKyBpKSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJcbiIpOwkKKwl9CisJCisJY2FyZC0+aW5faXNyID0gMDsKKwlmbGFncy0+aWZsYWcgPSAwOworCXJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZWNlaXZlIGludGVycnVwdCBoYW5kbGVyLgorICovCitzdGF0aWMgdm9pZCByeF9pbnRyKHNkbGFfdCAqY2FyZCkKK3sKKwlwcHBfYnVmX2N0bF90ICpyeGJ1ZiA9IGNhcmQtPnJ4bWI7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGNhcmQtPndhbmRldi5kZXY7CisJcHBwX3ByaXZhdGVfYXJlYV90ICpwcHBfcHJpdl9hcmVhOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgbGVuOworCXZvaWQgKmJ1ZjsKKwlpbnQgaTsKKyAgICAgICAgcHBwX2ZsYWdzX3QgKmZsYWdzID0gY2FyZC0+ZmxhZ3M7CisgICAgICAgIGNoYXIgKnB0ciA9ICZmbGFncy0+aWZsYWc7CisJaW50IHVkcF90eXBlOworCQorCisJaWYgKHJ4YnVmLT5mbGFnICE9IDB4MDEpIHsKKworCQlwcmludGsoS0VSTl9JTkZPIAorCQkJIiVzOiBjb3JydXB0ZWQgUnggYnVmZmVyIEAgMHglWCwgZmxhZyA9IDB4JTAyWCFcbiIsIAorCQkJY2FyZC0+ZGV2bmFtZSwgKHVuc2lnbmVkKXJ4YnVmLCByeGJ1Zi0+ZmxhZyk7CisJCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJRCBCeXRlcyA9ICIsY2FyZC0+ZGV2bmFtZSk7CisJIAkKKwkJZm9yKGkgPSAwOyBpIDwgODsgaSArKykKKwkJCXByaW50ayhLRVJOX0lORk8gIjB4JTAyWCAiLCAqKHB0ciArIDB4MjggKyBpKSk7CisJCXByaW50ayhLRVJOX0lORk8gIlxuIik7CQorCQkKKwkJKytjYXJkLT5zdGF0aXN0aWNzLnJ4X2ludHJfY29ycnVwdF9yeF9iZnI7CisKKworCQkvKiBCdWcgRml4OiBNYXIgNiAyMDAwCisgICAgICAgICAgICAgICAgICogSWYgd2UgZ2V0IGEgY29ycnVwdGVkIG1haWxib3gsIGl0IG1lYW5zIHRoYXQgZHJpdmVyIAorICAgICAgICAgICAgICAgICAqIGlzIG91dCBvZiBzeW5jIHdpdGggdGhlIGZpcm13YXJlLiBUaGVyZSBpcyBubyByZWNvdmVyeS4KKyAgICAgICAgICAgICAgICAgKiBJZiB3ZSBkb24ndCB0dXJuIG9mZiBhbGwgaW50ZXJydXB0cyBmb3IgdGhpcyBjYXJkCisgICAgICAgICAgICAgICAgICogdGhlIG1hY2hpbmUgd2lsbCBjcmFzaC4gCisgICAgICAgICAgICAgICAgICovCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDcml0aWNhbCByb3V0ZXIgZmFpbHVyZSAuLi4hISFcbiIsIGNhcmQtPmRldm5hbWUpOworCQlwcmludGsoS0VSTl9JTkZPICJQbGVhc2UgY29udGFjdCBTYW5nb21hIFRlY2hub2xvZ2llcyAhXG4iKTsKKwkJcHBwX3NldF9pbnRyX21vZGUoY2FyZCwwKTsKKwkJcmV0dXJuOworCX0KKyAgICAgIAorCWlmIChkZXYgJiYgbmV0aWZfcnVubmluZyhkZXYpICYmIGRldi0+cHJpdil7CisJCisJCWxlbiAgPSByeGJ1Zi0+bGVuZ3RoOworCQlwcHBfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCisJCS8qIEFsbG9jYXRlIHNvY2tldCBidWZmZXIgKi8KKwkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOworCisJCWlmIChza2IgIT0gTlVMTCkgeworCQkKKwkJCS8qIENvcHkgZGF0YSB0byB0aGUgc29ja2V0IGJ1ZmZlciAqLworCQkJdW5zaWduZWQgYWRkciA9IHJ4YnVmLT5idWYucHRyOworCisJCQlpZiAoKGFkZHIgKyBsZW4pID4gY2FyZC0+dS5wLnJ4X3RvcCArIDEpIHsKKwkJCQorCQkJCXVuc2lnbmVkIHRtcCA9IGNhcmQtPnUucC5yeF90b3AgLSBhZGRyICsgMTsKKwkJCQlidWYgPSBza2JfcHV0KHNrYiwgdG1wKTsKKwkJCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCBhZGRyLCBidWYsIHRtcCk7CisJCQkJYWRkciA9IGNhcmQtPnUucC5yeF9iYXNlOworCQkJCWxlbiAtPSB0bXA7CisJCQl9CisJCQlidWYgPSBza2JfcHV0KHNrYiwgbGVuKTsKKwkJCXNkbGFfcGVlaygmY2FyZC0+aHcsIGFkZHIsIGJ1ZiwgbGVuKTsKKworCQkJLyogRGVjYXBzdWxhdGUgcGFja2V0ICovCisgICAgICAgIAkJc3dpdGNoIChyeGJ1Zi0+cHJvdG8pIHsKKwkKKwkJCQljYXNlIDB4MDA6CisJCQkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAweDAxOgorCQkJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVBYKTsKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCXVkcF90eXBlID0gdWRwX3BrdF90eXBlKCBza2IsIGNhcmQgKTsKKworCQkJaWYgKHVkcF90eXBlID09IFVEUF9QVFBJUEVfVFlQRSl7CisKKwkJCQkvKiBIYW5kbGUgYSBVRFAgUmVxdWVzdCBpbiBUaW1lciBJbnRlcnJ1cHQgKi8KKwkJCQlpZihzdG9yZV91ZHBfbWdtdF9wa3QoVURQX1BLVF9GUk1fTkVUV09SSywgY2FyZCwgc2tiLCBkZXYsCisgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkJcHBwX3ByaXZfYXJlYSkpeworCSAgICAgICAgICAgICAgIAkJCWZsYWdzLT5pbWFzayB8PSBQUFBfSU5UUl9USU1FUjsKKwkJCQl9CisJCQkJKytwcHBfcHJpdl9hcmVhLT5yeF9pbnRyX3N0YXQucnhfaW50cl9QSVBFX3JlcXVlc3Q7CisKKworCQkJfSBlbHNlIGlmIChoYW5kbGVfSVBYV0FOKHNrYi0+ZGF0YSxjYXJkLT5kZXZuYW1lLCAKKwkJCQkJCSBwcHBfcHJpdl9hcmVhLT5lbmFibGVfSVBYLCAKKwkJCQkJCSBwcHBfcHJpdl9hcmVhLT5uZXR3b3JrX251bWJlciwgCisJCQkJCQkgc2tiLT5wcm90b2NvbCkpIHsKKwkJCQorCQkJCS8qIEhhbmRsZSBhbiBJUFhXQU4gcGFja2V0ICovCisJCQkJaWYoIHBwcF9wcml2X2FyZWEtPmVuYWJsZV9JUFgpIHsKKwkJCQkJCisJCQkJCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgbm90IGFscmVhZHkgc2VuZGluZyAqLworCQkJCQlpZiAoIXRlc3RfYml0KFNFTkRfQ1JJVCwgJmNhcmQtPndhbmRldi5jcml0aWNhbCkpeworCQkJCQkgCXBwcF9zZW5kKGNhcmQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIGh0b25zKEVUSF9QX0lQWCkpOworCQkJCQl9CisJCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisKKwkJCQl9IGVsc2UgeworCQkJCQkrK2NhcmQtPndhbmRldi5zdGF0cy5yeF9kcm9wcGVkOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogUGFzcyBkYXRhIHVwIHRoZSBwcm90b2NvbCBzdGFjayAqLworCSAgICAJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2ItPm1hYy5yYXcgID0gc2tiLT5kYXRhOworCisJCQkgICAgCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X3BhY2tldHM7CisJCQkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQkgICAgCQkrK3BwcF9wcml2X2FyZWEtPnJ4X2ludHJfc3RhdC5yeF9pbnRyX2Jmcl9wYXNzZWRfdG9fc3RhY2s7CQorCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCX0KKworCQl9IGVsc2UgeworCQorCQkJaWYgKG5ldF9yYXRlbGltaXQoKSl7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIHNvY2tldCBidWZmZXJzIGF2YWlsYWJsZSFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJfQorCQkJKytjYXJkLT53YW5kZXYuc3RhdHMucnhfZHJvcHBlZDsKKwkJCSsrcHBwX3ByaXZfYXJlYS0+cnhfaW50cl9zdGF0LnJ4X2ludHJfbm9fc29ja2V0OworCQl9CisKKwl9IGVsc2UgeworCQkrK2NhcmQtPnN0YXRpc3RpY3MucnhfaW50cl9kZXZfbm90X3N0YXJ0ZWQ7CisJfQorCisJLyogUmVsZWFzZSBidWZmZXIgZWxlbWVudCBhbmQgY2FsY3VsYXRlIGEgcG9pbnRlciB0byB0aGUgbmV4dCBvbmUgKi8KKwlyeGJ1Zi0+ZmxhZyA9IDB4MDA7CisJY2FyZC0+cnhtYiA9ICsrcnhidWY7CisJaWYgKCh2b2lkKilyeGJ1ZiA+IGNhcmQtPnUucC5yeGJ1Zl9sYXN0KQorCQljYXJkLT5yeG1iID0gY2FyZC0+dS5wLnJ4YnVmX2Jhc2U7Cit9CisKKwordm9pZCBldmVudF9pbnRyIChzZGxhX3QgKmNhcmQpCit7CisKKyAJc3RydWN0IG5ldF9kZXZpY2UqIGRldiA9IGNhcmQtPndhbmRldi5kZXY7CisgICAgICAgIHBwcF9wcml2YXRlX2FyZWFfdCogcHBwX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwl2b2xhdGlsZSBwcHBfZmxhZ3NfdCAqZmxhZ3MgPSBjYXJkLT5mbGFnczsKKworCXN3aXRjaCAoZmxhZ3MtPmlmbGFnKXsKKworCQljYXNlIFBQUF9JTlRSX01PREVNOiAgICAvKiBtb2RlbSBzdGF0dXMgY2hhbmdlIChEQ0QsIENUUykgMHgwNCAgKGJpdCAyKSovCisKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpeworCQkJCXByaW50ayAoS0VSTl9JTkZPICIlczogTW9kZW0gc3RhdHVzOiBEQ0Q9JXMgQ1RTPSVzXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lLCBEQ0QoZmxhZ3MtPm1zdGF0dXMpLCBDVFMoZmxhZ3MtPm1zdGF0dXMpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUFBQX0lOVFJfRElTQzogIAkvKiBEYXRhIGxpbmsgZGlzY29ubmVjdGVkIDB4MTAgIChiaXQgNCkqLwkKKworCQkJTkVYX1BSSU5USyAoS0VSTl9JTkZPICJEYXRhIGxpbmsgZGlzY29ubmVjdGVkIGludHIgQ2F1c2UgJVhcbiIsCisJCQkJCSAgICAgICBmbGFncy0+ZGlzY19jYXVzZSk7CisKKwkJCWlmIChmbGFncy0+ZGlzY19jYXVzZSAmCisJCQkJKFBQUF9MT0NBTF9URVJNSU5BVElPTiB8IFBQUF9EQ0RfQ1RTX0RST1AgfAorCQkJCVBQUF9SRU1PVEVfVEVSTUlOQVRJT04pKSB7CisKKwkJCQlpZiAoY2FyZC0+dS5wLmlwX21vZGUgPT0gV0FOT1BUX1BQUF9QRUVSKSB7IAorCQkJCQlzZXRfYml0KDAsJlJlYWRfY29ubmVjdGlvbl9pbmZvKTsKKwkJCQl9CisJCQkJd2FucGlwZV9zZXRfc3RhdGUoY2FyZCwgV0FOX0RJU0NPTk5FQ1RFRCk7CisKKwkJCQlzaG93X2Rpc2NfY2F1c2UoY2FyZCwgZmxhZ3MtPmRpc2NfY2F1c2UpOworCQkJCXBwcF9wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9QUFBfRVZFTlQ7CisJCQkJZmxhZ3MtPmltYXNrIHw9IFBQUF9JTlRSX1RJTUVSOworCQkJCXRyaWdnZXJfcHBwX3BvbGwoZGV2KTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUFBQX0lOVFJfT1BFTjogICAJLyogRGF0YSBsaW5rIG9wZW4gMHgyMCAgKGJpdCA1KSovCisKKwkJCU5FWF9QUklOVEsgKEtFUk5fSU5GTyAiJXM6IFBQUCBMaW5rIE9wZW4sIExDUD0lcyBJUD0lc1xuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSxMQ1AoZmxhZ3MtPmxjcF9zdGF0ZSksCisJCQkJCUlQKGZsYWdzLT5pcF9zdGF0ZSkpOworCisJCQlpZiAoZmxhZ3MtPmxjcF9zdGF0ZSA9PSAweDA5ICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzLT5pcF9zdGF0ZSA9PSAweDA5IHx8IGZsYWdzLT5pcHhfc3RhdGUgPT0gMHgwOSkpeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIHBvbGxpbmcgdGltZXIgYW5kIHNldCB0aGUgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gV0FOX0NPTk5ORUNURUQgKi8KKworCisJCQkJLyogQlVHIEZJWDogV2hlbiB0aGUgcHJvdG9jb2wgcmVzdGFydHMsIGR1cmluZyBoZWF2eSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdHJhZmZpYywgYm9hcmQgdHggYnVmZmVycyBhbmQgZHJpdmVyIHR4IGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY2FuIGdvIG91dCBvZiBzeW5jLiAgVGhpcyBjaGVja3MgdGhlIGNvbmRpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgaWYgdGhlIHR4IGJ1ZmZlcnMgYXJlIG91dCBvZiBzeW5jLCB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHByb3RvY29scyBhcmUgcmVzdGFydGVkLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSSBkb24ndCBrbm93IHdoeSB0aGUgYm9hcmQgdHggYnVmZmVyIGlzIG91dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiBzeW5jLiBJdCBjb3VsZCBiZSB0aGF0IGEgcGFja2V0cyBpcyB0eAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3aGlsZSB0aGUgbGluayBpcyBkb3duLCBidXQgdGhhdCBpcyBub3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBvc3NpYmxlLiBUaGUgb3RoZXIgcG9zc2libGlsaXR5IGlzIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpcm13YXJlIGRvZXNuJ3QgcmVpbml0aWFsaXplIHByb3Blcmx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBGSVhNRTogQSBiZXR0ZXIgZml4IHNob3VsZCBiZSBmb3VuZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIAorCQkJCWlmIChkZXRlY3RfYW5kX2ZpeF90eF9idWcoY2FyZCkpeworCisJCQkJCXBwcF9jb21tX2Rpc2FibGUoY2FyZCk7CisKKwkJCQkJd2FucGlwZV9zZXRfc3RhdGUoY2FyZCwgV0FOX0RJU0NPTk5FQ1RFRCk7CisKKwkJCQkJcHBwX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgfD0gCisJCQkJCQlUTVJfSU5UX0VOQUJMRURfUFBQX0VWRU5UOworCQkJCQlmbGFncy0+aW1hc2sgfD0gUFBQX0lOVFJfVElNRVI7CisJCQkJCWJyZWFrOwkKKwkJCQl9CisKKwkJCQljYXJkLT5zdGF0ZV90aWNrID0gamlmZmllczsKKwkJCQl3YW5waXBlX3NldF9zdGF0ZShjYXJkLCBXQU5fQ09OTkVDVEVEKTsKKworCQkJCU5FWF9QUklOVEsoS0VSTl9JTkZPICJDT046IEwgVHg6ICVseCAgQiBUeDogJWx4IHx8IEwgUnggJWx4IEIgUnggJWx4XG4iLAorCQkJCQkodW5zaWduZWQgbG9uZyljYXJkLT51LnAudHhidWYsICpjYXJkLT51LnAudHhidWZfbmV4dCwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpY2FyZC0+cnhtYiwgKmNhcmQtPnUucC5yeGJ1Zl9uZXh0KTsKKworCQkJCS8qIFRlbGwgdGltZXIgaW50ZXJydXB0IHRoYXQgUFBQIGV2ZW50IG9jY3VycmVkICovCisJCQkJcHBwX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgfD0gVE1SX0lOVF9FTkFCTEVEX1BQUF9FVkVOVDsKKwkJCQlmbGFncy0+aW1hc2sgfD0gUFBQX0lOVFJfVElNRVI7CisKKwkJCQkvKiBJZiB3ZSBhcmUgaW4gUEVFUiBtb2RlLCB3ZSBtdXN0IGZpcnN0IG9idGFpbiB0aGUKKwkJCQkgKiBJUCBpbmZvcm1hdGlvbiBhbmQgdGhlbiBnbyBpbnRvIHRoZSBwb2xsIHJvdXRpbmUgKi8KKwkJCQlpZiAoY2FyZC0+dS5wLmlwX21vZGUgIT0gV0FOT1BUX1BQUF9QRUVSKXsJCisJCQkJCXRyaWdnZXJfcHBwX3BvbGwoZGV2KTsKKwkJCQl9CisJCQl9CisgICAgICAgICAgICAgICAgICAgCWJyZWFrOworCisJCWNhc2UgUFBQX0lOVFJfRFJPUF9EVFI6CQkvKiBEVFIgZHJvcCB0aW1lb3V0IGV4cGlyZWQgIDB4NDAgYml0IDYgKi8KKworCQkJTkVYX1BSSU5USyhLRVJOX0lORk8gIkRUUiBEcm9wIFRpbWVvdXQgSW50ZXJycnVwdCBcbiIpOyAKKworCQkJaWYgKGNhcmQtPnUucC5pcF9tb2RlID09IFdBTk9QVF9QUFBfUEVFUikgeyAKKwkJCQlzZXRfYml0KDAsJlJlYWRfY29ubmVjdGlvbl9pbmZvKTsKKwkJCX0KKwkJCisJCQl3YW5waXBlX3NldF9zdGF0ZShjYXJkLCBXQU5fRElTQ09OTkVDVEVEKTsKKworCQkJc2hvd19kaXNjX2NhdXNlKGNhcmQsIGZsYWdzLT5kaXNjX2NhdXNlKTsKKwkJCXBwcF9wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9QUFBfRVZFTlQ7CisJCQlmbGFncy0+aW1hc2sgfD0gUFBQX0lOVFJfVElNRVI7CisJCQl0cmlnZ2VyX3BwcF9wb2xsKGRldik7CisJCQlicmVhazsKKwkJCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRXJyb3IsIEludmFsaWQgUFBQIEV2ZW50XG4iLGNhcmQtPmRldm5hbWUpOworCX0KK30KKworCisKKy8qIFRJTUVSIElOVEVSUlVQVCAqLworCit2b2lkIHRpbWVyX2ludHIgKHNkbGFfdCAqY2FyZCkKK3sKKworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSogZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKyAgICAgICAgcHBwX3ByaXZhdGVfYXJlYV90KiBwcHBfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCXBwcF9mbGFnc190ICpmbGFncyA9IGNhcmQtPmZsYWdzOworCisKKwlpZiAocHBwX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfQ09ORklHKXsKKwkJaWYgKCFjb25maWdfcHBwKGNhcmQpKXsKKwkJCXBwcF9wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICY9IAorCQkJCQl+VE1SX0lOVF9FTkFCTEVEX0NPTkZJRzsJCisJCX0KKwl9CisKKwkvKiBVcGRhdGUgc3RhdGlzdGljcyAqLworCWlmIChwcHBfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9VUERBVEUpeworCQlwcHBfZ2V0X2Vycl9zdGF0cyhjYXJkKTsKKyAgICAgICAgICAgICAgICBpZighKC0tcHBwX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzKSl7CisJCQlwcHBfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmPSAKKwkJCQl+VE1SX0lOVF9FTkFCTEVEX1VQREFURTsKKwkJfQorCX0KKworCS8qIFBQSVBFTU9OIFVEUCByZXF1ZXN0ICovCisKKwlpZiAocHBwX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfVURQKXsKKwkJcHJvY2Vzc191ZHBfbWdtdF9wa3QoY2FyZCxkZXYsIHBwcF9wcml2X2FyZWEpOworCQlwcHBfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmPSB+VE1SX0lOVF9FTkFCTEVEX1VEUDsKKwl9CisKKwkvKiBQUFAgRXZlbnQgKi8KKwlpZiAocHBwX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfUFBQX0VWRU5UKXsKKworCQlpZiAoY2FyZC0+d2FuZGV2LnN0YXRlID09IFdBTl9ESVNDT05ORUNURUQpeworCQkJcmV0cmlnZ2VyX2NvbW0oY2FyZCk7CisJCX0KKworCQkvKiBJZiB0aGUgc3RhdGUgaXMgQ09OTkVDVElORywgaXQgbWVhbnMgdGhhdCBjb21tdW5pY2F0aW5zIHdlcmUKKwkgCSAqIGVuYWJsZWQuIFdoZW4gdGhlIHJlbW90ZSBzaWRlIGVuYWJsZXMgaXRzIGNvbW1pbmljYXRpb24gd2UKKwkgCSAqIHNob3VsZCBnZXQgYW4gaW50ZXJydXB0IFBQUF9JTlRSX09QRU4sIHRodXMgdHVybiBvZmYgcG9sbGluZyAKKwkJICovCisKKwkJZWxzZSBpZiAoY2FyZC0+d2FuZGV2LnN0YXRlID09IFdBTl9DT05ORUNUSU5HKXsKKwkJCS8qIFR1cm4gb2ZmIHRoZSB0aW1lciBpbnRlcnJ1cHQgKi8KKwkJCXBwcF9wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfUFBQX0VWRU5UOworCQl9CisKKwkJLyogSWYgc3RhdGUgaXMgY29ubmVjdGVkIGFuZCB3ZSBhcmUgaW4gUEVFUiBtb2RlIAorCSAJICogcG9sbCBmb3IgYW4gSVAgYWRkcmVzcyB3aGljaCB3aWxsIGJlIHByb3ZpZGVkIGJ5IHJlbW90ZSBlbmQuCisJIAkgKi8KKwkJZWxzZSBpZiAoKGNhcmQtPndhbmRldi5zdGF0ZSA9PSBXQU5fQ09OTkVDVEVEICYmIAorCQkgIAkgIGNhcmQtPnUucC5pcF9tb2RlID09IFdBTk9QVF9QUFBfUEVFUikgJiYgCisJCSAgCSAgdGVzdF9iaXQoMCwmUmVhZF9jb25uZWN0aW9uX2luZm8pKXsKKworCQkJY2FyZC0+c3RhdGVfdGljayA9IGppZmZpZXM7CisJCQlpZiAocmVhZF9jb25uZWN0aW9uX2luZm8gKGNhcmQpKXsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogRmFpbGVkIHRvIHJlYWQgUEVFUiBJUCBBZGRyZXNzZXNcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJfWVsc2V7CisJCQkJY2xlYXJfYml0KDAsJlJlYWRfY29ubmVjdGlvbl9pbmZvKTsKKwkJCQlzZXRfYml0KDEsJlJlYWRfY29ubmVjdGlvbl9pbmZvKTsKKwkJCQl0cmlnZ2VyX3BwcF9wb2xsKGRldik7CisJCQl9CisJCX1lbHNleworCQkJLy9GSVhNRSBQdXQgdGhlIGNvbW1lbnQgYmFjayBpbnQKKwkJCXBwcF9wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfUFBQX0VWRU5UOworCQl9CisKKwl9LyogRW5kIG9mIFBQUF9FVkVOVCAqLworCisKKwkvKiBPbmx5IGRpc2FibGUgdGhlIHRpbWVyIGludGVycnVwdCBpZiB0aGVyZSBhcmUgbm8gdWRwLCBzdGF0aXN0aWMgKi8KKwkvKiB1cGRhdGVzIG9yIGV2ZW50cyBwZW5kaW5nICovCisgICAgICAgIGlmKCFwcHBfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCkgeworICAgICAgICAgICAgICAgIGZsYWdzLT5pbWFzayAmPSB+UFBQX0lOVFJfVElNRVI7CisgICAgICAgIH0KK30KKworCitzdGF0aWMgaW50IGhhbmRsZV9JUFhXQU4odW5zaWduZWQgY2hhciAqc2VuZHBhY2tldCwgY2hhciAqZGV2bmFtZSwgdW5zaWduZWQgY2hhciBlbmFibGVfSVBYLCB1bnNpZ25lZCBsb25nIG5ldHdvcmtfbnVtYmVyLCB1bnNpZ25lZCBzaG9ydCBwcm90bykKK3sKKwlpbnQgaTsKKworCWlmKCBwcm90byA9PSBodG9ucyhFVEhfUF9JUFgpICkgeworCQkvL0l0J3MgYW4gSVBYIHBhY2tldAorCQlpZighZW5hYmxlX0lQWCkgeworCQkJLy9SZXR1cm4gMSBzbyB3ZSBkb24ndCBwYXNzIGl0IHVwIHRoZSBzdGFjay4KKwkJCXJldHVybiAxOworCQl9CisJfSBlbHNlIHsKKwkJLy9JdCdzIG5vdCBJUFggc28gcGFzcyBpdCB1cCB0aGUgc3RhY2suCisJCXJldHVybiAwOworCX0KKworCWlmKCBzZW5kcGFja2V0WzE2XSA9PSAweDkwICYmCisJICAgIHNlbmRwYWNrZXRbMTddID09IDB4MDQpCisJeworCQkvL0l0J3MgSVBYV0FOCisKKwkJaWYoIHNlbmRwYWNrZXRbMl0gPT0gMHgwMiAmJgorCQkgICAgc2VuZHBhY2tldFszNF0gPT0gMHgwMCkKKwkJeworCQkJLy9JdCdzIGEgdGltZXIgcmVxdWVzdCBwYWNrZXQKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZWNlaXZlZCBJUFhXQU4gVGltZXIgUmVxdWVzdCBwYWNrZXRcbiIsZGV2bmFtZSk7CisKKwkJCS8vR28gdGhyb3VnaCB0aGUgcm91dGluZyBvcHRpb25zIGFuZCBhbnN3ZXIgbm8gdG8gZXZlcnkKKwkJCS8vb3B0aW9uIGV4Y2VwdCBVbm51bWJlcmVkIFJJUC9TQVAKKwkJCWZvcihpID0gNDE7IHNlbmRwYWNrZXRbaV0gPT0gMHgwMDsgaSArPSA1KQorCQkJeworCQkJCS8vMHgwMiBpcyB0aGUgb3B0aW9uIGZvciBVbm51bWJlcmVkIFJJUC9TQVAKKwkJCQlpZiggc2VuZHBhY2tldFtpICsgNF0gIT0gMHgwMikKKwkJCQl7CisJCQkJCXNlbmRwYWNrZXRbaSArIDFdID0gMDsKKwkJCQl9CisJCQl9CisKKwkJCS8vU2tpcCBvdmVyIHRoZSBleHRlbmRlZCBOb2RlIElEIG9wdGlvbgorCQkJaWYoIHNlbmRwYWNrZXRbaV0gPT0gMHgwNCApCisJCQl7CisJCQkJaSArPSA4OworCQkJfQorCisJCQkvL1dlIGFsc28gd2FudCB0byB0dXJuIG9mZiBhbGwgaGVhZGVyIGNvbXByZXNzaW9uIG9wdC4KKwkJCWZvcig7IHNlbmRwYWNrZXRbaV0gPT0gMHg4MCA7KQorCQkJeworCQkJCXNlbmRwYWNrZXRbaSArIDFdID0gMDsKKwkJCQlpICs9IChzZW5kcGFja2V0W2kgKyAyXSA8PCA4KSArIChzZW5kcGFja2V0W2kgKyAzXSkgKyA0OworCQkJfQorCisJCQkvL1NldCB0aGUgcGFja2V0IHR5cGUgdG8gdGltZXIgcmVzcG9uc2UKKwkJCXNlbmRwYWNrZXRbMzRdID0gMHgwMTsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNlbmRpbmcgSVBYV0FOIFRpbWVyIFJlc3BvbnNlXG4iLGRldm5hbWUpOworCQl9CisJCWVsc2UgaWYoIHNlbmRwYWNrZXRbMzRdID09IDB4MDIgKQorCQl7CisJCQkvL1RoaXMgaXMgYW4gaW5mb3JtYXRpb24gcmVxdWVzdCBwYWNrZXQKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZWNlaXZlZCBJUFhXQU4gSW5mb3JtYXRpb24gUmVxdWVzdCBwYWNrZXRcbiIsZGV2bmFtZSk7CisKKwkJCS8vU2V0IHRoZSBwYWNrZXQgdHlwZSB0byBpbmZvcm1hdGlvbiByZXNwb25zZQorCQkJc2VuZHBhY2tldFszNF0gPSAweDAzOworCisJCQkvL1NldCB0aGUgcm91dGVyIG5hbWUKKwkJCXNlbmRwYWNrZXRbNTFdID0gJ1AnOworCQkJc2VuZHBhY2tldFs1Ml0gPSAnVCc7CisJCQlzZW5kcGFja2V0WzUzXSA9ICdQJzsKKwkJCXNlbmRwYWNrZXRbNTRdID0gJ0knOworCQkJc2VuZHBhY2tldFs1NV0gPSAnUCc7CisJCQlzZW5kcGFja2V0WzU2XSA9ICdFJzsKKwkJCXNlbmRwYWNrZXRbNTddID0gJy0nOworCQkJc2VuZHBhY2tldFs1OF0gPSBDVkhleFRvQXNjaWkobmV0d29ya19udW1iZXIgPj4gMjgpOworCQkJc2VuZHBhY2tldFs1OV0gPSBDVkhleFRvQXNjaWkoKG5ldHdvcmtfbnVtYmVyICYgMHgwRjAwMDAwMCk+PiAyNCk7CisJCQlzZW5kcGFja2V0WzYwXSA9IENWSGV4VG9Bc2NpaSgobmV0d29ya19udW1iZXIgJiAweDAwRjAwMDAwKT4+IDIwKTsKKwkJCXNlbmRwYWNrZXRbNjFdID0gQ1ZIZXhUb0FzY2lpKChuZXR3b3JrX251bWJlciAmIDB4MDAwRjAwMDApPj4gMTYpOworCQkJc2VuZHBhY2tldFs2Ml0gPSBDVkhleFRvQXNjaWkoKG5ldHdvcmtfbnVtYmVyICYgMHgwMDAwRjAwMCk+PiAxMik7CisJCQlzZW5kcGFja2V0WzYzXSA9IENWSGV4VG9Bc2NpaSgobmV0d29ya19udW1iZXIgJiAweDAwMDAwRjAwKT4+IDgpOworCQkJc2VuZHBhY2tldFs2NF0gPSBDVkhleFRvQXNjaWkoKG5ldHdvcmtfbnVtYmVyICYgMHgwMDAwMDBGMCk+PiA0KTsKKwkJCXNlbmRwYWNrZXRbNjVdID0gQ1ZIZXhUb0FzY2lpKG5ldHdvcmtfbnVtYmVyICYgMHgwMDAwMDAwRik7CisJCQlmb3IoaSA9IDY2OyBpIDwgOTk7IGkrPSAxKQorCQkJeworCQkJCXNlbmRwYWNrZXRbaV0gPSAwOworCQkJfQorCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogU2VuZGluZyBJUFhXQU4gSW5mb3JtYXRpb24gUmVzcG9uc2UgcGFja2V0XG4iLGRldm5hbWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVua25vd24gSVBYV0FOIHBhY2tldCFcbiIsZGV2bmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8vU2V0IHRoZSBXTm9kZUlEIHRvIG91ciBuZXR3b3JrIGFkZHJlc3MKKwkJc2VuZHBhY2tldFszNV0gPSAodW5zaWduZWQgY2hhcikobmV0d29ya19udW1iZXIgPj4gMjQpOworCQlzZW5kcGFja2V0WzM2XSA9ICh1bnNpZ25lZCBjaGFyKSgobmV0d29ya19udW1iZXIgJiAweDAwRkYwMDAwKSA+PiAxNik7CisJCXNlbmRwYWNrZXRbMzddID0gKHVuc2lnbmVkIGNoYXIpKChuZXR3b3JrX251bWJlciAmIDB4MDAwMEZGMDApID4+IDgpOworCQlzZW5kcGFja2V0WzM4XSA9ICh1bnNpZ25lZCBjaGFyKShuZXR3b3JrX251bWJlciAmIDB4MDAwMDAwRkYpOworCisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCS8vSWYgd2UgZ2V0IGhlcmUgaXQncyBhbiBJUFgtZGF0YSBwYWNrZXQsIHNvIGl0J2xsIGdldCBwYXNzZWQgdXAgdGhlIHN0YWNrLgorCisJCS8vc3dpdGNoIHRoZSBuZXR3b3JrIG51bWJlcnMKKwkJc3dpdGNoX25ldF9udW1iZXJzKHNlbmRwYWNrZXQsIG5ldHdvcmtfbnVtYmVyLCAxKTsJCisJCXJldHVybiAwOworCX0KK30KKworLyoqKioqKiBCYWNrZ3JvdW5kIFBvbGxpbmcgUm91dGluZXMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEFsbCBwb2xsaW5nIGZ1bmN0aW9ucyBhcmUgaW52b2tlZCBieSB0aGUgVElNRVIgaW50ZXJydXB0IGluIHRoZSB3cHBfaXNyIAorICogcm91dGluZS4gIAorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTW9uaXRvciBhY3RpdmUgbGluayBwaGFzZS4KKyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19yb3V0ZSAoc2RsYV90ICpjYXJkKQoreworCXBwcF9mbGFnc190ICpmbGFncyA9IGNhcmQtPmZsYWdzOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCXBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwkKKwlpZiAoKGNhcmQtPnUucC5pcF9tb2RlID09IFdBTk9QVF9QUFBfUEVFUikgJiYKKwkgICAgKGZsYWdzLT5pcF9zdGF0ZSA9PSAweDA5KSl7IAorCisJCS8qIFdlIGdldCBpcF9sb2NhbCBmcm9tIHRoZSBmaXJtd2FyZSBpbiBQRUVSIG1vZGUuCisJICAgICAgICAgKiBUaGVyZWZvcmUsIGlmIGlwX2xvY2FsIGlzIDAsIHdlIGZhaWxlZCB0byBvYnRhaW4KKyAgICAgICAgIAkgKiB0aGUgcmVtb3RlIElQIGFkZHJlc3MuICovCisJCWlmIChwcHBfcHJpdl9hcmVhLT5pcF9sb2NhbCA9PSAwKSAKKwkJCXJldHVybjsKKwkJCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJUENQIFN0YXRlIE9wZW5lZC5cbiIsIGNhcmQtPmRldm5hbWUpOworCQlpZiAocmVhZF9pbmZvKCBjYXJkICkpIHsKKyAgIAkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBBbiBlcnJvciBvY2N1cnJlZCBpbiBJUCBhc3NpZ25tZW50LlxuIiwgCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBkZXYtPmlwX3B0cjsKKwkJCWlmIChpbl9kZXYgIT0gTlVMTCApIHsKKwkJCQlzdHJ1Y3QgaW5faWZhZGRyICppZmEgPSBpbl9kZXYtPmlmYV9saXN0OworCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFzc2lnbmVkIExjbC4gQWRkcjogJXUuJXUuJXUuJXVcbiIsIAorCQkJCQljYXJkLT5kZXZuYW1lLCBOSVBRVUFEKGlmYS0+aWZhX2xvY2FsKSk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFzc2lnbmVkIFJtdC4gQWRkcjogJXUuJXUuJXUuJXVcbiIsIAorCQkJCQkJY2FyZC0+ZGV2bmFtZSwgTklQUVVBRChpZmEtPmlmYV9hZGRyZXNzKSk7CisJCQl9ZWxzZXsKKwkJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogRXJyb3I6IEZhaWxlZCB0byBhZGQgYSByb3V0ZSBmb3IgUFBQIGludGVyZmFjZSAlc1xuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSxkZXYtPm5hbWUpOwkKKwkJCX0KKwkJfQorCX0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBNb25pdG9yIHBoeXNpY2FsIGxpbmsgZGlzY29ubmVjdGVkIHBoYXNlLgorICogIG8gaWYgaW50ZXJmYWNlIGlzIHVwIGFuZCB0aGUgaG9sZC1kb3duIHRpbWVvdXQgaGFzIGV4cGlyZWQsIHRoZW4gcmV0cnkKKyAqICAgIGNvbm5lY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIHJldHJpZ2dlcl9jb21tKHNkbGFfdCAqY2FyZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKworCWlmIChkZXYgJiYgKChqaWZmaWVzIC0gY2FyZC0+c3RhdGVfdGljaykgPiBIT0xEX0RPV05fVElNRSkpIHsKKworCQl3YW5waXBlX3NldF9zdGF0ZShjYXJkLCBXQU5fQ09OTkVDVElORyk7CisKKwkJaWYocHBwX2NvbW1fZW5hYmxlKGNhcmQpID09IENNRF9PSyl7CisJCQlpbml0X3BwcF90eF9yeF9idWZmKCBjYXJkICk7CisJCX0JICAgICAgICAgCisJfQorfQorCisvKioqKioqIE1pc2NlbGxhbmVvdXMgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb25maWd1cmUgUzUwOCBhZGFwdGVyLgorICovCitzdGF0aWMgaW50IGNvbmZpZzUwOChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzZGxhX3QgKmNhcmQpCit7CisJcHBwNTA4X2NvbmZfdCBjZmc7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gZGV2LT5pcF9wdHI7CisJcHBwX3ByaXZhdGVfYXJlYV90ICpwcHBfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCisJLyogUHJlcGFyZSBQUFAgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgKi8KKwltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKHBwcDUwOF9jb25mX3QpKTsKKworCWlmIChjYXJkLT53YW5kZXYuY2xvY2tpbmcpCisJCWNmZy5saW5lX3NwZWVkID0gY2FyZC0+d2FuZGV2LmJwczsKKworCWlmIChjYXJkLT53YW5kZXYuaW50ZXJmYWNlID09IFdBTk9QVF9SUzIzMikKKwkJY2ZnLmNvbmZfZmxhZ3MgfD0gSU5URVJGQUNFX0xFVkVMX1JTMjMyOworCisKKyAgICAgICAgY2ZnLmNvbmZfZmxhZ3MgCXw9IERPTlRfVEVSTUlOQVRFX0xOS19NQVhfQ09ORklHOyAvKnNlbmQgQ29uZmlndXJlLVJlcXVlc3QgcGFja2V0cyBmb3JldmVyKi8KKwljZmcudHhidWZfcGVyY2VudAk9IFBFUkNFTlRfVFhfQlVGRjsJLyogJSBvZiBUeCBidWZzICovCisJY2ZnLm10dV9sb2NhbAkJPSBjYXJkLT53YW5kZXYubXR1OworCWNmZy5tdHVfcmVtb3RlCQk9IGNhcmQtPndhbmRldi5tdHU7ICAgICAgICAgICAgICAgICAgLyogICAgRGVmYXVsdCAgICovCisJY2ZnLnJlc3RhcnRfdG1yCQk9IFRJTUVfQkVUV0VFTl9DT05GX1JFUTsgIAkgICAgIC8qICAgIDMwID0gM3NlYyAqLworCWNmZy5hdXRoX3JzcnRfdG1yCT0gVElNRV9CRVRXRUVOX1BBUF9DSEFQX1JFUTsgICAgICAgICAvKiAgICAzMCA9IDNzZWMgKi8KKwljZmcuYXV0aF93YWl0X3Rtcgk9IFdBSVRfUEFQX0NIQVBfV0lUSE9VVF9SRVBMWTsgICAgICAgLyogICAzMDAgPSAzMHMgICovCisJY2ZnLm1kbV9mYWlsX3Rtcgk9IFdBSVRfQUZURVJfRENEX0NUU19MT1c7ICAgICAgICAgICAgLyogICAgIDUgPSAwLjVzICovCisJY2ZnLmR0cl9kcm9wX3Rtcgk9IFRJTUVfRENEX0NUU19MT1dfQUZURVJfTE5LX0RPV047ICAgLyogICAgMTAgPSAxcyAgICovCisJY2ZnLmNvbm5lY3RfdG1vdXQJPSBXQUlUX0RDRF9ISUdIX0FGVEVSX0VOQUJMRV9DT01NOyAgIC8qICAgOTAwID0gOTBzICAqLworCWNmZy5jb25mX3JldHJ5CQk9IE1BWF9DT05GX1JFUV9XSVRIT1VUX1JFUExZOyAgICAgICAgLyogICAgMTAgPSAxcyAgICovCisJY2ZnLnRlcm1fcmV0cnkJCT0gTUFYX1RFUk1fUkVRX1dJVEhPVVRfUkVQTFk7CSAgICAgLyogICAgIDIgdGltZXMgICovCisJY2ZnLmZhaWxfcmV0cnkJCT0gTlVNX0NPTkZfTkFLX1dJVEhPVVRfUkVQTFk7ICAgICAgICAvKiAgICAgNSB0aW1lcyAgKi8KKwljZmcuYXV0aF9yZXRyeQkJPSBOVU1fQVVUSF9SRVFfV0lUSE9VVF9SRVBMWTsgICAgICAgIC8qICAgICAxMCB0aW1lcyAqLyAgIAorCisKKwlpZiggIWNhcmQtPnUucC5hdXRoZW50aWNhdG9yICkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRGV2aWNlIGlzIG5vdCBjb25maWd1cmVkIGFzIGFuIGF1dGhlbnRpY2F0b3JcbiIsIAorCQkJCWNhcmQtPmRldm5hbWUpOworCQljZmcuYXV0aF9vcHRpb25zID0gTk9fQVVUSEVOVElDQVRJT047CisJfWVsc2V7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBEZXZpY2UgaXMgY29uZmlndXJlZCBhcyBhbiBhdXRoZW50aWNhdG9yXG4iLCAKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJY2ZnLmF1dGhfb3B0aW9ucyA9IElOQk9VTkRfQVVUSDsKKwl9CisKKwlpZiggcHBwX3ByaXZfYXJlYS0+cGFwID09IFdBTk9QVF9ZRVMpeworCQljZmcuYXV0aF9vcHRpb25zIHw9UEFQX0FVVEg7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQYXAgZW5hYmxlZFxuIiwgY2FyZC0+ZGV2bmFtZSk7CisJfQorCWlmKCBwcHBfcHJpdl9hcmVhLT5jaGFwID09IFdBTk9QVF9ZRVMpeworCQljZmcuYXV0aF9vcHRpb25zIHw9IENIQVBfQVVUSDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENoYXAgZW5hYmxlZFxuIiwgY2FyZC0+ZGV2bmFtZSk7CisJfQorCisKKwlpZiAocHBwX3ByaXZfYXJlYS0+ZW5hYmxlX0lQWCA9PSBXQU5PUFRfWUVTKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVuYWJsaW5nIElQWCBQcm90b2NvbFxuIixjYXJkLT5kZXZuYW1lKTsKKwkJY2ZnLmlweF9vcHRpb25zCQk9IEVOQUJMRV9JUFggfCBST1VUSU5HX1BST1RfREVGQVVMVDsKKwl9ZWxzZXsKKwkJY2ZnLmlweF9vcHRpb25zIAk9IERJU0FCTEVfSVBYOworCX0KKworCXN3aXRjaCAoY2FyZC0+dS5wLmlwX21vZGUpIHsKKwkKKwkJY2FzZSBXQU5PUFRfUFBQX1NUQVRJQzoKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBQUCBJUCBNb2RlOiBTVEFUSUNcbiIsY2FyZC0+ZGV2bmFtZSk7CisJCQljZmcuaXBfb3B0aW9ucwkJPSBMX0FORF9SX0lQX05PX0FTU0lHIHwgCisJCQkJCQkJICAgIEVOQUJMRV9JUDsKKwkJCWNmZy5pcF9sb2NhbAkJPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWw7CisJCQljZmcuaXBfcmVtb3RlCQk9IGluX2Rldi0+aWZhX2xpc3QtPmlmYV9hZGRyZXNzOworCQkJLyogRGVidWdnaW5nIGNvZGUgdXNlZCB0byBjaGVjayB0aGF0IElQIGFkZHJlc3NlcworICAgICAgICAgICAgICAgICAgICAgICAgICogb2J0YWluZWQgZnJvbSB0aGUga2VybmVsIGFyZSBjb3JyZWN0ICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FWF9QUklOVEsoS0VSTl9JTkZPICJMb2NhbCAldS4ldS4ldS4ldSBSZW1vdGUgJXUuJXUuJXUuJXUgTmFtZSAlc1xuIiwKKwkJCQkJTklQUVVBRChpcF9sb2NhbCksTklQUVVBRChpcF9yZW1vdGUpLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXQU5PUFRfUFBQX0hPU1Q6CisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQUFAgSVAgTW9kZTogSE9TVFxuIixjYXJkLT5kZXZuYW1lKTsKKwkJCWNmZy5pcF9vcHRpb25zCQk9IExfSVBfTE9DQUxfQVNTSUcgfAorCQkJCQkJICBSX0lQX0xPQ0FMX0FTU0lHIHwgCisJCQkJCQkgIEVOQUJMRV9JUDsKKwkJCWNmZy5pcF9sb2NhbAkJPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWw7CisJCQljZmcuaXBfcmVtb3RlCQk9IGluX2Rldi0+aWZhX2xpc3QtPmlmYV9hZGRyZXNzOworCQkJLyogRGVidWdnaW5nIGNvZGUgdXNlZCB0byBjaGVjayB0aGF0IElQIGFkZHJlc3NlcworICAgICAgICAgICAgICAgICAgICAgICAgICogb2J0YWluZWQgZnJvbSB0aGUga2VybmVsIGFyZSBjb3JyZWN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBORVhfUFJJTlRLIChLRVJOX0lORk8gIkxvY2FsICV1LiV1LiV1LiV1IFJlbW90ZSAldS4ldS4ldS4ldSBOYW1lICVzXG4iLAorCQkJCQlOSVBRVUFEKGlwX2xvY2FsKSxOSVBRVUFEKGlwX3JlbW90ZSksIGRldi0+bmFtZSk7CisJCQkKKwkJCWJyZWFrOworCQorCQljYXNlIFdBTk9QVF9QUFBfUEVFUjoKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBQUCBJUCBNb2RlOiBQRUVSXG4iLGNhcmQtPmRldm5hbWUpOworCQkJY2ZnLmlwX29wdGlvbnMJCT0gTF9JUF9SRU1PVEVfQVNTSUcgfCAKKwkJCQkJCSAgUl9JUF9SRU1PVEVfQVNTSUcgfCAKKwkJCQkJCQkgIEVOQUJMRV9JUDsKKwkJCWNmZy5pcF9sb2NhbAkJPSAweDAwOworCQkJY2ZnLmlwX3JlbW90ZQkJPSAweDAwOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFUlJPUjogVW5zdXBwb3J0ZWQgUFBQIE1vZGUgU2VsZWN0ZWRcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICAgICAgICBQUFAgSVAgTW9kZXM6IFNUQVRJQywgUEVFUiBvciBIT1NUXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsJCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gcHBwX2NvbmZpZ3VyZShjYXJkLCAmY2ZnKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTaG93IGRpc2Nvbm5lY3Rpb24gY2F1c2UuCisgKi8KK3N0YXRpYyB2b2lkIHNob3dfZGlzY19jYXVzZShzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGNhdXNlKQoreworCWlmIChjYXVzZSAmIDB4MDgwMikgCisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgdGVybWluYXRlZCBieSBwZWVyXG4iLCAKKwkJCWNhcmQtPmRldm5hbWUpOworCisJZWxzZSBpZiAoY2F1c2UgJiAweDAwMDQpIAorCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIHRlcm1pbmF0ZWQgYnkgdXNlclxuIiwgCisJCQljYXJkLT5kZXZuYW1lKTsKKworCWVsc2UgaWYgKGNhdXNlICYgMHgwMDA4KSAKKworCQlwcmludGsoS0VSTl9JTkZPICIlczogYXV0aGVudGljYXRpb24gZmFpbGVkXG4iLCBjYXJkLT5kZXZuYW1lKTsKKwkKKwllbHNlIGlmIChjYXVzZSAmIDB4MDAxMCkgCisKKwkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogYXV0aGVudGljYXRpb24gcHJvdG9jb2wgbmVnb3RpYXRpb24gZmFpbGVkXG4iLCAKKwkJCWNhcmQtPmRldm5hbWUpOworCisJZWxzZSBpZiAoY2F1c2UgJiAweDAwMjApIAorCQkKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkiJXM6IHBlZXIncyByZXF1ZXN0IGZvciBhdXRoZW50aWNhdGlvbiByZWplY3RlZFxuIiwKKwkJY2FyZC0+ZGV2bmFtZSk7CisKKwllbHNlIGlmIChjYXVzZSAmIDB4MDA0MCkgCisJCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNUlUgb3B0aW9uIHJlamVjdGVkIGJ5IHBlZXJcbiIsIAorCQljYXJkLT5kZXZuYW1lKTsKKworCWVsc2UgaWYgKGNhdXNlICYgMHgwMDgwKSAKKwkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHBlZXIncyBNUlUgd2FzIHRvbyBzbWFsbFxuIiwgCisJCWNhcmQtPmRldm5hbWUpOworCisJZWxzZSBpZiAoY2F1c2UgJiAweDAxMDApIAorCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBmYWlsZWQgdG8gbmVnb3RpYXRlIHBlZXIncyBMQ1Agb3B0aW9uc1xuIiwKKwkJY2FyZC0+ZGV2bmFtZSk7CisKKwllbHNlIGlmIChjYXVzZSAmIDB4MDIwMCkgCisJCQorCQlwcmludGsoS0VSTl9JTkZPICIlczogZmFpbGVkIHRvIG5lZ290aWF0ZSBwZWVyJ3MgSVBDUCBvcHRpb25zXG4iCisJCSwgY2FyZC0+ZGV2bmFtZSk7CisKKwllbHNlIGlmIChjYXVzZSAmIDB4MDQwMCkgCisKKwkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogZmFpbGVkIHRvIG5lZ290aWF0ZSBwZWVyJ3MgSVBYQ1Agb3B0aW9uc1xuIiwKKwkJCWNhcmQtPmRldm5hbWUpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQcm9jZXNzIFVEUCBjYWxsIG9mIHR5cGUgUFRQSVBFQUIuCisgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3NfdWRwX21nbXRfcGt0KHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCisJCQkJIHBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSApIAoreworCXVuc2lnbmVkIGNoYXIgYnVmMls1XTsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJdW5zaWduZWQgaW50IGZyYW1lcywgbGVuOworCXN0cnVjdCBza19idWZmICpuZXdfc2tiOworCXVuc2lnbmVkIHNob3J0IGRhdGFfbGVuZ3RoLCBidWZmZXJfbGVuZ3RoLCByZWFsX2xlbjsKKwl1bnNpZ25lZCBsb25nIGRhdGFfcHRyOworCWludCB1ZHBfbWdtdF9yZXFfdmFsaWQgPSAxOworCXBwcF9tYm94X3QgKm1ib3ggPSBjYXJkLT5tYm94OworCXN0cnVjdCB0aW1ldmFsIHR2OworCWludCBlcnI7CisJcHBwX3VkcF9wa3RfdCAqcHBwX3VkcF9wa3QgPSAocHBwX3VkcF9wa3RfdCopJnBwcF9wcml2X2FyZWEtPnVkcF9wa3RfZGF0YTsKKworCW1lbWNweSgmYnVmMiwgJmNhcmQtPndhbmRldi51ZHBfcG9ydCwgMiApOworCisKKwlpZihwcHBfcHJpdl9hcmVhLT51ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9ORVRXT1JLKSB7CisKKwkJc3dpdGNoKHBwcF91ZHBfcGt0LT5jYmxvY2suY29tbWFuZCkgeworCisJCQljYXNlIFBQSVBFX0dFVF9JQkFfREFUQToKKwkJCWNhc2UgUFBQX1JFQURfQ09ORklHOgorCQkJY2FzZSBQUFBfR0VUX0NPTk5FQ1RJT05fSU5GTzoKKwkJCWNhc2UgUFBJUEVfUk9VVEVSX1VQX1RJTUU6CisJCQljYXNlIFBQUF9SRUFEX1NUQVRJU1RJQ1M6CisJCQljYXNlIFBQUF9SRUFEX0VSUk9SX1NUQVRTOgorCQkJY2FzZSBQUFBfUkVBRF9QQUNLRVRfU1RBVFM6CisJCQljYXNlIFBQUF9SRUFEX0xDUF9TVEFUUzoKKwkJCWNhc2UgUFBQX1JFQURfSVBDUF9TVEFUUzoKKwkJCWNhc2UgUFBQX1JFQURfSVBYQ1BfU1RBVFM6CisJCQljYXNlIFBQUF9SRUFEX1BBUF9TVEFUUzoKKwkJCWNhc2UgUFBQX1JFQURfQ0hBUF9TVEFUUzoKKwkJCWNhc2UgUFBQX1JFQURfQ09ERV9WRVJTSU9OOgorCQkJCXVkcF9tZ210X3JlcV92YWxpZCA9IDE7CisJCQkJYnJlYWs7CisJCQkgICAKKwkJCWRlZmF1bHQ6CisJCQkJdWRwX21nbXRfcmVxX3ZhbGlkID0gMDsKKwkJCQlicmVhazsKKwkJfSAKKwl9CisJCisgIAlpZighdWRwX21nbXRfcmVxX3ZhbGlkKSB7CisJICAgIAorCQkvKiBzZXQgbGVuZ3RoIHRvIDAgKi8KKyAgICAJCXBwcF91ZHBfcGt0LT5jYmxvY2subGVuZ3RoID0gMHgwMDsKKworICAgIAkJLyogc2V0IHJldHVybiBjb2RlICovCisgICAgCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDB4Q0Q7IAorCQkrK3BwcF9wcml2X2FyZWEtPnBpcGVfbWdtdF9zdGF0LlVEUF9QSVBFX21nbXRfZGlyZWN0aW9uX2VycjsKKwkKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSl7CQorCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogV2FybmluZywgSWxsZWdhbCBVRFAgY29tbWFuZCBhdHRlbXB0ZWQgZnJvbSBuZXR3b3JrOiAleFxuIiwKKwkJCWNhcmQtPmRldm5hbWUscHBwX3VkcF9wa3QtPmNibG9jay5jb21tYW5kKTsKKwkJfQorICAgCX0gZWxzZSB7CisJCS8qIEluaXRpYWxpemUgdGhlIHRyYWNlIGVsZW1lbnQgKi8KKwkJdHJhY2VfZWxlbWVudF90IHRyYWNlX2VsZW1lbnQ7CQkgICAgCisKKwkJc3dpdGNoIChwcHBfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQpeworCisJCS8qIFBQSVBFX0VOQUJMRV9UUkFDSU5HICovCisgICAgCQljYXNlIFBQSVBFX0VOQUJMRV9UUkFDSU5HOgorCQkJaWYgKCFjYXJkLT5UcmFjaW5nRW5hYmxlZCkgeworICAgIAkJCQorCQkJCS8qIE9QRVJBVEVfREFUQUxJTkVfTU9OSVRPUiAqLworICAgIAkJCQltYm94LT5jbWQuY29tbWFuZCA9IFBQUF9EQVRBTElORV9NT05JVE9SOworICAgIAkJCQltYm94LT5jbWQubGVuZ3RoID0gMHgwMTsKKyAgICAJCQkJbWJveC0+ZGF0YVswXSA9IHBwcF91ZHBfcGt0LT5kYXRhWzBdOworCSAgICAJCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyAKKwkJCQkJbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCSAgIAorCQkJCWlmIChlcnIgIT0gQ01EX09LKSB7IAorCSAgICAgICAgCQkJCisJCQkJCXBwcF9lcnJvcihjYXJkLCBlcnIsIG1ib3gpOworCSAgICAgICAgCQkJY2FyZC0+VHJhY2luZ0VuYWJsZWQgPSAwOworCSAgICAgICAgCQkKKwkJCQkJLyogc2V0IHRoZSByZXR1cm4gY29kZSAqLworCisJCSAgICAgICAgCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IG1ib3gtPmNtZC5yZXN1bHQ7CisJICAgICAgICAJCQltYm94LT5jbWQubGVuZ3RoID0gMDsKKwkgICAgICAgIAkJCWJyZWFrOworCSAgICAJCQl9IAorCisJCQkJc2RsYV9wZWVrKCZjYXJkLT5odywgMHhDMDAwLCAmYnVmMiwgMik7CisJCSAgICAKKwkJCQlwcHBfcHJpdl9hcmVhLT5jdXJyX3RyYWNlX2FkZHIgPSAwOworCQkgICAgCQltZW1jcHkoJnBwcF9wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciwgJmJ1ZjIsIDIpOworCQkgICAgCQlwcHBfcHJpdl9hcmVhLT5zdGFydF90cmFjZV9hZGRyID0gCisJCQkJCQlwcHBfcHJpdl9hcmVhLT5jdXJyX3RyYWNlX2FkZHI7CisJCQkJcHBwX3ByaXZfYXJlYS0+ZW5kX3RyYWNlX2FkZHIgPSAKKwkJCQkJcHBwX3ByaXZfYXJlYS0+c3RhcnRfdHJhY2VfYWRkciArIEVORF9PRkZTRVQ7CisJCSAgICAJCisJCQkJLyogTUFYX1NFTkRfQlVGRkVSX1NJWkUgLSAyOCAoSVAgaGVhZGVyKSAKKwkJCQkgICAtIDMyIChwcGlwZW1vbiBDQkxPQ0spICovCisJCSAgICAJCWF2YWlsYWJsZV9idWZmZXJfc3BhY2UgPSBNQVhfTEdUSF9VRFBfTUdOVF9QS1QgLSAKKwkJCQkJCQkgc2l6ZW9mKGlwX3BrdF90KS0KKwkJCQkJCQkgc2l6ZW9mKHVkcF9wa3RfdCktCisJCQkJCQkJIHNpemVvZih3cF9tZ210X3QpLQorCQkJCQkJCSBzaXplb2YoY2Jsb2NrX3QpOworCSAgICAgICAJICAJfQorCSAgICAgICAJICAJcHBwX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAwOworCSAgICAgICAJICAJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJICAgICAgIAkgIAljYXJkLT5UcmFjaW5nRW5hYmxlZCA9IDE7CisJICAgICAgIAkgIAlicmVhazsKKwkgICAKKwkJLyogUFBJUEVfRElTQUJMRV9UUkFDSU5HICovCisJCWNhc2UgUFBJUEVfRElTQUJMRV9UUkFDSU5HOgorCSAgICAgIAkJCisJCQlpZihjYXJkLT5UcmFjaW5nRW5hYmxlZCkgeworCQkgICAJCisJCQkJLyogT1BFUkFURV9EQVRBTElORV9NT05JVE9SICovCisJCSAgICAJCW1ib3gtPmNtZC5jb21tYW5kID0gMHgzMzsKKwkJICAgIAkJbWJveC0+Y21kLmxlbmd0aCA9IDE7CisJCSAgICAJCW1ib3gtPmRhdGFbMF0gPSAweDAwOworCQkgICAgCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyAKKwkJCQkJbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCSAgICAgICAJICAKKwkJCX0gCisJCQorCQkJLypzZXQgcmV0dXJuIGNvZGUqLworCQkJcHBwX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAwOworCQkJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJCQljYXJkLT5UcmFjaW5nRW5hYmxlZCA9IDA7CisJCQlicmVhazsKKwkgICAKKwkJLyogUFBJUEVfR0VUX1RSQUNFX0lORk8gKi8KKwkJY2FzZSBQUElQRV9HRVRfVFJBQ0VfSU5GTzoKKworCQkJaWYoIWNhcmQtPlRyYWNpbmdFbmFibGVkKSB7CisJCQkJLyogc2V0IHJldHVybiBjb2RlICovCisJICAgIAkJCXBwcF91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMTsKKwkgICAgCQkJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJCQl9CQkgICAgCisKKwkJCWJ1ZmZlcl9sZW5ndGggPSAwOworCQkJCisJCQkvKiBmcmFtZXMgPCA2Miwgd2hlcmUgNjIgaXMgdGhlIG51bWJlciBvZiB0cmFjZQorCQkJICAgaW5mb3JtYXRpb24gZWxlbWVudHMuICBUaGVyZSBpcyBpbiB0b3RhbCA0OTYKKwkJCSAgIGJ5dGVzIG9mIHNwYWNlIGFuZCBlYWNoIHRyYWNlIGluZm9ybWF0aW9uCisJCQkgICBlbGVtZW50IGlzIDggYnl0ZXMuIAorCQkJICovCisJCQlmb3IgKCBmcmFtZXM9MDsgZnJhbWVzPDYyOyBmcmFtZXMrKykgeworCQorCQkJCXRyYWNlX3BrdF90ICp0cmFjZV9wa3QgPSAodHJhY2VfcGt0X3QgKikKKwkJCQkJJnBwcF91ZHBfcGt0LT5kYXRhW2J1ZmZlcl9sZW5ndGhdOworCQorCQkJCS8qIFJlYWQgdGhlIHdob2xlIHRyYWNlIHBhY2tldCAqLworCQkJCXNkbGFfcGVlaygmY2FyZC0+aHcsIHBwcF9wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciwgCisJCQkJCSAgJnRyYWNlX2VsZW1lbnQsIHNpemVvZih0cmFjZV9lbGVtZW50X3QpKTsKKwkKKwkJCQkvKiBubyBkYXRhIG9uIGJvYXJkIHNvIGV4aXQgKi8KKwkJCQlpZiggdHJhY2VfZWxlbWVudC5vcHBfZmxhZyA9PSAweDAwICkgCisJCQkJCWJyZWFrOworCSAgICAgIAorCQkJCWRhdGFfcHRyID0gdHJhY2VfZWxlbWVudC50cmFjZV9kYXRhX3B0cjsKKworCQkJCS8qIFNlZSBpZiB0aGVyZSBpcyBhY3R1YWwgZGF0YSBvbiB0aGUgdHJhY2UgYnVmZmVyICovCisJCQkJaWYgKGRhdGFfcHRyKXsKKwkJCQkJZGF0YV9sZW5ndGggPSB0cmFjZV9lbGVtZW50LnRyYWNlX2xlbmd0aDsKKwkJCQl9ZWxzZXsKKwkJCQkJZGF0YV9sZW5ndGggPSAwOworCQkJCQlwcHBfdWRwX3BrdC0+ZGF0YVswXSB8PSAweDAyOworCQkJCX0KKworCQkJCS8vRklYTUU6IERvIHdlIG5lZWQgdGhpcyBjaGVjaworCQkJCWlmICgoYXZhaWxhYmxlX2J1ZmZlcl9zcGFjZSAtIGJ1ZmZlcl9sZW5ndGgpIAorCQkJCSAgICAgPCAoc2l6ZW9mKHRyYWNlX2VsZW1lbnRfdCkrMSkpeworCQkJCQkKKwkJCQkJLyppbmRpY2F0ZSB3ZSBoYXZlIG1vcmUgZnJhbWVzIAorCQkJCQkgKiBvbiBib2FyZCBhbmQgZXhpdCAKKwkJCQkJICovCisJCQkJCXBwcF91ZHBfcGt0LT5kYXRhWzBdIHw9IDB4MDI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkKKwkJCQl0cmFjZV9wa3QtPnN0YXR1cyA9IHRyYWNlX2VsZW1lbnQudHJhY2VfdHlwZTsKKwkJCQl0cmFjZV9wa3QtPnRpbWVfc3RhbXAgPSB0cmFjZV9lbGVtZW50LnRyYWNlX3RpbWVfc3RhbXA7CisJCQkJdHJhY2VfcGt0LT5yZWFsX2xlbmd0aCA9IHRyYWNlX2VsZW1lbnQudHJhY2VfbGVuZ3RoOworCisJCQkJcmVhbF9sZW4gPSB0cmFjZV9lbGVtZW50LnRyYWNlX2xlbmd0aDsJCisJCQkJCisJCQkJaWYoZGF0YV9wdHIgPT0gMCl7CisJCQkJCXRyYWNlX3BrdC0+ZGF0YV9hdmFpbCA9IDB4MDA7CisJCQkJfWVsc2V7CisJCQkJCS8qIHdlIGNhbiB0YWtlIGl0IG5leHQgdGltZSAqLworCQkJCQlpZiAoKGF2YWlsYWJsZV9idWZmZXJfc3BhY2UgLSBidWZmZXJfbGVuZ3RoKTwKKwkJCQkJCShyZWFsX2xlbiArIHNpemVvZih0cmFjZV9wa3RfdCkpKXsKKwkJCQkJCisJCQkJCQlwcHBfdWRwX3BrdC0+ZGF0YVswXSB8PSAweDAyOworCQkJCQkJYnJlYWs7CisJCQkJCX0gCisJCQkJCXRyYWNlX3BrdC0+ZGF0YV9hdmFpbCA9IDB4MDE7CisJCQkJCisJCQkJCS8qIGdldCB0aGUgZGF0YSAqLworCQkJCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCBkYXRhX3B0ciwgCisJCQkJCQkgICZ0cmFjZV9wa3QtPmRhdGEsCisJCQkJCQkgIHJlYWxfbGVuKTsKKwkJCQl9CQorCQkJCS8qIHplcm8gdGhlIG9wcCBmbGFnIHRvIAorCQkJCSAgIHNob3cgd2UgZ290IHRoZSBmcmFtZSAqLworCQkJCWJ1ZjJbMF0gPSAweDAwOworCQkJCXNkbGFfcG9rZSgmY2FyZC0+aHcsIHBwcF9wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciwKKwkJCQkJICAmYnVmMiwgMSk7CisKKwkJCQkvKiBub3cgbW92ZSBvbnRvIHRoZSBuZXh0IAorCQkJCSAgIGZyYW1lICovCisJCQkJcHBwX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyICs9IDg7CisKKwkJCQkvKiBjaGVjayBpZiB3ZSBwYXNzZWQgdGhlIGxhc3QgYWRkcmVzcyAqLworCQkJCWlmICggcHBwX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyID49IAorCQkJCQlwcHBfcHJpdl9hcmVhLT5lbmRfdHJhY2VfYWRkcil7CisKKwkJCQkJcHBwX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyID0gCisJCQkJCQlwcHBfcHJpdl9hcmVhLT5zdGFydF90cmFjZV9hZGRyOworCQkJCX0KKyAKKwkJCQkvKiB1cGRhdGUgYnVmZmVyIGxlbmd0aCBhbmQgbWFrZSBzdXJlIGl0cyBldmVuICovIAorCisJCQkJaWYgKCB0cmFjZV9wa3QtPmRhdGFfYXZhaWwgPT0gMHgwMSApIHsKKwkJCQkJYnVmZmVyX2xlbmd0aCArPSByZWFsX2xlbiAtIDE7CisJCQkJfQorIAorCQkJCS8qIGZvciB0aGUgaGVhZGVyICovCisJCQkJYnVmZmVyX2xlbmd0aCArPSA4OworCisJCQkJaWYoIGJ1ZmZlcl9sZW5ndGggJiAweDAwMDEgKQorCQkJCQlidWZmZXJfbGVuZ3RoICs9IDE7CisJCQl9CisKKwkJCS8qIG9rIG5vdyBzZXQgdGhlIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgcGFzc2VkCisJCQkgICBpbiB0aGUgaGlnaCA1IGJpdHMgKi8KKwkJCXBwcF91ZHBfcGt0LT5kYXRhWzBdIHw9IChmcmFtZXMgPDwgMik7CisJIAorCQkJLyogc2V0IHRoZSBkYXRhIGxlbmd0aCAqLworCQkJbWJveC0+Y21kLmxlbmd0aCA9IGJ1ZmZlcl9sZW5ndGg7CisJCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9IGJ1ZmZlcl9sZW5ndGg7CisJIAorCQkJLyogc2V0IHJldHVybiBjb2RlICovCisJCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDA7CisJICAgICAgCSAgCWJyZWFrOworCisgICAJCS8qIFBQSVBFX0dFVF9JQkFfREFUQSAqLworCQljYXNlIFBQSVBFX0dFVF9JQkFfREFUQToKKwkgICAgICAgIAorCQkJbWJveC0+Y21kLmxlbmd0aCA9IDB4MDk7CisJCQorCQkJc2RsYV9wZWVrKCZjYXJkLT5odywgMHhGMDAzLCAmcHBwX3VkcF9wa3QtPmRhdGEsIAorCQkJCQltYm94LT5jbWQubGVuZ3RoKTsKKwkgICAgICAgIAorCQkJLyogc2V0IHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgKi8KKwkJCXBwcF91ZHBfcGt0LT5jYmxvY2subGVuZ3RoID0gMHgwOTsKKworCQkJLyogc2V0IHJldHVybiBjb2RlICovCisJCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDB4MDA7CisJCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IDA7CisJCQlicmVhazsKKworCQkvKiBQUElQRV9GVDFfUkVBRF9TVEFUVVMgKi8KKwkJY2FzZSBQUElQRV9GVDFfUkVBRF9TVEFUVVM6CisJCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCAweEYwMjAsICZwcHBfdWRwX3BrdC0+ZGF0YVswXSwgMik7CisJCQlwcHBfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9IG1ib3gtPmNtZC5sZW5ndGggPSAyOworCQkJcHBwX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAwOworCQkJYnJlYWs7CisJCQorCQljYXNlIFBQSVBFX0ZMVVNIX0RSSVZFUl9TVEFUUzogICAKKwkJCWluaXRfcHBwX3ByaXZfc3RydWN0KCBwcHBfcHJpdl9hcmVhICk7CisJCQlpbml0X2dsb2JhbF9zdGF0aXN0aWNzKCBjYXJkICk7CisJCQltYm94LT5jbWQubGVuZ3RoID0gMDsKKwkJCXBwcF91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCWJyZWFrOworCisJCQorCQljYXNlIFBQSVBFX1JPVVRFUl9VUF9USU1FOgorCisJCQlkb19nZXR0aW1lb2ZkYXkoICZ0diApOworCQkJcHBwX3ByaXZfYXJlYS0+cm91dGVyX3VwX3RpbWUgPSB0di50dl9zZWMgLSAKKwkJCQkJcHBwX3ByaXZfYXJlYS0+cm91dGVyX3N0YXJ0X3RpbWU7CisJCQkqKHVuc2lnbmVkIGxvbmcgKikmcHBwX3VkcF9wa3QtPmRhdGEgPSBwcHBfcHJpdl9hcmVhLT5yb3V0ZXJfdXBfdGltZTsKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSA0OworCQkJcHBwX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAwOworCQkJYnJlYWs7CisKKwkJCQkvKiBQUElQRV9EUklWRVJfU1RBVElTVElDUyAqLyAgIAorCQljYXNlIFBQSVBFX0RSSVZFUl9TVEFUX0lGU0VORDoKKwkJCW1lbWNweSgmcHBwX3VkcF9wa3QtPmRhdGEsICZwcHBfcHJpdl9hcmVhLT5pZl9zZW5kX3N0YXQsIAorCQkJCXNpemVvZihpZl9zZW5kX3N0YXRfdCkpOworCisKKwkJCXBwcF91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCXBwcF91ZHBfcGt0LT5jYmxvY2subGVuZ3RoID0gc2l6ZW9mKGlmX3NlbmRfc3RhdF90KTsKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSBzaXplb2YoaWZfc2VuZF9zdGF0X3QpOwkKKwkJCWJyZWFrOworCisJCWNhc2UgUFBJUEVfRFJJVkVSX1NUQVRfSU5UUjoKKwkJCW1lbWNweSgmcHBwX3VkcF9wa3QtPmRhdGEsICZjYXJkLT5zdGF0aXN0aWNzLCAKKwkJCQlzaXplb2YoZ2xvYmFsX3N0YXRzX3QpKTsKKworCQkJbWVtY3B5KCZwcHBfdWRwX3BrdC0+ZGF0YStzaXplb2YoZ2xvYmFsX3N0YXRzX3QpLAorCQkJCSZwcHBfcHJpdl9hcmVhLT5yeF9pbnRyX3N0YXQsCisJCQkJc2l6ZW9mKHJ4X2ludHJfc3RhdF90KSk7CisKKwkJCXBwcF91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCXBwcF91ZHBfcGt0LT5jYmxvY2subGVuZ3RoID0gc2l6ZW9mKGdsb2JhbF9zdGF0c190KSsKKwkJCQkJCSAgICAgc2l6ZW9mKHJ4X2ludHJfc3RhdF90KTsKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSBwcHBfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aDsKKwkJCWJyZWFrOworCisJCWNhc2UgUFBJUEVfRFJJVkVSX1NUQVRfR0VOOgorCQkJbWVtY3B5KCAmcHBwX3VkcF9wa3QtPmRhdGEsCisJCQkJJnBwcF9wcml2X2FyZWEtPnBpcGVfbWdtdF9zdGF0LAorCQkJCXNpemVvZihwaXBlX21nbXRfc3RhdF90KSk7CisKKwkJCW1lbWNweSgmcHBwX3VkcF9wa3QtPmRhdGErc2l6ZW9mKHBpcGVfbWdtdF9zdGF0X3QpLCAKKwkJCSAgICAgICAmY2FyZC0+c3RhdGlzdGljcywgc2l6ZW9mKGdsb2JhbF9zdGF0c190KSk7CisKKwkJCXBwcF91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJCXBwcF91ZHBfcGt0LT5jYmxvY2subGVuZ3RoID0gc2l6ZW9mKGdsb2JhbF9zdGF0c190KSsKKwkJCQkJCSAgICAgc2l6ZW9mKHJ4X2ludHJfc3RhdF90KTsKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSBwcHBfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aDsKKwkJCWJyZWFrOworCisKKwkJLyogRlQxIE1PTklUT1IgU1RBVFVTICovCisgICAJCWNhc2UgRlQxX01PTklUT1JfU1RBVFVTX0NUUkw6CisJCisJCQkvKiBFbmFibGUgRlQxIE1PTklUT1IgU1RBVFVTICovCisJICAgICAgICAJaWYoIHBwcF91ZHBfcGt0LT5kYXRhWzBdID09IDEpIHsKKwkJCQorCQkJCWlmKCByQ291bnQrKyAhPSAwICkgeworCQkgICAgICAgIAkJcHBwX3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAwOworCSAgICAgICAgICAJCQltYm94LT5jbWQubGVuZ3RoID0gMTsKKwkJICAJCQlicmVhazsKKwkJICAgIAkJfQkKKwkgICAgICAJCX0KKworCSAgICAgIAkJLyogRGlzYWJsZSBGVDEgTU9OSVRPUiBTVEFUVVMgKi8KKwkgICAgICAJCWlmKCBwcHBfdWRwX3BrdC0+ZGF0YVswXSA9PSAwKSB7CisKKwkgICAgICAJICAgCQlpZiggLS1yQ291bnQgIT0gMCkgeworCQkgIAkJCXBwcF91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKwkJICAJCQltYm94LT5jbWQubGVuZ3RoID0gMTsKKwkJICAJCQlicmVhazsKKwkgICAJICAgIAkJfSAKKwkgICAgICAJCX0gCQorCQkJZ290byB1ZHBfZGZsdF9jbWQ7CisJCQkKKwkJLyogV0FSTklORzogRklYTUU6IFRoaXMgc2hvdWxkIGJlIGZpeGVkLgorCQkgKiBUaGUgRlQxIFN0YXR1cyBDdHJsIGRvZXNuJ3QgaGF2ZSBhIGJyZWFrCisgICAgICAgICAgICAgICAgICogc3RhdG1lbnQuICBUaHVzLCBubyBjb2RlIG11c3QgYmUgaW5zZXJ0ZWQKKyAgICAgICAgICAgICAgICAgKiBIRVJFOiBiZXR3ZWVuIGRlZmF1bHQgYW5kIGFib3ZlIGNhc2Ugc3RhdGVtZW50ICovCisKKwkJZGVmYXVsdDoKK3VkcF9kZmx0X2NtZDoKKwkgICAgICAgIAorCQkJLyogaXQncyBhIGJvYXJkIGNvbW1hbmQgKi8KKwkJCW1ib3gtPmNtZC5jb21tYW5kID0gcHBwX3VkcF9wa3QtPmNibG9jay5jb21tYW5kOworCQkJbWJveC0+Y21kLmxlbmd0aCA9IHBwcF91ZHBfcGt0LT5jYmxvY2subGVuZ3RoOworIAorCQkJaWYobWJveC0+Y21kLmxlbmd0aCkgeworCQkJCW1lbWNweSgmbWJveC0+ZGF0YSwodW5zaWduZWQgY2hhciAqKXBwcF91ZHBfcGt0LT5kYXRhLAorCQkJCSAgICAgICBtYm94LT5jbWQubGVuZ3RoKTsKKwkgICAgICAJCX0gCisJICAgICAgICAgIAorCQkJLyogcnVuIHRoZSBjb21tYW5kIG9uIHRoZSBib2FyZCAqLworCQkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCQkKKwkJCWlmIChlcnIgIT0gQ01EX09LKSB7CisJCQorCQkgICAgCQlwcHBfZXJyb3IoY2FyZCwgZXJyLCBtYm94KTsKKwkJICAgIAkJKytwcHBfcHJpdl9hcmVhLT5waXBlX21nbXRfc3RhdC4KKwkJCQkJIFVEUF9QSVBFX21nbXRfYWRwdHJfY21uZF90aW1lb3V0OworCQkJCWJyZWFrOworCQkJfQorCSAgICAgICAgICAKKwkJICAJKytwcHBfcHJpdl9hcmVhLT5waXBlX21nbXRfc3RhdC5VRFBfUElQRV9tZ210X2FkcHRyX2NtbmRfT0s7CisJCQorCQkJLyogY29weSB0aGUgcmVzdWx0IGJhY2sgdG8gb3VyIGJ1ZmZlciAqLworCQkJbWVtY3B5KCZwcHBfdWRwX3BrdC0+Y2Jsb2NrLG1ib3gsIHNpemVvZihjYmxvY2tfdCkpOworCSAgICAgICAgICAKKwkJCWlmKG1ib3gtPmNtZC5sZW5ndGgpIHsKKwkJCQltZW1jcHkoJnBwcF91ZHBfcGt0LT5kYXRhLCZtYm94LT5kYXRhLG1ib3gtPmNtZC5sZW5ndGgpOworCQkJfSAKKworCQl9IC8qIGVuZCBvZiBzd2l0Y2ggKi8KKyAgICAgCX0gLyogZW5kIG9mIGVsc2UgKi8KKworICAgICAJLyogRmlsbCBVRFAgVFRMICovCisgICAgIAlwcHBfdWRwX3BrdC0+aXBfcGt0LnR0bCA9IGNhcmQtPndhbmRldi50dGw7IAorICAgICAJbGVuID0gcmVwbHlfdWRwKHBwcF9wcml2X2FyZWEtPnVkcF9wa3RfZGF0YSwgbWJveC0+Y21kLmxlbmd0aCk7CisKKyAgICAgCWlmIChwcHBfcHJpdl9hcmVhLT51ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9ORVRXT1JLKSB7CisKKwkJLyogTWFrZSBzdXJlIHdlIGFyZSBub3QgYWxyZWFkeSBzZW5kaW5nICovCisJCWlmICghdGVzdF9iaXQoU0VORF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJCSsrcHBwX3ByaXZfYXJlYS0+cGlwZV9tZ210X3N0YXQuVURQX1BJUEVfbWdtdF9wYXNzZWRfdG9fYWRwdHI7CisJCQlwcHBfc2VuZChjYXJkLHBwcF9wcml2X2FyZWEtPnVkcF9wa3RfZGF0YSxsZW4scHBwX3ByaXZfYXJlYS0+cHJvdG9jb2wpOworCQl9CisKKwl9IGVsc2UgewkKKwkKKwkJLyogUGFzcyBpdCB1cCB0aGUgc3RhY2sKKyAgICAJCSAgIEFsbG9jYXRlIHNvY2tldCBidWZmZXIgKi8KKwkJaWYgKChuZXdfc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pKSAhPSBOVUxMKSB7CisJICAgIAkKKwkJCS8qIGNvcHkgZGF0YSBpbnRvIG5ld19za2IgKi8KKworICAJICAgIAkJYnVmID0gc2tiX3B1dChuZXdfc2tiLCBsZW4pOworICAJICAgIAkJbWVtY3B5KGJ1ZixwcHBfcHJpdl9hcmVhLT51ZHBfcGt0X2RhdGEsIGxlbik7CisKKwkgICAgCQkrK3BwcF9wcml2X2FyZWEtPnBpcGVfbWdtdF9zdGF0LlVEUF9QSVBFX21nbXRfcGFzc2VkX3RvX3N0YWNrOworCQkJCisgICAgICAgICAgICAJCS8qIERlY2Fwc3VsYXRlIHBhY2tldCBhbmQgcGFzcyBpdCB1cCB0aGUgcHJvdG9jb2wgCisJCQkgICBzdGFjayAqLworCSAgICAJCW5ld19za2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOworICAgICAgICAgICAgCQluZXdfc2tiLT5kZXYgPSBkZXY7CisJICAgIAkJbmV3X3NrYi0+bWFjLnJhdyAgPSBuZXdfc2tiLT5kYXRhOworCQkJbmV0aWZfcngobmV3X3NrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkKKwkJfSBlbHNlIHsKKwkgICAgCQorCQkJKytwcHBfcHJpdl9hcmVhLT5waXBlX21nbXRfc3RhdC5VRFBfUElQRV9tZ210X25vX3NvY2tldDsKKwkJCXByaW50ayhLRVJOX0lORk8gIm5vIHNvY2tldCBidWZmZXJzIGF2YWlsYWJsZSFcbiIpOworICAJCX0KKyAgICAJfQkKKworCXBwcF9wcml2X2FyZWEtPnVkcF9wa3RfbGd0aCA9IDA7CisJCisJcmV0dXJuOyAKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbCB0aGUgcHBwX3ByaXZhdGVfYXJlYSBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfcHBwX3ByaXZfc3RydWN0KCBwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWEgKQoreworCisJbWVtc2V0KCZwcHBfcHJpdl9hcmVhLT5pZl9zZW5kX3N0YXQsIDAsIHNpemVvZihpZl9zZW5kX3N0YXRfdCkpOworCW1lbXNldCgmcHBwX3ByaXZfYXJlYS0+cnhfaW50cl9zdGF0LCAwLCBzaXplb2YocnhfaW50cl9zdGF0X3QpKTsKKwltZW1zZXQoJnBwcF9wcml2X2FyZWEtPnBpcGVfbWdtdF9zdGF0LCAwLCBzaXplb2YocGlwZV9tZ210X3N0YXRfdCkpOwkKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIEdsb2JhbCBTdGF0aXN0aWNzCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfZ2xvYmFsX3N0YXRpc3RpY3MoIHNkbGFfdCAqY2FyZCApCit7CisJbWVtc2V0KCZjYXJkLT5zdGF0aXN0aWNzLCAwLCBzaXplb2YoZ2xvYmFsX3N0YXRzX3QpKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIFJlY2VpdmUgYW5kIFRyYW5zbWl0IEJ1ZmZlcnMuCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfcHBwX3R4X3J4X2J1ZmYoIHNkbGFfdCAqY2FyZCApCit7CisJcHBwNTA4X2J1Zl9pbmZvX3QqIGluZm87CisKKwlpZiAoY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpIHsKKwkJCisJCWluZm8gPSAodm9pZCopKGNhcmQtPmh3LmRwbWJhc2UgKyBQUFA1MTRfQlVGX09GRlMpOworCisgICAgICAgCQljYXJkLT51LnAudHhidWZfYmFzZSA9ICh2b2lkKikoY2FyZC0+aHcuZHBtYmFzZSArCisJCQlpbmZvLT50eGJfcHRyKTsKKworICAgICAgICAgICAgICAgIGNhcmQtPnUucC50eGJ1Zl9sYXN0ID0gKHBwcF9idWZfY3RsX3QqKWNhcmQtPnUucC50eGJ1Zl9iYXNlICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbmZvLT50eGJfbnVtIC0gMSk7CisKKyAgICAgICAgICAgICAgICBjYXJkLT51LnAucnhidWZfYmFzZSA9ICh2b2lkKikoY2FyZC0+aHcuZHBtYmFzZSArCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5yeGJfcHRyKTsKKworICAgICAgICAgICAgICAgIGNhcmQtPnUucC5yeGJ1Zl9sYXN0ID0gKHBwcF9idWZfY3RsX3QqKWNhcmQtPnUucC5yeGJ1Zl9iYXNlICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbmZvLT5yeGJfbnVtIC0gMSk7CisKKwl9IGVsc2UgeworCQkKKwkJaW5mbyA9ICh2b2lkKikoY2FyZC0+aHcuZHBtYmFzZSArIFBQUDUwOF9CVUZfT0ZGUyk7CisKKwkJY2FyZC0+dS5wLnR4YnVmX2Jhc2UgPSAodm9pZCopKGNhcmQtPmh3LmRwbWJhc2UgKworCQkJKGluZm8tPnR4Yl9wdHIgLSBQUFA1MDhfTUJfVkVDVCkpOworCisJCWNhcmQtPnUucC50eGJ1Zl9sYXN0ID0gKHBwcF9idWZfY3RsX3QqKWNhcmQtPnUucC50eGJ1Zl9iYXNlICsKKwkJCShpbmZvLT50eGJfbnVtIC0gMSk7CisKKwkJY2FyZC0+dS5wLnJ4YnVmX2Jhc2UgPSAodm9pZCopKGNhcmQtPmh3LmRwbWJhc2UgKworCQkJKGluZm8tPnJ4Yl9wdHIgLSBQUFA1MDhfTUJfVkVDVCkpOworCisJCWNhcmQtPnUucC5yeGJ1Zl9sYXN0ID0gKHBwcF9idWZfY3RsX3QqKWNhcmQtPnUucC5yeGJ1Zl9iYXNlICsKKwkJCShpbmZvLT5yeGJfbnVtIC0gMSk7CisJfQorCisJY2FyZC0+dS5wLnR4YnVmX25leHQgPSAodW5zaWduZWQgbG9uZyopJmluZm8tPnR4Yl9ueHQ7IAorCWNhcmQtPnUucC5yeGJ1Zl9uZXh0ID0gKHVuc2lnbmVkIGxvbmcqKSZpbmZvLT5yeGIxX3B0cjsKKworCWNhcmQtPnUucC5yeF9iYXNlID0gaW5mby0+cnhiX2Jhc2U7CisgICAgICAgIGNhcmQtPnUucC5yeF90b3AgID0gaW5mby0+cnhiX2VuZDsKKyAgICAgIAorCWNhcmQtPnUucC50eGJ1ZiA9IGNhcmQtPnUucC50eGJ1Zl9iYXNlOworCWNhcmQtPnJ4bWIgPSBjYXJkLT51LnAucnhidWZfYmFzZTsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZWFkIENvbm5lY3Rpb24gSW5mb3JtYXRpb24gKGllIGZvciBSZW1vdGUgSVAgYWRkcmVzcyBhc3NnaW5tZW50KS4KKyAqIENhbGxlZCB3aGVuIHBwcCBpbnRlcmZhY2UgY29ubmVjdGVkLgorICovCitzdGF0aWMgaW50IHJlYWRfaW5mbyggc2RsYV90ICpjYXJkICkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKwlwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWEgPSBkZXYtPnByaXY7CisJaW50IGVycjsKKworCXN0cnVjdCBpZnJlcSBpZl9pbmZvOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqaWZfZGF0YTEsICppZl9kYXRhMjsKKwltbV9zZWdtZW50X3QgZnM7CisKKwkvKiBTZXQgTG9jYWwgYW5kIHJlbW90ZSBhZGRyZXNzZXMgKi8KKwltZW1zZXQoJmlmX2luZm8sIDAsIHNpemVvZihpZl9pbmZvKSk7CisJc3RyY3B5KGlmX2luZm8uaWZyX25hbWUsIGRldi0+bmFtZSk7CisKKworCWZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKGdldF9kcygpKTsgICAgIC8qIGdldCB1c2VyIHNwYWNlIGJsb2NrICovIAorCisJLyogQ2hhbmdlIHRoZSBsb2NhbCBhbmQgcmVtb3RlIGlwIGFkZHJlc3Mgb2YgdGhlIGludGVyZmFjZS4KKwkgKiBUaGlzIHdpbGwgYWxzbyBhZGQgaW4gdGhlIGRlc3RpbmF0aW9uIHJvdXRlLgorCSAqLwkKKwlpZl9kYXRhMSA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmaWZfaW5mby5pZnJfYWRkcjsKKwlpZl9kYXRhMS0+c2luX2FkZHIuc19hZGRyID0gcHBwX3ByaXZfYXJlYS0+aXBfbG9jYWw7CisJaWZfZGF0YTEtPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWVyciA9IGRldmluZXRfaW9jdGwoIFNJT0NTSUZBRERSLCAmaWZfaW5mbyApOworCWlmX2RhdGEyID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZpZl9pbmZvLmlmcl9kc3RhZGRyOworCWlmX2RhdGEyLT5zaW5fYWRkci5zX2FkZHIgPSBwcHBfcHJpdl9hcmVhLT5pcF9yZW1vdGU7CisJaWZfZGF0YTItPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWVyciA9IGRldmluZXRfaW9jdGwoIFNJT0NTSUZEU1RBRERSLCAmaWZfaW5mbyApOworCisJc2V0X2ZzKGZzKTsgICAgICAgICAgIC8qIHJlc3RvcmUgb2xkIGJsb2NrICovCisJCisJaWYgKGVycikgeworCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IEFkZGluZyBvZiByb3V0ZSBmYWlsZWQ6ICVpXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSxlcnIpOworCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6CUxvY2FsIDogJXUuJXUuJXUuJXVcbiIsCisJCQljYXJkLT5kZXZuYW1lLE5JUFFVQUQocHBwX3ByaXZfYXJlYS0+aXBfbG9jYWwpKTsKKwkJcHJpbnRrIChLRVJOX0lORk8gIiVzOglSZW1vdGU6ICV1LiV1LiV1LiV1XG4iLAorCQkJY2FyZC0+ZGV2bmFtZSxOSVBRVUFEKHBwcF9wcml2X2FyZWEtPmlwX3JlbW90ZSkpOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZW1vdmUgRHluYW1pYyBSb3V0ZS4KKyAqIENhbGxlZCB3aGVuIHBwcCBpbnRlcmZhY2UgZGlzY29ubmVjdGVkLgorICovCisKK3N0YXRpYyB2b2lkIHJlbW92ZV9yb3V0ZSggc2RsYV90ICpjYXJkICkKK3sKKworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCWxvbmcgaXBfYWRkcjsKKwlpbnQgZXJyOworCisgICAgICAgIG1tX3NlZ21lbnRfdCBmczsKKwlzdHJ1Y3QgaWZyZXEgaWZfaW5mbzsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmlmX2RhdGExOworICAgICAgICBzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBkZXYtPmlwX3B0cjsKKyAgICAgICAgc3RydWN0IGluX2lmYWRkciAqaWZhID0gaW5fZGV2LT5pZmFfbGlzdDsJCisKKwlpcF9hZGRyID0gaWZhLT5pZmFfbG9jYWw7CisKKwkvKiBTZXQgTG9jYWwgYW5kIHJlbW90ZSBhZGRyZXNzZXMgKi8KKwltZW1zZXQoJmlmX2luZm8sIDAsIHNpemVvZihpZl9pbmZvKSk7CisJc3RyY3B5KGlmX2luZm8uaWZyX25hbWUsIGRldi0+bmFtZSk7CisKKwlmcyA9IGdldF9mcygpOworICAgICAgIAlzZXRfZnMoZ2V0X2RzKCkpOyAgICAgLyogZ2V0IHVzZXIgc3BhY2UgYmxvY2sgKi8gCisKKwkvKiBDaGFuZ2UgdGhlIGxvY2FsIGlwIGFkZHJlc3Mgb2YgdGhlIGludGVyZmFjZSB0byAwLgorCSAqIFRoaXMgd2lsbCBhbHNvIGRlbGV0ZSB0aGUgZGVzdGluYXRpb24gcm91dGUuCisJICovCQorCWlmX2RhdGExID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZpZl9pbmZvLmlmcl9hZGRyOworCWlmX2RhdGExLT5zaW5fYWRkci5zX2FkZHIgPSAwOworCWlmX2RhdGExLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwllcnIgPSBkZXZpbmV0X2lvY3RsKCBTSU9DU0lGQUREUiwgJmlmX2luZm8gKTsKKworICAgICAgICBzZXRfZnMoZnMpOyAgICAgICAgICAgLyogcmVzdG9yZSBvbGQgYmxvY2sgKi8KKworCQorCWlmIChlcnIpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBEZWxldGluZyBkeW5hbWljIHJvdXRlIGZhaWxlZCAlZCFcbiIsCisJCQkgY2FyZC0+ZGV2bmFtZSwgZXJyKTsKKwkJcmV0dXJuOworCX1lbHNleworCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IFBQUCBEZWxldGluZyBkeW5hbWljIHJvdXRlICV1LiV1LiV1LiV1IHN1Y2Nlc3NmdWx5XG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgTklQUVVBRChpcF9hZGRyKSk7CisJfQorCXJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUGVyZm9ybSB0aGUgSW50ZXJydXB0IFRlc3QgYnkgcnVubmluZyB0aGUgUkVBRF9DT0RFX1ZFUlNJT04gY29tbWFuZCBNQVhfSU5UUgorICogX1RFU1RfQ09VTlRFUiB0aW1lcy4KKyAqLworc3RhdGljIGludCBpbnRyX3Rlc3QoIHNkbGFfdCAqY2FyZCApCit7CisJcHBwX21ib3hfdCAqbWIgPSBjYXJkLT5tYm94OworCWludCBlcnIsaTsKKworCWVyciA9IHBwcF9zZXRfaW50cl9tb2RlKCBjYXJkLCAweDA4ICk7CisJCisJaWYgKGVyciA9PSBDTURfT0spIHsgCisJCQorCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0lOVFJfVEVTVF9DT1VOVEVSOyBpICsrKSB7CQorCQkJLyogUnVuIGNvbW1hbmQgUkVBRF9DT0RFX1ZFUlNJT04gKi8KKwkJCW1lbXNldCgmbWItPmNtZCwgMCwgc2l6ZW9mKHBwcF9jbWRfdCkpOworCQkJbWItPmNtZC5sZW5ndGggID0gMDsKKwkJCW1iLT5jbWQuY29tbWFuZCA9IFBQUF9SRUFEX0NPREVfVkVSU0lPTjsKKwkJCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCQkJaWYgKGVyciAhPSBDTURfT0spIAorCQkJCXBwcF9lcnJvcihjYXJkLCBlcnIsIG1iKTsKKwkJfQorCX0KKwllbHNlIHJldHVybiBlcnI7CisKKwllcnIgPSBwcHBfc2V0X2ludHJfbW9kZSggY2FyZCwgMCApOworCWlmIChlcnIgIT0gQ01EX09LKSAKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiBVRFAgY2FsbCBpdCBpcy4gRFJWU1RBVFMgb3IgUFRQSVBFQUIgPworICovCitzdGF0aWMgaW50IHVkcF9wa3RfdHlwZSggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc2RsYV90ICpjYXJkICkKK3sKKwl1bnNpZ25lZCBjaGFyICpzZW5kcGFja2V0OworCXVuc2lnbmVkIGNoYXIgYnVmMls1XTsgCisJcHBwX3VkcF9wa3RfdCAqcHBwX3VkcF9wa3QgPSAocHBwX3VkcF9wa3RfdCAqKXNrYi0+ZGF0YTsgCisJCisJc2VuZHBhY2tldCA9IHNrYi0+ZGF0YTsKKwltZW1jcHkoJmJ1ZjIsICZjYXJkLT53YW5kZXYudWRwX3BvcnQsIDIpOworCQorCWlmKCAJcHBwX3VkcF9wa3QtPmlwX3BrdC52ZXJfaW5ldF9oZHJfbGVuZ3RoICA9PSAweDQ1ICYmICAgICAgICAvKiBJUCBwYWNrZXQgKi8gCisJCXNlbmRwYWNrZXRbOV0gID09IDB4MTEgJiYgICAgICAgIC8qIFVEUCBwYWNrZXQgKi8KKwkJc2VuZHBhY2tldFsyMl0gPT0gYnVmMlsxXSAmJiAgICAgLyogVURQIFBvcnQgKi8KKwkJc2VuZHBhY2tldFsyM10gPT0gYnVmMlswXSAmJgorCQlzZW5kcGFja2V0WzM2XSA9PSAweDAxICkgeworCQorCQlpZiAoICAgIHNlbmRwYWNrZXRbMjhdID09IDB4NTAgJiYgICAgLyogUFRQSVBFQUI6IFNpZ25hdHVyZSAqLyAKKwkJCXNlbmRwYWNrZXRbMjldID09IDB4NTQgJiYgICAgICAKKwkJCXNlbmRwYWNrZXRbMzBdID09IDB4NTAgJiYgICAgICAKKwkJCXNlbmRwYWNrZXRbMzFdID09IDB4NDkgJiYgICAgICAKKwkJCXNlbmRwYWNrZXRbMzJdID09IDB4NTAgJiYgICAgICAKKwkJCXNlbmRwYWNrZXRbMzNdID09IDB4NDUgJiYgICAgICAKKwkJCXNlbmRwYWNrZXRbMzRdID09IDB4NDEgJiYgICAgICAKKwkJCXNlbmRwYWNrZXRbMzVdID09IDB4NDIgKXsgCisKKwkJCXJldHVybiBVRFBfUFRQSVBFX1RZUEU7CisJCisJCX0gZWxzZSBpZihzZW5kcGFja2V0WzI4XSA9PSAweDQ0ICYmICAvKiBEUlZTVEFUUzogU2lnbmF0dXJlICovCisJCQlzZW5kcGFja2V0WzI5XSA9PSAweDUyICYmICAgICAgCisgICAgICAJCQlzZW5kcGFja2V0WzMwXSA9PSAweDU2ICYmICAgICAgCisgICAgICAJCQlzZW5kcGFja2V0WzMxXSA9PSAweDUzICYmICAgICAgCisgICAgICAJCQlzZW5kcGFja2V0WzMyXSA9PSAweDU0ICYmICAgICAgCisgICAgICAJCQlzZW5kcGFja2V0WzMzXSA9PSAweDQxICYmICAgICAgCisgICAgICAJCQlzZW5kcGFja2V0WzM0XSA9PSAweDU0ICYmICAgICAgCisgICAgICAJCQlzZW5kcGFja2V0WzM1XSA9PSAweDUzICl7CisJCisJCQlyZXR1cm4gVURQX0RSVlNUQVRTX1RZUEU7CisKKwkJfSBlbHNlCisJCQlyZXR1cm4gVURQX0lOVkFMSURfVFlQRTsKKworCX0gZWxzZQorCQlyZXR1cm4gVURQX0lOVkFMSURfVFlQRTsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENoZWNrIHRvIHNlZSBpZiB0aGUgcGFja2V0IHRvIGJlIHRyYW5zbWl0dGVkIGNvbnRhaW5zIGEgYnJvYWRjYXN0IG9yCisgKiBtdWx0aWNhc3Qgc291cmNlIElQIGFkZHJlc3MuCisgKi8KKworc3RhdGljIGludCBjaGtfYmNhc3RfbWNhc3RfYWRkcihzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1MzIgc3JjX2lwX2FkZHI7CisgICAgICAgIHUzMiBicm9hZGNhc3RfaXBfYWRkciA9IDA7CisgICAgICAgIHN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKworICAgICAgICAvKiByZWFkIHRoZSBJUCBzb3VyY2UgYWRkcmVzcyBmcm9tIHRoZSBvdXRnb2luZyBwYWNrZXQgKi8KKyAgICAgICAgc3JjX2lwX2FkZHIgPSAqKHUzMiAqKShza2ItPmRhdGEgKyAxMik7CisKKwkvKiByZWFkIHRoZSBJUCBicm9hZGNhc3QgYWRkcmVzcyBmb3IgdGhlIGRldmljZSAqLworICAgICAgICBpbl9kZXYgPSBkZXYtPmlwX3B0cjsKKyAgICAgICAgaWYoaW5fZGV2ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5faWZhZGRyICppZmE9IGluX2Rldi0+aWZhX2xpc3Q7CisgICAgICAgICAgICAgICAgaWYoaWZhICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBicm9hZGNhc3RfaXBfYWRkciA9IGlmYS0+aWZhX2Jyb2FkY2FzdDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorIAorICAgICAgICAvKiBjaGVjayBpZiB0aGUgSVAgU291cmNlIEFkZHJlc3MgaXMgYSBCcm9hZGNhc3QgYWRkcmVzcyAqLworICAgICAgICBpZigoZGV2LT5mbGFncyAmIElGRl9CUk9BRENBU1QpICYmIChzcmNfaXBfYWRkciA9PSBicm9hZGNhc3RfaXBfYWRkcikpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogQnJvYWRjYXN0IFNvdXJjZSBBZGRyZXNzIHNpbGVudGx5IGRpc2NhcmRlZFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSAKKworICAgICAgICAvKiBjaGVjayBpZiB0aGUgSVAgU291cmNlIEFkZHJlc3MgaXMgYSBNdWx0aWNhc3QgYWRkcmVzcyAqLworICAgICAgICBpZigobnRvaGwoc3JjX2lwX2FkZHIpID49IDB4RTAwMDAwMDEpICYmCisJCShudG9obChzcmNfaXBfYWRkcikgPD0gMHhGRkZGRkZGRSkpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogTXVsdGljYXN0IFNvdXJjZSBBZGRyZXNzIHNpbGVudGx5IGRpc2NhcmRlZFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworfQorCit2b2lkIHM1MDhfbG9jayAoc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpCit7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPndhbmRldi5sb2NrLCAqc21wX2ZsYWdzKTsKK30KKwordm9pZCBzNTA4X3VubG9jayAoc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpCit7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPndhbmRldi5sb2NrLCAqc21wX2ZsYWdzKTsKK30KKworc3RhdGljIGludCByZWFkX2Nvbm5lY3Rpb25faW5mbyAoc2RsYV90ICpjYXJkKQoreworCXBwcF9tYm94X3QgKm1iID0gY2FyZC0+bWJveDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKwlwcHBfcHJpdmF0ZV9hcmVhX3QgKnBwcF9wcml2X2FyZWEgPSBkZXYtPnByaXY7CisJcHBwNTA4X2Nvbm5lY3RfaW5mb190ICpwcHA1MDhfY29ubmVjdF9pbmZvOworCWludCBlcnI7CisKKwltZW1zZXQoJm1iLT5jbWQsIDAsIHNpemVvZihwcHBfY21kX3QpKTsKKwltYi0+Y21kLmxlbmd0aCAgPSAwOworCW1iLT5jbWQuY29tbWFuZCA9IFBQUF9HRVRfQ09OTkVDVElPTl9JTkZPOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCisJaWYgKGVyciAhPSBDTURfT0spIHsgCisJCXBwcF9lcnJvcihjYXJkLCBlcnIsIG1iKTsKKwkJcHBwX3ByaXZfYXJlYS0+aXBfcmVtb3RlID0gMDsKKwkJcHBwX3ByaXZfYXJlYS0+aXBfbG9jYWwgPSAwOworCX0KKwllbHNlIHsKKwkJcHBwNTA4X2Nvbm5lY3RfaW5mbyA9IChwcHA1MDhfY29ubmVjdF9pbmZvX3QgKiltYi0+ZGF0YTsKKwkJcHBwX3ByaXZfYXJlYS0+aXBfcmVtb3RlID0gcHBwNTA4X2Nvbm5lY3RfaW5mby0+aXBfcmVtb3RlOworCQlwcHBfcHJpdl9hcmVhLT5pcF9sb2NhbCA9IHBwcDUwOF9jb25uZWN0X2luZm8tPmlwX2xvY2FsOworCisJCU5FWF9QUklOVEsoS0VSTl9JTkZPICJSRUFEIENPTk5FQ1RJT04gR09UIElQIEFERFJFU1MgJXgsICV4XG4iLAorCQkJCXBwcF9wcml2X2FyZWEtPmlwX3JlbW90ZSwKKwkJCQlwcHBfcHJpdl9hcmVhLT5pcF9sb2NhbCk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBjb25maWdfcHBwCisgKgorICoJQ29uZmlndXJlIHRoZSBwcHAgcHJvdG9jb2wgYW5kIGVuYWJsZSBjb21tdW5pY2F0aW9ucy4JCQorICoKKyAqICAgCVRoZSBpZl9vcGVuIGZ1bmN0aW9uIGJpbmRzIHRoaXMgZnVuY3Rpb24gdG8gdGhlIHBvbGwgcm91dGluZS4KKyAqICAgICAgVGhlcmVmb3JlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcnVuIGV2ZXJ5IHRpbWUgdGhlIHBwcCBpbnRlcmZhY2UKKyAqICAgICAgaXMgYnJvdWdodCB1cC4gIAorICogICAgICAKKyAqCUlmIHRoZSBjb21tdW5pY2F0aW9ucyBhcmUgbm90IGVuYWJsZWQsIHByb2NlZWQgdG8gY29uZmlndXJlCisgKiAgICAgIHRoZSBjYXJkIGFuZCBlbmFibGUgY29tbXVuaWNhdGlvbnMuCisgKgorICogICAgICBJZiB0aGUgY29tbXVuaWNhdGlvbnMgYXJlIGVuYWJsZWQsIGl0IG1lYW5zIHRoYXQgdGhlIGludGVyZmFjZQorICogICAgICB3YXMgc2h1dGRvd24gYnkgZXRoZXIgdGhlIHVzZXIgb3IgZHJpdmVyLiBJbiB0aGlzIGNhc2UsIHdlIAorICogICAgICBoYXZlIHRvIGNoZWNrIHRoYXQgdGhlIElQIGFkZHJlc3NlcyBoYXZlIG5vdCBjaGFuZ2VkLiAgSWYKKyAqICAgICAgdGhlIElQIGFkZHJlc3NlcyBjaGFuZ2VkLCB3ZSBoYXZlIHRvIHJlY29uZmlndXJlIHRoZSBmaXJtd2FyZQorICogICAgICBhbmQgdXBkYXRlIHRoZSBjaGFuZ2VkIElQIGFkZHJlc3Nlcy4gIE90aGVyd2lzZSwganVzdCBleGl0LgorICovCitzdGF0aWMgaW50IGNvbmZpZ19wcHAgKHNkbGFfdCAqY2FyZCkKK3sKKworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCXBwcF9mbGFnc190ICpmbGFncyA9IGNhcmQtPmZsYWdzOworCXBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKworCWlmIChjYXJkLT51LnAuY29tbV9lbmFibGVkKXsKKworCQlpZiAocHBwX3ByaXZfYXJlYS0+aXBfbG9jYWxfdG1wICE9IHBwcF9wcml2X2FyZWEtPmlwX2xvY2FsIHx8CisJCSAgICBwcHBfcHJpdl9hcmVhLT5pcF9yZW1vdGVfdG1wICE9IHBwcF9wcml2X2FyZWEtPmlwX3JlbW90ZSl7CisJCQkKKwkJCS8qIFRoZSBJUCBhZGRlcnNzZXMgaGF2ZSBjaGFuZ2VkLCB3ZSBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdG9wIHRoZSBjb21tdW5pY2F0aW9ucyBhbmQgcmVjb25maWd1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBjYXJkLiBSZWFzb246IHRoZSBmaXJtd2FyZSBtdXN0IGtub3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBsb2NhbCBhbmQgcmVtb3RlIElQIGFkZHJlc3Nlcy4gKi8KKwkJCWRpc2FibGVfY29tbShjYXJkKTsKKwkJCXdhbnBpcGVfc2V0X3N0YXRlKGNhcmQsIFdBTl9ESVNDT05ORUNURUQpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IElQIGFkZHJlc3NlcyBjaGFuZ2VkIVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogUmVzdGFydGluZyBjb21tdW5pY2F0aW9ucyAuLi5cbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQl9ZWxzZXsgCisJCQkvKiBJUCBhZGRyZXNzZXMgYXJlIHRoZSBzYW1lIGFuZCB0aGUgbGluayBpcyB1cCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgKiB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGhlcmUuIFRoZXJlZm9yZSwgZXhpdCAqLworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBSZWNvcmQgdGhlIG5ldyBJUCBhZGRyZXNlcyAqLworCXBwcF9wcml2X2FyZWEtPmlwX2xvY2FsID0gcHBwX3ByaXZfYXJlYS0+aXBfbG9jYWxfdG1wOworCXBwcF9wcml2X2FyZWEtPmlwX3JlbW90ZSA9IHBwcF9wcml2X2FyZWEtPmlwX3JlbW90ZV90bXA7CisKKwlpZiAoY29uZmlnNTA4KGRldiwgY2FyZCkpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRmFpbGVkIHRvIGNvbmZpZ3VyZSBQUFAgZGV2aWNlXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChwcHBfc2V0X2ludHJfbW9kZShjYXJkLCBQUFBfSU5UUl9SWFJEWXwKKwkJCSAgICAJCVBQUF9JTlRSX1RYUkRZfAorCQkJCSAgICAJUFBQX0lOVFJfTU9ERU18CisJCQkJICAgIAlQUFBfSU5UUl9ESVNDIHwKKwkJCQkgICAgCVBQUF9JTlRSX09QRU4gfAorCQkJCSAgICAJUFBQX0lOVFJfRFJPUF9EVFIgfAorCQkJCQlQUFBfSU5UUl9USU1FUikpIHsKKworCQlwcmludGsoS0VSTl9JTkZPICIlczogRmFpbGVkIHRvIGNvbmZpZ3VyZSBib2FyZCBpbnRlcnJ1cHRzICFcbiIsIAorCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAwOworCX0KKworICAgICAgICAvKiBUdXJuIG9mZiB0aGUgdHJhbnNtaXQgYW5kIHRpbWVyIGludGVycnVwdCAqLworCWZsYWdzLT5pbWFzayAmPSB+KFBQUF9JTlRSX1RYUkRZIHwgUFBQX0lOVFJfVElNRVIpIDsKKworCisJLyogSWYgeW91IGFyZSBub3QgdGhlIGF1dGhlbnRpY2F0b3IgYW5kIGFueSBvbmUgb2YgdGhlIHByb3RvY29sIGlzIAorCSAqIGVuYWJsZWQgdGhlbiB3ZSBjYWxsIHRoZSBzZXRfb3V0X2JvdW5kX2F1dGhlbnRpY2F0aW9uLgorCSAqLworCWlmICggIWNhcmQtPnUucC5hdXRoZW50aWNhdG9yICAmJiAocHBwX3ByaXZfYXJlYS0+cGFwIHx8IHBwcF9wcml2X2FyZWEtPmNoYXApKSB7CisJCWlmICggcHBwX3NldF9vdXRibmRfYXV0aChjYXJkLCBwcHBfcHJpdl9hcmVhKSApeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE91dGJvdW5kIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCAhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IAorCQorCS8qIElmIHlvdSBhcmUgdGhlIGF1dGhlbnRpY2F0b3IgYW5kIGFueSBvbmUgb2YgdGhlIHByb3RvY29sIGlzIGVuYWJsZWQKKwkgKiB0aGVuIHdlIGNhbGwgdGhlIHNldF9pbl9ib3VuZF9hdXRoZW50aWNhdGlvbi4KKwkgKi8KKwlpZiAoY2FyZC0+dS5wLmF1dGhlbnRpY2F0b3IgJiYgKHBwcF9wcml2X2FyZWEtPnBhcCB8fCBwcHBfcHJpdl9hcmVhLT5jaGFwKSl7CisJCWlmIChwcHBfc2V0X2luYm5kX2F1dGgoY2FyZCwgcHBwX3ByaXZfYXJlYSkpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEluYm91bmQgYXV0aGVudGljYXRpb24gZmFpbGVkICFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CQorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBJZiB3ZSBmYWlsIHRvIGVuYWJsZSBjb21tdW5pY2F0aW9ucyBoZXJlIGl0J3MgT0ssCisJICogc2luY2UgdGhlIERUUiB0aW1lciB3aWxsIGNhdXNlIGEgZGlzY29ubmVjdGVkLCB3aGljaAorCSAqIHdpbGwgcmV0cmlnZ2VyIGNvbW11bmljYXRpb24gaW4gdGltZXJfaW50cigpICovCisJaWYgKHBwcF9jb21tX2VuYWJsZShjYXJkKSA9PSBDTURfT0spIHsKKwkJd2FucGlwZV9zZXRfc3RhdGUoY2FyZCwgV0FOX0NPTk5FQ1RJTkcpOworCQlpbml0X3BwcF90eF9yeF9idWZmKGNhcmQpOworCX0KKworCXJldHVybiAwOyAKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHBwcF9wb2xsCisgKgkKKyAqIFJhdGlvbmFsZToKKyAqIAlXZSBjYW5ub3QgbWFuaXB1bGF0ZSB0aGUgcm91dGluZyB0YWJsZXMsIG9yCisgKiAgICAgIGlwIGFkZHJlc3NlcyB3aXRoaW5nIHRoZSBpbnRlcnJ1cHQuIFRoZXJlZm9yZQorICogICAgICB3ZSBtdXN0IHBlcmZvcm0gc3VjaCBhY3RvbnMgb3V0c2lkZSBhbiBpbnRlcnJ1cHQgCisgKiAgICAgIGF0IGEgbGF0ZXIgdGltZS4gCisgKgorICogRGVzY3JpcHRpb246CQorICoJUFBQIHBvbGxpbmcgcm91dGluZSwgcmVzcG9uc2libGUgZm9yIAorICogICAgIAlzaHV0dGluZyBkb3duIGludGVyZmFjZXMgdXBvbiBkaXNjb25uZWN0CisgKiAgICAgCWFuZCBhZGRpbmcvcmVtb3Zpbmcgcm91dGVzLiAKKyAqICAgICAgCisgKiBVc2FnZTogICAgICAgIAorICogCVRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgZm9yIGVhY2ggcHBwICAKKyAqIAlpbnRlcmZhY2UgdGhyb3VnaCBhIHRxX3NjaGVkdWxlIGJvdHRvbSBoYWxmLgorICogICAgICAKKyAqICAgICAgdHJpZ2dlcl9wcHBfcG9sbCgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8ga2ljaworICogICAgICB0aGUgcHBwX3BvbGwgcm91dGluZS4gIAorICovCitzdGF0aWMgdm9pZCBwcHBfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYTsgCQorCXNkbGFfdCAqY2FyZDsKKwl1OCBjaGVja19nYXRld2F5PTA7CisJcHBwX2ZsYWdzX3QgKmZsYWdzOworCisJaWYgKCFkZXYgfHwgKHBwcF9wcml2X2FyZWEgPSBkZXYtPnByaXYpID09IE5VTEwpCisJCXJldHVybjsKKworCWNhcmQgPSBwcHBfcHJpdl9hcmVhLT5jYXJkOworCWZsYWdzID0gY2FyZC0+ZmxhZ3M7CisKKwkvKiBTaHV0ZG93biBpcyBpbiBwcm9ncmVzcywgc3RvcCB3aGF0IHlvdSBhcmUgCisJICogZG9pbmcgYW5kIGdldCBvdXQgKi8KKwlpZiAodGVzdF9iaXQoUEVSSV9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJY2xlYXJfYml0KFBPTExfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGlmX29wZW4oKSBmdW5jdGlvbiBoYXMgdHJpZ2dlcmVkIHRoZSBwb2xsaW5nIHJvdXRpbmUKKwkgKiB0byBkZXRlcm1pbmUgdGhlIGNvbmZpZ3VyZWQgSVAgYWRkcmVzc2VzLiAgT25jZSB0aGUKKwkgKiBhZGRyZXNzZXMgYXJlIGZvdW5kLCB0cmlnZ2VyIHRoZSBjaGRsYyBjb25maWd1cmF0aW9uICovCisJaWYgKHRlc3RfYml0KDAsJnBwcF9wcml2X2FyZWEtPmNvbmZpZ19wcHApKXsKKworCQlwcHBfcHJpdl9hcmVhLT5pcF9sb2NhbF90bXAgID0gZ2V0X2lwX2FkZHJlc3MoZGV2LFdBTl9MT0NBTF9JUCk7CisJCXBwcF9wcml2X2FyZWEtPmlwX3JlbW90ZV90bXAgPSBnZXRfaXBfYWRkcmVzcyhkZXYsV0FOX1BPSU5UT1BPSU5UX0lQKTsKKworCQlpZiAocHBwX3ByaXZfYXJlYS0+aXBfbG9jYWxfdG1wID09IHBwcF9wcml2X2FyZWEtPmlwX3JlbW90ZV90bXAgJiYgCisJICAgICAgICAgICAgY2FyZC0+dS5wLmlwX21vZGUgPT0gV0FOT1BUX1BQUF9IT1NUKXsKKwkJCQorCQkJaWYgKCsrcHBwX3ByaXZfYXJlYS0+aXBfZXJyb3IgPiBNQVhfSVBfRVJST1JTKXsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJcbiVzOiAtLS0gV0FSTklORyAtLS1cbiIsCisJCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogVGhlIGxvY2FsIElQIGFkZHJlc3MgaXMgdGhlIHNhbWUgYXMgdGhlXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBvaW50LXRvLVBvaW50IElQIGFkZHJlc3MuXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IC0tLSBXQVJOSU5HIC0tLVxuXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQl9ZWxzZXsKKwkJCQljbGVhcl9iaXQoUE9MTF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQkJCXBwcF9wcml2X2FyZWEtPnBvbGxfZGVsYXlfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMrSFo7CisJCQkJYWRkX3RpbWVyKCZwcHBfcHJpdl9hcmVhLT5wb2xsX2RlbGF5X3RpbWVyKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlwcHBfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCB8PSBUTVJfSU5UX0VOQUJMRURfQ09ORklHOworCQlmbGFncy0+aW1hc2sgfD0gUFBQX0lOVFJfVElNRVI7CQorCQlwcHBfcHJpdl9hcmVhLT5pcF9lcnJvcj0wOwkKKwkJCisJCWNsZWFyX2JpdCgwLCZwcHBfcHJpdl9hcmVhLT5jb25maWdfcHBwKTsKKwkJY2xlYXJfYml0KFBPTExfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkJcmV0dXJuOworCX0KKworCS8qIER5bmFtaWMgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLCBhcyB3ZWxsIGFzIGR5bmFtaWMKKwkgKiByb3V0aW5nLiAgKi8KKwkKKwlzd2l0Y2ggKGNhcmQtPndhbmRldi5zdGF0ZSkgeworCQorCWNhc2UgV0FOX0RJU0NPTk5FQ1RFRDoKKworCQkvKiBJZiB0aGUgZHluYW1pYyBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiBpcyBvbiwgYW5kIGludGVyZmFjZSAKKwkJICogaXMgdXAsIHRoZW4gYnJpbmcgZG93biB0aGUgbmV0b3dyayBpbnRlcmZhY2UgKi8KKworCQlpZiAodGVzdF9iaXQoRFlOX09QVF9PTiwmcHBwX3ByaXZfYXJlYS0+aW50ZXJmYWNlX2Rvd24pICYmCisJCSAgICAhdGVzdF9iaXQoREVWX0RPV04sJnBwcF9wcml2X2FyZWEtPmludGVyZmFjZV9kb3duKQkmJgkKKwkJICAgIGNhcmQtPndhbmRldi5kZXYtPmZsYWdzICYgSUZGX1VQKXsJCisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnRlcmZhY2UgJXMgZG93bi5cbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSxjYXJkLT53YW5kZXYuZGV2LT5uYW1lKTsKKwkJCWNoYW5nZV9kZXZfZmxhZ3MoY2FyZC0+d2FuZGV2LmRldiwKKwkJCQkJKGNhcmQtPndhbmRldi5kZXYtPmZsYWdzJn5JRkZfVVApKTsKKwkJCXNldF9iaXQoREVWX0RPV04sJnBwcF9wcml2X2FyZWEtPmludGVyZmFjZV9kb3duKTsKKwkJfWVsc2V7CisJCQkvKiBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBsb2NhbCBJUCBhZGRyZXNzIGlzCisgICAgICAgICAgICAgICAJICAgCSAqIHplcm8uIElmIGl0IGlzLCB3ZSBzaG91bGRuJ3QgdHJ5IHRvIHJlbW92ZSBpdC4KKyAgICAgICAgICAgICAgICAgCSAqIEZvciBzb21lIHJlYXNvbiB0aGUga2VybmVsIGNyYXNoZXMgYmFkbHkgaWYgCisgICAgICAgICAgICAgICAgIAkgKiB3ZSB0cnkgdG8gcmVtb3ZlIHRoZSByb3V0ZSB0d2ljZSAqLworCisJCQlpZiAoY2FyZC0+d2FuZGV2LmRldi0+ZmxhZ3MgJiBJRkZfVVAgJiYgCisJCSAgICAJICAgIGdldF9pcF9hZGRyZXNzKGNhcmQtPndhbmRldi5kZXYsV0FOX0xPQ0FMX0lQKSAmJgorCQkgICAgCSAgICBjYXJkLT51LnAuaXBfbW9kZSA9PSBXQU5PUFRfUFBQX1BFRVIpeworCisJCQkJcmVtb3ZlX3JvdXRlKGNhcmQpOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBXQU5fQ09OTkVDVEVEOgorCQkKKwkJLyogSW4gU01QIG1hY2hpbmUgdGhpcyBjb2RlIGNhbiBleGVjdXRlIGJlZm9yZSB0aGUgaW50ZXJmYWNlCisJCSAqIGNvbWVzIHVwLiAgSW4gdGhpcyBjYXNlLCB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHdlIGRvIG5vdAorCQkgKiB0cnkgdG8gYnJpbmcgdXAgdGhlIGludGVyZmFjZSBiZWZvcmUgZGV2X29wZW4oKSBpcyBmaW5pc2hlZCAqLworCisKKwkJLyogREVWX0RPV04gd2lsbCBiZSBzZXQgb25seSB3aGVuIHdlIGJyaW5nIGRvd24gdGhlIGludGVyZmFjZQorCQkgKiBmb3IgdGhlIHZlcnkgZmlyc3QgdGltZS4gVGhpcyB3YXkgd2Uga25vdyB0aGF0IGl0IHdhcyB1cworCQkgKiB0aGF0IGJyb3VnaHQgdGhlIGludGVyZmFjZSBkb3duICovCisJCQorCQlpZiAodGVzdF9iaXQoRFlOX09QVF9PTiwmcHBwX3ByaXZfYXJlYS0+aW50ZXJmYWNlX2Rvd24pICYmCisJICAgICAgICAgICAgdGVzdF9iaXQoREVWX0RPV04sICAmcHBwX3ByaXZfYXJlYS0+aW50ZXJmYWNlX2Rvd24pICYmCisgCQkgICAgIShjYXJkLT53YW5kZXYuZGV2LT5mbGFncyAmIElGRl9VUCkpeworCQkJCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSW50ZXJmYWNlICVzIHVwLlxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLGNhcmQtPndhbmRldi5kZXYtPm5hbWUpOworCQkJCisJCQljaGFuZ2VfZGV2X2ZsYWdzKGNhcmQtPndhbmRldi5kZXYsKGNhcmQtPndhbmRldi5kZXYtPmZsYWdzfElGRl9VUCkpOworCQkJY2xlYXJfYml0KERFVl9ET1dOLCZwcHBfcHJpdl9hcmVhLT5pbnRlcmZhY2VfZG93bik7CisJCQljaGVja19nYXRld2F5PTE7CisJCX0KKworCQlpZiAoKGNhcmQtPnUucC5pcF9tb2RlID09IFdBTk9QVF9QUFBfUEVFUikgJiYgCisJCSAgICB0ZXN0X2JpdCgxLCZSZWFkX2Nvbm5lY3Rpb25faW5mbykpIHsgCisJCQkKKwkJCXByb2Nlc3Nfcm91dGUoY2FyZCk7CisJCQljbGVhcl9iaXQoMSwmUmVhZF9jb25uZWN0aW9uX2luZm8pOworCQkJY2hlY2tfZ2F0ZXdheT0xOworCQl9CisKKwkJaWYgKHBwcF9wcml2X2FyZWEtPmdhdGV3YXkgJiYgY2hlY2tfZ2F0ZXdheSkKKwkJCWFkZF9nYXRld2F5KGNhcmQsZGV2KTsKKworCQlicmVhazsKKwl9CisJY2xlYXJfYml0KFBPTExfQ1JJVCwmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwlyZXR1cm47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB0cmlnZ2VyX3BwcF9wb2xsCisgKgorICogRGVzY3JpcHRpb246CisgKiAJQWRkIGEgcHBwX3BvbGwoKSB0YXNrIGludG8gYSB0cV9zY2hlZHVsZXIgYmggaGFuZGxlcgorICogICAgICBmb3IgYSBzcGVjaWZpYyBpbnRlcmZhY2UuICBUaGlzIHdpbGwga2ljaworICogICAgICB0aGUgcHBwX3BvbGwoKSByb3V0aW5lIGF0IGEgbGF0ZXIgdGltZS4gCisgKgorICogVXNhZ2U6CisgKiAJSW50ZXJydXB0cyB1c2UgdGhpcyB0byBkZWZlciBhIHRha3MgdG8gCisgKiAgICAgIGEgcG9sbGluZyByb3V0aW5lLgorICoKKyAqLwkKKworc3RhdGljIHZvaWQgdHJpZ2dlcl9wcHBfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBwcF9wcml2YXRlX2FyZWFfdCAqcHBwX3ByaXZfYXJlYTsKKwlpZiAoKHBwcF9wcml2X2FyZWE9ZGV2LT5wcml2KSAhPSBOVUxMKXsgCQorCQkKKwkJc2RsYV90ICpjYXJkID0gcHBwX3ByaXZfYXJlYS0+Y2FyZDsKKworCQlpZiAodGVzdF9iaXQoUEVSSV9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKHRlc3RfYW5kX3NldF9iaXQoUE9MTF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJCXJldHVybjsKKwkJfQorCisJCXNjaGVkdWxlX3dvcmsoJnBwcF9wcml2X2FyZWEtPnBvbGxfd29yayk7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgcHBwX3BvbGxfZGVsYXkgKHVuc2lnbmVkIGxvbmcgZGV2X3B0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X3B0cjsKKwl0cmlnZ2VyX3BwcF9wb2xsKGRldik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBkZXRlY3RfYW5kX2ZpeF90eF9idWcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCU9uIGNvbm5lY3QsIGlmIHRoZSBib2FyZCB0eCBidWZmZXIgcHRyIGlzIG5vdCB0aGUgc2FtZQorICogICAgICBhcyB0aGUgZHJpdmVyIHR4IGJ1ZmZlciBwdHIsIHdlIGZvdW5kIGEgZmlybXdhcmUgYnVnLgorICogICAgICBSZXBvcnQgdGhlIGJ1ZyB0byB0aGUgYWJvdmUgbGF5ZXIuICBUbyBmaXggdGhlCisgKiAgICAgIGVycm9yIHJlc3RhcnQgY29tbXVuaWNhdGlvbnMgYWdhaW4uCisgKgorICogVXNhZ2U6CisgKgorICovCQorCitzdGF0aWMgaW50IGRldGVjdF9hbmRfZml4X3R4X2J1ZyAoc2RsYV90ICpjYXJkKQoreworCWlmICgoKHVuc2lnbmVkIGxvbmcpY2FyZC0+dS5wLnR4YnVmX2Jhc2UmMHhGRkYpICE9ICgoKmNhcmQtPnUucC50eGJ1Zl9uZXh0KSYweEZGRikpeworCQlORVhfUFJJTlRLKEtFUk5fSU5GTyAiTWFqb3IgRXJyb3IsIEZpeCB0aGUgYnVnXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qKioqKiogRW5kICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NkbGFfeDI1LmMgYi9kcml2ZXJzL25ldC93YW4vc2RsYV94MjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTkzZDJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3NkbGFfeDI1LmMKQEAgLTAsMCArMSw1NDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogc2RsYV94MjUuYwlXQU5QSVBFKHRtKSBNdWx0aXByb3RvY29sIFdBTiBMaW5rIERyaXZlci4gIFguMjUgbW9kdWxlLgorKgorKiBBdXRob3I6CU5lbmFkIENvcmJpYwk8bmNvcmJpY0BzYW5nb21hLmNvbT4KKyoKKyogQ29weXJpZ2h0OgkoYykgMTk5NS0yMDAxIFNhbmdvbWEgVGVjaG5vbG9naWVzIEluYy4KKyoKKyoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogQXByIDAzLCAyMDAxICBOZW5hZCBDb3JiaWMJIG8gRml4ZWQgdGhlIHJ4X3NrYj1OVUxMIGJ1ZyBpbiB4MjUgaW4gcnhfaW50cigpLgorKiBEZWMgMjYsIDIwMDAgIE5lbmFkIENvcmJpYwkgbyBBZGRlZCBhIG5ldyBwb2xsaW5nIHJvdXRpbmUsIHRoYXQgdXNlcworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGtlcm5lbCB0aW1lciAobW9yZSBlZmZpY2llbnQpLgorKiBEZWMgMjUsIDIwMDAgIE5lbmFkIENvcmJpYwkgbyBVcGRhdGVkIGZvciAyLjQuWCBrZXJuZWwKKyogSnVsIDI2LCAyMDAwICBOZW5hZCBDb3JiaWMJIG8gSW5jcmVhc2VkIHRoZSBsb2NhbCBwYWNrZXQgYnVmZmVyaW5nCisqIAkJCQkgICBmb3IgQVBJIHRvIDQwOTYraGVhZGVyX3NpemUuIAorKiBKdWwgMTcsIDIwMDAgIE5lbmFkIENvcmJpYwkgbyBGaXhlZCB0aGUgeDI1IHN0YXJ0dXAgYnVnLiBFbmFibGUgCisqIAkJCQkgICBjb21tdW5pY2F0aW9ucyBvbmx5IGFmdGVyIGFsbCBpbnRlcmZhY2VzCisqIAkJCQkgICBjb21lIHVwLiAgSElHSCBTVkMvUFZDIGlzIHVzZWQgdG8gY2FsY3VsYXRlCisqIAkJCQkgICB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmFibGUgcHJvdG9jb2wgb25seSBhZnRlciBhbGwgaW50ZXJmYWNlcworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgZW5hYmxlZC4KKyogSnVsIDEwLCAyMDAwCU5lbmFkIENvcmJpYwkgbyBGaXhlZCB0aGUgTV9CSVQgYnVnLiAKKyogQXByIDI1LCAyMDAwICBOZW5hZCBDb3JiaWMJIG8gUGFzcyBNb2RlbSBtZXNzYWdlcyB0byB0aGUgQVBJLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlIGlkbGUgdGltZW91dCBpbiBYMjUgQVBJLgorKiBBcHIgMTQsIDIwMDAgIE5lbmFkIENvcmJpYwkgbyBGaXhlZDogTGFyZ2UgTENOIG51bWJlciBzdXBwb3J0LgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhpbXVtIExDTiBudW1iZXIgaXMgNDA5NS4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4aW11bSBudW1iZXIgb2YgWDI1IGNoYW5uZWxzIGlzIDI1NS4KKyogQXByIDA2LCAyMDAwICBOZW5hZCBDb3JiaWMJIG8gQWRkZWQgU01QIFN1cHBvcnQuCisqIE1hciAyOSwgMjAwMCAgTmVuYWQgQ29yYmljCSBvIEFkZGVkIHN1cHBvcnQgZm9yIFM1MTQgUENJIENhcmQKKyogTWFyIDIzLCAyMDAwICBOZW5hZCBDb3JiaWMJIG8gSW1wcm92ZWQgdGFzayBxdWV1ZSwgQkggaGFuZGxpbmcuCisqIE1hciAxNCwgMjAwMCAgTmVuYWQgQ29yYmljICAJIG8gVXBkYXRlZCBQcm90b2NvbCBWaW9sYXRpb24gaGFuZGxpbmcKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZXMuICBCdWcgRml4LgorKiBNYXIgMTAsIDIwMDAgIE5lbmFkIENvcmJpYwkgbyBCdWcgRml4OiBjb3JydXB0ZWQgbWJveCByZWNvdmVyeS4KKyogTWFyIDA5LCAyMDAwICBOZW5hZCBDb3JiaWMgICAgIG8gRml4ZWQgdGhlIGF1dG8gSERMQyBidWcuCisqIE1hciAwOCwgMjAwMAlOZW5hZCBDb3JiaWMgICAgIG8gRml4ZWQgTEFQQiBIRExDIHN0YXJ0dXAgcHJvYmxlbXMuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uIG11c3QgYnJpbmcgdGhlIGxpbmsgdXAgCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSB0eC9yeCwgYW5kIGJyaW5nIHRoZSAKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluayBkb3duIG9uIGNsb3NlKCkuCisqIE1hciAwNiwgMjAwMAlOZW5hZCBDb3JiaWMJIG8gQWRkZWQgYW4gb3B0aW9uIGZvciBsb2dnaW5nIGNhbGwgc2V0dXAgCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uLiAKKyogRmViIDI5LCAyMDAwICBOZW5hZCBDb3JiaWMgCSBvIEFkZGVkIHN1cHBvcnQgZm9yIExBUEIgSERMQyBBUEkKKyogRmViIDI1LCAyMDAwICBOZW5hZCBDb3JiaWMgICAgIG8gRml4ZWQgdGhlIG1vZGVtIGZhaWx1cmUgaGFuZGxpbmcuCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIE1vZGVtIE9PQiBtZXNzYWdlIHdpbGwgYmUgcGFzc2VkIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgdXNlci4KKyogRmViIDIxLCAyMDAwICBOZW5hZCBDb3JiaWMgCSBvIEFkZGVkIFhwaXBlbW9uIERlYnVnIFN1cHBvcnQKKyogRGVjIDMwLCAxOTk5IAlOZW5hZCBDb3JiaWMJIG8gU29ja2V0IGJhc2VkIFgyNUFQSSAKKyogU2VwIDE3LCAxOTk4CUphc3ByZWV0IFNpbmdoCSBvIFVwZGF0ZXMgZm9yIDIuMi5YICBrZXJuZWwKKyogTWFyIDE1LCAxOTk4CUFsYW4gQ294CSBvIDIuMS54IHBvcnRpbmcKKyogRGVjIDE5LCAxOTk3CUphc3ByZWV0IFNpbmdoCSBvIEFkZGVkIG11bHRpLWNoYW5uZWwgSVBYIHN1cHBvcnQKKyogTm92IDI3LCAxOTk3CUphc3ByZWV0IFNpbmdoCSBvIEFkZGVkIHByb3RlY3Rpb24gYWdhaW5zdCBlbmFibGluZyBvZiBpcnFzCisqCQkJCSAgIHdoZW4gdGhleSBhcmUgZGlzYWJsZWQuCisqIE5vdiAxNywgMTk5NyAgRmFyaGFuIFRoYXdhciAgICBvIEFkZGVkIElQWCBzdXBwb3J0CisqCQkJCSBvIENoYW5nZWQgaWZfc2VuZCgpIHRvIG5vdyBidWZmZXIgcGFja2V0cyB3aGVuCisqCQkJCSAgIHRoZSBib2FyZCBpcyBidXN5CisqCQkJCSBvIFJlbW92ZWQgcXVldWVpbmcgb2YgcGFja2V0cyB2aWEgdGhlIHBvbGxpbmcKKyoJCQkJICAgcm91dGluZworKgkJCQkgbyBDaGFuZ2VkIGlmX3NlbmQoKSBjcml0aWNhbCBmbGFncyB0byBwcm9wZXJseQorKgkJCQkgICBoYW5kbGUgcmFjZSBjb25kaXRpb25zCisqIE5vdiAwNiwgMTk5NyAgRmFyaGFuIFRoYXdhciAgICBvIEFkZGVkIHN1cHBvcnQgZm9yIFNWQyB0aW1lb3V0cworKgkJCQkgbyBDaGFuZ2VkIFBWQyBlbmNhcHN1bGF0aW9uIHRvIEVUSF9QX0lQCisqIEp1bCAyMSwgMTk5NyAgSmFzcHJlZXQgU2luZ2gJIG8gRml4ZWQgZnJlZWluZyB1cCBvZiBidWZmZXJzIHVzaW5nIGtmcmVlKCkKKyoJCQkJICAgd2hlbiBwYWNrZXRzIGFyZSByZWNlaXZlZC4KKyogTWFyIDExLCAxOTk3ICBGYXJoYW4gVGhhd2FyICAgVmVyc2lvbiAzLjEuMQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBhZGRlZCBzdXBwb3J0IGZvciBWMzUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gY2hhbmdlZCBpZl9zZW5kKCkgdG8gcmV0dXJuIDAgaWYKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FuZGV2LmNyaXRpY2FsKCkgaXMgdHJ1ZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyBmcmVlIHNvY2tldCBidWZmZXIgaW4gaWZfc2VuZCgpIGlmCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyAwCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvIGFkZGVkIHN1cHBvcnQgZm9yIHNpbmdsZSAnQCcgYWRkcmVzcyB0bworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHQgYWxsIGluY29taW5nIGNhbGxzCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvIGZpeGVkIGJ1ZyBpbiBzZXRfY2hhbl9zdGF0ZSgpIHRvIGRpc2Nvbm5lY3QKKyogSmFuIDE1LCAxOTk3CUdlbmUgS296aW4JVmVyc2lvbiAzLjEuMAorKgkJCQkgbyBpbXBsZW1lbnRlZCBleGVjKCkgZW50cnkgcG9pbnQKKyogSmFuIDA3LCAxOTk3CUdlbmUgS296aW4JSW5pdGlhbCB2ZXJzaW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJSW5jbHVkZXMgCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkvKiBwcmludGsoKSwgYW5kIG90aGVyIHVzZWZ1bCBzdHVmZiAqLworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgkvKiBvZmZzZXRvZigpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4JLyogcmV0dXJuIGNvZGVzICovCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CS8qIGlubGluZSBtZW1zZXQoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgkvKiBrbWFsbG9jKCksIGtmcmVlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC93YW5yb3V0ZXIuaD4JLyogV0FOIHJvdXRlciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L3dhbnBpcGUuaD4JLyogV0FOUElQRSBjb21tb24gdXNlciBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CS8qIGh0b25zKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogRXhwZXJpbWVudGFsIGRlbGF5ICovCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZGxhX3gyNS5oPgkvKiBYLjI1IGZpcm13YXJlIEFQSSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L2lmX3dhbnBpcGVfY29tbW9uLmg+CisjaW5jbHVkZSA8bGludXgvaWZfd2FucGlwZS5oPgorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJRGVmaW5lcyAmIE1hY3JvcyAKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKyNkZWZpbmUJQ01EX09LCQkwCQkvKiBub3JtYWwgZmlybXdhcmUgcmV0dXJuIGNvZGUgKi8KKyNkZWZpbmUJQ01EX1RJTUVPVVQJMHhGRgkJLyogZmlybXdhcmUgY29tbWFuZCB0aW1lZCBvdXQgKi8KKyNkZWZpbmUJTUFYX0NNRF9SRVRSWQkxMAkJLyogbWF4IG51bWJlciBvZiBmaXJtd2FyZSByZXRyaWVzICovCisKKyNkZWZpbmUJWDI1X0NIQU5fTVRVCTQwOTYJCS8qIHVuZnJhZ21lbnRlZCBsb2dpY2FsIGNoYW5uZWwgTVRVICovCisjZGVmaW5lCVgyNV9IUkRIRFJfU1oJNwkJLyogbWF4IGVuY2Fwc3VsYXRpb24gaGVhZGVyIHNpemUgKi8KKyNkZWZpbmUJWDI1X0NPTkNUX1RNT1VUCSg5MCpIWikJCS8qIGxpbmsgY29ubmVjdGlvbiB0aW1lb3V0ICovCisjZGVmaW5lCVgyNV9SRUNPTl9UTU9VVAkoMTAqSFopCQkvKiBsaW5rIGNvbm5lY3Rpb24gdGltZW91dCAqLworI2RlZmluZQlDT05ORUNUX1RJTUVPVVQJKDkwKkhaKQkJLyogbGluayBjb25uZWN0aW9uIHRpbWVvdXQgKi8KKyNkZWZpbmUJSE9MRF9ET1dOX1RJTUUJKDMwKkhaKQkJLyogbGluayBob2xkIGRvd24gdGltZSAqLworI2RlZmluZSBNQVhfQkhfQlVGRgkxMAorI2RlZmluZSBNX0JJVAkJMHgwMQkKKworLy8jZGVmaW5lIFBSSU5UX0RFQlVHIDEKKyNpZmRlZiBQUklOVF9ERUJVRworI2RlZmluZSBEQkdfUFJJTlRLKGZvcm1hdCwgYS4uLikgcHJpbnRrKGZvcm1hdCwgIyMgYSkKKyNlbHNlCisjZGVmaW5lIERCR19QUklOVEsoZm9ybWF0LCBhLi4uKQorI2VuZGlmICAKKworI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfUE9MTF9BQ1RJVkUgICAgICAweDAxCisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9QT0xMX0NPTk5FQ1RfT04gIDB4MDIKKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX1BPTExfQ09OTkVDVF9PRkYgMHgwNAorI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfUE9MTF9ESVNDT05ORUNUICAweDA4CisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9DTURfRVhFQwkgMHgxMAorI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfVVBEQVRFCQkgMHgyMAorI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfVURQX1BLVAkJIDB4NDAKKworI2RlZmluZSBNQVhfWDI1X0FERFJfU0laRQkxNgorI2RlZmluZSBNQVhfWDI1X0RBVEFfU0laRSAJMTI5CisjZGVmaW5lIE1BWF9YMjVfRkFDTF9TSVpFCTExMAorCisjZGVmaW5lIFRSWV9DTURfQUdBSU4JMgorI2RlZmluZSBERUxBWV9SRVNVTFQgICAgMQorI2RlZmluZSBSRVRVUk5fUkVTVUxUICAgMAorCisjZGVmaW5lIERDRCh4KSAoeCAmIDB4MDMgPyAiSElHSCIgOiAiTE9XIikKKyNkZWZpbmUgQ1RTKHgpICh4ICYgMHgwNSA/ICJISUdIIiA6ICJMT1ciKQorCisKKy8qIERyaXZlciB3aWxsIG5vdCB3cml0ZSBsb2cgbWVzc2FnZXMgYWJvdXQgCisgKiBtb2RlbSBzdGF0dXMgaWYgZGVmaW5lZC4qLworI2RlZmluZSBNT0RFTV9OT1RfTE9HIDEKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICogCUZvciBJUFhXQU4gCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgQ1ZIZXhUb0FzY2lpKGIpICgoKHVuc2lnbmVkIGNoYXIpKGIpID4gKHVuc2lnbmVkIGNoYXIpOSkgPyAoKHVuc2lnbmVkIGNoYXIpJ0EnICsgKCh1bnNpZ25lZCBjaGFyKShiKSAtICh1bnNpZ25lZCBjaGFyKTEwKSkgOiAoKHVuc2lnbmVkIGNoYXIpJzAnICsgKHVuc2lnbmVkIGNoYXIpKGIpKSkKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgICAgICAgICBNRU1PUlkgREVCVUdHSU5HIEZVTkNUSU9OCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2RlZmluZSBLTUVNX1NBRkVUWVpPTkUgOAorCitzdGF0aWMgdm9pZCAqIGRiZ19rbWFsbG9jKHVuc2lnbmVkIGludCBzaXplLCBpbnQgcHJpbywgaW50IGxpbmUpIHsKKwlpbnQgaSA9IDA7CisJdm9pZCAqIHYgPSBrbWFsbG9jKHNpemUrc2l6ZW9mKHVuc2lnbmVkIGludCkrMipLTUVNX1NBRkVUWVpPTkUqOCxwcmlvKTsKKwljaGFyICogYzEgPSB2OwkKKwljMSArPSBzaXplb2YodW5zaWduZWQgaW50KTsKKwkqKCh1bnNpZ25lZCBpbnQgKil2KSA9IHNpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgS01FTV9TQUZFVFlaT05FOyBpKyspIHsKKwkJYzFbMF0gPSAnRCc7IGMxWzFdID0gJ0UnOyBjMVsyXSA9ICdBJzsgYzFbM10gPSAnRCc7CisJCWMxWzRdID0gJ0InOyBjMVs1XSA9ICdFJzsgYzFbNl0gPSAnRSc7IGMxWzddID0gJ0YnOworCQljMSArPSA4OworCX0KKwljMSArPSBzaXplOworCWZvciAoaSA9IDA7IGkgPCBLTUVNX1NBRkVUWVpPTkU7IGkrKykgeworCQljMVswXSA9ICdNJzsgYzFbMV0gPSAnVSc7IGMxWzJdID0gJ04nOyBjMVszXSA9ICdHJzsKKwkJYzFbNF0gPSAnVyc7IGMxWzVdID0gJ0EnOyBjMVs2XSA9ICdMJzsgYzFbN10gPSAnTCc7CisJCWMxICs9IDg7CisJfQorCXYgPSAoKGNoYXIgKil2KSArIHNpemVvZih1bnNpZ25lZCBpbnQpICsgS01FTV9TQUZFVFlaT05FKjg7CisJcHJpbnRrKEtFUk5fSU5GTyAibGluZSAlZCAga21hbGxvYyglZCwlZCkgPSAlcFxuIixsaW5lLHNpemUscHJpbyx2KTsKKwlyZXR1cm4gdjsKK30KK3N0YXRpYyB2b2lkIGRiZ19rZnJlZSh2b2lkICogdiwgaW50IGxpbmUpIHsKKwl1bnNpZ25lZCBpbnQgKiBzcCA9ICh1bnNpZ25lZCBpbnQgKikoKChjaGFyICopdikgLSAoc2l6ZW9mKHVuc2lnbmVkIGludCkgKyBLTUVNX1NBRkVUWVpPTkUqOCkpOworCXVuc2lnbmVkIGludCBzaXplID0gKnNwOworCWNoYXIgKiBjMSA9ICgoY2hhciAqKXYpIC0gS01FTV9TQUZFVFlaT05FKjg7CisJaW50IGkgPSAwOworCWZvciAoaSA9IDA7IGkgPCBLTUVNX1NBRkVUWVpPTkU7IGkrKykgeworCQlpZiAoICAgYzFbMF0gIT0gJ0QnIHx8IGMxWzFdICE9ICdFJyB8fCBjMVsyXSAhPSAnQScgfHwgYzFbM10gIT0gJ0QnCisJCSAgICB8fCBjMVs0XSAhPSAnQicgfHwgYzFbNV0gIT0gJ0UnIHx8IGMxWzZdICE9ICdFJyB8fCBjMVs3XSAhPSAnRicpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImttYWxsb2NlZCBibG9jayBhdCAlcCBoYXMgYmVlbiBjb3JydXB0ZWQgKHVuZGVycnVuKSFcbiIsdik7CisJCQlwcmludGsoS0VSTl9JTkZPICIgJTR4OiAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4XG4iLCBpKjgsCisJCQkgICAgICAgICAgICAgICAgYzFbMF0sYzFbMV0sYzFbMl0sYzFbM10sYzFbNF0sYzFbNV0sYzFbNl0sYzFbN10gKTsKKwkJfQorCQljMSArPSA4OworCX0KKwljMSArPSBzaXplOworCWZvciAoaSA9IDA7IGkgPCBLTUVNX1NBRkVUWVpPTkU7IGkrKykgeworCQlpZiAoICAgYzFbMF0gIT0gJ00nIHx8IGMxWzFdICE9ICdVJyB8fCBjMVsyXSAhPSAnTicgfHwgYzFbM10gIT0gJ0cnCisJCSAgICB8fCBjMVs0XSAhPSAnVycgfHwgYzFbNV0gIT0gJ0EnIHx8IGMxWzZdICE9ICdMJyB8fCBjMVs3XSAhPSAnTCcKKwkJICAgKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJrbWFsbG9jZWQgYmxvY2sgYXQgJXAgaGFzIGJlZW4gY29ycnVwdGVkIChvdmVycnVuKTpcbiIsdik7CisJCQlwcmludGsoS0VSTl9JTkZPICIgJTR4OiAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4XG4iLCBpKjgsCisJCQkgICAgICAgICAgICAgICAgYzFbMF0sYzFbMV0sYzFbMl0sYzFbM10sYzFbNF0sYzFbNV0sYzFbNl0sYzFbN10gKTsKKwkJfQorCQljMSArPSA4OworCX0KKwlwcmludGsoS0VSTl9JTkZPICJsaW5lICVkICBrZnJlZSglcClcbiIsbGluZSx2KTsKKwl2ID0gKChjaGFyICopdikgLSAoc2l6ZW9mKHVuc2lnbmVkIGludCkgKyBLTUVNX1NBRkVUWVpPTkUqOCk7CisJa2ZyZWUodik7Cit9CisKKyNkZWZpbmUga21hbGxvYyh4LHkpIGRiZ19rbWFsbG9jKHgseSxfX0xJTkVfXykKKyNkZWZpbmUga2ZyZWUoeCkgZGJnX2tmcmVlKHgsX19MSU5FX18pCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlEYXRhIFN0cnVjdHVyZXMgCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBOYW1lOiAJeDI1X2NoYW5uZWwKKyAqCisgKiBQdXJwb3NlOglUbyBob2xkIHByaXZhdGUgaW5mb3JtYXRvbiBmb3IgZWFjaCAgCisgKiAgICAgICAgICAgICAgbG9naWNhbCBjaGFubmVsLgorICoJCQorICogUmF0aW9uYWxlOiAgCVBlci1jaGFubmVsIGRlYnVnZ2luZyBpcyBwb3NzaWJsZSBpZiBlYWNoIAorICogICAgICAgICAgICAgIGNoYW5uZWwgaGFzIGl0cyBvd24gcHJpdmF0ZSBhcmVhLgorICoJCisgKiBBc3N1bXB0aW9uczoKKyAqCisgKiBEZXNjcmlwdGlvbjoJVGhpcyBpcyBhbiBleHRlbnRpb24gb2YgdGhlIHN0cnVjdCBuZXRfZGV2aWNlCisgKiAgICAgICAgICAgICAgd2UgY3JlYXRlIGZvciBlYWNoIG5ldHdvcmsgaW50ZXJmYWNlIHRvIGtlZXAgCisgKiAgICAgICAgICAgICAgdGhlIHJlc3Qgb2YgWC4yNSBjaGFubmVsLXNwZWNpZmljIGRhdGEuIAorICoKKyAqIENvbnN0cnVjdDoJVHlwZWRlZgorICovCit0eXBlZGVmIHN0cnVjdCB4MjVfY2hhbm5lbAoreworCXdhbnBpcGVfY29tbW9uX3QgY29tbW9uOwkvKiBjb21tb24gYXJlYSBmb3IgeDI1YXBpIGFuZCBzb2NrZXQgKi8KKwljaGFyIG5hbWVbV0FOX0lGTkFNRV9TWisxXTsJLyogaW50ZXJmYWNlIG5hbWUsIEFTQ0lJWiAqLworCWNoYXIgYWRkcltXQU5fQUREUkVTU19TWisxXTsJLyogbWVkaWEgYWRkcmVzcywgQVNDSUlaICovCisJdW5zaWduZWQgdHhfcGt0X3NpemU7CisJdW5zaWduZWQgc2hvcnQgcHJvdG9jb2w7CS8qIGV0aGVydHlwZSwgMCAtIG11bHRpcGxleGVkICovCisJY2hhciBkcm9wX3NlcXVlbmNlOwkJLyogbWFyayBzZXF1ZW5jZSBmb3IgZHJvcHBpbmcgKi8KKwl1bnNpZ25lZCBsb25nIHN0YXRlX3RpY2s7CS8qIHRpbWUgb2YgdGhlIGxhc3Qgc3RhdGUgY2hhbmdlICovCisJdW5zaWduZWQgaWRsZV90aW1lb3V0OwkJLyogc2VjLCBiZWZvcmUgZGlzY29ubmVjdGluZyAqLworCXVuc2lnbmVkIGxvbmcgaV90aW1lb3V0X3NvZmFyOyAgLyogIyBvZiBzZWMncyB3ZSd2ZSBiZWVuIGlkbGUgKi8KKwl1bnNpZ25lZCBob2xkX3RpbWVvdXQ7CQkvKiBzZWMsIGJlZm9yZSByZS1jb25uZWN0aW5nICovCisJdW5zaWduZWQgbG9uZyB0aWNrX2NvdW50ZXI7CS8qIGNvdW50ZXIgZm9yIHRyYW5zbWl0IHRpbWUgb3V0ICovCisJY2hhciBkZXZ0aW50OwkJCS8qIFdlYXRoZXIgd2Ugc2hvdWxkIGRldl90aW50KCkgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiogcnhfc2tiOwkJLyogcmVjZWl2ZSBzb2NrZXQgYnVmZmVyICovCisJc3RydWN0IHNrX2J1ZmYqIHR4X3NrYjsJCS8qIHRyYW5zbWl0IHNvY2tldCBidWZmZXIgKi8KKworCWJoX2RhdGFfdCAqYmhfaGVhZDsJICAJICAvKiBDaXJjdWxhciBidWZmZXIgZm9yIHgyNWFwaV9iaCAqLworCXVuc2lnbmVkIGxvbmcgIHRxX3dvcmtpbmc7CisJdm9sYXRpbGUgaW50ICBiaF93cml0ZTsKKwl2b2xhdGlsZSBpbnQgIGJoX3JlYWQ7CisJYXRvbWljX3QgIGJoX2J1ZmZfdXNlZDsKKworCXNkbGFfdCogY2FyZDsJCQkvKiAtPiBvd25lciAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CQkvKiAtPiBib3VuZCBkZXZjZSAqLworCisJaW50IGNoX2lkeDsKKwl1bnNpZ25lZCBjaGFyIGVuYWJsZV9JUFg7CisJdW5zaWduZWQgbG9uZyBuZXR3b3JrX251bWJlcjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBpZnN0YXRzOwkvKiBpbnRlcmZhY2Ugc3RhdGlzdGljcyAqLworCXVuc2lnbmVkIHNob3J0IHRyYW5zbWl0X2xlbmd0aDsKKwl1bnNpZ25lZCBzaG9ydCB0eF9vZmZzZXQ7CisJY2hhciB0cmFuc21pdF9idWZmZXJbWDI1X0NIQU5fTVRVK3NpemVvZih4MjVhcGlfaGRyX3QpXTsKKworCWlmX3NlbmRfc3RhdF90ICAgaWZfc2VuZF9zdGF0OworICAgICAgICByeF9pbnRyX3N0YXRfdCAgIHJ4X2ludHJfc3RhdDsKKyAgICAgICAgcGlwZV9tZ210X3N0YXRfdCBwaXBlX21nbXRfc3RhdDsgICAgCisKKwl1bnNpZ25lZCBsb25nIHJvdXRlcl9zdGFydF90aW1lOyAvKiBSb3V0ZXIgc3RhcnQgdGltZSBpbiBzZWNvbmRzICovCisJdW5zaWduZWQgbG9uZyByb3V0ZXJfdXBfdGltZTsKKwkKK30geDI1X2NoYW5uZWxfdDsKKworLyogRklYTUUgVGFrZSB0aGlzIG91dCAqLworCisjaWZkZWYgTkVYX09MRF9DQUxMX0lORk8KK3R5cGVkZWYgc3RydWN0IHgyNV9jYWxsX2luZm8KK3sKKwljaGFyIGRlc3RbMTddOwkJCVBBQ0tFRDsvKiBBU0NJSVogZGVzdGluYXRpb24gYWRkcmVzcyAqLworCWNoYXIgc3JjWzE3XTsJCQlQQUNLRUQ7LyogQVNDSUlaIHNvdXJjZSBhZGRyZXNzICovCisJY2hhciBudXNlcjsJCQlQQUNLRUQ7LyogbnVtYmVyIG9mIHVzZXIgZGF0YSBieXRlcyAqLworCXVuc2lnbmVkIGNoYXIgdXNlclsxMjddOwlQQUNLRUQ7LyogdXNlciBkYXRhICovCisJY2hhciBuZmFjaWw7CQkJUEFDS0VEOy8qIG51bWJlciBvZiBmYWNpbGl0aWVzICovCisJc3RydWN0CisJeworCQl1bnNpZ25lZCBjaGFyIGNvZGU7ICAgICBQQUNLRUQ7CisJCXVuc2lnbmVkIGNoYXIgcGFybTsgICAgIFBBQ0tFRDsKKwl9IGZhY2lsWzY0XTsJCQkgICAgICAgIC8qIGZhY2lsaXRpZXMgKi8KK30geDI1X2NhbGxfaW5mb190OworI2Vsc2UKK3R5cGVkZWYgc3RydWN0IHgyNV9jYWxsX2luZm8KK3sKKwljaGFyIGRlc3RbTUFYX1gyNV9BRERSX1NJWkVdCQlQQUNLRUQ7LyogQVNDSUlaIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwljaGFyIHNyY1tNQVhfWDI1X0FERFJfU0laRV0JCVBBQ0tFRDsvKiBBU0NJSVogc291cmNlIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBjaGFyIG51c2VyCQkJUEFDS0VEOworCXVuc2lnbmVkIGNoYXIgdXNlcltNQVhfWDI1X0RBVEFfU0laRV0JUEFDS0VEOy8qIHVzZXIgZGF0YSAqLworCXVuc2lnbmVkIGNoYXIgbmZhY2lsCQkJUEFDS0VEOworCXVuc2lnbmVkIGNoYXIgZmFjaWxbTUFYX1gyNV9GQUNMX1NJWkVdCVBBQ0tFRDsKKwl1bnNpZ25lZCBzaG9ydCBsY24gICAgICAgICAgICAgCQlQQUNLRUQ7Cit9IHgyNV9jYWxsX2luZm9fdDsKKyNlbmRpZgorCisKKyAgCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKglQcml2YXRlIEZ1bmN0aW9uIFByb3RvdHlwZXMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICogV0FOIGxpbmsgZHJpdmVyIGVudHJ5IHBvaW50cy4gVGhlc2UgYXJlIAorICogY2FsbGVkIGJ5IHRoZSBXQU4gcm91dGVyIG1vZHVsZS4KKyAqLworc3RhdGljIGludCB1cGRhdGUoc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldik7CitzdGF0aWMgaW50IG5ld19pZihzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkgIHdhbmlmX2NvbmZfdCogY29uZik7CitzdGF0aWMgaW50IGRlbF9pZihzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyB2b2lkIGRpc2FibGVfY29tbSAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyB2b2lkIGRpc2FibGVfY29tbV9zaHV0ZG93bihzZGxhX3QgKmNhcmQpOworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICoJV0FOUElQRS1zcGVjaWZpYyBlbnRyeSBwb2ludHMgCisgKi8KK3N0YXRpYyBpbnQgd3B4X2V4ZWMgKHN0cnVjdCBzZGxhKiBjYXJkLCB2b2lkKiB1X2NtZCwgdm9pZCogdV9kYXRhKTsKK3N0YXRpYyB2b2lkIHgyNWFwaV9iaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgeDI1YXBpX2JoX2NsZWFudXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGJoX2VucXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAqIAlOZXR3b3JrIGRldmljZSBpbnRlcmZhY2UgCisgKi8KK3N0YXRpYyBpbnQgaWZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyBpbnQgaWZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyBpbnQgaWZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitzdGF0aWMgaW50IGlmX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiogc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCXVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQqIGRhZGRyLCB2b2lkKiBzYWRkciwgdW5zaWduZWQgbGVuKTsKK3N0YXRpYyBpbnQgaWZfcmVidWlsZF9oZHIgKHN0cnVjdCBza19idWZmKiBza2IpOworc3RhdGljIGludCBpZl9zZW5kKHN0cnVjdCBza19idWZmKiBza2IsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppZl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKKworc3RhdGljIHZvaWQgaWZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAqIAlJbnRlcnJ1cHQgaGFuZGxlcnMgCisgKi8KK3N0YXRpYyB2b2lkIHdweF9pc3IJKHNkbGFfdCAqKTsKK3N0YXRpYyB2b2lkIHJ4X2ludHIJKHNkbGFfdCAqKTsKK3N0YXRpYyB2b2lkIHR4X2ludHIJKHNkbGFfdCAqKTsKK3N0YXRpYyB2b2lkIHN0YXR1c19pbnRyCShzZGxhX3QgKik7CitzdGF0aWMgdm9pZCBldmVudF9pbnRyCShzZGxhX3QgKik7CitzdGF0aWMgdm9pZCBzcHVyX2ludHIJKHNkbGFfdCAqKTsKK3N0YXRpYyB2b2lkIHRpbWVyX2ludHIgIChzZGxhX3QgKik7CisKK3N0YXRpYyBpbnQgdHhfaW50cl9zZW5kKHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKm1vdmVfZGV2X3RvX25leHQoc2RsYV90ICpjYXJkLAorCQkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAKKyAqCUJhY2tncm91bmQgcG9sbGluZyByb3V0aW5lcyAKKyAqLworc3RhdGljIHZvaWQgd3B4X3BvbGwgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgdm9pZCBwb2xsX2Rpc2Nvbm5lY3RlZCAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyB2b2lkIHBvbGxfY29ubmVjdGluZyAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyB2b2lkIHBvbGxfYWN0aXZlIChzZGxhX3QqIGNhcmQpOworc3RhdGljIHZvaWQgdHJpZ2dlcl94MjVfcG9sbChzZGxhX3QgKmNhcmQpOworc3RhdGljIHZvaWQgeDI1X3RpbWVyX3JvdXRpbmUodW5zaWduZWQgbG9uZyBkYXRhKTsKKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgKglYLjI1IGZpcm13YXJlIGludGVyZmFjZSBmdW5jdGlvbnMgCisgKi8KK3N0YXRpYyBpbnQgeDI1X2dldF92ZXJzaW9uIChzZGxhX3QqIGNhcmQsIGNoYXIqIHN0cik7CitzdGF0aWMgaW50IHgyNV9jb25maWd1cmUgKHNkbGFfdCogY2FyZCwgVFgyNUNvbmZpZyogY29uZik7CitzdGF0aWMgaW50IGhkbGNfY29uZmlndXJlIChzZGxhX3QqIGNhcmQsIFRYMjVDb25maWcqIGNvbmYpOworc3RhdGljIGludCBzZXRfaGRsY19sZXZlbCAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBpbnQgeDI1X2dldF9lcnJfc3RhdHMgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IHgyNV9nZXRfc3RhdHMgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IHgyNV9zZXRfaW50cl9tb2RlIChzZGxhX3QqIGNhcmQsIGludCBtb2RlKTsKK3N0YXRpYyBpbnQgeDI1X2Nsb3NlX2hkbGMgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IHgyNV9vcGVuX2hkbGMgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgaW50IHgyNV9zZXR1cF9oZGxjIChzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCB4MjVfc2V0X2R0ciAoc2RsYV90KiBjYXJkLCBpbnQgZHRyKTsKK3N0YXRpYyBpbnQgeDI1X2dldF9jaGFuX2NvbmYgKHNkbGFfdCogY2FyZCwgeDI1X2NoYW5uZWxfdCogY2hhbik7CitzdGF0aWMgaW50IHgyNV9wbGFjZV9jYWxsIChzZGxhX3QqIGNhcmQsIHgyNV9jaGFubmVsX3QqIGNoYW4pOworc3RhdGljIGludCB4MjVfYWNjZXB0X2NhbGwgKHNkbGFfdCogY2FyZCwgaW50IGxjbiwgaW50IHFkbSk7CitzdGF0aWMgaW50IHgyNV9jbGVhcl9jYWxsIChzZGxhX3QqIGNhcmQsIGludCBsY24sIGludCBjYXVzZSwgaW50IGRpYWduKTsKK3N0YXRpYyBpbnQgeDI1X3NlbmQgKHNkbGFfdCogY2FyZCwgaW50IGxjbiwgaW50IHFkbSwgaW50IGxlbiwgdm9pZCogYnVmKTsKK3N0YXRpYyBpbnQgeDI1X2ZldGNoX2V2ZW50cyAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBpbnQgeDI1X2Vycm9yIChzZGxhX3QqIGNhcmQsIGludCBlcnIsIGludCBjbWQsIGludCBsY24pOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICoJWC4yNSBhc3luY2hyb25vdXMgZXZlbnQgaGFuZGxlcnMgCisgKi8KK3N0YXRpYyBpbnQgaW5jb21pbmdfY2FsbCAoc2RsYV90KiBjYXJkLCBpbnQgY21kLCBpbnQgbGNuLCBUWDI1TWJveCogbWIpOworc3RhdGljIGludCBjYWxsX2FjY2VwdGVkIChzZGxhX3QqIGNhcmQsIGludCBjbWQsIGludCBsY24sIFRYMjVNYm94KiBtYik7CitzdGF0aWMgaW50IGNhbGxfY2xlYXJlZCAoc2RsYV90KiBjYXJkLCBpbnQgY21kLCBpbnQgbGNuLCBUWDI1TWJveCogbWIpOworc3RhdGljIGludCB0aW1lb3V0X2V2ZW50IChzZGxhX3QqIGNhcmQsIGludCBjbWQsIGludCBsY24sIFRYMjVNYm94KiBtYik7CitzdGF0aWMgaW50IHJlc3RhcnRfZXZlbnQgKHNkbGFfdCogY2FyZCwgaW50IGNtZCwgaW50IGxjbiwgVFgyNU1ib3gqIG1iKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIAorICoJTWlzY2VsbGFuZW91cyBmdW5jdGlvbnMgCisgKi8KK3N0YXRpYyBpbnQgY29ubmVjdCAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBpbnQgZGlzY29ubmVjdCAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSogZ2V0X2Rldl9ieV9sY24oc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiwKKwkJCQkJIHVuc2lnbmVkIGxjbik7CitzdGF0aWMgaW50IGNoYW5fY29ubmVjdChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyBpbnQgY2hhbl9kaXNjKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworc3RhdGljIHZvaWQgc2V0X2NoYW5fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgaW50IHN0YXRlKTsKK3N0YXRpYyBpbnQgY2hhbl9zZW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQqIGJ1ZmYsIHVuc2lnbmVkIGRhdGFfbGVuLAorCQkgICAgIHVuc2lnbmVkIGNoYXIgdHhfaW50cik7CitzdGF0aWMgdW5zaWduZWQgY2hhciBicHNfdG9fc3BlZWRfY29kZSAodW5zaWduZWQgbG9uZyBicHMpOworc3RhdGljIHVuc2lnbmVkIGludCBkZWNfdG9fdWludCAodW5zaWduZWQgY2hhciogc3RyLCBpbnQgbGVuKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGV4X3RvX3VpbnQgKHVuc2lnbmVkIGNoYXIqLCBpbnQpOworc3RhdGljIHZvaWQgcGFyc2VfY2FsbF9pbmZvICh1bnNpZ25lZCBjaGFyKiwgeDI1X2NhbGxfaW5mb190Kik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmZpbmRfY2hhbm5lbChzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGxjbik7CitzdGF0aWMgdm9pZCBiaW5kX2xjbl90b19kZXYoc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBsY24pOworc3RhdGljIHZvaWQgc2V0dXBfZm9yX2RlbGF5ZWRfdHJhbnNtaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgdm9pZCAqYnVmLCB1bnNpZ25lZCBsZW4pOworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgKiAgICAgIFgyNSBBUEkgRnVuY3Rpb25zIAorICovCitzdGF0aWMgaW50IHdhbnBpcGVfcHVsbF9kYXRhX2luX3NrYihzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBza19idWZmICoqKTsKK3N0YXRpYyB2b2lkIHRpbWVyX2ludHJfZXhlYyhzZGxhX3QgKiwgdW5zaWduZWQgY2hhcik7CitzdGF0aWMgaW50IGV4ZWN1dGVfZGVsYXllZF9jbWQoc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIG1ib3hfY21kX3QgKnVzcl9jbWQsIGNoYXIgYmFkX2NtZCk7CitzdGF0aWMgaW50IGFwaV9pbmNvbWluZ19jYWxsIChzZGxhX3QqLCBUWDI1TWJveCAqLCBpbnQpOworc3RhdGljIGludCBhbGxvY19hbmRfaW5pdF9za2JfYnVmIChzZGxhX3QgKixzdHJ1Y3Qgc2tfYnVmZiAqKiwgaW50KTsKK3N0YXRpYyB2b2lkIHNlbmRfZGVsYXllZF9jbWRfcmVzdWx0KHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgVFgyNU1ib3gqIG1ib3gpOworc3RhdGljIGludCBjbGVhcl9jb25maXJtX2V2ZW50IChzZGxhX3QgKiwgVFgyNU1ib3gqKTsKK3N0YXRpYyB2b2lkIHNlbmRfb29iX21zZyAoc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBUWDI1TWJveCAqbWJveCk7CitzdGF0aWMgaW50IHRpbWVyX2ludHJfY21kX2V4ZWMoc2RsYV90ICpjYXJkKTsKK3N0YXRpYyB2b2lkIGFwaV9vb2JfZXZlbnQgKHNkbGFfdCAqY2FyZCxUWDI1TWJveCAqbWJveCk7CitzdGF0aWMgaW50IGNoZWNrX2JhZF9jb21tYW5kKHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGNoYW5uZWxfZGlzY29ubmVjdChzZGxhX3QqIGNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaGRsY19saW5rX2Rvd24gKHNkbGFfdCopOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAgICBYUElQRU1PTiBGdW5jdGlvbnMKKyAqLworc3RhdGljIGludCBwcm9jZXNzX3VkcF9tZ210X3BrdChzZGxhX3QgKik7CitzdGF0aWMgaW50IHVkcF9wa3RfdHlwZSggc3RydWN0IHNrX2J1ZmYgKiwgc2RsYV90Kik7CitzdGF0aWMgaW50IHJlcGx5X3VkcCggdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQpOyAKK3N0YXRpYyB2b2lkIGluaXRfeDI1X2NoYW5uZWxfc3RydWN0KCB4MjVfY2hhbm5lbF90ICopOworc3RhdGljIHZvaWQgaW5pdF9nbG9iYWxfc3RhdGlzdGljcyggc2RsYV90ICopOworc3RhdGljIGludCBzdG9yZV91ZHBfbWdtdF9wa3QoaW50IHVkcF90eXBlLCBjaGFyIHVkcF9wa3Rfc3JjLCBzZGxhX3QgKmNhcmQsCisJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxjbik7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgY2FsY19jaGVja3N1bSAoY2hhciAqLCBpbnQpOworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICoJSVBYIGZ1bmN0aW9ucyAKKyAqLworc3RhdGljIHZvaWQgc3dpdGNoX25ldF9udW1iZXJzKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgY2hhcik7CitzdGF0aWMgaW50IGhhbmRsZV9JUFhXQU4odW5zaWduZWQgY2hhciAqLCBjaGFyICosIHVuc2lnbmVkIGNoYXIgLCAKKwkJCSB1bnNpZ25lZCBsb25nICwgdW5zaWduZWQgc2hvcnQgKTsKKworZXh0ZXJuIHZvaWQgZGlzYWJsZV9pcnEodW5zaWduZWQgaW50KTsKK2V4dGVybiB2b2lkIGVuYWJsZV9pcnEodW5zaWduZWQgaW50KTsKKworc3RhdGljIHZvaWQgUzUwOF9TNTE0X2xvY2soc2RsYV90ICosIHVuc2lnbmVkIGxvbmcgKik7CitzdGF0aWMgdm9pZCBTNTA4X1M1MTRfdW5sb2NrKHNkbGFfdCAqLCB1bnNpZ25lZCBsb25nICopOworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgCisgKiAJR2xvYmFsIFZhcmlhYmxlcyAKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisgKglQdWJsaWMgRnVuY3Rpb25zIAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB3cHhfaW5pdDoJWC4yNSBQcm90b2NvbCBJbml0aWFsaXphdGlvbiByb3V0aW5lLgorICoKKyAqIFB1cnBvc2U6CVRvIGluaXRpYWxpemUgdGhlIHByb3RvY29sL2Zpcm13YXJlLgorICogCisgKiBSYXRpb25hbGU6CVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHNldHVwKCkgZnVuY3Rpb24sIGluCisgKiAgICAgICAgICAgICAgc2RsYW1haW4uYywgdG8gZHluYW1pY2FsbHkgc2V0dXAgdGhlIHgyNSBwcm90b2NvbC4KKyAqCQlUaGlzIGlzIHRoZSBmaXJzdCBwcm90b2NvbCBzcGVjaWZpYyBmdW5jdGlvbiwgd2hpY2gKKyAqICAgICAgICAgICAgICBleGVjdXRlcyBvbmNlIG9uIHN0YXJ0dXAuCisgKiAgICAgICAgICAgICAgICAKKyAqIERlc2NyaXB0aW9uOglUaGlzIHByb2NlZHVyZSBpbml0aWFsaXplcyB0aGUgeDI1IGZpcm13YXJlIGFuZAorICogICAgCQlzZXRzIHVwIHRoZSBtYWlsYm94LCB0cmFuc21pdCBhbmQgcmVjZWl2ZSBidWZmZXIKKyAqICAgICAgICAgICAgICBwb2ludGVycy4gSXQgYWxzbyBpbml0aWFsaXplcyBhbGwgZGVidWdnaW5nIHN0cnVjdHVyZXMKKyAqICAgICAgICAgICAgICBhbmQgc2V0cyB1cCB0aGUgWDI1IGVudmlyb25tZW50LgorICoKKyAqCQlTZXRzIHVwIGhhcmR3YXJlIG9wdGlvbnMgZGVmaW5lZCBieSB1c2VyIGluIFt3YW5waXBlI10gCisgKgkJc2VjdGlvbiBvZiB3YW5waXBlIy5jb25mIGNvbmZpZ3VyYXRpb24gZmlsZS4gCisgKgorICogCQlBdCB0aGlzIHBvaW50IGFkYXB0ZXIgaXMgY29tcGxldGVseSBpbml0aWFsaXplZCAKKyAqICAgICAgCWFuZCBYLjI1IGZpcm13YXJlIGlzIHJ1bm5pbmcuCisgKiAgCQlvIHJlYWQgZmlybXdhcmUgdmVyc2lvbiAodG8gbWFrZSBzdXJlIGl0J3MgYWxpdmUpCisgKiAgCQlvIGNvbmZpZ3VyZSBhZGFwdGVyCisgKiAgCQlvIGluaXRpYWxpemUgcHJvdG9jb2wtc3BlY2lmaWMgZmllbGRzIG9mIHRoZSAKKyAqICAgICAgICAgICAgICAgIGFkYXB0ZXIgZGF0YSBzcGFjZS4KKyAqCisgKiBDYWxsZWQgYnk6CXNldHVwKCkgZnVuY3Rpb24gaW4gc2RsYW1haW4uYworICoKKyAqIEFzc3VtcHRpb25zOglOb25lCisgKgorICogV2FybmluZ3M6CU5vbmUKKyAqCisgKiBSZXR1cm46IAkwCW8uay4KKyAqCSAJPCAwCWZhaWx1cmUuCisgKi8KKworaW50IHdweF9pbml0IChzZGxhX3QqIGNhcmQsIHdhbmRldl9jb25mX3QqIGNvbmYpCit7CisJdW5pb257CisJCWNoYXIgc3RyWzgwXTsKKwkJVFgyNUNvbmZpZyBjZmc7CisJfSB1OworCisJLyogVmVyaWZ5IGNvbmZpZ3VyYXRpb24gSUQgKi8KKwlpZiAoY29uZi0+Y29uZmlnX2lkICE9IFdBTkNPTkZJR19YMjUpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogaW52YWxpZCBjb25maWd1cmF0aW9uIElEICV1IVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIGNvbmYtPmNvbmZpZ19pZCkKKwkJOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHByb3RvY29sLXNwZWNpZmljIGZpZWxkcyAqLworCWNhcmQtPm1ib3ggID0gKHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsgWDI1X01CT1hfT0ZGUyk7CisJY2FyZC0+cnhtYiAgPSAodm9pZCopKGNhcmQtPmh3LmRwbWJhc2UgKyBYMjVfUlhNQk9YX09GRlMpOworCWNhcmQtPmZsYWdzID0gKHZvaWQqKShjYXJkLT5ody5kcG1iYXNlICsgWDI1X1NUQVRVU19PRkZTKTsKKworCS8qIEluaXRpYWxpemUgZm9yIFM1MTQgQ2FyZCAqLworCWlmKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KSB7CisJCWNhcmQtPm1ib3ggKz0gWDI1X01CX1ZFQ1RPUjsKKwkJY2FyZC0+ZmxhZ3MgKz0gWDI1X01CX1ZFQ1RPUjsKKwkJY2FyZC0+cnhtYiArPSBYMjVfTUJfVkVDVE9SOworCX0KKworCisJLyogUmVhZCBmaXJtd2FyZSB2ZXJzaW9uLiAgTm90ZSB0aGF0IHdoZW4gYWRhcHRlciBpbml0aWFsaXplcywgaXQKKwkgKiBjbGVhcnMgdGhlIG1haWxib3gsIHNvIGl0IG1heSBhcHBlYXIgdGhhdCB0aGUgZmlyc3QgY29tbWFuZCB3YXMKKwkgKiBleGVjdXRlZCBzdWNjZXNzZnVsbHkgd2hlbiBpbiBmYWN0IGl0IHdhcyBtZXJlbHkgZXJhc2VkLiBUbyB3b3JrCisJICogYXJvdW5kIHRoaXMsIHdlIGV4ZWN1dGUgdGhlIGZpcnN0IGNvbW1hbmQgdHdpY2UuCisJICovCisJaWYgKHgyNV9nZXRfdmVyc2lvbihjYXJkLCBOVUxMKSB8fCB4MjVfZ2V0X3ZlcnNpb24oY2FyZCwgdS5zdHIpKQorCQlyZXR1cm4gLUVJTzsKKworCisJLyogWDI1IGZpcm13YXJlIGNhbiBydW4gZXRoZXIgaW4gWDI1IG9yIExBUEIgSERMQyBtb2RlLgorICAgICAgICAgKiBDaGVjayB0aGUgdXNlciBkZWZpbmVkIG9wdGlvbiBhbmQgY29uZmlndXJlIGFjY29yZGluZ2x5ICovCisJaWYgKGNvbmYtPnUueDI1LkxBUEJfaGRsY19vbmx5ID09IFdBTk9QVF9ZRVMpeworCQlpZiAoc2V0X2hkbGNfbGV2ZWwoY2FyZCkgIT0gQ01EX09LKXsKKwkJCXJldHVybiAtRUlPOwkKKwkJfWVsc2V7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogcnVubmluZyBMQVBfQiBIRExDIGZpcm13YXJlIHYlc1xuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCB1LnN0cik7CisJCX0KKwkJY2FyZC0+dS54LkxBUEJfaGRsYyA9IDE7CisJfWVsc2V7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBydW5uaW5nIFguMjUgZmlybXdhcmUgdiVzXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIHUuc3RyKTsKKwkJY2FyZC0+dS54LkxBUEJfaGRsYyA9IDA7CisJfQorCisJLyogQ29uZmlndXJlIGFkYXB0ZXIuIEhlcmUgd2Ugc2V0IHJlc29uYWJsZSBkZWZhdWx0cywgdGhlbiBwYXJzZQorCSAqIGRldmljZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBhbmQgc2V0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKwkgKiBNb3N0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdmVyaWZpZWQgYW5kIGNvcnJlY3RlZCAoaWYKKwkgKiBuZWNlc3NhcnkpIHNpbmNlIHdlIGNhbid0IHJlbHkgb24gdGhlIGFkYXB0ZXIgdG8gZG8gc28uCisJICovCisJbWVtc2V0KCZ1LmNmZywgMCwgc2l6ZW9mKHUuY2ZnKSk7CisJdS5jZmcudDEJCT0gMzsKKwl1LmNmZy5uMgkJPSAxMDsKKwl1LmNmZy5hdXRvSGRsYwkJPSAxOwkJLyogYXV0b21hdGljIEhETEMgY29ubmVjdGlvbiAqLworCXUuY2ZnLmhkbGNXaW5kb3cJPSA3OworCXUuY2ZnLnBrdFdpbmRvdwkJPSAyOworCXUuY2ZnLnN0YXRpb24JCT0gMTsJCS8qIERURSAqLworCXUuY2ZnLm9wdGlvbnMJCT0gMHgwMDkwOwkvKiBkaXNhYmxlIEQtYml0IHByYWdtYXRpY3MgKi8KKwl1LmNmZy5jY2l0dENvbXBhdAk9IDE5ODg7CisJdS5jZmcudDEwdDIwCQk9IDMwOworCXUuY2ZnLnQxMXQyMQkJPSAzMDsKKwl1LmNmZy50MTJ0MjIJCT0gMzA7CisJdS5jZmcudDEzdDIzCQk9IDMwOworCXUuY2ZnLnQxNnQyNgkJPSAzMDsKKwl1LmNmZy50MjgJCT0gMzA7CisJdS5jZmcucjEwcjIwCQk9IDU7CisJdS5jZmcucjEycjIyCQk9IDU7CisJdS5jZmcucjEzcjIzCQk9IDU7CisJdS5jZmcucmVzcG9uc2VPcHQJPSAxOwkJLyogUlIncyBhZnRlciBldmVyeSBwYWNrZXQgKi8KKworCWlmIChjYXJkLT51LnguTEFQQl9oZGxjKXsKKwkJdS5jZmcuaGRsY01UVSA9IDEwMjc7CisJfQorCisJaWYgKGNvbmYtPnUueDI1LngyNV9jb25mX29wdCl7CisJCXUuY2ZnLm9wdGlvbnMgPSBjb25mLT51LngyNS54MjVfY29uZl9vcHQ7CisJfQorCisJaWYgKGNvbmYtPmNsb2NraW5nICE9IFdBTk9QVF9FWFRFUk5BTCkKKwkJdS5jZmcuYmF1ZFJhdGUgPSBicHNfdG9fc3BlZWRfY29kZShjb25mLT5icHMpOworCisJaWYgKGNvbmYtPnN0YXRpb24gIT0gV0FOT1BUX0RURSl7CisJCXUuY2ZnLnN0YXRpb24gPSAwOwkJLyogRENFIG1vZGUgKi8KKwl9CisKKyAgICAgICAgaWYgKGNvbmYtPmludGVyZmFjZSAhPSBXQU5PUFRfUlMyMzIgKXsKKwkgICAgICAgIHUuY2ZnLmhkbGNPcHRpb25zIHw9IDB4ODA7ICAgICAgLyogVjM1IG1vZGUgKi8KKwl9IAorCisJLyogYWRqdXN0IE1UVSAqLworCWlmICghY29uZi0+bXR1IHx8IChjb25mLT5tdHUgPj0gMTAyNCkpCisJCWNhcmQtPndhbmRldi5tdHUgPSAxMDI0OworCWVsc2UgaWYgKGNvbmYtPm10dSA+PSA1MTIpCisJCWNhcmQtPndhbmRldi5tdHUgPSA1MTI7CisJZWxzZSBpZiAoY29uZi0+bXR1ID49IDI1NikKKwkJY2FyZC0+d2FuZGV2Lm10dSA9IDI1NjsKKwllbHNlIGlmIChjb25mLT5tdHUgPj0gMTI4KQorCQljYXJkLT53YW5kZXYubXR1ID0gMTI4OworCWVsc2UgCisJCWNhcmQtPndhbmRldi5tdHUgPSA2NDsKKworCXUuY2ZnLmRlZlBrdFNpemUgPSB1LmNmZy5wa3RNVFUgPSBjYXJkLT53YW5kZXYubXR1OworCisJaWYgKGNvbmYtPnUueDI1LmhpX3B2Yyl7CisJCWNhcmQtPnUueC5oaV9wdmMgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LmhpX3B2YywgTUFYX0xDTl9OVU0pOworCQljYXJkLT51LngubG9fcHZjID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS5sb19wdmMsIGNhcmQtPnUueC5oaV9wdmMpOworCX0KKworCWlmIChjb25mLT51LngyNS5oaV9zdmMpeworCQljYXJkLT51LnguaGlfc3ZjID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS5oaV9zdmMsIE1BWF9MQ05fTlVNKTsKKwkJY2FyZC0+dS54LmxvX3N2YyA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUubG9fc3ZjLCBjYXJkLT51LnguaGlfc3ZjKTsKKwl9CisKKwkvKiBGaWd1cmUgb3V0IHRoZSB0b3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgdG8gY29uZmlndXJlICovCisJY2FyZC0+dS54Lm51bV9vZl9jaCA9IDA7CisJaWYgKGNhcmQtPnUueC5oaV9zdmMgIT0gMCl7CisJCWNhcmQtPnUueC5udW1fb2ZfY2ggPSAoY2FyZC0+dS54LmhpX3N2YyAtIGNhcmQtPnUueC5sb19zdmMpICsgMTsKKwl9CisJaWYgKGNhcmQtPnUueC5oaV9wdmMgIT0gMCl7CisJCWNhcmQtPnUueC5udW1fb2ZfY2ggKz0gKGNhcmQtPnUueC5oaV9wdmMgLSBjYXJkLT51LngubG9fcHZjKSArIDE7CisJfQorCisJaWYgKGNhcmQtPnUueC5udW1fb2ZfY2ggPT0gMCl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFUlJPUiwgTWluaW11bSBudW1iZXIgb2YgUFZDL1NWQyBjaGFubmVscyBpcyAxICFcbiIKKwkJCQkgIiVzOiBQbGVhc2Ugc2V0IHRoZSBMb3dlc3QvSGlnaGVzdCBQVkMvU1ZDIHZhbHVlcyAhXG4iLAorCQkJCSBjYXJkLT5kZXZuYW1lLGNhcmQtPmRldm5hbWUpOworCQlyZXR1cm4gLUVDSFJORzsKKwl9CisJCisJdS5jZmcubG9QVkMgPSBjYXJkLT51LngubG9fcHZjOworCXUuY2ZnLmhpUFZDID0gY2FyZC0+dS54LmhpX3B2YzsKKwl1LmNmZy5sb1R3b1dheVNWQyA9IGNhcmQtPnUueC5sb19zdmM7CisJdS5jZmcuaGlUd29XYXlTVkMgPSBjYXJkLT51LnguaGlfc3ZjOworCisJaWYgKGNvbmYtPnUueDI1LmhkbGNfd2luZG93KQorCQl1LmNmZy5oZGxjV2luZG93ID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS5oZGxjX3dpbmRvdywgNyk7CisJaWYgKGNvbmYtPnUueDI1LnBrdF93aW5kb3cpCisJCXUuY2ZnLnBrdFdpbmRvdyA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUucGt0X3dpbmRvdywgNyk7CisKKwlpZiAoY29uZi0+dS54MjUudDEpCisJCXUuY2ZnLnQxID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS50MSwgMzApOworCWlmIChjb25mLT51LngyNS50MikKKwkJdS5jZmcudDIgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LnQyLCAyOSk7CisJaWYgKGNvbmYtPnUueDI1LnQ0KQorCQl1LmNmZy50NCA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUudDQsIDI0MCk7CisJaWYgKGNvbmYtPnUueDI1Lm4yKQorCQl1LmNmZy5uMiA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUubjIsIDMwKTsKKworCWlmIChjb25mLT51LngyNS50MTBfdDIwKQorCQl1LmNmZy50MTB0MjAgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LnQxMF90MjAsMjU1KTsKKwlpZiAoY29uZi0+dS54MjUudDExX3QyMSkKKwkJdS5jZmcudDExdDIxID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS50MTFfdDIxLDI1NSk7CisJaWYgKGNvbmYtPnUueDI1LnQxMl90MjIpCisJCXUuY2ZnLnQxMnQyMiA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUudDEyX3QyMiwyNTUpOworCWlmIChjb25mLT51LngyNS50MTNfdDIzKQkKKwkJdS5jZmcudDEzdDIzID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS50MTNfdDIzLDI1NSk7CisJaWYgKGNvbmYtPnUueDI1LnQxNl90MjYpCisJCXUuY2ZnLnQxNnQyNiA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUudDE2X3QyNiwgMjU1KTsKKwlpZiAoY29uZi0+dS54MjUudDI4KQorCQl1LmNmZy50MjggPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LnQyOCwgMjU1KTsKKworCWlmIChjb25mLT51LngyNS5yMTBfcjIwKQorCQl1LmNmZy5yMTByMjAgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPnUueDI1LnIxMF9yMjAsMjUwKTsKKwlpZiAoY29uZi0+dS54MjUucjEyX3IyMikKKwkJdS5jZmcucjEycjIyID0gbWluX3QodW5zaWduZWQgaW50LCBjb25mLT51LngyNS5yMTJfcjIyLDI1MCk7CisJaWYgKGNvbmYtPnUueDI1LnIxM19yMjMpCisJCXUuY2ZnLnIxM3IyMyA9IG1pbl90KHVuc2lnbmVkIGludCwgY29uZi0+dS54MjUucjEzX3IyMywyNTApOworCisKKwlpZiAoY29uZi0+dS54MjUuY2NpdHRfY29tcGF0KQorCQl1LmNmZy5jY2l0dENvbXBhdCA9IGNvbmYtPnUueDI1LmNjaXR0X2NvbXBhdDsKKworCS8qIGluaXRpYWxpemUgYWRhcHRlciAqLworCWlmIChjYXJkLT51LnguTEFQQl9oZGxjKXsKKwkJaWYgKGhkbGNfY29uZmlndXJlKGNhcmQsICZ1LmNmZykgIT0gQ01EX09LKQorCQkJcmV0dXJuIC1FSU87CisJfWVsc2V7CisJCWlmICh4MjVfY29uZmlndXJlKGNhcmQsICZ1LmNmZykgIT0gQ01EX09LKQorCQkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKCh4MjVfY2xvc2VfaGRsYyhjYXJkKSAhPSBDTURfT0spIHx8CQkvKiBjbG9zZSBIRExDIGxpbmsgKi8KKwkgICAgKHgyNV9zZXRfZHRyKGNhcmQsIDApICE9IENNRF9PSykpCQkvKiBkcm9wIERUUiAqLworCQlyZXR1cm4gLUVJTzsKKworCS8qIEluaXRpYWxpemUgcHJvdG9jb2wtc3BlY2lmaWMgZmllbGRzIG9mIGFkYXB0ZXIgZGF0YSBzcGFjZSAqLworCWNhcmQtPndhbmRldi5icHMJPSBjb25mLT5icHM7CisJY2FyZC0+d2FuZGV2LmludGVyZmFjZQk9IGNvbmYtPmludGVyZmFjZTsKKwljYXJkLT53YW5kZXYuY2xvY2tpbmcJPSBjb25mLT5jbG9ja2luZzsKKwljYXJkLT53YW5kZXYuc3RhdGlvbgk9IGNvbmYtPnN0YXRpb247CisJY2FyZC0+aXNyCQk9ICZ3cHhfaXNyOworCWNhcmQtPnBvbGwJCT0gTlVMTDsgLy8md3B4X3BvbGw7CisJY2FyZC0+ZGlzYWJsZV9jb21tCT0gJmRpc2FibGVfY29tbTsKKwljYXJkLT5leGVjCQk9ICZ3cHhfZXhlYzsKKwljYXJkLT53YW5kZXYudXBkYXRlCT0gJnVwZGF0ZTsKKwljYXJkLT53YW5kZXYubmV3X2lmCT0gJm5ld19pZjsKKwljYXJkLT53YW5kZXYuZGVsX2lmCT0gJmRlbF9pZjsKKworCS8qIFdBUk5JTkc6IFRoaXMgZnVuY3Rpb24gY2Fubm90IGV4aXQgd2l0aCBhbiBlcnJvcgorCSAqICAgICAgICAgIGFmdGVyIHRoZSBjaGFuZ2Ugb2Ygc3RhdGUgKi8KKwljYXJkLT53YW5kZXYuc3RhdGUJPSBXQU5fRElTQ09OTkVDVEVEOworCQorCWNhcmQtPndhbmRldi5lbmFibGVfdHhfaW50ID0gMDsKKwljYXJkLT5pcnFfZGlzX2lmX3NlbmRfY291bnQgPSAwOworICAgICAgICBjYXJkLT5pcnFfZGlzX3BvbGxfY291bnQgPSAwOworCWNhcmQtPnUueC50eF9kZXYgPSBOVUxMOworCWNhcmQtPnUueC5ub19kZXYgPSAwOworCisKKwkvKiBDb25maWd1cmUgZm9yIFM1MTQgUENJIENhcmQgKi8KKwlpZiAoY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpIHsKKwkJY2FyZC0+dS54LmhkbGNfYnVmX3N0YXR1cyA9IAorCQkJKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikKKwkJCQkoY2FyZC0+aHcuZHBtYmFzZSArIFgyNV9NQl9WRUNUT1IrIFgyNV9NSVNDX0hETENfQklUUyk7CisJfWVsc2V7CisJCWNhcmQtPnUueC5oZGxjX2J1Zl9zdGF0dXMgPSAKKwkJCSh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKGNhcmQtPmh3LmRwbWJhc2UgKyBYMjVfTUlTQ19IRExDX0JJVFMpOyAKKwl9CisKKwljYXJkLT51LngucG9sbF9kZXZpY2U9TlVMTDsKKwljYXJkLT53YW5kZXYudWRwX3BvcnQgPSBjb25mLT51ZHBfcG9ydDsKKworCS8qIEVuYWJsZSBvciBkaXNhYmxlIGNhbGwgc2V0dXAgbG9nZ2luZyAqLworCWlmIChjb25mLT51LngyNS5sb2dnaW5nID09IFdBTk9QVF9ZRVMpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRW5hYmxpbmcgQ2FsbCBMb2dnaW5nLlxuIiwKKwkJCWNhcmQtPmRldm5hbWUpOworCQljYXJkLT51LngubG9nZ2luZyA9IDE7CisJfWVsc2V7CQorCQljYXJkLT51LngubG9nZ2luZyA9IDA7CisJfQorCisJLyogRW5hYmxlIG9yIGRpc2FibGUgbW9kZW0gc3RhdHVzIHJlcG9ydGluZyAqLworCWlmIChjb25mLT51LngyNS5vb2Jfb25fbW9kZW0gPT0gV0FOT1BUX1lFUyl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFbmFibGluZyBPT0Igb24gTW9kZW0gY2hhbmdlLlxuIiwKKwkJCWNhcmQtPmRldm5hbWUpOworCQljYXJkLT51Lngub29iX29uX21vZGVtID0gMTsKKwl9ZWxzZXsKKwkJY2FyZC0+dS54Lm9vYl9vbl9tb2RlbSA9IDA7CisJfQorCQorCWluaXRfZ2xvYmFsX3N0YXRpc3RpY3MoY2FyZCk7CQorCisJSU5JVF9XT1JLKCZjYXJkLT51LngueDI1X3BvbGxfd29yaywgKHZvaWQgKil3cHhfcG9sbCwgY2FyZCk7CisKKwlpbml0X3RpbWVyKCZjYXJkLT51LngueDI1X3RpbWVyKTsKKwljYXJkLT51LngueDI1X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyljYXJkOworCWNhcmQtPnUueC54MjVfdGltZXIuZnVuY3Rpb24gPSB4MjVfdGltZXJfcm91dGluZTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCVdBTiBEZXZpY2UgRHJpdmVyIEVudHJ5IFBvaW50cyAKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTmFtZToJdXBkYXRlKCksICBVcGRhdGUgZGV2aWNlIHN0YXR1cyAmIHN0YXRpc3RpY3MuCisgKgorICogUHVycG9zZToJVG8gcHJvdmlkZSBkZWJ1Z2dpbmcgYW5kIHN0YXRpdGljYWwKKyAqICAgICAgICAgICAgICBpbmZvcm1hdGlvbiB0byB0aGUgL3Byb2MgZmlsZSBzeXN0ZW0uCisgKiAgICAgICAgICAgICAgL3Byb2MvbmV0L3dhbnJvdXRlci93YW5waXBlIworICogICAgICAgICAgICAgIAkKKyAqIFJhdGlvbmFsZToJVGhlIC9wcm9jIGZpbGUgc3lzdGVtIGlzIHVzZWQgdG8gY29sbGVjdAorICogICAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBrZXJuZWwgYW5kIGRyaXZlcnMuCisgKiAgICAgICAgICAgICAgVXNpbmcgdGhlIC9wcm9jIGZpbGUgc3lzdGVtIHRoZSB1c2VyCisgKiAgICAgICAgICAgICAgY2FuIHNlZSBleGFjdGx5IHdoYXQgdGhlIHNhbmdvbWEgZHJpdmVycyBhcmUKKyAqICAgICAgICAgICAgICBkb2luZy4gQW5kIGluIHdoYXQgc3RhdGUgdGhleSBhcmUgaW4uIAorICogICAgICAgICAgICAgICAgCisgKiBEZXNjcmlwdGlvbjogQ29sbGVjdCBhbGwgZHJpdmVyIHN0YXRpc3RpY2FsIGluZm9ybWF0aW9uCisgKiAgICAgICAgICAgICAgYW5kIHBhc3MgaXQgdG8gdGhlIHRvcCBsYXl3ZXIuIAorICoJCQorICoJCVNpbmNlIHdlIGhhdmUgdG8gZXhlY3V0ZSBhIGRlYnVnZ2luZyBjb21tYW5kLCAKKyAqICAgICAgICAgICAgICB0byBvYnRhaW4gZmlybXdhcmUgc3RhdGl0aWNzLCB3ZSB0cmlnZ2VyIGEgCisgKiAgICAgICAgICAgICAgVVBEQVRFIGZ1bmN0aW9uIHdpdGhpbiB0aGUgdGltZXIgaW50ZXJydHVwLgorICogICAgICAgICAgICAgIFdlIHdhaXQgdW50aWwgdGhlIHRpbWVyIHVwZGF0ZSBpcyBjb21wbGV0ZS4KKyAqICAgICAgICAgICAgICBPbmNlIGNvbXBsZXRlIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgcmV0dXJuCisgKiAgICAgICAgICAgICAgY29kZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSB1cGRhdGUgd2FzIHN1Y2Nlc3NmdWwuCisgKiAgICAgICAgICAgICAgCisgKiBDYWxsZWQgYnk6CWRldmljZV9zdGF0KCkgaW4gd2FubWFpbi5jCisgKgorICogQXNzdW1wdGlvbnM6CQorICoKKyAqIFdhcm5pbmdzOglUaGlzIGZ1bmN0aW9uIHdpbGwgZGVncmFkZSB0aGUgcGVyZm9ybWFuY2UKKyAqICAgICAgICAgICAgICBvZiB0aGUgcm91dGVyLCBzaW5jZSBpdCB1c2VzIHRoZSBtYWlsYm94LiAKKyAqCisgKiBSZXR1cm46IAkwIAlPSworICogCQk8MAlGYWlsZWQgKG9yIGJ1c3kpLgorICovCisKK3N0YXRpYyBpbnQgdXBkYXRlKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYpCit7CisJdm9sYXRpbGUgc2RsYV90KiBjYXJkOworCVRYMjVTdGF0dXMqIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwkvKiBzYW5pdHkgY2hlY2tzICovCisJaWYgKCh3YW5kZXYgPT0gTlVMTCkgfHwgKHdhbmRldi0+cHJpdmF0ZSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAod2FuZGV2LT5zdGF0ZSA9PSBXQU5fVU5DT05GSUdVUkVEKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICh0ZXN0X2JpdChTRU5EX0NSSVQsICh2b2lkKikmd2FuZGV2LT5jcml0aWNhbCkpCisJCXJldHVybiAtRUFHQUlOOworCisJaWYgKCF3YW5kZXYtPmRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisJCisJY2FyZCA9IHdhbmRldi0+cHJpdmF0ZTsKKwlzdGF0dXMgPSBjYXJkLT5mbGFnczsKKworCWNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCB8PSBUTVJfSU5UX0VOQUJMRURfVVBEQVRFOworCXN0YXR1cy0+aW1hc2sgfD0gSU5UUl9PTl9USU1FUjsKKwl0aW1lb3V0ID0gamlmZmllczsJCisKKwlmb3IgKDs7KXsKKwkJaWYgKCEoY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX1VQREFURSkpewkKKwkJCWJyZWFrOworCQl9CisJCWlmICgoamlmZmllcy10aW1lb3V0KSA+IDEqSFopeworCQkJY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkICY9IH5UTVJfSU5UX0VOQUJMRURfVVBEQVRFOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBOYW1lOgluZXdfaWYKKyAqCisgKiBQdXJwb3NlOglUbyBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSByZXNvdXJjZXMgZm9yIGEgCisgKiAgICAgICAgICAgICAgbmV3IGxvZ2ljYWwgY2hhbm5lbC4gIAorICogCisgKiBSYXRpb25hbGU6CUEgbmV3IGNoYW5uZWwgY2FuIGJlIGFkZGVkIGR5bmFtaWNhbGx5IHZpYQorICogICAgICAgICAgICAgIGlvY3RsIGNhbGwuCisgKiAgICAgICAgICAgICAgICAKKyAqIERlc2NyaXB0aW9uOglBbGxvY2F0ZSBhIHByaXZhdGUgY2hhbm5lbCBzdHJ1Y3R1cmUsIHgyNV9jaGFubmVsX3QuCisgKgkJUGFyc2UgdGhlIHVzZXIgaW50ZXJmYWNlIG9wdGlvbnMgZnJvbSB3YW5waXBlIy5jb25mIAorICoJCWNvbmZpZ3VyYXRpb24gZmlsZS4gCisgKgkJQmluZCB0aGUgcHJpdmF0ZSBhcmUgaW50byB0aGUgbmV0d29yayBkZXZpY2UgcHJpdmF0ZQorICogICAgICAgICAgICAgIGFyZWEgcG9pbnRlciAoZGV2LT5wcml2KS4KKyAqCQlQcmVwYXJlIHRoZSBuZXR3b3JrIGRldmljZSBzdHJ1Y3R1cmUgZm9yIHJlZ2lzdHJhdGlvbi4KKyAqCisgKiBDYWxsZWQgYnk6CVJPVVRFUl9JRk5FVyBJb2N0bCBjYWxsLCBmcm9tIHdhbnJvdXRlcl9pb2N0bCgpIAorICogICAgICAgICAgICAgICh3YW5tYWluLmMpCisgKgorICogQXNzdW1wdGlvbnM6IE5vbmUKKyAqCisgKiBXYXJuaW5nczoJTm9uZQorICoKKyAqIFJldHVybjogCTAgCU9rCisgKgkJPDAgCUZhaWxlZCAoY2hhbm5lbCB3aWxsIG5vdCBiZSBjcmVhdGVkKQorICovCitzdGF0aWMgaW50IG5ld19pZihzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LAorCQkgIHdhbmlmX2NvbmZfdCogY29uZikKK3sKKwlzZGxhX3QqIGNhcmQgPSB3YW5kZXYtPnByaXZhdGU7CisJeDI1X2NoYW5uZWxfdCogY2hhbjsKKwlpbnQgZXJyID0gMDsKKworCWlmICgoY29uZi0+bmFtZVswXSA9PSAnXDAnKSB8fCAoc3RybGVuKGNvbmYtPm5hbWUpID4gV0FOX0lGTkFNRV9TWikpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogaW52YWxpZCBpbnRlcmZhY2UgbmFtZSFcbiIsCisJCQljYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYoY2FyZC0+d2FuZGV2Lm5ld19pZl9jbnQrKyA+IDAgJiYgY2FyZC0+dS54LkxBUEJfaGRsYykgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRXJyb3I6IFJ1bm5pbmcgTEFQQiBIRExDIE1vZGUgIVxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQlwcmludGsoS0VSTl9JTkZPIAorCQkJIiVzOiBNYXhpbXVtIG51bWJlciBvZiBuZXR3b3JrIGludGVyZmFjZXMgbXVzdCBiZSBvbmUgIVxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBwcml2YXRlIGRhdGEgKi8KKwljaGFuID0ga21hbGxvYyhzaXplb2YoeDI1X2NoYW5uZWxfdCksIEdGUF9BVE9NSUMpOworCWlmIChjaGFuID09IE5VTEwpeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJCisJbWVtc2V0KGNoYW4sIDAsIHNpemVvZih4MjVfY2hhbm5lbF90KSk7CisKKwkvKiBCdWcgRml4OiBTZWcgRXJyIG9uIFBWQyBzdGFydHVwCisJICogSXQgbXVzdCBiZSBoZXJlIHNpbmNlIGJpbmRfbGNuX3RvX2RldiBleHBlY3RzIAorCSAqIGl0IGJlbGxvdyAqLworCWRldi0+cHJpdiA9IGNoYW47CisJCisJc3RyY3B5KGNoYW4tPm5hbWUsIGNvbmYtPm5hbWUpOworCWNoYW4tPmNhcmQgPSBjYXJkOworCWNoYW4tPmRldiA9IGRldjsKKwljaGFuLT5jb21tb24uc2sgPSBOVUxMOworCWNoYW4tPmNvbW1vbi5mdW5jID0gTlVMTDsKKwljaGFuLT5jb21tb24ucndfYmluZCA9IDA7CisJY2hhbi0+dHhfc2tiID0gY2hhbi0+cnhfc2tiID0gTlVMTDsKKworCS8qIHZlcmlmeSBtZWRpYSBhZGRyZXNzICovCisJaWYgKGNvbmYtPmFkZHJbMF0gPT0gJ0AnKXsJCS8qIFNWQyAqLworCQljaGFuLT5jb21tb24uc3ZjID0gMTsKKwkJc3RybmNweShjaGFuLT5hZGRyLCAmY29uZi0+YWRkclsxXSwgV0FOX0FERFJFU1NfU1opOworCisJCS8qIFNldCBjaGFubmVsIHRpbWVvdXRzIChkZWZhdWx0IGlmIG5vdCBzcGVjaWZpZWQpICovCisJCWNoYW4tPmlkbGVfdGltZW91dCA9IChjb25mLT5pZGxlX3RpbWVvdXQpID8gCisJCQkJCWNvbmYtPmlkbGVfdGltZW91dCA6IDkwOworCQljaGFuLT5ob2xkX3RpbWVvdXQgPSAoY29uZi0+aG9sZF90aW1lb3V0KSA/IAorCQkJCQljb25mLT5ob2xkX3RpbWVvdXQgOiAxMDsKKworCX1lbHNlIGlmIChpc19kaWdpdChjb25mLT5hZGRyWzBdKSl7CS8qIFBWQyAqLworCQlpbnQgbGNuID0gZGVjX3RvX3VpbnQoY29uZi0+YWRkciwgMCk7CisKKwkJaWYgKChsY24gPj0gY2FyZC0+dS54LmxvX3B2YykgJiYgKGxjbiA8PSBjYXJkLT51LnguaGlfcHZjKSl7CisJCQliaW5kX2xjbl90b19kZXYgKGNhcmQsIGRldiwgbGNuKTsKKwkJfWVsc2V7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkiJXM6IFBWQyAldSBpcyBvdXQgb2YgcmFuZ2Ugb24gaW50ZXJmYWNlICVzIVxuIiwKKwkJCQl3YW5kZXYtPm5hbWUsIGxjbiwgY2hhbi0+bmFtZSk7CisJCQllcnIgPSAtRUlOVkFMOworCQl9CisJfWVsc2V7CisJCXByaW50ayhLRVJOX0VSUgorCQkJIiVzOiBpbnZhbGlkIG1lZGlhIGFkZHJlc3Mgb24gaW50ZXJmYWNlICVzIVxuIiwKKwkJCXdhbmRldi0+bmFtZSwgY2hhbi0+bmFtZSk7CisJCWVyciA9IC1FSU5WQUw7CisJfQorCisJaWYoc3RyY21wKGNvbmYtPnVzZWRieSwgIldBTlBJUEUiKSA9PSAwKXsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogUnVubmluZyBpbiBXQU5QSVBFIG1vZGUgJXNcbiIsCisJCQl3YW5kZXYtPm5hbWUsIGNoYW4tPm5hbWUpOworICAgICAgICAgICAgICAgIGNoYW4tPmNvbW1vbi51c2VkYnkgPSBXQU5QSVBFOworCQljaGFuLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKworICAgICAgICB9ZWxzZSBpZihzdHJjbXAoY29uZi0+dXNlZGJ5LCAiQVBJIikgPT0gMCl7CisJCWNoYW4tPmNvbW1vbi51c2VkYnkgPSBBUEk7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJ1bm5pbmcgaW4gQVBJIG1vZGUgJXNcbiIsCisJCQl3YW5kZXYtPm5hbWUsIGNoYW4tPm5hbWUpOworCQljaGFuLT5wcm90b2NvbCA9IGh0b25zKFgyNV9QUk9UKTsKKwl9CisKKworCWlmIChlcnIpeworCQlrZnJlZShjaGFuKTsKKwkJZGV2LT5wcml2ID0gTlVMTDsKKwkJcmV0dXJuIGVycjsKKwl9CisJCisJY2hhbi0+ZW5hYmxlX0lQWCA9IGNvbmYtPmVuYWJsZV9JUFg7CisJCisJaWYgKGNoYW4tPmVuYWJsZV9JUFgpCisJCWNoYW4tPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVBYKTsKKwkKKwlpZiAoY29uZi0+bmV0d29ya19udW1iZXIpCisJCWNoYW4tPm5ldHdvcmtfbnVtYmVyID0gY29uZi0+bmV0d29ya19udW1iZXI7CisJZWxzZQorCQljaGFuLT5uZXR3b3JrX251bWJlciA9IDB4REVBREJFRUY7CisKKwkvKiBwcmVwYXJlIG5ldHdvcmsgZGV2aWNlIGRhdGEgc3BhY2UgZm9yIHJlZ2lzdHJhdGlvbiAqLworCXN0cmNweShkZXYtPm5hbWUsY2hhbi0+bmFtZSk7CisKKwlkZXYtPmluaXQgPSAmaWZfaW5pdDsKKworCWluaXRfeDI1X2NoYW5uZWxfc3RydWN0KGNoYW4pOworCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTmFtZToJZGVsX2lmKCksICBSZW1vdmUgYSBsb2dpY2FsIGNoYW5uZWwuCSAKKyAqCisgKiBQdXJwb3NlOglUbyBkeW5hbWljYWxseSByZW1vdmUgYSBsb2dpY2FsIGNoYW5uZWwuCisgKiAKKyAqIFJhdGlvbmFsZToJRWFjaCBsb2dpY2FsIGNoYW5uZWwgc2hvdWxkIGJlIGR5bmFtaWNhbGx5CisgKiAgICAgICAgICAgICAgcmVtb3ZhYmxlLiBUaGlzIGZ1bmN0aW4gaXMgY2FsbGVkIGJ5IGFuIAorICogICAgICAgICAgICAgIElPQ1RMX0lGREVMIGlvY3RsIGNhbGwgb3Igc2h1dGRvd24oKS4gCisgKiAgICAgICAgICAgICAgICAKKyAqIERlc2NyaXB0aW9uOiBEbyBub3RoaW5nLgorICoKKyAqIENhbGxlZCBieToJSU9DVExfSUZERUwgOiB3YW5yb3V0ZXJfaW9jdGwoKSBmcm9tIHdhbm1haW4uYworICogICAgICAgICAgICAgIHNodXRkb3duKCkgZnJvbSBzZGxhbWFpbi5jCisgKgorICogQXNzdW1wdGlvbnM6IAorICoKKyAqIFdhcm5pbmdzOgorICoKKyAqIFJldHVybjogCTAgT2suIFZvaWQgZnVuY3Rpb24uCisgKi8KKworLy9GSVhNRSBEZWwgSUYgU2hvdWxkIGJlIHRha2VuIG91dCBub3cuCisKK3N0YXRpYyBpbnQgZGVsX2lmKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE5hbWU6CXdweF9leGVjCisgKgorICogRGVzY3JpcHRpb246CUV4ZWN1dGUgYWRhcHRlciBpbnRlcmZhY2UgY29tbWFuZC4KKyAqIAkJVGhpcyBvcHRpb24gaXMgY3VycmVudGx5IGRpc3NhYmxlZC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHdweF9leGVjIChzdHJ1Y3Qgc2RsYSogY2FyZCwgdm9pZCogdV9jbWQsIHZvaWQqIHVfZGF0YSkKK3sKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBOYW1lOglkaXNhYmxlX2NvbW0JCisgKgorICogRGVzY3JpcHRpb246CURpc2FibGUgY29tbXVuaWNhdGlvbnMgZHVyaW5nIHNodXRkb3duLgorICogICAgICAgICAgICAgIERvbnQgY2hlY2sgcmV0dXJuIGNvZGUgYmVjYXVzZSB0aGVyZSBpcyAKKyAqICAgICAgICAgICAgICBub3RoaW5nIHdlIGNhbiBkbyBhYm91dCBpdC4gIAorICoKKyAqIFdhcm5pbmc6CURldiBhbmQgcHJpdmF0ZSBhcmVhcyBhcmUgZ29uZSBhdCB0aGlzIHBvaW50LgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGRpc2FibGVfY29tbShzZGxhX3QqIGNhcmQpCit7CisJZGlzYWJsZV9jb21tX3NodXRkb3duKGNhcmQpOworCWRlbF90aW1lcigmY2FyZC0+dS54LngyNV90aW1lcik7CisJcmV0dXJuOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKglOZXR3b3JrIERldmljZSBJbnRlcmZhY2UgCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBOYW1lOglpZl9pbml0KCksICAgTmV0b3dyayBJbnRlcmZhY2UgSW5pdGlhbGl6YXRpb24gCSAKKyAqCisgKiBQdXJwb3NlOglUbyBpbml0aWFsaXplIGEgbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZS4KKyAqIAorICogUmF0aW9uYWxlOglEdXJpbmcgbmV0d29yayBpbnRlcmZhY2Ugc3RhcnR1cCwgdGhlIGlmX2luaXQKKyAqICAgICAgICAgICAgICBpcyBjYWxsZWQgYnkgdGhlIGtlcm5lbCB0byBpbml0aWFsaXplIHRoZQorICogICAgICAgICAgICAgIG5ldG93cmsgZGV2aWNlIHN0cnVjdHVyZS4gIFRodXMgYSBkcml2ZXIKKyAqICAgICAgICAgICAgICBjYW4gY3VzdG9temUgYSBuZXR3b3JrIGRldmljZS4gCisgKiAgICAgICAgICAgICAgICAKKyAqIERlc2NyaXB0aW9uOglJbml0aWFsaXplIHRoZSBuZXRvd3JrIGRldmljZSBjYWxsIGJhY2sKKyAqICAgICAgICAgICAgICByb3V0aW5lcy4gIFRoaXMgaXMgd2hlcmUgd2UgdGVsbCB0aGUga2VybmVsCisgKiAgICAgICAgICAgICAgd2hpY2ggZnVuY3Rpb24gdG8gdXNlIHdoZW4gaXQgd2FudHMgdG8gc2VuZAorICogICAgICAgICAgICAgIHZpYSBvdXIgaW50ZXJmYWNlLiAKKyAqCQlGdXJ0aGVybW9yZSwgd2UgaW5pdGlhbGl6ZSB0aGUgZGV2aWNlIGZsYWdzLCAKKyAqICAgICAgICAgICAgICBNVFUgYW5kIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGJvYXJkLgorICoKKyAqIENhbGxlZCBieToJS2VybmVsICgvdXNyL3NyYy9saW51eC9uZXQvY29yZS9kZXYuYykKKyAqIAkJKGRldi0+aW5pdCgpKQorICoKKyAqIEFzc3VtcHRpb25zOiBOb25lCisgKgkKKyAqIFdhcm5pbmdzOglOb25lCisgKgorICogUmV0dXJuOiAJMCAJT2sgOiBWb2lkIGZ1bmN0aW9uLgorICovCitzdGF0aWMgaW50IGlmX2luaXQoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisJc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiA9ICZjYXJkLT53YW5kZXY7CisKKwkvKiBJbml0aWFsaXplIGRldmljZSBkcml2ZXIgZW50cnkgcG9pbnRzICovCisJZGV2LT5vcGVuCQk9ICZpZl9vcGVuOworCWRldi0+c3RvcAkJPSAmaWZfY2xvc2U7CisJZGV2LT5oYXJkX2hlYWRlcgk9ICZpZl9oZWFkZXI7CisJZGV2LT5yZWJ1aWxkX2hlYWRlcgk9ICZpZl9yZWJ1aWxkX2hkcjsKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdAk9ICZpZl9zZW5kOworCWRldi0+Z2V0X3N0YXRzCQk9ICZpZl9zdGF0czsKKwlkZXYtPnR4X3RpbWVvdXQJCT0gJmlmX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbwk9IFRYX1RJTUVPVVQ7CisKKwkvKiBJbml0aWFsaXplIG1lZGlhLXNwZWNpZmljIHBhcmFtZXRlcnMgKi8KKwlkZXYtPnR5cGUJCT0gQVJQSFJEX1BQUDsJCS8qIEFSUCBoL3cgdHlwZSAqLworCWRldi0+ZmxhZ3MJCXw9IElGRl9QT0lOVE9QT0lOVDsKKwlkZXYtPmZsYWdzCQl8PSBJRkZfTk9BUlA7CisKKwlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpeworCQlkZXYtPm10dQk9IFgyNV9DSEFOX01UVStzaXplb2YoeDI1YXBpX2hkcl90KTsKKwl9ZWxzZXsKKwkJZGV2LT5tdHUJPSBjYXJkLT53YW5kZXYubXR1OyAJCisJfQorCQorCWRldi0+aGFyZF9oZWFkZXJfbGVuCT0gWDI1X0hSREhEUl9TWjsgLyogbWVkaWEgaGVhZGVyIGxlbmd0aCAqLworCWRldi0+YWRkcl9sZW4JCT0gMjsJCS8qIGhhcmR3YXJlIGFkZHJlc3MgbGVuZ3RoICovCisJCisJaWYgKCFjaGFuLT5jb21tb24uc3ZjKXsKKwkJKih1bnNpZ25lZCBzaG9ydCopZGV2LT5kZXZfYWRkciA9IGh0b25zKGNoYW4tPmNvbW1vbi5sY24pOworCX0KKwkKKwkvKiBJbml0aWFsaXplIGhhcmR3YXJlIHBhcmFtZXRlcnMgKGp1c3QgZm9yIHJlZmVyZW5jZSkgKi8KKwlkZXYtPmlycQk9IHdhbmRldi0+aXJxOworCWRldi0+ZG1hCT0gd2FuZGV2LT5kbWE7CisJZGV2LT5iYXNlX2FkZHIJPSB3YW5kZXYtPmlvcG9ydDsKKwlkZXYtPm1lbV9zdGFydAk9ICh1bnNpZ25lZCBsb25nKXdhbmRldi0+bWFkZHI7CisJZGV2LT5tZW1fZW5kCT0gd2FuZGV2LT5tYWRkciArIHdhbmRldi0+bXNpemUgLSAxOworCisgICAgICAgIC8qIFNldCB0cmFuc21pdCBidWZmZXIgcXVldWUgbGVuZ3RoICovCisgICAgICAgIGRldi0+dHhfcXVldWVfbGVuID0gMTAwOworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCS8qIEZJWE1FIFdoeSBhcmUgd2UgZG9pbmcgdGhpcyAqLworCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RFRCk7CisJcmV0dXJuIDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBOYW1lOglpZl9vcGVuKCksICAgT3Blbi9CcmluZyB1cCB0aGUgTmV0b3dyayBJbnRlcmZhY2UgCisgKgorICogUHVycG9zZToJVG8gYnJpbmcgdXAgYSBuZXR3b3JrIGludGVyZmFjZS4KKyAqIAorICogUmF0aW9uYWxlOgkKKyAqICAgICAgICAgICAgICAgIAorICogRGVzY3JpcHRpb246CU9wZW4gbmV0d29yayBpbnRlcmZhY2UuCisgKiAJCW8gcHJldmVudCBtb2R1bGUgZnJvbSB1bmxvYWRpbmcgYnkgaW5jcmVtZW50aW5nIHVzZSBjb3VudAorICogCQlvIGlmIGxpbmsgaXMgZGlzY29ubmVjdGVkIHRoZW4gaW5pdGlhdGUgY29ubmVjdGlvbgorICoKKyAqIENhbGxlZCBieToJS2VybmVsICgvdXNyL3NyYy9saW51eC9uZXQvY29yZS9kZXYuYykKKyAqIAkJKGRldi0+b3BlbigpKQorICoKKyAqIEFzc3VtcHRpb25zOiBOb25lCisgKgkKKyAqIFdhcm5pbmdzOglOb25lCisgKgorICogUmV0dXJuOiAJMCAJT2sKKyAqIAkJPDAgCUZhaWx1cmU6IEludGVyZmFjZSB3aWxsIG5vdCBjb21lIHVwLgorICovCisKK3N0YXRpYyBpbnQgaWZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXgyNV9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90KiBjYXJkID0gY2hhbi0+Y2FyZDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwl1bnNpZ25lZCBsb25nIHNtcF9mbGFnczsKKwkKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCisJY2hhbi0+dHFfd29ya2luZyA9IDA7CisKKwkvKiBJbml0aWFsaXplIHRoZSB3b3JrcXVldWUgKi8KKwlJTklUX1dPUksoJmNoYW4tPmNvbW1vbi53YW5waXBlX3dvcmssICh2b2lkICopeDI1YXBpX2JoLCBkZXYpOworCisJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgQkggY2lyY3VsYXIgYnVmZmVyICovCisJLyogQWRkIDEgdG8gTUFYX0JIX0JVRkYgc28gd2UgZG9uJ3QgaGF2ZSB0ZXN0IHdpdGggKE1BWF9CSF9CVUZGLTEpICovCisJY2hhbi0+YmhfaGVhZCA9IGttYWxsb2MoKHNpemVvZihiaF9kYXRhX3QpKihNQVhfQkhfQlVGRisxKSksR0ZQX0FUT01JQyk7CisKKwlpZiAoY2hhbi0+YmhfaGVhZCA9PSBOVUxMKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVSUk9SLCBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5ICEgQkhfQlVGRkVSUyAhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisJbWVtc2V0KGNoYW4tPmJoX2hlYWQsMCwoc2l6ZW9mKGJoX2RhdGFfdCkqKE1BWF9CSF9CVUZGKzEpKSk7CisJYXRvbWljX3NldCgmY2hhbi0+YmhfYnVmZl91c2VkLCAwKTsKKworCS8qIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIGludGVyZmFjZXMgKi8KKwkrK2NhcmQtPnUueC5ub19kZXY7CisJCisJd2FucGlwZV9vcGVuKGNhcmQpOworCisJLyogTEFQQiBwcm90b2NvbCBvbmx5IHVzZXMgb25lIGludGVyZmFjZSwgdGh1cworCSAqIHN0YXJ0IHRoZSBwcm90b2NvbCBhZnRlciBpdCBjb21lcyB1cC4gKi8KKwlpZiAoY2FyZC0+dS54LkxBUEJfaGRsYyl7CisJCWlmIChjYXJkLT5vcGVuX2NudCA9PSAxKXsKKwkJCVRYMjVTdGF0dXMqIHN0YXR1cyA9IGNhcmQtPmZsYWdzOworCQkJUzUwOF9TNTE0X2xvY2soY2FyZCwgJnNtcF9mbGFncyk7CisJCQl4MjVfc2V0X2ludHJfbW9kZShjYXJkLCBJTlRSX09OX1RJTUVSKTsgCisJCQlzdGF0dXMtPmltYXNrICY9IH5JTlRSX09OX1RJTUVSOworCQkJUzUwOF9TNTE0X3VubG9jayhjYXJkLCAmc21wX2ZsYWdzKTsKKwkJfQorCX1lbHNleworCQkvKiBYMjUgY2FuIGhhdmUgbXVsdGlwbGUgaW50ZXJmYWNlcyB0aHVzLCBzdGFydCB0aGUgCisJCSAqIHByb3RvY29sIG9uY2UgYWxsIGludGVyZmFjZXMgYXJlIHVwICovCisKKwkJLy9GSVhNRTogVGhlcmUgaXMgYSBidWcgaGVyZS4gSWYgaW50ZXJmYWNlIGlzCisJCS8vYnJvdWdodCBkb3duIGFuZCB1cCwgaXQgd2lsbCB0cnkgdG8gZW5hYmxlIGNvbW0uCisJCWlmIChjYXJkLT5vcGVuX2NudCA9PSBjYXJkLT51LngubnVtX29mX2NoKXsKKworCQkJUzUwOF9TNTE0X2xvY2soY2FyZCwgJnNtcF9mbGFncyk7CisJCQljb25uZWN0KGNhcmQpOworCQkJUzUwOF9TNTE0X3VubG9jayhjYXJkLCAmc21wX2ZsYWdzKTsKKworCQkJbW9kX3RpbWVyKCZjYXJkLT51LngueDI1X3RpbWVyLCBqaWZmaWVzICsgSFopOworCQl9CisJfQorCS8qIERldmljZSBpcyBub3QgdXAgdW50aWwgdGhlIHdlIGFyZSBpbiBjb25uZWN0ZWQgc3RhdGUgKi8KKwlkb19nZXR0aW1lb2ZkYXkoICZ0diApOworCWNoYW4tPnJvdXRlcl9zdGFydF90aW1lID0gdHYudHZfc2VjOworCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE5hbWU6CWlmX2Nsb3NlKCksICAgQ2xvc2UvQnJpbmcgZG93biB0aGUgTmV0b3dyayBJbnRlcmZhY2UgCisgKgorICogUHVycG9zZToJVG8gYnJpbmcgZG93biBhIG5ldHdvcmsgaW50ZXJmYWNlLgorICogCisgKiBSYXRpb25hbGU6CQorICogICAgICAgICAgICAgICAgCisgKiBEZXNjcmlwdGlvbjoJQ2xvc2UgbmV0d29yayBpbnRlcmZhY2UuCisgKiAJCW8gZGVjcmVtZW50IHVzZSBtb2R1bGUgdXNlIGNvdW50CisgKgorICogQ2FsbGVkIGJ5OglLZXJuZWwgKC91c3Ivc3JjL2xpbnV4L25ldC9jb3JlL2Rldi5jKQorICogCQkoZGV2LT5jbG9zZSgpKQorICoJCWlmY29uZmlnIDxuYW1lPiBkb3duOiB3aWxsIHRyaWdnZXIgdGhlIGtlcm5lbAorICogICAgICAgICAgICAgIHdoaWNoIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIEFzc3VtcHRpb25zOiBOb25lCisgKgkKKyAqIFdhcm5pbmdzOglOb25lCisgKgorICogUmV0dXJuOiAJMCAJT2sKKyAqIAkJPDAgCUZhaWx1cmU6IEludGVyZmFjZSB3aWxsIG5vdCBleGl0IHByb3Blcmx5LgorICovCitzdGF0aWMgaW50IGlmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJeDI1X2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzZGxhX3QqIGNhcmQgPSBjaGFuLT5jYXJkOworCXVuc2lnbmVkIGxvbmcgc21wX2ZsYWdzOworCQorCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmICgoY2hhbi0+Y29tbW9uLnN0YXRlID09IFdBTl9DT05ORUNURUQpIHx8IAorCSAgICAoY2hhbi0+Y29tbW9uLnN0YXRlID09IFdBTl9DT05ORUNUSU5HKSl7CisJCVM1MDhfUzUxNF9sb2NrKGNhcmQsICZzbXBfZmxhZ3MpOworCQljaGFuX2Rpc2MoZGV2KTsKKwkJUzUwOF9TNTE0X3VubG9jayhjYXJkLCAmc21wX2ZsYWdzKTsKKwl9CisKKwl3YW5waXBlX2Nsb3NlKGNhcmQpOworCisJUzUwOF9TNTE0X2xvY2soY2FyZCwgJnNtcF9mbGFncyk7CisJaWYgKGNoYW4tPmJoX2hlYWQpeworCQlpbnQgaTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkKKwkJZm9yIChpPTA7IGk8KE1BWF9CSF9CVUZGKzEpOyBpKyspeworCQkJc2tiID0gKChiaF9kYXRhX3QgKikmY2hhbi0+YmhfaGVhZFtpXSktPnNrYjsKKwkJCWlmIChza2IgIT0gTlVMTCl7CisgICAgICAgICAgICAgICAgCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJfQorCQl9CisJCWtmcmVlKGNoYW4tPmJoX2hlYWQpOworCQljaGFuLT5iaF9oZWFkPU5VTEw7CisJfQorCVM1MDhfUzUxNF91bmxvY2soY2FyZCwgJnNtcF9mbGFncyk7CisKKwkvKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGNsb3NlLCBkaXNjb25uZWN0IHBoeXNpY2FsIGxpbmsgKi8KKwlpZiAoIWNhcmQtPm9wZW5fY250KXsKKwkJUzUwOF9TNTE0X2xvY2soY2FyZCwgJnNtcF9mbGFncyk7CisJCWRpc2Nvbm5lY3QoY2FyZCk7CisJCXgyNV9zZXRfaW50cl9tb2RlKGNhcmQsIDApOworCQlTNTA4X1M1MTRfdW5sb2NrKGNhcmQsICZzbXBfZmxhZ3MpOworCX0KKwkKKwkvKiBEZWNyZW1lbnQgdGhlIG51bWJlciBvZiBpbnRlcmZhY2VzICovCisJLS1jYXJkLT51Lngubm9fZGV2OworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlCdWlsZCBtZWRpYSBoZWFkZXIuCisgKiAJbyBlbmNhcHN1bGF0ZSBwYWNrZXQgYWNjb3JkaW5nIHRvIGVuY2Fwc3VsYXRpb24gdHlwZS4KKyAqCisgKiAJVGhlIHRyaWNrIGhlcmUgaXMgdG8gcHV0IHBhY2tldCB0eXBlIChFdGhlcnR5cGUpIGludG8gJ3Byb3RvY29sJyAKKyAqICAgICAgZmllbGQgb2YgdGhlIHNvY2tldCBidWZmZXIsIHNvIHRoYXQgd2UgZG9uJ3QgZm9yZ2V0IGl0LiAgCisgKiAgICAgIElmIGVuY2Fwc3VsYXRpb24gZmFpbHMsIHNldCBza2ItPnByb3RvY29sIHRvIDAgYW5kIGRpc2NhcmQgCisgKiAgICAgIHBhY2tldCBsYXRlci4KKyAqCisgKiAJUmV0dXJuOgkJbWVkaWEgaGVhZGVyIGxlbmd0aC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgaWZfaGVhZGVyKHN0cnVjdCBza19idWZmKiBza2IsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCSAgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwgdm9pZCogZGFkZHIsIHZvaWQqIHNhZGRyLAorCQkgICAgIHVuc2lnbmVkIGxlbikKK3sKKwl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCWludCBoZHJfbGVuID0gZGV2LT5oYXJkX2hlYWRlcl9sZW47CisJCisJc2tiLT5wcm90b2NvbCA9IGh0b25zKHR5cGUpOworCWlmICghY2hhbi0+cHJvdG9jb2wpeworCQloZHJfbGVuID0gd2Fucm91dGVyX2VuY2Fwc3VsYXRlKHNrYiwgZGV2LCB0eXBlKTsKKwkJaWYgKGhkcl9sZW4gPCAwKXsKKwkJCWhkcl9sZW4gPSAwOworCQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKDApOworCQl9CisJfQorCXJldHVybiBoZHJfbGVuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCVJlLWJ1aWxkIG1lZGlhIGhlYWRlci4KKyAqCisgKiAJUmV0dXJuOgkJMQlwaHlzaWNhbCBhZGRyZXNzIHJlc29sdmVkLgorICoJCQkwCXBoeXNpY2FsIGFkZHJlc3Mgbm90IHJlc29sdmVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBpZl9yZWJ1aWxkX2hkciAoc3RydWN0IHNrX2J1ZmYqIHNrYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7IAorCXgyNV9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90KiBjYXJkID0gY2hhbi0+Y2FyZDsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiByZWJ1aWxkX2hlYWRlcigpIGNhbGxlZCBmb3IgaW50ZXJmYWNlICVzIVxuIiwKKwkJY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lKTsKKwlyZXR1cm4gMTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEhhbmRsZSB0cmFuc21pdCB0aW1lb3V0IGV2ZW50IGZyb20gbmV0aWYgd2F0Y2hkb2cKKyAqLworc3RhdGljIHZvaWQgaWZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIAl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCAqY2FyZCA9IGNoYW4tPmNhcmQ7CisKKwkvKiBJZiBvdXIgZGV2aWNlIHN0YXlzIGJ1c3kgZm9yIGF0IGxlYXN0IDUgc2Vjb25kcyB0aGVuIHdlIHdpbGwKKwkgKiBraWNrIHN0YXJ0IHRoZSBkZXZpY2UgYnkgbWFraW5nIGRldi0+dGJ1c3kgPSAwLiAgV2UgZXhwZWN0CisJICogdGhhdCBvdXIgZGV2aWNlIG5ldmVyIHN0YXlzIGJ1c3kgbW9yZSB0aGFuIDUgc2Vjb25kcy4gU28gdGhpcyAgICAgICAgICAgICAgICAgCisJICogaXMgb25seSB1c2VkIGFzIGEgbGFzdCByZXNvcnQuCisJICovCisKKwkrK2NoYW4tPmlmX3NlbmRfc3RhdC5pZl9zZW5kX3RidXN5X3RpbWVvdXQ7CisJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBUcmFuc21pdCB0aW1lZCBvdXQgb24gJXNcbiIsIAorCQkJY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lKTsKKwluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCVNlbmQgYSBwYWNrZXQgb24gYSBuZXR3b3JrIGludGVyZmFjZS4KKyAqIAlvIHNldCB0YnVzeSBmbGFnIChtYXJrcyBzdGFydCBvZiB0aGUgdHJhbnNtaXNzaW9uKS4KKyAqIAlvIGNoZWNrIGxpbmsgc3RhdGUuIElmIGxpbmsgaXMgbm90IHVwLCB0aGVuIGRyb3AgdGhlIHBhY2tldC4KKyAqIAlvIGNoZWNrIGNoYW5uZWwgc3RhdHVzLiBJZiBpdCdzIGRvd24gdGhlbiBpbml0aWF0ZSBhIGNhbGwuCisgKiAJbyBwYXNzIGEgcGFja2V0IHRvIGNvcnJlc3BvbmRpbmcgV0FOIGRldmljZS4KKyAqIAlvIGZyZWUgc29ja2V0IGJ1ZmZlcgorICoKKyAqIAlSZXR1cm46CTAJY29tcGxldGUgKHNvY2tldCBidWZmZXIgbXVzdCBiZSBmcmVlZCkKKyAqCQlub24tMAlwYWNrZXQgbWF5IGJlIHJlLXRyYW5zbWl0dGVkICh0YnVzeSBtdXN0IGJlIHNldCkKKyAqCisgKiAJTm90ZXM6CisgKiAJMS4gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBlaXRoZXIgYnkgdGhlIHByb3RvY29sIHN0YWNrIG9yIGJ5IHRoZSAibmV0CisgKiAgICAJYm90dG9tIGhhbGYiICh3aXRoIGludGVycnVwdHMgZW5hYmxlZCkuCisgKiAJMi4gU2V0dGluZyB0YnVzeSBmbGFnIHdpbGwgaW5oaWJpdCBmdXJ0aGVyIHRyYW5zbWl0IHJlcXVlc3RzIGZyb20gdGhlCisgKiAgICAJcHJvdG9jb2wgc3RhY2sgYW5kIGNhbiBiZSB1c2VkIGZvciBmbG93IGNvbnRyb2wgd2l0aCBwcm90b2NvbCBsYXllci4KKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgaWZfc2VuZChzdHJ1Y3Qgc2tfYnVmZiogc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXgyNV9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90KiBjYXJkID0gY2hhbi0+Y2FyZDsKKwlUWDI1U3RhdHVzKiBzdGF0dXMgPSBjYXJkLT5mbGFnczsKKwlpbnQgdWRwX3R5cGU7CisJdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M9MDsKKworCSsrY2hhbi0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfZW50cnk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBObyBuZWVkIHRvIGNoZWNrIGZyYW1lIGxlbmd0aCwgc2luY2Ugc29ja2V0IGNvZGUKKyAgICAgICAgICogd2lsbCBwZXJmb3JtIHRoZSBjaGVjayBmb3IgdXMgKi8KKworCWNoYW4tPnRpY2tfY291bnRlciA9IGppZmZpZXM7CisJCisJLyogQ3JpdGljYWwgcmVnaW9uIHN0YXJ0cyBoZXJlICovCisJUzUwOF9TNTE0X2xvY2soY2FyZCwgJnNtcF9mbGFncyk7CisJCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoU0VORF9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCkpeworCQlwcmludGsoS0VSTl9JTkZPICJIaXQgY3JpdGljYWwgaW4gaWZfc2VuZCgpISAlbHhcbiIsY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkJZ290byBpZl9zZW5kX2NyaXRfZXhpdDsKKwl9CisJCisJdWRwX3R5cGUgPSB1ZHBfcGt0X3R5cGUoc2tiLCBjYXJkKTsKKworICAgICAgICBpZih1ZHBfdHlwZSAhPSBVRFBfSU5WQUxJRF9UWVBFKSB7CisKKyAgICAgICAgICAgICAgICBpZihzdG9yZV91ZHBfbWdtdF9wa3QodWRwX3R5cGUsIFVEUF9QS1RfRlJNX1NUQUNLLCBjYXJkLCBkZXYsIHNrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW4tPmNvbW1vbi5sY24pKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy0+aW1hc2sgfD0gSU5UUl9PTl9USU1FUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1ZHBfdHlwZSA9PSBVRFBfWFBJUEVfVFlQRSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW4tPmlmX3NlbmRfc3RhdC5pZl9zZW5kX1BJUEVfcmVxdWVzdCsrOworCQkJfQorICAgICAgICAgICAgICAgCX0KKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJY2xlYXJfYml0KFNFTkRfQ1JJVCwodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJCVM1MDhfUzUxNF91bmxvY2soY2FyZCwgJnNtcF9mbGFncyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChjaGFuLT50cmFuc21pdF9sZW5ndGgpeworCQkvL0ZJWE1FOiBUaGlzIGNoZWNrIGRvZXNuJ3QgbWFrZSBzZW5zZSBhbnkgbW9yZQorCQlpZiAoY2hhbi0+Y29tbW9uLnN0YXRlICE9IFdBTl9DT05ORUNURUQpeworCQkJY2hhbi0+dHJhbnNtaXRfbGVuZ3RoPTA7CisJCQlhdG9taWNfc2V0KCZjaGFuLT5jb21tb24uZHJpdmVyX2J1c3ksMCk7CisJCX1lbHNleworCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQkJKytjYXJkLT51LngudHhfaW50ZXJydXB0c19wZW5kaW5nOworCQkgICAgICAgIHN0YXR1cy0+aW1hc2sgfD0gSU5UUl9PTl9UWF9GUkFNRTsKKwkJCWNsZWFyX2JpdChTRU5EX0NSSVQsKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpOworCQkJUzUwOF9TNTE0X3VubG9jayhjYXJkLCAmc21wX2ZsYWdzKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJaWYgKGNhcmQtPndhbmRldi5zdGF0ZSAhPSBXQU5fQ09OTkVDVEVEKXsKKwkJKytjaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQ7CisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCSsrY2hhbi0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfd2FuX2Rpc2Nvbm5lY3RlZDsJCisJCQorCX1lbHNlIGlmICggY2hhbi0+cHJvdG9jb2wgJiYgKGNoYW4tPnByb3RvY29sICE9IHNrYi0+cHJvdG9jb2wpKXsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIiVzOiB1bnN1cHBvcnRlZCBFdGhlcnR5cGUgMHglMDRYIG9uIGludGVyZmFjZSAlcyFcbiIsCisJCQljaGFuLT5uYW1lLCBodG9ucyhza2ItPnByb3RvY29sKSwgZGV2LT5uYW1lKTsKKwkJCisJCXByaW50ayhLRVJOX0lORk8gIlBST1RPICVYbiIsIGh0b25zKGNoYW4tPnByb3RvY29sKSk7CisJCSsrY2hhbi0+aWZzdGF0cy50eF9lcnJvcnM7CisJCSsrY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkOworCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQkrK2NoYW4tPmlmX3NlbmRfc3RhdC5pZl9zZW5kX3Byb3RvY29sX2Vycm9yOworCQkKKwl9ZWxzZSBzd2l0Y2ggKGNoYW4tPmNvbW1vbi5zdGF0ZSl7CisKKwkJY2FzZSBXQU5fRElTQ09OTkVDVEVEOgorCQkJLyogVHJ5IHRvIGVzdGFibGlzaCBjb25uZWN0aW9uLiBJZiBzdWNjZWRlZCwgdGhlbiBzdGFydAorCQkJICogdHJhbnNtaXNzaW9uLCBlbHNlIGRyb3AgYSBwYWNrZXQuCisJCQkgKi8KKwkJCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSl7CisJCQkJKytjaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJCQlicmVhazsKKwkJCX1lbHNleworCQkJCWlmIChjaGFuX2Nvbm5lY3QoZGV2KSAhPSAwKXsKKwkJCQkJKytjaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJCWNhc2UgV0FOX0NPTk5FQ1RFRDoKKwkJCWlmKCBza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQWCkpIHsKKwkJCQlpZihjaGFuLT5lbmFibGVfSVBYKSB7CisJCQkJCXN3aXRjaF9uZXRfbnVtYmVycyggc2tiLT5kYXRhLCAKKwkJCQkJCWNoYW4tPm5ldHdvcmtfbnVtYmVyLCAwKTsKKwkJCQl9IGVsc2UgeworCQkJCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQkJCQkrK2NoYW4tPmlmc3RhdHMudHhfZHJvcHBlZDsKKwkJCQkJKytjaGFuLT5pZl9zZW5kX3N0YXQuaWZfc2VuZF9wcm90b2NvbF9lcnJvcjsKKwkJCQkJZ290byBpZl9zZW5kX2NyaXRfZXhpdDsKKwkJCQl9CisJCQl9CisJCQkvKiBXZSBuZXZlciBkcm9wIGhlcmUsIGlmIGNhbm5vdCBzZW5kIHRoYW4sIGNvcHkKKwkgICAgICAgICAgICAgICAgICogYSBwYWNrZXQgaW50byBhIHRyYW5zbWl0IGJ1ZmZlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQkJY2hhbl9zZW5kKGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwgMCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJKytjaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQ7CQorCQkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJCWJyZWFrOworCX0KKworCitpZl9zZW5kX2NyaXRfZXhpdDoKKwkKKyAgICAgICAJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJY2xlYXJfYml0KFNFTkRfQ1JJVCwodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJUzUwOF9TNTE0X3VubG9jayhjYXJkLCAmc21wX2ZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXR1cCBzbyB0aGF0IGEgZnJhbWUgY2FuIGJlIHRyYW5zbWl0dGVkIG9uIHRoZSBvY2N1cnJlbmNlIG9mIGEgdHJhbnNtaXQKKyAqIGludGVycnVwdC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgc2V0dXBfZm9yX2RlbGF5ZWRfdHJhbnNtaXQoc3RydWN0IG5ldF9kZXZpY2UqIGRldiwgdm9pZCogYnVmLAorCQkJCSAgICAgICB1bnNpZ25lZCBsZW4pCit7CisgICAgICAgIHgyNV9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisgICAgICAgIHNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisJVFgyNVN0YXR1cyogc3RhdHVzID0gY2FyZC0+ZmxhZ3M7CisKKwkrK2NoYW4tPmlmX3NlbmRfc3RhdC5pZl9zZW5kX2FkcHRyX2JmcnNfZnVsbDsKKworICAgICAgICBpZihjaGFuLT50cmFuc21pdF9sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogRXJyb3IsIHRyYW5zbWl0IGxlbmd0aCBzZXQgaW4gZGVsYXllZCB0cmFuc21pdCFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKwlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpeworCQlpZiAobGVuID4gWDI1X0NIQU5fTVRVK3NpemVvZih4MjVhcGlfaGRyX3QpKSB7CisJCQkrK2NoYW4tPmlmc3RhdHMudHhfZHJvcHBlZDsJCisJCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExlbmd0aCBpcyB0b28gYmlnIGZvciBkZWxheWVkIHRyYW5zbWl0XG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcmV0dXJuOworCQl9CisJfWVsc2V7CisJCWlmIChsZW4gPiBYMjVfTUFYX0RBVEEpIHsKKwkJCSsrY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkOwkKKwkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogTGVuZ3RoIGlzIHRvbyBiaWcgZm9yIGRlbGF5ZWQgdHJhbnNtaXRcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKyAgICAgICAgY2hhbi0+dHJhbnNtaXRfbGVuZ3RoID0gbGVuOworCWF0b21pY19zZXQoJmNoYW4tPmNvbW1vbi5kcml2ZXJfYnVzeSwxKTsKKyAgICAgICAgbWVtY3B5KGNoYW4tPnRyYW5zbWl0X2J1ZmZlciwgYnVmLCBsZW4pOworCisJKytjaGFuLT5pZl9zZW5kX3N0YXQuaWZfc2VuZF90eF9pbnRfZW5hYmxlZDsKKworCS8qIEVuYWJsZSBUcmFuc21pdCBJbnRlcnJ1cHQgKi8KKwkrK2NhcmQtPnUueC50eF9pbnRlcnJ1cHRzX3BlbmRpbmc7CisgICAgICAgIHN0YXR1cy0+aW1hc2sgfD0gSU5UUl9PTl9UWF9GUkFNRTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogbmV0X2RldmljZV9zdGF0cworICoKKyAqIAlHZXQgZXRoZXJuZXQtc3R5bGUgaW50ZXJmYWNlIHN0YXRpc3RpY3MuCisgKiAJUmV0dXJuIGEgcG9pbnRlciB0byBzdHJ1Y3QgZW5ldF9zdGF0aXN0aWNzLgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppZl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXgyNV9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CisKKwlpZihjaGFuID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZjaGFuLT5pZnN0YXRzOworfQorCisKKy8qCisgKglJbnRlcnJ1cHQgSGFuZGxlcnMgCisgKi8KKworLyoKKyAqIFguMjUgSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZS4KKyAqLworCitzdGF0aWMgdm9pZCB3cHhfaXNyIChzZGxhX3QqIGNhcmQpCit7CisJVFgyNVN0YXR1cyogc3RhdHVzID0gY2FyZC0+ZmxhZ3M7CisKKwljYXJkLT5pbl9pc3IgPSAxOworCSsrY2FyZC0+c3RhdGlzdGljcy5pc3JfZW50cnk7CisKKwlpZiAodGVzdF9iaXQoUEVSSV9DUklULCh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSl7CisJCWNhcmQtPmluX2lzcj0wOworCQlzdGF0dXMtPmlmbGFncyA9IDA7CisJCXJldHVybjsKKwl9CisJCisJaWYgKHRlc3RfYml0KFNFTkRfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKworIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHdweF9pc3I6IHdhbmRldi5jcml0aWNhbCBzZXQgdG8gMHglMDJseCwgaW50IHR5cGUgPSAweCUwMnhcbiIsIAorCQkJY2FyZC0+ZGV2bmFtZSwgY2FyZC0+d2FuZGV2LmNyaXRpY2FsLCBzdGF0dXMtPmlmbGFncyk7CisJCWNhcmQtPmluX2lzciA9IDA7CisJCXN0YXR1cy0+aWZsYWdzID0gMDsKKwkJcmV0dXJuOworCX0KKworCS8qIEZvciBhbGwgaW50ZXJydXB0cyBzZXQgdGhlIGNyaXRpY2FsIGZsYWcgdG8gQ1JJVElDQUxfUlhfSU5UUi4KKyAgICAgICAgICogSWYgdGhlIGlmX3NlbmQgcm91dGluZSBpcyBjYWxsZWQgd2l0aCB0aGlzIGZsYWcgc2V0IGl0IHdpbGwgc2V0CisgICAgICAgICAqIHRoZSBlbmFibGUgdHJhbnNtaXQgZmxhZyB0byAxLiAoZm9yIGEgZGVsYXllZCBpbnRlcnJ1cHQpCisgICAgICAgICAqLworCXN3aXRjaCAoc3RhdHVzLT5pZmxhZ3MpeworCisJCWNhc2UgUlhfSU5UUl9QRU5ESU5HOgkJLyogcmVjZWl2ZSBpbnRlcnJ1cHQgKi8KKwkJCXJ4X2ludHIoY2FyZCk7CisJCQlicmVhazsKKworCQljYXNlIFRYX0lOVFJfUEVORElORzoJCS8qIHRyYW5zbWl0IGludGVycnVwdCAqLworCQkJdHhfaW50cihjYXJkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTU9ERU1fSU5UUl9QRU5ESU5HOgkvKiBtb2RlbSBzdGF0dXMgaW50ZXJydXB0ICovCisJCQlzdGF0dXNfaW50cihjYXJkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgWDI1X0FTWV9UUkFOU19JTlRSX1BFTkRJTkc6CS8qIG5ldHdvcmsgZXZlbnQgaW50ZXJydXB0ICovCisJCQlldmVudF9pbnRyKGNhcmQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBUSU1FUl9JTlRSX1BFTkRJTkc6CisJCQl0aW1lcl9pbnRyKGNhcmQpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoJCS8qIHVud2FudGVkIGludGVycnVwdCAqLworCQkJc3B1cl9pbnRyKGNhcmQpOworCX0KKworCWNhcmQtPmluX2lzciA9IDA7CisJc3RhdHVzLT5pZmxhZ3MgPSAwOwkvKiBjbGVhciBpbnRlcnJ1cHQgY29uZGl0aW9uICovCit9CisKKy8qCisgKiAJUmVjZWl2ZSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqIAlUaGlzIHJvdXRpbmUgaGFuZGxlcyBmcmFnbWVudGVkIElQIHBhY2tldHMgdXNpbmcgTS1iaXQgYWNjb3JkaW5nIHRvIHRoZQorICogCVJGQzEzNTYuCisgKiAJbyBtYXAgbGlnaWNhbCBjaGFubmVsIG51bWJlciB0byBuZXR3b3JrIGludGVyZmFjZS4KKyAqIAlvIGFsbG9jYXRlIHNvY2tldCBidWZmZXIgb3IgYXBwZW5kIHJlY2VpdmVkIHBhY2tldCB0byB0aGUgZXhpc3Rpbmcgb25lLgorICogCW8gaWYgTS1iaXQgaXMgcmVzZXQgKGkuZS4gaXQncyB0aGUgbGFzdCBwYWNrZXQgaW4gYSBzZXF1ZW5jZSkgdGhlbiAKKyAqICAgCWRlY2Fwc3VsYXRlIHBhY2tldCBhbmQgcGFzcyBzb2NrZXQgYnVmZmVyIHRvIHRoZSBwcm90b2NvbCBzdGFjay4KKyAqCisgKiAJTm90ZXM6CisgKiAJMS4gV2hlbiBhbGxvY2F0aW5nIGEgc29ja2V0IGJ1ZmZlciwgaWYgTS1iaXQgaXMgc2V0IHRoZW4gbW9yZSBkYXRhIGlzCisgKiAgICAJY29taW5nIGFuZCB3ZSBoYXZlIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgdGhlIG1heGltdW0gSVAgcGFja2V0IHNpemUKKyAqICAgIAlleHBlY3RlZCBvbiB0aGlzIGNoYW5uZWwuCisgKiAJMi4gSWYgc29tZXRoaW5nIGdvZXMgd3JvbmcgYW5kIFguMjUgcGFja2V0IGhhcyB0byBiZSBkcm9wcGVkIChlLmcuIG5vCisgKiAgICAJc29ja2V0IGJ1ZmZlcnMgYXZhaWxhYmxlKSB0aGUgd2hvbGUgcGFja2V0IHNlcXVlbmNlIG11c3QgYmUgZGlzY2FyZGVkLgorICovCisKK3N0YXRpYyB2b2lkIHJ4X2ludHIgKHNkbGFfdCogY2FyZCkKK3sKKwlUWDI1TWJveCogcnhtYiA9IGNhcmQtPnJ4bWI7CisJdW5zaWduZWQgbGNuID0gcnhtYi0+Y21kLmxjbjsKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2ID0gZmluZF9jaGFubmVsKGNhcmQsbGNuKTsKKwl4MjVfY2hhbm5lbF90KiBjaGFuOworCXN0cnVjdCBza19idWZmKiBza2I9TlVMTDsKKworCWlmIChkZXYgPT0gTlVMTCl7CisJCS8qIEludmFsaWQgY2hhbm5lbCwgZGlzY2FyZCBwYWNrZXQgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlY2VpdmluZyBvbiBvcnBoYW5lZCBMQ04gJWQhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgbGNuKTsKKwkJcmV0dXJuOworCX0KKworCWNoYW4gPSBkZXYtPnByaXY7CisJY2hhbi0+aV90aW1lb3V0X3NvZmFyID0gamlmZmllczsKKworCisJLyogQ29weSB0aGUgZGF0YSBmcm9tIHRoZSBib2FyZCwgaW50byBhbgorICAgICAgICAgKiBza2IgYnVmZmVyIAorCSAqLworCWlmICh3YW5waXBlX3B1bGxfZGF0YV9pbl9za2IoY2FyZCxkZXYsJnNrYikpeworCQkrK2NoYW4tPmlmc3RhdHMucnhfZHJvcHBlZDsKKwkJKytjYXJkLT53YW5kZXYuc3RhdHMucnhfZHJvcHBlZDsKKwkJKytjaGFuLT5yeF9pbnRyX3N0YXQucnhfaW50cl9ub19zb2NrZXQ7CisJCSsrY2hhbi0+cnhfaW50cl9zdGF0LnJ4X2ludHJfYmZyX25vdF9wYXNzZWRfdG9fc3RhY2s7CisJCXJldHVybjsKKwl9CisKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwkJLyogdGltZXN0YW1wICovCisKKworCS8qIC0tLS0tLS0tLS0tLSBBUEkgLS0tLS0tLS0tLS0tLS0tLSovCisKKwlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpeworCisJCWlmIChiaF9lbnF1ZXVlKGRldiwgc2tiKSl7CisJCQkrK2NoYW4tPmlmc3RhdHMucnhfZHJvcHBlZDsKKwkJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCQkrK2NoYW4tPnJ4X2ludHJfc3RhdC5yeF9pbnRyX2Jmcl9ub3RfcGFzc2VkX3RvX3N0YWNrOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCXJldHVybjsKKwkJfQkJCisKKwkJKytjaGFuLT5pZnN0YXRzLnJ4X3BhY2tldHM7CisJCWNoYW4tPmlmc3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQorCisJCWNoYW4tPnJ4X3NrYiA9IE5VTEw7CisJCWlmICghdGVzdF9hbmRfc2V0X2JpdCgwLCAmY2hhbi0+dHFfd29ya2luZykpeworCQkJd2FucGlwZV9xdWV1ZV93b3JrKCZjaGFuLT5jb21tb24ud2FucGlwZV93b3JrKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisKKwkvKiAtLS0tLS0tLS0tLS0tIFdBTlBJUEUgLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJCisJLyogc2V0IHJ4X3NrYiB0byBOVUxMIHNvIHdlIHdvbid0IGFjY2VzcyBpdCBsYXRlciB3aGVuIGtlcm5lbCBhbHJlYWR5IG93bnMgaXQgKi8KKwljaGFuLT5yeF9za2I9TlVMTDsKKwkKKwkvKiBEZWNhcHN1bGF0ZSBwYWNrZXQsIGlmIG5lY2Vzc2FyeSAqLworCWlmICghc2tiLT5wcm90b2NvbCAmJiAhd2Fucm91dGVyX3R5cGVfdHJhbnMoc2tiLCBkZXYpKXsKKwkJLyogY2FuJ3QgZGVjYXBzdWxhdGUgcGFja2V0ICovCisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJKytjaGFuLT5pZnN0YXRzLnJ4X2Vycm9yczsKKwkJKytjaGFuLT5pZnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCSsrY2hhbi0+cnhfaW50cl9zdGF0LnJ4X2ludHJfYmZyX25vdF9wYXNzZWRfdG9fc3RhY2s7CisKKwl9ZWxzZXsKKwkJaWYoIGhhbmRsZV9JUFhXQU4oc2tiLT5kYXRhLCBjaGFuLT5uYW1lLCAKKwkJCQkgIGNoYW4tPmVuYWJsZV9JUFgsIGNoYW4tPm5ldHdvcmtfbnVtYmVyLCAKKwkJCQkgIHNrYi0+cHJvdG9jb2wpKXsKKworCQkJaWYoIGNoYW4tPmVuYWJsZV9JUFggKXsKKwkJCQlpZihjaGFuX3NlbmQoZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLDApKXsKKwkJCQkJY2hhbi0+dHhfc2tiID0gc2tiOworCQkJCX1lbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQkJCSsrY2hhbi0+cnhfaW50cl9zdGF0LnJ4X2ludHJfYmZyX25vdF9wYXNzZWRfdG9fc3RhY2s7CisJCQkJfQorCQkJfWVsc2V7CisJCQkJLyogaW5jcmVtZW50IElQWCBwYWNrZXQgZHJvcHBlZCBzdGF0aXN0aWMgKi8KKwkJCQkrK2NoYW4tPmlmc3RhdHMucnhfZHJvcHBlZDsKKwkJCQkrK2NoYW4tPnJ4X2ludHJfc3RhdC5yeF9pbnRyX2Jmcl9ub3RfcGFzc2VkX3RvX3N0YWNrOworCQkJfQorCQl9ZWxzZXsKKwkJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJCWNoYW4tPmlmc3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQkrK2NoYW4tPmlmc3RhdHMucnhfcGFja2V0czsKKwkJCSsrY2hhbi0+cnhfaW50cl9zdGF0LnJ4X2ludHJfYmZyX3Bhc3NlZF90b19zdGFjazsKKwkJCW5ldGlmX3J4KHNrYik7CisJCX0KKwl9CisJCisJcmV0dXJuOworfQorCisKK3N0YXRpYyBpbnQgd2FucGlwZV9wdWxsX2RhdGFfaW5fc2tiKHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKipza2IpCit7CisJdm9pZCAqYnVmcHRyOworCVRYMjVNYm94KiByeG1iID0gY2FyZC0+cnhtYjsKKwl1bnNpZ25lZCBsZW4gPSByeG1iLT5jbWQubGVuZ3RoOwkvKiBwYWNrZXQgbGVuZ3RoICovCisJdW5zaWduZWQgcWRtID0gcnhtYi0+Y21kLnFkbTsJCS8qIFEsRCBhbmQgTSBiaXRzICovCisJeDI1X2NoYW5uZWxfdCAqY2hhbiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYiA9ICpza2I7CisKKwlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBXQU5QSVBFKXsKKwkJaWYgKGNoYW4tPmRyb3Bfc2VxdWVuY2UpeworCQkJaWYgKCEocWRtICYgMHgwMSkpeyAKKwkJCQljaGFuLT5kcm9wX3NlcXVlbmNlID0gMDsKKwkJCX0KKwkJCXJldHVybiAxOworCQl9CisJCW5ld19za2IgPSBjaGFuLT5yeF9za2I7CisJfWVsc2V7CisJCS8qIEFkZCBvbiB0aGUgQVBJIGhlYWRlciB0byB0aGUgcmVjZWl2ZWQKKyAgICAgICAgICAgICAgICAgKiBkYXRhIAorCQkgKi8KKwkJbGVuICs9IHNpemVvZih4MjVhcGlfaGRyX3QpOworCX0KKworCWlmIChuZXdfc2tiID09IE5VTEwpeworCQlpbnQgYnVmc2l6ZTsKKworCQlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBXQU5QSVBFKXsKKwkJCWJ1ZnNpemUgPSAocWRtICYgMHgwMSkgPyBkZXYtPm10dSA6IGxlbjsKKwkJfWVsc2V7CisJCQlidWZzaXplID0gbGVuOworCQl9CisKKwkJLyogQWxsb2NhdGUgbmV3IHNvY2tldCBidWZmZXIgKi8KKwkJbmV3X3NrYiA9IGRldl9hbGxvY19za2IoYnVmc2l6ZSArIGRldi0+aGFyZF9oZWFkZXJfbGVuKTsKKwkJaWYgKG5ld19za2IgPT0gTlVMTCl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogbm8gc29ja2V0IGJ1ZmZlcnMgYXZhaWxhYmxlIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCWNoYW4tPmRyb3Bfc2VxdWVuY2UgPSAxOwkvKiBzZXQgZmxhZyAqLworCQkJKytjaGFuLT5pZnN0YXRzLnJ4X2Ryb3BwZWQ7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCWlmIChza2JfdGFpbHJvb20obmV3X3NrYikgPCBsZW4peworCQkvKiBObyByb29tIGZvciB0aGUgcGFja2V0LiBDYWxsIG9mZiB0aGUgd2hvbGUgdGhpbmchICovCisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkobmV3X3NrYik7CisJCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IFdBTlBJUEUpeworCQkJY2hhbi0+cnhfc2tiID0gTlVMTDsKKwkJCWlmIChxZG0gJiAweDAxKXsgCisJCQkJY2hhbi0+ZHJvcF9zZXF1ZW5jZSA9IDE7CisJCQl9CisJCX0KKworCQlwcmludGsoS0VSTl9JTkZPICIlczogdW5leHBlY3RlZGx5IGxvbmcgcGFja2V0IHNlcXVlbmNlICIKKwkJCSJvbiBpbnRlcmZhY2UgJXMhXG4iLCBjYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUpOworCQkrK2NoYW4tPmlmc3RhdHMucnhfbGVuZ3RoX2Vycm9yczsKKwkJcmV0dXJuIDE7CisJfQorCisJYnVmcHRyID0gc2tiX3B1dChuZXdfc2tiLGxlbik7CisKKworCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSl7CisJCS8qIEZpbGwgaW4gdGhlIHgyNWFwaSBoZWFkZXIgCisJCSAqLworCQl4MjVhcGlfdCAqIGFwaV9kYXRhID0gKHgyNWFwaV90KilidWZwdHI7CisJCWFwaV9kYXRhLT5oZHIucWRtID0gcnhtYi0+Y21kLnFkbTsKKwkJYXBpX2RhdGEtPmhkci5jYXVzZSA9IHJ4bWItPmNtZC5jYXVzZTsKKwkJYXBpX2RhdGEtPmhkci5kaWFnbiA9IHJ4bWItPmNtZC5kaWFnbjsKKwkJYXBpX2RhdGEtPmhkci5sZW5ndGggPSByeG1iLT5jbWQubGVuZ3RoOworCQltZW1jcHkoYXBpX2RhdGEtPmRhdGEsIHJ4bWItPmRhdGEsIHJ4bWItPmNtZC5sZW5ndGgpOworCX1lbHNleworCQltZW1jcHkoYnVmcHRyLCByeG1iLT5kYXRhLCBsZW4pOworCX0KKworCW5ld19za2ItPmRldiA9IGRldjsKKworCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSl7CisJCW5ld19za2ItPm1hYy5yYXcgPSBuZXdfc2tiLT5kYXRhOworCQluZXdfc2tiLT5wcm90b2NvbCA9IGh0b25zKFgyNV9QUk9UKTsKKwkJbmV3X3NrYi0+cGt0X3R5cGUgPSBXQU5fUEFDS0VUX0RBVEE7CisJfWVsc2V7CisJCW5ld19za2ItPnByb3RvY29sID0gY2hhbi0+cHJvdG9jb2w7CisJCWNoYW4tPnJ4X3NrYiA9IG5ld19za2I7CisJfQorCisJLyogSWYgcWRtIGJpdCBpcyBzZXQsIG1vcmUgZGF0YSBpcyBjb21pbmcgCisgICAgICAgICAqIHRodXMsIGV4aXQgYW5kIHdhaXQgZm9yIG1vcmUgZGF0YSBiZWZvcmUKKyAgICAgICAgICogc2VuZGluZyB0aGUgcGFja2V0IHVwLiAoVXNlZCBieSByb3V0ZXIgb25seSkgCisJICovCisJaWYgKChxZG0gJiAweDAxKSAmJiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBXQU5QSVBFKSkgCisJCXJldHVybiAxOwkKKworCSpza2IgPSBuZXdfc2tiOyAKKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogdHhfaW50cgorICogIAorICogCVRyYW5zbWl0IGludGVycnVwdCBoYW5kbGVyLgorICoJRm9yIGVhY2ggZGV2LCBjaGVjayB0aGF0IHRoZXJlIGlzIHNvbWV0aGluZyB0byBzZW5kLgorICoJSWYgZGF0YSBhdmFpbGFibGUsIHRyYW5zbWl0LiAJCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCB0eF9pbnRyIChzZGxhX3QqIGNhcmQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlUWDI1U3RhdHVzKiBzdGF0dXMgPSBjYXJkLT5mbGFnczsKKwl1bnNpZ25lZCBjaGFyIG1vcmVfdG9fdHg9MDsKKwl4MjVfY2hhbm5lbF90ICpjaGFuPU5VTEw7CisJaW50IGk9MDsJCisKKwlpZiAoY2FyZC0+dS54LnR4X2RldiA9PSBOVUxMKXsKKwkJY2FyZC0+dS54LnR4X2RldiA9IGNhcmQtPndhbmRldi5kZXY7CisJfQorCisJZGV2ID0gY2FyZC0+dS54LnR4X2RldjsKKworCWZvciAoOzspeworCisJCWNoYW4gPSBkZXYtPnByaXY7CisJCWlmIChjaGFuLT50cmFuc21pdF9sZW5ndGgpeworCQkJLyogRGV2aWNlIHdhcyBzZXQgdG8gdHJhbnNtaXQsIGNoZWNrIGlmIHRoZSBUWAorICAgICAgICAgICAgICAgICAgICAgICAgICogYnVmZmVycyBhcmUgYXZhaWxhYmxlIAorCQkJICovCQkKKwkJCWlmIChjaGFuLT5jb21tb24uc3RhdGUgIT0gV0FOX0NPTk5FQ1RFRCl7CisJCQkJY2hhbi0+dHJhbnNtaXRfbGVuZ3RoID0gMDsKKwkJCQlhdG9taWNfc2V0KCZjaGFuLT5jb21tb24uZHJpdmVyX2J1c3ksMCk7CisJCQkJY2hhbi0+dHhfb2Zmc2V0PTA7CisJCQkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSl7CisJCQkJCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSl7CisJCQkJCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkJCQkJd2FrZXVwX3NrX2JoKGRldik7CisJCQkJCX1lbHNleworCQkJCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQkJCQl9CisJCQkJfQorCQkJCWRldiA9IG1vdmVfZGV2X3RvX25leHQoY2FyZCxkZXYpOworCQkJCWJyZWFrOworCQkJfQkJCQkKKworCQkJaWYgKChzdGF0dXMtPmNmbGFnc1tjaGFuLT5jaF9pZHhdICYgMHg0MCB8fCBjYXJkLT51LnguTEFQQl9oZGxjKSAmJiAKKwkJCSAgICAgKCpjYXJkLT51LnguaGRsY19idWZfc3RhdHVzICYgMHg0MCkgKXsKKwkJCQkvKiBUeCBidWZmZXIgYXZhaWxhYmxlLCB3ZSBjYW4gc2VuZCAqLworCQkJCQorCQkJCWlmICh0eF9pbnRyX3NlbmQoY2FyZCwgZGV2KSl7CisJCQkJCW1vcmVfdG9fdHg9MTsKKwkJCQl9CisKKwkJCQkvKiBJZiBtb3JlIHRoYW4gb25lIGludGVyZmFjZSBwcmVzZW50LCBtb3ZlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkZXZpY2UgcG9pbnRlciB0byB0aGUgbmV4dCBpbnRlcmZhY2UsIHNvIG9uIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbmV4dCBUWCBpbnRlcnJ1cHQgd2Ugd2lsbCB0cnkgc2VuZGluZyBmcm9tIGl0LiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJCQkJZGV2ID0gbW92ZV9kZXZfdG9fbmV4dChjYXJkLGRldik7CisJCQkJYnJlYWs7CisJCQl9ZWxzZXsKKwkJCQkvKiBUeCBidWZmZXJzIG5vdCBhdmFpbGFibGUsIGJ1dCBkZXZpY2Ugc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBUWCBpbnRlcnJ1cHQuICBTZXQgbW9yZV90b190eCBhbmQgdHJ5ICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gdHJhbnNtaXQgZm9yIG90aGVyIGRldmljZXMuCisJCQkJICovCisJCQkJbW9yZV90b190eD0xOworCQkJCWRldiA9IG1vdmVfZGV2X3RvX25leHQoY2FyZCxkZXYpOworCQkJfQorCisJCX1lbHNleworCQkJLyogVGhpcyBkZXZpY2Ugd2FzIG5vdCBzZXQgdG8gdHJhbnNtaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBnbyB0byBuZXh0IAorCQkJICovCisJCQlkZXYgPSBtb3ZlX2Rldl90b19uZXh0KGNhcmQsZGV2KTsKKwkJfQkKKworCQlpZiAoKytpID09IGNhcmQtPnUueC5ub19kZXYpeworCQkJaWYgKCFtb3JlX3RvX3R4KXsKKwkJCQlEQkdfUFJJTlRLKEtFUk5fSU5GTyAiJXM6IE5vdGhpbmcgdG8gU2VuZCBpbiBUWCBJTlRSXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwl9IC8vRW5kIG9mIEZPUgorCisJY2FyZC0+dS54LnR4X2RldiA9IGRldjsKKwkKKwlpZiAoIW1vcmVfdG9fdHgpeworCQkvKiBpZiBhbnkgb3RoZXIgaW50ZXJmYWNlcyBoYXZlIHRyYW5zbWl0IGludGVycnVwdHMgcGVuZGluZywgKi8KKwkJLyogZG8gbm90IGRpc2FibGUgdGhlIGdsb2JhbCB0cmFuc21pdCBpbnRlcnJ1cHQgKi8KKwkJaWYgKCEoLS1jYXJkLT51LngudHhfaW50ZXJydXB0c19wZW5kaW5nKSl7CisJCQlzdGF0dXMtPmltYXNrICY9IH5JTlRSX09OX1RYX0ZSQU1FOworCQl9CisJfQorCXJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIG1vdmVfZGV2X3RvX25leHQKKyAqICAKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworc3RydWN0IG5ldF9kZXZpY2UgKm1vdmVfZGV2X3RvX25leHQoc2RsYV90ICpjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmIChjYXJkLT51Lngubm9fZGV2ICE9IDEpeworCQlpZiAoISooKHN0cnVjdCBuZXRfZGV2aWNlICoqKWRldi0+cHJpdikpCisJCQlyZXR1cm4gY2FyZC0+d2FuZGV2LmRldjsKKwkJZWxzZQorCQkJcmV0dXJuICooKHN0cnVjdCBuZXRfZGV2aWNlICoqKWRldi0+cHJpdik7CisJfQorCXJldHVybiBkZXY7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgdHhfaW50cl9zZW5kCisgKiAgCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHR4X2ludHJfc2VuZChzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJeDI1X2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsgCisKKwlpZiAoY2hhbl9zZW5kIChkZXYsY2hhbi0+dHJhbnNtaXRfYnVmZmVyLGNoYW4tPnRyYW5zbWl0X2xlbmd0aCwxKSl7CisJCSAKKyAgICAgICAgICAgICAgICAvKiBQYWNrZXQgd2FzIHNwbGl0IHVwIGR1ZSB0byBpdHMgc2l6ZSwgZG8gbm90IGRpc2FibGUKKyAgICAgICAgICAgICAgICAgKiB0eF9pbnRyIAorICAgICAgICAgICAgICAgICAqLworCQlyZXR1cm4gMTsKKwl9CisKKwljaGFuLT50cmFuc21pdF9sZW5ndGg9MDsKKwlhdG9taWNfc2V0KCZjaGFuLT5jb21tb24uZHJpdmVyX2J1c3ksMCk7CisJY2hhbi0+dHhfb2Zmc2V0PTA7CisKKwkvKiBJZiB3ZSBhcmUgaW4gQVBJIG1vZGUsIHdha2V1cCB0aGUgCisgICAgICAgICAqIHNvY2sgQkggaGFuZGxlciwgbm90IHRoZSBORVRfQkggKi8KKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKXsKKwkJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKXsKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCQl3YWtldXBfc2tfYmgoZGV2KTsKKwkJfWVsc2V7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHRpbWVyX2ludHIKKyAqICAKKyAqIAlUaW1lciBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqCUNoZWNrIHdobyBjYWxsZWQgdGhlIHRpbWVyIGludGVycnVwdCBhbmQgcGVyZm9ybQorICogICAgICBhY3Rpb24gYWNjb3JkaW5nbHkuCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCB0aW1lcl9pbnRyIChzZGxhX3QgKmNhcmQpCit7CisJVFgyNVN0YXR1cyogc3RhdHVzID0gY2FyZC0+ZmxhZ3M7CisKKwlpZiAoY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX0NNRF9FWEVDKXsKKworCQlpZiAodGltZXJfaW50cl9jbWRfZXhlYyhjYXJkKSA9PSAwKXsKKwkJCWNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCAmPQorCQkJCX5UTVJfSU5UX0VOQUJMRURfQ01EX0VYRUM7CisJCX0KKworCX1lbHNlICBpZihjYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfVURQX1BLVCkgeworCisJCWlmICgoKmNhcmQtPnUueC5oZGxjX2J1Zl9zdGF0dXMgJiAweDQwKSAmJiAKKwkJICAgIGNhcmQtPnUueC51ZHBfdHlwZSA9PSBVRFBfWFBJUEVfVFlQRSl7CisKKyAgICAgICAgICAgICAgICAgICAgCWlmKHByb2Nlc3NfdWRwX21nbXRfcGt0KGNhcmQpKSB7CisJCSAgICAgICAgICAgICAgICBjYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgJj0gCisJCQkJCX5UTVJfSU5UX0VOQUJMRURfVURQX1BLVDsKKwkJCX0KKwkJfQorCisJfWVsc2UgaWYgKGNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9QT0xMX0FDVElWRSkgeworCisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT51LngucG9sbF9kZXZpY2U7CisJCXgyNV9jaGFubmVsX3QgKmNoYW4gPSBOVUxMOworCisJCWlmICghZGV2KXsKKwkJCWNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCAmPSB+VE1SX0lOVF9FTkFCTEVEX1BPTExfQUNUSVZFOworCQkJcmV0dXJuOworCQl9CisJCWNoYW4gPSBkZXYtPnByaXY7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogQ2xvc2luZyBkb3duIElkbGUgbGluayAlcyBvbiBMQ04gJWRcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsY2hhbi0+bmFtZSxjaGFuLT5jb21tb24ubGNuKTsgCisJCWNoYW4tPmlfdGltZW91dF9zb2ZhciA9IGppZmZpZXM7CisJCWNoYW5fZGlzYyhkZXYpOwkKKyAgICAgICAgIAljYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9QT0xMX0FDVElWRTsKKwkJY2FyZC0+dS54LnBvbGxfZGV2aWNlPU5VTEw7CisKKwl9ZWxzZSBpZiAoY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX1BPTExfQ09OTkVDVF9PTikgeworCisJCXdhbnBpcGVfc2V0X3N0YXRlKGNhcmQsIFdBTl9DT05ORUNURUQpOworCQlpZiAoY2FyZC0+dS54LkxBUEJfaGRsYyl7CisJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKwkJCXNldF9jaGFuX3N0YXRlKGRldixXQU5fQ09OTkVDVEVEKTsKKwkJCXNlbmRfZGVsYXllZF9jbWRfcmVzdWx0KGNhcmQsZGV2LGNhcmQtPm1ib3gpOwkKKwkJfQorCisJCS8qIDB4OEYgZW5hYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJCXgyNV9zZXRfaW50cl9tb2RlKGNhcmQsIElOVFJfT05fUlhfRlJBTUV8CQorCQkJCQlJTlRSX09OX1RYX0ZSQU1FfAorCQkJCQlJTlRSX09OX01PREVNX1NUQVRVU19DSEFOR0V8CisJCQkJCS8vSU5UUl9PTl9DT01NQU5EX0NPTVBMRVRFfAorCQkJCQlYMjVfQVNZX1RSQU5TX0lOVFJfUEVORElORyB8CisJCQkJCUlOVFJfT05fVElNRVIgfAorCQkJCQlESVJFQ1RfUlhfSU5UUl9VU0FHRQorCQkJCSk7IAorCisJCXN0YXR1cy0+aW1hc2sgJj0gfklOVFJfT05fVFhfRlJBTUU7CS8qIG1hc2sgVHggaW50ZXJydXB0cyAqLworCQljYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9QT0xMX0NPTk5FQ1RfT047CisKKwl9ZWxzZSBpZiAoY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX1BPTExfQ09OTkVDVF9PRkYpIHsKKworCQkvL3ByaW50ayhLRVJOX0lORk8gIlBvbGwgY29ubmVjdCwgVHVybmluZyBPRkZcbiIpOworCQlkaXNjb25uZWN0KGNhcmQpOworCQljYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9QT0xMX0NPTk5FQ1RfT0ZGOworCisJfWVsc2UgaWYgKGNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9QT0xMX0RJU0NPTk5FQ1QpIHsKKworCQkvL3ByaW50ayhLRVJOX0lORk8gIlBPbGwgZGlzY29ubmVjdCwgdHJ5aW5nIHRvIGNvbm5lY3RcbiIpOworCQljb25uZWN0KGNhcmQpOworCQljYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9QT0xMX0RJU0NPTk5FQ1Q7CisKKwl9ZWxzZSBpZiAoY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX1VQREFURSl7CisKKwkJaWYgKCpjYXJkLT51LnguaGRsY19idWZfc3RhdHVzICYgMHg0MCl7CisJCQl4MjVfZ2V0X2Vycl9zdGF0cyhjYXJkKTsKKwkJCXgyNV9nZXRfc3RhdHMoY2FyZCk7CisJCQljYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgJj0gflRNUl9JTlRfRU5BQkxFRF9VUERBVEU7CisJCX0KKwl9CisKKwlpZighY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkKXsKKwkJLy9wcmludGsoS0VSTl9JTkZPICJUdXJuaW5nIFRpbWVyIE9mZiBcbiIpOworICAgICAgICAgICAgICAgIHN0YXR1cy0+aW1hc2sgJj0gfklOVFJfT05fVElNRVI7CQorCX0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCU1vZGVtIHN0YXR1cyBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBzdGF0dXNfaW50ciAoc2RsYV90KiBjYXJkKQoreworCisJLyogQWRkZWQgdG8gYXZvaWQgTW9kZW0gc3RhdHVzIG1lc3NhZ2UgZmxvb2RpbmcgKi8KKwlzdGF0aWMgVFgyNU1vZGVtU3RhdHVzIGxhc3Rfc3RhdDsKKworCVRYMjVNYm94KiBtYm94ID0gY2FyZC0+bWJveDsKKwlUWDI1TW9kZW1TdGF0dXMgKm1vZGVtX3N0YXR1czsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXgyNV9jaGFubmVsX3QgKmNoYW47CisJaW50IGVycjsKKworCW1lbXNldCgmbWJveC0+Y21kLCAwLCBzaXplb2YoVFgyNUNtZCkpOworCW1ib3gtPmNtZC5jb21tYW5kID0gWDI1X1JFQURfTU9ERU1fU1RBVFVTOworCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyKXsgCisJCXgyNV9lcnJvcihjYXJkLCBlcnIsIFgyNV9SRUFEX01PREVNX1NUQVRVUywgMCk7CisJfWVsc2V7CisJCisJCW1vZGVtX3N0YXR1cyA9IChUWDI1TW9kZW1TdGF0dXMqKW1ib3gtPmRhdGE7CQorCQorICAgICAgICAgICAJLyogQ2hlY2sgaWYgdGhlIGxhc3Qgc3RhdHVzIHdhcyB0aGUgc2FtZQorICAgICAgICAgICAJICogaWYgaXQgd2FzLCBkbyBOT1QgcHJpbnQgbWVzc2FnZSBhZ2FpbiAqLworCQorCQlpZiAobGFzdF9zdGF0LnN0YXR1cyAhPSBtb2RlbV9zdGF0dXMtPnN0YXR1cyl7CisKKwkgICAgIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1vZGVtIFN0YXR1cyBDaGFuZ2U6IERDRD0lcywgQ1RTPSVzXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsRENEKG1vZGVtX3N0YXR1cy0+c3RhdHVzKSxDVFMobW9kZW1fc3RhdHVzLT5zdGF0dXMpKTsKKworCQkJbGFzdF9zdGF0LnN0YXR1cyA9IG1vZGVtX3N0YXR1cy0+c3RhdHVzOworCQkKKwkJCWlmIChjYXJkLT51Lngub29iX29uX21vZGVtKXsKKworCQkJCW1ib3gtPmNtZC5wa3RUeXBlID0gbWJveC0+Y21kLmNvbW1hbmQ7CisJCQkJbWJveC0+Y21kLnJlc3VsdCA9IDB4MDg7CisKKwkJCQkvKiBTZW5kIGEgT09CIHRvIGFsbCBjb25uZWN0ZWQgc29ja2V0cyAqLworCQkJCWZvciAoZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsgZGV2OworCQkJCSAgICAgZGV2ID0gKigoc3RydWN0IG5ldF9kZXZpY2UqKilkZXYtPnByaXYpKSB7CisJCQkJCWNoYW49ZGV2LT5wcml2OworCQkJCQlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpeworCQkJCQkJc2VuZF9vb2JfbXNnKGNhcmQsZGV2LG1ib3gpOwkJCQkKKwkJCQkJfQorCQkJCX0KKworCQkJCS8qIFRoZSBtb2RlbSBPT0IgbWVzc2FnZSB3aWxsIHByb2JhYmx5IGtpbGwgdGhlCisJCQkJICogdGhlIGxpbmsuIElmIHdlIGRvbid0IGNsZWFyIHRoZSBmbGFnIGhlcmUsCisJCQkJICogYSBkZWFkbG9jayBjb3VsZCBvY2N1ciAqLyAKKwkJCQlpZiAoYXRvbWljX3JlYWQoJmNhcmQtPnUueC5jb21tYW5kX2J1c3kpKXsKKwkJCQkJYXRvbWljX3NldCgmY2FyZC0+dS54LmNvbW1hbmRfYnVzeSwwKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwltZW1zZXQoJm1ib3gtPmNtZCwgMCwgc2l6ZW9mKFRYMjVDbWQpKTsKKwltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9IRExDX0xJTktfU1RBVFVTOworCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyKXsgCisJCXgyNV9lcnJvcihjYXJkLCBlcnIsIFgyNV9IRExDX0xJTktfU1RBVFVTLCAwKTsKKwl9CisKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCU5ldHdvcmsgZXZlbnQgaW50ZXJydXB0IGhhbmRsZXIuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgZXZlbnRfaW50ciAoc2RsYV90KiBjYXJkKQoreworCXgyNV9mZXRjaF9ldmVudHMoY2FyZCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlTcHVyaW91cyBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqIAlvIHByaW50IGEgd2FybmluZworICogCW8JIAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHNwdXJfaW50ciAoc2RsYV90KiBjYXJkKQoreworCXByaW50ayhLRVJOX0lORk8gIiVzOiBzcHVyaW91cyBpbnRlcnJ1cHQhXG4iLCBjYXJkLT5kZXZuYW1lKTsKK30KKworCisvKgorICoJQmFja2dyb3VuZCBQb2xsaW5nIFJvdXRpbmVzICAKKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJTWFpbiBwb2xsaW5nIHJvdXRpbmUuCisgKiAJVGhpcyByb3V0aW5lIGlzIHJlcGVhdGVkbHkgY2FsbGVkIGJ5IHRoZSBXQU5QSVBFICd0aHJlYWQnIHRvIGFsbG93IGZvcgorICogCXRpbWUtZGVwZW5kZW50IGhvdXNla2VlcGluZyB3b3JrLgorICoKKyAqIAlOb3RlczoKKyAqIAkxLiBUaGlzIHJvdXRpbmUgbWF5IGJlIGNhbGxlZCBvbiBpbnRlcnJ1cHQgY29udGV4dCB3aXRoIGFsbCBpbnRlcnJ1cHRzCisgKiAgICAJZW5hYmxlZC4gQmV3YXJlIQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHdweF9wb2xsIChzZGxhX3QgKmNhcmQpCit7CisJaWYgKCFjYXJkLT53YW5kZXYuZGV2KXsKKwkJZ290byB3cHhfcG9sbF9leGl0OworCX0KKworCWlmIChjYXJkLT5vcGVuX2NudCAhPSBjYXJkLT51LngubnVtX29mX2NoKXsKKwkJZ290byB3cHhfcG9sbF9leGl0OworCX0KKwkKKwlpZiAodGVzdF9iaXQoUEVSSV9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJZ290byB3cHhfcG9sbF9leGl0OworCX0KKworCWlmICh0ZXN0X2JpdChTRU5EX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCkpeworCQlnb3RvIHdweF9wb2xsX2V4aXQ7CisJfQorCisJc3dpdGNoKGNhcmQtPndhbmRldi5zdGF0ZSl7CisJCWNhc2UgV0FOX0NPTk5FQ1RFRDoKKwkJCXBvbGxfYWN0aXZlKGNhcmQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXQU5fQ09OTkVDVElORzoKKwkJCXBvbGxfY29ubmVjdGluZyhjYXJkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgV0FOX0RJU0NPTk5FQ1RFRDoKKwkJCXBvbGxfZGlzY29ubmVjdGVkKGNhcmQpOworCQkJYnJlYWs7CisJfQorCit3cHhfcG9sbF9leGl0OgorCWNsZWFyX2JpdChQT0xMX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCB0cmlnZ2VyX3gyNV9wb2xsKHNkbGFfdCAqY2FyZCkKK3sKKwlzY2hlZHVsZV93b3JrKCZjYXJkLT51LngueDI1X3BvbGxfd29yayk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlIYW5kbGUgcGh5c2ljYWwgbGluayBlc3RhYmxpc2htZW50IHBoYXNlLgorICogCW8gaWYgY29ubmVjdGlvbiB0aW1lZCBvdXQsIGRpc2Nvbm5lY3QgdGhlIGxpbmsuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBwb2xsX2Nvbm5lY3RpbmcgKHNkbGFfdCogY2FyZCkKK3sKKwl2b2xhdGlsZSBUWDI1U3RhdHVzKiBzdGF0dXMgPSBjYXJkLT5mbGFnczsKKworCWlmIChzdGF0dXMtPmdmbGFncyAmIFgyNV9IRExDX0FCTSl7CisKKwkJdGltZXJfaW50cl9leGVjIChjYXJkLCBUTVJfSU5UX0VOQUJMRURfUE9MTF9DT05ORUNUX09OKTsKKworCX1lbHNlIGlmICgoamlmZmllcyAtIGNhcmQtPnN0YXRlX3RpY2spID4gQ09OTkVDVF9USU1FT1VUKXsKKworCQl0aW1lcl9pbnRyX2V4ZWMgKGNhcmQsIFRNUl9JTlRfRU5BQkxFRF9QT0xMX0NPTk5FQ1RfT0ZGKTsKKworCX0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCUhhbmRsZSBwaHlzaWNhbCBsaW5rIGRpc2Nvbm5lY3RlZCBwaGFzZS4KKyAqIAlvIGlmIGhvbGQtZG93biB0aW1lb3V0IGhhcyBleHBpcmVkIGFuZCB0aGVyZSBhcmUgb3BlbiBpbnRlcmZhY2VzLCAKKyAqCWNvbm5lY3QgbGluay4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHBvbGxfZGlzY29ubmVjdGVkIChzZGxhX3QqIGNhcmQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsgCisJeDI1X2NoYW5uZWxfdCAqY2hhbjsKKwlUWDI1U3RhdHVzKiBzdGF0dXMgPSBjYXJkLT5mbGFnczsKKworCWlmICghY2FyZC0+dS54LkxBUEJfaGRsYyAmJiBjYXJkLT5vcGVuX2NudCAmJiAKKwkgICAgKChqaWZmaWVzIC0gY2FyZC0+c3RhdGVfdGljaykgPiBIT0xEX0RPV05fVElNRSkpeworCQl0aW1lcl9pbnRyX2V4ZWMoY2FyZCwgVE1SX0lOVF9FTkFCTEVEX1BPTExfRElTQ09OTkVDVCk7CisJfQorCisKKwlpZiAoKGRldj1jYXJkLT53YW5kZXYuZGV2KSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoKGNoYW49ZGV2LT5wcml2KSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkgJiYgCisJICAgIGF0b21pY19yZWFkKCZjaGFuLT5jb21tb24uY29tbWFuZCkgJiYgCisJICAgIGNhcmQtPnUueC5MQVBCX2hkbGMpeworCisJCWlmICghKGNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9DTURfRVhFQykpIAorCQkJY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9DTURfRVhFQzsKKworCQlpZiAoIShzdGF0dXMtPmltYXNrICYgSU5UUl9PTl9USU1FUikpCisJCQlzdGF0dXMtPmltYXNrIHw9IElOVFJfT05fVElNRVI7CisJfQkKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJSGFuZGxlIGFjdGl2ZSBsaW5rIHBoYXNlLgorICogCW8gZmV0Y2ggWC4yNSBhc3luY2hyb25vdXMgZXZlbnRzLgorICogCW8ga2ljayBvZmYgdHJhbnNtaXNzaW9uIG9uIGFsbCBpbnRlcmZhY2VzLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgcG9sbF9hY3RpdmUgKHNkbGFfdCogY2FyZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2OworCVRYMjVTdGF0dXMqIHN0YXR1cyA9IGNhcmQtPmZsYWdzOworCisJZm9yIChkZXYgPSBjYXJkLT53YW5kZXYuZGV2OyBkZXY7CisJICAgICBkZXYgPSAqKChzdHJ1Y3QgbmV0X2RldmljZSAqKilkZXYtPnByaXYpKXsKKwkJeDI1X2NoYW5uZWxfdCogY2hhbiA9IGRldi0+cHJpdjsKKworCQkvKiBJZiBTVkMgaGFzIGJlZW4gaWRsZSBsb25nIGVub3VnaCwgY2xvc2UgdmlydHVhbCBjaXJjdWl0ICovCisJCWlmICggY2hhbi0+Y29tbW9uLnN2YyAmJiAKKwkJICAgICBjaGFuLT5jb21tb24uc3RhdGUgPT0gV0FOX0NPTk5FQ1RFRCAmJgorCQkgICAgIGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gV0FOUElQRSApeworCQkKKwkJCWlmKCAoamlmZmllcyAtIGNoYW4tPmlfdGltZW91dF9zb2ZhcikgLyBIWiA+IGNoYW4tPmlkbGVfdGltZW91dCApeworCQkJCS8qIENsb3NlIHN2YyAqLworCQkJCWNhcmQtPnUueC5wb2xsX2RldmljZT1kZXY7CisJCQkJdGltZXJfaW50cl9leGVjCShjYXJkLCBUTVJfSU5UX0VOQUJMRURfUE9MTF9BQ1RJVkUpOworCQkJfQorCQl9CisKKyNpZmRlZiBQUklOVF9ERUJVRworCQljaGFuLT5pZnN0YXRzLnR4X2NvbXByZXNzZWQgPSBhdG9taWNfcmVhZCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQpOworCQljaGFuLT5pZnN0YXRzLnR4X2Vycm9ycyA9IGNoYW4tPmNvbW1vbi5zdGF0ZTsKKwkJY2hhbi0+aWZzdGF0cy5yeF9maWZvX2Vycm9ycyA9IGF0b21pY19yZWFkKCZjYXJkLT51LnguY29tbWFuZF9idXN5KTsKKwkJKytjaGFuLT5pZnN0YXRzLnR4X2J5dGVzOworCisJCWNoYW4tPmlmc3RhdHMucnhfZmlmb19lcnJvcnM9YXRvbWljX3JlYWQoJmNoYW4tPmNvbW1vbi5kaXNjb25uZWN0KTsKKwkJY2hhbi0+aWZzdGF0cy5tdWx0aWNhc3Q9YXRvbWljX3JlYWQoJmNoYW4tPmJoX2J1ZmZfdXNlZCk7CisJCWNoYW4tPmlmc3RhdHMucnhfbGVuZ3RoX2Vycm9ycz0qY2FyZC0+dS54LmhkbGNfYnVmX3N0YXR1czsKKyNlbmRpZgkKKworCQlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkgJiYgCisJCSAgICBhdG9taWNfcmVhZCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQpICYmIAorCSAgICAgICAgICAgICFjYXJkLT51LnguTEFQQl9oZGxjKXsKKworCQkJaWYgKCEoY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX0NNRF9FWEVDKSkgCisJCQkJY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9DTURfRVhFQzsKKworCQkJaWYgKCEoc3RhdHVzLT5pbWFzayAmIElOVFJfT05fVElNRVIpKQorCQkJCXN0YXR1cy0+aW1hc2sgfD0gSU5UUl9PTl9USU1FUjsKKwkJfQkKKworCQlpZiAoKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKSAmJiAKKwkJICAgICBhdG9taWNfcmVhZCgmY2hhbi0+Y29tbW9uLmRpc2Nvbm5lY3QpKXsKKworCQkJaWYgKGNoYW4tPmNvbW1vbi5zdGF0ZSA9PSBXQU5fRElTQ09OTkVDVEVEKXsKKwkJCQlhdG9taWNfc2V0KCZjaGFuLT5jb21tb24uZGlzY29ubmVjdCwwKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCWF0b21pY19zZXQoJmNoYW4tPmNvbW1vbi5jb21tYW5kLFgyNV9DTEVBUl9DQUxMKTsKKwkJCWlmICghKGNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9DTURfRVhFQykpIAorCQkJCWNhcmQtPnUueC50aW1lcl9pbnRfZW5hYmxlZCB8PSBUTVJfSU5UX0VOQUJMRURfQ01EX0VYRUM7CisKKwkJCWlmICghKHN0YXR1cy0+aW1hc2sgJiBJTlRSX09OX1RJTUVSKSkKKwkJCQlzdGF0dXMtPmltYXNrIHw9IElOVFJfT05fVElNRVI7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVyX2ludHJfZXhlYyhzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGNoYXIgVFlQRSkKK3sKKwlUWDI1U3RhdHVzKiBzdGF0dXMgPSBjYXJkLT5mbGFnczsKKwljYXJkLT51LngudGltZXJfaW50X2VuYWJsZWQgfD0gVFlQRTsKKwlpZiAoIShzdGF0dXMtPmltYXNrICYgSU5UUl9PTl9USU1FUikpCisJCXN0YXR1cy0+aW1hc2sgfD0gSU5UUl9PTl9USU1FUjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICogU0RMQSBGaXJtd2FyZS1TcGVjaWZpYyBGdW5jdGlvbnMgCisgKgorICogIEFsbW9zdCBhbGwgWC4yNSBjb21tYW5kcyBjYW4gdW5leHBldGVkbHkgZmFpbCBkdWUgdG8gc28gY2FsbGVkICdYLjI1CisgKiAgYXN5bmNocm9ub3VzIGV2ZW50cycgc3VjaCBhcyByZXN0YXJ0LCBpbnRlcnJ1cHQsIGluY29taW5nIGNhbGwgcmVxdWVzdCwKKyAqICBjYWxsIGNsZWFyIHJlcXVlc3QsIGV0Yy4gIFRoZXkgY2FuJ3QgYmUgaWdub3JlZCBhbmQgaGF2ZSB0byBiZSBkZWx0IHdpdGgKKyAqICBpbW1lZGlhdGVseS4gIFRvIHRhY2tsZSB3aXRoIHRoaXMgcHJvYmxlbSB3ZSBleGVjdXRlIGVhY2ggaW50ZXJmYWNlIAorICogIGNvbW1hbmQgaW4gYSBsb29wIHVudGlsIGdvb2QgcmV0dXJuIGNvZGUgaXMgcmVjZWl2ZWQgb3IgbWF4aW11bSBudW1iZXIgCisgKiAgb2YgcmV0cmllcyBpcyByZWFjaGVkLiAgRWFjaCBpbnRlcmZhY2UgY29tbWFuZCByZXR1cm5zIG5vbi16ZXJvIHJldHVybiAKKyAqICBjb2RlLCBhbiBhc3luY2hyb25vdXMgZXZlbnQvZXJyb3IgaGFuZGxlciB4MjVfZXJyb3IoKSBpcyBjYWxsZWQuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCVJlYWQgWC4yNSBmaXJtd2FyZSB2ZXJzaW9uLgorICoJCVB1dCBjb2RlIHZlcnNpb24gYXMgQVNDSUkgc3RyaW5nIGluIHN0ci4gCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9nZXRfdmVyc2lvbiAoc2RsYV90KiBjYXJkLCBjaGFyKiBzdHIpCit7CisJVFgyNU1ib3gqIG1ib3ggPSBjYXJkLT5tYm94OworICAJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1lbXNldCgmbWJveC0+Y21kLCAwLCBzaXplb2YoVFgyNUNtZCkpOworCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9SRUFEX0NPREVfVkVSU0lPTjsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmCisJCSB4MjVfZXJyb3IoY2FyZCwgZXJyLCBYMjVfUkVBRF9DT0RFX1ZFUlNJT04sIDApKTsKKworCWlmICghZXJyICYmIHN0cikKKwl7CisJCWludCBsZW4gPSBtYm94LT5jbWQubGVuZ3RoOworCisJCW1lbWNweShzdHIsIG1ib3gtPmRhdGEsIGxlbik7CisJCXN0cltsZW5dID0gJ1wwJzsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCUNvbmZpZ3VyZSBhZGFwdGVyLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB4MjVfY29uZmlndXJlIChzZGxhX3QqIGNhcmQsIFRYMjVDb25maWcqIGNvbmYpCit7CisJVFgyNU1ib3gqIG1ib3ggPSBjYXJkLT5tYm94OworICAJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG97CisJCW1lbXNldCgmbWJveC0+Y21kLCAwLCBzaXplb2YoVFgyNUNtZCkpOworCQltZW1jcHkobWJveC0+ZGF0YSwgKHZvaWQqKWNvbmYsIHNpemVvZihUWDI1Q29uZmlnKSk7CisJCW1ib3gtPmNtZC5sZW5ndGggID0gc2l6ZW9mKFRYMjVDb25maWcpOworCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9TRVRfQ09ORklHVVJBVElPTjsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIHgyNV9lcnJvcihjYXJkLCBlcnIsIFgyNV9TRVRfQ09ORklHVVJBVElPTiwgMCkpOworCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlDb25maWd1cmUgYWRhcHRlciBmb3IgSERMQyBvbmx5LgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBoZGxjX2NvbmZpZ3VyZSAoc2RsYV90KiBjYXJkLCBUWDI1Q29uZmlnKiBjb25mKQoreworCVRYMjVNYm94KiBtYm94ID0gY2FyZC0+bWJveDsKKyAgCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCWRveworCQltZW1zZXQoJm1ib3gtPmNtZCwgMCwgc2l6ZW9mKFRYMjVDbWQpKTsKKwkJbWVtY3B5KG1ib3gtPmRhdGEsICh2b2lkKiljb25mLCBzaXplb2YoVFgyNUNvbmZpZykpOworCQltYm94LT5jbWQubGVuZ3RoICA9IHNpemVvZihUWDI1Q29uZmlnKTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBYMjVfSERMQ19TRVRfQ09ORklHOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgeDI1X2Vycm9yKGNhcmQsIGVyciwgWDI1X1NFVF9DT05GSUdVUkFUSU9OLCAwKSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNldF9oZGxjX2xldmVsIChzZGxhX3QqIGNhcmQpCit7CisKKwlUWDI1TWJveCogbWJveCA9IGNhcmQtPm1ib3g7CisgIAlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkb3sKKwkJbWVtc2V0KCZtYm94LT5jbWQsIDAsIHNpemVvZihUWDI1Q21kKSk7CisJCW1ib3gtPmNtZC5jb21tYW5kID0gU0VUX1BST1RPQ09MX0xFVkVMOworCQltYm94LT5jbWQubGVuZ3RoID0gMTsKKwkJbWJveC0+ZGF0YVswXSA9IEhETENfTEVWRUw7IC8vfCBET19IRExDX0xFVkVMX0VSUk9SX0NIRUNLSU5HOyAJCisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiB4MjVfZXJyb3IoY2FyZCwgZXJyLCBTRVRfUFJPVE9DT0xfTEVWRUwsIDApKTsKKworCXJldHVybiBlcnI7Cit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBHZXQgY29tbXVuaWNhdGlvbnMgZXJyb3Igc3RhdGlzdGljcy4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9nZXRfZXJyX3N0YXRzIChzZGxhX3QqIGNhcmQpCit7CisJVFgyNU1ib3gqIG1ib3ggPSBjYXJkLT5tYm94OworICAJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1lbXNldCgmbWJveC0+Y21kLCAwLCBzaXplb2YoVFgyNUNtZCkpOworCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9IRExDX1JFQURfQ09NTV9FUlI7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiB4MjVfZXJyb3IoY2FyZCwgZXJyLCBYMjVfSERMQ19SRUFEX0NPTU1fRVJSLCAwKSk7CisJCisJaWYgKCFlcnIpCisJeworCQlUSGRsY0NvbW1FcnIqIHN0YXRzID0gKHZvaWQqKW1ib3gtPmRhdGE7CisKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X292ZXJfZXJyb3JzICAgID0gc3RhdHMtPnJ4T3ZlcnJ1bjsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2NyY19lcnJvcnMgICAgID0gc3RhdHMtPnJ4QmFkQ3JjOworCQljYXJkLT53YW5kZXYuc3RhdHMucnhfbWlzc2VkX2Vycm9ycyAgPSBzdGF0cy0+cnhBYm9ydGVkOworCQljYXJkLT53YW5kZXYuc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgPSBzdGF0cy0+dHhBYm9ydGVkOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJR2V0IHByb3RvY29sIHN0YXRpc3RpY3MuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9nZXRfc3RhdHMgKHNkbGFfdCogY2FyZCkKK3sKKwlUWDI1TWJveCogbWJveCA9IGNhcmQtPm1ib3g7CisgIAlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkbworCXsKKwkJbWVtc2V0KCZtYm94LT5jbWQsIDAsIHNpemVvZihUWDI1Q21kKSk7CisJCW1ib3gtPmNtZC5jb21tYW5kID0gWDI1X1JFQURfU1RBVElTVElDUzsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIHgyNV9lcnJvcihjYXJkLCBlcnIsIFgyNV9SRUFEX1NUQVRJU1RJQ1MsIDApKSA7CisJCisJaWYgKCFlcnIpCisJeworCQlUWDI1U3RhdHMqIHN0YXRzID0gKHZvaWQqKW1ib3gtPmRhdGE7CisKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X3BhY2tldHMgPSBzdGF0cy0+cnhEYXRhOworCQljYXJkLT53YW5kZXYuc3RhdHMudHhfcGFja2V0cyA9IHN0YXRzLT50eERhdGE7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlDbG9zZSBIRExDIGxpbmsuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9jbG9zZV9oZGxjIChzZGxhX3QqIGNhcmQpCit7CisJVFgyNU1ib3gqIG1ib3ggPSBjYXJkLT5tYm94OworICAJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1lbXNldCgmbWJveC0+Y21kLCAwLCBzaXplb2YoVFgyNUNtZCkpOworCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9IRExDX0xJTktfQ0xPU0U7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiB4MjVfZXJyb3IoY2FyZCwgZXJyLCBYMjVfSERMQ19MSU5LX0NMT1NFLCAwKSk7CisJCisJcmV0dXJuIGVycjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJT3BlbiBIRExDIGxpbmsuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9vcGVuX2hkbGMgKHNkbGFfdCogY2FyZCkKK3sKKwlUWDI1TWJveCogbWJveCA9IGNhcmQtPm1ib3g7CisgIAlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisKKwlkbworCXsKKwkJbWVtc2V0KCZtYm94LT5jbWQsIDAsIHNpemVvZihUWDI1Q21kKSk7CisJCW1ib3gtPmNtZC5jb21tYW5kID0gWDI1X0hETENfTElOS19PUEVOOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgeDI1X2Vycm9yKGNhcmQsIGVyciwgWDI1X0hETENfTElOS19PUEVOLCAwKSk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0dXAgSERMQyBsaW5rLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHgyNV9zZXR1cF9oZGxjIChzZGxhX3QqIGNhcmQpCit7CisJVFgyNU1ib3gqIG1ib3ggPSBjYXJkLT5tYm94OworICAJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1lbXNldCgmbWJveC0+Y21kLCAwLCBzaXplb2YoVFgyNUNtZCkpOworCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9IRExDX0xJTktfU0VUVVA7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiB4MjVfZXJyb3IoY2FyZCwgZXJyLCBYMjVfSERMQ19MSU5LX1NFVFVQLCAwKSk7CisJCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IChyYWlzZS9kcm9wKSBEVFIuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9zZXRfZHRyIChzZGxhX3QqIGNhcmQsIGludCBkdHIpCit7CisJVFgyNU1ib3gqIG1ib3ggPSBjYXJkLT5tYm94OworICAJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1lbXNldCgmbWJveC0+Y21kLCAwLCBzaXplb2YoVFgyNUNtZCkpOworCQltYm94LT5kYXRhWzBdID0gMDsKKwkJbWJveC0+ZGF0YVsyXSA9IDA7CisJCW1ib3gtPmRhdGFbMV0gPSBkdHIgPyAweDAyIDogMHgwMTsKKwkJbWJveC0+Y21kLmxlbmd0aCAgPSAzOworCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9TRVRfR0xPQkFMX1ZBUlM7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiB4MjVfZXJyb3IoY2FyZCwgZXJyLCBYMjVfU0VUX0dMT0JBTF9WQVJTLCAwKSk7CisJCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCVNldCBpbnRlcnJ1cHQgbW9kZS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgeDI1X3NldF9pbnRyX21vZGUgKHNkbGFfdCogY2FyZCwgaW50IG1vZGUpCit7CisJVFgyNU1ib3gqIG1ib3ggPSBjYXJkLT5tYm94OworICAJaW50IHJldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwlpbnQgZXJyOworCisJZG8KKwl7CisJCW1lbXNldCgmbWJveC0+Y21kLCAwLCBzaXplb2YoVFgyNUNtZCkpOworCQltYm94LT5kYXRhWzBdID0gbW9kZTsKKwkJaWYgKGNhcmQtPmh3LmZ3aWQgPT0gU0ZJRF9YMjVfNTA4KXsKKwkJCW1ib3gtPmRhdGFbMV0gPSBjYXJkLT5ody5pcnE7CisJCQltYm94LT5kYXRhWzJdID0gMjsKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSAzOworCQl9ZWxzZSB7CisJCSAJbWJveC0+Y21kLmxlbmd0aCAgPSAxOworCQl9CisJCW1ib3gtPmNtZC5jb21tYW5kID0gWDI1X1NFVF9JTlRFUlJVUFRfTU9ERTsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIHgyNV9lcnJvcihjYXJkLCBlcnIsIFgyNV9TRVRfSU5URVJSVVBUX01PREUsIDApKTsKKwkKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJUmVhZCBYLjI1IGNoYW5uZWwgY29uZmlndXJhdGlvbi4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgeDI1X2dldF9jaGFuX2NvbmYgKHNkbGFfdCogY2FyZCwgeDI1X2NoYW5uZWxfdCogY2hhbikKK3sKKwlUWDI1TWJveCogbWJveCA9IGNhcmQtPm1ib3g7CisgIAlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBsY24gPSBjaGFuLT5jb21tb24ubGNuOworCWludCBlcnI7CisKKwlkb3sKKwkJbWVtc2V0KCZtYm94LT5jbWQsIDAsIHNpemVvZihUWDI1Q21kKSk7CisJCW1ib3gtPmNtZC5sY24gICAgID0gbGNuOworCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9SRUFEX0NIQU5ORUxfQ09ORklHOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgeDI1X2Vycm9yKGNhcmQsIGVyciwgWDI1X1JFQURfQ0hBTk5FTF9DT05GSUcsIGxjbikpOworCisJaWYgKCFlcnIpCisJeworCQlUWDI1U3RhdHVzKiBzdGF0dXMgPSBjYXJkLT5mbGFnczsKKworCQkvKiBjYWxjdWxhdGUgYW4gb2Zmc2V0IGludG8gdGhlIGFycmF5IG9mIHN0YXR1cyBieXRlcyAqLworCQlpZiAoY2FyZC0+dS54LmhpX3N2YyA8PSBYMjVfTUFYX0NIQU4peyAKKworCQkJY2hhbi0+Y2hfaWR4ID0gbGNuIC0gMTsKKworCQl9ZWxzZXsKKwkJCWludCBvZmZzZXQ7CisKKwkJCS8qIEZJWDogQXByIDE0IDIwMDAgOiBOZW5hZCBDb3JiaWMKKwkJCSAqIFRoZSBkYXRhIGZpZWxkIHdhcyBiZWluZyBjb21wYXJlZCB0byAweDFGIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAnJiYnIGluc3RlYWQgb2YgJyYnLiAKKwkJCSAqIFRoaXMgY2F1c2VkIFgyNUFQSSB0byBmYWlsIGZvciBMQ05zIGdyZWF0ZXIgdGhhbiAyNTUuCisJCQkgKi8KKwkJCXN3aXRjaCAobWJveC0+ZGF0YVswXSAmIDB4MUYpCisJCQl7CisJCQkJY2FzZSAweDAxOiAKKwkJCQkJb2Zmc2V0ID0gc3RhdHVzLT5wdmNfbWFwOyBicmVhazsKKwkJCQljYXNlIDB4MDM6IAorCQkJCQlvZmZzZXQgPSBzdGF0dXMtPmljY19tYXA7IGJyZWFrOworCQkJCWNhc2UgMHgwNzogCisJCQkJCW9mZnNldCA9IHN0YXR1cy0+dHdjX21hcDsgYnJlYWs7CisJCQkJY2FzZSAweDBCOiAKKwkJCQkJb2Zmc2V0ID0gc3RhdHVzLT5vZ2NfbWFwOyBicmVhazsKKwkJCQlkZWZhdWx0OiAKKwkJCQkJb2Zmc2V0ID0gMDsKKwkJCX0KKwkJCWNoYW4tPmNoX2lkeCA9IGxjbiAtIDEgLSBvZmZzZXQ7CisJCX0KKworCQkvKiBnZXQgYWN0dWFsIHRyYW5zbWl0IHBhY2tldCBzaXplIG9uIHRoaXMgY2hhbm5lbCAqLworCQlzd2l0Y2gobWJveC0+ZGF0YVsxXSAmIDB4MzgpCisJCXsKKwkJCWNhc2UgMHgwMDogCisJCQkJY2hhbi0+dHhfcGt0X3NpemUgPSAxNjsgCisJCQkJYnJlYWs7CisJCQljYXNlIDB4MDg6IAorCQkJCWNoYW4tPnR4X3BrdF9zaXplID0gMzI7IAorCQkJCWJyZWFrOworCQkJY2FzZSAweDEwOiAKKwkJCQljaGFuLT50eF9wa3Rfc2l6ZSA9IDY0OyAKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgxODogCisJCQkJY2hhbi0+dHhfcGt0X3NpemUgPSAxMjg7IAorCQkJCWJyZWFrOworCQkJY2FzZSAweDIwOiAKKwkJCQljaGFuLT50eF9wa3Rfc2l6ZSA9IDI1NjsgCisJCQkJYnJlYWs7CisJCQljYXNlIDB4Mjg6IAorCQkJCWNoYW4tPnR4X3BrdF9zaXplID0gNTEyOyAKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgzMDogCisJCQkJY2hhbi0+dHhfcGt0X3NpemUgPSAxMDI0OyAKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoY2FyZC0+dS54LmxvZ2dpbmcpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogWC4yNSBwYWNrZXQgc2l6ZSBvbiBMQ04gJWQgaXMgJWQuXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIGxjbiwgY2hhbi0+dHhfcGt0X3NpemUpOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJUGxhY2UgWC4yNSBjYWxsLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgeDI1X3BsYWNlX2NhbGwgKHNkbGFfdCogY2FyZCwgeDI1X2NoYW5uZWxfdCogY2hhbikKK3sKKwlUWDI1TWJveCogbWJveCA9IGNhcmQtPm1ib3g7CisgIAlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisJY2hhciBzdHJbNjRdOworCisKKwlpZiAoY2hhbi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKXsKKwkJc3ByaW50ZihzdHIsICItZCVzIC11Q0MiLCBjaGFuLT5hZGRyKTsKKwkKKwl9ZWxzZSBpZiAoY2hhbi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBYKSl7CisJCXNwcmludGYoc3RyLCAiLWQlcyAtdTgwMDAwMDAwODEzNyIsIGNoYW4tPmFkZHIpOworCQorCX0KKwkKKwlkbworCXsKKwkJbWVtc2V0KCZtYm94LT5jbWQsIDAsIHNpemVvZihUWDI1Q21kKSk7CisJCXN0cmNweShtYm94LT5kYXRhLCBzdHIpOworCQltYm94LT5jbWQubGVuZ3RoICA9IHN0cmxlbihzdHIpOworCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9QTEFDRV9DQUxMOworCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJfSB3aGlsZSAoZXJyICYmIHJldHJ5LS0gJiYgeDI1X2Vycm9yKGNhcmQsIGVyciwgWDI1X1BMQUNFX0NBTEwsIDApKTsKKworCWlmICghZXJyKXsKKwkJYmluZF9sY25fdG9fZGV2IChjYXJkLCBjaGFuLT5kZXYsIG1ib3gtPmNtZC5sY24pOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAJQWNjZXB0IFguMjUgY2FsbC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9hY2NlcHRfY2FsbCAoc2RsYV90KiBjYXJkLCBpbnQgbGNuLCBpbnQgcWRtKQoreworCVRYMjVNYm94KiBtYm94ID0gY2FyZC0+bWJveDsKKyAgCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCWRvCisJeworCQltZW1zZXQoJm1ib3gtPmNtZCwgMCwgc2l6ZW9mKFRYMjVDbWQpKTsKKwkJbWJveC0+Y21kLmxjbiAgICAgPSBsY247CisJCW1ib3gtPmNtZC5xZG0gICAgID0gcWRtOworCQltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9BQ0NFUFRfQ0FMTDsKKwkJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+Y21kLnJlc3VsdCA6IENNRF9USU1FT1VUOworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIHgyNV9lcnJvcihjYXJkLCBlcnIsIFgyNV9BQ0NFUFRfQ0FMTCwgbGNuKSk7CisJCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCUNsZWFyIFguMjUgY2FsbC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9jbGVhcl9jYWxsIChzZGxhX3QqIGNhcmQsIGludCBsY24sIGludCBjYXVzZSwgaW50IGRpYWduKQoreworCVRYMjVNYm94KiBtYm94ID0gY2FyZC0+bWJveDsKKyAgCWludCByZXRyeSA9IE1BWF9DTURfUkVUUlk7CisJaW50IGVycjsKKworCWRvCisJeworCQltZW1zZXQoJm1ib3gtPmNtZCwgMCwgc2l6ZW9mKFRYMjVDbWQpKTsKKwkJbWJveC0+Y21kLmxjbiAgICAgPSBsY247CisJCW1ib3gtPmNtZC5jYXVzZSAgID0gY2F1c2U7CisJCW1ib3gtPmNtZC5kaWFnbiAgID0gZGlhZ247CisJCW1ib3gtPmNtZC5jb21tYW5kID0gWDI1X0NMRUFSX0NBTEw7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiB4MjVfZXJyb3IoY2FyZCwgZXJyLCBYMjVfQ0xFQVJfQ0FMTCwgbGNuKSk7CisJCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCVNlbmQgWC4yNSBkYXRhIHBhY2tldC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHgyNV9zZW5kIChzZGxhX3QqIGNhcmQsIGludCBsY24sIGludCBxZG0sIGludCBsZW4sIHZvaWQqIGJ1ZikKK3sKKwlUWDI1TWJveCogbWJveCA9IGNhcmQtPm1ib3g7CisgIAlpbnQgcmV0cnkgPSBNQVhfQ01EX1JFVFJZOworCWludCBlcnI7CisJdW5zaWduZWQgY2hhciBjbWQ7CisJCQorCWlmIChjYXJkLT51LnguTEFQQl9oZGxjKQorCQljbWQgPSBYMjVfSERMQ19XUklURTsKKwllbHNlCisJCWNtZCA9IFgyNV9XUklURTsKKworCWRvCisJeworCQltZW1zZXQoJm1ib3gtPmNtZCwgMCwgc2l6ZW9mKFRYMjVDbWQpKTsKKwkJbWVtY3B5KG1ib3gtPmRhdGEsIGJ1ZiwgbGVuKTsKKwkJbWJveC0+Y21kLmxlbmd0aCAgPSBsZW47CisJCW1ib3gtPmNtZC5sY24gICAgID0gbGNuOworCisJCWlmIChjYXJkLT51LnguTEFQQl9oZGxjKXsKKwkJCW1ib3gtPmNtZC5wZiA9IHFkbTsKKwkJfWVsc2V7CQkJCisJCQltYm94LT5jbWQucWRtID0gcWRtOworCQl9CisKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBjbWQ7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwl9IHdoaWxlIChlcnIgJiYgcmV0cnktLSAmJiB4MjVfZXJyb3IoY2FyZCwgZXJyLCBjbWQgLCBsY24pKTsKKworCisJLyogSWYgYnVmZmVycyBhcmUgYnVzeSB0aGUgcmV0dXJuIGNvZGUgZm9yIExBUEIgSERMQyBpcworICAgICAgICAgKiAxLiBUaGUgYWJvdmUgZnVuY3Rpb25zIGFyZSBsb29raW5nIGZvciByZXR1cm4gY29kZQorICAgICAgICAgKiBvZiBYMjVSRVNfTk9UX1JFQURZIGlmIGJ1c3kuICovCisKKwlpZiAoY2FyZC0+dS54LkxBUEJfaGRsYyAmJiBlcnIgPT0gMSl7CisJCWVyciA9IFgyNVJFU19OT1RfUkVBRFk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCUZldGNoIFguMjUgYXN5bmNocm9ub3VzIGV2ZW50cy4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgeDI1X2ZldGNoX2V2ZW50cyAoc2RsYV90KiBjYXJkKQoreworCVRYMjVTdGF0dXMqIHN0YXR1cyA9IGNhcmQtPmZsYWdzOworCVRYMjVNYm94KiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgZXJyID0gMDsKKworCWlmIChzdGF0dXMtPmdmbGFncyAmIDB4MjApCisJeworCQltZW1zZXQoJm1ib3gtPmNtZCwgMCwgc2l6ZW9mKFRYMjVDbWQpKTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBYMjVfSVNfREFUQV9BVkFJTEFCTEU7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKyAJCWlmIChlcnIpIHgyNV9lcnJvcihjYXJkLCBlcnIsIFgyNV9JU19EQVRBX0FWQUlMQUJMRSwgMCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlYLjI1IGFzeW5jaHJvbm91cyBldmVudC9lcnJvciBoYW5kbGVyLgorICoJCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgZWFjaCB0aW1lIGludGVyZmFjZSBjb21tYW5kIHJldHVybnMgCisgKgkJbm9uLXplcm8gcmV0dXJuIGNvZGUgdG8gaGFuZGxlIFguMjUgYXN5bmNocm9ub3VzIGV2ZW50cyBhbmQgCisgKgkJY29tbW9uIGVycm9ycy4gUmV0dXJuIG5vbi16ZXJvIHRvIHJlcGVhdCBjb21tYW5kIG9yIHplcm8gdG8gCisgKgkJY2FuY2VsIGl0LgorICoKKyAqIAlOb3RlczoKKyAqIAkxLiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgcmVjdXJzaXZlbHksIGFzIGhhbmRsaW5nIHNvbWUgb2YgdGhlCisgKiAgICAJYXN5bmNocm9ub3VzIGV2ZW50cyAoZS5nLiBjYWxsIHJlcXVlc3QpIHJlcXVpcmVzIGV4ZWN1dGlvbiBvZiB0aGUKKyAqICAgIAlpbnRlcmZhY2UgY29tbWFuZChzKSB0aGF0LCBpbiB0dXJuLCBtYXkgYWxzbyByZXR1cm4gYXN5bmNocm9ub3VzCisgKiAgICAJZXZlbnRzLiAgVG8gYXZvaWQgcmUtZW50cmFuY3kgcHJvYmxlbXMgd2UgY29weSBtYWlsYm94IHRvIGR5bmFtaWNhbGx5CisgKiAgICAJYWxsb2NhdGVkIG1lbW9yeSBiZWZvcmUgcHJvY2Vzc2luZyBldmVudHMuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCB4MjVfZXJyb3IgKHNkbGFfdCogY2FyZCwgaW50IGVyciwgaW50IGNtZCwgaW50IGxjbikKK3sKKwlpbnQgcmV0cnkgPSAxOworCXVuc2lnbmVkIGRsZW4gPSAoKFRYMjVNYm94KiljYXJkLT5tYm94KS0+Y21kLmxlbmd0aDsKKwlUWDI1TWJveCogbWI7CisKKwltYiA9IGttYWxsb2Moc2l6ZW9mKFRYMjVNYm94KSArIGRsZW4sIEdGUF9BVE9NSUMpOworCWlmIChtYiA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogeDI1X2Vycm9yKCkgb3V0IG9mIG1lbW9yeSFcbiIsCisJCQljYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCW1lbWNweShtYiwgY2FyZC0+bWJveCwgc2l6ZW9mKFRYMjVNYm94KSArIGRsZW4pOworCXN3aXRjaCAoZXJyKXsKKworCWNhc2UgWDI1UkVTX0FTWU5DX1BBQ0tFVDoJLyogWC4yNSBhc3luY2hyb25vdXMgcGFja2V0IHdhcyByZWNlaXZlZCAqLworCisJCW1iLT5kYXRhW2RsZW5dID0gJ1wwJzsKKworCQlzd2l0Y2ggKG1iLT5jbWQucGt0VHlwZSAmIDB4N0YpeworCisJCWNhc2UgQVNFX0NBTExfUlFTVDoJCS8qIGluY29taW5nIGNhbGwgKi8KKwkJCXJldHJ5ID0gaW5jb21pbmdfY2FsbChjYXJkLCBjbWQsIGxjbiwgbWIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBU0VfQ0FMTF9BQ0NFUFRFRDoJCS8qIGNvbm5lY3RlZCAqLworCQkJcmV0cnkgPSBjYWxsX2FjY2VwdGVkKGNhcmQsIGNtZCwgbGNuLCBtYik7CisJCQlicmVhazsKKworCQljYXNlIEFTRV9DTEVBUl9SUVNUOgkJLyogY2FsbCBjbGVhciByZXF1ZXN0ICovCisJCQlyZXRyeSA9IGNhbGxfY2xlYXJlZChjYXJkLCBjbWQsIGxjbiwgbWIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBU0VfUkVTRVRfUlFTVDoJCS8qIHJlc2V0IHJlcXVlc3QgKi8KKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBYLjI1IHJlc2V0IHJlcXVlc3Qgb24gTENOICVkISAiCisJCQkJIkNhdXNlOjB4JTAyWCBEaWFnbjoweCUwMlhcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSwgbWItPmNtZC5sY24sIG1iLT5jbWQuY2F1c2UsCisJCQkJbWItPmNtZC5kaWFnbik7CisJCQlhcGlfb29iX2V2ZW50IChjYXJkLG1iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQVNFX1JFU1RBUlRfUlFTVDoJCS8qIHJlc3RhcnQgcmVxdWVzdCAqLworCQkJcmV0cnkgPSByZXN0YXJ0X2V2ZW50KGNhcmQsIGNtZCwgbGNuLCBtYik7CisJCQlicmVhazsKKworCQljYXNlIEFTRV9DTEVBUl9DT05GUk06CisJCQlpZiAoY2xlYXJfY29uZmlybV9ldmVudCAoY2FyZCxtYikpCisJCQkJYnJlYWs7CisKKwkJCS8qIEkgdXNlIHRoZSBnb3RvIHN0YXRlbWVudCBoZXJlIHNvIGlmIAorCSAgICAgICAgICAgICAgICAgKiBzb21lYm9keSBpbnNlcnRzIGNvZGUgYmV0d2VlbiB0aGUKKyAgICAgICAgCSAgICAgICAgICogY2FzZSBhbmQgZGVmYXVsdCwgd2Ugd2lsbCBub3QgaGF2ZQorICAgICAgICAgICAgICAgIAkgKiBnaG9zdCBwcm9ibGVtcyAqLworCisJCQlnb3RvIGRmbHRfMTsKKworCQlkZWZhdWx0OgorZGZsdF8xOgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFguMjUgZXZlbnQgMHglMDJYIG9uIExDTiAlZCEgIgorCQkJCSJDYXVzZToweCUwMlggRGlhZ246MHglMDJYXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIG1iLT5jbWQucGt0VHlwZSwKKwkJCQltYi0+Y21kLmxjbiwgbWItPmNtZC5jYXVzZSwgbWItPmNtZC5kaWFnbik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFgyNVJFU19QUk9UT19WSU9MQVRJT046CS8qIFguMjUgcHJvdG9jb2wgdmlvbGF0aW9uIGluZGljYXRpb24gKi8KKworCQkvKiBCdWcgRml4OiBNYXIgMTQgMjAwMAorICAgICAgICAgICAgICAgICAqIFRoZSBQcm90b2NvbCB2aW9sYXRpb24gZXJyb3IgY29uZGl0aW9ucyB3ZXJlICAKKyAgICAgICAgICAgICAgICAgKiBub3QgaGFuZGxlZCBwcmV2aW91c2x5ICovCisKKwkJc3dpdGNoIChtYi0+Y21kLnBrdFR5cGUgJiAweDdGKXsKKworCQljYXNlIFBWRV9DTEVBUl9SUVNUOgkvKiBDbGVhciByZXF1ZXN0ICovCQkKKwkJCXJldHJ5ID0gY2FsbF9jbGVhcmVkKGNhcmQsIGNtZCwgbGNuLCBtYik7CisJCQlicmVhazsJCisKKwkJY2FzZSBQVkVfUkVTRVRfUlFTVDoJLyogUmVzZXQgcmVxdWVzdCAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFguMjUgcmVzZXQgcmVxdWVzdCBvbiBMQ04gJWQhICIKKwkJCQkiQ2F1c2U6MHglMDJYIERpYWduOjB4JTAyWFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCBtYi0+Y21kLmxjbiwgbWItPmNtZC5jYXVzZSwKKwkJCQltYi0+Y21kLmRpYWduKTsKKwkJCWFwaV9vb2JfZXZlbnQgKGNhcmQsbWIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQVkVfUkVTVEFSVF9SUVNUOgkvKiBSZXN0YXJ0IHJlcXVlc3QgKi8KKwkJCXJldHJ5ID0gcmVzdGFydF9ldmVudChjYXJkLCBjbWQsIGxjbiwgbWIpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdCA6CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJIiVzOiBYLjI1IHByb3RvY29sIHZpb2xhdGlvbiBvbiBMQ04gJWQhICIKKwkJCQkiUGFja2V0OjB4JTAyWCBDYXVzZToweCUwMlggRGlhZ246MHglMDJYXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIG1iLT5jbWQubGNuLAorCQkJCW1iLT5jbWQucGt0VHlwZSAmIDB4N0YsIG1iLT5jbWQuY2F1c2UsIG1iLT5jbWQuZGlhZ24pOworCQkJYXBpX29vYl9ldmVudChjYXJkLG1iKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMHg0MjoJLyogWC4yNSB0aW1lb3V0ICovCisJCXJldHJ5ID0gdGltZW91dF9ldmVudChjYXJkLCBjbWQsIGxjbiwgbWIpOworCQlicmVhazsKKworCWNhc2UgMHg0MzoJLyogWC4yNSByZXRyeSBsaW1pdCBleGNlZWRlZCAqLworCQlwcmludGsoS0VSTl9JTkZPCisJCQkiJXM6IGV4Y2VlZGVkIFguMjUgcmV0cnkgbGltaXQgb24gTENOICVkISAiCisJCQkiUGFja2V0OjB4JTAyWCBEaWFnbjoweCUwMlhcbiIsIGNhcmQtPmRldm5hbWUsCisJCQltYi0+Y21kLmxjbiwgbWItPmNtZC5wa3RUeXBlLCBtYi0+Y21kLmRpYWduKQorCQk7CisJCWJyZWFrOworCisJY2FzZSAweDA4OgkvKiBtb2RlbSBmYWlsdXJlICovCisjaWZuZGVmIE1PREVNX05PVF9MT0cKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG1vZGVtIGZhaWx1cmUhXG4iLCBjYXJkLT5kZXZuYW1lKTsKKyNlbmRpZiAvKiBNT0RFTV9OT1RfTE9HICovCisJCWFwaV9vb2JfZXZlbnQoY2FyZCxtYik7CisJCWJyZWFrOworCisJY2FzZSAweDA5OgkvKiBOMiByZXRyeSBsaW1pdCAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogZXhjZWVkZWQgSERMQyByZXRyeSBsaW1pdCFcbiIsCisJCQljYXJkLT5kZXZuYW1lKTsKKwkJYXBpX29vYl9ldmVudChjYXJkLG1iKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDY6CS8qIHVubnVtYmVyZWQgZnJhbWUgd2FzIHJlY2VpdmVkIHdoaWxlIGluIEFCTSAqLworCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVjZWl2ZWQgVW5udW1iZXJlZCBmcmFtZSAweCUwMlghXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgbWItPmRhdGFbMF0pOworCQlhcGlfb29iX2V2ZW50KGNhcmQsbWIpOworCQlicmVhazsKKworCWNhc2UgQ01EX1RJTUVPVVQ6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvbW1hbmQgMHglMDJYIHRpbWVkIG91dCFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBjbWQpCisJCTsKKwkJcmV0cnkgPSAwOwkvKiBhYm9ydCBjb21tYW5kICovCisJCWJyZWFrOworCisJY2FzZSBYMjVSRVNfTk9UX1JFQURZOgorCQlyZXRyeSA9IDE7CisJCWJyZWFrOworCisJY2FzZSAweDAxOgorCQlpZiAoY2FyZC0+dS54LkxBUEJfaGRsYykKKwkJCWJyZWFrOworCisJCWlmIChtYi0+Y21kLmNvbW1hbmQgPT0gMHgxNikKKwkJCWJyZWFrOworCQkvKiBJIHVzZSB0aGUgZ290byBzdGF0ZW1lbnQgaGVyZSBzbyBpZiAKKyAgICAgICAgICAgICAgICAgKiBzb21lYm9keSBpbnNlcnRzIGNvZGUgYmV0d2VlbiB0aGUKKyAgICAgICAgICAgICAgICAgKiBjYXNlIGFuZCBkZWZhdWx0LCB3ZSB3aWxsIG5vdCBoYXZlCisgICAgICAgICAgICAgICAgICogZ2hvc3QgcHJvYmxlbXMgKi8KKwkJZ290byBkZmx0XzI7CisKKwlkZWZhdWx0OgorZGZsdF8yOgorCQlwcmludGsoS0VSTl9JTkZPICIlczogY29tbWFuZCAweCUwMlggcmV0dXJuZWQgMHglMDJYISBMY24gJWlcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBjbWQsIGVyciwgbWItPmNtZC5sY24pCisJCTsKKwkJcmV0cnkgPSAwOwkvKiBhYm9ydCBjb21tYW5kICovCisJfQorCWtmcmVlKG1iKTsKKwlyZXR1cm4gcmV0cnk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisgKglYLjI1IEFzeW5jaHJvbm91cyBFdmVudCBIYW5kbGVycworICogCVRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGJ5IHRoZSB4MjVfZXJyb3IoKSBhbmQgc2hvdWxkIHJldHVybiAwLCBpZgorICogCXRoZSBjb21tYW5kIHJlc3VsdGluZyBpbiB0aGUgYXN5bmNocm9ub3VzIGV2ZW50IG11c3QgYmUgYWJvcnRlZC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICpIYW5kbGUgWC4yNSBpbmNvbWluZyBjYWxsIHJlcXVlc3QuCisgKglSRkMgMTM1NiBlc3RhYmxpc2hlcyB0aGUgZm9sbG93aW5nIHJ1bGVzOgorICoJMS4gVGhlIGZpcnN0IG9jdGV0IGluIHRoZSBDYWxsIFVzZXIgRGF0YSAoQ1VEKSBmaWVsZCBvZiB0aGUgY2FsbAorICogICAgIAkgICByZXF1ZXN0IHBhY2tldCBjb250YWlucyBOTFBJRCBpZGVudGlmeWluZyBwcm90b2NvbCBlbmNhcHN1bGF0aW9uCisgKiAJMi4gQ2FsbHMgTVVTVCBOT1QgYmUgYWNjZXB0ZWQgdW5sZXNzIHJvdXRlciBzdXBwb3J0cyByZXF1ZXN0ZWQKKyAqICAgCSAgIHByb3RvY29sIGVuY2Fwc3VsYXRpb24uCisgKgkzLiBBIGRpYWdub3N0aWMgY29kZSAyNDkgZGVmaW5lZCBieSBJU08vSUVDIDgyMDggbWF5IGJlIHVzZWQgCisgKgkgICB3aGVuIGNsZWFyaW5nIGEgY2FsbCBiZWNhdXNlIHByb3RvY29sIGVuY2Fwc3VsYXRpb24gaXMgbm90IAorICoJICAgc3VwcG9ydGVkLgorICoJNC4gSWYgYW4gaW5jb21pbmcgY2FsbCBpcyByZWNlaXZlZCB3aGlsZSBhIGNhbGwgcmVxdWVzdCBpcyAKKyAqCSAgIHBlbmRpbmcgKGkuZS4gY2FsbCBjb2xsaXNpb24gaGFzIG9jY3VycmVkKSwgdGhlIGluY29taW5nIGNhbGwgCisgKgkgICBzaGFsbCBiZSByZWplY3RlZCBhbmQgY2FsbCByZXF1ZXN0IHNoYWxsIGJlIHJldHJpZWQuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBpbmNvbWluZ19jYWxsIChzZGxhX3QqIGNhcmQsIGludCBjbWQsIGludCBsY24sIFRYMjVNYm94KiBtYikKK3sKKwlzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2ID0gJmNhcmQtPndhbmRldjsKKwlpbnQgbmV3X2xjbiA9IG1iLT5jbWQubGNuOworCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXYgPSBnZXRfZGV2X2J5X2xjbih3YW5kZXYsIG5ld19sY24pOworCXgyNV9jaGFubmVsX3QqIGNoYW4gPSBOVUxMOworCWludCBhY2NlcHQgPSAwOwkJLyogc2V0IHRvICcxJyBpZiBvLmsuIHRvIGFjY2VwdCBjYWxsICovCisJdW5zaWduZWQgaW50IHVzZXJfZGF0YTsKKwl4MjVfY2FsbF9pbmZvX3QqIGluZm87CisJCisJLyogTWFrZSBzdXJlIHRoZXJlIGlzIG5vIGNhbGwgY29sbGlzaW9uICovCisJaWYgKGRldiAhPSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIiVzOiBYLjI1IGluY29taW5nIGNhbGwgY29sbGlzaW9uIG9uIExDTiAlZCFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBuZXdfbGNuKTsKKworCQl4MjVfY2xlYXJfY2FsbChjYXJkLCBuZXdfbGNuLCAwLCAwKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogTWFrZSBzdXJlIEQgYml0IGlzIG5vdCBzZXQgaW4gY2FsbCByZXF1ZXN0ICovCisvL0ZJWE1FOiBUSElTIElTIE5PVCBUVVJFICEhISEgVEFLRSBJVCBPVVQKKy8vCWlmIChtYi0+Y21kLnFkbSAmIDB4MDIpCisvLwl7CisvLwkJcHJpbnRrKEtFUk5fSU5GTworLy8JCQkiJXM6IFguMjUgaW5jb21pbmcgY2FsbCBvbiBMQ04gJWQgd2l0aCBELWJpdCBzZXQhXG4iLAorLy8JCQljYXJkLT5kZXZuYW1lLCBuZXdfbGNuKTsKKy8vCisvLwkJeDI1X2NsZWFyX2NhbGwoY2FyZCwgbmV3X2xjbiwgMCwgMCk7CisvLwkJcmV0dXJuIDE7CisvLwl9CisKKwkvKiBQYXJzZSBjYWxsIHJlcXVlc3QgZGF0YSAqLworCWluZm8gPSBrbWFsbG9jKHNpemVvZih4MjVfY2FsbF9pbmZvX3QpLCBHRlBfQVRPTUlDKTsKKwlpZiAoaW5mbyA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiJXM6IG5vdCBlbm91Z2ggbWVtb3J5IHRvIHBhcnNlIFguMjUgaW5jb21pbmcgY2FsbCAiCisJCQkib24gTENOICVkIVxuIiwgY2FyZC0+ZGV2bmFtZSwgbmV3X2xjbik7CisJCXgyNV9jbGVhcl9jYWxsKGNhcmQsIG5ld19sY24sIDAsIDApOworCQlyZXR1cm4gMTsKKwl9CisgCisJcGFyc2VfY2FsbF9pbmZvKG1iLT5kYXRhLCBpbmZvKTsKKworCWlmIChjYXJkLT51LngubG9nZ2luZykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiXG4lczogWC4yNSBpbmNvbWluZyBjYWxsIG9uIExDTiAlZCFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBuZXdfbGNuKTsKKworCS8qIENvbnZlciB0aGUgZmlyc3QgdHdvIEFTQ0lJIGNoYXJhY3RlcnMgaW50byBhbgorICAgICAgICAgKiBpbnRlcmdlci4gVXNlZCB0byBjaGVjayB0aGUgaW5jb21pbmcgcHJvdG9jb2wgCisgICAgICAgICAqLworCXVzZXJfZGF0YSA9IGhleF90b191aW50KGluZm8tPnVzZXIsMik7CisKKwkvKiBGaW5kIGF2YWlsYWJsZSBjaGFubmVsICovCisJZm9yIChkZXYgPSB3YW5kZXYtPmRldjsgZGV2OyBkZXYgPSAqKChzdHJ1Y3QgbmV0X2RldmljZSAqKilkZXYtPnByaXYpKSB7CisJCWNoYW4gPSBkZXYtPnByaXY7CisKKwkJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKQorCQkJY29udGludWU7CisKKwkJaWYgKCFjaGFuLT5jb21tb24uc3ZjIHx8IChjaGFuLT5jb21tb24uc3RhdGUgIT0gV0FOX0RJU0NPTk5FQ1RFRCkpCisJCQljb250aW51ZTsKKworCQlpZiAodXNlcl9kYXRhID09IE5MUElEX0lQICYmIGNoYW4tPnByb3RvY29sICE9IGh0b25zKEVUSF9QX0lQKSl7CisJCQlwcmludGsoS0VSTl9JTkZPICJJUCBwYWNrZXQgYnV0IGNvbmZpZ3VyZWQgZm9yIElQWCA6ICV4LCAleFxuIiwKKwkJCQkgICAgICAgaHRvbnMoY2hhbi0+cHJvdG9jb2wpLCBpbmZvLT51c2VyWzBdKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCisJCWlmICh1c2VyX2RhdGEgPT0gTkxQSURfU05BUCAmJiBjaGFuLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUFgpKXsKKwkJCXByaW50ayhLRVJOX0lORk8gIklQWCBwYWNrZXQgYnV0IGNvbmZpZ3VyZWQgZm9yIElQOiAleFxuIiwKKwkJCQkgICAgICAgaHRvbnMoY2hhbi0+cHJvdG9jb2wpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdHJjbXAoaW5mby0+c3JjLCBjaGFuLT5hZGRyKSA9PSAwKQorCQkJYnJlYWs7CisKKwkgICAgICAgIC8qIElmIGp1c3QgYW4gJ0AnIGlzIHNwZWNpZmllZCwgYWNjZXB0IGFsbCBpbmNvbWluZyBjYWxscyAqLworCSAgICAgICAgaWYgKHN0cmNtcChjaGFuLT5hZGRyLCAiIikgPT0gMCkKKwkgICAgICAgICAgICAgICAgYnJlYWs7CisJfQorCisJaWYgKGRldiA9PSBOVUxMKXsKKworCQkvKiBJZiB0aGUgY2FsbCBpcyBub3QgZm9yIGFueSBXQU5QSVBFIGludGVyZmFjZXMKKyAgICAgICAgICAgICAgICAgKiBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYW4gQVBJIGxpc3RlbmluZyBxdWV1ZQorICAgICAgICAgICAgICAgICAqIHdhaXRpbmcgZm9yIGRhdGEuIElmIHRoZXJlIGlzIHNlbmQgdGhlIHBhY2tldAorICAgICAgICAgICAgICAgICAqIHVwIHRoZSBzdGFjay4KKyAgICAgICAgICAgICAgICAgKi8KKwkJaWYgKGNhcmQtPnNrICE9IE5VTEwgJiYgY2FyZC0+ZnVuYyAhPSBOVUxMKXsKKwkJCWlmIChhcGlfaW5jb21pbmdfY2FsbChjYXJkLG1iLG5ld19sY24pKXsKKwkJCQl4MjVfY2xlYXJfY2FsbChjYXJkLCBuZXdfbGNuLCAwLCAwKTsKKwkJCX0KKwkJCWFjY2VwdCA9IDA7CisJCX1lbHNleworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIGNoYW5uZWxzIGF2YWlsYWJsZSFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQkKKwkJCXgyNV9jbGVhcl9jYWxsKGNhcmQsIG5ld19sY24sIDAsIDApOworCQl9CisKKwl9ZWxzZSBpZiAoaW5mby0+bnVzZXIgPT0gMCl7CisKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIiVzOiBubyB1c2VyIGRhdGEgaW4gaW5jb21pbmcgY2FsbCBvbiBMQ04gJWQhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgbmV3X2xjbikKKwkJOworCQl4MjVfY2xlYXJfY2FsbChjYXJkLCBuZXdfbGNuLCAwLCAwKTsKKworCX1lbHNlIHN3aXRjaCAoaW5mby0+dXNlclswXSl7CisKKwkJY2FzZSAwOgkJLyogbXVsdGlwbGV4ZWQgKi8KKwkJCWNoYW4tPnByb3RvY29sID0gaHRvbnMoMCk7CisJCQlhY2NlcHQgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBOTFBJRF9JUDoJLyogSVAgZGF0YWdyYW1zICovCisJCQlhY2NlcHQgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBOTFBJRF9TTkFQOiAvKiBJUFggZGF0YWdyYW1zICovCisJCQlhY2NlcHQgPSAxOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IHVuc3VwcG9ydGVkIE5MUElEIDB4JTAyWCBpbiBpbmNvbWluZyBjYWxsICIKKwkJCQkib24gTENOICVkIVxuIiwgY2FyZC0+ZGV2bmFtZSwgaW5mby0+dXNlclswXSwgbmV3X2xjbik7CisJCQl4MjVfY2xlYXJfY2FsbChjYXJkLCBuZXdfbGNuLCAwLCAyNDkpOworCX0KKwkKKwlpZiAoYWNjZXB0ICYmICh4MjVfYWNjZXB0X2NhbGwoY2FyZCwgbmV3X2xjbiwgMCkgPT0gQ01EX09LKSl7CisKKwkJYmluZF9sY25fdG9fZGV2IChjYXJkLCBjaGFuLT5kZXYsIG5ld19sY24pOworCQkKKwkJaWYgKHgyNV9nZXRfY2hhbl9jb25mKGNhcmQsIGNoYW4pID09IENNRF9PSykKKwkJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0NPTk5FQ1RFRCk7CisJCWVsc2UgCisJCQl4MjVfY2xlYXJfY2FsbChjYXJkLCBuZXdfbGNuLCAwLCAwKTsKKwl9CisJa2ZyZWUoaW5mbyk7CisJcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlIYW5kbGUgYWNjZXB0ZWQgY2FsbC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGNhbGxfYWNjZXB0ZWQgKHNkbGFfdCogY2FyZCwgaW50IGNtZCwgaW50IGxjbiwgVFgyNU1ib3gqIG1iKQoreworCXVuc2lnbmVkIG5ld19sY24gPSBtYi0+Y21kLmxjbjsKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2ID0gZmluZF9jaGFubmVsKGNhcmQsIG5ld19sY24pOworCXgyNV9jaGFubmVsX3QqIGNoYW47CisKKwlpZiAoZGV2ID09IE5VTEwpeworCQlwcmludGsoS0VSTl9JTkZPCisJCQkiJXM6IGNsZWFyaW5nIG9ycGhhbmVkIGNvbm5lY3Rpb24gb24gTENOICVkIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIG5ld19sY24pOworCQl4MjVfY2xlYXJfY2FsbChjYXJkLCBuZXdfbGNuLCAwLCAwKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGNhcmQtPnUueC5sb2dnaW5nKQkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFguMjUgY2FsbCBhY2NlcHRlZCBvbiBEZXYgJXMgYW5kIExDTiAlZCFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUsIG5ld19sY24pOworCisJLyogR2V0IGNoYW5uZWwgY29uZmlndXJhdGlvbiBhbmQgbm90aWZ5IHJvdXRlciAqLworCWNoYW4gPSBkZXYtPnByaXY7CisJaWYgKHgyNV9nZXRfY2hhbl9jb25mKGNhcmQsIGNoYW4pICE9IENNRF9PSykKKwl7CisJCXgyNV9jbGVhcl9jYWxsKGNhcmQsIG5ld19sY24sIDAsIDApOworCQlyZXR1cm4gMTsKKwl9CisKKwlzZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9DT05ORUNURUQpOworCisJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKXsKKwkJc2VuZF9kZWxheWVkX2NtZF9yZXN1bHQoY2FyZCxkZXYsbWIpOworCQliaW5kX2xjbl90b19kZXYgKGNhcmQsIGRldiwgbmV3X2xjbik7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlIYW5kbGUgY2xlYXJlZCBjYWxsLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgY2FsbF9jbGVhcmVkIChzZGxhX3QqIGNhcmQsIGludCBjbWQsIGludCBsY24sIFRYMjVNYm94KiBtYikKK3sKKwl1bnNpZ25lZCBuZXdfbGNuID0gbWItPmNtZC5sY247CisJc3RydWN0IG5ldF9kZXZpY2UqIGRldiA9IGZpbmRfY2hhbm5lbChjYXJkLCBuZXdfbGNuKTsKKwl4MjVfY2hhbm5lbF90ICpjaGFuOworCXVuc2lnbmVkIGNoYXIgb2xkX3N0YXRlOworCisJaWYgKGNhcmQtPnUueC5sb2dnaW5nKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFguMjUgY2xlYXIgcmVxdWVzdCBvbiBMQ04gJWQhIENhdXNlOjB4JTAyWCAiCisJCSJEaWFnbjoweCUwMlhcbiIsCisJCWNhcmQtPmRldm5hbWUsIG5ld19sY24sIG1iLT5jbWQuY2F1c2UsIG1iLT5jbWQuZGlhZ24pOworCX0KKworCWlmIChkZXYgPT0gTlVMTCl7IAorCQlwcmludGsoS0VSTl9JTkZPICIlczogWC4yNSBjbGVhciByZXF1ZXN0IDogTm8gZGV2aWNlIGZvciBjbGVhclxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJY2hhbj1kZXYtPnByaXY7CisKKwlvbGRfc3RhdGUgPSBjaGFuLT5jb21tb24uc3RhdGU7CisKKwlzZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9ESVNDT05ORUNURUQpOworCisJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKXsKKworCQlzd2l0Y2ggKG9sZF9zdGF0ZSl7CisJCQorCQljYXNlIFdBTl9DT05ORUNUSU5HOgorCQkJc2VuZF9kZWxheWVkX2NtZF9yZXN1bHQoY2FyZCxkZXYsbWIpOworCQkJYnJlYWs7CisJCWNhc2UgV0FOX0NPTk5FQ1RFRDoKKwkJCXNlbmRfb29iX21zZyhjYXJkLGRldixtYik7CQkJCQorCQkJYnJlYWs7CisJCX0KKwl9CisJCisJcmV0dXJuICgoY21kID09IFgyNV9XUklURSkgJiYgKGxjbiA9PSBuZXdfbGNuKSkgPyAwIDogMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCUhhbmRsZSBYLjI1IHJlc3RhcnQgZXZlbnQuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCByZXN0YXJ0X2V2ZW50IChzZGxhX3QqIGNhcmQsIGludCBjbWQsIGludCBsY24sIFRYMjVNYm94KiBtYikKK3sKKwlzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2ID0gJmNhcmQtPndhbmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2OworCXgyNV9jaGFubmVsX3QgKmNoYW47CisJdW5zaWduZWQgY2hhciBvbGRfc3RhdGU7CisKKwlwcmludGsoS0VSTl9JTkZPCisJCSIlczogWC4yNSByZXN0YXJ0IHJlcXVlc3QhIENhdXNlOjB4JTAyWCBEaWFnbjoweCUwMlhcbiIsCisJCWNhcmQtPmRldm5hbWUsIG1iLT5jbWQuY2F1c2UsIG1iLT5jbWQuZGlhZ24pOworCisJLyogZG93biBhbGwgbG9naWNhbCBjaGFubmVscyAqLworCWZvciAoZGV2ID0gd2FuZGV2LT5kZXY7IGRldjsgZGV2ID0gKigoc3RydWN0IG5ldF9kZXZpY2UgKiopZGV2LT5wcml2KSkgeworCQljaGFuPWRldi0+cHJpdjsKKwkJb2xkX3N0YXRlID0gY2hhbi0+Y29tbW9uLnN0YXRlOworCisJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RFRCk7CisKKwkJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKXsKKwkJCXN3aXRjaCAob2xkX3N0YXRlKXsKKwkJCisJCQljYXNlIFdBTl9DT05ORUNUSU5HOgorCQkJCXNlbmRfZGVsYXllZF9jbWRfcmVzdWx0KGNhcmQsZGV2LG1iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgV0FOX0NPTk5FQ1RFRDoKKwkJCQlzZW5kX29vYl9tc2coY2FyZCxkZXYsbWIpOwkJCQkKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gKGNtZCA9PSBYMjVfV1JJVEUpID8gMCA6IDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEhhbmRsZSB0aW1lb3V0IGV2ZW50LgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgdGltZW91dF9ldmVudCAoc2RsYV90KiBjYXJkLCBpbnQgY21kLCBpbnQgbGNuLCBUWDI1TWJveCogbWIpCit7CisJdW5zaWduZWQgbmV3X2xjbiA9IG1iLT5jbWQubGNuOworCisJaWYgKG1iLT5jbWQucGt0VHlwZSA9PSAweDA1KQkvKiBjYWxsIHJlcXVlc3QgdGltZSBvdXQgKi8KKwl7CisJCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXYgPSBmaW5kX2NoYW5uZWwoY2FyZCxuZXdfbGNuKTsKKworCQlwcmludGsoS0VSTl9JTkZPICIlczogWC4yNSBjYWxsIHRpbWVkIHRpbWVvdXQgb24gTENOICVkIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIG5ld19sY24pOworCisJCWlmIChkZXYpeworCQkJeDI1X2NoYW5uZWxfdCAqY2hhbiA9IGRldi0+cHJpdjsKKwkJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RFRCk7CisKKwkJCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSl7CisJCQkJc2VuZF9kZWxheWVkX2NtZF9yZXN1bHQoY2FyZCxkZXYsY2FyZC0+bWJveCk7CisJCQl9CisJCX0KKwl9ZWxzZXsgCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBYLjI1IHBhY2tldCAweCUwMlggdGltZW91dCBvbiBMQ04gJWQhXG4iLAorCQljYXJkLT5kZXZuYW1lLCBtYi0+Y21kLnBrdFR5cGUsIG5ld19sY24pOworCX0KKwlyZXR1cm4gMTsKK30KKworLyogCisgKglNaXNjZWxsYW5lb3VzIAorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAlFc3RhYmxpc2ggcGh5c2ljYWwgY29ubmVjdGlvbi4KKyAqIAlvIG9wZW4gSERMQyBhbmQgcmFpc2UgRFRSCisgKgorICogCVJldHVybjoJCTAJY29ubmVjdGlvbiBlc3RhYmxpc2hlZAorICoJCQkxCWNvbm5lY3Rpb24gaXMgaW4gcHJvZ3Jlc3MKKyAqCQkJPDAJZXJyb3IKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgY29ubmVjdCAoc2RsYV90KiBjYXJkKQoreworCVRYMjVTdGF0dXMqIHN0YXR1cyA9IGNhcmQtPmZsYWdzOworCisJaWYgKHgyNV9vcGVuX2hkbGMoY2FyZCkgfHwgeDI1X3NldHVwX2hkbGMoY2FyZCkpCisJCXJldHVybiAtRUlPOworCisJd2FucGlwZV9zZXRfc3RhdGUoY2FyZCwgV0FOX0NPTk5FQ1RJTkcpOworCisJeDI1X3NldF9pbnRyX21vZGUoY2FyZCwgSU5UUl9PTl9USU1FUik7IAorCXN0YXR1cy0+aW1hc2sgJj0gfklOVFJfT05fVElNRVI7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIAlUZWFyIGRvd24gcGh5c2ljYWwgY29ubmVjdGlvbi4KKyAqIAlvIGNsb3NlIEhETEMgbGluaworICogCW8gZHJvcCBEVFIKKyAqCisgKiAJUmV0dXJuOgkJMAorICoJCQk8MAllcnJvcgorICovCisKK3N0YXRpYyBpbnQgZGlzY29ubmVjdCAoc2RsYV90KiBjYXJkKQoreworCXdhbnBpcGVfc2V0X3N0YXRlKGNhcmQsIFdBTl9ESVNDT05ORUNURUQpOworCXgyNV9zZXRfaW50cl9tb2RlKGNhcmQsIElOVFJfT05fVElNRVIpOwkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHQgZXhjZXB0IHRpbWVyICovCisJeDI1X2Nsb3NlX2hkbGMoY2FyZCk7CQkJLyogY2xvc2UgSERMQyBsaW5rICovCisJeDI1X3NldF9kdHIoY2FyZCwgMCk7CQkJLyogZHJvcCBEVFIgKi8KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZpbmQgbmV0d29yayBkZXZpY2UgYnkgaXRzIGNoYW5uZWwgbnVtYmVyLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSogZ2V0X2Rldl9ieV9sY24oc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiwKKwkJCQkJIHVuc2lnbmVkIGxjbikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2OworCisJZm9yIChkZXYgPSB3YW5kZXYtPmRldjsgZGV2OyBkZXYgPSAqKChzdHJ1Y3QgbmV0X2RldmljZSAqKilkZXYtPnByaXYpKQorCQlpZiAoKCh4MjVfY2hhbm5lbF90KilkZXYtPnByaXYpLT5jb21tb24ubGNuID09IGxjbikgCisJCQlicmVhazsKKwlyZXR1cm4gZGV2OworfQorCisvKgorICogCUluaXRpYXRlIGNvbm5lY3Rpb24gb24gdGhlIGxvZ2ljYWwgY2hhbm5lbC4KKyAqIAlvIGZvciBQVkMgd2UganVzdCBnZXQgY2hhbm5lbCBjb25maWd1cmF0aW9uCisgKiAJbyBmb3IgU1ZDcyBwbGFjZSBhbiBYLjI1IGNhbGwKKyAqCisgKiAJUmV0dXJuOgkJMAljb25uZWN0ZWQKKyAqCQkJPjAJY29ubmVjdGlvbiBpbiBwcm9ncmVzcworICoJCQk8MAlmYWlsdXJlCisgKi8KKworc3RhdGljIGludCBjaGFuX2Nvbm5lY3Qoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisKKwlpZiAoY2hhbi0+Y29tbW9uLnN2YyAmJiBjaGFuLT5jb21tb24udXNlZGJ5ID09IFdBTlBJUEUpeworCQlpZiAoIWNoYW4tPmFkZHJbMF0peworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vIERlc3RpbmF0aW9uIEFkZHJlc3NcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJcmV0dXJuIC1FSU5WQUw7CS8qIG5vIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICIlczogcGxhY2luZyBYLjI1IGNhbGwgdG8gJXMgLi4uXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgY2hhbi0+YWRkcik7CisKKwkJaWYgKHgyNV9wbGFjZV9jYWxsKGNhcmQsIGNoYW4pICE9IENNRF9PSykKKwkJCXJldHVybiAtRUlPOworCisJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0NPTk5FQ1RJTkcpOworCQlyZXR1cm4gMTsKKwl9ZWxzZXsKKwkJaWYgKHgyNV9nZXRfY2hhbl9jb25mKGNhcmQsIGNoYW4pICE9IENNRF9PSykKKwkJCXJldHVybiAtRUlPOworCisJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0NPTk5FQ1RFRCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogCURpc2Nvbm5lY3QgbG9naWNhbCBjaGFubmVsLgorICogCW8gaWYgU1ZDIHRoZW4gY2xlYXIgWC4yNSBjYWxsCisgKi8KKworc3RhdGljIGludCBjaGFuX2Rpc2Moc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCisJaWYgKGNoYW4tPmNvbW1vbi5zdmMpeyAKKwkJeDI1X2NsZWFyX2NhbGwoY2hhbi0+Y2FyZCwgY2hhbi0+Y29tbW9uLmxjbiwgMCwgMCk7CisKKwkJLyogRm9yIEFQSSB3ZSBkaXNjb25uZWN0IG9uIGNsZWFyCisgICAgICAgICAgICAgICAgICogY29uZmlybWF0aW9uLiAKKyAgICAgICAgICAgICAgICAgKi8KKwkJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKQorCQkJcmV0dXJuIDA7CisJfQorCisJc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fRElTQ09OTkVDVEVEKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIAlTZXQgbG9naWNhbCBjaGFubmVsIHN0YXRlLgorICovCisKK3N0YXRpYyB2b2lkIHNldF9jaGFuX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIGludCBzdGF0ZSkKK3sKKwl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNhdmVfZmxhZ3MoZmxhZ3MpOworCWNsaSgpOworCWlmIChjaGFuLT5jb21tb24uc3RhdGUgIT0gc3RhdGUpCisJeworCQlzd2l0Y2ggKHN0YXRlKQorCQl7CisJCQljYXNlIFdBTl9DT05ORUNURUQ6CisJCQkJaWYgKGNhcmQtPnUueC5sb2dnaW5nKXsKKwkJCQkJcHJpbnRrIChLRVJOX0lORk8gCisJCQkJCQkiJXM6IGludGVyZmFjZSAlcyBjb25uZWN0ZWQsIGxjbiAlaSAhXG4iLCAKKwkJCQkJCWNhcmQtPmRldm5hbWUsIGRldi0+bmFtZSxjaGFuLT5jb21tb24ubGNuKTsKKwkJCQl9CisJCQkJKih1bnNpZ25lZCBzaG9ydCopZGV2LT5kZXZfYWRkciA9IGh0b25zKGNoYW4tPmNvbW1vbi5sY24pOworCQkJCWNoYW4tPmlfdGltZW91dF9zb2ZhciA9IGppZmZpZXM7CisKKwkJCQkvKiBMQVBCIGlzIFBWQyBCYXNlZCAqLworCQkJCWlmIChjYXJkLT51LnguTEFQQl9oZGxjKQorCQkJCQljaGFuLT5jb21tb24uc3ZjPTA7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgV0FOX0NPTk5FQ1RJTkc6CisJCQkJaWYgKGNhcmQtPnUueC5sb2dnaW5nKXsKKwkJCQkJcHJpbnRrIChLRVJOX0lORk8gCisJCQkJCQkiJXM6IGludGVyZmFjZSAlcyBjb25uZWN0aW5nLCBsY24gJWkgLi4uXG4iLCAKKwkJCQkJCWNhcmQtPmRldm5hbWUsIGRldi0+bmFtZSwgY2hhbi0+Y29tbW9uLmxjbik7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFdBTl9ESVNDT05ORUNURUQ6CisJCQkJaWYgKGNhcmQtPnUueC5sb2dnaW5nKXsKKwkJCQkJcHJpbnRrIChLRVJOX0lORk8gCisJCQkJCQkiJXM6IGludGVyZmFjZSAlcyBkaXNjb25uZWN0ZWQsIGxjbiAlaSAhXG4iLCAKKwkJCQkJCWNhcmQtPmRldm5hbWUsIGRldi0+bmFtZSxjaGFuLT5jb21tb24ubGNuKTsKKwkJCQl9CisJCQkJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLmRpc2Nvbm5lY3QsMCk7CisJCQkJCisJCQkJaWYgKGNoYW4tPmNvbW1vbi5zdmMpIHsKKwkJCQkJKih1bnNpZ25lZCBzaG9ydCopZGV2LT5kZXZfYWRkciA9IDA7CisJCQkJCWNhcmQtPnUueC5zdmNfdG9fZGV2X21hcFsoY2hhbi0+Y29tbW9uLmxjbiVYMjVfTUFYX0NIQU4pXT1OVUxMOworCQkgICAgICAgICAgICAgICAgCWNoYW4tPmNvbW1vbi5sY24gPSAwOworCQkJCX0KKworCQkJCWlmIChjaGFuLT50cmFuc21pdF9sZW5ndGgpeworCQkJCQljaGFuLT50cmFuc21pdF9sZW5ndGg9MDsKKwkJCQkJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLmRyaXZlcl9idXN5LDApOworCQkJCQljaGFuLT50eF9vZmZzZXQ9MDsKKwkJCQkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSl7CisJCQkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQkJCX0KKwkJCQl9CisJCQkJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQsMCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgV0FOX0RJU0NPTk5FQ1RJTkc6CisJCQkJaWYgKGNhcmQtPnUueC5sb2dnaW5nKXsKKwkJCQkJcHJpbnRrIChLRVJOX0lORk8gCisJCQkJCSJcbiVzOiBpbnRlcmZhY2UgJXMgZGlzY29ubmVjdGluZywgbGNuICVpIC4uLlxuIiwgCisJCQkJCWNhcmQtPmRldm5hbWUsIGRldi0+bmFtZSxjaGFuLT5jb21tb24ubGNuKTsKKwkJCQl9CisJCQkJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLmRpc2Nvbm5lY3QsMCk7CisJCQkJYnJlYWs7CisJCX0KKwkJY2hhbi0+Y29tbW9uLnN0YXRlID0gc3RhdGU7CisJfQorCWNoYW4tPnN0YXRlX3RpY2sgPSBqaWZmaWVzOworCXJlc3RvcmVfZmxhZ3MoZmxhZ3MpOworfQorCisvKgorICogCVNlbmQgcGFja2V0IG9uIGEgbG9naWNhbCBjaGFubmVsLgorICoJCVdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHR4X3NrYiBmaWVsZCBvZiB0aGUgY2hhbm5lbCBkYXRhIAorICoJCXNwYWNlIHBvaW50cyB0byB0aGUgdHJhbnNtaXQgc29ja2V0IGJ1ZmZlci4gIFdoZW4gdHJhbnNtaXNzaW9uIAorICoJCWlzIGNvbXBsZXRlLCByZWxlYXNlIHNvY2tldCBidWZmZXIgYW5kIHJlc2V0ICd0YnVzeScgZmxhZy4KKyAqCisgKiAJUmV0dXJuOgkJMAktIHRyYW5zbWlzc2lvbiBjb21wbGV0ZQorICoJCQkxCS0gYnVzeQorICoKKyAqIAlOb3RlczoKKyAqIAkxLiBJZiBwYWNrZXQgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiBNVFUgZm9yIHRoaXMgY2hhbm5lbCwgd2UnbGwgZnJhZ21lbnQKKyAqICAgIAl0aGUgcGFja2V0IGludG8gJ2NvbXBsZXRlIHNlcXVlbmNlJyB1c2luZyBNLWJpdC4KKyAqIAkyLiBXaGVuIHRyYW5zbWlzc2lvbiBpcyBjb21wbGV0ZSwgYW4gZXZlbnQgbm90aWZpY2F0aW9uIHNob3VsZCBiZSBpc3N1ZWQKKyAqICAgIAl0byB0aGUgcm91dGVyLgorICovCisKK3N0YXRpYyBpbnQgY2hhbl9zZW5kKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIHZvaWQqIGJ1ZmYsIHVuc2lnbmVkIGRhdGFfbGVuLAorCQkgICAgIHVuc2lnbmVkIGNoYXIgdHhfaW50cikKK3sKKwl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoYW4tPmNhcmQ7CisJVFgyNVN0YXR1cyogc3RhdHVzID0gY2FyZC0+ZmxhZ3M7CisJdW5zaWduZWQgbGVuPTAsIHFkbT0wLCByZXM9MCwgb3JpZ19sZW4gPSAwOworCXZvaWQgKmRhdGE7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgY2hhbm5lbCBpcyByZWFkeSAqLworCWlmICgoIShzdGF0dXMtPmNmbGFnc1tjaGFuLT5jaF9pZHhdICYgMHg0MCkgJiYgIWNhcmQtPnUueC5MQVBCX2hkbGMpICB8fCAKKyAgICAgICAgICAgICAhKCpjYXJkLT51LnguaGRsY19idWZfc3RhdHVzICYgMHg0MCkpeyAKKyAgICAgICAgICAgIAorCQlpZiAoIXR4X2ludHIpeworCQkJc2V0dXBfZm9yX2RlbGF5ZWRfdHJhbnNtaXQgKGRldiwgYnVmZiwgZGF0YV9sZW4pOworCQkJcmV0dXJuIDA7CisJCX1lbHNleworCQkJLyogQnkgcmV0dXJuaW5nIDAgdG8gdHhfaW50ciB0aGUgcGFja2V0IHdpbGwgYmUgZHJvcHBlZCAqLworCQkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJCSsrY2hhbi0+aWZzdGF0cy50eF9kcm9wcGVkOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVSUk9SLCBUeCBpbnRyIGNvdWxkIG5vdCBzZW5kLCBkcm9wcGluZyAlczpcbiIsIAorCQkJCWNhcmQtPmRldm5hbWUsZGV2LT5uYW1lKTsKKwkJCSsrY2hhbi0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfYmZyX25vdF9wYXNzZWRfdG9fYWRwdHI7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmIChjaGFuLT5jb21tb24udXNlZGJ5ID09IEFQSSl7CisJCS8qIFJlbW92ZSB0aGUgQVBJIEhlYWRlciAqLworCQl4MjVhcGlfaGRyX3QgKmFwaV9kYXRhID0gKHgyNWFwaV9oZHJfdCAqKWJ1ZmY7CisKKwkJLyogU2V0IHRoZSBxZG0gYml0cyBmcm9tIHRoZSBwYWNrZXQgaGVhZGVyIAorICAgICAgICAgICAgICAgICAqIFVzZXIgaGFzIHRoZSBvcHRpb24gdG8gc2V0IHRoZSBxZG0gYml0cworICAgICAgICAgICAgICAgICAqLworCQlxZG0gPSBhcGlfZGF0YS0+cWRtOworCisJCW9yaWdfbGVuID0gbGVuID0gZGF0YV9sZW4gLSBzaXplb2YoeDI1YXBpX2hkcl90KTsKKwkJZGF0YSA9ICh1bnNpZ25lZCBjaGFyKilidWZmICsgc2l6ZW9mKHgyNWFwaV9oZHJfdCk7CisJfWVsc2V7CisJCWRhdGEgPSBidWZmOworCQlvcmlnX2xlbiA9IGxlbiA9IGRhdGFfbGVuOworCX0JCisKKwlpZiAodHhfaW50cil7CisJCS8qIFdlIGFyZSBpbiB0eF9pbnRyLCBtaW51cyB0aGUgdHhfb2Zmc2V0IGZyb20gCisgICAgICAgICAgICAgICAgICogdGhlIHRvdGFsIGxlbmd0aC4gVGhlIHR4X29mZnNldCBwYXJ0IG9mIHRoZQorCQkgKiBkYXRhIGhhcyBhbHJlYWR5IGJlZW4gc2VudC4gQWxzbywgbW92ZSB0aGUgCisJCSAqIGRhdGEgcG9pbnRlciB0byBwcm9wZXIgb2Zmc2V0IGxvY2F0aW9uLgorICAgICAgICAgICAgICAgICAqLworCQlsZW4gLT0gY2hhbi0+dHhfb2Zmc2V0OworCQlkYXRhID0gKHVuc2lnbmVkIGNoYXIqKWRhdGEgKyBjaGFuLT50eF9vZmZzZXQ7CisJfQorCQkKKwkvKiBDaGVjayBpZiB0aGUgcGFja2V0IGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gTVRVCisgICAgICAgICAqIElmIFlFUzogQ3V0IHRoZSBsZW4gdG8gTVRVIGFuZCBzZXQgdGhlIE0gYml0IAorICAgICAgICAgKi8KKwlpZiAobGVuID4gY2hhbi0+dHhfcGt0X3NpemUgJiYgIWNhcmQtPnUueC5MQVBCX2hkbGMpeworCQlsZW4gPSBjaGFuLT50eF9wa3Rfc2l6ZTsKKwkJcWRtIHw9IE1fQklUOwkJCisJfSAKKworCisJLyogUGFzcyBvbmx5IGZpcnN0IHRocmVlIGJpdHMgb2YgdGhlIHFkbSBieXRlIHRvIHRoZSBzZW5kCisgICAgICAgICAqIHJvdXRpbmUuIEluIGNhc2UgdXNlciBzZXRzIGFueSBvdGhlciBiaXQgd2hpY2ggbWlnaHQKKyAgICAgICAgICogY2F1c2UgZXJyb3JzLiAKKyAgICAgICAgICovCisKKwlzd2l0Y2goeDI1X3NlbmQoY2FyZCwgY2hhbi0+Y29tbW9uLmxjbiwgKHFkbSYweDA3KSwgbGVuLCBkYXRhKSl7CisJCWNhc2UgMHgwMDoJLyogc3VjY2VzcyAqLworCQkJY2hhbi0+aV90aW1lb3V0X3NvZmFyID0gamlmZmllczsKKworCQkJZGV2LT50cmFuc19zdGFydD1qaWZmaWVzOworCQkJCisJCQlpZiAoKHFkbSAmIE1fQklUKSAmJiAhY2FyZC0+dS54LkxBUEJfaGRsYyl7CisJCQkJaWYgKCF0eF9pbnRyKXsKKwkJCQkJLyogVGhlIE0gYml0IHdhcyBzZXQsIHdoaWNoIG1lYW5zIHRoYXQgcGFydCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwYWNrZXQgaGFzIGJlZW4gc2VudC4gQ29weSB0aGUgcGFja2V0IGludG8gYSBidWZmZXIKKwkJCQkgICAgICAgICAqIGFuZCBzZXQgdGhlIG9mZnNldCB0byBsZW4sIHNvIG9uIG5leHQgdHhfaW50ZXIgCisJCQkJCSAqIHRoZSBwYWNrZXQgd2lsbCBiZSBzZW50IHVzaW5nIHRoZSBiZWxvdyBvZmZzZXQuCisJCQkJCSAqLworCQkJCQljaGFuLT50eF9vZmZzZXQgKz0gbGVuOworCisJCQkJCSsrY2hhbi0+aWZzdGF0cy50eF9wYWNrZXRzOworCQkJCQljaGFuLT5pZnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKwkJCQkJCisJCQkJCWlmIChjaGFuLT50eF9vZmZzZXQgPCBvcmlnX2xlbil7CisJCQkJCQlzZXR1cF9mb3JfZGVsYXllZF90cmFuc21pdCAoZGV2LCBidWZmLCBkYXRhX2xlbik7CisJCQkJCX0KKwkJCQkJcmVzPTA7CisJCQkJfWVsc2V7CisJCQkJCS8qIFdlIGFyZSBhbHJlYWR5IGluIHR4X2ludGVyLCB0aHVzIGRhdGEgaXMgYWxyZWFkeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGluIHRoZSBidWZmZXIuIFVwZGF0ZSB0aGUgb2Zmc2V0IGFuZCB3YWl0IGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG5leHQgdHhfaW50ci4gV2UgYWRkIG9uIHRvIHRoZSBvZmZzZXQsIHNpbmNlIGRhdGEgY2FuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmUgWCBudW1iZXIgb2YgdGltZXMgbGFyZ2VyIHRoYW4gbWF4IGRhdGEgc2l6ZS4KKwkJCQkJICovCisJCQkJCSsrY2hhbi0+aWZzdGF0cy50eF9wYWNrZXRzOworCQkJCQljaGFuLT5pZnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKwkJCQkJCisJCQkJCSsrY2hhbi0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfYmZyX3Bhc3NlZF90b19hZHB0cjsKKwkJCQkJY2hhbi0+dHhfb2Zmc2V0ICs9IGxlbjsKKworCQkJCQkvKiBUaGUgdXNlciBjYW4gc2V0IHRoZSBxZG0gYml0IGFzIHdlbGwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSWYgdGhlIGVudGlyZSBwYWNrZXQgd2FzIHNlbnQgYW5kIHFkbSBpcyBzdGlsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNldCwgdGhhbiBpdCdzIHRoZSB1c2VyIHdobyBoYXMgc2V0IHRoZSBNIGJpdC4gSW4gdGhhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjYXNlIGluZGljYXRlIHRoYXQgdGhlIHBhY2tldCB3YXMgc2VuZCBieSByZXR1cm5pbmcgCisJCQkJCSAqIDAgYW5kIHdhaXQgZm9yIGEgbmV3IHBhY2tldC4gT3RoZXJ3aXNlLCB3YWl0IGZvciBuZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdHggaW50ZXJydXB0IHRvIHNlbmQgdGhlIHJlc3Qgb2YgdGhlIHBhY2tldCAqLworCisJCQkJCWlmIChjaGFuLT50eF9vZmZzZXQgPCBvcmlnX2xlbil7CisJCQkJCQlyZXM9MTsKKwkJCQkJfWVsc2V7CQorCQkJCQkJcmVzPTA7CisJCQkJCX0KKwkJCQl9CisJCQl9ZWxzZXsKKwkJCQkrK2NoYW4tPmlmc3RhdHMudHhfcGFja2V0czsKKwkJCQljaGFuLT5pZnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKwkJCQkrK2NoYW4tPmlmX3NlbmRfc3RhdC5pZl9zZW5kX2Jmcl9wYXNzZWRfdG9fYWRwdHI7CisJCQkJcmVzPTA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDB4MzM6CS8qIFR4IGJ1c3kgKi8KKwkJCWlmICh0eF9pbnRyKXsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogVHhfaW50cjogQmlnIEVycm9yIGRyb3BwaW5nIHBhY2tldCAlc1xuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUsZGV2LT5uYW1lKTsKKwkJCQkrK2NoYW4tPmlmc3RhdHMudHhfZHJvcHBlZDsKKwkJCQkrK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQkJCSsrY2hhbi0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfYmZyX25vdF9wYXNzZWRfdG9fYWRwdHI7CisJCQkJcmVzPTA7CisJCQl9ZWxzZXsKKwkJCQlEQkdfUFJJTlRLKEtFUk5fSU5GTyAKKwkJCQkJIiVzOiBTZW5kOiBCaWcgRXJyb3Igc2hvdWxkIGhhdmUgdHg6IHN0b3JyaW5nICVzXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSxkZXYtPm5hbWUpOworCQkJCXNldHVwX2Zvcl9kZWxheWVkX3RyYW5zbWl0IChkZXYsIGJ1ZmYsIGRhdGFfbGVuKTsJCisJCQkJcmVzPTE7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgkvKiBmYWlsdXJlICovCisJCQkrK2NoYW4tPmlmc3RhdHMudHhfZXJyb3JzOworCQkJaWYgKHR4X2ludHIpeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBUeF9pbnRyOiBGYWlsdXJlIHRvIHNlbmQsIGRyb3BwaW5nICVzXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lLGRldi0+bmFtZSk7CisJCQkJKytjaGFuLT5pZnN0YXRzLnR4X2Ryb3BwZWQ7CisJCQkJKytjYXJkLT53YW5kZXYuc3RhdHMudHhfZHJvcHBlZDsKKwkJCQkrK2NoYW4tPmlmX3NlbmRfc3RhdC5pZl9zZW5kX2Jmcl9ub3RfcGFzc2VkX3RvX2FkcHRyOworCQkJCXJlcz0wOworCQkJfWVsc2V7CisJCQkJREJHX1BSSU5USyhLRVJOX0lORk8gIiVzOiBTZW5kOiBGYWlsdXJlIHRvIHNlbmQgISEhLCBzdG9yaW5nICVzXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lLGRldi0+bmFtZSk7CQkJCisJCQkJc2V0dXBfZm9yX2RlbGF5ZWRfdHJhbnNtaXQgKGRldiwgYnVmZiwgZGF0YV9sZW4pOworCQkJCXJlcz0xOworCQkJfQorCQkJYnJlYWs7CQorCX0KKwlyZXR1cm4gcmVzOworfQorCisKKy8qCisgKiAJUGFyc2UgWC4yNSBjYWxsIHJlcXVlc3QgZGF0YSBhbmQgZmlsbCB4MjVfY2FsbF9pbmZvX3Qgc3RydWN0dXJlLgorICovCisKK3N0YXRpYyB2b2lkIHBhcnNlX2NhbGxfaW5mbyAodW5zaWduZWQgY2hhciogc3RyLCB4MjVfY2FsbF9pbmZvX3QqIGluZm8pCit7CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZih4MjVfY2FsbF9pbmZvX3QpKTsKKwlmb3IgKDsgKnN0cjsgKytzdHIpCisJeworCQlpbnQgaTsKKwkJdW5zaWduZWQgY2hhciBjaDsKKworCQlpZiAoKnN0ciA9PSAnLScpIHN3aXRjaCAoc3RyWzFdKSB7CisKKwkJCS8qIFRha2UgbWludXMgMiBvZmYgdGhlIG1heGltdW0gc2l6ZSBzbyB0aGF0IAorICAgICAgICAgICAgICAgICAgICAgICAgICogbGFzdCBieXRlIGlzIDAuIFRoaXMgd2F5IHdlIGNhbiB1c2Ugc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBtYW5pcHVsYXRvbiBmdW5jdGlvbnMgb24gY2FsbCBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJCQljYXNlICdkJzoJLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworCQkJCWZvciAoaSA9IDA7IGkgPCAoTUFYX1gyNV9BRERSX1NJWkUtMik7ICsraSl7CisJCQkJCWNoID0gc3RyWzIraV07CisJCQkJCWlmIChpc3NwYWNlKGNoKSkgYnJlYWs7CisJCQkJCWluZm8tPmRlc3RbaV0gPSBjaDsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgJ3MnOgkvKiBzb3VyY2UgYWRkcmVzcyAqLworCQkJCWZvciAoaSA9IDA7IGkgPCAoTUFYX1gyNV9BRERSX1NJWkUtMik7ICsraSl7CisJCQkJCWNoID0gc3RyWzIraV07CisJCQkJCWlmIChpc3NwYWNlKGNoKSkgYnJlYWs7CisJCQkJCWluZm8tPnNyY1tpXSA9IGNoOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSAndSc6CS8qIHVzZXIgZGF0YSAqLworCQkJCWZvciAoaSA9IDA7IGkgPCAoTUFYX1gyNV9EQVRBX1NJWkUtMik7ICsraSl7CisJCQkJCWNoID0gc3RyWzIraV07CisJCQkJCWlmIChpc3NwYWNlKGNoKSkgYnJlYWs7CisJCQkJCWluZm8tPnVzZXJbaV0gPSBjaDsgCisJCQkJfQorCQkJCWluZm8tPm51c2VyID0gaTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAnZic6CS8qIGZhY2lsaXRpZXMgKi8KKwkJCQlmb3IgKGkgPSAwOyBpIDwgKE1BWF9YMjVfRkFDTF9TSVpFLTIpOyArK2kpeworCQkJCQljaCA9IHN0clsyK2ldOworCQkJCQlpZiAoaXNzcGFjZShjaCkpIGJyZWFrOworCQkJCQlpbmZvLT5mYWNpbFtpXSA9IGNoOworCQkJCX0KKwkJCQlpbmZvLT5uZmFjaWwgPSBpOworCQkJCWJyZWFrOworCQl9CisJfQorfQorCisvKgorICogCUNvbnZlcnQgbGluZSBzcGVlZCBpbiBicHMgdG8gYSBudW1iZXIgdXNlZCBieSBTNTAyIGNvZGUuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYnBzX3RvX3NwZWVkX2NvZGUgKHVuc2lnbmVkIGxvbmcgYnBzKQoreworCXVuc2lnbmVkIGNoYXIJbnVtYmVyOworCisJaWYgKGJwcyA8PSAxMjAwKSAgICAgICAgbnVtYmVyID0gMHgwMTsKKwllbHNlIGlmIChicHMgPD0gMjQwMCkgICBudW1iZXIgPSAweDAyOworCWVsc2UgaWYgKGJwcyA8PSA0ODAwKSAgIG51bWJlciA9IDB4MDM7CisJZWxzZSBpZiAoYnBzIDw9IDk2MDApICAgbnVtYmVyID0gMHgwNDsKKwllbHNlIGlmIChicHMgPD0gMTkyMDApICBudW1iZXIgPSAweDA1OworCWVsc2UgaWYgKGJwcyA8PSAzODQwMCkgIG51bWJlciA9IDB4MDY7CisJZWxzZSBpZiAoYnBzIDw9IDQ1MDAwKSAgbnVtYmVyID0gMHgwNzsKKwllbHNlIGlmIChicHMgPD0gNTYwMDApICBudW1iZXIgPSAweDA4OworCWVsc2UgaWYgKGJwcyA8PSA2NDAwMCkgIG51bWJlciA9IDB4MDk7CisJZWxzZSBpZiAoYnBzIDw9IDc0MDAwKSAgbnVtYmVyID0gMHgwQTsKKwllbHNlIGlmIChicHMgPD0gMTEyMDAwKSBudW1iZXIgPSAweDBCOworCWVsc2UgaWYgKGJwcyA8PSAxMjgwMDApIG51bWJlciA9IDB4MEM7CisJZWxzZSBudW1iZXIgPSAweDBEOworCisJcmV0dXJuIG51bWJlcjsKK30KKworLyoKKyAqIAlDb252ZXJ0IGRlY2ltYWwgc3RyaW5nIHRvIHVuc2lnbmVkIGludGVnZXIuCisgKiAJSWYgbGVuICE9IDAgdGhlbiBvbmx5ICdsZW4nIGNoYXJhY3RlcnMgb2YgdGhlIHN0cmluZyBhcmUgY29udmVydGVkLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVjX3RvX3VpbnQgKHVuc2lnbmVkIGNoYXIqIHN0ciwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCB2YWw7CisKKwlpZiAoIWxlbikgCisJCWxlbiA9IHN0cmxlbihzdHIpOworCisJZm9yICh2YWwgPSAwOyBsZW4gJiYgaXNfZGlnaXQoKnN0cik7ICsrc3RyLCAtLWxlbikKKwkJdmFsID0gKHZhbCAqIDEwKSArICgqc3RyIC0gKHVuc2lnbmVkKScwJyk7CisJCisJcmV0dXJuIHZhbDsKK30KKworLyoKKyAqIAlDb252ZXJ0IGhleCBzdHJpbmcgdG8gdW5zaWduZWQgaW50ZWdlci4KKyAqIAlJZiBsZW4gIT0gMCB0aGVuIG9ubHkgJ2xlbicgY2hhcmFjdGVycyBvZiB0aGUgc3RyaW5nIGFyZSBjb25mZXJ0ZWQuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBoZXhfdG9fdWludCAodW5zaWduZWQgY2hhciogc3RyLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIHZhbCwgY2g7CisKKwlpZiAoIWxlbikgCisJCWxlbiA9IHN0cmxlbihzdHIpOworCisJZm9yICh2YWwgPSAwOyBsZW47ICsrc3RyLCAtLWxlbikKKwl7CisJCWNoID0gKnN0cjsKKwkJaWYgKGlzX2RpZ2l0KGNoKSkKKwkJCXZhbCA9ICh2YWwgPDwgNCkgKyAoY2ggLSAodW5zaWduZWQpJzAnKTsKKwkJZWxzZSBpZiAoaXNfaGV4X2RpZ2l0KGNoKSkKKwkJCXZhbCA9ICh2YWwgPDwgNCkgKyAoKGNoICYgMHhERikgLSAodW5zaWduZWQpJ0EnICsgMTApOworCQllbHNlIGJyZWFrOworCX0KKwlyZXR1cm4gdmFsOworfQorCisKK3N0YXRpYyBpbnQgaGFuZGxlX0lQWFdBTih1bnNpZ25lZCBjaGFyICpzZW5kcGFja2V0LCBjaGFyICpkZXZuYW1lLCB1bnNpZ25lZCBjaGFyIGVuYWJsZV9JUFgsIHVuc2lnbmVkIGxvbmcgbmV0d29ya19udW1iZXIsIHVuc2lnbmVkIHNob3J0IHByb3RvKQoreworCWludCBpOworCisJaWYoIHByb3RvID09IEVUSF9QX0lQWCkgeworCQkvKiBJdCdzIGFuIElQWCBwYWNrZXQgKi8KKwkJaWYoIWVuYWJsZV9JUFgpIHsKKwkJCS8qIFJldHVybiAxIHNvIHdlIGRvbid0IHBhc3MgaXQgdXAgdGhlIHN0YWNrLiAqLworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UgeworCQkvKiBJdCdzIG5vdCBJUFggc28gcGFzcyBpdCB1cCB0aGUgc3RhY2suKi8gCisJCXJldHVybiAwOworCX0KKworCWlmKCBzZW5kcGFja2V0WzE2XSA9PSAweDkwICYmCisJICAgIHNlbmRwYWNrZXRbMTddID09IDB4MDQpCisJeworCQkvKiBJdCdzIElQWFdBTiAgKi8KKworCQlpZiggc2VuZHBhY2tldFsyXSA9PSAweDAyICYmCisJCSAgICBzZW5kcGFja2V0WzM0XSA9PSAweDAwKQorCQl7CisJCQkvKiBJdCdzIGEgdGltZXIgcmVxdWVzdCBwYWNrZXQgKi8KKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSZWNlaXZlZCBJUFhXQU4gVGltZXIgUmVxdWVzdCBwYWNrZXRcbiIsZGV2bmFtZSk7CisKKwkJCS8qIEdvIHRocm91Z2ggdGhlIHJvdXRpbmcgb3B0aW9ucyBhbmQgYW5zd2VyIG5vIHRvIGV2ZXJ5CisJCQkgKiBvcHRpb24gZXhjZXB0IFVubnVtYmVyZWQgUklQL1NBUAorCQkJICovCisJCQlmb3IoaSA9IDQxOyBzZW5kcGFja2V0W2ldID09IDB4MDA7IGkgKz0gNSkKKwkJCXsKKwkJCQkvKiAweDAyIGlzIHRoZSBvcHRpb24gZm9yIFVubnVtYmVyZWQgUklQL1NBUCAqLworCQkJCWlmKCBzZW5kcGFja2V0W2kgKyA0XSAhPSAweDAyKQorCQkJCXsKKwkJCQkJc2VuZHBhY2tldFtpICsgMV0gPSAwOworCQkJCX0KKwkJCX0KKworCQkJLyogU2tpcCBvdmVyIHRoZSBleHRlbmRlZCBOb2RlIElEIG9wdGlvbiAqLworCQkJaWYoIHNlbmRwYWNrZXRbaV0gPT0gMHgwNCApCisJCQl7CisJCQkJaSArPSA4OworCQkJfQorCisJCQkvKiBXZSBhbHNvIHdhbnQgdG8gdHVybiBvZmYgYWxsIGhlYWRlciBjb21wcmVzc2lvbiBvcHQuIAkJCSAqLyAKKwkJCWZvcig7IHNlbmRwYWNrZXRbaV0gPT0gMHg4MCA7KQorCQkJeworCQkJCXNlbmRwYWNrZXRbaSArIDFdID0gMDsKKwkJCQlpICs9IChzZW5kcGFja2V0W2kgKyAyXSA8PCA4KSArIChzZW5kcGFja2V0W2kgKyAzXSkgKyA0OworCQkJfQorCisJCQkvKiBTZXQgdGhlIHBhY2tldCB0eXBlIHRvIHRpbWVyIHJlc3BvbnNlICovCisJCQlzZW5kcGFja2V0WzM0XSA9IDB4MDE7CisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTZW5kaW5nIElQWFdBTiBUaW1lciBSZXNwb25zZVxuIixkZXZuYW1lKTsKKwkJfQorCQllbHNlIGlmKCBzZW5kcGFja2V0WzM0XSA9PSAweDAyICkKKwkJeworCQkJLyogVGhpcyBpcyBhbiBpbmZvcm1hdGlvbiByZXF1ZXN0IHBhY2tldCAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlY2VpdmVkIElQWFdBTiBJbmZvcm1hdGlvbiBSZXF1ZXN0IHBhY2tldFxuIixkZXZuYW1lKTsKKworCQkJLyogU2V0IHRoZSBwYWNrZXQgdHlwZSB0byBpbmZvcm1hdGlvbiByZXNwb25zZSAqLworCQkJc2VuZHBhY2tldFszNF0gPSAweDAzOworCisJCQkvKiBTZXQgdGhlIHJvdXRlciBuYW1lICovCisJCQlzZW5kcGFja2V0WzUxXSA9ICdYJzsKKwkJCXNlbmRwYWNrZXRbNTJdID0gJ1QnOworCQkJc2VuZHBhY2tldFs1M10gPSAnUCc7CisJCQlzZW5kcGFja2V0WzU0XSA9ICdJJzsKKwkJCXNlbmRwYWNrZXRbNTVdID0gJ1AnOworCQkJc2VuZHBhY2tldFs1Nl0gPSAnRSc7CisJCQlzZW5kcGFja2V0WzU3XSA9ICctJzsKKwkJCXNlbmRwYWNrZXRbNThdID0gQ1ZIZXhUb0FzY2lpKG5ldHdvcmtfbnVtYmVyID4+IDI4KTsKKwkJCXNlbmRwYWNrZXRbNTldID0gQ1ZIZXhUb0FzY2lpKChuZXR3b3JrX251bWJlciAmIDB4MEYwMDAwMDApPj4gMjQpOworCQkJc2VuZHBhY2tldFs2MF0gPSBDVkhleFRvQXNjaWkoKG5ldHdvcmtfbnVtYmVyICYgMHgwMEYwMDAwMCk+PiAyMCk7CisJCQlzZW5kcGFja2V0WzYxXSA9IENWSGV4VG9Bc2NpaSgobmV0d29ya19udW1iZXIgJiAweDAwMEYwMDAwKT4+IDE2KTsKKwkJCXNlbmRwYWNrZXRbNjJdID0gQ1ZIZXhUb0FzY2lpKChuZXR3b3JrX251bWJlciAmIDB4MDAwMEYwMDApPj4gMTIpOworCQkJc2VuZHBhY2tldFs2M10gPSBDVkhleFRvQXNjaWkoKG5ldHdvcmtfbnVtYmVyICYgMHgwMDAwMEYwMCk+PiA4KTsKKwkJCXNlbmRwYWNrZXRbNjRdID0gQ1ZIZXhUb0FzY2lpKChuZXR3b3JrX251bWJlciAmIDB4MDAwMDAwRjApPj4gNCk7CisJCQlzZW5kcGFja2V0WzY1XSA9IENWSGV4VG9Bc2NpaShuZXR3b3JrX251bWJlciAmIDB4MDAwMDAwMEYpOworCQkJZm9yKGkgPSA2NjsgaSA8IDk5OyBpKz0gMSkKKwkJCXsKKwkJCQlzZW5kcGFja2V0W2ldID0gMDsKKwkJCX0KKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNlbmRpbmcgSVBYV0FOIEluZm9ybWF0aW9uIFJlc3BvbnNlIHBhY2tldFxuIixkZXZuYW1lKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbmtub3duIElQWFdBTiBwYWNrZXQhXG4iLGRldm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBTZXQgdGhlIFdOb2RlSUQgdG8gb3VyIG5ldHdvcmsgYWRkcmVzcyAqLworCQlzZW5kcGFja2V0WzM1XSA9ICh1bnNpZ25lZCBjaGFyKShuZXR3b3JrX251bWJlciA+PiAyNCk7CisJCXNlbmRwYWNrZXRbMzZdID0gKHVuc2lnbmVkIGNoYXIpKChuZXR3b3JrX251bWJlciAmIDB4MDBGRjAwMDApID4+IDE2KTsKKwkJc2VuZHBhY2tldFszN10gPSAodW5zaWduZWQgY2hhcikoKG5ldHdvcmtfbnVtYmVyICYgMHgwMDAwRkYwMCkgPj4gOCk7CisJCXNlbmRwYWNrZXRbMzhdID0gKHVuc2lnbmVkIGNoYXIpKG5ldHdvcmtfbnVtYmVyICYgMHgwMDAwMDBGRik7CisKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJLypJZiB3ZSBnZXQgaGVyZSBpdCdzIGFuIElQWC1kYXRhIHBhY2tldCwgc28gaXQnbGwgZ2V0IHBhc3NlZCB1cCB0aGUgc3RhY2suCisJCSAqLworCQkvKiBzd2l0Y2ggdGhlIG5ldHdvcmsgbnVtYmVycyAqLworCQlzd2l0Y2hfbmV0X251bWJlcnMoc2VuZHBhY2tldCwgbmV0d29ya19udW1iZXIsIDEpOwkKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKgorICogIAlJZiBpbmNvbWluZyBpcyAwIChvdXRnb2luZyktIGlmIHRoZSBuZXQgbnVtYmVycyBpcyBvdXJzIG1ha2UgaXQgMAorICogIAlpZiBpbmNvbWluZyBpcyAxIC0gaWYgdGhlIG5ldCBudW1iZXIgaXMgMCBtYWtlIGl0IG91cnMgCisgKi8KKworc3RhdGljIHZvaWQgc3dpdGNoX25ldF9udW1iZXJzKHVuc2lnbmVkIGNoYXIgKnNlbmRwYWNrZXQsIHVuc2lnbmVkIGxvbmcgbmV0d29ya19udW1iZXIsIHVuc2lnbmVkIGNoYXIgaW5jb21pbmcpCit7CisJdW5zaWduZWQgbG9uZyBwbmV0d29ya19udW1iZXI7CisKKwlwbmV0d29ya19udW1iZXIgPSAodW5zaWduZWQgbG9uZykoKHNlbmRwYWNrZXRbNl0gPDwgMjQpICsgCisJCQkgIChzZW5kcGFja2V0WzddIDw8IDE2KSArIChzZW5kcGFja2V0WzhdIDw8IDgpICsgCisJCQkgIHNlbmRwYWNrZXRbOV0pOworCQorCisJaWYgKCFpbmNvbWluZykgeworCQkvKklmIHRoZSBkZXN0aW5hdGlvbiBuZXR3b3JrIG51bWJlciBpcyBvdXJzLCBtYWtlIGl0IDAgKi8KKwkJaWYoIHBuZXR3b3JrX251bWJlciA9PSBuZXR3b3JrX251bWJlcikgeworCQkJc2VuZHBhY2tldFs2XSA9IHNlbmRwYWNrZXRbN10gPSBzZW5kcGFja2V0WzhdID0gCisJCQkJCSBzZW5kcGFja2V0WzldID0gMHgwMDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIElmIHRoZSBpbmNvbWluZyBuZXR3b3JrIGlzIDAsIG1ha2UgaXQgb3VycyAqLworCQlpZiggcG5ldHdvcmtfbnVtYmVyID09IDApIHsKKwkJCXNlbmRwYWNrZXRbNl0gPSAodW5zaWduZWQgY2hhcikobmV0d29ya19udW1iZXIgPj4gMjQpOworCQkJc2VuZHBhY2tldFs3XSA9ICh1bnNpZ25lZCBjaGFyKSgobmV0d29ya19udW1iZXIgJiAKKwkJCQkJIDB4MDBGRjAwMDApID4+IDE2KTsKKwkJCXNlbmRwYWNrZXRbOF0gPSAodW5zaWduZWQgY2hhcikoKG5ldHdvcmtfbnVtYmVyICYgCisJCQkJCSAweDAwMDBGRjAwKSA+PiA4KTsKKwkJCXNlbmRwYWNrZXRbOV0gPSAodW5zaWduZWQgY2hhcikobmV0d29ya19udW1iZXIgJiAKKwkJCQkJIDB4MDAwMDAwRkYpOworCQl9CisJfQorCisKKwlwbmV0d29ya19udW1iZXIgPSAodW5zaWduZWQgbG9uZykoKHNlbmRwYWNrZXRbMThdIDw8IDI0KSArIAorCQkJICAoc2VuZHBhY2tldFsxOV0gPDwgMTYpICsgKHNlbmRwYWNrZXRbMjBdIDw8IDgpICsgCisJCQkgIHNlbmRwYWNrZXRbMjFdKTsKKwkKKwkKKwlpZiggIWluY29taW5nICkgeworCQkvKiBJZiB0aGUgc291cmNlIG5ldHdvcmsgaXMgb3VycywgbWFrZSBpdCAwICovCisJCWlmKCBwbmV0d29ya19udW1iZXIgPT0gbmV0d29ya19udW1iZXIpIHsKKwkJCXNlbmRwYWNrZXRbMThdID0gc2VuZHBhY2tldFsxOV0gPSBzZW5kcGFja2V0WzIwXSA9IAorCQkJCSBzZW5kcGFja2V0WzIxXSA9IDB4MDA7CisJCX0KKwl9IGVsc2UgeworCQkvKiBJZiB0aGUgc291cmNlIG5ldHdvcmsgaXMgMCwgbWFrZSBpdCBvdXJzICovCisJCWlmKCBwbmV0d29ya19udW1iZXIgPT0gMCApIHsKKwkJCXNlbmRwYWNrZXRbMThdID0gKHVuc2lnbmVkIGNoYXIpKG5ldHdvcmtfbnVtYmVyID4+IDI0KTsKKwkJCXNlbmRwYWNrZXRbMTldID0gKHVuc2lnbmVkIGNoYXIpKChuZXR3b3JrX251bWJlciAmIAorCQkJCQkgMHgwMEZGMDAwMCkgPj4gMTYpOworCQkJc2VuZHBhY2tldFsyMF0gPSAodW5zaWduZWQgY2hhcikoKG5ldHdvcmtfbnVtYmVyICYgCisJCQkJCSAweDAwMDBGRjAwKSA+PiA4KTsKKwkJCXNlbmRwYWNrZXRbMjFdID0gKHVuc2lnbmVkIGNoYXIpKG5ldHdvcmtfbnVtYmVyICYgCisJCQkJCSAweDAwMDAwMEZGKTsKKwkJfQorCX0KK30gLyogc3dpdGNoX25ldF9udW1iZXJzICovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKiogWDI1QVBJIFNQRUNJRklDIEZVTkNUSU9OUyAqKioqKioqKioqKioqKioqLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgZmluZF9jaGFubmVsCisgKgorICoJTWFuYWdlcyB0aGUgbGNuIHRvIGRldmljZSBtYXAuIEl0IGluY3JlYXNlcyBwZXJmb3JtYW5jZQorICogICAgICBiZWNhdXNlIGl0IGVsaW1pbmF0ZXMgdGhlIG5lZWQgdG8gc2VhcmNoIHRocm91Z2ggdGhlIGxpbmsgIAorICogICAgICBsaXN0IGZvciBhIGRldmljZSB3aGljaCBpcyBib3VuZGVkIHRvIGEgc3BlY2lmaWMgbGNuLgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCitzdHJ1Y3QgbmV0X2RldmljZSAqZmluZF9jaGFubmVsKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbGNuKQoreworCWlmIChjYXJkLT51LnguTEFQQl9oZGxjKXsKKworCQlyZXR1cm4gY2FyZC0+d2FuZGV2LmRldjsKKworCX1lbHNleworCQkvKiBXZSBkb24ndCBrbm93IHdoZXRoZXIgdGhlIGluY29taW5nIGxjbgorICAgICAgICAgICAgICAgICAqIGlzIGEgUFZDIG9yIGFuIFNWQyBjaGFubmVsLiBCdXQgd2UgZG8ga25vdyB0aGF0CisgICAgICAgICAgICAgICAgICogdGhlIGxjbiBjYW5ub3QgYmUgZm9yIGJvdGggdGhlIFBWQyBhbmQgdGhlIFNWQworICAgICAgICAgICAgICAgICAqIGNoYW5uZWwuCisKKwkJICogSWYgdGhlIGxjbiBudW1iZXIgaXMgZ3JlYXRlciBvciBlcXVhbCB0byAyNTUsIAorICAgICAgICAgICAgICAgICAqIHRha2UgdGhlIG1vZHVsbyAyNTUgb2YgdGhhdCBudW1iZXIuIFdlIG9ubHkgaGF2ZQorICAgICAgICAgICAgICAgICAqIDI1NSBsb2NhdGlvbnMsIHRodXMgaGlnaGVyIG51bWJlcnMgbXVzdCBiZSBtYXBwZWQKKyAgICAgICAgICAgICAgICAgKiB0byBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDI0NS4gCisKKwkJICogV2UgbXVzdCBzZXBhcmF0ZSBwdmMncyBhbmQgc3ZjJ3Mgc2luY2UgdHdvIGRvbid0CisgICAgICAgICAgICAgICAgICogaGF2ZSB0byBiZSBjb250aWd1b3VzLiAgTWVhbmluZyBwdmMncyBjYW4gc3RhcnQKKyAgICAgICAgICAgICAgICAgKiBmcm9tIDEgdG8gMTAgYW5kIHN2YydzIGNhbiBzdGFydCBmcm9tIDI1NiB0byAyNjYuCisgICAgICAgICAgICAgICAgICogQnV0IDI1NiUyNTUgaXMgMSwgaS5lLiBDT05GTElDVC4KKwkJICovCisKKworCQkvKiBIaWdoZXN0IExDTiBudW1iZXIgbXVzdCBiZSBsZXNzIG9yIGVxdWFsIHRvIDQwOTYgKi8KKwkJaWYgKChsY24gPD0gTUFYX0xDTl9OVU0pICYmIChsY24gPiAwKSl7CisKKwkJCWlmIChsY24gPCBYMjVfTUFYX0NIQU4peworCQkJCWlmIChjYXJkLT51Lnguc3ZjX3RvX2Rldl9tYXBbbGNuXSkKKwkJCQkJcmV0dXJuIGNhcmQtPnUueC5zdmNfdG9fZGV2X21hcFtsY25dOworCisJCQkJaWYgKGNhcmQtPnUueC5wdmNfdG9fZGV2X21hcFtsY25dKQorCQkJCQlyZXR1cm4gY2FyZC0+dS54LnB2Y190b19kZXZfbWFwW2xjbl07CisJCQkKKwkJCX1lbHNleworCQkJCWludCBuZXdfbGNuID0gbGNuJVgyNV9NQVhfQ0hBTjsKKwkJCQlpZiAoY2FyZC0+dS54LnN2Y190b19kZXZfbWFwW25ld19sY25dKQorCQkJCQlyZXR1cm4gY2FyZC0+dS54LnN2Y190b19kZXZfbWFwW25ld19sY25dOworCisJCQkJaWYgKGNhcmQtPnUueC5wdmNfdG9fZGV2X21hcFtuZXdfbGNuXSkKKwkJCQkJcmV0dXJuIGNhcmQtPnUueC5wdmNfdG9fZGV2X21hcFtuZXdfbGNuXTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKK3ZvaWQgYmluZF9sY25fdG9fZGV2KHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgbGNuKQoreworCXgyNV9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CisKKwkvKiBNb2R1bG8gdGhlIGxjbiBudW1iZXIgYnkgWDI1X01BWF9DSEFOICgyNTUpCisJICogYmVjYXVzZSB0aGUgbGNuIG51bWJlciBjYW4gYmUgZ3JlYXRlciB0aGFuIDI1NSAKKyAgICAgICAgICoKKwkgKiBXZSBuZWVkIHRvIHNwbGl0IHN2YyBhbmQgcHZjIHNpbmNlIHRoZXkgZG9uJ3QgaGF2ZQorICAgICAgICAgKiB0byBiZSBjb250aWdvdXMuIAorCSAqLworCisJaWYgKGNoYW4tPmNvbW1vbi5zdmMpeworCQljYXJkLT51Lnguc3ZjX3RvX2Rldl9tYXBbKGxjbiAlIFgyNV9NQVhfQ0hBTildID0gZGV2OworCX1lbHNleworCQljYXJkLT51LngucHZjX3RvX2Rldl9tYXBbKGxjbiAlIFgyNV9NQVhfQ0hBTildID0gZGV2OworCX0KKwljaGFuLT5jb21tb24ubGNuID0gbGNuOworfQorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIHgyNWFwaV9iaCAKKyAqCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHgyNWFwaV9iaChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXgyNV9jaGFubmVsX3QqIGNoYW4gPSBkZXYtPnByaXY7CisJc2RsYV90KiBjYXJkID0gY2hhbi0+Y2FyZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJaWYgKGF0b21pY19yZWFkKCZjaGFuLT5iaF9idWZmX3VzZWQpID09IDApeworCQlwcmludGsoS0VSTl9JTkZPICIlczogQkggQnVmZmVyIEVtcHR5IGluIEJIXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQljbGVhcl9iaXQoMCwgJmNoYW4tPnRxX3dvcmtpbmcpOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKGF0b21pY19yZWFkKCZjaGFuLT5iaF9idWZmX3VzZWQpKXsKKworCQkvKiBJZiB0aGUgc29jayBpcyBpbiB0aGUgcHJvY2VzcyBvZiB1bmxpbmtpbmcgdGhlCisJCSAqIGRyaXZlciBmcm9tIHRoZSBzb2NrZXQsIHdlIG11c3QgZ2V0IG91dC4gCisJCSAqIFRoaXMgbmV2ZXIgaGFwcGVuZHMgYnV0IGlzIGEgc2FuaXR5IGNoZWNrLiAqLworCQlpZiAodGVzdF9iaXQoMCwmY2hhbi0+Y29tbW9uLmNvbW1vbl9jcml0aWNhbCkpeworCQkJY2xlYXJfYml0KDAsICZjaGFuLT50cV93b3JraW5nKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJLyogSWYgTEFQQiBIRExDLCBkbyBub3QgZHJvcCBwYWNrZXRzIGlmIHNvY2tldCBpcworICAgICAgICAgICAgICAgICAqIG5vdCBjb25uZWN0ZWQuICBMZXQgdGhlIGJ1ZmZlciBmaWxsIHVwIGFuZAorICAgICAgICAgICAgICAgICAqIHR1cm4gb2ZmIHJ4IGludGVycnVwdCAqLworCQlpZiAoY2FyZC0+dS54LkxBUEJfaGRsYyl7CisJCQlpZiAoY2hhbi0+Y29tbW9uLnNrID09IE5VTEwgfHwgY2hhbi0+Y29tbW9uLmZ1bmMgPT0gTlVMTCl7CisJCQkJY2xlYXJfYml0KDAsICZjaGFuLT50cV93b3JraW5nKTsJCQkKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlza2IgID0gKChiaF9kYXRhX3QgKikmY2hhbi0+YmhfaGVhZFtjaGFuLT5iaF9yZWFkXSktPnNrYjsKKworCQlpZiAoc2tiID09IE5VTEwpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJIIFNrYiBlbXB0eSBmb3IgcmVhZCAlaVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSxjaGFuLT5iaF9yZWFkKTsKKwkJfWVsc2V7CisJCQkKKwkJCWlmIChjaGFuLT5jb21tb24uc2sgPT0gTlVMTCB8fCBjaGFuLT5jb21tb24uZnVuYyA9PSBOVUxMKXsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQkg6IFNvY2tldCBkaXNjb25uZWN0ZWQsIGRyb3BwaW5nXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCQl4MjVhcGlfYmhfY2xlYW51cChkZXYpOworCQkJCSsrY2hhbi0+aWZzdGF0cy5yeF9kcm9wcGVkOworCQkJCSsrY2hhbi0+cnhfaW50cl9zdGF0LnJ4X2ludHJfYmZyX25vdF9wYXNzZWRfdG9fc3RhY2s7CisJCQkJY29udGludWU7CisJCQl9CisKKworCQkJaWYgKGNoYW4tPmNvbW1vbi5mdW5jKHNrYixkZXYsY2hhbi0+Y29tbW9uLnNrKSAhPSAwKXsKKwkJCQkvKiBTb2NrIGZ1bGwgY2Fubm90IHNlbmQsIHF1ZXVlIHVzIGZvciBhbm90aGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRyeSAKKwkJCQkgKi8KKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQkg6ICEhISBQYWNrZXQgZmFpbGVkIHRvIHNlbmQgISEhISEgXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQkJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLnJlY2VpdmVfYmxvY2ssMSk7CisJCQkJcmV0dXJuOworCQkJfWVsc2V7CisJCQkJeDI1YXBpX2JoX2NsZWFudXAoZGV2KTsKKwkJCQkrK2NoYW4tPnJ4X2ludHJfc3RhdC5yeF9pbnRyX2Jmcl9wYXNzZWRfdG9fc3RhY2s7CisJCQl9CisJCX0KKwl9CQorCWNsZWFyX2JpdCgwLCAmY2hhbi0+dHFfd29ya2luZyk7CisKKwlyZXR1cm47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiB4MjVhcGlfYmhfY2xlYW51cCAKKyAqCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgeDI1YXBpX2JoX2NsZWFudXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCAqY2FyZCA9IGNoYW4tPmNhcmQ7CisJVFgyNVN0YXR1cyogc3RhdHVzID0gY2FyZC0+ZmxhZ3M7CisKKworCSgoYmhfZGF0YV90ICopJmNoYW4tPmJoX2hlYWRbY2hhbi0+YmhfcmVhZF0pLT5za2IgPSBOVUxMOworCisJaWYgKGNoYW4tPmJoX3JlYWQgPT0gTUFYX0JIX0JVRkYpeworCQljaGFuLT5iaF9yZWFkPTA7CisJfWVsc2V7CisJCSsrY2hhbi0+YmhfcmVhZDsJCisJfQorCisJLyogSWYgdGhlIFJlY2VpdmUgaW50ZXJydXB0IHdhcyBvZmYsIGl0IG1lYW5zCisgICAgICAgICAqIHRoYXQgd2UgZmlsbGVkIHVwIG91ciBjaXJjdWxhciBidWZmZXIuIENoZWNrICAgIAorICAgICAgICAgKiB0aGF0IHdlIGhhdmUgc3BhY2UgaW4gdGhlIGJ1ZmZlci4gSWYgc28gCisgICAgICAgICAqIHR1cm4gdGhlIFJYIGludGVycnVwdCBiYWNrIG9uLiAKKwkgKi8KKwlpZiAoIShzdGF0dXMtPmltYXNrICYgSU5UUl9PTl9SWF9GUkFNRSkpeworCQlpZiAoYXRvbWljX3JlYWQoJmNoYW4tPmJoX2J1ZmZfdXNlZCkgPCAoTUFYX0JIX0JVRkYrMSkpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJIOiBUdXJuaW5nIG9uIHRoZSBpbnRlcnJ1cHRcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJc3RhdHVzLT5pbWFzayB8PSBJTlRSX09OX1JYX0ZSQU1FOworCQl9CisJfQkKKworCWF0b21pY19kZWMoJmNoYW4tPmJoX2J1ZmZfdXNlZCk7CisJcmV0dXJuIDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIGJoX2VucXVldWUgCisgKgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGJoX2VucXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl4MjVfY2hhbm5lbF90KiBjaGFuID0gZGV2LT5wcml2OworCXNkbGFfdCAqY2FyZCA9IGNoYW4tPmNhcmQ7CisJVFgyNVN0YXR1cyogc3RhdHVzID0gY2FyZC0+ZmxhZ3M7CisKKwlpZiAoYXRvbWljX3JlYWQoJmNoYW4tPmJoX2J1ZmZfdXNlZCkgPT0gKE1BWF9CSF9CVUZGKzEpKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJvdHRvbSBoYWxmIGJ1ZmZlciBGVUxMXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQlyZXR1cm4gMTsgCisJfQorCisJKChiaF9kYXRhX3QgKikmY2hhbi0+YmhfaGVhZFtjaGFuLT5iaF93cml0ZV0pLT5za2IgPSBza2I7CisKKwlpZiAoY2hhbi0+Ymhfd3JpdGUgPT0gTUFYX0JIX0JVRkYpeworCQljaGFuLT5iaF93cml0ZT0wOworCX1lbHNleworCQkrK2NoYW4tPmJoX3dyaXRlOworCX0KKworCWF0b21pY19pbmMoJmNoYW4tPmJoX2J1ZmZfdXNlZCk7CisKKwlpZiAoYXRvbWljX3JlYWQoJmNoYW4tPmJoX2J1ZmZfdXNlZCkgPT0gKE1BWF9CSF9CVUZGKzEpKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJ1ZmZlciBpcyBub3cgZnVsbCwgVHVybmluZyBvZmYgUlggSW50clxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJc3RhdHVzLT5pbWFzayAmPSB+SU5UUl9PTl9SWF9GUkFNRTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogdGltZXJfaW50cl9jbWRfZXhlYworICogIAorICoJQ2FsbGVkIGJ5IHRpbWVyIGludGVycnVwdCB0byBleGVjdXRlIGEgY29tbWFuZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHRpbWVyX2ludHJfY21kX2V4ZWMgKHNkbGFfdCogY2FyZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXVuc2lnbmVkIGNoYXIgbW9yZV90b19leGVjPTA7CisJdm9sYXRpbGUgeDI1X2NoYW5uZWxfdCAqY2hhbj1OVUxMOworCWludCBpPTAsYmFkX2NtZD0wLGVycj0wOwkKKworCWlmIChjYXJkLT51LnguY21kX2RldiA9PSBOVUxMKXsKKwkJY2FyZC0+dS54LmNtZF9kZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCX0KKworCWRldiA9IGNhcmQtPnUueC5jbWRfZGV2OworCisJZm9yICg7Oyl7CisKKwkJY2hhbiA9IGRldi0+cHJpdjsKKwkJCisJCWlmIChhdG9taWNfcmVhZCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQpKXsgCisKKwkJCWJhZF9jbWQgPSBjaGVja19iYWRfY29tbWFuZChjYXJkLGRldik7CisKKwkJCWlmICgoIWNoYW4tPmNvbW1vbi5tYm94IHx8IGF0b21pY19yZWFkKCZjaGFuLT5jb21tb24uZGlzY29ubmVjdCkpICYmIAorCQkJICAgICAhYmFkX2NtZCl7CisKKwkJCQkvKiBTb2NrZXQgaGFzIGRpZWQgb3IgZXhpdGVkLCBXZSBtdXN0IGJyaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjaGFubmVsIGRvd24gYmVmb3JlIGFueWJvZHkgZWxzZSB0cmllcyB0byAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdXNlIGl0ICovCisJCQkJZXJyID0gY2hhbm5lbF9kaXNjb25uZWN0KGNhcmQsZGV2KTsKKwkJCX1lbHNleworCQkJICAgICAgICBlcnIgPSBleGVjdXRlX2RlbGF5ZWRfY21kKGNhcmQsIGRldiwKKwkJCQkJCQkgKG1ib3hfY21kX3QqKWNoYW4tPmNvbW1vbi5tYm94LAorCQkJCQkJCSAgYmFkX2NtZCk7CisJCQl9CisKKwkJCXN3aXRjaCAoZXJyKXsKKworCQkJY2FzZSBSRVRVUk5fUkVTVUxUOgorCisJCQkJLyogUmV0dXJuIHRoZSByZXN1bHQgdG8gdGhlIHNvY2tldCB3aXRob3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRlbGF5LiBOT19XQUlUIENvbW1hbmQgKi8JCisJCQkJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQsMCk7CisJCQkJaWYgKGF0b21pY19yZWFkKCZjYXJkLT51LnguY29tbWFuZF9idXN5KSkKKwkJCQkJYXRvbWljX3NldCgmY2FyZC0+dS54LmNvbW1hbmRfYnVzeSwwKTsKKworCQkJCXNlbmRfZGVsYXllZF9jbWRfcmVzdWx0KGNhcmQsZGV2LGNhcmQtPm1ib3gpOworCisJCQkJbW9yZV90b19leGVjPTA7CisJCQkJYnJlYWs7CisJCQljYXNlIERFTEFZX1JFU1VMVDoKKwkJCisJCQkJLyogV2FpdCBmb3IgdGhlIHJlbW90ZSB0byByZXNwb25kLCBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2VuZGluZyB0aGUgcmVzdWx0IHVwIHRvIHRoZSBzb2NrZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFdBSVQgY29tbWFuZCAqLworCQkJCWlmIChhdG9taWNfcmVhZCgmY2FyZC0+dS54LmNvbW1hbmRfYnVzeSkpCisJCQkJCWF0b21pY19zZXQoJmNhcmQtPnUueC5jb21tYW5kX2J1c3ksMCk7CisJCQkJCisJCQkJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQsMCk7CisJCQkJbW9yZV90b19leGVjPTA7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCisJCQkJLyogSWYgY29tbWFuZCBjb3VsZCBub3QgYmUgZXhlY3V0ZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNvbWUgcmVhc29uIChpLmUgcmV0dXJuIGNvZGUgMHgzMyBidXN5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzZXQgdGhlIG1vcmVfdG9fZXhlYyBiaXQgd2hpY2ggd2lsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbmRpY2F0ZSB0aGF0IHRoaXMgY29tbWFuZCBtdXN0IGJlIGV4ZWN0dWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFnYWluIGR1cmluZyBuZXh0IHRpbWVyIGludGVycnVwdCAKKwkJCQkgKi8KKwkJCQltb3JlX3RvX2V4ZWM9MTsKKwkJCQlpZiAoYXRvbWljX3JlYWQoJmNhcmQtPnUueC5jb21tYW5kX2J1c3kpID09IDApCisJCQkJCWF0b21pY19zZXQoJmNhcmQtPnUueC5jb21tYW5kX2J1c3ksMSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWJhZF9jbWQ9MDsKKworCQkJLyogSWYgZmxhZ3MgaXMgc2V0LCB0aGVyZSBhcmUgbm8gaGRsYyBidWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICogdGh1cywgd2FpdCBmb3IgdGhlIG5leHQgcGFzcyBhbmQgdHJ5IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICogc2FtZSBjb21tYW5kIGFnYWluLiBPdGhlcndpc2UsIHN0YXJ0IHNlYXJjaGluZyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGZyb20gbmV4dCBkZXZpY2Ugb24gdGhlIG5leHQgcGFzcy4gCisJCQkgKi8KKwkJCWlmICghbW9yZV90b19leGVjKXsKKwkJCQlkZXYgPSBtb3ZlX2Rldl90b19uZXh0KGNhcmQsZGV2KTsKKwkJCX0KKwkJCWJyZWFrOworCQl9ZWxzZXsKKwkJCS8qIFRoaXMgZGV2aWNlIGhhcyBub3RoaW5nIHRvIGV4ZWN1dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBnbyB0byBuZXh0LiAKKwkJCSAqLworCQkJaWYgKGF0b21pY19yZWFkKCZjYXJkLT51LnguY29tbWFuZF9idXN5KSkKKwkJCQkJYXRvbWljX3NldCgmY2FyZC0+dS54LmNvbW1hbmRfYnVzeSwwKTsKKwkJCWRldiA9IG1vdmVfZGV2X3RvX25leHQoY2FyZCxkZXYpOworCQl9CQorCisJCWlmICgrK2kgPT0gY2FyZC0+dS54Lm5vX2Rldil7CisJCQlpZiAoIW1vcmVfdG9fZXhlYyl7CisJCQkJREJHX1BSSU5USyhLRVJOX0lORk8gIiVzOiBOb3RoaW5nIHRvIGV4ZWN1dGUgaW4gVGltZXJcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJCWlmIChhdG9taWNfcmVhZCgmY2FyZC0+dS54LmNvbW1hbmRfYnVzeSkpeworCQkJCQlhdG9taWNfc2V0KCZjYXJkLT51LnguY29tbWFuZF9idXN5LDApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwl9IC8vRW5kIG9mIEZPUgorCisJY2FyZC0+dS54LmNtZF9kZXYgPSBkZXY7CisJCisJaWYgKG1vcmVfdG9fZXhlYyl7CisJCS8qIElmIG1vcmUgY29tbWFuZHMgYXJlIHBlbmRpbmcsIGRvIG5vdCB0dXJuIG9mZiB0aW1lciAKKyAgICAgICAgICAgICAgICAgKiBpbnRlcnJ1cHQgKi8KKwkJcmV0dXJuIDE7CisJfWVsc2V7CisJCS8qIE5vIG1vcmUgY29tbWFuZHMsIHR1cm4gb2ZmIHRpbWVyIGludGVycnVwdCAqLworCQlyZXR1cm4gMDsKKwl9CQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogZXhlY3V0ZV9kZWxheWVkX2NtZCAKKyAqCisgKglFeGVjdXRlIGFuIEFQSSBjb21tYW5kIHdoaWNoIHdhcyBwYXNzZWQgZG93biBmcm9tIHRoZQorICogICAgICBzb2NrLiAgU29jayBpcyB2ZXJ5IGxpbWl0ZWQgaW4gd2hpY2ggY29tbWFuZHMgaXQgY2FuCisgKiAgICAgIGV4ZWN1dGUuICBXYWl0IGFuZCBObyBXYWl0IGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQuICAKKyAqICAgICAgUGxhY2UgQ2FsbCwgQ2xlYXIgQ2FsbCBhbmQgUmVzZXQgd2FpdCBjb21tYW5kcywgd2hlcmUKKyAqICAgICAgQWNjZXB0IENhbGwgaXMgYSBub193YWl0IGNvbW1hbmQuCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGV4ZWN1dGVfZGVsYXllZF9jbWQoc2RsYV90KiBjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIG1ib3hfY21kX3QgKnVzcl9jbWQsIGNoYXIgYmFkX2NtZCkKK3sKKwlUWDI1TWJveCogbWJveCA9IGNhcmQtPm1ib3g7CisJaW50IGVycjsKKwl4MjVfY2hhbm5lbF90ICpjaGFuID0gZGV2LT5wcml2OworCWludCBkZWxheT1SRVRVUk5fUkVTVUxUOworCisJaWYgKCEoKmNhcmQtPnUueC5oZGxjX2J1Zl9zdGF0dXMgJiAweDQwKSAmJiAhYmFkX2NtZCl7CisJCXJldHVybiBUUllfQ01EX0FHQUlOOworCX0KKworCS8qIFRoaXMgd2F5IGEgY29tbWFuZCBpcyBndWFyYW50ZWVkIHRvIGJlIGV4ZWN1dGVkIGZvcgorICAgICAgICAgKiBhIHNwZWNpZmljIGxjbiwgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGlzIGJvdW5kIHRvLiAqLworCXVzcl9jbWQtPmNtZC5sY24gPSBjaGFuLT5jb21tb24ubGNuOworCQorCisJLyogSWYgY2hhbm5lbCBpcyBwdmMsIGluc3RlYWQgb2YgcGxhY2UgY2FsbAorICAgICAgICAgKiBydW4geDI1X2NoYW5uZWwgY29uZmlndXJhdGlvbi4gSWYgcnVubmluZyBMQVBCIEhETEMKKyAgICAgICAgICogZW5hYmxlIGNvbW11bmljYXRpb25zLiAKKyAgICAgICAgICovCisJaWYgKCghY2hhbi0+Y29tbW9uLnN2YykgJiYgKHVzcl9jbWQtPmNtZC5jb21tYW5kID09IFgyNV9QTEFDRV9DQUxMKSl7CisKKwkJaWYgKGNhcmQtPnUueC5MQVBCX2hkbGMpeworCQkJREJHX1BSSU5USyhLRVJOX0lORk8gIkxBUEI6IENvbm5lY3RpbmdcbiIpOworCQkJY29ubmVjdChjYXJkKTsKKwkJCXNldF9jaGFuX3N0YXRlKGRldixXQU5fQ09OTkVDVElORyk7CisJCQlyZXR1cm4gREVMQVlfUkVTVUxUOworCQl9ZWxzZXsKKwkJCURCR19QUklOVEsoS0VSTl9JTkZPICIlczogUFZDIGlzIENPTk5FQ1RJTkdcbiIsY2FyZC0+ZGV2bmFtZSk7CisJCQlpZiAoeDI1X2dldF9jaGFuX2NvbmYoY2FyZCwgY2hhbikgPT0gQ01EX09LKXsKKwkJCQlzZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9DT05ORUNURUQpOworCQkJfWVsc2V7IAorCQkJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RFRCk7CisJCQl9CisJCQlyZXR1cm4gUkVUVVJOX1JFU1VMVDsKKwkJfQorCX0KKworCS8qIENvcHkgdGhlIHNvY2tldCBtYm94IGNvbW1hbmQgb250byB0aGUgYm9hcmQgKi8KKworCW1lbWNweSgmbWJveC0+Y21kLCAmdXNyX2NtZC0+Y21kLCBzaXplb2YoVFgyNUNtZCkpOworCWlmICh1c3JfY21kLT5jbWQubGVuZ3RoKXsKKwkJbWVtY3B5KG1ib3gtPmRhdGEsIHVzcl9jbWQtPmRhdGEsIHVzcl9jbWQtPmNtZC5sZW5ndGgpOworCX0KKworCS8qIENoZWNrIGlmIGNvbW1hbmQgaXMgYmFkLiBXZSBuZWVkIHRvIGNvcHkgdGhlIGNtZCBpbnRvCisgICAgICAgICAqIHRoZSBidWZmZXIgcmVnYXJkbGVzcyBzaW5jZSB3ZSByZXR1cm4gdGhlLCBtYm94IHRvCisgICAgICAgICAqIHRoZSB1c2VyICovCisJaWYgKGJhZF9jbWQpeworCQltYm94LT5jbWQucmVzdWx0PTB4MDE7CisJCXJldHVybiBSRVRVUk5fUkVTVUxUOworCX0KKworCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKworCWlmIChlcnIgIT0gQ01EX09LICYmIGVyciAhPSBYMjVSRVNfTk9UX1JFQURZKQorCQl4MjVfZXJyb3IoY2FyZCwgZXJyLCB1c3JfY21kLT5jbWQuY29tbWFuZCwgdXNyX2NtZC0+Y21kLmxjbik7CisKKwlpZiAobWJveC0+Y21kLnJlc3VsdCA9PSBYMjVSRVNfTk9UX1JFQURZKXsKKwkJcmV0dXJuIFRSWV9DTURfQUdBSU47CisJfQorCisJc3dpdGNoIChtYm94LT5jbWQuY29tbWFuZCl7CisKKwljYXNlIFgyNV9QTEFDRV9DQUxMOgorCQkKKwkJc3dpdGNoIChtYm94LT5jbWQucmVzdWx0KXsKKworCQljYXNlIENNRF9PSzoKKworCQkJLyogQ2hlY2sgaWYgUGxhY2UgY2FsbCBpcyBhIHdhaXQgY29tbWFuZCBvciBhIAorICAgICAgICAgICAgICAgCSAgCSAqIG5vIHdhaXQgY29tbWFuZCAqLworCQkJaWYgKGF0b21pY19yZWFkKCZjaGFuLT5jb21tb24uY29tbWFuZCkgJiAweDgwKQorIAkJCQlkZWxheT1SRVRVUk5fUkVTVUxUOworCQkJZWxzZQorCQkJCWRlbGF5PURFTEFZX1JFU1VMVDsKKwkJCisKKwkJCURCR19QUklOVEsoS0VSTl9JTkZPICJcbiVzOiBQTEFDRSBDQUxMIEJpbmRpbmcgZGV2ICVzIHRvIGxjbiAlaVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSxkZXYtPm5hbWUsIG1ib3gtPmNtZC5sY24pOworCQkKKwkJCWJpbmRfbGNuX3RvX2RldiAoY2FyZCwgZGV2LCBtYm94LT5jbWQubGNuKTsKKwkJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0NPTk5FQ1RJTkcpOworCQkJYnJlYWs7CisKKworCQlkZWZhdWx0OgorCQkJZGVsYXk9UkVUVVJOX1JFU1VMVDsKKwkJCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RFRCk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgWDI1X0FDQ0VQVF9DQUxMOiAKKwkJCisJCXN3aXRjaCAobWJveC0+Y21kLnJlc3VsdCl7CisKKwkJY2FzZSBDTURfT0s6CisKKwkJCURCR19QUklOVEsoS0VSTl9JTkZPICJcbiVzOiBBQ0NFUFQgQmluZGluZyBkZXYgJXMgdG8gbGNuICVpXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsZGV2LT5uYW1lLG1ib3gtPmNtZC5sY24pOworCisJCQliaW5kX2xjbl90b19kZXYgKGNhcmQsIGRldiwgbWJveC0+Y21kLmxjbik7CisKKwkJCWlmICh4MjVfZ2V0X2NoYW5fY29uZihjYXJkLCBjaGFuKSA9PSBDTURfT0speworCisJCQkJc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fQ09OTkVDVEVEKTsKKwkJCQlkZWxheT1SRVRVUk5fUkVTVUxUOworCisJCQl9ZWxzZXsgCisJCQkJaWYgKHgyNV9jbGVhcl9jYWxsKGNhcmQsIHVzcl9jbWQtPmNtZC5sY24sIDAsIDApID09IENNRF9PSyl7CisJCQkJCS8qIGlmIGNsZWFyIGlzIHN1Y2Nlc3NmdWwsIHdhaXQgZm9yIGNsZWFyIGNvbmZpcm0gCisJCQkJCSAqLyAKKwkJCQkJZGVsYXk9REVMQVlfUkVTVUxUOworCQkJCX1lbHNleworCQkJCQkvKiBEbyBub3QgY2hhbmdlIHRoZSBzdGF0ZSBoZXJlLiBJZiB3ZSBmYWlsIAorCQkJCQkgKiB0aGUgYWNjZXB0IHRoZSByZXR1cm4gY29kZSBpcyBzZW5kIHVwIAorCQkJCQkgKnRoZSBzdGFjaywgd2hpY2ggd2lsbCBldGhlciByZXRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgIAkgKiBvciBjbGVhciB0aGUgY2FsbCAKKwkJCQkJICovCisJCQkJCURCR19QUklOVEsoS0VSTl9JTkZPIAorCQkJCQkJIiVzOiBBQ0NFUFQ6IFNUQVRFIE1BWSBCRSBDVVJSVVBURUQgMiAhISEhIVxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJCQlkZWxheT1SRVRVUk5fUkVTVUxUOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisKKwkJY2FzZSBYMjVSRVNfQVNZTkNfUEFDS0VUOgorCQkJZGVsYXk9VFJZX0NNRF9BR0FJTjsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6IAorCQkJREJHX1BSSU5USyhLRVJOX0lORk8gIiVzOiBBQ0NFUFQgRkFJTEVEXG4iLGNhcmQtPmRldm5hbWUpOworCQkJaWYgKHgyNV9jbGVhcl9jYWxsKGNhcmQsIHVzcl9jbWQtPmNtZC5sY24sIDAsIDApID09IENNRF9PSyl7CisJCQkJZGVsYXk9REVMQVlfUkVTVUxUOworCQkJfWVsc2V7CisJCQkJLyogRG8gbm90IGNoYW5nZSB0aGUgc3RhdGUgaGVyZS4gSWYgd2UgZmFpbCB0aGUgYWNjZXB0LiBUaGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcmV0dXJuIGNvZGUgaXMgc2VuZCB1cCB0aGUgc3RhY2ssIHdoaWNoIHdpbGwgZXRoZXIgcmV0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb3IgY2xlYXIgdGhlIGNhbGwgKi8KKwkJCQlEQkdfUFJJTlRLKEtFUk5fSU5GTyAKKwkJCQkJIiVzOiBBQ0NFUFQ6IFNUQVRFIE1BWSBCRSBDT1JSVVBURUQgMSAhISEhIVxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJCWRlbGF5PVJFVFVSTl9SRVNVTFQ7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFgyNV9DTEVBUl9DQUxMOgorCisJCXN3aXRjaCAobWJveC0+Y21kLnJlc3VsdCl7CisKKwkJY2FzZSBDTURfT0s6CisJCQlEQkdfUFJJTlRLKEtFUk5fSU5GTyAKKwkJCQkJIkNBTEwgQ0xFQVIgT0s6IERldiAlcyBNYm94IExjbiAlaSAgQ2hhbiBMY24gJWlcbiIsCisJCQkJCWRldi0+bmFtZSxtYm94LT5jbWQubGNuLGNoYW4tPmNvbW1vbi5sY24pOworCQkJc2V0X2NoYW5fc3RhdGUoZGV2LCBXQU5fRElTQ09OTkVDVElORyk7CisJCQlkZWxheSA9IERFTEFZX1JFU1VMVDsKKwkJCWJyZWFrOworCisJCWNhc2UgWDI1UkVTX0NIQU5ORUxfSU5fVVNFOgorCQljYXNlIFgyNVJFU19BU1lOQ19QQUNLRVQ6CisJCQlkZWxheSA9IFRSWV9DTURfQUdBSU47CisJCQlicmVhazsKKwkJCQorCQljYXNlIFgyNVJFU19MSU5LX05PVF9JTl9BQk06CisJCWNhc2UgWDI1UkVTX0lOVkFMX0xDTjoKKwkJY2FzZSBYMjVSRVNfSU5WQUxfU1RBVEU6CisJCQlzZXRfY2hhbl9zdGF0ZShkZXYsIFdBTl9ESVNDT05ORUNURUQpOworCQkJZGVsYXkgPSBSRVRVUk5fUkVTVUxUOworCQkJYnJlYWs7CisJCQorCQlkZWZhdWx0OgorCQkJLyogSWYgY29tbWFuZCBkaWQgbm90IGV4ZWN1dGUgYmVjYXVzZSBvZiB1c2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBmYXVsdCwgZG8gbm90IGNoYW5nZSB0aGUgc3RhdGUuIFRoaXMgd2lsbAorICAgICAgICAgICAgICAgICAgICAgICAgICogc2lnbmFsIHRoZSBzb2NrZXQgdGhhdCBjbGVhciBjb21tYW5kIGZhaWxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFVzZXIgY2FuIHJldHJ5IG9yIGNsb3NlIHRoZSBzb2NrZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBXaGVuIHNvY2tldCBnZXRzIGtpbGxlZCwgaXQgd2lsbCBzZXQgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICogY2hhbi0+ZGlzY29ubmVjdCB3aGljaCB3aWxsIHNpZ25hbAorICAgICAgICAgICAgICAgICAgICAgICAgICogZHJpdmVyIHRvIGNsZWFyIHRoZSBjYWxsICovCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ2xlYXIgQ29tbWFuZCBGYWlsZWQsIFJjICV4XG4iLAorCQkJCWNhcmQtPmRldm5hbWUsbWJveC0+Y21kLmNvbW1hbmQpOyAKKwkJCWRlbGF5ID0gUkVUVVJOX1JFU1VMVDsKKwkJfQorCQlicmVhazsKKwl9CQorCisJcmV0dXJuIGRlbGF5OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogYXBpX2luY29taW5nX2NhbGwgCisgKgorICoJUGFzcyBhbiBpbmNvbWluZyBjYWxsIHJlcXVlc3QgdXAgdGhlIGxpc3RlbmluZworICogICAgICBzb2NrLiAgSWYgdGhlIEFQSSBzb2NrIGlzIG5vdCBsaXN0ZW5pbmcgcmVqZWN0IHRoZQorICogICAgICBjYWxsLgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBhcGlfaW5jb21pbmdfY2FsbCAoc2RsYV90KiBjYXJkLCBUWDI1TWJveCAqbWJveCwgaW50IGxjbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBsZW4gPSBzaXplb2YoVFgyNUNtZCkrbWJveC0+Y21kLmxlbmd0aDsKKworCWlmIChhbGxvY19hbmRfaW5pdF9za2JfYnVmKGNhcmQsICZza2IsIGxlbikpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogQVBJIGluY29taW5nIGNhbGwsIG5vIG1lbW9yeVxuIixjYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJbWVtY3B5KHNrYl9wdXQoc2tiLGxlbiksJm1ib3gtPmNtZCxsZW4pOworCisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhYMjVfUFJPVCk7CisJc2tiLT5wa3RfdHlwZSA9IFdBTl9QQUNLRVRfQVNZTkM7CisKKwlpZiAoY2FyZC0+ZnVuYyhza2IsY2FyZC0+c2spIDwgMCl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNQUpPUiBFUlJPUjogRmFpbGVkIHRvIHNlbmQgdXAgcGxhY2UgY2FsbCBcbiIsY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBzZW5kX2RlbGF5ZWRfY21kX3Jlc3VsdAorICoKKyAqCVdhaXQgY29tbWFuZHMgbGlrZSBQTEVBQ0UgQ0FMTCBvciBDTEVBUiBDQUxMIG11c3Qgd2FpdAorICogICAgICB1bnRpbCB0aGUgcmVzdWx0IGFycml2ZXMuIFRoaXMgZnVuY3Rpb24gcGFzc2VzCisgKiAgICAgIHRoZSByZXN1bHQgdG8gYSB3YWl0aW5nIHNvY2suIAorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIHNlbmRfZGVsYXllZF9jbWRfcmVzdWx0KHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgVFgyNU1ib3gqIG1ib3gpCit7CisJeDI1X2NoYW5uZWxfdCAqY2hhbiA9IGRldi0+cHJpdjsKKwltYm94X2NtZF90ICp1c3JfY21kID0gKG1ib3hfY21kX3QgKiljaGFuLT5jb21tb24ubWJveDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBsZW49c2l6ZW9mKHVuc2lnbmVkIGNoYXIpOworCisJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQsMCk7CisKKwkvKiBJZiB0aGUgc29jayBpcyBpbiB0aGUgcHJvY2VzcyBvZiB1bmxpbmtpbmcgdGhlCisJICogZHJpdmVyIGZyb20gdGhlIHNvY2tldCwgd2UgbXVzdCBnZXQgb3V0LiAKKwkgKiBUaGlzIG5ldmVyIGhhcHBlbmRzIGJ1dCBpcyBhIHNhbml0eSBjaGVjay4gKi8KKwlpZiAodGVzdF9iaXQoMCwmY2hhbi0+Y29tbW9uLmNvbW1vbl9jcml0aWNhbCkpeworCQlyZXR1cm47CisJfQorCisJaWYgKCF1c3JfY21kIHx8ICFjaGFuLT5jb21tb24uc2sgfHwgIWNoYW4tPmNvbW1vbi5mdW5jKXsKKwkJREJHX1BSSU5USyhLRVJOX0lORk8gIkRlbGF5IHJlc3VsdDogU29jayBub3QgYm91bmRlZCBzazogJXUsIGZ1bmM6ICV1LCBtYm94OiAldVxuIiwKKwkJCSh1bnNpZ25lZCBpbnQpY2hhbi0+Y29tbW9uLnNrLAorCQkJKHVuc2lnbmVkIGludCljaGFuLT5jb21tb24uZnVuYywKKwkJCSh1bnNpZ25lZCBpbnQpdXNyX2NtZCk7IAorCQlyZXR1cm47CisJfQorCisJbWVtY3B5KCZ1c3JfY21kLT5jbWQsICZtYm94LT5jbWQsIHNpemVvZihUWDI1Q21kKSk7IAorCWlmIChtYm94LT5jbWQubGVuZ3RoID4gMCl7CisJCW1lbWNweSh1c3JfY21kLT5kYXRhLCBtYm94LT5kYXRhLCBtYm94LT5jbWQubGVuZ3RoKTsKKwl9CisKKwlpZiAoYWxsb2NfYW5kX2luaXRfc2tiX2J1ZihjYXJkLCZza2IsbGVuKSl7CisJCXByaW50ayhLRVJOX0lORk8gIkRlbGF5IHJlc3VsdDogTm8gc29jayBidWZmZXJzXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW1lbWNweShza2JfcHV0KHNrYixsZW4pLCZtYm94LT5jbWQuY29tbWFuZCxsZW4pOworCQorCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2ItPnBrdF90eXBlID0gV0FOX1BBQ0tFVF9DTUQ7CisJCQkKKwljaGFuLT5jb21tb24uZnVuYyhza2IsZGV2LGNoYW4tPmNvbW1vbi5zayk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBjbGVhcl9jb25maXJtX2V2ZW50CisgKgorICogCVBhc3MgdGhlIGNsZWFyIGNvbmZpcm1hdGlvbiBldmVudCB1cCB0aGUgc29jay4gVGhlCisgKiAgICAgIEFQSSB3aWxsIGRpc2Nvbm5lY3Qgb25seSBhZnRlciB0aGUgY2xlYXIgY29uZmlybWF0aW9uCisgKiAgICAgIGhhcyBiZWVuIHJlY2VpdmVkLiAKKyAqCisgKiAgICAgIERlcGVuZGluZyBvbiB0aGUgc3RhdGUsIGNsZWFyIGNvbmZpcm1hdGlvbiBjb3VsZCAKKyAqICAgICAgYmUgYW4gT09CIGV2ZW50LCBvciBhIHJlc3VsdCBvZiBhbiBBUEkgY29tbWFuZC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBjbGVhcl9jb25maXJtX2V2ZW50IChzZGxhX3QgKmNhcmQsIFRYMjVNYm94KiBtYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXgyNV9jaGFubmVsX3QgKmNoYW47CisJdW5zaWduZWQgY2hhciBvbGRfc3RhdGU7CQorCisJZGV2ID0gZmluZF9jaGFubmVsKGNhcmQsbWItPmNtZC5sY24pOworCWlmICghZGV2KXsKKwkJREJHX1BSSU5USyhLRVJOX0lORk8gIiVzOiAqKiogR09UIENMRUFSIEJVVCBOTyBERVYgJWlcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSxtYi0+Y21kLmxjbik7CisJCXJldHVybiAwOworCX0KKworCWNoYW49ZGV2LT5wcml2OworCURCR19QUklOVEsoS0VSTl9JTkZPICIlczogR09UIENMRUFSIENPTkZJUk0gJXM6ICBNYm94IGxjbiAlaSAgQ2hhbiBsY24gJWlcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUsIG1iLT5jbWQubGNuLCBjaGFuLT5jb21tb24ubGNuKTsKKworCS8qIElmIG5vdCBBUEkgZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQuIAorCSAqIElmIEFQSSwgc2VuZCB0aGUgcmVzdWx0IHRvIGEgd2FpdGluZworICAgICAgICAgKiBzb2NrZXQuCisJICovCisJCisJb2xkX3N0YXRlID0gY2hhbi0+Y29tbW9uLnN0YXRlOworCXNldF9jaGFuX3N0YXRlKGRldiwgV0FOX0RJU0NPTk5FQ1RFRCk7CisKKwlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpeworCQlzd2l0Y2ggKG9sZF9zdGF0ZSkgeworCisJCWNhc2UgV0FOX0RJU0NPTk5FQ1RJTkc6CisJCWNhc2UgV0FOX0NPTk5FQ1RJTkc6CisJCQlzZW5kX2RlbGF5ZWRfY21kX3Jlc3VsdChjYXJkLGRldixtYik7CisJCQlicmVhazsKKwkJY2FzZSBXQU5fQ09OTkVDVEVEOgorCQkJc2VuZF9vb2JfbXNnKGNhcmQsZGV2LG1iKTsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogc2VuZF9vb2JfbXNnCisgKgorICogICAgQ29uc3RydWN0IGFuIE5FTSBNZXNzYWdlIGFuZCBwYXNzIGl0IHVwIHRoZSBjb25uZWN0ZWQKKyAqICAgIHNvY2suIElmIHRoZSBzb2NrIGlzIG5vdCBib3VuZGVkIGRpc2NhcmQgdGhlIE5FTS4KKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIHNlbmRfb29iX21zZyhzZGxhX3QgKmNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIFRYMjVNYm94ICptYm94KQoreworCXgyNV9jaGFubmVsX3QgKmNoYW4gPSBkZXYtPnByaXY7CisJbWJveF9jbWRfdCAqdXNyX2NtZCA9IChtYm94X2NtZF90ICopY2hhbi0+Y29tbW9uLm1ib3g7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgbGVuPXNpemVvZih4MjVhcGlfaGRyX3QpK21ib3gtPmNtZC5sZW5ndGg7CisJeDI1YXBpX3QgKmFwaV9oZHI7CisKKwkvKiBJZiB0aGUgc29jayBpcyBpbiB0aGUgcHJvY2VzcyBvZiB1bmxpbmtpbmcgdGhlCisJICogZHJpdmVyIGZyb20gdGhlIHNvY2tldCwgd2UgbXVzdCBnZXQgb3V0LiAKKwkgKiBUaGlzIG5ldmVyIGhhcHBlbmRzIGJ1dCBpcyBhIHNhbml0eSBjaGVjay4gKi8KKwlpZiAodGVzdF9iaXQoMCwmY2hhbi0+Y29tbW9uLmNvbW1vbl9jcml0aWNhbCkpeworCQlyZXR1cm47CisJfQorCisJaWYgKCF1c3JfY21kIHx8ICFjaGFuLT5jb21tb24uc2sgfHwgIWNoYW4tPmNvbW1vbi5mdW5jKXsKKwkJREJHX1BSSU5USyhLRVJOX0lORk8gIk9PQiBNU0c6IFNvY2sgbm90IGJvdW5kZWRcbiIpOyAKKwkJcmV0dXJuOworCX0KKworCW1lbWNweSgmdXNyX2NtZC0+Y21kLCAmbWJveC0+Y21kLCBzaXplb2YoVFgyNUNtZCkpOyAKKwlpZiAobWJveC0+Y21kLmxlbmd0aCA+IDApeworCQltZW1jcHkodXNyX2NtZC0+ZGF0YSwgbWJveC0+ZGF0YSwgbWJveC0+Y21kLmxlbmd0aCk7CisJfQorCisJaWYgKGFsbG9jX2FuZF9pbml0X3NrYl9idWYoY2FyZCwmc2tiLGxlbikpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogT09CIE1TRzogTm8gc29jayBidWZmZXJzXG4iLGNhcmQtPmRldm5hbWUpOworCQlyZXR1cm47CisJfQorCisJYXBpX2hkciA9ICh4MjVhcGlfdCopc2tiX3B1dChza2IsbGVuKTsgCisJYXBpX2hkci0+aGRyLnBrdFR5cGUgPSBtYm94LT5jbWQucGt0VHlwZSAmIDB4N0Y7CisJYXBpX2hkci0+aGRyLnFkbSAgICAgPSBtYm94LT5jbWQucWRtOworCWFwaV9oZHItPmhkci5jYXVzZSAgID0gbWJveC0+Y21kLmNhdXNlOworCWFwaV9oZHItPmhkci5kaWFnbiAgID0gbWJveC0+Y21kLmRpYWduOworCWFwaV9oZHItPmhkci5sZW5ndGggID0gbWJveC0+Y21kLmxlbmd0aDsKKwlhcGlfaGRyLT5oZHIucmVzdWx0ICA9IG1ib3gtPmNtZC5yZXN1bHQ7CisJYXBpX2hkci0+aGRyLmxjbiAgICAgPSBtYm94LT5jbWQubGNuOworCisJaWYgKG1ib3gtPmNtZC5sZW5ndGggPiAwKXsKKwkJbWVtY3B5KGFwaV9oZHItPmRhdGEsbWJveC0+ZGF0YSxtYm94LT5jbWQubGVuZ3RoKTsKKwl9CisJCisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYi0+cGt0X3R5cGUgPSBXQU5fUEFDS0VUX0VSUjsKKwkJCQorCWlmIChjaGFuLT5jb21tb24uZnVuYyhza2IsZGV2LGNoYW4tPmNvbW1vbi5zaykgPCAwKXsKKwkJaWYgKGJoX2VucXVldWUoZGV2LHNrYikpeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERyb3BwaW5nIE9PQiBNU0dcbiIsY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCX0KKwl9CisKKwlEQkdfUFJJTlRLKEtFUk5fSU5GTyAiJXM6IE9PQiBNU0cgT0ssICVzLCBsY24gJWlcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBkZXYtPm5hbWUsIG1ib3gtPmNtZC5sY24pOworfQkKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICBhbGxvY19hbmRfaW5pdF9za2JfYnVmIAorICoKKyAqCUFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFuIHNrYiBidWZmZXIuIAorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBhbGxvY19hbmRfaW5pdF9za2JfYnVmIChzZGxhX3QgKmNhcmQsIHN0cnVjdCBza19idWZmICoqc2tiLCBpbnQgbGVuKQoreworCXN0cnVjdCBza19idWZmICpuZXdfc2tiID0gKnNrYjsKKworCW5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIFgyNV9IUkRIRFJfU1opOworCWlmIChuZXdfc2tiID09IE5VTEwpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogbm8gc29ja2V0IGJ1ZmZlcnMgYXZhaWxhYmxlIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoc2tiX3RhaWxyb29tKG5ld19za2IpIDwgbGVuKXsKKwkJLyogTm8gcm9vbSBmb3IgdGhlIHBhY2tldC4gQ2FsbCBvZmYgdGhlIHdob2xlIHRoaW5nISAqLworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KG5ld19za2IpOworCQlwcmludGsoS0VSTl9JTkZPICIlczogTGlzdGVuOiB1bmV4cGVjdGVkbHkgbG9uZyBwYWNrZXQgc2VxdWVuY2VcbiIKKwkJCSxjYXJkLT5kZXZuYW1lKTsKKwkJKnNrYiA9IE5VTEw7CisJCXJldHVybiAxOworCX0KKworCSpza2IgPSBuZXdfc2tiOworCXJldHVybiAwOworCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgYXBpX29vYl9ldmVudCAKKyAqCisgKglTZW5kIGFuIE9PQiBldmVudCB1cCB0byB0aGUgc29jayAKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGFwaV9vb2JfZXZlbnQgKHNkbGFfdCAqY2FyZCxUWDI1TWJveCAqbWJveCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZmluZF9jaGFubmVsKGNhcmQsIG1ib3gtPmNtZC5sY24pOworCXgyNV9jaGFubmVsX3QgKmNoYW47CisKKwlpZiAoIWRldikKKwkJcmV0dXJuOworCisJY2hhbj1kZXYtPnByaXY7CisKKwlpZiAoY2hhbi0+Y29tbW9uLnVzZWRieSA9PSBBUEkpCisJCXNlbmRfb29iX21zZyhjYXJkLGRldixtYm94KTsKKwkKK30KKworCisKKworc3RhdGljIGludCBjaGFubmVsX2Rpc2Nvbm5lY3Qoc2RsYV90KiBjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJaW50IGVycjsKKwl4MjVfY2hhbm5lbF90ICpjaGFuID0gZGV2LT5wcml2OworCisJREJHX1BSSU5USyhLRVJOX0lORk8gIiVzOiBUSU1FUjogJXMsIERldmljZSBkb3duIGRpc2Nvbm5lY3RpbmdcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSxkZXYtPm5hbWUpOworCisJaWYgKGNoYW4tPmNvbW1vbi5zdmMpeworCQllcnIgPSB4MjVfY2xlYXJfY2FsbChjYXJkLGNoYW4tPmNvbW1vbi5sY24sMCwwKTsKKwl9ZWxzZXsKKwkJLyogSWYgY2hhbm5lbCBpcyBQVkMgb3IgTEFQQiBIRExDLCB0aGVyZSBpcyBubyBjYWxsCisgICAgICAgICAgICAgICAgICogdG8gYmUgY2xlYXJlZCwgdGh1cyBkcm9wIGRvd24gdG8gdGhlIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgKiBhcmVhIAorCSAgICAgICAgICovCisJCWVyciA9IDE7CisJfQorCisJc3dpdGNoIChlcnIpeworCQorCQljYXNlIFgyNVJFU19DSEFOTkVMX0lOX1VTRToJCisJCWNhc2UgWDI1UkVTX05PVF9SRUFEWToKKwkJCWVyciA9IFRSWV9DTURfQUdBSU47CisJCQlicmVhazsKKwkJY2FzZSBDTURfT0s6CisJCQlEQkdfUFJJTlRLKEtFUk5fSU5GTyAiQ0FMTCBDTEVBUiBPSzogRGV2ICVzIENoYW4gTGNuICVpXG4iLAorCQkJCQkJZGV2LT5uYW1lLGNoYW4tPmNvbW1vbi5sY24pOworCisJCQlzZXRfY2hhbl9zdGF0ZShkZXYsV0FOX0RJU0NPTk5FQ1RJTkcpOworCQkJYXRvbWljX3NldCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQsMCk7CisJCQllcnIgPSBERUxBWV9SRVNVTFQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIElmIExBUEIgSERMQyBwcm90b2NvbCwgYnJpbmcgdGhlIHdob2xlIGxpbmsgZG93bgorICAgICAgICAgICAgICAgICAgICAgICAgICogb25jZSB0aGUgYXBwbGljYXRpb24gdGVybWluYXRlcyAKKwkJCSAqLworCisJCQlzZXRfY2hhbl9zdGF0ZShkZXYsV0FOX0RJU0NPTk5FQ1RFRCk7CisKKwkJCWlmIChjYXJkLT51LnguTEFQQl9oZGxjKXsKKwkJCQlEQkdfUFJJTlRLKEtFUk5fSU5GTyAiTEFQQjogRGlzY29ubmVjdGluZyBMaW5rXG4iKTsKKwkJCQloZGxjX2xpbmtfZG93biAoY2FyZCk7CisJCQl9CisJCQlhdG9taWNfc2V0KCZjaGFuLT5jb21tb24uY29tbWFuZCwwKTsKKwkJCWVyciA9IFJFVFVSTl9SRVNVTFQ7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBoZGxjX2xpbmtfZG93biAoc2RsYV90ICpjYXJkKQoreworCVRYMjVNYm94KiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgcmV0cnkgPSA1OworCWludCBlcnI9MDsKKworCWRvIHsKKwkJbWVtc2V0KG1ib3gsMCxzaXplb2YoVFgyNU1ib3gpKTsKKwkJbWJveC0+Y21kLmNvbW1hbmQgPSBYMjVfSERMQ19MSU5LX0RJU0M7CisJCW1ib3gtPmNtZC5sZW5ndGggPSAxOworCQltYm94LT5kYXRhWzBdPTA7CisJCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKworCX0gd2hpbGUgKGVyciAmJiByZXRyeS0tICYmIHgyNV9lcnJvcihjYXJkLCBlcnIsIFgyNV9IRExDX0xJTktfRElTQywgMCkpOworCisJaWYgKGVycikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEhkbGMgTGluayBEb3duIEZhaWxlZCAleFxuIixjYXJkLT5kZXZuYW1lLGVycik7CisKKwlkaXNjb25uZWN0IChjYXJkKTsKKwkKK30KKworc3RhdGljIGludCBjaGVja19iYWRfY29tbWFuZChzZGxhX3QqIGNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJeDI1X2NoYW5uZWxfdCAqY2hhbiA9IGRldi0+cHJpdjsKKwlpbnQgYmFkX2NtZCA9IDA7CisKKwlzd2l0Y2ggKGF0b21pY19yZWFkKCZjaGFuLT5jb21tb24uY29tbWFuZCkmMHg3Ril7CisKKwkJY2FzZSBYMjVfUExBQ0VfQ0FMTDoKKwkJCWlmIChjaGFuLT5jb21tb24uc3RhdGUgIT0gV0FOX0RJU0NPTk5FQ1RFRCkKKwkJCQliYWRfY21kPTE7CisJCQlicmVhazsKKwkJY2FzZSBYMjVfQ0xFQVJfQ0FMTDoKKwkJCWlmIChjaGFuLT5jb21tb24uc3RhdGUgPT0gV0FOX0RJU0NPTk5FQ1RFRCkKKwkJCQliYWRfY21kPTE7CisJCQlicmVhazsKKwkJY2FzZSBYMjVfQUNDRVBUX0NBTEw6CisJCQlpZiAoY2hhbi0+Y29tbW9uLnN0YXRlICE9IFdBTl9DT05ORUNUSU5HKQorCQkJCWJhZF9jbWQ9MTsKKwkJCWJyZWFrOworCQljYXNlIFgyNV9SRVNFVDoKKwkJCWlmIChjaGFuLT5jb21tb24uc3RhdGUgIT0gV0FOX0NPTk5FQ1RFRCkKKwkJCQliYWRfY21kPTE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJhZF9jbWQ9MTsKKwkJCWJyZWFrOworCX0KKworCWlmIChiYWRfY21kKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEludmFsaWQgU3RhdGUsIEJBRCBDb21tYW5kICV4LCBkZXYgJXMsIGxjbiAlaSwgc3QgJWlcbiIsIAorCQkJY2FyZC0+ZGV2bmFtZSxhdG9taWNfcmVhZCgmY2hhbi0+Y29tbW9uLmNvbW1hbmQpLGRldi0+bmFtZSwgCisJCQljaGFuLT5jb21tb24ubGNuLCBjaGFuLT5jb21tb24uc3RhdGUpOworCX0KKworCXJldHVybiBiYWRfY21kOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBYUElQRU1PTiBGVU5DVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBQcm9jZXNzIFVEUCBjYWxsIG9mIHR5cGUgWFBJUEUKKyAqLworCitzdGF0aWMgaW50IHByb2Nlc3NfdWRwX21nbXRfcGt0KHNkbGFfdCAqY2FyZCkKK3sKKwlpbnQgICAgICAgICAgICBjX3JldHJ5ID0gTUFYX0NNRF9SRVRSWTsKKwl1bnNpZ25lZCBpbnQgICBsZW47CisJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisJVFgyNU1ib3ggICAgICAgKm1ib3ggPSBjYXJkLT5tYm94OworCWludCAgICAgICAgICAgIGVycjsKKwlpbnQgICAgICAgICAgICB1ZHBfbWdtdF9yZXFfdmFsaWQgPSAxOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgICAgIHgyNV9jaGFubmVsX3QgICpjaGFuOworCXVuc2lnbmVkIHNob3J0IGxjbjsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwkKKworCXgyNV91ZHBfcGt0X3QgKngyNV91ZHBfcGt0OworCXgyNV91ZHBfcGt0ID0gKHgyNV91ZHBfcGt0X3QgKiljYXJkLT51LngudWRwX3BrdF9kYXRhOworCisJZGV2ID0gY2FyZC0+dS54LnVkcF9kZXY7CisJY2hhbiA9IGRldi0+cHJpdjsKKwlsY24gPSBjaGFuLT5jb21tb24ubGNuOworCisJc3dpdGNoKHgyNV91ZHBfcGt0LT5jYmxvY2suY29tbWFuZCkgeworICAgICAgICAgICAgCisJCS8qIFhQSVBFX0VOQUJMRV9UUkFDRSAqLworCQljYXNlIFhQSVBFX0VOQUJMRV9UUkFDSU5HOgorCisJCS8qIFhQSVBFX0dFVF9UUkFDRV9JTkZPICovCisJCWNhc2UgWFBJUEVfR0VUX1RSQUNFX0lORk86CisgCisJCS8qIFNFVCBGVDEgTU9ERSAqLworCQljYXNlIFhQSVBFX1NFVF9GVDFfTU9ERToKKyAgICAgICAgICAgCisJCQlpZihjYXJkLT51LngudWRwX3BrdF9zcmMgPT0gVURQX1BLVF9GUk1fTkVUV09SSykgeworICAgICAgICAgICAgICAgICAgICAJCSsrY2hhbi0+cGlwZV9tZ210X3N0YXQuVURQX1BJUEVfbWdtdF9kaXJlY3Rpb25fZXJyOworCQkJCXVkcF9tZ210X3JlcV92YWxpZCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJLyogWFBJUEVfRlQxX1JFQURfU1RBVFVTICovCisJCWNhc2UgWFBJUEVfRlQxX1JFQURfU1RBVFVTOgorCisJCS8qIEZUMSBNT05JVE9SIFNUQVRVUyAqLworCQljYXNlIFhQSVBFX0ZUMV9TVEFUVVNfQ1RSTDoKKwkJCWlmKGNhcmQtPmh3LmZ3aWQgIT0gIFNGSURfWDI1XzUwOCkgeworCQkJCSsrY2hhbi0+cGlwZV9tZ210X3N0YXQuVURQX1BJUEVfbWdtdF9hZHB0cl90eXBlX2VycjsKKwkJCQl1ZHBfbWdtdF9yZXFfdmFsaWQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisgICAgICAgCX0KKworCWlmKCF1ZHBfbWdtdF9yZXFfdmFsaWQpIHsKKyAgICAgICAgICAgCS8qIHNldCBsZW5ndGggdG8gMCAqLworCQl4MjVfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9IDA7CisJCS8qIHNldCByZXR1cm4gY29kZSAqLworCQl4MjVfdWRwX3BrdC0+Y2Jsb2NrLnJlc3VsdCA9IChjYXJkLT5ody5md2lkICE9IFNGSURfWDI1XzUwOCkgPyAweDFGIDogMHhDRDsKKwkJCisJfSBlbHNlIHsgICAKKyAgICAgICAgCisJCXN3aXRjaCAoeDI1X3VkcF9wa3QtPmNibG9jay5jb21tYW5kKSB7CisgICAgCisJCisJCWNhc2UgWFBJUEVfRkxVU0hfRFJJVkVSX1NUQVRTOgorCQkJaW5pdF94MjVfY2hhbm5lbF9zdHJ1Y3QoY2hhbik7CisJCQlpbml0X2dsb2JhbF9zdGF0aXN0aWNzKGNhcmQpOworCQkJbWJveC0+Y21kLmxlbmd0aCA9IDA7CisJCQlicmVhazsKKworCisJCWNhc2UgWFBJUEVfRFJJVkVSX1NUQVRfSUZTRU5EOgorCQkJbWVtY3B5KHgyNV91ZHBfcGt0LT5kYXRhLCAmY2hhbi0+aWZfc2VuZF9zdGF0LCBzaXplb2YoaWZfc2VuZF9zdGF0X3QpKTsKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSBzaXplb2YoaWZfc2VuZF9zdGF0X3QpOworCQkJeDI1X3VkcF9wa3QtPmNibG9jay5sZW5ndGggPSAgbWJveC0+Y21kLmxlbmd0aDsJCisJCQlicmVhazsKKwkKKwkJY2FzZSBYUElQRV9EUklWRVJfU1RBVF9JTlRSOgorCQkJbWVtY3B5KCZ4MjVfdWRwX3BrdC0+ZGF0YVswXSwgJmNhcmQtPnN0YXRpc3RpY3MsIHNpemVvZihnbG9iYWxfc3RhdHNfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZ4MjVfdWRwX3BrdC0+ZGF0YVtzaXplb2YoZ2xvYmFsX3N0YXRzX3QpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW4tPnJ4X2ludHJfc3RhdCwgc2l6ZW9mKHJ4X2ludHJfc3RhdF90KSk7CisJCQkKKwkJCW1ib3gtPmNtZC5sZW5ndGggPSBzaXplb2YoZ2xvYmFsX3N0YXRzX3QpICsKKwkJCQkJc2l6ZW9mKHJ4X2ludHJfc3RhdF90KTsKKwkJCXgyNV91ZHBfcGt0LT5jYmxvY2subGVuZ3RoID0gIG1ib3gtPmNtZC5sZW5ndGg7CisJCQlicmVhazsKKworCQljYXNlIFhQSVBFX0RSSVZFUl9TVEFUX0dFTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSh4MjVfdWRwX3BrdC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW4tPnBpcGVfbWdtdF9zdGF0LlVEUF9QSVBFX21nbXRfa21hbGxvY19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwaXBlX21nbXRfc3RhdF90KSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmeDI1X3VkcF9wa3QtPmRhdGFbc2l6ZW9mKHBpcGVfbWdtdF9zdGF0X3QpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FyZC0+c3RhdGlzdGljcywgc2l6ZW9mKGdsb2JhbF9zdGF0c190KSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHgyNV91ZHBfcGt0LT5jYmxvY2sucmVzdWx0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHgyNV91ZHBfcGt0LT5jYmxvY2subGVuZ3RoID0gc2l6ZW9mKGdsb2JhbF9zdGF0c190KSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJ4X2ludHJfc3RhdF90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ib3gtPmNtZC5sZW5ndGggPSB4MjVfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisJCWNhc2UgWFBJUEVfUk9VVEVSX1VQX1RJTUU6CisJCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJCWNoYW4tPnJvdXRlcl91cF90aW1lID0gdHYudHZfc2VjIC0gY2hhbi0+cm91dGVyX3N0YXJ0X3RpbWU7CisgICAgCSAgICAgICAgICAgICAgICAqKHVuc2lnbmVkIGxvbmcgKikmeDI1X3VkcF9wa3QtPmRhdGEgPSBjaGFuLT5yb3V0ZXJfdXBfdGltZTsJCisJCQl4MjVfdWRwX3BrdC0+Y2Jsb2NrLmxlbmd0aCA9IG1ib3gtPmNtZC5sZW5ndGggPSA0OworCQkJeDI1X3VkcF9wa3QtPmNibG9jay5yZXN1bHQgPSAwOworCQkJYnJlYWs7CisJCisJCWRlZmF1bHQgOgorCisJCQlkbyB7CisJCQkJbWVtY3B5KCZtYm94LT5jbWQsICZ4MjVfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQsIHNpemVvZihUWDI1Q21kKSk7CisJCQkJaWYobWJveC0+Y21kLmxlbmd0aCl7IAorCQkJCQltZW1jcHkoJm1ib3gtPmRhdGEsIAorCQkJCQkgICAgICAgKGNoYXIgKil4MjVfdWRwX3BrdC0+ZGF0YSwgCisJCQkJCSAgICAgICBtYm94LT5jbWQubGVuZ3RoKTsKKwkJCQl9CQorCQkKKwkJCQllcnIgPSBzZGxhX2V4ZWMobWJveCkgPyBtYm94LT5jbWQucmVzdWx0IDogQ01EX1RJTUVPVVQ7CisJCQl9IHdoaWxlIChlcnIgJiYgY19yZXRyeS0tICYmIHgyNV9lcnJvcihjYXJkLCBlcnIsIG1ib3gtPmNtZC5jb21tYW5kLCAwKSk7CisKKworCQkJaWYgKCBlcnIgPT0gQ01EX09LIHx8IAorCQkJICAgIChlcnIgPT0gMSAmJiAKKwkJCSAgICAgKG1ib3gtPmNtZC5jb21tYW5kID09IDB4MDYgfHwgCisJCQkgICAgICBtYm94LT5jbWQuY29tbWFuZCA9PSAweDE2KSAgKSApeworCisJCQkJKytjaGFuLT5waXBlX21nbXRfc3RhdC5VRFBfUElQRV9tZ210X2FkcHRyX2NtbmRfT0s7CisJCQl9IGVsc2UgeworCQkJCSsrY2hhbi0+cGlwZV9tZ210X3N0YXQuVURQX1BJUEVfbWdtdF9hZHB0cl9jbW5kX3RpbWVvdXQ7CisJCQl9CisKKwkJCSAgLyogY29weSB0aGUgcmVzdWx0IGJhY2sgdG8gb3VyIGJ1ZmZlciAqLworCQkJbWVtY3B5KCZ4MjVfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQsICZtYm94LT5jbWQsIHNpemVvZihUWDI1Q21kKSk7CisKKyAgICAgIAkgICAgICAgICAJaWYobWJveC0+Y21kLmxlbmd0aCkgeworICAgICAgICAJICAgICAgICAgICAgICAgbWVtY3B5KCZ4MjVfdWRwX3BrdC0+ZGF0YSwgJm1ib3gtPmRhdGEsIG1ib3gtPmNtZC5sZW5ndGgpOworCQkJfQorCQkJYnJlYWs7CisKKwkJfSAvL3N3aXRjaAorCisgICAgICAgIH0KKyAgICAKKyAgICAgICAgLyogRmlsbCBVRFAgVFRMICovCisKKwl4MjVfdWRwX3BrdC0+aXBfcGt0LnR0bCA9IGNhcmQtPndhbmRldi50dGw7CisgICAgICAgIGxlbiA9IHJlcGx5X3VkcChjYXJkLT51LngudWRwX3BrdF9kYXRhLCBtYm94LT5jbWQubGVuZ3RoKTsKKworCisgICAgICAgIGlmKGNhcmQtPnUueC51ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9ORVRXT1JLKSB7CisJCQorCQllcnIgPSB4MjVfc2VuZChjYXJkLCBsY24sIDAsIGxlbiwgY2FyZC0+dS54LnVkcF9wa3RfZGF0YSk7CisJCWlmICghZXJyKSAKKwkJCSsrY2hhbi0+cGlwZV9tZ210X3N0YXQuVURQX1BJUEVfbWdtdF9hZHB0cl9zZW5kX3Bhc3NlZDsKKwkJZWxzZQorCQkJKytjaGFuLT5waXBlX21nbXRfc3RhdC5VRFBfUElQRV9tZ210X2FkcHRyX3NlbmRfZmFpbGVkOworCQorCX0gZWxzZSB7CisKKwkJLyogQWxsb2NhdGUgc29ja2V0IGJ1ZmZlciAqLworCQlpZigobmV3X3NrYiA9IGRldl9hbGxvY19za2IobGVuKSkgIT0gTlVMTCkgeworCQkJdm9pZCAqYnVmOworCisJCQkvKiBjb3B5IGRhdGEgaW50byBuZXdfc2tiICovCisJCQlidWYgPSBza2JfcHV0KG5ld19za2IsIGxlbik7CisJCQltZW1jcHkoYnVmLCBjYXJkLT51LngudWRwX3BrdF9kYXRhLCBsZW4pOworICAgICAgICAKKwkJCS8qIERlY2Fwc3VsYXRlIHBhY2tldCBhbmQgcGFzcyBpdCB1cCB0aGUgcHJvdG9jb2wgCisJCQkgICBzdGFjayAqLworCQkJbmV3X3NrYi0+ZGV2ID0gZGV2OworCQorCQkJaWYgKGNoYW4tPmNvbW1vbi51c2VkYnkgPT0gQVBJKQorICAgICAgICAgICAgICAgICAgICAgICAgCW5ld19za2ItPnByb3RvY29sID0gaHRvbnMoWDI1X1BST1QpOworCQkJZWxzZSAKKwkJCQluZXdfc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKwkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19za2ItPm1hYy5yYXcgPSBuZXdfc2tiLT5kYXRhOworCisJCQluZXRpZl9yeChuZXdfc2tiKTsKKwkJCSsrY2hhbi0+cGlwZV9tZ210X3N0YXQuVURQX1BJUEVfbWdtdF9wYXNzZWRfdG9fc3RhY2s7CisgICAgICAgICAgICAJCisJCX0gZWxzZSB7CisJCQkrK2NoYW4tPnBpcGVfbWdtdF9zdGF0LlVEUF9QSVBFX21nbXRfbm9fc29ja2V0OworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogVURQIG1nbXQgY21uZCwgbm8gc29ja2V0IGJ1ZmZlcnMgYXZhaWxhYmxlIVxuIiwgCisJCQljYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgIAl9CisgICAgICAgIH0KKworCWNhcmQtPnUueC51ZHBfcGt0X2xndGggPSAwOworCisJcmV0dXJuIDE7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERldGVybWluZSB3aGF0IHR5cGUgb2YgVURQIGNhbGwgaXQgaXMuIERSVlNUQVRTIG9yIFhQSVBFOE5EID8KKyAqLworc3RhdGljIGludCB1ZHBfcGt0X3R5cGUoIHN0cnVjdCBza19idWZmICpza2IsIHNkbGFfdCogY2FyZCApCit7CisJeDI1X3VkcF9wa3RfdCAqeDI1X3VkcF9wa3QgPSAoeDI1X3VkcF9wa3RfdCAqKXNrYi0+ZGF0YTsKKworICAgICAgICBpZigoeDI1X3VkcF9wa3QtPmlwX3BrdC5wcm90b2NvbCA9PSBVRFBNR01UX1VEUF9QUk9UT0NPTCkgJiYKKwkJKHgyNV91ZHBfcGt0LT5pcF9wa3QudmVyX2luZXRfaGRyX2xlbmd0aCA9PSAweDQ1KSAmJgorCQkoeDI1X3VkcF9wa3QtPnVkcF9wa3QudWRwX2RzdF9wb3J0ID09IG50b2hzKGNhcmQtPndhbmRldi51ZHBfcG9ydCkpICYmCisJCSh4MjVfdWRwX3BrdC0+d3BfbWdtdC5yZXF1ZXN0X3JlcGx5ID09IFVEUE1HTVRfUkVRVUVTVCkpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXN0cm5jbXAoeDI1X3VkcF9wa3QtPndwX21nbXQuc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRFBNR01UX1hQSVBFX1NJR05BVFVSRSwgOCkpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVURQX1hQSVBFX1RZUEU7CisJCQl9ZWxzZXsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogVURQIFBhY2tldCwgRmFpbGVkIFNpZ25hdHVyZSAhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCX0KKwl9CisKKyAgICAgICAgcmV0dXJuIFVEUF9JTlZBTElEX1RZUEU7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZXBseSB0byBVRFAgTWFuYWdlbWVudCBzeXN0ZW0uCisgKiBSZXR1cm4gbm90aGluZy4KKyAqLworc3RhdGljIGludCByZXBseV91ZHAoIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBtYm94X2xlbiApIAoreworCXVuc2lnbmVkIHNob3J0IGxlbiwgdWRwX2xlbmd0aCwgdGVtcCwgaXBfbGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgaXBfdGVtcDsKKwlpbnQgZXZlbl9ib3VuZCA9IDA7CisKKyAgCisJeDI1X3VkcF9wa3RfdCAqeDI1X3VkcF9wa3QgPSAoeDI1X3VkcF9wa3RfdCAqKWRhdGE7IAorCisJLyogU2V0IGxlbmd0aCBvZiBwYWNrZXQgKi8KKwlsZW4gPSBzaXplb2YoaXBfcGt0X3QpKyAKKwkgICAgICBzaXplb2YodWRwX3BrdF90KSsKKwkgICAgICBzaXplb2Yod3BfbWdtdF90KSsKKwkgICAgICBzaXplb2YoY2Jsb2NrX3QpKworCSAgICAgIG1ib3hfbGVuOworIAorCisJLyogZmlsbCBpbiBVRFAgcmVwbHkgKi8KKwl4MjVfdWRwX3BrdC0+d3BfbWdtdC5yZXF1ZXN0X3JlcGx5ID0gVURQTUdNVF9SRVBMWTsKKyAgCisJLyogZmlsbCBpbiBVRFAgbGVuZ3RoICovCisJdWRwX2xlbmd0aCA9IHNpemVvZih1ZHBfcGt0X3QpKyAKKwkJICAgICBzaXplb2Yod3BfbWdtdF90KSsKKwkJICAgICBzaXplb2YoY2Jsb2NrX3QpKworCQkgICAgIG1ib3hfbGVuOyAKKworCisJLyogcHV0IGl0IG9uIGFuIGV2ZW4gYm91bmRhcnkgKi8KKwlpZiAoIHVkcF9sZW5ndGggJiAweDAwMDEgKSB7CisJCXVkcF9sZW5ndGggKz0gMTsKKwkJbGVuICs9IDE7CisJCWV2ZW5fYm91bmQgPSAxOworCX0KKworCXRlbXAgPSAodWRwX2xlbmd0aDw8OCl8KHVkcF9sZW5ndGg+PjgpOworCXgyNV91ZHBfcGt0LT51ZHBfcGt0LnVkcF9sZW5ndGggPSB0ZW1wOworCSAKKwkvKiBzd2FwIFVEUCBwb3J0cyAqLworCXRlbXAgPSB4MjVfdWRwX3BrdC0+dWRwX3BrdC51ZHBfc3JjX3BvcnQ7CisJeDI1X3VkcF9wa3QtPnVkcF9wa3QudWRwX3NyY19wb3J0ID0gCisJCQl4MjVfdWRwX3BrdC0+dWRwX3BrdC51ZHBfZHN0X3BvcnQ7IAorCXgyNV91ZHBfcGt0LT51ZHBfcGt0LnVkcF9kc3RfcG9ydCA9IHRlbXA7CisKKworCisJLyogYWRkIFVEUCBwc2V1ZG8gaGVhZGVyICovCisJdGVtcCA9IDB4MTEwMDsKKwkqKCh1bnNpZ25lZCBzaG9ydCAqKQorCQkoeDI1X3VkcF9wa3QtPmRhdGErbWJveF9sZW4rZXZlbl9ib3VuZCkpID0gdGVtcDsJCisJdGVtcCA9ICh1ZHBfbGVuZ3RoPDw4KXwodWRwX2xlbmd0aD4+OCk7CisJKigodW5zaWduZWQgc2hvcnQgKikKKwkJKHgyNV91ZHBfcGt0LT5kYXRhK21ib3hfbGVuK2V2ZW5fYm91bmQrMikpID0gdGVtcDsKKwkJIAorCS8qIGNhbGN1bGF0ZSBVRFAgY2hlY2tzdW0gKi8KKwl4MjVfdWRwX3BrdC0+dWRwX3BrdC51ZHBfY2hlY2tzdW0gPSAwOworCisJeDI1X3VkcF9wa3QtPnVkcF9wa3QudWRwX2NoZWNrc3VtID0gCisJCWNhbGNfY2hlY2tzdW0oJmRhdGFbVURQX09GRlNFVF0sIHVkcF9sZW5ndGgrVURQX09GRlNFVCk7CisKKwkvKiBmaWxsIGluIElQIGxlbmd0aCAqLworCWlwX2xlbmd0aCA9IGxlbjsKKwl0ZW1wID0gKGlwX2xlbmd0aDw8OCl8KGlwX2xlbmd0aD4+OCk7CisJeDI1X3VkcF9wa3QtPmlwX3BrdC50b3RhbF9sZW5ndGggPSB0ZW1wOworICAKKwkvKiBzd2FwIElQIGFkZHJlc3NlcyAqLworCWlwX3RlbXAgPSB4MjVfdWRwX3BrdC0+aXBfcGt0LmlwX3NyY19hZGRyZXNzOworCXgyNV91ZHBfcGt0LT5pcF9wa3QuaXBfc3JjX2FkZHJlc3MgPSAKKwkJCQl4MjVfdWRwX3BrdC0+aXBfcGt0LmlwX2RzdF9hZGRyZXNzOworCXgyNV91ZHBfcGt0LT5pcF9wa3QuaXBfZHN0X2FkZHJlc3MgPSBpcF90ZW1wOworCisJCSAKKwkvKiBmaWxsIGluIElQIGNoZWNrc3VtICovCisJeDI1X3VkcF9wa3QtPmlwX3BrdC5oZHJfY2hlY2tzdW0gPSAwOworCXgyNV91ZHBfcGt0LT5pcF9wa3QuaGRyX2NoZWNrc3VtID0gY2FsY19jaGVja3N1bShkYXRhLCBzaXplb2YoaXBfcGt0X3QpKTsKKworCXJldHVybiBsZW47Cit9IC8qIHJlcGx5X3VkcCAqLworCit1bnNpZ25lZCBzaG9ydCBjYWxjX2NoZWNrc3VtIChjaGFyICpkYXRhLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIHNob3J0IHRlbXA7IAorCXVuc2lnbmVkIGxvbmcgc3VtPTA7CisJaW50IGk7CisKKwlmb3IoIGkgPSAwOyBpIDxsZW47IGkrPTIgKSB7CisJCW1lbWNweSgmdGVtcCwmZGF0YVtpXSwyKTsKKwkJc3VtICs9ICh1bnNpZ25lZCBsb25nKXRlbXA7CisJfQorCisJd2hpbGUgKHN1bSA+PiAxNiApIHsKKwkJc3VtID0gKHN1bSAmIDB4ZmZmZlVMKSArIChzdW0gPj4gMTYpOworCX0KKworCXRlbXAgPSAodW5zaWduZWQgc2hvcnQpc3VtOworCXRlbXAgPSB+dGVtcDsKKworCWlmKCB0ZW1wID09IDAgKSAKKwkJdGVtcCA9IDB4ZmZmZjsKKworCXJldHVybiB0ZW1wOwkKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RvcmUgYSBVRFAgbWFuYWdlbWVudCBwYWNrZXQgZm9yIGxhdGVyIHByb2Nlc3NpbmcuCisgKi8KKworc3RhdGljIGludCBzdG9yZV91ZHBfbWdtdF9wa3QoaW50IHVkcF90eXBlLCBjaGFyIHVkcF9wa3Rfc3JjLCBzZGxhX3QqIGNhcmQsCisJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgaW50IGxjbikKK3sKKyAgICAgICAgaW50IHVkcF9wa3Rfc3RvcmVkID0gMDsKKworICAgICAgICBpZighY2FyZC0+dS54LnVkcF9wa3RfbGd0aCAmJiAoc2tiLT5sZW4gPD0gTUFYX0xHVEhfVURQX01HTlRfUEtUKSl7CisgICAgICAgICAgICAgICAgY2FyZC0+dS54LnVkcF9wa3RfbGd0aCA9IHNrYi0+bGVuOworICAgICAgICAgICAgICAgIGNhcmQtPnUueC51ZHBfdHlwZSA9IHVkcF90eXBlOworICAgICAgICAgICAgICAgIGNhcmQtPnUueC51ZHBfcGt0X3NyYyA9IHVkcF9wa3Rfc3JjOworICAgICAgICAgICAgICAgIGNhcmQtPnUueC51ZHBfbGNuID0gbGNuOworCQljYXJkLT51LngudWRwX2RldiA9IGRldjsKKyAgICAgICAgICAgICAgICBtZW1jcHkoY2FyZC0+dS54LnVkcF9wa3RfZGF0YSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisgICAgICAgICAgICAgICAgY2FyZC0+dS54LnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9VRFBfUEtUOworICAgICAgICAgICAgICAgIHVkcF9wa3Rfc3RvcmVkID0gMTsKKworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogRVJST1I6IFVEUCBwYWNrZXQgbm90IHN0b3JlZCBmb3IgTENOICVkXG4iLCAKKwkJCQkJCQljYXJkLT5kZXZuYW1lLGxjbik7CisJfQorCisgICAgICAgIGlmKHVkcF9wa3Rfc3JjID09IFVEUF9QS1RfRlJNX1NUQUNLKXsKKyAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX1lbHNleworICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2JfYW55KHNrYik7CisJfQorCisgICAgICAgIHJldHVybih1ZHBfcGt0X3N0b3JlZCk7Cit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsIHRoZSBwcHBfcHJpdmF0ZV9hcmVhIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQgaW5pdF94MjVfY2hhbm5lbF9zdHJ1Y3QoIHgyNV9jaGFubmVsX3QgKmNoYW4gKQoreworCW1lbXNldCgmY2hhbi0+aWZfc2VuZF9zdGF0LmlmX3NlbmRfZW50cnksMCxzaXplb2YoaWZfc2VuZF9zdGF0X3QpKTsKKwltZW1zZXQoJmNoYW4tPnJ4X2ludHJfc3RhdC5yeF9pbnRyX25vX3NvY2tldCwwLHNpemVvZihyeF9pbnRyX3N0YXRfdCkpOworCW1lbXNldCgmY2hhbi0+cGlwZV9tZ210X3N0YXQuVURQX1BJUEVfbWdtdF9rbWFsbG9jX2VyciwwLHNpemVvZihwaXBlX21nbXRfc3RhdF90KSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBHbG9iYWwgU3RhdGlzdGljcworICovCitzdGF0aWMgdm9pZCBpbml0X2dsb2JhbF9zdGF0aXN0aWNzKCBzZGxhX3QgKmNhcmQgKQoreworCW1lbXNldCgmY2FyZC0+c3RhdGlzdGljcy5pc3JfZW50cnksMCxzaXplb2YoZ2xvYmFsX3N0YXRzX3QpKTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU01QIFN1cHBvcnQKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgUzUwOF9TNTE0X2xvY2soc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpCit7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPndhbmRldi5sb2NrLCAqc21wX2ZsYWdzKTsKK30KK3N0YXRpYyB2b2lkIFM1MDhfUzUxNF91bmxvY2soc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpCit7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+d2FuZGV2LmxvY2ssICpzbXBfZmxhZ3MpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogeDI1X3RpbWVyX3JvdXRpbmUKKyAqCisgKiAJQSBtb3JlIGVmZmljaWVudCBwb2xsaW5nIHJvdXRpbmUuICBFYWNoIGhhbGYgYSBzZWNvbmQKKyAqIAlxdWV1ZSBhIHBvbGxpbmcgdGFzay4gV2Ugd2FudCB0byBkbyB0aGUgcG9sbGluZyBpbiBhIAorICogCXRhc2sgbm90IHRpbWVyLCBiZWNhdXNlIHRpbWVyIHJ1bnMgaW4gaW50ZXJydXB0IHRpbWUuCisgKgorICogCUZJWE1FIFBvbGxpbmcgc2hvdWxkIGJlIHJldGhpbmtlZC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCB4MjVfdGltZXJfcm91dGluZSh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc2RsYV90ICpjYXJkID0gKHNkbGFfdCopZGF0YTsKKworCWlmICghY2FyZC0+d2FuZGV2LmRldil7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTdG9wcGluZyB0aGUgWDI1IFBvbGwgVGltZXI6IE5vIERldi5cbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY2FyZC0+b3Blbl9jbnQgIT0gY2FyZC0+dS54Lm51bV9vZl9jaCl7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTdG9wcGluZyB0aGUgWDI1IFBvbGwgVGltZXI6IEludGVyZmFjZSBkb3duLlxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh0ZXN0X2JpdChQRVJJX0NSSVQsJmNhcmQtPndhbmRldi5jcml0aWNhbCkpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogU3RvcHBpbmcgdGhlIFgyNSBQb2xsIFRpbWVyOiBTaHV0dGluZyBkb3duLlxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUE9MTF9DUklULCZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkJdHJpZ2dlcl94MjVfcG9sbChjYXJkKTsKKwl9CisJCisJY2FyZC0+dS54LngyNV90aW1lci5leHBpcmVzPWppZmZpZXMrKEhaPj4xKTsKKwlhZGRfdGltZXIoJmNhcmQtPnUueC54MjVfdGltZXIpOworCXJldHVybjsKK30KKwordm9pZCBkaXNhYmxlX2NvbW1fc2h1dGRvd24oc2RsYV90ICpjYXJkKQoreworCVRYMjVNYm94KiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgZXJyOworCisJLyogVHVybiBvZiBpbnRlcnJ1dHBzICovCisJbWJveC0+ZGF0YVswXSA9IDA7CisJaWYgKGNhcmQtPmh3LmZ3aWQgPT0gU0ZJRF9YMjVfNTA4KXsKKwkJbWJveC0+ZGF0YVsxXSA9IGNhcmQtPmh3LmlycTsKKwkJbWJveC0+ZGF0YVsyXSA9IDI7CisJCW1ib3gtPmNtZC5sZW5ndGggPSAzOworCX1lbHNlIHsKKwkgCW1ib3gtPmNtZC5sZW5ndGggID0gMTsKKwl9CisJbWJveC0+Y21kLmNvbW1hbmQgPSBYMjVfU0VUX0lOVEVSUlVQVF9NT0RFOworCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyKQorCQlwcmludGsoS0VSTl9JTkZPICJJTlRFUlJVUFQgT0ZGIEZBSUVEICV4XG4iLGVycik7CisKKwkvKiBCcmluZyBkb3duIEhETEMgKi8KKwltYm94LT5jbWQuY29tbWFuZCA9IFgyNV9IRExDX0xJTktfQ0xPU0U7CisJbWJveC0+Y21kLmxlbmd0aCAgPSAwOworCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyKQorCQlwcmludGsoS0VSTl9JTkZPICJMSU5LIENMT1NFRCBGQUlMRUQgJXhcbiIsZXJyKTsKKworCisJLyogQnJpbmQgZG93biBEVFIgKi8KKwltYm94LT5kYXRhWzBdID0gMDsKKwltYm94LT5kYXRhWzJdID0gMDsKKwltYm94LT5kYXRhWzFdID0gMHgwMTsKKwltYm94LT5jbWQubGVuZ3RoICA9IDM7CisJbWJveC0+Y21kLmNvbW1hbmQgPSBYMjVfU0VUX0dMT0JBTF9WQVJTOworCWVyciA9IHNkbGFfZXhlYyhtYm94KSA/IG1ib3gtPmNtZC5yZXN1bHQgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyKQorCQlwcmludGsoS0VSTl9JTkZPICJEVFIgRE9XTiBGQUlMRUQgJXhcbiIsZXJyKTsKKworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qKioqKiogRW5kICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NkbGFkcnYuYyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiYzZkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vc2RsYWRydi5jCkBAIC0wLDAgKzEsMjMxOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHNkbGFkcnYuYwlTRExBIFN1cHBvcnQgTW9kdWxlLiAgTWFpbiBtb2R1bGUuCisqCisqCQlUaGlzIG1vZHVsZSBpcyBhIGxpYnJhcnkgb2YgY29tbW9uIGhhcmR3YXJlLXNwZWNpZmljIGZ1bmN0aW9ucworKgkJdXNlZCBieSBhbGwgU2FuZ29tYSBkcml2ZXJzLgorKgorKiBBdXRob3I6CUdpZGVvbiBIYWNrCQorKgorKiBDb3B5cmlnaHQ6CShjKSAxOTk1LTIwMDAgU2FuZ29tYSBUZWNobm9sb2dpZXMgSW5jLgorKgorKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiBNYXIgMjAsIDIwMDEgIE5lbmFkIENvcmJpYwlBZGRlZCB0aGUgYXV0b19wY2lfY2ZnIGZpbGVkLCB0byBzdXBwb3J0CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBQQ0lTTE9UICMwLiAKKyogQXByIDA0LCAyMDAwICBOZW5hZCBDb3JiaWMJRml4ZWQgdGhlIGF1dG8gbWVtb3J5IGRldGVjdGlvbiBjb2RlLgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWVtb3J5IHRlc3QgYXQgYWRkcmVzcyAweEM4MDAwLgorKiBNYXIgMDksIDIwMDAgIE5lbmFkIENvcmJpYyAJQWRkZWQgR2lkZW9uJ3MgQnVnIEZpeDogY2xlYXIgcGNpCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdCBmbGFncyBvbiBpbml0aWFsIGxvYWQuCisqIEp1biAwMiwgMTk5OSAgR2lkZW9uIEhhY2sgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBTNTE0IGFkYXB0ZXIuCisqCQkJCVVwZGF0ZXMgZm9yIExpbnV4IDIuMi5YIGtlcm5lbHMuCQorKiBTZXAgMTcsIDE5OTgJSmFzcHJlZXQgU2luZ2gJVXBkYXRlcyBmb3IgbGludXggMi4yLlgga2VybmVscworKiBEZWMgMjAsIDE5OTYJR2VuZSBLb3ppbglWZXJzaW9uIDMuMC4wLiBDb21wbGV0ZSBvdmVyaGF1bC4KKyogSnVsIDEyLCAxOTk2CUdlbmUgS296aW4JQ2hhbmdlcyBmb3IgTGludXggMi4wIGNvbXBhdGliaWxpdHkuCisqIEp1biAxMiwgMTk5NglHZW5lIEtvemluIAlBZGRlZCBzdXBwb3J0IGZvciBTNTAzIGNhcmQuCisqIEFwciAzMCwgMTk5NglHZW5lIEtvemluCVNETEEgaGFyZHdhcmUgaW50ZXJydXB0IGlzIGFja25vd2xlZGdlZCBiZWZvcmUKKyoJCQkJY2FsbGluZyBwcm90b2NvbHNwZWNpZmljIElTUi4KKyoJCQkJUmVnaXN0ZXIgSS9PIHBvcnRzIHdpdGggTGludXgga2VybmVsLgorKgkJCQlNaXNjZWxsYW5lb3VzIGJ1ZyBmaXhlcy4KKyogRGVjIDIwLCAxOTk1CUdlbmUgS296aW4JRml4ZWQgYSBidWcgaW4gaW50ZXJydXB0IHJvdXRpbmUuCisqIE9jdCAxNCwgMTk5NQlHZW5lIEtvemluCUluaXRpYWwgdmVyc2lvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5vdGVzOgorICogLS0tLS0tCisgKiAxLiBUaGlzIGNvZGUgaXMgbWVudCB0byBiZSBzeXN0ZW0taW5kZXBlbmRlbnQgKGFzIG11Y2ggYXMgcG9zc2libGUpLiAgVG8KKyAqICAgIGFjaGl2ZSB0aGlzLCB2YXJpb3VzIG1hY3JvcyBhcmUgdXNlZCB0byBoaWRlIHN5c3RlbS1zcGVjaWZpYyBpbnRlcmZhY2VzLgorICogICAgVG8gY29tcGlsZSB0aGlzIGNvZGUsIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyBtdXN0IGJlIGRlZmluZWQ6CisgKgorICoJUGxhdGZvcm0JRGVmaW5lCisgKgktLS0tLS0tLQktLS0tLS0KKyAqCUxpbnV4CQlfTElOVVhfCisgKglTQ08gVW5peAlfU0NPX1VOSVhfCisgKgorICogMi4gU3VwcG9ydGVkIGFkYXB0ZXIgdHlwZXM6CisgKgorICoJUzUwMkEKKyAqCUVTNTAyQSAoUzUwMkUpCisgKglTNTAzCisgKglTNTA3CisgKglTNTA4IChTNTA5KQorICoKKyAqIDMuIFM1MDJBIE5vdGVzOgorICoKKyAqCVRoZXJlIGlzIG5vIHNlcGFyYXRlIERQTSB3aW5kb3cgZW5hYmxlL2Rpc2FibGUgY29udHJvbCBpbiBTNTAyQS4gIEl0CisgKglvcGVucyBpbW1lZGlhdGVseSBhZnRlciBhIHdpbmRvdyBudW1iZXIgaXQgd3JpdHRlbiB0byB0aGUgSE1DUgorICoJcmVnaXN0ZXIuICBUbyBjbG9zZSB0aGUgd2luZG93LCBITUNSIGhhcyB0byBiZSB3cml0dGVuIGEgdmFsdWUKKyAqCT8/Pz8xMTExYiAoZS5nLiAweDBGIG9yIDB4RkYpLgorICoKKyAqCVM1MDJBIERQTSB3aW5kb3cgY2Fubm90IGJlIGxvY2F0ZWQgYXQgb2Zmc2V0IEUwMDAgKGUuZy4gMHhBRTAwMCkuCisgKgorICoJVGhlcmUgc2hvdWxkIGJlIGEgZGVsYXkgb2YgPz8/IGJlZm9yZSByZWFkaW5nIGJhY2sgUzUwMkEgc3RhdHVzCisgKglyZWdpc3Rlci4KKyAqCisgKiA0LiBTNTAyRSBOb3RlczoKKyAqCisgKglTNTAyRSBoYXMgYSBoL3cgYnVnOiBhbHRob3VnaCBkZWZhdWx0IElSUSBsaW5lIHN0YXRlIGlzIEhJR0gsIGVuYWJsaW5nCisgKglpbnRlcnJ1cHRzIGJ5IHNldHRpbmcgYml0IDEgb2YgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgKEJBU0UpIHRvICcxJworICoJY2F1c2VzIGl0IHRvIGdvIExPVyEgVGhlcmVmb3JlLCBkaXNhYmxpbmcgaW50ZXJydXB0cyBieSBzZXR0aW5nIHRoYXQKKyAqCWJpdCB0byAnMCcgY2F1c2VzIGxvdy10by1oaWdoIHRyYW5zaXRpb24gb24gSVJRIGxpbmUgKGdob3N0eQorICoJaW50ZXJydXB0KS4gVGhlIHNhbWUgb2NjdXJzIHdoZW4gZGlzYWJsaW5nIENQVSBieSByZXNldHRpbmcgYml0IDAgb2YKKyAqCUNQVSBjb250cm9sIHJlZ2lzdGVyIChCQVNFKzMpIC0gc2VlIHRoZSBuZXh0IG5vdGUuCisgKgorICoJUzUwMkUgQ1BVIGFuZCBEUE0gY29udHJvbCBpcyBsaW1pdGVkOgorICoKKyAqCW8gQ1BVIGNhbm5vdCBiZSBzdG9wcGVkIGluZGVwZW5kZW50bHkuIFJlc2V0dGluZyBiaXQgMCBvZiB0aGUgQ1BVaQorICoJICBjb250cm9sIHJlZ2lzdGVyIChCQVNFKzMpIHNodXRzIHRoZSBib2FyZCBkb3duIGVudGlyZWx5LCBpbmNsdWRpbmcKKyAqCSAgRFBNOworICoKKyAqCW8gRFBNIGFjY2VzcyBjYW5ub3QgYmUgY29udHJvbGxlZCBkeW5hbWljYWxseS4gT25lcyBDUFUgaXMgc3RhcnRlZCwKKyAqCSAgYml0IDEgb2YgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgKEJBU0UpIGlzIHVzZWQgdG8gZW5hYmxlL2Rpc2FibGUgSVJRLAorICoJICBzbyB0aGF0IGFjY2VzcyB0byBzaGFyZWQgbWVtb3J5IGNhbm5vdCBiZSBkaXNhYmxlZCB3aGlsZSBDUFUgaXMKKyAqCSAgcnVubmluZy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lCV9MSU5VWF8KKworI2lmCWRlZmluZWQoX0xJTlVYXykJLyoqKioqKiBMaW51eCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIHByaW50aygpLCBhbmQgb3RoZXIgdXNlZnVsIHN0dWZmICovCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CS8qIG9mZnNldG9mKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgkvKiByZXR1cm4gY29kZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4JLyogaW5saW5lIG1lbXNldCgpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIHN1cHBvcnQgZm9yIGxvYWRhYmxlIG1vZHVsZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CS8qIGZvciBqaWZmaWVzLCBIWiwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L3NkbGFkcnYuaD4JLyogQVBJIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvc2RsYXNmbS5oPgkvKiBTRExBIGZpcm13YXJlIG1vZHVsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L3NkbGFwY2kuaD4JLyogU0RMQSBQQ0kgaGFyZHdhcmUgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4JCS8qIFBDSSBkZWZpbmVzIGFuZCBmdW5jdGlvbiBwcm90b3R5cGVzICovCisjaW5jbHVkZSA8YXNtL2lvLmg+CQkvKiBmb3IgaW5iKCksIG91dGIoKSwgZXRjLiAqLworCisjZGVmaW5lIF9JTkIocG9ydCkJCShpbmIocG9ydCkpCisjZGVmaW5lIF9PVVRCKHBvcnQsIGJ5dGUpCShvdXRiKChieXRlKSwocG9ydCkpKQorI2RlZmluZQlTWVNURU1fVElDSwkJamlmZmllcworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisKKyNlbGlmCWRlZmluZWQoX1NDT19VTklYXykJLyoqKioqKiBTQ08gVW5peCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYJIWRlZmluZWQoSU5LRVJORUwpCisjZXJyb3IJVGhpcyBjb2RlIE1VU1QgYmUgY29tcGlsZWQgaW4ga2VybmVsIG1vZGUhCisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvc2RsYWRydi5oPgkvKiBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxzeXMvc2RsYXNmbS5oPgkvKiBTRExBIGZpcm13YXJlIG1vZHVsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPHN5cy9pbmxpbmUuaD4JCS8qIGZvciBpbmIoKSwgb3V0YigpLCBldGMuICovCisjZGVmaW5lIF9JTkIocG9ydCkJCShpbmIocG9ydCkpCisjZGVmaW5lIF9PVVRCKHBvcnQsIGJ5dGUpCShvdXRiKChwb3J0KSwoYnl0ZSkpKQorI2RlZmluZQlTWVNURU1fVElDSwkJbGJvbHQKKworI2Vsc2UKKyNlcnJvcglVbmtub3duIHN5c3RlbSB0eXBlIQorI2VuZGlmCisKKyNkZWZpbmUJTU9EX1ZFUlNJT04JMworI2RlZmluZQlNT0RfUkVMRUFTRQkwCisKKyNkZWZpbmUJU0RMQV9JT0RFTEFZCTEwMAkvKiBJL08gUmQvV3IgZGVsYXksIDEwIHdvcmtzIGZvciA0ODZEWDItNjYgKi8KKyNkZWZpbmUJRVhFQ19ERUxBWQkyMAkvKiBzaGFyZWQgbWVtb3J5IGFjY2VzcyBkZWxheSwgbWtzICovCisjZGVmaW5lCUVYRUNfVElNRU9VVAkoSFoqMikJLyogY29tbWFuZCB0aW1lb3V0LCBpbiB0aWNrcyAqLworCisvKiBJL08gcG9ydCBhZGRyZXNzIHJhbmdlICovCisjZGVmaW5lIFM1MDJBX0lPUkFOR0UJMworI2RlZmluZSBTNTAyRV9JT1JBTkdFCTQKKyNkZWZpbmUgUzUwM19JT1JBTkdFCTMKKyNkZWZpbmUgUzUwN19JT1JBTkdFCTQKKyNkZWZpbmUgUzUwOF9JT1JBTkdFCTQKKworLyogTWF4aW11bSBhbW91bnQgb2YgbWVtb3J5ICovCisjZGVmaW5lIFM1MDJfTUFYTUVNCTB4MTAwMDBMCisjZGVmaW5lIFM1MDNfTUFYTUVNCTB4MTAwMDBMCisjZGVmaW5lIFM1MDdfTUFYTUVNCTB4NDAwMDBMCisjZGVmaW5lIFM1MDhfTUFYTUVNCTB4NDAwMDBMCisKKy8qIE1pbmltdW0gYW1vdW50IG9mIG1lbW9yeSAqLworI2RlZmluZSBTNTAyX01JTk1FTQkweDgwMDBMCisjZGVmaW5lIFM1MDNfTUlOTUVNCTB4ODAwMEwKKyNkZWZpbmUgUzUwN19NSU5NRU0JMHgyMDAwMEwKKyNkZWZpbmUgUzUwOF9NSU5NRU0JMHgyMDAwMEwKKyNkZWZpbmUgTk9fUE9SVCAgICAgICAgIC0xCisKKworCisKKworLyoqKioqKiBGdW5jdGlvbiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEhhcmR3YXJlLXNwZWNpZmljIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBzZGxhX2RldGVjdAkoc2RsYWh3X3QqIGh3KTsKK3N0YXRpYyBpbnQgc2RsYV9hdXRvZHBtCShzZGxhaHdfdCogaHcpOworc3RhdGljIGludCBzZGxhX3NldGRwbQkoc2RsYWh3X3QqIGh3KTsKK3N0YXRpYyBpbnQgc2RsYV9sb2FkCShzZGxhaHdfdCogaHcsIHNmbV90KiBzZm0sIHVuc2lnbmVkIGxlbik7CitzdGF0aWMgaW50IHNkbGFfaW5pdAkoc2RsYWh3X3QqIGh3KTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNkbGFfbWVtdGVzdCAoc2RsYWh3X3QqIGh3KTsKK3N0YXRpYyBpbnQgc2RsYV9ib290Y2ZnCShzZGxhaHdfdCogaHcsIHNmbV9pbmZvX3QqIHNmbWluZm8pOworc3RhdGljIHVuc2lnbmVkIGNoYXIgbWFrZV9jb25maWdfYnl0ZSAoc2RsYWh3X3QqIGh3KTsKK3N0YXRpYyBpbnQgc2RsYV9zdGFydAkoc2RsYWh3X3QqIGh3LCB1bnNpZ25lZCBhZGRyKTsKKworc3RhdGljIGludCBpbml0X3M1MDJhCShzZGxhaHdfdCogaHcpOworc3RhdGljIGludCBpbml0X3M1MDJlCShzZGxhaHdfdCogaHcpOworc3RhdGljIGludCBpbml0X3M1MDMJKHNkbGFod190KiBodyk7CitzdGF0aWMgaW50IGluaXRfczUwNwkoc2RsYWh3X3QqIGh3KTsKK3N0YXRpYyBpbnQgaW5pdF9zNTA4CShzZGxhaHdfdCogaHcpOworICAgICAgICAgICAgCitzdGF0aWMgaW50IGRldGVjdF9zNTAyYQkoaW50IHBvcnQpOworc3RhdGljIGludCBkZXRlY3RfczUwMmUJKGludCBwb3J0KTsKK3N0YXRpYyBpbnQgZGV0ZWN0X3M1MDMJKGludCBwb3J0KTsKK3N0YXRpYyBpbnQgZGV0ZWN0X3M1MDcJKGludCBwb3J0KTsKK3N0YXRpYyBpbnQgZGV0ZWN0X3M1MDgJKGludCBwb3J0KTsKK3N0YXRpYyBpbnQgZGV0ZWN0X3M1MTQgIChzZGxhaHdfdCogaHcpOworc3RhdGljIGludCBmaW5kX3M1MTRfYWRhcHRlcihzZGxhaHdfdCogaHcsIGNoYXIgZmluZF9maXJzdF9TNTE0X2NhcmQpOworCisvKiBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgcGVla19ieV80ICh1bnNpZ25lZCBsb25nIHNyYywgdm9pZCogYnVmLCB1bnNpZ25lZCBsZW4pOworc3RhdGljIHZvaWQgcG9rZV9ieV80ICh1bnNpZ25lZCBsb25nIGRlc3QsIHZvaWQqIGJ1ZiwgdW5zaWduZWQgbGVuKTsKK3N0YXRpYyBpbnQgY2FsaWJyYXRlX2RlbGF5IChpbnQgbWtzKTsKK3N0YXRpYyBpbnQgZ2V0X29wdGlvbl9pbmRleCAodW5zaWduZWQqIG9wdGxpc3QsIHVuc2lnbmVkIG9wdHZhbCk7CitzdGF0aWMgdW5zaWduZWQgY2hlY2tfbWVtcmVnaW9uICh2b2lkKiBwdHIsIHVuc2lnbmVkIGxlbik7CitzdGF0aWMgdW5zaWduZWQJdGVzdF9tZW1yZWdpb24gKHZvaWQqIHB0ciwgdW5zaWduZWQgbGVuKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBjaGVja3N1bSAodW5zaWduZWQgY2hhciogYnVmLCB1bnNpZ25lZCBsZW4pOworc3RhdGljIGludCBpbml0X3BjaV9zbG90KHNkbGFod190ICopOworCitzdGF0aWMgaW50IHBjaV9wcm9iZShzZGxhaHdfdCAqaHcpOworCisvKioqKioqIEdsb2JhbCBEYXRhICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5vdGU6IEFsbCBkYXRhIG11c3QgYmUgZXhwbGljaXRseSBpbml0aWFsaXplZCEhIQorICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzZGxhZHJ2X3BjaV90YmxbXSA9IHsKKwl7IFYzX1ZFTkRPUl9JRCwgVjNfREVWSUNFX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgfQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNkbGFkcnZfcGNpX3RibCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogcHJpdmF0ZSBkYXRhICovCitzdGF0aWMgY2hhciBtb2RuYW1lW10JPSAic2RsYWRydiI7CitzdGF0aWMgY2hhciBmdWxsbmFtZVtdCT0gIlNETEEgU3VwcG9ydCBNb2R1bGUiOworc3RhdGljIGNoYXIgY29weXJpZ2h0W10JPSAiKGMpIDE5OTUtMTk5OSBTYW5nb21hIFRlY2hub2xvZ2llcyBJbmMuIjsKK3N0YXRpYyB1bnNpZ25lZAlleGVjX2lkbGU7CisKKy8qIEhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKyAqIFRoZXNlIGFyZSBhcnJheXMgb2YgY29uZmlndXJhdGlvbiBvcHRpb25zIHVzZWQgYnkgdmVyaWZpY2F0aW9uIHJvdXRpbmVzLgorICogVGhlIGZpcnN0IGVsZW1lbnQgb2YgZWFjaCBhcnJheSBpcyBpdHMgc2l6ZSAoaS5lLiBudW1iZXIgb2Ygb3B0aW9ucykuCisgKi8KK3N0YXRpYyB1bnNpZ25lZAlzNTAyX3BvcnRfb3B0aW9uc1tdID0KKwl7IDQsIDB4MjUwLCAweDMwMCwgMHgzNTAsIDB4MzYwIH0KKzsKK3N0YXRpYyB1bnNpZ25lZAlzNTAzX3BvcnRfb3B0aW9uc1tdID0KKwl7IDgsIDB4MjUwLCAweDI1NCwgMHgzMDAsIDB4MzA0LCAweDM1MCwgMHgzNTQsIDB4MzYwLCAweDM2NCB9Cis7CitzdGF0aWMgdW5zaWduZWQJczUwOF9wb3J0X29wdGlvbnNbXSA9CisJeyA4LCAweDI1MCwgMHgyNzAsIDB4MjgwLCAweDMwMCwgMHgzNTAsIDB4MzYwLCAweDM4MCwgMHgzOTAgfQorOworCitzdGF0aWMgdW5zaWduZWQgczUwMmFfaXJxX29wdGlvbnNbXSA9IHsgMCB9Oworc3RhdGljIHVuc2lnbmVkIHM1MDJlX2lycV9vcHRpb25zW10gPSB7IDQsIDIsIDMsIDUsIDcgfTsKK3N0YXRpYyB1bnNpZ25lZCBzNTAzX2lycV9vcHRpb25zW10gID0geyA1LCAyLCAzLCA0LCA1LCA3IH07CitzdGF0aWMgdW5zaWduZWQgczUwOF9pcnFfb3B0aW9uc1tdICA9IHsgOCwgMywgNCwgNSwgNywgMTAsIDExLCAxMiwgMTUgfTsKKworc3RhdGljIHVuc2lnbmVkIHM1MDJhX2RwbWJhc2Vfb3B0aW9uc1tdID0KK3sKKwkyOCwKKwkweEEwMDAwLCAweEEyMDAwLCAweEE0MDAwLCAweEE2MDAwLCAweEE4MDAwLCAweEFBMDAwLCAweEFDMDAwLAorCTB4QzAwMDAsIDB4QzIwMDAsIDB4QzQwMDAsIDB4QzYwMDAsIDB4QzgwMDAsIDB4Q0EwMDAsIDB4Q0MwMDAsCisJMHhEMDAwMCwgMHhEMjAwMCwgMHhENDAwMCwgMHhENjAwMCwgMHhEODAwMCwgMHhEQTAwMCwgMHhEQzAwMCwKKwkweEUwMDAwLCAweEUyMDAwLCAweEU0MDAwLCAweEU2MDAwLCAweEU4MDAwLCAweEVBMDAwLCAweEVDMDAwLAorfTsKK3N0YXRpYyB1bnNpZ25lZCBzNTA3X2RwbWJhc2Vfb3B0aW9uc1tdID0KK3sKKwkzMiwKKwkweEEwMDAwLCAweEEyMDAwLCAweEE0MDAwLCAweEE2MDAwLCAweEE4MDAwLCAweEFBMDAwLCAweEFDMDAwLCAweEFFMDAwLAorCTB4QjAwMDAsIDB4QjIwMDAsIDB4QjQwMDAsIDB4QjYwMDAsIDB4QjgwMDAsIDB4QkEwMDAsIDB4QkMwMDAsIDB4QkUwMDAsCisJMHhDMDAwMCwgMHhDMjAwMCwgMHhDNDAwMCwgMHhDNjAwMCwgMHhDODAwMCwgMHhDQTAwMCwgMHhDQzAwMCwgMHhDRTAwMCwKKwkweEUwMDAwLCAweEUyMDAwLCAweEU0MDAwLCAweEU2MDAwLCAweEU4MDAwLCAweEVBMDAwLCAweEVDMDAwLCAweEVFMDAwLAorfTsKK3N0YXRpYyB1bnNpZ25lZCBzNTA4X2RwbWJhc2Vfb3B0aW9uc1tdID0JLyogaW5jbC4gUzUwMkUgYW5kIFM1MDMgKi8KK3sKKwkzMiwKKwkweEEwMDAwLCAweEEyMDAwLCAweEE0MDAwLCAweEE2MDAwLCAweEE4MDAwLCAweEFBMDAwLCAweEFDMDAwLCAweEFFMDAwLAorCTB4QzAwMDAsIDB4QzIwMDAsIDB4QzQwMDAsIDB4QzYwMDAsIDB4QzgwMDAsIDB4Q0EwMDAsIDB4Q0MwMDAsIDB4Q0UwMDAsCisJMHhEMDAwMCwgMHhEMjAwMCwgMHhENDAwMCwgMHhENjAwMCwgMHhEODAwMCwgMHhEQTAwMCwgMHhEQzAwMCwgMHhERTAwMCwKKwkweEUwMDAwLCAweEUyMDAwLCAweEU0MDAwLCAweEU2MDAwLCAweEU4MDAwLCAweEVBMDAwLCAweEVDMDAwLCAweEVFMDAwLAorfTsKKworLyoKK3N0YXRpYyB1bnNpZ25lZAlzNTAyX2RwbXNpemVfb3B0aW9uc1tdID0geyAyLCAweDIwMDAsIDB4MTAwMDAgfTsKK3N0YXRpYyB1bnNpZ25lZAlzNTA3X2RwbXNpemVfb3B0aW9uc1tdID0geyAyLCAweDIwMDAsIDB4NDAwMCB9Oworc3RhdGljIHVuc2lnbmVkCXM1MDhfZHBtc2l6ZV9vcHRpb25zW10gPSB7IDEsIDB4MjAwMCB9OworKi8KKworc3RhdGljIHVuc2lnbmVkCXM1MDJhX3BjbGtfb3B0aW9uc1tdID0geyAyLCAzNjAwLCA3MjAwIH07CitzdGF0aWMgdW5zaWduZWQJczUwMmVfcGNsa19vcHRpb25zW10gPSB7IDUsIDM2MDAsIDUwMDAsIDcyMDAsIDgwMDAsIDEwMDAwIH07CitzdGF0aWMgdW5zaWduZWQJczUwM19wY2xrX29wdGlvbnNbXSAgPSB7IDMsIDcyMDAsIDgwMDAsIDEwMDAwIH07CitzdGF0aWMgdW5zaWduZWQJczUwN19wY2xrX29wdGlvbnNbXSAgPSB7IDEsIDEyMjg4IH07CitzdGF0aWMgdW5zaWduZWQJczUwOF9wY2xrX29wdGlvbnNbXSAgPSB7IDEsIDE2MDAwIH07CisKKy8qIEhvc3QgbWVtb3J5IGNvbnRyb2wgcmVnaXN0ZXIgbWFza3MgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHM1MDJhX2htY3JbXSA9Cit7CisJMHgxMCwgMHgxMiwgMHgxNCwgMHgxNiwgMHgxOCwgMHgxQSwgMHgxQywJLyogQTAwMDAgLSBBQzAwMCAqLworCTB4MjAsIDB4MjIsIDB4MjQsIDB4MjYsIDB4MjgsIDB4MkEsIDB4MkMsCS8qIEMwMDAwIC0gQ0MwMDAgKi8KKwkweDAwLCAweDAyLCAweDA0LCAweDA2LCAweDA4LCAweDBBLCAweDBDLAkvKiBEMDAwMCAtIERDMDAwICovCisJMHgzMCwgMHgzMiwgMHgzNCwgMHgzNiwgMHgzOCwgMHgzQSwgMHgzQywJLyogRTAwMDAgLSBFQzAwMCAqLworfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHM1MDJlX2htY3JbXSA9Cit7CisJMHgxMCwgMHgxMiwgMHgxNCwgMHgxNiwgMHgxOCwgMHgxQSwgMHgxQywgMHgxRSwJLyogQTAwMDAgLSBBRTAwMCAqLworCTB4MjAsIDB4MjIsIDB4MjQsIDB4MjYsIDB4MjgsIDB4MkEsIDB4MkMsIDB4MkUsCS8qIEMwMDAwIC0gQ0UwMDAgKi8KKwkweDAwLCAweDAyLCAweDA0LCAweDA2LCAweDA4LCAweDBBLCAweDBDLCAweDBFLAkvKiBEMDAwMCAtIERFMDAwICovCisJMHgzMCwgMHgzMiwgMHgzNCwgMHgzNiwgMHgzOCwgMHgzQSwgMHgzQywgMHgzRSwJLyogRTAwMDAgLSBFRTAwMCAqLworfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHM1MDdfaG1jcltdID0KK3sKKwkweDAwLCAweDAyLCAweDA0LCAweDA2LCAweDA4LCAweDBBLCAweDBDLCAweDBFLAkvKiBBMDAwMCAtIEFFMDAwICovCisJMHg0MCwgMHg0MiwgMHg0NCwgMHg0NiwgMHg0OCwgMHg0QSwgMHg0QywgMHg0RSwJLyogQjAwMDAgLSBCRTAwMCAqLworCTB4ODAsIDB4ODIsIDB4ODQsIDB4ODYsIDB4ODgsIDB4OEEsIDB4OEMsIDB4OEUsCS8qIEMwMDAwIC0gQ0UwMDAgKi8KKwkweEMwLCAweEMyLCAweEM0LCAweEM2LCAweEM4LCAweENBLCAweENDLCAweENFLAkvKiBFMDAwMCAtIEVFMDAwICovCit9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgczUwOF9obWNyW10gPQoreworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCS8qIEEwMDAwIC0gQUUwMDAgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LAkvKiBDMDAwMCAtIENFMDAwICovCisJMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwJLyogRDAwMDAgLSBERTAwMCAqLworCTB4MTgsIDB4MTksIDB4MUEsIDB4MUIsIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYsCS8qIEUwMDAwIC0gRUUwMDAgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHM1MDdfaXJxbWFza1tdID0KK3sKKwkweDAwLCAweDIwLCAweDQwLCAweDYwLCAweDgwLCAweEEwLCAweEMwLCAweEUwCit9OworCitzdGF0aWMgaW50IHBjaV9zbG90X2FyW01BWF9TNTE0X0NBUkRTXTsKKworLyoqKioqKiogS2VybmVsIExvYWRhYmxlIE1vZHVsZSBFbnRyeSBQb2ludHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTW9kdWxlICdpbnNlcnQnIGVudHJ5IHBvaW50LgorICogbyBwcmludCBhbm5vdW5jZW1lbnQKKyAqIG8gaW5pdGlhbGl6ZSBzdGF0aWMgZGF0YQorICogbyBjYWxpYnJhdGUgU0RMQSBzaGFyZWQgbWVtb3J5IGFjY2VzcyBkZWxheS4KKyAqCisgKiBSZXR1cm46CTAJT2sKKyAqCQk8IDAJZXJyb3IuCisgKiBDb250ZXh0Oglwcm9jZXNzCisgKi8KKworc3RhdGljIGludCBfX2luaXQgc2RsYWRydl9pbml0KHZvaWQpCit7CisJaW50IGk9MDsKKworCXByaW50ayhLRVJOX0lORk8gIiVzIHYldS4ldSAlc1xuIiwKKwkJZnVsbG5hbWUsIE1PRF9WRVJTSU9OLCBNT0RfUkVMRUFTRSwgY29weXJpZ2h0KTsKKwlleGVjX2lkbGUgPSBjYWxpYnJhdGVfZGVsYXkoRVhFQ19ERUxBWSk7CisjaWZkZWYgV0FOREVCVUcJCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBleGVjX2lkbGUgPSAlZFxuIiwgbW9kbmFtZSwgZXhlY19pZGxlKTsKKyNlbmRpZgkKKworCS8qIEluaXRpYWxpemUgdGhlIFBDSSBDYXJkIGFycmF5LCB3aGljaAorICAgICAgICAgKiB3aWxsIHN0b3JlIGZsYWdzLCB1c2VkIHRvIG1hcmsgCisgICAgICAgICAqIGNhcmQgaW5pdGlhbGl6YXRpb24gc3RhdGUgKi8KKwlmb3IgKGk9MDsgaTxNQVhfUzUxNF9DQVJEUzsgaSsrKQorCQlwY2lfc2xvdF9hcltpXSA9IDB4RkY7CisKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBNb2R1bGUgJ3JlbW92ZScgZW50cnkgcG9pbnQuCisgKiBvIHJlbGVhc2UgYWxsIHJlbWFpbmluZyBzeXN0ZW0gcmVzb3VyY2VzCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBzZGxhZHJ2X2NsZWFudXAodm9pZCkKK3sKK30KKworbW9kdWxlX2luaXQoc2RsYWRydl9pbml0KTsKK21vZHVsZV9leGl0KHNkbGFkcnZfY2xlYW51cCk7CisKKy8qKioqKioqIEtlcm5lbCBBUElzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCB1cCBhZGFwdGVyLgorICogbyBkZXRlY3QgYWRhcHRlciB0eXBlCisgKiBvIHZlcmlmeSBoYXJkd2FyZSBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyAqIG8gY2hlY2sgZm9yIGhhcmR3YXJlIGNvbmZsaWN0cworICogbyBzZXQgdXAgYWRhcHRlciBzaGFyZWQgbWVtb3J5CisgKiBvIHRlc3QgYWRhcHRlciBtZW1vcnkKKyAqIG8gbG9hZCBmaXJtd2FyZQorICogUmV0dXJuOgkwCW9rLgorICoJCTwgMAllcnJvcgorICovCisKK0VYUE9SVF9TWU1CT0woc2RsYV9zZXR1cCk7CisKK2ludCBzZGxhX3NldHVwIChzZGxhaHdfdCogaHcsIHZvaWQqIHNmbSwgdW5zaWduZWQgbGVuKQoreworCXVuc2lnbmVkKiBpcnFfb3B0CT0gTlVMTDsJLyogSVJRIG9wdGlvbnMgKi8KKwl1bnNpZ25lZCogZHBtYmFzZV9vcHQJPSBOVUxMOwkvKiBEUE0gd2luZG93IGJhc2Ugb3B0aW9ucyAqLworCXVuc2lnbmVkKiBwY2xrX29wdAk9IE5VTEw7CS8qIENQVSBjbG9jayByYXRlIG9wdGlvbnMgKi8KKwlpbnQgZXJyPTA7CisKKwlpZiAoc2RsYV9kZXRlY3QoaHcpKSB7CisgICAgICAgICAgICAgICAgaWYoaHctPnR5cGUgIT0gU0RMQV9TNTE0KQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIFNETEEgY2FyZCBmb3VuZCBhdCBwb3J0IDB4JVhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RuYW1lLCBody0+cG9ydCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmKGh3LT50eXBlICE9IFNETEFfUzUxNCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBmb3VuZCBTJTA0dSBjYXJkIGF0IHBvcnQgMHglWC5cbiIsCisgICAgICAgICAgICAgICAgbW9kbmFtZSwgaHctPnR5cGUsIGh3LT5wb3J0KTsKKworICAgICAgICAgICAgICAgIGh3LT5kcG1zaXplID0gU0RMQV9XSU5ET1dTSVpFOworICAgICAgICAgICAgICAgIHN3aXRjaCAoaHctPnR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNETEFfUzUwMkE6CisgICAgICAgICAgICAgICAgICAgICAgICBody0+aW9fcmFuZ2UgICAgPSBTNTAyQV9JT1JBTkdFOworICAgICAgICAgICAgICAgICAgICAgICAgaXJxX29wdCAgICAgICAgID0gczUwMmFfaXJxX29wdGlvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICBkcG1iYXNlX29wdCAgICAgPSBzNTAyYV9kcG1iYXNlX29wdGlvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICBwY2xrX29wdCAgICAgICAgPSBzNTAyYV9wY2xrX29wdGlvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU0RMQV9TNTAyRToKKyAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5pb19yYW5nZSAgICA9IFM1MDJFX0lPUkFOR0U7CisgICAgICAgICAgICAgICAgICAgICAgICBpcnFfb3B0ICAgICAgICAgPSBzNTAyZV9pcnFfb3B0aW9uczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRwbWJhc2Vfb3B0ICAgICA9IHM1MDhfZHBtYmFzZV9vcHRpb25zOworICAgICAgICAgICAgICAgICAgICAgICAgcGNsa19vcHQgICAgICAgID0gczUwMmVfcGNsa19vcHRpb25zOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNETEFfUzUwMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5pb19yYW5nZSAgICA9IFM1MDNfSU9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlycV9vcHQgICAgICAgICA9IHM1MDNfaXJxX29wdGlvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICBkcG1iYXNlX29wdCAgICAgPSBzNTA4X2RwbWJhc2Vfb3B0aW9uczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjbGtfb3B0ICAgICAgICA9IHM1MDNfcGNsa19vcHRpb25zOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNETEFfUzUwNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5pb19yYW5nZSAgICA9IFM1MDdfSU9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlycV9vcHQgICAgICAgICA9IHM1MDhfaXJxX29wdGlvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICBkcG1iYXNlX29wdCAgICAgPSBzNTA3X2RwbWJhc2Vfb3B0aW9uczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjbGtfb3B0ICAgICAgICA9IHM1MDdfcGNsa19vcHRpb25zOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNETEFfUzUwODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5pb19yYW5nZSAgICA9IFM1MDhfSU9SQU5HRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlycV9vcHQgICAgICAgICA9IHM1MDhfaXJxX29wdGlvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICBkcG1iYXNlX29wdCAgICAgPSBzNTA4X2RwbWJhc2Vfb3B0aW9uczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjbGtfb3B0ICAgICAgICA9IHM1MDhfcGNsa19vcHRpb25zOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogVmVyaWZ5IElSUSBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWdldF9vcHRpb25faW5kZXgoaXJxX29wdCwgaHctPmlycSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBJUlEgJWQgaXMgaW52YWxpZCFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAJbW9kbmFtZSwgaHctPmlycSk7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfSAKKworICAgICAgICAgICAgICAgIC8qIFZlcmlmeSBDUFUgY2xvY2sgcmF0ZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKyAgICAgICAgICAgICAgICBpZiAoaHctPnBjbGsgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5wY2xrID0gcGNsa19vcHRbMV07ICAvKiB1c2UgZGVmYXVsdCAqLworICAgICAgICAKKyAgICAgICAgICAgICAgICBlbHNlIGlmICghZ2V0X29wdGlvbl9pbmRleChwY2xrX29wdCwgaHctPnBjbGspKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogQ1BVIGNsb2NrICV1IGlzIGludmFsaWQhXG4iLAorCQkJCW1vZG5hbWUsIGh3LT5wY2xrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGFzc3VtaW5nIENQVSBjbG9jayByYXRlIG9mICV1IGtIei5cbiIsCisJCQltb2RuYW1lLCBody0+cGNsayk7CisKKyAgICAgICAgICAgICAgICAvKiBTZXR1cCBhZGFwdGVyIGR1YWwtcG9ydCBtZW1vcnkgd2luZG93IGFuZCB0ZXN0IG1lbW9yeSAqLworICAgICAgICAgICAgICAgIGlmIChody0+ZHBtYmFzZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBzZGxhX2F1dG9kcG0oaHcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPCisJCQkJIiVzOiBjYW4ndCBmaW5kIGF2YWlsYWJsZSBtZW1vcnkgcmVnaW9uIVxuIiwKKwkJCQkJbW9kbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFnZXRfb3B0aW9uX2luZGV4KGRwbWJhc2Vfb3B0LAorCQkJdmlydF90b19waHlzKGh3LT5kcG1iYXNlKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IG1lbW9yeSBhZGRyZXNzIDB4JWxYIGlzIGludmFsaWQhXG4iLAorCQkJCW1vZG5hbWUsIHZpcnRfdG9fcGh5cyhody0+ZHBtYmFzZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNkbGFfc2V0ZHBtKGh3KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTworCQkJIiVzOiA4SyBtZW1vcnkgcmVnaW9uIGF0IDB4JWxYIGlzIG5vdCBhdmFpbGFibGUhXG4iLAorCQkJCW1vZG5hbWUsIHZpcnRfdG9fcGh5cyhody0+ZHBtYmFzZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPCisJCQkiJXM6IGR1YWwtcG9ydCBtZW1vcnkgd2luZG93IGlzIHNldCBhdCAweCVsWC5cbiIsCisJCQkJbW9kbmFtZSwgdmlydF90b19waHlzKGh3LT5kcG1iYXNlKSk7CisKKworCQkvKiBJZiB3ZSBmaW5kIG1lbW9yeSBpbiAweEUqKioqIE1lbW9yeSByZWdpb24sIAorICAgICAgICAgICAgICAgICAqIHdhcm4gdGhlIHVzZXIgdG8gZGlzYWJsZSB0aGUgU0hBRE9XIFJBTS4gIAorICAgICAgICAgICAgICAgICAqIFNpbmNlIG1lbW9yeSBjb3JydXB0aW9uIGNhbiBvY2N1ciBpZiBTSEFET1cgaXMKKyAgICAgICAgICAgICAgICAgKiBlbmFibGVkLiBUaGlzIGNhbiBjYXVzZXMgcmFuZG9tIGNyYXNoZXMgISAqLworCQlpZiAodmlydF90b19waHlzKGh3LT5kcG1iYXNlKSA+PSAweEUwMDAwKXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlxuJXM6ICEhISEhISEhICBXQVJOSU5HICEhISEhISEhXG4iLG1vZG5hbWUpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFdBTlBJUEUgaXMgdXNpbmcgMHglbFggbWVtb3J5IHJlZ2lvbiAhISFcbiIsCisJCQkJCQltb2RuYW1lLCB2aXJ0X3RvX3BoeXMoaHctPmRwbWJhc2UpKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiAgICAgICAgIFBsZWFzZSBkaXNhYmxlIHRoZSBTSEFET1cgUkFNLCBvdGhlcndpc2VcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiICAgICAgICAgeW91ciBzeXN0ZW0gbWlnaHQgY3Jhc2ggcmFuZG9tbHkgZnJvbSB0aW1lIHRvIHRpbWUgIVxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogISEhISEhISEgIFdBUk5JTkcgISEhISEhISFcblxuIixtb2RuYW1lKTsKKwkJfQorICAgICAgICB9CisKKwllbHNlIHsKKwkJaHctPm1lbW9yeSA9IHRlc3RfbWVtcmVnaW9uKCh2b2lkKilody0+ZHBtYmFzZSwgCisJCQlNQVhfU0laRU9GX1M1MTRfTUVNT1JZKTsKKwkJaWYoaHctPm1lbW9yeSA8ICgyNTYgKiAxMDI0KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSIlczogZXJyb3IgaW4gdGVzdGluZyBTNTE0IG1lbW9yeSAoMHglbFgpXG4iLAorCQkJCW1vZG5hbWUsIGh3LT5tZW1vcnkpOworCQkJc2RsYV9kb3duKGh3KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorICAgIAorCXByaW50ayhLRVJOX0lORk8gIiVzOiBmb3VuZCAlbHVLIGJ5dGVzIG9mIG9uLWJvYXJkIG1lbW9yeVxuIiwKKwkJbW9kbmFtZSwgaHctPm1lbW9yeSAvIDEwMjQpOworCisJLyogTG9hZCBmaXJtd2FyZS4gSWYgbG9hZGVyIGZhaWxzIHRoZW4gc2h1dCBkb3duIGFkYXB0ZXIgKi8KKwllcnIgPSBzZGxhX2xvYWQoaHcsIHNmbSwgbGVuKTsKKwlpZiAoZXJyKSBzZGxhX2Rvd24oaHcpOwkJLyogc2h1dGRvd24gYWRhcHRlciAqLworCisJcmV0dXJuIGVycjsKK30gCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2h1dCBkb3duIFNETEE6IGRpc2FibGUgc2hhcmVkIG1lbW9yeSBhY2Nlc3MgYW5kIGludGVycnVwdHMsIHN0b3AgQ1BVLCBldGMuCisgKi8KKworRVhQT1JUX1NZTUJPTChzZGxhX2Rvd24pOworCitpbnQgc2RsYV9kb3duIChzZGxhaHdfdCogaHcpCit7CisJdW5zaWduZWQgcG9ydCA9IGh3LT5wb3J0OworCWludCBpOworICAgICAgICB1bnNpZ25lZCBjaGFyIENQVV9ubzsKKyAgICAgICAgdTMyIGludF9jb25maWcsIGludF9zdGF0dXM7CisKKyAgICAgICAgaWYoIXBvcnQgJiYgKGh3LT50eXBlICE9IFNETEFfUzUxNCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKGh3LT50eXBlKSB7CisJY2FzZSBTRExBX1M1MDJBOgorCQlfT1VUQihwb3J0LCAweDA4KTsJCS8qIGhhbHQgQ1BVICovCisJCV9PVVRCKHBvcnQsIDB4MDgpOworCQlfT1VUQihwb3J0LCAweDA4KTsKKwkJaHctPnJlZ3NbMF0gPSAweDA4OworCQlfT1VUQihwb3J0ICsgMSwgMHhGRik7CQkvKiBjbG9zZSBtZW1vcnkgd2luZG93ICovCisJCWh3LT5yZWdzWzFdID0gMHhGRjsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwMkU6CisJCV9PVVRCKHBvcnQgKyAzLCAwKTsJCS8qIHN0b3AgQ1BVICovCisJCV9PVVRCKHBvcnQsIDApOwkJCS8qIHJlc2V0IGJvYXJkICovCisJCWZvciAoaSA9IDA7IGkgPCBTNTAyRV9JT1JBTkdFOyArK2kpCisJCQlody0+cmVnc1tpXSA9IDAKKwkJOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTAzOgorCWNhc2UgU0RMQV9TNTA3OgorCWNhc2UgU0RMQV9TNTA4OgorCQlfT1VUQihwb3J0LCAwKTsJCQkvKiByZXNldCBib2FyZCBsb2dpYyAqLworCQlody0+cmVnc1swXSA9IDA7CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MTQ6CisJCS8qIGhhbHQgdGhlIGFkYXB0ZXIgKi8KKyAgICAgICAgICAgICAgICAqKGNoYXIgKilody0+dmVjdG9yID0gUzUxNF9DUFVfSEFMVDsKKyAgICAgICAgCUNQVV9ubyA9IGh3LT5TNTE0X2NwdV9ub1swXTsKKworCQkvKiBkaXNhYmxlIHRoZSBQQ0kgSVJRIGFuZCBkaXNhYmxlIG1lbW9yeSBhY2Nlc3MgKi8KKyAgICAgICAgICAgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQoaHctPnBjaV9kZXYsIFBDSV9JTlRfQ09ORklHLCAmaW50X2NvbmZpZyk7CisJICAgICAgICBpbnRfY29uZmlnICY9IChDUFVfbm8gPT0gUzUxNF9DUFVfQSkgPyB+UENJX0RJU0FCTEVfSVJRX0NQVV9BIDoJflBDSV9ESVNBQkxFX0lSUV9DUFVfQjsKKyAgICAgICAgICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGh3LT5wY2lfZGV2LCBQQ0lfSU5UX0NPTkZJRywgaW50X2NvbmZpZyk7CisJCXJlYWRfUzUxNF9pbnRfc3RhdChodywgJmludF9zdGF0dXMpOworCQlTNTE0X2ludGFjayhodywgaW50X3N0YXR1cyk7CisJCWlmKENQVV9ubyA9PSBTNTE0X0NQVV9BKQorICAgICAgICAgICAgICAgICAgICAgICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChody0+cGNpX2RldiwgUENJX01BUDBfRFdPUkQsCisJCQkJUENJX0NQVV9BX01FTV9ESVNBQkxFKTsKKwkJZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChody0+cGNpX2RldiwgUENJX01BUDFfRFdPUkQsCisJCQkJUENJX0NQVV9CX01FTV9ESVNBQkxFKTsKKworCQkvKiBmcmVlIHVwIHRoZSBhbGxvY2F0ZWQgdmlydHVhbCBtZW1vcnkgKi8KKyAJCWlvdW5tYXAoKHZvaWQgKilody0+ZHBtYmFzZSk7CisgICAgICAgIAlpb3VubWFwKCh2b2lkICopaHctPnZlY3Rvcik7CisgCQlicmVhazsKKworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE1hcCBzaGFyZWQgbWVtb3J5IHdpbmRvdyBpbnRvIFNETEEgYWRkcmVzcyBzcGFjZS4KKyAqLworCitFWFBPUlRfU1lNQk9MKHNkbGFfbWFwbWVtKTsKKworaW50IHNkbGFfbWFwbWVtIChzZGxhaHdfdCogaHcsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwl1bnNpZ25lZCBwb3J0ID0gaHctPnBvcnQ7CisJcmVnaXN0ZXIgaW50IHRtcDsKKworCXN3aXRjaCAoaHctPnR5cGUpIHsKKwljYXNlIFNETEFfUzUwMkE6CisJY2FzZSBTRExBX1M1MDJFOgorCQlpZiAoYWRkciA8IFM1MDJfTUFYTUVNKQl7IC8qIHZlcmlmeSBwYXJhbWV0ZXIgKi8KKwkJCXRtcCA9IGFkZHIgPj4gMTM7CS8qIGNvbnZlcnQgdG8gcmVnaXN0ZXIgbWFzayAqLworCQkJX09VVEIocG9ydCArIDIsIHRtcCk7CisJCQlody0+cmVnc1syXSA9IHRtcDsKKwkJfQorCQllbHNlIHJldHVybiAtRUlOVkFMOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTAzOgorCQlpZiAoYWRkciA8IFM1MDNfTUFYTUVNKQl7IC8qIHZlcmlmeSBwYXJhbWV0ZXIgKi8KKwkJCXRtcCA9IChody0+cmVnc1swXSAmIDB4OEYpIHwgKChhZGRyID4+IDkpICYgMHg3MCk7CisJCQlfT1VUQihwb3J0LCB0bXApOworCQkJaHctPnJlZ3NbMF0gPSB0bXA7CisJCX0KKwkJZWxzZSByZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwNzoKKwkJaWYgKGFkZHIgPCBTNTA3X01BWE1FTSkgeworCQkJaWYgKCEoX0lOQihwb3J0KSAmIDB4MDIpKQorCQkJCXJldHVybiAtRUlPOworCQkJdG1wID0gYWRkciA+PiAxMzsJLyogY29udmVydCB0byByZWdpc3RlciBtYXNrICovCisJCQlfT1VUQihwb3J0ICsgMiwgdG1wKTsKKwkJCWh3LT5yZWdzWzJdID0gdG1wOworCQl9CisJCWVsc2UgcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDg6CisJCWlmIChhZGRyIDwgUzUwOF9NQVhNRU0pIHsKKwkJCXRtcCA9IGFkZHIgPj4gMTM7CS8qIGNvbnZlcnQgdG8gcmVnaXN0ZXIgbWFzayAqLworCQkJX09VVEIocG9ydCArIDIsIHRtcCk7CisJCQlody0+cmVnc1syXSA9IHRtcDsKKwkJfQorCQllbHNlIHJldHVybiAtRUlOVkFMOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTE0OgorCQlyZXR1cm4gMDsKKworIAlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaHctPnZlY3RvciA9IGFkZHIgJiAweEZGRkZFMDAwTDsKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBFbmFibGUgaW50ZXJydXB0IGdlbmVyYXRpb24uCisgKi8KKworRVhQT1JUX1NZTUJPTChzZGxhX2ludGVuKTsKKworaW50IHNkbGFfaW50ZW4gKHNkbGFod190KiBodykKK3sKKwl1bnNpZ25lZCBwb3J0ID0gaHctPnBvcnQ7CisJaW50IHRtcCwgaTsKKworCXN3aXRjaCAoaHctPnR5cGUpIHsKKwljYXNlIFNETEFfUzUwMkU6CisJCS8qIE5vdGUgdGhhciBpbnRlcnJ1cHQgY29udHJvbCBvcGVyYXRpb25zIG9uIFM1MDJFIGFyZSBhbGxvd2VkCisJCSAqIG9ubHkgaWYgQ1BVIGlzIGVuYWJsZWQgKGJpdCAwIG9mIHN0YXR1cyByZWdpc3RlciBpcyBzZXQpLgorCQkgKi8KKwkJaWYgKF9JTkIocG9ydCkgJiAweDAxKSB7CisJCQlfT1VUQihwb3J0LCAweDAyKTsJLyogYml0MSA9IDEsIGJpdDIgPSAwICovCisJCQlfT1VUQihwb3J0LCAweDA2KTsJLyogYml0MSA9IDEsIGJpdDIgPSAxICovCisJCQlody0+cmVnc1swXSA9IDB4MDY7CisJCX0KKwkJZWxzZSByZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwMzoKKwkJdG1wID0gaHctPnJlZ3NbMF0gfCAweDA0OworCQlfT1VUQihwb3J0LCB0bXApOworCQlody0+cmVnc1swXSA9IHRtcDsJCS8qIHVwZGF0ZSBtaXJyb3IgKi8KKwkJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwkJaWYgKCEoX0lOQihwb3J0KSAmIDB4MDIpKQkJLyogdmVyaWZ5ICovCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwODoKKwkJdG1wID0gaHctPnJlZ3NbMF0gfCAweDEwOworCQlfT1VUQihwb3J0LCB0bXApOworCQlody0+cmVnc1swXSA9IHRtcDsJCS8qIHVwZGF0ZSBtaXJyb3IgKi8KKwkJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwkJaWYgKCEoX0lOQihwb3J0ICsgMSkgJiAweDEwKSkJCS8qIHZlcmlmeSAqLworCQkJcmV0dXJuIC1FSU87CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDJBOgorCWNhc2UgU0RMQV9TNTA3OgorCQlicmVhazsKKworICAgICAgICBjYXNlIFNETEFfUzUxNDoKKyAgICAgICAgICAgICAgICBicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCisJfQorCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERpc2FibGUgaW50ZXJydXB0IGdlbmVyYXRpb24uCisgKi8KKworRVhQT1JUX1NZTUJPTChzZGxhX2ludGRlKTsKKworaW50IHNkbGFfaW50ZGUgKHNkbGFod190KiBodykKK3sKKwl1bnNpZ25lZCBwb3J0ID0gaHctPnBvcnQ7CisJaW50IHRtcCwgaTsKKworCXN3aXRjaCAoaHctPnR5cGUpIHsKKwljYXNlIFNETEFfUzUwMkU6CisJCS8qIE5vdGVzOgorCQkgKiAgMSkgaW50ZXJydXB0IGNvbnRyb2wgb3BlcmF0aW9ucyBhcmUgYWxsb3dlZCBvbmx5IGlmIENQVSBpcworCQkgKiAgICAgZW5hYmxlZCAoYml0IDAgb2Ygc3RhdHVzIHJlZ2lzdGVyIGlzIHNldCkuCisJCSAqICAyKSBkaXNhYmxpbmcgaW50ZXJydXB0cyB1c2luZyBiaXQgMSBvZiBjb250cm9sIHJlZ2lzdGVyCisJCSAqICAgICBjYXVzZXMgSVJRIGxpbmUgZ28gaGlnaCwgdGhlcmVmb3JlIHdlIGFyZSBnb2luZyB0byB1c2UKKwkJICogICAgIDB4MDQgaW5zdGVhZDogbG93ZXIgaXQgdG8gaW5oaWJpdCBpbnRlcnJ1cHRzIHRvIFBDLgorCQkgKi8KKwkJaWYgKF9JTkIocG9ydCkgJiAweDAxKSB7CisJCQlfT1VUQihwb3J0LCBody0+cmVnc1swXSAmIH4weDA0KTsKKwkJCWh3LT5yZWdzWzBdICY9IH4weDA0OworCQl9CisJCWVsc2UgcmV0dXJuIC1FSU87CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDM6CisJCXRtcCA9IGh3LT5yZWdzWzBdICYgfjB4MDQ7CisJCV9PVVRCKHBvcnQsIHRtcCk7CisJCWh3LT5yZWdzWzBdID0gdG1wOwkJCS8qIHVwZGF0ZSBtaXJyb3IgKi8KKwkJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwkJaWYgKF9JTkIocG9ydCkgJiAweDAyKQkJCS8qIHZlcmlmeSAqLworCQkJcmV0dXJuIC1FSU87CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDg6CisJCXRtcCA9IGh3LT5yZWdzWzBdICYgfjB4MTA7CisJCV9PVVRCKHBvcnQsIHRtcCk7CisJCWh3LT5yZWdzWzBdID0gdG1wOwkJCS8qIHVwZGF0ZSBtaXJyb3IgKi8KKwkJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwkJaWYgKF9JTkIocG9ydCkgJiAweDEwKQkJCS8qIHZlcmlmeSAqLworCQkJcmV0dXJuIC1FSU87CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDJBOgorCWNhc2UgU0RMQV9TNTA3OgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBBY2tub3dsZWRnZSBTRExBIGhhcmR3YXJlIGludGVycnVwdC4KKyAqLworCitFWFBPUlRfU1lNQk9MKHNkbGFfaW50YWNrKTsKKworaW50IHNkbGFfaW50YWNrIChzZGxhaHdfdCogaHcpCit7CisJdW5zaWduZWQgcG9ydCA9IGh3LT5wb3J0OworCWludCB0bXA7CisKKwlzd2l0Y2ggKGh3LT50eXBlKSB7CisJY2FzZSBTRExBX1M1MDJFOgorCQkvKiBUbyBhY2tub2xlZGdlIGhhcmR3YXJlIGludGVycnVwdCB3ZSBoYXZlIHRvIHRvZ2dsZSBiaXQgMyBvZgorCQkgKiBjb250cm9sIHJlZ2lzdGVyOiBcXy8KKwkJICogTm90ZSB0aGF0IGludGVycnVwdCBjb250cm9sIG9wZXJhdGlvbnMgb24gUzUwMkUgYXJlIGFsbG93ZWQKKwkJICogb25seSBpZiBDUFUgaXMgZW5hYmxlZCAoYml0IDEgb2Ygc3RhdHVzIHJlZ2lzdGVyIGlzIHNldCkuCisJCSAqLworCQlpZiAoX0lOQihwb3J0KSAmIDB4MDEpIHsKKwkJCXRtcCA9IGh3LT5yZWdzWzBdICYgfjB4MDQ7CisJCQlfT1VUQihwb3J0LCB0bXApOworCQkJdG1wIHw9IDB4MDQ7CisJCQlfT1VUQihwb3J0LCB0bXApOworCQkJaHctPnJlZ3NbMF0gPSB0bXA7CisJCX0KKwkJZWxzZSByZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwMzoKKwkJaWYgKF9JTkIocG9ydCkgJiAweDA0KSB7CisJCQl0bXAgPSBody0+cmVnc1swXSAmIH4weDA4OworCQkJX09VVEIocG9ydCwgdG1wKTsKKwkJCXRtcCB8PSAweDA4OworCQkJX09VVEIocG9ydCwgdG1wKTsKKwkJCWh3LT5yZWdzWzBdID0gdG1wOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDJBOgorCWNhc2UgU0RMQV9TNTA3OgorCWNhc2UgU0RMQV9TNTA4OgorCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQWNrbm93bGVkZ2UgUzUxNCBoYXJkd2FyZSBpbnRlcnJ1cHQuCisgKi8KKworRVhQT1JUX1NZTUJPTChTNTE0X2ludGFjayk7CisKK3ZvaWQgUzUxNF9pbnRhY2sgKHNkbGFod190KiBodywgdTMyIGludF9zdGF0dXMpCit7CisgICAgICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoaHctPnBjaV9kZXYsIFBDSV9JTlRfU1RBVFVTLCBpbnRfc3RhdHVzKTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlYWQgdGhlIFM1MTQgaGFyZHdhcmUgaW50ZXJydXB0IHN0YXR1cy4KKyAqLworCitFWFBPUlRfU1lNQk9MKHJlYWRfUzUxNF9pbnRfc3RhdCk7CisKK3ZvaWQgcmVhZF9TNTE0X2ludF9zdGF0IChzZGxhaHdfdCogaHcsIHUzMiogaW50X3N0YXR1cykKK3sKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoaHctPnBjaV9kZXYsIFBDSV9JTlRfU1RBVFVTLCBpbnRfc3RhdHVzKTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEdlbmVyYXRlIGFuIGludGVycnVwdCB0byBhZGFwdGVyJ3MgQ1BVLgorICovCisKK0VYUE9SVF9TWU1CT0woc2RsYV9pbnRyKTsKKworaW50IHNkbGFfaW50ciAoc2RsYWh3X3QqIGh3KQoreworCXVuc2lnbmVkIHBvcnQgPSBody0+cG9ydDsKKworCXN3aXRjaCAoaHctPnR5cGUpIHsKKwljYXNlIFNETEFfUzUwMkE6CisJCWlmICghKF9JTkIocG9ydCkgJiAweDQwKSkgeworCQkJX09VVEIocG9ydCwgMHgxMCk7CQkvKiBpc3N1ZSBOTUkgdG8gQ1BVICovCisJCQlody0+cmVnc1swXSA9IDB4MTA7CisJCX0KKwkJZWxzZSByZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwNzoKKwkJaWYgKChfSU5CKHBvcnQpICYgMHgwNikgPT0gMHgwNikgeworCQkJX09VVEIocG9ydCArIDMsIDApOworCQl9CisJCWVsc2UgcmV0dXJuIC1FSU87CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDg6CisJCWlmIChfSU5CKHBvcnQgKyAxKSAmIDB4MDIpIHsKKwkJCV9PVVRCKHBvcnQsIDB4MDgpOworCQl9CisJCWVsc2UgcmV0dXJuIC1FSU87CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDJFOgorCWNhc2UgU0RMQV9TNTAzOgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBFeGVjdXRlIEFkYXB0ZXIgQ29tbWFuZC4KKyAqIG8gU2V0IGV4ZWMgZmxhZy4KKyAqIG8gQnVzeS13YWl0IHVudGlsIGZsYWcgaXMgcmVzZXQuCisgKiBvIFJldHVybiBudW1iZXIgb2YgbG9vcHMgbWFkZSwgb3IgMCBpZiBjb21tYW5kIHRpbWVkIG91dC4KKyAqLworCitFWFBPUlRfU1lNQk9MKHNkbGFfZXhlYyk7CisKK2ludCBzZGxhX2V4ZWMgKHZvaWQqIG9wZmxhZykKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKiBmbGFnID0gb3BmbGFnOworCXVuc2lnbmVkIGxvbmcgdHN0b3A7CisJaW50IG5sb29wczsKKworCWlmKHJlYWRiKGZsYWcpICE9IDB4MDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIldBTlBJUEU6IG9wcCBmbGFnIHNldCBvbiBlbnRyeSB0byBzZGxhX2V4ZWNcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJCisJd3JpdGViKDB4MDEsIGZsYWcpOworCisJdHN0b3AgPSBTWVNURU1fVElDSyArIEVYRUNfVElNRU9VVDsKKworCWZvciAobmxvb3BzID0gMTsgKHJlYWRiKGZsYWcpID09IDB4MDEpOyArKyBubG9vcHMpIHsKKwkJdW5zaWduZWQgZGVsYXkgPSBleGVjX2lkbGU7CisJCXdoaWxlICgtLSBkZWxheSk7CQkJLyogZGVsYXkgKi8KKwkJaWYgKFNZU1RFTV9USUNLID4gdHN0b3ApIHJldHVybiAwOwkvKiB0aW1lIGlzIHVwISAqLworCX0KKwlyZXR1cm4gbmxvb3BzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlYWQgYWJzb2x1dGUgYWRhcHRlciBtZW1vcnkuCisgKiBUcmFuc2ZlciBkYXRhIGZyb20gYWRhcHRlcidzIG1lbW9yeSB0byBkYXRhIGJ1ZmZlci4KKyAqCisgKiBOb3RlOgorICogQ2FyZSBzaG91bGQgYmUgdGFrZW4gd2hlbiBjcm9zc2luZyBkdWFsLXBvcnQgbWVtb3J5IHdpbmRvdyBib3VuZGFyeS4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgbm90IGF0b21pYywgc28gY2FsbGVyIG11c3QgZGlzYWJsZSBpbnRlcnJ1cHQgaWYKKyAqIGludGVycnVwdCByb3V0aW5lcyBhcmUgYWNjZXNzaW5nIGFkYXB0ZXIgc2hhcmVkIG1lbW9yeS4KKyAqLworCitFWFBPUlRfU1lNQk9MKHNkbGFfcGVlayk7CisKK2ludCBzZGxhX3BlZWsgKHNkbGFod190KiBodywgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkKiBidWYsIHVuc2lnbmVkIGxlbikKK3sKKworCWlmIChhZGRyICsgbGVuID4gaHctPm1lbW9yeSkJLyogdmVyaWZ5IGFyZ3VtZW50cyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworICAgICAgICBpZihody0+dHlwZSA9PSBTRExBX1M1MTQpIHsJLyogY29weSBkYXRhIGZvciB0aGUgUzUxNCBhZGFwdGVyICovCisgICAgICAgICAgICAgICAgcGVla19ieV80ICgodW5zaWduZWQgbG9uZylody0+ZHBtYmFzZSArIGFkZHIsIGJ1ZiwgbGVuKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwl9CisKKyAgICAgICAgZWxzZSB7CQkJCS8qIGNvcHkgZGF0YSBmb3IgdGhlIFM1MDggYWRhcHRlciAqLworCSAgICAgICAgdW5zaWduZWQgbG9uZyBvbGR2ZWMgPSBody0+dmVjdG9yOworICAgICAgICAJdW5zaWduZWQgd2luc2l6ZSA9IGh3LT5kcG1zaXplOworCSAgICAgICAgdW5zaWduZWQgY3VycG9zLCBjdXJsZW47ICAgLyogY3VycmVudCBvZmZzZXQgYW5kIGJsb2NrIHNpemUgKi8KKyAgICAgICAgCXVuc2lnbmVkIGxvbmcgY3VydmVjOyAgICAgIC8qIGN1cnJlbnQgRFBNIHdpbmRvdyB2ZWN0b3IgKi8KKwkgICAgICAgIGludCBlcnIgPSAwOworCisgICAgICAgICAgICAgICAgd2hpbGUgKGxlbiAmJiAhZXJyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJwb3MgPSBhZGRyICUgd2luc2l6ZTsgIC8qIGN1cnJlbnQgd2luZG93IG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVjID0gYWRkciAtIGN1cnBvczsgICAvKiBjdXJyZW50IHdpbmRvdyB2ZWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxlbiA9IChsZW4gPiAod2luc2l6ZSAtIGN1cnBvcykpID8KKwkJCQkod2luc2l6ZSAtIGN1cnBvcykgOiBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWxvY2F0ZSB3aW5kb3cgYW5kIGNvcHkgYmxvY2sgb2YgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc2RsYV9tYXBtZW0oaHcsIGN1cnZlYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwZWVrX2J5XzQgKCh1bnNpZ25lZCBsb25nKWh3LT5kcG1iYXNlICsgY3VycG9zLCBidWYsCisJCQkJY3VybGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgICAgICAgKz0gY3VybGVuOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmICAgICAgICAgPSAoY2hhciopYnVmICsgY3VybGVuOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuICAgICAgICAtPSBjdXJsZW47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBEUE0gd2luZG93IHBvc2l0aW9uICovCisgICAgICAgICAgICAgICAgc2RsYV9tYXBtZW0oaHcsIG9sZHZlYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBkYXRhIGZyb20gYWRhcHRlcidzIG1lbW9yeSB0byBhIGRhdGEgYnVmZmVyIGluIDQtYnl0ZSBjaHVua3MuCisgKiBOb3RlIHRoYXQgd2UgZW5zdXJlIHRoYXQgdGhlIFNETEEgbWVtb3J5IGFkZHJlc3MgaXMgb24gYSA0LWJ5dGUgYm91bmRhcnkKKyAqIGJlZm9yZSB3ZSBiZWdpbiBtb3ZpbmcgdGhlIGRhdGEgaW4gNC1ieXRlIGNodW5rcy4KKyovCisKK3N0YXRpYyB2b2lkIHBlZWtfYnlfNCAodW5zaWduZWQgbG9uZyBzcmMsIHZvaWQqIGJ1ZiwgdW5zaWduZWQgbGVuKQoreworCisgICAgICAgIC8qIGJ5dGUgY29weSBkYXRhIHVudGlsIHdlIGdldCB0byBhIDQtYnl0ZSBib3VuZGFyeSAqLworICAgICAgICB3aGlsZSAobGVuICYmIChzcmMgJiAweDAzKSkgeworICAgICAgICAgICAgICAgICooY2hhciAqKWJ1ZiArKyA9IHJlYWRiKHNyYyArKyk7CisgICAgICAgICAgICAgICAgbGVuIC0tOworICAgICAgICB9CisKKyAgICAgICAgLyogY29weSBkYXRhIGluIDQtYnl0ZSBjaHVua3MgKi8KKyAgICAgICAgd2hpbGUgKGxlbiA+PSA0KSB7CisgICAgICAgICAgICAgICAgKih1bnNpZ25lZCBsb25nICopYnVmID0gcmVhZGwoc3JjKTsKKyAgICAgICAgICAgICAgICBidWYgKz0gNDsKKyAgICAgICAgICAgICAgICBzcmMgKz0gNDsKKyAgICAgICAgICAgICAgICBsZW4gLT0gNDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGJ5dGUgY29weSBhbnkgcmVtYWluaW5nIGRhdGEgKi8KKyAgICAgICAgd2hpbGUgKGxlbikgeworICAgICAgICAgICAgICAgICooY2hhciAqKWJ1ZiArKyA9IHJlYWRiKHNyYyArKyk7CisgICAgICAgICAgICAgICAgbGVuIC0tOworICAgICAgICB9Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBXcml0ZSBBYnNvbHV0ZSBBZGFwdGVyIE1lbW9yeS4KKyAqIFRyYW5zZmVyIGRhdGEgZnJvbSBkYXRhIGJ1ZmZlciB0byBhZGFwdGVyJ3MgbWVtb3J5LgorICoKKyAqIE5vdGU6CisgKiBDYXJlIHNob3VsZCBiZSB0YWtlbiB3aGVuIGNyb3NzaW5nIGR1YWwtcG9ydCBtZW1vcnkgd2luZG93IGJvdW5kYXJ5LgorICogVGhpcyBmdW5jdGlvbiBpcyBub3QgYXRvbWljLCBzbyBjYWxsZXIgbXVzdCBkaXNhYmxlIGludGVycnVwdCBpZgorICogaW50ZXJydXB0IHJvdXRpbmVzIGFyZSBhY2Nlc3NpbmcgYWRhcHRlciBzaGFyZWQgbWVtb3J5LgorICovCisKK0VYUE9SVF9TWU1CT0woc2RsYV9wb2tlKTsKKyAKK2ludCBzZGxhX3Bva2UgKHNkbGFod190KiBodywgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkKiBidWYsIHVuc2lnbmVkIGxlbikKK3sKKworCWlmIChhZGRyICsgbGVuID4gaHctPm1lbW9yeSkJLyogdmVyaWZ5IGFyZ3VtZW50cyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKyAgIAorICAgICAgICBpZihody0+dHlwZSA9PSBTRExBX1M1MTQpIHsJLyogY29weSBkYXRhIGZvciB0aGUgUzUxNCBhZGFwdGVyICovCisgICAgICAgICAgICAgICAgcG9rZV9ieV80ICgodW5zaWduZWQgbG9uZylody0+ZHBtYmFzZSArIGFkZHIsIGJ1ZiwgbGVuKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwl9CisJCisJZWxzZSB7CQkJCS8qIGNvcHkgZGF0YSBmb3IgdGhlIFM1MDggYWRhcHRlciAqLworICAgIAkJdW5zaWduZWQgbG9uZyBvbGR2ZWMgPSBody0+dmVjdG9yOworCSAgICAgICAgdW5zaWduZWQgd2luc2l6ZSA9IGh3LT5kcG1zaXplOworICAgICAgICAJdW5zaWduZWQgY3VycG9zLCBjdXJsZW47ICAgICAvKiBjdXJyZW50IG9mZnNldCBhbmQgYmxvY2sgc2l6ZSAqLworICAgICAgICAJdW5zaWduZWQgbG9uZyBjdXJ2ZWM7ICAgICAgICAvKiBjdXJyZW50IERQTSB3aW5kb3cgdmVjdG9yICovCisgICAgICAgIAlpbnQgZXJyID0gMDsKKworCQl3aGlsZSAobGVuICYmICFlcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnBvcyA9IGFkZHIgJSB3aW5zaXplOyAgICAvKiBjdXJyZW50IHdpbmRvdyBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlYyA9IGFkZHIgLSBjdXJwb3M7ICAgICAvKiBjdXJyZW50IHdpbmRvdyB2ZWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxlbiA9IChsZW4gPiAod2luc2l6ZSAtIGN1cnBvcykpID8KKwkJCQkod2luc2l6ZSAtIGN1cnBvcykgOiBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWxvY2F0ZSB3aW5kb3cgYW5kIGNvcHkgYmxvY2sgb2YgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgc2RsYV9tYXBtZW0oaHcsIGN1cnZlYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwb2tlX2J5XzQgKCh1bnNpZ25lZCBsb25nKWh3LT5kcG1iYXNlICsgY3VycG9zLCBidWYsCisJCQkJY3VybGVuKTsKKwkgICAgICAgICAgICAgICAgYWRkciAgICAgICArPSBjdXJsZW47CisgICAgICAgICAgICAgICAgICAgICAgICBidWYgICAgICAgICA9IChjaGFyKilidWYgKyBjdXJsZW47CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gICAgICAgIC09IGN1cmxlbjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBSZXN0b3JlIERQTSB3aW5kb3cgcG9zaXRpb24gKi8KKyAgICAgICAgICAgICAgICBzZGxhX21hcG1lbShodywgb2xkdmVjKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBXcml0ZSBmcm9tIGEgZGF0YSBidWZmZXIgdG8gYWRhcHRlcidzIG1lbW9yeSBpbiA0LWJ5dGUgY2h1bmtzLgorICogTm90ZSB0aGF0IHdlIGVuc3VyZSB0aGF0IHRoZSBTRExBIG1lbW9yeSBhZGRyZXNzIGlzIG9uIGEgNC1ieXRlIGJvdW5kYXJ5CisgKiBiZWZvcmUgd2UgYmVnaW4gbW92aW5nIHRoZSBkYXRhIGluIDQtYnl0ZSBjaHVua3MuCisqLworCitzdGF0aWMgdm9pZCBwb2tlX2J5XzQgKHVuc2lnbmVkIGxvbmcgZGVzdCwgdm9pZCogYnVmLCB1bnNpZ25lZCBsZW4pCit7CisKKyAgICAgICAgLyogYnl0ZSBjb3B5IGRhdGEgdW50aWwgd2UgZ2V0IHRvIGEgNC1ieXRlIGJvdW5kYXJ5ICovCisgICAgICAgIHdoaWxlIChsZW4gJiYgKGRlc3QgJiAweDAzKSkgeworICAgICAgICAgICAgICAgIHdyaXRlYiAoKihjaGFyICopYnVmICsrLCBkZXN0ICsrKTsKKyAgICAgICAgICAgICAgICBsZW4gLS07CisgICAgICAgIH0KKworICAgICAgICAvKiBjb3B5IGRhdGEgaW4gNC1ieXRlIGNodW5rcyAqLworICAgICAgICB3aGlsZSAobGVuID49IDQpIHsKKyAgICAgICAgICAgICAgICB3cml0ZWwgKCoodW5zaWduZWQgbG9uZyAqKWJ1ZiwgZGVzdCk7CisgICAgICAgICAgICAgICAgZGVzdCArPSA0OworICAgICAgICAgICAgICAgIGJ1ZiArPSA0OworICAgICAgICAgICAgICAgIGxlbiAtPSA0OworICAgICAgICB9CisKKyAgICAgICAgLyogYnl0ZSBjb3B5IGFueSByZW1haW5pbmcgZGF0YSAqLworICAgICAgICB3aGlsZSAobGVuKSB7CisgICAgICAgICAgICAgICAgd3JpdGViICgqKGNoYXIgKilidWYgKysgLCBkZXN0ICsrKTsKKyAgICAgICAgICAgICAgICBsZW4gLS07CisgICAgICAgIH0KK30KKworCisjaWZkZWYJRE9OVF9DT01QSVBMRV9USElTCisjZW5kaWYJLyogRE9OVF9DT01QSVBMRV9USElTICovCisKKy8qKioqKiogSGFyZHdhcmUtU3BlY2lmaWMgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERldGVjdCBhZGFwdGVyIHR5cGUuCisgKiBvIGlmIGFkYXB0ZXIgdHlwZSBpcyBzcGVjaWZpZWQgdGhlbiBjYWxsIGRldGVjdGlvbiByb3V0aW5lIGZvciB0aGF0IGFkYXB0ZXIKKyAqICAgdHlwZS4gIE90aGVyd2lzZSBjYWxsIGRldGVjdGlvbiByb3V0aW5lcyBmb3IgZXZlcnkgYWRhcHRlciB0eXBlcyB1bnRpbAorICogICBhZGFwdGVyIGlzIGRldGVjdGVkLgorICoKKyAqIE5vdGVzOgorICogMSkgRGV0ZWN0aW9uIHRlc3RzIGFyZSBkZXN0cnVjdGl2ZSEgQWRhcHRlciB3aWxsIGJlIGxlZnQgaW4gc2h1dGRvd24gc3RhdGUKKyAqICAgIGFmdGVyIHRoZSB0ZXN0LgorICovCitzdGF0aWMgaW50IHNkbGFfZGV0ZWN0IChzZGxhaHdfdCogaHcpCit7CisJdW5zaWduZWQgcG9ydCA9IGh3LT5wb3J0OworCWludCBlcnIgPSAwOworCisJaWYgKCFwb3J0ICYmIChody0+dHlwZSAhPSBTRExBX1M1MTQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworICAgIAlzd2l0Y2ggKGh3LT50eXBlKSB7CisJY2FzZSBTRExBX1M1MDJBOgorCQlpZiAoIWRldGVjdF9zNTAyYShwb3J0KSkgZXJyID0gLUVOT0RFVjsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwMkU6CisJCWlmICghZGV0ZWN0X3M1MDJlKHBvcnQpKSBlcnIgPSAtRU5PREVWOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTAzOgorCQlpZiAoIWRldGVjdF9zNTAzKHBvcnQpKSBlcnIgPSAtRU5PREVWOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTA3OgorCQlpZiAoIWRldGVjdF9zNTA3KHBvcnQpKSBlcnIgPSAtRU5PREVWOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTA4OgorCQlpZiAoIWRldGVjdF9zNTA4KHBvcnQpKSBlcnIgPSAtRU5PREVWOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTE0OgorICAgICAgICAgICAgICAgIGlmICghZGV0ZWN0X3M1MTQoaHcpKSBlcnIgPSAtRU5PREVWOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWlmIChkZXRlY3RfczUwMmEocG9ydCkpCisJCQlody0+dHlwZSA9IFNETEFfUzUwMkE7CisJCWVsc2UgaWYgKGRldGVjdF9zNTAyZShwb3J0KSkKKwkJCWh3LT50eXBlID0gU0RMQV9TNTAyRTsKKwkJZWxzZSBpZiAoZGV0ZWN0X3M1MDMocG9ydCkpCisJCQlody0+dHlwZSA9IFNETEFfUzUwMzsKKwkJZWxzZSBpZiAoZGV0ZWN0X3M1MDcocG9ydCkpCisJCQlody0+dHlwZSA9IFNETEFfUzUwNzsKKwkJZWxzZSBpZiAoZGV0ZWN0X3M1MDgocG9ydCkpCisJCQlody0+dHlwZSA9IFNETEFfUzUwODsKKwkJZWxzZSBlcnIgPSAtRU5PREVWOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEF1dG9zZWxlY3QgbWVtb3J5IHJlZ2lvbi4gCisgKiBvIHRyeSBhbGwgYXZhaWxhYmxlIERNUCBhZGRyZXNzIG9wdGlvbnMgZnJvbSB0aGUgdG9wIGRvd24gdW50aWwgc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBzZGxhX2F1dG9kcG0gKHNkbGFod190KiBodykKK3sKKwlpbnQgaSwgZXJyID0gLUVJTlZBTDsKKwl1bnNpZ25lZCogb3B0OworCisJc3dpdGNoIChody0+dHlwZSkgeworCWNhc2UgU0RMQV9TNTAyQToKKwkJb3B0ID0gczUwMmFfZHBtYmFzZV9vcHRpb25zOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTAyRToKKwljYXNlIFNETEFfUzUwMzoKKwljYXNlIFNETEFfUzUwODoKKwkJb3B0ID0gczUwOF9kcG1iYXNlX29wdGlvbnM7CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDc6CisJCW9wdCA9IHM1MDdfZHBtYmFzZV9vcHRpb25zOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFN0YXJ0IHRlc3RpbmcgZnJvbSA4dGggcG9zaXRpb24sIGFkZHJlc3MKKyAgICAgICAgICogMHhDODAwMCBmcm9tIHRoZSA1MDggYWRkcmVzcyB0YWJsZS4gCisgICAgICAgICAqIFdlIGRvbid0IHdhbnQgdG8gdGVzdCBBKioqKiBhZGRyZXNzZXMsIHNpbmNlCisgICAgICAgICAqIHRoZXkgYXJlIHVzdWFsbHkgdXNlZCBmb3IgVmlkZW8gKi8KKwlmb3IgKGkgPSA4OyBpIDw9IG9wdFswXSAmJiBlcnI7IGkrKykgeworCQlody0+ZHBtYmFzZSA9IHBoeXNfdG9fdmlydChvcHRbaV0pOworCQllcnIgPSBzZGxhX3NldGRwbShodyk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IHVwIGFkYXB0ZXIgZHVhbC1wb3J0IG1lbW9yeSB3aW5kb3cuIAorICogbyBzaHV0IGRvd24gYWRhcHRlcgorICogbyBtYWtlIHN1cmUgdGhhdCBubyBwaHlzaWNhbCBtZW1vcnkgZXhpc3RzIGluIHRoaXMgcmVnaW9uLCBpLmUgZW50aXJlCisgKiAgIHJlZ2lvbiByZWFkcyAweEZGIGFuZCBpcyBub3Qgd3JpdGFibGUgd2hlbiBhZGFwdGVyIGlzIHNodXQgZG93bi4KKyAqIG8gaW5pdGlhbGl6ZSBhZGFwdGVyIGhhcmR3YXJlCisgKiBvIG1ha2Ugc3VyZSB0aGF0IHJlZ2lvbiBpcyB1c2FibGUgd2l0aCBTRExBIGNhcmQsIGkuZS4gd2UgY2FuIHdyaXRlIHRvIGl0CisgKiAgIHdoZW4gYWRhcHRlciBpcyBjb25maWd1cmVkLgorICovCitzdGF0aWMgaW50IHNkbGFfc2V0ZHBtIChzZGxhaHdfdCogaHcpCit7CisJaW50IGVycjsKKworCS8qIFNodXQgZG93biBjYXJkIGFuZCB2ZXJpZnkgbWVtb3J5IHJlZ2lvbiAqLworCXNkbGFfZG93bihodyk7CisJaWYgKGNoZWNrX21lbXJlZ2lvbihody0+ZHBtYmFzZSwgaHctPmRwbXNpemUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEluaXRpYWxpemUgYWRhcHRlciBhbmQgdGVzdCBvbi1ib2FyZCBtZW1vcnkgc2VnbWVudCBieSBzZWdtZW50LgorCSAqIElmIG1lbW9yeSBzaXplIGFwcGVhcnMgdG8gYmUgbGVzcyB0aGFuIHNoYXJlZCBtZW1vcnkgd2luZG93IHNpemUsCisJICogYXNzdW1lIHRoYXQgbWVtb3J5IHJlZ2lvbiBpcyB1bnVzYWJsZS4KKwkgKi8KKwllcnIgPSBzZGxhX2luaXQoaHcpOworCWlmIChlcnIpIHJldHVybiBlcnI7CisKKwlpZiAoc2RsYV9tZW10ZXN0KGh3KSA8IGh3LT5kcG1zaXplKSB7CS8qIGxlc3MgdGhhbiB3aW5kb3cgc2l6ZSAqLworCQlzZGxhX2Rvd24oaHcpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJc2RsYV9tYXBtZW0oaHcsIDBMKTsJLyogc2V0IHdpbmRvdyB2ZWN0b3IgYXQgYm90dG9tICovCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTG9hZCBhZGFwdGVyIGZyb20gdGhlIG1lbW9yeSBpbWFnZSBvZiB0aGUgU0RMQSBmaXJtd2FyZSBtb2R1bGUuIAorICogbyB2ZXJpZnkgZmlybXdhcmUgaW50ZWdyaXR5IGFuZCBjb21wYXRpYmlsaXR5CisgKiBvIHN0YXJ0IGFkYXB0ZXIgdXAKKyAqLworc3RhdGljIGludCBzZGxhX2xvYWQgKHNkbGFod190KiBodywgc2ZtX3QqIHNmbSwgdW5zaWduZWQgbGVuKQoreworCisJaW50IGk7CisKKwkvKiBWZXJpZnkgZmlybXdhcmUgc2lnbmF0dXJlICovCisJaWYgKHN0cmNtcChzZm0tPnNpZ25hdHVyZSwgU0ZNX1NJR05BVFVSRSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vdCBTRExBIGZpcm13YXJlIVxuIiwKKwkJCW1vZG5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBWZXJpZnkgZmlybXdhcmUgbW9kdWxlIGZvcm1hdCB2ZXJzaW9uICovCisJaWYgKHNmbS0+dmVyc2lvbiAhPSBTRk1fVkVSU0lPTikgeworCQlwcmludGsoS0VSTl9JTkZPCisJCQkiJXM6IGZpcm13YXJlIGZvcm1hdCAldSByZWplY3RlZCEgRXhwZWN0aW5nICV1LlxuIiwKKwkJCW1vZG5hbWUsIHNmbS0+dmVyc2lvbiwgU0ZNX1ZFUlNJT04pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBWZXJpZnkgZmlybXdhcmUgbW9kdWxlIGxlbmd0aCBhbmQgY2hlY2tzdW0gKi8KKwlpZiAoKGxlbiAtIG9mZnNldG9mKHNmbV90LCBpbWFnZSkgIT0gc2ZtLT5pbmZvLmNvZGVzaXplKSB8fAorCQkoY2hlY2tzdW0oKHZvaWQqKSZzZm0tPmluZm8sCisJCXNpemVvZihzZm1faW5mb190KSArIHNmbS0+aW5mby5jb2Rlc2l6ZSkgIT0gc2ZtLT5jaGVja3N1bSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZpcm13YXJlIGNvcnJ1cHRlZCFcbiIsIG1vZG5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBBbm5vdW5jZSAqLworCXByaW50ayhLRVJOX0lORk8gIiVzOiBsb2FkaW5nICVzIChJRD0ldSkuLi5cbiIsIG1vZG5hbWUsCisJCShzZm0tPmRlc2NyWzBdICE9ICdcMCcpID8gc2ZtLT5kZXNjciA6ICJ1bmtub3duIGZpcm13YXJlIiwKKwkJc2ZtLT5pbmZvLmNvZGVpZCk7CisKKwlpZihody0+dHlwZSA9PSBTRExBX1M1MTQpCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsb2FkaW5nIFM1MTQgYWRhcHRlciwgQ1BVICVjXG4iLAorCQkJbW9kbmFtZSwgaHctPlM1MTRfY3B1X25vWzBdKTsKKworCS8qIFNjYW4gdGhyb3VnaCB0aGUgbGlzdCBvZiBjb21wYXRpYmxlIGFkYXB0ZXJzIGFuZCBtYWtlIHN1cmUgb3VyCisJICogYWRhcHRlciB0eXBlIGlzIGxpc3RlZC4KKwkgKi8KKwlmb3IgKGkgPSAwOworCSAgICAgKGkgPCBTRk1fTUFYX1NETEEpICYmIChzZm0tPmluZm8uYWRhcHRlcltpXSAhPSBody0+dHlwZSk7CisJICAgICArK2kpOworCQorCWlmIChpID09IFNGTV9NQVhfU0RMQSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogZmlybXdhcmUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBTJXUhXG4iLAorCQkJbW9kbmFtZSwgaHctPnR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKworCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggb24tYm9hcmQgbWVtb3J5ICovCisJaWYgKGh3LT5tZW1vcnkgPCBzZm0tPmluZm8ubWVtc2l6ZSkgeworCQlwcmludGsoS0VSTl9JTkZPCisJCQkiJXM6IGZpcm13YXJlIG5lZWRzICVsdSBieXRlcyBvZiBvbi1ib2FyZCBtZW1vcnkhXG4iLAorCQkJbW9kbmFtZSwgc2ZtLT5pbmZvLm1lbXNpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBNb3ZlIGNvZGUgb250byBhZGFwdGVyICovCisJaWYgKHNkbGFfcG9rZShodywgc2ZtLT5pbmZvLmNvZGVvZmZzLCBzZm0tPmltYWdlLCBzZm0tPmluZm8uY29kZXNpemUpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBmYWlsZWQgdG8gbG9hZCBjb2RlIHNlZ21lbnQhXG4iLAorCQkJbW9kbmFtZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFByZXBhcmUgYm9vdC10aW1lIGNvbmZpZ3VyYXRpb24gZGF0YSBhbmQga2ljay1vZmYgQ1BVICovCisJc2RsYV9ib290Y2ZnKGh3LCAmc2ZtLT5pbmZvKTsKKwlpZiAoc2RsYV9zdGFydChodywgc2ZtLT5pbmZvLnN0YXJ0b2ZmcykpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERhbW4uLi4gQWRhcHRlciB3b24ndCBzdGFydCFcbiIsCisJCQltb2RuYW1lKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogcG9zaXRpb24gRFBNIHdpbmRvdyBvdmVyIHRoZSBtYWlsYm94IGFuZCBlbmFibGUgaW50ZXJydXB0cyAqLworICAgICAgICBpZiAoc2RsYV9tYXBtZW0oaHcsIHNmbS0+aW5mby53aW5vZmZzKSB8fCBzZGxhX2ludGVuKGh3KSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogYWRhcHRlciBoYXJkd2FyZSBmYWlsdXJlIVxuIiwKKwkJCW1vZG5hbWUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaHctPmZ3aWQgPSBzZm0tPmluZm8uY29kZWlkOwkJLyogc2V0IGZpcm13YXJlIElEICovCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBTRExBIGhhcmR3YXJlOiBzZXR1cCBtZW1vcnkgd2luZG93LCBJUlEsIGV0Yy4KKyAqLworc3RhdGljIGludCBzZGxhX2luaXQgKHNkbGFod190KiBodykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTRExBX01BWElPUkFOR0U7ICsraSkKKwkJaHctPnJlZ3NbaV0gPSAwOworCisJc3dpdGNoIChody0+dHlwZSkgeworCWNhc2UgU0RMQV9TNTAyQTogcmV0dXJuIGluaXRfczUwMmEoaHcpOworCWNhc2UgU0RMQV9TNTAyRTogcmV0dXJuIGluaXRfczUwMmUoaHcpOworCWNhc2UgU0RMQV9TNTAzOiAgcmV0dXJuIGluaXRfczUwMyhodyk7CisJY2FzZSBTRExBX1M1MDc6ICByZXR1cm4gaW5pdF9zNTA3KGh3KTsKKwljYXNlIFNETEFfUzUwODogIHJldHVybiBpbml0X3M1MDgoaHcpOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IGFkYXB0ZXIgb24tYm9hcmQgbWVtb3J5LgorICogbyBzbGlkZSBEUE0gd2luZG93IGZyb20gdGhlIGJvdHRvbSB1cCBhbmQgdGVzdCBhZGFwdGVyIG1lbW9yeSBzZWdtZW50IGJ5CisgKiAgIHNlZ21lbnQuCisgKiBSZXR1cm4gYWRhcHRlciBtZW1vcnkgc2l6ZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2RsYV9tZW10ZXN0IChzZGxhaHdfdCogaHcpCit7CisJdW5zaWduZWQgbG9uZyBtZW1zaXplOworCXVuc2lnbmVkIHdpbnNpemU7CisKKwlmb3IgKG1lbXNpemUgPSAwLCB3aW5zaXplID0gaHctPmRwbXNpemU7CisJICAgICAhc2RsYV9tYXBtZW0oaHcsIG1lbXNpemUpICYmCisJCSh0ZXN0X21lbXJlZ2lvbihody0+ZHBtYmFzZSwgd2luc2l6ZSkgPT0gd2luc2l6ZSkKKwkgICAgIDsKKwkgICAgIG1lbXNpemUgKz0gd2luc2l6ZSkKKwk7CisJaHctPm1lbW9yeSA9IG1lbXNpemU7CisJcmV0dXJuIG1lbXNpemU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJlcGFyZSBib290LXRpbWUgZmlybXdhcmUgY29uZmlndXJhdGlvbiBkYXRhLgorICogbyBwb3NpdGlvbiBEUE0gd2luZG93CisgKiBvIGluaXRpYWxpemUgY29uZmlndXJhdGlvbiBkYXRhIGFyZWEKKyAqLworc3RhdGljIGludCBzZGxhX2Jvb3RjZmcgKHNkbGFod190KiBodywgc2ZtX2luZm9fdCogc2ZtaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyKiBkYXRhOworCisJaWYgKCFzZm1pbmZvLT5kYXRhc2l6ZSkgcmV0dXJuIDA7CS8qIG5vdGhpbmcgdG8gZG8gKi8KKworCWlmIChzZGxhX21hcG1lbShodywgc2ZtaW5mby0+ZGF0YW9mZnMpICE9IDApCisJCXJldHVybiAtRUlPOworCisJaWYoaHctPnR5cGUgPT0gU0RMQV9TNTE0KQorICAgICAgICAgICAgICAgIGRhdGEgPSAodm9pZCopKGh3LT5kcG1iYXNlICsgc2ZtaW5mby0+ZGF0YW9mZnMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGF0YSA9ICh2b2lkKikoKHU4ICopaHctPmRwbWJhc2UgKworICAgICAgICAgICAgICAgICAgICAgICAgKHNmbWluZm8tPmRhdGFvZmZzIC0gaHctPnZlY3RvcikpOworCisJbWVtc2V0X2lvIChkYXRhLCAwLCBzZm1pbmZvLT5kYXRhc2l6ZSk7CisKKwl3cml0ZWIgKG1ha2VfY29uZmlnX2J5dGUoaHcpLCAmZGF0YVsweDAwXSk7CisKKwlzd2l0Y2ggKHNmbWluZm8tPmNvZGVpZCkgeworCWNhc2UgU0ZJRF9YMjVfNTAyOgorCWNhc2UgU0ZJRF9YMjVfNTA4OgorICAgICAgICAgICAgICAgIHdyaXRlYiAoMywgJmRhdGFbMHgwMV0pOyAgICAgICAgLyogVDEgdGltZXIgKi8KKyAgICAgICAgICAgICAgICB3cml0ZWIgKDEwLCAmZGF0YVsweDAzXSk7ICAgICAgIC8qIE4yICovCisgICAgICAgICAgICAgICAgd3JpdGViICg3LCAmZGF0YVsweDA2XSk7ICAgICAgICAvKiBIRExDIHdpbmRvdyBzaXplICovCisgICAgICAgICAgICAgICAgd3JpdGViICgxLCAmZGF0YVsweDBCXSk7ICAgICAgICAvKiBEVEUgKi8KKyAgICAgICAgICAgICAgICB3cml0ZWIgKDIsICZkYXRhWzB4MENdKTsgICAgICAgIC8qIFguMjUgcGFja2V0IHdpbmRvdyBzaXplICovCisgICAgICAgICAgICAgICAgd3JpdGV3ICgxMjgsICZkYXRhWzB4MERdKTsJLyogZGVmYXVsdCBYLjI1IGRhdGEgc2l6ZSAqLworICAgICAgICAgICAgICAgIHdyaXRldyAoMTI4LCAmZGF0YVsweDBGXSk7CS8qIG1heGltdW0gWC4yNSBkYXRhIHNpemUgKi8KKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFByZXBhcmUgY29uZmlndXJhdGlvbiBieXRlIGlkZW50aWZ5aW5nIGFkYXB0ZXIgdHlwZSBhbmQgQ1BVIGNsb2NrIHJhdGUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1ha2VfY29uZmlnX2J5dGUgKHNkbGFod190KiBodykKK3sKKwl1bnNpZ25lZCBjaGFyIGJ5dGUgPSAwOworCisJc3dpdGNoIChody0+cGNsaykgeworCQljYXNlIDUwMDA6ICBieXRlID0gMHgwMTsgYnJlYWs7CisJCWNhc2UgNzIwMDogIGJ5dGUgPSAweDAyOyBicmVhazsKKwkJY2FzZSA4MDAwOiAgYnl0ZSA9IDB4MDM7IGJyZWFrOworCQljYXNlIDEwMDAwOiBieXRlID0gMHgwNDsgYnJlYWs7CisJCWNhc2UgMTYwMDA6IGJ5dGUgPSAweDA1OyBicmVhazsKKwl9CisKKwlzd2l0Y2ggKGh3LT50eXBlKSB7CisJCWNhc2UgU0RMQV9TNTAyRTogYnl0ZSB8PSAweDgwOyBicmVhazsKKwkJY2FzZSBTRExBX1M1MDM6ICBieXRlIHw9IDB4NDA7IGJyZWFrOworCX0KKwlyZXR1cm4gYnl0ZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTdGFydCBhZGFwdGVyJ3MgQ1BVLgorICogbyBjYWxjdWxhdGUgYSBwb2ludGVyIHRvIGFkYXB0ZXIncyBjb2xkIGJvb3QgZW50cnkgcG9pbnQKKyAqIG8gcG9zaXRpb24gRFBNIHdpbmRvdworICogbyBwbGFjZSBib290IGluc3RydWN0aW9uIChqcCBhZGRyKSBhdCBjb2xkIGJvb3QgZW50cnkgcG9pbnQKKyAqIG8gc3RhcnQgQ1BVCisgKi8KK3N0YXRpYyBpbnQgc2RsYV9zdGFydCAoc2RsYWh3X3QqIGh3LCB1bnNpZ25lZCBhZGRyKQoreworCXVuc2lnbmVkIHBvcnQgPSBody0+cG9ydDsKKwl1bnNpZ25lZCBjaGFyICpib290cDsKKwlpbnQgZXJyLCB0bXAsIGk7CisKKwlpZiAoIXBvcnQgJiYgKGh3LT50eXBlICE9IFNETEFfUzUxNCkpIHJldHVybiAtRUZBVUxUOworCisgCXN3aXRjaCAoaHctPnR5cGUpIHsKKwljYXNlIFNETEFfUzUwMkE6CisJCWJvb3RwID0gaHctPmRwbWJhc2U7CisJCWJvb3RwICs9IDB4NjY7CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MDJFOgorCWNhc2UgU0RMQV9TNTAzOgorCWNhc2UgU0RMQV9TNTA3OgorCWNhc2UgU0RMQV9TNTA4OgorCWNhc2UgU0RMQV9TNTE0OgorCQlib290cCA9IGh3LT5kcG1iYXNlOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVyciA9IHNkbGFfbWFwbWVtKGh3LCAwKTsKKwlpZiAoZXJyKSByZXR1cm4gZXJyOworCisgICAgICAJd3JpdGViICgweEMzLCBib290cCk7ICAgLyogWjgwOiAnanAnIG9wY29kZSAqLworCWJvb3RwICsrOworCXdyaXRldyAoYWRkciwgYm9vdHApOworCisJc3dpdGNoIChody0+dHlwZSkgeworCWNhc2UgU0RMQV9TNTAyQToKKwkJX09VVEIocG9ydCwgMHgxMCk7CQkvKiBpc3N1ZSBOTUkgdG8gQ1BVICovCisJCWh3LT5yZWdzWzBdID0gMHgxMDsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwMkU6CisJCV9PVVRCKHBvcnQgKyAzLCAweDAxKTsJCS8qIHN0YXJ0IENQVSAqLworCQlody0+cmVnc1szXSA9IDB4MDE7CisJCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CisJCWlmIChfSU5CKHBvcnQpICYgMHgwMSkgewkvKiB2ZXJpZnkgKi8KKwkJCS8qCisJCQkgKiBFbmFibGluZyBDUFUgY2hhbmdlcyBmdW5jdGlvbmFsaXR5IG9mIHRoZQorCQkJICogY29udHJvbCByZWdpc3Rlciwgc28gd2UgaGF2ZSB0byByZXNldCBpdHMKKwkJCSAqIG1pcnJvci4KKwkJCSAqLworCQkJX09VVEIocG9ydCwgMCk7CQkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwkJCWh3LT5yZWdzWzBdID0gMDsKKwkJfQorCQllbHNlIHJldHVybiAtRUlPOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTAzOgorCQl0bXAgPSBody0+cmVnc1swXSB8IDB4MDk7CS8qIHNldCBiaXRzIDAgYW5kIDMgKi8KKwkJX09VVEIocG9ydCwgdG1wKTsKKwkJaHctPnJlZ3NbMF0gPSB0bXA7CQkvKiB1cGRhdGUgbWlycm9yICovCisJCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CisJCWlmICghKF9JTkIocG9ydCkgJiAweDAxKSkJLyogdmVyaWZ5ICovCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisKKwljYXNlIFNETEFfUzUwNzoKKwkJdG1wID0gaHctPnJlZ3NbMF0gfCAweDAyOworCQlfT1VUQihwb3J0LCB0bXApOworCQlody0+cmVnc1swXSA9IHRtcDsJCS8qIHVwZGF0ZSBtaXJyb3IgKi8KKwkJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsKKwkJaWYgKCEoX0lOQihwb3J0KSAmIDB4MDQpKQkvKiB2ZXJpZnkgKi8KKwkJCXJldHVybiAtRUlPOworCQlicmVhazsKKworCWNhc2UgU0RMQV9TNTA4OgorCQl0bXAgPSBody0+cmVnc1swXSB8IDB4MDI7CisJCV9PVVRCKHBvcnQsIHRtcCk7CisJCWh3LT5yZWdzWzBdID0gdG1wOwkvKiB1cGRhdGUgbWlycm9yICovCisJCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CisJCWlmICghKF9JTkIocG9ydCArIDEpICYgMHgwMikpCS8qIHZlcmlmeSAqLworCQkJcmV0dXJuIC1FSU87CisJCWJyZWFrOworCisJY2FzZSBTRExBX1M1MTQ6CisJCXdyaXRlYiAoUzUxNF9DUFVfU1RBUlQsIGh3LT52ZWN0b3IpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIFM1MDJBIGFkYXB0ZXIuCisgKi8KK3N0YXRpYyBpbnQgaW5pdF9zNTAyYSAoc2RsYWh3X3QqIGh3KQoreworCXVuc2lnbmVkIHBvcnQgPSBody0+cG9ydDsKKwlpbnQgdG1wLCBpOworCisJaWYgKCFkZXRlY3RfczUwMmEocG9ydCkpCisJCXJldHVybiAtRU5PREVWOworCisJaHctPnJlZ3NbMF0gPSAweDA4OworCWh3LT5yZWdzWzFdID0gMHhGRjsKKworCS8qIFZlcmlmeSBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKwlpID0gZ2V0X29wdGlvbl9pbmRleChzNTAyYV9kcG1iYXNlX29wdGlvbnMsIHZpcnRfdG9fcGh5cyhody0+ZHBtYmFzZSkpOworCWlmIChpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJdG1wID0gczUwMmFfaG1jcltpIC0gMV07CisJc3dpdGNoIChody0+ZHBtc2l6ZSkgeworCWNhc2UgMHgyMDAwOgorCQl0bXAgfD0gMHgwMTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MTAwMDBMOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFNldHVwIGR1YWwtcG9ydCBtZW1vcnkgd2luZG93ICh0aGlzIGFsc28gZW5hYmxlcyBtZW1vcnkgYWNjZXNzKSAqLworCV9PVVRCKHBvcnQgKyAxLCB0bXApOworCWh3LT5yZWdzWzFdID0gdG1wOworCWh3LT5yZWdzWzBdID0gMHgwODsKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIFM1MDJFIGFkYXB0ZXIuCisgKi8KK3N0YXRpYyBpbnQgaW5pdF9zNTAyZSAoc2RsYWh3X3QqIGh3KQoreworCXVuc2lnbmVkIHBvcnQgPSBody0+cG9ydDsKKwlpbnQgdG1wLCBpOworCisJaWYgKCFkZXRlY3RfczUwMmUocG9ydCkpCisJCXJldHVybiAtRU5PREVWOworCisJLyogVmVyaWZ5IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLworCWkgPSBnZXRfb3B0aW9uX2luZGV4KHM1MDhfZHBtYmFzZV9vcHRpb25zLCB2aXJ0X3RvX3BoeXMoaHctPmRwbWJhc2UpKTsKKwlpZiAoaSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRtcCA9IHM1MDJlX2htY3JbaSAtIDFdOworCXN3aXRjaCAoaHctPmRwbXNpemUpIHsKKwljYXNlIDB4MjAwMDoKKwkJdG1wIHw9IDB4MDE7CisJCWJyZWFrOworCisJY2FzZSAweDEwMDAwTDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBTZXR1cCBkdWFsLXBvcnQgbWVtb3J5IHdpbmRvdyAqLworCV9PVVRCKHBvcnQgKyAxLCB0bXApOworCWh3LT5yZWdzWzFdID0gdG1wOworCisJLyogRW5hYmxlIG1lbW9yeSBhY2Nlc3MgKi8KKwlfT1VUQihwb3J0LCAweDAyKTsKKwlody0+cmVnc1swXSA9IDB4MDI7CisJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwlyZXR1cm4gKF9JTkIocG9ydCkgJiAweDAyKSA/IDAgOiAtRUlPOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgUzUwMyBhZGFwdGVyLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgaW5pdF9zNTAzIChzZGxhaHdfdCogaHcpCit7CisJdW5zaWduZWQgcG9ydCA9IGh3LT5wb3J0OworCWludCB0bXAsIGk7CisKKwlpZiAoIWRldGVjdF9zNTAzKHBvcnQpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIFZlcmlmeSBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKwlpID0gZ2V0X29wdGlvbl9pbmRleChzNTA4X2RwbWJhc2Vfb3B0aW9ucywgdmlydF90b19waHlzKGh3LT5kcG1iYXNlKSk7CisJaWYgKGkgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0bXAgPSBzNTAyZV9obWNyW2kgLSAxXTsKKwlzd2l0Y2ggKGh3LT5kcG1zaXplKSB7CisJY2FzZSAweDIwMDA6CisJCXRtcCB8PSAweDAxOworCQlicmVhazsKKworCWNhc2UgMHgxMDAwMEw6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU2V0dXAgZHVhbC1wb3J0IG1lbW9yeSB3aW5kb3cgKi8KKwlfT1VUQihwb3J0ICsgMSwgdG1wKTsKKwlody0+cmVnc1sxXSA9IHRtcDsKKworCS8qIEVuYWJsZSBtZW1vcnkgYWNjZXNzICovCisJX09VVEIocG9ydCwgMHgwMik7CisJaHctPnJlZ3NbMF0gPSAweDAyOwkvKiB1cGRhdGUgbWlycm9yICovCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBTNTA3IGFkYXB0ZXIuCisgKi8KK3N0YXRpYyBpbnQgaW5pdF9zNTA3IChzZGxhaHdfdCogaHcpCit7CisJdW5zaWduZWQgcG9ydCA9IGh3LT5wb3J0OworCWludCB0bXAsIGk7CisKKwlpZiAoIWRldGVjdF9zNTA3KHBvcnQpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIFZlcmlmeSBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKwlpID0gZ2V0X29wdGlvbl9pbmRleChzNTA3X2RwbWJhc2Vfb3B0aW9ucywgdmlydF90b19waHlzKGh3LT5kcG1iYXNlKSk7CisJaWYgKGkgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0bXAgPSBzNTA3X2htY3JbaSAtIDFdOworCXN3aXRjaCAoaHctPmRwbXNpemUpIHsKKwljYXNlIDB4MjAwMDoKKwkJdG1wIHw9IDB4MDE7CisJCWJyZWFrOworCisJY2FzZSAweDEwMDAwTDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBFbmFibGUgYWRhcHRlcidzIGxvZ2ljICovCisJX09VVEIocG9ydCwgMHgwMSk7CisJaHctPnJlZ3NbMF0gPSAweDAxOworCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJaWYgKCEoX0lOQihwb3J0KSAmIDB4MjApKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIFNldHVwIGR1YWwtcG9ydCBtZW1vcnkgd2luZG93ICovCisJX09VVEIocG9ydCArIDEsIHRtcCk7CisJaHctPnJlZ3NbMV0gPSB0bXA7CisKKwkvKiBFbmFibGUgbWVtb3J5IGFjY2VzcyAqLworCXRtcCA9IGh3LT5yZWdzWzBdIHwgMHgwNDsKKwlpZiAoaHctPmlycSkgeworCQlpID0gZ2V0X29wdGlvbl9pbmRleChzNTA4X2lycV9vcHRpb25zLCBody0+aXJxKTsKKwkJaWYgKGkpIHRtcCB8PSBzNTA3X2lycW1hc2tbaSAtIDFdOworCX0KKwlfT1VUQihwb3J0LCB0bXApOworCWh3LT5yZWdzWzBdID0gdG1wOwkJLyogdXBkYXRlIG1pcnJvciAqLworCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJcmV0dXJuIChfSU5CKHBvcnQpICYgMHgwOCkgPyAwIDogLUVJTzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIFM1MDggYWRhcHRlci4KKyAqLworc3RhdGljIGludCBpbml0X3M1MDggKHNkbGFod190KiBodykKK3sKKwl1bnNpZ25lZCBwb3J0ID0gaHctPnBvcnQ7CisJaW50IHRtcCwgaTsKKworCWlmICghZGV0ZWN0X3M1MDgocG9ydCkpCisJCXJldHVybiAtRU5PREVWOworCisJLyogVmVyaWZ5IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLworCWkgPSBnZXRfb3B0aW9uX2luZGV4KHM1MDhfZHBtYmFzZV9vcHRpb25zLCB2aXJ0X3RvX3BoeXMoaHctPmRwbWJhc2UpKTsKKwlpZiAoaSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFNldHVwIG1lbW9yeSBjb25maWd1cmF0aW9uICovCisJdG1wID0gczUwOF9obWNyW2kgLSAxXTsKKwlfT1VUQihwb3J0ICsgMSwgdG1wKTsKKwlody0+cmVnc1sxXSA9IHRtcDsKKworCS8qIEVuYWJsZSBtZW1vcnkgYWNjZXNzICovCisJX09VVEIocG9ydCwgMHgwNCk7CisJaHctPnJlZ3NbMF0gPSAweDA0OwkJLyogdXBkYXRlIG1pcnJvciAqLworCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJcmV0dXJuIChfSU5CKHBvcnQgKyAxKSAmIDB4MDQpID8gMCA6IC1FSU87Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGV0ZWN0IFM1MDJBIGFkYXB0ZXIuCisgKglGb2xsb3dpbmcgdGVzdHMgYXJlIHVzZWQgdG8gZGV0ZWN0IFM1MDJBIGFkYXB0ZXI6CisgKgkxLiBBbGwgcmVnaXN0ZXJzIG90aGVyIHRoYW4gc3RhdHVzIChCQVNFKSBzaG91bGQgcmVhZCAweEZGCisgKgkyLiBBZnRlciB3cml0aW5nIDAwMDAxMDAwYiB0byBjb250cm9sIHJlZ2lzdGVyLCBzdGF0dXMgcmVnaXN0ZXIgc2hvdWxkCisgKgkgICByZWFkIDAxMDAwMDAwYi4KKyAqCTMuIEFmdGVyIHdyaXRpbmcgMCB0byBjb250cm9sIHJlZ2lzdGVyLCBzdGF0dXMgcmVnaXN0ZXIgc2hvdWxkIHN0aWxsCisgKgkgICByZWFkICAwMTAwMDAwMGIuCisgKgk0LiBBZnRlciB3cml0aW5nIDAwMDAwMTAwYiB0byBjb250cm9sIHJlZ2lzdGVyLCBzdGF0dXMgcmVnaXN0ZXIgc2hvdWxkCisgKgkgICByZWFkIDAxMDAwMTAwYi4KKyAqCVJldHVybiAxIGlmIGRldGVjdGVkIG8uay4gb3IgMCBpZiBmYWlsZWQuCisgKglOb3RlOglUaGlzIHRlc3QgaXMgZGVzdHJ1Y3RpdmUhIEFkYXB0ZXIgd2lsbCBiZSBsZWZ0IGluIHNodXRkb3duCisgKgkJc3RhdGUgYWZ0ZXIgdGhlIHRlc3QuCisgKi8KK3N0YXRpYyBpbnQgZGV0ZWN0X3M1MDJhIChpbnQgcG9ydCkKK3sKKwlpbnQgaSwgajsKKworCWlmICghZ2V0X29wdGlvbl9pbmRleChzNTAyX3BvcnRfb3B0aW9ucywgcG9ydCkpCisJCXJldHVybiAwOworCQorCWZvciAoaiA9IDE7IGogPCBTRExBX01BWElPUkFOR0U7ICsraikgeworCQlpZiAoX0lOQihwb3J0ICsgaikgIT0gMHhGRikKKwkJCXJldHVybiAwOworCQlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCX0KKworCV9PVVRCKHBvcnQsIDB4MDgpOwkJCS8qIGhhbHQgQ1BVICovCisJX09VVEIocG9ydCwgMHgwOCk7CisJX09VVEIocG9ydCwgMHgwOCk7CisJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwlpZiAoX0lOQihwb3J0KSAhPSAweDQwKQorCQlyZXR1cm4gMDsKKwlfT1VUQihwb3J0LCAweDAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCWlmIChfSU5CKHBvcnQpICE9IDB4NDApCisJCXJldHVybiAwOworCV9PVVRCKHBvcnQsIDB4MDQpOworCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJaWYgKF9JTkIocG9ydCkgIT0gMHg0NCkKKwkJcmV0dXJuIDA7CisKKwkvKiBSZXNldCBhZGFwdGVyICovCisJX09VVEIocG9ydCwgMHgwOCk7CisJX09VVEIocG9ydCwgMHgwOCk7CisJX09VVEIocG9ydCwgMHgwOCk7CisJX09VVEIocG9ydCArIDEsIDB4RkYpOworCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERldGVjdCBTNTAyRSBhZGFwdGVyLgorICoJRm9sbG93aW5nIHRlc3RzIGFyZSB1c2VkIHRvIHZlcmlmeSBhZGFwdGVyIHByZXNlbmNlOgorICoJMS4gQWxsIHJlZ2lzdGVycyBvdGhlciB0aGFuIHN0YXR1cyAoQkFTRSkgc2hvdWxkIHJlYWQgMHhGRi4KKyAqCTIuIEFmdGVyIHdyaXRpbmcgMCB0byBDUFUgY29udHJvbCByZWdpc3RlciAoQkFTRSszKSwgc3RhdHVzIHJlZ2lzdGVyCisgKgkgICAoQkFTRSkgc2hvdWxkIHJlYWQgMTExMTEwMDBiLgorICoJMy4gQWZ0ZXIgd3JpdGluZyAwMDAwMDEwMGIgdG8gcG9ydCBCQVNFIChzZXQgYml0IDIpLCBzdGF0dXMgcmVnaXN0ZXIKKyAqCSAgIChCQVNFKSBzaG91bGQgcmVhZCAxMTExMTEwMGIuCisgKglSZXR1cm4gMSBpZiBkZXRlY3RlZCBvLmsuIG9yIDAgaWYgZmFpbGVkLgorICoJTm90ZToJVGhpcyB0ZXN0IGlzIGRlc3RydWN0aXZlISBBZGFwdGVyIHdpbGwgYmUgbGVmdCBpbiBzaHV0ZG93bgorICoJCXN0YXRlIGFmdGVyIHRoZSB0ZXN0LgorICovCitzdGF0aWMgaW50IGRldGVjdF9zNTAyZSAoaW50IHBvcnQpCit7CisJaW50IGksIGo7CisKKwlpZiAoIWdldF9vcHRpb25faW5kZXgoczUwMl9wb3J0X29wdGlvbnMsIHBvcnQpKQorCQlyZXR1cm4gMDsKKwlmb3IgKGogPSAxOyBqIDwgU0RMQV9NQVhJT1JBTkdFOyArK2opIHsKKwkJaWYgKF9JTkIocG9ydCArIGopICE9IDB4RkYpCisJCQlyZXR1cm4gMDsKKwkJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwl9CisKKwlfT1VUQihwb3J0ICsgMywgMCk7CQkJLyogQ1BVIGNvbnRyb2wgcmVnLiAqLworCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJaWYgKF9JTkIocG9ydCkgIT0gMHhGOCkJCQkvKiByZWFkIHN0YXR1cyAqLworCQlyZXR1cm4gMDsKKwlfT1VUQihwb3J0LCAweDA0KTsJCQkvKiBzZXQgYml0IDIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCWlmIChfSU5CKHBvcnQpICE9IDB4RkMpCQkJLyogdmVyaWZ5ICovCisJCXJldHVybiAwOworCisJLyogUmVzZXQgYWRhcHRlciAqLworCV9PVVRCKHBvcnQsIDApOworCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERldGVjdCBzNTAzIGFkYXB0ZXIuCisgKglGb2xsb3dpbmcgdGVzdHMgYXJlIHVzZWQgdG8gdmVyaWZ5IGFkYXB0ZXIgcHJlc2VuY2U6CisgKgkxLiBBbGwgcmVnaXN0ZXJzIG90aGVyIHRoYW4gc3RhdHVzIChCQVNFKSBzaG91bGQgcmVhZCAweEZGLgorICoJMi4gQWZ0ZXIgd3JpdGluZyAwIHRvIGNvbnRyb2wgcmVnaXN0ZXIgKEJBU0UpLCBzdGF0dXMgcmVnaXN0ZXIgKEJBU0UpCisgKgkgICBzaG91bGQgcmVhZCAxMTExMDAwMGIuCisgKgkzLiBBZnRlciB3cml0aW5nIDAwMDAwMTAwYiAoc2V0IGJpdCAyKSB0byBjb250cm9sIHJlZ2lzdGVyIChCQVNFKSwKKyAqCSAgIHN0YXR1cyByZWdpc3RlciBzaG91bGQgcmVhZCAxMTExMDAxMGIuCisgKglSZXR1cm4gMSBpZiBkZXRlY3RlZCBvLmsuIG9yIDAgaWYgZmFpbGVkLgorICoJTm90ZToJVGhpcyB0ZXN0IGlzIGRlc3RydWN0aXZlISBBZGFwdGVyIHdpbGwgYmUgbGVmdCBpbiBzaHV0ZG93bgorICoJCXN0YXRlIGFmdGVyIHRoZSB0ZXN0LgorICovCitzdGF0aWMgaW50IGRldGVjdF9zNTAzIChpbnQgcG9ydCkKK3sKKwlpbnQgaSwgajsKKworCWlmICghZ2V0X29wdGlvbl9pbmRleChzNTAzX3BvcnRfb3B0aW9ucywgcG9ydCkpCisJCXJldHVybiAwOworCWZvciAoaiA9IDE7IGogPCBTRExBX01BWElPUkFOR0U7ICsraikgeworCQlpZiAoX0lOQihwb3J0ICsgaikgIT0gMHhGRikKKwkJCXJldHVybiAwOworCQlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCX0KKworCV9PVVRCKHBvcnQsIDApOwkJCQkvKiByZXNldCBjb250cm9sIHJlZy4qLworCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJaWYgKF9JTkIocG9ydCkgIT0gMHhGMCkJCQkvKiByZWFkIHN0YXR1cyAqLworCQlyZXR1cm4gMDsKKwlfT1VUQihwb3J0LCAweDA0KTsJCQkvKiBzZXQgYml0IDIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCWlmIChfSU5CKHBvcnQpICE9IDB4RjIpCQkJLyogdmVyaWZ5ICovCisJCXJldHVybiAwOworCisJLyogUmVzZXQgYWRhcHRlciAqLworCV9PVVRCKHBvcnQsIDApOworCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERldGVjdCBzNTA3IGFkYXB0ZXIuCisgKglGb2xsb3dpbmcgdGVzdHMgYXJlIHVzZWQgdG8gZGV0ZWN0IHM1MDcgYWRhcHRlcjoKKyAqCTEuIEFsbCBwb3J0cyBzaG91bGQgcmVhZCB0aGUgc2FtZSB2YWx1ZS4KKyAqCTIuIEFmdGVyIHdyaXRpbmcgMHgwMCB0byBjb250cm9sIHJlZ2lzdGVyLCBzdGF0dXMgcmVnaXN0ZXIgc2hvdWxkIHJlYWQKKyAqCSAgID8wMTEwMDA/Yi4KKyAqCTMuIEFmdGVyIHdyaXRpbmcgMHgwMSB0byBjb250cm9sIHJlZ2lzdGVyLCBzdGF0dXMgcmVnaXN0ZXIgc2hvdWxkIHJlYWQKKyAqCSAgID8wMTEwMDE/Yi4KKyAqCVJldHVybiAxIGlmIGRldGVjdGVkIG8uay4gb3IgMCBpZiBmYWlsZWQuCisgKglOb3RlOglUaGlzIHRlc3QgaXMgZGVzdHJ1Y3RpdmUhIEFkYXB0ZXIgd2lsbCBiZSBsZWZ0IGluIHNodXRkb3duCisgKgkJc3RhdGUgYWZ0ZXIgdGhlIHRlc3QuCisgKi8KK3N0YXRpYyBpbnQgZGV0ZWN0X3M1MDcgKGludCBwb3J0KQoreworCWludCB0bXAsIGksIGo7CisKKwlpZiAoIWdldF9vcHRpb25faW5kZXgoczUwOF9wb3J0X29wdGlvbnMsIHBvcnQpKQorCQlyZXR1cm4gMDsKKwl0bXAgPSBfSU5CKHBvcnQpOworCWZvciAoaiA9IDE7IGogPCBTNTA3X0lPUkFOR0U7ICsraikgeworCQlpZiAoX0lOQihwb3J0ICsgaikgIT0gdG1wKQorCQkJcmV0dXJuIDA7CisJCWZvciAoaSA9IDA7IGkgPCBTRExBX0lPREVMQVk7ICsraSk7CS8qIGRlbGF5ICovCisJfQorCisJX09VVEIocG9ydCwgMHgwMCk7CisJZm9yIChpID0gMDsgaSA8IFNETEFfSU9ERUxBWTsgKytpKTsJLyogZGVsYXkgKi8KKwlpZiAoKF9JTkIocG9ydCkgJiAweDdFKSAhPSAweDMwKQorCQlyZXR1cm4gMDsKKwlfT1VUQihwb3J0LCAweDAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCWlmICgoX0lOQihwb3J0KSAmIDB4N0UpICE9IDB4MzIpCisJCXJldHVybiAwOworCisJLyogUmVzZXQgYWRhcHRlciAqLworCV9PVVRCKHBvcnQsIDB4MDApOworCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERldGVjdCBzNTA4IGFkYXB0ZXIuCisgKglGb2xsb3dpbmcgdGVzdHMgYXJlIHVzZWQgdG8gZGV0ZWN0IHM1MDggYWRhcHRlcjoKKyAqCTEuIEFmdGVyIHdyaXRpbmcgMHgwMCB0byBjb250cm9sIHJlZ2lzdGVyLCBzdGF0dXMgcmVnaXN0ZXIgc2hvdWxkIHJlYWQKKyAqCSAgID8/MDAwMDAwYi4KKyAqCTIuIEFmdGVyIHdyaXRpbmcgMHgxMCB0byBjb250cm9sIHJlZ2lzdGVyLCBzdGF0dXMgcmVnaXN0ZXIgc2hvdWxkIHJlYWQKKyAqCSAgID8/MDEwMDAwYgorICoJUmV0dXJuIDEgaWYgZGV0ZWN0ZWQgby5rLiBvciAwIGlmIGZhaWxlZC4KKyAqCU5vdGU6CVRoaXMgdGVzdCBpcyBkZXN0cnVjdGl2ZSEgQWRhcHRlciB3aWxsIGJlIGxlZnQgaW4gc2h1dGRvd24KKyAqCQlzdGF0ZSBhZnRlciB0aGUgdGVzdC4KKyAqLworc3RhdGljIGludCBkZXRlY3RfczUwOCAoaW50IHBvcnQpCit7CisJaW50IGk7CisKKwlpZiAoIWdldF9vcHRpb25faW5kZXgoczUwOF9wb3J0X29wdGlvbnMsIHBvcnQpKQorCQlyZXR1cm4gMDsKKwlfT1VUQihwb3J0LCAweDAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCWlmICgoX0lOQihwb3J0ICsgMSkgJiAweDNGKSAhPSAweDAwKQorCQlyZXR1cm4gMDsKKwlfT1VUQihwb3J0LCAweDEwKTsKKwlmb3IgKGkgPSAwOyBpIDwgU0RMQV9JT0RFTEFZOyArK2kpOwkvKiBkZWxheSAqLworCWlmICgoX0lOQihwb3J0ICsgMSkgJiAweDNGKSAhPSAweDEwKQorCQlyZXR1cm4gMDsKKworCS8qIFJlc2V0IGFkYXB0ZXIgKi8KKwlfT1VUQihwb3J0LCAweDAwKTsKKwlyZXR1cm4gMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZXRlY3QgczUxNCBQQ0kgYWRhcHRlci4KKyAqICAgICAgUmV0dXJuIDEgaWYgZGV0ZWN0ZWQgby5rLiBvciAwIGlmIGZhaWxlZC4KKyAqICAgICAgTm90ZTogICBUaGlzIHRlc3QgaXMgZGVzdHJ1Y3RpdmUhIEFkYXB0ZXIgd2lsbCBiZSBsZWZ0IGluIHNodXRkb3duCisgKiAgICAgICAgICAgICAgc3RhdGUgYWZ0ZXIgdGhlIHRlc3QuCisgKi8KK3N0YXRpYyBpbnQgZGV0ZWN0X3M1MTQgKHNkbGFod190KiBodykKK3sKKwl1bnNpZ25lZCBjaGFyIENQVV9ubywgc2xvdF9ubywgYXV0b19zbG90X2NmZzsKKwlpbnQgbnVtYmVyX1M1MTRfY2FyZHMgPSAwOworCXUzMiBTNTE0X21lbV9iYXNlX2FkZHIgPSAwOworCXUzMiB1dF91MzI7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisKKworI2lmbmRlZiBDT05GSUdfUENJCisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBMaW51eCBub3QgY29tcGlsZWQgZm9yIFBDSSB1c2FnZSFcbiIsIG1vZG5hbWUpOworICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgorCisJLyoKKwlUaGUgJ3NldHVwKCknIHByb2NlZHVyZSBpbiAnc2RsYW1haW4uYycgcGFzc2VzIHRoZSBDUFUgbnVtYmVyIGFuZCB0aGUKKwlzbG90IG51bWJlciBkZWZpbmVkIGluICdyb3V0ZXIuY29uZicgdmlhIHRoZSAncG9ydCcgZGVmaW5pdGlvbi4KKwkqLworCUNQVV9ubyA9IGh3LT5TNTE0X2NwdV9ub1swXTsKKwlzbG90X25vID0gaHctPlM1MTRfc2xvdF9ubzsKKwlhdXRvX3Nsb3RfY2ZnID0gaHctPmF1dG9fcGNpX2NmZzsKKworCWlmIChhdXRvX3Nsb3RfY2ZnKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNyY2guLi4gUzUxNCBjYXJkLCBDUFUgJWMsIFNsb3Q9QXV0b1xuIiwKKwkJbW9kbmFtZSwgQ1BVX25vKTsKKworCX1lbHNleworCQlwcmludGsoS0VSTl9JTkZPICIlczogc3JjaC4uLiBTNTE0IGNhcmQsIENQVSAlYywgU2xvdCAjJWRcbiIsCisJCW1vZG5hbWUsIENQVV9ubywgc2xvdF9ubyk7CisJfQorCQorCS8qIGNoZWNrIHRvIHNlZSB0aGF0IENQVSBBIG9yIEIgaGFzIGJlZW4gc2VsZWN0ZWQgaW4gJ3JvdXRlci5jb25mJyAqLworCXN3aXRjaChDUFVfbm8pIHsKKwkJY2FzZSBTNTE0X0NQVV9BOgorCQljYXNlIFM1MTRfQ1BVX0I6CisJCQlicmVhazsKKwkKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTNTE0IENQVSBkZWZpbml0aW9uIGludmFsaWQuXG4iLCAKKwkJCQltb2RuYW1lKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIk11c3QgYmUgJ0EnIG9yICdCJ1xuIik7CisJCQlyZXR1cm4gMDsKKwl9CisKKwludW1iZXJfUzUxNF9jYXJkcyA9IGZpbmRfczUxNF9hZGFwdGVyKGh3LCAwKTsKKwlpZighbnVtYmVyX1M1MTRfY2FyZHMpCisJCXJldHVybiAwOworCisJLyogd2UgYXJlIHVzaW5nIGEgc2luZ2xlIFM1MTQgYWRhcHRlciB3aXRoIGEgc2xvdCBvZiAwIHNvIHJlLXJlYWQgdGhlICovCQorCS8qIGxvY2F0aW9uIG9mIHRoaXMgYWRhcHRlciAqLworCWlmKChudW1iZXJfUzUxNF9jYXJkcyA9PSAxKSAmJiBhdXRvX3Nsb3RfY2ZnKSB7CQorICAgICAgICAJbnVtYmVyX1M1MTRfY2FyZHMgPSBmaW5kX3M1MTRfYWRhcHRlcihodywgMSk7CisJCWlmKCFudW1iZXJfUzUxNF9jYXJkcykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVycm9yIGZpbmRpbmcgUENJIGNhcmRcbiIsCisJCQkJbW9kbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXBjaV9kZXYgPSBody0+cGNpX2RldjsKKwkvKiByZWFkIHRoZSBwaHlzaWNhbCBtZW1vcnkgYmFzZSBhZGRyZXNzICovCisJUzUxNF9tZW1fYmFzZV9hZGRyID0gKENQVV9ubyA9PSBTNTE0X0NQVV9BKSA/IAorCQkocGNpX2Rldi0+cmVzb3VyY2VbMV0uc3RhcnQpIDoKKwkJKHBjaV9kZXYtPnJlc291cmNlWzJdLnN0YXJ0KTsKKwkKKwlwcmludGsoS0VSTl9JTkZPICIlczogUzUxNCBQQ0kgbWVtb3J5IGF0IDB4JVhcbiIsCisJCW1vZG5hbWUsIFM1MTRfbWVtX2Jhc2VfYWRkcik7CisJaWYoIVM1MTRfbWVtX2Jhc2VfYWRkcikgeworCQlpZihDUFVfbm8gPT0gUzUxNF9DUFVfQikKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDUFUgI0Igbm90IHByZXNlbnQgb24gdGhlIGNhcmRcbiIsIAkJCQltb2RuYW1lKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE5vIFBDSSBtZW1vcnkgYWxsb2NhdGVkIHRvIGNhcmRcbiIsCQkJCW1vZG5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBlbmFibGUgdGhlIFBDSSBtZW1vcnkgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpX2RldiwgCisJCShDUFVfbm8gPT0gUzUxNF9DUFVfQSkgPyBQQ0lfTUFQMF9EV09SRCA6IFBDSV9NQVAxX0RXT1JELAorCQkmdXRfdTMyKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9kZXYsCisJCShDUFVfbm8gPT0gUzUxNF9DUFVfQSkgPyBQQ0lfTUFQMF9EV09SRCA6IFBDSV9NQVAxX0RXT1JELAorCQkodXRfdTMyIHwgUENJX01FTU9SWV9FTkFCTEUpKTsKKworCS8qIGNoZWNrIHRoZSBJUlEgYWxsb2NhdGVkIGFuZCBlbmFibGUgSVJRIHVzYWdlICovCisJaWYoIShody0+aXJxID0gcGNpX2Rldi0+aXJxKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogSVJRIG5vdCBhbGxvY2F0ZWQgdG8gUzUxNCBhZGFwdGVyXG4iLAorCQkJbW9kbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJfQorCisJLyogQlVHIEZJWCA6IE1hciA2IDIwMDAKKyAJICogT24gYSBpbml0aWFsIGxvYWRpbmcgb2YgdGhlIGNhcmQsIHdlIG11c3QgY2hlY2sKKyAgICAgICAgICogYW5kIGNsZWFyIFBDSSBpbnRlcnJ1cHQgYml0cywgZHVlIHRvIGEgcmVzZXQKKyAgICAgICAgICogcHJvYmxlbSBvbiBzb21lIG90aGVyIGJvYXJkcy4gIGkuZS4gQW4gaW50ZXJydXB0CisgICAgICAgICAqIG1pZ2h0IGJlIHBlbmRpbmcsIGV2ZW4gYWZ0ZXIgc3lzdGVtIGJvb3R1cCwgCisgICAgICAgICAqIGluIHdoaWNoIGNhc2UsIHdoZW4gc3RhcnRpbmcgd2Fucm91dGVyIHRoZSBtYWNoaW5lCisgICAgICAgICAqIHdvdWxkIGNyYXNoLiAKKwkgKi8KKwlpZiAoaW5pdF9wY2lfc2xvdChodykpCisJCXJldHVybiAwOworCisgICAgICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCBQQ0lfSU5UX0NPTkZJRywgJnV0X3UzMik7CisgICAgICAgIHV0X3UzMiB8PSAoQ1BVX25vID09IFM1MTRfQ1BVX0EpID8KKyAgICAgICAgICAgICAgICBQQ0lfRU5BQkxFX0lSUV9DUFVfQSA6IFBDSV9FTkFCTEVfSVJRX0NQVV9COworICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9kZXYsIFBDSV9JTlRfQ09ORklHLCB1dF91MzIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElSUSAlZCBhbGxvY2F0ZWQgdG8gdGhlIFM1MTQgY2FyZFxuIiwKKwkJbW9kbmFtZSwgaHctPmlycSk7CisKKwkvKiBtYXAgdGhlIHBoeXNpY2FsIFBDSSBtZW1vcnkgdG8gdmlydHVhbCBtZW1vcnkgKi8KKwkodm9pZCAqKWh3LT5kcG1iYXNlID0gaW9yZW1hcCgodW5zaWduZWQgbG9uZylTNTE0X21lbV9iYXNlX2FkZHIsCisJCSh1bnNpZ25lZCBsb25nKU1BWF9TSVpFT0ZfUzUxNF9NRU1PUlkpOworICAgIAkvKiBtYXAgdGhlIHBoeXNpY2FsIGNvbnRyb2wgcmVnaXN0ZXIgbWVtb3J5IHRvIHZpcnR1YWwgbWVtb3J5ICovCisJaHctPnZlY3RvciA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXAoCisJCSh1bnNpZ25lZCBsb25nKShTNTE0X21lbV9iYXNlX2FkZHIgKyBTNTE0X0NUUkxfUkVHX0JZVEUpLAorCQkodW5zaWduZWQgbG9uZykxNik7CisgICAgIAorICAgICAgICBpZighaHctPmRwbWJhc2UgfHwgIWh3LT52ZWN0b3IpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBDSSB2aXJ0dWFsIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIiwKKwkJCW1vZG5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCX0KKworCS8qIGhhbHQgdGhlIGFkYXB0ZXIgKi8KKwl3cml0ZWIgKFM1MTRfQ1BVX0hBTFQsIGh3LT52ZWN0b3IpOwkKKworCXJldHVybiAxOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZpbmQgdGhlIFM1MTQgUENJIGFkYXB0ZXIgaW4gdGhlIFBDSSBidXMuCisgKiAgICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIFM1MTQgYWRhcHRlcnMgZm91bmQgKDAgaWYgbm8gYWRhcHRlciBmb3VuZCkuCisgKi8KK3N0YXRpYyBpbnQgZmluZF9zNTE0X2FkYXB0ZXIoc2RsYWh3X3QqIGh3LCBjaGFyIGZpbmRfZmlyc3RfUzUxNF9jYXJkKQoreworICAgICAgICB1bnNpZ25lZCBjaGFyIHNsb3Rfbm87CisgICAgICAgIGludCBudW1iZXJfUzUxNF9jYXJkcyA9IDA7CisJY2hhciBTNTE0X2ZvdW5kX2luX3Nsb3QgPSAwOworICAgICAgICB1MTYgUENJX3N1YnN5c192ZW5kb3I7CisKKyAgICAgICAgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOworIAorICAgICAgIHNsb3Rfbm8gPSBody0+UzUxNF9zbG90X25vOworICAKKwl3aGlsZSAoKHBjaV9kZXYgPSBwY2lfZmluZF9kZXZpY2UoVjNfVkVORE9SX0lELCBWM19ERVZJQ0VfSUQsIHBjaV9kZXYpKQorICAgICAgICAJIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIAorCQlwY2lfcmVhZF9jb25maWdfd29yZChwY2lfZGV2LCBQQ0lfU1VCU1lTX1ZFTkRPUl9XT1JELAorICAgICAgICAgICAgICAgICAgICAgICAgJlBDSV9zdWJzeXNfdmVuZG9yKTsKKyAgICAgICAgICAgICAgICAKKwkJaWYoUENJX3N1YnN5c192ZW5kb3IgIT0gU0FOR09NQV9TVUJTWVNfVkVORE9SKQorICAgICAgICAgICAgICAgIAljb250aW51ZTsKKyAgICAgICAgCQorCQlody0+cGNpX2RldiA9IHBjaV9kZXY7CisJCQorCQlpZihmaW5kX2ZpcnN0X1M1MTRfY2FyZCkKKwkJCXJldHVybigxKTsKKwkJCisgICAgICAgICAgICAgICAgbnVtYmVyX1M1MTRfY2FyZHMgKys7CisgICAgICAgICAgICAgICAgCisJCXByaW50ayhLRVJOX0lORk8KKwkJCSIlczogUzUxNCBjYXJkIGZvdW5kLCBzbG90ICMlZCAoZGV2Zm4gMHglWClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RuYW1lLCAoKHBjaV9kZXYtPmRldmZuID4+IDMpICYgUENJX0RFVl9TTE9UX01BU0spLAorCQkJcGNpX2Rldi0+ZGV2Zm4pOworCQkKKwkJaWYgKGh3LT5hdXRvX3BjaV9jZmcpeworCQkJaHctPlM1MTRfc2xvdF9ubyA9ICgocGNpX2Rldi0+ZGV2Zm4gPj4gMykgJiBQQ0lfREVWX1NMT1RfTUFTSyk7CisJCQlzbG90X25vID0gaHctPlM1MTRfc2xvdF9ubzsKKwkJCQorCQl9ZWxzZSBpZiAoKChwY2lfZGV2LT5kZXZmbiA+PiAzKSAmIFBDSV9ERVZfU0xPVF9NQVNLKSA9PSBzbG90X25vKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIFM1MTRfZm91bmRfaW5fc2xvdCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworCS8qIGlmIG5vIFM1MTQgYWRhcHRlciBoYXMgYmVlbiBmb3VuZCwgdGhlbiBleGl0ICovCisgICAgICAgIGlmICghbnVtYmVyX1M1MTRfY2FyZHMpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogRXJyb3IsIG5vIFM1MTQgYWRhcHRlcnMgZm91bmRcbiIsIG1vZG5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIC8qIGlmIG1vcmUgdGhhbiBvbmUgUzUxNCBjYXJkIGhhcyBiZWVuIGZvdW5kLCB0aGVuIHRoZSB1c2VyIG11c3QgaGF2ZSAqLyAgICAgICAgLyogZGVmaW5lZCBhIHNsb3QgbnVtYmVyIHNvIHRoYXQgdGhlIGNvcnJlY3QgYWRhcHRlciBpcyB1c2VkICovCisgICAgICAgIGVsc2UgaWYgKChudW1iZXJfUzUxNF9jYXJkcyA+IDEpICYmIGh3LT5hdXRvX3BjaV9jZmcpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogRXJyb3IsIFBDSSBTbG90IGF1dG9kZXRlY3QgRmFpbGVkISBcbiIKKwkJCQkgIiVzOiAgICAgICAgTW9yZSB0aGFuIG9uZSBTNTE0IGFkYXB0ZXIgZm91bmQuXG4iCisJCQkJICIlczogICAgICAgIERpc2FibGUgdGhlIEF1dG9kZXRlY3QgZmVhdHVyZSBhbmQgc3VwcGx5XG4iCisJCQkJICIlczogICAgICAgIHRoZSBQQ0lTTE9UIG51bWJlcnMgZm9yIGVhY2ggY2FyZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RuYW1lLG1vZG5hbWUsbW9kbmFtZSxtb2RuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAvKiBpZiB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIGEgc2xvdCBudW1iZXIgYW5kIHRoZSBTNTE0IGFkYXB0ZXIgaGFzICovCisgICAgICAgIC8qIG5vdCBiZWVuIGZvdW5kIGluIHRoYXQgc2xvdCwgdGhlbiBleGl0ICovCisgICAgICAgIGVsc2UgaWYgKCFody0+YXV0b19wY2lfY2ZnICYmICFTNTE0X2ZvdW5kX2luX3Nsb3QpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPCisJCQkiJXM6IEVycm9yLCBTNTE0IGNhcmQgbm90IGZvdW5kIGluIHNwZWNpZmllZCBzbG90ICMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZG5hbWUsIHNsb3Rfbm8pOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKwlyZXR1cm4gKG51bWJlcl9TNTE0X2NhcmRzKTsKK30KKworCisKKy8qKioqKioqIE1pc2NlbGxhbmVvdXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENhbGlicmF0ZSBTRExBIG1lbW9yeSBhY2Nlc3MgZGVsYXkuCisgKiBDb3VudCBudW1iZXIgb2YgaWRsZSBsb29wcyBtYWRlIHdpdGhpbiAxIHNlY29uZCBhbmQgdGhlbiBjYWxjdWxhdGUgdGhlCisgKiBudW1iZXIgb2YgbG9vcHMgdGhhdCBzaG91bGQgYmUgbWFkZSB0byBhY2hpdmUgZGVzaXJlZCBkZWxheS4KKyAqLworc3RhdGljIGludCBjYWxpYnJhdGVfZGVsYXkgKGludCBta3MpCit7CisJdW5zaWduZWQgaW50IGRlbGF5OworCXVuc2lnbmVkIGxvbmcgc3RvcDsKKworCWZvciAoZGVsYXkgPSAwLCBzdG9wID0gU1lTVEVNX1RJQ0sgKyBIWjsgU1lTVEVNX1RJQ0sgPCBzdG9wOyArK2RlbGF5KTsKKwlyZXR1cm4gKGRlbGF5LygxMDAwMDAwTC9ta3MpICsgMSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogR2V0IG9wdGlvbidzIGluZGV4IGludG8gdGhlIG9wdGlvbnMgbGlzdC4KKyAqCVJldHVybiBvcHRpb24ncyBpbmRleCAoMSAuLiBOKSBvciB6ZXJvIGlmIG9wdGlvbiBpcyBpbnZhbGlkLgorICovCitzdGF0aWMgaW50IGdldF9vcHRpb25faW5kZXggKHVuc2lnbmVkKiBvcHRsaXN0LCB1bnNpZ25lZCBvcHR2YWwpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAxOyBpIDw9IG9wdGxpc3RbMF07ICsraSkKKwkJaWYgKCBvcHRsaXN0W2ldID09IG9wdHZhbCkKKwkJCXJldHVybiBpOworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENoZWNrIG1lbW9yeSByZWdpb24gdG8gc2VlIGlmIGl0J3MgYXZhaWxhYmxlLiAKKyAqIFJldHVybjoJMAlvay4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoZWNrX21lbXJlZ2lvbiAodm9pZCogcHRyLCB1bnNpZ25lZCBsZW4pCit7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciogcCA9IHB0cjsKKworICAgICAgICBmb3IgKDsgbGVuICYmIChyZWFkYiAocCkgPT0gMHhGRik7IC0tbGVuLCArK3ApIHsKKyAgICAgICAgICAgICAgICB3cml0ZWIgKDAsIHApOyAgICAgICAgICAvKiBhdHRlbXB0IHRvIHdyaXRlIDAgKi8KKyAgICAgICAgICAgICAgICBpZiAocmVhZGIocCkgIT0gMHhGRikgeyAvKiBzdGlsbCBoYXMgdG8gcmVhZCAweEZGICovCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZWIgKDB4RkYsIHApOy8qIHJlc3RvcmUgb3JpZ2luYWwgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAvKiBub3QgZ29vZCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisJcmV0dXJuIGxlbjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBUZXN0IG1lbW9yeSByZWdpb24uCisgKiBSZXR1cm46CXNpemUgb2YgdGhlIHJlZ2lvbiB0aGF0IHBhc3NlZCB0aGUgdGVzdC4KKyAqIE5vdGU6CVJlZ2lvbiBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YgMiAhCisgKi8KK3N0YXRpYyB1bnNpZ25lZCB0ZXN0X21lbXJlZ2lvbiAodm9pZCogcHRyLCB1bnNpZ25lZCBsZW4pCit7CisJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQqIHdfcHRyOworCXVuc2lnbmVkIGxlbl93ID0gbGVuID4+IDE7CS8qIHJlZ2lvbiBsZW4gaW4gd29yZHMgKi8KKwl1bnNpZ25lZCBpOworCisgICAgICAgIGZvciAoaSA9IDAsIHdfcHRyID0gcHRyOyBpIDwgbGVuX3c7ICsraSwgKyt3X3B0cikKKyAgICAgICAgICAgICAgICB3cml0ZXcgKDB4QUE1NSwgd19wdHIpOworICAgICAgICAKKwlmb3IgKGkgPSAwLCB3X3B0ciA9IHB0cjsgaSA8IGxlbl93OyArK2ksICsrd19wdHIpCisgICAgICAgICAgICAgICAgaWYgKHJlYWR3ICh3X3B0cikgIT0gMHhBQTU1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW5fdyA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMCwgd19wdHIgPSBwdHI7IGkgPCBsZW5fdzsgKytpLCArK3dfcHRyKQorICAgICAgICAgICAgICAgIHdyaXRldyAoMHg1NUFBLCB3X3B0cik7CisgICAgICAgIAorICAgICAgICBmb3IgKGkgPSAwLCB3X3B0ciA9IHB0cjsgaSA8IGxlbl93OyArK2ksICsrd19wdHIpCisgICAgICAgICAgICAgICAgaWYgKHJlYWR3KHdfcHRyKSAhPSAweDU1QUEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbl93ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciAoaSA9IDAsIHdfcHRyID0gcHRyOyBpIDwgbGVuX3c7ICsraSwgKyt3X3B0cikKKwkJd3JpdGV3ICgwLCB3X3B0cik7CisKKyAgICAgICAgcmV0dXJuIGxlbl93IDw8IDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2FsY3VsYXRlIDE2LWJpdCBDUkMgdXNpbmcgQ0NJVFQgcG9seW5vbWlhbC4KKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGNoZWNrc3VtICh1bnNpZ25lZCBjaGFyKiBidWYsIHVuc2lnbmVkIGxlbikKK3sKKwl1bnNpZ25lZCBzaG9ydCBjcmMgPSAwOworCXVuc2lnbmVkIG1hc2ssIGZsYWc7CisKKwlmb3IgKDsgbGVuOyAtLWxlbiwgKytidWYpIHsKKwkJZm9yIChtYXNrID0gMHg4MDsgbWFzazsgbWFzayA+Pj0gMSkgeworCQkJZmxhZyA9IChjcmMgJiAweDgwMDApOworCQkJY3JjIDw8PSAxOworCQkJY3JjIHw9ICgoKmJ1ZiAmIG1hc2spID8gMSA6IDApOworCQkJaWYgKGZsYWcpIGNyYyBePSAweDEwMjE7CisJCX0KKwl9CisJcmV0dXJuIGNyYzsKK30KKworc3RhdGljIGludCBpbml0X3BjaV9zbG90KHNkbGFod190ICpodykKK3sKKworCXUzMiBpbnRfc3RhdHVzOworCWludCB2b2xhdGlsZSBmb3VuZD0wOworCWludCBpPTA7CisKKwkvKiBDaGVjayBpZiB0aGlzIGlzIGEgdmVyeSBmaXJzdCBsb2FkIGZvciBhIHNwZWNpZmljCisgICAgICAgICAqIHBjaSBjYXJkLiBJZiBpdCBpcywgY2xlYXIgdGhlIGludGVycnB1dCBiaXRzLCBhbmQKKyAgICAgICAgICogc2V0IHRoZSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGlzIGNhcmQgd2FzIGluaXRpYWxpemVkLgorCSAqLworCQorCWZvciAoaT0wOyAoaTxNQVhfUzUxNF9DQVJEUykgJiYgIWZvdW5kOyBpKyspeworCQlpZiAocGNpX3Nsb3RfYXJbaV0gPT0gaHctPlM1MTRfc2xvdF9ubyl7CisJCQlmb3VuZD0xOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHBjaV9zbG90X2FyW2ldID09IDB4RkYpeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kKXsKKwkJcmVhZF9TNTE0X2ludF9zdGF0KGh3LCZpbnRfc3RhdHVzKTsKKwkJUzUxNF9pbnRhY2soaHcsaW50X3N0YXR1cyk7CisJCWlmIChpID09IE1BWF9TNTE0X0NBUkRTKXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDcml0aWNhbCBFcnJvciAhISFcbiIsbW9kbmFtZSk7CisJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogTnVtYmVyIG9mIFNhbmdvbWEgUENJIGNhcmRzIGV4Y2VlZGVkIG1heGltdW0gbGltaXQuXG4iLAorCQkJCQltb2RuYW1lKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIlBsZWFzZSBjb250YWN0IFNhbmdvbWEgVGVjaG5vbG9naWVzXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCXBjaV9zbG90X2FyW2ldID0gaHctPlM1MTRfc2xvdF9ubzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNpX3Byb2JlKHNkbGFod190ICpodykKK3sKKworICAgICAgICB1bnNpZ25lZCBjaGFyIHNsb3Rfbm87CisgICAgICAgIGludCBudW1iZXJfUzUxNF9jYXJkcyA9IDA7CisgICAgICAgIHUxNiBQQ0lfc3Vic3lzX3ZlbmRvcjsKKwl1MTYgUENJX2NhcmRfdHlwZTsKKworICAgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CisJc3RydWN0IHBjaV9idXMgKmJ1cyA9IE5VTEw7CisgCisgICAgICAgc2xvdF9ubyA9IDA7CisgIAorCXdoaWxlICgocGNpX2RldiA9IHBjaV9maW5kX2RldmljZShWM19WRU5ET1JfSUQsIFYzX0RFVklDRV9JRCwgcGNpX2RldikpCisgICAgICAgIAkhPSBOVUxMKSB7CisJCQorICAgICAgICAgICAgICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaV9kZXYsIFBDSV9TVUJTWVNfVkVORE9SX1dPUkQsCisgICAgICAgICAgICAgICAgICAgICAgICAmUENJX3N1YnN5c192ZW5kb3IpOworCQkKKyAgICAgICAgICAgICAgICBpZihQQ0lfc3Vic3lzX3ZlbmRvciAhPSBTQU5HT01BX1NVQlNZU19WRU5ET1IpCisgICAgICAgICAgICAgICAgCWNvbnRpbnVlOworCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaV9kZXYsIFBDSV9DQVJEX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAmUENJX2NhcmRfdHlwZSk7CisJCisJCWJ1cyA9IHBjaV9kZXYtPmJ1czsKKwkJCisJCS8qIEEgZHVhbCBjcHUgY2FyZCBjYW4gc3VwcG9ydCB1cCB0byA0IHBoeXNpY2FsIGNvbm5lY3Rpb25zLAorCQkgKiB3aGVyZSBhIHNpbmdsZSBjcHUgY2FyZCBjYW4gc3VwcG9ydCB1cCB0byAyIHBoeXNpY2FsCisJCSAqIGNvbm5lY3Rpb25zLiAgVGhlIEZUMSBjYXJkIGNhbiBvbmx5IHN1cHBvcnQgYSBzaW5nbGUgCisJCSAqIGNvbm5lY3Rpb24sIGhvd2V2ZXIgd2UgY2Fubm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBTaW5nbGUKKwkJICogQ1BVIGNhcmQgYW5kIGFuIEZUMSBjYXJkLiAqLworCQlpZiAoUENJX2NhcmRfdHlwZSA9PSBTNTE0X0RVQUxfQ1BVKXsKKyAgICAgICAgICAgICAgICAJbnVtYmVyX1M1MTRfY2FyZHMgKz0gNDsKKwkJCSBwcmludGsoS0VSTl9JTkZPCisJCQkJIndhbnBpcGU6IFM1MTQtUENJIGNhcmQgZm91bmQsIGNwdShzKSAyLCBidXMgIyVkLCBzbG90ICMlZCwgaXJxICMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIAlidXMtPm51bWJlciwoKHBjaV9kZXYtPmRldmZuID4+IDMpICYgUENJX0RFVl9TTE9UX01BU0spLAorCQkJCXBjaV9kZXYtPmlycSk7CisJCX1lbHNleworCQkJbnVtYmVyX1M1MTRfY2FyZHMgKz0gMjsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkid2FucGlwZTogUzUxNC1QQ0kgY2FyZCBmb3VuZCwgY3B1KHMpIDEsIGJ1cyAjJWQsIHNsb3QgIyVkLCBpcnEgIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgCWJ1cy0+bnVtYmVyLCgocGNpX2Rldi0+ZGV2Zm4gPj4gMykgJiBQQ0lfREVWX1NMT1RfTUFTSyksCisJCQkJcGNpX2Rldi0+aXJxKTsKKwkJfQorICAgICAgICB9CisKKwlyZXR1cm4gbnVtYmVyX1M1MTRfY2FyZHM7CisKK30KKworCisKK0VYUE9SVF9TWU1CT0wod2FucGlwZV9od19wcm9iZSk7CisKK3Vuc2lnbmVkIHdhbnBpcGVfaHdfcHJvYmUodm9pZCkKK3sKKwlzZGxhaHdfdCBodzsKKwl1bnNpZ25lZCogb3B0ID0gczUwOF9wb3J0X29wdGlvbnM7IAorCXVuc2lnbmVkIGNhcmRubz0wOworCWludCBpOworCQorCW1lbXNldCgmaHcsIDAsIHNpemVvZihodykpOworCQorCWZvciAoaSA9IDE7IGkgPD0gb3B0WzBdOyBpKyspIHsKKwkJaWYgKGRldGVjdF9zNTA4KG9wdFtpXSkpeworCQkJLyogUzUwOCBjYXJkIGNhbiBzdXBwb3J0IHVwIHRvIHR3byBwaHlzaWNhbCBsaW5rcyAqLworCQkJY2FyZG5vKz0yOworCQkJcHJpbnRrKEtFUk5fSU5GTyAid2FucGlwZTogUzUwOC1JU0EgY2FyZCBmb3VuZCwgcG9ydCAweCV4XG4iLG9wdFtpXSk7CisJCX0KKwl9CisKKyAgICAgICNpZmRlZiBDT05GSUdfUENJCisJaHcuUzUxNF9zbG90X25vID0gMDsKKwljYXJkbm8gKz0gcGNpX3Byb2JlKCZodyk7CisgICAgICAjZWxzZQorCXByaW50ayhLRVJOX0lORk8gIndhbnBpcGU6IFdhcm5pbmcsIEtlcm5lbCBub3QgY29tcGlsZWQgZm9yIFBDSSBzdXBwb3J0IVxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAid2FucGlwZTogUENJIEhhcmR3YXJlIFByb2JlIEZhaWxlZCFcbiIpOworICAgICAgI2VuZGlmCisKKwlyZXR1cm4gY2FyZG5vOworfQorCisvKioqKioqIEVuZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zZGxhbWFpbi5jIGIvZHJpdmVycy9uZXQvd2FuL3NkbGFtYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRlMTUxYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhbWFpbi5jCkBAIC0wLDAgKzEsMTM0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogc2RsYW1haW4uYwlXQU5QSVBFKHRtKSBNdWx0aXByb3RvY29sIFdBTiBMaW5rIERyaXZlci4gIE1haW4gbW9kdWxlLgorKgorKiBBdXRob3I6CU5lbmFkIENvcmJpYwk8bmNvcmJpY0BzYW5nb21hLmNvbT4KKyoJCUdpZGVvbiBIYWNrCQorKgorKiBDb3B5cmlnaHQ6CShjKSAxOTk1LTIwMDAgU2FuZ29tYSBUZWNobm9sb2dpZXMgSW5jLgorKgorKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiBEZWMgMjIsIDIwMDAgIE5lbmFkIENvcmJpYwlVcGRhdGVkIGZvciAyLjQuWCBrZXJuZWxzLgorKiAJCQkJUmVtb3ZlZCB0aGUgcG9sbGluZyByb3V0aW5lLgorKiBOb3YgMTMsIDIwMDAgIE5lbmFkIENvcmJpYwlBZGRlZCBodyBwcm9iaW5nIG9uIG1vZHVsZSBsb2FkIGFuZCBkeW5hbWljCisqIAkJCQlkZXZpY2UgYWxsb2NhdGlvbi4gCisqIE5vdiA3LCAgMjAwMCAgTmVuYWQgQ29yYmljCUZpeGVkIHRoZSBNdWx0aS1Qb3J0IFBQUCBmb3Iga2VybmVscworKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjIuMTYgYW5kIGFib3ZlLgorKiBBdWcgMiwgIDIwMDAgIE5lbmFkIENvcmJpYwlCbG9jayB0aGUgTXVsdGktUG9ydCBQUFAgZnJvbSBydW5uaW5nIG9uCisqICAJCQkgICAgICAgIGtlcm5lbHMgMi4yLjE2IG9yIGdyZWF0ZXIuICBUaGUgU3luY1BQUCAKKyogIAkJCSAgICAgICAgaGFzIGNoYW5nZWQuCisqIEp1bCAyNSwgMjAwMCAgTmVuYWQgQ29yYmljCVVwZGF0ZWQgdGhlIFBpZ2dpYmFjayBzdXBwb3J0IGZvciBNdWx0UFBQUC4KKyogSnVsIDEzLCAyMDAwCU5lbmFkIENvcmJpYwlBZGRlZCBNdWx0aS1QUFAgc3VwcG9ydC4KKyogRmViIDAyLCAyMDAwICBOZW5hZCBDb3JiaWMgICAgRml4ZWQgdXAgcGlnZ3liYWNrIHByb2JpbmcgYW5kIHNlbGVjdGlvbi4KKyogU2VwIDIzLCAxOTk5ICBOZW5hZCBDb3JiaWMgICAgQWRkZWQgc3VwcG9ydCBmb3IgU01QCisqIFNlcCAxMywgMTk5OSAgTmVuYWQgQ29yYmljCUVhY2ggcG9ydCBpcyB0cmVhdGVkIGFzIGEgc2VwYXJhdGUgZGV2aWNlLgorKiBKdW4gMDIsIDE5OTkgIEdpZGVvbiBIYWNrICAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgUzUxNCBhZGFwdGVyLgorKgkJCQlVcGRhdGVzIGZvciBMaW51eCAyLjIuWCBrZXJuZWxzLgorKiBTZXAgMTcsIDE5OTgJSmFzcHJlZXQgU2luZ2gJVXBkYXRlZCBmb3IgMi4xLjEyMSsga2VybmVsCisqIE5vdiAyOCwgMTk5NwlKYXNwcmVldCBTaW5naAlDaGFuZ2VkIERSVl9SRUxFQVNFIHRvIDEKKyogTm92IDEwLCAxOTk3CUphc3ByZWV0IFNpbmdoCUNoYW5nZWQgc3RpKCkgdG8gcmVzdG9yZV9mbGFncygpOworKiBOb3YgMDYsIDE5OTcgCUphc3ByZWV0IFNpbmdoCUNoYW5nZWQgRFJWX1ZFUlNJT04gdG8gNCBhbmQgRFJWX1JFTEVBU0UgdG8gMAorKiBPY3QgMjAsIDE5OTcgCUphc3ByZWV0IFNpbmdoCU1vZGlmaWVkIHNkbGFfaXNyIHJvdXRpbmUgc28gdGhhdCBjYXJkLT5pbl9pc3IKKyoJCQkJYXNzaWdubWVudHMgYXJlIHRha2VuIG91dCBhbmQgcGxhY2VkIGluIHRoZQorKgkJCQlzZGxhX3BwcC5jLCBzZGxhX2ZyLmMgYW5kIHNkbGFfeDI1LmMgaXNyCisqCQkJCXJvdXRpbmVzLiBUb29rIG91dCAnd2FuZGV2LT50eF9pbnRfZW5hYmxlZCcgYW5kCisqCQkJCXJlcGxhY2VkIGl0IHdpdGggJ3dhbmRldi0+ZW5hYmxlX3R4X2ludCcuIAorKiBNYXkgMjksIDE5OTcJSmFzcHJlZXQgU2luZ2gJRmxvdyBDb250cm9sIFByb2JsZW0KKyoJCQkJYWRkZWQgIndhbmRldi0+dHhfaW50X2VuYWJsZWQ9MSIgbGluZSBpbiB0aGUKKyoJCQkJaW5pdCBtb2R1bGUuIFRoaXMgbGluZSBpbml0aWFsaXplcyB0aGUgZmxhZyBmb3IgCisqCQkJCXByZXZlbnRpbmcgSW50ZXJydXB0IGRpc2FibGVkIHdpdGggZGV2aWNlIHNldCB0bworKgkJCQlidXN5CisqIEphbiAxNSwgMTk5NwlHZW5lIEtvemluCVZlcnNpb24gMy4xLjAKKyoJCQkJIG8gYWRkZWQgVURQIG1hbmFnZW1lbnQgc3R1ZmYKKyogSmFuIDAyLCAxOTk3CUdlbmUgS296aW4JSW5pdGlhbCB2ZXJzaW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4JLyogT1MgY29uZmlndXJhdGlvbiBvcHRpb25zICovCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CS8qIG9mZnNldG9mKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgkvKiByZXR1cm4gY29kZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4JLyogaW5saW5lIG1lbXNldCgpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4JLyoga21hbGxvYygpLCBrZnJlZSgpICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIHByaW50aygpLCBhbmQgb3RoZXIgdXNlZnVsIHN0dWZmICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIHN1cHBvcnQgZm9yIGxvYWRhYmxlIG1vZHVsZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4JLyogcmVxdWVzdF9yZWdpb24oKSwgcmVsZWFzZV9yZWdpb24oKSAqLworI2luY2x1ZGUgPGxpbnV4L3dhbnJvdXRlci5oPgkvKiBXQU4gcm91dGVyIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvd2FucGlwZS5oPgkvKiBXQU5QSVBFIGNvbW1vbiB1c2VyIEFQSSBkZWZpbml0aW9ucyAqLworCisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4JCS8qIHBoeXNfdG9fdmlydCgpICovCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2RsYXBjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3dhbnBpcGVfY29tbW9uLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgkvKiBrZXJuZWwgPC0+IHVzZXIgY29weSAqLworI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisgCisjZGVmaW5lIEtNRU1fU0FGRVRZWk9ORSA4CisKKworI2lmbmRlZiBDT05GSUdfV0FOUElQRV9GUgorICAjZGVmaW5lIHdwZl9pbml0KGEsYikgKC1FUFJPVE9OT1NVUFBPUlQpIAorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1dBTlBJUEVfQ0hETEMKKyAjZGVmaW5lIHdwY19pbml0KGEsYikgKC1FUFJPVE9OT1NVUFBPUlQpIAorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1dBTlBJUEVfWDI1CisgI2RlZmluZSB3cHhfaW5pdChhLGIpICgtRVBST1RPTk9TVVBQT1JUKSAKKyNlbmRpZgorIAorI2lmbmRlZiBDT05GSUdfV0FOUElQRV9QUFAKKyAjZGVmaW5lIHdwcF9pbml0KGEsYikgKC1FUFJPVE9OT1NVUFBPUlQpIAorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1dBTlBJUEVfTVVMVFBQUCAKKyAjZGVmaW5lIHdzcHBwX2luaXQoYSxiKSAoLUVQUk9UT05PU1VQUE9SVCkgCisjZW5kaWYKKyAKKyAKKy8qKioqKioqKioqKkZPUiBERUJVR0dJTkcgUFVSUE9TRVMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyB2b2lkICogZGJnX2ttYWxsb2ModW5zaWduZWQgaW50IHNpemUsIGludCBwcmlvLCBpbnQgbGluZSkgeworCWludCBpID0gMDsKKwl2b2lkICogdiA9IGttYWxsb2Moc2l6ZStzaXplb2YodW5zaWduZWQgaW50KSsyKktNRU1fU0FGRVRZWk9ORSo4LHByaW8pOworCWNoYXIgKiBjMSA9IHY7CQorCWMxICs9IHNpemVvZih1bnNpZ25lZCBpbnQpOworCSooKHVuc2lnbmVkIGludCAqKXYpID0gc2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCBLTUVNX1NBRkVUWVpPTkU7IGkrKykgeworCQljMVswXSA9ICdEJzsgYzFbMV0gPSAnRSc7IGMxWzJdID0gJ0EnOyBjMVszXSA9ICdEJzsKKwkJYzFbNF0gPSAnQic7IGMxWzVdID0gJ0UnOyBjMVs2XSA9ICdFJzsgYzFbN10gPSAnRic7CisJCWMxICs9IDg7CisJfQorCWMxICs9IHNpemU7CisJZm9yIChpID0gMDsgaSA8IEtNRU1fU0FGRVRZWk9ORTsgaSsrKSB7CisJCWMxWzBdID0gJ00nOyBjMVsxXSA9ICdVJzsgYzFbMl0gPSAnTic7IGMxWzNdID0gJ0cnOworCQljMVs0XSA9ICdXJzsgYzFbNV0gPSAnQSc7IGMxWzZdID0gJ0wnOyBjMVs3XSA9ICdMJzsKKwkJYzEgKz0gODsKKwl9CisJdiA9ICgoY2hhciAqKXYpICsgc2l6ZW9mKHVuc2lnbmVkIGludCkgKyBLTUVNX1NBRkVUWVpPTkUqODsKKwlwcmludGsoS0VSTl9JTkZPICJsaW5lICVkICBrbWFsbG9jKCVkLCVkKSA9ICVwXG4iLGxpbmUsc2l6ZSxwcmlvLHYpOworCXJldHVybiB2OworfQorc3RhdGljIHZvaWQgZGJnX2tmcmVlKHZvaWQgKiB2LCBpbnQgbGluZSkgeworCXVuc2lnbmVkIGludCAqIHNwID0gKHVuc2lnbmVkIGludCAqKSgoKGNoYXIgKil2KSAtIChzaXplb2YodW5zaWduZWQgaW50KSArIEtNRU1fU0FGRVRZWk9ORSo4KSk7CisJdW5zaWduZWQgaW50IHNpemUgPSAqc3A7CisJY2hhciAqIGMxID0gKChjaGFyICopdikgLSBLTUVNX1NBRkVUWVpPTkUqODsKKwlpbnQgaSA9IDA7CisJZm9yIChpID0gMDsgaSA8IEtNRU1fU0FGRVRZWk9ORTsgaSsrKSB7CisJCWlmICggICBjMVswXSAhPSAnRCcgfHwgYzFbMV0gIT0gJ0UnIHx8IGMxWzJdICE9ICdBJyB8fCBjMVszXSAhPSAnRCcKKwkJICAgIHx8IGMxWzRdICE9ICdCJyB8fCBjMVs1XSAhPSAnRScgfHwgYzFbNl0gIT0gJ0UnIHx8IGMxWzddICE9ICdGJykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAia21hbGxvY2VkIGJsb2NrIGF0ICVwIGhhcyBiZWVuIGNvcnJ1cHRlZCAodW5kZXJydW4pIVxuIix2KTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiAlNHg6ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnhcbiIsIGkqOCwKKwkJCSAgICAgICAgICAgICAgICBjMVswXSxjMVsxXSxjMVsyXSxjMVszXSxjMVs0XSxjMVs1XSxjMVs2XSxjMVs3XSApOworCQl9CisJCWMxICs9IDg7CisJfQorCWMxICs9IHNpemU7CisJZm9yIChpID0gMDsgaSA8IEtNRU1fU0FGRVRZWk9ORTsgaSsrKSB7CisJCWlmICggICBjMVswXSAhPSAnTScgfHwgYzFbMV0gIT0gJ1UnIHx8IGMxWzJdICE9ICdOJyB8fCBjMVszXSAhPSAnRycKKwkJICAgIHx8IGMxWzRdICE9ICdXJyB8fCBjMVs1XSAhPSAnQScgfHwgYzFbNl0gIT0gJ0wnIHx8IGMxWzddICE9ICdMJworCQkgICApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImttYWxsb2NlZCBibG9jayBhdCAlcCBoYXMgYmVlbiBjb3JydXB0ZWQgKG92ZXJydW4pOlxuIix2KTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiAlNHg6ICUyeCAlMnggJTJ4ICUyeCAlMnggJTJ4ICUyeCAlMnhcbiIsIGkqOCwKKwkJCSAgICAgICAgICAgICAgICBjMVswXSxjMVsxXSxjMVsyXSxjMVszXSxjMVs0XSxjMVs1XSxjMVs2XSxjMVs3XSApOworCQl9CisJCWMxICs9IDg7CisJfQorCXByaW50ayhLRVJOX0lORk8gImxpbmUgJWQgIGtmcmVlKCVwKVxuIixsaW5lLHYpOworCXYgPSAoKGNoYXIgKil2KSAtIChzaXplb2YodW5zaWduZWQgaW50KSArIEtNRU1fU0FGRVRZWk9ORSo4KTsKKwlrZnJlZSh2KTsKK30KKworI2RlZmluZSBrbWFsbG9jKHgseSkgZGJnX2ttYWxsb2MoeCx5LF9fTElORV9fKQorI2RlZmluZSBrZnJlZSh4KSBkYmdfa2ZyZWUoeCxfX0xJTkVfXykKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKy8qKioqKiogRGVmaW5lcyAmIE1hY3JvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYJX0RFQlVHXworI2RlZmluZQlTVEFUSUMKKyNlbHNlCisjZGVmaW5lCVNUQVRJQwkJc3RhdGljCisjZW5kaWYKKworI2RlZmluZQlEUlZfVkVSU0lPTgk1CQkvKiB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZQlEUlZfUkVMRUFTRQkwCQkvKiByZWxlYXNlIChtaW5vciB2ZXJzaW9uKSBudW1iZXIgKi8KKyNkZWZpbmUJTUFYX0NBUkRTCTE2CQkvKiBtYXggbnVtYmVyIG9mIGFkYXB0ZXJzICovCisKKyNpZm5kZWYJQ09ORklHX1dBTlBJUEVfQ0FSRFMJCS8qIGNvbmZpZ3VyYWJsZSBvcHRpb24gKi8KKyNkZWZpbmUJQ09ORklHX1dBTlBJUEVfQ0FSRFMgMQorI2VuZGlmCisKKyNkZWZpbmUJQ01EX09LCQkwCQkvKiBub3JtYWwgZmlybXdhcmUgcmV0dXJuIGNvZGUgKi8KKyNkZWZpbmUJQ01EX1RJTUVPVVQJMHhGRgkJLyogZmlybXdhcmUgY29tbWFuZCB0aW1lZCBvdXQgKi8KKyNkZWZpbmUJTUFYX0NNRF9SRVRSWQkxMAkJLyogbWF4IG51bWJlciBvZiBmaXJtd2FyZSByZXRyaWVzICovCisvKioqKioqIEZ1bmN0aW9uIFByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIHZvaWQgZGlzYWJsZV9pcnEodW5zaWduZWQgaW50KTsKK2V4dGVybiB2b2lkIGVuYWJsZV9pcnEodW5zaWduZWQgaW50KTsKKyAKKy8qIFdBTiBsaW5rIGRyaXZlciBlbnRyeSBwb2ludHMgKi8KK3N0YXRpYyBpbnQgc2V0dXAoc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiwgd2FuZGV2X2NvbmZfdCogY29uZik7CitzdGF0aWMgaW50IHNodXRkb3duKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYpOworc3RhdGljIGludCBpb2N0bChzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2LCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworLyogSU9DVEwgaGFuZGxlcnMgKi8KK3N0YXRpYyBpbnQgaW9jdGxfZHVtcAkoc2RsYV90KiBjYXJkLCBzZGxhX2R1bXBfdCogdV9kdW1wKTsKK3N0YXRpYyBpbnQgaW9jdGxfZXhlYwkoc2RsYV90KiBjYXJkLCBzZGxhX2V4ZWNfdCogdV9leGVjLCBpbnQpOworCisvKiBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucyAqLworU1RBVElDIGlycXJldHVybl90IHNkbGFfaXNyCShpbnQgaXJxLCB2b2lkKiBkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIHJlbGVhc2VfaHcgIChzZGxhX3QgKmNhcmQpOworCitzdGF0aWMgaW50IGNoZWNrX3M1MDhfY29uZmxpY3RzIChzZGxhX3QqIGNhcmQsd2FuZGV2X2NvbmZfdCogY29uZiwgaW50Kik7CitzdGF0aWMgaW50IGNoZWNrX3M1MTRfY29uZmxpY3RzIChzZGxhX3QqIGNhcmQsd2FuZGV2X2NvbmZfdCogY29uZiwgaW50Kik7CisKKworLyoqKioqKiBHbG9iYWwgRGF0YSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOb3RlOiBBbGwgZGF0YSBtdXN0IGJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQhISEKKyAqLworCisvKiBwcml2YXRlIGRhdGEgKi8KK3N0YXRpYyBjaGFyIGRydm5hbWVbXQk9ICJ3YW5waXBlIjsKK3N0YXRpYyBjaGFyIGZ1bGxuYW1lW10JPSAiV0FOUElQRSh0bSkgTXVsdGlwcm90b2NvbCBEcml2ZXIiOworc3RhdGljIGNoYXIgY29weXJpZ2h0W10JPSAiKGMpIDE5OTUtMjAwMCBTYW5nb21hIFRlY2hub2xvZ2llcyBJbmMuIjsKK3N0YXRpYyBpbnQgbmNhcmRzOyAKK3N0YXRpYyBzZGxhX3QqIGNhcmRfYXJyYXk7CQkvKiBhZGFwdGVyIGRhdGEgc3BhY2UgKi8KKworLyogV2FucGlwZSdzIG93biB3b3JrcXVldWUsIHVzZWQgZm9yIGFsbCBBUEkncy4KKyAqIEFsbCBwcm90b2NvbCBzcGVjaWZpYyB0YXNrcyB3aWxsIGJlIGluc2VydGVkCisgKiBpbnRvIHRoZSAid2FucGlwZV93cSIgd29ya3F1ZXVlLiAKKworICogVGhlIGtlcm5lbCB3b3JrcXVldWUgbWVjaGFuaXNtIHdpbGwgZXhlY3V0ZQorICogYWxsIHBlbmRpbmcgdGFza3MgaW4gdGhlICJ3YW5waXBlX3dxIiB3b3JrcXVldWUuCisgKi8KKworc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndhbnBpcGVfd3E7CitERUNMQVJFX1dPUksod2FucGlwZV93b3JrLCBOVUxMLCBOVUxMKTsKKworc3RhdGljIGludCB3YW5waXBlX2JoX2NyaXRpY2FsOworCisvKioqKioqKiBLZXJuZWwgTG9hZGFibGUgTW9kdWxlIEVudHJ5IFBvaW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBNb2R1bGUgJ2luc2VydCcgZW50cnkgcG9pbnQuCisgKiBvIHByaW50IGFubm91bmNlbWVudAorICogbyBhbGxvY2F0ZSBhZGFwdGVyIGRhdGEgc3BhY2UKKyAqIG8gaW5pdGlhbGl6ZSBzdGF0aWMgZGF0YQorICogbyByZWdpc3RlciBhbGwgY2FyZHMgd2l0aCBXQU4gcm91dGVyCisgKiBvIGNhbGlicmF0ZSBTRExBIHNoYXJlZCBtZW1vcnkgYWNjZXNzIGRlbGF5LgorICoKKyAqIFJldHVybjoJMAlPaworICoJCTwgMAllcnJvci4KKyAqIENvbnRleHQ6CXByb2Nlc3MKKyAqLworIAorc3RhdGljIGludCBfX2luaXQgd2FucGlwZV9pbml0KHZvaWQpCit7CisJaW50IGNudCwgZXJyID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gIiVzIHYldS4ldSAlc1xuIiwKKwkJZnVsbG5hbWUsIERSVl9WRVJTSU9OLCBEUlZfUkVMRUFTRSwgY29weXJpZ2h0KTsKKworCXdhbnBpcGVfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJ3YW5waXBlX3dxIik7CisJaWYgKCF3YW5waXBlX3dxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFByb2JlIGZvciB3YW5waXBlIGNhcmRzIGFuZCByZXR1cm4gdGhlIG51bWJlciBmb3VuZCAqLworCXByaW50ayhLRVJOX0lORk8gIndhbnBpcGU6IFByb2JpbmcgZm9yIFdBTlBJUEUgaGFyZHdhcmUuXG4iKTsKKwluY2FyZHMgPSB3YW5waXBlX2h3X3Byb2JlKCk7CisJaWYgKG5jYXJkcyl7CisJCXByaW50ayhLRVJOX0lORk8gIndhbnBpcGU6IEFsbG9jYXRpbmcgbWF4aW11bSAlaSBkZXZpY2VzOiB3YW5waXBlJWkgLSB3YW5waXBlJWkuXG4iLG5jYXJkcywxLG5jYXJkcyk7CisJfWVsc2V7CisJCXByaW50ayhLRVJOX0lORk8gIndhbnBpcGU6IE5vIFM1MTQvUzUwOCBjYXJkcyBmb3VuZCwgdW5sb2FkaW5nIG1vZHVsZXMhXG4iKTsKKwkJZGVzdHJveV93b3JrcXVldWUod2FucGlwZV93cSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkKKwkvKiBWZXJpZnkgbnVtYmVyIG9mIGNhcmRzIGFuZCBhbGxvY2F0ZSBhZGFwdGVyIGRhdGEgc3BhY2UgKi8KKwljYXJkX2FycmF5ID0ga21hbGxvYyhzaXplb2Yoc2RsYV90KSAqIG5jYXJkcywgR0ZQX0tFUk5FTCk7CisJaWYgKGNhcmRfYXJyYXkgPT0gTlVMTCkgeworCQlkZXN0cm95X3dvcmtxdWV1ZSh3YW5waXBlX3dxKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KGNhcmRfYXJyYXksIDAsIHNpemVvZihzZGxhX3QpICogbmNhcmRzKTsKKworCS8qIFJlZ2lzdGVyIGFkYXB0ZXJzIHdpdGggV0FOIHJvdXRlciAqLworCWZvciAoY250ID0gMDsgY250IDwgbmNhcmRzOyArKyBjbnQpIHsKKwkJc2RsYV90KiBjYXJkID0gJmNhcmRfYXJyYXlbY250XTsKKwkJc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiA9ICZjYXJkLT53YW5kZXY7CisKKwkJY2FyZC0+bmV4dCA9IE5VTEw7CisJCXNwcmludGYoY2FyZC0+ZGV2bmFtZSwgIiVzJWQiLCBkcnZuYW1lLCBjbnQgKyAxKTsKKwkJd2FuZGV2LT5tYWdpYyAgICA9IFJPVVRFUl9NQUdJQzsKKwkJd2FuZGV2LT5uYW1lICAgICA9IGNhcmQtPmRldm5hbWU7CisJCXdhbmRldi0+cHJpdmF0ZSAgPSBjYXJkOworCQl3YW5kZXYtPmVuYWJsZV90eF9pbnQgPSAwOworCQl3YW5kZXYtPnNldHVwICAgID0gJnNldHVwOworCQl3YW5kZXYtPnNodXRkb3duID0gJnNodXRkb3duOworCQl3YW5kZXYtPmlvY3RsICAgID0gJmlvY3RsOworCQllcnIgPSByZWdpc3Rlcl93YW5fZGV2aWNlKHdhbmRldik7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6ICVzIHJlZ2lzdHJhdGlvbiBmYWlsZWQgd2l0aCBlcnJvciAlZCFcbiIsCisJCQkJZHJ2bmFtZSwgY2FyZC0+ZGV2bmFtZSwgZXJyKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChjbnQpeworCQluY2FyZHMgPSBjbnQ7CS8qIGFkanVzdCBhY3R1YWwgbnVtYmVyIG9mIGNhcmRzICovCisJfWVsc2UgeworCQlrZnJlZShjYXJkX2FycmF5KTsKKwkJZGVzdHJveV93b3JrcXVldWUod2FucGlwZV93cSk7CisJCXByaW50ayhLRVJOX0lORk8gIklOIEluaXQgTW9kdWxlOiBOTyBDYXJkcyByZWdpc3RlcmVkXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE1vZHVsZSAncmVtb3ZlJyBlbnRyeSBwb2ludC4KKyAqIG8gdW5yZWdpc3RlciBhbGwgYWRhcHRlcnMgZnJvbSB0aGUgV0FOIHJvdXRlcgorICogbyByZWxlYXNlIGFsbCByZW1haW5pbmcgc3lzdGVtIHJlc291cmNlcworICovCitzdGF0aWMgdm9pZCBfX2V4aXQgd2FucGlwZV9jbGVhbnVwKHZvaWQpCit7CisJaW50IGk7CisKKwlpZiAoIW5jYXJkcykKKwkJcmV0dXJuOworCQkKKwlmb3IgKGkgPSAwOyBpIDwgbmNhcmRzOyArK2kpIHsKKwkJc2RsYV90KiBjYXJkID0gJmNhcmRfYXJyYXlbaV07CisJCXVucmVnaXN0ZXJfd2FuX2RldmljZShjYXJkLT5kZXZuYW1lKTsKKwl9CisJZGVzdHJveV93b3JrcXVldWUod2FucGlwZV93cSk7CisJa2ZyZWUoY2FyZF9hcnJheSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJcbndhbnBpcGU6IFdBTlBJUEUgTW9kdWxlcyBVbmxvYWRlZC5cbiIpOworfQorCittb2R1bGVfaW5pdCh3YW5waXBlX2luaXQpOworbW9kdWxlX2V4aXQod2FucGlwZV9jbGVhbnVwKTsKKworLyoqKioqKiogV0FOIERldmljZSBEcml2ZXIgRW50cnkgUG9pbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0dXAvY29uZmlndXJlIFdBTiBsaW5rIGRyaXZlci4KKyAqIG8gY2hlY2sgYWRhcHRlciBzdGF0ZQorICogbyBtYWtlIHN1cmUgZmlybXdhcmUgaXMgcHJlc2VudCBpbiBjb25maWd1cmF0aW9uCisgKiBvIG1ha2Ugc3VyZSBJL08gcG9ydCBhbmQgSVJRIGFyZSBzcGVjaWZpZWQKKyAqIG8gbWFrZSBzdXJlIEkvTyByZWdpb24gaXMgYXZhaWxhYmxlCisgKiBvIGFsbG9jYXRlIGludGVycnVwdCB2ZWN0b3IKKyAqIG8gc2V0dXAgU0RMQSBoYXJkd2FyZQorICogbyBjYWxsIGFwcHJvcHJpYXRlIHJvdXRpbmUgdG8gcGVyZm9ybSBwcm90b2NvbC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbgorICogbyBtYXJrIEkvTyByZWdpb24gYXMgdXNlZAorICogbyBpZiB0aGlzIGlzIHRoZSBmaXJzdCBhY3RpdmUgY2FyZCwgdGhlbiBzY2hlZHVsZSBiYWNrZ3JvdW5kIHRhc2sKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHJvdXRlciBoYW5kbGVzIFJPVVRFUl9TRVRVUCBJT0NUTC4gVGhlCisgKiBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBpcyBpbiBrZXJuZWwgbWVtb3J5IChpbmNsdWRpbmcgZXh0ZW5kZWQgZGF0YSwgaWYKKyAqIGFueSkuCisgKi8KKyAKK3N0YXRpYyBpbnQgc2V0dXAoc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiwgd2FuZGV2X2NvbmZfdCogY29uZikKK3sKKwlzZGxhX3QqIGNhcmQ7CisJaW50IGVyciA9IDA7CisJaW50IGlycT0wOworCisJLyogU2FuaXR5IGNoZWNrcyAqLworCWlmICgod2FuZGV2ID09IE5VTEwpIHx8ICh3YW5kZXYtPnByaXZhdGUgPT0gTlVMTCkgfHwgKGNvbmYgPT0gTlVMTCkpeworCQlwcmludGsoS0VSTl9JTkZPIAorCQkgICAgICAiJXM6IEZhaWxlZCBTZGxhbWFpbiBTZXR1cCB3YW5kZXYgJXUsIGNhcmQgJXUsIGNvbmYgJXUgIVxuIiwKKwkJICAgICAgd2FuZGV2LT5uYW1lLAorCQkgICAgICAodW5zaWduZWQgaW50KXdhbmRldiwodW5zaWduZWQgaW50KXdhbmRldi0+cHJpdmF0ZSwKKwkJICAgICAgKHVuc2lnbmVkIGludCljb25mKTsgCisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBTdGFydGluZyBXQU4gU2V0dXBcbiIsIHdhbmRldi0+bmFtZSk7CisKKwljYXJkID0gd2FuZGV2LT5wcml2YXRlOworCWlmICh3YW5kZXYtPnN0YXRlICE9IFdBTl9VTkNPTkZJR1VSRUQpeworCQlwcmludGsoS0VSTl9JTkZPICIlczogZmFpbGVkIHNkbGFtYWluIHNldHVwLCBidXN5IVxuIiwKKwkJCXdhbmRldi0+bmFtZSk7CisJCXJldHVybiAtRUJVU1k7CQkvKiBhbHJlYWR5IGNvbmZpZ3VyZWQgKi8KKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJcblByb2Nlc3NpbmcgV0FOIGRldmljZSAlcy4uLlxuIiwgd2FuZGV2LT5uYW1lKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGNvdW50ZXJzIGZvciBlYWNoIHdhbmRldiAKKwkgKiBVc2VkIGZvciBjb3VudGluZyBudW1iZXIgb2YgdGltZXMgbmV3X2lmIGFuZCAKKyAgICAgICAgICogZGVsX2lmIGdldCBjYWxsZWQuCisJICovCisJd2FuZGV2LT5kZWxfaWZfY250ID0gMDsKKwl3YW5kZXYtPm5ld19pZl9jbnQgPSAwOworCXdhbmRldi0+Y29uZmlnX2lkICA9IGNvbmYtPmNvbmZpZ19pZDsKKworCWlmICghY29uZi0+ZGF0YV9zaXplIHx8IChjb25mLT5kYXRhID09IE5VTEwpKSB7CisJCXByaW50ayhLRVJOX0lORk8KKwkJCSIlczogZmlybXdhcmUgbm90IGZvdW5kIGluIGNvbmZpZ3VyYXRpb24gZGF0YSFcbiIsCisJCQl3YW5kZXYtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDaGVjayBmb3IgcmVzb3VyY2UgY29uZmxpY3RzIGFuZCBzZXR1cCB0aGUKKwkgKiBjYXJkIGZvciBwaWdnaWJhY2tpbmcgaWYgbmVjZXNzYXJ5ICovCisJaWYoIWNvbmYtPlM1MTRfQ1BVX25vWzBdKSB7CisJCWlmICgoZXJyPWNoZWNrX3M1MDhfY29uZmxpY3RzKGNhcmQsY29uZiwmaXJxKSkgIT0gMCl7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfWVsc2UgeworCQlpZiAoKGVycj1jaGVja19zNTE0X2NvbmZsaWN0cyhjYXJkLGNvbmYsJmlycSkpICE9IDApeworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCS8qIElmIHRoZSBjdXJyZW50IGNhcmQgaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkCisgICAgICAgICAqIG9yIGl0J3MgYSBwaWdneWJhY2sgY2FyZCwgZG8gbm90IHRyeSB0byBhbGxvY2F0ZQorICAgICAgICAgKiByZXNvdXJjZXMuCisJICovCisJaWYgKCFjYXJkLT53YW5kZXYucGlnZ3liYWNrICYmICFjYXJkLT5jb25maWd1cmVkKXsKKworCQkvKiBDb25maWd1cmUgaGFyZHdhcmUsIGxvYWQgZmlybXdhcmUsIGV0Yy4gKi8KKwkJbWVtc2V0KCZjYXJkLT5odywgMCwgc2l6ZW9mKHNkbGFod190KSk7CisKKwkJLyogZm9yIGFuIFM1MTQgYWRhcHRlciwgcGFzcyB0aGUgQ1BVIG51bWJlciBhbmQgdGhlIHNsb3QgbnVtYmVyIHJlYWQgKi8KKwkJLyogZnJvbSAncm91dGVyLmNvbmYnIHRvIHRoZSAnc2RsYV9zZXR1cCgpJyBmdW5jdGlvbiB2aWEgdGhlICdwb3J0JyAqLworCQkvKiBwYXJhbWV0ZXIgKi8KKwkJaWYgKGNvbmYtPlM1MTRfQ1BVX25vWzBdKXsKKworCQkJY2FyZC0+aHcuUzUxNF9jcHVfbm9bMF0gPSBjb25mLT5TNTE0X0NQVV9ub1swXTsKKwkJCWNhcmQtPmh3LlM1MTRfc2xvdF9ubyA9IGNvbmYtPlBDSV9zbG90X25vOworCQkJY2FyZC0+aHcuYXV0b19wY2lfY2ZnID0gY29uZi0+YXV0b19wY2lfY2ZnOworCisJCQlpZiAoY2FyZC0+aHcuYXV0b19wY2lfY2ZnID09IFdBTk9QVF9ZRVMpeworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTZXR0aW5nIENQVSB0byAlYyBhbmQgU2xvdCB0byBBdXRvXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIGNhcmQtPmh3LlM1MTRfY3B1X25vWzBdKTsKKwkJCX1lbHNleworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTZXR0aW5nIENQVSB0byAlYyBhbmQgU2xvdCB0byAlaVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lLCBjYXJkLT5ody5TNTE0X2NwdV9ub1swXSwgY2FyZC0+aHcuUzUxNF9zbG90X25vKTsKKwkJCX0KKworCQl9ZWxzZXsKKwkJCS8qIDUwOCBDYXJkIGlvIHBvcnQgYW5kIGlycSBpbml0aWFsaXphdGlvbiAqLworCQkJY2FyZC0+aHcucG9ydCA9IGNvbmYtPmlvcG9ydDsKKwkJCWNhcmQtPmh3LmlycSA9IChjb25mLT5pcnEgPT0gOSkgPyAyIDogY29uZi0+aXJxOworCQl9CisKKworCQkvKiBDb21wdXRlIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGNhcmQgaW4ga2VybmVsIHNwYWNlICovCisJCWlmKGNvbmYtPm1hZGRyKXsKKwkJCWNhcmQtPmh3LmRwbWJhc2UgPSBwaHlzX3RvX3ZpcnQoY29uZi0+bWFkZHIpOworCQl9ZWxzZXsJCisJCQljYXJkLT5ody5kcG1iYXNlID0gKHZvaWQgKiljb25mLT5tYWRkcjsKKwkJfQorCQkJCisJCWNhcmQtPmh3LmRwbXNpemUgPSBTRExBX1dJTkRPV1NJWkU7CisJCQorCQkvKiBzZXQgdGhlIGFkYXB0ZXIgdHlwZSBpZiB1c2luZyBhbiBTNTE0IGFkYXB0ZXIgKi8KKwkJY2FyZC0+aHcudHlwZSA9IChjb25mLT5TNTE0X0NQVV9ub1swXSkgPyBTRExBX1M1MTQgOiBjb25mLT5od19vcHRbMF07IAorCQljYXJkLT5ody5wY2xrID0gY29uZi0+aHdfb3B0WzFdOworCisJCWVyciA9IHNkbGFfc2V0dXAoJmNhcmQtPmh3LCBjb25mLT5kYXRhLCBjb25mLT5kYXRhX3NpemUpOworCQlpZiAoZXJyKXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBIYXJkd2FyZSBzZXR1cCBGYWlsZWQgJWlcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCSAgICAgICAgaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpCisJCQlpcnEgPSAoY29uZi0+aXJxID09IDIpID8gOSA6IGNvbmYtPmlycTsgLyogSVJRMiAtPiBJUlE5ICovCisJCWVsc2UKKwkJCWlycSA9IGNhcmQtPmh3LmlycTsKKworCQkvKiByZXF1ZXN0IGFuIGludGVycnVwdCB2ZWN0b3IgLSBub3RlIHRoYXQgaW50ZXJydXB0cyBtYXkgYmUgc2hhcmVkICovCisJCS8qIHdoZW4gdXNpbmcgdGhlIFM1MTQgUENJIGFkYXB0ZXIgKi8KKwkJCisgICAgICAgCQlpZihyZXF1ZXN0X2lycShpcnEsIHNkbGFfaXNyLCAKKwkJICAgICAgKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KSA/IFNBX1NISVJRIDogMCwgCisJCSAgICAgICB3YW5kZXYtPm5hbWUsIGNhcmQpKXsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENhbid0IHJlc2VydmUgSVJRICVkIVxuIiwgd2FuZGV2LT5uYW1lLCBpcnEpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCX1lbHNleworCQlwcmludGsoS0VSTl9JTkZPICIlczogQ2FyZCBDb25maWd1cmVkICVsdSBvciBQaWdneWJhY2tpbmcgJWkhXG4iLAorCQkJd2FuZGV2LT5uYW1lLGNhcmQtPmNvbmZpZ3VyZWQsY2FyZC0+d2FuZGV2LnBpZ2d5YmFjayk7CisJfSAKKworCisJaWYgKCFjYXJkLT5jb25maWd1cmVkKXsKKworCQkvKiBJbml0aWFsaXplIHRoZSBTcGluIGxvY2sgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEluaXRpYWxpemluZyBmb3IgU01QXG4iLHdhbmRldi0+bmFtZSk7CisKKwkJLyogUGlnZ3liYWNrIHNwaW4gbG9jayBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLAorCQkgKiBpbiBjaGVja19zNTE0L3M1MDhfY29uZmxpY3RzKCkgKi8KKwkJaWYgKCFjYXJkLT53YW5kZXYucGlnZ3liYWNrKXsKKwkJCXNwaW5fbG9ja19pbml0KCZjYXJkLT53YW5kZXYubG9jayk7CisJCX0KKwkJCisJCS8qIEludGlhbGl6ZSBXQU4gZGV2aWNlIGRhdGEgc3BhY2UgKi8KKwkJd2FuZGV2LT5pcnEgICAgICAgPSBpcnE7CisJCXdhbmRldi0+ZG1hICAgICAgID0gMDsKKwkJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpeyAKKwkJCXdhbmRldi0+aW9wb3J0ID0gY2FyZC0+aHcucG9ydDsKKwkJfWVsc2V7CisJCQl3YW5kZXYtPlM1MTRfY3B1X25vWzBdID0gY2FyZC0+aHcuUzUxNF9jcHVfbm9bMF07CisJCQl3YW5kZXYtPlM1MTRfc2xvdF9ubyA9IGNhcmQtPmh3LlM1MTRfc2xvdF9ubzsKKwkJfQorCQl3YW5kZXYtPm1hZGRyICAgICA9ICh1bnNpZ25lZCBsb25nKWNhcmQtPmh3LmRwbWJhc2U7CisJCXdhbmRldi0+bXNpemUgICAgID0gY2FyZC0+aHcuZHBtc2l6ZTsKKwkJd2FuZGV2LT5od19vcHRbMF0gPSBjYXJkLT5ody50eXBlOworCQl3YW5kZXYtPmh3X29wdFsxXSA9IGNhcmQtPmh3LnBjbGs7CisJCXdhbmRldi0+aHdfb3B0WzJdID0gY2FyZC0+aHcubWVtb3J5OworCQl3YW5kZXYtPmh3X29wdFszXSA9IGNhcmQtPmh3LmZ3aWQ7CisJfQorCisJLyogUHJvdG9jb2wtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKi8KKwlzd2l0Y2ggKGNhcmQtPmh3LmZ3aWQpIHsKKworCWNhc2UgU0ZJRF9YMjVfNTAyOgorCWNhc2UgU0ZJRF9YMjVfNTA4OgorCQlwcmludGsoS0VSTl9JTkZPICIlczogU3RhcnRpbmcgWC4yNSBQcm90b2NvbCBJbml0LlxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJZXJyID0gd3B4X2luaXQoY2FyZCwgY29uZik7CisJCWJyZWFrOworCWNhc2UgU0ZJRF9GUjUwMjoKKwljYXNlIFNGSURfRlI1MDg6CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTdGFydGluZyBGcmFtZSBSZWxheSBQcm90b2NvbCBJbml0LlxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJZXJyID0gd3BmX2luaXQoY2FyZCwgY29uZik7CisJCWJyZWFrOworCWNhc2UgU0ZJRF9QUFA1MDI6CisJY2FzZSBTRklEX1BQUDUwODoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN0YXJ0aW5nIFBQUCBQcm90b2NvbCBJbml0LlxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJZXJyID0gd3BwX2luaXQoY2FyZCwgY29uZik7CisJCWJyZWFrOworCQkKKwljYXNlIFNGSURfQ0hETEM1MDg6CisJY2FzZSBTRklEX0NIRExDNTE0OgorCQlpZiAoY29uZi0+ZnQxKXsJCQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN0YXJ0aW5nIEZUMSBDU1UvRFNVIENvbmZpZyBEcml2ZXIuXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJZXJyID0gd3BmdDFfaW5pdChjYXJkLCBjb25mKTsKKwkJCWJyZWFrOworCQkJCisJCX1lbHNlIGlmIChjb25mLT5jb25maWdfaWQgPT0gV0FOQ09ORklHX01QUFApeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN0YXJ0aW5nIE11bHRpLVBvcnQgUFBQIFByb3RvY29sIEluaXQuXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCWVyciA9IHdzcHBwX2luaXQoY2FyZCxjb25mKTsKKwkJCWJyZWFrOworCisJCX1lbHNleworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFN0YXJ0aW5nIENIRExDIFByb3RvY29sIEluaXQuXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCWVyciA9IHdwY19pbml0KGNhcmQsIGNvbmYpOworCQkJYnJlYWs7CisJCX0KKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICIlczogRXJyb3IsIEZpcm13YXJlIGlzIG5vdCBzdXBwb3J0ZWQgJVggJVghXG4iLAorCQkJd2FuZGV2LT5uYW1lLGNhcmQtPmh3LmZ3aWQsU0ZJRF9DSERMQzUwOCk7CisJCWVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7CisJfQorCisJaWYgKGVyciAhPSAwKXsKKwkJaWYgKGVyciA9PSAtRVBST1RPTk9TVVBQT1JUKXsKKwkJCXByaW50ayhLRVJOX0lORk8gCisJCQkJIiVzOiBFcnJvciwgUHJvdG9jb2wgc2VsZWN0ZWQgaGFzIG5vdCBiZWVuIGNvbXBpbGVkIVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlwcmludGsoS0VSTl9JTkZPIAorCQkJCSIlczogICAgICAgIFJlLWNvbmZpZ3VyZSB0aGUga2VybmVsIGFuZCByZS1idWlsZCB0aGUgbW9kdWxlcyFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUpOworCQl9CisJCQorCQlyZWxlYXNlX2h3KGNhcmQpOworCQl3YW5kZXYtPnN0YXRlID0gV0FOX1VOQ09ORklHVVJFRDsKKwkJcmV0dXJuIGVycjsKKwl9CisKKworICAJLyogUmVzZXJ2ZSBJL08gcmVnaW9uIGFuZCBzY2hlZHVsZSBiYWNrZ3JvdW5kIHRhc2sgKi8KKyAgICAgICAgaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQgJiYgIWNhcmQtPndhbmRldi5waWdneWJhY2spCisJCWlmICghcmVxdWVzdF9yZWdpb24oY2FyZC0+aHcucG9ydCwgY2FyZC0+aHcuaW9fcmFuZ2UsIAorCQkJCXdhbmRldi0+bmFtZSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInBvcnQgMHglMDR4IGJ1c3lcbiIsIGNhcmQtPmh3LnBvcnQpOworCQkJcmVsZWFzZV9odyhjYXJkKTsKKwkJCXdhbmRldi0+c3RhdGUgPSBXQU5fVU5DT05GSUdVUkVEOworCQkJcmV0dXJuIC1FQlVTWTsKKwkgIH0KKworCS8qIE9ubHkgdXNlIHRoZSBwb2xsaW5nIHJvdXRpbmUgZm9yIHRoZSBYMjUgcHJvdG9jb2wgKi8KKwkKKwljYXJkLT53YW5kZXYuY3JpdGljYWw9MDsKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisgKiBjb25maWd1cmVfczUwOF9jYXJkCisgKiAKKyAqIEZvciBhIFM1MDggYWRhcHRlciwgY2hlY2sgZm9yIGEgcG9zc2libGUgY29uZmlndXJhdGlvbiBlcnJvciBpbiB0aGF0CisgKiB3ZSBhcmUgbG9hZGluZyBhbiBhZGFwdGVyIGluIHRoZSBzYW1lIElPIHBvcnQgYXMgYSBwcmV2aW91c2x5IGxvYWRlZCBTNTA4CisgKiBjYXJkLgorICovIAorCitzdGF0aWMgaW50IGNoZWNrX3M1MDhfY29uZmxpY3RzIChzZGxhX3QqIGNhcmQsd2FuZGV2X2NvbmZfdCogY29uZiwgaW50ICppcnEpCit7CisJdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M7CisJaW50IGk7CisJCisJaWYgKGNvbmYtPmlvcG9ydCA8PSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8KKwkJIiVzOiBjYW4ndCBjb25maWd1cmUgd2l0aG91dCBJL08gcG9ydCBhZGRyZXNzIVxuIiwKKwkJY2FyZC0+d2FuZGV2Lm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY29uZi0+aXJxIDw9IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNhbid0IGNvbmZpZ3VyZSB3aXRob3V0IElSUSFcbiIsCisJCWNhcmQtPndhbmRldi5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHRlc3RfYml0KDAsJmNhcmQtPmNvbmZpZ3VyZWQpKQorCQlyZXR1cm4gMDsKKworCisJLyogQ2hlY2sgZm9yIGFscmVhZHkgbG9hZGVkIGNhcmQgd2l0aCB0aGUgc2FtZSBJTyBwb3J0IGFuZCBJUlEgCisJICogSWYgZm91bmQsIGNvcHkgaXRzIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gYW5kIHVzZSBpdHMKKwkgKiByZXNvdXJjZXMgKGkuZS4gcGlnZ3liYWNraW5nKQorCSAqLworCQorCWZvciAoaSA9IDA7IGkgPCBuY2FyZHM7IGkrKykgeworCQlzZGxhX3QgKm54dF9jYXJkID0gJmNhcmRfYXJyYXlbaV07CisKKwkJLyogU2tpcCB0aGUgY3VycmVudCBjYXJkIHB0ciAqLworCQlpZiAobnh0X2NhcmQgPT0gY2FyZCkJCisJCQljb250aW51ZTsKKworCisJCS8qIEZpbmQgYSBjYXJkIHRoYXQgaXMgYWxyZWFkeSBjb25maWd1cmVkIHdpdGggdGhlCisJCSAqIHNhbWUgSU8gUG9ydCAqLworCQlpZiAoKG54dF9jYXJkLT5ody50eXBlID09IFNETEFfUzUwOCkgJiYKKwkJICAgIChueHRfY2FyZC0+aHcucG9ydCA9PSBjb25mLT5pb3BvcnQpICYmIAorCQkgICAgKG54dF9jYXJkLT5uZXh0ID09IE5VTEwpKXsKKwkJCQorCQkJLyogV2UgZm91bmQgYSBjYXJkIHRoZSBjYXJkIHRoYXQgaGFzIHNhbWUgY29uZmlndXJhdGlvbgorCQkJICogYXMgdXMuIFRoaXMgbWVhbnMsIHRoYXQgd2UgbXVzdCBzZXR1cCB0aGlzIGNhcmQgaW4gCisJCQkgKiBwaWdnaWJhY2tpbmcgbW9kZS4gSG93ZXZlciwgb25seSBDSERMQyBhbmQgTVBQUCBwcm90b2NvbAorCQkJICogc3VwcG9ydCB0aGlzIHNldHVwICovCisJCQorCQkJaWYgKChjb25mLT5jb25maWdfaWQgPT0gV0FOQ09ORklHX0NIRExDIHx8IAorCQkJICAgICBjb25mLT5jb25maWdfaWQgPT0gV0FOQ09ORklHX01QUFApICYmCisJCQkgICAgKG54dF9jYXJkLT53YW5kZXYuY29uZmlnX2lkID09IFdBTkNPTkZJR19DSERMQyB8fCAKKwkJCSAgICAgbnh0X2NhcmQtPndhbmRldi5jb25maWdfaWQgPT0gV0FOQ09ORklHX01QUFApKXsgCisJCQkJCisJCQkJKmlycSA9IG54dF9jYXJkLT5ody5pcnE7CisJCQkJbWVtY3B5KCZjYXJkLT5odywgJm54dF9jYXJkLT5odywgc2l6ZW9mKHNkbGFod190KSk7CisJCQkKKwkJCQkvKiBUaGUgbWFzdGVyIGNvdWxkIGFscmVhZHkgYmUgcnVubmluZywgd2UgbXVzdAorCQkJCSAqIHNldCB0aGlzIGFzIGEgY3JpdGljYWwgYXJlYSAqLworCQkJCWxvY2tfYWRhcHRlcl9pcnEoJm54dF9jYXJkLT53YW5kZXYubG9jaywgJnNtcF9mbGFncyk7CisKKwkJCQlueHRfY2FyZC0+bmV4dCA9IGNhcmQ7CisJCQkJY2FyZC0+bmV4dCA9IG54dF9jYXJkOworCisJCQkJY2FyZC0+d2FuZGV2LnBpZ2d5YmFjayA9IFdBTk9QVF9ZRVM7CisKKwkJCQkvKiBXZSBtdXN0IGluaXRpYWxpc2UgdGhlIHBpZ2dpYmFjayBzcGluIGxvY2sgaGVyZQorCQkJCSAqIHNpbmNlIGlzciB3aWxsIHRyeSB0byBsb2NrIGNhcmQtPm5leHQgaWYgaXQKKwkJCQkgKiBleGlzdHMgKi8KKwkJCQlzcGluX2xvY2tfaW5pdCgmY2FyZC0+d2FuZGV2LmxvY2spOworCQkJCQorCQkJCXVubG9ja19hZGFwdGVyX2lycSgmbnh0X2NhcmQtPndhbmRldi5sb2NrLCAmc21wX2ZsYWdzKTsKKwkJCQlicmVhazsKKwkJCX1lbHNleworCQkJCS8qIFRyeWluZyB0byBydW4gcGlnZ2liYWNraW5nIHdpdGggYSB3cm9uZyBwcm90b2NvbCAqLworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFUlJPUjogUmVzb3VyY2UgYnVzeSwgaW9wb3J0OiAweCV4XG4iCisJCQkJCQkgIiVzOiAgICAgICAgVGhpcyBwcm90b2NvbCBkb2Vzbid0IHN1cHBvcnRcbiIKKwkJCQkJCSAiJXM6ICAgICAgICBtdWx0aS1wb3J0IG9wZXJhdGlvbiFcbiIsCisJCQkJCQkgY2FyZC0+ZGV2bmFtZSxueHRfY2FyZC0+aHcucG9ydCwKKwkJCQkJCSBjYXJkLT5kZXZuYW1lLGNhcmQtPmRldm5hbWUpOworCQkJCXJldHVybiAtRUVYSVNUOworCQkJfQorCQl9CisJfQorCQorCisJLyogTWFrZSBzdXJlIEkvTyBwb3J0IHJlZ2lvbiBpcyBhdmFpbGFibGUgb25seSBpZiB3ZSBhcmUgdGhlCisJICogbWFzdGVyIGRldmljZS4gIElmIHdlIGFyZSBydW5uaW5nIGluIHBpZ2d5YmFja2luZyBtb2RlLCAKKwkgKiB3ZSB3aWxsIHVzZSB0aGUgcmVzb3VyY2VzIG9mIHRoZSBtYXN0ZXIgY2FyZC4gKi8KKwlpZiAoIWNhcmQtPndhbmRldi5waWdneWJhY2spIHsKKwkJc3RydWN0IHJlc291cmNlICpyciA9CisJCQlyZXF1ZXN0X3JlZ2lvbihjb25mLT5pb3BvcnQsIFNETEFfTUFYSU9SQU5HRSwgInNkbGFtYWluIik7CisJCXJlbGVhc2VfcmVnaW9uKGNvbmYtPmlvcG9ydCwgU0RMQV9NQVhJT1JBTkdFKTsKKworCQlpZiAoIXJyKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJIiVzOiBJL08gcmVnaW9uIDB4JVggLSAweCVYIGlzIGluIHVzZSFcbiIsCisJCQkJY2FyZC0+d2FuZGV2Lm5hbWUsIGNvbmYtPmlvcG9ydCwKKwkJCQljb25mLT5pb3BvcnQgKyBTRExBX01BWElPUkFOR0UgLSAxKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICogY29uZmlndXJlX3M1MTRfY2FyZAorICogCisgKiBGb3IgYSBTNTE0IGFkYXB0ZXIsIGNoZWNrIGZvciBhIHBvc3NpYmxlIGNvbmZpZ3VyYXRpb24gZXJyb3IgaW4gdGhhdAorICogd2UgYXJlIGxvYWRpbmcgYW4gYWRhcHRlciBpbiB0aGUgc2FtZSBzbG90IGFzIGEgcHJldmlvdXNseSBsb2FkZWQgUzUxNAorICogY2FyZC4KKyAqLyAKKworCitzdGF0aWMgaW50IGNoZWNrX3M1MTRfY29uZmxpY3RzKHNkbGFfdCogY2FyZCx3YW5kZXZfY29uZl90KiBjb25mLCBpbnQgKmlycSkKK3sKKwl1bnNpZ25lZCBsb25nIHNtcF9mbGFnczsKKwlpbnQgaTsKKwkKKwlpZiAodGVzdF9iaXQoMCwmY2FyZC0+Y29uZmlndXJlZCkpCisJCXJldHVybiAwOworCisJCisJLyogQ2hlY2sgZm9yIGFscmVhZHkgbG9hZGVkIGNhcmQgd2l0aCB0aGUgc2FtZSBJTyBwb3J0IGFuZCBJUlEgCisJICogSWYgZm91bmQsIGNvcHkgaXRzIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gYW5kIHVzZSBpdHMKKwkgKiByZXNvdXJjZXMgKGkuZS4gcGlnZ3liYWNraW5nKQorCSAqLworCisJZm9yIChpID0gMDsgaSA8IG5jYXJkczsgaSArKykgeworCQorCQlzZGxhX3QqIG54dF9jYXJkID0gJmNhcmRfYXJyYXlbaV07CisJCWlmKG54dF9jYXJkID09IGNhcmQpCisJCQljb250aW51ZTsKKwkJCisJCWlmKChueHRfY2FyZC0+aHcudHlwZSA9PSBTRExBX1M1MTQpICYmCisJCSAgIChueHRfY2FyZC0+aHcuUzUxNF9zbG90X25vID09IGNvbmYtPlBDSV9zbG90X25vKSAmJgorCQkgICAobnh0X2NhcmQtPmh3LlM1MTRfY3B1X25vWzBdID09IGNvbmYtPlM1MTRfQ1BVX25vWzBdKSYmCisJCSAgIChueHRfY2FyZC0+bmV4dCA9PSBOVUxMKSl7CisKKworCQkJaWYgKChjb25mLT5jb25maWdfaWQgPT0gV0FOQ09ORklHX0NIRExDIHx8IAorCQkJICAgICBjb25mLT5jb25maWdfaWQgPT0gV0FOQ09ORklHX01QUFApICYmCisJCQkgICAgKG54dF9jYXJkLT53YW5kZXYuY29uZmlnX2lkID09IFdBTkNPTkZJR19DSERMQyB8fCAKKwkJCSAgICAgbnh0X2NhcmQtPndhbmRldi5jb25maWdfaWQgPT0gV0FOQ09ORklHX01QUFApKXsgCisJCQkJCisJCQkJKmlycSA9IG54dF9jYXJkLT5ody5pcnE7CisJCQkJbWVtY3B5KCZjYXJkLT5odywgJm54dF9jYXJkLT5odywgc2l6ZW9mKHNkbGFod190KSk7CisJCisJCQkJLyogVGhlIG1hc3RlciBjb3VsZCBhbHJlYWR5IGJlIHJ1bm5pbmcsIHdlIG11c3QKKwkJCQkgKiBzZXQgdGhpcyBhcyBhIGNyaXRpY2FsIGFyZWEgKi8KKwkJCQlsb2NrX2FkYXB0ZXJfaXJxKCZueHRfY2FyZC0+d2FuZGV2LmxvY2ssJnNtcF9mbGFncyk7CisJCQkJbnh0X2NhcmQtPm5leHQgPSBjYXJkOworCQkJCWNhcmQtPm5leHQgPSBueHRfY2FyZDsKKworCQkJCWNhcmQtPndhbmRldi5waWdneWJhY2sgPSBXQU5PUFRfWUVTOworCisJCQkJLyogV2UgbXVzdCBpbml0aWFsaXNlIHRoZSBwaWdnaWJhY2sgc3BpbiBsb2NrIGhlcmUKKwkJCQkgKiBzaW5jZSBpc3Igd2lsbCB0cnkgdG8gbG9jayBjYXJkLT5uZXh0IGlmIGl0CisJCQkJICogZXhpc3RzICovCisJCQkJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPndhbmRldi5sb2NrKTsKKworCQkJCXVubG9ja19hZGFwdGVyX2lycSgmbnh0X2NhcmQtPndhbmRldi5sb2NrLCZzbXBfZmxhZ3MpOworCisJCQl9ZWxzZXsKKwkJCQkvKiBUcnlpbmcgdG8gcnVuIHBpZ2dpYmFja2luZyB3aXRoIGEgd3JvbmcgcHJvdG9jb2wgKi8KKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogRVJST1I6IFJlc291cmNlIGJ1c3k6IENQVSAlYyBQQ0lTTE9UICVpXG4iCisJCQkJCQkgIiVzOiAgICAgICAgVGhpcyBwcm90b2NvbCBkb2Vzbid0IHN1cHBvcnRcbiIKKwkJCQkJCSAiJXM6ICAgICAgICBtdWx0aS1wb3J0IG9wZXJhdGlvbiFcbiIsCisJCQkJCQkgY2FyZC0+ZGV2bmFtZSwKKwkJCQkJCSBjb25mLT5TNTE0X0NQVV9ub1swXSxjb25mLT5QQ0lfc2xvdF9ubywKKwkJCQkJCSBjYXJkLT5kZXZuYW1lLGNhcmQtPmRldm5hbWUpOworCQkJCXJldHVybiAtRUVYSVNUOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNodXQgZG93biBXQU4gbGluayBkcml2ZXIuIAorICogbyBzaHV0IGRvd24gYWRhcHRlciBoYXJkd2FyZQorICogbyByZWxlYXNlIHN5c3RlbSByZXNvdXJjZXMuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHJvdXRlciB3aGVuIGRldmljZSBpcyBiZWluZyB1bnJlZ2lzdGVyZWQgb3IKKyAqIHdoZW4gaXQgaGFuZGxlcyBST1VURVJfRE9XTiBJT0NUTC4KKyAqLworc3RhdGljIGludCBzaHV0ZG93bihzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2KQoreworCXNkbGFfdCAqY2FyZDsKKwlpbnQgZXJyPTA7CisJCisJLyogc2FuaXR5IGNoZWNrcyAqLworCWlmICgod2FuZGV2ID09IE5VTEwpIHx8ICh3YW5kZXYtPnByaXZhdGUgPT0gTlVMTCkpeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJCQorCWlmICh3YW5kZXYtPnN0YXRlID09IFdBTl9VTkNPTkZJR1VSRUQpeworCQlyZXR1cm4gMDsKKwl9CisKKwljYXJkID0gd2FuZGV2LT5wcml2YXRlOworCisJaWYgKGNhcmQtPnR0eV9vcHQpeworCQlpZiAoY2FyZC0+dHR5X29wZW4peworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiJXM6IFNodXRkb3duIEZhaWxlZDogVFRZIGlzIHN0aWxsIG9wZW5cbiIsCisJCQkJICBjYXJkLT5kZXZuYW1lKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisJCisJd2FuZGV2LT5zdGF0ZSA9IFdBTl9VTkNPTkZJR1VSRUQ7CisKKwlzZXRfYml0KFBFUklfQ1JJVCwodm9pZCopJndhbmRldi0+Y3JpdGljYWwpOworCQorCS8qIEluIGNhc2Ugb2YgcGlnZ2liYWNraW5nLCBtYWtlIHN1cmUgdGhhdCAKKyAgICAgICAgICogd2UgbmV2ZXIgdHJ5IHRvIHNodXRkb3duIGJvdGggZGV2aWNlcyBhdCB0aGUgc2FtZQorICAgICAgICAgKiB0aW1lLCBiZWNhdXNlIHRoZXkgZGVwZW5kIG9uIG9uZSBhbm90aGVyICovCisJCisJaWYgKGNhcmQtPmRpc2FibGVfY29tbSl7CisJCWNhcmQtPmRpc2FibGVfY29tbShjYXJkKTsKKwl9CisKKwkvKiBSZWxlYXNlIFJlc291cmNlcyAqLworCXJlbGVhc2VfaHcoY2FyZCk7CisKKyAgICAgICAgLyogb25seSBmcmVlIHRoZSBhbGxvY2F0ZWQgSS9PIHJhbmdlIGlmIG5vdCBhbiBTNTE0IGFkYXB0ZXIgKi8KKwlpZiAod2FuZGV2LT5od19vcHRbMF0gIT0gU0RMQV9TNTE0ICYmICFjYXJkLT5jb25maWd1cmVkKXsKKyAgICAgICAgICAgICAgCXJlbGVhc2VfcmVnaW9uKGNhcmQtPmh3LnBvcnQsIGNhcmQtPmh3LmlvX3JhbmdlKTsKKwl9CisKKwlpZiAoIWNhcmQtPmNvbmZpZ3VyZWQpeworCQltZW1zZXQoJmNhcmQtPmh3LCAwLCBzaXplb2Yoc2RsYWh3X3QpKTsKKwkgICAgICAJaWYgKGNhcmQtPm5leHQpeworCQkJbWVtc2V0KCZjYXJkLT5uZXh0LT5odywgMCwgc2l6ZW9mKHNkbGFod190KSk7CisJCX0KKwl9CisJCisKKwljbGVhcl9iaXQoUEVSSV9DUklULCh2b2lkKikmd2FuZGV2LT5jcml0aWNhbCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9odyAoc2RsYV90ICpjYXJkKQoreworCXNkbGFfdCAqbnh0X2NhcmQ7CisKKwkKKwkvKiBDaGVjayBpZiBuZXh0IGRldmljZSBleGlzdHMgKi8KKwlpZiAoY2FyZC0+bmV4dCl7CisJCW54dF9jYXJkID0gY2FyZC0+bmV4dDsKKwkJLyogSWYgbmV4dCBkZXZpY2UgaXMgZG93biB0aGVuIHJlbGVhc2UgcmVzb3VyY2VzICovCisJCWlmIChueHRfY2FyZC0+d2FuZGV2LnN0YXRlID09IFdBTl9VTkNPTkZJR1VSRUQpeworCQkJaWYgKGNhcmQtPndhbmRldi5waWdneWJhY2speworCQkJCS8qIElmIHRoaXMgZGV2aWNlIGlzIHBpZ2d5YmFjayB0aGVuIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbmZvcm1hdGlvbiBvZiB0aGUgbWFzdGVyIGRldmljZSAKKwkJCQkgKi8KKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogUGlnZ3liYWNrIHNodXR0aW5nIGRvd25cbiIsY2FyZC0+ZGV2bmFtZSk7CisJCQkJc2RsYV9kb3duKCZjYXJkLT5uZXh0LT5odyk7CisgICAgICAgCQkJCWZyZWVfaXJxKGNhcmQtPndhbmRldi5pcnEsIGNhcmQtPm5leHQpOworCQkJCWNhcmQtPmNvbmZpZ3VyZWQgPSAwOworCQkJCWNhcmQtPm5leHQtPmNvbmZpZ3VyZWQgPSAwOworCQkJCWNhcmQtPndhbmRldi5waWdneWJhY2sgPSAwOworCQkJfWVsc2V7CisJCQkJLyogTWFzdGVyIGRldmljZSBzaHV0dGluZyBkb3duICovCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1hc3RlciBzaHV0dGluZyBkb3duXG4iLGNhcmQtPmRldm5hbWUpOworCQkJCXNkbGFfZG93bigmY2FyZC0+aHcpOworCQkJCWZyZWVfaXJxKGNhcmQtPndhbmRldi5pcnEsIGNhcmQpOworCQkJCWNhcmQtPmNvbmZpZ3VyZWQgPSAwOworCQkJCWNhcmQtPm5leHQtPmNvbmZpZ3VyZWQgPSAwOworCQkJfQorCQl9ZWxzZXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBEZXZpY2Ugc3RpbGwgcnVubmluZyAlaVxuIiwKKwkJCQlueHRfY2FyZC0+ZGV2bmFtZSxueHRfY2FyZC0+d2FuZGV2LnN0YXRlKTsKKworCQkJY2FyZC0+Y29uZmlndXJlZCA9IDE7CisJCX0KKwl9ZWxzZXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1hc3RlciBzaHV0dGluZyBkb3duXG4iLGNhcmQtPmRldm5hbWUpOworCQlzZGxhX2Rvd24oJmNhcmQtPmh3KTsKKyAgICAgICAJCWZyZWVfaXJxKGNhcmQtPndhbmRldi5pcnEsIGNhcmQpOworCQljYXJkLT5jb25maWd1cmVkID0gMDsKKwl9CisJcmV0dXJuOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRHJpdmVyIEkvTyBjb250cm9sLiAKKyAqIG8gdmVyaWZ5IGFyZ3VtZW50cworICogbyBwZXJmb3JtIHJlcXVlc3RlZCBhY3Rpb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHJvdXRlciBoYW5kbGVzIG9uZSBvZiB0aGUgcmVzZXJ2ZWQgdXNlcgorICogSU9DVExzLiAgTm90ZSB0aGF0ICdhcmcnIHN0aWwgcG9pbnRzIHRvIHVzZXIgYWRkcmVzcyBzcGFjZS4KKyAqLworc3RhdGljIGludCBpb2N0bChzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2LCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXNkbGFfdCogY2FyZDsKKwlpbnQgZXJyOworCisJLyogc2FuaXR5IGNoZWNrcyAqLworCWlmICgod2FuZGV2ID09IE5VTEwpIHx8ICh3YW5kZXYtPnByaXZhdGUgPT0gTlVMTCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICh3YW5kZXYtPnN0YXRlID09IFdBTl9VTkNPTkZJR1VSRUQpCisJCXJldHVybiAtRU5PREVWOworCisJY2FyZCA9IHdhbmRldi0+cHJpdmF0ZTsKKworCWlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KXsKKwkJZGlzYWJsZV9pcnEoY2FyZC0+aHcuaXJxKTsKKwl9CisKKwlpZiAodGVzdF9iaXQoU0VORF9DUklULCAodm9pZCopJndhbmRldi0+Y3JpdGljYWwpKSB7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwkKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0FOUElQRV9EVU1QOgorCQllcnIgPSBpb2N0bF9kdW1wKHdhbmRldi0+cHJpdmF0ZSwgKHZvaWQqKWFyZyk7CisJCWJyZWFrOworCisJY2FzZSBXQU5QSVBFX0VYRUM6CisJCWVyciA9IGlvY3RsX2V4ZWMod2FuZGV2LT5wcml2YXRlLCAodm9pZCopYXJnLCBjbWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCX0KKyAKKwlyZXR1cm4gZXJyOworfQorCisvKioqKioqIERyaXZlciBJT0NUTCBIYW5kbGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEdW1wIGFkYXB0ZXIgbWVtb3J5IHRvIHVzZXIgYnVmZmVyLgorICogbyB2ZXJpZnkgcmVxdWVzdCBzdHJ1Y3R1cmUKKyAqIG8gY29weSByZXF1ZXN0IHN0cnVjdHVyZSB0byBrZXJuZWwgZGF0YSBzcGFjZQorICogbyB2ZXJpZnkgbGVuZ3RoL29mZnNldAorICogbyB2ZXJpZnkgdXNlciBidWZmZXIKKyAqIG8gY29weSBhZGFwdGVyIG1lbW9yeSBpbWFnZSB0byB1c2VyIGJ1ZmZlcgorICoKKyAqIE5vdGU6IHdoZW4gZHVtcGluZyBtZW1vcnksIHRoaXMgcm91dGluZSBzd2l0Y2hlcyBjdXJlbnQgZHVhbC1wb3J0IG1lbW9yeQorICoJIHZlY3Rvciwgc28gY2FyZSBtdXN0IGJlIHRha2VuIHRvIGF2b2lkIHJhY2luZyBjb25kaXRpb25zLgorICovCitzdGF0aWMgaW50IGlvY3RsX2R1bXAgKHNkbGFfdCogY2FyZCwgc2RsYV9kdW1wX3QqIHVfZHVtcCkKK3sKKwlzZGxhX2R1bXBfdCBkdW1wOworCXVuc2lnbmVkIHdpbnNpemU7CisJdW5zaWduZWQgbG9uZyBvbGR2ZWM7CS8qIERQTSB3aW5kb3cgdmVjdG9yICovCisJdW5zaWduZWQgbG9uZyBzbXBfZmxhZ3M7CisJaW50IGVyciA9IDA7CisKKwlpZihjb3B5X2Zyb21fdXNlcigodm9pZCopJmR1bXAsICh2b2lkKil1X2R1bXAsIHNpemVvZihzZGxhX2R1bXBfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkJCisJaWYgKChkdW1wLm1hZ2ljICE9IFdBTlBJUEVfTUFHSUMpIHx8CisJICAgIChkdW1wLm9mZnNldCArIGR1bXAubGVuZ3RoID4gY2FyZC0+aHcubWVtb3J5KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJCisJd2luc2l6ZSA9IGNhcmQtPmh3LmRwbXNpemU7CisKKwlpZihjYXJkLT5ody50eXBlICE9IFNETEFfUzUxNCkgeworCisJCWxvY2tfYWRhcHRlcl9pcnEoJmNhcmQtPndhbmRldi5sb2NrLCAmc21wX2ZsYWdzKTsKKwkJCisgICAgICAgICAgICAgICAgb2xkdmVjID0gY2FyZC0+aHcudmVjdG9yOworICAgICAgICAgICAgICAgIHdoaWxlIChkdW1wLmxlbmd0aCkgeworCQkJLyogY3VycmVudCBvZmZzZXQgKi8JCQkJCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBwb3MgPSBkdW1wLm9mZnNldCAlIHdpbnNpemU7CisJCQkvKiBjdXJyZW50IHZlY3RvciAqLworICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB2ZWMgPSBkdW1wLm9mZnNldCAtIHBvczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbiA9IChkdW1wLmxlbmd0aCA+ICh3aW5zaXplIC0gcG9zKSkgPworICAgICAgICAgICAgICAgICAgICAgICAgCSh3aW5zaXplIC0gcG9zKSA6IGR1bXAubGVuZ3RoOworCQkJLyogcmVsb2NhdGUgd2luZG93ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2RsYV9tYXBtZW0oJmNhcmQtPmh3LCB2ZWMpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gLUVJTzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvcHlfdG9fdXNlcigodm9pZCAqKWR1bXAucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTggKiljYXJkLT5ody5kcG1iYXNlICsgcG9zLCBsZW4pKXsgCisJCQkJCisJCQkJdW5sb2NrX2FkYXB0ZXJfaXJxKCZjYXJkLT53YW5kZXYubG9jaywgJnNtcF9mbGFncyk7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1bXAubGVuZ3RoICAgICAtPSBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICBkdW1wLm9mZnNldCAgICAgKz0gbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgZHVtcC5wdHIgICAgICAgICA9IChjaGFyKilkdW1wLnB0ciArIGxlbjsKKyAgICAgICAgICAgICAgICB9CisJCQorICAgICAgICAgICAgICAgIHNkbGFfbWFwbWVtKCZjYXJkLT5odywgb2xkdmVjKTsvKiByZXN0b3JlIERQTSB3aW5kb3cgcG9zaXRpb24gKi8KKwkJdW5sb2NrX2FkYXB0ZXJfaXJxKCZjYXJkLT53YW5kZXYubG9jaywgJnNtcF9mbGFncyk7CisgICAgICAgIAorCX1lbHNlIHsKKworICAgICAgICAgICAgICAgaWYoY29weV90b191c2VyKCh2b2lkICopZHVtcC5wdHIsCisJCQkgICAgICAgKHU4ICopY2FyZC0+aHcuZHBtYmFzZSArIGR1bXAub2Zmc2V0LCBkdW1wLmxlbmd0aCkpeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEV4ZWN1dGUgYWRhcHRlciBmaXJtd2FyZSBjb21tYW5kLgorICogbyB2ZXJpZnkgcmVxdWVzdCBzdHJ1Y3R1cmUKKyAqIG8gY29weSByZXF1ZXN0IHN0cnVjdHVyZSB0byBrZXJuZWwgZGF0YSBzcGFjZQorICogbyBjYWxsIHByb3RvY29sLXNwZWNpZmljICdleGVjJyBmdW5jdGlvbgorICovCitzdGF0aWMgaW50IGlvY3RsX2V4ZWMgKHNkbGFfdCogY2FyZCwgc2RsYV9leGVjX3QqIHVfZXhlYywgaW50IGNtZCkKK3sKKwlzZGxhX2V4ZWNfdCBleGVjOworCWludCBlcnI9MDsKKworCWlmIChjYXJkLT5leGVjID09IE5VTEwgJiYgY21kID09IFdBTlBJUEVfRVhFQyl7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmKGNvcHlfZnJvbV91c2VyKCh2b2lkKikmZXhlYywgKHZvaWQqKXVfZXhlYywgc2l6ZW9mKHNkbGFfZXhlY190KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKChleGVjLm1hZ2ljICE9IFdBTlBJUEVfTUFHSUMpIHx8IChleGVjLmNtZCA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFdBTlBJUEVfRVhFQzoJCisJCQllcnIgPSBjYXJkLT5leGVjKGNhcmQsIGV4ZWMuY21kLCBleGVjLmRhdGEpOworCQkJYnJlYWs7CisJfQkKKwlyZXR1cm4gZXJyOworfQorCisvKioqKioqKiBNaXNjZWxsYW5lb3VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTRExBIEludGVycnVwdCBTZXJ2aWNlIFJvdXRpbmUuCisgKiBvIGFja25vd2xlZGdlIFNETEEgaGFyZHdhcmUgaW50ZXJydXB0LgorICogbyBjYWxsIHByb3RvY29sLXNwZWNpZmljIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUsIGlmIGFueS4KKyAqLworU1RBVElDIGlycXJldHVybl90IHNkbGFfaXNyIChpbnQgaXJxLCB2b2lkKiBkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2RlZmluZQljYXJkCSgoc2RsYV90KilkZXZfaWQpCisKKwlpZihjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCkgewkvKiBoYW5kbGUgaW50ZXJycnVwdCBvbiBTNTE0ICovCisgICAgICAgICAgICAgICAgdTMyIGludF9zdGF0dXM7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBDUFVfbm8gPSBjYXJkLT5ody5TNTE0X2NwdV9ub1swXTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGNhcmRfZm91bmRfZm9yX0lSUTsKKwkJdTggSVJRX2NvdW50ID0gMDsKKworCQlmb3IoOzspIHsKKworCQkJcmVhZF9TNTE0X2ludF9zdGF0KCZjYXJkLT5odywgJmludF9zdGF0dXMpOworCisJCQkvKiBjaGVjayBpZiB0aGUgaW50ZXJydXB0IGlzIGZvciB0aGlzIGRldmljZSAqLworIAkJCWlmKCEoKHVuc2lnbmVkIGNoYXIpaW50X3N0YXR1cyAmCisJCQkJKElSUV9DUFVfQSB8IElSUV9DUFVfQikpKQorICAgICAgICAgICAgICAgIAkgICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKKworCQkJLyogaWYgdGhlIElSUSBpcyBmb3IgYm90aCBDUFVzIG9uIHRoZSBzYW1lIGFkYXB0ZXIsICovCisJCQkvKiB0aGVuIGFsdGVyIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIHNvIGFzIHRvIGhhbmRsZSAqLworCQkJLyogb25lIENQVSBhdCBhIHRpbWUgKi8KKwkJCWlmKCgodW5zaWduZWQgY2hhcilpbnRfc3RhdHVzICYgKElSUV9DUFVfQSB8IElSUV9DUFVfQikpCisJCQkJPT0gKElSUV9DUFVfQSB8IElSUV9DUFVfQikpIHsKKwkJCQlpbnRfc3RhdHVzICY9IChDUFVfbm8gPT0gUzUxNF9DUFVfQSkgPworCQkJCQl+SVJRX0NQVV9CIDogfklSUV9DUFVfQTsKKwkJCX0KKyAKKwkJCWNhcmRfZm91bmRfZm9yX0lSUSA9IDA7CisKKwkgICAgICAgICAgICAgCS8qIGNoZWNrIHRvIHNlZSB0aGF0IHRoZSBDUFUgbnVtYmVyIGZvciB0aGlzIGRldmljZSAqLworCQkJLyogY29ycmVzcG9uZHMgdG8gdGhlIGludGVycnVwdCBzdGF0dXMgcmVhZCAqLworICAgICAgICAgICAgICAgIAlzd2l0Y2ggKENQVV9ubykgeworICAgICAgICAgICAgICAgICAgICAgICAgCWNhc2UgUzUxNF9DUFVfQToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWlmKCh1bnNpZ25lZCBjaGFyKWludF9zdGF0dXMgJgorCQkJCQkJSVJRX0NQVV9BKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRfZm91bmRfZm9yX0lSUSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisJICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTNTE0X0NQVV9COgorICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHVuc2lnbmVkIGNoYXIpaW50X3N0YXR1cyAmCisJCQkJCQlJUlFfQ1BVX0IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZF9mb3VuZF9mb3JfSVJRID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgCX0KKworCQkJLyogZXhpdCBpZiB0aGUgaW50ZXJydXB0IGlzIGZvciBhbm90aGVyIENQVSBvbiB0aGUgKi8KKwkJCS8qIHNhbWUgSVJRICovCisJCQlpZighY2FyZF9mb3VuZF9mb3JfSVJRKQorCQkJCXJldHVybiBJUlFfSEFORExFRDsKKworICAgICAgIAkgCQlpZiAoIWNhcmQgfHwgCisJCQkgICAoY2FyZC0+d2FuZGV2LnN0YXRlID09IFdBTl9VTkNPTkZJR1VSRUQgJiYgIWNhcmQtPmNvbmZpZ3VyZWQpKXsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkJIlJlY2VpdmVkIElSUSAlZCBmb3IgQ1BVICMlY1xuIiwKKwkJCQkJCWlycSwgQ1BVX25vKTsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkJIklSUSBmb3IgdW5jb25maWd1cmVkIGFkYXB0ZXJcbiIpOworCQkJCQlTNTE0X2ludGFjaygmY2FyZC0+aHcsIGludF9zdGF0dXMpOworCQkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisgICAgICAgCQkJfQorCisJICAgICAgICAJaWYgKGNhcmQtPmluX2lzcikgeworICAgICAgICAJICAgICAgIAkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkiJXM6IGludGVycnVwdCByZS1lbnRyYW5jeSBvbiBJUlEgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIAkJCWNhcmQtPmRldm5hbWUsIGNhcmQtPndhbmRldi5pcnEpOworCQkJCVM1MTRfaW50YWNrKCZjYXJkLT5odywgaW50X3N0YXR1cyk7CisgCQkJCXJldHVybiBJUlFfSEFORExFRDsKKyAgICAgICAJCQl9CisKKwkJCXNwaW5fbG9jaygmY2FyZC0+d2FuZGV2LmxvY2spOworCQkJaWYgKGNhcmQtPm5leHQpeworCQkJCXNwaW5fbG9jaygmY2FyZC0+bmV4dC0+d2FuZGV2LmxvY2spOworCQkJfQorCQkJCQorCSAgICAgICAgICAgICAgIAlTNTE0X2ludGFjaygmY2FyZC0+aHcsIGludF9zdGF0dXMpOworICAgICAgIAkJCWlmIChjYXJkLT5pc3IpCisJCQkJY2FyZC0+aXNyKGNhcmQpOworCisJCQlpZiAoY2FyZC0+bmV4dCl7CisJCQkJc3Bpbl91bmxvY2soJmNhcmQtPm5leHQtPndhbmRldi5sb2NrKTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrKCZjYXJkLT53YW5kZXYubG9jayk7CisKKwkJCS8qIGhhbmRsZSBhIG1heGltdW0gb2YgdHdvIGludGVycnVwdHMgKG9uZSBmb3IgZWFjaCAqLworCQkJLyogQ1BVIG9uIHRoZSBhZGFwdGVyKSBiZWZvcmUgcmV0dXJuaW5nICovICAKKwkJCWlmKCgrKyBJUlFfY291bnQpID09IDIpCisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisJfQorCisJZWxzZSB7CQkJLyogaGFuZGxlIGludGVycnVwdCBvbiBTNTA4IGFkYXB0ZXIgKi8KKworCQlpZiAoIWNhcmQgfHwgKChjYXJkLT53YW5kZXYuc3RhdGUgPT0gV0FOX1VOQ09ORklHVVJFRCkgJiYgIWNhcmQtPmNvbmZpZ3VyZWQpKQorCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJCWlmIChjYXJkLT5pbl9pc3IpIHsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkiJXM6IGludGVycnVwdCByZS1lbnRyYW5jeSBvbiBJUlEgJWQhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUsIGNhcmQtPndhbmRldi5pcnEpOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisKKwkJc3Bpbl9sb2NrKCZjYXJkLT53YW5kZXYubG9jayk7CisJCWlmIChjYXJkLT5uZXh0KXsKKwkJCXNwaW5fbG9jaygmY2FyZC0+bmV4dC0+d2FuZGV2LmxvY2spOworCQl9CisJCisJCXNkbGFfaW50YWNrKCZjYXJkLT5odyk7CisJCWlmIChjYXJkLT5pc3IpCisJCQljYXJkLT5pc3IoY2FyZCk7CisJCQorCQlpZiAoY2FyZC0+bmV4dCl7CisJCQlzcGluX3VubG9jaygmY2FyZC0+bmV4dC0+d2FuZGV2LmxvY2spOworCQl9CisJCXNwaW5fdW5sb2NrKCZjYXJkLT53YW5kZXYubG9jayk7CisKKwl9CisgICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKKyN1bmRlZgljYXJkCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgcHJvdG9jb2wtc3BlY2lmaWMgbW9kdWxlcyB3aGVuIG5ldHdvcmsKKyAqIGludGVyZmFjZSBpcyBiZWluZyBvcGVuLiAgVGhlIG9ubHkgcmVhc29uIHdlIG5lZWQgdGhpcywgaXMgYmVjYXVzZSB3ZQorICogaGF2ZSB0byBjYWxsIE1PRF9JTkNfVVNFX0NPVU5ULCBidXQgY2Fubm90IGluY2x1ZGUgJ21vZHVsZS5oJyB3aGVyZSBpdCdzCisgKiBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlIGludG8gdGhlIHNhbWUga2VybmVsIG1vZHVsZS4KKyAqLwordm9pZCB3YW5waXBlX29wZW4gKHNkbGFfdCogY2FyZCkKK3sKKwkrK2NhcmQtPm9wZW5fY250OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIHByb3RvY29sLXNwZWNpZmljIG1vZHVsZXMgd2hlbiBuZXR3b3JrCisgKiBpbnRlcmZhY2UgaXMgYmVpbmcgY2xvc2VkLiAgVGhlIG9ubHkgcmVhc29uIHdlIG5lZWQgdGhpcywgaXMgYmVjYXVzZSB3ZQorICogaGF2ZSB0byBjYWxsIE1PRF9ERUNfVVNFX0NPVU5ULCBidXQgY2Fubm90IGluY2x1ZGUgJ21vZHVsZS5oJyB3aGVyZSBpdCdzCisgKiBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlIGludG8gdGhlIHNhbWUga2VybmVsIG1vZHVsZS4KKyAqLwordm9pZCB3YW5waXBlX2Nsb3NlIChzZGxhX3QqIGNhcmQpCit7CisJLS1jYXJkLT5vcGVuX2NudDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXQgV0FOIGRldmljZSBzdGF0ZS4KKyAqLwordm9pZCB3YW5waXBlX3NldF9zdGF0ZSAoc2RsYV90KiBjYXJkLCBpbnQgc3RhdGUpCit7CisJaWYgKGNhcmQtPndhbmRldi5zdGF0ZSAhPSBzdGF0ZSkgeworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgV0FOX0NPTk5FQ1RFRDoKKwkJCXByaW50ayAoS0VSTl9JTkZPICIlczogbGluayBjb25uZWN0ZWQhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXQU5fQ09OTkVDVElORzoKKwkJCXByaW50ayAoS0VSTl9JTkZPICIlczogbGluayBjb25uZWN0aW5nLi4uXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXQU5fRElTQ09OTkVDVEVEOgorCQkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBsaW5rIGRpc2Nvbm5lY3RlZCFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlicmVhazsKKwkJfQorCQljYXJkLT53YW5kZXYuc3RhdGUgPSBzdGF0ZTsKKwl9CisJY2FyZC0+c3RhdGVfdGljayA9IGppZmZpZXM7Cit9CisKK3NkbGFfdCAqIHdhbnBpcGVfZmluZF9jYXJkIChjaGFyICpuYW1lKQoreworCWludCBjbnQ7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBuY2FyZHM7ICsrIGNudCkgeworCQlzZGxhX3QqIGNhcmQgPSAmY2FyZF9hcnJheVtjbnRdOworCQlpZiAoIXN0cmNtcChjYXJkLT5kZXZuYW1lLG5hbWUpKQorCQkJcmV0dXJuIGNhcmQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzZGxhX3QgKiB3YW5waXBlX2ZpbmRfY2FyZF9udW0gKGludCBudW0pCit7CisJaWYgKG51bSA8IDEgfHwgbnVtID4gbmNhcmRzKQorCQlyZXR1cm4gTlVMTDsJCisJbnVtLS07CisJcmV0dXJuICZjYXJkX2FycmF5W251bV07Cit9CisKKy8qCisgKiBAd29ya19wb2ludGVyOgl3b3JrX3N0cnVjdCB0byBiZSBkb25lOworICogCQkJc2hvdWxkIGFscmVhZHkgaGF2ZSBQUkVQQVJFX1dPUksoKSBvcgorICogCQkJICBJTklUX1dPUksoKSBkb25lIG9uIGl0IGJ5IGNhbGxlcjsKKyAqLwordm9pZCB3YW5waXBlX3F1ZXVlX3dvcmsgKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya19wb2ludGVyKQoreworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDEsICh2b2lkKikmd2FucGlwZV9iaF9jcml0aWNhbCkpCisJCXByaW50ayhLRVJOX0lORk8gIkNSSVRJQ0FMIElOIFFVRVVJTkcgV09SS1xuIik7CisKKwlxdWV1ZV93b3JrKHdhbnBpcGVfd3EsIHdvcmtfcG9pbnRlcik7CisJY2xlYXJfYml0KDEsKHZvaWQqKSZ3YW5waXBlX2JoX2NyaXRpY2FsKTsKK30KKwordm9pZCB3YWtldXBfc2tfYmgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl3YW5waXBlX2NvbW1vbl90ICpjaGFuID0gZGV2LT5wcml2OworCisJaWYgKHRlc3RfYml0KDAsJmNoYW4tPmNvbW1vbl9jcml0aWNhbCkpCisJCXJldHVybjsKKwkKKwlpZiAoY2hhbi0+c2sgJiYgY2hhbi0+dHhfdGltZXIpeworCQljaGFuLT50eF90aW1lci0+ZXhwaXJlcz1qaWZmaWVzKzE7CisJCWFkZF90aW1lcihjaGFuLT50eF90aW1lcik7CisJfQorfQorCitpbnQgY2hhbmdlX2Rldl9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBmbGFncykKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZfaW5mbzsKKwltbV9zZWdtZW50X3QgZnMgPSBnZXRfZnMoKTsKKwlpbnQgZXJyOworCisJbWVtc2V0KCZpZl9pbmZvLCAwLCBzaXplb2YoaWZfaW5mbykpOworCXN0cmNweShpZl9pbmZvLmlmcl9uYW1lLCBkZXYtPm5hbWUpOworCWlmX2luZm8uaWZyX2ZsYWdzID0gZmxhZ3M7CQorCisJc2V0X2ZzKGdldF9kcygpKTsgICAgIC8qIGdldCB1c2VyIHNwYWNlIGJsb2NrICovIAorCWVyciA9IGRldmluZXRfaW9jdGwoU0lPQ1NJRkZMQUdTLCAmaWZfaW5mbyk7CisJc2V0X2ZzKGZzKTsKKworCXJldHVybiBlcnI7Cit9CisKK3Vuc2lnbmVkIGxvbmcgZ2V0X2lwX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG9wdGlvbikKK3sKKwkKKwlzdHJ1Y3QgaW5faWZhZGRyICppZmFkZHI7CisJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OworCisJaWYgKChpbl9kZXYgPSBfX2luX2Rldl9nZXQoZGV2KSkgPT0gTlVMTCl7CisJCXJldHVybiAwOworCX0KKworCWlmICgoaWZhZGRyID0gaW5fZGV2LT5pZmFfbGlzdCk9PSBOVUxMICl7CisJCXJldHVybiAwOworCX0KKwkKKwlzd2l0Y2ggKG9wdGlvbil7CisKKwljYXNlIFdBTl9MT0NBTF9JUDoKKwkJcmV0dXJuIGlmYWRkci0+aWZhX2xvY2FsOworCQlicmVhazsKKwkKKwljYXNlIFdBTl9QT0lOVE9QT0lOVF9JUDoKKwkJcmV0dXJuIGlmYWRkci0+aWZhX2FkZHJlc3M7CisJCWJyZWFrOwkKKworCWNhc2UgV0FOX05FVE1BU0tfSVA6CisJCXJldHVybiBpZmFkZHItPmlmYV9tYXNrOworCQlicmVhazsKKworCWNhc2UgV0FOX0JST0FEQ0FTVF9JUDoKKwkJcmV0dXJuIGlmYWRkci0+aWZhX2Jyb2FkY2FzdDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDA7Cit9CQorCit2b2lkIGFkZF9nYXRld2F5KHNkbGFfdCAqY2FyZCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwltbV9zZWdtZW50X3Qgb2xkZnM7CisJc3RydWN0IHJ0ZW50cnkgcm91dGU7CisJaW50IHJlczsKKworCW1lbXNldCgoY2hhciopJnJvdXRlLDAsc2l6ZW9mKHN0cnVjdCBydGVudHJ5KSk7CisKKwkoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKQorCQkmKHJvdXRlLnJ0X2RzdCkpLT5zaW5fYWRkci5zX2FkZHIgPSAwOworCSgoc3RydWN0IHNvY2thZGRyX2luICopCisJCSYocm91dGUucnRfZHN0KSktPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCisJKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikKKwkJJihyb3V0ZS5ydF9nZW5tYXNrKSktPnNpbl9hZGRyLnNfYWRkciA9IDA7CisJKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgCisJCSYocm91dGUucnRfZ2VubWFzaykpIC0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisKKworCXJvdXRlLnJ0X2ZsYWdzID0gMDsgIAorCXJvdXRlLnJ0X2RldiA9IGRldi0+bmFtZTsKKworCW9sZGZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKGdldF9kcygpKTsKKwlyZXMgPSBpcF9ydF9pb2N0bChTSU9DQUREUlQsJnJvdXRlKTsKKwlzZXRfZnMob2xkZnMpOworCisJaWYgKHJlcyA9PSAwKXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdhdGV3YXkgYWRkZWQgZm9yICVzXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSxkZXYtPm5hbWUpOworCX0KKworCXJldHVybjsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKioqKioqIEVuZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vc2VhbGV2ZWwuYyBiL2RyaXZlcnMvbmV0L3dhbi9zZWFsZXZlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzODBkZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vc2VhbGV2ZWwuYwpAQCAtMCwwICsxLDQ2OSBAQAorLyoKKyAqCVNlYWxldmVsIFN5c3RlbXMgNDAyMSBkcml2ZXIuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgkoYykgQ29weXJpZ2h0IDE5OTksIDIwMDEgQWxhbiBDb3gKKyAqCShjKSBDb3B5cmlnaHQgMjAwMSBSZWQgSGF0IEluYy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxuZXQvc3luY3BwcC5oPgorI2luY2x1ZGUgIno4NTIzMC5oIgorCisKK3N0cnVjdCBzbHZsX2RldmljZQoreworCXZvaWQgKmlmX3B0cjsJLyogR2VuZXJhbCBwdXJwb3NlIHBvaW50ZXIgKHVzZWQgYnkgU1BQUCkgKi8KKwlzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqY2hhbjsKKwlzdHJ1Y3QgcHBwX2RldmljZSBwcHBkZXY7CisJaW50IGNoYW5uZWw7Cit9OworCisKK3N0cnVjdCBzbHZsX2JvYXJkCit7CisJc3RydWN0IHNsdmxfZGV2aWNlICpkZXZbMl07CisJc3RydWN0IHo4NTMwX2RldiBib2FyZDsKKwlpbnQgaW9iYXNlOworfTsKKworLyoKKyAqCU5ldHdvcmsgZHJpdmVyIHN1cHBvcnQgcm91dGluZXMKKyAqLworCisvKgorICoJRnJhbWUgcmVjZWl2ZS4gU2ltcGxlIGZvciBvdXIgY2FyZCBhcyB3ZSBkbyBzeW5jIHBwcCBhbmQgdGhlcmUKKyAqCWlzIG5vIGZ1bm55IGdhcmJhZ2UgaW52b2x2ZWQKKyAqLworIAorc3RhdGljIHZvaWQgc2VhbGV2ZWxfaW5wdXQoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJLyogRHJvcCB0aGUgQ1JDIC0gaXQncyBub3QgYSBnb29kIGlkZWEgdG8gdHJ5IGFuZCBuZWdvdGlhdGUgaXQgOykgKi8KKwlza2JfdHJpbShza2IsIHNrYi0+bGVuLTIpOworCXNrYi0+cHJvdG9jb2w9aHRvbnMoRVRIX1BfV0FOX1BQUCk7CisJc2tiLT5tYWMucmF3PXNrYi0+ZGF0YTsKKwlza2ItPmRldj1jLT5uZXRkZXZpY2U7CisJLyoKKwkgKglTZW5kIGl0IHRvIHRoZSBQUFAgbGF5ZXIuIFdlIGRvbid0IGhhdmUgdGltZSB0byBwcm9jZXNzCisJICoJaXQgcmlnaHQgbm93LgorCSAqLworCW5ldGlmX3J4KHNrYik7CisJYy0+bmV0ZGV2aWNlLT5sYXN0X3J4ID0gamlmZmllczsKK30KKyAKKy8qCisgKglXZSd2ZSBiZWVuIHBsYWNlZCBpbiB0aGUgVVAgc3RhdGUKKyAqLyAKKyAKK3N0YXRpYyBpbnQgc2VhbGV2ZWxfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZCkKK3sKKwlzdHJ1Y3Qgc2x2bF9kZXZpY2UgKnNsdmw9ZC0+cHJpdjsKKwlpbnQgZXJyID0gLTE7CisJaW50IHVuaXQgPSBzbHZsLT5jaGFubmVsOworCQorCS8qCisJICoJTGluayBsYXllciB1cC4gCisJICovCisKKwlzd2l0Y2godW5pdCkKKwl7CisJCWNhc2UgMDoKKwkJCWVycj16ODUzMF9zeW5jX2RtYV9vcGVuKGQsIHNsdmwtPmNoYW4pOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWVycj16ODUzMF9zeW5jX29wZW4oZCwgc2x2bC0+Y2hhbik7CisJCQlicmVhazsKKwl9CisJCisJaWYoZXJyKQorCQlyZXR1cm4gZXJyOworCS8qCisJICoJQmVnaW4gUFBQCisJICovCisJZXJyPXNwcHBfb3BlbihkKTsKKwlpZihlcnIpCisJeworCQlzd2l0Y2godW5pdCkKKwkJeworCQkJY2FzZSAwOgorCQkJCXo4NTMwX3N5bmNfZG1hX2Nsb3NlKGQsIHNsdmwtPmNoYW4pOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCXo4NTMwX3N5bmNfY2xvc2UoZCwgc2x2bC0+Y2hhbik7CisJCQkJYnJlYWs7CisJCX0JCQkJCisJCXJldHVybiBlcnI7CisJfQorCQorCXNsdmwtPmNoYW4tPnJ4X2Z1bmN0aW9uPXNlYWxldmVsX2lucHV0OworCQorCS8qCisJICoJR28gZ28gZ28KKwkgKi8KKwluZXRpZl9zdGFydF9xdWV1ZShkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZWFsZXZlbF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZCkKK3sKKwlzdHJ1Y3Qgc2x2bF9kZXZpY2UgKnNsdmw9ZC0+cHJpdjsKKwlpbnQgdW5pdCA9IHNsdmwtPmNoYW5uZWw7CisJCisJLyoKKwkgKglEaXNjYXJkIG5ldyBmcmFtZXMKKwkgKi8KKwkKKwlzbHZsLT5jaGFuLT5yeF9mdW5jdGlvbj16ODUzMF9udWxsX3J4OworCQkKKwkvKgorCSAqCVBQUCBvZmYKKwkgKi8KKwlzcHBwX2Nsb3NlKGQpOworCS8qCisJICoJTGluayBsYXllciBkb3duCisJICovCisKKwluZXRpZl9zdG9wX3F1ZXVlKGQpOworCQkKKwlzd2l0Y2godW5pdCkKKwl7CisJCWNhc2UgMDoKKwkJCXo4NTMwX3N5bmNfZG1hX2Nsb3NlKGQsIHNsdmwtPmNoYW4pOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXo4NTMwX3N5bmNfY2xvc2UoZCwgc2x2bC0+Y2hhbik7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VhbGV2ZWxfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmQsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCS8qIHN0cnVjdCBzbHZsX2RldmljZSAqc2x2bD1kLT5wcml2OworCSAgIHo4NTMwX2lvY3RsKGQsJnNsdmwtPnN5bmMuY2hhbkEsaWZyLGNtZCkgKi8KKwlyZXR1cm4gc3BwcF9kb19pb2N0bChkLCBpZnIsY21kKTsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzZWFsZXZlbF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmQpCit7CisJc3RydWN0IHNsdmxfZGV2aWNlICpzbHZsPWQtPnByaXY7CisJaWYoc2x2bCkKKwkJcmV0dXJuIHo4NTMwX2dldF9zdGF0cyhzbHZsLT5jaGFuKTsKKwllbHNlCisJCXJldHVybiBOVUxMOworfQorCisvKgorICoJUGFzc2VkIFBQUCBmcmFtZXMsIGZpcmUgdGhlbSBkb3dud2luZC4KKyAqLworIAorc3RhdGljIGludCBzZWFsZXZlbF9xdWV1ZV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkKQoreworCXN0cnVjdCBzbHZsX2RldmljZSAqc2x2bD1kLT5wcml2OworCXJldHVybiB6ODUzMF9xdWV1ZV94bWl0KHNsdmwtPmNoYW4sIHNrYik7Cit9CisKK3N0YXRpYyBpbnQgc2VhbGV2ZWxfbmVpZ2hfc2V0dXAoc3RydWN0IG5laWdoYm91ciAqbikKK3sKKwlpZiAobi0+bnVkX3N0YXRlID09IE5VRF9OT05FKSB7CisJCW4tPm9wcyA9ICZhcnBfYnJva2VuX29wczsKKwkJbi0+b3V0cHV0ID0gbi0+b3BzLT5vdXRwdXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlYWxldmVsX25laWdoX3NldHVwX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmVpZ2hfcGFybXMgKnApCit7CisJaWYgKHAtPnRibC0+ZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJcC0+bmVpZ2hfc2V0dXAgPSBzZWFsZXZlbF9uZWlnaF9zZXR1cDsKKwkJcC0+dWNhc3RfcHJvYmVzID0gMDsKKwkJcC0+bWNhc3RfcHJvYmVzID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VhbGV2ZWxfYXR0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNsdmxfZGV2aWNlICpzdiA9IGRldi0+cHJpdjsKKwlzcHBwX2F0dGFjaCgmc3YtPnBwcGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNlYWxldmVsX2RldGFjaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNwcHBfZGV0YWNoKGRldik7Cit9CisJCQorc3RhdGljIHZvaWQgc2x2bF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZCkKK3sKKwlkLT5vcGVuID0gc2VhbGV2ZWxfb3BlbjsKKwlkLT5zdG9wID0gc2VhbGV2ZWxfY2xvc2U7CisJZC0+aW5pdCA9IHNlYWxldmVsX2F0dGFjaDsKKwlkLT51bmluaXQgPSBzZWFsZXZlbF9kZXRhY2g7CisJZC0+aGFyZF9zdGFydF94bWl0ID0gc2VhbGV2ZWxfcXVldWVfeG1pdDsKKwlkLT5nZXRfc3RhdHMgPSBzZWFsZXZlbF9nZXRfc3RhdHM7CisJZC0+c2V0X211bHRpY2FzdF9saXN0ID0gTlVMTDsKKwlkLT5kb19pb2N0bCA9IHNlYWxldmVsX2lvY3RsOworCWQtPm5laWdoX3NldHVwID0gc2VhbGV2ZWxfbmVpZ2hfc2V0dXBfZGV2OworCWQtPnNldF9tYWNfYWRkcmVzcyA9IE5VTEw7CisKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2x2bF9kZXZpY2UgKnNsdmxfYWxsb2MoaW50IGlvYmFzZSwgaW50IGlycSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZDsKKwlzdHJ1Y3Qgc2x2bF9kZXZpY2UgKnN2OworCisJZCA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IHNsdmxfZGV2aWNlKSwgImhkbGMlZCIsCisJCQkgc2x2bF9zZXR1cCk7CisKKwlpZiAoIWQpIAorCQlyZXR1cm4gTlVMTDsKKworCXN2ID0gZC0+cHJpdjsKKwlzdi0+aWZfcHRyID0gJnN2LT5wcHBkZXY7CisJc3YtPnBwcGRldi5kZXYgPSBkOworCWQtPmJhc2VfYWRkciA9IGlvYmFzZTsKKwlkLT5pcnEgPSBpcnE7CisJCQorCXJldHVybiBzdjsKK30KKworCisvKgorICoJQWxsb2NhdGUgYW5kIHNldHVwIFNlYWxldmVsIGJvYXJkLgorICovCisgCitzdGF0aWMgX19pbml0IHN0cnVjdCBzbHZsX2JvYXJkICpzbHZsX2luaXQoaW50IGlvYmFzZSwgaW50IGlycSwgCisJCQkJCSAgIGludCB0eGRtYSwgaW50IHJ4ZG1hLCBpbnQgc2xvdykKK3sKKwlzdHJ1Y3Qgejg1MzBfZGV2ICpkZXY7CisJc3RydWN0IHNsdmxfYm9hcmQgKmI7CisJCisJLyoKKwkgKglHZXQgdGhlIG5lZWRlZCBJL08gc3BhY2UKKwkgKi8KKworCWlmKCFyZXF1ZXN0X3JlZ2lvbihpb2Jhc2UsIDgsICJTZWFsZXZlbCA0MDIxIikpIAorCXsJCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNlYWxldmVsOiBJL08gMHglWCBhbHJlYWR5IGluIHVzZS5cbiIsIGlvYmFzZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwliID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNsdmxfYm9hcmQpLCBHRlBfS0VSTkVMKTsKKwlpZighYikKKwkJZ290byBmYWlsMzsKKworCW1lbXNldChiLCAwLCBzaXplb2YoKmIpKTsKKwlpZiAoIShiLT5kZXZbMF09IHNsdmxfYWxsb2MoaW9iYXNlLCBpcnEpKSkKKwkJZ290byBmYWlsMjsKKworCWItPmRldlswXS0+Y2hhbiA9ICZiLT5ib2FyZC5jaGFuQTsJCisJYi0+ZGV2WzBdLT5jaGFubmVsID0gMDsKKwkKKwlpZiAoIShiLT5kZXZbMV0gPSBzbHZsX2FsbG9jKGlvYmFzZSwgaXJxKSkpCisJCWdvdG8gZmFpbDFfMDsKKworCWItPmRldlsxXS0+Y2hhbiA9ICZiLT5ib2FyZC5jaGFuQjsKKwliLT5kZXZbMV0tPmNoYW5uZWwgPSAxOworCisJZGV2ID0gJmItPmJvYXJkOworCQorCS8qCisJICoJU3R1ZmYgaW4gdGhlIEkvTyBhZGRyZXNzaW5nCisJICovCisJIAorCWRldi0+YWN0aXZlID0gMDsKKworCWItPmlvYmFzZSA9IGlvYmFzZTsKKwkKKwkvKgorCSAqCVNlbGVjdCA4NTMwIGRlbGF5cyBmb3IgdGhlIG9sZCBib2FyZAorCSAqLworCSAKKwlpZihzbG93KQorCQlpb2Jhc2UgfD0gWjg1MzBfUE9SVF9TTEVFUDsKKwkJCisJZGV2LT5jaGFuQS5jdHJsaW89aW9iYXNlKzE7CisJZGV2LT5jaGFuQS5kYXRhaW89aW9iYXNlOworCWRldi0+Y2hhbkIuY3RybGlvPWlvYmFzZSszOworCWRldi0+Y2hhbkIuZGF0YWlvPWlvYmFzZSsyOworCQorCWRldi0+Y2hhbkEuaXJxcz0mejg1MzBfbm9wOworCWRldi0+Y2hhbkIuaXJxcz0mejg1MzBfbm9wOworCQorCS8qCisJICoJQXNzZXJ0IERUUiBlbmFibGUgRE1BCisJICovCisJIAorCW91dGIoM3woMTw8NyksIGItPmlvYmFzZSs0KTsJCisJCisKKwkvKiBXZSB3YW50IGEgZmFzdCBJUlEgZm9yIHRoaXMgZGV2aWNlLiBBY3R1YWxseSB3ZSdkIGxpa2UgYW4gZXZlbiBmYXN0ZXIKKwkgICBJUlEgOykgLSBUaGlzIGlzIG9uZSBkcml2ZXIgUnRMaW51eCBpcyBtYWRlIGZvciAqLworICAgCisJaWYocmVxdWVzdF9pcnEoaXJxLCAmejg1MzBfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsICJTZWFMZXZlbCIsIGRldik8MCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNlYWxldmVsOiBJUlEgJWQgYWxyZWFkeSBpbiB1c2UuXG4iLCBpcnEpOworCQlnb3RvIGZhaWwxXzE7CisJfQorCQorCWRldi0+aXJxPWlycTsKKwlkZXYtPmNoYW5BLnByaXZhdGU9JmItPmRldlswXTsKKwlkZXYtPmNoYW5CLnByaXZhdGU9JmItPmRldlsxXTsKKwlkZXYtPmNoYW5BLm5ldGRldmljZT1iLT5kZXZbMF0tPnBwcGRldi5kZXY7CisJZGV2LT5jaGFuQi5uZXRkZXZpY2U9Yi0+ZGV2WzFdLT5wcHBkZXYuZGV2OworCWRldi0+Y2hhbkEuZGV2PWRldjsKKwlkZXYtPmNoYW5CLmRldj1kZXY7CisKKwlkZXYtPmNoYW5BLnR4ZG1hPTM7CisJZGV2LT5jaGFuQS5yeGRtYT0xOworCWlmKHJlcXVlc3RfZG1hKGRldi0+Y2hhbkEudHhkbWEsICJTZWFMZXZlbCAoVFgpIikhPTApCisJCWdvdG8gZmFpbDsKKwkJCisJaWYocmVxdWVzdF9kbWEoZGV2LT5jaGFuQS5yeGRtYSwgIlNlYUxldmVsIChSWCkiKSE9MCkKKwkJZ290byBkbWFmYWlsOworCQorCWRpc2FibGVfaXJxKGlycSk7CisJCQorCS8qCisJICoJQmVnaW4gbm9ybWFsIGluaXRpYWxpc2UKKwkgKi8KKwkgCisJaWYoejg1MzBfaW5pdChkZXYpIT0wKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJaODUzMCBzZXJpZXMgZGV2aWNlIG5vdCBmb3VuZC5cbiIpOworCQllbmFibGVfaXJxKGlycSk7CisJCWdvdG8gZG1hZmFpbDI7CisJfQorCWlmKGRldi0+dHlwZT09Wjg1QzMwKQorCXsKKwkJejg1MzBfY2hhbm5lbF9sb2FkKCZkZXYtPmNoYW5BLCB6ODUzMF9oZGxjX2tpbG9zdHJlYW0pOworCQl6ODUzMF9jaGFubmVsX2xvYWQoJmRldi0+Y2hhbkIsIHo4NTMwX2hkbGNfa2lsb3N0cmVhbSk7CisJfQorCWVsc2UKKwl7CisJCXo4NTMwX2NoYW5uZWxfbG9hZCgmZGV2LT5jaGFuQSwgejg1MzBfaGRsY19raWxvc3RyZWFtXzg1MjMwKTsKKwkJejg1MzBfY2hhbm5lbF9sb2FkKCZkZXYtPmNoYW5CLCB6ODUzMF9oZGxjX2tpbG9zdHJlYW1fODUyMzApOworCX0KKworCS8qCisJICoJTm93IHdlIGNhbiB0YWtlIHRoZSBJUlEKKwkgKi8KKwkKKwllbmFibGVfaXJxKGlycSk7CisKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGItPmRldlswXS0+cHBwZGV2LmRldikpIAorCQlnb3RvIGRtYWZhaWwyOworCQkKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGItPmRldlsxXS0+cHBwZGV2LmRldikpIAorCQlnb3RvIGZhaWxfdW5pdDsKKworCXo4NTMwX2Rlc2NyaWJlKGRldiwgIkkvTyIsIGlvYmFzZSk7CisJZGV2LT5hY3RpdmU9MTsKKwlyZXR1cm4gYjsKKworZmFpbF91bml0OgorCXVucmVnaXN0ZXJfbmV0ZGV2KGItPmRldlswXS0+cHBwZGV2LmRldik7CisJCitkbWFmYWlsMjoKKwlmcmVlX2RtYShkZXYtPmNoYW5BLnJ4ZG1hKTsKK2RtYWZhaWw6CisJZnJlZV9kbWEoZGV2LT5jaGFuQS50eGRtYSk7CitmYWlsOgorCWZyZWVfaXJxKGlycSwgZGV2KTsKK2ZhaWwxXzE6CisJZnJlZV9uZXRkZXYoYi0+ZGV2WzFdLT5wcHBkZXYuZGV2KTsKK2ZhaWwxXzA6CisJZnJlZV9uZXRkZXYoYi0+ZGV2WzBdLT5wcHBkZXYuZGV2KTsKK2ZhaWwyOgorCWtmcmVlKGIpOworZmFpbDM6CisJcmVsZWFzZV9yZWdpb24oaW9iYXNlLDgpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2x2bF9zaHV0ZG93bihzdHJ1Y3Qgc2x2bF9ib2FyZCAqYikKK3sKKwlpbnQgdTsKKworCXo4NTMwX3NodXRkb3duKCZiLT5ib2FyZCk7CisJCisJZm9yKHU9MDsgdTwyOyB1KyspCisJeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZCA9IGItPmRldlt1XS0+cHBwZGV2LmRldjsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZCk7CisJCWZyZWVfbmV0ZGV2KGQpOworCX0KKwkKKwlmcmVlX2lycShiLT5ib2FyZC5pcnEsICZiLT5ib2FyZCk7CisJZnJlZV9kbWEoYi0+Ym9hcmQuY2hhbkEucnhkbWEpOworCWZyZWVfZG1hKGItPmJvYXJkLmNoYW5BLnR4ZG1hKTsKKwkvKiBETUEgb2ZmIG9uIHRoZSBjYXJkLCBkcm9wIERUUiAqLworCW91dGIoMCwgYi0+aW9iYXNlKTsKKwlyZWxlYXNlX3JlZ2lvbihiLT5pb2Jhc2UsIDgpOworCWtmcmVlKGIpOworfQorCisKK3N0YXRpYyBpbnQgaW89MHgyMzg7CitzdGF0aWMgaW50IHR4ZG1hPTE7CitzdGF0aWMgaW50IHJ4ZG1hPTM7CitzdGF0aWMgaW50IGlycT01Oworc3RhdGljIGludCBzbG93PTA7CisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJUaGUgSS9PIGJhc2Ugb2YgdGhlIFNlYWxldmVsIGNhcmQiKTsKK21vZHVsZV9wYXJhbSh0eGRtYSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModHhkbWEsICJUcmFuc21pdCBETUEgY2hhbm5lbCIpOworbW9kdWxlX3BhcmFtKHJ4ZG1hLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhyeGRtYSwgIlJlY2VpdmUgRE1BIGNoYW5uZWwiKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIlRoZSBpbnRlcnJ1cHQgbGluZSBzZXR0aW5nIGZvciB0aGUgU2VhTGV2ZWwgY2FyZCIpOworbW9kdWxlX3BhcmFtKHNsb3csIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhzbG93LCAiU2V0IHRoaXMgZm9yIGFuIG9sZGVyIFNlYWxldmVsIGNhcmQgc3VjaCBhcyB0aGUgNDAxMiIpOworCitNT0RVTEVfQVVUSE9SKCJBbGFuIENveCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNb2R1bGFyIGRyaXZlciBmb3IgdGhlIFNlYUxldmVsIDQwMjEiKTsKKworc3RhdGljIHN0cnVjdCBzbHZsX2JvYXJkICpzbHZsX3VuaXQ7CisKK3N0YXRpYyBpbnQgX19pbml0IHNsdmxfaW5pdF9tb2R1bGUodm9pZCkKK3sKKyNpZmRlZiBNT0RVTEUKKwlwcmludGsoS0VSTl9JTkZPICJTZWFMZXZlbCBaODUyMzAgU3luY2hyb25vdXMgRHJpdmVyIHYgMC4wMi5cbiIpOworCXByaW50ayhLRVJOX0lORk8gIihjKSBDb3B5cmlnaHQgMTk5OCwgQnVpbGRpbmcgTnVtYmVyIFRocmVlIEx0ZC5cbiIpOworI2VuZGlmCisJc2x2bF91bml0ID0gc2x2bF9pbml0KGlvLCBpcnEsIHR4ZG1hLCByeGRtYSwgc2xvdyk7CisKKwlyZXR1cm4gc2x2bF91bml0ID8gMCA6IC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbHZsX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaWYoc2x2bF91bml0KQorCQlzbHZsX3NodXRkb3duKHNsdmxfdW5pdCk7Cit9CisKK21vZHVsZV9pbml0KHNsdmxfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoc2x2bF9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vc3luY3BwcC5jIGIvZHJpdmVycy9uZXQvd2FuL3N5bmNwcHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGI2NWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3N5bmNwcHAuYwpAQCAtMCwwICsxLDE0ODggQEAKKy8qCisgKglORVQzOglBIChmYWlybHkgbWluaW1hbCkgaW1wbGVtZW50YXRpb24gb2Ygc3luY2hyb25vdXMgUFBQIGZvciBMaW51eAorICoJCWFzIHdlbGwgYXMgYSBDSVNDTyBIRExDIGltcGxlbWVudGF0aW9uLiBTZWUgdGhlIGNvcHlyaWdodCAKKyAqCQltZXNzYWdlIGJlbG93IGZvciB0aGUgb3JpZ2luYWwgc291cmNlLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIGxpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJTm90ZSBob3dldmVyLiBUaGlzIGNvZGUgaXMgYWxzbyB1c2VkIGluIGEgZGlmZmVyZW50IGZvcm0gYnkgRnJlZUJTRC4KKyAqCVRoZXJlZm9yZSB3aGVuIG1ha2luZyBhbnkgbm9uIE9TIHNwZWNpZmljIGNoYW5nZSBwbGVhc2UgY29uc2lkZXIKKyAqCWNvbnRyaWJ1dGluZyBpdCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBhdXRob3IgdW5kZXIgdGhlIHRlcm1zCisgKgliZWxvdyBpbiBhZGRpdGlvbi4KKyAqCQktLSBBbGFuCisgKgorICoJUG9ydCBmb3IgTGludXgtMi4xIGJ5IEphbiAiWWVueWEiIEthc3ByemFrIDxrYXNAZmkubXVuaS5jej4KKyAqLworCisvKgorICogU3luY2hyb25vdXMgUFBQL0Npc2NvIGxpbmsgbGV2ZWwgc3Vicm91dGluZXMuCisgKiBLZWVwYWxpdmUgcHJvdG9jb2wgaW1wbGVtZW50ZWQgaW4gYm90aCBDaXNjbyBhbmQgUFBQIG1vZGVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NCBDcm9ueXggTHRkLgorICogQXV0aG9yOiBTZXJnZSBWYWt1bGVua28sIDx2YWtAemVidWIubXNrLnN1PgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aCBOTyBXQVJSQU5USUVTLCBub3QgZXZlbiB0aGUgaW1wbGllZAorICogd2FycmFudGllcyBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEF1dGhvcnMgZ3JhbnQgYW55IG90aGVyIHBlcnNvbnMgb3Igb3JnYW5pc2F0aW9ucyBwZXJtaXNzaW9uIHRvIHVzZQorICogb3IgbW9kaWZ5IHRoaXMgc29mdHdhcmUgYXMgbG9uZyBhcyB0aGlzIG1lc3NhZ2UgaXMga2VwdCB3aXRoIHRoZSBzb2Z0d2FyZSwKKyAqIGFsbCBkZXJpdmF0aXZlIHdvcmtzIG9yIG1vZGlmaWVkIHZlcnNpb25zLgorICoKKyAqIFZlcnNpb24gMS45LCBXZWQgT2N0ICA0IDE4OjU4OjE1IE1TSyAxOTk1CisgKgorICogJElkOiBzeW5jcHBwLmMsdiAxLjE4IDIwMDAvMDQvMTEgMDU6MjU6MzEgYXNqIEV4cCAkCisgKi8KKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorCisjaW5jbHVkZSA8bmV0L3N5bmNwcHAuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIE1BWEFMSVZFQ05UICAgICA2ICAgICAgICAgICAgICAgLyogbWF4LiBhbGl2ZSBwYWNrZXRzICovCisKKyNkZWZpbmUgUFBQX0FMTFNUQVRJT05TIDB4ZmYgICAgICAgICAgICAvKiBBbGwtU3RhdGlvbnMgYnJvYWRjYXN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgUFBQX1VJICAgICAgICAgIDB4MDMgICAgICAgICAgICAvKiBVbm51bWJlcmVkIEluZm9ybWF0aW9uICovCisjZGVmaW5lIFBQUF9JUCAgICAgICAgICAweDAwMjEgICAgICAgICAgLyogSW50ZXJuZXQgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0lTTyAgICAgICAgIDB4MDAyMyAgICAgICAgICAvKiBJU08gT1NJIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9YTlMgICAgICAgICAweDAwMjUgICAgICAgICAgLyogWGVyb3ggTlMgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0lQWCAgICAgICAgIDB4MDAyYiAgICAgICAgICAvKiBOb3ZlbGwgSVBYIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9MQ1AgICAgICAgICAweGMwMjEgICAgICAgICAgLyogTGluayBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9JUENQICAgICAgICAweDgwMjEgICAgICAgICAgLyogSW50ZXJuZXQgUHJvdG9jb2wgQ29udHJvbCBQcm90b2NvbCAqLworCisjZGVmaW5lIExDUF9DT05GX1JFUSAgICAxICAgICAgICAgICAgICAgLyogUFBQIExDUCBjb25maWd1cmUgcmVxdWVzdCAqLworI2RlZmluZSBMQ1BfQ09ORl9BQ0sgICAgMiAgICAgICAgICAgICAgIC8qIFBQUCBMQ1AgY29uZmlndXJlIGFja25vd2xlZGdlICovCisjZGVmaW5lIExDUF9DT05GX05BSyAgICAzICAgICAgICAgICAgICAgLyogUFBQIExDUCBjb25maWd1cmUgbmVnYXRpdmUgYWNrICovCisjZGVmaW5lIExDUF9DT05GX1JFSiAgICA0ICAgICAgICAgICAgICAgLyogUFBQIExDUCBjb25maWd1cmUgcmVqZWN0ICovCisjZGVmaW5lIExDUF9URVJNX1JFUSAgICA1ICAgICAgICAgICAgICAgLyogUFBQIExDUCB0ZXJtaW5hdGUgcmVxdWVzdCAqLworI2RlZmluZSBMQ1BfVEVSTV9BQ0sgICAgNiAgICAgICAgICAgICAgIC8qIFBQUCBMQ1AgdGVybWluYXRlIGFja25vd2xlZGdlICovCisjZGVmaW5lIExDUF9DT0RFX1JFSiAgICA3ICAgICAgICAgICAgICAgLyogUFBQIExDUCBjb2RlIHJlamVjdCAqLworI2RlZmluZSBMQ1BfUFJPVE9fUkVKICAgOCAgICAgICAgICAgICAgIC8qIFBQUCBMQ1AgcHJvdG9jb2wgcmVqZWN0ICovCisjZGVmaW5lIExDUF9FQ0hPX1JFUSAgICA5ICAgICAgICAgICAgICAgLyogUFBQIExDUCBlY2hvIHJlcXVlc3QgKi8KKyNkZWZpbmUgTENQX0VDSE9fUkVQTFkgIDEwICAgICAgICAgICAgICAvKiBQUFAgTENQIGVjaG8gcmVwbHkgKi8KKyNkZWZpbmUgTENQX0RJU0NfUkVRICAgIDExICAgICAgICAgICAgICAvKiBQUFAgTENQIGRpc2NhcmQgcmVxdWVzdCAqLworCisjZGVmaW5lIExDUF9PUFRfTVJVICAgICAgICAgICAgIDEgICAgICAgLyogbWF4aW11bSByZWNlaXZlIHVuaXQgKi8KKyNkZWZpbmUgTENQX09QVF9BU1lOQ19NQVAgICAgICAgMiAgICAgICAvKiBhc3luYyBjb250cm9sIGNoYXJhY3RlciBtYXAgKi8KKyNkZWZpbmUgTENQX09QVF9BVVRIX1BST1RPICAgICAgMyAgICAgICAvKiBhdXRoZW50aWNhdGlvbiBwcm90b2NvbCAqLworI2RlZmluZSBMQ1BfT1BUX1FVQUxfUFJPVE8gICAgICA0ICAgICAgIC8qIHF1YWxpdHkgcHJvdG9jb2wgKi8KKyNkZWZpbmUgTENQX09QVF9NQUdJQyAgICAgICAgICAgNSAgICAgICAvKiBtYWdpYyBudW1iZXIgKi8KKyNkZWZpbmUgTENQX09QVF9SRVNFUlZFRCAgICAgICAgNiAgICAgICAvKiByZXNlcnZlZCAqLworI2RlZmluZSBMQ1BfT1BUX1BST1RPX0NPTVAgICAgICA3ICAgICAgIC8qIHByb3RvY29sIGZpZWxkIGNvbXByZXNzaW9uICovCisjZGVmaW5lIExDUF9PUFRfQUREUl9DT01QICAgICAgIDggICAgICAgLyogYWRkcmVzcy9jb250cm9sIGZpZWxkIGNvbXByZXNzaW9uICovCisKKyNkZWZpbmUgSVBDUF9DT05GX1JFUSAgIExDUF9DT05GX1JFUSAgICAvKiBQUFAgSVBDUCBjb25maWd1cmUgcmVxdWVzdCAqLworI2RlZmluZSBJUENQX0NPTkZfQUNLICAgTENQX0NPTkZfQUNLICAgIC8qIFBQUCBJUENQIGNvbmZpZ3VyZSBhY2tub3dsZWRnZSAqLworI2RlZmluZSBJUENQX0NPTkZfTkFLICAgTENQX0NPTkZfTkFLICAgIC8qIFBQUCBJUENQIGNvbmZpZ3VyZSBuZWdhdGl2ZSBhY2sgKi8KKyNkZWZpbmUgSVBDUF9DT05GX1JFSiAgIExDUF9DT05GX1JFSiAgICAvKiBQUFAgSVBDUCBjb25maWd1cmUgcmVqZWN0ICovCisjZGVmaW5lIElQQ1BfVEVSTV9SRVEgICBMQ1BfVEVSTV9SRVEgICAgLyogUFBQIElQQ1AgdGVybWluYXRlIHJlcXVlc3QgKi8KKyNkZWZpbmUgSVBDUF9URVJNX0FDSyAgIExDUF9URVJNX0FDSyAgICAvKiBQUFAgSVBDUCB0ZXJtaW5hdGUgYWNrbm93bGVkZ2UgKi8KKyNkZWZpbmUgSVBDUF9DT0RFX1JFSiAgIExDUF9DT0RFX1JFSiAgICAvKiBQUFAgSVBDUCBjb2RlIHJlamVjdCAqLworCisjZGVmaW5lIENJU0NPX01VTFRJQ0FTVCAgICAgICAgIDB4OGYgICAgLyogQ2lzY28gbXVsdGljYXN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0lTQ09fVU5JQ0FTVCAgICAgICAgICAgMHgwZiAgICAvKiBDaXNjbyB1bmljYXN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgQ0lTQ09fS0VFUEFMSVZFICAgICAgICAgMHg4MDM1ICAvKiBDaXNjbyBrZWVwYWxpdmUgcHJvdG9jb2wgKi8KKyNkZWZpbmUgQ0lTQ09fQUREUl9SRVEgICAgICAgICAgMCAgICAgICAvKiBDaXNjbyBhZGRyZXNzIHJlcXVlc3QgKi8KKyNkZWZpbmUgQ0lTQ09fQUREUl9SRVBMWSAgICAgICAgMSAgICAgICAvKiBDaXNjbyBhZGRyZXNzIHJlcGx5ICovCisjZGVmaW5lIENJU0NPX0tFRVBBTElWRV9SRVEgICAgIDIgICAgICAgLyogQ2lzY28ga2VlcGFsaXZlIHJlcXVlc3QgKi8KKworc3RydWN0IHBwcF9oZWFkZXIgeworCXU4IGFkZHJlc3M7CisJdTggY29udHJvbDsKKwl1MTYgcHJvdG9jb2w7Cit9OworI2RlZmluZSBQUFBfSEVBREVSX0xFTiAgICAgICAgICBzaXplb2YgKHN0cnVjdCBwcHBfaGVhZGVyKQorCitzdHJ1Y3QgbGNwX2hlYWRlciB7CisJdTggdHlwZTsKKwl1OCBpZGVudDsKKwl1MTYgbGVuOworfTsKKyNkZWZpbmUgTENQX0hFQURFUl9MRU4gICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgbGNwX2hlYWRlcikKKworc3RydWN0IGNpc2NvX3BhY2tldCB7CisJdTMyIHR5cGU7CisJdTMyIHBhcjE7CisJdTMyIHBhcjI7CisJdTE2IHJlbDsKKwl1MTYgdGltZTA7CisJdTE2IHRpbWUxOworfTsKKyNkZWZpbmUgQ0lTQ09fUEFDS0VUX0xFTiAxOAorI2RlZmluZSBDSVNDT19CSUdfUEFDS0VUX0xFTiAyMAorCitzdGF0aWMgc3RydWN0IHNwcHAgKnNwcHBxOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHNwcHBfa2VlcGFsaXZlX3RpbWVyOworc3RhdGljIERFRklORV9TUElOTE9DSyhzcHBwcV9sb2NrKTsKKworLyogZ2xvYmFsIHhtaXQgcXVldWUgZm9yIHNlbmRpbmcgcGFja2V0cyB3aGlsZSBzcGlubG9jayBpcyBoZWxkICovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmZfaGVhZCB0eF9xdWV1ZTsKKworc3RhdGljIHZvaWQgc3BwcF9rZWVwYWxpdmUgKHVuc2lnbmVkIGxvbmcgZHVtbXkpOworc3RhdGljIHZvaWQgc3BwcF9jcF9zZW5kIChzdHJ1Y3Qgc3BwcCAqc3AsIHUxNiBwcm90bywgdTggdHlwZSwKKwl1OCBpZGVudCwgdTE2IGxlbiwgdm9pZCAqZGF0YSk7CitzdGF0aWMgdm9pZCBzcHBwX2Npc2NvX3NlbmQgKHN0cnVjdCBzcHBwICpzcCwgaW50IHR5cGUsIGxvbmcgcGFyMSwgbG9uZyBwYXIyKTsKK3N0YXRpYyB2b2lkIHNwcHBfbGNwX2lucHV0IChzdHJ1Y3Qgc3BwcCAqc3AsIHN0cnVjdCBza19idWZmICptKTsKK3N0YXRpYyB2b2lkIHNwcHBfY2lzY29faW5wdXQgKHN0cnVjdCBzcHBwICpzcCwgc3RydWN0IHNrX2J1ZmYgKm0pOworc3RhdGljIHZvaWQgc3BwcF9pcGNwX2lucHV0IChzdHJ1Y3Qgc3BwcCAqc3AsIHN0cnVjdCBza19idWZmICptKTsKK3N0YXRpYyB2b2lkIHNwcHBfbGNwX29wZW4gKHN0cnVjdCBzcHBwICpzcCk7CitzdGF0aWMgdm9pZCBzcHBwX2lwY3Bfb3BlbiAoc3RydWN0IHNwcHAgKnNwKTsKK3N0YXRpYyBpbnQgc3BwcF9sY3BfY29uZl9wYXJzZV9vcHRpb25zIChzdHJ1Y3Qgc3BwcCAqc3AsIHN0cnVjdCBsY3BfaGVhZGVyICpoLAorCWludCBsZW4sIHUzMiAqbWFnaWMpOworc3RhdGljIHZvaWQgc3BwcF9jcF90aW1lb3V0ICh1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgY2hhciAqc3BwcF9sY3BfdHlwZV9uYW1lICh1OCB0eXBlKTsKK3N0YXRpYyBjaGFyICpzcHBwX2lwY3BfdHlwZV9uYW1lICh1OCB0eXBlKTsKK3N0YXRpYyB2b2lkIHNwcHBfcHJpbnRfYnl0ZXMgKHU4ICpwLCB1MTYgbGVuKTsKKworc3RhdGljIGludCBkZWJ1ZzsKKworLyogRmx1c2ggZ2xvYmFsIG91dGdvaW5nIHBhY2tldCBxdWV1ZSB0byBkZXZfcXVldWVfeG1pdCgpLgorICoKKyAqIGRldl9xdWV1ZV94bWl0KCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQKKyAqIHdoaWNoIG1lYW5zIGl0IGNhbid0IGJlIGNhbGxlZCB3aXRoIHNwaW5sb2NrcyBoZWxkLgorICogSWYgYSBwYWNrZXQgbmVlZHMgdG8gYmUgc2VudCB3aGlsZSBhIHNwaW5sb2NrIGlzIGhlbGQsCisgKiB0aGVuIHB1dCB0aGUgcGFja2V0IGludG8gdHhfcXVldWUsIGFuZCBjYWxsIHNwcHBfZmx1c2hfeG1pdCgpCisgKiBhZnRlciBzcGlubG9jayBpcyByZWxlYXNlZC4KKyAqLworc3RhdGljIHZvaWQgc3BwcF9mbHVzaF94bWl0KHZvaWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZ0eF9xdWV1ZSkpICE9IE5VTEwpCisJCWRldl9xdWV1ZV94bWl0KHNrYik7Cit9CisKKy8qCisgKglJbnRlcmZhY2UgZG93biBzdHViCisgKi8JCisKK3N0YXRpYyB2b2lkIGlmX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BwcCAqc3AgPSAoc3RydWN0IHNwcHAgKilzcHBwX29mKGRldik7CisKKwlzcC0+cHBfbGlua19zdGF0ZT1TUFBQX0xJTktfRE9XTjsKK30KKworLyoKKyAqIFRpbWVvdXQgcm91dGluZSBhY3RpdmF0aW9ucy4KKyAqLworCitzdGF0aWMgdm9pZCBzcHBwX3NldF90aW1lb3V0KHN0cnVjdCBzcHBwICpwLGludCBzKSAKK3sKKwlpZiAoISAocC0+cHBfZmxhZ3MgJiBQUF9USU1PKSkgCisJeworCQlpbml0X3RpbWVyKCZwLT5wcF90aW1lcik7CisJCXAtPnBwX3RpbWVyLmZ1bmN0aW9uPXNwcHBfY3BfdGltZW91dDsKKwkJcC0+cHBfdGltZXIuZXhwaXJlcz1qaWZmaWVzK3MqSFo7CisJCXAtPnBwX3RpbWVyLmRhdGE9KHVuc2lnbmVkIGxvbmcpcDsKKwkJcC0+cHBfZmxhZ3MgfD0gUFBfVElNTzsKKwkJYWRkX3RpbWVyKCZwLT5wcF90aW1lcik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzcHBwX2NsZWFyX3RpbWVvdXQoc3RydWN0IHNwcHAgKnApCit7CisJaWYgKHAtPnBwX2ZsYWdzICYgUFBfVElNTykgCisJeworCQlkZWxfdGltZXIoJnAtPnBwX3RpbWVyKTsKKwkJcC0+cHBfZmxhZ3MgJj0gflBQX1RJTU87IAorCX0KK30KKworLyoqCisgKglzcHBwX2lucHV0IC0JcmVjZWl2ZSBhbmQgcHJvY2VzcyBhIFdBTiBQUFAgZnJhbWUKKyAqCUBza2I6CVRoZSBidWZmZXIgdG8gcHJvY2VzcworICoJQGRldjoJVGhlIGRldmljZSBpdCBhcnJpdmVkIG9uCisgKgorICoJVGhpcyBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGNhcmRzIHRoYXQgZG8gbm90IGhhdmUKKyAqCXRpbWluZyBjb25zdHJhaW50cyBidXQgaXMgbm9ybWFsbHkgY2FsbGVkIGZyb20gdGhlIG5ldHdvcmsgbGF5ZXIKKyAqCWFmdGVyIGludGVycnVwdCBzZXJ2aWNpbmcgdG8gcHJvY2VzcyBmcmFtZXMgcXVldWVkIHZpYSBuZXRpZl9yeCgpLgorICoKKyAqCVdlIHByb2Nlc3MgdGhlIG9wdGlvbnMgaW4gdGhlIGNhcmQuIElmIHRoZSBmcmFtZSBpcyBkZXN0aW5lZCBmb3IKKyAqCXRoZSBwcm90b2NvbCBzdGFja3MgdGhlbiBpdCByZXF1ZXVlcyB0aGUgZnJhbWUgZm9yIHRoZSB1cHBlciBsZXZlbAorICoJcHJvdG9jb2wuIElmIGl0IGlzIGEgY29udHJvbCBmcm9tIGl0IGlzIHByb2Nlc3NlZCBhbmQgZGlzY2FyZGVkCisgKgloZXJlLgorICovCisgCit2b2lkIHNwcHBfaW5wdXQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHBwcF9oZWFkZXIgKmg7CisJc3RydWN0IHNwcHAgKnNwID0gKHN0cnVjdCBzcHBwICopc3BwcF9vZihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlza2ItPmRldj1kZXY7CisJc2tiLT5tYWMucmF3PXNrYi0+ZGF0YTsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1JVTk5JTkcpCisJeworCQkvKiBDb3VudCByZWNlaXZlZCBieXRlcywgYWRkIEZDUyBhbmQgb25lIGZsYWcgKi8KKwkJc3AtPmlieXRlcys9IHNrYi0+bGVuICsgMzsKKwkJc3AtPmlwa3RzKys7CisJfQorCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgUFBQX0hFQURFUl9MRU4pKSB7CisJCS8qIFRvbyBzbWFsbCBwYWNrZXQsIGRyb3AgaXQuICovCisJCWlmIChzcC0+cHBfZmxhZ3MgJiBQUF9ERUJVRykKKwkJCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6IGlucHV0IHBhY2tldCBpcyB0b28gc21hbGwsICVkIGJ5dGVzXG4iLAorCQkJCWRldi0+bmFtZSwgc2tiLT5sZW4pOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEdldCBQUFAgaGVhZGVyLiAqLworCWggPSAoc3RydWN0IHBwcF9oZWFkZXIgKilza2ItPmRhdGE7CisJc2tiX3B1bGwoc2tiLHNpemVvZihzdHJ1Y3QgcHBwX2hlYWRlcikpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwLT5sb2NrLCBmbGFncyk7CisJCisJc3dpdGNoIChoLT5hZGRyZXNzKSB7CisJZGVmYXVsdDogICAgICAgIC8qIEludmFsaWQgUFBQIHBhY2tldC4gKi8KKwkJZ290byBpbnZhbGlkOworCWNhc2UgUFBQX0FMTFNUQVRJT05TOgorCQlpZiAoaC0+Y29udHJvbCAhPSBQUFBfVUkpCisJCQlnb3RvIGludmFsaWQ7CisJCWlmIChzcC0+cHBfZmxhZ3MgJiBQUF9DSVNDTykgeworCQkJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKQorCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogUFBQIHBhY2tldCBpbiBDaXNjbyBtb2RlIDwweCV4IDB4JXggMHgleD5cbiIsCisJCQkJCWRldi0+bmFtZSwKKwkJCQkJaC0+YWRkcmVzcywgaC0+Y29udHJvbCwgbnRvaHMgKGgtPnByb3RvY29sKSk7CisJCQlnb3RvIGRyb3A7CisJCX0KKwkJc3dpdGNoIChudG9ocyAoaC0+cHJvdG9jb2wpKSB7CisJCWRlZmF1bHQ6CisJCQlpZiAoc3AtPmxjcC5zdGF0ZSA9PSBMQ1BfU1RBVEVfT1BFTkVEKQorCQkJCXNwcHBfY3Bfc2VuZCAoc3AsIFBQUF9MQ1AsIExDUF9QUk9UT19SRUosCisJCQkJCSsrc3AtPnBwX3NlcSwgc2tiLT5sZW4gKyAyLAorCQkJCQkmaC0+cHJvdG9jb2wpOworCQkJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKQorCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogaW52YWxpZCBpbnB1dCBwcm90b2NvbCA8MHgleCAweCV4IDB4JXg+XG4iLAorCQkJCQlkZXYtPm5hbWUsCisJCQkJCWgtPmFkZHJlc3MsIGgtPmNvbnRyb2wsIG50b2hzIChoLT5wcm90b2NvbCkpOworCQkJZ290byBkcm9wOworCQljYXNlIFBQUF9MQ1A6CisJCQlzcHBwX2xjcF9pbnB1dCAoc3AsIHNrYik7CisJCQlnb3RvIGRyb3A7CisJCWNhc2UgUFBQX0lQQ1A6CisJCQlpZiAoc3AtPmxjcC5zdGF0ZSA9PSBMQ1BfU1RBVEVfT1BFTkVEKQorCQkJCXNwcHBfaXBjcF9pbnB1dCAoc3AsIHNrYik7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIklQQ1Agd2hlbiBzdGlsbCB3YWl0aW5nIExDUCBmaW5pc2guXG4iKTsKKwkJCWdvdG8gZHJvcDsKKwkJY2FzZSBQUFBfSVA6CisJCQlpZiAoc3AtPmlwY3Auc3RhdGUgPT0gSVBDUF9TVEFURV9PUEVORUQpIHsKKwkJCQlpZihzcC0+cHBfZmxhZ3MmUFBfREVCVUcpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICJZb3cgYW4gSVAgZnJhbWUuXG4iKTsKKwkJCQlza2ItPnByb3RvY29sPWh0b25zKEVUSF9QX0lQKTsKKwkJCQluZXRpZl9yeChza2IpOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJZ290byBkb25lOworCQkJfQorCQkJYnJlYWs7CisjaWZkZWYgSVBYCisJCWNhc2UgUFBQX0lQWDoKKwkJCS8qIElQWCBJUFhDUCBub3QgaW1wbGVtZW50ZWQgeWV0ICovCisJCQlpZiAoc3AtPmxjcC5zdGF0ZSA9PSBMQ1BfU1RBVEVfT1BFTkVEKSB7CisJCQkJc2tiLT5wcm90b2NvbD1odG9ucyhFVEhfUF9JUFgpOworCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCQl9CisJCWJyZWFrOworCWNhc2UgQ0lTQ09fTVVMVElDQVNUOgorCWNhc2UgQ0lTQ09fVU5JQ0FTVDoKKwkJLyogRG9uJ3QgY2hlY2sgdGhlIGNvbnRyb2wgZmllbGQgaGVyZSAoUkZDIDE1NDcpLiAqLworCQlpZiAoISAoc3AtPnBwX2ZsYWdzICYgUFBfQ0lTQ08pKSB7CisJCQlpZiAoc3AtPnBwX2ZsYWdzICYgUFBfREVCVUcpCisJCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBDaXNjbyBwYWNrZXQgaW4gUFBQIG1vZGUgPDB4JXggMHgleCAweCV4PlxuIiwKKwkJCQkJZGV2LT5uYW1lLAorCQkJCQloLT5hZGRyZXNzLCBoLT5jb250cm9sLCBudG9ocyAoaC0+cHJvdG9jb2wpKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCQlzd2l0Y2ggKG50b2hzIChoLT5wcm90b2NvbCkpIHsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gaW52YWxpZDsKKwkJY2FzZSBDSVNDT19LRUVQQUxJVkU6CisJCQlzcHBwX2Npc2NvX2lucHV0IChzcCwgc2tiKTsKKwkJCWdvdG8gZHJvcDsKKyNpZmRlZiBDT05GSUdfSU5FVAorCQljYXNlIEVUSF9QX0lQOgorCQkJc2tiLT5wcm90b2NvbD1odG9ucyhFVEhfUF9JUCk7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCWdvdG8gZG9uZTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19JUFgKKwkJY2FzZSBFVEhfUF9JUFg6CisJCQlza2ItPnByb3RvY29sPWh0b25zKEVUSF9QX0lQWCk7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCWdvdG8gZG9uZTsKKyNlbmRpZgorCQl9CisJCWJyZWFrOworCX0KKwlnb3RvIGRyb3A7CisKK2ludmFsaWQ6CisJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKQorCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGludmFsaWQgaW5wdXQgcGFja2V0IDwweCV4IDB4JXggMHgleD5cbiIsCisJCQlkZXYtPm5hbWUsIGgtPmFkZHJlc3MsIGgtPmNvbnRyb2wsIG50b2hzIChoLT5wcm90b2NvbCkpOworZHJvcDoKKwlrZnJlZV9za2Ioc2tiKTsKK2RvbmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPmxvY2ssIGZsYWdzKTsKKwlzcHBwX2ZsdXNoX3htaXQoKTsKKwlyZXR1cm47Cit9CisKK0VYUE9SVF9TWU1CT0woc3BwcF9pbnB1dCk7CisKKy8qCisgKglIYW5kbGUgdHJhbnNtaXQgcGFja2V0cy4KKyAqLworIAorc3RhdGljIGludCBzcHBwX2hhcmRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTE2IHR5cGUsCisJCXZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc3BwcCAqc3AgPSAoc3RydWN0IHNwcHAgKilzcHBwX29mKGRldik7CisJc3RydWN0IHBwcF9oZWFkZXIgKmg7CisJc2tiX3B1c2goc2tiLHNpemVvZihzdHJ1Y3QgcHBwX2hlYWRlcikpOworCWg9KHN0cnVjdCBwcHBfaGVhZGVyICopc2tiLT5kYXRhOworCWlmKHNwLT5wcF9mbGFncyZQUF9DSVNDTykKKwl7CisJCWgtPmFkZHJlc3MgPSBDSVNDT19VTklDQVNUOworCQloLT5jb250cm9sID0gMDsKKwl9CisJZWxzZQorCXsKKwkJaC0+YWRkcmVzcyA9IFBQUF9BTExTVEFUSU9OUzsKKwkJaC0+Y29udHJvbCA9IFBQUF9VSTsKKwl9CisJaWYoc3AtPnBwX2ZsYWdzICYgUFBfQ0lTQ08pCisJeworCQloLT5wcm90b2NvbCA9IGh0b25zKHR5cGUpOworCX0KKwllbHNlIHN3aXRjaCh0eXBlKQorCXsKKwkJY2FzZSBFVEhfUF9JUDoKKwkJCWgtPnByb3RvY29sID0gaHRvbnMoUFBQX0lQKTsKKwkJCWJyZWFrOworCQljYXNlIEVUSF9QX0lQWDoKKwkJCWgtPnByb3RvY29sID0gaHRvbnMoUFBQX0lQWCk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgcHBwX2hlYWRlcik7Cit9CisKK3N0YXRpYyBpbnQgc3BwcF9yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAwOworfQorCisvKgorICogU2VuZCBrZWVwYWxpdmUgcGFja2V0cywgZXZlcnkgMTAgc2Vjb25kcy4KKyAqLworCitzdGF0aWMgdm9pZCBzcHBwX2tlZXBhbGl2ZSAodW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwlzdHJ1Y3Qgc3BwcCAqc3A7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzcHBwcV9sb2NrLCBmbGFncyk7CisKKwlmb3IgKHNwPXNwcHBxOyBzcDsgc3A9c3AtPnBwX25leHQpIAorCXsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNwLT5wcF9pZjsKKworCQkvKiBLZWVwYWxpdmUgbW9kZSBkaXNhYmxlZCBvciBjaGFubmVsIGRvd24/ICovCisJCWlmICghIChzcC0+cHBfZmxhZ3MgJiBQUF9LRUVQQUxJVkUpIHx8CisJCSAgICAhIChkZXYtPmZsYWdzICYgSUZGX1VQKSkKKwkJCWNvbnRpbnVlOworCisJCXNwaW5fbG9jaygmc3AtPmxvY2spOworCisJCS8qIE5vIGtlZXBhbGl2ZSBpbiBQUFAgbW9kZSBpZiBMQ1Agbm90IG9wZW5lZCB5ZXQuICovCisJCWlmICghIChzcC0+cHBfZmxhZ3MgJiBQUF9DSVNDTykgJiYKKwkJICAgIHNwLT5sY3Auc3RhdGUgIT0gTENQX1NUQVRFX09QRU5FRCkgeworCQkJc3Bpbl91bmxvY2soJnNwLT5sb2NrKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHNwLT5wcF9hbGl2ZWNudCA9PSBNQVhBTElWRUNOVCkgeworCQkJLyogTm8ga2VlcGFsaXZlIHBhY2tldHMgZ290LiAgU3RvcCB0aGUgaW50ZXJmYWNlLiAqLworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBwcm90b2NvbCBkb3duXG4iLCBkZXYtPm5hbWUpOworCQkJaWZfZG93biAoZGV2KTsKKwkJCWlmICghIChzcC0+cHBfZmxhZ3MgJiBQUF9DSVNDTykpIHsKKwkJCQkvKiBTaHV0IGRvd24gdGhlIFBQUCBsaW5rLiAqLworCQkJCXNwLT5sY3AubWFnaWMgPSBqaWZmaWVzOworCQkJCXNwLT5sY3Auc3RhdGUgPSBMQ1BfU1RBVEVfQ0xPU0VEOworCQkJCXNwLT5pcGNwLnN0YXRlID0gSVBDUF9TVEFURV9DTE9TRUQ7CisJCQkJc3BwcF9jbGVhcl90aW1lb3V0IChzcCk7CisJCQkJLyogSW5pdGlhdGUgbmVnb3RpYXRpb24uICovCisJCQkJc3BwcF9sY3Bfb3BlbiAoc3ApOworCQkJfQorCQl9CisJCWlmIChzcC0+cHBfYWxpdmVjbnQgPD0gTUFYQUxJVkVDTlQpCisJCQkrK3NwLT5wcF9hbGl2ZWNudDsKKwkJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0NJU0NPKQorCQkJc3BwcF9jaXNjb19zZW5kIChzcCwgQ0lTQ09fS0VFUEFMSVZFX1JFUSwgKytzcC0+cHBfc2VxLAorCQkJCXNwLT5wcF9yc2VxKTsKKwkJZWxzZSBpZiAoc3AtPmxjcC5zdGF0ZSA9PSBMQ1BfU1RBVEVfT1BFTkVEKSB7CisJCQlsb25nIG5tYWdpYyA9IGh0b25sIChzcC0+bGNwLm1hZ2ljKTsKKwkJCXNwLT5sY3AuZWNob2lkID0gKytzcC0+cHBfc2VxOworCQkJc3BwcF9jcF9zZW5kIChzcCwgUFBQX0xDUCwgTENQX0VDSE9fUkVRLAorCQkJCXNwLT5sY3AuZWNob2lkLCA0LCAmbm1hZ2ljKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZzcC0+bG9jayk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwcHBxX2xvY2ssIGZsYWdzKTsKKwlzcHBwX2ZsdXNoX3htaXQoKTsKKwlzcHBwX2tlZXBhbGl2ZV90aW1lci5leHBpcmVzPWppZmZpZXMrMTAqSFo7CisJYWRkX3RpbWVyKCZzcHBwX2tlZXBhbGl2ZV90aW1lcik7Cit9CisKKy8qCisgKiBIYW5kbGUgaW5jb21pbmcgUFBQIExpbmsgQ29udHJvbCBQcm90b2NvbCBwYWNrZXRzLgorICovCisgCitzdGF0aWMgdm9pZCBzcHBwX2xjcF9pbnB1dCAoc3RydWN0IHNwcHAgKnNwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsY3BfaGVhZGVyICpoOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzcC0+cHBfaWY7CisJaW50IGxlbiA9IHNrYi0+bGVuOworCXU4ICpwLCBvcHRbNl07CisJdTMyIHJtYWdpYzsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgbGNwX2hlYWRlcikpKSB7CisJCWlmIChzcC0+cHBfZmxhZ3MgJiBQUF9ERUJVRykKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogaW52YWxpZCBsY3AgcGFja2V0IGxlbmd0aDogJWQgYnl0ZXNcbiIsCisJCQkJZGV2LT5uYW1lLCBsZW4pOworCQlyZXR1cm47CisJfQorCWggPSAoc3RydWN0IGxjcF9oZWFkZXIgKilza2ItPmRhdGE7CisJc2tiX3B1bGwoc2tiLHNpemVvZihzdHJ1Y3QgbGNwX2hlYWRlciAqKSk7CisJCisJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKSAKKwl7CisJCWNoYXIgc3RhdGUgPSAnPyc7CisJCXN3aXRjaCAoc3AtPmxjcC5zdGF0ZSkgeworCQljYXNlIExDUF9TVEFURV9DTE9TRUQ6ICAgc3RhdGUgPSAnQyc7IGJyZWFrOworCQljYXNlIExDUF9TVEFURV9BQ0tfUkNWRDogc3RhdGUgPSAnUic7IGJyZWFrOworCQljYXNlIExDUF9TVEFURV9BQ0tfU0VOVDogc3RhdGUgPSAnUyc7IGJyZWFrOworCQljYXNlIExDUF9TVEFURV9PUEVORUQ6ICAgc3RhdGUgPSAnTyc7IGJyZWFrOworCQl9CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogbGNwIGlucHV0KCVjKTogJWQgYnl0ZXMgPCVzIGlkPSV4aCBsZW49JXhoIiwKKwkJCWRldi0+bmFtZSwgc3RhdGUsIGxlbiwKKwkJCXNwcHBfbGNwX3R5cGVfbmFtZSAoaC0+dHlwZSksIGgtPmlkZW50LCBudG9ocyAoaC0+bGVuKSk7CisJCWlmIChsZW4gPiA0KQorCQkJc3BwcF9wcmludF9ieXRlcyAoKHU4KikgKGgrMSksIGxlbi00KTsKKwkJcHJpbnRrICgiPlxuIik7CisJfQorCWlmIChsZW4gPiBudG9ocyAoaC0+bGVuKSkKKwkJbGVuID0gbnRvaHMgKGgtPmxlbik7CisJc3dpdGNoIChoLT50eXBlKSB7CisJZGVmYXVsdDoKKwkJLyogVW5rbm93biBwYWNrZXQgdHlwZSAtLSBzZW5kIENvZGUtUmVqZWN0IHBhY2tldC4gKi8KKwkJc3BwcF9jcF9zZW5kIChzcCwgUFBQX0xDUCwgTENQX0NPREVfUkVKLCArK3NwLT5wcF9zZXEsCisJCQlza2ItPmxlbiwgaCk7CisJCWJyZWFrOworCWNhc2UgTENQX0NPTkZfUkVROgorCQlpZiAobGVuIDwgNCkgeworCQkJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKQorCQkJCXByaW50ayAoS0VSTl9ERUJVRyIlczogaW52YWxpZCBsY3AgY29uZmlndXJlIHJlcXVlc3QgcGFja2V0IGxlbmd0aDogJWQgYnl0ZXNcbiIsCisJCQkJCWRldi0+bmFtZSwgbGVuKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChsZW4+NCAmJiAhc3BwcF9sY3BfY29uZl9wYXJzZV9vcHRpb25zIChzcCwgaCwgbGVuLCAmcm1hZ2ljKSkKKwkJCWdvdG8gYmFkcmVxOworCQlpZiAocm1hZ2ljID09IHNwLT5sY3AubWFnaWMpIHsKKwkJCS8qIExvY2FsIGFuZCByZW1vdGUgbWFnaWNzIGVxdWFsIC0tIGxvb3BiYWNrPyAqLworCQkJaWYgKHNwLT5wcF9sb29wY250ID49IE1BWEFMSVZFQ05UKjUpIHsKKwkJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGxvb3BiYWNrXG4iLAorCQkJCQlkZXYtPm5hbWUpOworCQkJCXNwLT5wcF9sb29wY250ID0gMDsKKwkJCQlpZiAoZGV2LT5mbGFncyAmIElGRl9VUCkgeworCQkJCQlpZl9kb3duIChkZXYpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoc3AtPnBwX2ZsYWdzICYgUFBfREVCVUcpCisJCQkJcHJpbnRrIChLRVJOX0RFQlVHICIlczogY29uZiByZXE6IG1hZ2ljIGdsaXRjaFxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKKwkJCSsrc3AtPnBwX2xvb3BjbnQ7CisKKwkJCS8qIE1VU1Qgc2VuZCBDb25mLU5hY2sgcGFja2V0LiAqLworCQkJcm1hZ2ljID0gfnNwLT5sY3AubWFnaWM7CisJCQlvcHRbMF0gPSBMQ1BfT1BUX01BR0lDOworCQkJb3B0WzFdID0gc2l6ZW9mIChvcHQpOworCQkJb3B0WzJdID0gcm1hZ2ljID4+IDI0OworCQkJb3B0WzNdID0gcm1hZ2ljID4+IDE2OworCQkJb3B0WzRdID0gcm1hZ2ljID4+IDg7CisJCQlvcHRbNV0gPSBybWFnaWM7CisJCQlzcHBwX2NwX3NlbmQgKHNwLCBQUFBfTENQLCBMQ1BfQ09ORl9OQUssCisJCQkJaC0+aWRlbnQsIHNpemVvZiAob3B0KSwgJm9wdCk7CitiYWRyZXE6CisJCQlzd2l0Y2ggKHNwLT5sY3Auc3RhdGUpIHsKKwkJCWNhc2UgTENQX1NUQVRFX09QRU5FRDoKKwkJCQkvKiBJbml0aWF0ZSByZW5lZ290aWF0aW9uLiAqLworCQkJCXNwcHBfbGNwX29wZW4gKHNwKTsKKwkJCQkvKiBmYWxsIHRocm91Z2guLi4gKi8KKwkJCWNhc2UgTENQX1NUQVRFX0FDS19TRU5UOgorCQkJCS8qIEdvIHRvIGNsb3NlZCBzdGF0ZS4gKi8KKwkJCQlzcC0+bGNwLnN0YXRlID0gTENQX1NUQVRFX0NMT1NFRDsKKwkJCQlzcC0+aXBjcC5zdGF0ZSA9IElQQ1BfU1RBVEVfQ0xPU0VEOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJLyogU2VuZCBDb25maWd1cmUtQWNrIHBhY2tldC4gKi8KKwkJc3AtPnBwX2xvb3BjbnQgPSAwOworCQlpZiAoc3AtPmxjcC5zdGF0ZSAhPSBMQ1BfU1RBVEVfT1BFTkVEKSB7CisJCQlzcHBwX2NwX3NlbmQgKHNwLCBQUFBfTENQLCBMQ1BfQ09ORl9BQ0ssCisJCQkJCWgtPmlkZW50LCBsZW4tNCwgaCsxKTsKKwkJfQorCQkvKiBDaGFuZ2UgdGhlIHN0YXRlLiAqLworCQlzd2l0Y2ggKHNwLT5sY3Auc3RhdGUpIHsKKwkJY2FzZSBMQ1BfU1RBVEVfQ0xPU0VEOgorCQkJc3AtPmxjcC5zdGF0ZSA9IExDUF9TVEFURV9BQ0tfU0VOVDsKKwkJCWJyZWFrOworCQljYXNlIExDUF9TVEFURV9BQ0tfUkNWRDoKKwkJCXNwLT5sY3Auc3RhdGUgPSBMQ1BfU1RBVEVfT1BFTkVEOworCQkJc3BwcF9pcGNwX29wZW4gKHNwKTsKKwkJCWJyZWFrOworCQljYXNlIExDUF9TVEFURV9PUEVORUQ6CisJCQkvKiBSZW1vdGUgbWFnaWMgY2hhbmdlZCAtLSBjbG9zZSBzZXNzaW9uLiAqLworCQkJc3AtPmxjcC5zdGF0ZSA9IExDUF9TVEFURV9DTE9TRUQ7CisJCQlzcC0+aXBjcC5zdGF0ZSA9IElQQ1BfU1RBVEVfQ0xPU0VEOworCQkJLyogSW5pdGlhdGUgcmVuZWdvdGlhdGlvbi4gKi8KKwkJCXNwcHBfbGNwX29wZW4gKHNwKTsKKwkJCS8qIFNlbmQgQUNLIGFmdGVyIG91ciBSRVEgaW4gYXR0ZW1wdCB0byBicmVhayBsb29wICovCisJCQlzcHBwX2NwX3NlbmQgKHNwLCBQUFBfTENQLCBMQ1BfQ09ORl9BQ0ssCisJCQkJCWgtPmlkZW50LCBsZW4tNCwgaCsxKTsKKwkJCXNwLT5sY3Auc3RhdGUgPSBMQ1BfU1RBVEVfQUNLX1NFTlQ7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIExDUF9DT05GX0FDSzoKKwkJaWYgKGgtPmlkZW50ICE9IHNwLT5sY3AuY29uZmlkKQorCQkJYnJlYWs7CisJCXNwcHBfY2xlYXJfdGltZW91dCAoc3ApOworCQlpZiAoKHNwLT5wcF9saW5rX3N0YXRlICE9IFNQUFBfTElOS19VUCkgJiYKKwkJICAgIChkZXYtPmZsYWdzICYgSUZGX1VQKSkgeworCQkJLyogQ29taW5nIG91dCBvZiBsb29wYmFjayBtb2RlLiAqLworCQkJc3AtPnBwX2xpbmtfc3RhdGU9U1BQUF9MSU5LX1VQOworCQkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBwcm90b2NvbCB1cFxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCQlzd2l0Y2ggKHNwLT5sY3Auc3RhdGUpIHsKKwkJY2FzZSBMQ1BfU1RBVEVfQ0xPU0VEOgorCQkJc3AtPmxjcC5zdGF0ZSA9IExDUF9TVEFURV9BQ0tfUkNWRDsKKwkJCXNwcHBfc2V0X3RpbWVvdXQgKHNwLCA1KTsKKwkJCWJyZWFrOworCQljYXNlIExDUF9TVEFURV9BQ0tfU0VOVDoKKwkJCXNwLT5sY3Auc3RhdGUgPSBMQ1BfU1RBVEVfT1BFTkVEOworCQkJc3BwcF9pcGNwX29wZW4gKHNwKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgTENQX0NPTkZfTkFLOgorCQlpZiAoaC0+aWRlbnQgIT0gc3AtPmxjcC5jb25maWQpCisJCQlicmVhazsKKwkJcCA9ICh1OCopIChoKzEpOworCQlpZiAobGVuPj0xMCAmJiBwWzBdID09IExDUF9PUFRfTUFHSUMgJiYgcFsxXSA+PSA0KSB7CisJCQlybWFnaWMgPSAodTMyKXBbMl0gPDwgMjQgfAorCQkJCSh1MzIpcFszXSA8PCAxNiB8IHBbNF0gPDwgOCB8IHBbNV07CisJCQlpZiAocm1hZ2ljID09IH5zcC0+bGNwLm1hZ2ljKSB7CisJCQkJaW50IG5ld21hZ2ljOworCQkJCWlmIChzcC0+cHBfZmxhZ3MgJiBQUF9ERUJVRykKKwkJCQkJcHJpbnRrIChLRVJOX0RFQlVHICIlczogY29uZiBuYWs6IG1hZ2ljIGdsaXRjaFxuIiwKKwkJCQkJCWRldi0+bmFtZSk7CisJCQkJZ2V0X3JhbmRvbV9ieXRlcygmbmV3bWFnaWMsIHNpemVvZihuZXdtYWdpYykpOworCQkJCXNwLT5sY3AubWFnaWMgKz0gbmV3bWFnaWM7CisJCQl9IGVsc2UKKwkJCQlzcC0+bGNwLm1hZ2ljID0gcm1hZ2ljOworCQkJfQorCQlpZiAoc3AtPmxjcC5zdGF0ZSAhPSBMQ1BfU1RBVEVfQUNLX1NFTlQpIHsKKwkJCS8qIEdvIHRvIGNsb3NlZCBzdGF0ZS4gKi8KKwkJCXNwLT5sY3Auc3RhdGUgPSBMQ1BfU1RBVEVfQ0xPU0VEOworCQkJc3AtPmlwY3Auc3RhdGUgPSBJUENQX1NUQVRFX0NMT1NFRDsKKwkJfQorCQkvKiBUaGUgbGluayB3aWxsIGJlIHJlbmVnb3RpYXRlZCBhZnRlciB0aW1lb3V0LAorCQkgKiB0byBhdm9pZCBlbmRsZXNzIHJlcS1uYWNrIGxvb3AuICovCisJCXNwcHBfY2xlYXJfdGltZW91dCAoc3ApOworCQlzcHBwX3NldF90aW1lb3V0IChzcCwgMik7CisJCWJyZWFrOworCWNhc2UgTENQX0NPTkZfUkVKOgorCQlpZiAoaC0+aWRlbnQgIT0gc3AtPmxjcC5jb25maWQpCisJCQlicmVhazsKKwkJc3BwcF9jbGVhcl90aW1lb3V0IChzcCk7CisJCS8qIEluaXRpYXRlIHJlbmVnb3RpYXRpb24uICovCisJCXNwcHBfbGNwX29wZW4gKHNwKTsKKwkJaWYgKHNwLT5sY3Auc3RhdGUgIT0gTENQX1NUQVRFX0FDS19TRU5UKSB7CisJCQkvKiBHbyB0byBjbG9zZWQgc3RhdGUuICovCisJCQlzcC0+bGNwLnN0YXRlID0gTENQX1NUQVRFX0NMT1NFRDsKKwkJCXNwLT5pcGNwLnN0YXRlID0gSVBDUF9TVEFURV9DTE9TRUQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBMQ1BfVEVSTV9SRVE6CisJCXNwcHBfY2xlYXJfdGltZW91dCAoc3ApOworCQkvKiBTZW5kIFRlcm1pbmF0ZS1BY2sgcGFja2V0LiAqLworCQlzcHBwX2NwX3NlbmQgKHNwLCBQUFBfTENQLCBMQ1BfVEVSTV9BQ0ssIGgtPmlkZW50LCAwLCBOVUxMKTsKKwkJLyogR28gdG8gY2xvc2VkIHN0YXRlLiAqLworCQlzcC0+bGNwLnN0YXRlID0gTENQX1NUQVRFX0NMT1NFRDsKKwkJc3AtPmlwY3Auc3RhdGUgPSBJUENQX1NUQVRFX0NMT1NFRDsKKwkJLyogSW5pdGlhdGUgcmVuZWdvdGlhdGlvbi4gKi8KKwkJc3BwcF9sY3Bfb3BlbiAoc3ApOworCQlicmVhazsKKwljYXNlIExDUF9URVJNX0FDSzoKKwljYXNlIExDUF9DT0RFX1JFSjoKKwljYXNlIExDUF9QUk9UT19SRUo6CisJCS8qIElnbm9yZSBmb3Igbm93LiAqLworCQlicmVhazsKKwljYXNlIExDUF9ESVNDX1JFUToKKwkJLyogRGlzY2FyZCB0aGUgcGFja2V0LiAqLworCQlicmVhazsKKwljYXNlIExDUF9FQ0hPX1JFUToKKwkJaWYgKHNwLT5sY3Auc3RhdGUgIT0gTENQX1NUQVRFX09QRU5FRCkKKwkJCWJyZWFrOworCQlpZiAobGVuIDwgOCkgeworCQkJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKQorCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogaW52YWxpZCBsY3AgZWNobyByZXF1ZXN0IHBhY2tldCBsZW5ndGg6ICVkIGJ5dGVzXG4iLAorCQkJCQlkZXYtPm5hbWUsIGxlbik7CisJCQlicmVhazsKKwkJfQorCQlpZiAobnRvaGwgKCoobG9uZyopKGgrMSkpID09IHNwLT5sY3AubWFnaWMpIHsKKwkJCS8qIExpbmUgbG9vcGJhY2sgbW9kZSBkZXRlY3RlZC4gKi8KKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogbG9vcGJhY2tcbiIsIGRldi0+bmFtZSk7CisJCQlpZl9kb3duIChkZXYpOworCisJCQkvKiBTaHV0IGRvd24gdGhlIFBQUCBsaW5rLiAqLworCQkJc3AtPmxjcC5zdGF0ZSA9IExDUF9TVEFURV9DTE9TRUQ7CisJCQlzcC0+aXBjcC5zdGF0ZSA9IElQQ1BfU1RBVEVfQ0xPU0VEOworCQkJc3BwcF9jbGVhcl90aW1lb3V0IChzcCk7CisJCQkvKiBJbml0aWF0ZSBuZWdvdGlhdGlvbi4gKi8KKwkJCXNwcHBfbGNwX29wZW4gKHNwKTsKKwkJCWJyZWFrOworCQl9CisJCSoobG9uZyopKGgrMSkgPSBodG9ubCAoc3AtPmxjcC5tYWdpYyk7CisJCXNwcHBfY3Bfc2VuZCAoc3AsIFBQUF9MQ1AsIExDUF9FQ0hPX1JFUExZLCBoLT5pZGVudCwgbGVuLTQsIGgrMSk7CisJCWJyZWFrOworCWNhc2UgTENQX0VDSE9fUkVQTFk6CisJCWlmIChoLT5pZGVudCAhPSBzcC0+bGNwLmVjaG9pZCkKKwkJCWJyZWFrOworCQlpZiAobGVuIDwgOCkgeworCQkJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKQorCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogaW52YWxpZCBsY3AgZWNobyByZXBseSBwYWNrZXQgbGVuZ3RoOiAlZCBieXRlc1xuIiwKKwkJCQkJZGV2LT5uYW1lLCBsZW4pOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKG50b2hsICgqKGxvbmcqKShoKzEpKSAhPSBzcC0+bGNwLm1hZ2ljKQorCQlzcC0+cHBfYWxpdmVjbnQgPSAwOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBIYW5kbGUgaW5jb21pbmcgQ2lzY28ga2VlcGFsaXZlIHByb3RvY29sIHBhY2tldHMuCisgKi8KKworc3RhdGljIHZvaWQgc3BwcF9jaXNjb19pbnB1dCAoc3RydWN0IHNwcHAgKnNwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBjaXNjb19wYWNrZXQgKmg7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNwLT5wcF9pZjsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgY2lzY29fcGFja2V0KSkKKwkgICAgfHwgKHNrYi0+bGVuICE9IENJU0NPX1BBQ0tFVF9MRU4KKwkJJiYgc2tiLT5sZW4gIT0gQ0lTQ09fQklHX1BBQ0tFVF9MRU4pKSB7CisJCWlmIChzcC0+cHBfZmxhZ3MgJiBQUF9ERUJVRykKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogaW52YWxpZCBjaXNjbyBwYWNrZXQgbGVuZ3RoOiAlZCBieXRlc1xuIiwKKwkJCQlkZXYtPm5hbWUsICBza2ItPmxlbik7CisJCXJldHVybjsKKwl9CisJaCA9IChzdHJ1Y3QgY2lzY29fcGFja2V0ICopc2tiLT5kYXRhOworCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBjaXNjb19wYWNrZXQqKSk7CisJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKQorCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGNpc2NvIGlucHV0OiAlZCBieXRlcyA8JXhoICV4aCAleGggJXhoICV4aC0leGg+XG4iLAorCQkJZGV2LT5uYW1lLCAgc2tiLT5sZW4sCisJCQludG9obCAoaC0+dHlwZSksIGgtPnBhcjEsIGgtPnBhcjIsIGgtPnJlbCwKKwkJCWgtPnRpbWUwLCBoLT50aW1lMSk7CisJc3dpdGNoIChudG9obCAoaC0+dHlwZSkpIHsKKwlkZWZhdWx0OgorCQlpZiAoc3AtPnBwX2ZsYWdzICYgUFBfREVCVUcpCisJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IHVua25vd24gY2lzY28gcGFja2V0IHR5cGU6IDB4JXhcbiIsCisJCQkJZGV2LT5uYW1lLCAgbnRvaGwgKGgtPnR5cGUpKTsKKwkJYnJlYWs7CisJY2FzZSBDSVNDT19BRERSX1JFUExZOgorCQkvKiBSZXBseSBvbiBhZGRyZXNzIHJlcXVlc3QsIGlnbm9yZSAqLworCQlicmVhazsKKwljYXNlIENJU0NPX0tFRVBBTElWRV9SRVE6CisJCXNwLT5wcF9hbGl2ZWNudCA9IDA7CisJCXNwLT5wcF9yc2VxID0gbnRvaGwgKGgtPnBhcjEpOworCQlpZiAoc3AtPnBwX3NlcSA9PSBzcC0+cHBfcnNlcSkgeworCQkJLyogTG9jYWwgYW5kIHJlbW90ZSBzZXF1ZW5jZSBudW1iZXJzIGFyZSBlcXVhbC4KKwkJCSAqIFByb2JhYmx5LCB0aGUgbGluZSBpcyBpbiBsb29wYmFjayBtb2RlLiAqLworCQkJaW50IG5ld3NlcTsKKwkJCWlmIChzcC0+cHBfbG9vcGNudCA+PSBNQVhBTElWRUNOVCkgeworCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogbG9vcGJhY2tcbiIsCisJCQkJCWRldi0+bmFtZSk7CisJCQkJc3AtPnBwX2xvb3BjbnQgPSAwOworCQkJCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCQkJCWlmX2Rvd24gKGRldik7CisJCQkJfQorCQkJfQorCQkJKytzcC0+cHBfbG9vcGNudDsKKworCQkJLyogR2VuZXJhdGUgbmV3IGxvY2FsIHNlcXVlbmNlIG51bWJlciAqLworCQkJZ2V0X3JhbmRvbV9ieXRlcygmbmV3c2VxLCBzaXplb2YobmV3c2VxKSk7CisJCQlzcC0+cHBfc2VxIF49IG5ld3NlcTsKKwkJCWJyZWFrOworCQl9CisJCXNwLT5wcF9sb29wY250ID0gMDsKKwkJaWYgKHNwLT5wcF9saW5rX3N0YXRlPT1TUFBQX0xJTktfRE9XTiAmJgorCQkgICAgKGRldi0+ZmxhZ3MgJiBJRkZfVVApKSB7CisJCQlzcC0+cHBfbGlua19zdGF0ZT1TUFBQX0xJTktfVVA7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IHByb3RvY29sIHVwXG4iLCBkZXYtPm5hbWUpOworCQl9CisJCWJyZWFrOworCWNhc2UgQ0lTQ09fQUREUl9SRVE6CisJCS8qIFN0b2xlbiBmcm9tIG5ldC9pcHY0L2RldmluZXQuYyAtLSBTSU9DR0lGQUREUiBpb2N0bCAqLworCQl7CisJCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKwkJc3RydWN0IGluX2lmYWRkciAqaWZhOworCQl1MzIgYWRkciA9IDAsIG1hc2sgPSB+MDsgLyogRklYTUU6IGlzIHRoZSBtYXNrIGNvcnJlY3Q/ICovCisjaWZkZWYgQ09ORklHX0lORVQKKwkJcmN1X3JlYWRfbG9jaygpOworCQlpZiAoKGluX2RldiA9IF9faW5fZGV2X2dldChkZXYpKSAhPSBOVUxMKQorCQl7CisJCQlmb3IgKGlmYT1pbl9kZXYtPmlmYV9saXN0OyBpZmEgIT0gTlVMTDsKKwkJCQlpZmE9aWZhLT5pZmFfbmV4dCkgeworCQkJCWlmIChzdHJjbXAoZGV2LT5uYW1lLCBpZmEtPmlmYV9sYWJlbCkgPT0gMCkgCisJCQkJeworCQkJCQlhZGRyID0gaWZhLT5pZmFfbG9jYWw7CisJCQkJCW1hc2sgPSBpZmEtPmlmYV9tYXNrOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisjZW5kaWYJCQorCQkvKiBJIGhvcGUgYm90aCBhZGRyIGFuZCBtYXNrIGFyZSBpbiB0aGUgbmV0IG9yZGVyICovCisJCXNwcHBfY2lzY29fc2VuZCAoc3AsIENJU0NPX0FERFJfUkVQTFksIGFkZHIsIG1hc2spOworCQlicmVhazsKKwkJfQorCX0KK30KKworCisvKgorICogU2VuZCBQUFAgTENQIHBhY2tldC4KKyAqLworCitzdGF0aWMgdm9pZCBzcHBwX2NwX3NlbmQgKHN0cnVjdCBzcHBwICpzcCwgdTE2IHByb3RvLCB1OCB0eXBlLAorCXU4IGlkZW50LCB1MTYgbGVuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwcHBfaGVhZGVyICpoOworCXN0cnVjdCBsY3BfaGVhZGVyICpsaDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzcC0+cHBfaWY7CisKKwlza2I9YWxsb2Nfc2tiKGRldi0+aGFyZF9oZWFkZXJfbGVuK1BQUF9IRUFERVJfTEVOK0xDUF9IRUFERVJfTEVOK2xlbiwKKwkJR0ZQX0FUT01JQyk7CisJaWYgKHNrYj09TlVMTCkKKwkJcmV0dXJuOworCisJc2tiX3Jlc2VydmUoc2tiLGRldi0+aGFyZF9oZWFkZXJfbGVuKTsKKwkKKwloID0gKHN0cnVjdCBwcHBfaGVhZGVyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgcHBwX2hlYWRlcikpOworCWgtPmFkZHJlc3MgPSBQUFBfQUxMU1RBVElPTlM7ICAgICAgICAvKiBicm9hZGNhc3QgYWRkcmVzcyAqLworCWgtPmNvbnRyb2wgPSBQUFBfVUk7ICAgICAgICAgICAgICAgICAvKiBVbm51bWJlcmVkIEluZm8gKi8KKwloLT5wcm90b2NvbCA9IGh0b25zIChwcm90byk7ICAgICAgICAgLyogTGluayBDb250cm9sIFByb3RvY29sICovCisKKwlsaCA9IChzdHJ1Y3QgbGNwX2hlYWRlciAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGxjcF9oZWFkZXIpKTsKKwlsaC0+dHlwZSA9IHR5cGU7CisJbGgtPmlkZW50ID0gaWRlbnQ7CisJbGgtPmxlbiA9IGh0b25zIChMQ1BfSEVBREVSX0xFTiArIGxlbik7CisKKwlpZiAobGVuKQorCQltZW1jcHkoc2tiX3B1dChza2IsbGVuKSxkYXRhLCBsZW4pOworCisJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogJXMgb3V0cHV0IDwlcyBpZD0leGggbGVuPSV4aCIsCisJCQlkZXYtPm5hbWUsIAorCQkJcHJvdG89PVBQUF9MQ1AgPyAibGNwIiA6ICJpcGNwIiwKKwkJCXByb3RvPT1QUFBfTENQID8gc3BwcF9sY3BfdHlwZV9uYW1lIChsaC0+dHlwZSkgOgorCQkJc3BwcF9pcGNwX3R5cGVfbmFtZSAobGgtPnR5cGUpLCBsaC0+aWRlbnQsCisJCQludG9ocyAobGgtPmxlbikpOworCQlpZiAobGVuKQorCQkJc3BwcF9wcmludF9ieXRlcyAoKHU4KikgKGxoKzEpLCBsZW4pOworCQlwcmludGsgKCI+XG4iKTsKKwl9CisJc3AtPm9ieXRlcyArPSBza2ItPmxlbjsKKwkvKiBDb250cm9sIGlzIGhpZ2ggcHJpb3JpdHkgc28gaXQgZG9lc24ndCBnZXQgcXVldWVkIGJlaGluZCBkYXRhICovCisJc2tiLT5wcmlvcml0eT1UQ19QUklPX0NPTlRST0w7CisJc2tiLT5kZXYgPSBkZXY7CisJc2tiX3F1ZXVlX3RhaWwoJnR4X3F1ZXVlLCBza2IpOworfQorCisvKgorICogU2VuZCBDaXNjbyBrZWVwYWxpdmUgcGFja2V0LgorICovCisKK3N0YXRpYyB2b2lkIHNwcHBfY2lzY29fc2VuZCAoc3RydWN0IHNwcHAgKnNwLCBpbnQgdHlwZSwgbG9uZyBwYXIxLCBsb25nIHBhcjIpCit7CisJc3RydWN0IHBwcF9oZWFkZXIgKmg7CisJc3RydWN0IGNpc2NvX3BhY2tldCAqY2g7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc3AtPnBwX2lmOworCXUzMiB0ID0gamlmZmllcyAqIDEwMDAvSFo7CisKKwlza2I9YWxsb2Nfc2tiKGRldi0+aGFyZF9oZWFkZXJfbGVuK1BQUF9IRUFERVJfTEVOK0NJU0NPX1BBQ0tFVF9MRU4sCisJCUdGUF9BVE9NSUMpOworCisJaWYoc2tiPT1OVUxMKQorCQlyZXR1cm47CisJCQorCXNrYl9yZXNlcnZlKHNrYiwgZGV2LT5oYXJkX2hlYWRlcl9sZW4pOworCWggPSAoc3RydWN0IHBwcF9oZWFkZXIgKilza2JfcHV0IChza2IsIHNpemVvZihzdHJ1Y3QgcHBwX2hlYWRlcikpOworCWgtPmFkZHJlc3MgPSBDSVNDT19NVUxUSUNBU1Q7CisJaC0+Y29udHJvbCA9IDA7CisJaC0+cHJvdG9jb2wgPSBodG9ucyAoQ0lTQ09fS0VFUEFMSVZFKTsKKworCWNoID0gKHN0cnVjdCBjaXNjb19wYWNrZXQqKXNrYl9wdXQoc2tiLCBDSVNDT19QQUNLRVRfTEVOKTsKKwljaC0+dHlwZSA9IGh0b25sICh0eXBlKTsKKwljaC0+cGFyMSA9IGh0b25sIChwYXIxKTsKKwljaC0+cGFyMiA9IGh0b25sIChwYXIyKTsKKwljaC0+cmVsID0gLTE7CisJY2gtPnRpbWUwID0gaHRvbnMgKCh1MTYpICh0ID4+IDE2KSk7CisJY2gtPnRpbWUxID0gaHRvbnMgKCh1MTYpIHQpOworCisJaWYgKHNwLT5wcF9mbGFncyAmIFBQX0RFQlVHKQorCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGNpc2NvIG91dHB1dDogPCV4aCAleGggJXhoICV4aCAleGgtJXhoPlxuIiwKKwkJCWRldi0+bmFtZSwgIG50b2hsIChjaC0+dHlwZSksIGNoLT5wYXIxLAorCQkJY2gtPnBhcjIsIGNoLT5yZWwsIGNoLT50aW1lMCwgY2gtPnRpbWUxKTsKKwlzcC0+b2J5dGVzICs9IHNrYi0+bGVuOworCXNrYi0+cHJpb3JpdHk9VENfUFJJT19DT05UUk9MOworCXNrYi0+ZGV2ID0gZGV2OworCXNrYl9xdWV1ZV90YWlsKCZ0eF9xdWV1ZSwgc2tiKTsKK30KKworLyoqCisgKglzcHBwX2Nsb3NlIC0gY2xvc2UgZG93biBhIHN5bmNocm9ub3VzIFBQUCBvciBDaXNjbyBIRExDIGxpbmsKKyAqCUBkZXY6IFRoZSBuZXR3b3JrIGRldmljZSB0byBkcm9wIHRoZSBsaW5rIG9mCisgKgorICoJVGhpcyBkcm9wcyB0aGUgbG9naWNhbCBpbnRlcmZhY2UgdG8gdGhlIGNoYW5uZWwuIEl0IGlzIG5vdAorICoJZG9uZSBwb2xpdGVseSBhcyB3ZSBhc3N1bWUgd2Ugd2lsbCBhbHNvIGJlIGRyb3BwaW5nIERUUi4gQW55CisgKgl0aW1lb3V0cyBhcmUga2lsbGVkLgorICovCisKK2ludCBzcHBwX2Nsb3NlIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzcHBwICpzcCA9IChzdHJ1Y3Qgc3BwcCAqKXNwcHBfb2YoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwLT5sb2NrLCBmbGFncyk7CisJc3AtPnBwX2xpbmtfc3RhdGUgPSBTUFBQX0xJTktfRE9XTjsKKwlzcC0+bGNwLnN0YXRlID0gTENQX1NUQVRFX0NMT1NFRDsKKwlzcC0+aXBjcC5zdGF0ZSA9IElQQ1BfU1RBVEVfQ0xPU0VEOworCXNwcHBfY2xlYXJfdGltZW91dCAoc3ApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChzcHBwX2Nsb3NlKTsKKworLyoqCisgKglzcHBwX29wZW4gLSBvcGVuIGEgc3luY2hyb25vdXMgUFBQIG9yIENpc2NvIEhETEMgbGluaworICoJQGRldjoJTmV0d29yayBkZXZpY2UgdG8gYWN0aXZhdGUKKyAqCQorICoJQ2xvc2UgZG93biBhbnkgZXhpc3Rpbmcgc3luY2hyb25vdXMgc2Vzc2lvbiBhbmQgY29tbWVuY2UKKyAqCWZyb20gc2NyYXRjaC4gSW4gdGhlIFBQUCBjYXNlIHRoaXMgbWVhbnMgbmVnb3RpYXRpbmcgTENQL0lQQ1AKKyAqCWFuZCBmcmllbmRzLCB3aGlsZSBmb3IgQ2lzY28gSERMQyB3ZSBzaW1wbHkgbmVlZCB0byBzdGFydCBzZW5kaW5nCisgKglrZWVwYWxpdmVzCisgKi8KKworaW50IHNwcHBfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BwcCAqc3AgPSAoc3RydWN0IHNwcHAgKilzcHBwX29mKGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwcHBfY2xvc2UoZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzcC0+bG9jaywgZmxhZ3MpOworCWlmICghKHNwLT5wcF9mbGFncyAmIFBQX0NJU0NPKSkgeworCQlzcHBwX2xjcF9vcGVuIChzcCk7CisJfQorCXNwLT5wcF9saW5rX3N0YXRlID0gU1BQUF9MSU5LX0RPV047CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPmxvY2ssIGZsYWdzKTsKKwlzcHBwX2ZsdXNoX3htaXQoKTsKKworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHNwcHBfb3Blbik7CisKKy8qKgorICoJc3BwcF9yZW9wZW4gLSBub3RpZnkgb2YgcGh5c2ljYWwgbGluayBsb3NzCisgKglAZGV2OiBEZXZpY2UgdGhhdCBsb3N0IHRoZSBsaW5rCisgKgorICoJVGhpcyBmdW5jdGlvbiBpbmZvcm1zIHRoZSBzeW5jaHJvbm91cyBwcm90b2NvbCBjb2RlIHRoYXQKKyAqCXRoZSB1bmRlcmx5aW5nIGxpbmsgZGllZCAoZm9yIGV4YW1wbGUgYSBjYXJyaWVyIGRyb3Agb24gWC4yMSkKKyAqCisgKglXZSBpbmNyZW1lbnQgdGhlIG1hZ2ljIG51bWJlcnMgdG8gZW5zdXJlIHRoYXQgaWYgdGhlIG90aGVyIGVuZAorICoJZmFpbGVkIHRvIG5vdGljZSB3ZSB3aWxsIGNvcnJlY3RseSBzdGFydCBhIG5ldyBzZXNzaW9uLiBJdCBoYXBwZW5zCisgKglkbyB0byB0aGUgbmF0dXJlIG9mIHRlbGNvIGNpcmN1aXRzIGlzIHRoYXQgeW91IGNhbiBsb3NlIGNhcnJpZXIgb24KKyAqCW9uZSBlbmRvbmx5LgorICoKKyAqCUhhdmluZyBkb25lIHRoaXMgd2UgZ28gYmFjayB0byBuZWdvdGlhdGluZy4gVGhpcyBmdW5jdGlvbiBtYXkKKyAqCWJlIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCBjb250ZXh0LgorICovCisgCitpbnQgc3BwcF9yZW9wZW4gKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNwcHAgKnNwID0gKHN0cnVjdCBzcHBwICopc3BwcF9vZihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcHBwX2Nsb3NlKGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3AtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzcC0+cHBfZmxhZ3MgJiBQUF9DSVNDTykpCisJeworCQlzcC0+bGNwLm1hZ2ljID0gamlmZmllczsKKwkJKytzcC0+cHBfc2VxOworCQlzcC0+bGNwLnN0YXRlID0gTENQX1NUQVRFX0NMT1NFRDsKKwkJc3AtPmlwY3Auc3RhdGUgPSBJUENQX1NUQVRFX0NMT1NFRDsKKwkJLyogR2l2ZSBpdCBhIG1vbWVudCBmb3IgdGhlIGxpbmUgdG8gc2V0dGxlIHRoZW4gZ28gKi8KKwkJc3BwcF9zZXRfdGltZW91dCAoc3AsIDEpOworCX0gCisJc3AtPnBwX2xpbmtfc3RhdGU9U1BQUF9MSU5LX0RPV047CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHNwcHBfcmVvcGVuKTsKKworLyoqCisgKglzcHBwX2NoYW5nZV9tdHUgLSBDaGFuZ2UgdGhlIGxpbmsgTVRVCisgKglAZGV2OglEZXZpY2UgdG8gY2hhbmdlIE1UVSBvbgorICoJQG5ld19tdHU6IE5ldyBNVFUKKyAqCisgKglDaGFuZ2UgdGhlIE1UVSBvbiB0aGUgbGluay4gVGhpcyBjYW4gb25seSBiZSBjYWxsZWQgd2l0aAorICoJdGhlIGxpbmsgZG93bi4gSXQgcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgbGluayBpcyB1cCBvcgorICoJdGhlIG10dSBpcyBvdXQgb2YgcmFuZ2UuCisgKi8KKyAKK2ludCBzcHBwX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaWYobmV3X210dTwxMjh8fG5ld19tdHU+UFBQX01UVXx8KGRldi0+ZmxhZ3MmSUZGX1VQKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGV2LT5tdHU9bmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChzcHBwX2NoYW5nZV9tdHUpOworCisvKioKKyAqCXNwcHBfZG9faW9jdGwgLSBJb2N0bCBoYW5kbGVyIGZvciBwcHAvaGRsYworICoJQGRldjogRGV2aWNlIHN1YmplY3QgdG8gaW9jdGwKKyAqCUBpZnI6IEludGVyZmFjZSByZXF1ZXN0IGJsb2NrIGZyb20gdGhlIHVzZXIKKyAqCUBjbWQ6IENvbW1hbmQgdGhhdCBpcyBiZWluZyBpc3N1ZWQKKyAqCQorICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBpb2N0bHMgdGhhdCBtYXkgYmUgaXNzdWVkIGJ5IHRoZSB1c2VyCisgKgl0byBjb250cm9sIHRoZSBzZXR0aW5ncyBvZiBhIFBQUC9IRExDIGxpbmsuIEl0IGRvZXMgYm90aCBidXN5CisgKglhbmQgc2VjdXJpdHkgY2hlY2tzLiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIHdyYXBwZWQgYnkKKyAqCWNhbGxlcnMgd2hvIHdpc2ggdG8gYWRkIGFkZGl0aW9uYWwgaW9jdGwgY2FsbHMgb2YgdGhlaXIgb3duLgorICovCisgCitpbnQgc3BwcF9kb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwlzdHJ1Y3Qgc3BwcCAqc3AgPSAoc3RydWN0IHNwcHAgKilzcHBwX29mKGRldik7CisKKwlpZihkZXYtPmZsYWdzJklGRl9VUCkKKwkJcmV0dXJuIC1FQlVTWTsKKwkJCisJaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJCisJc3dpdGNoKGNtZCkKKwl7CisJCWNhc2UgU1BQUElPQ0NJU0NPOgorCQkJc3AtPnBwX2ZsYWdzfD1QUF9DSVNDTzsKKwkJCWRldi0+dHlwZSA9IEFSUEhSRF9IRExDOworCQkJYnJlYWs7CisJCWNhc2UgU1BQUElPQ1BQUDoKKwkJCXNwLT5wcF9mbGFncyY9flBQX0NJU0NPOworCQkJZGV2LT50eXBlID0gQVJQSFJEX1BQUDsKKwkJCWJyZWFrOworCQljYXNlIFNQUFBJT0NERUJVRzoKKwkJCXNwLT5wcF9mbGFncyY9flBQX0RFQlVHOworCQkJaWYoaWZyLT5pZnJfZmxhZ3MpCisJCQkJc3AtPnBwX2ZsYWdzfD1QUF9ERUJVRzsKKwkJCWJyZWFrOworCQljYXNlIFNQUFBJT0NHRkxBR1M6CisJCQlpZihjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwgJnNwLT5wcF9mbGFncywgc2l6ZW9mKHNwLT5wcF9mbGFncykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnJlYWs7CisJCWNhc2UgU1BQUElPQ1NGTEFHUzoKKwkJCWlmKGNvcHlfZnJvbV91c2VyKCZzcC0+cHBfZmxhZ3MsIGlmci0+aWZyX2RhdGEsIHNpemVvZihzcC0+cHBfZmxhZ3MpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHNwcHBfZG9faW9jdGwpOworCisvKioKKyAqCXNwcHBfYXR0YWNoIC0gYXR0YWNoIHN5bmNocm9ub3VzIFBQUC9IRExDIHRvIGEgZGV2aWNlCisgKglAcGQ6CVBQUCBkZXZpY2UgdG8gaW5pdGlhbGlzZQorICoKKyAqCVRoaXMgaW5pdGlhbGlzZXMgdGhlIFBQUC9IRExDIHN1cHBvcnQgb24gYW4gaW50ZXJmYWNlLiBBdCB0aGUKKyAqCXRpbWUgb2YgY2FsbGluZyB0aGUgZGV2IGVsZW1lbnQgbXVzdCBwb2ludCB0byB0aGUgbmV0d29yayBkZXZpY2UKKyAqCXRoYXQgdGhpcyBpbnRlcmZhY2UgaXMgYXR0YWNoZWQgdG8uIFRoZSBpbnRlcmZhY2Ugc2hvdWxkIG5vdCB5ZXQKKyAqCWJlIHJlZ2lzdGVyZWQuIAorICovCisgCit2b2lkIHNwcHBfYXR0YWNoKHN0cnVjdCBwcHBfZGV2aWNlICpwZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGQtPmRldjsKKwlzdHJ1Y3Qgc3BwcCAqc3AgPSAmcGQtPnNwcHA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIE1ha2Ugc3VyZSBlbWJlZGRpbmcgaXMgc2FmZSBmb3Igc3BwcF9vZiAqLworCUJVR19PTihzcHBwX29mKGRldikgIT0gc3ApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwcHBxX2xvY2ssIGZsYWdzKTsKKwkvKiBJbml0aWFsaXplIGtlZXBhbGl2ZSBoYW5kbGVyLiAqLworCWlmICghIHNwcHBxKQorCXsKKwkJaW5pdF90aW1lcigmc3BwcF9rZWVwYWxpdmVfdGltZXIpOworCQlzcHBwX2tlZXBhbGl2ZV90aW1lci5leHBpcmVzPWppZmZpZXMrMTAqSFo7CisJCXNwcHBfa2VlcGFsaXZlX3RpbWVyLmZ1bmN0aW9uPXNwcHBfa2VlcGFsaXZlOworCQlhZGRfdGltZXIoJnNwcHBfa2VlcGFsaXZlX3RpbWVyKTsKKwl9CisJLyogSW5zZXJ0IG5ldyBlbnRyeSBpbnRvIHRoZSBrZWVwYWxpdmUgbGlzdC4gKi8KKwlzcC0+cHBfbmV4dCA9IHNwcHBxOworCXNwcHBxID0gc3A7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BwcHFfbG9jaywgZmxhZ3MpOworCisJc3AtPnBwX2xvb3BjbnQgPSAwOworCXNwLT5wcF9hbGl2ZWNudCA9IDA7CisJc3AtPnBwX3NlcSA9IDA7CisJc3AtPnBwX3JzZXEgPSAwOworCXNwLT5wcF9mbGFncyA9IFBQX0tFRVBBTElWRXxQUF9DSVNDT3xkZWJ1ZzsvKlBQX0RFQlVHOyovCisJc3AtPmxjcC5tYWdpYyA9IDA7CisJc3AtPmxjcC5zdGF0ZSA9IExDUF9TVEFURV9DTE9TRUQ7CisJc3AtPmlwY3Auc3RhdGUgPSBJUENQX1NUQVRFX0NMT1NFRDsKKwlzcC0+cHBfaWYgPSBkZXY7CisJc3Bpbl9sb2NrX2luaXQoJnNwLT5sb2NrKTsKKwkKKwkvKiAKKwkgKglEZXZpY2Ugc3BlY2lmaWMgc2V0dXAuIEFsbCBidXQgaW50ZXJydXB0IGhhbmRsZXIgYW5kCisJICoJaGFyZF9zdGFydF94bWl0LgorCSAqLworCSAKKwlkZXYtPmhhcmRfaGVhZGVyID0gc3BwcF9oYXJkX2hlYWRlcjsKKwlkZXYtPnJlYnVpbGRfaGVhZGVyID0gc3BwcF9yZWJ1aWxkX2hlYWRlcjsKKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IDEwOworCWRldi0+dHlwZSA9IEFSUEhSRF9IRExDOworCWRldi0+YWRkcl9sZW4gPSAwOworCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gc2l6ZW9mKHN0cnVjdCBwcHBfaGVhZGVyKTsKKwlkZXYtPm10dSA9IFBQUF9NVFU7CisJLyoKKwkgKglUaGVzZSA0IGFyZSBjYWxsZXJzIGJ1dCBNVVNUIGFsc28gY2FsbCBzcHBwXyBmdW5jdGlvbnMKKwkgKi8KKwlkZXYtPmRvX2lvY3RsID0gc3BwcF9kb19pb2N0bDsKKyNpZiAwCisJZGV2LT5nZXRfc3RhdHMgPSBOVUxMOwkJLyogTGV0IHRoZSBkcml2ZXIgb3ZlcnJpZGUgdGhlc2UgKi8KKwlkZXYtPm9wZW4gPSBzcHBwX29wZW47CisJZGV2LT5zdG9wID0gc3BwcF9jbG9zZTsKKyNlbmRpZgkKKwlkZXYtPmNoYW5nZV9tdHUgPSBzcHBwX2NoYW5nZV9tdHU7CisJZGV2LT5oYXJkX2hlYWRlcl9jYWNoZSA9IE5VTEw7CisJZGV2LT5oZWFkZXJfY2FjaGVfdXBkYXRlID0gTlVMTDsKKwlkZXYtPmZsYWdzID0gSUZGX01VTFRJQ0FTVHxJRkZfUE9JTlRPUE9JTlR8SUZGX05PQVJQOworfQorCitFWFBPUlRfU1lNQk9MKHNwcHBfYXR0YWNoKTsKKworLyoqCisgKglzcHBwX2RldGFjaCAtIHJlbGVhc2UgUFBQIHJlc291cmNlcyBmcm9tIGEgZGV2aWNlCisgKglAZGV2OglOZXR3b3JrIGRldmljZSB0byByZWxlYXNlCisgKgorICoJU3RvcCBhbmQgZnJlZSB1cCBhbnkgUFBQL0hETEMgcmVzb3VyY2VzIHVzZWQgYnkgdGhpcworICoJaW50ZXJmYWNlLiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZGV2aWNlIGlzCisgKglmcmVlZC4KKyAqLworIAordm9pZCBzcHBwX2RldGFjaCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BwcCAqKnEsICpwLCAqc3AgPSAoc3RydWN0IHNwcHAgKilzcHBwX29mKGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzcHBwcV9sb2NrLCBmbGFncyk7CisJLyogUmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBrZWVwYWxpdmUgbGlzdC4gKi8KKwlmb3IgKHEgPSAmc3BwcHE7IChwID0gKnEpOyBxID0gJnAtPnBwX25leHQpCisJCWlmIChwID09IHNwKSB7CisJCQkqcSA9IHAtPnBwX25leHQ7CisJCQlicmVhazsKKwkJfQorCisJLyogU3RvcCBrZWVwYWxpdmUgaGFuZGxlci4gKi8KKwlpZiAoISBzcHBwcSkKKwkJZGVsX3RpbWVyKCZzcHBwX2tlZXBhbGl2ZV90aW1lcik7CisJc3BwcF9jbGVhcl90aW1lb3V0IChzcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BwcHFfbG9jaywgZmxhZ3MpOworfQorCitFWFBPUlRfU1lNQk9MKHNwcHBfZGV0YWNoKTsKKworLyoKKyAqIEFuYWx5emUgdGhlIExDUCBDb25maWd1cmUtUmVxdWVzdCBvcHRpb25zIGxpc3QKKyAqIGZvciB0aGUgcHJlc2VuY2Ugb2YgdW5rbm93biBvcHRpb25zLgorICogSWYgdGhlIHJlcXVlc3QgY29udGFpbnMgdW5rbm93biBvcHRpb25zLCBidWlsZCBhbmQKKyAqIHNlbmQgQ29uZmlndXJlLXJlamVjdCBwYWNrZXQsIGNvbnRhaW5pbmcgb25seSB1bmtub3duIG9wdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQKK3NwcHBfbGNwX2NvbmZfcGFyc2Vfb3B0aW9ucyAoc3RydWN0IHNwcHAgKnNwLCBzdHJ1Y3QgbGNwX2hlYWRlciAqaCwKKwlpbnQgbGVuLCB1MzIgKm1hZ2ljKQoreworCXU4ICpidWYsICpyLCAqcDsKKwlpbnQgcmxlbjsKKworCWxlbiAtPSA0OworCWJ1ZiA9IHIgPSBrbWFsbG9jIChsZW4sIEdGUF9BVE9NSUMpOworCWlmICghIGJ1ZikKKwkJcmV0dXJuICgwKTsKKworCXAgPSAodm9pZCopIChoKzEpOworCWZvciAocmxlbj0wOyBsZW4+MSAmJiBwWzFdOyBsZW4tPXBbMV0sIHArPXBbMV0pIHsKKwkJc3dpdGNoICgqcCkgeworCQljYXNlIExDUF9PUFRfTUFHSUM6CisJCQkvKiBNYWdpYyBudW1iZXIgLS0gZXh0cmFjdC4gKi8KKwkJCWlmIChsZW4gPj0gNiAmJiBwWzFdID09IDYpIHsKKwkJCQkqbWFnaWMgPSAodTMyKXBbMl0gPDwgMjQgfAorCQkJCQkodTMyKXBbM10gPDwgMTYgfCBwWzRdIDw8IDggfCBwWzVdOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTENQX09QVF9BU1lOQ19NQVA6CisJCQkvKiBBc3luYyBjb250cm9sIGNoYXJhY3RlciBtYXAgLS0gY2hlY2sgdG8gYmUgemVyby4gKi8KKwkJCWlmIChsZW4gPj0gNiAmJiBwWzFdID09IDYgJiYgISBwWzJdICYmICEgcFszXSAmJgorCQkJICAgICEgcFs0XSAmJiAhIHBbNV0pCisJCQkJY29udGludWU7CisJCQlicmVhazsKKwkJY2FzZSBMQ1BfT1BUX01SVToKKwkJCS8qIE1heGltdW0gcmVjZWl2ZSB1bml0IC0tIGFsd2F5cyBPSy4gKi8KKwkJCWNvbnRpbnVlOworCQlkZWZhdWx0OgorCQkJLyogT3RoZXJzIG5vdCBzdXBwb3J0ZWQuICovCisJCQlicmVhazsKKwkJfQorCQkvKiBBZGQgdGhlIG9wdGlvbiB0byByZWplY3RlZCBsaXN0LiAqLworCQltZW1jcHkociwgcCwgcFsxXSk7CisJCXIgKz0gcFsxXTsKKwkJcmxlbiArPSBwWzFdOworCX0KKwlpZiAocmxlbikKKwkJc3BwcF9jcF9zZW5kIChzcCwgUFBQX0xDUCwgTENQX0NPTkZfUkVKLCBoLT5pZGVudCwgcmxlbiwgYnVmKTsKKwlrZnJlZShidWYpOworCXJldHVybiAocmxlbiA9PSAwKTsKK30KKworc3RhdGljIHZvaWQgc3BwcF9pcGNwX2lucHV0IChzdHJ1Y3Qgc3BwcCAqc3AsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGxjcF9oZWFkZXIgKmg7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNwLT5wcF9pZjsKKwlpbnQgbGVuID0gc2tiLT5sZW47CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGxjcF9oZWFkZXIpKSkgeworCQlpZiAoc3AtPnBwX2ZsYWdzICYgUFBfREVCVUcpCisJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGludmFsaWQgaXBjcCBwYWNrZXQgbGVuZ3RoOiAlZCBieXRlc1xuIiwKKwkJCQlkZXYtPm5hbWUsICBsZW4pOworCQlyZXR1cm47CisJfQorCWggPSAoc3RydWN0IGxjcF9oZWFkZXIgKilza2ItPmRhdGE7CisJc2tiX3B1bGwoc2tiLHNpemVvZihzdHJ1Y3QgbGNwX2hlYWRlcikpOworCWlmIChzcC0+cHBfZmxhZ3MgJiBQUF9ERUJVRykgeworCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IGlwY3AgaW5wdXQ6ICVkIGJ5dGVzIDwlcyBpZD0leGggbGVuPSV4aCIsCisJCQlkZXYtPm5hbWUsICBsZW4sCisJCQlzcHBwX2lwY3BfdHlwZV9uYW1lIChoLT50eXBlKSwgaC0+aWRlbnQsIG50b2hzIChoLT5sZW4pKTsKKwkJaWYgKGxlbiA+IDQpCisJCQlzcHBwX3ByaW50X2J5dGVzICgodTgqKSAoaCsxKSwgbGVuLTQpOworCQlwcmludGsgKCI+XG4iKTsKKwl9CisJaWYgKGxlbiA+IG50b2hzIChoLT5sZW4pKQorCQlsZW4gPSBudG9ocyAoaC0+bGVuKTsKKwlzd2l0Y2ggKGgtPnR5cGUpIHsKKwlkZWZhdWx0OgorCQkvKiBVbmtub3duIHBhY2tldCB0eXBlIC0tIHNlbmQgQ29kZS1SZWplY3QgcGFja2V0LiAqLworCQlzcHBwX2NwX3NlbmQgKHNwLCBQUFBfSVBDUCwgSVBDUF9DT0RFX1JFSiwgKytzcC0+cHBfc2VxLCBsZW4sIGgpOworCQlicmVhazsKKwljYXNlIElQQ1BfQ09ORl9SRVE6CisJCWlmIChsZW4gPCA0KSB7CisJCQlpZiAoc3AtPnBwX2ZsYWdzICYgUFBfREVCVUcpCisJCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBpbnZhbGlkIGlwY3AgY29uZmlndXJlIHJlcXVlc3QgcGFja2V0IGxlbmd0aDogJWQgYnl0ZXNcbiIsCisJCQkJCWRldi0+bmFtZSwgbGVuKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAobGVuID4gNCkgeworCQkJc3BwcF9jcF9zZW5kIChzcCwgUFBQX0lQQ1AsIExDUF9DT05GX1JFSiwgaC0+aWRlbnQsCisJCQkJbGVuLTQsIGgrMSk7CisKKwkJCXN3aXRjaCAoc3AtPmlwY3Auc3RhdGUpIHsKKwkJCWNhc2UgSVBDUF9TVEFURV9PUEVORUQ6CisJCQkJLyogSW5pdGlhdGUgcmVuZWdvdGlhdGlvbi4gKi8KKwkJCQlzcHBwX2lwY3Bfb3BlbiAoc3ApOworCQkJCS8qIGZhbGwgdGhyb3VnaC4uLiAqLworCQkJY2FzZSBJUENQX1NUQVRFX0FDS19TRU5UOgorCQkJCS8qIEdvIHRvIGNsb3NlZCBzdGF0ZS4gKi8KKwkJCQlzcC0+aXBjcC5zdGF0ZSA9IElQQ1BfU1RBVEVfQ0xPU0VEOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogU2VuZCBDb25maWd1cmUtQWNrIHBhY2tldC4gKi8KKwkJCXNwcHBfY3Bfc2VuZCAoc3AsIFBQUF9JUENQLCBJUENQX0NPTkZfQUNLLCBoLT5pZGVudCwKKwkJCQkwLCBOVUxMKTsKKwkJCS8qIENoYW5nZSB0aGUgc3RhdGUuICovCisJCQlpZiAoc3AtPmlwY3Auc3RhdGUgPT0gSVBDUF9TVEFURV9BQ0tfUkNWRCkKKwkJCQlzcC0+aXBjcC5zdGF0ZSA9IElQQ1BfU1RBVEVfT1BFTkVEOworCQkJZWxzZQorCQkJCXNwLT5pcGNwLnN0YXRlID0gSVBDUF9TVEFURV9BQ0tfU0VOVDsKKwkJfQorCQlicmVhazsKKwljYXNlIElQQ1BfQ09ORl9BQ0s6CisJCWlmIChoLT5pZGVudCAhPSBzcC0+aXBjcC5jb25maWQpCisJCQlicmVhazsKKwkJc3BwcF9jbGVhcl90aW1lb3V0IChzcCk7CisJCXN3aXRjaCAoc3AtPmlwY3Auc3RhdGUpIHsKKwkJY2FzZSBJUENQX1NUQVRFX0NMT1NFRDoKKwkJCXNwLT5pcGNwLnN0YXRlID0gSVBDUF9TVEFURV9BQ0tfUkNWRDsKKwkJCXNwcHBfc2V0X3RpbWVvdXQgKHNwLCA1KTsKKwkJCWJyZWFrOworCQljYXNlIElQQ1BfU1RBVEVfQUNLX1NFTlQ6CisJCQlzcC0+aXBjcC5zdGF0ZSA9IElQQ1BfU1RBVEVfT1BFTkVEOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJUENQX0NPTkZfTkFLOgorCWNhc2UgSVBDUF9DT05GX1JFSjoKKwkJaWYgKGgtPmlkZW50ICE9IHNwLT5pcGNwLmNvbmZpZCkKKwkJCWJyZWFrOworCQlzcHBwX2NsZWFyX3RpbWVvdXQgKHNwKTsKKwkJCS8qIEluaXRpYXRlIHJlbmVnb3RpYXRpb24uICovCisJCXNwcHBfaXBjcF9vcGVuIChzcCk7CisJCWlmIChzcC0+aXBjcC5zdGF0ZSAhPSBJUENQX1NUQVRFX0FDS19TRU5UKQorCQkJLyogR28gdG8gY2xvc2VkIHN0YXRlLiAqLworCQkJc3AtPmlwY3Auc3RhdGUgPSBJUENQX1NUQVRFX0NMT1NFRDsKKwkJYnJlYWs7CisJY2FzZSBJUENQX1RFUk1fUkVROgorCQkvKiBTZW5kIFRlcm1pbmF0ZS1BY2sgcGFja2V0LiAqLworCQlzcHBwX2NwX3NlbmQgKHNwLCBQUFBfSVBDUCwgSVBDUF9URVJNX0FDSywgaC0+aWRlbnQsIDAsIE5VTEwpOworCQkvKiBHbyB0byBjbG9zZWQgc3RhdGUuICovCisJCXNwLT5pcGNwLnN0YXRlID0gSVBDUF9TVEFURV9DTE9TRUQ7CisJCS8qIEluaXRpYXRlIHJlbmVnb3RpYXRpb24uICovCisJCXNwcHBfaXBjcF9vcGVuIChzcCk7CisJCWJyZWFrOworCWNhc2UgSVBDUF9URVJNX0FDSzoKKwkJLyogSWdub3JlIGZvciBub3cuICovCisJY2FzZSBJUENQX0NPREVfUkVKOgorCQkvKiBJZ25vcmUgZm9yIG5vdy4gKi8KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBzcHBwX2xjcF9vcGVuIChzdHJ1Y3Qgc3BwcCAqc3ApCit7CisJY2hhciBvcHRbNl07CisKKwlpZiAoISBzcC0+bGNwLm1hZ2ljKQorCQlzcC0+bGNwLm1hZ2ljID0gamlmZmllczsKKwlvcHRbMF0gPSBMQ1BfT1BUX01BR0lDOworCW9wdFsxXSA9IHNpemVvZiAob3B0KTsKKwlvcHRbMl0gPSBzcC0+bGNwLm1hZ2ljID4+IDI0OworCW9wdFszXSA9IHNwLT5sY3AubWFnaWMgPj4gMTY7CisJb3B0WzRdID0gc3AtPmxjcC5tYWdpYyA+PiA4OworCW9wdFs1XSA9IHNwLT5sY3AubWFnaWM7CisJc3AtPmxjcC5jb25maWQgPSArK3NwLT5wcF9zZXE7CisJc3BwcF9jcF9zZW5kIChzcCwgUFBQX0xDUCwgTENQX0NPTkZfUkVRLCBzcC0+bGNwLmNvbmZpZCwKKwkJc2l6ZW9mIChvcHQpLCAmb3B0KTsKKwlzcHBwX3NldF90aW1lb3V0IChzcCwgMik7Cit9CisKK3N0YXRpYyB2b2lkIHNwcHBfaXBjcF9vcGVuIChzdHJ1Y3Qgc3BwcCAqc3ApCit7CisJc3AtPmlwY3AuY29uZmlkID0gKytzcC0+cHBfc2VxOworCXNwcHBfY3Bfc2VuZCAoc3AsIFBQUF9JUENQLCBJUENQX0NPTkZfUkVRLCBzcC0+aXBjcC5jb25maWQsIDAsIE5VTEwpOworCXNwcHBfc2V0X3RpbWVvdXQgKHNwLCAyKTsKK30KKworLyoKKyAqIFByb2Nlc3MgUFBQIGNvbnRyb2wgcHJvdG9jb2wgdGltZW91dHMuCisgKi8KKyAKK3N0YXRpYyB2b2lkIHNwcHBfY3BfdGltZW91dCAodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHNwcHAgKnNwID0gKHN0cnVjdCBzcHBwKikgYXJnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3AtPmxvY2ssIGZsYWdzKTsKKworCXNwLT5wcF9mbGFncyAmPSB+UFBfVElNTzsKKwlpZiAoISAoc3AtPnBwX2lmLT5mbGFncyAmIElGRl9VUCkgfHwgKHNwLT5wcF9mbGFncyAmIFBQX0NJU0NPKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCXN3aXRjaCAoc3AtPmxjcC5zdGF0ZSkgeworCWNhc2UgTENQX1NUQVRFX0NMT1NFRDoKKwkJLyogTm8gQUNLIGZvciBDb25maWd1cmUtUmVxdWVzdCwgcmV0cnkuICovCisJCXNwcHBfbGNwX29wZW4gKHNwKTsKKwkJYnJlYWs7CisJY2FzZSBMQ1BfU1RBVEVfQUNLX1JDVkQ6CisJCS8qIEFDSyBnb3QsIGJ1dCBubyBDb25maWd1cmUtUmVxdWVzdCBmb3IgcGVlciwgcmV0cnkuICovCisJCXNwcHBfbGNwX29wZW4gKHNwKTsKKwkJc3AtPmxjcC5zdGF0ZSA9IExDUF9TVEFURV9DTE9TRUQ7CisJCWJyZWFrOworCWNhc2UgTENQX1NUQVRFX0FDS19TRU5UOgorCQkvKiBBQ0sgc2VudCBidXQgbm8gQUNLIGZvciBDb25maWd1cmUtUmVxdWVzdCwgcmV0cnkuICovCisJCXNwcHBfbGNwX29wZW4gKHNwKTsKKwkJYnJlYWs7CisJY2FzZSBMQ1BfU1RBVEVfT1BFTkVEOgorCQkvKiBMQ1AgaXMgYWxyZWFkeSBPSywgdHJ5IElQQ1AuICovCisJCXN3aXRjaCAoc3AtPmlwY3Auc3RhdGUpIHsKKwkJY2FzZSBJUENQX1NUQVRFX0NMT1NFRDoKKwkJCS8qIE5vIEFDSyBmb3IgQ29uZmlndXJlLVJlcXVlc3QsIHJldHJ5LiAqLworCQkJc3BwcF9pcGNwX29wZW4gKHNwKTsKKwkJCWJyZWFrOworCQljYXNlIElQQ1BfU1RBVEVfQUNLX1JDVkQ6CisJCQkvKiBBQ0sgZ290LCBidXQgbm8gQ29uZmlndXJlLVJlcXVlc3QgZm9yIHBlZXIsIHJldHJ5LiAqLworCQkJc3BwcF9pcGNwX29wZW4gKHNwKTsKKwkJCXNwLT5pcGNwLnN0YXRlID0gSVBDUF9TVEFURV9DTE9TRUQ7CisJCQlicmVhazsKKwkJY2FzZSBJUENQX1NUQVRFX0FDS19TRU5UOgorCQkJLyogQUNLIHNlbnQgYnV0IG5vIEFDSyBmb3IgQ29uZmlndXJlLVJlcXVlc3QsIHJldHJ5LiAqLworCQkJc3BwcF9pcGNwX29wZW4gKHNwKTsKKwkJCWJyZWFrOworCQljYXNlIElQQ1BfU1RBVEVfT1BFTkVEOgorCQkJLyogSVBDUCBpcyBPSy4gKi8KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcC0+bG9jaywgZmxhZ3MpOworCXNwcHBfZmx1c2hfeG1pdCgpOworfQorCitzdGF0aWMgY2hhciAqc3BwcF9sY3BfdHlwZV9uYW1lICh1OCB0eXBlKQoreworCXN0YXRpYyBjaGFyIGJ1ZiBbOF07CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBMQ1BfQ09ORl9SRVE6ICAgcmV0dXJuICgiY29uZi1yZXEiKTsKKwljYXNlIExDUF9DT05GX0FDSzogICByZXR1cm4gKCJjb25mLWFjayIpOworCWNhc2UgTENQX0NPTkZfTkFLOiAgIHJldHVybiAoImNvbmYtbmFjayIpOworCWNhc2UgTENQX0NPTkZfUkVKOiAgIHJldHVybiAoImNvbmYtcmVqIik7CisJY2FzZSBMQ1BfVEVSTV9SRVE6ICAgcmV0dXJuICgidGVybS1yZXEiKTsKKwljYXNlIExDUF9URVJNX0FDSzogICByZXR1cm4gKCJ0ZXJtLWFjayIpOworCWNhc2UgTENQX0NPREVfUkVKOiAgIHJldHVybiAoImNvZGUtcmVqIik7CisJY2FzZSBMQ1BfUFJPVE9fUkVKOiAgcmV0dXJuICgicHJvdG8tcmVqIik7CisJY2FzZSBMQ1BfRUNIT19SRVE6ICAgcmV0dXJuICgiZWNoby1yZXEiKTsKKwljYXNlIExDUF9FQ0hPX1JFUExZOiByZXR1cm4gKCJlY2hvLXJlcGx5Iik7CisJY2FzZSBMQ1BfRElTQ19SRVE6ICAgcmV0dXJuICgiZGlzY2FyZC1yZXEiKTsKKwl9CisJc3ByaW50ZiAoYnVmLCAiJXhoIiwgdHlwZSk7CisJcmV0dXJuIChidWYpOworfQorCitzdGF0aWMgY2hhciAqc3BwcF9pcGNwX3R5cGVfbmFtZSAodTggdHlwZSkKK3sKKwlzdGF0aWMgY2hhciBidWYgWzhdOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSVBDUF9DT05GX1JFUTogICByZXR1cm4gKCJjb25mLXJlcSIpOworCWNhc2UgSVBDUF9DT05GX0FDSzogICByZXR1cm4gKCJjb25mLWFjayIpOworCWNhc2UgSVBDUF9DT05GX05BSzogICByZXR1cm4gKCJjb25mLW5hY2siKTsKKwljYXNlIElQQ1BfQ09ORl9SRUo6ICAgcmV0dXJuICgiY29uZi1yZWoiKTsKKwljYXNlIElQQ1BfVEVSTV9SRVE6ICAgcmV0dXJuICgidGVybS1yZXEiKTsKKwljYXNlIElQQ1BfVEVSTV9BQ0s6ICAgcmV0dXJuICgidGVybS1hY2siKTsKKwljYXNlIElQQ1BfQ09ERV9SRUo6ICAgcmV0dXJuICgiY29kZS1yZWoiKTsKKwl9CisJc3ByaW50ZiAoYnVmLCAiJXhoIiwgdHlwZSk7CisJcmV0dXJuIChidWYpOworfQorCitzdGF0aWMgdm9pZCBzcHBwX3ByaW50X2J5dGVzICh1X2NoYXIgKnAsIHUxNiBsZW4pCit7CisJcHJpbnRrICgiICV4IiwgKnArKyk7CisJd2hpbGUgKC0tbGVuID4gMCkKKwkJcHJpbnRrICgiLSV4IiwgKnArKyk7Cit9CisKKy8qKgorICoJc3BwcF9yY3YgLQlyZWNlaXZlIGFuZCBwcm9jZXNzIGEgV0FOIFBQUCBmcmFtZQorICoJQHNrYjoJVGhlIGJ1ZmZlciB0byBwcm9jZXNzCisgKglAZGV2OglUaGUgZGV2aWNlIGl0IGFycml2ZWQgb24KKyAqCUBwOiBVbnVzZWQKKyAqCisgKglQcm90b2NvbCBnbHVlLiBUaGlzIGRyaXZlcyB0aGUgZGVmZXJyZWQgcHJvY2Vzc2luZyBtb2RlIHRoZSBwb29yZXIKKyAqCWNhcmRzIHVzZS4gVGhpcyBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGNhcmRzIHRoYXQgZG8gbm90IGhhdmUKKyAqCXRpbWluZyBjb25zdHJhaW50cyBidXQgaXMgbm9ybWFsbHkgY2FsbGVkIGZyb20gdGhlIG5ldHdvcmsgbGF5ZXIKKyAqCWFmdGVyIGludGVycnVwdCBzZXJ2aWNpbmcgdG8gcHJvY2VzcyBmcmFtZXMgcXVldWVkIHZpYSBuZXRpZl9yeC4KKyAqLworCitzdGF0aWMgaW50IHNwcHBfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBwYWNrZXRfdHlwZSAqcCkKK3sKKwlpZiAoKHNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCQlyZXR1cm4gTkVUX1JYX0RST1A7CisJc3BwcF9pbnB1dChkZXYsc2tiKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBhY2tldF90eXBlIHNwcHBfcGFja2V0X3R5cGUgPSB7CisJLnR5cGUJPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX1dBTl9QUFApLAorCS5mdW5jCT0gc3BwcF9yY3YsCit9OworCitzdGF0aWMgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0gCisJS0VSTl9JTkZPICJDcm9ueXggTHRkLCBTeW5jaHJvbm91cyBQUFAgYW5kIENJU0NPIEhETEMgKGMpIDE5OTRcbiIKKwlLRVJOX0lORk8gIkxpbnV4IHBvcnQgKGMpIDE5OTggQnVpbGRpbmcgTnVtYmVyIFRocmVlIEx0ZCAmICIKKwkJICAiSmFuIFwiWWVueWFcIiBLYXNwcnphay5cbiI7CisKK3N0YXRpYyBpbnQgX19pbml0IHN5bmNfcHBwX2luaXQodm9pZCkKK3sKKwlpZihkZWJ1ZykKKwkJZGVidWc9UFBfREVCVUc7CisJcHJpbnRrKGJhbm5lcik7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmdHhfcXVldWUpOworCWRldl9hZGRfcGFjaygmc3BwcF9wYWNrZXRfdHlwZSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IHN5bmNfcHBwX2NsZWFudXAodm9pZCkKK3sKKwlkZXZfcmVtb3ZlX3BhY2soJnNwcHBfcGFja2V0X3R5cGUpOworfQorCittb2R1bGVfaW5pdChzeW5jX3BwcF9pbml0KTsKK21vZHVsZV9leGl0KHN5bmNfcHBwX2NsZWFudXApOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vd2FucGlwZV9tdWx0cHBwLmMgYi9kcml2ZXJzL25ldC93YW4vd2FucGlwZV9tdWx0cHBwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhNjk4NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi93YW5waXBlX211bHRwcHAuYwpAQCAtMCwwICsxLDIzNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiB3YW5waXBlX211bHRwcHAuYyBNdWx0aS1Qb3J0IFBQUCBkcml2ZXIgbW9kdWxlLgorKgorKiBBdXRob3JzOiAJTmVuYWQgQ29yYmljIDxuY29yYmljQHNhbmdvbWEuY29tPgorKgorKiBDb3B5cmlnaHQ6CShjKSAxOTk1LTIwMDEgU2FuZ29tYSBUZWNobm9sb2dpZXMgSW5jLgorKgorKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiBEZWMgMTUgMjAwMCAgIFVwZGF0ZWQgZm9yIDIuNC5YIGtlcm5lbAorKiBOb3YgMTUgMjAwMCAgIEZpeGVkIHRoZSBTeW5jUFBQIHN1cHBvcnQgZm9yIGtlcm5lbHMgMi4yLjE2IGFuZCBoaWdoZXIuCisqICAgCQlUaGUgcHBwc3RydWN0IGhhcyBjaGFuZ2VkLgorKiBKdWwgMTMgMjAwMAlVc2luZyB0aGUga2VybmVsIFN5bmNwcHAgbW9kdWxlIG9uIHRvcCBvZiBSQVcgV2FucGlwZSBDSERMQworKiAgCQltb2R1bGUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkvKiBwcmludGsoKSwgYW5kIG90aGVyIHVzZWZ1bCBzdHVmZiAqLworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgkvKiBvZmZzZXRvZigpLCBldGMuICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4JLyogcmV0dXJuIGNvZGVzICovCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CS8qIGlubGluZSBtZW1zZXQoKSwgZXRjLiAqLworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4JLyoga21hbGxvYygpLCBrZnJlZSgpICovCisjaW5jbHVkZSA8bGludXgvd2Fucm91dGVyLmg+CS8qIFdBTiByb3V0ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC93YW5waXBlLmg+CS8qIFdBTlBJUEUgY29tbW9uIHVzZXIgQVBJIGRlZmluaXRpb25zICovCisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CS8qIEFSUEhSRF8qIGRlZmluZXMgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luLmg+CQkvKiBzb2NrYWRkcl9pbiAqLworI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4JCisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CS8qIGh0b25zKCksIGV0Yy4gKi8KKyNpbmNsdWRlIDxsaW51eC9zZGxhcGNpLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zZGxhX2NoZGxjLmg+CQkvKiBDSERMQyBmaXJtd2FyZSBBUEkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9zZGxhX2FzeS5oPiAgICAgICAgICAgCS8qIENIRExDIChhc3luYykgQVBJIGRlZmluaXRpb25zICovCisKKyNpbmNsdWRlIDxsaW51eC9pZl93YW5waXBlX2NvbW1vbi5oPiAgICAvKiBTb2NrZXQgRHJpdmVyIGNvbW1vbiBhcmVhICovCisjaW5jbHVkZSA8bGludXgvaWZfd2FucGlwZS5oPgkJCisKKworI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bmV0L3N5bmNwcHAuaD4KKworCisvKioqKioqIERlZmluZXMgJiBNYWNyb3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmCV9ERUJVR18KKyNkZWZpbmUJU1RBVElDCisjZWxzZQorI2RlZmluZQlTVEFUSUMJCXN0YXRpYworI2VuZGlmCisKKy8qIHJlYXNvbnMgZm9yIGVuYWJsaW5nIHRoZSB0aW1lciBpbnRlcnJ1cHQgb24gdGhlIGFkYXB0ZXIgKi8KKyNkZWZpbmUgVE1SX0lOVF9FTkFCTEVEX1VEUCAgIAkweDAxCisjZGVmaW5lIFRNUl9JTlRfRU5BQkxFRF9VUERBVEUJMHgwMgorI2RlZmluZSBUTVJfSU5UX0VOQUJMRURfQ09ORklHICAweDA0CisgCisjZGVmaW5lCUNIRExDX0RGTFRfREFUQV9MRU4JMTUwMAkJLyogZGVmYXVsdCBNVFUgKi8KKyNkZWZpbmUgQ0hETENfSERSX0xFTgkJMQorCisjZGVmaW5lIElGRl9QT0lOVFRPUE9JTlQgMHgxMAorCisjZGVmaW5lIENIRExDX0FQSSAweDAxCisKKyNkZWZpbmUgUE9SVCh4KSAgICh4ID09IDAgPyAiUFJJTUFSWSIgOiAiU0VDT05EQVJZIiApCisjZGVmaW5lIE1BWF9CSF9CVUZGCTEwCisKKyNkZWZpbmUgQ1JDX0xFTkdUSCAJMiAKKyNkZWZpbmUgUFBQX0hFQURFUl9MRU4gCTQKKyAKKy8qKioqKipEYXRhIFN0cnVjdHVyZXMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgcGxhY2VkIGluIHRoZSBwcml2YXRlIGRhdGEgYXJlYSBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KKyAqIFRoZSBjYXJkIHN0cnVjdHVyZSB1c2VkIHRvIG9jY3VweSB0aGUgcHJpdmF0ZSBhcmVhIGJ1dCBub3cgdGhlIGZvbGxvd2luZyAKKyAqIHN0cnVjdHVyZSB3aWxsIGluY29ycG9yYXRlIHRoZSBjYXJkIHN0cnVjdHVyZSBhbG9uZyB3aXRoIENIRExDIHNwZWNpZmljIGRhdGEKKyAqLworCit0eXBlZGVmIHN0cnVjdCBjaGRsY19wcml2YXRlX2FyZWEKK3sKKwl2b2lkICppZl9wdHI7CQkJCS8qIEdlbmVyYWwgUG9pbnRlciB1c2VkIGJ5IFNQUFAgKi8KKwl3YW5waXBlX2NvbW1vbl90IGNvbW1vbjsKKwlzZGxhX3QJCSpjYXJkOworCWludCAJCVRyYWNpbmdFbmFibGVkOwkJLyogRm9yIGVuYWJsaW5nIFRyYWNpbmcgKi8KKwl1bnNpZ25lZCBsb25nIAljdXJyX3RyYWNlX2FkZHI7CS8qIFVzZWQgZm9yIFRyYWNpbmcgKi8KKwl1bnNpZ25lZCBsb25nIAlzdGFydF90cmFjZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgCWVuZF90cmFjZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgCWJhc2VfYWRkcl90cmFjZV9idWZmZXI7CisJdW5zaWduZWQgbG9uZyAJZW5kX2FkZHJfdHJhY2VfYnVmZmVyOworCXVuc2lnbmVkIHNob3J0IAludW1iZXJfdHJhY2VfZWxlbWVudHM7CisJdW5zaWduZWQgIAlhdmFpbGFibGVfYnVmZmVyX3NwYWNlOworCXVuc2lnbmVkIGxvbmcgCXJvdXRlcl9zdGFydF90aW1lOworCXVuc2lnbmVkIGNoYXIgCXJvdXRlX3N0YXR1czsKKwl1bnNpZ25lZCBjaGFyIAlyb3V0ZV9yZW1vdmVkOworCXVuc2lnbmVkIGxvbmcgCXRpY2tfY291bnRlcjsJCS8qIEZvciA1cyB0aW1lb3V0IGNvdW50ZXIgKi8KKwl1bnNpZ25lZCBsb25nIAlyb3V0ZXJfdXBfdGltZTsKKyAgICAgICAgdTMyICAgICAgICAgICAgIElQX2FkZHJlc3M7CQkvKiBJUCBhZGRyZXNzaW5nICovCisgICAgICAgIHUzMiAgICAgICAgICAgICBJUF9uZXRtYXNrOworCXVuc2lnbmVkIGNoYXIgIG1jOwkJCS8qIE11bGl0Y2FzdCBzdXBwb3J0IG9uL29mZiAqLworCXVuc2lnbmVkIHNob3J0IHVkcF9wa3RfbGd0aDsJCS8qIHVkcCBwYWNrZXQgcHJvY2Vzc2luZyAqLworCWNoYXIgdWRwX3BrdF9zcmM7CisJY2hhciB1ZHBfcGt0X2RhdGFbTUFYX0xHVEhfVURQX01HTlRfUEtUXTsKKwl1bnNpZ25lZCBzaG9ydCB0aW1lcl9pbnRfZW5hYmxlZDsKKwljaGFyIHVwZGF0ZV9jb21tc19zdGF0czsJCS8qIHVwZGF0aW5nIGNvbW1zIHN0YXRzICovCisKKwkvL0ZJWE1FOiBhZGQgZHJpdmVyIHN0YXRzIGFzIHBlciBmcmFtZSByZWxheSEKKworfSBjaGRsY19wcml2YXRlX2FyZWFfdDsKKworLyogUm91dGUgU3RhdHVzIG9wdGlvbnMgKi8KKyNkZWZpbmUgTk9fUk9VVEUJMHgwMAorI2RlZmluZSBBRERfUk9VVEUJMHgwMQorI2RlZmluZSBST1VURV9BRERFRAkweDAyCisjZGVmaW5lIFJFTU9WRV9ST1VURQkweDAzCisKKworLyogdmFyaWFibGUgZm9yIGtlZXBpbmcgdHJhY2sgb2YgZW5hYmxpbmcvZGlzYWJsaW5nIEZUMSBtb25pdG9yIHN0YXR1cyAqLworc3RhdGljIGludCByQ291bnQgPSAwOworCisvKiB2YXJpYWJsZSBmb3IgdHJhY2tpbmcgaG93IG1hbnkgaW50ZXJmYWNlcyB0byBvcGVuIGZvciBXQU5QSVBFIG9uIHRoZQorICAgdHdvIHBvcnRzICovCisKK2V4dGVybiB2b2lkIGRpc2FibGVfaXJxKHVuc2lnbmVkIGludCk7CitleHRlcm4gdm9pZCBlbmFibGVfaXJxKHVuc2lnbmVkIGludCk7CisKKy8qKioqKiogRnVuY3Rpb24gUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogV0FOIGxpbmsgZHJpdmVyIGVudHJ5IHBvaW50cy4gVGhlc2UgYXJlIGNhbGxlZCBieSB0aGUgV0FOIHJvdXRlciBtb2R1bGUuICovCitzdGF0aWMgaW50IHVwZGF0ZShzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2KTsKK3N0YXRpYyBpbnQgbmV3X2lmKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCSAgd2FuaWZfY29uZl90KiBjb25mKTsKK3N0YXRpYyBpbnQgZGVsX2lmKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworCisvKiBOZXR3b3JrIGRldmljZSBpbnRlcmZhY2UgKi8KK3N0YXRpYyBpbnQgaWZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyBpbnQgaWZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKK3N0YXRpYyBpbnQgaWZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitzdGF0aWMgaW50IGlmX3NlbmQoc3RydWN0IHNrX2J1ZmYqIHNrYiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqIGlmX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpOworCitzdGF0aWMgdm9pZCBpZl90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBDSERMQyBGaXJtd2FyZSBpbnRlcmZhY2UgZnVuY3Rpb25zICovCitzdGF0aWMgaW50IGNoZGxjX2NvbmZpZ3VyZSAJKHNkbGFfdCogY2FyZCwgdm9pZCogZGF0YSk7CitzdGF0aWMgaW50IGNoZGxjX2NvbW1fZW5hYmxlIAkoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBpbnQgY2hkbGNfY29tbV9kaXNhYmxlIAkoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyBpbnQgY2hkbGNfcmVhZF92ZXJzaW9uIAkoc2RsYV90KiBjYXJkLCBjaGFyKiBzdHIpOworc3RhdGljIGludCBjaGRsY19zZXRfaW50cl9tb2RlIAkoc2RsYV90KiBjYXJkLCB1bnNpZ25lZCBtb2RlKTsKK3N0YXRpYyBpbnQgY2hkbGNfc2VuZCAoc2RsYV90KiBjYXJkLCB2b2lkKiBkYXRhLCB1bnNpZ25lZCBsZW4pOworc3RhdGljIGludCBjaGRsY19yZWFkX2NvbW1fZXJyX3N0YXRzIChzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCBjaGRsY19yZWFkX29wX3N0YXRzIChzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCBjb25maWdfY2hkbGMgKHNkbGFfdCAqY2FyZCk7CisKKworLyogTWlzY2VsbGFuZW91cyBDSERMQyBGdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgc2V0X2NoZGxjX2NvbmZpZyAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyB2b2lkIGluaXRfY2hkbGNfdHhfcnhfYnVmZihzZGxhX3QqIGNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBjaGRsY19lcnJvciAoc2RsYV90ICpjYXJkLCBpbnQgZXJyLCBDSERMQ19NQUlMQk9YX1NUUlVDVCAqbWIpOworc3RhdGljIGludCBwcm9jZXNzX2NoZGxjX2V4Y2VwdGlvbihzZGxhX3QgKmNhcmQpOworc3RhdGljIGludCBwcm9jZXNzX2dsb2JhbF9leGNlcHRpb24oc2RsYV90ICpjYXJkKTsKK3N0YXRpYyBpbnQgdXBkYXRlX2NvbW1zX3N0YXRzKHNkbGFfdCogY2FyZCwKKyAgICAgICAgY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSk7CitzdGF0aWMgdm9pZCBwb3J0X3NldF9zdGF0ZSAoc2RsYV90ICpjYXJkLCBpbnQpOworCisvKiBJbnRlcnJ1cHQgaGFuZGxlcnMgKi8KK3N0YXRpYyB2b2lkIHdzcHBwX2lzciAoc2RsYV90KiBjYXJkKTsKK3N0YXRpYyB2b2lkIHJ4X2ludHIgKHNkbGFfdCogY2FyZCk7CitzdGF0aWMgdm9pZCB0aW1lcl9pbnRyKHNkbGFfdCAqKTsKKworLyogTWlzY2VsbGFuZW91cyBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgcmVwbHlfdWRwKCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgbWJveF9sZW4gKTsKK3N0YXRpYyBpbnQgaW50cl90ZXN0KCBzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCB1ZHBfcGt0X3R5cGUoIHN0cnVjdCBza19idWZmICpza2IgLCBzZGxhX3QqIGNhcmQpOworc3RhdGljIGludCBzdG9yZV91ZHBfbWdtdF9wa3QoY2hhciB1ZHBfcGt0X3NyYywgc2RsYV90KiBjYXJkLAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKwkJCSAgICAgIGNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGRsY19wcml2X2FyZWEpOworc3RhdGljIGludCBwcm9jZXNzX3VkcF9tZ210X3BrdChzZGxhX3QqIGNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsICAKKwkJCQljaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBjYWxjX2NoZWNrc3VtIChjaGFyICosIGludCk7CitzdGF0aWMgdm9pZCBzNTA4X2xvY2sgKHNkbGFfdCAqY2FyZCwgdW5zaWduZWQgbG9uZyAqc21wX2ZsYWdzKTsKK3N0YXRpYyB2b2lkIHM1MDhfdW5sb2NrIChzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncyk7CitzdGF0aWMgdm9pZCBzZW5kX3BwcF90ZXJtX3JlcXVlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworc3RhdGljIGludCAgSW50cl90ZXN0X2NvdW50ZXI7CisvKioqKioqIFB1YmxpYyBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDaXNjbyBIRExDIHByb3RvY29sIGluaXRpYWxpemF0aW9uIHJvdXRpbmUuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgbWFpbiBXQU5QSVBFIG1vZHVsZSBkdXJpbmcgc2V0dXAuICBBdCB0aGlzCisgKiBwb2ludCBhZGFwdGVyIGlzIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgYW5kIGZpcm13YXJlIGlzIHJ1bm5pbmcuCisgKiAgbyByZWFkIGZpcm13YXJlIHZlcnNpb24gKHRvIG1ha2Ugc3VyZSBpdCdzIGFsaXZlKQorICogIG8gY29uZmlndXJlIGFkYXB0ZXIKKyAqICBvIGluaXRpYWxpemUgcHJvdG9jb2wtc3BlY2lmaWMgZmllbGRzIG9mIHRoZSBhZGFwdGVyIGRhdGEgc3BhY2UuCisgKgorICogUmV0dXJuOgkwCW8uay4KKyAqCQk8IDAJZmFpbHVyZS4KKyAqLworaW50IHdzcHBwX2luaXQgKHNkbGFfdCogY2FyZCwgd2FuZGV2X2NvbmZfdCogY29uZikKK3sKKwl1bnNpZ25lZCBjaGFyIHBvcnRfbnVtOworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBtYXhfcGVybWl0dGVkX2JhdWQgPSAwOworCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QgKmZsYWdzOworCisJdW5pb24KKwkJeworCQljaGFyIHN0cls4MF07CisJCX0gdTsKKwl2b2xhdGlsZSBDSERMQ19NQUlMQk9YX1NUUlVDVCogbWI7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iMTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwkvKiBWZXJpZnkgY29uZmlndXJhdGlvbiBJRCAqLworCWlmIChjb25mLT5jb25maWdfaWQgIT0gV0FOQ09ORklHX01QUFApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGludmFsaWQgY29uZmlndXJhdGlvbiBJRCAldSFcbiIsCisJCQkJICBjYXJkLT5kZXZuYW1lLCBjb25mLT5jb25maWdfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBGaW5kIG91dCB3aGljaCBQb3J0IHRvIHVzZSAqLworCWlmICgoY29uZi0+Y29tbV9wb3J0ID09IFdBTk9QVF9QUkkpIHx8IChjb25mLT5jb21tX3BvcnQgPT0gV0FOT1BUX1NFQykpeworCQlpZiAoY2FyZC0+bmV4dCl7CisKKwkJCWlmIChjb25mLT5jb21tX3BvcnQgIT0gY2FyZC0+bmV4dC0+dS5jLmNvbW1fcG9ydCl7CisJCQkJY2FyZC0+dS5jLmNvbW1fcG9ydCA9IGNvbmYtPmNvbW1fcG9ydDsKKwkJCX1lbHNleworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVSUk9SIC0gJXMgcG9ydCB1c2VkIVxuIiwKKyAgICAgICAgCQkgICAgICAgIAljYXJkLT53YW5kZXYubmFtZSwgUE9SVChjb25mLT5jb21tX3BvcnQpKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfWVsc2V7CisJCQljYXJkLT51LmMuY29tbV9wb3J0ID0gY29uZi0+Y29tbV9wb3J0OworCQl9CisJfWVsc2V7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVSUk9SIC0gSW52YWxpZCBQb3J0IFNlbGVjdGVkIVxuIiwKKyAgICAgICAgICAgICAgICAJCQljYXJkLT53YW5kZXYubmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKworCS8qIEluaXRpYWxpemUgcHJvdG9jb2wtc3BlY2lmaWMgZmllbGRzICovCisJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpeworCisJCWlmIChjYXJkLT51LmMuY29tbV9wb3J0ID09IFdBTk9QVF9QUkkpewkKKwkJCWNhcmQtPm1ib3ggID0gKHZvaWQgKikgY2FyZC0+aHcuZHBtYmFzZTsKKwkJfWVsc2V7CisJCQljYXJkLT5tYm94ICA9ICh2b2lkICopIGNhcmQtPmh3LmRwbWJhc2UgKyAKKwkJCQlTRUNfQkFTRV9BRERSX01CX1NUUlVDVCAtIFBSSV9CQVNFX0FERFJfTUJfU1RSVUNUOworCQl9CQorCX1lbHNleyAKKwkJLyogZm9yIGEgUzUxNCBhZGFwdGVyLCBzZXQgYSBwb2ludGVyIHRvIHRoZSBhY3R1YWwgbWFpbGJveCBpbiB0aGUgKi8KKwkJLyogYWxsb2NhdGVkIHZpcnR1YWwgbWVtb3J5IGFyZWEgKi8KKwkJaWYgKGNhcmQtPnUuYy5jb21tX3BvcnQgPT0gV0FOT1BUX1BSSSl7CisJCQljYXJkLT5tYm94ID0gKHZvaWQgKikgY2FyZC0+aHcuZHBtYmFzZSArIFBSSV9CQVNFX0FERFJfTUJfU1RSVUNUOworCQl9ZWxzZXsKKwkJCWNhcmQtPm1ib3ggPSAodm9pZCAqKSBjYXJkLT5ody5kcG1iYXNlICsgU0VDX0JBU0VfQUREUl9NQl9TVFJVQ1Q7CisJCX0JCisJfQorCisJbWIgPSBtYjEgPSBjYXJkLT5tYm94OworCisJaWYgKCFjYXJkLT5jb25maWd1cmVkKXsKKworCQkvKiBUaGUgYm9hcmQgd2lsbCBwbGFjZSBhbiAnSScgaW4gdGhlIHJldHVybiBjb2RlIHRvIGluZGljYXRlIHRoYXQgaXQgaXMKKwkgICAJcmVhZHkgdG8gYWNjZXB0IGNvbW1hbmRzLiAgV2UgZXhwZWN0IHRoaXMgdG8gYmUgY29tcGxldGVkIGluIGxlc3MKKyAgICAgICAgICAgCXRoYW4gMSBzZWNvbmQuICovCisKKwkJdGltZW91dCA9IGppZmZpZXM7CisJCXdoaWxlIChtYi0+cmV0dXJuX2NvZGUgIT0gJ0knKQkvKiBXYWl0IDFzIGZvciBib2FyZCB0byBpbml0aWFsaXplICovCisJCQlpZiAoKGppZmZpZXMgLSB0aW1lb3V0KSA+IDEqSFopIGJyZWFrOworCisJCWlmIChtYi0+cmV0dXJuX2NvZGUgIT0gJ0knKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJIiVzOiBJbml0aWFsaXphdGlvbiBub3QgY29tcGxldGVkIGJ5IGFkYXB0ZXJcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJQbGVhc2UgY29udGFjdCBTYW5nb21hIHJlcHJlc2VudGF0aXZlLlxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCS8qIFJlYWQgZmlybXdhcmUgdmVyc2lvbi4gIE5vdGUgdGhhdCB3aGVuIGFkYXB0ZXIgaW5pdGlhbGl6ZXMsIGl0CisJICogY2xlYXJzIHRoZSBtYWlsYm94LCBzbyBpdCBtYXkgYXBwZWFyIHRoYXQgdGhlIGZpcnN0IGNvbW1hbmQgd2FzCisJICogZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IHdoZW4gaW4gZmFjdCBpdCB3YXMgbWVyZWx5IGVyYXNlZC4gVG8gd29yaworCSAqIGFyb3VuZCB0aGlzLCB3ZSBleGVjdXRlIHRoZSBmaXJzdCBjb21tYW5kIHR3aWNlLgorCSAqLworCisJaWYgKGNoZGxjX3JlYWRfdmVyc2lvbihjYXJkLCB1LnN0cikpCisJCXJldHVybiAtRUlPOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJ1bm5pbmcgUmF3IENIRExDIGZpcm13YXJlIHYlc1xuIiAKKwkJCSAiJXM6IGZvciBNdWx0aS1Qb3J0IFBQUCBwcm90b2NvbC5cbiIsCisJCQljYXJkLT5kZXZuYW1lLHUuc3RyLGNhcmQtPmRldm5hbWUpOyAKKworCWNhcmQtPmlzcgkJCT0gJndzcHBwX2lzcjsKKwljYXJkLT5wb2xsCQkJPSBOVUxMOworCWNhcmQtPmV4ZWMJCQk9IE5VTEw7CisJY2FyZC0+d2FuZGV2LnVwZGF0ZQkJPSAmdXBkYXRlOworIAljYXJkLT53YW5kZXYubmV3X2lmCQk9ICZuZXdfaWY7CisJY2FyZC0+d2FuZGV2LmRlbF9pZgkJPSAmZGVsX2lmOworCWNhcmQtPndhbmRldi51ZHBfcG9ydCAgIAk9IGNvbmYtPnVkcF9wb3J0OworCisJY2FyZC0+d2FuZGV2Lm5ld19pZl9jbnQgPSAwOworCisJLyogcmVzZXQgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgJ3VwZGF0ZSgpJyBwcm9jIGhhcyBiZWVuIGNhbGxlZCAqLworCWNhcmQtPnUuYy51cGRhdGVfY2FsbF9jb3VudCA9IDA7CisJCisJY2FyZC0+d2FuZGV2LnR0bCA9IGNvbmYtPnR0bDsKKwljYXJkLT53YW5kZXYuaW50ZXJmYWNlID0gY29uZi0+aW50ZXJmYWNlOyAKKworCWlmICgoY2FyZC0+dS5jLmNvbW1fcG9ydCA9PSBXQU5PUFRfU0VDICYmIGNvbmYtPmludGVyZmFjZSA9PSBXQU5PUFRfVjM1KSYmCisJICAgIGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVSUk9SIC0gVjM1IEludGVyZmFjZSBub3Qgc3VwcG9ydGVkIG9uIFM1MDggJXMgcG9ydCBcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBQT1JUKGNhcmQtPnUuYy5jb21tX3BvcnQpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisKKwljYXJkLT53YW5kZXYuY2xvY2tpbmcgPSBjb25mLT5jbG9ja2luZzsKKworCXBvcnRfbnVtID0gY2FyZC0+dS5jLmNvbW1fcG9ydDsKKworCS8qIFNldHVwIFBvcnQgQnBzICovCisKKwlpZihjYXJkLT53YW5kZXYuY2xvY2tpbmcpIHsKKwkJaWYoKHBvcnRfbnVtID09IFdBTk9QVF9QUkkpIHx8IGNhcmQtPnUuYy5yZWNlaXZlX29ubHkpIHsKKwkJCS8qIEZvciBQcmltYXJ5IFBvcnQgMCAqLworICAgICAgICAgICAgICAgCQltYXhfcGVybWl0dGVkX2JhdWQgPQorCQkJCShjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCkgPworCQkJCVBSSV9NQVhfQkFVRF9SQVRFX1M1MTQgOiAKKwkJCQlQUklfTUFYX0JBVURfUkFURV9TNTA4OworCQl9CisJCWVsc2UgaWYocG9ydF9udW0gPT0gV0FOT1BUX1NFQykgeworCQkJLyogRm9yIFNlY29uZGFyeSBQb3J0IDEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9wZXJtaXR0ZWRfYmF1ZCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhcmQtPmh3LnR5cGUgPT0gU0RMQV9TNTE0KSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19NQVhfQkFVRF9SQVRFX1M1MTQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNfTUFYX0JBVURfUkFURV9TNTA4OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAKKwkJCWlmKGNvbmYtPmJwcyA+IG1heF9wZXJtaXR0ZWRfYmF1ZCkgeworCQkJCWNvbmYtPmJwcyA9IG1heF9wZXJtaXR0ZWRfYmF1ZDsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQmF1ZCB0b28gaGlnaCFcbiIsCisJCQkJCWNhcmQtPndhbmRldi5uYW1lKTsKKyAJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEJhdWQgcmF0ZSBzZXQgdG8gJWx1IGJwc1xuIiwgCisJCQkJCWNhcmQtPndhbmRldi5uYW1lLCBtYXhfcGVybWl0dGVkX2JhdWQpOworCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCWNhcmQtPndhbmRldi5icHMgPSBjb25mLT5icHM7CisJfWVsc2V7CisgICAgICAgIAljYXJkLT53YW5kZXYuYnBzID0gMDsKKyAgCX0KKworCS8qIFNldHVwIHRoZSBQb3J0IE1UVSAqLworCWlmKChwb3J0X251bSA9PSBXQU5PUFRfUFJJKSB8fCBjYXJkLT51LmMucmVjZWl2ZV9vbmx5KSB7CisKKwkJLyogRm9yIFByaW1hcnkgUG9ydCAwICovCisJCWNhcmQtPndhbmRldi5tdHUgPQorCQkJKGNvbmYtPm10dSA+PSBNSU5fTEdUSF9DSERMQ19EQVRBX0NGRykgPworCQkJbWluX3QodW5zaWduZWQgaW50LCBjb25mLT5tdHUsIFBSSV9NQVhfTk9fREFUQV9CWVRFU19JTl9GUkFNRSkgOgorCQkJQ0hETENfREZMVF9EQVRBX0xFTjsKKwl9IGVsc2UgaWYocG9ydF9udW0gPT0gV0FOT1BUX1NFQykgeyAKKwkJLyogRm9yIFNlY29uZGFyeSBQb3J0IDEgKi8KKwkJY2FyZC0+d2FuZGV2Lm10dSA9CisJCQkoY29uZi0+bXR1ID49IE1JTl9MR1RIX0NIRExDX0RBVEFfQ0ZHKSA/CisJCQltaW5fdCh1bnNpZ25lZCBpbnQsIGNvbmYtPm10dSwgU0VDX01BWF9OT19EQVRBX0JZVEVTX0lOX0ZSQU1FKSA6CisJCQlDSERMQ19ERkxUX0RBVEFfTEVOOworCX0KKworCS8qIEFkZCBvbiBhIFBQUCBIZWFkZXIgKi8KKwljYXJkLT53YW5kZXYubXR1ICs9IFBQUF9IRUFERVJfTEVOOworCisJLyogU2V0IHVwIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIGFyZWEgKi8KKwkvKiBSZWFkIHRoZSBDSERMQyBDb25maWd1cmF0aW9uIGFuZCBvYnRhaW46IAorCSAqCVB0ciB0byBzaGFyZWQgbWVtb3J5IGluZm9yIHN0cnVjdAorICAgICAgICAgKiBVc2UgdGhpcyBwb2ludGVyIHRvIGNhbGN1bGF0ZSB0aGUgdmFsdWUgb2YgY2FyZC0+dS5jLmZsYWdzICEKKyAJICovCisJbWIxLT5idWZmZXJfbGVuZ3RoID0gMDsKKwltYjEtPmNvbW1hbmQgPSBSRUFEX0NIRExDX0NPTkZJR1VSQVRJT047CisJZXJyID0gc2RsYV9leGVjKG1iMSkgPyBtYjEtPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJaWYoZXJyICE9IENPTU1BTkRfT0spIHsKKwkJY2xlYXJfYml0KDEsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKworICAgICAgICAgICAgICAgIGlmKGNhcmQtPmh3LnR5cGUgIT0gU0RMQV9TNTE0KQorICAgICAgICAgICAgICAgIAllbmFibGVfaXJxKGNhcmQtPmh3LmlycSk7CisKKwkJY2hkbGNfZXJyb3IoY2FyZCwgZXJyLCBtYjEpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZihjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCl7CisgICAgICAgICAgICAgICAJY2FyZC0+dS5jLmZsYWdzID0gKHZvaWQgKikoY2FyZC0+aHcuZHBtYmFzZSArCisgICAgICAgICAgICAgICAJCSgoKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICopbWIxLT5kYXRhKS0+CisJCQlwdHJfc2hhcmVkX21lbV9pbmZvX3N0cnVjdCkpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBjYXJkLT51LmMuZmxhZ3MgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICopbWIxLT5kYXRhKS0+CisJCQlwdHJfc2hhcmVkX21lbV9pbmZvX3N0cnVjdCAlIFNETEFfV0lORE9XU0laRSkpOworCX0KKwkKKwlmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKwkKKwkvKiBUaGlzIGlzIGZvciB0aGUgcG9ydHMgbGluayBzdGF0ZSAqLworCWNhcmQtPndhbmRldi5zdGF0ZSA9IFdBTl9EVUFMUE9SVDsKKwljYXJkLT51LmMuc3RhdGUgPSBXQU5fRElTQ09OTkVDVEVEOworCisKKwlpZiAoIWNhcmQtPndhbmRldi5waWdneWJhY2speworCQllcnIgPSBpbnRyX3Rlc3QoY2FyZCk7CisKKwkJaWYoZXJyIHx8IChJbnRyX3Rlc3RfY291bnRlciA8IE1BWF9JTlRSX1RFU1RfQ09VTlRFUikpIHsgCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnRlcnJ1cHQgdGVzdCBmYWlsZWQgKCVpKVxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSwgSW50cl90ZXN0X2NvdW50ZXIpOworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUGxlYXNlIGNob29zZSBhbm90aGVyIGludGVycnVwdFxuIiwKKwkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCQlyZXR1cm4gIC1FSU87CisJCX0KKwkJCQorCQlwcmludGsoS0VSTl9JTkZPICIlczogSW50ZXJydXB0IHRlc3QgcGFzc2VkICglaSlcbiIsIAorCQkJCWNhcmQtPmRldm5hbWUsIEludHJfdGVzdF9jb3VudGVyKTsKKwl9CisKKworCWlmIChjaGRsY19zZXRfaW50cl9tb2RlKGNhcmQsIEFQUF9JTlRfT05fVElNRVIpKXsKKwkJcHJpbnRrIChLRVJOX0lORk8gIiVzOiBGYWlsZWQgdG8gc2V0IGludGVycnVwdCB0cmlnZ2VycyFcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCXJldHVybiAtRUlPOwkKKyAgICAgICAgfQorCQorCS8qIE1hc2sgdGhlIFRpbWVyIGludGVycnVwdCAqLworCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gJj0gCisJCX5BUFBfSU5UX09OX1RJTUVSOworCisJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKiBXQU4gRGV2aWNlIERyaXZlciBFbnRyeSBQb2ludHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBVcGRhdGUgZGV2aWNlIHN0YXR1cyAmIHN0YXRpc3RpY3MKKyAqIFRoaXMgcHJvY2VkdXJlIGlzIGNhbGxlZCB3aGVuIHVwZGF0aW5nIHRoZSBQUk9DIGZpbGUgc3lzdGVtIGFuZCByZXR1cm5zCisgKiB2YXJpb3VzIGNvbW11bmljYXRpb25zIHN0YXRpc3RpY3MuIFRoZXNlIHN0YXRpc3RpY3MgYXJlIGFjY3VtdWxhdGVkIGZyb20gMyAKKyAqIGRpZmZlcmVudCBsb2NhdGlvbnM6CisgKiAJMSkgVGhlICdpZl9zdGF0cycgcmVjb3JkZWQgZm9yIHRoZSBkZXZpY2UuCisgKiAJMikgQ29tbXVuaWNhdGlvbiBlcnJvciBzdGF0aXN0aWNzIG9uIHRoZSBhZGFwdGVyLgorICogICAgICAzKSBDSERMQyBvcGVyYXRpb25hbCBzdGF0aXN0aWNzIG9uIHRoZSBhZGFwdGVyLgorICogVGhlIGJvYXJkIGxldmVsIHN0YXRpc3RpY3MgYXJlIHJlYWQgZHVyaW5nIGEgdGltZXIgaW50ZXJydXB0LiBOb3RlIHRoYXQgd2UgCisgKiByZWFkIHRoZSBlcnJvciBhbmQgb3BlcmF0aW9uYWwgc3RhdGlzdGljcyBkdXJpbmcgY29uc2VjaXRpdmUgdGltZXIgdGlja3Mgc28KKyAqIGFzIHRvIG1pbmltaXplIHRoZSB0aW1lIHRoYXQgd2UgYXJlIGluc2lkZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIuCisgKgorICovCitzdGF0aWMgaW50IHVwZGF0ZShzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2KQoreworCXNkbGFfdCogY2FyZCA9IHdhbmRldi0+cHJpdmF0ZTsKKyAJc3RydWN0IG5ldF9kZXZpY2UqIGRldjsKKyAgICAgICAgdm9sYXRpbGUgY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYTsKKyAgICAgICAgU0hBUkVEX01FTU9SWV9JTkZPX1NUUlVDVCAqZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJLyogc2FuaXR5IGNoZWNrcyAqLworCWlmKCh3YW5kZXYgPT0gTlVMTCkgfHwgKHdhbmRldi0+cHJpdmF0ZSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisJaWYod2FuZGV2LT5zdGF0ZSA9PSBXQU5fVU5DT05GSUdVUkVEKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIG1vcmUgc2FuaXR5IGNoZWNrcyAqLworICAgICAgICBpZighY2FyZC0+dS5jLmZsYWdzKQorICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworCisJaWYoKGRldj1jYXJkLT53YW5kZXYuZGV2KSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmKChjaGRsY19wcml2X2FyZWE9ZGV2LT5wcml2KSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworICAgICAgCWZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCisgICAgICAgCWlmKGNoZGxjX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzKXsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCQkJCisJLyogd2Ugd2lsbCBuZWVkIDIgdGltZXIgaW50ZXJydXB0cyB0byBjb21wbGV0ZSB0aGUgKi8KKwkvKiByZWFkaW5nIG9mIHRoZSBzdGF0aXN0aWNzICovCisJY2hkbGNfcHJpdl9hcmVhLT51cGRhdGVfY29tbXNfc3RhdHMgPSAyOworICAgICAgIAlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF9wZXJtaXNzaW9uIHw9IEFQUF9JTlRfT05fVElNRVI7CisJY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCA9IFRNUl9JTlRfRU5BQkxFRF9VUERBVEU7CisgIAorCS8qIHdhaXQgYSBtYXhpbXVtIG9mIDEgc2Vjb25kIGZvciB0aGUgc3RhdGlzdGljcyB0byBiZSB1cGRhdGVkICovIAorICAgICAgICB0aW1lb3V0ID0gamlmZmllczsKKyAgICAgICAgZm9yKDs7KSB7CisJCWlmKGNoZGxjX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzID09IDApCisJCQlicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoKGppZmZpZXMgLSB0aW1lb3V0KSA+ICgxICogSFopKXsKKyAgICAJCQljaGRsY19wcml2X2FyZWEtPnVwZGF0ZV9jb21tc19zdGF0cyA9IDA7CisgCQkJY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmPQorCQkJCX5UTVJfSU5UX0VOQUJMRURfVVBEQVRFOyAKKyAJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorICAgICAgICB9CisKKwlyZXR1cm4gMDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENyZWF0ZSBuZXcgbG9naWNhbCBjaGFubmVsLgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgcm91dGVyIHdoZW4gUk9VVEVSX0lGTkVXIElPQ1RMIGlzIGJlaW5nCisgKiBoYW5kbGVkLgorICogbyBwYXJzZSBtZWRpYS0gYW5kIGhhcmR3YXJlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24KKyAqIG8gbWFrZSBzdXJlIHRoYXQgYSBuZXcgY2hhbm5lbCBjYW4gYmUgY3JlYXRlZAorICogbyBhbGxvY2F0ZSByZXNvdXJjZXMsIGlmIG5lY2Vzc2FyeQorICogbyBwcmVwYXJlIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZSBmb3IgcmVnaXN0YXJhdGlvbi4KKyAqCisgKiBSZXR1cm46CTAJby5rLgorICoJCTwgMAlmYWlsdXJlIChjaGFubmVsIHdpbGwgbm90IGJlIGNyZWF0ZWQpCisgKi8KK3N0YXRpYyBpbnQgbmV3X2lmKHN0cnVjdCB3YW5fZGV2aWNlKiB3YW5kZXYsIHN0cnVjdCBuZXRfZGV2aWNlKiBwZGV2LAorCQkgIHdhbmlmX2NvbmZfdCogY29uZikKK3sKKworCXN0cnVjdCBwcHBfZGV2aWNlICpwcHBkZXYgPSAoc3RydWN0IHBwcF9kZXZpY2UgKilwZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOworCXN0cnVjdCBzcHBwICpzcDsKKwlzZGxhX3QqIGNhcmQgPSB3YW5kZXYtPnByaXZhdGU7CisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYTsKKwkKKwlpZiAoKGNvbmYtPm5hbWVbMF0gPT0gJ1wwJykgfHwgKHN0cmxlbihjb25mLT5uYW1lKSA+IFdBTl9JRk5BTUVfU1opKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnZhbGlkIGludGVyZmFjZSBuYW1lIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJCQorCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHByaXZhdGUgZGF0YSAqLworCWNoZGxjX3ByaXZfYXJlYSA9IGttYWxsb2Moc2l6ZW9mKGNoZGxjX3ByaXZhdGVfYXJlYV90KSwgR0ZQX0tFUk5FTCk7CisJCisJaWYoY2hkbGNfcHJpdl9hcmVhID09IE5VTEwpIAorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChjaGRsY19wcml2X2FyZWEsIDAsIHNpemVvZihjaGRsY19wcml2YXRlX2FyZWFfdCkpOworCisJY2hkbGNfcHJpdl9hcmVhLT5jYXJkID0gY2FyZDsgCisKKwkvKiBpbml0aWFsaXplIGRhdGEgKi8KKwlzdHJjcHkoY2FyZC0+dS5jLmlmX25hbWUsIGNvbmYtPm5hbWUpOworCisJaWYoY2FyZC0+d2FuZGV2Lm5ld19pZl9jbnQgPiAwKSB7CisgICAgICAgICAgICAgICAga2ZyZWUoY2hkbGNfcHJpdl9hcmVhKTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJY2FyZC0+d2FuZGV2Lm5ld19pZl9jbnQrKzsKKworCWNoZGxjX3ByaXZfYXJlYS0+VHJhY2luZ0VuYWJsZWQgPSAwOworCisJLy9XZSBkb24ndCBuZWVkIHRoaXMgYW55IG1vcmUKKwljaGRsY19wcml2X2FyZWEtPnJvdXRlX3N0YXR1cyA9IE5PX1JPVVRFOworCWNoZGxjX3ByaXZfYXJlYS0+cm91dGVfcmVtb3ZlZCA9IDA7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogRmlybXdhcmUgcnVubmluZyBpbiBIRExDIFNUUkVBTUlORyBNb2RlXG4iLAorCQl3YW5kZXYtPm5hbWUpOworCQorCS8qIFNldHVwIHdhbnBpcGUgYXMgYSByb3V0ZXIgKFdBTlBJUEUpIG9yIGFzIGFuIEFQSSAqLworCWlmKCBzdHJjbXAoY29uZi0+dXNlZGJ5LCAiV0FOUElQRSIpID09IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERyaXZlciBydW5uaW5nIGluIFdBTlBJUEUgbW9kZSFcbiIsCisJCQl3YW5kZXYtPm5hbWUpOworCQljYXJkLT51LmMudXNlZGJ5ID0gV0FOUElQRTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPIAorCQkJIiVzOiBBUEkgTW9kZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBTeW5jUFBQIVxuIiwKKwkJCXdhbmRldi0+bmFtZSk7CisJCWtmcmVlKGNoZGxjX3ByaXZfYXJlYSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEdldCBNdWx0aWNhc3QgSW5mb3JtYXRpb24gKi8KKwljaGRsY19wcml2X2FyZWEtPm1jID0gY29uZi0+bWM7CisKKworCWNoZGxjX3ByaXZfYXJlYS0+aWZfcHRyID0gcHBwZGV2OworCisJLyogcHJlcGFyZSBuZXR3b3JrIGRldmljZSBkYXRhIHNwYWNlIGZvciByZWdpc3RyYXRpb24gKi8KKworCXN0cmNweShkZXYtPm5hbWUsY2FyZC0+dS5jLmlmX25hbWUpOworCisJLyogQXR0YWNoIFBQUCBwcm90b2NvbCBsYXllciB0byBwcHBkZXYKKwkgKiBUaGUgc3BwcF9hdHRhY2goKSB3aWxsIGluaXRpbGl6ZSB0aGUgZGV2IHN0cnVjdHVyZQorICAgICAgICAgKiBhbmQgc2V0dXAgcHBwIGxheWVyIHByb3RvY29scy4KKyAgICAgICAgICogQWxsIHdlIGhhdmUgdG8gZG8gaXMgdG8gYmluZCBpbjoKKyAgICAgICAgICogICAgICAgIGlmX29wZW4oKSwgaWZfY2xvc2UoKSwgaWZfc2VuZCgpIGFuZCBnZXRfc3RhdHMoKSBmdW5jdGlvbnMuCisgICAgICAgICAqLworCXNwcHBfYXR0YWNoKHBwcGRldik7CisJZGV2ID0gcHBwZGV2LT5kZXY7CisJc3AgPSAmcHBwZGV2LT5zcHBwOworCQorCS8qIEVuYWJsZSBQUFAgRGVidWdnaW5nICovCisJLy8gRklYTUUgRml4IHRoaXMgdXAgc29tZWhvdworCS8vc3AtPnBwX2ZsYWdzIHw9IFBQX0RFQlVHOyAJCisJc3AtPnBwX2ZsYWdzICY9IH5QUF9DSVNDTzsKKworCWRldi0+aW5pdCA9ICZpZl9pbml0OworCWRldi0+cHJpdiA9IGNoZGxjX3ByaXZfYXJlYTsKKwkKKwlyZXR1cm4gMDsKK30KKworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZWxldGUgbG9naWNhbCBjaGFubmVsLgorICovCitzdGF0aWMgaW50IGRlbF9pZihzdHJ1Y3Qgd2FuX2RldmljZSogd2FuZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCWNoZGxjX3ByaXZhdGVfYXJlYV90ICpjaGRsY19wcml2X2FyZWEgPSBkZXYtPnByaXY7CisJc2RsYV90ICpjYXJkID0gY2hkbGNfcHJpdl9hcmVhLT5jYXJkOworCXVuc2lnbmVkIGxvbmcgc21wX2xvY2s7CisJCisJLyogRGV0YWNoIHRoZSBQUFAgbGF5ZXIgKi8KKwlwcmludGsoS0VSTl9JTkZPICIlczogRGV0YWNoaW5nIFN5bmNQUFAgTW9kdWxlIGZyb20gJXNcbiIsCisJCQl3YW5kZXYtPm5hbWUsZGV2LT5uYW1lKTsKKworCWxvY2tfYWRhcHRlcl9pcnEoJndhbmRldi0+bG9jaywmc21wX2xvY2spOworCisJc3BwcF9kZXRhY2goZGV2KTsKKwljaGRsY19wcml2X2FyZWEtPmlmX3B0cj1OVUxMOworCQorCWNoZGxjX3NldF9pbnRyX21vZGUoY2FyZCwgMCk7CisJaWYgKGNhcmQtPnUuYy5jb21tX2VuYWJsZWQpCisJCWNoZGxjX2NvbW1fZGlzYWJsZShjYXJkKTsKKwl1bmxvY2tfYWRhcHRlcl9pcnEoJndhbmRldi0+bG9jaywmc21wX2xvY2spOworCQorCXBvcnRfc2V0X3N0YXRlKGNhcmQsIFdBTl9ESVNDT05ORUNURUQpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKiBOZXR3b3JrIERldmljZSBJbnRlcmZhY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBMaW51eCBuZXR3b3JrIGludGVyZmFjZS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIG9ubHkgb25jZSBmb3IgZWFjaCBpbnRlcmZhY2UsIGR1cmluZyBMaW51eCBuZXR3b3JrCisgKiBpbnRlcmZhY2UgcmVnaXN0cmF0aW9uLiAgUmV0dXJuaW5nIGFueXRoaW5nIGJ1dCB6ZXJvIHdpbGwgZmFpbCBpbnRlcmZhY2UKKyAqIHJlZ2lzdHJhdGlvbi4KKyAqLworc3RhdGljIGludCBpZl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwlzZGxhX3QqIGNhcmQgPSBjaGRsY19wcml2X2FyZWEtPmNhcmQ7CisJc3RydWN0IHdhbl9kZXZpY2UqIHdhbmRldiA9ICZjYXJkLT53YW5kZXY7CisJCisJLyogTk9URTogTW9zdCBvZiB0aGUgZGV2IGluaXRpYWxpemF0aW9uIHdhcworICAgICAgICAgKiAgICAgICBkb25lIGluIHNwcHBfYXR0YWNoKCksIGNhbGxlZCBieSBuZXdfaWYoKSAKKyAgICAgICAgICogICAgICAgZnVuY3Rpb24uIEFsbCB3ZSBoYXZlIHRvIGRvIGhlcmUgaXMKKyAgICAgICAgICogICAgICAgdG8gbGluayBmb3VyIG1ham9yIHJvdXRpbmVzIGJlbG93LiAKKyAgICAgICAgICovCisKKwkvKiBJbml0aWFsaXplIGRldmljZSBkcml2ZXIgZW50cnkgcG9pbnRzICovCisJZGV2LT5vcGVuCQk9ICZpZl9vcGVuOworCWRldi0+c3RvcAkJPSAmaWZfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSAmaWZfc2VuZDsKKwlkZXYtPmdldF9zdGF0cwkJPSAmaWZfc3RhdHM7CisJZGV2LT50eF90aW1lb3V0CQk9ICZpZl90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBUWF9USU1FT1VUOworCisKKwkvKiBJbml0aWFsaXplIGhhcmR3YXJlIHBhcmFtZXRlcnMgKi8KKwlkZXYtPmlycQk9IHdhbmRldi0+aXJxOworCWRldi0+ZG1hCT0gd2FuZGV2LT5kbWE7CisJZGV2LT5iYXNlX2FkZHIJPSB3YW5kZXYtPmlvcG9ydDsKKwlkZXYtPm1lbV9zdGFydAk9IHdhbmRldi0+bWFkZHI7CisJZGV2LT5tZW1fZW5kCT0gd2FuZGV2LT5tYWRkciArIHdhbmRldi0+bXNpemUgLSAxOworCisJLyogU2V0IHRyYW5zbWl0IGJ1ZmZlciBxdWV1ZSBsZW5ndGggCisgICAgICAgICAqIElmIHdlIG92ZXIgZmlsbCB0aGlzIHF1ZXVlIHRoZSBwYWNrZXRzIHdpbGwKKyAgICAgICAgICogYmUgZHJvcGVkIGJ5IHRoZSBrZXJuZWwuCisgICAgICAgICAqIHNwcHBfYXR0YWNoKCkgc2V0cyB0aGlzIHRvIDEwLCBidXQKKyAgICAgICAgICogMTAwIHdpbGwgZ2l2ZSB1cyBtb3JlIHJvb20gYXQgbG93IHNwZWVkcy4KKwkgKi8KKyAgICAgICAgZGV2LT50eF9xdWV1ZV9sZW4gPSAxMDA7CisgICAKKwlyZXR1cm4gMDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEhhbmRsZSB0cmFuc21pdCB0aW1lb3V0IGV2ZW50IGZyb20gbmV0aWYgd2F0Y2hkb2cKKyAqLworc3RhdGljIHZvaWQgaWZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIAljaGRsY19wcml2YXRlX2FyZWFfdCogY2hhbiA9IGRldi0+cHJpdjsKKwlzZGxhX3QgKmNhcmQgPSBjaGFuLT5jYXJkOworCQorCS8qIElmIG91ciBkZXZpY2Ugc3RheXMgYnVzeSBmb3IgYXQgbGVhc3QgNSBzZWNvbmRzIHRoZW4gd2Ugd2lsbAorCSAqIGtpY2sgc3RhcnQgdGhlIGRldmljZSBieSBtYWtpbmcgZGV2LT50YnVzeSA9IDAuICBXZSBleHBlY3QKKwkgKiB0aGF0IG91ciBkZXZpY2UgbmV2ZXIgc3RheXMgYnVzeSBtb3JlIHRoYW4gNSBzZWNvbmRzLiBTbyB0aGlzICAgICAgICAgICAgICAgICAKKwkgKiBpcyBvbmx5IHVzZWQgYXMgYSBsYXN0IHJlc29ydC4KKwkgKi8KKworCSsrY2FyZC0+d2FuZGV2LnN0YXRzLmNvbGxpc2lvbnM7CisKKwlwcmludGsgKEtFUk5fSU5GTyAiJXM6IFRyYW5zbWl0IHRpbWVkIG91dCBvbiAlc1xuIiwgY2FyZC0+ZGV2bmFtZSxkZXYtPm5hbWUpOworCW5ldGlmX3dha2VfcXVldWUgKGRldik7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBPcGVuIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyBlbmFibGUgY29tbXVuaWNhdGlvbnMgYW5kIGludGVycnVwdHMuCisgKiBvIHByZXZlbnQgbW9kdWxlIGZyb20gdW5sb2FkaW5nIGJ5IGluY3JlbWVudGluZyB1c2UgY291bnQKKyAqCisgKiBSZXR1cm4gMCBpZiBPLmsuIG9yIGVycm5vLgorICovCitzdGF0aWMgaW50IGlmX29wZW4oc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwljaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCXNkbGFfdCogY2FyZCA9IGNoZGxjX3ByaXZfYXJlYS0+Y2FyZDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlTSEFSRURfTUVNT1JZX0lORk9fU1RSVUNUICpmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKworCS8qIE9ubHkgb25lIG9wZW4gcGVyIGludGVyZmFjZSBpcyBhbGxvd2VkICovCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIFN0YXJ0IFBQUCBMYXllciAqLworCWlmIChzcHBwX29wZW4oZGV2KSl7CisJCXJldHVybiAtRUlPOworCX0KKworCWRvX2dldHRpbWVvZmRheSgmdHYpOworCWNoZGxjX3ByaXZfYXJlYS0+cm91dGVyX3N0YXJ0X3RpbWUgPSB0di50dl9zZWM7CisgCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkKKwl3YW5waXBlX29wZW4oY2FyZCk7CisKKwljaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkIHw9IFRNUl9JTlRfRU5BQkxFRF9DT05GSUc7CisJZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfcGVybWlzc2lvbiB8PSBBUFBfSU5UX09OX1RJTUVSOworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENsb3NlIG5ldHdvcmsgaW50ZXJmYWNlLgorICogbyBpZiB0aGlzIGlzIHRoZSBsYXN0IGNsb3NlLCB0aGVuIGRpc2FibGUgY29tbXVuaWNhdGlvbnMgYW5kIGludGVycnVwdHMuCisgKiBvIHJlc2V0IGZsYWdzLgorICovCitzdGF0aWMgaW50IGlmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpCit7CisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKwlzZGxhX3QqIGNhcmQgPSBjaGRsY19wcml2X2FyZWEtPmNhcmQ7CisKKwkvKiBTdG9wIHRoZSBQUFAgTGF5ZXIgKi8KKwlzcHBwX2Nsb3NlKGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJd2FucGlwZV9jbG9zZShjYXJkKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIGEgcGFja2V0IG9uIGEgbmV0d29yayBpbnRlcmZhY2UuCisgKiBvIHNldCB0YnVzeSBmbGFnIChtYXJrcyBzdGFydCBvZiB0aGUgdHJhbnNtaXNzaW9uKSB0byBibG9jayBhIHRpbWVyLWJhc2VkCisgKiAgIHRyYW5zbWl0IGZyb20gb3ZlcmxhcHBpbmcuCisgKiBvIGNoZWNrIGxpbmsgc3RhdGUuIElmIGxpbmsgaXMgbm90IHVwLCB0aGVuIGRyb3AgdGhlIHBhY2tldC4KKyAqIG8gZXhlY3V0ZSBhZGFwdGVyIHNlbmQgY29tbWFuZC4KKyAqIG8gZnJlZSBzb2NrZXQgYnVmZmVyCisgKgorICogUmV0dXJuOgkwCWNvbXBsZXRlIChzb2NrZXQgYnVmZmVyIG11c3QgYmUgZnJlZWQpCisgKgkJbm9uLTAJcGFja2V0IG1heSBiZSByZS10cmFuc21pdHRlZCAodGJ1c3kgbXVzdCBiZSBzZXQpCisgKgorICogTm90ZXM6CisgKiAxLiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGVpdGhlciBieSB0aGUgcHJvdG9jb2wgc3RhY2sgb3IgYnkgdGhlICJuZXQKKyAqICAgIGJvdHRvbSBoYWxmIiAod2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQpLgorICogMi4gU2V0dGluZyB0YnVzeSBmbGFnIHdpbGwgaW5oaWJpdCBmdXJ0aGVyIHRyYW5zbWl0IHJlcXVlc3RzIGZyb20gdGhlCisgKiAgICBwcm90b2NvbCBzdGFjayBhbmQgY2FuIGJlIHVzZWQgZm9yIGZsb3cgY29udHJvbCB3aXRoIHByb3RvY29sIGxheWVyLgorICovCitzdGF0aWMgaW50IGlmX3NlbmQoc3RydWN0IHNrX2J1ZmYqIHNrYiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldikKK3sKKwljaGRsY19wcml2YXRlX2FyZWFfdCAqY2hkbGNfcHJpdl9hcmVhID0gZGV2LT5wcml2OworCXNkbGFfdCAqY2FyZCA9IGNoZGxjX3ByaXZfYXJlYS0+Y2FyZDsKKwlTSEFSRURfTUVNT1JZX0lORk9fU1RSVUNUICpmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKwlJTlRFUlJVUFRfSU5GT1JNQVRJT05fU1RSVUNUICpjaGRsY19pbnQgPSAmZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdDsKKwlpbnQgdWRwX3R5cGUgPSAwOworCXVuc2lnbmVkIGxvbmcgc21wX2ZsYWdzOworCWludCBlcnI9MDsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQorCWlmIChza2IgPT0gTlVMTCl7CisJCS8qIElmIHdlIGdldCBoZXJlLCBzb21lIGhpZ2hlciBsYXllciB0aGlua3Mgd2UndmUgbWlzc2VkIGFuCisJCSAqIHR4LWRvbmUgaW50ZXJydXB0LgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlY2VpdmVkIE5VTEwgc2tiIGJ1ZmZlciEgaW50ZXJmYWNlICVzIGdvdCBraWNrZWQhXG4iLAorCQkJY2FyZC0+ZGV2bmFtZSwgZGV2LT5uYW1lKTsKKworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCXJldHVybiAwOworCX0KKworICAgCWlmIChudG9ocyhza2ItPnByb3RvY29sKSAhPSBodG9ucyhQVkNfUFJPVCkpeworCQkvKiBjaGVjayB0aGUgdWRwIHBhY2tldCB0eXBlICovCisJCQorCQl1ZHBfdHlwZSA9IHVkcF9wa3RfdHlwZShza2IsIGNhcmQpOworCQlpZiAodWRwX3R5cGUgPT0gVURQX0NQSVBFX1RZUEUpeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RvcmVfdWRwX21nbXRfcGt0KFVEUF9QS1RfRlJNX1NUQUNLLCBjYXJkLCBza2IsIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hkbGNfcHJpdl9hcmVhKSl7CisJCQkJY2hkbGNfaW50LT5pbnRlcnJ1cHRfcGVybWlzc2lvbiB8PQorCQkJCQlBUFBfSU5UX09OX1RJTUVSOworCQkJfQorCQkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwkJCXJldHVybiAwOworCQl9CisgICAgICAgIH0KKworCS8qIExvY2sgdGhlIDUwOCBDYXJkOiBTTVAgaXMgc3VwcG9ydGVkICovCisgICAgICAJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpeworCQlzNTA4X2xvY2soY2FyZCwmc21wX2ZsYWdzKTsKKwl9IAorCisgICAgCWlmICh0ZXN0X2FuZF9zZXRfYml0KFNFTkRfQ1JJVCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKXsKKwkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENyaXRpY2FsIGluIGlmX3NlbmQ6ICVseFxuIiwKKwkJCQkJY2FyZC0+d2FuZGV2Lm5hbWUsY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKyAgICAgICAgICAgICAgICArK2NhcmQtPndhbmRldi5zdGF0cy50eF9kcm9wcGVkOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQlnb3RvIGlmX3NlbmRfY3JpdF9leGl0OworCX0KKworCWlmIChjYXJkLT53YW5kZXYuc3RhdGUgIT0gV0FOX0NPTk5FQ1RFRCl7CisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2Ryb3BwZWQ7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCWdvdG8gaWZfc2VuZF9jcml0X2V4aXQ7CisJfQorCQorCWlmIChjaGRsY19zZW5kKGNhcmQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pKXsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJfWVsc2V7CisJCSsrY2FyZC0+d2FuZGV2LnN0YXRzLnR4X3BhY2tldHM7CisgICAgICAgCQljYXJkLT53YW5kZXYuc3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCX0JCisKK2lmX3NlbmRfY3JpdF9leGl0OgorCWlmICghKGVycj1uZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpKXsKKyAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX1lbHNleworCQljaGRsY19wcml2X2FyZWEtPnRpY2tfY291bnRlciA9IGppZmZpZXM7CisJCWNoZGxjX2ludC0+aW50ZXJydXB0X3Blcm1pc3Npb24gfD0gQVBQX0lOVF9PTl9UWF9GUkFNRTsKKwl9CisKKwljbGVhcl9iaXQoU0VORF9DUklULCAodm9pZCopJmNhcmQtPndhbmRldi5jcml0aWNhbCk7CisJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpeworCQlzNTA4X3VubG9jayhjYXJkLCZzbXBfZmxhZ3MpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZXBseSB0byBVRFAgTWFuYWdlbWVudCBzeXN0ZW0uCisgKiBSZXR1cm4gbGVuZ3RoIG9mIHJlcGx5LgorICovCitzdGF0aWMgaW50IHJlcGx5X3VkcCggdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IG1ib3hfbGVuICkKK3sKKworCXVuc2lnbmVkIHNob3J0IGxlbiwgdWRwX2xlbmd0aCwgdGVtcCwgaXBfbGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgaXBfdGVtcDsKKwlpbnQgZXZlbl9ib3VuZCA9IDA7CisgIAljaGRsY191ZHBfcGt0X3QgKmNfdWRwX3BrdCA9IChjaGRsY191ZHBfcGt0X3QgKilkYXRhOworCSAKKwkvKiBTZXQgbGVuZ3RoIG9mIHBhY2tldCAqLworCWxlbiA9IHNpemVvZihpcF9wa3RfdCkrIAorCSAgICAgIHNpemVvZih1ZHBfcGt0X3QpKworCSAgICAgIHNpemVvZih3cF9tZ210X3QpKworCSAgICAgIHNpemVvZihjYmxvY2tfdCkrCisJICAgICAgc2l6ZW9mKHRyYWNlX2luZm9fdCkrIAorCSAgICAgIG1ib3hfbGVuOworCisJLyogZmlsbCBpbiBVRFAgcmVwbHkgKi8KKwljX3VkcF9wa3QtPndwX21nbXQucmVxdWVzdF9yZXBseSA9IFVEUE1HTVRfUkVQTFk7CisgICAKKwkvKiBmaWxsIGluIFVEUCBsZW5ndGggKi8KKwl1ZHBfbGVuZ3RoID0gc2l6ZW9mKHVkcF9wa3RfdCkrIAorCQkgICAgIHNpemVvZih3cF9tZ210X3QpKworCQkgICAgIHNpemVvZihjYmxvY2tfdCkrCisJICAgICAgICAgICAgIHNpemVvZih0cmFjZV9pbmZvX3QpKworCQkgICAgIG1ib3hfbGVuOyAKKworIAkvKiBwdXQgaXQgb24gYW4gZXZlbiBib3VuZGFyeSAqLworCWlmICggdWRwX2xlbmd0aCAmIDB4MDAwMSApIHsKKwkJdWRwX2xlbmd0aCArPSAxOworCQlsZW4gKz0gMTsKKwkJZXZlbl9ib3VuZCA9IDE7CisJfSAgCisKKwl0ZW1wID0gKHVkcF9sZW5ndGg8PDgpfCh1ZHBfbGVuZ3RoPj44KTsKKwljX3VkcF9wa3QtPnVkcF9wa3QudWRwX2xlbmd0aCA9IHRlbXA7CisJCSAKKwkvKiBzd2FwIFVEUCBwb3J0cyAqLworCXRlbXAgPSBjX3VkcF9wa3QtPnVkcF9wa3QudWRwX3NyY19wb3J0OworCWNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfc3JjX3BvcnQgPSAKKwkJCWNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfZHN0X3BvcnQ7IAorCWNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfZHN0X3BvcnQgPSB0ZW1wOworCisJLyogYWRkIFVEUCBwc2V1ZG8gaGVhZGVyICovCisJdGVtcCA9IDB4MTEwMDsKKwkqKCh1bnNpZ25lZCBzaG9ydCAqKShjX3VkcF9wa3QtPmRhdGErbWJveF9sZW4rZXZlbl9ib3VuZCkpID0gdGVtcDsJCisJdGVtcCA9ICh1ZHBfbGVuZ3RoPDw4KXwodWRwX2xlbmd0aD4+OCk7CisJKigodW5zaWduZWQgc2hvcnQgKikoY191ZHBfcGt0LT5kYXRhK21ib3hfbGVuK2V2ZW5fYm91bmQrMikpID0gdGVtcDsKKworCQkgCisJLyogY2FsY3VsYXRlIFVEUCBjaGVja3N1bSAqLworCWNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfY2hlY2tzdW0gPSAwOworCWNfdWRwX3BrdC0+dWRwX3BrdC51ZHBfY2hlY2tzdW0gPSBjYWxjX2NoZWNrc3VtKCZkYXRhW1VEUF9PRkZTRVRdLHVkcF9sZW5ndGgrVURQX09GRlNFVCk7CisKKwkvKiBmaWxsIGluIElQIGxlbmd0aCAqLworCWlwX2xlbmd0aCA9IGxlbjsKKwl0ZW1wID0gKGlwX2xlbmd0aDw8OCl8KGlwX2xlbmd0aD4+OCk7CisJY191ZHBfcGt0LT5pcF9wa3QudG90YWxfbGVuZ3RoID0gdGVtcDsKKyAgCisJLyogc3dhcCBJUCBhZGRyZXNzZXMgKi8KKwlpcF90ZW1wID0gY191ZHBfcGt0LT5pcF9wa3QuaXBfc3JjX2FkZHJlc3M7CisJY191ZHBfcGt0LT5pcF9wa3QuaXBfc3JjX2FkZHJlc3MgPSBjX3VkcF9wa3QtPmlwX3BrdC5pcF9kc3RfYWRkcmVzczsKKwljX3VkcF9wa3QtPmlwX3BrdC5pcF9kc3RfYWRkcmVzcyA9IGlwX3RlbXA7CisKKwkvKiBmaWxsIGluIElQIGNoZWNrc3VtICovCisJY191ZHBfcGt0LT5pcF9wa3QuaGRyX2NoZWNrc3VtID0gMDsKKwljX3VkcF9wa3QtPmlwX3BrdC5oZHJfY2hlY2tzdW0gPSBjYWxjX2NoZWNrc3VtKGRhdGEsc2l6ZW9mKGlwX3BrdF90KSk7CisKKwlyZXR1cm4gbGVuOworCit9IC8qIHJlcGx5X3VkcCAqLworCit1bnNpZ25lZCBzaG9ydCBjYWxjX2NoZWNrc3VtIChjaGFyICpkYXRhLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIHNob3J0IHRlbXA7IAorCXVuc2lnbmVkIGxvbmcgc3VtPTA7CisJaW50IGk7CisKKwlmb3IoIGkgPSAwOyBpIDxsZW47IGkrPTIgKSB7CisJCW1lbWNweSgmdGVtcCwmZGF0YVtpXSwyKTsKKwkJc3VtICs9ICh1bnNpZ25lZCBsb25nKXRlbXA7CisJfQorCisJd2hpbGUgKHN1bSA+PiAxNiApIHsKKwkJc3VtID0gKHN1bSAmIDB4ZmZmZlVMKSArIChzdW0gPj4gMTYpOworCX0KKworCXRlbXAgPSAodW5zaWduZWQgc2hvcnQpc3VtOworCXRlbXAgPSB+dGVtcDsKKworCWlmKCB0ZW1wID09IDAgKSAKKwkJdGVtcCA9IDB4ZmZmZjsKKworCXJldHVybiB0ZW1wOwkKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEdldCBldGhlcm5ldC1zdHlsZSBpbnRlcmZhY2Ugc3RhdGlzdGljcy4KKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gc3RydWN0IGVuZXRfc3RhdGlzdGljcy4KKyAqLworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKiBpZl9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQoreworCXNkbGFfdCAqbXlfY2FyZDsKKwljaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhOworCisJLyogU2h1dGRvd24gYnVnIGZpeC4gSW4gZGVsX2lmKCkgd2Uga2lsbAorICAgICAgICAgKiBkZXYtPnByaXYgcG9pbnRlci4gVGhpcyBmdW5jdGlvbiwgZ2V0cworICAgICAgICAgKiBjYWxsZWQgYWZ0ZXIgZGVsX2lmKCksIHRodXMgY2hlY2sKKyAgICAgICAgICogaWYgcG9pbnRlciBoYXMgYmVlbiBkZWxldGVkICovCisJaWYgKChjaGRsY19wcml2X2FyZWE9ZGV2LT5wcml2KSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW15X2NhcmQgPSBjaGRsY19wcml2X2FyZWEtPmNhcmQ7CisJcmV0dXJuICZteV9jYXJkLT53YW5kZXYuc3RhdHM7IAorfQorCisKKy8qKioqKiogQ2lzY28gSERMQyBGaXJtd2FyZSBJbnRlcmZhY2UgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBmaXJtd2FyZSBjb2RlIHZlcnNpb24uCisgKglQdXQgY29kZSB2ZXJzaW9uIGFzIEFTQ0lJIHN0cmluZyBpbiBzdHIuIAorICovCitzdGF0aWMgaW50IGNoZGxjX3JlYWRfdmVyc2lvbiAoc2RsYV90KiBjYXJkLCBjaGFyKiBzdHIpCit7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKwlpbnQgbGVuOworCWNoYXIgZXJyOworCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwltYi0+Y29tbWFuZCA9IFJFQURfQ0hETENfQ09ERV9WRVJTSU9OOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKworCWlmKGVyciAhPSBDT01NQU5EX09LKSB7CisJCWNoZGxjX2Vycm9yKGNhcmQsZXJyLG1iKTsKKwl9CisJZWxzZSBpZiAoc3RyKSB7ICAvKiBpcyBub3QgbnVsbCAqLworCQlsZW4gPSBtYi0+YnVmZmVyX2xlbmd0aDsKKwkJbWVtY3B5KHN0ciwgbWItPmRhdGEsIGxlbik7CisJCXN0cltsZW5dID0gJ1wwJzsKKwl9CisJcmV0dXJuIChlcnIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgQ29uZmlndXJlIENIRExDIGZpcm13YXJlLgorICovCitzdGF0aWMgaW50IGNoZGxjX2NvbmZpZ3VyZSAoc2RsYV90KiBjYXJkLCB2b2lkKiBkYXRhKQoreworCWludCBlcnI7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QgKm1haWxib3ggPSBjYXJkLT5tYm94OworCWludCBkYXRhX2xlbmd0aCA9IHNpemVvZihDSERMQ19DT05GSUdVUkFUSU9OX1NUUlVDVCk7CisJCisJbWFpbGJveC0+YnVmZmVyX2xlbmd0aCA9IGRhdGFfbGVuZ3RoOyAgCisJbWVtY3B5KG1haWxib3gtPmRhdGEsIGRhdGEsIGRhdGFfbGVuZ3RoKTsKKwltYWlsYm94LT5jb21tYW5kID0gU0VUX0NIRExDX0NPTkZJR1VSQVRJT047CisJZXJyID0gc2RsYV9leGVjKG1haWxib3gpID8gbWFpbGJveC0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwkKKwlpZiAoZXJyICE9IENPTU1BTkRfT0spIGNoZGxjX2Vycm9yIChjYXJkLCBlcnIsIG1haWxib3gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJcmV0dXJuIGVycjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBpbnRlcnJ1cHQgbW9kZSAtLSBIRExDIFZlcnNpb24uCisgKi8KKworc3RhdGljIGludCBjaGRsY19zZXRfaW50cl9tb2RlIChzZGxhX3QqIGNhcmQsIHVuc2lnbmVkIG1vZGUpCit7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKwlDSERMQ19JTlRfVFJJR0dFUlNfU1RSVUNUKiBpbnRfZGF0YSA9CisJCSAoQ0hETENfSU5UX1RSSUdHRVJTX1NUUlVDVCAqKW1iLT5kYXRhOworCWludCBlcnI7CisKKwlpbnRfZGF0YS0+Q0hETENfaW50ZXJydXB0X3RyaWdnZXJzIAk9IG1vZGU7CisJaW50X2RhdGEtPklSUQkJCQk9IGNhcmQtPmh3LmlycTsKKwlpbnRfZGF0YS0+aW50ZXJydXB0X3RpbWVyICAgICAgICAgICAgICAgPSAxOworICAgCisJbWItPmJ1ZmZlcl9sZW5ndGggPSBzaXplb2YoQ0hETENfSU5UX1RSSUdHRVJTX1NUUlVDVCk7CisJbWItPmNvbW1hbmQgPSBTRVRfQ0hETENfSU5URVJSVVBUX1RSSUdHRVJTOworCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwlpZiAoZXJyICE9IENPTU1BTkRfT0spCisJCWNoZGxjX2Vycm9yIChjYXJkLCBlcnIsIG1iKTsKKwlyZXR1cm4gZXJyOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRW5hYmxlIGNvbW11bmljYXRpb25zLgorICovCisKK3N0YXRpYyBpbnQgY2hkbGNfY29tbV9lbmFibGUgKHNkbGFfdCogY2FyZCkKK3sKKwlpbnQgZXJyOworCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYiA9IGNhcmQtPm1ib3g7CisKKwltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJbWItPmNvbW1hbmQgPSBFTkFCTEVfQ0hETENfQ09NTVVOSUNBVElPTlM7CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCWlmIChlcnIgIT0gQ09NTUFORF9PSykKKwkJY2hkbGNfZXJyb3IoY2FyZCwgZXJyLCBtYik7CisJZWxzZQorCQljYXJkLT51LmMuY29tbV9lbmFibGVkPTE7CisKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERpc2FibGUgY29tbXVuaWNhdGlvbnMgYW5kIERyb3AgdGhlIE1vZGVtIGxpbmVzIChEQ0QgYW5kIFJUUykuCisgKi8KK3N0YXRpYyBpbnQgY2hkbGNfY29tbV9kaXNhYmxlIChzZGxhX3QqIGNhcmQpCit7CisJaW50IGVycjsKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworCisJbWItPmJ1ZmZlcl9sZW5ndGggPSAwOworCW1iLT5jb21tYW5kID0gRElTQUJMRV9DSERMQ19DT01NVU5JQ0FUSU9OUzsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJaWYgKGVyciAhPSBDT01NQU5EX09LKQorCQljaGRsY19lcnJvcihjYXJkLGVycixtYik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlYWQgY29tbXVuaWNhdGlvbiBlcnJvciBzdGF0aXN0aWNzLgorICovCitzdGF0aWMgaW50IGNoZGxjX3JlYWRfY29tbV9lcnJfc3RhdHMgKHNkbGFfdCogY2FyZCkKK3sKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKworICAgICAgICBtYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisgICAgICAgIG1iLT5jb21tYW5kID0gUkVBRF9DT01NU19FUlJPUl9TVEFUUzsKKyAgICAgICAgZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworICAgICAgICBpZiAoZXJyICE9IENPTU1BTkRfT0spCisgICAgICAgICAgICAgICAgY2hkbGNfZXJyb3IoY2FyZCxlcnIsbWIpOworICAgICAgICByZXR1cm4gZXJyOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVhZCBDSERMQyBvcGVyYXRpb25hbCBzdGF0aXN0aWNzLgorICovCitzdGF0aWMgaW50IGNoZGxjX3JlYWRfb3Bfc3RhdHMgKHNkbGFfdCogY2FyZCkKK3sKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKworICAgICAgICBtYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisgICAgICAgIG1iLT5jb21tYW5kID0gUkVBRF9DSERMQ19PUEVSQVRJT05BTF9TVEFUUzsKKyAgICAgICAgZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworICAgICAgICBpZiAoZXJyICE9IENPTU1BTkRfT0spCisgICAgICAgICAgICAgICAgY2hkbGNfZXJyb3IoY2FyZCxlcnIsbWIpOworICAgICAgICByZXR1cm4gZXJyOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXBkYXRlIGNvbW11bmljYXRpb25zIGVycm9yIGFuZCBnZW5lcmFsIHBhY2tldCBzdGF0aXN0aWNzLgorICovCitzdGF0aWMgaW50IHVwZGF0ZV9jb21tc19zdGF0cyhzZGxhX3QqIGNhcmQsCisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSkKK3sKKyAgICAgICAgQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKyAgCUNPTU1TX0VSUk9SX1NUQVRTX1NUUlVDVCogZXJyX3N0YXRzOworICAgICAgICBDSERMQ19PUEVSQVRJT05BTF9TVEFUU19TVFJVQ1QgKm9wX3N0YXRzOworCisJLyogb24gdGhlIGZpcnN0IHRpbWVyIGludGVycnVwdCwgcmVhZCB0aGUgY29tbXMgZXJyb3Igc3RhdGlzdGljcyAqLworCWlmKGNoZGxjX3ByaXZfYXJlYS0+dXBkYXRlX2NvbW1zX3N0YXRzID09IDIpIHsKKwkJaWYoY2hkbGNfcmVhZF9jb21tX2Vycl9zdGF0cyhjYXJkKSkKKwkJCXJldHVybiAxOworCQllcnJfc3RhdHMgPSAoQ09NTVNfRVJST1JfU1RBVFNfU1RSVUNUICopbWItPmRhdGE7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9vdmVyX2Vycm9ycyA9IAorCQkJCWVycl9zdGF0cy0+Unhfb3ZlcnJ1bl9lcnJfY291bnQ7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9jcmNfZXJyb3JzID0gCisJCQkJZXJyX3N0YXRzLT5DUkNfZXJyX2NvdW50OworCQljYXJkLT53YW5kZXYuc3RhdHMucnhfZnJhbWVfZXJyb3JzID0gCisJCQkJZXJyX3N0YXRzLT5SeF9hYm9ydF9jb3VudDsKKwkJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2ZpZm9fZXJyb3JzID0gCisJCQkJZXJyX3N0YXRzLT5SeF9kaXNfcHJpX2JmcnNfZnVsbF9jb3VudDsgCisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9taXNzZWRfZXJyb3JzID0KKwkJCQljYXJkLT53YW5kZXYuc3RhdHMucnhfZmlmb19lcnJvcnM7CisJCWNhcmQtPndhbmRldi5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycyA9CisJCQkJZXJyX3N0YXRzLT5zZWNfVHhfYWJvcnRfY291bnQ7CisJfQorCisgICAgICAgIC8qIG9uIHRoZSBzZWNvbmQgdGltZXIgaW50ZXJydXB0LCByZWFkIHRoZSBvcGVyYXRpb25hbCBzdGF0aXN0aWNzICovCisJZWxzZSB7CisgICAgICAgIAlpZihjaGRsY19yZWFkX29wX3N0YXRzKGNhcmQpKQorICAgICAgICAgICAgICAgIAlyZXR1cm4gMTsKKwkJb3Bfc3RhdHMgPSAoQ0hETENfT1BFUkFUSU9OQUxfU1RBVFNfU1RSVUNUICopbWItPmRhdGE7CisJCWNhcmQtPndhbmRldi5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzID0KKwkJCShvcF9zdGF0cy0+UnhfRGF0YV9kaXNjYXJkX3Nob3J0X2NvdW50ICsKKwkJCW9wX3N0YXRzLT5SeF9EYXRhX2Rpc2NhcmRfbG9uZ19jb3VudCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCBwYWNrZXQuCisgKglSZXR1cm46CTAgLSBvLmsuCisgKgkJMSAtIG5vIHRyYW5zbWl0IGJ1ZmZlcnMgYXZhaWxhYmxlCisgKi8KK3N0YXRpYyBpbnQgY2hkbGNfc2VuZCAoc2RsYV90KiBjYXJkLCB2b2lkKiBkYXRhLCB1bnNpZ25lZCBsZW4pCit7CisJQ0hETENfREFUQV9UWF9TVEFUVVNfRUxfU1RSVUNUICp0eGJ1ZiA9IGNhcmQtPnUuYy50eGJ1ZjsKKworCWlmICh0eGJ1Zi0+b3BwX2ZsYWcpCisJCXJldHVybiAxOworCQorCXNkbGFfcG9rZSgmY2FyZC0+aHcsIHR4YnVmLT5wdHJfZGF0YV9iZnIsIGRhdGEsIGxlbik7CisKKwl0eGJ1Zi0+ZnJhbWVfbGVuZ3RoID0gbGVuOworCXR4YnVmLT5vcHBfZmxhZyA9IDE7CQkvKiBzdGFydCB0cmFuc21pc3Npb24gKi8KKwkKKwkvKiBVcGRhdGUgdHJhbnNtaXQgYnVmZmVyIGNvbnRyb2wgZmllbGRzICovCisJY2FyZC0+dS5jLnR4YnVmID0gKyt0eGJ1ZjsKKworCWlmICgodm9pZCopdHhidWYgPiBjYXJkLT51LmMudHhidWZfbGFzdCkKKwkJY2FyZC0+dS5jLnR4YnVmID0gY2FyZC0+dS5jLnR4YnVmX2Jhc2U7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKiBGaXJtd2FyZSBFcnJvciBIYW5kbGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmlybXdhcmUgZXJyb3IgaGFuZGxlci4KKyAqCVRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbmV2ZXIgZmlybXdhcmUgY29tbWFuZCByZXR1cm5zIG5vbi16ZXJvCisgKglyZXR1cm4gY29kZS4KKyAqCisgKiBSZXR1cm4gemVybyBpZiBwcmV2aW91cyBjb21tYW5kIGhhcyB0byBiZSBjYW5jZWxsZWQuCisgKi8KK3N0YXRpYyBpbnQgY2hkbGNfZXJyb3IgKHNkbGFfdCAqY2FyZCwgaW50IGVyciwgQ0hETENfTUFJTEJPWF9TVFJVQ1QgKm1iKQoreworCXVuc2lnbmVkIGNtZCA9IG1iLT5jb21tYW5kOworCisJc3dpdGNoIChlcnIpIHsKKworCWNhc2UgQ01EX1RJTUVPVVQ6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvbW1hbmQgMHglMDJYIHRpbWVkIG91dCFcbiIsCisJCQljYXJkLT5kZXZuYW1lLCBjbWQpOworCQlicmVhazsKKworCWNhc2UgUzUxNF9CT1RIX1BPUlRTX1NBTUVfQ0xLX01PREU6CisJCWlmKGNtZCA9PSBTRVRfQ0hETENfQ09ORklHVVJBVElPTikgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICIlczogQ29uZmlndXJlIGJvdGggcG9ydHMgZm9yIHRoZSBzYW1lIGNsb2NrIHNvdXJjZVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICIlczogY29tbWFuZCAweCUwMlggcmV0dXJuZWQgMHglMDJYIVxuIiwKKwkJCWNhcmQtPmRldm5hbWUsIGNtZCwgZXJyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKiBJbnRlcnJ1cHQgSGFuZGxlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2lzY28gSERMQyBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLgorICovCitTVEFUSUMgdm9pZCB3c3BwcF9pc3IgKHNkbGFfdCogY2FyZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSogZGV2OworCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QqIGZsYWdzID0gTlVMTDsKKwlpbnQgaTsKKwlzZGxhX3QgKm15X2NhcmQ7CisKKworCS8qIENoZWNrIGZvciB3aGljaCBwb3J0IHRoZSBpbnRlcnJ1cHQgaGFzIGJlZW4gZ2VuZXJhdGVkCisJICogU2luY2UgU2Vjb25kYXJ5IFBvcnQgaXMgcGlnZ3liYWNraW5nIG9uIHRoZSBQcmltYXJ5CisgICAgICAgICAqIHRoZSBjaGVjayBtdXN0IGJlIGRvbmUgaGVyZS4gCisJICovCisKKwlmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKwlpZiAoIWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3R5cGUpeworCQkvKiBDaGVjayBmb3IgYSBzZWNvbmQgcG9ydCAocGlnZ3liYWNraW5nKSAqLworCQlpZigobXlfY2FyZCA9IGNhcmQtPm5leHQpKXsKKwkJCWZsYWdzID0gbXlfY2FyZC0+dS5jLmZsYWdzOworCQkJaWYgKGZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3R5cGUpeworCQkJCWNhcmQgPSBteV9jYXJkOworCQkJCWNhcmQtPmlzcihjYXJkKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CisKKwlkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCWNhcmQtPmluX2lzciA9IDE7CisJZmxhZ3MgPSBjYXJkLT51LmMuZmxhZ3M7CisJCQorCS8qIElmIHdlIGdldCBhbiBpbnRlcnJ1cHQgd2l0aCBubyBuZXR3b3JrIGRldmljZSwgc3RvcCB0aGUgaW50ZXJydXB0cworCSAqIGFuZCBpc3N1ZSBhbiBlcnJvciAqLworCWlmICgoIWRldiB8fCAhZGV2LT5wcml2KSAmJiBmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LmludGVycnVwdF90eXBlICE9IAorCSAgICAJQ09NTUFORF9DT01QTEVURV9BUFBfSU5UX1BFTkQpeworCQlnb3RvIGlzcl9kb25lOworCX0KKworCQorCS8qIGlmIGNyaXRpY2FsIGR1ZSB0byBwZXJpcGhlcmFsIG9wZXJhdGlvbnMKKwkgKiBpZS4gdXBkYXRlKCkgb3IgZ2V0c3RhdHMoKSB0aGVuIHJlc2V0IHRoZSBpbnRlcnJ1cHQgYW5kCisJICogd2FpdCBmb3IgdGhlIGJvYXJkIHRvIHJldHJpZ2dlci4KKwkgKi8KKwlpZih0ZXN0X2JpdChQRVJJX0NSSVQsICh2b2lkKikmY2FyZC0+d2FuZGV2LmNyaXRpY2FsKSkgeworCQlmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LgorCQkJCQlpbnRlcnJ1cHRfdHlwZSA9IDA7CisJCWdvdG8gaXNyX2RvbmU7CisJfQorCisKKwkvKiBPbiBhIDUwOCBDYXJkLCBpZiBjcml0aWNhbCBkdWUgdG8gaWZfc2VuZCAKKyAgICAgICAgICogTWFqb3IgRXJyb3IgISEhCisJICovCisJaWYoY2FyZC0+aHcudHlwZSAhPSBTRExBX1M1MTQpIHsKKwkJaWYodGVzdF9iaXQoMCwgKHZvaWQqKSZjYXJkLT53YW5kZXYuY3JpdGljYWwpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogQ3JpdGljYWwgd2hpbGUgaW4gSVNSOiAlbHhcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSwgY2FyZC0+d2FuZGV2LmNyaXRpY2FsKTsKKwkJCWdvdG8gaXNyX2RvbmU7CisJCX0KKwl9CisKKwlzd2l0Y2goZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfdHlwZSkgeworCisJCWNhc2UgUlhfQVBQX0lOVF9QRU5EOgkvKiAweDAxOiByZWNlaXZlIGludGVycnVwdCAqLworCQkJcnhfaW50cihjYXJkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVFhfQVBQX0lOVF9QRU5EOgkvKiAweDAyOiB0cmFuc21pdCBpbnRlcnJ1cHQgKi8KKwkJCWZsYWdzLT5pbnRlcnJ1cHRfaW5mb19zdHJ1Y3QuaW50ZXJydXB0X3Blcm1pc3Npb24gJj0KKwkJCQkgfkFQUF9JTlRfT05fVFhfRlJBTUU7CisKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ09NTUFORF9DT01QTEVURV9BUFBfSU5UX1BFTkQ6LyogMHgwNDogY21kIGNwbHQgKi8KKwkJCSsrIEludHJfdGVzdF9jb3VudGVyOworCQkJYnJlYWs7CisKKwkJY2FzZSBDSERMQ19FWENFUF9DT05EX0FQUF9JTlRfUEVORDoJLyogMHgyMCAqLworCQkJcHJvY2Vzc19jaGRsY19leGNlcHRpb24oY2FyZCk7CisJCQlicmVhazsKKworCQljYXNlIEdMT0JBTF9FWENFUF9DT05EX0FQUF9JTlRfUEVORDoKKwkJCXByb2Nlc3NfZ2xvYmFsX2V4Y2VwdGlvbihjYXJkKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVElNRVJfQVBQX0lOVF9QRU5EOgorCQkJdGltZXJfaW50cihjYXJkKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogc3B1cmlvdXMgaW50ZXJydXB0IDB4JTAyWCFcbiIsIAorCQkJCWNhcmQtPmRldm5hbWUsCisJCQkJZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfdHlwZSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJDb2RlIG5hbWU6ICIpOworCQkJZm9yKGkgPSAwOyBpIDwgNDsgaSArKykKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlYyIsCisJCQkJCWZsYWdzLT5nbG9iYWxfaW5mb19zdHJ1Y3QuY29kZW5hbWVbaV0pOyAKKwkJCXByaW50ayhLRVJOX0lORk8gIlxuQ29kZSB2ZXJzaW9uOiAiKTsKKwkJCWZvcihpID0gMDsgaSA8IDQ7IGkgKyspCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJWMiLCAKKwkJCQkJZmxhZ3MtPmdsb2JhbF9pbmZvX3N0cnVjdC5jb2RldmVyc2lvbltpXSk7IAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsJCisJCQlicmVhazsKKwl9CisKK2lzcl9kb25lOgorCWNhcmQtPmluX2lzciA9IDA7CisJZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfdHlwZSA9IDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUmVjZWl2ZSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworc3RhdGljIHZvaWQgcnhfaW50ciAoc2RsYV90KiBjYXJkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJY2hkbGNfcHJpdmF0ZV9hcmVhX3QgKmNoZGxjX3ByaXZfYXJlYTsKKwlTSEFSRURfTUVNT1JZX0lORk9fU1RSVUNUICpmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKwlDSERMQ19EQVRBX1JYX1NUQVRVU19FTF9TVFJVQ1QgKnJ4YnVmID0gY2FyZC0+dS5jLnJ4bWI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBsZW47CisJdW5zaWduZWQgYWRkciA9IHJ4YnVmLT5wdHJfZGF0YV9iZnI7CisJdm9pZCAqYnVmOworCWludCBpLHVkcF90eXBlOworCQorCWlmIChyeGJ1Zi0+b3BwX2ZsYWcgIT0gMHgwMSkgeworCQlwcmludGsoS0VSTl9JTkZPIAorCQkJIiVzOiBjb3JydXB0ZWQgUnggYnVmZmVyIEAgMHglWCwgZmxhZyA9IDB4JTAyWCFcbiIsIAorCQkJY2FyZC0+ZGV2bmFtZSwgKHVuc2lnbmVkKXJ4YnVmLCByeGJ1Zi0+b3BwX2ZsYWcpOworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIkNvZGUgbmFtZTogIik7CisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSArKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MtPmdsb2JhbF9pbmZvX3N0cnVjdC5jb2RlbmFtZVtpXSk7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiXG5Db2RlIHZlcnNpb246ICIpOworICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkgKyspCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLT5nbG9iYWxfaW5mb19zdHJ1Y3QuY29kZXZlcnNpb25baV0pOworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIlxuIik7CisKKworCQkvKiBCdWcgRml4OiBNYXIgNiAyMDAwCisgICAgICAgICAgICAgICAgICogSWYgd2UgZ2V0IGEgY29ycnVwdGVkIG1haWxib3gsIGl0IG1lYXNuIHRoYXQgZHJpdmVyIAorICAgICAgICAgICAgICAgICAqIGlzIG91dCBvZiBzeW5jIHdpdGggdGhlIGZpcm13YXJlLiBUaGVyZSBpcyBubyByZWNvdmVyeS4KKyAgICAgICAgICAgICAgICAgKiBJZiB3ZSBkb24ndCB0dXJuIG9mZiBhbGwgaW50ZXJydXB0cyBmb3IgdGhpcyBjYXJkCisgICAgICAgICAgICAgICAgICogdGhlIG1hY2hpbmUgd2lsbCBjcmFzaC4gCisgICAgICAgICAgICAgICAgICovCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDcml0aWNhbCByb3V0ZXIgZmFpbHVyZSAuLi4hISFcbiIsIGNhcmQtPmRldm5hbWUpOworCQlwcmludGsoS0VSTl9JTkZPICJQbGVhc2UgY29udGFjdCBTYW5nb21hIFRlY2hub2xvZ2llcyAhXG4iKTsKKwkJY2hkbGNfc2V0X2ludHJfbW9kZShjYXJkLDApOwkKKwkJcmV0dXJuOworCX0KKworCWRldiA9IGNhcmQtPndhbmRldi5kZXY7CisKKwlpZiAoIWRldil7IAorCQlnb3RvIHJ4X2V4aXQ7CisJfQorCQorCWlmICghbmV0aWZfcnVubmluZyhkZXYpKXsKKwkJZ290byByeF9leGl0OworCX0KKworCWNoZGxjX3ByaXZfYXJlYSA9IGRldi0+cHJpdjsKKworCWlmIChyeGJ1Zi0+ZXJyb3JfZmxhZyl7CQorCQlnb3RvIHJ4X2V4aXQ7CisJfQorCS8qIFRha2Ugb2ZmIHR3byBDUkMgYnl0ZXMgKi8KKworCWlmIChyeGJ1Zi0+ZnJhbWVfbGVuZ3RoIDwgNyB8fCByeGJ1Zi0+ZnJhbWVfbGVuZ3RoID4gMTUwNiApeworCQlnb3RvIHJ4X2V4aXQ7CisJfQkKKworCWxlbiA9IHJ4YnVmLT5mcmFtZV9sZW5ndGggLSBDUkNfTEVOR1RIOworCisJLyogQWxsb2NhdGUgc29ja2V0IGJ1ZmZlciAqLworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKworCWlmIChza2IgPT0gTlVMTCkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKXsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBubyBzb2NrZXQgYnVmZmVycyBhdmFpbGFibGUhXG4iLAorCQkJCQkJY2FyZC0+ZGV2bmFtZSk7CisJCX0KKwkJKytjYXJkLT53YW5kZXYuc3RhdHMucnhfZHJvcHBlZDsKKwkJZ290byByeF9leGl0OworCX0KKworCS8qIENvcHkgZGF0YSB0byB0aGUgc29ja2V0IGJ1ZmZlciAqLworCWlmKChhZGRyICsgbGVuKSA+IGNhcmQtPnUuYy5yeF90b3AgKyAxKSB7CisJCXVuc2lnbmVkIHRtcCA9IGNhcmQtPnUuYy5yeF90b3AgLSBhZGRyICsgMTsKKwkJYnVmID0gc2tiX3B1dChza2IsIHRtcCk7CisJCXNkbGFfcGVlaygmY2FyZC0+aHcsIGFkZHIsIGJ1ZiwgdG1wKTsKKwkJYWRkciA9IGNhcmQtPnUuYy5yeF9iYXNlOworCQlsZW4gLT0gdG1wOworCX0KKwkJCisJYnVmID0gc2tiX3B1dChza2IsIGxlbik7CisJc2RsYV9wZWVrKCZjYXJkLT5odywgYWRkciwgYnVmLCBsZW4pOworCisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX1dBTl9QUFApOworCisJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X3BhY2tldHMgKys7CisJY2FyZC0+d2FuZGV2LnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCXVkcF90eXBlID0gdWRwX3BrdF90eXBlKCBza2IsIGNhcmQgKTsKKworCWlmKHVkcF90eXBlID09IFVEUF9DUElQRV9UWVBFKSB7CisJCWlmKHN0b3JlX3VkcF9tZ210X3BrdChVRFBfUEtUX0ZSTV9ORVRXT1JLLAorICAgCQkJCSAgICAgIGNhcmQsIHNrYiwgZGV2LCBjaGRsY19wcml2X2FyZWEpKSB7CisgICAgIAkJICAgICAgICBmbGFncy0+aW50ZXJydXB0X2luZm9fc3RydWN0LgorCQkJCQkJaW50ZXJydXB0X3Blcm1pc3Npb24gfD0gCisJCQkJCQkJQVBQX0lOVF9PTl9USU1FUjsgCisJCX0KKwl9ZWxzZXsKKyAgICAgICAgICAgICAgIAkvKiBQYXNzIGl0IHVwIHRoZSBwcm90b2NvbCBzdGFjayAqLworICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gZGV2OworICAgICAgICAgICAgICAgIHNrYi0+bWFjLnJhdyAgPSBza2ItPmRhdGE7CisgICAgICAgICAgICAgICAgbmV0aWZfcngoc2tiKTsKKyAgICAgICAgICAgICAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCX0KKworcnhfZXhpdDoKKwkvKiBSZWxlYXNlIGJ1ZmZlciBlbGVtZW50IGFuZCBjYWxjdWxhdGUgYSBwb2ludGVyIHRvIHRoZSBuZXh0IG9uZSAqLworCXJ4YnVmLT5vcHBfZmxhZyA9IDB4MDA7CisJY2FyZC0+dS5jLnJ4bWIgPSArKyByeGJ1ZjsKKwlpZigodm9pZCopcnhidWYgPiBjYXJkLT51LmMucnhidWZfbGFzdCl7CisJCWNhcmQtPnUuYy5yeG1iID0gY2FyZC0+dS5jLnJ4YnVmX2Jhc2U7CisJfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRpbWVyIGludGVycnVwdCBoYW5kbGVyLgorICogVGhlIHRpbWVyIGludGVycnVwdCBpcyB1c2VkIGZvciB0d28gcHVycG9zZXM6CisgKiAgICAxKSBQcm9jZXNzaW5nIHVkcCBjYWxscyBmcm9tICdjcGlwZW1vbicuCisgKiAgICAyKSBSZWFkaW5nIGJvYXJkLWxldmVsIHN0YXRpc3RpY3MgZm9yIHVwZGF0aW5nIHRoZSBwcm9jIGZpbGUgc3lzdGVtLgorICovCit2b2lkIHRpbWVyX2ludHIoc2RsYV90ICpjYXJkKQoreworICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSogZGV2OworICAgICAgICBjaGRsY19wcml2YXRlX2FyZWFfdCogY2hkbGNfcHJpdl9hcmVhID0gTlVMTDsKKyAgICAgICAgU0hBUkVEX01FTU9SWV9JTkZPX1NUUlVDVCogZmxhZ3MgPSBOVUxMOworCisgICAgICAgIGRldiA9IGNhcmQtPndhbmRldi5kZXY7IAorICAgICAgICBjaGRsY19wcml2X2FyZWEgPSBkZXYtPnByaXY7CisKKwlpZiAoY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmIFRNUl9JTlRfRU5BQkxFRF9DT05GSUcpIHsKKwkJaWYgKCFjb25maWdfY2hkbGMoY2FyZCkpeworCQkJY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmPSB+VE1SX0lOVF9FTkFCTEVEX0NPTkZJRzsKKwkJfQorCX0KKwkKKwkvKiBwcm9jZXNzIGEgdWRwIGNhbGwgaWYgcGVuZGluZyAqLworICAgICAgIAlpZihjaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICYgVE1SX0lOVF9FTkFCTEVEX1VEUCkgeworICAgICAgICAgICAgICAgCXByb2Nlc3NfdWRwX21nbXRfcGt0KGNhcmQsIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hkbGNfcHJpdl9hcmVhKTsKKwkJY2hkbGNfcHJpdl9hcmVhLT50aW1lcl9pbnRfZW5hYmxlZCAmPSB+VE1SX0lOVF9FTkFCTEVEX1VEUDsKKyAgICAgICAgfQorCQorCisJLyogcmVhZCB0aGUgY29tbXVuaWNhdGlvbnMgc3RhdGlzdGljcyBpZiByZXF1aXJlZCAqLworCWlmKGNoZGxjX3ByaXZfYXJlYS0+dGltZXJfaW50X2VuYWJsZWQgJiBUTVJfSU5UX0VOQUJMRURfVVBEQVRFKSB7CisJCXVwZGF0ZV9jb21tc19zdGF0cyhjYXJkLCBjaGRsY19wcml2X2FyZWEpOworICAgICAgICAgICAgICAgIGlmKCEoLS0gY2hkbGNfcHJpdl9hcmVhLT51cGRhdGVfY29tbXNfc3RhdHMpKSB7CisJCQljaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkICY9IAorCQkJCX5UTVJfSU5UX0VOQUJMRURfVVBEQVRFOworCQl9CisgICAgICAgIH0KKworCS8qIG9ubHkgZGlzYWJsZSB0aGUgdGltZXIgaW50ZXJydXB0IGlmIHRoZXJlIGFyZSBubyB1ZHAgb3Igc3RhdGlzdGljICovCisJLyogdXBkYXRlcyBwZW5kaW5nICovCisgICAgICAgIGlmKCFjaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkKSB7CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBjYXJkLT51LmMuZmxhZ3M7CisgICAgICAgICAgICAgICAgZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfcGVybWlzc2lvbiAmPQorICAgICAgICAgICAgICAgICAgICAgICAgfkFQUF9JTlRfT05fVElNRVI7CisgICAgICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgTWlzY2VsbGFuZW91cyBGdW5jdGlvbnMKKwktIHNldF9jaGRsY19jb25maWcoKSB1c2VkIHRvIHNldCBjb25maWd1cmF0aW9uIG9wdGlvbnMgb24gdGhlIGJvYXJkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IHNldF9jaGRsY19jb25maWcoc2RsYV90KiBjYXJkKQoreworCisJQ0hETENfQ09ORklHVVJBVElPTl9TVFJVQ1QgY2ZnOworCisJbWVtc2V0KCZjZmcsIDAsIHNpemVvZihDSERMQ19DT05GSUdVUkFUSU9OX1NUUlVDVCkpOworCisJaWYoY2FyZC0+d2FuZGV2LmNsb2NraW5nKQorCQljZmcuYmF1ZF9yYXRlID0gY2FyZC0+d2FuZGV2LmJwczsKKworCWNmZy5saW5lX2NvbmZpZ19vcHRpb25zID0gKGNhcmQtPndhbmRldi5pbnRlcmZhY2UgPT0gV0FOT1BUX1JTMjMyKSA/CisJCUlOVEVSRkFDRV9MRVZFTF9SUzIzMiA6IElOVEVSRkFDRV9MRVZFTF9WMzU7CisKKwljZmcubW9kZW1fY29uZmlnX29wdGlvbnMJPSAwOworCS8vQVBJIE9QVElPTlMKKwljZmcuQ0hETENfQVBJX29wdGlvbnMJCT0gRElTQ0FSRF9SWF9FUlJPUl9GUkFNRVM7CisJY2ZnLm1vZGVtX3N0YXR1c190aW1lcgkJPSAxMDA7CisJY2ZnLkNIRExDX3Byb3RvY29sX29wdGlvbnMJPSBIRExDX1NUUkVBTUlOR19NT0RFOworCWNmZy5wZXJjZW50X2RhdGFfYnVmZmVyX2Zvcl9UeCAgPSA1MDsKKwljZmcuQ0hETENfc3RhdGlzdGljc19vcHRpb25zCT0gKENIRExDX1RYX0RBVEFfQllURV9DT1VOVF9TVEFUIHwKKwkJQ0hETENfUlhfREFUQV9CWVRFX0NPVU5UX1NUQVQpOworCWNmZy5tYXhfQ0hETENfZGF0YV9maWVsZF9sZW5ndGgJPSBjYXJkLT53YW5kZXYubXR1OworCisJY2ZnLnRyYW5zbWl0X2tlZXBhbGl2ZV90aW1lcgk9IDA7CisJY2ZnLnJlY2VpdmVfa2VlcGFsaXZlX3RpbWVyCT0gMDsKKwljZmcua2VlcGFsaXZlX2Vycm9yX3RvbGVyYW5jZQk9IDA7CisJY2ZnLlNMQVJQX3JlcXVlc3RfdGltZXIJCT0gMDsKKworCWNmZy5JUF9hZGRyZXNzCQk9IDA7CisJY2ZnLklQX25ldG1hc2sJCT0gMDsKKwkKKwlyZXR1cm4gY2hkbGNfY29uZmlndXJlKGNhcmQsICZjZmcpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFByb2Nlc3MgZ2xvYmFsIGV4Y2VwdGlvbiBjb25kaXRpb24KKyAqLworc3RhdGljIGludCBwcm9jZXNzX2dsb2JhbF9leGNlcHRpb24oc2RsYV90ICpjYXJkKQoreworCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYm94ID0gY2FyZC0+bWJveDsKKwlpbnQgZXJyOworCisJbWJveC0+YnVmZmVyX2xlbmd0aCA9IDA7CisJbWJveC0+Y29tbWFuZCA9IFJFQURfR0xPQkFMX0VYQ0VQVElPTl9DT05ESVRJT047CisJZXJyID0gc2RsYV9leGVjKG1ib3gpID8gbWJveC0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKworCWlmKGVyciAhPSBDTURfVElNRU9VVCApeworCQorCQlzd2l0Y2gobWJveC0+cmV0dXJuX2NvZGUpIHsKKyAgICAgICAgIAorCSAgICAgIAljYXNlIEVYQ0VQX01PREVNX1NUQVRVU19DSEFOR0U6CisKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBNb2RlbSBzdGF0dXMgY2hhbmdlXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCisJCQlzd2l0Y2gobWJveC0+ZGF0YVswXSAmIChEQ0RfSElHSCB8IENUU19ISUdIKSkgeworCQkJCWNhc2UgKERDRF9ISUdIKToKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERDRCBoaWdoLCBDVFMgbG93XG4iLGNhcmQtPmRldm5hbWUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIChDVFNfSElHSCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERDRCBsb3csIENUUyBoaWdoXG4iLGNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICgoRENEX0hJR0ggfCBDVFNfSElHSCkpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBEQ0QgaGlnaCwgQ1RTIGhpZ2hcbiIsY2FyZC0+ZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogRENEIGxvdywgQ1RTIGxvd1xuIixjYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCX0KKworCQkJaWYgKCEobWJveC0+ZGF0YVswXSAmIERDRF9ISUdIKSB8fCAhKG1ib3gtPmRhdGFbMF0gJiBEQ0RfSElHSCkpeworCQkJCS8vcHJpbnRrKEtFUk5fSU5GTyAiU2VuZGluZyBURVJNIFJlcXVlc3QgTWFudWFsbHkgIVxuIik7CisJCQkJc2VuZF9wcHBfdGVybV9yZXF1ZXN0KGNhcmQtPndhbmRldi5kZXYpOworCQkJfQkKKwkJCWJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBFWENFUF9UUkNfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogTGluZSB0cmFjZSBkaXNhYmxlZFxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisJCWNhc2UgRVhDRVBfSVJRX1RJTUVPVVQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogSVJRIHRpbWVvdXQgb2NjdXJyZWRcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSk7IAorCQkJYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdsb2JhbCBleGNlcHRpb24gJXhcbiIsCisJCQkJY2FyZC0+ZGV2bmFtZSwgbWJveC0+cmV0dXJuX2NvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCX0KKwlyZXR1cm4gMDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFByb2Nlc3MgY2hkbGMgZXhjZXB0aW9uIGNvbmRpdGlvbgorICovCitzdGF0aWMgaW50IHByb2Nlc3NfY2hkbGNfZXhjZXB0aW9uKHNkbGFfdCAqY2FyZCkKK3sKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCogbWIgPSBjYXJkLT5tYm94OworCWludCBlcnI7CisKKwltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJbWItPmNvbW1hbmQgPSBSRUFEX0NIRExDX0VYQ0VQVElPTl9DT05ESVRJT047CisJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCWlmKGVyciAhPSBDTURfVElNRU9VVCkgeworCQorCQlzd2l0Y2ggKGVycikgeworCisJCWNhc2UgRVhDRVBfTElOS19BQ1RJVkU6CisJCQlwb3J0X3NldF9zdGF0ZShjYXJkLCBXQU5fQ09OTkVDVEVEKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRVhDRVBfTElOS19JTkFDVElWRV9NT0RFTToKKwkJCXBvcnRfc2V0X3N0YXRlKGNhcmQsIFdBTl9ESVNDT05ORUNURUQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBFWENFUF9MT09QQkFDS19DT05ESVRJT046CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogTG9vcGJhY2sgQ29uZGl0aW9uIERldGVjdGVkLlxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBOT19DSERMQ19FWENFUF9DT05EX1RPX1JFUE9SVDoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBObyBleGNlcHRpb25zIHJlcG9ydGVkLlxuIiwKKwkJCQkJCWNhcmQtPmRldm5hbWUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRXhjZXB0aW9uIENvbmRpdGlvbiAleCFcbiIsCisJCQkJCWNhcmQtPmRldm5hbWUsZXJyKTsKKwkJCWJyZWFrOworCQl9CisKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RvcmUgYSBVRFAgbWFuYWdlbWVudCBwYWNrZXQgZm9yIGxhdGVyIHByb2Nlc3NpbmcuCisgKi8KKworc3RhdGljIGludCBzdG9yZV91ZHBfbWdtdF9wa3QoY2hhciB1ZHBfcGt0X3NyYywgc2RsYV90KiBjYXJkLAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UqIGRldiwKKwkJCSAgICAgIGNoZGxjX3ByaXZhdGVfYXJlYV90KiBjaGRsY19wcml2X2FyZWEgKQoreworCWludCB1ZHBfcGt0X3N0b3JlZCA9IDA7CisKKwlpZighY2hkbGNfcHJpdl9hcmVhLT51ZHBfcGt0X2xndGggJiYKKwkgIChza2ItPmxlbiA8PSBNQVhfTEdUSF9VRFBfTUdOVF9QS1QpKSB7CisgICAgICAgIAljaGRsY19wcml2X2FyZWEtPnVkcF9wa3RfbGd0aCA9IHNrYi0+bGVuOworCQljaGRsY19wcml2X2FyZWEtPnVkcF9wa3Rfc3JjID0gdWRwX3BrdF9zcmM7CisgICAgICAgCQltZW1jcHkoY2hkbGNfcHJpdl9hcmVhLT51ZHBfcGt0X2RhdGEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQljaGRsY19wcml2X2FyZWEtPnRpbWVyX2ludF9lbmFibGVkID0gVE1SX0lOVF9FTkFCTEVEX1VEUDsKKwkJdWRwX3BrdF9zdG9yZWQgPSAxOworCX0KKworCWlmKHVkcF9wa3Rfc3JjID09IFVEUF9QS1RfRlJNX1NUQUNLKQorCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCWVsc2UKKyAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQorCXJldHVybih1ZHBfcGt0X3N0b3JlZCk7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUHJvY2VzcyBVRFAgbWFuYWdlbWVudCBwYWNrZXQuCisgKi8KKworc3RhdGljIGludCBwcm9jZXNzX3VkcF9tZ210X3BrdChzZGxhX3QqIGNhcmQsIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsCisJCQkJY2hkbGNfcHJpdmF0ZV9hcmVhX3QqIGNoZGxjX3ByaXZfYXJlYSApIAoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBpbnQgZnJhbWVzLCBsZW47CisJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisJdW5zaWduZWQgc2hvcnQgYnVmZmVyX2xlbmd0aCwgcmVhbF9sZW47CisJdW5zaWduZWQgbG9uZyBkYXRhX3B0cjsKKwl1bnNpZ25lZCBkYXRhX2xlbmd0aDsKKwlpbnQgdWRwX21nbXRfcmVxX3ZhbGlkID0gMTsKKwlDSERMQ19NQUlMQk9YX1NUUlVDVCAqbWIgPSBjYXJkLT5tYm94OworCVNIQVJFRF9NRU1PUllfSU5GT19TVFJVQ1QgKmZsYWdzID0gY2FyZC0+dS5jLmZsYWdzOworCWNoZGxjX3VkcF9wa3RfdCAqY2hkbGNfdWRwX3BrdDsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlpbnQgZXJyOworCWNoYXIgdXRfY2hhcjsKKworCWNoZGxjX3VkcF9wa3QgPSAoY2hkbGNfdWRwX3BrdF90ICopIGNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9kYXRhOworCisJaWYoY2hkbGNfcHJpdl9hcmVhLT51ZHBfcGt0X3NyYyA9PSBVRFBfUEtUX0ZSTV9ORVRXT1JLKSB7CisKKwkJc3dpdGNoKGNoZGxjX3VkcF9wa3QtPmNibG9jay5jb21tYW5kKSB7CisJCQljYXNlIFJFQURfR0xPQkFMX1NUQVRJU1RJQ1M6CisJCQljYXNlIFJFQURfTU9ERU1fU1RBVFVTOiAgCisJCQljYXNlIFJFQURfQ0hETENfTElOS19TVEFUVVM6CisJCQljYXNlIENQSVBFX1JPVVRFUl9VUF9USU1FOgorCQkJY2FzZSBSRUFEX0NPTU1TX0VSUk9SX1NUQVRTOgorCQkJY2FzZSBSRUFEX0NIRExDX09QRVJBVElPTkFMX1NUQVRTOgorCisJCQkvKiBUaGVzZSB0d28gY29tbWFuZHMgYXJlIGV4ZWN1dGVkIGZvcgorCQkJICogZWFjaCByZXF1ZXN0ICovCisJCQljYXNlIFJFQURfQ0hETENfQ09ORklHVVJBVElPTjoKKwkJCWNhc2UgUkVBRF9DSERMQ19DT0RFX1ZFUlNJT046CisJCQkJdWRwX21nbXRfcmVxX3ZhbGlkID0gMTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdWRwX21nbXRfcmVxX3ZhbGlkID0gMDsKKwkJCQlicmVhazsKKwkJfSAKKwl9CisJCisgIAlpZighdWRwX21nbXRfcmVxX3ZhbGlkKSB7CisKKwkJLyogc2V0IGxlbmd0aCB0byAwICovCisJCWNoZGxjX3VkcF9wa3QtPmNibG9jay5idWZmZXJfbGVuZ3RoID0gMDsKKworICAgIAkJLyogc2V0IHJldHVybiBjb2RlICovCisJCWNoZGxjX3VkcF9wa3QtPmNibG9jay5yZXR1cm5fY29kZSA9IDB4Q0Q7CisKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSl7CQorCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSIlczogV2FybmluZywgSWxsZWdhbCBVRFAgY29tbWFuZCBhdHRlbXB0ZWQgZnJvbSBuZXR3b3JrOiAleFxuIiwKKwkJCWNhcmQtPmRldm5hbWUsY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQpOworCQl9CisKKyAgIAl9IGVsc2UgeworCSAgIAl1bnNpZ25lZCBsb25nIHRyYWNlX3N0YXR1c19jZmdfYWRkciA9IDA7CisJCVRSQUNFX1NUQVRVU19FTF9DRkdfU1RSVUNUIHRyYWNlX2NmZ19zdHJ1Y3Q7CisJCVRSQUNFX1NUQVRVU19FTEVNRU5UX1NUUlVDVCB0cmFjZV9lbGVtZW50X3N0cnVjdDsKKworCQlzd2l0Y2goY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLmNvbW1hbmQpIHsKKworCQljYXNlIENQSVBFX0VOQUJMRV9UUkFDSU5HOgorCQkgICAgIGlmICghY2hkbGNfcHJpdl9hcmVhLT5UcmFjaW5nRW5hYmxlZCkgeworCisJCQkvKiBPUEVSQVRFX0RBVEFMSU5FX01PTklUT1IgKi8KKworCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSBzaXplb2YoTElORV9UUkFDRV9DT05GSUdfU1RSVUNUKTsKKwkJCW1iLT5jb21tYW5kID0gU0VUX1RSQUNFX0NPTkZJR1VSQVRJT047CisKKyAgICAJCQkoKExJTkVfVFJBQ0VfQ09ORklHX1NUUlVDVCAqKW1iLT5kYXRhKS0+CisJCQkJdHJhY2VfY29uZmlnID0gVFJBQ0VfQUNUSVZFOworCQkJLyogVHJhY2UgZGVsYXkgbW9kZSBpcyBub3QgdXNlZCBiZWNhdXNlIGl0IHNsb3dzCisJCQkgICBkb3duIHRyYW5zZmVyIGFuZCByZXN1bHRzIGluIGEgc3RhbmRvZmYgc2l0dWF0aW9uCisJCQkgICB3aGVuIHRoZXJlIGlzIGEgbG90IG9mIGRhdGEgKi8KKworCQkJLyogQ29uZmlndXJlIHRoZSBUcmFjZSBiYXNlZCBvbiB1c2VyIGlucHV0cyAqLworCQkJKChMSU5FX1RSQUNFX0NPTkZJR19TVFJVQ1QgKiltYi0+ZGF0YSktPnRyYWNlX2NvbmZpZyB8PSAKKwkJCQkJY2hkbGNfdWRwX3BrdC0+ZGF0YVswXTsKKworCQkJKChMSU5FX1RSQUNFX0NPTkZJR19TVFJVQ1QgKiltYi0+ZGF0YSktPgorCQkJICAgdHJhY2VfZGVhY3RpdmF0aW9uX3RpbWVyID0gNDAwMDsKKworCisJCQllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJCQlpZiAoZXJyICE9IENPTU1BTkRfT0spIHsKKwkJCQljaGRsY19lcnJvcihjYXJkLGVycixtYik7CisJCQkJY2FyZC0+VHJhY2luZ0VuYWJsZWQgPSAwOworCQkJCWNoZGxjX3VkcF9wa3QtPmNibG9jay5yZXR1cm5fY29kZSA9IGVycjsKKwkJCQltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJCQkJYnJlYWs7CisJICAgIAkJfSAKKworCQkJLyogR2V0IHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHRyYWNlIGVsZW1lbnQgbGlzdCAqLworCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSAwOworCQkJbWItPmNvbW1hbmQgPSBSRUFEX1RSQUNFX0NPTkZJR1VSQVRJT047CisJCQllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisKKwkJCWlmIChlcnIgIT0gQ09NTUFORF9PSykgeworCQkJCWNoZGxjX2Vycm9yKGNhcmQsZXJyLG1iKTsKKwkJCQljaGRsY19wcml2X2FyZWEtPlRyYWNpbmdFbmFibGVkID0gMDsKKwkJCQljaGRsY191ZHBfcGt0LT5jYmxvY2sucmV0dXJuX2NvZGUgPSBlcnI7CisJCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSAwOworCQkJCWJyZWFrOworCSAgICAJCX0gCQorCisJICAgCQl0cmFjZV9zdGF0dXNfY2ZnX2FkZHIgPSgoTElORV9UUkFDRV9DT05GSUdfU1RSVUNUICopCisJCQkJbWItPmRhdGEpIC0+IHB0cl90cmFjZV9zdGF0X2VsX2NmZ19zdHJ1Y3Q7CisKKwkJCXNkbGFfcGVlaygmY2FyZC0+aHcsIHRyYWNlX3N0YXR1c19jZmdfYWRkciwKKwkJCQkgJnRyYWNlX2NmZ19zdHJ1Y3QsIHNpemVvZih0cmFjZV9jZmdfc3RydWN0KSk7CisJCSAgICAKKwkJCWNoZGxjX3ByaXZfYXJlYS0+c3RhcnRfdHJhY2VfYWRkciA9IHRyYWNlX2NmZ19zdHJ1Y3QuCisJCQkJYmFzZV9hZGRyX3RyYWNlX3N0YXR1c19lbGVtZW50czsKKworCQkJY2hkbGNfcHJpdl9hcmVhLT5udW1iZXJfdHJhY2VfZWxlbWVudHMgPSAKKwkJCQkJdHJhY2VfY2ZnX3N0cnVjdC5udW1iZXJfdHJhY2Vfc3RhdHVzX2VsZW1lbnRzOworCisJCQljaGRsY19wcml2X2FyZWEtPmVuZF90cmFjZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpCisJCQkJCSgoVFJBQ0VfU1RBVFVTX0VMRU1FTlRfU1RSVUNUICopCisJCQkJCSBjaGRsY19wcml2X2FyZWEtPnN0YXJ0X3RyYWNlX2FkZHIgKyAKKwkJCQkJIChjaGRsY19wcml2X2FyZWEtPm51bWJlcl90cmFjZV9lbGVtZW50cyAtIDEpKTsKKworCQkJY2hkbGNfcHJpdl9hcmVhLT5iYXNlX2FkZHJfdHJhY2VfYnVmZmVyID0gCisJCQkJCXRyYWNlX2NmZ19zdHJ1Y3QuYmFzZV9hZGRyX3RyYWNlX2J1ZmZlcjsKKworCQkJY2hkbGNfcHJpdl9hcmVhLT5lbmRfYWRkcl90cmFjZV9idWZmZXIgPSAKKwkJCQkJdHJhY2VfY2ZnX3N0cnVjdC5lbmRfYWRkcl90cmFjZV9idWZmZXI7CisKKwkJICAgIAljaGRsY19wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciA9IAorCQkJCQl0cmFjZV9jZmdfc3RydWN0Lm5leHRfdHJhY2VfZWxlbWVudF90b191c2U7CisKKwkgICAgCQljaGRsY19wcml2X2FyZWEtPmF2YWlsYWJsZV9idWZmZXJfc3BhY2UgPSAyMDAwIC0gCisJCQkJCQkJCSAgc2l6ZW9mKGlwX3BrdF90KSAtCisJCQkJCQkJCSAgc2l6ZW9mKHVkcF9wa3RfdCkgLQorCQkJCQkJCSAgICAgIAkgIHNpemVvZih3cF9tZ210X3QpIC0KKwkJCQkJCQkJICBzaXplb2YoY2Jsb2NrX3QpIC0KKwkJCQkJCQkgICAgICAgICAgc2l6ZW9mKHRyYWNlX2luZm9fdCk7CQorCSAgICAgICAJICAgICB9CisJCSAgICAgY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLnJldHVybl9jb2RlID0gQ09NTUFORF9PSzsKKwkJICAgICBtYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJICAgICAgIAkgICAgIGNoZGxjX3ByaXZfYXJlYS0+VHJhY2luZ0VuYWJsZWQgPSAxOworCSAgICAgICAJICAgICBicmVhazsKKwkgICAKKworCQljYXNlIENQSVBFX0RJU0FCTEVfVFJBQ0lORzoKKwkJICAgICBpZiAoY2hkbGNfcHJpdl9hcmVhLT5UcmFjaW5nRW5hYmxlZCkgeworCisJCQkvKiBPUEVSQVRFX0RBVEFMSU5FX01PTklUT1IgKi8KKwkJCW1iLT5idWZmZXJfbGVuZ3RoID0gc2l6ZW9mKExJTkVfVFJBQ0VfQ09ORklHX1NUUlVDVCk7CisJCQltYi0+Y29tbWFuZCA9IFNFVF9UUkFDRV9DT05GSUdVUkFUSU9OOworICAgIAkJCSgoTElORV9UUkFDRV9DT05GSUdfU1RSVUNUICopbWItPmRhdGEpLT4KKwkJCQl0cmFjZV9jb25maWcgPSBUUkFDRV9JTkFDVElWRTsKKwkJCWVyciA9IHNkbGFfZXhlYyhtYikgPyBtYi0+cmV0dXJuX2NvZGUgOiBDTURfVElNRU9VVDsKKwkJICAgICB9CQkKKworCQkgICAgIGNoZGxjX3ByaXZfYXJlYS0+VHJhY2luZ0VuYWJsZWQgPSAwOworCQkgICAgIGNoZGxjX3VkcF9wa3QtPmNibG9jay5yZXR1cm5fY29kZSA9IENPTU1BTkRfT0s7CisJCSAgICAgbWItPmJ1ZmZlcl9sZW5ndGggPSAwOworCQkgICAgIGJyZWFrOworCSAgIAorCisJCWNhc2UgQ1BJUEVfR0VUX1RSQUNFX0lORk86CisKKwkJICAgICBpZiAoIWNoZGxjX3ByaXZfYXJlYS0+VHJhY2luZ0VuYWJsZWQpIHsKKwkJCWNoZGxjX3VkcF9wa3QtPmNibG9jay5yZXR1cm5fY29kZSA9IDE7CisJCQltYi0+YnVmZmVyX2xlbmd0aCA9IDA7CisJCQlicmVhazsKKwkJICAgICB9CisKKyAgCQkgICAgIGNoZGxjX3VkcF9wa3QtPnRyYWNlX2luZm8uaXNtb3JlZGF0YSA9IDB4MDA7CisJCSAgICAgYnVmZmVyX2xlbmd0aCA9IDA7CS8qIG9mZnNldCBvZiBwYWNrZXQgYWxyZWFkeSBvY2N1cGllZCAqLworCisJCSAgICAgZm9yIChmcmFtZXM9MDsgZnJhbWVzIDwgY2hkbGNfcHJpdl9hcmVhLT5udW1iZXJfdHJhY2VfZWxlbWVudHM7IGZyYW1lcysrKXsKKworCQkJdHJhY2VfcGt0X3QgKnRyYWNlX3BrdCA9ICh0cmFjZV9wa3RfdCAqKQorCQkJCSZjaGRsY191ZHBfcGt0LT5kYXRhW2J1ZmZlcl9sZW5ndGhdOworCisJCQlzZGxhX3BlZWsoJmNhcmQtPmh3LCBjaGRsY19wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciwKKwkJCSAgIAkgICh1bnNpZ25lZCBjaGFyICopJnRyYWNlX2VsZW1lbnRfc3RydWN0LAorCQkJICAgCSAgc2l6ZW9mKFRSQUNFX1NUQVRVU19FTEVNRU5UX1NUUlVDVCkpOworCisgICAgIAkJCWlmICh0cmFjZV9lbGVtZW50X3N0cnVjdC5vcHBfZmxhZyA9PSAweDAwKSB7CisJCQkgCWJyZWFrOworCQkJfQorCisJCQkvKiBnZXQgcG9pbnRlciB0byByZWFsIGRhdGEgKi8KKwkJCWRhdGFfcHRyID0gdHJhY2VfZWxlbWVudF9zdHJ1Y3QucHRyX2RhdGFfYmZyOworCisJCQkvKiBTZWUgaWYgdGhlcmUgaXMgYWN0dWFsIGRhdGEgb24gdGhlIHRyYWNlIGJ1ZmZlciAqLworCQkJaWYgKGRhdGFfcHRyKXsKKwkJCQlkYXRhX2xlbmd0aCA9IHRyYWNlX2VsZW1lbnRfc3RydWN0LnRyYWNlX2xlbmd0aDsKKwkJCX1lbHNleworCQkJCWRhdGFfbGVuZ3RoID0gMDsKKwkJCQljaGRsY191ZHBfcGt0LT50cmFjZV9pbmZvLmlzbW9yZWRhdGEgPSAweDAxOworCQkJfQorCQorICAgCQkJaWYoIChjaGRsY19wcml2X2FyZWEtPmF2YWlsYWJsZV9idWZmZXJfc3BhY2UgLSBidWZmZXJfbGVuZ3RoKQorCQkJCTwgKCBzaXplb2YodHJhY2VfcGt0X3QpICsgZGF0YV9sZW5ndGgpICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kaWNhdGUgdGhlcmUgYXJlIG1vcmUgZnJhbWVzIG9uIGJvYXJkICYgZXhpdCAqLworCQkJCWNoZGxjX3VkcF9wa3QtPnRyYWNlX2luZm8uaXNtb3JlZGF0YSA9IDB4MDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCQkJdHJhY2VfcGt0LT5zdGF0dXMgPSB0cmFjZV9lbGVtZW50X3N0cnVjdC50cmFjZV90eXBlOworCisJCQl0cmFjZV9wa3QtPnRpbWVfc3RhbXAgPQorCQkJCXRyYWNlX2VsZW1lbnRfc3RydWN0LnRyYWNlX3RpbWVfc3RhbXA7CisKKwkJCXRyYWNlX3BrdC0+cmVhbF9sZW5ndGggPQorCQkJCXRyYWNlX2VsZW1lbnRfc3RydWN0LnRyYWNlX2xlbmd0aDsKKworCQkJLyogc2VlIGlmIHdlIGNhbiBmaXQgdGhlIGZyYW1lIGludG8gdGhlIHVzZXIgYnVmZmVyICovCisJCQlyZWFsX2xlbiA9IHRyYWNlX3BrdC0+cmVhbF9sZW5ndGg7CisKKwkJCWlmIChkYXRhX3B0ciA9PSAwKSB7CisJCQkgICAgIAl0cmFjZV9wa3QtPmRhdGFfYXZhaWwgPSAweDAwOworCQkJfSBlbHNlIHsKKwkJCQl1bnNpZ25lZCB0bXAgPSAwOworCisJCQkJLyogZ2V0IHRoZSBkYXRhIGZyb20gY2lyY3VsYXIgYnVmZmVyCisJCQkJICAgIG11c3QgY2hlY2sgZm9yIGVuZCBvZiBidWZmZXIgKi8KKwkJCSAgICAgICAgdHJhY2VfcGt0LT5kYXRhX2F2YWlsID0gMHgwMTsKKworCQkJCWlmICgoZGF0YV9wdHIgKyByZWFsX2xlbikgPgorCQkJCQkgICAgIGNoZGxjX3ByaXZfYXJlYS0+ZW5kX2FkZHJfdHJhY2VfYnVmZmVyICsgMSl7CisKKwkJCQkgICAgCXRtcCA9IGNoZGxjX3ByaXZfYXJlYS0+ZW5kX2FkZHJfdHJhY2VfYnVmZmVyIC0gZGF0YV9wdHIgKyAxOworCQkJCSAgICAJc2RsYV9wZWVrKCZjYXJkLT5odywgZGF0YV9wdHIsCisJCQkJCSAgICAgICAJICB0cmFjZV9wa3QtPmRhdGEsdG1wKTsKKwkJCQkgICAgCWRhdGFfcHRyID0gY2hkbGNfcHJpdl9hcmVhLT5iYXNlX2FkZHJfdHJhY2VfYnVmZmVyOworCQkJCX0KKwkKKwkJICAgICAgICAJc2RsYV9wZWVrKCZjYXJkLT5odywgZGF0YV9wdHIsCisJCQkJCSAgJnRyYWNlX3BrdC0+ZGF0YVt0bXBdLCByZWFsX2xlbiAtIHRtcCk7CisJCQl9CQorCisJCQkvKiB6ZXJvIHRoZSBvcHAgZmxhZyB0byBzaG93IHdlIGdvdCB0aGUgZnJhbWUgKi8KKwkJCXV0X2NoYXIgPSAweDAwOworCQkJc2RsYV9wb2tlKCZjYXJkLT5odywgY2hkbGNfcHJpdl9hcmVhLT5jdXJyX3RyYWNlX2FkZHIsICZ1dF9jaGFyLCAxKTsKKworICAgICAgIAkJCS8qIG5vdyBtb3ZlIG9udG8gdGhlIG5leHQgZnJhbWUgKi8KKyAgICAgICAJCQljaGRsY19wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciArPSBzaXplb2YoVFJBQ0VfU1RBVFVTX0VMRU1FTlRfU1RSVUNUKTsKKworICAgICAgIAkJCS8qIGNoZWNrIGlmIHdlIHdlbnQgb3ZlciB0aGUgbGFzdCBhZGRyZXNzICovCisJCQlpZiAoIGNoZGxjX3ByaXZfYXJlYS0+Y3Vycl90cmFjZV9hZGRyID4gY2hkbGNfcHJpdl9hcmVhLT5lbmRfdHJhY2VfYWRkciApIHsKKwkJCQljaGRsY19wcml2X2FyZWEtPmN1cnJfdHJhY2VfYWRkciA9IGNoZGxjX3ByaXZfYXJlYS0+c3RhcnRfdHJhY2VfYWRkcjsKKyAgICAgICAJCQl9CisKKyAgICAgICAgICAgIAkJaWYodHJhY2VfcGt0LT5kYXRhX2F2YWlsID09IDB4MDEpIHsKKwkJCQlidWZmZXJfbGVuZ3RoICs9IHJlYWxfbGVuIC0gMTsKKwkJCX0KKwkgCisJICAgICAgIAkgICAgCS8qIGZvciB0aGUgaGVhZGVyICovCisJICAgICAgICAgICAgCWJ1ZmZlcl9sZW5ndGggKz0gc2l6ZW9mKHRyYWNlX3BrdF90KTsKKworCQkgICAgIH0gIC8qIEZvciBMb29wICovCisKKwkJICAgICBpZiAoZnJhbWVzID09IGNoZGxjX3ByaXZfYXJlYS0+bnVtYmVyX3RyYWNlX2VsZW1lbnRzKXsKKwkJCWNoZGxjX3VkcF9wa3QtPnRyYWNlX2luZm8uaXNtb3JlZGF0YSA9IDB4MDE7CisJICAgICAgICAgICAgIH0KKyAJCSAgICAgY2hkbGNfdWRwX3BrdC0+dHJhY2VfaW5mby5udW1fZnJhbWVzID0gZnJhbWVzOworCQkgCisgICAgCQkgICAgIG1iLT5idWZmZXJfbGVuZ3RoID0gYnVmZmVyX2xlbmd0aDsKKwkJICAgICBjaGRsY191ZHBfcGt0LT5jYmxvY2suYnVmZmVyX2xlbmd0aCA9IGJ1ZmZlcl9sZW5ndGg7IAorCQkgCisJCSAgICAgY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLnJldHVybl9jb2RlID0gQ09NTUFORF9PSzsgCisJCSAgICAgCisJCSAgICAgYnJlYWs7CisKKworCQljYXNlIENQSVBFX0ZUMV9SRUFEX1NUQVRVUzoKKwkJCSgodW5zaWduZWQgY2hhciAqKWNoZGxjX3VkcF9wa3QtPmRhdGEgKVswXSA9CisJCQkJZmxhZ3MtPkZUMV9pbmZvX3N0cnVjdC5wYXJhbGxlbF9wb3J0X0FfaW5wdXQ7CisKKwkJCSgodW5zaWduZWQgY2hhciAqKWNoZGxjX3VkcF9wa3QtPmRhdGEgKVsxXSA9CisJCQkJZmxhZ3MtPkZUMV9pbmZvX3N0cnVjdC5wYXJhbGxlbF9wb3J0X0JfaW5wdXQ7CisJCQkJIAorCQkJY2hkbGNfdWRwX3BrdC0+Y2Jsb2NrLnJldHVybl9jb2RlID0gQ09NTUFORF9PSzsKKwkJCW1iLT5idWZmZXJfbGVuZ3RoID0gMjsKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBDUElQRV9ST1VURVJfVVBfVElNRToKKwkJCWRvX2dldHRpbWVvZmRheSggJnR2ICk7CisJCQljaGRsY19wcml2X2FyZWEtPnJvdXRlcl91cF90aW1lID0gdHYudHZfc2VjIC0gCisJCQkJCWNoZGxjX3ByaXZfYXJlYS0+cm91dGVyX3N0YXJ0X3RpbWU7CisJCQkqKHVuc2lnbmVkIGxvbmcgKikmY2hkbGNfdWRwX3BrdC0+ZGF0YSA9IAorCQkJCQljaGRsY19wcml2X2FyZWEtPnJvdXRlcl91cF90aW1lOwkKKwkJCW1iLT5idWZmZXJfbGVuZ3RoID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCQkJYnJlYWs7CisKKyAgIAkJY2FzZSBGVDFfTU9OSVRPUl9TVEFUVVNfQ1RSTDoKKwkJCS8qIEVuYWJsZSBGVDEgTU9OSVRPUiBTVEFUVVMgKi8KKwkgICAgICAgIAlpZiAoKGNoZGxjX3VkcF9wa3QtPmRhdGFbMF0gJiBFTkFCTEVfUkVBRF9GVDFfU1RBVFVTKSB8fCAgCisJCQkJKGNoZGxjX3VkcF9wa3QtPmRhdGFbMF0gJiBFTkFCTEVfUkVBRF9GVDFfT1BfU1RBVFMpKSB7CisJCQkKKwkJCSAgICAgCWlmKCByQ291bnQrKyAhPSAwICkgeworCQkJCQljaGRsY191ZHBfcGt0LT5jYmxvY2suCisJCQkJCXJldHVybl9jb2RlID0gQ09NTUFORF9PSzsKKwkJCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSAxOworCQkgIAkJCWJyZWFrOworCQkgICAgCSAgICAgCX0KKwkgICAgICAJCX0KKworCSAgICAgIAkJLyogRGlzYWJsZSBGVDEgTU9OSVRPUiBTVEFUVVMgKi8KKwkgICAgICAJCWlmKCBjaGRsY191ZHBfcGt0LT5kYXRhWzBdID09IDApIHsKKworCSAgICAgIAkgICAJICAgICAJaWYoIC0tckNvdW50ICE9IDApIHsKKwkJICAJCQljaGRsY191ZHBfcGt0LT5jYmxvY2suCisJCQkJCXJldHVybl9jb2RlID0gQ09NTUFORF9PSzsKKwkJCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSAxOworCQkgIAkJCWJyZWFrOworCSAgIAkgICAgCSAgICAgCX0gCisJICAgICAgCQl9IAkKKwkKKwkJZGVmYXVsdDoKKwkJCS8qIGl0J3MgYSBib2FyZCBjb21tYW5kICovCisJCQltYi0+Y29tbWFuZCA9IGNoZGxjX3VkcF9wa3QtPmNibG9jay5jb21tYW5kOworCQkJbWItPmJ1ZmZlcl9sZW5ndGggPSBjaGRsY191ZHBfcGt0LT5jYmxvY2suYnVmZmVyX2xlbmd0aDsKKwkJCWlmIChtYi0+YnVmZmVyX2xlbmd0aCkgeworCQkJCW1lbWNweSgmbWItPmRhdGEsICh1bnNpZ25lZCBjaGFyICopIGNoZGxjX3VkcF9wa3QtPgorCQkJCQkJCWRhdGEsIG1iLT5idWZmZXJfbGVuZ3RoKTsKKwkgICAgICAJCX0gCisJCQkvKiBydW4gdGhlIGNvbW1hbmQgb24gdGhlIGJvYXJkICovCisJCQllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisJCQlpZiAoZXJyICE9IENPTU1BTkRfT0spIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogY29weSB0aGUgcmVzdWx0IGJhY2sgdG8gb3VyIGJ1ZmZlciAqLworCSAgICAgICAgIAltZW1jcHkoJmNoZGxjX3VkcF9wa3QtPmNibG9jaywgbWIsIHNpemVvZihjYmxvY2tfdCkpOyAKKwkJCQorCQkJaWYgKG1iLT5idWZmZXJfbGVuZ3RoKSB7CisJICAgICAgICAgCQltZW1jcHkoJmNoZGxjX3VkcF9wa3QtPmRhdGEsICZtYi0+ZGF0YSwgCisJCQkJCQkJCW1iLT5idWZmZXJfbGVuZ3RoKTsgCisJICAgICAgCQl9CisKKwkJfSAvKiBlbmQgb2Ygc3dpdGNoICovCisgICAgIAl9IC8qIGVuZCBvZiBlbHNlICovCisKKyAgICAgCS8qIEZpbGwgVURQIFRUTCAqLworCWNoZGxjX3VkcF9wa3QtPmlwX3BrdC50dGwgPSBjYXJkLT53YW5kZXYudHRsOyAKKworICAgICAJbGVuID0gcmVwbHlfdWRwKGNoZGxjX3ByaXZfYXJlYS0+dWRwX3BrdF9kYXRhLCBtYi0+YnVmZmVyX2xlbmd0aCk7CisJCisgICAgIAlpZihjaGRsY19wcml2X2FyZWEtPnVkcF9wa3Rfc3JjID09IFVEUF9QS1RfRlJNX05FVFdPUkspIHsKKwkJaWYoIWNoZGxjX3NlbmQoY2FyZCwgY2hkbGNfcHJpdl9hcmVhLT51ZHBfcGt0X2RhdGEsIGxlbikpIHsKKwkJCSsrIGNhcmQtPndhbmRldi5zdGF0cy50eF9wYWNrZXRzOworCQkJY2FyZC0+d2FuZGV2LnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKwkJfQorCX0gZWxzZSB7CQorCQorCQkvKiBQYXNzIGl0IHVwIHRoZSBzdGFjaworICAgIAkJICAgQWxsb2NhdGUgc29ja2V0IGJ1ZmZlciAqLworCQlpZiAoKG5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKGxlbikpICE9IE5VTEwpIHsKKwkJCS8qIGNvcHkgZGF0YSBpbnRvIG5ld19za2IgKi8KKworIAkgICAgCQlidWYgPSBza2JfcHV0KG5ld19za2IsIGxlbik7CisgIAkgICAgCQltZW1jcHkoYnVmLCBjaGRsY19wcml2X2FyZWEtPnVkcF9wa3RfZGF0YSwgbGVuKTsKKworICAgICAgICAgICAgCQkvKiBEZWNhcHN1bGF0ZSBwa3QgYW5kIHBhc3MgaXQgdXAgdGhlIHByb3RvY29sIHN0YWNrICovCisJICAgIAkJbmV3X3NrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisgICAgICAgICAgICAJCW5ld19za2ItPmRldiA9IGRldjsKKwkgICAgCQluZXdfc2tiLT5tYWMucmF3ICA9IG5ld19za2ItPmRhdGE7CisJCisJCQluZXRpZl9yeChuZXdfc2tiKTsKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCX0gZWxzZSB7CisJICAgIAkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBubyBzb2NrZXQgYnVmZmVycyBhdmFpbGFibGUhXG4iLAorCQkJCQljYXJkLT5kZXZuYW1lKTsKKyAgCQl9CisgICAgCX0KKyAKKwljaGRsY19wcml2X2FyZWEtPnVkcF9wa3RfbGd0aCA9IDA7CisgCQorCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgUmVjZWl2ZSBhbmQgVHJhbnNtaXQgQnVmZmVycy4KKyAqLworCitzdGF0aWMgdm9pZCBpbml0X2NoZGxjX3R4X3J4X2J1ZmYoc2RsYV90KiBjYXJkLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCUNIRExDX01BSUxCT1hfU1RSVUNUKiBtYiA9IGNhcmQtPm1ib3g7CisJQ0hETENfVFhfU1RBVFVTX0VMX0NGR19TVFJVQ1QgKnR4X2NvbmZpZzsKKwlDSERMQ19SWF9TVEFUVVNfRUxfQ0ZHX1NUUlVDVCAqcnhfY29uZmlnOworCWNoYXIgZXJyOworCQorCW1iLT5idWZmZXJfbGVuZ3RoID0gMDsKKwltYi0+Y29tbWFuZCA9IFJFQURfQ0hETENfQ09ORklHVVJBVElPTjsKKwllcnIgPSBzZGxhX2V4ZWMobWIpID8gbWItPnJldHVybl9jb2RlIDogQ01EX1RJTUVPVVQ7CisKKwlpZihlcnIgIT0gQ09NTUFORF9PSykgeworCQljaGRsY19lcnJvcihjYXJkLGVycixtYik7CisJCXJldHVybjsKKwl9CisKKwlpZihjYXJkLT5ody50eXBlID09IFNETEFfUzUxNCkgeworCQl0eF9jb25maWcgPSAoQ0hETENfVFhfU1RBVFVTX0VMX0NGR19TVFJVQ1QgKikoY2FyZC0+aHcuZHBtYmFzZSArCisgICAgICAgICAgICAgICAgKCgoQ0hETENfQ09ORklHVVJBVElPTl9TVFJVQ1QgKiltYi0+ZGF0YSktPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9DSERMQ19UeF9zdGF0X2VsX2NmZ19zdHJ1Y3QpKTsKKyAgICAgICAgCXJ4X2NvbmZpZyA9IChDSERMQ19SWF9TVEFUVVNfRUxfQ0ZHX1NUUlVDVCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgICAoKChDSERMQ19DT05GSUdVUkFUSU9OX1NUUlVDVCAqKW1iLT5kYXRhKS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX0NIRExDX1J4X3N0YXRfZWxfY2ZnX3N0cnVjdCkpOworCisgICAgICAgCQkvKiBTZXR1cCBIZWFkIGFuZCBUYWlscyBmb3IgYnVmZmVycyAqLworICAgICAgICAJY2FyZC0+dS5jLnR4YnVmX2Jhc2UgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgICB0eF9jb25maWctPmJhc2VfYWRkcl9UeF9zdGF0dXNfZWxlbWVudHMpOworICAgICAgICAJY2FyZC0+dS5jLnR4YnVmX2xhc3QgPSAKKwkJKENIRExDX0RBVEFfVFhfU1RBVFVTX0VMX1NUUlVDVCAqKSAgCisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnR4YnVmX2Jhc2UgKworCQkodHhfY29uZmlnLT5udW1iZXJfVHhfc3RhdHVzX2VsZW1lbnRzIC0gMSk7CisKKyAgICAgICAgCWNhcmQtPnUuYy5yeGJ1Zl9iYXNlID0gKHZvaWQgKikoY2FyZC0+aHcuZHBtYmFzZSArCisgICAgICAgICAgICAgICAgcnhfY29uZmlnLT5iYXNlX2FkZHJfUnhfc3RhdHVzX2VsZW1lbnRzKTsKKyAgICAgICAgCWNhcmQtPnUuYy5yeGJ1Zl9sYXN0ID0KKwkJKENIRExDX0RBVEFfUlhfU1RBVFVTX0VMX1NUUlVDVCAqKQorICAgICAgICAgICAgICAgIGNhcmQtPnUuYy5yeGJ1Zl9iYXNlICsKKwkJKHJ4X2NvbmZpZy0+bnVtYmVyX1J4X3N0YXR1c19lbGVtZW50cyAtIDEpOworCisgCQkvKiBTZXQgdXAgbmV4dCBwb2ludGVyIHRvIGJlIHVzZWQgKi8KKyAgICAgICAgCWNhcmQtPnUuYy50eGJ1ZiA9ICh2b2lkICopKGNhcmQtPmh3LmRwbWJhc2UgKworICAgICAgICAgICAgICAgIHR4X2NvbmZpZy0+bmV4dF9UeF9zdGF0dXNfZWxlbWVudF90b191c2UpOworICAgICAgICAJY2FyZC0+dS5jLnJ4bWIgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKyAgICAgICAgICAgICAgICByeF9jb25maWctPm5leHRfUnhfc3RhdHVzX2VsZW1lbnRfdG9fdXNlKTsKKwl9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHR4X2NvbmZpZyA9IChDSERMQ19UWF9TVEFUVVNfRUxfQ0ZHX1NUUlVDVCAqKShjYXJkLT5ody5kcG1iYXNlICsKKwkJCSgoKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICopbWItPmRhdGEpLT4KKwkJCXB0cl9DSERMQ19UeF9zdGF0X2VsX2NmZ19zdHJ1Y3QgJSBTRExBX1dJTkRPV1NJWkUpKTsKKworICAgICAgICAgICAgICAgIHJ4X2NvbmZpZyA9IChDSERMQ19SWF9TVEFUVVNfRUxfQ0ZHX1NUUlVDVCAqKShjYXJkLT5ody5kcG1iYXNlICsKKwkJCSgoKENIRExDX0NPTkZJR1VSQVRJT05fU1RSVUNUICopbWItPmRhdGEpLT4KKwkJCXB0cl9DSERMQ19SeF9zdGF0X2VsX2NmZ19zdHJ1Y3QgJSBTRExBX1dJTkRPV1NJWkUpKTsKKworICAgICAgICAgICAgICAgIC8qIFNldHVwIEhlYWQgYW5kIFRhaWxzIGZvciBidWZmZXJzICovCisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnR4YnVmX2Jhc2UgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKwkJKHR4X2NvbmZpZy0+YmFzZV9hZGRyX1R4X3N0YXR1c19lbGVtZW50cyAlIFNETEFfV0lORE9XU0laRSkpOworICAgICAgICAgICAgICAgIGNhcmQtPnUuYy50eGJ1Zl9sYXN0ID0KKwkJKENIRExDX0RBVEFfVFhfU1RBVFVTX0VMX1NUUlVDVCAqKWNhcmQtPnUuYy50eGJ1Zl9iYXNlCisJCSsgKHR4X2NvbmZpZy0+bnVtYmVyX1R4X3N0YXR1c19lbGVtZW50cyAtIDEpOworICAgICAgICAgICAgICAgIGNhcmQtPnUuYy5yeGJ1Zl9iYXNlID0gKHZvaWQgKikoY2FyZC0+aHcuZHBtYmFzZSArCisJCShyeF9jb25maWctPmJhc2VfYWRkcl9SeF9zdGF0dXNfZWxlbWVudHMgJSBTRExBX1dJTkRPV1NJWkUpKTsKKyAgICAgICAgICAgICAgICBjYXJkLT51LmMucnhidWZfbGFzdCA9IAorCQkoQ0hETENfREFUQV9SWF9TVEFUVVNfRUxfU1RSVUNUICopY2FyZC0+dS5jLnJ4YnVmX2Jhc2UKKwkJKyAocnhfY29uZmlnLT5udW1iZXJfUnhfc3RhdHVzX2VsZW1lbnRzIC0gMSk7CisKKyAgICAgICAgICAgICAgICAgLyogU2V0IHVwIG5leHQgcG9pbnRlciB0byBiZSB1c2VkICovCisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnR4YnVmID0gKHZvaWQgKikoY2FyZC0+aHcuZHBtYmFzZSArCisJCSh0eF9jb25maWctPm5leHRfVHhfc3RhdHVzX2VsZW1lbnRfdG9fdXNlICUgU0RMQV9XSU5ET1dTSVpFKSk7CisgICAgICAgICAgICAgICAgY2FyZC0+dS5jLnJ4bWIgPSAodm9pZCAqKShjYXJkLT5ody5kcG1iYXNlICsKKwkJKHJ4X2NvbmZpZy0+bmV4dF9SeF9zdGF0dXNfZWxlbWVudF90b191c2UgJSBTRExBX1dJTkRPV1NJWkUpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNldHVwIEFjdHVhbCBCdWZmZXIgU3RhcnQgYW5kIGVuZCBhZGRyZXNzZXMgKi8KKyAgICAgICAgY2FyZC0+dS5jLnJ4X2Jhc2UgPSByeF9jb25maWctPmJhc2VfYWRkcl9SeF9idWZmZXI7CisgICAgICAgIGNhcmQtPnUuYy5yeF90b3AgID0gcnhfY29uZmlnLT5lbmRfYWRkcl9SeF9idWZmZXI7CisKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUGVyZm9ybSBJbnRlcnJ1cHQgVGVzdCBieSBydW5uaW5nIFJFQURfQ0hETENfQ09ERV9WRVJTSU9OIGNvbW1hbmQgTUFYX0lOVFIKKyAqIF9URVNUX0NPVU5URVIgdGltZXMuCisgKi8KK3N0YXRpYyBpbnQgaW50cl90ZXN0KCBzZGxhX3QqIGNhcmQpCit7CisJQ0hETENfTUFJTEJPWF9TVFJVQ1QqIG1iID0gY2FyZC0+bWJveDsKKwlpbnQgZXJyLGk7CisKKwlJbnRyX3Rlc3RfY291bnRlciA9IDA7CisKKwkvKiBUaGUgY3JpdGljYWwgZmxhZyBpcyB1bnNldCBiZWNhdXNlIGR1cmluZyBpbml0aWFsaXphdGlvbiAoaWZfb3BlbikgCisJICogd2Ugd2FudCB0aGUgaW50ZXJydXB0cyB0byBiZSBlbmFibGVkIHNvIHRoYXQgd2hlbiB0aGUgd3BjX2lzciBpcworCSAqIGNhbGxlZCBpdCBkb2VzIG5vdCBleGl0IGR1ZSB0byBjcml0aWNhbCBmbGFnIHNldC4KKwkgKi8gCisKKwllcnIgPSBjaGRsY19zZXRfaW50cl9tb2RlKGNhcmQsIEFQUF9JTlRfT05fQ09NTUFORF9DT01QTEVURSk7CisKKwlpZiAoZXJyID09IENNRF9PSykgeyAKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9JTlRSX1RFU1RfQ09VTlRFUjsgaSArKykgewkKKwkJCW1iLT5idWZmZXJfbGVuZ3RoICA9IDA7CisJCQltYi0+Y29tbWFuZCA9IFJFQURfQ0hETENfQ09ERV9WRVJTSU9OOworCQkJZXJyID0gc2RsYV9leGVjKG1iKSA/IG1iLT5yZXR1cm5fY29kZSA6IENNRF9USU1FT1VUOworCQl9CisJfQorCWVsc2UgeworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IGNoZGxjX3NldF9pbnRyX21vZGUoY2FyZCwgMCk7CisKKwlpZiAoZXJyICE9IENNRF9PSykKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiBVRFAgY2FsbCBpdCBpcy4gQ1BJUEVBQiA/CisgKi8KK3N0YXRpYyBpbnQgdWRwX3BrdF90eXBlKHN0cnVjdCBza19idWZmICpza2IsIHNkbGFfdCogY2FyZCkKK3sKKwkgY2hkbGNfdWRwX3BrdF90ICpjaGRsY191ZHBfcGt0ID0gKGNoZGxjX3VkcF9wa3RfdCAqKXNrYi0+ZGF0YTsKKworCWlmICghc3RybmNtcChjaGRsY191ZHBfcGt0LT53cF9tZ210LnNpZ25hdHVyZSxVRFBNR01UX1NJR05BVFVSRSw4KSAmJgorCSAgIChjaGRsY191ZHBfcGt0LT51ZHBfcGt0LnVkcF9kc3RfcG9ydCA9PSBudG9ocyhjYXJkLT53YW5kZXYudWRwX3BvcnQpKSAmJgorCSAgIChjaGRsY191ZHBfcGt0LT5pcF9wa3QucHJvdG9jb2wgPT0gVURQTUdNVF9VRFBfUFJPVE9DT0wpICYmCisJICAgKGNoZGxjX3VkcF9wa3QtPndwX21nbXQucmVxdWVzdF9yZXBseSA9PSBVRFBNR01UX1JFUVVFU1QpKSB7CisJCXJldHVybiBVRFBfQ1BJUEVfVFlQRTsKKwl9CisJZWxzZSByZXR1cm4gVURQX0lOVkFMSURfVFlQRTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXQgUE9SVCBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQgcG9ydF9zZXRfc3RhdGUgKHNkbGFfdCAqY2FyZCwgaW50IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBjYXJkLT53YW5kZXYuZGV2OworCWNoZGxjX3ByaXZhdGVfYXJlYV90ICpjaGRsY19wcml2X2FyZWEgPSBkZXYtPnByaXY7CisKKyAgICAgICAgaWYgKGNhcmQtPnUuYy5zdGF0ZSAhPSBzdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgV0FOX0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoS0VSTl9JTkZPICIlczogSERMQyBsaW5rIGNvbm5lY3RlZCFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBXQU5fQ09OTkVDVElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoS0VSTl9JTkZPICIlczogSERMQyBsaW5rIGNvbm5lY3RpbmcuLi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPmRldm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFdBTl9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsgKEtFUk5fSU5GTyAiJXM6IEhETEMgbGluayBkaXNjb25uZWN0ZWQhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5kZXZuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhcmQtPndhbmRldi5zdGF0ZSA9IGNhcmQtPnUuYy5zdGF0ZSA9IHN0YXRlOworCQljaGRsY19wcml2X2FyZWEtPmNvbW1vbi5zdGF0ZSA9IHN0YXRlOworICAgICAgICB9Cit9CisKK3ZvaWQgczUwOF9sb2NrIChzZGxhX3QgKmNhcmQsIHVuc2lnbmVkIGxvbmcgKnNtcF9mbGFncykKK3sKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+d2FuZGV2LmxvY2ssICpzbXBfZmxhZ3MpOworICAgICAgICBpZiAoY2FyZC0+bmV4dCl7CisJCS8qIEl0IGlzIG9rIHRvIHVzZSBzcGluX2xvY2sgaGVyZSwgc2luY2Ugd2UKKwkJICogYWxyZWFkeSB0dXJuZWQgb2ZmIGludGVycnVwdHMgKi8KKyAgICAgICAgCXNwaW5fbG9jaygmY2FyZC0+bmV4dC0+d2FuZGV2LmxvY2spOworCX0KK30KKwordm9pZCBzNTA4X3VubG9jayAoc2RsYV90ICpjYXJkLCB1bnNpZ25lZCBsb25nICpzbXBfZmxhZ3MpCit7CisJaWYgKGNhcmQtPm5leHQpeworCQlzcGluX3VubG9jaygmY2FyZC0+bmV4dC0+d2FuZGV2LmxvY2spOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT53YW5kZXYubG9jaywgKnNtcF9mbGFncyk7Cit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogY29uZmlnX2NoZGxjCisgKgorICoJQ29uZmlndXJlIHRoZSBjaGRsYyBwcm90b2NvbCBhbmQgZW5hYmxlIGNvbW11bmljYXRpb25zLgkJCisgKgorICogICAJVGhlIGlmX29wZW4oKSBmdW5jdGlvbiBiaW5kcyB0aGlzIGZ1bmN0aW9uIHRvIHRoZSBwb2xsIHJvdXRpbmUuCisgKiAgICAgIFRoZXJlZm9yZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHJ1biBldmVyeSB0aW1lIHRoZSBjaGRsYyBpbnRlcmZhY2UKKyAqICAgICAgaXMgYnJvdWdodCB1cC4gV2UgY2Fubm90IHJ1biB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGlmX29wZW4gCisgKiAgICAgIGJlY2F1c2UgaWZfb3BlbiBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgcmVtb3RlIElQIGFkZHJlc3MuCisgKiAgICAgIAorICoJSWYgdGhlIGNvbW11bmljYXRpb25zIGFyZSBub3QgZW5hYmxlZCwgcHJvY2VlZCB0byBjb25maWd1cmUKKyAqICAgICAgdGhlIGNhcmQgYW5kIGVuYWJsZSBjb21tdW5pY2F0aW9ucy4KKyAqCisgKiAgICAgIElmIHRoZSBjb21tdW5pY2F0aW9ucyBhcmUgZW5hYmxlZCwgaXQgbWVhbnMgdGhhdCB0aGUgaW50ZXJmYWNlCisgKiAgICAgIHdhcyBzaHV0ZG93biBieSBldGhlciB0aGUgdXNlciBvciBkcml2ZXIuIEluIHRoaXMgY2FzZSwgd2UgCisgKiAgICAgIGhhdmUgdG8gY2hlY2sgdGhhdCB0aGUgSVAgYWRkcmVzc2VzIGhhdmUgbm90IGNoYW5nZWQuICBJZgorICogICAgICB0aGUgSVAgYWRkcmVzc2VzIGhhdmUgY2hhbmdlZCwgd2UgaGF2ZSB0byByZWNvbmZpZ3VyZSB0aGUgZmlybXdhcmUKKyAqICAgICAgYW5kIHVwZGF0ZSB0aGUgY2hhbmdlZCBJUCBhZGRyZXNzZXMuICBPdGhlcndpc2UsIGp1c3QgZXhpdC4KKyAqCisgKi8KKworc3RhdGljIGludCBjb25maWdfY2hkbGMgKHNkbGFfdCAqY2FyZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gY2FyZC0+d2FuZGV2LmRldjsKKwlTSEFSRURfTUVNT1JZX0lORk9fU1RSVUNUICpmbGFncyA9IGNhcmQtPnUuYy5mbGFnczsKKworCWlmIChjYXJkLT51LmMuY29tbV9lbmFibGVkKXsKKwkJY2hkbGNfY29tbV9kaXNhYmxlKGNhcmQpOworCQlwb3J0X3NldF9zdGF0ZShjYXJkLCBXQU5fRElTQ09OTkVDVEVEKTsKKwl9CisKKwlpZiAoc2V0X2NoZGxjX2NvbmZpZyhjYXJkKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogQ0hETEMgQ29uZmlndXJhdGlvbiBGYWlsZWQhXG4iLAorCQkJCWNhcmQtPmRldm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJaW5pdF9jaGRsY190eF9yeF9idWZmKGNhcmQsIGRldik7CisKKwkvKiBTZXQgaW50ZXJydXB0IG1vZGUgYW5kIG1hc2sgKi8KKyAgICAgICAgaWYgKGNoZGxjX3NldF9pbnRyX21vZGUoY2FyZCwgQVBQX0lOVF9PTl9SWF9GUkFNRSB8CisgICAgICAgICAgICAgICAgCQlBUFBfSU5UX09OX0dMT0JBTF9FWENFUF9DT05EIHwKKyAgICAgICAgICAgICAgICAJCUFQUF9JTlRfT05fVFhfRlJBTUUgfAorICAgICAgICAgICAgICAgIAkJQVBQX0lOVF9PTl9DSERMQ19FWENFUF9DT05EIHwgQVBQX0lOVF9PTl9USU1FUikpeworCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IEZhaWxlZCB0byBzZXQgaW50ZXJydXB0IHRyaWdnZXJzIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJcmV0dXJuIDA7CQorICAgICAgICB9CisJCisKKwkvKiBNYXNrIHRoZSBUcmFuc21pdCBhbmQgVGltZXIgaW50ZXJydXB0ICovCisJZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfcGVybWlzc2lvbiAmPSAKKwkJfihBUFBfSU5UX09OX1RYX0ZSQU1FIHwgQVBQX0lOVF9PTl9USU1FUik7CisKKworCWlmIChjaGRsY19jb21tX2VuYWJsZShjYXJkKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGYWlsZWQgdG8gZW5hYmxlIGNoZGxjIGNvbW11bmljYXRpb25zIVxuIiwKKwkJCQljYXJkLT5kZXZuYW1lKTsKKwkJZmxhZ3MtPmludGVycnVwdF9pbmZvX3N0cnVjdC5pbnRlcnJ1cHRfcGVybWlzc2lvbiA9IDA7CisJCWNhcmQtPnUuYy5jb21tX2VuYWJsZWQ9MDsKKwkJY2hkbGNfc2V0X2ludHJfbW9kZShjYXJkLDApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBJbml0aWFsaXplIFJ4L1R4IGJ1ZmZlciBjb250cm9sIGZpZWxkcyAqLworCXBvcnRfc2V0X3N0YXRlKGNhcmQsIFdBTl9DT05ORUNUSU5HKTsKKwlyZXR1cm4gMDsgCit9CisKKworc3RhdGljIHZvaWQgc2VuZF9wcHBfdGVybV9yZXF1ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisJdW5zaWduZWQgY2hhciAqYnVmOworCisJaWYgKChuZXdfc2tiID0gZGV2X2FsbG9jX3NrYig4KSkgIT0gTlVMTCkgeworCQkvKiBjb3B5IGRhdGEgaW50byBuZXdfc2tiICovCisKKwkJYnVmID0gc2tiX3B1dChuZXdfc2tiLCA4KTsKKwkJc3ByaW50ZihidWYsIiVjJWMlYyVjJWMlYyVjJWMiLCAweEZGLDB4MDMsMHhDMCwweDIxLDB4MDUsMHg5OCwweDAwLDB4MDcpOworCisJCS8qIERlY2Fwc3VsYXRlIHBrdCBhbmQgcGFzcyBpdCB1cCB0aGUgcHJvdG9jb2wgc3RhY2sgKi8KKwkJbmV3X3NrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9XQU5fUFBQKTsKKwkJbmV3X3NrYi0+ZGV2ID0gZGV2OworCQluZXdfc2tiLT5tYWMucmF3ICA9IG5ld19za2ItPmRhdGE7CisKKwkJbmV0aWZfcngobmV3X3NrYik7CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJfQorfQorCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoqKioqKiBFbmQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi93YW54bC5jIGIvZHJpdmVycy9uZXQvd2FuL3dhbnhsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3YjQ3NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi93YW54bC5jCkBAIC0wLDAgKzEsODM5IEBACisvKgorICogd2FuWEwgc2VyaWFsIGNhcmQgZHJpdmVyIGZvciBMaW51eAorICogaG9zdCBwYXJ0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIEtyenlzenRvZiBIYWxhc2EgPGtoY0BwbS53YXcucGw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBTdGF0dXM6CisgKiAgIC0gT25seSBEVEUgKGV4dGVybmFsIGNsb2NrKSBzdXBwb3J0IHdpdGggTlJaIGFuZCBOUlpJIGVuY29kaW5ncworICogICAtIHdhblhMMTAwIHdpbGwgcmVxdWlyZSBtaW5vciBkcml2ZXIgbW9kaWZpY2F0aW9ucywgbm8gYWNjZXNzIHRvIGh3CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisKKyNpbmNsdWRlICJ3YW54bC5oIgorCitzdGF0aWMgY29uc3QgY2hhciogdmVyc2lvbiA9ICJ3YW5YTCBzZXJpYWwgY2FyZCBkcml2ZXIgdmVyc2lvbjogMC40OCI7CisKKyNkZWZpbmUgUExYX0NUTF9SRVNFVCAgIDB4NDAwMDAwMDAgLyogYWRhcHRlciByZXNldCAqLworCisjdW5kZWYgREVCVUdfUEtUCisjdW5kZWYgREVCVUdfUENJCisKKy8qIE1BSUxCT1ggIzEgLSBQVVRTIENPTU1BTkRTICovCisjZGVmaW5lIE1CWDFfQ01EX0FCT1JUSiAweDg1MDAwMDAwIC8qIEFib3J0IGFuZCBKdW1wICovCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIE1CWDFfQ01EX0JTV0FQICAweDhDMDAwMDAxIC8qIGxpdHRsZS1lbmRpYW4gQnl0ZSBTd2FwIE1vZGUgKi8KKyNlbHNlCisjZGVmaW5lIE1CWDFfQ01EX0JTV0FQICAweDhDMDAwMDAwIC8qIGJpZy1lbmRpYW4gQnl0ZSBTd2FwIE1vZGUgKi8KKyNlbmRpZgorCisvKiBNQUlMQk9YICMyIC0gRFJBTSBTSVpFICovCisjZGVmaW5lIE1CWDJfTUVNU1pfTUFTSyAweEZGRkYwMDAwIC8qIFBVVFMgTWVtb3J5IFNpemUgUmVnaXN0ZXIgbWFzayAqLworCisKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBjYXJkX3QgKmNhcmQ7CisJc3BpbmxvY2tfdCBsb2NrOwkvKiBmb3Igd2FueGxfeG1pdCAqLworICAgICAgICBpbnQgbm9kZTsJCS8qIHBoeXNpY2FsIHBvcnQgIzAgLSAzICovCisJdW5zaWduZWQgaW50IGNsb2NrX3R5cGU7CisJaW50IHR4X2luLCB0eF9vdXQ7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYnNbVFhfQlVGRkVSU107Cit9cG9ydF90OworCisKK3R5cGVkZWYgc3RydWN0IHsKKwlkZXNjX3QgcnhfZGVzY3NbUlhfUVVFVUVfTEVOR1RIXTsKKwlwb3J0X3N0YXR1c190IHBvcnRfc3RhdHVzWzRdOworfWNhcmRfc3RhdHVzX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgY2FyZF90IHsKKwlpbnQgbl9wb3J0czsJCS8qIDEsIDIgb3IgNCBwb3J0cyAqLworCXU4IGlycTsKKworCXU4IF9faW9tZW0gKnBseDsJLyogUExYIFBDSTkwNjAgdmlydHVhbCBiYXNlIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsJLyogZm9yIHBjaV9uYW1lKHBkZXYpICovCisJaW50IHJ4X2luOworCXN0cnVjdCBza19idWZmICpyeF9za2JzW1JYX1FVRVVFX0xFTkdUSF07CisJY2FyZF9zdGF0dXNfdCAqc3RhdHVzOwkvKiBzaGFyZWQgYmV0d2VlbiBob3N0IGFuZCBjYXJkICovCisJZG1hX2FkZHJfdCBzdGF0dXNfYWRkcmVzczsKKwlwb3J0X3QgcG9ydHNbMF07CS8qIDEgLSA0IHBvcnRfdCBzdHJ1Y3R1cmVzIGZvbGxvdyAqLworfWNhcmRfdDsKKworCisKK3N0YXRpYyBpbmxpbmUgcG9ydF90KiBkZXZfdG9fcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgICAgICByZXR1cm4gKHBvcnRfdCAqKWRldl90b19oZGxjKGRldiktPnByaXY7Cit9CisKKworc3RhdGljIGlubGluZSBwb3J0X3N0YXR1c190KiBnZXRfc3RhdHVzKHBvcnRfdCAqcG9ydCkKK3sKKwlyZXR1cm4gJnBvcnQtPmNhcmQtPnN0YXR1cy0+cG9ydF9zdGF0dXNbcG9ydC0+bm9kZV07Cit9CisKKworI2lmZGVmIERFQlVHX1BDSQorc3RhdGljIGlubGluZSBkbWFfYWRkcl90IHBjaV9tYXBfc2luZ2xlX2RlYnVnKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB2b2lkICpwdHIsCisJCQkJCSAgICAgIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQoreworCWRtYV9hZGRyX3QgYWRkciA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsIHB0ciwgc2l6ZSwgZGlyZWN0aW9uKTsKKwlpZiAoYWRkciArIHNpemUgPiAweDEwMDAwMDAwMExMKQorCQlwcmludGsoS0VSTl9DUklUICJ3YW5YTCAlczogcGNpX21hcF9zaW5nbGUoKSByZXR1cm5lZCBtZW1vcnkiCisJCSAgICAgICAiIGF0IDB4JUxYIVxuIiwgcGNpX25hbWUocGRldiksCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWFkZHIpOworCXJldHVybiBhZGRyOworfQorCisjdW5kZWYgcGNpX21hcF9zaW5nbGUKKyNkZWZpbmUgcGNpX21hcF9zaW5nbGUgcGNpX21hcF9zaW5nbGVfZGVidWcKKyNlbmRpZgorCisKKy8qIENhYmxlIGFuZC9vciBwZXJzb25hbGl0eSBtb2R1bGUgY2hhbmdlIGludGVycnVwdCBzZXJ2aWNlICovCitzdGF0aWMgaW5saW5lIHZvaWQgd2FueGxfY2FibGVfaW50cihwb3J0X3QgKnBvcnQpCit7CisJdTMyIHZhbHVlID0gZ2V0X3N0YXR1cyhwb3J0KS0+Y2FibGU7CisJaW50IHZhbGlkID0gMTsKKwljb25zdCBjaGFyICpjYWJsZSwgKnBtLCAqZHRlID0gIiIsICpkc3IgPSAiIiwgKmRjZCA9ICIiOworCisJc3dpdGNoKHZhbHVlICYgMHg3KSB7CisJY2FzZSBTVEFUVVNfQ0FCTEVfVjM1OiBjYWJsZSA9ICJWLjM1IjsgYnJlYWs7CisJY2FzZSBTVEFUVVNfQ0FCTEVfWDIxOiBjYWJsZSA9ICJYLjIxIjsgYnJlYWs7CisJY2FzZSBTVEFUVVNfQ0FCTEVfVjI0OiBjYWJsZSA9ICJWLjI0IjsgYnJlYWs7CisJY2FzZSBTVEFUVVNfQ0FCTEVfRUlBNTMwOiBjYWJsZSA9ICJFSUE1MzAiOyBicmVhazsKKwljYXNlIFNUQVRVU19DQUJMRV9OT05FOiBjYWJsZSA9ICJubyI7IGJyZWFrOworCWRlZmF1bHQ6IGNhYmxlID0gImludmFsaWQiOworCX0KKworCXN3aXRjaCgodmFsdWUgPj4gU1RBVFVTX0NBQkxFX1BNX1NISUZUKSAmIDB4NykgeworCWNhc2UgU1RBVFVTX0NBQkxFX1YzNTogcG0gPSAiVi4zNSI7IGJyZWFrOworCWNhc2UgU1RBVFVTX0NBQkxFX1gyMTogcG0gPSAiWC4yMSI7IGJyZWFrOworCWNhc2UgU1RBVFVTX0NBQkxFX1YyNDogcG0gPSAiVi4yNCI7IGJyZWFrOworCWNhc2UgU1RBVFVTX0NBQkxFX0VJQTUzMDogcG0gPSAiRUlBNTMwIjsgYnJlYWs7CisJY2FzZSBTVEFUVVNfQ0FCTEVfTk9ORTogcG0gPSAibm8gcGVyc29uYWxpdHkiOyB2YWxpZCA9IDA7IGJyZWFrOworCWRlZmF1bHQ6IHBtID0gImludmFsaWQgcGVyc29uYWxpdHkiOyB2YWxpZCA9IDA7CisJfQorCisJaWYgKHZhbGlkKSB7CisJCWlmICgodmFsdWUgJiA3KSA9PSAoKHZhbHVlID4+IFNUQVRVU19DQUJMRV9QTV9TSElGVCkgJiA3KSkgeworCQkJZHNyID0gKHZhbHVlICYgU1RBVFVTX0NBQkxFX0RTUikgPyAiLCBEU1IgT04iIDoKKwkJCQkiLCBEU1Igb2ZmIjsKKwkJCWRjZCA9ICh2YWx1ZSAmIFNUQVRVU19DQUJMRV9EQ0QpID8gIiwgY2FycmllciBPTiIgOgorCQkJCSIsIGNhcnJpZXIgb2ZmIjsKKwkJfQorCQlkdGUgPSAodmFsdWUgJiBTVEFUVVNfQ0FCTEVfRENFKSA/ICIgRENFIiA6ICIgRFRFIjsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzJXMgbW9kdWxlLCAlcyBjYWJsZSVzJXNcbiIsCisJICAgICAgIHBvcnQtPmRldi0+bmFtZSwgcG0sIGR0ZSwgY2FibGUsIGRzciwgZGNkKTsKKworCWhkbGNfc2V0X2NhcnJpZXIodmFsdWUgJiBTVEFUVVNfQ0FCTEVfRENELCBwb3J0LT5kZXYpOworfQorCisKKworLyogVHJhbnNtaXQgY29tcGxldGUgaW50ZXJydXB0IHNlcnZpY2UgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3YW54bF90eF9pbnRyKHBvcnRfdCAqcG9ydCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydC0+ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwl3aGlsZSAoMSkgeworICAgICAgICAgICAgICAgIGRlc2NfdCAqZGVzYyA9ICZnZXRfc3RhdHVzKHBvcnQpLT50eF9kZXNjc1twb3J0LT50eF9pbl07CisJCXN0cnVjdCBza19idWZmICpza2IgPSBwb3J0LT50eF9za2JzW3BvcnQtPnR4X2luXTsKKworCQlzd2l0Y2ggKGRlc2MtPnN0YXQpIHsKKwkJY2FzZSBQQUNLRVRfRlVMTDoKKwkJY2FzZSBQQUNLRVRfRU1QVFk6CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQlyZXR1cm47CisKKwkJY2FzZSBQQUNLRVRfVU5ERVJSVU46CisJCQlzdGF0cy0+dHhfZXJyb3JzKys7CisJCQlzdGF0cy0+dHhfZmlmb19lcnJvcnMrKzsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlzdGF0cy0+dHhfcGFja2V0cysrOworCQkJc3RhdHMtPnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQl9CisgICAgICAgICAgICAgICAgZGVzYy0+c3RhdCA9IFBBQ0tFVF9FTVBUWTsgLyogRnJlZSBkZXNjcmlwdG9yICovCisJCXBjaV91bm1hcF9zaW5nbGUocG9ydC0+Y2FyZC0+cGRldiwgZGVzYy0+YWRkcmVzcywgc2tiLT5sZW4sCisJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworICAgICAgICAgICAgICAgIHBvcnQtPnR4X2luID0gKHBvcnQtPnR4X2luICsgMSkgJSBUWF9CVUZGRVJTOworICAgICAgICB9Cit9CisKKworCisvKiBSZWNlaXZlIGNvbXBsZXRlIGludGVycnVwdCBzZXJ2aWNlICovCitzdGF0aWMgaW5saW5lIHZvaWQgd2FueGxfcnhfaW50cihjYXJkX3QgKmNhcmQpCit7CisJZGVzY190ICpkZXNjOworCXdoaWxlIChkZXNjID0gJmNhcmQtPnN0YXR1cy0+cnhfZGVzY3NbY2FyZC0+cnhfaW5dLAorCSAgICAgICBkZXNjLT5zdGF0ICE9IFBBQ0tFVF9FTVBUWSkgeworCQlpZiAoKGRlc2MtPnN0YXQgJiBQQUNLRVRfUE9SVF9NQVNLKSA+IGNhcmQtPm5fcG9ydHMpCisJCQlwcmludGsoS0VSTl9DUklUICJ3YW5YTCAlczogcmVjZWl2ZWQgcGFja2V0IGZvciIKKwkJCSAgICAgICAiIG5vbmV4aXN0ZW50IHBvcnRcbiIsIHBjaV9uYW1lKGNhcmQtPnBkZXYpKTsKKwkJZWxzZSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gY2FyZC0+cnhfc2tic1tjYXJkLT5yeF9pbl07CisJCQlwb3J0X3QgKnBvcnQgPSAmY2FyZC0+cG9ydHNbZGVzYy0+c3RhdCAmCisJCQkJCQkgICAgUEFDS0VUX1BPUlRfTUFTS107CisJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydC0+ZGV2OworCQkJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCisJCQlpZiAoIXNrYikKKwkJCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCQkJZWxzZSB7CisJCQkJcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wZGV2LCBkZXNjLT5hZGRyZXNzLAorCQkJCQkJIEJVRkZFUl9MRU5HVEgsCisJCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlza2JfcHV0KHNrYiwgZGVzYy0+bGVuZ3RoKTsKKworI2lmZGVmIERFQlVHX1BLVAorCQkJCXByaW50ayhLRVJOX0RFQlVHICIlcyBSWCglaSk6IiwgZGV2LT5uYW1lLAorCQkJCSAgICAgICBza2ItPmxlbik7CisJCQkJZGVidWdfZnJhbWUoc2tiKTsKKyNlbmRpZgorCQkJCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJCQkJc3RhdHMtPnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJc2tiLT5wcm90b2NvbCA9IGhkbGNfdHlwZV90cmFucyhza2IsIGRldik7CisJCQkJbmV0aWZfcngoc2tiKTsKKwkJCQlza2IgPSBOVUxMOworCQkJfQorCisJCQlpZiAoIXNrYikgeworCQkJCXNrYiA9IGRldl9hbGxvY19za2IoQlVGRkVSX0xFTkdUSCk7CisJCQkJZGVzYy0+YWRkcmVzcyA9IHNrYiA/CisJCQkJCXBjaV9tYXBfc2luZ2xlKGNhcmQtPnBkZXYsIHNrYi0+ZGF0YSwKKwkJCQkJCSAgICAgICBCVUZGRVJfTEVOR1RILAorCQkJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSkgOiAwOworCQkJCWNhcmQtPnJ4X3NrYnNbY2FyZC0+cnhfaW5dID0gc2tiOworCQkJfQorCQl9CisJCWRlc2MtPnN0YXQgPSBQQUNLRVRfRU1QVFk7IC8qIEZyZWUgZGVzY3JpcHRvciAqLworCQljYXJkLT5yeF9pbiA9IChjYXJkLT5yeF9pbiArIDEpICUgUlhfUVVFVUVfTEVOR1RIOworCX0KK30KKworCisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3YW54bF9pbnRyKGludCBpcnEsIHZvaWQqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgICAgIGNhcmRfdCAqY2FyZCA9IGRldl9pZDsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHUzMiBzdGF0OworICAgICAgICBpbnQgaGFuZGxlZCA9IDA7CisKKworICAgICAgICB3aGlsZSgoc3RhdCA9IHJlYWRsKGNhcmQtPnBseCArIFBMWF9ET09SQkVMTF9GUk9NX0NBUkQpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlZCA9IDE7CisJCXdyaXRlbChzdGF0LCBjYXJkLT5wbHggKyBQTFhfRE9PUkJFTExfRlJPTV9DQVJEKTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjYXJkLT5uX3BvcnRzOyBpKyspIHsKKwkJCWlmIChzdGF0ICYgKDEgPDwgKERPT1JCRUxMX0ZST01fQ0FSRF9UWF8wICsgaSkpKQorCQkJCXdhbnhsX3R4X2ludHIoJmNhcmQtPnBvcnRzW2ldKTsKKwkJCWlmIChzdGF0ICYgKDEgPDwgKERPT1JCRUxMX0ZST01fQ0FSRF9DQUJMRV8wICsgaSkpKQorCQkJCXdhbnhsX2NhYmxlX2ludHIoJmNhcmQtPnBvcnRzW2ldKTsKKwkJfQorCQlpZiAoc3RhdCAmICgxIDw8IERPT1JCRUxMX0ZST01fQ0FSRF9SWCkpCisJCQl3YW54bF9yeF9pbnRyKGNhcmQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKworCitzdGF0aWMgaW50IHdhbnhsX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICAgICAgcG9ydF90ICpwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwlkZXNjX3QgKmRlc2M7CisKKyAgICAgICAgc3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKKworCWRlc2MgPSAmZ2V0X3N0YXR1cyhwb3J0KS0+dHhfZGVzY3NbcG9ydC0+dHhfb3V0XTsKKyAgICAgICAgaWYgKGRlc2MtPnN0YXQgIT0gUEFDS0VUX0VNUFRZKSB7CisgICAgICAgICAgICAgICAgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAtIHByZXZpb3VzIHhtaXQgc2hvdWxkIHN0b3AgcXVldWUgKi8KKyNpZmRlZiBERUJVR19QS1QKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHRyYW5zbWl0dGVyIGJ1ZmZlciBmdWxsXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwb3J0LT5sb2NrKTsKKwkJcmV0dXJuIDE7ICAgICAgIC8qIHJlcXVlc3QgcGFja2V0IHRvIGJlIHF1ZXVlZCAqLworCX0KKworI2lmZGVmIERFQlVHX1BLVAorCXByaW50ayhLRVJOX0RFQlVHICIlcyBUWCglaSk6IiwgZGV2LT5uYW1lLCBza2ItPmxlbik7CisJZGVidWdfZnJhbWUoc2tiKTsKKyNlbmRpZgorCisJcG9ydC0+dHhfc2tic1twb3J0LT50eF9vdXRdID0gc2tiOworCWRlc2MtPmFkZHJlc3MgPSBwY2lfbWFwX3NpbmdsZShwb3J0LT5jYXJkLT5wZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLAorCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwlkZXNjLT5sZW5ndGggPSBza2ItPmxlbjsKKwlkZXNjLT5zdGF0ID0gUEFDS0VUX0ZVTEw7CisJd3JpdGVsKDEgPDwgKERPT1JCRUxMX1RPX0NBUkRfVFhfMCArIHBvcnQtPm5vZGUpLAorCSAgICAgICBwb3J0LT5jYXJkLT5wbHggKyBQTFhfRE9PUkJFTExfVE9fQ0FSRCk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlwb3J0LT50eF9vdXQgPSAocG9ydC0+dHhfb3V0ICsgMSkgJSBUWF9CVUZGRVJTOworCisJaWYgKGdldF9zdGF0dXMocG9ydCktPnR4X2Rlc2NzW3BvcnQtPnR4X291dF0uc3RhdCAhPSBQQUNLRVRfRU1QVFkpIHsKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworI2lmZGVmIERFQlVHX1BLVAorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHRyYW5zbWl0dGVyIGJ1ZmZlciBmdWxsXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJfQorCisJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCB3YW54bF9hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgZW5jb2RpbmcsCisJCQl1bnNpZ25lZCBzaG9ydCBwYXJpdHkpCit7CisJcG9ydF90ICpwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKworCWlmIChlbmNvZGluZyAhPSBFTkNPRElOR19OUlogJiYKKwkgICAgZW5jb2RpbmcgIT0gRU5DT0RJTkdfTlJaSSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocGFyaXR5ICE9IFBBUklUWV9OT05FICYmCisJICAgIHBhcml0eSAhPSBQQVJJVFlfQ1JDMzJfUFIxX0NDSVRUICYmCisJICAgIHBhcml0eSAhPSBQQVJJVFlfQ1JDMTZfUFIxX0NDSVRUICYmCisJICAgIHBhcml0eSAhPSBQQVJJVFlfQ1JDMzJfUFIwX0NDSVRUICYmCisJICAgIHBhcml0eSAhPSBQQVJJVFlfQ1JDMTZfUFIwX0NDSVRUKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdldF9zdGF0dXMocG9ydCktPmVuY29kaW5nID0gZW5jb2Rpbmc7CisJZ2V0X3N0YXR1cyhwb3J0KS0+cGFyaXR5ID0gcGFyaXR5OworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCB3YW54bF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3sKKwljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihzeW5jX3NlcmlhbF9zZXR0aW5ncyk7CisJc3luY19zZXJpYWxfc2V0dGluZ3MgbGluZTsKKwlwb3J0X3QgKnBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCisJaWYgKGNtZCAhPSBTSU9DV0FOREVWKQorCQlyZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKworCXN3aXRjaCAoaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCWNhc2UgSUZfR0VUX0lGQUNFOgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfU1lOQ19TRVJJQUw7CisJCWlmIChpZnItPmlmcl9zZXR0aW5ncy5zaXplIDwgc2l6ZSkgeworCQkJaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA9IHNpemU7IC8qIGRhdGEgc2l6ZSB3YW50ZWQgKi8KKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCQlsaW5lLmNsb2NrX3R5cGUgPSBnZXRfc3RhdHVzKHBvcnQpLT5jbG9ja2luZzsKKwkJbGluZS5jbG9ja19yYXRlID0gMDsKKwkJbGluZS5sb29wYmFjayA9IDA7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5zeW5jLCAmbGluZSwgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIElGX0lGQUNFX1NZTkNfU0VSSUFMOgorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoZGV2LT5mbGFncyAmIElGRl9VUCkKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZsaW5lLCBpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5zeW5jLAorCQkJCSAgIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGxpbmUuY2xvY2tfdHlwZSAhPSBDTE9DS19FWFQgJiYKKwkJICAgIGxpbmUuY2xvY2tfdHlwZSAhPSBDTE9DS19UWEZST01SWCkKKwkJCXJldHVybiAtRUlOVkFMOyAvKiBObyBzdWNoIGNsb2NrIHNldHRpbmcgKi8KKworCQlpZiAobGluZS5sb29wYmFjayAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJZ2V0X3N0YXR1cyhwb3J0KS0+Y2xvY2tpbmcgPSBsaW5lLmNsb2NrX3R5cGU7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisgICAgICAgIH0KK30KKworCisKK3N0YXRpYyBpbnQgd2FueGxfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXBvcnRfdCAqcG9ydCA9IGRldl90b19wb3J0KGRldik7CisJdTggX19pb21lbSAqZGJyID0gcG9ydC0+Y2FyZC0+cGx4ICsgUExYX0RPT1JCRUxMX1RPX0NBUkQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCBpOworCisJaWYgKGdldF9zdGF0dXMocG9ydCktPm9wZW4pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcG9ydCBhbHJlYWR5IG9wZW5cbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoKGkgPSBoZGxjX29wZW4oZGV2KSkgIT0gMCkKKwkJcmV0dXJuIGk7CisKKwlwb3J0LT50eF9pbiA9IHBvcnQtPnR4X291dCA9IDA7CisJZm9yIChpID0gMDsgaSA8IFRYX0JVRkZFUlM7IGkrKykKKwkJZ2V0X3N0YXR1cyhwb3J0KS0+dHhfZGVzY3NbaV0uc3RhdCA9IFBBQ0tFVF9FTVBUWTsKKwkvKiBzaWduYWwgdGhlIGNhcmQgKi8KKwl3cml0ZWwoMSA8PCAoRE9PUkJFTExfVE9fQ0FSRF9PUEVOXzAgKyBwb3J0LT5ub2RlKSwgZGJyKTsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CisJZG8KKwkJaWYgKGdldF9zdGF0dXMocG9ydCktPm9wZW4pIHsKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCQlyZXR1cm4gMDsKKwkJfQorCXdoaWxlICh0aW1lX2FmdGVyKHRpbWVvdXQsIGppZmZpZXMpKTsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBvcGVuIHBvcnRcbiIsIGRldi0+bmFtZSk7CisJLyogYXNrIHRoZSBjYXJkIHRvIGNsb3NlIHRoZSBwb3J0LCBzaG91bGQgaXQgYmUgc3RpbGwgYWxpdmUgKi8KKwl3cml0ZWwoMSA8PCAoRE9PUkJFTExfVE9fQ0FSRF9DTE9TRV8wICsgcG9ydC0+bm9kZSksIGRicik7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKKworCitzdGF0aWMgaW50IHdhbnhsX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcG9ydF90ICpwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJaW50IGk7CisKKwloZGxjX2Nsb3NlKGRldik7CisJLyogc2lnbmFsIHRoZSBjYXJkICovCisJd3JpdGVsKDEgPDwgKERPT1JCRUxMX1RPX0NBUkRfQ0xPU0VfMCArIHBvcnQtPm5vZGUpLAorCSAgICAgICBwb3J0LT5jYXJkLT5wbHggKyBQTFhfRE9PUkJFTExfVE9fQ0FSRCk7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIEhaOworCWRvCisJCWlmICghZ2V0X3N0YXR1cyhwb3J0KS0+b3BlbikKKwkJCWJyZWFrOworCXdoaWxlICh0aW1lX2FmdGVyKHRpbWVvdXQsIGppZmZpZXMpKTsKKworCWlmIChnZXRfc3RhdHVzKHBvcnQpLT5vcGVuKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gY2xvc2UgcG9ydFxuIiwgZGV2LT5uYW1lKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBUWF9CVUZGRVJTOyBpKyspIHsKKwkJZGVzY190ICpkZXNjID0gJmdldF9zdGF0dXMocG9ydCktPnR4X2Rlc2NzW2ldOworCisJCWlmIChkZXNjLT5zdGF0ICE9IFBBQ0tFVF9FTVBUWSkgeworCQkJZGVzYy0+c3RhdCA9IFBBQ0tFVF9FTVBUWTsKKwkJCXBjaV91bm1hcF9zaW5nbGUocG9ydC0+Y2FyZC0+cGRldiwgZGVzYy0+YWRkcmVzcywKKwkJCQkJIHBvcnQtPnR4X3NrYnNbaV0tPmxlbiwKKwkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYihwb3J0LT50eF9za2JzW2ldKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqd2FueGxfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOworCXBvcnRfdCAqcG9ydCA9IGRldl90b19wb3J0KGRldik7CisKKwlzdGF0cy0+cnhfb3Zlcl9lcnJvcnMgPSBnZXRfc3RhdHVzKHBvcnQpLT5yeF9vdmVycnVuczsKKwlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzID0gZ2V0X3N0YXR1cyhwb3J0KS0+cnhfZnJhbWVfZXJyb3JzOworCXN0YXRzLT5yeF9lcnJvcnMgPSBzdGF0cy0+cnhfb3Zlcl9lcnJvcnMgKyBzdGF0cy0+cnhfZnJhbWVfZXJyb3JzOworICAgICAgICByZXR1cm4gc3RhdHM7Cit9CisKKworCitzdGF0aWMgaW50IHdhbnhsX3B1dHNfY29tbWFuZChjYXJkX3QgKmNhcmQsIHUzMiBjbWQpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIDUgKiBIWjsKKworCXdyaXRlbChjbWQsIGNhcmQtPnBseCArIFBMWF9NQUlMQk9YXzEpOworCWRvIHsKKwkJaWYgKHJlYWRsKGNhcmQtPnBseCArIFBMWF9NQUlMQk9YXzEpID09IDApCisJCQlyZXR1cm4gMDsKKworCQlzY2hlZHVsZSgpOworCX13aGlsZSAodGltZV9hZnRlcih0aW1lb3V0LCBqaWZmaWVzKSk7CisKKwlyZXR1cm4gLTE7Cit9CisKKworCitzdGF0aWMgdm9pZCB3YW54bF9yZXNldChjYXJkX3QgKmNhcmQpCit7CisJdTMyIG9sZF92YWx1ZSA9IHJlYWRsKGNhcmQtPnBseCArIFBMWF9DT05UUk9MKSAmIH5QTFhfQ1RMX1JFU0VUOworCisJd3JpdGVsKDB4ODAsIGNhcmQtPnBseCArIFBMWF9NQUlMQk9YXzApOworCXdyaXRlbChvbGRfdmFsdWUgfCBQTFhfQ1RMX1JFU0VULCBjYXJkLT5wbHggKyBQTFhfQ09OVFJPTCk7CisJcmVhZGwoY2FyZC0+cGx4ICsgUExYX0NPTlRST0wpOyAvKiB3YWl0IGZvciBwb3N0ZWQgd3JpdGUgKi8KKwl1ZGVsYXkoMSk7CisJd3JpdGVsKG9sZF92YWx1ZSwgY2FyZC0+cGx4ICsgUExYX0NPTlRST0wpOworCXJlYWRsKGNhcmQtPnBseCArIFBMWF9DT05UUk9MKTsgLyogd2FpdCBmb3IgcG9zdGVkIHdyaXRlICovCit9CisKKworCitzdGF0aWMgdm9pZCB3YW54bF9wY2lfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwljYXJkX3QgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bl9wb3J0czsgaSsrKSB7CisJCXVucmVnaXN0ZXJfaGRsY19kZXZpY2UoY2FyZC0+cG9ydHNbaV0uZGV2KTsKKwkJZnJlZV9uZXRkZXYoY2FyZC0+cG9ydHNbaV0uZGV2KTsKKwl9CisKKwkvKiB1bnJlZ2lzdGVyIGFuZCBmcmVlIGFsbCBob3N0IHJlc291cmNlcyAqLworCWlmIChjYXJkLT5pcnEpCisJCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7CisKKwl3YW54bF9yZXNldChjYXJkKTsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9RVUVVRV9MRU5HVEg7IGkrKykKKwkJaWYgKGNhcmQtPnJ4X3NrYnNbaV0pIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoY2FyZC0+cGRldiwKKwkJCQkJIGNhcmQtPnN0YXR1cy0+cnhfZGVzY3NbaV0uYWRkcmVzcywKKwkJCQkJIEJVRkZFUl9MRU5HVEgsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKGNhcmQtPnJ4X3NrYnNbaV0pOworCQl9CisKKwlpZiAoY2FyZC0+cGx4KQorCQlpb3VubWFwKGNhcmQtPnBseCk7CisKKwlpZiAoY2FyZC0+c3RhdHVzKQorCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemVvZihjYXJkX3N0YXR1c190KSwKKwkJCQkgICAgY2FyZC0+c3RhdHVzLCBjYXJkLT5zdGF0dXNfYWRkcmVzcyk7CisKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUoY2FyZCk7Cit9CisKKworI2luY2x1ZGUgIndhbnhsZncuaW5jIgorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB3YW54bF9wY2lfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJY2FyZF90ICpjYXJkOworCXUzMiByYW1zaXplLCBzdGF0OworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwl1MzIgcGx4X3BoeTsJCS8qIFBMWCBQQ0kgYmFzZSBhZGRyZXNzICovCisJdTMyIG1lbV9waHk7CQkvKiBtZW1vcnkgUENJIGJhc2UgYWRkciAqLworCXU4IF9faW9tZW0gKm1lbTsJLyogbWVtb3J5IHZpcnR1YWwgYmFzZSBhZGRyICovCisJaW50IGksIHBvcnRzLCBhbGxvY19zaXplOworCisjaWZuZGVmIE1PRFVMRQorCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCWlmICghcHJpbnRlZF92ZXJzaW9uKSB7CisJCXByaW50ZWRfdmVyc2lvbisrOworCQlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgdmVyc2lvbik7CisJfQorI2VuZGlmCisKKwlpID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGkpCisJCXJldHVybiBpOworCisJLyogUVVJQ0MgY2FuIG9ubHkgYWNjZXNzIGZpcnN0IDI1NiBNQiBvZiBob3N0IFJBTSBkaXJlY3RseSwKKwkgICBidXQgUExYOTA2MCBETUEgZG9lcyAzMi1iaXRzIGZvciBhY3R1YWwgcGFja2V0IGRhdGEgdHJhbnNmZXJzICovCisKKwkvKiBGSVhNRSB3aGVuIFBDSS9ETUEgc3Vic3lzdGVtcyBhcmUgZml4ZWQuCisJICAgV2Ugc2V0IGJvdGggZG1hX21hc2sgYW5kIGNvbnNpc3RlbnRfZG1hX21hc2sgdG8gMjggYml0cworCSAgIGFuZCBwcmF5IHBjaV9hbGxvY19jb25zaXN0ZW50KCkgd2lsbCB1c2UgdGhpcyBpbmZvLiBJdCBzaG91bGQKKwkgICB3b3JrIG9uIG1vc3QgcGxhdGZvcm1zICovCisJaWYgKHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCAweDBGRkZGRkZGKSB8fAorCSAgICBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4MEZGRkZGRkYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAid2FuWEw6IE5vIHVzYWJsZSBETUEgY29uZmlndXJhdGlvblxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWkgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsICJ3YW5YTCIpOworCWlmIChpKSB7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcmV0dXJuIGk7CisJfQorCisJc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfU0JFX1dBTlhMMTAwOiBwb3J0cyA9IDE7IGJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9TQkVfV0FOWEwyMDA6IHBvcnRzID0gMjsgYnJlYWs7CisJZGVmYXVsdDogcG9ydHMgPSA0OworCX0KKworCWFsbG9jX3NpemUgPSBzaXplb2YoY2FyZF90KSArIHBvcnRzICogc2l6ZW9mKHBvcnRfdCk7CisJY2FyZCA9IGttYWxsb2MoYWxsb2Nfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhcmQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIndhblhMICVzOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisJbWVtc2V0KGNhcmQsIDAsIGFsbG9jX3NpemUpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGNhcmQpOworCWNhcmQtPnBkZXYgPSBwZGV2OworCisJY2FyZC0+c3RhdHVzID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZW9mKGNhcmRfc3RhdHVzX3QpLAorCQkJCQkgICAgJmNhcmQtPnN0YXR1c19hZGRyZXNzKTsKKwlpZiAoY2FyZC0+c3RhdHVzID09IE5VTEwpIHsKKwkJd2FueGxfcGNpX3JlbW92ZV9vbmUocGRldik7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisKKyNpZmRlZiBERUJVR19QQ0kKKwlwcmludGsoS0VSTl9ERUJVRyAid2FuWEwgJXM6IHBjaV9hbGxvY19jb25zaXN0ZW50KCkgcmV0dXJuZWQgbWVtb3J5IgorCSAgICAgICAiIGF0IDB4JUxYXG4iLCBwY2lfbmFtZShwZGV2KSwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyljYXJkLT5zdGF0dXNfYWRkcmVzcyk7CisjZW5kaWYKKworCS8qIEZJWE1FIHdoZW4gUENJL0RNQSBzdWJzeXN0ZW1zIGFyZSBmaXhlZC4KKwkgICBXZSBzZXQgYm90aCBkbWFfbWFzayBhbmQgY29uc2lzdGVudF9kbWFfbWFzayBiYWNrIHRvIDMyIGJpdHMKKwkgICB0byBpbmRpY2F0ZSB0aGUgY2FyZCBjYW4gZG8gMzItYml0IERNQSBhZGRyZXNzaW5nICovCisJaWYgKHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCAweEZGRkZGRkZGKSB8fAorCSAgICBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4RkZGRkZGRkYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAid2FuWEw6IE5vIHVzYWJsZSBETUEgY29uZmlndXJhdGlvblxuIik7CisJCXdhbnhsX3BjaV9yZW1vdmVfb25lKHBkZXYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBzZXQgdXAgUExYIG1hcHBpbmcgKi8KKwlwbHhfcGh5ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWNhcmQtPnBseCA9IGlvcmVtYXBfbm9jYWNoZShwbHhfcGh5LCAweDcwKTsKKworI2lmIFJFU0VUX1dISUxFX0xPQURJTkcKKwl3YW54bF9yZXNldChjYXJkKTsKKyNlbmRpZgorCisJdGltZW91dCA9IGppZmZpZXMgKyAyMCAqIEhaOworCXdoaWxlICgoc3RhdCA9IHJlYWRsKGNhcmQtPnBseCArIFBMWF9NQUlMQk9YXzApKSAhPSAwKSB7CisJCWlmICh0aW1lX2JlZm9yZSh0aW1lb3V0LCBqaWZmaWVzKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAid2FuWEwgJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IiCisJCQkgICAgICAgIiBQVVRTIHRvIGNvbXBsZXRlXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCQl3YW54bF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJc3dpdGNoKHN0YXQgJiAweEMwKSB7CisJCWNhc2UgMHgwMDoJLyogaG1tIC0gUFVUUyBjb21wbGV0ZWQgd2l0aCBub24temVybyBjb2RlPyAqLworCQljYXNlIDB4ODA6CS8qIFBVVFMgc3RpbGwgdGVzdGluZyB0aGUgaGFyZHdhcmUgKi8KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YW5YTCAlczogUFVUUyB0ZXN0IDB4JVgiCisJCQkgICAgICAgIiBmYWlsZWRcbiIsIHBjaV9uYW1lKHBkZXYpLCBzdGF0ICYgMHgzMCk7CisJCQl3YW54bF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJc2NoZWR1bGUoKTsKKwl9CisKKwkvKiBnZXQgb24tYm9hcmQgbWVtb3J5IHNpemUgKFBVVFMgZGV0ZWN0cyBubyBtb3JlIHRoYW4gNCBNQikgKi8KKwlyYW1zaXplID0gcmVhZGwoY2FyZC0+cGx4ICsgUExYX01BSUxCT1hfMikgJiBNQlgyX01FTVNaX01BU0s7CisKKwkvKiBzZXQgdXAgb24tYm9hcmQgUkFNIG1hcHBpbmcgKi8KKwltZW1fcGh5ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpOworCisKKwkvKiBzYW5pdHkgY2hlY2sgdGhlIGJvYXJkJ3MgcmVwb3J0ZWQgbWVtb3J5IHNpemUgKi8KKwlpZiAocmFtc2l6ZSA8IEJVRkZFUlNfQUREUiArCisJICAgIChUWF9CVUZGRVJTICsgUlhfQlVGRkVSUykgKiBCVUZGRVJfTEVOR1RIICogcG9ydHMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAid2FuWEwgJXM6IG5vIGVub3VnaCBvbi1ib2FyZCBSQU0iCisJCSAgICAgICAiICgldSBieXRlcyBkZXRlY3RlZCwgJXUgYnl0ZXMgcmVxdWlyZWQpXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldiksIHJhbXNpemUsIEJVRkZFUlNfQUREUiArCisJCSAgICAgICAoVFhfQlVGRkVSUyArIFJYX0JVRkZFUlMpICogQlVGRkVSX0xFTkdUSCAqIHBvcnRzKTsKKwkJd2FueGxfcGNpX3JlbW92ZV9vbmUocGRldik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICh3YW54bF9wdXRzX2NvbW1hbmQoY2FyZCwgTUJYMV9DTURfQlNXQVApKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIndhblhMICVzOiB1bmFibGUgdG8gU2V0IEJ5dGUgU3dhcCIKKwkJICAgICAgICIgTW9kZVxuIiwgcGNpX25hbWUocGRldikpOworCQl3YW54bF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFJYX1FVRVVFX0xFTkdUSDsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKEJVRkZFUl9MRU5HVEgpOworCQljYXJkLT5yeF9za2JzW2ldID0gc2tiOworCQlpZiAoc2tiKQorCQkJY2FyZC0+c3RhdHVzLT5yeF9kZXNjc1tpXS5hZGRyZXNzID0KKwkJCQlwY2lfbWFwX3NpbmdsZShjYXJkLT5wZGV2LCBza2ItPmRhdGEsCisJCQkJCSAgICAgICBCVUZGRVJfTEVOR1RILAorCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwl9CisKKwltZW0gPSBpb3JlbWFwX25vY2FjaGUobWVtX3BoeSwgUERNX09GRlNFVCArIHNpemVvZihmaXJtd2FyZSkpOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoZmlybXdhcmUpOyBpICs9IDQpCisJCXdyaXRlbChodG9ubCgqKHUzMiopKGZpcm13YXJlICsgaSkpLCBtZW0gKyBQRE1fT0ZGU0VUICsgaSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcG9ydHM7IGkrKykKKwkJd3JpdGVsKGNhcmQtPnN0YXR1c19hZGRyZXNzICsKKwkJICAgICAgICh2b2lkICopJmNhcmQtPnN0YXR1cy0+cG9ydF9zdGF0dXNbaV0gLQorCQkgICAgICAgKHZvaWQgKiljYXJkLT5zdGF0dXMsIG1lbSArIFBETV9PRkZTRVQgKyA0ICsgaSAqIDQpOworCXdyaXRlbChjYXJkLT5zdGF0dXNfYWRkcmVzcywgbWVtICsgUERNX09GRlNFVCArIDIwKTsKKwl3cml0ZWwoUERNX09GRlNFVCwgbWVtKTsKKwlpb3VubWFwKG1lbSk7CisKKwl3cml0ZWwoMCwgY2FyZC0+cGx4ICsgUExYX01BSUxCT1hfNSk7CisKKwlpZiAod2FueGxfcHV0c19jb21tYW5kKGNhcmQsIE1CWDFfQ01EX0FCT1JUSikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAid2FuWEwgJXM6IHVuYWJsZSB0byBBYm9ydCBhbmQgSnVtcFxuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJd2FueGxfcGNpX3JlbW92ZV9vbmUocGRldik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXN0YXQgPSAwOworCXRpbWVvdXQgPSBqaWZmaWVzICsgNSAqIEhaOworCWRvIHsKKwkJaWYgKChzdGF0ID0gcmVhZGwoY2FyZC0+cGx4ICsgUExYX01BSUxCT1hfNSkpICE9IDApCisJCQlicmVhazsKKwkJc2NoZWR1bGUoKTsKKwl9d2hpbGUgKHRpbWVfYWZ0ZXIodGltZW91dCwgamlmZmllcykpOworCisJaWYgKCFzdGF0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIndhblhMICVzOiB0aW1lb3V0IHdoaWxlIGluaXRpYWxpemluZyBjYXJkIgorCQkgICAgICAgImZpcm13YXJlXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCXdhbnhsX3BjaV9yZW1vdmVfb25lKHBkZXYpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKyNpZiBERVRFQ1RfUkFNCisJcmFtc2l6ZSA9IHN0YXQ7CisjZW5kaWYKKworCXByaW50ayhLRVJOX0lORk8gIndhblhMICVzOiBhdCAweCVYLCAldSBLQiBvZiBSQU0gYXQgMHglWCwgaXJxICV1XG4iLAorCSAgICAgICBwY2lfbmFtZShwZGV2KSwgcGx4X3BoeSwgcmFtc2l6ZSAvIDEwMjQsIG1lbV9waHksIHBkZXYtPmlycSk7CisKKwkvKiBBbGxvY2F0ZSBJUlEgKi8KKwlpZiAocmVxdWVzdF9pcnEocGRldi0+aXJxLCB3YW54bF9pbnRyLCBTQV9TSElSUSwgIndhblhMIiwgY2FyZCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAid2FuWEwgJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBJUlElaS5cbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSwgcGRldi0+aXJxKTsKKwkJd2FueGxfcGNpX3JlbW92ZV9vbmUocGRldik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWNhcmQtPmlycSA9IHBkZXYtPmlycTsKKworCWZvciAoaSA9IDA7IGkgPCBwb3J0czsgaSsrKSB7CisJCWhkbGNfZGV2aWNlICpoZGxjOworCQlwb3J0X3QgKnBvcnQgPSAmY2FyZC0+cG9ydHNbaV07CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19oZGxjZGV2KHBvcnQpOworCQlpZiAoIWRldikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ3YW5YTCAlczogdW5hYmxlIHRvIGFsbG9jYXRlIgorCQkJICAgICAgICIgbWVtb3J5XG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCQl3YW54bF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJcG9ydC0+ZGV2ID0gZGV2OworCQloZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKKwkJc3Bpbl9sb2NrX2luaXQoJnBvcnQtPmxvY2spOworCQlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJCWRldi0+dHhfcXVldWVfbGVuID0gNTA7CisJCWRldi0+ZG9faW9jdGwgPSB3YW54bF9pb2N0bDsKKwkJZGV2LT5vcGVuID0gd2FueGxfb3BlbjsKKwkJZGV2LT5zdG9wID0gd2FueGxfY2xvc2U7CisJCWhkbGMtPmF0dGFjaCA9IHdhbnhsX2F0dGFjaDsKKwkJaGRsYy0+eG1pdCA9IHdhbnhsX3htaXQ7CisJCWRldi0+Z2V0X3N0YXRzID0gd2FueGxfZ2V0X3N0YXRzOworCQlwb3J0LT5jYXJkID0gY2FyZDsKKwkJcG9ydC0+bm9kZSA9IGk7CisJCWdldF9zdGF0dXMocG9ydCktPmNsb2NraW5nID0gQ0xPQ0tfRVhUOworCQlpZiAocmVnaXN0ZXJfaGRsY19kZXZpY2UoZGV2KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ3YW5YTCAlczogdW5hYmxlIHRvIHJlZ2lzdGVyIGhkbGMiCisJCQkgICAgICAgIiBkZXZpY2VcbiIsIHBjaV9uYW1lKHBkZXYpKTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCQl3YW54bF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwkJCXJldHVybiAtRU5PQlVGUzsKKwkJfQorCQljYXJkLT5uX3BvcnRzKys7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAid2FuWEwgJXM6IHBvcnQiLCBwY2lfbmFtZShwZGV2KSk7CisJZm9yIChpID0gMDsgaSA8IHBvcnRzOyBpKyspCisJCXByaW50aygiJXMgIyVpOiAlcyIsIGkgPyAiLCIgOiAiIiwgaSwKKwkJICAgICAgIGNhcmQtPnBvcnRzW2ldLmRldi0+bmFtZSk7CisJcHJpbnRrKCJcbiIpOworCisJZm9yIChpID0gMDsgaSA8IHBvcnRzOyBpKyspCisJCXdhbnhsX2NhYmxlX2ludHIoJmNhcmQtPnBvcnRzW2ldKTsgLyogZ2V0IGNhcnJpZXIgc3RhdHVzIGV0Yy4qLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB3YW54bF9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfU0JFLCBQQ0lfREVWSUNFX0lEX1NCRV9XQU5YTDEwMCwgUENJX0FOWV9JRCwKKwkgIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfU0JFLCBQQ0lfREVWSUNFX0lEX1NCRV9XQU5YTDIwMCwgUENJX0FOWV9JRCwKKwkgIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfU0JFLCBQQ0lfREVWSUNFX0lEX1NCRV9XQU5YTDQwMCwgUENJX0FOWV9JRCwKKwkgIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IDAsIH0KK307CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHdhbnhsX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIndhblhMIiwKKwkuaWRfdGFibGUJPSB3YW54bF9wY2lfdGJsLAorCS5wcm9iZQkJPSB3YW54bF9wY2lfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSB3YW54bF9wY2lfcmVtb3ZlX29uZSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgd2FueGxfaW5pdF9tb2R1bGUodm9pZCkKK3sKKyNpZmRlZiBNT0RVTEUKKwlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgdmVyc2lvbik7CisjZW5kaWYKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZ3YW54bF9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHdhbnhsX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ3YW54bF9wY2lfZHJpdmVyKTsKK30KKworCitNT0RVTEVfQVVUSE9SKCJLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTQkUgSW5jLiB3YW5YTCBzZXJpYWwgcG9ydCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB3YW54bF9wY2lfdGJsKTsKKworbW9kdWxlX2luaXQod2FueGxfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQod2FueGxfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3dhbnhsLmggYi9kcml2ZXJzL25ldC93YW4vd2FueGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjg2NTU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3dhbnhsLmgKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiB3YW5YTCBzZXJpYWwgY2FyZCBkcml2ZXIgZm9yIExpbnV4CisgKiBkZWZpbml0aW9ucyBjb21tb24gdG8gaG9zdCBkcml2ZXIgYW5kIGNhcmQgZmlybXdhcmUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgS3J6eXN6dG9mIEhhbGFzYSA8a2hjQHBtLndhdy5wbD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNkZWZpbmUgUkVTRVRfV0hJTEVfTE9BRElORyAwCisKKy8qIHlvdSBtdXN0IHJlYnVpbGQgdGhlIGZpcm13YXJlIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIGlzIGNoYW5nZWQgKi8KKyNkZWZpbmUgREVURUNUX1JBTSAwCQkvKiBuZWVkZWQgZm9yID4gNE1CIFJBTSwgMTYgTUIgbWF4aW11bSAqLworI2RlZmluZSBRVUlDQ19NRU1DUFlfVVNFU19QTFggMQkvKiBtdXN0IGJlIHVzZWQgaWYgdGhlIGhvc3QgaGFzID4gMjU2IE1CIFJBTSAqLworCisKKyNkZWZpbmUgU1RBVFVTX0NBQkxFX1YzNQkyCisjZGVmaW5lIFNUQVRVU19DQUJMRV9YMjEJMworI2RlZmluZSBTVEFUVVNfQ0FCTEVfVjI0CTQKKyNkZWZpbmUgU1RBVFVTX0NBQkxFX0VJQTUzMAk1CisjZGVmaW5lIFNUQVRVU19DQUJMRV9JTlZBTElECTYKKyNkZWZpbmUgU1RBVFVTX0NBQkxFX05PTkUJNworCisjZGVmaW5lIFNUQVRVU19DQUJMRV9EQ0UJMHg4MDAwCisjZGVmaW5lIFNUQVRVU19DQUJMRV9EU1IJMHgwMDEwCisjZGVmaW5lIFNUQVRVU19DQUJMRV9EQ0QJMHgwMDA4CisjZGVmaW5lIFNUQVRVU19DQUJMRV9QTV9TSElGVAk1CisKKyNkZWZpbmUgUERNX09GRlNFVCAweDEwMDAKKworI2RlZmluZSBUWF9CVUZGRVJTIDEwCQkvKiBwZXIgcG9ydCAqLworI2RlZmluZSBSWF9CVUZGRVJTIDMwCisjZGVmaW5lIFJYX1FVRVVFX0xFTkdUSCA0MAkvKiBjYXJkLT5ob3N0IHF1ZXVlIGxlbmd0aCAtIHBlciBjYXJkICovCisKKyNkZWZpbmUgUEFDS0VUX0VNUFRZCQkweDAwCisjZGVmaW5lIFBBQ0tFVF9GVUxMCQkweDEwCisjZGVmaW5lIFBBQ0tFVF9TRU5UCQkweDIwIC8qIFRYIG9ubHkgKi8KKyNkZWZpbmUgUEFDS0VUX1VOREVSUlVOCQkweDMwIC8qIFRYIG9ubHkgKi8KKyNkZWZpbmUgUEFDS0VUX1BPUlRfTUFTSwkweDAzIC8qIFJYIG9ubHkgKi8KKworLyogYml0IG51bWJlcnMgaW4gUExYOTA2MCBkb29yYmVsbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRE9PUkJFTExfRlJPTV9DQVJEX1RYXzAJCTAgLyogcGFja2V0IHNlbnQgYnkgdGhlIGNhcmQgKi8KKyNkZWZpbmUgRE9PUkJFTExfRlJPTV9DQVJEX1RYXzEJCTEKKyNkZWZpbmUgRE9PUkJFTExfRlJPTV9DQVJEX1RYXzIJCTIKKyNkZWZpbmUgRE9PUkJFTExfRlJPTV9DQVJEX1RYXzMJCTMKKyNkZWZpbmUgRE9PUkJFTExfRlJPTV9DQVJEX1JYCQk0CisjZGVmaW5lIERPT1JCRUxMX0ZST01fQ0FSRF9DQUJMRV8wCTUgLyogY2FibGUvUE0vZXRjLiBjaGFuZ2VkICovCisjZGVmaW5lIERPT1JCRUxMX0ZST01fQ0FSRF9DQUJMRV8xCTYKKyNkZWZpbmUgRE9PUkJFTExfRlJPTV9DQVJEX0NBQkxFXzIJNworI2RlZmluZSBET09SQkVMTF9GUk9NX0NBUkRfQ0FCTEVfMwk4CisKKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9PUEVOXzAJCTAKKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9PUEVOXzEJCTEKKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9PUEVOXzIJCTIKKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9PUEVOXzMJCTMKKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9DTE9TRV8wCTQKKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9DTE9TRV8xCTUKKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9DTE9TRV8yCTYKKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9DTE9TRV8zCTcKKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9UWF8wCQk4IC8qIG91dGJvdW5kIHBhY2tldCBxdWV1ZWQgKi8KKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9UWF8xCQk5CisjZGVmaW5lIERPT1JCRUxMX1RPX0NBUkRfVFhfMgkJMTAKKyNkZWZpbmUgRE9PUkJFTExfVE9fQ0FSRF9UWF8zCQkxMQorCisvKiBmaXJtd2FyZS1vbmx5IHN0YXR1cyBiaXRzLCBzdGFydGluZyBmcm9tIGxhc3QgRE9PUkJFTExfVE9fQ0FSRCArIDEgKi8KKyNkZWZpbmUgVEFTS19TQ0NfMAkJCTEyCisjZGVmaW5lIFRBU0tfU0NDXzEJCQkxMworI2RlZmluZSBUQVNLX1NDQ18yCQkJMTQKKyNkZWZpbmUgVEFTS19TQ0NfMwkJCTE1CisKKyNkZWZpbmUgQUxJR04zMih4KSAoKCh4KSArIDMpICYgMHhGRkZGRkZGQykKKyNkZWZpbmUgQlVGRkVSX0xFTkdUSAlBTElHTjMyKEhETENfTUFYX01SVSArIDQpIC8qIDQgYnl0ZXMgZm9yIDMyLWJpdCBDUkMgKi8KKworLyogQWRkcmVzcyBvZiBUWCBhbmQgUlggYnVmZmVycyBpbiA2ODM2MCBhZGRyZXNzIHNwYWNlICovCisjZGVmaW5lIEJVRkZFUlNfQUREUgkweDQwMDAJLyogMTYgS0IgKi8KKworI2lmbmRlZiBfX0FTU0VNQkxFUl9fCisjZGVmaW5lIFBMWF9PRkZTRVQJCTAKKyNlbHNlCisjZGVmaW5lIFBMWF9PRkZTRVQJCVBMWCArIDB4ODAKKyNlbmRpZgorCisjZGVmaW5lIFBMWF9NQUlMQk9YXzAJCShQTFhfT0ZGU0VUICsgMHg0MCkKKyNkZWZpbmUgUExYX01BSUxCT1hfMQkJKFBMWF9PRkZTRVQgKyAweDQ0KQorI2RlZmluZSBQTFhfTUFJTEJPWF8yCQkoUExYX09GRlNFVCArIDB4NDgpCisjZGVmaW5lIFBMWF9NQUlMQk9YXzMJCShQTFhfT0ZGU0VUICsgMHg0QykKKyNkZWZpbmUgUExYX01BSUxCT1hfNAkJKFBMWF9PRkZTRVQgKyAweDUwKQorI2RlZmluZSBQTFhfTUFJTEJPWF81CQkoUExYX09GRlNFVCArIDB4NTQpCisjZGVmaW5lIFBMWF9NQUlMQk9YXzYJCShQTFhfT0ZGU0VUICsgMHg1OCkKKyNkZWZpbmUgUExYX01BSUxCT1hfNwkJKFBMWF9PRkZTRVQgKyAweDVDKQorI2RlZmluZSBQTFhfRE9PUkJFTExfVE9fQ0FSRAkoUExYX09GRlNFVCArIDB4NjApCisjZGVmaW5lIFBMWF9ET09SQkVMTF9GUk9NX0NBUkQJKFBMWF9PRkZTRVQgKyAweDY0KQorI2RlZmluZSBQTFhfSU5URVJSVVBUX0NTCShQTFhfT0ZGU0VUICsgMHg2OCkKKyNkZWZpbmUgUExYX0NPTlRST0wJCShQTFhfT0ZGU0VUICsgMHg2QykKKworI2lmZGVmIF9fQVNTRU1CTEVSX18KKyNkZWZpbmUgUExYX0RNQV8wX01PREUJCShQTFggKyAweDEwMCkKKyNkZWZpbmUgUExYX0RNQV8wX1BDSQkJKFBMWCArIDB4MTA0KQorI2RlZmluZSBQTFhfRE1BXzBfTE9DQUwJCShQTFggKyAweDEwOCkKKyNkZWZpbmUgUExYX0RNQV8wX0xFTkdUSAkoUExYICsgMHgxMEMpCisjZGVmaW5lIFBMWF9ETUFfMF9ERVNDCQkoUExYICsgMHgxMTApCisjZGVmaW5lIFBMWF9ETUFfMV9NT0RFCQkoUExYICsgMHgxMTQpCisjZGVmaW5lIFBMWF9ETUFfMV9QQ0kJCShQTFggKyAweDExOCkKKyNkZWZpbmUgUExYX0RNQV8xX0xPQ0FMCQkoUExYICsgMHgxMUMpCisjZGVmaW5lIFBMWF9ETUFfMV9MRU5HVEgJKFBMWCArIDB4MTIwKQorI2RlZmluZSBQTFhfRE1BXzFfREVTQwkJKFBMWCArIDB4MTI0KQorI2RlZmluZSBQTFhfRE1BX0NNRF9TVFMJCShQTFggKyAweDEyOCkKKyNkZWZpbmUgUExYX0RNQV9BUkJJVFJfMAkoUExYICsgMHgxMkMpCisjZGVmaW5lIFBMWF9ETUFfQVJCSVRSXzEJKFBMWCArIDB4MTMwKQorI2VuZGlmCisKKyNkZWZpbmUgREVTQ19MRU5HVEggMTIKKworLyogb2Zmc2V0cyBmcm9tIHN0YXJ0IG9mIHN0YXR1c190ICovCisvKiBjYXJkIHRvIGhvc3QgKi8KKyNkZWZpbmUgU1RBVFVTX09QRU4JCTAKKyNkZWZpbmUgU1RBVFVTX0NBQkxFCQkoU1RBVFVTX09QRU4gKyA0KQorI2RlZmluZSBTVEFUVVNfUlhfT1ZFUlJVTlMJKFNUQVRVU19DQUJMRSArIDQpCisjZGVmaW5lIFNUQVRVU19SWF9GUkFNRV9FUlJPUlMJKFNUQVRVU19SWF9PVkVSUlVOUyArIDQpCisKKy8qIGhvc3QgdG8gY2FyZCAqLworI2RlZmluZSBTVEFUVVNfUEFSSVRZCQkoU1RBVFVTX1JYX0ZSQU1FX0VSUk9SUyArIDQpCisjZGVmaW5lIFNUQVRVU19FTkNPRElORwkJKFNUQVRVU19QQVJJVFkgKyA0KQorI2RlZmluZSBTVEFUVVNfQ0xPQ0tJTkcJCShTVEFUVVNfRU5DT0RJTkcgKyA0KQorI2RlZmluZSBTVEFUVVNfVFhfREVTQ1MJCShTVEFUVVNfQ0xPQ0tJTkcgKyA0KQorCisjaWZuZGVmIF9fQVNTRU1CTEVSX18KKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvbGF0aWxlIHUzMiBzdGF0OworCXUzMiBhZGRyZXNzOwkJLyogUENJIGFkZHJlc3MgKi8KKwl2b2xhdGlsZSB1MzIgbGVuZ3RoOworfWRlc2NfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisvLyBDYXJkIHRvIGhvc3QKKwl2b2xhdGlsZSB1MzIgb3BlbjsKKwl2b2xhdGlsZSB1MzIgY2FibGU7CisJdm9sYXRpbGUgdTMyIHJ4X292ZXJydW5zOworCXZvbGF0aWxlIHUzMiByeF9mcmFtZV9lcnJvcnM7CisKKy8vIEhvc3QgdG8gY2FyZAorCXUzMiBwYXJpdHk7CisJdTMyIGVuY29kaW5nOworCXUzMiBjbG9ja2luZzsKKwlkZXNjX3QgdHhfZGVzY3NbVFhfQlVGRkVSU107Cit9cG9ydF9zdGF0dXNfdDsKKworI2VuZGlmIC8qIF9fQVNTRU1CTEVSX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi93YW54bGZ3LlMgYi9kcml2ZXJzL25ldC93YW4vd2FueGxmdy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYWFlMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93YW4vd2FueGxmdy5TCkBAIC0wLDAgKzEsODk1IEBACisucHNpemUgMAorLyoKKyAgd2FuWEwgc2VyaWFsIGNhcmQgZHJpdmVyIGZvciBMaW51eAorICBjYXJkIGZpcm13YXJlIHBhcnQKKworICBDb3B5cmlnaHQgKEMpIDIwMDMgS3J6eXN6dG9mIEhhbGFzYSA8a2hjQHBtLndhdy5wbD4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworCisKKworCURQUkFNIEJEczoKKwkweDAwMCAtIDB4MDUwIFRYIzAJMHgwNTAgLSAweDE0MCBSWCMwCisJMHgxNDAgLSAweDE5MCBUWCMxCTB4MTkwIC0gMHgyODAgUlgjMQorCTB4MjgwIC0gMHgyRDAgVFgjMgkweDJEMCAtIDB4M0MwIFJYIzIKKwkweDNDMCAtIDB4NDEwIFRYIzMJMHg0MTAgLSAweDUwMCBSWCMzCisKKworCTAwMCA1RkYgMTUzNiBCeXRlcyBEdWFsLVBvcnQgUkFNIFVzZXIgRGF0YSAvIEJEcworCTYwMCA2RkYgMjU2IEJ5dGVzIER1YWwtUG9ydCBSQU0gVXNlciBEYXRhIC8gQkRzCisJNzAwIDdGRiAyNTYgQnl0ZXMgRHVhbC1Qb3J0IFJBTSBVc2VyIERhdGEgLyBCRHMKKwlDMDAgQ0JGIDE5MiBCeXRlcyBEdWFsLVBvcnQgUkFNIFBhcmFtZXRlciBSQU0gUGFnZSAxCisJRDAwIERCRiAxOTIgQnl0ZXMgRHVhbC1Qb3J0IFJBTSBQYXJhbWV0ZXIgUkFNIFBhZ2UgMgorCUUwMCBFQkYgMTkyIEJ5dGVzIER1YWwtUG9ydCBSQU0gUGFyYW1ldGVyIFJBTSBQYWdlIDMKKwlGMDAgRkJGIDE5MiBCeXRlcyBEdWFsLVBvcnQgUkFNIFBhcmFtZXRlciBSQU0gUGFnZSA0CisKKwlsb2NhbCBpbnRlcnJ1cHRzCQkgICAgbGV2ZWwKKwlOTUkJCQkJCTcKKwlQSVQgdGltZXIsIENQTSAoUlgvVFggY29tcGxldGUpCQk0CisJUENJOTA2MAlETUEgYW5kIFBDSSBkb29yYmVsbHMJCTMKKwlDYWJsZSAtIG5vdCB1c2VkCQkJMQorKi8KKworI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KKyNpbmNsdWRlICJ3YW54bC5oIgorCisvKiBtZW1vcnkgYWRkcmVzc2VzIGFuZCBvZmZzZXRzICovCisKK01BWF9SQU1fU0laRQk9IDE2ICogMTAyNCAqIDEwMjQJLy8gbWF4IFJBTSBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUKKworUENJOTA2MF9WRUNUT1IJPSAweDAwMDAwMDZDCitDUE1fSVJRX0JBU0UJPSAweDQwCitFUlJPUl9WRUNUT1IJPSBDUE1fSVJRX0JBU0UgKiA0CitTQ0MxX1ZFQ1RPUgk9IChDUE1fSVJRX0JBU0UgKyAweDFFKSAqIDQKK1NDQzJfVkVDVE9SCT0gKENQTV9JUlFfQkFTRSArIDB4MUQpICogNAorU0NDM19WRUNUT1IJPSAoQ1BNX0lSUV9CQVNFICsgMHgxQykgKiA0CitTQ0M0X1ZFQ1RPUgk9IChDUE1fSVJRX0JBU0UgKyAweDFCKSAqIDQKK0NQTV9JUlFfTEVWRUwJPSA0CitUSU1FUl9JUlEJPSAxMjgKK1RJTUVSX0lSUV9MRVZFTCA9IDQKK1BJVFJfQ09OU1QJPSAweDEwMCArIDE2CQkvLyAxIEh6IHRpbWVyCisKK01CQVIJCT0gMHgwMDAzRkYwMAorCitWQUxVRV9XSU5ET1cJPSAweDQwMDAwMDAwCitPUkRFUl9XSU5ET1cJPSAweEMwMDAwMDAwCisKK1BMWAkJPSAweEZGRjkwMDAwCisKK0NTUkEJCT0gMHhGRkZCMDAwMAorQ1NSQgkJPSAweEZGRkIwMDAyCitDU1JDCQk9IDB4RkZGQjAwMDQKK0NTUkQJCT0gMHhGRkZCMDAwNgorU1RBVFVTX0NBQkxFX0xMCQk9IDB4MjAwMAorU1RBVFVTX0NBQkxFX0RUUgk9IDB4MTAwMAorCitEUFJCQVNFCQk9IDB4RkZGQzAwMDAKKworU0NDMV9CQVNFCT0gRFBSQkFTRSArIDB4QzAwCitNSVNDX0JBU0UJPSBEUFJCQVNFICsgMHhDQjAKK1NDQzJfQkFTRQk9IERQUkJBU0UgKyAweEQwMAorU0NDM19CQVNFCT0gRFBSQkFTRSArIDB4RTAwCitTQ0M0X0JBU0UJPSBEUFJCQVNFICsgMHhGMDAKKworLy8gb2Zmc2V0IGZyb20gU0NDeF9CQVNFCisvLyBTQ0NfeEJBU0UgY29udGFpbiBvZmZzZXRzIGZyb20gRFBSQkFTRSBhbmQgbXVzdCBiZSBkaXZpc2libGUgYnkgOAorU0NDX1JCQVNFCT0gMAkJLy8gMTYtYml0IFJ4QkQgYmFzZSBhZGRyZXNzCitTQ0NfVEJBU0UJPSAyCQkvLyAxNi1iaXQgVHhCRCBiYXNlIGFkZHJlc3MKK1NDQ19SRkNSCT0gNAkJLy8gOC1iaXQgUnggZnVuY3Rpb24gY29kZQorU0NDX1RGQ1IJPSA1CQkvLyA4LWJpdCBUeCBmdW5jdGlvbiBjb2RlCitTQ0NfTVJCTFIJPSA2CQkvLyAxNi1iaXQgbWF4aW11bSBSeCBidWZmZXIgbGVuZ3RoCitTQ0NfQ19NQVNLCT0gMHgzNAkJLy8gMzItYml0IENSQyBjb25zdGFudAorU0NDX0NfUFJFUwk9IDB4MzgJCS8vIDMyLWJpdCBDUkMgcHJlc2V0CitTQ0NfTUZMUgk9IDB4NDYJCS8vIDE2LWJpdCBtYXggUnggZnJhbWUgbGVuZ3RoICh3aXRob3V0IGZsYWdzKQorCitSRUdCQVNFCQk9IERQUkJBU0UgKyAweDEwMDAKK1BJQ1IJCT0gUkVHQkFTRSArIDB4MDI2CS8vIDE2LWJpdCBwZXJpb2RpYyBpcnEgY29udHJvbAorUElUUgkJPSBSRUdCQVNFICsgMHgwMkEJLy8gMTYtYml0IHBlcmlvZGljIGlycSB0aW1pbmcKK09SMQkJPSBSRUdCQVNFICsgMHgwNjQJLy8gMzItYml0IFJBTSBiYW5rICMxIG9wdGlvbnMKK0NJQ1IJCT0gUkVHQkFTRSArIDB4NTQwCS8vIDMyKDI0KS1iaXQgQ1AgaW50ZXJydXB0IGNvbmZpZworQ0lNUgkJPSBSRUdCQVNFICsgMHg1NDgJLy8gMzItYml0IENQIGludGVycnVwdCBtYXNrCitDSVNSCQk9IFJFR0JBU0UgKyAweDU0QwkvLyAzMi1iaXQgQ1AgaW50ZXJydXB0cyBpbi1zZXJ2aWNlCitQQURJUgkJPSBSRUdCQVNFICsgMHg1NTAJLy8gMTYtYml0IFBvcnRBIGRhdGEgZGlyZWN0aW9uIGJpdG1hcAorUEFQQVIJCT0gUkVHQkFTRSArIDB4NTUyCS8vIDE2LWJpdCBQb3J0QSBwaW4gYXNzaWdubWVudCBiaXRtYXAKK1BBT0RSCQk9IFJFR0JBU0UgKyAweDU1NAkvLyAxNi1iaXQgUG9ydEEgb3BlbiBkcmFpbiBiaXRtYXAKK1BBREFUCQk9IFJFR0JBU0UgKyAweDU1NgkvLyAxNi1iaXQgUG9ydEEgZGF0YSByZWdpc3RlcgorCitQQ0RJUgkJPSBSRUdCQVNFICsgMHg1NjAJLy8gMTYtYml0IFBvcnRDIGRhdGEgZGlyZWN0aW9uIGJpdG1hcAorUENQQVIJCT0gUkVHQkFTRSArIDB4NTYyCS8vIDE2LWJpdCBQb3J0QyBwaW4gYXNzaWdubWVudCBiaXRtYXAKK1BDU08JCT0gUkVHQkFTRSArIDB4NTY0CS8vIDE2LWJpdCBQb3J0QyBzcGVjaWFsIG9wdGlvbnMKK1BDREFUCQk9IFJFR0JBU0UgKyAweDU2NgkvLyAxNi1iaXQgUG9ydEMgZGF0YSByZWdpc3RlcgorUENJTlQJCT0gUkVHQkFTRSArIDB4NTY4CS8vIDE2LWJpdCBQb3J0QyBpbnRlcnJ1cHQgY29udHJvbAorQ1IJCT0gUkVHQkFTRSArIDB4NUMwCS8vIDE2LWJpdCBDb21tYW5kIHJlZ2lzdGVyCisKK1NDQzFfUkVHUwk9IFJFR0JBU0UgKyAweDYwMAorU0NDMl9SRUdTCT0gUkVHQkFTRSArIDB4NjIwCitTQ0MzX1JFR1MJPSBSRUdCQVNFICsgMHg2NDAKK1NDQzRfUkVHUwk9IFJFR0JBU0UgKyAweDY2MAorU0lDUgkJPSBSRUdCQVNFICsgMHg2RUMJLy8gMzItYml0IFNJIGNsb2NrIHJvdXRlCisKKy8vIG9mZnNldCBmcm9tIFNDQ3hfUkVHUworU0NDX0dTTVJfTAk9IDB4MDAJLy8gMzIgYml0cworU0NDX0dTTVJfSAk9IDB4MDQJLy8gMzIgYml0cworU0NDX1BTTVIJPSAweDA4CS8vIDE2IGJpdHMKK1NDQ19UT0RSCT0gMHgwQwkvLyAxNiBiaXRzCitTQ0NfRFNSCQk9IDB4MEUJLy8gMTYgYml0cworU0NDX1NDQ0UJPSAweDEwCS8vIDE2IGJpdHMKK1NDQ19TQ0NNCT0gMHgxNAkvLyAxNiBiaXRzCitTQ0NfU0NDUwk9IDB4MTcJLy8gOCBiaXRzCisKKyNpZiBRVUlDQ19NRU1DUFlfVVNFU19QTFgKKwkubWFjcm8gbWVtY3B5X2Zyb21fcGNpIHNyYywgZGVzdCwgbGVuIC8vIGxlbiBtdXN0IGJlIDwgOCBNQgorCWFkZGwgIzMsIFxsZW4KKwlhbmRsICMweEZGRkZGRkZDLCBcbGVuCQkvLyBhbHdheXMgY29weSBuICogNCBieXRlcworCW1vdmVsIFxzcmMsIFBMWF9ETUFfMF9QQ0kKKwltb3ZlbCBcZGVzdCwgUExYX0RNQV8wX0xPQ0FMCisJbW92ZWwgXGxlbiwgUExYX0RNQV8wX0xFTkdUSAorCW1vdmVsICMweDAxMDMsIFBMWF9ETUFfQ01EX1NUUwkvLyBzdGFydCBjaGFubmVsIDAgdHJhbnNmZXIKKwlic3IgbWVtY3B5X2Zyb21fcGNpX3J1bgorCS5lbmRtCisKKwkubWFjcm8gbWVtY3B5X3RvX3BjaSBzcmMsIGRlc3QsIGxlbgorCWFkZGwgIzMsIFxsZW4KKwlhbmRsICMweEZGRkZGRkZDLCBcbGVuCQkvLyBhbHdheXMgY29weSBuICogNCBieXRlcworCW1vdmVsIFxzcmMsIFBMWF9ETUFfMV9MT0NBTAorCW1vdmVsIFxkZXN0LCBQTFhfRE1BXzFfUENJCisJbW92ZWwgXGxlbiwgUExYX0RNQV8xX0xFTkdUSAorCW1vdmVsICMweDAzMDEsIFBMWF9ETUFfQ01EX1NUUwkvLyBzdGFydCBjaGFubmVsIDEgdHJhbnNmZXIKKwlic3IgbWVtY3B5X3RvX3BjaV9ydW4KKwkuZW5kbQorCisjZWxzZQorCisJLm1hY3JvIG1lbWNweSBzcmMsIGRlc3QsIGxlbgkvLyBsZW4gbXVzdCBiZSA8IDY1NTM2IGJ5dGVzCisJbW92ZWwgJWQ3LCAtKCVzcCkJCS8vIHNyYyBhbmQgZGVzdCBtdXN0IGJlIDwgMjU2IE1CCisJbW92ZWwgXGxlbiwgJWQ3CQkJLy8gYml0cyAwIGFuZCAxCisJbHNybCAjMiwgXGxlbgorCWFuZGwgXGxlbiwgXGxlbgorCWJlcSA5OWYJCQkJLy8gb25seSAwIC0gMyBieXRlcworCXN1YmwgIzEsIFxsZW4JCQkvLyBmb3IgZGJmCis5ODoJbW92ZWwgKFxzcmMpKywgKFxkZXN0KSsKKwlkYmZ3IFxsZW4sIDk4YgorOTk6CW1vdmVsICVkNywgXGxlbgorCWJ0c3RsICMxLCBcbGVuCisJYmVxIDk5ZgorCW1vdmV3IChcc3JjKSssIChcZGVzdCkrCis5OToJYnRzdGwgIzAsIFxsZW4KKwliZXEgOTlmCisJbW92ZWIgKFxzcmMpKywgKFxkZXN0KSsKKzk5OgorCW1vdmVsICglc3ApKywgJWQ3CisJLmVuZG0KKworCS5tYWNybyBtZW1jcHlfZnJvbV9wY2kgc3JjLCBkZXN0LCBsZW4KKwlhZGRsICNWQUxVRV9XSU5ET1csIFxzcmMKKwltZW1jcHkgXHNyYywgXGRlc3QsIFxsZW4KKwkuZW5kbQorCisJLm1hY3JvIG1lbWNweV90b19wY2kgc3JjLCBkZXN0LCBsZW4KKwlhZGRsICNWQUxVRV9XSU5ET1csIFxkZXN0CisJbWVtY3B5IFxzcmMsIFxkZXN0LCBcbGVuCisJLmVuZG0KKyNlbmRpZgorCisKKwkubWFjcm8gd2FpdF9mb3JfY29tbWFuZAorOTk6CWJ0c3RsICMwLCBDUgorCWJuZSA5OWIKKwkuZW5kbQorCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGNhcmQgaW5pdGlhbGl6YXRpb24gKioqKioqKioqKioqKioqKioqKi8KKwkudGV4dAorCS5nbG9iYWwgX3N0YXJ0Citfc3RhcnQ6CWJyYSBpbml0CisKKwkub3JnIF9zdGFydCArIDQKK2NoX3N0YXR1c19hZGRyOgkubG9uZyAwLCAwLCAwLCAwCityeF9kZXNjc19hZGRyOgkubG9uZyAwCisKK2luaXQ6CisjaWYgREVURUNUX1JBTQorCW1vdmVsIE9SMSwgJWQwCisJYW5kbCAjMHhGMDAwMDdGRiwgJWQwCQkvLyBtYXNrIEFNeHggYml0cworCW9ybCAjMHhGRkZGODAwICYgfihNQVhfUkFNX1NJWkUgLSAxKSwgJWQwIC8vIHVwZGF0ZSBSQU0gYmFuayBzaXplCisJbW92ZWwgJWQwLCBPUjEKKyNlbmRpZgorCisJYWRkbCAjVkFMVUVfV0lORE9XLCByeF9kZXNjc19hZGRyIC8vIFBDSSBhZGRyZXNzZXMgb2Ygc2hhcmVkIGRhdGEKKwljbHJsICVkMAkJCS8vIEQwID0gNCAqIHBvcnQKK2luaXRfMToJdHN0bCBjaF9zdGF0dXNfYWRkciglZDApCisJYmVxIGluaXRfMgorCWFkZGwgI1ZBTFVFX1dJTkRPVywgY2hfc3RhdHVzX2FkZHIoJWQwKQoraW5pdF8yOglhZGRsICM0LCAlZDAKKwljbXBsICM0ICogNCwgJWQwCisJYm5lIGluaXRfMQorCisJbW92ZWwgI3BjaTkwNjBfaW50ZXJydXB0LCBQQ0k5MDYwX1ZFQ1RPUgorCW1vdmVsICNlcnJvcl9pbnRlcnJ1cHQsIEVSUk9SX1ZFQ1RPUgorCW1vdmVsICNwb3J0X2ludGVycnVwdF8xLCBTQ0MxX1ZFQ1RPUgorCW1vdmVsICNwb3J0X2ludGVycnVwdF8yLCBTQ0MyX1ZFQ1RPUgorCW1vdmVsICNwb3J0X2ludGVycnVwdF8zLCBTQ0MzX1ZFQ1RPUgorCW1vdmVsICNwb3J0X2ludGVycnVwdF80LCBTQ0M0X1ZFQ1RPUgorCW1vdmVsICN0aW1lcl9pbnRlcnJ1cHQsIFRJTUVSX0lSUSAqIDQKKworCW1vdmVsICMweDc4MDAwMDAwLCBDSU1SCQkvLyBvbmx5IFNDQ3ggSVJRcyBmcm9tIENQTQorCW1vdmV3ICMoVElNRVJfSVJRX0xFVkVMIDw8IDgpICsgVElNRVJfSVJRLCBQSUNSCS8vIGludGVycnVwdCBmcm9tIFBJVAorCW1vdmV3ICNQSVRSX0NPTlNULCBQSVRSCisKKwkvLyBTQ0MxPVNDQ2EgU0NDMj1TQ0NiIFNDQzM9U0NDYyBTQ0M0PVNDQ2QgcHJpbz00IEhQPS0xIElSUT02NC03OQorCW1vdmVsICMweEQ0MUY0MCArIChDUE1fSVJRX0xFVkVMIDw8IDEzKSwgQ0lDUgorCW1vdmVsICMweDU0MywgUExYX0RNQV8wX01PREUJLy8gMzItYml0LCBSZWFkeSwgQnVyc3QsIElSUQorCW1vdmVsICMweDU0MywgUExYX0RNQV8xX01PREUKKwltb3ZlbCAjMHgwLCBQTFhfRE1BXzBfREVTQwkvLyBmcm9tIFBDSSB0byBsb2NhbAorCW1vdmVsICMweDgsIFBMWF9ETUFfMV9ERVNDCS8vIGZyb20gbG9jYWwgdG8gUENJCisJbW92ZWwgIzB4MTAxLCBQTFhfRE1BX0NNRF9TVFMJLy8gZW5hYmxlIGJvdGggRE1BIGNoYW5uZWxzCisJLy8gZW5hYmxlIGxvY2FsIElSUSwgRE1BLCBkb29yYmVsbHMgYW5kIFBDSSBJUlEKKwlvcmwgIzB4MDAwRjAzMDAsIFBMWF9JTlRFUlJVUFRfQ1MKKworI2lmIERFVEVDVF9SQU0KKwlic3IgcmFtX3Rlc3QKKyNlbHNlCisJbW92ZWwgIzEsIFBMWF9NQUlMQk9YXzUJCS8vIG5vbi16ZXJvIHZhbHVlID0gaW5pdCBjb21wbGV0ZQorI2VuZGlmCisJYnNyIGNoZWNrX2NzcgorCisJbW92ZXcgIzB4RkZGRiwgUEFQQVIJCS8vIGFsbCBwaW5zIGFyZSBjbG9ja3MvZGF0YQorCWNscncgUEFESVIJCQkvLyBmaXJzdCBmdW5jdGlvbgorCWNscncgUENTTwkJCS8vIENEIGFuZCBDVFMgYWx3YXlzIGFjdGl2ZQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogbWFpbiBsb29wICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCittYWluOgltb3ZlbCBjaGFubmVsX3N0YXRzLCAlZDcJLy8gRDcgPSBkb29yYmVsbCArIGlycSBzdGF0dXMKKwljbHJsIGNoYW5uZWxfc3RhdHMKKworCXRzdGwgJWQ3CisJYm5lIG1haW5fMQorCS8vIG5vdGhpbmcgdG8gZG8gLSB3YWl0IGZvciBuZXh0IGV2ZW50CisJc3RvcCAjMHgyMjAwCQkJLy8gc3VwZXJ2aXNvciArIElSUSBsZXZlbCAyCisJbW92ZXcgIzB4MjcwMCwgJXNyCQkvLyBkaXNhYmxlIElSUXMgYWdhaW4KKwlicmEgbWFpbgorCittYWluXzE6CWNscmwgJWQwCQkJLy8gRDAgPSA0ICogcG9ydAorCWNscmwgJWQ2CQkJLy8gRDYgPSBkb29yYmVsbCB0byBob3N0IHZhbHVlCisKK21haW5fbDogYnRzdGwgI0RPT1JCRUxMX1RPX0NBUkRfQ0xPU0VfMCwgJWQ3CisJYmVxIG1haW5fb3AKKwliY2xybCAjRE9PUkJFTExfVE9fQ0FSRF9PUEVOXzAsICVkNyAvLyBpbiBjYXNlIGJvdGggYml0cyBhcmUgc2V0CisJYnNyIGNsb3NlX3BvcnQKK21haW5fb3A6CisJYnRzdGwgI0RPT1JCRUxMX1RPX0NBUkRfT1BFTl8wLCAlZDcKKwliZXEgbWFpbl9jbAorCWJzciBvcGVuX3BvcnQKK21haW5fY2w6CisJYnRzdGwgI0RPT1JCRUxMX1RPX0NBUkRfVFhfMCwgJWQ3CisJYmVxIG1haW5fdHhlbmQKKwlic3IgdHgKK21haW5fdHhlbmQ6CisJYnRzdGwgI1RBU0tfU0NDXzAsICVkNworCWJlcSBtYWluX25leHQKKwlic3IgdHhfZW5kCisJYnNyIHJ4CisKK21haW5fbmV4dDoKKwlsc3JsICMxLCAlZDcJCQkvLyBwb3J0IHN0YXR1cyBmb3IgbmV4dCBwb3J0CisJYWRkbCAjNCwgJWQwCQkJLy8gRDAgPSA0ICogbmV4dCBwb3J0CisJY21wbCAjNCAqIDQsICVkMAorCWJuZSBtYWluX2wKKwltb3ZlbCAlZDYsIFBMWF9ET09SQkVMTF9GUk9NX0NBUkQgLy8gc2lnbmFsIHRoZSBob3N0CisJYnJhIG1haW4KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIG9wZW4gcG9ydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworb3Blbl9wb3J0OgkJCQkvLyBEMCA9IDQgKiBwb3J0LCBENiA9IGRvb3JiZWxsIHRvIGhvc3QKKwltb3ZlbCBjaF9zdGF0dXNfYWRkciglZDApLCAlYTAJLy8gQTAgPSBwb3J0IHN0YXR1cyBhZGRyZXNzCisJdHN0bCBTVEFUVVNfT1BFTiglYTApCisJYm5lIG9wZW5fcG9ydF9yZXQJCS8vIHBvcnQgYWxyZWFkeSBvcGVuCisJbW92ZWwgIzEsIFNUQVRVU19PUEVOKCVhMCkJLy8gY29uZmlybSB0aGUgcG9ydCBpcyBvcGVuCisvLyBzZXR1cCBCRHMKKwljbHJsIHR4X2luKCVkMCkKKwljbHJsIHR4X291dCglZDApCisJY2xybCB0eF9jb3VudCglZDApCisJY2xybCByeF9pbiglZDApCisKKwltb3ZlbCBTSUNSLCAlZDEJCQkvLyBEMSA9IGNsb2NrIHNldHRpbmdzIGluIFNJQ1IKKwlhbmRsIGNsb2NraW5nX21hc2soJWQwKSwgJWQxCisJY21wbCAjQ0xPQ0tfVFhGUk9NUlgsIFNUQVRVU19DTE9DS0lORyglYTApCisJYm5lIG9wZW5fcG9ydF9jbG9ja19leHQKKwlvcmwgY2xvY2tpbmdfdHhmcm9tcngoJWQwKSwgJWQxCisJYnJhIG9wZW5fcG9ydF9zZXRfY2xvY2sKKworb3Blbl9wb3J0X2Nsb2NrX2V4dDoKKwlvcmwgY2xvY2tpbmdfZXh0KCVkMCksICVkMQorb3Blbl9wb3J0X3NldF9jbG9jazoKKwltb3ZlbCAlZDEsIFNJQ1IJCQkvLyB1cGRhdGUgY2xvY2sgc2V0dGluZ3MgaW4gU0lDUgorCisJb3J3ICNTVEFUVVNfQ0FCTEVfRFRSLCBjc3Jfb3V0cHV0KCVkMCkJLy8gRFRSIG9uCisJYnNyIGNoZWNrX2NzcgkJCS8vIGNhbGwgd2l0aCBkaXNhYmxlZCB0aW1lciBpbnRlcnJ1cHQKKworLy8gU2V0dXAgVFggZGVzY3JpcHRvcnMKKwltb3ZlbCBmaXJzdF9idWZmZXIoJWQwKSwgJWQxCS8vIEQxID0gc3RhcnRpbmcgYnVmZmVyIGFkZHJlc3MKKwltb3ZlbCB0eF9maXJzdF9iZCglZDApLCAlYTEJLy8gQTEgPSBzdGFydGluZyBUWCBCRCBhZGRyZXNzCisJbW92ZWwgI1RYX0JVRkZFUlMgLSAyLCAlZDIJLy8gRDIgPSBUWF9CVUZGRVJTIC0gMSBjb3VudGVyCisJbW92ZWwgIzB4MTgwMDAwMDAsICVkMwkJLy8gRDMgPSBpbml0aWFsIFRYIEJEIGZsYWdzOiBJbnQgKyBMYXN0CisJY21wbCAjUEFSSVRZX05PTkUsIFNUQVRVU19QQVJJVFkoJWEwKQorCWJlcSBvcGVuX3BvcnRfdHhfbG9vcAorCWJzZXRsICMyNiwgJWQzCQkJLy8gVFggQkQgZmxhZzogVHJhbnNtaXQgQ1JDCitvcGVuX3BvcnRfdHhfbG9vcDoKKwltb3ZlbCAlZDMsICglYTEpKwkJLy8gVFggZmxhZ3MgKyBsZW5ndGgKKwltb3ZlbCAlZDEsICglYTEpKwkJLy8gYnVmZmVyIGFkZHJlc3MKKwlhZGRsICNCVUZGRVJfTEVOR1RILCAlZDEKKwlkYmZ3ICVkMiwgb3Blbl9wb3J0X3R4X2xvb3AKKworCWJzZXRsICMyOSwgJWQzCQkJLy8gVFggQkQgZmxhZzogV3JhcCAobGFzdCBCRCkKKwltb3ZlbCAlZDMsICglYTEpKwkJLy8gRmluYWwgVFggZmxhZ3MgKyBsZW5ndGgKKwltb3ZlbCAlZDEsICglYTEpKwkJLy8gYnVmZmVyIGFkZHJlc3MKKworLy8gU2V0dXAgUlggZGVzY3JpcHRvcnMJCQkvLyBBMSA9IHN0YXJ0aW5nIFJYIEJEIGFkZHJlc3MKKwltb3ZlbCAjUlhfQlVGRkVSUyAtIDIsICVkMgkvLyBEMiA9IFJYX0JVRkZFUlMgLSAxIGNvdW50ZXIKK29wZW5fcG9ydF9yeF9sb29wOgorCW1vdmVsICMweDkwMDAwMDAwLCAoJWExKSsJLy8gUlggZmxhZ3MgKyBsZW5ndGgKKwltb3ZlbCAlZDEsICglYTEpKwkJLy8gYnVmZmVyIGFkZHJlc3MKKwlhZGRsICNCVUZGRVJfTEVOR1RILCAlZDEKKwlkYmZ3ICVkMiwgb3Blbl9wb3J0X3J4X2xvb3AKKworCW1vdmVsICMweEIwMDAwMDAwLCAoJWExKSsJLy8gRmluYWwgUlggZmxhZ3MgKyBsZW5ndGgKKwltb3ZlbCAlZDEsICglYTEpKwkJLy8gYnVmZmVyIGFkZHJlc3MKKworLy8gU2V0dXAgcG9ydCBwYXJhbWV0ZXJzCisJbW92ZWwgc2NjX2Jhc2VfYWRkciglZDApLCAlYTEJLy8gQTEgPSBTQ0NfQkFTRSBhZGRyZXNzCisJbW92ZWwgc2NjX3JlZ19hZGRyKCVkMCksICVhMgkvLyBBMiA9IFNDQ19SRUdTIGFkZHJlc3MKKworCW1vdmVsICMweEZGRkYsIFNDQ19TQ0NFKCVhMikJLy8gY2xlYXIgc3RhdHVzIGJpdHMKKwltb3ZlbCAjMHgwMDAwLCBTQ0NfU0NDTSglYTIpCS8vIGludGVycnVwdCBtYXNrCisKKwltb3ZlbCB0eF9maXJzdF9iZCglZDApLCAlZDEKKwltb3ZldyAlZDEsIFNDQ19UQkFTRSglYTEpCS8vIEQxID0gb2Zmc2V0IG9mIGZpcnN0IFR4QkQKKwlhZGRsICNUWF9CVUZGRVJTICogOCwgJWQxCisJbW92ZXcgJWQxLCBTQ0NfUkJBU0UoJWExKQkvLyBEMSA9IG9mZnNldCBvZiBmaXJzdCBSeEJECisJbW92ZWIgIzB4OCwgU0NDX1JGQ1IoJWExKQkvLyBJbnRlbCBtb2RlLCAxMDAwCisJbW92ZWIgIzB4OCwgU0NDX1RGQ1IoJWExKQorCisvLyBQYXJpdHkgc2V0dGluZ3MKKwljbXBsICNQQVJJVFlfQ1JDMTZfUFIxX0NDSVRULCBTVEFUVVNfUEFSSVRZKCVhMCkKKwlibmUgb3Blbl9wb3J0X3Bhcml0eV8xCisJY2xydyBTQ0NfUFNNUiglYTIpCQkvLyBDUkMxNi1DQ0lUVAorCW1vdmVsICMweEYwQjgsIFNDQ19DX01BU0soJWExKQorCW1vdmVsICMweEZGRkYsIFNDQ19DX1BSRVMoJWExKQorCW1vdmV3ICNIRExDX01BWF9NUlUgKyAyLCBTQ0NfTUZMUiglYTEpIC8vIDIgYnl0ZXMgZm9yIENSQworCW1vdmV3ICMyLCBwYXJpdHlfYnl0ZXMoJWQwKQorCWJyYSBvcGVuX3BvcnRfMgorCitvcGVuX3BvcnRfcGFyaXR5XzE6CisJY21wbCAjUEFSSVRZX0NSQzMyX1BSMV9DQ0lUVCwgU1RBVFVTX1BBUklUWSglYTApCisJYm5lIG9wZW5fcG9ydF9wYXJpdHlfMgorCW1vdmV3ICMweDA4MDAsIFNDQ19QU01SKCVhMikJLy8gQ1JDMzItQ0NJVFQKKwltb3ZlbCAjMHhERUJCMjBFMywgU0NDX0NfTUFTSyglYTEpCisJbW92ZWwgIzB4RkZGRkZGRkYsIFNDQ19DX1BSRVMoJWExKQorCW1vdmV3ICNIRExDX01BWF9NUlUgKyA0LCBTQ0NfTUZMUiglYTEpIC8vIDQgYnl0ZXMgZm9yIENSQworCW1vdmV3ICM0LCBwYXJpdHlfYnl0ZXMoJWQwKQorCWJyYSBvcGVuX3BvcnRfMgorCitvcGVuX3BvcnRfcGFyaXR5XzI6CisJY21wbCAjUEFSSVRZX0NSQzE2X1BSMF9DQ0lUVCwgU1RBVFVTX1BBUklUWSglYTApCisJYm5lIG9wZW5fcG9ydF9wYXJpdHlfMworCWNscncgU0NDX1BTTVIoJWEyKQkJLy8gQ1JDMTYtQ0NJVFQgcHJlc2V0IDAKKwltb3ZlbCAjMHhGMEI4LCBTQ0NfQ19NQVNLKCVhMSkKKwljbHJsIFNDQ19DX1BSRVMoJWExKQorCW1vdmV3ICNIRExDX01BWF9NUlUgKyAyLCBTQ0NfTUZMUiglYTEpIC8vIDIgYnl0ZXMgZm9yIENSQworCW1vdmV3ICMyLCBwYXJpdHlfYnl0ZXMoJWQwKQorCWJyYSBvcGVuX3BvcnRfMgorCitvcGVuX3BvcnRfcGFyaXR5XzM6CisJY21wbCAjUEFSSVRZX0NSQzMyX1BSMF9DQ0lUVCwgU1RBVFVTX1BBUklUWSglYTApCisJYm5lIG9wZW5fcG9ydF9wYXJpdHlfNAorCW1vdmV3ICMweDA4MDAsIFNDQ19QU01SKCVhMikJLy8gQ1JDMzItQ0NJVFQgcHJlc2V0IDAKKwltb3ZlbCAjMHhERUJCMjBFMywgU0NDX0NfTUFTSyglYTEpCisJY2xybCBTQ0NfQ19QUkVTKCVhMSkKKwltb3ZldyAjSERMQ19NQVhfTVJVICsgNCwgU0NDX01GTFIoJWExKSAvLyA0IGJ5dGVzIGZvciBDUkMKKwltb3ZldyAjNCwgcGFyaXR5X2J5dGVzKCVkMCkKKwlicmEgb3Blbl9wb3J0XzIKKworb3Blbl9wb3J0X3Bhcml0eV80OgorCWNscncgU0NDX1BTTVIoJWEyKQkJLy8gbm8gcGFyaXR5CisJbW92ZWwgIzB4RjBCOCwgU0NDX0NfTUFTSyglYTEpCisJbW92ZWwgIzB4RkZGRiwgU0NDX0NfUFJFUyglYTEpCisJbW92ZXcgI0hETENfTUFYX01SVSwgU0NDX01GTFIoJWExKSAvLyAwIGJ5dGVzIGZvciBDUkMKKwljbHJ3IHBhcml0eV9ieXRlcyglZDApCisKK29wZW5fcG9ydF8yOgorCW1vdmVsICMweDAwMDAwMDAzLCBTQ0NfR1NNUl9IKCVhMikgLy8gUlRTTQorCWNtcGwgI0VOQ09ESU5HX05SWkksIFNUQVRVU19FTkNPRElORyglYTApCisJYm5lIG9wZW5fcG9ydF9ucnoKKwltb3ZlbCAjMHgxMDA0MDkwMCwgU0NDX0dTTVJfTCglYTIpIC8vIE5SWkk6IFRDSSBUZW5kIFJFQ04rVEVOQz0xCisJYnJhIG9wZW5fcG9ydF8zCisKK29wZW5fcG9ydF9ucno6CisJbW92ZWwgIzB4MTAwNDAwMDAsIFNDQ19HU01SX0woJWEyKSAvLyBOUlo6IFRDSSBUZW5kIFJFQ04rVEVOQz0wCitvcGVuX3BvcnRfMzoKKwltb3ZldyAjQlVGRkVSX0xFTkdUSCwgU0NDX01SQkxSKCVhMSkKKwltb3ZlbCAlZDAsICVkMQorCWxzbGwgIzQsICVkMQkJCS8vIEQxIGJpdHMgNyBhbmQgNiA9IHBvcnQKKwlvcmwgIzEsICVkMQorCW1vdmV3ICVkMSwgQ1IJCQkvLyBJbml0IFNDQyBSWCBhbmQgVFggcGFyYW1zCisJd2FpdF9mb3JfY29tbWFuZAorCisJLy8gVENJIFRlbmQgRU5SIEVOVAorCW1vdmV3ICMweDAwMUYsIFNDQ19TQ0NNKCVhMikJLy8gVFhFIFJYRiBCU1kgVFhCIFJYQiBpbnRlcnJ1cHRzCisJb3JsICMweDAwMDAwMDMwLCBTQ0NfR1NNUl9MKCVhMikgLy8gZW5hYmxlIFNDQworb3Blbl9wb3J0X3JldDoKKwlydHMKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGNsb3NlIHBvcnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworY2xvc2VfcG9ydDoJCQkJLy8gRDAgPSA0ICogcG9ydCwgRDYgPSBkb29yYmVsbCB0byBob3N0CisJbW92ZWwgc2NjX3JlZ19hZGRyKCVkMCksICVhMAkvLyBBMCA9IFNDQ19SRUdTIGFkZHJlc3MKKwljbHJ3IFNDQ19TQ0NNKCVhMCkJCS8vIG5vIFNDQyBpbnRlcnJ1cHRzCisJYW5kbCAjMHhGRkZGRkZDRiwgU0NDX0dTTVJfTCglYTApIC8vIERpc2FibGUgRU5UIGFuZCBFTlIKKworCWFuZHcgI35TVEFUVVNfQ0FCTEVfRFRSLCBjc3Jfb3V0cHV0KCVkMCkgLy8gRFRSIG9mZgorCWJzciBjaGVja19jc3IJCQkvLyBjYWxsIHdpdGggZGlzYWJsZWQgdGltZXIgaW50ZXJydXB0CisKKwltb3ZlbCBjaF9zdGF0dXNfYWRkciglZDApLCAlZDEKKwljbHJsIFNUQVRVU19PUEVOKCVkMSkJCS8vIGNvbmZpcm0gdGhlIHBvcnQgaXMgY2xvc2VkCisJcnRzCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB0cmFuc21pdCBwYWNrZXQgKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBxdWV1ZSBwYWNrZXRzIGZvciB0cmFuc21pc3Npb24KK3R4OgkJCQkJLy8gRDAgPSA0ICogcG9ydCwgRDYgPSBkb29yYmVsbCB0byBob3N0CisJY21wbCAjVFhfQlVGRkVSUywgdHhfY291bnQoJWQwKQorCWJlcSB0eF9yZXQJCQkvLyBhbGwgREIncyA9IGRlc2NzIGluIHVzZQorCisJbW92ZWwgdHhfb3V0KCVkMCksICVkMQorCW1vdmVsICVkMSwgJWQyCQkJLy8gRDEgPSBEMiA9IHR4X291dCBCRCMgPSBkZXNjIworCW11bHVsICNERVNDX0xFTkdUSCwgJWQyCQkvLyBEMiA9IFRYIGRlc2Mgb2Zmc2V0CisJYWRkbCBjaF9zdGF0dXNfYWRkciglZDApLCAlZDIKKwlhZGRsICNTVEFUVVNfVFhfREVTQ1MsICVkMgkvLyBEMiA9IFRYIGRlc2MgYWRkcmVzcworCWNtcGwgI1BBQ0tFVF9GVUxMLCAoJWQyKQkvLyBkZXNjIHN0YXR1cworCWJuZSB0eF9yZXQKKworLy8gcXVldWUgaXQKKwltb3ZlbCA0KCVkMiksICVhMAkJLy8gUENJIGFkZHJlc3MKKwlsc2xsICMzLCAlZDEJCQkvLyBCRCBpcyA4LWJ5dGVzIGxvbmcKKwlhZGRsIHR4X2ZpcnN0X2JkKCVkMCksICVkMQkvLyBEMSA9IGN1cnJlbnQgdHhfb3V0IEJEIGFkZHIKKworCW1vdmVsIDQoJWQxKSwgJWExCQkvLyBBMSA9IGRlc3QgYWRkcmVzcworCW1vdmVsIDgoJWQyKSwgJWQyCQkvLyBEMiA9IGxlbmd0aAorCW1vdmV3ICVkMiwgMiglZDEpCQkvLyBsZW5ndGggaW50byBCRAorCW1lbWNweV9mcm9tX3BjaSAlYTAsICVhMSwgJWQyCisJYnNldGwgIzMxLCAoJWQxKQkJLy8gQ1AgZ28gYWhlYWQKKworLy8gdXBkYXRlIHR4X291dCBhbmQgdHhfY291bnQKKwltb3ZlbCB0eF9vdXQoJWQwKSwgJWQxCisJYWRkbCAjMSwgJWQxCisJY21wbCAjVFhfQlVGRkVSUywgJWQxCisJYm5lIHR4XzEKKwljbHJsICVkMQordHhfMToJbW92ZWwgJWQxLCB0eF9vdXQoJWQwKQorCisJYWRkbCAjMSwgdHhfY291bnQoJWQwKQorCWJyYSB0eAorCit0eF9yZXQ6IHJ0cworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogcGFja2V0IHJlY2VpdmVkICoqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBTZXJ2aWNlIHJlY2VpdmUgYnVmZmVycwkJLy8gRDAgPSA0ICogcG9ydCwgRDYgPSBkb29yYmVsbCB0byBob3N0CityeDoJbW92ZWwgcnhfaW4oJWQwKSwgJWQxCQkvLyBEMSA9IHJ4X2luIEJEIworCWxzbGwgIzMsICVkMQkJCS8vIEJEIGlzIDgtYnl0ZXMgbG9uZworCWFkZGwgcnhfZmlyc3RfYmQoJWQwKSwgJWQxCS8vIEQxID0gY3VycmVudCByeF9pbiBCRCBhZGRyZXNzCisJbW92ZXcgKCVkMSksICVkMgkJLy8gRDIgPSBSWCBCRCBmbGFncworCWJ0c3RsICMxNSwgJWQyCisJYm5lIHJ4X3JldAkJCS8vIEJEIHN0aWxsIGVtcHR5CisKKwlidHN0bCAjMSwgJWQyCisJYm5lIHJ4X292ZXJydW4KKworCXRzdHcgcGFyaXR5X2J5dGVzKCVkMCkKKwlibmUgcnhfcGFyaXR5CisJYmNscmwgIzIsICVkMgkJCS8vIGRvIG5vdCB0ZXN0IGZvciBDUkMgZXJyb3JzCityeF9wYXJpdHk6CisJYW5kdyAjMHgwQ0JDLCAlZDIJCS8vIG1hc2sgc3RhdHVzIGJpdHMKKwljbXB3ICMweDBDMDAsICVkMgkJLy8gY29ycmVjdCBmcmFtZQorCWJuZSByeF9iYWRfZnJhbWUKKwljbHJsICVkMworCW1vdmV3IDIoJWQxKSwgJWQzCisJc3VidyBwYXJpdHlfYnl0ZXMoJWQwKSwgJWQzCS8vIEQzID0gcGFja2V0IGxlbmd0aAorCWNtcHcgI0hETENfTUFYX01SVSwgJWQzCisJYmd0IHJ4X2JhZF9mcmFtZQorCityeF9nb29kX2ZyYW1lOgorCW1vdmVsIHJ4X291dCwgJWQyCisJbXVsdWwgI0RFU0NfTEVOR1RILCAlZDIKKwlhZGRsIHJ4X2Rlc2NzX2FkZHIsICVkMgkJLy8gRDIgPSBSWCBkZXNjIGFkZHJlc3MKKwljbXBsICNQQUNLRVRfRU1QVFksICglZDIpCS8vIGRlc2Mgc3RhdAorCWJuZSByeF9vdmVycnVuCisKKwltb3ZlbCAlZDMsIDgoJWQyKQorCW1vdmVsIDQoJWQxKSwgJWEwCQkvLyBBMCA9IHNvdXJjZSBhZGRyZXNzCisJbW92ZWwgNCglZDIpLCAlYTEKKwl0c3RsICVhMQorCWJlcSByeF9pZ25vcmVfZGF0YQorCW1lbWNweV90b19wY2kgJWEwLCAlYTEsICVkMworcnhfaWdub3JlX2RhdGE6CisJbW92ZWwgcGFja2V0X2Z1bGwoJWQwKSwgKCVkMikJLy8gdXBkYXRlIGRlc2Mgc3RhdAorCisvLyB1cGRhdGUgRDYgYW5kIHJ4X291dAorCWJzZXRsICNET09SQkVMTF9GUk9NX0NBUkRfUlgsICVkNiAvLyBzaWduYWwgaG9zdCB0aGF0IFJYIGNvbXBsZXRlZAorCW1vdmVsIHJ4X291dCwgJWQyCisJYWRkbCAjMSwgJWQyCisJY21wbCAjUlhfUVVFVUVfTEVOR1RILCAlZDIKKwlibmUgcnhfMQorCWNscmwgJWQyCityeF8xOgltb3ZlbCAlZDIsIHJ4X291dAorCityeF9mcmVlX2JkOgorCWFuZHcgIzB4RjAwMCwgKCVkMSkJCS8vIGNsZWFyIENNIGFuZCBlcnJvciBiaXRzCisJYnNldGwgIzMxLCAoJWQxKQkJLy8gZnJlZSBCRAorLy8gdXBkYXRlIHJ4X2luCisJbW92ZWwgcnhfaW4oJWQwKSwgJWQxCisJYWRkbCAjMSwgJWQxCisJY21wbCAjUlhfQlVGRkVSUywgJWQxCisJYm5lIHJ4XzIKKwljbHJsICVkMQorcnhfMjoJbW92ZWwgJWQxLCByeF9pbiglZDApCisJYnJhIHJ4CisKK3J4X292ZXJydW46CisJbW92ZWwgY2hfc3RhdHVzX2FkZHIoJWQwKSwgJWQyCisJYWRkbCAjMSwgU1RBVFVTX1JYX09WRVJSVU5TKCVkMikKKwlicmEgcnhfZnJlZV9iZAorCityeF9iYWRfZnJhbWU6CisJbW92ZWwgY2hfc3RhdHVzX2FkZHIoJWQwKSwgJWQyCisJYWRkbCAjMSwgU1RBVFVTX1JYX0ZSQU1FX0VSUk9SUyglZDIpCisJYnJhIHJ4X2ZyZWVfYmQKKworcnhfcmV0OiBydHMKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHBhY2tldCB0cmFuc21pdHRlZCAqKioqKioqKioqKioqKioqKioqKi8KKworLy8gU2VydmljZSB0cmFuc21pdCBidWZmZXJzCQkvLyBEMCA9IDQgKiBwb3J0LCBENiA9IGRvb3JiZWxsIHRvIGhvc3QKK3R4X2VuZDoJdHN0bCB0eF9jb3VudCglZDApCisJYmVxIHR4X2VuZF9yZXQJCQkvLyBUWCBidWZmZXJzIGFscmVhZHkgZW1wdHkKKworCW1vdmVsIHR4X2luKCVkMCksICVkMQorCW1vdmVsICVkMSwgJWQyCQkJLy8gRDEgPSBEMiA9IHR4X2luIEJEIyA9IGRlc2MjCisJbHNsbCAjMywgJWQxCQkJLy8gQkQgaXMgOC1ieXRlcyBsb25nCisJYWRkbCB0eF9maXJzdF9iZCglZDApLCAlZDEJLy8gRDEgPSBjdXJyZW50IHR4X2luIEJEIGFkZHJlc3MKKwltb3ZldyAoJWQxKSwgJWQzCQkvLyBEMyA9IFRYIEJEIGZsYWdzCisJYnRzdGwgIzE1LCAlZDMKKwlibmUgdHhfZW5kX3JldAkJCS8vIEJEIHN0aWxsIGJlaW5nIHRyYW5zbWl0dGVkCisKKy8vIHVwZGF0ZSBENiwgdHhfaW4gYW5kIHR4X2NvdW50CisJb3JsIGJlbGxfdHgoJWQwKSwgJWQ2CQkvLyBzaWduYWwgaG9zdCB0aGF0IFRYIGRlc2MgZnJlZWQKKwlzdWJsICMxLCB0eF9jb3VudCglZDApCisJbW92ZWwgdHhfaW4oJWQwKSwgJWQxCisJYWRkbCAjMSwgJWQxCisJY21wbCAjVFhfQlVGRkVSUywgJWQxCisJYm5lIHR4X2VuZF8xCisJY2xybCAlZDEKK3R4X2VuZF8xOgorCW1vdmVsICVkMSwgdHhfaW4oJWQwKQorCisvLyBmcmVlIGhvc3QncyBkZXNjcmlwdG9yCisJbXVsdWwgI0RFU0NfTEVOR1RILCAlZDIJCS8vIEQyID0gVFggZGVzYyBvZmZzZXQKKwlhZGRsIGNoX3N0YXR1c19hZGRyKCVkMCksICVkMgorCWFkZGwgI1NUQVRVU19UWF9ERVNDUywgJWQyCS8vIEQyID0gVFggZGVzYyBhZGRyZXNzCisJYnRzdGwgIzEsICVkMworCWJuZSB0eF9lbmRfdW5kZXJydW4KKwltb3ZlbCAjUEFDS0VUX1NFTlQsICglZDIpCisJYnJhIHR4X2VuZAorCit0eF9lbmRfdW5kZXJydW46CisJbW92ZWwgI1BBQ0tFVF9VTkRFUlJVTiwgKCVkMikKKwlicmEgdHhfZW5kCisKK3R4X2VuZF9yZXQ6IHJ0cworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUExYIFBDSTkwNjAgRE1BIG1lbWNweSAqKioqKioqKioqKioqKioqLworCisjaWYgUVVJQ0NfTUVNQ1BZX1VTRVNfUExYCisvLyBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkCittZW1jcHlfZnJvbV9wY2lfcnVuOgorCW1vdmVsICVkMCwgLSglc3ApCisJbW92ZXcgJXNyLCAtKCVzcCkKK21lbWNweV8xOgorCW1vdmVsIFBMWF9ETUFfQ01EX1NUUywgJWQwCS8vIGRvIG5vdCBidHN0IFBMWCByZWdpc3RlciBkaXJlY3RseQorCWJ0c3RsICM0LCAlZDAJCQkvLyB0cmFuc2ZlciBkb25lPworCWJuZSBtZW1jcHlfZW5kCisJc3RvcCAjMHgyMjAwCQkJLy8gZW5hYmxlIFBDSTkwNjAgaW50ZXJydXB0cworCW1vdmV3ICMweDI3MDAsICVzcgkJLy8gZGlzYWJsZSBpbnRlcnJ1cHRzIGFnYWluCisJYnJhIG1lbWNweV8xCisKK21lbWNweV90b19wY2lfcnVuOgorCW1vdmVsICVkMCwgLSglc3ApCisJbW92ZXcgJXNyLCAtKCVzcCkKK21lbWNweV8yOgorCW1vdmVsIFBMWF9ETUFfQ01EX1NUUywgJWQwCS8vIGRvIG5vdCBidHN0IFBMWCByZWdpc3RlciBkaXJlY3RseQorCWJ0c3RsICMxMiwgJWQwCQkJLy8gdHJhbnNmZXIgZG9uZT8KKwlibmUgbWVtY3B5X2VuZAorCXN0b3AgIzB4MjIwMAkJCS8vIGVuYWJsZSBQQ0k5MDYwIGludGVycnVwdHMKKwltb3ZldyAjMHgyNzAwLCAlc3IJCS8vIGRpc2FibGUgaW50ZXJydXB0cyBhZ2FpbgorCWJyYSBtZW1jcHlfMgorCittZW1jcHlfZW5kOgorCW1vdmV3ICglc3ApKywgJXNyCisJbW92ZWwgKCVzcCkrLCAlZDAKKwlydHMKKyNlbmRpZgorCisKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQTFggUENJOTA2MCBpbnRlcnJ1cHQgKioqKioqKioqKioqKioqKiovCisKK3BjaTkwNjBfaW50ZXJydXB0OgorCW1vdmVsICVkMCwgLSglc3ApCisKKwltb3ZlbCBQTFhfRE9PUkJFTExfVE9fQ0FSRCwgJWQwCisJbW92ZWwgJWQwLCBQTFhfRE9PUkJFTExfVE9fQ0FSRAkvLyBjb25maXJtIGFsbCByZXF1ZXN0cworCW9ybCAlZDAsIGNoYW5uZWxfc3RhdHMKKworCW1vdmVsICMweDA5MDksIFBMWF9ETUFfQ01EX1NUUwkvLyBjbGVhciBETUEgY2ggIzAgYW5kICMxIGludGVycnVwdHMKKworCW1vdmVsICglc3ApKywgJWQwCisJcnRlCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0NDIGludGVycnVwdHMgKioqKioqKioqKioqKioqKioqKioqKioqLworCitwb3J0X2ludGVycnVwdF8xOgorCW9ybCAjMCwgU0NDMV9SRUdTICsgU0NDX1NDQ0U7IC8vIGNvbmZpcm0gU0NDIGV2ZW50cworCW9ybCAjMSA8PCBUQVNLX1NDQ18wLCBjaGFubmVsX3N0YXRzCisJbW92ZWwgIzB4NDAwMDAwMDAsIENJU1IKKwlydGUKKworcG9ydF9pbnRlcnJ1cHRfMjoKKwlvcmwgIzAsIFNDQzJfUkVHUyArIFNDQ19TQ0NFOyAvLyBjb25maXJtIFNDQyBldmVudHMKKwlvcmwgIzEgPDwgVEFTS19TQ0NfMSwgY2hhbm5lbF9zdGF0cworCW1vdmVsICMweDIwMDAwMDAwLCBDSVNSCisJcnRlCisKK3BvcnRfaW50ZXJydXB0XzM6CisJb3JsICMwLCBTQ0MzX1JFR1MgKyBTQ0NfU0NDRTsgLy8gY29uZmlybSBTQ0MgZXZlbnRzCisJb3JsICMxIDw8IFRBU0tfU0NDXzIsIGNoYW5uZWxfc3RhdHMKKwltb3ZlbCAjMHgxMDAwMDAwMCwgQ0lTUgorCXJ0ZQorCitwb3J0X2ludGVycnVwdF80OgorCW9ybCAjMCwgU0NDNF9SRUdTICsgU0NDX1NDQ0U7IC8vIGNvbmZpcm0gU0NDIGV2ZW50cworCW9ybCAjMSA8PCBUQVNLX1NDQ18zLCBjaGFubmVsX3N0YXRzCisJbW92ZWwgIzB4MDgwMDAwMDAsIENJU1IKKwlydGUKKworZXJyb3JfaW50ZXJydXB0OgorCXJ0ZQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogY2FibGUgYW5kIFBNIHJvdXRpbmUgKioqKioqKioqKioqKioqKioqLworLy8gbW9kaWZpZWQgcmVnaXN0ZXJzOiBub25lCitjaGVja19jc3I6CisJbW92ZWwgJWQwLCAtKCVzcCkKKwltb3ZlbCAlZDEsIC0oJXNwKQorCW1vdmVsICVkMiwgLSglc3ApCisJbW92ZWwgJWEwLCAtKCVzcCkKKwltb3ZlbCAlYTEsIC0oJXNwKQorCisJY2xybCAlZDAJCQkvLyBEMCA9IDQgKiBwb3J0CisJbW92ZWwgI0NTUkEsICVhMAkJLy8gQTAgPSBDU1IgYWRkcmVzcworCitjaGVja19jc3JfbG9vcDoKKwltb3ZldyAoJWEwKSwgJWQxCQkvLyBEMSA9IENTUiBpbnB1dCBiaXRzCisJYW5kbCAjMHhFNywgJWQxCQkJLy8gUE0gYW5kIGNhYmxlIHNlbnNlIGJpdHMgKG5vIERDRSBiaXQpCisJY21wdyAjU1RBVFVTX0NBQkxFX1YzNSAqICgxICsgMSA8PCBTVEFUVVNfQ0FCTEVfUE1fU0hJRlQpLCAlZDEKKwlibmUgY2hlY2tfY3NyXzEKKwltb3ZldyAjMHgwRTA4LCAlZDEKKwlicmEgY2hlY2tfY3NyX3ZhbGlkCisKK2NoZWNrX2Nzcl8xOgorCWNtcHcgI1NUQVRVU19DQUJMRV9YMjEgKiAoMSArIDEgPDwgU1RBVFVTX0NBQkxFX1BNX1NISUZUKSwgJWQxCisJYm5lIGNoZWNrX2Nzcl8yCisJbW92ZXcgIzB4MDQwOCwgJWQxCisJYnJhIGNoZWNrX2Nzcl92YWxpZAorCitjaGVja19jc3JfMjoKKwljbXB3ICNTVEFUVVNfQ0FCTEVfVjI0ICogKDEgKyAxIDw8IFNUQVRVU19DQUJMRV9QTV9TSElGVCksICVkMQorCWJuZSBjaGVja19jc3JfMworCW1vdmV3ICMweDAyMDgsICVkMQorCWJyYSBjaGVja19jc3JfdmFsaWQKKworY2hlY2tfY3NyXzM6CisJY21wdyAjU1RBVFVTX0NBQkxFX0VJQTUzMCAqICgxICsgMSA8PCBTVEFUVVNfQ0FCTEVfUE1fU0hJRlQpLCAlZDEKKwlibmUgY2hlY2tfY3NyX2Rpc2FibGUKKwltb3ZldyAjMHgwRDA4LCAlZDEKKwlicmEgY2hlY2tfY3NyX3ZhbGlkCisKK2NoZWNrX2Nzcl9kaXNhYmxlOgorCW1vdmV3ICMweDAwMDgsICVkMQkJLy8gRDEgPSBkaXNhYmxlIGV2ZXJ5dGhpbmcKKwltb3ZldyAjMHg4MEU3LCAlZDIJCS8vIEQyID0gaW5wdXQgbWFzazogaWdub3JlIERTUgorCWJyYSBjaGVja19jc3Jfd3JpdGUKKworY2hlY2tfY3NyX3ZhbGlkOgkJCS8vIEQxID0gbW9kZSBhbmQgSVJRIGJpdHMKKwltb3ZldyBjc3Jfb3V0cHV0KCVkMCksICVkMgorCWFuZHcgIzB4MzAwMCwgJWQyCQkvLyBEMiA9IHJlcXVlc3RlZCBMTCBhbmQgRFRSIGJpdHMKKwlvcncgJWQyLCAlZDEJCQkvLyBEMSA9IGFsbCByZXF1ZXN0ZWQgb3V0cHV0IGJpdHMKKwltb3ZldyAjMHg4MEZGLCAlZDIJCS8vIEQyID0gaW5wdXQgbWFzazogaW5jbHVkZSBEU1IKKworY2hlY2tfY3NyX3dyaXRlOgorCWNtcHcgb2xkX2Nzcl9vdXRwdXQoJWQwKSwgJWQxCisJYmVxIGNoZWNrX2Nzcl9pbnB1dAorCW1vdmV3ICVkMSwgb2xkX2Nzcl9vdXRwdXQoJWQwKQorCW1vdmV3ICVkMSwgKCVhMCkJCS8vIFdyaXRlIENTUiBvdXRwdXQgYml0cworCitjaGVja19jc3JfaW5wdXQ6CisJbW92ZXcgKFBDREFUKSwgJWQxCisJYW5kdyBkY2RfbWFzayglZDApLCAlZDEKKwliZXEgY2hlY2tfY3NyX2RjZF9vbgkJLy8gRENEIGFuZCBDVFMgc2lnbmFscyBhcmUgbmVnYXRlZAorCW1vdmV3ICglYTApLCAlZDEJCS8vIEQxID0gQ1NSIGlucHV0IGJpdHMKKwlhbmR3ICN+U1RBVFVTX0NBQkxFX0RDRCwgJWQxCS8vIERDRCBvZmYKKwlicmEgY2hlY2tfY3NyX3ByZXZpb3VzCisKK2NoZWNrX2Nzcl9kY2Rfb246CisJbW92ZXcgKCVhMCksICVkMQkJLy8gRDEgPSBDU1IgaW5wdXQgYml0cworCW9ydyAjU1RBVFVTX0NBQkxFX0RDRCwgJWQxCS8vIERDRCBvbgorY2hlY2tfY3NyX3ByZXZpb3VzOgorCWFuZHcgJWQyLCAlZDEJCQkvLyBpbnB1dCBtYXNrCisJbW92ZWwgY2hfc3RhdHVzX2FkZHIoJWQwKSwgJWExCisJY21wbCBTVEFUVVNfQ0FCTEUoJWExKSwgJWQxCS8vIGNoZWNrIGZvciBjaGFuZ2UKKwliZXEgY2hlY2tfY3NyX25leHQKKwltb3ZlbCAlZDEsIFNUQVRVU19DQUJMRSglYTEpCS8vIHVwZGF0ZSBzdGF0dXMKKwltb3ZlbCBiZWxsX2NhYmxlKCVkMCksIFBMWF9ET09SQkVMTF9GUk9NX0NBUkQJLy8gc2lnbmFsIHRoZSBob3N0CisKK2NoZWNrX2Nzcl9uZXh0OgorCWFkZGwgIzIsICVhMAkJCS8vIG5leHQgQ1NSIHJlZ2lzdGVyCisJYWRkbCAjNCwgJWQwCQkJLy8gRDAgPSA0ICogbmV4dCBwb3J0CisJY21wbCAjNCAqIDQsICVkMAorCWJuZSBjaGVja19jc3JfbG9vcAorCisJbW92ZWwgKCVzcCkrLCAlYTEKKwltb3ZlbCAoJXNwKSssICVhMAorCW1vdmVsICglc3ApKywgJWQyCisJbW92ZWwgKCVzcCkrLCAlZDEKKwltb3ZlbCAoJXNwKSssICVkMAorCXJ0cworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdGltZXIgaW50ZXJydXB0ICoqKioqKioqKioqKioqKioqKioqKioqLworCit0aW1lcl9pbnRlcnJ1cHQ6CisJYnNyIGNoZWNrX2NzcgorCXJ0ZQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUkFNIHNpemluZyBhbmQgdGVzdCAqKioqKioqKioqKioqKioqKioqLworI2lmIERFVEVDVF9SQU0KK3JhbV90ZXN0OgorCW1vdmVsICMweDEyMzQ1Njc4LCAlZDEJCS8vIEQxID0gdGVzdCB2YWx1ZQorCW1vdmVsICVkMSwgKDEyOCAqIDEwMjQgLSA0KQorCW1vdmVsICMxMjggKiAxMDI0LCAlZDAJCS8vIEQwID0gUkFNIHNpemUgdGVzdGVkCityYW1fdGVzdF9zaXplOgorCWNtcGwgI01BWF9SQU1fU0laRSwgJWQwCisJYmVxIHJhbV90ZXN0X3NpemVfZm91bmQKKwltb3ZlbCAlZDAsICVhMAorCWFkZGwgIzEyOCAqIDEwMjQgLSA0LCAlYTAKKwljbXBsICglYTApLCAlZDEKKwliZXEgcmFtX3Rlc3Rfc2l6ZV9jaGVjaworcmFtX3Rlc3RfbmV4dF9zaXplOgorCWxzbGwgIzEsICVkMAorCWJyYSByYW1fdGVzdF9zaXplCisKK3JhbV90ZXN0X3NpemVfY2hlY2s6CisJZW9ybCAjMHhGRkZGRkZGRiwgJWQxCisJbW92ZWwgJWQxLCAoMTI4ICogMTAyNCAtIDQpCisJY21wbCAoJWEwKSwgJWQxCisJYm5lIHJhbV90ZXN0X25leHRfc2l6ZQorCityYW1fdGVzdF9zaXplX2ZvdW5kOgkJCS8vIEQwID0gUkFNIHNpemUKKwltb3ZlbCAlZDAsICVhMAkJCS8vIEEwID0gZmlsbCBwdHIKKwlzdWJsICNmaXJtd2FyZV9lbmQgKyA0LCAlZDAKKwlsc3JsICMyLCAlZDAKKwltb3ZlbCAlZDAsICVkMQkJCS8vIEQxID0gREJmIGNvdW50ZXIKK3JhbV90ZXN0X2ZpbGw6CisJbW92ZWwgJWEwLCAtKCVhMCkKKwlkYmZ3ICVkMSwgcmFtX3Rlc3RfZmlsbAorCXN1YmwgIzB4MTAwMDAsICVkMQorCWNtcGwgIzB4RkZGRkZGRkYsICVkMQorCWJuZSByYW1fdGVzdF9maWxsCisKK3JhbV90ZXN0X2xvb3A6CQkJCS8vIEQwID0gREJmIGNvdW50ZXIKKwljbXBsICglYTApKywgJWEwCisJZGJuZXcgJWQwLCByYW1fdGVzdF9sb29wCisJYm5lIHJhbV90ZXN0X2ZvdW5kX2JhZAorCXN1YmwgIzB4MTAwMDAsICVkMAorCWNtcGwgIzB4RkZGRkZGRkYsICVkMAorCWJuZSByYW1fdGVzdF9sb29wCisJYnJhIHJhbV90ZXN0X2FsbF9vaworCityYW1fdGVzdF9mb3VuZF9iYWQ6CisJc3VibCAjNCwgJWEwCityYW1fdGVzdF9hbGxfb2s6CisJbW92ZWwgJWEwLCBQTFhfTUFJTEJPWF81CisJcnRzCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGNvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc2NjX3JlZ19hZGRyOgorCS5sb25nIFNDQzFfUkVHUywgU0NDMl9SRUdTLCBTQ0MzX1JFR1MsIFNDQzRfUkVHUworc2NjX2Jhc2VfYWRkcjoKKwkubG9uZyBTQ0MxX0JBU0UsIFNDQzJfQkFTRSwgU0NDM19CQVNFLCBTQ0M0X0JBU0UKKwordHhfZmlyc3RfYmQ6CisJLmxvbmcgRFBSQkFTRQorCS5sb25nIERQUkJBU0UgKyAoVFhfQlVGRkVSUyArIFJYX0JVRkZFUlMpICogOAorCS5sb25nIERQUkJBU0UgKyAoVFhfQlVGRkVSUyArIFJYX0JVRkZFUlMpICogOCAqIDIKKwkubG9uZyBEUFJCQVNFICsgKFRYX0JVRkZFUlMgKyBSWF9CVUZGRVJTKSAqIDggKiAzCisKK3J4X2ZpcnN0X2JkOgorCS5sb25nIERQUkJBU0UgKyBUWF9CVUZGRVJTICogOAorCS5sb25nIERQUkJBU0UgKyBUWF9CVUZGRVJTICogOCArIChUWF9CVUZGRVJTICsgUlhfQlVGRkVSUykgKiA4CisJLmxvbmcgRFBSQkFTRSArIFRYX0JVRkZFUlMgKiA4ICsgKFRYX0JVRkZFUlMgKyBSWF9CVUZGRVJTKSAqIDggKiAyCisJLmxvbmcgRFBSQkFTRSArIFRYX0JVRkZFUlMgKiA4ICsgKFRYX0JVRkZFUlMgKyBSWF9CVUZGRVJTKSAqIDggKiAzCisKK2ZpcnN0X2J1ZmZlcjoKKwkubG9uZyBCVUZGRVJTX0FERFIKKwkubG9uZyBCVUZGRVJTX0FERFIgKyAoVFhfQlVGRkVSUyArIFJYX0JVRkZFUlMpICogQlVGRkVSX0xFTkdUSAorCS5sb25nIEJVRkZFUlNfQUREUiArIChUWF9CVUZGRVJTICsgUlhfQlVGRkVSUykgKiBCVUZGRVJfTEVOR1RIICogMgorCS5sb25nIEJVRkZFUlNfQUREUiArIChUWF9CVUZGRVJTICsgUlhfQlVGRkVSUykgKiBCVUZGRVJfTEVOR1RIICogMworCitiZWxsX3R4OgorCS5sb25nIDEgPDwgRE9PUkJFTExfRlJPTV9DQVJEX1RYXzAsIDEgPDwgRE9PUkJFTExfRlJPTV9DQVJEX1RYXzEKKwkubG9uZyAxIDw8IERPT1JCRUxMX0ZST01fQ0FSRF9UWF8yLCAxIDw8IERPT1JCRUxMX0ZST01fQ0FSRF9UWF8zCisKK2JlbGxfY2FibGU6CisJLmxvbmcgMSA8PCBET09SQkVMTF9GUk9NX0NBUkRfQ0FCTEVfMCwgMSA8PCBET09SQkVMTF9GUk9NX0NBUkRfQ0FCTEVfMQorCS5sb25nIDEgPDwgRE9PUkJFTExfRlJPTV9DQVJEX0NBQkxFXzIsIDEgPDwgRE9PUkJFTExfRlJPTV9DQVJEX0NBQkxFXzMKKworcGFja2V0X2Z1bGw6CisJLmxvbmcgUEFDS0VUX0ZVTEwsIFBBQ0tFVF9GVUxMICsgMSwgUEFDS0VUX0ZVTEwgKyAyLCBQQUNLRVRfRlVMTCArIDMKKworY2xvY2tpbmdfZXh0OgorCS5sb25nIDB4MDAwMDAwMkMsIDB4MDAwMDNFMDAsIDB4MDAyQzAwMDAsIDB4M0UwMDAwMDAKK2Nsb2NraW5nX3R4ZnJvbXJ4OgorCS5sb25nIDB4MDAwMDAwMkQsIDB4MDAwMDNGMDAsIDB4MDAyRDAwMDAsIDB4M0YwMDAwMDAKK2Nsb2NraW5nX21hc2s6CisJLmxvbmcgMHgwMDAwMDBGRiwgMHgwMDAwRkYwMCwgMHgwMEZGMDAwMCwgMHhGRjAwMDAwMAorZGNkX21hc2s6CisJLndvcmQgMHgwMjAsIDAsIDB4MDgwLCAwLCAweDIwMCwgMCwgMHg4MDAKKworCS5hc2NpaSAid2FuWEwgZmlybXdhcmVcbiIKKwkuYXNjaXogIkNvcHlyaWdodCAoQykgMjAwMyBLcnp5c3p0b2YgSGFsYXNhIDxraGNAcG0ud2F3LnBsPlxuIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJCS5hbGlnbiA0CitjaGFubmVsX3N0YXRzOgkubG9uZyAwCisKK3R4X2luOgkJLmxvbmcgMCwgMCwgMCwgMAkvLyB0cmFuc21pdHRlZAordHhfb3V0OgkJLmxvbmcgMCwgMCwgMCwgMAkvLyByZWNlaXZlZCBmcm9tIGhvc3QgZm9yIHRyYW5zbWlzc2lvbgordHhfY291bnQ6CS5sb25nIDAsIDAsIDAsIDAJLy8gY3VycmVudGx5IGluIHRyYW5zbWl0IHF1ZXVlCisKK3J4X2luOgkJLmxvbmcgMCwgMCwgMCwgMAkvLyByZWNlaXZlZCBmcm9tIHBvcnQKK3J4X291dDoJCS5sb25nIDAJCQkvLyB0cmFuc21pdHRlZCB0byBob3N0CitwYXJpdHlfYnl0ZXM6CS53b3JkIDAsIDAsIDAsIDAsIDAsIDAsIDAgLy8gb25seSA0IHdvcmRzIGFyZSB1c2VkCisKK2Nzcl9vdXRwdXQ6CS53b3JkIDAKK29sZF9jc3Jfb3V0cHV0Ogkud29yZCAwLCAwLCAwLCAwLCAwLCAwLCAwCisJCS5hbGlnbiA0CitmaXJtd2FyZV9lbmQ6CQkJCS8vIG11c3QgYmUgZHdvcmQtYWxpZ25lZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3dhbnhsZncuaW5jX3NoaXBwZWQgYi9kcml2ZXJzL25ldC93YW4vd2FueGxmdy5pbmNfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2RhNjg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3dhbnhsZncuaW5jX3NoaXBwZWQKQEAgLTAsMCArMSwxNTggQEAKK3N0YXRpYyB1OCBmaXJtd2FyZVtdPXsKKzB4NjAsMHgwMCwweDAwLDB4MTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNiwweEI5LDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMCwweDE0LDB4NDIsMHg4MCwweDRBLDB4QjAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDEwLDB4MDQsMHg2NywweDAwLDB4MDAsMHgwRSwKKzB4MDYsMHhCMCwweDQwLDB4MDAsMHgwMCwweDAwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxMCwweDA0LDB4NTgsMHg4MCwweDBDLDB4ODAsCisweDAwLDB4MDAsMHgwMCwweDEwLDB4NjYsMHgwMCwweEZGLDB4REUsMHgyMSwweEZDLDB4MDAsMHgwMCwweDE2LDB4QkMsMHgwMCwweDZDLAorMHgyMSwweEZDLDB4MDAsMHgwMCwweDE3LDB4NUUsMHgwMSwweDAwLDB4MjEsMHhGQywweDAwLDB4MDAsMHgxNiwweERFLDB4MDEsMHg3OCwKKzB4MjEsMHhGQywweDAwLDB4MDAsMHgxNiwweEZFLDB4MDEsMHg3NCwweDIxLDB4RkMsMHgwMCwweDAwLDB4MTcsMHgxRSwweDAxLDB4NzAsCisweDIxLDB4RkMsMHgwMCwweDAwLDB4MTcsMHgzRSwweDAxLDB4NkMsMHgyMSwweEZDLDB4MDAsMHgwMCwweDE4LDB4NEMsMHgwMiwweDAwLAorMHgyMywweEZDLDB4NzgsMHgwMCwweDAwLDB4MDAsMHhGRiwweEZDLDB4MTUsMHg0OCwweDMzLDB4RkMsMHgwNCwweDgwLDB4RkYsMHhGQywKKzB4MTAsMHgyNiwweDMzLDB4RkMsMHgwMSwweDEwLDB4RkYsMHhGQywweDEwLDB4MkEsMHgyMywweEZDLDB4MDAsMHhENCwweDlGLDB4NDAsCisweEZGLDB4RkMsMHgxNSwweDQwLDB4MjMsMHhGQywweDAwLDB4MDAsMHgwNSwweDQzLDB4RkYsMHhGOSwweDAxLDB4MDAsMHgyMywweEZDLAorMHgwMCwweDAwLDB4MDUsMHg0MywweEZGLDB4RjksMHgwMSwweDE0LDB4MjMsMHhGQywweDAwLDB4MDAsMHgwMCwweDAwLDB4RkYsMHhGOSwKKzB4MDEsMHgxMCwweDIzLDB4RkMsMHgwMCwweDAwLDB4MDAsMHgwOCwweEZGLDB4RjksMHgwMSwweDI0LDB4MjMsMHhGQywweDAwLDB4MDAsCisweDAxLDB4MDEsMHhGRiwweEY5LDB4MDEsMHgyOCwweDAwLDB4QjksMHgwMCwweDBGLDB4MDMsMHgwMCwweEZGLDB4RjksMHgwMCwweEU4LAorMHgyMywweEZDLDB4MDAsMHgwMCwweDAwLDB4MDEsMHhGRiwweEY5LDB4MDAsMHhENCwweDYxLDB4MDAsMHgwNiwweDc0LDB4MzMsMHhGQywKKzB4RkYsMHhGRiwweEZGLDB4RkMsMHgxNSwweDUyLDB4NDIsMHg3OSwweEZGLDB4RkMsMHgxNSwweDUwLDB4NDIsMHg3OSwweEZGLDB4RkMsCisweDE1LDB4NjQsMHgyRSwweDNBLDB4MDgsMHg1MCwweDQyLDB4QjksMHgwMCwweDAwLDB4MTksMHg1NCwweDRBLDB4ODcsMHg2NiwweDAwLAorMHgwMCwweDBFLDB4NEUsMHg3MiwweDIyLDB4MDAsMHg0NiwweEZDLDB4MjcsMHgwMCwweDYwLDB4MDAsMHhGRiwweEU2LDB4NDIsMHg4MCwKKzB4NDIsMHg4NiwweDA4LDB4MDcsMHgwMCwweDA0LDB4NjcsMHgwMCwweDAwLDB4MEEsMHgwOCwweDg3LDB4MDAsMHgwMCwweDYxLDB4MDAsCisweDAyLDB4QTAsMHgwOCwweDA3LDB4MDAsMHgwMCwweDY3LDB4MDAsMHgwMCwweDA2LDB4NjEsMHgwMCwweDAwLDB4MzYsMHgwOCwweDA3LAorMHgwMCwweDA4LDB4NjcsMHgwMCwweDAwLDB4MDYsMHg2MSwweDAwLDB4MDIsMHhCOCwweDA4LDB4MDcsMHgwMCwweDBDLDB4NjcsMHgwMCwKKzB4MDAsMHgwQSwweDYxLDB4MDAsMHgwNCwweDk0LDB4NjEsMHgwMCwweDAzLDB4NjAsMHhFMiwweDhGLDB4NTgsMHg4MCwweDBDLDB4ODAsCisweDAwLDB4MDAsMHgwMCwweDEwLDB4NjYsMHgwMCwweEZGLDB4QkMsMHgyMywweEM2LDB4RkYsMHhGOSwweDAwLDB4RTQsMHg2MCwweDAwLAorMHhGRiwweDkyLDB4MjAsMHg3MCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTAsMHgwNCwweDRBLDB4QTgsMHgwMCwweDAwLDB4NjYsMHgwMCwKKzB4MDIsMHg0RSwweDIxLDB4N0MsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHg0MiwweEIwLDB4MDksMHhCMCwweDAwLDB4MDAsCisweDE5LDB4NTgsMHg0MiwweEIwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweDY4LDB4NDIsMHhCMCwweDA5LDB4QjAsMHgwMCwweDAwLAorMHgxOSwweDc4LDB4NDIsMHhCMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHg4OCwweDIyLDB4MzksMHhGRiwweEZDLDB4MTYsMHhFQywKKzB4QzIsMHhCMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTgsMHhGMiwweDBDLDB4QTgsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MTgsCisweDY2LDB4MDAsMHgwMCwweDBFLDB4ODIsMHhCMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTgsMHhFMiwweDYwLDB4MDAsMHgwMCwweDBBLAorMHg4MiwweEIwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOCwweEQyLDB4MjMsMHhDMSwweEZGLDB4RkMsMHgxNiwweEVDLDB4MDAsMHg3MCwKKzB4MTAsMHgwMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHhBQSwweDYxLDB4MDAsMHgwNSwweDc2LDB4MjIsMHgzMCwweDA5LDB4QjAsCisweDAwLDB4MDAsMHgxOCwweDkyLDB4MjIsMHg3MCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTgsMHg3MiwweDc0LDB4MDgsMHgyNiwweDNDLAorMHgxOCwweDAwLDB4MDAsMHgwMCwweDBDLDB4QTgsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MTAsMHg2NywweDAwLDB4MDAsMHgwNiwKKzB4MDgsMHhDMywweDAwLDB4MUEsMHgyMiwweEMzLDB4MjIsMHhDMSwweDA2LDB4ODEsMHgwMCwweDAwLDB4MDUsMHhGQywweDUxLDB4Q0EsCisweEZGLDB4RjQsMHgwOCwweEMzLDB4MDAsMHgxRCwweDIyLDB4QzMsMHgyMiwweEMxLDB4NzQsMHgxQywweDIyLDB4RkMsMHg5MCwweDAwLAorMHgwMCwweDAwLDB4MjIsMHhDMSwweDA2LDB4ODEsMHgwMCwweDAwLDB4MDUsMHhGQywweDUxLDB4Q0EsMHhGRiwweEYwLDB4MjIsMHhGQywKKzB4QjAsMHgwMCwweDAwLDB4MDAsMHgyMiwweEMxLDB4MjIsMHg3MCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTgsMHg2MiwweDI0LDB4NzAsCisweDA5LDB4QjAsMHgwMCwweDAwLDB4MTgsMHg1MiwweDI1LDB4N0MsMHgwMCwweDAwLDB4RkYsMHhGRiwweDAwLDB4MTAsMHgyNSwweDdDLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHgyMiwweDMwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOCwweDcyLDB4MzMsMHg0MSwKKzB4MDAsMHgwMiwweDA2LDB4ODEsMHgwMCwweDAwLDB4MDAsMHg1MCwweDMzLDB4NDEsMHgwMCwweDAwLDB4MTMsMHg3QywweDAwLDB4MDgsCisweDAwLDB4MDQsMHgxMywweDdDLDB4MDAsMHgwOCwweDAwLDB4MDUsMHgwQywweEE4LDB4MDAsMHgwMCwweDAwLDB4MDUsMHgwMCwweDEwLAorMHg2NiwweDAwLDB4MDAsMHgyQSwweDQyLDB4NkEsMHgwMCwweDA4LDB4MjMsMHg3QywweDAwLDB4MDAsMHhGMCwweEI4LDB4MDAsMHgzNCwKKzB4MjMsMHg3QywweDAwLDB4MDAsMHhGRiwweEZGLDB4MDAsMHgzOCwweDMzLDB4N0MsMHgwNSwweEZBLDB4MDAsMHg0NiwweDMxLDB4QkMsCisweDAwLDB4MDIsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4OUMsMHg2MCwweDAwLDB4MDAsMHhCQywweDBDLDB4QTgsMHgwMCwweDAwLAorMHgwMCwweDA3LDB4MDAsMHgxMCwweDY2LDB4MDAsMHgwMCwweDJDLDB4MzUsMHg3QywweDA4LDB4MDAsMHgwMCwweDA4LDB4MjMsMHg3QywKKzB4REUsMHhCQiwweDIwLDB4RTMsMHgwMCwweDM0LDB4MjMsMHg3QywweEZGLDB4RkYsMHhGRiwweEZGLDB4MDAsMHgzOCwweDMzLDB4N0MsCisweDA1LDB4RkMsMHgwMCwweDQ2LDB4MzEsMHhCQywweDAwLDB4MDQsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4OUMsMHg2MCwweDAwLAorMHgwMCwweDg2LDB4MEMsMHhBOCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MDAsMHgxMCwweDY2LDB4MDAsMHgwMCwweDI2LDB4NDIsMHg2QSwKKzB4MDAsMHgwOCwweDIzLDB4N0MsMHgwMCwweDAwLDB4RjAsMHhCOCwweDAwLDB4MzQsMHg0MiwweEE5LDB4MDAsMHgzOCwweDMzLDB4N0MsCisweDA1LDB4RkEsMHgwMCwweDQ2LDB4MzEsMHhCQywweDAwLDB4MDIsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4OUMsMHg2MCwweDAwLAorMHgwMCwweDU2LDB4MEMsMHhBOCwweDAwLDB4MDAsMHgwMCwweDA2LDB4MDAsMHgxMCwweDY2LDB4MDAsMHgwMCwweDI4LDB4MzUsMHg3QywKKzB4MDgsMHgwMCwweDAwLDB4MDgsMHgyMywweDdDLDB4REUsMHhCQiwweDIwLDB4RTMsMHgwMCwweDM0LDB4NDIsMHhBOSwweDAwLDB4MzgsCisweDMzLDB4N0MsMHgwNSwweEZDLDB4MDAsMHg0NiwweDMxLDB4QkMsMHgwMCwweDA0LDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweDlDLAorMHg2MCwweDAwLDB4MDAsMHgyNCwweDQyLDB4NkEsMHgwMCwweDA4LDB4MjMsMHg3QywweDAwLDB4MDAsMHhGMCwweEI4LDB4MDAsMHgzNCwKKzB4MjMsMHg3QywweDAwLDB4MDAsMHhGRiwweEZGLDB4MDAsMHgzOCwweDMzLDB4N0MsMHgwNSwweEY4LDB4MDAsMHg0NiwweDQyLDB4NzAsCisweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHg5QywweDI1LDB4N0MsMHgwMCwweDAwLDB4MDAsMHgwMywweDAwLDB4MDQsMHgwQywweEE4LAorMHgwMCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MTQsMHg2NiwweDAwLDB4MDAsMHgwRSwweDI1LDB4N0MsMHgxMCwweDA0LDB4MDksMHgwMCwKKzB4MDAsMHgwMCwweDYwLDB4MDAsMHgwMCwweDBBLDB4MjUsMHg3QywweDEwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMzLDB4N0MsCisweDA1LDB4RkMsMHgwMCwweDA2LDB4MjIsMHgwMCwweEU5LDB4ODksMHgwMCwweDgxLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgzMywweEMxLAorMHhGRiwweEZDLDB4MTUsMHhDMCwweDA4LDB4MzksMHgwMCwweDAwLDB4RkYsMHhGQywweDE1LDB4QzAsMHg2NiwweDAwLDB4RkYsMHhGNiwKKzB4MzUsMHg3QywweDAwLDB4MUYsMHgwMCwweDE0LDB4MDAsMHhBQSwweDAwLDB4MDAsMHgwMCwweDMwLDB4MDAsMHgwMCwweDRFLDB4NzUsCisweDIwLDB4NzAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE4LDB4NTIsMHg0MiwweDY4LDB4MDAsMHgxNCwweDAyLDB4QTgsMHhGRiwweEZGLAorMHhGRiwweENGLDB4MDAsMHgwMCwweDAyLDB4NzAsMHhFRiwweEZGLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweEFBLDB4NjEsMHgwMCwKKzB4MDMsMHg3MCwweDIyLDB4MzAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDEwLDB4MDQsMHg0MiwweEIwLDB4MTksMHg5MCwweDRFLDB4NzUsCisweDBDLDB4QjAsMHgwMCwweDAwLDB4MDAsMHgwQSwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHg3OCwweDY3LDB4MDAsMHgwMCwweEE4LAorMHgyMiwweDMwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweDY4LDB4MjQsMHgwMSwweDRDLDB4M0MsMHgyMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwQywweEQ0LDB4QjAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDEwLDB4MDQsMHgwNiwweDgyLDB4MDAsMHgwMCwweDAwLDB4MUMsCisweDBDLDB4QjAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDI5LDB4OTAsMHg2NiwweDAwLDB4MDAsMHg3QywweDIwLDB4NzAsMHgyOSwweEEwLAorMHgwMCwweDA0LDB4RTcsMHg4OSwweEQyLDB4QjAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE4LDB4NzIsMHgyMiwweDcwLDB4MTksMHhBMCwKKzB4MDAsMHgwNCwweDI0LDB4MzAsMHgyOSwweEEwLDB4MDAsMHgwOCwweDMxLDB4ODIsMHgxOSwweEEwLDB4MDAsMHgwMiwweDU2LDB4ODIsCisweDAyLDB4ODIsMHhGRiwweEZGLDB4RkYsMHhGQywweDIzLDB4QzgsMHhGRiwweEY5LDB4MDEsMHgwNCwweDIzLDB4QzksMHhGRiwweEY5LAorMHgwMSwweDA4LDB4MjMsMHhDMiwweEZGLDB4RjksMHgwMSwweDBDLDB4MjMsMHhGQywweDAwLDB4MDAsMHgwMSwweDAzLDB4RkYsMHhGOSwKKzB4MDEsMHgyOCwweDYxLDB4MDAsMHgwMSwweEY2LDB4MDgsMHhGMCwweDAwLDB4MUYsMHgxOSwweDkwLDB4MjIsMHgzMCwweDA5LDB4QjAsCisweDAwLDB4MDAsMHgxOSwweDY4LDB4NTIsMHg4MSwweDBDLDB4ODEsMHgwMCwweDAwLDB4MDAsMHgwQSwweDY2LDB4MDAsMHgwMCwweDA0LAorMHg0MiwweDgxLDB4MjEsMHg4MSwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHg2OCwweDUyLDB4QjAsMHgwOSwweEIwLDB4MDAsMHgwMCwKKzB4MTksMHg3OCwweDYwLDB4MDAsMHhGRiwweDRDLDB4NEUsMHg3NSwweDIyLDB4MzAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4ODgsCisweEU3LDB4ODksMHhEMiwweEIwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOCwweDgyLDB4MzQsMHgzMCwweDE5LDB4OTAsMHgwOCwweDAyLAorMHgwMCwweDBGLDB4NjYsMHgwMCwweDAxLDB4MTIsMHgwOCwweDAyLDB4MDAsMHgwMSwweDY2LDB4MDAsMHgwMCwweEU2LDB4NEEsMHg3MCwKKzB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweDlDLDB4NjYsMHgwMCwweDAwLDB4MDYsMHgwOCwweDgyLDB4MDAsMHgwMiwweDAyLDB4NDIsCisweDBDLDB4QkMsMHgwQywweDQyLDB4MEMsMHgwMCwweDY2LDB4MDAsMHgwMCwweERDLDB4NDIsMHg4MywweDM2LDB4MzAsMHgxOSwweEEwLAorMHgwMCwweDAyLDB4OTYsMHg3MCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHg5QywweDBDLDB4NDMsMHgwNSwweEY4LDB4NkUsMHgwMCwKKzB4MDAsMHhDNCwweDI0LDB4M0EsMHgwNCwweDg0LDB4NEMsMHgzQywweDIwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwQywweEQ0LDB4QkEsCisweEZBLDB4RjQsMHgwQywweEIwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyOSwweDkwLDB4NjYsMHgwMCwweDAwLDB4OTYsMHgyMSwweDgzLAorMHgyOSwweEEwLDB4MDAsMHgwOCwweDIwLDB4NzAsMHgxOSwweEEwLDB4MDAsMHgwNCwweDIyLDB4NzAsMHgyOSwweEEwLDB4MDAsMHgwNCwKKzB4NEEsMHg4OSwweDY3LDB4MDAsMHgwMCwweDJBLDB4NTYsMHg4MywweDAyLDB4ODMsMHhGRiwweEZGLDB4RkYsMHhGQywweDIzLDB4QzgsCisweEZGLDB4RjksMHgwMSwweDFDLDB4MjMsMHhDOSwweEZGLDB4RjksMHgwMSwweDE4LDB4MjMsMHhDMywweEZGLDB4RjksMHgwMSwweDIwLAorMHgyMywweEZDLDB4MDAsMHgwMCwweDAzLDB4MDEsMHhGRiwweEY5LDB4MDEsMHgyOCwweDYxLDB4MDAsMHgwMSwweDJDLDB4MjEsMHhCMCwKKzB4MDksMHhCMCwweDAwLDB4MDAsMHgxOCwweEMyLDB4MjksMHg5MCwweDA4LDB4QzYsMHgwMCwweDA0LDB4MjQsMHgzQSwweDA0LDB4MUEsCisweDUyLDB4ODIsMHgwQywweDgyLDB4MDAsMHgwMCwweDAwLDB4MjgsMHg2NiwweDAwLDB4MDAsMHgwNCwweDQyLDB4ODIsMHgyMywweEMyLAorMHgwMCwweDAwLDB4MTksMHg5OCwweDAyLDB4NzAsMHhGMCwweDAwLDB4MTksMHg5MCwweDA4LDB4RjAsMHgwMCwweDFGLDB4MTksMHg5MCwKKzB4MjIsMHgzMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHg4OCwweDUyLDB4ODEsMHgwQywweDgxLDB4MDAsMHgwMCwweDAwLDB4MUUsCisweDY2LDB4MDAsMHgwMCwweDA0LDB4NDIsMHg4MSwweDIxLDB4ODEsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4ODgsMHg2MCwweDAwLAorMHhGRSwweEY4LDB4MjQsMHgzMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTAsMHgwNCwweDUyLDB4QjAsMHgyOSwweEEwLDB4MDAsMHgwOCwKKzB4NjAsMHgwMCwweEZGLDB4QzIsMHgyNCwweDMwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxMCwweDA0LDB4NTIsMHhCMCwweDI5LDB4QTAsCisweDAwLDB4MEMsMHg2MCwweDAwLDB4RkYsMHhCMCwweDRFLDB4NzUsMHg0QSwweEIwLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweDc4LAorMHg2NywweDAwLDB4MDAsMHg4NiwweDIyLDB4MzAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4NTgsMHgyNCwweDAxLDB4RTcsMHg4OSwKKzB4RDIsMHhCMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTgsMHg3MiwweDM2LDB4MzAsMHgxOSwweDkwLDB4MDgsMHgwMywweDAwLDB4MEYsCisweDY2LDB4MDAsMHgwMCwweDY2LDB4OEMsMHhCMCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTgsMHhBMiwweDUzLDB4QjAsMHgwOSwweEIwLAorMHgwMCwweDAwLDB4MTksMHg3OCwweDIyLDB4MzAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4NTgsMHg1MiwweDgxLDB4MEMsMHg4MSwKKzB4MDAsMHgwMCwweDAwLDB4MEEsMHg2NiwweDAwLDB4MDAsMHgwNCwweDQyLDB4ODEsMHgyMSwweDgxLDB4MDksMHhCMCwweDAwLDB4MDAsCisweDE5LDB4NTgsMHg0QywweDNDLDB4MjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBDLDB4RDQsMHhCMCwweDA5LDB4QjAsMHgwMCwweDAwLAorMHgxMCwweDA0LDB4MDYsMHg4MiwweDAwLDB4MDAsMHgwMCwweDFDLDB4MDgsMHgwMywweDAwLDB4MDEsMHg2NiwweDAwLDB4MDAsMHgwRSwKKzB4MjEsMHhCQywweDAwLDB4MDAsMHgwMCwweDIwLDB4MjksMHg5MCwweDYwLDB4MDAsMHhGRiwweDdFLDB4MjEsMHhCQywweDAwLDB4MDAsCisweDAwLDB4MzAsMHgyOSwweDkwLDB4NjAsMHgwMCwweEZGLDB4NzIsMHg0RSwweDc1LDB4MkYsMHgwMCwweDQwLDB4RTcsMHgyMCwweDM5LAorMHhGRiwweEY5LDB4MDEsMHgyOCwweDA4LDB4MDAsMHgwMCwweDA0LDB4NjYsMHgwMCwweDAwLDB4MkMsMHg0RSwweDcyLDB4MjIsMHgwMCwKKzB4NDYsMHhGQywweDI3LDB4MDAsMHg2MCwweDAwLDB4RkYsMHhFOCwweDJGLDB4MDAsMHg0MCwweEU3LDB4MjAsMHgzOSwweEZGLDB4RjksCisweDAxLDB4MjgsMHgwOCwweDAwLDB4MDAsMHgwQywweDY2LDB4MDAsMHgwMCwweDBFLDB4NEUsMHg3MiwweDIyLDB4MDAsMHg0NiwweEZDLAorMHgyNywweDAwLDB4NjAsMHgwMCwweEZGLDB4RTgsMHg0NiwweERGLDB4MjAsMHgxRiwweDRFLDB4NzUsMHgyRiwweDAwLDB4MjAsMHgzOSwKKzB4RkYsMHhGOSwweDAwLDB4RTAsMHgyMywweEMwLDB4RkYsMHhGOSwweDAwLDB4RTAsMHg4MSwweEI5LDB4MDAsMHgwMCwweDE5LDB4NTQsCisweDIzLDB4RkMsMHgwMCwweDAwLDB4MDksMHgwOSwweEZGLDB4RjksMHgwMSwweDI4LDB4MjAsMHgxRiwweDRFLDB4NzMsMHgwMCwweEI5LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweEZGLDB4RkMsMHgxNiwweDEwLDB4MDAsMHhCOSwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwKKzB4MTksMHg1NCwweDIzLDB4RkMsMHg0MCwweDAwLDB4MDAsMHgwMCwweEZGLDB4RkMsMHgxNSwweDRDLDB4NEUsMHg3MywweDAwLDB4QjksCisweDAwLDB4MDAsMHgwMCwweDAwLDB4RkYsMHhGQywweDE2LDB4MzAsMHgwMCwweEI5LDB4MDAsMHgwMCwweDIwLDB4MDAsMHgwMCwweDAwLAorMHgxOSwweDU0LDB4MjMsMHhGQywweDIwLDB4MDAsMHgwMCwweDAwLDB4RkYsMHhGQywweDE1LDB4NEMsMHg0RSwweDczLDB4MDAsMHhCOSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHhGRiwweEZDLDB4MTYsMHg1MCwweDAwLDB4QjksMHgwMCwweDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsCisweDE5LDB4NTQsMHgyMywweEZDLDB4MTAsMHgwMCwweDAwLDB4MDAsMHhGRiwweEZDLDB4MTUsMHg0QywweDRFLDB4NzMsMHgwMCwweEI5LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweEZGLDB4RkMsMHgxNiwweDcwLDB4MDAsMHhCOSwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwKKzB4MTksMHg1NCwweDIzLDB4RkMsMHgwOCwweDAwLDB4MDAsMHgwMCwweEZGLDB4RkMsMHgxNSwweDRDLDB4NEUsMHg3MywweDRFLDB4NzMsCisweDJGLDB4MDAsMHgyRiwweDAxLDB4MkYsMHgwMiwweDJGLDB4MDgsMHgyRiwweDA5LDB4NDIsMHg4MCwweDIwLDB4N0MsMHhGRiwweEZCLAorMHgwMCwweDAwLDB4MzIsMHgxMCwweDAyLDB4ODEsMHgwMCwweDAwLDB4MDAsMHhFNywweDBDLDB4NDEsMHgwMCwweDQyLDB4NjYsMHgwMCwKKzB4MDAsMHgwQSwweDMyLDB4M0MsMHgwRSwweDA4LDB4NjAsMHgwMCwweDAwLDB4M0UsMHgwQywweDQxLDB4MDAsMHg2MywweDY2LDB4MDAsCisweDAwLDB4MEEsMHgzMiwweDNDLDB4MDQsMHgwOCwweDYwLDB4MDAsMHgwMCwweDJFLDB4MEMsMHg0MSwweDAwLDB4ODQsMHg2NiwweDAwLAorMHgwMCwweDBBLDB4MzIsMHgzQywweDAyLDB4MDgsMHg2MCwweDAwLDB4MDAsMHgxRSwweDBDLDB4NDEsMHgwMCwweEE1LDB4NjYsMHgwMCwKKzB4MDAsMHgwQSwweDMyLDB4M0MsMHgwRCwweDA4LDB4NjAsMHgwMCwweDAwLDB4MEUsMHgzMiwweDNDLDB4MDAsMHgwOCwweDM0LDB4M0MsCisweDgwLDB4RTcsMHg2MCwweDAwLDB4MDAsMHgxNCwweDM0LDB4MzAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE5LDB4QUEsMHgwMiwweDQyLAorMHgzMCwweDAwLDB4ODIsMHg0MiwweDM0LDB4M0MsMHg4MCwweEZGLDB4QjIsMHg3MCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHhBQywKKzB4NjcsMHgwMCwweDAwLDB4MEMsMHgzMSwweDgxLDB4MDksMHhCMCwweDAwLDB4MDAsMHgxOSwweEFDLDB4MzAsMHg4MSwweDMyLDB4MzksCisweEZGLDB4RkMsMHgxNSwweDY2LDB4QzIsMHg3MCwweDA5LDB4QjAsMHgwMCwweDAwLDB4MTksMHgwMiwweDY3LDB4MDAsMHgwMCwweDBDLAorMHgzMiwweDEwLDB4MDIsMHg0MSwweEZGLDB4RjcsMHg2MCwweDAwLDB4MDAsMHgwOCwweDMyLDB4MTAsMHgwMCwweDQxLDB4MDAsMHgwOCwKKzB4QzIsMHg0MiwweDIyLDB4NzAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDEwLDB4MDQsMHhCMiwweEE5LDB4MDAsMHgwNCwweDY3LDB4MDAsCisweDAwLDB4MTIsMHgyMywweDQxLDB4MDAsMHgwNCwweDIzLDB4RjAsMHgwOSwweEIwLDB4MDAsMHgwMCwweDE4LDB4QjIsMHhGRiwweEY5LAorMHgwMCwweEU0LDB4NTQsMHg4OCwweDU4LDB4ODAsMHgwQywweDgwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg2NiwweDAwLDB4RkYsMHgzNCwKKzB4MjIsMHg1RiwweDIwLDB4NUYsMHgyNCwweDFGLDB4MjIsMHgxRiwweDIwLDB4MUYsMHg0RSwweDc1LDB4NjEsMHgwMCwweEZGLDB4MTIsCisweDRFLDB4NzMsMHhGRiwweEZDLDB4MTYsMHgwMCwweEZGLDB4RkMsMHgxNiwweDIwLDB4RkYsMHhGQywweDE2LDB4NDAsMHhGRiwweEZDLAorMHgxNiwweDYwLDB4RkYsMHhGQywweDBDLDB4MDAsMHhGRiwweEZDLDB4MEQsMHgwMCwweEZGLDB4RkMsMHgwRSwweDAwLDB4RkYsMHhGQywKKzB4MEYsMHgwMCwweEZGLDB4RkMsMHgwMCwweDAwLDB4RkYsMHhGQywweDAxLDB4NDAsMHhGRiwweEZDLDB4MDIsMHg4MCwweEZGLDB4RkMsCisweDAzLDB4QzAsMHhGRiwweEZDLDB4MDAsMHg1MCwweEZGLDB4RkMsMHgwMSwweDkwLDB4RkYsMHhGQywweDAyLDB4RDAsMHhGRiwweEZDLAorMHgwNCwweDEwLDB4MDAsMHgwMCwweDQwLDB4MDAsMHgwMCwweDAxLDB4MkYsMHg2MCwweDAwLDB4MDIsMHgxRSwweEMwLDB4MDAsMHgwMywKKzB4MEUsMHgyMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsCisweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgyMCwweDAwLDB4MDAsMHgwMCwweDQwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMCwweDAwLAorMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgxMSwweDAwLDB4MDAsMHgwMCwweDEyLDB4MDAsMHgwMCwKKzB4MDAsMHgxMywweDAwLDB4MDAsMHgwMCwweDJDLDB4MDAsMHgwMCwweDNFLDB4MDAsMHgwMCwweDJDLDB4MDAsMHgwMCwweDNFLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyRCwweDAwLDB4MDAsMHgzRiwweDAwLDB4MDAsMHgyRCwweDAwLDB4MDAsMHgzRiwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4RkYsMHgwMCwweDAwLDB4RkYsMHgwMCwweDAwLDB4RkYsMHgwMCwweDAwLDB4RkYsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MjAsMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsCisweDc3LDB4NjEsMHg2RSwweDU4LDB4NEMsMHgyMCwweDY2LDB4NjksMHg3MiwweDZELDB4NzcsMHg2MSwweDcyLDB4NjUsMHgwQSwweDQzLAorMHg2RiwweDcwLDB4NzksMHg3MiwweDY5LDB4NjcsMHg2OCwweDc0LDB4MjAsMHgyOCwweDQzLDB4MjksMHgyMCwweDMyLDB4MzAsMHgzMCwKKzB4MzMsMHgyMCwweDRCLDB4NzIsMHg3QSwweDc5LDB4NzMsMHg3QSwweDc0LDB4NkYsMHg2NiwweDIwLDB4NDgsMHg2MSwweDZDLDB4NjEsCisweDczLDB4NjEsMHgyMCwweDNDLDB4NkIsMHg2OCwweDYzLDB4NDAsMHg3MCwweDZELDB4MkUsMHg3NywweDYxLDB4NzcsMHgyRSwweDcwLAorMHg2QywweDNFLDB4MEEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4veDI1X2FzeS5jIGIvZHJpdmVycy9uZXQvd2FuL3gyNV9hc3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzVjZmNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3gyNV9hc3kuYwpAQCAtMCwwICsxLDg0NCBAQAorLyoKKyAqCVRoaW5ncyB0byBzb3J0IG91dDoKKyAqCisgKglvCXRidXN5IGhhbmRsaW5nCisgKglvCWFsbG93IHVzZXJzIHRvIHNldCB0aGUgcGFyYW1ldGVycworICoJbwlzeW5jL2FzeW5jIHN3aXRjaGluZyA/CisgKgorICoJTm90ZTogVGhpcyBkb2VzIF9ub3RfIGltcGxlbWVudCBDQ0lUVCBYLjI1IGFzeW5jaHJvbm91cyBmcmFtaW5nCisgKglyZWNvbW1lbmRhdGlvbnMuIEl0cyBwcmltYXJpbHkgZm9yIHRlc3RpbmcgcHVycG9zZXMuIElmIHlvdSB3YW50ZWQKKyAqCXRvIGRvIENDSVRUIHRoZW4gaW4gdGhlb3J5IGFsbCB5b3UgbmVlZCBpcyB0byBuaWNrIHRoZSBIRExDIGFzeW5jCisgKgljaGVja3N1bSByb3V0aW5lcyBmcm9tIHBwcC5jCisgKiAgICAgIENoYW5nZXM6CisgKgorICoJMjAwMC0xMC0yOQlIZW5uZXIgRWlzZW4JbGFwYl9kYXRhX2luZGljYXRpb24oKSByZXR1cm4gc3RhdHVzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgveDI1Lmg+CisjaW5jbHVkZSA8bGludXgvbGFwYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlICJ4MjVfYXN5LmgiCisKKyNpbmNsdWRlIDxuZXQveDI1ZGV2aWNlLmg+CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqKngyNV9hc3lfZGV2czsKK3N0YXRpYyBpbnQgeDI1X2FzeV9tYXhkZXYgPSBTTF9OUlVOSVQ7CisKK21vZHVsZV9wYXJhbSh4MjVfYXN5X21heGRldiwgaW50LCAwKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCB4MjVfYXN5X2VzYyh1bnNpZ25lZCBjaGFyICpwLCB1bnNpZ25lZCBjaGFyICpkLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkIHgyNV9hc3lfdW5lc2Moc3RydWN0IHgyNV9hc3kgKnNsLCB1bnNpZ25lZCBjaGFyIGMpOworc3RhdGljIHZvaWQgeDI1X2FzeV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogRmluZCBhIGZyZWUgWC4yNSBjaGFubmVsLCBhbmQgbGluayBpbiB0aGlzIGB0dHknIGxpbmUuICovCitzdGF0aWMgc3RydWN0IHgyNV9hc3kgKngyNV9hc3lfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgeDI1X2FzeSAqc2w7CisJaW50IGk7CisKKwlpZiAoeDI1X2FzeV9kZXZzID09IE5VTEwpCisJCXJldHVybiBOVUxMOwkvKiBNYXN0ZXIgYXJyYXkgbWlzc2luZyAhICovCisKKwlmb3IgKGkgPSAwOyBpIDwgeDI1X2FzeV9tYXhkZXY7IGkrKykgeworCQlkZXYgPSB4MjVfYXN5X2RldnNbaV07CisKKwkJLyogTm90IGFsbG9jYXRlZCA/ICovCisJCWlmIChkZXYgPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCXNsID0gZGV2LT5wcml2OworCQkvKiBOb3QgaW4gdXNlID8gKi8KKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFNMRl9JTlVTRSwgJnNsLT5mbGFncykpCisJCQlyZXR1cm4gc2w7CisJfQorCisKKwkvKiBTb3JyeSwgdG9vIG1hbnksIGFsbCBzbG90cyBpbiB1c2UgKi8KKwlpZiAoaSA+PSB4MjVfYXN5X21heGRldikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBJZiBubyBjaGFubmVscyBhcmUgYXZhaWxhYmxlLCBhbGxvY2F0ZSBvbmUgKi8KKwlpZiAoIWRldikgeworCQljaGFyIG5hbWVbSUZOQU1TSVpdOworCQlzcHJpbnRmKG5hbWUsICJ4MjVhc3klZCIsIGkpOworCisJCWRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IHgyNV9hc3kpLAorCQkJCSAgIG5hbWUsIHgyNV9hc3lfc2V0dXApOworCQlpZiAoIWRldikKKwkJCXJldHVybiBOVUxMOworCisJCS8qIEluaXRpYWxpemUgY2hhbm5lbCBjb250cm9sIGRhdGEgKi8KKwkJc2wgPSBkZXYtPnByaXY7CisJCWRldi0+YmFzZV9hZGRyICAgID0gaTsKKworCQkvKiByZWdpc3RlciBkZXZpY2Ugc28gdGhhdCBpdCBjYW4gYmUgaWZjb25maWcnZWQgICAgICAgKi8KKwkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKKwkJCS8qIChSZS0pU2V0IHRoZSBJTlVTRSBiaXQuICAgVmVyeSBJbXBvcnRhbnQhICovCisJCQlzZXRfYml0KFNMRl9JTlVTRSwgJnNsLT5mbGFncyk7CisJCQl4MjVfYXN5X2RldnNbaV0gPSBkZXY7CisJCQlyZXR1cm4gc2w7CisJCX0gZWxzZSB7CisJCQlwcmludGsoIngyNV9hc3lfYWxsb2MoKSAtIHJlZ2lzdGVyX25ldGRldigpIGZhaWx1cmUuXG4iKTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworLyogRnJlZSBhbiBYLjI1IGNoYW5uZWwuICovCitzdGF0aWMgdm9pZCB4MjVfYXN5X2ZyZWUoc3RydWN0IHgyNV9hc3kgKnNsKQoreworCS8qIEZyZWUgYWxsIFguMjUgZnJhbWUgYnVmZmVycy4gKi8KKwlpZiAoc2wtPnJidWZmKSAgeworCQlrZnJlZShzbC0+cmJ1ZmYpOworCX0KKwlzbC0+cmJ1ZmYgPSBOVUxMOworCWlmIChzbC0+eGJ1ZmYpICB7CisJCWtmcmVlKHNsLT54YnVmZik7CisJfQorCXNsLT54YnVmZiA9IE5VTEw7CisKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChTTEZfSU5VU0UsICZzbC0+ZmxhZ3MpKSB7CisJCXByaW50aygiJXM6IHgyNV9hc3lfZnJlZSBmb3IgYWxyZWFkeSBmcmVlIHVuaXQuXG4iLCBzbC0+ZGV2LT5uYW1lKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgeDI1X2FzeV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdtdHUpCit7CisJc3RydWN0IHgyNV9hc3kgKnNsID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGNoYXIgKnhidWZmLCAqcmJ1ZmY7CisJaW50IGxlbiA9IDIqIG5ld210dTsKKworCXhidWZmID0gKHVuc2lnbmVkIGNoYXIgKikga21hbGxvYyAobGVuICsgNCwgR0ZQX0FUT01JQyk7CisJcmJ1ZmYgPSAodW5zaWduZWQgY2hhciAqKSBrbWFsbG9jIChsZW4gKyA0LCBHRlBfQVRPTUlDKTsKKworCWlmICh4YnVmZiA9PSBOVUxMIHx8IHJidWZmID09IE5VTEwpICAKKwl7CisJCXByaW50aygiJXM6IHVuYWJsZSB0byBncm93IFguMjUgYnVmZmVycywgTVRVIGNoYW5nZSBjYW5jZWxsZWQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJaWYgKHhidWZmICE9IE5VTEwpICAKKwkJCWtmcmVlKHhidWZmKTsKKwkJaWYgKHJidWZmICE9IE5VTEwpICAKKwkJCWtmcmVlKHJidWZmKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrX2JoKCZzbC0+bG9jayk7CisJeGJ1ZmYgICAgPSB4Y2hnKCZzbC0+eGJ1ZmYsIHhidWZmKTsKKwlpZiAoc2wtPnhsZWZ0KSAgeworCQlpZiAoc2wtPnhsZWZ0IDw9IGxlbikgIHsKKwkJCW1lbWNweShzbC0+eGJ1ZmYsIHNsLT54aGVhZCwgc2wtPnhsZWZ0KTsKKwkJfSBlbHNlICB7CisJCQlzbC0+eGxlZnQgPSAwOworCQkJc2wtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJfQorCX0KKwlzbC0+eGhlYWQgPSBzbC0+eGJ1ZmY7CisKKwlyYnVmZgkgPSB4Y2hnKCZzbC0+cmJ1ZmYsIHJidWZmKTsKKwlpZiAoc2wtPnJjb3VudCkgIHsKKwkJaWYgKHNsLT5yY291bnQgPD0gbGVuKSB7CisJCQltZW1jcHkoc2wtPnJidWZmLCByYnVmZiwgc2wtPnJjb3VudCk7CisJCX0gZWxzZSAgeworCQkJc2wtPnJjb3VudCA9IDA7CisJCQlzbC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJCXNldF9iaXQoU0xGX0VSUk9SLCAmc2wtPmZsYWdzKTsKKwkJfQorCX0KKworCWRldi0+bXR1ICAgID0gbmV3bXR1OworCXNsLT5idWZmc2l6ZSA9IGxlbjsKKworCXNwaW5fdW5sb2NrX2JoKCZzbC0+bG9jayk7CisKKwlpZiAoeGJ1ZmYgIT0gTlVMTCkgCisJCWtmcmVlKHhidWZmKTsKKwlpZiAocmJ1ZmYgIT0gTlVMTCkKKwkJa2ZyZWUocmJ1ZmYpOworCXJldHVybiAwOworfQorCisKKy8qIFNldCB0aGUgInNlbmRpbmciIGZsYWcuICBUaGlzIG11c3QgYmUgYXRvbWljLCBoZW5jZSB0aGUgQVNNLiAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgeDI1X2FzeV9sb2NrKHN0cnVjdCB4MjVfYXN5ICpzbCkKK3sKKwluZXRpZl9zdG9wX3F1ZXVlKHNsLT5kZXYpOworfQorCisKKy8qIENsZWFyIHRoZSAic2VuZGluZyIgZmxhZy4gIFRoaXMgbXVzdCBiZSBhdG9taWMsIGhlbmNlIHRoZSBBU00uICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4MjVfYXN5X3VubG9jayhzdHJ1Y3QgeDI1X2FzeSAqc2wpCit7CisJbmV0aWZfd2FrZV9xdWV1ZShzbC0+ZGV2KTsKK30KKworLyogU2VuZCBvbmUgY29tcGxldGVseSBkZWNhcHN1bGF0ZWQgSVAgZGF0YWdyYW0gdG8gdGhlIElQIGxheWVyLiAqLworCitzdGF0aWMgdm9pZCB4MjVfYXN5X2J1bXAoc3RydWN0IHgyNV9hc3kgKnNsKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGNvdW50OworCWludCBlcnI7CisKKwljb3VudCA9IHNsLT5yY291bnQ7CisJc2wtPnN0YXRzLnJ4X2J5dGVzKz1jb3VudDsKKwkKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGNvdW50KzEpOworCWlmIChza2IgPT0gTlVMTCkgIAorCXsKKwkJcHJpbnRrKCIlczogbWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsIHNsLT5kZXYtPm5hbWUpOworCQlzbC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCXNrYl9wdXNoKHNrYiwxKTsJLyogTEFQQiBpbnRlcm5hbCBjb250cm9sICovCisJbWVtY3B5KHNrYl9wdXQoc2tiLGNvdW50KSwgc2wtPnJidWZmLCBjb3VudCk7CisJc2tiLT5wcm90b2NvbCA9IHgyNV90eXBlX3RyYW5zKHNrYiwgc2wtPmRldik7CisJaWYoKGVycj1sYXBiX2RhdGFfcmVjZWl2ZWQoc2tiLT5kZXYsIHNrYikpIT1MQVBCX09LKQorCXsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXByaW50ayhLRVJOX0RFQlVHICJ4MjVfYXN5OiBkYXRhIHJlY2VpdmVkIGVyciAtICVkXG4iLGVycik7CisJfQorCWVsc2UKKwl7CisJCW5ldGlmX3J4KHNrYik7CisJCXNsLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQlzbC0+c3RhdHMucnhfcGFja2V0cysrOworCX0KK30KKworLyogRW5jYXBzdWxhdGUgb25lIElQIGRhdGFncmFtIGFuZCBzdHVmZiBpbnRvIGEgVFRZIHF1ZXVlLiAqLworc3RhdGljIHZvaWQgeDI1X2FzeV9lbmNhcHMoc3RydWN0IHgyNV9hc3kgKnNsLCB1bnNpZ25lZCBjaGFyICppY3AsIGludCBsZW4pCit7CisJdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgYWN0dWFsLCBjb3VudCwgbXR1ID0gc2wtPmRldi0+bXR1OworCisJaWYgKGxlbiA+IG10dSkgCisJewkJLyogU2lnaCwgc2hvdWxkbid0IG9jY3VyIEJVVCAuLi4gKi8KKwkJbGVuID0gbXR1OworCQlwcmludGsgKCIlczogdHJ1bmNhdGluZyBvdmVyc2l6ZWQgdHJhbnNtaXQgcGFja2V0IVxuIiwgc2wtPmRldi0+bmFtZSk7CisJCXNsLT5zdGF0cy50eF9kcm9wcGVkKys7CisJCXgyNV9hc3lfdW5sb2NrKHNsKTsKKwkJcmV0dXJuOworCX0KKworCXAgPSBpY3A7CisJY291bnQgPSB4MjVfYXN5X2VzYyhwLCAodW5zaWduZWQgY2hhciAqKSBzbC0+eGJ1ZmYsIGxlbik7CisKKwkvKiBPcmRlciBvZiBuZXh0IHR3byBsaW5lcyBpcyAqdmVyeSogaW1wb3J0YW50LgorCSAqIFdoZW4gd2UgYXJlIHNlbmRpbmcgYSBsaXR0bGUgYW1vdW50IG9mIGRhdGEsCisJICogdGhlIHRyYW5zZmVyIG1heSBiZSBjb21wbGV0ZWQgaW5zaWRlIGRyaXZlci53cml0ZSgpCisJICogcm91dGluZSwgYmVjYXVzZSBpdCdzIHJ1bm5pbmcgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQuCisJICogSW4gdGhpcyBjYXNlIHdlICpuZXZlciogZ290IFdSSVRFX1dBS0VVUCBldmVudCwKKwkgKiBpZiB3ZSBkaWQgbm90IHJlcXVlc3QgaXQgYmVmb3JlIHdyaXRlIG9wZXJhdGlvbi4KKwkgKiAgICAgICAxNCBPY3QgMTk5NCAgRG1pdHJ5IEdvcm9kY2hhbmluLgorCSAqLworCXNsLT50dHktPmZsYWdzIHw9ICgxIDw8IFRUWV9ET19XUklURV9XQUtFVVApOworCWFjdHVhbCA9IHNsLT50dHktPmRyaXZlci0+d3JpdGUoc2wtPnR0eSwgc2wtPnhidWZmLCBjb3VudCk7CisJc2wtPnhsZWZ0ID0gY291bnQgLSBhY3R1YWw7CisJc2wtPnhoZWFkID0gc2wtPnhidWZmICsgYWN0dWFsOworCS8qIFZTViAqLworCWNsZWFyX2JpdChTTEZfT1VUV0FJVCwgJnNsLT5mbGFncyk7CS8qIHJlc2V0IG91dGZpbGwgZmxhZyAqLworfQorCisvKgorICogQ2FsbGVkIGJ5IHRoZSBkcml2ZXIgd2hlbiB0aGVyZSdzIHJvb20gZm9yIG1vcmUgZGF0YS4gIElmIHdlIGhhdmUKKyAqIG1vcmUgcGFja2V0cyB0byBzZW5kLCB3ZSBzZW5kIHRoZW0gaGVyZS4KKyAqLworc3RhdGljIHZvaWQgeDI1X2FzeV93cml0ZV93YWtldXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpbnQgYWN0dWFsOworCXN0cnVjdCB4MjVfYXN5ICpzbCA9IChzdHJ1Y3QgeDI1X2FzeSAqKSB0dHktPmRpc2NfZGF0YTsKKworCS8qIEZpcnN0IG1ha2Ugc3VyZSB3ZSdyZSBjb25uZWN0ZWQuICovCisJaWYgKCFzbCB8fCBzbC0+bWFnaWMgIT0gWDI1X0FTWV9NQUdJQyB8fCAhbmV0aWZfcnVubmluZyhzbC0+ZGV2KSkKKwkJcmV0dXJuOworCisJaWYgKHNsLT54bGVmdCA8PSAwKSAgCisJeworCQkvKiBOb3cgc2VyaWFsIGJ1ZmZlciBpcyBhbG1vc3QgZnJlZSAmIHdlIGNhbiBzdGFydAorCQkgKiB0cmFuc21pc3Npb24gb2YgYW5vdGhlciBwYWNrZXQgKi8KKwkJc2wtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJdHR5LT5mbGFncyAmPSB+KDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCk7CisJCXgyNV9hc3lfdW5sb2NrKHNsKTsKKwkJcmV0dXJuOworCX0KKworCWFjdHVhbCA9IHR0eS0+ZHJpdmVyLT53cml0ZSh0dHksIHNsLT54aGVhZCwgc2wtPnhsZWZ0KTsKKwlzbC0+eGxlZnQgLT0gYWN0dWFsOworCXNsLT54aGVhZCArPSBhY3R1YWw7Cit9CisKK3N0YXRpYyB2b2lkIHgyNV9hc3lfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4MjVfYXN5ICpzbCA9IChzdHJ1Y3QgeDI1X2FzeSopKGRldi0+cHJpdik7CisKKwlzcGluX2xvY2soJnNsLT5sb2NrKTsKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7CisJCS8qIE1heSBiZSB3ZSBtdXN0IGNoZWNrIHRyYW5zbWl0dGVyIHRpbWVvdXQgaGVyZSA/CisJCSAqICAgICAgMTQgT2N0IDE5OTQgRG1pdHJ5IEdvcm9kY2hhbmluLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgJXM/XG4iLCBkZXYtPm5hbWUsCisJCSAgICAgICAoc2wtPnR0eS0+ZHJpdmVyLT5jaGFyc19pbl9idWZmZXIoc2wtPnR0eSkgfHwgc2wtPnhsZWZ0KSA/CisJCSAgICAgICAiYmFkIGxpbmUgcXVhbGl0eSIgOiAiZHJpdmVyIGVycm9yIik7CisJCXNsLT54bGVmdCA9IDA7CisJCXNsLT50dHktPmZsYWdzICY9IH4oMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKwkJeDI1X2FzeV91bmxvY2soc2wpOworCX0KKwlzcGluX3VubG9jaygmc2wtPmxvY2spOworfQorCisvKiBFbmNhcHN1bGF0ZSBhbiBJUCBkYXRhZ3JhbSBhbmQga2ljayBpdCBpbnRvIGEgVFRZIHF1ZXVlLiAqLworCitzdGF0aWMgaW50IHgyNV9hc3lfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4MjVfYXN5ICpzbCA9IChzdHJ1Y3QgeDI1X2FzeSopKGRldi0+cHJpdik7CisJaW50IGVycjsKKworCWlmICghbmV0aWZfcnVubmluZyhzbC0+ZGV2KSkgeworCQlwcmludGsoIiVzOiB4bWl0IGNhbGwgd2hlbiBpZmFjZSBpcyBkb3duXG4iLCBkZXYtPm5hbWUpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCXN3aXRjaChza2ItPmRhdGFbMF0pCisJeworCQljYXNlIDB4MDA6YnJlYWs7CisJCWNhc2UgMHgwMTogLyogQ29ubmVjdGlvbiByZXF1ZXN0IC4uIGRvIG5vdGhpbmcgKi8KKwkJCWlmKChlcnI9bGFwYl9jb25uZWN0X3JlcXVlc3QoZGV2KSkhPUxBUEJfT0spCisJCQkJcHJpbnRrKEtFUk5fRVJSICJ4MjVfYXN5OiBsYXBiX2Nvbm5lY3RfcmVxdWVzdCBlcnJvciAtICVkXG4iLCBlcnIpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAweDAyOiAvKiBEaXNjb25uZWN0IHJlcXVlc3QgLi4gZG8gbm90aGluZyAtIGhhbmcgdXAgPz8gKi8KKwkJCWlmKChlcnI9bGFwYl9kaXNjb25uZWN0X3JlcXVlc3QoZGV2KSkhPUxBUEJfT0spCisJCQkJcHJpbnRrKEtFUk5fRVJSICJ4MjVfYXN5OiBsYXBiX2Rpc2Nvbm5lY3RfcmVxdWVzdCBlcnJvciAtICVkXG4iLCBlcnIpOworCQlkZWZhdWx0OgorCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gIDA7CisJfQorCXNrYl9wdWxsKHNrYiwxKTsJLyogUmVtb3ZlIGNvbnRyb2wgYnl0ZSAqLworCS8qCisJICogSWYgd2UgYXJlIGJ1c3kgYWxyZWFkeS0gdG9vIGJhZC4gIFdlIG91Z2h0IHRvIGJlIGFibGUKKwkgKiB0byBxdWV1ZSB0aGluZ3MgYXQgdGhpcyBwb2ludCwgdG8gYWxsb3cgZm9yIGEgbGl0dGxlCisJICogZnJhbWUgYnVmZmVyLiAgT2ggd2VsbC4uLgorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogSSBoYXRlIHF1ZXVlcyBpbiBYLjI1IGRyaXZlci4gTWF5IGJlIGl0J3MgZWZmaWNpZW50LAorCSAqIGJ1dCBmb3IgbWUgbGF0ZW5jeSBpcyBtb3JlIGltcG9ydGFudC4gOykKKwkgKiBTbywgbm8gcXVldWVzICEKKwkgKiAgICAgICAgMTQgT2N0IDE5OTQgIERtaXRyeSBHb3JvZGNoYW5pbi4KKwkgKi8KKwkKKwlpZigoZXJyPWxhcGJfZGF0YV9yZXF1ZXN0KGRldixza2IpKSE9TEFQQl9PSykKKwl7CisJCXByaW50ayhLRVJOX0VSUiAibGFwYmV0aDogbGFwYl9kYXRhX3JlcXVlc3QgZXJyb3IgLSAlZFxuIiwgZXJyKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJTEFQQiBpbnRlcmZhY2UgYm9pbGVycGxhdGUKKyAqLworCisvKgorICoJQ2FsbGVkIHdoZW4gSSBmcmFtZSBkYXRhIGFycml2ZXMuIFdlIGRpZCB0aGUgd29yayBhYm92ZSAtIHRocm93IGl0CisgKglhdCB0aGUgbmV0IGxheWVyLgorICovCisgIAorc3RhdGljIGludCB4MjVfYXN5X2RhdGFfaW5kaWNhdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlyZXR1cm4gbmV0aWZfcngoc2tiKTsKK30KKworLyoKKyAqCURhdGEgaGFzIGVtZXJnZWQgZnJvbSB0aGUgTEFQQiBwcm90b2NvbCBtYWNoaW5lLiBXZSBkb24ndCBoYW5kbGUKKyAqCWJ1c3kgY2FzZXMgdG9vIHdlbGwuIEl0cyB0cmlja3kgdG8gc2VlIGhvdyB0byBkbyB0aGlzIG5pY2VseSAtCisgKglwZXJoYXBzIGxhcGIgc2hvdWxkIGFsbG93IHVzIHRvIGJvdW5jZSB0aGlzID8KKyAqLworIAorc3RhdGljIHZvaWQgeDI1X2FzeV9kYXRhX3RyYW5zbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHgyNV9hc3kgKnNsPWRldi0+cHJpdjsKKwkKKwlzcGluX2xvY2soJnNsLT5sb2NrKTsKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChzbC0+ZGV2KSB8fCBzbC0+dHR5ID09IE5VTEwpCisJeworCQlzcGluX3VubG9jaygmc2wtPmxvY2spOworCQlwcmludGsoS0VSTl9FUlIgIngyNV9hc3k6IHRidXN5IGRyb3BcbiIpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKwkvKiBXZSB3ZXJlIG5vdCBidXN5LCBzbyB3ZSBhcmUgbm93Li4uIDotKSAqLworCWlmIChza2IgIT0gTlVMTCkgCisJeworCQl4MjVfYXN5X2xvY2soc2wpOworCQlzbC0+c3RhdHMudHhfYnl0ZXMrPXNrYi0+bGVuOworCQl4MjVfYXN5X2VuY2FwcyhzbCwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9CisJc3Bpbl91bmxvY2soJnNsLT5sb2NrKTsKK30KKworLyoKKyAqCUxBUEIgY29ubmVjdGlvbiBlc3RhYmxpc2gvZG93biBpbmZvcm1hdGlvbi4KKyAqLworIAorc3RhdGljIHZvaWQgeDI1X2FzeV9jb25uZWN0ZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJlYXNvbikKK3sKKwlzdHJ1Y3QgeDI1X2FzeSAqc2wgPSBkZXYtPnByaXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisKKwlpZiAoKHNrYiA9IGRldl9hbGxvY19za2IoMSkpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJsYXBiZXRoOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuOworCX0KKworCXB0ciAgPSBza2JfcHV0KHNrYiwgMSk7CisJKnB0ciA9IDB4MDE7CisKKwlza2ItPnByb3RvY29sID0geDI1X3R5cGVfdHJhbnMoc2tiLCBzbC0+ZGV2KTsKKwluZXRpZl9yeChza2IpOworCXNsLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworfQorCitzdGF0aWMgdm9pZCB4MjVfYXN5X2Rpc2Nvbm5lY3RlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcmVhc29uKQoreworCXN0cnVjdCB4MjVfYXN5ICpzbCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKworCWlmICgoc2tiID0gZGV2X2FsbG9jX3NrYigxKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIngyNV9hc3k6IG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm47CisJfQorCisJcHRyICA9IHNrYl9wdXQoc2tiLCAxKTsKKwkqcHRyID0gMHgwMjsKKworCXNrYi0+cHJvdG9jb2wgPSB4MjVfdHlwZV90cmFucyhza2IsIHNsLT5kZXYpOworCW5ldGlmX3J4KHNrYik7CisJc2wtPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGFwYl9yZWdpc3Rlcl9zdHJ1Y3QgeDI1X2FzeV9jYWxsYmFja3MgPSB7CisJLmNvbm5lY3RfY29uZmlybWF0aW9uID0geDI1X2FzeV9jb25uZWN0ZWQsCisJLmNvbm5lY3RfaW5kaWNhdGlvbiA9IHgyNV9hc3lfY29ubmVjdGVkLAorCS5kaXNjb25uZWN0X2NvbmZpcm1hdGlvbiA9IHgyNV9hc3lfZGlzY29ubmVjdGVkLAorCS5kaXNjb25uZWN0X2luZGljYXRpb24gPSB4MjVfYXN5X2Rpc2Nvbm5lY3RlZCwKKwkuZGF0YV9pbmRpY2F0aW9uID0geDI1X2FzeV9kYXRhX2luZGljYXRpb24sCisJLmRhdGFfdHJhbnNtaXQgPSB4MjVfYXN5X2RhdGFfdHJhbnNtaXQsCisKK307CisKKworLyogT3BlbiB0aGUgbG93LWxldmVsIHBhcnQgb2YgdGhlIFguMjUgY2hhbm5lbC4gRWFzeSEgKi8KK3N0YXRpYyBpbnQgeDI1X2FzeV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHgyNV9hc3kgKnNsID0gKHN0cnVjdCB4MjVfYXN5KikoZGV2LT5wcml2KTsKKwl1bnNpZ25lZCBsb25nIGxlbjsKKwlpbnQgZXJyOworCisJaWYgKHNsLT50dHkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCSAqIEFsbG9jYXRlIHRoZSBYLjI1IGZyYW1lIGJ1ZmZlcnM6CisJICoKKwkgKiByYnVmZglSZWNlaXZlIGJ1ZmZlci4KKwkgKiB4YnVmZglUcmFuc21pdCBidWZmZXIuCisJICovCisKKwlsZW4gPSBkZXYtPm10dSAqIDI7CisKKwlzbC0+cmJ1ZmYgPSAodW5zaWduZWQgY2hhciAqKSBrbWFsbG9jKGxlbiArIDQsIEdGUF9LRVJORUwpOworCWlmIChzbC0+cmJ1ZmYgPT0gTlVMTCkgICB7CisJCWdvdG8gbm9yYnVmZjsKKwl9CisJc2wtPnhidWZmID0gKHVuc2lnbmVkIGNoYXIgKikga21hbGxvYyhsZW4gKyA0LCBHRlBfS0VSTkVMKTsKKwlpZiAoc2wtPnhidWZmID09IE5VTEwpICAgeworCQlnb3RvIG5veGJ1ZmY7CisJfQorCisJc2wtPmJ1ZmZzaXplID0gbGVuOworCXNsLT5yY291bnQgICA9IDA7CisJc2wtPnhsZWZ0ICAgID0gMDsKKwlzbC0+ZmxhZ3MgICAmPSAoMSA8PCBTTEZfSU5VU0UpOyAgICAgIC8qIENsZWFyIEVTQ0FQRSAmIEVSUk9SIGZsYWdzICovCisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQkJCisJLyoKKwkgKglOb3cgYXR0YWNoIExBUEIKKwkgKi8KKwlpZigoZXJyPWxhcGJfcmVnaXN0ZXIoZGV2LCAmeDI1X2FzeV9jYWxsYmFja3MpKT09TEFQQl9PSykKKwkJcmV0dXJuIDA7CisKKwkvKiBDbGVhbnVwICovCisJa2ZyZWUoc2wtPnhidWZmKTsKK25veGJ1ZmY6CisJa2ZyZWUoc2wtPnJidWZmKTsKK25vcmJ1ZmY6CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKworLyogQ2xvc2UgdGhlIGxvdy1sZXZlbCBwYXJ0IG9mIHRoZSBYLjI1IGNoYW5uZWwuIEVhc3khICovCitzdGF0aWMgaW50IHgyNV9hc3lfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeDI1X2FzeSAqc2wgPSAoc3RydWN0IHgyNV9hc3kqKShkZXYtPnByaXYpOworCWludCBlcnI7CisKKwlzcGluX2xvY2soJnNsLT5sb2NrKTsKKwlpZiAoc2wtPnR0eSkgCisJCXNsLT50dHktPmZsYWdzICY9IH4oMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlzbC0+cmNvdW50ID0gMDsKKwlzbC0+eGxlZnQgID0gMDsKKwlpZigoZXJyPWxhcGJfdW5yZWdpc3RlcihkZXYpKSE9TEFQQl9PSykKKwkJcHJpbnRrKEtFUk5fRVJSICJ4MjVfYXN5X2Nsb3NlOiBsYXBiX3VucmVnaXN0ZXIgZXJyb3IgLSVkXG4iLGVycik7CisJc3Bpbl91bmxvY2soJnNsLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4MjVfYXN5X3JlY2VpdmVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXJldHVybiA2NTUzNjsgIC8qIFdlIGNhbiBoYW5kbGUgYW4gaW5maW5pdGUgYW1vdW50IG9mIGRhdGEuIDotKSAqLworfQorCisvKgorICogSGFuZGxlIHRoZSAncmVjZWl2ZXIgZGF0YSByZWFkeScgaW50ZXJydXB0LgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlICd0dHlfaW8nIG1vZHVsZSBpbiB0aGUga2VybmVsIHdoZW4KKyAqIGEgYmxvY2sgb2YgWC4yNSBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkLCB3aGljaCBjYW4gbm93IGJlIGRlY2Fwc3VsYXRlZAorICogYW5kIHNlbnQgb24gdG8gc29tZSBJUCBsYXllciBmb3IgZnVydGhlciBwcm9jZXNzaW5nLgorICovCisgCitzdGF0aWMgdm9pZCB4MjVfYXN5X3JlY2VpdmVfYnVmKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLCBjaGFyICpmcCwgaW50IGNvdW50KQoreworCXN0cnVjdCB4MjVfYXN5ICpzbCA9IChzdHJ1Y3QgeDI1X2FzeSAqKSB0dHktPmRpc2NfZGF0YTsKKworCWlmICghc2wgfHwgc2wtPm1hZ2ljICE9IFgyNV9BU1lfTUFHSUMgfHwgIW5ldGlmX3J1bm5pbmcoc2wtPmRldikpCisJCXJldHVybjsKKworCisJLyogUmVhZCB0aGUgY2hhcmFjdGVycyBvdXQgb2YgdGhlIGJ1ZmZlciAqLworCXdoaWxlIChjb3VudC0tKSB7CisJCWlmIChmcCAmJiAqZnArKykgeworCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFNMRl9FUlJPUiwgJnNsLT5mbGFncykpICB7CisJCQkJc2wtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJfQorCQkJY3ArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCXgyNV9hc3lfdW5lc2Moc2wsICpjcCsrKTsKKwl9Cit9CisKKy8qCisgKiBPcGVuIHRoZSBoaWdoLWxldmVsIHBhcnQgb2YgdGhlIFguMjUgY2hhbm5lbC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBUVFkgbW9kdWxlIHdoZW4gdGhlCisgKiBYLjI1IGxpbmUgZGlzY2lwbGluZSBpcyBjYWxsZWQgZm9yLiAgQmVjYXVzZSB3ZSBhcmUKKyAqIHN1cmUgdGhlIHR0eSBsaW5lIGV4aXN0cywgd2Ugb25seSBoYXZlIHRvIGxpbmsgaXQgdG8KKyAqIGEgZnJlZSBYLjI1IGNoYW5uZWwuLi4KKyAqLworCitzdGF0aWMgaW50IHgyNV9hc3lfb3Blbl90dHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgeDI1X2FzeSAqc2wgPSAoc3RydWN0IHgyNV9hc3kgKikgdHR5LT5kaXNjX2RhdGE7CisJaW50IGVycjsKKworCS8qIEZpcnN0IG1ha2Ugc3VyZSB3ZSdyZSBub3QgYWxyZWFkeSBjb25uZWN0ZWQuICovCisJaWYgKHNsICYmIHNsLT5tYWdpYyA9PSBYMjVfQVNZX01BR0lDKSB7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCS8qIE9LLiAgRmluZCBhIGZyZWUgWC4yNSBjaGFubmVsIHRvIHVzZS4gKi8KKwlpZiAoKHNsID0geDI1X2FzeV9hbGxvYygpKSA9PSBOVUxMKSB7CisJCXJldHVybiAtRU5GSUxFOworCX0KKworCXNsLT50dHkgPSB0dHk7CisJdHR5LT5kaXNjX2RhdGEgPSBzbDsKKwlpZiAodHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcikgIHsKKwkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOworCX0KKwlpZiAodHR5LT5sZGlzYy5mbHVzaF9idWZmZXIpICB7CisJCXR0eS0+bGRpc2MuZmx1c2hfYnVmZmVyKHR0eSk7CisJfQorCisJLyogUmVzdG9yZSBkZWZhdWx0IHNldHRpbmdzICovCisJc2wtPmRldi0+dHlwZSA9IEFSUEhSRF9YMjU7CisJCisJLyogUGVyZm9ybSB0aGUgbG93LWxldmVsIFguMjUgYXN5bmMgaW5pdCAqLworCWlmICgoZXJyID0geDI1X2FzeV9vcGVuKHNsLT5kZXYpKSkKKwkJcmV0dXJuIGVycjsKKworCS8qIERvbmUuICBXZSBoYXZlIGxpbmtlZCB0aGUgVFRZIGxpbmUgdG8gYSBjaGFubmVsLiAqLworCXJldHVybiBzbC0+ZGV2LT5iYXNlX2FkZHI7Cit9CisKKworLyoKKyAqIENsb3NlIGRvd24gYW4gWC4yNSBjaGFubmVsLgorICogVGhpcyBtZWFucyBmbHVzaGluZyBvdXQgYW55IHBlbmRpbmcgcXVldWVzLCBhbmQgdGhlbiByZXN0b3JpbmcgdGhlCisgKiBUVFkgbGluZSBkaXNjaXBsaW5lIHRvIHdoYXQgaXQgd2FzIGJlZm9yZSBpdCBnb3QgaG9va2VkIHRvIFguMjUKKyAqICh3aGljaCB1c3VhbGx5IGlzIFRUWSBhZ2FpbikuCisgKi8KK3N0YXRpYyB2b2lkIHgyNV9hc3lfY2xvc2VfdHR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHgyNV9hc3kgKnNsID0gKHN0cnVjdCB4MjVfYXN5ICopIHR0eS0+ZGlzY19kYXRhOworCisJLyogRmlyc3QgbWFrZSBzdXJlIHdlJ3JlIGNvbm5lY3RlZC4gKi8KKwlpZiAoIXNsIHx8IHNsLT5tYWdpYyAhPSBYMjVfQVNZX01BR0lDKQorCQlyZXR1cm47CisKKwlpZiAoc2wtPmRldi0+ZmxhZ3MgJiBJRkZfVVApCisJeworCQkodm9pZCkgZGV2X2Nsb3NlKHNsLT5kZXYpOworCX0KKworCXR0eS0+ZGlzY19kYXRhID0gTlVMTDsKKwlzbC0+dHR5ID0gTlVMTDsKKwl4MjVfYXN5X2ZyZWUoc2wpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqeDI1X2FzeV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeDI1X2FzeSAqc2wgPSAoc3RydWN0IHgyNV9hc3kqKShkZXYtPnByaXYpOworCisJcmV0dXJuICZzbC0+c3RhdHM7Cit9CisKKworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgkJCVNUQU5EQVJEIFguMjUgRU5DQVBTVUxBVElPTgkJICAJICoKKyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgeDI1X2FzeV9lc2ModW5zaWduZWQgY2hhciAqcywgdW5zaWduZWQgY2hhciAqZCwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpwdHIgPSBkOworCXVuc2lnbmVkIGNoYXIgYzsKKworCS8qCisJICogU2VuZCBhbiBpbml0aWFsIEVORCBjaGFyYWN0ZXIgdG8gZmx1c2ggb3V0IGFueQorCSAqIGRhdGEgdGhhdCBtYXkgaGF2ZSBhY2N1bXVsYXRlZCBpbiB0aGUgcmVjZWl2ZXIKKwkgKiBkdWUgdG8gbGluZSBub2lzZS4KKwkgKi8KKworCSpwdHIrKyA9IFgyNV9FTkQ7CS8qIFNlbmQgMTAxMTExMTAgYml0IHNlcSAqLworCisJLyoKKwkgKiBGb3IgZWFjaCBieXRlIGluIHRoZSBwYWNrZXQsIHNlbmQgdGhlIGFwcHJvcHJpYXRlCisJICogY2hhcmFjdGVyIHNlcXVlbmNlLCBhY2NvcmRpbmcgdG8gdGhlIFguMjUgcHJvdG9jb2wuCisJICovCisKKwl3aGlsZSAobGVuLS0gPiAwKSAKKwl7CisJCXN3aXRjaChjID0gKnMrKykgCisJCXsKKwkJCWNhc2UgWDI1X0VORDoKKwkJCQkqcHRyKysgPSBYMjVfRVNDOworCQkJCSpwdHIrKyA9IFgyNV9FU0NBUEUoWDI1X0VORCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFgyNV9FU0M6CisJCQkJKnB0cisrID0gWDI1X0VTQzsKKwkJCQkqcHRyKysgPSBYMjVfRVNDQVBFKFgyNV9FU0MpOworCQkJCWJyZWFrOworCQkJIGRlZmF1bHQ6CisJCQkJKnB0cisrID0gYzsKKwkJCQlicmVhazsKKwkJfQorCX0KKwkqcHRyKysgPSBYMjVfRU5EOworCXJldHVybiAocHRyIC0gZCk7Cit9CisKK3N0YXRpYyB2b2lkIHgyNV9hc3lfdW5lc2Moc3RydWN0IHgyNV9hc3kgKnNsLCB1bnNpZ25lZCBjaGFyIHMpCit7CisKKwlzd2l0Y2gocykgCisJeworCQljYXNlIFgyNV9FTkQ6CisJCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChTTEZfRVJST1IsICZzbC0+ZmxhZ3MpICYmIChzbC0+cmNvdW50ID4gMikpICAKKwkJCXsKKwkJCQl4MjVfYXN5X2J1bXAoc2wpOworCQkJfQorCQkJY2xlYXJfYml0KFNMRl9FU0NBUEUsICZzbC0+ZmxhZ3MpOworCQkJc2wtPnJjb3VudCA9IDA7CisJCQlyZXR1cm47CisKKwkJY2FzZSBYMjVfRVNDOgorCQkJc2V0X2JpdChTTEZfRVNDQVBFLCAmc2wtPmZsYWdzKTsKKwkJCXJldHVybjsKKwkJCQorCQljYXNlIFgyNV9FU0NBUEUoWDI1X0VTQyk6CisJCWNhc2UgWDI1X0VTQ0FQRShYMjVfRU5EKToKKwkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU0xGX0VTQ0FQRSwgJnNsLT5mbGFncykpCisJCQkJcyA9IFgyNV9VTkVTQ0FQRShzKTsKKwkJCWJyZWFrOworCX0KKwlpZiAoIXRlc3RfYml0KFNMRl9FUlJPUiwgJnNsLT5mbGFncykpICAKKwl7CisJCWlmIChzbC0+cmNvdW50IDwgc2wtPmJ1ZmZzaXplKSAgCisJCXsKKwkJCXNsLT5yYnVmZltzbC0+cmNvdW50KytdID0gczsKKwkJCXJldHVybjsKKwkJfQorCQlzbC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKwkJc2V0X2JpdChTTEZfRVJST1IsICZzbC0+ZmxhZ3MpOworCX0KK30KKworCisvKiBQZXJmb3JtIEkvTyBjb250cm9sIG9uIGFuIGFjdGl2ZSBYLjI1IGNoYW5uZWwuICovCitzdGF0aWMgaW50IHgyNV9hc3lfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgdW5zaWduZWQgaW50IGNtZCwgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB4MjVfYXN5ICpzbCA9IChzdHJ1Y3QgeDI1X2FzeSAqKSB0dHktPmRpc2NfZGF0YTsKKworCS8qIEZpcnN0IG1ha2Ugc3VyZSB3ZSdyZSBjb25uZWN0ZWQuICovCisJaWYgKCFzbCB8fCBzbC0+bWFnaWMgIT0gWDI1X0FTWV9NQUdJQykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBTSU9DR0lGTkFNRToKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIHNsLT5kZXYtPm5hbWUsCisJCQkJCXN0cmxlbihzbC0+ZGV2LT5uYW1lKSArIDEpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCWNhc2UgU0lPQ1NJRkhXQUREUjoKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyogQWxsb3cgc3R0eSB0byByZWFkLCBidXQgbm90IHNldCwgdGhlIHNlcmlhbCBwb3J0ICovCisJY2FzZSBUQ0dFVFM6CisJY2FzZSBUQ0dFVEE6CisJCXJldHVybiBuX3R0eV9pb2N0bCh0dHksIGZpbGUsIGNtZCwgYXJnKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KK30KKworc3RhdGljIGludCB4MjVfYXN5X29wZW5fZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHgyNV9hc3kgKnNsID0gKHN0cnVjdCB4MjVfYXN5KikoZGV2LT5wcml2KTsKKwlpZihzbC0+dHR5PT1OVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gMDsKK30KKworLyogSW5pdGlhbGlzZSB0aGUgWC4yNSBkcml2ZXIuICBDYWxsZWQgYnkgdGhlIGRldmljZSBpbml0IGNvZGUgKi8KK3N0YXRpYyB2b2lkIHgyNV9hc3lfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeDI1X2FzeSAqc2wgPSBkZXYtPnByaXY7CisKKwlzbC0+bWFnaWMgID0gWDI1X0FTWV9NQUdJQzsKKwlzbC0+ZGV2CSAgID0gZGV2OworCXNwaW5fbG9ja19pbml0KCZzbC0+bG9jayk7CisJc2V0X2JpdChTTEZfSU5VU0UsICZzbC0+ZmxhZ3MpOworCisJLyoKKwkgKglGaW5pc2ggc2V0dGluZyB1cCB0aGUgREVWSUNFIGluZm8uIAorCSAqLworCSAKKwlkZXYtPm10dQkJPSBTTF9NVFU7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSB4MjVfYXN5X3htaXQ7CisJZGV2LT50eF90aW1lb3V0CQk9IHgyNV9hc3lfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gSFoqMjA7CisJZGV2LT5vcGVuCQk9IHgyNV9hc3lfb3Blbl9kZXY7CisJZGV2LT5zdG9wCQk9IHgyNV9hc3lfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMJICAgICAgICA9IHgyNV9hc3lfZ2V0X3N0YXRzOworCWRldi0+Y2hhbmdlX210dQkJPSB4MjVfYXN5X2NoYW5nZV9tdHU7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4JPSAwOworCWRldi0+YWRkcl9sZW4JCT0gMDsKKwlkZXYtPnR5cGUJCT0gQVJQSFJEX1gyNTsKKwlkZXYtPnR4X3F1ZXVlX2xlbgk9IDEwOworCisJLyogTmV3LXN0eWxlIGZsYWdzLiAqLworCWRldi0+ZmxhZ3MJCT0gSUZGX05PQVJQOworfQorCitzdGF0aWMgc3RydWN0IHR0eV9sZGlzYyB4MjVfbGRpc2MgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5tYWdpYwkJPSBUVFlfTERJU0NfTUFHSUMsCisJLm5hbWUJCT0gIlguMjUiLAorCS5vcGVuCQk9IHgyNV9hc3lfb3Blbl90dHksCisJLmNsb3NlCQk9IHgyNV9hc3lfY2xvc2VfdHR5LAorCS5pb2N0bAkJPSB4MjVfYXN5X2lvY3RsLAorCS5yZWNlaXZlX2J1Zgk9IHgyNV9hc3lfcmVjZWl2ZV9idWYsCisJLnJlY2VpdmVfcm9vbQk9IHgyNV9hc3lfcmVjZWl2ZV9yb29tLAorCS53cml0ZV93YWtldXAJPSB4MjVfYXN5X3dyaXRlX3dha2V1cCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfeDI1X2FzeSh2b2lkKQoreworCWlmICh4MjVfYXN5X21heGRldiA8IDQpCisJCXgyNV9hc3lfbWF4ZGV2ID0gNDsgLyogU2FuaXR5ICovCisKKwlwcmludGsoS0VSTl9JTkZPICJYLjI1IGFzeW5jOiB2ZXJzaW9uIDAuMDAgQUxQSEEgIgorCQkJIihkeW5hbWljIGNoYW5uZWxzLCBtYXg9JWQpLlxuIiwgeDI1X2FzeV9tYXhkZXYgKTsKKworCXgyNV9hc3lfZGV2cyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlICopKngyNV9hc3lfbWF4ZGV2LCAKKwkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXgyNV9hc3lfZGV2cykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJYMjUgYXN5bmM6IENhbid0IGFsbG9jYXRlIHgyNV9hc3lfY3RybHNbXSAiCisJCQkJImFycmF5ISBVYWFyZ2ghICgtPiBObyBYLjI1IGF2YWlsYWJsZSlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHgyNV9hc3lfZGV2cywgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlICopKngyNV9hc3lfbWF4ZGV2KTsgCisKKwlyZXR1cm4gdHR5X3JlZ2lzdGVyX2xkaXNjKE5fWDI1LCAmeDI1X2xkaXNjKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF94MjVfYXN5KHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB4MjVfYXN5X21heGRldjsgaSsrKSB7CisJCWRldiA9IHgyNV9hc3lfZGV2c1tpXTsKKwkJaWYgKGRldikgeworCQkJc3RydWN0IHgyNV9hc3kgKnNsID0gZGV2LT5wcml2OworCisJCQlzcGluX2xvY2tfYmgoJnNsLT5sb2NrKTsKKwkJCWlmIChzbC0+dHR5KSAKKwkJCQl0dHlfaGFuZ3VwKHNsLT50dHkpOworCisJCQlzcGluX3VubG9ja19iaCgmc2wtPmxvY2spOworCQkJLyoKKwkJCSAqIFZTViA9IGlmIGRldi0+c3RhcnQ9PTAsIHRoZW4gZGV2aWNlCisJCQkgKiB1bnJlZ2lzdGVyZWQgd2hpbGUgY2xvc2UgcHJvYy4KKwkJCSAqLworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCWZyZWVfbmV0ZGV2KGRldik7CisJCX0KKwl9CisKKwlrZnJlZSh4MjVfYXN5X2RldnMpOworCXR0eV9yZWdpc3Rlcl9sZGlzYyhOX1gyNSwgTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfeDI1X2FzeSk7Cittb2R1bGVfZXhpdChleGl0X3gyNV9hc3kpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3gyNV9hc3kuaCBiL2RyaXZlcnMvbmV0L3dhbi94MjVfYXN5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3NzAyMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi94MjVfYXN5LmgKQEAgLTAsMCArMSw1MCBAQAorI2lmbmRlZiBfTElOVVhfWDI1X0FTWV9ICisjZGVmaW5lIF9MSU5VWF9YMjVfQVNZX0gKKworLyogWC4yNSBhc3kgY29uZmlndXJhdGlvbi4gKi8KKyNkZWZpbmUgU0xfTlJVTklUCTI1NgkJLyogTUFYIG51bWJlciBvZiBYLjI1IGNoYW5uZWxzOworCQkJCQkgICBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIHdpdGgKKwkJCQkJICAgaW5zbW9kIC1veDI1X2FzeV9tYXhkZXY9bm5uCSovCisjZGVmaW5lIFNMX01UVQkJMjU2CQorCisvKiBYMjUgYXN5bmMgcHJvdG9jb2wgY2hhcmFjdGVycy4gKi8KKyNkZWZpbmUgWDI1X0VORCAgICAgICAgIDB4N0UJCS8qIGluZGljYXRlcyBlbmQgb2YgZnJhbWUJKi8KKyNkZWZpbmUgWDI1X0VTQyAgICAgICAgIDB4N0QJCS8qIGluZGljYXRlcyBieXRlIHN0dWZmaW5nCSovCisjZGVmaW5lIFgyNV9FU0NBUEUoeCkJKCh4KV4weDIwKQorI2RlZmluZSBYMjVfVU5FU0NBUEUoeCkJKCh4KV4weDIwKQorCisKK3N0cnVjdCB4MjVfYXN5IHsKKyAgaW50CQkJbWFnaWM7CisKKyAgLyogVmFyaW91cyBmaWVsZHMuICovCisgIHNwaW5sb2NrX3QJCWxvY2s7CisgIHN0cnVjdCB0dHlfc3RydWN0CSp0dHk7CQkvKiBwdHIgdG8gVFRZIHN0cnVjdHVyZQkJKi8KKyAgc3RydWN0IG5ldF9kZXZpY2UJKmRldjsJCS8qIGVhc3kgZm9yIGludHIgaGFuZGxpbmcJKi8KKworICAvKiBUaGVzZSBhcmUgcG9pbnRlcnMgdG8gdGhlIG1hbGxvYygpZWQgZnJhbWUgYnVmZmVycy4gKi8KKyAgdW5zaWduZWQgY2hhcgkJKnJidWZmOwkJLyogcmVjZWl2ZXIgYnVmZmVyCQkqLworICBpbnQgICAgICAgICAgICAgICAgICAgcmNvdW50OyAgICAgICAgIC8qIHJlY2VpdmVkIGNoYXJzIGNvdW50ZXIgICAgICAgKi8KKyAgdW5zaWduZWQgY2hhcgkJKnhidWZmOwkJLyogdHJhbnNtaXR0ZXIgYnVmZmVyCQkqLworICB1bnNpZ25lZCBjaGFyICAgICAgICAgKnhoZWFkOyAgICAgICAgIC8qIHBvaW50ZXIgdG8gbmV4dCBieXRlIHRvIFhNSVQgKi8KKyAgaW50ICAgICAgICAgICAgICAgICAgIHhsZWZ0OyAgICAgICAgICAvKiBieXRlcyBsZWZ0IGluIFhNSVQgcXVldWUgICAgICovCisKKyAgLyogWC4yNSBpbnRlcmZhY2Ugc3RhdGlzdGljcy4gKi8KKyAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisKKyAgaW50ICAgICAgICAgICAgICAgICAgIGJ1ZmZzaXplOyAgICAgICAvKiBNYXggYnVmZmVycyBzaXplcyAgICAgICAgICAgICovCisKKyAgdW5zaWduZWQgbG9uZwkJZmxhZ3M7CQkvKiBGbGFnIHZhbHVlcy8gbW9kZSBldGMJKi8KKyNkZWZpbmUgU0xGX0lOVVNFCTAJCS8qIENoYW5uZWwgaW4gdXNlICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU0xGX0VTQ0FQRQkxICAgICAgICAgICAgICAgLyogRVNDIHJlY2VpdmVkICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTTEZfRVJST1IJMiAgICAgICAgICAgICAgIC8qIFBhcml0eSwgZXRjLiBlcnJvciAgICAgICAgICAgKi8KKyNkZWZpbmUgU0xGX09VVFdBSVQJNAkJLyogV2FpdGluZyBmb3Igb3V0cHV0CQkqLworfTsKKworCisKKyNkZWZpbmUgWDI1X0FTWV9NQUdJQyAweDUzMDMKKworZXh0ZXJuIGludCB4MjVfYXN5X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKyNlbmRpZgkvKiBfTElOVVhfWDI1X0FTWS5IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vejg1MjMwLmMgYi9kcml2ZXJzL25ldC93YW4vejg1MjMwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FhNDhmMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dhbi96ODUyMzAuYwpAQCAtMCwwICsxLDE4NTEgQEAKKy8qCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCShjKSBDb3B5cmlnaHQgMTk5OCBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgorICoJKGMpIENvcHlyaWdodCAyMDAwLCAyMDAxIFJlZCBIYXQgSW5jCisgKgorICoJRGV2ZWxvcG1lbnQgb2YgdGhpcyBkcml2ZXIgd2FzIGZ1bmRlZCBieSBFcXVpaW5ldCBMdGQKKyAqCQkJaHR0cDovL3d3dy5lcXVpaW5ldC5jb20KKyAqCisgKglDaGFuZ2VMb2c6CisgKgorICoJQXN5bmNocm9ub3VzIG1vZGUgZHJvcHBlZCBmb3IgMi4yLiBGb3IgMi41IHdlIHdpbGwgYXR0ZW1wdCB0aGUKKyAqCXVuaWZpY2F0aW9uIG9mIGFsbCB0aGUgWjg1eDMwIGFzeW5jaHJvbm91cyBkcml2ZXJzIGZvciByZWFsLgorICoKKyAqCURNQSBub3cgdXNlcyBnZXRfZnJlZV9wYWdlIGFzIGttYWxsb2MgYnVmZmVycyBtYXkgc3BhbiBhIDY0SyAKKyAqCWJvdW5kYXJ5LgorICoKKyAqCU1vZGlmaWVkIGZvciBTTVAgc2FmZXR5IGFuZCBTTVAgbG9ja2luZyBieSBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqCVBlcmZvcm1hbmNlCisgKgorICoJWjg1MjMwOgorICoJTm9uIERNQSB5b3Ugd2FudCBhIDQ4NkRYNTAgb3IgYmV0dGVyIHRvIGRvIDY0S2JpdHMuIDk2MDAgYmF1ZAorICoJWC4yNSBpcyBub3QgdW5yZWFsaXN0aWMgb24gYWxsIG1hY2hpbmVzLiBETUEgbW9kZSBjYW4gaW4gdGhlb3J5CisgKgloYW5kbGUgVDEvRTEgcXVpdGUgbmljZWx5LiBJbiBwcmFjdGljZSB0aGUgbGltaXQgc2VlbXMgdG8gYmUgYWJvdXQKKyAqCTUxMktiaXQtPjFNYml0IGRlcGVuZGluZyBvbiBtb3RoZXJib2FyZC4KKyAqCisgKglaODVDMzA6CisgKgk2NEsgd2lsbCB0YWtlIERNQSwgOTYwMCBiYXVkIFguMjUgc2hvdWxkIGJlIG9rLgorICoKKyAqCVo4NTMwOgorICoJU3luY2hyb25vdXMgbW9kZSB3aXRob3V0IERNQSBpcyB1bmxpa2VseSB0byBwYXNzIGFib3V0IDI0MDAgYmF1ZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjZGVmaW5lIFJUX0xPQ0sKKyNkZWZpbmUgUlRfVU5MT0NLCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPG5ldC9zeW5jcHBwLmg+CisjaW5jbHVkZSAiejg1MjMwLmgiCisKKworLyoqCisgKgl6ODUzMF9yZWFkX3BvcnQgLSBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgaW50ZXJmYWNlIGZ1bmN0aW9uCisgKglAcDogcG9ydCB0byByZWFkCisgKgorICoJUHJvdmlkZWQgcG9ydCBhY2Nlc3MgbWV0aG9kcy4gVGhlIENvbXRyb2wgU1YxMSByZXF1aXJlcyBubyBkZWxheXMKKyAqCWJldHdlZW4gYWNjZXNzZXMgYW5kIHVzZXMgUEMgSS9PLiBTb21lIGRyaXZlcnMgbWF5IG5lZWQgYSA1dVMgZGVsYXkKKyAqCQorICoJSW4gdGhlIGxvbmdlciB0ZXJtIHRoaXMgc2hvdWxkIGJlY29tZSBhbiBhcmNoaXRlY3R1cmUgc3BlY2lmaWMKKyAqCXNlY3Rpb24gc28gdGhhdCB0aGlzIGNhbiBiZWNvbWUgYSBnZW5lcmljIGRyaXZlciBpbnRlcmZhY2UgZm9yIGFsbAorICoJcGxhdGZvcm1zLiBGb3Igbm93IHdlIG9ubHkgaGFuZGxlIFBDIEkvTyBwb3J0cyB3aXRoIG9yIHdpdGhvdXQgdGhlCisgKglkcmVhZCA1dVMgc2FuaXR5IGRlbGF5LgorICoKKyAqCVRoZSBjYWxsZXIgbXVzdCBob2xkIHN1ZmZpY2llbnQgbG9ja3MgdG8gYXZvaWQgdmlvbGF0aW5nIHRoZSBob3JyaWJsZQorICoJNXVTIGRlbGF5IHJ1bGUuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgejg1MzBfcmVhZF9wb3J0KHVuc2lnbmVkIGxvbmcgcCkKK3sKKwl1OCByPWluYihaODUzMF9QT1JUX09GKHApKTsKKwlpZihwJlo4NTMwX1BPUlRfU0xFRVApCS8qIGdjYyBzaG91bGQgZmlndXJlIHRoaXMgb3V0IGVmZmljaWVudGx5ICEgKi8KKwkJdWRlbGF5KDUpOworCXJldHVybiByOworfQorCisvKioKKyAqCXo4NTMwX3dyaXRlX3BvcnQgLSBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgaW50ZXJmYWNlIGZ1bmN0aW9uCisgKglAcDogcG9ydCB0byB3cml0ZQorICoJQGQ6IHZhbHVlIHRvIHdyaXRlCisgKgorICoJV3JpdGUgYSB2YWx1ZSB0byBhIHBvcnQgd2l0aCBkZWxheXMgaWYgbmVlZCBiZS4gTm90ZSB0aGF0IHRoZQorICoJY2FsbGVyIG11c3QgaG9sZCBsb2NrcyB0byBhdm9pZCByZWFkL3dyaXRlcyBmcm9tIG90aGVyIGNvbnRleHRzCisgKgl2aW9sYXRpbmcgdGhlIDV1UyBydWxlCisgKgorICoJSW4gdGhlIGxvbmdlciB0ZXJtIHRoaXMgc2hvdWxkIGJlY29tZSBhbiBhcmNoaXRlY3R1cmUgc3BlY2lmaWMKKyAqCXNlY3Rpb24gc28gdGhhdCB0aGlzIGNhbiBiZWNvbWUgYSBnZW5lcmljIGRyaXZlciBpbnRlcmZhY2UgZm9yIGFsbAorICoJcGxhdGZvcm1zLiBGb3Igbm93IHdlIG9ubHkgaGFuZGxlIFBDIEkvTyBwb3J0cyB3aXRoIG9yIHdpdGhvdXQgdGhlCisgKglkcmVhZCA1dVMgc2FuaXR5IGRlbGF5LgorICovCisKKworc3RhdGljIGlubGluZSB2b2lkIHo4NTMwX3dyaXRlX3BvcnQodW5zaWduZWQgbG9uZyBwLCB1OCBkKQoreworCW91dGIoZCxaODUzMF9QT1JUX09GKHApKTsKKwlpZihwJlo4NTMwX1BPUlRfU0xFRVApCisJCXVkZWxheSg1KTsKK30KKworCisKK3N0YXRpYyB2b2lkIHo4NTMwX3J4X2RvbmUoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMpOworc3RhdGljIHZvaWQgejg1MzBfdHhfZG9uZShzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYyk7CisKKworLyoqCisgKglyZWFkX3pzcmVnIC0gUmVhZCBhIHJlZ2lzdGVyIGZyb20gYSBaODUyMzAgCisgKglAYzogWjg1MzAgY2hhbm5lbCB0byByZWFkIGZyb20gKDIgcGVyIGNoaXApCisgKglAcmVnOiBSZWdpc3RlciB0byByZWFkCisgKglGSVhNRTogVXNlIGEgc3BpbmxvY2suCisgKgkKKyAqCU1vc3Qgb2YgdGhlIFo4NTMwIHJlZ2lzdGVycyBhcmUgaW5kZXhlZCBvZmYgdGhlIGNvbnRyb2wgcmVnaXN0ZXJzLgorICoJQSByZWFkIGlzIGRvbmUgYnkgd3JpdGluZyB0byB0aGUgY29udHJvbCByZWdpc3RlciBhbmQgcmVhZGluZyB0aGUKKyAqCXJlZ2lzdGVyIGJhY2suICBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgbG9jaworICovCisgCitzdGF0aWMgaW5saW5lIHU4IHJlYWRfenNyZWcoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMsIHU4IHJlZykKK3sKKwlpZihyZWcpCisJCXo4NTMwX3dyaXRlX3BvcnQoYy0+Y3RybGlvLCByZWcpOworCXJldHVybiB6ODUzMF9yZWFkX3BvcnQoYy0+Y3RybGlvKTsKK30KKworLyoqCisgKglyZWFkX3pzZGF0YSAtIFJlYWQgdGhlIGRhdGEgcG9ydCBvZiBhIFo4NTMwIGNoYW5uZWwKKyAqCUBjOiBUaGUgWjg1MzAgY2hhbm5lbCB0byByZWFkIHRoZSBkYXRhIHBvcnQgZnJvbQorICoKKyAqCVRoZSBkYXRhIHBvcnQgcHJvdmlkZXMgZmFzdCBhY2Nlc3MgdG8gc29tZSB0aGluZ3MuIFdlIHN0aWxsCisgKgloYXZlIGFsbCB0aGUgNXVTIGRlbGF5cyB0byB3b3JyeSBhYm91dC4KKyAqLworCitzdGF0aWMgaW5saW5lIHU4IHJlYWRfenNkYXRhKHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXU4IHI7CisJcj16ODUzMF9yZWFkX3BvcnQoYy0+ZGF0YWlvKTsKKwlyZXR1cm4gcjsKK30KKworLyoqCisgKgl3cml0ZV96c3JlZyAtIFdyaXRlIHRvIGEgWjg1MzAgY2hhbm5lbCByZWdpc3RlcgorICoJQGM6IFRoZSBaODUzMCBjaGFubmVsCisgKglAcmVnOiBSZWdpc3RlciBudW1iZXIKKyAqCUB2YWw6IFZhbHVlIHRvIHdyaXRlCisgKgorICoJV3JpdGUgYSB2YWx1ZSB0byBhbiBpbmRleGVkIHJlZ2lzdGVyLiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgbG9jaworICoJdG8gaG9ub3VyIHRoZSBpcnJpdGF0aW5nIGRlbGF5IHJ1bGVzLiBXZSBrbm93IGFib3V0IHJlZ2lzdGVyIDAKKyAqCWJlaW5nIGZhc3QgdG8gYWNjZXNzLgorICoKKyAqICAgICAgQXNzdW1lcyBjLT5sb2NrIGlzIGhlbGQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV96c3JlZyhzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYywgdTggcmVnLCB1OCB2YWwpCit7CisJaWYocmVnKQorCQl6ODUzMF93cml0ZV9wb3J0KGMtPmN0cmxpbywgcmVnKTsKKwl6ODUzMF93cml0ZV9wb3J0KGMtPmN0cmxpbywgdmFsKTsKKworfQorCisvKioKKyAqCXdyaXRlX3pzY3RybCAtIFdyaXRlIHRvIGEgWjg1MzAgY29udHJvbCByZWdpc3RlcgorICoJQGM6IFRoZSBaODUzMCBjaGFubmVsCisgKglAdmFsOiBWYWx1ZSB0byB3cml0ZQorICoKKyAqCVdyaXRlIGRpcmVjdGx5IHRvIHRoZSBjb250cm9sIHJlZ2lzdGVyIG9uIHRoZSBaODUzMAorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV96c2N0cmwoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMsIHU4IHZhbCkKK3sKKwl6ODUzMF93cml0ZV9wb3J0KGMtPmN0cmxpbywgdmFsKTsKK30KKworLyoqCisgKgl3cml0ZV96c2RhdGEgLSBXcml0ZSB0byBhIFo4NTMwIGNvbnRyb2wgcmVnaXN0ZXIKKyAqCUBjOiBUaGUgWjg1MzAgY2hhbm5lbAorICoJQHZhbDogVmFsdWUgdG8gd3JpdGUKKyAqCisgKglXcml0ZSBkaXJlY3RseSB0byB0aGUgZGF0YSByZWdpc3RlciBvbiB0aGUgWjg1MzAKKyAqLworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV96c2RhdGEoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMsIHU4IHZhbCkKK3sKKwl6ODUzMF93cml0ZV9wb3J0KGMtPmRhdGFpbywgdmFsKTsKK30KKworLyoKKyAqCVJlZ2lzdGVyIGxvYWRpbmcgcGFyYW1ldGVycyBmb3IgYSBkZWFkIHBvcnQKKyAqLworIAordTggejg1MzBfZGVhZF9wb3J0W109Cit7CisJMjU1Cit9OworCitFWFBPUlRfU1lNQk9MKHo4NTMwX2RlYWRfcG9ydCk7CisKKy8qCisgKglSZWdpc3RlciBsb2FkaW5nIHBhcmFtZXRlcnMgZm9yIGN1cnJlbnRseSBzdXBwb3J0ZWQgY2lyY3VpdCB0eXBlcworICovCisKKworLyoKKyAqCURhdGEgY2xvY2tlZCBieSB0ZWxjbyBlbmQuIFRoaXMgaXMgdGhlIGNvcnJlY3QgZGF0YSBmb3IgdGhlIFVLCisgKgkia2lsb3N0cmVhbSIgc2VydmljZSwgYW5kIG1vc3Qgb3RoZXIgc2ltaWxhciBzZXJ2aWNlcy4KKyAqLworIAordTggejg1MzBfaGRsY19raWxvc3RyZWFtW109Cit7CisJNCwJU1lOQ19FTkFCfFNETEN8WDFDTEssCisJMiwJMCwJLyogTm8gdmVjdG9yICovCisJMSwJMCwKKwkzLAlFTlRfSE18UnhDUkNfRU5BQnxSeDgsCisJNSwJVHhDUkNfRU5BQnxSVFN8VHhFTkFCfFR4OHxEVFIsCisJOSwJMCwJCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCTYsCTB4RkYsCisJNywJRkxBRywKKwkxMCwJQUJVTkRFUnxOUlp8Q1JDUFMsLypNQVJLSURMRSA/PyovCisJMTEsCVRDVFJ4Q1AsCisJMTQsCURJU0RQTEwsCisJMTUsCURDRElFfFNZTkNJRXxDVFNJRXxUeFVJRXxCUktJRSwKKwkxLAlFWFRfSU5UX0VOQUJ8VHhJTlRfRU5BQnxJTlRfQUxMX1J4LAorCTksCU5WfE1JRXxOT1JFU0VULAorCTI1NQorfTsKKworRVhQT1JUX1NZTUJPTCh6ODUzMF9oZGxjX2tpbG9zdHJlYW0pOworCisvKgorICoJQXMgYWJvdmUgYnV0IGZvciBlbmhhbmNlZCBjaGlwcy4KKyAqLworIAordTggejg1MzBfaGRsY19raWxvc3RyZWFtXzg1MjMwW109Cit7CisJNCwJU1lOQ19FTkFCfFNETEN8WDFDTEssCisJMiwJMCwJLyogTm8gdmVjdG9yICovCisJMSwJMCwKKwkzLAlFTlRfSE18UnhDUkNfRU5BQnxSeDgsCisJNSwJVHhDUkNfRU5BQnxSVFN8VHhFTkFCfFR4OHxEVFIsCisJOSwJMCwJCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCTYsCTB4RkYsCisJNywJRkxBRywKKwkxMCwJQUJVTkRFUnxOUlp8Q1JDUFMsCS8qIE1BUktJRExFPz8gKi8KKwkxMSwJVENUUnhDUCwKKwkxNCwJRElTRFBMTCwKKwkxNSwJRENESUV8U1lOQ0lFfENUU0lFfFR4VUlFfEJSS0lFLAorCTEsCUVYVF9JTlRfRU5BQnxUeElOVF9FTkFCfElOVF9BTExfUngsCisJOSwJTlZ8TUlFfE5PUkVTRVQsCisJMjMsCTMsCQkvKiBFeHRlbmRlZCBtb2RlIEFVVE8gVFggYW5kIEVPTSovCisJCisJMjU1Cit9OworCitFWFBPUlRfU1lNQk9MKHo4NTMwX2hkbGNfa2lsb3N0cmVhbV84NTIzMCk7CisKKy8qKgorICoJejg1MzBfZmx1c2hfZmlmbyAtIEZsdXNoIG9uIGNoaXAgUlggRklGTworICoJQGM6IENoYW5uZWwgdG8gZmx1c2gKKyAqCisgKglGbHVzaCB0aGUgcmVjZWl2ZSBGSUZPLiBUaGVyZSBpcyBubyBzcGVjaWZpYyBvcHRpb24gZm9yIHRoaXMsIHdlIAorICoJYmxpbmRseSByZWFkIGJ5dGVzIGFuZCBkaXNjYXJkIHRoZW0uIFJlYWRpbmcgd2hlbiB0aGVyZSBpcyBubyBkYXRhCisgKglpcyBoYXJtbGVzcy4gVGhlIDg1MzAgaGFzIGEgNCBieXRlIEZJRk8sIHRoZSA4NTIzMCBoYXMgOCBieXRlcy4KKyAqCQorICoJQWxsIGxvY2tpbmcgaXMgaGFuZGxlZCBmb3IgdGhlIGNhbGxlci4gT24gcmV0dXJuIGRhdGEgbWF5IHN0aWxsIGJlCisgKglwcmVzZW50IGlmIGl0IGFycml2ZWQgZHVyaW5nIHRoZSBmbHVzaC4KKyAqLworIAorc3RhdGljIHZvaWQgejg1MzBfZmx1c2hfZmlmbyhzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYykKK3sKKwlyZWFkX3pzcmVnKGMsIFIxKTsKKwlyZWFkX3pzcmVnKGMsIFIxKTsKKwlyZWFkX3pzcmVnKGMsIFIxKTsKKwlyZWFkX3pzcmVnKGMsIFIxKTsKKwlpZihjLT5kZXYtPnR5cGU9PVo4NTIzMCkKKwl7CisJCXJlYWRfenNyZWcoYywgUjEpOworCQlyZWFkX3pzcmVnKGMsIFIxKTsKKwkJcmVhZF96c3JlZyhjLCBSMSk7CisJCXJlYWRfenNyZWcoYywgUjEpOworCX0KK30JCisKKy8qKgorICoJejg1MzBfcnRzZHRyIC0gQ29udHJvbCB0aGUgb3V0Z29pbmcgRFRTL1JUUyBsaW5lCisgKglAYzogVGhlIFo4NTMwIGNoYW5uZWwgdG8gY29udHJvbDsKKyAqCUBzZXQ6IDEgdG8gc2V0LCAwIHRvIGNsZWFyCisgKgorICoJU2V0cyBvciBjbGVhcnMgRFRSL1JUUyBvbiB0aGUgcmVxdWVzdGVkIGxpbmUuIEFsbCBsb2NraW5nIGlzIGhhbmRsZWQKKyAqCWJ5IHRoZSBjYWxsZXIuIEZvciBub3cgd2UgYXNzdW1lIGFsbCBib2FyZHMgdXNlIHRoZSBhY3R1YWwgUlRTL0RUUgorICoJb24gdGhlIGNoaXAuIEFwcGFyZW50bHkgb25lIG9yIHR3byBkb24ndC4gV2UnbGwgc2NyZWFtIGFib3V0IHRoZW0KKyAqCWxhdGVyLgorICovCisKK3N0YXRpYyB2b2lkIHo4NTMwX3J0c2R0cihzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYywgaW50IHNldCkKK3sKKwlpZiAoc2V0KQorCQljLT5yZWdzWzVdIHw9IChSVFMgfCBEVFIpOworCWVsc2UKKwkJYy0+cmVnc1s1XSAmPSB+KFJUUyB8IERUUik7CisJd3JpdGVfenNyZWcoYywgUjUsIGMtPnJlZ3NbNV0pOworfQorCisvKioKKyAqCXo4NTMwX3J4IC0gSGFuZGxlIGEgUElPIHJlY2VpdmUgZXZlbnQKKyAqCUBjOiBaODUzMCBjaGFubmVsIHRvIHByb2Nlc3MKKyAqCisgKglSZWNlaXZlIGhhbmRsZXIgZm9yIHJlY2VpdmluZyBpbiBQSU8gbW9kZS4gVGhpcyBpcyBtdWNoIGxpa2UgdGhlIAorICoJYXN5bmMgb25lIGJ1dCBub3QgcXVpdGUgdGhlIHNhbWUgb3IgYXMgY29tcGxleAorICoKKyAqCU5vdGU6IEl0cyBpbnRlbmRlZCB0aGF0IHRoaXMgaGFuZGxlciBjYW4gZWFzaWx5IGJlIHNlcGFyYXRlZCBmcm9tCisgKgl0aGUgbWFpbiBjb2RlIHRvIHJ1biByZWFsdGltZS4gVGhhdCdsbCBiZSBuZWVkZWQgZm9yIHNvbWUgbWFjaGluZXMKKyAqCShlZyB0byBldmVyIGNsb2NrIDY0a2JpdHMgb24gYSBzcGFyYyA7KSkuCisgKgorICoJVGhlIFJUX0xPQ0sgbWFjcm9zIGRvbid0IGRvIGFueXRoaW5nIG5vdy4gS2VlcCB0aGUgY29kZSBjb3ZlcmVkCisgKglieSB0aGVtIGFzIHNob3J0IGFzIHBvc3NpYmxlIGluIGFsbCBjaXJjdW1zdGFuY2VzIC0gY2xvY2tzIGNvc3QKKyAqCWJhdWQuIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBpcyBhc3N1bWVkIHRvIGJlIGF0b21pYyB3LnIudC4gdG8KKyAqCW90aGVyIGNvZGUgLSB0aGlzIGlzIHRydWUgaW4gdGhlIFJUIGNhc2UgdG9vLgorICoKKyAqCVdlIG9ubHkgY292ZXIgdGhlIHN5bmMgY2FzZXMgZm9yIHRoaXMuIElmIHlvdSB3YW50IDJNYml0IGFzeW5jCisgKglkbyBpdCB5b3Vyc2VsZiBidXQgY29uc2lkZXIgbWVkaWNhbCBhc3Npc3RhbmNlIGZpcnN0LiBUaGlzIG5vbiBETUEgCisgKglzeW5jaHJvbm91cyBtb2RlIGlzIHBvcnRhYmxlIGNvZGUuIFRoZSBETUEgbW9kZSBhc3N1bWVzIFBDSSBsaWtlIAorICoJSVNBIERNQQorICoKKyAqCUNhbGxlZCB3aXRoIHRoZSBkZXZpY2UgbG9jayBoZWxkCisgKi8KKyAKK3N0YXRpYyB2b2lkIHo4NTMwX3J4KHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXU4IGNoLHN0YXQ7CisJc3Bpbl9sb2NrKGMtPmxvY2spOworIAorCXdoaWxlKDEpCisJeworCQkvKiBGSUZPIGVtcHR5ID8gKi8KKwkJaWYoIShyZWFkX3pzcmVnKGMsIFIwKSYxKSkKKwkJCWJyZWFrOworCQljaD1yZWFkX3pzZGF0YShjKTsKKwkJc3RhdD1yZWFkX3pzcmVnKGMsIFIxKTsKKwkKKwkJLyoKKwkJICoJT3ZlcnJ1biA/CisJCSAqLworCQlpZihjLT5jb3VudCA8IGMtPm1heCkKKwkJeworCQkJKmMtPmRwdHIrKz1jaDsKKwkJCWMtPmNvdW50Kys7CisJCX0KKworCQlpZihzdGF0JkVORF9GUikKKwkJeworCQkKKwkJCS8qCisJCQkgKglFcnJvciA/CisJCQkgKi8KKwkJCWlmKHN0YXQmKFJ4X09WUnxDUkNfRVJSKSkKKwkJCXsKKwkJCQkvKiBSZXdpbmQgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuICovCisJCQkJaWYoYy0+c2tiKQorCQkJCQljLT5kcHRyPWMtPnNrYi0+ZGF0YTsKKwkJCQljLT5jb3VudD0wOworCQkJCWlmKHN0YXQmUnhfT1ZSKQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG92ZXJydW5cbiIsIGMtPmRldi0+bmFtZSk7CisJCQkJCWMtPnJ4X292ZXJydW4rKzsKKwkJCQl9CisJCQkJaWYoc3RhdCZDUkNfRVJSKQorCQkJCXsKKwkJCQkJYy0+cnhfY3JjX2VycisrOworCQkJCQkvKiBwcmludGsoImNyYyBlcnJvclxuIik7ICovCisJCQkJfQorCQkJCS8qIFNob3ZlIHRoZSBmcmFtZSB1cHN0cmVhbSAqLworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qCisJCQkJICoJRHJvcCB0aGUgbG9jayBmb3IgUlggcHJvY2Vzc2luZywgb3IKKwkJIAkJICoJdGhlcmUgYXJlIGRlYWRsb2NrcworCQkgCQkgKi8KKwkJCQl6ODUzMF9yeF9kb25lKGMpOworCQkJCXdyaXRlX3pzY3RybChjLCBSRVNfUnhfQ1JDKTsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqCUNsZWFyIGlycQorCSAqLworCXdyaXRlX3pzY3RybChjLCBFUlJfUkVTKTsKKwl3cml0ZV96c2N0cmwoYywgUkVTX0hfSVVTKTsKKwlzcGluX3VubG9jayhjLT5sb2NrKTsKK30KKworCisvKioKKyAqCXo4NTMwX3R4IC0gSGFuZGxlIGEgUElPIHRyYW5zbWl0IGV2ZW50CisgKglAYzogWjg1MzAgY2hhbm5lbCB0byBwcm9jZXNzCisgKgorICoJWjg1MzAgdHJhbnNtaXQgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBQSU8gbW9kZS4gVGhlIGJhc2ljCisgKglpZGVhIGlzIHRvIGF0dGVtcHQgdG8ga2VlcCB0aGUgRklGTyBmZWQuIFdlIGZpbGwgYXMgbWFueSBieXRlcworICoJaW4gYXMgcG9zc2libGUsIGl0cyBxdWl0ZSBwb3NzaWJsZSB0aGF0IHdlIHdvbid0IGtlZXAgdXAgd2l0aCB0aGUKKyAqCWRhdGEgcmF0ZSBvdGhlcndpc2UuCisgKi8KKyAKK3N0YXRpYyB2b2lkIHo4NTMwX3R4KHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXNwaW5fbG9jayhjLT5sb2NrKTsKKwl3aGlsZShjLT50eGNvdW50KSB7CisJCS8qIEZJRk8gZnVsbCA/ICovCisJCWlmKCEocmVhZF96c3JlZyhjLCBSMCkmNCkpCisJCQlicmVhazsKKwkJYy0+dHhjb3VudC0tOworCQkvKgorCQkgKglTaG92ZWwgb3V0IHRoZSBieXRlCisJCSAqLworCQl3cml0ZV96c3JlZyhjLCBSOCwgKmMtPnR4X3B0cisrKTsKKwkJd3JpdGVfenNjdHJsKGMsIFJFU19IX0lVUyk7CisJCS8qIFdlIGFyZSBhYm91dCB0byB1bmRlcmZsb3cgKi8KKwkJaWYoYy0+dHhjb3VudD09MCkKKwkJeworCQkJd3JpdGVfenNjdHJsKGMsIFJFU19FT01fTCk7CisJCQl3cml0ZV96c3JlZyhjLCBSMTAsIGMtPnJlZ3NbMTBdJn5BQlVOREVSKTsKKwkJfQorCX0KKworCQorCS8qCisJICoJRW5kIG9mIGZyYW1lIFRYIC0gZmlyZSBhbm90aGVyIG9uZQorCSAqLworCSAKKwl3cml0ZV96c2N0cmwoYywgUkVTX1R4X1ApOworCisJejg1MzBfdHhfZG9uZShjKTsJIAorCXdyaXRlX3pzY3RybChjLCBSRVNfSF9JVVMpOworCXNwaW5fdW5sb2NrKGMtPmxvY2spOworfQorCisvKioKKyAqCXo4NTMwX3N0YXR1cyAtIEhhbmRsZSBhIFBJTyBzdGF0dXMgZXhjZXB0aW9uCisgKglAY2hhbjogWjg1MzAgY2hhbm5lbCB0byBwcm9jZXNzCisgKgorICoJQSBzdGF0dXMgZXZlbnQgb2NjdXJyZWQgaW4gUElPIHN5bmNocm9ub3VzIG1vZGUuIFRoZXJlIGFyZSBzZXZlcmFsCisgKglyZWFzb25zIHRoZSBjaGlwIHdpbGwgYm90aGVyIHVzIGhlcmUuIEEgdHJhbnNtaXQgdW5kZXJydW4gbWVhbnMgd2UKKyAqCWZhaWxlZCB0byBmZWVkIHRoZSBjaGlwIGZhc3QgZW5vdWdoIGFuZCBqdXN0IGJyb2tlIGEgcGFja2V0LiBBIERDRAorICoJY2hhbmdlIGlzIGEgbGluZSB1cCBvciBkb3duLiBXZSBjb21tdW5pY2F0ZSB0aGF0IGJhY2sgdG8gdGhlIHByb3RvY29sCisgKglsYXllciBmb3Igc3luY2hyb25vdXMgUFBQIHRvIHJlbmVnb3RpYXRlLgorICovCisKK3N0YXRpYyB2b2lkIHo4NTMwX3N0YXR1cyhzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqY2hhbikKK3sKKwl1OCBzdGF0dXMsIGFsdGVyZWQ7CisKKwlzcGluX2xvY2soY2hhbi0+bG9jayk7CisJc3RhdHVzPXJlYWRfenNyZWcoY2hhbiwgUjApOworCWFsdGVyZWQ9Y2hhbi0+c3RhdHVzXnN0YXR1czsKKwkKKwljaGFuLT5zdGF0dXM9c3RhdHVzOworCQorCWlmKHN0YXR1cyZUeEVPTSkKKwl7CisvKgkJcHJpbnRrKCIlczogVHggdW5kZXJydW4uXG4iLCBjaGFuLT5kZXYtPm5hbWUpOyAqLworCQljaGFuLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQl3cml0ZV96c2N0cmwoY2hhbiwgRVJSX1JFUyk7CisJCXo4NTMwX3R4X2RvbmUoY2hhbik7CisJfQorCQkKKwlpZihhbHRlcmVkJmNoYW4tPmRjZGNoZWNrKQorCXsKKwkJaWYoc3RhdHVzJmNoYW4tPmRjZGNoZWNrKQorCQl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRENEIHJhaXNlZFxuIiwgY2hhbi0+ZGV2LT5uYW1lKTsKKwkJCXdyaXRlX3pzcmVnKGNoYW4sIFIzLCBjaGFuLT5yZWdzWzNdfFJ4RU5BQkxFKTsKKwkJCWlmKGNoYW4tPm5ldGRldmljZSAmJgorCQkJICAgICgoY2hhbi0+bmV0ZGV2aWNlLT50eXBlID09IEFSUEhSRF9IRExDKSB8fAorCQkJICAgIChjaGFuLT5uZXRkZXZpY2UtPnR5cGUgPT0gQVJQSFJEX1BQUCkpKQorCQkJCXNwcHBfcmVvcGVuKGNoYW4tPm5ldGRldmljZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcmludGsoS0VSTl9JTkZPICIlczogRENEIGxvc3RcbiIsIGNoYW4tPmRldi0+bmFtZSk7CisJCQl3cml0ZV96c3JlZyhjaGFuLCBSMywgY2hhbi0+cmVnc1szXSZ+UnhFTkFCTEUpOworCQkJejg1MzBfZmx1c2hfZmlmbyhjaGFuKTsKKwkJfQorCQkKKwl9CQorCXdyaXRlX3pzY3RybChjaGFuLCBSRVNfRVhUX0lOVCk7CisJd3JpdGVfenNjdHJsKGNoYW4sIFJFU19IX0lVUyk7CisJc3Bpbl91bmxvY2soY2hhbi0+bG9jayk7Cit9CisKK3N0cnVjdCB6ODUzMF9pcnFoYW5kbGVyIHo4NTMwX3N5bmM9Cit7CisJejg1MzBfcngsCisJejg1MzBfdHgsCisJejg1MzBfc3RhdHVzCit9OworCitFWFBPUlRfU1lNQk9MKHo4NTMwX3N5bmMpOworCisvKioKKyAqCXo4NTMwX2RtYV9yeCAtIEhhbmRsZSBhIERNQSBSWCBldmVudAorICoJQGNoYW46IENoYW5uZWwgdG8gaGFuZGxlCisgKgorICoJTm9uIGJ1cyBtYXN0ZXJpbmcgRE1BIGludGVyZmFjZXMgZm9yIHRoZSBaOHgzMCBkZXZpY2VzLiBUaGlzCisgKglpcyByZWFsbHkgcHJldHR5IFBDIHNwZWNpZmljLiBUaGUgRE1BIG1vZGUgbWVhbnMgdGhhdCBtb3N0IHJlY2VpdmUKKyAqCWV2ZW50cyBhcmUgaGFuZGxlZCBieSB0aGUgRE1BIGhhcmR3YXJlLiBXZSBnZXQgYSBraWNrIGhlcmUgb25seSBpZgorICoJYSBmcmFtZSBlbmRlZC4KKyAqLworIAorc3RhdGljIHZvaWQgejg1MzBfZG1hX3J4KHN0cnVjdCB6ODUzMF9jaGFubmVsICpjaGFuKQoreworCXNwaW5fbG9jayhjaGFuLT5sb2NrKTsKKwlpZihjaGFuLT5yeGRtYV9vbikKKwl7CisJCS8qIFNwZWNpYWwgY29uZGl0aW9uIGNoZWNrIG9ubHkgKi8KKwkJdTggc3RhdHVzOworCQorCQlyZWFkX3pzcmVnKGNoYW4sIFI3KTsKKwkJcmVhZF96c3JlZyhjaGFuLCBSNik7CisJCQorCQlzdGF0dXM9cmVhZF96c3JlZyhjaGFuLCBSMSk7CisJCisJCWlmKHN0YXR1cyZFTkRfRlIpCisJCXsKKwkJCXo4NTMwX3J4X2RvbmUoY2hhbik7CS8qIEZpcmUgdXAgdGhlIG5leHQgb25lICovCisJCX0JCQorCQl3cml0ZV96c2N0cmwoY2hhbiwgRVJSX1JFUyk7CisJCXdyaXRlX3pzY3RybChjaGFuLCBSRVNfSF9JVVMpOworCX0KKwllbHNlCisJeworCQkvKiBETUEgaXMgb2ZmIHJpZ2h0IG5vdywgZHJhaW4gdGhlIHNsb3cgd2F5ICovCisJCXo4NTMwX3J4KGNoYW4pOworCX0JCisJc3Bpbl91bmxvY2soY2hhbi0+bG9jayk7Cit9CisKKy8qKgorICoJejg1MzBfZG1hX3R4IC0gSGFuZGxlIGEgRE1BIFRYIGV2ZW50CisgKglAY2hhbjoJVGhlIFo4NTMwIGNoYW5uZWwgdG8gaGFuZGxlCisgKgorICoJV2UgaGF2ZSByZWNlaXZlZCBhbiBpbnRlcnJ1cHQgd2hpbGUgZG9pbmcgRE1BIHRyYW5zbWlzc2lvbnMuIEl0CisgKglzaG91bGRuJ3QgaGFwcGVuLiBTY3JlYW0gbG91ZGx5IGlmIGl0IGRvZXMuCisgKi8KKyAKK3N0YXRpYyB2b2lkIHo4NTMwX2RtYV90eChzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqY2hhbikKK3sKKwlzcGluX2xvY2soY2hhbi0+bG9jayk7CisJaWYoIWNoYW4tPmRtYV90eCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkhleSB3aG8gdHVybmVkIHRoZSBETUEgb2ZmP1xuIik7CisJCXo4NTMwX3R4KGNoYW4pOworCQlyZXR1cm47CisJfQorCS8qIFRoaXMgc2hvdWxkbnQgb2NjdXIgaW4gRE1BIG1vZGUgKi8KKwlwcmludGsoS0VSTl9FUlIgIkRNQSB0eCAtIGJvZ3VzIGV2ZW50IVxuIik7CisJejg1MzBfdHgoY2hhbik7CisJc3Bpbl91bmxvY2soY2hhbi0+bG9jayk7Cit9CisKKy8qKgorICoJejg1MzBfZG1hX3N0YXR1cyAtIEhhbmRsZSBhIERNQSBzdGF0dXMgZXhjZXB0aW9uCisgKglAY2hhbjogWjg1MzAgY2hhbm5lbCB0byBwcm9jZXNzCisgKgkKKyAqCUEgc3RhdHVzIGV2ZW50IG9jY3VycmVkIG9uIHRoZSBaODUzMC4gV2UgcmVjZWl2ZSB0aGVzZSBmb3IgdHdvIHJlYXNvbnMKKyAqCXdoZW4gaW4gRE1BIG1vZGUuIEZpcnN0bHkgaWYgd2UgZmluaXNoZWQgYSBwYWNrZXQgdHJhbnNmZXIgd2UgZ2V0IG9uZQorICoJYW5kIGtpY2sgdGhlIG5leHQgcGFja2V0IG91dC4gU2Vjb25kbHkgd2UgbWF5IHNlZSBhIERDRCBjaGFuZ2UgYW5kCisgKgloYXZlIHRvIHBva2UgdGhlIHByb3RvY29sIGxheWVyLgorICoKKyAqLworIAorc3RhdGljIHZvaWQgejg1MzBfZG1hX3N0YXR1cyhzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqY2hhbikKK3sKKwl1OCBzdGF0dXMsIGFsdGVyZWQ7CisKKwlzdGF0dXM9cmVhZF96c3JlZyhjaGFuLCBSMCk7CisJYWx0ZXJlZD1jaGFuLT5zdGF0dXNec3RhdHVzOworCQorCWNoYW4tPnN0YXR1cz1zdGF0dXM7CisKKworCWlmKGNoYW4tPmRtYV90eCkKKwl7CisJCWlmKHN0YXR1cyZUeEVPTSkKKwkJeworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwkJCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJCQlkaXNhYmxlX2RtYShjaGFuLT50eGRtYSk7CisJCQljbGVhcl9kbWFfZmYoY2hhbi0+dHhkbWEpOwkKKwkJCWNoYW4tPnR4ZG1hX29uPTA7CisJCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwkJCXo4NTMwX3R4X2RvbmUoY2hhbik7CisJCX0KKwl9CisKKwlzcGluX2xvY2soY2hhbi0+bG9jayk7CisJaWYoYWx0ZXJlZCZjaGFuLT5kY2RjaGVjaykKKwl7CisJCWlmKHN0YXR1cyZjaGFuLT5kY2RjaGVjaykKKwkJeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IERDRCByYWlzZWRcbiIsIGNoYW4tPmRldi0+bmFtZSk7CisJCQl3cml0ZV96c3JlZyhjaGFuLCBSMywgY2hhbi0+cmVnc1szXXxSeEVOQUJMRSk7CisJCQlpZihjaGFuLT5uZXRkZXZpY2UgJiYKKwkJCSAgICAoKGNoYW4tPm5ldGRldmljZS0+dHlwZSA9PSBBUlBIUkRfSERMQykgfHwKKwkJCSAgICAoY2hhbi0+bmV0ZGV2aWNlLT50eXBlID09IEFSUEhSRF9QUFApKSkKKwkJCQlzcHBwX3Jlb3BlbihjaGFuLT5uZXRkZXZpY2UpOworCQl9CisJCWVsc2UKKwkJeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6RENEIGxvc3RcbiIsIGNoYW4tPmRldi0+bmFtZSk7CisJCQl3cml0ZV96c3JlZyhjaGFuLCBSMywgY2hhbi0+cmVnc1szXSZ+UnhFTkFCTEUpOworCQkJejg1MzBfZmx1c2hfZmlmbyhjaGFuKTsKKwkJfQorCX0JCisKKwl3cml0ZV96c2N0cmwoY2hhbiwgUkVTX0VYVF9JTlQpOworCXdyaXRlX3pzY3RybChjaGFuLCBSRVNfSF9JVVMpOworCXNwaW5fdW5sb2NrKGNoYW4tPmxvY2spOworfQorCitzdHJ1Y3Qgejg1MzBfaXJxaGFuZGxlciB6ODUzMF9kbWFfc3luYz0KK3sKKwl6ODUzMF9kbWFfcngsCisJejg1MzBfZG1hX3R4LAorCXo4NTMwX2RtYV9zdGF0dXMKK307CisKK0VYUE9SVF9TWU1CT0woejg1MzBfZG1hX3N5bmMpOworCitzdHJ1Y3Qgejg1MzBfaXJxaGFuZGxlciB6ODUzMF90eGRtYV9zeW5jPQoreworCXo4NTMwX3J4LAorCXo4NTMwX2RtYV90eCwKKwl6ODUzMF9kbWFfc3RhdHVzCit9OworCitFWFBPUlRfU1lNQk9MKHo4NTMwX3R4ZG1hX3N5bmMpOworCisvKioKKyAqCXo4NTMwX3J4X2NsZWFyIC0gSGFuZGxlIFJYIGV2ZW50cyBmcm9tIGEgc3RvcHBlZCBjaGlwCisgKglAYzogWjg1MzAgY2hhbm5lbCB0byBzaHV0IHVwCisgKgorICoJUmVjZWl2ZSBpbnRlcnJ1cHQgdmVjdG9ycyBmb3IgYSBaODUzMCB0aGF0IGlzIGluICdwYXJrZWQnIG1vZGUuCisgKglGb3IgbWFjaGluZXMgd2l0aCBQQ0kgWjg1eDMwIGNhcmRzLCBvciBsZXZlbCB0cmlnZ2VyZWQgaW50ZXJydXB0cworICoJKGVnIHRoZSBNYWNJSSkgd2UgbXVzdCBjbGVhciB0aGUgaW50ZXJydXB0IGNhdXNlIG9yIGRpZS4KKyAqLworCisKK3N0YXRpYyB2b2lkIHo4NTMwX3J4X2NsZWFyKHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCS8qCisJICoJRGF0YSBhbmQgc3RhdHVzIGJ5dGVzCisJICovCisJdTggc3RhdDsKKworCXJlYWRfenNkYXRhKGMpOworCXN0YXQ9cmVhZF96c3JlZyhjLCBSMSk7CisJCisJaWYoc3RhdCZFTkRfRlIpCisJCXdyaXRlX3pzY3RybChjLCBSRVNfUnhfQ1JDKTsKKwkvKgorCSAqCUNsZWFyIGlycQorCSAqLworCXdyaXRlX3pzY3RybChjLCBFUlJfUkVTKTsKKwl3cml0ZV96c2N0cmwoYywgUkVTX0hfSVVTKTsKK30KKworLyoqCisgKgl6ODUzMF90eF9jbGVhciAtIEhhbmRsZSBUWCBldmVudHMgZnJvbSBhIHN0b3BwZWQgY2hpcAorICoJQGM6IFo4NTMwIGNoYW5uZWwgdG8gc2h1dCB1cAorICoKKyAqCVRyYW5zbWl0IGludGVycnVwdCB2ZWN0b3JzIGZvciBhIFo4NTMwIHRoYXQgaXMgaW4gJ3BhcmtlZCcgbW9kZS4KKyAqCUZvciBtYWNoaW5lcyB3aXRoIFBDSSBaODV4MzAgY2FyZHMsIG9yIGxldmVsIHRyaWdnZXJlZCBpbnRlcnJ1cHRzCisgKgkoZWcgdGhlIE1hY0lJKSB3ZSBtdXN0IGNsZWFyIHRoZSBpbnRlcnJ1cHQgY2F1c2Ugb3IgZGllLgorICovCisKK3N0YXRpYyB2b2lkIHo4NTMwX3R4X2NsZWFyKHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXdyaXRlX3pzY3RybChjLCBSRVNfVHhfUCk7CisJd3JpdGVfenNjdHJsKGMsIFJFU19IX0lVUyk7Cit9CisKKy8qKgorICoJejg1MzBfc3RhdHVzX2NsZWFyIC0gSGFuZGxlIHN0YXR1cyBldmVudHMgZnJvbSBhIHN0b3BwZWQgY2hpcAorICoJQGNoYW46IFo4NTMwIGNoYW5uZWwgdG8gc2h1dCB1cAorICoKKyAqCVN0YXR1cyBpbnRlcnJ1cHQgdmVjdG9ycyBmb3IgYSBaODUzMCB0aGF0IGlzIGluICdwYXJrZWQnIG1vZGUuCisgKglGb3IgbWFjaGluZXMgd2l0aCBQQ0kgWjg1eDMwIGNhcmRzLCBvciBsZXZlbCB0cmlnZ2VyZWQgaW50ZXJydXB0cworICoJKGVnIHRoZSBNYWNJSSkgd2UgbXVzdCBjbGVhciB0aGUgaW50ZXJydXB0IGNhdXNlIG9yIGRpZS4KKyAqLworCitzdGF0aWMgdm9pZCB6ODUzMF9zdGF0dXNfY2xlYXIoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmNoYW4pCit7CisJdTggc3RhdHVzPXJlYWRfenNyZWcoY2hhbiwgUjApOworCWlmKHN0YXR1cyZUeEVPTSkKKwkJd3JpdGVfenNjdHJsKGNoYW4sIEVSUl9SRVMpOworCXdyaXRlX3pzY3RybChjaGFuLCBSRVNfRVhUX0lOVCk7CisJd3JpdGVfenNjdHJsKGNoYW4sIFJFU19IX0lVUyk7Cit9CisKK3N0cnVjdCB6ODUzMF9pcnFoYW5kbGVyIHo4NTMwX25vcD0KK3sKKwl6ODUzMF9yeF9jbGVhciwKKwl6ODUzMF90eF9jbGVhciwKKwl6ODUzMF9zdGF0dXNfY2xlYXIKK307CisKKworRVhQT1JUX1NZTUJPTCh6ODUzMF9ub3ApOworCisvKioKKyAqCXo4NTMwX2ludGVycnVwdCAtIEhhbmRsZSBhbiBpbnRlcnJ1cHQgZnJvbSBhIFo4NTMwCisgKglAaXJxOiAJSW50ZXJydXB0IG51bWJlcgorICoJQGRldl9pZDogVGhlIFo4NTMwIGRldmljZSB0aGF0IGlzIGludGVycnVwdGluZy4KKyAqCUByZWdzOiB1bnVzZWQKKyAqCisgKglBIFo4NVsyXTMwIGRldmljZSBoYXMgc3R1Y2sgaXRzIGhhbmQgaW4gdGhlIGFpciBmb3IgYXR0ZW50aW9uLgorICoJV2Ugc2NhbiBib3RoIHRoZSBjaGFubmVscyBvbiB0aGUgY2hpcCBmb3IgZXZlbnRzIGFuZCB0aGVuIGNhbGwKKyAqCXRoZSBjaGFubmVsIHNwZWNpZmljIGNhbGwgYmFja3MgZm9yIGVhY2ggY2hhbm5lbCB0aGF0IGhhcyBldmVudHMuCisgKglXZSBoYXZlIHRvIHVzZSBjYWxsYmFjayBmdW5jdGlvbnMgYmVjYXVzZSB0aGUgdHdvIGNoYW5uZWxzIGNhbiBiZQorICoJaW4gZGlmZmVyZW50IG1vZGVzLgorICoKKyAqCUxvY2tpbmcgaXMgZG9uZSBmb3IgdGhlIGhhbmRsZXJzLiBOb3RlIHRoYXQgbG9ja2luZyBpcyBkb25lCisgKglhdCB0aGUgY2hpcCBsZXZlbCAodGhlIDV1UyBkZWxheSBpc3N1ZSBpcyBwZXIgY2hpcCBub3QgcGVyCisgKgljaGFubmVsKS4gYy0+bG9jayBmb3IgYm90aCBjaGFubmVscyBwb2ludHMgdG8gZGV2LT5sb2NrCisgKi8KKworaXJxcmV0dXJuX3Qgejg1MzBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHo4NTMwX2RldiAqZGV2PWRldl9pZDsKKwl1OCBpbnRyOworCXN0YXRpYyB2b2xhdGlsZSBpbnQgbG9ja2VyPTA7CisJaW50IHdvcms9MDsKKwlzdHJ1Y3Qgejg1MzBfaXJxaGFuZGxlciAqaXJxczsKKwkKKwlpZihsb2NrZXIpCisJeworCQlwcmludGsoS0VSTl9FUlIgIklSUSByZS1lbnRlclxuIik7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJbG9ja2VyPTE7CisKKwlzcGluX2xvY2soJmRldi0+bG9jayk7CisKKwl3aGlsZSgrK3dvcms8NTAwMCkKKwl7CisKKwkJaW50ciA9IHJlYWRfenNyZWcoJmRldi0+Y2hhbkEsIFIzKTsKKwkJaWYoIShpbnRyICYgKENIQVJ4SVB8Q0hBVHhJUHxDSEFFWFR8Q0hCUnhJUHxDSEJUeElQfENIQkVYVCkpKQorCQkJYnJlYWs7CisJCisJCS8qIFRoaXMgaG9sZHMgdGhlIElSUSBzdGF0dXMuIE9uIHRoZSA4NTMwIHlvdSBtdXN0IHJlYWQgaXQgZnJvbSBjaGFuIAorCQkgICBBIGV2ZW4gdGhvdWdoIGl0IGFwcGxpZXMgdG8gdGhlIHdob2xlIGNoaXAgKi8KKwkJCisJCS8qIE5vdyB3YWxrIHRoZSBjaGlwIGFuZCBzZWUgd2hhdCBpdCBpcyB3YW50aW5nIC0gaXQgbWF5IGJlCisJCSAgIGFuIElSUSBmb3Igc29tZW9uZSBlbHNlIHJlbWVtYmVyICovCisJCSAgIAorCQlpcnFzPWRldi0+Y2hhbkEuaXJxczsKKworCQlpZihpbnRyICYgKENIQVJ4SVB8Q0hBVHhJUHxDSEFFWFQpKQorCQl7CisJCQlpZihpbnRyJkNIQVJ4SVApCisJCQkJaXJxcy0+cngoJmRldi0+Y2hhbkEpOworCQkJaWYoaW50ciZDSEFUeElQKQorCQkJCWlycXMtPnR4KCZkZXYtPmNoYW5BKTsKKwkJCWlmKGludHImQ0hBRVhUKQorCQkJCWlycXMtPnN0YXR1cygmZGV2LT5jaGFuQSk7CisJCX0KKworCQlpcnFzPWRldi0+Y2hhbkIuaXJxczsKKworCQlpZihpbnRyICYgKENIQlJ4SVB8Q0hCVHhJUHxDSEJFWFQpKQorCQl7CisJCQlpZihpbnRyJkNIQlJ4SVApCisJCQkJaXJxcy0+cngoJmRldi0+Y2hhbkIpOworCQkJaWYoaW50ciZDSEJUeElQKQorCQkJCWlycXMtPnR4KCZkZXYtPmNoYW5CKTsKKwkJCWlmKGludHImQ0hCRVhUKQorCQkJCWlycXMtPnN0YXR1cygmZGV2LT5jaGFuQik7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmRldi0+bG9jayk7CisJaWYod29yaz09NTAwMCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaW50ZXJydXB0IGphbW1lZCAtIGFib3J0KDB4JVgpIVxuIiwgZGV2LT5uYW1lLCBpbnRyKTsKKwkvKiBPayBhbGwgZG9uZSAqLworCWxvY2tlcj0wOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworRVhQT1JUX1NZTUJPTCh6ODUzMF9pbnRlcnJ1cHQpOworCitzdGF0aWMgY2hhciByZWdfaW5pdFsxNl09Cit7CisJMCwwLDAsMCwKKwkwLDAsMCwwLAorCTAsMCwwLDAsCisJMHg1NSwwLDAsMAorfTsKKworCisvKioKKyAqCXo4NTMwX3N5bmNfb3BlbiAtIE9wZW4gYSBaODUzMCBjaGFubmVsIGZvciBQSU8KKyAqCUBkZXY6CVRoZSBuZXR3b3JrIGludGVyZmFjZSB3ZSBhcmUgdXNpbmcKKyAqCUBjOglUaGUgWjg1MzAgY2hhbm5lbCB0byBvcGVuIGluIHN5bmNocm9ub3VzIFBJTyBtb2RlCisgKgorICoJU3dpdGNoIGEgWjg1MzAgaW50byBzeW5jaHJvbm91cyBtb2RlIHdpdGhvdXQgRE1BIGFzc2lzdC4gV2UKKyAqCXJhaXNlIHRoZSBSVFMvRFRSIGFuZCBjb21tZW5jZSBuZXR3b3JrIG9wZXJhdGlvbi4KKyAqLworIAoraW50IHo4NTMwX3N5bmNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoYy0+bG9jaywgZmxhZ3MpOworCisJYy0+c3luYyA9IDE7CisJYy0+bXR1ID0gZGV2LT5tdHUrNjQ7CisJYy0+Y291bnQgPSAwOworCWMtPnNrYiA9IE5VTEw7CisJYy0+c2tiMiA9IE5VTEw7CisJYy0+aXJxcyA9ICZ6ODUzMF9zeW5jOworCisJLyogVGhpcyBsb2FkcyB0aGUgZG91YmxlIGJ1ZmZlciB1cCAqLworCXo4NTMwX3J4X2RvbmUoYyk7CS8qIExvYWQgdGhlIGZyYW1lIHJpbmcgKi8KKwl6ODUzMF9yeF9kb25lKGMpOwkvKiBMb2FkIHRoZSBiYWNrdXAgZnJhbWUgKi8KKwl6ODUzMF9ydHNkdHIoYywxKTsKKwljLT5kbWFfdHggPSAwOworCWMtPnJlZ3NbUjFdfD1UeElOVF9FTkFCOworCXdyaXRlX3pzcmVnKGMsIFIxLCBjLT5yZWdzW1IxXSk7CisJd3JpdGVfenNyZWcoYywgUjMsIGMtPnJlZ3NbUjNdfFJ4RU5BQkxFKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYy0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisKK0VYUE9SVF9TWU1CT0woejg1MzBfc3luY19vcGVuKTsKKworLyoqCisgKgl6ODUzMF9zeW5jX2Nsb3NlIC0gQ2xvc2UgYSBQSU8gWjg1MzAgY2hhbm5lbAorICoJQGRldjogTmV0d29yayBkZXZpY2UgdG8gY2xvc2UKKyAqCUBjOiBaODUzMCBjaGFubmVsIHRvIGRpc2Fzc29jaWF0ZSBhbmQgbW92ZSB0byBpZGxlCisgKgorICoJQ2xvc2UgZG93biBhIFo4NTMwIGludGVyZmFjZSBhbmQgc3dpdGNoIGl0cyBpbnRlcnJ1cHQgaGFuZGxlcnMKKyAqCXRvIGRpc2NhcmQgZnV0dXJlIGV2ZW50cy4KKyAqLworIAoraW50IHo4NTMwX3N5bmNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMpCit7CisJdTggY2hrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoYy0+bG9jaywgZmxhZ3MpOworCWMtPmlycXMgPSAmejg1MzBfbm9wOworCWMtPm1heCA9IDA7CisJYy0+c3luYyA9IDA7CisJCisJY2hrPXJlYWRfenNyZWcoYyxSMCk7CisJd3JpdGVfenNyZWcoYywgUjMsIGMtPnJlZ3NbUjNdKTsKKwl6ODUzMF9ydHNkdHIoYywwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYy0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHo4NTMwX3N5bmNfY2xvc2UpOworCisvKioKKyAqCXo4NTMwX3N5bmNfZG1hX29wZW4gLSBPcGVuIGEgWjg1MzAgZm9yIERNQSBJL08KKyAqCUBkZXY6IFRoZSBuZXR3b3JrIGRldmljZSB0byBhdHRhY2gKKyAqCUBjOiBUaGUgWjg1MzAgY2hhbm5lbCB0byBjb25maWd1cmUgaW4gc3luYyBETUEgbW9kZS4KKyAqCisgKglTZXQgdXAgYSBaODV4MzAgZGV2aWNlIGZvciBzeW5jaHJvbm91cyBETUEgaW4gYm90aCBkaXJlY3Rpb25zLiBUd28KKyAqCUlTQSBETUEgY2hhbm5lbHMgbXVzdCBiZSBhdmFpbGFibGUgZm9yIHRoaXMgdG8gd29yay4gV2UgYXNzdW1lIElTQQorICoJRE1BIGRyaXZlbiBJL08gYW5kIFBDIGxpbWl0cyBvbiBhY2Nlc3MuCisgKi8KKyAKK2ludCB6ODUzMF9zeW5jX2RtYV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXVuc2lnbmVkIGxvbmcgY2ZsYWdzLCBkZmxhZ3M7CisJCisJYy0+c3luYyA9IDE7CisJYy0+bXR1ID0gZGV2LT5tdHUrNjQ7CisJYy0+Y291bnQgPSAwOworCWMtPnNrYiA9IE5VTEw7CisJYy0+c2tiMiA9IE5VTEw7CisJLyoKKwkgKglMb2FkIHRoZSBETUEgaW50ZXJmYWNlcyB1cAorCSAqLworCWMtPnJ4ZG1hX29uID0gMDsKKwljLT50eGRtYV9vbiA9IDA7CisJCisJLyoKKwkgKglBbGxvY2F0ZSB0aGUgRE1BIGZsaXAgYnVmZmVycy4gTGltaXQgYnkgcGFnZSBzaXplLgorCSAqCUV2ZXJ5b25lIHJ1bnMgMTUwMCBtdHUgb3IgbGVzcyBvbiB3YW4gbGlua3Mgc28gdGhpcworCSAqCXNob3VsZCBiZSBmaW5lLgorCSAqLworCSAKKwlpZihjLT5tdHUgID4gUEFHRV9TSVpFLzIpCisJCXJldHVybiAtRU1TR1NJWkU7CisJIAorCWMtPnJ4X2J1ZlswXT0odm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMfEdGUF9ETUEpOworCWlmKGMtPnJ4X2J1ZlswXT09TlVMTCkKKwkJcmV0dXJuIC1FTk9CVUZTOworCWMtPnJ4X2J1ZlsxXT1jLT5yeF9idWZbMF0rUEFHRV9TSVpFLzI7CisJCisJYy0+dHhfZG1hX2J1ZlswXT0odm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMfEdGUF9ETUEpOworCWlmKGMtPnR4X2RtYV9idWZbMF09PU5VTEwpCisJeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYy0+cnhfYnVmWzBdKTsKKwkJYy0+cnhfYnVmWzBdPU5VTEw7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisJYy0+dHhfZG1hX2J1ZlsxXT1jLT50eF9kbWFfYnVmWzBdK1BBR0VfU0laRS8yOworCisJYy0+dHhfZG1hX3VzZWQ9MDsKKwljLT5kbWFfdHggPSAxOworCWMtPmRtYV9udW09MDsKKwljLT5kbWFfcmVhZHk9MTsKKwkKKwkvKgorCSAqCUVuYWJsZSBETUEgY29udHJvbCBtb2RlCisJICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZShjLT5sb2NrLCBjZmxhZ3MpOworCSAKKwkvKgorCSAqCVRYIERNQSB2aWEgRElSL1JFUQorCSAqLworCSAKKwljLT5yZWdzW1IxNF18PSBEVFJSRVE7CisJd3JpdGVfenNyZWcoYywgUjE0LCBjLT5yZWdzW1IxNF0pOyAgICAgCisKKwljLT5yZWdzW1IxXSY9IH5UeElOVF9FTkFCOworCXdyaXRlX3pzcmVnKGMsIFIxLCBjLT5yZWdzW1IxXSk7CisJCisJLyoKKwkgKglSWCBETUEgdmlhIFcvUmVxCisJICovCSAKKworCWMtPnJlZ3NbUjFdfD0gV1RfRk5fUkRZRk47CisJYy0+cmVnc1tSMV18PSBXVF9SRFlfUlQ7CisJYy0+cmVnc1tSMV18PSBJTlRfRVJSX1J4OworCWMtPnJlZ3NbUjFdJj0gflR4SU5UX0VOQUI7CisJd3JpdGVfenNyZWcoYywgUjEsIGMtPnJlZ3NbUjFdKTsKKwljLT5yZWdzW1IxXXw9IFdUX1JEWV9FTkFCOworCXdyaXRlX3pzcmVnKGMsIFIxLCBjLT5yZWdzW1IxXSk7ICAgICAgICAgICAgCisJCisJLyoKKwkgKglETUEgaW50ZXJydXB0cworCSAqLworCSAKKwkvKgorCSAqCVNldCB1cCB0aGUgRE1BIGNvbmZpZ3VyYXRpb24KKwkgKi8JCisJIAorCWRmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCSAKKwlkaXNhYmxlX2RtYShjLT5yeGRtYSk7CisJY2xlYXJfZG1hX2ZmKGMtPnJ4ZG1hKTsKKwlzZXRfZG1hX21vZGUoYy0+cnhkbWEsIERNQV9NT0RFX1JFQUR8MHgxMCk7CisJc2V0X2RtYV9hZGRyKGMtPnJ4ZG1hLCB2aXJ0X3RvX2J1cyhjLT5yeF9idWZbMF0pKTsKKwlzZXRfZG1hX2NvdW50KGMtPnJ4ZG1hLCBjLT5tdHUpOworCWVuYWJsZV9kbWEoYy0+cnhkbWEpOworCisJZGlzYWJsZV9kbWEoYy0+dHhkbWEpOworCWNsZWFyX2RtYV9mZihjLT50eGRtYSk7CisJc2V0X2RtYV9tb2RlKGMtPnR4ZG1hLCBETUFfTU9ERV9XUklURSk7CisJZGlzYWJsZV9kbWEoYy0+dHhkbWEpOworCQorCXJlbGVhc2VfZG1hX2xvY2soZGZsYWdzKTsKKwkKKwkvKgorCSAqCVNlbGVjdCB0aGUgRE1BIGludGVycnVwdCBoYW5kbGVycworCSAqLworCisJYy0+cnhkbWFfb24gPSAxOworCWMtPnR4ZG1hX29uID0gMTsKKwljLT50eF9kbWFfdXNlZCA9IDE7CisJIAorCWMtPmlycXMgPSAmejg1MzBfZG1hX3N5bmM7CisJejg1MzBfcnRzZHRyKGMsMSk7CisJd3JpdGVfenNyZWcoYywgUjMsIGMtPnJlZ3NbUjNdfFJ4RU5BQkxFKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYy0+bG9jaywgY2ZsYWdzKTsKKwkKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTCh6ODUzMF9zeW5jX2RtYV9vcGVuKTsKKworLyoqCisgKgl6ODUzMF9zeW5jX2RtYV9jbG9zZSAtIENsb3NlIGRvd24gRE1BIEkvTworICoJQGRldjogTmV0d29yayBkZXZpY2UgdG8gZGV0YWNoCisgKglAYzogWjg1MzAgY2hhbm5lbCB0byBtb3ZlIGludG8gZGlzY2FyZCBtb2RlCisgKgorICoJU2h1dCBkb3duIGEgRE1BIG1vZGUgc3luY2hyb25vdXMgaW50ZXJmYWNlLiBIYWx0IHRoZSBETUEsIGFuZAorICoJZnJlZSB0aGUgYnVmZmVycy4KKyAqLworIAoraW50IHo4NTMwX3N5bmNfZG1hX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXU4IGNoazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWMtPmlycXMgPSAmejg1MzBfbm9wOworCWMtPm1heCA9IDA7CisJYy0+c3luYyA9IDA7CisJCisJLyoKKwkgKglEaXNhYmxlIHRoZSBQQyBETUEgY2hhbm5lbHMKKwkgKi8KKwkKKwlmbGFncz1jbGFpbV9kbWFfbG9jaygpOyAKKwlkaXNhYmxlX2RtYShjLT5yeGRtYSk7CisJY2xlYXJfZG1hX2ZmKGMtPnJ4ZG1hKTsKKwkKKwljLT5yeGRtYV9vbiA9IDA7CisJCisJZGlzYWJsZV9kbWEoYy0+dHhkbWEpOworCWNsZWFyX2RtYV9mZihjLT50eGRtYSk7CisJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJCisJYy0+dHhkbWFfb24gPSAwOworCWMtPnR4X2RtYV91c2VkID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKGMtPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICoJRGlzYWJsZSBETUEgY29udHJvbCBtb2RlCisJICovCisJIAorCWMtPnJlZ3NbUjFdJj0gfldUX1JEWV9FTkFCOworCXdyaXRlX3pzcmVnKGMsIFIxLCBjLT5yZWdzW1IxXSk7ICAgICAgICAgICAgCisJYy0+cmVnc1tSMV0mPSB+KFdUX1JEWV9SVHxXVF9GTl9SRFlGTnxJTlRfRVJSX1J4KTsKKwljLT5yZWdzW1IxXXw9IElOVF9BTExfUng7CisJd3JpdGVfenNyZWcoYywgUjEsIGMtPnJlZ3NbUjFdKTsKKwljLT5yZWdzW1IxNF0mPSB+RFRSUkVROworCXdyaXRlX3pzcmVnKGMsIFIxNCwgYy0+cmVnc1tSMTRdKTsgICAKKwkKKwlpZihjLT5yeF9idWZbMF0pCisJeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYy0+cnhfYnVmWzBdKTsKKwkJYy0+cnhfYnVmWzBdPU5VTEw7CisJfQorCWlmKGMtPnR4X2RtYV9idWZbMF0pCisJeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkICBsb25nKWMtPnR4X2RtYV9idWZbMF0pOworCQljLT50eF9kbWFfYnVmWzBdPU5VTEw7CisJfQorCWNoaz1yZWFkX3pzcmVnKGMsUjApOworCXdyaXRlX3pzcmVnKGMsIFIzLCBjLT5yZWdzW1IzXSk7CisJejg1MzBfcnRzZHRyKGMsMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHo4NTMwX3N5bmNfZG1hX2Nsb3NlKTsKKworLyoqCisgKgl6ODUzMF9zeW5jX3R4ZG1hX29wZW4gLSBPcGVuIGEgWjg1MzAgZm9yIFRYIGRyaXZlbiBETUEKKyAqCUBkZXY6IFRoZSBuZXR3b3JrIGRldmljZSB0byBhdHRhY2gKKyAqCUBjOiBUaGUgWjg1MzAgY2hhbm5lbCB0byBjb25maWd1cmUgaW4gc3luYyBETUEgbW9kZS4KKyAqCisgKglTZXQgdXAgYSBaODV4MzAgZGV2aWNlIGZvciBzeW5jaHJvbm91cyBETUEgdHJhbm1pc3Npb24uIE9uZQorICoJSVNBIERNQSBjaGFubmVsIG11c3QgYmUgYXZhaWxhYmxlIGZvciB0aGlzIHRvIHdvcmsuIFRoZSByZWNlaXZlCisgKglzaWRlIGlzIHJ1biBpbiBQSU8gbW9kZSwgYnV0IHRoZW4gaXQgaGFzIHRoZSBiaWdnZXIgRklGTy4KKyAqLworCitpbnQgejg1MzBfc3luY190eGRtYV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXVuc2lnbmVkIGxvbmcgY2ZsYWdzLCBkZmxhZ3M7CisKKwlwcmludGsoIk9wZW5pbmcgc3luYyBpbnRlcmZhY2UgZm9yIFRYLURNQVxuIik7CisJYy0+c3luYyA9IDE7CisJYy0+bXR1ID0gZGV2LT5tdHUrNjQ7CisJYy0+Y291bnQgPSAwOworCWMtPnNrYiA9IE5VTEw7CisJYy0+c2tiMiA9IE5VTEw7CisJCisJLyoKKwkgKglBbGxvY2F0ZSB0aGUgRE1BIGZsaXAgYnVmZmVycy4gTGltaXQgYnkgcGFnZSBzaXplLgorCSAqCUV2ZXJ5b25lIHJ1bnMgMTUwMCBtdHUgb3IgbGVzcyBvbiB3YW4gbGlua3Mgc28gdGhpcworCSAqCXNob3VsZCBiZSBmaW5lLgorCSAqLworCSAKKwlpZihjLT5tdHUgID4gUEFHRV9TSVpFLzIpCisJCXJldHVybiAtRU1TR1NJWkU7CisJIAorCWMtPnR4X2RtYV9idWZbMF09KHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTHxHRlBfRE1BKTsKKwlpZihjLT50eF9kbWFfYnVmWzBdPT1OVUxMKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwljLT50eF9kbWFfYnVmWzFdID0gYy0+dHhfZG1hX2J1ZlswXSArIFBBR0VfU0laRS8yOworCisKKwlzcGluX2xvY2tfaXJxc2F2ZShjLT5sb2NrLCBjZmxhZ3MpOworCisJLyoKKwkgKglMb2FkIHRoZSBQSU8gcmVjZWl2ZSByaW5nCisJICovCisKKwl6ODUzMF9yeF9kb25lKGMpOworCXo4NTMwX3J4X2RvbmUoYyk7CisKKyAJLyoKKwkgKglMb2FkIHRoZSBETUEgaW50ZXJmYWNlcyB1cAorCSAqLworCisJYy0+cnhkbWFfb24gPSAwOworCWMtPnR4ZG1hX29uID0gMDsKKwkKKwljLT50eF9kbWFfdXNlZD0wOworCWMtPmRtYV9udW09MDsKKwljLT5kbWFfcmVhZHk9MTsKKwljLT5kbWFfdHggPSAxOworCisgCS8qCisJICoJRW5hYmxlIERNQSBjb250cm9sIG1vZGUKKwkgKi8KKworIAkvKgorCSAqCVRYIERNQSB2aWEgRElSL1JFUQorIAkgKi8KKwljLT5yZWdzW1IxNF18PSBEVFJSRVE7CisJd3JpdGVfenNyZWcoYywgUjE0LCBjLT5yZWdzW1IxNF0pOyAgICAgCisJCisJYy0+cmVnc1tSMV0mPSB+VHhJTlRfRU5BQjsKKwl3cml0ZV96c3JlZyhjLCBSMSwgYy0+cmVnc1tSMV0pOworCQorCS8qCisJICoJU2V0IHVwIHRoZSBETUEgY29uZmlndXJhdGlvbgorCSAqLwkKKwkgCisJZGZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKKworCWRpc2FibGVfZG1hKGMtPnR4ZG1hKTsKKwljbGVhcl9kbWFfZmYoYy0+dHhkbWEpOworCXNldF9kbWFfbW9kZShjLT50eGRtYSwgRE1BX01PREVfV1JJVEUpOworCWRpc2FibGVfZG1hKGMtPnR4ZG1hKTsKKworCXJlbGVhc2VfZG1hX2xvY2soZGZsYWdzKTsKKwkKKwkvKgorCSAqCVNlbGVjdCB0aGUgRE1BIGludGVycnVwdCBoYW5kbGVycworCSAqLworCisJYy0+cnhkbWFfb24gPSAwOworCWMtPnR4ZG1hX29uID0gMTsKKwljLT50eF9kbWFfdXNlZCA9IDE7CisJIAorCWMtPmlycXMgPSAmejg1MzBfdHhkbWFfc3luYzsKKwl6ODUzMF9ydHNkdHIoYywxKTsKKwl3cml0ZV96c3JlZyhjLCBSMywgYy0+cmVnc1tSM118UnhFTkFCTEUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYy0+bG9jaywgY2ZsYWdzKTsKKwkKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTCh6ODUzMF9zeW5jX3R4ZG1hX29wZW4pOworCisvKioKKyAqCXo4NTMwX3N5bmNfdHhkbWFfY2xvc2UgLSBDbG9zZSBkb3duIGEgVFggZHJpdmVuIERNQSBjaGFubmVsCisgKglAZGV2OiBOZXR3b3JrIGRldmljZSB0byBkZXRhY2gKKyAqCUBjOiBaODUzMCBjaGFubmVsIHRvIG1vdmUgaW50byBkaXNjYXJkIG1vZGUKKyAqCisgKglTaHV0IGRvd24gYSBETUEvUElPIHNwbGl0IG1vZGUgc3luY2hyb25vdXMgaW50ZXJmYWNlLiBIYWx0IHRoZSBETUEsIAorICoJYW5kICBmcmVlIHRoZSBidWZmZXJzLgorICovCisKK2ludCB6ODUzMF9zeW5jX3R4ZG1hX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXVuc2lnbmVkIGxvbmcgZGZsYWdzLCBjZmxhZ3M7CisJdTggY2hrOworCisJCisJc3Bpbl9sb2NrX2lycXNhdmUoYy0+bG9jaywgY2ZsYWdzKTsKKwkKKwljLT5pcnFzID0gJno4NTMwX25vcDsKKwljLT5tYXggPSAwOworCWMtPnN5bmMgPSAwOworCQorCS8qCisJICoJRGlzYWJsZSB0aGUgUEMgRE1BIGNoYW5uZWxzCisJICovCisJIAorCWRmbGFncyA9IGNsYWltX2RtYV9sb2NrKCk7CisKKwlkaXNhYmxlX2RtYShjLT50eGRtYSk7CisJY2xlYXJfZG1hX2ZmKGMtPnR4ZG1hKTsKKwljLT50eGRtYV9vbiA9IDA7CisJYy0+dHhfZG1hX3VzZWQgPSAwOworCisJcmVsZWFzZV9kbWFfbG9jayhkZmxhZ3MpOworCisJLyoKKwkgKglEaXNhYmxlIERNQSBjb250cm9sIG1vZGUKKwkgKi8KKwkgCisJYy0+cmVnc1tSMV0mPSB+V1RfUkRZX0VOQUI7CisJd3JpdGVfenNyZWcoYywgUjEsIGMtPnJlZ3NbUjFdKTsgICAgICAgICAgICAKKwljLT5yZWdzW1IxXSY9IH4oV1RfUkRZX1JUfFdUX0ZOX1JEWUZOfElOVF9FUlJfUngpOworCWMtPnJlZ3NbUjFdfD0gSU5UX0FMTF9SeDsKKwl3cml0ZV96c3JlZyhjLCBSMSwgYy0+cmVnc1tSMV0pOworCWMtPnJlZ3NbUjE0XSY9IH5EVFJSRVE7CisJd3JpdGVfenNyZWcoYywgUjE0LCBjLT5yZWdzW1IxNF0pOyAgIAorCQorCWlmKGMtPnR4X2RtYV9idWZbMF0pCisJeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYy0+dHhfZG1hX2J1ZlswXSk7CisJCWMtPnR4X2RtYV9idWZbMF09TlVMTDsKKwl9CisJY2hrPXJlYWRfenNyZWcoYyxSMCk7CisJd3JpdGVfenNyZWcoYywgUjMsIGMtPnJlZ3NbUjNdKTsKKwl6ODUzMF9ydHNkdHIoYywwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYy0+bG9jaywgY2ZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworCitFWFBPUlRfU1lNQk9MKHo4NTMwX3N5bmNfdHhkbWFfY2xvc2UpOworCisKKy8qCisgKglOYW1lIHN0cmluZ3MgZm9yIFo4NTMwIGNoaXBzLiBTR0kgY2xhaW0gdG8gaGF2ZSBhIDEzMCwgWmlsb2cgZGVueQorICoJaXQgZXhpc3RzLi4uCisgKi8KKyAKK3N0YXRpYyBjaGFyICp6ODUzMF90eXBlX25hbWVbXT17CisJIlo4NTMwIiwKKwkiWjg1QzMwIiwKKwkiWjg1MjMwIgorfTsKKworLyoqCisgKgl6ODUzMF9kZXNjcmliZSAtIFVuaWZvcm1seSBkZXNjcmliZSBhIFo4NTMwIHBvcnQKKyAqCUBkZXY6IFo4NTMwIGRldmljZSB0byBkZXNjcmliZQorICoJQG1hcHBpbmc6IHN0cmluZyBob2xkaW5nIG1hcHBpbmcgdHlwZSAoZWcgIkkvTyIgb3IgIk1lbSIpCisgKglAaW86IHRoZSBwb3J0IHZhbHVlIGluIHF1ZXN0aW9uCisgKgorICoJRGVzY3JpYmUgYSBaODUzMCBpbiBhIHN0YW5kYXJkIGZvcm1hdC4gV2UgbXVzdCBwYXNzIHRoZSBJL08gYXMKKyAqCXRoZSBwb3J0IG9mZnNldCBpc250IHByZWRpY3RhYmxlLiBUaGUgbWFpbiByZWFzb24gZm9yIHRoaXMgZnVuY3Rpb24KKyAqCWlzIHRvIHRyeSBhbmQgZ2V0IGEgY29tbW9uIGZvcm1hdCBvZiByZXBvcnQuCisgKi8KKwordm9pZCB6ODUzMF9kZXNjcmliZShzdHJ1Y3Qgejg1MzBfZGV2ICpkZXYsIGNoYXIgKm1hcHBpbmcsIHVuc2lnbmVkIGxvbmcgaW8pCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGZvdW5kIGF0ICVzIDB4JWxYLCBJUlEgJWQuXG4iLAorCQlkZXYtPm5hbWUsIAorCQl6ODUzMF90eXBlX25hbWVbZGV2LT50eXBlXSwKKwkJbWFwcGluZywKKwkJWjg1MzBfUE9SVF9PRihpbyksCisJCWRldi0+aXJxKTsKK30KKworRVhQT1JUX1NZTUJPTCh6ODUzMF9kZXNjcmliZSk7CisKKy8qCisgKglMb2NrZWQgb3BlcmF0aW9uIHBhcnQgb2YgdGhlIHo4NTMwIGluaXQgY29kZQorICovCisgCitzdGF0aWMgaW5saW5lIGludCBkb196ODUzMF9pbml0KHN0cnVjdCB6ODUzMF9kZXYgKmRldikKK3sKKwkvKiBOT1AgdGhlIGludGVycnVwdCBoYW5kbGVycyBmaXJzdCAtIHdlIG1pZ2h0IGdldCBhCisJICAgZmxvYXRpbmcgSVJRIHRyYW5zaXRpb24gd2hlbiB3ZSByZXNldCB0aGUgY2hpcCAqLworCWRldi0+Y2hhbkEuaXJxcz0mejg1MzBfbm9wOworCWRldi0+Y2hhbkIuaXJxcz0mejg1MzBfbm9wOworCWRldi0+Y2hhbkEuZGNkY2hlY2s9RENEOworCWRldi0+Y2hhbkIuZGNkY2hlY2s9RENEOworCisJLyogUmVzZXQgdGhlIGNoaXAgKi8KKwl3cml0ZV96c3JlZygmZGV2LT5jaGFuQSwgUjksIDB4QzApOworCXVkZWxheSgyMDApOworCS8qIE5vdyBjaGVjayBpdHMgdmFsaWQgKi8KKwl3cml0ZV96c3JlZygmZGV2LT5jaGFuQSwgUjEyLCAweEFBKTsKKwlpZihyZWFkX3pzcmVnKCZkZXYtPmNoYW5BLCBSMTIpIT0weEFBKQorCQlyZXR1cm4gLUVOT0RFVjsKKwl3cml0ZV96c3JlZygmZGV2LT5jaGFuQSwgUjEyLCAweDU1KTsKKwlpZihyZWFkX3pzcmVnKCZkZXYtPmNoYW5BLCBSMTIpIT0weDU1KQorCQlyZXR1cm4gLUVOT0RFVjsKKwkJCisJZGV2LT50eXBlPVo4NTMwOworCQorCS8qCisJICoJU2VlIHRoZSBhcHBsaWNhdGlvbiBub3RlLgorCSAqLworCSAKKwl3cml0ZV96c3JlZygmZGV2LT5jaGFuQSwgUjE1LCAweDAxKTsKKwkKKwkvKgorCSAqCUlmIHdlIGNhbiBzZXQgdGhlIGxvdyBiaXQgb2YgUjE1IHRoZW4KKwkgKgl0aGUgY2hpcCBpcyBlbmhhbmNlZC4KKwkgKi8KKwkgCisJaWYocmVhZF96c3JlZygmZGV2LT5jaGFuQSwgUjE1KT09MHgwMSkKKwl7CisJCS8qIFRoaXMgQzMwIHZlcnN1cyAyMzAgZGV0ZWN0IGlzIGZyb20gS2xhdXMgS3VkaWVsa2EncyBkbWFzY2MgKi8KKwkJLyogUHV0IGEgY2hhciBpbiB0aGUgZmlmbyAqLworCQl3cml0ZV96c3JlZygmZGV2LT5jaGFuQSwgUjgsIDApOworCQlpZihyZWFkX3pzcmVnKCZkZXYtPmNoYW5BLCBSMCkmVHhfQlVGX0VNUCkKKwkJCWRldi0+dHlwZSA9IFo4NTIzMDsJLyogSGFzIGEgRklGTyAqLworCQllbHNlCisJCQlkZXYtPnR5cGUgPSBaODVDMzA7CS8qIFo4NUMzMCwgMSBieXRlIEZJRk8gKi8KKwl9CisJCQorCS8qCisJICoJVGhlIGNvZGUgYXNzdW1lcyBSNycgYW5kIGZyaWVuZHMgYXJlCisJICoJb2ZmLiBVc2Ugd3JpdGVfenNleHQoKSBmb3IgdGhlc2UgYW5kIGtlZXAKKwkgKgl0aGlzIGJpdCBjbGVhci4KKwkgKi8KKwkgCisJd3JpdGVfenNyZWcoJmRldi0+Y2hhbkEsIFIxNSwgMCk7CisJCQorCS8qCisJICoJQXQgdGhpcyBwb2ludCBpdCBsb29rcyBsaWtlIHRoZSBjaGlwIGlzIGJlaGF2aW5nCisJICovCisJIAorCW1lbWNweShkZXYtPmNoYW5BLnJlZ3MsIHJlZ19pbml0LCAxNik7CisJbWVtY3B5KGRldi0+Y2hhbkIucmVncywgcmVnX2luaXQgLDE2KTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl6ODUzMF9pbml0IC0gSW5pdGlhbGlzZSBhIFo4NTMwIGRldmljZQorICoJQGRldjogWjg1MzAgZGV2aWNlIHRvIGluaXRpYWxpc2UuCisgKgorICoJQ29uZmlndXJlIHVwIGEgWjg1MzAvWjg1QzMwIG9yIFo4NTIzMCBjaGlwLiBXZSBjaGVjayB0aGUgZGV2aWNlCisgKglpcyBwcmVzZW50LCBpZGVudGlmeSB0aGUgdHlwZSBhbmQgdGhlbiBwcm9ncmFtIGl0IHRvIGhvcGVmdWxseQorICoJa2VlcCBxdWl0ZSBhbmQgYmVoYXZlLiBUaGlzIG1hdHRlcnMgYSBsb3QsIGEgWjg1MzAgaW4gdGhlIHdyb25nCisgKglzdGF0ZSB3aWxsIHNvbWV0aW1lcyBnZXQgaW50byBzdHVwaWQgbW9kZXMgZ2VuZXJhdGluZyAxMEtoegorICoJaW50ZXJydXB0IHN0cmVhbXMgYW5kIHRoZSBsaWtlLgorICoKKyAqCVdlIHNldCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgdXAgdG8gZGlzY2FyZCBhbnkgZXZlbnRzLCBpbiBjYXNlCisgKgl3ZSBnZXQgdGhlbSBkdXJpbmcgcmVzZXQgb3Igc2V0cC4KKyAqCisgKglSZXR1cm4gMCBmb3Igc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpbmRpY2F0aW5nIHRoZSBwcm9ibGVtCisgKglpbiBlcnJubyBmb3JtLgorICovCisKK2ludCB6ODUzMF9pbml0KHN0cnVjdCB6ODUzMF9kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwkvKiBTZXQgdXAgdGhlIGNoaXAgbGV2ZWwgbG9jayAqLworCXNwaW5fbG9ja19pbml0KCZkZXYtPmxvY2spOworCWRldi0+Y2hhbkEubG9jayA9ICZkZXYtPmxvY2s7CisJZGV2LT5jaGFuQi5sb2NrID0gJmRldi0+bG9jazsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwlyZXQgPSBkb196ODUzMF9pbml0KGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisKK0VYUE9SVF9TWU1CT0woejg1MzBfaW5pdCk7CisKKy8qKgorICoJejg1MzBfc2h1dGRvd24gLSBTaHV0ZG93biBhIFo4NTMwIGRldmljZQorICoJQGRldjogVGhlIFo4NTMwIGNoaXAgdG8gc2h1dGRvd24KKyAqCisgKglXZSBzZXQgdGhlIGludGVycnVwdCBoYW5kbGVycyB0byBzaWxlbmNlIGFueSBpbnRlcnJ1cHRzLiBXZSB0aGVuIAorICoJcmVzZXQgdGhlIGNoaXAgYW5kIHdhaXQgMTAwdVMgdG8gYmUgc3VyZSB0aGUgcmVzZXQgY29tcGxldGVkLiBKdXN0CisgKglpbiBjYXNlIHRoZSBjYWxsZXIgdGhlbiB0cmllcyB0byBkbyBzdHVmZi4KKyAqCisgKglUaGlzIGlzIGNhbGxlZCB3aXRob3V0IHRoZSBsb2NrIGhlbGQKKyAqLworIAoraW50IHo4NTMwX3NodXRkb3duKHN0cnVjdCB6ODUzMF9kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCS8qIFJlc2V0IHRoZSBjaGlwICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CisJZGV2LT5jaGFuQS5pcnFzPSZ6ODUzMF9ub3A7CisJZGV2LT5jaGFuQi5pcnFzPSZ6ODUzMF9ub3A7CisJd3JpdGVfenNyZWcoJmRldi0+Y2hhbkEsIFI5LCAweEMwKTsKKwkvKiBXZSBtdXN0IGxvY2sgdGhlIHVkZWxheSwgdGhlIGNoaXAgaXMgb2ZmbGltaXRzIGhlcmUgKi8KKwl1ZGVsYXkoMTAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTCh6ODUzMF9zaHV0ZG93bik7CisKKy8qKgorICoJejg1MzBfY2hhbm5lbF9sb2FkIC0gTG9hZCBjaGFubmVsIGRhdGEKKyAqCUBjOiBaODUzMCBjaGFubmVsIHRvIGNvbmZpZ3VyZQorICoJQHJ0YWJsZTogdGFibGUgb2YgcmVnaXN0ZXIsIHZhbHVlIHBhaXJzCisgKglGSVhNRTogaW9jdGwgdG8gYWxsb3cgdXNlciB1cGxvYWRlZCB0YWJsZXMKKyAqCisgKglMb2FkIGEgWjg1MzAgY2hhbm5lbCB1cCBmcm9tIHRoZSBzeXN0ZW0gZGF0YS4gV2UgdXNlICsxNiB0byAKKyAqCWluZGljYXRlIHRoZSAicHJpbWUiIHJlZ2lzdGVycy4gVGhlIHZhbHVlIDI1NSB0ZXJtaW5hdGVzIHRoZQorICoJdGFibGUuCisgKi8KKworaW50IHo4NTMwX2NoYW5uZWxfbG9hZChzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYywgdTggKnJ0YWJsZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoYy0+bG9jaywgZmxhZ3MpOworCisJd2hpbGUoKnJ0YWJsZSE9MjU1KQorCXsKKwkJaW50IHJlZz0qcnRhYmxlKys7CisJCWlmKHJlZz4weDBGKQorCQkJd3JpdGVfenNyZWcoYywgUjE1LCBjLT5yZWdzWzE1XXwxKTsKKwkJd3JpdGVfenNyZWcoYywgcmVnJjB4MEYsICpydGFibGUpOworCQlpZihyZWc+MHgwRikKKwkJCXdyaXRlX3pzcmVnKGMsIFIxNSwgYy0+cmVnc1sxNV0mfjEpOworCQljLT5yZWdzW3JlZ109KnJ0YWJsZSsrOworCX0KKwljLT5yeF9mdW5jdGlvbj16ODUzMF9udWxsX3J4OworCWMtPnNrYj1OVUxMOworCWMtPnR4X3NrYj1OVUxMOworCWMtPnR4X25leHRfc2tiPU5VTEw7CisJYy0+bXR1PTE1MDA7CisJYy0+bWF4PTA7CisJYy0+Y291bnQ9MDsKKwljLT5zdGF0dXM9cmVhZF96c3JlZyhjLCBSMCk7CisJYy0+c3luYz0xOworCXdyaXRlX3pzcmVnKGMsIFIzLCBjLT5yZWdzW1IzXXxSeEVOQUJMRSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTCh6ODUzMF9jaGFubmVsX2xvYWQpOworCisKKy8qKgorICoJejg1MzBfdHhfYmVnaW4gLSBCZWdpbiBwYWNrZXQgdHJhbnNtaXNzaW9uCisgKglAYzogVGhlIFo4NTMwIGNoYW5uZWwgdG8ga2ljaworICoKKyAqCVRoaXMgaXMgdGhlIHNwZWVkIHNlbnNpdGl2ZSBzaWRlIG9mIHRyYW5zbWlzc2lvbi4gSWYgd2UgYXJlIGNhbGxlZAorICoJYW5kIG5vIGJ1ZmZlciBpcyBiZWluZyB0cmFuc21pdHRlZCB3ZSBjb21tZW5jZSB0aGUgbmV4dCBidWZmZXIuIElmCisgKglub3RoaW5nIGlzIHF1ZXVlZCB3ZSBpZGxlIHRoZSBzeW5jLiAKKyAqCisgKglOb3RlOiBXZSBhcmUgaGFuZGxpbmcgdGhpcyBjb2RlIHBhdGggaW4gdGhlIGludGVycnVwdCBwYXRoLCBrZWVwIGl0CisgKglmYXN0IG9yIGJhZCB0aGluZ3Mgd2lsbCBoYXBwZW4uCisgKgorICoJQ2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZC4KKyAqLworCitzdGF0aWMgdm9pZCB6ODUzMF90eF9iZWdpbihzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWlmKGMtPnR4X3NrYikKKwkJcmV0dXJuOworCQkKKwljLT50eF9za2I9Yy0+dHhfbmV4dF9za2I7CisJYy0+dHhfbmV4dF9za2I9TlVMTDsKKwljLT50eF9wdHI9Yy0+dHhfbmV4dF9wdHI7CisJCisJaWYoYy0+dHhfc2tiPT1OVUxMKQorCXsKKwkJLyogSWRsZSBvbiAqLworCQlpZihjLT5kbWFfdHgpCisJCXsKKwkJCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJCQlkaXNhYmxlX2RtYShjLT50eGRtYSk7CisJCQkvKgorCQkJICoJQ2hlY2sgaWYgd2UgY3JhcHBlZCBvdXQuCisJCQkgKi8KKwkJCWlmKGdldF9kbWFfcmVzaWR1ZShjLT50eGRtYSkpCisJCQl7CisJCQkJYy0+c3RhdHMudHhfZHJvcHBlZCsrOworCQkJCWMtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQl9CisJCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwkJfQorCQljLT50eGNvdW50PTA7CisJfQorCWVsc2UKKwl7CisJCWMtPnR4Y291bnQ9Yy0+dHhfc2tiLT5sZW47CisJCQorCQkKKwkJaWYoYy0+ZG1hX3R4KQorCQl7CisJCQkvKgorCQkJICoJRklYTUUuIERNQSBpcyBicm9rZW4gZm9yIHRoZSBvcmlnaW5hbCA4NTMwLAorCQkJICoJb24gdGhlIG9sZGVyIHBhcnRzIHdlIG5lZWQgdG8gc2V0IGEgZmxhZyBhbmQKKwkJCSAqCXdhaXQgZm9yIGEgZnVydGhlciBUWCBpbnRlcnJ1cHQgdG8gZmlyZSB0aGlzCisJCQkgKglzdGFnZSBvZmYJCisJCQkgKi8KKwkJCSAKKwkJCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJCQlkaXNhYmxlX2RtYShjLT50eGRtYSk7CisKKwkJCS8qCisJCQkgKglUaGVzZSB0d28gYXJlIG5lZWRlZCBieSB0aGUgODUzMC84NUMzMAorCQkJICoJYW5kIG11c3QgYmUgaXNzdWVkIHdoZW4gaWRsaW5nLgorCQkJICovCisJCQkgCisJCQlpZihjLT5kZXYtPnR5cGUhPVo4NTIzMCkKKwkJCXsKKwkJCQl3cml0ZV96c2N0cmwoYywgUkVTX1R4X0NSQyk7CisJCQkJd3JpdGVfenNjdHJsKGMsIFJFU19FT01fTCk7CisJCQl9CQorCQkJd3JpdGVfenNyZWcoYywgUjEwLCBjLT5yZWdzWzEwXSZ+QUJVTkRFUik7CisJCQljbGVhcl9kbWFfZmYoYy0+dHhkbWEpOworCQkJc2V0X2RtYV9hZGRyKGMtPnR4ZG1hLCB2aXJ0X3RvX2J1cyhjLT50eF9wdHIpKTsKKwkJCXNldF9kbWFfY291bnQoYy0+dHhkbWEsIGMtPnR4Y291bnQpOworCQkJZW5hYmxlX2RtYShjLT50eGRtYSk7CisJCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwkJCXdyaXRlX3pzY3RybChjLCBSRVNfRU9NX0wpOworCQkJd3JpdGVfenNyZWcoYywgUjUsIGMtPnJlZ3NbUjVdfFR4RU5BQik7CisJCX0KKwkJZWxzZQorCQl7CisKKwkJCS8qIEFCVU5ERVIgb2ZmICovCisJCQl3cml0ZV96c3JlZyhjLCBSMTAsIGMtPnJlZ3NbMTBdKTsKKwkJCXdyaXRlX3pzY3RybChjLCBSRVNfVHhfQ1JDKTsKKwkKKwkJCXdoaWxlKGMtPnR4Y291bnQgJiYgKHJlYWRfenNyZWcoYyxSMCkmVHhfQlVGX0VNUCkpCisJCQl7CQkKKwkJCQl3cml0ZV96c3JlZyhjLCBSOCwgKmMtPnR4X3B0cisrKTsKKwkJCQljLT50eGNvdW50LS07CisJCQl9CisKKwkJfQorCX0KKwkvKgorCSAqCVNpbmNlIHdlIGVtcHRpZWQgdHhfc2tiIHdlIGNhbiBhc2sgZm9yIG1vcmUKKwkgKi8KKwluZXRpZl93YWtlX3F1ZXVlKGMtPm5ldGRldmljZSk7Cit9CisKKy8qKgorICoJejg1MzBfdHhfZG9uZSAtIFRYIGNvbXBsZXRlIGNhbGxiYWNrCisgKglAYzogVGhlIGNoYW5uZWwgdGhhdCBjb21wbGV0ZWQgYSB0cmFuc21pdC4KKyAqCisgKglUaGlzIGlzIGNhbGxlZCB3aGVuIHdlIGNvbXBsZXRlIGEgcGFja2V0IHNlbmQuIFdlIHdha2UgdGhlIHF1ZXVlLAorICoJc3RhcnQgdGhlIG5leHQgcGFja2V0IGdvaW5nIGFuZCB0aGVuIGZyZWUgdGhlIGJ1ZmZlciBvZiB0aGUgZXhpc3RpbmcKKyAqCXBhY2tldC4gVGhpcyBjb2RlIGlzIGZhaXJseSB0aW1pbmcgc2Vuc2l0aXZlLgorICoKKyAqCUNhbGxlZCB3aXRoIHRoZSByZWdpc3RlciBsb2NrIGhlbGQuCisgKi8gCisgCitzdGF0aWMgdm9pZCB6ODUzMF90eF9kb25lKHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvKiBBY3R1YWxseSB0aGlzIGNhbiBoYXBwZW4uKi8KKwlpZihjLT50eF9za2I9PU5VTEwpCisJCXJldHVybjsKKworCXNrYj1jLT50eF9za2I7CisJYy0+dHhfc2tiPU5VTEw7CisJejg1MzBfdHhfYmVnaW4oYyk7CisJYy0+c3RhdHMudHhfcGFja2V0cysrOworCWMtPnN0YXRzLnR4X2J5dGVzKz1za2ItPmxlbjsKKwlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworfQorCisvKioKKyAqCXo4NTMwX251bGxfcnggLSBEaXNjYXJkIGEgcGFja2V0CisgKglAYzogVGhlIGNoYW5uZWwgdGhlIHBhY2tldCBhcnJpdmVkIG9uCisgKglAc2tiOiBUaGUgYnVmZmVyCisgKgorICoJV2UgcG9pbnQgdGhlIHJlY2VpdmUgaGFuZGxlciBhdCB0aGlzIGZ1bmN0aW9uIHdoZW4gaWRsZS4gSW5zdGVhZAorICoJb2Ygc3luY3BwcCBwcm9jZXNzaW5nIHRoZSBmcmFtZXMgd2UgZ2V0IHRvIHRocm93IHRoZW0gYXdheS4KKyAqLworIAordm9pZCB6ODUzMF9udWxsX3J4KHN0cnVjdCB6ODUzMF9jaGFubmVsICpjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWRldl9rZnJlZV9za2JfYW55KHNrYik7Cit9CisKK0VYUE9SVF9TWU1CT0woejg1MzBfbnVsbF9yeCk7CisKKy8qKgorICoJejg1MzBfcnhfZG9uZSAtIFJlY2VpdmUgY29tcGxldGlvbiBjYWxsYmFjaworICoJQGM6IFRoZSBjaGFubmVsIHRoYXQgY29tcGxldGVkIGEgcmVjZWl2ZQorICoKKyAqCUEgbmV3IHBhY2tldCBpcyBjb21wbGV0ZS4gT3VyIGdvYWwgaGVyZSBpcyB0byBnZXQgYmFjayBpbnRvIHJlY2VpdmUKKyAqCW1vZGUgYXMgZmFzdCBhcyBwb3NzaWJsZS4gT24gdGhlIFo4NTIzMCB3ZSBjb3VsZCBjaGFuZ2UgdG8gdXNpbmcKKyAqCUVTQ0MgbW9kZSwgYnV0IG9uIHRoZSBvbGRlciBjaGlwcyB3ZSBoYXZlIG5vIGNob2ljZS4gV2UgZmxpcCB0byB0aGUKKyAqCW5ldyBidWZmZXIgaW1tZWRpYXRlbHkgaW4gRE1BIG1vZGUgc28gdGhhdCB0aGUgRE1BIG9mIHRoZSBuZXh0CisgKglmcmFtZSBjYW4gb2NjdXIgd2hpbGUgd2UgYXJlIGNvcHlpbmcgdGhlIHByZXZpb3VzIGJ1ZmZlciB0byBhbiBza19idWZmCisgKgorICoJQ2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZAorICovCisgCitzdGF0aWMgdm9pZCB6ODUzMF9yeF9kb25lKHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGN0OworCQorCS8qCisJICoJSXMgb3VyIHJlY2VpdmUgZW5naW5lIGluIERNQSBtb2RlCisJICovCisJIAorCWlmKGMtPnJ4ZG1hX29uKQorCXsKKwkJLyoKKwkJICoJU2F2ZSB0aGUgcmVhZHkgc3RhdGUgYW5kIHRoZSBidWZmZXIgY3VycmVudGx5CisJCSAqCWJlaW5nIHVzZWQgYXMgdGhlIERNQSB0YXJnZXQKKwkJICovCisJCSAKKwkJaW50IHJlYWR5PWMtPmRtYV9yZWFkeTsKKwkJdW5zaWduZWQgY2hhciAqcnhiPWMtPnJ4X2J1ZltjLT5kbWFfbnVtXTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCisJCS8qCisJCSAqCUNvbXBsZXRlIHRoaXMgRE1BLiBOZWNjZXNzYXJ5IHRvIGZpbmQgdGhlIGxlbmd0aAorCQkgKi8JCQorCQkgCisJCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJCQorCQlkaXNhYmxlX2RtYShjLT5yeGRtYSk7CisJCWNsZWFyX2RtYV9mZihjLT5yeGRtYSk7CisJCWMtPnJ4ZG1hX29uPTA7CisJCWN0PWMtPm10dS1nZXRfZG1hX3Jlc2lkdWUoYy0+cnhkbWEpOworCQlpZihjdDwwKQorCQkJY3Q9MjsJLyogU2hpdCBoYXBwZW5zLi4gKi8KKwkJYy0+ZG1hX3JlYWR5PTA7CisJCQorCQkvKgorCQkgKglOb3JtYWwgY2FzZTogdGhlIG90aGVyIHNsb3QgaXMgZnJlZSwgc3RhcnQgdGhlIG5leHQgRE1BCisJCSAqCWludG8gaXQgaW1tZWRpYXRlbHkuCisJCSAqLworCQkgCisJCWlmKHJlYWR5KQorCQl7CisJCQljLT5kbWFfbnVtXj0xOworCQkJc2V0X2RtYV9tb2RlKGMtPnJ4ZG1hLCBETUFfTU9ERV9SRUFEfDB4MTApOworCQkJc2V0X2RtYV9hZGRyKGMtPnJ4ZG1hLCB2aXJ0X3RvX2J1cyhjLT5yeF9idWZbYy0+ZG1hX251bV0pKTsKKwkJCXNldF9kbWFfY291bnQoYy0+cnhkbWEsIGMtPm10dSk7CisJCQljLT5yeGRtYV9vbiA9IDE7CisJCQllbmFibGVfZG1hKGMtPnJ4ZG1hKTsKKwkJCS8qIFN0b3AgYW55IGZyYW1lcyB0aGF0IHdlIG1pc3NlZCB0aGUgaGVhZCBvZiAKKwkJCSAgIGZyb20gcGFzc2luZyAqLworCQkJd3JpdGVfenNyZWcoYywgUjAsIFJFU19SeF9DUkMpOworCQl9CisJCWVsc2UKKwkJCS8qIENhbid0IG9jY3VyIGFzIHdlIGRvbnQgcmVlbmFibGUgdGhlIERNQSBpcnEgdW50aWwKKwkJCSAgIGFmdGVyIHRoZSBmbGlwIGlzIGRvbmUgKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBETUEgZmxpcCBvdmVycnVuIVxuIiwgYy0+bmV0ZGV2aWNlLT5uYW1lKTsKKwkJCQorCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwkJCisJCS8qCisJCSAqCVNob3ZlIHRoZSBvbGQgYnVmZmVyIGludG8gYW4gc2tfYnVmZi4gV2UgY2FuJ3QgRE1BCisJCSAqCWRpcmVjdGx5IGludG8gb25lIG9uIGEgUEMgLSBpdCBtaWdodCBiZSBhYm92ZSB0aGUgMTZNYgorCQkgKglib3VuZGFyeS4gT3B0aW1pc2F0aW9uIC0gd2UgY291bGQgY2hlY2sgdG8gc2VlIGlmIHdlCisJCSAqCWNhbiBhdm9pZCB0aGUgY29weS4gT3B0aW1pc2F0aW9uIDIgLSBtYWtlIHRoZSBtZW1jcHkKKwkJICoJYSBjb3B5Y2hlY2tzdW0uCisJCSAqLworCQkgCisJCXNrYj1kZXZfYWxsb2Nfc2tiKGN0KTsKKwkJaWYoc2tiPT1OVUxMKQorCQl7CisJCQljLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTWVtb3J5IHNxdWVlemUuXG4iLCBjLT5uZXRkZXZpY2UtPm5hbWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJc2tiX3B1dChza2IsIGN0KTsKKwkJCW1lbWNweShza2ItPmRhdGEsIHJ4YiwgY3QpOworCQkJYy0+c3RhdHMucnhfcGFja2V0cysrOworCQkJYy0+c3RhdHMucnhfYnl0ZXMrPWN0OworCQl9CisJCWMtPmRtYV9yZWFkeT0xOworCX0KKwllbHNlCisJeworCQlSVF9MT0NLOwkKKwkJc2tiPWMtPnNrYjsKKwkJCisJCS8qCisJCSAqCVRoZSBnYW1lIHdlIHBsYXkgZm9yIG5vbiBETUEgaXMgc2ltaWxhci4gV2Ugd2FudCB0bworCQkgKglnZXQgdGhlIGNvbnRyb2xsZXIgc2V0IHVwIGZvciB0aGUgbmV4dCBwYWNrZXQgYXMgZmFzdAorCQkgKglhcyBwb3NzaWJsZS4gV2UgcG90ZW50aWFsbHkgb25seSBoYXZlIG9uZSBieXRlICsgdGhlCisJCSAqCWZpZm8gbGVuZ3RoIGZvciB0aGlzLiBUaHVzIHdlIHdhbnQgdG8gZmxpcCB0byB0aGUgbmV3CisJCSAqCWJ1ZmZlciBhbmQgdGhlbiBtZXNzIGFyb3VuZCBjb3B5aW5nIGFuZCBhbGxvY2F0aW5nCisJCSAqCXRoaW5ncy4gRm9yIHRoZSBjdXJyZW50IGNhc2UgaXQgZG9lc24ndCBtYXR0ZXIgYnV0CisJCSAqCWlmIHlvdSBidWlsZCBhIHN5c3RlbSB3aGVyZSB0aGUgc3luYyBpcnEgaXNudCBibG9ja2VkCisJCSAqCWJ5IHRoZSBrZXJuZWwgSVJRIGRpc2FibGUgdGhlbiB5b3UgbmVlZCBvbmx5IGJsb2NrIHRoZQorCQkgKglzeW5jIElSUSBmb3IgdGhlIFJUX0xPQ0sgYXJlYS4KKwkJICoJCisJCSAqLworCQljdD1jLT5jb3VudDsKKwkJCisJCWMtPnNrYiA9IGMtPnNrYjI7CisJCWMtPmNvdW50ID0gMDsKKwkJYy0+bWF4ID0gYy0+bXR1OworCQlpZihjLT5za2IpCisJCXsKKwkJCWMtPmRwdHIgPSBjLT5za2ItPmRhdGE7CisJCQljLT5tYXggPSBjLT5tdHU7CisJCX0KKwkJZWxzZQorCQl7CisJCQljLT5jb3VudD0gMDsKKwkJCWMtPm1heCA9IDA7CisJCX0KKwkJUlRfVU5MT0NLOworCisJCWMtPnNrYjIgPSBkZXZfYWxsb2Nfc2tiKGMtPm10dSk7CisJCWlmKGMtPnNrYjI9PU5VTEwpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbWVtb3J5IHNxdWVlemUuXG4iLAorCQkJCWMtPm5ldGRldmljZS0+bmFtZSk7CisJCWVsc2UKKwkJeworCQkJc2tiX3B1dChjLT5za2IyLGMtPm10dSk7CisJCX0KKwkJYy0+c3RhdHMucnhfcGFja2V0cysrOworCQljLT5zdGF0cy5yeF9ieXRlcys9Y3Q7CisJCQorCX0KKwkvKgorCSAqCUlmIHdlIHJlY2VpdmVkIGEgZnJhbWUgd2UgbXVzdCBub3cgcHJvY2VzcyBpdC4KKwkgKi8KKwlpZihza2IpCisJeworCQlza2JfdHJpbShza2IsIGN0KTsKKwkJYy0+cnhfZnVuY3Rpb24oYyxza2IpOworCX0KKwllbHNlCisJeworCQljLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IExvc3QgYSBmcmFtZVxuIiwgYy0+bmV0ZGV2aWNlLT5uYW1lKTsKKwl9Cit9CisKKy8qKgorICoJc3BhbnNfYm91bmRhcnkgLSBDaGVjayBhIHBhY2tldCBjYW4gYmUgSVNBIERNQSdkCisgKglAc2tiOiBUaGUgYnVmZmVyIHRvIGNoZWNrCisgKgorICoJUmV0dXJucyB0cnVlIGlmIHRoZSBidWZmZXIgY3Jvc3MgYSBETUEgYm91bmRhcnkgb24gYSBQQy4gVGhlIHBvb3IKKyAqCXRoaW5nIGNhbiBvbmx5IERNQSB3aXRoaW4gYSA2NEsgYmxvY2sgbm90IGFjcm9zcyB0aGUgZWRnZXMgb2YgaXQuCisgKi8KKyAKK3N0YXRpYyBpbmxpbmUgaW50IHNwYW5zX2JvdW5kYXJ5KHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgbG9uZyBhPSh1bnNpZ25lZCBsb25nKXNrYi0+ZGF0YTsKKwlhXj0oYStza2ItPmxlbik7CisJaWYoYSYweDAwMDEwMDAwKQkvKiBJZiB0aGUgNjRLIGJpdCBpcyBkaWZmZXJlbnQuLiAqLworCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl6ODUzMF9xdWV1ZV94bWl0IC0gUXVldWUgYSBwYWNrZXQKKyAqCUBjOiBUaGUgY2hhbm5lbCB0byB1c2UKKyAqCUBza2I6IFRoZSBwYWNrZXQgdG8ga2ljayBkb3duIHRoZSBjaGFubmVsCisgKgorICoJUXVldWUgYSBwYWNrZXQgZm9yIHRyYW5zbWlzc2lvbi4gQmVjYXVzZSB3ZSBoYXZlIHJhdGhlcgorICoJaGFyZCB0byBoaXQgaW50ZXJydXB0IGxhdGVuY2llcyBmb3IgdGhlIFo4NTIzMCBwZXIgcGFja2V0IAorICoJZXZlbiBpbiBETUEgbW9kZSB3ZSBkbyB0aGUgZmxpcCB0byBETUEgYnVmZmVyIGlmIG5lZWRlZCBoZXJlCisgKglub3QgaW4gdGhlIElSUS4KKyAqCisgKglDYWxsZWQgZnJvbSB0aGUgbmV0d29yayBjb2RlLiBUaGUgbG9jayBpcyBub3QgaGVsZCBhdCB0aGlzIAorICoJcG9pbnQuCisgKi8KKworaW50IHo4NTMwX3F1ZXVlX3htaXQoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwluZXRpZl9zdG9wX3F1ZXVlKGMtPm5ldGRldmljZSk7CisJaWYoYy0+dHhfbmV4dF9za2IpCisJeworCQlyZXR1cm4gMTsKKwl9CisJCisJLyogUEMgU1BFQ0lGSUMgLSBETUEgbGltaXRzICovCisJCisJLyoKKwkgKglJZiB3ZSB3aWxsIERNQSB0aGUgdHJhbnNtaXQgYW5kIGl0cyBnb25lIG92ZXIgdGhlIElTQSBidXMKKwkgKglsaW1pdCwgdGhlbiBjb3B5IHRvIHRoZSBmbGlwIGJ1ZmZlcgorCSAqLworCSAKKwlpZihjLT5kbWFfdHggJiYgKCh1bnNpZ25lZCBsb25nKSh2aXJ0X3RvX2J1cyhza2ItPmRhdGErc2tiLT5sZW4pKT49MTYqMTAyNCoxMDI0IHx8IHNwYW5zX2JvdW5kYXJ5KHNrYikpKQorCXsKKwkJLyogCisJCSAqCVNlbmQgdGhlIGZsaXAgYnVmZmVyLCBhbmQgZmxpcCB0aGUgZmxpcHB5IGJpdC4KKwkJICoJV2UgZG9uJ3QgY2FyZSB3aGljaCBpcyB1c2VkIHdoZW4ganVzdCBzbyBsb25nIGFzCisJCSAqCXdlIG5ldmVyIHVzZSB0aGUgc2FtZSBidWZmZXIgdHdpY2UgaW4gYSByb3cuIFNpbmNlCisJCSAqCW9ubHkgb25lIGJ1ZmZlciBjYW4gYmUgZ29pbmcgb3V0IGF0IGEgdGltZSB0aGUgb3RoZXIKKwkJICoJaGFzIHRvIGJlIHNhZmUuCisJCSAqLworCQljLT50eF9uZXh0X3B0cj1jLT50eF9kbWFfYnVmW2MtPnR4X2RtYV91c2VkXTsKKwkJYy0+dHhfZG1hX3VzZWRePTE7CS8qIEZsaXAgdGVtcCBidWZmZXIgKi8KKwkJbWVtY3B5KGMtPnR4X25leHRfcHRyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwl9CisJZWxzZQorCQljLT50eF9uZXh0X3B0cj1za2ItPmRhdGE7CQorCVJUX0xPQ0s7CisJYy0+dHhfbmV4dF9za2I9c2tiOworCVJUX1VOTE9DSzsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZShjLT5sb2NrLCBmbGFncyk7CisJejg1MzBfdHhfYmVnaW4oYyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShjLT5sb2NrLCBmbGFncyk7CisJCisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woejg1MzBfcXVldWVfeG1pdCk7CisKKy8qKgorICoJejg1MzBfZ2V0X3N0YXRzIC0gR2V0IG5ldHdvcmsgc3RhdGlzdGljcworICoJQGM6IFRoZSBjaGFubmVsIHRvIHVzZQorICoKKyAqCUdldCB0aGUgc3RhdGlzdGljcyBibG9jay4gV2Uga2VlcCB0aGUgc3RhdGlzdGljcyBpbiBzb2Z0d2FyZSBhcworICoJdGhlIGNoaXAgZG9lc24ndCBkbyBpdCBmb3IgdXMuCisgKgorICoJTG9ja2luZyBpcyBpZ25vcmVkIGhlcmUgLSB3ZSBjb3VsZCBsb2NrIGZvciBhIGNvcHkgYnV0IGl0cworICoJbm90IGxpa2VseSB0byBiZSB0aGF0IGJpZyBhbiBpc3N1ZQorICovCisgCitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqejg1MzBfZ2V0X3N0YXRzKHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQoreworCXJldHVybiAmYy0+c3RhdHM7Cit9CisKK0VYUE9SVF9TWU1CT0woejg1MzBfZ2V0X3N0YXRzKTsKKworLyoKKyAqCU1vZHVsZSBzdXBwb3J0CisgKi8KK3N0YXRpYyBjaGFyIGJhbm5lcltdIF9faW5pdGRhdGEgPSBLRVJOX0lORk8gIkdlbmVyaWMgWjg1QzMwL1o4NTIzMCBpbnRlcmZhY2UgZHJpdmVyIHYwLjAyXG4iOworCitzdGF0aWMgaW50IF9faW5pdCB6ODUyMzBfaW5pdF9kcml2ZXIodm9pZCkKK3sKKwlwcmludGsoYmFubmVyKTsKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KHo4NTIzMF9pbml0X2RyaXZlcik7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB6ODUyMzBfY2xlYW51cF9kcml2ZXIodm9pZCkKK3sKK30KK21vZHVsZV9leGl0KHo4NTIzMF9jbGVhbnVwX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlJlZCBIYXQgSW5jLiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJaODV4MzAgc3luY2hyb25vdXMgZHJpdmVyIGNvcmUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi96ODUyMzAuaCBiL2RyaXZlcnMvbmV0L3dhbi96ODUyMzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2U1MzIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3o4NTIzMC5oCkBAIC0wLDAgKzEsNDQ5IEBACisvKgorICoJRGVzY3JpcHRpb24gb2YgWjg1MzAgWjg1QzMwIGFuZCBaODUyMzAgY29tbXVuaWNhdGlvbnMgY2hpcHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQorICogQ29weXJpZ2h0IChDKSAxOTk4IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKi8KKworI2lmbmRlZiBfWjg1MzBfSAorI2RlZmluZSBfWjg1MzBfSAorCisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKy8qIENvbnZlcnNpb24gcm91dGluZXMgdG8vZnJvbSBicmcgdGltZSBjb25zdGFudHMgZnJvbS90byBiaXRzCisgKiBwZXIgc2Vjb25kLgorICovCisjZGVmaW5lIEJSR19UT19CUFMoYnJnLCBmcmVxKSAoKGZyZXEpIC8gMiAvICgoYnJnKSArIDIpKQorI2RlZmluZSBCUFNfVE9fQlJHKGJwcywgZnJlcSkgKCgoKGZyZXEpICsgKGJwcykpIC8gKDIgKiAoYnBzKSkpIC0gMikKKworLyogVGhlIFppbG9nIHJlZ2lzdGVyIHNldCAqLworCisjZGVmaW5lCUZMQUcJMHg3ZQorCisvKiBXcml0ZSBSZWdpc3RlciAwICovCisjZGVmaW5lCVIwCTAJCS8qIFJlZ2lzdGVyIHNlbGVjdHMgKi8KKyNkZWZpbmUJUjEJMQorI2RlZmluZQlSMgkyCisjZGVmaW5lCVIzCTMKKyNkZWZpbmUJUjQJNAorI2RlZmluZQlSNQk1CisjZGVmaW5lCVI2CTYKKyNkZWZpbmUJUjcJNworI2RlZmluZQlSOAk4CisjZGVmaW5lCVI5CTkKKyNkZWZpbmUJUjEwCTEwCisjZGVmaW5lCVIxMQkxMQorI2RlZmluZQlSMTIJMTIKKyNkZWZpbmUJUjEzCTEzCisjZGVmaW5lCVIxNAkxNAorI2RlZmluZQlSMTUJMTUKKworI2RlZmluZSBSUFJJTUUJMTYJCS8qIEluZGljYXRlIGEgcHJpbWUgcmVnaXN0ZXIgYWNjZXNzIG9uIDIzMCAqLworCisjZGVmaW5lCU5VTExDT0RFCTAJLyogTnVsbCBDb2RlICovCisjZGVmaW5lCVBPSU5UX0hJR0gJMHg4CS8qIFNlbGVjdCB1cHBlciBoYWxmIG9mIHJlZ2lzdGVycyAqLworI2RlZmluZQlSRVNfRVhUX0lOVAkweDEwCS8qIFJlc2V0IEV4dC4gU3RhdHVzIEludGVycnVwdHMgKi8KKyNkZWZpbmUJU0VORF9BQk9SVAkweDE4CS8qIEhETEMgQWJvcnQgKi8KKyNkZWZpbmUJUkVTX1J4SU5UX0ZDCTB4MjAJLyogUmVzZXQgUnhJTlQgb24gRmlyc3QgQ2hhcmFjdGVyICovCisjZGVmaW5lCVJFU19UeF9QCTB4MjgJLyogUmVzZXQgVHhJTlQgUGVuZGluZyAqLworI2RlZmluZQlFUlJfUkVTCQkweDMwCS8qIEVycm9yIFJlc2V0ICovCisjZGVmaW5lCVJFU19IX0lVUwkweDM4CS8qIFJlc2V0IGhpZ2hlc3QgSVVTICovCisKKyNkZWZpbmUJUkVTX1J4X0NSQwkweDQwCS8qIFJlc2V0IFJ4IENSQyBDaGVja2VyICovCisjZGVmaW5lCVJFU19UeF9DUkMJMHg4MAkvKiBSZXNldCBUeCBDUkMgQ2hlY2tlciAqLworI2RlZmluZQlSRVNfRU9NX0wJMHhDMAkvKiBSZXNldCBFT00gbGF0Y2ggKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgMSAqLworCisjZGVmaW5lCUVYVF9JTlRfRU5BQgkweDEJLyogRXh0IEludCBFbmFibGUgKi8KKyNkZWZpbmUJVHhJTlRfRU5BQgkweDIJLyogVHggSW50IEVuYWJsZSAqLworI2RlZmluZQlQQVJfU1BFQwkweDQJLyogUGFyaXR5IGlzIHNwZWNpYWwgY29uZGl0aW9uICovCisKKyNkZWZpbmUJUnhJTlRfRElTQUIJMAkvKiBSeCBJbnQgRGlzYWJsZSAqLworI2RlZmluZQlSeElOVF9GQ0VSUgkweDgJLyogUnggSW50IG9uIEZpcnN0IENoYXJhY3RlciBPbmx5IG9yIEVycm9yICovCisjZGVmaW5lCUlOVF9BTExfUngJMHgxMAkvKiBJbnQgb24gYWxsIFJ4IENoYXJhY3RlcnMgb3IgZXJyb3IgKi8KKyNkZWZpbmUJSU5UX0VSUl9SeAkweDE4CS8qIEludCBvbiBlcnJvciBvbmx5ICovCisKKyNkZWZpbmUJV1RfUkRZX1JUCTB4MjAJLyogV2FpdC9SZWFkeSBvbiBSL1QgKi8KKyNkZWZpbmUJV1RfRk5fUkRZRk4JMHg0MAkvKiBXYWl0L0ZOL1JlYWR5IEZOICovCisjZGVmaW5lCVdUX1JEWV9FTkFCCTB4ODAJLyogV2FpdC9SZWFkeSBFbmFibGUgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgIzIgKEludGVycnVwdCBWZWN0b3IpICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDMgKi8KKworI2RlZmluZQlSeEVOQUJMRQkweDEJLyogUnggRW5hYmxlICovCisjZGVmaW5lCVNZTkNfTF9JTkgJMHgyCS8qIFN5bmMgQ2hhcmFjdGVyIExvYWQgSW5oaWJpdCAqLworI2RlZmluZQlBRERfU00JCTB4NAkvKiBBZGRyZXNzIFNlYXJjaCBNb2RlIChTRExDKSAqLworI2RlZmluZQlSeENSQ19FTkFCCTB4OAkvKiBSeCBDUkMgRW5hYmxlICovCisjZGVmaW5lCUVOVF9ITQkJMHgxMAkvKiBFbnRlciBIdW50IE1vZGUgKi8KKyNkZWZpbmUJQVVUT19FTkFCCTB4MjAJLyogQXV0byBFbmFibGVzICovCisjZGVmaW5lCVJ4NQkJMHgwCS8qIFJ4IDUgQml0cy9DaGFyYWN0ZXIgKi8KKyNkZWZpbmUJUng3CQkweDQwCS8qIFJ4IDcgQml0cy9DaGFyYWN0ZXIgKi8KKyNkZWZpbmUJUng2CQkweDgwCS8qIFJ4IDYgQml0cy9DaGFyYWN0ZXIgKi8KKyNkZWZpbmUJUng4CQkweGMwCS8qIFJ4IDggQml0cy9DaGFyYWN0ZXIgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgNCAqLworCisjZGVmaW5lCVBBUl9FTkEJCTB4MQkvKiBQYXJpdHkgRW5hYmxlICovCisjZGVmaW5lCVBBUl9FVkVOCTB4MgkvKiBQYXJpdHkgRXZlbi9PZGQqICovCisKKyNkZWZpbmUJU1lOQ19FTkFCCTAJLyogU3luYyBNb2RlcyBFbmFibGUgKi8KKyNkZWZpbmUJU0IxCQkweDQJLyogMSBzdG9wIGJpdC9jaGFyICovCisjZGVmaW5lCVNCMTUJCTB4OAkvKiAxLjUgc3RvcCBiaXRzL2NoYXIgKi8KKyNkZWZpbmUJU0IyCQkweGMJLyogMiBzdG9wIGJpdHMvY2hhciAqLworCisjZGVmaW5lCU1PTlNZTkMJCTAJLyogOCBCaXQgU3luYyBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUJQklTWU5DCQkweDEwCS8qIDE2IGJpdCBzeW5jIGNoYXJhY3RlciAqLworI2RlZmluZQlTRExDCQkweDIwCS8qIFNETEMgTW9kZSAoMDExMTExMTAgU3luYyBGbGFnKSAqLworI2RlZmluZQlFWFRTWU5DCQkweDMwCS8qIEV4dGVybmFsIFN5bmMgTW9kZSAqLworCisjZGVmaW5lCVgxQ0xLCQkweDAJLyogeDEgY2xvY2sgbW9kZSAqLworI2RlZmluZQlYMTZDTEsJCTB4NDAJLyogeDE2IGNsb2NrIG1vZGUgKi8KKyNkZWZpbmUJWDMyQ0xLCQkweDgwCS8qIHgzMiBjbG9jayBtb2RlICovCisjZGVmaW5lCVg2NENMSwkJMHhDMAkvKiB4NjQgY2xvY2sgbW9kZSAqLworCisvKiBXcml0ZSBSZWdpc3RlciA1ICovCisKKyNkZWZpbmUJVHhDUkNfRU5BQgkweDEJLyogVHggQ1JDIEVuYWJsZSAqLworI2RlZmluZQlSVFMJCTB4MgkvKiBSVFMgKi8KKyNkZWZpbmUJU0RMQ19DUkMJMHg0CS8qIFNETEMvQ1JDLTE2ICovCisjZGVmaW5lCVR4RU5BQgkJMHg4CS8qIFR4IEVuYWJsZSAqLworI2RlZmluZQlTTkRfQlJLCQkweDEwCS8qIFNlbmQgQnJlYWsgKi8KKyNkZWZpbmUJVHg1CQkweDAJLyogVHggNSBiaXRzIChvciBsZXNzKS9jaGFyYWN0ZXIgKi8KKyNkZWZpbmUJVHg3CQkweDIwCS8qIFR4IDcgYml0cy9jaGFyYWN0ZXIgKi8KKyNkZWZpbmUJVHg2CQkweDQwCS8qIFR4IDYgYml0cy9jaGFyYWN0ZXIgKi8KKyNkZWZpbmUJVHg4CQkweDYwCS8qIFR4IDggYml0cy9jaGFyYWN0ZXIgKi8KKyNkZWZpbmUJRFRSCQkweDgwCS8qIERUUiAqLworCisvKiBXcml0ZSBSZWdpc3RlciA2IChTeW5jIGJpdHMgMC03L1NETEMgQWRkcmVzcyBGaWVsZCkgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgNyAoU3luYyBiaXRzIDgtMTUvU0RMQyAwMTExMTExMCkgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgOCAodHJhbnNtaXQgYnVmZmVyKSAqLworCisvKiBXcml0ZSBSZWdpc3RlciA5IChNYXN0ZXIgaW50ZXJydXB0IGNvbnRyb2wpICovCisjZGVmaW5lCVZJUwkxCS8qIFZlY3RvciBJbmNsdWRlcyBTdGF0dXMgKi8KKyNkZWZpbmUJTlYJMgkvKiBObyBWZWN0b3IgKi8KKyNkZWZpbmUJRExDCTQJLyogRGlzYWJsZSBMb3dlciBDaGFpbiAqLworI2RlZmluZQlNSUUJOAkvKiBNYXN0ZXIgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZQlTVEFUSEkJMHgxMAkvKiBTdGF0dXMgaGlnaCAqLworI2RlZmluZQlOT1JFU0VUCTAJLyogTm8gcmVzZXQgb24gd3JpdGUgdG8gUjkgKi8KKyNkZWZpbmUJQ0hSQgkweDQwCS8qIFJlc2V0IGNoYW5uZWwgQiAqLworI2RlZmluZQlDSFJBCTB4ODAJLyogUmVzZXQgY2hhbm5lbCBBICovCisjZGVmaW5lCUZIV1JFUwkweGMwCS8qIEZvcmNlIGhhcmR3YXJlIHJlc2V0ICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDEwIChtaXNjIGNvbnRyb2wgYml0cykgKi8KKyNkZWZpbmUJQklUNgkxCS8qIDYgYml0LzhiaXQgc3luYyAqLworI2RlZmluZQlMT09QTU9ERSAyCS8qIFNETEMgTG9vcCBtb2RlICovCisjZGVmaW5lCUFCVU5ERVIJNAkvKiBBYm9ydC9mbGFnIG9uIFNETEMgeG1pdCB1bmRlcnJ1biAqLworI2RlZmluZQlNQVJLSURMRSA4CS8qIE1hcmsvZmxhZyBvbiBpZGxlICovCisjZGVmaW5lCUdBT1AJMHgxMAkvKiBHbyBhY3RpdmUgb24gcG9sbCAqLworI2RlZmluZQlOUloJMAkvKiBOUlogbW9kZSAqLworI2RlZmluZQlOUlpJCTB4MjAJLyogTlJaSSBtb2RlICovCisjZGVmaW5lCUZNMQkweDQwCS8qIEZNMSAodHJhbnNpdGlvbiA9IDEpICovCisjZGVmaW5lCUZNMAkweDYwCS8qIEZNMCAodHJhbnNpdGlvbiA9IDApICovCisjZGVmaW5lCUNSQ1BTCTB4ODAJLyogQ1JDIFByZXNldCBJL08gKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgMTEgKENsb2NrIE1vZGUgY29udHJvbCkgKi8KKyNkZWZpbmUJVFJ4Q1hUCTAJLyogVFJ4QyA9IFh0YWwgb3V0cHV0ICovCisjZGVmaW5lCVRSeENUQwkxCS8qIFRSeEMgPSBUcmFuc21pdCBjbG9jayAqLworI2RlZmluZQlUUnhDQlIJMgkvKiBUUnhDID0gQlIgR2VuZXJhdG9yIE91dHB1dCAqLworI2RlZmluZQlUUnhDRFAJMwkvKiBUUnhDID0gRFBMTCBvdXRwdXQgKi8KKyNkZWZpbmUJVFJ4Q09JCTQJLyogVFJ4QyBPL0kgKi8KKyNkZWZpbmUJVENSVHhDUAkwCS8qIFRyYW5zbWl0IGNsb2NrID0gUlR4QyBwaW4gKi8KKyNkZWZpbmUJVENUUnhDUAk4CS8qIFRyYW5zbWl0IGNsb2NrID0gVFJ4QyBwaW4gKi8KKyNkZWZpbmUJVENCUgkweDEwCS8qIFRyYW5zbWl0IGNsb2NrID0gQlIgR2VuZXJhdG9yIG91dHB1dCAqLworI2RlZmluZQlUQ0RQTEwJMHgxOAkvKiBUcmFuc21pdCBjbG9jayA9IERQTEwgb3V0cHV0ICovCisjZGVmaW5lCVJDUlR4Q1AJMAkvKiBSZWNlaXZlIGNsb2NrID0gUlR4QyBwaW4gKi8KKyNkZWZpbmUJUkNUUnhDUAkweDIwCS8qIFJlY2VpdmUgY2xvY2sgPSBUUnhDIHBpbiAqLworI2RlZmluZQlSQ0JSCTB4NDAJLyogUmVjZWl2ZSBjbG9jayA9IEJSIEdlbmVyYXRvciBvdXRwdXQgKi8KKyNkZWZpbmUJUkNEUExMCTB4NjAJLyogUmVjZWl2ZSBjbG9jayA9IERQTEwgb3V0cHV0ICovCisjZGVmaW5lCVJUeENYCTB4ODAJLyogUlR4QyBYdGFsL05vIFh0YWwgKi8KKworLyogV3JpdGUgUmVnaXN0ZXIgMTIgKGxvd2VyIGJ5dGUgb2YgYmF1ZCByYXRlIGdlbmVyYXRvciB0aW1lIGNvbnN0YW50KSAqLworCisvKiBXcml0ZSBSZWdpc3RlciAxMyAodXBwZXIgYnl0ZSBvZiBiYXVkIHJhdGUgZ2VuZXJhdG9yIHRpbWUgY29uc3RhbnQpICovCisKKy8qIFdyaXRlIFJlZ2lzdGVyIDE0IChNaXNjIGNvbnRyb2wgYml0cykgKi8KKyNkZWZpbmUJQlJFTkFCTAkxCS8qIEJhdWQgcmF0ZSBnZW5lcmF0b3IgZW5hYmxlICovCisjZGVmaW5lCUJSU1JDCTIJLyogQmF1ZCByYXRlIGdlbmVyYXRvciBzb3VyY2UgKi8KKyNkZWZpbmUJRFRSUkVRCTQJLyogRFRSL1JlcXVlc3QgZnVuY3Rpb24gKi8KKyNkZWZpbmUJQVVUT0VDSE8gOAkvKiBBdXRvIEVjaG8gKi8KKyNkZWZpbmUJTE9PUEJBSwkweDEwCS8qIExvY2FsIGxvb3BiYWNrICovCisjZGVmaW5lCVNFQVJDSAkweDIwCS8qIEVudGVyIHNlYXJjaCBtb2RlICovCisjZGVmaW5lCVJNQwkweDQwCS8qIFJlc2V0IG1pc3NpbmcgY2xvY2sgKi8KKyNkZWZpbmUJRElTRFBMTAkweDYwCS8qIERpc2FibGUgRFBMTCAqLworI2RlZmluZQlTU0JSCTB4ODAJLyogU2V0IERQTEwgc291cmNlID0gQlIgZ2VuZXJhdG9yICovCisjZGVmaW5lCVNTUlR4QwkweGEwCS8qIFNldCBEUExMIHNvdXJjZSA9IFJUeEMgKi8KKyNkZWZpbmUJU0ZNTQkweGMwCS8qIFNldCBGTSBtb2RlICovCisjZGVmaW5lCVNOUlpJCTB4ZTAJLyogU2V0IE5SWkkgbW9kZSAqLworCisvKiBXcml0ZSBSZWdpc3RlciAxNSAoZXh0ZXJuYWwvc3RhdHVzIGludGVycnVwdCBjb250cm9sKSAqLworI2RlZmluZSBQUklNRQkxCS8qIFI1JyBldGMgcmVnaXN0ZXIgYWNjZXNzIChaODVDMzAvMjMwIG9ubHkpICovCisjZGVmaW5lCVpDSUUJMgkvKiBaZXJvIGNvdW50IElFICovCisjZGVmaW5lIEZJRk9FCTQJLyogWjg1MjMwIG9ubHkgKi8KKyNkZWZpbmUJRENESUUJOAkvKiBEQ0QgSUUgKi8KKyNkZWZpbmUJU1lOQ0lFCTB4MTAJLyogU3luYy9odW50IElFICovCisjZGVmaW5lCUNUU0lFCTB4MjAJLyogQ1RTIElFICovCisjZGVmaW5lCVR4VUlFCTB4NDAJLyogVHggVW5kZXJydW4vRU9NIElFICovCisjZGVmaW5lCUJSS0lFCTB4ODAJLyogQnJlYWsvQWJvcnQgSUUgKi8KKworCisvKiBSZWFkIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUJUnhfQ0hfQVYJMHgxCS8qIFJ4IENoYXJhY3RlciBBdmFpbGFibGUgKi8KKyNkZWZpbmUJWkNPVU5UCQkweDIJLyogWmVybyBjb3VudCAqLworI2RlZmluZQlUeF9CVUZfRU1QCTB4NAkvKiBUeCBCdWZmZXIgZW1wdHkgKi8KKyNkZWZpbmUJRENECQkweDgJLyogRENEICovCisjZGVmaW5lCVNZTkNfSFVOVAkweDEwCS8qIFN5bmMvaHVudCAqLworI2RlZmluZQlDVFMJCTB4MjAJLyogQ1RTICovCisjZGVmaW5lCVR4RU9NCQkweDQwCS8qIFR4IHVuZGVycnVuICovCisjZGVmaW5lCUJSS19BQlJUCTB4ODAJLyogQnJlYWsvQWJvcnQgKi8KKworLyogUmVhZCBSZWdpc3RlciAxICovCisjZGVmaW5lCUFMTF9TTlQJCTB4MQkvKiBBbGwgc2VudCAqLworLyogUmVzaWR1ZSBEYXRhIGZvciA4IFJ4IGJpdHMvY2hhciBwcm9ncmFtbWVkICovCisjZGVmaW5lCVJFUzMJCTB4OAkvKiAwLzMgKi8KKyNkZWZpbmUJUkVTNAkJMHg0CS8qIDAvNCAqLworI2RlZmluZQlSRVM1CQkweGMJLyogMC81ICovCisjZGVmaW5lCVJFUzYJCTB4MgkvKiAwLzYgKi8KKyNkZWZpbmUJUkVTNwkJMHhhCS8qIDAvNyAqLworI2RlZmluZQlSRVM4CQkweDYJLyogMC84ICovCisjZGVmaW5lCVJFUzE4CQkweGUJLyogMS84ICovCisjZGVmaW5lCVJFUzI4CQkweDAJLyogMi84ICovCisvKiBTcGVjaWFsIFJ4IENvbmRpdGlvbiBJbnRlcnJ1cHRzICovCisjZGVmaW5lCVBBUl9FUlIJCTB4MTAJLyogUGFyaXR5IGVycm9yICovCisjZGVmaW5lCVJ4X09WUgkJMHgyMAkvKiBSeCBPdmVycnVuIEVycm9yICovCisjZGVmaW5lCUNSQ19FUlIJCTB4NDAJLyogQ1JDL0ZyYW1pbmcgRXJyb3IgKi8KKyNkZWZpbmUJRU5EX0ZSCQkweDgwCS8qIEVuZCBvZiBGcmFtZSAoU0RMQykgKi8KKworLyogUmVhZCBSZWdpc3RlciAyIChjaGFubmVsIGIgb25seSkgLSBJbnRlcnJ1cHQgdmVjdG9yICovCisKKy8qIFJlYWQgUmVnaXN0ZXIgMyAoaW50ZXJydXB0IHBlbmRpbmcgcmVnaXN0ZXIpIGNoIGEgb25seSAqLworI2RlZmluZQlDSEJFWFQJMHgxCQkvKiBDaGFubmVsIEIgRXh0L1N0YXQgSVAgKi8KKyNkZWZpbmUJQ0hCVHhJUAkweDIJCS8qIENoYW5uZWwgQiBUeCBJUCAqLworI2RlZmluZQlDSEJSeElQCTB4NAkJLyogQ2hhbm5lbCBCIFJ4IElQICovCisjZGVmaW5lCUNIQUVYVAkweDgJCS8qIENoYW5uZWwgQSBFeHQvU3RhdCBJUCAqLworI2RlZmluZQlDSEFUeElQCTB4MTAJCS8qIENoYW5uZWwgQSBUeCBJUCAqLworI2RlZmluZQlDSEFSeElQCTB4MjAJCS8qIENoYW5uZWwgQSBSeCBJUCAqLworCisvKiBSZWFkIFJlZ2lzdGVyIDggKHJlY2VpdmUgZGF0YSByZWdpc3RlcikgKi8KKworLyogUmVhZCBSZWdpc3RlciAxMCAgKG1pc2Mgc3RhdHVzIGJpdHMpICovCisjZGVmaW5lCU9OTE9PUAkyCQkvKiBPbiBsb29wICovCisjZGVmaW5lCUxPT1BTRU5EIDB4MTAJCS8qIExvb3Agc2VuZGluZyAqLworI2RlZmluZQlDTEsyTUlTCTB4NDAJCS8qIFR3byBjbG9ja3MgbWlzc2luZyAqLworI2RlZmluZQlDTEsxTUlTCTB4ODAJCS8qIE9uZSBjbG9jayBtaXNzaW5nICovCisKKy8qIFJlYWQgUmVnaXN0ZXIgMTIgKGxvd2VyIGJ5dGUgb2YgYmF1ZCByYXRlIGdlbmVyYXRvciBjb25zdGFudCkgKi8KKworLyogUmVhZCBSZWdpc3RlciAxMyAodXBwZXIgYnl0ZSBvZiBiYXVkIHJhdGUgZ2VuZXJhdG9yIGNvbnN0YW50KSAqLworCisvKiBSZWFkIFJlZ2lzdGVyIDE1ICh2YWx1ZSBvZiBXUiAxNSkgKi8KKworCisvKgorICoJSW50ZXJydXB0IGhhbmRsaW5nIGZ1bmN0aW9ucyBmb3IgdGhpcyBTQ0MKKyAqLworCitzdHJ1Y3Qgejg1MzBfY2hhbm5lbDsKKyAKK3N0cnVjdCB6ODUzMF9pcnFoYW5kbGVyCit7CisJdm9pZCAoKnJ4KShzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqKTsKKwl2b2lkICgqdHgpKHN0cnVjdCB6ODUzMF9jaGFubmVsICopOworCXZvaWQgKCpzdGF0dXMpKHN0cnVjdCB6ODUzMF9jaGFubmVsICopOworfTsKKworLyoKKyAqCUEgY2hhbm5lbCBvZiB0aGUgWjg1MzAKKyAqLworCitzdHJ1Y3Qgejg1MzBfY2hhbm5lbAoreworCXN0cnVjdAkJejg1MzBfaXJxaGFuZGxlciAqaXJxczsJCS8qIElSUSBoYW5kbGVycyAqLworCS8qCisJICoJU3luY2hyb25vdXMKKwkgKi8KKwl1MTYJCWNvdW50OwkJLyogQnV5ZXMgcmVjZWl2ZWQgKi8KKwl1MTYJCW1heDsJCS8qIE1vc3Qgd2UgY2FuIHJlY2VpdmUgdGhpcyBmcmFtZSAqLworCXUxNgkJbXR1OwkJLyogTVRVIG9mIHRoZSBkZXZpY2UgKi8KKwl1OAkJKmRwdHI7CQkvKiBQb2ludGVyIGludG8gcnggYnVmZmVyICovCisJc3RydWN0IHNrX2J1ZmYJKnNrYjsJCS8qIEJ1ZmZlciBkcHRyIHBvaW50cyBpbnRvICovCisJc3RydWN0IHNrX2J1ZmYJKnNrYjI7CQkvKiBQZW5kaW5nIGJ1ZmZlciAqLworCXU4CQlzdGF0dXM7CQkvKiBDdXJyZW50IERDRCAqLworCXU4CQlkY2RjaGVjazsJLyogd2hpY2ggYml0IHRvIGNoZWNrIGZvciBsaW5lICovCisJdTgJCXN5bmM7CQkvKiBTZXQgaWYgaW4gc3luYyBtb2RlICovCisKKwl1OAkJcmVnc1szMl07CS8qIFJlZ2lzdGVyIG1hcCBmb3IgdGhlIGNoaXAgKi8KKwl1OAkJcGVuZHJlZ3NbMzJdOwkvKiBQZW5kaW5nIHJlZ2lzdGVyIHZhbHVlcyAqLworCQorCXN0cnVjdCBza19idWZmIAkqdHhfc2tiOwkvKiBCdWZmZXIgYmVpbmcgdHJhbnNtaXR0ZWQgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAgKnR4X25leHRfc2tiOwkvKiBOZXh0IHRyYW5zbWl0IGJ1ZmZlciAqLworCXU4CQkqdHhfcHRyOwkvKiBCeXRlIHBvaW50ZXIgaW50byB0aGUgYnVmZmVyICovCisJdTgJCSp0eF9uZXh0X3B0cjsJLyogTmV4dCBwb2ludGVyIHRvIHVzZSAqLworCXU4CQkqdHhfZG1hX2J1ZlsyXTsJLyogVFggZmxpcCBidWZmZXJzIGZvciBETUEgKi8KKwl1OAkJdHhfZG1hX3VzZWQ7CS8qIEZsaXAgYnVmZmVyIHVzYWdlIHRvZ2dsZXIgKi8KKwl1MTYJCXR4Y291bnQ7CS8qIENvdW50IG9mIGJ5dGVzIHRvIHRyYW5zbWl0ICovCisJCisJdm9pZAkJKCpyeF9mdW5jdGlvbikoc3RydWN0IHo4NTMwX2NoYW5uZWwgKiwgc3RydWN0IHNrX2J1ZmYgKik7CisJCisJLyoKKwkgKglTeW5jIERNQQorCSAqLworCQorCXU4CQlyeGRtYTsJCS8qIERNQSBjaGFubmVscyAqLworCXU4CQl0eGRtYTsJCQorCXU4CQlyeGRtYV9vbjsJLyogRE1BIGFjdGl2ZSBpZiBmbGFnIHNldCAqLworCXU4CQl0eGRtYV9vbjsKKwl1OAkJZG1hX251bTsJLyogQnVmZmVyIHdlIGFyZSBETUFpbmcgaW50byAqLworCXU4CQlkbWFfcmVhZHk7CS8qIElzIHRoZSBvdGhlciBidWZmZXIgZnJlZSAqLworCXU4CQlkbWFfdHg7CQkvKiBUWCBpcyB0byB1c2UgRE1BICovCisJdTgJCSpyeF9idWZbMl07CS8qIFRoZSBmbGlwIGJ1ZmZlcnMgKi8KKwkKKwkvKgorCSAqCVN5c3RlbQorCSAqLworCSAKKwlzdHJ1Y3Qgejg1MzBfZGV2ICpkZXY7CQkvKiBaODUyMzAgY2hpcCBpbnN0YW5jZSB3ZSBhcmUgZnJvbSAqLworCXVuc2lnbmVkIGxvbmcJY3RybGlvOwkJLyogSS9PIHBvcnRzICovCisJdW5zaWduZWQgbG9uZwlkYXRhaW87CisKKwkvKgorCSAqCUZvciBQQyB3ZSBlbmNvZGUgdGhpcyB3YXkuCisJICovCQorI2RlZmluZSBaODUzMF9QT1JUX1NMRUVQCTB4ODAwMDAwMDAKKyNkZWZpbmUgWjg1MzBfUE9SVF9PRih4KQkoKHgpJjB4RkZGRikKKworCXUzMgkJcnhfb3ZlcnJ1bjsJCS8qIE92ZXJydW5zIC0gbm90IGRvbmUgeWV0ICovCisJdTMyCQlyeF9jcmNfZXJyOworCisJLyoKKwkgKglCb3VuZCBkZXZpY2UgcG9pbnRlcnMKKwkgKi8KKworCXZvaWQJCSpwcml2YXRlOwkvKiBGb3Igb3VyIG93bmVyICovCisJc3RydWN0IG5ldF9kZXZpY2UJKm5ldGRldmljZTsJLyogTmV0d29yayBsYXllciBkZXZpY2UgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsJLyogTmV0d29yayBsYXllciBzdGF0aXN0aWNzICovCisKKwkvKgorCSAqCUFzeW5jIGZlYXR1cmVzCisJICovCisKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAJKnR0eTsJCS8qIEF0dGFjaGVkIHRlcm1pbmFsICovCisJaW50CQkJbGluZTsJCS8qIE1pbm9yIG51bWJlciAqLworCXdhaXRfcXVldWVfaGVhZF90CW9wZW5fd2FpdDsJLyogVGFza3Mgd2FpdGluZyB0byBvcGVuICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJY2xvc2Vfd2FpdDsJLyogYW5kIGZvciBjbG9zZSB0byBlbmQgKi8KKwl1bnNpZ25lZCBsb25nCQlldmVudDsJCS8qIFBlbmRpbmcgZXZlbnRzICovCisJaW50CQkJZmRjb3VudDsgICAgCS8qICMgb2YgZmQgb24gZGV2aWNlICovCisJaW50CQkJYmxvY2tlZF9vcGVuOwkvKiAjIG9mIGJsb2NrZWQgb3BlbnMgKi8KKwlpbnQJCQl4X2NoYXI7CQkvKiBYT04vWE9GIGNoYXIgKi8KKwl1bnNpZ25lZCBjaGFyIAkJKnhtaXRfYnVmOwkvKiBUcmFuc21pdCBwb2ludGVyICovCisJaW50CQkJeG1pdF9oZWFkOwkvKiBUcmFuc21pdCByaW5nICovCisJaW50CQkJeG1pdF90YWlsOworCWludAkJCXhtaXRfY250OworCWludAkJCWZsYWdzOwkKKwlpbnQJCQl0aW1lb3V0OworCWludAkJCXhtaXRfZmlmb19zaXplOwkvKiBUcmFuc21pdCBGSUZPIGluZm8gKi8KKworCWludAkJCWNsb3NlX2RlbGF5OwkvKiBEbyB3ZSB3YWl0IGZvciBkcmFpbiBvbiBjbG9zZSA/ICovCisJdW5zaWduZWQgc2hvcnQJCWNsb3Npbmdfd2FpdDsKKworCS8qIFdlIG5lZWQgdG8ga25vdyB0aGUgY3VycmVudCBjbG9jayBkaXZpc29yCisJICogdG8gcmVhZCB0aGUgYnBzIHJhdGUgdGhlIGNoaXAgaGFzIGN1cnJlbnRseQorCSAqIGxvYWRlZC4KKwkgKi8KKworCXVuc2lnbmVkIGNoYXIJCWNsa19kaXZpc29yOyAgLyogTWF5IGJlIDEsIDE2LCAzMiwgb3IgNjQgKi8KKwlpbnQJCQl6c19iYXVkOworCisJaW50CQkJbWFnaWM7CisJaW50CQkJYmF1ZF9iYXNlOwkJLyogQmF1ZCBwYXJhbWV0ZXJzICovCisJaW50CQkJY3VzdG9tX2Rpdmlzb3I7CisKKworCXVuc2lnbmVkIGNoYXIJCXR4X2FjdGl2ZTsgLyogY2hhcmFjdGVyIGlzIGJlaW5nIHhtaXR0ZWQgKi8KKwl1bnNpZ25lZCBjaGFyCQl0eF9zdG9wcGVkOyAvKiBvdXRwdXQgaXMgc3VzcGVuZGVkICovCisKKwlzcGlubG9ja190CQkqbG9jazsJICAvKiBEZXZpY3IgbG9jayAqLworfTsJCisKKy8qCisgKglFYWNoIFo4NTN4MCBkZXZpY2UuCisgKi8JCisgCitzdHJ1Y3Qgejg1MzBfZGV2Cit7CisJY2hhciAqbmFtZTsJLyogRGV2aWNlIGluc3RhbmNlIG5hbWUgKi8KKwlzdHJ1Y3Qgejg1MzBfY2hhbm5lbCBjaGFuQTsJLyogU0NDIGNoYW5uZWwgQSAqLworCXN0cnVjdCB6ODUzMF9jaGFubmVsIGNoYW5COwkvKiBTQ0MgY2hhbm5lbCBCICovCisJaW50IHR5cGU7CisjZGVmaW5lIFo4NTMwCTAJLyogTk1PUyBkaW5vc2F1ciAqLwkKKyNkZWZpbmUgWjg1QzMwCTEJLyogQ01PUyAtIGJldHRlciAqLworI2RlZmluZSBaODUyMzAJMgkvKiBDTU9TIHdpdGggcmVhbCBGSUZPICovCisJaW50IGlycTsJLyogSW50ZXJydXB0IGZvciB0aGUgZGV2aWNlICovCisJaW50IGFjdGl2ZTsJLyogU29mdCBpbnRlcnJ1cHQgZW5hYmxlIC0gdGhlIE1hYyBkb2Vzbid0IAorCQkJICAgYWx3YXlzIGhhdmUgYSBoYXJkIGRpc2FibGUgb24gaXRzIDg1MzBzLi4uICovCisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworCisvKgorICoJRnVuY3Rpb25zCisgKi8KKyAKK2V4dGVybiB1OCB6ODUzMF9kZWFkX3BvcnRbXTsKK2V4dGVybiB1OCB6ODUzMF9oZGxjX2tpbG9zdHJlYW1fODUyMzBbXTsKK2V4dGVybiB1OCB6ODUzMF9oZGxjX2tpbG9zdHJlYW1bXTsKK2V4dGVybiBpcnFyZXR1cm5fdCB6ODUzMF9pbnRlcnJ1cHQoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworZXh0ZXJuIHZvaWQgejg1MzBfZGVzY3JpYmUoc3RydWN0IHo4NTMwX2RldiAqLCBjaGFyICptYXBwaW5nLCB1bnNpZ25lZCBsb25nIGlvKTsKK2V4dGVybiBpbnQgejg1MzBfaW5pdChzdHJ1Y3Qgejg1MzBfZGV2ICopOworZXh0ZXJuIGludCB6ODUzMF9zaHV0ZG93bihzdHJ1Y3Qgejg1MzBfZGV2ICopOworZXh0ZXJuIGludCB6ODUzMF9zeW5jX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IHo4NTMwX2NoYW5uZWwgKik7CitleHRlcm4gaW50IHo4NTMwX3N5bmNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IHo4NTMwX2NoYW5uZWwgKik7CitleHRlcm4gaW50IHo4NTMwX3N5bmNfZG1hX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IHo4NTMwX2NoYW5uZWwgKik7CitleHRlcm4gaW50IHo4NTMwX3N5bmNfZG1hX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCB6ODUzMF9jaGFubmVsICopOworZXh0ZXJuIGludCB6ODUzMF9zeW5jX3R4ZG1hX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IHo4NTMwX2NoYW5uZWwgKik7CitleHRlcm4gaW50IHo4NTMwX3N5bmNfdHhkbWFfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IHo4NTMwX2NoYW5uZWwgKik7CitleHRlcm4gaW50IHo4NTMwX2NoYW5uZWxfbG9hZChzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqLCB1OCAqKTsKK2V4dGVybiBpbnQgejg1MzBfcXVldWVfeG1pdChzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKno4NTMwX2dldF9zdGF0cyhzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqYyk7CitleHRlcm4gdm9pZCB6ODUzMF9udWxsX3J4KHN0cnVjdCB6ODUzMF9jaGFubmVsICpjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworCisvKgorICoJU3RhbmRhcmQgaW50ZXJydXB0IHZlY3RvciBzZXRzCisgKi8KKyAKK2V4dGVybiBzdHJ1Y3Qgejg1MzBfaXJxaGFuZGxlciB6ODUzMF9zeW5jLCB6ODUzMF9hc3luYywgejg1MzBfbm9wOworCisvKgorICoJQXN5bmNocm9ub3VzIEludGVyZmFjaW5nCisgKi8KKworI2RlZmluZSBTRVJJQUxfTUFHSUMgMHg1MzAxCisKKy8qCisgKiBUaGUgc2l6ZSBvZiB0aGUgc2VyaWFsIHhtaXQgYnVmZmVyIGlzIDEgcGFnZSwgb3IgNDA5NiBieXRlcworICovCisKKyNkZWZpbmUgU0VSSUFMX1hNSVRfU0laRSA0MDk2CisjZGVmaW5lIFdBS0VVUF9DSEFSUwkyNTYKKworLyoKKyAqIEV2ZW50cyBhcmUgdXNlZCB0byBzY2hlZHVsZSB0aGluZ3MgdG8gaGFwcGVuIGF0IHRpbWVyLWludGVycnVwdAorICogdGltZSwgaW5zdGVhZCBvZiBhdCBycyBpbnRlcnJ1cHQgdGltZS4KKyAqLworI2RlZmluZSBSU19FVkVOVF9XUklURV9XQUtFVVAJMAorCisvKiBJbnRlcm5hbCBmbGFncyB1c2VkIG9ubHkgYnkga2VybmVsL2Nocl9kcnYvc2VyaWFsLmMgKi8KKyNkZWZpbmUgWklMT0dfSU5JVElBTElaRUQJMHg4MDAwMDAwMCAvKiBTZXJpYWwgcG9ydCB3YXMgaW5pdGlhbGl6ZWQgKi8KKyNkZWZpbmUgWklMT0dfQ0FMTE9VVF9BQ1RJVkUJMHg0MDAwMDAwMCAvKiBDYWxsIG91dCBkZXZpY2UgaXMgYWN0aXZlICovCisjZGVmaW5lIFpJTE9HX05PUk1BTF9BQ1RJVkUJMHgyMDAwMDAwMCAvKiBOb3JtYWwgZGV2aWNlIGlzIGFjdGl2ZSAqLworI2RlZmluZSBaSUxPR19CT09UX0FVVE9DT05GCTB4MTAwMDAwMDAgLyogQXV0b2NvbmZpZ3VyZSBwb3J0IG9uIGJvb3R1cCAqLworI2RlZmluZSBaSUxPR19DTE9TSU5HCQkweDA4MDAwMDAwIC8qIFNlcmlhbCBwb3J0IGlzIGNsb3NpbmcgKi8KKyNkZWZpbmUgWklMT0dfQ1RTX0ZMT1cJCTB4MDQwMDAwMDAgLyogRG8gQ1RTIGZsb3cgY29udHJvbCAqLworI2RlZmluZSBaSUxPR19DSEVDS19DRAkJMHgwMjAwMDAwMCAvKiBpLmUuLCBDTE9DQUwgKi8KKworI2VuZGlmIC8qICEoX1o4NTMwX0gpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93ZC5jIGIvZHJpdmVycy9uZXQvd2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjA1ZDliCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2QuYwpAQCAtMCwwICsxLDU1OSBAQAorLyogd2QuYzogQSBXRDgweDMgZXRoZXJuZXQgZHJpdmVyIGZvciBsaW51eC4gKi8KKy8qCisJV3JpdHRlbiAxOTkzLTk0IGJ5IERvbmFsZCBCZWNrZXIuCisKKwlDb3B5cmlnaHQgMTk5MyBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisJRGlyZWN0b3IsIE5hdGlvbmFsIFNlY3VyaXR5IEFnZW5jeS4KKworCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKwlvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorCisJVGhlIGF1dGhvciBtYXkgYmUgcmVhY2hlZCBhcyBiZWNrZXJAc2N5bGQuY29tLCBvciBDL08KKwlTY3lsZCBDb21wdXRpbmcgQ29ycG9yYXRpb24KKwk0MTAgU2V2ZXJuIEF2ZS4sIFN1aXRlIDIxMAorCUFubmFwb2xpcyBNRCAyMTQwMworCisJVGhpcyBpcyBhIGRyaXZlciBmb3IgV0Q4MDAzIGFuZCBXRDgwMTMgImNvbXBhdGlibGUiIGV0aGVyY2FyZHMuCisKKwlUaGFua3MgdG8gUnVzcyBOZWxzb24gKG5lbHNvbkBjcm53eXIuY29tKSBmb3IgbG9hbmluZyBtZSBhIFdEODAxMy4KKworCUNoYW5nZWxvZzoKKworCVBhdWwgR29ydG1ha2VyCTogbXVsdGlwbGUgY2FyZCBzdXBwb3J0IGZvciBtb2R1bGUgdXNlcnMsIHN1cHBvcnQKKwkJCSAgZm9yIG5vbi1zdGFuZGFyZCBtZW1vcnkgc2l6ZXMuCisKKworKi8KKworc3RhdGljIGNvbnN0IGNoYXIgdmVyc2lvbltdID0KKwkid2QuYzp2MS4xMCA5LzIzLzk0IERvbmFsZCBCZWNrZXIgKGJlY2tlckBjZXNkaXMuZ3NmYy5uYXNhLmdvdilcbiI7CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICI4MzkwLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgIndkIgorCisvKiBBIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIEkvTyBhZGRyZXNzZXMgdG8gYmUgcHJvYmVkLiAqLworc3RhdGljIHVuc2lnbmVkIGludCB3ZF9wb3J0bGlzdFtdIF9faW5pdGRhdGEgPQorezB4MzAwLCAweDI4MCwgMHgzODAsIDB4MjQwLCAwfTsKKworc3RhdGljIGludCB3ZF9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcik7CisKK3N0YXRpYyBpbnQgd2Rfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHdkX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB3ZF9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwKKwkJCQkJCWludCByaW5nX3BhZ2UpOworc3RhdGljIHZvaWQgd2RfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcmluZ19vZmZzZXQpOworc3RhdGljIHZvaWQgd2RfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzdGFydF9wYWdlKTsKK3N0YXRpYyBpbnQgd2RfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwwKKyNkZWZpbmUgV0RfU1RBUlRfUEcJCTB4MDAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKyNkZWZpbmUgV0QwM19TVE9QX1BHCTB4MjAJLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcgKi8KKyNkZWZpbmUgV0QxM19TVE9QX1BHCTB4NDAJLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcgKi8KKworI2RlZmluZSBXRF9DTURSRUcJCTAJCS8qIE9mZnNldCB0byBBU0lDIGNvbW1hbmQgcmVnaXN0ZXIuICovCisjZGVmaW5lCSBXRF9SRVNFVAkJMHg4MAkvKiBCb2FyZCByZXNldCwgaW4gV0RfQ01EUkVHLiAqLworI2RlZmluZQkgV0RfTUVNRU5CCQkweDQwCS8qIEVuYWJsZSB0aGUgc2hhcmVkIG1lbW9yeS4gKi8KKyNkZWZpbmUgV0RfQ01EUkVHNQkJNQkJLyogT2Zmc2V0IHRvIDE2LWJpdC1vbmx5IEFTSUMgcmVnaXN0ZXIgNS4gKi8KKyNkZWZpbmUJIElTQTE2CQkJMHg4MAkvKiBFbmFibGUgMTYgYml0IGFjY2VzcyBmcm9tIHRoZSBJU0EgYnVzLiAqLworI2RlZmluZQkgTklDMTYJCQkweDQwCS8qIEVuYWJsZSAxNiBiaXQgYWNjZXNzIGZyb20gdGhlIDgzOTAuICovCisjZGVmaW5lIFdEX05JQ19PRkZTRVQJMTYJCS8qIE9mZnNldCB0byB0aGUgODM5MCBmcm9tIHRoZSBiYXNlX2FkZHIuICovCisjZGVmaW5lIFdEX0lPX0VYVEVOVAkzMgorCisMCisvKglQcm9iZSBmb3IgdGhlIFdEODAwMyBhbmQgV0Q4MDEzLiAgVGhlc2UgY2FyZHMgaGF2ZSB0aGUgc3RhdGlvbgorCWFkZHJlc3MgUFJPTSBhdCBJL08gcG9ydHMgPGJhc2U+KzggdG8gPGJhc2U+KzEzLCB3aXRoIGEgY2hlY2tzdW0KKwlmb2xsb3dpbmcuIEEgU291bmRibGFzdGVyIGNhbiBoYXZlIHRoZSBzYW1lIGNoZWNrc3VtIGFzIGFuIFdEZXRoZXJjYXJkLAorCXNvIHdlIGhhdmUgYW4gZXh0cmEgZXhjbHVzaW9uYXJ5IGNoZWNrIGZvciBpdC4KKworCVRoZSB3ZF9wcm9iZTEoKSByb3V0aW5lIGluaXRpYWxpemVzIHRoZSBjYXJkIGFuZCBmaWxscyB0aGUKKwlzdGF0aW9uIGFkZHJlc3MgZmllbGQuICovCisKK3N0YXRpYyBpbnQgX19pbml0IGRvX3dkX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJc3RydWN0IHJlc291cmNlICpyOworCWludCBiYXNlX2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlpbnQgaXJxID0gZGV2LT5pcnE7CisJaW50IG1lbV9zdGFydCA9IGRldi0+bWVtX3N0YXJ0OworCWludCBtZW1fZW5kID0gZGV2LT5tZW1fZW5kOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCisJaWYgKGJhc2VfYWRkciA+IDB4MWZmKSB7CS8qIENoZWNrIGEgdXNlciBzcGVjaWZpZWQgbG9jYXRpb24uICovCisJCXIgPSByZXF1ZXN0X3JlZ2lvbihiYXNlX2FkZHIsIFdEX0lPX0VYVEVOVCwgIndkLXByb2JlIik7CisJCWlmICggciA9PSBOVUxMKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJaSA9IHdkX3Byb2JlMShkZXYsIGJhc2VfYWRkcik7CisJCWlmIChpICE9IDApICAKKwkJCXJlbGVhc2VfcmVnaW9uKGJhc2VfYWRkciwgV0RfSU9fRVhURU5UKTsKKwkJZWxzZQorCQkJci0+bmFtZSA9IGRldi0+bmFtZTsKKwkJcmV0dXJuIGk7CisJfQorCWVsc2UgaWYgKGJhc2VfYWRkciAhPSAwKQkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJCXJldHVybiAtRU5YSU87CisKKwlmb3IgKGkgPSAwOyB3ZF9wb3J0bGlzdFtpXTsgaSsrKSB7CisJCWludCBpb2FkZHIgPSB3ZF9wb3J0bGlzdFtpXTsKKwkJciA9IHJlcXVlc3RfcmVnaW9uKGlvYWRkciwgV0RfSU9fRVhURU5ULCAid2QtcHJvYmUiKTsKKwkJaWYgKHIgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlpZiAod2RfcHJvYmUxKGRldiwgaW9hZGRyKSA9PSAwKSB7CisJCQlyLT5uYW1lID0gZGV2LT5uYW1lOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBXRF9JT19FWFRFTlQpOworCQlkZXYtPmlycSA9IGlycTsKKwkJZGV2LT5tZW1fc3RhcnQgPSBtZW1fc3RhcnQ7CisJCWRldi0+bWVtX2VuZCA9IG1lbV9lbmQ7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyIC0gV0RfTklDX09GRlNFVCwgV0RfSU9fRVhURU5UKTsKKwlpb3VubWFwKGVpX3N0YXR1cy5tZW0pOworfQorCisjaWZuZGVmIE1PRFVMRQorc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgd2RfcHJvYmUoaW50IHVuaXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2VpX25ldGRldigpOworCWludCBlcnI7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlzcHJpbnRmKGRldi0+bmFtZSwgImV0aCVkIiwgdW5pdCk7CisJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKKworCWVyciA9IGRvX3dkX3Byb2JlKGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCXJldHVybiBkZXY7CitvdXQxOgorCWNsZWFudXBfY2FyZChkZXYpOworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCB3ZF9wcm9iZTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkcikKK3sKKwlpbnQgaTsKKwlpbnQgY2hlY2tzdW0gPSAwOworCWludCBhbmNpZW50ID0gMDsJCQkvKiBBbiBvbGQgY2FyZCB3aXRob3V0IGNvbmZpZyByZWdpc3RlcnMuICovCisJaW50IHdvcmQxNiA9IDA7CQkJCS8qIDAgPSA4IGJpdCwgMSA9IDE2IGJpdCAqLworCWNvbnN0IGNoYXIgKm1vZGVsX25hbWU7CisJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWNoZWNrc3VtICs9IGluYihpb2FkZHIgKyA4ICsgaSk7CisJaWYgKGluYihpb2FkZHIgKyA4KSA9PSAweGZmIAkvKiBFeHRyYSBjaGVjayB0byBhdm9pZCBzb3VuZGNhcmQuICovCisJCXx8IGluYihpb2FkZHIgKyA5KSA9PSAweGZmCisJCXx8IChjaGVja3N1bSAmIDB4ZmYpICE9IDB4RkYpCisJCXJldHVybiAtRU5PREVWOworCisJLyogQ2hlY2sgZm9yIHNlbWktdmFsaWQgbWVtX3N0YXJ0L2VuZCB2YWx1ZXMgaWYgc3VwcGxpZWQuICovCisJaWYgKChkZXYtPm1lbV9zdGFydCAlIDB4MjAwMCkgfHwgKGRldi0+bWVtX2VuZCAlIDB4MjAwMCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAid2QuYzogdXNlciBzdXBwbGllZCBtZW1fc3RhcnQgb3IgbWVtX2VuZCBub3Qgb24gOGtCIGJvdW5kYXJ5IC0gaWdub3JlZC5cbiIpOworCQlkZXYtPm1lbV9zdGFydCA9IDA7CisJCWRldi0+bWVtX2VuZCA9IDA7CisJfQorCisJaWYgKGVpX2RlYnVnICAmJiAgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKHZlcnNpb24pOworCisJcHJpbnRrKCIlczogV0Q4MHgzIGF0ICUjM3gsIiwgZGV2LT5uYW1lLCBpb2FkZHIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiICUyLjJYIiwgZGV2LT5kZXZfYWRkcltpXSA9IGluYihpb2FkZHIgKyA4ICsgaSkpOworCisJLyogVGhlIGZvbGxvd2luZyBQdXJlRGF0YSBwcm9iZSBjb2RlIHdhcyBjb250cmlidXRlZCBieQorCSAgIE1pa2UgSmFnZGlzIDxqYWdneUBwdXJwbGV0LmRlbW9uLmNvLnVrPi4gUHVyZWRhdGEgZG9lcyBzb2Z0d2FyZQorCSAgIGNvbmZpZ3VyYXRpb24gZGlmZmVyZW50bHkgZnJvbSBvdGhlcnMgc28gd2UgaGF2ZSB0byBjaGVjayBmb3IgdGhlbS4KKwkgICBUaGlzIGRldGVjdHMgYW4gOCBiaXQsIDE2IGJpdCBvciBkdW1iIChUb3NoaWJhLCBqdW1wZXJlZCkgY2FyZC4KKwkgICAqLworCWlmIChpbmIoaW9hZGRyKzApID09ICdQJyAmJiBpbmIoaW9hZGRyKzEpID09ICdEJykgeworCQl1bnNpZ25lZCBjaGFyIHJlZzUgPSBpbmIoaW9hZGRyKzUpOworCisJCXN3aXRjaCAoaW5iKGlvYWRkcisyKSkgeworCQljYXNlIDB4MDM6IHdvcmQxNiA9IDA7IG1vZGVsX25hbWUgPSAiUERJODAyMy04IjsJYnJlYWs7CisJCWNhc2UgMHgwNTogd29yZDE2ID0gMDsgbW9kZWxfbmFtZSA9ICJQRFVDODAyMyI7CWJyZWFrOworCQljYXNlIDB4MGE6IHdvcmQxNiA9IDE7IG1vZGVsX25hbWUgPSAiUERJODAyMy0xNiI7IGJyZWFrOworCQkJLyogRWl0aGVyIDB4MDEgKGR1bWIpIG9yIHRoZXkndmUgcmVsZWFzZWQgYSBuZXcgdmVyc2lvbi4gKi8KKwkJZGVmYXVsdDoJIHdvcmQxNiA9IDA7IG1vZGVsX25hbWUgPSAiUERJODAyMyI7CWJyZWFrOworCQl9CisJCWRldi0+bWVtX3N0YXJ0ID0gKChyZWc1ICYgMHgxYykgKyAweGMwKSA8PCAxMjsKKwkJZGV2LT5pcnEgPSAocmVnNSAmIDB4ZTApID09IDB4ZTAgPyAxMCA6IChyZWc1ID4+IDUpICsgMTsKKwl9IGVsc2UgewkJCQkJCQkJLyogRW5kIG9mIFB1cmVEYXRhIHByb2JlICovCisJCS8qIFRoaXMgbWV0aG9kIG9mIGNoZWNraW5nIGZvciBhIDE2LWJpdCBib2FyZCBpcyBib3Jyb3dlZCBmcm9tIHRoZQorCQkgICB3ZS5jIGRyaXZlci4gIEEgc2ltcGxlciBtZXRob2QgaXMganVzdCB0byBsb29rIGluIEFTSUMgcmVnLiAweDAzLgorCQkgICBJJ20gY29tcGFyaW5nIHRoZSB0d28gbWV0aG9kIGluIGFscGhhIHRlc3QgdG8gbWFrZSBjZXJ0YWluIHRoZXkKKwkJICAgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdC4gKi8KKwkJLyogQ2hlY2sgZm9yIHRoZSBvbGQgOCBiaXQgYm9hcmQgLSBpdCBoYXMgcmVnaXN0ZXIgMC84IGFsaWFzaW5nLgorCQkgICBEbyBOT1QgY2hlY2sgaT49NiBoZXJlIC0tIGl0IGhhbmdzIHRoZSBvbGQgODAwMyBib2FyZHMhICovCisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlpZiAoaW5iKGlvYWRkcitpKSAhPSBpbmIoaW9hZGRyKzgraSkpCisJCQkJYnJlYWs7CisJCWlmIChpID49IDYpIHsKKwkJCWFuY2llbnQgPSAxOworCQkJbW9kZWxfbmFtZSA9ICJXRDgwMDMtb2xkIjsKKwkJCXdvcmQxNiA9IDA7CisJCX0gZWxzZSB7CisJCQlpbnQgdG1wID0gaW5iKGlvYWRkcisxKTsgLyogZmlkZGxlIHdpdGggMTZiaXQgYml0ICovCisJCQlvdXRiKCB0bXAgXiAweDAxLCBpb2FkZHIrMSApOyAvKiBhdHRlbXB0IHRvIGNsZWFyIDE2Yml0IGJpdCAqLworCQkJaWYgKCgoaW5iKCBpb2FkZHIrMSkgJiAweDAxKSA9PSAweDAxKSAvKiBBIDE2IGJpdCBjYXJkICovCisJCQkJJiYgKHRtcCAmIDB4MDEpID09IDB4MDEJKSB7CQkJCS8qIEluIGEgMTYgc2xvdC4gKi8KKwkJCQlpbnQgYXNpY19yZWc1ID0gaW5iKGlvYWRkcitXRF9DTURSRUc1KTsKKwkJCQkvKiBNYWdpYyB0byBzZXQgQVNJQyB0byB3b3JkLXdpZGUgbW9kZS4gKi8KKwkJCQlvdXRiKCBOSUMxNiB8IChhc2ljX3JlZzUmMHgxZiksIGlvYWRkcitXRF9DTURSRUc1KTsKKwkJCQlvdXRiKHRtcCwgaW9hZGRyKzEpOworCQkJCW1vZGVsX25hbWUgPSAiV0Q4MDEzIjsKKwkJCQl3b3JkMTYgPSAxOwkJLyogV2UgaGF2ZSBhIDE2Yml0IGJvYXJkIGhlcmUhICovCisJCQl9IGVsc2UgeworCQkJCW1vZGVsX25hbWUgPSAiV0Q4MDAzIjsKKwkJCQl3b3JkMTYgPSAwOworCQkJfQorCQkJb3V0Yih0bXAsIGlvYWRkcisxKTsJCQkvKiBSZXN0b3JlIG9yaWdpbmFsIHJlZzEgdmFsdWUuICovCisJCX0KKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQlpZiAoICFhbmNpZW50ICYmIChpbmIoaW9hZGRyKzEpICYgMHgwMSkgIT0gKHdvcmQxNiAmIDB4MDEpKQorCQkJcHJpbnRrKCJcbldEODA/MzogQnVzIHdpZHRoIGNvbmZsaWN0LCAlZCAocHJvYmUpICE9ICVkIChyZWcgcmVwb3J0KS4iLAorCQkJCSAgIHdvcmQxNiA/IDE2IDogOCwgKGluYihpb2FkZHIrMSkgJiAweDAxKSA/IDE2IDogOCk7CisjZW5kaWYKKwl9CisKKyNpZiBkZWZpbmVkKFdEX1NITUVNKSAmJiBXRF9TSE1FTSA+IDB4ODAwMDAKKwkvKiBBbGxvdyBhIGNvbXBpbGUtdGltZSBvdmVycmlkZS4JICovCisJZGV2LT5tZW1fc3RhcnQgPSBXRF9TSE1FTTsKKyNlbHNlCisJaWYgKGRldi0+bWVtX3N0YXJ0ID09IDApIHsKKwkJLyogU2FuaXR5IGFuZCBvbGQgODAwMyBjaGVjayAqLworCQlpbnQgcmVnMCA9IGluYihpb2FkZHIpOworCQlpZiAocmVnMCA9PSAweGZmIHx8IHJlZzAgPT0gMCkgeworCQkJLyogRnV0dXJlIHBsYW46IHRoaXMgY291bGQgY2hlY2sgYSBmZXcgbGlrZWx5IGxvY2F0aW9ucyBmaXJzdC4gKi8KKwkJCWRldi0+bWVtX3N0YXJ0ID0gMHhkMDAwMDsKKwkJCXByaW50aygiIGFzc2lnbmluZyBhZGRyZXNzICUjbHgiLCBkZXYtPm1lbV9zdGFydCk7CisJCX0gZWxzZSB7CisJCQlpbnQgaGlnaF9hZGRyX2JpdHMgPSBpbmIoaW9hZGRyK1dEX0NNRFJFRzUpICYgMHgxZjsKKwkJCS8qIFNvbWUgYm9hcmRzIGRvbid0IGhhdmUgdGhlIHJlZ2lzdGVyIDUgLS0gaXQgcmV0dXJucyAweGZmLiAqLworCQkJaWYgKGhpZ2hfYWRkcl9iaXRzID09IDB4MWYgfHwgd29yZDE2ID09IDApCisJCQkJaGlnaF9hZGRyX2JpdHMgPSAweDAxOworCQkJZGV2LT5tZW1fc3RhcnQgPSAoKHJlZzAmMHgzZikgPDwgMTMpICsgKGhpZ2hfYWRkcl9iaXRzIDw8IDE5KTsKKwkJfQorCX0KKyNlbmRpZgorCisJLyogVGhlIDgzOTAgaXNuJ3QgYXQgdGhlIGJhc2UgYWRkcmVzcyAtLSB0aGUgQVNJQyByZWdzIGFyZSB0aGVyZSEgKi8KKwlkZXYtPmJhc2VfYWRkciA9IGlvYWRkcitXRF9OSUNfT0ZGU0VUOworCisJaWYgKGRldi0+aXJxIDwgMikgeworCQlpbnQgaXJxbWFwW10gPSB7OSwzLDUsNywxMCwxMSwxNSw0fTsKKwkJaW50IHJlZzEgPSBpbmIoaW9hZGRyKzEpOworCQlpbnQgcmVnNCA9IGluYihpb2FkZHIrNCk7CisJCWlmIChhbmNpZW50IHx8IHJlZzEgPT0gMHhmZikgewkvKiBBY2shISBObyB3YXkgdG8gcmVhZCB0aGUgSVJRISAqLworCQkJc2hvcnQgbmljX2FkZHIgPSBpb2FkZHIrV0RfTklDX09GRlNFVDsKKwkJCXVuc2lnbmVkIGxvbmcgaXJxX21hc2s7CisKKwkJCS8qIFdlIGhhdmUgYW4gb2xkLXN0eWxlIGV0aGVyY2FyZCB0aGF0IGRvZXNuJ3QgcmVwb3J0IGl0cyBJUlEKKwkJCSAgIGxpbmUuICBEbyBhdXRvaXJxIHRvIGZpbmQgdGhlIElSUSBsaW5lLiBOb3RlIHRoYXQgdGhpcyBJUyBOT1QKKwkJCSAgIGEgcmVsaWFibGUgd2F5IHRvIHRyaWdnZXIgYW4gaW50ZXJydXB0LiAqLworCQkJb3V0Yl9wKEU4MzkwX05PRE1BICsgRTgzOTBfU1RPUCwgbmljX2FkZHIpOworCQkJb3V0YigweDAwLCBuaWNfYWRkcitFTjBfSU1SKTsJLyogRGlzYWJsZSBhbGwgaW50cnMuICovCisJCQkKKwkJCWlycV9tYXNrID0gcHJvYmVfaXJxX29uKCk7CisJCQlvdXRiX3AoMHhmZiwgbmljX2FkZHIgKyBFTjBfSU1SKTsJLyogRW5hYmxlIGFsbCBpbnRlcnJ1cHRzLiAqLworCQkJb3V0Yl9wKDB4MDAsIG5pY19hZGRyICsgRU4wX1JDTlRMTyk7CisJCQlvdXRiX3AoMHgwMCwgbmljX2FkZHIgKyBFTjBfUkNOVEhJKTsKKwkJCW91dGIoRTgzOTBfUlJFQUQrRTgzOTBfU1RBUlQsIG5pY19hZGRyKTsgLyogVHJpZ2dlciBpdC4uLiAqLworCQkJbWRlbGF5KDIwKTsKKwkJCWRldi0+aXJxID0gcHJvYmVfaXJxX29mZihpcnFfbWFzayk7CisJCQkKKwkJCW91dGJfcCgweDAwLCBuaWNfYWRkcitFTjBfSU1SKTsJLyogTWFzayBhbGwgaW50cnMuIGFnYWluLiAqLworCisJCQlpZiAoZWlfZGVidWcgPiAyKQorCQkJCXByaW50aygiIGF1dG9pcnEgaXMgJWQiLCBkZXYtPmlycSk7CisJCQlpZiAoZGV2LT5pcnEgPCAyKQorCQkJCWRldi0+aXJxID0gd29yZDE2ID8gMTAgOiA1OworCQl9IGVsc2UKKwkJCWRldi0+aXJxID0gaXJxbWFwWygocmVnNCA+PiA1KSAmIDB4MDMpICsgKHJlZzEgJiAweDA0KV07CisJfSBlbHNlIGlmIChkZXYtPmlycSA9PSAyKQkJLyogRml4dXAgYm9nb3NpdHk6IElSUTIgaXMgcmVhbGx5IElSUTkgKi8KKwkJZGV2LT5pcnEgPSA5OworCisJLyogU25hcmYgdGhlIGludGVycnVwdCBub3cuICBUaGVyZSdzIG5vIHBvaW50IGluIHdhaXRpbmcgc2luY2Ugd2UgY2Fubm90CisJICAgc2hhcmUgYW5kIHRoZSBib2FyZCB3aWxsIHVzdWFsbHkgYmUgZW5hYmxlZC4gKi8KKwlpID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGVpX2ludGVycnVwdCwgMCwgRFJWX05BTUUsIGRldik7CisJaWYgKGkpIHsKKwkJcHJpbnRrICgiIHVuYWJsZSB0byBnZXQgSVJRICVkLlxuIiwgZGV2LT5pcnEpOworCQlyZXR1cm4gaTsKKwl9CisKKwkvKiBPSywgd2VyZSBhcmUgY2VydGFpbiB0aGlzIGlzIGdvaW5nIHRvIHdvcmsuICBTZXR1cCB0aGUgZGV2aWNlLiAqLworCWVpX3N0YXR1cy5uYW1lID0gbW9kZWxfbmFtZTsKKwllaV9zdGF0dXMud29yZDE2ID0gd29yZDE2OworCWVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gV0RfU1RBUlRfUEc7CisJZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPSBXRF9TVEFSVF9QRyArIFRYX1BBR0VTOworCisJLyogRG9uJ3QgbWFwIGluIHRoZSBzaGFyZWQgbWVtb3J5IHVudGlsIHRoZSBib2FyZCBpcyBhY3R1YWxseSBvcGVuZWQuICovCisKKwkvKiBTb21lIGNhcmRzIChlZyBXRDgwMDNFQlQpIGNhbiBiZSBqdW1wZXJlZCBmb3IgbW9yZSAoMzJrISkgbWVtb3J5LiAqLworCWlmIChkZXYtPm1lbV9lbmQgIT0gMCkgeworCQllaV9zdGF0dXMuc3RvcF9wYWdlID0gKGRldi0+bWVtX2VuZCAtIGRldi0+bWVtX3N0YXJ0KS8yNTY7CisJCWVpX3N0YXR1cy5wcml2ID0gZGV2LT5tZW1fZW5kIC0gZGV2LT5tZW1fc3RhcnQ7CisJfSBlbHNlIHsKKwkJZWlfc3RhdHVzLnN0b3BfcGFnZSA9IHdvcmQxNiA/IFdEMTNfU1RPUF9QRyA6IFdEMDNfU1RPUF9QRzsKKwkJZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyAoZWlfc3RhdHVzLnN0b3BfcGFnZSAtIFdEX1NUQVJUX1BHKSoyNTY7CisJCWVpX3N0YXR1cy5wcml2ID0gKGVpX3N0YXR1cy5zdG9wX3BhZ2UgLSBXRF9TVEFSVF9QRykqMjU2OworCX0KKworCWVpX3N0YXR1cy5tZW0gPSBpb3JlbWFwKGRldi0+bWVtX3N0YXJ0LCBlaV9zdGF0dXMucHJpdik7CisJaWYgKCFlaV9zdGF0dXMubWVtKSB7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwcmludGsoIiAlcywgSVJRICVkLCBzaGFyZWQgbWVtb3J5IGF0ICUjbHgtJSNseC5cbiIsCisJCSAgIG1vZGVsX25hbWUsIGRldi0+aXJxLCBkZXYtPm1lbV9zdGFydCwgZGV2LT5tZW1fZW5kLTEpOworCisJZWlfc3RhdHVzLnJlc2V0XzgzOTAgPSAmd2RfcmVzZXRfODM5MDsKKwllaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmd2RfYmxvY2tfaW5wdXQ7CisJZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZ3ZF9ibG9ja19vdXRwdXQ7CisJZWlfc3RhdHVzLmdldF84MzkwX2hkciA9ICZ3ZF9nZXRfODM5MF9oZHI7CisJZGV2LT5vcGVuID0gJndkX29wZW47CisJZGV2LT5zdG9wID0gJndkX2Nsb3NlOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlaV9wb2xsOworI2VuZGlmCisJTlM4MzkwX2luaXQoZGV2LCAwKTsKKworI2lmIDEKKwkvKiBFbmFibGUgaW50ZXJydXB0IGdlbmVyYXRpb24gb24gc29mdGNvbmZpZyBjYXJkcyAtLSBNLlUgKi8KKwkvKiAuLiBidXQgcG9zc2libHkgcG90ZW50aWFsbHkgdW5zYWZlIC0gRG9uYWxkICovCisJaWYgKGluYihpb2FkZHIrMTQpICYgMHgyMCkKKwkJb3V0YihpbmIoaW9hZGRyKzQpfDB4ODAsIGlvYWRkcis0KTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3dkX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyIC0gV0RfTklDX09GRlNFVDsgLyogV0RfQ01EUkVHICovCisKKyAgLyogTWFwIGluIHRoZSBzaGFyZWQgbWVtb3J5LiBBbHdheXMgc2V0IHJlZ2lzdGVyIDAgbGFzdCB0byByZW1haW4KKwkgY29tcGF0aWJsZSB3aXRoIHZlcnkgb2xkIGJvYXJkcy4gKi8KKyAgZWlfc3RhdHVzLnJlZzAgPSAoKGRldi0+bWVtX3N0YXJ0Pj4xMykgJiAweDNmKSB8IFdEX01FTUVOQjsKKyAgZWlfc3RhdHVzLnJlZzUgPSAoKGRldi0+bWVtX3N0YXJ0Pj4xOSkgJiAweDFmKSB8IE5JQzE2OworCisgIGlmIChlaV9zdGF0dXMud29yZDE2KQorCSAgb3V0YihlaV9zdGF0dXMucmVnNSwgaW9hZGRyK1dEX0NNRFJFRzUpOworICBvdXRiKGVpX3N0YXR1cy5yZWcwLCBpb2FkZHIpOyAvKiBXRF9DTURSRUcgKi8KKworICBlaV9vcGVuKGRldik7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAord2RfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCB3ZF9jbWRfcG9ydCA9IGRldi0+YmFzZV9hZGRyIC0gV0RfTklDX09GRlNFVDsgLyogV0RfQ01EUkVHICovCisKKwlvdXRiKFdEX1JFU0VULCB3ZF9jbWRfcG9ydCk7CisJaWYgKGVpX2RlYnVnID4gMSkgcHJpbnRrKCJyZXNldHRpbmcgdGhlIFdEODB4MyB0PSVsdS4uLiIsIGppZmZpZXMpOworCWVpX3N0YXR1cy50eGluZyA9IDA7CisKKwkvKiBTZXQgdXAgdGhlIEFTSUMgcmVnaXN0ZXJzLCBqdXN0IGluIGNhc2Ugc29tZXRoaW5nIGNoYW5nZWQgdGhlbS4gKi8KKwlvdXRiKCgoKGRldi0+bWVtX3N0YXJ0Pj4xMykgJiAweDNmKXxXRF9NRU1FTkIpLCB3ZF9jbWRfcG9ydCk7CisJaWYgKGVpX3N0YXR1cy53b3JkMTYpCisJCW91dGIoTklDMTYgfCAoKGRldi0+bWVtX3N0YXJ0Pj4xOSkgJiAweDFmKSwgd2RfY21kX3BvcnQrV0RfQ01EUkVHNSk7CisKKwlpZiAoZWlfZGVidWcgPiAxKSBwcmludGsoInJlc2V0IGRvbmVcbiIpOworCXJldHVybjsKK30KKworLyogR3JhYiB0aGUgODM5MCBzcGVjaWZpYyBoZWFkZXIuIFNpbWlsYXIgdG8gdGhlIGJsb2NrX2lucHV0IHJvdXRpbmUsIGJ1dAorICAgd2UgZG9uJ3QgbmVlZCB0byBiZSBjb25jZXJuZWQgd2l0aCByaW5nIHdyYXAgYXMgdGhlIGhlYWRlciB3aWxsIGJlIGF0CisgICB0aGUgc3RhcnQgb2YgYSBwYWdlLCBzbyB3ZSBvcHRpbWl6ZSBhY2NvcmRpbmdseS4gKi8KKworc3RhdGljIHZvaWQKK3dkX2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZTgzOTBfcGt0X2hkciAqaGRyLCBpbnQgcmluZ19wYWdlKQoreworCisJaW50IHdkX2NtZHJlZyA9IGRldi0+YmFzZV9hZGRyIC0gV0RfTklDX09GRlNFVDsgLyogV0RfQ01EUkVHICovCisJdm9pZCBfX2lvbWVtICpoZHJfc3RhcnQgPSBlaV9zdGF0dXMubWVtICsgKChyaW5nX3BhZ2UgLSBXRF9TVEFSVF9QRyk8PDgpOworCisJLyogV2UnbGwgYWx3YXlzIGdldCBhIDQgYnl0ZSBoZWFkZXIgcmVhZCBmb2xsb3dlZCBieSBhIHBhY2tldCByZWFkLCBzbworCSAgIHdlIGVuYWJsZSAxNiBiaXQgbW9kZSBiZWZvcmUgdGhlIGhlYWRlciwgYW5kIGRpc2FibGUgYWZ0ZXIgdGhlIGJvZHkuICovCisJaWYgKGVpX3N0YXR1cy53b3JkMTYpCisJCW91dGIoSVNBMTYgfCBlaV9zdGF0dXMucmVnNSwgd2RfY21kcmVnK1dEX0NNRFJFRzUpOworCisjaWZkZWYgX19CSUdfRU5ESUFOCisJLyogT2ZmaWNpYWxseSB0aGlzIGlzIHdoYXQgd2UgYXJlIGRvaW5nLCBidXQgdGhlIHJlYWRsKCkgaXMgZmFzdGVyICovCisJLyogdW5mb3J0dW5hdGVseSBpdCBpc24ndCBlbmRpYW4gYXdhcmUgb2YgdGhlIHN0cnVjdCAgICAgICAgICAgICAgICovCisJbWVtY3B5X2Zyb21pbyhoZHIsIGhkcl9zdGFydCwgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSk7CisJaGRyLT5jb3VudCA9IGxlMTZfdG9fY3B1KGhkci0+Y291bnQpOworI2Vsc2UKKwkoKHVuc2lnbmVkIGludCopaGRyKVswXSA9IHJlYWRsKGhkcl9zdGFydCk7CisjZW5kaWYKK30KKworLyogQmxvY2sgaW5wdXQgYW5kIG91dHB1dCBhcmUgZWFzeSBvbiBzaGFyZWQgbWVtb3J5IGV0aGVyY2FyZHMsIGFuZCB0cml2aWFsCisgICBvbiB0aGUgV2VzdGVybiBkaWdpdGFsIGNhcmQgd2hlcmUgdGhlcmUgaXMgbm8gY2hvaWNlIG9mIGhvdyB0byBkbyBpdC4KKyAgIFRoZSBvbmx5IGNvbXBsaWNhdGlvbnMgYXJlIHRoYXQgdGhlIHJpbmcgYnVmZmVyIHdyYXBzLCBhbmQgbmVlZCB0byBtYXAKKyAgIHN3aXRjaCBiZXR3ZWVuIDgtIGFuZCAxNi1iaXQgbW9kZXMuICovCisKK3N0YXRpYyB2b2lkCit3ZF9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsIGludCByaW5nX29mZnNldCkKK3sKKwlpbnQgd2RfY21kcmVnID0gZGV2LT5iYXNlX2FkZHIgLSBXRF9OSUNfT0ZGU0VUOyAvKiBXRF9DTURSRUcgKi8KKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHJpbmdfb2Zmc2V0IC0gKFdEX1NUQVJUX1BHPDw4KTsKKwl2b2lkIF9faW9tZW0gKnhmZXJfc3RhcnQgPSBlaV9zdGF0dXMubWVtICsgb2Zmc2V0OworCisJaWYgKG9mZnNldCArIGNvdW50ID4gZWlfc3RhdHVzLnByaXYpIHsKKwkJLyogV2UgbXVzdCB3cmFwIHRoZSBpbnB1dCBtb3ZlLiAqLworCQlpbnQgc2VtaV9jb3VudCA9IGVpX3N0YXR1cy5wcml2IC0gb2Zmc2V0OworCQltZW1jcHlfZnJvbWlvKHNrYi0+ZGF0YSwgeGZlcl9zdGFydCwgc2VtaV9jb3VudCk7CisJCWNvdW50IC09IHNlbWlfY291bnQ7CisJCW1lbWNweV9mcm9taW8oc2tiLT5kYXRhICsgc2VtaV9jb3VudCwgZWlfc3RhdHVzLm1lbSArIFRYX1BBR0VTICogMjU2LCBjb3VudCk7CisJfSBlbHNlIHsKKwkJLyogUGFja2V0IGlzIGluIG9uZSBjaHVuayAtLSB3ZSBjYW4gY29weSArIGNrc3VtLiAqLworCQlldGhfaW9fY29weV9hbmRfc3VtKHNrYiwgeGZlcl9zdGFydCwgY291bnQsIDApOworCX0KKworCS8qIFR1cm4gb2ZmIDE2IGJpdCBhY2Nlc3Mgc28gdGhhdCByZWJvb3Qgd29ya3MuCSBJU0EgYnJhaW4tZGFtYWdlICovCisJaWYgKGVpX3N0YXR1cy53b3JkMTYpCisJCW91dGIoZWlfc3RhdHVzLnJlZzUsIHdkX2NtZHJlZytXRF9DTURSRUc1KTsKK30KKworc3RhdGljIHZvaWQKK3dkX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCQlpbnQgc3RhcnRfcGFnZSkKK3sKKwlpbnQgd2RfY21kcmVnID0gZGV2LT5iYXNlX2FkZHIgLSBXRF9OSUNfT0ZGU0VUOyAvKiBXRF9DTURSRUcgKi8KKwl2b2lkIF9faW9tZW0gKnNobWVtID0gZWlfc3RhdHVzLm1lbSArICgoc3RhcnRfcGFnZSAtIFdEX1NUQVJUX1BHKTw8OCk7CisKKworCWlmIChlaV9zdGF0dXMud29yZDE2KSB7CisJCS8qIFR1cm4gb24gYW5kIG9mZiAxNiBiaXQgYWNjZXNzIHNvIHRoYXQgcmVib290IHdvcmtzLiAqLworCQlvdXRiKElTQTE2IHwgZWlfc3RhdHVzLnJlZzUsIHdkX2NtZHJlZytXRF9DTURSRUc1KTsKKwkJbWVtY3B5X3RvaW8oc2htZW0sIGJ1ZiwgY291bnQpOworCQlvdXRiKGVpX3N0YXR1cy5yZWc1LCB3ZF9jbWRyZWcrV0RfQ01EUkVHNSk7CisJfSBlbHNlCisJCW1lbWNweV90b2lvKHNobWVtLCBidWYsIGNvdW50KTsKK30KKworCitzdGF0aWMgaW50Cit3ZF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCB3ZF9jbWRyZWcgPSBkZXYtPmJhc2VfYWRkciAtIFdEX05JQ19PRkZTRVQ7IC8qIFdEX0NNRFJFRyAqLworCisJaWYgKGVpX2RlYnVnID4gMSkKKwkJcHJpbnRrKCIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQuXG4iLCBkZXYtPm5hbWUpOworCWVpX2Nsb3NlKGRldik7CisKKwkvKiBDaGFuZ2UgZnJvbSAxNi1iaXQgdG8gOC1iaXQgc2hhcmVkIG1lbW9yeSBzbyByZWJvb3Qgd29ya3MuICovCisJaWYgKGVpX3N0YXR1cy53b3JkMTYpCisJCW91dGIoZWlfc3RhdHVzLnJlZzUsIHdkX2NtZHJlZyArIFdEX0NNRFJFRzUgKTsKKworCS8qIEFuZCBkaXNhYmxlIHRoZSBzaGFyZWQgbWVtb3J5LiAqLworCW91dGIoZWlfc3RhdHVzLnJlZzAgJiB+V0RfTUVNRU5CLCB3ZF9jbWRyZWcpOworCisJcmV0dXJuIDA7Cit9CisKKwwKKyNpZmRlZiBNT0RVTEUKKyNkZWZpbmUgTUFYX1dEX0NBUkRTCTQJLyogTWF4IG51bWJlciBvZiB3ZCBjYXJkcyBwZXIgbW9kdWxlICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl93ZFtNQVhfV0RfQ0FSRFNdOworc3RhdGljIGludCBpb1tNQVhfV0RfQ0FSRFNdOworc3RhdGljIGludCBpcnFbTUFYX1dEX0NBUkRTXTsKK3N0YXRpYyBpbnQgbWVtW01BWF9XRF9DQVJEU107CitzdGF0aWMgaW50IG1lbV9lbmRbTUFYX1dEX0NBUkRTXTsJLyogZm9yIG5vbiBzdGQuIG1lbSBzaXplICovCisKK21vZHVsZV9wYXJhbV9hcnJheShpbywgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkobWVtLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG1lbV9lbmQsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiSS9PIGJhc2UgYWRkcmVzcyhlcykiKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRIG51bWJlcihzKSAoaWdub3JlZCBmb3IgUHVyZURhdGEgYm9hcmRzKSIpOworTU9EVUxFX1BBUk1fREVTQyhtZW0sICJtZW1vcnkgYmFzZSBhZGRyZXNzKGVzKShpZ25vcmVkIGZvciBQdXJlRGF0YSBib2FyZHMpIik7CitNT0RVTEVfUEFSTV9ERVNDKG1lbV9lbmQsICJtZW1vcnkgZW5kIGFkZHJlc3MoZXMpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklTQSBXZXN0ZXJuIERpZ2l0YWwgd2Q4MDAzL3dkODAxMyA7IFNNQyBFbGl0ZSwgRWxpdGUxNiBldGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogVGhpcyBpcyBzZXQgdXAgc28gdGhhdCBvbmx5IGEgc2luZ2xlIGF1dG9wcm9iZSB0YWtlcyBwbGFjZSBwZXIgY2FsbC4KK0lTQSBkZXZpY2UgYXV0b3Byb2JlcyBvbiBhIHJ1bm5pbmcgbWFjaGluZSBhcmUgbm90IHJlY29tbWVuZGVkLiAqLworaW50Citpbml0X21vZHVsZSh2b2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IHRoaXNfZGV2LCBmb3VuZCA9IDA7CisKKwlmb3IgKHRoaXNfZGV2ID0gMDsgdGhpc19kZXYgPCBNQVhfV0RfQ0FSRFM7IHRoaXNfZGV2KyspIHsKKwkJaWYgKGlvW3RoaXNfZGV2XSA9PSAwKSAgeworCQkJaWYgKHRoaXNfZGV2ICE9IDApIGJyZWFrOyAvKiBvbmx5IGF1dG9wcm9iZSAxc3Qgb25lICovCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIndkLmM6IFByZXNlbnRseSBhdXRvcHJvYmluZyAobm90IHJlY29tbWVuZGVkKSBmb3IgYSBzaW5nbGUgY2FyZC5cbiIpOworCQl9CisJCWRldiA9IGFsbG9jX2VpX25ldGRldigpOworCQlpZiAoIWRldikKKwkJCWJyZWFrOworCQlkZXYtPmlycSA9IGlycVt0aGlzX2Rldl07CisJCWRldi0+YmFzZV9hZGRyID0gaW9bdGhpc19kZXZdOworCQlkZXYtPm1lbV9zdGFydCA9IG1lbVt0aGlzX2Rldl07CisJCWRldi0+bWVtX2VuZCA9IG1lbV9lbmRbdGhpc19kZXZdOworCQlpZiAoZG9fd2RfcHJvYmUoZGV2KSA9PSAwKSB7CisJCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgeworCQkJCWRldl93ZFtmb3VuZCsrXSA9IGRldjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNsZWFudXBfY2FyZChkZXYpOworCQl9CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIndkLmM6IE5vIHdkODB4MyBjYXJkIGZvdW5kIChpL28gPSAweCV4KS5cbiIsIGlvW3RoaXNfZGV2XSk7CisJCWJyZWFrOworCX0KKwlpZiAoZm91bmQpCisJCXJldHVybiAwOworCXJldHVybiAtRU5YSU87Cit9CisKK3ZvaWQKK2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaW50IHRoaXNfZGV2OworCisJZm9yICh0aGlzX2RldiA9IDA7IHRoaXNfZGV2IDwgTUFYX1dEX0NBUkRTOyB0aGlzX2RldisrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfd2RbdGhpc19kZXZdOworCQlpZiAoZGV2KSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQkJY2xlYW51cF9jYXJkKGRldik7CisJCQlmcmVlX25ldGRldihkZXYpOworCQl9CisJfQorfQorI2VuZGlmIC8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFhYTEyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL0tjb25maWcKQEAgLTAsMCArMSwzNjUgQEAKKyMKKyMgV2lyZWxlc3MgTEFOIGRldmljZSBjb25maWd1cmF0aW9uCisjCisKK21lbnUgIldpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKSIKKwlkZXBlbmRzIG9uIE5FVERFVklDRVMKKworY29uZmlnIE5FVF9SQURJTworCWJvb2wgIldpcmVsZXNzIExBTiBkcml2ZXJzIChub24taGFtcmFkaW8pICYgV2lyZWxlc3MgRXh0ZW5zaW9ucyIKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciB3aXJlbGVzcyBMQU5zIGFuZCBldmVyeXRoaW5nIGhhdmluZyB0byBkbyB3aXRoIHJhZGlvLAorCSAgYnV0IG5vdCB3aXRoIGFtYXRldXIgcmFkaW8gb3IgRk0gYnJvYWRjYXN0aW5nLgorCisJICBTYXlpbmcgWSBoZXJlIGFsc28gZW5hYmxlcyB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9ucyAoY3JlYXRlcworCSAgL3Byb2MvbmV0L3dpcmVsZXNzIGFuZCBlbmFibGVzIGl3Y29uZmlnIGFjY2VzcykuIFRoZSBXaXJlbGVzcworCSAgRXh0ZW5zaW9uIGlzIGEgZ2VuZXJpYyBBUEkgYWxsb3dpbmcgYSBkcml2ZXIgdG8gZXhwb3NlIHRvIHRoZSB1c2VyCisJICBzcGFjZSBjb25maWd1cmF0aW9uIGFuZCBzdGF0aXN0aWNzIHNwZWNpZmljIHRvIGNvbW1vbiBXaXJlbGVzcyBMQU5zLgorCSAgVGhlIGJlYXV0eSBvZiBpdCBpcyB0aGF0IGEgc2luZ2xlIHNldCBvZiB0b29sIGNhbiBzdXBwb3J0IGFsbCB0aGUKKwkgIHZhcmlhdGlvbnMgb2YgV2lyZWxlc3MgTEFOcywgcmVnYXJkbGVzcyBvZiB0aGVpciB0eXBlIChhcyBsb25nIGFzCisJICB0aGUgZHJpdmVyIHN1cHBvcnRzIFdpcmVsZXNzIEV4dGVuc2lvbikuIEFub3RoZXIgYWR2YW50YWdlIGlzIHRoYXQKKwkgIHRoZXNlIHBhcmFtZXRlcnMgbWF5IGJlIGNoYW5nZWQgb24gdGhlIGZseSB3aXRob3V0IHJlc3RhcnRpbmcgdGhlCisJICBkcml2ZXIgKG9yIExpbnV4KS4gSWYgeW91IHdpc2ggdG8gdXNlIFdpcmVsZXNzIEV4dGVuc2lvbnMgd2l0aAorCSAgd2lyZWxlc3MgUENNQ0lBIChQQy0pIGNhcmRzLCB5b3UgbmVlZCB0byBzYXkgWSBoZXJlOyB5b3UgY2FuIGZldGNoCisJICB0aGUgdG9vbHMgZnJvbQorCSAgPGh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvVG9vbHMuaHRtbD4uCisKKwkgIFNvbWUgdXNlci1sZXZlbCBkcml2ZXJzIGZvciBzY2FyYWIgZGV2aWNlcyB3aGljaCBkb24ndCByZXF1aXJlCisJICBzcGVjaWFsIGtlcm5lbCBzdXBwb3J0IGFyZSBhdmFpbGFibGUgZnJvbQorCSAgPGZ0cDovL3NoYWRvdy5jYWJpLm5ldC9wdWIvTGludXgvPi4KKworIyBOb3RlIDogdGhlIGNhcmRzIGFyZSBvYnNvbGV0ZSAoY2FuJ3QgYnV5IHRoZW0gYW55bW9yZSksIGJ1dCB0aGUgZHJpdmVycworIyBhcmUgbm90LCBhcyBwZW9wbGUgYXJlIHN0aWxsIHVzaW5nIHRoZW0uLi4KK2NvbW1lbnQgIk9ic29sZXRlIFdpcmVsZXNzIGNhcmRzIHN1cHBvcnQgKHByZS04MDIuMTEpIgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIChJTkVUIHx8IElTQSB8fCBQQ01DSUEpCisKK2NvbmZpZyBTVFJJUAorCXRyaXN0YXRlICJTVFJJUCAoTWV0cmljb20gc3Rhcm1vZGUgcmFkaW8gSVApIgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIElORVQKKwktLS1oZWxwLS0tCisJICBTYXkgWSBpZiB5b3UgaGF2ZSBhIE1ldHJpY29tIHJhZGlvIGFuZCBpbnRlbmQgdG8gdXNlIFN0YXJtb2RlIFJhZGlvCisJICBJUC4gU1RSSVAgaXMgYSByYWRpbyBwcm90b2NvbCBkZXZlbG9wZWQgZm9yIHRoZSBNb3NxdWl0b05ldCBwcm9qZWN0CisJICAob24gdGhlIFdXVyBhdCA8aHR0cDovL21vc3F1aXRvbmV0LnN0YW5mb3JkLmVkdS8+KSB0byBzZW5kIEludGVybmV0CisJICB0cmFmZmljIHVzaW5nIE1ldHJpY29tIHJhZGlvcy4gIE1ldHJpY29tIHJhZGlvcyBhcmUgc21hbGwsIGJhdHRlcnkKKwkgIHBvd2VyZWQsIDEwMGtiaXQvc2VjIHBhY2tldCByYWRpbyB0cmFuc2NlaXZlcnMsIGFib3V0IHRoZSBzaXplIGFuZAorCSAgd2VpZ2h0IG9mIGEgY2VsbHVsYXIgdGVsZXBob25lLiAoWW91IG1heSBhbHNvIGhhdmUgaGVhcmQgdGhlbSBjYWxsZWQKKwkgICJNZXRyaWNvbSBtb2RlbXMiIGJ1dCB3ZSBhdm9pZCB0aGUgdGVybSAibW9kZW0iIGJlY2F1c2UgaXQgbWlzbGVhZHMKKwkgIG1hbnkgcGVvcGxlIGludG8gdGhpbmtpbmcgdGhhdCB5b3UgY2FuIHBsdWcgYSBNZXRyaWNvbSBtb2RlbSBpbnRvIGEKKwkgIHBob25lIGxpbmUgYW5kIHVzZSBpdCBhcyBhIG1vZGVtLikKKworCSAgWW91IGNhbiB1c2UgU1RSSVAgb24gYW55IExpbnV4IG1hY2hpbmUgd2l0aCBhIHNlcmlhbCBwb3J0LCBhbHRob3VnaAorCSAgaXQgaXMgb2J2aW91c2x5IG1vc3QgdXNlZnVsIGZvciBwZW9wbGUgd2l0aCBsYXB0b3AgY29tcHV0ZXJzLiBJZiB5b3UKKwkgIHRoaW5rIHlvdSBtaWdodCBnZXQgYSBNZXRyaWNvbSByYWRpbyBpbiB0aGUgZnV0dXJlLCB0aGVyZSBpcyBubyBoYXJtCisJICBpbiBzYXlpbmcgWSB0byBTVFJJUCBub3csIGV4Y2VwdCB0aGF0IGl0IG1ha2VzIHRoZSBrZXJuZWwgYSBiaXQKKwkgIGJpZ2dlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBzdHJpcC4KKworY29uZmlnIEFSTEFOCisJdHJpc3RhdGUgIkFpcm9uZXQgQXJsYW4gNjU1ICYgSUMyMjAwIERTIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgSVNBICYmICE2NEJJVAorCS0tLWhlbHAtLS0KKwkgIEFpcm9uZXQgbWFrZXMgQXJsYW4sIGEgY2xhc3Mgb2Ygd2lyZWxlc3MgTEFOIGFkYXB0ZXJzLiBUaGVzZSB1c2UgdGhlCisJICB3d3cuVGVseG9uLmNvbSBjaGlwLCB3aGljaCBpcyBhbHNvIHVzZWQgb24gc2V2ZXJhbCBzaW1pbGFyIGNhcmRzLgorCSAgVGhpcyBkcml2ZXIgaXMgdGVzdGVkIG9uIHRoZSA2NTUgYW5kIElDMjIwMCBzZXJpZXMgY2FyZHMuIExvb2sgYXQKKwkgIDxodHRwOi8vd3d3LnlsZW51cm1lLmVlL35lbG1lci82NTUvPiBmb3IgdGhlIGxhdGVzdCBpbmZvcm1hdGlvbi4KKworCSAgVGhlIGRyaXZlciBpcyBidWlsdCBhcyB0d28gbW9kdWxlcywgYXJsYW4gYW5kIGFybGFuLXByb2MuIFRoZSBsYXR0ZXIKKwkgIGlzIHRoZSAvcHJvYyBpbnRlcmZhY2UgYW5kIGlzIG5vdCBuZWVkZWQgbW9zdCBvZiB0aW1lLgorCisJICBPbiBzb21lIGNvbXB1dGVycyB0aGUgY2FyZCBlbmRzIHVwIGluIG5vbi12YWxpZCBzdGF0ZSBhZnRlciBzb21lCisJICB0aW1lLiBVc2UgYSBwaW5nLXJlc2V0IHNjcmlwdCB0byBjbGVhciBpdC4KKworY29uZmlnIFdBVkVMQU4KKwl0cmlzdGF0ZSAiQVQmVC9MdWNlbnQgb2xkIFdhdmVMQU4gJiBERUMgUm9hbUFib3V0IERTIElTQSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIElTQQorCS0tLWhlbHAtLS0KKwkgIFRoZSBMdWNlbnQgV2F2ZUxBTiAoZm9ybWVybHkgTkNSIGFuZCBBVCZUOyBvciBERUMgUm9hbUFib3V0IERTKSBpcworCSAgYSBSYWRpbyBMQU4gKHdpcmVsZXNzIEV0aGVybmV0LWxpa2UgTG9jYWwgQXJlYSBOZXR3b3JrKSB1c2luZyB0aGUKKwkgIHJhZGlvIGZyZXF1ZW5jaWVzIDkwMCBNSHogYW5kIDIuNCBHSHouCisKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnQgdGhlIElTQSB2ZXJzaW9uIG9mIHRoZSBXYXZlTEFOIGNhcmQuICBBIHNlcGFyYXRlCisJICBkcml2ZXIgZm9yIHRoZSBQQ01DSUEgKFBDLWNhcmQpIGhhcmR3YXJlIGlzIGF2YWlsYWJsZSBpbiBEYXZpZAorCSAgSGluZHMnIHBjbWNpYS1jcyBwYWNrYWdlIChzZWUgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9DaGFuZ2VzPgorCSAgZm9yIGxvY2F0aW9uKS4KKworCSAgSWYgeW91IHdhbnQgdG8gdXNlIGFuIElTQSBXYXZlTEFOIGNhcmQgdW5kZXIgTGludXgsIHNheSBZIGFuZCByZWFkCisJICB0aGUgRXRoZXJuZXQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiBTb21lIG1vcmUgc3BlY2lmaWMKKwkgIGluZm9ybWF0aW9uIGlzIGNvbnRhaW5lZCBpbgorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3dhdmVsYW4udHh0PiBhbmQgaW4gdGhlIHNvdXJjZSBjb2RlCisJICA8ZmlsZTpkcml2ZXJzL25ldC93YXZlbGFuLnAuaD4uCisKKwkgIFlvdSB3aWxsIGFsc28gbmVlZCB0aGUgd2lyZWxlc3MgdG9vbHMgcGFja2FnZSBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvVG9vbHMuaHRtbD4uCisJICBQbGVhc2UgcmVhZCB0aGUgbWFuIHBhZ2VzIGNvbnRhaW5lZCB0aGVyZWluLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCB3YXZlbGFuLgorCitjb25maWcgUENNQ0lBX1dBVkVMQU4KKwl0cmlzdGF0ZSAiQVQmVC9MdWNlbnQgb2xkIFdhdmVMQU4gUGNtY2lhIHdpcmVsZXNzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgUENNQ0lBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIGF0dGFjaCBhbiBBVCZUL0x1Y2VudCBXYXZlbGFuIFBDTUNJQQorCSAgKFBDLWNhcmQpIHdpcmVsZXNzIEV0aGVybmV0IG5ldHdvcmtpbmcgY2FyZCB0byB5b3VyIGNvbXB1dGVyLiAgVGhpcworCSAgZHJpdmVyIGlzIGZvciB0aGUgbm9uLUlFRUUtODAyLjExIFdhdmVsYW4gY2FyZHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHdhdmVsYW5fY3MuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgUENNQ0lBX05FVFdBVkUKKwl0cmlzdGF0ZSAiWGlyY29tIE5ldHdhdmUgQWlyU3VyZmVyIFBjbWNpYSB3aXJlbGVzcyBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFBDTUNJQQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggdGhpcyB0eXBlIG9mIFBDTUNJQSAoUEMtY2FyZCkKKwkgIHdpcmVsZXNzIEV0aGVybmV0IG5ldHdvcmtpbmcgY2FyZCB0byB5b3VyIGNvbXB1dGVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBuZXR3YXZlX2NzLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29tbWVudCAiV2lyZWxlc3MgODAyLjExIEZyZXF1ZW5jeSBIb3BwaW5nIGNhcmRzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgUENNQ0lBCisKK2NvbmZpZyBQQ01DSUFfUkFZQ1MKKwl0cmlzdGF0ZSAiQXZpYXRvci9SYXl0aGVvbiAyLjRNSHogd2lyZWxlc3Mgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBQQ01DSUEKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIGFuIEF2aWF0b3IvUmF5dGhlb24gUENNQ0lBCisJICAoUEMtY2FyZCkgd2lyZWxlc3MgRXRoZXJuZXQgbmV0d29ya2luZyBjYXJkIHRvIHlvdXIgY29tcHV0ZXIuCisJICBQbGVhc2UgcmVhZCB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcmF5X2NzLnR4dD4gZm9yCisJICBkZXRhaWxzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCByYXlfY3MuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb21tZW50ICJXaXJlbGVzcyA4MDIuMTFiIElTQS9QQ0kgY2FyZHMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiAoSVNBIHx8IFBDSSB8fCBQUENfUE1BQyB8fCBQQ01DSUEpCisKK2NvbmZpZyBBSVJPCisJdHJpc3RhdGUgIkNpc2NvL0Fpcm9uZXQgMzRYLzM1WC80NTAwLzQ4MDAgSVNBIGFuZCBQQ0kgY2FyZHMiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgSVNBICYmIChQQ0kgfHwgQlJPS0VOKQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgdGhlIHN0YW5kYXJkIExpbnV4IGRyaXZlciB0byBzdXBwb3J0IENpc2NvL0Fpcm9uZXQgSVNBIGFuZAorCSAgUENJIDgwMi4xMSB3aXJlbGVzcyBjYXJkcy4KKwkgIEl0IHN1cHBvcnRzIHRoZSBuZXcgODAyLjExYiBjYXJkcyBmcm9tIENpc2NvIChDaXNjbyAzNFgsIENpc2NvIDM1WAorCSAgLSB3aXRoIG9yIHdpdGhvdXQgZW5jcnlwdGlvbikgYXMgd2VsbCBhcyBjYXJkIGJlZm9yZSB0aGUgQ2lzY28KKwkgIGFxdWlzaXRpb24gKEFpcm9uZXQgNDUwMCwgQWlyb25ldCA0ODAwLCBBaXJvbmV0IDQ4MDBCKS4KKworCSAgVGhpcyBkcml2ZXIgc3VwcG9ydCBib3RoIHRoZSBzdGFuZGFyZCBMaW51eCBXaXJlbGVzcyBFeHRlbnNpb25zCisJICBhbmQgQ2lzY28gcHJvcHJpZXRhcnkgQVBJLCBzbyBib3RoIHRoZSBMaW51eCBXaXJlbGVzcyBUb29scyBhbmQgdGhlCisJICBDaXNjbyBMaW51eCB1dGlsaXRpZXMgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBjYXJkLgorCisJICBUaGUgZHJpdmVyIGNhbiBiZSBjb21waWxlZCBhcyBhIG1vZHVsZSBhbmQgd2lsbCBiZSBuYW1lZCAiYWlybyIuCisKK2NvbmZpZyBIRVJNRVMKKwl0cmlzdGF0ZSAiSGVybWVzIGNoaXBzZXQgODAyLjExYiBzdXBwb3J0IChPcmlub2NvL1ByaXNtMi9TeW1ib2wpIgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIChQUENfUE1BQyB8fCBQQ0kgfHwgUENNQ0lBKQorCS0tLWhlbHAtLS0KKwkgIEEgZHJpdmVyIGZvciA4MDIuMTFiIHdpcmVsZXNzIGNhcmRzIGJhc2VkIGJhc2VkIG9uIHRoZSAiSGVybWVzIiBvcgorCSAgSW50ZXJzaWwgSEZBMzg0eCAoUHJpc20gMikgTUFDIGNvbnRyb2xsZXIuICBUaGlzIGluY2x1ZGVzIHRoZSB2YXN0CisJICBtYWpvcml0eSBvZiB0aGUgUENNQ0lBIDgwMi4xMWIgY2FyZHMgKHdoaWNoIGFyZSBuZWFybHkgYWxsIHJlYmFkZ2VzKQorCSAgLSBleGNlcHQgZm9yIHRoZSBDaXNjby9BaXJvbmV0IGNhcmRzLiAgQ2FyZHMgc3VwcG9ydGVkIGluY2x1ZGUgdGhlCisJICBBcHBsZSBBaXJwb3J0IChub3QgYSBQQ01DSUEgY2FyZCksIFdhdmVsYW5JRUVFL09yaW5vY28sCisJICBDYWJsZXRyb24vRW50ZXJhU3lzIFJvYW1hYm91dCwgRUxTQSBBaXJMYW5jZXIsIE1FTENPIEJ1ZmZhbG8sIEF2YXlhLAorCSAgSUJNIEhpZ2ggUmF0ZSBXaXJlbGVzcywgRmFycmFsb24gU3l5bGluZSwgU2Ftc3VuZyBNYWdpY0xBTiwgTmV0Z2VhcgorCSAgTUE0MDEsIExpbmtTeXMgV1BDLTExLCBELUxpbmsgRFdMLTY1MCwgM0NvbSBBaXJDb25uZWN0LCBJbnRlbAorCSAgUFJPL1dpcmVsZXNzLCBhbmQgU3ltYm9sIFNwZWN0cnVtMjQgSGlnaCBSYXRlIGFtb25nc3Qgb3RoZXJzLgorCisJICBUaGlzIG9wdGlvbiBpbmNsdWRlcyB0aGUgZ3V0cyBvZiB0aGUgZHJpdmVyLCBidXQgaW4gb3JkZXIgdG8KKwkgIGFjdHVhbGx5IHVzZSBhIGNhcmQgeW91IHdpbGwgYWxzbyBuZWVkIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBQQ01DSUEKKwkgIEhlcm1lcyBjYXJkcywgUExYOTA1MiBiYXNlZCBQQ0kgYWRhcHRvcnMgb3IgdGhlIEFwcGxlIEFpcnBvcnQgYmVsb3cuCisKKwkgIFlvdSB3aWxsIGFsc28gdmVyeSBsaWtlbHkgYWxzbyBuZWVkIHRoZSBXaXJlbGVzcyBUb29scyBpbiBvcmRlciB0bworCSAgY29uZmlndXJlIHlvdXIgY2FyZCBhbmQgdGhhdCAvZXRjL3BjbWNpYS93aXJlbGVzcy5vcHRzIHdvcmtzIDoKKwkgIDxodHRwOi8vd3d3LmhwbC5ocC5jb20vcGVyc29uYWwvSmVhbl9Ub3VycmlsaGVzL0xpbnV4L1Rvb2xzLmh0bWw+CisKK2NvbmZpZyBBUFBMRV9BSVJQT1JUCisJdHJpc3RhdGUgIkFwcGxlIEFpcnBvcnQgc3VwcG9ydCAoYnVpbHQtaW4pIgorCWRlcGVuZHMgb24gUFBDX1BNQUMgJiYgSEVSTUVTCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBBaXJwb3J0IDgwMi4xMWIgd2lyZWxlc3MgRXRoZXJuZXQgaGFyZHdhcmUKKwkgIGJ1aWx0IGludG8gdGhlIE1hY2ludG9zaCBpQm9vayBhbmQgb3RoZXIgcmVjZW50IFBvd2VyUEMtYmFzZWQKKwkgIE1hY2ludG9zaCBtYWNoaW5lcy4gVGhpcyBpcyBlc3NlbnRpYWxseSBhIEx1Y2VudCBPcmlub2NvIGNhcmQgd2l0aCAKKwkgIGEgbm9uLXN0YW5kYXJkIGludGVyZmFjZQorCitjb25maWcgUExYX0hFUk1FUworCXRyaXN0YXRlICJIZXJtZXMgaW4gUExYOTA1MiBiYXNlZCBQQ0kgYWRhcHRvciBzdXBwb3J0IChOZXRnZWFyIE1BMzAxIGV0Yy4pIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gUENJICYmIEhFUk1FUyAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgUENNQ0lBIGNhcmRzIHN1cHBvcnRlZCBieSB0aGUgIkhlcm1lcyIgKGFrYQorCSAgb3Jpbm9jbykgZHJpdmVyIHdoZW4gdXNlZCBpbiBQTFg5MDUyIGJhc2VkIFBDSSBhZGFwdG9ycy4gIFRoZXNlCisJICBhZGFwdG9ycyBhcmUgbm90IGEgZnVsbCBQQ01DSUEgY29udHJvbGxlciBidXQgYWN0IGFzIGEgbW9yZSBsaW1pdGVkCisJICBQQ0kgPC0+IFBDTUNJQSBicmlkZ2UuICBTZXZlcmFsIHZlbmRvcnMgc2VsbCBzdWNoIGFkYXB0b3JzIHNvIHRoYXQKKwkgIDgwMi4xMWIgUENNQ0lBIGNhcmRzIGNhbiBiZSB1c2VkIGluIGRlc2t0b3AgbWFjaGluZXMuICBUaGUgTmV0Z2VhcgorCSAgTUEzMDEgaXMgc3VjaCBhbiBhZGFwdG9yLgorCisJICBTdXBwb3J0IGZvciB0aGVzZSBhZGFwdG9ycyBpcyBzbyBmYXIgc3RpbGwgaW5jb21wbGV0ZSBhbmQgYnVnZ3kuCisJICBZb3UgaGF2ZSBiZWVuIHdhcm5lZC4KKworY29uZmlnIFRNRF9IRVJNRVMKKwl0cmlzdGF0ZSAiSGVybWVzIGluIFRNRDcxNjAgYmFzZWQgUENJIGFkYXB0b3Igc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFBDSSAmJiBIRVJNRVMgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIFBDTUNJQSBjYXJkcyBzdXBwb3J0ZWQgYnkgdGhlICJIZXJtZXMiIChha2EKKwkgIG9yaW5vY28pIGRyaXZlciB3aGVuIHVzZWQgaW4gVE1ENzE2MCBiYXNlZCBQQ0kgYWRhcHRvcnMuICBUaGVzZQorCSAgYWRhcHRvcnMgYXJlIG5vdCBhIGZ1bGwgUENNQ0lBIGNvbnRyb2xsZXIgYnV0IGFjdCBhcyBhIG1vcmUgbGltaXRlZAorCSAgUENJIDwtPiBQQ01DSUEgYnJpZGdlLiAgU2V2ZXJhbCB2ZW5kb3JzIHNlbGwgc3VjaCBhZGFwdG9ycyBzbyB0aGF0CisJICA4MDIuMTFiIFBDTUNJQSBjYXJkcyBjYW4gYmUgdXNlZCBpbiBkZXNrdG9wIG1hY2hpbmVzLgorCisJICBTdXBwb3J0IGZvciB0aGVzZSBhZGFwdG9ycyBpcyBzbyBmYXIgc3RpbGwgaW5jb21wbGV0ZSBhbmQgYnVnZ3kuCisJICBZb3UgaGF2ZSBiZWVuIHdhcm5lZC4KKworY29uZmlnIFBDSV9IRVJNRVMKKwl0cmlzdGF0ZSAiUHJpc20gMi41IFBDSSA4MDIuMTFiIGFkYXB0b3Igc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFBDSSAmJiBIRVJNRVMgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIFBDSSBhbmQgbWluaS1QQ0kgODAyLjExYiB3aXJlbGVzcyBOSUNzIGJhc2VkIG9uCisJICB0aGUgUHJpc20gMi41IGNoaXBzZXQuICBUaGVzZSBhcmUgdHJ1ZSBQQ0kgY2FyZHMsIG5vdCB0aGUgODAyLjExYgorCSAgUENNQ0lBIGNhcmRzIGJ1bmRsZWQgd2l0aCBQQ0k8LT5QQ01DSUEgYWRhcHRvcnMgd2hpY2ggYXJlIGFsc28KKwkgIGNvbW1vbi4gIFNvbWUgb2YgdGhlIGJ1aWx0LWluIHdpcmVsZXNzIGFkYXB0b3JzIGluIGxhcHRvcHMgYXJlIG9mCisJICB0aGlzIHZhcmlldHkuCisKK2NvbmZpZyBBVE1FTAorICAgICAgdHJpc3RhdGUgIkF0bWVsIGF0NzZjNTB4IGNoaXBzZXQgIDgwMi4xMWIgc3VwcG9ydCIKKyAgICAgIGRlcGVuZHMgb24gTkVUX1JBRElPICYmIEVYUEVSSU1FTlRBTAorICAgICAgc2VsZWN0IEZXX0xPQURFUgorICAgICAgc2VsZWN0IENSQzMyCisgICAgICAgLS0taGVscC0tLQorICAgICAgICBBIGRyaXZlciA4MDIuMTFiIHdpcmVsZXNzIGNhcmRzIGJhc2VkIG9uIHRoZSBBdG1lbCBmYXN0LXZuZXQKKyAgICAgICAgY2hpcHMuIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHN0YW5kYXJkIExpbnV4IHdpcmVsZXNzIGV4dGVuc2lvbnMuIAorIAorICAgICAgICBNYW55ICBjYXJkcyBiYXNlZCBvbiB0aGlzIGNoaXBzZXQgZG8gbm90IGhhdmUgZmxhc2ggbWVtb3J5CisgICAgICAgIGFuZCBuZWVkIHRoZWlyIGZpcm13YXJlIGxvYWRlZCBhdCBzdGFydC11cC4gSWYgeW91cnMgaXMgCisgICAgICAgIG9uZSBvZiB0aGVzZSwgeW91IHdpbGwgbmVlZCB0byBwcm92aWRlIGEgZmlybXdhcmUgaW1hZ2UKKyAgICAgICAgdG8gYmUgbG9hZGVkIGludG8gdGhlIGNhcmQgYnkgdGhlIGRyaXZlci4gVGhlIEF0bWVsCisgICAgICAgIGZpcm13YXJlIHBhY2thZ2UgY2FuIGJlIGRvd25sb2FkZWQgZnJvbQorICAgICAgICA8aHR0cDovL3d3dy50aGVrZWxsZXlzLm9yZy51ay9hdG1lbD4KKworY29uZmlnIFBDSV9BVE1FTAorICAgICAgdHJpc3RhdGUgIkF0bWVsIGF0NzZjNTA2IFBDSSBjYXJkcyIKKyAgICAgIGRlcGVuZHMgb24gQVRNRUwgJiYgUENJCisgICAgICAgLS0taGVscC0tLQorICAgICAgICBFbmFibGUgc3VwcG9ydCBmb3IgUENJIGFuZCBtaW5pLVBDSSBjYXJkcyBjb250YWluaW5nIHRoZQorICAgICAgICBBdG1lbCBhdDc2YzUwNiBjaGlwLgorCisjIElmIFBjbWNpYSBpcyBjb21waWxlZCBpbiwgb2ZmZXIgUGNtY2lhIGNhcmRzLi4uCitjb21tZW50ICJXaXJlbGVzcyA4MDIuMTFiIFBjbWNpYS9DYXJkYnVzIGNhcmRzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUkFESU8gJiYgUENNQ0lBCisKK2NvbmZpZyBQQ01DSUFfSEVSTUVTCisJdHJpc3RhdGUgIkhlcm1lcyBQQ01DSUEgY2FyZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFBDTUNJQSAmJiBIRVJNRVMKKwktLS1oZWxwLS0tCisJICBBIGRyaXZlciBmb3IgIkhlcm1lcyIgY2hpcHNldCBiYXNlZCBQQ01DSUEgd2lyZWxlc3MgYWRhcHRvcnMsIHN1Y2gKKwkgIGFzIHRoZSBMdWNlbnQgV2F2ZWxhbklFRUUvT3Jpbm9jbyBjYXJkcyBhbmQgdGhlaXIgT0VNIChDYWJsZXRyb24vCisJICBFbnRlcmFTeXMgUm9hbUFib3V0IDgwMi4xMSwgRUxTQSBBaXJsYW5jZXIsIE1lbGNvIEJ1ZmZhbG8gYW5kCisJICBvdGhlcnMpLiAgSXQgc2hvdWxkIGFsc28gYmUgdXNhYmxlIG9uIHZhcmlvdXMgUHJpc20gSUkgYmFzZWQgY2FyZHMKKwkgIHN1Y2ggYXMgdGhlIExpbmtzeXMsIEQtTGluayBhbmQgRmFyYWxsb24gU2t5bGluZS4gIEl0IHNob3VsZCBhbHNvCisJICB3b3JrIG9uIFN5bWJvbCBjYXJkcyBzdWNoIGFzIHRoZSAzQ29tIEFpckNvbm5lY3QgYW5kIEVyaWNzc29uIFdMQU4uCisKKwkgIFRvIHVzZSB5b3VyIFBDLWNhcmRzLCB5b3Ugd2lsbCBuZWVkIHN1cHBvcnRpbmcgc29mdHdhcmUgZnJvbSBEYXZpZAorCSAgSGluZHMnIHBjbWNpYS1jcyBwYWNrYWdlIChzZWUgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9DaGFuZ2VzPgorCSAgZm9yIGxvY2F0aW9uKS4gIFlvdSBhbHNvIHdhbnQgdG8gY2hlY2sgb3V0IHRoZSBQQ01DSUEtSE9XVE8sCisJICBhdmFpbGFibGUgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBZb3Ugd2lsbCBhbHNvIHZlcnkgbGlrZWx5IGFsc28gbmVlZCB0aGUgV2lyZWxlc3MgVG9vbHMgaW4gb3JkZXIgdG8KKwkgIGNvbmZpZ3VyZSB5b3VyIGNhcmQgYW5kIHRoYXQgL2V0Yy9wY21jaWEvd2lyZWxlc3Mub3B0cyB3b3JrczoKKwkgIDxodHRwOi8vd3d3LmhwbC5ocC5jb20vcGVyc29uYWwvSmVhbl9Ub3VycmlsaGVzL0xpbnV4L1Rvb2xzLmh0bWw+LgorCitjb25maWcgQUlST19DUworCXRyaXN0YXRlICJDaXNjby9BaXJvbmV0IDM0WC8zNVgvNDUwMC80ODAwIFBDTUNJQSBjYXJkcyIKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBQQ01DSUEKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIHRoZSBzdGFuZGFyZCBMaW51eCBkcml2ZXIgdG8gc3VwcG9ydCBDaXNjby9BaXJvbmV0IFBDTUNJQQorCSAgODAyLjExIHdpcmVsZXNzIGNhcmRzLiAgVGhpcyBkcml2ZXIgaXMgdGhlIHNhbWUgYXMgdGhlIEFpcm9uZXQKKwkgIGRyaXZlciBwYXJ0IG9mIHRoZSBMaW51eCBQY21jaWEgcGFja2FnZS4KKwkgIEl0IHN1cHBvcnRzIHRoZSBuZXcgODAyLjExYiBjYXJkcyBmcm9tIENpc2NvIChDaXNjbyAzNFgsIENpc2NvIDM1WAorCSAgLSB3aXRoIG9yIHdpdGhvdXQgZW5jcnlwdGlvbikgYXMgd2VsbCBhcyBjYXJkIGJlZm9yZSB0aGUgQ2lzY28KKwkgIGFxdWlzaXRpb24gKEFpcm9uZXQgNDUwMCwgQWlyb25ldCA0ODAwLCBBaXJvbmV0IDQ4MDBCKS4gSXQgYWxzbworCSAgc3VwcG9ydHMgT0VNIG9mIENpc2NvIHN1Y2ggYXMgdGhlIERFTEwgVHJ1ZU1vYmlsZSA0ODAwIGFuZCBYaXJjb20KKwkgIDgwMi4xMWIgY2FyZHMuCisKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnQgYm90aCB0aGUgc3RhbmRhcmQgTGludXggV2lyZWxlc3MgRXh0ZW5zaW9ucworCSAgYW5kIENpc2NvIHByb3ByaWV0YXJ5IEFQSSwgc28gYm90aCB0aGUgTGludXggV2lyZWxlc3MgVG9vbHMgYW5kIHRoZQorCSAgQ2lzY28gTGludXggdXRpbGl0aWVzIGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgY2FyZC4KKworCSAgVG8gdXNlIHlvdXIgUEMtY2FyZHMsIHlvdSB3aWxsIG5lZWQgc3VwcG9ydGluZyBzb2Z0d2FyZSBmcm9tIERhdmlkCisJICBIaW5kcycgcGNtY2lhLWNzIHBhY2thZ2UgKHNlZSB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL0NoYW5nZXM+CisJICBmb3IgbG9jYXRpb24pLiAgWW91IGFsc28gd2FudCB0byBjaGVjayBvdXQgdGhlIFBDTUNJQS1IT1dUTywKKwkgIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKK2NvbmZpZyBQQ01DSUFfQVRNRUwKKwl0cmlzdGF0ZSAiQXRtZWwgYXQ3NmM1MDIvYXQ3NmM1MDQgUENNQ0lBIGNhcmRzIgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIEFUTUVMICYmIFBDTUNJQQorCXNlbGVjdCBGV19MT0FERVIKKwlzZWxlY3QgQ1JDMzIKKwktLS1oZWxwLS0tCisJICBFbmFibGUgc3VwcG9ydCBmb3IgUENNQ0lBIGNhcmRzIGNvbnRhaW5pbmcgdGhlCisJICBBdG1lbCBhdDc2YzUwMiBhbmQgYXQ3NmM1MDQgY2hpcHMuCisKK2NvbmZpZyBQQ01DSUFfV0wzNTAxCisgICAgICB0cmlzdGF0ZSAiUGxhbmV0IFdMMzUwMSBQQ01DSUEgY2FyZHMiCisgICAgICBkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiBFWFBFUklNRU5UQUwgJiYgUENNQ0lBCisgICAgICAgLS0taGVscC0tLQorICAgICAgICAgQSBkcml2ZXIgZm9yIFdMMzUwMSBQQ01DSUEgODAyLjExIHdpcmVsZXNzIGNhcmRzIG1hZGUgYnkgUGxhbmV0LgorCSBJdCBoYXMgYmFzaWMgc3VwcG9ydCBmb3IgTGludXggd2lyZWxlc3MgZXh0ZW5zaW9ucyBhbmQgaW5pdGlhbAorCSBtaWNybyBzdXBwb3J0IGZvciBldGh0b29sLgorCitjb21tZW50ICJQcmlzbSBHVC9EdWV0dGUgODAyLjExKGEvYi9nKSBQQ0kvQ2FyZGJ1cyBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkVUX1JBRElPICYmIFBDSQorY29uZmlnIFBSSVNNNTQKKwl0cmlzdGF0ZSAnSW50ZXJzaWwgUHJpc20gR1QvRHVldHRlL0luZGlnbyBQQ0kvQ2FyZGJ1cycgCisJZGVwZW5kcyBvbiBQQ0kgJiYgTkVUX1JBRElPICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBGV19MT0FERVIKKwktLS1oZWxwLS0tCisJICBFbmFibGUgUENJIGFuZCBDYXJkYnVzIHN1cHBvcnQgZm9yIHRoZSBmb2xsb3dpbmcgY2hpcHNldCBiYXNlZCBjYXJkczoKKworCSAgSVNMMzg4MCAtIFByaXNtIEdUICAgICAgICAgICAgODAyLjExIGIvZworCSAgSVNMMzg3NyAtIFByaXNtIEluZGlnbyAgICAgICAgODAyLjExIGEKKwkgIElTTDM4OTAgLSBQcmlzbSBEdWV0dGUgICAgICAgIDgwMi4xMSBhL2IvZworCSAgCisJICBGb3IgYSBjb21wbGV0ZSBsaXN0IG9mIHN1cHBvcnRlZCBjYXJkcyB2aXNpdCA8aHR0cDovL3ByaXNtNTQub3JnPi4KKwkgIEhlcmUgaXMgdGhlIGxhdGVzdCBjb25maXJtZWQgbGlzdCBvZiBzdXBwb3J0ZWQgY2FyZHM6CisKKwkgIDNjb20gT2ZmaWNlQ29ubmVjdCAxMWcgQ2FyZGJ1cyBDYXJkIGFrYSAzQ1JXRTE1NEc3MgorCSAgQWxsbmV0IEFMTDAyNzEgUENJIENhcmQKKwkgIENvbXBleCBXTDU0RyBDYXJkYnVzIENhcmQKKwkgIENvcmVnYSBDRy1XTENCNTRHVCBDYXJkYnVzIENhcmQKKwkgIEQtTGluayBBaXIgUGx1cyBYdHJlbWUgRyBBMSBDYXJkYnVzIENhcmQgYWthIERXTC1nNjUwCisJICBJLU8gRGF0YSBXTi1HNTQvQ0IgQ2FyZGJ1cyBDYXJkCisJICBLb2Jpc2hpIFhHLTMwMCBha2EgWi1Db20gQ2FyZGJ1cyBDYXJkCisJICBOZXRnZWFyIFdHNTExIENhcmRidXMgQ2FyZAorCSAgT3Zpc2xpbmsgV0wtNTQwMFBDSSBQQ0kgQ2FyZAorCSAgUGVhYmlyZCBXTEctUENJIFBDSSBDYXJkCisJICBTaXRlY29tIFdMLTEwMGkgQ2FyZGJ1cyBDYXJkCisJICBTaXRlY29tIFdMLTExMGkgUENJIENhcmQKKwkgIFNNQzI4MDJXIC0gICAgRVogQ29ubmVjdCBnIDIuNEdIeiA1NCBNYnBzIFdpcmVsZXNzIFBDSSBDYXJkCisJICBTTUMyODM1VyAtICAgIEVaIENvbm5lY3QgZyAyLjRHSHogNTQgTWJwcyBXaXJlbGVzcyBDYXJkYnVzIENhcmQKKwkgIFNNQzI4MzVXLVYyIC0gRVogQ29ubmVjdCBnIDIuNEdIeiA1NCBNYnBzIFdpcmVsZXNzIENhcmRidXMgQ2FyZAorCSAgWi1Db20gWEctOTAwIFBDSSBDYXJkCisJICBaeXhlbCBHLTEwMCBDYXJkYnVzIENhcmQKKworCSAgSWYgeW91IGVuYWJsZSB0aGlzIHlvdSB3aWxsIG5lZWQgYSBmaXJtd2FyZSBmaWxlIGFzIHdlbGwuCisJICBZb3Ugd2lsbCBuZWVkIHRvIGNvcHkgdGhpcyB0byAvdXNyL2xpYi9ob3RwbHVnL2Zpcm13YXJlL2lzbDM4OTAuCisJICBZb3UgY2FuIGdldCB0aGlzIG5vbi1HUEwnZCBmaXJtd2FyZSBmaWxlIGZyb20gdGhlIFByaXNtNTQgcHJvamVjdCBwYWdlOgorCSAgPGh0dHA6Ly9wcmlzbTU0Lm9yZz4KKwkgIFlvdSB3aWxsIGFsc28gbmVlZCB0aGUgL2V0Yy9ob3RwbHVnL2Zpcm13YXJlLmFnZW50IHNjcmlwdCBmcm9tCisJICBhIGN1cnJlbnQgaG90cGx1ZyBwYWNrYWdlLgorCisJICBOb3RlOiBZb3UgbmVlZCBhIG1vdGhlcmJvYXJkIHdpdGggRE1BIHN1cHBvcnQgdG8gdXNlIGFueSBvZiB0aGVzZSBjYXJkcyAKKwkgIAorCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSB0aGUgZHJpdmVyIGFzIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZQorCSAgaW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91IHdhbnQpLAorCSAgc2F5IE0gaGVyZSBhbmQgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHByaXNtNTQua28uCisKKyMgeWVzLCB0aGlzIHdvcmtzIGV2ZW4gd2hlbiBubyBkcml2ZXJzIGFyZSBzZWxlY3RlZAorY29uZmlnIE5FVF9XSVJFTEVTUworCWJvb2wKKwlkZXBlbmRzIG9uIE5FVF9SQURJTyAmJiAoSVNBIHx8IFBDSSB8fCBQUENfUE1BQyB8fCBQQ01DSUEpCisJZGVmYXVsdCB5CisKK2VuZG1lbnUKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjg3ODQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvTWFrZWZpbGUKQEAgLTAsMCArMSwzMyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IFdpcmVsZXNzIG5ldHdvcmsgZGV2aWNlIGRyaXZlcnMuCisjCisKK29iai0kKENPTkZJR19TVFJJUCkgKz0gc3RyaXAubworb2JqLSQoQ09ORklHX0FSTEFOKSArPSBhcmxhbi5vIAorCithcmxhbi1vYmpzIDo9IGFybGFuLW1haW4ubyBhcmxhbi1wcm9jLm8KKworIyBPYnNvbGV0ZSBjYXJkcworb2JqLSQoQ09ORklHX1dBVkVMQU4pCQkrPSB3YXZlbGFuLm8KK29iai0kKENPTkZJR19QQ01DSUFfTkVUV0FWRSkJKz0gbmV0d2F2ZV9jcy5vCitvYmotJChDT05GSUdfUENNQ0lBX1dBVkVMQU4pCSs9IHdhdmVsYW5fY3MubworCitvYmotJChDT05GSUdfSEVSTUVTKQkJKz0gb3Jpbm9jby5vIGhlcm1lcy5vCitvYmotJChDT05GSUdfUENNQ0lBX0hFUk1FUykJKz0gb3Jpbm9jb19jcy5vCitvYmotJChDT05GSUdfQVBQTEVfQUlSUE9SVCkJKz0gYWlycG9ydC5vCitvYmotJChDT05GSUdfUExYX0hFUk1FUykJKz0gb3Jpbm9jb19wbHgubworb2JqLSQoQ09ORklHX1BDSV9IRVJNRVMpCSs9IG9yaW5vY29fcGNpLm8KK29iai0kKENPTkZJR19UTURfSEVSTUVTKQkrPSBvcmlub2NvX3RtZC5vCisKK29iai0kKENPTkZJR19BSVJPKQkJKz0gYWlyby5vCitvYmotJChDT05GSUdfQUlST19DUykJCSs9IGFpcm9fY3MubyBhaXJvLm8KKworb2JqLSQoQ09ORklHX0FUTUVMKSAgICAgICAgICAgICArPSBhdG1lbC5vCitvYmotJChDT05GSUdfUENJX0FUTUVMKSAgICAgICAgICs9IGF0bWVsX3BjaS5vIAorb2JqLSQoQ09ORklHX1BDTUNJQV9BVE1FTCkgICAgICArPSBhdG1lbF9jcy5vCisKK29iai0kKENPTkZJR19QUklTTTU0KQkJKz0gcHJpc201NC8KKworIyAxNi1iaXQgd2lyZWxlc3MgUENNQ0lBIGNsaWVudCBkcml2ZXJzCitvYmotJChDT05GSUdfUENNQ0lBX1JBWUNTKQkrPSByYXlfY3Mubworb2JqLSQoQ09ORklHX1BDTUNJQV9XTDM1MDEpCSs9IHdsMzUwMV9jcy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9SRUFETUUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMyNzRiZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL1JFQURNRQpAQCAtMCwwICsxLDI1IEBACisJUkVBRE1FCisJLS0tLS0tCisKKwlUaGlzIGRpcmVjdG9yeSBpcyBtb3N0bHkgZm9yIFdpcmVsZXNzIExBTiBkcml2ZXJzLCBpbiB0aGVpcgordmFyaW91cyBpbmNhcm5hdGlvbnMgKElTQSwgUENJLCBQY21jaWEuLi4pLgorCVRoaXMgc2VwYXJhdGUgZGlyZWN0b3J5IGlzIG5lZWRlZCBiZWNhdXNlIGEgbG90IG9mIGRyaXZlciB3b3JrCitvbiBkaWZmZXJlbnQgYnVzICh0eXBpY2FsbHkgUENJICsgUGNtY2lhKSBhbmQgc2hhcmUgOTUlIG9mIHRoZQorY29kZS4gVGhpcyBhbGxvdyB0aGUgY29kZSBhbmQgdGhlIGNvbmZpZyBvcHRpb25zIHRvIGJlIGluIG9uZSBzaW5nbGUKK3BsYWNlIGluc3RlYWQgb2Ygc2NhdHRlcmVkIGFsbCBvdmVyIHRoZSBkcml2ZXIgdHJlZSwgd2hpY2ggaXMgbmV2ZXIKKzEwMCUgc2F0aXNmYWN0b3J5LgorCisJTm90ZSA6IGlmIHlvdSB3YW50IG1vcmUgaW5mbyBvbiB0aGUgdG9waWMgb2YgV2lyZWxlc3MgTEFOcywKK3lvdSBhcmUga2luZGx5IGludml0ZWQgdG8gaGF2ZSBhIGxvb2sgYXQgdGhlIFdpcmVsZXNzIEhvd3RvIDoKKwkJaHR0cDovL3d3dy5ocGwuaHAuY29tL3BlcnNvbmFsL0plYW5fVG91cnJpbGhlcy9MaW51eC8KKwlTb21lIFdpcmVsZXNzIExBTiBkcml2ZXJzLCBsaWtlIG9yaW5vY29fY3MsIHJlcXVpcmUgdGhlIHVzZSBvZgorV2lyZWxlc3MgVG9vbHMgdG8gYmUgY29uZmlndXJlZCA6CisJCWh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvVG9vbHMuaHRtbAorCisJU3BlY2lhbCBub3RlcyBmb3IgZGlzdHJpYnV0aW9uIG1haW50YWluZXJzIDoKKwkxKSB3dmxhbl9jcyB3aWxsIGJlIGRpc2NvbnRpbnVlZCBzb29uIGluIGZhdm9yIG9mIG9yaW5vY29fY3MKKwkyKSBQbGVhc2UgYWRkIFdpcmVsZXNzIFRvb2xzIHN1cHBvcnQgaW4geW91ciBzY3JpcHRzCisKKwlIYXZlIGZ1bi4uLgorCisJSmVhbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4OTkxNDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKQEAgLTAsMCArMSw3NjY3IEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEFpcm9uZXQgZHJpdmVyIGZvciA0NTAwIGFuZCA0ODAwIHNlcmllcyBjYXJkcworCisgICAgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIGJvdGggdGhlIEdQTCB2ZXJzaW9uIDIgYW5kIEJTRCBsaWNlbnNlcy4KKyAgICBFaXRoZXIgbGljZW5zZSBtYXkgYmUgdXNlZC4gIFRoZSByZXNwZWN0aXZlIGxpY2Vuc2VzIGFyZSBmb3VuZCBhdAorICAgIHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorCisgICAgVGhpcyBjb2RlIHdhcyBkZXZlbG9wZWQgYnkgQmVuamFtaW4gUmVlZCA8YnJlZWRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICAgIGluY2x1ZGluZyBwb3J0aW9ucyBvZiB3aGljaCBjb21lIGZyb20gdGhlIEFpcm9uZXQgUEM0NTAwCisgICAgRGV2ZWxvcGVyJ3MgUmVmZXJlbmNlIE1hbnVhbCBhbmQgdXNlZCB3aXRoIHBlcm1pc3Npb24uICBDb3B5cmlnaHQKKyAgICAoQykgMTk5OSBCZW5qYW1pbiBSZWVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gIFBlcm1pc3Npb24gdG8gdXNlCisgICAgY29kZSBpbiB0aGUgRGV2ZWxvcGVyJ3MgbWFudWFsIHdhcyBncmFudGVkIGZvciB0aGlzIGRyaXZlciBieQorICAgIEFpcm9uZXQuICBNYWpvciBjb2RlIGNvbnRyaWJ1dGlvbnMgd2VyZSByZWNlaXZlZCBmcm9tIEphdmllciBBY2hpcmljYQorICAgIDxhY2hpcmljYUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+IGFuZCBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+LgorICAgIENvZGUgd2FzIGFsc28gaW50ZWdyYXRlZCBmcm9tIHRoZSBDaXNjbyBBaXJvbmV0IGRyaXZlciBmb3IgTGludXguCisgICAgU3VwcG9ydCBmb3IgTVBJMzUwIGNhcmRzIHdhcyBhZGRlZCBieSBGYWJyaWNlIEJlbGxldAorICAgIDxmYWJyaWNlQGJlbGxldC5pbmZvPi4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY2FyZF9pZHNbXSA9IHsKKwl7IDB4MTRiOSwgMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IDB4MTRiOSwgMHg0NTAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sCisJeyAweDE0YjksIDB4NDgwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IDB4MTRiOSwgMHgwMzQwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgMHgxNGI5LCAweDAzNTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCisJeyAweDE0YjksIDB4NTAwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgfSwKKwl7IDB4MTRiOSwgMHhhNTA0LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCB9LAorCXsgMCwgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjYXJkX2lkcyk7CisKK3N0YXRpYyBpbnQgYWlyb19wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKik7CitzdGF0aWMgdm9pZCBhaXJvX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKik7CitzdGF0aWMgaW50IGFpcm9fcGNpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBzdGF0ZSk7CitzdGF0aWMgaW50IGFpcm9fcGNpX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhaXJvX2RyaXZlciA9IHsKKwkubmFtZSAgICAgPSAiYWlybyIsCisJLmlkX3RhYmxlID0gY2FyZF9pZHMsCisJLnByb2JlICAgID0gYWlyb19wY2lfcHJvYmUsCisJLnJlbW92ZSAgID0gX19kZXZleGl0X3AoYWlyb19wY2lfcmVtb3ZlKSwKKwkuc3VzcGVuZCAgPSBhaXJvX3BjaV9zdXNwZW5kLAorCS5yZXN1bWUgICA9IGFpcm9fcGNpX3Jlc3VtZSwKK307CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCisvKiBJbmNsdWRlIFdpcmVsZXNzIEV4dGVuc2lvbiBkZWZpbml0aW9uIGFuZCBjaGVjayB2ZXJzaW9uIC0gSmVhbiBJSSAqLworI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjZGVmaW5lIFdJUkVMRVNTX1NQWQkJLy8gZW5hYmxlIGl3c3B5IHN1cHBvcnQKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgkvLyBOZXcgZHJpdmVyIEFQSQorCisjZGVmaW5lIENJU0NPX0VYVAkJLy8gZW5hYmxlIENpc2NvIGV4dGVuc2lvbnMKKyNpZmRlZiBDSVNDT19FWFQKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2VuZGlmCisKKy8qIFN1cHBvcnQgQ2lzY28gTUlDIGZlYXR1cmUgKi8KKyNkZWZpbmUgTUlDU1VQUE9SVAorCisjaWYgZGVmaW5lZChNSUNTVVBQT1JUKSAmJiAhZGVmaW5lZChDT05GSUdfQ1JZUFRPKQorI3dhcm5pbmcgTUlDIHN1cHBvcnQgcmVxdWlyZXMgQ3J5cHRvIEFQSQorI3VuZGVmIE1JQ1NVUFBPUlQKKyNlbmRpZgorCisvKiBIYWNrIHRvIGRvIHNvbWUgcG93ZXIgc2F2aW5nICovCisjZGVmaW5lIFBPV0VSX09OX0RPV04KKworLyogQXMgeW91IGNhbiBzZWUgdGhpcyBsaXN0IGlzIEhVR0ghCisgICBJIHJlYWxseSBkb24ndCBrbm93IHdoYXQgYSBsb3Qgb2YgdGhlc2UgY291bnRzIGFyZSBhYm91dCwgYnV0IHRoZXkKKyAgIGFyZSBhbGwgaGVyZSBmb3IgY29tcGxldGVuZXNzLiAgSWYgdGhlIElHTkxBQkVMIG1hY3JvIGlzIHB1dCBpbgorICAgaW5mcm9udCBvZiB0aGUgbGFiZWwsIHRoYXQgc3RhdGlzdGljIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0CisgICBvZiBzdGF0aXN0aWNzIGluIHRoZSAvcHJvYyBmaWxlc3lzdGVtICovCisKKyNkZWZpbmUgSUdOTEFCRUwoY29tbWVudCkgTlVMTAorc3RhdGljIGNoYXIgKnN0YXRzTGFiZWxzW10gPSB7CisJIlJ4T3ZlcnJ1biIsCisJSUdOTEFCRUwoIlJ4UGxjcENyY0VyciIpLAorCUlHTkxBQkVMKCJSeFBsY3BGb3JtYXRFcnIiKSwKKwlJR05MQUJFTCgiUnhQbGNwTGVuZ3RoRXJyIiksCisJIlJ4TWFjQ3JjRXJyIiwKKwkiUnhNYWNDcmNPayIsCisJIlJ4V2VwRXJyIiwKKwkiUnhXZXBPayIsCisJIlJldHJ5TG9uZyIsCisJIlJldHJ5U2hvcnQiLAorCSJNYXhSZXRyaWVzIiwKKwkiTm9BY2siLAorCSJOb0N0cyIsCisJIlJ4QWNrIiwKKwkiUnhDdHMiLAorCSJUeEFjayIsCisJIlR4UnRzIiwKKwkiVHhDdHMiLAorCSJUeE1jIiwKKwkiVHhCYyIsCisJIlR4VWNGcmFncyIsCisJIlR4VWNQYWNrZXRzIiwKKwkiVHhCZWFjb24iLAorCSJSeEJlYWNvbiIsCisJIlR4U2luQ29sbCIsCisJIlR4TXVsQ29sbCIsCisJIkRlZmVyc05vIiwKKwkiRGVmZXJzUHJvdCIsCisJIkRlZmVyc0VuZ3kiLAorCSJEdXBGcmFtIiwKKwkiUnhGcmFnRGlzYyIsCisJIlR4QWdlZCIsCisJIlJ4QWdlZCIsCisJIkxvc3RTeW5jLU1heFJldHJ5IiwKKwkiTG9zdFN5bmMtTWlzc2VkQmVhY29ucyIsCisJIkxvc3RTeW5jLUFybEV4Y2VlZGVkIiwKKwkiTG9zdFN5bmMtRGVhdXRoIiwKKwkiTG9zdFN5bmMtRGlzYXNzb2NlZCIsCisJIkxvc3RTeW5jLVRzZlRpbWluZyIsCisJIkhvc3RUeE1jIiwKKwkiSG9zdFR4QmMiLAorCSJIb3N0VHhVYyIsCisJIkhvc3RUeEZhaWwiLAorCSJIb3N0UnhNYyIsCisJIkhvc3RSeEJjIiwKKwkiSG9zdFJ4VWMiLAorCSJIb3N0UnhEaXNjYXJkIiwKKwlJR05MQUJFTCgiSG1hY1R4TWMiKSwKKwlJR05MQUJFTCgiSG1hY1R4QmMiKSwKKwlJR05MQUJFTCgiSG1hY1R4VWMiKSwKKwlJR05MQUJFTCgiSG1hY1R4RmFpbCIpLAorCUlHTkxBQkVMKCJIbWFjUnhNYyIpLAorCUlHTkxBQkVMKCJIbWFjUnhCYyIpLAorCUlHTkxBQkVMKCJIbWFjUnhVYyIpLAorCUlHTkxBQkVMKCJIbWFjUnhEaXNjYXJkIiksCisJSUdOTEFCRUwoIkhtYWNSeEFjY2VwdGVkIiksCisJIlNzaWRNaXNtYXRjaCIsCisJIkFwTWlzbWF0Y2giLAorCSJSYXRlc01pc21hdGNoIiwKKwkiQXV0aFJlamVjdCIsCisJIkF1dGhUaW1lb3V0IiwKKwkiQXNzb2NSZWplY3QiLAorCSJBc3NvY1RpbWVvdXQiLAorCUlHTkxBQkVMKCJSZWFzb25PdXRzaWRlVGFibGUiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMSIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXMyIiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czMiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzNCIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXM1IiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czYiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzNyIpLAorCUlHTkxBQkVMKCJSZWFzb25TdGF0dXM4IiksCisJSUdOTEFCRUwoIlJlYXNvblN0YXR1czkiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMTAiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMTEiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMTIiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMTMiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMTQiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMTUiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMTYiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMTciKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMTgiKSwKKwlJR05MQUJFTCgiUmVhc29uU3RhdHVzMTkiKSwKKwkiUnhNYW4iLAorCSJUeE1hbiIsCisJIlJ4UmVmcmVzaCIsCisJIlR4UmVmcmVzaCIsCisJIlJ4UG9sbCIsCisJIlR4UG9sbCIsCisJIkhvc3RSZXRyaWVzIiwKKwkiTG9zdFN5bmMtSG9zdFJlcSIsCisJIkhvc3RUeEJ5dGVzIiwKKwkiSG9zdFJ4Qnl0ZXMiLAorCSJFbGFwc2VkVXNlYyIsCisJIkVsYXBzZWRTZWMiLAorCSJMb3N0U3luY0JldHRlckFQIiwKKwkiUHJpdmFjeU1pc21hdGNoIiwKKwkiSmFtbWVkIiwKKwkiRGlzY1J4Tm90V2VwcGVkIiwKKwkiUGh5RWxlTWlzbWF0Y2giLAorCShjaGFyKiktMSB9OworI2lmbmRlZiBSVU5fQVQKKyNkZWZpbmUgUlVOX0FUKHgpIChqaWZmaWVzKyh4KSkKKyNlbmRpZgorCisKKy8qIFRoZXNlIHZhcmlhYmxlcyBhcmUgZm9yIGluc21vZCwgc2luY2UgaXQgc2VlbXMgdGhhdCB0aGUgcmF0ZXMKKyAgIGNhbiBvbmx5IGJlIHNldCBpbiBzZXR1cF9jYXJkLiAgUmF0ZXMgc2hvdWxkIGJlIGEgY29tbWEgc2VwYXJhdGVkCisgICAobm8gc3BhY2VzKSBsaXN0IG9mIHJhdGVzICh1cCB0byA4KS4gKi8KKworc3RhdGljIGludCByYXRlc1s4XTsKK3N0YXRpYyBpbnQgYmFzaWNfcmF0ZTsKK3N0YXRpYyBjaGFyICpzc2lkc1szXTsKKworc3RhdGljIGludCBpb1s0XTsKK3N0YXRpYyBpbnQgaXJxWzRdOworCitzdGF0aWMKK2ludCBtYXhlbmNyeXB0IC8qID0gMCAqLzsgLyogVGhlIGhpZ2hlc3QgcmF0ZSB0aGF0IHRoZSBjYXJkIGNhbiBlbmNyeXB0IGF0LgorCQkgICAgICAgMCBtZWFucyBubyBsaW1pdC4gIEZvciBvbGQgY2FyZHMgdGhpcyB3YXMgNCAqLworCitzdGF0aWMgaW50IGF1dG9fd2VwIC8qID0gMCAqLzsgLyogSWYgc2V0LCBpdCB0cmllcyB0byBmaWd1cmUgb3V0IHRoZSB3ZXAgbW9kZSAqLworc3RhdGljIGludCBhdXhfYmFwIC8qID0gMCAqLzsgLyogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgYXV4IHBvcnRzIGFyZSBuZWVkZWQgdG8gcmVhZAorCQkgICAgdGhlIGJhcCwgbmVlZGVkIG9uIHNvbWUgb2xkZXIgY2FyZHMgYW5kIGJ1c2VzLiAqLworc3RhdGljIGludCBhZGhvYzsKKworc3RhdGljIGludCBwcm9iZSA9IDE7CisKK3N0YXRpYyBpbnQgcHJvY191aWQgLyogPSAwICovOworCitzdGF0aWMgaW50IHByb2NfZ2lkIC8qID0gMCAqLzsKKworc3RhdGljIGludCBhaXJvX3Blcm0gPSAwNTU1OworCitzdGF0aWMgaW50IHByb2NfcGVybSA9IDA2NDQ7CisKK01PRFVMRV9BVVRIT1IoIkJlbmphbWluIFJlZWQiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VwcG9ydCBmb3IgQ2lzY28vQWlyb25ldCA4MDIuMTEgd2lyZWxlc3MgZXRoZXJuZXQgXAorICAgICAgICAgICAgICAgICAgIGNhcmRzLiAgRGlyZWN0IHN1cHBvcnQgZm9yIElTQS9QQ0kvTVBJIGNhcmRzIGFuZCBzdXBwb3J0IFwKKwkJICAgZm9yIFBDTUNJQSB3aGVuIHVzZWQgd2l0aCBhaXJvX2NzLiIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIkFpcm9uZXQgNDUwMCwgNDgwMCBhbmQgQ2lzY28gMzQwLzM1MCIpOworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbShiYXNpY19yYXRlLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KHJhdGVzLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KHNzaWRzLCBjaGFycCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0oYXV0b193ZXAsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGF1dG9fd2VwLCAiSWYgbm9uLXplcm8sIHRoZSBkcml2ZXIgd2lsbCBrZWVwIGxvb3BpbmcgdGhyb3VnaCBcCit0aGUgYXV0aGVudGljYXRpb24gb3B0aW9ucyB1bnRpbCBhbiBhc3NvY2lhdGlvbiBpcyBtYWRlLiAgVGhlIHZhbHVlIG9mIFwKK2F1dG9fd2VwIGlzIG51bWJlciBvZiB0aGUgd2VwIGtleXMgdG8gY2hlY2suICBBIHZhbHVlIG9mIDIgd2lsbCB0cnkgdXNpbmcgXAordGhlIGtleSBhdCBpbmRleCAwIGFuZCBpbmRleCAxLiIpOworbW9kdWxlX3BhcmFtKGF1eF9iYXAsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGF1eF9iYXAsICJJZiBub24temVybywgdGhlIGRyaXZlciB3aWxsIHN3aXRjaCBpbnRvIGEgbW9kZSBcCit0aGFuIHNlZW1zIHRvIHdvcmsgYmV0dGVyIGZvciBvbGRlciBjYXJkcyB3aXRoIHNvbWUgb2xkZXIgYnVzZXMuICBCZWZvcmUgXAorc3dpdGNoaW5nIGl0IGNoZWNrcyB0aGF0IHRoZSBzd2l0Y2ggaXMgbmVlZGVkLiIpOworbW9kdWxlX3BhcmFtKG1heGVuY3J5cHQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heGVuY3J5cHQsICJUaGUgbWF4aW11bSBzcGVlZCB0aGF0IHRoZSBjYXJkIGNhbiBkbyBcCitlbmNyeXB0aW9uLiAgVW5pdHMgYXJlIGluIDUxMmticy4gIFplcm8gKGRlZmF1bHQpIG1lYW5zIHRoZXJlIGlzIG5vIGxpbWl0LiBcCitPbGRlciBjYXJkcyB1c2VkIHRvIGJlIGxpbWl0ZWQgdG8gMm1icyAoNCkuIik7Cittb2R1bGVfcGFyYW0oYWRob2MsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGFkaG9jLCAiSWYgbm9uLXplcm8sIHRoZSBjYXJkIHdpbGwgc3RhcnQgaW4gYWRob2MgbW9kZS4iKTsKK21vZHVsZV9wYXJhbShwcm9iZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHJvYmUsICJJZiB6ZXJvLCB0aGUgZHJpdmVyIHdvbid0IHN0YXJ0IHRoZSBjYXJkLiIpOworCittb2R1bGVfcGFyYW0ocHJvY191aWQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHByb2NfdWlkLCAiVGhlIHVpZCB0aGF0IHRoZSAvcHJvYyBmaWxlcyB3aWxsIGJlbG9uZyB0by4iKTsKK21vZHVsZV9wYXJhbShwcm9jX2dpZCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHJvY19naWQsICJUaGUgZ2lkIHRoYXQgdGhlIC9wcm9jIGZpbGVzIHdpbGwgYmVsb25nIHRvLiIpOworbW9kdWxlX3BhcmFtKGFpcm9fcGVybSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYWlyb19wZXJtLCAiVGhlIHBlcm1pc3Npb24gYml0cyBvZiAvcHJvYy9bZHJpdmVyL11haXJvbmV0LiIpOworbW9kdWxlX3BhcmFtKHByb2NfcGVybSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHJvY19wZXJtLCAiVGhlIHBlcm1pc3Npb24gYml0cyBvZiB0aGUgZmlsZXMgaW4gL3Byb2MiKTsKKworLyogVGhpcyBpcyBhIGtpbmQgb2Ygc2xvcHB5IGhhY2sgdG8gZ2V0IHRoaXMgaW5mb3JtYXRpb24gdG8gT1VUNDUwMCBhbmQKKyAgIElONDUwMC4gIEkgd291bGQgYmUgZXh0cmVtZWx5IGludGVyZXN0ZWQgaW4gdGhlIHNpdHVhdGlvbiB3aGVyZSB0aGlzCisgICBkb2Vzbid0IHdvcmsgdGhvdWdoISEhICovCitzdGF0aWMgaW50IGRvOGJpdElPID0gMDsKKworLyogUmV0dXJuIGNvZGVzICovCisjZGVmaW5lIFNVQ0NFU1MgMAorI2RlZmluZSBFUlJPUiAtMQorI2RlZmluZSBOT19QQUNLRVQgLTIKKworLyogQ29tbWFuZHMgKi8KKyNkZWZpbmUgTk9QMgkJMHgwMDAwCisjZGVmaW5lIE1BQ19FTkFCTEUJMHgwMDAxCisjZGVmaW5lIE1BQ19ESVNBQkxFCTB4MDAwMgorI2RlZmluZSBDTURfTE9TRV9TWU5DCTB4MDAwMyAvKiBOb3Qgc3VyZSB3aGF0IHRoaXMgZG9lcy4uLiAqLworI2RlZmluZSBDTURfU09GVFJFU0VUCTB4MDAwNAorI2RlZmluZSBIT1NUU0xFRVAJMHgwMDA1CisjZGVmaW5lIENNRF9NQUdJQ19QS1QJMHgwMDA2CisjZGVmaW5lIENNRF9TRVRXQUtFTUFTSwkweDAwMDcKKyNkZWZpbmUgQ01EX1JFQURDRkcJMHgwMDA4CisjZGVmaW5lIENNRF9TRVRNT0RFCTB4MDAwOQorI2RlZmluZSBDTURfQUxMT0NBVEVUWAkweDAwMGEKKyNkZWZpbmUgQ01EX1RSQU5TTUlUCTB4MDAwYgorI2RlZmluZSBDTURfREVBTExPQ0FURVRYIDB4MDAwYworI2RlZmluZSBOT1AJCTB4MDAxMAorI2RlZmluZSBDTURfV09SS0FST1VORAkweDAwMTEKKyNkZWZpbmUgQ01EX0FMTE9DQVRFQVVYIDB4MDAyMAorI2RlZmluZSBDTURfQUNDRVNTCTB4MDAyMQorI2RlZmluZSBDTURfUENJQkFQCTB4MDAyMgorI2RlZmluZSBDTURfUENJQVVYCTB4MDAyMworI2RlZmluZSBDTURfQUxMT0NCVUYJMHgwMDI4CisjZGVmaW5lIENNRF9HRVRUTFYJMHgwMDI5CisjZGVmaW5lIENNRF9QVVRUTFYJMHgwMDJhCisjZGVmaW5lIENNRF9ERUxUTFYJMHgwMDJiCisjZGVmaW5lIENNRF9GSU5ETkVYVFRMVgkweDAwMmMKKyNkZWZpbmUgQ01EX1BTUE5PREVTCTB4MDAzMAorI2RlZmluZSBDTURfU0VUQ1cJMHgwMDMxICAgIAorI2RlZmluZSBDTURfU0VUUENGCTB4MDAzMiAgICAKKyNkZWZpbmUgQ01EX1NFVFBIWVJFRwkweDAwM2UKKyNkZWZpbmUgQ01EX1RYVEVTVAkweDAwM2YKKyNkZWZpbmUgTUFDX0VOQUJMRVRYCTB4MDEwMQorI2RlZmluZSBDTURfTElTVEJTUwkweDAxMDMKKyNkZWZpbmUgQ01EX1NBVkVDRkcJMHgwMTA4CisjZGVmaW5lIENNRF9FTkFCTEVBVVgJMHgwMTExCisjZGVmaW5lIENNRF9XUklURVJJRAkweDAxMjEKKyNkZWZpbmUgQ01EX1VTRVBTUE5PREVTCTB4MDEzMAorI2RlZmluZSBNQUNfRU5BQkxFUlgJMHgwMjAxCisKKy8qIENvbW1hbmQgZXJyb3JzICovCisjZGVmaW5lIEVSUk9SX1FVQUxJRiAweDAwCisjZGVmaW5lIEVSUk9SX0lMTENNRCAweDAxCisjZGVmaW5lIEVSUk9SX0lMTEZNVCAweDAyCisjZGVmaW5lIEVSUk9SX0lOVkZJRCAweDAzCisjZGVmaW5lIEVSUk9SX0lOVlJJRCAweDA0CisjZGVmaW5lIEVSUk9SX0xBUkdFIDB4MDUKKyNkZWZpbmUgRVJST1JfTkRJU0FCTCAweDA2CisjZGVmaW5lIEVSUk9SX0FMTE9DQlNZIDB4MDcKKyNkZWZpbmUgRVJST1JfTk9SRCAweDBCCisjZGVmaW5lIEVSUk9SX05PV1IgMHgwQworI2RlZmluZSBFUlJPUl9JTlZGSURUWCAweDBECisjZGVmaW5lIEVSUk9SX1RFU1RBQ1QgMHgwRQorI2RlZmluZSBFUlJPUl9UQUdORk5EIDB4MTIKKyNkZWZpbmUgRVJST1JfREVDT0RFIDB4MjAKKyNkZWZpbmUgRVJST1JfREVTQ1VOQVYgMHgyMQorI2RlZmluZSBFUlJPUl9CQURMRU4gMHgyMgorI2RlZmluZSBFUlJPUl9NT0RFIDB4ODAKKyNkZWZpbmUgRVJST1JfSE9QIDB4ODEKKyNkZWZpbmUgRVJST1JfQklOVEVSIDB4ODIKKyNkZWZpbmUgRVJST1JfUlhNT0RFIDB4ODMKKyNkZWZpbmUgRVJST1JfTUFDQUREUiAweDg0CisjZGVmaW5lIEVSUk9SX1JBVEVTIDB4ODUKKyNkZWZpbmUgRVJST1JfT1JERVIgMHg4NgorI2RlZmluZSBFUlJPUl9TQ0FOIDB4ODcKKyNkZWZpbmUgRVJST1JfQVVUSCAweDg4CisjZGVmaW5lIEVSUk9SX1BTTU9ERSAweDg5CisjZGVmaW5lIEVSUk9SX1JUWVBFIDB4OEEKKyNkZWZpbmUgRVJST1JfRElWRVIgMHg4QgorI2RlZmluZSBFUlJPUl9TU0lEIDB4OEMKKyNkZWZpbmUgRVJST1JfQVBMSVNUIDB4OEQKKyNkZWZpbmUgRVJST1JfQVVUT1dBS0UgMHg4RQorI2RlZmluZSBFUlJPUl9MRUFQIDB4OEYKKworLyogUmVnaXN0ZXJzICovCisjZGVmaW5lIENPTU1BTkQgMHgwMAorI2RlZmluZSBQQVJBTTAgMHgwMgorI2RlZmluZSBQQVJBTTEgMHgwNAorI2RlZmluZSBQQVJBTTIgMHgwNgorI2RlZmluZSBTVEFUVVMgMHgwOAorI2RlZmluZSBSRVNQMCAweDBhCisjZGVmaW5lIFJFU1AxIDB4MGMKKyNkZWZpbmUgUkVTUDIgMHgwZQorI2RlZmluZSBMSU5LU1RBVCAweDEwCisjZGVmaW5lIFNFTEVDVDAgMHgxOAorI2RlZmluZSBPRkZTRVQwIDB4MWMKKyNkZWZpbmUgUlhGSUQgMHgyMAorI2RlZmluZSBUWEFMTE9DRklEIDB4MjIKKyNkZWZpbmUgVFhDT01QTEZJRCAweDI0CisjZGVmaW5lIERBVEEwIDB4MzYKKyNkZWZpbmUgRVZTVEFUIDB4MzAKKyNkZWZpbmUgRVZJTlRFTiAweDMyCisjZGVmaW5lIEVWQUNLIDB4MzQKKyNkZWZpbmUgU1dTMCAweDI4CisjZGVmaW5lIFNXUzEgMHgyYQorI2RlZmluZSBTV1MyIDB4MmMKKyNkZWZpbmUgU1dTMyAweDJlCisjZGVmaW5lIEFVWFBBR0UgMHgzQQorI2RlZmluZSBBVVhPRkYgMHgzQworI2RlZmluZSBBVVhEQVRBIDB4M0UKKworI2RlZmluZSBGSURfVFggMQorI2RlZmluZSBGSURfUlggMgorLyogT2Zmc2V0IGludG8gYXV4IG1lbW9yeSBmb3IgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgQVVYX09GRlNFVCAweDgwMAorLyogU2l6ZSBvZiBhbGxvY2F0ZWQgcGFja2V0cyAqLworI2RlZmluZSBQS1RTSVpFIDE4NDAKKyNkZWZpbmUgUklEU0laRSAyMDQ4CisvKiBTaXplIG9mIHRoZSB0cmFuc21pdCBxdWV1ZSAqLworI2RlZmluZSBNQVhUWFEgNjQKKworLyogQkFQIHNlbGVjdG9ycyAqLworI2RlZmluZSBCQVAwIDAgLy8gVXNlZCBmb3IgcmVjZWl2aW5nIHBhY2tldHMKKyNkZWZpbmUgQkFQMSAyIC8vIFVzZWQgZm9yIHhtaXRpbmcgcGFja2V0cyBhbmQgd29ya2luZyB3aXRoIFJJRFMKKworLyogRmxhZ3MgKi8KKyNkZWZpbmUgQ09NTUFORF9CVVNZIDB4ODAwMAorCisjZGVmaW5lIEJBUF9CVVNZIDB4ODAwMAorI2RlZmluZSBCQVBfRVJSIDB4NDAwMAorI2RlZmluZSBCQVBfRE9ORSAweDIwMDAKKworI2RlZmluZSBQUk9NSVNDIDB4ZmZmZgorI2RlZmluZSBOT1BST01JU0MgMHgwMDAwCisKKyNkZWZpbmUgRVZfQ01EIDB4MTAKKyNkZWZpbmUgRVZfQ0xFQVJDT01NQU5EQlVTWSAweDQwMDAKKyNkZWZpbmUgRVZfUlggMHgwMQorI2RlZmluZSBFVl9UWCAweDAyCisjZGVmaW5lIEVWX1RYRVhDIDB4MDQKKyNkZWZpbmUgRVZfQUxMT0MgMHgwOAorI2RlZmluZSBFVl9MSU5LIDB4ODAKKyNkZWZpbmUgRVZfQVdBS0UgMHgxMDAKKyNkZWZpbmUgRVZfVFhDUFkgMHg0MDAKKyNkZWZpbmUgRVZfVU5LTk9XTiAweDgwMAorI2RlZmluZSBFVl9NSUMgMHgxMDAwIC8qIE1lc3NhZ2UgSW50ZWdyaXR5IENoZWNrIEludGVycnVwdCAqLworI2RlZmluZSBFVl9BV0FLRU4gMHgyMDAwCisjZGVmaW5lIFNUQVRVU19JTlRTIChFVl9BV0FLRXxFVl9MSU5LfEVWX1RYRVhDfEVWX1RYfEVWX1RYQ1BZfEVWX1JYfEVWX01JQykKKworI2lmZGVmIENIRUNLX1VOS05PV05fSU5UUworI2RlZmluZSBJR05PUkVfSU5UUyAoIEVWX0NNRCB8IEVWX1VOS05PV04pCisjZWxzZQorI2RlZmluZSBJR05PUkVfSU5UUyAoflNUQVRVU19JTlRTKQorI2VuZGlmCisKKy8qIFJJRCBUWVBFUyAqLworI2RlZmluZSBSSURfUlcgMHgyMAorCisvKiBUaGUgUklEcyAqLworI2RlZmluZSBSSURfQ0FQQUJJTElUSUVTIDB4RkYwMAorI2RlZmluZSBSSURfQVBJTkZPICAgICAweEZGMDEKKyNkZWZpbmUgUklEX1JBRElPSU5GTyAgMHhGRjAyCisjZGVmaW5lIFJJRF9VTktOT1dOMyAgIDB4RkYwMworI2RlZmluZSBSSURfUlNTSSAgICAgICAweEZGMDQKKyNkZWZpbmUgUklEX0NPTkZJRyAgICAgMHhGRjEwCisjZGVmaW5lIFJJRF9TU0lEICAgICAgIDB4RkYxMQorI2RlZmluZSBSSURfQVBMSVNUICAgICAweEZGMTIKKyNkZWZpbmUgUklEX0RSVk5BTUUgICAgMHhGRjEzCisjZGVmaW5lIFJJRF9FVEhFUkVOQ0FQIDB4RkYxNAorI2RlZmluZSBSSURfV0VQX1RFTVAgICAweEZGMTUKKyNkZWZpbmUgUklEX1dFUF9QRVJNICAgMHhGRjE2CisjZGVmaW5lIFJJRF9NT0RVTEFUSU9OIDB4RkYxNworI2RlZmluZSBSSURfT1BUSU9OUyAgICAweEZGMTgKKyNkZWZpbmUgUklEX0FDVFVBTENPTkZJRyAweEZGMjAgLypyZWFkb25seSovCisjZGVmaW5lIFJJRF9GQUNUT1JZQ09ORklHIDB4RkYyMQorI2RlZmluZSBSSURfVU5LTk9XTjIyICAweEZGMjIKKyNkZWZpbmUgUklEX0xFQVBVU0VSTkFNRSAweEZGMjMKKyNkZWZpbmUgUklEX0xFQVBQQVNTV09SRCAweEZGMjQKKyNkZWZpbmUgUklEX1NUQVRVUyAgICAgMHhGRjUwCisjZGVmaW5lIFJJRF9CRUFDT05fSFNUIDB4RkY1MQorI2RlZmluZSBSSURfQlVTWV9IU1QgICAweEZGNTIKKyNkZWZpbmUgUklEX1JFVFJJRVNfSFNUIDB4RkY1MworI2RlZmluZSBSSURfVU5LTk9XTjU0ICAweEZGNTQKKyNkZWZpbmUgUklEX1VOS05PV041NSAgMHhGRjU1CisjZGVmaW5lIFJJRF9VTktOT1dONTYgIDB4RkY1NgorI2RlZmluZSBSSURfTUlDICAgICAgICAweEZGNTcKKyNkZWZpbmUgUklEX1NUQVRTMTYgICAgMHhGRjYwCisjZGVmaW5lIFJJRF9TVEFUUzE2REVMVEEgMHhGRjYxCisjZGVmaW5lIFJJRF9TVEFUUzE2REVMVEFDTEVBUiAweEZGNjIKKyNkZWZpbmUgUklEX1NUQVRTICAgICAgMHhGRjY4CisjZGVmaW5lIFJJRF9TVEFUU0RFTFRBIDB4RkY2OQorI2RlZmluZSBSSURfU1RBVFNERUxUQUNMRUFSIDB4RkY2QQorI2RlZmluZSBSSURfRUNIT1RFU1RfUklEIDB4RkY3MAorI2RlZmluZSBSSURfRUNIT1RFU1RfUkVTVUxUUyAweEZGNzEKKyNkZWZpbmUgUklEX0JTU0xJU1RGSVJTVCAweEZGNzIKKyNkZWZpbmUgUklEX0JTU0xJU1RORVhUICAweEZGNzMKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBjbWQ7CisJdTE2IHBhcm0wOworCXUxNiBwYXJtMTsKKwl1MTYgcGFybTI7Cit9IENtZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBzdGF0dXM7CisJdTE2IHJzcDA7CisJdTE2IHJzcDE7CisJdTE2IHJzcDI7Cit9IFJlc3A7CisKKy8qCisgKiBSaWRzIGFuZCBlbmRpYW4tbmVzczogIFRoZSBSaWRzIHdpbGwgYWx3YXlzIGJlIGluIGNwdSBlbmRpYW4sIHNpbmNlCisgKiB0aGlzIGFsbCB0aGUgcGF0Y2hlcyBmcm9tIHRoZSBiaWctZW5kaWFuIGd1eXMgZW5kIHVwIGRvaW5nIHRoYXQuCisgKiBzbyBhbGwgcmlkIGFjY2VzcyBzaG91bGQgdXNlIHRoZSByZWFkL3dyaXRlWFhYUmlkIHJvdXRpbmVzLgorICovCisKKy8qIFRoaXMgaXMgcmVkdW5kYW50IGZvciB4ODYgYXJjaHMsIGJ1dCBpdCBzZWVtcyBuZWNlc3NhcnkgZm9yIEFSTSAqLworI3ByYWdtYSBwYWNrKDEpCisKKy8qIFRoaXMgc3RydWN0dXJlIGNhbWUgZnJvbSBhbiBlbWFpbCBzZW50IHRvIG1lIGZyb20gYW4gZW5naW5lZXIgYXQKKyAgIGFpcm9uZXQgZm9yIGluY2x1c2lvbiBpbnRvIHRoaXMgZHJpdmVyICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IGxlbjsKKwl1MTYga2luZGV4OworCXU4IG1hY1tFVEhfQUxFTl07CisJdTE2IGtsZW47CisJdTgga2V5WzE2XTsKK30gV2VwS2V5UmlkOworCisvKiBUaGVzZSBzdHJ1Y3R1cmVzIGFyZSBmcm9tIHRoZSBBaXJvbmV0J3MgUEM0NTAwIERldmVsb3BlcnMgTWFudWFsICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IGxlbjsKKwl1OCBzc2lkWzMyXTsKK30gU3NpZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiBsZW47CisJU3NpZCBzc2lkc1szXTsKK30gU3NpZFJpZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICB1MTYgbGVuOworICAgICAgICB1MTYgbW9kdWxhdGlvbjsKKyNkZWZpbmUgTU9EX0RFRkFVTFQgMAorI2RlZmluZSBNT0RfQ0NLIDEKKyNkZWZpbmUgTU9EX01PSyAyCit9IE1vZHVsYXRpb25SaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgbGVuOyAvKiBzaXplb2YoQ29uZmlnUmlkKSAqLworCXUxNiBvcG1vZGU7IC8qIG9wZXJhdGluZyBtb2RlICovCisjZGVmaW5lIE1PREVfU1RBX0lCU1MgMAorI2RlZmluZSBNT0RFX1NUQV9FU1MgMQorI2RlZmluZSBNT0RFX0FQIDIKKyNkZWZpbmUgTU9ERV9BUF9SUFRSIDMKKyNkZWZpbmUgTU9ERV9FVEhFUk5FVF9IT1NUICgwPDw4KSAvKiByeCBwYXlsb2FkcyBjb252ZXJ0ZWQgKi8KKyNkZWZpbmUgTU9ERV9MTENfSE9TVCAoMTw8OCkgLyogcnggcGF5bG9hZHMgbGVmdCBhcyBpcyAqLworI2RlZmluZSBNT0RFX0FJUk9ORVRfRVhURU5EICgxPDw5KSAvKiBlbmFibGUgQWlyb25ldCBleHRlbnN0aW9ucyAqLworI2RlZmluZSBNT0RFX0FQX0lOVEVSRkFDRSAoMTw8MTApIC8qIGVuYWJsZSBhcCBpbnRlcmZhY2UgZXh0ZW5zaW9ucyAqLworI2RlZmluZSBNT0RFX0FOVEVOTkFfQUxJR04gKDE8PDExKSAvKiBlbmFibGUgYW50ZW5uYSBhbGlnbm1lbnQgKi8KKyNkZWZpbmUgTU9ERV9FVEhFUl9MTEMgKDE8PDEyKSAvKiBlbmFibGUgZXRoZXJuZXQgTExDICovCisjZGVmaW5lIE1PREVfTEVBRl9OT0RFICgxPDwxMykgLyogZW5hYmxlIGxlYWYgbm9kZSBicmlkZ2UgKi8KKyNkZWZpbmUgTU9ERV9DRl9QT0xMQUJMRSAoMTw8MTQpIC8qIGVuYWJsZSBDRiBwb2xsYWJsZSAqLworI2RlZmluZSBNT0RFX01JQyAoMTw8MTUpIC8qIGVuYWJsZSBNSUMgKi8KKwl1MTYgcm1vZGU7IC8qIHJlY2VpdmUgbW9kZSAqLworI2RlZmluZSBSWE1PREVfQkNfTUNfQUREUiAwCisjZGVmaW5lIFJYTU9ERV9CQ19BRERSIDEgLyogaWdub3JlIG11bHRpY2FzdHMgKi8KKyNkZWZpbmUgUlhNT0RFX0FERFIgMiAvKiBpZ25vcmUgbXVsdGljYXN0IGFuZCBicm9hZGNhc3QgKi8KKyNkZWZpbmUgUlhNT0RFX1JGTU9OIDMgLyogd2lyZWxlc3MgbW9uaXRvciBtb2RlICovCisjZGVmaW5lIFJYTU9ERV9SRk1PTl9BTllCU1MgNAorI2RlZmluZSBSWE1PREVfTEFOTU9OIDUgLyogbGFuIHN0eWxlIG1vbml0b3IgLS0gZGF0YSBwYWNrZXRzIG9ubHkgKi8KKyNkZWZpbmUgUlhNT0RFX0RJU0FCTEVfODAyXzNfSEVBREVSICgxPDw4KSAvKiBkaXNhYmxlcyA4MDIuMyBoZWFkZXIgb24gcnggKi8KKyNkZWZpbmUgUlhNT0RFX05PUk1BTElaRURfUlNTSSAoMTw8OSkgLyogcmV0dXJuIG5vcm1hbGl6ZWQgUlNTSSAqLworCXUxNiBmcmFnVGhyZXNoOworCXUxNiBydHNUaHJlczsKKwl1OCBtYWNBZGRyW0VUSF9BTEVOXTsKKwl1OCByYXRlc1s4XTsKKwl1MTYgc2hvcnRSZXRyeUxpbWl0OworCXUxNiBsb25nUmV0cnlMaW1pdDsKKwl1MTYgdHhMaWZldGltZTsgLyogaW4ga3VzZWMgKi8KKwl1MTYgcnhMaWZldGltZTsgLyogaW4ga3VzZWMgKi8KKwl1MTYgc3RhdGlvbmFyeTsKKwl1MTYgb3JkZXJpbmc7CisJdTE2IHUxNmRldmljZVR5cGU7IC8qIGZvciBvdmVycmlkaW5nIGRldmljZSB0eXBlICovCisJdTE2IGNmcFJhdGU7CisJdTE2IGNmcER1cmF0aW9uOworCXUxNiBfcmVzZXJ2ZWQxWzNdOworCS8qLS0tLS0tLS0tLSBTY2FubmluZy9Bc3NvY2lhdGluZyAtLS0tLS0tLS0tKi8KKwl1MTYgc2Nhbk1vZGU7CisjZGVmaW5lIFNDQU5NT0RFX0FDVElWRSAwCisjZGVmaW5lIFNDQU5NT0RFX1BBU1NJVkUgMQorI2RlZmluZSBTQ0FOTU9ERV9BSVJPU0NBTiAyCisJdTE2IHByb2JlRGVsYXk7IC8qIGluIGt1c2VjICovCisJdTE2IHByb2JlRW5lcmd5VGltZW91dDsgLyogaW4ga3VzZWMgKi8KKyAgICAgICAgdTE2IHByb2JlUmVzcG9uc2VUaW1lb3V0OworCXUxNiBiZWFjb25MaXN0ZW5UaW1lb3V0OworCXUxNiBqb2luTmV0VGltZW91dDsKKwl1MTYgYXV0aFRpbWVvdXQ7CisJdTE2IGF1dGhUeXBlOworI2RlZmluZSBBVVRIX09QRU4gMHgxCisjZGVmaW5lIEFVVEhfRU5DUllQVCAweDEwMQorI2RlZmluZSBBVVRIX1NIQVJFREtFWSAweDEwMgorI2RlZmluZSBBVVRIX0FMTE9XX1VORU5DUllQVEVEIDB4MjAwCisJdTE2IGFzc29jaWF0aW9uVGltZW91dDsKKwl1MTYgc3BlY2lmaWVkQXBUaW1lb3V0OworCXUxNiBvZmZsaW5lU2NhbkludGVydmFsOworCXUxNiBvZmZsaW5lU2NhbkR1cmF0aW9uOworCXUxNiBsaW5rTG9zc0RlbGF5OworCXUxNiBtYXhCZWFjb25Mb3N0VGltZTsKKwl1MTYgcmVmcmVzaEludGVydmFsOworI2RlZmluZSBESVNBQkxFX1JFRlJFU0ggMHhGRkZGCisJdTE2IF9yZXNlcnZlZDFhWzFdOworCS8qLS0tLS0tLS0tLSBQb3dlciBzYXZlIG9wZXJhdGlvbiAtLS0tLS0tLS0tKi8KKwl1MTYgcG93ZXJTYXZlTW9kZTsKKyNkZWZpbmUgUE9XRVJTQVZFX0NBTSAwCisjZGVmaW5lIFBPV0VSU0FWRV9QU1AgMQorI2RlZmluZSBQT1dFUlNBVkVfUFNQQ0FNIDIKKwl1MTYgc2xlZXBGb3JEdGltczsKKwl1MTYgbGlzdGVuSW50ZXJ2YWw7CisJdTE2IGZhc3RMaXN0ZW5JbnRlcnZhbDsKKwl1MTYgbGlzdGVuRGVjYXk7CisJdTE2IGZhc3RMaXN0ZW5EZWxheTsKKwl1MTYgX3Jlc2VydmVkMlsyXTsKKwkvKi0tLS0tLS0tLS0gQXAvSWJzcyBjb25maWcgaXRlbXMgLS0tLS0tLS0tLSovCisJdTE2IGJlYWNvblBlcmlvZDsKKwl1MTYgYXRpbUR1cmF0aW9uOworCXUxNiBob3BQZXJpb2Q7CisJdTE2IGNoYW5uZWxTZXQ7CisJdTE2IGNoYW5uZWw7CisJdTE2IGR0aW1QZXJpb2Q7CisJdTE2IGJyaWRnZURpc3RhbmNlOworCXUxNiByYWRpb0lEOworCS8qLS0tLS0tLS0tLSBSYWRpbyBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0qLworCXUxNiByYWRpb1R5cGU7CisjZGVmaW5lIFJBRElPVFlQRV9ERUZBVUxUIDAKKyNkZWZpbmUgUkFESU9UWVBFXzgwMl8xMSAxCisjZGVmaW5lIFJBRElPVFlQRV9MRUdBQ1kgMgorCXU4IHJ4RGl2ZXJzaXR5OworCXU4IHR4RGl2ZXJzaXR5OworCXUxNiB0eFBvd2VyOworI2RlZmluZSBUWFBPV0VSX0RFRkFVTFQgMAorCXUxNiByc3NpVGhyZXNob2xkOworI2RlZmluZSBSU1NJX0RFRkFVTFQgMAorICAgICAgICB1MTYgbW9kdWxhdGlvbjsKKyNkZWZpbmUgUFJFQU1CTEVfQVVUTyAwCisjZGVmaW5lIFBSRUFNQkxFX0xPTkcgMQorI2RlZmluZSBQUkVBTUJMRV9TSE9SVCAyCisJdTE2IHByZWFtYmxlOworCXUxNiBob21lUHJvZHVjdDsKKwl1MTYgcmFkaW9TcGVjaWZpYzsKKwkvKi0tLS0tLS0tLS0gQWlyb25ldCBFeHRlbnNpb25zIC0tLS0tLS0tLS0qLworCXU4IG5vZGVOYW1lWzE2XTsKKwl1MTYgYXJsVGhyZXNob2xkOworCXUxNiBhcmxEZWNheTsKKwl1MTYgYXJsRGVsYXk7CisJdTE2IF9yZXNlcnZlZDRbMV07CisJLyotLS0tLS0tLS0tIEFpcm9uZXQgRXh0ZW5zaW9ucyAtLS0tLS0tLS0tKi8KKwl1OCBtYWdpY0FjdGlvbjsKKyNkZWZpbmUgTUFHSUNfQUNUSU9OX1NUU0NIRyAxCisjZGVmaW5lIE1BR0lDX0FDVElPTl9SRVNVTUUgMgorI2RlZmluZSBNQUdJQ19JR05PUkVfTUNBU1QgKDE8PDgpCisjZGVmaW5lIE1BR0lDX0lHTk9SRV9CQ0FTVCAoMTw8OSkKKyNkZWZpbmUgTUFHSUNfU1dJVENIX1RPX1BTUCAoMDw8MTApCisjZGVmaW5lIE1BR0lDX1NUQVlfSU5fQ0FNICgxPDwxMCkKKwl1OCBtYWdpY0NvbnRyb2w7CisJdTE2IGF1dG9XYWtlOworfSBDb25maWdSaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgbGVuOworCXU4IG1hY1tFVEhfQUxFTl07CisJdTE2IG1vZGU7CisJdTE2IGVycm9yQ29kZTsKKwl1MTYgc2lnUXVhbGl0eTsKKwl1MTYgU1NJRGxlbjsKKwljaGFyIFNTSURbMzJdOworCWNoYXIgYXBOYW1lWzE2XTsKKwl1OCBic3NpZFs0XVtFVEhfQUxFTl07CisJdTE2IGJlYWNvblBlcmlvZDsKKwl1MTYgZGltUGVyaW9kOworCXUxNiBhdGltRHVyYXRpb247CisJdTE2IGhvcFBlcmlvZDsKKwl1MTYgY2hhbm5lbFNldDsKKwl1MTYgY2hhbm5lbDsKKwl1MTYgaG9wc1RvQmFja2JvbmU7CisJdTE2IGFwVG90YWxMb2FkOworCXUxNiBnZW5lcmF0ZWRMb2FkOworCXUxNiBhY2N1bXVsYXRlZEFybDsKKwl1MTYgc2lnbmFsUXVhbGl0eTsKKwl1MTYgY3VycmVudFhtaXRSYXRlOworCXUxNiBhcERldkV4dGVuc2lvbnM7CisJdTE2IG5vcm1hbGl6ZWRTaWduYWxTdHJlbmd0aDsKKwl1MTYgc2hvcnRQcmVhbWJsZTsKKwl1OCBhcElQWzRdOworCXU4IG5vaXNlUGVyY2VudDsgLyogTm9pc2UgcGVyY2VudCBpbiBsYXN0IHNlY29uZCAqLworCXU4IG5vaXNlZEJtOyAvKiBOb2lzZSBkQm0gaW4gbGFzdCBzZWNvbmQgKi8KKwl1OCBub2lzZUF2ZVBlcmNlbnQ7IC8qIE5vaXNlIHBlcmNlbnQgaW4gbGFzdCBtaW51dGUgKi8KKwl1OCBub2lzZUF2ZWRCbTsgLyogTm9pc2UgZEJtIGluIGxhc3QgbWludXRlICovCisJdTggbm9pc2VNYXhQZXJjZW50OyAvKiBIaWdoZXN0IG5vaXNlIHBlcmNlbnQgaW4gbGFzdCBtaW51dGUgKi8KKwl1OCBub2lzZU1heGRCbTsgLyogSGlnaGVzdCBub2lzZSBkYm0gaW4gbGFzdCBtaW51dGUgKi8KKwl1MTYgbG9hZDsKKwl1OCBjYXJyaWVyWzRdOworCXUxNiBhc3NvY1N0YXR1czsKKyNkZWZpbmUgU1RBVF9OT1BBQ0tFVFMgMAorI2RlZmluZSBTVEFUX05PQ0FSUklFUlNFVCAxMAorI2RlZmluZSBTVEFUX0dPVENBUlJJRVJTRVQgMTEKKyNkZWZpbmUgU1RBVF9XUk9OR1NTSUQgMjAKKyNkZWZpbmUgU1RBVF9CQURDSEFOTkVMIDI1CisjZGVmaW5lIFNUQVRfQkFEQklUUkFURVMgMzAKKyNkZWZpbmUgU1RBVF9CQURQUklWQUNZIDM1CisjZGVmaW5lIFNUQVRfQVBGT1VORCA0MAorI2RlZmluZSBTVEFUX0FQUkVKRUNURUQgNTAKKyNkZWZpbmUgU1RBVF9BVVRIRU5USUNBVElORyA2MAorI2RlZmluZSBTVEFUX0RFQVVUSEVOVElDQVRFRCA2MQorI2RlZmluZSBTVEFUX0FVVEhUSU1FT1VUIDYyCisjZGVmaW5lIFNUQVRfQVNTT0NJQVRJTkcgNzAKKyNkZWZpbmUgU1RBVF9ERUFTU09DSUFURUQgNzEKKyNkZWZpbmUgU1RBVF9BU1NPQ1RJTUVPVVQgNzIKKyNkZWZpbmUgU1RBVF9OT1RBSVJPQVAgNzMKKyNkZWZpbmUgU1RBVF9BU1NPQ0lBVEVEIDgwCisjZGVmaW5lIFNUQVRfTEVBUElORyA5MAorI2RlZmluZSBTVEFUX0xFQVBGQUlMRUQgOTEKKyNkZWZpbmUgU1RBVF9MRUFQVElNRURPVVQgOTIKKyNkZWZpbmUgU1RBVF9MRUFQQ09NUExFVEUgOTMKK30gU3RhdHVzUmlkOworCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IGxlbjsKKwl1MTYgc3BhY2VyOworCXUzMiB2YWxzWzEwMF07Cit9IFN0YXRzUmlkOworCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgbGVuOworCXU4IGFwWzRdW0VUSF9BTEVOXTsKK30gQVBMaXN0UmlkOworCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IGxlbjsKKwljaGFyIG91aVszXTsKKwljaGFyIHplcm87CisJdTE2IHByb2ROdW07CisJY2hhciBtYW5OYW1lWzMyXTsKKwljaGFyIHByb2ROYW1lWzE2XTsKKwljaGFyIHByb2RWZXJbOF07CisJY2hhciBmYWN0b3J5QWRkcltFVEhfQUxFTl07CisJY2hhciBhaXJvbmV0QWRkcltFVEhfQUxFTl07CisJdTE2IHJhZGlvVHlwZTsKKwl1MTYgY291bnRyeTsKKwljaGFyIGNhbGxpZFtFVEhfQUxFTl07CisJY2hhciBzdXBwb3J0ZWRSYXRlc1s4XTsKKwljaGFyIHJ4RGl2ZXJzaXR5OworCWNoYXIgdHhEaXZlcnNpdHk7CisJdTE2IHR4UG93ZXJMZXZlbHNbOF07CisJdTE2IGhhcmRWZXI7CisJdTE2IGhhcmRDYXA7CisJdTE2IHRlbXBSYW5nZTsKKwl1MTYgc29mdFZlcjsKKwl1MTYgc29mdFN1YlZlcjsKKwl1MTYgaW50ZXJmYWNlVmVyOworCXUxNiBzb2Z0Q2FwOworCXUxNiBib290QmxvY2tWZXI7CisJdTE2IHJlcXVpcmVkSGFyZDsKKwl1MTYgZXh0U29mdENhcDsKK30gQ2FwYWJpbGl0eVJpZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1MTYgbGVuOworICB1MTYgaW5kZXg7IC8qIEZpcnN0IGlzIDAgYW5kIDB4ZmZmZiBtZWFucyBlbmQgb2YgbGlzdCAqLworI2RlZmluZSBSQURJT19GSCAxIC8qIEZyZXF1ZW5jeSBob3BwaW5nIHJhZGlvIHR5cGUgKi8KKyNkZWZpbmUgUkFESU9fRFMgMiAvKiBEaXJlY3Qgc2VxdWVuY2UgcmFkaW8gdHlwZSAqLworI2RlZmluZSBSQURJT19UTUEgNCAvKiBQcm9wcmlldGFyeSByYWRpbyB1c2VkIGluIG9sZCBjYXJkcyAoMjUwMCkgKi8KKyAgdTE2IHJhZGlvVHlwZTsKKyAgdTggYnNzaWRbRVRIX0FMRU5dOyAvKiBNYWMgYWRkcmVzcyBvZiB0aGUgQlNTICovCisgIHU4IHplcm87CisgIHU4IHNzaWRMZW47CisgIHU4IHNzaWRbMzJdOworICB1MTYgcnNzaTsKKyNkZWZpbmUgQ0FQX0VTUyAoMTw8MCkKKyNkZWZpbmUgQ0FQX0lCU1MgKDE8PDEpCisjZGVmaW5lIENBUF9QUklWQUNZICgxPDw0KQorI2RlZmluZSBDQVBfU0hPUlRIRFIgKDE8PDUpCisgIHUxNiBjYXA7CisgIHUxNiBiZWFjb25JbnRlcnZhbDsKKyAgdTggcmF0ZXNbOF07IC8qIFNhbWUgYXMgcmF0ZXMgZm9yIGNvbmZpZyByaWQgKi8KKyAgc3RydWN0IHsgLyogRm9yIGZyZXF1ZW5jeSBob3BwaW5nIG9ubHkgKi8KKyAgICB1MTYgZHdlbGw7CisgICAgdTggaG9wU2V0OworICAgIHU4IGhvcFBhdHRlcm47CisgICAgdTggaG9wSW5kZXg7CisgICAgdTggZmlsbDsKKyAgfSBmaDsKKyAgdTE2IGRzQ2hhbm5lbDsKKyAgdTE2IGF0aW1XaW5kb3c7Cit9IEJTU0xpc3RSaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdTggcnNzaXBjdDsKKyAgdTggcnNzaWRCbTsKK30gdGRzUnNzaUVudHJ5OworCit0eXBlZGVmIHN0cnVjdCB7CisgIHUxNiBsZW47CisgIHRkc1Jzc2lFbnRyeSB4WzI1Nl07Cit9IHRkc1Jzc2lSaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MTYgbGVuOworCXUxNiBzdGF0ZTsKKwl1MTYgbXVsdGljYXN0VmFsaWQ7CisJdTggIG11bHRpY2FzdFsxNl07CisJdTE2IHVuaWNhc3RWYWxpZDsKKwl1OCAgdW5pY2FzdFsxNl07Cit9IE1JQ1JpZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUxNiB0eXBlbGVuOworCisJdW5pb24geworCSAgICB1OCBzbmFwWzhdOworCSAgICBzdHJ1Y3QgeworCQl1OCBkc2FwOworCQl1OCBzc2FwOworCQl1OCBjb250cm9sOworCQl1OCBvcmdjb2RlWzNdOworCQl1OCBmaWVsZHR5cGVbMl07CisJICAgIH0gbGxjOworCX0gdTsKKwl1MzIgbWljOworCXUzMiBzZXE7Cit9IE1JQ0J1ZmZlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXU4IGRhW0VUSF9BTEVOXTsKKwl1OCBzYVtFVEhfQUxFTl07Cit9IGV0aGVySGVhZDsKKworI3ByYWdtYSBwYWNrKCkKKworI2RlZmluZSBUWENUTF9UWE9LICgxPDwxKSAvKiByZXBvcnQgaWYgdHggaXMgb2sgKi8KKyNkZWZpbmUgVFhDVExfVFhFWCAoMTw8MikgLyogcmVwb3J0IGlmIHR4IGZhaWxzICovCisjZGVmaW5lIFRYQ1RMXzgwMl8zICgwPDwzKSAvKiA4MDIuMyBwYWNrZXQgKi8KKyNkZWZpbmUgVFhDVExfODAyXzExICgxPDwzKSAvKiA4MDIuMTEgbWFjIHBhY2tldCAqLworI2RlZmluZSBUWENUTF9FVEhFUk5FVCAoMDw8NCkgLyogcGF5bG9hZCBoYXMgZXRoZXJ0eXBlICovCisjZGVmaW5lIFRYQ1RMX0xMQyAoMTw8NCkgLyogcGF5bG9hZCBpcyBsbGMgKi8KKyNkZWZpbmUgVFhDVExfUkVMRUFTRSAoMDw8NSkgLyogcmVsZWFzZSBhZnRlciBjb21wbGV0aW9uICovCisjZGVmaW5lIFRYQ1RMX05PUkVMRUFTRSAoMTw8NSkgLyogb24gY29tcGxldGlvbiByZXR1cm5zIHRvIGhvc3QgKi8KKworI2RlZmluZSBCVVNZX0ZJRCAweDEwMDAwCisKKyNpZmRlZiBDSVNDT19FWFQKKyNkZWZpbmUgQUlST01BR0lDCTB4YTU1YQorLyogV2FybmluZyA6IFNJT0NERVZQUklWQVRFIG1heSBkaXNhcGVhciBkdXJpbmcgMi41LlggLSBKZWFuIElJICovCisjaWZkZWYgU0lPQ0lXRklSU1RQUklWCisjaWZkZWYgU0lPQ0RFVlBSSVZBVEUKKyNkZWZpbmUgQUlST09MRElPQ1RMCVNJT0NERVZQUklWQVRFCisjZGVmaW5lIEFJUk9PTERJRElGQyAJQUlST09MRElPQ1RMICsgMQorI2VuZGlmIC8qIFNJT0NERVZQUklWQVRFICovCisjZWxzZSAvKiBTSU9DSVdGSVJTVFBSSVYgKi8KKyNkZWZpbmUgU0lPQ0lXRklSU1RQUklWIFNJT0NERVZQUklWQVRFCisjZW5kaWYgLyogU0lPQ0lXRklSU1RQUklWICovCisvKiBUaGlzIG1heSBiZSB3cm9uZy4gV2hlbiB1c2luZyB0aGUgbmV3IFNJT0NJV0ZJUlNUUFJJViByYW5nZSwgd2UgcHJvYmFibHkKKyAqIHNob3VsZCB1c2Ugb25seSAiR0VUIiBpb2N0bHMgKGxhc3QgYml0IHNldCB0byAxKS4gIlNFVCIgaW9jdGxzIGFyZSByb290CisgKiBvbmx5IGFuZCBkb24ndCByZXR1cm4gdGhlIG1vZGlmaWVkIHN0cnVjdCBpZnJlcSB0byB0aGUgYXBwbGljYXRpb24gd2hpY2gKKyAqIGlzIHVzdWFsbHkgYSBwcm9ibGVtLiAtIEplYW4gSUkgKi8KKyNkZWZpbmUgQUlST0lPQ1RMCVNJT0NJV0ZJUlNUUFJJVgorI2RlZmluZSBBSVJPSURJRkMgCUFJUk9JT0NUTCArIDEKKworLyogSW9jdGwgY29uc3RhbnRzIHRvIGJlIHVzZWQgaW4gYWlyb19pb2N0bC5jb21tYW5kICovCisKKyNkZWZpbmUJQUlST0dDQVAgIAkJMAkvLyBDYXBhYmlsaXR5IHJpZAorI2RlZmluZSBBSVJPR0NGRwkJMSAgICAgICAvLyBVU0VEIEEgTE9UCisjZGVmaW5lIEFJUk9HU0xJU1QJCTIJLy8gU3lzdGVtIElEIGxpc3QKKyNkZWZpbmUgQUlST0dWTElTVAkJMyAgICAgICAvLyBMaXN0IG9mIHNwZWNpZmllZCBBUCdzCisjZGVmaW5lIEFJUk9HRFJWTkFNCQk0CS8vICBOT1RVU0VECisjZGVmaW5lIEFJUk9HRUhURU5DCQk1CS8vIE5PVFVTRUQKKyNkZWZpbmUgQUlST0dXRVBLVE1QCQk2CisjZGVmaW5lIEFJUk9HV0VQS05WCQk3CisjZGVmaW5lIEFJUk9HU1RBVAkJOAorI2RlZmluZSBBSVJPR1NUQVRTQzMyCQk5CisjZGVmaW5lIEFJUk9HU1RBVFNEMzIJCTEwCisjZGVmaW5lIEFJUk9HTUlDUklECQkxMQorI2RlZmluZSBBSVJPR01JQ1NUQVRTCQkxMgorI2RlZmluZSBBSVJPR0ZMQUdTCQkxMworI2RlZmluZSBBSVJPR0lECQkJMTQKKyNkZWZpbmUgQUlST1JSSUQJCTE1CisjZGVmaW5lIEFJUk9SU1dWRVJTSU9OCQkxNworCisvKiBMZWF2ZSBnYXAgb2YgNDAgY29tbWFuZHMgYWZ0ZXIgQUlST0dTVEFUU0QzMiBmb3IgZnV0dXJlICovCisKKyNkZWZpbmUgQUlST1BDQVAgICAgICAgICAgICAgICAJQUlST0dTVEFUU0QzMiArIDQwCisjZGVmaW5lIEFJUk9QVkxJU1QgICAgICAgICAgICAgIEFJUk9QQ0FQICAgICAgKyAxCisjZGVmaW5lIEFJUk9QU0xJU1QJCUFJUk9QVkxJU1QgICAgKyAxCisjZGVmaW5lIEFJUk9QQ0ZHCQlBSVJPUFNMSVNUICAgICsgMQorI2RlZmluZSBBSVJPUFNJRFMJCUFJUk9QQ0ZHICAgICAgKyAxCisjZGVmaW5lIEFJUk9QQVBMSVNUCQlBSVJPUFNJRFMgICAgICsgMQorI2RlZmluZSBBSVJPUE1BQ09OCQlBSVJPUEFQTElTVCAgICsgMQkvKiBFbmFibGUgbWFjICAqLworI2RlZmluZSBBSVJPUE1BQ09GRgkJQUlST1BNQUNPTiAgICArIDEgCS8qIERpc2FibGUgbWFjICovCisjZGVmaW5lIEFJUk9QU1RDTFIJCUFJUk9QTUFDT0ZGICAgKyAxCisjZGVmaW5lIEFJUk9QV0VQS0VZCQlBSVJPUFNUQ0xSICAgICsgMQorI2RlZmluZSBBSVJPUFdFUEtFWU5WCQlBSVJPUFdFUEtFWSAgICsgMQorI2RlZmluZSBBSVJPUExFQVBQV0QgICAgICAgICAgICBBSVJPUFdFUEtFWU5WICsgMQorI2RlZmluZSBBSVJPUExFQVBVU1IgICAgICAgICAgICBBSVJPUExFQVBQV0QgICsgMQorCisvKiBGbGFzaCBjb2RlcyAqLworCisjZGVmaW5lIEFJUk9GTFNIUlNUCSAgICAgICBBSVJPUFdFUEtFWU5WICArIDQwCisjZGVmaW5lIEFJUk9GTFNIR0NIUiAgICAgICAgICAgQUlST0ZMU0hSU1QgICAgKyAxCisjZGVmaW5lIEFJUk9GTFNIU1RGTCAgICAgICAgICAgQUlST0ZMU0hHQ0hSICAgKyAxCisjZGVmaW5lIEFJUk9GTFNIUENIUiAgICAgICAgICAgQUlST0ZMU0hTVEZMICAgKyAxCisjZGVmaW5lIEFJUk9GTFBVVEJVRiAgICAgICAgICAgQUlST0ZMU0hQQ0hSICAgKyAxCisjZGVmaW5lIEFJUk9SRVNUQVJUICAgICAgICAgICAgQUlST0ZMUFVUQlVGICAgKyAxCisKKyNkZWZpbmUgRkxBU0hTSVpFCTMyNzY4CisjZGVmaW5lIEFVWE1FTVNJWkUJKDI1NiAqIDEwMjQpCisKK3R5cGVkZWYgc3RydWN0IGFpcm9uZXRfaW9jdGwgeworCXVuc2lnbmVkIHNob3J0IGNvbW1hbmQ7CQkvLyBXaGF0IHRvIGRvCisJdW5zaWduZWQgc2hvcnQgbGVuOwkJLy8gTGVuIG9mIGRhdGEKKwl1bnNpZ25lZCBzaG9ydCByaWRudW07CQkvLyByaWQgbnVtYmVyCisJdW5zaWduZWQgY2hhciBfX3VzZXIgKmRhdGE7CS8vIGQtZGF0YQorfSBhaXJvbmV0X2lvY3RsOworCitzdGF0aWMgY2hhciAqc3d2ZXJzaW9uID0gIjIuMSI7CisjZW5kaWYgLyogQ0lTQ09fRVhUICovCisKKyNkZWZpbmUgTlVNX01PRFVMRVMgICAgICAgMgorI2RlZmluZSBNSUNfTVNHTEVOX01BWCAgICAyNDAwCisjZGVmaW5lIEVNTUgzMl9NU0dMRU5fTUFYIE1JQ19NU0dMRU5fTUFYCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgICBzaXplOyAgICAgICAgICAgIC8vIHNpemUKKwl1OCAgICBlbmFibGVkOyAgICAgICAgIC8vIE1JQyBlbmFibGVkIG9yIG5vdAorCXUzMiAgIHJ4U3VjY2VzczsgICAgICAgLy8gc3VjY2Vzc2Z1bCBwYWNrZXRzIHJlY2VpdmVkCisJdTMyICAgcnhJbmNvcnJlY3RNSUM7ICAvLyBwa3RzIGRyb3BwZWQgZHVlIHRvIGluY29ycmVjdCBNSUMgY29tcGFyaXNvbgorCXUzMiAgIHJ4Tm90TUlDZWQ7ICAgICAgLy8gcGt0cyBkcm9wcGVkIGR1ZSB0byBub3QgYmVpbmcgTUlDJ2QKKwl1MzIgICByeE1JQ1BsdW1tZWQ7ICAgIC8vIHBrdHMgZHJvcHBlZCBkdWUgdG8gbm90IGhhdmluZyBhIE1JQyBwbHVtbWVkCisJdTMyICAgcnhXcm9uZ1NlcXVlbmNlOyAvLyBwa3RzIGRyb3BwZWQgZHVlIHRvIHNlcXVlbmNlIG51bWJlciB2aW9sYXRpb24KKwl1MzIgICByZXNlcnZlWzMyXTsKK30gbWljX3N0YXRpc3RpY3M7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgY29lZmZbKChFTU1IMzJfTVNHTEVOX01BWCkrMyk+PjJdOworCXU2NCBhY2N1bTsJLy8gYWNjdW11bGF0ZWQgbWljLCByZWR1Y2VkIHRvIHUzMiBpbiBmaW5hbCgpCisJaW50IHBvc2l0aW9uOwkvLyBjdXJyZW50IHBvc2l0aW9uIChieXRlIG9mZnNldCkgaW4gbWVzc2FnZQorCXVuaW9uIHsKKwkJdTggIGQ4WzRdOworCQl1MzIgZDMyOworCX0gcGFydDsJLy8gc2F2ZXMgcGFydGlhbCBtZXNzYWdlIHdvcmQgYWNyb3NzIHVwZGF0ZSgpIGNhbGxzCit9IGVtbWgzMl9jb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCB7CisJZW1taDMyX2NvbnRleHQgc2VlZDsJICAgIC8vIENvbnRleHQgLSB0aGUgc2VlZAorCXUzMgkJIHJ4OwkgICAgLy8gUmVjZWl2ZWQgc2VxdWVuY2UgbnVtYmVyCisJdTMyCQkgdHg7CSAgICAvLyBUeCBzZXF1ZW5jZSBudW1iZXIKKwl1MzIJCSB3aW5kb3c7ICAgIC8vIFN0YXJ0IG9mIHdpbmRvdworCXU4CQkgdmFsaWQ7CSAgICAvLyBGbGFnIHRvIHNheSBpZiBjb250ZXh0IGlzIHZhbGlkIG9yIG5vdAorCXU4CQkga2V5WzE2XTsKK30gbWljY250eDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCW1pY2NudHggbUN0eDsJCS8vIE11bHRpY2FzdCBjb250ZXh0CisJbWljY250eCB1Q3R4OwkJLy8gVW5pY2FzdCBjb250ZXh0Cit9IG1pY19tb2R1bGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgIHJpZDogMTY7CisJdW5zaWduZWQgaW50ICBsZW46IDE1OworCXVuc2lnbmVkIGludCAgdmFsaWQ6IDE7CisJZG1hX2FkZHJfdCBob3N0X2FkZHI7Cit9IFJpZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCAgb2Zmc2V0OiAxNTsKKwl1bnNpZ25lZCBpbnQgIGVvYzogMTsKKwl1bnNpZ25lZCBpbnQgIGxlbjogMTU7CisJdW5zaWduZWQgaW50ICB2YWxpZDogMTsKKwlkbWFfYWRkcl90IGhvc3RfYWRkcjsKK30gVHhGaWQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgIGN0bDogMTU7CisJdW5zaWduZWQgaW50ICByZHk6IDE7CisJdW5zaWduZWQgaW50ICBsZW46IDE1OworCXVuc2lnbmVkIGludCAgdmFsaWQ6IDE7CisJZG1hX2FkZHJfdCBob3N0X2FkZHI7Cit9IFJ4RmlkOworCisvKgorICogSG9zdCByZWNlaXZlIGRlc2NyaXB0b3IKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqY2FyZF9yYW1fb2ZmOyAvKiBvZmZzZXQgaW50byBjYXJkIG1lbW9yeSBvZiB0aGUKKwkJCQkJCWRlc2MgKi8KKwlSeEZpZCAgICAgICAgIHJ4X2Rlc2M7CQkgICAgIC8qIGNhcmQgcmVjZWl2ZSBkZXNjcmlwdG9yICovCisJY2hhciAgICAgICAgICAqdmlydHVhbF9ob3N0X2FkZHI7ICAgIC8qIHZpcnR1YWwgYWRkcmVzcyBvZiBob3N0IHJlY2VpdmUKKwkJCQkJICAgICAgICBidWZmZXIgKi8KKwlpbnQgICAgICAgICAgIHBlbmRpbmc7Cit9IEhvc3RSeERlc2M7CisKKy8qCisgKiBIb3N0IHRyYW5zbWl0IGRlc2NyaXB0b3IKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqY2FyZF9yYW1fb2ZmOwkgICAgIC8qIG9mZnNldCBpbnRvIGNhcmQgbWVtb3J5IG9mIHRoZQorCQkJCQkJZGVzYyAqLworCVR4RmlkICAgICAgICAgdHhfZGVzYzsJCSAgICAgLyogY2FyZCB0cmFuc21pdCBkZXNjcmlwdG9yICovCisJY2hhciAgICAgICAgICAqdmlydHVhbF9ob3N0X2FkZHI7ICAgIC8qIHZpcnR1YWwgYWRkcmVzcyBvZiBob3N0IHJlY2VpdmUKKwkJCQkJICAgICAgICBidWZmZXIgKi8KKwlpbnQgICAgICAgICAgIHBlbmRpbmc7Cit9IEhvc3RUeERlc2M7CisKKy8qCisgKiBIb3N0IFJJRCBkZXNjcmlwdG9yCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIF9faW9tZW0gKmNhcmRfcmFtX29mZjsgICAgICAvKiBvZmZzZXQgaW50byBjYXJkIG1lbW9yeSBvZiB0aGUKKwkJCQkJICAgICBkZXNjcmlwdG9yICovCisJUmlkICAgICAgICAgICByaWRfZGVzYzsJCSAgLyogY2FyZCBSSUQgZGVzY3JpcHRvciAqLworCWNoYXIgICAgICAgICAgKnZpcnR1YWxfaG9zdF9hZGRyOyAvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgaG9zdCByZWNlaXZlCisJCQkJCSAgICAgYnVmZmVyICovCit9IEhvc3RSaWREZXNjOworCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2IHN3MDsKKwl1MTYgc3cxOworCXUxNiBzdGF0dXM7CisJdTE2IGxlbjsKKyNkZWZpbmUgSE9TVF9TRVQgKDEgPDwgMCkKKyNkZWZpbmUgSE9TVF9JTlRfVFggKDEgPDwgMSkgLyogSW50ZXJydXB0IG9uIHN1Y2Nlc3NmdWwgVFggKi8KKyNkZWZpbmUgSE9TVF9JTlRfVFhFUlIgKDEgPDwgMikgLyogSW50ZXJydXB0IG9uIHVuc2VjY2Vzc2Z1bCBUWCAqLworI2RlZmluZSBIT1NUX0xDQ19QQVlMT0FEICgxIDw8IDQpIC8qIExMQyBwYXlsb2FkLCAwID0gRXRoZXJ0eXBlICovCisjZGVmaW5lIEhPU1RfRE9OVF9STFNFICgxIDw8IDUpIC8qIERvbid0IHJlbGVhc2UgYnVmZmVyIHdoZW4gZG9uZSAqLworI2RlZmluZSBIT1NUX0RPTlRfUkVUUlkgKDEgPDwgNikgLyogRG9uJ3QgcmV0cnkgdHJhc21pdCAqLworI2RlZmluZSBIT1NUX0NMUl9BSUQgKDEgPDwgNykgLyogY2xlYXIgQUlEIGZhaWx1cmUgKi8KKyNkZWZpbmUgSE9TVF9SVFMgKDEgPDwgOSkgLyogRm9yY2UgUlRTIHVzZSAqLworI2RlZmluZSBIT1NUX1NIT1JUICgxIDw8IDEwKSAvKiBEbyBzaG9ydCBwcmVhbWJsZSAqLworCXUxNiBjdGw7CisJdTE2IGFpZDsKKwl1MTYgcmV0cmllczsKKwl1MTYgZmlsbDsKK30gVHhDdGxIZHI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgdTE2IGN0bDsKKyAgICAgICAgdTE2IGR1cmF0aW9uOworICAgICAgICBjaGFyIGFkZHIxWzZdOworICAgICAgICBjaGFyIGFkZHIyWzZdOworICAgICAgICBjaGFyIGFkZHIzWzZdOworICAgICAgICB1MTYgc2VxOworICAgICAgICBjaGFyIGFkZHI0WzZdOworfSBXaWZpSGRyOworCisKK3R5cGVkZWYgc3RydWN0IHsKKwlUeEN0bEhkciBjdGxoZHI7CisJdTE2IGZpbGwxOworCXUxNiBmaWxsMjsKKwlXaWZpSGRyIHdpZmloZHI7CisJdTE2IGdhcGxlbjsKKwl1MTYgc3RhdHVzOworfSBXaWZpQ3RsSGRyOworCitXaWZpQ3RsSGRyIHdpZmljdGxoZHI4MDIzID0geworCS5jdGxoZHIgPSB7CisJCS5jdGwJPSBIT1NUX0RPTlRfUkxTRSwKKwl9Cit9OworCisjaWZkZWYgV0lSRUxFU1NfRVhUCisvLyBGcmVxdWVuY3kgbGlzdCAobWFwIGNoYW5uZWxzIHRvIGZyZXF1ZW5jaWVzKQorc3RhdGljIGNvbnN0IGxvbmcgZnJlcXVlbmN5X2xpc3RbXSA9IHsgMjQxMiwgMjQxNywgMjQyMiwgMjQyNywgMjQzMiwgMjQzNywgMjQ0MiwKKwkJCQkyNDQ3LCAyNDUyLCAyNDU3LCAyNDYyLCAyNDY3LCAyNDcyLCAyNDg0IH07CisKKy8vIEEgZmV3IGRldGFpbHMgbmVlZGVkIGZvciBXRVAgKFdpcmVsZXNzIEVxdWl2YWxlbnQgUHJpdmFjeSkKKyNkZWZpbmUgTUFYX0tFWV9TSVpFIDEzCQkJLy8gMTI4ICg/KSBiaXRzCisjZGVmaW5lIE1JTl9LRVlfU0laRSAgNQkJCS8vIDQwIGJpdHMgUkM0IC0gV0VQCit0eXBlZGVmIHN0cnVjdCB3ZXBfa2V5X3QgeworCXUxNglsZW47CisJdTgJa2V5WzE2XTsJLyogNDAtYml0IGFuZCAxMDQtYml0IGtleXMgKi8KK30gd2VwX2tleV90OworCisvKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisjaWZuZGVmIElXX0VOQ09ERV9OT0tFWQorI2RlZmluZSBJV19FTkNPREVfTk9LRVkgICAgICAgICAweDA4MDAgIC8qIEtleSBpcyB3cml0ZSBvbmx5LCBzbyBub3QgcHJlc2VudCAqLworI2RlZmluZSBJV19FTkNPREVfTU9ERSAgKElXX0VOQ09ERV9ESVNBQkxFRCB8IElXX0VOQ09ERV9SRVNUUklDVEVEIHwgSVdfRU5DT0RFX09QRU4pCisjZW5kaWYgLyogSVdfRU5DT0RFX05PS0VZICovCisKKy8qIExpc3Qgb2YgV2lyZWxlc3MgSGFuZGxlcnMgKG5ldyBBUEkpICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmCWFpcm9faGFuZGxlcl9kZWY7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUICovCisKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9ICJhaXJvLmMgMC42IChCZW4gUmVlZCAmIEphdmllciBBY2hpcmljYSkiOworCitzdHJ1Y3QgYWlyb19pbmZvOworCitzdGF0aWMgaW50IGdldF9kZWNfdTE2KCBjaGFyICpidWZmZXIsIGludCAqc3RhcnQsIGludCBsaW1pdCApOworc3RhdGljIHZvaWQgT1VUNDUwMCggc3RydWN0IGFpcm9faW5mbyAqLCB1MTYgcmVnaXN0ZXIsIHUxNiB2YWx1ZSApOworc3RhdGljIHVuc2lnbmVkIHNob3J0IElONDUwMCggc3RydWN0IGFpcm9faW5mbyAqLCB1MTYgcmVnaXN0ZXIgKTsKK3N0YXRpYyB1MTYgc2V0dXBfY2FyZChzdHJ1Y3QgYWlyb19pbmZvKiwgdTggKm1hYywgaW50IGxvY2spOworc3RhdGljIGludCBlbmFibGVfTUFDKCBzdHJ1Y3QgYWlyb19pbmZvICphaSwgUmVzcCAqcnNwLCBpbnQgbG9jayApOworc3RhdGljIHZvaWQgZGlzYWJsZV9NQUMoc3RydWN0IGFpcm9faW5mbyAqYWksIGludCBsb2NrKTsKK3N0YXRpYyB2b2lkIGVuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBhaXJvX2luZm8qKTsKK3N0YXRpYyB2b2lkIGRpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgYWlyb19pbmZvKik7CitzdGF0aWMgdTE2IGlzc3VlY29tbWFuZChzdHJ1Y3QgYWlyb19pbmZvKiwgQ21kICpwQ21kLCBSZXNwICpwUnNwKTsKK3N0YXRpYyBpbnQgYmFwX3NldHVwKHN0cnVjdCBhaXJvX2luZm8qLCB1MTYgcmlkLCB1MTYgb2Zmc2V0LCBpbnQgd2hpY2hiYXApOworc3RhdGljIGludCBhdXhfYmFwX3JlYWQoc3RydWN0IGFpcm9faW5mbyosIHUxNiAqcHUxNkRzdCwgaW50IGJ5dGVsZW4sCisJCQlpbnQgd2hpY2hiYXApOworc3RhdGljIGludCBmYXN0X2JhcF9yZWFkKHN0cnVjdCBhaXJvX2luZm8qLCB1MTYgKnB1MTZEc3QsIGludCBieXRlbGVuLAorCQkJIGludCB3aGljaGJhcCk7CitzdGF0aWMgaW50IGJhcF93cml0ZShzdHJ1Y3QgYWlyb19pbmZvKiwgY29uc3QgdTE2ICpwdTE2U3JjLCBpbnQgYnl0ZWxlbiwKKwkJICAgICBpbnQgd2hpY2hiYXApOworc3RhdGljIGludCBQQzQ1MDBfYWNjZXNzcmlkKHN0cnVjdCBhaXJvX2luZm8qLCB1MTYgcmlkLCB1MTYgYWNjbWQpOworc3RhdGljIGludCBQQzQ1MDBfcmVhZHJpZChzdHJ1Y3QgYWlyb19pbmZvKiwgdTE2IHJpZCwgdm9pZCAqcEJ1ZiwgaW50IGxlbiwgaW50IGxvY2spOworc3RhdGljIGludCBQQzQ1MDBfd3JpdGVyaWQoc3RydWN0IGFpcm9faW5mbyosIHUxNiByaWQsIGNvbnN0IHZvaWQKKwkJCSAgICpwQnVmLCBpbnQgbGVuLCBpbnQgbG9jayk7CitzdGF0aWMgaW50IGRvX3dyaXRlcmlkKCBzdHJ1Y3QgYWlyb19pbmZvKiwgdTE2IHJpZCwgY29uc3Qgdm9pZCAqcmlkX2RhdGEsCisJCQlpbnQgbGVuLCBpbnQgZHVtbXkgKTsKK3N0YXRpYyB1MTYgdHJhbnNtaXRfYWxsb2NhdGUoc3RydWN0IGFpcm9faW5mbyosIGludCBsZW5QYXlsb2FkLCBpbnQgcmF3KTsKK3N0YXRpYyBpbnQgdHJhbnNtaXRfODAyXzNfcGFja2V0KHN0cnVjdCBhaXJvX2luZm8qLCBpbnQgbGVuLCBjaGFyICpwUGFja2V0KTsKK3N0YXRpYyBpbnQgdHJhbnNtaXRfODAyXzExX3BhY2tldChzdHJ1Y3QgYWlyb19pbmZvKiwgaW50IGxlbiwgY2hhciAqcFBhY2tldCk7CisKK3N0YXRpYyBpbnQgbXBpX3NlbmRfcGFja2V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIG1waV91bm1hcF9jYXJkKHN0cnVjdCBwY2lfZGV2ICpwY2kpOworc3RhdGljIHZvaWQgbXBpX3JlY2VpdmVfODAyXzMoc3RydWN0IGFpcm9faW5mbyAqYWkpOworc3RhdGljIHZvaWQgbXBpX3JlY2VpdmVfODAyXzExKHN0cnVjdCBhaXJvX2luZm8gKmFpKTsKK3N0YXRpYyBpbnQgd2FpdGJ1c3kgKHN0cnVjdCBhaXJvX2luZm8gKmFpKTsKKworc3RhdGljIGlycXJldHVybl90IGFpcm9faW50ZXJydXB0KCBpbnQgaXJxLCB2b2lkKiBkZXZfaWQsIHN0cnVjdCBwdF9yZWdzCisJCQkgICAgKnJlZ3MpOworc3RhdGljIGludCBhaXJvX3RocmVhZCh2b2lkICpkYXRhKTsKK3N0YXRpYyB2b2lkIHRpbWVyX2Z1bmMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKK3N0YXRpYyBpbnQgYWlyb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKKyNpZmRlZiBXSVJFTEVTU19FWFQKK3N0cnVjdCBpd19zdGF0aXN0aWNzICphaXJvX2dldF93aXJlbGVzc19zdGF0cyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBhaXJvX3JlYWRfd2lyZWxlc3Nfc3RhdHMgKHN0cnVjdCBhaXJvX2luZm8gKmxvY2FsKTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgKi8KKyNpZmRlZiBDSVNDT19FWFQKK3N0YXRpYyBpbnQgcmVhZHJpZHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYWlyb25ldF9pb2N0bCAqY29tcCk7CitzdGF0aWMgaW50IHdyaXRlcmlkcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBhaXJvbmV0X2lvY3RsICpjb21wKTsKK2ludCBmbGFzaGNhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYWlyb25ldF9pb2N0bCAqY29tcCk7CisjZW5kaWYgLyogQ0lTQ09fRVhUICovCisjaWZkZWYgTUlDU1VQUE9SVAorc3RhdGljIHZvaWQgbWljaW5pdChzdHJ1Y3QgYWlyb19pbmZvICphaSk7CitzdGF0aWMgaW50IG1pY3NldHVwKHN0cnVjdCBhaXJvX2luZm8gKmFpKTsKK3N0YXRpYyBpbnQgZW5jYXBzdWxhdGUoc3RydWN0IGFpcm9faW5mbyAqYWksIGV0aGVySGVhZCAqcFBhY2tldCwgTUlDQnVmZmVyICpidWZmZXIsIGludCBsZW4pOworc3RhdGljIGludCBkZWNhcHN1bGF0ZShzdHJ1Y3QgYWlyb19pbmZvICphaSwgTUlDQnVmZmVyICptaWMsIGV0aGVySGVhZCAqcFBhY2tldCwgdTE2IHBheUxlbik7CisKKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNlbmRpZgorCitzdHJ1Y3QgYWlyb19pbmZvIHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKKwlzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAgICAgICAqZGV2OworCS8qIE5vdGUsIHdlIGNhbiBoYXZlIE1BWF9GSURTIG91dHN0YW5kaW5nLiAgRklEcyBhcmUgMTYtYml0cywgc28gd2UKKwkgICB1c2UgdGhlIGhpZ2ggYml0IHRvIG1hcmsgd2hldGhlciBpdCBpcyBpbiB1c2UuICovCisjZGVmaW5lIE1BWF9GSURTIDYKKyNkZWZpbmUgTVBJX01BWF9GSURTIDEKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWRzW01BWF9GSURTXTsKKwlDb25maWdSaWQgY29uZmlnOworCWNoYXIga2V5aW5kZXg7IC8vIFVzZWQgd2l0aCBhdXRvIHdlcAorCWNoYXIgZGVmaW5kZXg7IC8vIFVzZWQgd2l0aCBhdXRvIHdlcAorCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19lbnRyeTsKKyAgICAgICAgc3BpbmxvY2tfdCBhdXhfbG9jazsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyNkZWZpbmUgRkxBR19QUk9NSVNDCTgJLyogSUZGX1BST01JU0MgMHgxMDAgLSBpbmNsdWRlL2xpbnV4L2lmLmggKi8KKyNkZWZpbmUgRkxBR19SQURJT19PRkYJMAkvKiBVc2VyIGRpc2FibGluZyBvZiBNQUMgKi8KKyNkZWZpbmUgRkxBR19SQURJT19ET1dOCTEJLyogaWZ1cC9pZmRvd24gZGlzYWJsaW5nIG9mIE1BQyAqLworI2RlZmluZSBGTEFHX1JBRElPX01BU0sgMHgwMworI2RlZmluZSBGTEFHX0VOQUJMRUQJMgorI2RlZmluZSBGTEFHX0FESE9DCTMJLyogTmVlZGVkIGJ5IE1JQyAqLworI2RlZmluZSBGTEFHX01JQ19DQVBBQkxFIDQKKyNkZWZpbmUgRkxBR19VUERBVEVfTVVMVEkgNQorI2RlZmluZSBGTEFHX1VQREFURV9VTkkgNgorI2RlZmluZSBGTEFHXzgwMl8xMQk3CisjZGVmaW5lIEZMQUdfUEVORElOR19YTUlUIDkKKyNkZWZpbmUgRkxBR19QRU5ESU5HX1hNSVQxMSAxMAorI2RlZmluZSBGTEFHX01QSQkxMQorI2RlZmluZSBGTEFHX1JFR0lTVEVSRUQJMTIKKyNkZWZpbmUgRkxBR19DT01NSVQJMTMKKyNkZWZpbmUgRkxBR19SRVNFVAkxNAorI2RlZmluZSBGTEFHX0ZMQVNISU5HCTE1CisjZGVmaW5lIEpPQl9NQVNLCTB4MWZmMDAwMAorI2RlZmluZSBKT0JfRElFCQkxNgorI2RlZmluZSBKT0JfWE1JVAkxNworI2RlZmluZSBKT0JfWE1JVDExCTE4CisjZGVmaW5lIEpPQl9TVEFUUwkxOQorI2RlZmluZSBKT0JfUFJPTUlTQwkyMAorI2RlZmluZSBKT0JfTUlDCQkyMQorI2RlZmluZSBKT0JfRVZFTlQJMjIKKyNkZWZpbmUgSk9CX0FVVE9XRVAJMjMKKyNkZWZpbmUgSk9CX1dTVEFUUwkyNAorCWludCAoKmJhcF9yZWFkKShzdHJ1Y3QgYWlyb19pbmZvKiwgdTE2ICpwdTE2RHN0LCBpbnQgYnl0ZWxlbiwKKwkJCWludCB3aGljaGJhcCk7CisJdW5zaWduZWQgc2hvcnQgKmZsYXNoOworCXRkc1Jzc2lFbnRyeSAqcnNzaTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJc3RydWN0IHNlbWFwaG9yZSBzZW07CisJcGlkX3QgdGhyX3BpZDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB0aHJfd2FpdDsKKwlzdHJ1Y3QgY29tcGxldGlvbiB0aHJfZXhpdGVkOworCXVuc2lnbmVkIGxvbmcgZXhwaXJlczsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlpbnQgZmlkOworCX0geG1pdCwgeG1pdDExOworCXN0cnVjdCBuZXRfZGV2aWNlICp3aWZpZGV2OworI2lmZGVmIFdJUkVMRVNTX0VYVAorCXN0cnVjdCBpd19zdGF0aXN0aWNzCXdzdGF0czsJCS8vIHdpcmVsZXNzIHN0YXRzCisJdW5zaWduZWQgbG9uZwkJc2Nhbl90aW1lc3RhbXA7CS8qIFRpbWUgc3RhcnRlZCB0byBzY2FuICovCisJc3RydWN0IGl3X3NweV9kYXRhCXNweV9kYXRhOworCXN0cnVjdCBpd19wdWJsaWNfZGF0YQl3aXJlbGVzc19kYXRhOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCAqLworI2lmZGVmIE1JQ1NVUFBPUlQKKwkvKiBNSUMgc3R1ZmYgKi8KKwlzdHJ1Y3QgY3J5cHRvX3RmbQkqdGZtOworCW1pY19tb2R1bGUJCW1vZFsyXTsKKwltaWNfc3RhdGlzdGljcwkJbWljc3RhdHM7CisjZW5kaWYKKwlIb3N0UnhEZXNjIHJ4Zmlkc1tNUElfTUFYX0ZJRFNdOyAvLyByeC90eC9jb25maWcgTVBJMzUwIGRlc2NyaXB0b3JzCisJSG9zdFR4RGVzYyB0eGZpZHNbTVBJX01BWF9GSURTXTsKKwlIb3N0UmlkRGVzYyBjb25maWdfZGVzYzsKKwl1bnNpZ25lZCBsb25nIHJpZGJ1czsgLy8gcGh5cyBhZGRyIG9mIGNvbmZpZ19kZXNjCisJc3RydWN0IHNrX2J1ZmZfaGVhZCB0eHE7Ly8gdHggcXVldWUgdXNlZCBieSBtcGkzNTAgY29kZQorCXN0cnVjdCBwY2lfZGV2ICAgICAgICAgICpwY2k7CisJdW5zaWduZWQgY2hhcgkJX19pb21lbSAqcGNpbWVtOworCXVuc2lnbmVkIGNoYXIJCV9faW9tZW0gKnBjaWF1eDsKKwl1bnNpZ25lZCBjaGFyCQkqc2hhcmVkOworCWRtYV9hZGRyX3QJCXNoYXJlZF9kbWE7CisJaW50CQkJcG93ZXI7CisJU3NpZFJpZAkJCSpTU0lEOworCUFQTGlzdFJpZAkJKkFQTGlzdDsKKyNkZWZpbmUJUENJX1NIQVJFRF9MRU4JCTIqTVBJX01BWF9GSURTKlBLVFNJWkUrUklEU0laRQorCWNoYXIJCQlwcm9jX25hbWVbSUZOQU1TSVpdOworfTsKKworc3RhdGljIGlubGluZSBpbnQgYmFwX3JlYWQoc3RydWN0IGFpcm9faW5mbyAqYWksIHUxNiAqcHUxNkRzdCwgaW50IGJ5dGVsZW4sCisJCQkgICBpbnQgd2hpY2hiYXApIHsKKwlyZXR1cm4gYWktPmJhcF9yZWFkKGFpLCBwdTE2RHN0LCBieXRlbGVuLCB3aGljaGJhcCk7Cit9CisKK3N0YXRpYyBpbnQgc2V0dXBfcHJvY19lbnRyeSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGFpcm9faW5mbyAqYXByaXYgKTsKK3N0YXRpYyBpbnQgdGFrZWRvd25fcHJvY19lbnRyeSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgYWlyb19pbmZvICphcHJpdiApOworCisjaWZkZWYgTUlDU1VQUE9SVAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JQyBST1VUSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK3N0YXRpYyBpbnQgUnhTZXFWYWxpZCAoc3RydWN0IGFpcm9faW5mbyAqYWksbWljY250eCAqY29udGV4dCxpbnQgbWNhc3QsdTMyIG1pY1NlcSk7CitzdGF0aWMgdm9pZCBNb3ZlV2luZG93KG1pY2NudHggKmNvbnRleHQsIHUzMiBtaWNTZXEpOwordm9pZCBlbW1oMzJfc2V0c2VlZChlbW1oMzJfY29udGV4dCAqY29udGV4dCwgdTggKnBrZXksIGludCBrZXlsZW4sIHN0cnVjdCBjcnlwdG9fdGZtICopOwordm9pZCBlbW1oMzJfaW5pdChlbW1oMzJfY29udGV4dCAqY29udGV4dCk7Cit2b2lkIGVtbWgzMl91cGRhdGUoZW1taDMyX2NvbnRleHQgKmNvbnRleHQsIHU4ICpwT2N0ZXRzLCBpbnQgbGVuKTsKK3ZvaWQgZW1taDMyX2ZpbmFsKGVtbWgzMl9jb250ZXh0ICpjb250ZXh0LCB1OCBkaWdlc3RbNF0pOworCisvKiBtaWNpbml0IC0gSW5pdGlhbGl6ZSBtaWMgc2VlZCAqLworCitzdGF0aWMgdm9pZCBtaWNpbml0KHN0cnVjdCBhaXJvX2luZm8gKmFpKQoreworCU1JQ1JpZCBtaWNfcmlkOworCisJY2xlYXJfYml0KEpPQl9NSUMsICZhaS0+ZmxhZ3MpOworCVBDNDUwMF9yZWFkcmlkKGFpLCBSSURfTUlDLCAmbWljX3JpZCwgc2l6ZW9mKG1pY19yaWQpLCAwKTsKKwl1cCgmYWktPnNlbSk7CisKKwlhaS0+bWljc3RhdHMuZW5hYmxlZCA9IChtaWNfcmlkLnN0YXRlICYgMHgwMEZGKSA/IDEgOiAwOworCisJaWYgKGFpLT5taWNzdGF0cy5lbmFibGVkKSB7CisJCS8qIEtleSBtdXN0IGJlIHZhbGlkIGFuZCBkaWZmZXJlbnQgKi8KKwkJaWYgKG1pY19yaWQubXVsdGljYXN0VmFsaWQgJiYgKCFhaS0+bW9kWzBdLm1DdHgudmFsaWQgfHwKKwkJICAgIChtZW1jbXAgKGFpLT5tb2RbMF0ubUN0eC5rZXksIG1pY19yaWQubXVsdGljYXN0LAorCQkJICAgICBzaXplb2YoYWktPm1vZFswXS5tQ3R4LmtleSkpICE9IDApKSkgeworCQkJLyogQWdlIGN1cnJlbnQgbWljIENvbnRleHQgKi8KKwkJCW1lbWNweSgmYWktPm1vZFsxXS5tQ3R4LCZhaS0+bW9kWzBdLm1DdHgsc2l6ZW9mKG1pY2NudHgpKTsKKwkJCS8qIEluaXRpYWxpemUgbmV3IGNvbnRleHQgKi8KKwkJCW1lbWNweSgmYWktPm1vZFswXS5tQ3R4LmtleSxtaWNfcmlkLm11bHRpY2FzdCxzaXplb2YobWljX3JpZC5tdWx0aWNhc3QpKTsKKwkJCWFpLT5tb2RbMF0ubUN0eC53aW5kb3cgID0gMzM7IC8vV2luZG93IGFsd2F5cyBwb2ludHMgdG8gdGhlIG1pZGRsZQorCQkJYWktPm1vZFswXS5tQ3R4LnJ4ICAgICAgPSAwOyAgLy9SeCBTZXF1ZW5jZSBudW1iZXJzCisJCQlhaS0+bW9kWzBdLm1DdHgudHggICAgICA9IDA7ICAvL1R4IHNlcXVlbmNlIG51bWJlcnMKKwkJCWFpLT5tb2RbMF0ubUN0eC52YWxpZCAgID0gMTsgIC8vS2V5IGlzIG5vdyB2YWxpZAorICAKKwkJCS8qIEdpdmUga2V5IHRvIG1pYyBzZWVkICovCisJCQllbW1oMzJfc2V0c2VlZCgmYWktPm1vZFswXS5tQ3R4LnNlZWQsbWljX3JpZC5tdWx0aWNhc3Qsc2l6ZW9mKG1pY19yaWQubXVsdGljYXN0KSwgYWktPnRmbSk7CisJCX0KKworCQkvKiBLZXkgbXVzdCBiZSB2YWxpZCBhbmQgZGlmZmVyZW50ICovCisJCWlmIChtaWNfcmlkLnVuaWNhc3RWYWxpZCAmJiAoIWFpLT5tb2RbMF0udUN0eC52YWxpZCB8fCAKKwkJICAgIChtZW1jbXAoYWktPm1vZFswXS51Q3R4LmtleSwgbWljX3JpZC51bmljYXN0LAorCQkJICAgIHNpemVvZihhaS0+bW9kWzBdLnVDdHgua2V5KSkgIT0gMCkpKSB7CisJCQkvKiBBZ2UgY3VycmVudCBtaWMgQ29udGV4dCAqLworCQkJbWVtY3B5KCZhaS0+bW9kWzFdLnVDdHgsJmFpLT5tb2RbMF0udUN0eCxzaXplb2YobWljY250eCkpOworCQkJLyogSW5pdGlhbGl6ZSBuZXcgY29udGV4dCAqLworCQkJbWVtY3B5KCZhaS0+bW9kWzBdLnVDdHgua2V5LG1pY19yaWQudW5pY2FzdCxzaXplb2YobWljX3JpZC51bmljYXN0KSk7CisJCisJCQlhaS0+bW9kWzBdLnVDdHgud2luZG93ICA9IDMzOyAvL1dpbmRvdyBhbHdheXMgcG9pbnRzIHRvIHRoZSBtaWRkbGUKKwkJCWFpLT5tb2RbMF0udUN0eC5yeCAgICAgID0gMDsgIC8vUnggU2VxdWVuY2UgbnVtYmVycworCQkJYWktPm1vZFswXS51Q3R4LnR4ICAgICAgPSAwOyAgLy9UeCBzZXF1ZW5jZSBudW1iZXJzCisJCQlhaS0+bW9kWzBdLnVDdHgudmFsaWQgICA9IDE7ICAvL0tleSBpcyBub3cgdmFsaWQKKwkKKwkJCS8vR2l2ZSBrZXkgdG8gbWljIHNlZWQKKwkJCWVtbWgzMl9zZXRzZWVkKCZhaS0+bW9kWzBdLnVDdHguc2VlZCwgbWljX3JpZC51bmljYXN0LCBzaXplb2YobWljX3JpZC51bmljYXN0KSwgYWktPnRmbSk7CisJCX0KKwl9IGVsc2UgeworICAgICAgLyogU28gbmV4dCB0aW1lIHdlIGhhdmUgYSB2YWxpZCBrZXkgYW5kIG1pYyBpcyBlbmFibGVkLCB3ZSB3aWxsIHVwZGF0ZQorICAgICAgICogdGhlIHNlcXVlbmNlIG51bWJlciBpZiB0aGUga2V5IGlzIHRoZSBzYW1lIGFzIGJlZm9yZS4KKyAgICAgICAqLworCQlhaS0+bW9kWzBdLnVDdHgudmFsaWQgPSAwOworCQlhaS0+bW9kWzBdLm1DdHgudmFsaWQgPSAwOworCX0KK30KKworLyogbWljc2V0dXAgLSBHZXQgcmVhZHkgZm9yIGJ1c2luZXNzICovCisKK3N0YXRpYyBpbnQgbWljc2V0dXAoc3RydWN0IGFpcm9faW5mbyAqYWkpIHsKKwlpbnQgaTsKKworCWlmIChhaS0+dGZtID09IE5VTEwpCisJICAgICAgICBhaS0+dGZtID0gY3J5cHRvX2FsbG9jX3RmbSgiYWVzIiwgMCk7CisKKyAgICAgICAgaWYgKGFpLT50Zm0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiYWlybzogZmFpbGVkIHRvIGxvYWQgdHJhbnNmb3JtIGZvciBBRVNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUjsKKyAgICAgICAgfQorCisJZm9yIChpPTA7IGkgPCBOVU1fTU9EVUxFUzsgaSsrKSB7CisJCW1lbXNldCgmYWktPm1vZFtpXS5tQ3R4LDAsc2l6ZW9mKG1pY2NudHgpKTsKKwkJbWVtc2V0KCZhaS0+bW9kW2ldLnVDdHgsMCxzaXplb2YobWljY250eCkpOworCX0KKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworY2hhciBtaWNzbmFwW109IHsweEFBLDB4QUEsMHgwMywweDAwLDB4NDAsMHg5NiwweDAwLDB4MDJ9OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGVzY3JpcHRpb246IE1pYyBhIHBhY2tldAorICogICAgCisgKiAgICAgIElucHV0czogZXRoZXJIZWFkICogcG9pbnRlciB0byBhbiA4MDIuMyBmcmFtZQorICogICAgCisgKiAgICAgUmV0dXJuczogQk9PTEVBTiBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZmFsc2UuCisgKiAgICAgICAgICAgICBQYWNrZXRUeExlbiB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgbWljJ2QgcGFja2V0cyBzaXplLgorICoKKyAqICAgIENhdmVhdHM6IEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWUgYnVmZmVyIHdpbGwgYWxyZWFkeQorICogICAgICAgICAgICAgYmUgYmlnIGVub3VnaCB0byBob2xkIHRoZSBsYXJnZXRzIG1pYyBtZXNzYWdlIHBvc3NpYmxlLgorICogICAgICAgICAgICAoTm8gbWVtb3J5IGFsbG9jYXRpb24gaXMgZG9uZSBoZXJlKS4KKyAqICAKKyAqICAgIEF1dGhvcjogc2JyYW5la3kgKDEwLzE1LzAxKQorICogICAgTWVyY2lsZXNzIGhhY2tzIGJ5IHJ3aWxjaGVyICgxLzE0LzAyKQorICovCisKK3N0YXRpYyBpbnQgZW5jYXBzdWxhdGUoc3RydWN0IGFpcm9faW5mbyAqYWkgLGV0aGVySGVhZCAqZnJhbWUsIE1JQ0J1ZmZlciAqbWljLCBpbnQgcGF5TGVuKQoreworCW1pY2NudHggICAqY29udGV4dDsKKworCS8vIERldGVybWluZSBjb3JyZWN0IGNvbnRleHQKKwkvLyBJZiBub3QgYWRob2MsIGFsd2F5cyB1c2UgdW5pY2FzdCBrZXkKKworCWlmICh0ZXN0X2JpdChGTEFHX0FESE9DLCAmYWktPmZsYWdzKSAmJiAoZnJhbWUtPmRhWzBdICYgMHgxKSkKKwkJY29udGV4dCA9ICZhaS0+bW9kWzBdLm1DdHg7CisJZWxzZQorCQljb250ZXh0ID0gJmFpLT5tb2RbMF0udUN0eDsKKyAgCisJaWYgKCFjb250ZXh0LT52YWxpZCkKKwkJcmV0dXJuIEVSUk9SOworCisJbWljLT50eXBlbGVuID0gaHRvbnMocGF5TGVuICsgMTYpOyAvL0xlbmd0aCBvZiBNaWMnZCBwYWNrZXQKKworCW1lbWNweSgmbWljLT51LnNuYXAsIG1pY3NuYXAsIHNpemVvZihtaWNzbmFwKSk7IC8vIEFkZCBTbmFwCisKKwkvLyBBZGQgVHggc2VxdWVuY2UKKwltaWMtPnNlcSA9IGh0b25sKGNvbnRleHQtPnR4KTsKKwljb250ZXh0LT50eCArPSAyOworCisJZW1taDMyX2luaXQoJmNvbnRleHQtPnNlZWQpOyAvLyBNaWMgdGhlIHBhY2tldAorCWVtbWgzMl91cGRhdGUoJmNvbnRleHQtPnNlZWQsZnJhbWUtPmRhLEVUSF9BTEVOICogMik7IC8vIERBLFNBCisJZW1taDMyX3VwZGF0ZSgmY29udGV4dC0+c2VlZCwodTgqKSZtaWMtPnR5cGVsZW4sMTApOyAvLyBUeXBlL0xlbmd0aCBhbmQgU25hcAorCWVtbWgzMl91cGRhdGUoJmNvbnRleHQtPnNlZWQsKHU4KikmbWljLT5zZXEsc2l6ZW9mKG1pYy0+c2VxKSk7IC8vU0VRCisJZW1taDMyX3VwZGF0ZSgmY29udGV4dC0+c2VlZCxmcmFtZS0+ZGEgKyBFVEhfQUxFTiAqIDIscGF5TGVuKTsgLy9wYXlsb2FkCisJZW1taDMyX2ZpbmFsKCZjb250ZXh0LT5zZWVkLCAodTgqKSZtaWMtPm1pYyk7CisKKwkvKiAgICBOZXcgVHlwZS9sZW5ndGggPz8/Pz8/Pz8/PyAqLworCW1pYy0+dHlwZWxlbiA9IDA7IC8vTGV0IE5JQyBrbm93IGl0IGNvdWxkIGJlIGFuIG92ZXJzaXplZCBwYWNrZXQKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKwordHlwZWRlZiBlbnVtIHsKKyAgICBOT05FLAorICAgIE5PTUlDLAorICAgIE5PTUlDUExVTU1FRCwKKyAgICBTRVFVRU5DRSwKKyAgICBJTkNPUlJFQ1RNSUMsCit9IG1pY19lcnJvcjsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICBEZXNjcmlwdGlvbjogRGVjYXBzdWxhdGVzIGEgTUlDJ2QgcGFja2V0IGFuZCByZXR1cm5zIHRoZSA4MDIuMyBwYWNrZXQKKyAqICAgICAgICAgICAgICAgKHJlbW92ZXMgdGhlIE1JQyBzdHVmZikgaWYgcGFja2V0IGlzIGEgdmFsaWQgcGFja2V0LgorICogICAgICAKKyAqICAgICAgIElucHV0czogZXRoZXJIZWFkICBwb2ludGVyIHRvIHRoZSA4MDIuMyBwYWNrZXQgICAgICAgICAgICAgCisgKiAgICAgCisgKiAgICAgIFJldHVybnM6IEJPT0xFQU4gLSBUUlVFIGlmIHBhY2tldCBzaG91bGQgYmUgZHJvcHBlZCBvdGhlcndpc2UgRkFMU0UKKyAqICAgICAKKyAqICAgICAgQXV0aG9yOiBzYnJhbmVreSAoMTAvMTUvMDEpCisgKiAgICBNZXJjaWxlc3MgaGFja3MgYnkgcndpbGNoZXIgKDEvMTQvMDIpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBpbnQgZGVjYXBzdWxhdGUoc3RydWN0IGFpcm9faW5mbyAqYWksIE1JQ0J1ZmZlciAqbWljLCBldGhlckhlYWQgKmV0aCwgdTE2IHBheUxlbikKK3sKKwlpbnQgICAgICBpOworCXUzMiAgICAgIG1pY1NFUTsKKwltaWNjbnR4ICAqY29udGV4dDsKKwl1OCAgICAgICBkaWdlc3RbNF07CisJbWljX2Vycm9yIG1pY0Vycm9yID0gTk9ORTsKKworCS8vIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgYSBNaWMnZCBwYWNrZXQKKworCWlmICghYWktPm1pY3N0YXRzLmVuYWJsZWQpIHsKKwkJLy9ObyBNaWMgc2V0IG9yIE1pYyBPRkYgYnV0IHdlIHJlY2VpdmVkIGEgTUlDJ2QgcGFja2V0LgorCQlpZiAobWVtY21wICgodTgqKWV0aCArIDE0LCBtaWNzbmFwLCBzaXplb2YobWljc25hcCkpID09IDApIHsKKwkJCWFpLT5taWNzdGF0cy5yeE1JQ1BsdW1tZWQrKzsKKwkJCXJldHVybiBFUlJPUjsKKwkJfQorCQlyZXR1cm4gU1VDQ0VTUzsKKwl9CisKKwlpZiAobnRvaHMobWljLT50eXBlbGVuKSA9PSAweDg4OEUpCisJCXJldHVybiBTVUNDRVNTOworCisJaWYgKG1lbWNtcCAobWljLT51LnNuYXAsIG1pY3NuYXAsIHNpemVvZihtaWNzbmFwKSkgIT0gMCkgeworCSAgICAvLyBNaWMgZW5hYmxlZCBidXQgcGFja2V0IGlzbid0IE1pYydkCisJCWFpLT5taWNzdGF0cy5yeE1JQ1BsdW1tZWQrKzsKKwkgICAgCXJldHVybiBFUlJPUjsKKwl9CisKKwltaWNTRVEgPSBudG9obChtaWMtPnNlcSk7ICAgICAgICAgICAgLy9zdG9yZSBTRVEgYXMgQ1BVIG9yZGVyCisKKwkvL0F0IHRoaXMgcG9pbnQgd2UgYSBoYXZlIGEgbWljJ2QgcGFja2V0IGFuZCBtaWMgaXMgZW5hYmxlZAorCS8vTm93IGRvIHRoZSBtaWMgZXJyb3IgY2hlY2tpbmcuCisKKwkvL1JlY2VpdmUgc2VxIG11c3QgYmUgb2RkCisJaWYgKCAobWljU0VRICYgMSkgPT0gMCApIHsKKwkJYWktPm1pY3N0YXRzLnJ4V3JvbmdTZXF1ZW5jZSsrOworCQlyZXR1cm4gRVJST1I7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE5VTV9NT0RVTEVTOyBpKyspIHsKKwkJaW50IG1jYXN0ID0gZXRoLT5kYVswXSAmIDE7CisJCS8vRGV0ZXJtaW5lIHByb3BlciBjb250ZXh0IAorCQljb250ZXh0ID0gbWNhc3QgPyAmYWktPm1vZFtpXS5tQ3R4IDogJmFpLT5tb2RbaV0udUN0eDsKKwkKKwkJLy9NYWtlIHN1cmUgY29udGV4dCBpcyB2YWxpZAorCQlpZiAoIWNvbnRleHQtPnZhbGlkKSB7CisJCQlpZiAoaSA9PSAwKQorCQkJCW1pY0Vycm9yID0gTk9NSUNQTFVNTUVEOworCQkJY29udGludWU7ICAgICAgICAgICAgICAgIAorCQl9CisJICAgICAgIAkvL0RlTWljIGl0IAorCisJCWlmICghbWljLT50eXBlbGVuKQorCQkJbWljLT50eXBlbGVuID0gaHRvbnMocGF5TGVuICsgc2l6ZW9mKE1JQ0J1ZmZlcikgLSAyKTsKKwkKKwkJZW1taDMyX2luaXQoJmNvbnRleHQtPnNlZWQpOworCQllbW1oMzJfdXBkYXRlKCZjb250ZXh0LT5zZWVkLCBldGgtPmRhLCBFVEhfQUxFTioyKTsgCisJCWVtbWgzMl91cGRhdGUoJmNvbnRleHQtPnNlZWQsICh1OCAqKSZtaWMtPnR5cGVsZW4sIHNpemVvZihtaWMtPnR5cGVsZW4pK3NpemVvZihtaWMtPnUuc25hcCkpOyAKKwkJZW1taDMyX3VwZGF0ZSgmY29udGV4dC0+c2VlZCwgKHU4ICopJm1pYy0+c2VxLHNpemVvZihtaWMtPnNlcSkpOwkKKwkJZW1taDMyX3VwZGF0ZSgmY29udGV4dC0+c2VlZCwgZXRoLT5kYSArIEVUSF9BTEVOKjIscGF5TGVuKTsJCisJCS8vQ2FsY3VsYXRlIE1JQworCQllbW1oMzJfZmluYWwoJmNvbnRleHQtPnNlZWQsIGRpZ2VzdCk7CisJCisJCWlmIChtZW1jbXAoZGlnZXN0LCAmbWljLT5taWMsIDQpKSB7IC8vTWFrZSBzdXJlIHRoZSBtaWNzIG1hdGNoCisJCSAgLy9JbnZhbGlkIE1pYworCQkJaWYgKGkgPT0gMCkKKwkJCQltaWNFcnJvciA9IElOQ09SUkVDVE1JQzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLy9DaGVjayBTZXF1ZW5jZSBudW1iZXIgaWYgbWljcyBwYXNzCisJCWlmIChSeFNlcVZhbGlkKGFpLCBjb250ZXh0LCBtY2FzdCwgbWljU0VRKSA9PSBTVUNDRVNTKSB7CisJCQlhaS0+bWljc3RhdHMucnhTdWNjZXNzKys7CisJCQlyZXR1cm4gU1VDQ0VTUzsKKwkJfQorCQlpZiAoaSA9PSAwKQorCQkJbWljRXJyb3IgPSBTRVFVRU5DRTsKKwl9CisKKwkvLyBVcGRhdGUgc3RhdGlzdGljcworCXN3aXRjaCAobWljRXJyb3IpIHsKKwkJY2FzZSBOT01JQ1BMVU1NRUQ6IGFpLT5taWNzdGF0cy5yeE1JQ1BsdW1tZWQrKzsgICBicmVhazsKKwkJY2FzZSBTRVFVRU5DRTogICAgYWktPm1pY3N0YXRzLnJ4V3JvbmdTZXF1ZW5jZSsrOyBicmVhazsKKwkJY2FzZSBJTkNPUlJFQ1RNSUM6IGFpLT5taWNzdGF0cy5yeEluY29ycmVjdE1JQysrOyBicmVhazsKKwkJY2FzZSBOT05FOiAgYnJlYWs7CisJCWNhc2UgTk9NSUM6IGJyZWFrOworCX0KKwlyZXR1cm4gRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZXNjcmlwdGlvbjogIENoZWNrcyB0aGUgUnggU2VxIG51bWJlciB0byBtYWtlIHN1cmUgaXQgaXMgdmFsaWQKKyAqICAgICAgICAgICAgICAgYW5kIGhhc24ndCBhbHJlYWR5IGJlZW4gcmVjZWl2ZWQKKyAqICAgCisgKiAgICAgSW5wdXRzOiBtaWNjbnR4IC0gbWljIGNvbnRleHQgdG8gY2hlY2sgc2VxIGFnYWluc3QKKyAqICAgICAgICAgICAgIG1pY1NlcSAgLSB0aGUgTWljIHNlcSBudW1iZXIKKyAqICAgCisgKiAgICBSZXR1cm5zOiBUUlVFIGlmIHZhbGlkIG90aGVyd2lzZSBGQUxTRS4gCisgKgorICogICAgQXV0aG9yOiBzYnJhbmVreSAoMTAvMTUvMDEpCisgKiAgICBNZXJjaWxlc3MgaGFja3MgYnkgcndpbGNoZXIgKDEvMTQvMDIpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBpbnQgUnhTZXFWYWxpZCAoc3RydWN0IGFpcm9faW5mbyAqYWksbWljY250eCAqY29udGV4dCxpbnQgbWNhc3QsdTMyIG1pY1NlcSkKK3sKKwl1MzIgc2VxLGluZGV4OworCisJLy9BbGxvdyBmb3IgdGhlIGFwIGJlaW5nIHJlYm9vdGVkIC0gaWYgaXQgaXMgdGhlbiB1c2UgdGhlIG5leHQgCisJLy9zZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgc2VxdWVuY2UgbnVtYmVyIC0gbWlnaHQgZ28gYmFja3dhcmRzCisKKwlpZiAobWNhc3QpIHsKKwkJaWYgKHRlc3RfYml0KEZMQUdfVVBEQVRFX01VTFRJLCAmYWktPmZsYWdzKSkgeworCQkJY2xlYXJfYml0IChGTEFHX1VQREFURV9NVUxUSSwgJmFpLT5mbGFncyk7CisJCQljb250ZXh0LT53aW5kb3cgPSAobWljU2VxID4gMzMpID8gbWljU2VxIDogMzM7CisJCQljb250ZXh0LT5yeCAgICAgPSAwOyAgICAgICAgLy8gUmVzZXQgcngKKwkJfQorCX0gZWxzZSBpZiAodGVzdF9iaXQoRkxBR19VUERBVEVfVU5JLCAmYWktPmZsYWdzKSkgeworCQljbGVhcl9iaXQgKEZMQUdfVVBEQVRFX1VOSSwgJmFpLT5mbGFncyk7CisJCWNvbnRleHQtPndpbmRvdyA9IChtaWNTZXEgPiAzMykgPyBtaWNTZXEgOiAzMzsgLy8gTW92ZSB3aW5kb3cKKwkJY29udGV4dC0+cnggICAgID0gMDsgICAgICAgIC8vIFJlc2V0IHJ4CisJfQorCisJLy9NYWtlIHNlcXVlbmNlIG51bWJlciByZWxhdGl2ZSB0byBTVEFSVCBvZiB3aW5kb3cKKwlzZXEgPSBtaWNTZXEgLSAoY29udGV4dC0+d2luZG93IC0gMzMpOworCisJLy9Ub28gb2xkIG9mIGEgU0VRIG51bWJlciB0byBjaGVjay4KKwlpZiAoKHMzMilzZXEgPCAwKQorCQlyZXR1cm4gRVJST1I7CisgICAgCisJaWYgKCBzZXEgPiA2NCApIHsKKwkJLy9XaW5kb3cgaXMgaW5maW5pdGUgZm9yd2FyZAorCQlNb3ZlV2luZG93KGNvbnRleHQsbWljU2VxKTsKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfQorCisJLy8gV2UgYXJlIGluIHRoZSB3aW5kb3cuIE5vdyBjaGVjayB0aGUgY29udGV4dCByeCBiaXQgdG8gc2VlIGlmIGl0IHdhcyBhbHJlYWR5IHNlbnQKKwlzZXEgPj49IDE7ICAgICAgICAgLy9kaXZpZGUgYnkgMiBiZWNhdXNlIHdlIG9ubHkgaGF2ZSBvZGQgbnVtYmVycworCWluZGV4ID0gMSA8PCBzZXE7ICAvL0dldCBhbiBpbmRleCBudW1iZXIKKworCWlmICghKGNvbnRleHQtPnJ4ICYgaW5kZXgpKSB7CisJCS8vbWljU0VRIGZhbGxzIGluc2lkZSB0aGUgd2luZG93LgorCQkvL0FkZCBzZXFlbmNlIG51bWJlciB0byB0aGUgbGlzdCBvZiByZWNlaXZlZCBudW1iZXJzLgorCQljb250ZXh0LT5yeCB8PSBpbmRleDsKKworCQlNb3ZlV2luZG93KGNvbnRleHQsbWljU2VxKTsKKworCQlyZXR1cm4gU1VDQ0VTUzsKKwl9CisJcmV0dXJuIEVSUk9SOworfQorCitzdGF0aWMgdm9pZCBNb3ZlV2luZG93KG1pY2NudHggKmNvbnRleHQsIHUzMiBtaWNTZXEpCit7CisJdTMyIHNoaWZ0OworCisJLy9Nb3ZlIHdpbmRvdyBpZiBzZXEgZ3JlYXRlciB0aGFuIHRoZSBtaWRkbGUgb2YgdGhlIHdpbmRvdworCWlmIChtaWNTZXEgPiBjb250ZXh0LT53aW5kb3cpIHsKKwkJc2hpZnQgPSAobWljU2VxIC0gY29udGV4dC0+d2luZG93KSA+PiAxOworICAgIAorCQkgICAgLy9TaGlmdCBvdXQgb2xkCisJCWlmIChzaGlmdCA8IDMyKQorCQkJY29udGV4dC0+cnggPj49IHNoaWZ0OworCQllbHNlCisJCQljb250ZXh0LT5yeCA9IDA7CisKKwkJY29udGV4dC0+d2luZG93ID0gbWljU2VxOyAgICAgIC8vTW92ZSB3aW5kb3cKKwl9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKj09PT09PT09PT0gRU1NSCBST1VUSU5FUyAgPT09PT09PT09PT09PT09PT09PT0qLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogbWljIGFjY3VtdWxhdGUgKi8KKyNkZWZpbmUgTUlDX0FDQ1VNKHZhbCkJXAorCWNvbnRleHQtPmFjY3VtICs9ICh1NjQpKHZhbCkgKiBjb250ZXh0LT5jb2VmZltjb2VmZl9wb3NpdGlvbisrXTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYWVzX2NvdW50ZXJbMTZdOworCisvKiBleHBhbmQgdGhlIGtleSB0byBmaWxsIHRoZSBNTUggY29lZmZpY2llbnQgYXJyYXkgKi8KK3ZvaWQgZW1taDMyX3NldHNlZWQoZW1taDMyX2NvbnRleHQgKmNvbnRleHQsIHU4ICpwa2V5LCBpbnQga2V5bGVuLCBzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworICAvKiB0YWtlIHRoZSBrZXlpbmcgbWF0ZXJpYWwsIGV4cGFuZCBpZiBuZWNlc3NhcnksIHRydW5jYXRlIGF0IDE2LWJ5dGVzICovCisgIC8qIHJ1biB0aHJvdWdoIEFFUyBjb3VudGVyIG1vZGUgdG8gZ2VuZXJhdGUgY29udGV4dC0+Y29lZmZbXSAqLworICAKKwlpbnQgaSxqOworCXUzMiBjb3VudGVyOworCXU4ICpjaXBoZXIsIHBsYWluWzE2XTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMV07CisKKwljcnlwdG9fY2lwaGVyX3NldGtleSh0Zm0sIHBrZXksIDE2KTsKKwljb3VudGVyID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihjb250ZXh0LT5jb2VmZikvc2l6ZW9mKGNvbnRleHQtPmNvZWZmWzBdKSk7ICkgeworCQlhZXNfY291bnRlclsxNV0gPSAodTgpKGNvdW50ZXIgPj4gMCk7CisJCWFlc19jb3VudGVyWzE0XSA9ICh1OCkoY291bnRlciA+PiA4KTsKKwkJYWVzX2NvdW50ZXJbMTNdID0gKHU4KShjb3VudGVyID4+IDE2KTsKKwkJYWVzX2NvdW50ZXJbMTJdID0gKHU4KShjb3VudGVyID4+IDI0KTsKKwkJY291bnRlcisrOworCQltZW1jcHkgKHBsYWluLCBhZXNfY291bnRlciwgMTYpOworCQlzZ1swXS5wYWdlID0gdmlydF90b19wYWdlKHBsYWluKTsKKwkJc2dbMF0ub2Zmc2V0ID0gKChsb25nKSBwbGFpbiAmIH5QQUdFX01BU0spOworCQlzZ1swXS5sZW5ndGggPSAxNjsKKwkJY3J5cHRvX2NpcGhlcl9lbmNyeXB0KHRmbSwgc2csIHNnLCAxNik7CisJCWNpcGhlciA9IGttYXAoc2dbMF0ucGFnZSkgKyBzZ1swXS5vZmZzZXQ7CisJCWZvciAoaj0wOyAoajwxNikgJiYgKGk8IChzaXplb2YoY29udGV4dC0+Y29lZmYpL3NpemVvZihjb250ZXh0LT5jb2VmZlswXSkpKTsgKSB7CisJCQljb250ZXh0LT5jb2VmZltpKytdID0gbnRvaGwoKih1MzIgKikmY2lwaGVyW2pdKTsKKwkJCWogKz0gNDsKKwkJfQorCX0KK30KKworLyogcHJlcGFyZSBmb3IgY2FsY3VsYXRpb24gb2YgYSBuZXcgbWljICovCit2b2lkIGVtbWgzMl9pbml0KGVtbWgzMl9jb250ZXh0ICpjb250ZXh0KQoreworCS8qIHByZXBhcmUgZm9yIG5ldyBtaWMgY2FsY3VsYXRpb24gKi8KKwljb250ZXh0LT5hY2N1bSA9IDA7CisJY29udGV4dC0+cG9zaXRpb24gPSAwOworfQorCisvKiBhZGQgc29tZSBieXRlcyB0byB0aGUgbWljIGNhbGN1bGF0aW9uICovCit2b2lkIGVtbWgzMl91cGRhdGUoZW1taDMyX2NvbnRleHQgKmNvbnRleHQsIHU4ICpwT2N0ZXRzLCBpbnQgbGVuKQoreworCWludAljb2VmZl9wb3NpdGlvbiwgYnl0ZV9wb3NpdGlvbjsKKyAgCisJaWYgKGxlbiA9PSAwKSByZXR1cm47CisgIAorCWNvZWZmX3Bvc2l0aW9uID0gY29udGV4dC0+cG9zaXRpb24gPj4gMjsKKyAgCisJLyogZGVhbCB3aXRoIHBhcnRpYWwgMzItYml0IHdvcmQgbGVmdCBvdmVyIGZyb20gbGFzdCB1cGRhdGUgKi8KKwlieXRlX3Bvc2l0aW9uID0gY29udGV4dC0+cG9zaXRpb24gJiAzOworCWlmIChieXRlX3Bvc2l0aW9uKSB7CisJCS8qIGhhdmUgYSBwYXJ0aWFsIHdvcmQgaW4gcGFydCB0byBkZWFsIHdpdGggKi8KKwkJZG8geworCQkJaWYgKGxlbiA9PSAwKSByZXR1cm47CisJCQljb250ZXh0LT5wYXJ0LmQ4W2J5dGVfcG9zaXRpb24rK10gPSAqcE9jdGV0cysrOworCQkJY29udGV4dC0+cG9zaXRpb24rKzsKKwkJCWxlbi0tOworCQl9IHdoaWxlIChieXRlX3Bvc2l0aW9uIDwgNCk7CisJCU1JQ19BQ0NVTShodG9ubChjb250ZXh0LT5wYXJ0LmQzMikpOworCX0KKworCS8qIGRlYWwgd2l0aCBmdWxsIDMyLWJpdCB3b3JkcyAqLworCXdoaWxlIChsZW4gPj0gNCkgeworCQlNSUNfQUNDVU0oaHRvbmwoKih1MzIgKilwT2N0ZXRzKSk7CisJCWNvbnRleHQtPnBvc2l0aW9uICs9IDQ7CisJCXBPY3RldHMgKz0gNDsKKwkJbGVuIC09IDQ7CisJfQorCisJLyogZGVhbCB3aXRoIHBhcnRpYWwgMzItYml0IHdvcmQgdGhhdCB3aWxsIGJlIGxlZnQgb3ZlciBmcm9tIHRoaXMgdXBkYXRlICovCisJYnl0ZV9wb3NpdGlvbiA9IDA7CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJY29udGV4dC0+cGFydC5kOFtieXRlX3Bvc2l0aW9uKytdID0gKnBPY3RldHMrKzsKKwkJY29udGV4dC0+cG9zaXRpb24rKzsKKwkJbGVuLS07CisJfQorfQorCisvKiBtYXNrIHVzZWQgdG8gemVybyBlbXB0eSBieXRlcyBmb3IgZmluYWwgcGFydGlhbCB3b3JkICovCitzdGF0aWMgdTMyIG1hc2szMls0XSA9IHsgMHgwMDAwMDAwMEwsIDB4RkYwMDAwMDBMLCAweEZGRkYwMDAwTCwgMHhGRkZGRkYwMEwgfTsKKworLyogY2FsY3VsYXRlIHRoZSBtaWMgKi8KK3ZvaWQgZW1taDMyX2ZpbmFsKGVtbWgzMl9jb250ZXh0ICpjb250ZXh0LCB1OCBkaWdlc3RbNF0pCit7CisJaW50CWNvZWZmX3Bvc2l0aW9uLCBieXRlX3Bvc2l0aW9uOworCXUzMgl2YWw7CisgIAorCXU2NCBzdW0sIHV0bXA7CisJczY0IHN0bXA7CisKKwljb2VmZl9wb3NpdGlvbiA9IGNvbnRleHQtPnBvc2l0aW9uID4+IDI7CisgIAorCS8qIGRlYWwgd2l0aCBwYXJ0aWFsIDMyLWJpdCB3b3JkIGxlZnQgb3ZlciBmcm9tIGxhc3QgdXBkYXRlICovCisJYnl0ZV9wb3NpdGlvbiA9IGNvbnRleHQtPnBvc2l0aW9uICYgMzsKKwlpZiAoYnl0ZV9wb3NpdGlvbikgeworCQkvKiBoYXZlIGEgcGFydGlhbCB3b3JkIGluIHBhcnQgdG8gZGVhbCB3aXRoICovCisJCXZhbCA9IGh0b25sKGNvbnRleHQtPnBhcnQuZDMyKTsKKwkJTUlDX0FDQ1VNKHZhbCAmIG1hc2szMltieXRlX3Bvc2l0aW9uXSk7CS8qIHplcm8gZW1wdHkgYnl0ZXMgKi8KKwl9CisKKwkvKiByZWR1Y2UgdGhlIGFjY3VtdWxhdGVkIHU2NCB0byBhIDMyLWJpdCBNSUMgKi8KKwlzdW0gPSBjb250ZXh0LT5hY2N1bTsKKwlzdG1wID0gKHN1bSAgJiAweGZmZmZmZmZmTEwpIC0gKChzdW0gPj4gMzIpICAqIDE1KTsKKwl1dG1wID0gKHN0bXAgJiAweGZmZmZmZmZmTEwpIC0gKChzdG1wID4+IDMyKSAqIDE1KTsKKwlzdW0gPSB1dG1wICYgMHhmZmZmZmZmZkxMOworCWlmICh1dG1wID4gMHgxMDAwMDAwMGZMTCkKKwkJc3VtIC09IDE1OworCisJdmFsID0gKHUzMilzdW07CisJZGlnZXN0WzBdID0gKHZhbD4+MjQpICYgMHhGRjsKKwlkaWdlc3RbMV0gPSAodmFsPj4xNikgJiAweEZGOworCWRpZ2VzdFsyXSA9ICh2YWw+PjgpICYgMHhGRjsKKwlkaWdlc3RbM10gPSB2YWwgJiAweEZGOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcmVhZEJTU0xpc3RSaWQoc3RydWN0IGFpcm9faW5mbyAqYWksIGludCBmaXJzdCwKKwkJICAgICAgQlNTTGlzdFJpZCAqbGlzdCkgeworCWludCByYzsKKwkJCUNtZCBjbWQ7CisJCQlSZXNwIHJzcDsKKworCWlmIChmaXJzdCA9PSAxKSB7CisJCQlpZiAoYWktPmZsYWdzICYgRkxBR19SQURJT19NQVNLKSByZXR1cm4gLUVORVRET1dOOworCQkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwkJCWNtZC5jbWQ9Q01EX0xJU1RCU1M7CisJCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhaS0+c2VtKSkKKwkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQkJaXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKTsKKwkJCXVwKCZhaS0+c2VtKTsKKwkJCS8qIExldCB0aGUgY29tbWFuZCB0YWtlIGVmZmVjdCAqLworCQkJYWktPnRhc2sgPSBjdXJyZW50OworCQkJc3NsZWVwKDMpOworCQkJYWktPnRhc2sgPSBOVUxMOworCQl9CisJcmMgPSBQQzQ1MDBfcmVhZHJpZChhaSwgZmlyc3QgPyBSSURfQlNTTElTVEZJUlNUIDogUklEX0JTU0xJU1RORVhULAorCQkJICAgIGxpc3QsIHNpemVvZigqbGlzdCksIDEpOworCisJbGlzdC0+bGVuID0gbGUxNl90b19jcHUobGlzdC0+bGVuKTsKKwlsaXN0LT5pbmRleCA9IGxlMTZfdG9fY3B1KGxpc3QtPmluZGV4KTsKKwlsaXN0LT5yYWRpb1R5cGUgPSBsZTE2X3RvX2NwdShsaXN0LT5yYWRpb1R5cGUpOworCWxpc3QtPmNhcCA9IGxlMTZfdG9fY3B1KGxpc3QtPmNhcCk7CisJbGlzdC0+YmVhY29uSW50ZXJ2YWwgPSBsZTE2X3RvX2NwdShsaXN0LT5iZWFjb25JbnRlcnZhbCk7CisJbGlzdC0+ZmguZHdlbGwgPSBsZTE2X3RvX2NwdShsaXN0LT5maC5kd2VsbCk7CisJbGlzdC0+ZHNDaGFubmVsID0gbGUxNl90b19jcHUobGlzdC0+ZHNDaGFubmVsKTsKKwlsaXN0LT5hdGltV2luZG93ID0gbGUxNl90b19jcHUobGlzdC0+YXRpbVdpbmRvdyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHJlYWRXZXBLZXlSaWQoc3RydWN0IGFpcm9faW5mbyphaSwgV2VwS2V5UmlkICp3a3IsIGludCB0ZW1wLCBpbnQgbG9jaykgeworCWludCByYyA9IFBDNDUwMF9yZWFkcmlkKGFpLCB0ZW1wID8gUklEX1dFUF9URU1QIDogUklEX1dFUF9QRVJNLAorCQkJCXdrciwgc2l6ZW9mKCp3a3IpLCBsb2NrKTsKKworCXdrci0+bGVuID0gbGUxNl90b19jcHUod2tyLT5sZW4pOworCXdrci0+a2luZGV4ID0gbGUxNl90b19jcHUod2tyLT5raW5kZXgpOworCXdrci0+a2xlbiA9IGxlMTZfdG9fY3B1KHdrci0+a2xlbik7CisJcmV0dXJuIHJjOworfQorLyogSW4gdGhlIHdyaXRlWFhYUmlkIHJvdXRpbmVzIHdlIGNvcHkgdGhlIHJpZHMgc28gdGhhdCB3ZSBkb24ndCBzY3Jld3VwCisgKiB0aGUgb3JpZ2luYWxzIHdoZW4gd2UgZW5kaWFuIHRoZW0uLi4gKi8KK3N0YXRpYyBpbnQgd3JpdGVXZXBLZXlSaWQoc3RydWN0IGFpcm9faW5mbyphaSwgV2VwS2V5UmlkICpwd2tyLCBpbnQgcGVybSwgaW50IGxvY2spIHsKKwlpbnQgcmM7CisJV2VwS2V5UmlkIHdrciA9ICpwd2tyOworCisJd2tyLmxlbiA9IGNwdV90b19sZTE2KHdrci5sZW4pOworCXdrci5raW5kZXggPSBjcHVfdG9fbGUxNih3a3Iua2luZGV4KTsKKwl3a3Iua2xlbiA9IGNwdV90b19sZTE2KHdrci5rbGVuKTsKKwlyYyA9IFBDNDUwMF93cml0ZXJpZChhaSwgUklEX1dFUF9URU1QLCAmd2tyLCBzaXplb2Yod2tyKSwgbG9jayk7CisJaWYgKHJjIT1TVUNDRVNTKSBwcmludGsoS0VSTl9FUlIgImFpcm86ICBXRVBfVEVNUCBzZXQgJXhcbiIsIHJjKTsKKwlpZiAocGVybSkgeworCQlyYyA9IFBDNDUwMF93cml0ZXJpZChhaSwgUklEX1dFUF9QRVJNLCAmd2tyLCBzaXplb2Yod2tyKSwgbG9jayk7CisJCWlmIChyYyE9U1VDQ0VTUykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiAgV0VQX1BFUk0gc2V0ICV4XG4iLCByYyk7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHJlYWRTc2lkUmlkKHN0cnVjdCBhaXJvX2luZm8qYWksIFNzaWRSaWQgKnNzaWRyKSB7CisJaW50IGk7CisJaW50IHJjID0gUEM0NTAwX3JlYWRyaWQoYWksIFJJRF9TU0lELCBzc2lkciwgc2l6ZW9mKCpzc2lkciksIDEpOworCisJc3NpZHItPmxlbiA9IGxlMTZfdG9fY3B1KHNzaWRyLT5sZW4pOworCWZvcihpID0gMDsgaSA8IDM7IGkrKykgeworCQlzc2lkci0+c3NpZHNbaV0ubGVuID0gbGUxNl90b19jcHUoc3NpZHItPnNzaWRzW2ldLmxlbik7CisJfQorCXJldHVybiByYzsKK30KK3N0YXRpYyBpbnQgd3JpdGVTc2lkUmlkKHN0cnVjdCBhaXJvX2luZm8qYWksIFNzaWRSaWQgKnBzc2lkciwgaW50IGxvY2spIHsKKwlpbnQgcmM7CisJaW50IGk7CisJU3NpZFJpZCBzc2lkciA9ICpwc3NpZHI7CisKKwlzc2lkci5sZW4gPSBjcHVfdG9fbGUxNihzc2lkci5sZW4pOworCWZvcihpID0gMDsgaSA8IDM7IGkrKykgeworCQlzc2lkci5zc2lkc1tpXS5sZW4gPSBjcHVfdG9fbGUxNihzc2lkci5zc2lkc1tpXS5sZW4pOworCX0KKwlyYyA9IFBDNDUwMF93cml0ZXJpZChhaSwgUklEX1NTSUQsICZzc2lkciwgc2l6ZW9mKHNzaWRyKSwgbG9jayk7CisJcmV0dXJuIHJjOworfQorc3RhdGljIGludCByZWFkQ29uZmlnUmlkKHN0cnVjdCBhaXJvX2luZm8qYWksIGludCBsb2NrKSB7CisJaW50IHJjOworCXUxNiAqczsKKwlDb25maWdSaWQgY2ZnOworCisJaWYgKGFpLT5jb25maWcubGVuKQorCQlyZXR1cm4gU1VDQ0VTUzsKKworCXJjID0gUEM0NTAwX3JlYWRyaWQoYWksIFJJRF9BQ1RVQUxDT05GSUcsICZjZmcsIHNpemVvZihjZmcpLCBsb2NrKTsKKwlpZiAocmMgIT0gU1VDQ0VTUykKKwkJcmV0dXJuIHJjOworCisJZm9yKHMgPSAmY2ZnLmxlbjsgcyA8PSAmY2ZnLnJ0c1RocmVzOyBzKyspICpzID0gbGUxNl90b19jcHUoKnMpOworCisJZm9yKHMgPSAmY2ZnLnNob3J0UmV0cnlMaW1pdDsgcyA8PSAmY2ZnLnJhZGlvVHlwZTsgcysrKQorCQkqcyA9IGxlMTZfdG9fY3B1KCpzKTsKKworCWZvcihzID0gJmNmZy50eFBvd2VyOyBzIDw9ICZjZmcucmFkaW9TcGVjaWZpYzsgcysrKQorCQkqcyA9IGxlMTZfdG9fY3B1KCpzKTsKKworCWZvcihzID0gJmNmZy5hcmxUaHJlc2hvbGQ7IHMgPD0gJmNmZy5fcmVzZXJ2ZWQ0WzBdOyBzKyspCisJCSpzID0gY3B1X3RvX2xlMTYoKnMpOworCisJZm9yKHMgPSAmY2ZnLmF1dG9XYWtlOyBzIDw9ICZjZmcuYXV0b1dha2U7IHMrKykKKwkJKnMgPSBjcHVfdG9fbGUxNigqcyk7CisKKwlhaS0+Y29uZmlnID0gY2ZnOworCXJldHVybiBTVUNDRVNTOworfQorc3RhdGljIGlubGluZSB2b2lkIGNoZWNrVGhyb3R0bGUoc3RydWN0IGFpcm9faW5mbyAqYWkpIHsKKwlpbnQgaTsKKy8qIE9sZCBoYXJkd2FyZSBoYWQgYSBsaW1pdCBvbiBlbmNyeXB0aW9uIHNwZWVkICovCisJaWYgKGFpLT5jb25maWcuYXV0aFR5cGUgIT0gQVVUSF9PUEVOICYmIG1heGVuY3J5cHQpIHsKKwkJZm9yKGk9MDsgaTw4OyBpKyspIHsKKwkJCWlmIChhaS0+Y29uZmlnLnJhdGVzW2ldID4gbWF4ZW5jcnlwdCkgeworCQkJCWFpLT5jb25maWcucmF0ZXNbaV0gPSAwOworCQkJfQorCQl9CisJfQorfQorc3RhdGljIGludCB3cml0ZUNvbmZpZ1JpZChzdHJ1Y3QgYWlyb19pbmZvKmFpLCBpbnQgbG9jaykgeworCXUxNiAqczsKKwlDb25maWdSaWQgY2ZncjsKKworCWlmICghdGVzdF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKSkKKwkJcmV0dXJuIFNVQ0NFU1M7CisKKwljbGVhcl9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwljbGVhcl9iaXQgKEZMQUdfUkVTRVQsICZhaS0+ZmxhZ3MpOworCWNoZWNrVGhyb3R0bGUoYWkpOworCWNmZ3IgPSBhaS0+Y29uZmlnOworCisJaWYgKChjZmdyLm9wbW9kZSAmIDB4RkYpID09IE1PREVfU1RBX0lCU1MpCisJCXNldF9iaXQoRkxBR19BREhPQywgJmFpLT5mbGFncyk7CisJZWxzZQorCQljbGVhcl9iaXQoRkxBR19BREhPQywgJmFpLT5mbGFncyk7CisKKwlmb3IocyA9ICZjZmdyLmxlbjsgcyA8PSAmY2Znci5ydHNUaHJlczsgcysrKSAqcyA9IGNwdV90b19sZTE2KCpzKTsKKworCWZvcihzID0gJmNmZ3Iuc2hvcnRSZXRyeUxpbWl0OyBzIDw9ICZjZmdyLnJhZGlvVHlwZTsgcysrKQorCQkqcyA9IGNwdV90b19sZTE2KCpzKTsKKworCWZvcihzID0gJmNmZ3IudHhQb3dlcjsgcyA8PSAmY2Znci5yYWRpb1NwZWNpZmljOyBzKyspCisJCSpzID0gY3B1X3RvX2xlMTYoKnMpOworCisJZm9yKHMgPSAmY2Znci5hcmxUaHJlc2hvbGQ7IHMgPD0gJmNmZ3IuX3Jlc2VydmVkNFswXTsgcysrKQorCQkqcyA9IGNwdV90b19sZTE2KCpzKTsKKworCWZvcihzID0gJmNmZ3IuYXV0b1dha2U7IHMgPD0gJmNmZ3IuYXV0b1dha2U7IHMrKykKKwkJKnMgPSBjcHVfdG9fbGUxNigqcyk7CisKKwlyZXR1cm4gUEM0NTAwX3dyaXRlcmlkKCBhaSwgUklEX0NPTkZJRywgJmNmZ3IsIHNpemVvZihjZmdyKSwgbG9jayk7Cit9CitzdGF0aWMgaW50IHJlYWRTdGF0dXNSaWQoc3RydWN0IGFpcm9faW5mbyphaSwgU3RhdHVzUmlkICpzdGF0ciwgaW50IGxvY2spIHsKKwlpbnQgcmMgPSBQQzQ1MDBfcmVhZHJpZChhaSwgUklEX1NUQVRVUywgc3RhdHIsIHNpemVvZigqc3RhdHIpLCBsb2NrKTsKKwl1MTYgKnM7CisKKwlzdGF0ci0+bGVuID0gbGUxNl90b19jcHUoc3RhdHItPmxlbik7CisJZm9yKHMgPSAmc3RhdHItPm1vZGU7IHMgPD0gJnN0YXRyLT5TU0lEbGVuOyBzKyspICpzID0gbGUxNl90b19jcHUoKnMpOworCisJZm9yKHMgPSAmc3RhdHItPmJlYWNvblBlcmlvZDsgcyA8PSAmc3RhdHItPnNob3J0UHJlYW1ibGU7IHMrKykKKwkJKnMgPSBsZTE2X3RvX2NwdSgqcyk7CisJc3RhdHItPmxvYWQgPSBsZTE2X3RvX2NwdShzdGF0ci0+bG9hZCk7CisJc3RhdHItPmFzc29jU3RhdHVzID0gbGUxNl90b19jcHUoc3RhdHItPmFzc29jU3RhdHVzKTsKKwlyZXR1cm4gcmM7Cit9CitzdGF0aWMgaW50IHJlYWRBUExpc3RSaWQoc3RydWN0IGFpcm9faW5mbyphaSwgQVBMaXN0UmlkICphcGxyKSB7CisJaW50IHJjID0gIFBDNDUwMF9yZWFkcmlkKGFpLCBSSURfQVBMSVNULCBhcGxyLCBzaXplb2YoKmFwbHIpLCAxKTsKKwlhcGxyLT5sZW4gPSBsZTE2X3RvX2NwdShhcGxyLT5sZW4pOworCXJldHVybiByYzsKK30KK3N0YXRpYyBpbnQgd3JpdGVBUExpc3RSaWQoc3RydWN0IGFpcm9faW5mbyphaSwgQVBMaXN0UmlkICphcGxyLCBpbnQgbG9jaykgeworCWludCByYzsKKwlhcGxyLT5sZW4gPSBjcHVfdG9fbGUxNihhcGxyLT5sZW4pOworCXJjID0gUEM0NTAwX3dyaXRlcmlkKGFpLCBSSURfQVBMSVNULCBhcGxyLCBzaXplb2YoKmFwbHIpLCBsb2NrKTsKKwlyZXR1cm4gcmM7Cit9CitzdGF0aWMgaW50IHJlYWRDYXBhYmlsaXR5UmlkKHN0cnVjdCBhaXJvX2luZm8qYWksIENhcGFiaWxpdHlSaWQgKmNhcHIsIGludCBsb2NrKSB7CisJaW50IHJjID0gUEM0NTAwX3JlYWRyaWQoYWksIFJJRF9DQVBBQklMSVRJRVMsIGNhcHIsIHNpemVvZigqY2FwciksIGxvY2spOworCXUxNiAqczsKKworCWNhcHItPmxlbiA9IGxlMTZfdG9fY3B1KGNhcHItPmxlbik7CisJY2Fwci0+cHJvZE51bSA9IGxlMTZfdG9fY3B1KGNhcHItPnByb2ROdW0pOworCWNhcHItPnJhZGlvVHlwZSA9IGxlMTZfdG9fY3B1KGNhcHItPnJhZGlvVHlwZSk7CisJY2Fwci0+Y291bnRyeSA9IGxlMTZfdG9fY3B1KGNhcHItPmNvdW50cnkpOworCWZvcihzID0gJmNhcHItPnR4UG93ZXJMZXZlbHNbMF07IHMgPD0gJmNhcHItPnJlcXVpcmVkSGFyZDsgcysrKQorCQkqcyA9IGxlMTZfdG9fY3B1KCpzKTsKKwlyZXR1cm4gcmM7Cit9CitzdGF0aWMgaW50IHJlYWRTdGF0c1JpZChzdHJ1Y3QgYWlyb19pbmZvKmFpLCBTdGF0c1JpZCAqc3IsIGludCByaWQsIGludCBsb2NrKSB7CisJaW50IHJjID0gUEM0NTAwX3JlYWRyaWQoYWksIHJpZCwgc3IsIHNpemVvZigqc3IpLCBsb2NrKTsKKwl1MzIgKmk7CisKKwlzci0+bGVuID0gbGUxNl90b19jcHUoc3ItPmxlbik7CisJZm9yKGkgPSAmc3ItPnZhbHNbMF07IGkgPD0gJnNyLT52YWxzWzk5XTsgaSsrKSAqaSA9IGxlMzJfdG9fY3B1KCppKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYWlyb19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzdHJ1Y3QgYWlyb19pbmZvICppbmZvID0gZGV2LT5wcml2OworCVJlc3AgcnNwOworCisJaWYgKHRlc3RfYml0KEZMQUdfRkxBU0hJTkcsICZpbmZvLT5mbGFncykpCisJCXJldHVybiAtRUlPOworCisJLyogTWFrZSBzdXJlIHRoZSBjYXJkIGlzIGNvbmZpZ3VyZWQuCisJICogV2lyZWxlc3MgRXh0ZW5zaW9ucyBtYXkgcG9zdHBvbmUgY29uZmlnIGNoYW5nZXMgdW50aWwgdGhlIGNhcmQKKwkgKiBpcyBvcGVuICh0byBwaXBlbGluZSBjaGFuZ2VzIGFuZCBzcGVlZC11cCBjYXJkIHNldHVwKS4gSWYKKwkgKiB0aG9zZSBjaGFuZ2VzIGFyZSBub3QgeWV0IGNvbW1pdGVkLCBkbyBpdCBub3cgLSBKZWFuIElJICovCisJaWYgKHRlc3RfYml0IChGTEFHX0NPTU1JVCwgJmluZm8tPmZsYWdzKSkgeworCQlkaXNhYmxlX01BQyhpbmZvLCAxKTsKKwkJd3JpdGVDb25maWdSaWQoaW5mbywgMSk7CisJfQorCisJaWYgKGluZm8tPndpZmlkZXYgIT0gZGV2KSB7CisJCS8qIFBvd2VyIG9uIHRoZSBNQUMgY29udHJvbGxlciAod2hpY2ggbWF5IGhhdmUgYmVlbiBkaXNhYmxlZCkgKi8KKwkJY2xlYXJfYml0KEZMQUdfUkFESU9fRE9XTiwgJmluZm8tPmZsYWdzKTsKKwkJZW5hYmxlX2ludGVycnVwdHMoaW5mbyk7CisJfQorCWVuYWJsZV9NQUMoaW5mbywgJnJzcCwgMSk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1waV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlpbnQgbnBhY2tzLCBwZW5kaW5nOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisKKwlpZiAoIXNrYikgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm86ICVzOiBza2I9PU5VTExcbiIsX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIDA7CisJfQorCW5wYWNrcyA9IHNrYl9xdWV1ZV9sZW4gKCZhaS0+dHhxKTsKKworCWlmIChucGFja3MgPj0gTUFYVFhRIC0gMSkgeworCQluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCQlpZiAobnBhY2tzID4gTUFYVFhRKSB7CisJCQlhaS0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCXJldHVybiAxOworCQl9CisJCXNrYl9xdWV1ZV90YWlsICgmYWktPnR4cSwgc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFpLT5hdXhfbG9jaywgZmxhZ3MpOworCXNrYl9xdWV1ZV90YWlsICgmYWktPnR4cSwgc2tiKTsKKwlwZW5kaW5nID0gdGVzdF9iaXQoRkxBR19QRU5ESU5HX1hNSVQsICZhaS0+ZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFpLT5hdXhfbG9jayxmbGFncyk7CisJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKworCWlmIChwZW5kaW5nID09IDApIHsKKwkJc2V0X2JpdChGTEFHX1BFTkRJTkdfWE1JVCwgJmFpLT5mbGFncyk7CisJCW1waV9zZW5kX3BhY2tldCAoZGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBAbXBpX3NlbmRfcGFja2V0CisgKgorICogQXR0ZW1wdCB0byB0cmFuc21pdCBhIHBhY2tldC4gQ2FuIGJlIGNhbGxlZCBmcm9tIGludGVycnVwdAorICogb3IgdHJhbnNtaXQgLiByZXR1cm4gbnVtYmVyIG9mIHBhY2tldHMgd2UgdHJpZWQgdG8gc2VuZAorICovCisKK3N0YXRpYyBpbnQgbXBpX3NlbmRfcGFja2V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyOworCXMxNiBsZW4sICpwYXlsb2FkTGVuOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCXU4ICpzZW5kYnVmOworCisJLyogZ2V0IGEgcGFja2V0IHRvIHNlbmQgKi8KKworCWlmICgoc2tiID0gc2tiX2RlcXVldWUoJmFpLT50eHEpKSA9PSAwKSB7CisJCXByaW50ayAoS0VSTl9FUlIKKwkJCSJhaXJvOiAlczogRGVxdWV1ZSdkIHplcm8gaW4gc2VuZF9wYWNrZXQoKVxuIiwKKwkJCV9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAwOworCX0KKworCS8qIGNoZWNrIG1pbiBsZW5ndGgqLworCWxlbiA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOworCWJ1ZmZlciA9IHNrYi0+ZGF0YTsKKworCWFpLT50eGZpZHNbMF0udHhfZGVzYy5vZmZzZXQgPSAwOworCWFpLT50eGZpZHNbMF0udHhfZGVzYy52YWxpZCA9IDE7CisJYWktPnR4Zmlkc1swXS50eF9kZXNjLmVvYyA9IDE7CisJYWktPnR4Zmlkc1swXS50eF9kZXNjLmxlbiA9bGVuK3NpemVvZihXaWZpSGRyKTsKKworLyoKKyAqIE1hZ2ljLCB0aGUgY2FyZHMgZmlybXdhcmUgbmVlZHMgYSBsZW5ndGggY291bnQgKDIgYnl0ZXMpIGluIHRoZSBob3N0IGJ1ZmZlcgorICogcmlnaHQgYWZ0ZXIgIFRYRklEX0hEUi5UaGUgVFhGSURfSERSIGNvbnRhaW5zIHRoZSBzdGF0dXMgc2hvcnQgc28gcGF5bG9hZGxlbgorICogaXMgaW1tZWRpYXRseSBhZnRlciBpdC4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB8VFhGSURIRFIrU1RBVFVTfFBBWUxPQURMRU58ODAyLjNIRFJ8UEFDS0VUREFUQXwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKwltZW1jcHkoKGNoYXIgKilhaS0+dHhmaWRzWzBdLnZpcnR1YWxfaG9zdF9hZGRyLAorCQkoY2hhciAqKSZ3aWZpY3RsaGRyODAyMywgc2l6ZW9mKHdpZmljdGxoZHI4MDIzKSk7CisKKwlwYXlsb2FkTGVuID0gKHMxNiAqKShhaS0+dHhmaWRzWzBdLnZpcnR1YWxfaG9zdF9hZGRyICsKKwkJc2l6ZW9mKHdpZmljdGxoZHI4MDIzKSk7CisJc2VuZGJ1ZiA9IGFpLT50eGZpZHNbMF0udmlydHVhbF9ob3N0X2FkZHIgKworCQlzaXplb2Yod2lmaWN0bGhkcjgwMjMpICsgMiA7CisKKwkvKgorCSAqIEZpcm13YXJlIGF1dG9tYXRpY2x5IHB1dHMgODAyIGhlYWRlciBvbiBzbworCSAqIHdlIGRvbid0IG5lZWQgdG8gYWNjb3VudCBmb3IgaXQgaW4gdGhlIGxlbmd0aAorCSAqLworI2lmZGVmIE1JQ1NVUFBPUlQKKwlpZiAodGVzdF9iaXQoRkxBR19NSUNfQ0FQQUJMRSwgJmFpLT5mbGFncykgJiYgYWktPm1pY3N0YXRzLmVuYWJsZWQgJiYKKwkJKG50b2hzKCgodTE2ICopYnVmZmVyKVs2XSkgIT0gMHg4ODhFKSkgeworCQlNSUNCdWZmZXIgcE1pYzsKKworCQlpZiAoZW5jYXBzdWxhdGUoYWksIChldGhlckhlYWQgKilidWZmZXIsICZwTWljLCBsZW4gLSBzaXplb2YoZXRoZXJIZWFkKSkgIT0gU1VDQ0VTUykKKwkJCXJldHVybiBFUlJPUjsKKworCQkqcGF5bG9hZExlbiA9IGNwdV90b19sZTE2KGxlbi1zaXplb2YoZXRoZXJIZWFkKStzaXplb2YocE1pYykpOworCQlhaS0+dHhmaWRzWzBdLnR4X2Rlc2MubGVuICs9IHNpemVvZihwTWljKTsKKwkJLyogY29weSBkYXRhIGludG8gYWlybyBkbWEgYnVmZmVyICovCisJCW1lbWNweSAoc2VuZGJ1ZiwgYnVmZmVyLCBzaXplb2YoZXRoZXJIZWFkKSk7CisJCWJ1ZmZlciArPSBzaXplb2YoZXRoZXJIZWFkKTsKKwkJc2VuZGJ1ZiArPSBzaXplb2YoZXRoZXJIZWFkKTsKKwkJbWVtY3B5IChzZW5kYnVmLCAmcE1pYywgc2l6ZW9mKHBNaWMpKTsKKwkJc2VuZGJ1ZiArPSBzaXplb2YocE1pYyk7CisJCW1lbWNweSAoc2VuZGJ1ZiwgYnVmZmVyLCBsZW4gLSBzaXplb2YoZXRoZXJIZWFkKSk7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCSpwYXlsb2FkTGVuID0gY3B1X3RvX2xlMTYobGVuIC0gc2l6ZW9mKGV0aGVySGVhZCkpOworCisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJCS8qIGNvcHkgZGF0YSBpbnRvIGFpcm8gZG1hIGJ1ZmZlciAqLworCQltZW1jcHkoc2VuZGJ1ZiwgYnVmZmVyLCBsZW4pOworCX0KKworCW1lbWNweV90b2lvKGFpLT50eGZpZHNbMF0uY2FyZF9yYW1fb2ZmLAorCQkmYWktPnR4Zmlkc1swXS50eF9kZXNjLCBzaXplb2YoVHhGaWQpKTsKKworCU9VVDQ1MDAoYWksIEVWQUNLLCA4KTsKKworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGdldF90eF9lcnJvcihzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTMyIGZpZCkKK3sKKwl1MTYgc3RhdHVzOworCisJaWYgKGZpZCA8IDApCisJCXN0YXR1cyA9ICgoV2lmaUN0bEhkciAqKWFpLT50eGZpZHNbMF0udmlydHVhbF9ob3N0X2FkZHIpLT5jdGxoZHIuc3RhdHVzOworCWVsc2UgeworCQlpZiAoYmFwX3NldHVwKGFpLCBhaS0+Zmlkc1tmaWRdICYgMHhmZmZmLCA0LCBCQVAwKSAhPSBTVUNDRVNTKQorCQkJcmV0dXJuOworCQliYXBfcmVhZChhaSwgJnN0YXR1cywgMiwgQkFQMCk7CisJfQorCWlmIChsZTE2X3RvX2NwdShzdGF0dXMpICYgMikgLyogVG9vIG1hbnkgcmV0cmllcyAqLworCQlhaS0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwlpZiAobGUxNl90b19jcHUoc3RhdHVzKSAmIDQpIC8qIFRyYW5zbWl0IGxpZmV0aW1lIGV4Y2VlZGVkICovCisJCWFpLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJaWYgKGxlMTZfdG9fY3B1KHN0YXR1cykgJiA4KSAvKiBBaWQgZmFpbCAqLworCQl7IH0KKwlpZiAobGUxNl90b19jcHUoc3RhdHVzKSAmIDB4MTApIC8qIE1BQyBkaXNhYmxlZCAqLworCQlhaS0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwlpZiAobGUxNl90b19jcHUoc3RhdHVzKSAmIDB4MjApIC8qIEFzc29jaWF0aW9uIGxvc3QgKi8KKwkJeyB9CisJLyogV2UgcHJvZHVjZSBhIFRYRFJPUCBldmVudCBvbmx5IGZvciByZXRyeSBvciBsaWZldGltZQorCSAqIGV4Y2VlZGVkLCBiZWNhdXNlIHRoYXQncyB0aGUgb25seSBzdGF0dXMgdGhhdCByZWFsbHkgbWVhbgorCSAqIHRoYXQgdGhpcyBwYXJ0aWN1bGFyIG5vZGUgd2VudCBhd2F5LgorCSAqIE90aGVyIGVycm9ycyBtZWFucyB0aGF0ICp3ZSogc2NyZXdlZCB1cC4gLSBKZWFuIElJICovCisJaWYgKChsZTE2X3RvX2NwdShzdGF0dXMpICYgMikgfHwKKwkgICAgIChsZTE2X3RvX2NwdShzdGF0dXMpICYgNCkpIHsKKwkJdW5pb24gaXdyZXFfZGF0YQl3cnF1OworCQljaGFyIGp1bmtbMHgxOF07CisKKwkJLyogRmFzdGVyIHRvIHNraXAgb3ZlciB1c2VsZXNzIGRhdGEgdGhhbiB0byBkbworCQkgKiBhbm90aGVyIGJhcF9zZXR1cCgpLiBXZSBhcmUgYXQgb2Zmc2V0IDB4NiBhbmQKKwkJICogbmVlZCB0byBnbyB0byAweDE4IGFuZCByZWFkIDYgYnl0ZXMgLSBKZWFuIElJICovCisJCWJhcF9yZWFkKGFpLCAodTE2ICopIGp1bmssIDB4MTgsIEJBUDApOworCisJCS8qIENvcHkgODAyLjExIGRlc3QgYWRkcmVzcy4KKwkJICogV2UgdXNlIHRoZSA4MDIuMTEgaGVhZGVyIGJlY2F1c2UgdGhlIGZyYW1lIG1heQorCQkgKiBub3QgYmUgODAyLjMgb3IgbWF5IGJlIG1hbmdsZWQuLi4KKwkJICogSW4gQWQtSG9jIG1vZGUsIGl0IHdpbGwgYmUgdGhlIG5vZGUgYWRkcmVzcy4KKwkJICogSW4gbWFuYWdlZCBtb2RlLCBpdCB3aWxsIGJlIG1vc3QgbGlrZWx5IHRoZSBBUCBhZGRyCisJCSAqIFVzZXIgc3BhY2Ugd2lsbCBmaWd1cmUgb3V0IGhvdyB0byBjb252ZXJ0IGl0IHRvCisJCSAqIHdoYXRldmVyIGl0IG5lZWRzIChJUCBhZGRyZXNzIG9yIGVsc2UpLgorCQkgKiAtIEplYW4gSUkgKi8KKwkJbWVtY3B5KHdycXUuYWRkci5zYV9kYXRhLCBqdW5rICsgMHgxMiwgRVRIX0FMRU4pOworCQl3cnF1LmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCisJCS8qIFNlbmQgZXZlbnQgdG8gdXNlciBzcGFjZSAqLworCQl3aXJlbGVzc19zZW5kX2V2ZW50KGFpLT5kZXYsIElXRVZUWERST1AsICZ3cnF1LCBOVUxMKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFpcm9fZW5kX3htaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXUxNiBzdGF0dXM7CisJaW50IGk7CisJc3RydWN0IGFpcm9faW5mbyAqcHJpdiA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJpdi0+eG1pdC5za2I7CisJaW50IGZpZCA9IHByaXYtPnhtaXQuZmlkOworCXUzMiAqZmlkcyA9IHByaXYtPmZpZHM7CisKKwljbGVhcl9iaXQoSk9CX1hNSVQsICZwcml2LT5mbGFncyk7CisJY2xlYXJfYml0KEZMQUdfUEVORElOR19YTUlULCAmcHJpdi0+ZmxhZ3MpOworCXN0YXR1cyA9IHRyYW5zbWl0XzgwMl8zX3BhY2tldCAocHJpdiwgZmlkc1tmaWRdLCBza2ItPmRhdGEpOworCXVwKCZwcml2LT5zZW0pOworCisJaSA9IDA7CisJaWYgKCBzdGF0dXMgPT0gU1VDQ0VTUyApIHsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCWZvciAoOyBpIDwgTUFYX0ZJRFMgLyAyICYmIChwcml2LT5maWRzW2ldICYgMHhmZmZmMDAwMCk7IGkrKyk7CisJfSBlbHNlIHsKKwkJcHJpdi0+Zmlkc1tmaWRdICY9IDB4ZmZmZjsKKwkJcHJpdi0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCX0KKwlpZiAoaSA8IE1BWF9GSURTIC8gMikKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCWRldl9rZnJlZV9za2Ioc2tiKTsKK30KKworc3RhdGljIGludCBhaXJvX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXMxNiBsZW47CisJaW50IGksIGo7CisJc3RydWN0IGFpcm9faW5mbyAqcHJpdiA9IGRldi0+cHJpdjsKKwl1MzIgKmZpZHMgPSBwcml2LT5maWRzOworCisJaWYgKCBza2IgPT0gTlVMTCApIHsKKwkJcHJpbnRrKCBLRVJOX0VSUiAiYWlybzogIHNrYiA9PSBOVUxMISEhXG4iICk7CisJCXJldHVybiAwOworCX0KKworCS8qIEZpbmQgYSB2YWNhbnQgRklEICovCisJZm9yKCBpID0gMDsgaSA8IE1BWF9GSURTIC8gMiAmJiAoZmlkc1tpXSAmIDB4ZmZmZjAwMDApOyBpKysgKTsKKwlmb3IoIGogPSBpICsgMTsgaiA8IE1BWF9GSURTIC8gMiAmJiAoZmlkc1tqXSAmIDB4ZmZmZjAwMDApOyBqKysgKTsKKworCWlmICggaiA+PSBNQVhfRklEUyAvIDIgKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQlpZiAoaSA9PSBNQVhfRklEUyAvIDIpIHsKKwkJCXByaXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwkvKiBjaGVjayBtaW4gbGVuZ3RoKi8KKwlsZW4gPSBFVEhfWkxFTiA8IHNrYi0+bGVuID8gc2tiLT5sZW4gOiBFVEhfWkxFTjsKKyAgICAgICAgLyogTWFyayBmaWQgYXMgdXNlZCAmIHNhdmUgbGVuZ3RoIGZvciBsYXRlciAqLworCWZpZHNbaV0gfD0gKGxlbiA8PCAxNik7CisJcHJpdi0+eG1pdC5za2IgPSBza2I7CisJcHJpdi0+eG1pdC5maWQgPSBpOworCWlmIChkb3duX3RyeWxvY2soJnByaXYtPnNlbSkgIT0gMCkgeworCQlzZXRfYml0KEZMQUdfUEVORElOR19YTUlULCAmcHJpdi0+ZmxhZ3MpOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXNldF9iaXQoSk9CX1hNSVQsICZwcml2LT5mbGFncyk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+dGhyX3dhaXQpOworCX0gZWxzZQorCQlhaXJvX2VuZF94bWl0KGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFpcm9fZW5kX3htaXQxMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJdTE2IHN0YXR1czsKKwlpbnQgaTsKKwlzdHJ1Y3QgYWlyb19pbmZvICpwcml2ID0gZGV2LT5wcml2OworCXN0cnVjdCBza19idWZmICpza2IgPSBwcml2LT54bWl0MTEuc2tiOworCWludCBmaWQgPSBwcml2LT54bWl0MTEuZmlkOworCXUzMiAqZmlkcyA9IHByaXYtPmZpZHM7CisKKwljbGVhcl9iaXQoSk9CX1hNSVQxMSwgJnByaXYtPmZsYWdzKTsKKwljbGVhcl9iaXQoRkxBR19QRU5ESU5HX1hNSVQxMSwgJnByaXYtPmZsYWdzKTsKKwlzdGF0dXMgPSB0cmFuc21pdF84MDJfMTFfcGFja2V0IChwcml2LCBmaWRzW2ZpZF0sIHNrYi0+ZGF0YSk7CisJdXAoJnByaXYtPnNlbSk7CisKKwlpID0gTUFYX0ZJRFMgLyAyOworCWlmICggc3RhdHVzID09IFNVQ0NFU1MgKSB7CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQlmb3IgKDsgaSA8IE1BWF9GSURTICYmIChwcml2LT5maWRzW2ldICYgMHhmZmZmMDAwMCk7IGkrKyk7CisJfSBlbHNlIHsKKwkJcHJpdi0+Zmlkc1tmaWRdICY9IDB4ZmZmZjsKKwkJcHJpdi0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCX0KKwlpZiAoaSA8IE1BWF9GSURTKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJZGV2X2tmcmVlX3NrYihza2IpOworfQorCitzdGF0aWMgaW50IGFpcm9fc3RhcnRfeG1pdDExKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzMTYgbGVuOworCWludCBpLCBqOworCXN0cnVjdCBhaXJvX2luZm8gKnByaXYgPSBkZXYtPnByaXY7CisJdTMyICpmaWRzID0gcHJpdi0+ZmlkczsKKworCWlmICh0ZXN0X2JpdChGTEFHX01QSSwgJnByaXYtPmZsYWdzKSkgeworCQkvKiBOb3QgaW1wbGVtZW50ZWQgeWV0IGZvciBNUEkzNTAgKi8KKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCQlyZXR1cm4gLUVORVRET1dOOworCX0KKworCWlmICggc2tiID09IE5VTEwgKSB7CisJCXByaW50ayggS0VSTl9FUlIgImFpcm86ICBza2IgPT0gTlVMTCEhIVxuIiApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBGaW5kIGEgdmFjYW50IEZJRCAqLworCWZvciggaSA9IE1BWF9GSURTIC8gMjsgaSA8IE1BWF9GSURTICYmIChmaWRzW2ldICYgMHhmZmZmMDAwMCk7IGkrKyApOworCWZvciggaiA9IGkgKyAxOyBqIDwgTUFYX0ZJRFMgJiYgKGZpZHNbal0gJiAweGZmZmYwMDAwKTsgaisrICk7CisKKwlpZiAoIGogPj0gTUFYX0ZJRFMgKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQlpZiAoaSA9PSBNQVhfRklEUykgeworCQkJcHJpdi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKwkJCXJldHVybiAxOworCQl9CisJfQorCS8qIGNoZWNrIG1pbiBsZW5ndGgqLworCWxlbiA9IEVUSF9aTEVOIDwgc2tiLT5sZW4gPyBza2ItPmxlbiA6IEVUSF9aTEVOOworICAgICAgICAvKiBNYXJrIGZpZCBhcyB1c2VkICYgc2F2ZSBsZW5ndGggZm9yIGxhdGVyICovCisJZmlkc1tpXSB8PSAobGVuIDw8IDE2KTsKKwlwcml2LT54bWl0MTEuc2tiID0gc2tiOworCXByaXYtPnhtaXQxMS5maWQgPSBpOworCWlmIChkb3duX3RyeWxvY2soJnByaXYtPnNlbSkgIT0gMCkgeworCQlzZXRfYml0KEZMQUdfUEVORElOR19YTUlUMTEsICZwcml2LT5mbGFncyk7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJc2V0X2JpdChKT0JfWE1JVDExLCAmcHJpdi0+ZmxhZ3MpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnByaXYtPnRocl93YWl0KTsKKwl9IGVsc2UKKwkJYWlyb19lbmRfeG1pdDExKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFpcm9fcmVhZF9zdGF0cyhzdHJ1Y3QgYWlyb19pbmZvICphaSkgeworCVN0YXRzUmlkIHN0YXRzX3JpZDsKKwl1MzIgKnZhbHMgPSBzdGF0c19yaWQudmFsczsKKworCWNsZWFyX2JpdChKT0JfU1RBVFMsICZhaS0+ZmxhZ3MpOworCWlmIChhaS0+cG93ZXIpIHsKKwkJdXAoJmFpLT5zZW0pOworCQlyZXR1cm47CisJfQorCXJlYWRTdGF0c1JpZChhaSwgJnN0YXRzX3JpZCwgUklEX1NUQVRTLCAwKTsKKwl1cCgmYWktPnNlbSk7CisKKwlhaS0+c3RhdHMucnhfcGFja2V0cyA9IHZhbHNbNDNdICsgdmFsc1s0NF0gKyB2YWxzWzQ1XTsKKwlhaS0+c3RhdHMudHhfcGFja2V0cyA9IHZhbHNbMzldICsgdmFsc1s0MF0gKyB2YWxzWzQxXTsKKwlhaS0+c3RhdHMucnhfYnl0ZXMgPSB2YWxzWzkyXTsKKwlhaS0+c3RhdHMudHhfYnl0ZXMgPSB2YWxzWzkxXTsKKwlhaS0+c3RhdHMucnhfZXJyb3JzID0gdmFsc1swXSArIHZhbHNbMl0gKyB2YWxzWzNdICsgdmFsc1s0XTsKKwlhaS0+c3RhdHMudHhfZXJyb3JzID0gdmFsc1s0Ml0gKyBhaS0+c3RhdHMudHhfZmlmb19lcnJvcnM7CisJYWktPnN0YXRzLm11bHRpY2FzdCA9IHZhbHNbNDNdOworCWFpLT5zdGF0cy5jb2xsaXNpb25zID0gdmFsc1s4OV07CisKKwkvKiBkZXRhaWxlZCByeF9lcnJvcnM6ICovCisJYWktPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMgPSB2YWxzWzNdOworCWFpLT5zdGF0cy5yeF9jcmNfZXJyb3JzID0gdmFsc1s0XTsKKwlhaS0+c3RhdHMucnhfZnJhbWVfZXJyb3JzID0gdmFsc1syXTsKKwlhaS0+c3RhdHMucnhfZmlmb19lcnJvcnMgPSB2YWxzWzBdOworfQorCitzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYWlyb19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9ICBkZXYtPnByaXY7CisKKwlpZiAoIXRlc3RfYml0KEpPQl9TVEFUUywgJmxvY2FsLT5mbGFncykpIHsKKwkJLyogR2V0IHN0YXRzIG91dCBvZiB0aGUgY2FyZCBpZiBhdmFpbGFibGUgKi8KKwkJaWYgKGRvd25fdHJ5bG9jaygmbG9jYWwtPnNlbSkgIT0gMCkgeworCQkJc2V0X2JpdChKT0JfU1RBVFMsICZsb2NhbC0+ZmxhZ3MpOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZsb2NhbC0+dGhyX3dhaXQpOworCQl9IGVsc2UKKwkJCWFpcm9fcmVhZF9zdGF0cyhsb2NhbCk7CisJfQorCisJcmV0dXJuICZsb2NhbC0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIGFpcm9fc2V0X3Byb21pc2Moc3RydWN0IGFpcm9faW5mbyAqYWkpIHsKKwlDbWQgY21kOworCVJlc3AgcnNwOworCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwljbWQuY21kPUNNRF9TRVRNT0RFOworCWNsZWFyX2JpdChKT0JfUFJPTUlTQywgJmFpLT5mbGFncyk7CisJY21kLnBhcm0wPShhaS0+ZmxhZ3MmSUZGX1BST01JU0MpID8gUFJPTUlTQyA6IE5PUFJPTUlTQzsKKwlpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApOworCXVwKCZhaS0+c2VtKTsKK30KKworc3RhdGljIHZvaWQgYWlyb19zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCisJaWYgKChkZXYtPmZsYWdzIF4gYWktPmZsYWdzKSAmIElGRl9QUk9NSVNDKSB7CisJCWNoYW5nZV9iaXQoRkxBR19QUk9NSVNDLCAmYWktPmZsYWdzKTsKKwkJaWYgKGRvd25fdHJ5bG9jaygmYWktPnNlbSkgIT0gMCkgeworCQkJc2V0X2JpdChKT0JfUFJPTUlTQywgJmFpLT5mbGFncyk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFpLT50aHJfd2FpdCk7CisJCX0gZWxzZQorCQkJYWlyb19zZXRfcHJvbWlzYyhhaSk7CisJfQorCisJaWYgKChkZXYtPmZsYWdzJklGRl9BTExNVUxUSSl8fGRldi0+bWNfY291bnQ+MCkgeworCQkvKiBUdXJuIG9uIG11bHRpY2FzdC4gIChTaG91bGQgYmUgYWxyZWFkeSBzZXR1cC4uLikgKi8KKwl9Cit9CisKK3N0YXRpYyBpbnQgYWlyb19zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworCVJlc3AgcnNwOworCisJcmVhZENvbmZpZ1JpZChhaSwgMSk7CisJbWVtY3B5IChhaS0+Y29uZmlnLm1hY0FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwlkaXNhYmxlX01BQyhhaSwgMSk7CisJd3JpdGVDb25maWdSaWQgKGFpLCAxKTsKKwllbmFibGVfTUFDKGFpLCAmcnNwLCAxKTsKKwltZW1jcHkgKGFpLT5kZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKKwlpZiAoYWktPndpZmlkZXYpCisJCW1lbWNweSAoYWktPndpZmlkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhaXJvX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJaWYgKChuZXdfbXR1IDwgNjgpIHx8IChuZXdfbXR1ID4gMjQwMCkpCisJCXJldHVybiAtRUlOVkFMOworCWRldi0+bXR1ID0gbmV3X210dTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFpcm9fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJaWYgKGFpLT53aWZpZGV2ICE9IGRldikgeworI2lmZGVmIFBPV0VSX09OX0RPV04KKwkJLyogU2h1dCBwb3dlciB0byB0aGUgY2FyZC4gVGhlIGlkZWEgaXMgdGhhdCB0aGUgdXNlciBjYW4gc2F2ZQorCQkgKiBwb3dlciB3aGVuIGhlIGRvZXNuJ3QgbmVlZCB0aGUgY2FyZCB3aXRoICJpZmNvbmZpZyBkb3duIi4KKwkJICogVGhhdCdzIHRoZSBtZXRob2QgdGhhdCBpcyBtb3N0IGZyaWVuZGx5IHRvd2FyZHMgdGhlIG5ldHdvcmsKKwkJICogc3RhY2sgKGkuZS4gdGhlIG5ldHdvcmsgc3RhY2sgd29uJ3QgdHJ5IHRvIGJyb2FkY2FzdAorCQkgKiBhbnl0aGluZyBvbiB0aGUgaW50ZXJmYWNlIGFuZCByb3V0ZXMgYXJlIGdvbmUuIEplYW4gSUkgKi8KKwkJc2V0X2JpdChGTEFHX1JBRElPX0RPV04sICZhaS0+ZmxhZ3MpOworCQlkaXNhYmxlX01BQyhhaSwgMSk7CisjZW5kaWYKKwkJZGlzYWJsZV9pbnRlcnJ1cHRzKCBhaSApOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVsX2Fpcm9fZGV2KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CisKK3ZvaWQgc3RvcF9haXJvX2NhcmQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBmcmVlcmVzICkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKworCXNldF9iaXQoRkxBR19SQURJT19ET1dOLCAmYWktPmZsYWdzKTsKKwlkaXNhYmxlX01BQyhhaSwgMSk7CisJZGlzYWJsZV9pbnRlcnJ1cHRzKGFpKTsKKwlmcmVlX2lycSggZGV2LT5pcnEsIGRldiApOworCXRha2Vkb3duX3Byb2NfZW50cnkoIGRldiwgYWkgKTsKKwlpZiAodGVzdF9iaXQoRkxBR19SRUdJU1RFUkVELCAmYWktPmZsYWdzKSkgeworCQl1bnJlZ2lzdGVyX25ldGRldiggZGV2ICk7CisJCWlmIChhaS0+d2lmaWRldikgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoYWktPndpZmlkZXYpOworCQkJZnJlZV9uZXRkZXYoYWktPndpZmlkZXYpOworCQkJYWktPndpZmlkZXYgPSBOVUxMOworCQl9CisJCWNsZWFyX2JpdChGTEFHX1JFR0lTVEVSRUQsICZhaS0+ZmxhZ3MpOworCX0KKwlzZXRfYml0KEpPQl9ESUUsICZhaS0+ZmxhZ3MpOworCWtpbGxfcHJvYyhhaS0+dGhyX3BpZCwgU0lHVEVSTSwgMSk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmYWktPnRocl9leGl0ZWQpOworCisJLyoKKwkgKiBDbGVhbiBvdXQgdHggcXVldWUKKwkgKi8KKwlpZiAodGVzdF9iaXQoRkxBR19NUEksICZhaS0+ZmxhZ3MpICYmIHNrYl9xdWV1ZV9sZW4gKCZhaS0+dHhxKSA+IDApIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJCWZvciAoOyhza2IgPSBza2JfZGVxdWV1ZSgmYWktPnR4cSkpOykKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwl9CisKKwlpZiAoYWktPmZsYXNoKQorCQlrZnJlZShhaS0+Zmxhc2gpOworCWlmIChhaS0+cnNzaSkKKwkJa2ZyZWUoYWktPnJzc2kpOworCWlmIChhaS0+QVBMaXN0KQorCQlrZnJlZShhaS0+QVBMaXN0KTsKKwlpZiAoYWktPlNTSUQpCisJCWtmcmVlKGFpLT5TU0lEKTsKKwlpZiAoZnJlZXJlcykgeworCQkvKiBQQ01DSUEgZnJlZXMgdGhpcyBzdHVmZiwgc28gb25seSBmb3IgUENJIGFuZCBJU0EgKi8KKwkgICAgICAgIHJlbGVhc2VfcmVnaW9uKCBkZXYtPmJhc2VfYWRkciwgNjQgKTsKKwkJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCAmYWktPmZsYWdzKSkgeworCQkJaWYgKGFpLT5wY2kpCisJCQkJbXBpX3VubWFwX2NhcmQoYWktPnBjaSk7CisJCQlpZiAoYWktPnBjaW1lbSkKKwkJCQlpb3VubWFwKGFpLT5wY2ltZW0pOworCQkJaWYgKGFpLT5wY2lhdXgpCisJCQkJaW91bm1hcChhaS0+cGNpYXV4KTsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWktPnBjaSwgUENJX1NIQVJFRF9MRU4sCisJCQkJYWktPnNoYXJlZCwgYWktPnNoYXJlZF9kbWEpOworCQl9CisgICAgICAgIH0KKyNpZmRlZiBNSUNTVVBQT1JUCisJaWYgKGFpLT50Zm0pCisJCWNyeXB0b19mcmVlX3RmbShhaS0+dGZtKTsKKyNlbmRpZgorCWRlbF9haXJvX2RldiggZGV2ICk7CisJZnJlZV9uZXRkZXYoIGRldiApOworfQorCitFWFBPUlRfU1lNQk9MKHN0b3BfYWlyb19jYXJkKTsKKworc3RhdGljIGludCBhZGRfYWlyb19kZXYoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKTsKKworaW50IHdsbF9oZWFkZXJfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgY2hhciAqaGFkZHIpCit7CisJbWVtY3B5KGhhZGRyLCBza2ItPm1hYy5yYXcgKyAxMCwgRVRIX0FMRU4pOworCXJldHVybiBFVEhfQUxFTjsKK30KKworc3RhdGljIHZvaWQgbXBpX3VubWFwX2NhcmQoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwl1bnNpZ25lZCBsb25nIG1lbV9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDEpOworCXVuc2lnbmVkIGxvbmcgbWVtX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpLCAxKTsKKwl1bnNpZ25lZCBsb25nIGF1eF9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDIpOworCXVuc2lnbmVkIGxvbmcgYXV4X2xlbiA9IEFVWE1FTVNJWkU7CisKKwlyZWxlYXNlX21lbV9yZWdpb24oYXV4X3N0YXJ0LCBhdXhfbGVuKTsKKwlyZWxlYXNlX21lbV9yZWdpb24obWVtX3N0YXJ0LCBtZW1fbGVuKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBUaGlzIHJvdXRpbmUgYXNzdW1lcyB0aGF0IGRlc2NyaXB0b3JzIGhhdmUgYmVlbiBzZXR1cCAuCisgKiAgUnVuIGF0IGluc21vZCB0aW1lIG9yIGFmdGVyIHJlc2V0ICB3aGVuIHRoZSBkZWNyaXB0b3JzCisgKiAgaGF2ZSBiZWVuIGluaXRpYWxpemVkIC4gUmV0dXJucyAwIGlmIGFsbCBpcyB3ZWxsIG56CisgKiAgb3RoZXJ3aXNlIC4gRG9lcyBub3QgYWxsb2NhdGUgbWVtb3J5IGJ1dCBzZXRzIHVwIGNhcmQKKyAqICB1c2luZyBwcmV2aW91c2x5IGFsbG9jYXRlZCBkZXNjcmlwdG9ycy4KKyAqLworc3RhdGljIGludCBtcGlfaW5pdF9kZXNjcmlwdG9ycyAoc3RydWN0IGFpcm9faW5mbyAqYWkpCit7CisJQ21kIGNtZDsKKwlSZXNwIHJzcDsKKwlpbnQgaTsKKwlpbnQgcmMgPSBTVUNDRVNTOworCisJLyogQWxsb2MgIGNhcmQgUlggZGVzY3JpcHRvcnMgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGFpLT5kZXYpOworCisJbWVtc2V0KCZyc3AsMCxzaXplb2YocnNwKSk7CisJbWVtc2V0KCZjbWQsMCxzaXplb2YoY21kKSk7CisKKwljbWQuY21kID0gQ01EX0FMTE9DQVRFQVVYOworCWNtZC5wYXJtMCA9IEZJRF9SWDsKKwljbWQucGFybTEgPSAoYWktPnJ4Zmlkc1swXS5jYXJkX3JhbV9vZmYgLSBhaS0+cGNpYXV4KTsKKwljbWQucGFybTIgPSBNUElfTUFYX0ZJRFM7CisJcmM9aXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKTsKKwlpZiAocmMgIT0gU1VDQ0VTUykgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm86ICBDb3VsZG4ndCBhbGxvY2F0ZSBSWCBGSURcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJZm9yIChpPTA7IGk8TVBJX01BWF9GSURTOyBpKyspIHsKKwkJbWVtY3B5X3RvaW8oYWktPnJ4Zmlkc1tpXS5jYXJkX3JhbV9vZmYsCisJCQkmYWktPnJ4Zmlkc1tpXS5yeF9kZXNjLCBzaXplb2YoUnhGaWQpKTsKKwl9CisKKwkvKiBBbGxvYyBjYXJkIFRYIGRlc2NyaXB0b3JzICovCisKKwltZW1zZXQoJnJzcCwwLHNpemVvZihyc3ApKTsKKwltZW1zZXQoJmNtZCwwLHNpemVvZihjbWQpKTsKKworCWNtZC5jbWQgPSBDTURfQUxMT0NBVEVBVVg7CisJY21kLnBhcm0wID0gRklEX1RYOworCWNtZC5wYXJtMSA9IChhaS0+dHhmaWRzWzBdLmNhcmRfcmFtX29mZiAtIGFpLT5wY2lhdXgpOworCWNtZC5wYXJtMiA9IE1QSV9NQVhfRklEUzsKKworCWZvciAoaT0wOyBpPE1QSV9NQVhfRklEUzsgaSsrKSB7CisJCWFpLT50eGZpZHNbaV0udHhfZGVzYy52YWxpZCA9IDE7CisJCW1lbWNweV90b2lvKGFpLT50eGZpZHNbaV0uY2FyZF9yYW1fb2ZmLAorCQkJJmFpLT50eGZpZHNbaV0udHhfZGVzYywgc2l6ZW9mKFR4RmlkKSk7CisJfQorCWFpLT50eGZpZHNbaS0xXS50eF9kZXNjLmVvYyA9IDE7IC8qIExhc3QgZGVzY3JpcHRvciBoYXMgRU9DIHNldCAqLworCisJcmM9aXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKTsKKwlpZiAocmMgIT0gU1VDQ0VTUykgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm86ICBDb3VsZG4ndCBhbGxvY2F0ZSBUWCBGSURcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogQWxsb2MgY2FyZCBSaWQgZGVzY3JpcHRvciAqLworCW1lbXNldCgmcnNwLDAsc2l6ZW9mKHJzcCkpOworCW1lbXNldCgmY21kLDAsc2l6ZW9mKGNtZCkpOworCisJY21kLmNtZCA9IENNRF9BTExPQ0FURUFVWDsKKwljbWQucGFybTAgPSBSSURfUlc7CisJY21kLnBhcm0xID0gKGFpLT5jb25maWdfZGVzYy5jYXJkX3JhbV9vZmYgLSBhaS0+cGNpYXV4KTsKKwljbWQucGFybTIgPSAxOyAvKiBNYWdpYyBudW1iZXIuLi4gKi8KKwlyYz1pc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApOworCWlmIChyYyAhPSBTVUNDRVNTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlybzogIENvdWxkbid0IGFsbG9jYXRlIFJJRFxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwltZW1jcHlfdG9pbyhhaS0+Y29uZmlnX2Rlc2MuY2FyZF9yYW1fb2ZmLAorCQkmYWktPmNvbmZpZ19kZXNjLnJpZF9kZXNjLCBzaXplb2YoUmlkKSk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBXZSBhcmUgc2V0dGluZyB1cCB0aHJlZSB0aGluZ3MgaGVyZToKKyAqIDEpIE1hcCBBVVggbWVtb3J5IGZvciBkZXNjcmlwdG9yczogUmlkLCBUeEZpZCwgb3IgUnhGaWQuCisgKiAyKSBNYXAgUENJIG1lbW9yeSBmb3IgaXNzdWVpbmcgY29tbWFuZHMuCisgKiAzKSBBbGxvY2F0ZSBtZW1vcnkgKHNoYXJlZCkgdG8gc2VuZCBhbmQgcmVjZWl2ZSBldGhlcm5ldCBmcmFtZXMuCisgKi8KK3N0YXRpYyBpbnQgbXBpX21hcF9jYXJkKHN0cnVjdCBhaXJvX2luZm8gKmFpLCBzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQkgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBsb25nIG1lbV9zdGFydCwgbWVtX2xlbiwgYXV4X3N0YXJ0LCBhdXhfbGVuOworCWludCByYyA9IC0xOworCWludCBpOworCXVuc2lnbmVkIGNoYXIgKmJ1c2FkZHJvZmYsKnZwYWNrb2ZmOworCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqcGNpYWRkcm9mZjsKKworCW1lbV9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDEpOworCW1lbV9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBjaSwgMSk7CisJYXV4X3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMik7CisJYXV4X2xlbiA9IEFVWE1FTVNJWkU7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihtZW1fc3RhcnQsIG1lbV9sZW4sIG5hbWUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlybzogQ291bGRuJ3QgZ2V0IHJlZ2lvbiAleFsleF0gZm9yICVzXG4iLAorCQkgICAgICAgKGludCltZW1fc3RhcnQsIChpbnQpbWVtX2xlbiwgbmFtZSk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihhdXhfc3RhcnQsIGF1eF9sZW4sIG5hbWUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlybzogQ291bGRuJ3QgZ2V0IHJlZ2lvbiAleFsleF0gZm9yICVzXG4iLAorCQkgICAgICAgKGludClhdXhfc3RhcnQsIChpbnQpYXV4X2xlbiwgbmFtZSk7CisJCWdvdG8gZnJlZV9yZWdpb24xOworCX0KKworCWFpLT5wY2ltZW0gPSBpb3JlbWFwKG1lbV9zdGFydCwgbWVtX2xlbik7CisJaWYgKCFhaS0+cGNpbWVtKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlybzogQ291bGRuJ3QgbWFwIHJlZ2lvbiAleFsleF0gZm9yICVzXG4iLAorCQkgICAgICAgKGludCltZW1fc3RhcnQsIChpbnQpbWVtX2xlbiwgbmFtZSk7CisJCWdvdG8gZnJlZV9yZWdpb24yOworCX0KKwlhaS0+cGNpYXV4ID0gaW9yZW1hcChhdXhfc3RhcnQsIGF1eF9sZW4pOworCWlmICghYWktPnBjaWF1eCkgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm86IENvdWxkbid0IG1hcCByZWdpb24gJXhbJXhdIGZvciAlc1xuIiwKKwkJICAgICAgIChpbnQpYXV4X3N0YXJ0LCAoaW50KWF1eF9sZW4sIG5hbWUpOworCQlnb3RvIGZyZWVfbWVtbWFwOworCX0KKworCS8qIFJlc2VydmUgUEtUU0laRSBmb3IgZWFjaCBmaWQgYW5kIDJLIGZvciB0aGUgUmlkcyAqLworCWFpLT5zaGFyZWQgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2ksIFBDSV9TSEFSRURfTEVOLCAmYWktPnNoYXJlZF9kbWEpOworCWlmICghYWktPnNoYXJlZCkgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm86IENvdWxkbid0IGFsbG9jX2NvbnNpc3RlbnQgJWRcbiIsCisJCSAgICAgICBQQ0lfU0hBUkVEX0xFTik7CisJCWdvdG8gZnJlZV9hdXhtYXA7CisJfQorCisJLyoKKwkgKiBTZXR1cCBkZXNjcmlwdG9yIFJYLCBUWCwgQ09ORklHCisJICovCisJYnVzYWRkcm9mZiA9ICh1bnNpZ25lZCBjaGFyICopYWktPnNoYXJlZF9kbWE7CisJcGNpYWRkcm9mZiA9IGFpLT5wY2lhdXggKyBBVVhfT0ZGU0VUOworCXZwYWNrb2ZmICAgPSBhaS0+c2hhcmVkOworCisJLyogUlggZGVzY3JpcHRvciBzZXR1cCAqLworCWZvcihpID0gMDsgaSA8IE1QSV9NQVhfRklEUzsgaSsrKSB7CisJCWFpLT5yeGZpZHNbaV0ucGVuZGluZyA9IDA7CisJCWFpLT5yeGZpZHNbaV0uY2FyZF9yYW1fb2ZmID0gcGNpYWRkcm9mZjsKKwkJYWktPnJ4Zmlkc1tpXS52aXJ0dWFsX2hvc3RfYWRkciA9IHZwYWNrb2ZmOworCQlhaS0+cnhmaWRzW2ldLnJ4X2Rlc2MuaG9zdF9hZGRyID0gKGRtYV9hZGRyX3QpIGJ1c2FkZHJvZmY7CisJCWFpLT5yeGZpZHNbaV0ucnhfZGVzYy52YWxpZCA9IDE7CisJCWFpLT5yeGZpZHNbaV0ucnhfZGVzYy5sZW4gPSBQS1RTSVpFOworCQlhaS0+cnhmaWRzW2ldLnJ4X2Rlc2MucmR5ID0gMDsKKworCQlwY2lhZGRyb2ZmICs9IHNpemVvZihSeEZpZCk7CisJCWJ1c2FkZHJvZmYgKz0gUEtUU0laRTsKKwkJdnBhY2tvZmYgICArPSBQS1RTSVpFOworCX0KKworCS8qIFRYIGRlc2NyaXB0b3Igc2V0dXAgKi8KKwlmb3IoaSA9IDA7IGkgPCBNUElfTUFYX0ZJRFM7IGkrKykgeworCQlhaS0+dHhmaWRzW2ldLmNhcmRfcmFtX29mZiA9IHBjaWFkZHJvZmY7CisJCWFpLT50eGZpZHNbaV0udmlydHVhbF9ob3N0X2FkZHIgPSB2cGFja29mZjsKKwkJYWktPnR4Zmlkc1tpXS50eF9kZXNjLnZhbGlkID0gMTsKKwkJYWktPnR4Zmlkc1tpXS50eF9kZXNjLmhvc3RfYWRkciA9IChkbWFfYWRkcl90KSBidXNhZGRyb2ZmOworCQltZW1jcHkoYWktPnR4Zmlkc1tpXS52aXJ0dWFsX2hvc3RfYWRkciwKKwkJCSZ3aWZpY3RsaGRyODAyMywgc2l6ZW9mKHdpZmljdGxoZHI4MDIzKSk7CisKKwkJcGNpYWRkcm9mZiArPSBzaXplb2YoVHhGaWQpOworCQlidXNhZGRyb2ZmICs9IFBLVFNJWkU7CisJCXZwYWNrb2ZmICAgKz0gUEtUU0laRTsKKwl9CisJYWktPnR4Zmlkc1tpLTFdLnR4X2Rlc2MuZW9jID0gMTsgLyogTGFzdCBkZXNjcmlwdG9yIGhhcyBFT0Mgc2V0ICovCisKKwkvKiBSaWQgZGVzY3JpcHRvciBzZXR1cCAqLworCWFpLT5jb25maWdfZGVzYy5jYXJkX3JhbV9vZmYgPSBwY2lhZGRyb2ZmOworCWFpLT5jb25maWdfZGVzYy52aXJ0dWFsX2hvc3RfYWRkciA9IHZwYWNrb2ZmOworCWFpLT5jb25maWdfZGVzYy5yaWRfZGVzYy5ob3N0X2FkZHIgPSAoZG1hX2FkZHJfdCkgYnVzYWRkcm9mZjsKKwlhaS0+cmlkYnVzID0gKGRtYV9hZGRyX3QpYnVzYWRkcm9mZjsKKwlhaS0+Y29uZmlnX2Rlc2MucmlkX2Rlc2MucmlkID0gMDsKKwlhaS0+Y29uZmlnX2Rlc2MucmlkX2Rlc2MubGVuID0gUklEU0laRTsKKwlhaS0+Y29uZmlnX2Rlc2MucmlkX2Rlc2MudmFsaWQgPSAxOworCXBjaWFkZHJvZmYgKz0gc2l6ZW9mKFJpZCk7CisJYnVzYWRkcm9mZiArPSBSSURTSVpFOworCXZwYWNrb2ZmICAgKz0gUklEU0laRTsKKworCS8qIFRlbGwgY2FyZCBhYm91dCBkZXNjcmlwdG9ycyAqLworCWlmIChtcGlfaW5pdF9kZXNjcmlwdG9ycyAoYWkpICE9IFNVQ0NFU1MpCisJCWdvdG8gZnJlZV9zaGFyZWQ7CisKKwlyZXR1cm4gMDsKKyBmcmVlX3NoYXJlZDoKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBjaSwgUENJX1NIQVJFRF9MRU4sIGFpLT5zaGFyZWQsIGFpLT5zaGFyZWRfZG1hKTsKKyBmcmVlX2F1eG1hcDoKKwlpb3VubWFwKGFpLT5wY2lhdXgpOworIGZyZWVfbWVtbWFwOgorCWlvdW5tYXAoYWktPnBjaW1lbSk7CisgZnJlZV9yZWdpb24yOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihhdXhfc3RhcnQsIGF1eF9sZW4pOworIGZyZWVfcmVnaW9uMToKKwlyZWxlYXNlX21lbV9yZWdpb24obWVtX3N0YXJ0LCBtZW1fbGVuKTsKKyBvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCB3aWZpX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGV2LT5oYXJkX2hlYWRlciAgICAgICAgPSBOVUxMOworCWRldi0+cmVidWlsZF9oZWFkZXIgICAgID0gTlVMTDsKKwlkZXYtPmhhcmRfaGVhZGVyX2NhY2hlICA9IE5VTEw7CisJZGV2LT5oZWFkZXJfY2FjaGVfdXBkYXRlPSBOVUxMOworCisJZGV2LT5oYXJkX2hlYWRlcl9wYXJzZSAgPSB3bGxfaGVhZGVyX3BhcnNlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJmFpcm9fc3RhcnRfeG1pdDExOworCWRldi0+Z2V0X3N0YXRzID0gJmFpcm9fZ2V0X3N0YXRzOworCWRldi0+c2V0X21hY19hZGRyZXNzID0gJmFpcm9fc2V0X21hY19hZGRyZXNzOworCWRldi0+ZG9faW9jdGwgPSAmYWlyb19pb2N0bDsKKyNpZmRlZiBXSVJFTEVTU19FWFQKKwlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJmFpcm9faGFuZGxlcl9kZWY7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUICovCisJZGV2LT5jaGFuZ2VfbXR1ID0gJmFpcm9fY2hhbmdlX210dTsKKwlkZXYtPm9wZW4gPSAmYWlyb19vcGVuOworCWRldi0+c3RvcCA9ICZhaXJvX2Nsb3NlOworCisJZGV2LT50eXBlICAgICAgICAgICAgICAgPSBBUlBIUkRfSUVFRTgwMjExOworCWRldi0+aGFyZF9oZWFkZXJfbGVuICAgID0gRVRIX0hMRU47CisJZGV2LT5tdHUgICAgICAgICAgICAgICAgPSAyMzEyOworCWRldi0+YWRkcl9sZW4gICAgICAgICAgID0gRVRIX0FMRU47CisJZGV2LT50eF9xdWV1ZV9sZW4gICAgICAgPSAxMDA7IAorCisJbWVtc2V0KGRldi0+YnJvYWRjYXN0LDB4RkYsIEVUSF9BTEVOKTsKKworCWRldi0+ZmxhZ3MgICAgICAgICAgICAgID0gSUZGX0JST0FEQ0FTVHxJRkZfTVVMVElDQVNUOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmluaXRfd2lmaWRldihzdHJ1Y3QgYWlyb19pbmZvICphaSwKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmV0aGRldikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19uZXRkZXYoMCwgIndpZmklZCIsIHdpZmlfc2V0dXApOworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsKKwlkZXYtPnByaXYgPSBldGhkZXYtPnByaXY7CisJZGV2LT5pcnEgPSBldGhkZXYtPmlycTsKKwlkZXYtPmJhc2VfYWRkciA9IGV0aGRldi0+YmFzZV9hZGRyOworI2lmZGVmIFdJUkVMRVNTX0VYVAorCWRldi0+d2lyZWxlc3NfZGF0YSA9IGV0aGRldi0+d2lyZWxlc3NfZGF0YTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgKi8KKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgZXRoZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycjwwKSB7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gZGV2OworfQorCitpbnQgcmVzZXRfY2FyZCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiAsIGludCBsb2NrKSB7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisKKwlpZiAobG9jayAmJiBkb3duX2ludGVycnVwdGlibGUoJmFpLT5zZW0pKQorCQlyZXR1cm4gLTE7CisJd2FpdGJ1c3kgKGFpKTsKKwlPVVQ0NTAwKGFpLENPTU1BTkQsQ01EX1NPRlRSRVNFVCk7CisJbXNsZWVwKDIwMCk7CisJd2FpdGJ1c3kgKGFpKTsKKwltc2xlZXAoMjAwKTsKKwlpZiAobG9jaykKKwkJdXAoJmFpLT5zZW0pOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqX2luaXRfYWlyb19jYXJkKCB1bnNpZ25lZCBzaG9ydCBpcnEsIGludCBwb3J0LAorCQkJCSAgICBpbnQgaXNfcGNtY2lhLCBzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlICpkbWRldiApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaTsKKwlpbnQgaSwgcmM7CisKKwkvKiBDcmVhdGUgdGhlIG5ldHdvcmsgZGV2aWNlIG9iamVjdC4gKi8KKyAgICAgICAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKCphaSkpOworICAgICAgICBpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm86ICBDb3VsZG4ndCBhbGxvY19ldGhlcmRldlxuIik7CisJCXJldHVybiBOVUxMOworICAgICAgICB9CisJaWYgKGRldl9hbGxvY19uYW1lKGRldiwgZGV2LT5uYW1lKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiAgQ291bGRuJ3QgZ2V0IG5hbWUhXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisJfQorCisJYWkgPSBkZXYtPnByaXY7CisJYWktPndpZmlkZXYgPSBOVUxMOworCWFpLT5mbGFncyA9IDA7CisJaWYgKHBjaSAmJiAocGNpLT5kZXZpY2UgPT0gMHg1MDAwIHx8IHBjaS0+ZGV2aWNlID09IDB4YTUwNCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImFpcm86IEZvdW5kIGFuIE1QSTM1MCBjYXJkXG4iKTsKKwkJc2V0X2JpdChGTEFHX01QSSwgJmFpLT5mbGFncyk7CisJfQorICAgICAgICBhaS0+ZGV2ID0gZGV2OworCXNwaW5fbG9ja19pbml0KCZhaS0+YXV4X2xvY2spOworCXNlbWFfaW5pdCgmYWktPnNlbSwgMSk7CisJYWktPmNvbmZpZy5sZW4gPSAwOworCWFpLT5wY2kgPSBwY2k7CisJaW5pdF93YWl0cXVldWVfaGVhZCAoJmFpLT50aHJfd2FpdCk7CisJaW5pdF9jb21wbGV0aW9uICgmYWktPnRocl9leGl0ZWQpOworCWFpLT50aHJfcGlkID0ga2VybmVsX3RocmVhZChhaXJvX3RocmVhZCwgZGV2LCBDTE9ORV9GUyB8IENMT05FX0ZJTEVTKTsKKwlpZiAoYWktPnRocl9waWQgPCAwKQorCQlnb3RvIGVycl9vdXRfZnJlZTsKKyNpZmRlZiBNSUNTVVBQT1JUCisJYWktPnRmbSA9IE5VTEw7CisjZW5kaWYKKwlyYyA9IGFkZF9haXJvX2RldiggZGV2ICk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfdGhyOworCisJLyogVGhlIEFpcm8tc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlpZiAodGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpIHsKKwkJc2tiX3F1ZXVlX2hlYWRfaW5pdCAoJmFpLT50eHEpOworCQlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZtcGlfc3RhcnRfeG1pdDsKKwl9IGVsc2UKKwkJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmYWlyb19zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gJmFpcm9fZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJmFpcm9fc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+c2V0X21hY19hZGRyZXNzID0gJmFpcm9fc2V0X21hY19hZGRyZXNzOworCWRldi0+ZG9faW9jdGwgPSAmYWlyb19pb2N0bDsKKyNpZmRlZiBXSVJFTEVTU19FWFQKKwlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJmFpcm9faGFuZGxlcl9kZWY7CisJYWktPndpcmVsZXNzX2RhdGEuc3B5X2RhdGEgPSAmYWktPnNweV9kYXRhOworCWRldi0+d2lyZWxlc3NfZGF0YSA9ICZhaS0+d2lyZWxlc3NfZGF0YTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgKi8KKwlkZXYtPmNoYW5nZV9tdHUgPSAmYWlyb19jaGFuZ2VfbXR1OworCWRldi0+b3BlbiA9ICZhaXJvX29wZW47CisJZGV2LT5zdG9wID0gJmFpcm9fY2xvc2U7CisJZGV2LT5pcnEgPSBpcnE7CisJZGV2LT5iYXNlX2FkZHIgPSBwb3J0OworCisJU0VUX05FVERFVl9ERVYoZGV2LCBkbWRldik7CisKKworCWlmICh0ZXN0X2JpdChGTEFHX01QSSwmYWktPmZsYWdzKSkKKwkJcmVzZXRfY2FyZCAoZGV2LCAxKTsKKworCXJjID0gcmVxdWVzdF9pcnEoIGRldi0+aXJxLCBhaXJvX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2ICk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlybzogcmVnaXN0ZXIgaW50ZXJydXB0ICVkIGZhaWxlZCwgcmMgJWRcbiIsIGlycSwgcmMgKTsKKwkJZ290byBlcnJfb3V0X3VubGluazsKKwl9CisJaWYgKCFpc19wY21jaWEpIHsKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIDY0LCBkZXYtPm5hbWUgKSkgeworCQkJcmMgPSAtRUJVU1k7CisJCQlwcmludGsoS0VSTl9FUlIgImFpcm86IENvdWxkbid0IHJlcXVlc3QgcmVnaW9uXG4iKTsKKwkJCWdvdG8gZXJyX291dF9pcnE7CisJCX0KKwl9CisKKwlpZiAodGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpIHsKKwkJaWYgKG1waV9tYXBfY2FyZChhaSwgcGNpLCBkZXYtPm5hbWUpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFpcm86IENvdWxkIG5vdCBtYXAgbWVtb3J5XG4iKTsKKwkJCWdvdG8gZXJyX291dF9yZXM7CisJCX0KKwl9CisKKwlpZiAocHJvYmUpIHsKKwkJaWYgKCBzZXR1cF9jYXJkKCBhaSwgZGV2LT5kZXZfYWRkciwgMSApICE9IFNVQ0NFU1MgKSB7CisJCQlwcmludGsoIEtFUk5fRVJSICJhaXJvOiBNQUMgY291bGQgbm90IGJlIGVuYWJsZWRcbiIgKTsKKwkJCXJjID0gLUVJTzsKKwkJCWdvdG8gZXJyX291dF9tYXA7CisJCX0KKwl9IGVsc2UgaWYgKCF0ZXN0X2JpdChGTEFHX01QSSwmYWktPmZsYWdzKSkgeworCQlhaS0+YmFwX3JlYWQgPSBmYXN0X2JhcF9yZWFkOworCQlzZXRfYml0KEZMQUdfRkxBU0hJTkcsICZhaS0+ZmxhZ3MpOworCX0KKworCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWlybzogQ291bGRuJ3QgcmVnaXN0ZXJfbmV0ZGV2XG4iKTsKKwkJZ290byBlcnJfb3V0X21hcDsKKwl9CisJYWktPndpZmlkZXYgPSBpbml0X3dpZmlkZXYoYWksIGRldik7CisKKwlzZXRfYml0KEZMQUdfUkVHSVNURVJFRCwmYWktPmZsYWdzKTsKKwlwcmludGsoIEtFUk5fSU5GTyAiYWlybzogTUFDIGVuYWJsZWQgJXMgJXg6JXg6JXg6JXg6JXg6JXhcbiIsCisJCWRldi0+bmFtZSwKKwkJZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKKwkJZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSApOworCisJLyogQWxsb2NhdGUgdGhlIHRyYW5zbWl0IGJ1ZmZlcnMgKi8KKwlpZiAocHJvYmUgJiYgIXRlc3RfYml0KEZMQUdfTVBJLCZhaS0+ZmxhZ3MpKQorCQlmb3IoIGkgPSAwOyBpIDwgTUFYX0ZJRFM7IGkrKyApCisJCQlhaS0+Zmlkc1tpXSA9IHRyYW5zbWl0X2FsbG9jYXRlKGFpLDIzMTIsaT49TUFYX0ZJRFMvMik7CisKKwlzZXR1cF9wcm9jX2VudHJ5KCBkZXYsIGRldi0+cHJpdiApOyAvKiBYWFggY2hlY2sgZm9yIGZhaWx1cmUgKi8KKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlyZXR1cm4gZGV2OworCitlcnJfb3V0X21hcDoKKwlpZiAodGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykgJiYgcGNpKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGNpLCBQQ0lfU0hBUkVEX0xFTiwgYWktPnNoYXJlZCwgYWktPnNoYXJlZF9kbWEpOworCQlpb3VubWFwKGFpLT5wY2lhdXgpOworCQlpb3VubWFwKGFpLT5wY2ltZW0pOworCQltcGlfdW5tYXBfY2FyZChhaS0+cGNpKTsKKwl9CitlcnJfb3V0X3JlczoKKwlpZiAoIWlzX3BjbWNpYSkKKwkgICAgICAgIHJlbGVhc2VfcmVnaW9uKCBkZXYtPmJhc2VfYWRkciwgNjQgKTsKK2Vycl9vdXRfaXJxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworZXJyX291dF91bmxpbms6CisJZGVsX2Fpcm9fZGV2KGRldik7CitlcnJfb3V0X3RocjoKKwlzZXRfYml0KEpPQl9ESUUsICZhaS0+ZmxhZ3MpOworCWtpbGxfcHJvYyhhaS0+dGhyX3BpZCwgU0lHVEVSTSwgMSk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmYWktPnRocl9leGl0ZWQpOworZXJyX291dF9mcmVlOgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlICppbml0X2Fpcm9fY2FyZCggdW5zaWduZWQgc2hvcnQgaXJxLCBpbnQgcG9ydCwgaW50IGlzX3BjbWNpYSwKKwkJCQkgIHN0cnVjdCBkZXZpY2UgKmRtZGV2KQoreworCXJldHVybiBfaW5pdF9haXJvX2NhcmQgKCBpcnEsIHBvcnQsIGlzX3BjbWNpYSwgTlVMTCwgZG1kZXYpOworfQorCitFWFBPUlRfU1lNQk9MKGluaXRfYWlyb19jYXJkKTsKKworc3RhdGljIGludCB3YWl0YnVzeSAoc3RydWN0IGFpcm9faW5mbyAqYWkpIHsKKwlpbnQgZGVsYXkgPSAwOworCXdoaWxlICgoSU40NTAwIChhaSwgQ09NTUFORCkgJiBDT01NQU5EX0JVU1kpICYgKGRlbGF5IDwgMTAwMDApKSB7CisJCXVkZWxheSAoMTApOworCQlpZiAoKCsrZGVsYXkgJSAyMCkgPT0gMCkKKwkJCU9VVDQ1MDAoYWksIEVWQUNLLCBFVl9DTEVBUkNPTU1BTkRCVVNZKTsKKwl9CisJcmV0dXJuIGRlbGF5IDwgMTAwMDA7Cit9CisKK2ludCByZXNldF9haXJvX2NhcmQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQoreworCWludCBpOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCisJaWYgKHJlc2V0X2NhcmQgKGRldiwgMSkpCisJCXJldHVybiAtMTsKKworCWlmICggc2V0dXBfY2FyZChhaSwgZGV2LT5kZXZfYWRkciwgMSApICE9IFNVQ0NFU1MgKSB7CisJCXByaW50ayggS0VSTl9FUlIgImFpcm86IE1BQyBjb3VsZCBub3QgYmUgZW5hYmxlZFxuIiApOworCQlyZXR1cm4gLTE7CisJfQorCXByaW50ayggS0VSTl9JTkZPICJhaXJvOiBNQUMgZW5hYmxlZCAlcyAleDoleDoleDoleDoleDoleFxuIiwgZGV2LT5uYW1lLAorCQkJZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKKwkJCWRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0pOworCS8qIEFsbG9jYXRlIHRoZSB0cmFuc21pdCBidWZmZXJzIGlmIG5lZWRlZCAqLworCWlmICghdGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpCisJCWZvciggaSA9IDA7IGkgPCBNQVhfRklEUzsgaSsrICkKKwkJCWFpLT5maWRzW2ldID0gdHJhbnNtaXRfYWxsb2NhdGUgKGFpLDIzMTIsaT49TUFYX0ZJRFMvMik7CisKKwllbmFibGVfaW50ZXJydXB0cyggYWkgKTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0wocmVzZXRfYWlyb19jYXJkKTsKKworc3RhdGljIHZvaWQgYWlyb19zZW5kX2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJU3RhdHVzUmlkIHN0YXR1c19yaWQ7CisKKwljbGVhcl9iaXQoSk9CX0VWRU5ULCAmYWktPmZsYWdzKTsKKwlQQzQ1MDBfcmVhZHJpZChhaSwgUklEX1NUQVRVUywgJnN0YXR1c19yaWQsIHNpemVvZihzdGF0dXNfcmlkKSwgMCk7CisJdXAoJmFpLT5zZW0pOworCXdycXUuZGF0YS5sZW5ndGggPSAwOworCXdycXUuZGF0YS5mbGFncyA9IDA7CisJbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBzdGF0dXNfcmlkLmJzc2lkWzBdLCBFVEhfQUxFTik7CisJd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKworCS8qIFNlbmQgZXZlbnQgdG8gdXNlciBzcGFjZSAqLworCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKK30KKworc3RhdGljIGludCBhaXJvX3RocmVhZCh2b2lkICpkYXRhKSB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJaW50IGxvY2tlZDsKKwkKKwlkYWVtb25pemUoIiVzIiwgZGV2LT5uYW1lKTsKKwlhbGxvd19zaWduYWwoU0lHVEVSTSk7CisKKwl3aGlsZSgxKSB7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CisKKwkJLyogbWFrZSBzd3N1c3AgaGFwcHkgd2l0aCBvdXIgdGhyZWFkICovCisJCXRyeV90b19mcmVlemUoUEZfRlJFRVpFKTsKKworCQlpZiAodGVzdF9iaXQoSk9CX0RJRSwgJmFpLT5mbGFncykpCisJCQlicmVhazsKKworCQlpZiAoYWktPmZsYWdzICYgSk9CX01BU0spIHsKKwkJCWxvY2tlZCA9IGRvd25faW50ZXJydXB0aWJsZSgmYWktPnNlbSk7CisJCX0gZWxzZSB7CisJCQl3YWl0X3F1ZXVlX3Qgd2FpdDsKKworCQkJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOworCQkJYWRkX3dhaXRfcXVldWUoJmFpLT50aHJfd2FpdCwgJndhaXQpOworCQkJZm9yICg7OykgeworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQkJaWYgKGFpLT5mbGFncyAmIEpPQl9NQVNLKQorCQkJCQlicmVhazsKKwkJCQlpZiAoYWktPmV4cGlyZXMpIHsKKwkJCQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcyxhaS0+ZXhwaXJlcykpeworCQkJCQkJc2V0X2JpdChKT0JfQVVUT1dFUCwmYWktPmZsYWdzKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJCXNjaGVkdWxlX3RpbWVvdXQoYWktPmV4cGlyZXMgLSBqaWZmaWVzKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfSBlbHNlIGlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJc2NoZWR1bGUoKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmYWktPnRocl93YWl0LCAmd2FpdCk7CisJCQlsb2NrZWQgPSAxOworCQl9CisKKwkJaWYgKGxvY2tlZCkKKwkJCWNvbnRpbnVlOworCisJCWlmICh0ZXN0X2JpdChKT0JfRElFLCAmYWktPmZsYWdzKSkgeworCQkJdXAoJmFpLT5zZW0pOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoYWktPnBvd2VyIHx8IHRlc3RfYml0KEZMQUdfRkxBU0hJTkcsICZhaS0+ZmxhZ3MpKSB7CisJCQl1cCgmYWktPnNlbSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICh0ZXN0X2JpdChKT0JfWE1JVCwgJmFpLT5mbGFncykpCisJCQlhaXJvX2VuZF94bWl0KGRldik7CisJCWVsc2UgaWYgKHRlc3RfYml0KEpPQl9YTUlUMTEsICZhaS0+ZmxhZ3MpKQorCQkJYWlyb19lbmRfeG1pdDExKGRldik7CisJCWVsc2UgaWYgKHRlc3RfYml0KEpPQl9TVEFUUywgJmFpLT5mbGFncykpCisJCQlhaXJvX3JlYWRfc3RhdHMoYWkpOworCQllbHNlIGlmICh0ZXN0X2JpdChKT0JfV1NUQVRTLCAmYWktPmZsYWdzKSkKKwkJCWFpcm9fcmVhZF93aXJlbGVzc19zdGF0cyhhaSk7CisJCWVsc2UgaWYgKHRlc3RfYml0KEpPQl9QUk9NSVNDLCAmYWktPmZsYWdzKSkKKwkJCWFpcm9fc2V0X3Byb21pc2MoYWkpOworI2lmZGVmIE1JQ1NVUFBPUlQKKwkJZWxzZSBpZiAodGVzdF9iaXQoSk9CX01JQywgJmFpLT5mbGFncykpCisJCQltaWNpbml0KGFpKTsKKyNlbmRpZgorCQllbHNlIGlmICh0ZXN0X2JpdChKT0JfRVZFTlQsICZhaS0+ZmxhZ3MpKQorCQkJYWlyb19zZW5kX2V2ZW50KGRldik7CisJCWVsc2UgaWYgKHRlc3RfYml0KEpPQl9BVVRPV0VQLCAmYWktPmZsYWdzKSkKKwkJCXRpbWVyX2Z1bmMoZGV2KTsKKwl9CisJY29tcGxldGVfYW5kX2V4aXQgKCZhaS0+dGhyX2V4aXRlZCwgMCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhaXJvX2ludGVycnVwdCAoIGludCBpcnEsIHZvaWQqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCXUxNiBzdGF0dXM7CisJdTE2IGZpZDsKKwlzdHJ1Y3QgYWlyb19pbmZvICphcHJpdiA9IGRldi0+cHJpdjsKKwl1MTYgc2F2ZWRJbnRlcnJ1cHRzID0gMDsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KGRldikpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWZvciAoOzspIHsKKwkJc3RhdHVzID0gSU40NTAwKCBhcHJpdiwgRVZTVEFUICk7CisJCWlmICggIShzdGF0dXMgJiBTVEFUVVNfSU5UUykgfHwgc3RhdHVzID09IDB4ZmZmZiApIGJyZWFrOworCisJCWhhbmRsZWQgPSAxOworCisJCWlmICggc3RhdHVzICYgRVZfQVdBS0UgKSB7CisJCQlPVVQ0NTAwKCBhcHJpdiwgRVZBQ0ssIEVWX0FXQUtFICk7CisJCQlPVVQ0NTAwKCBhcHJpdiwgRVZBQ0ssIEVWX0FXQUtFICk7CisJCX0KKworCQlpZiAoIXNhdmVkSW50ZXJydXB0cykgeworCQkJc2F2ZWRJbnRlcnJ1cHRzID0gSU40NTAwKCBhcHJpdiwgRVZJTlRFTiApOworCQkJT1VUNDUwMCggYXByaXYsIEVWSU5URU4sIDAgKTsKKwkJfQorCisJCWlmICggc3RhdHVzICYgRVZfTUlDICkgeworCQkJT1VUNDUwMCggYXByaXYsIEVWQUNLLCBFVl9NSUMgKTsKKyNpZmRlZiBNSUNTVVBQT1JUCisJCQlpZiAodGVzdF9iaXQoRkxBR19NSUNfQ0FQQUJMRSwgJmFwcml2LT5mbGFncykpIHsKKwkJCQlzZXRfYml0KEpPQl9NSUMsICZhcHJpdi0+ZmxhZ3MpOworCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYXByaXYtPnRocl93YWl0KTsKKwkJCX0KKyNlbmRpZgorCQl9CisJCWlmICggc3RhdHVzICYgRVZfTElOSyApIHsKKwkJCXVuaW9uIGl3cmVxX2RhdGEJd3JxdTsKKwkJCS8qIFRoZSBsaW5rIHN0YXR1cyBoYXMgY2hhbmdlZCwgaWYgeW91IHdhbnQgdG8gcHV0IGEKKwkJCSAgIG1vbml0b3IgaG9vayBpbiwgZG8gaXQgaGVyZS4gIChSZW1lbWJlciB0aGF0CisJCQkgICBpbnRlcnJ1cHRzIGFyZSBzdGlsbCBkaXNhYmxlZCEpCisJCQkqLworCQkJdTE2IG5ld1N0YXR1cyA9IElONDUwMChhcHJpdiwgTElOS1NUQVQpOworCQkJT1VUNDUwMCggYXByaXYsIEVWQUNLLCBFVl9MSU5LKTsKKwkJCS8qIEhlcmUgaXMgd2hhdCBuZXdTdGF0dXMgbWVhbnM6ICovCisjZGVmaW5lIE5PQkVBQ09OIDB4ODAwMCAvKiBMb3NzIG9mIHN5bmMgLSBtaXNzZWQgYmVhY29ucyAqLworI2RlZmluZSBNQVhSRVRSSUVTIDB4ODAwMSAvKiBMb3NzIG9mIHN5bmMgLSBtYXggcmV0cmllcyAqLworI2RlZmluZSBNQVhBUkwgMHg4MDAyIC8qIExvc3Mgb2Ygc3luYyAtIGF2ZXJhZ2UgcmV0cnkgbGV2ZWwgZXhjZWVkZWQqLworI2RlZmluZSBGT1JDRUxPU1MgMHg4MDAzIC8qIExvc3Mgb2Ygc3luYyAtIGhvc3QgcmVxdWVzdCAqLworI2RlZmluZSBUU0ZTWU5DIDB4ODAwNCAvKiBMb3NzIG9mIHN5bmMgLSBUU0Ygc3luY2hyb25pemF0aW9uICovCisjZGVmaW5lIERFQVVUSCAweDgxMDAgLyogRGVhdXRoZW50aWNhdGlvbiAobG93IGJ5dGUgaXMgcmVhc29uIGNvZGUpICovCisjZGVmaW5lIERJU0FTUyAweDgyMDAgLyogRGlzYXNzb2NpYXRpb24gKGxvdyBieXRlIGlzIHJlYXNvbiBjb2RlKSAqLworI2RlZmluZSBBU1NGQUlMIDB4ODQwMCAvKiBBc3NvY2lhdGlvbiBmYWlsdXJlIChsb3cgYnl0ZSBpcyByZWFzb24KKwkJCSAgY29kZSkgKi8KKyNkZWZpbmUgQVVUSEZBSUwgMHgwMzAwIC8qIEF1dGhlbnRpY2F0aW9uIGZhaWx1cmUgKGxvdyBieXRlIGlzIHJlYXNvbgorCQkJICAgY29kZSkgKi8KKyNkZWZpbmUgQVNTT0NJQVRFRCAweDA0MDAgLyogQXNzb2NhdGllZCAqLworI2RlZmluZSBSQ19SRVNFUlZFRCAwIC8qIFJlc2VydmVkIHJldHVybiBjb2RlICovCisjZGVmaW5lIFJDX05PUkVBU09OIDEgLyogVW5zcGVjaWZpZWQgcmVhc29uICovCisjZGVmaW5lIFJDX0FVVEhJTlYgMiAvKiBQcmV2aW91cyBhdXRoZW50aWNhdGlvbiBpbnZhbGlkICovCisjZGVmaW5lIFJDX0RFQVVUSCAzIC8qIERlYXV0aGVudGljYXRlZCBiZWNhdXNlIHNlbmRpbmcgc3RhdGlvbiBpcworCQkgICAgICAgbGVhdmluZyAqLworI2RlZmluZSBSQ19OT0FDVCA0IC8qIERpc2Fzc29jaWF0ZWQgZHVlIHRvIGluYWN0aXZpdHkgKi8KKyNkZWZpbmUgUkNfTUFYTE9BRCA1IC8qIERpc2Fzc29jaWF0ZWQgYmVjYXVzZSBBUCBpcyB1bmFibGUgdG8gaGFuZGxlCisJCQlhbGwgY3VycmVudGx5IGFzc29jaWF0ZWQgc3RhdGlvbnMgKi8KKyNkZWZpbmUgUkNfQkFEQ0xBU1MyIDYgLyogQ2xhc3MgMiBmcmFtZSByZWNlaXZlZCBmcm9tCisJCQkgIG5vbi1BdXRoZW50aWNhdGVkIHN0YXRpb24gKi8KKyNkZWZpbmUgUkNfQkFEQ0xBU1MzIDcgLyogQ2xhc3MgMyBmcmFtZSByZWNlaXZlZCBmcm9tCisJCQkgIG5vbi1Bc3NvY2lhdGVkIHN0YXRpb24gKi8KKyNkZWZpbmUgUkNfU1RBVExFQVZFIDggLyogRGlzYXNzb2NpYXRlZCBiZWNhdXNlIHNlbmRpbmcgc3RhdGlvbiBpcworCQkJICBsZWF2aW5nIEJTUyAqLworI2RlZmluZSBSQ19OT0FVVEggOSAvKiBTdGF0aW9uIHJlcXVlc3RpbmcgKFJlKUFzc29jaWF0aW9uIGlzIG5vdAorCQkgICAgICAgQXV0aGVudGljYXRlZCB3aXRoIHRoZSByZXNwb25kaW5nIHN0YXRpb24gKi8KKwkJCWlmIChuZXdTdGF0dXMgIT0gQVNTT0NJQVRFRCkgeworCQkJCWlmIChhdXRvX3dlcCAmJiAhYXByaXYtPmV4cGlyZXMpIHsKKwkJCQkJYXByaXYtPmV4cGlyZXMgPSBSVU5fQVQoMypIWik7CisJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYXByaXYtPnRocl93YWl0KTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IGFwcml2LT50YXNrOworCQkJCWlmIChhdXRvX3dlcCkKKwkJCQkJYXByaXYtPmV4cGlyZXMgPSAwOworCQkJCWlmICh0YXNrKQorCQkJCQl3YWtlX3VwX3Byb2Nlc3MgKHRhc2spOworCQkJCXNldF9iaXQoRkxBR19VUERBVEVfVU5JLCAmYXByaXYtPmZsYWdzKTsKKwkJCQlzZXRfYml0KEZMQUdfVVBEQVRFX01VTFRJLCAmYXByaXYtPmZsYWdzKTsKKwkJCX0KKwkJCS8qIFF1ZXN0aW9uIDogaXMgQVNTT0NJQVRFRCB0aGUgb25seSBzdGF0dXMKKwkJCSAqIHRoYXQgaXMgdmFsaWQgPyBXZSB3YW50IHRvIGNhdGNoIGhhbmRvdmVyCisJCQkgKiBhbmQgcmVhc3NvY2lhdGlvbnMgYXMgdmFsaWQgc3RhdHVzCisJCQkgKiBKZWFuIElJICovCisJCQlpZihuZXdTdGF0dXMgPT0gQVNTT0NJQVRFRCkgeworCQkJCWlmIChhcHJpdi0+c2Nhbl90aW1lc3RhbXApIHsKKwkJCQkJLyogU2VuZCBhbiBlbXB0eSBldmVudCB0byB1c2VyIHNwYWNlLgorCQkJCQkgKiBXZSBkb24ndCBzZW5kIHRoZSByZWNlaXZlZCBkYXRhIG9uCisJCQkJCSAqIHRoZSBldmVudCBiZWNhdXNlIGl0IHdvdWxkIHJlcXVpcmUKKwkJCQkJICogdXMgdG8gZG8gY29tcGxleCB0cmFuc2NvZGluZywgYW5kCisJCQkJCSAqIHdlIHdhbnQgdG8gbWluaW1pc2UgdGhlIHdvcmsgZG9uZSBpbgorCQkJCQkgKiB0aGUgaXJxIGhhbmRsZXIuIFVzZSBhIHJlcXVlc3QgdG8KKwkJCQkJICogZXh0cmFjdCB0aGUgZGF0YSAtIEplYW4gSUkgKi8KKwkJCQkJd3JxdS5kYXRhLmxlbmd0aCA9IDA7CisJCQkJCXdycXUuZGF0YS5mbGFncyA9IDA7CisJCQkJCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBTSU9DR0lXU0NBTiwgJndycXUsIE5VTEwpOworCQkJCQlhcHJpdi0+c2Nhbl90aW1lc3RhbXAgPSAwOworCQkJCX0KKwkJCQlpZiAoZG93bl90cnlsb2NrKCZhcHJpdi0+c2VtKSAhPSAwKSB7CisJCQkJCXNldF9iaXQoSk9CX0VWRU5ULCAmYXByaXYtPmZsYWdzKTsKKwkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhcHJpdi0+dGhyX3dhaXQpOworCQkJCX0gZWxzZQorCQkJCQlhaXJvX3NlbmRfZXZlbnQoZGV2KTsKKwkJCX0gZWxzZSB7CisJCQkJbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAnXDAnLCBFVEhfQUxFTik7CisJCQkJd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKworCQkJCS8qIFNlbmQgZXZlbnQgdG8gdXNlciBzcGFjZSAqLworCQkJCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBTSU9DR0lXQVAsICZ3cnF1LE5VTEwpOworCQkJfQorCQl9CisKKwkJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0byByZWNlaXZlICovCisJCWlmICggc3RhdHVzICYgRVZfUlggICkgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJCQl1MTYgZmMsIGxlbiwgaGRybGVuID0gMDsKKyNwcmFnbWEgcGFjaygxKQorCQkJc3RydWN0IHsKKwkJCQl1MTYgc3RhdHVzLCBsZW47CisJCQkJdTggcnNzaVsyXTsKKwkJCQl1OCByYXRlOworCQkJCXU4IGZyZXE7CisJCQkJdTE2IHRtcFs0XTsKKwkJCX0gaGRyOworI3ByYWdtYSBwYWNrKCkKKwkJCXUxNiBnYXA7CisJCQl1MTYgdG1wYnVmWzRdOworCQkJdTE2ICpidWZmZXI7CisKKwkJCWlmICh0ZXN0X2JpdChGTEFHX01QSSwmYXByaXYtPmZsYWdzKSkgeworCQkJCWlmICh0ZXN0X2JpdChGTEFHXzgwMl8xMSwgJmFwcml2LT5mbGFncykpCisJCQkJCW1waV9yZWNlaXZlXzgwMl8xMShhcHJpdik7CisJCQkJZWxzZQorCQkJCQltcGlfcmVjZWl2ZV84MDJfMyhhcHJpdik7CisJCQkJT1VUNDUwMChhcHJpdiwgRVZBQ0ssIEVWX1JYKTsKKwkJCQlnb3RvIGV4aXRyeDsKKwkJCX0KKworCQkJZmlkID0gSU40NTAwKCBhcHJpdiwgUlhGSUQgKTsKKworCQkJLyogR2V0IHRoZSBwYWNrZXQgbGVuZ3RoICovCisJCQlpZiAodGVzdF9iaXQoRkxBR184MDJfMTEsICZhcHJpdi0+ZmxhZ3MpKSB7CisJCQkJYmFwX3NldHVwIChhcHJpdiwgZmlkLCA0LCBCQVAwKTsKKwkJCQliYXBfcmVhZCAoYXByaXYsICh1MTYqKSZoZHIsIHNpemVvZihoZHIpLCBCQVAwKTsKKwkJCQkvKiBCYWQgQ1JDLiBJZ25vcmUgcGFja2V0ICovCisJCQkJaWYgKGxlMTZfdG9fY3B1KGhkci5zdGF0dXMpICYgMikKKwkJCQkJaGRyLmxlbiA9IDA7CisJCQkJaWYgKGFwcml2LT53aWZpZGV2ID09IE5VTEwpCisJCQkJCWhkci5sZW4gPSAwOworCQkJfSBlbHNlIHsKKwkJCQliYXBfc2V0dXAgKGFwcml2LCBmaWQsIDB4MzYsIEJBUDApOworCQkJCWJhcF9yZWFkIChhcHJpdiwgKHUxNiopJmhkci5sZW4sIDIsIEJBUDApOworCQkJfQorCQkJbGVuID0gbGUxNl90b19jcHUoaGRyLmxlbik7CisKKwkJCWlmIChsZW4gPiAyMzEyKSB7CisJCQkJcHJpbnRrKCBLRVJOX0VSUiAiYWlybzogQmFkIHNpemUgJWRcbiIsIGxlbiApOworCQkJCWdvdG8gYmFkcng7CisJCQl9CisJCQlpZiAobGVuID09IDApCisJCQkJZ290byBiYWRyeDsKKworCQkJaWYgKHRlc3RfYml0KEZMQUdfODAyXzExLCAmYXByaXYtPmZsYWdzKSkgeworCQkJCWJhcF9yZWFkIChhcHJpdiwgKHUxNiopJmZjLCBzaXplb2YoZmMpLCBCQVAwKTsKKwkJCQlmYyA9IGxlMTZfdG9fY3B1KGZjKTsKKwkJCQlzd2l0Y2ggKGZjICYgMHhjKSB7CisJCQkJCWNhc2UgNDoKKwkJCQkJCWlmICgoZmMgJiAweGUwKSA9PSAweGMwKQorCQkJCQkJCWhkcmxlbiA9IDEwOworCQkJCQkJZWxzZQorCQkJCQkJCWhkcmxlbiA9IDE2OworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgODoKKwkJCQkJCWlmICgoZmMmMHgzMDApPT0weDMwMCl7CisJCQkJCQkJaGRybGVuID0gMzA7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCWRlZmF1bHQ6CisJCQkJCQloZHJsZW4gPSAyNDsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQloZHJsZW4gPSBFVEhfQUxFTiAqIDI7CisKKwkJCXNrYiA9IGRldl9hbGxvY19za2IoIGxlbiArIGhkcmxlbiArIDIgKyAyICk7CisJCQlpZiAoICFza2IgKSB7CisJCQkJYXByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlnb3RvIGJhZHJ4OworCQkJfQorCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsgLyogVGhpcyB3YXkgdGhlIElQIGhlYWRlciBpcyBhbGlnbmVkICovCisJCQlidWZmZXIgPSAodTE2Kilza2JfcHV0IChza2IsIGxlbiArIGhkcmxlbik7CisJCQlpZiAodGVzdF9iaXQoRkxBR184MDJfMTEsICZhcHJpdi0+ZmxhZ3MpKSB7CisJCQkJYnVmZmVyWzBdID0gZmM7CisJCQkJYmFwX3JlYWQgKGFwcml2LCBidWZmZXIgKyAxLCBoZHJsZW4gLSAyLCBCQVAwKTsKKwkJCQlpZiAoaGRybGVuID09IDI0KQorCQkJCQliYXBfcmVhZCAoYXByaXYsIHRtcGJ1ZiwgNiwgQkFQMCk7CisKKwkJCQliYXBfcmVhZCAoYXByaXYsICZnYXAsIHNpemVvZihnYXApLCBCQVAwKTsKKwkJCQlnYXAgPSBsZTE2X3RvX2NwdShnYXApOworCQkJCWlmIChnYXApIHsKKwkJCQkJaWYgKGdhcCA8PSA4KQorCQkJCQkJYmFwX3JlYWQgKGFwcml2LCB0bXBidWYsIGdhcCwgQkFQMCk7CisJCQkJCWVsc2UKKwkJCQkJCXByaW50ayhLRVJOX0VSUiAiYWlybzogZ2FwbGVuIHRvbyBiaWcuIFByb2JsZW1zIHdpbGwgZm9sbG93Li4uXG4iKTsKKwkJCQl9CisJCQkJYmFwX3JlYWQgKGFwcml2LCBidWZmZXIgKyBoZHJsZW4vMiwgbGVuLCBCQVAwKTsKKwkJCX0gZWxzZSB7CisjaWZkZWYgTUlDU1VQUE9SVAorCQkJCU1JQ0J1ZmZlciBtaWNidWY7CisjZW5kaWYKKwkJCQliYXBfcmVhZCAoYXByaXYsIGJ1ZmZlciwgRVRIX0FMRU4qMiwgQkFQMCk7CisjaWZkZWYgTUlDU1VQUE9SVAorCQkJCWlmIChhcHJpdi0+bWljc3RhdHMuZW5hYmxlZCkgeworCQkJCQliYXBfcmVhZCAoYXByaXYsKHUxNiopJm1pY2J1ZixzaXplb2YobWljYnVmKSxCQVAwKTsKKwkJCQkJaWYgKG50b2hzKG1pY2J1Zi50eXBlbGVuKSA+IDB4MDVEQykKKwkJCQkJCWJhcF9zZXR1cCAoYXByaXYsIGZpZCwgMHg0NCwgQkFQMCk7CisJCQkJCWVsc2UgeworCQkJCQkJaWYgKGxlbiA8PSBzaXplb2YobWljYnVmKSkKKwkJCQkJCQlnb3RvIGJhZG1pYzsKKworCQkJCQkJbGVuIC09IHNpemVvZihtaWNidWYpOworCQkJCQkJc2tiX3RyaW0gKHNrYiwgbGVuICsgaGRybGVuKTsKKwkJCQkJfQorCQkJCX0KKyNlbmRpZgorCQkJCWJhcF9yZWFkKGFwcml2LGJ1ZmZlcitFVEhfQUxFTixsZW4sQkFQMCk7CisjaWZkZWYgTUlDU1VQUE9SVAorCQkJCWlmIChkZWNhcHN1bGF0ZShhcHJpdiwmbWljYnVmLChldGhlckhlYWQqKWJ1ZmZlcixsZW4pKSB7CitiYWRtaWM6CisJCQkJCWRldl9rZnJlZV9za2JfaXJxIChza2IpOworI2Vsc2UKKwkJCQlpZiAoMCkgeworI2VuZGlmCitiYWRyeDoKKwkJCQkJT1VUNDUwMCggYXByaXYsIEVWQUNLLCBFVl9SWCk7CisJCQkJCWdvdG8gZXhpdHJ4OworCQkJCX0KKwkJCX0KKyNpZmRlZiBXSVJFTEVTU19TUFkKKwkJCWlmIChhcHJpdi0+c3B5X2RhdGEuc3B5X251bWJlciA+IDApIHsKKwkJCQljaGFyICpzYTsKKwkJCQlzdHJ1Y3QgaXdfcXVhbGl0eSB3c3RhdHM7CisJCQkJLyogUHJlcGFyZSBzcHkgZGF0YSA6IGFkZHIgKyBxdWFsICovCisJCQkJaWYgKCF0ZXN0X2JpdChGTEFHXzgwMl8xMSwgJmFwcml2LT5mbGFncykpIHsKKwkJCQkJc2EgPSAoY2hhciopYnVmZmVyICsgNjsKKwkJCQkJYmFwX3NldHVwIChhcHJpdiwgZmlkLCA4LCBCQVAwKTsKKwkJCQkJYmFwX3JlYWQgKGFwcml2LCAodTE2KiloZHIucnNzaSwgMiwgQkFQMCk7CisJCQkJfSBlbHNlCisJCQkJCXNhID0gKGNoYXIqKWJ1ZmZlciArIDEwOworCQkJCXdzdGF0cy5xdWFsID0gaGRyLnJzc2lbMF07CisJCQkJaWYgKGFwcml2LT5yc3NpKQorCQkJCQl3c3RhdHMubGV2ZWwgPSAweDEwMCAtIGFwcml2LT5yc3NpW2hkci5yc3NpWzFdXS5yc3NpZEJtOworCQkJCWVsc2UKKwkJCQkJd3N0YXRzLmxldmVsID0gKGhkci5yc3NpWzFdICsgMzIxKSAvIDI7CisJCQkJd3N0YXRzLnVwZGF0ZWQgPSAzOwkKKwkJCQkvKiBVcGRhdGUgc3B5IHJlY29yZHMgKi8KKwkJCQl3aXJlbGVzc19zcHlfdXBkYXRlKGRldiwgc2EsICZ3c3RhdHMpOworCQkJfQorI2VuZGlmIC8qIFdJUkVMRVNTX1NQWSAqLworCQkJT1VUNDUwMCggYXByaXYsIEVWQUNLLCBFVl9SWCk7CisKKwkJCWlmICh0ZXN0X2JpdChGTEFHXzgwMl8xMSwgJmFwcml2LT5mbGFncykpIHsKKwkJCQlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJCQkJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisJCQkJc2tiLT5kZXYgPSBhcHJpdi0+d2lmaWRldjsKKwkJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyXzIpOworCQkJfSBlbHNlIHsKKwkJCQlza2ItPmRldiA9IGRldjsKKwkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJCQl9CisJCQlza2ItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisKKwkJCW5ldGlmX3J4KCBza2IgKTsKKwkJfQorZXhpdHJ4OgorCisJCS8qIENoZWNrIHRvIHNlZSBpZiBhIHBhY2tldCBoYXMgYmVlbiB0cmFuc21pdHRlZCAqLworCQlpZiAoICBzdGF0dXMgJiAoIEVWX1RYfEVWX1RYQ1BZfEVWX1RYRVhDICkgKSB7CisJCQlpbnQgaTsKKwkJCWludCBsZW4gPSAwOworCQkJaW50IGluZGV4ID0gLTE7CisKKwkJCWlmICh0ZXN0X2JpdChGTEFHX01QSSwmYXByaXYtPmZsYWdzKSkgeworCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJCQlpZiAoc3RhdHVzICYgRVZfVFhFWEMpCisJCQkJCWdldF90eF9lcnJvcihhcHJpdiwgLTEpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZhcHJpdi0+YXV4X2xvY2ssIGZsYWdzKTsKKwkJCQlpZiAoc2tiX3F1ZXVlX2xlbiAoJmFwcml2LT50eHEpKSB7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwcml2LT5hdXhfbG9jayxmbGFncyk7CisJCQkJCW1waV9zZW5kX3BhY2tldCAoZGV2KTsKKwkJCQl9IGVsc2UgeworCQkJCQljbGVhcl9iaXQoRkxBR19QRU5ESU5HX1hNSVQsICZhcHJpdi0+ZmxhZ3MpOworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcHJpdi0+YXV4X2xvY2ssZmxhZ3MpOworCQkJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCQkJCX0KKwkJCQlPVVQ0NTAwKCBhcHJpdiwgRVZBQ0ssCisJCQkJCXN0YXR1cyAmIChFVl9UWHxFVl9UWENQWXxFVl9UWEVYQykpOworCQkJCWdvdG8gZXhpdHR4OworCQkJfQorCisJCQlmaWQgPSBJTjQ1MDAoYXByaXYsIFRYQ09NUExGSUQpOworCisJCQlmb3IoIGkgPSAwOyBpIDwgTUFYX0ZJRFM7IGkrKyApIHsKKwkJCQlpZiAoICggYXByaXYtPmZpZHNbaV0gJiAweGZmZmYgKSA9PSBmaWQgKSB7CisJCQkJCWxlbiA9IGFwcml2LT5maWRzW2ldID4+IDE2OworCQkJCQlpbmRleCA9IGk7CisJCQkJfQorCQkJfQorCQkJaWYgKGluZGV4ICE9IC0xKSB7CisJCQkJaWYgKHN0YXR1cyAmIEVWX1RYRVhDKQorCQkJCQlnZXRfdHhfZXJyb3IoYXByaXYsIGluZGV4KTsKKwkJCQlPVVQ0NTAwKCBhcHJpdiwgRVZBQ0ssIHN0YXR1cyAmIChFVl9UWCB8IEVWX1RYRVhDKSk7CisJCQkJLyogU2V0IHVwIHRvIGJlIHVzZWQgYWdhaW4gKi8KKwkJCQlhcHJpdi0+Zmlkc1tpbmRleF0gJj0gMHhmZmZmOworCQkJCWlmIChpbmRleCA8IE1BWF9GSURTIC8gMikgeworCQkJCQlpZiAoIXRlc3RfYml0KEZMQUdfUEVORElOR19YTUlULCAmYXByaXYtPmZsYWdzKSkKKwkJCQkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoIXRlc3RfYml0KEZMQUdfUEVORElOR19YTUlUMTEsICZhcHJpdi0+ZmxhZ3MpKQorCQkJCQkJbmV0aWZfd2FrZV9xdWV1ZShhcHJpdi0+d2lmaWRldik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlPVVQ0NTAwKCBhcHJpdiwgRVZBQ0ssIHN0YXR1cyAmIChFVl9UWCB8IEVWX1RYQ1BZIHwgRVZfVFhFWEMpKTsKKwkJCQlwcmludGsoIEtFUk5fRVJSICJhaXJvOiBVbmFsbG9jYXRlZCBGSUQgd2FzIHVzZWQgdG8geG1pdFxuIiApOworCQkJfQorCQl9CitleGl0dHg6CisJCWlmICggc3RhdHVzICYgflNUQVRVU19JTlRTICYgfklHTk9SRV9JTlRTICkKKwkJCXByaW50ayggS0VSTl9XQVJOSU5HICJhaXJvOiBHb3Qgd2VpcmQgc3RhdHVzICV4XG4iLAorCQkJCXN0YXR1cyAmIH5TVEFUVVNfSU5UUyAmIH5JR05PUkVfSU5UUyApOworCX0KKworCWlmIChzYXZlZEludGVycnVwdHMpCisJCU9VVDQ1MDAoIGFwcml2LCBFVklOVEVOLCBzYXZlZEludGVycnVwdHMgKTsKKworCS8qIGRvbmUuLiAqLworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKgorICogIFJvdXRpbmVzIHRvIHRhbGsgdG8gdGhlIGNhcmQKKyAqLworCisvKgorICogIFRoaXMgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBmb3IgdGhlIDQ1MDAsIGhlbmNlIHRoZSBuYW1lCisgKiAgTk9URTogIElmIHVzZSB3aXRoIDhiaXQgbW9kZSBhbmQgU01QIGJhZCB0aGluZ3Mgd2lsbCBoYXBwZW4hCisgKiAgICAgICAgIFdoeSB3b3VsZCBzb21lIG9uZSBkbyA4IGJpdCBJTyBpbiBhbiBTTVAgbWFjaGluZT8hPworICovCitzdGF0aWMgdm9pZCBPVVQ0NTAwKCBzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTE2IHJlZywgdTE2IHZhbCApIHsKKwlpZiAodGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpCisJCXJlZyA8PD0gMTsKKwlpZiAoICFkbzhiaXRJTyApCisJCW91dHcoIHZhbCwgYWktPmRldi0+YmFzZV9hZGRyICsgcmVnICk7CisJZWxzZSB7CisJCW91dGIoIHZhbCAmIDB4ZmYsIGFpLT5kZXYtPmJhc2VfYWRkciArIHJlZyApOworCQlvdXRiKCB2YWwgPj4gOCwgYWktPmRldi0+YmFzZV9hZGRyICsgcmVnICsgMSApOworCX0KK30KKworc3RhdGljIHUxNiBJTjQ1MDAoIHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MTYgcmVnICkgeworCXVuc2lnbmVkIHNob3J0IHJjOworCisJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCZhaS0+ZmxhZ3MpKQorCQlyZWcgPDw9IDE7CisJaWYgKCAhZG84Yml0SU8gKQorCQlyYyA9IGludyggYWktPmRldi0+YmFzZV9hZGRyICsgcmVnICk7CisJZWxzZSB7CisJCXJjID0gaW5iKCBhaS0+ZGV2LT5iYXNlX2FkZHIgKyByZWcgKTsKKwkJcmMgKz0gKChpbnQpaW5iKCBhaS0+ZGV2LT5iYXNlX2FkZHIgKyByZWcgKyAxICkpIDw8IDg7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBlbmFibGVfTUFDKCBzdHJ1Y3QgYWlyb19pbmZvICphaSwgUmVzcCAqcnNwLCBpbnQgbG9jayApIHsKKwlpbnQgcmM7CisgICAgICAgIENtZCBjbWQ7CisKKwkvKiBGTEFHX1JBRElPX09GRiA6IFJhZGlvIGRpc2FibGVkIHZpYSAvcHJvYyBvciBXaXJlbGVzcyBFeHRlbnNpb25zCisJICogRkxBR19SQURJT19ET1dOIDogUmFkaW8gZGlzYWJsZWQgdmlhICJpZmNvbmZpZyBldGhYIGRvd24iCisJICogTm90ZSA6IHdlIGNvdWxkIHRyeSB0byB1c2UgIW5ldGlmX3J1bm5pbmcoZGV2KSBpbiBlbmFibGVfTUFDKCkKKwkgKiBpbnN0ZWFkIG9mIHRoaXMgZmxhZywgYnV0IEkgZG9uJ3QgdHJ1c3QgaXQgKndpdGhpbiogdGhlCisJICogb3Blbi9jbG9zZSBmdW5jdGlvbnMsIGFuZCB0ZXN0aW5nIGJvdGggZmxhZ3MgdG9nZXRoZXIgaXMKKwkgKiAiY2hlYXBlciIgLSBKZWFuIElJICovCisJaWYgKGFpLT5mbGFncyAmIEZMQUdfUkFESU9fTUFTSykgcmV0dXJuIFNVQ0NFU1M7CisKKwlpZiAobG9jayAmJiBkb3duX2ludGVycnVwdGlibGUoJmFpLT5zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJaWYgKCF0ZXN0X2JpdChGTEFHX0VOQUJMRUQsICZhaS0+ZmxhZ3MpKSB7CisJCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJCWNtZC5jbWQgPSBNQUNfRU5BQkxFOworCQlyYyA9IGlzc3VlY29tbWFuZChhaSwgJmNtZCwgcnNwKTsKKwkJaWYgKHJjID09IFNVQ0NFU1MpCisJCQlzZXRfYml0KEZMQUdfRU5BQkxFRCwgJmFpLT5mbGFncyk7CisJfSBlbHNlCisJCXJjID0gU1VDQ0VTUzsKKworCWlmIChsb2NrKQorCSAgICB1cCgmYWktPnNlbSk7CisKKwlpZiAocmMpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCBlbmFibGUgTUFDLCBlcnI9JWRcbiIsCisJCQlfX0ZVTkNUSU9OX18scmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgZGlzYWJsZV9NQUMoIHN0cnVjdCBhaXJvX2luZm8gKmFpLCBpbnQgbG9jayApIHsKKyAgICAgICAgQ21kIGNtZDsKKwlSZXNwIHJzcDsKKworCWlmIChsb2NrICYmIGRvd25faW50ZXJydXB0aWJsZSgmYWktPnNlbSkpCisJCXJldHVybjsKKworCWlmICh0ZXN0X2JpdChGTEFHX0VOQUJMRUQsICZhaS0+ZmxhZ3MpKSB7CisJCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJCWNtZC5jbWQgPSBNQUNfRElTQUJMRTsgLy8gZGlzYWJsZSBpbiBjYXNlIGFscmVhZHkgZW5hYmxlZAorCQlpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApOworCQljbGVhcl9iaXQoRkxBR19FTkFCTEVELCAmYWktPmZsYWdzKTsKKwl9CisJaWYgKGxvY2spCisJCXVwKCZhaS0+c2VtKTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2ludGVycnVwdHMoIHN0cnVjdCBhaXJvX2luZm8gKmFpICkgeworCS8qIEVuYWJsZSB0aGUgaW50ZXJydXB0cyAqLworCU9VVDQ1MDAoIGFpLCBFVklOVEVOLCBTVEFUVVNfSU5UUyApOworfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX2ludGVycnVwdHMoIHN0cnVjdCBhaXJvX2luZm8gKmFpICkgeworCU9VVDQ1MDAoIGFpLCBFVklOVEVOLCAwICk7Cit9CisKK3N0YXRpYyB2b2lkIG1waV9yZWNlaXZlXzgwMl8zKHN0cnVjdCBhaXJvX2luZm8gKmFpKQoreworCVJ4RmlkIHJ4ZDsKKwlpbnQgbGVuID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWNoYXIgKmJ1ZmZlcjsKKyNpZmRlZiBNSUNTVVBQT1JUCisJaW50IG9mZiA9IDA7CisJTUlDQnVmZmVyIG1pY2J1ZjsKKyNlbmRpZgorCisJbWVtY3B5X2Zyb21pbygmcnhkLCBhaS0+cnhmaWRzWzBdLmNhcmRfcmFtX29mZiwgc2l6ZW9mKHJ4ZCkpOworCS8qIE1ha2Ugc3VyZSB3ZSBnb3Qgc29tZXRoaW5nICovCisJaWYgKHJ4ZC5yZHkgJiYgcnhkLnZhbGlkID09IDApIHsKKwkJbGVuID0gcnhkLmxlbiArIDEyOworCQlpZiAobGVuIDwgMTIgfHwgbGVuID4gMjA0OCkKKwkJCWdvdG8gYmFkcng7CisKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOworCQlpZiAoIXNrYikgeworCQkJYWktPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCWdvdG8gYmFkcng7CisJCX0KKwkJYnVmZmVyID0gc2tiX3B1dChza2IsbGVuKTsKKyNpZmRlZiBNSUNTVVBQT1JUCisJCW1lbWNweShidWZmZXIsIGFpLT5yeGZpZHNbMF0udmlydHVhbF9ob3N0X2FkZHIsIEVUSF9BTEVOICogMik7CisJCWlmIChhaS0+bWljc3RhdHMuZW5hYmxlZCkgeworCQkJbWVtY3B5KCZtaWNidWYsCisJCQkJYWktPnJ4Zmlkc1swXS52aXJ0dWFsX2hvc3RfYWRkciArIEVUSF9BTEVOICogMiwKKwkJCQlzaXplb2YobWljYnVmKSk7CisJCQlpZiAobnRvaHMobWljYnVmLnR5cGVsZW4pIDw9IDB4MDVEQykgeworCQkJCWlmIChsZW4gPD0gc2l6ZW9mKG1pY2J1ZikgKyBFVEhfQUxFTiAqIDIpCisJCQkJCWdvdG8gYmFkbWljOworCisJCQkJb2ZmID0gc2l6ZW9mKG1pY2J1Zik7CisJCQkJc2tiX3RyaW0gKHNrYiwgbGVuIC0gb2ZmKTsKKwkJCX0KKwkJfQorCQltZW1jcHkoYnVmZmVyICsgRVRIX0FMRU4gKiAyLAorCQkJYWktPnJ4Zmlkc1swXS52aXJ0dWFsX2hvc3RfYWRkciArIEVUSF9BTEVOICogMiArIG9mZiwKKwkJCWxlbiAtIEVUSF9BTEVOICogMiAtIG9mZik7CisJCWlmIChkZWNhcHN1bGF0ZSAoYWksICZtaWNidWYsIChldGhlckhlYWQqKWJ1ZmZlciwgbGVuIC0gb2ZmIC0gRVRIX0FMRU4gKiAyKSkgeworYmFkbWljOgorCQkJZGV2X2tmcmVlX3NrYl9pcnEgKHNrYik7CisJCQlnb3RvIGJhZHJ4OworCQl9CisjZWxzZQorCQltZW1jcHkoYnVmZmVyLCBhaS0+cnhmaWRzWzBdLnZpcnR1YWxfaG9zdF9hZGRyLCBsZW4pOworI2VuZGlmCisjaWZkZWYgV0lSRUxFU1NfU1BZCisJCWlmIChhaS0+c3B5X2RhdGEuc3B5X251bWJlciA+IDApIHsKKwkJCWNoYXIgKnNhOworCQkJc3RydWN0IGl3X3F1YWxpdHkgd3N0YXRzOworCQkJLyogUHJlcGFyZSBzcHkgZGF0YSA6IGFkZHIgKyBxdWFsICovCisJCQlzYSA9IGJ1ZmZlciArIEVUSF9BTEVOOworCQkJd3N0YXRzLnF1YWwgPSAwOyAvKiBYWFggV2hlcmUgZG8gSSBnZXQgdGhhdCBpbmZvIGZyb20gPz8/ICovCisJCQl3c3RhdHMubGV2ZWwgPSAwOworCQkJd3N0YXRzLnVwZGF0ZWQgPSAwOworCQkJLyogVXBkYXRlIHNweSByZWNvcmRzICovCisJCQl3aXJlbGVzc19zcHlfdXBkYXRlKGFpLT5kZXYsIHNhLCAmd3N0YXRzKTsKKwkJfQorI2VuZGlmIC8qIFdJUkVMRVNTX1NQWSAqLworCisJCXNrYi0+ZGV2ID0gYWktPmRldjsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBhaS0+ZGV2KTsKKwkJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQluZXRpZl9yeChza2IpOworCX0KK2JhZHJ4OgorCWlmIChyeGQudmFsaWQgPT0gMCkgeworCQlyeGQudmFsaWQgPSAxOworCQlyeGQucmR5ID0gMDsKKwkJcnhkLmxlbiA9IFBLVFNJWkU7CisJCW1lbWNweV90b2lvKGFpLT5yeGZpZHNbMF0uY2FyZF9yYW1fb2ZmLCAmcnhkLCBzaXplb2YocnhkKSk7CisJfQorfQorCit2b2lkIG1waV9yZWNlaXZlXzgwMl8xMSAoc3RydWN0IGFpcm9faW5mbyAqYWkpCit7CisJUnhGaWQgcnhkOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXUxNiBmYywgbGVuLCBoZHJsZW4gPSAwOworI3ByYWdtYSBwYWNrKDEpCisJc3RydWN0IHsKKwkJdTE2IHN0YXR1cywgbGVuOworCQl1OCByc3NpWzJdOworCQl1OCByYXRlOworCQl1OCBmcmVxOworCQl1MTYgdG1wWzRdOworCX0gaGRyOworI3ByYWdtYSBwYWNrKCkKKwl1MTYgZ2FwOworCXUxNiAqYnVmZmVyOworCWNoYXIgKnB0ciA9IGFpLT5yeGZpZHNbMF0udmlydHVhbF9ob3N0X2FkZHIrNDsKKworCW1lbWNweV9mcm9taW8oJnJ4ZCwgYWktPnJ4Zmlkc1swXS5jYXJkX3JhbV9vZmYsIHNpemVvZihyeGQpKTsKKwltZW1jcHkgKChjaGFyICopJmhkciwgcHRyLCBzaXplb2YoaGRyKSk7CisJcHRyICs9IHNpemVvZihoZHIpOworCS8qIEJhZCBDUkMuIElnbm9yZSBwYWNrZXQgKi8KKwlpZiAobGUxNl90b19jcHUoaGRyLnN0YXR1cykgJiAyKQorCQloZHIubGVuID0gMDsKKwlpZiAoYWktPndpZmlkZXYgPT0gTlVMTCkKKwkJaGRyLmxlbiA9IDA7CisJbGVuID0gbGUxNl90b19jcHUoaGRyLmxlbik7CisJaWYgKGxlbiA+IDIzMTIpIHsKKwkJcHJpbnRrKCBLRVJOX0VSUiAiYWlybzogQmFkIHNpemUgJWRcbiIsIGxlbiApOworCQlnb3RvIGJhZHJ4OworCX0KKwlpZiAobGVuID09IDApCisJCWdvdG8gYmFkcng7CisKKwltZW1jcHkgKChjaGFyICopJmZjLCBwdHIsIHNpemVvZihmYykpOworCWZjID0gbGUxNl90b19jcHUoZmMpOworCXN3aXRjaCAoZmMgJiAweGMpIHsKKwkJY2FzZSA0OgorCQkJaWYgKChmYyAmIDB4ZTApID09IDB4YzApCisJCQkJaGRybGVuID0gMTA7CisJCQllbHNlCisJCQkJaGRybGVuID0gMTY7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJaWYgKChmYyYweDMwMCk9PTB4MzAwKXsKKwkJCQloZHJsZW4gPSAzMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCWhkcmxlbiA9IDI0OworCX0KKworCXNrYiA9IGRldl9hbGxvY19za2IoIGxlbiArIGhkcmxlbiArIDIgKTsKKwlpZiAoICFza2IgKSB7CisJCWFpLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCWdvdG8gYmFkcng7CisJfQorCWJ1ZmZlciA9ICh1MTYqKXNrYl9wdXQgKHNrYiwgbGVuICsgaGRybGVuKTsKKwltZW1jcHkgKChjaGFyICopYnVmZmVyLCBwdHIsIGhkcmxlbik7CisJcHRyICs9IGhkcmxlbjsKKwlpZiAoaGRybGVuID09IDI0KQorCQlwdHIgKz0gNjsKKwltZW1jcHkgKChjaGFyICopJmdhcCwgcHRyLCBzaXplb2YoZ2FwKSk7CisJcHRyICs9IHNpemVvZihnYXApOworCWdhcCA9IGxlMTZfdG9fY3B1KGdhcCk7CisJaWYgKGdhcCkgeworCQlpZiAoZ2FwIDw9IDgpCisJCQlwdHIgKz0gZ2FwOworCQllbHNlCisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAiYWlybzogZ2FwbGVuIHRvbyBiaWcuIFByb2JsZW1zIHdpbGwgZm9sbG93Li4uXG4iKTsKKwl9CisJbWVtY3B5ICgoY2hhciAqKWJ1ZmZlciArIGhkcmxlbiwgcHRyLCBsZW4pOworCXB0ciArPSBsZW47CisjaWZkZWYgSVdfV0lSRUxFU1NfU1BZCSAgLyogZGVmaW5lZCBpbiBpd19oYW5kbGVyLmggKi8KKwlpZiAoYWktPnNweV9kYXRhLnNweV9udW1iZXIgPiAwKSB7CisJCWNoYXIgKnNhOworCQlzdHJ1Y3QgaXdfcXVhbGl0eSB3c3RhdHM7CisJCS8qIFByZXBhcmUgc3B5IGRhdGEgOiBhZGRyICsgcXVhbCAqLworCQlzYSA9IChjaGFyKilidWZmZXIgKyAxMDsKKwkJd3N0YXRzLnF1YWwgPSBoZHIucnNzaVswXTsKKwkJaWYgKGFpLT5yc3NpKQorCQkJd3N0YXRzLmxldmVsID0gMHgxMDAgLSBhaS0+cnNzaVtoZHIucnNzaVsxXV0ucnNzaWRCbTsKKwkJZWxzZQorCQkJd3N0YXRzLmxldmVsID0gKGhkci5yc3NpWzFdICsgMzIxKSAvIDI7CisJCXdzdGF0cy51cGRhdGVkID0gMzsKKwkJLyogVXBkYXRlIHNweSByZWNvcmRzICovCisJCXdpcmVsZXNzX3NweV91cGRhdGUoYWktPmRldiwgc2EsICZ3c3RhdHMpOworCX0KKyNlbmRpZiAvKiBJV19XSVJFTEVTU19TUFkgKi8KKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisJc2tiLT5kZXYgPSBhaS0+d2lmaWRldjsKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyXzIpOworCXNrYi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJbmV0aWZfcngoIHNrYiApOworYmFkcng6CisJaWYgKHJ4ZC52YWxpZCA9PSAwKSB7CisJCXJ4ZC52YWxpZCA9IDE7CisJCXJ4ZC5yZHkgPSAwOworCQlyeGQubGVuID0gUEtUU0laRTsKKwkJbWVtY3B5X3RvaW8oYWktPnJ4Zmlkc1swXS5jYXJkX3JhbV9vZmYsICZyeGQsIHNpemVvZihyeGQpKTsKKwl9Cit9CisKK3N0YXRpYyB1MTYgc2V0dXBfY2FyZChzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTggKm1hYywgaW50IGxvY2spCit7CisJQ21kIGNtZDsKKwlSZXNwIHJzcDsKKwlpbnQgc3RhdHVzOworCWludCBpOworCVNzaWRSaWQgbXlTc2lkOworCXUxNiBsYXN0aW5kZXg7CisJV2VwS2V5UmlkIHdrcjsKKwlpbnQgcmM7CisKKwltZW1zZXQoICZteVNzaWQsIDAsIHNpemVvZiggbXlTc2lkICkgKTsKKwlpZiAoYWktPmZsYXNoKSB7CisJCWtmcmVlIChhaS0+Zmxhc2gpOworCQlhaS0+Zmxhc2ggPSBOVUxMOworCX0KKworCS8qIFRoZSBOT1AgaXMgdGhlIGZpcnN0IHN0ZXAgaW4gZ2V0dGluZyB0aGUgY2FyZCBnb2luZyAqLworCWNtZC5jbWQgPSBOT1A7CisJY21kLnBhcm0wID0gY21kLnBhcm0xID0gY21kLnBhcm0yID0gMDsKKwlpZiAobG9jayAmJiBkb3duX2ludGVycnVwdGlibGUoJmFpLT5zZW0pKQorCQlyZXR1cm4gRVJST1I7CisJaWYgKCBpc3N1ZWNvbW1hbmQoIGFpLCAmY21kLCAmcnNwICkgIT0gU1VDQ0VTUyApIHsKKwkJaWYgKGxvY2spCisJCQl1cCgmYWktPnNlbSk7CisJCXJldHVybiBFUlJPUjsKKwl9CisJZGlzYWJsZV9NQUMoIGFpLCAwKTsKKworCS8vIExldCdzIGZpZ3VyZSBvdXQgaWYgd2UgbmVlZCB0byB1c2UgdGhlIEFVWCBwb3J0CisJaWYgKCF0ZXN0X2JpdChGTEFHX01QSSwmYWktPmZsYWdzKSkgeworCQljbWQuY21kID0gQ01EX0VOQUJMRUFVWDsKKwkJaWYgKGlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCkgIT0gU1VDQ0VTUykgeworCQkJaWYgKGxvY2spCisJCQkJdXAoJmFpLT5zZW0pOworCQkJcHJpbnRrKEtFUk5fRVJSICJhaXJvOiBFcnJvciBjaGVja2luZyBmb3IgQVVYIHBvcnRcbiIpOworCQkJcmV0dXJuIEVSUk9SOworCQl9CisJCWlmICghYXV4X2JhcCB8fCByc3Auc3RhdHVzICYgMHhmZjAwKSB7CisJCQlhaS0+YmFwX3JlYWQgPSBmYXN0X2JhcF9yZWFkOworCQkJcHJpbnRrKEtFUk5fREVCVUcgImFpcm86IERvaW5nIGZhc3QgYmFwX3JlYWRzXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWFpLT5iYXBfcmVhZCA9IGF1eF9iYXBfcmVhZDsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJhaXJvOiBEb2luZyBBVVggYmFwX3JlYWRzXG4iKTsKKwkJfQorCX0KKwlpZiAobG9jaykKKwkJdXAoJmFpLT5zZW0pOworCWlmIChhaS0+Y29uZmlnLmxlbiA9PSAwKSB7CisJCXRkc1Jzc2lSaWQgcnNzaV9yaWQ7CisJCUNhcGFiaWxpdHlSaWQgY2FwX3JpZDsKKworCQlpZiAoYWktPkFQTGlzdCkgeworCQkJa2ZyZWUoYWktPkFQTGlzdCk7CisJCQlhaS0+QVBMaXN0ID0gTlVMTDsKKwkJfQorCQlpZiAoYWktPlNTSUQpIHsKKwkJCWtmcmVlKGFpLT5TU0lEKTsKKwkJCWFpLT5TU0lEID0gTlVMTDsKKwkJfQorCQkvLyBnZW5lcmFsIGNvbmZpZ3VyYXRpb24gKHJlYWQvbW9kaWZ5L3dyaXRlKQorCQlzdGF0dXMgPSByZWFkQ29uZmlnUmlkKGFpLCBsb2NrKTsKKwkJaWYgKCBzdGF0dXMgIT0gU1VDQ0VTUyApIHJldHVybiBFUlJPUjsKKworCQlzdGF0dXMgPSByZWFkQ2FwYWJpbGl0eVJpZChhaSwgJmNhcF9yaWQsIGxvY2spOworCQlpZiAoIHN0YXR1cyAhPSBTVUNDRVNTICkgcmV0dXJuIEVSUk9SOworCisJCXN0YXR1cyA9IFBDNDUwMF9yZWFkcmlkKGFpLFJJRF9SU1NJLCZyc3NpX3JpZCxzaXplb2YocnNzaV9yaWQpLGxvY2spOworCQlpZiAoIHN0YXR1cyA9PSBTVUNDRVNTICkgeworCQkJaWYgKGFpLT5yc3NpIHx8IChhaS0+cnNzaSA9IGttYWxsb2MoNTEyLCBHRlBfS0VSTkVMKSkgIT0gTlVMTCkKKwkJCQltZW1jcHkoYWktPnJzc2ksICh1OCopJnJzc2lfcmlkICsgMiwgNTEyKTsKKwkJfQorCQllbHNlIHsKKwkJCWlmIChhaS0+cnNzaSkgeworCQkJCWtmcmVlKGFpLT5yc3NpKTsKKwkJCQlhaS0+cnNzaSA9IE5VTEw7CisJCQl9CisJCQlpZiAoY2FwX3JpZC5zb2Z0Q2FwICYgOCkKKwkJCQlhaS0+Y29uZmlnLnJtb2RlIHw9IFJYTU9ERV9OT1JNQUxJWkVEX1JTU0k7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWlybzogdW5rbm93biByZWNlaXZlZCBzaWduYWwgbGV2ZWwgc2NhbGVcbiIpOworCQl9CisJCWFpLT5jb25maWcub3Btb2RlID0gYWRob2MgPyBNT0RFX1NUQV9JQlNTIDogTU9ERV9TVEFfRVNTOworCQlhaS0+Y29uZmlnLmF1dGhUeXBlID0gQVVUSF9PUEVOOworCQlhaS0+Y29uZmlnLm1vZHVsYXRpb24gPSBNT0RfQ0NLOworCisjaWZkZWYgTUlDU1VQUE9SVAorCQlpZiAoKGNhcF9yaWQubGVuPj1zaXplb2YoY2FwX3JpZCkpICYmIChjYXBfcmlkLmV4dFNvZnRDYXAmMSkgJiYKKwkJICAgIChtaWNzZXR1cChhaSkgPT0gU1VDQ0VTUykpIHsKKwkJCWFpLT5jb25maWcub3Btb2RlIHw9IE1PREVfTUlDOworCQkJc2V0X2JpdChGTEFHX01JQ19DQVBBQkxFLCAmYWktPmZsYWdzKTsKKwkJfQorI2VuZGlmCisKKwkJLyogU2F2ZSBvZmYgdGhlIE1BQyAqLworCQlmb3IoIGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKyApIHsKKwkJCW1hY1tpXSA9IGFpLT5jb25maWcubWFjQWRkcltpXTsKKwkJfQorCisJCS8qIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55IGluc21vZCBjb25maWd1cmVkCisJCSAgIHJhdGVzIHRvIGFkZCAqLworCQlpZiAoIHJhdGVzWzBdICkgeworCQkJaW50IGkgPSAwOworCQkJbWVtc2V0KGFpLT5jb25maWcucmF0ZXMsMCxzaXplb2YoYWktPmNvbmZpZy5yYXRlcykpOworCQkJZm9yKCBpID0gMDsgaSA8IDggJiYgcmF0ZXNbaV07IGkrKyApIHsKKwkJCQlhaS0+Y29uZmlnLnJhdGVzW2ldID0gcmF0ZXNbaV07CisJCQl9CisJCX0KKwkJaWYgKCBiYXNpY19yYXRlID4gMCApIHsKKwkJCWludCBpOworCQkJZm9yKCBpID0gMDsgaSA8IDg7IGkrKyApIHsKKwkJCQlpZiAoIGFpLT5jb25maWcucmF0ZXNbaV0gPT0gYmFzaWNfcmF0ZSB8fAorCQkJCSAgICAgIWFpLT5jb25maWcucmF0ZXMgKSB7CisJCQkJCWFpLT5jb25maWcucmF0ZXNbaV0gPSBiYXNpY19yYXRlIHwgMHg4MDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwl9CisKKwkvKiBTZXR1cCB0aGUgU1NJRHMgaWYgcHJlc2VudCAqLworCWlmICggc3NpZHNbMF0gKSB7CisJCWludCBpOworCQlmb3IoIGkgPSAwOyBpIDwgMyAmJiBzc2lkc1tpXTsgaSsrICkgeworCQkJbXlTc2lkLnNzaWRzW2ldLmxlbiA9IHN0cmxlbihzc2lkc1tpXSk7CisJCQlpZiAoIG15U3NpZC5zc2lkc1tpXS5sZW4gPiAzMiApCisJCQkJbXlTc2lkLnNzaWRzW2ldLmxlbiA9IDMyOworCQkJbWVtY3B5KG15U3NpZC5zc2lkc1tpXS5zc2lkLCBzc2lkc1tpXSwKKwkJCSAgICAgICBteVNzaWQuc3NpZHNbaV0ubGVuKTsKKwkJfQorCQlteVNzaWQubGVuID0gc2l6ZW9mKG15U3NpZCk7CisJfQorCisJc3RhdHVzID0gd3JpdGVDb25maWdSaWQoYWksIGxvY2spOworCWlmICggc3RhdHVzICE9IFNVQ0NFU1MgKSByZXR1cm4gRVJST1I7CisKKwkvKiBTZXQgdXAgdGhlIFNTSUQgbGlzdCAqLworCWlmICggc3NpZHNbMF0gKSB7CisJCXN0YXR1cyA9IHdyaXRlU3NpZFJpZChhaSwgJm15U3NpZCwgbG9jayk7CisJCWlmICggc3RhdHVzICE9IFNVQ0NFU1MgKSByZXR1cm4gRVJST1I7CisJfQorCisJc3RhdHVzID0gZW5hYmxlX01BQyhhaSwgJnJzcCwgbG9jayk7CisJaWYgKCBzdGF0dXMgIT0gU1VDQ0VTUyB8fCAocnNwLnN0YXR1cyAmIDB4RkYwMCkgIT0gMCkgeworCQlwcmludGsoIEtFUk5fRVJSICJhaXJvOiBCYWQgTUFDIGVuYWJsZSByZWFzb24gPSAleCwgcmlkID0gJXgsIG9mZnNldCA9ICVkXG4iLCByc3AucnNwMCwgcnNwLnJzcDEsIHJzcC5yc3AyICk7CisJCXJldHVybiBFUlJPUjsKKwl9CisKKwkvKiBHcmFiIHRoZSBpbml0aWFsIHdlcCBrZXksIHdlIGdvdHRhIHNhdmUgaXQgZm9yIGF1dG9fd2VwICovCisJcmMgPSByZWFkV2VwS2V5UmlkKGFpLCAmd2tyLCAxLCBsb2NrKTsKKwlpZiAocmMgPT0gU1VDQ0VTUykgZG8geworCQlsYXN0aW5kZXggPSB3a3Iua2luZGV4OworCQlpZiAod2tyLmtpbmRleCA9PSAweGZmZmYpIHsKKwkJCWFpLT5kZWZpbmRleCA9IHdrci5tYWNbMF07CisJCX0KKwkJcmMgPSByZWFkV2VwS2V5UmlkKGFpLCAmd2tyLCAwLCBsb2NrKTsKKwl9IHdoaWxlKGxhc3RpbmRleCAhPSB3a3Iua2luZGV4KTsKKworCWlmIChhdXRvX3dlcCkgeworCQlhaS0+ZXhwaXJlcyA9IFJVTl9BVCgzKkhaKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhaS0+dGhyX3dhaXQpOworCX0KKworCXJldHVybiBTVUNDRVNTOworfQorCitzdGF0aWMgdTE2IGlzc3VlY29tbWFuZChzdHJ1Y3QgYWlyb19pbmZvICphaSwgQ21kICpwQ21kLCBSZXNwICpwUnNwKSB7CisgICAgICAgIC8vIEltIHJlYWxseSBwYXJhbm9pZCBhYm91dCBsZXR0aW5nIGl0IHJ1biBmb3JldmVyIQorCWludCBtYXhfdHJpZXMgPSA2MDAwMDA7CisKKwlpZiAoSU40NTAwKGFpLCBFVlNUQVQpICYgRVZfQ01EKQorCQlPVVQ0NTAwKGFpLCBFVkFDSywgRVZfQ01EKTsKKworCU9VVDQ1MDAoYWksIFBBUkFNMCwgcENtZC0+cGFybTApOworCU9VVDQ1MDAoYWksIFBBUkFNMSwgcENtZC0+cGFybTEpOworCU9VVDQ1MDAoYWksIFBBUkFNMiwgcENtZC0+cGFybTIpOworCU9VVDQ1MDAoYWksIENPTU1BTkQsIHBDbWQtPmNtZCk7CisKKwl3aGlsZSAobWF4X3RyaWVzLS0gJiYgKElONDUwMChhaSwgRVZTVEFUKSAmIEVWX0NNRCkgPT0gMCkgeworCQlpZiAoKElONDUwMChhaSwgQ09NTUFORCkpID09IHBDbWQtPmNtZCkKKwkJCS8vIFBDNDUwMCBkaWRuJ3Qgbm90aWNlIGNvbW1hbmQsIHRyeSBhZ2FpbgorCQkJT1VUNDUwMChhaSwgQ09NTUFORCwgcENtZC0+Y21kKTsKKwkJaWYgKCFpbl9hdG9taWMoKSAmJiAobWF4X3RyaWVzICYgMjU1KSA9PSAwKQorCQkJc2NoZWR1bGUoKTsKKwl9CisKKwlpZiAoIG1heF90cmllcyA9PSAtMSApIHsKKwkJcHJpbnRrKCBLRVJOX0VSUgorCQkJImFpcm86IE1heCB0cmllcyBleGNlZWRlZCB3aGVuIGlzc3VlaW5nIGNvbW1hbmRcbiIgKTsKKwkJaWYgKElONDUwMChhaSwgQ09NTUFORCkgJiBDT01NQU5EX0JVU1kpCisJCQlPVVQ0NTAwKGFpLCBFVkFDSywgRVZfQ0xFQVJDT01NQU5EQlVTWSk7CisJCXJldHVybiBFUlJPUjsKKwl9CisKKwkvLyBjb21tYW5kIGNvbXBsZXRlZAorCXBSc3AtPnN0YXR1cyA9IElONDUwMChhaSwgU1RBVFVTKTsKKwlwUnNwLT5yc3AwID0gSU40NTAwKGFpLCBSRVNQMCk7CisJcFJzcC0+cnNwMSA9IElONDUwMChhaSwgUkVTUDEpOworCXBSc3AtPnJzcDIgPSBJTjQ1MDAoYWksIFJFU1AyKTsKKwlpZiAoKHBSc3AtPnN0YXR1cyAmIDB4ZmYwMCkhPTAgJiYgcENtZC0+Y21kICE9IENNRF9TT0ZUUkVTRVQpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiYWlybzogY21kPSAleFxuIiwgcENtZC0+Y21kKTsKKwkJcHJpbnRrIChLRVJOX0VSUiAiYWlybzogc3RhdHVzPSAleFxuIiwgcFJzcC0+c3RhdHVzKTsKKwkJcHJpbnRrIChLRVJOX0VSUiAiYWlybzogUnNwMD0gJXhcbiIsIHBSc3AtPnJzcDApOworCQlwcmludGsgKEtFUk5fRVJSICJhaXJvOiBSc3AxPSAleFxuIiwgcFJzcC0+cnNwMSk7CisJCXByaW50ayAoS0VSTl9FUlIgImFpcm86IFJzcDI9ICV4XG4iLCBwUnNwLT5yc3AyKTsKKwl9CisKKwkvLyBjbGVhciBzdHVjayBjb21tYW5kIGJ1c3kgaWYgbmVjZXNzYXJ5CisJaWYgKElONDUwMChhaSwgQ09NTUFORCkgJiBDT01NQU5EX0JVU1kpIHsKKwkJT1VUNDUwMChhaSwgRVZBQ0ssIEVWX0NMRUFSQ09NTUFOREJVU1kpOworCX0KKwkvLyBhY2tub3dsZWRnZSBwcm9jZXNzaW5nIHRoZSBzdGF0dXMvcmVzcG9uc2UKKwlPVVQ0NTAwKGFpLCBFVkFDSywgRVZfQ01EKTsKKworCXJldHVybiBTVUNDRVNTOworfQorCisvKiBTZXRzIHVwIHRoZSBiYXAgdG8gc3RhcnQgZXhjaGFuZ2UgZGF0YS4gIHdoaWNoYmFwIHNob3VsZAorICogYmUgb25lIG9mIHRoZSBCQVAwIG9yIEJBUDEgZGVmaW5lcy4gIExvY2tzIHNob3VsZCBiZSBoZWxkIGJlZm9yZQorICogY2FsbGluZyEgKi8KK3N0YXRpYyBpbnQgYmFwX3NldHVwKHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MTYgcmlkLCB1MTYgb2Zmc2V0LCBpbnQgd2hpY2hiYXAgKQoreworCWludCB0aW1lb3V0ID0gNTA7CisJaW50IG1heF90cmllcyA9IDM7CisKKwlPVVQ0NTAwKGFpLCBTRUxFQ1QwK3doaWNoYmFwLCByaWQpOworCU9VVDQ1MDAoYWksIE9GRlNFVDArd2hpY2hiYXAsIG9mZnNldCk7CisJd2hpbGUgKDEpIHsKKwkJaW50IHN0YXR1cyA9IElONDUwMChhaSwgT0ZGU0VUMCt3aGljaGJhcCk7CisJCWlmIChzdGF0dXMgJiBCQVBfQlVTWSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpc24ndCByZWFsbHkgYSB0aW1lb3V0LCBidXQgaXRzIGtpbmRhCisJCQkgICBjbG9zZSAqLworCQkJaWYgKHRpbWVvdXQtLSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9IGVsc2UgaWYgKCBzdGF0dXMgJiBCQVBfRVJSICkgeworCQkJLyogaW52YWxpZCByaWQgb3Igb2Zmc2V0ICovCisJCQlwcmludGsoIEtFUk5fRVJSICJhaXJvOiBCQVAgZXJyb3IgJXggJWRcbiIsCisJCQkJc3RhdHVzLCB3aGljaGJhcCApOworCQkJcmV0dXJuIEVSUk9SOworCQl9IGVsc2UgaWYgKHN0YXR1cyAmIEJBUF9ET05FKSB7IC8vIHN1Y2Nlc3MKKwkJCXJldHVybiBTVUNDRVNTOworCQl9CisJCWlmICggIShtYXhfdHJpZXMtLSkgKSB7CisJCQlwcmludGsoIEtFUk5fRVJSCisJCQkJImFpcm86IEJBUCBzZXR1cCBlcnJvciB0b28gbWFueSByZXRyaWVzXG4iICk7CisJCQlyZXR1cm4gRVJST1I7CisJCX0KKwkJLy8gLS0gUEM0NTAwIG1pc3NlZCBpdCwgdHJ5IGFnYWluCisJCU9VVDQ1MDAoYWksIFNFTEVDVDArd2hpY2hiYXAsIHJpZCk7CisJCU9VVDQ1MDAoYWksIE9GRlNFVDArd2hpY2hiYXAsIG9mZnNldCk7CisJCXRpbWVvdXQgPSA1MDsKKwl9Cit9CisKKy8qIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSBhdXhfYmFwX3JlYWQuICBUaGlzIGF1eCBmdW5jdGlvbiBhbmQgdGhlCisgICBmb2xsb3dpbmcgdXNlIGNvbmNlcHRzIG5vdCBkb2N1bWVudGVkIGluIHRoZSBkZXZlbG9wZXJzIGd1aWRlLiAgSQorICAgZ290IHRoZW0gZnJvbSBhIHBhdGNoIGdpdmVuIHRvIG15IGJ5IEFpcm9uZXQgKi8KK3N0YXRpYyB1MTYgYXV4X3NldHVwKHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MTYgcGFnZSwKKwkJICAgICB1MTYgb2Zmc2V0LCB1MTYgKmxlbikKK3sKKwl1MTYgbmV4dDsKKworCU9VVDQ1MDAoYWksIEFVWFBBR0UsIHBhZ2UpOworCU9VVDQ1MDAoYWksIEFVWE9GRiwgMCk7CisJbmV4dCA9IElONDUwMChhaSwgQVVYREFUQSk7CisJKmxlbiA9IElONDUwMChhaSwgQVVYREFUQSkmMHhmZjsKKwlpZiAob2Zmc2V0ICE9IDQpIE9VVDQ1MDAoYWksIEFVWE9GRiwgb2Zmc2V0KTsKKwlyZXR1cm4gbmV4dDsKK30KKworLyogcmVxdWlyZXMgY2FsbCB0byBiYXBfc2V0dXAoKSBmaXJzdCAqLworc3RhdGljIGludCBhdXhfYmFwX3JlYWQoc3RydWN0IGFpcm9faW5mbyAqYWksIHUxNiAqcHUxNkRzdCwKKwkJCWludCBieXRlbGVuLCBpbnQgd2hpY2hiYXApCit7CisJdTE2IGxlbjsKKwl1MTYgcGFnZTsKKwl1MTYgb2Zmc2V0OworCXUxNiBuZXh0OworCWludCB3b3JkczsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFpLT5hdXhfbG9jaywgZmxhZ3MpOworCXBhZ2UgPSBJTjQ1MDAoYWksIFNXUzArd2hpY2hiYXApOworCW9mZnNldCA9IElONDUwMChhaSwgU1dTMit3aGljaGJhcCk7CisJbmV4dCA9IGF1eF9zZXR1cChhaSwgcGFnZSwgb2Zmc2V0LCAmbGVuKTsKKwl3b3JkcyA9IChieXRlbGVuKzEpPj4xOworCisJZm9yIChpPTA7IGk8d29yZHM7KSB7CisJCWludCBjb3VudDsKKwkJY291bnQgPSAobGVuPj4xKSA8ICh3b3Jkcy1pKSA/IChsZW4+PjEpIDogKHdvcmRzLWkpOworCQlpZiAoICFkbzhiaXRJTyApCisJCQlpbnN3KCBhaS0+ZGV2LT5iYXNlX2FkZHIrREFUQTArd2hpY2hiYXAsCisJCQkgICAgICBwdTE2RHN0K2ksY291bnQgKTsKKwkJZWxzZQorCQkJaW5zYiggYWktPmRldi0+YmFzZV9hZGRyK0RBVEEwK3doaWNoYmFwLAorCQkJICAgICAgcHUxNkRzdCtpLCBjb3VudCA8PCAxICk7CisJCWkgKz0gY291bnQ7CisJCWlmIChpPHdvcmRzKSB7CisJCQluZXh0ID0gYXV4X3NldHVwKGFpLCBuZXh0LCA0LCAmbGVuKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhaS0+YXV4X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworCisvKiByZXF1aXJlcyBjYWxsIHRvIGJhcF9zZXR1cCgpIGZpcnN0ICovCitzdGF0aWMgaW50IGZhc3RfYmFwX3JlYWQoc3RydWN0IGFpcm9faW5mbyAqYWksIHUxNiAqcHUxNkRzdCwKKwkJCSBpbnQgYnl0ZWxlbiwgaW50IHdoaWNoYmFwKQoreworCWJ5dGVsZW4gPSAoYnl0ZWxlbiArIDEpICYgKH4xKTsgLy8gcm91bmQgdXAgdG8gZXZlbiB2YWx1ZQorCWlmICggIWRvOGJpdElPICkKKwkJaW5zdyggYWktPmRldi0+YmFzZV9hZGRyK0RBVEEwK3doaWNoYmFwLCBwdTE2RHN0LCBieXRlbGVuPj4xICk7CisJZWxzZQorCQlpbnNiKCBhaS0+ZGV2LT5iYXNlX2FkZHIrREFUQTArd2hpY2hiYXAsIHB1MTZEc3QsIGJ5dGVsZW4gKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyogcmVxdWlyZXMgY2FsbCB0byBiYXBfc2V0dXAoKSBmaXJzdCAqLworc3RhdGljIGludCBiYXBfd3JpdGUoc3RydWN0IGFpcm9faW5mbyAqYWksIGNvbnN0IHUxNiAqcHUxNlNyYywKKwkJICAgICBpbnQgYnl0ZWxlbiwgaW50IHdoaWNoYmFwKQoreworCWJ5dGVsZW4gPSAoYnl0ZWxlbiArIDEpICYgKH4xKTsgLy8gcm91bmQgdXAgdG8gZXZlbiB2YWx1ZQorCWlmICggIWRvOGJpdElPICkKKwkJb3V0c3coIGFpLT5kZXYtPmJhc2VfYWRkcitEQVRBMCt3aGljaGJhcCwKKwkJICAgICAgIHB1MTZTcmMsIGJ5dGVsZW4+PjEgKTsKKwllbHNlCisJCW91dHNiKCBhaS0+ZGV2LT5iYXNlX2FkZHIrREFUQTArd2hpY2hiYXAsIHB1MTZTcmMsIGJ5dGVsZW4gKTsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBQQzQ1MDBfYWNjZXNzcmlkKHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MTYgcmlkLCB1MTYgYWNjbWQpCit7CisJQ21kIGNtZDsgLyogZm9yIGlzc3VpbmcgY29tbWFuZHMgKi8KKwlSZXNwIHJzcDsgLyogcmVzcG9uc2UgZnJvbSBjb21tYW5kcyAqLworCXUxNiBzdGF0dXM7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5jbWQgPSBhY2NtZDsKKwljbWQucGFybTAgPSByaWQ7CisJc3RhdHVzID0gaXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKTsKKwlpZiAoc3RhdHVzICE9IDApIHJldHVybiBzdGF0dXM7CisJaWYgKCAocnNwLnN0YXR1cyAmIDB4N0YwMCkgIT0gMCkgeworCQlyZXR1cm4gKGFjY21kIDw8IDgpICsgKHJzcC5yc3AwICYgMHhGRik7CisJfQorCXJldHVybiAwOworfQorCisvKiAgTm90ZSwgdGhhdCB3ZSBhcmUgdXNpbmcgQkFQMSB3aGljaCBpcyBhbHNvIHVzZWQgYnkgdHJhbnNtaXQsIHNvCisgKiAgd2UgbXVzdCBnZXQgYSBsb2NrLiAqLworc3RhdGljIGludCBQQzQ1MDBfcmVhZHJpZChzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTE2IHJpZCwgdm9pZCAqcEJ1ZiwgaW50IGxlbiwgaW50IGxvY2spCit7CisJdTE2IHN0YXR1czsKKyAgICAgICAgaW50IHJjID0gU1VDQ0VTUzsKKworCWlmIChsb2NrKSB7CisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFpLT5zZW0pKQorCQkJcmV0dXJuIEVSUk9SOworCX0KKwlpZiAodGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpIHsKKwkJQ21kIGNtZDsKKwkJUmVzcCByc3A7CisKKwkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwkJbWVtc2V0KCZyc3AsIDAsIHNpemVvZihyc3ApKTsKKwkJYWktPmNvbmZpZ19kZXNjLnJpZF9kZXNjLnZhbGlkID0gMTsKKwkJYWktPmNvbmZpZ19kZXNjLnJpZF9kZXNjLmxlbiA9IFJJRFNJWkU7CisJCWFpLT5jb25maWdfZGVzYy5yaWRfZGVzYy5yaWQgPSAwOworCQlhaS0+Y29uZmlnX2Rlc2MucmlkX2Rlc2MuaG9zdF9hZGRyID0gYWktPnJpZGJ1czsKKworCQljbWQuY21kID0gQ01EX0FDQ0VTUzsKKwkJY21kLnBhcm0wID0gcmlkOworCisJCW1lbWNweV90b2lvKGFpLT5jb25maWdfZGVzYy5jYXJkX3JhbV9vZmYsCisJCQkmYWktPmNvbmZpZ19kZXNjLnJpZF9kZXNjLCBzaXplb2YoUmlkKSk7CisKKwkJcmMgPSBpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApOworCisJCWlmIChyc3Auc3RhdHVzICYgMHg3ZjAwKQorCQkJcmMgPSByc3AucnNwMDsKKwkJaWYgKCFyYykKKwkJCW1lbWNweShwQnVmLCBhaS0+Y29uZmlnX2Rlc2MudmlydHVhbF9ob3N0X2FkZHIsIGxlbik7CisJCWdvdG8gZG9uZTsKKwl9IGVsc2UgeworCQlpZiAoKHN0YXR1cyA9IFBDNDUwMF9hY2Nlc3NyaWQoYWksIHJpZCwgQ01EX0FDQ0VTUykpIT1TVUNDRVNTKSB7CisJICAgICAgICAgICAgICAgIHJjID0gc3RhdHVzOworCSAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisJICAgICAgICB9CisJCWlmIChiYXBfc2V0dXAoYWksIHJpZCwgMCwgQkFQMSkgIT0gU1VDQ0VTUykgeworCQkJcmMgPSBFUlJPUjsKKwkgICAgICAgICAgICAgICAgZ290byBkb25lOworCSAgICAgICAgfQorCQkvLyByZWFkIHRoZSByaWQgbGVuZ3RoIGZpZWxkCisJCWJhcF9yZWFkKGFpLCBwQnVmLCAyLCBCQVAxKTsKKwkJLy8gbGVuZ3RoIGZvciByZW1haW5pbmcgcGFydCBvZiByaWQKKwkJbGVuID0gbWluKGxlbiwgKGludClsZTE2X3RvX2NwdSgqKHUxNiopcEJ1ZikpIC0gMjsKKworCQlpZiAoIGxlbiA8PSAyICkgeworCQkJcHJpbnRrKCBLRVJOX0VSUgorCQkJImFpcm86IFJpZCAleCBoYXMgYSBsZW5ndGggb2YgJWQgd2hpY2ggaXMgdG9vIHNob3J0XG4iLAorCQkJCShpbnQpcmlkLCAoaW50KWxlbiApOworCQkJcmMgPSBFUlJPUjsKKwkgICAgICAgICAgICAgICAgZ290byBkb25lOworCQl9CisJCS8vIHJlYWQgcmVtYWluZGVyIG9mIHRoZSByaWQKKwkJcmMgPSBiYXBfcmVhZChhaSwgKCh1MTYqKXBCdWYpKzEsIGxlbiwgQkFQMSk7CisJfQorZG9uZToKKwlpZiAobG9jaykKKwkJdXAoJmFpLT5zZW0pOworCXJldHVybiByYzsKK30KKworLyogIE5vdGUsIHRoYXQgd2UgYXJlIHVzaW5nIEJBUDEgd2hpY2ggaXMgYWxzbyB1c2VkIGJ5IHRyYW5zbWl0LCBzbworICogIG1ha2Ugc3VyZSB0aGlzIGlzbnQgY2FsbGVkIHdoZW4gYSB0cmFuc21pdCBpcyBoYXBwZW5pbmcgKi8KK3N0YXRpYyBpbnQgUEM0NTAwX3dyaXRlcmlkKHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MTYgcmlkLAorCQkJICAgY29uc3Qgdm9pZCAqcEJ1ZiwgaW50IGxlbiwgaW50IGxvY2spCit7CisJdTE2IHN0YXR1czsKKwlpbnQgcmMgPSBTVUNDRVNTOworCisJKih1MTYqKXBCdWYgPSBjcHVfdG9fbGUxNigodTE2KWxlbik7CisKKwlpZiAobG9jaykgeworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhaS0+c2VtKSkKKwkJCXJldHVybiBFUlJPUjsKKwl9CisJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCZhaS0+ZmxhZ3MpKSB7CisJCUNtZCBjbWQ7CisJCVJlc3AgcnNwOworCisJCWlmICh0ZXN0X2JpdChGTEFHX0VOQUJMRUQsICZhaS0+ZmxhZ3MpKQorCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJIiVzOiBNQUMgc2hvdWxkIGJlIGRpc2FibGVkIChyaWQ9JTA0eClcbiIsCisJCQkJX19GVU5DVElPTl9fLCByaWQpOworCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCQltZW1zZXQoJnJzcCwgMCwgc2l6ZW9mKHJzcCkpOworCisJCWFpLT5jb25maWdfZGVzYy5yaWRfZGVzYy52YWxpZCA9IDE7CisJCWFpLT5jb25maWdfZGVzYy5yaWRfZGVzYy5sZW4gPSAqKCh1MTYgKilwQnVmKTsKKwkJYWktPmNvbmZpZ19kZXNjLnJpZF9kZXNjLnJpZCA9IDA7CisKKwkJY21kLmNtZCA9IENNRF9XUklURVJJRDsKKwkJY21kLnBhcm0wID0gcmlkOworCisJCW1lbWNweV90b2lvKGFpLT5jb25maWdfZGVzYy5jYXJkX3JhbV9vZmYsCisJCQkmYWktPmNvbmZpZ19kZXNjLnJpZF9kZXNjLCBzaXplb2YoUmlkKSk7CisKKwkJaWYgKGxlbiA8IDQgfHwgbGVuID4gMjA0NykgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbGVuPSVkXG4iLF9fRlVOQ1RJT05fXyxsZW4pOworCQkJcmMgPSAtMTsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweSgoY2hhciAqKWFpLT5jb25maWdfZGVzYy52aXJ0dWFsX2hvc3RfYWRkciwKKwkJCQlwQnVmLCBsZW4pOworCisJCQlyYyA9IGlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCk7CisJCQlpZiAoKHJjICYgMHhmZjAwKSAhPSAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogV3JpdGUgcmlkIEVycm9yICVkXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18scmMpOworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENtZD0lMDR4XG4iLAorCQkJCQkJX19GVU5DVElPTl9fLGNtZC5jbWQpOworCQkJfQorCisJCQlpZiAoKHJzcC5zdGF0dXMgJiAweDdmMDApKQorCQkJCXJjID0gcnNwLnJzcDA7CisJCX0KKwl9IGVsc2UgeworCQkvLyAtLS0gZmlyc3QgYWNjZXNzIHNvIHRoYXQgd2UgY2FuIHdyaXRlIHRoZSByaWQgZGF0YQorCQlpZiAoIChzdGF0dXMgPSBQQzQ1MDBfYWNjZXNzcmlkKGFpLCByaWQsIENNRF9BQ0NFU1MpKSAhPSAwKSB7CisJICAgICAgICAgICAgICAgIHJjID0gc3RhdHVzOworCSAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisJICAgICAgICB9CisJCS8vIC0tLSBub3cgd3JpdGUgdGhlIHJpZCBkYXRhCisJCWlmIChiYXBfc2V0dXAoYWksIHJpZCwgMCwgQkFQMSkgIT0gU1VDQ0VTUykgeworCSAgICAgICAgICAgICAgICByYyA9IEVSUk9SOworCSAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisJICAgICAgICB9CisJCWJhcF93cml0ZShhaSwgcEJ1ZiwgbGVuLCBCQVAxKTsKKwkJLy8gLS0tbm93IGNvbW1pdCB0aGUgcmlkIGRhdGEKKwkJcmMgPSBQQzQ1MDBfYWNjZXNzcmlkKGFpLCByaWQsIDB4MTAwfENNRF9BQ0NFU1MpOworCX0KK2RvbmU6CisJaWYgKGxvY2spCisJCXVwKCZhaS0+c2VtKTsKKyAgICAgICAgcmV0dXJuIHJjOworfQorCisvKiBBbGxvY2F0ZXMgYSBGSUQgdG8gYmUgdXNlZCBmb3IgdHJhbnNtaXR0aW5nIHBhY2tldHMuICBXZSBvbmx5IHVzZQorICAgb25lIGZvciBub3cuICovCitzdGF0aWMgdTE2IHRyYW5zbWl0X2FsbG9jYXRlKHN0cnVjdCBhaXJvX2luZm8gKmFpLCBpbnQgbGVuUGF5bG9hZCwgaW50IHJhdykKK3sKKwl1bnNpZ25lZCBpbnQgbG9vcCA9IDMwMDA7CisJQ21kIGNtZDsKKwlSZXNwIHJzcDsKKwl1MTYgdHhGaWQ7CisJdTE2IHR4Q29udHJvbDsKKworCWNtZC5jbWQgPSBDTURfQUxMT0NBVEVUWDsKKwljbWQucGFybTAgPSBsZW5QYXlsb2FkOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFpLT5zZW0pKQorCQlyZXR1cm4gRVJST1I7CisJaWYgKGlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCkgIT0gU1VDQ0VTUykgeworCQl0eEZpZCA9IEVSUk9SOworCQlnb3RvIGRvbmU7CisJfQorCWlmICggKHJzcC5zdGF0dXMgJiAweEZGMDApICE9IDApIHsKKwkJdHhGaWQgPSBFUlJPUjsKKwkJZ290byBkb25lOworCX0KKwkvKiB3YWl0IGZvciB0aGUgYWxsb2NhdGUgZXZlbnQvaW5kaWNhdGlvbgorCSAqIEl0IG1ha2VzIG1lIGtpbmQgb2YgbmVydm91cyB0aGF0IHRoaXMgY2FuIGp1c3Qgc2l0IGhlcmUgYW5kIHNwaW4sCisJICogYnV0IGluIHByYWN0aWNlIGl0IG9ubHkgbG9vcHMgbGlrZSBmb3VyIHRpbWVzLiAqLworCXdoaWxlICgoKElONDUwMChhaSwgRVZTVEFUKSAmIEVWX0FMTE9DKSA9PSAwKSAmJiAtLWxvb3ApOworCWlmICghbG9vcCkgeworCQl0eEZpZCA9IEVSUk9SOworCQlnb3RvIGRvbmU7CisJfQorCisJLy8gZ2V0IHRoZSBhbGxvY2F0ZWQgZmlkIGFuZCBhY2tub3dsZWRnZQorCXR4RmlkID0gSU40NTAwKGFpLCBUWEFMTE9DRklEKTsKKwlPVVQ0NTAwKGFpLCBFVkFDSywgRVZfQUxMT0MpOworCisJLyogIFRoZSBDQVJEIGlzIHByZXR0eSBjb29sIHNpbmNlIGl0IGNvbnZlcnRzIHRoZSBldGhlcm5ldCBwYWNrZXQKKwkgKiAgaW50byA4MDIuMTEuICBBbHNvIG5vdGUgdGhhdCB3ZSBkb24ndCByZWxlYXNlIHRoZSBGSUQgc2luY2Ugd2UKKwkgKiAgd2lsbCBiZSB1c2luZyB0aGUgc2FtZSBvbmUgb3ZlciBhbmQgb3ZlciBhZ2Fpbi4gKi8KKwkvKiAgV2Ugb25seSBoYXZlIHRvIHNldHVwIHRoZSBjb250cm9sIG9uY2Ugc2luY2Ugd2UgYXJlIG5vdAorCSAqICByZWxlYXNpbmcgdGhlIGZpZC4gKi8KKwlpZiAocmF3KQorCQl0eENvbnRyb2wgPSBjcHVfdG9fbGUxNihUWENUTF9UWE9LIHwgVFhDVExfVFhFWCB8IFRYQ1RMXzgwMl8xMQorCQkJfCBUWENUTF9FVEhFUk5FVCB8IFRYQ1RMX05PUkVMRUFTRSk7CisJZWxzZQorCQl0eENvbnRyb2wgPSBjcHVfdG9fbGUxNihUWENUTF9UWE9LIHwgVFhDVExfVFhFWCB8IFRYQ1RMXzgwMl8zCisJCQl8IFRYQ1RMX0VUSEVSTkVUIHwgVFhDVExfTk9SRUxFQVNFKTsKKwlpZiAoYmFwX3NldHVwKGFpLCB0eEZpZCwgMHgwMDA4LCBCQVAxKSAhPSBTVUNDRVNTKQorCQl0eEZpZCA9IEVSUk9SOworCWVsc2UKKwkJYmFwX3dyaXRlKGFpLCAmdHhDb250cm9sLCBzaXplb2YodHhDb250cm9sKSwgQkFQMSk7CisKK2RvbmU6CisJdXAoJmFpLT5zZW0pOworCisJcmV0dXJuIHR4RmlkOworfQorCisvKiBJbiBnZW5lcmFsIEJBUDEgaXMgZGVkaWNhdGVkIHRvIHRyYW5zbWl0aW5nIHBhY2tldHMuICBIb3dldmVyLAorICAgc2luY2Ugd2UgbmVlZCBhIEJBUCB3aGVuIGFjY2Vzc2luZyBSSURzLCB3ZSBhbHNvIHVzZSBCQVAxIGZvciB0aGF0LgorICAgTWFrZSBzdXJlIHRoZSBCQVAxIHNwaW5sb2NrIGlzIGhlbGQgd2hlbiB0aGlzIGlzIGNhbGxlZC4gKi8KK3N0YXRpYyBpbnQgdHJhbnNtaXRfODAyXzNfcGFja2V0KHN0cnVjdCBhaXJvX2luZm8gKmFpLCBpbnQgbGVuLCBjaGFyICpwUGFja2V0KQoreworCXUxNiBwYXlsb2FkTGVuOworCUNtZCBjbWQ7CisJUmVzcCByc3A7CisJaW50IG1pY2xlbiA9IDA7CisJdTE2IHR4RmlkID0gbGVuOworCU1JQ0J1ZmZlciBwTWljOworCisJbGVuID4+PSAxNjsKKworCWlmIChsZW4gPD0gRVRIX0FMRU4gKiAyKSB7CisJCXByaW50ayggS0VSTl9XQVJOSU5HICJTaG9ydCBwYWNrZXQgJWRcbiIsIGxlbiApOworCQlyZXR1cm4gRVJST1I7CisJfQorCWxlbiAtPSBFVEhfQUxFTiAqIDI7CisKKyNpZmRlZiBNSUNTVVBQT1JUCisJaWYgKHRlc3RfYml0KEZMQUdfTUlDX0NBUEFCTEUsICZhaS0+ZmxhZ3MpICYmIGFpLT5taWNzdGF0cy5lbmFibGVkICYmIAorCSAgICAobnRvaHMoKCh1MTYgKilwUGFja2V0KVs2XSkgIT0gMHg4ODhFKSkgeworCQlpZiAoZW5jYXBzdWxhdGUoYWksKGV0aGVySGVhZCAqKXBQYWNrZXQsJnBNaWMsbGVuKSAhPSBTVUNDRVNTKQorCQkJcmV0dXJuIEVSUk9SOworCQltaWNsZW4gPSBzaXplb2YocE1pYyk7CisJfQorI2VuZGlmCisKKwkvLyBwYWNrZXQgaXMgZGVzdGluYXRpb25bNl0sIHNvdXJjZVs2XSwgcGF5bG9hZFtsZW4tMTJdCisJLy8gd3JpdGUgdGhlIHBheWxvYWQgbGVuZ3RoIGFuZCBkc3Qvc3JjL3BheWxvYWQKKwlpZiAoYmFwX3NldHVwKGFpLCB0eEZpZCwgMHgwMDM2LCBCQVAxKSAhPSBTVUNDRVNTKSByZXR1cm4gRVJST1I7CisJLyogVGhlIGhhcmR3YXJlIGFkZHJlc3NlcyBhcmVuJ3QgY291bnRlZCBhcyBwYXJ0IG9mIHRoZSBwYXlsb2FkLCBzbworCSAqIHdlIGhhdmUgdG8gc3VidHJhY3QgdGhlIDEyIGJ5dGVzIGZvciB0aGUgYWRkcmVzc2VzIG9mZiAqLworCXBheWxvYWRMZW4gPSBjcHVfdG9fbGUxNihsZW4gKyBtaWNsZW4pOworCWJhcF93cml0ZShhaSwgJnBheWxvYWRMZW4sIHNpemVvZihwYXlsb2FkTGVuKSxCQVAxKTsKKwliYXBfd3JpdGUoYWksIChjb25zdCB1MTYqKXBQYWNrZXQsIHNpemVvZihldGhlckhlYWQpLCBCQVAxKTsKKwlpZiAobWljbGVuKQorCQliYXBfd3JpdGUoYWksIChjb25zdCB1MTYqKSZwTWljLCBtaWNsZW4sIEJBUDEpOworCWJhcF93cml0ZShhaSwgKGNvbnN0IHUxNiopKHBQYWNrZXQgKyBzaXplb2YoZXRoZXJIZWFkKSksIGxlbiwgQkFQMSk7CisJLy8gaXNzdWUgdGhlIHRyYW5zbWl0IGNvbW1hbmQKKwltZW1zZXQoICZjbWQsIDAsIHNpemVvZiggY21kICkgKTsKKwljbWQuY21kID0gQ01EX1RSQU5TTUlUOworCWNtZC5wYXJtMCA9IHR4RmlkOworCWlmIChpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApICE9IFNVQ0NFU1MpIHJldHVybiBFUlJPUjsKKwlpZiAoIChyc3Auc3RhdHVzICYgMHhGRjAwKSAhPSAwKSByZXR1cm4gRVJST1I7CisJcmV0dXJuIFNVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgdHJhbnNtaXRfODAyXzExX3BhY2tldChzdHJ1Y3QgYWlyb19pbmZvICphaSwgaW50IGxlbiwgY2hhciAqcFBhY2tldCkKK3sKKwl1MTYgZmMsIHBheWxvYWRMZW47CisJQ21kIGNtZDsKKwlSZXNwIHJzcDsKKwlpbnQgaGRybGVuOworCXN0cnVjdCB7CisJCXU4IGFkZHI0W0VUSF9BTEVOXTsKKwkJdTE2IGdhcGxlbjsKKwkJdTggZ2FwWzZdOworCX0gZ2FwOworCXUxNiB0eEZpZCA9IGxlbjsKKwlsZW4gPj49IDE2OworCWdhcC5nYXBsZW4gPSA2OworCisJZmMgPSBsZTE2X3RvX2NwdSgqKGNvbnN0IHUxNiopcFBhY2tldCk7CisJc3dpdGNoIChmYyAmIDB4YykgeworCQljYXNlIDQ6CisJCQlpZiAoKGZjICYgMHhlMCkgPT0gMHhjMCkKKwkJCQloZHJsZW4gPSAxMDsKKwkJCWVsc2UKKwkJCQloZHJsZW4gPSAxNjsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQlpZiAoKGZjJjB4MzAwKT09MHgzMDApeworCQkJCWhkcmxlbiA9IDMwOworCQkJCWJyZWFrOworCQkJfQorCQlkZWZhdWx0OgorCQkJaGRybGVuID0gMjQ7CisJfQorCisJaWYgKGxlbiA8IGhkcmxlbikgeworCQlwcmludGsoIEtFUk5fV0FSTklORyAiU2hvcnQgcGFja2V0ICVkXG4iLCBsZW4gKTsKKwkJcmV0dXJuIEVSUk9SOworCX0KKworCS8qIHBhY2tldCBpcyA4MDIuMTEgaGVhZGVyICsgIHBheWxvYWQKKwkgKiB3cml0ZSB0aGUgcGF5bG9hZCBsZW5ndGggYW5kIGRzdC9zcmMvcGF5bG9hZCAqLworCWlmIChiYXBfc2V0dXAoYWksIHR4RmlkLCA2LCBCQVAxKSAhPSBTVUNDRVNTKSByZXR1cm4gRVJST1I7CisJLyogVGhlIDgwMi4xMSBoZWFkZXIgYXJlbid0IGNvdW50ZWQgYXMgcGFydCBvZiB0aGUgcGF5bG9hZCwgc28KKwkgKiB3ZSBoYXZlIHRvIHN1YnRyYWN0IHRoZSBoZWFkZXIgYnl0ZXMgb2ZmICovCisJcGF5bG9hZExlbiA9IGNwdV90b19sZTE2KGxlbi1oZHJsZW4pOworCWJhcF93cml0ZShhaSwgJnBheWxvYWRMZW4sIHNpemVvZihwYXlsb2FkTGVuKSxCQVAxKTsKKwlpZiAoYmFwX3NldHVwKGFpLCB0eEZpZCwgMHgwMDE0LCBCQVAxKSAhPSBTVUNDRVNTKSByZXR1cm4gRVJST1I7CisJYmFwX3dyaXRlKGFpLCAoY29uc3QgdTE2KilwUGFja2V0LCBoZHJsZW4sIEJBUDEpOworCWJhcF93cml0ZShhaSwgaGRybGVuID09IDMwID8KKwkJKGNvbnN0IHUxNiopJmdhcC5nYXBsZW4gOiAoY29uc3QgdTE2KikmZ2FwLCAzOCAtIGhkcmxlbiwgQkFQMSk7CisKKwliYXBfd3JpdGUoYWksIChjb25zdCB1MTYqKShwUGFja2V0ICsgaGRybGVuKSwgbGVuIC0gaGRybGVuLCBCQVAxKTsKKwkvLyBpc3N1ZSB0aGUgdHJhbnNtaXQgY29tbWFuZAorCW1lbXNldCggJmNtZCwgMCwgc2l6ZW9mKCBjbWQgKSApOworCWNtZC5jbWQgPSBDTURfVFJBTlNNSVQ7CisJY21kLnBhcm0wID0gdHhGaWQ7CisJaWYgKGlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCkgIT0gU1VDQ0VTUykgcmV0dXJuIEVSUk9SOworCWlmICggKHJzcC5zdGF0dXMgJiAweEZGMDApICE9IDApIHJldHVybiBFUlJPUjsKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyoKKyAqICBUaGlzIGlzIHRoZSBwcm9jX2ZzIHJvdXRpbmVzLiAgSXQgaXMgYSBiaXQgbWVzc2llciB0aGFuIEkgd291bGQKKyAqICBsaWtlISAgRmVlbCBmcmVlIHRvIGNsZWFuIGl0IHVwIQorICovCisKK3N0YXRpYyBzc2l6ZV90IHByb2NfcmVhZCggc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgIGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgIHNpemVfdCBsZW4sCisJCQkgIGxvZmZfdCAqb2Zmc2V0KTsKKworc3RhdGljIHNzaXplX3QgcHJvY193cml0ZSggc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgc2l6ZV90IGxlbiwKKwkJCSAgIGxvZmZfdCAqb2Zmc2V0ICk7CitzdGF0aWMgaW50IHByb2NfY2xvc2UoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICk7CisKK3N0YXRpYyBpbnQgcHJvY19zdGF0c19vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApOworc3RhdGljIGludCBwcm9jX3N0YXRzZGVsdGFfb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKTsKK3N0YXRpYyBpbnQgcHJvY19zdGF0dXNfb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKTsKK3N0YXRpYyBpbnQgcHJvY19TU0lEX29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICk7CitzdGF0aWMgaW50IHByb2NfQVBMaXN0X29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICk7CitzdGF0aWMgaW50IHByb2NfQlNTTGlzdF9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApOworc3RhdGljIGludCBwcm9jX2NvbmZpZ19vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApOworc3RhdGljIGludCBwcm9jX3dlcGtleV9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3N0YXRzZGVsdGFfb3BzID0geworCS5yZWFkCQk9IHByb2NfcmVhZCwKKwkub3BlbgkJPSBwcm9jX3N0YXRzZGVsdGFfb3BlbiwKKwkucmVsZWFzZQk9IHByb2NfY2xvc2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfc3RhdHNfb3BzID0geworCS5yZWFkCQk9IHByb2NfcmVhZCwKKwkub3BlbgkJPSBwcm9jX3N0YXRzX29wZW4sCisJLnJlbGVhc2UJPSBwcm9jX2Nsb3NlCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3N0YXR1c19vcHMgPSB7CisJLnJlYWQJCT0gcHJvY19yZWFkLAorCS5vcGVuCQk9IHByb2Nfc3RhdHVzX29wZW4sCisJLnJlbGVhc2UJPSBwcm9jX2Nsb3NlCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX1NTSURfb3BzID0geworCS5yZWFkCQk9IHByb2NfcmVhZCwKKwkud3JpdGUJCT0gcHJvY193cml0ZSwKKwkub3BlbgkJPSBwcm9jX1NTSURfb3BlbiwKKwkucmVsZWFzZQk9IHByb2NfY2xvc2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfQlNTTGlzdF9vcHMgPSB7CisJLnJlYWQJCT0gcHJvY19yZWFkLAorCS53cml0ZQkJPSBwcm9jX3dyaXRlLAorCS5vcGVuCQk9IHByb2NfQlNTTGlzdF9vcGVuLAorCS5yZWxlYXNlCT0gcHJvY19jbG9zZQorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19BUExpc3Rfb3BzID0geworCS5yZWFkCQk9IHByb2NfcmVhZCwKKwkud3JpdGUJCT0gcHJvY193cml0ZSwKKwkub3BlbgkJPSBwcm9jX0FQTGlzdF9vcGVuLAorCS5yZWxlYXNlCT0gcHJvY19jbG9zZQorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19jb25maWdfb3BzID0geworCS5yZWFkCQk9IHByb2NfcmVhZCwKKwkud3JpdGUJCT0gcHJvY193cml0ZSwKKwkub3BlbgkJPSBwcm9jX2NvbmZpZ19vcGVuLAorCS5yZWxlYXNlCT0gcHJvY19jbG9zZQorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY193ZXBrZXlfb3BzID0geworCS5yZWFkCQk9IHByb2NfcmVhZCwKKwkud3JpdGUJCT0gcHJvY193cml0ZSwKKwkub3BlbgkJPSBwcm9jX3dlcGtleV9vcGVuLAorCS5yZWxlYXNlCT0gcHJvY19jbG9zZQorfTsKKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYWlyb19lbnRyeTsKKworc3RydWN0IHByb2NfZGF0YSB7CisJaW50IHJlbGVhc2VfYnVmZmVyOworCWludCByZWFkbGVuOworCWNoYXIgKnJidWZmZXI7CisJaW50IHdyaXRlbGVuOworCWludCBtYXh3cml0ZWxlbjsKKwljaGFyICp3YnVmZmVyOworCXZvaWQgKCpvbl9jbG9zZSkgKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKK307CisKKyNpZm5kZWYgU0VUUFJPQ19PUFMKKyNkZWZpbmUgU0VUUFJPQ19PUFMoZW50cnksIG9wcykgKGVudHJ5KS0+cHJvY19mb3BzID0gJihvcHMpCisjZW5kaWYKKworc3RhdGljIGludCBzZXR1cF9wcm9jX2VudHJ5KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgYWlyb19pbmZvICphcHJpdiApIHsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OworCS8qIEZpcnN0IHNldHVwIHRoZSBkZXZpY2UgZGlyZWN0b3J5ICovCisJc3RyY3B5KGFwcml2LT5wcm9jX25hbWUsZGV2LT5uYW1lKTsKKwlhcHJpdi0+cHJvY19lbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KGFwcml2LT5wcm9jX25hbWUsCisJCQkJCSAgICAgIFNfSUZESVJ8YWlyb19wZXJtLAorCQkJCQkgICAgICBhaXJvX2VudHJ5KTsKKyAgICAgICAgYXByaXYtPnByb2NfZW50cnktPnVpZCA9IHByb2NfdWlkOworICAgICAgICBhcHJpdi0+cHJvY19lbnRyeS0+Z2lkID0gcHJvY19naWQ7CisgICAgICAgIGFwcml2LT5wcm9jX2VudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCisJLyogU2V0dXAgdGhlIFN0YXRzRGVsdGEgKi8KKwllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJTdGF0c0RlbHRhIiwKKwkJCQkgIFNfSUZSRUcgfCAoU19JUlVHTyZwcm9jX3Blcm0pLAorCQkJCSAgYXByaXYtPnByb2NfZW50cnkpOworICAgICAgICBlbnRyeS0+dWlkID0gcHJvY191aWQ7CisgICAgICAgIGVudHJ5LT5naWQgPSBwcm9jX2dpZDsKKwllbnRyeS0+ZGF0YSA9IGRldjsKKyAgICAgICAgZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJU0VUUFJPQ19PUFMoZW50cnksIHByb2Nfc3RhdHNkZWx0YV9vcHMpOworCisJLyogU2V0dXAgdGhlIFN0YXRzICovCisJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiU3RhdHMiLAorCQkJCSAgU19JRlJFRyB8IChTX0lSVUdPJnByb2NfcGVybSksCisJCQkJICBhcHJpdi0+cHJvY19lbnRyeSk7CisgICAgICAgIGVudHJ5LT51aWQgPSBwcm9jX3VpZDsKKyAgICAgICAgZW50cnktPmdpZCA9IHByb2NfZ2lkOworCWVudHJ5LT5kYXRhID0gZGV2OworICAgICAgICBlbnRyeS0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlTRVRQUk9DX09QUyhlbnRyeSwgcHJvY19zdGF0c19vcHMpOworCisJLyogU2V0dXAgdGhlIFN0YXR1cyAqLworCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoIlN0YXR1cyIsCisJCQkJICBTX0lGUkVHIHwgKFNfSVJVR08mcHJvY19wZXJtKSwKKwkJCQkgIGFwcml2LT5wcm9jX2VudHJ5KTsKKyAgICAgICAgZW50cnktPnVpZCA9IHByb2NfdWlkOworICAgICAgICBlbnRyeS0+Z2lkID0gcHJvY19naWQ7CisJZW50cnktPmRhdGEgPSBkZXY7CisgICAgICAgIGVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCVNFVFBST0NfT1BTKGVudHJ5LCBwcm9jX3N0YXR1c19vcHMpOworCisJLyogU2V0dXAgdGhlIENvbmZpZyAqLworCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoIkNvbmZpZyIsCisJCQkJICBTX0lGUkVHIHwgcHJvY19wZXJtLAorCQkJCSAgYXByaXYtPnByb2NfZW50cnkpOworICAgICAgICBlbnRyeS0+dWlkID0gcHJvY191aWQ7CisgICAgICAgIGVudHJ5LT5naWQgPSBwcm9jX2dpZDsKKwllbnRyeS0+ZGF0YSA9IGRldjsKKyAgICAgICAgZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJU0VUUFJPQ19PUFMoZW50cnksIHByb2NfY29uZmlnX29wcyk7CisKKwkvKiBTZXR1cCB0aGUgU1NJRCAqLworCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoIlNTSUQiLAorCQkJCSAgU19JRlJFRyB8IHByb2NfcGVybSwKKwkJCQkgIGFwcml2LT5wcm9jX2VudHJ5KTsKKyAgICAgICAgZW50cnktPnVpZCA9IHByb2NfdWlkOworICAgICAgICBlbnRyeS0+Z2lkID0gcHJvY19naWQ7CisJZW50cnktPmRhdGEgPSBkZXY7CisgICAgICAgIGVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCVNFVFBST0NfT1BTKGVudHJ5LCBwcm9jX1NTSURfb3BzKTsKKworCS8qIFNldHVwIHRoZSBBUExpc3QgKi8KKwllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJBUExpc3QiLAorCQkJCSAgU19JRlJFRyB8IHByb2NfcGVybSwKKwkJCQkgIGFwcml2LT5wcm9jX2VudHJ5KTsKKyAgICAgICAgZW50cnktPnVpZCA9IHByb2NfdWlkOworICAgICAgICBlbnRyeS0+Z2lkID0gcHJvY19naWQ7CisJZW50cnktPmRhdGEgPSBkZXY7CisgICAgICAgIGVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOworCVNFVFBST0NfT1BTKGVudHJ5LCBwcm9jX0FQTGlzdF9vcHMpOworCisJLyogU2V0dXAgdGhlIEJTU0xpc3QgKi8KKwllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJCU1NMaXN0IiwKKwkJCQkgIFNfSUZSRUcgfCBwcm9jX3Blcm0sCisJCQkJICBhcHJpdi0+cHJvY19lbnRyeSk7CisJZW50cnktPnVpZCA9IHByb2NfdWlkOworCWVudHJ5LT5naWQgPSBwcm9jX2dpZDsKKwllbnRyeS0+ZGF0YSA9IGRldjsKKyAgICAgICAgZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJU0VUUFJPQ19PUFMoZW50cnksIHByb2NfQlNTTGlzdF9vcHMpOworCisJLyogU2V0dXAgdGhlIFdlcEtleSAqLworCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoIldlcEtleSIsCisJCQkJICBTX0lGUkVHIHwgcHJvY19wZXJtLAorCQkJCSAgYXByaXYtPnByb2NfZW50cnkpOworICAgICAgICBlbnRyeS0+dWlkID0gcHJvY191aWQ7CisgICAgICAgIGVudHJ5LT5naWQgPSBwcm9jX2dpZDsKKwllbnRyeS0+ZGF0YSA9IGRldjsKKyAgICAgICAgZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJU0VUUFJPQ19PUFMoZW50cnksIHByb2Nfd2Vwa2V5X29wcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YWtlZG93bl9wcm9jX2VudHJ5KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBhaXJvX2luZm8gKmFwcml2ICkgeworCWlmICggIWFwcml2LT5wcm9jX2VudHJ5LT5uYW1lbGVuICkgcmV0dXJuIDA7CisJcmVtb3ZlX3Byb2NfZW50cnkoIlN0YXRzIixhcHJpdi0+cHJvY19lbnRyeSk7CisJcmVtb3ZlX3Byb2NfZW50cnkoIlN0YXRzRGVsdGEiLGFwcml2LT5wcm9jX2VudHJ5KTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiU3RhdHVzIixhcHJpdi0+cHJvY19lbnRyeSk7CisJcmVtb3ZlX3Byb2NfZW50cnkoIkNvbmZpZyIsYXByaXYtPnByb2NfZW50cnkpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJTU0lEIixhcHJpdi0+cHJvY19lbnRyeSk7CisJcmVtb3ZlX3Byb2NfZW50cnkoIkFQTGlzdCIsYXByaXYtPnByb2NfZW50cnkpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJCU1NMaXN0IixhcHJpdi0+cHJvY19lbnRyeSk7CisJcmVtb3ZlX3Byb2NfZW50cnkoIldlcEtleSIsYXByaXYtPnByb2NfZW50cnkpOworCXJlbW92ZV9wcm9jX2VudHJ5KGFwcml2LT5wcm9jX25hbWUsYWlyb19lbnRyeSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgV2hhdCB3ZSB3YW50IGZyb20gdGhlIHByb2NfZnMgaXMgdG8gYmUgYWJsZSB0byBlZmZpY2llbnRseSByZWFkCisgKiAgYW5kIHdyaXRlIHRoZSBjb25maWd1cmF0aW9uLiAgVG8gZG8gdGhpcywgd2Ugd2FudCB0byByZWFkIHRoZQorICogIGNvbmZpZ3VyYXRpb24gd2hlbiB0aGUgZmlsZSBpcyBvcGVuZWQgYW5kIHdyaXRlIGl0IHdoZW4gdGhlIGZpbGUgaXMKKyAqICBjbG9zZWQuICBTbyBiYXNpY2FsbHkgd2UgYWxsb2NhdGUgYSByZWFkIGJ1ZmZlciBhdCBvcGVuIGFuZCBmaWxsIGl0CisgKiAgd2l0aCBkYXRhLCBhbmQgYWxsb2NhdGUgYSB3cml0ZSBidWZmZXIgYW5kIHJlYWQgaXQgYXQgY2xvc2UuCisgKi8KKworLyoKKyAqICBUaGUgcmVhZCByb3V0aW5lIGlzIGdlbmVyaWMsIGl0IHJlbGllcyBvbiB0aGUgcHJlYWxsb2NhdGVkIHJidWZmZXIKKyAqICB0byBzdXBwbHkgdGhlIGRhdGEuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHByb2NfcmVhZCggc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgIGNoYXIgX191c2VyICpidWZmZXIsCisJCQkgIHNpemVfdCBsZW4sCisJCQkgIGxvZmZfdCAqb2Zmc2V0ICkKK3sKKwlsb2ZmX3QgcG9zID0gKm9mZnNldDsKKwlzdHJ1Y3QgcHJvY19kYXRhICpwcml2ID0gKHN0cnVjdCBwcm9jX2RhdGEqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmICghcHJpdi0+cmJ1ZmZlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocG9zIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBvcyA+PSBwcml2LT5yZWFkbGVuKQorCQlyZXR1cm4gMDsKKwlpZiAobGVuID4gcHJpdi0+cmVhZGxlbiAtIHBvcykKKwkJbGVuID0gcHJpdi0+cmVhZGxlbiAtIHBvczsKKwlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgcHJpdi0+cmJ1ZmZlciArIHBvcywgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJKm9mZnNldCA9IHBvcyArIGxlbjsKKwlyZXR1cm4gbGVuOworfQorCisvKgorICogIFRoZSB3cml0ZSByb3V0aW5lIGlzIGdlbmVyaWMsIGl0IGZpbGxzIGluIGEgcHJlYWxsb2NhdGVkIHJidWZmZXIKKyAqICB0byBzdXBwbHkgdGhlIGRhdGEuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHByb2Nfd3JpdGUoIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgIHNpemVfdCBsZW4sCisJCQkgICBsb2ZmX3QgKm9mZnNldCApCit7CisJbG9mZl90IHBvcyA9ICpvZmZzZXQ7CisJc3RydWN0IHByb2NfZGF0YSAqcHJpdiA9IChzdHJ1Y3QgcHJvY19kYXRhKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIXByaXYtPndidWZmZXIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBvcyA8IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChwb3MgPj0gcHJpdi0+bWF4d3JpdGVsZW4pCisJCXJldHVybiAwOworCWlmIChsZW4gPiBwcml2LT5tYXh3cml0ZWxlbiAtIHBvcykKKwkJbGVuID0gcHJpdi0+bWF4d3JpdGVsZW4gLSBwb3M7CisJaWYgKGNvcHlfZnJvbV91c2VyKHByaXYtPndidWZmZXIgKyBwb3MsIGJ1ZmZlciwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKCBwb3MgKyBsZW4gPiBwcml2LT53cml0ZWxlbiApCisJCXByaXYtPndyaXRlbGVuID0gbGVuICsgZmlsZS0+Zl9wb3M7CisJKm9mZnNldCA9IHBvcyArIGxlbjsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHByb2Nfc3RhdHVzX29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICkgeworCXN0cnVjdCBwcm9jX2RhdGEgKmRhdGE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShpbm9kZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRwLT5kYXRhOworCXN0cnVjdCBhaXJvX2luZm8gKmFwcml2ID0gZGV2LT5wcml2OworCUNhcGFiaWxpdHlSaWQgY2FwX3JpZDsKKwlTdGF0dXNSaWQgc3RhdHVzX3JpZDsKKwlpbnQgaTsKKworCWlmICgoZmlsZS0+cHJpdmF0ZV9kYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHByb2NfZGF0YSApLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGZpbGUtPnByaXZhdGVfZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBwcm9jX2RhdGEpKTsKKwlkYXRhID0gKHN0cnVjdCBwcm9jX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKChkYXRhLT5yYnVmZmVyID0ga21hbGxvYyggMjA0OCwgR0ZQX0tFUk5FTCApKSA9PSBOVUxMKSB7CisJCWtmcmVlIChmaWxlLT5wcml2YXRlX2RhdGEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZWFkU3RhdHVzUmlkKGFwcml2LCAmc3RhdHVzX3JpZCwgMSk7CisJcmVhZENhcGFiaWxpdHlSaWQoYXByaXYsICZjYXBfcmlkLCAxKTsKKworICAgICAgICBpID0gc3ByaW50ZihkYXRhLT5yYnVmZmVyLCAiU3RhdHVzOiAlcyVzJXMlcyVzJXMlcyVzJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c19yaWQubW9kZSAmIDEgPyAiQ0ZHICI6ICIiLAorICAgICAgICAgICAgICAgICAgICBzdGF0dXNfcmlkLm1vZGUgJiAyID8gIkFDVCAiOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3JpZC5tb2RlICYgMHgxMCA/ICJTWU4gIjogIiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c19yaWQubW9kZSAmIDB4MjAgPyAiTE5LICI6ICIiLAorICAgICAgICAgICAgICAgICAgICBzdGF0dXNfcmlkLm1vZGUgJiAweDQwID8gIkxFQVAgIjogIiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c19yaWQubW9kZSAmIDB4ODAgPyAiUFJJViAiOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3JpZC5tb2RlICYgMHgxMDAgPyAiS0VZICI6ICIiLAorICAgICAgICAgICAgICAgICAgICBzdGF0dXNfcmlkLm1vZGUgJiAweDIwMCA/ICJXRVAgIjogIiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c19yaWQubW9kZSAmIDB4ODAwMCA/ICJFUlIgIjogIiIpOworCXNwcmludGYoIGRhdGEtPnJidWZmZXIraSwgIk1vZGU6ICV4XG4iCisJCSAiU2lnbmFsIFN0cmVuZ3RoOiAlZFxuIgorCQkgIlNpZ25hbCBRdWFsaXR5OiAlZFxuIgorCQkgIlNTSUQ6ICUtLipzXG4iCisJCSAiQVA6ICUtLjE2c1xuIgorCQkgIkZyZXE6ICVkXG4iCisJCSAiQml0UmF0ZTogJWRtYnNcbiIKKwkJICJEcml2ZXIgVmVyc2lvbjogJXNcbiIKKwkJICJEZXZpY2U6ICVzXG5NYW51ZmFjdHVyZXI6ICVzXG5GaXJtd2FyZSBWZXJzaW9uOiAlc1xuIgorCQkgIlJhZGlvIHR5cGU6ICV4XG5Db3VudHJ5OiAleFxuSGFyZHdhcmUgVmVyc2lvbjogJXhcbiIKKwkJICJTb2Z0d2FyZSBWZXJzaW9uOiAleFxuU29mdHdhcmUgU3VidmVyc2lvbjogJXhcbiIKKwkJICJCb290IGJsb2NrIHZlcnNpb246ICV4XG4iLAorCQkgKGludClzdGF0dXNfcmlkLm1vZGUsCisJCSAoaW50KXN0YXR1c19yaWQubm9ybWFsaXplZFNpZ25hbFN0cmVuZ3RoLAorCQkgKGludClzdGF0dXNfcmlkLnNpZ25hbFF1YWxpdHksCisJCSAoaW50KXN0YXR1c19yaWQuU1NJRGxlbiwKKwkJIHN0YXR1c19yaWQuU1NJRCwKKwkJIHN0YXR1c19yaWQuYXBOYW1lLAorCQkgKGludClzdGF0dXNfcmlkLmNoYW5uZWwsCisJCSAoaW50KXN0YXR1c19yaWQuY3VycmVudFhtaXRSYXRlLzIsCisJCSB2ZXJzaW9uLAorCQkgY2FwX3JpZC5wcm9kTmFtZSwKKwkJIGNhcF9yaWQubWFuTmFtZSwKKwkJIGNhcF9yaWQucHJvZFZlciwKKwkJIGNhcF9yaWQucmFkaW9UeXBlLAorCQkgY2FwX3JpZC5jb3VudHJ5LAorCQkgY2FwX3JpZC5oYXJkVmVyLAorCQkgKGludCljYXBfcmlkLnNvZnRWZXIsCisJCSAoaW50KWNhcF9yaWQuc29mdFN1YlZlciwKKwkJIChpbnQpY2FwX3JpZC5ib290QmxvY2tWZXIgKTsKKwlkYXRhLT5yZWFkbGVuID0gc3RybGVuKCBkYXRhLT5yYnVmZmVyICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19zdGF0c19yaWRfb3BlbihzdHJ1Y3QgaW5vZGUqLCBzdHJ1Y3QgZmlsZSosIHUxNik7CitzdGF0aWMgaW50IHByb2Nfc3RhdHNkZWx0YV9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZSApIHsKKwlpZiAoZmlsZS0+Zl9tb2RlJkZNT0RFX1dSSVRFKSB7CisJCXJldHVybiBwcm9jX3N0YXRzX3JpZF9vcGVuKGlub2RlLCBmaWxlLCBSSURfU1RBVFNERUxUQUNMRUFSKTsKKwl9CisJcmV0dXJuIHByb2Nfc3RhdHNfcmlkX29wZW4oaW5vZGUsIGZpbGUsIFJJRF9TVEFUU0RFTFRBKTsKK30KKworc3RhdGljIGludCBwcm9jX3N0YXRzX29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICkgeworCXJldHVybiBwcm9jX3N0YXRzX3JpZF9vcGVuKGlub2RlLCBmaWxlLCBSSURfU1RBVFMpOworfQorCitzdGF0aWMgaW50IHByb2Nfc3RhdHNfcmlkX29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdTE2IHJpZCApIHsKKwlzdHJ1Y3QgcHJvY19kYXRhICpkYXRhOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vZGUpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcC0+ZGF0YTsKKwlzdHJ1Y3QgYWlyb19pbmZvICphcHJpdiA9IGRldi0+cHJpdjsKKwlTdGF0c1JpZCBzdGF0czsKKwlpbnQgaSwgajsKKwl1MzIgKnZhbHMgPSBzdGF0cy52YWxzOworCisJaWYgKChmaWxlLT5wcml2YXRlX2RhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhICksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZmlsZS0+cHJpdmF0ZV9kYXRhLCAwLCBzaXplb2Yoc3RydWN0IHByb2NfZGF0YSkpOworCWRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoKGRhdGEtPnJidWZmZXIgPSBrbWFsbG9jKCA0MDk2LCBHRlBfS0VSTkVMICkpID09IE5VTEwpIHsKKwkJa2ZyZWUgKGZpbGUtPnByaXZhdGVfZGF0YSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJlYWRTdGF0c1JpZChhcHJpdiwgJnN0YXRzLCByaWQsIDEpOworCisgICAgICAgIGogPSAwOworCWZvcihpPTA7IHN0YXRzTGFiZWxzW2ldIT0oY2hhciAqKS0xICYmCisJCSAgICBpKjQ8c3RhdHMubGVuOyBpKyspeworCQlpZiAoIXN0YXRzTGFiZWxzW2ldKSBjb250aW51ZTsKKwkJaWYgKGorc3RybGVuKHN0YXRzTGFiZWxzW2ldKSsxNj40MDk2KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgImFpcm86IFBvdGVudGlhbGx5IGRpc2FzdGVyb3VzIGJ1ZmZlciBvdmVyZmxvdyBhdmVydGVkIVxuIik7CisJCQlicmVhazsKKwkJfQorCQlqKz1zcHJpbnRmKGRhdGEtPnJidWZmZXIraiwgIiVzOiAldVxuIiwgc3RhdHNMYWJlbHNbaV0sIHZhbHNbaV0pOworCX0KKwlpZiAoaSo0Pj1zdGF0cy5sZW4peworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiYWlybzogR290IGEgc2hvcnQgcmlkXG4iKTsKKwl9CisJZGF0YS0+cmVhZGxlbiA9IGo7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2RlY191MTYoIGNoYXIgKmJ1ZmZlciwgaW50ICpzdGFydCwgaW50IGxpbWl0ICkgeworCXUxNiB2YWx1ZTsKKwlpbnQgdmFsaWQgPSAwOworCWZvciggdmFsdWUgPSAwOyBidWZmZXJbKnN0YXJ0XSA+PSAnMCcgJiYKKwkJICAgICBidWZmZXJbKnN0YXJ0XSA8PSAnOScgJiYKKwkJICAgICAqc3RhcnQgPCBsaW1pdDsgKCpzdGFydCkrKyApIHsKKwkJdmFsaWQgPSAxOworCQl2YWx1ZSAqPSAxMDsKKwkJdmFsdWUgKz0gYnVmZmVyWypzdGFydF0gLSAnMCc7CisJfQorCWlmICggIXZhbGlkICkgcmV0dXJuIC0xOworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCBhaXJvX2NvbmZpZ19jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIHZvaWQgKnp3cnEsCisJCQkgICAgICBjaGFyICpleHRyYSk7CisKK3N0YXRpYyB2b2lkIHByb2NfY29uZmlnX29uX2Nsb3NlKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApIHsKKwlzdHJ1Y3QgcHJvY19kYXRhICpkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vZGUpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcC0+ZGF0YTsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwljaGFyICpsaW5lOworCisJaWYgKCAhZGF0YS0+d3JpdGVsZW4gKSByZXR1cm47CisKKwlyZWFkQ29uZmlnUmlkKGFpLCAxKTsKKwlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisKKwlsaW5lID0gZGF0YS0+d2J1ZmZlcjsKKwl3aGlsZSggbGluZVswXSApIHsKKy8qKiogTW9kZSBwcm9jZXNzaW5nICovCisJCWlmICggIXN0cm5jbXAoIGxpbmUsICJNb2RlOiAiLCA2ICkgKSB7CisJCQlsaW5lICs9IDY7CisJCQlpZiAoKGFpLT5jb25maWcucm1vZGUgJiAweGZmKSA+PSBSWE1PREVfUkZNT04pCisJCQkJCXNldF9iaXQgKEZMQUdfUkVTRVQsICZhaS0+ZmxhZ3MpOworCQkJYWktPmNvbmZpZy5ybW9kZSAmPSAweGZlMDA7CisJCQljbGVhcl9iaXQgKEZMQUdfODAyXzExLCAmYWktPmZsYWdzKTsKKwkJCWFpLT5jb25maWcub3Btb2RlICY9IDB4RkYwMDsKKwkJCWFpLT5jb25maWcuc2Nhbk1vZGUgPSBTQ0FOTU9ERV9BQ1RJVkU7CisJCQlpZiAoIGxpbmVbMF0gPT0gJ2EnICkgeworCQkJCWFpLT5jb25maWcub3Btb2RlIHw9IDA7CisJCQl9IGVsc2UgeworCQkJCWFpLT5jb25maWcub3Btb2RlIHw9IDE7CisJCQkJaWYgKCBsaW5lWzBdID09ICdyJyApIHsKKwkJCQkJYWktPmNvbmZpZy5ybW9kZSB8PSBSWE1PREVfUkZNT04gfCBSWE1PREVfRElTQUJMRV84MDJfM19IRUFERVI7CisJCQkJCWFpLT5jb25maWcuc2Nhbk1vZGUgPSBTQ0FOTU9ERV9QQVNTSVZFOworCQkJCQlzZXRfYml0IChGTEFHXzgwMl8xMSwgJmFpLT5mbGFncyk7CisJCQkJfSBlbHNlIGlmICggbGluZVswXSA9PSAneScgKSB7CisJCQkJCWFpLT5jb25maWcucm1vZGUgfD0gUlhNT0RFX1JGTU9OX0FOWUJTUyB8IFJYTU9ERV9ESVNBQkxFXzgwMl8zX0hFQURFUjsKKwkJCQkJYWktPmNvbmZpZy5zY2FuTW9kZSA9IFNDQU5NT0RFX1BBU1NJVkU7CisJCQkJCXNldF9iaXQgKEZMQUdfODAyXzExLCAmYWktPmZsYWdzKTsKKwkJCQl9IGVsc2UgaWYgKCBsaW5lWzBdID09ICdsJyApCisJCQkJCWFpLT5jb25maWcucm1vZGUgfD0gUlhNT0RFX0xBTk1PTjsKKwkJCX0KKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJfQorCisvKioqIFJhZGlvIHN0YXR1cyAqLworCQllbHNlIGlmICghc3RybmNtcChsaW5lLCJSYWRpbzogIiwgNykpIHsKKwkJCWxpbmUgKz0gNzsKKwkJCWlmICghc3RybmNtcChsaW5lLCJvZmYiLDMpKSB7CisJCQkJc2V0X2JpdCAoRkxBR19SQURJT19PRkYsICZhaS0+ZmxhZ3MpOworCQkJfSBlbHNlIHsKKwkJCQljbGVhcl9iaXQgKEZMQUdfUkFESU9fT0ZGLCAmYWktPmZsYWdzKTsKKwkJCX0KKwkJfQorLyoqKiBOb2RlTmFtZSBwcm9jZXNzaW5nICovCisJCWVsc2UgaWYgKCAhc3RybmNtcCggbGluZSwgIk5vZGVOYW1lOiAiLCAxMCApICkgeworCQkJaW50IGo7CisKKwkJCWxpbmUgKz0gMTA7CisJCQltZW1zZXQoIGFpLT5jb25maWcubm9kZU5hbWUsIDAsIDE2ICk7CisvKiBEbyB0aGUgbmFtZSwgYXNzdW1lIGEgc3BhY2UgYmV0d2VlbiB0aGUgbW9kZSBhbmQgbm9kZSBuYW1lICovCisJCQlmb3IoIGogPSAwOyBqIDwgMTYgJiYgbGluZVtqXSAhPSAnXG4nOyBqKysgKSB7CisJCQkJYWktPmNvbmZpZy5ub2RlTmFtZVtqXSA9IGxpbmVbal07CisJCQl9CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJCX0KKworLyoqKiBQb3dlck1vZGUgcHJvY2Vzc2luZyAqLworCQllbHNlIGlmICggIXN0cm5jbXAoIGxpbmUsICJQb3dlck1vZGU6ICIsIDExICkgKSB7CisJCQlsaW5lICs9IDExOworCQkJaWYgKCAhc3RybmNtcCggbGluZSwgIlBTUENBTSIsIDYgKSApIHsKKwkJCQlhaS0+Y29uZmlnLnBvd2VyU2F2ZU1vZGUgPSBQT1dFUlNBVkVfUFNQQ0FNOworCQkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJCX0gZWxzZSBpZiAoICFzdHJuY21wKCBsaW5lLCAiUFNQIiwgMyApICkgeworCQkJCWFpLT5jb25maWcucG93ZXJTYXZlTW9kZSA9IFBPV0VSU0FWRV9QU1A7CisJCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQkJfSBlbHNlIHsKKwkJCQlhaS0+Y29uZmlnLnBvd2VyU2F2ZU1vZGUgPSBQT1dFUlNBVkVfQ0FNOworCQkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJCX0KKwkJfSBlbHNlIGlmICggIXN0cm5jbXAoIGxpbmUsICJEYXRhUmF0ZXM6ICIsIDExICkgKSB7CisJCQlpbnQgdiwgaSA9IDAsIGsgPSAwOyAvKiBpIGlzIGluZGV4IGludG8gbGluZSwKKwkJCQkJCWsgaXMgaW5kZXggdG8gcmF0ZXMgKi8KKworCQkJbGluZSArPSAxMTsKKwkJCXdoaWxlKCh2ID0gZ2V0X2RlY191MTYobGluZSwgJmksIDMpKSE9LTEpIHsKKwkJCQlhaS0+Y29uZmlnLnJhdGVzW2srK10gPSAodTgpdjsKKwkJCQlsaW5lICs9IGkgKyAxOworCQkJCWkgPSAwOworCQkJfQorCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQl9IGVsc2UgaWYgKCAhc3RybmNtcCggbGluZSwgIkNoYW5uZWw6ICIsIDkgKSApIHsKKwkJCWludCB2LCBpID0gMDsKKwkJCWxpbmUgKz0gOTsKKwkJCXYgPSBnZXRfZGVjX3UxNihsaW5lLCAmaSwgaSszKTsKKwkJCWlmICggdiAhPSAtMSApIHsKKwkJCQlhaS0+Y29uZmlnLmNoYW5uZWxTZXQgPSAodTE2KXY7CisJCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQkJfQorCQl9IGVsc2UgaWYgKCAhc3RybmNtcCggbGluZSwgIlhtaXRQb3dlcjogIiwgMTEgKSApIHsKKwkJCWludCB2LCBpID0gMDsKKwkJCWxpbmUgKz0gMTE7CisJCQl2ID0gZ2V0X2RlY191MTYobGluZSwgJmksIGkrMyk7CisJCQlpZiAoIHYgIT0gLTEgKSB7CisJCQkJYWktPmNvbmZpZy50eFBvd2VyID0gKHUxNil2OworCQkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJCX0KKwkJfSBlbHNlIGlmICggIXN0cm5jbXAoIGxpbmUsICJXRVA6ICIsIDUgKSApIHsKKwkJCWxpbmUgKz0gNTsKKwkJCXN3aXRjaCggbGluZVswXSApIHsKKwkJCWNhc2UgJ3MnOgorCQkJCWFpLT5jb25maWcuYXV0aFR5cGUgPSAodTE2KUFVVEhfU0hBUkVES0VZOworCQkJCWJyZWFrOworCQkJY2FzZSAnZSc6CisJCQkJYWktPmNvbmZpZy5hdXRoVHlwZSA9ICh1MTYpQVVUSF9FTkNSWVBUOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlhaS0+Y29uZmlnLmF1dGhUeXBlID0gKHUxNilBVVRIX09QRU47CisJCQkJYnJlYWs7CisJCQl9CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJCX0gZWxzZSBpZiAoICFzdHJuY21wKCBsaW5lLCAiTG9uZ1JldHJ5TGltaXQ6ICIsIDE2ICkgKSB7CisJCQlpbnQgdiwgaSA9IDA7CisKKwkJCWxpbmUgKz0gMTY7CisJCQl2ID0gZ2V0X2RlY191MTYobGluZSwgJmksIDMpOworCQkJdiA9ICh2PDApID8gMCA6ICgodj4yNTUpID8gMjU1IDogdik7CisJCQlhaS0+Y29uZmlnLmxvbmdSZXRyeUxpbWl0ID0gKHUxNil2OworCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQl9IGVsc2UgaWYgKCAhc3RybmNtcCggbGluZSwgIlNob3J0UmV0cnlMaW1pdDogIiwgMTcgKSApIHsKKwkJCWludCB2LCBpID0gMDsKKworCQkJbGluZSArPSAxNzsKKwkJCXYgPSBnZXRfZGVjX3UxNihsaW5lLCAmaSwgMyk7CisJCQl2ID0gKHY8MCkgPyAwIDogKCh2PjI1NSkgPyAyNTUgOiB2KTsKKwkJCWFpLT5jb25maWcuc2hvcnRSZXRyeUxpbWl0ID0gKHUxNil2OworCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQl9IGVsc2UgaWYgKCAhc3RybmNtcCggbGluZSwgIlJUU1RocmVzaG9sZDogIiwgMTQgKSApIHsKKwkJCWludCB2LCBpID0gMDsKKworCQkJbGluZSArPSAxNDsKKwkJCXYgPSBnZXRfZGVjX3UxNihsaW5lLCAmaSwgNCk7CisJCQl2ID0gKHY8MCkgPyAwIDogKCh2PjIzMTIpID8gMjMxMiA6IHYpOworCQkJYWktPmNvbmZpZy5ydHNUaHJlcyA9ICh1MTYpdjsKKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJfSBlbHNlIGlmICggIXN0cm5jbXAoIGxpbmUsICJUWE1TRFVMaWZldGltZTogIiwgMTYgKSApIHsKKwkJCWludCB2LCBpID0gMDsKKworCQkJbGluZSArPSAxNjsKKwkJCXYgPSBnZXRfZGVjX3UxNihsaW5lLCAmaSwgNSk7CisJCQl2ID0gKHY8MCkgPyAwIDogdjsKKwkJCWFpLT5jb25maWcudHhMaWZldGltZSA9ICh1MTYpdjsKKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJfSBlbHNlIGlmICggIXN0cm5jbXAoIGxpbmUsICJSWE1TRFVMaWZldGltZTogIiwgMTYgKSApIHsKKwkJCWludCB2LCBpID0gMDsKKworCQkJbGluZSArPSAxNjsKKwkJCXYgPSBnZXRfZGVjX3UxNihsaW5lLCAmaSwgNSk7CisJCQl2ID0gKHY8MCkgPyAwIDogdjsKKwkJCWFpLT5jb25maWcucnhMaWZldGltZSA9ICh1MTYpdjsKKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJfSBlbHNlIGlmICggIXN0cm5jbXAoIGxpbmUsICJUWERpdmVyc2l0eTogIiwgMTMgKSApIHsKKwkJCWFpLT5jb25maWcudHhEaXZlcnNpdHkgPQorCQkJCShsaW5lWzEzXT09J2wnKSA/IDEgOgorCQkJCSgobGluZVsxM109PSdyJyk/IDI6IDMpOworCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQl9IGVsc2UgaWYgKCAhc3RybmNtcCggbGluZSwgIlJYRGl2ZXJzaXR5OiAiLCAxMyApICkgeworCQkJYWktPmNvbmZpZy5yeERpdmVyc2l0eSA9CisJCQkJKGxpbmVbMTNdPT0nbCcpID8gMSA6CisJCQkJKChsaW5lWzEzXT09J3InKT8gMjogMyk7CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7CisJCX0gZWxzZSBpZiAoICFzdHJuY21wKCBsaW5lLCAiRnJhZ1RocmVzaG9sZDogIiwgMTUgKSApIHsKKwkJCWludCB2LCBpID0gMDsKKworCQkJbGluZSArPSAxNTsKKwkJCXYgPSBnZXRfZGVjX3UxNihsaW5lLCAmaSwgNCk7CisJCQl2ID0gKHY8MjU2KSA/IDI1NiA6ICgodj4yMzEyKSA/IDIzMTIgOiB2KTsKKwkJCXYgPSB2ICYgMHhmZmZlOyAvKiBNYWtlIHN1cmUgaXRzIGV2ZW4gKi8KKwkJCWFpLT5jb25maWcuZnJhZ1RocmVzaCA9ICh1MTYpdjsKKwkJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsKKwkJfSBlbHNlIGlmICghc3RybmNtcChsaW5lLCAiTW9kdWxhdGlvbjogIiwgMTIpKSB7CisJCQlsaW5lICs9IDEyOworCQkJc3dpdGNoKCpsaW5lKSB7CisJCQljYXNlICdkJzogIGFpLT5jb25maWcubW9kdWxhdGlvbj1NT0RfREVGQVVMVDsgc2V0X2JpdChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7IGJyZWFrOworCQkJY2FzZSAnYyc6ICBhaS0+Y29uZmlnLm1vZHVsYXRpb249TU9EX0NDSzsgc2V0X2JpdChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7IGJyZWFrOworCQkJY2FzZSAnbSc6ICBhaS0+Y29uZmlnLm1vZHVsYXRpb249TU9EX01PSzsgc2V0X2JpdChGTEFHX0NPTU1JVCwgJmFpLT5mbGFncyk7IGJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoIEtFUk5fV0FSTklORyAiYWlybzogVW5rbm93biBtb2R1bGF0aW9uXG4iICk7CisJCQl9CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAobGluZSwgIlByZWFtYmxlOiAiLCAxMCkpIHsKKwkJCWxpbmUgKz0gMTA7CisJCQlzd2l0Y2goKmxpbmUpIHsKKwkJCWNhc2UgJ2EnOiBhaS0+Y29uZmlnLnByZWFtYmxlPVBSRUFNQkxFX0FVVE87IHNldF9iaXQoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOyBicmVhazsKKwkJCWNhc2UgJ2wnOiBhaS0+Y29uZmlnLnByZWFtYmxlPVBSRUFNQkxFX0xPTkc7IHNldF9iaXQoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOyBicmVhazsKKwkJCWNhc2UgJ3MnOiBhaS0+Y29uZmlnLnByZWFtYmxlPVBSRUFNQkxFX1NIT1JUOyBzZXRfYml0KEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKTsgYnJlYWs7CisJCSAgICAgICAgZGVmYXVsdDogcHJpbnRrKEtFUk5fV0FSTklORyAiYWlybzogVW5rbm93biBwcmVhbWJsZVxuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwcmludGsoIEtFUk5fV0FSTklORyAiQ291bGRuJ3QgZmlndXJlIG91dCAlc1xuIiwgbGluZSApOworCQl9CisJCXdoaWxlKCBsaW5lWzBdICYmIGxpbmVbMF0gIT0gJ1xuJyApIGxpbmUrKzsKKwkJaWYgKCBsaW5lWzBdICkgbGluZSsrOworCX0KKwlhaXJvX2NvbmZpZ19jb21taXQoZGV2LCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworc3RhdGljIGNoYXIgKmdldF9ybW9kZSh1MTYgbW9kZSkgeworICAgICAgICBzd2l0Y2gobW9kZSYweGZmKSB7CisgICAgICAgIGNhc2UgUlhNT0RFX1JGTU9OOiAgcmV0dXJuICJyZm1vbiI7CisgICAgICAgIGNhc2UgUlhNT0RFX1JGTU9OX0FOWUJTUzogIHJldHVybiAieW5hIChhbnkpIGJzcyByZm1vbiI7CisgICAgICAgIGNhc2UgUlhNT0RFX0xBTk1PTjogIHJldHVybiAibGFubW9uIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIkVTUyI7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19jb25maWdfb3Blbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKSB7CisJc3RydWN0IHByb2NfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGlub2RlKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHAtPmRhdGE7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJaW50IGk7CisKKwlpZiAoKGZpbGUtPnByaXZhdGVfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9jX2RhdGEgKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChmaWxlLT5wcml2YXRlX2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhKSk7CisJZGF0YSA9IChzdHJ1Y3QgcHJvY19kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICgoZGF0YS0+cmJ1ZmZlciA9IGttYWxsb2MoIDIwNDgsIEdGUF9LRVJORUwgKSkgPT0gTlVMTCkgeworCQlrZnJlZSAoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmICgoZGF0YS0+d2J1ZmZlciA9IGttYWxsb2MoIDIwNDgsIEdGUF9LRVJORUwgKSkgPT0gTlVMTCkgeworCQlrZnJlZSAoZGF0YS0+cmJ1ZmZlcik7CisJCWtmcmVlIChmaWxlLT5wcml2YXRlX2RhdGEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KCBkYXRhLT53YnVmZmVyLCAwLCAyMDQ4ICk7CisJZGF0YS0+bWF4d3JpdGVsZW4gPSAyMDQ4OworCWRhdGEtPm9uX2Nsb3NlID0gcHJvY19jb25maWdfb25fY2xvc2U7CisKKwlyZWFkQ29uZmlnUmlkKGFpLCAxKTsKKworCWkgPSBzcHJpbnRmKCBkYXRhLT5yYnVmZmVyLAorCQkgICAgICJNb2RlOiAlc1xuIgorCQkgICAgICJSYWRpbzogJXNcbiIKKwkJICAgICAiTm9kZU5hbWU6ICUtMTZzXG4iCisJCSAgICAgIlBvd2VyTW9kZTogJXNcbiIKKwkJICAgICAiRGF0YVJhdGVzOiAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIgorCQkgICAgICJDaGFubmVsOiAlZFxuIgorCQkgICAgICJYbWl0UG93ZXI6ICVkXG4iLAorCQkgICAgIChhaS0+Y29uZmlnLm9wbW9kZSAmIDB4RkYpID09IDAgPyAiYWRob2MiIDoKKwkJICAgICAoYWktPmNvbmZpZy5vcG1vZGUgJiAweEZGKSA9PSAxID8gZ2V0X3Jtb2RlKGFpLT5jb25maWcucm1vZGUpOgorCQkgICAgIChhaS0+Y29uZmlnLm9wbW9kZSAmIDB4RkYpID09IDIgPyAiQVAiIDoKKwkJICAgICAoYWktPmNvbmZpZy5vcG1vZGUgJiAweEZGKSA9PSAzID8gIkFQIFJQVFIiIDogIkVycm9yIiwKKwkJICAgICB0ZXN0X2JpdChGTEFHX1JBRElPX09GRiwgJmFpLT5mbGFncykgPyAib2ZmIiA6ICJvbiIsCisJCSAgICAgYWktPmNvbmZpZy5ub2RlTmFtZSwKKwkJICAgICBhaS0+Y29uZmlnLnBvd2VyU2F2ZU1vZGUgPT0gMCA/ICJDQU0iIDoKKwkJICAgICBhaS0+Y29uZmlnLnBvd2VyU2F2ZU1vZGUgPT0gMSA/ICJQU1AiIDoKKwkJICAgICBhaS0+Y29uZmlnLnBvd2VyU2F2ZU1vZGUgPT0gMiA/ICJQU1BDQU0iIDogIkVycm9yIiwKKwkJICAgICAoaW50KWFpLT5jb25maWcucmF0ZXNbMF0sCisJCSAgICAgKGludClhaS0+Y29uZmlnLnJhdGVzWzFdLAorCQkgICAgIChpbnQpYWktPmNvbmZpZy5yYXRlc1syXSwKKwkJICAgICAoaW50KWFpLT5jb25maWcucmF0ZXNbM10sCisJCSAgICAgKGludClhaS0+Y29uZmlnLnJhdGVzWzRdLAorCQkgICAgIChpbnQpYWktPmNvbmZpZy5yYXRlc1s1XSwKKwkJICAgICAoaW50KWFpLT5jb25maWcucmF0ZXNbNl0sCisJCSAgICAgKGludClhaS0+Y29uZmlnLnJhdGVzWzddLAorCQkgICAgIChpbnQpYWktPmNvbmZpZy5jaGFubmVsU2V0LAorCQkgICAgIChpbnQpYWktPmNvbmZpZy50eFBvd2VyCisJCSk7CisJc3ByaW50ZiggZGF0YS0+cmJ1ZmZlciArIGksCisJCSAiTG9uZ1JldHJ5TGltaXQ6ICVkXG4iCisJCSAiU2hvcnRSZXRyeUxpbWl0OiAlZFxuIgorCQkgIlJUU1RocmVzaG9sZDogJWRcbiIKKwkJICJUWE1TRFVMaWZldGltZTogJWRcbiIKKwkJICJSWE1TRFVMaWZldGltZTogJWRcbiIKKwkJICJUWERpdmVyc2l0eTogJXNcbiIKKwkJICJSWERpdmVyc2l0eTogJXNcbiIKKwkJICJGcmFnVGhyZXNob2xkOiAlZFxuIgorCQkgIldFUDogJXNcbiIKKwkJICJNb2R1bGF0aW9uOiAlc1xuIgorCQkgIlByZWFtYmxlOiAlc1xuIiwKKwkJIChpbnQpYWktPmNvbmZpZy5sb25nUmV0cnlMaW1pdCwKKwkJIChpbnQpYWktPmNvbmZpZy5zaG9ydFJldHJ5TGltaXQsCisJCSAoaW50KWFpLT5jb25maWcucnRzVGhyZXMsCisJCSAoaW50KWFpLT5jb25maWcudHhMaWZldGltZSwKKwkJIChpbnQpYWktPmNvbmZpZy5yeExpZmV0aW1lLAorCQkgYWktPmNvbmZpZy50eERpdmVyc2l0eSA9PSAxID8gImxlZnQiIDoKKwkJIGFpLT5jb25maWcudHhEaXZlcnNpdHkgPT0gMiA/ICJyaWdodCIgOiAiYm90aCIsCisJCSBhaS0+Y29uZmlnLnJ4RGl2ZXJzaXR5ID09IDEgPyAibGVmdCIgOgorCQkgYWktPmNvbmZpZy5yeERpdmVyc2l0eSA9PSAyID8gInJpZ2h0IiA6ICJib3RoIiwKKwkJIChpbnQpYWktPmNvbmZpZy5mcmFnVGhyZXNoLAorCQkgYWktPmNvbmZpZy5hdXRoVHlwZSA9PSBBVVRIX0VOQ1JZUFQgPyAiZW5jcnlwdCIgOgorCQkgYWktPmNvbmZpZy5hdXRoVHlwZSA9PSBBVVRIX1NIQVJFREtFWSA/ICJzaGFyZWQiIDogIm9wZW4iLAorCQkgYWktPmNvbmZpZy5tb2R1bGF0aW9uID09IDAgPyAiZGVmYXVsdCIgOgorCQkgYWktPmNvbmZpZy5tb2R1bGF0aW9uID09IE1PRF9DQ0sgPyAiY2NrIiA6CisJCSBhaS0+Y29uZmlnLm1vZHVsYXRpb24gPT0gTU9EX01PSyA/ICJtb2siIDogImVycm9yIiwKKwkJIGFpLT5jb25maWcucHJlYW1ibGUgPT0gUFJFQU1CTEVfQVVUTyA/ICJhdXRvIiA6CisJCSBhaS0+Y29uZmlnLnByZWFtYmxlID09IFBSRUFNQkxFX0xPTkcgPyAibG9uZyIgOgorCQkgYWktPmNvbmZpZy5wcmVhbWJsZSA9PSBQUkVBTUJMRV9TSE9SVCA/ICJzaG9ydCIgOiAiZXJyb3IiCisJCSk7CisJZGF0YS0+cmVhZGxlbiA9IHN0cmxlbiggZGF0YS0+cmJ1ZmZlciApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcm9jX1NTSURfb25fY2xvc2UoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICkgeworCXN0cnVjdCBwcm9jX2RhdGEgKmRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGlub2RlKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHAtPmRhdGE7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJU3NpZFJpZCBTU0lEX3JpZDsKKwlSZXNwIHJzcDsKKwlpbnQgaTsKKwlpbnQgb2Zmc2V0ID0gMDsKKworCWlmICggIWRhdGEtPndyaXRlbGVuICkgcmV0dXJuOworCisJbWVtc2V0KCAmU1NJRF9yaWQsIDAsIHNpemVvZiggU1NJRF9yaWQgKSApOworCisJZm9yKCBpID0gMDsgaSA8IDM7IGkrKyApIHsKKwkJaW50IGo7CisJCWZvciggaiA9IDA7IGorb2Zmc2V0IDwgZGF0YS0+d3JpdGVsZW4gJiYgaiA8IDMyICYmCisJCQkgICAgIGRhdGEtPndidWZmZXJbb2Zmc2V0K2pdICE9ICdcbic7IGorKyApIHsKKwkJCVNTSURfcmlkLnNzaWRzW2ldLnNzaWRbal0gPSBkYXRhLT53YnVmZmVyW29mZnNldCtqXTsKKwkJfQorCQlpZiAoIGogPT0gMCApIGJyZWFrOworCQlTU0lEX3JpZC5zc2lkc1tpXS5sZW4gPSBqOworCQlvZmZzZXQgKz0gajsKKwkJd2hpbGUoIGRhdGEtPndidWZmZXJbb2Zmc2V0XSAhPSAnXG4nICYmCisJCSAgICAgICBvZmZzZXQgPCBkYXRhLT53cml0ZWxlbiApIG9mZnNldCsrOworCQlvZmZzZXQrKzsKKwl9CisJaWYgKGkpCisJCVNTSURfcmlkLmxlbiA9IHNpemVvZihTU0lEX3JpZCk7CisJZGlzYWJsZV9NQUMoYWksIDEpOworCXdyaXRlU3NpZFJpZChhaSwgJlNTSURfcmlkLCAxKTsKKwllbmFibGVfTUFDKGFpLCAmcnNwLCAxKTsKK30KKworaW5saW5lIHN0YXRpYyB1OCBoZXhWYWwoY2hhciBjKSB7CisJaWYgKGM+PScwJyAmJiBjPD0nOScpIHJldHVybiBjIC09ICcwJzsKKwlpZiAoYz49J2EnICYmIGM8PSdmJykgcmV0dXJuIGMgLT0gJ2EnLTEwOworCWlmIChjPj0nQScgJiYgYzw9J0YnKSByZXR1cm4gYyAtPSAnQSctMTA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHByb2NfQVBMaXN0X29uX2Nsb3NlKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApIHsKKwlzdHJ1Y3QgcHJvY19kYXRhICpkYXRhID0gKHN0cnVjdCBwcm9jX2RhdGEgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShpbm9kZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRwLT5kYXRhOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCUFQTGlzdFJpZCBBUExpc3RfcmlkOworCVJlc3AgcnNwOworCWludCBpOworCisJaWYgKCAhZGF0YS0+d3JpdGVsZW4gKSByZXR1cm47CisKKwltZW1zZXQoICZBUExpc3RfcmlkLCAwLCBzaXplb2YoQVBMaXN0X3JpZCkgKTsKKwlBUExpc3RfcmlkLmxlbiA9IHNpemVvZihBUExpc3RfcmlkKTsKKworCWZvciggaSA9IDA7IGkgPCA0ICYmIGRhdGEtPndyaXRlbGVuID49IChpKzEpKjYqMzsgaSsrICkgeworCQlpbnQgajsKKwkJZm9yKCBqID0gMDsgaiA8IDYqMyAmJiBkYXRhLT53YnVmZmVyW2oraSo2KjNdOyBqKysgKSB7CisJCQlzd2l0Y2goaiUzKSB7CisJCQljYXNlIDA6CisJCQkJQVBMaXN0X3JpZC5hcFtpXVtqLzNdPQorCQkJCQloZXhWYWwoZGF0YS0+d2J1ZmZlcltqK2kqNiozXSk8PDQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJQVBMaXN0X3JpZC5hcFtpXVtqLzNdfD0KKwkJCQkJaGV4VmFsKGRhdGEtPndidWZmZXJbaitpKjYqM10pOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWRpc2FibGVfTUFDKGFpLCAxKTsKKwl3cml0ZUFQTGlzdFJpZChhaSwgJkFQTGlzdF9yaWQsIDEpOworCWVuYWJsZV9NQUMoYWksICZyc3AsIDEpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHdyYXBzIFBDNDUwMF93cml0ZXJpZCB3aXRoIGEgTUFDIGRpc2FibGUgKi8KK3N0YXRpYyBpbnQgZG9fd3JpdGVyaWQoIHN0cnVjdCBhaXJvX2luZm8gKmFpLCB1MTYgcmlkLCBjb25zdCB2b2lkICpyaWRfZGF0YSwKKwkJCWludCBsZW4sIGludCBkdW1teSApIHsKKwlpbnQgcmM7CisJUmVzcCByc3A7CisKKwlkaXNhYmxlX01BQyhhaSwgMSk7CisJcmMgPSBQQzQ1MDBfd3JpdGVyaWQoYWksIHJpZCwgcmlkX2RhdGEsIGxlbiwgMSk7CisJZW5hYmxlX01BQyhhaSwgJnJzcCwgMSk7CisJcmV0dXJuIHJjOworfQorCisvKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGtleSBhdCB0aGUgaW5kZXguICBJZiBpbmRleCA9PSAweGZmZmYKKyAqIHRoZSBpbmRleCBvZiB0aGUgdHJhbnNtaXQga2V5IGlzIHJldHVybmVkLiAgSWYgdGhlIGtleSBkb2Vzbid0IGV4aXN0LAorICogLTEgd2lsbCBiZSByZXR1cm5lZC4KKyAqLworc3RhdGljIGludCBnZXRfd2VwX2tleShzdHJ1Y3QgYWlyb19pbmZvICphaSwgdTE2IGluZGV4KSB7CisJV2VwS2V5UmlkIHdrcjsKKwlpbnQgcmM7CisJdTE2IGxhc3RpbmRleDsKKworCXJjID0gcmVhZFdlcEtleVJpZChhaSwgJndrciwgMSwgMSk7CisJaWYgKHJjID09IFNVQ0NFU1MpIGRvIHsKKwkJbGFzdGluZGV4ID0gd2tyLmtpbmRleDsKKwkJaWYgKHdrci5raW5kZXggPT0gaW5kZXgpIHsKKwkJCWlmIChpbmRleCA9PSAweGZmZmYpIHsKKwkJCQlyZXR1cm4gd2tyLm1hY1swXTsKKwkJCX0KKwkJCXJldHVybiB3a3Iua2xlbjsKKwkJfQorCQlyZWFkV2VwS2V5UmlkKGFpLCAmd2tyLCAwLCAxKTsKKwl9IHdoaWxlKGxhc3RpbmRleCAhPSB3a3Iua2luZGV4KTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3dlcF9rZXkoc3RydWN0IGFpcm9faW5mbyAqYWksIHUxNiBpbmRleCwKKwkJICAgICAgIGNvbnN0IGNoYXIgKmtleSwgdTE2IGtleWxlbiwgaW50IHBlcm0sIGludCBsb2NrICkgeworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1hY2FkZHJbRVRIX0FMRU5dID0geyAweDAxLCAwLCAwLCAwLCAwLCAwIH07CisJV2VwS2V5UmlkIHdrcjsKKwlSZXNwIHJzcDsKKworCW1lbXNldCgmd2tyLCAwLCBzaXplb2Yod2tyKSk7CisJaWYgKGtleWxlbiA9PSAwKSB7CisvLyBXZSBhcmUgc2VsZWN0aW5nIHdoaWNoIGtleSB0byB1c2UKKwkJd2tyLmxlbiA9IHNpemVvZih3a3IpOworCQl3a3Iua2luZGV4ID0gMHhmZmZmOworCQl3a3IubWFjWzBdID0gKGNoYXIpaW5kZXg7CisJCWlmIChwZXJtKSBwcmludGsoS0VSTl9JTkZPICJTZXR0aW5nIHRyYW5zbWl0IGtleSB0byAlZFxuIiwgaW5kZXgpOworCQlpZiAocGVybSkgYWktPmRlZmluZGV4ID0gKGNoYXIpaW5kZXg7CisJfSBlbHNlIHsKKy8vIFdlIGFyZSBhY3R1YWxseSBzZXR0aW5nIHRoZSBrZXkKKwkJd2tyLmxlbiA9IHNpemVvZih3a3IpOworCQl3a3Iua2luZGV4ID0gaW5kZXg7CisJCXdrci5rbGVuID0ga2V5bGVuOworCQltZW1jcHkoIHdrci5rZXksIGtleSwga2V5bGVuICk7CisJCW1lbWNweSggd2tyLm1hYywgbWFjYWRkciwgRVRIX0FMRU4gKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiU2V0dGluZyBrZXkgJWRcbiIsIGluZGV4KTsKKwl9CisKKwlkaXNhYmxlX01BQyhhaSwgbG9jayk7CisJd3JpdGVXZXBLZXlSaWQoYWksICZ3a3IsIHBlcm0sIGxvY2spOworCWVuYWJsZV9NQUMoYWksICZyc3AsIGxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcm9jX3dlcGtleV9vbl9jbG9zZSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKSB7CisJc3RydWN0IHByb2NfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRwID0gUERFKGlub2RlKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHAtPmRhdGE7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJaW50IGk7CisJY2hhciBrZXlbMTZdOworCXUxNiBpbmRleCA9IDA7CisJaW50IGogPSAwOworCisJbWVtc2V0KGtleSwgMCwgc2l6ZW9mKGtleSkpOworCisJZGF0YSA9IChzdHJ1Y3QgcHJvY19kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICggIWRhdGEtPndyaXRlbGVuICkgcmV0dXJuOworCisJaWYgKGRhdGEtPndidWZmZXJbMF0gPj0gJzAnICYmIGRhdGEtPndidWZmZXJbMF0gPD0gJzMnICYmCisJICAgIChkYXRhLT53YnVmZmVyWzFdID09ICcgJyB8fCBkYXRhLT53YnVmZmVyWzFdID09ICdcbicpKSB7CisJCWluZGV4ID0gZGF0YS0+d2J1ZmZlclswXSAtICcwJzsKKwkJaWYgKGRhdGEtPndidWZmZXJbMV0gPT0gJ1xuJykgeworCQkJc2V0X3dlcF9rZXkoYWksIGluZGV4LCBOVUxMLCAwLCAxLCAxKTsKKwkJCXJldHVybjsKKwkJfQorCQlqID0gMjsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm86ICBXZXBLZXkgcGFzc2VkIGludmFsaWQga2V5IGluZGV4XG4iKTsKKwkJcmV0dXJuOworCX0KKworCWZvciggaSA9IDA7IGkgPCAxNiozICYmIGRhdGEtPndidWZmZXJbaStqXTsgaSsrICkgeworCQlzd2l0Y2goaSUzKSB7CisJCWNhc2UgMDoKKwkJCWtleVtpLzNdID0gaGV4VmFsKGRhdGEtPndidWZmZXJbaStqXSk8PDQ7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJa2V5W2kvM10gfD0gaGV4VmFsKGRhdGEtPndidWZmZXJbaStqXSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzZXRfd2VwX2tleShhaSwgaW5kZXgsIGtleSwgaS8zLCAxLCAxKTsKK30KKworc3RhdGljIGludCBwcm9jX3dlcGtleV9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApIHsKKwlzdHJ1Y3QgcHJvY19kYXRhICpkYXRhOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vZGUpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcC0+ZGF0YTsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwljaGFyICpwdHI7CisJV2VwS2V5UmlkIHdrcjsKKwl1MTYgbGFzdGluZGV4OworCWludCBqPTA7CisJaW50IHJjOworCisJaWYgKChmaWxlLT5wcml2YXRlX2RhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhICksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZmlsZS0+cHJpdmF0ZV9kYXRhLCAwLCBzaXplb2Yoc3RydWN0IHByb2NfZGF0YSkpOworCW1lbXNldCgmd2tyLCAwLCBzaXplb2Yod2tyKSk7CisJZGF0YSA9IChzdHJ1Y3QgcHJvY19kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICgoZGF0YS0+cmJ1ZmZlciA9IGttYWxsb2MoIDE4MCwgR0ZQX0tFUk5FTCApKSA9PSBOVUxMKSB7CisJCWtmcmVlIChmaWxlLT5wcml2YXRlX2RhdGEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGRhdGEtPnJidWZmZXIsIDAsIDE4MCk7CisJZGF0YS0+d3JpdGVsZW4gPSAwOworCWRhdGEtPm1heHdyaXRlbGVuID0gODA7CisJaWYgKChkYXRhLT53YnVmZmVyID0ga21hbGxvYyggODAsIEdGUF9LRVJORUwgKSkgPT0gTlVMTCkgeworCQlrZnJlZSAoZGF0YS0+cmJ1ZmZlcik7CisJCWtmcmVlIChmaWxlLT5wcml2YXRlX2RhdGEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KCBkYXRhLT53YnVmZmVyLCAwLCA4MCApOworCWRhdGEtPm9uX2Nsb3NlID0gcHJvY193ZXBrZXlfb25fY2xvc2U7CisKKwlwdHIgPSBkYXRhLT5yYnVmZmVyOworCXN0cmNweShwdHIsICJObyB3ZXAga2V5c1xuIik7CisJcmMgPSByZWFkV2VwS2V5UmlkKGFpLCAmd2tyLCAxLCAxKTsKKwlpZiAocmMgPT0gU1VDQ0VTUykgZG8geworCQlsYXN0aW5kZXggPSB3a3Iua2luZGV4OworCQlpZiAod2tyLmtpbmRleCA9PSAweGZmZmYpIHsKKwkJCWogKz0gc3ByaW50ZihwdHIraiwgIlR4IGtleSA9ICVkXG4iLAorCQkJCSAgICAgKGludCl3a3IubWFjWzBdKTsKKwkJfSBlbHNlIHsKKwkJCWogKz0gc3ByaW50ZihwdHIraiwgIktleSAlZCBzZXQgd2l0aCBsZW5ndGggPSAlZFxuIiwKKwkJCQkgICAgIChpbnQpd2tyLmtpbmRleCwgKGludCl3a3Iua2xlbik7CisJCX0KKwkJcmVhZFdlcEtleVJpZChhaSwgJndrciwgMCwgMSk7CisJfSB3aGlsZSgobGFzdGluZGV4ICE9IHdrci5raW5kZXgpICYmIChqIDwgMTgwLTMwKSk7CisKKwlkYXRhLT5yZWFkbGVuID0gc3RybGVuKCBkYXRhLT5yYnVmZmVyICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19TU0lEX29wZW4oIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlICkgeworCXN0cnVjdCBwcm9jX2RhdGEgKmRhdGE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShpbm9kZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRwLT5kYXRhOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gZGV2LT5wcml2OworCWludCBpOworCWNoYXIgKnB0cjsKKwlTc2lkUmlkIFNTSURfcmlkOworCisJaWYgKChmaWxlLT5wcml2YXRlX2RhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhICksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZmlsZS0+cHJpdmF0ZV9kYXRhLCAwLCBzaXplb2Yoc3RydWN0IHByb2NfZGF0YSkpOworCWRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoKGRhdGEtPnJidWZmZXIgPSBrbWFsbG9jKCAxMDQsIEdGUF9LRVJORUwgKSkgPT0gTlVMTCkgeworCQlrZnJlZSAoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWRhdGEtPndyaXRlbGVuID0gMDsKKwlkYXRhLT5tYXh3cml0ZWxlbiA9IDMzKjM7CisJaWYgKChkYXRhLT53YnVmZmVyID0ga21hbGxvYyggMzMqMywgR0ZQX0tFUk5FTCApKSA9PSBOVUxMKSB7CisJCWtmcmVlIChkYXRhLT5yYnVmZmVyKTsKKwkJa2ZyZWUgKGZpbGUtPnByaXZhdGVfZGF0YSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoIGRhdGEtPndidWZmZXIsIDAsIDMzKjMgKTsKKwlkYXRhLT5vbl9jbG9zZSA9IHByb2NfU1NJRF9vbl9jbG9zZTsKKworCXJlYWRTc2lkUmlkKGFpLCAmU1NJRF9yaWQpOworCXB0ciA9IGRhdGEtPnJidWZmZXI7CisJZm9yKCBpID0gMDsgaSA8IDM7IGkrKyApIHsKKwkJaW50IGo7CisJCWlmICggIVNTSURfcmlkLnNzaWRzW2ldLmxlbiApIGJyZWFrOworCQlmb3IoIGogPSAwOyBqIDwgMzIgJiYKKwkJCSAgICAgaiA8IFNTSURfcmlkLnNzaWRzW2ldLmxlbiAmJgorCQkJICAgICBTU0lEX3JpZC5zc2lkc1tpXS5zc2lkW2pdOyBqKysgKSB7CisJCQkqcHRyKysgPSBTU0lEX3JpZC5zc2lkc1tpXS5zc2lkW2pdOworCQl9CisJCSpwdHIrKyA9ICdcbic7CisJfQorCSpwdHIgPSAnXDAnOworCWRhdGEtPnJlYWRsZW4gPSBzdHJsZW4oIGRhdGEtPnJidWZmZXIgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jX0FQTGlzdF9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApIHsKKwlzdHJ1Y3QgcHJvY19kYXRhICpkYXRhOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vZGUpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcC0+ZGF0YTsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKwljaGFyICpwdHI7CisJQVBMaXN0UmlkIEFQTGlzdF9yaWQ7CisKKwlpZiAoKGZpbGUtPnByaXZhdGVfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9jX2RhdGEgKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChmaWxlLT5wcml2YXRlX2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhKSk7CisJZGF0YSA9IChzdHJ1Y3QgcHJvY19kYXRhICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmICgoZGF0YS0+cmJ1ZmZlciA9IGttYWxsb2MoIDEwNCwgR0ZQX0tFUk5FTCApKSA9PSBOVUxMKSB7CisJCWtmcmVlIChmaWxlLT5wcml2YXRlX2RhdGEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZGF0YS0+d3JpdGVsZW4gPSAwOworCWRhdGEtPm1heHdyaXRlbGVuID0gNCo2KjM7CisJaWYgKChkYXRhLT53YnVmZmVyID0ga21hbGxvYyggZGF0YS0+bWF4d3JpdGVsZW4sIEdGUF9LRVJORUwgKSkgPT0gTlVMTCkgeworCQlrZnJlZSAoZGF0YS0+cmJ1ZmZlcik7CisJCWtmcmVlIChmaWxlLT5wcml2YXRlX2RhdGEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KCBkYXRhLT53YnVmZmVyLCAwLCBkYXRhLT5tYXh3cml0ZWxlbiApOworCWRhdGEtPm9uX2Nsb3NlID0gcHJvY19BUExpc3Rfb25fY2xvc2U7CisKKwlyZWFkQVBMaXN0UmlkKGFpLCAmQVBMaXN0X3JpZCk7CisJcHRyID0gZGF0YS0+cmJ1ZmZlcjsKKwlmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkgeworLy8gV2UgZW5kIHdoZW4gd2UgZmluZCBhIHplcm8gTUFDCisJCWlmICggISooaW50KilBUExpc3RfcmlkLmFwW2ldICYmCisJCSAgICAgISooaW50KikmQVBMaXN0X3JpZC5hcFtpXVsyXSkgYnJlYWs7CisJCXB0ciArPSBzcHJpbnRmKHB0ciwgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCQkJICAgICAgIChpbnQpQVBMaXN0X3JpZC5hcFtpXVswXSwKKwkJCSAgICAgICAoaW50KUFQTGlzdF9yaWQuYXBbaV1bMV0sCisJCQkgICAgICAgKGludClBUExpc3RfcmlkLmFwW2ldWzJdLAorCQkJICAgICAgIChpbnQpQVBMaXN0X3JpZC5hcFtpXVszXSwKKwkJCSAgICAgICAoaW50KUFQTGlzdF9yaWQuYXBbaV1bNF0sCisJCQkgICAgICAgKGludClBUExpc3RfcmlkLmFwW2ldWzVdKTsKKwl9CisJaWYgKGk9PTApIHB0ciArPSBzcHJpbnRmKHB0ciwgIk5vdCB1c2luZyBzcGVjaWZpYyBBUHNcbiIpOworCisJKnB0ciA9ICdcMCc7CisJZGF0YS0+cmVhZGxlbiA9IHN0cmxlbiggZGF0YS0+cmJ1ZmZlciApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2NfQlNTTGlzdF9vcGVuKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSApIHsKKwlzdHJ1Y3QgcHJvY19kYXRhICpkYXRhOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZHAgPSBQREUoaW5vZGUpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcC0+ZGF0YTsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwljaGFyICpwdHI7CisJQlNTTGlzdFJpZCBCU1NMaXN0X3JpZDsKKwlpbnQgcmM7CisJLyogSWYgZG9Mb3NlU3luYyBpcyBub3QgMSwgd2Ugd29uJ3QgZG8gYSBMb3NlIFN5bmMgKi8KKwlpbnQgZG9Mb3NlU3luYyA9IC0xOworCisJaWYgKChmaWxlLT5wcml2YXRlX2RhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvY19kYXRhICksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZmlsZS0+cHJpdmF0ZV9kYXRhLCAwLCBzaXplb2Yoc3RydWN0IHByb2NfZGF0YSkpOworCWRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoKGRhdGEtPnJidWZmZXIgPSBrbWFsbG9jKCAxMDI0LCBHRlBfS0VSTkVMICkpID09IE5VTEwpIHsKKwkJa2ZyZWUgKGZpbGUtPnByaXZhdGVfZGF0YSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlkYXRhLT53cml0ZWxlbiA9IDA7CisJZGF0YS0+bWF4d3JpdGVsZW4gPSAwOworCWRhdGEtPndidWZmZXIgPSBOVUxMOworCWRhdGEtPm9uX2Nsb3NlID0gTlVMTDsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQkJQ21kIGNtZDsKKwkJCVJlc3AgcnNwOworCisJCQlpZiAoYWktPmZsYWdzICYgRkxBR19SQURJT19NQVNLKSByZXR1cm4gLUVORVRET1dOOworCQkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwkJCWNtZC5jbWQ9Q01EX0xJU1RCU1M7CisJCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhaS0+c2VtKSkKKwkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQkJaXNzdWVjb21tYW5kKGFpLCAmY21kLCAmcnNwKTsKKwkJCXVwKCZhaS0+c2VtKTsKKwkJCWRhdGEtPnJlYWRsZW4gPSAwOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZG9Mb3NlU3luYyA9IDE7CisJfQorCXB0ciA9IGRhdGEtPnJidWZmZXI7CisJLyogVGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiBoZXJlIGlmIHRoZXJlIGFyZSBjb25jdXJyZW50IG9wZW5zLgorICAgICAgICAgICBTaW5jZSBpdCBpcyBhIHJhcmUgY29uZGl0aW9uLCB3ZSdsbCBqdXN0IGxpdmUgd2l0aCBpdCwgb3RoZXJ3aXNlCisgICAgICAgICAgIHdlIGhhdmUgdG8gYWRkIGEgc3BpbiBsb2NrLi4uICovCisJcmMgPSByZWFkQlNTTGlzdFJpZChhaSwgZG9Mb3NlU3luYywgJkJTU0xpc3RfcmlkKTsKKwl3aGlsZShyYyA9PSAwICYmIEJTU0xpc3RfcmlkLmluZGV4ICE9IDB4ZmZmZikgeworCQlwdHIgKz0gc3ByaW50ZihwdHIsICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCAlKnMgcnNzaSA9ICVkIiwKKwkJCQkoaW50KUJTU0xpc3RfcmlkLmJzc2lkWzBdLAorCQkJCShpbnQpQlNTTGlzdF9yaWQuYnNzaWRbMV0sCisJCQkJKGludClCU1NMaXN0X3JpZC5ic3NpZFsyXSwKKwkJCQkoaW50KUJTU0xpc3RfcmlkLmJzc2lkWzNdLAorCQkJCShpbnQpQlNTTGlzdF9yaWQuYnNzaWRbNF0sCisJCQkJKGludClCU1NMaXN0X3JpZC5ic3NpZFs1XSwKKwkJCQkoaW50KUJTU0xpc3RfcmlkLnNzaWRMZW4sCisJCQkJQlNTTGlzdF9yaWQuc3NpZCwKKwkJCQkoaW50KUJTU0xpc3RfcmlkLnJzc2kpOworCQlwdHIgKz0gc3ByaW50ZihwdHIsICIgY2hhbm5lbCA9ICVkICVzICVzICVzICVzXG4iLAorCQkJCShpbnQpQlNTTGlzdF9yaWQuZHNDaGFubmVsLAorCQkJCUJTU0xpc3RfcmlkLmNhcCAmIENBUF9FU1MgPyAiRVNTIiA6ICIiLAorCQkJCUJTU0xpc3RfcmlkLmNhcCAmIENBUF9JQlNTID8gImFkaG9jIiA6ICIiLAorCQkJCUJTU0xpc3RfcmlkLmNhcCAmIENBUF9QUklWQUNZID8gIndlcCIgOiAiIiwKKwkJCQlCU1NMaXN0X3JpZC5jYXAgJiBDQVBfU0hPUlRIRFIgPyAic2hvcnRoZHIiIDogIiIpOworCQlyYyA9IHJlYWRCU1NMaXN0UmlkKGFpLCAwLCAmQlNTTGlzdF9yaWQpOworCX0KKwkqcHRyID0gJ1wwJzsKKwlkYXRhLT5yZWFkbGVuID0gc3RybGVuKCBkYXRhLT5yYnVmZmVyICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19jbG9zZSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUgKQoreworCXN0cnVjdCBwcm9jX2RhdGEgKmRhdGEgPSAoc3RydWN0IHByb2NfZGF0YSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAoIGRhdGEtPm9uX2Nsb3NlICE9IE5VTEwgKSBkYXRhLT5vbl9jbG9zZSggaW5vZGUsIGZpbGUgKTsKKwlpZiAoIGRhdGEtPnJidWZmZXIgKSBrZnJlZSggZGF0YS0+cmJ1ZmZlciApOworCWlmICggZGF0YS0+d2J1ZmZlciApIGtmcmVlKCBkYXRhLT53YnVmZmVyICk7CisJa2ZyZWUoIGRhdGEgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX2xpc3QgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG5ldF9kZXZpY2VfbGlzdCAqbmV4dDsKK30gKmFpcm9fZGV2aWNlczsKKworLyogU2luY2UgdGhlIGNhcmQgZG9lc24ndCBhdXRvbWF0aWNhbGx5IHN3aXRjaCB0byB0aGUgcmlnaHQgV0VQIG1vZGUsCisgICB3ZSB3aWxsIG1ha2UgaXQgZG8gaXQuICBJZiB0aGUgY2FyZCBpc24ndCBhc3NvY2lhdGVkLCBldmVyeSBzZWNzIHdlCisgICB3aWxsIHN3aXRjaCBXRVAgbW9kZXMgdG8gc2VlIGlmIHRoYXQgd2lsbCBoZWxwLiAgSWYgdGhlIGNhcmQgaXMKKyAgIGFzc29jaWF0ZWQgd2Ugd2lsbCBjaGVjayBldmVyeSBtaW51dGUgdG8gc2VlIGlmIGFueXRoaW5nIGhhcworICAgY2hhbmdlZC4gKi8KK3N0YXRpYyB2b2lkIHRpbWVyX2Z1bmMoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKSB7CisJc3RydWN0IGFpcm9faW5mbyAqYXByaXYgPSBkZXYtPnByaXY7CisJUmVzcCByc3A7CisKKy8qIFdlIGRvbid0IGhhdmUgYSBsaW5rIHNvIHRyeSBjaGFuZ2luZyB0aGUgYXV0aHR5cGUgKi8KKwlyZWFkQ29uZmlnUmlkKGFwcml2LCAwKTsKKwlkaXNhYmxlX01BQyhhcHJpdiwgMCk7CisJc3dpdGNoKGFwcml2LT5jb25maWcuYXV0aFR5cGUpIHsKKwkJY2FzZSBBVVRIX0VOQ1JZUFQ6CisvKiBTbyBkcm9wIHRvIE9QRU4gKi8KKwkJCWFwcml2LT5jb25maWcuYXV0aFR5cGUgPSBBVVRIX09QRU47CisJCQlicmVhazsKKwkJY2FzZSBBVVRIX1NIQVJFREtFWToKKwkJCWlmIChhcHJpdi0+a2V5aW5kZXggPCBhdXRvX3dlcCkgeworCQkJCXNldF93ZXBfa2V5KGFwcml2LCBhcHJpdi0+a2V5aW5kZXgsIE5VTEwsIDAsIDAsIDApOworCQkJCWFwcml2LT5jb25maWcuYXV0aFR5cGUgPSBBVVRIX1NIQVJFREtFWTsKKwkJCQlhcHJpdi0+a2V5aW5kZXgrKzsKKwkJCX0gZWxzZSB7CisJCQkgICAgICAgIC8qIERyb3AgdG8gRU5DUllQVCAqLworCQkJCWFwcml2LT5rZXlpbmRleCA9IDA7CisJCQkJc2V0X3dlcF9rZXkoYXByaXYsIGFwcml2LT5kZWZpbmRleCwgTlVMTCwgMCwgMCwgMCk7CisJCQkJYXByaXYtPmNvbmZpZy5hdXRoVHlwZSA9IEFVVEhfRU5DUllQVDsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OiAgLyogV2UnbGwgZXNjYWxhdGUgdG8gU0hBUkVES0VZICovCisJCQlhcHJpdi0+Y29uZmlnLmF1dGhUeXBlID0gQVVUSF9TSEFSRURLRVk7CisJfQorCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmYXByaXYtPmZsYWdzKTsKKwl3cml0ZUNvbmZpZ1JpZChhcHJpdiwgMCk7CisJZW5hYmxlX01BQyhhcHJpdiwgJnJzcCwgMCk7CisJdXAoJmFwcml2LT5zZW0pOworCisvKiBTY2hlZHVsZSBjaGVjayB0byBzZWUgaWYgdGhlIGNoYW5nZSB3b3JrZWQgKi8KKwljbGVhcl9iaXQoSk9CX0FVVE9XRVAsICZhcHJpdi0+ZmxhZ3MpOworCWFwcml2LT5leHBpcmVzID0gUlVOX0FUKEhaKjMpOworfQorCitzdGF0aWMgaW50IGFkZF9haXJvX2Rldiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApIHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9saXN0ICpub2RlID0ga21hbGxvYyggc2l6ZW9mKCAqbm9kZSApLCBHRlBfS0VSTkVMICk7CisJaWYgKCAhbm9kZSApCisJCXJldHVybiAtRU5PTUVNOworCisJbm9kZS0+ZGV2ID0gZGV2OworCW5vZGUtPm5leHQgPSBhaXJvX2RldmljZXM7CisJYWlyb19kZXZpY2VzID0gbm9kZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZWxfYWlyb19kZXYoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKSB7CisJc3RydWN0IG5ldF9kZXZpY2VfbGlzdCAqKnAgPSAmYWlyb19kZXZpY2VzOworCXdoaWxlKCAqcCAmJiAoICgqcCktPmRldiAhPSBkZXYgKSApCisJCXAgPSAmKCpwKS0+bmV4dDsKKwlpZiAoICpwICYmICgqcCktPmRldiA9PSBkZXYgKQorCQkqcCA9ICgqcCktPm5leHQ7Cit9CisKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhaXJvX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBlbnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlpZiAocGRldi0+ZGV2aWNlID09IDB4NTAwMCB8fCBwZGV2LT5kZXZpY2UgPT0gMHhhNTA0KQorCQkJZGV2ID0gX2luaXRfYWlyb19jYXJkKHBkZXYtPmlycSwgcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsIDAsIHBkZXYsICZwZGV2LT5kZXYpOworCWVsc2UKKwkJCWRldiA9IF9pbml0X2Fpcm9fY2FyZChwZGV2LT5pcnEsIHBkZXYtPnJlc291cmNlWzJdLnN0YXJ0LCAwLCBwZGV2LCAmcGRldi0+ZGV2KTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGFpcm9fcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKK30KKworc3RhdGljIGludCBhaXJvX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgc3RhdGUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlDbWQgY21kOworCVJlc3AgcnNwOworCisJaWYgKChhaS0+QVBMaXN0ID09IE5VTEwpICYmCisJCShhaS0+QVBMaXN0ID0ga21hbGxvYyhzaXplb2YoQVBMaXN0UmlkKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWlmICgoYWktPlNTSUQgPT0gTlVMTCkgJiYKKwkJKGFpLT5TU0lEID0ga21hbGxvYyhzaXplb2YoU3NpZFJpZCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZWFkQVBMaXN0UmlkKGFpLCBhaS0+QVBMaXN0KTsKKwlyZWFkU3NpZFJpZChhaSwgYWktPlNTSUQpOworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJLyogdGhlIGxvY2sgd2lsbCBiZSByZWxlYXNlZCBhdCB0aGUgZW5kIG9mIHRoZSByZXN1bWUgY2FsbGJhY2sgKi8KKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhaS0+c2VtKSkKKwkJcmV0dXJuIC1FQUdBSU47CisJZGlzYWJsZV9NQUMoYWksIDApOworCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwlhaS0+cG93ZXIgPSBzdGF0ZTsKKwljbWQuY21kPUhPU1RTTEVFUDsKKwlpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApOworCisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIHN0YXRlLCAxKTsKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlyZXR1cm4gcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgYWlyb19wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJUmVzcCByc3A7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCBhaS0+cG93ZXIsIDApOworCisJaWYgKGFpLT5wb3dlciA+IDEpIHsKKwkJcmVzZXRfY2FyZChkZXYsIDApOworCQltcGlfaW5pdF9kZXNjcmlwdG9ycyhhaSk7CisJCXNldHVwX2NhcmQoYWksIGRldi0+ZGV2X2FkZHIsIDApOworCQljbGVhcl9iaXQoRkxBR19SQURJT19PRkYsICZhaS0+ZmxhZ3MpOworCQljbGVhcl9iaXQoRkxBR19QRU5ESU5HX1hNSVQsICZhaS0+ZmxhZ3MpOworCX0gZWxzZSB7CisJCU9VVDQ1MDAoYWksIEVWQUNLLCBFVl9BV0FLRU4pOworCQlPVVQ0NTAwKGFpLCBFVkFDSywgRVZfQVdBS0VOKTsKKwkJbXNsZWVwKDEwMCk7CisJfQorCisJc2V0X2JpdCAoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCWRpc2FibGVfTUFDKGFpLCAwKTsKKyAgICAgICAgbXNsZWVwKDIwMCk7CisJaWYgKGFpLT5TU0lEKSB7CisJCXdyaXRlU3NpZFJpZChhaSwgYWktPlNTSUQsIDApOworCQlrZnJlZShhaS0+U1NJRCk7CisJCWFpLT5TU0lEID0gTlVMTDsKKwl9CisJaWYgKGFpLT5BUExpc3QpIHsKKwkJd3JpdGVBUExpc3RSaWQoYWksIGFpLT5BUExpc3QsIDApOworCQlrZnJlZShhaS0+QVBMaXN0KTsKKwkJYWktPkFQTGlzdCA9IE5VTEw7CisJfQorCXdyaXRlQ29uZmlnUmlkKGFpLCAwKTsKKwllbmFibGVfTUFDKGFpLCAmcnNwLCAwKTsKKwlhaS0+cG93ZXIgPSAwOworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJZW5hYmxlX2ludGVycnVwdHMoYWkpOworCXVwKCZhaS0+c2VtKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBhaXJvX2luaXRfbW9kdWxlKCB2b2lkICkKK3sKKwlpbnQgaSwgaGF2ZV9pc2FfZGV2ID0gMDsKKworCWFpcm9fZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgiYWlyb25ldCIsCisJCQkJICAgICAgIFNfSUZESVIgfCBhaXJvX3Blcm0sCisJCQkJICAgICAgIHByb2Nfcm9vdF9kcml2ZXIpOworICAgICAgICBhaXJvX2VudHJ5LT51aWQgPSBwcm9jX3VpZDsKKyAgICAgICAgYWlyb19lbnRyeS0+Z2lkID0gcHJvY19naWQ7CisKKwlmb3IoIGkgPSAwOyBpIDwgNCAmJiBpb1tpXSAmJiBpcnFbaV07IGkrKyApIHsKKwkJcHJpbnRrKCBLRVJOX0lORk8KKwkJCSJhaXJvOiAgVHJ5aW5nIHRvIGNvbmZpZ3VyZSBJU0EgYWRhcHRlciBhdCBpcnE9JWQgaW89MHgleFxuIiwKKwkJCWlycVtpXSwgaW9baV0gKTsKKwkJaWYgKGluaXRfYWlyb19jYXJkKCBpcnFbaV0sIGlvW2ldLCAwLCBOVUxMICkpCisJCQloYXZlX2lzYV9kZXYgPSAxOworCX0KKworI2lmZGVmIENPTkZJR19QQ0kKKwlwcmludGsoIEtFUk5fSU5GTyAiYWlybzogIFByb2JpbmcgZm9yIFBDSSBhZGFwdGVyc1xuIiApOworCXBjaV9yZWdpc3Rlcl9kcml2ZXIoJmFpcm9fZHJpdmVyKTsKKwlwcmludGsoIEtFUk5fSU5GTyAiYWlybzogIEZpbmlzaGVkIHByb2JpbmcgZm9yIFBDSSBhZGFwdGVyc1xuIiApOworI2VuZGlmCisKKwkvKiBBbHdheXMgZXhpdCB3aXRoIHN1Y2Nlc3MsIGFzIHdlIGFyZSBhIGxpYnJhcnkgbW9kdWxlCisJICogYXMgd2VsbCBhcyBhIGRyaXZlciBtb2R1bGUKKwkgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFpcm9fY2xlYW51cF9tb2R1bGUoIHZvaWQgKQoreworCXdoaWxlKCBhaXJvX2RldmljZXMgKSB7CisJCXByaW50ayggS0VSTl9JTkZPICJhaXJvOiBVbnJlZ2lzdGVyaW5nICVzXG4iLCBhaXJvX2RldmljZXMtPmRldi0+bmFtZSApOworCQlzdG9wX2Fpcm9fY2FyZCggYWlyb19kZXZpY2VzLT5kZXYsIDEgKTsKKwl9CisjaWZkZWYgQ09ORklHX1BDSQorCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWlyb19kcml2ZXIpOworI2VuZGlmCisJcmVtb3ZlX3Byb2NfZW50cnkoImFpcm9uZXQiLCBwcm9jX3Jvb3RfZHJpdmVyKTsKK30KKworI2lmZGVmIFdJUkVMRVNTX0VYVAorLyoKKyAqIEluaXRpYWwgV2lyZWxlc3MgRXh0ZW5zaW9uIGNvZGUgZm9yIEFpcm9uZXQgZHJpdmVyIGJ5IDoKKyAqCUplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4gLSBIUEwgLSAxNyBOb3ZlbWJlciAwMAorICogQ29udmVyc2lvbiB0byBuZXcgZHJpdmVyIEFQSSBieSA6CisgKglKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+IC0gSFBMIC0gMjYgTWFyY2ggMDIKKyAqIEphdmllciBhbHNvIGRpZCBhIGdvb2QgYW1vdW50IG9mIHdvcmsgaGVyZSwgYWRkaW5nIHNvbWUgbmV3IGV4dGVuc2lvbnMKKyAqIGFuZCBmaXhpbmcgbXkgY29kZS4gTGV0J3MganVzdCBzYXkgdGhhdCB3aXRob3V0IGhpbSB0aGlzIGNvZGUganVzdAorICogd291bGQgbm90IHdvcmsgYXQgYWxsLi4uIC0gSmVhbiBJSQorICovCisKK3N0YXRpYyBpbnQgYWlyb19nZXRfcXVhbGl0eSAoU3RhdHVzUmlkICpzdGF0dXNfcmlkLCBDYXBhYmlsaXR5UmlkICpjYXBfcmlkKQoreworCWludCBxdWFsaXR5ID0gMDsKKworCWlmICgoc3RhdHVzX3JpZC0+bW9kZSAmIDB4M2YpID09IDB4M2YgJiYgKGNhcF9yaWQtPmhhcmRDYXAgJiA4KSkgeworCQlpZiAobWVtY21wKGNhcF9yaWQtPnByb2ROYW1lLCAiMzUwIiwgMykpCisJCQlpZiAoc3RhdHVzX3JpZC0+c2lnbmFsUXVhbGl0eSA+IDB4MjApCisJCQkJcXVhbGl0eSA9IDA7CisJCQllbHNlCisJCQkJcXVhbGl0eSA9IDB4MjAgLSBzdGF0dXNfcmlkLT5zaWduYWxRdWFsaXR5OworCQllbHNlCisJCQlpZiAoc3RhdHVzX3JpZC0+c2lnbmFsUXVhbGl0eSA+IDB4YjApCisJCQkJcXVhbGl0eSA9IDA7CisJCQllbHNlIGlmIChzdGF0dXNfcmlkLT5zaWduYWxRdWFsaXR5IDwgMHgxMCkKKwkJCQlxdWFsaXR5ID0gMHhhMDsKKwkJCWVsc2UKKwkJCQlxdWFsaXR5ID0gMHhiMCAtIHN0YXR1c19yaWQtPnNpZ25hbFF1YWxpdHk7CisJfQorCXJldHVybiBxdWFsaXR5OworfQorCisjZGVmaW5lIGFpcm9fZ2V0X21heF9xdWFsaXR5KGNhcF9yaWQpIChtZW1jbXAoKGNhcF9yaWQpLT5wcm9kTmFtZSwgIjM1MCIsIDMpID8gMHgyMCA6IDB4YTApCisjZGVmaW5lIGFpcm9fZ2V0X2F2Z19xdWFsaXR5KGNhcF9yaWQpIChtZW1jbXAoKGNhcF9yaWQpLT5wcm9kTmFtZSwgIjM1MCIsIDMpID8gMHgxMCA6IDB4NTApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBwcm90b2NvbCBuYW1lCisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgY2hhciAqY3dycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJjcHkoY3dycSwgIklFRUUgODAyLjExLURTIik7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IGZyZXF1ZW5jeQorICovCitzdGF0aWMgaW50IGFpcm9fc2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19mcmVxICpmd3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCWludCByYyA9IC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KKworCS8qIElmIHNldHRpbmcgYnkgZnJlcXVlbmN5LCBjb252ZXJ0IHRvIGEgY2hhbm5lbCAqLworCWlmKChmd3JxLT5lID09IDEpICYmCisJICAgKGZ3cnEtPm0gPj0gKGludCkgMi40MTJlOCkgJiYKKwkgICAoZndycS0+bSA8PSAoaW50KSAyLjQ4N2U4KSkgeworCQlpbnQgZiA9IGZ3cnEtPm0gLyAxMDAwMDA7CisJCWludCBjID0gMDsKKwkJd2hpbGUoKGMgPCAxNCkgJiYgKGYgIT0gZnJlcXVlbmN5X2xpc3RbY10pKQorCQkJYysrOworCQkvKiBIYWNrIHRvIGZhbGwgdGhyb3VnaC4uLiAqLworCQlmd3JxLT5lID0gMDsKKwkJZndycS0+bSA9IGMgKyAxOworCX0KKwkvKiBTZXR0aW5nIGJ5IGNoYW5uZWwgbnVtYmVyICovCisJaWYoKGZ3cnEtPm0gPiAxMDAwKSB8fCAoZndycS0+ZSA+IDApKQorCQlyYyA9IC1FT1BOT1RTVVBQOworCWVsc2UgeworCQlpbnQgY2hhbm5lbCA9IGZ3cnEtPm07CisJCS8qIFdlIHNob3VsZCBkbyBhIGJldHRlciBjaGVjayB0aGFuIHRoYXQsCisJCSAqIGJhc2VkIG9uIHRoZSBjYXJkIGNhcGFiaWxpdHkgISEhICovCisJCWlmKChjaGFubmVsIDwgMSkgfHwgKGNoYW5uZWwgPiAxNikpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTmV3IGNoYW5uZWwgdmFsdWUgb2YgJWQgaXMgaW52YWxpZCFcbiIsIGRldi0+bmFtZSwgZndycS0+bSk7CisJCQlyYyA9IC1FSU5WQUw7CisJCX0gZWxzZSB7CisJCQlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwkJCS8qIFllcyAhIFdlIGNhbiBzZXQgaXQgISEhICovCisJCQlsb2NhbC0+Y29uZmlnLmNoYW5uZWxTZXQgPSAodTE2KShjaGFubmVsIC0gMSk7CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisJCX0KKwl9CisJcmV0dXJuIHJjOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBmcmVxdWVuY3kKKyAqLworc3RhdGljIGludCBhaXJvX2dldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfZnJlcSAqZndycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlTdGF0dXNSaWQgc3RhdHVzX3JpZDsJCS8qIENhcmQgc3RhdHVzIGluZm8gKi8KKworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCWlmICgobG9jYWwtPmNvbmZpZy5vcG1vZGUgJiAweEZGKSA9PSBNT0RFX1NUQV9FU1MpCisJCXN0YXR1c19yaWQuY2hhbm5lbCA9IGxvY2FsLT5jb25maWcuY2hhbm5lbFNldDsKKwllbHNlCisJCXJlYWRTdGF0dXNSaWQobG9jYWwsICZzdGF0dXNfcmlkLCAxKTsKKworI2lmZGVmIFdFWFRfVVNFQ0hBTk5FTFMKKwlmd3JxLT5tID0gKChpbnQpc3RhdHVzX3JpZC5jaGFubmVsKSArIDE7CisJZndycS0+ZSA9IDA7CisjZWxzZQorCXsKKwkJaW50IGYgPSAoaW50KXN0YXR1c19yaWQuY2hhbm5lbDsKKwkJZndycS0+bSA9IGZyZXF1ZW5jeV9saXN0W2ZdICogMTAwMDAwOworCQlmd3JxLT5lID0gMTsKKwl9CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBFU1NJRAorICovCitzdGF0aWMgaW50IGFpcm9fc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJUmVzcCByc3A7CisJU3NpZFJpZCBTU0lEX3JpZDsJCS8qIFNTSURzICovCisKKwkvKiBSZWxvYWQgdGhlIGxpc3Qgb2YgY3VycmVudCBTU0lEICovCisJcmVhZFNzaWRSaWQobG9jYWwsICZTU0lEX3JpZCk7CisKKwkvKiBDaGVjayBpZiB3ZSBhc2tlZCBmb3IgYGFueScgKi8KKwlpZihkd3JxLT5mbGFncyA9PSAwKSB7CisJCS8qIEp1c3Qgc2VuZCBhbiBlbXB0eSBTU0lEIGxpc3QgKi8KKwkJbWVtc2V0KCZTU0lEX3JpZCwgMCwgc2l6ZW9mKFNTSURfcmlkKSk7CisJfSBlbHNlIHsKKwkJaW50CWluZGV4ID0gKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisKKwkJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIHN0cmluZyAqLworCQlpZihkd3JxLT5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSsxKSB7CisJCQlyZXR1cm4gLUUyQklHIDsKKwkJfQorCQkvKiBDaGVjayBpZiBpbmRleCBpcyB2YWxpZCAqLworCQlpZigoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gNCkpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogU2V0IHRoZSBTU0lEICovCisJCW1lbXNldChTU0lEX3JpZC5zc2lkc1tpbmRleF0uc3NpZCwgMCwKKwkJICAgICAgIHNpemVvZihTU0lEX3JpZC5zc2lkc1tpbmRleF0uc3NpZCkpOworCQltZW1jcHkoU1NJRF9yaWQuc3NpZHNbaW5kZXhdLnNzaWQsIGV4dHJhLCBkd3JxLT5sZW5ndGgpOworCQlTU0lEX3JpZC5zc2lkc1tpbmRleF0ubGVuID0gZHdycS0+bGVuZ3RoIC0gMTsKKwl9CisJU1NJRF9yaWQubGVuID0gc2l6ZW9mKFNTSURfcmlkKTsKKwkvKiBXcml0ZSBpdCB0byB0aGUgY2FyZCAqLworCWRpc2FibGVfTUFDKGxvY2FsLCAxKTsKKwl3cml0ZVNzaWRSaWQobG9jYWwsICZTU0lEX3JpZCwgMSk7CisJZW5hYmxlX01BQyhsb2NhbCwgJnJzcCwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgRVNTSUQKKyAqLworc3RhdGljIGludCBhaXJvX2dldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCVN0YXR1c1JpZCBzdGF0dXNfcmlkOwkJLyogQ2FyZCBzdGF0dXMgaW5mbyAqLworCisJcmVhZFN0YXR1c1JpZChsb2NhbCwgJnN0YXR1c19yaWQsIDEpOworCisJLyogTm90ZSA6IGlmIGR3cnEtPmZsYWdzICE9IDAsIHdlIHNob3VsZAorCSAqIGdldCB0aGUgcmVsZXZhbnQgU1NJRCBmcm9tIHRoZSBTU0lEIGxpc3QuLi4gKi8KKworCS8qIEdldCB0aGUgY3VycmVudCBTU0lEICovCisJbWVtY3B5KGV4dHJhLCBzdGF0dXNfcmlkLlNTSUQsIHN0YXR1c19yaWQuU1NJRGxlbik7CisJZXh0cmFbc3RhdHVzX3JpZC5TU0lEbGVuXSA9ICdcMCc7CisJLyogSWYgbm9uZSwgd2UgbWF5IHdhbnQgdG8gZ2V0IHRoZSBvbmUgdGhhdCB3YXMgc2V0ICovCisKKwkvKiBQdXNoIGl0IG91dCAhICovCisJZHdycS0+bGVuZ3RoID0gc3RhdHVzX3JpZC5TU0lEbGVuICsgMTsKKwlkd3JxLT5mbGFncyA9IDE7IC8qIGFjdGl2ZSAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IEFQIGFkZHJlc3MKKyAqLworc3RhdGljIGludCBhaXJvX3NldF93YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQlzdHJ1Y3Qgc29ja2FkZHIgKmF3cnEsCisJCQljaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlDbWQgY21kOworCVJlc3AgcnNwOworCUFQTGlzdFJpZCBBUExpc3RfcmlkOworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGJjYXN0W0VUSF9BTEVOXSA9IHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9OworCisJaWYgKGF3cnEtPnNhX2ZhbWlseSAhPSBBUlBIUkRfRVRIRVIpCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UgaWYgKCFtZW1jbXAoYmNhc3QsIGF3cnEtPnNhX2RhdGEsIEVUSF9BTEVOKSkgeworCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCQljbWQuY21kPUNNRF9MT1NFX1NZTkM7CisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmxvY2FsLT5zZW0pKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJaXNzdWVjb21tYW5kKGxvY2FsLCAmY21kLCAmcnNwKTsKKwkJdXAoJmxvY2FsLT5zZW0pOworCX0gZWxzZSB7CisJCW1lbXNldCgmQVBMaXN0X3JpZCwgMCwgc2l6ZW9mKEFQTGlzdF9yaWQpKTsKKwkJQVBMaXN0X3JpZC5sZW4gPSBzaXplb2YoQVBMaXN0X3JpZCk7CisJCW1lbWNweShBUExpc3RfcmlkLmFwWzBdLCBhd3JxLT5zYV9kYXRhLCBFVEhfQUxFTik7CisJCWRpc2FibGVfTUFDKGxvY2FsLCAxKTsKKwkJd3JpdGVBUExpc3RSaWQobG9jYWwsICZBUExpc3RfcmlkLCAxKTsKKwkJZW5hYmxlX01BQyhsb2NhbCwgJnJzcCwgMSk7CisJfQorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBBUCBhZGRyZXNzCisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IHNvY2thZGRyICphd3JxLAorCQkJY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJU3RhdHVzUmlkIHN0YXR1c19yaWQ7CQkvKiBDYXJkIHN0YXR1cyBpbmZvICovCisKKwlyZWFkU3RhdHVzUmlkKGxvY2FsLCAmc3RhdHVzX3JpZCwgMSk7CisKKwkvKiBUZW50YXRpdmUuIFRoaXMgc2VlbXMgdG8gd29yaywgd293LCBJJ20gbHVja3kgISEhICovCisJbWVtY3B5KGF3cnEtPnNhX2RhdGEsIHN0YXR1c19yaWQuYnNzaWRbMF0sIEVUSF9BTEVOKTsKKwlhd3JxLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgTmlja25hbWUKKyAqLworc3RhdGljIGludCBhaXJvX3NldF9uaWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisKKwkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nICovCisJaWYoZHdycS0+bGVuZ3RoID4gMTYgKyAxKSB7CisJCXJldHVybiAtRTJCSUc7CisJfQorCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCW1lbXNldChsb2NhbC0+Y29uZmlnLm5vZGVOYW1lLCAwLCBzaXplb2YobG9jYWwtPmNvbmZpZy5ub2RlTmFtZSkpOworCW1lbWNweShsb2NhbC0+Y29uZmlnLm5vZGVOYW1lLCBleHRyYSwgZHdycS0+bGVuZ3RoKTsKKwlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBOaWNrbmFtZQorICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X25pY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCXN0cm5jcHkoZXh0cmEsIGxvY2FsLT5jb25maWcubm9kZU5hbWUsIDE2KTsKKwlleHRyYVsxNl0gPSAnXDAnOworCWR3cnEtPmxlbmd0aCA9IHN0cmxlbihleHRyYSkgKyAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IEJpdC1SYXRlCisgKi8KK3N0YXRpYyBpbnQgYWlyb19zZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCUNhcGFiaWxpdHlSaWQgY2FwX3JpZDsJCS8qIENhcmQgY2FwYWJpbGl0eSBpbmZvICovCisJdTgJYnJhdGUgPSAwOworCWludAlpOworCisJLyogRmlyc3QgOiBnZXQgYSB2YWxpZCBiaXQgcmF0ZSB2YWx1ZSAqLworCXJlYWRDYXBhYmlsaXR5UmlkKGxvY2FsLCAmY2FwX3JpZCwgMSk7CisKKwkvKiBXaGljaCB0eXBlIG9mIHZhbHVlID8gKi8KKwlpZigodndycS0+dmFsdWUgPCA4KSAmJiAodndycS0+dmFsdWUgPj0gMCkpIHsKKwkJLyogU2V0dGluZyBieSByYXRlIGluZGV4ICovCisJCS8qIEZpbmQgdmFsdWUgaW4gdGhlIG1hZ2ljIHJhdGUgdGFibGUgKi8KKwkJYnJhdGUgPSBjYXBfcmlkLnN1cHBvcnRlZFJhdGVzW3Z3cnEtPnZhbHVlXTsKKwl9IGVsc2UgeworCQkvKiBTZXR0aW5nIGJ5IGZyZXF1ZW5jeSB2YWx1ZSAqLworCQl1OAlub3JtdmFsdWUgPSAodTgpICh2d3JxLT52YWx1ZS81MDAwMDApOworCisJCS8qIENoZWNrIGlmIHJhdGUgaXMgdmFsaWQgKi8KKwkJZm9yKGkgPSAwIDsgaSA8IDggOyBpKyspIHsKKwkJCWlmKG5vcm12YWx1ZSA9PSBjYXBfcmlkLnN1cHBvcnRlZFJhdGVzW2ldKSB7CisJCQkJYnJhdGUgPSBub3JtdmFsdWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJLyogLTEgZGVzaWduZWQgdGhlIG1heCByYXRlIChtb3N0bHkgYXV0byBtb2RlKSAqLworCWlmKHZ3cnEtPnZhbHVlID09IC0xKSB7CisJCS8qIEdldCB0aGUgaGlnaGVzdCBhdmFpbGFibGUgcmF0ZSAqLworCQlmb3IoaSA9IDAgOyBpIDwgOCA7IGkrKykgeworCQkJaWYoY2FwX3JpZC5zdXBwb3J0ZWRSYXRlc1tpXSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisJCWlmKGkgIT0gMCkKKwkJCWJyYXRlID0gY2FwX3JpZC5zdXBwb3J0ZWRSYXRlc1tpIC0gMV07CisJfQorCS8qIENoZWNrIHRoYXQgaXQgaXMgdmFsaWQgKi8KKwlpZihicmF0ZSA9PSAwKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCS8qIE5vdywgY2hlY2sgaWYgd2Ugd2FudCBhIGZpeGVkIG9yIGF1dG8gdmFsdWUgKi8KKwlpZih2d3JxLT5maXhlZCA9PSAwKSB7CisJCS8qIEZpbGwgYWxsIHRoZSByYXRlcyB1cCB0byB0aGlzIG1heCByYXRlICovCisJCW1lbXNldChsb2NhbC0+Y29uZmlnLnJhdGVzLCAwLCA4KTsKKwkJZm9yKGkgPSAwIDsgaSA8IDggOyBpKyspIHsKKwkJCWxvY2FsLT5jb25maWcucmF0ZXNbaV0gPSBjYXBfcmlkLnN1cHBvcnRlZFJhdGVzW2ldOworCQkJaWYobG9jYWwtPmNvbmZpZy5yYXRlc1tpXSA9PSBicmF0ZSkKKwkJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEZpeGVkIG1vZGUgKi8KKwkJLyogT25lIHJhdGUsIGZpeGVkICovCisJCW1lbXNldChsb2NhbC0+Y29uZmlnLnJhdGVzLCAwLCA4KTsKKwkJbG9jYWwtPmNvbmZpZy5yYXRlc1swXSA9IGJyYXRlOworCX0KKwlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBCaXQtUmF0ZQorICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlTdGF0dXNSaWQgc3RhdHVzX3JpZDsJCS8qIENhcmQgc3RhdHVzIGluZm8gKi8KKworCXJlYWRTdGF0dXNSaWQobG9jYWwsICZzdGF0dXNfcmlkLCAxKTsKKworCXZ3cnEtPnZhbHVlID0gc3RhdHVzX3JpZC5jdXJyZW50WG1pdFJhdGUgKiA1MDAwMDA7CisJLyogSWYgbW9yZSB0aGFuIG9uZSByYXRlLCBzZXQgYXV0byAqLworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCXZ3cnEtPmZpeGVkID0gKGxvY2FsLT5jb25maWcucmF0ZXNbMV0gPT0gMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgUlRTIHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IGFpcm9fc2V0X3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCWNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCWludCBydGhyID0gdndycS0+dmFsdWU7CisKKwlpZih2d3JxLT5kaXNhYmxlZCkKKwkJcnRociA9IDIzMTI7CisJaWYoKHJ0aHIgPCAwKSB8fCAocnRociA+IDIzMTIpKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwlsb2NhbC0+Y29uZmlnLnJ0c1RocmVzID0gcnRocjsKKwlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBSVFMgdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisKKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwl2d3JxLT52YWx1ZSA9IGxvY2FsLT5jb25maWcucnRzVGhyZXM7CisJdndycS0+ZGlzYWJsZWQgPSAodndycS0+dmFsdWUgPj0gMjMxMik7CisJdndycS0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IEZyYWdtZW50YXRpb24gdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgYWlyb19zZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCWludCBmdGhyID0gdndycS0+dmFsdWU7CisKKwlpZih2d3JxLT5kaXNhYmxlZCkKKwkJZnRociA9IDIzMTI7CisJaWYoKGZ0aHIgPCAyNTYpIHx8IChmdGhyID4gMjMxMikpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWZ0aHIgJj0gfjB4MTsJLyogR2V0IGFuIGV2ZW4gdmFsdWUgLSBpcyBpdCByZWFsbHkgbmVlZGVkID8/PyAqLworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCWxvY2FsLT5jb25maWcuZnJhZ1RocmVzaCA9ICh1MTYpZnRocjsKKwlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBGcmFnbWVudGF0aW9uIHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCXZ3cnEtPnZhbHVlID0gbG9jYWwtPmNvbmZpZy5mcmFnVGhyZXNoOworCXZ3cnEtPmRpc2FibGVkID0gKHZ3cnEtPnZhbHVlID49IDIzMTIpOworCXZ3cnEtPmZpeGVkID0gMTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBNb2RlIG9mIE9wZXJhdGlvbgorICovCitzdGF0aWMgaW50IGFpcm9fc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIF9fdTMyICp1d3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCWludCByZXNldCA9IDA7CisKKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwlpZiAoKGxvY2FsLT5jb25maWcucm1vZGUgJiAweGZmKSA+PSBSWE1PREVfUkZNT04pCisJCXJlc2V0ID0gMTsKKworCXN3aXRjaCgqdXdycSkgeworCQljYXNlIElXX01PREVfQURIT0M6CisJCQlsb2NhbC0+Y29uZmlnLm9wbW9kZSAmPSAweEZGMDA7CisJCQlsb2NhbC0+Y29uZmlnLm9wbW9kZSB8PSBNT0RFX1NUQV9JQlNTOworCQkJbG9jYWwtPmNvbmZpZy5ybW9kZSAmPSAweGZlMDA7CisJCQlsb2NhbC0+Y29uZmlnLnNjYW5Nb2RlID0gU0NBTk1PREVfQUNUSVZFOworCQkJY2xlYXJfYml0IChGTEFHXzgwMl8xMSwgJmxvY2FsLT5mbGFncyk7CisJCQlicmVhazsKKwkJY2FzZSBJV19NT0RFX0lORlJBOgorCQkJbG9jYWwtPmNvbmZpZy5vcG1vZGUgJj0gMHhGRjAwOworCQkJbG9jYWwtPmNvbmZpZy5vcG1vZGUgfD0gTU9ERV9TVEFfRVNTOworCQkJbG9jYWwtPmNvbmZpZy5ybW9kZSAmPSAweGZlMDA7CisJCQlsb2NhbC0+Y29uZmlnLnNjYW5Nb2RlID0gU0NBTk1PREVfQUNUSVZFOworCQkJY2xlYXJfYml0IChGTEFHXzgwMl8xMSwgJmxvY2FsLT5mbGFncyk7CisJCQlicmVhazsKKwkJY2FzZSBJV19NT0RFX01BU1RFUjoKKwkJCWxvY2FsLT5jb25maWcub3Btb2RlICY9IDB4RkYwMDsKKwkJCWxvY2FsLT5jb25maWcub3Btb2RlIHw9IE1PREVfQVA7CisJCQlsb2NhbC0+Y29uZmlnLnJtb2RlICY9IDB4ZmUwMDsKKwkJCWxvY2FsLT5jb25maWcuc2Nhbk1vZGUgPSBTQ0FOTU9ERV9BQ1RJVkU7CisJCQljbGVhcl9iaXQgKEZMQUdfODAyXzExLCAmbG9jYWwtPmZsYWdzKTsKKwkJCWJyZWFrOworCQljYXNlIElXX01PREVfUkVQRUFUOgorCQkJbG9jYWwtPmNvbmZpZy5vcG1vZGUgJj0gMHhGRjAwOworCQkJbG9jYWwtPmNvbmZpZy5vcG1vZGUgfD0gTU9ERV9BUF9SUFRSOworCQkJbG9jYWwtPmNvbmZpZy5ybW9kZSAmPSAweGZlMDA7CisJCQlsb2NhbC0+Y29uZmlnLnNjYW5Nb2RlID0gU0NBTk1PREVfQUNUSVZFOworCQkJY2xlYXJfYml0IChGTEFHXzgwMl8xMSwgJmxvY2FsLT5mbGFncyk7CisJCQlicmVhazsKKwkJY2FzZSBJV19NT0RFX01PTklUT1I6CisJCQlsb2NhbC0+Y29uZmlnLm9wbW9kZSAmPSAweEZGMDA7CisJCQlsb2NhbC0+Y29uZmlnLm9wbW9kZSB8PSBNT0RFX1NUQV9FU1M7CisJCQlsb2NhbC0+Y29uZmlnLnJtb2RlICY9IDB4ZmUwMDsKKwkJCWxvY2FsLT5jb25maWcucm1vZGUgfD0gUlhNT0RFX1JGTU9OIHwgUlhNT0RFX0RJU0FCTEVfODAyXzNfSEVBREVSOworCQkJbG9jYWwtPmNvbmZpZy5zY2FuTW9kZSA9IFNDQU5NT0RFX1BBU1NJVkU7CisJCQlzZXRfYml0IChGTEFHXzgwMl8xMSwgJmxvY2FsLT5mbGFncyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocmVzZXQpCisJCXNldF9iaXQgKEZMQUdfUkVTRVQsICZsb2NhbC0+ZmxhZ3MpOworCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKworCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IE1vZGUgb2YgT3BlcmF0aW9uCisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgX191MzIgKnV3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisKKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwkvKiBJZiBub3QgbWFuYWdlZCwgYXNzdW1lIGl0J3MgYWQtaG9jICovCisJc3dpdGNoIChsb2NhbC0+Y29uZmlnLm9wbW9kZSAmIDB4RkYpIHsKKwkJY2FzZSBNT0RFX1NUQV9FU1M6CisJCQkqdXdycSA9IElXX01PREVfSU5GUkE7CisJCQlicmVhazsKKwkJY2FzZSBNT0RFX0FQOgorCQkJKnV3cnEgPSBJV19NT0RFX01BU1RFUjsKKwkJCWJyZWFrOworCQljYXNlIE1PREVfQVBfUlBUUjoKKwkJCSp1d3JxID0gSVdfTU9ERV9SRVBFQVQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCSp1d3JxID0gSVdfTU9ERV9BREhPQzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgRW5jcnlwdGlvbiBLZXkKKyAqLworc3RhdGljIGludCBhaXJvX3NldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlDYXBhYmlsaXR5UmlkIGNhcF9yaWQ7CQkvKiBDYXJkIGNhcGFiaWxpdHkgaW5mbyAqLworCisJLyogSXMgV0VQIHN1cHBvcnRlZCA/ICovCisJcmVhZENhcGFiaWxpdHlSaWQobG9jYWwsICZjYXBfcmlkLCAxKTsKKwkvKiBPbGRlciBmaXJtd2FyZSBkb2Vzbid0IHN1cHBvcnQgdGhpcy4uLgorCWlmKCEoY2FwX3JpZC5zb2Z0Q2FwICYgMikpIHsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0gKi8KKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKworCS8qIEJhc2ljIGNoZWNraW5nOiBkbyB3ZSBoYXZlIGEga2V5IHRvIHNldCA/CisJICogTm90ZSA6IHdpdGggdGhlIG5ldyBBUEksIGl0J3MgaW1wb3NzaWJsZSB0byBnZXQgYSBOVUxMIHBvaW50ZXIuCisJICogVGhlcmVmb3JlLCB3ZSBuZWVkIHRvIGNoZWNrIGEga2V5IHNpemUgPT0gMCBpbnN0ZWFkLgorCSAqIE5ldyB2ZXJzaW9uIG9mIGl3Y29uZmlnIHByb3Blcmx5IHNldCB0aGUgSVdfRU5DT0RFX05PS0VZIGZsYWcKKwkgKiB3aGVuIG5vIGtleSBpcyBwcmVzZW50IChvbmx5IGNoYW5nZSBmbGFncyksIGJ1dCBvbGRlciB2ZXJzaW9ucworCSAqIGRvbid0IGRvIGl0LiAtIEplYW4gSUkgKi8KKwlpZiAoZHdycS0+bGVuZ3RoID4gMCkgeworCQl3ZXBfa2V5X3Qga2V5OworCQlpbnQgaW5kZXggPSAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJaW50IGN1cnJlbnRfaW5kZXggPSBnZXRfd2VwX2tleShsb2NhbCwgMHhmZmZmKTsKKwkJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIGtleSAqLworCQlpZiAoZHdycS0+bGVuZ3RoID4gTUFYX0tFWV9TSVpFKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKiBDaGVjayB0aGUgaW5kZXggKG5vbmUgLT4gdXNlIGN1cnJlbnQpICovCisJCWlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gKChjYXBfcmlkLnNvZnRDYXAgJiAweDgwKSA/IDQ6MSkpKQorCQkJaW5kZXggPSBjdXJyZW50X2luZGV4OworCQkvKiBTZXQgdGhlIGxlbmd0aCAqLworCQlpZiAoZHdycS0+bGVuZ3RoID4gTUlOX0tFWV9TSVpFKQorCQkJa2V5LmxlbiA9IE1BWF9LRVlfU0laRTsKKwkJZWxzZQorCQkJaWYgKGR3cnEtPmxlbmd0aCA+IDApCisJCQkJa2V5LmxlbiA9IE1JTl9LRVlfU0laRTsKKwkJCWVsc2UKKwkJCQkvKiBEaXNhYmxlIHRoZSBrZXkgKi8KKwkJCQlrZXkubGVuID0gMDsKKwkJLyogQ2hlY2sgaWYgdGhlIGtleSBpcyBub3QgbWFya2VkIGFzIGludmFsaWQgKi8KKwkJaWYoIShkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkpIHsKKwkJCS8qIENsZWFudXAgKi8KKwkJCW1lbXNldChrZXkua2V5LCAwLCBNQVhfS0VZX1NJWkUpOworCQkJLyogQ29weSB0aGUga2V5IGluIHRoZSBkcml2ZXIgKi8KKwkJCW1lbWNweShrZXkua2V5LCBleHRyYSwgZHdycS0+bGVuZ3RoKTsKKwkJCS8qIFNlbmQgdGhlIGtleSB0byB0aGUgY2FyZCAqLworCQkJc2V0X3dlcF9rZXkobG9jYWwsIGluZGV4LCBrZXkua2V5LCBrZXkubGVuLCAxLCAxKTsKKwkJfQorCQkvKiBXRSBzcGVjaWZ5IHRoYXQgaWYgYSB2YWxpZCBrZXkgaXMgc2V0LCBlbmNyeXB0aW9uCisJCSAqIHNob3VsZCBiZSBlbmFibGVkICh1c2VyIG1heSB0dXJuIGl0IG9mZiBsYXRlcikKKwkJICogVGhpcyBpcyBhbHNvIGhvdyAiaXdjb25maWcgZXRoWCBrZXkgb24iIHdvcmtzICovCisJCWlmKChpbmRleCA9PSBjdXJyZW50X2luZGV4KSAmJiAoa2V5LmxlbiA+IDApICYmCisJCSAgIChsb2NhbC0+Y29uZmlnLmF1dGhUeXBlID09IEFVVEhfT1BFTikpIHsKKwkJCWxvY2FsLT5jb25maWcuYXV0aFR5cGUgPSBBVVRIX0VOQ1JZUFQ7CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBEbyB3ZSB3YW50IHRvIGp1c3Qgc2V0IHRoZSB0cmFuc21pdCBrZXkgaW5kZXggPyAqLworCQlpbnQgaW5kZXggPSAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJaWYgKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPCAoKGNhcF9yaWQuc29mdENhcCAmIDB4ODApPzQ6MSkpKSB7CisJCQlzZXRfd2VwX2tleShsb2NhbCwgaW5kZXgsIE5VTEwsIDAsIDEsIDEpOworCQl9IGVsc2UKKwkJCS8qIERvbid0IGNvbXBsYWluIGlmIG9ubHkgY2hhbmdlIHRoZSBtb2RlICovCisJCQlpZighZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfTU9ERSkgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCX0KKwkvKiBSZWFkIHRoZSBmbGFncyAqLworCWlmKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKQorCQlsb2NhbC0+Y29uZmlnLmF1dGhUeXBlID0gQVVUSF9PUEVOOwkvLyBkaXNhYmxlIGVuY3J5cHRpb24KKwlpZihkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKQorCQlsb2NhbC0+Y29uZmlnLmF1dGhUeXBlID0gQVVUSF9TSEFSRURLRVk7CS8vIE9ubHkgQm90aAorCWlmKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX09QRU4pCisJCWxvY2FsLT5jb25maWcuYXV0aFR5cGUgPSBBVVRIX0VOQ1JZUFQ7CS8vIE9ubHkgV2VwCisJLyogQ29tbWl0IHRoZSBjaGFuZ2VzIHRvIGZsYWdzIGlmIG5lZWRlZCAqLworCWlmKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX01PREUpCisJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBFbmNyeXB0aW9uIEtleQorICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCWludCBpbmRleCA9IChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCUNhcGFiaWxpdHlSaWQgY2FwX3JpZDsJCS8qIENhcmQgY2FwYWJpbGl0eSBpbmZvICovCisKKwkvKiBJcyBpdCBzdXBwb3J0ZWQgPyAqLworCXJlYWRDYXBhYmlsaXR5UmlkKGxvY2FsLCAmY2FwX3JpZCwgMSk7CisJaWYoIShjYXBfcmlkLnNvZnRDYXAgJiAyKSkgeworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCS8qIENoZWNrIGVuY3J5cHRpb24gbW9kZSAqLworCXN3aXRjaChsb2NhbC0+Y29uZmlnLmF1dGhUeXBlKQl7CisJCWNhc2UgQVVUSF9FTkNSWVBUOgorCQkJZHdycS0+ZmxhZ3MgPSBJV19FTkNPREVfT1BFTjsKKwkJCWJyZWFrOworCQljYXNlIEFVVEhfU0hBUkVES0VZOgorCQkJZHdycS0+ZmxhZ3MgPSBJV19FTkNPREVfUkVTVFJJQ1RFRDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQljYXNlIEFVVEhfT1BFTjoKKwkJCWR3cnEtPmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQkJYnJlYWs7CisJfQorCS8qIFdlIGNhbid0IHJldHVybiB0aGUga2V5LCBzbyBzZXQgdGhlIHByb3BlciBmbGFnIGFuZCByZXR1cm4gemVybyAqLworCWR3cnEtPmZsYWdzIHw9IElXX0VOQ09ERV9OT0tFWTsKKwltZW1zZXQoZXh0cmEsIDAsIDE2KTsKKworCS8qIFdoaWNoIGtleSBkbyB3ZSB3YW50ID8gLTEgLT4gdHggaW5kZXggKi8KKwlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49ICgoY2FwX3JpZC5zb2Z0Q2FwICYgMHg4MCkgPyA0IDogMSkpKQorCQlpbmRleCA9IGdldF93ZXBfa2V5KGxvY2FsLCAweGZmZmYpOworCWR3cnEtPmZsYWdzIHw9IGluZGV4ICsgMTsKKwkvKiBDb3B5IHRoZSBrZXkgdG8gdGhlIHVzZXIgYnVmZmVyICovCisJZHdycS0+bGVuZ3RoID0gZ2V0X3dlcF9rZXkobG9jYWwsIGluZGV4KTsKKwlpZiAoZHdycS0+bGVuZ3RoID4gMTYpIHsKKwkJZHdycS0+bGVuZ3RoPTA7CisJfQorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBUeC1Qb3dlcgorICovCitzdGF0aWMgaW50IGFpcm9fc2V0X3R4cG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJQ2FwYWJpbGl0eVJpZCBjYXBfcmlkOwkJLyogQ2FyZCBjYXBhYmlsaXR5IGluZm8gKi8KKwlpbnQgaTsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJcmVhZENhcGFiaWxpdHlSaWQobG9jYWwsICZjYXBfcmlkLCAxKTsKKworCWlmICh2d3JxLT5kaXNhYmxlZCkgeworCQlzZXRfYml0IChGTEFHX1JBRElPX09GRiwgJmxvY2FsLT5mbGFncyk7CisJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKwkJcmV0dXJuIC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KKwl9CisJaWYgKHZ3cnEtPmZsYWdzICE9IElXX1RYUE9XX01XQVRUKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljbGVhcl9iaXQgKEZMQUdfUkFESU9fT0ZGLCAmbG9jYWwtPmZsYWdzKTsKKwlmb3IgKGkgPSAwOyBjYXBfcmlkLnR4UG93ZXJMZXZlbHNbaV0gJiYgKGkgPCA4KTsgaSsrKQorCQlpZiAoKHZ3cnEtPnZhbHVlPT1jYXBfcmlkLnR4UG93ZXJMZXZlbHNbaV0pKSB7CisJCQlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwkJCWxvY2FsLT5jb25maWcudHhQb3dlciA9IHZ3cnEtPnZhbHVlOworCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCQkJcmMgPSAtRUlOUFJPR1JFU1M7CS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KKwkJCWJyZWFrOworCQl9CisJcmV0dXJuIHJjOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBUeC1Qb3dlcgorICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X3R4cG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisKKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwl2d3JxLT52YWx1ZSA9IGxvY2FsLT5jb25maWcudHhQb3dlcjsKKwl2d3JxLT5maXhlZCA9IDE7CS8qIE5vIHBvd2VyIGNvbnRyb2wgKi8KKwl2d3JxLT5kaXNhYmxlZCA9IHRlc3RfYml0KEZMQUdfUkFESU9fT0ZGLCAmbG9jYWwtPmZsYWdzKTsKKwl2d3JxLT5mbGFncyA9IElXX1RYUE9XX01XQVRUOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IFJldHJ5IGxpbWl0cworICovCitzdGF0aWMgaW50IGFpcm9fc2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJaW50IHJjID0gLUVJTlZBTDsKKworCWlmKHZ3cnEtPmRpc2FibGVkKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwlpZih2d3JxLT5mbGFncyAmIElXX1JFVFJZX0xJTUlUKSB7CisJCWlmKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTUFYKQorCQkJbG9jYWwtPmNvbmZpZy5sb25nUmV0cnlMaW1pdCA9IHZ3cnEtPnZhbHVlOworCQllbHNlIGlmICh2d3JxLT5mbGFncyAmIElXX1JFVFJZX01JTikKKwkJCWxvY2FsLT5jb25maWcuc2hvcnRSZXRyeUxpbWl0ID0gdndycS0+dmFsdWU7CisJCWVsc2UgeworCQkJLyogTm8gbW9kaWZpZXIgOiBzZXQgYm90aCAqLworCQkJbG9jYWwtPmNvbmZpZy5sb25nUmV0cnlMaW1pdCA9IHZ3cnEtPnZhbHVlOworCQkJbG9jYWwtPmNvbmZpZy5zaG9ydFJldHJ5TGltaXQgPSB2d3JxLT52YWx1ZTsKKwkJfQorCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisJCXJjID0gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworCX0KKwlpZih2d3JxLT5mbGFncyAmIElXX1JFVFJZX0xJRkVUSU1FKSB7CisJCWxvY2FsLT5jb25maWcudHhMaWZldGltZSA9IHZ3cnEtPnZhbHVlIC8gMTAyNDsKKwkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCQlyYyA9IC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KKwl9CisJcmV0dXJuIHJjOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBSZXRyeSBsaW1pdHMKKyAqLworc3RhdGljIGludCBhaXJvX2dldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCisJdndycS0+ZGlzYWJsZWQgPSAwOyAgICAgIC8qIENhbid0IGJlIGRpc2FibGVkICovCisKKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwkvKiBOb3RlIDogYnkgZGVmYXVsdCwgZGlzcGxheSB0aGUgbWluIHJldHJ5IG51bWJlciAqLworCWlmKCh2d3JxLT5mbGFncyAmIElXX1JFVFJZX1RZUEUpID09IElXX1JFVFJZX0xJRkVUSU1FKSB7CisJCXZ3cnEtPmZsYWdzID0gSVdfUkVUUllfTElGRVRJTUU7CisJCXZ3cnEtPnZhbHVlID0gKGludClsb2NhbC0+Y29uZmlnLnR4TGlmZXRpbWUgKiAxMDI0OworCX0gZWxzZSBpZigodndycS0+ZmxhZ3MgJiBJV19SRVRSWV9NQVgpKSB7CisJCXZ3cnEtPmZsYWdzID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9NQVg7CisJCXZ3cnEtPnZhbHVlID0gKGludClsb2NhbC0+Y29uZmlnLmxvbmdSZXRyeUxpbWl0OworCX0gZWxzZSB7CisJCXZ3cnEtPmZsYWdzID0gSVdfUkVUUllfTElNSVQ7CisJCXZ3cnEtPnZhbHVlID0gKGludClsb2NhbC0+Y29uZmlnLnNob3J0UmV0cnlMaW1pdDsKKwkJaWYoKGludClsb2NhbC0+Y29uZmlnLnNob3J0UmV0cnlMaW1pdCAhPSAoaW50KWxvY2FsLT5jb25maWcubG9uZ1JldHJ5TGltaXQpCisJCQl2d3JxLT5mbGFncyB8PSBJV19SRVRSWV9NSU47CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHJhbmdlIGluZm8KKyAqLworc3RhdGljIGludCBhaXJvX2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOworCUNhcGFiaWxpdHlSaWQgY2FwX3JpZDsJCS8qIENhcmQgY2FwYWJpbGl0eSBpbmZvICovCisJaW50CQlpOworCWludAkJazsKKworCXJlYWRDYXBhYmlsaXR5UmlkKGxvY2FsLCAmY2FwX3JpZCwgMSk7CisKKwlkd3JxLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZigqcmFuZ2UpKTsKKwlyYW5nZS0+bWluX253aWQgPSAweDAwMDA7CisJcmFuZ2UtPm1heF9ud2lkID0gMHgwMDAwOworCXJhbmdlLT5udW1fY2hhbm5lbHMgPSAxNDsKKwkvKiBTaG91bGQgYmUgYmFzZWQgb24gY2FwX3JpZC5jb3VudHJ5IHRvIGdpdmUgb25seQorCSAqIHdoYXQgdGhlIGN1cnJlbnQgY2FyZCBzdXBwb3J0ICovCisJayA9IDA7CisJZm9yKGkgPSAwOyBpIDwgMTQ7IGkrKykgeworCQlyYW5nZS0+ZnJlcVtrXS5pID0gaSArIDE7IC8qIExpc3QgaW5kZXggKi8KKwkJcmFuZ2UtPmZyZXFba10ubSA9IGZyZXF1ZW5jeV9saXN0W2ldICogMTAwMDAwOworCQlyYW5nZS0+ZnJlcVtrKytdLmUgPSAxOwkvKiBWYWx1ZXMgaW4gdGFibGUgaW4gTUh6IC0+ICogMTBeNSAqIDEwICovCisJfQorCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gazsKKworCS8qIEh1bS4uLiBTaG91bGQgcHV0IHRoZSByaWdodCB2YWx1ZXMgdGhlcmUgKi8KKwlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IGFpcm9fZ2V0X21heF9xdWFsaXR5KCZjYXBfcmlkKTsKKwlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAweDEwMCAtIDEyMDsJLyogLTEyMCBkQm0gKi8KKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOworCXJhbmdlLT5zZW5zaXRpdml0eSA9IDY1NTM1OworCisJZm9yKGkgPSAwIDsgaSA8IDggOyBpKyspIHsKKwkJcmFuZ2UtPmJpdHJhdGVbaV0gPSBjYXBfcmlkLnN1cHBvcnRlZFJhdGVzW2ldICogNTAwMDAwOworCQlpZihyYW5nZS0+Yml0cmF0ZVtpXSA9PSAwKQorCQkJYnJlYWs7CisJfQorCXJhbmdlLT5udW1fYml0cmF0ZXMgPSBpOworCisJLyogU2V0IGFuIGluZGljYXRpb24gb2YgdGhlIG1heCBUQ1AgdGhyb3VnaHB1dAorCSAqIGluIGJpdC9zIHRoYXQgd2UgY2FuIGV4cGVjdCB1c2luZyB0aGlzIGludGVyZmFjZS4KKwkgKiBNYXkgYmUgdXNlIGZvciBRb1Mgc3R1ZmYuLi4gSmVhbiBJSSAqLworCWlmKGkgPiAyKQorCQlyYW5nZS0+dGhyb3VnaHB1dCA9IDUwMDAgKiAxMDAwOworCWVsc2UKKwkJcmFuZ2UtPnRocm91Z2hwdXQgPSAxNTAwICogMTAwMDsKKworCXJhbmdlLT5taW5fcnRzID0gMDsKKwlyYW5nZS0+bWF4X3J0cyA9IDIzMTI7CisJcmFuZ2UtPm1pbl9mcmFnID0gMjU2OworCXJhbmdlLT5tYXhfZnJhZyA9IDIzMTI7CisKKwlpZihjYXBfcmlkLnNvZnRDYXAgJiAyKSB7CisJCS8vIFdFUDogUkM0IDQwIGJpdHMKKwkJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSA1OworCQkvLyBSQzQgfjEyOCBiaXRzCisJCWlmIChjYXBfcmlkLnNvZnRDYXAgJiAweDEwMCkgeworCQkJcmFuZ2UtPmVuY29kaW5nX3NpemVbMV0gPSAxMzsKKwkJCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAyOworCQl9IGVsc2UKKwkJCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAxOworCQlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IChjYXBfcmlkLnNvZnRDYXAgJiAweDgwKSA/IDQgOiAxOworCX0gZWxzZSB7CisJCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAwOworCQlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IDA7CisJfQorCXJhbmdlLT5taW5fcG1wID0gMDsKKwlyYW5nZS0+bWF4X3BtcCA9IDUwMDAwMDA7CS8qIDUgc2VjcyAqLworCXJhbmdlLT5taW5fcG10ID0gMDsKKwlyYW5nZS0+bWF4X3BtdCA9IDY1NTM1ICogMTAyNDsJLyogPz8/ICovCisJcmFuZ2UtPnBtcF9mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKKwlyYW5nZS0+cG10X2ZsYWdzID0gSVdfUE9XRVJfVElNRU9VVDsKKwlyYW5nZS0+cG1fY2FwYSA9IElXX1BPV0VSX1BFUklPRCB8IElXX1BPV0VSX1RJTUVPVVQgfCBJV19QT1dFUl9BTExfUjsKKworCS8qIFRyYW5zbWl0IFBvd2VyIC0gdmFsdWVzIGFyZSBpbiBtVyAqLworCWZvcihpID0gMCA7IGkgPCA4IDsgaSsrKSB7CisJCXJhbmdlLT50eHBvd2VyW2ldID0gY2FwX3JpZC50eFBvd2VyTGV2ZWxzW2ldOworCQlpZihyYW5nZS0+dHhwb3dlcltpXSA9PSAwKQorCQkJYnJlYWs7CisJfQorCXJhbmdlLT5udW1fdHhwb3dlciA9IGk7CisJcmFuZ2UtPnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX01XQVRUOworCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDEyOworCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCXJhbmdlLT5yZXRyeV9jYXBhID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9MSUZFVElNRTsKKwlyYW5nZS0+cmV0cnlfZmxhZ3MgPSBJV19SRVRSWV9MSU1JVDsKKwlyYW5nZS0+cl90aW1lX2ZsYWdzID0gSVdfUkVUUllfTElGRVRJTUU7CisJcmFuZ2UtPm1pbl9yZXRyeSA9IDE7CisJcmFuZ2UtPm1heF9yZXRyeSA9IDY1NTM1OworCXJhbmdlLT5taW5fcl90aW1lID0gMTAyNDsKKwlyYW5nZS0+bWF4X3JfdGltZSA9IDY1NTM1ICogMTAyNDsKKwkvKiBFeHBlcmltZW50YWwgbWVhc3VyZW1lbnRzIC0gYm91bmRhcnkgMTEvNS41IE1iL3MgKi8KKwkvKiBOb3RlIDogd2l0aCBvciB3aXRob3V0IHRoZSAobG9jYWwtPnJzc2kpLCByZXN1bHRzCisJICogYXJlIHNvbWV3aGF0IGRpZmZlcmVudC4gLSBKZWFuIElJICovCisJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSBhaXJvX2dldF9hdmdfcXVhbGl0eSgmY2FwX3JpZCk7CisJaWYgKGxvY2FsLT5yc3NpKQorCQlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAxODY7CS8qIC03MCBkQm0gKi8KKwllbHNlCisJCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDE3NjsJLyogLTgwIGRCbSAqLworCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IDA7CisKKwkvKiBFdmVudCBjYXBhYmlsaXR5IChrZXJuZWwgKyBkcml2ZXIpICovCisJcmFuZ2UtPmV2ZW50X2NhcGFbMF0gPSAoSVdfRVZFTlRfQ0FQQV9LXzAgfAorCQkJCUlXX0VWRU5UX0NBUEFfTUFTSyhTSU9DR0lXVEhSU1BZKSB8CisJCQkJSVdfRVZFTlRfQ0FQQV9NQVNLKFNJT0NHSVdBUCkgfAorCQkJCUlXX0VWRU5UX0NBUEFfTUFTSyhTSU9DR0lXU0NBTikpOworCXJhbmdlLT5ldmVudF9jYXBhWzFdID0gSVdfRVZFTlRfQ0FQQV9LXzE7CisJcmFuZ2UtPmV2ZW50X2NhcGFbNF0gPSBJV19FVkVOVF9DQVBBX01BU0soSVdFVlRYRFJPUCk7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IFBvd2VyIE1hbmFnZW1lbnQKKyAqLworc3RhdGljIGludCBhaXJvX3NldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJaWYgKHZ3cnEtPmRpc2FibGVkKSB7CisJCWlmICgobG9jYWwtPmNvbmZpZy5ybW9kZSAmIDB4RkYpID49IFJYTU9ERV9SRk1PTikgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbG9jYWwtPmNvbmZpZy5wb3dlclNhdmVNb2RlID0gUE9XRVJTQVZFX0NBTTsKKwkJbG9jYWwtPmNvbmZpZy5ybW9kZSAmPSAweEZGMDA7CisJCWxvY2FsLT5jb25maWcucm1vZGUgfD0gUlhNT0RFX0JDX01DX0FERFI7CisJCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKwkJcmV0dXJuIC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KKwl9CisJaWYgKCh2d3JxLT5mbGFncyAmIElXX1BPV0VSX1RZUEUpID09IElXX1BPV0VSX1RJTUVPVVQpIHsKKwkJbG9jYWwtPmNvbmZpZy5mYXN0TGlzdGVuRGVsYXkgPSAodndycS0+dmFsdWUgKyA1MDApIC8gMTAyNDsKKwkJbG9jYWwtPmNvbmZpZy5wb3dlclNhdmVNb2RlID0gUE9XRVJTQVZFX1BTUENBTTsKKwkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCX0gZWxzZSBpZiAoKHZ3cnEtPmZsYWdzICYgSVdfUE9XRVJfVFlQRSkgPT0gSVdfUE9XRVJfUEVSSU9EKSB7CisJCWxvY2FsLT5jb25maWcuZmFzdExpc3RlbkludGVydmFsID0gbG9jYWwtPmNvbmZpZy5saXN0ZW5JbnRlcnZhbCA9ICh2d3JxLT52YWx1ZSArIDUwMCkgLyAxMDI0OworCQlsb2NhbC0+Y29uZmlnLnBvd2VyU2F2ZU1vZGUgPSBQT1dFUlNBVkVfUFNQQ0FNOworCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisJfQorCXN3aXRjaCAodndycS0+ZmxhZ3MgJiBJV19QT1dFUl9NT0RFKSB7CisJCWNhc2UgSVdfUE9XRVJfVU5JQ0FTVF9SOgorCQkJaWYgKChsb2NhbC0+Y29uZmlnLnJtb2RlICYgMHhGRikgPj0gUlhNT0RFX1JGTU9OKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlsb2NhbC0+Y29uZmlnLnJtb2RlICY9IDB4RkYwMDsKKwkJCWxvY2FsLT5jb25maWcucm1vZGUgfD0gUlhNT0RFX0FERFI7CisJCQlzZXRfYml0IChGTEFHX0NPTU1JVCwgJmxvY2FsLT5mbGFncyk7CisJCQlicmVhazsKKwkJY2FzZSBJV19QT1dFUl9BTExfUjoKKwkJCWlmICgobG9jYWwtPmNvbmZpZy5ybW9kZSAmIDB4RkYpID49IFJYTU9ERV9SRk1PTikgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJbG9jYWwtPmNvbmZpZy5ybW9kZSAmPSAweEZGMDA7CisJCQlsb2NhbC0+Y29uZmlnLnJtb2RlIHw9IFJYTU9ERV9CQ19NQ19BRERSOworCQkJc2V0X2JpdCAoRkxBR19DT01NSVQsICZsb2NhbC0+ZmxhZ3MpOworCQljYXNlIElXX1BPV0VSX09OOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLy8gTm90ZSA6IHdlIG1heSB3YW50IHRvIGZhY3RvciBsb2NhbC0+bmVlZF9jb21taXQgaGVyZQorCS8vIE5vdGUyIDogbWF5IGFsc28gd2FudCB0byBmYWN0b3IgUlhNT0RFX1JGTU9OIHRlc3QKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBQb3dlciBNYW5hZ2VtZW50CisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfcG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlpbnQgbW9kZTsKKworCXJlYWRDb25maWdSaWQobG9jYWwsIDEpOworCW1vZGUgPSBsb2NhbC0+Y29uZmlnLnBvd2VyU2F2ZU1vZGU7CisJaWYgKCh2d3JxLT5kaXNhYmxlZCA9IChtb2RlID09IFBPV0VSU0FWRV9DQU0pKSkKKwkJcmV0dXJuIDA7CisJaWYgKCh2d3JxLT5mbGFncyAmIElXX1BPV0VSX1RZUEUpID09IElXX1BPV0VSX1RJTUVPVVQpIHsKKwkJdndycS0+dmFsdWUgPSAoaW50KWxvY2FsLT5jb25maWcuZmFzdExpc3RlbkRlbGF5ICogMTAyNDsKKwkJdndycS0+ZmxhZ3MgPSBJV19QT1dFUl9USU1FT1VUOworCX0gZWxzZSB7CisJCXZ3cnEtPnZhbHVlID0gKGludClsb2NhbC0+Y29uZmlnLmZhc3RMaXN0ZW5JbnRlcnZhbCAqIDEwMjQ7CisJCXZ3cnEtPmZsYWdzID0gSVdfUE9XRVJfUEVSSU9EOworCX0KKwlpZiAoKGxvY2FsLT5jb25maWcucm1vZGUgJiAweEZGKSA9PSBSWE1PREVfQUREUikKKwkJdndycS0+ZmxhZ3MgfD0gSVdfUE9XRVJfVU5JQ0FTVF9SOworCWVsc2UKKwkJdndycS0+ZmxhZ3MgfD0gSVdfUE9XRVJfQUxMX1I7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgU2Vuc2l0aXZpdHkKKyAqLworc3RhdGljIGludCBhaXJvX3NldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisKKwlyZWFkQ29uZmlnUmlkKGxvY2FsLCAxKTsKKwlsb2NhbC0+Y29uZmlnLnJzc2lUaHJlc2hvbGQgPSB2d3JxLT5kaXNhYmxlZCA/IFJTU0lfREVGQVVMVCA6IHZ3cnEtPnZhbHVlOworCXNldF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKTsKKworCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IFNlbnNpdGl2aXR5CisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfc2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhaXJvX2luZm8gKmxvY2FsID0gZGV2LT5wcml2OworCisJcmVhZENvbmZpZ1JpZChsb2NhbCwgMSk7CisJdndycS0+dmFsdWUgPSBsb2NhbC0+Y29uZmlnLnJzc2lUaHJlc2hvbGQ7CisJdndycS0+ZGlzYWJsZWQgPSAodndycS0+dmFsdWUgPT0gMCk7CisJdndycS0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IEFQIExpc3QKKyAqIE5vdGUgOiB0aGlzIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgSVdTQ0FOCisgKi8KK3N0YXRpYyBpbnQgYWlyb19nZXRfYXBsaXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSBkZXYtPnByaXY7CisJc3RydWN0IHNvY2thZGRyICphZGRyZXNzID0gKHN0cnVjdCBzb2NrYWRkciAqKSBleHRyYTsKKwlzdHJ1Y3QgaXdfcXVhbGl0eSBxdWFsW0lXX01BWF9BUF07CisJQlNTTGlzdFJpZCBCU1NMaXN0OworCWludCBpOworCWludCBsb3NlU3luYyA9IGNhcGFibGUoQ0FQX05FVF9BRE1JTikgPyAxOiAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBJV19NQVhfQVA7IGkrKykgeworCQlpZiAocmVhZEJTU0xpc3RSaWQobG9jYWwsIGxvc2VTeW5jLCAmQlNTTGlzdCkpCisJCQlicmVhazsKKwkJbG9zZVN5bmMgPSAwOworCQltZW1jcHkoYWRkcmVzc1tpXS5zYV9kYXRhLCBCU1NMaXN0LmJzc2lkLCBFVEhfQUxFTik7CisJCWFkZHJlc3NbaV0uc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQlpZiAobG9jYWwtPnJzc2kpCisJCQlxdWFsW2ldLmxldmVsID0gMHgxMDAgLSBsb2NhbC0+cnNzaVtCU1NMaXN0LnJzc2ldLnJzc2lkQm07CisJCWVsc2UKKwkJCXF1YWxbaV0ubGV2ZWwgPSAoQlNTTGlzdC5yc3NpICsgMzIxKSAvIDI7CisJCXF1YWxbaV0ucXVhbCA9IHF1YWxbaV0ubm9pc2UgPSAwOworCQlxdWFsW2ldLnVwZGF0ZWQgPSAyOworCQlpZiAoQlNTTGlzdC5pbmRleCA9PSAweGZmZmYpCisJCQlicmVhazsKKwl9CisJaWYgKCFpKSB7CisJCVN0YXR1c1JpZCBzdGF0dXNfcmlkOwkJLyogQ2FyZCBzdGF0dXMgaW5mbyAqLworCQlyZWFkU3RhdHVzUmlkKGxvY2FsLCAmc3RhdHVzX3JpZCwgMSk7CisJCWZvciAoaSA9IDA7CisJCSAgICAgaSA8IG1pbihJV19NQVhfQVAsIDQpICYmCisJCQkgICAgIChzdGF0dXNfcmlkLmJzc2lkW2ldWzBdCisJCQkgICAgICAmIHN0YXR1c19yaWQuYnNzaWRbaV1bMV0KKwkJCSAgICAgICYgc3RhdHVzX3JpZC5ic3NpZFtpXVsyXQorCQkJICAgICAgJiBzdGF0dXNfcmlkLmJzc2lkW2ldWzNdCisJCQkgICAgICAmIHN0YXR1c19yaWQuYnNzaWRbaV1bNF0KKwkJCSAgICAgICYgc3RhdHVzX3JpZC5ic3NpZFtpXVs1XSkhPTB4ZmYgJiYKKwkJCSAgICAgKHN0YXR1c19yaWQuYnNzaWRbaV1bMF0KKwkJCSAgICAgIHwgc3RhdHVzX3JpZC5ic3NpZFtpXVsxXQorCQkJICAgICAgfCBzdGF0dXNfcmlkLmJzc2lkW2ldWzJdCisJCQkgICAgICB8IHN0YXR1c19yaWQuYnNzaWRbaV1bM10KKwkJCSAgICAgIHwgc3RhdHVzX3JpZC5ic3NpZFtpXVs0XQorCQkJICAgICAgfCBzdGF0dXNfcmlkLmJzc2lkW2ldWzVdKTsKKwkJICAgICBpKyspIHsKKwkJCW1lbWNweShhZGRyZXNzW2ldLnNhX2RhdGEsCisJCQkgICAgICAgc3RhdHVzX3JpZC5ic3NpZFtpXSwgRVRIX0FMRU4pOworCQkJYWRkcmVzc1tpXS5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCX0KKwl9IGVsc2UgeworCQlkd3JxLT5mbGFncyA9IDE7IC8qIFNob3VsZCBiZSBkZWZpbmUnZCAqLworCQltZW1jcHkoZXh0cmEgKyBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSppLAorCQkgICAgICAgJnF1YWwsICBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpKmkpOworCX0KKwlkd3JxLT5sZW5ndGggPSBpOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogSW5pdGlhdGUgU2NhbgorICovCitzdGF0aWMgaW50IGFpcm9fc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlDbWQgY21kOworCVJlc3AgcnNwOworCisJLyogTm90ZSA6IHlvdSBtYXkgaGF2ZSByZWFsaXNlZCB0aGF0LCBhcyB0aGlzIGlzIGEgU0VUIG9wZXJhdGlvbiwKKwkgKiB0aGlzIGlzIHByaXZpbGVnZWQgYW5kIHRoZXJlZm9yZSBhIG5vcm1hbCB1c2VyIGNhbid0CisJICogcGVyZm9ybSBzY2FubmluZy4KKwkgKiBUaGlzIGlzIG5vdCBhbiBlcnJvciwgd2hpbGUgdGhlIGRldmljZSBwZXJmb3JtIHNjYW5uaW5nLAorCSAqIHRyYWZmaWMgZG9lc24ndCBmbG93LCBzbyBpdCdzIGEgcGVyZmVjdCBEb1MuLi4KKwkgKiBKZWFuIElJICovCisJaWYgKGFpLT5mbGFncyAmIEZMQUdfUkFESU9fTUFTSykgcmV0dXJuIC1FTkVURE9XTjsKKworCS8qIEluaXRpYXRlIGEgc2NhbiBjb21tYW5kICovCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwljbWQuY21kPUNNRF9MSVNUQlNTOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFpLT5zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCWlzc3VlY29tbWFuZChhaSwgJmNtZCwgJnJzcCk7CisJYWktPnNjYW5fdGltZXN0YW1wID0gamlmZmllczsKKwl1cCgmYWktPnNlbSk7CisKKwkvKiBBdCB0aGlzIHBvaW50LCBqdXN0IHJldHVybiB0byB0aGUgdXNlci4gKi8KKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVHJhbnNsYXRlIHNjYW4gZGF0YSByZXR1cm5lZCBmcm9tIHRoZSBjYXJkIHRvIGEgY2FyZCBpbmRlcGVuZGVudAorICogZm9ybWF0IHRoYXQgdGhlIFdpcmVsZXNzIFRvb2xzIHdpbGwgdW5kZXJzdGFuZCAtIEplYW4gSUkKKyAqLworc3RhdGljIGlubGluZSBjaGFyICphaXJvX3RyYW5zbGF0ZV9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCWNoYXIgKmN1cnJlbnRfZXYsCisJCQkJCWNoYXIgKmVuZF9idWYsCisJCQkJCUJTU0xpc3RSaWQgKmxpc3QpCit7CisJc3RydWN0IGFpcm9faW5mbyAqYWkgPSBkZXYtPnByaXY7CisJc3RydWN0IGl3X2V2ZW50CQlpd2U7CQkvKiBUZW1wb3JhcnkgYnVmZmVyICovCisJdTE2CQkJY2FwYWJpbGl0aWVzOworCWNoYXIgKgkJCWN1cnJlbnRfdmFsOwkvKiBGb3IgcmF0ZXMgKi8KKwlpbnQJCQlpOworCisJLyogRmlyc3QgZW50cnkgKk1VU1QqIGJlIHRoZSBBUCBNQUMgYWRkcmVzcyAqLworCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CisJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgbGlzdC0+YnNzaWQsIEVUSF9BTEVOKTsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfQUREUl9MRU4pOworCisJLyogT3RoZXIgZW50cmllcyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgb3JkZXIgd2UgZ2l2ZSB0aGVtICovCisKKwkvKiBBZGQgdGhlIEVTU0lEICovCisJaXdlLnUuZGF0YS5sZW5ndGggPSBsaXN0LT5zc2lkTGVuOworCWlmKGl3ZS51LmRhdGEubGVuZ3RoID4gMzIpCisJCWl3ZS51LmRhdGEubGVuZ3RoID0gMzI7CisJaXdlLmNtZCA9IFNJT0NHSVdFU1NJRDsKKwlpd2UudS5kYXRhLmZsYWdzID0gMTsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgbGlzdC0+c3NpZCk7CisKKwkvKiBBZGQgbW9kZSAqLworCWl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKKwljYXBhYmlsaXRpZXMgPSBsZTE2X3RvX2NwdShsaXN0LT5jYXApOworCWlmKGNhcGFiaWxpdGllcyAmIChDQVBfRVNTIHwgQ0FQX0lCU1MpKSB7CisJCWlmKGNhcGFiaWxpdGllcyAmIENBUF9FU1MpCisJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9NQVNURVI7CisJCWVsc2UKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FESE9DOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfVUlOVF9MRU4pOworCX0KKworCS8qIEFkZCBmcmVxdWVuY3kgKi8KKwlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7CisJaXdlLnUuZnJlcS5tID0gbGUxNl90b19jcHUobGlzdC0+ZHNDaGFubmVsKTsKKwlpd2UudS5mcmVxLm0gPSBmcmVxdWVuY3lfbGlzdFtpd2UudS5mcmVxLm1dICogMTAwMDAwOworCWl3ZS51LmZyZXEuZSA9IDE7CisJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKKworCS8qIEFkZCBxdWFsaXR5IHN0YXRpc3RpY3MgKi8KKwlpd2UuY21kID0gSVdFVlFVQUw7CisJaWYgKGFpLT5yc3NpKQorCQlpd2UudS5xdWFsLmxldmVsID0gMHgxMDAgLSBhaS0+cnNzaVtsaXN0LT5yc3NpXS5yc3NpZEJtOworCWVsc2UKKwkJaXdlLnUucXVhbC5sZXZlbCA9IChsaXN0LT5yc3NpICsgMzIxKSAvIDI7CisJaXdlLnUucXVhbC5ub2lzZSA9IDA7CisJaXdlLnUucXVhbC5xdWFsID0gMDsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOworCisJLyogQWRkIGVuY3J5cHRpb24gY2FwYWJpbGl0eSAqLworCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOworCWlmKGNhcGFiaWxpdGllcyAmIENBUF9QUklWQUNZKQorCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7CisJZWxzZQorCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCWl3ZS51LmRhdGEubGVuZ3RoID0gMDsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgbGlzdC0+c3NpZCk7CisKKwkvKiBSYXRlIDogc3R1ZmZpbmcgbXVsdGlwbGUgdmFsdWVzIGluIGEgc2luZ2xlIGV2ZW50IHJlcXVpcmUgYSBiaXQKKwkgKiBtb3JlIG9mIG1hZ2ljIC0gSmVhbiBJSSAqLworCWN1cnJlbnRfdmFsID0gY3VycmVudF9ldiArIElXX0VWX0xDUF9MRU47CisKKwlpd2UuY21kID0gU0lPQ0dJV1JBVEU7CisJLyogVGhvc2UgdHdvIGZsYWdzIGFyZSBpZ25vcmVkLi4uICovCisJaXdlLnUuYml0cmF0ZS5maXhlZCA9IGl3ZS51LmJpdHJhdGUuZGlzYWJsZWQgPSAwOworCS8qIE1heCA4IHZhbHVlcyAqLworCWZvcihpID0gMCA7IGkgPCA4IDsgaSsrKSB7CisJCS8qIE5VTEwgdGVybWluYXRlZCAqLworCQlpZihsaXN0LT5yYXRlc1tpXSA9PSAwKQorCQkJYnJlYWs7CisJCS8qIEJpdCByYXRlIGdpdmVuIGluIDUwMCBrYi9zIHVuaXRzICgrIDB4ODApICovCisJCWl3ZS51LmJpdHJhdGUudmFsdWUgPSAoKGxpc3QtPnJhdGVzW2ldICYgMHg3ZikgKiA1MDAwMDApOworCQkvKiBBZGQgbmV3IHZhbHVlIHRvIGV2ZW50ICovCisJCWN1cnJlbnRfdmFsID0gaXdlX3N0cmVhbV9hZGRfdmFsdWUoY3VycmVudF9ldiwgY3VycmVudF92YWwsIGVuZF9idWYsICZpd2UsIElXX0VWX1BBUkFNX0xFTik7CisJfQorCS8qIENoZWNrIGlmIHdlIGFkZGVkIGFueSBldmVudCAqLworCWlmKChjdXJyZW50X3ZhbCAtIGN1cnJlbnRfZXYpID4gSVdfRVZfTENQX0xFTikKKwkJY3VycmVudF9ldiA9IGN1cnJlbnRfdmFsOworCisJLyogVGhlIG90aGVyIGRhdGEgaW4gdGhlIHNjYW4gcmVzdWx0IGFyZSBub3QgcmVhbGx5CisJICogaW50ZXJlc3RpbmcsIHNvIGZvciBub3cgZHJvcCBpdCAtIEplYW4gSUkgKi8KKwlyZXR1cm4gY3VycmVudF9ldjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBSZWFkIFNjYW4gUmVzdWx0cworICovCitzdGF0aWMgaW50IGFpcm9fZ2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlCU1NMaXN0UmlkIEJTU0xpc3Q7CisJaW50IHJjOworCWNoYXIgKmN1cnJlbnRfZXYgPSBleHRyYTsKKworCS8qIFdoZW4gd2UgYXJlIGFzc29jaWF0ZWQgYWdhaW4sIHRoZSBzY2FuIGhhcyBzdXJlbHkgZmluaXNoZWQuCisJICogSnVzdCBpbiBjYXNlLCBsZXQncyBtYWtlIHN1cmUgZW5vdWdoIHRpbWUgaGFzIGVsYXBzZWQgc2luY2UKKwkgKiB3ZSBzdGFydGVkIHRoZSBzY2FuLiAtIEphdmllciAqLworCWlmKGFpLT5zY2FuX3RpbWVzdGFtcCAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLGFpLT5zY2FuX3RpbWVzdGFtcCszKkhaKSkgeworCQkvKiBJbXBvcnRhbnQgbm90ZSA6IHdlIGRvbid0IHdhbnQgdG8gYmxvY2sgdGhlIGNhbGxlcgorCQkgKiB1bnRpbCByZXN1bHRzIGFyZSByZWFkeSBmb3IgdmFyaW91cyByZWFzb25zLgorCQkgKiBGaXJzdCwgbWFuYWdpbmcgd2FpdCBxdWV1ZXMgaXMgY29tcGxleCBhbmQgcmFjeQorCQkgKiAodGhlcmUgbWF5IGJlIG11bHRpcGxlIHNpbXVsdGFuZW91cyBjYWxsZXJzKS4KKwkJICogU2Vjb25kLCB3ZSBncmFiIHNvbWUgcnRuZXRsaW5rIGxvY2sgYmVmb3JlIGNvbW1pbmcKKwkJICogaGVyZSAoaW4gZGV2X2lvY3RsKCkpLgorCQkgKiBUaGlyZCwgdGhlIGNhbGxlciBjYW4gd2FpdCBvbiB0aGUgV2lyZWxlc3MgRXZlbnQKKwkJICogLSBKZWFuIElJICovCisJCXJldHVybiAtRUFHQUlOOworCX0KKwlhaS0+c2Nhbl90aW1lc3RhbXAgPSAwOworCisJLyogVGhlcmUncyBvbmx5IGEgcmFjZSB3aXRoIHByb2NfQlNTTGlzdF9vcGVuKCksIGJ1dCBpdHMKKwkgKiBjb25zZXF1ZW5jZXMgYXJlIGJlZ25pZ24uIFNvIEkgZG9uJ3QgYm90aGVyIGZpeGluZyBpdCAtIEphdmllciAqLworCisJLyogVHJ5IHRvIHJlYWQgdGhlIGZpcnN0IGVudHJ5IG9mIHRoZSBzY2FuIHJlc3VsdCAqLworCXJjID0gUEM0NTAwX3JlYWRyaWQoYWksIFJJRF9CU1NMSVNURklSU1QsICZCU1NMaXN0LCBzaXplb2YoQlNTTGlzdCksIDEpOworCWlmKChyYykgfHwgKEJTU0xpc3QuaW5kZXggPT0gMHhmZmZmKSkgeworCQkvKiBDbGllbnQgZXJyb3IsIG5vIHNjYW4gcmVzdWx0cy4uLgorCQkgKiBUaGUgY2FsbGVyIG5lZWQgdG8gcmVzdGFydCB0aGUgc2Nhbi4gKi8KKwkJcmV0dXJuIC1FTk9EQVRBOworCX0KKworCS8qIFJlYWQgYW5kIHBhcnNlIGFsbCBlbnRyaWVzICovCisJd2hpbGUoKCFyYykgJiYgKEJTU0xpc3QuaW5kZXggIT0gMHhmZmZmKSkgeworCQkvKiBUcmFuc2xhdGUgdG8gV0UgZm9ybWF0IHRoaXMgZW50cnkgKi8KKwkJY3VycmVudF9ldiA9IGFpcm9fdHJhbnNsYXRlX3NjYW4oZGV2LCBjdXJyZW50X2V2LAorCQkJCQkJIGV4dHJhICsgZHdycS0+bGVuZ3RoLAorCQkJCQkJICZCU1NMaXN0KTsKKworCQkvKiBDaGVjayBpZiB0aGVyZSBpcyBzcGFjZSBmb3Igb25lIG1vcmUgZW50cnkgKi8KKwkJaWYoKGV4dHJhICsgZHdycS0+bGVuZ3RoIC0gY3VycmVudF9ldikgPD0gSVdfRVZfQUREUl9MRU4pIHsKKwkJCS8qIEFzayB1c2VyIHNwYWNlIHRvIHRyeSBhZ2FpbiB3aXRoIGEgYmlnZ2VyIGJ1ZmZlciAqLworCQkJcmV0dXJuIC1FMkJJRzsKKwkJfQorCisJCS8qIFJlYWQgbmV4dCBlbnRyeSAqLworCQlyYyA9IFBDNDUwMF9yZWFkcmlkKGFpLCBSSURfQlNTTElTVE5FWFQsCisJCQkJICAgICZCU1NMaXN0LCBzaXplb2YoQlNTTGlzdCksIDEpOworCX0KKwkvKiBMZW5ndGggb2YgZGF0YSAqLworCWR3cnEtPmxlbmd0aCA9IChjdXJyZW50X2V2IC0gZXh0cmEpOworCWR3cnEtPmZsYWdzID0gMDsJLyogdG9kbyAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBDb21taXQgaGFuZGxlciA6IGNhbGxlZCBhZnRlciBhIGJ1bmNoIG9mIFNFVCBvcGVyYXRpb25zCisgKi8KK3N0YXRpYyBpbnQgYWlyb19jb25maWdfY29tbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAkvKiBOVUxMICovCisJCQkgICAgICB2b2lkICp6d3JxLAkJCS8qIE5VTEwgKi8KKwkJCSAgICAgIGNoYXIgKmV4dHJhKQkJCS8qIE5VTEwgKi8KK3sKKwlzdHJ1Y3QgYWlyb19pbmZvICpsb2NhbCA9IGRldi0+cHJpdjsKKwlSZXNwIHJzcDsKKworCWlmICghdGVzdF9iaXQgKEZMQUdfQ09NTUlULCAmbG9jYWwtPmZsYWdzKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBTb21lIG9mIHRoZSAiU0VUIiBmdW5jdGlvbiBtYXkgaGF2ZSBtb2RpZmllZCBzb21lIG9mIHRoZQorCSAqIHBhcmFtZXRlcnMuIEl0J3Mgbm93IHRpbWUgdG8gY29tbWl0IHRoZW0gaW4gdGhlIGNhcmQgKi8KKwlkaXNhYmxlX01BQyhsb2NhbCwgMSk7CisJaWYgKHRlc3RfYml0IChGTEFHX1JFU0VULCAmbG9jYWwtPmZsYWdzKSkgeworCQlBUExpc3RSaWQgQVBMaXN0X3JpZDsKKwkJU3NpZFJpZCBTU0lEX3JpZDsKKworCQlyZWFkQVBMaXN0UmlkKGxvY2FsLCAmQVBMaXN0X3JpZCk7CisJCXJlYWRTc2lkUmlkKGxvY2FsLCAmU1NJRF9yaWQpOworCQlpZiAodGVzdF9iaXQoRkxBR19NUEksJmxvY2FsLT5mbGFncykpCisJCQlzZXR1cF9jYXJkKGxvY2FsLCBkZXYtPmRldl9hZGRyLCAxICk7CisJCWVsc2UKKwkJCXJlc2V0X2Fpcm9fY2FyZChkZXYpOworCQlkaXNhYmxlX01BQyhsb2NhbCwgMSk7CisJCXdyaXRlU3NpZFJpZChsb2NhbCwgJlNTSURfcmlkLCAxKTsKKwkJd3JpdGVBUExpc3RSaWQobG9jYWwsICZBUExpc3RfcmlkLCAxKTsKKwl9CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmbG9jYWwtPnNlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJd3JpdGVDb25maWdSaWQobG9jYWwsIDApOworCWVuYWJsZV9NQUMobG9jYWwsICZyc3AsIDApOworCWlmICh0ZXN0X2JpdCAoRkxBR19SRVNFVCwgJmxvY2FsLT5mbGFncykpCisJCWFpcm9fc2V0X3Byb21pc2MobG9jYWwpOworCWVsc2UKKwkJdXAoJmxvY2FsLT5zZW0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTdHJ1Y3R1cmVzIHRvIGV4cG9ydCB0aGUgV2lyZWxlc3MgSGFuZGxlcnMKKyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncyBhaXJvX3ByaXZhdGVfYXJnc1tdID0geworLyp7IGNtZCwgICAgICAgICBzZXRfYXJncywgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2FyZ3MsIG5hbWUgfSAqLworICB7IEFJUk9JT0NUTCwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCBzaXplb2YgKGFpcm9uZXRfaW9jdGwpLAorICAgIElXX1BSSVZfVFlQRV9CWVRFIHwgMjA0NywgImFpcm9pb2N0bCIgfSwKKyAgeyBBSVJPSURJRkMsIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgc2l6ZW9mIChhaXJvbmV0X2lvY3RsKSwKKyAgICBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImFpcm9pZGlmYyIgfSwKK307CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyCQlhaXJvX2hhbmRsZXJbXSA9Cit7CisJKGl3X2hhbmRsZXIpIGFpcm9fY29uZmlnX2NvbW1pdCwJLyogU0lPQ1NJV0NPTU1JVCAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF9uYW1lLAkJLyogU0lPQ0dJV05BTUUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiBTSU9DU0lXTldJRCAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NHSVdOV0lEICovCisJKGl3X2hhbmRsZXIpIGFpcm9fc2V0X2ZyZXEsCQkvKiBTSU9DU0lXRlJFUSAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF9mcmVxLAkJLyogU0lPQ0dJV0ZSRVEgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19zZXRfbW9kZSwJCS8qIFNJT0NTSVdNT0RFICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X21vZGUsCQkvKiBTSU9DR0lXTU9ERSAqLworCShpd19oYW5kbGVyKSBhaXJvX3NldF9zZW5zLAkJLyogU0lPQ1NJV1NFTlMgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfc2VucywJCS8qIFNJT0NHSVdTRU5TICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ1NJV1JBTkdFICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X3JhbmdlLAkJLyogU0lPQ0dJV1JBTkdFICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ1NJV1BSSVYgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiBTSU9DR0lXUFJJViAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NTSVdTVEFUUyAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NHSVdTVEFUUyAqLworCWl3X2hhbmRsZXJfc2V0X3NweSwJCQkvKiBTSU9DU0lXU1BZICovCisJaXdfaGFuZGxlcl9nZXRfc3B5LAkJCS8qIFNJT0NHSVdTUFkgKi8KKwlpd19oYW5kbGVyX3NldF90aHJzcHksCQkJLyogU0lPQ1NJV1RIUlNQWSAqLworCWl3X2hhbmRsZXJfZ2V0X3RocnNweSwJCQkvKiBTSU9DR0lXVEhSU1BZICovCisJKGl3X2hhbmRsZXIpIGFpcm9fc2V0X3dhcCwJCS8qIFNJT0NTSVdBUCAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF93YXAsCQkvKiBTSU9DR0lXQVAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X2FwbGlzdCwJCS8qIFNJT0NHSVdBUExJU1QgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19zZXRfc2NhbiwJCS8qIFNJT0NTSVdTQ0FOICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X3NjYW4sCQkvKiBTSU9DR0lXU0NBTiAqLworCShpd19oYW5kbGVyKSBhaXJvX3NldF9lc3NpZCwJCS8qIFNJT0NTSVdFU1NJRCAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF9lc3NpZCwJCS8qIFNJT0NHSVdFU1NJRCAqLworCShpd19oYW5kbGVyKSBhaXJvX3NldF9uaWNrLAkJLyogU0lPQ1NJV05JQ0tOICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X25pY2ssCQkvKiBTSU9DR0lXTklDS04gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBhaXJvX3NldF9yYXRlLAkJLyogU0lPQ1NJV1JBVEUgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfcmF0ZSwJCS8qIFNJT0NHSVdSQVRFICovCisJKGl3X2hhbmRsZXIpIGFpcm9fc2V0X3J0cywJCS8qIFNJT0NTSVdSVFMgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfcnRzLAkJLyogU0lPQ0dJV1JUUyAqLworCShpd19oYW5kbGVyKSBhaXJvX3NldF9mcmFnLAkJLyogU0lPQ1NJV0ZSQUcgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfZnJhZywJCS8qIFNJT0NHSVdGUkFHICovCisJKGl3X2hhbmRsZXIpIGFpcm9fc2V0X3R4cG93LAkJLyogU0lPQ1NJV1RYUE9XICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X3R4cG93LAkJLyogU0lPQ0dJV1RYUE9XICovCisJKGl3X2hhbmRsZXIpIGFpcm9fc2V0X3JldHJ5LAkJLyogU0lPQ1NJV1JFVFJZICovCisJKGl3X2hhbmRsZXIpIGFpcm9fZ2V0X3JldHJ5LAkJLyogU0lPQ0dJV1JFVFJZICovCisJKGl3X2hhbmRsZXIpIGFpcm9fc2V0X2VuY29kZSwJCS8qIFNJT0NTSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgYWlyb19nZXRfZW5jb2RlLAkJLyogU0lPQ0dJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBhaXJvX3NldF9wb3dlciwJCS8qIFNJT0NTSVdQT1dFUiAqLworCShpd19oYW5kbGVyKSBhaXJvX2dldF9wb3dlciwJCS8qIFNJT0NHSVdQT1dFUiAqLworfTsKKworLyogTm90ZSA6IGRvbid0IGRlc2NyaWJlIEFJUk9JRElGQyBhbmQgQUlST09MRElESUZDIGluIGhlcmUuCisgKiBXZSB3YW50IHRvIGZvcmNlIHRoZSB1c2Ugb2YgdGhlIGlvY3RsIGNvZGUsIGJlY2F1c2UgdGhvc2UgY2FuJ3QgYmUKKyAqIHdvbid0IHdvcmsgdGhlIGl3X2hhbmRsZXIgY29kZSAoYmVjYXVzZSB0aGV5IHNpbXVsdGFuZW91c2x5IHJlYWQKKyAqIGFuZCB3cml0ZSBkYXRhIGFuZCBpd19oYW5kbGVyIGNhbid0IGRvIHRoYXQpLgorICogTm90ZSB0aGF0IGl0J3MgcGVyZmVjdGx5IGxlZ2FsIHRvIHJlYWQvd3JpdGUgb24gYSBzaW5nbGUgaW9jdGwgY29tbWFuZCwKKyAqIHlvdSBqdXN0IGNhbid0IHVzZSBpd3ByaXYgYW5kIG5lZWQgdG8gZm9yY2UgaXQgdmlhIHRoZSBpb2N0bCBoYW5kbGVyLgorICogSmVhbiBJSSAqLworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJCWFpcm9fcHJpdmF0ZV9oYW5kbGVyW10gPQoreworCU5VTEwsCQkJCS8qIFNJT0NJV0ZJUlNUUFJJViAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZglhaXJvX2hhbmRsZXJfZGVmID0KK3sKKwkubnVtX3N0YW5kYXJkCT0gc2l6ZW9mKGFpcm9faGFuZGxlcikvc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5udW1fcHJpdmF0ZQk9IHNpemVvZihhaXJvX3ByaXZhdGVfaGFuZGxlcikvc2l6ZW9mKGl3X2hhbmRsZXIpLAorCS5udW1fcHJpdmF0ZV9hcmdzID0gc2l6ZW9mKGFpcm9fcHJpdmF0ZV9hcmdzKS9zaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncyksCisJLnN0YW5kYXJkCT0gYWlyb19oYW5kbGVyLAorCS5wcml2YXRlCT0gYWlyb19wcml2YXRlX2hhbmRsZXIsCisJLnByaXZhdGVfYXJncwk9IGFpcm9fcHJpdmF0ZV9hcmdzLAorCS5nZXRfd2lyZWxlc3Nfc3RhdHMgPSBhaXJvX2dldF93aXJlbGVzc19zdGF0cywKK307CisKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgKi8KKworLyoKKyAqIFRoaXMgZGVmaW5lcyB0aGUgY29uZmlndXJhdGlvbiBwYXJ0IG9mIHRoZSBXaXJlbGVzcyBFeHRlbnNpb25zCisgKiBOb3RlIDogaXJxIGFuZCBzcGlubG9jayBwcm90ZWN0aW9uIHdpbGwgb2NjdXIgaW4gdGhlIHN1YnJvdXRpbmVzCisgKgorICogVE9ETyA6CisgKglvIENoZWNrIGlucHV0IHZhbHVlIG1vcmUgY2FyZWZ1bGx5IGFuZCBmaWxsIGNvcnJlY3QgdmFsdWVzIGluIHJhbmdlCisgKglvIFRlc3QgYW5kIHNoYWtlb3V0IHRoZSBidWdzIChpZiBhbnkpCisgKgorICogSmVhbiBJSQorICoKKyAqIEphdmllciBBY2hpcmljYSBkaWQgYSBncmVhdCBqb2Igb2YgbWVyZ2luZyBjb2RlIGZyb20gdGhlIHVubmFtZWQgQ0lTQ08KKyAqIGRldmVsb3BlciB0aGF0IGFkZGVkIHN1cHBvcnQgZm9yIGZsYXNoaW5nIHRoZSBjYXJkLgorICovCitzdGF0aWMgaW50IGFpcm9faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBhaXJvX2luZm8gKmFpID0gKHN0cnVjdCBhaXJvX2luZm8gKilkZXYtPnByaXY7CisKKwlpZiAoYWktPnBvd2VyKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoY21kKSB7CisjaWZkZWYgQ0lTQ09fRVhUCisJY2FzZSBBSVJPSURJRkM6CisjaWZkZWYgQUlST09MRElESUZDCisJY2FzZSBBSVJPT0xESURJRkM6CisjZW5kaWYKKwl7CisJCWludCB2YWwgPSBBSVJPTUFHSUM7CisJCWFpcm9uZXRfaW9jdGwgY29tOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbSxycS0+aWZyX2RhdGEsc2l6ZW9mKGNvbSkpKQorCQkJcmMgPSAtRUZBVUxUOworCQllbHNlIGlmIChjb3B5X3RvX3VzZXIoY29tLmRhdGEsKGNoYXIgKikmdmFsLHNpemVvZih2YWwpKSkKKwkJCXJjID0gLUVGQVVMVDsKKwl9CisJYnJlYWs7CisKKwljYXNlIEFJUk9JT0NUTDoKKyNpZmRlZiBBSVJPT0xESU9DVEwKKwljYXNlIEFJUk9PTERJT0NUTDoKKyNlbmRpZgorCQkvKiBHZXQgdGhlIGNvbW1hbmQgc3RydWN0IGFuZCBoYW5kIGl0IG9mZiBmb3IgZXZhbHVhdGlvbiBieQorCQkgKiB0aGUgcHJvcGVyIHN1YmZ1bmN0aW9uCisJCSAqLworCXsKKwkJYWlyb25ldF9pb2N0bCBjb207CisJCWlmIChjb3B5X2Zyb21fdXNlcigmY29tLHJxLT5pZnJfZGF0YSxzaXplb2YoY29tKSkpIHsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogU2VwYXJhdGUgUi9XIGZ1bmN0aW9ucyBicmFja2V0IGxlZ2FsaXR5IGhlcmUKKwkJICovCisJCWlmICggY29tLmNvbW1hbmQgPT0gQUlST1JTV1ZFUlNJT04gKSB7CisJCQlpZiAoY29weV90b191c2VyKGNvbS5kYXRhLCBzd3ZlcnNpb24sIHNpemVvZihzd3ZlcnNpb24pKSkKKwkJCQlyYyA9IC1FRkFVTFQ7CisJCQllbHNlCisJCQkJcmMgPSAwOworCQl9CisJCWVsc2UgaWYgKCBjb20uY29tbWFuZCA8PSBBSVJPUlJJRCkKKwkJCXJjID0gcmVhZHJpZHMoZGV2LCZjb20pOworCQllbHNlIGlmICggY29tLmNvbW1hbmQgPj0gQUlST1BDQVAgJiYgY29tLmNvbW1hbmQgPD0gKEFJUk9QTEVBUFVTUisyKSApCisJCQlyYyA9IHdyaXRlcmlkcyhkZXYsJmNvbSk7CisJCWVsc2UgaWYgKCBjb20uY29tbWFuZCA+PSBBSVJPRkxTSFJTVCAmJiBjb20uY29tbWFuZCA8PSBBSVJPUkVTVEFSVCApCisJCQlyYyA9IGZsYXNoY2FyZChkZXYsJmNvbSk7CisJCWVsc2UKKwkJCXJjID0gLUVJTlZBTDsgICAgICAvKiBCYWQgY29tbWFuZCBpbiBpb2N0bCAqLworCX0KKwlicmVhazsKKyNlbmRpZiAvKiBDSVNDT19FWFQgKi8KKworCS8vIEFsbCBvdGhlciBjYWxscyBhcmUgY3VycmVudGx5IHVuc3VwcG9ydGVkCisJZGVmYXVsdDoKKwkJcmMgPSAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIHJjOworfQorCisjaWZkZWYgV0lSRUxFU1NfRVhUCisvKgorICogR2V0IHRoZSBXaXJlbGVzcyBzdGF0cyBvdXQgb2YgdGhlIGRyaXZlcgorICogTm90ZSA6IGlycSBhbmQgc3BpbmxvY2sgcHJvdGVjdGlvbiB3aWxsIG9jY3VyIGluIHRoZSBzdWJyb3V0aW5lcworICoKKyAqIFRPRE8gOgorICoJbyBDaGVjayBpZiB3b3JrIGluIEFkLUhvYyBtb2RlIChvdGhlcndpc2UsIHVzZSBTUFksIGFzIGluIHd2bGFuX2NzKQorICoKKyAqIEplYW4KKyAqLworc3RhdGljIHZvaWQgYWlyb19yZWFkX3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBhaXJvX2luZm8gKmxvY2FsKQoreworCVN0YXR1c1JpZCBzdGF0dXNfcmlkOworCVN0YXRzUmlkIHN0YXRzX3JpZDsKKwlDYXBhYmlsaXR5UmlkIGNhcF9yaWQ7CisJdTMyICp2YWxzID0gc3RhdHNfcmlkLnZhbHM7CisKKwkvKiBHZXQgc3RhdHMgb3V0IG9mIHRoZSBjYXJkICovCisJY2xlYXJfYml0KEpPQl9XU1RBVFMsICZsb2NhbC0+ZmxhZ3MpOworCWlmIChsb2NhbC0+cG93ZXIpIHsKKwkJdXAoJmxvY2FsLT5zZW0pOworCQlyZXR1cm47CisJfQorCXJlYWRDYXBhYmlsaXR5UmlkKGxvY2FsLCAmY2FwX3JpZCwgMCk7CisJcmVhZFN0YXR1c1JpZChsb2NhbCwgJnN0YXR1c19yaWQsIDApOworCXJlYWRTdGF0c1JpZChsb2NhbCwgJnN0YXRzX3JpZCwgUklEX1NUQVRTLCAwKTsKKwl1cCgmbG9jYWwtPnNlbSk7CisKKwkvKiBUaGUgc3RhdHVzICovCisJbG9jYWwtPndzdGF0cy5zdGF0dXMgPSBzdGF0dXNfcmlkLm1vZGU7CisKKwkvKiBTaWduYWwgcXVhbGl0eSBhbmQgY28uIEJ1dCB3aGVyZSBpcyB0aGUgbm9pc2UgbGV2ZWwgPz8/ICovCisJbG9jYWwtPndzdGF0cy5xdWFsLnF1YWwgPSBhaXJvX2dldF9xdWFsaXR5KCZzdGF0dXNfcmlkLCAmY2FwX3JpZCk7CisJaWYgKGxvY2FsLT5yc3NpKQorCQlsb2NhbC0+d3N0YXRzLnF1YWwubGV2ZWwgPSAweDEwMCAtIGxvY2FsLT5yc3NpW3N0YXR1c19yaWQuc2lnUXVhbGl0eV0ucnNzaWRCbTsKKwllbHNlCisJCWxvY2FsLT53c3RhdHMucXVhbC5sZXZlbCA9IChzdGF0dXNfcmlkLm5vcm1hbGl6ZWRTaWduYWxTdHJlbmd0aCArIDMyMSkgLyAyOworCWlmIChzdGF0dXNfcmlkLmxlbiA+PSAxMjQpIHsKKwkJbG9jYWwtPndzdGF0cy5xdWFsLm5vaXNlID0gMjU2IC0gc3RhdHVzX3JpZC5ub2lzZWRCbTsKKwkJbG9jYWwtPndzdGF0cy5xdWFsLnVwZGF0ZWQgPSA3OworCX0gZWxzZSB7CisJCWxvY2FsLT53c3RhdHMucXVhbC5ub2lzZSA9IDA7CisJCWxvY2FsLT53c3RhdHMucXVhbC51cGRhdGVkID0gMzsKKwl9CisKKwkvKiBQYWNrZXRzIGRpc2NhcmRlZCBpbiB0aGUgd2lyZWxlc3MgYWRhcHRlciBkdWUgdG8gd2lyZWxlc3MKKwkgKiBzcGVjaWZpYyBwcm9ibGVtcyAqLworCWxvY2FsLT53c3RhdHMuZGlzY2FyZC5ud2lkID0gdmFsc1s1Nl0gKyB2YWxzWzU3XSArIHZhbHNbNThdOy8qIFNTSUQgTWlzbWF0Y2ggKi8KKwlsb2NhbC0+d3N0YXRzLmRpc2NhcmQuY29kZSA9IHZhbHNbNl07LyogUnhXZXBFcnIgKi8KKwlsb2NhbC0+d3N0YXRzLmRpc2NhcmQuZnJhZ21lbnQgPSB2YWxzWzMwXTsKKwlsb2NhbC0+d3N0YXRzLmRpc2NhcmQucmV0cmllcyA9IHZhbHNbMTBdOworCWxvY2FsLT53c3RhdHMuZGlzY2FyZC5taXNjID0gdmFsc1sxXSArIHZhbHNbMzJdOworCWxvY2FsLT53c3RhdHMubWlzcy5iZWFjb24gPSB2YWxzWzM0XTsKK30KKworc3RydWN0IGl3X3N0YXRpc3RpY3MgKmFpcm9fZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFpcm9faW5mbyAqbG9jYWwgPSAgZGV2LT5wcml2OworCisJaWYgKCF0ZXN0X2JpdChKT0JfV1NUQVRTLCAmbG9jYWwtPmZsYWdzKSkgeworCQkvKiBHZXQgc3RhdHMgb3V0IG9mIHRoZSBjYXJkIGlmIGF2YWlsYWJsZSAqLworCQlpZiAoZG93bl90cnlsb2NrKCZsb2NhbC0+c2VtKSAhPSAwKSB7CisJCQlzZXRfYml0KEpPQl9XU1RBVFMsICZsb2NhbC0+ZmxhZ3MpOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZsb2NhbC0+dGhyX3dhaXQpOworCQl9IGVsc2UKKwkJCWFpcm9fcmVhZF93aXJlbGVzc19zdGF0cyhsb2NhbCk7CisJfQorCisJcmV0dXJuICZsb2NhbC0+d3N0YXRzOworfQorI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCAqLworCisjaWZkZWYgQ0lTQ09fRVhUCisvKgorICogVGhpcyBqdXN0IHRyYW5zbGF0ZXMgZnJvbSBkcml2ZXIgSU9DVEwgY29kZXMgdG8gdGhlIGNvbW1hbmQgY29kZXMgdG8KKyAqIGZlZWQgdG8gdGhlIHJhZGlvJ3MgaG9zdCBpbnRlcmZhY2UuIFRoaW5ncyBjYW4gYmUgYWRkZWQvZGVsZXRlZAorICogYXMgbmVlZGVkLiAgVGhpcyByZXByZXNlbnRzIHRoZSBSRUFEIHNpZGUgb2YgY29udHJvbCBJL08gdG8KKyAqIHRoZSBjYXJkCisgKi8KK3N0YXRpYyBpbnQgcmVhZHJpZHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYWlyb25ldF9pb2N0bCAqY29tcCkgeworCXVuc2lnbmVkIHNob3J0IHJpZGNvZGU7CisJdW5zaWduZWQgY2hhciAqaW9idWY7CisJaW50IGxlbjsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlSZXNwIHJzcDsKKworCWlmICh0ZXN0X2JpdChGTEFHX0ZMQVNISU5HLCAmYWktPmZsYWdzKSkKKwkJcmV0dXJuIC1FSU87CisKKwlzd2l0Y2goY29tcC0+Y29tbWFuZCkKKwl7CisJY2FzZSBBSVJPR0NBUDogICAgICByaWRjb2RlID0gUklEX0NBUEFCSUxJVElFUzsgYnJlYWs7CisJY2FzZSBBSVJPR0NGRzogICAgICByaWRjb2RlID0gUklEX0NPTkZJRzsKKwkJaWYgKHRlc3RfYml0KEZMQUdfQ09NTUlULCAmYWktPmZsYWdzKSkgeworCQkJZGlzYWJsZV9NQUMgKGFpLCAxKTsKKwkJCXdyaXRlQ29uZmlnUmlkIChhaSwgMSk7CisJCQllbmFibGVfTUFDIChhaSwgJnJzcCwgMSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBSVJPR1NMSVNUOiAgICByaWRjb2RlID0gUklEX1NTSUQ7ICAgICAgICAgYnJlYWs7CisJY2FzZSBBSVJPR1ZMSVNUOiAgICByaWRjb2RlID0gUklEX0FQTElTVDsgICAgICAgYnJlYWs7CisJY2FzZSBBSVJPR0RSVk5BTTogICByaWRjb2RlID0gUklEX0RSVk5BTUU7ICAgICAgYnJlYWs7CisJY2FzZSBBSVJPR0VIVEVOQzogICByaWRjb2RlID0gUklEX0VUSEVSRU5DQVA7ICAgYnJlYWs7CisJY2FzZSBBSVJPR1dFUEtUTVA6ICByaWRjb2RlID0gUklEX1dFUF9URU1QOworCQkvKiBPbmx5IHN1cGVyLXVzZXIgY2FuIHJlYWQgV0VQIGtleXMgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJYnJlYWs7CisJY2FzZSBBSVJPR1dFUEtOVjogICByaWRjb2RlID0gUklEX1dFUF9QRVJNOworCQkvKiBPbmx5IHN1cGVyLXVzZXIgY2FuIHJlYWQgV0VQIGtleXMgKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJYnJlYWs7CisJY2FzZSBBSVJPR1NUQVQ6ICAgICByaWRjb2RlID0gUklEX1NUQVRVUzsgICAgICAgYnJlYWs7CisJY2FzZSBBSVJPR1NUQVRTRDMyOiByaWRjb2RlID0gUklEX1NUQVRTREVMVEE7ICAgYnJlYWs7CisJY2FzZSBBSVJPR1NUQVRTQzMyOiByaWRjb2RlID0gUklEX1NUQVRTOyAgICAgICAgYnJlYWs7CisjaWZkZWYgTUlDU1VQUE9SVAorCWNhc2UgQUlST0dNSUNTVEFUUzoKKwkJaWYgKGNvcHlfdG9fdXNlcihjb21wLT5kYXRhLCAmYWktPm1pY3N0YXRzLAorCQkJCSBtaW4oKGludCljb21wLT5sZW4sKGludClzaXplb2YoYWktPm1pY3N0YXRzKSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworI2VuZGlmCisJY2FzZSBBSVJPUlJJRDogICAgICByaWRjb2RlID0gY29tcC0+cmlkbnVtOyAgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCWlmICgoaW9idWYgPSBrbWFsbG9jKFJJRFNJWkUsIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCVBDNDUwMF9yZWFkcmlkKGFpLHJpZGNvZGUsaW9idWYsUklEU0laRSwgMSk7CisJLyogZ2V0IHRoZSBjb3VudCBvZiBieXRlcyBpbiB0aGUgcmlkICBkb2NzIHNheSAxc3QgMiBieXRlcyBpcyBpdC4KKwkgKiB0aGVuIHJldHVybiBpdCB0byB0aGUgdXNlcgorCSAqIDkvMjIvMjAwMCBIb25vciB1c2VyIGdpdmVuIGxlbmd0aAorCSAqLworCWxlbiA9IGNvbXAtPmxlbjsKKworCWlmIChjb3B5X3RvX3VzZXIoY29tcC0+ZGF0YSwgaW9idWYsIG1pbihsZW4sIChpbnQpUklEU0laRSkpKSB7CisJCWtmcmVlIChpb2J1Zik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlrZnJlZSAoaW9idWYpOworCXJldHVybiAwOworfQorCisvKgorICogRGFuZ2VyIFdpbGwgUm9iaW5zb24gd3JpdGUgdGhlIHJpZHMgaGVyZQorICovCisKK3N0YXRpYyBpbnQgd3JpdGVyaWRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGFpcm9uZXRfaW9jdGwgKmNvbXApIHsKKwlzdHJ1Y3QgYWlyb19pbmZvICphaSA9IGRldi0+cHJpdjsKKwlpbnQgIHJpZGNvZGU7CisjaWZkZWYgTUlDU1VQUE9SVAorICAgICAgICBpbnQgIGVuYWJsZWQ7CisjZW5kaWYKKwlSZXNwICAgICAgcnNwOworCXN0YXRpYyBpbnQgKCogd3JpdGVyKShzdHJ1Y3QgYWlyb19pbmZvICosIHUxNiByaWQsIGNvbnN0IHZvaWQgKiwgaW50LCBpbnQpOworCXVuc2lnbmVkIGNoYXIgKmlvYnVmOworCisJLyogT25seSBzdXBlci11c2VyIGNhbiB3cml0ZSBSSURzICovCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKHRlc3RfYml0KEZMQUdfRkxBU0hJTkcsICZhaS0+ZmxhZ3MpKQorCQlyZXR1cm4gLUVJTzsKKworCXJpZGNvZGUgPSAwOworCXdyaXRlciA9IGRvX3dyaXRlcmlkOworCisJc3dpdGNoKGNvbXAtPmNvbW1hbmQpCisJeworCWNhc2UgQUlST1BTSURTOiAgICAgcmlkY29kZSA9IFJJRF9TU0lEOyAgICAgICAgIGJyZWFrOworCWNhc2UgQUlST1BDQVA6ICAgICAgcmlkY29kZSA9IFJJRF9DQVBBQklMSVRJRVM7IGJyZWFrOworCWNhc2UgQUlST1BBUExJU1Q6ICAgcmlkY29kZSA9IFJJRF9BUExJU1Q7ICAgICAgIGJyZWFrOworCWNhc2UgQUlST1BDRkc6IGFpLT5jb25maWcubGVuID0gMDsKKwkJCSAgICBjbGVhcl9iaXQoRkxBR19DT01NSVQsICZhaS0+ZmxhZ3MpOworCQkJICAgIHJpZGNvZGUgPSBSSURfQ09ORklHOyAgICAgICBicmVhazsKKwljYXNlIEFJUk9QV0VQS0VZTlY6IHJpZGNvZGUgPSBSSURfV0VQX1BFUk07ICAgICBicmVhazsKKwljYXNlIEFJUk9QTEVBUFVTUjogIHJpZGNvZGUgPSBSSURfTEVBUFVTRVJOQU1FOyBicmVhazsKKwljYXNlIEFJUk9QTEVBUFBXRDogIHJpZGNvZGUgPSBSSURfTEVBUFBBU1NXT1JEOyBicmVhazsKKwljYXNlIEFJUk9QV0VQS0VZOiAgIHJpZGNvZGUgPSBSSURfV0VQX1RFTVA7IHdyaXRlciA9IFBDNDUwMF93cml0ZXJpZDsKKwkJYnJlYWs7CisJY2FzZSBBSVJPUExFQVBVU1IrMTogcmlkY29kZSA9IDB4RkYyQTsgICAgICAgICAgYnJlYWs7CisJY2FzZSBBSVJPUExFQVBVU1IrMjogcmlkY29kZSA9IDB4RkYyQjsgICAgICAgICAgYnJlYWs7CisKKwkJLyogdGhpcyBpcyBub3QgcmVhbGx5IGEgcmlkIGJ1dCBhIGNvbW1hbmQgZ2l2ZW4gdG8gdGhlIGNhcmQKKwkJICogc2FtZSB3aXRoIE1BQyBvZmYKKwkJICovCisJY2FzZSBBSVJPUE1BQ09OOgorCQlpZiAoZW5hYmxlX01BQyhhaSwgJnJzcCwgMSkgIT0gMCkKKwkJCXJldHVybiAtRUlPOworCQlyZXR1cm4gMDsKKworCQkvKgorCQkgKiBFdmlkZW50bHkgdGhpcyBjb2RlIGluIHRoZSBhaXJvIGRyaXZlciBkb2VzIG5vdCBnZXQgYSBzeW1ib2wKKwkJICogYXMgZGlzYWJsZV9NQUMuIGl0J3MgcHJvYmFibHkgc28gc2hvcnQgdGhlIGNvbXBpbGVyIGRvZXMgbm90IGdlbiBvbmUuCisJCSAqLworCWNhc2UgQUlST1BNQUNPRkY6CisJCWRpc2FibGVfTUFDKGFpLCAxKTsKKwkJcmV0dXJuIDA7CisKKwkJLyogVGhpcyBjb21tYW5kIG1lcmVseSBjbGVhcnMgdGhlIGNvdW50cyBkb2VzIG5vdCBhY3R1YWxseSBzdG9yZSBhbnkgZGF0YQorCQkgKiBvbmx5IHJlYWRzIHJpZC4gQnV0IGFzIGl0IGNoYW5nZXMgdGhlIGNhcmRzIHN0YXRlLCBJIHB1dCBpdCBpbiB0aGUKKwkJICogd3JpdGVyaWQgcm91dGluZXMuCisJCSAqLworCWNhc2UgQUlST1BTVENMUjoKKwkJaWYgKChpb2J1ZiA9IGttYWxsb2MoUklEU0laRSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlQQzQ1MDBfcmVhZHJpZChhaSxSSURfU1RBVFNERUxUQUNMRUFSLGlvYnVmLFJJRFNJWkUsIDEpOworCisjaWZkZWYgTUlDU1VQUE9SVAorCQllbmFibGVkID0gYWktPm1pY3N0YXRzLmVuYWJsZWQ7CisJCW1lbXNldCgmYWktPm1pY3N0YXRzLDAsc2l6ZW9mKGFpLT5taWNzdGF0cykpOworCQlhaS0+bWljc3RhdHMuZW5hYmxlZCA9IGVuYWJsZWQ7CisjZW5kaWYKKworCQlpZiAoY29weV90b191c2VyKGNvbXAtPmRhdGEsIGlvYnVmLAorCQkJCSBtaW4oKGludCljb21wLT5sZW4sIChpbnQpUklEU0laRSkpKSB7CisJCQlrZnJlZSAoaW9idWYpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJa2ZyZWUgKGlvYnVmKTsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CS8qIEJsYXJnISAqLworCX0KKwlpZihjb21wLT5sZW4gPiBSSURTSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgoaW9idWYgPSBrbWFsbG9jKFJJRFNJWkUsIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcihpb2J1Zixjb21wLT5kYXRhLGNvbXAtPmxlbikpIHsKKwkJa2ZyZWUgKGlvYnVmKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKGNvbXAtPmNvbW1hbmQgPT0gQUlST1BDRkcpIHsKKwkJQ29uZmlnUmlkICpjZmcgPSAoQ29uZmlnUmlkICopaW9idWY7CisKKwkJaWYgKHRlc3RfYml0KEZMQUdfTUlDX0NBUEFCTEUsICZhaS0+ZmxhZ3MpKQorCQkJY2ZnLT5vcG1vZGUgfD0gTU9ERV9NSUM7CisKKwkJaWYgKChjZmctPm9wbW9kZSAmIDB4RkYpID09IE1PREVfU1RBX0lCU1MpCisJCQlzZXRfYml0IChGTEFHX0FESE9DLCAmYWktPmZsYWdzKTsKKwkJZWxzZQorCQkJY2xlYXJfYml0IChGTEFHX0FESE9DLCAmYWktPmZsYWdzKTsKKwl9CisKKwlpZigoKndyaXRlcikoYWksIHJpZGNvZGUsIGlvYnVmLGNvbXAtPmxlbiwxKSkgeworCQlrZnJlZSAoaW9idWYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJa2ZyZWUgKGlvYnVmKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBbmNpbGxhcnkgZmxhc2ggLyBtb2QgZnVuY3Rpb25zIG11Y2ggYmxhY2sgbWFnaWMgbHVya2VzIGhlcmUgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qCisgKiBGbGFzaCBjb21tYW5kIHN3aXRjaCB0YWJsZQorICovCisKK2ludCBmbGFzaGNhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYWlyb25ldF9pb2N0bCAqY29tcCkgeworCWludCB6OworCWludCBjbWRyZXNldChzdHJ1Y3QgYWlyb19pbmZvICopOworCWludCBzZXRmbGFzaG1vZGUoc3RydWN0IGFpcm9faW5mbyAqKTsKKwlpbnQgZmxhc2hnY2hhcihzdHJ1Y3QgYWlyb19pbmZvICosaW50LGludCk7CisJaW50IGZsYXNocGNoYXIoc3RydWN0IGFpcm9faW5mbyAqLGludCxpbnQpOworCWludCBmbGFzaHB1dGJ1ZihzdHJ1Y3QgYWlyb19pbmZvICopOworCWludCBmbGFzaHJlc3RhcnQoc3RydWN0IGFpcm9faW5mbyAqLHN0cnVjdCBuZXRfZGV2aWNlICopOworCisJLyogT25seSBzdXBlci11c2VyIGNhbiBtb2RpZnkgZmxhc2ggKi8KKwlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlzd2l0Y2goY29tcC0+Y29tbWFuZCkKKwl7CisJY2FzZSBBSVJPRkxTSFJTVDoKKwkJcmV0dXJuIGNtZHJlc2V0KChzdHJ1Y3QgYWlyb19pbmZvICopZGV2LT5wcml2KTsKKworCWNhc2UgQUlST0ZMU0hTVEZMOgorCQlpZiAoISgoc3RydWN0IGFpcm9faW5mbyAqKWRldi0+cHJpdiktPmZsYXNoICYmCisJCQkoKChzdHJ1Y3QgYWlyb19pbmZvICopZGV2LT5wcml2KS0+Zmxhc2ggPSBrbWFsbG9jIChGTEFTSFNJWkUsIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJldHVybiBzZXRmbGFzaG1vZGUoKHN0cnVjdCBhaXJvX2luZm8gKilkZXYtPnByaXYpOworCisJY2FzZSBBSVJPRkxTSEdDSFI6IC8qIEdldCBjaGFyIGZyb20gYXV4ICovCisJCWlmKGNvbXAtPmxlbiAhPSBzaXplb2YoaW50KSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnosY29tcC0+ZGF0YSxjb21wLT5sZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiBmbGFzaGdjaGFyKChzdHJ1Y3QgYWlyb19pbmZvICopZGV2LT5wcml2LHosODAwMCk7CisKKwljYXNlIEFJUk9GTFNIUENIUjogLyogU2VuZCBjaGFyIHRvIGNhcmQuICovCisJCWlmKGNvbXAtPmxlbiAhPSBzaXplb2YoaW50KSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnosY29tcC0+ZGF0YSxjb21wLT5sZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiBmbGFzaHBjaGFyKChzdHJ1Y3QgYWlyb19pbmZvICopZGV2LT5wcml2LHosODAwMCk7CisKKwljYXNlIEFJUk9GTFBVVEJVRjogLyogU2VuZCAzMmsgdG8gY2FyZCAqLworCQlpZiAoISgoc3RydWN0IGFpcm9faW5mbyAqKWRldi0+cHJpdiktPmZsYXNoKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWlmKGNvbXAtPmxlbiA+IEZMQVNIU0laRSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZihjb3B5X2Zyb21fdXNlcigoKHN0cnVjdCBhaXJvX2luZm8gKilkZXYtPnByaXYpLT5mbGFzaCxjb21wLT5kYXRhLGNvbXAtPmxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlmbGFzaHB1dGJ1Zigoc3RydWN0IGFpcm9faW5mbyAqKWRldi0+cHJpdik7CisJCXJldHVybiAwOworCisJY2FzZSBBSVJPUkVTVEFSVDoKKwkJaWYoZmxhc2hyZXN0YXJ0KChzdHJ1Y3QgYWlyb19pbmZvICopZGV2LT5wcml2LGRldikpCisJCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCisjZGVmaW5lIEZMQVNIX0NPTU1BTkQgIDB4N2U3ZQorCisvKgorICogU1RFUCAxKQorICogRGlzYWJsZSBNQUMgYW5kIGRvIHNvZnQgcmVzZXQgb24KKyAqIGNhcmQuCisgKi8KKworaW50IGNtZHJlc2V0KHN0cnVjdCBhaXJvX2luZm8gKmFpKSB7CisJZGlzYWJsZV9NQUMoYWksIDEpOworCisJaWYoIXdhaXRidXN5IChhaSkpeworCQlwcmludGsoS0VSTl9JTkZPICJXYWl0YnVzeSBoYW5nIGJlZm9yZSBSRVNFVFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJT1VUNDUwMChhaSxDT01NQU5ELENNRF9TT0ZUUkVTRVQpOworCisJc3NsZWVwKDEpOwkJCS8qIFdBUyA2MDAgMTIvNy8wMCAqLworCisJaWYoIXdhaXRidXN5IChhaSkpeworCQlwcmludGsoS0VSTl9JTkZPICJXYWl0YnVzeSBoYW5nIEFGVEVSIFJFU0VUXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFNURVAgMikKKyAqIFB1dCB0aGUgY2FyZCBpbiBsZWdlbmRhcnkgZmxhc2gKKyAqIG1vZGUKKyAqLworCitpbnQgc2V0Zmxhc2htb2RlIChzdHJ1Y3QgYWlyb19pbmZvICphaSkgeworCXNldF9iaXQgKEZMQUdfRkxBU0hJTkcsICZhaS0+ZmxhZ3MpOworCisJT1VUNDUwMChhaSwgU1dTMCwgRkxBU0hfQ09NTUFORCk7CisJT1VUNDUwMChhaSwgU1dTMSwgRkxBU0hfQ09NTUFORCk7CisJaWYgKHByb2JlKSB7CisJCU9VVDQ1MDAoYWksIFNXUzAsIEZMQVNIX0NPTU1BTkQpOworCQlPVVQ0NTAwKGFpLCBDT01NQU5ELDB4MTApOworCX0gZWxzZSB7CisJCU9VVDQ1MDAoYWksIFNXUzIsIEZMQVNIX0NPTU1BTkQpOworCQlPVVQ0NTAwKGFpLCBTV1MzLCBGTEFTSF9DT01NQU5EKTsKKwkJT1VUNDUwMChhaSwgQ09NTUFORCwwKTsKKwl9CisJbXNsZWVwKDUwMCk7CQkvKiA1MDBtcyBkZWxheSAqLworCisJaWYoIXdhaXRidXN5KGFpKSkgeworCQljbGVhcl9iaXQgKEZMQUdfRkxBU0hJTkcsICZhaS0+ZmxhZ3MpOworCQlwcmludGsoS0VSTl9JTkZPICJXYWl0YnVzeSBoYW5nIGFmdGVyIHNldGZsYXNoIG1vZGVcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFB1dCBjaGFyYWN0ZXIgdG8gU1dTMCB3YWl0IGZvciBkd2VsbHRpbWUKKyAqIHggNTB1cyBmb3IgIGVjaG8gLgorICovCisKK2ludCBmbGFzaHBjaGFyKHN0cnVjdCBhaXJvX2luZm8gKmFpLGludCBieXRlLGludCBkd2VsbHRpbWUpIHsKKwlpbnQgZWNobzsKKwlpbnQgd2FpdHRpbWU7CisKKwlieXRlIHw9IDB4ODAwMDsKKworCWlmKGR3ZWxsdGltZSA9PSAwICkKKwkJZHdlbGx0aW1lID0gMjAwOworCisJd2FpdHRpbWU9ZHdlbGx0aW1lOworCisJLyogV2FpdCBmb3IgYnVzeSBiaXQgZDE1IHRvIGdvIGZhbHNlIGluZGljYXRpbmcgYnVmZmVyIGVtcHR5ICovCisJd2hpbGUgKChJTjQ1MDAgKGFpLCBTV1MwKSAmIDB4ODAwMCkgJiYgd2FpdHRpbWUgPiAwKSB7CisJCXVkZWxheSAoNTApOworCQl3YWl0dGltZSAtPSA1MDsKKwl9CisKKwkvKiB0aW1lb3V0IGZvciBidXN5IGNsZWFyIHdhaXQgKi8KKwlpZih3YWl0dGltZSA8PSAwICl7CisJCXByaW50ayhLRVJOX0lORk8gImZsYXNoIHB1dGNoYXIgYnVzeXdhaXQgdGltZW91dCEgXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBQb3J0IGlzIGNsZWFyIG5vdyB3cml0ZSBieXRlIGFuZCB3YWl0IGZvciBpdCB0byBlY2hvIGJhY2sgKi8KKwlkbyB7CisJCU9VVDQ1MDAoYWksU1dTMCxieXRlKTsKKwkJdWRlbGF5KDUwKTsKKwkJZHdlbGx0aW1lIC09IDUwOworCQllY2hvID0gSU40NTAwKGFpLFNXUzEpOworCX0gd2hpbGUgKGR3ZWxsdGltZSA+PSAwICYmIGVjaG8gIT0gYnl0ZSk7CisKKwlPVVQ0NTAwKGFpLFNXUzEsMCk7CisKKwlyZXR1cm4gKGVjaG8gPT0gYnl0ZSkgPyAwIDogLUVJTzsKK30KKworLyoKKyAqIEdldCBhIGNoYXJhY3RlciBmcm9tIHRoZSBjYXJkIG1hdGNoaW5nIG1hdGNoYnl0ZQorICogU3RlcCAzKQorICovCitpbnQgZmxhc2hnY2hhcihzdHJ1Y3QgYWlyb19pbmZvICphaSxpbnQgbWF0Y2hieXRlLGludCBkd2VsbHRpbWUpeworCWludCAgICAgICAgICAgcmNoYXI7CisJdW5zaWduZWQgY2hhciByYnl0ZT0wOworCisJZG8geworCQlyY2hhciA9IElONDUwMChhaSxTV1MxKTsKKworCQlpZihkd2VsbHRpbWUgJiYgISgweDgwMDAgJiByY2hhcikpeworCQkJZHdlbGx0aW1lIC09IDEwOworCQkJbWRlbGF5KDEwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXJieXRlID0gMHhmZiAmIHJjaGFyOworCisJCWlmKCAocmJ5dGUgPT0gbWF0Y2hieXRlKSAmJiAoMHg4MDAwICYgcmNoYXIpICl7CisJCQlPVVQ0NTAwKGFpLFNXUzEsMCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiggcmJ5dGUgPT0gMHg4MSB8fCByYnl0ZSA9PSAweDgyIHx8IHJieXRlID09IDB4ODMgfHwgcmJ5dGUgPT0gMHgxYSB8fCAweGZmZmYgPT0gcmNoYXIpCisJCQlicmVhazsKKwkJT1VUNDUwMChhaSxTV1MxLDApOworCisJfXdoaWxlKGR3ZWxsdGltZSA+IDApOworCXJldHVybiAtRUlPOworfQorCisvKgorICogVHJhbnNmZXIgMzJrIG9mIGZpcm13YXJlIGRhdGEgZnJvbSB1c2VyIGJ1ZmZlciB0byBvdXIgYnVmZmVyIGFuZAorICogc2VuZCB0byB0aGUgY2FyZAorICovCisKK2ludCBmbGFzaHB1dGJ1ZihzdHJ1Y3QgYWlyb19pbmZvICphaSl7CisJaW50ICAgICAgICAgICAgbndvcmRzOworCisJLyogV3JpdGUgc3R1ZmYgKi8KKwlpZiAodGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpCisJCW1lbWNweV90b2lvKGFpLT5wY2lhdXggKyAweDgwMDAsIGFpLT5mbGFzaCwgRkxBU0hTSVpFKTsKKwllbHNlIHsKKwkJT1VUNDUwMChhaSxBVVhQQUdFLDB4MTAwKTsKKwkJT1VUNDUwMChhaSxBVVhPRkYsMCk7CisKKwkJZm9yKG53b3Jkcz0wO253b3JkcyAhPSBGTEFTSFNJWkUgLyAyO253b3JkcysrKXsKKwkJCU9VVDQ1MDAoYWksQVVYREFUQSxhaS0+Zmxhc2hbbndvcmRzXSAmIDB4ZmZmZik7CisJCX0KKwl9CisJT1VUNDUwMChhaSxTV1MwLDB4ODAwMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCisgKi8KK2ludCBmbGFzaHJlc3RhcnQoc3RydWN0IGFpcm9faW5mbyAqYWksc3RydWN0IG5ldF9kZXZpY2UgKmRldil7CisJaW50ICAgIGksc3RhdHVzOworCisJc3NsZWVwKDEpOwkJCS8qIEFkZGVkIDEyLzcvMDAgKi8KKwljbGVhcl9iaXQgKEZMQUdfRkxBU0hJTkcsICZhaS0+ZmxhZ3MpOworCWlmICh0ZXN0X2JpdChGTEFHX01QSSwgJmFpLT5mbGFncykpIHsKKwkJc3RhdHVzID0gbXBpX2luaXRfZGVzY3JpcHRvcnMoYWkpOworCQlpZiAoc3RhdHVzICE9IFNVQ0NFU1MpCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKwlzdGF0dXMgPSBzZXR1cF9jYXJkKGFpLCBkZXYtPmRldl9hZGRyLCAxKTsKKworCWlmICghdGVzdF9iaXQoRkxBR19NUEksJmFpLT5mbGFncykpCisJCWZvciggaSA9IDA7IGkgPCBNQVhfRklEUzsgaSsrICkgeworCQkJYWktPmZpZHNbaV0gPSB0cmFuc21pdF9hbGxvY2F0ZQorCQkJCSggYWksIDIzMTIsIGkgPj0gTUFYX0ZJRFMgLyAyICk7CisJCX0KKworCXNzbGVlcCgxKTsJCQkvKiBBZGRlZCAxMi83LzAwICovCisJcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBDSVNDT19FWFQgKi8KKworLyoKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICAgIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIEluIGFkZGl0aW9uOgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgICAgICAgcGVybWlzc2lvbi4KKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgICAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAgICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAgICBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgICAgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgICAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgICAgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgICAgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICAgIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICAgIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworbW9kdWxlX2luaXQoYWlyb19pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChhaXJvX2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm9fY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm9fY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmY1M2FmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyb19jcy5jCkBAIC0wLDAgKzEsNjIyIEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEFpcm9uZXQgZHJpdmVyIGZvciA0NTAwIGFuZCA0ODAwIHNlcmllcyBjYXJkcworCisgICAgVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIGJvdGggdGhlIEdQTCB2ZXJzaW9uIDIgYW5kIEJTRCBsaWNlbnNlcy4KKyAgICBFaXRoZXIgbGljZW5zZSBtYXkgYmUgdXNlZC4gIFRoZSByZXNwZWN0aXZlIGxpY2Vuc2VzIGFyZSBmb3VuZCBhdAorICAgIHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorCisgICAgVGhpcyBjb2RlIHdhcyBkZXZlbG9wZWQgYnkgQmVuamFtaW4gUmVlZCA8YnJlZWRAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICAgIGluY2x1ZGluZyBwb3J0aW9ucyBvZiB3aGljaCBjb21lIGZyb20gdGhlIEFpcm9uZXQgUEM0NTAwCisgICAgRGV2ZWxvcGVyJ3MgUmVmZXJlbmNlIE1hbnVhbCBhbmQgdXNlZCB3aXRoIHBlcm1pc3Npb24uICBDb3B5cmlnaHQKKyAgICAoQykgMTk5OSBCZW5qYW1pbiBSZWVkLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gIFBlcm1pc3Npb24gdG8gdXNlCisgICAgY29kZSBpbiB0aGUgRGV2ZWxvcGVyJ3MgbWFudWFsIHdhcyBncmFudGVkIGZvciB0aGlzIGRyaXZlciBieQorICAgIEFpcm9uZXQuCisKKyAgICBJbiBhZGRpdGlvbiB0aGlzIG1vZHVsZSB3YXMgZGVyaXZlZCBmcm9tIGR1bW15X2NzLgorICAgIFRoZSBpbml0aWFsIGRldmVsb3BlciBvZiBkdW1teV9jcyBpcyBEYXZpZCBBLiBIaW5kcworICAgIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4uICBQb3J0aW9ucyBjcmVhdGVkIGJ5IERhdmlkIEEuIEhpbmRzCisgICAgYXJlIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBBLiBIaW5kcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgIAorICAgIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpZmRlZiBfX0lOX1BDTUNJQV9QQUNLQUdFX18KKyNpbmNsdWRlIDxwY21jaWEva19jb21wYXQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworLyoKKyAgIEFsbCB0aGUgUENNQ0lBIG1vZHVsZXMgdXNlIFBDTUNJQV9ERUJVRyB0byBjb250cm9sIGRlYnVnZ2luZy4gIElmCisgICB5b3UgZG8gbm90IGRlZmluZSBQQ01DSUFfREVCVUcgYXQgYWxsLCBhbGwgdGhlIGRlYnVnIGNvZGUgd2lsbCBiZQorICAgbGVmdCBvdXQuICBJZiB5b3UgY29tcGlsZSB3aXRoIFBDTUNJQV9ERUJVRz0wLCB0aGUgZGVidWcgY29kZSB3aWxsCisgICBiZSBwcmVzZW50IGJ1dCBkaXNhYmxlZCAtLSBidXQgaXQgY2FuIHRoZW4gYmUgZW5hYmxlZCBmb3Igc3BlY2lmaWMKKyAgIG1vZHVsZXMgYXQgbG9hZCB0aW1lIHdpdGggYSAncGNfZGVidWc9Iycgb3B0aW9uIHRvIGluc21vZC4KKyovCisjaWZkZWYgUENNQ0lBX0RFQlVHCitzdGF0aWMgaW50IHBjX2RlYnVnID0gUENNQ0lBX0RFQlVHOworbW9kdWxlX3BhcmFtKHBjX2RlYnVnLCBpbnQsIDApOworc3RhdGljIGNoYXIgKnZlcnNpb24gPSAiJFJldmlzaW9uOiAxLjIgJCI7CisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhLRVJOX0RFQlVHIGFyZ3MpOworI2Vsc2UKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworTU9EVUxFX0FVVEhPUigiQmVuamFtaW4gUmVlZCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBwb3J0IGZvciBDaXNjby9BaXJvbmV0IDgwMi4xMSB3aXJlbGVzcyBldGhlcm5ldCBcCisgICAgICAgICAgICAgICAgICAgY2FyZHMuICBUaGlzIGlzIHRoZSBtb2R1bGUgdGhhdCBsaW5rcyB0aGUgUENNQ0lBIGNhcmQgXAorCQkgICB3aXRoIHRoZSBhaXJvIG1vZHVsZS4iKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJBaXJvbmV0IDQ1MDAsIDQ4MDAgYW5kIENpc2NvIDM0MCBQQ01DSUEgY2FyZHMiKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgICBUaGUgZXZlbnQoKSBmdW5jdGlvbiBpcyB0aGlzIGRyaXZlcidzIENhcmQgU2VydmljZXMgZXZlbnQgaGFuZGxlci4KKyAgIEl0IHdpbGwgYmUgY2FsbGVkIGJ5IENhcmQgU2VydmljZXMgd2hlbiBhbiBhcHByb3ByaWF0ZSBjYXJkIHN0YXR1cworICAgZXZlbnQgaXMgcmVjZWl2ZWQuICBUaGUgY29uZmlnKCkgYW5kIHJlbGVhc2UoKSBlbnRyeSBwb2ludHMgYXJlCisgICB1c2VkIHRvIGNvbmZpZ3VyZSBvciByZWxlYXNlIGEgc29ja2V0LCBpbiByZXNwb25zZSB0byBjYXJkCisgICBpbnNlcnRpb24gYW5kIGVqZWN0aW9uIGV2ZW50cy4gIFRoZXkgYXJlIGludm9rZWQgZnJvbSB0aGUgYWlyb19jcworICAgZXZlbnQgaGFuZGxlci4gCisqLworCitzdHJ1Y3QgbmV0X2RldmljZSAqaW5pdF9haXJvX2NhcmQoIGludCwgaW50LCBpbnQsIHN0cnVjdCBkZXZpY2UgKiApOwordm9pZCBzdG9wX2Fpcm9fY2FyZCggc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50ICk7CitpbnQgcmVzZXRfYWlyb19jYXJkKCBzdHJ1Y3QgbmV0X2RldmljZSAqICk7CisKK3N0YXRpYyB2b2lkIGFpcm9fY29uZmlnKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIHZvaWQgYWlyb19yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIGludCBhaXJvX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJICAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CisKKy8qCisgICBUaGUgYXR0YWNoKCkgYW5kIGRldGFjaCgpIGVudHJ5IHBvaW50cyBhcmUgdXNlZCB0byBjcmVhdGUgYW5kIGRlc3Ryb3kKKyAgICJpbnN0YW5jZXMiIG9mIHRoZSBkcml2ZXIsIHdoZXJlIGVhY2ggaW5zdGFuY2UgcmVwcmVzZW50cyBldmVyeXRoaW5nCisgICBuZWVkZWQgdG8gbWFuYWdlIG9uZSBhY3R1YWwgUENNQ0lBIGNhcmQuCisqLworCitzdGF0aWMgZGV2X2xpbmtfdCAqYWlyb19hdHRhY2godm9pZCk7CitzdGF0aWMgdm9pZCBhaXJvX2RldGFjaChkZXZfbGlua190ICopOworCisvKgorICAgWW91J2xsIGFsc28gbmVlZCB0byBwcm90b3R5cGUgYWxsIHRoZSBmdW5jdGlvbnMgdGhhdCB3aWxsIGFjdHVhbGx5CisgICBiZSB1c2VkIHRvIHRhbGsgdG8geW91ciBkZXZpY2UuICBTZWUgJ3BjbWVtX2NzJyBmb3IgYSBnb29kIGV4YW1wbGUKKyAgIG9mIGEgZnVsbHkgc2VsZi1zdWZmaWNpZW50IGRyaXZlcjsgdGhlIG90aGVyIGRyaXZlcnMgcmVseSBtb3JlIG9yCisgICBsZXNzIG9uIG90aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwuCisqLworCisvKgorICAgVGhlIGRldl9pbmZvIHZhcmlhYmxlIGlzIHRoZSAia2V5IiB0aGF0IGlzIHVzZWQgdG8gbWF0Y2ggdXAgdGhpcworICAgZGV2aWNlIGRyaXZlciB3aXRoIGFwcHJvcHJpYXRlIGNhcmRzLCB0aHJvdWdoIHRoZSBjYXJkIGNvbmZpZ3VyYXRpb24KKyAgIGRhdGFiYXNlLgorKi8KKworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAiYWlyb19jcyI7CisKKy8qCisgICBBIGxpbmtlZCBsaXN0IG9mICJpbnN0YW5jZXMiIG9mIHRoZSAgYWlyb25ldCBkZXZpY2UuICBFYWNoIGFjdHVhbAorICAgUENNQ0lBIGNhcmQgY29ycmVzcG9uZHMgdG8gb25lIGRldmljZSBpbnN0YW5jZSwgYW5kIGlzIGRlc2NyaWJlZAorICAgYnkgb25lIGRldl9saW5rX3Qgc3RydWN0dXJlIChkZWZpbmVkIGluIGRzLmgpLgorCisgICBZb3UgbWF5IG5vdCB3YW50IHRvIHVzZSBhIGxpbmtlZCBsaXN0IGZvciB0aGlzIC0tIGZvciBleGFtcGxlLCB0aGUKKyAgIG1lbW9yeSBjYXJkIGRyaXZlciB1c2VzIGFuIGFycmF5IG9mIGRldl9saW5rX3QgcG9pbnRlcnMsIHdoZXJlIG1pbm9yCisgICBkZXZpY2UgbnVtYmVycyBhcmUgdXNlZCB0byBkZXJpdmUgdGhlIGNvcnJlc3BvbmRpbmcgYXJyYXkgaW5kZXguCisqLworCitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3QgPSBOVUxMOworCisvKgorICAgQSBkZXZfbGlua190IHN0cnVjdHVyZSBoYXMgZmllbGRzIGZvciBtb3N0IHRoaW5ncyB0aGF0IGFyZSBuZWVkZWQKKyAgIHRvIGtlZXAgdHJhY2sgb2YgYSBzb2NrZXQsIGJ1dCB0aGVyZSB3aWxsIHVzdWFsbHkgYmUgc29tZSBkZXZpY2UKKyAgIHNwZWNpZmljIGluZm9ybWF0aW9uIHRoYXQgYWxzbyBuZWVkcyB0byBiZSBrZXB0IHRyYWNrIG9mLiAgVGhlCisgICAncHJpdicgcG9pbnRlciBpbiBhIGRldl9saW5rX3Qgc3RydWN0dXJlIGNhbiBiZSB1c2VkIHRvIHBvaW50IHRvCisgICBhIGRldmljZS1zcGVjaWZpYyBwcml2YXRlIGRhdGEgc3RydWN0dXJlLCBsaWtlIHRoaXMuCisKKyAgIEEgZHJpdmVyIG5lZWRzIHRvIHByb3ZpZGUgYSBkZXZfbm9kZV90IHN0cnVjdHVyZSBmb3IgZWFjaCBkZXZpY2UKKyAgIG9uIGEgY2FyZC4gIEluIHNvbWUgY2FzZXMsIHRoZXJlIGlzIG9ubHkgb25lIGRldmljZSBwZXIgY2FyZCAoZm9yCisgICBleGFtcGxlLCBldGhlcm5ldCBjYXJkcywgbW9kZW1zKS4gIEluIG90aGVyIGNhc2VzLCB0aGVyZSBtYXkgYmUKKyAgIG1hbnkgYWN0dWFsIG9yIGxvZ2ljYWwgZGV2aWNlcyAoU0NTSSBhZGFwdGVycywgbWVtb3J5IGNhcmRzIHdpdGgKKyAgIG11bHRpcGxlIHBhcnRpdGlvbnMpLiAgVGhlIGRldl9ub2RlX3Qgc3RydWN0dXJlcyBuZWVkIHRvIGJlIGtlcHQKKyAgIGluIGEgbGlua2VkIGxpc3Qgc3RhcnRpbmcgYXQgdGhlICdkZXYnIGZpZWxkIG9mIGEgZGV2X2xpbmtfdAorICAgc3RydWN0dXJlLiAgV2UgYWxsb2NhdGUgdGhlbSBpbiB0aGUgY2FyZCdzIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUsCisgICBiZWNhdXNlIHRoZXkgZ2VuZXJhbGx5IHNob3VsZG4ndCBiZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHkuCisKKyAgIEluIHRoaXMgY2FzZSwgd2UgYWxzbyBwcm92aWRlIGEgZmxhZyB0byBpbmRpY2F0ZSBpZiBhIGRldmljZSBpcworICAgInN0b3BwZWQiIGR1ZSB0byBhIHBvd2VyIG1hbmFnZW1lbnQgZXZlbnQsIG9yIGNhcmQgZWplY3Rpb24uICBUaGUKKyAgIGRldmljZSBJTyByb3V0aW5lcyBjYW4gdXNlIGEgZmxhZyBsaWtlIHRoaXMgdG8gdGhyb3R0bGUgSU8gdG8gYQorICAgY2FyZCB0aGF0IGlzIG5vdCByZWFkeSB0byBhY2NlcHQgaXQuCisqLworICAgCit0eXBlZGVmIHN0cnVjdCBsb2NhbF9pbmZvX3QgeworCWRldl9ub2RlX3QJbm9kZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZXRoX2RldjsKK30gbG9jYWxfaW5mb190OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIGFpcm9fYXR0YWNoKCkgY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcKKyAgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBvbmUgZGV2aWNlLiAgVGhlIGRldmljZSBpcyByZWdpc3RlcmVkCisgIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKyAgCisgIFRoZSBkZXZfbGluayBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQsIGJ1dCB3ZSBkb24ndCBhY3R1YWxseQorICBjb25maWd1cmUgdGhlIGNhcmQgYXQgdGhpcyBwb2ludCAtLSB3ZSB3YWl0IHVudGlsIHdlIHJlY2VpdmUgYQorICBjYXJkIGluc2VydGlvbiBldmVudC4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgZGV2X2xpbmtfdCAqYWlyb19hdHRhY2godm9pZCkKK3sKKwljbGllbnRfcmVnX3QgY2xpZW50X3JlZzsKKwlkZXZfbGlua190ICpsaW5rOworCWxvY2FsX2luZm9fdCAqbG9jYWw7CisJaW50IHJldDsKKwkKKwlERUJVRygwLCAiYWlyb19hdHRhY2goKVxuIik7CisKKwkvKiBJbml0aWFsaXplIHRoZSBkZXZfbGlua190IHN0cnVjdHVyZSAqLworCWxpbmsgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGV2X2xpbmtfdCksIEdGUF9LRVJORUwpOworCWlmICghbGluaykgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm9fY3M6IG5vIG1lbW9yeSBmb3IgbmV3IGRldmljZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQobGluaywgMCwgc2l6ZW9mKHN0cnVjdCBkZXZfbGlua190KSk7CisJCisJLyogSW50ZXJydXB0IHNldHVwICovCisJbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkU7CisJbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOworCWxpbmstPmlycS5IYW5kbGVyID0gTlVMTDsKKwkKKwkvKgorCSAgR2VuZXJhbCBzb2NrZXQgY29uZmlndXJhdGlvbiBkZWZhdWx0cyBjYW4gZ28gaGVyZS4gIEluIHRoaXMKKwkgIGNsaWVudCwgd2UgYXNzdW1lIHZlcnkgbGl0dGxlLCBhbmQgcmVseSBvbiB0aGUgQ0lTIGZvciBhbG1vc3QKKwkgIGV2ZXJ5dGhpbmcuICBJbiBtb3N0IGNsaWVudHMsIG1hbnkgZGV0YWlscyAoaS5lLiwgbnVtYmVyLCBzaXplcywKKwkgIGFuZCBhdHRyaWJ1dGVzIG9mIElPIHdpbmRvd3MpIGFyZSBmaXhlZCBieSB0aGUgbmF0dXJlIG9mIHRoZQorCSAgZGV2aWNlLCBhbmQgY2FuIGJlIGhhcmQtd2lyZWQgaGVyZS4KKwkqLworCWxpbmstPmNvbmYuQXR0cmlidXRlcyA9IDA7CisJbGluay0+Y29uZi5WY2MgPSA1MDsKKwlsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKwkKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgcHJpdmF0ZSBkZXZpY2Utc3BlY2lmaWMgZGF0YSAqLworCWxvY2FsID0ga21hbGxvYyhzaXplb2YobG9jYWxfaW5mb190KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsb2NhbCkgeworCQlwcmludGsoS0VSTl9FUlIgImFpcm9fY3M6IG5vIG1lbW9yeSBmb3IgbmV3IGRldmljZVxuIik7CisJCWtmcmVlIChsaW5rKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbXNldChsb2NhbCwgMCwgc2l6ZW9mKGxvY2FsX2luZm9fdCkpOworCWxpbmstPnByaXYgPSBsb2NhbDsKKwkKKwkvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKwlsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisJZGV2X2xpc3QgPSBsaW5rOworCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisJY2xpZW50X3JlZy5FdmVudE1hc2sgPQorCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisJCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CisJY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmFpcm9fZXZlbnQ7CisJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisJaWYgKHJldCAhPSAwKSB7CisJCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisJCWFpcm9fZGV0YWNoKGxpbmspOworCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJcmV0dXJuIGxpbms7Cit9IC8qIGFpcm9fYXR0YWNoICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQKKyAgd2l0aCBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCisgIHN0cnVjdHVyZXMgYXJlIGZyZWVkLiAgT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGZyZWVkCisgIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBhaXJvX2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworCWRldl9saW5rX3QgKipsaW5rcDsKKwkKKwlERUJVRygwLCAiYWlyb19kZXRhY2goMHglcClcbiIsIGxpbmspOworCQorCS8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisJZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkKKwkJaWYgKCpsaW5rcCA9PSBsaW5rKSBicmVhazsKKwlpZiAoKmxpbmtwID09IE5VTEwpCisJCXJldHVybjsKKwkKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKQorCQlhaXJvX3JlbGVhc2UobGluayk7CisJCisJaWYgKCAoKGxvY2FsX2luZm9fdCopbGluay0+cHJpdiktPmV0aF9kZXYgKSB7CisJCXN0b3BfYWlyb19jYXJkKCAoKGxvY2FsX2luZm9fdCopbGluay0+cHJpdiktPmV0aF9kZXYsIDAgKTsKKwl9CisJKChsb2NhbF9pbmZvX3QqKWxpbmstPnByaXYpLT5ldGhfZGV2ID0gTlVMTDsgICAKKwkKKwkvKiBCcmVhayB0aGUgbGluayB3aXRoIENhcmQgU2VydmljZXMgKi8KKwlpZiAobGluay0+aGFuZGxlKQorCQlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKwkKKwkKKwkKKwkvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBwaWVjZXMgKi8KKwkqbGlua3AgPSBsaW5rLT5uZXh0OworCWlmIChsaW5rLT5wcml2KSB7CisJCWtmcmVlKGxpbmstPnByaXYpOworCX0KKwlrZnJlZShsaW5rKTsKKwkKK30gLyogYWlyb19kZXRhY2ggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBhaXJvX2NvbmZpZygpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudAorICBpcyByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUKKyAgZGV2aWNlIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtLgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNkZWZpbmUgQ1NfQ0hFQ0soZm4sIHJldCkgXAorZG8geyBsYXN0X2ZuID0gKGZuKTsgaWYgKChsYXN0X3JldCA9IChyZXQpKSAhPSAwKSBnb3RvIGNzX2ZhaWxlZDsgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgYWlyb19jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKwljbGllbnRfaGFuZGxlX3QgaGFuZGxlOworCXR1cGxlX3QgdHVwbGU7CisJY2lzcGFyc2VfdCBwYXJzZTsKKwlsb2NhbF9pbmZvX3QgKmRldjsKKwlpbnQgbGFzdF9mbiwgbGFzdF9yZXQ7CisJdV9jaGFyIGJ1Zls2NF07CisJd2luX3JlcV90IHJlcTsKKwltZW1yZXFfdCBtYXA7CisJCisJaGFuZGxlID0gbGluay0+aGFuZGxlOworCWRldiA9IGxpbmstPnByaXY7CisKKwlERUJVRygwLCAiYWlyb19jb25maWcoMHglcClcbiIsIGxpbmspOworCQorCS8qCisJICBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24KKwkgIHJlZ2lzdGVycy4KKwkqLworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisJdHVwbGUuQXR0cmlidXRlcyA9IDA7CisJdHVwbGUuVHVwbGVEYXRhID0gYnVmOworCXR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOworCXR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKKwlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKwlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOworCWxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKwkKKwkvKiBDb25maWd1cmUgY2FyZCAqLworCWxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisJCisJLyoKKwkgIEluIHRoaXMgbG9vcCwgd2Ugc2NhbiB0aGUgQ0lTIGZvciBjb25maWd1cmF0aW9uIHRhYmxlIGVudHJpZXMsCisJICBlYWNoIG9mIHdoaWNoIGRlc2NyaWJlcyBhIHZhbGlkIGNhcmQgY29uZmlndXJhdGlvbiwgaW5jbHVkaW5nCisJICB2b2x0YWdlLCBJTyB3aW5kb3csIG1lbW9yeSB3aW5kb3csIGFuZCBpbnRlcnJ1cHQgc2V0dGluZ3MuCisJICAKKwkgIFdlIG1ha2Ugbm8gYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGNhcmQgdG8gYmUgY29uZmlndXJlZDogd2UgdXNlCisJICBqdXN0IHRoZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgaW4gdGhlIENJUy4gIEluIGFuIGlkZWFsIHdvcmxkLAorCSAgdGhpcyB3b3VsZCB3b3JrIGZvciBhbnkgUENNQ0lBIGNhcmQsIGJ1dCBpdCByZXF1aXJlcyBhIGNvbXBsZXRlCisJICBhbmQgYWNjdXJhdGUgQ0lTLiAgSW4gcHJhY3RpY2UsIGEgZHJpdmVyIHVzdWFsbHkgImtub3dzIiBtb3N0IG9mCisJICB0aGVzZSB0aGluZ3Mgd2l0aG91dCBjb25zdWx0aW5nIHRoZSBDSVMsIGFuZCBtb3N0IGNsaWVudCBkcml2ZXJzCisJICB3aWxsIG9ubHkgdXNlIHRoZSBDSVMgdG8gZmlsbCBpbiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGRldGFpbHMuCisJKi8KKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKKwlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJd2hpbGUgKDEpIHsKKwkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCBkZmx0ID0geyAwIH07CisJCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZyA9ICYocGFyc2UuY2Z0YWJsZV9lbnRyeSk7CisJCWlmIChwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpICE9IDAgfHwKKwkJCQlwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkgIT0gMCkKKwkJCWdvdG8gbmV4dF9lbnRyeTsKKwkJCisJCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfREVGQVVMVCkgZGZsdCA9ICpjZmc7CisJCWlmIChjZmctPmluZGV4ID09IDApIGdvdG8gbmV4dF9lbnRyeTsKKwkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXg7CisJCQorCQkvKiBEb2VzIHRoaXMgY2FyZCBuZWVkIGF1ZGlvIG91dHB1dD8gKi8KKwkJaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9BVURJTykgeworCQkJbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX1NQS1I7CisJCQlsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOworCQl9CisJCQorCQkvKiBVc2UgcG93ZXIgc2V0dGluZ3MgZm9yIFZjYyBhbmQgVnBwIGlmIHByZXNlbnQgKi8KKwkJLyogIE5vdGUgdGhhdCB0aGUgQ0lTIHZhbHVlcyBuZWVkIHRvIGJlIHJlc2NhbGVkICovCisJCWlmIChjZmctPnZjYy5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJCWxpbmstPmNvbmYuVmNjID0gY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwOworCQllbHNlIGlmIChkZmx0LnZjYy5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJCWxpbmstPmNvbmYuVmNjID0gZGZsdC52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwOworCQkKKwkJaWYgKGNmZy0+dnBwMS5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJCWxpbmstPmNvbmYuVnBwMSA9IGxpbmstPmNvbmYuVnBwMiA9CisJCQkJY2ZnLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMDsKKwkJZWxzZSBpZiAoZGZsdC52cHAxLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKQorCQkJbGluay0+Y29uZi5WcHAxID0gbGluay0+Y29uZi5WcHAyID0KKwkJCQlkZmx0LnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwOworCQkKKwkJLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQ/ICovCisJCWlmIChjZmctPmlycS5JUlFJbmZvMSB8fCBkZmx0LmlycS5JUlFJbmZvMSkKKwkJCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7CisJCQorCQkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KKwkJbGluay0+aW8uTnVtUG9ydHMxID0gbGluay0+aW8uTnVtUG9ydHMyID0gMDsKKwkJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC5pby5ud2luID4gMCkpIHsKKwkJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC5pbzsKKwkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisJCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCisJCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisJCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQorCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7CisJCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKKwkJCWlmIChpby0+bndpbiA+IDEpIHsKKwkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IGxpbmstPmlvLkF0dHJpYnV0ZXMxOworCQkJCWxpbmstPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKKwkJCQlsaW5rLT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKKwkJCX0KKwkJfQorCQkKKwkJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KKwkJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKSAhPSAwKQorCQkJZ290byBuZXh0X2VudHJ5OworCQkKKwkJLyoKKwkJICBOb3cgc2V0IHVwIGEgY29tbW9uIG1lbW9yeSB3aW5kb3csIGlmIG5lZWRlZC4gIFRoZXJlIGlzIHJvb20KKwkJICBpbiB0aGUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgZm9yIG9uZSBtZW1vcnkgd2luZG93IGhhbmRsZSwKKwkJICBidXQgaWYgdGhlIGJhc2UgYWRkcmVzc2VzIG5lZWQgdG8gYmUgc2F2ZWQsIG9yIGlmIG11bHRpcGxlCisJCSAgd2luZG93cyBhcmUgbmVlZGVkLCB0aGUgaW5mbyBzaG91bGQgZ28gaW4gdGhlIHByaXZhdGUgZGF0YQorCQkgIHN0cnVjdHVyZSBmb3IgdGhpcyBkZXZpY2UuCisJCSAgCisJCSAgTm90ZSB0aGF0IHRoZSBtZW1vcnkgd2luZG93IGJhc2UgaXMgYSBwaHlzaWNhbCBhZGRyZXNzLCBhbmQKKwkJICBuZWVkcyB0byBiZSBtYXBwZWQgdG8gdmlydHVhbCBzcGFjZSB3aXRoIGlvcmVtYXAoKSBiZWZvcmUgaXQKKwkJICBpcyB1c2VkLgorCQkqLworCQlpZiAoKGNmZy0+bWVtLm53aW4gPiAwKSB8fCAoZGZsdC5tZW0ubndpbiA+IDApKSB7CisJCQljaXN0cGxfbWVtX3QgKm1lbSA9CisJCQkJKGNmZy0+bWVtLm53aW4pID8gJmNmZy0+bWVtIDogJmRmbHQubWVtOworCQkJcmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF8xNnxXSU5fTUVNT1JZX1RZUEVfQ007CisJCQlyZXEuQmFzZSA9IG1lbS0+d2luWzBdLmhvc3RfYWRkcjsKKwkJCXJlcS5TaXplID0gbWVtLT53aW5bMF0ubGVuOworCQkJcmVxLkFjY2Vzc1NwZWVkID0gMDsKKwkJCWlmIChwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmstPmhhbmRsZSwgJnJlcSwgJmxpbmstPndpbikgIT0gMCkKKwkJCQlnb3RvIG5leHRfZW50cnk7CisJCQltYXAuUGFnZSA9IDA7IG1hcC5DYXJkT2Zmc2V0ID0gbWVtLT53aW5bMF0uY2FyZF9hZGRyOworCQkJaWYgKHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluay0+d2luLCAmbWFwKSAhPSAwKQorCQkJCWdvdG8gbmV4dF9lbnRyeTsKKwkJfQorCQkvKiBJZiB3ZSBnb3QgdGhpcyBmYXIsIHdlJ3JlIGNvb2whICovCisJCWJyZWFrOworCQkKKwluZXh0X2VudHJ5OgorCQlDU19DSEVDSyhHZXROZXh0VHVwbGUsIHBjbWNpYV9nZXRfbmV4dF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworCX0KKwkKKyAgICAvKgorICAgICAgQWxsb2NhdGUgYW4gaW50ZXJydXB0IGxpbmUuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhc3NpZ24gYQorICAgICAgaGFuZGxlciB0byB0aGUgaW50ZXJydXB0LCB1bmxlc3MgdGhlICdIYW5kbGVyJyBtZW1iZXIgb2YgdGhlCisgICAgICBpcnEgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLgorICAgICovCisJaWYgKGxpbmstPmNvbmYuQXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkKKwkJQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSkpOworCQorCS8qCisJICBUaGlzIGFjdHVhbGx5IGNvbmZpZ3VyZXMgdGhlIFBDTUNJQSBzb2NrZXQgLS0gc2V0dGluZyB1cAorCSAgdGhlIEkvTyB3aW5kb3dzIGFuZCB0aGUgaW50ZXJydXB0IG1hcHBpbmcsIGFuZCBwdXR0aW5nIHRoZQorCSAgY2FyZCBhbmQgaG9zdCBpbnRlcmZhY2UgaW50byAiTWVtb3J5IGFuZCBJTyIgbW9kZS4KKwkqLworCUNTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKwkoKGxvY2FsX2luZm9fdCopbGluay0+cHJpdiktPmV0aF9kZXYgPSAKKwkJaW5pdF9haXJvX2NhcmQoIGxpbmstPmlycS5Bc3NpZ25lZElSUSwKKwkJCQlsaW5rLT5pby5CYXNlUG9ydDEsIDEsICZoYW5kbGVfdG9fZGV2KGhhbmRsZSkgKTsKKwlpZiAoISgobG9jYWxfaW5mb190KilsaW5rLT5wcml2KS0+ZXRoX2RldikgZ290byBjc19mYWlsZWQ7CisJCisJLyoKKwkgIEF0IHRoaXMgcG9pbnQsIHRoZSBkZXZfbm9kZV90IHN0cnVjdHVyZShzKSBuZWVkIHRvIGJlCisJICBpbml0aWFsaXplZCBhbmQgYXJyYW5nZWQgaW4gYSBsaW5rZWQgbGlzdCBhdCBsaW5rLT5kZXYuCisJKi8KKwlzdHJjcHkoZGV2LT5ub2RlLmRldl9uYW1lLCAoKGxvY2FsX2luZm9fdCopbGluay0+cHJpdiktPmV0aF9kZXYtPm5hbWUgKTsKKwlkZXYtPm5vZGUubWFqb3IgPSBkZXYtPm5vZGUubWlub3IgPSAwOworCWxpbmstPmRldiA9ICZkZXYtPm5vZGU7CisJCisJLyogRmluYWxseSwgcmVwb3J0IHdoYXQgd2UndmUgZG9uZSAqLworCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbmRleCAweCUwMng6IFZjYyAlZC4lZCIsCisJICAgICAgIGRldi0+bm9kZS5kZXZfbmFtZSwgbGluay0+Y29uZi5Db25maWdJbmRleCwKKwkgICAgICAgbGluay0+Y29uZi5WY2MvMTAsIGxpbmstPmNvbmYuVmNjJTEwKTsKKwlpZiAobGluay0+Y29uZi5WcHAxKQorCQlwcmludGsoIiwgVnBwICVkLiVkIiwgbGluay0+Y29uZi5WcHAxLzEwLCBsaW5rLT5jb25mLlZwcDElMTApOworCWlmIChsaW5rLT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpCisJCXByaW50aygiLCBpcnEgJWQiLCBsaW5rLT5pcnEuQXNzaWduZWRJUlEpOworCWlmIChsaW5rLT5pby5OdW1Qb3J0czEpCisJCXByaW50aygiLCBpbyAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQxLAorCQkgICAgICAgbGluay0+aW8uQmFzZVBvcnQxK2xpbmstPmlvLk51bVBvcnRzMS0xKTsKKwlpZiAobGluay0+aW8uTnVtUG9ydHMyKQorCQlwcmludGsoIiAmIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDIsCisJCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDIrbGluay0+aW8uTnVtUG9ydHMyLTEpOworCWlmIChsaW5rLT53aW4pCisJCXByaW50aygiLCBtZW0gMHglMDZseC0weCUwNmx4IiwgcmVxLkJhc2UsCisJCSAgICAgICByZXEuQmFzZStyZXEuU2l6ZS0xKTsKKwlwcmludGsoIlxuIik7CisJCisJbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUdfUEVORElORzsKKwlyZXR1cm47CisJCisgY3NfZmFpbGVkOgorCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworCWFpcm9fcmVsZWFzZShsaW5rKTsKKwkKK30gLyogYWlyb19jb25maWcgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgYWlyb19yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZQorICBkZXZpY2UsIGFuZCByZWxlYXNlIHRoZSBQQ01DSUEgY29uZmlndXJhdGlvbi4gIElmIHRoZSBkZXZpY2UgaXMKKyAgc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgYWlyb19yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspCit7CisJREVCVUcoMCwgImFpcm9fcmVsZWFzZSgweCVwKVxuIiwgbGluayk7CisJCisJLyogVW5saW5rIHRoZSBkZXZpY2UgY2hhaW4gKi8KKwlsaW5rLT5kZXYgPSBOVUxMOworCQorCS8qCisJICBJbiBhIG5vcm1hbCBkcml2ZXIsIGFkZGl0aW9uYWwgY29kZSBtYXkgYmUgbmVlZGVkIHRvIHJlbGVhc2UKKwkgIG90aGVyIGtlcm5lbCBkYXRhIHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV2aWNlLiAKKwkqLworCQorCS8qIERvbid0IGJvdGhlciBjaGVja2luZyB0byBzZWUgaWYgdGhlc2Ugc3VjY2VlZCBvciBub3QgKi8KKwlpZiAobGluay0+d2luKQorCQlwY21jaWFfcmVsZWFzZV93aW5kb3cobGluay0+d2luKTsKKwlwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJaWYgKGxpbmstPmlvLk51bVBvcnRzMSkKKwkJcGNtY2lhX3JlbGVhc2VfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pOworCWlmIChsaW5rLT5pcnEuQXNzaWduZWRJUlEpCisJCXBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiAgTW9zdGx5LCB0aGlzIHNjaGVkdWxlcyBvdGhlcgorICBzdHVmZiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuCisKKyAgV2hlbiBhIENBUkRfUkVNT1ZBTCBldmVudCBpcyByZWNlaXZlZCwgd2UgaW1tZWRpYXRlbHkgc2V0IGEKKyAgcHJpdmF0ZSBmbGFnIHRvIGJsb2NrIGZ1dHVyZSBhY2Nlc3NlcyB0byB0aGlzIGRldmljZS4gIEFsbCB0aGUKKyAgZnVuY3Rpb25zIHRoYXQgYWN0dWFsbHkgYWNjZXNzIHRoZSBkZXZpY2Ugc2hvdWxkIGNoZWNrIHRoaXMgZmxhZworICB0byBtYWtlIHN1cmUgdGhlIGNhcmQgaXMgc3RpbGwgcHJlc2VudC4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IGFpcm9fZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCit7CisJZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworCWxvY2FsX2luZm9fdCAqbG9jYWwgPSBsaW5rLT5wcml2OworCQorCURFQlVHKDEsICJhaXJvX2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKwkKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJCWxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJbmV0aWZfZGV2aWNlX2RldGFjaChsb2NhbC0+ZXRoX2Rldik7CisJCQlhaXJvX3JlbGVhc2UobGluayk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwkJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJCWFpcm9fY29uZmlnKGxpbmspOworCQlicmVhazsKKwljYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisJCWxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOworCQkvKiBGYWxsIHRocm91Z2guLi4gKi8KKwljYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQluZXRpZl9kZXZpY2VfZGV0YWNoKGxvY2FsLT5ldGhfZGV2KTsKKwkJCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwkJfQorCQlicmVhazsKKwljYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKwkJbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworCQkvKiBGYWxsIHRocm91Z2guLi4gKi8KKwljYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCXBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisJCQlyZXNldF9haXJvX2NhcmQobG9jYWwtPmV0aF9kZXYpOworCQkJbmV0aWZfZGV2aWNlX2F0dGFjaChsb2NhbC0+ZXRoX2Rldik7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfSAvKiBhaXJvX2V2ZW50ICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBhaXJvX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gImFpcm9fY3MiLAorCX0sCisJLmF0dGFjaAkJPSBhaXJvX2F0dGFjaCwKKwkuZGV0YWNoCQk9IGFpcm9fZGV0YWNoLAorfTsKKworc3RhdGljIGludCBhaXJvX2NzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmYWlyb19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBhaXJvX2NzX2NsZWFudXAodm9pZCkKK3sKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJmFpcm9fZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKKy8qCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAgICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBJbiBhZGRpdGlvbjoKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICAgIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgICAgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgICAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICAgIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAgIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICAgIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAgICBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAgICBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gICAgCisqLworCittb2R1bGVfaW5pdChhaXJvX2NzX2luaXQpOworbW9kdWxlX2V4aXQoYWlyb19jc19jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpcnBvcnQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpcnBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWRjMmExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlycG9ydC5jCkBAIC0wLDAgKzEsMzA0IEBACisvKiBhaXJwb3J0LmMKKyAqCisgKiBBIGRyaXZlciBmb3IgIkhlcm1lcyIgY2hpcHNldCBiYXNlZCBBcHBsZSBBaXJwb3J0IHdpcmVsZXNzCisgKiBjYXJkLgorICoKKyAqIENvcHlyaWdodCBub3RpY2UgJiByZWxlYXNlIG5vdGVzIGluIGZpbGUgb3Jpbm9jby5jCisgKiAKKyAqIE5vdGUgc3BlY2lmaWMgdG8gYWlycG9ydCBzdHViOgorICogCisgKiAgMC4wNSA6IGZpcnN0IHZlcnNpb24gb2YgdGhlIG5ldyBzcGxpdCBkcml2ZXIKKyAqICAwLjA2IDogZml4IHBvc3NpYmxlIGhhbmcgb24gcG93ZXJ1cCwgYWRkIHNsZWVwIHN1cHBvcnQKKyAqLworCisjZGVmaW5lIERSSVZFUl9OQU1FICJhaXJwb3J0IgorI2RlZmluZSBQRlggRFJJVkVSX05BTUUgIjogIgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wbWFjX2ZlYXR1cmUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgIm9yaW5vY28uaCIKKworI2RlZmluZSBBSVJQT1JUX0lPX0xFTgkoMHgxMDAwKQkvKiBvbmUgcGFnZSAqLworCitzdHJ1Y3QgYWlycG9ydCB7CisJc3RydWN0IG1hY2lvX2RldiAqbWRldjsKKwl2b2lkIF9faW9tZW0gKnZhZGRyOworCWludCBpcnFfcmVxdWVzdGVkOworCWludCBuZGV2X3JlZ2lzdGVyZWQ7Cit9OworCitzdGF0aWMgaW50CithaXJwb3J0X3N1c3BlbmQoc3RydWN0IG1hY2lvX2RldiAqbWRldiwgdTMyIHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoJm1kZXYtPm9mZGV2LmRldik7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBBaXJwb3J0IGVudGVyaW5nIHNsZWVwIG1vZGVcbiIsIGRldi0+bmFtZSk7CisKKwllcnIgPSBvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGh3X3VuYXZhaWxhYmxlIG9uIFBCT09LX1NMRUVQX05PV1xuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWVyciA9IF9fb3Jpbm9jb19kb3duKGRldik7CisJaWYgKGVycikKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFBCT09LX1NMRUVQX05PVzogRXJyb3IgJWQgZG93bmluZyBpbnRlcmZhY2VcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKwlwcml2LT5od191bmF2YWlsYWJsZSsrOworCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKwlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9BSVJQT1JUX0VOQUJMRSwgbWFjaW9fZ2V0X29mX25vZGUobWRldiksIDAsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2FpcnBvcnRfcmVzdW1lKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9nZXRfZHJ2ZGF0YSgmbWRldi0+b2ZkZXYuZGV2KTsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEFpcnBvcnQgd2FraW5nIHVwXG4iLCBkZXYtPm5hbWUpOworCisJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfQUlSUE9SVF9FTkFCTEUsIG1hY2lvX2dldF9vZl9ub2RlKG1kZXYpLCAwLCAxKTsKKwltc2xlZXAoMjAwKTsKKworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCisJZXJyID0gb3Jpbm9jb19yZWluaXRfZmlybXdhcmUoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHJlLWluaXRpYWxpemluZyBmaXJtd2FyZSBvbiBQQk9PS19XQUtFXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCisJcHJpdi0+aHdfdW5hdmFpbGFibGUtLTsKKworCWlmIChwcml2LT5vcGVuICYmICghIHByaXYtPmh3X3VuYXZhaWxhYmxlKSkgeworCQllcnIgPSBfX29yaW5vY29fdXAoZGV2KTsKKwkJaWYgKGVycikKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHJlc3RhcnRpbmcgY2FyZCBvbiBQQk9PS19XQUtFXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwl9CisKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CithaXJwb3J0X2RldGFjaChzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoJm1kZXYtPm9mZGV2LmRldik7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFpcnBvcnQgKmNhcmQgPSBwcml2LT5jYXJkOworCisJaWYgKGNhcmQtPm5kZXZfcmVnaXN0ZXJlZCkKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwljYXJkLT5uZGV2X3JlZ2lzdGVyZWQgPSAwOworCisJaWYgKGNhcmQtPmlycV9yZXF1ZXN0ZWQpCisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCWNhcmQtPmlycV9yZXF1ZXN0ZWQgPSAwOworCisJaWYgKGNhcmQtPnZhZGRyKQorCQlpb3VubWFwKGNhcmQtPnZhZGRyKTsKKwljYXJkLT52YWRkciA9IE5VTEw7CisKKwltYWNpb19yZWxlYXNlX3Jlc291cmNlKG1kZXYsIDApOworCisJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfQUlSUE9SVF9FTkFCTEUsIG1hY2lvX2dldF9vZl9ub2RlKG1kZXYpLCAwLCAwKTsKKwlzc2xlZXAoMSk7CisKKwltYWNpb19zZXRfZHJ2ZGF0YShtZGV2LCBOVUxMKTsKKwlmcmVlX29yaW5vY29kZXYoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFpcnBvcnRfaGFyZF9yZXNldChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQoreworCS8qIEl0IHdvdWxkIGJlIG5pY2UgdG8gcG93ZXIgY3ljbGUgdGhlIEFpcnBvcnQgZm9yIGEgcmVhbCBoYXJkCisJICogcmVzZXQsIGJ1dCBmb3Igc29tZSByZWFzb24gYWx0aG91Z2ggaXQgYXBwZWFycyB0bworCSAqIHJlLWluaXRpYWxpemUgcHJvcGVybHksIGl0IGZhbGxzIGluIGEgc2NyZWFtaW5nIGhlYXAKKwkgKiBzaG9ydGx5IGFmdGVyd2FyZHMuICovCisjaWYgMAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5uZGV2OworCXN0cnVjdCBhaXJwb3J0ICpjYXJkID0gcHJpdi0+Y2FyZDsKKworCS8qIFZpdGFsbHkgaW1wb3J0YW50LiAgSWYgd2UgZG9uJ3QgZG8gdGhpcyBpdCBzZWVtcyB3ZSBnZXQgYW4KKwkgKiBpbnRlcnJ1cHQgc29tZXdoZXJlIGR1cmluZyB0aGUgcG93ZXIgY3ljbGUsIHNpbmNlCisJICogaHdfdW5hdmFpbGFibGUgaXMgYWxyZWFkeSBzZXQgaXQgZG9lc24ndCBnZXQgQUNLZWQsIHdlIGdldAorCSAqIGludG8gYW4gaW50ZXJydXB0IGxvb3AgYW5kIHRoZSB0aGUgUE1VIGRlY2lkZXMgdG8gdHVybiB1cworCSAqIG9mZi4gKi8KKwlkaXNhYmxlX2lycShkZXYtPmlycSk7CisKKwlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9BSVJQT1JUX0VOQUJMRSwgbWFjaW9fZ2V0X29mX25vZGUoY2FyZC0+bWRldiksIDAsIDApOworCXNzbGVlcCgxKTsKKwlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9BSVJQT1JUX0VOQUJMRSwgbWFjaW9fZ2V0X29mX25vZGUoY2FyZC0+bWRldiksIDAsIDEpOworCXNzbGVlcCgxKTsKKworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCXNzbGVlcCgxKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2FpcnBvcnRfYXR0YWNoKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2gpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBhaXJwb3J0ICpjYXJkOworCXVuc2lnbmVkIGxvbmcgcGh5c19hZGRyOworCWhlcm1lc190ICpodzsKKworCWlmIChtYWNpb19yZXNvdXJjZV9jb3VudChtZGV2KSA8IDEgfHwgbWFjaW9faXJxX2NvdW50KG1kZXYpIDwgMSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJXcm9uZyBpbnRlcnJ1cHQvYWRkcmVzc2VzIGluIE9GIHRyZWVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgcHJpdmF0ZSBkZXZpY2Utc3BlY2lmaWMgZGF0YSAqLworCWRldiA9IGFsbG9jX29yaW5vY29kZXYoc2l6ZW9mKCpjYXJkKSwgYWlycG9ydF9oYXJkX3Jlc2V0KTsKKwlpZiAoISBkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWNhcmQgPSBwcml2LT5jYXJkOworCisJaHcgPSAmcHJpdi0+aHc7CisJY2FyZC0+bWRldiA9IG1kZXY7CisKKwlpZiAobWFjaW9fcmVxdWVzdF9yZXNvdXJjZShtZGV2LCAwLCAiYWlycG9ydCIpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbid0IHJlcXVlc3QgSU8gcmVzb3VyY2UgIVxuIik7CisJCWZyZWVfb3Jpbm9jb2RldihkZXYpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZtZGV2LT5vZmRldi5kZXYpOworCisJbWFjaW9fc2V0X2RydmRhdGEobWRldiwgZGV2KTsKKworCS8qIFNldHVwIGludGVycnVwdHMgJiBiYXNlIGFkZHJlc3MgKi8KKwlkZXYtPmlycSA9IG1hY2lvX2lycShtZGV2LCAwKTsKKwlwaHlzX2FkZHIgPSBtYWNpb19yZXNvdXJjZV9zdGFydChtZGV2LCAwKTsgIC8qIFBoeXNpY2FsIGFkZHJlc3MgKi8KKwlwcmludGsoS0VSTl9ERUJVRyBQRlggIlBoeXNpY2FsIGFkZHJlc3MgJWx4XG4iLCBwaHlzX2FkZHIpOworCWRldi0+YmFzZV9hZGRyID0gcGh5c19hZGRyOworCWNhcmQtPnZhZGRyID0gaW9yZW1hcChwaHlzX2FkZHIsIEFJUlBPUlRfSU9fTEVOKTsKKwlpZiAoIWNhcmQtPnZhZGRyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImlvcmVtYXAoKSBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwloZXJtZXNfc3RydWN0X2luaXQoaHcsIGNhcmQtPnZhZGRyLCBIRVJNRVNfMTZCSVRfUkVHU1BBQ0lORyk7CisJCQorCS8qIFBvd2VyIHVwIGNhcmQgKi8KKwlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9BSVJQT1JUX0VOQUJMRSwgbWFjaW9fZ2V0X29mX25vZGUobWRldiksIDAsIDEpOworCXNzbGVlcCgxKTsKKworCS8qIFJlc2V0IGl0IGJlZm9yZSB3ZSBnZXQgdGhlIGludGVycnVwdCAqLworCWhlcm1lc19pbml0KGh3KTsKKworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgb3Jpbm9jb19pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZG4ndCBnZXQgSVJRICVkXG4iLCBkZXYtPmlycSk7CisJCWdvdG8gZmFpbGVkOworCX0KKwljYXJkLT5pcnFfcmVxdWVzdGVkID0gMTsKKworCS8qIFRlbGwgdGhlIHN0YWNrIHdlIGV4aXN0ICovCisJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiQ2FyZCByZWdpc3RlcmVkIGZvciBpbnRlcmZhY2UgJXNcbiIsIGRldi0+bmFtZSk7CisJY2FyZC0+bmRldl9yZWdpc3RlcmVkID0gMTsKKwlyZXR1cm4gMDsKKyBmYWlsZWQ6CisJYWlycG9ydF9kZXRhY2gobWRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CQkJCS8qIGFpcnBvcnRfYXR0YWNoICovCisKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPSBEUklWRVJfTkFNRSAiICIgRFJJVkVSX1ZFUlNJT04KKwkiIChCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+KSI7CitNT0RVTEVfQVVUSE9SKCJCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgdGhlIEFwcGxlIEFpcnBvcnQgd2lyZWxlc3MgY2FyZC4iKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIE1QTC9HUEwiKTsKKworc3RhdGljIHN0cnVjdCBvZl9tYXRjaCBhaXJwb3J0X21hdGNoW10gPSAKK3sKKwl7CisJLm5hbWUgCQk9ICJyYWRpbyIsCisJLnR5cGUJCT0gT0ZfQU5ZX01BVENILAorCS5jb21wYXRpYmxlCT0gT0ZfQU5ZX01BVENICisJfSwKKwl7fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWFjaW9fZHJpdmVyIGFpcnBvcnRfZHJpdmVyID0gCit7CisJLm5hbWUgCQk9IERSSVZFUl9OQU1FLAorCS5tYXRjaF90YWJsZQk9IGFpcnBvcnRfbWF0Y2gsCisJLnByb2JlCQk9IGFpcnBvcnRfYXR0YWNoLAorCS5yZW1vdmUJCT0gYWlycG9ydF9kZXRhY2gsCisJLnN1c3BlbmQJPSBhaXJwb3J0X3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhaXJwb3J0X3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0Citpbml0X2FpcnBvcnQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIHZlcnNpb24pOworCisJcmV0dXJuIG1hY2lvX3JlZ2lzdGVyX2RyaXZlcigmYWlycG9ydF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2V4aXRfYWlycG9ydCh2b2lkKQoreworCXJldHVybiBtYWNpb191bnJlZ2lzdGVyX2RyaXZlcigmYWlycG9ydF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbml0X2FpcnBvcnQpOworbW9kdWxlX2V4aXQoZXhpdF9haXJwb3J0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FybGFuLW1haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FybGFuLW1haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjMwNGM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FybGFuLW1haW4uYwpAQCAtMCwwICsxLDE4OTYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3IEN1bGxlbiBKZW5uaW5ncworICogIENvcHlyaWdodCAoQykgMTk5OCBFbG1lciBKb2FuZGl1LCBlbG1lckB5bGVudXJtZS5lZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMKKyAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBBcmxhbiA2NTUgY2FyZCBtYWRlIGJ5IEFpcm9uZXQKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSAiYXJsYW4uaCIKKworI2lmIEJJVFNfUEVSX0xPTkcgIT0gMzIKKyMgIGVycm9yIEZJWE1FOiB0aGlzIGRyaXZlciByZXF1aXJlcyBhIDMyLWJpdCBwbGF0Zm9ybQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyICphcmxhbl92ZXJzaW9uID0gIkMuSmVubmlncyA5NyAmIEVsbWVyLkpvYW5kaUB1dC5lZSAgT2N0Jzk4LCBodHRwOi8vd3d3LnlsZW51cm1lLmVlL35lbG1lci82NTUvIjsKKworc3RydWN0IG5ldF9kZXZpY2UgKmFybGFuX2RldmljZVtNQVhfQVJMQU5TXTsKKworc3RhdGljIGludCBTSUQgPSBTSURVTktOT1dOOworc3RhdGljIGludCByYWRpb05vZGVJZCA9IHJhZGlvTm9kZUlkVU5LTk9XTjsKK3N0YXRpYyBjaGFyIGVuY3J5cHRpb25LZXlbMTJdID0geydhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnfTsKK2ludCBhcmxhbl9kZWJ1ZyA9IGRlYnVnVU5LTk9XTjsKK3N0YXRpYyBpbnQgc3ByZWFkaW5nQ29kZSA9IHNwcmVhZGluZ0NvZGVVTktOT1dOOworc3RhdGljIGludCBjaGFubmVsTnVtYmVyID0gY2hhbm5lbE51bWJlclVOS05PV047CitzdGF0aWMgaW50IGNoYW5uZWxTZXQgPSBjaGFubmVsU2V0VU5LTk9XTjsKK3N0YXRpYyBpbnQgc3lzdGVtSWQgPSBzeXN0ZW1JZFVOS05PV047CitzdGF0aWMgaW50IHJlZ2lzdHJhdGlvbk1vZGUgPSByZWdpc3RyYXRpb25Nb2RlVU5LTk9XTjsKK3N0YXRpYyBpbnQga2V5U3RhcnQ7CitzdGF0aWMgaW50IHR4X2RlbGF5X21zOworc3RhdGljIGludCByZXRyaWVzID0gNTsKK3N0YXRpYyBpbnQgdHhfcXVldWVfbGVuID0gMTsKK3N0YXRpYyBpbnQgYXJsYW5fRUVQUk9NX2JhZDsKKworI2lmZGVmIEFSTEFOX0RFQlVHR0lORworCitzdGF0aWMgaW50IGFybGFuX2VudHJ5X2RlYnVnOworc3RhdGljIGludCBhcmxhbl9leGl0X2RlYnVnOworc3RhdGljIGludCB0ZXN0TWVtb3J5ID0gdGVzdE1lbW9yeVVOS05PV047CitzdGF0aWMgaW50IGlycSA9IGlycVVOS05PV047CitzdGF0aWMgaW50IHR4U2NyYW1ibGVkID0gMTsKK3N0YXRpYyBpbnQgbWRlYnVnOworCittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1kZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh0ZXN0TWVtb3J5LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGFybGFuX2VudHJ5X2RlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGFybGFuX2V4aXRfZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0odHhTY3JhbWJsZWQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIih1bnVzZWQpIik7CitNT0RVTEVfUEFSTV9ERVNDKHRlc3RNZW1vcnksICIodW51c2VkKSIpOworTU9EVUxFX1BBUk1fREVTQyhtZGVidWcsICJBcmxhbiBtdWx0aWNhc3QgZGVidWdnaW5nICgwLTEpIik7CisjZW5kaWYKKworbW9kdWxlX3BhcmFtKGFybGFuX2RlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHNwcmVhZGluZ0NvZGUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY2hhbm5lbE51bWJlciwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjaGFubmVsU2V0LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHN5c3RlbUlkLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJlZ2lzdHJhdGlvbk1vZGUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocmFkaW9Ob2RlSWQsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oU0lELCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGtleVN0YXJ0LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHR4X2RlbGF5X21zLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJldHJpZXMsIGludCwgMCk7Cittb2R1bGVfcGFyYW0odHhfcXVldWVfbGVuLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGFybGFuX0VFUFJPTV9iYWQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGFybGFuX2RlYnVnLCAiQXJsYW4gZGVidWcgZW5hYmxlICgwLTEpIik7CitNT0RVTEVfUEFSTV9ERVNDKHJldHJpZXMsICJBcmxhbiBtYXhpbXVtIHBhY2tldCByZXRyYW5zbWlzaW9ucyIpOworI2lmZGVmIEFSTEFOX0VOVFJZX0VYSVRfREVCVUdHSU5HCitNT0RVTEVfUEFSTV9ERVNDKGFybGFuX2VudHJ5X2RlYnVnLCAiQXJsYW4gZHJpdmVyIGZ1bmN0aW9uIGVudHJ5IGRlYnVnZ2luZyIpOworTU9EVUxFX1BBUk1fREVTQyhhcmxhbl9leGl0X2RlYnVnLCAiQXJsYW4gZHJpdmVyIGZ1bmN0aW9uIGV4aXQgZGVidWdnaW5nIik7CitNT0RVTEVfUEFSTV9ERVNDKGFybGFuX2VudHJ5X2FuZF9leGl0X2RlYnVnLCAiQXJsYW4gZHJpdmVyIGZ1bmN0aW9uIGVudHJ5IGFuZCBleGl0IGRlYnVnZ2luZyIpOworI2Vsc2UKK01PRFVMRV9QQVJNX0RFU0MoYXJsYW5fZW50cnlfZGVidWcsICIoaWdub3JlZCkiKTsKK01PRFVMRV9QQVJNX0RFU0MoYXJsYW5fZXhpdF9kZWJ1ZywgIihpZ25vcmVkKSIpOworTU9EVUxFX1BBUk1fREVTQyhhcmxhbl9lbnRyeV9hbmRfZXhpdF9kZWJ1ZywgIihpZ25vcmVkKSIpOworI2VuZGlmCisKK3N0cnVjdCBhcmxhbl9jb25mX3N0cnUgYXJsYW5fY29uZltNQVhfQVJMQU5TXTsKK3N0YXRpYyBpbnQgYXJsYW5zX2ZvdW5kOworCitzdGF0aWMgIGludCAJYXJsYW5fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyAgaW50IAlhcmxhbl90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyAgaXJxcmV0dXJuX3QgYXJsYW5faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljICBpbnQgCWFybGFuX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqCisJCWFybGFuX3N0YXRpc3RpY3MJCShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyAgdm9pZCAJYXJsYW5fc2V0X211bHRpY2FzdAkJKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljICBpbnQgCWFybGFuX2h3X3R4CQkJKHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCApOworc3RhdGljICBpbnQJYXJsYW5faHdfY29uZmlnCQkJKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KTsKK3N0YXRpYyAgdm9pZCAJYXJsYW5fdHhfZG9uZV9pbnRlcnJ1cHQJCShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgaW50IHN0YXR1cyk7CitzdGF0aWMgIHZvaWQJYXJsYW5fcnhfaW50ZXJydXB0CQkoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIHVfY2hhciByeFN0YXR1cywgdV9zaG9ydCwgdV9zaG9ydCk7CitzdGF0aWMgIHZvaWQJYXJsYW5fcHJvY2Vzc19pbnRlcnJ1cHQJCShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldik7CitzdGF0aWMJdm9pZAlhcmxhbl90eF90aW1lb3V0CQkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBpbmxpbmUgbG9uZyB1czJ0aWNrcyhpbnQgdXMpCit7CisJcmV0dXJuIHVzICogKDEwMDAwMDAgLyBIWik7Cit9CisKKworI2lmZGVmIEFSTEFOX0VOVFJZX0VYSVRfREVCVUdHSU5HCisjZGVmaW5lIEFSTEFOX0RFQlVHX0VOVFJZKG5hbWUpIFwKKwl7XAorCXN0cnVjdCB0aW1ldmFsIHRpbWV2O1wKKwlkb19nZXR0aW1lb2ZkYXkoJnRpbWV2KTtcCisJCWlmIChhcmxhbl9lbnRyeV9kZWJ1ZyB8fCBhcmxhbl9lbnRyeV9hbmRfZXhpdF9kZWJ1ZylcCisJCQlwcmludGsoIi0tLT4+PiIgbmFtZSAiICVsZCAiICJcbiIsKChsb25nIGludCkgdGltZXYudHZfc2VjICogMTAwMDAwMCArIHRpbWV2LnR2X3VzZWMpKTtcCisJfQorI2RlZmluZSBBUkxBTl9ERUJVR19FWElUKG5hbWUpIFwKKwl7XAorCXN0cnVjdCB0aW1ldmFsIHRpbWV2O1wKKwlkb19nZXR0aW1lb2ZkYXkoJnRpbWV2KTtcCisJCWlmIChhcmxhbl9leGl0X2RlYnVnIHx8IGFybGFuX2VudHJ5X2FuZF9leGl0X2RlYnVnKVwKKwkJCXByaW50aygiPDw8LS0tIiBuYW1lICIgJWxkICIgIlxuIiwoKGxvbmcgaW50KSB0aW1ldi50dl9zZWMgKiAxMDAwMDAwICsgdGltZXYudHZfdXNlYykgKTtcCisJfQorI2Vsc2UKKyNkZWZpbmUgQVJMQU5fREVCVUdfRU5UUlkobmFtZSkKKyNkZWZpbmUgQVJMQU5fREVCVUdfRVhJVChuYW1lKQorI2VuZGlmCisKKworI2RlZmluZSBhcmxhbl9pbnRlcnJ1cHRfYWNrKGRldilcCisgICAgICAgIGNsZWFyQ2xlYXJJbnRlcnJ1cHQoZGV2KTtcCisgICAgICAgIHNldENsZWFySW50ZXJydXB0KGRldik7CisKK3N0YXRpYyBpbmxpbmUgaW50IGFybGFuX2Ryb3BfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwlpZiAocHJpdi0+Q29uZi0+dHhfZGVsYXlfbXMpCisJeworCQlwcml2LT50eF9kb25lX2RlbGF5ZWQgPSBqaWZmaWVzICsgcHJpdi0+Q29uZi0+dHhfZGVsYXlfbXMgKiBIWiAvIDEwMDAgKyAxOworCX0KKwllbHNlCisJeworCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9UWDsKKwkJVFhIRUFEKGRldikub2Zmc2V0ID0gMDsKKwkJVFhUQUlMKGRldikub2Zmc2V0ID0gMDsKKwkJcHJpdi0+dHhMYXN0ID0gMDsKKwkJcHJpdi0+YmFkID0gMDsKKwkJaWYgKCFwcml2LT51bmRlcl9yZXNldCAmJiAhcHJpdi0+dW5kZXJfY29uZmlnKQorCQkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKworaW50IGFybGFuX2NvbW1hbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvbW1hbmRfcCkKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKwlzdHJ1Y3QgYXJsYW5fY29uZl9zdHJ1ICpjb25mID0gcHJpdi0+Q29uZjsKKwlpbnQgdWRlbGF5ZWQgPSAwOworCWludCBpID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX2NvbW1hbmQiKTsKKworCWlmIChwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwpCisJCXByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA9IDE7CisKKwlpZiAoYXJsYW5fZGVidWcgJiBBUkxBTl9ERUJVR19DSEFJTl9MT0NLUykKKwkJcHJpbnRrKEtFUk5fREVCVUcgImFybGFuX2NvbW1hbmQsICVseCBjb21tYW5kQnl0ZSAleCB3YWl0aW5nICVseCBpbmNvbWluZyAleCBcbiIsCisJCWppZmZpZXMsIFJFQURTSE1CKGFybGFuLT5jb21tYW5kQnl0ZSksCisJCSAgICAgICBwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzaywgY29tbWFuZF9wKTsKKworCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrIHw9IGNvbW1hbmRfcDsKKworCWlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfUkVTRVQpCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHByaXYtPmxhc3RSZXNldCArIDUgKiBIWikpCisJCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9SRVNFVDsKKworCWlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfSU5UX0FDSykKKwl7CisJCWFybGFuX2ludGVycnVwdF9hY2soZGV2KTsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfSU5UX0FDSzsKKwl9CisJaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9JTlRfRU5BQkxFKQorCXsKKwkJc2V0SW50ZXJydXB0RW5hYmxlKGRldik7CisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX0lOVF9FTkFCTEU7CisJfQorCisJLyogQ2FyZCBhY2Nlc3Mgc2VyaWFsaXppbmcgbG9jayAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayBjYXJkcyBzdGF0dXMgYW5kIHdhaXRpbmcgKi8KKworCWlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIChBUkxBTl9DT01NQU5EX0xPTkdfV0FJVF9OT1cgfCBBUkxBTl9DT01NQU5EX1dBSVRfTk9XKSkKKwl7CisJCXdoaWxlIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIChBUkxBTl9DT01NQU5EX0xPTkdfV0FJVF9OT1cgfCBBUkxBTl9DT01NQU5EX1dBSVRfTk9XKSkKKwkJeworCQkJaWYgKFJFQURTSE1CKGFybGFuLT5yZXNldEZsYWcpIHx8CisJCQkJUkVBRFNITUIoYXJsYW4tPmNvbW1hbmRCeXRlKSkJLyogfHwgCisJCQkJCQkJCSAgIChyZWFkQ29udHJvbFJlZ2lzdGVyKGRldikgJiBBUkxBTl9BQ0NFU1MpKQorCQkJCQkJCQkgKi8KKwkJCQl1ZGVsYXkoNDApOworCQkJZWxzZQorCQkJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH4oQVJMQU5fQ09NTUFORF9MT05HX1dBSVRfTk9XIHwgQVJMQU5fQ09NTUFORF9XQUlUX05PVyk7CisKKwkJCXVkZWxheWVkKys7CisKKwkJCWlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfTE9OR19XQUlUX05PVykKKwkJCXsKKwkJCQlpZiAodWRlbGF5ZWQgKiA0MCA+IDEwMDAwMDApCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzIGxvbmcgd2FpdCB0b28gbG9uZyBcbiIsIGRldi0+bmFtZSk7CisJCQkJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrIHw9IEFSTEFOX0NPTU1BTkRfUkVTRVQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9XQUlUX05PVykKKwkJCXsKKwkJCQlpZiAodWRlbGF5ZWQgKiA0MCA+IDEwMDApCisJCQkJeworCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzIHNob3J0IHdhaXQgdG9vIGxvbmcgXG4iLCBkZXYtPm5hbWUpOworCQkJCQlnb3RvIGJhZF9lbmQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCWkgPSAwOworCQl3aGlsZSAoKFJFQURTSE1CKGFybGFuLT5yZXNldEZsYWcpIHx8CisJCQlSRUFEU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUpKSAmJgorCQkJY29uZi0+cHJlX0NvbW1hbmRfV2FpdCA+IChpKyspICogMTApCisJCQl1ZGVsYXkoMTApOworCisKKwkJaWYgKChSRUFEU0hNQihhcmxhbi0+cmVzZXRGbGFnKSB8fAorCQkJUkVBRFNITUIoYXJsYW4tPmNvbW1hbmRCeXRlKSkgJiYKKwkJCSEocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX1JFU0VUKSkKKwkJeworCQkJZ290byBjYXJkX2J1c3lfZW5kOworCQl9CisJfQorCWlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfUkVTRVQpCisJCXByaXYtPnVuZGVyX3Jlc2V0ID0gMTsKKwlpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX0NPTkYpCisJCXByaXYtPnVuZGVyX2NvbmZpZyA9IDE7CisKKwkvKiBJc3N1aW5nIGNvbW1hbmQgKi8KKwlhcmxhbl9sb2NrX2NhcmRfYWNjZXNzKGRldik7CisJaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9QT1dFUlVQKQorCXsKKwkvLyAgICAgaWYgKHJlYWRDb250cm9sUmVnaXN0ZXIoZGV2KSAmIChBUkxBTl9BQ0NFU1MgJiYgQVJMQU5fUE9XRVIpKQorCQlzZXRQb3dlck9uKGRldik7CisJCWFybGFuX2ludGVycnVwdF9sYW5jcHUoZGV2KTsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfUE9XRVJVUDsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgfD0gQVJMQU5fQ09NTUFORF9SRVNFVDsKKwkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gSFogLyAxMDsKKwl9CisJZWxzZSBpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX0FDVElWQVRFKQorCXsKKwkJV1JJVEVTSE1CKGFybGFuLT5jb21tYW5kQnl0ZSwgQVJMQU5fQ09NX0FDVElWQVRFKTsKKwkJYXJsYW5faW50ZXJydXB0X2xhbmNwdShkZXYpOworCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9BQ1RJVkFURTsKKwkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gSFogLyAxMDsKKwl9CisJZWxzZSBpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX1JYX0FCT1JUKQorCXsKKwkJaWYgKHByaXYtPnJ4X2NvbW1hbmRfZ2l2ZW4pCisJCXsKKwkJCVdSSVRFU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUsIEFSTEFOX0NPTV9SWF9BQk9SVCk7CisJCQlhcmxhbl9pbnRlcnJ1cHRfbGFuY3B1KGRldik7CisJCQlwcml2LT5yeF9jb21tYW5kX2dpdmVuID0gMDsKKwkJfQorCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9SWF9BQk9SVDsKKwkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gMTsKKwl9CisJZWxzZSBpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX1RYX0FCT1JUKQorCXsKKwkJaWYgKHByaXYtPnR4X2NvbW1hbmRfZ2l2ZW4pCisJCXsKKwkJCVdSSVRFU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUsIEFSTEFOX0NPTV9UWF9BQk9SVCk7CisJCQlhcmxhbl9pbnRlcnJ1cHRfbGFuY3B1KGRldik7CisJCQlwcml2LT50eF9jb21tYW5kX2dpdmVuID0gMDsKKwkJfQorCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9UWF9BQk9SVDsKKwkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gMTsKKwl9CisJZWxzZSBpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX1JFU0VUKQorCXsKKwkJcHJpdi0+dW5kZXJfcmVzZXQ9MTsKKwkJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworCQlhcmxhbl9kcm9wX3R4KGRldik7CisJCWlmIChwcml2LT50eF9jb21tYW5kX2dpdmVuIHx8IHByaXYtPnJ4X2NvbW1hbmRfZ2l2ZW4pCisJCXsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJlc2V0IHVuZGVyIHR4IG9yIHJ4IGNvbW1hbmQgXG4iLCBkZXYtPm5hbWUpOworCQl9CisJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisJCWlmIChhcmxhbl9kZWJ1ZyAmIEFSTEFOX0RFQlVHX1JFU0VUKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRG9pbmcgY2hpcCByZXNldFxuIiwgZGV2LT5uYW1lKTsKKwkJcHJpdi0+bGFzdFJlc2V0ID0gamlmZmllczsKKwkJV1JJVEVTSE0oYXJsYW4tPmNvbW1hbmRCeXRlLCAwLCB1X2NoYXIpOworCQkvKiBob2xkIGNhcmQgaW4gcmVzZXQgc3RhdGUgKi8KKwkJc2V0SGFyZHdhcmVSZXNldChkZXYpOworCQkvKiBzZXQgcmVzZXQgZmxhZyBhbmQgdGhlbiByZWxlYXNlIHJlc2V0ICovCisJCVdSSVRFU0hNKGFybGFuLT5yZXNldEZsYWcsIDB4ZmYsIHVfY2hhcik7CisJCWNsZWFyQ2hhbm5lbEF0dGVudGlvbihkZXYpOworCQljbGVhckhhcmR3YXJlUmVzZXQoZGV2KTsKKwkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gSFogLyA0OworCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9SRVNFVDsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgfD0gQVJMQU5fQ09NTUFORF9JTlRfUkFDSzsKKy8vCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayB8PSBBUkxBTl9DT01NQU5EX0lOVF9SRU5BQkxFOyAKKy8vCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayB8PSBBUkxBTl9DT01NQU5EX1JYOworCX0KKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfSU5UX1JBQ0spCisJeworCQljbGVhckhhcmR3YXJlUmVzZXQoZGV2KTsKKwkJY2xlYXJDbGVhckludGVycnVwdChkZXYpOworCQlzZXRDbGVhckludGVycnVwdChkZXYpOworCQlzZXRJbnRlcnJ1cHRFbmFibGUoZGV2KTsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfSU5UX1JBQ0s7CisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrIHw9IEFSTEFOX0NPTU1BTkRfQ09ORjsKKwkJcHJpdi0+dW5kZXJfY29uZmlnID0gMTsKKwkJcHJpdi0+dW5kZXJfcmVzZXQgPSAwOworCX0KKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfSU5UX1JFTkFCTEUpCisJeworCQlzZXRJbnRlcnJ1cHRFbmFibGUoZGV2KTsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfSU5UX1JFTkFCTEU7CisJfQorCWVsc2UgaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9DT05GKQorCXsKKwkJaWYgKHByaXYtPnR4X2NvbW1hbmRfZ2l2ZW4gfHwgcHJpdi0+cnhfY29tbWFuZF9naXZlbikKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogUmVzZXQgdW5kZXIgdHggb3IgcnggY29tbWFuZCBcbiIsIGRldi0+bmFtZSk7CisJCX0KKwkJYXJsYW5fZHJvcF90eChkZXYpOworCQlzZXRJbnRlcnJ1cHRFbmFibGUoZGV2KTsKKwkJYXJsYW5faHdfY29uZmlnKGRldik7CisJCWFybGFuX2ludGVycnVwdF9sYW5jcHUoZGV2KTsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfQ09ORjsKKwkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gSFogLyAxMDsKKy8vCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayB8PSBBUkxBTl9DT01NQU5EX0lOVF9SQUNLOyAgIAorLy8JCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrIHw9IEFSTEFOX0NPTU1BTkRfSU5UX0VOQUJMRTsgCisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrIHw9IEFSTEFOX0NPTU1BTkRfQ09ORl9XQUlUOworCX0KKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfQ09ORl9XQUlUKQorCXsKKwkJaWYgKFJFQURTSE1CKGFybGFuLT5jb25maWd1cmVkU3RhdHVzRmxhZykgIT0gMCAmJgorCQkJUkVBRFNITUIoYXJsYW4tPmRpYWdub3N0aWNJbmZvKSA9PSAweGZmKQorCQl7CisJCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9DT05GX1dBSVQ7CisJCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayB8PSBBUkxBTl9DT01NQU5EX1JYOworCQkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgfD0gQVJMQU5fQ09NTUFORF9UQlVTWV9DTEVBUjsKKwkJCXByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA9IEhaIC8gMTA7CisJCQlwcml2LT50eF9jb21tYW5kX2dpdmVuID0gMDsKKwkJCXByaXYtPnVuZGVyX2NvbmZpZyA9IDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPSAxOworCQkJaWYgKGFybGFuX2RlYnVnICYgQVJMQU5fREVCVUdfVElNSU5HKQorCQkJCXByaW50ayhLRVJOX0VSUiAiY29uZmlndXJlIGRlbGF5ZWQgXG4iKTsKKwkJfQorCX0KKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfUlgpCisJeworCQlpZiAoIXJlZ2lzdHJhdGlvbkJhZChkZXYpKQorCQl7CisJCQlzZXRJbnRlcnJ1cHRFbmFibGUoZGV2KTsKKwkJCW1lbXNldF9pbyhhcmxhbi0+Y29tbWFuZFBhcmFtZXRlciwgMCwgMHhmKTsKKwkJCVdSSVRFU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUsIEFSTEFOX0NPTV9JTlQgfCBBUkxBTl9DT01fUlhfRU5BQkxFKTsKKwkJCVdSSVRFU0hNQihhcmxhbi0+Y29tbWFuZFBhcmFtZXRlclswXSwgY29uZi0+cnhQYXJhbWV0ZXIpOworCQkJYXJsYW5faW50ZXJydXB0X2xhbmNwdShkZXYpOworCQkJcHJpdi0+cnhfY29tbWFuZF9naXZlbiA9IDA7IC8vIG1uamFoLCBiYWQKKwkJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX1JYOworCQkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gMTsKKwkJfQorCQllbHNlCisJCQlwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPSAyOworCX0KKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfVEJVU1lfQ0xFQVIpCisJeworCQlpZiAoICFyZWdpc3RyYXRpb25CYWQoZGV2KSAmJgorCQkgICAgIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikgfHwgIW5ldGlmX3J1bm5pbmcoZGV2KSkgKQorCQkJeworCQkJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX1RCVVNZX0NMRUFSOworCQkJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJCQl9CisJfQorCWVsc2UgaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9UWCkKKwl7CisJCWlmICghdGVzdF9hbmRfc2V0X2JpdCgwLCAodm9pZCAqKSAmcHJpdi0+dHhfY29tbWFuZF9naXZlbikpCisJCXsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIAorCQkJCSAgICAgICBwcml2LT50eF9sYXN0X3NlbnQgKyB1czJ0aWNrcyhjb25mLT5yeF90d2VhazEpKQorCQkJICAgIHx8IHRpbWVfYmVmb3JlKGppZmZpZXMsCisJCQkJCSAgIHByaXYtPmxhc3RfcnhfaW50X2Fja190aW1lICsgdXMydGlja3MoY29uZi0+cnhfdHdlYWsyKSkpCisJCQl7CisJCQkJc2V0SW50ZXJydXB0RW5hYmxlKGRldik7CisJCQkJbWVtc2V0X2lvKGFybGFuLT5jb21tYW5kUGFyYW1ldGVyLCAwLCAweGYpOworCQkJCVdSSVRFU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUsIEFSTEFOX0NPTV9UWF9FTkFCTEUgfCBBUkxBTl9DT01fSU5UKTsKKwkJCQltZW1jcHlfdG9pbyhhcmxhbi0+Y29tbWFuZFBhcmFtZXRlciwgJlRYTEFTVChkZXYpLCAxNCk7CisvLwkJCQlmb3IgKCBpPTEgOyBpIDwgMTUgOyBpKyspIHByaW50aygiJTAyeDoiLFJFQURTSE1CKGFybGFuLT5jb21tYW5kUGFyYW1ldGVyW2ldKSk7CisJCQkJcHJpdi0+dHhfbGFzdF9zZW50ID0gamlmZmllczsKKwkJCQlhcmxhbl9pbnRlcnJ1cHRfbGFuY3B1KGRldik7CisJCQkJcHJpdi0+dHhfY29tbWFuZF9naXZlbiA9IDE7CisJCQkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfVFg7CisJCQkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gMTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwcml2LT50eF9jb21tYW5kX2dpdmVuID0gMDsKKwkJCQlwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPSAxOworCQkJfQorCQl9IAorCQllbHNlIGlmIChhcmxhbl9kZWJ1ZyAmIEFSTEFOX0RFQlVHX0NIQUlOX0xPQ0tTKQorCQkJcHJpbnRrKEtFUk5fRVJSICJ0eCBjb21tYW5kIHdoZW4gdHggY2hhaW4gbG9ja2VkIFxuIik7CisJfQorCWVsc2UgaWYgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYgQVJMQU5fQ09NTUFORF9OT09QSU5UKQorCXsKKwkJeworCQkJV1JJVEVTSE1CKGFybGFuLT5jb21tYW5kQnl0ZSwgQVJMQU5fQ09NX05PUCB8IEFSTEFOX0NPTV9JTlQpOworCQl9CisJCWFybGFuX2ludGVycnVwdF9sYW5jcHUoZGV2KTsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfTk9PUElOVDsKKwkJcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsID0gSFogLyAzOworCX0KKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfTk9PUCkKKwl7CisJCVdSSVRFU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUsIEFSTEFOX0NPTV9OT1ApOworCQlhcmxhbl9pbnRlcnJ1cHRfbGFuY3B1KGRldik7CisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICY9IH5BUkxBTl9DT01NQU5EX05PT1A7CisJCXByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA9IEhaIC8gMzsKKwl9CisJZWxzZSBpZiAocHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJiBBUkxBTl9DT01NQU5EX1NMT1dfUE9MTCkKKwl7CisJCVdSSVRFU0hNQihhcmxhbi0+Y29tbWFuZEJ5dGUsIEFSTEFOX0NPTV9HT1RPX1NMT1dfUE9MTCk7CisJCWFybGFuX2ludGVycnVwdF9sYW5jcHUoZGV2KTsKKwkJcHJpdi0+d2FpdGluZ19jb21tYW5kX21hc2sgJj0gfkFSTEFOX0NPTU1BTkRfU0xPV19QT0xMOworCQlwcml2LT5jYXJkX3BvbGxpbmdfaW50ZXJ2YWwgPSBIWiAvIDM7CisJfSAKKwllbHNlIGlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmIEFSTEFOX0NPTU1BTkRfUE9XRVJET1dOKQorCXsKKwkJc2V0UG93ZXJPZmYoZGV2KTsKKwkJaWYgKGFybGFuX2RlYnVnICYgQVJMQU5fREVCVUdfQ0FSRF9TVEFURSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBcmxhbiBHb2luZyBTdGFuZGJ5XG4iLCBkZXYtPm5hbWUpOworCQlwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzayAmPSB+QVJMQU5fQ09NTUFORF9QT1dFUkRPV047CisJCXByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA9IDMgKiBIWjsKKwl9CisJYXJsYW5fdW5sb2NrX2NhcmRfYWNjZXNzKGRldik7CisJZm9yIChpID0gMDsgUkVBRFNITUIoYXJsYW4tPmNvbW1hbmRCeXRlKSAmJiBpIDwgMjA7IGkrKykKKwkJdWRlbGF5KDEwKTsKKwlpZiAoUkVBRFNITUIoYXJsYW4tPmNvbW1hbmRCeXRlKSkKKwkJaWYgKGFybGFuX2RlYnVnICYgQVJMQU5fREVCVUdfQ0FSRF9TVEFURSkKKwkJCXByaW50ayhLRVJOX0VSUiAiY2FyZCBidXN5IGxlYXZpbmcgY29tbWFuZCAlbHhcbiIsIHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9jb21tYW5kIik7CisJcHJpdi0+bGFzdF9jb21tYW5kX2J1ZmZfZnJlZV90aW1lID0gamlmZmllczsKKwlyZXR1cm4gMDsKKworY2FyZF9idXN5X2VuZDoKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBwcml2LT5sYXN0X2NvbW1hbmRfYnVmZl9mcmVlX3RpbWUgKyBIWikpCisJCXByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrIHw9IEFSTEFOX0NPTU1BTkRfQ0xFQU5fQU5EX1JFU0VUOworCisJaWYgKGFybGFuX2RlYnVnICYgQVJMQU5fREVCVUdfQ0FSRF9TVEFURSkKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyBhcmxhbl9jb21tYW5kIGNhcmQgYnVzeSBlbmQgXG4iLCBkZXYtPm5hbWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9jb21tYW5kIik7CisJcmV0dXJuIDE7CisKK2JhZF9lbmQ6CisJcHJpbnRrKEtFUk5fRVJSICIlcyBhcmxhbl9jb21tYW5kIGJhZCBlbmQgXG4iLCBkZXYtPm5hbWUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX2NvbW1hbmQiKTsKKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFybGFuX2NvbW1hbmRfcHJvY2VzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWludCB0aW1lcyA9IDA7CisJd2hpbGUgKHByaXYtPndhaXRpbmdfY29tbWFuZF9tYXNrICYmIHRpbWVzIDwgOCkKKwl7CisJCWlmIChwcml2LT53YWl0aW5nX2NvbW1hbmRfbWFzaykKKwkJeworCQkJaWYgKGFybGFuX2NvbW1hbmQoZGV2LCAwKSkKKwkJCQlicmVhazsKKwkJCXRpbWVzKys7CisJCX0KKwkJLyogaWYgbG9uZyBjb21tYW5kLCB3ZSB3b24ndCByZXBlYXQgdHJ5aW5nICovIDsKKwkJaWYgKHByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCA+IDEpCisJCQlicmVhazsKKwkJdGltZXMrKzsKKwl9Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGFybGFuX3JldHJhbnNtaXRfbm93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fcmV0cmFuc21pdF9ub3ciKTsKKwlpZiAoVFhMQVNUKGRldikub2Zmc2V0ID09IDApCisJeworCQlpZiAoVFhIRUFEKGRldikub2Zmc2V0KQorCQl7CisJCQlwcml2LT50eExhc3QgPSAwOworCQkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikgcHJpbnRrKEtFUk5fREVCVUcgIlRYIGJ1ZmYgc3dpdGNoIHRvIGhlYWQgXG4iKTsKKworCQl9CisJCWVsc2UgaWYgKFRYVEFJTChkZXYpLm9mZnNldCkKKwkJeworCQkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikgcHJpbnRrKEtFUk5fREVCVUcgIlRYIGJ1ZmYgc3dpdGNoIHRvIHRhaWwgXG4iKTsKKwkJCXByaXYtPnR4TGFzdCA9IDE7CisJCX0KKwkJZWxzZQorCQkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikgcHJpbnRrKEtFUk5fRVJSICJSZVRyYW5zbWl0IGJ1ZmYgZW1wdHkiKTsKKwkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwkJcmV0dXJuOworCisJfQorCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX1RYKTsKKworCXByaXYtPkNvbmYtPmRyaXZlclJldHJhbnNtaXNzaW9ucysrOworCXByaXYtPnJldHJhbnNtaXNzaW9ucysrOworCisJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikgcHJpbnRrKCJSZXRyYW5zbWl0ICVkIGJ5dGVzIFxuIiwgVFhMQVNUKGRldikubGVuZ3RoKTsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3JldHJhbnNtaXRfbm93Iik7Cit9CisKKworCitzdGF0aWMgdm9pZCBhcmxhbl9yZWdpc3RyYXRpb25fdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGJoX21hcmtfbmVlZGVkID0gMDsKKwlpbnQgbmV4dF90aWNrID0gMTsKKwlsb25nIGxvc3RUaW1lID0gKChsb25nKWppZmZpZXMgLSAobG9uZylwcml2LT5yZWdpc3RyYXRpb25MYXN0U2VlbikKKwkJCSogKDEwMDAvSFopOworCisJaWYgKHJlZ2lzdHJhdGlvbkJhZChkZXYpKQorCXsKKwkJcHJpdi0+cmVnaXN0cmF0aW9uTG9zdENvdW50Kys7CisJCWlmIChsb3N0VGltZSA+IDcwMDAgJiYgbG9zdFRpbWUgPCA3MjAwKQorCQl7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIHJlZ2lzdHJhdGlvbiBMb3N0IFxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCQlpZiAobG9zdFRpbWUgLyBwcml2LT5yZVJlZ2lzdGVyRXhwID4gMjAwMCkKKwkJCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX0NMRUFOX0FORF9DT05GKTsKKwkJaWYgKGxvc3RUaW1lIC8gKHByaXYtPnJlUmVnaXN0ZXJFeHApID4gMzUwMCkKKwkJCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX0NMRUFOX0FORF9SRVNFVCk7CisJCWlmIChwcml2LT5yZVJlZ2lzdGVyRXhwIDwgNDAwKQorCQkJcHJpdi0+cmVSZWdpc3RlckV4cCArPSAyOworCQlpZiAobG9zdFRpbWUgPiA3MjAwKQorCQl7CisJCQluZXh0X3RpY2sgPSBIWjsKKwkJCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX0NMRUFOX0FORF9SRVNFVCk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYgKHByaXYtPkNvbmYtPnJlZ2lzdHJhdGlvbk1vZGUgJiYgbG9zdFRpbWUgPiAxMDAwMCAmJgorCQkJcHJpdi0+cmVnaXN0cmF0aW9uTG9zdENvdW50KQorCQl7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIHJlZ2lzdHJhdGlvbiBpcyBiYWNrIGFmdGVyICVsZCBtaWxsaXNlY29uZHNcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBsb3N0VGltZSk7CisJCX0KKwkJcHJpdi0+cmVnaXN0cmF0aW9uTGFzdFNlZW4gPSBqaWZmaWVzOworCQlwcml2LT5yZWdpc3RyYXRpb25Mb3N0Q291bnQgPSAwOworCQlwcml2LT5yZVJlZ2lzdGVyRXhwID0gMTsKKwkJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikgKQorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQlpZiAodGltZV9hZnRlcihwcml2LT50eF9sYXN0X3NlbnQscHJpdi0+dHhfbGFzdF9jbGVhcmVkKSAmJgorCQkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBwcml2LT50eF9sYXN0X3NlbnQgKiA1KkhaKSApeworCQkJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfQ0xFQU5fQU5EX1JFU0VUKTsJCQorCQkJcHJpdi0+dHhfbGFzdF9jbGVhcmVkID0gamlmZmllczsKKwkJfQorCX0KKworCisJaWYgKCFyZWdpc3RyYXRpb25CYWQoZGV2KSAmJiBwcml2LT5SZVRyYW5zbWl0UmVxdWVzdGVkKQorCXsKKwkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikKKwkJCXByaW50ayhLRVJOX0VSUiAiUmV0cmFuc21pdCBmcm9tIHRpbWVyIFxuIik7CisJCXByaXYtPlJlVHJhbnNtaXRSZXF1ZXN0ZWQgPSAwOworCQlhcmxhbl9yZXRyYW5zbWl0X25vdyhkZXYpOworCX0KKwlpZiAoIXJlZ2lzdHJhdGlvbkJhZChkZXYpICYmCisJCXRpbWVfYWZ0ZXIoamlmZmllcywgcHJpdi0+dHhfZG9uZV9kZWxheWVkKSAmJgorCQlwcml2LT50eF9kb25lX2RlbGF5ZWQgIT0gMCkKKwl7CisJCVRYTEFTVChkZXYpLm9mZnNldCA9IDA7CisJCWlmIChwcml2LT50eExhc3QpCisJCQlwcml2LT50eExhc3QgPSAwOworCQllbHNlIGlmIChUWFRBSUwoZGV2KS5vZmZzZXQpCisJCQlwcml2LT50eExhc3QgPSAxOworCQlpZiAoVFhMQVNUKGRldikub2Zmc2V0KQorCQl7CisJCQlhcmxhbl9yZXRyYW5zbWl0X25vdyhkZXYpOworCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCX0KKwkJaWYgKCEoVFhIRUFEKGRldikub2Zmc2V0ICYmIFRYVEFJTChkZXYpLm9mZnNldCkpCisJCXsKKwkJCW5ldGlmX3dha2VfcXVldWUgKGRldik7CisJCX0KKwkJcHJpdi0+dHhfZG9uZV9kZWxheWVkID0gMDsKKwkJYmhfbWFya19uZWVkZWQgPSAxOworCX0KKwlpZiAoYmhfbWFya19uZWVkZWQpCisJeworCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCX0KKwlhcmxhbl9wcm9jZXNzX2ludGVycnVwdChkZXYpOworCisJaWYgKG5leHRfdGljayA8IHByaXYtPmNhcmRfcG9sbGluZ19pbnRlcnZhbCkKKwkJbmV4dF90aWNrID0gcHJpdi0+Y2FyZF9wb2xsaW5nX2ludGVydmFsOworCisJcHJpdi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBuZXh0X3RpY2s7CisKKwlhZGRfdGltZXIoJnByaXYtPnRpbWVyKTsKK30KKworCisjaWZkZWYgQVJMQU5fREVCVUdHSU5HCisKK3N0YXRpYyB2b2lkIGFybGFuX3ByaW50X3JlZ2lzdGVycyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbGluZSkKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtICphcmxhbiA9IHByaXYtPmNhcmQ7CisKKwl1X2NoYXIgaG9zdGNwdUxvY2ssIGxhbmNwdUxvY2ssIGNvbnRyb2xSZWdpc3RlciwgY250cmxSZWdJbWFnZSwKKwkJdHhTdGF0dXMsIHJ4U3RhdHVzLCBpbnRlcnJ1cHRJblByb2dyZXNzLCBjb21tYW5kQnl0ZTsKKworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX3ByaW50X3JlZ2lzdGVycyIpOworCVJFQURTSE0oaW50ZXJydXB0SW5Qcm9ncmVzcywgYXJsYW4tPmludGVycnVwdEluUHJvZ3Jlc3MsIHVfY2hhcik7CisJUkVBRFNITShob3N0Y3B1TG9jaywgYXJsYW4tPmhvc3RjcHVMb2NrLCB1X2NoYXIpOworCVJFQURTSE0obGFuY3B1TG9jaywgYXJsYW4tPmxhbmNwdUxvY2ssIHVfY2hhcik7CisJUkVBRFNITShjb250cm9sUmVnaXN0ZXIsIGFybGFuLT5jb250cm9sUmVnaXN0ZXIsIHVfY2hhcik7CisJUkVBRFNITShjbnRybFJlZ0ltYWdlLCBhcmxhbi0+Y250cmxSZWdJbWFnZSwgdV9jaGFyKTsKKwlSRUFEU0hNKHR4U3RhdHVzLCBhcmxhbi0+dHhTdGF0dXMsIHVfY2hhcik7CisJUkVBRFNITShyeFN0YXR1cywgYXJsYW4tPnJ4U3RhdHVzLCB1X2NoYXIpOworCVJFQURTSE0oY29tbWFuZEJ5dGUsIGFybGFuLT5jb21tYW5kQnl0ZSwgdV9jaGFyKTsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgImxpbmUgJTA0ZCBJUCAlMDJ4IEhMICUwMnggTEwgJTAyeCBDQiAlMDJ4IENSICUwMnggQ1JJICUwMnggVFggJTAyeCBSWCAlMDJ4XG4iLAorCQlsaW5lLCBpbnRlcnJ1cHRJblByb2dyZXNzLCBob3N0Y3B1TG9jaywgbGFuY3B1TG9jaywgY29tbWFuZEJ5dGUsCisJCWNvbnRyb2xSZWdpc3RlciwgY250cmxSZWdJbWFnZSwgdHhTdGF0dXMsIHJ4U3RhdHVzKTsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3ByaW50X3JlZ2lzdGVycyIpOworfQorI2VuZGlmCisKKworc3RhdGljIGludCBhcmxhbl9od190eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBsZW5ndGgpCit7CisJaW50IGk7CisKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKwlzdHJ1Y3QgYXJsYW5fY29uZl9zdHJ1ICpjb25mID0gcHJpdi0+Q29uZjsKKworCWludCB0YWlsU3RhcnRzID0gMHg4MDA7CisJaW50IGhlYWRFbmRzID0gMHgwOworCisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5faHdfdHgiKTsKKwlpZiAoVFhIRUFEKGRldikub2Zmc2V0KQorCQloZWFkRW5kcyA9ICgoKFRYSEVBRChkZXYpLm9mZnNldCArIFRYSEVBRChkZXYpLmxlbmd0aCAtIG9mZnNldG9mKHN0cnVjdCBhcmxhbl9zaG1lbSwgdHhCdWZmZXIpKSAvIDY0KSArIDEpICogNjQ7CisJaWYgKFRYVEFJTChkZXYpLm9mZnNldCkKKwkJdGFpbFN0YXJ0cyA9IDB4ODAwIC0gKCgoVFhUQUlMKGRldikub2Zmc2V0IC0gb2Zmc2V0b2Yoc3RydWN0IGFybGFuX3NobWVtLCB0eEJ1ZmZlcikpIC8gNjQpICsgMikgKiA2NDsKKworCisJaWYgKCFUWEhFQUQoZGV2KS5vZmZzZXQgJiYgbGVuZ3RoIDwgdGFpbFN0YXJ0cykKKwl7CisJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pCisJCQlwcmludGsoS0VSTl9FUlIgIlRYSEVBRCBpbnNlcnQsIHRhaWxTdGFydCAlZFxuIiwgdGFpbFN0YXJ0cyk7CisKKwkJVFhIRUFEKGRldikub2Zmc2V0ID0KKwkJCW9mZnNldG9mKHN0cnVjdCBhcmxhbl9zaG1lbSwgdHhCdWZmZXIpOworCQlUWEhFQUQoZGV2KS5sZW5ndGggPSBsZW5ndGggLSBBUkxBTl9GQUtFX0hEUl9MRU47CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlUWEhFQUQoZGV2KS5kZXN0W2ldID0gYnVmW2ldOworCQlUWEhFQUQoZGV2KS5jbGVhciA9IGNvbmYtPnR4Q2xlYXI7CisJCVRYSEVBRChkZXYpLnJldHJpZXMgPSBjb25mLT50eFJldHJpZXM7CS8qIDAgaXMgdXNlIGRlZmF1bHQgKi8KKwkJVFhIRUFEKGRldikucm91dGluZyA9IGNvbmYtPnR4Um91dGluZzsKKwkJVFhIRUFEKGRldikuc2NyYW1ibGVkID0gY29uZi0+dHhTY3JhbWJsZWQ7CisJCW1lbWNweV90b2lvKChjaGFyIF9faW9tZW0gKilhcmxhbiArIFRYSEVBRChkZXYpLm9mZnNldCwgYnVmICsgQVJMQU5fRkFLRV9IRFJfTEVOLCBUWEhFQUQoZGV2KS5sZW5ndGgpOworCX0KKwllbHNlIGlmICghVFhUQUlMKGRldikub2Zmc2V0ICYmIGxlbmd0aCA8ICgweDgwMCAtIGhlYWRFbmRzKSkKKwl7CisJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pCisJCQlwcmludGsoS0VSTl9FUlIgIlRYVEFJTCBpbnNlcnQsIGhlYWRFbmQgJWRcbiIsIGhlYWRFbmRzKTsKKworCQlUWFRBSUwoZGV2KS5vZmZzZXQgPQorCQkJb2Zmc2V0b2Yoc3RydWN0IGFybGFuX3NobWVtLCB0eEJ1ZmZlcikgKyAweDgwMCAtIChsZW5ndGggLyA2NCArIDIpICogNjQ7CisJCVRYVEFJTChkZXYpLmxlbmd0aCA9IGxlbmd0aCAtIEFSTEFOX0ZBS0VfSERSX0xFTjsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCVRYVEFJTChkZXYpLmRlc3RbaV0gPSBidWZbaV07CisJCVRYVEFJTChkZXYpLmNsZWFyID0gY29uZi0+dHhDbGVhcjsKKwkJVFhUQUlMKGRldikucmV0cmllcyA9IGNvbmYtPnR4UmV0cmllczsKKwkJVFhUQUlMKGRldikucm91dGluZyA9IGNvbmYtPnR4Um91dGluZzsKKwkJVFhUQUlMKGRldikuc2NyYW1ibGVkID0gY29uZi0+dHhTY3JhbWJsZWQ7CisJCW1lbWNweV90b2lvKCgoY2hhciBfX2lvbWVtICopYXJsYW4gKyBUWFRBSUwoZGV2KS5vZmZzZXQpLCBidWYgKyBBUkxBTl9GQUtFX0hEUl9MRU4sIFRYVEFJTChkZXYpLmxlbmd0aCk7CisJfQorCWVsc2UKKwl7CisJCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pCisJCQlwcmludGsoS0VSTl9FUlIgIlRYIFRBSUwgJiBIRUFEIGZ1bGwsIHJldHVybiwgdGFpbFN0YXJ0ICVkIGhlYWRFbmQgJWRcbiIsIHRhaWxTdGFydHMsIGhlYWRFbmRzKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwcml2LT5vdXRfYnl0ZXMgKz0gbGVuZ3RoOworCXByaXYtPm91dF9ieXRlczEwICs9IGxlbmd0aDsKKwlpZiAoY29uZi0+bWVhc3VyZV9yYXRlIDwgMSkKKwkJY29uZi0+bWVhc3VyZV9yYXRlID0gMTsKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBwcml2LT5vdXRfdGltZSArIGNvbmYtPm1lYXN1cmVfcmF0ZSAqIEhaKSkKKwl7CisJCWNvbmYtPm91dF9zcGVlZCA9IHByaXYtPm91dF9ieXRlcyAvIGNvbmYtPm1lYXN1cmVfcmF0ZTsKKwkJcHJpdi0+b3V0X2J5dGVzID0gMDsKKwkJcHJpdi0+b3V0X3RpbWUgPSBqaWZmaWVzOworCX0KKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBwcml2LT5vdXRfdGltZTEwICsgY29uZi0+bWVhc3VyZV9yYXRlICogMTAqSFopKQorCXsKKwkJY29uZi0+b3V0X3NwZWVkMTAgPSBwcml2LT5vdXRfYnl0ZXMxMCAvICgxMCAqIGNvbmYtPm1lYXN1cmVfcmF0ZSk7CisJCXByaXYtPm91dF9ieXRlczEwID0gMDsKKwkJcHJpdi0+b3V0X3RpbWUxMCA9IGppZmZpZXM7CisJfQorCWlmIChUWEhFQUQoZGV2KS5vZmZzZXQgJiYgVFhUQUlMKGRldikub2Zmc2V0KQorCXsKKwkJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCWVsc2UKKwkJbmV0aWZfc3RhcnRfcXVldWUgKGRldik7CisKKworCUlGREVCVUcoQVJMQU5fREVCVUdfSEVBREVSX0RVTVApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIFRyYW5zbWl0IHQgJTJ4OiUyeDolMng6JTJ4OiUyeDolMnggZiAlMng6JTJ4OiUyeDolMng6JTJ4OiUyeCBcbiIsIGRldi0+bmFtZSwKKwkJICAgKHVuc2lnbmVkIGNoYXIpIGJ1ZlswXSwgKHVuc2lnbmVkIGNoYXIpIGJ1ZlsxXSwgKHVuc2lnbmVkIGNoYXIpIGJ1ZlsyXSwgKHVuc2lnbmVkIGNoYXIpIGJ1ZlszXSwKKwkJICAgKHVuc2lnbmVkIGNoYXIpIGJ1Zls0XSwgKHVuc2lnbmVkIGNoYXIpIGJ1Zls1XSwgKHVuc2lnbmVkIGNoYXIpIGJ1Zls2XSwgKHVuc2lnbmVkIGNoYXIpIGJ1Zls3XSwKKwkJICAgKHVuc2lnbmVkIGNoYXIpIGJ1Zls4XSwgKHVuc2lnbmVkIGNoYXIpIGJ1Zls5XSwgKHVuc2lnbmVkIGNoYXIpIGJ1ZlsxMF0sICh1bnNpZ25lZCBjaGFyKSBidWZbMTFdKTsKKworCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pIHByaW50ayhLRVJOX0VSUiAiVFggY29tbWFuZCBwcmVwYXJlIGZvciBidWZmZXIgJWRcbiIsIHByaXYtPnR4TGFzdCk7CisKKwlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9UWCk7CisKKwlwcml2LT50eF9sYXN0X3NlbnQgPSBqaWZmaWVzOworCisJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikgcHJpbnRrKCIlcyBUWCBRdWVkICVkIGJ5dGVzIFxuIiwgZGV2LT5uYW1lLCBsZW5ndGgpOworCisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5faHdfdHgiKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYXJsYW5faHdfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBhcmxhbl9zaG1lbSBfX2lvbWVtICphcmxhbiA9IHByaXYtPmNhcmQ7CisJc3RydWN0IGFybGFuX2NvbmZfc3RydSAqY29uZiA9IHByaXYtPkNvbmY7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5faHdfY29uZmlnIik7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIGFybGFuIGNvbmZpZ3VyZSBjYWxsZWQgXG4iLCBkZXYtPm5hbWUpOworCWlmIChhcmxhbl9FRVBST01fYmFkKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgImFybGFuIGNvbmZpZ3VyZSB3aXRoIGVlcHJvbSBiYWQgb3B0aW9uIFxuIik7CisKKworCVdSSVRFU0hNKGFybGFuLT5zcHJlYWRpbmdDb2RlLCBjb25mLT5zcHJlYWRpbmdDb2RlLCB1X2NoYXIpOworCVdSSVRFU0hNKGFybGFuLT5jaGFubmVsU2V0LCBjb25mLT5jaGFubmVsU2V0LCB1X2NoYXIpOworCisJaWYgKGFybGFuX0VFUFJPTV9iYWQpCisJCVdSSVRFU0hNKGFybGFuLT5kZWZhdWx0Q2hhbm5lbFNldCwgY29uZi0+Y2hhbm5lbFNldCwgdV9jaGFyKTsKKworCVdSSVRFU0hNKGFybGFuLT5jaGFubmVsTnVtYmVyLCBjb25mLT5jaGFubmVsTnVtYmVyLCB1X2NoYXIpOworCisJV1JJVEVTSE0oYXJsYW4tPnNjcmFtYmxpbmdEaXNhYmxlLCBjb25mLT5zY3JhbWJsaW5nRGlzYWJsZSwgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+dHhBdHRlbnVhdGlvbiwgY29uZi0+dHhBdHRlbnVhdGlvbiwgdV9jaGFyKTsKKworCVdSSVRFU0hNKGFybGFuLT5zeXN0ZW1JZCwgY29uZi0+c3lzdGVtSWQsIHVfaW50KTsKKworCVdSSVRFU0hNKGFybGFuLT5tYXhSZXRyaWVzLCBjb25mLT5tYXhSZXRyaWVzLCB1X2NoYXIpOworCVdSSVRFU0hNKGFybGFuLT5yZWNlaXZlTW9kZSwgY29uZi0+cmVjZWl2ZU1vZGUsIHVfY2hhcik7CisJV1JJVEVTSE0oYXJsYW4tPnByaW9yaXR5LCBjb25mLT5wcmlvcml0eSwgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+cm9vdE9yUmVwZWF0ZXIsIGNvbmYtPnJvb3RPclJlcGVhdGVyLCB1X2NoYXIpOworCVdSSVRFU0hNKGFybGFuLT5TSUQsIGNvbmYtPlNJRCwgdV9pbnQpOworCisJV1JJVEVTSE0oYXJsYW4tPnJlZ2lzdHJhdGlvbk1vZGUsIGNvbmYtPnJlZ2lzdHJhdGlvbk1vZGUsIHVfY2hhcik7CisKKwlXUklURVNITShhcmxhbi0+cmVnaXN0cmF0aW9uRmlsbCwgY29uZi0+cmVnaXN0cmF0aW9uRmlsbCwgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+bG9jYWxUYWxrQWRkcmVzcywgY29uZi0+bG9jYWxUYWxrQWRkcmVzcywgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+Y29kZUZvcm1hdCwgY29uZi0+Y29kZUZvcm1hdCwgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+bnVtQ2hhbm5lbHMsIGNvbmYtPm51bUNoYW5uZWxzLCB1X2NoYXIpOworCVdSSVRFU0hNKGFybGFuLT5jaGFubmVsMSwgY29uZi0+Y2hhbm5lbDEsIHVfY2hhcik7CisJV1JJVEVTSE0oYXJsYW4tPmNoYW5uZWwyLCBjb25mLT5jaGFubmVsMiwgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+Y2hhbm5lbDMsIGNvbmYtPmNoYW5uZWwzLCB1X2NoYXIpOworCVdSSVRFU0hNKGFybGFuLT5jaGFubmVsNCwgY29uZi0+Y2hhbm5lbDQsIHVfY2hhcik7CisJV1JJVEVTSE0oYXJsYW4tPnJhZGlvTm9kZUlkLCBjb25mLT5yYWRpb05vZGVJZCwgdV9zaG9ydCk7CisJV1JJVEVTSE0oYXJsYW4tPlNJRCwgY29uZi0+U0lELCB1X2ludCk7CisJV1JJVEVTSE0oYXJsYW4tPndhaXRUaW1lLCBjb25mLT53YWl0VGltZSwgdV9zaG9ydCk7CisJV1JJVEVTSE0oYXJsYW4tPmxQYXJhbWV0ZXIsIGNvbmYtPmxQYXJhbWV0ZXIsIHVfc2hvcnQpOworCW1lbWNweV90b2lvKCYoYXJsYW4tPl8xNSksICYoY29uZi0+XzE1KSwgMyk7CisJV1JJVEVTSE0oYXJsYW4tPl8xNSwgY29uZi0+XzE1LCB1X3Nob3J0KTsKKwlXUklURVNITShhcmxhbi0+aGVhZGVyU2l6ZSwgY29uZi0+aGVhZGVyU2l6ZSwgdV9zaG9ydCk7CisJaWYgKGFybGFuX0VFUFJPTV9iYWQpCisJCVdSSVRFU0hNKGFybGFuLT5oYXJkd2FyZVR5cGUsIGNvbmYtPmhhcmR3YXJlVHlwZSwgdV9jaGFyKTsKKwlXUklURVNITShhcmxhbi0+cmFkaW9UeXBlLCBjb25mLT5yYWRpb1R5cGUsIHVfY2hhcik7CisJaWYgKGFybGFuX0VFUFJPTV9iYWQpCisJCVdSSVRFU0hNKGFybGFuLT5yYWRpb01vZHVsZSwgY29uZi0+cmFkaW9UeXBlLCB1X2NoYXIpOworCisJbWVtY3B5X3RvaW8oYXJsYW4tPmVuY3J5cHRpb25LZXkgKyBrZXlTdGFydCwgZW5jcnlwdGlvbktleSwgOCk7CisJbWVtY3B5X3RvaW8oYXJsYW4tPm5hbWUsIGNvbmYtPnNpdGVOYW1lLCAxNik7CisKKwlXUklURVNITUIoYXJsYW4tPmNvbW1hbmRCeXRlLCBBUkxBTl9DT01fSU5UIHwgQVJMQU5fQ09NX0NPTkYpOwkvKiBkbyBjb25maWd1cmUgKi8KKwltZW1zZXRfaW8oYXJsYW4tPmNvbW1hbmRQYXJhbWV0ZXIsIDAsIDB4Zik7CS8qIDB4ZiAqLworCW1lbXNldF9pbyhhcmxhbi0+Y29tbWFuZFBhcmFtZXRlciArIDEsIDAsIDIpOworCWlmIChjb25mLT53cml0ZUVFUFJPTSkKKwl7CisJCSAgbWVtc2V0X2lvKGFybGFuLT5jb21tYW5kUGFyYW1ldGVyLCBjb25mLT53cml0ZUVFUFJPTSwgMSk7CisvLwkJY29uZi0+d3JpdGVFRVBST009MDsKKwl9CisJaWYgKGNvbmYtPnJlZ2lzdHJhdGlvbk1vZGUgJiYgY29uZi0+cmVnaXN0cmF0aW9uSW50ZXJydXB0cykKKwkJbWVtc2V0X2lvKGFybGFuLT5jb21tYW5kUGFyYW1ldGVyICsgMywgMSwgMSk7CisJZWxzZQorCQltZW1zZXRfaW8oYXJsYW4tPmNvbW1hbmRQYXJhbWV0ZXIgKyAzLCAwLCAxKTsKKworCXByaXYtPmlycV90ZXN0X2RvbmUgPSAwOworCisJaWYgKGNvbmYtPnR4X3F1ZXVlX2xlbikKKwkJZGV2LT50eF9xdWV1ZV9sZW4gPSBjb25mLT50eF9xdWV1ZV9sZW47CisJdWRlbGF5KDEwMCk7CisKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9od19jb25maWciKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFybGFuX3JlYWRfY2FyZF9jb25maWd1cmF0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdV9jaGFyIHRseDQxNTsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKwlzdHJ1Y3QgYXJsYW5fY29uZl9zdHJ1ICpjb25mID0gcHJpdi0+Q29uZjsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9yZWFkX2NhcmRfY29uZmlndXJhdGlvbiIpOworCisJaWYgKHJhZGlvTm9kZUlkID09IHJhZGlvTm9kZUlkVU5LTk9XTikKKwl7CisJCVJFQURTSE0oY29uZi0+cmFkaW9Ob2RlSWQsIGFybGFuLT5yYWRpb05vZGVJZCwgdV9zaG9ydCk7CisJfQorCWVsc2UKKwkJY29uZi0+cmFkaW9Ob2RlSWQgPSByYWRpb05vZGVJZDsKKwkJCisJaWYgKFNJRCA9PSBTSURVTktOT1dOKQorCXsKKwkJUkVBRFNITShjb25mLT5TSUQsIGFybGFuLT5TSUQsIHVfaW50KTsKKwl9CisJZWxzZSBjb25mLT5TSUQgPSBTSUQ7CisJCQorCWlmIChzcHJlYWRpbmdDb2RlID09IHNwcmVhZGluZ0NvZGVVTktOT1dOKQorCXsKKwkJICBSRUFEU0hNKGNvbmYtPnNwcmVhZGluZ0NvZGUsIGFybGFuLT5zcHJlYWRpbmdDb2RlLCB1X2NoYXIpOworCX0KKwllbHNlCisJCWNvbmYtPnNwcmVhZGluZ0NvZGUgPSBzcHJlYWRpbmdDb2RlOworCQkKKwlpZiAoY2hhbm5lbFNldCA9PSBjaGFubmVsU2V0VU5LTk9XTikKKwl7CisJCVJFQURTSE0oY29uZi0+Y2hhbm5lbFNldCwgYXJsYW4tPmNoYW5uZWxTZXQsIHVfY2hhcik7CisJfQorCWVsc2UgY29uZi0+Y2hhbm5lbFNldCA9IGNoYW5uZWxTZXQ7CisKKwlpZiAoY2hhbm5lbE51bWJlciA9PSBjaGFubmVsTnVtYmVyVU5LTk9XTikKKwl7CisJCVJFQURTSE0oY29uZi0+Y2hhbm5lbE51bWJlciwgYXJsYW4tPmNoYW5uZWxOdW1iZXIsIHVfY2hhcik7CisJfQorCWVsc2UgY29uZi0+Y2hhbm5lbE51bWJlciA9IGNoYW5uZWxOdW1iZXI7CisJCisJUkVBRFNITShjb25mLT5zY3JhbWJsaW5nRGlzYWJsZSwgYXJsYW4tPnNjcmFtYmxpbmdEaXNhYmxlLCB1X2NoYXIpOworCVJFQURTSE0oY29uZi0+dHhBdHRlbnVhdGlvbiwgYXJsYW4tPnR4QXR0ZW51YXRpb24sIHVfY2hhcik7CisJCisJaWYgKHN5c3RlbUlkID09IHN5c3RlbUlkVU5LTk9XTikKKwl7CisJCVJFQURTSE0oY29uZi0+c3lzdGVtSWQsIGFybGFuLT5zeXN0ZW1JZCwgdV9pbnQpOworCX0gCisJZWxzZSBjb25mLT5zeXN0ZW1JZCA9IHN5c3RlbUlkOworCQorCVJFQURTSE0oY29uZi0+bWF4RGF0YWdyYW1TaXplLCBhcmxhbi0+bWF4RGF0YWdyYW1TaXplLCB1X3Nob3J0KTsKKwlSRUFEU0hNKGNvbmYtPm1heEZyYW1lU2l6ZSwgYXJsYW4tPm1heEZyYW1lU2l6ZSwgdV9zaG9ydCk7CisJUkVBRFNITShjb25mLT5tYXhSZXRyaWVzLCBhcmxhbi0+bWF4UmV0cmllcywgdV9jaGFyKTsKKwlSRUFEU0hNKGNvbmYtPnJlY2VpdmVNb2RlLCBhcmxhbi0+cmVjZWl2ZU1vZGUsIHVfY2hhcik7CisJUkVBRFNITShjb25mLT5wcmlvcml0eSwgYXJsYW4tPnByaW9yaXR5LCB1X2NoYXIpOworCVJFQURTSE0oY29uZi0+cm9vdE9yUmVwZWF0ZXIsIGFybGFuLT5yb290T3JSZXBlYXRlciwgdV9jaGFyKTsKKworCWlmIChTSUQgPT0gU0lEVU5LTk9XTikKKwl7CisJCSAgUkVBRFNITShjb25mLT5TSUQsIGFybGFuLT5TSUQsIHVfaW50KTsKKwl9CisJZWxzZSBjb25mLT5TSUQgPSBTSUQ7CisJCisJaWYgKHJlZ2lzdHJhdGlvbk1vZGUgPT0gcmVnaXN0cmF0aW9uTW9kZVVOS05PV04pCisJeworCQkgIFJFQURTSE0oY29uZi0+cmVnaXN0cmF0aW9uTW9kZSwgYXJsYW4tPnJlZ2lzdHJhdGlvbk1vZGUsIHVfY2hhcik7CisJfQorCWVsc2UgY29uZi0+cmVnaXN0cmF0aW9uTW9kZSA9IHJlZ2lzdHJhdGlvbk1vZGU7CisJCisJUkVBRFNITShjb25mLT5yZWdpc3RyYXRpb25GaWxsLCBhcmxhbi0+cmVnaXN0cmF0aW9uRmlsbCwgdV9jaGFyKTsKKwlSRUFEU0hNKGNvbmYtPmxvY2FsVGFsa0FkZHJlc3MsIGFybGFuLT5sb2NhbFRhbGtBZGRyZXNzLCB1X2NoYXIpOworCVJFQURTSE0oY29uZi0+Y29kZUZvcm1hdCwgYXJsYW4tPmNvZGVGb3JtYXQsIHVfY2hhcik7CisJUkVBRFNITShjb25mLT5udW1DaGFubmVscywgYXJsYW4tPm51bUNoYW5uZWxzLCB1X2NoYXIpOworCVJFQURTSE0oY29uZi0+Y2hhbm5lbDEsIGFybGFuLT5jaGFubmVsMSwgdV9jaGFyKTsKKwlSRUFEU0hNKGNvbmYtPmNoYW5uZWwyLCBhcmxhbi0+Y2hhbm5lbDIsIHVfY2hhcik7CisJUkVBRFNITShjb25mLT5jaGFubmVsMywgYXJsYW4tPmNoYW5uZWwzLCB1X2NoYXIpOworCVJFQURTSE0oY29uZi0+Y2hhbm5lbDQsIGFybGFuLT5jaGFubmVsNCwgdV9jaGFyKTsKKwlSRUFEU0hNKGNvbmYtPndhaXRUaW1lLCBhcmxhbi0+d2FpdFRpbWUsIHVfc2hvcnQpOworCVJFQURTSE0oY29uZi0+bFBhcmFtZXRlciwgYXJsYW4tPmxQYXJhbWV0ZXIsIHVfc2hvcnQpOworCVJFQURTSE0oY29uZi0+XzE1LCBhcmxhbi0+XzE1LCB1X3Nob3J0KTsKKwlSRUFEU0hNKGNvbmYtPmhlYWRlclNpemUsIGFybGFuLT5oZWFkZXJTaXplLCB1X3Nob3J0KTsKKwlSRUFEU0hNKGNvbmYtPmhhcmR3YXJlVHlwZSwgYXJsYW4tPmhhcmR3YXJlVHlwZSwgdV9jaGFyKTsKKwlSRUFEU0hNKGNvbmYtPnJhZGlvVHlwZSwgYXJsYW4tPnJhZGlvTW9kdWxlLCB1X2NoYXIpOworCQorCWlmIChjb25mLT5yYWRpb1R5cGUgPT0gMCkKKwkJY29uZi0+cmFkaW9UeXBlID0gMHhjOworCisJV1JJVEVTSE0oYXJsYW4tPmNvbmZpZ1N0YXR1cywgMHhBNSwgdV9jaGFyKTsKKwlSRUFEU0hNKHRseDQxNSwgYXJsYW4tPmNvbmZpZ1N0YXR1cywgdV9jaGFyKTsKKwkKKwlpZiAodGx4NDE1ICE9IDB4QTUpCisJCXByaW50ayhLRVJOX0lORk8gIiVzIHRseDQxNSBjaGlwIFxuIiwgZGV2LT5uYW1lKTsKKwkKKwljb25mLT50eENsZWFyID0gMDsKKwljb25mLT50eFJldHJpZXMgPSAxOworCWNvbmYtPnR4Um91dGluZyA9IDE7CisJY29uZi0+dHhTY3JhbWJsZWQgPSAwOworCWNvbmYtPnJ4UGFyYW1ldGVyID0gMTsKKwljb25mLT50eFRpbWVvdXRNcyA9IDQwMDA7CisJY29uZi0+d2FpdENhcmRUaW1lb3V0ID0gMTAwMDAwOworCWNvbmYtPnJlY2VpdmVNb2RlID0gQVJMQU5fUkNWX0NMRUFOOworCW1lbWNweV9mcm9taW8oY29uZi0+c2l0ZU5hbWUsIGFybGFuLT5uYW1lLCAxNik7CisJY29uZi0+c2l0ZU5hbWVbMTZdID0gJ1wwJzsKKwljb25mLT5yZXRyaWVzID0gcmV0cmllczsKKwljb25mLT50eF9kZWxheV9tcyA9IHR4X2RlbGF5X21zOworCWNvbmYtPlJlVHJhbnNtaXRQYWNrZXRNYXhTaXplID0gMjAwOworCWNvbmYtPndhaXRSZVRyYW5zbWl0UGFja2V0TWF4U2l6ZSA9IDIwMDsKKwljb25mLT50eEFja1RpbWVvdXRNcyA9IDkwMDsKKwljb25mLT5mYXN0UmVUcmFuc0NvdW50ID0gMzsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3JlYWRfY2FyZF9jb25maWd1cmF0aW9uIik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGxhc3RGb3VuZEF0ID0gMHhiZTAwMDsKKworCisvKgorICogVGhpcyBpcyB0aGUgcmVhbCBwcm9iZSByb3V0aW5lLiBMaW51eCBoYXMgYSBoaXN0b3J5IG9mIGZyaWVuZGx5IGRldmljZQorICogcHJvYmVzIG9uIHRoZSBJU0EgYnVzLiBBIGdvb2QgZGV2aWNlIHByb2JlcyBhdm9pZHMgZG9pbmcgd3JpdGVzLCBhbmQKKyAqIHZlcmlmaWVzIHRoYXQgdGhlIGNvcnJlY3QgZGV2aWNlIGV4aXN0cyBhbmQgZnVuY3Rpb25zLgorICovCisjZGVmaW5lIEFSTEFOX1NITUVNX1NJWkUJMHgyMDAwCitzdGF0aWMgaW50IF9faW5pdCBhcmxhbl9jaGVja19maW5nZXJwcmludCh1bnNpZ25lZCBsb25nIG1lbWFkZHIpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgcHJvYmVUZXh0W10gPSAiVEVMRVNZU1RFTSBTTFcgSU5DLiAgICBBUkxBTiBcMCI7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gKHN0cnVjdCBhcmxhbl9zaG1lbSAqKSBtZW1hZGRyOworCXVuc2lnbmVkIGxvbmcgcGFkZHIgPSB2aXJ0X3RvX3BoeXMoKHZvaWQgKikgbWVtYWRkcik7CisJY2hhciB0ZW1wQnVmWzQ5XTsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9jaGVja19maW5nZXJwcmludCIpOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocGFkZHIsIEFSTEFOX1NITUVNX1NJWkUsICJhcmxhbiIpKSB7CisJCS8vIHByaW50ayhLRVJOX1dBUk5JTkcgImFybGFuOiBtZW1vcnkgcmVnaW9uICVseCBleGNsdWRlZCBmcm9tIHByb2JpbmcgXG4iLHBhZGRyKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbWVtY3B5X2Zyb21pbyh0ZW1wQnVmLCBhcmxhbi0+dGV4dFJlZ2lvbiwgMjkpOworCXRlbXBCdWZbMzBdID0gMDsKKworCS8qIGNoZWNrIGZvciBjYXJkIGF0IHRoaXMgYWRkcmVzcyAqLworCWlmICgwICE9IHN0cm5jbXAodGVtcEJ1ZiwgcHJvYmVUZXh0LCAyOSkpeworIAkJcmVsZWFzZV9tZW1fcmVnaW9uKHBhZGRyLCBBUkxBTl9TSE1FTV9TSVpFKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisvLyAgIHByaW50ayhLRVJOX0lORk8gImFybGFuIGZvdW5kIGF0IDB4JXggXG4iLG1lbWFkZHIpOworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX2NoZWNrX2ZpbmdlcnByaW50Iik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcmxhbl9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYXJsYW5fY29uZl9zdHJ1ICpjb25mID0gcHJpdi0+Q29uZjsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9jaGFuZ2VfbXR1Iik7CisJaWYgKG5ld19tdHUgPiAyMDMyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZXYtPm10dSA9IG5ld19tdHU7CisJaWYgKG5ld19tdHUgPCAyNTYpCisJCW5ld19tdHUgPSAyNTY7CS8qIGNhcmRzIGJvb2sgc3VnZ2VzdHMgMTYwMCAqLworCWNvbmYtPm1heERhdGFncmFtU2l6ZSA9IG5ld19tdHU7CisJY29uZi0+bWF4RnJhbWVTaXplID0gbmV3X210dSArIDQ4OworCisJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfQ0xFQU5fQU5EX0NPTkYpOworCXByaW50ayhLRVJOX05PVElDRSAiJXMgbXR1IGNoYW5nZWQgdG8gJWQgXG4iLCBkZXYtPm5hbWUsIG5ld19tdHUpOworCisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fY2hhbmdlX210dSIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJsYW5fbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworCisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fbWFjX2FkZHIiKTsKKwlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVCVVNZOworCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX21hY19hZGRyIik7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IF9faW5pdCBhcmxhbl9zZXR1cF9kZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG51bSkKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnI7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fc2V0dXBfZGV2aWNlIik7CisKKwlhcC0+Y29uZiA9IChzdHJ1Y3QgYXJsYW5fc2htZW0gKikoYXArMSk7CisKKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IHR4X3F1ZXVlX2xlbjsKKwlkZXYtPm9wZW4gPSBhcmxhbl9vcGVuOworCWRldi0+c3RvcCA9IGFybGFuX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gYXJsYW5fdHg7CisJZGV2LT5nZXRfc3RhdHMgPSBhcmxhbl9zdGF0aXN0aWNzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gYXJsYW5fc2V0X211bHRpY2FzdDsKKwlkZXYtPmNoYW5nZV9tdHUgPSBhcmxhbl9jaGFuZ2VfbXR1OworCWRldi0+c2V0X21hY19hZGRyZXNzID0gYXJsYW5fbWFjX2FkZHI7CisJZGV2LT50eF90aW1lb3V0ID0gYXJsYW5fdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gMypIWjsKKwkKKwlhcC0+aXJxX3Rlc3RfZG9uZSA9IDA7CisJYXAtPkNvbmYgPSAmYXJsYW5fY29uZltudW1dOworCisJYXAtPkNvbmYtPnByZV9Db21tYW5kX1dhaXQgPSA0MDsKKwlhcC0+Q29uZi0+cnhfdHdlYWsxID0gMzA7CisJYXAtPkNvbmYtPnJ4X3R3ZWFrMiA9IDA7CisKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHZpcnRfdG9fcGh5cygodm9pZCAqKSBkZXYtPm1lbV9zdGFydCksIAorCQkJICAgQVJMQU5fU0hNRU1fU0laRSk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiBlcnI7CisJfQorCWFybGFuX2RldmljZVtudW1dID0gZGV2OworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3NldHVwX2RldmljZSIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhcmxhbl9wcm9iZV9oZXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgbWVtYWRkcikKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqYXAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX3Byb2JlX2hlcmUiKTsKKworCWlmIChhcmxhbl9jaGVja19maW5nZXJwcmludChtZW1hZGRyKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBBcmxhbiBmb3VuZCBhdCAleCwgXG4gIiwgZGV2LT5uYW1lLCAKKwkgICAgICAgKGludCkgdmlydF90b19waHlzKCh2b2lkKiltZW1hZGRyKSk7CisKKwlhcC0+Y2FyZCA9ICh2b2lkICopIG1lbWFkZHI7CisJZGV2LT5tZW1fc3RhcnQgPSBtZW1hZGRyOworCWRldi0+bWVtX2VuZCA9IG1lbWFkZHIgKyBBUkxBTl9TSE1FTV9TSVpFLTE7CisKKwlpZiAoZGV2LT5pcnEgPCAyKQorCXsKKwkJUkVBRFNITShkZXYtPmlycSwgYXAtPmNhcmQtPmlycUxldmVsLCB1X2NoYXIpOworCX0gZWxzZSBpZiAoZGV2LT5pcnEgPT0gMikKKwkJZGV2LT5pcnEgPSA5OworCisJYXJsYW5fcmVhZF9jYXJkX2NvbmZpZ3VyYXRpb24oZGV2KTsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3Byb2JlX2hlcmUiKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFybGFuX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKwlpbnQgcmV0ID0gMDsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9vcGVuIik7CisKKwlyZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgJmFybGFuX2ludGVycnVwdCwgMCwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXQpCisJeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZ2V0IElSUSAlZCAuXG4iLAorCQkJZGV2LT5uYW1lLCBkZXYtPmlycSk7CisJCXJldHVybiByZXQ7CisJfQorCisKKwlwcml2LT5iYWQgPSAwOworCXByaXYtPmxhc3RSZXNldCA9IDA7CisJcHJpdi0+cmVzZXQgPSAwOworCW1lbWNweV9mcm9taW8oZGV2LT5kZXZfYWRkciwgYXJsYW4tPmxhbkNhcmROb2RlSWQsIDYpOworCW1lbXNldChkZXYtPmJyb2FkY2FzdCwgMHhmZiwgNik7CisJZGV2LT50eF9xdWV1ZV9sZW4gPSB0eF9xdWV1ZV9sZW47CisJcHJpdi0+aW50ZXJydXB0X3Byb2Nlc3NpbmdfYWN0aXZlID0gMDsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CisKKwluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKworCXByaXYtPnJlZ2lzdHJhdGlvbkxvc3RDb3VudCA9IDA7CisJcHJpdi0+cmVnaXN0cmF0aW9uTGFzdFNlZW4gPSBqaWZmaWVzOworCXByaXYtPnR4TGFzdCA9IDA7CisJcHJpdi0+dHhfY29tbWFuZF9naXZlbiA9IDA7CisJcHJpdi0+cnhfY29tbWFuZF9naXZlbiA9IDA7CisJCisJcHJpdi0+cmVSZWdpc3RlckV4cCA9IDE7CisJcHJpdi0+dHhfbGFzdF9zZW50ID0gamlmZmllcyAtIDE7CisJcHJpdi0+dHhfbGFzdF9jbGVhcmVkID0gamlmZmllczsKKwlwcml2LT5Db25mLT53cml0ZUVFUFJPTSA9IDA7CisJcHJpdi0+Q29uZi0+cmVnaXN0cmF0aW9uSW50ZXJydXB0cyA9IDE7CisKKwlpbml0X3RpbWVyKCZwcml2LT50aW1lcik7CisJcHJpdi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWiAvIDEwOworCXByaXYtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OworCXByaXYtPnRpbWVyLmZ1bmN0aW9uID0gJmFybGFuX3JlZ2lzdHJhdGlvbl90aW1lcjsJLyogdGltZXIgaGFuZGxlciAqLworCisJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfUE9XRVJVUCB8IEFSTEFOX0NPTU1BTkRfTE9OR19XQUlUX05PVyk7CisJbWRlbGF5KDIwMCk7CisJYWRkX3RpbWVyKCZwcml2LT50aW1lcik7CisKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9vcGVuIik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgYXJsYW5fdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwcmludGsoS0VSTl9FUlIgIiVzOiBhcmxhbiB0cmFuc21pdCB0aW1lZCBvdXQsIGtlcm5lbCBkZWNpZGVkXG4iLCBkZXYtPm5hbWUpOworCS8qIFRyeSB0byByZXN0YXJ0IHRoZSBhZGFwdG9yLiAqLworCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX0NMRUFOX0FORF9SRVNFVCk7CisJLy8gZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJLy8gbmV0aWZfc3RhcnRfcXVldWUgKGRldik7Cit9CisKKworc3RhdGljIGludCBhcmxhbl90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNob3J0IGxlbmd0aDsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fdHgiKTsKKwkKKwlsZW5ndGggPSBFVEhfWkxFTiA8IHNrYi0+bGVuID8gc2tiLT5sZW4gOiBFVEhfWkxFTjsKKwlidWYgPSBza2ItPmRhdGE7CisKKwlpZiAobGVuZ3RoICsgMHgxMiA+IDB4ODAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVFggUklORyBvdmVyZmxvdyBcbiIpOworCQluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCX0KKworCWlmIChhcmxhbl9od190eChkZXYsIGJ1ZiwgbGVuZ3RoKSA9PSAtMSkKKwkJZ290byBiYWRfZW5kOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlhcmxhbl9wcm9jZXNzX2ludGVycnVwdChkZXYpOworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3R4Iik7CisJcmV0dXJuIDA7CisKK2JhZF9lbmQ6CisJYXJsYW5fcHJvY2Vzc19pbnRlcnJ1cHQoZGV2KTsKKwluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3R4Iik7CisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgRG9Ob3RSZVRyYW5zbWl0Q3JhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChUWExBU1QoZGV2KS5sZW5ndGggPCBwcml2LT5Db25mLT5SZVRyYW5zbWl0UGFja2V0TWF4U2l6ZSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGlubGluZSBpbnQgRG9Ob3RXYWl0UmVUcmFuc21pdENyYXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoVFhMQVNUKGRldikubGVuZ3RoIDwgcHJpdi0+Q29uZi0+d2FpdFJlVHJhbnNtaXRQYWNrZXRNYXhTaXplKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFybGFuX3F1ZXVlX3JldHJhbnNtaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fcXVldWVfcmV0cmFuc21pdCIpOworCisJaWYgKERvTm90V2FpdFJlVHJhbnNtaXRDcmFwKGRldikpCisJeworCQkgIGFybGFuX2Ryb3BfdHgoZGV2KTsKKwl9IGVsc2UKKwkJcHJpdi0+UmVUcmFuc21pdFJlcXVlc3RlZCsrOworCisJQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fcXVldWVfcmV0cmFuc21pdCIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgUmV0cnlPckZhaWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiUmV0cnlPckZhaWwiKTsKKworCWlmIChwcml2LT5yZXRyYW5zbWlzc2lvbnMgPiBwcml2LT5Db25mLT5yZXRyaWVzIHx8CisJICAgIERvTm90UmVUcmFuc21pdENyYXAoZGV2KSkKKwl7CisJCWFybGFuX2Ryb3BfdHgoZGV2KTsKKwl9CisJZWxzZSBpZiAocHJpdi0+YmFkIDw9IHByaXYtPkNvbmYtPmZhc3RSZVRyYW5zQ291bnQpCisJeworCQlhcmxhbl9yZXRyYW5zbWl0X25vdyhkZXYpOworCX0KKwllbHNlIGFybGFuX3F1ZXVlX3JldHJhbnNtaXQoZGV2KTsKKworCUFSTEFOX0RFQlVHX0VYSVQoIlJldHJ5T3JGYWlsIik7Cit9CisKKworc3RhdGljIHZvaWQgYXJsYW5fdHhfZG9uZV9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHN0YXR1cykKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fdHhfZG9uZV9pbnRlcnJ1cHQiKTsKKworCXByaXYtPnR4X2xhc3RfY2xlYXJlZCA9IGppZmZpZXM7CisJcHJpdi0+dHhfY29tbWFuZF9naXZlbiA9IDA7CisJc3dpdGNoIChzdGF0dXMpCisJeworCQljYXNlIDE6CisJCXsKKwkJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pCisJCQkJcHJpbnRrKCJhcmxhbiBpbnRyOiB0cmFuc21pdCBPS1xuIik7CisJCQlwcml2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlwcml2LT5iYWQgPSAwOworCQkJcHJpdi0+cmVzZXQgPSAwOworCQkJcHJpdi0+cmV0cmFuc21pc3Npb25zID0gMDsKKwkJCWlmIChwcml2LT5Db25mLT50eF9kZWxheV9tcykKKwkJCXsKKwkJCQlwcml2LT50eF9kb25lX2RlbGF5ZWQgPSBqaWZmaWVzICsgKHByaXYtPkNvbmYtPnR4X2RlbGF5X21zICogSFopIC8gMTAwMCArIDE7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJVFhMQVNUKGRldikub2Zmc2V0ID0gMDsKKwkJCQlpZiAocHJpdi0+dHhMYXN0KQorCQkJCQlwcml2LT50eExhc3QgPSAwOworCQkJCWVsc2UgaWYgKFRYVEFJTChkZXYpLm9mZnNldCkKKwkJCQkJcHJpdi0+dHhMYXN0ID0gMTsKKwkJCQlpZiAoVFhMQVNUKGRldikub2Zmc2V0KQorCQkJCXsKKwkJCQkJYXJsYW5fcmV0cmFuc21pdF9ub3coZGV2KTsKKwkJCQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCQkJfQorCQkJCWlmICghVFhIRUFEKGRldikub2Zmc2V0IHx8ICFUWFRBSUwoZGV2KS5vZmZzZXQpCisJCQkJeworCQkJCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKwkJCisJCWNhc2UgMjoKKwkJeworCQkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikKKwkJCQlwcmludGsoImFybGFuIGludHI6IHRyYW5zbWl0IHRpbWVkIG91dFxuIik7CisJCQlwcml2LT5iYWQgKz0gMTsKKwkJCS8vYXJsYW5fcXVldWVfcmV0cmFuc21pdChkZXYpOworCQkJUmV0cnlPckZhaWwoZGV2KTsKKwkJfQorCQlicmVhazsKKworCQljYXNlIDM6CisJCXsKKwkJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pCisJCQkJcHJpbnRrKCJhcmxhbiBpbnRyOiB0cmFuc21pdCBtYXggcmV0cmllc1xuIik7CisJCQlwcml2LT5iYWQgKz0gMTsKKwkJCXByaXYtPnJlc2V0ID0gMDsKKwkJCS8vYXJsYW5fcXVldWVfcmV0cmFuc21pdChkZXYpOworCQkJUmV0cnlPckZhaWwoZGV2KTsKKwkJfQorCQlicmVhazsKKwkJCisJCWNhc2UgNDoKKwkJeworCQkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikKKwkJCQlwcmludGsoImFybGFuIGludHI6IHRyYW5zbWl0IGFib3J0ZWRcbiIpOworCQkJcHJpdi0+YmFkICs9IDE7CisJCQlhcmxhbl9xdWV1ZV9yZXRyYW5zbWl0KGRldik7CisJCQkvL1JldHJ5T3JGYWlsKGRldik7CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSA1OgorCQl7CisJCQlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKQorCQkJCXByaW50aygiYXJsYW4gaW50cjogdHJhbnNtaXQgbm90IHJlZ2lzdGVyZWRcbiIpOworCQkJcHJpdi0+YmFkICs9IDE7CisJCQkvL2RlYnVnPTEwMTsKKwkJCWFybGFuX3F1ZXVlX3JldHJhbnNtaXQoZGV2KTsKKwkJfQorCQlicmVhazsKKworCQljYXNlIDY6CisJCXsKKwkJCUlGREVCVUcoQVJMQU5fREVCVUdfVFhfQ0hBSU4pIAorCQkJCXByaW50aygiYXJsYW4gaW50cjogdHJhbnNtaXQgZGVzdGluYXRpb24gZnVsbFxuIik7CisJCQlwcml2LT5iYWQgKz0gMTsKKwkJCXByaXYtPnJlc2V0ID0gMDsKKwkJCS8vYXJsYW5fZHJvcF90eChkZXYpOworCQkJYXJsYW5fcXVldWVfcmV0cmFuc21pdChkZXYpOworCQl9CisJCWJyZWFrOworCisJCWNhc2UgNzoKKwkJeworCQkJSUZERUJVRyhBUkxBTl9ERUJVR19UWF9DSEFJTikKKwkJCQlwcmludGsoImFybGFuIGludHI6IHRyYW5zbWl0IHVua25vd24gYWNrXG4iKTsKKwkJCXByaXYtPmJhZCArPSAxOworCQkJcHJpdi0+cmVzZXQgPSAwOworCQkJYXJsYW5fcXVldWVfcmV0cmFuc21pdChkZXYpOworCQl9CisJCWJyZWFrOworCQkKKwkJY2FzZSA4OgorCQl7CisJCQlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKQorCQkJCXByaW50aygiYXJsYW4gaW50cjogdHJhbnNtaXQgZGVzdCBtYWlsIGJveCBmdWxsXG4iKTsKKwkJCXByaXYtPmJhZCArPSAxOworCQkJcHJpdi0+cmVzZXQgPSAwOworCQkJLy9hcmxhbl9kcm9wX3R4KGRldik7CisJCQlhcmxhbl9xdWV1ZV9yZXRyYW5zbWl0KGRldik7CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSA5OgorCQl7CisJCQlJRkRFQlVHKEFSTEFOX0RFQlVHX1RYX0NIQUlOKQorCQkJCXByaW50aygiYXJsYW4gaW50cjogdHJhbnNtaXQgcm9vdCBkZXN0IG5vdCByZWcuXG4iKTsKKwkJCXByaXYtPmJhZCArPSAxOworCQkJcHJpdi0+cmVzZXQgPSAxOworCQkJLy9hcmxhbl9kcm9wX3R4KGRldik7CisJCQlhcmxhbl9xdWV1ZV9yZXRyYW5zbWl0KGRldik7CisJCX0KKwkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICJhcmxhbiBpbnRyOiB0cmFuc21pdCBzdGF0dXMgdW5rbm93blxuIik7CisJCQlwcml2LT5iYWQgKz0gMTsKKwkJCXByaXYtPnJlc2V0ID0gMTsKKwkJCWFybGFuX2Ryb3BfdHgoZGV2KTsKKwkJfQorCX0KKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3R4X2RvbmVfaW50ZXJydXB0Iik7Cit9CisKKworc3RhdGljIHZvaWQgYXJsYW5fcnhfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciByeFN0YXR1cywgdV9zaG9ydCByeE9mZnNldCwgdV9zaG9ydCBwa3RfbGVuKQoreworCWNoYXIgKnNrYnRtcDsKKwlpbnQgaSA9IDA7CisKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKwlzdHJ1Y3QgYXJsYW5fY29uZl9zdHJ1ICpjb25mID0gcHJpdi0+Q29uZjsKKworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX3J4X2ludGVycnVwdCIpOworCS8vIGJ5IHNwZWMsICAgbm90ICAgICAgICAgICAgICAgIFdSSVRFU0hNQihhcmxhbi0+cnhTdGF0dXMsMHgwMCk7CisJLy8gcHJvaGliaXRlZCBoZXJlICAgICAgICAgICAgICBhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9SWCk7CisKKwlpZiAocGt0X2xlbiA8IDEwIHx8IHBrdF9sZW4gPiAyMDQ4KQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGdvdCB0b28gc2hvcnQgb3IgbG9uZyBwYWNrZXQsIGxlbiAlZCBcbiIsIGRldi0+bmFtZSwgcGt0X2xlbik7CisJCXJldHVybjsKKwl9CisJaWYgKHJ4T2Zmc2V0ICsgcGt0X2xlbiA+IDB4MjAwMCkKKwl7CisJCXByaW50aygiJXM6IGdvdCB0b28gbG9uZyBwYWNrZXQsIGxlbiAlZCBvZmZzZXQgJXhcbiIsIGRldi0+bmFtZSwgcGt0X2xlbiwgcnhPZmZzZXQpOworCQlyZXR1cm47CisJfQorCXByaXYtPmluX2J5dGVzICs9IHBrdF9sZW47CisJcHJpdi0+aW5fYnl0ZXMxMCArPSBwa3RfbGVuOworCWlmIChjb25mLT5tZWFzdXJlX3JhdGUgPCAxKQorCQljb25mLT5tZWFzdXJlX3JhdGUgPSAxOworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHByaXYtPmluX3RpbWUgKyBjb25mLT5tZWFzdXJlX3JhdGUgKiBIWikpCisJeworCQljb25mLT5pbl9zcGVlZCA9IHByaXYtPmluX2J5dGVzIC8gY29uZi0+bWVhc3VyZV9yYXRlOworCQlwcml2LT5pbl9ieXRlcyA9IDA7CisJCXByaXYtPmluX3RpbWUgPSBqaWZmaWVzOworCX0KKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBwcml2LT5pbl90aW1lMTAgKyBjb25mLT5tZWFzdXJlX3JhdGUgKiAxMCpIWikpCisJeworCQljb25mLT5pbl9zcGVlZDEwID0gcHJpdi0+aW5fYnl0ZXMxMCAvICgxMCAqIGNvbmYtPm1lYXN1cmVfcmF0ZSk7CisJCXByaXYtPmluX2J5dGVzMTAgPSAwOworCQlwcml2LT5pbl90aW1lMTAgPSBqaWZmaWVzOworCX0KKwlERUJVR1NITSgxLCAiYXJsYW4gcmN2IHBrdCByeFN0YXR1cz0gJWQgIiwgYXJsYW4tPnJ4U3RhdHVzLCB1X2NoYXIpOworCXN3aXRjaCAocnhTdGF0dXMpCisJeworCQljYXNlIDE6CisJCWNhc2UgMjoKKwkJY2FzZSAzOgorCQl7CisJCQkvKiBNYWxsb2MgdXAgbmV3IGJ1ZmZlci4gKi8KKwkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCURFQlVHU0hNKDUwLCAiYXJsYW4gcmVjdiBwa3Qgb2Zmcz0lZFxuIiwgYXJsYW4tPnJ4T2Zmc2V0LCB1X3Nob3J0KTsKKwkJCURFQlVHU0hNKDEsICJhcmxhbiByeEZybVR5cGUgPSAlZCBcbiIsIGFybGFuLT5yeEZybVR5cGUsIHVfY2hhcik7CisJCQlERUJVR1NITSgxLCBLRVJOX0lORk8gImFybGFuIHJ4IHNjcmFtYmxlZCA9ICVkIFxuIiwgYXJsYW4tPnNjcmFtYmxlZCwgdV9jaGFyKTsKKworCQkJLyogaGVyZSB3ZSBkbyBtdWx0aWNhc3QgZmlsdGVyaW5nIHRvIGF2b2lkIHNsb3cgOC1iaXQgbWVtY29weSAqLworI2lmZGVmIEFSTEFOX01VTFRJQ0FTVAorCQkJaWYgKCEoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgJiYKKwkJCQkhKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgJiYKKwkJCQlkZXYtPm1jX2xpc3QpCisJCQl7CisJCQkJY2hhciBod19kc3RfYWRkcls2XTsKKwkJCQlzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSA9IGRldi0+bWNfbGlzdDsKKwkJCQlpbnQgaTsKKworCQkJCW1lbWNweV9mcm9taW8oaHdfZHN0X2FkZHIsIGFybGFuLT51bHRpbWF0ZURlc3RBZGRyZXNzLCA2KTsKKwkJCQlpZiAoaHdfZHN0X2FkZHJbMF0gPT0gMHgwMSkKKwkJCQl7CisJCQkJCWlmIChtZGVidWcpCisJCQkJCQlpZiAoaHdfZHN0X2FkZHJbMV0gPT0gMHgwMCkKKwkJCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzIG1jYXN0IDB4MDEwMCBcbiIsIGRldi0+bmFtZSk7CisJCQkJCQllbHNlIGlmIChod19kc3RfYWRkclsxXSA9PSAweDQwKQorCQkJCQkJCXByaW50ayhLRVJOX0VSUiAiJXMgbS9iY2FzdCAweDAxNDAgXG4iLCBkZXYtPm5hbWUpOworCQkJCQl3aGlsZSAoZG1pKQorCQkJCQl7CQkJCQkJCWlmIChkbWktPmRtaV9hZGRybGVuID09IDYpCisJCQkJCQl7CisJCQkJCQkJaWYgKGFybGFuX2RlYnVnICYgQVJMQU5fREVCVUdfSEVBREVSX0RVTVApCisJCQkJCQkJCXByaW50ayhLRVJOX0VSUiAiJXMgbWNsICUyeDolMng6JTJ4OiUyeDolMng6JTJ4IFxuIiwgZGV2LT5uYW1lLAorCQkJCQkJCQkJCSBkbWktPmRtaV9hZGRyWzBdLCBkbWktPmRtaV9hZGRyWzFdLCBkbWktPmRtaV9hZGRyWzJdLAorCQkJCQkJCQkJCSBkbWktPmRtaV9hZGRyWzNdLCBkbWktPmRtaV9hZGRyWzRdLCBkbWktPmRtaV9hZGRyWzVdKTsKKwkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJCQkJCQlpZiAoZG1pLT5kbWlfYWRkcltpXSAhPSBod19kc3RfYWRkcltpXSkKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCWlmIChpID09IDYpCisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGludmFsaWQgbXVsdGljYXN0IGFkZHJlc3MgbGVuZ3RoIGdpdmVuLlxuIiwgZGV2LT5uYW1lKTsKKwkJCQkJCWRtaSA9IGRtaS0+bmV4dDsKKwkJCQkJfQorCQkJCQkvKiB3ZSByZWFjaCBoZXJlIGlmIG11bHRpY2FzdCBmaWx0ZXJpbmcgaXMgb24gYW5kIHBhY2tldCAKKwkJCQkJICogaXMgbXVsdGljYXN0IGFuZCBub3QgZm9yIHJlY2VpdmUgKi8KKwkJCQkJZ290byBlbmRfb2ZfaW50ZXJydXB0OworCQkJCX0KKwkJCX0KKyNlbmRpZgkJCQkvLyBBUkxBTl9NVUxUSUNBU1QKKwkJCS8qIG11bHRpY2FzdCBmaWx0ZXJpbmcgZW5kcyBoZXJlICovCisJCQlwa3RfbGVuICs9IEFSTEFOX0ZBS0VfSERSX0xFTjsKKworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuICsgNCk7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogTWVtb3J5IHNxdWVlemUsIGRyb3BwaW5nIHBhY2tldC5cbiIsIGRldi0+bmFtZSk7CisJCQkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCWJyZWFrOworCQkJfQorCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJc2tidG1wID0gc2tiX3B1dChza2IsIHBrdF9sZW4pOworCisJCQltZW1jcHlfZnJvbWlvKHNrYnRtcCArIEFSTEFOX0ZBS0VfSERSX0xFTiwgKChjaGFyIF9faW9tZW0gKikgYXJsYW4pICsgcnhPZmZzZXQsIHBrdF9sZW4gLSBBUkxBTl9GQUtFX0hEUl9MRU4pOworCQkJbWVtY3B5X2Zyb21pbyhza2J0bXAsIGFybGFuLT51bHRpbWF0ZURlc3RBZGRyZXNzLCA2KTsKKwkJCW1lbWNweV9mcm9taW8oc2tidG1wICsgNiwgYXJsYW4tPnJ4U3JjLCA2KTsKKwkJCVdSSVRFU0hNQihhcmxhbi0+cnhTdGF0dXMsIDB4MDApOworCQkJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfUlgpOworCisJCQlJRkRFQlVHKEFSTEFOX0RFQlVHX0hFQURFUl9EVU1QKQorCQkJeworCQkJCWNoYXIgaW1tZWREZXN0QWRkcmVzc1s2XTsKKwkJCQljaGFyIGltbWVkU3JjQWRkcmVzc1s2XTsKKwkJCQltZW1jcHlfZnJvbWlvKGltbWVkRGVzdEFkZHJlc3MsIGFybGFuLT5pbW1lZERlc3RBZGRyZXNzLCA2KTsKKwkJCQltZW1jcHlfZnJvbWlvKGltbWVkU3JjQWRkcmVzcywgYXJsYW4tPmltbWVkU3JjQWRkcmVzcywgNik7CisKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyB0ICUyeDolMng6JTJ4OiUyeDolMng6JTJ4IGYgJTJ4OiUyeDolMng6JTJ4OiUyeDolMnggaW1kICUyeDolMng6JTJ4OiUyeDolMng6JTJ4IGltcyAlMng6JTJ4OiUyeDolMng6JTJ4OiUyeFxuIiwgZGV2LT5uYW1lLAorCQkJCQkodW5zaWduZWQgY2hhcikgc2tidG1wWzBdLCAodW5zaWduZWQgY2hhcikgc2tidG1wWzFdLCAodW5zaWduZWQgY2hhcikgc2tidG1wWzJdLCAodW5zaWduZWQgY2hhcikgc2tidG1wWzNdLAorCQkJCQkodW5zaWduZWQgY2hhcikgc2tidG1wWzRdLCAodW5zaWduZWQgY2hhcikgc2tidG1wWzVdLCAodW5zaWduZWQgY2hhcikgc2tidG1wWzZdLCAodW5zaWduZWQgY2hhcikgc2tidG1wWzddLAorCQkJCQkodW5zaWduZWQgY2hhcikgc2tidG1wWzhdLCAodW5zaWduZWQgY2hhcikgc2tidG1wWzldLCAodW5zaWduZWQgY2hhcikgc2tidG1wWzEwXSwgKHVuc2lnbmVkIGNoYXIpIHNrYnRtcFsxMV0sCisJCQkJCWltbWVkRGVzdEFkZHJlc3NbMF0sIGltbWVkRGVzdEFkZHJlc3NbMV0sIGltbWVkRGVzdEFkZHJlc3NbMl0sCisJCQkJCWltbWVkRGVzdEFkZHJlc3NbM10sIGltbWVkRGVzdEFkZHJlc3NbNF0sIGltbWVkRGVzdEFkZHJlc3NbNV0sCisJCQkJCWltbWVkU3JjQWRkcmVzc1swXSwgaW1tZWRTcmNBZGRyZXNzWzFdLCBpbW1lZFNyY0FkZHJlc3NbMl0sCisJCQkJCWltbWVkU3JjQWRkcmVzc1szXSwgaW1tZWRTcmNBZGRyZXNzWzRdLCBpbW1lZFNyY0FkZHJlc3NbNV0pOworCQkJfQorCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCUlGREVCVUcoQVJMQU5fREVCVUdfSEVBREVSX0RVTVApCisJCQkJaWYgKHNrYi0+cHJvdG9jb2wgIT0gMHg2MDggJiYgc2tiLT5wcm90b2NvbCAhPSAweDgpCisJCQkJeworCQkJCQlmb3IgKGkgPSAwOyBpIDw9IDIyOyBpKyspCisJCQkJCQlwcmludGsoIiUwMng6IiwgKHVfY2hhcikgc2tidG1wW2kgKyAxMl0pOworCQkJCQlwcmludGsoS0VSTl9FUlIgIlxuIik7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFybGFuIGtlcm5lbCBwa3QgdHlwZSB0cmFucyAleCBcbiIsIHNrYi0+cHJvdG9jb2wpOworCQkJCX0KKwkJCW5ldGlmX3J4KHNrYik7CisJCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOworCQkJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJfQorCQlicmVhazsKKwkJCisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgImFybGFuIGludHI6IHJlY2VpdmVkIHVua25vd24gc3RhdHVzXG4iKTsKKwkJCXByaXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWJyZWFrOworCX0KKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9yeF9pbnRlcnJ1cHQiKTsKK30KKworc3RhdGljIHZvaWQgYXJsYW5fcHJvY2Vzc19pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKwl1X2NoYXIgcnhTdGF0dXMgPSBSRUFEU0hNQihhcmxhbi0+cnhTdGF0dXMpOworCXVfY2hhciB0eFN0YXR1cyA9IFJFQURTSE1CKGFybGFuLT50eFN0YXR1cyk7CisJdV9zaG9ydCByeE9mZnNldCA9IFJFQURTSE1TKGFybGFuLT5yeE9mZnNldCk7CisJdV9zaG9ydCBwa3RfbGVuID0gUkVBRFNITVMoYXJsYW4tPnJ4TGVuZ3RoKTsKKwlpbnQgaW50ZXJydXB0X2NvdW50ID0gMDsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9wcm9jZXNzX2ludGVycnVwdCIpOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgKHZvaWQgKikgJnByaXYtPmludGVycnVwdF9wcm9jZXNzaW5nX2FjdGl2ZSkpCisJeworCQlpZiAoYXJsYW5fZGVidWcgJiBBUkxBTl9ERUJVR19DSEFJTl9MT0NLUykKKwkJCXByaW50ayhLRVJOX0VSUiAiaW50ZXJydXB0IGNoYWluIHJlZW50ZXJpbmcgXG4iKTsKKwkJZ290byBlbmRfaW50X3Byb2Nlc3M7CisJfQorCXdoaWxlICgocnhTdGF0dXMgfHwgdHhTdGF0dXMgfHwgcHJpdi0+aW50ZXJydXB0X2Fja19yZXF1ZXN0ZWQpCisJCQkmJiAoaW50ZXJydXB0X2NvdW50IDwgNSkpCisJeworCQlpZiAocnhTdGF0dXMpCisJCQlwcml2LT5sYXN0X3J4X2ludF9hY2tfdGltZSA9IGppZmZpZXM7CisKKwkJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfSU5UX0FDSyk7CisJCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX0lOVF9FTkFCTEUpOworCQkKKwkJSUZERUJVRyhBUkxBTl9ERUJVR19JTlRFUlJVUFQpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAgZ290IElSUSByeCAleCB0eCAleCBjb21tICV4IHJ4T2ZmICV4IHJ4TGVuICV4IFxuIiwKKwkJCQkJZGV2LT5uYW1lLCByeFN0YXR1cywgdHhTdGF0dXMsIFJFQURTSE1CKGFybGFuLT5jb21tYW5kQnl0ZSksCisJCQkJCXJ4T2Zmc2V0LCBwa3RfbGVuKTsKKworCQlpZiAocnhTdGF0dXMgPT0gMCAmJiB0eFN0YXR1cyA9PSAwKQorCQl7CisJCQlpZiAocHJpdi0+aXJxX3Rlc3RfZG9uZSkKKwkJCXsKKwkJCQlpZiAoIXJlZ2lzdHJhdGlvbkJhZChkZXYpKQorCQkJCQlJRkRFQlVHKEFSTEFOX0RFQlVHX0lOVEVSUlVQVCkgcHJpbnRrKEtFUk5fRVJSICIlcyB1bmtub3duIGludGVycnVwdChub3A/IHJlZ0xvc3QgPykgcmVhc29uIHR4ICVkIHJ4ICVkICIsCisJCQkJCQkJCQkJICAgIGRldi0+bmFtZSwgdHhTdGF0dXMsIHJ4U3RhdHVzKTsKKwkJCX0gZWxzZSB7CisJCQkJSUZERUJVRyhBUkxBTl9ERUJVR19JTlRFUlJVUFQpCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzIGlycSAkJWQgdGVzdCBPSyBcbiIsIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCisJCQl9CisJCQlwcml2LT5pbnRlcnJ1cHRfYWNrX3JlcXVlc3RlZCA9IDA7CisJCQlnb3RvIGVuZHM7CisJCX0KKwkJaWYgKHR4U3RhdHVzICE9IDApCisJCXsKKwkJCVdSSVRFU0hNQihhcmxhbi0+dHhTdGF0dXMsIDB4MDApOworCQkJYXJsYW5fdHhfZG9uZV9pbnRlcnJ1cHQoZGV2LCB0eFN0YXR1cyk7CisJCQlnb3RvIGVuZHM7CisJCX0KKwkJaWYgKHJ4U3RhdHVzID09IDEgfHwgcnhTdGF0dXMgPT0gMikKKwkJewkJLyogYSBwYWNrZXQgd2FpdGluZyAqLworCQkJYXJsYW5fcnhfaW50ZXJydXB0KGRldiwgcnhTdGF0dXMsIHJ4T2Zmc2V0LCBwa3RfbGVuKTsKKwkJCWdvdG8gZW5kczsKKwkJfQorCQlpZiAocnhTdGF0dXMgPiAyICYmIHJ4U3RhdHVzIDwgMHhmZikKKwkJeworCQkJV1JJVEVTSE1CKGFybGFuLT5yeFN0YXR1cywgMHgwMCk7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzIHVua25vd24gcnhTdGF0dXMgcmVhc29uIHR4ICVkIHJ4ICVkICIsCisJCQkJZGV2LT5uYW1lLCB0eFN0YXR1cywgcnhTdGF0dXMpOworCQkJZ290byBlbmRzOworCQl9CisJCWlmIChyeFN0YXR1cyA9PSAweGZmKQorCQl7CisJCQlXUklURVNITUIoYXJsYW4tPnJ4U3RhdHVzLCAweDAwKTsKKwkJCWFybGFuX2NvbW1hbmQoZGV2LCBBUkxBTl9DT01NQU5EX1JYKTsKKwkJCWlmIChyZWdpc3RyYXRpb25CYWQoZGV2KSkKKwkJCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJCQlpZiAoIXJlZ2lzdHJhdGlvbkJhZChkZXYpKQorCQkJeworCQkJCXByaXYtPnJlZ2lzdHJhdGlvbkxhc3RTZWVuID0gamlmZmllczsKKwkJCQlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSAmJiAhcHJpdi0+dW5kZXJfcmVzZXQgJiYgIXByaXYtPnVuZGVyX2NvbmZpZykKKwkJCQkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwkJCX0KKwkJCWdvdG8gZW5kczsKKwkJfQorZW5kczoKKworCQlhcmxhbl9jb21tYW5kX3Byb2Nlc3MoZGV2KTsKKworCQlyeFN0YXR1cyA9IFJFQURTSE1CKGFybGFuLT5yeFN0YXR1cyk7CisJCXR4U3RhdHVzID0gUkVBRFNITUIoYXJsYW4tPnR4U3RhdHVzKTsKKwkJcnhPZmZzZXQgPSBSRUFEU0hNUyhhcmxhbi0+cnhPZmZzZXQpOworCQlwa3RfbGVuID0gUkVBRFNITVMoYXJsYW4tPnJ4TGVuZ3RoKTsKKworCisJCXByaXYtPmlycV90ZXN0X2RvbmUgPSAxOworCisJCWludGVycnVwdF9jb3VudCsrOworCX0KKwlwcml2LT5pbnRlcnJ1cHRfcHJvY2Vzc2luZ19hY3RpdmUgPSAwOworCitlbmRfaW50X3Byb2Nlc3M6CisJYXJsYW5fY29tbWFuZF9wcm9jZXNzKGRldik7CisKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9wcm9jZXNzX2ludGVycnVwdCIpOworCXJldHVybjsKK30KKworc3RhdGljIGlycXJldHVybl90IGFybGFuX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvbGF0aWxlIHN0cnVjdCBhcmxhbl9zaG1lbSBfX2lvbWVtICphcmxhbiA9IHByaXYtPmNhcmQ7CisJdV9jaGFyIHJ4U3RhdHVzID0gUkVBRFNITUIoYXJsYW4tPnJ4U3RhdHVzKTsKKwl1X2NoYXIgdHhTdGF0dXMgPSBSRUFEU0hNQihhcmxhbi0+dHhTdGF0dXMpOworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX2ludGVycnVwdCIpOworCisKKwlpZiAoIXJ4U3RhdHVzICYmICF0eFN0YXR1cykKKwkJcHJpdi0+aW50ZXJydXB0X2Fja19yZXF1ZXN0ZWQrKzsKKworCWFybGFuX3Byb2Nlc3NfaW50ZXJydXB0KGRldik7CisJCisJcHJpdi0+aXJxX3Rlc3RfZG9uZSA9IDE7CisKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9pbnRlcnJ1cHQiKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKK30KKworCitzdGF0aWMgaW50IGFybGFuX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX2Nsb3NlIik7CisKKwlkZWxfdGltZXJfc3luYygmcHJpdi0+dGltZXIpOworCisJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfUE9XRVJET1dOKTsKKworCUlGREVCVUcoQVJMQU5fREVCVUdfU1RBUlRVUCkKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogQ2xvc2luZyBkZXZpY2VcbiIsIGRldi0+bmFtZSk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9jbG9zZSIpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQVJMQU5fREVCVUdHSU5HCitzdGF0aWMgbG9uZyBhbGlnbkxvbmcodm9sYXRpbGUgdV9jaGFyICogcHRyKQoreworCWxvbmcgcmV0OworCW1lbWNweV9mcm9taW8oJnJldCwgKHZvaWQgKikgcHRyLCA0KTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKKy8qCisgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGlzdGljcy4KKyAqIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IgY2xvc2VkLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYXJsYW5fc3RhdGlzdGljcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYXJsYW5fc2htZW0gX19pb21lbSAqYXJsYW4gPSBwcml2LT5jYXJkOworCisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fc3RhdGlzdGljcyIpOworCisJLyogVXBkYXRlIHRoZSBzdGF0aXN0aWNzIGZyb20gdGhlIGRldmljZSByZWdpc3RlcnMuICovCisKKwlSRUFEU0hNKHByaXYtPnN0YXRzLmNvbGxpc2lvbnMsIGFybGFuLT5udW1SZVRyYW5zbWlzc2lvbnMsIHVfaW50KTsKKwlSRUFEU0hNKHByaXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMsIGFybGFuLT5udW1DUkNFcnJvcnMsIHVfaW50KTsKKwlSRUFEU0hNKHByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQsIGFybGFuLT5udW1GcmFtZXNEaXNjYXJkZWQsIHVfaW50KTsKKwlSRUFEU0hNKHByaXYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzLCBhcmxhbi0+bnVtUlhCdWZmZXJPdmVyZmxvd3MsIHVfaW50KTsKKwlSRUFEU0hNKHByaXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycywgYXJsYW4tPm51bVJlY2VpdmVGcmFtZXNMb3N0LCB1X2ludCk7CisJUkVBRFNITShwcml2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycywgYXJsYW4tPm51bVJYT3ZlcnJ1bnMsIHVfaW50KTsKKwlSRUFEU0hNKHByaXYtPnN0YXRzLnJ4X3BhY2tldHMsIGFybGFuLT5udW1EYXRhZ3JhbXNSZWNlaXZlZCwgdV9pbnQpOworCVJFQURTSE0ocHJpdi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMsIGFybGFuLT5udW1BYm9ydEVycm9ycywgdV9pbnQpOworCVJFQURTSE0ocHJpdi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMsIGFybGFuLT5udW1TdGF0dXNUaW1lb3V0cywgdV9pbnQpOworCVJFQURTSE0ocHJpdi0+c3RhdHMudHhfZHJvcHBlZCwgYXJsYW4tPm51bURhdGFncmFtc0Rpc2NhcmRlZCwgdV9pbnQpOworCVJFQURTSE0ocHJpdi0+c3RhdHMudHhfZmlmb19lcnJvcnMsIGFybGFuLT5udW1UWFVuZGVycnVucywgdV9pbnQpOworCVJFQURTSE0ocHJpdi0+c3RhdHMudHhfcGFja2V0cywgYXJsYW4tPm51bURhdGFncmFtc1RyYW5zbWl0dGVkLCB1X2ludCk7CisJUkVBRFNITShwcml2LT5zdGF0cy50eF93aW5kb3dfZXJyb3JzLCBhcmxhbi0+bnVtSG9sZE9mZnMsIHVfaW50KTsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3N0YXRpc3RpY3MiKTsKKworCXJldHVybiAmcHJpdi0+c3RhdHM7Cit9CisKKworc3RhdGljIHZvaWQgYXJsYW5fc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYXJsYW5fc2htZW0gX19pb21lbSAqYXJsYW4gPSBwcml2LT5jYXJkOworCXN0cnVjdCBhcmxhbl9jb25mX3N0cnUgKmNvbmYgPSBwcml2LT5Db25mOworCWludCBib2FyZF9jb25mX25lZWRlZCA9IDA7CisKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJhcmxhbl9zZXRfbXVsdGljYXN0Iik7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCXsKKwkJdW5zaWduZWQgY2hhciByZWNNb2RlOworCQlSRUFEU0hNKHJlY01vZGUsIGFybGFuLT5yZWNlaXZlTW9kZSwgdV9jaGFyKTsKKwkJY29uZi0+cmVjZWl2ZU1vZGUgPSAoQVJMQU5fUkNWX1BST01JU0MgfCBBUkxBTl9SQ1ZfQ09OVFJPTCk7CisJCWlmIChjb25mLT5yZWNlaXZlTW9kZSAhPSByZWNNb2RlKQorCQkJYm9hcmRfY29uZl9uZWVkZWQgPSAxOworCX0KKwllbHNlCisJeworCQkvKiB0dXJuIG9mZiBwcm9taXNjdW91cyBtb2RlICAqLworCQl1bnNpZ25lZCBjaGFyIHJlY01vZGU7CisJCVJFQURTSE0ocmVjTW9kZSwgYXJsYW4tPnJlY2VpdmVNb2RlLCB1X2NoYXIpOworCQljb25mLT5yZWNlaXZlTW9kZSA9IEFSTEFOX1JDVl9DTEVBTiB8IEFSTEFOX1JDVl9DT05UUk9MOworCQlpZiAoY29uZi0+cmVjZWl2ZU1vZGUgIT0gcmVjTW9kZSkKKwkJCWJvYXJkX2NvbmZfbmVlZGVkID0gMTsKKwl9CisJaWYgKGJvYXJkX2NvbmZfbmVlZGVkKQorCQlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9DT05GKTsKKworCUFSTEFOX0RFQlVHX0VYSVQoImFybGFuX3NldF9tdWx0aWNhc3QiKTsKK30KKworCitzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCBhcmxhbl9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBlcnI7CisJaW50IG07CisKKwlBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fcHJvYmUiKTsKKworCWlmIChhcmxhbnNfZm91bmQgPT0gTUFYX0FSTEFOUykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwkvKiAKKwkgKiBSZXNlcnZlIHNwYWNlIGZvciBsb2NhbCBkYXRhIGFuZCBhIGNvcHkgb2YgdGhlIHNoYXJlZCBtZW1vcnkKKwkgKiB0aGF0IGlzIHVzZWQgYnkgdGhlIC9wcm9jIGludGVyZmFjZS4KKwkgKi8KKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGFybGFuX3ByaXZhdGUpCisJCQkgICAgICsgc2l6ZW9mKHN0cnVjdCBhcmxhbl9zaG1lbSkpOworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCWlmICh1bml0ID49IDApIHsKKwkJc3ByaW50ZihkZXYtPm5hbWUsICJldGglZCIsIHVuaXQpOworCQluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCQkKKwkJaWYgKGRldi0+bWVtX3N0YXJ0KSB7CisJCQlpZiAoYXJsYW5fcHJvYmVfaGVyZShkZXYsIGRldi0+bWVtX3N0YXJ0KSA9PSAwKQorCQkJCWdvdG8gZm91bmQ7CisJCQlnb3RvIG5vdF9mb3VuZDsKKwkJfQorCQkJCisJfQorCisKKwlmb3IgKG0gPSAoaW50KXBoeXNfdG9fdmlydChsYXN0Rm91bmRBdCkgKyBBUkxBTl9TSE1FTV9TSVpFOyAKKwkgICAgIG0gPD0gKGludClwaHlzX3RvX3ZpcnQoMHhERTAwMCk7IAorCSAgICAgbSArPSBBUkxBTl9TSE1FTV9TSVpFKQorCXsKKwkJaWYgKGFybGFuX3Byb2JlX2hlcmUoZGV2LCBtKSA9PSAwKQorCQl7CisJCQlsYXN0Rm91bmRBdCA9IChpbnQpdmlydF90b19waHlzKCh2b2lkKiltKTsKKwkJCWdvdG8gZm91bmQ7CisJCX0KKwl9CisKKwlpZiAobGFzdEZvdW5kQXQgPT0gMHhiZTAwMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJhcmxhbjogTm8gQXJsYW4gZGV2aWNlcyBmb3VuZCBcbiIpOworCisgbm90X2ZvdW5kOgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKyBmb3VuZDoKKwllcnIgPSBhcmxhbl9zZXR1cF9kZXZpY2UoZGV2LCBhcmxhbnNfZm91bmQpOworCWlmIChlcnIpCisJCWRldiA9IEVSUl9QVFIoZXJyKTsKKwllbHNlIGlmICghYXJsYW5zX2ZvdW5kKyspCisJCXByaW50ayhLRVJOX0lORk8gIkFybGFuIGRyaXZlciAlc1xuIiwgYXJsYW5fdmVyc2lvbik7CisKKwlyZXR1cm4gZGV2OworfQorCisjaWZkZWYgIE1PRFVMRQoraW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IGkgPSAwOworCisJQVJMQU5fREVCVUdfRU5UUlkoImluaXRfbW9kdWxlIik7CisKKwlpZiAoY2hhbm5lbFNldCAhPSBjaGFubmVsU2V0VU5LTk9XTiB8fCBjaGFubmVsTnVtYmVyICE9IGNoYW5uZWxOdW1iZXJVTktOT1dOIHx8IHN5c3RlbUlkICE9IHN5c3RlbUlkVU5LTk9XTikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0FSTEFOUzsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhcmxhbl9wcm9iZShpKTsKKworCQlpZiAoSVNfRVJSKGRldikpIAorCQkJcmV0dXJuIFBUUl9FUlIoZGV2KTsKKwl9CisJaW5pdF9hcmxhbl9wcm9jKCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiQXJsYW4gZHJpdmVyICVzXG4iLCBhcmxhbl92ZXJzaW9uKTsKKwlBUkxBTl9ERUJVR19FWElUKCJpbml0X21vZHVsZSIpOworCXJldHVybiAwOworfQorCisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgaSA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCUFSTEFOX0RFQlVHX0VOVFJZKCJjbGVhbnVwX21vZHVsZSIpOworCisJSUZERUJVRyhBUkxBTl9ERUJVR19TSFVURE9XTikKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYXJsYW46IHVubG9hZGluZyBtb2R1bGVcbiIpOworCisJY2xlYW51cF9hcmxhbl9wcm9jKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0FSTEFOUzsgaSsrKQorCXsKKwkJZGV2ID0gYXJsYW5fZGV2aWNlW2ldOworCQlpZiAoZGV2KSB7CisJCQlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9QT1dFUkRPV04gKTsKKworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbih2aXJ0X3RvX3BoeXMoKHZvaWQgKikgZGV2LT5tZW1fc3RhcnQpLCAKKwkJCQkJICAgQVJMQU5fU0hNRU1fU0laRSk7CisJCQlmcmVlX25ldGRldihkZXYpOworCQkJYXJsYW5fZGV2aWNlW2ldID0gTlVMTDsKKwkJfQorCX0KKworCUFSTEFOX0RFQlVHX0VYSVQoImNsZWFudXBfbW9kdWxlIik7Cit9CisKKworI2VuZGlmCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hcmxhbi1wcm9jLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hcmxhbi1wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJjY2E1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FybGFuLXByb2MuYwpAQCAtMCwwICsxLDEyNjIgQEAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJhcmxhbi5oIgorCisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCisvKiB2b2lkIGVuYWJsZVJlY2VpdmUoc3RydWN0IG5ldF9kZXZpY2UqIGRldik7CisqLworCisKKworI2RlZmluZSBBUkxBTl9TVFJfU0laRSAJMHgyZmYwCisjZGVmaW5lIERFVl9BUkxBTl9JTkZPIAkxCisjZGVmaW5lIERFVl9BUkxBTiAJMQorI2RlZmluZSBTQVJMRyh0eXBlLHZhcikge1wKKwlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvK3BvcywgIiVzXHQ9XHQweCV4XG4iLCAjdmFyLCBSRUFEU0hNQihwcml2YS0+Y2FyZC0+dmFyKSk7CVwKKwl9CisKKyNkZWZpbmUgU0FSTEJOKHR5cGUsdmFyLG5uKSB7XAorCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8rcG9zLCAiJXNcdD1cdDB4IiwjdmFyKTtcCisJZm9yIChpPTA7IGkgPCBubjsgaSsrICkgcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbytwb3MsICIlMDJ4IixSRUFEU0hNQihwcml2YS0+Y2FyZC0+dmFyW2ldKSk7XAorCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8rcG9zLCAiXG4iKTsJXAorCX0KKworI2RlZmluZSBTQVJMQk5wbG4odHlwZSx2YXIsbm4pIHtcCisJZm9yIChpPTA7IGkgPCBubjsgaSsrICkgcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbytwb3MsICIlMDJ4IixSRUFEU0hNQihwcml2YS0+Y2FyZC0+dmFyW2ldKSk7XAorCX0KKworI2RlZmluZSBTQVJMU1RSKHZhcixubikge1wKKwljaGFyIHRtcFN0cls0MDBdO1wKKwlpbnQgIHRtcExuID0gbm47XAorCWlmIChubiA+IDM5OSApIHRtcExuID0gMzk5OyBcCisJbWVtY3B5KHRtcFN0ciwoY2hhciAqKSBwcml2YS0+Y29uZi0+dmFyLHRtcExuKTtcCisJdG1wU3RyW3RtcExuXSA9IDA7IFwKKwlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvK3BvcywgIiVzXHQ9XHQlcyBcbiIsI3Zhcixwcml2YS0+Y29uZi0+dmFyKTtcCisJfQorCisjZGVmaW5lIFNBUkxVQyh2YXIpICAJU0FSTEcodV9jaGFyLCB2YXIpCisjZGVmaW5lIFNBUkxVQ04odmFyLG5uKSBTQVJMQk4odV9jaGFyLHZhciwgbm4pCisjZGVmaW5lIFNBUkxVUyh2YXIpCVNBUkxHKHVfc2hvcnQsIHZhcikKKyNkZWZpbmUgU0FSTFVTTih2YXIsbm4pCVNBUkxCTih1X3Nob3J0LHZhciwgbm4pCisjZGVmaW5lIFNBUkxVSSh2YXIpCVNBUkxHKHVfaW50LCB2YXIpCisKKyNkZWZpbmUgU0FSTFVTQSh2YXIpIHtcCisJdV9zaG9ydCB0bXBWYXI7XAorCW1lbWNweSgmdG1wVmFyLCAoc2hvcnQgKikgcHJpdmEtPmNvbmYtPnZhciwyKTsgXAorCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8rcG9zLCAiJXNcdD1cdDB4JXhcbiIsI3ZhciwgdG1wVmFyKTtcCit9CisKKyNkZWZpbmUgU0FSTFVJQSh2YXIpIHtcCisJdV9pbnQgdG1wVmFyO1wKKwltZW1jcHkoJnRtcFZhciwgKGludCogKXByaXZhLT5jb25mLT52YXIsNCk7IFwKKwlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvK3BvcywgIiVzXHQ9XHQweCV4XG4iLCN2YXIsIHRtcFZhcik7XAorfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICphcmxhbl9kaWFnbm9zdGljX2luZm9fc3RyaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKwl1X2NoYXIgZGlhZ25vc3RpY0luZm87CisKKwlSRUFEU0hNKGRpYWdub3N0aWNJbmZvLCBhcmxhbi0+ZGlhZ25vc3RpY0luZm8sIHVfY2hhcik7CisKKwlzd2l0Y2ggKGRpYWdub3N0aWNJbmZvKQorCXsKKwkJY2FzZSAweEZGOgorCQkJcmV0dXJuICJEaWFnbm9zdGljIGluZm8gaXMgT0siOworCQljYXNlIDB4RkU6CisJCQlyZXR1cm4gIkVSUk9SIEVQUk9NIENoZWNrc3VtIGVycm9yICI7CisJCWNhc2UgMHhGRDoKKwkJCXJldHVybiAiRVJST1IgTG9jYWwgUmFtIFRlc3QgRmFpbGVkICI7CisJCWNhc2UgMHhGQzoKKwkJCXJldHVybiAiRVJST1IgU0NDIGZhaWx1cmUgIjsKKwkJY2FzZSAweEZCOgorCQkJcmV0dXJuICJFUlJPUiBCYWNrQm9uZSBmYWlsdXJlICI7CisJCWNhc2UgMHhGQToKKwkJCXJldHVybiAiRVJST1IgdHJhbnNjZWl2ZXIgbm90IGZvdW5kICI7CisJCWNhc2UgMHhGOToKKwkJCXJldHVybiAiRVJST1Igbm8gbW9yZSBhZGRyZXNzIHNwYWNlICI7CisJCWNhc2UgMHhGODoKKwkJCXJldHVybiAiRVJST1IgQ2hlY2tzdW0gZXJyb3IgICI7CisJCWNhc2UgMHhGNzoKKwkJCXJldHVybiAiRVJST1IgTWlzc2luZyBTUyBDb2RlIjsKKwkJY2FzZSAweEY2OgorCQkJcmV0dXJuICJFUlJPUiBJbnZhbGlkIGNvbmZpZyBmb3JtYXQiOworCQljYXNlIDB4RjU6CisJCQlyZXR1cm4gIkVSUk9SIFJlc2VydmVkIGVycm9yY29kZSBGNSI7CisJCWNhc2UgMHhGNDoKKwkJCXJldHVybiAiRVJST1IgSW52YWxpZCBzcHJlYWRpbmcgY29kZS9jaGFubmVsIG51bWJlciI7CisJCWNhc2UgMHhGMzoKKwkJCXJldHVybiAiRVJST1IgTG9hZCBDb2RlIEVycm9yIjsKKwkJY2FzZSAweEYyOgorCQkJcmV0dXJuICJFUlJPUiBSZXNlcnZlciBlcnJvcmNvZGUgRjIgIjsKKwkJY2FzZSAweEYxOgorCQkJcmV0dXJuICJFUlJPUiBJbnZhbGlkIGNvbW1hbmQgcmVjZWl2ZWMgYnkgTEFOIGNhcmQgIjsKKwkJY2FzZSAweEYwOgorCQkJcmV0dXJuICJFUlJPUiBJbnZhbGlkIHBhcmFtZXRlciBmb3VuZCBpbiBjb21tYW5kICI7CisJCWNhc2UgMHhFRjoKKwkJCXJldHVybiAiRVJST1IgT24tY2hpcCB0aW1lciBmYWlsdXJlICI7CisJCWNhc2UgMHhFRToKKwkJCXJldHVybiAiRVJST1IgVDQxMCB0aW1lciBmYWlsdXJlICI7CisJCWNhc2UgMHhFRDoKKwkJCXJldHVybiAiRVJST1IgVG9vIE1hbnkgVHhFbmFibGUgY29tbWFuZHMgIjsKKwkJY2FzZSAweEVDOgorCQkJcmV0dXJuICJFUlJPUiBFRVBST00gZXJyb3Igb24gcmFkaW8gbW9kdWxlICI7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gIkVSUk9SIHVua25vd24gRGlhZ25vc3RpYyBpbmZvIHJlcGx5IGNvZGUgIjsKKwkgIH0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmFybGFuX2hhcmR3YXJlX3R5cGVfc3RyaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdV9jaGFyIGhhcmR3YXJlVHlwZTsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKworCVJFQURTSE0oaGFyZHdhcmVUeXBlLCBhcmxhbi0+aGFyZHdhcmVUeXBlLCB1X2NoYXIpOworCXN3aXRjaCAoaGFyZHdhcmVUeXBlKQorCXsKKwkJY2FzZSAweDAwOgorCQkJcmV0dXJuICJ0eXBlIEE0NTAiOworCQljYXNlIDB4MDE6CisJCQlyZXR1cm4gInR5cGUgQTY1MCAiOworCQljYXNlIDB4MDQ6CisJCQlyZXR1cm4gInR5cGUgVE1BIGNvcHJvYyI7CisJCWNhc2UgMHgwRDoKKwkJCXJldHVybiAidHlwZSBBNjUwRSAiOworCQljYXNlIDB4MTg6CisJCQlyZXR1cm4gInR5cGUgVE1BIGNvcHJvYyBBdXN0cmFsaWFuIjsKKwkJY2FzZSAweDE5OgorCQkJcmV0dXJuICJ0eXBlIEE2NTBBICI7CisJCWNhc2UgMHgyNjoKKwkJCXJldHVybiAidHlwZSBUTUEgY29wcm9jIEV1cm9wZWFuIjsKKwkJY2FzZSAweDJFOgorCQkJcmV0dXJuICJ0eXBlIEE2NTUgIjsKKwkJY2FzZSAweDJGOgorCQkJcmV0dXJuICJ0eXBlIEE2NTVBICI7CisJCWNhc2UgMHgzMDoKKwkJCXJldHVybiAidHlwZSBBNjU1RSAiOworCQljYXNlIDB4MEI6CisJCQlyZXR1cm4gInR5cGUgQTY3MCAiOworCQljYXNlIDB4MEM6CisJCQlyZXR1cm4gInR5cGUgQTY3MEUgIjsKKwkJY2FzZSAweDJEOgorCQkJcmV0dXJuICJ0eXBlIEE2NzBBICI7CisJCWNhc2UgMHgwRjoKKwkJCXJldHVybiAidHlwZSBBNDExVCI7CisJCWNhc2UgMHgxNjoKKwkJCXJldHVybiAidHlwZSBBNDExVEEiOworCQljYXNlIDB4MUI6CisJCQlyZXR1cm4gInR5cGUgQTQ0MFQiOworCQljYXNlIDB4MUM6CisJCQlyZXR1cm4gInR5cGUgQTQxMlQiOworCQljYXNlIDB4MUU6CisJCQlyZXR1cm4gInR5cGUgQTQxMlRBIjsKKwkJY2FzZSAweDIyOgorCQkJcmV0dXJuICJ0eXBlIEE0MTFURSI7CisJCWNhc2UgMHgyNDoKKwkJCXJldHVybiAidHlwZSBBNDEyVEUiOworCQljYXNlIDB4Mjc6CisJCQlyZXR1cm4gInR5cGUgQTY3MVQgIjsKKwkJY2FzZSAweDI5OgorCQkJcmV0dXJuICJ0eXBlIEE2NzFUQSAiOworCQljYXNlIDB4MkI6CisJCQlyZXR1cm4gInR5cGUgQTY3MVRFICI7CisJCWNhc2UgMHgzMToKKwkJCXJldHVybiAidHlwZSBBNDE1VCAiOworCQljYXNlIDB4MzM6CisJCQlyZXR1cm4gInR5cGUgQTQxNVRBICI7CisJCWNhc2UgMHgzNToKKwkJCXJldHVybiAidHlwZSBBNDE1VEUgIjsKKwkJY2FzZSAweDM3OgorCQkJcmV0dXJuICJ0eXBlIEE2NzIiOworCQljYXNlIDB4Mzk6CisJCQlyZXR1cm4gInR5cGUgQTY3MkEgIjsKKwkJY2FzZSAweDNCOgorCQkJcmV0dXJuICJ0eXBlIEE2NzJUIjsKKwkJY2FzZSAweDZCOgorCQkJcmV0dXJuICJ0eXBlIElDMjIwMCI7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gInR5cGUgQTY3MlQiOworCX0KK30KKyNpZmRlZiBBUkxBTl9ERUJVR0dJTkcKK3N0YXRpYyB2b2lkIGFybGFuX3ByaW50X2RpYWdub3N0aWNfaW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCXVfY2hhciBkaWFnbm9zdGljSW5mbzsKKwl1X3Nob3J0IGRpYWdub3N0aWNPZmZzZXQ7CisJdV9jaGFyIGhhcmR3YXJlVHlwZTsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKworCS8vICBBUkxBTl9ERUJVR19FTlRSWSgiYXJsYW5fcHJpbnRfZGlhZ25vc3RpY19pbmZvIik7CisKKwlpZiAoUkVBRFNITUIoYXJsYW4tPmNvbmZpZ3VyZWRTdGF0dXNGbGFnKSA9PSAwKQorCQlwcmludGsoIkFybGFuOiBDYXJkIE5PVCBjb25maWd1cmVkXG4iKTsKKwllbHNlCisJCXByaW50aygiQXJsYW46IENhcmQgaXMgY29uZmlndXJlZFxuIik7CisKKwlSRUFEU0hNKGRpYWdub3N0aWNJbmZvLCBhcmxhbi0+ZGlhZ25vc3RpY0luZm8sIHVfY2hhcik7CisJUkVBRFNITShkaWFnbm9zdGljT2Zmc2V0LCBhcmxhbi0+ZGlhZ25vc3RpY09mZnNldCwgdV9zaG9ydCk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgYXJsYW5fZGlhZ25vc3RpY19pbmZvX3N0cmluZyhkZXYpKTsKKworCWlmIChkaWFnbm9zdGljSW5mbyAhPSAweGZmKQorCQlwcmludGsoIiVzIGFybGFuOiBEaWFnbm9zdGljIE9mZnNldCAlZCBcbiIsIGRldi0+bmFtZSwgZGlhZ25vc3RpY09mZnNldCk7CisKKwlwcmludGsoImFybGFuOiBMQU4gQ09ERSBJRCA9ICIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCURFQlVHU0hNKDEsICIlMDNkOiIsIGFybGFuLT5sYW5DYXJkTm9kZUlkW2ldLCB1X2NoYXIpOworCXByaW50aygiXG4iKTsKKworCXByaW50aygiYXJsYW46IEFybGFuIEJyb2FkQ2FzdCBhZGRyZXNzICA9ICIpOworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCURFQlVHU0hNKDEsICIlMDNkOiIsIGFybGFuLT5icm9hZGNhc3RBZGRyZXNzW2ldLCB1X2NoYXIpOworCXByaW50aygiXG4iKTsKKworCVJFQURTSE0oaGFyZHdhcmVUeXBlLCBhcmxhbi0+aGFyZHdhcmVUeXBlLCB1X2NoYXIpOworCXByaW50ayhLRVJOX0lORk8gIiVzXG4iLCBhcmxhbl9oYXJkd2FyZV90eXBlX3N0cmluZyhkZXYpKTsKKworCisJREVCVUdTSE0oMSwgImFybGFuOiBjaGFubmVsTnVtYmVyPSVkXG4iLCBhcmxhbi0+Y2hhbm5lbE51bWJlciwgdV9jaGFyKTsKKwlERUJVR1NITSgxLCAiYXJsYW46IGNoYW5uZWxTZXQ9JWRcbiIsIGFybGFuLT5jaGFubmVsU2V0LCB1X2NoYXIpOworCURFQlVHU0hNKDEsICJhcmxhbjogc3ByZWFkaW5nQ29kZT0lZFxuIiwgYXJsYW4tPnNwcmVhZGluZ0NvZGUsIHVfY2hhcik7CisJREVCVUdTSE0oMSwgImFybGFuOiByYWRpb05vZGVJZD0lZFxuIiwgYXJsYW4tPnJhZGlvTm9kZUlkLCB1X3Nob3J0KTsKKwlERUJVR1NITSgxLCAiYXJsYW46IFNJRAk9JWRcbiIsIGFybGFuLT5TSUQsIHVfc2hvcnQpOworCURFQlVHU0hNKDEsICJhcmxhbjogcnhPZmZzZXQ9JWRcbiIsIGFybGFuLT5yeE9mZnNldCwgdV9zaG9ydCk7CisKKwlERUJVR1NITSgxLCAiYXJsYW46IHJlZ2lzdHJhdGlvbiBtb2RlIGlzICVkXG4iLCBhcmxhbi0+cmVnaXN0cmF0aW9uTW9kZSwgdV9jaGFyKTsKKworCXByaW50aygiYXJsYW46IG5hbWU9ICIpOworCUlGREVCVUcoMSkKKwkKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwl7CisJCWNoYXIgYzsKKwkJUkVBRFNITShjLCBhcmxhbi0+bmFtZVtpXSwgY2hhcik7CisJCWlmIChjKQorCQkJcHJpbnRrKCIlYyIsIGMpOworCX0KKwlwcmludGsoIlxuIik7CisKKy8vICAgQVJMQU5fREVCVUdfRVhJVCgiYXJsYW5fcHJpbnRfZGlhZ25vc3RpY19pbmZvIik7CisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCQlURVNUIAlNRU1PUlkJKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgYXJsYW5faHdfdGVzdF9tZW1vcnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1X2NoYXIgKnB0cjsKKwlpbnQgaTsKKwlpbnQgbWVtbGVuID0gc2l6ZW9mKHN0cnVjdCBhcmxhbl9zaG1lbSkgLSAweEY7CS8qIGF2b2lkIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl2b2xhdGlsZSBjaGFyICphcmxhbl9tZW0gPSAoY2hhciAqKSAoZGV2LT5tZW1fc3RhcnQpOworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2xhdGlsZSBzdHJ1Y3QgYXJsYW5fc2htZW0gX19pb21lbSAqYXJsYW4gPSBwcml2LT5jYXJkOworCWNoYXIgcGF0dGVybjsKKworCXB0ciA9IE5VTEw7CisKKwkvKiBob2xkIGNhcmQgaW4gcmVzZXQgc3RhdGUgKi8KKwlzZXRIYXJkd2FyZVJlc2V0KGRldik7CisKKwkvKiB0ZXN0IG1lbW9yeSAqLworCXBhdHRlcm4gPSAwOworCWZvciAoaSA9IDA7IGkgPCBtZW1sZW47IGkrKykKKwkJV1JJVEVTSE0oYXJsYW5fbWVtW2ldLCAoKHVfY2hhcikgcGF0dGVybisrKSwgdV9jaGFyKTsKKworCXBhdHRlcm4gPSAwOworCWZvciAoaSA9IDA7IGkgPCBtZW1sZW47IGkrKykKKwl7CisJCWNoYXIgcmVzOworCQlSRUFEU0hNKHJlcywgYXJsYW5fbWVtW2ldLCBjaGFyKTsKKwkJaWYgKHJlcyAhPSBwYXR0ZXJuKyspCisJCXsKKwkJCXByaW50ayhLRVJOX0VSUiAiQXJsYW4gZHJpdmVyIG1lbW9yeSB0ZXN0IDEgZmFpbGVkIFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlwYXR0ZXJuID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbWVtbGVuOyBpKyspCisJCVdSSVRFU0hNKGFybGFuX21lbVtpXSwgfihwYXR0ZXJuKyspLCBjaGFyKTsKKworCXBhdHRlcm4gPSAwOworCWZvciAoaSA9IDA7IGkgPCBtZW1sZW47IGkrKykKKwl7CisJCWNoYXIgcmVzOworCQlSRUFEU0hNKHJlcywgYXJsYW5fbWVtW2ldLCBjaGFyKTsKKwkJaWYgKHJlcyAhPSB+KHBhdHRlcm4rKykpCisJCXsKKwkJCXByaW50ayhLRVJOX0VSUiAiQXJsYW4gZHJpdmVyIG1lbW9yeSB0ZXN0IDIgZmFpbGVkIFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwkvKiB6ZXJvIG1lbW9yeSAqLworCWZvciAoaSA9IDA7IGkgPCBtZW1sZW47IGkrKykKKwkJV1JJVEVTSE0oYXJsYW5fbWVtW2ldLCAweDAwLCBjaGFyKTsKKworCUlGREVCVUcoMSkgcHJpbnRrKEtFUk5fSU5GTyAiQXJsYW46IG1lbW9yeSB0ZXN0cyBva1xuIik7CisKKwkvKiBzZXQgcmVzZXQgZmxhZyBhbmQgdGhlbiByZWxlYXNlIHJlc2V0ICovCisJV1JJVEVTSE0oYXJsYW4tPnJlc2V0RmxhZywgMHhmZiwgdV9jaGFyKTsKKworCWNsZWFyQ2hhbm5lbEF0dGVudGlvbihkZXYpOworCWNsZWFySGFyZHdhcmVSZXNldChkZXYpOworCisJLyogd2FpdCBmb3IgcmVzZXQgZmxhZyB0byBiZWNvbWUgemVybywgd2UnbGwgd2FpdCBmb3IgdHdvIHNlY29uZHMgKi8KKwlpZiAoYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfTE9OR19XQUlUX05PVykpCisJeworCQlwcmludGsoS0VSTl9FUlIgIiVzIGFybGFuOiBmYWlsZWQgdG8gY29tZSBiYWNrIGZyb20gbWVtb3J5IHRlc3RcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJsYW5fc2V0dXBfY2FyZF9ieV9ib29rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdV9jaGFyIGlycUxldmVsLCBjb25maWd1cmVkU3RhdHVzRmxhZzsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9sYXRpbGUgc3RydWN0IGFybGFuX3NobWVtIF9faW9tZW0gKmFybGFuID0gcHJpdi0+Y2FyZDsKKworLy8JQVJMQU5fREVCVUdfRU5UUlkoImFybGFuX3NldHVwX2NhcmQiKTsKKworCVJFQURTSE0oY29uZmlndXJlZFN0YXR1c0ZsYWcsIGFybGFuLT5jb25maWd1cmVkU3RhdHVzRmxhZywgdV9jaGFyKTsKKworCUlGREVCVUcoMTApCisJaWYgKGNvbmZpZ3VyZWRTdGF0dXNGbGFnICE9IDApCisJCUlGREVCVUcoMTApIHByaW50aygiYXJsYW46IENBUkQgSVMgQ09ORklHVVJFRFxuIik7CisJZWxzZQorCQlJRkRFQlVHKDEwKSBwcmludGsoImFybGFuOiBjYXJkIGlzIE5PVCBjb25maWd1cmVkXG4iKTsKKworCWlmICh0ZXN0TWVtb3J5IHx8IChSRUFEU0hNQihhcmxhbi0+ZGlhZ25vc3RpY0luZm8pICE9IDB4ZmYpKQorCQlpZiAoYXJsYW5faHdfdGVzdF9tZW1vcnkoZGV2KSkKKwkJCXJldHVybiAtMTsKKworCURFQlVHU0hNKDQsICJhcmxhbiBjb25maWd1cmVkU3RhdHVzID0gJWQgXG4iLCBhcmxhbi0+Y29uZmlndXJlZFN0YXR1c0ZsYWcsIHVfY2hhcik7CisJREVCVUdTSE0oNCwgImFybGFuIGRyaXZlciBkaWFnbm9zdGljOiAweCUyeFxuIiwgYXJsYW4tPmRpYWdub3N0aWNJbmZvLCB1X2NoYXIpOworCisJLyogaXNzdWUgbm9wIGNvbW1hbmQgLSBubyBpbnRlcnJ1cHQgKi8KKwlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9OT09QKTsKKwlpZiAoYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfV0FJVF9OT1cpICE9IDApCisJCXJldHVybiAtMTsKKworCUlGREVCVUcoNTApIHByaW50aygiMXN0IE5vb3Agc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkICEhXG4iKTsKKworCS8qIHRyeSB0byB0dXJuIG9uIHRoZSBhcmxhbiBpbnRlcnJ1cHRzICovCisJY2xlYXJDbGVhckludGVycnVwdChkZXYpOworCXNldENsZWFySW50ZXJydXB0KGRldik7CisJc2V0SW50ZXJydXB0RW5hYmxlKGRldik7CisKKwkvKiBpc3N1ZSBub3AgY29tbWFuZCAtIHdpdGggaW50ZXJydXB0ICovCisKKwlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9OT09QSU5UKTsKKwlpZiAoYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfV0FJVF9OT1cpICE9IDApCisJCXJldHVybiAtMTsKKworCisJSUZERUJVRyg1MCkgcHJpbnRrKCIybmQgTm9vcCBzdWNjZXNzZnVsbHkgZXhlY3V0ZWQgISFcbiIpOworCisJUkVBRFNITShpcnFMZXZlbCwgYXJsYW4tPmlycUxldmVsLCB1X2NoYXIpCisJCisJaWYgKGlycUxldmVsICE9IGRldi0+aXJxKQorCXsKKwkJSUZERUJVRygxKSBwcmludGsoS0VSTl9XQVJOSU5HICJhcmxhbiBkaXAgc3dpdGNoZXMgc2V0IGlycSB0byAlZFxuIiwgaXJxTGV2ZWwpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJkZXZpY2UgZHJpdmVyIGlycSBzZXQgdG8gJWQgLSBkb2VzIG5vdCBtYXRjaFxuIiwgZGV2LT5pcnEpOworCQlkZXYtPmlycSA9IGlycUxldmVsOworCX0KKwllbHNlCisJCUlGREVCVUcoMikgcHJpbnRrKCJpcnEgbGV2ZWwgaXMgT0tcbiIpOworCisKKwlJRkRFQlVHKDMpIGFybGFuX3ByaW50X2RpYWdub3N0aWNfaW5mbyhkZXYpOworCisJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfQ09ORik7CisKKwlSRUFEU0hNKGNvbmZpZ3VyZWRTdGF0dXNGbGFnLCBhcmxhbi0+Y29uZmlndXJlZFN0YXR1c0ZsYWcsIHVfY2hhcik7CisJaWYgKGNvbmZpZ3VyZWRTdGF0dXNGbGFnID09IDApCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhcmxhbiBjb25maWd1cmUgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9MT05HX1dBSVRfTk9XKTsKKwlhcmxhbl9jb21tYW5kKGRldiwgQVJMQU5fQ09NTUFORF9SWCk7CisJYXJsYW5fY29tbWFuZChkZXYsIEFSTEFOX0NPTU1BTkRfTE9OR19XQUlUX05PVyk7CisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogYXJsYW4gZHJpdmVyIHZlcnNpb24gJXMgbG9hZGVkXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGFybGFuX3ZlcnNpb24pOworCisvLwlBUkxBTl9ERUJVR19FWElUKCJhcmxhbl9zZXR1cF9jYXJkIik7CisKKwlyZXR1cm4gMDsJCS8qIG5vIGVycm9ycyAqLworfQorI2VuZGlmCisKKyNpZmRlZiBBUkxBTl9QUk9DX0lOVEVSRkFDRQorI2lmZGVmIEFSTEFOX1BST0NfU0hNX0RVTVAKKworc3RhdGljIGNoYXIgYXJsYW5fZHJpdmVfaW5mb1tBUkxBTl9TVFJfU0laRV0gPSAiQTY1NVxuXDAiOworCitzdGF0aWMgaW50IGFybGFuX3N5c2N0bF9pbmZvKGN0bF90YWJsZSAqIGN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICogbGVucCwgbG9mZl90ICpwcG9zKQoreworCWludCBpOworCWludCByZXR2LCBwb3MsIGRldm51bTsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdmEgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJcG9zID0gMDsKKwlpZiAod3JpdGUpCisJeworCQlwcmludGsoIndyaXJ0ZTogIik7CisJCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykKKwkJCXByaW50aygiYWRpICV4IFxuIiwgYXJsYW5fZHJpdmVfaW5mb1tpXSk7CisJfQorCWlmIChjdGwtPnByb2NuYW1lID09IE5VTEwgfHwgYXJsYW5fZHJpdmVfaW5mbyA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiIHByb2NuYW1lIGlzIE5VTEwgaW4gc3lzY3RsX3RhYmxlIG9yIGFybGFuX2RyaXZlX2luZm8gaXMgTlVMTCBcbiBhdCBhcmxhbiBtb2R1bGVcbiAiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkZXZudW0gPSBjdGwtPnByb2NuYW1lWzVdIC0gJzAnOworCWlmIChkZXZudW0gPCAwIHx8IGRldm51bSA+IE1BWF9BUkxBTlMgLSAxKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAidG9vIHN0cmFuZ2UgZGV2bnVtIGluIHByb2NmcyBwYXJzZVxuICIpOworCQlyZXR1cm4gLTE7CisJfQorCWVsc2UgaWYgKGFybGFuX2RldmljZVtkZXZudW1dID09IE5VTEwpCisJeworCQlpZiAoY3RsLT5wcm9jbmFtZSkKKwkJCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8gKyBwb3MsICJcdCVzXG5cbiIsIGN0bC0+cHJvY25hbWUpOworCQlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvICsgcG9zLCAiTm8gZGV2aWNlIGZvdW5kIGhlcmUgXG4iKTsKKwkJZ290byBmaW5hbDsKKwl9CisJZWxzZQorCQlwcml2YSA9IGFybGFuX2RldmljZVtkZXZudW1dLT5wcml2OworCisJaWYgKHByaXZhID09IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIgQ291bGQgbm90IGZpbmQgdGhlIGRldmljZSBwcml2YXRlIGluIGFybGFuIHByb2NzeXMsIGJhZFxuICIpOworCQlyZXR1cm4gLTE7CisJfQorCWRldiA9IGFybGFuX2RldmljZVtkZXZudW1dOworCisJbWVtY3B5X2Zyb21pbyhwcml2YS0+Y29uZiwgcHJpdmEtPmNhcmQsIHNpemVvZihzdHJ1Y3QgYXJsYW5fc2htZW0pKTsKKworCXBvcyA9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbywgIkFybGFuICBpbmZvIFxuIik7CisJLyogSGVhZGVyIFNpZ25hdHVyZSAqLworCVNBUkxTVFIodGV4dFJlZ2lvbiwgNDgpOworCVNBUkxVQyhyZXNldEZsYWcpOworCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8gKyBwb3MsICJkaWFnbm9zdGljSW5mb1x0PVx0JXMgXG4iLCBhcmxhbl9kaWFnbm9zdGljX2luZm9fc3RyaW5nKGRldikpOworCVNBUkxVQyhkaWFnbm9zdGljSW5mbyk7CisJU0FSTFVTKGRpYWdub3N0aWNPZmZzZXQpOworCVNBUkxVQ04oXzEsIDEyKTsKKwlTQVJMVUNOKGxhbkNhcmROb2RlSWQsIDYpOworCVNBUkxVQ04oYnJvYWRjYXN0QWRkcmVzcywgNik7CisJcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbyArIHBvcywgImhhcmR3YXJlVHlwZSA9XHQgICVzIFxuIiwgYXJsYW5faGFyZHdhcmVfdHlwZV9zdHJpbmcoZGV2KSk7CisJU0FSTFVDKGhhcmR3YXJlVHlwZSk7CisJU0FSTFVDKG1ham9ySGFyZHdhcmVWZXJzaW9uKTsKKwlTQVJMVUMobWlub3JIYXJkd2FyZVZlcnNpb24pOworCVNBUkxVQyhyYWRpb01vZHVsZSk7CisJU0FSTFVDKGRlZmF1bHRDaGFubmVsU2V0KTsKKwlTQVJMVUNOKF8yLCA0Nyk7CisKKwkvKiBDb250cm9sL1N0YXR1cyBCbG9jayAtIDB4MDA4MCAqLworCVNBUkxVQyhpbnRlcnJ1cHRJblByb2dyZXNzKTsKKwlTQVJMVUMoY250cmxSZWdJbWFnZSk7CisKKwlTQVJMVUNOKF8zLCAxNCk7CisJU0FSTFVDKGNvbW1hbmRCeXRlKTsKKwlTQVJMVUNOKGNvbW1hbmRQYXJhbWV0ZXIsIDE1KTsKKworCS8qIFJlY2VpdmUgU3RhdHVzIC0gMHgwMGEwICovCisJU0FSTFVDKHJ4U3RhdHVzKTsKKwlTQVJMVUMocnhGcm1UeXBlKTsKKwlTQVJMVVMocnhPZmZzZXQpOworCVNBUkxVUyhyeExlbmd0aCk7CisJU0FSTFVDTihyeFNyYywgNik7CisJU0FSTFVDKHJ4QnJvYWRjYXN0RmxhZyk7CisJU0FSTFVDKHJ4UXVhbGl0eSk7CisJU0FSTFVDKHNjcmFtYmxlZCk7CisJU0FSTFVDTihfNCwgMSk7CisKKwkvKiBUcmFuc21pdCBTdGF0dXMgLSAweDAwYjAgKi8KKwlTQVJMVUModHhTdGF0dXMpOworCVNBUkxVQyh0eEFja1F1YWxpdHkpOworCVNBUkxVQyhudW1SZXRyaWVzKTsKKwlTQVJMVUNOKF81LCAxNCk7CisJU0FSTFVDTihyZWdpc3RlcmVkUm91dGVyLCA2KTsKKwlTQVJMVUNOKGJhY2tib25lUm91dGVyLCA2KTsKKwlTQVJMVUMocmVnaXN0cmF0aW9uU3RhdHVzKTsKKwlTQVJMVUMoY29uZmlndXJlZFN0YXR1c0ZsYWcpOworCVNBUkxVQ04oXzYsIDEpOworCVNBUkxVQ04odWx0aW1hdGVEZXN0QWRkcmVzcywgNik7CisJU0FSTFVDTihpbW1lZERlc3RBZGRyZXNzLCA2KTsKKwlTQVJMVUNOKGltbWVkU3JjQWRkcmVzcywgNik7CisJU0FSTFVTKHJ4U2VxdWVuY2VOdW1iZXIpOworCVNBUkxVQyhhc3NpZ25lZExvY2FsdGFsa0FkZHJlc3MpOworCVNBUkxVQ04oXzcsIDI3KTsKKworCS8qIFN5c3RlbSBQYXJhbWV0ZXIgQmxvY2sgKi8KKworCS8qIC0gRHJpdmVyIFBhcmFtZXRlcnMgKE5vdmVsbCBTcGVjaWZpYykgKi8KKworCVNBUkxVUyh0eFRpbWVvdXQpOworCVNBUkxVUyh0cmFuc3BvcnRUaW1lKTsKKwlTQVJMVUNOKF84LCA0KTsKKworCS8qIC0gQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXJzICovCisJU0FSTFVDKGlycUxldmVsKTsKKwlTQVJMVUMoc3ByZWFkaW5nQ29kZSk7CisJU0FSTFVDKGNoYW5uZWxTZXQpOworCVNBUkxVQyhjaGFubmVsTnVtYmVyKTsKKwlTQVJMVVMocmFkaW9Ob2RlSWQpOworCVNBUkxVQ04oXzksIDIpOworCVNBUkxVQyhzY3JhbWJsaW5nRGlzYWJsZSk7CisJU0FSTFVDKHJhZGlvVHlwZSk7CisJU0FSTFVTKHJvdXRlcklkKTsKKwlTQVJMVUNOKF8xMCwgOSk7CisJU0FSTFVDKHR4QXR0ZW51YXRpb24pOworCVNBUkxVSUEoc3lzdGVtSWQpOworCVNBUkxVUyhnbG9iYWxDaGVja3N1bSk7CisJU0FSTFVDTihfMTEsIDQpOworCVNBUkxVUyhtYXhEYXRhZ3JhbVNpemUpOworCVNBUkxVUyhtYXhGcmFtZVNpemUpOworCVNBUkxVQyhtYXhSZXRyaWVzKTsKKwlTQVJMVUMocmVjZWl2ZU1vZGUpOworCVNBUkxVQyhwcmlvcml0eSk7CisJU0FSTFVDKHJvb3RPclJlcGVhdGVyKTsKKwlTQVJMVUNOKHNwZWNpZmllZFJvdXRlciwgNik7CisJU0FSTFVTKGZhc3RQb2xsUGVyaW9kKTsKKwlTQVJMVUMocG9sbERlY2F5KTsKKwlTQVJMVVNBKGZhc3RQb2xsRGVsYXkpOworCVNBUkxVQyhhcmxUaHJlc2hvbGQpOworCVNBUkxVQyhhcmxEZWNheSk7CisJU0FSTFVDTihfMTIsIDEpOworCVNBUkxVUyhzcGVjUm91dGVyVGltZW91dCk7CisJU0FSTFVDTihfMTMsIDUpOworCisJLyogU2NyYW1ibGVkIEFyZWEgKi8KKwlTQVJMVUlBKFNJRCk7CisJU0FSTFVDTihlbmNyeXB0aW9uS2V5LCAxMik7CisJU0FSTFVJQShfMTQpOworCVNBUkxVU0Eod2FpdFRpbWUpOworCVNBUkxVU0EobFBhcmFtZXRlcik7CisJU0FSTFVDTihfMTUsIDMpOworCVNBUkxVUyhoZWFkZXJTaXplKTsKKwlTQVJMVVMoc2VjdGlvbkNoZWNrc3VtKTsKKworCVNBUkxVQyhyZWdpc3RyYXRpb25Nb2RlKTsKKwlTQVJMVUMocmVnaXN0cmF0aW9uRmlsbCk7CisJU0FSTFVTKHBvbGxQZXJpb2QpOworCVNBUkxVUyhyZWZyZXNoUGVyaW9kKTsKKwlTQVJMU1RSKG5hbWUsIDE2KTsKKwlTQVJMVUNOKE5JRCwgNik7CisJU0FSTFVDKGxvY2FsVGFsa0FkZHJlc3MpOworCVNBUkxVQyhjb2RlRm9ybWF0KTsKKwlTQVJMVUMobnVtQ2hhbm5lbHMpOworCVNBUkxVQyhjaGFubmVsMSk7CisJU0FSTFVDKGNoYW5uZWwyKTsKKwlTQVJMVUMoY2hhbm5lbDMpOworCVNBUkxVQyhjaGFubmVsNCk7CisJU0FSTFVDTihTU0NvZGUsIDU5KTsKKworLyogICAgICBTQVJMVUNOKCBfMTYsIDB4MTQwKTsKKyAqLworCS8qIFN0YXRpc3RpY3MgQmxvY2sgLSAweDAzMDAgKi8KKwlTQVJMVUMoaG9zdGNwdUxvY2spOworCVNBUkxVQyhsYW5jcHVMb2NrKTsKKwlTQVJMVUNOKHJlc2V0VGltZSwgMTgpOworCVNBUkxVSUEobnVtRGF0YWdyYW1zVHJhbnNtaXR0ZWQpOworCVNBUkxVSUEobnVtUmVUcmFuc21pc3Npb25zKTsKKwlTQVJMVUlBKG51bUZyYW1lc0Rpc2NhcmRlZCk7CisJU0FSTFVJQShudW1EYXRhZ3JhbXNSZWNlaXZlZCk7CisJU0FSTFVJQShudW1EdXBsaWNhdGVSZWNlaXZlZEZyYW1lcyk7CisJU0FSTFVJQShudW1EYXRhZ3JhbXNEaXNjYXJkZWQpOworCVNBUkxVUyhtYXhOdW1SZVRyYW5zbWl0RGF0YWdyYW0pOworCVNBUkxVUyhtYXhOdW1SZVRyYW5zbWl0RnJhbWVzKTsKKwlTQVJMVVMobWF4TnVtQ29uc2VjdXRpdmVEdXBsaWNhdGVGcmFtZXMpOworCS8qIG1pc2FsaWduZWQgaGVyZSBzbyB3ZSBoYXZlIHRvIGdvIHRvIGNoYXJhY3RlcnMgKi8KKwlTQVJMVUlBKG51bUJ5dGVzVHJhbnNtaXR0ZWQpOworCVNBUkxVSUEobnVtQnl0ZXNSZWNlaXZlZCk7CisJU0FSTFVJQShudW1DUkNFcnJvcnMpOworCVNBUkxVSUEobnVtTGVuZ3RoRXJyb3JzKTsKKwlTQVJMVUlBKG51bUFib3J0RXJyb3JzKTsKKwlTQVJMVUlBKG51bVRYVW5kZXJydW5zKTsKKwlTQVJMVUlBKG51bVJYT3ZlcnJ1bnMpOworCVNBUkxVSUEobnVtSG9sZE9mZnMpOworCVNBUkxVSUEobnVtRnJhbWVzVHJhbnNtaXR0ZWQpOworCVNBUkxVSUEobnVtRnJhbWVzUmVjZWl2ZWQpOworCVNBUkxVSUEobnVtUmVjZWl2ZUZyYW1lc0xvc3QpOworCVNBUkxVSUEobnVtUlhCdWZmZXJPdmVyZmxvd3MpOworCVNBUkxVSUEobnVtRnJhbWVzRGlzY2FyZGVkQWRkck1pc21hdGNoKTsKKwlTQVJMVUlBKG51bUZyYW1lc0Rpc2NhcmRlZFNJRE1pc21hdGNoKTsKKwlTQVJMVUlBKG51bVBvbGxzVHJhbnNtaXN0dGVkKTsKKwlTQVJMVUlBKG51bVBvbGxBY2tub3dsZWRnZXMpOworCVNBUkxVSUEobnVtU3RhdHVzVGltZW91dHMpOworCVNBUkxVSUEobnVtTkFDS1JlY2VpdmVkKTsKKwlTQVJMVVMoYXV4Q21kKTsKKwlTQVJMVUNOKGR1bXBQdHIsIDQpOworCVNBUkxVQyhkdW1wVmFsKTsKKwlTQVJMVUMod2lyZVRlc3QpOworCQorCS8qIG5leHQgNCBzZWVtcyB0b28gbG9uZyBmb3IgcHJvY2ZzLCBvdmVyIHNpbmdsZSBwYWdlID8KKwlTQVJMVUNOKCBfMTcsIDB4ODYpOworCVNBUkxVQ04oIHR4QnVmZmVyLCAweDgwMCk7CisJU0FSTFVDTiggcnhCdWZmZXIsICAweDgwMCk7IAorCVNBUkxVQ04oIF8xOCwgMHgwYmZmKTsKKwkgKi8KKworCXBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8gKyBwb3MsICJyeFJpbmdcdD1cdDB4Iik7CisJZm9yIChpID0gMDsgaSA8IDB4NTA7IGkrKykKKwkJcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbyArIHBvcywgIiUwMngiLCAoKGNoYXIgKikgcHJpdmEtPmNvbmYpW3ByaXZhLT5jb25mLT5yeE9mZnNldCArIGldKTsKKwlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvICsgcG9zLCAiXG4iKTsKKworCVNBUkxVQyhjb25maWdTdGF0dXMpOworCVNBUkxVQyhfMjIpOworCVNBUkxVQyhwcm9nSU9DdHJsKTsKKwlTQVJMVUMoc2hhcmVNQmFzZSk7CisJU0FSTFVDKGNvbnRyb2xSZWdpc3Rlcik7CisKKwlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvICsgcG9zLCAiIHRvdGFsICVkIGNoYXJzXG4iLCBwb3MpOworCWlmIChjdGwpCisJCWlmIChjdGwtPnByb2NuYW1lKQorCQkJcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbyArIHBvcywgIiBkcml2ZXIgbmFtZSA6ICVzXG4iLCBjdGwtPnByb2NuYW1lKTsKK2ZpbmFsOgorCSpsZW5wID0gcG9zOworCisJaWYgKCF3cml0ZSkKKwkJcmV0diA9IHByb2NfZG9zdHJpbmcoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwllbHNlCisJeworCQkqbGVucCA9IDA7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIHJldHY7Cit9CisKKworc3RhdGljIGludCBhcmxhbl9zeXNjdGxfaW5mbzE2MTcxOShjdGxfdGFibGUgKiBjdGwsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICogbGVucCwgbG9mZl90ICpwcG9zKQoreworCWludCBpOworCWludCByZXR2LCBwb3MsIGRldm51bTsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdmEgPSBOVUxMOworCisJcG9zID0gMDsKKwlkZXZudW0gPSBjdGwtPnByb2NuYW1lWzVdIC0gJzAnOworCWlmIChhcmxhbl9kZXZpY2VbZGV2bnVtXSA9PSBOVUxMKQorCXsKKwkJcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbyArIHBvcywgIk5vIGRldmljZSBmb3VuZCBoZXJlIFxuIik7CisJCWdvdG8gZmluYWw7CisJfQorCWVsc2UKKwkJcHJpdmEgPSBhcmxhbl9kZXZpY2VbZGV2bnVtXS0+cHJpdjsKKwlpZiAocHJpdmEgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiBDb3VsZCBub3QgZmluZCB0aGUgZGV2aWNlIHByaXZhdGUgaW4gYXJsYW4gcHJvY3N5cywgYmFkXG4gIik7CisJCXJldHVybiAtMTsKKwl9CisJbWVtY3B5X2Zyb21pbyhwcml2YS0+Y29uZiwgcHJpdmEtPmNhcmQsIHNpemVvZihzdHJ1Y3QgYXJsYW5fc2htZW0pKTsKKwlTQVJMVUNOKF8xNiwgMHhDMCk7CisJU0FSTFVDTihfMTcsIDB4NkEpOworCVNBUkxVQ04oXzE4LCAxNCk7CisJU0FSTFVDTihfMTksIDB4ODYpOworCVNBUkxVQ04oXzIxLCAweDNmZCk7CisKK2ZpbmFsOgorCSpsZW5wID0gcG9zOworCXJldHYgPSBwcm9jX2Rvc3RyaW5nKGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJcmV0dXJuIHJldHY7Cit9CisKK3N0YXRpYyBpbnQgYXJsYW5fc3lzY3RsX2luZm90eFJpbmcoY3RsX3RhYmxlICogY3RsLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqIGxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgaTsKKwlpbnQgcmV0diwgcG9zLCBkZXZudW07CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXZhID0gTlVMTDsKKworCXBvcyA9IDA7CisJZGV2bnVtID0gY3RsLT5wcm9jbmFtZVs1XSAtICcwJzsKKwlpZiAoYXJsYW5fZGV2aWNlW2Rldm51bV0gPT0gTlVMTCkKKwl7CisJCSAgcG9zICs9IHNwcmludGYoYXJsYW5fZHJpdmVfaW5mbyArIHBvcywgIk5vIGRldmljZSBmb3VuZCBoZXJlIFxuIik7CisJCSAgZ290byBmaW5hbDsKKwl9CisJZWxzZQorCQlwcml2YSA9IGFybGFuX2RldmljZVtkZXZudW1dLT5wcml2OworCWlmIChwcml2YSA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiIENvdWxkIG5vdCBmaW5kIHRoZSBkZXZpY2UgcHJpdmF0ZSBpbiBhcmxhbiBwcm9jc3lzLCBiYWRcbiAiKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1jcHlfZnJvbWlvKHByaXZhLT5jb25mLCBwcml2YS0+Y2FyZCwgc2l6ZW9mKHN0cnVjdCBhcmxhbl9zaG1lbSkpOworCVNBUkxCTnBsbih1X2NoYXIsIHR4QnVmZmVyLCAweDgwMCk7CitmaW5hbDoKKwkqbGVucCA9IHBvczsKKwlyZXR2ID0gcHJvY19kb3N0cmluZyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCXJldHVybiByZXR2OworfQorCitzdGF0aWMgaW50IGFybGFuX3N5c2N0bF9pbmZvcnhSaW5nKGN0bF90YWJsZSAqIGN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKiBsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IGk7CisJaW50IHJldHYsIHBvcywgZGV2bnVtOworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2YSA9IE5VTEw7CisKKwlwb3MgPSAwOworCWRldm51bSA9IGN0bC0+cHJvY25hbWVbNV0gLSAnMCc7CisJaWYgKGFybGFuX2RldmljZVtkZXZudW1dID09IE5VTEwpCisJeworCQkgIHBvcyArPSBzcHJpbnRmKGFybGFuX2RyaXZlX2luZm8gKyBwb3MsICJObyBkZXZpY2UgZm91bmQgaGVyZSBcbiIpOworCQkgIGdvdG8gZmluYWw7CisJfSBlbHNlCisJCXByaXZhID0gYXJsYW5fZGV2aWNlW2Rldm51bV0tPnByaXY7CisJaWYgKHByaXZhID09IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIgQ291bGQgbm90IGZpbmQgdGhlIGRldmljZSBwcml2YXRlIGluIGFybGFuIHByb2NzeXMsIGJhZFxuICIpOworCQlyZXR1cm4gLTE7CisJfQorCW1lbWNweV9mcm9taW8ocHJpdmEtPmNvbmYsIHByaXZhLT5jYXJkLCBzaXplb2Yoc3RydWN0IGFybGFuX3NobWVtKSk7CisJU0FSTEJOcGxuKHVfY2hhciwgcnhCdWZmZXIsIDB4ODAwKTsKK2ZpbmFsOgorCSpsZW5wID0gcG9zOworCXJldHYgPSBwcm9jX2Rvc3RyaW5nKGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJcmV0dXJuIHJldHY7Cit9CisKK3N0YXRpYyBpbnQgYXJsYW5fc3lzY3RsX2luZm8xOChjdGxfdGFibGUgKiBjdGwsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKiBsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IGk7CisJaW50IHJldHYsIHBvcywgZGV2bnVtOworCXN0cnVjdCBhcmxhbl9wcml2YXRlICpwcml2YSA9IE5VTEw7CisKKwlwb3MgPSAwOworCWRldm51bSA9IGN0bC0+cHJvY25hbWVbNV0gLSAnMCc7CisJaWYgKGFybGFuX2RldmljZVtkZXZudW1dID09IE5VTEwpCisJeworCQlwb3MgKz0gc3ByaW50Zihhcmxhbl9kcml2ZV9pbmZvICsgcG9zLCAiTm8gZGV2aWNlIGZvdW5kIGhlcmUgXG4iKTsKKwkJZ290byBmaW5hbDsKKwl9CisJZWxzZQorCQlwcml2YSA9IGFybGFuX2RldmljZVtkZXZudW1dLT5wcml2OworCWlmIChwcml2YSA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiIENvdWxkIG5vdCBmaW5kIHRoZSBkZXZpY2UgcHJpdmF0ZSBpbiBhcmxhbiBwcm9jc3lzLCBiYWRcbiAiKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1jcHlfZnJvbWlvKHByaXZhLT5jb25mLCBwcml2YS0+Y2FyZCwgc2l6ZW9mKHN0cnVjdCBhcmxhbl9zaG1lbSkpOworCVNBUkxCTnBsbih1X2NoYXIsIF8xOCwgMHg4MDApOworCitmaW5hbDoKKwkqbGVucCA9IHBvczsKKwlyZXR2ID0gcHJvY19kb3N0cmluZyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCXJldHVybiByZXR2OworfQorCisKKyNlbmRpZgkJCQkvKiAjaWZkZWYgQVJMQU5fUFJPQ19TSE1fRFVNUCAqLworCisKK3N0YXRpYyBjaGFyIGNvbmZfcmVzZXRfcmVzdWx0WzIwMF07CisKK3N0YXRpYyBpbnQgYXJsYW5fY29uZmlndXJlKGN0bF90YWJsZSAqIGN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqIGxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgcG9zID0gMDsKKwlpbnQgZGV2bnVtID0gY3RsLT5wcm9jbmFtZVs2XSAtICcwJzsKKwlzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqcHJpdjsKKworCWlmIChkZXZudW0gPCAwIHx8IGRldm51bSA+IE1BWF9BUkxBTlMgLSAxKQorCXsKKwkJICBwcmludGsoS0VSTl9XQVJOSU5HICJ0b28gc3RyYW5nZSBkZXZudW0gaW4gcHJvY2ZzIHBhcnNlXG4gIik7CisJCSAgcmV0dXJuIC0xOworCX0KKwllbHNlIGlmIChhcmxhbl9kZXZpY2VbZGV2bnVtXSAhPSBOVUxMKQorCXsKKwkJICBwcml2ID0gYXJsYW5fZGV2aWNlW2Rldm51bV0tPnByaXY7CisKKwkJICBhcmxhbl9jb21tYW5kKGFybGFuX2RldmljZVtkZXZudW1dLCBBUkxBTl9DT01NQU5EX0NMRUFOX0FORF9DT05GKTsKKwl9CisJZWxzZQorCQlyZXR1cm4gLTE7CisKKwkqbGVucCA9IHBvczsKKwlyZXR1cm4gcHJvY19kb3N0cmluZyhjdGwsIHdyaXRlLCBmaWxwLCBidWZmZXIsIGxlbnAsIHBwb3MpOworfQorCitzdGF0aWMgaW50IGFybGFuX3N5c2N0bF9yZXNldChjdGxfdGFibGUgKiBjdGwsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKiBsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IHBvcyA9IDA7CisJaW50IGRldm51bSA9IGN0bC0+cHJvY25hbWVbNV0gLSAnMCc7CisJc3RydWN0IGFybGFuX3ByaXZhdGUgKnByaXY7CisKKwlpZiAoZGV2bnVtIDwgMCB8fCBkZXZudW0gPiBNQVhfQVJMQU5TIC0gMSkKKwl7CisJCSAgcHJpbnRrKEtFUk5fV0FSTklORyAidG9vIHN0cmFuZ2UgZGV2bnVtIGluIHByb2NmcyBwYXJzZVxuICIpOworCQkgIHJldHVybiAtMTsKKwl9CisJZWxzZSBpZiAoYXJsYW5fZGV2aWNlW2Rldm51bV0gIT0gTlVMTCkKKwl7CisJCXByaXYgPSBhcmxhbl9kZXZpY2VbZGV2bnVtXS0+cHJpdjsKKwkJYXJsYW5fY29tbWFuZChhcmxhbl9kZXZpY2VbZGV2bnVtXSwgQVJMQU5fQ09NTUFORF9DTEVBTl9BTkRfUkVTRVQpOworCisJfSBlbHNlCisJCXJldHVybiAtMTsKKwkqbGVucCA9IHBvcyArIDM7CisJcmV0dXJuIHByb2NfZG9zdHJpbmcoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKK30KKworCisvKiBQbGFjZSBmaWxlcyBpbiAvcHJvYy9zeXMvZGV2L2FybGFuICovCisjZGVmaW5lIENUQkxOKG51bSxjYXJkLG5hbSkgXAorICAgICAgICB7IC5jdGxfbmFtZSA9IG51bSxcCisgICAgICAgICAgLnByb2NuYW1lID0gI25hbSxcCisgICAgICAgICAgLmRhdGEgPSAmKGFybGFuX2NvbmZbY2FyZF0ubmFtKSxcCisgICAgICAgICAgLm1heGxlbiA9IHNpemVvZihpbnQpLCAubW9kZSA9IDA2MDAsIC5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2ludHZlY30KKyNpZmRlZiBBUkxBTl9ERUJVR0dJTkcKKworI2RlZmluZSBBUkxBTl9QUk9DX0RFQlVHX0VOVFJJRVMgXAorICAgICAgICB7IC5jdGxfbmFtZSA9IDQ4LCAucHJvY25hbWUgPSAiZW50cnlfZXhpdF9kZWJ1ZyIsXAorICAgICAgICAgIC5kYXRhID0gJmFybGFuX2VudHJ5X2FuZF9leGl0X2RlYnVnLFwKKyAgICAgICAgICAubWF4bGVuID0gc2l6ZW9mKGludCksIC5tb2RlID0gMDYwMCwgLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjfSxcCisJeyAuY3RsX25hbWUgPSA0OSwgLnByb2NuYW1lID0gImRlYnVnIiwgLmRhdGEgPSAmYXJsYW5fZGVidWcsXAorICAgICAgICAgIC5tYXhsZW4gPSBzaXplb2YoaW50KSwgLm1vZGUgPSAwNjAwLCAucHJvY19oYW5kbGVyID0gJnByb2NfZG9pbnR2ZWN9LAorI2Vsc2UgCisjZGVmaW5lIEFSTEFOX1BST0NfREVCVUdfRU5UUklFUworI2VuZGlmCisKKyNkZWZpbmUgQVJMQU5fU1lTQ1RMX1RBQkxFX1RPVEFMKGNhcmRObylcCisJQ1RCTE4oMSxjYXJkTm8sc3ByZWFkaW5nQ29kZSksXAorCUNUQkxOKDIsY2FyZE5vLCBjaGFubmVsTnVtYmVyKSxcCisJQ1RCTE4oMyxjYXJkTm8sIHNjcmFtYmxpbmdEaXNhYmxlKSxcCisJQ1RCTE4oNCxjYXJkTm8sIHR4QXR0ZW51YXRpb24pLFwKKwlDVEJMTig1LGNhcmRObywgc3lzdGVtSWQpLCBcCisJQ1RCTE4oNixjYXJkTm8sIG1heERhdGFncmFtU2l6ZSksXAorCUNUQkxOKDcsY2FyZE5vLCBtYXhGcmFtZVNpemUpLFwKKwlDVEJMTig4LGNhcmRObywgbWF4UmV0cmllcyksXAorCUNUQkxOKDksY2FyZE5vLCByZWNlaXZlTW9kZSksXAorCUNUQkxOKDEwLGNhcmRObywgcHJpb3JpdHkpLFwKKwlDVEJMTigxMSxjYXJkTm8sIHJvb3RPclJlcGVhdGVyKSxcCisJQ1RCTE4oMTIsY2FyZE5vLCBTSUQpLFwKKwlDVEJMTigxMyxjYXJkTm8sIHJlZ2lzdHJhdGlvbk1vZGUpLFwKKwlDVEJMTigxNCxjYXJkTm8sIHJlZ2lzdHJhdGlvbkZpbGwpLFwKKwlDVEJMTigxNSxjYXJkTm8sIGxvY2FsVGFsa0FkZHJlc3MpLFwKKwlDVEJMTigxNixjYXJkTm8sIGNvZGVGb3JtYXQpLFwKKwlDVEJMTigxNyxjYXJkTm8sIG51bUNoYW5uZWxzKSxcCisJQ1RCTE4oMTgsY2FyZE5vLCBjaGFubmVsMSksXAorCUNUQkxOKDE5LGNhcmRObywgY2hhbm5lbDIpLFwKKwlDVEJMTigyMCxjYXJkTm8sIGNoYW5uZWwzKSxcCisJQ1RCTE4oMjEsY2FyZE5vLCBjaGFubmVsNCksXAorCUNUQkxOKDIyLGNhcmRObywgdHhDbGVhciksXAorCUNUQkxOKDIzLGNhcmRObywgdHhSZXRyaWVzKSxcCisJQ1RCTE4oMjQsY2FyZE5vLCB0eFJvdXRpbmcpLFwKKwlDVEJMTigyNSxjYXJkTm8sIHR4U2NyYW1ibGVkKSxcCisJQ1RCTE4oMjYsY2FyZE5vLCByeFBhcmFtZXRlciksXAorCUNUQkxOKDI3LGNhcmRObywgdHhUaW1lb3V0TXMpLFwKKwlDVEJMTigyOCxjYXJkTm8sIHdhaXRDYXJkVGltZW91dCksXAorCUNUQkxOKDI5LGNhcmRObywgY2hhbm5lbFNldCksIFwKKwl7LmN0bF9uYW1lID0gMzAsIC5wcm9jbmFtZSA9ICJuYW1lIixcCisJIC5kYXRhID0gYXJsYW5fY29uZltjYXJkTm9dLnNpdGVOYW1lLFwKKwkgLm1heGxlbiA9IDE2LCAubW9kZSA9IDA2MDAsIC5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb3N0cmluZ30sXAorCUNUQkxOKDMxLGNhcmRObyx3YWl0VGltZSksXAorCUNUQkxOKDMyLGNhcmRObyxsUGFyYW1ldGVyKSxcCisJQ1RCTE4oMzMsY2FyZE5vLF8xNSksXAorCUNUQkxOKDM0LGNhcmRObyxoZWFkZXJTaXplKSxcCisJQ1RCTE4oMzYsY2FyZE5vLHR4X2RlbGF5X21zKSxcCisJQ1RCTE4oMzcsY2FyZE5vLHJldHJpZXMpLFwKKwlDVEJMTigzOCxjYXJkTm8sUmVUcmFuc21pdFBhY2tldE1heFNpemUpLFwKKwlDVEJMTigzOSxjYXJkTm8sd2FpdFJlVHJhbnNtaXRQYWNrZXRNYXhTaXplKSxcCisJQ1RCTE4oNDAsY2FyZE5vLGZhc3RSZVRyYW5zQ291bnQpLFwKKwlDVEJMTig0MSxjYXJkTm8sZHJpdmVyUmV0cmFuc21pc3Npb25zKSxcCisJQ1RCTE4oNDIsY2FyZE5vLHR4QWNrVGltZW91dE1zKSxcCisJQ1RCTE4oNDMsY2FyZE5vLHJlZ2lzdHJhdGlvbkludGVycnVwdHMpLFwKKwlDVEJMTig0NCxjYXJkTm8saGFyZHdhcmVUeXBlKSxcCisJQ1RCTE4oNDUsY2FyZE5vLHJhZGlvVHlwZSksXAorCUNUQkxOKDQ2LGNhcmRObyx3cml0ZUVFUFJPTSksXAorCUNUQkxOKDQ3LGNhcmRObyx3cml0ZVJhZGlvVHlwZSksXAorCUFSTEFOX1BST0NfREVCVUdfRU5UUklFU1wKKwlDVEJMTig1MCxjYXJkTm8saW5fc3BlZWQpLFwKKwlDVEJMTig1MSxjYXJkTm8sb3V0X3NwZWVkKSxcCisJQ1RCTE4oNTIsY2FyZE5vLGluX3NwZWVkMTApLFwKKwlDVEJMTig1MyxjYXJkTm8sb3V0X3NwZWVkMTApLFwKKwlDVEJMTig1NCxjYXJkTm8saW5fc3BlZWRfbWF4KSxcCisJQ1RCTE4oNTUsY2FyZE5vLG91dF9zcGVlZF9tYXgpLFwKKwlDVEJMTig1NixjYXJkTm8sbWVhc3VyZV9yYXRlKSxcCisJQ1RCTE4oNTcsY2FyZE5vLHByZV9Db21tYW5kX1dhaXQpLFwKKwlDVEJMTig1OCxjYXJkTm8scnhfdHdlYWsxKSxcCisJQ1RCTE4oNTksY2FyZE5vLHJ4X3R3ZWFrMiksXAorCUNUQkxOKDYwLGNhcmRObyx0eF9xdWV1ZV9sZW4pLFwKKworCisKK3N0YXRpYyBjdGxfdGFibGUgYXJsYW5fY29uZl90YWJsZTBbXSA9Cit7CisJQVJMQU5fU1lTQ1RMX1RBQkxFX1RPVEFMKDApCisKKyNpZmRlZiBBUkxBTl9QUk9DX1NITV9EVU1QCisJeworCQkuY3RsX25hbWUJPSAxNTAsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjAtdHhSaW5nIiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm90eFJpbmcsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1MSwKKwkJLnByb2NuYW1lCT0gImFybGFuMC1yeFJpbmciLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mb3J4UmluZywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTUyLAorCQkucHJvY25hbWUJPSAiYXJsYW4wLTE4IiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm8xOCwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTUzLAorCQkucHJvY25hbWUJPSAiYXJsYW4wLXJpbmciLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mbzE2MTcxOSwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTU0LAorCQkucHJvY25hbWUJPSAiYXJsYW4wLXNobS1jcHkiLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mbywKKwl9LAorI2VuZGlmCisJeworCQkuY3RsX25hbWUJPSAxNTUsCisJCS5wcm9jbmFtZQk9ICJjb25maWcwIiwKKwkJLmRhdGEJCT0gJmNvbmZfcmVzZXRfcmVzdWx0LAorCQkubWF4bGVuCQk9IDEwMCwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9jb25maWd1cmUKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTU2LAorCQkucHJvY25hbWUJPSAicmVzZXQwIiwKKwkJLmRhdGEJCT0gJmNvbmZfcmVzZXRfcmVzdWx0LAorCQkubWF4bGVuCQk9IDEwMCwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfcmVzZXQsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworc3RhdGljIGN0bF90YWJsZSBhcmxhbl9jb25mX3RhYmxlMVtdID0KK3sKKworCUFSTEFOX1NZU0NUTF9UQUJMRV9UT1RBTCgxKQorCisjaWZkZWYgQVJMQU5fUFJPQ19TSE1fRFVNUAorCXsKKwkJLmN0bF9uYW1lCT0gMTUwLAorCQkucHJvY25hbWUJPSAiYXJsYW4xLXR4UmluZyIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvdHhSaW5nLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTEsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjEtcnhSaW5nIiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm9yeFJpbmcsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1MiwKKwkJLnByb2NuYW1lCT0gImFybGFuMS0xOCIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvMTgsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1MywKKwkJLnByb2NuYW1lCT0gImFybGFuMS1yaW5nIiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm8xNjE3MTksCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1NCwKKwkJLnByb2NuYW1lCT0gImFybGFuMS1zaG0tY3B5IiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm8sCisJfSwKKyNlbmRpZgorCXsKKwkJLmN0bF9uYW1lCT0gMTU1LAorCQkucHJvY25hbWUJPSAiY29uZmlnMSIsCisJCS5kYXRhCQk9ICZjb25mX3Jlc2V0X3Jlc3VsdCwKKwkJLm1heGxlbgkJPSAxMDAsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fY29uZmlndXJlLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTYsCisJCS5wcm9jbmFtZQk9ICJyZXNldDEiLAorCQkuZGF0YQkJPSAmY29uZl9yZXNldF9yZXN1bHQsCisJCS5tYXhsZW4JCT0gMTAwLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9yZXNldCwKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIGFybGFuX2NvbmZfdGFibGUyW10gPQoreworCisJQVJMQU5fU1lTQ1RMX1RBQkxFX1RPVEFMKDIpCisKKyNpZmRlZiBBUkxBTl9QUk9DX1NITV9EVU1QCisJeworCQkuY3RsX25hbWUJPSAxNTAsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjItdHhSaW5nIiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm90eFJpbmcsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1MSwKKwkJLnByb2NuYW1lCT0gImFybGFuMi1yeFJpbmciLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mb3J4UmluZywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTUyLAorCQkucHJvY25hbWUJPSAiYXJsYW4yLTE4IiwKKwkJLmRhdGEJCT0gJmFybGFuX2RyaXZlX2luZm8sCisJCS5tYXhsZW4JCT0gQVJMQU5fU1RSX1NJWkUsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX2luZm8xOCwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTUzLAorCQkucHJvY25hbWUJPSAiYXJsYW4yLXJpbmciLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mbzE2MTcxOSwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTU0LAorCQkucHJvY25hbWUJPSAiYXJsYW4yLXNobS1jcHkiLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mbywKKwl9LAorI2VuZGlmCisJeworCQkuY3RsX25hbWUJPSAxNTUsCisJCS5wcm9jbmFtZQk9ICJjb25maWcyIiwKKwkJLmRhdGEJCT0gJmNvbmZfcmVzZXRfcmVzdWx0LAorCQkubWF4bGVuCQk9IDEwMCwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9jb25maWd1cmUsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDE1NiwKKwkJLnByb2NuYW1lCT0gInJlc2V0MiIsCisJCS5kYXRhCQk9ICZjb25mX3Jlc2V0X3Jlc3VsdCwKKwkJLm1heGxlbgkJPSAxMDAsCisJCS5tb2RlCQk9IDA0MDAsCisJCS5wcm9jX2hhbmRsZXIJPSAmYXJsYW5fc3lzY3RsX3Jlc2V0LAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKK3N0YXRpYyBjdGxfdGFibGUgYXJsYW5fY29uZl90YWJsZTNbXSA9Cit7CisKKwlBUkxBTl9TWVNDVExfVEFCTEVfVE9UQUwoMykKKworI2lmZGVmIEFSTEFOX1BST0NfU0hNX0RVTVAKKwl7CisJCS5jdGxfbmFtZQk9IDE1MCwKKwkJLnByb2NuYW1lCT0gImFybGFuMy10eFJpbmciLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mb3R4UmluZywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTUxLAorCQkucHJvY25hbWUJPSAiYXJsYW4zLXJ4UmluZyIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvcnhSaW5nLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTIsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjMtMTgiLAorCQkuZGF0YQkJPSAmYXJsYW5fZHJpdmVfaW5mbywKKwkJLm1heGxlbgkJPSBBUkxBTl9TVFJfU0laRSwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfaW5mbzE4LAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTMsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjMtcmluZyIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvMTYxNzE5LAorCX0sCisJeworCQkuY3RsX25hbWUJPSAxNTQsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjMtc2htLWNweSIsCisJCS5kYXRhCQk9ICZhcmxhbl9kcml2ZV9pbmZvLAorCQkubWF4bGVuCQk9IEFSTEFOX1NUUl9TSVpFLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX3N5c2N0bF9pbmZvLAorCX0sCisjZW5kaWYKKwl7CisJCS5jdGxfbmFtZQk9IDE1NSwKKwkJLnByb2NuYW1lCT0gImNvbmZpZzMiLAorCQkuZGF0YQkJPSAmY29uZl9yZXNldF9yZXN1bHQsCisJCS5tYXhsZW4JCT0gMTAwLAorCQkubW9kZQkJPSAwNDAwLAorCQkucHJvY19oYW5kbGVyCT0gJmFybGFuX2NvbmZpZ3VyZSwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMTU2LAorCQkucHJvY25hbWUJPSAicmVzZXQzIiwKKwkJLmRhdGEJCT0gJmNvbmZfcmVzZXRfcmVzdWx0LAorCQkubWF4bGVuCQk9IDEwMCwKKwkJLm1vZGUJCT0gMDQwMCwKKwkJLnByb2NfaGFuZGxlcgk9ICZhcmxhbl9zeXNjdGxfcmVzZXQsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworCisKK3N0YXRpYyBjdGxfdGFibGUgYXJsYW5fdGFibGVbXSA9Cit7CisJeworCQkuY3RsX25hbWUJPSAwLAorCQkucHJvY25hbWUJPSAiYXJsYW4wIiwKKwkJLm1heGxlbgkJPSAwLAorCQkubW9kZQkJPSAwNjAwLAorCQkuY2hpbGQJCT0gYXJsYW5fY29uZl90YWJsZTAsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IDAsCisJCS5wcm9jbmFtZQk9ICJhcmxhbjEiLAorCQkubWF4bGVuCQk9IDAsCisJCS5tb2RlCQk9IDA2MDAsCisJCS5jaGlsZAkJPSBhcmxhbl9jb25mX3RhYmxlMSwKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gMCwKKwkJLnByb2NuYW1lCT0gImFybGFuMiIsCisJCS5tYXhsZW4JCT0gMCwKKwkJLm1vZGUJCT0gMDYwMCwKKwkJLmNoaWxkCQk9IGFybGFuX2NvbmZfdGFibGUyLAorCX0sCisJeworCQkuY3RsX25hbWUJPSAwLAorCQkucHJvY25hbWUJPSAiYXJsYW4zIiwKKwkJLm1heGxlbgkJPSAwLAorCQkubW9kZQkJPSAwNjAwLAorCQkuY2hpbGQJCT0gYXJsYW5fY29uZl90YWJsZTMsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworI2Vsc2UKKworc3RhdGljIGN0bF90YWJsZSBhcmxhbl90YWJsZVtNQVhfQVJMQU5TICsgMV0gPQoreworCXsgLmN0bF9uYW1lID0gMCB9Cit9OworI2VuZGlmCisjZWxzZQorCitzdGF0aWMgY3RsX3RhYmxlIGFybGFuX3RhYmxlW01BWF9BUkxBTlMgKyAxXSA9Cit7CisJeyAuY3RsX25hbWUgPSAwIH0KK307CisjZW5kaWYKKworCisvLyBzdGF0aWMgaW50IG1tdHUgPSAxMjM0OworCitzdGF0aWMgY3RsX3RhYmxlIGFybGFuX3Jvb3RfdGFibGVbXSA9Cit7CisJeworCQkuY3RsX25hbWUJPSAyNTQsCisJCS5wcm9jbmFtZQk9ICJhcmxhbiIsCisJCS5tYXhsZW4JCT0gMCwKKwkJLm1vZGUJCT0gMDU1NSwKKwkJLmNoaWxkCQk9IGFybGFuX3RhYmxlLAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0KK307CisKKy8qIE1ha2Ugc3VyZSB0aGF0IC9wcm9jL3N5cy9kZXYgaXMgdGhlcmUgKi8KKy8vc3RhdGljIGN0bF90YWJsZSBhcmxhbl9kZXZpY2Vfcm9vdF90YWJsZVtdID0KKy8veworLy8Je0NUTF9ERVYsICJkZXYiLCBOVUxMLCAwLCAwNTU1LCBhcmxhbl9yb290X3RhYmxlfSwKKy8vCXswfQorLy99OworCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICphcmxhbl9kZXZpY2Vfc3lzY3RsX2hlYWRlcjsKKworaW50IF9faW5pdCBpbml0X2FybGFuX3Byb2Modm9pZCkKK3sKKworCWludCBpID0gMDsKKwlpZiAoYXJsYW5fZGV2aWNlX3N5c2N0bF9oZWFkZXIpCisJCXJldHVybiAwOworCWZvciAoaSA9IDA7IGkgPCBNQVhfQVJMQU5TICYmIGFybGFuX2RldmljZVtpXTsgaSsrKQorCQlhcmxhbl90YWJsZVtpXS5jdGxfbmFtZSA9IGkgKyAxOworCWFybGFuX2RldmljZV9zeXNjdGxfaGVhZGVyID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGFybGFuX3Jvb3RfdGFibGUsIDApOworCWlmICghYXJsYW5fZGV2aWNlX3N5c2N0bF9oZWFkZXIpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworCit9CisKK3ZvaWQgX19leGl0IGNsZWFudXBfYXJsYW5fcHJvYyh2b2lkKQoreworCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGFybGFuX2RldmljZV9zeXNjdGxfaGVhZGVyKTsKKwlhcmxhbl9kZXZpY2Vfc3lzY3RsX2hlYWRlciA9IE5VTEw7CisKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXJsYW4uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FybGFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBhNmQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FybGFuLmgKQEAgLTAsMCArMSw1NDEgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3IEN1bGxlbiBKZW5uaW5ncworICogIENvcHlyaWdodCAoQykgMTk5OCBFbG1lci5Kb2FuZGlAdXQuZWUsICszNy0yNTUtMTM1MDAJCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CS8qIEZvciB0aGUgc3RhdGlzdGljcyBzdHJ1Y3R1cmUuICovCisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CS8qIEZvciBBUlBIUkRfRVRIRVIgKi8KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKworCisvLyNkZWZpbmUgQVJMQU5fREVCVUdHSU5HIDEKKworI2RlZmluZSBBUkxBTl9QUk9DX0lOVEVSRkFDRQorI2RlZmluZSBNQVhfQVJMQU5TIDQgLyogbm90IG1vcmUgdGhhbiA0ICEgKi8KKyNkZWZpbmUgQVJMQU5fUFJPQ19TSE1fRFVNUCAvKiBzaG93cyBhbGwgY2FyZCByZWdpc3RlcnMsIG1ha2VzIGRyaXZlciB3YXkgbGFyZ2VyICovCisKKyNkZWZpbmUgQVJMQU5fTUFYX01VTFRJQ0FTVF9BRERSUyAxNgorI2RlZmluZSBBUkxBTl9SQ1ZfQ0xFQU4gCTAKKyNkZWZpbmUgQVJMQU5fUkNWX1BST01JU0MgMQorI2RlZmluZSBBUkxBTl9SQ1ZfQ09OVFJPTCAyCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworZXh0ZXJuIGludCBpbml0X2FybGFuX3Byb2Modm9pZCk7CitleHRlcm4gdm9pZCBjbGVhbnVwX2FybGFuX3Byb2Modm9pZCk7CisjZWxzZQorI2RlZmluZSBpbml0X2FybGFuX3Byb2MoKQkoeyAwOyB9KQorI2RlZmluZSBjbGVhbnVwX2FybGFuX3Byb2MoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICphcmxhbl9kZXZpY2VbTUFYX0FSTEFOU107CitleHRlcm4gaW50CWFybGFuX2RlYnVnOworZXh0ZXJuIGludAlhcmxhbl9lbnRyeV9kZWJ1ZzsKK2V4dGVybiBpbnQJYXJsYW5fZXhpdF9kZWJ1ZzsKK2V4dGVybiBpbnQJdGVzdE1lbW9yeTsKK2V4dGVybiBpbnQgICAgIGFybGFuX2NvbW1hbmQoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGludCBjb21tYW5kKTsKKyAKKyNkZWZpbmUgU0lEVU5LTk9XTiAtMQorI2RlZmluZSByYWRpb05vZGVJZFVOS05PV04gLTEKKyNkZWZpbmUgaXJxVU5LTk9XTiAwCisjZGVmaW5lIGRlYnVnVU5LTk9XTiAwCisjZGVmaW5lIHRlc3RNZW1vcnlVTktOT1dOIDEKKyNkZWZpbmUgc3ByZWFkaW5nQ29kZVVOS05PV04gMAorI2RlZmluZSBjaGFubmVsTnVtYmVyVU5LTk9XTiAwCisjZGVmaW5lIGNoYW5uZWxTZXRVTktOT1dOIDAKKyNkZWZpbmUgc3lzdGVtSWRVTktOT1dOIC0xCisjZGVmaW5lIHJlZ2lzdHJhdGlvbk1vZGVVTktOT1dOIC0xCisKKworI2RlZmluZSBJRkRFQlVHKCBMICkgaWYgKCAoTCkgJiBhcmxhbl9kZWJ1ZyApIAorI2RlZmluZSBBUkxBTl9GQUtFX0hEUl9MRU4gMTIgCisKKyNpZmRlZiBBUkxBTl9ERUJVR0dJTkcKKwkjZGVmaW5lIERFQlVHIDEKKwkjZGVmaW5lIEFSTEFOX0VOVFJZX0VYSVRfREVCVUdHSU5HIDEKKwkjZGVmaW5lIEFSTEFOX0RFQlVHKGEsYikgcHJpbnRrKEtFUk5fREVCVUcgYSwgYikKKyNlbHNlCisJI2RlZmluZSBBUkxBTl9ERUJVRyhhLGIpIAorI2VuZGlmCisKKyNkZWZpbmUgQVJMQU5fU0hNRU1fU0laRQkweDIwMDAKKworc3RydWN0IGFybGFuX3NobWVtCit7CisgICAgICAvKiBIZWFkZXIgU2lnbmF0dXJlICovIAorICAgICAgdm9sYXRpbGUJY2hhciB0ZXh0UmVnaW9uWzQ4XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciByZXNldEZsYWc7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgIGRpYWdub3N0aWNJbmZvOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCBkaWFnbm9zdGljT2Zmc2V0OworICAgICAgdm9sYXRpbGUJdV9jaGFyIF8xWzEyXTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBsYW5DYXJkTm9kZUlkWzZdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGJyb2FkY2FzdEFkZHJlc3NbNl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgaGFyZHdhcmVUeXBlOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG1ham9ySGFyZHdhcmVWZXJzaW9uOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG1pbm9ySGFyZHdhcmVWZXJzaW9uOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHJhZGlvTW9kdWxlOy8vIHNob3dzIEVFUFJPTSwgY2FuIGJlIG92ZXJyaWRkZW4gYXQgMHgxMTEKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBkZWZhdWx0Q2hhbm5lbFNldDsgLy8gc2hvd3MgRUVQcm9tLCBjYW4gYmUgb3ZlcnJpaWRlbiBhdCAweDEwQQorICAgICAgdm9sYXRpbGUJdV9jaGFyIF8yWzQ3XTsKKyAgICAgIAorICAgICAgLyogQ29udHJvbC9TdGF0dXMgQmxvY2sgLSAweDAwODAgKi8KKyAgICAgIHZvbGF0aWxlCXVfY2hhciBpbnRlcnJ1cHRJblByb2dyZXNzOyAvKiBub3QgdXNlZCBieSBsYW5jcHUgKi8KKyAgICAgIHZvbGF0aWxlCXVfY2hhciBjbnRybFJlZ0ltYWdlOyAvKiBub3QgdXNlZCBieSBsYW5jcHUgKi8KKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfM1sxM107CisgICAgICB2b2xhdGlsZQl1X2NoYXIgZHVtcEJ5dGU7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgY29tbWFuZEJ5dGU7IC8qIG5vbi16ZXJvID0gYWN0aXZlICovCisgICAgICB2b2xhdGlsZQl1X2NoYXIgY29tbWFuZFBhcmFtZXRlclsxNV07CisKKyAgICAgIC8qIFJlY2VpdmUgU3RhdHVzIC0gMHgwMGEwICovCisgICAgICB2b2xhdGlsZQl1X2NoYXIgcnhTdGF0dXM7IC8qIDEtIGRhdGEsIDItY29udHJvbCwgMHhmZiAtIHJlZ2lzdHIgY2hhbmdlICovCisgICAgICB2b2xhdGlsZQl1X2NoYXIgcnhGcm1UeXBlOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCByeE9mZnNldDsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgcnhMZW5ndGg7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgcnhTcmNbNl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgcnhCcm9hZGNhc3RGbGFnOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHJ4UXVhbGl0eTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBzY3JhbWJsZWQ7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzRbMV07CisgICAgICAKKyAgICAgIC8qIFRyYW5zbWl0IFN0YXR1cyAtIDB4MDBiMCAqLworICAgICAgdm9sYXRpbGUJdV9jaGFyIHR4U3RhdHVzOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHR4QWNrUXVhbGl0eTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1SZXRyaWVzOworICAgICAgdm9sYXRpbGUJdV9jaGFyIF81WzE0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciByZWdpc3RlcmVkUm91dGVyWzZdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGJhY2tib25lUm91dGVyWzZdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHJlZ2lzdHJhdGlvblN0YXR1czsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBjb25maWd1cmVkU3RhdHVzRmxhZzsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfNlsxXTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciB1bHRpbWF0ZURlc3RBZGRyZXNzWzZdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGltbWVkRGVzdEFkZHJlc3NbNl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgaW1tZWRTcmNBZGRyZXNzWzZdOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCByeFNlcXVlbmNlTnVtYmVyOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGFzc2lnbmVkTG9jYWx0YWxrQWRkcmVzczsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfN1syN107CisKKyAgICAgIC8qIFN5c3RlbSBQYXJhbWV0ZXIgQmxvY2sgKi8KKworICAgICAgLyogLSBEcml2ZXIgUGFyYW1ldGVycyAoTm92ZWxsIFNwZWNpZmljKSAqLworCisgICAgICB2b2xhdGlsZQl1X3Nob3J0IHR4VGltZW91dDsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgdHJhbnNwb3J0VGltZTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfOFs0XTsKKworICAgICAgLyogLSBDb25maWd1cmF0aW9uIFBhcmFtZXRlcnMgKi8KKyAgICAgIHZvbGF0aWxlCXVfY2hhciBpcnFMZXZlbDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBzcHJlYWRpbmdDb2RlOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGNoYW5uZWxTZXQ7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgY2hhbm5lbE51bWJlcjsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgcmFkaW9Ob2RlSWQ7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzlbMl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgc2NyYW1ibGluZ0Rpc2FibGU7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgcmFkaW9UeXBlOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCByb3V0ZXJJZDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfMTBbOV07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgdHhBdHRlbnVhdGlvbjsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBzeXN0ZW1JZFs0XTsgCisgICAgICB2b2xhdGlsZQl1X3Nob3J0IGdsb2JhbENoZWNrc3VtOworICAgICAgdm9sYXRpbGUJdV9jaGFyIF8xMVs0XTsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgbWF4RGF0YWdyYW1TaXplOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCBtYXhGcmFtZVNpemU7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbWF4UmV0cmllczsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciByZWNlaXZlTW9kZTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBwcmlvcml0eTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciByb290T3JSZXBlYXRlcjsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBzcGVjaWZpZWRSb3V0ZXJbNl07CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IGZhc3RQb2xsUGVyaW9kOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHBvbGxEZWNheTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBmYXN0UG9sbERlbGF5WzJdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGFybFRocmVzaG9sZDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBhcmxEZWNheTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfMTJbMV07CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IHNwZWNSb3V0ZXJUaW1lb3V0OworICAgICAgdm9sYXRpbGUJdV9jaGFyIF8xM1s1XTsKKworICAgICAgLyogU2NyYW1ibGVkIEFyZWEgKi8KKyAgICAgIHZvbGF0aWxlCXVfY2hhciBTSURbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgZW5jcnlwdGlvbktleVsxMl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzE0WzJdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHdhaXRUaW1lWzJdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGxQYXJhbWV0ZXJbMl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzE1WzNdOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCBoZWFkZXJTaXplOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCBzZWN0aW9uQ2hlY2tzdW07CisKKyAgICAgIHZvbGF0aWxlCXVfY2hhciByZWdpc3RyYXRpb25Nb2RlOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHJlZ2lzdHJhdGlvbkZpbGw7CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IHBvbGxQZXJpb2Q7CisgICAgICB2b2xhdGlsZQl1X3Nob3J0IHJlZnJlc2hQZXJpb2Q7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbmFtZVsxNl07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgTklEWzZdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGxvY2FsVGFsa0FkZHJlc3M7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgY29kZUZvcm1hdDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1DaGFubmVsczsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBjaGFubmVsMTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBjaGFubmVsMjsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBjaGFubmVsMzsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBjaGFubmVsNDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBTU0NvZGVbNTldOworCisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzE2WzB4QzBdOworICAgICAgdm9sYXRpbGUJdV9zaG9ydCBhdXhDbWQ7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgIGR1bXBQdHJbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgZHVtcFZhbDsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBfMTdbMHg2QV07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgd2lyZVRlc3Q7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzE4WzE0XTsKKworICAgICAgLyogU3RhdGlzdGljcyBCbG9jayAtIDB4MDMwMCAqLworICAgICAgdm9sYXRpbGUJdV9jaGFyIGhvc3RjcHVMb2NrOworICAgICAgdm9sYXRpbGUJdV9jaGFyIGxhbmNwdUxvY2s7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgcmVzZXRUaW1lWzE4XTsKKyAgICAgIAorICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bURhdGFncmFtc1RyYW5zbWl0dGVkWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bVJlVHJhbnNtaXNzaW9uc1s0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1GcmFtZXNEaXNjYXJkZWRbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtRGF0YWdyYW1zUmVjZWl2ZWRbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtRHVwbGljYXRlUmVjZWl2ZWRGcmFtZXNbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtRGF0YWdyYW1zRGlzY2FyZGVkWzRdOworICAgICAgCisgICAgICB2b2xhdGlsZQl1X3Nob3J0IG1heE51bVJlVHJhbnNtaXREYXRhZ3JhbTsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgbWF4TnVtUmVUcmFuc21pdEZyYW1lczsKKyAgICAgIHZvbGF0aWxlCXVfc2hvcnQgbWF4TnVtQ29uc2VjdXRpdmVEdXBsaWNhdGVGcmFtZXM7CisgICAgICAvKiBtaXNhbGlnbmVkIGhlcmUgc28gd2UgaGF2ZSB0byBnbyB0byBjaGFyYWN0ZXJzICovCisgICAgIAorICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bUJ5dGVzVHJhbnNtaXR0ZWRbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtQnl0ZXNSZWNlaXZlZFs0XTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBudW1DUkNFcnJvcnNbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtTGVuZ3RoRXJyb3JzWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bUFib3J0RXJyb3JzWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bVRYVW5kZXJydW5zWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bVJYT3ZlcnJ1bnNbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtSG9sZE9mZnNbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtRnJhbWVzVHJhbnNtaXR0ZWRbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtRnJhbWVzUmVjZWl2ZWRbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtUmVjZWl2ZUZyYW1lc0xvc3RbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtUlhCdWZmZXJPdmVyZmxvd3NbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtRnJhbWVzRGlzY2FyZGVkQWRkck1pc21hdGNoWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bUZyYW1lc0Rpc2NhcmRlZFNJRE1pc21hdGNoWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bVBvbGxzVHJhbnNtaXN0dGVkWzRdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIG51bVBvbGxBY2tub3dsZWRnZXNbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtU3RhdHVzVGltZW91dHNbNF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgbnVtTkFDS1JlY2VpdmVkWzRdOworCisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzE5WzB4ODZdOworCisgICAgICB2b2xhdGlsZQl1X2NoYXIgdHhCdWZmZXJbMHg4MDBdOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHJ4QnVmZmVyWzB4ODAwXTsKKworICAgICAgdm9sYXRpbGUJdV9jaGFyIF8yMFsweDgwMF07CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzIxWzB4M2ZiXTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBjb25maWdTdGF0dXM7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgXzIyOworICAgICAgdm9sYXRpbGUJdV9jaGFyIHByb2dJT0N0cmw7CisgICAgICB2b2xhdGlsZQl1X2NoYXIgc2hhcmVNQmFzZTsKKyAgICAgIHZvbGF0aWxlCXVfY2hhciBjb250cm9sUmVnaXN0ZXI7Cit9OworCitzdHJ1Y3QgYXJsYW5fY29uZl9zdHJ1IHsKKyAgICAgIGludCBzcHJlYWRpbmdDb2RlOworICAgICAgaW50IGNoYW5uZWxTZXQ7CisgICAgICBpbnQgY2hhbm5lbE51bWJlcjsKKyAgICAgIGludCBzY3JhbWJsaW5nRGlzYWJsZTsKKyAgICAgIGludCB0eEF0dGVudWF0aW9uOworICAgICAgaW50IHN5c3RlbUlkOyAKKyAgICAgIGludCBtYXhEYXRhZ3JhbVNpemU7CisgICAgICBpbnQgbWF4RnJhbWVTaXplOworICAgICAgaW50IG1heFJldHJpZXM7CisgICAgICBpbnQgcmVjZWl2ZU1vZGU7CisgICAgICBpbnQgcHJpb3JpdHk7CisgICAgICBpbnQgcm9vdE9yUmVwZWF0ZXI7CisgICAgICBpbnQgU0lEOworICAgICAgaW50IHJhZGlvTm9kZUlkOworICAgICAgaW50IHJlZ2lzdHJhdGlvbk1vZGU7CisgICAgICBpbnQgcmVnaXN0cmF0aW9uRmlsbDsKKyAgICAgIGludCBsb2NhbFRhbGtBZGRyZXNzOworICAgICAgaW50IGNvZGVGb3JtYXQ7CisgICAgICBpbnQgbnVtQ2hhbm5lbHM7CisgICAgICBpbnQgY2hhbm5lbDE7CisgICAgICBpbnQgY2hhbm5lbDI7CisgICAgICBpbnQgY2hhbm5lbDM7CisgICAgICBpbnQgY2hhbm5lbDQ7CisgICAgICBpbnQgdHhDbGVhcjsKKyAgICAgIGludCB0eFJldHJpZXM7CisgICAgICBpbnQgdHhSb3V0aW5nOworICAgICAgaW50IHR4U2NyYW1ibGVkOworICAgICAgaW50IHJ4UGFyYW1ldGVyOworICAgICAgaW50IHR4VGltZW91dE1zOworICAgICAgaW50IHR4QWNrVGltZW91dE1zOworICAgICAgaW50IHdhaXRDYXJkVGltZW91dDsKKyAgICAgIGludAl3YWl0VGltZTsKKyAgICAgIGludAlsUGFyYW1ldGVyOworICAgICAgaW50CV8xNTsKKyAgICAgIGludAloZWFkZXJTaXplOworICAgICAgaW50IHJldHJpZXM7CisgICAgICBpbnQgdHhfZGVsYXlfbXM7CisgICAgICBpbnQgd2FpdFJlVHJhbnNtaXRQYWNrZXRNYXhTaXplOworICAgICAgaW50IFJlVHJhbnNtaXRQYWNrZXRNYXhTaXplOworICAgICAgaW50IGZhc3RSZVRyYW5zQ291bnQ7CisgICAgICBpbnQgZHJpdmVyUmV0cmFuc21pc3Npb25zOworICAgICAgaW50IHJlZ2lzdHJhdGlvbkludGVycnVwdHM7CisgICAgICBpbnQgaGFyZHdhcmVUeXBlOworICAgICAgaW50IHJhZGlvVHlwZTsKKyAgICAgIGludCB3cml0ZVJhZGlvVHlwZTsKKyAgICAgIGludCB3cml0ZUVFUFJPTTsKKyAgICAgIGNoYXIgc2l0ZU5hbWVbMTddOworICAgICAgaW50IG1lYXN1cmVfcmF0ZTsKKyAgICAgIGludCBpbl9zcGVlZDsKKyAgICAgIGludCBvdXRfc3BlZWQ7CisgICAgICBpbnQgaW5fc3BlZWQxMDsKKyAgICAgIGludCBvdXRfc3BlZWQxMDsKKyAgICAgIGludCBpbl9zcGVlZF9tYXg7CisgICAgICBpbnQgb3V0X3NwZWVkX21heDsKKyAgICAgIGludCBwcmVfQ29tbWFuZF9XYWl0OworICAgICAgaW50IHJ4X3R3ZWFrMTsKKyAgICAgIGludCByeF90d2VhazI7CisgICAgICBpbnQgdHhfcXVldWVfbGVuOworfTsKKworZXh0ZXJuIHN0cnVjdCBhcmxhbl9jb25mX3N0cnUgYXJsYW5fY29uZltNQVhfQVJMQU5TXTsKKworc3RydWN0IFR4UGFyYW0KK3sKKyAgICAgIHZvbGF0aWxlCXNob3J0IAkJb2Zmc2V0OworICAgICAgdm9sYXRpbGUgCXNob3J0IAkJbGVuZ3RoOworICAgICAgdm9sYXRpbGUJdV9jaGFyIAkJZGVzdFs2XTsKKyAgICAgIHZvbGF0aWxlCXVuc2lnbmVkCWNoYXIgY2xlYXI7CisgICAgICB2b2xhdGlsZQl1bnNpZ25lZAljaGFyIHJldHJpZXM7CisgICAgICB2b2xhdGlsZQl1bnNpZ25lZAljaGFyIHJvdXRpbmc7CisgICAgICB2b2xhdGlsZQl1bnNpZ25lZAljaGFyIHNjcmFtYmxlZDsKK307CisKKyNkZWZpbmUgVFhfUklOR19TSVpFIDIKKy8qIEluZm9ybWF0aW9uIHRoYXQgbmVlZCB0byBiZSBrZXB0IGZvciBlYWNoIGJvYXJkLiAqLworc3RydWN0IGFybGFuX3ByaXZhdGUgeworICAgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisgICAgICBzdHJ1Y3QgYXJsYW5fc2htZW0gX19pb21lbSAqIGNhcmQ7CisgICAgICBzdHJ1Y3QgYXJsYW5fc2htZW0gKiBjb25mOworCisgICAgICBzdHJ1Y3QgYXJsYW5fY29uZl9zdHJ1ICogQ29uZjsJICAgICAKKyAgICAgIGludAliYWQ7CisgICAgICBpbnQgCXJlc2V0OworICAgICAgdW5zaWduZWQgbG9uZyBsYXN0UmVzZXQ7CisgICAgICBzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKyAgICAgIHN0cnVjdCB0aW1lcl9saXN0IHR4X2RlbGF5X3RpbWVyOworICAgICAgc3RydWN0IHRpbWVyX2xpc3QgdHhfcmV0cnlfdGltZXI7CisgICAgICBzdHJ1Y3QgdGltZXJfbGlzdCByeF9jaGVja190aW1lcjsKKworICAgICAgaW50IHJlZ2lzdHJhdGlvbkxvc3RDb3VudDsKKyAgICAgIGludCByZVJlZ2lzdGVyRXhwOworICAgICAgaW50IGlycV90ZXN0X2RvbmU7CisKKyAgICAgIHN0cnVjdCBUeFBhcmFtIHR4UmluZ1tUWF9SSU5HX1NJWkVdOworICAgICAgY2hhciByZVRyYW5zbWl0QnVmZlsweDgwMF07CisgICAgICBpbnQgdHhMYXN0OworICAgICAgdW5zaWduZWQgUmVUcmFuc21pdFJlcXVlc3RlZDsKKyAgICAgIHVuc2lnbmVkIGxvbmcgdHhfZG9uZV9kZWxheWVkOworICAgICAgdW5zaWduZWQgbG9uZyByZWdpc3RyYXRpb25MYXN0U2VlbjsKKworICAgICAgdW5zaWduZWQgbG9uZwl0eF9sYXN0X3NlbnQ7CisgICAgICB1bnNpZ25lZCBsb25nCXR4X2xhc3RfY2xlYXJlZDsKKyAgICAgIHVuc2lnbmVkIGxvbmcJcmV0cmFuc21pc3Npb25zOworICAgICAgdW5zaWduZWQgbG9uZyAJaW50ZXJydXB0X2Fja19yZXF1ZXN0ZWQ7CisgICAgICBzcGlubG9ja190CWxvY2s7CisgICAgICB1bnNpZ25lZCBsb25nCXdhaXRpbmdfY29tbWFuZF9tYXNrOworICAgICAgdW5zaWduZWQgbG9uZyAJY2FyZF9wb2xsaW5nX2ludGVydmFsOworICAgICAgdW5zaWduZWQgbG9uZyAJbGFzdF9jb21tYW5kX2J1ZmZfZnJlZV90aW1lOworCisgICAgICBpbnQgCQl1bmRlcl9yZXNldDsKKyAgICAgIGludCAJCXVuZGVyX2NvbmZpZzsKKyAgICAgIGludCAJCXJ4X2NvbW1hbmRfZ2l2ZW47CisgICAgICBpbnQJIAl0eF9jb21tYW5kX2dpdmVuOworICAgICAgdW5zaWduZWQgIGxvbmcJaW50ZXJydXB0X3Byb2Nlc3NpbmdfYWN0aXZlOworICAgICAgdW5zaWduZWQgbG9uZwlsYXN0X3J4X2ludF9hY2tfdGltZTsKKyAgICAgIHVuc2lnbmVkIGxvbmcJaW5fYnl0ZXM7CisgICAgICB1bnNpZ25lZCBsb25nIAlvdXRfYnl0ZXM7CisgICAgICB1bnNpZ25lZCBsb25nCWluX3RpbWU7CisgICAgICB1bnNpZ25lZCBsb25nCW91dF90aW1lOworICAgICAgdW5zaWduZWQgbG9uZwlpbl90aW1lMTA7CisgICAgICB1bnNpZ25lZCBsb25nCW91dF90aW1lMTA7CisgICAgICB1bnNpZ25lZCBsb25nCWluX2J5dGVzMTA7CisgICAgICB1bnNpZ25lZCBsb25nIAlvdXRfYnl0ZXMxMDsKKyAgICAgIGludAlpbml0X2V0aGVyZGV2X2FsbG9jOworfTsKKworCisKKyNkZWZpbmUgQVJMQU5fQ0xFQVIJCTB4MDAKKyNkZWZpbmUgQVJMQU5fUkVTRVQgCQkweDAxCisjZGVmaW5lIEFSTEFOX0NIQU5ORUxfQVRURU5USU9OIDB4MDIKKyNkZWZpbmUgQVJMQU5fSU5URVJSVVBUX0VOQUJMRSAJMHgwNAorI2RlZmluZSBBUkxBTl9DTEVBUl9JTlRFUlJVUFQgCTB4MDgKKyNkZWZpbmUgQVJMQU5fUE9XRVIgCQkweDQwCisjZGVmaW5lIEFSTEFOX0FDQ0VTUwkJMHg4MAorCisjZGVmaW5lIEFSTEFOX0NPTV9DT05GICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQVJMQU5fQ09NX1JYX0VOQUJMRSAgICAgICAgICAgMHgwMworI2RlZmluZSBBUkxBTl9DT01fUlhfQUJPUlQgICAgICAgICAgICAweDA0CisjZGVmaW5lIEFSTEFOX0NPTV9UWF9FTkFCTEUgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgQVJMQU5fQ09NX1RYX0FCT1JUICAgICAgICAgICAgMHgwNgorI2RlZmluZSBBUkxBTl9DT01fTk9QCQkgICAgICAweDA3CisjZGVmaW5lIEFSTEFOX0NPTV9TVEFOREJZICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQVJMQU5fQ09NX0FDVElWQVRFICAgICAgICAgICAgMHgwOQorI2RlZmluZSBBUkxBTl9DT01fR09UT19TTE9XX1BPTEwgICAgICAweDBhCisjZGVmaW5lIEFSTEFOX0NPTV9JTlQgICAgICAgICAgICAgICAgIDB4ODAKKworCisjZGVmaW5lIFRYTEFTVChkZXYpICgoKHN0cnVjdCBhcmxhbl9wcml2YXRlICopbmV0ZGV2X3ByaXYoZGV2KSktPnR4UmluZ1soKHN0cnVjdCBhcmxhbl9wcml2YXRlICopbmV0ZGV2X3ByaXYoZGV2KSktPnR4TGFzdF0pCisjZGVmaW5lIFRYSEVBRChkZXYpICgoKHN0cnVjdCBhcmxhbl9wcml2YXRlICopbmV0ZGV2X3ByaXYoZGV2KSktPnR4UmluZ1swXSkKKyNkZWZpbmUgVFhUQUlMKGRldikgKCgoc3RydWN0IGFybGFuX3ByaXZhdGUgKiluZXRkZXZfcHJpdihkZXYpKS0+dHhSaW5nWzFdKQorCisjZGVmaW5lIFRYQnVmZlN0YXJ0KGRldikgb2Zmc2V0b2Yoc3RydWN0IGFybGFuX3NobWVtLCB0eEJ1ZmZlcikKKyNkZWZpbmUgVFhCdWZmRW5kKGRldikgb2Zmc2V0b2Yoc3RydWN0IGFybGFuX3NobWVtLCB4eEJ1ZmZlcikKKyAKKyNkZWZpbmUgUkVBRFNITSh0byxmcm9tLGF0eXBlKSB7XAorCWF0eXBlIHRtcDtcCisJbWVtY3B5X2Zyb21pbygmKHRtcCksJihmcm9tKSxzaXplb2YoYXR5cGUpKTtcCisJdG8gPSB0bXA7XAorCX0KKworI2RlZmluZSBSRUFEU0hNRU0oZnJvbSxhdHlwZSlcCisJYXR5cGUgZnJvbTsgXAorCVJFQURTSE0oZnJvbSwgYXJsYW4tPmZyb20sIGF0eXBlKTsKKworI2RlZmluZSBXUklURVNITSh0byxmcm9tLGF0eXBlKSBcCisJeyBhdHlwZSB0bXBTSE0gPSBmcm9tO1wKKwltZW1jcHlfdG9pbygmKHRvKSwmdG1wU0hNLHNpemVvZihhdHlwZSkpO1wKKwl9CisKKyNkZWZpbmUgREVCVUdTSE0obGV2ZWxTSE0sc3RyaW5nU0hNLHN0dWZmLGF0eXBlKSBcCisJewlhdHlwZSB0bXBTSE07IFwKKwkJbWVtY3B5X2Zyb21pbygmdG1wU0hNLCYoc3R1ZmYpLHNpemVvZihhdHlwZSkpO1wKKwkJSUZERUJVRyhsZXZlbFNITSkgcHJpbnRrKHN0cmluZ1NITSx0bXBTSE0pO1wKKwl9CisKKyNkZWZpbmUgV1JJVEVTSE1CKHRvLCB2YWwpIFwKKwl3cml0ZWIodmFsLCYodG8pKQorI2RlZmluZSBSRUFEU0hNQih0bykgXAorCXJlYWRiKCYodG8pKQorI2RlZmluZSBXUklURVNITVModG8sIHZhbCkgXAorCXdyaXRldyh2YWwsJih0bykpCisjZGVmaW5lIFJFQURTSE1TKHRvKSBcCisJcmVhZHcoJih0bykpCisjZGVmaW5lIFdSSVRFU0hNSSh0bywgdmFsKSBcCisJd3JpdGVsKHZhbCwmKHRvKSkKKyNkZWZpbmUgUkVBRFNITUkodG8pIFwKKwlyZWFkbCgmKHRvKSkKKworCisKKworCisjZGVmaW5lIHJlZ2lzdHJhdGlvbkJhZChkZXYpXAorICAgKCAoICAgUkVBRFNITUIoKChzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqKW5ldGRldl9wcml2KGRldikpLT5jYXJkLT5yZWdpc3RyYXRpb25Nb2RlKSAgICA+IDApICYmIFwKKyAgICAgKCAgIFJFQURTSE1CKCgoc3RydWN0IGFybGFuX3ByaXZhdGUgKiluZXRkZXZfcHJpdihkZXYpKS0+Y2FyZC0+cmVnaXN0cmF0aW9uU3RhdHVzKSA9PSAwKSAgICApCisKKworI2RlZmluZSByZWFkQ29udHJvbFJlZ2lzdGVyKGRldilcCisgCVJFQURTSE1CKCgoc3RydWN0IGFybGFuX3ByaXZhdGUgKiluZXRkZXZfcHJpdihkZXYpKS0+Y2FyZC0+Y250cmxSZWdJbWFnZSkKKworI2RlZmluZSB3cml0ZUNvbnRyb2xSZWdpc3RlcihkZXYsIHYpe1wKKyAgIFdSSVRFU0hNQigoKHN0cnVjdCBhcmxhbl9wcml2YXRlICopbmV0ZGV2X3ByaXYoZGV2KSktPmNhcmQtPmNudHJsUmVnSW1hZ2UJLCgodikgJjB4RikgKTtcCisgICBXUklURVNITUIoKChzdHJ1Y3QgYXJsYW5fcHJpdmF0ZSAqKW5ldGRldl9wcml2KGRldikpLT5jYXJkLT5jb250cm9sUmVnaXN0ZXIJLCh2KSAJKTt9CisKKworI2RlZmluZSBhcmxhbl9pbnRlcnJ1cHRfbGFuY3B1KGRldikge1wKKyAgIGludCBjcjsgICBcCisgICBcCisgICBjciA9IHJlYWRDb250cm9sUmVnaXN0ZXIoZGV2KTtcCisgICBpZiAoY3IgJiBBUkxBTl9DSEFOTkVMX0FUVEVOVElPTil7IFwKKyAgICAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldiwgKGNyICYgfkFSTEFOX0NIQU5ORUxfQVRURU5USU9OKSk7XAorICAgfWVsc2UgIFwKKyAgICAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldiwgKGNyIHwgQVJMQU5fQ0hBTk5FTF9BVFRFTlRJT04pKTtcCit9CisKKyNkZWZpbmUgY2xlYXJDaGFubmVsQXR0ZW50aW9uKGRldil7IFwKKyAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldixyZWFkQ29udHJvbFJlZ2lzdGVyKGRldikgJiB+QVJMQU5fQ0hBTk5FTF9BVFRFTlRJT04pO30KKyNkZWZpbmUgc2V0SGFyZHdhcmVSZXNldChkZXYpIHtcCisgICB3cml0ZUNvbnRyb2xSZWdpc3RlcihkZXYscmVhZENvbnRyb2xSZWdpc3RlcihkZXYpIHwgQVJMQU5fUkVTRVQpO30KKyNkZWZpbmUgY2xlYXJIYXJkd2FyZVJlc2V0KGRldikge1wKKyAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldixyZWFkQ29udHJvbFJlZ2lzdGVyKGRldikgJiB+QVJMQU5fUkVTRVQpO30KKyNkZWZpbmUgc2V0SW50ZXJydXB0RW5hYmxlKGRldil7XAorICAgd3JpdGVDb250cm9sUmVnaXN0ZXIoZGV2LHJlYWRDb250cm9sUmVnaXN0ZXIoZGV2KSB8IEFSTEFOX0lOVEVSUlVQVF9FTkFCTEUpICA7fQorI2RlZmluZSBjbGVhckludGVycnVwdEVuYWJsZShkZXYpe1wKKyAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldixyZWFkQ29udHJvbFJlZ2lzdGVyKGRldikgJiB+QVJMQU5fSU5URVJSVVBUX0VOQUJMRSkgIDt9CisjZGVmaW5lIHNldENsZWFySW50ZXJydXB0KGRldil7XAorICAgd3JpdGVDb250cm9sUmVnaXN0ZXIoZGV2LHJlYWRDb250cm9sUmVnaXN0ZXIoZGV2KSB8IEFSTEFOX0NMRUFSX0lOVEVSUlVQVCkgICA7fQorI2RlZmluZSBjbGVhckNsZWFySW50ZXJydXB0KGRldil7XAorICAgd3JpdGVDb250cm9sUmVnaXN0ZXIoZGV2LHJlYWRDb250cm9sUmVnaXN0ZXIoZGV2KSAmIH5BUkxBTl9DTEVBUl9JTlRFUlJVUFQpO30KKyNkZWZpbmUgc2V0UG93ZXJPZmYoZGV2KXtcCisgICB3cml0ZUNvbnRyb2xSZWdpc3RlcihkZXYscmVhZENvbnRyb2xSZWdpc3RlcihkZXYpIHwgKEFSTEFOX1BPV0VSICYmIEFSTEFOX0FDQ0VTUykpO1wKKyAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldixyZWFkQ29udHJvbFJlZ2lzdGVyKGRldikgJiB+QVJMQU5fQUNDRVNTKTt9CisjZGVmaW5lIHNldFBvd2VyT24oZGV2KXtcCisgICB3cml0ZUNvbnRyb2xSZWdpc3RlcihkZXYscmVhZENvbnRyb2xSZWdpc3RlcihkZXYpICYgfihBUkxBTl9QT1dFUikpOyAgIH0KKyNkZWZpbmUgYXJsYW5fbG9ja19jYXJkX2FjY2VzcyhkZXYpe1wKKyAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldixyZWFkQ29udHJvbFJlZ2lzdGVyKGRldikgJiB+QVJMQU5fQUNDRVNTKTt9CisjZGVmaW5lIGFybGFuX3VubG9ja19jYXJkX2FjY2VzcyhkZXYpe1wKKyAgIHdyaXRlQ29udHJvbFJlZ2lzdGVyKGRldixyZWFkQ29udHJvbFJlZ2lzdGVyKGRldikgfCBBUkxBTl9BQ0NFU1MgKTsgfSAgCisKKworCisKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9SWAkJMHgwMDAwMDEKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9OT09QCQkweDAwMDAwMgorI2RlZmluZSBBUkxBTl9DT01NQU5EX05PT1BJTlQJCTB4MDAwMDA0CisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfVFgJCTB4MDAwMDA4CisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfQ09ORgkJMHgwMDAwMTAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9SRVNFVAkJMHgwMDAwMjAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9UWF9BQk9SVAkJMHgwMDAwNDAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9SWF9BQk9SVAkJMHgwMDAwODAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9QT1dFUkRPV04JCTB4MDAwMTAwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfUE9XRVJVUAkJMHgwMDAyMDAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9TTE9XX1BPTEwgCTB4MDAwNDAwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfQUNUSVZBVEUgCQkweDAwMDgwMAorI2RlZmluZSBBUkxBTl9DT01NQU5EX0lOVF9BQ0sJCTB4MDAxMDAwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfSU5UX0VOQUJMRQkweDAwMjAwMAorI2RlZmluZSBBUkxBTl9DT01NQU5EX1dBSVRfTk9XCQkweDAwNDAwMAorI2RlZmluZSBBUkxBTl9DT01NQU5EX0xPTkdfV0FJVF9OT1cJMHgwMDgwMDAKKyNkZWZpbmUgQVJMQU5fQ09NTUFORF9TVEFOREJZCQkweDAxMDAwMAorI2RlZmluZSBBUkxBTl9DT01NQU5EX0lOVF9SQUNLCQkweDAyMDAwMAorI2RlZmluZSBBUkxBTl9DT01NQU5EX0lOVF9SRU5BQkxFCTB4MDQwMDAwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfQ09ORl9XQUlUCQkweDA4MDAwMAorI2RlZmluZSBBUkxBTl9DT01NQU5EX1RCVVNZX0NMRUFSCTB4MTAwMDAwCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfQ0xFQU5fQU5EX0NPTkYJKEFSTEFOX0NPTU1BTkRfVFhfQUJPUlRcCisJCQkJCXwgQVJMQU5fQ09NTUFORF9SWF9BQk9SVFwKKwkJCQkJfCBBUkxBTl9DT01NQU5EX0NPTkYpCisjZGVmaW5lIEFSTEFOX0NPTU1BTkRfQ0xFQU5fQU5EX1JFU0VUICAgKEFSTEFOX0NPTU1BTkRfVFhfQUJPUlRcCisJCQkJCXwgQVJMQU5fQ09NTUFORF9SWF9BQk9SVFwKKwkJCQkJfCBBUkxBTl9DT01NQU5EX1JFU0VUKQorCisKKyAKKyNkZWZpbmUgQVJMQU5fREVCVUdfQ0hBSU5fTE9DS1MJCTB4MDAwMDEKKyNkZWZpbmUgQVJMQU5fREVCVUdfUkVTRVQJCTB4MDAwMDIKKyNkZWZpbmUgQVJMQU5fREVCVUdfVElNSU5HCQkweDAwMDA0CisjZGVmaW5lIEFSTEFOX0RFQlVHX0NBUkRfU1RBVEUJCTB4MDAwMDgKKyNkZWZpbmUgQVJMQU5fREVCVUdfVFhfQ0hBSU4JCTB4MDAwMTAKKyNkZWZpbmUgQVJMQU5fREVCVUdfTVVMVElDQVNUCQkweDAwMDIwCisjZGVmaW5lIEFSTEFOX0RFQlVHX0hFQURFUl9EVU1QCQkweDAwMDQwCisjZGVmaW5lIEFSTEFOX0RFQlVHX0lOVEVSUlVQVAkJMHgwMDA4MAorI2RlZmluZSBBUkxBTl9ERUJVR19TVEFSVFVQCQkweDAwMTAwCisjZGVmaW5lIEFSTEFOX0RFQlVHX1NIVVRET1dOCQkweDAwMjAwCisgCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGE3ZDM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYwpAQCAtMCwwICsxLDQyNzIgQEAKKy8qKiogLSotIGxpbnV4LWMgLSotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICBEcml2ZXIgZm9yIEF0bWVsIGF0NzZjNTAyIGF0NzZjNTA0IGFuZCBhdDc2YzUwNiB3aXJlbGVzcyBjYXJkcy4KKworICAgICAgICBDb3B5cmlnaHQgMjAwMC0yMDAxIEFUTUVMIENvcnBvcmF0aW9uLgorICAgICAgICBDb3B5cmlnaHQgMjAwMy0yMDA0IFNpbW9uIEtlbGxleS4KKworICAgIFRoaXMgY29kZSB3YXMgZGV2ZWxvcGVkIGZyb20gdmVyc2lvbiAyLjEuMSBvZiB0aGUgQXRtZWwgZHJpdmVycywgCisgICAgcmVsZWFzZWQgYnkgQXRtZWwgY29ycC4gdW5kZXIgdGhlIEdQTCBpbiBEZWNlbWJlciAyMDAyLiBJdCBhbHNvIAorICAgIGluY2x1ZGVzIGNvZGUgZnJvbSB0aGUgTGludXggYWlyb25ldCBkcml2ZXJzIChDKSBCZW5qYW1pbiBSZWVkLCAKKyAgICBhbmQgdGhlIExpbnV4IFBDTUNJQSBwYWNrYWdlLCAoQykgRGF2aWQgSGluZHMgYW5kIHRoZSBMaW51eCB3aXJlbGVzcworICAgIGV4dGVuc2lvbnMsIChDKSBKZWFuIFRvdXJyaWxoZXMuCisKKyAgICBUaGUgZmlybXdhcmUgbW9kdWxlIGZvciByZWFkaW5nIHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgY2FyZCBjb21lcyBmcm9tCisgICAgbmV0LnJ1c3NvdHRvLkF0bWVsTUFDRlcsIHdyaXR0ZW4gYnkgTWF0dGhldyBULiBSdXNzb3R0byBhbmQgY29weXJpZ2h0CisgICAgYnkgaGltLiBuZXQucnVzc290dG8uQXRtZWxNQUNGVyBpcyB1c2VkIHVuZGVyIHRoZSBHUEwgbGljZW5zZSB2ZXJzaW9uIDIuCisgICAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtb2R1bGUgaW4gYmluYXJ5IGZvcm0gYW5kLCB1bmRlciB0aGUgdGVybXMKKyAgICBvZiB0aGUgR1BMLCBpbiBzb3VyY2UgZm9ybS4gVGhlIHNvdXJjZSBpcyBsb2NhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggQXRtZWwgd2lyZWxlc3MgbGFuIGRyaXZlcnM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgICBGb3IgYWxsIHF1ZXJpZXMgYWJvdXQgdGhpcyBjb2RlLCBwbGVhc2UgY29udGFjdCB0aGUgY3VycmVudCBhdXRob3IsIAorICAgIFNpbW9uIEtlbGxleSA8c2ltb25AdGhla2VsbGV5cy5vcmcudWs+IGFuZCBub3QgQXRtZWwgQ29ycG9yYXRpb24uCisKKyAgICBDcmVkaXQgaXMgZHVlIHRvIEhQIFVLIGFuZCBDYW1icmlkZ2UgT25saW5lIFN5c3RlbXMgTHRkIGZvciBzdXBwbHlpbmcKKyAgICBoYXJkd2FyZSB1c2VkIGR1cmluZyBkZXZlbG9wbWVudCBvZiB0aGlzIGRyaXZlci4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlICJpZWVlODAyXzExLmgiCisjaW5jbHVkZSAiYXRtZWwuaCIKKworI2RlZmluZSBEUklWRVJfTUFKT1IgMAorI2RlZmluZSBEUklWRVJfTUlOT1IgOTYKKworTU9EVUxFX0FVVEhPUigiU2ltb24gS2VsbGV5Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN1cHBvcnQgZm9yIEF0bWVsIGF0NzZjNTB4IDgwMi4xMSB3aXJlbGVzcyBldGhlcm5ldCBjYXJkcy4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJBdG1lbCBhdDc2YzUweCB3aXJlbGVzcyBjYXJkcyIpOworCisvKiBUaGUgbmFtZSBvZiB0aGUgZmlybXdhcmUgZmlsZSB0byBiZSBsb2FkZWQgCisgICBvdmVyLXJpZGVzIGFueSBhdXRvbWF0aWMgc2VsZWN0aW9uICovCitzdGF0aWMgY2hhciAqZmlybXdhcmUgPSBOVUxMOworbW9kdWxlX3BhcmFtKGZpcm13YXJlLCBjaGFycCwgMCk7CisKKy8qIHRhYmxlIG9mIGZpcm13YXJlIGZpbGUgbmFtZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgeyAKKwlBdG1lbEZXVHlwZSBmd190eXBlOworCWNvbnN0IGNoYXIgKmZ3X2ZpbGU7CisJY29uc3QgY2hhciAqZndfZmlsZV9leHQ7Cit9IGZ3X3RhYmxlW10gPSB7CisJeyBBVE1FTF9GV19UWVBFXzUwMiwgICAgICAiYXRtZWxfYXQ3NmM1MDIiLCAgICAgICJiaW4iIH0sCisJeyBBVE1FTF9GV19UWVBFXzUwMkQsICAgICAiYXRtZWxfYXQ3NmM1MDJkIiwgICAgICJiaW4iIH0sCisJeyBBVE1FTF9GV19UWVBFXzUwMkUsICAgICAiYXRtZWxfYXQ3NmM1MDJlIiwgICAgICJiaW4iIH0sCisJeyBBVE1FTF9GV19UWVBFXzUwMl8zQ09NLCAiYXRtZWxfYXQ3NmM1MDJfM2NvbSIsICJiaW4iIH0sCisJeyBBVE1FTF9GV19UWVBFXzUwNCwgICAgICAiYXRtZWxfYXQ3NmM1MDQiLCAgICAgICJiaW4iIH0sCisJeyBBVE1FTF9GV19UWVBFXzUwNF8yOTU4LCAiYXRtZWxfYXQ3NmM1MDRfMjk1OCIsICJiaW4iIH0sCisJeyBBVE1FTF9GV19UWVBFXzUwNEFfMjk1OCwiYXRtZWxfYXQ3NmM1MDRhXzI5NTgiLCJiaW4iIH0sCisJeyBBVE1FTF9GV19UWVBFXzUwNiwgICAgICAiYXRtZWxfYXQ3NmM1MDYiLCAgICAgICJiaW4iIH0sCisJeyBBVE1FTF9GV19UWVBFX05PTkUsICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICBOVUxMIH0KK307CisKKyNkZWZpbmUgTUFYX1NTSURfTEVOR1RIIDMyCisjZGVmaW5lIE1HTVRfSklGRklFUyAoMjU2ICogSFogLyAxMDApCisKKyNkZWZpbmUgTUFYX0JTU19FTlRSSUVTCTY0CQorCisvKiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgR0NSICAweDAwICAgIC8vICAgICAgKFNJUjApICBHZW5lcmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgICAgICAgIAorI2RlZmluZSBCU1IgIDB4MDIgICAgLy8gICAgICAoU0lSMSkgIEJhbmsgU3dpdGNoaW5nIFNlbGVjdCBSZWdpc3RlciAKKyNkZWZpbmUgQVIgICAweDA0CisjZGVmaW5lIERSICAgMHgwOAorI2RlZmluZSBNUjEgIDB4MTIgICAgLy8gICAgICBNaXJyb3IgUmVnaXN0ZXIgMSAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBNUjIgIDB4MTQgICAgLy8gICAgICBNaXJyb3IgUmVnaXN0ZXIgMiAgCisjZGVmaW5lIE1SMyAgMHgxNiAgICAvLyAgICAgIE1pcnJvciBSZWdpc3RlciAzICAKKyNkZWZpbmUgTVI0ICAweDE4ICAgIC8vICAgICAgTWlycm9yIFJlZ2lzdGVyIDQgICAKKworI2RlZmluZSBHUFIxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MGMKKyNkZWZpbmUgR1BSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBlCisjZGVmaW5lIEdQUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMAorLy8KKy8vIENvbnN0YW50cyBmb3IgdGhlIEdDUiByZWdpc3Rlci4KKy8vCisjZGVmaW5lIEdDUl9SRU1BUCAgICAgMHgwNDAwICAgICAgICAgIC8vIFJlbWFwIGludGVybmFsIFNSQU0gdG8gMAorI2RlZmluZSBHQ1JfU1dSRVMgICAgIDB4MDA4MCAgICAgICAgICAvLyBCSVUgcmVzZXQgKEFSTSBhbmQgUEFJIGFyZSBOT1QgcmVzZXQpIAorI2RlZmluZSBHQ1JfQ09SRVMgICAgIDB4MDA2MCAgICAgICAgICAvLyBDb3JlIFJlc2V0IChBUk0gYW5kIFBBSSBhcmUgcmVzZXQpCisjZGVmaW5lIEdDUl9FTklOVCAgICAgMHgwMDAyICAgICAgICAgIC8vIEVuYWJsZSBJbnRlcnJ1cHRzICAgIAorI2RlZmluZSBHQ1JfQUNLSU5UICAgIDB4MDAwOCAgICAgICAgICAvLyBBY2tub3dsZWRnZSBJbnRlcnJ1cHRzCisKKyNkZWZpbmUgQlNTX1NSQU0gICAgICAweDAyMDAgICAgICAgICAgLy8gQU1CQSBtb2R1bGUgc2VsZWN0aW9uIC0tPiBTUkFNCisjZGVmaW5lIEJTU19JUkFNICAgICAgMHgwMTAwICAgICAgICAgIC8vIEFNQkEgbW9kdWxlIHNlbGVjdGlvbiAtLT4gSVJBTQorLy8KKy8vIENvbnN0YW50cyBmb3IgdGhlIE1SIHJlZ2lzdGVycy4KKy8vCisjZGVmaW5lIE1BQ19JTklUX0NPTVBMRVRFICAgICAgIDB4MDAwMSAgICAgICAgLy8gTUFDIGluaXQgaGFzIGJlZW4gY29tcGxldGVkCisjZGVmaW5lIE1BQ19CT09UX0NPTVBMRVRFICAgICAgIDB4MDAxMCAgICAgICAgLy8gTUFDIGJvb3QgaGFzIGJlZW4gY29tcGxldGVkCisjZGVmaW5lIE1BQ19JTklUX09LICAgICAgICAgICAgIDB4MDAwMiAgICAgICAgLy8gTUFDIGJvb3QgaGFzIGJlZW4gY29tcGxldGVkCisKKyNkZWZpbmUgQzgwMjExX1NVQlRZUEVfTUdNVF9BU1NfUkVRVUVTVCAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBDODAyMTFfU1VCVFlQRV9NR01UX0FTU19SRVNQT05TRSAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIEM4MDIxMV9TVUJUWVBFX01HTVRfUkVBU1NfUkVRVUVTVCAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgQzgwMjExX1NVQlRZUEVfTUdNVF9SRUFTU19SRVNQT05TRSAgICAgICAgICAgICAgMHgzMAorI2RlZmluZSBDODAyMTFfU1VCVFlQRV9NR01UX1Byb2JlUmVxdWVzdCAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIEM4MDIxMV9TVUJUWVBFX01HTVRfUHJvYmVSZXNwb25zZSAgICAgICAgICAgICAgIDB4NTAKKyNkZWZpbmUgQzgwMjExX1NVQlRZUEVfTUdNVF9CRUFDT04gICAgICAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBDODAyMTFfU1VCVFlQRV9NR01UX0FUSU0gICAgICAgICAgICAgICAgICAgICAgICAweDkwCisjZGVmaW5lIEM4MDIxMV9TVUJUWVBFX01HTVRfRElTQVNTT1NJQVRJT04gICAgICAgICAgICAgIDB4QTAKKyNkZWZpbmUgQzgwMjExX1NVQlRZUEVfTUdNVF9BdXRoZW50aWNhdGlvbiAgICAgICAgICAgICAgMHhCMAorI2RlZmluZSBDODAyMTFfU1VCVFlQRV9NR01UX0RlYXV0aGVudGljYXRpb24gICAgMHhDMAorCisjZGVmaW5lIEM4MDIxMV9NR01UX0FBTl9PUEVOU1lTVEVNICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgQzgwMjExX01HTVRfQUFOX1NIQVJFREtFWSAgICAgICAgICAgICAgIDB4MDAwMQorCisjZGVmaW5lIEM4MDIxMV9NR01UX0NBUEFCSUxJVFlfRVNTICAgICAgICAgICAgICAweDAwMDEgIC8vIHNlZSA4MDIuMTEgcC41OAorI2RlZmluZSBDODAyMTFfTUdNVF9DQVBBQklMSVRZX0lCU1MgICAgICAgICAgICAgMHgwMDAyICAvLyAgICAgIC0gIiAtCisjZGVmaW5lIEM4MDIxMV9NR01UX0NBUEFCSUxJVFlfQ0ZQb2xsYWJsZSAgICAgICAweDAwMDQgIC8vICAgICAgLSAiIC0KKyNkZWZpbmUgQzgwMjExX01HTVRfQ0FQQUJJTElUWV9DRlBvbGxSZXF1ZXN0ICAgIDB4MDAwOCAgLy8gICAgICAtICIgLQorI2RlZmluZSBDODAyMTFfTUdNVF9DQVBBQklMSVRZX1ByaXZhY3kgICAgICAgICAgMHgwMDEwICAvLyAgICAgIC0gIiAtCisKKyNkZWZpbmUgQzgwMjExX01HTVRfU0NfU3VjY2VzcyAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQzgwMjExX01HTVRfU0NfVW5zcGVjaWZpZWQgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQzgwMjExX01HTVRfU0NfU3VwcG9ydENhcGFiaWxpdGllcyAgICAgIDEwCisjZGVmaW5lIEM4MDIxMV9NR01UX1NDX1JlYXNzRGVuaWVkICAgICAgICAgICAgICAxMQorI2RlZmluZSBDODAyMTFfTUdNVF9TQ19Bc3NEZW5pZWQgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgQzgwMjExX01HTVRfU0NfQXV0aEFsZ05vdFN1cHBvcnRlZCAgICAgIDEzCisjZGVmaW5lIEM4MDIxMV9NR01UX1NDX0F1dGhUcmFuc1NlcU51bUVycm9yICAgICAxNAorI2RlZmluZSBDODAyMTFfTUdNVF9TQ19BdXRoUmVqZWN0Q2hhbGxlbmdlICAgICAgMTUKKyNkZWZpbmUgQzgwMjExX01HTVRfU0NfQXV0aFJlamVjdFRpbWVvdXQgICAgICAgIDE2CisjZGVmaW5lIEM4MDIxMV9NR01UX1NDX0Fzc0RlbmllZEhhbmRsZUFQICAgICAgICAxNworI2RlZmluZSBDODAyMTFfTUdNVF9TQ19Bc3NEZW5pZWRCU1NSYXRlICAgICAgICAgMTgKKworI2RlZmluZSBDODAyMTFfTUdNVF9FbGVtZW50SURfU1NJRCAgICAgICAgICAgICAgMAorI2RlZmluZSBDODAyMTFfTUdNVF9FbGVtZW50SURfU3VwcG9ydGVkUmF0ZXMgICAgMQorI2RlZmluZSBDODAyMTFfTUdNVF9FbGVtZW50SURfQ2hhbGxlbmdlVGV4dCAgICAgMTYKKyNkZWZpbmUgQzgwMjExX01HTVRfQ0FQQUJJTElUWV9TaG9ydFByZWFtYmxlICAgIDB4MDAyMAorCisjZGVmaW5lIE1JQl9NQVhfREFUQV9CWVRFUyAgICAyMTIKKyNkZWZpbmUgTUlCX0hFQURFUl9TSVpFICAgICAgIDQgICAgLyogZmlyc3QgZm91ciBmaWVsZHMgKi8KKworc3RydWN0IGdldF9zZXRfbWliIHsKKyAgICAgICAgdTggdHlwZTsKKyAgICAgICAgdTggc2l6ZTsKKyAgICAgICAgdTggaW5kZXg7CisgICAgICAgIHU4IHJlc2VydmVkOworICAgICAgICB1OCBkYXRhW01JQl9NQVhfREFUQV9CWVRFU107Cit9OworCitzdHJ1Y3QgcnhfZGVzYyB7CisgICAgICAgIHUzMiAgICAgICAgICBOZXh0OworICAgICAgICB1MTYgICAgICAgICAgTXNkdVBvczsKKyAgICAgICAgdTE2ICAgICAgICAgIE1zZHVTaXplOworCQorICAgICAgICB1OCAgICAgICAgICAgU3RhdGU7CisgICAgICAgIHU4ICAgICAgICAgICBTdGF0dXM7CisgICAgICAgIHU4ICAgICAgICAgICBSYXRlOworICAgICAgICB1OCAgICAgICAgICAgUnNzaTsKKyAgICAgICAgdTggICAgICAgICAgIExpbmtRdWFsaXR5OworICAgICAgICB1OCAgICAgICAgICAgUHJlYW1ibGVUeXBlOworICAgICAgICB1MTYgICAgICAgICAgRHVyYXRpb247CisgICAgICAgIHUzMiAgICAgICAgICBSeFRpbWU7CisKK307CisKKyNkZWZpbmUgUlhfREVTQ19GTEFHX1ZBTElEICAgICAgIDB4ODAKKyNkZWZpbmUgUlhfREVTQ19GTEFHX0NPTlNVTUVEICAgIDB4NDAKKyNkZWZpbmUgUlhfREVTQ19GTEFHX0lETEUgICAgICAgIDB4MDAKKworI2RlZmluZSBSWF9TVEFUVVNfU1VDQ0VTUyAgICAgICAgMHgwMAorCisjZGVmaW5lIFJYX0RFU0NfTVNEVV9QT1NfT0ZGU0VUICAgICAgNAorI2RlZmluZSBSWF9ERVNDX01TRFVfU0laRV9PRkZTRVQgICAgIDYKKyNkZWZpbmUgUlhfREVTQ19GTEFHU19PRkZTRVQgICAgICAgICA4CisjZGVmaW5lIFJYX0RFU0NfU1RBVFVTX09GRlNFVCAgICAgICAgOQorI2RlZmluZSBSWF9ERVNDX1JTU0lfT0ZGU0VUICAgICAgICAgIDExCisjZGVmaW5lIFJYX0RFU0NfTElOS19RVUFMSVRZX09GRlNFVCAgMTIKKyNkZWZpbmUgUlhfREVTQ19QUkVBTUJMRV9UWVBFX09GRlNFVCAxMworI2RlZmluZSBSWF9ERVNDX0RVUkFUSU9OX09GRlNFVCAgICAgIDE0CisjZGVmaW5lIFJYX0RFU0NfUlhfVElNRV9PRkZTRVQgICAgICAgMTYKKworCitzdHJ1Y3QgdHhfZGVzYyB7CisJdTMyICAgICAgIE5leHREZXNjcmlwdG9yOworCXUxNiAgICAgICBUeFN0YXJ0T2ZGcmFtZTsKKwl1MTYgICAgICAgVHhMZW5ndGg7CisJCisJdTggICAgICAgIFR4U3RhdGU7CisJdTggICAgICAgIFR4U3RhdHVzOworCXU4ICAgICAgICBSZXRyeUNvdW50OworCQorCXU4ICAgICAgICBUeFJhdGU7CisKKwl1OCAgICAgICAgS2V5SW5kZXg7CisJdTggICAgICAgIENoaXBlclR5cGU7CisJdTggICAgICAgIENoaXByZUxlbmd0aDsKKyAgICAgICAgdTggICAgICAgIFJlc2VydmVkMTsKKworCXU4ICAgICAgICBSZXNlcnZlZDsKKwl1OCAgICAgICAgUGFja2V0VHlwZTsKKwl1MTYgICAgICAgSG9zdFR4TGVuZ3RoOworCQorfTsKKworCisjZGVmaW5lIFRYX0RFU0NfTkVYVF9PRkZTRVQgICAgICAgICAgMAorI2RlZmluZSBUWF9ERVNDX1BPU19PRkZTRVQgICAgICAgICAgIDQKKyNkZWZpbmUgVFhfREVTQ19TSVpFX09GRlNFVCAgICAgICAgICA2CisjZGVmaW5lIFRYX0RFU0NfRkxBR1NfT0ZGU0VUICAgICAgICAgOAorI2RlZmluZSBUWF9ERVNDX1NUQVRVU19PRkZTRVQgICAgICAgIDkKKyNkZWZpbmUgVFhfREVTQ19SRVRSWV9PRkZTRVQgICAgICAgICAxMAorI2RlZmluZSBUWF9ERVNDX1JBVEVfT0ZGU0VUICAgICAgICAgIDExCisjZGVmaW5lIFRYX0RFU0NfS0VZX0lOREVYX09GRlNFVCAgICAgMTIKKyNkZWZpbmUgVFhfREVTQ19DSVBIRVJfVFlQRV9PRkZTRVQgICAxMworI2RlZmluZSBUWF9ERVNDX0NJUEhFUl9MRU5HVEhfT0ZGU0VUIDE0CisjZGVmaW5lIFRYX0RFU0NfUEFDS0VUX1RZUEVfT0ZGU0VUICAgMTcKKyNkZWZpbmUgVFhfREVTQ19IT1NUX0xFTkdUSF9PRkZTRVQgICAxOAorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSG9zdC1NQUMgaW50ZXJmYWNlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgVFhfU1RBVFVTX1NVQ0NFU1MgICAgICAgMHgwMAorCisjZGVmaW5lIFRYX0ZJUk1fT1dOICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgVFhfRE9ORSAgICAgICAgICAgICAgICAgMHg0MAorCisKKyNkZWZpbmUgVFhfRVJST1IgICAgICAgICAgICAgICAgMHgwMQorCisjZGVmaW5lIFRYX1BBQ0tFVF9UWVBFX0RBVEEgICAgIDB4MDEKKyNkZWZpbmUgVFhfUEFDS0VUX1RZUEVfTUdNVCAgICAgMHgwMgorCisjZGVmaW5lIElTUl9FTVBUWSAgICAgICAgICAgICAgIDB4MDAgICAgICAgIC8vIG5vIGJpdHMgc2V0IGluIElTUgorI2RlZmluZSBJU1JfVHhDT01QTEVURSAgICAgICAgICAweDAxICAgICAgICAvLyBwYWNrZXQgdHJhbnNtaXR0ZWQKKyNkZWZpbmUgSVNSX1J4Q09NUExFVEUgICAgICAgICAgMHgwMiAgICAgICAgLy8gcGFja2V0IHJlY2VpdmVkCisjZGVmaW5lIElTUl9SeEZSQU1FTE9TVCAgICAgICAgIDB4MDQgICAgICAgIC8vIFJ4IEZyYW1lIGxvc3QKKyNkZWZpbmUgSVNSX0ZBVEFMX0VSUk9SICAgICAgICAgMHgwOCAgICAgICAgLy8gRmF0YWwgZXJyb3IKKyNkZWZpbmUgSVNSX0NPTU1BTkRfQ09NUExFVEUgICAgMHgxMCAgICAgICAgLy8gY29tbWFuZCBjb21wbGV0ZWQKKyNkZWZpbmUgSVNSX09VVF9PRl9SQU5HRSAgICAgICAgMHgyMCAgICAgICAgLy8gY29tbWFuZCBjb21wbGV0ZWQKKyNkZWZpbmUgSVNSX0lCU1NfTUVSR0UgICAgICAgICAgMHg0MCAgICAgICAgLy8gKDQuMS4yLjMwKTogSUJTUyBtZXJnZQorI2RlZmluZSBJU1JfR0VORVJJQ19JUlEgICAgICAgICAweDgwICAgICAgICAgICAgICAgIAorCisKKyNkZWZpbmUgTG9jYWxfTWliX1R5cGUgICAgICAgICAgMHgwMQorI2RlZmluZSBNYWNfQWRkcmVzc19NaWJfVHlwZSAgICAweDAyCisjZGVmaW5lIE1hY19NaWJfVHlwZSAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgU3RhdGlzdGljc19NaWJfVHlwZSAgICAgMHgwNAorI2RlZmluZSBNYWNfTWdtdF9NaWJfVHlwZSAgICAgICAweDA1CisjZGVmaW5lIE1hY19XZXBfTWliX1R5cGUgICAgICAgIDB4MDYKKyNkZWZpbmUgUGh5X01pYl9UeXBlICAgICAgICAgICAgMHgwNworI2RlZmluZSBNdWx0aV9Eb21haW5fTUlCICAgICAgICAweDA4CisKKyNkZWZpbmUgTUFDX01HTVRfTUlCX0NVUl9CU1NJRF9QT1MgICAgICAgICAgICAxNAorI2RlZmluZSBNQUNfTUlCX0ZSQUdfVEhSRVNIT0xEX1BPUyAgICAgICAgICAgIDgKKyNkZWZpbmUgTUFDX01JQl9SVFNfVEhSRVNIT0xEX1BPUyAgICAgICAgICAgICAxMAorI2RlZmluZSBNQUNfTUlCX1NIT1JUX1JFVFJZX1BPUyAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIE1BQ19NSUJfTE9OR19SRVRSWV9QT1MgICAgICAgICAgICAgICAgMTcKKyNkZWZpbmUgTUFDX01JQl9TSE9SVF9SRVRSWV9MSU1JVF9QT1MgICAgICAgICAxNgorI2RlZmluZSBNQUNfTUdNVF9NSUJfQkVBQ09OX1BFUl9QT1MgICAgICAgICAgIDAKKyNkZWZpbmUgTUFDX01HTVRfTUlCX1NUQVRJT05fSURfUE9TICAgICAgICAgICA2CisjZGVmaW5lIE1BQ19NR01UX01JQl9DVVJfUFJJVkFDWV9QT1MgICAgICAgICAgMTEKKyNkZWZpbmUgTUFDX01HTVRfTUlCX0NVUl9CU1NJRF9QT1MgICAgICAgICAgICAxNAorI2RlZmluZSBNQUNfTUdNVF9NSUJfUFNfTU9ERV9QT1MgICAgICAgICAgICAgIDUzCisjZGVmaW5lIE1BQ19NR01UX01JQl9MSVNURU5fSU5URVJWQUxfUE9TICAgICAgNTQKKyNkZWZpbmUgTUFDX01HTVRfTUlCX01VTFRJX0RPTUFJTl9JTVBMRU1FTlRFRCA1NgorI2RlZmluZSBNQUNfTUdNVF9NSUJfTVVMVElfRE9NQUlOX0VOQUJMRUQgICAgIDU3CisjZGVmaW5lIFBIWV9NSUJfQ0hBTk5FTF9QT1MgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgUEhZX01JQl9SQVRFX1NFVF9QT1MgICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBQSFlfTUlCX1JFR19ET01BSU5fUE9TICAgICAgICAgICAgICAgIDI2CisjZGVmaW5lIExPQ0FMX01JQl9BVVRPX1RYX1JBVEVfUE9TICAgICAgICAgICAgMworI2RlZmluZSBMT0NBTF9NSUJfU1NJRF9TSVpFICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTE9DQUxfTUlCX1RYX1BST01JU0NVT1VTX1BPUyAgICAgICAgICA2CisjZGVmaW5lIExPQ0FMX01JQl9UWF9NR01UX1JBVEVfUE9TICAgICAgICAgICAgNworI2RlZmluZSBMT0NBTF9NSUJfVFhfQ09OVFJPTF9SQVRFX1BPUyAgICAgICAgIDgKKyNkZWZpbmUgTE9DQUxfTUlCX1BSRUFNQkxFX1RZUEUgICAgICAgICAgICAgICA5CisjZGVmaW5lIE1BQ19BRERSX01JQl9NQUNfQUREUl9QT1MgICAgICAgICAgICAgMAorCisKKyNkZWZpbmUgICAgICAgICBDTURfU2V0X01JQl9WYXJzICAgICAgICAgICAgICAweDAxCisjZGVmaW5lICAgICAgICAgQ01EX0dldF9NSUJfVmFycyAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSAgICAgICAgIENNRF9TY2FuICAgICAgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgICAgICAgICBDTURfSm9pbiAgICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lICAgICAgICAgQ01EX1N0YXJ0ICAgICAgICAgICAgICAgICAgICAgMHgwNQorI2RlZmluZSAgICAgICAgIENNRF9FbmFibGVSYWRpbyAgICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgICAgICAgICBDTURfRGlzYWJsZVJhZGlvICAgICAgICAgICAgICAweDA3CisjZGVmaW5lICAgICAgICAgQ01EX1NpdGVTdXJ2ZXkgICAgICAgICAgICAgICAgMHgwQgorCisjZGVmaW5lICAgICAgICAgQ01EX1NUQVRVU19JRExFICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgICAgICAgICBDTURfU1RBVFVTX0NPTVBMRVRFICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSAgICAgICAgIENNRF9TVEFUVVNfVU5LTk9XTiAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lICAgICAgICAgQ01EX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUiAgICAgIDB4MDMKKyNkZWZpbmUgICAgICAgICBDTURfU1RBVFVTX0ZVTkNUSU9OX05PVF9TVVBQT1JURUQgMHgwNAorI2RlZmluZSAgICAgICAgIENNRF9TVEFUVVNfVElNRV9PVVQgICAgICAgICAgICAgICAweDA3CisjZGVmaW5lICAgICAgICAgQ01EX1NUQVRVU19JTl9QUk9HUkVTUyAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgICAgICAgICBDTURfU1RBVFVTX1JFSkVDVEVEX1JBRElPX09GRiAgICAgMHgwOQorI2RlZmluZSAgICAgICAgIENNRF9TVEFUVVNfSE9TVF9FUlJPUiAgICAgICAgICAgICAweEZGCisjZGVmaW5lICAgICAgICAgQ01EX1NUQVRVU19CVVNZICAgICAgICAgICAgICAgICAgIDB4RkUKKworCisjZGVmaW5lIENNRF9CTE9DS19DT01NQU5EX09GRlNFVCAgICAgICAgMAorI2RlZmluZSBDTURfQkxPQ0tfU1RBVFVTX09GRlNFVCAgICAgICAgIDEKKyNkZWZpbmUgQ01EX0JMT0NLX1BBUkFNRVRFUlNfT0ZGU0VUICAgICA0CisKKyNkZWZpbmUgU0NBTl9PUFRJT05TX1NJVEVfU1VSVkVZICAgICAgICAweDgwCisKKyNkZWZpbmUgTUdNVF9GUkFNRV9CT0RZX09GRlNFVAkJMjQKKyNkZWZpbmUgTUFYX0FVVEhFTlRJQ0FUSU9OX1JFVFJJRVMJMworI2RlZmluZSBNQVhfQVNTT0NJQVRJT05fUkVUUklFUyAJMworCisjZGVmaW5lIEFVVEhFTlRJQ0FUSU9OX1JFU1BPTlNFX1RJTUVfT1VUICAxMDAwCisKKyNkZWZpbmUgTUFYX1dJUkVMRVNTX0JPRFkgIDIzMTYgLyogbXR1IGlzIDIzMTIsIENSQyBpcyA0ICovCisjZGVmaW5lIExPT1BfUkVUUllfTElNSVQgICA1MDAwMDAKKworI2RlZmluZSBBQ1RJVkVfTU9ERSAJMQorI2RlZmluZSBQU19NT0RFIAkyCisKKyNkZWZpbmUgTUFYX0VOQ1JZUFRJT05fS0VZUyA0CisjZGVmaW5lIE1BWF9FTkNSWVBUSU9OX0tFWV9TSVpFIDQwCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gODAyLjExIHJlbGF0ZWQgZGVmaW5pdGlvbnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLworLy8gUmVndWxhdG9yeSBEb21haW5zCisvLworCisjZGVmaW5lIFJFR19ET01BSU5fRkNDCQkweDEwCS8vQ2hhbm5lbHMJMS0xMQlVU0EKKyNkZWZpbmUgUkVHX0RPTUFJTl9ET0MJCTB4MjAJLy9DaGFubmVsCTEtMTEJQ2FuYWRhCisjZGVmaW5lIFJFR19ET01BSU5fRVRTSQkJMHgzMAkvL0NoYW5uZWwJMS0xMwlFdXJvcGUgKGV4IFNwYWluL0ZyYW5jZSkKKyNkZWZpbmUgUkVHX0RPTUFJTl9TUEFJTgkweDMxCS8vQ2hhbm5lbAkxMC0xMQlTcGFpbgorI2RlZmluZSBSRUdfRE9NQUlOX0ZSQU5DRQkweDMyCS8vQ2hhbm5lbAkxMC0xMwlGcmFuY2UKKyNkZWZpbmUgUkVHX0RPTUFJTl9NS0sJCTB4NDAJLy9DaGFubmVsCTE0CUphcGFuCisjZGVmaW5lIFJFR19ET01BSU5fTUtLMQkJMHg0MQkvL0NoYW5uZWwJMS0xNAlKYXBhbihNS0sxKQorI2RlZmluZSBSRUdfRE9NQUlOX0lTUkFFTAkweDUwCS8vQ2hhbm5lbAkzLTkJSVNSQUVMCisKKyNkZWZpbmUgQlNTX1RZUEVfQURfSE9DIAkxCisjZGVmaW5lIEJTU19UWVBFX0lORlJBU1RSVUNUVVJFIDIKKworI2RlZmluZSBTQ0FOX1RZUEVfQUNUSVZFCTAKKyNkZWZpbmUgU0NBTl9UWVBFX1BBU1NJVkUJMQorCisjZGVmaW5lIExPTkdfUFJFQU1CTEUJCTAKKyNkZWZpbmUgU0hPUlRfUFJFQU1CTEUJCTEKKyNkZWZpbmUgQVVUT19QUkVBTUJMRQkJMgorCisjZGVmaW5lIERBVEFfRlJBTUVfV1NfSEVBREVSX1NJWkUgICAzMAorCisvKiBwcm9taXNjdW91cyBtb2RlIGNvbnRyb2wgKi8gCisjZGVmaW5lIFBST01fTU9ERV9PRkYJCQkweDAKKyNkZWZpbmUgUFJPTV9NT0RFX1VOS05PV04JCTB4MQorI2RlZmluZSBQUk9NX01PREVfQ1JDX0ZBSUxFRAkJMHgyCisjZGVmaW5lIFBST01fTU9ERV9EVVBMSUNBVEVECQkweDQKKyNkZWZpbmUgUFJPTV9NT0RFX01HTVQJCQkweDgKKyNkZWZpbmUgUFJPTV9NT0RFX0NUUkwJCQkweDEwCisjZGVmaW5lIFBST01fTU9ERV9CQURfUFJPVE9DT0wJCTB4MjAKKworCisjZGVmaW5lIElGQUNFX0lOVF9TVEFUVVNfT0ZGU0VUIAkwCisjZGVmaW5lIElGQUNFX0lOVF9NQVNLX09GRlNFVAkJMQorI2RlZmluZSBJRkFDRV9MT0NLT1VUX0hPU1RfT0ZGU0VUCTIKKyNkZWZpbmUgSUZBQ0VfTE9DS09VVF9NQUNfT0ZGU0VUCTMKKyNkZWZpbmUgSUZBQ0VfRlVOQ19DVFJMX09GRlNFVAkJMjgKKyNkZWZpbmUgSUZBQ0VfTUFDX1NUQVRfT0ZGU0VUCQkzMAorI2RlZmluZSBJRkFDRV9HRU5FUklDX0lOVF9UWVBFX09GRlNFVAkzMgorCisjZGVmaW5lIENJUEhFUl9TVUlURV9OT05FICAgICAwIAorI2RlZmluZSBDSVBIRVJfU1VJVEVfV0VQXzY0ICAgMQorI2RlZmluZSBDSVBIRVJfU1VJVEVfVEtJUCAgICAgMgorI2RlZmluZSBDSVBIRVJfU1VJVEVfQUVTICAgICAgMworI2RlZmluZSBDSVBIRVJfU1VJVEVfQ0NYICAgICAgNAorI2RlZmluZSBDSVBIRVJfU1VJVEVfV0VQXzEyOCAgNQorCisvLworLy8gSUZBQ0UgTUFDUk9TICYgZGVmaW5pdGlvbnMKKy8vCisvLworCisvLyBGdW5jQ3RybCBmaWVsZDogCisvLworI2RlZmluZSBGVU5DX0NUUkxfVHhFTkFCTEUJCTB4MTAKKyNkZWZpbmUgRlVOQ19DVFJMX1J4RU5BQkxFCQkweDIwCisjZGVmaW5lIEZVTkNfQ1RSTF9JTklUX0NPTVBMRVRFIAkweDAxCisKKy8qIEEgc3R1YiBmaXJtd2FyZSBpbWFnZSB3aGljaCByZWFkcyB0aGUgTUFDIGFkZHJlc3MgZnJvbSBOVlJBTSBvbiB0aGUgY2FyZC4KKyAgIEZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24gYW5kIHNvdXJjZSBzZWUgdGhlIGVuZCBvZiB0aGlzIGZpbGUuICovCitzdGF0aWMgdTggbWFjX3JlYWRlcltdID0geworCTB4MDYsMHgwMCwweDAwLDB4ZWEsMHgwNCwweDAwLDB4MDAsMHhlYSwweDAzLDB4MDAsMHgwMCwweGVhLDB4MDIsMHgwMCwweDAwLDB4ZWEsCisJMHgwMSwweDAwLDB4MDAsMHhlYSwweDAwLDB4MDAsMHgwMCwweGVhLDB4ZmYsMHhmZiwweGZmLDB4ZWEsMHhmZSwweGZmLDB4ZmYsMHhlYSwKKwkweGQzLDB4MDAsMHhhMCwweGUzLDB4MDAsMHhmMCwweDIxLDB4ZTEsMHgwZSwweDA0LDB4YTAsMHhlMywweDAwLDB4MTAsMHhhMCwweGUzLAorCTB4ODEsMHgxMSwweGEwLDB4ZTEsMHgwMCwweDEwLDB4ODEsMHhlMywweDAwLDB4MTAsMHg4MCwweGU1LDB4MWMsMHgxMCwweDkwLDB4ZTUsCisJMHgxMCwweDEwLDB4YzEsMHhlMywweDFjLDB4MTAsMHg4MCwweGU1LDB4MDEsMHgxMCwweGEwLDB4ZTMsMHgwOCwweDEwLDB4ODAsMHhlNSwKKwkweDAyLDB4MDMsMHhhMCwweGUzLDB4MDAsMHgxMCwweGEwLDB4ZTMsMHhiMCwweDEwLDB4YzAsMHhlMSwweGI0LDB4MTAsMHhjMCwweGUxLAorCTB4YjgsMHgxMCwweGMwLDB4ZTEsMHhiYywweDEwLDB4YzAsMHhlMSwweDU2LDB4ZGMsMHhhMCwweGUzLDB4MjEsMHgwMCwweDAwLDB4ZWIsCisJMHgwYSwweDAwLDB4YTAsMHhlMywweDFhLDB4MDAsMHgwMCwweGViLDB4MTAsMHgwMCwweDAwLDB4ZWIsMHgwNywweDAwLDB4MDAsMHhlYiwKKwkweDAyLDB4MDMsMHhhMCwweGUzLDB4MDIsMHgxNCwweGEwLDB4ZTMsMHhiNCwweDEwLDB4YzAsMHhlMSwweDRjLDB4MTAsMHg5ZiwweGU1LAorCTB4YmMsMHgxMCwweGMwLDB4ZTEsMHgxMCwweDEwLDB4YTAsMHhlMywweGI4LDB4MTAsMHhjMCwweGUxLDB4ZmUsMHhmZiwweGZmLDB4ZWEsCisJMHgwMCwweDQwLDB4MmQsMHhlOSwweDAwLDB4MjAsMHhhMCwweGUzLDB4MDIsMHgzYywweGEwLDB4ZTMsMHgwMCwweDEwLDB4YTAsMHhlMywKKwkweDI4LDB4MDAsMHg5ZiwweGU1LDB4MzcsMHgwMCwweDAwLDB4ZWIsMHgwMCwweDQwLDB4YmQsMHhlOCwweDFlLDB4ZmYsMHgyZiwweGUxLAorCTB4MDAsMHg0MCwweDJkLDB4ZTksMHgxMiwweDJlLDB4YTAsMHhlMywweDA2LDB4MzAsMHhhMCwweGUzLDB4MDAsMHgxMCwweGEwLDB4ZTMsCisJMHgwMiwweDA0LDB4YTAsMHhlMywweDJmLDB4MDAsMHgwMCwweGViLDB4MDAsMHg0MCwweGJkLDB4ZTgsMHgxZSwweGZmLDB4MmYsMHhlMSwKKwkweDAwLDB4MDIsMHgwMCwweDAyLDB4ODAsMHgwMSwweDkwLDB4ZTAsMHgwMSwweDAwLDB4MDAsMHgwYSwweDAxLDB4MDAsMHg1MCwweGUyLAorCTB4ZmMsMHhmZiwweGZmLDB4ZWEsMHgxZSwweGZmLDB4MmYsMHhlMSwweDgwLDB4MTAsMHhhMCwweGUzLDB4ZjMsMHgwNiwweGEwLDB4ZTMsCisJMHgwMCwweDEwLDB4ODAsMHhlNSwweDAwLDB4MTAsMHhhMCwweGUzLDB4MDAsMHgxMCwweDgwLDB4ZTUsMHgwMSwweDEwLDB4YTAsMHhlMywKKwkweDA0LDB4MTAsMHg4MCwweGU1LDB4MDAsMHgxMCwweDgwLDB4ZTUsMHgwZSwweDM0LDB4YTAsMHhlMywweDFjLDB4MTAsMHg5MywweGU1LAorCTB4MDIsMHgxYSwweDgxLDB4ZTMsMHgxYywweDEwLDB4ODMsMHhlNSwweDU4LDB4MTEsMHg5ZiwweGU1LDB4MzAsMHgxMCwweDgwLDB4ZTUsCisJMHg1NCwweDExLDB4OWYsMHhlNSwweDM0LDB4MTAsMHg4MCwweGU1LDB4MzgsMHgxMCwweDgwLDB4ZTUsMHgzYywweDEwLDB4ODAsMHhlNSwKKwkweDEwLDB4MTAsMHg5MCwweGU1LDB4MDgsMHgwMCwweDkwLDB4ZTUsMHgxZSwweGZmLDB4MmYsMHhlMSwweGYzLDB4MTYsMHhhMCwweGUzLAorCTB4MDgsMHgwMCwweDkxLDB4ZTUsMHgwNSwweDAwLDB4YTAsMHhlMywweDBjLDB4MDAsMHg4MSwweGU1LDB4MTAsMHgwMCwweDkxLDB4ZTUsCisJMHgwMiwweDAwLDB4MTAsMHhlMywweGZjLDB4ZmYsMHhmZiwweDBhLDB4ZmYsMHgwMCwweGEwLDB4ZTMsMHgwYywweDAwLDB4ODEsMHhlNSwKKwkweDEwLDB4MDAsMHg5MSwweGU1LDB4MDIsMHgwMCwweDEwLDB4ZTMsMHhmYywweGZmLDB4ZmYsMHgwYSwweDA4LDB4MDAsMHg5MSwweGU1LAorCTB4MTAsMHgwMCwweDkxLDB4ZTUsMHgwMSwweDAwLDB4MTAsMHhlMywweGZjLDB4ZmYsMHhmZiwweDBhLDB4MDgsMHgwMCwweDkxLDB4ZTUsCisJMHhmZiwweDAwLDB4MDAsMHhlMiwweDFlLDB4ZmYsMHgyZiwweGUxLDB4MzAsMHg0MCwweDJkLDB4ZTksMHgwMCwweDUwLDB4YTAsMHhlMSwKKwkweDAzLDB4NDAsMHhhMCwweGUxLDB4YTIsMHgwMiwweGEwLDB4ZTEsMHgwOCwweDAwLDB4MDAsMHhlMiwweDAzLDB4MDAsMHg4MCwweGUyLAorCTB4ZDgsMHgxMCwweDlmLDB4ZTUsMHgwMCwweDAwLDB4YzEsMHhlNSwweDAxLDB4MjAsMHhjMSwweGU1LDB4ZTIsMHhmZiwweGZmLDB4ZWIsCisJMHgwMSwweDAwLDB4MTAsMHhlMywweGZjLDB4ZmYsMHhmZiwweDFhLDB4MTQsMHgwMCwweGEwLDB4ZTMsMHhjNCwweGZmLDB4ZmYsMHhlYiwKKwkweDA0LDB4MjAsMHhhMCwweGUxLDB4MDUsMHgxMCwweGEwLDB4ZTEsMHgwMiwweDAwLDB4YTAsMHhlMywweDAxLDB4MDAsMHgwMCwweGViLAorCTB4MzAsMHg0MCwweGJkLDB4ZTgsMHgxZSwweGZmLDB4MmYsMHhlMSwweDcwLDB4NDAsMHgyZCwweGU5LDB4ZjMsMHg0NiwweGEwLDB4ZTMsCisJMHgwMCwweDMwLDB4YTAsMHhlMywweDAwLDB4MDAsMHg1MCwweGUzLDB4MDgsMHgwMCwweDAwLDB4OWEsMHg4YywweDUwLDB4OWYsMHhlNSwKKwkweDAzLDB4NjAsMHhkNSwweGU3LDB4MGMsMHg2MCwweDg0LDB4ZTUsMHgxMCwweDYwLDB4OTQsMHhlNSwweDAyLDB4MDAsMHgxNiwweGUzLAorCTB4ZmMsMHhmZiwweGZmLDB4MGEsMHgwMSwweDMwLDB4ODMsMHhlMiwweDAwLDB4MDAsMHg1MywweGUxLDB4ZjcsMHhmZiwweGZmLDB4M2EsCisJMHhmZiwweDMwLDB4YTAsMHhlMywweDBjLDB4MzAsMHg4NCwweGU1LDB4MDgsMHgwMCwweDk0LDB4ZTUsMHgxMCwweDAwLDB4OTQsMHhlNSwKKwkweDAxLDB4MDAsMHgxMCwweGUzLDB4ZmMsMHhmZiwweGZmLDB4MGEsMHgwOCwweDAwLDB4OTQsMHhlNSwweDAwLDB4MDAsMHhhMCwweGUzLAorCTB4MDAsMHgwMCwweDUyLDB4ZTMsMHgwYiwweDAwLDB4MDAsMHg5YSwweDEwLDB4NTAsMHg5NCwweGU1LDB4MDIsMHgwMCwweDE1LDB4ZTMsCisJMHhmYywweGZmLDB4ZmYsMHgwYSwweDBjLDB4MzAsMHg4NCwweGU1LDB4MTAsMHg1MCwweDk0LDB4ZTUsMHgwMSwweDAwLDB4MTUsMHhlMywKKwkweGZjLDB4ZmYsMHhmZiwweDBhLDB4MDgsMHg1MCwweDk0LDB4ZTUsMHgwMSwweDUwLDB4YzEsMHhlNCwweDAxLDB4MDAsMHg4MCwweGUyLAorCTB4MDIsMHgwMCwweDUwLDB4ZTEsMHhmMywweGZmLDB4ZmYsMHgzYSwweGM4LDB4MDAsMHhhMCwweGUzLDB4OTgsMHhmZiwweGZmLDB4ZWIsCisJMHg3MCwweDQwLDB4YmQsMHhlOCwweDFlLDB4ZmYsMHgyZiwweGUxLDB4MDEsMHgwYywweDAwLDB4MDIsMHgwMSwweDAyLDB4MDAsMHgwMiwKKwkweDAwLDB4MDEsMHgwMCwweDAyCit9OworCitzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSB7CisJdm9pZCAqY2FyZDsgLyogQnVzIGRlcGVuZGVudCBzdHVjdHVyZSB2YXJpZXMgZm9yIFBDY2FyZCAqLworCWludCAoKnByZXNlbnRfY2FsbGJhY2spKHZvaWQgKik7IC8qIEFuZCBjYWxsYmFjayB3aGljaCB1c2VzIGl0ICovCisJY2hhciBmaXJtd2FyZV9pZFszMl07CisJQXRtZWxGV1R5cGUgZmlybXdhcmVfdHlwZTsKKwl1OCAqZmlybXdhcmU7CisJaW50IGZpcm13YXJlX2xlbmd0aDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBtYW5hZ2VtZW50X3RpbWVyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGRldmljZSAqc3lzX2RldjsKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyB3c3RhdHM7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CS8vIGRldmljZSBzdGF0cworCXNwaW5sb2NrX3QgaXJxbG9jaywgdGltZXJsb2NrOwkvLyBzcGlubG9ja3MKKwllbnVtIHsgQlVTX1RZUEVfUENDQVJELCBCVVNfVFlQRV9QQ0kgfSBidXNfdHlwZTsKKwllbnVtIHsgCisJCUNBUkRfVFlQRV9QQVJBTExFTF9GTEFTSCwgCisJCUNBUkRfVFlQRV9TUElfRkxBU0gsCisJCUNBUkRfVFlQRV9FRVBST00gCisJfSBjYXJkX3R5cGU7CisJaW50IGRvX3J4X2NyYzsgLyogSWYgd2UgbmVlZCB0byBDUkMgaW5jb21pbmcgcGFja2V0cyAqLworCWludCBwcm9iZV9jcmM7IC8qIHNldCBpZiB3ZSBkb24ndCB5ZXQga25vdyAqLworCWludCBjcmNfb2tfY250LCBjcmNfa29fY250OyAvKiBjb3VudGVycyBmb3IgcHJvYmluZyAqLworCXUxNiByeF9kZXNjX2hlYWQ7CisJdTE2IHR4X2Rlc2NfZnJlZSwgdHhfZGVzY19oZWFkLCB0eF9kZXNjX3RhaWwsIHR4X2Rlc2NfcHJldmlvdXM7CisJdTE2IHR4X2ZyZWVfbWVtLCB0eF9idWZmX2hlYWQsIHR4X2J1ZmZfdGFpbDsKKwkKKwl1MTYgZnJhZ19zZXEsIGZyYWdfbGVuLCBmcmFnX25vOworCXU4IGZyYWdfc291cmNlWzZdOyAKKwkKKwl1OCB3ZXBfaXNfb24sIGRlZmF1bHRfa2V5LCBleGNsdWRlX3VuZW5jcnlwdGVkLCBlbmNyeXB0aW9uX2xldmVsOworCXU4IGdyb3VwX2NpcGhlcl9zdWl0ZSwgcGFpcndpc2VfY2lwaGVyX3N1aXRlOworCXU4IHdlcF9rZXlzW01BWF9FTkNSWVBUSU9OX0tFWVNdW01BWF9FTkNSWVBUSU9OX0tFWV9TSVpFXTsKKwlpbnQgd2VwX2tleV9sZW5bTUFYX0VOQ1JZUFRJT05fS0VZU107IAorCWludCB1c2Vfd3BhLCByYWRpb19vbl9icm9rZW47IC8qIGZpcm13YXJlIGRlcGVuZGVudCBzdHVmZi4gKi8KKworCXUxNiBob3N0X2luZm9fYmFzZTsKKwlzdHJ1Y3QgaG9zdF9pbmZvX3N0cnVjdCB7IAorCQkvKiBOQiB0aGlzIGlzIG1hdGNoZWQgdG8gdGhlIGhhcmR3YXJlLCBkb24ndCBjaGFuZ2UuICovCisJCXU4IHZvbGF0aWxlIGludF9zdGF0dXM7CisJCXU4IHZvbGF0aWxlIGludF9tYXNrOworCQl1OCB2b2xhdGlsZSBsb2Nrb3V0X2hvc3Q7CisJCXU4IHZvbGF0aWxlIGxvY2tvdXRfbWFjOworCisJCXUxNiB0eF9idWZmX3BvczsKKwkJdTE2IHR4X2J1ZmZfc2l6ZTsKKwkJdTE2IHR4X2Rlc2NfcG9zOworCQl1MTYgdHhfZGVzY19jb3VudDsKKworCQl1MTYgcnhfYnVmZl9wb3M7CisJCXUxNiByeF9idWZmX3NpemU7CisJCXUxNiByeF9kZXNjX3BvczsKKwkJdTE2IHJ4X2Rlc2NfY291bnQ7CisJCQorCQl1MTYgYnVpbGRfdmVyc2lvbjsKKwkJdTE2IGNvbW1hbmRfcG9zOyAJCisJCQorCQl1MTYgbWFqb3JfdmVyc2lvbjsKKwkJdTE2IG1pbm9yX3ZlcnNpb247CisJCQorCQl1MTYgZnVuY19jdHJsOworCQl1MTYgbWFjX3N0YXR1czsKKwkJdTE2IGdlbmVyaWNfSVJRX3R5cGU7CisJCXU4ICByZXNlcnZlZFsyXTsKKwl9IGhvc3RfaW5mbzsKKworCWVudW0geyAKKwkJU1RBVElPTl9TVEFURV9TQ0FOTklORywKKwkJU1RBVElPTl9TVEFURV9KT0lOTklORywKKwkJU1RBVElPTl9TVEFURV9BVVRIRU5USUNBVElORywKKwkJU1RBVElPTl9TVEFURV9BU1NPQ0lBVElORywKKwkJU1RBVElPTl9TVEFURV9SRUFEWSwKKwkJU1RBVElPTl9TVEFURV9SRUFTU09DSUFUSU5HLAorCQlTVEFUSU9OX1NUQVRFX0RPV04sCisJCVNUQVRJT05fU1RBVEVfTUdNVF9FUlJPUgorCX0gc3RhdGlvbl9zdGF0ZTsKKwkKKwlpbnQgb3BlcmF0aW5nX21vZGUsIHBvd2VyX21vZGU7CisJdGltZV90IGxhc3RfcXVhbDsKKwlpbnQgYmVhY29uc190aGlzX3NlYzsKKwlpbnQgY2hhbm5lbDsKKwlpbnQgcmVnX2RvbWFpbiwgY29uZmlnX3JlZ19kb21haW47CisJaW50IHR4X3JhdGU7CisJaW50IGF1dG9fdHhfcmF0ZTsKKwlpbnQgcnRzX3RocmVzaG9sZDsKKwlpbnQgZnJhZ190aHJlc2hvbGQ7CisJaW50IGxvbmdfcmV0cnksIHNob3J0X3JldHJ5OworCWludCBwcmVhbWJsZTsKKwlpbnQgZGVmYXVsdF9iZWFjb25fcGVyaW9kLCBiZWFjb25fcGVyaW9kLCBsaXN0ZW5faW50ZXJ2YWw7CisJaW50IEN1cnJlbnRBdXRoZW50VHJhbnNhY3Rpb25TZXFOdW0sIEV4cGVjdGVkQXV0aGVudFRyYW5zYWN0aW9uU2VxTnVtOwkKKwlpbnQgQXV0aGVudGljYXRpb25SZXF1ZXN0UmV0cnlDbnQsIEFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250LCBSZUFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250OworCWVudW0geworCQlTSVRFX1NVUlZFWV9JRExFLAorCQlTSVRFX1NVUlZFWV9JTl9QUk9HUkVTUywKKwkJU0lURV9TVVJWRVlfQ09NUExFVEVEIAorCX0gc2l0ZV9zdXJ2ZXlfc3RhdGU7CisJdGltZV90IGxhc3Rfc3VydmV5OworCisJaW50IHN0YXRpb25fd2FzX2Fzc29jaWF0ZWQsIHN0YXRpb25faXNfYXNzb2NpYXRlZDsKKwlpbnQgZmFzdF9zY2FuOworCQkJCQorCXN0cnVjdCBic3NfaW5mbyB7CisJCWludCBjaGFubmVsOworCQlpbnQgU1NJRHNpemU7CisJCWludCBSU1NJOworCQlpbnQgVXNpbmdXRVA7CisJCWludCBwcmVhbWJsZTsKKwkJaW50IGJlYWNvbl9wZXJpb2Q7CisJCWludCBCU1N0eXBlOworCQl1OCBCU1NJRFs2XTsKKwkJdTggU1NJRFtNQVhfU1NJRF9MRU5HVEhdOworCX0gQlNTaW5mb1tNQVhfQlNTX0VOVFJJRVNdOworCWludCBCU1NfbGlzdF9lbnRyaWVzLCBjdXJyZW50X0JTUzsKKwlpbnQgY29ubmVjdF90b19hbnlfQlNTOyAKKwlpbnQgU1NJRF9zaXplLCBuZXdfU1NJRF9zaXplOworCXU4IEN1cnJlbnRCU1NJRFs2XSwgQlNTSURbNl07CisJdTggU1NJRFtNQVhfU1NJRF9MRU5HVEhdLCBuZXdfU1NJRFtNQVhfU1NJRF9MRU5HVEhdOworCXU2NCBsYXN0X2JlYWNvbl90aW1lc3RhbXA7CisJdTggcnhfYnVmW01BWF9XSVJFTEVTU19CT0RZXTsKKwkKK307CisKK3N0YXRpYyB1OCBhdG1lbF9iYXNpY19yYXRlc1s0XSA9IHsweDgyLDB4ODQsMHgwYiwweDE2fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJaW50IHJlZ19kb21haW47CisJaW50IG1pbiwgbWF4OworCWNoYXIgKm5hbWU7IAorfSBjaGFubmVsX3RhYmxlW10gPSB7IHsgUkVHX0RPTUFJTl9GQ0MsIDEsIDExLCAiVVNBIiB9LAorCQkgICAgICB7IFJFR19ET01BSU5fRE9DLCAxLCAxMSwgIkNhbmFkYSIgfSwKKwkJICAgICAgeyBSRUdfRE9NQUlOX0VUU0ksIDEsIDEzLCAiRXVyb3BlIiB9LAorCQkgICAgICB7IFJFR19ET01BSU5fU1BBSU4sIDEwLCAxMSwgIlNwYWluIiB9LAorCQkgICAgICB7IFJFR19ET01BSU5fRlJBTkNFLCAxMCwgMTMsICJGcmFuY2UiIH0sIAorCQkgICAgICB7IFJFR19ET01BSU5fTUtLLCAxNCwgMTQsICJNS0siIH0sCisJCSAgICAgIHsgUkVHX0RPTUFJTl9NS0sxLCAxLCAxNCwgIk1LSzEiIH0sCisJCSAgICAgIHsgUkVHX0RPTUFJTl9JU1JBRUwsIDMsIDksICJJc3JhZWwifSB9OworCitzdGF0aWMgdm9pZCBidWlsZF93cGFfbWliKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KTsKK3N0YXRpYyBpbnQgYXRtZWxfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgdm9pZCBhdG1lbF9jb3B5X3RvX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGRlc3QsIHVuc2lnbmVkIGNoYXIgKnNyYywgdTE2IGxlbik7CitzdGF0aWMgdm9pZCBhdG1lbF9jb3B5X3RvX2hvc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciAqZGVzdCwgdTE2IHNyYywgdTE2IGxlbik7CitzdGF0aWMgdm9pZCBhdG1lbF9zZXRfZ2NyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBtYXNrKTsKK3N0YXRpYyB2b2lkIGF0bWVsX2NsZWFyX2djcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgbWFzayk7CitzdGF0aWMgaW50IGF0bWVsX2xvY2tfbWFjKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KTsKK3N0YXRpYyB2b2lkIGF0bWVsX3dtZW0zMihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IHBvcywgdTMyIGRhdGEpOworc3RhdGljIHZvaWQgYXRtZWxfY29tbWFuZF9pcnEoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYpOworc3RhdGljIGludCBhdG1lbF92YWxpZGF0ZV9jaGFubmVsKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgY2hhbm5lbCk7CitzdGF0aWMgdm9pZCBhdG1lbF9tYW5hZ2VtZW50X2ZyYW1lKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIgKmhlYWRlciwgCisJCQkJICAgdTE2IGZyYW1lX2xlbiwgdTggcnNzaSk7CitzdGF0aWMgdm9pZCBhdG1lbF9tYW5hZ2VtZW50X3RpbWVyKHVfbG9uZyBhKTsKK3N0YXRpYyB2b2lkIGF0bWVsX3NlbmRfY29tbWFuZChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IGNvbW1hbmQsIHZvaWQgKmNtZCwgaW50IGNtZF9zaXplKTsKK3N0YXRpYyBpbnQgYXRtZWxfc2VuZF9jb21tYW5kX3dhaXQoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIGludCBjb21tYW5kLCB2b2lkICpjbWQsIGludCBjbWRfc2l6ZSk7CitzdGF0aWMgdm9pZCBhdG1lbF90cmFuc21pdF9tYW5hZ2VtZW50X2ZyYW1lKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIgKmhlYWRlciwKKwkJCQkJICAgIHU4ICpib2R5LCBpbnQgYm9keV9sZW4pOworCitzdGF0aWMgdTggYXRtZWxfZ2V0X21pYjgoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHU4IHR5cGUsIHU4IGluZGV4KTsKK3N0YXRpYyB2b2lkIGF0bWVsX3NldF9taWI4KHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1OCB0eXBlLCB1OCBpbmRleCwgdTggZGF0YSk7CitzdGF0aWMgdm9pZCBhdG1lbF9zZXRfbWliMTYoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHU4IHR5cGUsIHU4IGluZGV4LCB1MTYgZGF0YSk7CitzdGF0aWMgdm9pZCBhdG1lbF9zZXRfbWliKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1OCB0eXBlLCB1OCBpbmRleCwgdTggKmRhdGEsIGludCBkYXRhX2xlbik7CitzdGF0aWMgdm9pZCBhdG1lbF9nZXRfbWliKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1OCB0eXBlLCB1OCBpbmRleCwgdTggKmRhdGEsIGludCBkYXRhX2xlbik7CitzdGF0aWMgdm9pZCBhdG1lbF9zY2FuKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgc3BlY2lmaWNfc3NpZCk7CitzdGF0aWMgdm9pZCBhdG1lbF9qb2luX2JzcyhzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IGJzc19pbmRleCk7CitzdGF0aWMgdm9pZCBhdG1lbF9zbW9vdGhfcXVhbChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdik7CitzdGF0aWMgdm9pZCBhdG1lbF93cml0ZUFSKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBkYXRhKTsKK3N0YXRpYyBpbnQgcHJvYmVfYXRtZWxfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcmVzZXRfYXRtZWxfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICk7CitzdGF0aWMgdm9pZCBhdG1lbF9lbnRlcl9zdGF0ZShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IG5ld19zdGF0ZSk7CitpbnQgYXRtZWxfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYyBpbmxpbmUgdTE2IGF0bWVsX2hpKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1MTYgb2Zmc2V0KQoreworCXJldHVybiBwcml2LT5ob3N0X2luZm9fYmFzZSArIG9mZnNldDsKK30KKworc3RhdGljIGlubGluZSB1MTYgYXRtZWxfY28oc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHUxNiBvZmZzZXQpCit7CisJcmV0dXJuIHByaXYtPmhvc3RfaW5mby5jb21tYW5kX3BvcyArIG9mZnNldDsKK30KKworc3RhdGljIGlubGluZSB1MTYgYXRtZWxfcngoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHUxNiBvZmZzZXQsIHUxNiAgZGVzYykKK3sKKwlyZXR1cm4gcHJpdi0+aG9zdF9pbmZvLnJ4X2Rlc2NfcG9zICsgKHNpemVvZihzdHJ1Y3QgcnhfZGVzYykgKiBkZXNjKSArIG9mZnNldDsKK30KKworc3RhdGljIGlubGluZSB1MTYgYXRtZWxfdHgoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHUxNiBvZmZzZXQsIHUxNiAgZGVzYykKK3sKKwlyZXR1cm4gcHJpdi0+aG9zdF9pbmZvLnR4X2Rlc2NfcG9zICsgKHNpemVvZihzdHJ1Y3QgdHhfZGVzYykgKiBkZXNjKSArIG9mZnNldDsKK30KKworc3RhdGljIGlubGluZSB1OCBhdG1lbF9yZWFkOChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgb2Zmc2V0KQoreworCXJldHVybiBpbmIoZGV2LT5iYXNlX2FkZHIgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRtZWxfd3JpdGU4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBvZmZzZXQsIHU4IGRhdGEpCit7CisJb3V0YihkYXRhLCBkZXYtPmJhc2VfYWRkciArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGF0bWVsX3JlYWQxNihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgb2Zmc2V0KQoreworCXJldHVybiBpbncoZGV2LT5iYXNlX2FkZHIgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRtZWxfd3JpdGUxNihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgb2Zmc2V0LCB1MTYgZGF0YSkKK3sKKwlvdXR3KGRhdGEsIGRldi0+YmFzZV9hZGRyICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB1OCBhdG1lbF9ybWVtOChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IHBvcykKK3sKKwlhdG1lbF93cml0ZUFSKHByaXYtPmRldiwgcG9zKTsJCisJcmV0dXJuIGF0bWVsX3JlYWQ4KHByaXYtPmRldiwgRFIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRtZWxfd21lbTgoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHUxNiBwb3MsIHUxNiBkYXRhKQoreworCWF0bWVsX3dyaXRlQVIocHJpdi0+ZGV2LCBwb3MpOwkKKwlhdG1lbF93cml0ZTgocHJpdi0+ZGV2LCBEUiwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGF0bWVsX3JtZW0xNihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IHBvcykKK3sKKyAgICAgICAJYXRtZWxfd3JpdGVBUihwcml2LT5kZXYsIHBvcyk7CQorCXJldHVybiBhdG1lbF9yZWFkMTYocHJpdi0+ZGV2LCBEUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG1lbF93bWVtMTYoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHUxNiBwb3MsIHUxNiBkYXRhKQoreworICAgICAgIAlhdG1lbF93cml0ZUFSKHByaXYtPmRldiwgcG9zKTsJCisJYXRtZWxfd3JpdGUxNihwcml2LT5kZXYsIERSLCBkYXRhKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBhdG1lbF9oYW5kbGVyX2RlZjsKKworc3RhdGljIHZvaWQgdHhfZG9uZV9pcnEoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyAKKwkgICAgIGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfRkxBR1NfT0ZGU0VULCBwcml2LT50eF9kZXNjX2hlYWQpKSA9PSBUWF9ET05FICYmCisJCSAgICAgaSA8IHByaXYtPmhvc3RfaW5mby50eF9kZXNjX2NvdW50OworCSAgICAgaSsrKSB7CisJCQorCQl1OCBzdGF0dXMgPSBhdG1lbF9ybWVtOChwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX1NUQVRVU19PRkZTRVQsIHByaXYtPnR4X2Rlc2NfaGVhZCkpOworCQl1MTYgbXNkdV9zaXplID0gYXRtZWxfcm1lbTE2KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfU0laRV9PRkZTRVQsIHByaXYtPnR4X2Rlc2NfaGVhZCkpOworCQl1OCB0eXBlID0gYXRtZWxfcm1lbTgocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19QQUNLRVRfVFlQRV9PRkZTRVQsIHByaXYtPnR4X2Rlc2NfaGVhZCkpOworCisJCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfRkxBR1NfT0ZGU0VULCBwcml2LT50eF9kZXNjX2hlYWQpLCAwKTsKKworCQlwcml2LT50eF9mcmVlX21lbSArPSBtc2R1X3NpemU7CisJCXByaXYtPnR4X2Rlc2NfZnJlZSsrOworCisJCWlmIChwcml2LT50eF9idWZmX2hlYWQgKyBtc2R1X3NpemUgPiAocHJpdi0+aG9zdF9pbmZvLnR4X2J1ZmZfcG9zICsgcHJpdi0+aG9zdF9pbmZvLnR4X2J1ZmZfc2l6ZSkpCisJCQlwcml2LT50eF9idWZmX2hlYWQgPSAwOworCQllbHNlCisJCQlwcml2LT50eF9idWZmX2hlYWQgKz0gbXNkdV9zaXplOworCQkJCisJCWlmIChwcml2LT50eF9kZXNjX2hlYWQgPCAocHJpdi0+aG9zdF9pbmZvLnR4X2Rlc2NfY291bnQgLSAxKSkKKwkJCXByaXYtPnR4X2Rlc2NfaGVhZCsrIDsJCQkJCQorCQllbHNlCisJCQlwcml2LT50eF9kZXNjX2hlYWQgPSAwOworCQkKKwkJaWYgKHR5cGUgPT0gVFhfUEFDS0VUX1RZUEVfREFUQSkgeworCQkJaWYgKHN0YXR1cyA9PSBUWF9TVEFUVVNfU1VDQ0VTUykKKwkJCQlwcml2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQllbHNlIAorCQkJCXByaXYtPnN0YXRzLnR4X2Vycm9ycysrOworCQkJbmV0aWZfd2FrZV9xdWV1ZShwcml2LT5kZXYpOworCQl9CisJfQorfQorCitzdGF0aWMgdTE2IGZpbmRfdHhfYnVmZihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IGxlbikKK3sKKwl1MTYgYm90dG9tX2ZyZWUgPSBwcml2LT5ob3N0X2luZm8udHhfYnVmZl9zaXplIC0gcHJpdi0+dHhfYnVmZl90YWlsOworCisJaWYgKHByaXYtPnR4X2Rlc2NfZnJlZSA9PSAzIHx8IHByaXYtPnR4X2ZyZWVfbWVtIDwgbGVuKSAKKwkJcmV0dXJuIDA7CisJCisJaWYgKGJvdHRvbV9mcmVlID49IGxlbikKKwkJcmV0dXJuIHByaXYtPmhvc3RfaW5mby50eF9idWZmX3BvcyArIHByaXYtPnR4X2J1ZmZfdGFpbDsKKwkKKwlpZiAocHJpdi0+dHhfZnJlZV9tZW0gLSBib3R0b21fZnJlZSA+PSBsZW4pIHsKKwkJcHJpdi0+dHhfYnVmZl90YWlsID0gMDsKKwkJcmV0dXJuIHByaXYtPmhvc3RfaW5mby50eF9idWZmX3BvczsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHR4X3VwZGF0ZV9kZXNjcmlwdG9yKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgaXNfYmNhc3QsIHUxNiBsZW4sIHUxNiBidWZmLCB1OCB0eXBlKQoreworCWF0bWVsX3dtZW0xNihwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX1BPU19PRkZTRVQsIHByaXYtPnR4X2Rlc2NfdGFpbCksIGJ1ZmYpOworCWF0bWVsX3dtZW0xNihwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX1NJWkVfT0ZGU0VULCBwcml2LT50eF9kZXNjX3RhaWwpLCBsZW4pOworCWlmICghcHJpdi0+dXNlX3dwYSkKKwkJYXRtZWxfd21lbTE2KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfSE9TVF9MRU5HVEhfT0ZGU0VULCBwcml2LT50eF9kZXNjX3RhaWwpLCBsZW4pOworCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfUEFDS0VUX1RZUEVfT0ZGU0VULCBwcml2LT50eF9kZXNjX3RhaWwpLCB0eXBlKTsKKwlhdG1lbF93bWVtOChwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX1JBVEVfT0ZGU0VULCBwcml2LT50eF9kZXNjX3RhaWwpLCBwcml2LT50eF9yYXRlKTsKKwlhdG1lbF93bWVtOChwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX1JFVFJZX09GRlNFVCwgcHJpdi0+dHhfZGVzY190YWlsKSwgMCk7CisJaWYgKHByaXYtPnVzZV93cGEpIHsKKwkJaW50IGNpcGhlcl90eXBlLCBjaXBoZXJfbGVuZ3RoOworCQlpZiAoaXNfYmNhc3QpIHsKKwkJCWNpcGhlcl90eXBlID0gcHJpdi0+Z3JvdXBfY2lwaGVyX3N1aXRlOworCQkJaWYgKGNpcGhlcl90eXBlID09IENJUEhFUl9TVUlURV9XRVBfNjQgfHwgCisJCQkgICAgY2lwaGVyX3R5cGUgPT0gQ0lQSEVSX1NVSVRFX1dFUF8xMjggKQorCQkJCWNpcGhlcl9sZW5ndGggPSA4OworCQkJZWxzZSBpZiAoY2lwaGVyX3R5cGUgPT0gQ0lQSEVSX1NVSVRFX1RLSVApCisJCQkJY2lwaGVyX2xlbmd0aCA9IDEyOworCQkJZWxzZSBpZiAocHJpdi0+cGFpcndpc2VfY2lwaGVyX3N1aXRlID09IENJUEhFUl9TVUlURV9XRVBfNjQgfHwKKwkJCQkgcHJpdi0+cGFpcndpc2VfY2lwaGVyX3N1aXRlID09IENJUEhFUl9TVUlURV9XRVBfMTI4KSB7CisJCQkJY2lwaGVyX3R5cGUgPSBwcml2LT5wYWlyd2lzZV9jaXBoZXJfc3VpdGU7CisJCQkJY2lwaGVyX2xlbmd0aCA9IDg7CisJCQl9IGVsc2UgeworCQkJCWNpcGhlcl90eXBlID0gQ0lQSEVSX1NVSVRFX05PTkU7CisJCQkJY2lwaGVyX2xlbmd0aCA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQljaXBoZXJfdHlwZSA9IHByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZTsKKwkJCWlmIChjaXBoZXJfdHlwZSA9PSBDSVBIRVJfU1VJVEVfV0VQXzY0IHx8IAorCQkJICAgIGNpcGhlcl90eXBlID09IENJUEhFUl9TVUlURV9XRVBfMTI4ICkKKwkJCQljaXBoZXJfbGVuZ3RoID0gODsKKwkJCWVsc2UgaWYgKGNpcGhlcl90eXBlID09IENJUEhFUl9TVUlURV9US0lQKQorCQkJCWNpcGhlcl9sZW5ndGggPSAxMjsKKwkJCWVsc2UgaWYgKHByaXYtPmdyb3VwX2NpcGhlcl9zdWl0ZSA9PSBDSVBIRVJfU1VJVEVfV0VQXzY0IHx8CisJCQkJIHByaXYtPmdyb3VwX2NpcGhlcl9zdWl0ZSA9PSBDSVBIRVJfU1VJVEVfV0VQXzEyOCkgeworCQkJCWNpcGhlcl90eXBlID0gcHJpdi0+Z3JvdXBfY2lwaGVyX3N1aXRlOworCQkJCWNpcGhlcl9sZW5ndGggPSA4OworCQkJfSBlbHNlIHsKKwkJCQljaXBoZXJfdHlwZSA9IENJUEhFUl9TVUlURV9OT05FOworCQkJCWNpcGhlcl9sZW5ndGggPSAwOworCQkJfQorCQl9CisJCQorCQlhdG1lbF93bWVtOChwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX0NJUEhFUl9UWVBFX09GRlNFVCwgcHJpdi0+dHhfZGVzY190YWlsKSwKKwkJCSAgICBjaXBoZXJfdHlwZSk7CQorCQlhdG1lbF93bWVtOChwcml2LCBhdG1lbF90eChwcml2LCBUWF9ERVNDX0NJUEhFUl9MRU5HVEhfT0ZGU0VULCBwcml2LT50eF9kZXNjX3RhaWwpLAorCQkJICAgIGNpcGhlcl9sZW5ndGgpOworCX0KKwlhdG1lbF93bWVtMzIocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19ORVhUX09GRlNFVCwgcHJpdi0+dHhfZGVzY190YWlsKSwgMHg4MDAwMDAwMEwpOworCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfRkxBR1NfT0ZGU0VULCBwcml2LT50eF9kZXNjX3RhaWwpLCBUWF9GSVJNX09XTik7CisJaWYgKHByaXYtPnR4X2Rlc2NfcHJldmlvdXMgIT0gcHJpdi0+dHhfZGVzY190YWlsKQorCQlhdG1lbF93bWVtMzIocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19ORVhUX09GRlNFVCwgcHJpdi0+dHhfZGVzY19wcmV2aW91cyksIDApOworCXByaXYtPnR4X2Rlc2NfcHJldmlvdXMgPSBwcml2LT50eF9kZXNjX3RhaWw7CisJaWYgKHByaXYtPnR4X2Rlc2NfdGFpbCA8IChwcml2LT5ob3N0X2luZm8udHhfZGVzY19jb3VudCAtMSApKQorCQlwcml2LT50eF9kZXNjX3RhaWwrKzsKKwllbHNlCisJCXByaXYtPnR4X2Rlc2NfdGFpbCA9IDA7CisJcHJpdi0+dHhfZGVzY19mcmVlLS07CisJcHJpdi0+dHhfZnJlZV9tZW0gLT0gbGVuOworCit9CisKK3N0YXRpYyBpbnQgc3RhcnRfdHggKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpZWVlODAyXzExX2hkciBoZWFkZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgYnVmZiwgZnJhbWVfY3RsLCBsZW4gPSAoRVRIX1pMRU4gPCBza2ItPmxlbikgPyBza2ItPmxlbiA6IEVUSF9aTEVOOworCXU4IFNOQVBfUkZDMTAyNFs2XSA9IHsweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwfTsKKyAKKwlpZiAocHJpdi0+Y2FyZCAmJiBwcml2LT5wcmVzZW50X2NhbGxiYWNrICYmIAorCSAgICAhKCpwcml2LT5wcmVzZW50X2NhbGxiYWNrKShwcml2LT5jYXJkKSkgeworCQlwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisJCisJaWYgKHByaXYtPnN0YXRpb25fc3RhdGUgIT0gU1RBVElPTl9TVEFURV9SRUFEWSkgeworCQlwcml2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisJCisJLyogZmlyc3QgZW5zdXJlIHRoZSB0aW1lciBmdW5jIGNhbm5vdCBydW4gKi8KKwlzcGluX2xvY2tfYmgoJnByaXYtPnRpbWVybG9jayk7IAorCS8qIHRoZW4gc3RvcCB0aGUgaGFyZHdhcmUgSVNSICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycWxvY2ssIGZsYWdzKTsgCisJLyogbmIgZG9pbmcgdGhlIGFib3ZlIGluIHRoZSBvcHBvc2l0ZSBvcmRlciB3aWxsIGRlYWRsb2NrICovCisJCisJLyogVGhlIFdpcmVsZXNzIEhlYWRlciBpcyAzMCBieXRlcy4gSW4gdGhlIEV0aGVybmV0IHBhY2tldCB3ZSAiY3V0IiB0aGUKKwkgICAxMiBmaXJzdCBieXRlcyAoY29udGFpbmluZyBEQS9TQSkgYW5kIHB1dCB0aGVtIGluIHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMgb2YKKwkgICB0aGUgV2lyZWxlc3MgSGVhZGVyLiBUaHVzIHRoZSBwYWNrZXQgbGVuZ3RoIGlzIHRoZW4gdGhlIGluaXRpYWwgKyAxOCAoKzMwLTEyKSAqLworCQorCWlmICghKGJ1ZmYgPSBmaW5kX3R4X2J1ZmYocHJpdiwgbGVuICsgMTgpKSkgeworCQlwcml2LT5zdGF0cy50eF9kcm9wcGVkKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycWxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPnRpbWVybG9jayk7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJcmV0dXJuIDE7CisJfQorCQorCWZyYW1lX2N0bCA9IElFRUU4MDJfMTFfRlRZUEVfREFUQTsKKwloZWFkZXIuZHVyYXRpb25faWQgPSAwOworCWhlYWRlci5zZXFfY3RsID0gMDsKKwlpZiAocHJpdi0+d2VwX2lzX29uKQorCQlmcmFtZV9jdGwgfD0gSUVFRTgwMl8xMV9GQ1RMX1dFUDsKKwlpZiAocHJpdi0+b3BlcmF0aW5nX21vZGUgPT0gSVdfTU9ERV9BREhPQykgeworCQltZW1jcHkoJmhlYWRlci5hZGRyMSwgc2tiLT5kYXRhLCA2KTsKKwkJbWVtY3B5KCZoZWFkZXIuYWRkcjIsIGRldi0+ZGV2X2FkZHIsIDYpOworCQltZW1jcHkoJmhlYWRlci5hZGRyMywgcHJpdi0+QlNTSUQsIDYpOworCX0gZWxzZSB7CisJCWZyYW1lX2N0bCB8PSBJRUVFODAyXzExX0ZDVExfVE9EUzsKKwkJbWVtY3B5KCZoZWFkZXIuYWRkcjEsIHByaXYtPkN1cnJlbnRCU1NJRCwgNik7CisJCW1lbWNweSgmaGVhZGVyLmFkZHIyLCBkZXYtPmRldl9hZGRyLCA2KTsKKwkJbWVtY3B5KCZoZWFkZXIuYWRkcjMsIHNrYi0+ZGF0YSwgNik7CisJfQorCQorCWlmIChwcml2LT51c2Vfd3BhKQorCQltZW1jcHkoJmhlYWRlci5hZGRyNCwgU05BUF9SRkMxMDI0LCA2KTsKKworCWhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihmcmFtZV9jdGwpOworCS8qIENvcHkgdGhlIHdpcmVsZXNzIGhlYWRlciBpbnRvIHRoZSBjYXJkICovCisJYXRtZWxfY29weV90b19jYXJkKGRldiwgYnVmZiwgKHVuc2lnbmVkIGNoYXIgKikmaGVhZGVyLCBEQVRBX0ZSQU1FX1dTX0hFQURFUl9TSVpFKTsKKwkvKiBDb3B5IHRoZSBwYWNrZXQgc2FucyBpdHMgODAyLjMgaGVhZGVyIGFkZHJlc3NlcyB3aGljaCBoYXZlIGJlZW4gcmVwbGFjZWQgKi8KKwlhdG1lbF9jb3B5X3RvX2NhcmQoZGV2LCBidWZmICsgREFUQV9GUkFNRV9XU19IRUFERVJfU0laRSwgc2tiLT5kYXRhICsgMTIsIGxlbiAtIDEyKTsKKwlwcml2LT50eF9idWZmX3RhaWwgKz0gbGVuIC0gMTIgKyBEQVRBX0ZSQU1FX1dTX0hFQURFUl9TSVpFOworCQorCS8qIGxvdyBiaXQgb2YgZmlyc3QgYnl0ZSBvZiBkZXN0aW5hdGlvbiB0ZWxscyB1cyBpZiBicm9hZGNhc3QgKi8KKwl0eF91cGRhdGVfZGVzY3JpcHRvcihwcml2LCAqKHNrYi0+ZGF0YSkgJiAweDAxLCBsZW4gKyAxOCwgYnVmZiwgVFhfUEFDS0VUX1RZUEVfREFUQSk7CisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJcHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuOworCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycWxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19iaCgmcHJpdi0+dGltZXJsb2NrKTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCisJcmV0dXJuIDA7CQorfQorCitzdGF0aWMgdm9pZCBhdG1lbF90cmFuc21pdF9tYW5hZ2VtZW50X2ZyYW1lKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCAKKwkJCQkJICAgIHN0cnVjdCBpZWVlODAyXzExX2hkciAqaGVhZGVyLAorCQkJCQkgICAgdTggKmJvZHksIGludCBib2R5X2xlbikKK3sKKwl1MTYgYnVmZjsKKwlpbnQgbGVuID0gIE1HTVRfRlJBTUVfQk9EWV9PRkZTRVQgKyBib2R5X2xlbjsKKwkKKwlpZiAoIShidWZmID0gZmluZF90eF9idWZmKHByaXYsIGxlbikpKSAKKwkJcmV0dXJuOworCisJYXRtZWxfY29weV90b19jYXJkKHByaXYtPmRldiwgYnVmZiwgKHU4ICopaGVhZGVyLCBNR01UX0ZSQU1FX0JPRFlfT0ZGU0VUKTsKKwlhdG1lbF9jb3B5X3RvX2NhcmQocHJpdi0+ZGV2LCBidWZmICsgTUdNVF9GUkFNRV9CT0RZX09GRlNFVCwgYm9keSwgYm9keV9sZW4pOworCXByaXYtPnR4X2J1ZmZfdGFpbCArPSBsZW47CisJdHhfdXBkYXRlX2Rlc2NyaXB0b3IocHJpdiwgaGVhZGVyLT5hZGRyMVswXSAmIDB4MDEsIGxlbiwgYnVmZiwgVFhfUEFDS0VUX1RZUEVfTUdNVCk7Cit9CisJCitzdGF0aWMgdm9pZCBmYXN0X3J4X3BhdGgoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBpZWVlODAyXzExX2hkciAqaGVhZGVyLCAKKwkJCSB1MTYgbXNkdV9zaXplLCB1MTYgcnhfcGFja2V0X2xvYywgdTMyIGNyYykKK3sKKwkvKiBmYXN0IHBhdGg6IHVuZnJhZ21lbnRlZCBwYWNrZXQgY29weSBkaXJlY3RseSBpbnRvIHNrYnVmICovCisJdTggbWFjNFs2XTsgCisJc3RydWN0IHNrX2J1ZmYgCSpza2I7CisJdW5zaWduZWQgY2hhciAqc2ticDsKKwkKKwkvKiBnZXQgdGhlIGZpbmFsLCBtYWMgNCBoZWFkZXIgZmllbGQsIHRoaXMgdGVsbHMgdXMgZW5jYXBzdWxhdGlvbiAqLworCWF0bWVsX2NvcHlfdG9faG9zdChwcml2LT5kZXYsIG1hYzQsIHJ4X3BhY2tldF9sb2MgKyAyNCwgNik7CisJbXNkdV9zaXplIC09IDY7CisJCisJaWYgKHByaXYtPmRvX3J4X2NyYykgeworCQljcmMgPSBjcmMzMl9sZShjcmMsIG1hYzQsIDYpOworCQltc2R1X3NpemUgLT0gNDsKKwl9CisJCisJaWYgKCEoc2tiID0gZGV2X2FsbG9jX3NrYihtc2R1X3NpemUgKyAxNCkpKSB7CisJCXByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKworCXNrYl9yZXNlcnZlKHNrYiwgMik7CisJc2ticCA9IHNrYl9wdXQoc2tiLCBtc2R1X3NpemUgKyAxMik7CisJYXRtZWxfY29weV90b19ob3N0KHByaXYtPmRldiwgc2ticCArIDEyLCByeF9wYWNrZXRfbG9jICsgMzAsIG1zZHVfc2l6ZSk7CisJCisJaWYgKHByaXYtPmRvX3J4X2NyYykgeworCQl1MzIgbmV0Y3JjOworCQljcmMgPSBjcmMzMl9sZShjcmMsIHNrYnAgKyAxMiwgbXNkdV9zaXplKTsKKwkJYXRtZWxfY29weV90b19ob3N0KHByaXYtPmRldiwgKHZvaWQgKikmbmV0Y3JjLCByeF9wYWNrZXRfbG9jICsgMzAgKyBtc2R1X3NpemUsIDQpOworCQlpZiAoKGNyYyBeIDB4ZmZmZmZmZmYpICE9IG5ldGNyYykgeworCQkJcHJpdi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJcmV0dXJuOworCQl9CisJfQorCQorCW1lbWNweShza2JwLCBoZWFkZXItPmFkZHIxLCA2KTsgLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworCWlmIChsZTE2X3RvX2NwdShoZWFkZXItPmZyYW1lX2N0bCkgJiBJRUVFODAyXzExX0ZDVExfRlJPTURTKSAKKwkJbWVtY3B5KCZza2JwWzZdLCBoZWFkZXItPmFkZHIzLCA2KTsKKwllbHNlCisJCW1lbWNweSgmc2ticFs2XSwgaGVhZGVyLT5hZGRyMiwgNik7IC8qIHNvdXJjZSBhZGRyZXNzICovCisJCisJcHJpdi0+ZGV2LT5sYXN0X3J4PWppZmZpZXM7CisJc2tiLT5kZXYgPSBwcml2LT5kZXY7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgcHJpdi0+ZGV2KTsKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CQorCW5ldGlmX3J4KHNrYik7CisJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gMTIgKyBtc2R1X3NpemU7CisJcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOworfQorCisvKiBUZXN0IHRvIHNlZSBpZiB0aGUgcGFja2V0IGluIGNhcmQgbWVtb3J5IGF0IHBhY2tldF9sb2MgaGFzIGEgdmFsaWQgQ1JDCisgICBJdCBkb2Vzbid0IG1hdHRlciB0aGF0IHRoaXMgaXMgc2xvdzogaXQgaXMgb25seSB1c2VkIHRvIHByb2JsZSB0aGUgZmlyc3QgZmV3IHBhY2tldHMuICovCitzdGF0aWMgaW50IHByb2JlX2NyYyhzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IHBhY2tldF9sb2MsIHUxNiBtc2R1X3NpemUpCit7CisJaW50IGkgPSBtc2R1X3NpemUgLSA0OworCXUzMiBuZXRjcmMsIGNyYyA9IDB4ZmZmZmZmZmY7CisKKwlpZiAobXNkdV9zaXplIDwgNCkKKwkJcmV0dXJuIDA7CisKKwlhdG1lbF9jb3B5X3RvX2hvc3QocHJpdi0+ZGV2LCAodm9pZCAqKSZuZXRjcmMsIHBhY2tldF9sb2MgKyBpLCA0KTsKKwkKKwlhdG1lbF93cml0ZUFSKHByaXYtPmRldiwgcGFja2V0X2xvYyk7CisJd2hpbGUgKGktLSkgeworCQl1OCBvY3RldCA9IGF0bWVsX3JlYWQ4KHByaXYtPmRldiwgRFIpOworCQljcmMgPSBjcmMzMl9sZShjcmMsICZvY3RldCwgMSk7CisJfQorCisJcmV0dXJuIChjcmMgXiAweGZmZmZmZmZmKSA9PSBuZXRjcmM7Cit9CisKK3N0YXRpYyB2b2lkIGZyYWdfcnhfcGF0aChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IGllZWU4MDJfMTFfaGRyICpoZWFkZXIsIAorCQkJIHUxNiBtc2R1X3NpemUsIHUxNiByeF9wYWNrZXRfbG9jLCB1MzIgY3JjLCB1MTYgc2VxX25vLCB1OCBmcmFnX25vLCBpbnQgbW9yZV9mcmFncykKK3sKKwl1OCBtYWM0WzZdOyAKKwl1OCBzb3VyY2VbNl07CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlmIChsZTE2X3RvX2NwdShoZWFkZXItPmZyYW1lX2N0bCkgJiBJRUVFODAyXzExX0ZDVExfRlJPTURTKSAKKwkJbWVtY3B5KHNvdXJjZSwgaGVhZGVyLT5hZGRyMywgNik7CisJZWxzZQorCQltZW1jcHkoc291cmNlLCBoZWFkZXItPmFkZHIyLCA2KTsgCisJCisJcnhfcGFja2V0X2xvYyArPSAyNDsgLyogc2tpcCBoZWFkZXIgKi8KKwkKKwlpZiAocHJpdi0+ZG9fcnhfY3JjKQorCQltc2R1X3NpemUgLT0gNDsKKworCWlmIChmcmFnX25vID09IDApIHsgLyogZmlyc3QgZnJhZ21lbnQgKi8KKwkJYXRtZWxfY29weV90b19ob3N0KHByaXYtPmRldiwgbWFjNCwgcnhfcGFja2V0X2xvYywgNik7CisJCW1zZHVfc2l6ZSAtPSA2OworCQlyeF9wYWNrZXRfbG9jICs9IDY7CisKKwkJaWYgKHByaXYtPmRvX3J4X2NyYykgCisJCQljcmMgPSBjcmMzMl9sZShjcmMsIG1hYzQsIDYpOworCSAgICAgICAKKwkJcHJpdi0+ZnJhZ19zZXEgPSBzZXFfbm87CisJCXByaXYtPmZyYWdfbm8gPSAxOworCQlwcml2LT5mcmFnX2xlbiA9IG1zZHVfc2l6ZTsKKwkJbWVtY3B5KHByaXYtPmZyYWdfc291cmNlLCBzb3VyY2UsIDYpOyAKKwkJbWVtY3B5KCZwcml2LT5yeF9idWZbNl0sIHNvdXJjZSwgNik7CisJCW1lbWNweShwcml2LT5yeF9idWYsIGhlYWRlci0+YWRkcjEsIDYpOworCQkJCQorCQlhdG1lbF9jb3B5X3RvX2hvc3QocHJpdi0+ZGV2LCAmcHJpdi0+cnhfYnVmWzEyXSwgcnhfcGFja2V0X2xvYywgbXNkdV9zaXplKTsKKworCQlpZiAocHJpdi0+ZG9fcnhfY3JjKSB7CisJCQl1MzIgbmV0Y3JjOworCQkJY3JjID0gY3JjMzJfbGUoY3JjLCAmcHJpdi0+cnhfYnVmWzEyXSwgbXNkdV9zaXplKTsKKwkJCWF0bWVsX2NvcHlfdG9faG9zdChwcml2LT5kZXYsICh2b2lkICopJm5ldGNyYywgcnhfcGFja2V0X2xvYyArIG1zZHVfc2l6ZSwgNCk7CisJCQlpZiAoKGNyYyBeIDB4ZmZmZmZmZmYpICE9IG5ldGNyYykgeworCQkJCXByaXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQltZW1zZXQocHJpdi0+ZnJhZ19zb3VyY2UsIDB4ZmYsIDYpOworCQkJfQorCQl9CisJCQorCX0gZWxzZSBpZiAocHJpdi0+ZnJhZ19ubyA9PSBmcmFnX25vICYmCisJCSAgIHByaXYtPmZyYWdfc2VxID09IHNlcV9ubyAmJgorCQkgICBtZW1jbXAocHJpdi0+ZnJhZ19zb3VyY2UsIHNvdXJjZSwgNikgPT0gMCkgeworCQkKKwkJYXRtZWxfY29weV90b19ob3N0KHByaXYtPmRldiwgJnByaXYtPnJ4X2J1ZlsxMiArIHByaXYtPmZyYWdfbGVuXSwgCisJCQkJICAgcnhfcGFja2V0X2xvYywgbXNkdV9zaXplKTsKKwkJaWYgKHByaXYtPmRvX3J4X2NyYykgeworCQkJdTMyIG5ldGNyYzsKKwkJCWNyYyA9IGNyYzMyX2xlKGNyYywgCisJCQkJICAgICAgICZwcml2LT5yeF9idWZbMTIgKyBwcml2LT5mcmFnX2xlbl0sIAorCQkJCSAgICAgICBtc2R1X3NpemUpOworCQkJYXRtZWxfY29weV90b19ob3N0KHByaXYtPmRldiwgKHZvaWQgKikmbmV0Y3JjLCByeF9wYWNrZXRfbG9jICsgbXNkdV9zaXplLCA0KTsKKwkJCWlmICgoY3JjIF4gMHhmZmZmZmZmZikgIT0gbmV0Y3JjKSB7CisJCQkJcHJpdi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCW1lbXNldChwcml2LT5mcmFnX3NvdXJjZSwgMHhmZiwgNik7CisJCQkJbW9yZV9mcmFncyA9IDE7IC8qIGRvbid0IHNlbmQgYnJva2VuIGFzc2VtYmx5ICovCisJCQl9CisJCX0KKwkJCisJCXByaXYtPmZyYWdfbGVuICs9IG1zZHVfc2l6ZTsKKwkJcHJpdi0+ZnJhZ19ubysrOworCisJCWlmICghbW9yZV9mcmFncykgeyAvKiBsYXN0IG9uZSAqLworCQkJbWVtc2V0KHByaXYtPmZyYWdfc291cmNlLCAweGZmLCA2KTsKKwkJCWlmICghKHNrYiA9IGRldl9hbGxvY19za2IocHJpdi0+ZnJhZ19sZW4gKyAxNCkpKSB7CisJCQkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJfSBlbHNlIHsKKwkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOworCQkJCW1lbWNweShza2JfcHV0KHNrYiwgcHJpdi0+ZnJhZ19sZW4gKyAxMiksIAorCQkJCSAgICAgICBwcml2LT5yeF9idWYsCisJCQkJICAgICAgIHByaXYtPmZyYWdfbGVuICsgMTIpOworCQkJCXByaXYtPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQkJc2tiLT5kZXYgPSBwcml2LT5kZXY7CisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgcHJpdi0+ZGV2KTsKKwkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CQorCQkJCW5ldGlmX3J4KHNrYik7CisJCQkJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gcHJpdi0+ZnJhZ19sZW4gKyAxMjsKKwkJCQlwcml2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQl9CisJCX0KKwkJCisJfSBlbHNlCisJCXByaXYtPndzdGF0cy5kaXNjYXJkLmZyYWdtZW50Kys7Cit9CisJCQorc3RhdGljIHZvaWQgcnhfZG9uZV9pcnEoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYpCit7CisJaW50IGk7CisJc3RydWN0IGllZWU4MDJfMTFfaGRyIGhlYWRlcjsKKwkKKwlmb3IgKGkgPSAwOyAKKwkgICAgIGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX3J4KHByaXYsIFJYX0RFU0NfRkxBR1NfT0ZGU0VULCBwcml2LT5yeF9kZXNjX2hlYWQpKSA9PSBSWF9ERVNDX0ZMQUdfVkFMSUQgJiYKKwkJICAgICBpIDwgcHJpdi0+aG9zdF9pbmZvLnJ4X2Rlc2NfY291bnQ7CisJICAgICBpKyspIHsKKwkJCQkKKwkJdTE2IG1zZHVfc2l6ZSwgcnhfcGFja2V0X2xvYywgZnJhbWVfY3RsLCBzZXFfY29udHJvbDsKKwkJdTggc3RhdHVzID0gYXRtZWxfcm1lbTgocHJpdiwgYXRtZWxfcngocHJpdiwgUlhfREVTQ19TVEFUVVNfT0ZGU0VULCBwcml2LT5yeF9kZXNjX2hlYWQpKTsKKwkJdTMyIGNyYyA9IDB4ZmZmZmZmZmY7CisJCQorCQlpZiAoc3RhdHVzICE9IFJYX1NUQVRVU19TVUNDRVNTKSB7CisJCQlpZiAoc3RhdHVzID09IDB4YzEpIC8qIGRldGVybWluZWQgYnkgZXhwZXJpbWVudCAqLworCQkJCXByaXYtPndzdGF0cy5kaXNjYXJkLm53aWQrKzsKKwkJCWVsc2UKKwkJCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsgCisJCQlnb3RvIG5leHQ7CisJCX0KKworCQltc2R1X3NpemUgPSBhdG1lbF9ybWVtMTYocHJpdiwgYXRtZWxfcngocHJpdiwgUlhfREVTQ19NU0RVX1NJWkVfT0ZGU0VULCBwcml2LT5yeF9kZXNjX2hlYWQpKTsKKwkJcnhfcGFja2V0X2xvYyA9IGF0bWVsX3JtZW0xNihwcml2LCBhdG1lbF9yeChwcml2LCBSWF9ERVNDX01TRFVfUE9TX09GRlNFVCwgcHJpdi0+cnhfZGVzY19oZWFkKSk7CisJCQorCQlpZiAobXNkdV9zaXplIDwgMzApIHsKKwkJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOyAKKwkJCWdvdG8gbmV4dDsKKwkJfQorCQkKKwkJLyogR2V0IGhlYWRlciBhcyBmYXIgYXMgZW5kIG9mIHNlcV9jdGwgKi8KKwkJYXRtZWxfY29weV90b19ob3N0KHByaXYtPmRldiwgKGNoYXIgKikmaGVhZGVyLCByeF9wYWNrZXRfbG9jLCAyNCk7CisJCWZyYW1lX2N0bCA9IGxlMTZfdG9fY3B1KGhlYWRlci5mcmFtZV9jdGwpOworCQlzZXFfY29udHJvbCA9IGxlMTZfdG9fY3B1KGhlYWRlci5zZXFfY3RsKTsKKworCQkvKiBwcm9iZSBmb3IgQ1JDIHVzZSBoZXJlIGlmIG5lZWRlZCAgb25jZSBmaXZlIHBhY2tldHMgaGF2ZSBhcnJpdmVkIHdpdGgKKwkJICAgdGhlIHNhbWUgY3JjIHN0YXR1cywgd2UgYXNzdW1lIHdlIGtub3cgd2hhdCdzIGhhcHBlbmluZyBhbmQgc3RvcCBwcm9iaW5nICovCisJCWlmIChwcml2LT5wcm9iZV9jcmMpIHsKKwkJCWlmICghcHJpdi0+d2VwX2lzX29uIHx8ICEoZnJhbWVfY3RsICYgSUVFRTgwMl8xMV9GQ1RMX1dFUCkpIHsKKwkJCQlwcml2LT5kb19yeF9jcmMgPSBwcm9iZV9jcmMocHJpdiwgcnhfcGFja2V0X2xvYywgbXNkdV9zaXplKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpdi0+ZG9fcnhfY3JjID0gcHJvYmVfY3JjKHByaXYsIHJ4X3BhY2tldF9sb2MgKyAyNCwgbXNkdV9zaXplIC0gMjQpOworCQkJfQorCQkJaWYgKHByaXYtPmRvX3J4X2NyYykgeworCQkJCWlmIChwcml2LT5jcmNfb2tfY250KysgPiA1KQorCQkJCQlwcml2LT5wcm9iZV9jcmMgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlpZiAocHJpdi0+Y3JjX2tvX2NudCsrID4gNSkKKwkJCQkJcHJpdi0+cHJvYmVfY3JjID0gMDsKKwkJCX0KKwkJfQorCQkgICAgCisJCS8qIGRvbid0IENSQyBoZWFkZXIgd2hlbiBXRVAgaW4gdXNlICovCisJCWlmIChwcml2LT5kb19yeF9jcmMgJiYgKCFwcml2LT53ZXBfaXNfb24gfHwgIShmcmFtZV9jdGwgJiBJRUVFODAyXzExX0ZDVExfV0VQKSkpIHsKKwkJCWNyYyA9IGNyYzMyX2xlKDB4ZmZmZmZmZmYsICh1bnNpZ25lZCBjaGFyICopJmhlYWRlciwgMjQpOworCQl9CisJCW1zZHVfc2l6ZSAtPSAyNDsgLyogaGVhZGVyICovCisKKwkJaWYgKChmcmFtZV9jdGwgJiBJRUVFODAyXzExX0ZDVExfRlRZUEUpID09IElFRUU4MDJfMTFfRlRZUEVfREFUQSkgeyAKKwkJCQorCQkJaW50IG1vcmVfZnJhZ21lbnRzID0gZnJhbWVfY3RsICYgSUVFRTgwMl8xMV9GQ1RMX01PUkVGUkFHUzsKKwkJCXU4IHBhY2tldF9mcmFnbWVudF9ubyA9IHNlcV9jb250cm9sICYgSUVFRTgwMl8xMV9TQ1RMX0ZSQUc7CisJCQl1MTYgcGFja2V0X3NlcXVlbmNlX25vID0gKHNlcV9jb250cm9sICYgSUVFRTgwMl8xMV9TQ1RMX1NFUSkgPj4gNDsKKwkJCQorCQkJaWYgKCFtb3JlX2ZyYWdtZW50cyAmJiBwYWNrZXRfZnJhZ21lbnRfbm8gPT0gMCApIHsKKwkJCQlmYXN0X3J4X3BhdGgocHJpdiwgJmhlYWRlciwgbXNkdV9zaXplLCByeF9wYWNrZXRfbG9jLCBjcmMpOworCQkJfSBlbHNlIHsKKwkJCQlmcmFnX3J4X3BhdGgocHJpdiwgJmhlYWRlciwgbXNkdV9zaXplLCByeF9wYWNrZXRfbG9jLCBjcmMsCisJCQkJCSAgICAgcGFja2V0X3NlcXVlbmNlX25vLCBwYWNrZXRfZnJhZ21lbnRfbm8sIG1vcmVfZnJhZ21lbnRzKTsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKChmcmFtZV9jdGwgJiBJRUVFODAyXzExX0ZDVExfRlRZUEUpID09IElFRUU4MDJfMTFfRlRZUEVfTUdNVCkgeworCQkJLyogY29weSByZXN0IG9mIHBhY2tldCBpbnRvIGJ1ZmZlciAqLworCQkJYXRtZWxfY29weV90b19ob3N0KHByaXYtPmRldiwgKHVuc2lnbmVkIGNoYXIgKikmcHJpdi0+cnhfYnVmLCByeF9wYWNrZXRfbG9jICsgMjQsIG1zZHVfc2l6ZSk7CisJCQkKKwkJCS8qIHdlIHVzZSB0aGUgc2FtZSBidWZmZXIgZm9yIGZyYWcgcmVhc3NlbWJseSBhbmQgY29udHJvbCBwYWNrZXRzICovCisJCQltZW1zZXQocHJpdi0+ZnJhZ19zb3VyY2UsIDB4ZmYsIDYpOworCQkJCisJCQlpZiAocHJpdi0+ZG9fcnhfY3JjKSB7CisJCQkJLyogbGFzdCA0IG9jdGV0cyBpcyBjcmMgKi8KKwkJCQltc2R1X3NpemUgLT0gNDsKKwkJCQljcmMgPSBjcmMzMl9sZShjcmMsICh1bnNpZ25lZCBjaGFyICopJnByaXYtPnJ4X2J1ZiwgbXNkdV9zaXplKTsKKwkJCQlpZiAoKGNyYyBeIDB4ZmZmZmZmZmYpICE9ICgqKCh1MzIgKikmcHJpdi0+cnhfYnVmW21zZHVfc2l6ZV0pKSkgeworCQkJCQlwcml2LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisKKwkJCWF0bWVsX21hbmFnZW1lbnRfZnJhbWUocHJpdiwgJmhlYWRlciwgbXNkdV9zaXplLAorCQkJCQkgICAgICAgYXRtZWxfcm1lbTgocHJpdiwgYXRtZWxfcngocHJpdiwgUlhfREVTQ19SU1NJX09GRlNFVCwgcHJpdi0+cnhfZGVzY19oZWFkKSkpOworCQl9IAorCisJbmV4dDoKKwkJLyogcmVsZWFzZSBkZXNjcmlwdG9yICovCisJCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX3J4KHByaXYsIFJYX0RFU0NfRkxBR1NfT0ZGU0VULCBwcml2LT5yeF9kZXNjX2hlYWQpLCBSWF9ERVNDX0ZMQUdfQ09OU1VNRUQpOyAgCisJCQorCQlpZiAocHJpdi0+cnhfZGVzY19oZWFkIDwgKHByaXYtPmhvc3RfaW5mby5yeF9kZXNjX2NvdW50IC0gMSkpCisJCQlwcml2LT5yeF9kZXNjX2hlYWQrKzsJCQkJCQorCQllbHNlCisJCQlwcml2LT5yeF9kZXNjX2hlYWQgPSAwOworCX0KK30JCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzZXJ2aWNlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1OCBpc3I7CisJaW50IGkgPSAtMTsKKwlzdGF0aWMgdTggaXJxX29yZGVyW10gPSB7IAorCQlJU1JfT1VUX09GX1JBTkdFLAorCQlJU1JfUnhDT01QTEVURSwKKwkJSVNSX1R4Q09NUExFVEUsCisJCUlTUl9SeEZSQU1FTE9TVCwKKwkJSVNSX0ZBVEFMX0VSUk9SLAorCQlJU1JfQ09NTUFORF9DT01QTEVURSwKKwkJSVNSX0lCU1NfTUVSR0UsCisJCUlTUl9HRU5FUklDX0lSUQorCX07CisJCQorCisJaWYgKHByaXYtPmNhcmQgJiYgcHJpdi0+cHJlc2VudF9jYWxsYmFjayAmJiAKKwkgICAgISgqcHJpdi0+cHJlc2VudF9jYWxsYmFjaykocHJpdi0+Y2FyZCkpCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCS8qIEluIHRoaXMgc3RhdGUgdXBwZXItbGV2ZWwgY29kZSBhc3N1bWVzIGl0IGNhbiBtZXNzIHdpdGgKKwkgICB0aGUgY2FyZCB1bmhhbXBlcmVkIGJ5IGludGVycnVwdHMgd2hpY2ggbWF5IGNoYW5nZSByZWdpc3RlciBzdGF0ZS4KKwkgICBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggdGhlIGNhcmQgc2hvdWxkbid0IGdlbmVyYXRlIGludGVycnVwdHMKKwkgICB0aGUgaW50dXJydXB0IGxpbmUgbWF5IGJlIHNoYXJlZC4gVGhpcyBhbGxvd3MgY2FyZCBzZXR1cCAKKwkgICB0byBnbyBvbiB3aXRob3V0IGRpc2FibGluZyBpbnRlcnJ1cHRzIGZvciBhIGxvbmcgdGltZS4gKi8KKwlpZiAocHJpdi0+c3RhdGlvbl9zdGF0ZSA9PSBTVEFUSU9OX1NUQVRFX0RPV04pCisJCXJldHVybiBJUlFfTk9ORTsKKyAgICAgCQorCWF0bWVsX2NsZWFyX2djcihkZXYsIEdDUl9FTklOVCk7IC8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCisJd2hpbGUgKDEpIHsKKwkJaWYgKCFhdG1lbF9sb2NrX21hYyhwcml2KSkgeworCQkJLyogZmFpbGVkIHRvIGNvbnRhY3QgY2FyZCAqLworCQkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBmYWlsZWQgdG8gY29udGFjdCBNQUMuXG4iLCBkZXYtPm5hbWUpOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisJCQorCQlpc3IgPSBhdG1lbF9ybWVtOChwcml2LCBhdG1lbF9oaShwcml2LCBJRkFDRV9JTlRfU1RBVFVTX09GRlNFVCkpOworCQlhdG1lbF93bWVtOChwcml2LCBhdG1lbF9oaShwcml2LCBJRkFDRV9MT0NLT1VUX01BQ19PRkZTRVQpLCAwKTsKKwkJCisJCWlmICghaXNyKSB7CisJCQlhdG1lbF9zZXRfZ2NyKGRldiwgR0NSX0VOSU5UKTsgLyogZW5hYmxlIGludGVycnVwdHMgKi8KKwkJCXJldHVybiBpID09IC0xID8gSVJRX05PTkUgOiBJUlFfSEFORExFRDsKKwkJfQorCQkKKwkJYXRtZWxfc2V0X2djcihkZXYsIEdDUl9BQ0tJTlQpOyAvKiBhY2tub3dsZWRnZSBpbnRlcnJ1cHQgKi8KKwkJCisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoaXJxX29yZGVyKS9zaXplb2YodTgpOyBpKyspCisJCQlpZiAoaXNyICYgaXJxX29yZGVyW2ldKQorCQkJCWJyZWFrOworCQkKKwkJaWYgKCFhdG1lbF9sb2NrX21hYyhwcml2KSkgeworCQkJLyogZmFpbGVkIHRvIGNvbnRhY3QgY2FyZCAqLworCQkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBmYWlsZWQgdG8gY29udGFjdCBNQUMuXG4iLCBkZXYtPm5hbWUpOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisJCQorCQlpc3IgPSBhdG1lbF9ybWVtOChwcml2LCBhdG1lbF9oaShwcml2LCBJRkFDRV9JTlRfU1RBVFVTX09GRlNFVCkpOworCQlpc3IgXj0gaXJxX29yZGVyW2ldOworCQlhdG1lbF93bWVtOChwcml2LCBhdG1lbF9oaShwcml2LCBJRkFDRV9JTlRfU1RBVFVTX09GRlNFVCksIGlzcik7CisJCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX2hpKHByaXYsIElGQUNFX0xPQ0tPVVRfTUFDX09GRlNFVCksIDApOworCQkKKwkJc3dpdGNoIChpcnFfb3JkZXJbaV0pIHsKKwkJCQorCQljYXNlIElTUl9PVVRfT0ZfUkFOR0U6IAorCQkJaWYgKHByaXYtPm9wZXJhdGluZ19tb2RlID09IElXX01PREVfSU5GUkEgJiYgCisJCQkgICAgcHJpdi0+c3RhdGlvbl9zdGF0ZSA9PSBTVEFUSU9OX1NUQVRFX1JFQURZKSB7CisJCQkJcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkID0gMDsKKwkJCQlhdG1lbF9zY2FuKHByaXYsIDEpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJU1JfUnhGUkFNRUxPU1Q6CisJCQlwcml2LT53c3RhdHMuZGlzY2FyZC5taXNjKys7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBJU1JfUnhDT01QTEVURToKKwkJCXJ4X2RvbmVfaXJxKHByaXYpOyAKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgSVNSX1R4Q09NUExFVEU6CisJCQl0eF9kb25lX2lycShwcml2KTsgCisJCQlicmVhazsKKwkJCQorCQljYXNlIElTUl9GQVRBTF9FUlJPUjoKKwkJCXByaW50ayhLRVJOX0FMRVJUICIlczogKioqIEZBVEFMIGVycm9yIGludGVycnVwdCAqKipcbiIsIGRldi0+bmFtZSk7CisJCQlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX01HTVRfRVJST1IpOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBJU1JfQ09NTUFORF9DT01QTEVURTogCisJCQlhdG1lbF9jb21tYW5kX2lycShwcml2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVNSX0lCU1NfTUVSR0U6CisJCQlhdG1lbF9nZXRfbWliKHByaXYsIE1hY19NZ210X01pYl9UeXBlLCBNQUNfTUdNVF9NSUJfQ1VSX0JTU0lEX1BPUywgCisJCQkJICAgICAgcHJpdi0+Q3VycmVudEJTU0lELCA2KTsKKwkJCS8qIFRoZSBXUEEgc3R1ZmYgY2FyZXMgYWJvdXQgdGhlIGN1cnJlbnQgQVAgYWRkcmVzcyAqLworCQkJaWYgKHByaXYtPnVzZV93cGEpCisJCQkJYnVpbGRfd3BhX21pYihwcml2KTsKKwkJCWJyZWFrOworCQljYXNlIElTUl9HRU5FUklDX0lSUToKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBHZW5lcmljX2lycSByZWNlaXZlZC5cbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCX0JCit9CisKKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICphdG1lbF9nZXRfc3RhdHMgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXJldHVybiAmcHJpdi0+c3RhdHM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqYXRtZWxfZ2V0X3dpcmVsZXNzX3N0YXRzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIHVwZGF0ZSB0aGUgbGluayBxdWFsaXR5IGhlcmUgaW4gY2FzZSB3ZSBhcmUgc2VlaW5nIG5vIGJlYWNvbnMgCisJICAgYXQgYWxsIHRvIGRyaXZlIHRoZSBwcm9jZXNzICovCisJYXRtZWxfc21vb3RoX3F1YWwocHJpdik7CisJCisJcHJpdi0+d3N0YXRzLnN0YXR1cyA9IHByaXYtPnN0YXRpb25fc3RhdGU7CisKKwlpZiAocHJpdi0+b3BlcmF0aW5nX21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgeworCQlpZiAocHJpdi0+c3RhdGlvbl9zdGF0ZSAhPSBTVEFUSU9OX1NUQVRFX1JFQURZKSB7CisJCQlwcml2LT53c3RhdHMucXVhbC5xdWFsID0gMDsKKwkJCXByaXYtPndzdGF0cy5xdWFsLmxldmVsID0gMDsKKwkJCXByaXYtPndzdGF0cy5xdWFsLnVwZGF0ZWQgPSAoSVdfUVVBTF9RVUFMX0lOVkFMSUQKKwkJCQkJfCBJV19RVUFMX0xFVkVMX0lOVkFMSUQpOworCQl9CisJCXByaXYtPndzdGF0cy5xdWFsLm5vaXNlID0gMDsKKwkJcHJpdi0+d3N0YXRzLnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX05PSVNFX0lOVkFMSUQ7CisJfSBlbHNlIHsKKwkJLyogUXVhbGl0eSBsZXZlbHMgY2Fubm90IGJlIGRldGVybWluZWQgaW4gYWQtaG9jIG1vZGUsCisJCSAgIGJlY2F1c2Ugd2UgY2FuICdoZWFyJyBtb3JlIHRoYXQgb25lIHJlbW90ZSBzdGF0aW9uLiAqLworCQlwcml2LT53c3RhdHMucXVhbC5xdWFsID0gMDsKKwkJcHJpdi0+d3N0YXRzLnF1YWwubGV2ZWwJPSAwOworCQlwcml2LT53c3RhdHMucXVhbC5ub2lzZQk9IDA7CisJCXByaXYtPndzdGF0cy5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX1FVQUxfSU5WQUxJRAorCQkJCQl8IElXX1FVQUxfTEVWRUxfSU5WQUxJRAorCQkJCQl8IElXX1FVQUxfTk9JU0VfSU5WQUxJRDsKKwkJcHJpdi0+d3N0YXRzLm1pc3MuYmVhY29uID0gMDsKKwl9CisJCisJcmV0dXJuICgmcHJpdi0+d3N0YXRzKTsKK30KKworc3RhdGljIGludCBhdG1lbF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworICAgICAgICBpZiAoKG5ld19tdHUgPCA2OCkgfHwgKG5ld19tdHUgPiAyMzEyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgZGV2LT5tdHUgPSBuZXdfbXR1OworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOworICAgICAgICAKKyAgICAgICAgbWVtY3B5IChkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKKwlyZXR1cm4gYXRtZWxfb3BlbihkZXYpOworfQorCitFWFBPUlRfU1lNQk9MKGF0bWVsX29wZW4pOworCitpbnQgYXRtZWxfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGksIGNoYW5uZWw7CisKKwkvKiBhbnkgc2NoZWR1bGVkIHRpbWVyIGlzIG5vIGxvbmdlciBuZWVkZWQgYW5kIG1pZ2h0IHNjcmV3IHRoaW5ncyB1cC4uICovCisJZGVsX3RpbWVyX3N5bmMoJnByaXYtPm1hbmFnZW1lbnRfdGltZXIpOworCQorCS8qIEludGVycnVwdHMgd2lsbCBub3QgdG91Y2ggdGhlIGNhcmQgb25jZSBpbiB0aGlzIHN0YXRlLi4uICovCisJcHJpdi0+c3RhdGlvbl9zdGF0ZSA9IFNUQVRJT05fU1RBVEVfRE9XTjsKKworCWlmIChwcml2LT5uZXdfU1NJRF9zaXplKSB7CisJCW1lbWNweShwcml2LT5TU0lELCBwcml2LT5uZXdfU1NJRCwgcHJpdi0+bmV3X1NTSURfc2l6ZSk7CisJCXByaXYtPlNTSURfc2l6ZSA9IHByaXYtPm5ld19TU0lEX3NpemU7CisJCXByaXYtPm5ld19TU0lEX3NpemUgPSAwOworCX0KKwlwcml2LT5CU1NfbGlzdF9lbnRyaWVzID0gMDsKKworCXByaXYtPkF1dGhlbnRpY2F0aW9uUmVxdWVzdFJldHJ5Q250ID0gMDsKKwlwcml2LT5Bc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCA9IDA7CisJcHJpdi0+UmVBc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCA9IDA7CisJcHJpdi0+Q3VycmVudEF1dGhlbnRUcmFuc2FjdGlvblNlcU51bSA9IDB4MDAwMTsKKwlwcml2LT5FeHBlY3RlZEF1dGhlbnRUcmFuc2FjdGlvblNlcU51bSA9IDB4MDAwMjsKKworCXByaXYtPnNpdGVfc3VydmV5X3N0YXRlID0gU0lURV9TVVJWRVlfSURMRTsKKwlwcml2LT5zdGF0aW9uX2lzX2Fzc29jaWF0ZWQgPSAwOworCisJaWYgKCFyZXNldF9hdG1lbF9jYXJkKGRldikpIAorCQlyZXR1cm4gLUVBR0FJTjsKKworCWlmIChwcml2LT5jb25maWdfcmVnX2RvbWFpbikgeworCQlwcml2LT5yZWdfZG9tYWluID0gcHJpdi0+Y29uZmlnX3JlZ19kb21haW47CisJCWF0bWVsX3NldF9taWI4KHByaXYsIFBoeV9NaWJfVHlwZSwgUEhZX01JQl9SRUdfRE9NQUlOX1BPUywgcHJpdi0+cmVnX2RvbWFpbik7CisJfSBlbHNlIHsKKwkJcHJpdi0+cmVnX2RvbWFpbiA9IGF0bWVsX2dldF9taWI4KHByaXYsIFBoeV9NaWJfVHlwZSwgUEhZX01JQl9SRUdfRE9NQUlOX1BPUyk7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoY2hhbm5lbF90YWJsZSkvc2l6ZW9mKGNoYW5uZWxfdGFibGVbMF0pOyBpKyspCisJCQlpZiAocHJpdi0+cmVnX2RvbWFpbiA9PSBjaGFubmVsX3RhYmxlW2ldLnJlZ19kb21haW4pCisJCQkJYnJlYWs7CisJCWlmIChpID09IHNpemVvZihjaGFubmVsX3RhYmxlKS9zaXplb2YoY2hhbm5lbF90YWJsZVswXSkpIHsKKwkJCXByaXYtPnJlZ19kb21haW4gPSBSRUdfRE9NQUlOX01LSzE7CisJCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IGZhaWxlZCB0byBnZXQgcmVndWxhdG9yeSBkb21haW46IGFzc3VtaW5nIE1LSzEuXG4iLCBkZXYtPm5hbWUpOworCQl9IAorCX0KKwkKKwlpZiAoKGNoYW5uZWwgPSBhdG1lbF92YWxpZGF0ZV9jaGFubmVsKHByaXYsIHByaXYtPmNoYW5uZWwpKSkKKwkJcHJpdi0+Y2hhbm5lbCA9IGNoYW5uZWw7CisKKwkvKiB0aGlzIG1vdmVzIHN0YXRpb25fc3RhdGUgb24uLi4uICovIAorCWF0bWVsX3NjYW4ocHJpdiwgMSk7CQorCisJYXRtZWxfc2V0X2djcihwcml2LT5kZXYsIEdDUl9FTklOVCk7IC8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfY2xvc2UgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCQkKKwlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX0RPV04pOworCQorCWlmIChwcml2LT5idXNfdHlwZSA9PSBCVVNfVFlQRV9QQ0NBUkQpIAorCQlhdG1lbF93cml0ZTE2KGRldiwgR0NSLCAweDAwNjApOworCWF0bWVsX3dyaXRlMTYoZGV2LCBHQ1IsIDB4MDA0MCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfdmFsaWRhdGVfY2hhbm5lbChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IGNoYW5uZWwpCit7CisJLyogY2hlY2sgdGhhdCBjaGFubmVsIGlzIE9LLCBpZiBzbyByZXR1cm4gemVybywKKwkgICBlbHNlIHJldHVybiBzdWl0YWJsZSBkZWZhdWx0IGNoYW5uZWwgKi8KKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoY2hhbm5lbF90YWJsZSkvc2l6ZW9mKGNoYW5uZWxfdGFibGVbMF0pOyBpKyspCisJCWlmIChwcml2LT5yZWdfZG9tYWluID09IGNoYW5uZWxfdGFibGVbaV0ucmVnX2RvbWFpbikgeworCQkJaWYgKGNoYW5uZWwgPj0gY2hhbm5lbF90YWJsZVtpXS5taW4gJiYKKwkJCSAgICBjaGFubmVsIDw9IGNoYW5uZWxfdGFibGVbaV0ubWF4KQorCQkJCXJldHVybiAwOworCQkJZWxzZQorCQkJCXJldHVybiBjaGFubmVsX3RhYmxlW2ldLm1pbjsKKwkJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX3Byb2Nfb3V0cHV0IChjaGFyICpidWYsIHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KQoreworCWludCBpOworCWNoYXIgKnAgPSBidWY7CisJY2hhciAqcywgKnIsICpjOworCQorCXAgKz0gc3ByaW50ZihwLCAiRHJpdmVyIHZlcnNpb246XHRcdCVkLiVkXG4iLCBEUklWRVJfTUFKT1IsIERSSVZFUl9NSU5PUik7CisJCisJaWYgKHByaXYtPnN0YXRpb25fc3RhdGUgIT0gU1RBVElPTl9TVEFURV9ET1dOKSB7CisJCXAgKz0gc3ByaW50ZihwLCAiRmlybXdhcmUgdmVyc2lvbjpcdCVkLiVkIGJ1aWxkICVkXG5GaXJtd2FyZSBsb2NhdGlvbjpcdCIsIAorCQkJICAgICBwcml2LT5ob3N0X2luZm8ubWFqb3JfdmVyc2lvbiwKKwkJCSAgICAgcHJpdi0+aG9zdF9pbmZvLm1pbm9yX3ZlcnNpb24sCisJCQkgICAgIHByaXYtPmhvc3RfaW5mby5idWlsZF92ZXJzaW9uKTsKKwkJCisJCWlmIChwcml2LT5jYXJkX3R5cGUgIT0gQ0FSRF9UWVBFX0VFUFJPTSkgCisJCQlwICs9IHNwcmludGYocCwgIm9uIGNhcmRcbiIpOworCQllbHNlIGlmIChwcml2LT5maXJtd2FyZSkgCisJCQlwICs9IHNwcmludGYocCwgIiVzIGxvYWRlZCBieSBob3N0XG4iLCBwcml2LT5maXJtd2FyZV9pZCk7CisJCWVsc2UKKwkJCXAgKz0gc3ByaW50ZihwLCAiJXMgbG9hZGVkIGJ5IGhvdHBsdWdcbiIsIHByaXYtPmZpcm13YXJlX2lkKTsKKwkJCisJCXN3aXRjaChwcml2LT5jYXJkX3R5cGUpIHsKKwkJY2FzZSBDQVJEX1RZUEVfUEFSQUxMRUxfRkxBU0g6IGMgPSAiUGFyYWxsZWwgZmxhc2giOyBicmVhazsKKwkJY2FzZSBDQVJEX1RZUEVfU1BJX0ZMQVNIOiBjID0gIlNQSSBmbGFzaFxuIjsgYnJlYWs7CisJCWNhc2UgQ0FSRF9UWVBFX0VFUFJPTTogYyA9ICJFRVBST00iOyBicmVhazsKKwkJZGVmYXVsdDogYyA9ICI8dW5rbm93bj4iOworCQl9CisKKwkJCisJCXIgPSAiPHVua25vd24+IjsKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihjaGFubmVsX3RhYmxlKS9zaXplb2YoY2hhbm5lbF90YWJsZVswXSk7IGkrKykKKwkJCWlmIChwcml2LT5yZWdfZG9tYWluID09IGNoYW5uZWxfdGFibGVbaV0ucmVnX2RvbWFpbikKKwkJCQlyID0gY2hhbm5lbF90YWJsZVtpXS5uYW1lOworCQkKKwkJcCArPSBzcHJpbnRmKHAsICJNQUMgbWVtb3J5IHR5cGU6XHQlc1xuIiwgYyk7CisJCXAgKz0gc3ByaW50ZihwLCAiUmVndWxhdG9yeSBkb21haW46XHQlc1xuIiwgcik7CisJCXAgKz0gc3ByaW50ZihwLCAiSG9zdCBDUkMgY2hlY2tpbmc6XHQlc1xuIiwgCisJCQkgICAgIHByaXYtPmRvX3J4X2NyYyA/ICJPbiIgOiAiT2ZmIik7CisJCXAgKz0gc3ByaW50ZihwLCAiV1BBLWNhcGFibGUgZmlybXdhcmU6XHQlc1xuIiwKKwkJCSAgICAgcHJpdi0+dXNlX3dwYSA/ICJZZXMiIDogIk5vIik7CisJfQorCQorCXN3aXRjaChwcml2LT5zdGF0aW9uX3N0YXRlKSB7CisJY2FzZSBTVEFUSU9OX1NUQVRFX1NDQU5OSU5HOiBzID0gIlNjYW5uaW5nIjsgYnJlYWs7CisJY2FzZSBTVEFUSU9OX1NUQVRFX0pPSU5OSU5HOiBzID0gIkpvaW5pbmciOyBicmVhazsKKwljYXNlIFNUQVRJT05fU1RBVEVfQVVUSEVOVElDQVRJTkc6IHMgPSAiQXV0aGVudGljYXRpbmciOyBicmVhazsKKwljYXNlIFNUQVRJT05fU1RBVEVfQVNTT0NJQVRJTkc6IHMgPSAiQXNzb2NpYXRpbmciOyBicmVhazsKKwljYXNlIFNUQVRJT05fU1RBVEVfUkVBRFk6IHMgPSAiUmVhZHkiOyBicmVhazsKKwljYXNlIFNUQVRJT05fU1RBVEVfUkVBU1NPQ0lBVElORzogcyA9ICJSZWFzc29jaWF0aW5nIjsgYnJlYWs7CisJY2FzZSBTVEFUSU9OX1NUQVRFX01HTVRfRVJST1I6IHMgPSAiTWFuYWdlbWVudCBlcnJvciI7IGJyZWFrOworCWNhc2UgU1RBVElPTl9TVEFURV9ET1dOOiBzID0gIkRvd24iOyBicmVhazsKKwlkZWZhdWx0OiBzID0gIjx1bmtub3duPiI7CisJfQorICAgICAgCisJcCArPSBzcHJpbnRmKHAsICJDdXJyZW50IHN0YXRlOlx0XHQlc1xuIiwgcyk7CisJcmV0dXJuICBwIC0gYnVmOworfQorCitzdGF0aWMgaW50IGF0bWVsX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCSAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisgICAgICAgIHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gZGF0YTsKKwlpbnQgbGVuID0gYXRtZWxfcHJvY19vdXRwdXQgKHBhZ2UsIHByaXYpOworICAgICAgICBpZiAobGVuIDw9IG9mZitjb3VudCkgKmVvZiA9IDE7CisgICAgICAgICpzdGFydCA9IHBhZ2UgKyBvZmY7CisgICAgICAgIGxlbiAtPSBvZmY7CisgICAgICAgIGlmIChsZW4+Y291bnQpIGxlbiA9IGNvdW50OworICAgICAgICBpZiAobGVuPDApIGxlbiA9IDA7CisgICAgICAgIHJldHVybiBsZW47Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlICppbml0X2F0bWVsX2NhcmQoIHVuc2lnbmVkIHNob3J0IGlycSwgaW50IHBvcnQsIGNvbnN0IEF0bWVsRldUeXBlIGZ3X3R5cGUsICAKKwkJCQkgICAgc3RydWN0IGRldmljZSAqc3lzX2RldiwgaW50ICgqY2FyZF9wcmVzZW50KSh2b2lkICopLCB2b2lkICpjYXJkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXY7CisJaW50IHJjOworCisJLyogQ3JlYXRlIHRoZSBuZXR3b3JrIGRldmljZSBvYmplY3QuICovCisgICAgICAgIGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqcHJpdikpOworICAgICAgICBpZiAoIWRldikgeworCQlwcmludGsoS0VSTl9FUlIgImF0bWVsOiAgQ291bGRuJ3QgYWxsb2NfZXRoZXJkZXZcbiIpOworCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCWlmIChkZXZfYWxsb2NfbmFtZShkZXYsIGRldi0+bmFtZSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXRtZWw6ICBDb3VsZG4ndCBnZXQgbmFtZSFcbiIpOworCQlnb3RvIGVycl9vdXRfZnJlZTsKKwl9CisKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwcml2LT5kZXYgPSBkZXY7CisJcHJpdi0+c3lzX2RldiA9IHN5c19kZXY7CisJcHJpdi0+cHJlc2VudF9jYWxsYmFjayA9IGNhcmRfcHJlc2VudDsKKwlwcml2LT5jYXJkID0gY2FyZDsKKwlwcml2LT5maXJtd2FyZSA9IE5VTEw7CisJcHJpdi0+ZmlybXdhcmVfaWRbMF0gPSAnXDAnOworCXByaXYtPmZpcm13YXJlX3R5cGUgPSBmd190eXBlOworCWlmIChmaXJtd2FyZSkgLyogbW9kdWxlIHBhcmFtZXRlciAqLworCQlzdHJjcHkocHJpdi0+ZmlybXdhcmVfaWQsIGZpcm13YXJlKTsKKwlwcml2LT5idXNfdHlwZSA9IGNhcmRfcHJlc2VudCA/IEJVU19UWVBFX1BDQ0FSRCA6IEJVU19UWVBFX1BDSTsKKwlwcml2LT5zdGF0aW9uX3N0YXRlID0gU1RBVElPTl9TVEFURV9ET1dOOworCXByaXYtPmRvX3J4X2NyYyA9IDA7CisJLyogRm9yIFBDTUNJQSBjYXJkcywgc29tZSBjaGlwcyBuZWVkIENSQywgc29tZSBkb24ndAorCSAgIHNvIHdlIGhhdmUgdG8gcHJvYmUuICovCisJaWYgKHByaXYtPmJ1c190eXBlID09IEJVU19UWVBFX1BDQ0FSRCkgeworCQlwcml2LT5wcm9iZV9jcmMgPSAxOworCQlwcml2LT5jcmNfb2tfY250ID0gcHJpdi0+Y3JjX2tvX2NudCA9IDA7CisJfSBlbHNlCisJCXByaXYtPnByb2JlX2NyYyA9IDA7CisJbWVtc2V0KCZwcml2LT5zdGF0cywgMCwgc2l6ZW9mKHByaXYtPnN0YXRzKSk7CisJbWVtc2V0KCZwcml2LT53c3RhdHMsIDAsIHNpemVvZihwcml2LT53c3RhdHMpKTsKKwlwcml2LT5sYXN0X3F1YWwgPSBqaWZmaWVzOworCXByaXYtPmxhc3RfYmVhY29uX3RpbWVzdGFtcCA9IDA7CisJbWVtc2V0KHByaXYtPmZyYWdfc291cmNlLCAweGZmLCBzaXplb2YocHJpdi0+ZnJhZ19zb3VyY2UpKTsKKwltZW1zZXQocHJpdi0+QlNTSUQsIDAsIDYpOworCXByaXYtPkN1cnJlbnRCU1NJRFswXSA9IDB4RkY7IC8qIEluaXRpYWxpemUgdG8gc29tZXRoaW5nIGludmFsaWQuLi4uICovCisJcHJpdi0+c3RhdGlvbl93YXNfYXNzb2NpYXRlZCA9IDA7CisJCisJcHJpdi0+bGFzdF9zdXJ2ZXkgPSBqaWZmaWVzOworCXByaXYtPnByZWFtYmxlID0gTE9OR19QUkVBTUJMRTsKKwlwcml2LT5vcGVyYXRpbmdfbW9kZSA9IElXX01PREVfSU5GUkE7CisJcHJpdi0+Y29ubmVjdF90b19hbnlfQlNTID0gMDsKKwlwcml2LT5jb25maWdfcmVnX2RvbWFpbiA9IDA7CisJcHJpdi0+cmVnX2RvbWFpbiA9IDA7CisJcHJpdi0+dHhfcmF0ZSA9IDM7CisJcHJpdi0+YXV0b190eF9yYXRlID0gMTsKKwlwcml2LT5jaGFubmVsID0gNDsKKwlwcml2LT5wb3dlcl9tb2RlID0gMDsKKwlwcml2LT5TU0lEWzBdID0gJ1wwJzsKKwlwcml2LT5TU0lEX3NpemUgPSAwOworCXByaXYtPm5ld19TU0lEX3NpemUgPSAwOworCXByaXYtPmZyYWdfdGhyZXNob2xkID0gMjM0NjsKKwlwcml2LT5ydHNfdGhyZXNob2xkID0gMjM0NzsKKwlwcml2LT5zaG9ydF9yZXRyeSA9IDc7CisJcHJpdi0+bG9uZ19yZXRyeSA9IDQ7CisKKwlwcml2LT53ZXBfaXNfb24gPSAwOworCXByaXYtPmRlZmF1bHRfa2V5ID0gMDsKKwlwcml2LT5lbmNyeXB0aW9uX2xldmVsID0gMDsKKwlwcml2LT5leGNsdWRlX3VuZW5jcnlwdGVkID0gMDsKKwlwcml2LT5ncm91cF9jaXBoZXJfc3VpdGUgPSBwcml2LT5wYWlyd2lzZV9jaXBoZXJfc3VpdGUgPSBDSVBIRVJfU1VJVEVfTk9ORTsKKwlwcml2LT51c2Vfd3BhID0gMDsKKwltZW1zZXQocHJpdi0+d2VwX2tleXMsIDAsIHNpemVvZihwcml2LT53ZXBfa2V5cykpOworCW1lbXNldChwcml2LT53ZXBfa2V5X2xlbiwgMCwgc2l6ZW9mKHByaXYtPndlcF9rZXlfbGVuKSk7CisKKwlwcml2LT5kZWZhdWx0X2JlYWNvbl9wZXJpb2QgPSBwcml2LT5iZWFjb25fcGVyaW9kID0gMTAwOworCXByaXYtPmxpc3Rlbl9pbnRlcnZhbCA9IDE7CisKKwlpbml0X3RpbWVyKCZwcml2LT5tYW5hZ2VtZW50X3RpbWVyKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+aXJxbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnRpbWVybG9jayk7CisJcHJpdi0+bWFuYWdlbWVudF90aW1lci5mdW5jdGlvbiA9IGF0bWVsX21hbmFnZW1lbnRfdGltZXI7CisJcHJpdi0+bWFuYWdlbWVudF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKKwkKKwlkZXYtPm9wZW4gPSBhdG1lbF9vcGVuOworCWRldi0+c3RvcCA9IGF0bWVsX2Nsb3NlOworCWRldi0+Y2hhbmdlX210dSA9IGF0bWVsX2NoYW5nZV9tdHU7CisJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBhdG1lbF9zZXRfbWFjX2FkZHJlc3M7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBzdGFydF90eDsKKwlkZXYtPmdldF9zdGF0cyA9IGF0bWVsX2dldF9zdGF0czsKKwlkZXYtPmdldF93aXJlbGVzc19zdGF0cyA9IGF0bWVsX2dldF93aXJlbGVzc19zdGF0czsKKwlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSZhdG1lbF9oYW5kbGVyX2RlZjsKKwlkZXYtPmRvX2lvY3RsID0gYXRtZWxfaW9jdGw7CisJZGV2LT5pcnEgPSBpcnE7CisJZGV2LT5iYXNlX2FkZHIgPSBwb3J0OworCQorCVNFVF9ORVRERVZfREVWKGRldiwgc3lzX2Rldik7CisJCisJaWYgKChyYyA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBzZXJ2aWNlX2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVnaXN0ZXIgaW50ZXJydXB0ICVkIGZhaWxlZCwgcmMgJWRcbiIsIGRldi0+bmFtZSwgaXJxLCByYyApOworCQlnb3RvIGVycl9vdXRfZnJlZTsKKwl9CisKKwlpZiAocHJpdi0+YnVzX3R5cGUgPT0gQlVTX1RZUEVfUENJICYmCisJICAgICFyZXF1ZXN0X3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIDY0LCBkZXYtPm5hbWUgKSkgeworCQlnb3RvIGVycl9vdXRfaXJxOworCX0KKwkKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpCisJCWdvdG8gZXJyX291dF9yZXM7CisJCisJaWYgKCFwcm9iZV9hdG1lbF9jYXJkKGRldikpeworCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCQlnb3RvIGVycl9vdXRfcmVzOworCX0KKwkKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQorCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkgKCJkcml2ZXIvYXRtZWwiLCAwLCBOVUxMLCBhdG1lbF9yZWFkX3Byb2MsIHByaXYpOwkKKwkKKwlwcmludGsoS0VSTl9JTkZPICIlczogQXRtZWwgYXQ3NmM1MHggd2lyZWxlc3MuIFZlcnNpb24gJWQuJWQgc2ltb25AdGhla2VsbGV5cy5vcmcudWtcbiIsCisJICAgICAgIGRldi0+bmFtZSwgRFJJVkVSX01BSk9SLCBEUklWRVJfTUlOT1IpOworCQorCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlyZXR1cm4gZGV2OworCQorIGVycl9vdXRfcmVzOgorCWlmIChwcml2LT5idXNfdHlwZSA9PSBCVVNfVFlQRV9QQ0kpCisJICAgICAgICByZWxlYXNlX3JlZ2lvbiggZGV2LT5iYXNlX2FkZHIsIDY0ICk7CisgZXJyX291dF9pcnE6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisgZXJyX291dF9mcmVlOgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIE5VTEw7Cit9CisKK0VYUE9SVF9TWU1CT0woaW5pdF9hdG1lbF9jYXJkKTsKKwordm9pZCBzdG9wX2F0bWVsX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZyZWVyZXMpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCQkKKwkvKiBwdXQgYSBicmljayBvbiBpdC4uLiAqLworCWlmIChwcml2LT5idXNfdHlwZSA9PSBCVVNfVFlQRV9QQ0NBUkQpIAorCQlhdG1lbF93cml0ZTE2KGRldiwgR0NSLCAweDAwNjApOworCWF0bWVsX3dyaXRlMTYoZGV2LCBHQ1IsIDB4MDA0MCk7CisJCisJZGVsX3RpbWVyX3N5bmMoJnByaXYtPm1hbmFnZW1lbnRfdGltZXIpOworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlci9hdG1lbCIsIE5VTEwpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCWlmIChwcml2LT5maXJtd2FyZSkKKwkJa2ZyZWUocHJpdi0+ZmlybXdhcmUpOworCWlmIChmcmVlcmVzKSB7CisJCS8qIFBDTUNJQSBmcmVlcyB0aGlzIHN0dWZmLCBzbyBvbmx5IGZvciBQQ0kgKi8KKwkgICAgICAgIHJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCA2NCk7CisgICAgICAgIH0KKwlmcmVlX25ldGRldihkZXYpOworfQorCitFWFBPUlRfU1lNQk9MKHN0b3BfYXRtZWxfY2FyZCk7CisKK3N0YXRpYyBpbnQgYXRtZWxfc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogQ2hlY2sgaWYgd2UgYXNrZWQgZm9yIGBhbnknICovCisJaWYoZHdycS0+ZmxhZ3MgPT0gMCkgeworCQlwcml2LT5jb25uZWN0X3RvX2FueV9CU1MgPSAxOworCX0gZWxzZSB7CisJCWludCBpbmRleCA9IChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWCkgLSAxOworCisJCXByaXYtPmNvbm5lY3RfdG9fYW55X0JTUyA9IDA7CisJCQorCQkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nICovCisJCWlmIChkd3JxLT5sZW5ndGggPiBNQVhfU1NJRF9MRU5HVEggKyAxKQorCQkJIHJldHVybiAtRTJCSUcgOworCQlpZiAoaW5kZXggIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQkKKwkJbWVtY3B5KHByaXYtPm5ld19TU0lELCBleHRyYSwgZHdycS0+bGVuZ3RoIC0gMSk7CisJCXByaXYtPm5ld19TU0lEX3NpemUgPSBkd3JxLT5sZW5ndGggLSAxOworCX0KKworCXJldHVybiAtRUlOUFJPR1JFU1M7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfZ2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogR2V0IHRoZSBjdXJyZW50IFNTSUQgKi8KKwlpZiAocHJpdi0+bmV3X1NTSURfc2l6ZSAhPSAwKSB7CisJCW1lbWNweShleHRyYSwgcHJpdi0+bmV3X1NTSUQsIHByaXYtPm5ld19TU0lEX3NpemUpOworCQlleHRyYVtwcml2LT5uZXdfU1NJRF9zaXplXSA9ICdcMCc7CisJCWR3cnEtPmxlbmd0aCA9IHByaXYtPm5ld19TU0lEX3NpemUgKyAxOworCX0gZWxzZSB7CisJCW1lbWNweShleHRyYSwgcHJpdi0+U1NJRCwgcHJpdi0+U1NJRF9zaXplKTsKKwkJZXh0cmFbcHJpdi0+U1NJRF9zaXplXSA9ICdcMCc7CisJCWR3cnEtPmxlbmd0aCA9IHByaXYtPlNTSURfc2l6ZSArIDE7CisJfQorCQorCWR3cnEtPmZsYWdzID0gIXByaXYtPmNvbm5lY3RfdG9fYW55X0JTUzsgLyogYWN0aXZlICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9nZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3Qgc29ja2FkZHIgKmF3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCW1lbWNweShhd3JxLT5zYV9kYXRhLCBwcml2LT5DdXJyZW50QlNTSUQsIDYpOworCWF3cnEtPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX3NldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHN0cnVjdCBpd19wb2ludCAqZHdycSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBCYXNpYyBjaGVja2luZzogZG8gd2UgaGF2ZSBhIGtleSB0byBzZXQgPworCSAqIE5vdGUgOiB3aXRoIHRoZSBuZXcgQVBJLCBpdCdzIGltcG9zc2libGUgdG8gZ2V0IGEgTlVMTCBwb2ludGVyLgorCSAqIFRoZXJlZm9yZSwgd2UgbmVlZCB0byBjaGVjayBhIGtleSBzaXplID09IDAgaW5zdGVhZC4KKwkgKiBOZXcgdmVyc2lvbiBvZiBpd2NvbmZpZyBwcm9wZXJseSBzZXQgdGhlIElXX0VOQ09ERV9OT0tFWSBmbGFnCisJICogd2hlbiBubyBrZXkgaXMgcHJlc2VudCAob25seSBjaGFuZ2UgZmxhZ3MpLCBidXQgb2xkZXIgdmVyc2lvbnMKKwkgKiBkb24ndCBkbyBpdC4gLSBKZWFuIElJICovCisJaWYgKGR3cnEtPmxlbmd0aCA+IDApIHsKKwkJaW50IGluZGV4ID0gKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJCWludCBjdXJyZW50X2luZGV4ID0gcHJpdi0+ZGVmYXVsdF9rZXk7CisJCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBrZXkgKi8KKwkJaWYgKGR3cnEtPmxlbmd0aCA+IDEzKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKiBDaGVjayB0aGUgaW5kZXggKG5vbmUgLT4gdXNlIGN1cnJlbnQpICovCisJCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gNCkKKwkJCWluZGV4ID0gY3VycmVudF9pbmRleDsKKwkJZWxzZQorCQkJcHJpdi0+ZGVmYXVsdF9rZXkgPSBpbmRleDsKKwkJLyogU2V0IHRoZSBsZW5ndGggKi8KKwkJaWYgKGR3cnEtPmxlbmd0aCA+IDUpCisJCQlwcml2LT53ZXBfa2V5X2xlbltpbmRleF0gPSAxMzsKKwkJZWxzZQorCQkJaWYgKGR3cnEtPmxlbmd0aCA+IDApCisJCQkJcHJpdi0+d2VwX2tleV9sZW5baW5kZXhdID0gNTsKKwkJCWVsc2UKKwkJCQkvKiBEaXNhYmxlIHRoZSBrZXkgKi8KKwkJCQlwcml2LT53ZXBfa2V5X2xlbltpbmRleF0gPSAwOworCQkvKiBDaGVjayBpZiB0aGUga2V5IGlzIG5vdCBtYXJrZWQgYXMgaW52YWxpZCAqLworCQlpZighKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX05PS0VZKSkgeworCQkJLyogQ2xlYW51cCAqLworCQkJbWVtc2V0KHByaXYtPndlcF9rZXlzW2luZGV4XSwgMCwgMTMpOworCQkJLyogQ29weSB0aGUga2V5IGluIHRoZSBkcml2ZXIgKi8KKwkJCW1lbWNweShwcml2LT53ZXBfa2V5c1tpbmRleF0sIGV4dHJhLCBkd3JxLT5sZW5ndGgpOworCQl9CisJCS8qIFdFIHNwZWNpZnkgdGhhdCBpZiBhIHZhbGlkIGtleSBpcyBzZXQsIGVuY3J5cHRpb24KKwkJICogc2hvdWxkIGJlIGVuYWJsZWQgKHVzZXIgbWF5IHR1cm4gaXQgb2ZmIGxhdGVyKQorCQkgKiBUaGlzIGlzIGFsc28gaG93ICJpd2NvbmZpZyBldGhYIGtleSBvbiIgd29ya3MgKi8KKwkJaWYgKGluZGV4ID09IGN1cnJlbnRfaW5kZXggJiYgCisJCSAgICBwcml2LT53ZXBfa2V5X2xlbltpbmRleF0gPiAwKSB7CisJCQlwcml2LT53ZXBfaXNfb24gPSAxOworCQkJcHJpdi0+ZXhjbHVkZV91bmVuY3J5cHRlZCA9IDE7CisJCQlpZiAocHJpdi0+d2VwX2tleV9sZW5baW5kZXhdID4gNSkgeworCQkJCXByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZSA9IENJUEhFUl9TVUlURV9XRVBfNjQ7CisJCQkJcHJpdi0+ZW5jcnlwdGlvbl9sZXZlbCA9IDI7CisJCQl9IGVsc2UgeworCQkJCXByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZSA9IENJUEhFUl9TVUlURV9XRVBfMTI4OworCQkJCXByaXYtPmVuY3J5cHRpb25fbGV2ZWwgPSAxOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogRG8gd2Ugd2FudCB0byBqdXN0IHNldCB0aGUgdHJhbnNtaXQga2V5IGluZGV4ID8gKi8KKwkJaW50IGluZGV4ID0gKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJCWlmICggaW5kZXg+PTAgJiYgaW5kZXggPCA0ICkgeworCQkJcHJpdi0+ZGVmYXVsdF9rZXkgPSBpbmRleDsKKwkJfSBlbHNlCisJCQkvKiBEb24ndCBjb21wbGFpbiBpZiBvbmx5IGNoYW5nZSB0aGUgbW9kZSAqLworCQkJaWYoIWR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX01PREUpIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwl9CisJLyogUmVhZCB0aGUgZmxhZ3MgKi8KKwlpZihkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgeworCQlwcml2LT53ZXBfaXNfb24gPSAwOworCQlwcml2LT5lbmNyeXB0aW9uX2xldmVsID0gMDsgCQorCQlwcml2LT5wYWlyd2lzZV9jaXBoZXJfc3VpdGUgPSBDSVBIRVJfU1VJVEVfTk9ORTsKKwl9IGVsc2UgeworCQlwcml2LT53ZXBfaXNfb24gPSAxOworCQlpZiAocHJpdi0+d2VwX2tleV9sZW5bcHJpdi0+ZGVmYXVsdF9rZXldID4gNSkgeworCQkJcHJpdi0+cGFpcndpc2VfY2lwaGVyX3N1aXRlID0gQ0lQSEVSX1NVSVRFX1dFUF8xMjg7CisJCQlwcml2LT5lbmNyeXB0aW9uX2xldmVsID0gMjsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZSA9IENJUEhFUl9TVUlURV9XRVBfNjQ7CisJCQlwcml2LT5lbmNyeXB0aW9uX2xldmVsID0gMTsKKwkJfQorCX0KKwlpZihkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKQorCQlwcml2LT5leGNsdWRlX3VuZW5jcnlwdGVkID0gMTsKKwlpZihkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKQorCQlwcml2LT5leGNsdWRlX3VuZW5jcnlwdGVkID0gMDsKKwkKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQorCisKK3N0YXRpYyBpbnQgYXRtZWxfZ2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgc3RydWN0IGl3X3BvaW50ICpkd3JxLAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaW5kZXggPSAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkKKwlpZiAoIXByaXYtPndlcF9pc19vbikKKwkJZHdycS0+ZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CisJZWxzZSBpZiAocHJpdi0+ZXhjbHVkZV91bmVuY3J5cHRlZCkKKwkJZHdycS0+ZmxhZ3MgPSBJV19FTkNPREVfUkVTVFJJQ1RFRDsKKwllbHNlCisJCWR3cnEtPmZsYWdzID0gSVdfRU5DT0RFX09QRU47CisJCQorCQkvKiBXaGljaCBrZXkgZG8gd2Ugd2FudCA/IC0xIC0+IHR4IGluZGV4ICovCisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSA0KQorCQlpbmRleCA9IHByaXYtPmRlZmF1bHRfa2V5OworCWR3cnEtPmZsYWdzIHw9IGluZGV4ICsgMTsKKwkvKiBDb3B5IHRoZSBrZXkgdG8gdGhlIHVzZXIgYnVmZmVyICovCisJZHdycS0+bGVuZ3RoID0gcHJpdi0+d2VwX2tleV9sZW5baW5kZXhdOworCWlmIChkd3JxLT5sZW5ndGggPiAxNikgeworCQlkd3JxLT5sZW5ndGg9MDsKKwl9IGVsc2UgeworCQltZW1zZXQoZXh0cmEsIDAsIDE2KTsKKwkJbWVtY3B5KGV4dHJhLCBwcml2LT53ZXBfa2V5c1tpbmRleF0sIGR3cnEtPmxlbmd0aCk7CisJfQorCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0bWVsX2dldF9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIGNoYXIgKmN3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cmNweShjd3JxLCAiSUVFRSA4MDIuMTEtRFMiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9zZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwlpZiAodndycS0+Zml4ZWQgPT0gMCkgeworCQlwcml2LT50eF9yYXRlID0gMzsKKwkJcHJpdi0+YXV0b190eF9yYXRlID0gMTsKKwl9IGVsc2UgeworCQlwcml2LT5hdXRvX3R4X3JhdGUgPSAwOworCQkKKwkJLyogV2hpY2ggdHlwZSBvZiB2YWx1ZSA/ICovCisJCWlmKCh2d3JxLT52YWx1ZSA8IDQpICYmICh2d3JxLT52YWx1ZSA+PSAwKSkgeworCQkJLyogU2V0dGluZyBieSByYXRlIGluZGV4ICovCisJCXByaXYtPnR4X3JhdGUgPSB2d3JxLT52YWx1ZTsKKwkJfSBlbHNlIHsKKwkJLyogU2V0dGluZyBieSBmcmVxdWVuY3kgdmFsdWUgKi8KKwkJCXN3aXRjaCAodndycS0+dmFsdWUpIHsKKwkJCWNhc2UgIDEwMDAwMDA6IHByaXYtPnR4X3JhdGUgPSAwOyBicmVhazsKKwkJCWNhc2UgIDIwMDAwMDA6IHByaXYtPnR4X3JhdGUgPSAxOyBicmVhazsKKwkJCWNhc2UgIDU1MDAwMDA6IHByaXYtPnR4X3JhdGUgPSAyOyBicmVhazsKKwkJCWNhc2UgMTEwMDAwMDA6IHByaXYtPnR4X3JhdGUgPSAzOyBicmVhazsKKwkJCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIC1FSU5QUk9HUkVTUzsKK30KKworc3RhdGljIGludCBhdG1lbF9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBfX3UzMiAqdXdycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCp1d3JxICE9IElXX01PREVfQURIT0MgJiYgKnV3cnEgIT0gSVdfTU9ERV9JTkZSQSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwcml2LT5vcGVyYXRpbmdfbW9kZSA9ICp1d3JxOworCXJldHVybiAtRUlOUFJPR1JFU1M7ICAKK30KKworc3RhdGljIGludCBhdG1lbF9nZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBfX3UzMiAqdXdycSwKKwkJCSAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCSp1d3JxID0gcHJpdi0+b3BlcmF0aW5nX21vZGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfZ2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAocHJpdi0+YXV0b190eF9yYXRlKSB7CisJCXZ3cnEtPmZpeGVkID0gMDsKKwkJdndycS0+dmFsdWUgPSAxMTAwMDAwMDsKKwl9IGVsc2UgeworCQl2d3JxLT5maXhlZCA9IDE7CisJCXN3aXRjaChwcml2LT50eF9yYXRlKSB7CisJCWNhc2UgMDogdndycS0+dmFsdWUgPSAgMTAwMDAwMDsgYnJlYWs7CisJCWNhc2UgMTogdndycS0+dmFsdWUgPSAgMjAwMDAwMDsgYnJlYWs7CisJCWNhc2UgMjogdndycS0+dmFsdWUgPSAgNTUwMDAwMDsgYnJlYWs7CisJCWNhc2UgMzogdndycS0+dmFsdWUgPSAxMTAwMDAwMDsgYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfc2V0X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXByaXYtPnBvd2VyX21vZGUgPSB2d3JxLT5kaXNhYmxlZCA/IDAgOiAxOworCXJldHVybiAtRUlOUFJPR1JFU1M7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfZ2V0X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZ3cnEtPmRpc2FibGVkID0gcHJpdi0+cG93ZXJfbW9kZSA/IDAgOiAxOworCXZ3cnEtPmZsYWdzID0gSVdfUE9XRVJfT047CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfc2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCWlmKCF2d3JxLT5kaXNhYmxlZCAmJiAodndycS0+ZmxhZ3MgJiBJV19SRVRSWV9MSU1JVCkpIHsKKwkJaWYodndycS0+ZmxhZ3MgJiBJV19SRVRSWV9NQVgpCisJCQlwcml2LT5sb25nX3JldHJ5ID0gdndycS0+dmFsdWU7CisJCWVsc2UgaWYgKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTUlOKQorCQkJcHJpdi0+c2hvcnRfcmV0cnkgPSB2d3JxLT52YWx1ZTsKKwkJZWxzZSB7CisJCQkvKiBObyBtb2RpZmllciA6IHNldCBib3RoICovCisJCQlwcml2LT5sb25nX3JldHJ5ID0gdndycS0+dmFsdWU7CisJCQlwcml2LT5zaG9ydF9yZXRyeSA9IHZ3cnEtPnZhbHVlOworCQl9CisJCXJldHVybiAtRUlOUFJPR1JFU1M7CQkKKwl9CisJICAgCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfZ2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJdndycS0+ZGlzYWJsZWQgPSAwOyAgICAgIC8qIENhbid0IGJlIGRpc2FibGVkICovCisKKwkvKiBOb3RlIDogYnkgZGVmYXVsdCwgZGlzcGxheSB0aGUgbWluIHJldHJ5IG51bWJlciAqLworCWlmKCh2d3JxLT5mbGFncyAmIElXX1JFVFJZX01BWCkpIHsKKwkJdndycS0+ZmxhZ3MgPSBJV19SRVRSWV9MSU1JVCB8IElXX1JFVFJZX01BWDsKKwkJdndycS0+dmFsdWUgPSBwcml2LT5sb25nX3JldHJ5OworCX0gZWxzZSB7CisJCXZ3cnEtPmZsYWdzID0gSVdfUkVUUllfTElNSVQ7CisJCXZ3cnEtPnZhbHVlID0gcHJpdi0+c2hvcnRfcmV0cnk7CisJCWlmKHByaXYtPmxvbmdfcmV0cnkgIT0gcHJpdi0+c2hvcnRfcmV0cnkpCisJCQl2d3JxLT5mbGFncyB8PSBJV19SRVRSWV9NSU47CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfc2V0X3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLAorCQkJIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcnRociA9IHZ3cnEtPnZhbHVlOworCisJaWYodndycS0+ZGlzYWJsZWQpCisJCXJ0aHIgPSAyMzQ3OworCWlmKChydGhyIDwgMCkgfHwgKHJ0aHIgPiAyMzQ3KSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcHJpdi0+cnRzX3RocmVzaG9sZCA9IHJ0aHI7CisJCisJcmV0dXJuIC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KK30KKworc3RhdGljIGludCBhdG1lbF9nZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCQorCXZ3cnEtPnZhbHVlID0gcHJpdi0+cnRzX3RocmVzaG9sZDsKKwl2d3JxLT5kaXNhYmxlZCA9ICh2d3JxLT52YWx1ZSA+PSAyMzQ3KTsKKwl2d3JxLT5maXhlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9zZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZnRociA9IHZ3cnEtPnZhbHVlOworCisJaWYodndycS0+ZGlzYWJsZWQpCisJCWZ0aHIgPSAyMzQ2OworCWlmKChmdGhyIDwgMjU2KSB8fCAoZnRociA+IDIzNDYpKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlmdGhyICY9IH4weDE7CS8qIEdldCBhbiBldmVuIHZhbHVlIC0gaXMgaXQgcmVhbGx5IG5lZWRlZCA/Pz8gKi8KKwlwcml2LT5mcmFnX3RocmVzaG9sZCA9IGZ0aHI7CisJCisJcmV0dXJuIC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KK30KKworc3RhdGljIGludCBhdG1lbF9nZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXZ3cnEtPnZhbHVlID0gcHJpdi0+ZnJhZ190aHJlc2hvbGQ7CisJdndycS0+ZGlzYWJsZWQgPSAodndycS0+dmFsdWUgPj0gMjM0Nik7CisJdndycS0+Zml4ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBsb25nIGZyZXF1ZW5jeV9saXN0W10gPSB7IDI0MTIsIDI0MTcsIDI0MjIsIDI0MjcsIDI0MzIsIDI0MzcsIDI0NDIsCisJCQkJMjQ0NywgMjQ1MiwgMjQ1NywgMjQ2MiwgMjQ2NywgMjQ3MiwgMjQ4NCB9OworCitzdGF0aWMgaW50IGF0bWVsX3NldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19mcmVxICpmd3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjID0gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworCQorCS8qIElmIHNldHRpbmcgYnkgZnJlcXVlbmN5LCBjb252ZXJ0IHRvIGEgY2hhbm5lbCAqLworCWlmKChmd3JxLT5lID09IDEpICYmCisJICAgKGZ3cnEtPm0gPj0gKGludCkgMjQxMjAwMDAwKSAmJgorCSAgIChmd3JxLT5tIDw9IChpbnQpIDI0ODcwMDAwMCkpIHsKKwkJaW50IGYgPSBmd3JxLT5tIC8gMTAwMDAwOworCQlpbnQgYyA9IDA7CisJCXdoaWxlKChjIDwgMTQpICYmIChmICE9IGZyZXF1ZW5jeV9saXN0W2NdKSkKKwkJCWMrKzsKKwkJLyogSGFjayB0byBmYWxsIHRocm91Z2guLi4gKi8KKwkJZndycS0+ZSA9IDA7CisJCWZ3cnEtPm0gPSBjICsgMTsKKwl9CisJLyogU2V0dGluZyBieSBjaGFubmVsIG51bWJlciAqLworCWlmKChmd3JxLT5tID4gMTAwMCkgfHwgKGZ3cnEtPmUgPiAwKSkKKwkJcmMgPSAtRU9QTk9UU1VQUDsKKwllbHNlIHsKKwkJaW50IGNoYW5uZWwgPSBmd3JxLT5tOworCQlpZiAoYXRtZWxfdmFsaWRhdGVfY2hhbm5lbChwcml2LCBjaGFubmVsKSA9PSAwKSB7CisJCQlwcml2LT5jaGFubmVsID0gY2hhbm5lbDsKKwkJfSBlbHNlIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJfSAKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGF0bWVsX2dldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpd19mcmVxICpmd3JxLAorCQkJICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlmd3JxLT5tID0gcHJpdi0+Y2hhbm5lbDsKKwlmd3JxLT5lID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9zZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogTm90ZSA6IHlvdSBtYXkgaGF2ZSByZWFsaXNlZCB0aGF0LCBhcyB0aGlzIGlzIGEgU0VUIG9wZXJhdGlvbiwKKwkgKiB0aGlzIGlzIHByaXZpbGVnZWQgYW5kIHRoZXJlZm9yZSBhIG5vcm1hbCB1c2VyIGNhbid0CisJICogcGVyZm9ybSBzY2FubmluZy4KKwkgKiBUaGlzIGlzIG5vdCBhbiBlcnJvciwgd2hpbGUgdGhlIGRldmljZSBwZXJmb3JtIHNjYW5uaW5nLAorCSAqIHRyYWZmaWMgZG9lc24ndCBmbG93LCBzbyBpdCdzIGEgcGVyZmVjdCBEb1MuLi4KKwkgKiBKZWFuIElJICovCisJCisJaWYgKHByaXYtPnN0YXRpb25fc3RhdGUgPT0gU1RBVElPTl9TVEFURV9ET1dOKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCS8qIFRpbWVvdXQgb2xkIHN1cnZleXMuICovCisJaWYgKChqaWZmaWVzIC0gcHJpdi0+bGFzdF9zdXJ2ZXkpID4gKDIwICogSFopKQorCQlwcml2LT5zaXRlX3N1cnZleV9zdGF0ZSA9IFNJVEVfU1VSVkVZX0lETEU7CisJcHJpdi0+bGFzdF9zdXJ2ZXkgPSBqaWZmaWVzOworCisJLyogSW5pdGlhdGUgYSBzY2FuIGNvbW1hbmQgKi8KKwlpZiAocHJpdi0+c2l0ZV9zdXJ2ZXlfc3RhdGUgPT0gU0lURV9TVVJWRVlfSU5fUFJPR1JFU1MpCisJCXJldHVybiAtRUJVU1k7CisJCQorCWRlbF90aW1lcl9zeW5jKCZwcml2LT5tYW5hZ2VtZW50X3RpbWVyKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aXJxbG9jaywgZmxhZ3MpOworCQorCXByaXYtPnNpdGVfc3VydmV5X3N0YXRlID0gU0lURV9TVVJWRVlfSU5fUFJPR1JFU1M7CisJcHJpdi0+ZmFzdF9zY2FuID0gMDsKKwlhdG1lbF9zY2FuKHByaXYsIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycWxvY2ssIGZsYWdzKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9nZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwljaGFyICpjdXJyZW50X2V2ID0gZXh0cmE7CisJc3RydWN0IGl3X2V2ZW50CWl3ZTsKKwkKKwlpZiAocHJpdi0+c2l0ZV9zdXJ2ZXlfc3RhdGUgIT0gU0lURV9TVVJWRVlfQ09NUExFVEVEKQorCQlyZXR1cm4gLUVBR0FJTjsKKwkKKwlmb3IoaT0wOyBpPHByaXYtPkJTU19saXN0X2VudHJpZXM7IGkrKykgeyAKKwkJaXdlLmNtZCA9IFNJT0NHSVdBUDsKKwkJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsIHByaXYtPkJTU2luZm9baV0uQlNTSUQsIDYpOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLCAmaXdlLCBJV19FVl9BRERSX0xFTik7CisKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSAgcHJpdi0+QlNTaW5mb1tpXS5TU0lEc2l6ZTsKKwkJaWYgKGl3ZS51LmRhdGEubGVuZ3RoID4gMzIpCisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IDMyOworCQlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOworCQlpd2UudS5kYXRhLmZsYWdzID0gMTsKKwkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGN1cnJlbnRfZXYsIGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwgJml3ZSwgcHJpdi0+QlNTaW5mb1tpXS5TU0lEKTsKKwkJCisJCWl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKKwkJaXdlLnUubW9kZSA9IHByaXYtPkJTU2luZm9baV0uQlNTdHlwZTsKKwkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwgJml3ZSwgSVdfRVZfVUlOVF9MRU4pOworCQorCQlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7CisJCWl3ZS51LmZyZXEubSA9IHByaXYtPkJTU2luZm9baV0uY2hhbm5lbDsKKwkJaXdlLnUuZnJlcS5lID0gMDsKKwkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwgJml3ZSwgSVdfRVZfRlJFUV9MRU4pOworCQkKKwkJaXdlLmNtZCA9IFNJT0NHSVdFTkNPREU7CisJCWlmIChwcml2LT5CU1NpbmZvW2ldLlVzaW5nV0VQKQorCQkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOworCQllbHNlCisJCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IDA7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChjdXJyZW50X2V2LCBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsICZpd2UsIE5VTEwpOworCQkKKwl9CisKKwkvKiBMZW5ndGggb2YgZGF0YSAqLworCWR3cnEtPmxlbmd0aCA9IChjdXJyZW50X2V2IC0gZXh0cmEpOworCWR3cnEtPmZsYWdzID0gMDsgICAKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9nZXRfcmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKikgZXh0cmE7CisJaW50IGssaSxqOworCisJZHdycS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7CisJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2YocmFuZ2UpKTsKKwlyYW5nZS0+bWluX253aWQgPSAweDAwMDA7CisJcmFuZ2UtPm1heF9ud2lkID0gMHgwMDAwOworCXJhbmdlLT5udW1fY2hhbm5lbHMgPSAwOworCWZvciAoaiA9IDA7IGogPCBzaXplb2YoY2hhbm5lbF90YWJsZSkvc2l6ZW9mKGNoYW5uZWxfdGFibGVbMF0pOyBqKyspCisJCWlmIChwcml2LT5yZWdfZG9tYWluID09IGNoYW5uZWxfdGFibGVbal0ucmVnX2RvbWFpbikgeworCQkJcmFuZ2UtPm51bV9jaGFubmVscyA9IGNoYW5uZWxfdGFibGVbal0ubWF4IC0gY2hhbm5lbF90YWJsZVtqXS5taW4gKyAxOworCQkJYnJlYWs7CisJCX0KKwlpZiAocmFuZ2UtPm51bV9jaGFubmVscyAhPSAwKSB7CisJCWZvcihrID0gMCwgaSA9IGNoYW5uZWxfdGFibGVbal0ubWluOyBpIDw9IGNoYW5uZWxfdGFibGVbal0ubWF4OyBpKyspIHsKKwkJCXJhbmdlLT5mcmVxW2tdLmkgPSBpOyAvKiBMaXN0IGluZGV4ICovCisJCQlyYW5nZS0+ZnJlcVtrXS5tID0gZnJlcXVlbmN5X2xpc3RbaS0xXSAqIDEwMDAwMDsKKwkJCXJhbmdlLT5mcmVxW2srK10uZSA9IDE7CS8qIFZhbHVlcyBpbiB0YWJsZSBpbiBNSHogLT4gKiAxMF41ICogMTAgKi8KKwkJfQorCQlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IGs7CisJfQorCQorCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMTAwOworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDEwMDsKKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOworCXJhbmdlLT5tYXhfcXVhbC51cGRhdGVkID0gSVdfUVVBTF9OT0lTRV9JTlZBTElEOworCisJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSA1MDsKKwlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSA1MDsKKwlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAwOworCXJhbmdlLT5hdmdfcXVhbC51cGRhdGVkID0gSVdfUVVBTF9OT0lTRV9JTlZBTElEOworCisJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMDsKKworCXJhbmdlLT5iaXRyYXRlWzBdID0gIDEwMDAwMDA7CisJcmFuZ2UtPmJpdHJhdGVbMV0gPSAgMjAwMDAwMDsKKwlyYW5nZS0+Yml0cmF0ZVsyXSA9ICA1NTAwMDAwOworCXJhbmdlLT5iaXRyYXRlWzNdID0gMTEwMDAwMDA7CisJcmFuZ2UtPm51bV9iaXRyYXRlcyA9IDQ7CisKKwlyYW5nZS0+bWluX3J0cyA9IDA7CisJcmFuZ2UtPm1heF9ydHMgPSAyMzQ3OworCXJhbmdlLT5taW5fZnJhZyA9IDI1NjsKKwlyYW5nZS0+bWF4X2ZyYWcgPSAyMzQ2OworCisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSA1OworCXJhbmdlLT5lbmNvZGluZ19zaXplWzFdID0gMTM7CisJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDI7CisJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSA0OworCQorCXJhbmdlLT5wbXBfZmxhZ3MgPSBJV19QT1dFUl9PTjsKKwlyYW5nZS0+cG10X2ZsYWdzID0gSVdfUE9XRVJfT047CisJcmFuZ2UtPnBtX2NhcGEgPSAwOworCQorCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS0+cmV0cnlfY2FwYSA9IElXX1JFVFJZX0xJTUlUIDsKKwlyYW5nZS0+cmV0cnlfZmxhZ3MgPSBJV19SRVRSWV9MSU1JVDsKKwlyYW5nZS0+cl90aW1lX2ZsYWdzID0gMDsKKwlyYW5nZS0+bWluX3JldHJ5ID0gMTsKKwlyYW5nZS0+bWF4X3JldHJ5ID0gNjU1MzU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdG1lbF9zZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSBzdHJ1Y3Qgc29ja2FkZHIgKmF3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCXN0YXRpYyBjb25zdCB1OCBiY2FzdFtdID0geyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChhd3JxLT5zYV9mYW1pbHkgIT0gQVJQSFJEX0VUSEVSKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkKKwlpZiAobWVtY21wKGJjYXN0LCBhd3JxLT5zYV9kYXRhLCA2KSA9PSAwKSB7CisJCWRlbF90aW1lcl9zeW5jKCZwcml2LT5tYW5hZ2VtZW50X3RpbWVyKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycWxvY2ssIGZsYWdzKTsKKwkJYXRtZWxfc2Nhbihwcml2LCAxKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJCisJZm9yKGk9MDsgaTxwcml2LT5CU1NfbGlzdF9lbnRyaWVzOyBpKyspIHsKKwkJaWYgKG1lbWNtcChwcml2LT5CU1NpbmZvW2ldLkJTU0lELCBhd3JxLT5zYV9kYXRhLCA2KSA9PSAwKSB7CisJCQlpZiAoIXByaXYtPndlcF9pc19vbiAmJiBwcml2LT5CU1NpbmZvW2ldLlVzaW5nV0VQKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9IGVsc2UgaWYgIChwcml2LT53ZXBfaXNfb24gJiYgIXByaXYtPkJTU2luZm9baV0uVXNpbmdXRVApIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0gZWxzZSB7CisJCQkJZGVsX3RpbWVyX3N5bmMoJnByaXYtPm1hbmFnZW1lbnRfdGltZXIpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5pcnFsb2NrLCBmbGFncyk7CisJCQkJYXRtZWxfam9pbl9ic3MocHJpdiwgaSk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxbG9jaywgZmxhZ3MpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJfQorCQkKKwlyZXR1cm4gLUVJTlZBTDsKK30KKwkKK3N0YXRpYyBpbnQgYXRtZWxfY29uZmlnX2NvbW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCS8qIE5VTEwgKi8KKwkJCSAgICAgICB2b2lkICp6d3JxLAkJCS8qIE5VTEwgKi8KKwkJCSAgICAgICBjaGFyICpleHRyYSkJCQkvKiBOVUxMICovCit7CisJcmV0dXJuIGF0bWVsX29wZW4oZGV2KTsKK30KKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJCWF0bWVsX2hhbmRsZXJbXSA9Cit7CisJKGl3X2hhbmRsZXIpIGF0bWVsX2NvbmZpZ19jb21taXQsCS8qIFNJT0NTSVdDT01NSVQgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfZ2V0X25hbWUsICAgIAkvKiBTSU9DR0lXTkFNRSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NTSVdOV0lEICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ0dJV05XSUQgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfc2V0X2ZyZXEsCQkvKiBTSU9DU0lXRlJFUSAqLworCShpd19oYW5kbGVyKSBhdG1lbF9nZXRfZnJlcSwJCS8qIFNJT0NHSVdGUkVRICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX3NldF9tb2RlLAkJLyogU0lPQ1NJV01PREUgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfZ2V0X21vZGUsCQkvKiBTSU9DR0lXTU9ERSAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgIAkvKiBTSU9DU0lXU0VOUyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgCQkvKiBTSU9DR0lXU0VOUyAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NTSVdSQU5HRSAqLworCShpd19oYW5kbGVyKSBhdG1lbF9nZXRfcmFuZ2UsICAgICAgICAgICAvKiBTSU9DR0lXUkFOR0UgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiBTSU9DU0lXUFJJViAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NHSVdQUklWICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ1NJV1NUQVRTICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ0dJV1NUQVRTICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogU0lPQ1NJV1NQWSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIFNJT0NHSVdTUFkgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBhdG1lbF9zZXRfd2FwLAkJLyogU0lPQ1NJV0FQICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX2dldF93YXAsCQkvKiBTSU9DR0lXQVAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJCQkvKiAtLSBob2xlIC0tICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgIAkJLyogU0lPQ0dJV0FQTElTVCAqLworCShpd19oYW5kbGVyKSBhdG1lbF9zZXRfc2NhbiwJCS8qIFNJT0NTSVdTQ0FOICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX2dldF9zY2FuLAkJLyogU0lPQ0dJV1NDQU4gKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfc2V0X2Vzc2lkLAkJLyogU0lPQ1NJV0VTU0lEICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX2dldF9lc3NpZCwJCS8qIFNJT0NHSVdFU1NJRCAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgIAkJLyogU0lPQ1NJV05JQ0tOICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgIAkJLyogU0lPQ0dJV05JQ0tOICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCQkJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkJCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfc2V0X3JhdGUsCQkvKiBTSU9DU0lXUkFURSAqLworCShpd19oYW5kbGVyKSBhdG1lbF9nZXRfcmF0ZSwJCS8qIFNJT0NHSVdSQVRFICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX3NldF9ydHMsCQkvKiBTSU9DU0lXUlRTICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX2dldF9ydHMsCQkvKiBTSU9DR0lXUlRTICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX3NldF9mcmFnLAkJLyogU0lPQ1NJV0ZSQUcgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfZ2V0X2ZyYWcsCQkvKiBTSU9DR0lXRlJBRyAqLworCShpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgIAkJLyogU0lPQ1NJV1RYUE9XICovCisJKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgIAkJLyogU0lPQ0dJV1RYUE9XICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX3NldF9yZXRyeSwJCS8qIFNJT0NTSVdSRVRSWSAqLworCShpd19oYW5kbGVyKSBhdG1lbF9nZXRfcmV0cnksCQkvKiBTSU9DR0lXUkVUUlkgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfc2V0X2VuY29kZSwJCS8qIFNJT0NTSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfZ2V0X2VuY29kZSwJCS8qIFNJT0NHSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgYXRtZWxfc2V0X3Bvd2VyLAkJLyogU0lPQ1NJV1BPV0VSICovCisJKGl3X2hhbmRsZXIpIGF0bWVsX2dldF9wb3dlciwJCS8qIFNJT0NHSVdQT1dFUiAqLworfTsKKworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlcgkJYXRtZWxfcHJpdmF0ZV9oYW5kbGVyW10gPQoreworCU5VTEwsCQkJCS8qIFNJT0NJV0ZJUlNUUFJJViAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgYXRtZWxfcHJpdl9pb2N0bCB7CisJY2hhciBpZFszMl07CisJdW5zaWduZWQgY2hhciBfX3VzZXIgKmRhdGE7CQkKKwl1bnNpZ25lZCBzaG9ydCBsZW47CQkKK30gYXRtZWxfcHJpdl9pb2N0bDsKKworCQorI2RlZmluZSBBVE1FTEZXTCBTSU9DSVdGSVJTVFBSSVYKKyNkZWZpbmUgQVRNRUxJRElGQyBBVE1FTEZXTCArIDEKKyNkZWZpbmUgQVRNRUxSRCBBVE1FTEZXTCArIDIKKyNkZWZpbmUgQVRNRUxNQUdJQyAweDUxODA3IAorI2RlZmluZSBSRUdET01BSU5TWiAyMAorCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncyBhdG1lbF9wcml2YXRlX2FyZ3NbXSA9IHsKKy8qeyBjbWQsICAgICAgICAgc2V0X2FyZ3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9hcmdzLCBuYW1lIH0gKi8KKyAgeyBBVE1FTEZXTCwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCBzaXplb2YgKGF0bWVsX3ByaXZfaW9jdGwpLCBJV19QUklWX1RZUEVfTk9ORSwgImF0bWVsZndsIiB9LAorICB7IEFUTUVMSURJRkMsIElXX1BSSVZfVFlQRV9OT05FLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImF0bWVsaWRpZmMiIH0sCisgIHsgQVRNRUxSRCwgSVdfUFJJVl9UWVBFX0NIQVIgfCBSRUdET01BSU5TWiwgSVdfUFJJVl9UWVBFX05PTkUsICJyZWdkb21haW4iIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmCWF0bWVsX2hhbmRsZXJfZGVmID0KK3sKKwkubnVtX3N0YW5kYXJkCT0gc2l6ZW9mKGF0bWVsX2hhbmRsZXIpL3NpemVvZihpd19oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGUJPSBzaXplb2YoYXRtZWxfcHJpdmF0ZV9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksIAorCS5udW1fcHJpdmF0ZV9hcmdzID0gc2l6ZW9mKGF0bWVsX3ByaXZhdGVfYXJncykvc2l6ZW9mKHN0cnVjdCBpd19wcml2X2FyZ3MpLCAKKwkuc3RhbmRhcmQJPSAoaXdfaGFuZGxlciAqKSBhdG1lbF9oYW5kbGVyLAorCS5wcml2YXRlCT0gKGl3X2hhbmRsZXIgKikgYXRtZWxfcHJpdmF0ZV9oYW5kbGVyLCAKKwkucHJpdmF0ZV9hcmdzCT0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKikgYXRtZWxfcHJpdmF0ZV9hcmdzCit9OworCitzdGF0aWMgaW50IGF0bWVsX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJaW50IGksIHJjID0gMDsKKwlzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJYXRtZWxfcHJpdl9pb2N0bCBjb207CisJc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworCXVuc2lnbmVkIGNoYXIgKm5ld19maXJtd2FyZTsKKwljaGFyIGRvbWFpbltSRUdET01BSU5TWisxXTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR0lXUFJJVjoKKwkJaWYod3JxLT51LmRhdGEucG9pbnRlcikgeworCQkJLyogU2V0IHRoZSBudW1iZXIgb2YgaW9jdGwgYXZhaWxhYmxlICovCisJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzaXplb2YoYXRtZWxfcHJpdmF0ZV9hcmdzKSAvIHNpemVvZihhdG1lbF9wcml2YXRlX2FyZ3NbMF0pOworCQkJCisJCQkvKiBDb3B5IHN0cnVjdHVyZSB0byB0aGUgdXNlciBidWZmZXIgKi8KKwkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwKKwkJCQkJICh1X2NoYXIgKikgYXRtZWxfcHJpdmF0ZV9hcmdzLAorCQkJCQkgc2l6ZW9mKGF0bWVsX3ByaXZhdGVfYXJncykpKQorCQkJCXJjID0gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQVRNRUxJRElGQzoKKwkJd3JxLT51LnBhcmFtLnZhbHVlID0gQVRNRUxNQUdJQzsJCQorCQlicmVhazsKKwkKKwljYXNlIEFUTUVMRldMOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbSwgcnEtPmlmcl9kYXRhLCBzaXplb2YoY29tKSkpIHsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQlyYyA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCEobmV3X2Zpcm13YXJlID0ga21hbGxvYyhjb20ubGVuLCBHRlBfS0VSTkVMKSkpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKG5ld19maXJtd2FyZSwgY29tLmRhdGEsIGNvbS5sZW4pKSB7CisJCQlrZnJlZShuZXdfZmlybXdhcmUpOworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocHJpdi0+ZmlybXdhcmUpCisJCQlrZnJlZShwcml2LT5maXJtd2FyZSk7CisJCQorCQlwcml2LT5maXJtd2FyZSA9IG5ld19maXJtd2FyZTsKKwkJcHJpdi0+ZmlybXdhcmVfbGVuZ3RoID0gY29tLmxlbjsKKwkJc3RybmNweShwcml2LT5maXJtd2FyZV9pZCwgY29tLmlkLCAzMSk7CisJCXByaXYtPmZpcm13YXJlX2lkWzMxXSA9ICdcMCc7CisJCWJyZWFrOworCisJY2FzZSBBVE1FTFJEOgorCQlpZiAoY29weV9mcm9tX3VzZXIoZG9tYWluLCBycS0+aWZyX2RhdGEsIFJFR0RPTUFJTlNaKSkgeworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJcmMgPSAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCisJCWRvbWFpbltSRUdET01BSU5TWl0gPSAwOworCQlyYyA9IC1FSU5WQUw7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoY2hhbm5lbF90YWJsZSkvc2l6ZW9mKGNoYW5uZWxfdGFibGVbMF0pOyBpKyspIHsKKwkJCS8qIHN0cmNhc2VjbXAgZG9lc24ndCBleGlzdCBpbiB0aGUgbGlicmFyeSAqLworCQkJY2hhciAqYSA9IGNoYW5uZWxfdGFibGVbaV0ubmFtZTsKKwkJCWNoYXIgKmIgPSBkb21haW47CisJCQl3aGlsZSAoKmEpIHsKKwkJCQljaGFyIGMxID0gKmErKzsKKwkJCQljaGFyIGMyID0gKmIrKzsKKwkJCQlpZiAodG9sb3dlcihjMSkgIT0gdG9sb3dlcihjMikpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCEqYSAmJiAhKmIpIHsKKwkJCQlwcml2LT5jb25maWdfcmVnX2RvbWFpbiA9IGNoYW5uZWxfdGFibGVbaV0ucmVnX2RvbWFpbjsKKwkJCQlyYyA9IDA7CisJCQl9CisJCX0KKwkJCisJCWlmIChyYyA9PSAwICYmICBwcml2LT5zdGF0aW9uX3N0YXRlICE9IFNUQVRJT05fU1RBVEVfRE9XTikKKwkJCXJjID0gYXRtZWxfb3BlbihkZXYpOworCQlicmVhazsKKwkJCisJZGVmYXVsdDoKKwkJcmMgPSAtRU9QTk9UU1VQUDsKKwl9CisJCisJcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgYXV0aF9ib2R5IHsKKwl1MTYgYWxnOworCXUxNiB0cmFuc19zZXE7CisJdTE2IHN0YXR1czsKKwl1OCBlbF9pZDsKKwl1OCBjaGFsbF90ZXh0X2xlbjsKKwl1OCBjaGFsbF90ZXh0WzI1M107Cit9OyAKKworc3RhdGljIHZvaWQgYXRtZWxfZW50ZXJfc3RhdGUoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIGludCBuZXdfc3RhdGUpCit7CisJaW50IG9sZF9zdGF0ZSA9IHByaXYtPnN0YXRpb25fc3RhdGU7CisJCQorCWlmIChuZXdfc3RhdGUgPT0gb2xkX3N0YXRlKQorCQlyZXR1cm47CisJCisJcHJpdi0+c3RhdGlvbl9zdGF0ZSA9IG5ld19zdGF0ZTsKKwkJCisJaWYgKG5ld19zdGF0ZSA9PSBTVEFUSU9OX1NUQVRFX1JFQURZKSB7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKHByaXYtPmRldik7CisJCW5ldGlmX2NhcnJpZXJfb24ocHJpdi0+ZGV2KTsKKwl9CisKKwlpZiAob2xkX3N0YXRlID09IFNUQVRJT05fU1RBVEVfUkVBRFkpIHsKKwkJbmV0aWZfY2Fycmllcl9vZmYocHJpdi0+ZGV2KTsKKwkJaWYgKG5ldGlmX3J1bm5pbmcocHJpdi0+ZGV2KSkKKwkJCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+ZGV2KTsKKwkJcHJpdi0+bGFzdF9iZWFjb25fdGltZXN0YW1wID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX3NjYW4oc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIGludCBzcGVjaWZpY19zc2lkKQoreworCXN0cnVjdCB7CisJCXU4IEJTU0lEWzZdOworCQl1OCBTU0lEW01BWF9TU0lEX0xFTkdUSF07CisJCXU4IHNjYW5fdHlwZTsKKwkJdTggY2hhbm5lbDsKKwkJdTE2IEJTU190eXBlOworCQl1MTYgbWluX2NoYW5uZWxfdGltZTsKKwkJdTE2IG1heF9jaGFubmVsX3RpbWU7CisJCXU4IG9wdGlvbnM7CisJCXU4IFNTSURfc2l6ZTsKKwl9IGNtZDsKKwkKKwltZW1zZXQoY21kLkJTU0lELCAweGZmLCA2KTsKKworCWlmIChwcml2LT5mYXN0X3NjYW4pIHsKKwkJY21kLlNTSURfc2l6ZSA9IHByaXYtPlNTSURfc2l6ZTsKKwkJbWVtY3B5KGNtZC5TU0lELCBwcml2LT5TU0lELCBwcml2LT5TU0lEX3NpemUpOworCQljbWQubWluX2NoYW5uZWxfdGltZSA9IGNwdV90b19sZTE2KDEwKTsKKwkJY21kLm1heF9jaGFubmVsX3RpbWUgPSBjcHVfdG9fbGUxNig1MCk7CisJfSBlbHNlIHsKKwkJcHJpdi0+QlNTX2xpc3RfZW50cmllcyA9IDA7CisJCWNtZC5TU0lEX3NpemUgPSAwOworCQljbWQubWluX2NoYW5uZWxfdGltZSA9IGNwdV90b19sZTE2KDEwKTsKKwkJY21kLm1heF9jaGFubmVsX3RpbWUgPSBjcHVfdG9fbGUxNigxMjApOworCX0KKwkKKwljbWQub3B0aW9ucyA9IDA7CisJCisJaWYgKCFzcGVjaWZpY19zc2lkKQorCQljbWQub3B0aW9ucyB8PSBTQ0FOX09QVElPTlNfU0lURV9TVVJWRVk7CisJCisJY21kLmNoYW5uZWwgPSAocHJpdi0+Y2hhbm5lbCAmIDB4N2YpOyAKKwljbWQuc2Nhbl90eXBlID0gU0NBTl9UWVBFX0FDVElWRTsKKwljbWQuQlNTX3R5cGUgPSBjcHVfdG9fbGUxNihwcml2LT5vcGVyYXRpbmdfbW9kZSA9PSBJV19NT0RFX0FESE9DID8gCisJCUJTU19UWVBFX0FEX0hPQyA6IEJTU19UWVBFX0lORlJBU1RSVUNUVVJFKTsKKwkKKwlhdG1lbF9zZW5kX2NvbW1hbmQocHJpdiwgQ01EX1NjYW4sICZjbWQsIHNpemVvZihjbWQpKTsKKworCS8qIFRoaXMgbXVzdCBjb21lIGFmdGVyIGFsbCBoYXJkd2FyZSBhY2Nlc3MgdG8gYXZvaWQgYmVpbmcgbWVzc2VkIHVwCisJICAgYnkgc3R1ZmYgaGFwcGVuaW5nIGluIGludGVycnVwdCBjb250ZXh0IGFmdGVyIHdlIGxlYXZlIFNUQVRFX0RPV04gKi8KKwlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX1NDQU5OSU5HKTsKK30KKworc3RhdGljIHZvaWQgam9pbihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IHR5cGUpCit7CisJc3RydWN0IHsKKwkJdTggQlNTSURbNl07CisJCXU4IFNTSURbTUFYX1NTSURfTEVOR1RIXTsKKwkJdTggQlNTX3R5cGU7IC8qIHRoaXMgaXMgYSBzaG9ydCBpbiBhIHNjYW4gY29tbWFuZCAtIHdlaXJkICovCisJCXU4IGNoYW5uZWw7CisJCXUxNiB0aW1lb3V0OworCQl1OCBTU0lEX3NpemU7CisJCXU4IHJlc2VydmVkOworCX0gY21kOworCisJY21kLlNTSURfc2l6ZSA9IHByaXYtPlNTSURfc2l6ZTsKKwltZW1jcHkoY21kLlNTSUQsIHByaXYtPlNTSUQsIHByaXYtPlNTSURfc2l6ZSk7CisJbWVtY3B5KGNtZC5CU1NJRCwgcHJpdi0+Q3VycmVudEJTU0lELCA2KTsKKwljbWQuY2hhbm5lbCA9IChwcml2LT5jaGFubmVsICYgMHg3Zik7CisJY21kLkJTU190eXBlID0gdHlwZTsKKwljbWQudGltZW91dCA9IGNwdV90b19sZTE2KDIwMDApOworCisgCWF0bWVsX3NlbmRfY29tbWFuZChwcml2LCBDTURfSm9pbiwgJmNtZCwgc2l6ZW9mKGNtZCkpOworfQorCisKK3N0YXRpYyB2b2lkIHN0YXJ0KHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgeworCQl1OCBCU1NJRFs2XTsKKwkJdTggU1NJRFtNQVhfU1NJRF9MRU5HVEhdOworCQl1OCBCU1NfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQl1OCBjaGFubmVsOworCQl1OCBTU0lEX3NpemU7CisJCXU4IHJlc2VydmVkWzNdOworCX0gY21kOworCisJY21kLlNTSURfc2l6ZSA9IHByaXYtPlNTSURfc2l6ZTsKKwltZW1jcHkoY21kLlNTSUQsIHByaXYtPlNTSUQsIHByaXYtPlNTSURfc2l6ZSk7CisJbWVtY3B5KGNtZC5CU1NJRCwgcHJpdi0+QlNTSUQsIDYpOworCWNtZC5CU1NfdHlwZSA9IHR5cGU7CisJY21kLmNoYW5uZWwgPSAocHJpdi0+Y2hhbm5lbCAmIDB4N2YpOworCisJYXRtZWxfc2VuZF9jb21tYW5kKHByaXYsIENNRF9TdGFydCwgJmNtZCwgc2l6ZW9mKGNtZCkpOyAKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2JlYWNvbl9wcm9iZShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IGNhcGFiaWxpdHksIHU4IGNoYW5uZWwpCit7CisJaW50IHJlam9pbiA9IDA7CisJaW50IG5ldyA9IGNhcGFiaWxpdHkgICYgQzgwMjExX01HTVRfQ0FQQUJJTElUWV9TaG9ydFByZWFtYmxlID8gCisJCVNIT1JUX1BSRUFNQkxFIDogTE9OR19QUkVBTUJMRTsKKworCWlmIChwcml2LT5wcmVhbWJsZSAhPSBuZXcpIHsKKwkJcHJpdi0+cHJlYW1ibGUgPSBuZXc7CisJCXJlam9pbiA9IDE7CisJCWF0bWVsX3NldF9taWI4KHByaXYsIExvY2FsX01pYl9UeXBlLCBMT0NBTF9NSUJfUFJFQU1CTEVfVFlQRSwgbmV3KTsKKwl9CisJCQorCWlmIChwcml2LT5jaGFubmVsICE9IGNoYW5uZWwpIHsKKwkJcHJpdi0+Y2hhbm5lbCA9IGNoYW5uZWw7CisJCXJlam9pbiA9IDE7CisJCWF0bWVsX3NldF9taWI4KHByaXYsIFBoeV9NaWJfVHlwZSwgUEhZX01JQl9DSEFOTkVMX1BPUywgY2hhbm5lbCk7CisJfQorCQorCWlmIChyZWpvaW4pIHsKKwkJcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkID0gMDsKKwkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9KT0lOTklORyk7CisJCQorCQlpZiAocHJpdi0+b3BlcmF0aW5nX21vZGUgPT0gSVdfTU9ERV9JTkZSQSkKKwkJCWpvaW4ocHJpdiwgQlNTX1RZUEVfSU5GUkFTVFJVQ1RVUkUpOworCQllbHNlIAorCQkJam9pbihwcml2LCBCU1NfVFlQRV9BRF9IT0MpOworCX0gCit9CisKKyAKK3N0YXRpYyB2b2lkIHNlbmRfYXV0aGVudGljYXRpb25fcmVxdWVzdChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTggKmNoYWxsZW5nZSwgaW50IGNoYWxsZW5nZV9sZW4pCit7CisJc3RydWN0IGllZWU4MDJfMTFfaGRyIGhlYWRlcjsKKwlzdHJ1Y3QgYXV0aF9ib2R5IGF1dGg7CisJCisJaGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDJfMTFfRlRZUEVfTUdNVCB8IElFRUU4MDJfMTFfU1RZUEVfQVVUSCk7IAorCWhlYWRlci5kdXJhdGlvbl9pZAk9IGNwdV90b19sZTE2KDB4ODAwMCk7CQorCWhlYWRlci5zZXFfY3RsID0gMDsKKwltZW1jcHkoaGVhZGVyLmFkZHIxLCBwcml2LT5DdXJyZW50QlNTSUQsIDYpOworCW1lbWNweShoZWFkZXIuYWRkcjIsIHByaXYtPmRldi0+ZGV2X2FkZHIsIDYpOworCW1lbWNweShoZWFkZXIuYWRkcjMsIHByaXYtPkN1cnJlbnRCU1NJRCwgNik7CisJCisJaWYgKHByaXYtPndlcF9pc19vbikgeworCQlhdXRoLmFsZyA9IGNwdV90b19sZTE2KEM4MDIxMV9NR01UX0FBTl9TSEFSRURLRVkpOyAKKwkJLyogbm8gV0VQIGZvciBhdXRoZW50aWNhdGlvbiBmcmFtZXMgd2l0aCBUclNlcU5vIDEgKi8KKwkJaWYgKHByaXYtPkN1cnJlbnRBdXRoZW50VHJhbnNhY3Rpb25TZXFOdW0gIT0gMSkKKwkJCWhlYWRlci5mcmFtZV9jdGwgfD0gIGNwdV90b19sZTE2KElFRUU4MDJfMTFfRkNUTF9XRVApOyAKKwl9IGVsc2UgeworCQlhdXRoLmFsZyA9IGNwdV90b19sZTE2KEM4MDIxMV9NR01UX0FBTl9PUEVOU1lTVEVNKTsKKwl9CisKKwlhdXRoLnN0YXR1cyA9IDA7CisJYXV0aC50cmFuc19zZXEgPSBjcHVfdG9fbGUxNihwcml2LT5DdXJyZW50QXV0aGVudFRyYW5zYWN0aW9uU2VxTnVtKTsKKwlwcml2LT5FeHBlY3RlZEF1dGhlbnRUcmFuc2FjdGlvblNlcU51bSA9IHByaXYtPkN1cnJlbnRBdXRoZW50VHJhbnNhY3Rpb25TZXFOdW0rMTsgCisJcHJpdi0+Q3VycmVudEF1dGhlbnRUcmFuc2FjdGlvblNlcU51bSArPSAyOworCQorCWlmIChjaGFsbGVuZ2VfbGVuICE9IDApCXsKKwkJYXV0aC5lbF9pZCA9IDE2OyAvKiBjaGFsbGVuZ2VfdGV4dCAqLworCQlhdXRoLmNoYWxsX3RleHRfbGVuID0gY2hhbGxlbmdlX2xlbjsKKwkJbWVtY3B5KGF1dGguY2hhbGxfdGV4dCwgY2hhbGxlbmdlLCBjaGFsbGVuZ2VfbGVuKTsKKwkJYXRtZWxfdHJhbnNtaXRfbWFuYWdlbWVudF9mcmFtZShwcml2LCAmaGVhZGVyLCAodTggKikmYXV0aCwgOCArIGNoYWxsZW5nZV9sZW4pOworCX0gZWxzZSB7CisJCWF0bWVsX3RyYW5zbWl0X21hbmFnZW1lbnRfZnJhbWUocHJpdiwgJmhlYWRlciwgKHU4ICopJmF1dGgsIDYpOworCX0KK30KKworc3RhdGljIHZvaWQgc2VuZF9hc3NvY2lhdGlvbl9yZXF1ZXN0KHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBpbnQgaXNfcmVhc3NvYykKK3sKKwl1OCAqc3NpZF9lbF9wOworCWludCBib2R5c2l6ZTsKKwlzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIgaGVhZGVyOworCXN0cnVjdCBhc3NfcmVxX2Zvcm1hdCB7CisJCXUxNiBjYXBhYmlsaXR5OworCQl1MTYgbGlzdGVuX2ludGVydmFsOyAKKwkJdTggYXBbNl07IC8qIG5vdGhpbmcgYWZ0ZXIgaGVyZSBkaXJlY3RseSBhY2Nlc3NpYmxlICovCisJCXU4IHNzaWRfZWxfaWQ7CisJCXU4IHNzaWRfbGVuOworCQl1OCBzc2lkW01BWF9TU0lEX0xFTkdUSF07CisJCXU4IHN1cF9yYXRlc19lbF9pZDsKKwkJdTggc3VwX3JhdGVzX2xlbjsKKwkJdTggcmF0ZXNbNF07CisJfSBib2R5OworCQkKKwloZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMl8xMV9GVFlQRV9NR01UIHwgCisJCShpc19yZWFzc29jID8gSUVFRTgwMl8xMV9TVFlQRV9SRUFTU09DX1JFUSA6IElFRUU4MDJfMTFfU1RZUEVfQVNTT0NfUkVRKSk7CisJaGVhZGVyLmR1cmF0aW9uX2lkID0gY3B1X3RvX2xlMTYoMHg4MDAwKTsKKwloZWFkZXIuc2VxX2N0bCA9IDA7CisKKwltZW1jcHkoaGVhZGVyLmFkZHIxLCBwcml2LT5DdXJyZW50QlNTSUQsIDYpOyAKKwltZW1jcHkoaGVhZGVyLmFkZHIyLCBwcml2LT5kZXYtPmRldl9hZGRyLCA2KTsKKwltZW1jcHkoaGVhZGVyLmFkZHIzLCBwcml2LT5DdXJyZW50QlNTSUQsIDYpOyAKKworCWJvZHkuY2FwYWJpbGl0eSA9IGNwdV90b19sZTE2KEM4MDIxMV9NR01UX0NBUEFCSUxJVFlfRVNTKTsKKwlpZiAocHJpdi0+d2VwX2lzX29uKQorCQlib2R5LmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoQzgwMjExX01HTVRfQ0FQQUJJTElUWV9Qcml2YWN5KTsKKwlpZiAocHJpdi0+cHJlYW1ibGUgPT0gU0hPUlRfUFJFQU1CTEUpCisJCWJvZHkuY2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihDODAyMTFfTUdNVF9DQVBBQklMSVRZX1Nob3J0UHJlYW1ibGUpOworCisJYm9keS5saXN0ZW5faW50ZXJ2YWwgPSBjcHVfdG9fbGUxNihwcml2LT5saXN0ZW5faW50ZXJ2YWwgKiBwcml2LT5iZWFjb25fcGVyaW9kKTsKKwkKKwkvKiBjdXJyZW50IEFQIGFkZHJlc3MgLSBvbmx5IGluIHJlYXNzb2MgZnJhbWUgKi8KKwlpZiAoaXNfcmVhc3NvYykgeworCQltZW1jcHkoYm9keS5hcCwgIHByaXYtPkN1cnJlbnRCU1NJRCwgNik7CisJCXNzaWRfZWxfcCA9ICh1OCAqKSZib2R5LnNzaWRfZWxfaWQ7CisJCWJvZHlzaXplID0gMTggKyBwcml2LT5TU0lEX3NpemU7CisJfSBlbHNlIHsKKwkJc3NpZF9lbF9wID0gKHU4ICopJmJvZHkuYXBbMF07CisJCWJvZHlzaXplID0gMTIgKyBwcml2LT5TU0lEX3NpemU7CisJfQorCQkKKwlzc2lkX2VsX3BbMF09IEM4MDIxMV9NR01UX0VsZW1lbnRJRF9TU0lEOworCXNzaWRfZWxfcFsxXSA9IHByaXYtPlNTSURfc2l6ZTsKKwltZW1jcHkoc3NpZF9lbF9wICsgMiwgcHJpdi0+U1NJRCwgcHJpdi0+U1NJRF9zaXplKTsKKwlzc2lkX2VsX3BbMiArIHByaXYtPlNTSURfc2l6ZV0gPSBDODAyMTFfTUdNVF9FbGVtZW50SURfU3VwcG9ydGVkUmF0ZXM7CisJc3NpZF9lbF9wWzMgKyBwcml2LT5TU0lEX3NpemVdID0gNDsgLyogbGVuIG9mIHN1cG9ydGVkIHJhdGVzICovCisJbWVtY3B5KHNzaWRfZWxfcCArIDQgKyBwcml2LT5TU0lEX3NpemUsIGF0bWVsX2Jhc2ljX3JhdGVzLCA0KTsKKworCWF0bWVsX3RyYW5zbWl0X21hbmFnZW1lbnRfZnJhbWUocHJpdiwgJmhlYWRlciwgKHZvaWQgKikmYm9keSwgYm9keXNpemUpOworfQorCitzdGF0aWMgaW50IGlzX2ZyYW1lX2Zyb21fY3VycmVudF9ic3Moc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHN0cnVjdCBpZWVlODAyXzExX2hkciAqaGVhZGVyKQoreworCWlmIChsZTE2X3RvX2NwdShoZWFkZXItPmZyYW1lX2N0bCkgJiBJRUVFODAyXzExX0ZDVExfRlJPTURTKQorCQlyZXR1cm4gbWVtY21wKGhlYWRlci0+YWRkcjMsIHByaXYtPkN1cnJlbnRCU1NJRCwgNikgPT0gMDsKKwllbHNlCisJCXJldHVybiBtZW1jbXAoaGVhZGVyLT5hZGRyMiwgcHJpdi0+Q3VycmVudEJTU0lELCA2KSA9PSAwOworfQorCitzdGF0aWMgaW50IHJldHJpZXZlX2JzcyhzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdikKK3sKKwlpbnQgaTsKKwlpbnQgbWF4X3Jzc2kgPSAtMTI4OworCWludCBtYXhfaW5kZXggPSAtMTsKKwkKKwlpZiAocHJpdi0+QlNTX2xpc3RfZW50cmllcyA9PSAwKQorCQlyZXR1cm4gLTE7CisJCQkKKwlpZiAocHJpdi0+Y29ubmVjdF90b19hbnlfQlNTKSB7CisJCS8qIFNlbGVjdCBhIEJTUyB3aXRoIHRoZSBtYXgtUlNTSSBidXQgb2YgdGhlIHNhbWUgdHlwZSBhbmQgb2YgdGhlIHNhbWUgV0VQIG1vZGUKKwkJICAgYW5kIHRoYXQgaXQgaXMgbm90IG1hcmtlZCBhcyAnYmFkJyAoaS5lLiB3ZSBoYWQgcHJldmlvdXNseSBmYWlsZWQgdG8gY29ubmVjdCB0bworCQkgICB0aGlzIEJTUyB3aXRoIHRoZSBzZXR0aW5ncyB0aGF0IHdlIGN1cnJlbnRseSB1c2UpICovCisJCXByaXYtPmN1cnJlbnRfQlNTID0gMDsKKwkJZm9yKGk9MDsgaTxwcml2LT5CU1NfbGlzdF9lbnRyaWVzOyBpKyspIHsgCisJCQlpZiAocHJpdi0+b3BlcmF0aW5nX21vZGUgPT0gcHJpdi0+QlNTaW5mb1tpXS5CU1N0eXBlICYmCisJCQkgICAgKCghcHJpdi0+d2VwX2lzX29uICYmICFwcml2LT5CU1NpbmZvW2ldLlVzaW5nV0VQKSB8fCAKKwkJCSAgICAgKHByaXYtPndlcF9pc19vbiAmJiBwcml2LT5CU1NpbmZvW2ldLlVzaW5nV0VQKSkgJiYKKwkJCSAgICAhKHByaXYtPkJTU2luZm9baV0uY2hhbm5lbCAmIDB4ODApKSB7CisJCQkJbWF4X3Jzc2kgPSBwcml2LT5CU1NpbmZvW2ldLlJTU0k7CisJCQkJcHJpdi0+Y3VycmVudF9CU1MgPSBtYXhfaW5kZXggPSBpOworCQkJfQorCQkJCisJCX0KKwkJcmV0dXJuIG1heF9pbmRleDsKKwl9CisJCQorCWZvcihpPTA7IGk8cHJpdi0+QlNTX2xpc3RfZW50cmllczsgaSsrKSB7CisJCWlmIChwcml2LT5TU0lEX3NpemUgPT0gcHJpdi0+QlNTaW5mb1tpXS5TU0lEc2l6ZSAmJgorCQkgICAgbWVtY21wKHByaXYtPlNTSUQsIHByaXYtPkJTU2luZm9baV0uU1NJRCwgcHJpdi0+U1NJRF9zaXplKSA9PSAwICYmCisJCSAgICBwcml2LT5vcGVyYXRpbmdfbW9kZSA9PSBwcml2LT5CU1NpbmZvW2ldLkJTU3R5cGUgJiYKKwkJICAgIGF0bWVsX3ZhbGlkYXRlX2NoYW5uZWwocHJpdiwgcHJpdi0+QlNTaW5mb1tpXS5jaGFubmVsKSA9PSAwKSB7CisJCQlpZiAocHJpdi0+QlNTaW5mb1tpXS5SU1NJID49IG1heF9yc3NpKSB7CisJCQkJbWF4X3Jzc2kgPSBwcml2LT5CU1NpbmZvW2ldLlJTU0k7CisJCQkJbWF4X2luZGV4ID0gaTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gbWF4X2luZGV4OworfQorCisKK3N0YXRpYyB2b2lkIHN0b3JlX2Jzc19pbmZvKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCBzdHJ1Y3QgaWVlZTgwMl8xMV9oZHIgKmhlYWRlciwKKwkJCSAgIHUxNiBjYXBhYmlsaXR5LCB1MTYgYmVhY29uX3BlcmlvZCwgdTggY2hhbm5lbCwgdTggcnNzaSwgCisJCQkgICB1OCBzc2lkX2xlbiwgdTggKnNzaWQsIGludCBpc19iZWFjb24pCit7CisJdTggKmJzcyA9IGNhcGFiaWxpdHkgJiBDODAyMTFfTUdNVF9DQVBBQklMSVRZX0VTUyA/IGhlYWRlci0+YWRkcjIgOiBoZWFkZXItPmFkZHIzOworCWludCBpLCBpbmRleDsKKwkJCisJZm9yIChpbmRleCA9IC0xLCBpID0gMDsgaSA8IHByaXYtPkJTU19saXN0X2VudHJpZXM7IGkrKykgCisJCWlmIChtZW1jbXAoYnNzLCBwcml2LT5CU1NpbmZvW2ldLkJTU0lELCA2KSA9PSAwKSAKKwkJCWluZGV4ID0gaTsKKworICAgICAgICAvKiBJZiB3ZSBwcm9jZXNzIGEgcHJvYmUgYW5kIGFuIGVudHJ5IGZyb20gdGhpcyBCU1MgZXhpc3RzIAorCSAgIHdlIHdpbGwgdXBkYXRlIHRoZSBCU1MgZW50cnkgd2l0aCB0aGUgaW5mbyBmcm9tIHRoaXMgQlNTLgorCSAgIElmIHdlIHByb2Nlc3MgYSBiZWFjb24gd2Ugd2lsbCBvbmx5IHVwZGF0ZSBSU1NJICovCisKKwlpZiAoaW5kZXggPT0gLTEpIHsKKwkJaWYgKHByaXYtPkJTU19saXN0X2VudHJpZXMgPT0gTUFYX0JTU19FTlRSSUVTKQorCQkJcmV0dXJuOworCQlpbmRleCA9IHByaXYtPkJTU19saXN0X2VudHJpZXMrKzsKKwkJbWVtY3B5KHByaXYtPkJTU2luZm9baW5kZXhdLkJTU0lELCBic3MsIDYpOworCQlwcml2LT5CU1NpbmZvW2luZGV4XS5SU1NJID0gcnNzaTsKKwl9IGVsc2UgeworCQlpZiAocnNzaSA+IHByaXYtPkJTU2luZm9baW5kZXhdLlJTU0kpCisJCQlwcml2LT5CU1NpbmZvW2luZGV4XS5SU1NJID0gcnNzaTsKKwkJaWYgKGlzX2JlYWNvbikKKwkJCXJldHVybjsKKwl9CisKKwlwcml2LT5CU1NpbmZvW2luZGV4XS5jaGFubmVsID0gY2hhbm5lbDsKKwlwcml2LT5CU1NpbmZvW2luZGV4XS5iZWFjb25fcGVyaW9kID0gYmVhY29uX3BlcmlvZDsKKwlwcml2LT5CU1NpbmZvW2luZGV4XS5Vc2luZ1dFUCA9IGNhcGFiaWxpdHkgJiBDODAyMTFfTUdNVF9DQVBBQklMSVRZX1ByaXZhY3k7CisJbWVtY3B5KHByaXYtPkJTU2luZm9baW5kZXhdLlNTSUQsIHNzaWQsIHNzaWRfbGVuKTsKKwlwcml2LT5CU1NpbmZvW2luZGV4XS5TU0lEc2l6ZSA9IHNzaWRfbGVuOworCisJaWYgKGNhcGFiaWxpdHkgJiBDODAyMTFfTUdNVF9DQVBBQklMSVRZX0lCU1MpCisJCXByaXYtPkJTU2luZm9baW5kZXhdLkJTU3R5cGUgPSBJV19NT0RFX0FESE9DOworCWVsc2UgaWYgKGNhcGFiaWxpdHkgJiBDODAyMTFfTUdNVF9DQVBBQklMSVRZX0VTUykKKwkJcHJpdi0+QlNTaW5mb1tpbmRleF0uQlNTdHlwZSA9SVdfTU9ERV9JTkZSQTsKKwkKKwlwcml2LT5CU1NpbmZvW2luZGV4XS5wcmVhbWJsZSA9IGNhcGFiaWxpdHkgICYgQzgwMjExX01HTVRfQ0FQQUJJTElUWV9TaG9ydFByZWFtYmxlID8gCisJCVNIT1JUX1BSRUFNQkxFIDogTE9OR19QUkVBTUJMRTsKK30KKworc3RhdGljIHZvaWQgYXV0aGVudGljYXRlKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1MTYgZnJhbWVfbGVuKQoreworCXN0cnVjdCBhdXRoX2JvZHkgKmF1dGggPSAoc3RydWN0IGF1dGhfYm9keSAqKXByaXYtPnJ4X2J1ZjsKKwl1MTYgc3RhdHVzID0gbGUxNl90b19jcHUoYXV0aC0+c3RhdHVzKTsKKwl1MTYgdHJhbnNfc2VxX25vID0gbGUxNl90b19jcHUoYXV0aC0+dHJhbnNfc2VxKTsKKwkKKwlpZiAoc3RhdHVzID09IEM4MDIxMV9NR01UX1NDX1N1Y2Nlc3MgJiYgIXByaXYtPndlcF9pc19vbikgeyAKKwkJLyogbm8gV0VQICovCisJCWlmIChwcml2LT5zdGF0aW9uX3dhc19hc3NvY2lhdGVkKSB7CisJCQlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX1JFQVNTT0NJQVRJTkcpOworCQkJc2VuZF9hc3NvY2lhdGlvbl9yZXF1ZXN0KHByaXYsIDEpOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9BU1NPQ0lBVElORyk7CisJCQlzZW5kX2Fzc29jaWF0aW9uX3JlcXVlc3QocHJpdiwgMCk7CisJCQlyZXR1cm47CisJCX0gCisJfQorCQkKKwlpZiAoc3RhdHVzID09IEM4MDIxMV9NR01UX1NDX1N1Y2Nlc3MgJiYgcHJpdi0+d2VwX2lzX29uKSB7IAorCQkvKiBXRVAgKi8KKwkJaWYgKHRyYW5zX3NlcV9ubyAhPSBwcml2LT5FeHBlY3RlZEF1dGhlbnRUcmFuc2FjdGlvblNlcU51bSkKKwkJCXJldHVybjsKKwkJCQkKKwkJaWYgKHRyYW5zX3NlcV9ubyA9PSAweDAwMDIgJiYKKwkJICAgIGF1dGgtPmVsX2lkID09IEM4MDIxMV9NR01UX0VsZW1lbnRJRF9DaGFsbGVuZ2VUZXh0KSB7CisJCQlzZW5kX2F1dGhlbnRpY2F0aW9uX3JlcXVlc3QocHJpdiwgYXV0aC0+Y2hhbGxfdGV4dCwgYXV0aC0+Y2hhbGxfdGV4dF9sZW4pOworCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAodHJhbnNfc2VxX25vID09IDB4MDAwNCkgeworCQkJaWYocHJpdi0+c3RhdGlvbl93YXNfYXNzb2NpYXRlZCkgeworCQkJCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfUkVBU1NPQ0lBVElORyk7CisJCQkJc2VuZF9hc3NvY2lhdGlvbl9yZXF1ZXN0KHByaXYsIDEpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSB7CisJCQkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9BU1NPQ0lBVElORyk7CisJCQkJc2VuZF9hc3NvY2lhdGlvbl9yZXF1ZXN0KHByaXYsIDApOworCQkJCXJldHVybjsKKwkJCX0gCisJCX0KKwl9CQkJCisJCisJaWYgKHN0YXR1cyA9PSBDODAyMTFfTUdNVF9TQ19BdXRoQWxnTm90U3VwcG9ydGVkICYmIHByaXYtPmNvbm5lY3RfdG9fYW55X0JTUykgeworCQlpbnQgYnNzX2luZGV4OworCQkKKwkJcHJpdi0+QlNTaW5mb1soaW50KShwcml2LT5jdXJyZW50X0JTUyldLmNoYW5uZWwgfD0gMHg4MDsKKwkJCisJCWlmICgoYnNzX2luZGV4ICA9IHJldHJpZXZlX2Jzcyhwcml2KSkgIT0gLTEpIHsKKwkJCWF0bWVsX2pvaW5fYnNzKHByaXYsIGJzc19pbmRleCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJCisJCisJcHJpdi0+QXV0aGVudGljYXRpb25SZXF1ZXN0UmV0cnlDbnQgPSAwOworCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsICBTVEFUSU9OX1NUQVRFX01HTVRfRVJST1IpOworCXByaXYtPnN0YXRpb25faXNfYXNzb2NpYXRlZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGFzc29jaWF0ZShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTE2IGZyYW1lX2xlbiwgdTE2IHN1YnR5cGUpCit7CisJc3RydWN0IGFzc19yZXNwX2Zvcm1hdCB7CisJCXUxNiBjYXBhYmlsaXR5OworCQl1MTYgc3RhdHVzOworCQl1MTYgYXNzX2lkOworCQl1OCBlbF9pZDsKKwkJdTggbGVuZ3RoOworCQl1OCByYXRlc1s0XTsKKwl9ICphc3NfcmVzcCA9IChzdHJ1Y3QgYXNzX3Jlc3BfZm9ybWF0ICopcHJpdi0+cnhfYnVmOworCQorICAgICAgIAl1MTYgc3RhdHVzID0gbGUxNl90b19jcHUoYXNzX3Jlc3AtPnN0YXR1cyk7CisJdTE2IGFzc19pZCA9IGxlMTZfdG9fY3B1KGFzc19yZXNwLT5hc3NfaWQpOworICAgCXUxNiByYXRlc19sZW4gPSBhc3NfcmVzcC0+bGVuZ3RoID4gNCA/IDQgOiBhc3NfcmVzcC0+bGVuZ3RoOworCQorCWlmIChmcmFtZV9sZW4gPCA4ICsgcmF0ZXNfbGVuKQorCQlyZXR1cm47CisJCisJaWYgKHN0YXR1cyA9PSBDODAyMTFfTUdNVF9TQ19TdWNjZXNzKSB7CisJCWlmIChzdWJ0eXBlID09IEM4MDIxMV9TVUJUWVBFX01HTVRfQVNTX1JFU1BPTlNFKQorCQkJcHJpdi0+QXNzb2NpYXRpb25SZXF1ZXN0UmV0cnlDbnQgPSAwOworCQllbHNlCisJCQlwcml2LT5SZUFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250ID0gMDsKKwkJCisJCWF0bWVsX3NldF9taWIxNihwcml2LCBNYWNfTWdtdF9NaWJfVHlwZSwgTUFDX01HTVRfTUlCX1NUQVRJT05fSURfUE9TLCBhc3NfaWQgJiAweDNmZmYpOworCQlhdG1lbF9zZXRfbWliKHByaXYsIFBoeV9NaWJfVHlwZSwgUEhZX01JQl9SQVRFX1NFVF9QT1MsIGFzc19yZXNwLT5yYXRlcywgcmF0ZXNfbGVuKTsKKwkJaWYgKHByaXYtPnBvd2VyX21vZGUgPT0gMCkgeworCQkJcHJpdi0+bGlzdGVuX2ludGVydmFsID0gMTsKKwkJCWF0bWVsX3NldF9taWI4KHByaXYsIE1hY19NZ210X01pYl9UeXBlLCBNQUNfTUdNVF9NSUJfUFNfTU9ERV9QT1MsICBBQ1RJVkVfTU9ERSk7CisJCQlhdG1lbF9zZXRfbWliMTYocHJpdiwgTWFjX01nbXRfTWliX1R5cGUsIE1BQ19NR01UX01JQl9MSVNURU5fSU5URVJWQUxfUE9TLCAxKTsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPmxpc3Rlbl9pbnRlcnZhbCA9IDI7CisJCQlhdG1lbF9zZXRfbWliOChwcml2LCBNYWNfTWdtdF9NaWJfVHlwZSwgTUFDX01HTVRfTUlCX1BTX01PREVfUE9TLCAgUFNfTU9ERSk7CisJCQlhdG1lbF9zZXRfbWliMTYocHJpdiwgTWFjX01nbXRfTWliX1R5cGUsIE1BQ19NR01UX01JQl9MSVNURU5fSU5URVJWQUxfUE9TLCAyKTsKKwkJfQorCQkKKwkJcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkID0gMTsKKwkJcHJpdi0+c3RhdGlvbl93YXNfYXNzb2NpYXRlZCA9IDE7CisJCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfUkVBRFkpOworCQlyZXR1cm47CisJfQorCQorCWlmIChzdWJ0eXBlID09IEM4MDIxMV9TVUJUWVBFX01HTVRfQVNTX1JFU1BPTlNFICYmCisJICAgIHN0YXR1cyAhPSBDODAyMTFfTUdNVF9TQ19Bc3NEZW5pZWRCU1NSYXRlICYmCisJICAgIHN0YXR1cyAhPSBDODAyMTFfTUdNVF9TQ19TdXBwb3J0Q2FwYWJpbGl0aWVzICYmCisJICAgIHByaXYtPkFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250IDwgTUFYX0FTU09DSUFUSU9OX1JFVFJJRVMpIHsKKwkJbW9kX3RpbWVyKCZwcml2LT5tYW5hZ2VtZW50X3RpbWVyLCBqaWZmaWVzICsgTUdNVF9KSUZGSUVTKTsKKwkJcHJpdi0+QXNzb2NpYXRpb25SZXF1ZXN0UmV0cnlDbnQrKzsKKwkJc2VuZF9hc3NvY2lhdGlvbl9yZXF1ZXN0KHByaXYsIDApOworCQlyZXR1cm47CisJfQorCQkKKwlpZiAoc3VidHlwZSA9PSBDODAyMTFfU1VCVFlQRV9NR01UX1JFQVNTX1JFU1BPTlNFICYmCisJICAgIHN0YXR1cyAhPSBDODAyMTFfTUdNVF9TQ19Bc3NEZW5pZWRCU1NSYXRlICYmCisJICAgIHN0YXR1cyAhPSBDODAyMTFfTUdNVF9TQ19TdXBwb3J0Q2FwYWJpbGl0aWVzICYmCisJICAgIHByaXYtPkFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250IDwgTUFYX0FTU09DSUFUSU9OX1JFVFJJRVMpIHsKKwkJbW9kX3RpbWVyKCZwcml2LT5tYW5hZ2VtZW50X3RpbWVyLCBqaWZmaWVzICsgTUdNVF9KSUZGSUVTKTsKKwkJcHJpdi0+UmVBc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCsrOworCQlzZW5kX2Fzc29jaWF0aW9uX3JlcXVlc3QocHJpdiwgMSk7CisJCXJldHVybjsKKwl9CisJCisJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgIFNUQVRJT05fU1RBVEVfTUdNVF9FUlJPUik7CisJcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkID0gMDsKKwkKKwlpZihwcml2LT5jb25uZWN0X3RvX2FueV9CU1MpIHsKKwkJaW50IGJzc19pbmRleDsKKwkJcHJpdi0+QlNTaW5mb1soaW50KShwcml2LT5jdXJyZW50X0JTUyldLmNoYW5uZWwgfD0gMHg4MDsKKwkJCisJCWlmICgoYnNzX2luZGV4ID0gcmV0cmlldmVfYnNzKHByaXYpKSAhPSAtMSkgCisJCQlhdG1lbF9qb2luX2Jzcyhwcml2LCBic3NfaW5kZXgpOworCQkKKwl9Cit9CisKK3ZvaWQgYXRtZWxfam9pbl9ic3Moc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIGludCBic3NfaW5kZXgpCit7CisJc3RydWN0IGJzc19pbmZvICpic3MgPSAgJnByaXYtPkJTU2luZm9bYnNzX2luZGV4XTsKKworCW1lbWNweShwcml2LT5DdXJyZW50QlNTSUQsIGJzcy0+QlNTSUQsIDYpOworCW1lbWNweShwcml2LT5TU0lELCBic3MtPlNTSUQsIHByaXYtPlNTSURfc2l6ZSA9IGJzcy0+U1NJRHNpemUpOworCisJLyogVGhlIFdQQSBzdHVmZiBjYXJlcyBhYm91dCB0aGUgY3VycmVudCBBUCBhZGRyZXNzICovCisJaWYgKHByaXYtPnVzZV93cGEpCisJCWJ1aWxkX3dwYV9taWIocHJpdik7CisJCisJLyogV2hlbiBzd2l0Y2hpbmcgdG8gQWRIb2MgdHVybiBPRkYgUG93ZXIgU2F2ZSBpZiBuZWVkZWQgKi8KKworCWlmIChic3MtPkJTU3R5cGUgPT0gSVdfTU9ERV9BREhPQyAmJgorCSAgICBwcml2LT5vcGVyYXRpbmdfbW9kZSAhPSBJV19NT0RFX0FESE9DICYmCisJICAgIHByaXYtPnBvd2VyX21vZGUpIHsKKwkJcHJpdi0+cG93ZXJfbW9kZSA9IDA7CisJCXByaXYtPmxpc3Rlbl9pbnRlcnZhbCA9IDE7CisJCWF0bWVsX3NldF9taWI4KHByaXYsIE1hY19NZ210X01pYl9UeXBlLCBNQUNfTUdNVF9NSUJfUFNfTU9ERV9QT1MsICBBQ1RJVkVfTU9ERSk7CisJCWF0bWVsX3NldF9taWIxNihwcml2LCBNYWNfTWdtdF9NaWJfVHlwZSwgTUFDX01HTVRfTUlCX0xJU1RFTl9JTlRFUlZBTF9QT1MsIDEpOworCX0KKwkJCisJcHJpdi0+b3BlcmF0aW5nX21vZGUgPSBic3MtPkJTU3R5cGU7CisJcHJpdi0+Y2hhbm5lbCA9IGJzcy0+Y2hhbm5lbCAmIDB4N2Y7IAkKKwlwcml2LT5iZWFjb25fcGVyaW9kID0gYnNzLT5iZWFjb25fcGVyaW9kOworCQorCWlmIChwcml2LT5wcmVhbWJsZSAhPSBic3MtPnByZWFtYmxlKSB7CisJCXByaXYtPnByZWFtYmxlID0gYnNzLT5wcmVhbWJsZTsKKwkJYXRtZWxfc2V0X21pYjgocHJpdiwgTG9jYWxfTWliX1R5cGUsIExPQ0FMX01JQl9QUkVBTUJMRV9UWVBFLCBic3MtPnByZWFtYmxlKTsKKwl9CisJCisJaWYgKCFwcml2LT53ZXBfaXNfb24gJiYgYnNzLT5Vc2luZ1dFUCkgeworCQlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX01HTVRfRVJST1IpOworCQlwcml2LT5zdGF0aW9uX2lzX2Fzc29jaWF0ZWQgPSAwOworCQlyZXR1cm47CisJfQorCQkKKwlpZiAocHJpdi0+d2VwX2lzX29uICYmICFic3MtPlVzaW5nV0VQKSB7CisJCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfTUdNVF9FUlJPUik7CisJCXByaXYtPnN0YXRpb25faXNfYXNzb2NpYXRlZCA9IDA7CisJCXJldHVybjsKKwl9CisKKwlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX0pPSU5OSU5HKTsKKwkKKwlpZiAocHJpdi0+b3BlcmF0aW5nX21vZGUgPT0gSVdfTU9ERV9JTkZSQSkKKwkJam9pbihwcml2LCBCU1NfVFlQRV9JTkZSQVNUUlVDVFVSRSk7CisJZWxzZSAKKwkJam9pbihwcml2LCBCU1NfVFlQRV9BRF9IT0MpOworfQorCisKK3N0YXRpYyB2b2lkIHJlc3RhcnRfc2VhcmNoKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KQoreworCWludCBic3NfaW5kZXg7CisJCisJaWYgKCFwcml2LT5jb25uZWN0X3RvX2FueV9CU1MpIHsKKwkJYXRtZWxfc2Nhbihwcml2LCAxKTsKKwl9IGVsc2UgeworCQlwcml2LT5CU1NpbmZvWyhpbnQpKHByaXYtPmN1cnJlbnRfQlNTKV0uY2hhbm5lbCB8PSAweDgwOworCQkKKwkJaWYgKChic3NfaW5kZXggPSByZXRyaWV2ZV9ic3MocHJpdikpICE9IC0xKSAKKwkJCWF0bWVsX2pvaW5fYnNzKHByaXYsIGJzc19pbmRleCk7CisJCWVsc2UKKwkJCWF0bWVsX3NjYW4ocHJpdiwgMCk7CisJCQorCX0gCit9CQorCitzdGF0aWMgdm9pZCBzbW9vdGhfcnNzaShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTggcnNzaSkKK3sKKwl1OCBvbGQgPSBwcml2LT53c3RhdHMucXVhbC5sZXZlbDsKKwl1OCBtYXhfcnNzaSA9IDQyOyAvKiA1MDItcm1mZC1yZXZkIG1heCBieSBleHBlcmltZW50LCBkZWZhdWx0IGZvciBub3cgKi8KKworCXN3aXRjaCAocHJpdi0+ZmlybXdhcmVfdHlwZSkgeworCQljYXNlIEFUTUVMX0ZXX1RZUEVfNTAyRToKKwkJCW1heF9yc3NpID0gNjM7IC8qIDUwMi1ybWZkLXJldmUgbWF4IGJ5IGV4cGVyaW1lbnQgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJcnNzaSA9IHJzc2kgKiAxMDAgLyBtYXhfcnNzaTsKKwlpZigocnNzaSArIG9sZCkgJSAyKQorCQlwcml2LT53c3RhdHMucXVhbC5sZXZlbCA9ICAoKHJzc2kgKyBvbGQpLzIpICsgMTsKKwllbHNlCisJCXByaXYtPndzdGF0cy5xdWFsLmxldmVsID0gICgocnNzaSArIG9sZCkvMik7CQkKKwlwcml2LT53c3RhdHMucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfTEVWRUxfVVBEQVRFRDsKKwlwcml2LT53c3RhdHMucXVhbC51cGRhdGVkICY9IH5JV19RVUFMX0xFVkVMX0lOVkFMSUQ7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX3Ntb290aF9xdWFsKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KQoreworCXVuc2lnbmVkIGxvbmcgdGltZV9kaWZmID0gKGppZmZpZXMgLSBwcml2LT5sYXN0X3F1YWwpL0haOworCXdoaWxlICh0aW1lX2RpZmYtLSkgeworCQlwcml2LT5sYXN0X3F1YWwgKz0gSFo7CisJCXByaXYtPndzdGF0cy5xdWFsLnF1YWwgPSBwcml2LT53c3RhdHMucXVhbC5xdWFsLzI7CisJCXByaXYtPndzdGF0cy5xdWFsLnF1YWwgKz0gCisJCQlwcml2LT5iZWFjb25zX3RoaXNfc2VjICogcHJpdi0+YmVhY29uX3BlcmlvZCAqIChwcml2LT53c3RhdHMucXVhbC5sZXZlbCArIDEwMCkgLyA0MDAwOworCQlwcml2LT5iZWFjb25zX3RoaXNfc2VjID0gMDsKKwl9CisJcHJpdi0+d3N0YXRzLnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX1FVQUxfVVBEQVRFRDsKKwlwcml2LT53c3RhdHMucXVhbC51cGRhdGVkICY9IH5JV19RVUFMX1FVQUxfSU5WQUxJRDsKK30KKworLyogZGVhbHMgd2l0aCBpbmNvbWluZyBtYW5hZ21lbnQgZnJhbWVzLiAqLworc3RhdGljIHZvaWQgYXRtZWxfbWFuYWdlbWVudF9mcmFtZShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IGllZWU4MDJfMTFfaGRyICpoZWFkZXIsIAorCQkgICAgICB1MTYgZnJhbWVfbGVuLCB1OCByc3NpKQoreworCXUxNiBzdWJ0eXBlOworCQorCXN3aXRjaCAoc3VidHlwZSA9IGxlMTZfdG9fY3B1KGhlYWRlci0+ZnJhbWVfY3RsKSAmIElFRUU4MDJfMTFfRkNUTF9TVFlQRSkgeworCWNhc2UgQzgwMjExX1NVQlRZUEVfTUdNVF9CRUFDT04gOgorCWNhc2UgQzgwMjExX1NVQlRZUEVfTUdNVF9Qcm9iZVJlc3BvbnNlOgorCQkKKwkJLyogYmVhY29uIGZyYW1lIGhhcyBtdWx0aXBsZSB2YXJpYWJsZS1sZW5ndGggZmllbGRzIC0KKwkJICAgbmV2ZXIgbGV0IGFuIGVuZ2luZWVyIGxvb3NlIHdpdGggYSBkYXRhIHN0cnVjdHVyZSBkZXNpZ24uICovCisJCXsKKwkJCXN0cnVjdCBiZWFjb25fZm9ybWF0IHsKKwkJCQl1NjQgdGltZXN0YW1wOworCQkJCXUxNiBpbnRlcnZhbDsKKwkJCQl1MTYgY2FwYWJpbGl0eTsKKwkJCQl1OCBzc2lkX2VsX2lkOworCQkJCXU4IHNzaWRfbGVuZ3RoOworCQkJCS8qIHNzaWQgaGVyZSAqLworCQkJCXU4IHJhdGVzX2VsX2lkOworCQkJCXU4IHJhdGVzX2xlbmd0aDsKKwkJCQkvKiByYXRlcyBoZXJlICovCisJCQkJdTggZHNfZWxfaWQ7CisJCQkJdTggZHNfbGVuZ3RoOworCQkJCS8qIGRzIGhlcmUgKi8KKwkJCX0gKmJlYWNvbiA9IChzdHJ1Y3QgYmVhY29uX2Zvcm1hdCAqKXByaXYtPnJ4X2J1ZjsKKwkJCQorCQkJdTggY2hhbm5lbCwgcmF0ZXNfbGVuZ3RoLCBzc2lkX2xlbmd0aDsKKwkJCXU2NCB0aW1lc3RhbXAgPSBsZTY0X3RvX2NwdShiZWFjb24tPnRpbWVzdGFtcCk7CisJCQl1MTYgYmVhY29uX2ludGVydmFsID0gbGUxNl90b19jcHUoYmVhY29uLT5pbnRlcnZhbCk7CisJCQl1MTYgY2FwYWJpbGl0eSA9IGxlMTZfdG9fY3B1KGJlYWNvbi0+Y2FwYWJpbGl0eSk7CisJCQl1OCAqYmVhY29ucCA9IHByaXYtPnJ4X2J1ZjsKKwkJCXNzaWRfbGVuZ3RoID0gYmVhY29uLT5zc2lkX2xlbmd0aDsKKwkJCS8qIHRoaXMgYmxvd3MgY2h1bmtzLiAqLworCQkJaWYgKGZyYW1lX2xlbiA8IDE0IHx8IGZyYW1lX2xlbiA8IHNzaWRfbGVuZ3RoICsgMTUpIAorCQkJCXJldHVybjsKKwkJCXJhdGVzX2xlbmd0aCA9IGJlYWNvbnBbYmVhY29uLT5zc2lkX2xlbmd0aCArIDE1XTsKKwkJCWlmIChmcmFtZV9sZW4gPCBzc2lkX2xlbmd0aCArIHJhdGVzX2xlbmd0aCArIDE4KQorCQkJCXJldHVybjsKKwkJCWlmIChzc2lkX2xlbmd0aCA+ICBNQVhfU1NJRF9MRU5HVEgpCisJCQkJcmV0dXJuOworCQkJY2hhbm5lbCA9IGJlYWNvbnBbc3NpZF9sZW5ndGggKyByYXRlc19sZW5ndGggKyAxOF07CisJCSAgICAgICAKKwkJCWlmIChwcml2LT5zdGF0aW9uX3N0YXRlID09IFNUQVRJT05fU1RBVEVfUkVBRFkpIHsKKwkJCQlzbW9vdGhfcnNzaShwcml2LCByc3NpKTsKKwkJCQlpZiAoaXNfZnJhbWVfZnJvbV9jdXJyZW50X2Jzcyhwcml2LCBoZWFkZXIpKSB7IAorCQkJCQlwcml2LT5iZWFjb25zX3RoaXNfc2VjKys7CisJCQkJCWF0bWVsX3Ntb290aF9xdWFsKHByaXYpOworCQkJCQlpZiAocHJpdi0+bGFzdF9iZWFjb25fdGltZXN0YW1wKSB7CisJCQkJCQkvKiBOb3RlIHRydW5jYXRlIHRoaXMgdG8gMzIgYml0cyAtIGtlcm5lbCBjYW4ndCBkaXZpZGUgYSBsb25nIGxvbmcgKi8KKwkJCQkJCXUzMiBiZWFjb25fZGVsYXkgPSB0aW1lc3RhbXAgLSBwcml2LT5sYXN0X2JlYWNvbl90aW1lc3RhbXA7CisJCQkJCQlpbnQgYmVhY29ucyA9IGJlYWNvbl9kZWxheSAvIChiZWFjb25faW50ZXJ2YWwgKiAxMDAwKTsKKwkJCQkJCWlmIChiZWFjb25zID4gMSkKKwkJCQkJCQlwcml2LT53c3RhdHMubWlzcy5iZWFjb24gKz0gYmVhY29ucyAtIDE7CisJCQkJCX0KKwkJCQkJcHJpdi0+bGFzdF9iZWFjb25fdGltZXN0YW1wID0gdGltZXN0YW1wOworCQkJCQloYW5kbGVfYmVhY29uX3Byb2JlKHByaXYsIGNhcGFiaWxpdHksIGNoYW5uZWwpOworCQkJCX0KKwkJCX0KKwkJCQorCQkJaWYgKHByaXYtPnN0YXRpb25fc3RhdGUgPT0gU1RBVElPTl9TVEFURV9TQ0FOTklORyApIAorCQkJCXN0b3JlX2Jzc19pbmZvKHByaXYsIGhlYWRlciwgY2FwYWJpbGl0eSwgYmVhY29uX2ludGVydmFsLCBjaGFubmVsLAorCQkJCQkgICAgICAgcnNzaSwgc3NpZF9sZW5ndGgsICZiZWFjb24tPnJhdGVzX2VsX2lkLAorCQkJCQkgICAgICAgc3VidHlwZSA9PSBDODAyMTFfU1VCVFlQRV9NR01UX0JFQUNPTikgOworCQl9CisJCWJyZWFrOworCQkKKwljYXNlIEM4MDIxMV9TVUJUWVBFX01HTVRfQXV0aGVudGljYXRpb246CisKKwkJaWYgKHByaXYtPnN0YXRpb25fc3RhdGUgPT0gU1RBVElPTl9TVEFURV9BVVRIRU5USUNBVElORykKKwkJCWF1dGhlbnRpY2F0ZShwcml2LCBmcmFtZV9sZW4pOworCQorCQlicmVhazsKKwkJCisJY2FzZSBDODAyMTFfU1VCVFlQRV9NR01UX0FTU19SRVNQT05TRToKKwljYXNlIEM4MDIxMV9TVUJUWVBFX01HTVRfUkVBU1NfUkVTUE9OU0U6CisJCQorCQlpZiAocHJpdi0+c3RhdGlvbl9zdGF0ZSA9PSBTVEFUSU9OX1NUQVRFX0FTU09DSUFUSU5HIHx8IAorCQkgICAgcHJpdi0+c3RhdGlvbl9zdGF0ZSA9PSBTVEFUSU9OX1NUQVRFX1JFQVNTT0NJQVRJTkcpCisJCQlhc3NvY2lhdGUocHJpdiwgZnJhbWVfbGVuLCBzdWJ0eXBlKTsKKwkJCisJCWJyZWFrOworCisJY2FzZSBDODAyMTFfU1VCVFlQRV9NR01UX0RJU0FTU09TSUFUSU9OOgorCQlpZiAocHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkICYmIAorCQkgICAgcHJpdi0+b3BlcmF0aW5nX21vZGUgPT0gSVdfTU9ERV9JTkZSQSAmJiAKKwkJICAgIGlzX2ZyYW1lX2Zyb21fY3VycmVudF9ic3MocHJpdiwgaGVhZGVyKSkgeworCQkJcHJpdi0+c3RhdGlvbl93YXNfYXNzb2NpYXRlZCA9IDA7CisJCQlwcml2LT5zdGF0aW9uX2lzX2Fzc29jaWF0ZWQgPSAwOworCQkJCisJCQlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX0pPSU5OSU5HKTsKKwkJCWpvaW4ocHJpdiwgQlNTX1RZUEVfSU5GUkFTVFJVQ1RVUkUpOworCQl9CisJCQorCQlicmVhazsKKworCWNhc2UgQzgwMjExX1NVQlRZUEVfTUdNVF9EZWF1dGhlbnRpY2F0aW9uOgorCQlpZiAocHJpdi0+b3BlcmF0aW5nX21vZGUgPT0gSVdfTU9ERV9JTkZSQSAmJgorCQkgICAgaXNfZnJhbWVfZnJvbV9jdXJyZW50X2Jzcyhwcml2LCBoZWFkZXIpKSB7CisJCQlwcml2LT5zdGF0aW9uX3dhc19hc3NvY2lhdGVkID0gMDsKKworCQkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9KT0lOTklORyk7CisJCQlqb2luKHByaXYsIEJTU19UWVBFX0lORlJBU1RSVUNUVVJFKTsKKwkJfQorCQkKKwkJYnJlYWs7CisJfQorfQorCisvKiBydW4gd2hlbiB0aW1lciBleHBpcmVzICovCitzdGF0aWMgdm9pZCBhdG1lbF9tYW5hZ2VtZW50X3RpbWVyKHVfbG9uZyBhKQoreworICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGE7CisgIHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgCisgIC8qIENoZWNrIGlmIHRoZSBjYXJkIGhhcyBiZWVuIHlhbmtlZC4gKi8KKyAgaWYgKHByaXYtPmNhcmQgJiYgcHJpdi0+cHJlc2VudF9jYWxsYmFjayAmJiAKKyAgICAgICEoKnByaXYtPnByZXNlbnRfY2FsbGJhY2spKHByaXYtPmNhcmQpKQorCSAgcmV0dXJuOworICAKKyAgc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycWxvY2ssIGZsYWdzKTsKKworICBzd2l0Y2ggKHByaXYtPnN0YXRpb25fc3RhdGUpIHsKKwkgIAorICBjYXNlIFNUQVRJT05fU1RBVEVfQVVUSEVOVElDQVRJTkc6CisJICBpZiAocHJpdi0+QXV0aGVudGljYXRpb25SZXF1ZXN0UmV0cnlDbnQgPj0gTUFYX0FVVEhFTlRJQ0FUSU9OX1JFVFJJRVMpIHsKKwkJICBhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX01HTVRfRVJST1IpOworCQkgIHByaXYtPnN0YXRpb25faXNfYXNzb2NpYXRlZCA9IDA7CisJCSAgcHJpdi0+QXV0aGVudGljYXRpb25SZXF1ZXN0UmV0cnlDbnQgPSAwOworCQkgIHJlc3RhcnRfc2VhcmNoKHByaXYpOworCSAgfSBlbHNlIHsKKwkJICBwcml2LT5BdXRoZW50aWNhdGlvblJlcXVlc3RSZXRyeUNudCsrOworCQkgIHByaXYtPkN1cnJlbnRBdXRoZW50VHJhbnNhY3Rpb25TZXFOdW0gPSAweDAwMDE7CisJCSAgbW9kX3RpbWVyKCZwcml2LT5tYW5hZ2VtZW50X3RpbWVyLCBqaWZmaWVzICsgTUdNVF9KSUZGSUVTKTsKKwkJICBzZW5kX2F1dGhlbnRpY2F0aW9uX3JlcXVlc3QocHJpdiwgTlVMTCwgMCk7CisJICB9CisJICAKKwkgIGJyZWFrOworCisgIGNhc2UgU1RBVElPTl9TVEFURV9BU1NPQ0lBVElORzoKKwkgIGlmIChwcml2LT5Bc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCA9PSBNQVhfQVNTT0NJQVRJT05fUkVUUklFUykgeworCQkgIGF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfTUdNVF9FUlJPUik7CisJCSAgcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkID0gMDsKKwkJICBwcml2LT5Bc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCA9IDA7CisJCSAgcmVzdGFydF9zZWFyY2gocHJpdik7CisJICB9IGVsc2UgeworCQkgIHByaXYtPkFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250Kys7CisJCSAgbW9kX3RpbWVyKCZwcml2LT5tYW5hZ2VtZW50X3RpbWVyLCBqaWZmaWVzICsgTUdNVF9KSUZGSUVTKTsKKwkJICBzZW5kX2Fzc29jaWF0aW9uX3JlcXVlc3QocHJpdiwgMCk7CisJICB9CisKKwkgIGJyZWFrOworCQkgIAorICBjYXNlIFNUQVRJT05fU1RBVEVfUkVBU1NPQ0lBVElORzoJCisJICBpZiAocHJpdi0+UmVBc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCA9PSBNQVhfQVNTT0NJQVRJT05fUkVUUklFUykgeworCQkgIGF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfTUdNVF9FUlJPUik7CisJCSAgcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkID0gMDsKKwkJICBwcml2LT5SZUFzc29jaWF0aW9uUmVxdWVzdFJldHJ5Q250ID0gMDsKKwkJICByZXN0YXJ0X3NlYXJjaChwcml2KTsKKwkgIH0gZWxzZSB7CisJCSAgcHJpdi0+UmVBc3NvY2lhdGlvblJlcXVlc3RSZXRyeUNudCsrOworCQkgIG1vZF90aW1lcigmcHJpdi0+bWFuYWdlbWVudF90aW1lciwgamlmZmllcyArIE1HTVRfSklGRklFUyk7CisJCSAgc2VuZF9hc3NvY2lhdGlvbl9yZXF1ZXN0KHByaXYsIDEpOworCSAgfQorCisJICBicmVhazsKKyAgCisgIGRlZmF1bHQ6CisJICBicmVhazsKKyAgfQorICAKKyAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxbG9jaywgZmxhZ3MpOworfQorICAKK3N0YXRpYyB2b2lkIGF0bWVsX2NvbW1hbmRfaXJxKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KQoreworCXU4IHN0YXR1cyA9IGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX2NvKHByaXYsIENNRF9CTE9DS19TVEFUVVNfT0ZGU0VUKSk7CisJdTggY29tbWFuZCA9IGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX2NvKHByaXYsIENNRF9CTE9DS19DT01NQU5EX09GRlNFVCkpOworCWludCBmYXN0X3NjYW47CisJCisJaWYgKHN0YXR1cyA9PSBDTURfU1RBVFVTX0lETEUgfHwgCisJICAgIHN0YXR1cyA9PSBDTURfU1RBVFVTX0lOX1BST0dSRVNTKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGNvbW1hbmQpeworCisJY2FzZSBDTURfU3RhcnQ6CisJCWlmIChzdGF0dXMgPT0gQ01EX1NUQVRVU19DT01QTEVURSkgeworCQkJcHJpdi0+c3RhdGlvbl93YXNfYXNzb2NpYXRlZCA9IHByaXYtPnN0YXRpb25faXNfYXNzb2NpYXRlZDsKKwkJCWF0bWVsX2dldF9taWIocHJpdiwgTWFjX01nbXRfTWliX1R5cGUsIE1BQ19NR01UX01JQl9DVVJfQlNTSURfUE9TLAorCQkJCSAgICAgICh1OCAqKXByaXYtPkN1cnJlbnRCU1NJRCwgNik7CisJCQlhdG1lbF9lbnRlcl9zdGF0ZShwcml2LCBTVEFUSU9OX1NUQVRFX1JFQURZKTsKKwkJfQkJCQorCQlicmVhazsKKwkJCisJY2FzZSBDTURfU2NhbjoKKwkJZmFzdF9zY2FuID0gcHJpdi0+ZmFzdF9zY2FuOworCQlwcml2LT5mYXN0X3NjYW4gPSAwOworCQkKKwkJaWYgKHN0YXR1cyAhPSBDTURfU1RBVFVTX0NPTVBMRVRFKSB7CisJCQlhdG1lbF9zY2FuKHByaXYsIDEpOworCQl9IGVsc2UgeworCQkJaW50IGJzc19pbmRleCA9IHJldHJpZXZlX2Jzcyhwcml2KTsKKwkJCWlmIChic3NfaW5kZXggIT0gLTEpIHsKKwkJCQlhdG1lbF9qb2luX2Jzcyhwcml2LCBic3NfaW5kZXgpOworCQkJfSBlbHNlIGlmIChwcml2LT5vcGVyYXRpbmdfbW9kZSA9PSBJV19NT0RFX0FESE9DICYmIAorCQkJCSAgIHByaXYtPlNTSURfc2l6ZSAhPSAwKSB7CisJCQkJc3RhcnQocHJpdiwgQlNTX1RZUEVfQURfSE9DKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpdi0+ZmFzdF9zY2FuID0gIWZhc3Rfc2NhbjsKKwkJCQlhdG1lbF9zY2FuKHByaXYsIDEpOworCQkJfQorCQkJcHJpdi0+c2l0ZV9zdXJ2ZXlfc3RhdGUgPSBTSVRFX1NVUlZFWV9DT01QTEVURUQ7CisJCX0KKwkJYnJlYWs7CisJCQorCWNhc2UgQ01EX1NpdGVTdXJ2ZXk6CisJCXByaXYtPmZhc3Rfc2NhbiA9IDA7CisJCQorCQlpZiAoc3RhdHVzICE9IENNRF9TVEFUVVNfQ09NUExFVEUpCisJCQlyZXR1cm47CisJCQorCQlwcml2LT5zaXRlX3N1cnZleV9zdGF0ZSA9IFNJVEVfU1VSVkVZX0NPTVBMRVRFRDsKKwkJaWYgKHByaXYtPnN0YXRpb25faXNfYXNzb2NpYXRlZCkgeworCQkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9SRUFEWSk7CQkJCQorCQl9IGVsc2UgeworCQkJYXRtZWxfc2Nhbihwcml2LCAxKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ01EX0pvaW46CisJCWlmIChzdGF0dXMgPT0gQ01EX1NUQVRVU19DT01QTEVURSkgeworCQkJaWYgKHByaXYtPm9wZXJhdGluZ19tb2RlID09IElXX01PREVfQURIT0MpIHsKKwkJCQlwcml2LT5zdGF0aW9uX3dhc19hc3NvY2lhdGVkID0gcHJpdi0+c3RhdGlvbl9pc19hc3NvY2lhdGVkOworCQkJCWF0bWVsX2VudGVyX3N0YXRlKHByaXYsIFNUQVRJT05fU1RBVEVfUkVBRFkpOworCQkJfSBlbHNlIHsKKwkJCQlwcml2LT5BdXRoZW50aWNhdGlvblJlcXVlc3RSZXRyeUNudCA9IDA7CisJCQkJYXRtZWxfZW50ZXJfc3RhdGUocHJpdiwgU1RBVElPTl9TVEFURV9BVVRIRU5USUNBVElORyk7CisJCQkJCisJCQkJbW9kX3RpbWVyKCZwcml2LT5tYW5hZ2VtZW50X3RpbWVyLCBqaWZmaWVzICsgTUdNVF9KSUZGSUVTKTsKKwkJCQlwcml2LT5DdXJyZW50QXV0aGVudFRyYW5zYWN0aW9uU2VxTnVtID0gMHgwMDAxOworCQkJCXNlbmRfYXV0aGVudGljYXRpb25fcmVxdWVzdChwcml2LCBOVUxMLCAwKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQkKKwkJYXRtZWxfc2Nhbihwcml2LCAxKTsKKwkJCisJfQorfQorCitzdGF0aWMgaW50IGF0bWVsX3dha2V1cF9maXJtd2FyZShzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgaG9zdF9pbmZvX3N0cnVjdCAqaWZhY2UgPSAmcHJpdi0+aG9zdF9pbmZvOworCXUxNiBtcjEsIG1yMzsKKwlpbnQgaTsKKworCWlmIChwcml2LT5jYXJkX3R5cGUgPT0gQ0FSRF9UWVBFX1NQSV9GTEFTSCkKKwkJYXRtZWxfc2V0X2djcihwcml2LT5kZXYsIEdDUl9SRU1BUCk7CisJCisJLyogd2FrZSB1cCBvbi1ib2FyZCBwcm9jZXNzb3IgKi8KKwlhdG1lbF9jbGVhcl9nY3IocHJpdi0+ZGV2LCAweDAwNDApOworCWF0bWVsX3dyaXRlMTYocHJpdi0+ZGV2LCBCU1IsIEJTU19TUkFNKTsKKwkKKwlpZiAocHJpdi0+Y2FyZF90eXBlID09IENBUkRfVFlQRV9TUElfRkxBU0gpCisJCW1kZWxheSgxMDApOworCisJLyogYW5kIHdhaXQgZm9yIGl0ICovCisJZm9yIChpID0gIExPT1BfUkVUUllfTElNSVQ7IGk7IGktLSkgeworCQltcjEgPSBhdG1lbF9yZWFkMTYocHJpdi0+ZGV2LCBNUjEpOworCQltcjMgPSBhdG1lbF9yZWFkMTYocHJpdi0+ZGV2LCBNUjMpOworCQkKKwkJaWYgKG1yMyAmIE1BQ19CT09UX0NPTVBMRVRFKSAKKwkJCWJyZWFrOworCQlpZiAobXIxICYgTUFDX0JPT1RfQ09NUExFVEUgJiYKKwkJICAgIHByaXYtPmJ1c190eXBlID09IEJVU19UWVBFX1BDQ0FSRCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IDApIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBNQUMgZmFpbGVkIHRvIGJvb3QuXG4iLCBwcml2LT5kZXYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJCQorCWlmICgocHJpdi0+aG9zdF9pbmZvX2Jhc2UgPSBhdG1lbF9yZWFkMTYocHJpdi0+ZGV2LCBNUjIpKSA9PSAweGZmZmYpIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBjYXJkIG1pc3NpbmcuXG4iLCBwcml2LT5kZXYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisJCisJLyogbm93IGNoZWNrIGZvciBjb21wbGV0aW9uIG9mIE1BQyBpbml0aWFsaXphdGlvbiB0aHJvdWdoICAKKwkgICB0aGUgRnVuQ3RybCBmaWVsZCBvZiB0aGUgSUZBQ0UsIHBvbGwgTVIxIHRvIGRldGVjdCBjb21wbGV0aW9uIG9mCSAgCisJICAgTUFDIGluaXRpYWxpemF0aW9uLCBjaGVjayBjb21wbGV0aW9uIHN0YXR1cywgc2V0IGludGVycnVwdCBtYXNrLCAgCisJICAgZW5hYmxlcyBpbnRlcnJ1cHRzIGFuZCBjYWxscyBUeCBhbmQgUnggaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICovICAKKwkKKwlhdG1lbF93bWVtOChwcml2LCBhdG1lbF9oaShwcml2LCBJRkFDRV9GVU5DX0NUUkxfT0ZGU0VUKSwgRlVOQ19DVFJMX0lOSVRfQ09NUExFVEUpOworCQorCWZvciAoaSA9ICBMT09QX1JFVFJZX0xJTUlUOyBpOyBpLS0pIHsKKwkJbXIxID0gYXRtZWxfcmVhZDE2KHByaXYtPmRldiwgTVIxKTsKKwkJbXIzID0gYXRtZWxfcmVhZDE2KHByaXYtPmRldiwgTVIzKTsKKwkJCisJCWlmIChtcjMgJiBNQUNfSU5JVF9DT01QTEVURSkgCisJCQlicmVhazsKKwkJaWYgKG1yMSAmIE1BQ19JTklUX0NPTVBMRVRFICYmCisJCSAgICBwcml2LT5idXNfdHlwZSA9PSBCVVNfVFlQRV9QQ0NBUkQpCisJCQlicmVhazsKKwl9CisJCisJaWYgKGkgPT0gMCkgeworCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IE1BQyBmYWlsZWQgdG8gaW5pdGlhbGlzZS5cbiIsIHByaXYtPmRldi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKwkKKwkvKiBDaGVjayBmb3IgTUFDX0lOSVRfT0sgb25seSBvbiB0aGUgcmVnaXN0ZXIgdGhhdCB0aGUgTUFDX0lOSVRfT0sgd2FzIHNldCAqLworCWlmICgobXIzICYgTUFDX0lOSVRfQ09NUExFVEUpICYmCisJICAgICEoYXRtZWxfcmVhZDE2KHByaXYtPmRldiwgTVIzKSAmIE1BQ19JTklUX09LKSkgeworCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IE1BQyBmYWlsZWQgTVIzIHNlbGYtdGVzdC5cbiIsIHByaXYtPmRldi0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoKG1yMSAmIE1BQ19JTklUX0NPTVBMRVRFKSAmJgorCSAgICAhKGF0bWVsX3JlYWQxNihwcml2LT5kZXYsIE1SMSkgJiBNQUNfSU5JVF9PSykpIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBNQUMgZmFpbGVkIE1SMSBzZWxmLXRlc3QuXG4iLCBwcml2LT5kZXYtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlhdG1lbF9jb3B5X3RvX2hvc3QocHJpdi0+ZGV2LCAodW5zaWduZWQgY2hhciAqKWlmYWNlLCAKKwkJCSAgIHByaXYtPmhvc3RfaW5mb19iYXNlLCBzaXplb2YoKmlmYWNlKSk7CisgICAgICAgIAorCWlmYWNlLT50eF9idWZmX3BvcyA9IGxlMTZfdG9fY3B1KGlmYWNlLT50eF9idWZmX3Bvcyk7CisJaWZhY2UtPnR4X2J1ZmZfc2l6ZSA9IGxlMTZfdG9fY3B1KGlmYWNlLT50eF9idWZmX3NpemUpOworCWlmYWNlLT50eF9kZXNjX3BvcyA9IGxlMTZfdG9fY3B1KGlmYWNlLT50eF9kZXNjX3Bvcyk7CisJaWZhY2UtPnR4X2Rlc2NfY291bnQgPSBsZTE2X3RvX2NwdShpZmFjZS0+dHhfZGVzY19jb3VudCk7CisJaWZhY2UtPnJ4X2J1ZmZfcG9zID0gbGUxNl90b19jcHUoaWZhY2UtPnJ4X2J1ZmZfcG9zKTsKKwlpZmFjZS0+cnhfYnVmZl9zaXplID0gbGUxNl90b19jcHUoaWZhY2UtPnJ4X2J1ZmZfc2l6ZSk7CisJaWZhY2UtPnJ4X2Rlc2NfcG9zID0gbGUxNl90b19jcHUoaWZhY2UtPnJ4X2Rlc2NfcG9zKTsKKwlpZmFjZS0+cnhfZGVzY19jb3VudCA9IGxlMTZfdG9fY3B1KGlmYWNlLT5yeF9kZXNjX2NvdW50KTsKKwlpZmFjZS0+YnVpbGRfdmVyc2lvbiA9IGxlMTZfdG9fY3B1KGlmYWNlLT5idWlsZF92ZXJzaW9uKTsKKwlpZmFjZS0+Y29tbWFuZF9wb3MgPSBsZTE2X3RvX2NwdShpZmFjZS0+Y29tbWFuZF9wb3MpOworCWlmYWNlLT5tYWpvcl92ZXJzaW9uID0gbGUxNl90b19jcHUoaWZhY2UtPm1ham9yX3ZlcnNpb24pOworCWlmYWNlLT5taW5vcl92ZXJzaW9uID0gbGUxNl90b19jcHUoaWZhY2UtPm1pbm9yX3ZlcnNpb24pOworCWlmYWNlLT5mdW5jX2N0cmwgPSBsZTE2X3RvX2NwdShpZmFjZS0+ZnVuY19jdHJsKTsKKwlpZmFjZS0+bWFjX3N0YXR1cyA9IGxlMTZfdG9fY3B1KGlmYWNlLT5tYWNfc3RhdHVzKTsKKworCXJldHVybiAxOworfQorCisvKiBkZXRlcm1pbmUgdHlwZSBvZiBtZW1vcnkgYW5kIE1BQyBhZGRyZXNzICovCitzdGF0aWMgaW50IHByb2JlX2F0bWVsX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkgCisJLyogcmVzZXQgcGNjYXJkICovCisJaWYgKHByaXYtPmJ1c190eXBlID09IEJVU19UWVBFX1BDQ0FSRCkgCisJCWF0bWVsX3dyaXRlMTYoZGV2LCBHQ1IsIDB4MDA2MCk7CisJCisJYXRtZWxfd3JpdGUxNihkZXYsIEdDUiwgMHgwMDQwKTsKKwltZGVsYXkoNTAwKTsKKwkKKwlpZiAoYXRtZWxfcmVhZDE2KGRldiwgTVIyKSA9PSAwKSB7CisJCS8qIE5vIHN0b3JlZCBmaXJtd2FyZSBzbyBsb2FkIGEgc21hbGwgc3R1YiB3aGljaCBqdXN0IAorCQkgICB0ZWxscyB1cyB0aGUgTUFDIGFkZHJlc3MgKi8KKwkJaW50IGk7CisJCXByaXYtPmNhcmRfdHlwZSA9IENBUkRfVFlQRV9FRVBST007CisJCWF0bWVsX3dyaXRlMTYoZGV2LCBCU1IsIEJTU19JUkFNKTsKKwkJYXRtZWxfY29weV90b19jYXJkKGRldiwgMCwgbWFjX3JlYWRlciwgc2l6ZW9mKG1hY19yZWFkZXIpKTsKKwkJYXRtZWxfc2V0X2djcihkZXYsIEdDUl9SRU1BUCk7CisJCWF0bWVsX2NsZWFyX2djcihwcml2LT5kZXYsIDB4MDA0MCk7CisJCWF0bWVsX3dyaXRlMTYoZGV2LCBCU1IsIEJTU19TUkFNKTsKKwkJZm9yIChpID0gIExPT1BfUkVUUllfTElNSVQ7IGk7IGktLSkgCisJCQlpZiAoYXRtZWxfcmVhZDE2KGRldiwgTVIzKSAmIE1BQ19CT09UX0NPTVBMRVRFKQorCQkJCWJyZWFrOworCQlpZiAoaSA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IE1BQyBmYWlsZWQgdG8gYm9vdCBNQUMgYWRkcmVzcyByZWFkZXIuXG4iLCBkZXYtPm5hbWUpOworCQl9IGVsc2UgeworCQkJYXRtZWxfY29weV90b19ob3N0KGRldiwgZGV2LT5kZXZfYWRkciwgYXRtZWxfcmVhZDE2KGRldiwgTVIyKSwgNik7CisJCQkvKiBnb3QgYWRkcmVzcywgbm93IHNxdWFzaCBpdCBhZ2FpbiB1bnRpbCB0aGUgbmV0d29yaworCQkJICAgaW50ZXJmYWNlIGlzIG9wZW5lZCAqLworCQkJaWYgKHByaXYtPmJ1c190eXBlID09IEJVU19UWVBFX1BDQ0FSRCkgCisJCQkJYXRtZWxfd3JpdGUxNihkZXYsIEdDUiwgMHgwMDYwKTsKKwkJCWF0bWVsX3dyaXRlMTYoZGV2LCBHQ1IsIDB4MDA0MCk7CisJCQlyYyA9IDE7CisJCX0KKwl9IGVsc2UgaWYgKGF0bWVsX3JlYWQxNihkZXYsIE1SNCkgPT0gMCkgeworCQkvKiBNYWMgYWRkcmVzcyBlYXN5IGluIHRoaXMgY2FzZS4gKi8KKwkJcHJpdi0+Y2FyZF90eXBlID0gQ0FSRF9UWVBFX1BBUkFMTEVMX0ZMQVNIOworCQlhdG1lbF93cml0ZTE2KGRldiwgIEJTUiwgMSk7CQorCQlhdG1lbF9jb3B5X3RvX2hvc3QoZGV2LCBkZXYtPmRldl9hZGRyLCAweGMwMDAsIDYpOworCQlhdG1lbF93cml0ZTE2KGRldiwgIEJTUiwgMHgyMDApOworCQlyYyA9IDE7CisJfSBlbHNlIHsKKwkJLyogU3RhbmRhcmQgZmlybXdhcmUgaW4gZmxhc2gsIGJvb3QgaXQgdXAgYW5kIGFzaworCQkgICBmb3IgdGhlIE1hYyBBZGRyZXNzICovCisJCXByaXYtPmNhcmRfdHlwZSA9IENBUkRfVFlQRV9TUElfRkxBU0g7CisJCWlmIChhdG1lbF93YWtldXBfZmlybXdhcmUocHJpdikpIHsKKwkJCWF0bWVsX2dldF9taWIocHJpdiwgTWFjX0FkZHJlc3NfTWliX1R5cGUsIDAsIGRldi0+ZGV2X2FkZHIsIDYpOworCQkJCisJCQkvKiBnb3QgYWRkcmVzcywgbm93IHNxdWFzaCBpdCBhZ2FpbiB1bnRpbCB0aGUgbmV0d29yaworCQkJICAgaW50ZXJmYWNlIGlzIG9wZW5lZCAqLworCQkJaWYgKHByaXYtPmJ1c190eXBlID09IEJVU19UWVBFX1BDQ0FSRCkgCisJCQkJYXRtZWxfd3JpdGUxNihkZXYsIEdDUiwgMHgwMDYwKTsKKwkJCWF0bWVsX3dyaXRlMTYoZGV2LCBHQ1IsIDB4MDA0MCk7CisJCQlyYyA9IDE7CisJCX0KKwl9CisJCisJaWYgKHJjKSB7CisJCWlmIChkZXYtPmRldl9hZGRyWzBdID09IDB4RkYpIHsKKwkJCXU4IGRlZmF1bHRfbWFjW10gPSB7MHgwMCwweDA0LCAweDI1LCAweDAwLCAweDAwLCAweDAwfTsKKwkJCXByaW50ayhLRVJOX0FMRVJUICIlczogKioqIEludmFsaWQgTUFDIGFkZHJlc3MuIFVQR1JBREUgRmlybXdhcmUgKioqKlxuIiwgZGV2LT5uYW1lKTsKKwkJCW1lbWNweShkZXYtPmRldl9hZGRyLCBkZWZhdWx0X21hYywgNik7CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1BQyBhZGRyZXNzICUuMng6JS4yeDolLjJ4OiUuMng6JS4yeDolLjJ4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLAorCQkgICAgICAgZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKKwkJICAgICAgIGRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0gKTsKKwkJCisJfQorCQorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgYnVpbGRfd2VwX21pYihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdikKKy8qIE1vdmUgdGhlIGVuY3lwdGlvbiBpbmZvcm1hdGlvbiBvbiB0aGUgTUlCIHN0cnVjdHVyZS4KKyAgIFRoaXMgcm91dGluZSBpcyBmb3IgdGhlIHByZS1XUEEgZmlybXdhcmU6IGxhdGVyIGZpcm13YXJlIGhhcworICAgYSBkaWZmZXJlbnQgZm9ybWF0IE1JQiBhbmQgYSBkaWZmZXJlbnQgcm91dGluZS4gKi8KK3sKKwlzdHJ1Y3QgeyAvKiBOQiB0aGlzIGlzIG1hdGNoZWQgdG8gdGhlIGhhcmR3YXJlLCBkb24ndCBjaGFuZ2UuICovCisJCXU4IHdlcF9pc19vbjsgICAgICAgICAgICAgICAgIAorCQl1OCBkZWZhdWx0X2tleTsgLyogMC4uMyAqLworCQl1OCByZXNlcnZlZDsKKwkJdTggZXhjbHVkZV91bmVuY3J5cHRlZDsKKwkJCisJCXUzMiBXRVBJQ1ZfZXJyb3JfY291bnQ7CisJCXUzMiBXRVBfZXhjbHVkZWRfY291bnQ7CisJCQorCQl1OCB3ZXBfa2V5c1tNQVhfRU5DUllQVElPTl9LRVlTXVsxM107CisgCQl1OCBlbmNyeXB0aW9uX2xldmVsOyAvKiAwLCAxLCAyICovCisJCXU4IHJlc2VydmVkMlszXTsgCisJfSBtaWI7CisJaW50IGk7CisKKwltaWIud2VwX2lzX29uID0gcHJpdi0+d2VwX2lzX29uOworCWlmIChwcml2LT53ZXBfaXNfb24pIHsKKwkJaWYgKHByaXYtPndlcF9rZXlfbGVuW3ByaXYtPmRlZmF1bHRfa2V5XSA+IDUpCisJCQltaWIuZW5jcnlwdGlvbl9sZXZlbCA9IDI7CisJCWVsc2UKKwkJCW1pYi5lbmNyeXB0aW9uX2xldmVsID0gMTsJCisJfSBlbHNlIHsKKwkJbWliLmVuY3J5cHRpb25fbGV2ZWwgPSAwOworCX0KKworCW1pYi5kZWZhdWx0X2tleSA9IHByaXYtPmRlZmF1bHRfa2V5OworCW1pYi5leGNsdWRlX3VuZW5jcnlwdGVkID0gcHJpdi0+ZXhjbHVkZV91bmVuY3J5cHRlZDsKKwkKKwlmb3IoaSA9IDA7IGkgPCBNQVhfRU5DUllQVElPTl9LRVlTOyAgaSsrKQorCQltZW1jcHkobWliLndlcF9rZXlzW2ldLCBwcml2LT53ZXBfa2V5c1tpXSwgMTMpOworCQkKKwlhdG1lbF9zZXRfbWliKHByaXYsIE1hY19XZXBfTWliX1R5cGUsIDAsICh1OCAqKSZtaWIsIHNpemVvZihtaWIpKTsKK30KKworc3RhdGljIHZvaWQgYnVpbGRfd3BhX21pYihzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdikKK3sKKwkvKiBUaGlzIGlzIGZvciB0aGUgbGF0ZXIgKFdQQSBlbmFibGVkKSBmaXJtd2FyZS4gKi8JICAgCisKKwlzdHJ1Y3QgeyAvKiBOQiB0aGlzIGlzIG1hdGNoZWQgdG8gdGhlIGhhcmR3YXJlLCBkb24ndCBjaGFuZ2UuICovCisJCXU4IGNpcGhlcl9kZWZhdWx0X2tleV92YWx1ZVtNQVhfRU5DUllQVElPTl9LRVlTXVtNQVhfRU5DUllQVElPTl9LRVlfU0laRV07CisJCXU4IHJlY2VpdmVyX2FkZHJlc3NbNl07CisJCXU4IHdlcF9pc19vbjsgICAgICAgICAgICAgICAgIAorCQl1OCBkZWZhdWx0X2tleTsgLyogMC4uMyAqLworCQl1OCBncm91cF9rZXk7CisJCXU4IGV4Y2x1ZGVfdW5lbmNyeXB0ZWQ7CisJCXU4IGVuY3J5cHRpb25fdHlwZTsKKwkJdTggcmVzZXJ2ZWQ7CisJCQorCQl1MzIgV0VQSUNWX2Vycm9yX2NvdW50OworCQl1MzIgV0VQX2V4Y2x1ZGVkX2NvdW50OworCQkKKwkJdTgga2V5X1JTQ1s0XVs4XTsKKwl9IG1pYjsKKwkKKwlpbnQgaTsKKworCW1pYi53ZXBfaXNfb24gPSBwcml2LT53ZXBfaXNfb247CisJbWliLmV4Y2x1ZGVfdW5lbmNyeXB0ZWQgPSBwcml2LT5leGNsdWRlX3VuZW5jcnlwdGVkOworCW1lbWNweShtaWIucmVjZWl2ZXJfYWRkcmVzcywgcHJpdi0+Q3VycmVudEJTU0lELCA2KTsKKwkKKwkvKiB6ZXJvIGFsbCB0aGUga2V5cyBiZWZvcmUgYWRkaW5nIGluIHZhbGlkIG9uZXMuICovCisJbWVtc2V0KG1pYi5jaXBoZXJfZGVmYXVsdF9rZXlfdmFsdWUsIDAsIHNpemVvZihtaWIuY2lwaGVyX2RlZmF1bHRfa2V5X3ZhbHVlKSk7CisJCisJaWYgKHByaXYtPndlcF9pc19vbikgeworCQkvKiBUaGVyZSdzIGEgY29tbWVudCBpbiB0aGUgQXRtZWwgY29kZSB0byB0aGUgZWZmZWN0IHRoYXQgdGhpcyBpcyBvbmx5IHZhbGlkCisJCSAgIHdoZW4gc3RpbGwgdXNpbmcgV0VQLCBpdCBtYXkgbmVlZCB0byBiZSBzZXQgdG8gc29tZXRoaW5nIHRvIHVzZSBXUEEgKi8KKwkJbWVtc2V0KG1pYi5rZXlfUlNDLCAwLCBzaXplb2YobWliLmtleV9SU0MpKTsKKwkJCisJCW1pYi5kZWZhdWx0X2tleSA9IG1pYi5ncm91cF9rZXkgPSAyNTU7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfRU5DUllQVElPTl9LRVlTOyBpKyspIHsKKwkJCWlmIChwcml2LT53ZXBfa2V5X2xlbltpXSA+IDApIHsKKwkJCQltZW1jcHkobWliLmNpcGhlcl9kZWZhdWx0X2tleV92YWx1ZVtpXSwgcHJpdi0+d2VwX2tleXNbaV0sIE1BWF9FTkNSWVBUSU9OX0tFWV9TSVpFKTsKKwkJCQlpZiAoaSA9PSBwcml2LT5kZWZhdWx0X2tleSkgeworCQkJCQltaWIuZGVmYXVsdF9rZXkgPSBpOworCQkJCQltaWIuY2lwaGVyX2RlZmF1bHRfa2V5X3ZhbHVlW2ldW01BWF9FTkNSWVBUSU9OX0tFWV9TSVpFLTFdID0gNzsKKwkJCQkJbWliLmNpcGhlcl9kZWZhdWx0X2tleV92YWx1ZVtpXVtNQVhfRU5DUllQVElPTl9LRVlfU0laRS0yXSA9IHByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZTsgCisJCQkJfSBlbHNlIHsKKwkJCQkJbWliLmdyb3VwX2tleSA9IGk7CisJCQkJCXByaXYtPmdyb3VwX2NpcGhlcl9zdWl0ZSA9IHByaXYtPnBhaXJ3aXNlX2NpcGhlcl9zdWl0ZTsKKwkJCQkgICAgICAgIG1pYi5jaXBoZXJfZGVmYXVsdF9rZXlfdmFsdWVbaV1bTUFYX0VOQ1JZUFRJT05fS0VZX1NJWkUtMV0gPSAxOworCQkJCQltaWIuY2lwaGVyX2RlZmF1bHRfa2V5X3ZhbHVlW2ldW01BWF9FTkNSWVBUSU9OX0tFWV9TSVpFLTJdID0gcHJpdi0+Z3JvdXBfY2lwaGVyX3N1aXRlOwkKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG1pYi5kZWZhdWx0X2tleSA9PSAyNTUpCisJCQltaWIuZGVmYXVsdF9rZXkgPSBtaWIuZ3JvdXBfa2V5ICE9IDI1NSA/IG1pYi5ncm91cF9rZXkgOiAwOworCQlpZiAobWliLmdyb3VwX2tleSA9PSAyNTUpCisJCQltaWIuZ3JvdXBfa2V5ID0gbWliLmRlZmF1bHRfa2V5OworCQkKKwl9CisJCisJYXRtZWxfc2V0X21pYihwcml2LCBNYWNfV2VwX01pYl9UeXBlLCAwLCAodTggKikmbWliLCBzaXplb2YobWliKSk7Cit9CisJCQkJCQorc3RhdGljIGludCByZXNldF9hdG1lbF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIAoreworCS8qIGRvIGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIHdha2UgdXAgdGhlIGhhcmR3YXJlLCBpbmNsdWRpbmcKKwkgICB3YWl0aW5nIGZvciB0aGUgbGlnaHRuaW5nIHN0cmlrZSBhbmQgdGhyb3dpbmcgdGhlIGtuaWZlIHN3aXRjaC4uLi4KKworCSAgIHNldCBhbGwgdGhlIE1pYiB2YWx1ZXMgd2hpY2ggbWF0dGVyIGluIHRoZSBjYXJkIHRvIG1hdGNoIAorCSAgIHRoZWlyIHNldHRpbmdzIGluIHRoZSBhdG1lbF9wcml2YXRlIHN0cnVjdHVyZS4gU29tZSBvZiB0aGVzZQorCSAgIGNhbiBiZSBhbHRlcmVkIG9uIHRoZSBmbHksIGJ1dCBtYW55IChXRVAsIGluZnJhc3R1Y3R1cmUgb3IgYWQtaG9jKQorCSAgIGNhbiBvbmx5IGJlIGNoYW5nZWQgYnkgdGVhcmluZyBkb3duIHRoZSB3b3JsZCBhbmQgY29taW5nIGJhY2sgdGhyb3VnaAorCSAgIGhlcmUuCisKKwkgICBUaGlzIHJvdXRpbmUgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGlzaW5nIHNvbWUgCisJICAgaGFyZHdhcmUtc3BlY2lmaWMgZmllbGRzIGluIHRoZSBhdG1lbF9wcml2YXRlIHN0cnVjdHVyZSwgCisJICAgaW5jbHVkaW5nIGEgY29weSBvZiB0aGUgZmlybXdhcmUncyBob3N0aW5mbyBzdHVjdHVyZQorCSAgIHdoaWNoIGlzIHRoZSByb3V0ZSBpbnRvIHRoZSByZXN0IG9mIHRoZSBmaXJtYXJlIGRhdGFzdHJ1Y3R1cmVzLiAqLworCisJc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXU4IGNvbmZpZ3VyYXRpb247CisJCisJLyogZGF0YSB0byBhZGQgdG8gdGhlIGZpcm13YXJlIG5hbWVzLCBpbiBwcmlvcml0eSBvcmRlcgorCSAgIHRoaXMgaW1wbGVtZW5lbnRzIGZpcm13YXJlIHZlcnNpb25pbmcgKi8KKwkKKwlzdGF0aWMgY2hhciAqZmlybXdhcmVfbW9kaWZpZXJbXSA9IHsKKwkJIi13cGEiLAorCQkiIiwKKwkJTlVMTAorCX07CisJCQorCS8qIHJlc2V0IHBjY2FyZCAqLworCWlmIChwcml2LT5idXNfdHlwZSA9PSBCVVNfVFlQRV9QQ0NBUkQpIAorCQlhdG1lbF93cml0ZTE2KHByaXYtPmRldiwgR0NSLCAweDAwNjApOworCQkKKwkvKiBzdG9wIGNhcmQgLCBkaXNhYmxlIGludGVycnVwdHMgKi8KKwlhdG1lbF93cml0ZTE2KHByaXYtPmRldiwgR0NSLCAweDAwNDApOworCQkKKwlpZiAocHJpdi0+Y2FyZF90eXBlID09IENBUkRfVFlQRV9FRVBST00pIHsKKwkJLyogY29weSBpbiBmaXJtd2FyZSBpZiBuZWVkZWQgKi8KKwkJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRyeSA9IE5VTEw7CisJCXVuc2lnbmVkIGNoYXIgKmZ3OworCQlpbnQgbGVuID0gcHJpdi0+ZmlybXdhcmVfbGVuZ3RoOworCQlpZiAoIShmdyA9IHByaXYtPmZpcm13YXJlKSkgeworCQkJaWYgKHByaXYtPmZpcm13YXJlX3R5cGUgPT0gQVRNRUxfRldfVFlQRV9OT05FKSB7CisJCQkJaWYgKHN0cmxlbihwcml2LT5maXJtd2FyZV9pZCkgPT0gMCkgeworCQkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCSAgICAgICAiJXM6IGNhcmQgdHlwZSBpcyB1bmtub3duOiBhc3N1bWluZyBhdDc2YzUwMiBmaXJtd2FyZSBpcyBPSy5cbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCSAgICAgICAiJXM6IGlmIG5vdCwgdXNlIHRoZSBmaXJtd2FyZT0gbW9kdWxlIHBhcmFtZXRlci5cbiIsIAorCQkJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCQkJc3RyY3B5KHByaXYtPmZpcm13YXJlX2lkLCAiYXRtZWxfYXQ3NmM1MDIuYmluIik7CisJCQkJfQorCQkJCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgcHJpdi0+ZmlybXdhcmVfaWQsIHByaXYtPnN5c19kZXYpICE9IDApIHsKKwkJCQkJcHJpbnRrKEtFUk5fQUxFUlQgCisJCQkJCSAgICAgICAiJXM6IGZpcm13YXJlICVzIGlzIG1pc3NpbmcsIGNhbm5vdCBjb250aW51ZS5cbiIsIAorCQkJCQkgICAgICAgZGV2LT5uYW1lLCBwcml2LT5maXJtd2FyZV9pZCk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaW50IGZ3X2luZGV4ID0gMDsKKwkJCQlpbnQgc3VjY2VzcyA9IDA7CisKKwkJCQkvKiBnZXQgZmlybXdhcmUgZmlsZW5hbWUgZW50cnkgYmFzZWQgb24gZmlybXdhcmUgdHlwZSBJRCAqLworCQkJCXdoaWxlIChmd190YWJsZVtmd19pbmRleF0uZndfdHlwZSAhPSBwcml2LT5maXJtd2FyZV90eXBlCisJCQkJCQkmJiBmd190YWJsZVtmd19pbmRleF0uZndfdHlwZSAhPSBBVE1FTF9GV19UWVBFX05PTkUpCisJCQkJCWZ3X2luZGV4Kys7CisJCQkJCisJCQkJLyogY29uc3RydWN0IHRoZSBhY3R1YWwgZmlybXdhcmUgZmlsZSBuYW1lICovCisJCQkJaWYgKGZ3X3RhYmxlW2Z3X2luZGV4XS5md190eXBlICE9IEFUTUVMX0ZXX1RZUEVfTk9ORSkgeworCQkJCQlpbnQgaTsKKwkJCQkJZm9yIChpID0gMDsgZmlybXdhcmVfbW9kaWZpZXJbaV07IGkrKykgeworCQkJCQkJc25wcmludGYocHJpdi0+ZmlybXdhcmVfaWQsIDMyLCAiJXMlcy4lcyIsIGZ3X3RhYmxlW2Z3X2luZGV4XS5md19maWxlLAorCQkJCQkJCWZpcm13YXJlX21vZGlmaWVyW2ldLCBmd190YWJsZVtmd19pbmRleF0uZndfZmlsZV9leHQpOworCQkJCQkJcHJpdi0+ZmlybXdhcmVfaWRbMzFdID0gJ1wwJzsKKwkJCQkJCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgcHJpdi0+ZmlybXdhcmVfaWQsIHByaXYtPnN5c19kZXYpID09IDApIHsKKwkJCQkJCQlzdWNjZXNzID0gMTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoIXN1Y2Nlc3MpIHsKKwkJCQkJcHJpbnRrKEtFUk5fQUxFUlQgCisJCQkJCSAgICAgICAiJXM6IGZpcm13YXJlICVzIGlzIG1pc3NpbmcsIGNhbm5vdCBzdGFydC5cbiIsIAorCQkJCQkgICAgICAgZGV2LT5uYW1lLCBwcml2LT5maXJtd2FyZV9pZCk7CisJCQkJCXByaXYtPmZpcm13YXJlX2lkWzBdID0gJ1wwJzsKKwkJCQkJcmV0dXJuIDA7CQorCQkJCX0KKwkJCX0KKwkJCQorCQkJZncgPSBmd19lbnRyeS0+ZGF0YTsKKwkJCWxlbiA9IGZ3X2VudHJ5LT5zaXplOworCQl9CisJCQorCSAgICAgICAgaWYgKGxlbiA8PSAweDYwMDApIHsKKwkJCWF0bWVsX3dyaXRlMTYocHJpdi0+ZGV2LCBCU1IsIEJTU19JUkFNKTsKKwkJCWF0bWVsX2NvcHlfdG9fY2FyZChwcml2LT5kZXYsIDAsIGZ3LCBsZW4pOworCQkJYXRtZWxfc2V0X2djcihwcml2LT5kZXYsIEdDUl9SRU1BUCk7CisJCX0gZWxzZSB7CisJCQkvKiBSZW1hcCAqLyAKKwkJCWF0bWVsX3NldF9nY3IocHJpdi0+ZGV2LCBHQ1JfUkVNQVApOworCQkJYXRtZWxfd3JpdGUxNihwcml2LT5kZXYsIEJTUiwgQlNTX0lSQU0pOworCQkJYXRtZWxfY29weV90b19jYXJkKHByaXYtPmRldiwgMCwgZncsIDB4NjAwMCk7CisJCQlhdG1lbF93cml0ZTE2KHByaXYtPmRldiwgQlNSLCAweDJmZik7CisJCQlhdG1lbF9jb3B5X3RvX2NhcmQocHJpdi0+ZGV2LCAweDgwMDAsICZmd1sweDYwMDBdLCBsZW4gLSAweDYwMDApOworCQl9CisKKwkJaWYgKGZ3X2VudHJ5KQorCQkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CisJfQorCisJaWYgKCFhdG1lbF93YWtldXBfZmlybXdhcmUocHJpdikpCisJCXJldHVybiAwOworCisJLyogQ2hlY2sgdGhlIHZlcnNpb24gYW5kIHNldCB0aGUgY29ycmVjdCBmbGFnIGZvciB3cGEgc3R1ZmYsCisJICAgb2xkIGFuZCBuZXcgZmlybXdhcmUgaXMgaW5jb21wYXRpYmxlLgorCSAgIFRoZSBwcmUtd3BhIDNjb20gZmlybXdhcmUgcmVwb3J0cyBtYWpvciB2ZXJzaW9uIDUsCisJICAgdGhlIHdwYSAzY29tIGZpcm13YXJlIGlzIG1ham9yIHZlcnNpb24gNCBhbmQgZG9lc24ndCBuZWVkCisJICAgdGhlIDNjb20gYnJva2VuLW5lc3MgZmlsdGVyLiAqLworCXByaXYtPnVzZV93cGEgPSAocHJpdi0+aG9zdF9pbmZvLm1ham9yX3ZlcnNpb24gPT0gNCk7CisJcHJpdi0+cmFkaW9fb25fYnJva2VuID0gKHByaXYtPmhvc3RfaW5mby5tYWpvcl92ZXJzaW9uID09IDUpOworCQorICAgICAgICAvKiB1bm1hc2sgYWxsIGlycSBzb3VyY2VzICovCisJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfaGkocHJpdiwgSUZBQ0VfSU5UX01BU0tfT0ZGU0VUKSwgMHhmZik7CisJCisJLyogaW50IFR4IHN5c3RlbSBhbmQgZW5hYmxlIFR4ICovCisJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19GTEFHU19PRkZTRVQsIDApLCAwKTsKKwlhdG1lbF93bWVtMzIocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19ORVhUX09GRlNFVCwgMCksIDB4ODAwMDAwMDBMKTsKKwlhdG1lbF93bWVtMTYocHJpdiwgYXRtZWxfdHgocHJpdiwgVFhfREVTQ19QT1NfT0ZGU0VULCAwKSwgMCk7CisJYXRtZWxfd21lbTE2KHByaXYsIGF0bWVsX3R4KHByaXYsIFRYX0RFU0NfU0laRV9PRkZTRVQsIDApLCAwKTsKKworCXByaXYtPnR4X2Rlc2NfZnJlZSA9IHByaXYtPmhvc3RfaW5mby50eF9kZXNjX2NvdW50OwkJCisJcHJpdi0+dHhfZGVzY19oZWFkID0gMDsJCQkJCQkJCQkKKwlwcml2LT50eF9kZXNjX3RhaWwgPSAwOwkJCQkJCQkJCQorCXByaXYtPnR4X2Rlc2NfcHJldmlvdXMgPSAwOworCXByaXYtPnR4X2ZyZWVfbWVtID0gcHJpdi0+aG9zdF9pbmZvLnR4X2J1ZmZfc2l6ZTsKKwlwcml2LT50eF9idWZmX2hlYWQgPSAwOwkKKwlwcml2LT50eF9idWZmX3RhaWwgPSAwOwkKKwkJCisJY29uZmlndXJhdGlvbiA9IGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX2hpKHByaXYsIElGQUNFX0ZVTkNfQ1RSTF9PRkZTRVQpKTsgCisJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfaGkocHJpdiwgSUZBQ0VfRlVOQ19DVFJMX09GRlNFVCksIAorCQkJCSAgIGNvbmZpZ3VyYXRpb24gfCBGVU5DX0NUUkxfVHhFTkFCTEUpOworCisJLyogaW5pdCBSeCBzeXN0ZW0gYW5kIGVuYWJsZSAqLworCXByaXYtPnJ4X2Rlc2NfaGVhZCA9IDA7CisJCisJY29uZmlndXJhdGlvbiA9IGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX2hpKHByaXYsIElGQUNFX0ZVTkNfQ1RSTF9PRkZTRVQpKTsgCisJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfaGkocHJpdiwgSUZBQ0VfRlVOQ19DVFJMX09GRlNFVCksIAorCQkJCSAgIGNvbmZpZ3VyYXRpb24gfCBGVU5DX0NUUkxfUnhFTkFCTEUpOworCQkJCisJaWYgKCFwcml2LT5yYWRpb19vbl9icm9rZW4pIHsKKwkJaWYgKGF0bWVsX3NlbmRfY29tbWFuZF93YWl0KHByaXYsIENNRF9FbmFibGVSYWRpbywgTlVMTCwgMCkgPT0gCisJCSAgICBDTURfU1RBVFVTX1JFSkVDVEVEX1JBRElPX09GRikgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSAgICAgICAiJXM6IGNhbm5vdCB0dXJuIHRoZSByYWRpbyBvbi4gKEhleSByYWRpbywgeW91J3JlIGJlYXV0aWZ1bCEpXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwkJfQorCX0KKwkKKwkvKiBzZXQgdXAgZW5vdWdoIE1JQiB2YWx1ZXMgdG8gcnVuLiAqLworCWF0bWVsX3NldF9taWI4KHByaXYsIExvY2FsX01pYl9UeXBlLCBMT0NBTF9NSUJfQVVUT19UWF9SQVRFX1BPUywgcHJpdi0+YXV0b190eF9yYXRlKTsKKwlhdG1lbF9zZXRfbWliOChwcml2LCBMb2NhbF9NaWJfVHlwZSwgIExPQ0FMX01JQl9UWF9QUk9NSVNDVU9VU19QT1MsICBQUk9NX01PREVfT0ZGKTsKKwlhdG1lbF9zZXRfbWliMTYocHJpdiwgTWFjX01pYl9UeXBlLCBNQUNfTUlCX1JUU19USFJFU0hPTERfUE9TLCBwcml2LT5ydHNfdGhyZXNob2xkKTsKKwlhdG1lbF9zZXRfbWliMTYocHJpdiwgTWFjX01pYl9UeXBlLCBNQUNfTUlCX0ZSQUdfVEhSRVNIT0xEX1BPUywgcHJpdi0+ZnJhZ190aHJlc2hvbGQpOworCWF0bWVsX3NldF9taWI4KHByaXYsIE1hY19NaWJfVHlwZSwgTUFDX01JQl9TSE9SVF9SRVRSWV9QT1MsIHByaXYtPnNob3J0X3JldHJ5KTsKKwlhdG1lbF9zZXRfbWliOChwcml2LCBNYWNfTWliX1R5cGUsIE1BQ19NSUJfTE9OR19SRVRSWV9QT1MsIHByaXYtPmxvbmdfcmV0cnkpOworCWF0bWVsX3NldF9taWI4KHByaXYsIExvY2FsX01pYl9UeXBlLCBMT0NBTF9NSUJfUFJFQU1CTEVfVFlQRSwgcHJpdi0+cHJlYW1ibGUpOworCWF0bWVsX3NldF9taWIocHJpdiwgTWFjX0FkZHJlc3NfTWliX1R5cGUsIE1BQ19BRERSX01JQl9NQUNfQUREUl9QT1MsIAorCQkgICAgICBwcml2LT5kZXYtPmRldl9hZGRyLCA2KTsKKwlhdG1lbF9zZXRfbWliOChwcml2LCBNYWNfTWdtdF9NaWJfVHlwZSwgTUFDX01HTVRfTUlCX1BTX01PREVfUE9TLCBBQ1RJVkVfTU9ERSk7CisJYXRtZWxfc2V0X21pYjE2KHByaXYsIE1hY19NZ210X01pYl9UeXBlLCBNQUNfTUdNVF9NSUJfTElTVEVOX0lOVEVSVkFMX1BPUywgMSk7CisJYXRtZWxfc2V0X21pYjE2KHByaXYsIE1hY19NZ210X01pYl9UeXBlLCBNQUNfTUdNVF9NSUJfQkVBQ09OX1BFUl9QT1MsIHByaXYtPmRlZmF1bHRfYmVhY29uX3BlcmlvZCk7CisJYXRtZWxfc2V0X21pYihwcml2LCBQaHlfTWliX1R5cGUsIFBIWV9NSUJfUkFURV9TRVRfUE9TLCBhdG1lbF9iYXNpY19yYXRlcywgNCk7CisJYXRtZWxfc2V0X21pYjgocHJpdiwgTWFjX01nbXRfTWliX1R5cGUsIE1BQ19NR01UX01JQl9DVVJfUFJJVkFDWV9QT1MsIHByaXYtPndlcF9pc19vbik7CisJaWYgKHByaXYtPnVzZV93cGEpCisJCWJ1aWxkX3dwYV9taWIocHJpdik7CisJZWxzZQorCQlidWlsZF93ZXBfbWliKHByaXYpOworCQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF9zZW5kX2NvbW1hbmQoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIGludCBjb21tYW5kLCB2b2lkICpjbWQsIGludCBjbWRfc2l6ZSkKK3sKKwlpZiAoY21kKQorCQlhdG1lbF9jb3B5X3RvX2NhcmQocHJpdi0+ZGV2LCBhdG1lbF9jbyhwcml2LCBDTURfQkxPQ0tfUEFSQU1FVEVSU19PRkZTRVQpLCAKKwkJCQkgICBjbWQsIGNtZF9zaXplKTsKKwkKKwlhdG1lbF93bWVtOChwcml2LCBhdG1lbF9jbyhwcml2LCBDTURfQkxPQ0tfQ09NTUFORF9PRkZTRVQpLCBjb21tYW5kKTsKKwlhdG1lbF93bWVtOChwcml2LCBhdG1lbF9jbyhwcml2LCBDTURfQkxPQ0tfU1RBVFVTX09GRlNFVCksIDApOworfQorCQorc3RhdGljIGludCBhdG1lbF9zZW5kX2NvbW1hbmRfd2FpdChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgaW50IGNvbW1hbmQsIHZvaWQgKmNtZCwgaW50IGNtZF9zaXplKQoreworCWludCBpLCBzdGF0dXM7CisJCisJYXRtZWxfc2VuZF9jb21tYW5kKHByaXYsIGNvbW1hbmQsIGNtZCwgY21kX3NpemUpOworCQorCWZvciAoaSA9IDUwMDA7IGk7IGktLSkgeworCQlzdGF0dXMgPSBhdG1lbF9ybWVtOChwcml2LCBhdG1lbF9jbyhwcml2LCBDTURfQkxPQ0tfU1RBVFVTX09GRlNFVCkpOworCQlpZiAoc3RhdHVzICE9IENNRF9TVEFUVVNfSURMRSAmJiAKKwkJICAgIHN0YXR1cyAhPSBDTURfU1RBVFVTX0lOX1BST0dSRVNTKQorCQkJYnJlYWs7CisJCXVkZWxheSgyMCk7CisJfQorCQorCWlmIChpID09IDApIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBmYWlsZWQgdG8gY29udGFjdCBNQUMuXG4iLCBwcml2LT5kZXYtPm5hbWUpOworCQlzdGF0dXMgPSAgQ01EX1NUQVRVU19IT1NUX0VSUk9SOworCX0gZWxzZSB7IAorCQlpZiAoY29tbWFuZCAhPSBDTURfRW5hYmxlUmFkaW8pCisJCQlzdGF0dXMgPSBDTURfU1RBVFVTX0NPTVBMRVRFOworCX0KKwkKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdTggYXRtZWxfZ2V0X21pYjgoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHU4IHR5cGUsIHU4IGluZGV4KQoreworCXN0cnVjdCBnZXRfc2V0X21pYiBtOworCW0udHlwZSA9IHR5cGU7CisJbS5zaXplID0gMTsKKwltLmluZGV4ID0gaW5kZXg7CisKKwlhdG1lbF9zZW5kX2NvbW1hbmRfd2FpdChwcml2LCBDTURfR2V0X01JQl9WYXJzLCAmbSwgTUlCX0hFQURFUl9TSVpFICsgMSk7CisJcmV0dXJuIGF0bWVsX3JtZW04KHByaXYsIGF0bWVsX2NvKHByaXYsIENNRF9CTE9DS19QQVJBTUVURVJTX09GRlNFVCArIE1JQl9IRUFERVJfU0laRSkpOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF9zZXRfbWliOChzdHJ1Y3QgYXRtZWxfcHJpdmF0ZSAqcHJpdiwgdTggdHlwZSwgdTggaW5kZXgsIHU4IGRhdGEpCit7CisJc3RydWN0IGdldF9zZXRfbWliIG07CisJbS50eXBlID0gdHlwZTsKKwltLnNpemUgPSAxOworCW0uaW5kZXggPSBpbmRleDsKKwltLmRhdGFbMF0gPSBkYXRhOworCisJYXRtZWxfc2VuZF9jb21tYW5kX3dhaXQocHJpdiwgQ01EX1NldF9NSUJfVmFycywgJm0sIE1JQl9IRUFERVJfU0laRSArIDEpOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF9zZXRfbWliMTYoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHU4IHR5cGUsIHU4IGluZGV4LCB1MTYgZGF0YSkKK3sKKwlzdHJ1Y3QgZ2V0X3NldF9taWIgbTsKKwltLnR5cGUgPSB0eXBlOworCW0uc2l6ZSA9IDI7CisJbS5pbmRleCA9IGluZGV4OworCW0uZGF0YVswXSA9IGRhdGE7CisJbS5kYXRhWzFdID0gZGF0YSA+PiA4OworCisJYXRtZWxfc2VuZF9jb21tYW5kX3dhaXQocHJpdiwgQ01EX1NldF9NSUJfVmFycywgJm0sIE1JQl9IRUFERVJfU0laRSArIDIpOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF9zZXRfbWliKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2LCB1OCB0eXBlLCB1OCBpbmRleCwgdTggKmRhdGEsIGludCBkYXRhX2xlbikKK3sKKwlzdHJ1Y3QgZ2V0X3NldF9taWIgbTsKKwltLnR5cGUgPSB0eXBlOworCW0uc2l6ZSA9IGRhdGFfbGVuOworCW0uaW5kZXggPSBpbmRleDsKKworCWlmIChkYXRhX2xlbiA+IE1JQl9NQVhfREFUQV9CWVRFUykKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBNSUIgYnVmZmVyIHRvbyBzbWFsbC5cbiIsIHByaXYtPmRldi0+bmFtZSk7CisJCisJbWVtY3B5KG0uZGF0YSwgZGF0YSwgZGF0YV9sZW4pOworCWF0bWVsX3NlbmRfY29tbWFuZF93YWl0KHByaXYsIENNRF9TZXRfTUlCX1ZhcnMsICZtLCBNSUJfSEVBREVSX1NJWkUgKyBkYXRhX2xlbik7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX2dldF9taWIoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHU4IHR5cGUsIHU4IGluZGV4LCB1OCAqZGF0YSwgaW50IGRhdGFfbGVuKQoreworCXN0cnVjdCBnZXRfc2V0X21pYiBtOworCW0udHlwZSA9IHR5cGU7CisJbS5zaXplID0gZGF0YV9sZW47CisJbS5pbmRleCA9IGluZGV4OworCQorCWlmIChkYXRhX2xlbiA+IE1JQl9NQVhfREFUQV9CWVRFUykKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBNSUIgYnVmZmVyIHRvbyBzbWFsbC5cbiIsIHByaXYtPmRldi0+bmFtZSk7CisJCisJYXRtZWxfc2VuZF9jb21tYW5kX3dhaXQocHJpdiwgQ01EX0dldF9NSUJfVmFycywgJm0sIE1JQl9IRUFERVJfU0laRSArIGRhdGFfbGVuKTsKKwlhdG1lbF9jb3B5X3RvX2hvc3QocHJpdi0+ZGV2LCBkYXRhLCAKKwkJCSAgIGF0bWVsX2NvKHByaXYsIENNRF9CTE9DS19QQVJBTUVURVJTX09GRlNFVCArIE1JQl9IRUFERVJfU0laRSksIGRhdGFfbGVuKTsKK30KKworc3RhdGljIHZvaWQgYXRtZWxfd3JpdGVBUihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgZGF0YSkKK3sKKwlpbnQgaTsKKwlvdXR3KGRhdGEsIGRldi0+YmFzZV9hZGRyICsgQVIpOworCS8qIEFkZHJlc3MgcmVnaXN0ZXIgYXBwZWFycyB0byBuZWVkIHNvbWUgY29udmluY2luZy4uLi4uICovCisJZm9yIChpID0gMDsgZGF0YSAhPSBpbncoZGV2LT5iYXNlX2FkZHIgKyBBUikgJiYgaTwxMDsgaSsrKQorCQlvdXR3KGRhdGEsIGRldi0+YmFzZV9hZGRyICsgQVIpOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF9jb3B5X3RvX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGRlc3QsIHVuc2lnbmVkIGNoYXIgKnNyYywgdTE2IGxlbikKK3sKKwlpbnQgaTsKKwlhdG1lbF93cml0ZUFSKGRldiwgZGVzdCk7CisJaWYgKGRlc3QgJSAyKSB7CisJCWF0bWVsX3dyaXRlOChkZXYsIERSLCAqc3JjKTsKKwkJc3JjKys7IGxlbi0tOworCX0KKwlmb3IgKGkgPSBsZW47IGkgPiAxIDsgaSAtPSAyKSB7CisJCXU4IGxiID0gKnNyYysrOworCQl1OCBoYiA9ICpzcmMrKzsKKwkJYXRtZWxfd3JpdGUxNihkZXYsIERSLCBsYiB8IChoYiA8PCA4KSk7CisJfQorCWlmIChpKQorCQlhdG1lbF93cml0ZTgoZGV2LCBEUiwgKnNyYyk7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX2NvcHlfdG9faG9zdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICpkZXN0LCB1MTYgc3JjLCB1MTYgbGVuKQoreworCWludCBpOworCWF0bWVsX3dyaXRlQVIoZGV2LCBzcmMpOworCWlmIChzcmMgJSAyKSB7CisJCSpkZXN0ID0gYXRtZWxfcmVhZDgoZGV2LCBEUik7CisJCWRlc3QrKzsgbGVuLS07CisJfQorCWZvciAoaSA9IGxlbjsgaSA+IDEgOyBpIC09IDIpIHsKKwkJdTE2IGh3ID0gYXRtZWxfcmVhZDE2KGRldiwgRFIpOworCQkqZGVzdCsrID0gaHc7CisJCSpkZXN0KysgPSBodyA+PiA4OworCX0KKwlpZiAoaSkKKwkJKmRlc3QgPSBhdG1lbF9yZWFkOChkZXYsIERSKTsKK30KKworc3RhdGljIHZvaWQgYXRtZWxfc2V0X2djcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgbWFzaykKK3sKKwlvdXR3KGludyhkZXYtPmJhc2VfYWRkciArIEdDUikgfCBtYXNrLCBkZXYtPmJhc2VfYWRkciArIEdDUik7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX2NsZWFyX2djcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgbWFzaykKK3sKKwlvdXR3KGludyhkZXYtPmJhc2VfYWRkciArIEdDUikgJiB+bWFzaywgZGV2LT5iYXNlX2FkZHIgKyBHQ1IpOworfQorCitzdGF0aWMgaW50IGF0bWVsX2xvY2tfbWFjKHN0cnVjdCBhdG1lbF9wcml2YXRlICpwcml2KQoreworCWludCBpLCBqID0gMjA7CisgcmV0cnk6CisJZm9yIChpID0gNTAwMDsgaTsgaS0tKSB7CisJCWlmICghYXRtZWxfcm1lbTgocHJpdiwgYXRtZWxfaGkocHJpdiwgSUZBQ0VfTE9DS09VVF9IT1NUX09GRlNFVCkpKQorCQkJYnJlYWs7CisJCXVkZWxheSgyMCk7CisJfQorCQorCWlmICghaSkgcmV0dXJuIDA7IC8qIHRpbWVkIG91dCAqLworCQorCWF0bWVsX3dtZW04KHByaXYsIGF0bWVsX2hpKHByaXYsIElGQUNFX0xPQ0tPVVRfTUFDX09GRlNFVCksIDEpOworCWlmIChhdG1lbF9ybWVtOChwcml2LCBhdG1lbF9oaShwcml2LCBJRkFDRV9MT0NLT1VUX0hPU1RfT0ZGU0VUKSkpIHsKKwkJYXRtZWxfd21lbTgocHJpdiwgYXRtZWxfaGkocHJpdiwgSUZBQ0VfTE9DS09VVF9NQUNfT0ZGU0VUKSwgMCk7CisJCWlmICghai0tKSByZXR1cm4gMDsgLyogdGltZWQgb3V0ICovCisJCWdvdG8gcmV0cnk7CisJfQorCQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF93bWVtMzIoc3RydWN0IGF0bWVsX3ByaXZhdGUgKnByaXYsIHUxNiBwb3MsIHUzMiBkYXRhKQoreworICAgICAgIAlhdG1lbF93cml0ZUFSKHByaXYtPmRldiwgcG9zKTsJCisJYXRtZWxfd3JpdGUxNihwcml2LT5kZXYsIERSLCBkYXRhKTsgLyogY2FyZCBpcyBsaXR0bGUtZW5kaWFuICovCisJYXRtZWxfd3JpdGUxNihwcml2LT5kZXYsIERSLCBkYXRhID4+IDE2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoZXJlIGZvbGxvd3MgdGhlIHNvdXJjZSBmb3JtIG9mIHRoZSBNQUMgYWRkcmVzcyByZWFkaW5nIGZpcm13YXJlICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIDAKKworLyogQ29weXJpZ2h0IDIwMDMgTWF0dGhldyBULiBSdXNzb3R0byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEJ1dCBkZXJpdmVkIGZyb20gdGhlIEF0bWVsIDc2QzUwMiBmaXJtd2FyZSB3cml0dGVuIGJ5IEF0bWVsIGFuZCAgICAgICAgICovCisvKiBpbmNsdWRlZCBpbiAiYXRtZWwgd2lyZWxlc3MgbGFuIGRyaXZlcnMiIHBhY2thZ2UgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqCisgICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgbmV0LnJ1c3NvdHRvLkF0bWVsTUFDRlcsIGhlcmV0byByZWZlcnJlZCB0bworICAgIGFzIEF0bWVsTUFDRlcKKworICAgIEF0bWVsTUFDRlcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgICBBdG1lbE1BQ0ZXIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCBBdG1lbE1BQ0ZXOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGhpcyBmaXJtd2FyZSBzaG91bGQgd29yayBvbiB0aGUgNzZDNTAyIFJGTUQsIFJGTURfRCwgYW5kIFJGTURfRSAgICAgICAgKi8KKy8qIEl0IHdpbGwgcHJvYmFibHkgd29yayBvbiB0aGUgNzZDNTA0IGFuZCA3NkM1MDIgUkZNRF8zQ09NICAgICAgICAgICAgICAgICovCisvKiBJdCBvbmx5IHdvcmtzIG9uIFNQSSBFRVBST00gdmVyc2lvbnMgb2YgdGhlIGNhcmQuICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBUaGlzIGZpcm13YXJlIGluaXRpYWxpemVzIHRoZSBTUEkgY29udHJvbGxlciBhbmQgY2xvY2ssIHJlYWRzIHRoZSBNQUMgICAqLworLyogYWRkcmVzcyBmcm9tIHRoZSBFRVBST00gaW50byBTUkFNLCBhbmQgcHV0cyB0aGUgU1JBTSBvZmZzZXQgb2YgdGhlIE1BQyAgKi8KKy8qIGFkZHJlc3MgaW4gTVIyLCBhbmQgc2V0cyBNUjMgdG8gMHgxMCB0byBpbmRpY2F0ZSBpdCBpcyBkb25lICAgICAgICAgICAgICovCisvKiBJdCBhbHNvIHB1dHMgYSBjb21wbGV0ZSBjb3B5IG9mIHRoZSBFRVBST00gaW4gU1JBTSB3aXRoIHRoZSBvZmZzZXQgaW4gICAqLworLyogTVI0LCBmb3IgaW52ZXN0aWdhdGlvbmFsIHB1cnBvc2VzIChtYXliZSB3ZSBjYW4gZGV0ZXJtaW5lIGNoaXAgdHlwZSAgICAgKi8KKy8qIGZyb20gdGhhdD8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKwkub3JnIDAKKyAgICAuc2V0IE1SQkFTRSwgMHg4MDAwMDAwCisJLnNldCBDUFNSX0lOSVRJQUwsIDB4RDMgLyogSVJRL0ZJUSBkaXNhYmxlZCwgQVJNIG1vZGUsIFN1cGVydmlzb3Igc3RhdGUgKi8KKwkuc2V0IENQU1JfVVNFUiwgMHhEMSAvKiBJUlEvRklRIGRpc2FibGVkLCBBUk0gbW9kZSwgVVNFUiBzdGF0ZSAqLworCS5zZXQgU1JBTV9CQVNFLCAgMHgwMjAwMDAwMAorCS5zZXQgU1BfQkFTRSwgICAgMHgwRjMwMDAwMAorCS5zZXQgVU5LX0JBU0UsICAgMHgwRjAwMDAwMCAvKiBTb21lIGludGVybmFsIGRldmljZSwgYnV0IHdoaWNoIG9uZT8gKi8KKwkuc2V0IFNQSV9DR0VOX0JBU0UsICAweDBFMDAwMDAwIC8qIFNvbWUgaW50ZXJuYWwgZGV2aWNlLCBidXQgd2hpY2ggb25lPyAqLworCS5zZXQgVU5LM19CQVNFLCAgMHgwMjAxNDAwMCAvKiBTb21lIGludGVybmFsIGRldmljZSwgYnV0IHdoaWNoIG9uZT8gKi8KKwkuc2V0IFNUQUNLX0JBU0UsIDB4NTYwMAorCS5zZXQgU1BfU1IsIDB4MTAKKwkuc2V0IFNQX1REUkUsIDIgLyogc3RhdHVzIHJlZ2lzdGVyIGJpdCAtLSBURFIgZW1wdHkgKi8KKwkuc2V0IFNQX1JEUkYsIDEgLyogc3RhdHVzIHJlZ2lzdGVyIGJpdCAtLSBSRFIgZnVsbCAqLworCS5zZXQgU1BfU1dSU1QsIDB4ODAKKwkuc2V0IFNQX1NQSUVOLCAweDEKKwkuc2V0IFNQX0NSLCAwICAgLyogY29udHJvbCByZWdpc3RlciAqLworCS5zZXQgU1BfTVIsIDQgICAvKiBtb2RlIHJlZ2lzdGVyICovCisJLnNldCBTUF9SRFIsIDB4MDggLyogUmVhZCBEYXRhIFJlZ2lzdGVyICovCisJLnNldCBTUF9URFIsIDB4MEMgLyogVHJhbnNtaXQgRGF0YSBSZWdpc3RlciAqLworCS5zZXQgU1BfQ1NSMCwgMHgzMCAvKiBjaGlwIHNlbGVjdCByZWdpc3RlcnMgKi8KKwkuc2V0IFNQX0NTUjEsIDB4MzQKKwkuc2V0IFNQX0NTUjIsIDB4MzgKKwkuc2V0IFNQX0NTUjMsIDB4M0MKKwkuc2V0IE5WUkFNX0NNRF9SRFNSLCA1IC8qIHJlYWQgc3RhdHVzIHJlZ2lzdGVyICovCisJLnNldCBOVlJBTV9DTURfUkVBRCwgMyAvKiByZWFkIGRhdGEgKi8KKwkuc2V0IE5WUkFNX1NSX1JEWSwgMSAvKiBSRFkgYml0LiAgVGhpcyBiaXQgaXMgaW52ZXJ0ZWQgKi8KKwkuc2V0IFNQSV84Q0xPQ0tTLCAweEZGIC8qIFdyaXRpbmcgdGhpcyB0byB0aGUgVERSIGRvZXNuJ3QgZG8gYW55dGhpbmcgdG8gdGhlCisJCQkJICBzZXJpYWwgb3V0cHV0LCBzaW5jZSBTTyBpcyBub3JtYWxseSBoaWdoLiAgQnV0IGl0CisJCQkJICBkb2VzIGNhdXNlIDggY2xvY2sgY3ljbGVzIGFuZCB0aHVzIDggYml0cyB0byBiZQorCQkJCSAgY2xvY2tlZCBpbiB0byB0aGUgY2hpcC4gIFNlZSBBdG1lbCdzIFNQSQorCQkJCSAgY29udHJvbGxlciAoZS5nLiBBVDkxTTU1ODAwKSB0aW1pbmcgYW5kIDRLIAorCQkJCSAgU1BJIEVFUFJPTSBtYW51YWxzICovCisJCQkJIAorCS5zZXQgTlZSQU1fU0NSQVRDSCwgMHgwMjAwMDEwMCAgLyogYXJiaXRyYXJ5IGFyZWEgZm9yIHNjcmF0Y2hwYWQgbWVtb3J5ICovCisJLnNldCBOVlJBTV9JTUFHRSwgMHgwMjAwMDIwMAorCS5zZXQgTlZSQU1fTEVOR1RILCAweDAyMDAKKwkuc2V0IE1BQ19BRERSRVNTX01JQiwgU1JBTV9CQVNFCisJLnNldCBNQUNfQUREUkVTU19MRU5HVEgsIDYKKyAgICAgICAgLnNldCBNQUNfQk9PVF9GTEFHLCAweDEwCisJLnNldCBNUjEsIDAKKwkuc2V0IE1SMiwgNAorCS5zZXQgTVIzLCA4CisJLnNldCBNUjQsIDB4QworUkVTRVRfVkVDVE9SOgorICAgICAgICBiIFJFU0VUX0hBTkRMRVIKK1VOREVGX1ZFQ1RPUjogIAorICAgICAgICBiIEhBTFQxCitTV0lfVkVDVE9SOiAgICAgICAgICAgIAorICAgICAgICBiIEhBTFQxCitJQUJPUlRfVkVDVE9SOiAKKyAgICAgICAgYiBIQUxUMQorREFCT1JUX1ZFQ1RPUjogICAgICAgICAKK1JFU0VSVkVEX1ZFQ1RPUjogICAgCisgICAgICAgIGIgSEFMVDEKK0lSUV9WRUNUT1I6ICAgIAorICAgICAgICBiIEhBTFQxCitGSVFfVkVDVE9SOiAgICAKKwliIEhBTFQxCitIQUxUMToJYiBIQUxUMQorUkVTRVRfSEFORExFUjoKKwltb3YgICAgIHIwLCAjQ1BTUl9JTklUSUFMCisJbXNyCUNQU1JfYywgcjAJLyogVGhpcyBpcyBwcm9iYWJseSB1bm5lY2Vzc2FyeSAqLworCQkJCisvKiBJJ20gZ3Vlc3NpbmcgdGhpcyBpcyBpbml0aWFsaXppbmcgY2xvY2sgZ2VuZXJhdG9yIGVsZWN0cm9uaWNzIGZvciBTUEkgKi8KKwlsZHIJcjAsID1TUElfQ0dFTl9CQVNFCisJbW92CXIxLCAjMAorCW1vdglyMSwgcjEsIGxzbCAjMworCW9ycglyMSxyMSwgIzAKKwlzdHIJcjEsIFtyMF0KKwlsZHIJcjEsIFtyMCwgIzI4XQorCWJpYwlyMSwgcjEsICMxNgorCXN0cglyMSwgW3IwLCAjMjhdCisJbW92CXIxLCAjMQorCXN0cglyMSwgW3IwLCAjOF0KKwkKKwlsZHIJcjAsID1NUkJBU0UKKwltb3YJcjEsICMwCisJc3RyaAlyMSwgW3IwLCAjTVIxXQorCXN0cmgJcjEsIFtyMCwgI01SMl0KKwlzdHJoCXIxLCBbcjAsICNNUjNdCisJc3RyaAlyMSwgW3IwLCAjTVI0XQorCisJbW92CXNwLCAjU1RBQ0tfQkFTRQorCWJsCVNQX0lOSVQKKwltb3YJcjAsICMxMAorCWJsCURFTEFZOQorCWJsCUdFVF9NQUNfQUREUgorCWJsCUdFVF9XSE9MRV9OVlJBTQorCWxkcglyMCwgPU1SQkFTRQorCWxkcglyMSwgPU1BQ19BRERSRVNTX01JQgorCXN0cmgJcjEsIFtyMCwgI01SMl0KKwlsZHIJcjEsID1OVlJBTV9JTUFHRQorCXN0cmgJcjEsIFtyMCwgI01SNF0KKwltb3YJcjEsICNNQUNfQk9PVF9GTEFHCisJc3RyaAlyMSwgW3IwLCAjTVIzXQorSEFMVDI6CWIgSEFMVDIKKy5mdW5jIEdldF9XaG9sZV9OVlJBTSwgR0VUX1dIT0xFX05WUkFNCitHRVRfV0hPTEVfTlZSQU06CisJc3RtZGIJc3AhLCB7bHJ9CisJbW92CXIyLCAjMCAvKiAwdGggYnl0ZXMgb2YgTlZSQU0gKi8KKwltb3YJcjMsICNOVlJBTV9MRU5HVEgKKwltb3YJcjEsICMwCQkvKiBub3QgdXNlZCBpbiByb3V0aW5lICovCisJbGRyCXIwLCA9TlZSQU1fSU1BR0UKKwlibAlOVlJBTV9YRkVSCisJbGRtaWEJc3AhLCB7bHJ9CisJYngJbHIKKy5lbmRmdW5jCisJCisuZnVuYyBHZXRfTUFDX0FkZHIsIEdFVF9NQUNfQUREUgorR0VUX01BQ19BRERSOgorCXN0bWRiCXNwISwge2xyfQorCW1vdglyMiwgIzB4MTIwCS8qIGFkZHJlc3Mgb2YgTUFDIEFkZHJlc3Mgd2l0aGluIE5WUkFNICovCisJbW92CXIzLCAjTUFDX0FERFJFU1NfTEVOR1RICisJbW92CXIxLCAjMAkJLyogbm90IHVzZWQgaW4gcm91dGluZSAqLworCWxkcglyMCwgPU1BQ19BRERSRVNTX01JQgorCWJsCU5WUkFNX1hGRVIKKwlsZG1pYQlzcCEsIHtscn0KKwlieAlscgorLmVuZGZ1bmMKKy5sdG9yZworLmZ1bmMgRGVsYXk5LCBERUxBWTkKK0RFTEFZOToKKwlhZGRzCXIwLCByMCwgcjAsIExTTCAjMyAgIC8qIHIwID0gcjAgKiA5ICovCitERUxBWUxPT1A6CQorCWJlcQlERUxBWTlfZG9uZQorCXN1YnMJcjAsIHIwLCAjMQorCWIJREVMQVlMT09QCitERUxBWTlfZG9uZToJCisJYngJbHIKKy5lbmRmdW5jCQorCisuZnVuYyBTUF9Jbml0LCBTUF9JTklUCitTUF9JTklUOgorCW1vdglyMSwgI1NQX1NXUlNUCisJbGRyCXIwLCA9U1BfQkFTRQorCXN0cglyMSwgW3IwLCAjU1BfQ1JdIC8qIHJlc2V0IHRoZSBTUEkgKi8KKwltb3YJcjEsICMwCisJc3RyCXIxLCBbcjAsICNTUF9DUl0gLyogcmVsZWFzZSBTUEkgZnJvbSByZXNldCBzdGF0ZSAqLworCW1vdglyMSwgI1NQX1NQSUVOCisJc3RyCXIxLCBbcjAsICNTUF9NUl0gLyogc2V0IHRoZSBTUEkgdG8gTUFTVEVSIG1vZGUqLworCXN0cglyMSwgW3IwLCAjU1BfQ1JdIC8qIGVuYWJsZSB0aGUgU1BJICovCisKKy8qICBNeSBndWVzcyB3b3VsZCBiZSB0aGlzIHR1cm5zIG9uIHRoZSBTUEkgY2xvY2sgKi8KKwlsZHIJcjMsID1TUElfQ0dFTl9CQVNFCisJbGRyCXIxLCBbcjMsICMyOF0KKwlvcnIJcjEsIHIxLCAjMHgyMDAwCisJc3RyCXIxLCBbcjMsICMyOF0KKworCWxkcglyMSwgPTB4MjAwMGMwMQorCXN0cglyMSwgW3IwLCAjU1BfQ1NSMF0KKwlsZHIJcjEsID0weDIwMDAyMDEKKwlzdHIJcjEsIFtyMCwgI1NQX0NTUjFdCisJc3RyCXIxLCBbcjAsICNTUF9DU1IyXQorCXN0cglyMSwgW3IwLCAjU1BfQ1NSM10KKwlsZHIJcjEsIFtyMCwgI1NQX1NSXQorCWxkcglyMCwgW3IwLCAjU1BfUkRSXQorCWJ4CWxyCisuZW5kZnVuYworLmZ1bmMgTlZSQU1fSW5pdCwgTlZSQU1fSU5JVAkKK05WUkFNX0lOSVQ6CisJbGRyCXIxLCA9U1BfQkFTRQorCWxkcglyMCwgW3IxLCAjU1BfUkRSXQorCW1vdglyMCwgI05WUkFNX0NNRF9SRFNSCisJc3RyCXIwLCBbcjEsICNTUF9URFJdCitTUF9sb29wMToJCisJbGRyCXIwLCBbcjEsICNTUF9TUl0KKwl0c3QJcjAsICNTUF9URFJFCisJYmVxCVNQX2xvb3AxCisKKwltb3YJcjAsICNTUElfOENMT0NLUworCXN0cglyMCwgW3IxLCAjU1BfVERSXSAKK1NQX2xvb3AyOgkKKwlsZHIJcjAsIFtyMSwgI1NQX1NSXQorCXRzdAlyMCwgI1NQX1REUkUKKwliZXEJU1BfbG9vcDIKKworCWxkcglyMCwgW3IxLCAjU1BfUkRSXQorU1BfbG9vcDM6CQorCWxkcglyMCwgW3IxLCAjU1BfU1JdCisJdHN0CXIwLCAjU1BfUkRSRgorCWJlcQlTUF9sb29wMworCisJbGRyCXIwLCBbcjEsICNTUF9SRFJdCisJYW5kCXIwLCByMCwgIzI1NQorCWJ4CWxyCisuZW5kZnVuYworCQorLmZ1bmMgTlZSQU1fWGZlciwgTlZSQU1fWEZFUgorCS8qIHIwID0gZGVzdCBhZGRyZXNzICovCisJLyogcjEgPSBub3QgdXNlZCAqLworCS8qIHIyID0gc3JjIGFkZHJlc3Mgd2l0aGluIE5WUkFNICovCisJLyogcjMgPSBsZW5ndGggKi8KK05WUkFNX1hGRVI6CisJc3RtZGIJc3AhLCB7cjQsIHI1LCBscn0KKwltb3YJcjUsIHIwCQkvKiBzYXZlIHIwIChkZXN0IGFkZHJlc3MpICovCisJbW92CXI0LCByMwkJLyogc2F2ZSByMyAobGVuZ3RoKSAqLworCW1vdglyMCwgcjIsIExTUiAjNSAvKiAgU1BJIG1lbW9yaWVzIHB1dCBBOCBpbiB0aGUgY29tbWFuZCBmaWVsZCAqLworCWFuZAlyMCwgcjAsICM4CisJYWRkCXIwLCByMCwgI05WUkFNX0NNRF9SRUFEIAorCWxkcglyMSwgPU5WUkFNX1NDUkFUQ0gKKwlzdHJiCXIwLCBbcjEsICMwXQkvKiBzYXZlIGNvbW1hbmQgaW4gTlZSQU1fU0NSQVRDSFswXSAqLworCXN0cmIJcjIsIFtyMSwgIzFdICAgIC8qIHNhdmUgbG93IGJ5dGUgb2Ygc291cmNlIGFkZHJlc3MgaW4gTlZSQU1fU0NSQVRDSFsxXSAqLworX2xvY2FsMToJCisJYmwJTlZSQU1fSU5JVAorCXRzdAlyMCwgI05WUkFNX1NSX1JEWQorCWJuZQlfbG9jYWwxCisJbW92CXIwLCAjMjAKKwlibAlERUxBWTkKKwltb3YJcjIsIHI0CQkvKiBsZW5ndGggKi8KKwltb3YJcjEsIHI1CQkvKiBkZXN0IGFkZHJlc3MgKi8KKwltb3YJcjAsICMyCQkvKiBieXRlcyB0byB0cmFuc2ZlciBpbiBjb21tYW5kICovCisJYmwJTlZSQU1fWEZFUjIKKwlsZG1pYQlzcCEsIHtyNCwgcjUsIGxyfQorCWJ4CWxyCisuZW5kZnVuYworCisuZnVuYyBOVlJBTV9YZmVyMiwgTlZSQU1fWEZFUjIKK05WUkFNX1hGRVIyOgorCXN0bWRiCXNwISwge3I0LCByNSwgcjYsIGxyfQorCWxkcglyNCwgPVNQX0JBU0UKKwltb3YJcjMsICMwCisJY21wCXIwLCAjMAorCWJscwlfbG9jYWwyCisJbGRyCXI1LCA9TlZSQU1fU0NSQVRDSAorX2xvY2FsNDoJCisJbGRyYglyNiwgW3I1LCByM10KKwlzdHIJcjYsIFtyNCwgI1NQX1REUl0KK19sb2NhbDM6CisJbGRyCXI2LCBbcjQsICNTUF9TUl0KKwl0c3QJcjYsICNTUF9URFJFCisJYmVxCV9sb2NhbDMKKwlhZGQJcjMsIHIzLCAjMQorCWNtcAlyMywgcjAgLyogcjAgaXMgIyBvZiBieXRlcyB0byBzZW5kIG91dCAoY29tbWFuZCthZGRyKSAqLworCWJsbwlfbG9jYWw0CitfbG9jYWwyOgorCW1vdglyMywgI1NQSV84Q0xPQ0tTCisJc3RyCXIzLCBbcjQsICNTUF9URFJdCisJbGRyCXIwLCBbcjQsICNTUF9SRFJdCitfbG9jYWw1OgkKKwlsZHIJcjAsIFtyNCwgI1NQX1NSXQorCXRzdAlyMCwgI1NQX1JEUkYKKwliZXEJX2xvY2FsNQorCWxkcglyMCwgW3I0LCAjU1BfUkRSXSAvKiB3aGF0J3MgdGhpcyBieXRlPyAgSXQncyB0aGUgYnl0ZSByZWFkIHdoaWxlIHdyaXRpbmcgdGhlIFREUiAtLSBub25zZW5zZSwgYmVjYXVzZSB0aGUgTlZSQU0gZG9lc24ndCByZWFkIGFuZCB3cml0ZSBhdCB0aGUgc2FtZSB0aW1lICovCisJbW92CXIwLCAjMAorCWNtcAlyMiwgIzAgIC8qIHIyIGlzICMgb2YgYnl0ZXMgdG8gY29weSBpbiAqLworCWJscwlfbG9jYWw2CitfbG9jYWw3OgkKKwlsZHIJcjUsIFtyNCwgI1NQX1NSXQorCXRzdAlyNSwgI1NQX1REUkUKKwliZXEJX2xvY2FsNworCXN0cglyMywgW3I0LCAjU1BfVERSXSAgLyogcjMgaGFzIFNQSV84Q0xPQ0tTICovCitfbG9jYWw4OgkKKwlsZHIJcjUsIFtyNCwgI1NQX1NSXQorCXRzdAlyNSwgI1NQX1JEUkYKKwliZXEJX2xvY2FsOAorCWxkcglyNSwgW3I0LCAjU1BfUkRSXSAvKiBidXQgZGlkbid0IHdlIHJlYWQgdGhpcyBieXRlIGFib3ZlPyAqLworCXN0cmIJcjUsIFtyMV0sICMxIC8qIHBvc3RpbmRleGVkICovCisJYWRkCXIwLCByMCwgIzEKKwljbXAJcjAsIHIyCisJYmxvCV9sb2NhbDcgLyogc2luY2Ugd2UgZG9uJ3Qgc2VuZCBhbm90aGVyIGFkZHJlc3MsIHRoZSBOVlJBTSBtdXN0IGJlIGNhcGFibGUgb2Ygc2VxdWVudGlhbCByZWFkcyAqLworX2xvY2FsNjoKKwltb3YJcjAsICMyMDAKKwlibAlERUxBWTkKKwlsZG1pYQlzcCEsIHtyNCwgcjUsIHI2LCBscn0KKwlieAlscgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjUwMDBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuaApAQCAtMCwwICsxLDQzIEBACisvKioqIC0qLSBsaW51eC1jIC0qLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgRHJpdmVyIGZvciBBdG1lbCBhdDc2YzUwMiBhdDc2YzUwNCBhbmQgYXQ3NmM1MDYgd2lyZWxlc3MgY2FyZHMuCisKKyAgICAgICAgIENvcHlyaWdodCAyMDA1IERhbiBXaWxsaWFtcyBhbmQgUmVkIEhhdCwgSW5jLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIEF0bWVsIHdpcmVsZXNzIGxhbiBkcml2ZXJzOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0FUTUVMX0gKKyNkZWZpbmUgX0FUTUVMX0gKKwordHlwZWRlZiBlbnVtIHsKKwlBVE1FTF9GV19UWVBFX05PTkUgPSAwLAorCUFUTUVMX0ZXX1RZUEVfNTAyLAorCUFUTUVMX0ZXX1RZUEVfNTAyRCwKKwlBVE1FTF9GV19UWVBFXzUwMkUsCisJQVRNRUxfRldfVFlQRV81MDJfM0NPTSwKKwlBVE1FTF9GV19UWVBFXzUwNCwKKwlBVE1FTF9GV19UWVBFXzUwNF8yOTU4LAorCUFUTUVMX0ZXX1RZUEVfNTA0QV8yOTU4LAorCUFUTUVMX0ZXX1RZUEVfNTA2Cit9IEF0bWVsRldUeXBlOworCitzdHJ1Y3QgbmV0X2RldmljZSAqaW5pdF9hdG1lbF9jYXJkKHVuc2lnbmVkIHNob3J0LCBpbnQsIGNvbnN0IEF0bWVsRldUeXBlLCBzdHJ1Y3QgZGV2aWNlICosIAorCQkJCSAgICBpbnQgKCpwcmVzZW50X2Z1bmMpKHZvaWQgKiksIHZvaWQgKiApOwordm9pZCBzdG9wX2F0bWVsX2NhcmQoIHN0cnVjdCBuZXRfZGV2aWNlICosIGludCApOworaW50IGF0bWVsX29wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICogKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbF9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTFiNTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfY3MuYwpAQCAtMCwwICsxLDcwOCBAQAorLyoqKiAtKi0gbGludXgtYyAtKi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgIERyaXZlciBmb3IgQXRtZWwgYXQ3NmM1MDIgYXQ3NmM1MDQgYW5kIGF0NzZjNTA2IHdpcmVsZXNzIGNhcmRzLgorCisgICAgICAgIENvcHlyaWdodCAyMDAwLTIwMDEgQVRNRUwgQ29ycG9yYXRpb24uCisgICAgICAgIENvcHlyaWdodCAyMDAzIFNpbW9uIEtlbGxleS4KKworICAgIFRoaXMgY29kZSB3YXMgZGV2ZWxvcGVkIGZyb20gdmVyc2lvbiAyLjEuMSBvZiB0aGUgQXRtZWwgZHJpdmVycywgCisgICAgcmVsZWFzZWQgYnkgQXRtZWwgY29ycC4gdW5kZXIgdGhlIEdQTCBpbiBEZWNlbWJlciAyMDAyLiBJdCBhbHNvIAorICAgIGluY2x1ZGVzIGNvZGUgZnJvbSB0aGUgTGludXggYWlyb25ldCBkcml2ZXJzIChDKSBCZW5qYW1pbiBSZWVkLCAKKyAgICBhbmQgdGhlIExpbnV4IFBDTUNJQSBwYWNrYWdlLCAoQykgRGF2aWQgSGluZHMuIAorCisgICAgRm9yIGFsbCBxdWVyaWVzIGFib3V0IHRoaXMgY29kZSwgcGxlYXNlIGNvbnRhY3QgdGhlIGN1cnJlbnQgYXV0aG9yLCAKKyAgICBTaW1vbiBLZWxsZXkgPHNpbW9uQHRoZWtlbGxleXMub3JnLnVrPiBhbmQgbm90IEF0bWVsIENvcnBvcmF0aW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIEF0bWVsIHdpcmVsZXNzIGxhbiBkcml2ZXJzOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpZmRlZiBfX0lOX1BDTUNJQV9QQUNLQUdFX18KKyNpbmNsdWRlIDxwY21jaWEva19jb21wYXQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzY29kZS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisKKyNpbmNsdWRlICJhdG1lbC5oIgorCisvKgorICAgQWxsIHRoZSBQQ01DSUEgbW9kdWxlcyB1c2UgUENNQ0lBX0RFQlVHIHRvIGNvbnRyb2wgZGVidWdnaW5nLiAgSWYKKyAgIHlvdSBkbyBub3QgZGVmaW5lIFBDTUNJQV9ERUJVRyBhdCBhbGwsIGFsbCB0aGUgZGVidWcgY29kZSB3aWxsIGJlCisgICBsZWZ0IG91dC4gIElmIHlvdSBjb21waWxlIHdpdGggUENNQ0lBX0RFQlVHPTAsIHRoZSBkZWJ1ZyBjb2RlIHdpbGwKKyAgIGJlIHByZXNlbnQgYnV0IGRpc2FibGVkIC0tIGJ1dCBpdCBjYW4gdGhlbiBiZSBlbmFibGVkIGZvciBzcGVjaWZpYworICAgbW9kdWxlcyBhdCBsb2FkIHRpbWUgd2l0aCBhICdwY19kZWJ1Zz0jJyBvcHRpb24gdG8gaW5zbW9kLgorKi8KKyNpZmRlZiBQQ01DSUFfREVCVUcKK3N0YXRpYyBpbnQgcGNfZGVidWcgPSBQQ01DSUFfREVCVUc7Cittb2R1bGVfcGFyYW0ocGNfZGVidWcsIGludCwgMCk7CitzdGF0aWMgY2hhciAqdmVyc2lvbiA9ICIkUmV2aXNpb246IDEuMiAkIjsKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgaWYgKHBjX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncyk7CisjZWxzZQorI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKQorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitNT0RVTEVfQVVUSE9SKCJTaW1vbiBLZWxsZXkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VwcG9ydCBmb3IgQXRtZWwgYXQ3NmM1MHggODAyLjExIHdpcmVsZXNzIGV0aGVybmV0IGNhcmRzLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIkF0bWVsIGF0NzZjNTB4IFBDTUNJQSBjYXJkcyIpOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAgIFRoZSBldmVudCgpIGZ1bmN0aW9uIGlzIHRoaXMgZHJpdmVyJ3MgQ2FyZCBTZXJ2aWNlcyBldmVudCBoYW5kbGVyLgorICAgSXQgd2lsbCBiZSBjYWxsZWQgYnkgQ2FyZCBTZXJ2aWNlcyB3aGVuIGFuIGFwcHJvcHJpYXRlIGNhcmQgc3RhdHVzCisgICBldmVudCBpcyByZWNlaXZlZC4gIFRoZSBjb25maWcoKSBhbmQgcmVsZWFzZSgpIGVudHJ5IHBvaW50cyBhcmUKKyAgIHVzZWQgdG8gY29uZmlndXJlIG9yIHJlbGVhc2UgYSBzb2NrZXQsIGluIHJlc3BvbnNlIHRvIGNhcmQKKyAgIGluc2VydGlvbiBhbmQgZWplY3Rpb24gZXZlbnRzLiAgVGhleSBhcmUgaW52b2tlZCBmcm9tIHRoZSBhdG1lbF9jcworICAgZXZlbnQgaGFuZGxlci4gCisqLworCitzdGF0aWMgdm9pZCBhdG1lbF9jb25maWcoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgdm9pZCBhdG1lbF9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspOworc3RhdGljIGludCBhdG1lbF9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCSAgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpOworCisvKgorICAgVGhlIGF0dGFjaCgpIGFuZCBkZXRhY2goKSBlbnRyeSBwb2ludHMgYXJlIHVzZWQgdG8gY3JlYXRlIGFuZCBkZXN0cm95CisgICAiaW5zdGFuY2VzIiBvZiB0aGUgZHJpdmVyLCB3aGVyZSBlYWNoIGluc3RhbmNlIHJlcHJlc2VudHMgZXZlcnl0aGluZworICAgbmVlZGVkIHRvIG1hbmFnZSBvbmUgYWN0dWFsIFBDTUNJQSBjYXJkLgorKi8KKworc3RhdGljIGRldl9saW5rX3QgKmF0bWVsX2F0dGFjaCh2b2lkKTsKK3N0YXRpYyB2b2lkIGF0bWVsX2RldGFjaChkZXZfbGlua190ICopOworCisvKgorICAgWW91J2xsIGFsc28gbmVlZCB0byBwcm90b3R5cGUgYWxsIHRoZSBmdW5jdGlvbnMgdGhhdCB3aWxsIGFjdHVhbGx5CisgICBiZSB1c2VkIHRvIHRhbGsgdG8geW91ciBkZXZpY2UuICBTZWUgJ3BjbWVtX2NzJyBmb3IgYSBnb29kIGV4YW1wbGUKKyAgIG9mIGEgZnVsbHkgc2VsZi1zdWZmaWNpZW50IGRyaXZlcjsgdGhlIG90aGVyIGRyaXZlcnMgcmVseSBtb3JlIG9yCisgICBsZXNzIG9uIG90aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwuCisqLworCisvKgorICAgVGhlIGRldl9pbmZvIHZhcmlhYmxlIGlzIHRoZSAia2V5IiB0aGF0IGlzIHVzZWQgdG8gbWF0Y2ggdXAgdGhpcworICAgZGV2aWNlIGRyaXZlciB3aXRoIGFwcHJvcHJpYXRlIGNhcmRzLCB0aHJvdWdoIHRoZSBjYXJkIGNvbmZpZ3VyYXRpb24KKyAgIGRhdGFiYXNlLgorKi8KKworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAiYXRtZWxfY3MiOworCisvKgorICAgQSBsaW5rZWQgbGlzdCBvZiAiaW5zdGFuY2VzIiBvZiB0aGUgIGF0bWVsbmV0IGRldmljZS4gIEVhY2ggYWN0dWFsCisgICBQQ01DSUEgY2FyZCBjb3JyZXNwb25kcyB0byBvbmUgZGV2aWNlIGluc3RhbmNlLCBhbmQgaXMgZGVzY3JpYmVkCisgICBieSBvbmUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgKGRlZmluZWQgaW4gZHMuaCkuCisKKyAgIFlvdSBtYXkgbm90IHdhbnQgdG8gdXNlIGEgbGlua2VkIGxpc3QgZm9yIHRoaXMgLS0gZm9yIGV4YW1wbGUsIHRoZQorICAgbWVtb3J5IGNhcmQgZHJpdmVyIHVzZXMgYW4gYXJyYXkgb2YgZGV2X2xpbmtfdCBwb2ludGVycywgd2hlcmUgbWlub3IKKyAgIGRldmljZSBudW1iZXJzIGFyZSB1c2VkIHRvIGRlcml2ZSB0aGUgY29ycmVzcG9uZGluZyBhcnJheSBpbmRleC4KKyovCisKK3N0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdCA9IE5VTEw7CisKKy8qCisgICBBIGRldl9saW5rX3Qgc3RydWN0dXJlIGhhcyBmaWVsZHMgZm9yIG1vc3QgdGhpbmdzIHRoYXQgYXJlIG5lZWRlZAorICAgdG8ga2VlcCB0cmFjayBvZiBhIHNvY2tldCwgYnV0IHRoZXJlIHdpbGwgdXN1YWxseSBiZSBzb21lIGRldmljZQorICAgc3BlY2lmaWMgaW5mb3JtYXRpb24gdGhhdCBhbHNvIG5lZWRzIHRvIGJlIGtlcHQgdHJhY2sgb2YuICBUaGUKKyAgICdwcml2JyBwb2ludGVyIGluIGEgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgdG8gcG9pbnQgdG8KKyAgIGEgZGV2aWNlLXNwZWNpZmljIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUsIGxpa2UgdGhpcy4KKworICAgQSBkcml2ZXIgbmVlZHMgdG8gcHJvdmlkZSBhIGRldl9ub2RlX3Qgc3RydWN0dXJlIGZvciBlYWNoIGRldmljZQorICAgb24gYSBjYXJkLiAgSW4gc29tZSBjYXNlcywgdGhlcmUgaXMgb25seSBvbmUgZGV2aWNlIHBlciBjYXJkIChmb3IKKyAgIGV4YW1wbGUsIGV0aGVybmV0IGNhcmRzLCBtb2RlbXMpLiAgSW4gb3RoZXIgY2FzZXMsIHRoZXJlIG1heSBiZQorICAgbWFueSBhY3R1YWwgb3IgbG9naWNhbCBkZXZpY2VzIChTQ1NJIGFkYXB0ZXJzLCBtZW1vcnkgY2FyZHMgd2l0aAorICAgbXVsdGlwbGUgcGFydGl0aW9ucykuICBUaGUgZGV2X25vZGVfdCBzdHJ1Y3R1cmVzIG5lZWQgdG8gYmUga2VwdAorICAgaW4gYSBsaW5rZWQgbGlzdCBzdGFydGluZyBhdCB0aGUgJ2RldicgZmllbGQgb2YgYSBkZXZfbGlua190CisgICBzdHJ1Y3R1cmUuICBXZSBhbGxvY2F0ZSB0aGVtIGluIHRoZSBjYXJkJ3MgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSwKKyAgIGJlY2F1c2UgdGhleSBnZW5lcmFsbHkgc2hvdWxkbid0IGJlIGFsbG9jYXRlZCBkeW5hbWljYWxseS4KKworICAgSW4gdGhpcyBjYXNlLCB3ZSBhbHNvIHByb3ZpZGUgYSBmbGFnIHRvIGluZGljYXRlIGlmIGEgZGV2aWNlIGlzCisgICAic3RvcHBlZCIgZHVlIHRvIGEgcG93ZXIgbWFuYWdlbWVudCBldmVudCwgb3IgY2FyZCBlamVjdGlvbi4gIFRoZQorICAgZGV2aWNlIElPIHJvdXRpbmVzIGNhbiB1c2UgYSBmbGFnIGxpa2UgdGhpcyB0byB0aHJvdHRsZSBJTyB0byBhCisgICBjYXJkIHRoYXQgaXMgbm90IHJlYWR5IHRvIGFjY2VwdCBpdC4KKyovCisgICAKK3R5cGVkZWYgc3RydWN0IGxvY2FsX2luZm9fdCB7CisJZGV2X25vZGVfdAlub2RlOworCXN0cnVjdCBuZXRfZGV2aWNlICpldGhfZGV2OworfSBsb2NhbF9pbmZvX3Q7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgYXRtZWxfYXR0YWNoKCkgY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcKKyAgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBvbmUgZGV2aWNlLiAgVGhlIGRldmljZSBpcyByZWdpc3RlcmVkCisgIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKyAgCisgIFRoZSBkZXZfbGluayBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQsIGJ1dCB3ZSBkb24ndCBhY3R1YWxseQorICBjb25maWd1cmUgdGhlIGNhcmQgYXQgdGhpcyBwb2ludCAtLSB3ZSB3YWl0IHVudGlsIHdlIHJlY2VpdmUgYQorICBjYXJkIGluc2VydGlvbiBldmVudC4KKyAgCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgZGV2X2xpbmtfdCAqYXRtZWxfYXR0YWNoKHZvaWQpCit7CisJY2xpZW50X3JlZ190IGNsaWVudF9yZWc7CisJZGV2X2xpbmtfdCAqbGluazsKKwlsb2NhbF9pbmZvX3QgKmxvY2FsOworCWludCByZXQ7CisJCisJREVCVUcoMCwgImF0bWVsX2F0dGFjaCgpXG4iKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGRldl9saW5rX3Qgc3RydWN0dXJlICovCisJbGluayA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZfbGlua190KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsaW5rKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXRtZWxfY3M6IG5vIG1lbW9yeSBmb3IgbmV3IGRldmljZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQobGluaywgMCwgc2l6ZW9mKHN0cnVjdCBkZXZfbGlua190KSk7CisJCisJLyogSW50ZXJydXB0IHNldHVwICovCisJbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkU7CisJbGluay0+aXJxLklSUUluZm8xID0gSVJRX0xFVkVMX0lEOworCWxpbmstPmlycS5IYW5kbGVyID0gTlVMTDsKKwkKKwkvKgorCSAgR2VuZXJhbCBzb2NrZXQgY29uZmlndXJhdGlvbiBkZWZhdWx0cyBjYW4gZ28gaGVyZS4gIEluIHRoaXMKKwkgIGNsaWVudCwgd2UgYXNzdW1lIHZlcnkgbGl0dGxlLCBhbmQgcmVseSBvbiB0aGUgQ0lTIGZvciBhbG1vc3QKKwkgIGV2ZXJ5dGhpbmcuICBJbiBtb3N0IGNsaWVudHMsIG1hbnkgZGV0YWlscyAoaS5lLiwgbnVtYmVyLCBzaXplcywKKwkgIGFuZCBhdHRyaWJ1dGVzIG9mIElPIHdpbmRvd3MpIGFyZSBmaXhlZCBieSB0aGUgbmF0dXJlIG9mIHRoZQorCSAgZGV2aWNlLCBhbmQgY2FuIGJlIGhhcmQtd2lyZWQgaGVyZS4KKwkqLworCWxpbmstPmNvbmYuQXR0cmlidXRlcyA9IDA7CisJbGluay0+Y29uZi5WY2MgPSA1MDsKKwlsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKwkKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgcHJpdmF0ZSBkZXZpY2Utc3BlY2lmaWMgZGF0YSAqLworCWxvY2FsID0ga21hbGxvYyhzaXplb2YobG9jYWxfaW5mb190KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsb2NhbCkgeworCQlwcmludGsoS0VSTl9FUlIgImF0bWVsX2NzOiBubyBtZW1vcnkgZm9yIG5ldyBkZXZpY2VcbiIpOworCQlrZnJlZSAobGluayk7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQobG9jYWwsIDAsIHNpemVvZihsb2NhbF9pbmZvX3QpKTsKKwlsaW5rLT5wcml2ID0gbG9jYWw7CisJCisJLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisJbGluay0+bmV4dCA9IGRldl9saXN0OworCWRldl9saXN0ID0gbGluazsKKwljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworCWNsaWVudF9yZWcuRXZlbnRNYXNrID0KKwkJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorCQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAorCQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZhdG1lbF9ldmVudDsKKwljbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CisJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKwlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwkJYXRtZWxfZGV0YWNoKGxpbmspOworCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJcmV0dXJuIGxpbms7Cit9IC8qIGF0bWVsX2F0dGFjaCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgCisgIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkCisgIHdpdGggQ2FyZCBTZXJ2aWNlcy4gIElmIGl0IGhhcyBiZWVuIHJlbGVhc2VkLCBhbGwgbG9jYWwgZGF0YQorICBzdHJ1Y3R1cmVzIGFyZSBmcmVlZC4gIE90aGVyd2lzZSwgdGhlIHN0cnVjdHVyZXMgd2lsbCBiZSBmcmVlZAorICB3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQgYXRtZWxfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisJZGV2X2xpbmtfdCAqKmxpbmtwOworCQorCURFQlVHKDAsICJhdG1lbF9kZXRhY2goMHglcClcbiIsIGxpbmspOworCQorCS8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisJZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkKKwkJaWYgKCpsaW5rcCA9PSBsaW5rKSBicmVhazsKKwlpZiAoKmxpbmtwID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJCWF0bWVsX3JlbGVhc2UobGluayk7CisJCQorCS8qIEJyZWFrIHRoZSBsaW5rIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworCWlmIChsaW5rLT5oYW5kbGUpCisJCXBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworCisJLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGZyZWUgcGllY2VzICovCisJKmxpbmtwID0gbGluay0+bmV4dDsKKwlpZiAobGluay0+cHJpdikKKwkJa2ZyZWUobGluay0+cHJpdik7CisJa2ZyZWUobGluayk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAKKyAgYXRtZWxfY29uZmlnKCkgaXMgc2NoZWR1bGVkIHRvIHJ1biBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50CisgIGlzIHJlY2VpdmVkLCB0byBjb25maWd1cmUgdGhlIFBDTUNJQSBzb2NrZXQsIGFuZCB0byBtYWtlIHRoZQorICBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCitkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQorCisvKiBDYWxsLWJhY2sgZnVuY3Rpb24gdG8gaW50ZXJyb2dhdGUgUENNQ0lBLXNwZWNpZmljIGluZm9ybWF0aW9uCisgICBhYm91dCB0aGUgY3VycmVudCBleGlzdGFuY2Ugb2YgdGhlIGNhcmQgKi8KK3N0YXRpYyBpbnQgY2FyZF9wcmVzZW50KHZvaWQgKmFyZykKK3sgCisJZGV2X2xpbmtfdCAqbGluayA9IChkZXZfbGlua190ICopYXJnOworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9TVVNQRU5EKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKQorCQlyZXR1cm4gMTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyogbGlzdCBvZiBjYXJkcyB3ZSBrbm93IGFib3V0IGFuZCB0aGVpciBmaXJtd2FyZSByZXF1aXJlbWVudHMuCisgICBHbyBlaXRoZXIgYnkgTWFuZmlkIG9yIHZlcnNpb24gc3RyaW5ncy4KKyAgIENhcmRzIG5vdCBpbiB0aGlzIGxpc3Qgd2lsbCBuZWVkIGEgZmlybXdhcmUgcGFyYW1ldGVyIHRvIHRoZSBtb2R1bGUKKyAgIGluIGFsbCBwcm9iYWJpbGl0eS4gTm90ZSB0aGF0IHRoZSBTTUMgMjYzMiBWMiBhbmQgVjMgaGF2ZSB0aGUgc2FtZQorICAgbWFuZmlkcywgc28gd2UgaWdub3JlIHRob3NlIGFuZCB1c2UgdGhlIHZlcnNpb24xIHN0cmluZ3MuICovCisKK3N0YXRpYyBzdHJ1Y3QgeyAKKwlpbnQgbWFuZiwgY2FyZDsKKwljaGFyICp2ZXIxOworCUF0bWVsRldUeXBlIGZpcm13YXJlOworCWNoYXIgKm5hbWU7Cit9IGNhcmRfdGFibGVbXSA9IHsKKwl7IDAsIDAsICJXTEFOLzgwMi4xMWIgUEMgQ0FSRCIsIEFUTUVMX0ZXX1RZUEVfNTAyRCwgIkFjdGlvbnRlYyA4MDJDQVQxIiB9LCAgCisJeyAwLCAwLCAiQVRNRUwvQVQ3NkM1MDJBUiIsIEFUTUVMX0ZXX1RZUEVfNTAyLCAiTm9OYW1lLVJGTUQiIH0sIAorCXsgMCwgMCwgIkFUTUVML0FUNzZDNTAyQVJfRCIsIEFUTUVMX0ZXX1RZUEVfNTAyRCwgIk5vTmFtZS1yZXZEIiB9LCAKKwl7IDAsIDAsICJBVE1FTC9BVDc2QzUwMkFSX0UiLCBBVE1FTF9GV19UWVBFXzUwMkUsICJOb05hbWUtcmV2RSIgfSwKKwl7IDAsIDAsICJBVE1FTC9BVDc2QzUwNCIsIEFUTUVMX0ZXX1RZUEVfNTA0LCAiTm9OYW1lLTUwNCIgfSwKKwl7IDAsIDAsICJBVE1FTC9BVDc2QzUwNEEiLCBBVE1FTF9GV19UWVBFXzUwNEFfMjk1OCwgIk5vTmFtZS01MDRhLTI5NTgiIH0sCisJeyAwLCAwLCAiQVRNRUwvQVQ3NkM1MDRfUiIsIEFUTUVMX0ZXX1RZUEVfNTA0XzI5NTgsICJOb05hbWUtNTA0LTI5NTgiIH0sCisJeyBNQU5GSURfM0NPTSwgMHgwNjIwLCBOVUxMLCBBVE1FTF9GV19UWVBFXzUwMl8zQ09NLCAiM2NvbSAzQ1JXRTYyMDkyQiIgfSwgCisJeyBNQU5GSURfM0NPTSwgMHgwNjk2LCBOVUxMLCBBVE1FTF9GV19UWVBFXzUwMl8zQ09NLCAiM2NvbSAzQ1JTSFBXMTk2IiB9LCAKKwl7IDAsIDAsICJTTUMvMjYzMlctVjIiLCBBVE1FTF9GV19UWVBFXzUwMiwgIlNNQyAyNjMyVy1WMiIgfSwKKwl7IDAsIDAsICJTTUMvMjYzMlciLCBBVE1FTF9GV19UWVBFXzUwMkQsICJTTUMgMjYzMlctVjMiIH0sCisJeyAweGQ2MDEsIDB4MDAwNywgTlVMTCwgQVRNRUxfRldfVFlQRV81MDIsICJTaXRlY29tIFdMQU4tMDExIiB9LCAKKwl7IDB4MDFiZiwgMHgzMzAyLCBOVUxMLCBBVE1FTF9GV19UWVBFXzUwMkUsICJCZWxraW4gRjVENjAyMC1WMiIgfSwgCisJeyAwLCAwLCAiQlQvVm95YWdlciAxMDIwIExhcHRvcCBBZGFwdGVyIiwgQVRNRUxfRldfVFlQRV81MDIsICJCVCBWb3lhZ2VyIDEwMjAiIH0sCisJeyAwLCAwLCAiSUVFRSA4MDIuMTFiL1dpcmVsZXNzIExBTiBQQyBDYXJkIiwgQVRNRUxfRldfVFlQRV81MDIsICJTaWVtZW5zIEdpZ2FzZXQgUEMgQ2FyZCBJSSIgfSwKKwl7IDAsIDAsICJDTmV0L0NOV0xDIDExTWJwcyBXaXJlbGVzcyBQQyBDYXJkIFYtNSIsIEFUTUVMX0ZXX1RZUEVfNTAyRSwgIkNOZXQgQ05XTEMtODExQVJMIiB9LAorCXsgMCwgMCwgIldpcmVsZXNzL1BDX0NBUkQiLCBBVE1FTF9GV19UWVBFXzUwMkQsICJQbGFuZXQgV0wtMzU1MiIgfSwKKwl7IDAsIDAsICJPRU0vMTFNYnBzIFdpcmVsZXNzIExBTiBQQyBDYXJkIFYtMyIsIEFUTUVMX0ZXX1RZUEVfNTAyLCAiT0VNIDExTWJwcyBXTEFOIFBDTUNJQSBDYXJkIiB9LAorCXsgMCwgMCwgIjExV0FWRS8xMVdQNjExQUwtRSIsIEFUTUVMX0ZXX1RZUEVfNTAyRSwgIjExV0FWRSBXYXZlQnVkZHkiIH0sCisJeyAwLCAwLCAiTEcvTFcyMTAwTiIsIEFUTUVMX0ZXX1RZUEVfNTAyRSwgIkxHIExXMjEwME4gMTFNYnBzIFdMQU4gUENNQ0lBIENhcmQiIH0sCit9OworCitzdGF0aWMgdm9pZCBhdG1lbF9jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKwljbGllbnRfaGFuZGxlX3QgaGFuZGxlOworCXR1cGxlX3QgdHVwbGU7CisJY2lzcGFyc2VfdCBwYXJzZTsKKwlsb2NhbF9pbmZvX3QgKmRldjsKKwlpbnQgbGFzdF9mbiwgbGFzdF9yZXQ7CisJdV9jaGFyIGJ1Zls2NF07CisJaW50IGNhcmRfaW5kZXggPSAtMSwgZG9uZSA9IDA7CisJCisJaGFuZGxlID0gbGluay0+aGFuZGxlOworCWRldiA9IGxpbmstPnByaXY7CisKKwlERUJVRygwLCAiYXRtZWxfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKKwkKKwl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKwl0dXBsZS5UdXBsZURhdGEgPSBidWY7CisJdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworCQorCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9NQU5GSUQ7CisJaWYgKHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpID09IDApIHsKKwkJaW50IGk7CisJCWNpc3RwbF9tYW5maWRfdCAqbWFuZmlkOworCQlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworCQlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworCQltYW5maWQgPSAmKHBhcnNlLm1hbmZpZCk7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoY2FyZF90YWJsZSkvc2l6ZW9mKGNhcmRfdGFibGVbMF0pOyBpKyspIHsKKwkJCWlmICghY2FyZF90YWJsZVtpXS52ZXIxICYmCisJCQkgICAgbWFuZmlkLT5tYW5mID09IGNhcmRfdGFibGVbaV0ubWFuZiAmJgorCQkJICAgIG1hbmZpZC0+Y2FyZCA9PSBjYXJkX3RhYmxlW2ldLmNhcmQpIHsKKwkJCQljYXJkX2luZGV4ID0gaTsKKwkJCQlkb25lID0gMTsKKwkJCX0KKwkJfQorCX0KKworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9WRVJTXzE7CisJaWYgKCFkb25lICYmIChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSA9PSAwKSkgeworCQlpbnQgaSwgaiwgazsKKwkJY2lzdHBsX3ZlcnNfMV90ICp2ZXIxOworCQlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworCQlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworCQl2ZXIxID0gJihwYXJzZS52ZXJzaW9uXzEpOworCQkKKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZihjYXJkX3RhYmxlKS9zaXplb2YoY2FyZF90YWJsZVswXSk7IGkrKykgeworCQkJZm9yIChqID0gMDsgaiA8IHZlcjEtPm5zOyBqKyspIHsKKwkJCQljaGFyICpwID0gY2FyZF90YWJsZVtpXS52ZXIxOworCQkJCWNoYXIgKnEgPSAmdmVyMS0+c3RyW3ZlcjEtPm9mc1tqXV07CisJCQkJaWYgKCFwKQorCQkJCQlnb3RvIG1pc21hdGNoOworCQkJCWZvciAoayA9IDA7IGsgPCBqOyBrKyspIHsKKwkJCQkJd2hpbGUgKCgqcCAhPSAnXDAnKSAmJiAoKnAgIT0gJy8nKSkgcCsrOworCQkJCQlpZiAoKnAgPT0gJ1wwJykgeworCQkJCQkJaWYgKCpxICE9ICdcMCcpCisJCQkJCQkJZ290byBtaXNtYXRjaDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXArKzsKKwkJCQkJfQorCQkJCX0KKwkJCQl3aGlsZSgoKnEgIT0gJ1wwJykgJiYgKCpwICE9ICdcMCcpICYmIAorCQkJCSAgICAgICgqcCAhPSAnLycpICYmICgqcCA9PSAqcSkpIHArKywgcSsrOworCQkJCWlmICgoKCpwICE9ICdcMCcpICYmICpwICE9ICcvJykgfHwgKnEgIT0gJ1wwJykKKwkJCQkJZ290byBtaXNtYXRjaDsKKwkJCX0KKwkJCWNhcmRfaW5kZXggPSBpOworCQkJYnJlYWs7CS8qIGRvbmUgKi8KKwkJCQorCQltaXNtYXRjaDoKKwkJCWogPSAwOyAvKiBkdW1teSBzdG10IHRvIHNodXQgdXAgY29tcGlsZXIgKi8KKwkJfQorCX0JCQorCisJLyoKKwkgIFRoaXMgcmVhZHMgdGhlIGNhcmQncyBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMgY29uZmlndXJhdGlvbgorCSAgcmVnaXN0ZXJzLgorCSovCisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKwlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKwlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworCWxpbmstPmNvbmYuQ29uZmlnQmFzZSA9IHBhcnNlLmNvbmZpZy5iYXNlOworCWxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKwkKKwkvKiBDb25maWd1cmUgY2FyZCAqLworCWxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisJCisJLyoKKwkgIEluIHRoaXMgbG9vcCwgd2Ugc2NhbiB0aGUgQ0lTIGZvciBjb25maWd1cmF0aW9uIHRhYmxlIGVudHJpZXMsCisJICBlYWNoIG9mIHdoaWNoIGRlc2NyaWJlcyBhIHZhbGlkIGNhcmQgY29uZmlndXJhdGlvbiwgaW5jbHVkaW5nCisJICB2b2x0YWdlLCBJTyB3aW5kb3csIG1lbW9yeSB3aW5kb3csIGFuZCBpbnRlcnJ1cHQgc2V0dGluZ3MuCisJICAKKwkgIFdlIG1ha2Ugbm8gYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGNhcmQgdG8gYmUgY29uZmlndXJlZDogd2UgdXNlCisJICBqdXN0IHRoZSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgaW4gdGhlIENJUy4gIEluIGFuIGlkZWFsIHdvcmxkLAorCSAgdGhpcyB3b3VsZCB3b3JrIGZvciBhbnkgUENNQ0lBIGNhcmQsIGJ1dCBpdCByZXF1aXJlcyBhIGNvbXBsZXRlCisJICBhbmQgYWNjdXJhdGUgQ0lTLiAgSW4gcHJhY3RpY2UsIGEgZHJpdmVyIHVzdWFsbHkgImtub3dzIiBtb3N0IG9mCisJICB0aGVzZSB0aGluZ3Mgd2l0aG91dCBjb25zdWx0aW5nIHRoZSBDSVMsIGFuZCBtb3N0IGNsaWVudCBkcml2ZXJzCisJICB3aWxsIG9ubHkgdXNlIHRoZSBDSVMgdG8gZmlsbCBpbiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIGRldGFpbHMuCisJKi8KKwl0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKKwlDU19DSEVDSyhHZXRGaXJzdFR1cGxlLCBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJd2hpbGUgKDEpIHsKKwkJY2lzdHBsX2NmdGFibGVfZW50cnlfdCBkZmx0ID0geyAwIH07CisJCWNpc3RwbF9jZnRhYmxlX2VudHJ5X3QgKmNmZyA9ICYocGFyc2UuY2Z0YWJsZV9lbnRyeSk7CisJCWlmIChwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpICE9IDAgfHwKKwkJCQlwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkgIT0gMCkKKwkJCWdvdG8gbmV4dF9lbnRyeTsKKwkJCisJCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfREVGQVVMVCkgZGZsdCA9ICpjZmc7CisJCWlmIChjZmctPmluZGV4ID09IDApIGdvdG8gbmV4dF9lbnRyeTsKKwkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmZy0+aW5kZXg7CisJCQorCQkvKiBEb2VzIHRoaXMgY2FyZCBuZWVkIGF1ZGlvIG91dHB1dD8gKi8KKwkJaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9BVURJTykgeworCQkJbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX1NQS1I7CisJCQlsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOworCQl9CisJCQorCQkvKiBVc2UgcG93ZXIgc2V0dGluZ3MgZm9yIFZjYyBhbmQgVnBwIGlmIHByZXNlbnQgKi8KKwkJLyogIE5vdGUgdGhhdCB0aGUgQ0lTIHZhbHVlcyBuZWVkIHRvIGJlIHJlc2NhbGVkICovCisJCWlmIChjZmctPnZjYy5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJCWxpbmstPmNvbmYuVmNjID0gY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwOworCQllbHNlIGlmIChkZmx0LnZjYy5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJCWxpbmstPmNvbmYuVmNjID0gZGZsdC52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwOworCQkKKwkJaWYgKGNmZy0+dnBwMS5wcmVzZW50ICYgKDE8PENJU1RQTF9QT1dFUl9WTk9NKSkKKwkJCWxpbmstPmNvbmYuVnBwMSA9IGxpbmstPmNvbmYuVnBwMiA9CisJCQkJY2ZnLT52cHAxLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXS8xMDAwMDsKKwkJZWxzZSBpZiAoZGZsdC52cHAxLnByZXNlbnQgJiAoMTw8Q0lTVFBMX1BPV0VSX1ZOT00pKQorCQkJbGluay0+Y29uZi5WcHAxID0gbGluay0+Y29uZi5WcHAyID0KKwkJCQlkZmx0LnZwcDEucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dLzEwMDAwOworCQkKKwkJLyogRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQ/ICovCisJCWlmIChjZmctPmlycS5JUlFJbmZvMSB8fCBkZmx0LmlycS5JUlFJbmZvMSkKKwkJCWxpbmstPmNvbmYuQXR0cmlidXRlcyB8PSBDT05GX0VOQUJMRV9JUlE7CisJCQorCQkvKiBJTyB3aW5kb3cgc2V0dGluZ3MgKi8KKwkJbGluay0+aW8uTnVtUG9ydHMxID0gbGluay0+aW8uTnVtUG9ydHMyID0gMDsKKwkJaWYgKChjZmctPmlvLm53aW4gPiAwKSB8fCAoZGZsdC5pby5ud2luID4gMCkpIHsKKwkJCWNpc3RwbF9pb190ICppbyA9IChjZmctPmlvLm53aW4pID8gJmNmZy0+aW8gOiAmZGZsdC5pbzsKKwkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIX0FVVE87CisJCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fOEJJVCkpCisJCQkJbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisJCQlpZiAoIShpby0+ZmxhZ3MgJiBDSVNUUExfSU9fMTZCSVQpKQorCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJCQlsaW5rLT5pby5CYXNlUG9ydDEgPSBpby0+d2luWzBdLmJhc2U7CisJCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBpby0+d2luWzBdLmxlbjsKKwkJCWlmIChpby0+bndpbiA+IDEpIHsKKwkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMiA9IGxpbmstPmlvLkF0dHJpYnV0ZXMxOworCQkJCWxpbmstPmlvLkJhc2VQb3J0MiA9IGlvLT53aW5bMV0uYmFzZTsKKwkJCQlsaW5rLT5pby5OdW1Qb3J0czIgPSBpby0+d2luWzFdLmxlbjsKKwkJCX0KKwkJfQorCQkKKwkJLyogVGhpcyByZXNlcnZlcyBJTyBzcGFjZSBidXQgZG9lc24ndCBhY3R1YWxseSBlbmFibGUgaXQgKi8KKwkJaWYgKHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKSAhPSAwKQorCQkJZ290byBuZXh0X2VudHJ5OworCisJCS8qIElmIHdlIGdvdCB0aGlzIGZhciwgd2UncmUgY29vbCEgKi8KKwkJYnJlYWs7CisJCQorCW5leHRfZW50cnk6CisJCUNTX0NIRUNLKEdldE5leHRUdXBsZSwgcGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSk7CisJfQorCQorCS8qCisJICBBbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFzc2lnbiBhCisJICBoYW5kbGVyIHRvIHRoZSBpbnRlcnJ1cHQsIHVubGVzcyB0aGUgJ0hhbmRsZXInIG1lbWJlciBvZiB0aGUKKwkgIGlycSBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQuCisJKi8KKwlpZiAobGluay0+Y29uZi5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfSVJRKQorCQlDU19DSEVDSyhSZXF1ZXN0SVJRLCBwY21jaWFfcmVxdWVzdF9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKSk7CisJCisJLyoKKwkgIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwCisJICB0aGUgSS9PIHdpbmRvd3MgYW5kIHRoZSBpbnRlcnJ1cHQgbWFwcGluZywgYW5kIHB1dHRpbmcgdGhlCisJICBjYXJkIGFuZCBob3N0IGludGVyZmFjZSBpbnRvICJNZW1vcnkgYW5kIElPIiBtb2RlLgorCSovCisJQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZikpOworCQorCWlmIChsaW5rLT5pcnEuQXNzaWduZWRJUlEgPT0gMCkgeworCQlwcmludGsoS0VSTl9BTEVSVCAKKwkJICAgICAgICJhdG1lbDogY2Fubm90IGFzc2lnbiBJUlE6IGNoZWNrIHRoYXQgQ09ORklHX0lTQSBpcyBzZXQgaW4ga2VybmVsIGNvbmZpZy4iKTsKKwkJZ290byBjc19mYWlsZWQ7CisJfQorICAgICAgIAorCSgobG9jYWxfaW5mb190KilsaW5rLT5wcml2KS0+ZXRoX2RldiA9IAorCQlpbml0X2F0bWVsX2NhcmQobGluay0+aXJxLkFzc2lnbmVkSVJRLAorCQkJCWxpbmstPmlvLkJhc2VQb3J0MSwKKwkJCQljYXJkX2luZGV4ID09IC0xID8gQVRNRUxfRldfVFlQRV9OT05FIDogIGNhcmRfdGFibGVbY2FyZF9pbmRleF0uZmlybXdhcmUsCisJCQkJJmhhbmRsZV90b19kZXYoaGFuZGxlKSwKKwkJCQljYXJkX3ByZXNlbnQsIAorCQkJCWxpbmspOworCWlmICghKChsb2NhbF9pbmZvX3QqKWxpbmstPnByaXYpLT5ldGhfZGV2KSAKKwkJZ290byBjc19mYWlsZWQ7CisJCisJLyoKKwkgIEF0IHRoaXMgcG9pbnQsIHRoZSBkZXZfbm9kZV90IHN0cnVjdHVyZShzKSBuZWVkIHRvIGJlCisJICBpbml0aWFsaXplZCBhbmQgYXJyYW5nZWQgaW4gYSBsaW5rZWQgbGlzdCBhdCBsaW5rLT5kZXYuCisJKi8KKwlzdHJjcHkoZGV2LT5ub2RlLmRldl9uYW1lLCAoKGxvY2FsX2luZm9fdCopbGluay0+cHJpdiktPmV0aF9kZXYtPm5hbWUgKTsKKwlkZXYtPm5vZGUubWFqb3IgPSBkZXYtPm5vZGUubWlub3IgPSAwOworCWxpbmstPmRldiA9ICZkZXYtPm5vZGU7CisJCisJLyogRmluYWxseSwgcmVwb3J0IHdoYXQgd2UndmUgZG9uZSAqLworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyVzaW5kZXggMHglMDJ4OiBWY2MgJWQuJWQiLAorCSAgICAgICBkZXYtPm5vZGUuZGV2X25hbWUsCisJICAgICAgIGNhcmRfaW5kZXggPT0gLTEgPyAiIiA6ICBjYXJkX3RhYmxlW2NhcmRfaW5kZXhdLm5hbWUsCisJICAgICAgIGNhcmRfaW5kZXggPT0gLTEgPyAiIiA6ICIgIiwKKwkgICAgICAgbGluay0+Y29uZi5Db25maWdJbmRleCwKKwkgICAgICAgbGluay0+Y29uZi5WY2MvMTAsIGxpbmstPmNvbmYuVmNjJTEwKTsKKwlpZiAobGluay0+Y29uZi5WcHAxKQorCQlwcmludGsoIiwgVnBwICVkLiVkIiwgbGluay0+Y29uZi5WcHAxLzEwLCBsaW5rLT5jb25mLlZwcDElMTApOworCWlmIChsaW5rLT5jb25mLkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpCisJCXByaW50aygiLCBpcnEgJWQiLCBsaW5rLT5pcnEuQXNzaWduZWRJUlEpOworCWlmIChsaW5rLT5pby5OdW1Qb3J0czEpCisJCXByaW50aygiLCBpbyAweCUwNHgtMHglMDR4IiwgbGluay0+aW8uQmFzZVBvcnQxLAorCQkgICAgICAgbGluay0+aW8uQmFzZVBvcnQxK2xpbmstPmlvLk51bVBvcnRzMS0xKTsKKwlpZiAobGluay0+aW8uTnVtUG9ydHMyKQorCQlwcmludGsoIiAmIDB4JTA0eC0weCUwNHgiLCBsaW5rLT5pby5CYXNlUG9ydDIsCisJCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDIrbGluay0+aW8uTnVtUG9ydHMyLTEpOworCXByaW50aygiXG4iKTsKKwkKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworCXJldHVybjsKKwkKKyBjc19mYWlsZWQ6CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBsYXN0X2ZuLCBsYXN0X3JldCk7CisJYXRtZWxfcmVsZWFzZShsaW5rKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgYXRtZWxfcmVsZWFzZSgpIHdpbGwgdW5yZWdpc3RlciB0aGUKKyAgZGV2aWNlLCBhbmQgcmVsZWFzZSB0aGUgUENNQ0lBIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgZGV2aWNlIGlzCisgIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgorICAKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIGF0bWVsX3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKChsb2NhbF9pbmZvX3QqKWxpbmstPnByaXYpLT5ldGhfZGV2OworCQkKKwlERUJVRygwLCAiYXRtZWxfcmVsZWFzZSgweCVwKVxuIiwgbGluayk7CisJCisJLyogVW5saW5rIHRoZSBkZXZpY2UgY2hhaW4gKi8KKwlsaW5rLT5kZXYgPSBOVUxMOworCQorCWlmIChkZXYpIAorCQlzdG9wX2F0bWVsX2NhcmQoZGV2LCAwKTsKKwkoKGxvY2FsX2luZm9fdCopbGluay0+cHJpdiktPmV0aF9kZXYgPSBOVUxMOyAKKwkKKwkvKiBEb24ndCBib3RoZXIgY2hlY2tpbmcgdG8gc2VlIGlmIHRoZXNlIHN1Y2NlZWQgb3Igbm90ICovCisJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCWlmIChsaW5rLT5pby5OdW1Qb3J0czEpCisJCXBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwlpZiAobGluay0+aXJxLkFzc2lnbmVkSVJRKQorCQlwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIAorICBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gIE1vc3RseSwgdGhpcyBzY2hlZHVsZXMgb3RoZXIKKyAgc3R1ZmYgdG8gcnVuIGFmdGVyIGFuIGV2ZW50IGlzIHJlY2VpdmVkLgorCisgIFdoZW4gYSBDQVJEX1JFTU9WQUwgZXZlbnQgaXMgcmVjZWl2ZWQsIHdlIGltbWVkaWF0ZWx5IHNldCBhCisgIHByaXZhdGUgZmxhZyB0byBibG9jayBmdXR1cmUgYWNjZXNzZXMgdG8gdGhpcyBkZXZpY2UuICBBbGwgdGhlCisgIGZ1bmN0aW9ucyB0aGF0IGFjdHVhbGx5IGFjY2VzcyB0aGUgZGV2aWNlIHNob3VsZCBjaGVjayB0aGlzIGZsYWcKKyAgdG8gbWFrZSBzdXJlIHRoZSBjYXJkIGlzIHN0aWxsIHByZXNlbnQuCisgIAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBhdG1lbF9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCSAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncykKK3sKKwlkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisJbG9jYWxfaW5mb190ICpsb2NhbCA9IGxpbmstPnByaXY7CisJCisJREVCVUcoMSwgImF0bWVsX2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKwkKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJCWxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJbmV0aWZfZGV2aWNlX2RldGFjaChsb2NhbC0+ZXRoX2Rldik7CisJCQlhdG1lbF9yZWxlYXNlKGxpbmspOworCQl9CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisJCWxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOworCQlhdG1lbF9jb25maWcobGluayk7CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwkJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworCWNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCW5ldGlmX2RldmljZV9kZXRhY2gobG9jYWwtPmV0aF9kZXYpOworCQkJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCQl9CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisJCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKTsKKwkJCWF0bWVsX29wZW4obG9jYWwtPmV0aF9kZXYpOworCQkJbmV0aWZfZGV2aWNlX2F0dGFjaChsb2NhbC0+ZXRoX2Rldik7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfSAvKiBhdG1lbF9ldmVudCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBhdG1lbF9kcml2ZXIgPSB7CisgICAgICAgIC5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorICAgICAgICAuZHJ2ICAgICAgICAgICAgPSB7CisgICAgICAgICAgICAgICAgLm5hbWUgICA9ICJhdG1lbF9jcyIsCisgICAgICAgIH0sCisgICAgICAgIC5hdHRhY2ggICAgICAgICA9IGF0bWVsX2F0dGFjaCwKKyAgICAgICAgLmRldGFjaCAgICAgICAgID0gYXRtZWxfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBhdG1lbF9jc19pbml0KHZvaWQpCit7CisgICAgICAgIHJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZhdG1lbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBhdG1lbF9jc19jbGVhbnVwKHZvaWQpCit7CisgICAgICAgIHBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmYXRtZWxfZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKKy8qCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAgICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBJbiBhZGRpdGlvbjoKKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICAgICAgIHBlcm1pc3Npb24uCisKKyAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICAgIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgICAgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgICAgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICAgIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICAgIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAgIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICAgIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAgICBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAgICBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAgICBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gICAgCisqLworCittb2R1bGVfaW5pdChhdG1lbF9jc19pbml0KTsKK21vZHVsZV9leGl0KGF0bWVsX2NzX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbF9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWIwMGE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfcGNpLmMKQEAgLTAsMCArMSw4OSBAQAorLyoqKiAtKi0gbGludXgtYyAtKi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgIERyaXZlciBmb3IgQXRtZWwgYXQ3NmM1MDIgYXQ3NmM1MDQgYW5kIGF0NzZjNTA2IHdpcmVsZXNzIGNhcmRzLgorCisgICAgICAgICBDb3B5cmlnaHQgMjAwNCBTaW1vbiBLZWxsZXkuCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggQXRtZWwgd2lyZWxlc3MgbGFuIGRyaXZlcnM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSAiYXRtZWwuaCIKKworTU9EVUxFX0FVVEhPUigiU2ltb24gS2VsbGV5Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN1cHBvcnQgZm9yIEF0bWVsIGF0NzZjNTB4IDgwMi4xMSB3aXJlbGVzcyBldGhlcm5ldCBjYXJkcy4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJBdG1lbCBhdDc2YzUwNiBQQ0kgd2lyZWxlc3MgY2FyZHMiKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGNhcmRfaWRzW10gPSB7CisJeyAweDExMTQsIDB4MDUwNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGNhcmRfaWRzKTsKKworc3RhdGljIGludCBhdG1lbF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKik7CitzdGF0aWMgdm9pZCBhdG1lbF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICopOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYXRtZWxfZHJpdmVyID0geworCS5uYW1lICAgICA9ICJhdG1lbCIsCisJLmlkX3RhYmxlID0gY2FyZF9pZHMsCisJLnByb2JlICAgID0gYXRtZWxfcGNpX3Byb2JlLAorCS5yZW1vdmUgICA9IF9fZGV2ZXhpdF9wKGF0bWVsX3BjaV9yZW1vdmUpLAorfTsKKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhdG1lbF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGVudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCQkKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCisJCXJldHVybiAtRU5PREVWOworCQorCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCQorCWRldiA9IGluaXRfYXRtZWxfY2FyZChwZGV2LT5pcnEsIHBkZXYtPnJlc291cmNlWzFdLnN0YXJ0LCAKKwkJCSAgICAgIEFUTUVMX0ZXX1RZUEVfNTA2LAorCQkJICAgICAgJnBkZXYtPmRldiwgTlVMTCwgTlVMTCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCQorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYXRtZWxfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdG9wX2F0bWVsX2NhcmQocGNpX2dldF9kcnZkYXRhKHBkZXYpLCAxKTsKK30KKworc3RhdGljIGludCBfX2luaXQgYXRtZWxfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZhdG1lbF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXRtZWxfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmF0bWVsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGF0bWVsX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGF0bWVsX2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaGVybWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFjM2QwZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lcy5jCkBAIC0wLDAgKzEsNTU0IEBACisvKiBoZXJtZXMuYworICoKKyAqIERyaXZlciBjb3JlIGZvciB0aGUgIkhlcm1lcyIgd2lyZWxlc3MgTUFDIGNvbnRyb2xsZXIsIGFzIHVzZWQgaW4KKyAqIHRoZSBMdWNlbnQgT3Jpbm9jbyBhbmQgQ2FibGV0cm9uIFJvYW1BYm91dCBjYXJkcy4gSXQgc2hvdWxkIGFsc28KKyAqIHdvcmsgb24gdGhlIGhmYTM4NDEgYW5kIGhmYTM4NDIgTUFDIGNvbnRyb2xsZXIgY2hpcHMgdXNlZCBpbiB0aGUKKyAqIFByaXNtIElJIGNoaXBzZXRzLgorICoKKyAqIFRoaXMgaXMgbm90IGEgY29tcGxldGUgZHJpdmVyLCBqdXN0IGxvdy1sZXZlbCBhY2Nlc3Mgcm91dGluZXMgZm9yCisgKiB0aGUgTUFDIGNvbnRyb2xsZXIgaXRzZWxmLgorICoKKyAqIEJhc2VkIG9uIHRoZSBwcmlzbTIgZHJpdmVyIGZyb20gQWJzb2x1dGUgVmFsdWUgU3lzdGVtcycgbGludXgtd2xhbgorICogcHJvamVjdCwgdGhlIExpbnV4IHd2bGFuX2NzIGRyaXZlciwgTHVjZW50J3MgSENGLUxpZ2h0CisgKiAod3ZsYW5faGNmLmMpIGxpYnJhcnksIGFuZCB0aGUgTmV0QlNEIHdpcmVsZXNzIGRyaXZlciAoaW4gbm8KKyAqIHBhcnRpY3VsYXIgb3JkZXIpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCwgRGF2aWQgR2lic29uLCBMaW51eGNhcmUgQXVzdHJhbGlhLgorICogKEMpIENvcHlyaWdodCBEYXZpZCBHaWJzb24sIElCTSBDb3JwLiAyMDAxLTIwMDMuCisgKiAKKyAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UKKyAqIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4KKyAqIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlCisgKiBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KKyAqCisgKiBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiCisgKiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlCisgKiB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSwgaW4KKyAqIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZQorICogYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKKyAqIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIKKyAqIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkKKyAqIGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZAorICogb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLiAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlCisgKiBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKKyAqIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisKKyNpbmNsdWRlICJoZXJtZXMuaCIKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJMb3ctbGV2ZWwgZHJpdmVyIGhlbHBlciBmb3IgTHVjZW50IEhlcm1lcyBjaGlwc2V0IGFuZCBQcmlzbSBJSSBIRkEzODR4IHdpcmVsZXNzIE1BQyBjb250cm9sbGVyIik7CitNT0RVTEVfQVVUSE9SKCJQYXZlbCBSb3NraW4gPHByb3NraUBnbnUub3JnPiIKKwkiICYgRGF2aWQgR2lic29uIDxoZXJtZXNAZ2lic29uLmRyb3BiZWFyLmlkLmF1PiIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTVBML0dQTCIpOworCisvKiBUaGVzZSBhcmUgbWF4aW11bSB0aW1lb3V0cy4gTW9zdCBvZnRlbiwgY2FyZCB3aWwgcmVhY3QgbXVjaCBmYXN0ZXIgKi8KKyNkZWZpbmUgQ01EX0JVU1lfVElNRU9VVCAoMTAwKSAvKiBJbiBpdGVyYXRpb25zIG9mIH4xdXMgKi8KKyNkZWZpbmUgQ01EX0lOSVRfVElNRU9VVCAoNTAwMDApIC8qIGluIGl0ZXJhdGlvbnMgb2YgfjEwdXMgKi8KKyNkZWZpbmUgQ01EX0NPTVBMX1RJTUVPVVQgKDIwMDAwKSAvKiBpbiBpdGVyYXRpb25zIG9mIH4xMHVzICovCisjZGVmaW5lIEFMTE9DX0NPTVBMX1RJTUVPVVQgKDEwMDApIC8qIGluIGl0ZXJhdGlvbnMgb2YgfjEwdXMgKi8KKworLyoKKyAqIERlYnVnZ2luZyBoZWxwZXJzCisgKi8KKworI2RlZmluZSBETVNHKHN0dWZmLi4uKSBkbyB7cHJpbnRrKEtFUk5fREVCVUcgImhlcm1lcyBAICVwOiAiICwgaHctPmlvYmFzZSk7IFwKKwkJCXByaW50ayhzdHVmZik7fSB3aGlsZSAoMCkKKworI3VuZGVmIEhFUk1FU19ERUJVRworI2lmZGVmIEhFUk1FU19ERUJVRworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjZGVmaW5lIERFQlVHKGx2bCwgc3R1ZmYuLi4pIGlmICggKGx2bCkgPD0gSEVSTUVTX0RFQlVHKSBETVNHKHN0dWZmKQorCisjZWxzZSAvKiAhIEhFUk1FU19ERUJVRyAqLworCisjZGVmaW5lIERFQlVHKGx2bCwgc3R1ZmYuLi4pIGRvIHsgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qICEgSEVSTUVTX0RFQlVHICovCisKKworLyoKKyAqIEludGVybmFsIGZ1bmN0aW9ucworICovCisKKy8qIElzc3VlIGEgY29tbWFuZCB0byB0aGUgY2hpcC4gV2FpdGluZyBmb3IgaXQgdG8gY29tcGxldGUgaXMgdGhlIGNhbGxlcidzCisgICBwcm9ibGVtLgorCisgICBSZXR1cm5zIC1FQlVTWSBpZiB0aGUgY29tbWFuZCByZWdpc3RlciBpcyBidXN5LCAwIG9uIHN1Y2Nlc3MuCisKKyAgIENhbGxhYmxlIGZyb20gYW55IGNvbnRleHQuCisqLworc3RhdGljIGludCBoZXJtZXNfaXNzdWVfY21kKGhlcm1lc190ICpodywgdTE2IGNtZCwgdTE2IHBhcmFtMCkKK3sKKwlpbnQgayA9IENNRF9CVVNZX1RJTUVPVVQ7CisJdTE2IHJlZzsKKworCS8qIEZpcnN0IHdhaXQgZm9yIHRoZSBjb21tYW5kIHJlZ2lzdGVyIHRvIHVuYnVzeSAqLworCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIENNRCk7CisJd2hpbGUgKCAocmVnICYgSEVSTUVTX0NNRF9CVVNZKSAmJiBrICkgeworCQlrLS07CisJCXVkZWxheSgxKTsKKwkJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgQ01EKTsKKwl9CisJaWYgKHJlZyAmIEhFUk1FU19DTURfQlVTWSkgeworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWhlcm1lc193cml0ZV9yZWduKGh3LCBQQVJBTTIsIDApOworCWhlcm1lc193cml0ZV9yZWduKGh3LCBQQVJBTTEsIDApOworCWhlcm1lc193cml0ZV9yZWduKGh3LCBQQVJBTTAsIHBhcmFtMCk7CisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIENNRCwgY21kKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGRlZmluaXRpb25zCisgKi8KKwordm9pZCBoZXJtZXNfc3RydWN0X2luaXQoaGVybWVzX3QgKmh3LCB2b2lkIF9faW9tZW0gKmFkZHJlc3MsIGludCByZWdfc3BhY2luZykKK3sKKwlody0+aW9iYXNlID0gYWRkcmVzczsKKwlody0+cmVnX3NwYWNpbmcgPSByZWdfc3BhY2luZzsKKwlody0+aW50ZW4gPSAweDA7CisKKyNpZmRlZiBIRVJNRVNfREVCVUdfQlVGRkVSCisJaHctPmRidWZwID0gMDsKKwltZW1zZXQoJmh3LT5kYnVmLCAweGZmLCBzaXplb2YoaHctPmRidWYpKTsKKwltZW1zZXQoJmh3LT5wcm9maWxlLCAwLCBzaXplb2YoaHctPnByb2ZpbGUpKTsKKyNlbmRpZgorfQorCitpbnQgaGVybWVzX2luaXQoaGVybWVzX3QgKmh3KQoreworCXUxNiBzdGF0dXMsIHJlZzsKKwlpbnQgZXJyID0gMDsKKwlpbnQgazsKKworCS8qIFdlIGRvbid0IHdhbnQgdG8gYmUgaW50ZXJydXB0ZWQgd2hpbGUgcmVzZXR0aW5nIHRoZSBjaGlwc2V0ICovCisJaHctPmludGVuID0gMHgwOworCWhlcm1lc193cml0ZV9yZWduKGh3LCBJTlRFTiwgMCk7CisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIEVWQUNLLCAweGZmZmYpOworCisJLyogTm9ybWFsbHkgaXQncyBhICJjYW4ndCBoYXBwZW4iIGZvciB0aGUgY29tbWFuZCByZWdpc3RlciB0bworICAgICAgICAgICBiZSBidXN5IHdoZW4gd2UgZ28gdG8gaXNzdWUgYSBjb21tYW5kIGJlY2F1c2Ugd2UgYXJlCisgICAgICAgICAgIHNlcmlhbGl6aW5nIGFsbCBjb21tYW5kcy4gIEhvd2V2ZXIgd2Ugd2FudCB0byBoYXZlIHNvbWUKKyAgICAgICAgICAgY2hhbmNlIG9mIHJlc2V0dGluZyB0aGUgY2FyZCBldmVuIGlmIGl0IGdldHMgaW50byBhIHN0dXBpZAorICAgICAgICAgICBzdGF0ZSwgc28gd2UgYWN0dWFsbHkgd2FpdCB0byBzZWUgaWYgdGhlIGNvbW1hbmQgcmVnaXN0ZXIKKyAgICAgICAgICAgd2lsbCB1bmJ1c3kgaXRzZWxmIGhlcmUuICovCisJayA9IENNRF9CVVNZX1RJTUVPVVQ7CisJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgQ01EKTsKKwl3aGlsZSAoayAmJiAocmVnICYgSEVSTUVTX0NNRF9CVVNZKSkgeworCQlpZiAocmVnID09IDB4ZmZmZikgLyogU3BlY2lhbCBjYXNlIC0gdGhlIGNhcmQgaGFzIHByb2JhYmx5IGJlZW4gcmVtb3ZlZCwKKwkJCQkgICAgICBzbyBkb24ndCB3YWl0IGZvciB0aGUgdGltZW91dCAqLworCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJay0tOworCQl1ZGVsYXkoMSk7CisJCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIENNRCk7CisJfQorCQorCS8qIE5vIG5lZWQgdG8gZXhwbGljaXRseSBoYW5kbGUgdGhlIHRpbWVvdXQgLSBpZiB3ZSd2ZSB0aW1lZAorCSAgIG91dCBoZXJtZXNfaXNzdWVfY21kKCkgd2lsbCBwcm9iYWJseSByZXR1cm4gLUVCVVNZIGJlbG93ICovCisKKwkvKiBBY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50YXRpb24sIEVWU1RBVCBtYXkgY29udGFpbgorCSAgIG9ic29sZXRlIGV2ZW50IG9jY3VycmVuY2UgaW5mb3JtYXRpb24uICBXZSBoYXZlIHRvIGFja25vd2xlZGdlCisJICAgaXQgYnkgd3JpdGluZyBFVkFDSy4gKi8KKwlyZWcgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBFVlNUQVQpOworCWhlcm1lc193cml0ZV9yZWduKGh3LCBFVkFDSywgcmVnKTsKKworCS8qIFdlIGRvbid0IHVzZSBoZXJtZXNfZG9jbWRfd2FpdCBoZXJlLCBiZWNhdXNlIHRoZSByZXNldCB3aXBlcworCSAgIHRoZSBtYWdpYyBjb25zdGFudCBpbiBTV1NVUFBPUlQwIGF3YXksIGFuZCBpdCBnZXRzIGNvbmZ1c2VkICovCisJZXJyID0gaGVybWVzX2lzc3VlX2NtZChodywgSEVSTUVTX0NNRF9JTklULCAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgRVZTVEFUKTsKKwlrID0gQ01EX0lOSVRfVElNRU9VVDsKKwl3aGlsZSAoICghIChyZWcgJiBIRVJNRVNfRVZfQ01EKSkgJiYgaykgeworCQlrLS07CisJCXVkZWxheSgxMCk7CisJCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIEVWU1RBVCk7CisJfQorCisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIFNXU1VQUE9SVDAsIEhFUk1FU19NQUdJQyk7CisKKwlpZiAoISBoZXJtZXNfcHJlc2VudChodykpIHsKKwkJREVCVUcoMCwgImhlcm1lcyBAIDB4JXg6IENhcmQgcmVtb3ZlZCBkdXJpbmcgcmVzZXQuXG4iLAorCQkgICAgICAgaHctPmlvYmFzZSk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKwkJCisJaWYgKCEgKHJlZyAmIEhFUk1FU19FVl9DTUQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGVybWVzIEAgJXA6ICIgCisJCSAgICAgICAiVGltZW91dCB3YWl0aW5nIGZvciBjYXJkIHRvIHJlc2V0IChyZWc9MHglMDR4KSFcbiIsCisJCSAgICAgICBody0+aW9iYXNlLCByZWcpOworCQllcnIgPSAtRVRJTUVET1VUOworCQlnb3RvIG91dDsKKwl9CisKKwlzdGF0dXMgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBTVEFUVVMpOworCisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIEVWQUNLLCBIRVJNRVNfRVZfQ01EKTsKKworCWlmIChzdGF0dXMgJiBIRVJNRVNfU1RBVFVTX1JFU1VMVCkKKwkJZXJyID0gLUVJTzsKKworIG91dDoKKwlyZXR1cm4gZXJyOworfQorCisvKiBJc3N1ZSBhIGNvbW1hbmQgdG8gdGhlIGNoaXAsIGFuZCAoYnVzeSEpIHdhaXQgZm9yIGl0IHRvCisgKiBjb21wbGV0ZS4KKyAqCisgKiBSZXR1cm5zOiA8IDAgb24gaW50ZXJuYWwgZXJyb3IsIDAgb24gc3VjY2VzcywgPiAwIG9uIGVycm9yIHJldHVybmVkIGJ5IHRoZSBmaXJtd2FyZQorICoKKyAqIENhbGxhYmxlIGZyb20gYW55IGNvbnRleHQsIGJ1dCBsb2NraW5nIGlzIHlvdXIgcHJvYmxlbS4gKi8KK2ludCBoZXJtZXNfZG9jbWRfd2FpdChoZXJtZXNfdCAqaHcsIHUxNiBjbWQsIHUxNiBwYXJtMCwKKwkJICAgICAgc3RydWN0IGhlcm1lc19yZXNwb25zZSAqcmVzcCkKK3sKKwlpbnQgZXJyOworCWludCBrOworCXUxNiByZWc7CisJdTE2IHN0YXR1czsKKworCWVyciA9IGhlcm1lc19pc3N1ZV9jbWQoaHcsIGNtZCwgcGFybTApOworCWlmIChlcnIpIHsKKwkJaWYgKCEgaGVybWVzX3ByZXNlbnQoaHcpKSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImhlcm1lcyBAICVwOiAiCisJCQkJICAgICAgICJDYXJkIHJlbW92ZWQgd2hpbGUgaXNzdWluZyBjb21tYW5kICIKKwkJCQkgICAgICAgIjB4JTA0eC5cbiIsIGh3LT5pb2Jhc2UsIGNtZCk7CisJCQllcnIgPSAtRU5PREVWOworCQl9IGVsc2UgCisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCXByaW50ayhLRVJOX0VSUiAiaGVybWVzIEAgJXA6ICIKKwkJCQkgICAgICAgIkVycm9yICVkIGlzc3VpbmcgY29tbWFuZCAweCUwNHguXG4iLAorCQkJCSAgICAgICBody0+aW9iYXNlLCBlcnIsIGNtZCk7CisJCWdvdG8gb3V0OworCX0KKworCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIEVWU1RBVCk7CisJayA9IENNRF9DT01QTF9USU1FT1VUOworCXdoaWxlICggKCEgKHJlZyAmIEhFUk1FU19FVl9DTUQpKSAmJiBrKSB7CisJCWstLTsKKwkJdWRlbGF5KDEwKTsKKwkJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgRVZTVEFUKTsKKwl9CisKKwlpZiAoISBoZXJtZXNfcHJlc2VudChodykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGVybWVzIEAgJXA6IENhcmQgcmVtb3ZlZCAiCisJCSAgICAgICAid2hpbGUgd2FpdGluZyBmb3IgY29tbWFuZCAweCUwNHggY29tcGxldGlvbi5cbiIsCisJCSAgICAgICBody0+aW9iYXNlLCBjbWQpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisJCQorCWlmICghIChyZWcgJiBIRVJNRVNfRVZfQ01EKSkgeworCQlwcmludGsoS0VSTl9FUlIgImhlcm1lcyBAICVwOiBUaW1lb3V0IHdhaXRpbmcgZm9yICIKKwkJICAgICAgICJjb21tYW5kIDB4JTA0eCBjb21wbGV0aW9uLlxuIiwgaHctPmlvYmFzZSwgY21kKTsKKwkJZXJyID0gLUVUSU1FRE9VVDsKKwkJZ290byBvdXQ7CisJfQorCisJc3RhdHVzID0gaGVybWVzX3JlYWRfcmVnbihodywgU1RBVFVTKTsKKwlpZiAocmVzcCkgeworCQlyZXNwLT5zdGF0dXMgPSBzdGF0dXM7CisJCXJlc3AtPnJlc3AwID0gaGVybWVzX3JlYWRfcmVnbihodywgUkVTUDApOworCQlyZXNwLT5yZXNwMSA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIFJFU1AxKTsKKwkJcmVzcC0+cmVzcDIgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBSRVNQMik7CisJfQorCisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIEVWQUNLLCBIRVJNRVNfRVZfQ01EKTsKKworCWlmIChzdGF0dXMgJiBIRVJNRVNfU1RBVFVTX1JFU1VMVCkKKwkJZXJyID0gLUVJTzsKKworIG91dDoKKwlyZXR1cm4gZXJyOworfQorCitpbnQgaGVybWVzX2FsbG9jYXRlKGhlcm1lc190ICpodywgdTE2IHNpemUsIHUxNiAqZmlkKQoreworCWludCBlcnIgPSAwOworCWludCBrOworCXUxNiByZWc7CisJCisJaWYgKCAoc2l6ZSA8IEhFUk1FU19BTExPQ19MRU5fTUlOKSB8fCAoc2l6ZSA+IEhFUk1FU19BTExPQ19MRU5fTUFYKSApCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gaGVybWVzX2RvY21kX3dhaXQoaHcsIEhFUk1FU19DTURfQUxMT0MsIHNpemUsIE5VTEwpOworCWlmIChlcnIpIHsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZWcgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBFVlNUQVQpOworCWsgPSBBTExPQ19DT01QTF9USU1FT1VUOworCXdoaWxlICggKCEgKHJlZyAmIEhFUk1FU19FVl9BTExPQykpICYmIGspIHsKKwkJay0tOworCQl1ZGVsYXkoMTApOworCQlyZWcgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBFVlNUQVQpOworCX0KKwkKKwlpZiAoISBoZXJtZXNfcHJlc2VudChodykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGVybWVzIEAgJXA6ICIKKwkJICAgICAgICJDYXJkIHJlbW92ZWQgd2FpdGluZyBmb3IgZnJhbWUgYWxsb2NhdGlvbi5cbiIsCisJCSAgICAgICBody0+aW9iYXNlKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCQkKKwlpZiAoISAocmVnICYgSEVSTUVTX0VWX0FMTE9DKSkgeworCQlwcmludGsoS0VSTl9FUlIgImhlcm1lcyBAICVwOiAiCisJCSAgICAgICAiVGltZW91dCB3YWl0aW5nIGZvciBmcmFtZSBhbGxvY2F0aW9uXG4iLAorCQkgICAgICAgaHctPmlvYmFzZSk7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCSpmaWQgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBBTExPQ0ZJRCk7CisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIEVWQUNLLCBIRVJNRVNfRVZfQUxMT0MpOworCQorCXJldHVybiAwOworfQorCisKKy8qIFNldCB1cCBhIEJBUCB0byByZWFkIGEgcGFydGljdWxhciBjaHVuayBvZiBkYXRhIGZyb20gY2FyZCdzIGludGVybmFsIGJ1ZmZlci4KKyAqCisgKiBSZXR1cm5zOiA8IDAgb24gaW50ZXJuYWwgZmFpbHVyZSAoZXJybm8pLCAwIG9uIHN1Y2Nlc3MsID4wIG9uIGVycm9yCisgKiBmcm9tIGZpcm13YXJlCisgKgorICogQ2FsbGFibGUgZnJvbSBhbnkgY29udGV4dCAqLworc3RhdGljIGludCBoZXJtZXNfYmFwX3NlZWsoaGVybWVzX3QgKmh3LCBpbnQgYmFwLCB1MTYgaWQsIHUxNiBvZmZzZXQpCit7CisJaW50IHNyZWcgPSBiYXAgPyBIRVJNRVNfU0VMRUNUMSA6IEhFUk1FU19TRUxFQ1QwOworCWludCBvcmVnID0gYmFwID8gSEVSTUVTX09GRlNFVDEgOiBIRVJNRVNfT0ZGU0VUMDsKKwlpbnQgazsKKwl1MTYgcmVnOworCisJLyogUGFyYW5vaWEuLiAqLworCWlmICggKG9mZnNldCA+IEhFUk1FU19CQVBfT0ZGU0VUX01BWCkgfHwgKG9mZnNldCAlIDIpICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlrID0gSEVSTUVTX0JBUF9CVVNZX1RJTUVPVVQ7CisJcmVnID0gaGVybWVzX3JlYWRfcmVnKGh3LCBvcmVnKTsKKwl3aGlsZSAoKHJlZyAmIEhFUk1FU19PRkZTRVRfQlVTWSkgJiYgaykgeworCQlrLS07CisJCXVkZWxheSgxKTsKKwkJcmVnID0gaGVybWVzX3JlYWRfcmVnKGh3LCBvcmVnKTsKKwl9CisKKyNpZmRlZiBIRVJNRVNfREVCVUdfQlVGRkVSCisJaHctPnByb2ZpbGVbSEVSTUVTX0JBUF9CVVNZX1RJTUVPVVQgLSBrXSsrOworCisJaWYgKGsgPCBIRVJNRVNfQkFQX0JVU1lfVElNRU9VVCkgeworCQlzdHJ1Y3QgaGVybWVzX2RlYnVnX2VudHJ5ICplID0gCisJCQkmaHctPmRidWZbKGh3LT5kYnVmcCsrKSAlIEhFUk1FU19ERUJVR19CVUZTSVpFXTsKKwkJZS0+YmFwID0gYmFwOworCQllLT5pZCA9IGlkOworCQllLT5vZmZzZXQgPSBvZmZzZXQ7CisJCWUtPmN5Y2xlcyA9IEhFUk1FU19CQVBfQlVTWV9USU1FT1VUIC0gazsKKwl9CisjZW5kaWYKKworCWlmIChyZWcgJiBIRVJNRVNfT0ZGU0VUX0JVU1kpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJLyogTm93IHdlIGFjdHVhbGx5IHNldCB1cCB0aGUgdHJhbnNmZXIgKi8KKwloZXJtZXNfd3JpdGVfcmVnKGh3LCBzcmVnLCBpZCk7CisJaGVybWVzX3dyaXRlX3JlZyhodywgb3JlZywgb2Zmc2V0KTsKKworCS8qIFdhaXQgZm9yIHRoZSBCQVAgdG8gYmUgcmVhZHkgKi8KKwlrID0gSEVSTUVTX0JBUF9CVVNZX1RJTUVPVVQ7CisJcmVnID0gaGVybWVzX3JlYWRfcmVnKGh3LCBvcmVnKTsKKwl3aGlsZSAoIChyZWcgJiAoSEVSTUVTX09GRlNFVF9CVVNZIHwgSEVSTUVTX09GRlNFVF9FUlIpKSAmJiBrKSB7CisJCWstLTsKKwkJdWRlbGF5KDEpOworCQlyZWcgPSBoZXJtZXNfcmVhZF9yZWcoaHcsIG9yZWcpOworCX0KKworCWlmIChyZWcgIT0gb2Zmc2V0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiaGVybWVzIEAgJXA6IEJBUCVkIG9mZnNldCAlczogIgorCQkgICAgICAgInJlZz0weCV4IGlkPTB4JXggb2Zmc2V0PTB4JXhcbiIsIGh3LT5pb2Jhc2UsIGJhcCwKKwkJICAgICAgIChyZWcgJiBIRVJNRVNfT0ZGU0VUX0JVU1kpID8gInRpbWVvdXQiIDogImVycm9yIiwKKwkJICAgICAgIHJlZywgaWQsIG9mZnNldCk7CisKKwkJaWYgKHJlZyAmIEhFUk1FU19PRkZTRVRfQlVTWSkgeworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKworCQlyZXR1cm4gLUVJTzsJCS8qIGVycm9yIG9yIHdyb25nIG9mZnNldCAqLworCX0KKworCXJldHVybiAwOworfQorCisvKiBSZWFkIGEgYmxvY2sgb2YgZGF0YSBmcm9tIHRoZSBjaGlwJ3MgYnVmZmVyLCB2aWEgdGhlCisgKiBCQVAuIFN5bmNocm9uaXphdGlvbi9zZXJpYWxpemF0aW9uIGlzIHRoZSBjYWxsZXIncyBwcm9ibGVtLiAgbGVuCisgKiBtdXN0IGJlIGV2ZW4uCisgKgorICogUmV0dXJuczogPCAwIG9uIGludGVybmFsIGZhaWx1cmUgKGVycm5vKSwgMCBvbiBzdWNjZXNzLCA+IDAgb24gZXJyb3IgZnJvbSBmaXJtd2FyZQorICovCitpbnQgaGVybWVzX2JhcF9wcmVhZChoZXJtZXNfdCAqaHcsIGludCBiYXAsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgbGVuLAorCQkgICAgIHUxNiBpZCwgdTE2IG9mZnNldCkKK3sKKwlpbnQgZHJlZyA9IGJhcCA/IEhFUk1FU19EQVRBMSA6IEhFUk1FU19EQVRBMDsKKwlpbnQgZXJyID0gMDsKKworCWlmICggKGxlbiA8IDApIHx8IChsZW4gJSAyKSApCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gaGVybWVzX2JhcF9zZWVrKGh3LCBiYXAsIGlkLCBvZmZzZXQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyogQWN0dWFsbHkgZG8gdGhlIHRyYW5zZmVyICovCisJaGVybWVzX3JlYWRfd29yZHMoaHcsIGRyZWcsIGJ1ZiwgbGVuLzIpOworCisgb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qIFdyaXRlIGEgYmxvY2sgb2YgZGF0YSB0byB0aGUgY2hpcCdzIGJ1ZmZlciwgdmlhIHRoZQorICogQkFQLiBTeW5jaHJvbml6YXRpb24vc2VyaWFsaXphdGlvbiBpcyB0aGUgY2FsbGVyJ3MgcHJvYmxlbS4gbGVuCisgKiBtdXN0IGJlIGV2ZW4uCisgKgorICogUmV0dXJuczogPCAwIG9uIGludGVybmFsIGZhaWx1cmUgKGVycm5vKSwgMCBvbiBzdWNjZXNzLCA+IDAgb24gZXJyb3IgZnJvbSBmaXJtd2FyZQorICovCitpbnQgaGVybWVzX2JhcF9wd3JpdGUoaGVybWVzX3QgKmh3LCBpbnQgYmFwLCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxlbiwKKwkJICAgICAgdTE2IGlkLCB1MTYgb2Zmc2V0KQoreworCWludCBkcmVnID0gYmFwID8gSEVSTUVTX0RBVEExIDogSEVSTUVTX0RBVEEwOworCWludCBlcnIgPSAwOworCisJaWYgKCAobGVuIDwgMCkgfHwgKGxlbiAlIDIpICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBoZXJtZXNfYmFwX3NlZWsoaHcsIGJhcCwgaWQsIG9mZnNldCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJCisJLyogQWN0dWFsbHkgZG8gdGhlIHRyYW5zZmVyICovCisJaGVybWVzX3dyaXRlX3dvcmRzKGh3LCBkcmVnLCBidWYsIGxlbi8yKTsKKworIG91dDoJCisJcmV0dXJuIGVycjsKK30KKworLyogUmVhZCBhIExlbmd0aC1UeXBlLVZhbHVlIHJlY29yZCBmcm9tIHRoZSBjYXJkLgorICoKKyAqIElmIGxlbmd0aCBpcyBOVUxMLCB3ZSBpZ25vcmUgdGhlIGxlbmd0aCByZWFkIGZyb20gdGhlIGNhcmQsIGFuZAorICogcmVhZCB0aGUgZW50aXJlIGJ1ZmZlciByZWdhcmRsZXNzLiBUaGlzIGlzIHVzZWZ1bCBiZWNhdXNlIHNvbWUgb2YKKyAqIHRoZSBjb25maWd1cmF0aW9uIHJlY29yZHMgYXBwZWFyIHRvIGhhdmUgaW5jb3JyZWN0IGxlbmd0aHMgaW4KKyAqIHByYWN0aWNlLgorICoKKyAqIENhbGxhYmxlIGZyb20gdXNlciBvciBiaCBjb250ZXh0LiAgKi8KK2ludCBoZXJtZXNfcmVhZF9sdHYoaGVybWVzX3QgKmh3LCBpbnQgYmFwLCB1MTYgcmlkLCB1bnNpZ25lZCBidWZzaXplLAorCQkgICAgdTE2ICpsZW5ndGgsIHZvaWQgKmJ1ZikKK3sKKwlpbnQgZXJyID0gMDsKKwlpbnQgZHJlZyA9IGJhcCA/IEhFUk1FU19EQVRBMSA6IEhFUk1FU19EQVRBMDsKKwl1MTYgcmxlbmd0aCwgcnR5cGU7CisJdW5zaWduZWQgbndvcmRzOworCisJaWYgKCAoYnVmc2l6ZSA8IDApIHx8IChidWZzaXplICUgMikgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IGhlcm1lc19kb2NtZF93YWl0KGh3LCBIRVJNRVNfQ01EX0FDQ0VTUywgcmlkLCBOVUxMKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gaGVybWVzX2JhcF9zZWVrKGh3LCBiYXAsIHJpZCwgMCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJsZW5ndGggPSBoZXJtZXNfcmVhZF9yZWcoaHcsIGRyZWcpOworCisJaWYgKCEgcmxlbmd0aCkKKwkJcmV0dXJuIC1FTk9EQVRBOworCisJcnR5cGUgPSBoZXJtZXNfcmVhZF9yZWcoaHcsIGRyZWcpOworCisJaWYgKGxlbmd0aCkKKwkJKmxlbmd0aCA9IHJsZW5ndGg7CisKKwlpZiAocnR5cGUgIT0gcmlkKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJoZXJtZXMgQCAlcDogJXMoKTogIgorCQkgICAgICAgInJpZCAoMHglMDR4KSBkb2VzIG5vdCBtYXRjaCB0eXBlICgweCUwNHgpXG4iLAorCQkgICAgICAgaHctPmlvYmFzZSwgX19GVU5DVElPTl9fLCByaWQsIHJ0eXBlKTsKKwlpZiAoSEVSTUVTX1JFQ0xFTl9UT19CWVRFUyhybGVuZ3RoKSA+IGJ1ZnNpemUpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImhlcm1lcyBAICVwOiAiCisJCSAgICAgICAiVHJ1bmNhdGluZyBMVFYgcmVjb3JkIGZyb20gJWQgdG8gJWQgYnl0ZXMuICIKKwkJICAgICAgICIocmlkPTB4JTA0eCwgbGVuPTB4JTA0eClcbiIsIGh3LT5pb2Jhc2UsCisJCSAgICAgICBIRVJNRVNfUkVDTEVOX1RPX0JZVEVTKHJsZW5ndGgpLCBidWZzaXplLCByaWQsIHJsZW5ndGgpOworCisJbndvcmRzID0gbWluKCh1bnNpZ25lZClybGVuZ3RoIC0gMSwgYnVmc2l6ZSAvIDIpOworCWhlcm1lc19yZWFkX3dvcmRzKGh3LCBkcmVnLCBidWYsIG53b3Jkcyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGhlcm1lc193cml0ZV9sdHYoaGVybWVzX3QgKmh3LCBpbnQgYmFwLCB1MTYgcmlkLCAKKwkJICAgICB1MTYgbGVuZ3RoLCBjb25zdCB2b2lkICp2YWx1ZSkKK3sKKwlpbnQgZHJlZyA9IGJhcCA/IEhFUk1FU19EQVRBMSA6IEhFUk1FU19EQVRBMDsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBjb3VudDsKKworCWlmIChsZW5ndGggPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBoZXJtZXNfYmFwX3NlZWsoaHcsIGJhcCwgcmlkLCAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaGVybWVzX3dyaXRlX3JlZyhodywgZHJlZywgbGVuZ3RoKTsKKwloZXJtZXNfd3JpdGVfcmVnKGh3LCBkcmVnLCByaWQpOworCisJY291bnQgPSBsZW5ndGggLSAxOworCisJaGVybWVzX3dyaXRlX3dvcmRzKGh3LCBkcmVnLCB2YWx1ZSwgY291bnQpOworCisJZXJyID0gaGVybWVzX2RvY21kX3dhaXQoaHcsIEhFUk1FU19DTURfQUNDRVNTIHwgSEVSTUVTX0NNRF9XUklURSwgCisJCQkJcmlkLCBOVUxMKTsKKworCXJldHVybiBlcnI7Cit9CisKK0VYUE9SVF9TWU1CT0woaGVybWVzX3N0cnVjdF9pbml0KTsKK0VYUE9SVF9TWU1CT0woaGVybWVzX2luaXQpOworRVhQT1JUX1NZTUJPTChoZXJtZXNfZG9jbWRfd2FpdCk7CitFWFBPUlRfU1lNQk9MKGhlcm1lc19hbGxvY2F0ZSk7CisKK0VYUE9SVF9TWU1CT0woaGVybWVzX2JhcF9wcmVhZCk7CitFWFBPUlRfU1lNQk9MKGhlcm1lc19iYXBfcHdyaXRlKTsKK0VYUE9SVF9TWU1CT0woaGVybWVzX3JlYWRfbHR2KTsKK0VYUE9SVF9TWU1CT0woaGVybWVzX3dyaXRlX2x0dik7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfaGVybWVzKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2hlcm1lcyh2b2lkKQoreworfQorCittb2R1bGVfaW5pdChpbml0X2hlcm1lcyk7Cittb2R1bGVfZXhpdChleGl0X2hlcm1lcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9oZXJtZXMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOWU4NzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9oZXJtZXMuaApAQCAtMCwwICsxLDQ4MSBAQAorLyogaGVybWVzLmgKKyAqCisgKiBEcml2ZXIgY29yZSBmb3IgdGhlICJIZXJtZXMiIHdpcmVsZXNzIE1BQyBjb250cm9sbGVyLCBhcyB1c2VkIGluCisgKiB0aGUgTHVjZW50IE9yaW5vY28gYW5kIENhYmxldHJvbiBSb2FtQWJvdXQgY2FyZHMuIEl0IHNob3VsZCBhbHNvCisgKiB3b3JrIG9uIHRoZSBoZmEzODQxIGFuZCBoZmEzODQyIE1BQyBjb250cm9sbGVyIGNoaXBzIHVzZWQgaW4gdGhlCisgKiBQcmlzbSBJICYgSUkgY2hpcHNldHMuCisgKgorICogVGhpcyBpcyBub3QgYSBjb21wbGV0ZSBkcml2ZXIsIGp1c3QgbG93LWxldmVsIGFjY2VzcyByb3V0aW5lcyBmb3IKKyAqIHRoZSBNQUMgY29udHJvbGxlciBpdHNlbGYuCisgKgorICogQmFzZWQgb24gdGhlIHByaXNtMiBkcml2ZXIgZnJvbSBBYnNvbHV0ZSBWYWx1ZSBTeXN0ZW1zJyBsaW51eC13bGFuCisgKiBwcm9qZWN0LCB0aGUgTGludXggd3ZsYW5fY3MgZHJpdmVyLCBMdWNlbnQncyBIQ0YtTGlnaHQKKyAqICh3dmxhbl9oY2YuYykgbGlicmFyeSwgYW5kIHRoZSBOZXRCU0Qgd2lyZWxlc3MgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCwgRGF2aWQgR2lic29uLCBMaW51eGNhcmUgQXVzdHJhbGlhLgorICogKEMpIENvcHlyaWdodCBEYXZpZCBHaWJzb24sIElCTSBDb3JwLiAyMDAxLTIwMDMuCisgKgorICogUG9ydGlvbnMgdGFrZW4gZnJvbSBoZmEzODR4LmgsIENvcHlyaWdodCAoQykgMTk5OSBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdQTCwgdmVyc2lvbiAyLgorICovCisKKyNpZm5kZWYgX0hFUk1FU19ICisjZGVmaW5lIF9IRVJNRVNfSAorCisvKiBOb3RlcyBvbiBsb2NraW5nOgorICoKKyAqIEFzIGEgbW9kdWxlIG9mIGxvdyBsZXZlbCBoYXJkd2FyZSBhY2Nlc3Mgcm91dGluZXMsIHRoZXJlIGlzIG5vCisgKiBsb2NraW5nLiBVc2VycyBvZiB0aGlzIG1vZHVsZSBzaG91bGQgZW5zdXJlIHRoYXQgdGhleSBzZXJpYWxpemUKKyAqIGFjY2VzcyB0byB0aGUgaGVybWVzX3Qgc3RydWN0dXJlLCBhbmQgdG8gdGhlIGhhcmR3YXJlCisqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworLyoKKyAqIExpbWl0cyBhbmQgY29uc3RhbnRzCisgKi8KKyNkZWZpbmUJCUhFUk1FU19BTExPQ19MRU5fTUlOCQkoNCkKKyNkZWZpbmUJCUhFUk1FU19BTExPQ19MRU5fTUFYCQkoMjQwMCkKKyNkZWZpbmUJCUhFUk1FU19MVFZfTEVOX01BWAkJKDM0KQorI2RlZmluZQkJSEVSTUVTX0JBUF9EQVRBTEVOX01BWAkJKDQwOTYpCisjZGVmaW5lCQlIRVJNRVNfQkFQX09GRlNFVF9NQVgJCSg0MDk2KQorI2RlZmluZQkJSEVSTUVTX1BPUlRJRF9NQVgJCSg3KQorI2RlZmluZQkJSEVSTUVTX05VTVBPUlRTX01BWAkJKEhFUk1FU19QT1JUSURfTUFYKzEpCisjZGVmaW5lCQlIRVJNRVNfUERSX0xFTl9NQVgJCSgyNjApCS8qIGluIGJ5dGVzLCBmcm9tIEVLICovCisjZGVmaW5lCQlIRVJNRVNfUERBX1JFQ1NfTUFYCQkoMjAwKQkvKiBhIGd1ZXNzICovCisjZGVmaW5lCQlIRVJNRVNfUERBX0xFTl9NQVgJCSgxMDI0KQkvKiBpbiBieXRlcywgZnJvbSBFSyAqLworI2RlZmluZQkJSEVSTUVTX1NDQU5SRVNVTFRfTUFYCQkoMzUpCisjZGVmaW5lCQlIRVJNRVNfQ0hJTkZPUkVTVUxUX01BWAkJKDgpCisjZGVmaW5lCQlIRVJNRVNfTUFYX01VTFRJQ0FTVAkJKDE2KQorI2RlZmluZQkJSEVSTUVTX01BR0lDCQkJKDB4N2QxZikKKworLyoKKyAqIEhlcm1lcyByZWdpc3RlciBvZmZzZXRzCisgKi8KKyNkZWZpbmUJCUhFUk1FU19DTUQJCQkoMHgwMCkKKyNkZWZpbmUJCUhFUk1FU19QQVJBTTAJCQkoMHgwMikKKyNkZWZpbmUJCUhFUk1FU19QQVJBTTEJCQkoMHgwNCkKKyNkZWZpbmUJCUhFUk1FU19QQVJBTTIJCQkoMHgwNikKKyNkZWZpbmUJCUhFUk1FU19TVEFUVVMJCQkoMHgwOCkKKyNkZWZpbmUJCUhFUk1FU19SRVNQMAkJCSgweDBBKQorI2RlZmluZQkJSEVSTUVTX1JFU1AxCQkJKDB4MEMpCisjZGVmaW5lCQlIRVJNRVNfUkVTUDIJCQkoMHgwRSkKKyNkZWZpbmUJCUhFUk1FU19JTkZPRklECQkJKDB4MTApCisjZGVmaW5lCQlIRVJNRVNfUlhGSUQJCQkoMHgyMCkKKyNkZWZpbmUJCUhFUk1FU19BTExPQ0ZJRAkJCSgweDIyKQorI2RlZmluZQkJSEVSTUVTX1RYQ09NUExGSUQJCSgweDI0KQorI2RlZmluZQkJSEVSTUVTX1NFTEVDVDAJCQkoMHgxOCkKKyNkZWZpbmUJCUhFUk1FU19PRkZTRVQwCQkJKDB4MUMpCisjZGVmaW5lCQlIRVJNRVNfREFUQTAJCQkoMHgzNikKKyNkZWZpbmUJCUhFUk1FU19TRUxFQ1QxCQkJKDB4MUEpCisjZGVmaW5lCQlIRVJNRVNfT0ZGU0VUMQkJCSgweDFFKQorI2RlZmluZQkJSEVSTUVTX0RBVEExCQkJKDB4MzgpCisjZGVmaW5lCQlIRVJNRVNfRVZTVEFUCQkJKDB4MzApCisjZGVmaW5lCQlIRVJNRVNfSU5URU4JCQkoMHgzMikKKyNkZWZpbmUJCUhFUk1FU19FVkFDSwkJCSgweDM0KQorI2RlZmluZQkJSEVSTUVTX0NPTlRST0wJCQkoMHgxNCkKKyNkZWZpbmUJCUhFUk1FU19TV1NVUFBPUlQwCQkoMHgyOCkKKyNkZWZpbmUJCUhFUk1FU19TV1NVUFBPUlQxCQkoMHgyQSkKKyNkZWZpbmUJCUhFUk1FU19TV1NVUFBPUlQyCQkoMHgyQykKKyNkZWZpbmUJCUhFUk1FU19BVVhQQUdFCQkJKDB4M0EpCisjZGVmaW5lCQlIRVJNRVNfQVVYT0ZGU0VUCQkoMHgzQykKKyNkZWZpbmUJCUhFUk1FU19BVVhEQVRBCQkJKDB4M0UpCisKKy8qCisgKiBDTUQgcmVnaXN0ZXIgYml0bWFza3MKKyAqLworI2RlZmluZQkJSEVSTUVTX0NNRF9CVVNZCQkJKDB4ODAwMCkKKyNkZWZpbmUJCUhFUk1FU19DTURfQUlORk8JCSgweDdmMDApCisjZGVmaW5lCQlIRVJNRVNfQ01EX01BQ1BPUlQJCSgweDA3MDApCisjZGVmaW5lCQlIRVJNRVNfQ01EX1JFQ0wJCQkoMHgwMTAwKQorI2RlZmluZQkJSEVSTUVTX0NNRF9XUklURQkJKDB4MDEwMCkKKyNkZWZpbmUJCUhFUk1FU19DTURfUFJPR01PREUJCSgweDAzMDApCisjZGVmaW5lCQlIRVJNRVNfQ01EX0NNRENPREUJCSgweDAwM2YpCisKKy8qCisgKiBTVEFUVVMgcmVnaXN0ZXIgYml0bWFza3MKKyAqLworI2RlZmluZQkJSEVSTUVTX1NUQVRVU19SRVNVTFQJCSgweDdmMDApCisjZGVmaW5lCQlIRVJNRVNfU1RBVFVTX0NNRENPREUJCSgweDAwM2YpCisKKy8qCisgKiBPRkZTRVQgcmVnaXN0ZXIgYml0bWFza3MKKyAqLworI2RlZmluZQkJSEVSTUVTX09GRlNFVF9CVVNZCQkoMHg4MDAwKQorI2RlZmluZQkJSEVSTUVTX09GRlNFVF9FUlIJCSgweDQwMDApCisjZGVmaW5lCQlIRVJNRVNfT0ZGU0VUX0RBVEFPRkYJCSgweDBmZmUpCisKKy8qCisgKiBFdmVudCByZWdpc3RlciBiaXRtYXNrcyAoSU5URU4sIEVWU1RBVCwgRVZBQ0spCisgKi8KKyNkZWZpbmUJCUhFUk1FU19FVl9USUNLCQkJKDB4ODAwMCkKKyNkZWZpbmUJCUhFUk1FU19FVl9XVEVSUgkJCSgweDQwMDApCisjZGVmaW5lCQlIRVJNRVNfRVZfSU5GRFJPUAkJKDB4MjAwMCkKKyNkZWZpbmUJCUhFUk1FU19FVl9JTkZPCQkJKDB4MDA4MCkKKyNkZWZpbmUJCUhFUk1FU19FVl9EVElNCQkJKDB4MDAyMCkKKyNkZWZpbmUJCUhFUk1FU19FVl9DTUQJCQkoMHgwMDEwKQorI2RlZmluZQkJSEVSTUVTX0VWX0FMTE9DCQkJKDB4MDAwOCkKKyNkZWZpbmUJCUhFUk1FU19FVl9UWEVYQwkJCSgweDAwMDQpCisjZGVmaW5lCQlIRVJNRVNfRVZfVFgJCQkoMHgwMDAyKQorI2RlZmluZQkJSEVSTUVTX0VWX1JYCQkJKDB4MDAwMSkKKworLyoKKyAqIENvbW1hbmQgY29kZXMKKyAqLworLyotLS0gQ29udHJvbGxlciBDb21tYW5kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUJCUhFUk1FU19DTURfSU5JVAkJCSgweDAwMDApCisjZGVmaW5lCQlIRVJNRVNfQ01EX0VOQUJMRQkJKDB4MDAwMSkKKyNkZWZpbmUJCUhFUk1FU19DTURfRElTQUJMRQkJKDB4MDAwMikKKyNkZWZpbmUJCUhFUk1FU19DTURfRElBRwkJCSgweDAwMDMpCisKKy8qLS0tIEJ1ZmZlciBNZ210IENvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRVJNRVNfQ01EX0FMTE9DCQkoMHgwMDBBKQorI2RlZmluZQkJSEVSTUVTX0NNRF9UWAkJCSgweDAwMEIpCisKKy8qLS0tIFJlZ3VsYXRlIENvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRVJNRVNfQ01EX05PVElGWQkJKDB4MDAxMCkKKyNkZWZpbmUJCUhFUk1FU19DTURfSU5RVUlSRQkJKDB4MDAxMSkKKworLyotLS0gQ29uZmlndXJlIENvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUJCUhFUk1FU19DTURfQUNDRVNTCQkoMHgwMDIxKQorI2RlZmluZQkJSEVSTUVTX0NNRF9ET1dOTEQJCSgweDAwMjIpCisKKy8qLS0tIFNlcmlhbCBJL08gQ29tbWFuZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQlIRVJNRVNfQ01EX1JFQURNSUYJCSgweDAwMzApCisjZGVmaW5lCQlIRVJNRVNfQ01EX1dSSVRFTUlGCQkoMHgwMDMxKQorCisvKi0tLSBEZWJ1Z2dpbmcgQ29tbWFuZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSAJSEVSTUVTX0NNRF9URVNUCQkJKDB4MDAzOCkKKworCisvKiBUZXN0IGNvbW1hbmQgYXJndW1lbnRzICovCisjZGVmaW5lCQlIRVJNRVNfVEVTVF9TRVRfQ0hBTk5FTAkJMHgwODAwCisjZGVmaW5lCQlIRVJNRVNfVEVTVF9NT05JVE9SCQkweDBiMDAKKyNkZWZpbmUJCUhFUk1FU19URVNUX1NUT1AJCTB4MGYwMAorCisvKiBBdXRoZW50aWNhdGlvbiBhbGdvcml0aG1zICovCisjZGVmaW5lCQlIRVJNRVNfQVVUSF9PUEVOCQkxCisjZGVmaW5lCQlIRVJNRVNfQVVUSF9TSEFSRURfS0VZCQkyCisKKy8qIFdFUCBzZXR0aW5ncyAqLworI2RlZmluZQkJSEVSTUVTX1dFUF9QUklWQUNZX0lOVk9LRUQJMHgwMDAxCisjZGVmaW5lCQlIRVJNRVNfV0VQX0VYQ0xfVU5FTkNSWVBURUQJMHgwMDAyCisjZGVmaW5lCQlIRVJNRVNfV0VQX0hPU1RfRU5DUllQVAkJMHgwMDEwCisjZGVmaW5lCQlIRVJNRVNfV0VQX0hPU1RfREVDUllQVAkJMHgwMDgwCisKKy8qIFN5bWJvbCBob3N0c2NhbiBvcHRpb25zICovCisjZGVmaW5lCQlIRVJNRVNfSE9TVFNDQU5fU1lNQk9MXzVTRUMJMHgwMDAxCisjZGVmaW5lCQlIRVJNRVNfSE9TVFNDQU5fU1lNQk9MX09OQ0UJMHgwMDAyCisjZGVmaW5lCQlIRVJNRVNfSE9TVFNDQU5fU1lNQk9MX1BBU1NJVkUJMHgwMDQwCisjZGVmaW5lCQlIRVJNRVNfSE9TVFNDQU5fU1lNQk9MX0JDQVNUCTB4MDA4MAorCisvKgorICogRnJhbWUgc3RydWN0dXJlcyBhbmQgY29uc3RhbnRzCisgKi8KKworI2RlZmluZSBIRVJNRVNfREVTQ1JJUFRPUl9PRkZTRVQJMAorI2RlZmluZSBIRVJNRVNfODAyXzExX09GRlNFVAkJKDE0KQorI2RlZmluZSBIRVJNRVNfODAyXzNfT0ZGU0VUCQkoMTQrMzIpCisjZGVmaW5lIEhFUk1FU184MDJfMl9PRkZTRVQJCSgxNCszMisxNCkKKworI2RlZmluZSBIRVJNRVNfUlhTVEFUX0VSUgkJKDB4MDAwMykKKyNkZWZpbmUJSEVSTUVTX1JYU1RBVF9CQURDUkMJCSgweDAwMDEpCisjZGVmaW5lCUhFUk1FU19SWFNUQVRfVU5ERUNSWVBUQUJMRQkoMHgwMDAyKQorI2RlZmluZQlIRVJNRVNfUlhTVEFUX01BQ1BPUlQJCSgweDA3MDApCisjZGVmaW5lIEhFUk1FU19SWFNUQVRfUENGCQkoMHgxMDAwKQkvKiBGcmFtZSB3YXMgcmVjZWl2ZWQgaW4gQ0YgcGVyaW9kICovCisjZGVmaW5lCUhFUk1FU19SWFNUQVRfTVNHVFlQRQkJKDB4RTAwMCkKKyNkZWZpbmUJSEVSTUVTX1JYU1RBVF8xMDQyCQkoMHgyMDAwKQkvKiBSRkMtMTA0MiBmcmFtZSAqLworI2RlZmluZQlIRVJNRVNfUlhTVEFUX1RVTk5FTAkJKDB4NDAwMCkJLyogYnJpZGdlLXR1bm5lbCBlbmNvZGVkIGZyYW1lICovCisjZGVmaW5lCUhFUk1FU19SWFNUQVRfV01QCQkoMHg2MDAwKQkvKiBXYXZlbGFuLUlJIE1hbmFnZW1lbnQgUHJvdG9jb2wgZnJhbWUgKi8KKworc3RydWN0IGhlcm1lc190eF9kZXNjcmlwdG9yIHsKKwl1MTYgc3RhdHVzOworCXUxNiByZXNlcnZlZDE7CisJdTE2IHJlc2VydmVkMjsKKwl1MzIgc3dfc3VwcG9ydDsKKwl1OCByZXRyeV9jb3VudDsKKwl1OCB0eF9yYXRlOworCXUxNiB0eF9jb250cm9sOwkKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIEhFUk1FU19UWFNUQVRfUkVUUllFUlIJCSgweDAwMDEpCisjZGVmaW5lIEhFUk1FU19UWFNUQVRfQUdFREVSUgkJKDB4MDAwMikKKyNkZWZpbmUgSEVSTUVTX1RYU1RBVF9ESVNDT04JCSgweDAwMDQpCisjZGVmaW5lIEhFUk1FU19UWFNUQVRfRk9STUVSUgkJKDB4MDAwOCkKKworI2RlZmluZSBIRVJNRVNfVFhDVFJMX1RYX09LCQkoMHgwMDAyKQkvKiA/PyBpbnRlcnJ1cHQgb24gVHggY29tcGxldGUgKi8KKyNkZWZpbmUgSEVSTUVTX1RYQ1RSTF9UWF9FWAkJKDB4MDAwNCkJLyogPz8gaW50ZXJydXB0IG9uIFR4IGV4Y2VwdGlvbiAqLworI2RlZmluZSBIRVJNRVNfVFhDVFJMXzgwMl8xMQkJKDB4MDAwOCkJLyogV2Ugc3VwcGx5IDgwMi4xMSBoZWFkZXIgKi8KKyNkZWZpbmUgSEVSTUVTX1RYQ1RSTF9BTFRfUlRSWQkJKDB4MDAyMCkKKworLyogSW5xdWlyeSBjb25zdGFudHMgYW5kIGRhdGEgdHlwZXMgKi8KKworI2RlZmluZSBIRVJNRVNfSU5RX1RBTExJRVMJCSgweEYxMDApCisjZGVmaW5lIEhFUk1FU19JTlFfU0NBTgkJCSgweEYxMDEpCisjZGVmaW5lIEhFUk1FU19JTlFfQ0hBTk5FTElORk8JCSgweEYxMDIpCisjZGVmaW5lIEhFUk1FU19JTlFfSE9TVFNDQU4JCSgweEYxMDMpCisjZGVmaW5lIEhFUk1FU19JTlFfSE9TVFNDQU5fU1lNQk9MCSgweEYxMDQpCisjZGVmaW5lIEhFUk1FU19JTlFfTElOS1NUQVRVUwkJKDB4RjIwMCkKKyNkZWZpbmUgSEVSTUVTX0lOUV9TRUNfU1RBVF9BR0VSRQkoMHhGMjAyKQorCitzdHJ1Y3QgaGVybWVzX3RhbGxpZXNfZnJhbWUgeworCXUxNiBUeFVuaWNhc3RGcmFtZXM7CisJdTE2IFR4TXVsdGljYXN0RnJhbWVzOworCXUxNiBUeEZyYWdtZW50czsKKwl1MTYgVHhVbmljYXN0T2N0ZXRzOworCXUxNiBUeE11bHRpY2FzdE9jdGV0czsKKwl1MTYgVHhEZWZlcnJlZFRyYW5zbWlzc2lvbnM7CisJdTE2IFR4U2luZ2xlUmV0cnlGcmFtZXM7CisJdTE2IFR4TXVsdGlwbGVSZXRyeUZyYW1lczsKKwl1MTYgVHhSZXRyeUxpbWl0RXhjZWVkZWQ7CisJdTE2IFR4RGlzY2FyZHM7CisJdTE2IFJ4VW5pY2FzdEZyYW1lczsKKwl1MTYgUnhNdWx0aWNhc3RGcmFtZXM7CisJdTE2IFJ4RnJhZ21lbnRzOworCXUxNiBSeFVuaWNhc3RPY3RldHM7CisJdTE2IFJ4TXVsdGljYXN0T2N0ZXRzOworCXUxNiBSeEZDU0Vycm9yczsKKwl1MTYgUnhEaXNjYXJkc19Ob0J1ZmZlcjsKKwl1MTYgVHhEaXNjYXJkc1dyb25nU0E7CisJdTE2IFJ4V0VQVW5kZWNyeXB0YWJsZTsKKwl1MTYgUnhNc2dJbk1zZ0ZyYWdtZW50czsKKwl1MTYgUnhNc2dJbkJhZE1zZ0ZyYWdtZW50czsKKwkvKiBUaG9zZSBsYXN0IGFyZSBwcm9iYWJseSBub3QgYXZhaWxhYmxlIGluIHZlcnkgb2xkIGZpcm13YXJlcyAqLworCXUxNiBSeERpc2NhcmRzX1dFUElDVkVycm9yOworCXUxNiBSeERpc2NhcmRzX1dFUEV4Y2x1ZGVkOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEdyYWJiZWQgZnJvbSB3bGFuLW5nIC0gVGhhbmtzIE1hcmsuLi4gLSBKZWFuIElJCisgKiBUaGlzIGlzIHRoZSByZXN1bHQgb2YgYSBzY2FuIGlucXVpcnkgY29tbWFuZCAqLworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgaW5mbyBhYm91dCBhbiBBY2Nlc3MgUG9pbnQgKi8KK3N0cnVjdCBwcmlzbTJfc2Nhbl9hcGluZm8geworCXUxNiBjaGFubmVsOwkJLyogQ2hhbm5lbCB3aGVyZSB0aGUgQVAgc2l0cyAqLworCXUxNiBub2lzZTsJCS8qIE5vaXNlIGxldmVsICovCisJdTE2IGxldmVsOwkJLyogU2lnbmFsIGxldmVsICovCisJdTggYnNzaWRbRVRIX0FMRU5dOwkvKiBNQUMgYWRkcmVzcyBvZiB0aGUgQWNjZXNzIFBvaW50ICovCisJdTE2IGJlYWNvbl9pbnRlcnY7CS8qIEJlYWNvbiBpbnRlcnZhbCAqLworCXUxNiBjYXBhYmlsaXRpZXM7CS8qIENhcGFiaWxpdGllcyAqLworCXUxNiBlc3NpZF9sZW47CQkvKiBFU1NJRCBsZW5ndGggKi8KKwl1OCBlc3NpZFszMl07CQkvKiBFU1NJRCBvZiB0aGUgbmV0d29yayAqLworCXU4IHJhdGVzWzEwXTsJCS8qIEJpdCByYXRlIHN1cHBvcnRlZCAqLworCXUxNiBwcm9iZXJlc3BfcmF0ZTsJLyogRGF0YSByYXRlIG9mIHRoZSByZXNwb25zZSBmcmFtZSAqLworCXUxNiBhdGltOwkJLyogQVRJTSB3aW5kb3cgdGltZSwgS3VzIChob3N0c2NhbiBvbmx5KSAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFNhbWUgc3R1ZmYgZm9yIHRoZSBMdWNlbnQvQWdlcmUgY2FyZC4KKyAqIFRoYW5rcyB0byBoMWthcmkgPGgxa2FyaSBBVCBkYWNoYjBkZW4uY29tPiAtIEplYW4gSUkgKi8KK3N0cnVjdCBhZ2VyZV9zY2FuX2FwaW5mbyB7CisJdTE2IGNoYW5uZWw7CQkvKiBDaGFubmVsIHdoZXJlIHRoZSBBUCBzaXRzICovCisJdTE2IG5vaXNlOwkJLyogTm9pc2UgbGV2ZWwgKi8KKwl1MTYgbGV2ZWw7CQkvKiBTaWduYWwgbGV2ZWwgKi8KKwl1OCBic3NpZFtFVEhfQUxFTl07CS8qIE1BQyBhZGRyZXNzIG9mIHRoZSBBY2Nlc3MgUG9pbnQgKi8KKwl1MTYgYmVhY29uX2ludGVydjsJLyogQmVhY29uIGludGVydmFsICovCisJdTE2IGNhcGFiaWxpdGllczsJLyogQ2FwYWJpbGl0aWVzICovCisJLyogYml0czogMC1lc3MsIDEtaWJzcywgNC1wcml2YWN5IFt3ZXBdICovCisJdTE2IGVzc2lkX2xlbjsJCS8qIEVTU0lEIGxlbmd0aCAqLworCXU4IGVzc2lkWzMyXTsJCS8qIEVTU0lEIG9mIHRoZSBuZXR3b3JrICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogTW91c3RhZmE6IFNjYW4gc3RydWN0dXJlIGZvciBTeW1ib2wgY2FyZHMgKi8KK3N0cnVjdCBzeW1ib2xfc2Nhbl9hcGluZm8geworCXU4IGNoYW5uZWw7CQkvKiBDaGFubmVsIHdoZXJlIHRoZSBBUCBzaXRzICovCisJdTggdW5rbm93bjE7CQkvKiA4IGluIDIuOXggYW5kIDMuOXggZi93LCAwIG90aGVyd2lzZSAqLworCXUxNiBub2lzZTsJCS8qIE5vaXNlIGxldmVsICovCisJdTE2IGxldmVsOwkJLyogU2lnbmFsIGxldmVsICovCisJdTggYnNzaWRbRVRIX0FMRU5dOwkvKiBNQUMgYWRkcmVzcyBvZiB0aGUgQWNjZXNzIFBvaW50ICovCisJdTE2IGJlYWNvbl9pbnRlcnY7CS8qIEJlYWNvbiBpbnRlcnZhbCAqLworCXUxNiBjYXBhYmlsaXRpZXM7CS8qIENhcGFiaWxpdGllcyAqLworCS8qIGJpdHM6IDAtZXNzLCAxLWlic3MsIDQtcHJpdmFjeSBbd2VwXSAqLworCXUxNiBlc3NpZF9sZW47CQkvKiBFU1NJRCBsZW5ndGggKi8KKwl1OCBlc3NpZFszMl07CQkvKiBFU1NJRCBvZiB0aGUgbmV0d29yayAqLworICAgIAl1MTYgcmF0ZXNbNV07CQkvKiBCaXQgcmF0ZSBzdXBwb3J0ZWQgKi8KKwl1MTYgYmFzaWNfcmF0ZXM7CS8qIEJhc2ljIHJhdGVzIGJpdG1hc2sgKi8KKwl1OCB1bmtub3duMls2XTsJCS8qIEFsd2F5cyBGRjpGRjpGRjpGRjowMDowMCAqLworCXU4IHVua25vd24zWzhdOwkJLyogQWx3YXlzIDAsIGFwcGVhcmVkIGluIGYvdyAzLjkxLTY4ICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwordW5pb24gaGVybWVzX3NjYW5faW5mbyB7CisJc3RydWN0IGFnZXJlX3NjYW5fYXBpbmZvCWE7CisJc3RydWN0IHByaXNtMl9zY2FuX2FwaW5mbwlwOworCXN0cnVjdCBzeW1ib2xfc2Nhbl9hcGluZm8JczsKK307CisKKyNkZWZpbmUgSEVSTUVTX0xJTktTVEFUVVNfTk9UX0NPTk5FQ1RFRCAgICgweDAwMDApICAKKyNkZWZpbmUgSEVSTUVTX0xJTktTVEFUVVNfQ09OTkVDVEVEICAgICAgICgweDAwMDEpCisjZGVmaW5lIEhFUk1FU19MSU5LU1RBVFVTX0RJU0NPTk5FQ1RFRCAgICAoMHgwMDAyKQorI2RlZmluZSBIRVJNRVNfTElOS1NUQVRVU19BUF9DSEFOR0UgICAgICAgKDB4MDAwMykKKyNkZWZpbmUgSEVSTUVTX0xJTktTVEFUVVNfQVBfT1VUX09GX1JBTkdFICgweDAwMDQpCisjZGVmaW5lIEhFUk1FU19MSU5LU1RBVFVTX0FQX0lOX1JBTkdFICAgICAoMHgwMDA1KQorI2RlZmluZSBIRVJNRVNfTElOS1NUQVRVU19BU1NPQ19GQUlMRUQgICAgKDB4MDAwNikKKyAgCitzdHJ1Y3QgaGVybWVzX2xpbmtzdGF0dXMgeworCXUxNiBsaW5rc3RhdHVzOyAgICAgICAgIC8qIExpbmsgc3RhdHVzICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGhlcm1lc19yZXNwb25zZSB7CisJdTE2IHN0YXR1cywgcmVzcDAsIHJlc3AxLCByZXNwMjsKK307CisKKy8qICJJRCIgc3RydWN0dXJlIC0gdXNlZCBmb3IgRVNTSUQgYW5kIHN0YXRpb24gbmlja25hbWUgKi8KK3N0cnVjdCBoZXJtZXNfaWRzdHJpbmcgeworCXUxNiBsZW47CisJdTE2IHZhbFsxNl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGhlcm1lc19tdWx0aWNhc3QgeworCXU4IGFkZHJbSEVSTUVTX01BWF9NVUxUSUNBU1RdW0VUSF9BTEVOXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvLyAjZGVmaW5lIEhFUk1FU19ERUJVR19CVUZGRVIgMQorI2RlZmluZSBIRVJNRVNfREVCVUdfQlVGU0laRSA0MDk2CitzdHJ1Y3QgaGVybWVzX2RlYnVnX2VudHJ5IHsKKwlpbnQgYmFwOworCXUxNiBpZCwgb2Zmc2V0OworCWludCBjeWNsZXM7Cit9OworCisjaWZkZWYgX19LRVJORUxfXworCisvKiBUaW1lb3V0cyAqLworI2RlZmluZSBIRVJNRVNfQkFQX0JVU1lfVElNRU9VVCAoMTAwMDApIC8qIEluIGl0ZXJhdGlvbnMgb2YgfjF1cyAqLworCisvKiBCYXNpYyBjb250cm9sIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgaGVybWVzIHsKKwl2b2lkIF9faW9tZW0gKmlvYmFzZTsKKwlpbnQgcmVnX3NwYWNpbmc7CisjZGVmaW5lIEhFUk1FU18xNkJJVF9SRUdTUEFDSU5HCTAKKyNkZWZpbmUgSEVSTUVTXzMyQklUX1JFR1NQQUNJTkcJMQorCisJdTE2IGludGVuOyAvKiBXaGljaCBpbnRlcnJ1cHRzIHNob3VsZCBiZSBlbmFibGVkPyAqLworCisjaWZkZWYgSEVSTUVTX0RFQlVHX0JVRkZFUgorCXN0cnVjdCBoZXJtZXNfZGVidWdfZW50cnkgZGJ1ZltIRVJNRVNfREVCVUdfQlVGU0laRV07CisJdW5zaWduZWQgbG9uZyBkYnVmcDsKKwl1bnNpZ25lZCBsb25nIHByb2ZpbGVbSEVSTUVTX0JBUF9CVVNZX1RJTUVPVVQrMV07CisjZW5kaWYKK30gaGVybWVzX3Q7CisKKy8qIFJlZ2lzdGVyIGFjY2VzcyBjb252ZW5pZW5jZSBtYWNyb3MgKi8KKyNkZWZpbmUgaGVybWVzX3JlYWRfcmVnKGh3LCBvZmYpIFwKKwkoaW9yZWFkMTYoKGh3KS0+aW9iYXNlICsgKCAob2ZmKSA8PCAoaHcpLT5yZWdfc3BhY2luZyApKSkKKyNkZWZpbmUgaGVybWVzX3dyaXRlX3JlZyhodywgb2ZmLCB2YWwpIFwKKwkoaW93cml0ZTE2KCh2YWwpLCAoaHcpLT5pb2Jhc2UgKyAoKG9mZikgPDwgKGh3KS0+cmVnX3NwYWNpbmcpKSkKKyNkZWZpbmUgaGVybWVzX3JlYWRfcmVnbihodywgbmFtZSkgaGVybWVzX3JlYWRfcmVnKChodyksIEhFUk1FU18jI25hbWUpCisjZGVmaW5lIGhlcm1lc193cml0ZV9yZWduKGh3LCBuYW1lLCB2YWwpIGhlcm1lc193cml0ZV9yZWcoKGh3KSwgSEVSTUVTXyMjbmFtZSwgKHZhbCkpCisKKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK3ZvaWQgaGVybWVzX3N0cnVjdF9pbml0KGhlcm1lc190ICpodywgdm9pZCBfX2lvbWVtICphZGRyZXNzLCBpbnQgcmVnX3NwYWNpbmcpOworaW50IGhlcm1lc19pbml0KGhlcm1lc190ICpodyk7CitpbnQgaGVybWVzX2RvY21kX3dhaXQoaGVybWVzX3QgKmh3LCB1MTYgY21kLCB1MTYgcGFybTAsCisJCSAgICAgIHN0cnVjdCBoZXJtZXNfcmVzcG9uc2UgKnJlc3ApOworaW50IGhlcm1lc19hbGxvY2F0ZShoZXJtZXNfdCAqaHcsIHUxNiBzaXplLCB1MTYgKmZpZCk7CisKK2ludCBoZXJtZXNfYmFwX3ByZWFkKGhlcm1lc190ICpodywgaW50IGJhcCwgdm9pZCAqYnVmLCB1bnNpZ25lZCBsZW4sCisJCSAgICAgICB1MTYgaWQsIHUxNiBvZmZzZXQpOworaW50IGhlcm1lc19iYXBfcHdyaXRlKGhlcm1lc190ICpodywgaW50IGJhcCwgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsZW4sCisJCQl1MTYgaWQsIHUxNiBvZmZzZXQpOworaW50IGhlcm1lc19yZWFkX2x0dihoZXJtZXNfdCAqaHcsIGludCBiYXAsIHUxNiByaWQsIHVuc2lnbmVkIGJ1ZmxlbiwKKwkJICAgIHUxNiAqbGVuZ3RoLCB2b2lkICpidWYpOworaW50IGhlcm1lc193cml0ZV9sdHYoaGVybWVzX3QgKmh3LCBpbnQgYmFwLCB1MTYgcmlkLAorCQkgICAgICB1MTYgbGVuZ3RoLCBjb25zdCB2b2lkICp2YWx1ZSk7CisKKy8qIElubGluZSBmdW5jdGlvbnMgKi8KKworc3RhdGljIGlubGluZSBpbnQgaGVybWVzX3ByZXNlbnQoaGVybWVzX3QgKmh3KQoreworCXJldHVybiBoZXJtZXNfcmVhZF9yZWduKGh3LCBTV1NVUFBPUlQwKSA9PSBIRVJNRVNfTUFHSUM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZXJtZXNfc2V0X2lycW1hc2soaGVybWVzX3QgKmh3LCB1MTYgZXZlbnRzKQoreworCWh3LT5pbnRlbiA9IGV2ZW50czsKKwloZXJtZXNfd3JpdGVfcmVnbihodywgSU5URU4sIGV2ZW50cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhlcm1lc19lbmFibGVfcG9ydChoZXJtZXNfdCAqaHcsIGludCBwb3J0KQoreworCXJldHVybiBoZXJtZXNfZG9jbWRfd2FpdChodywgSEVSTUVTX0NNRF9FTkFCTEUgfCAocG9ydCA8PCA4KSwKKwkJCQkgMCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhlcm1lc19kaXNhYmxlX3BvcnQoaGVybWVzX3QgKmh3LCBpbnQgcG9ydCkKK3sKKwlyZXR1cm4gaGVybWVzX2RvY21kX3dhaXQoaHcsIEhFUk1FU19DTURfRElTQUJMRSB8IChwb3J0IDw8IDgpLCAKKwkJCQkgMCwgTlVMTCk7Cit9CisKKy8qIEluaXRpYXRlIGFuIElOUVVJUkUgY29tbWFuZCAodGFsbGllcyBvciBzY2FuKS4gIFRoZSByZXN1bHQgd2lsbCBjb21lIGFzIGFuCisgKiBpbmZvcm1hdGlvbiBmcmFtZSBpbiBfX29yaW5vY29fZXZfaW5mbygpICovCitzdGF0aWMgaW5saW5lIGludCBoZXJtZXNfaW5xdWlyZShoZXJtZXNfdCAqaHcsIHUxNiByaWQpCit7CisJcmV0dXJuIGhlcm1lc19kb2NtZF93YWl0KGh3LCBIRVJNRVNfQ01EX0lOUVVJUkUsIHJpZCwgTlVMTCk7Cit9CisKKyNkZWZpbmUgSEVSTUVTX0JZVEVTX1RPX1JFQ0xFTihuKSAoICgoKG4pKzEpLzIpICsgMSApCisjZGVmaW5lIEhFUk1FU19SRUNMRU5fVE9fQllURVMobikgKCAoKG4pLTEpICogMiApCisKKy8qIE5vdGUgdGhhdCBmb3IgdGhlIG5leHQgdHdvLCB0aGUgY291bnQgaXMgaW4gMTYtYml0IHdvcmRzLCBub3QgYnl0ZXMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoZXJtZXNfcmVhZF93b3JkcyhzdHJ1Y3QgaGVybWVzICpodywgaW50IG9mZiwgdm9pZCAqYnVmLCB1bnNpZ25lZCBjb3VudCkKK3sKKwlvZmYgPSBvZmYgPDwgaHctPnJlZ19zcGFjaW5nOworCWlvcmVhZDE2X3JlcChody0+aW9iYXNlICsgb2ZmLCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhlcm1lc193cml0ZV93b3JkcyhzdHJ1Y3QgaGVybWVzICpodywgaW50IG9mZiwgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBjb3VudCkKK3sKKwlvZmYgPSBvZmYgPDwgaHctPnJlZ19zcGFjaW5nOworCWlvd3JpdGUxNl9yZXAoaHctPmlvYmFzZSArIG9mZiwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZXJtZXNfY2xlYXJfd29yZHMoc3RydWN0IGhlcm1lcyAqaHcsIGludCBvZmYsIHVuc2lnbmVkIGNvdW50KQoreworCXVuc2lnbmVkIGk7CisKKwlvZmYgPSBvZmYgPDwgaHctPnJlZ19zcGFjaW5nOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCWlvd3JpdGUxNigwLCBody0+aW9iYXNlICsgb2ZmKTsKK30KKworI2RlZmluZSBIRVJNRVNfUkVBRF9SRUNPUkQoaHcsIGJhcCwgcmlkLCBidWYpIFwKKwkoaGVybWVzX3JlYWRfbHR2KChodyksKGJhcCksKHJpZCksIHNpemVvZigqYnVmKSwgTlVMTCwgKGJ1ZikpKQorI2RlZmluZSBIRVJNRVNfV1JJVEVfUkVDT1JEKGh3LCBiYXAsIHJpZCwgYnVmKSBcCisJKGhlcm1lc193cml0ZV9sdHYoKGh3KSwoYmFwKSwocmlkKSxIRVJNRVNfQllURVNfVE9fUkVDTEVOKHNpemVvZigqYnVmKSksKGJ1ZikpKQorCitzdGF0aWMgaW5saW5lIGludCBoZXJtZXNfcmVhZF93b3JkcmVjKGhlcm1lc190ICpodywgaW50IGJhcCwgdTE2IHJpZCwgdTE2ICp3b3JkKQoreworCXUxNiByZWM7CisJaW50IGVycjsKKworCWVyciA9IEhFUk1FU19SRUFEX1JFQ09SRChodywgYmFwLCByaWQsICZyZWMpOworCSp3b3JkID0gbGUxNl90b19jcHUocmVjKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIGludCBoZXJtZXNfd3JpdGVfd29yZHJlYyhoZXJtZXNfdCAqaHcsIGludCBiYXAsIHUxNiByaWQsIHUxNiB3b3JkKQoreworCXUxNiByZWMgPSBjcHVfdG9fbGUxNih3b3JkKTsKKwlyZXR1cm4gSEVSTUVTX1dSSVRFX1JFQ09SRChodywgYmFwLCByaWQsICZyZWMpOworfQorCisjZWxzZSAvKiAhIF9fS0VSTkVMX18gKi8KKworLyogVGhlc2UgYXJlIHByb3ZpZGVkIGZvciB0aGUgYmVuZWZpdCBvZiB1c2Vyc3BhY2UgZHJpdmVycyBhbmQgdGVzdGluZyBwcm9ncmFtcworICAgd2hpY2ggdXNlIGlvcGVybSgpIG9yIGlvcGwoKSAqLworCisjZGVmaW5lIGhlcm1lc19yZWFkX3JlZyhiYXNlLCBvZmYpIChpbncoKGJhc2UpICsgKG9mZikpKQorI2RlZmluZSBoZXJtZXNfd3JpdGVfcmVnKGJhc2UsIG9mZiwgdmFsKSAob3V0dygodmFsKSwgKGJhc2UpICsgKG9mZikpKQorCisjZGVmaW5lIGhlcm1lc19yZWFkX3JlZ24oYmFzZSwgbmFtZSkgKGhlcm1lc19yZWFkX3JlZygoYmFzZSksIEhFUk1FU18jI25hbWUpKQorI2RlZmluZSBoZXJtZXNfd3JpdGVfcmVnbihiYXNlLCBuYW1lLCB2YWwpIChoZXJtZXNfd3JpdGVfcmVnKChiYXNlKSwgSEVSTUVTXyMjbmFtZSwgKHZhbCkpKQorCisvKiBOb3RlIHRoYXQgZm9yIHRoZSBuZXh0IHR3bywgdGhlIGNvdW50IGlzIGluIDE2LWJpdCB3b3Jkcywgbm90IGJ5dGVzICovCisjZGVmaW5lIGhlcm1lc19yZWFkX2RhdGEoYmFzZSwgb2ZmLCBidWYsIGNvdW50KSAoaW5zdygoYmFzZSkgKyAob2ZmKSwgKGJ1ZiksIChjb3VudCkpKQorI2RlZmluZSBoZXJtZXNfd3JpdGVfZGF0YShiYXNlLCBvZmYsIGJ1ZiwgY291bnQpIChvdXRzdygoYmFzZSkgKyAob2ZmKSwgKGJ1ZiksIChjb3VudCkpKQorCisjZW5kaWYgLyogISBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAgLyogX0hFUk1FU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9oZXJtZXNfcmlkLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9oZXJtZXNfcmlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY0NmI0OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hlcm1lc19yaWQuaApAQCAtMCwwICsxLDE0OCBAQAorI2lmbmRlZiBfSEVSTUVTX1JJRF9ICisjZGVmaW5lIF9IRVJNRVNfUklEX0gKKworLyoKKyAqIENvbmZpZ3VyYXRpb24gUklEcworICovCisjZGVmaW5lIEhFUk1FU19SSURfQ05GUE9SVFRZUEUJCQkweEZDMDAKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZPV05NQUNBRERSCQkweEZDMDEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZERVNJUkVEU1NJRAkJMHhGQzAyCisjZGVmaW5lIEhFUk1FU19SSURfQ05GT1dOQ0hBTk5FTAkJMHhGQzAzCisjZGVmaW5lIEhFUk1FU19SSURfQ05GT1dOU1NJRAkJCTB4RkMwNAorI2RlZmluZSBIRVJNRVNfUklEX0NORk9XTkFUSU1XSU5ET1cJCTB4RkMwNQorI2RlZmluZSBIRVJNRVNfUklEX0NORlNZU1RFTVNDQUxFCQkweEZDMDYKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZNQVhEQVRBTEVOCQkweEZDMDcKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZXRFNBRERSRVNTCQkweEZDMDgKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZQTUVOQUJMRUQJCQkweEZDMDkKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZQTUVQUwkJCTB4RkMwQQorI2RlZmluZSBIRVJNRVNfUklEX0NORk1VTFRJQ0FTVFJFQ0VJVkUJCTB4RkMwQgorI2RlZmluZSBIRVJNRVNfUklEX0NORk1BWFNMRUVQRFVSQVRJT04JCTB4RkMwQworI2RlZmluZSBIRVJNRVNfUklEX0NORlBNSE9MRE9WRVJEVVJBVElPTgkweEZDMEQKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZPV05OQU1FCQkJMHhGQzBFCisjZGVmaW5lIEhFUk1FU19SSURfQ05GT1dORFRJTVBFUklPRAkJMHhGQzEwCisjZGVmaW5lIEhFUk1FU19SSURfQ05GV0RTQUREUkVTUzEJCTB4RkMxMQorI2RlZmluZSBIRVJNRVNfUklEX0NORldEU0FERFJFU1MyCQkweEZDMTIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZXRFNBRERSRVNTMwkJMHhGQzEzCisjZGVmaW5lIEhFUk1FU19SSURfQ05GV0RTQUREUkVTUzQJCTB4RkMxNAorI2RlZmluZSBIRVJNRVNfUklEX0NORldEU0FERFJFU1M1CQkweEZDMTUKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZXRFNBRERSRVNTNgkJMHhGQzE2CisjZGVmaW5lIEhFUk1FU19SSURfQ05GTVVMVElDQVNUUE1CVUZGRVJJTkcJMHhGQzE3CisjZGVmaW5lIEhFUk1FU19SSURfQ05GV0VQRU5BQkxFRF9BR0VSRQkJMHhGQzIwCisjZGVmaW5lIEhFUk1FU19SSURfQ05GQVVUSEVOVElDQVRJT05fQUdFUkUJMHhGQzIxCisjZGVmaW5lIEhFUk1FU19SSURfQ05GTUFOREFUT1JZQlNTSURfU1lNQk9MCTB4RkMyMQorI2RlZmluZSBIRVJNRVNfUklEX0NORldFUERFRkFVTFRLRVlJRAkJMHhGQzIzCisjZGVmaW5lIEhFUk1FU19SSURfQ05GREVGQVVMVEtFWTAJCTB4RkMyNAorI2RlZmluZSBIRVJNRVNfUklEX0NORkRFRkFVTFRLRVkxCQkweEZDMjUKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZNV09ST0JVU1RfQUdFUkUJCTB4RkMyNQorI2RlZmluZSBIRVJNRVNfUklEX0NORkRFRkFVTFRLRVkyCQkweEZDMjYKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZERUZBVUxUS0VZMwkJMHhGQzI3CisjZGVmaW5lIEhFUk1FU19SSURfQ05GV0VQRkxBR1NfSU5URVJTSUwJCTB4RkMyOAorI2RlZmluZSBIRVJNRVNfUklEX0NORldFUEtFWU1BUFBJTkdUQUJMRQkweEZDMjkKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZBVVRIRU5USUNBVElPTgkJMHhGQzJBCisjZGVmaW5lIEhFUk1FU19SSURfQ05GTUFYQVNTT0NTVEEJCTB4RkMyQgorI2RlZmluZQlIRVJNRVNfUklEX0NORktFWUxFTkdUSF9TWU1CT0wJCTB4RkMyQgorI2RlZmluZSBIRVJNRVNfUklEX0NORlRYQ09OVFJPTAkJCTB4RkMyQworI2RlZmluZSBIRVJNRVNfUklEX0NORlJPQU1JTkdNT0RFCQkweEZDMkQKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZIT1NUQVVUSEVOVElDQVRJT04JMHhGQzJFCisjZGVmaW5lIEhFUk1FU19SSURfQ05GUkNWQ1JDRVJST1IJCTB4RkMzMAorI2RlZmluZSBIRVJNRVNfUklEX0NORk1NTElGRQkJCTB4RkMzMQorI2RlZmluZSBIRVJNRVNfUklEX0NORkFMVFJFVFJZQ09VTlQJCTB4RkMzMgorI2RlZmluZSBIRVJNRVNfUklEX0NORkJFQUNPTklOVAkJCTB4RkMzMworI2RlZmluZSBIRVJNRVNfUklEX0NORkFQUENGSU5GTwkJCTB4RkMzNAorI2RlZmluZSBIRVJNRVNfUklEX0NORlNUQVBDRklORk8JCTB4RkMzNQorI2RlZmluZSBIRVJNRVNfUklEX0NORlBSSU9SSVRZUVVTQUdFCQkweEZDMzcKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZUSU1DVFJMCQkJMHhGQzQwCisjZGVmaW5lIEhFUk1FU19SSURfQ05GVEhJUlRZMlRBTExZCQkweEZDNDIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZFTkhTRUNVUklUWQkJMHhGQzQzCisjZGVmaW5lIEhFUk1FU19SSURfQ05GR1JPVVBBRERSRVNTRVMJCTB4RkM4MAorI2RlZmluZSBIRVJNRVNfUklEX0NORkNSRUFURUlCU1MJCTB4RkM4MQorI2RlZmluZSBIRVJNRVNfUklEX0NORkZSQUdNRU5UQVRJT05USFJFU0hPTEQJMHhGQzgyCisjZGVmaW5lIEhFUk1FU19SSURfQ05GUlRTVEhSRVNIT0xECQkweEZDODMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZUWFJBVEVDT05UUk9MCQkweEZDODQKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZQUk9NSVNDVU9VU01PREUJCTB4RkM4NQorI2RlZmluZSBIRVJNRVNfUklEX0NORkJBU0lDUkFURVNfU1lNQk9MCQkweEZDOEEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZQUkVBTUJMRV9TWU1CT0wJCTB4RkM4QworI2RlZmluZSBIRVJNRVNfUklEX0NORkZSQUdNRU5UQVRJT05USFJFU0hPTEQwCTB4RkM5MAorI2RlZmluZSBIRVJNRVNfUklEX0NORkZSQUdNRU5UQVRJT05USFJFU0hPTEQxCTB4RkM5MQorI2RlZmluZSBIRVJNRVNfUklEX0NORkZSQUdNRU5UQVRJT05USFJFU0hPTEQyCTB4RkM5MgorI2RlZmluZSBIRVJNRVNfUklEX0NORkZSQUdNRU5UQVRJT05USFJFU0hPTEQzCTB4RkM5MworI2RlZmluZSBIRVJNRVNfUklEX0NORkZSQUdNRU5UQVRJT05USFJFU0hPTEQ0CTB4RkM5NAorI2RlZmluZSBIRVJNRVNfUklEX0NORkZSQUdNRU5UQVRJT05USFJFU0hPTEQ1CTB4RkM5NQorI2RlZmluZSBIRVJNRVNfUklEX0NORkZSQUdNRU5UQVRJT05USFJFU0hPTEQ2CTB4RkM5NgorI2RlZmluZSBIRVJNRVNfUklEX0NORlJUU1RIUkVTSE9MRDAJCTB4RkM5NworI2RlZmluZSBIRVJNRVNfUklEX0NORlJUU1RIUkVTSE9MRDEJCTB4RkM5OAorI2RlZmluZSBIRVJNRVNfUklEX0NORlJUU1RIUkVTSE9MRDIJCTB4RkM5OQorI2RlZmluZSBIRVJNRVNfUklEX0NORlJUU1RIUkVTSE9MRDMJCTB4RkM5QQorI2RlZmluZSBIRVJNRVNfUklEX0NORlJUU1RIUkVTSE9MRDQJCTB4RkM5QgorI2RlZmluZSBIRVJNRVNfUklEX0NORlJUU1RIUkVTSE9MRDUJCTB4RkM5QworI2RlZmluZSBIRVJNRVNfUklEX0NORlJUU1RIUkVTSE9MRDYJCTB4RkM5RAorI2RlZmluZSBIRVJNRVNfUklEX0NORkhPU1RTQ0FOX1NZTUJPTAkJMHhGQ0FCCisjZGVmaW5lIEhFUk1FU19SSURfQ05GU0hPUlRQUkVBTUJMRQkJMHhGQ0IwCisjZGVmaW5lIEhFUk1FU19SSURfQ05GV0VQS0VZU19BR0VSRQkJMHhGQ0IwCisjZGVmaW5lIEhFUk1FU19SSURfQ05GRVhDTFVERUxPTkdQUkVBTUJMRQkweEZDQjEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZUWEtFWV9BR0VSRQkJMHhGQ0IxCisjZGVmaW5lIEhFUk1FU19SSURfQ05GQVVUSEVOVElDQVRJT05SU1BUTwkweEZDQjIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZTQ0FOU1NJRF9BR0VSRQkJMHhGQ0IyCisjZGVmaW5lIEhFUk1FU19SSURfQ05GQkFTSUNSQVRFUwkJMHhGQ0IzCisjZGVmaW5lIEhFUk1FU19SSURfQ05GU1VQUE9SVEVEUkFURVMJCTB4RkNCNAorI2RlZmluZSBIRVJNRVNfUklEX0NORlRJQ0tUSU1FCQkJMHhGQ0UwCisjZGVmaW5lIEhFUk1FU19SSURfQ05GU0NBTlJFUVVFU1QJCTB4RkNFMQorI2RlZmluZSBIRVJNRVNfUklEX0NORkpPSU5SRVFVRVNUCQkweEZDRTIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZBVVRIRU5USUNBVEVTVEFUSU9OCTB4RkNFMworI2RlZmluZSBIRVJNRVNfUklEX0NORkNIQU5ORUxJTkZPUkVRVUVTVAkweEZDRTQKKyNkZWZpbmUgSEVSTUVTX1JJRF9DTkZIT1NUU0NBTgkJCTB4RkNFNQorCisvKgorICogSW5mb3JtYXRpb24gUklEcworICovCisjZGVmaW5lIEhFUk1FU19SSURfTUFYTE9BRFRJTUUJCQkweEZEMDAKKyNkZWZpbmUgSEVSTUVTX1JJRF9ET1dOTE9BREJVRkZFUgkJMHhGRDAxCisjZGVmaW5lIEhFUk1FU19SSURfUFJJSUQJCQkweEZEMDIKKyNkZWZpbmUgSEVSTUVTX1JJRF9QUklTVVBSQU5HRQkJCTB4RkQwMworI2RlZmluZSBIRVJNRVNfUklEX0NGSUFDVFJBTkdFUwkJCTB4RkQwNAorI2RlZmluZSBIRVJNRVNfUklEX05JQ1NFUk5VTQkJCTB4RkQwQQorI2RlZmluZSBIRVJNRVNfUklEX05JQ0lECQkJMHhGRDBCCisjZGVmaW5lIEhFUk1FU19SSURfTUZJU1VQUkFOR0UJCQkweEZEMEMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DRklTVVBSQU5HRQkJCTB4RkQwRAorI2RlZmluZSBIRVJNRVNfUklEX0NIQU5ORUxMSVNUCQkJMHhGRDEwCisjZGVmaW5lIEhFUk1FU19SSURfUkVHVUxBVE9SWURPTUFJTlMJCTB4RkQxMQorI2RlZmluZSBIRVJNRVNfUklEX1RFTVBUWVBFCQkJMHhGRDEyCisjZGVmaW5lIEhFUk1FU19SSURfQ0lTCQkJCTB4RkQxMworI2RlZmluZSBIRVJNRVNfUklEX1NUQUlECQkJMHhGRDIwCisjZGVmaW5lIEhFUk1FU19SSURfU1RBU1VQUkFOR0UJCQkweEZEMjEKKyNkZWZpbmUgSEVSTUVTX1JJRF9NRklBQ1RSQU5HRVMJCQkweEZEMjIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DRklBQ1RSQU5HRVMyCQkweEZEMjMKKyNkZWZpbmUgSEVSTUVTX1JJRF9TRUNPTkRBUllWRVJTSU9OX1NZTUJPTAkweEZEMjQKKyNkZWZpbmUgSEVSTUVTX1JJRF9QT1JUU1RBVFVTCQkJMHhGRDQwCisjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVFNTSUQJCQkweEZENDEKKyNkZWZpbmUgSEVSTUVTX1JJRF9DVVJSRU5UQlNTSUQJCQkweEZENDIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DT01NU1FVQUxJVFkJCQkweEZENDMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DVVJSRU5UVFhSQVRFCQkweEZENDQKKyNkZWZpbmUgSEVSTUVTX1JJRF9DVVJSRU5UQkVBQ09OSU5URVJWQUwJMHhGRDQ1CisjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVFNDQUxFVEhSRVNIT0xEUwkweEZENDYKKyNkZWZpbmUgSEVSTUVTX1JJRF9QUk9UT0NPTFJTUFRJTUUJCTB4RkQ0NworI2RlZmluZSBIRVJNRVNfUklEX1NIT1JUUkVUUllMSU1JVAkJMHhGRDQ4CisjZGVmaW5lIEhFUk1FU19SSURfTE9OR1JFVFJZTElNSVQJCTB4RkQ0OQorI2RlZmluZSBIRVJNRVNfUklEX01BWFRSQU5TTUlUTElGRVRJTUUJCTB4RkQ0QQorI2RlZmluZSBIRVJNRVNfUklEX01BWFJFQ0VJVkVMSUZFVElNRQkJMHhGRDRCCisjZGVmaW5lIEhFUk1FU19SSURfQ0ZQT0xMQUJMRQkJCTB4RkQ0QworI2RlZmluZSBIRVJNRVNfUklEX0FVVEhFTlRJQ0FUSU9OQUxHT1JJVEhNUwkweEZENEQKKyNkZWZpbmUgSEVSTUVTX1JJRF9QUklWQUNZT1BUSU9OSU1QTEVNRU5URUQJMHhGRDRGCisjZGVmaW5lIEhFUk1FU19SSURfREJNQ09NTVNRVUFMSVRZX0lOVEVSU0lMCTB4RkQ1MQorI2RlZmluZSBIRVJNRVNfUklEX0NVUlJFTlRUWFJBVEUxCQkweEZEODAKKyNkZWZpbmUgSEVSTUVTX1JJRF9DVVJSRU5UVFhSQVRFMgkJMHhGRDgxCisjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVFRYUkFURTMJCTB4RkQ4MgorI2RlZmluZSBIRVJNRVNfUklEX0NVUlJFTlRUWFJBVEU0CQkweEZEODMKKyNkZWZpbmUgSEVSTUVTX1JJRF9DVVJSRU5UVFhSQVRFNQkJMHhGRDg0CisjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVFRYUkFURTYJCTB4RkQ4NQorI2RlZmluZSBIRVJNRVNfUklEX09XTk1BQ0FERFIJCQkweEZEODYKKyNkZWZpbmUgSEVSTUVTX1JJRF9TQ0FOUkVTVUxUU1RBQkxFCQkweEZEODgKKyNkZWZpbmUgSEVSTUVTX1JJRF9QSFlUWVBFCQkJMHhGREMwCisjZGVmaW5lIEhFUk1FU19SSURfQ1VSUkVOVENIQU5ORUwJCTB4RkRDMQorI2RlZmluZSBIRVJNRVNfUklEX0NVUlJFTlRQT1dFUlNUQVRFCQkweEZEQzIKKyNkZWZpbmUgSEVSTUVTX1JJRF9DQ0FNT0RFCQkJMHhGREMzCisjZGVmaW5lIEhFUk1FU19SSURfU1VQUE9SVEVEREFUQVJBVEVTCQkweEZEQzYKKyNkZWZpbmUgSEVSTUVTX1JJRF9CVUlMRFNFUQkJCTB4RkZGRQorI2RlZmluZSBIRVJNRVNfUklEX0ZXSUQJCQkJMHhGRkZGCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaTgyNTg2LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pODI1ODYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjY1YjI1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaTgyNTg2LmgKQEAgLTAsMCArMSw0MTMgQEAKKy8qCisgKiBJbnRlbCA4MjU4NiBJRUVFIDgwMi4zIEV0aGVybmV0IExBTiBDb3Byb2Nlc3Nvci4KKyAqCisgKiBTZWU6CisgKglJbnRlbCBNaWNyb2NvbW11bmljYXRpb25zIDE5OTEKKyAqCXAxLTEgdG8gcDEtMzcKKyAqCUludGVsIG9yZGVyIE5vLiAyMzE2NTgKKyAqCUlTQk4gMS01NTUxMi0xMTktNQorICoKKyAqICAgICBVbmZvcnR1bmF0ZWx5LCB0aGUgYWJvdmUgY2hhcHRlciBtZW50aW9ucyBuZWl0aGVyCisgKiB0aGUgU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciAoU0NQKSBub3IgdGhlCisgKiBJbnRlcm1lZGlhdGUgU3lzdGVtIENvbmZpZ3VyYXRpb24gUG9pbnRlciAoSVNDUCksCisgKiBzbyB3ZSBwcm9iYWJseSBuZWVkIHRvIGxvb2sgZWxzZXdoZXJlIGZvciB0aGUKKyAqIHdob2xlIHN0b3J5IC0tIHNvbWUgcmVjb21tZW5kIHRoZSAiSW50ZWwgTEFOCisgKiBDb21wb25lbnRzIG1hbnVhbCIgYnV0IEkgaGF2ZSBuZWl0aGVyIGEgY29weQorICogbm9yIGEgZnVsbCByZWZlcmVuY2UuICBCdXQgImVsc2V3aGVyZSIgbWF5IGJlCisgKiBpbiB0aGUgc2FtZSBwdWJsaWNhdGlvbi4uLgorICogICAgIFRoZSBkZXNjcmlwdGlvbiBvZiBhIGxhdGVyIGRldmljZSwgdGhlCisgKiAiODI1OTZDQSBIaWdoLVBlcmZvcm1hbmNlIDMyLUJpdCBMb2NhbCBBcmVhIE5ldHdvcmsKKyAqIENvcHJvY2Vzc29yIiwgKGliaWQuIHAxLTM4IHRvIHAxLTEwOSkgZG9lcyBtZW50aW9uCisgKiB0aGUgU0NQIGFuZCBJU0NQIGFuZCBhbHNvIGhhcyBhbiBpODI1ODYgY29tcGF0aWJpbGl0eQorICogbW9kZS4gIEV2ZW4gbW9yZSB1c2VmdWwgaXMgIkFQLTIzNSBBbiA4MjU4NiBEYXRhIExpbmsKKyAqIERyaXZlciIgKGliaWQuIHAxLTMzNyB0byBwMS00MTcpLgorICovCisKKyNkZWZpbmUJSTgyNTg2X01FTVoJKDY0ICogMTAyNCkKKworI2RlZmluZQlJODI1ODZfU0NQX0FERFIJKEk4MjU4Nl9NRU1aIC0gc2l6ZW9mKHNjcF90KSkKKworI2RlZmluZQlBRERSX0xFTgk2CisjZGVmaW5lCUk4MjU4Nk5VTEwJMHhGRkZGCisKKyNkZWZpbmUJdG9mZih0LHAsZikgCSh1bnNpZ25lZCBzaG9ydCkoKHZvaWQgKikoJigodCAqKSgodm9pZCAqKTAgKyAocCkpKS0+ZikgLSAodm9pZCAqKTApCisKKy8qCisgKiBTeXN0ZW0gQ29uZmlndXJhdGlvbiBQb2ludGVyIChTQ1ApLgorICovCit0eXBlZGVmIHN0cnVjdCBzY3BfdAlzY3BfdDsKK3N0cnVjdCBzY3BfdAoreworCXVuc2lnbmVkIHNob3J0CXNjcF9zeXNidXM7CS8qIDgyNTg2IGJ1cyB3aWR0aDoJKi8KKyNkZWZpbmUJCVNDUF9TWV8xNkJCVVMJKDB4MCA8PCAwKQkvKiAxNiBiaXRzICovCisjZGVmaW5lCQlTQ1BfU1lfOEJCVVMJKDB4MSA8PCAwKQkvKiAgOCBiaXRzLiAqLworCXVuc2lnbmVkIHNob3J0CXNjcF9qdW5rWzJdOwkvKiBVbnVzZWQgKi8KKwl1bnNpZ25lZCBzaG9ydAlzY3BfaXNjcGw7CS8qIGxvd2VyIDE2IGJpdHMgb2YgSVNDUF9BRERSICovCisJdW5zaWduZWQgc2hvcnQJc2NwX2lzY3BoOwkvKiB1cHBlciAxNiBiaXRzIG9mIElTQ1BfQUREUiAqLworfTsKKworLyoKKyAqIEludGVybWVkaWF0ZSBTeXN0ZW0gQ29uZmlndXJhdGlvbiBQb2ludGVyIChJU0NQKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgaXNjcF90CWlzY3BfdDsKK3N0cnVjdCBpc2NwX3QKK3sKKwl1bnNpZ25lZCBzaG9ydAlpc2NwX2J1c3k7CS8qIHNldCBieSBDUFUgYmVmb3JlIGZpcnN0IENBLAkqLworCQkJCQkvKiBjbGVhcmVkIGJ5IDgyNTg2IGFmdGVyIHJlYWQuCSovCisJdW5zaWduZWQgc2hvcnQJaXNjcF9vZmZzZXQ7CS8qIG9mZnNldCBvZiBTQ0IJCSovCisJdW5zaWduZWQgc2hvcnQJaXNjcF9iYXNlbDsJLyogYmFzZSBvZiBTQ0IJCQkqLworCXVuc2lnbmVkIHNob3J0CWlzY3BfYmFzZWg7CS8qICAiCQkJCSovCit9OworCisvKgorICogU3lzdGVtIENvbnRyb2wgQmxvY2sgKFNDQikuCisgKglUaGUgODI1ODYgd3JpdGVzIGl0cyBzdGF0dXMgdG8gc2NiX3N0YXR1cyBhbmQgdGhlbgorICoJcmFpc2VzIGFuIGludGVycnVwdCB0byBhbGVydCB0aGUgQ1BVLgorICoJVGhlIENQVSB3cml0ZXMgYSBjb21tYW5kIHRvIHNjYl9jb21tYW5kIGFuZAorICoJdGhlbiBpc3N1ZXMgYSBDaGFubmVsIEF0dGVudGlvbiAoQ0EpIHRvIGFsZXJ0IHRoZSA4MjU4Ni4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc2NiX3QJc2NiX3Q7CitzdHJ1Y3Qgc2NiX3QKK3sKKwl1bnNpZ25lZCBzaG9ydAlzY2Jfc3RhdHVzOwkvKiBTdGF0dXMgb2YgODI1ODYJCSovCisjZGVmaW5lCQlTQ0JfU1RfSU5UCSgweEYgPDwgMTIpCS8qIFNvbWUgb2Y6CQkqLworI2RlZmluZQkJU0NCX1NUX0NYCSgweDEgPDwgMTUpCS8qIENtZCBjb21wbGV0ZWQJKi8KKyNkZWZpbmUJCVNDQl9TVF9GUgkoMHgxIDw8IDE0KQkvKiBGcmFtZSByZWNlaXZlZAkqLworI2RlZmluZQkJU0NCX1NUX0NOQQkoMHgxIDw8IDEzKQkvKiBDbWQgdW5pdCBub3QgYWN0aXZlCSovCisjZGVmaW5lCQlTQ0JfU1RfUk5SCSgweDEgPDwgMTIpCS8qIFJjdiB1bml0IG5vdCByZWFkeQkqLworI2RlZmluZQkJU0NCX1NUX0pVTkswCSgweDEgPDwgMTEpCS8qIDAJCQkqLworI2RlZmluZQkJU0NCX1NUX0NVUwkoMHg3IDw8ICA4KQkvKiBDbWQgdW5pdCBzdGF0dXMJKi8KKyNkZWZpbmUJCQlTQ0JfU1RfQ1VTX0lETEUJKDAgPDwgOCkJLyogSWRsZQkJKi8KKyNkZWZpbmUJCQlTQ0JfU1RfQ1VTX1NVU1AJKDEgPDwgOCkJLyogU3VzcGVuZGVkCSovCisjZGVmaW5lCQkJU0NCX1NUX0NVU19BQ1RWCSgyIDw8IDgpCS8qIEFjdGl2ZQkqLworI2RlZmluZQkJU0NCX1NUX0pVTksxCSgweDEgPDwgIDcpCS8qIDAJCQkqLworI2RlZmluZQkJU0NCX1NUX1JVUwkoMHg3IDw8ICA0KQkvKiBSY3YgdW5pdCBzdGF0dXMJKi8KKyNkZWZpbmUJCQlTQ0JfU1RfUlVTX0lETEUJKDAgPDwgNCkJLyogSWRsZQkJKi8KKyNkZWZpbmUJCQlTQ0JfU1RfUlVTX1NVU1AJKDEgPDwgNCkJLyogU3VzcGVuZGVkCSovCisjZGVmaW5lCQkJU0NCX1NUX1JVU19OUkVTCSgyIDw8IDQpCS8qIE5vIHJlc291cmNlcwkqLworI2RlZmluZQkJCVNDQl9TVF9SVVNfUkRZCSg0IDw8IDQpCS8qIFJlYWR5CSovCisJdW5zaWduZWQgc2hvcnQJc2NiX2NvbW1hbmQ7CS8qIE5leHQgY29tbWFuZAkJCSovCisjZGVmaW5lCQlTQ0JfQ01EX0FDS19DWAkoMHgxIDw8IDE1KQkvKiBBY2sgY21kIGNvbXBsZXRpb24JKi8KKyNkZWZpbmUJCVNDQl9DTURfQUNLX0ZSCSgweDEgPDwgMTQpCS8qIEFjayBmcmFtZSByZWNlaXZlZAkqLworI2RlZmluZQkJU0NCX0NNRF9BQ0tfQ05BCSgweDEgPDwgMTMpCS8qIEFjayBDVSBub3QgYWN0aXZlCSovCisjZGVmaW5lCQlTQ0JfQ01EX0FDS19STlIJKDB4MSA8PCAxMikJLyogQWNrIFJVIG5vdCByZWFkeQkqLworI2RlZmluZQkJU0NCX0NNRF9KVU5LWAkoMHgxIDw8IDExKQkvKiBVbnVzZWQJCSovCisjZGVmaW5lCQlTQ0JfQ01EX0NVQwkoMHg3IDw8ICA4KQkvKiBDb21tYW5kIFVuaXQgY29tbWFuZAkqLworI2RlZmluZQkJCVNDQl9DTURfQ1VDX05PUAkoMCA8PCA4KQkvKiBOb3AJCSovCisjZGVmaW5lCQkJU0NCX0NNRF9DVUNfR08JKDEgPDwgOCkJLyogU3RhcnQgY2JsX29mZnNldCAqLworI2RlZmluZQkJCVNDQl9DTURfQ1VDX1JFUwkoMiA8PCA4KQkvKiBSZXN1bWUgZXhlY3V0aW9uICovCisjZGVmaW5lCQkJU0NCX0NNRF9DVUNfU1VTCSgzIDw8IDgpCS8qIFN1c3BlbmQgICAiCSovCisjZGVmaW5lCQkJU0NCX0NNRF9DVUNfQUJUCSg0IDw8IDgpCS8qIEFib3J0ICAgICAiCSovCisjZGVmaW5lCQlTQ0JfQ01EX1JFU0VUCSgweDEgPDwgIDcpCS8qIFJlc2V0IGNoaXAgKGhhcmR3YXJlKSAqLworI2RlZmluZQkJU0NCX0NNRF9SVUMJKDB4NyA8PCAgNCkJLyogUmVjZWl2ZSBVbml0IGNvbW1hbmQJKi8KKyNkZWZpbmUJCQlTQ0JfQ01EX1JVQ19OT1AJKDAgPDwgNCkJLyogTm9wCQkqLworI2RlZmluZQkJCVNDQl9DTURfUlVDX0dPCSgxIDw8IDQpCS8qIFN0YXJ0IHJmYV9vZmZzZXQgKi8KKyNkZWZpbmUJCQlTQ0JfQ01EX1JVQ19SRVMJKDIgPDwgNCkJLyogUmVzdW1lIHJlY2VwdGlvbiAqLworI2RlZmluZQkJCVNDQl9DTURfUlVDX1NVUwkoMyA8PCA0KQkvKiBTdXNwZW5kICAgIgkqLworI2RlZmluZQkJCVNDQl9DTURfUlVDX0FCVAkoNCA8PCA0KQkvKiBBYm9ydCAgICAgIgkqLworCXVuc2lnbmVkIHNob3J0CXNjYl9jYmxfb2Zmc2V0OwkvKiBPZmZzZXQgb2YgZmlyc3QgY29tbWFuZCB1bml0CSovCisJCQkJCS8qIEFjdGlvbiBDb21tYW5kCQkqLworCXVuc2lnbmVkIHNob3J0CXNjYl9yZmFfb2Zmc2V0OwkvKiBPZmZzZXQgb2YgZmlyc3QgUmVjZWl2ZQkqLworCQkJCQkvKiBGcmFtZSBEZXNjcmlwdG9yIGluIHRoZQkqLworCQkJCQkvKiBSZWNlaXZlIEZyYW1lIEFyZWEJCSovCisJdW5zaWduZWQgc2hvcnQJc2NiX2NyY2VycnM7CS8qIFByb3Blcmx5IGFsaWduZWQgZnJhbWVzCSovCisJCQkJCS8qIHJlY2VpdmVkIHdpdGggYSBDUkMgZXJyb3IJKi8KKwl1bnNpZ25lZCBzaG9ydAlzY2JfYWxuZXJyczsJLyogTWlzYWxpZ25lZCBmcmFtZXMgcmVjZWl2ZWQJKi8KKwkJCQkJLyogd2l0aCBhIENSQyBlcnJvcgkJKi8KKwl1bnNpZ25lZCBzaG9ydAlzY2JfcnNjZXJyczsJLyogRnJhbWVzIGxvc3QgZHVlIHRvIG5vIHNwYWNlCSovCisJdW5zaWduZWQgc2hvcnQJc2NiX292cm5lcnJzOwkvKiBGcmFtZXMgbG9zdCBkdWUgdG8gc2xvdyBidXMJKi8KK307CisKKyNkZWZpbmUJc2Nib2ZmKHAsZikgCXRvZmYoc2NiX3QsIHAsIGYpCisKKy8qCisgKiBUaGUgZWlnaHQgQWN0aW9uIENvbW1hbmRzLgorICovCit0eXBlZGVmIGVudW0gYWNtZF9lCWFjbWRfZTsKK2VudW0gYWNtZF9lCit7CisJYWNtZF9ub3AJPSAwLAkvKiBEbyBub3RoaW5nCQkJCSovCisJYWNtZF9pYV9zZXR1cAk9IDEsCS8qIExvYWQgYW4gKGV0aGVybmV0KSBhZGRyZXNzIGludG8gdGhlCSovCisJCQkJLyogODI1ODYJCQkJKi8KKwlhY21kX2NvbmZpZ3VyZQk9IDIsCS8qIFVwZGF0ZSB0aGUgODI1ODYgb3BlcmF0aW5nIHBhcmFtZXRlcnMgKi8KKwlhY21kX21jX3NldHVwCT0gMywJLyogTG9hZCBhIGxpc3Qgb2YgKGV0aGVybmV0KSBtdWx0aWNhc3QJKi8KKwkJCQkvKiBhZGRyZXNzZXMgaW50byB0aGUgODI1ODYJCSovCisJYWNtZF90cmFuc21pdAk9IDQsCS8qIFRyYW5zbWl0IGEgZnJhbWUJCQkqLworCWFjbWRfdGRyCT0gNSwJLyogUGVyZm9ybSBhIFRpbWUgRG9tYWluIFJlZmxlY3RvbWV0ZXIJKi8KKwkJCQkvKiB0ZXN0IG9uIHRoZSBzZXJpYWwgbGluawkJKi8KKwlhY21kX2R1bXAJPSA2LAkvKiBDb3B5IDgyNTg2IHJlZ2lzdGVycyB0byBtZW1vcnkJKi8KKwlhY21kX2RpYWdub3NlCT0gNywJLyogUnVuIGFuIGludGVybmFsIHNlbGYgdGVzdAkJKi8KK307CisKKy8qCisgKiBHZW5lcmljIEFjdGlvbiBDb21tYW5kIGhlYWRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYWNoX3QJYWNoX3Q7CitzdHJ1Y3QgYWNoX3QKK3sKKwl1bnNpZ25lZCBzaG9ydAlhY19zdGF0dXM7CQkvKiBDb21tYW5kIHN0YXR1czoJKi8KKyNkZWZpbmUJCUFDX1NGTERfQwkoMHgxIDw8IDE1KQkvKiBDb21tYW5kIGNvbXBsZXRlZAkqLworI2RlZmluZQkJQUNfU0ZMRF9CCSgweDEgPDwgMTQpCS8qIEJ1c3kgZXhlY3V0aW5nCSovCisjZGVmaW5lCQlBQ19TRkxEX09LCSgweDEgPDwgMTMpCS8qIENvbXBsZXRlZCBlcnJvciBmcmVlCSovCisjZGVmaW5lCQlBQ19TRkxEX0EJKDB4MSA8PCAxMikJLyogQ29tbWFuZCBhYm9ydGVkCSovCisjZGVmaW5lCQlBQ19TRkxEX0ZBSUwJKDB4MSA8PCAxMSkJLyogU2VsZnRlc3QgZmFpbGVkCSovCisjZGVmaW5lCQlBQ19TRkxEX1MxMAkoMHgxIDw8IDEwKQkvKiBObyBjYXJyaWVyIHNlbnNlCSovCisJCQkJCQkvKiBkdXJpbmcgdHJhbnNtaXNzaW9uCSovCisjZGVmaW5lCQlBQ19TRkxEX1M5CSgweDEgPDwgIDkpCS8qIFR4IHVuc3VjY2Vzc2Z1bDoJKi8KKwkJCQkJCS8qIChzdG9wcGVkKSBsb3N0IENUUwkqLworI2RlZmluZQkJQUNfU0ZMRF9TOAkoMHgxIDw8ICA4KQkvKiBUeCB1bnN1Y2Nlc3NmdWw6CSovCisJCQkJCQkvKiAoc3RvcHBlZCkgc2xvdyBETUEJKi8KKyNkZWZpbmUJCUFDX1NGTERfUzcJKDB4MSA8PCAgNykJLyogVHggZGVmZXJyZWQ6CQkqLworCQkJCQkJLyogb3RoZXIgbGluayB0cmFmZmljCSovCisjZGVmaW5lCQlBQ19TRkxEX1M2CSgweDEgPDwgIDYpCS8qIEhlYXJ0IEJlYXQ6IGNvbGxpc2lvbiAqLworCQkJCQkJLyogZGV0ZWN0IGFmdGVyIGxhc3QgdHgJKi8KKyNkZWZpbmUJCUFDX1NGTERfUzUJKDB4MSA8PCAgNSkJLyogVHggc3RvcHBlZDoJCSovCisJCQkJCQkvKiBleGNlc3NpdmUgY29sbGlzaW9ucwkqLworI2RlZmluZQkJQUNfU0ZMRF9NQVhDT0wJKDB4RiA8PCAgMCkJLyogQ29sbGlzaW9uIGNvdW50ICAJKi8KKwl1bnNpZ25lZCBzaG9ydAlhY19jb21tYW5kOwkJLyogQ29tbWFuZCBzcGVjaWZpZXI6CSovCisjZGVmaW5lCQlBQ19DRkxEX0VMCSgweDEgPDwgMTUpCS8qIEVuZCBvZiBjb21tYW5kIGxpc3QJKi8KKyNkZWZpbmUJCUFDX0NGTERfUwkoMHgxIDw8IDE0KQkvKiBTdXNwZW5kIG9uIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUJCUFDX0NGTERfSQkoMHgxIDw8IDEzKQkvKiBJbnRlcnJ1cHQgb24gY29tcGxldGlvbiAqLworI2RlZmluZQkJQUNfQ0ZMRF9DTUQJKDB4NyA8PCAgMCkJLyogYWNtZF9lCQkqLworCXVuc2lnbmVkIHNob3J0CWFjX2xpbms7CQkvKiBOZXh0IEFjdGlvbiBDb21tYW5kCSovCit9OworCisjZGVmaW5lCWFjb2ZmKHAsZikgCXRvZmYoYWNoX3QsIHAsIGYpCisKKy8qCisgKiBUaGUgTm9wIEFjdGlvbiBDb21tYW5kLgorICovCit0eXBlZGVmIHN0cnVjdCBhY19ub3BfdAlhY19ub3BfdDsKK3N0cnVjdCBhY19ub3BfdAoreworCWFjaF90CW5vcF9oOworfTsKKworLyoKKyAqIFRoZSBJQS1TZXR1cCBBY3Rpb24gQ29tbWFuZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYWNfaWFzX3QJYWNfaWFzX3Q7CitzdHJ1Y3QgYWNfaWFzX3QKK3sKKwlhY2hfdAkJaWFzX2g7CisJdW5zaWduZWQgY2hhcglpYXNfYWRkcltBRERSX0xFTl07IC8qIFRoZSAoZXRoZXJuZXQpIGFkZHJlc3MJKi8KK307CisKKy8qCisgKiBUaGUgQ29uZmlndXJlIEFjdGlvbiBDb21tYW5kLgorICovCit0eXBlZGVmIHN0cnVjdCBhY19jZmdfdAlhY19jZmdfdDsKK3N0cnVjdCBhY19jZmdfdAoreworCWFjaF90CQljZmdfaDsKKwl1bnNpZ25lZCBjaGFyCWNmZ19ieXRlX2NudDsJLyogU2l6ZSBmb2xsIGRhdGE6IDQtMTIJKi8KKyNkZWZpbmUJQUNfQ0ZHX0JZVEVfQ05UKHYpCSgoKHYpICYgMHhGKSA8PCAwKQorCXVuc2lnbmVkIGNoYXIJY2ZnX2ZpZm9saW07CS8qIEZJRk8gdGhyZXNob2xkCSovCisjZGVmaW5lCUFDX0NGR19GSUZPTElNKHYpCSgoKHYpICYgMHhGKSA8PCAwKQorCXVuc2lnbmVkIGNoYXIJY2ZnX2J5dGU4OworI2RlZmluZQlBQ19DRkdfU0FWX0JGKHYpIAkoKCh2KSAmIDB4MSkgPDwgNykJLyogU2F2ZSByeGQgYmFkIGZyYW1lcwkqLworI2RlZmluZQlBQ19DRkdfU1JEWSh2KSAJCSgoKHYpICYgMHgxKSA8PCA2KQkvKiBTUkRZL0FSRFkgcGluIG1lYW5zCSovCisJCQkJCQkJLyogZXh0ZXJuYWwgc3luYy4JKi8KKwl1bnNpZ25lZCBjaGFyCWNmZ19ieXRlOTsKKyNkZWZpbmUJQUNfQ0ZHX0VMUEJDSyh2KQkoKCh2KSAmIDB4MSkgPDwgNykJLyogRXh0ZXJuYWwgbG9vcGJhY2sJKi8KKyNkZWZpbmUJQUNfQ0ZHX0lMUEJDSyh2KQkoKCh2KSAmIDB4MSkgPDwgNikJLyogSW50ZXJuYWwgbG9vcGJhY2sJKi8KKyNkZWZpbmUJQUNfQ0ZHX1BSRUxFTih2KQkoKCh2KSAmIDB4MykgPDwgNCkJLyogUHJlYW1ibGUgbGVuZ3RoCSovCisjZGVmaW5lCQlBQ19DRkdfUExFTl8yCQkwCQkvKiAgMiBieXRlcwkqLworI2RlZmluZQkJQUNfQ0ZHX1BMRU5fNAkJMQkJLyogIDQgYnl0ZXMJKi8KKyNkZWZpbmUJCUFDX0NGR19QTEVOXzgJCTIJCS8qICA4IGJ5dGVzCSovCisjZGVmaW5lCQlBQ19DRkdfUExFTl8xNgkJMwkJLyogMTYgYnl0ZXMJKi8KKyNkZWZpbmUJQUNfQ0ZHX0FMT0ModikJCSgoKHYpICYgMHgxKSA8PCAzKQkvKiBBZGRyL2xlbiBkYXRhIGlzCSovCisJCQkJCQkJLyogZXhwbGljaXQgaW4gYnVmZmVycwkqLworI2RlZmluZQlBQ19DRkdfQUREUkxFTih2KQkoKCh2KSAmIDB4NykgPDwgMCkJLyogQnl0ZXMgcGVyIGFkZHJlc3MJKi8KKwl1bnNpZ25lZCBjaGFyCWNmZ19ieXRlMTA7CisjZGVmaW5lCUFDX0NGR19CT0ZNRVQodikJKCgodikgJiAweDEpIDw8IDcpCS8qIFVzZSBhbHRlcm5hdGUgZXhwby4JKi8KKwkJCQkJCQkvKiBiYWNrb2ZmIG1ldGhvZAkqLworI2RlZmluZQlBQ19DRkdfQUNSKHYpCQkoKCh2KSAmIDB4NykgPDwgNCkJLyogQWNjZWxlcmF0ZWQgY29udC4gcmVzLiAqLworI2RlZmluZQlBQ19DRkdfTElOUFJJTyh2KQkoKCh2KSAmIDB4NykgPDwgMCkJLyogTGluZWFyIHByaW9yaXR5CSovCisJdW5zaWduZWQgY2hhcgljZmdfaWZzOwkvKiBJbnRlcmZyYW1lIHNwYWNpbmcJCSovCisJdW5zaWduZWQgY2hhcgljZmdfc2xvdGw7CS8qIFNsb3QgdGltZSAobG93IGJ5dGUpCQkqLworCXVuc2lnbmVkIGNoYXIJY2ZnX2J5dGUxMzsKKyNkZWZpbmUJQUNfQ0ZHX1JFVFJZTlVNKHYpCSgoKHYpICYgMHhGKSA8PCA0KQkvKiBNYXguIGNvbGxpc2lvbiByZXRyeQkqLworI2RlZmluZQlBQ19DRkdfU0xUVE1ISSh2KQkoKCh2KSAmIDB4NykgPDwgMCkJLyogU2xvdCB0aW1lIChoaWdoIGJpdHMpICovCisJdW5zaWduZWQgY2hhcgljZmdfYnl0ZTE0OworI2RlZmluZQlBQ19DRkdfRkxHUEFEKHYpCSgoKHYpICYgMHgxKSA8PCA3KQkvKiBQYWQgd2l0aCBIRExDIGZsYWdzCSovCisjZGVmaW5lCUFDX0NGR19CVFNURih2KQkJKCgodikgJiAweDEpIDw8IDYpCS8qIERvIEhETEMgYml0c3R1ZmZpbmcJKi8KKyNkZWZpbmUJQUNfQ0ZHX0NSQzE2KHYpCQkoKCh2KSAmIDB4MSkgPDwgNSkJLyogMTYgYml0IENDSVRUIENSQwkqLworI2RlZmluZQlBQ19DRkdfTkNSQyh2KQkJKCgodikgJiAweDEpIDw8IDQpCS8qIEluc2VydCBubyBDUkMJKi8KKyNkZWZpbmUJQUNfQ0ZHX1ROQ1JTKHYpCQkoKCh2KSAmIDB4MSkgPDwgMykJLyogVHggZXZlbiBpZiBubyBjYXJyaWVyICovCisjZGVmaW5lCUFDX0NGR19NQU5DSCh2KQkJKCgodikgJiAweDEpIDw8IDIpCS8qIE1hbmNoZXN0ZXIgY29kaW5nCSovCisjZGVmaW5lCUFDX0NGR19CQ0RJUyh2KQkJKCgodikgJiAweDEpIDw8IDEpCS8qIERpc2FibGUgYnJvYWRjYXN0CSovCisjZGVmaW5lCUFDX0NGR19QUk0odikJCSgoKHYpICYgMHgxKSA8PCAwKQkvKiBQcm9taXNjdW91cyBtb2RlCSovCisJdW5zaWduZWQgY2hhcgljZmdfYnl0ZTE1OworI2RlZmluZQlBQ19DRkdfSUNEUyh2KQkJKCgodikgJiAweDEpIDw8IDcpCS8qIEludGVybmFsIGNvbGxpc2lvbgkqLworCQkJCQkJCS8qIGRldGVjdCBzb3VyY2UJKi8KKyNkZWZpbmUJQUNfQ0ZHX0NEVEYodikJCSgoKHYpICYgMHg3KSA8PCA0KQkvKiBDb2xsaXNpb24gZGV0ZWN0CSovCisJCQkJCQkJLyogZmlsdGVyIGluIGJpdCB0aW1lcwkqLworI2RlZmluZQlBQ19DRkdfSUNTUyh2KQkJKCgodikgJiAweDEpIDw8IDMpCS8qIEludGVybmFsIGNhcnJpZXIJKi8KKwkJCQkJCQkvKiBzZW5zZSBzb3VyY2UJCSovCisjZGVmaW5lCUFDX0NGR19DU1RGKHYpCQkoKCh2KSAmIDB4NykgPDwgMCkJLyogQ2FycmllciBzZW5zZQkqLworCQkJCQkJCS8qIGZpbHRlciBpbiBiaXQgdGltZXMJKi8KKwl1bnNpZ25lZCBzaG9ydAljZmdfbWluX2ZybV9sZW47CisjZGVmaW5lCUFDX0NGR19NTkZSTSh2KQkJKCgodikgJiAweEZGKSA8PCAwKQkvKiBNaW4uIGJ5dGVzL2ZyYW1lICg8PSAyNTUpICovCit9OworCisvKgorICogVGhlIE1DLVNldHVwIEFjdGlvbiBDb21tYW5kLgorICovCit0eXBlZGVmIHN0cnVjdCBhY19tY3NfdAlhY19tY3NfdDsKK3N0cnVjdCBhY19tY3NfdAoreworCWFjaF90CQltY3NfaDsKKwl1bnNpZ25lZCBzaG9ydAltY3NfY250OwkvKiBOby4gb2YgYnl0ZXMgb2YgTUMgYWRkcmVzc2VzCSovCisjaWYgMAorCXVuc2lnbmVkIGNoYXIJbWNzX2RhdGFbQUREUl9MRU5dOyAvKiBUaGUgZmlyc3QgTUMgYWRkcmVzcyAuLgkqLworCS4uLgorI2VuZGlmCit9OworCisjZGVmaW5lIEk4MjU4Nl9NQVhfTVVMVElDQVNUX0FERFJFU1NFUwkxMjgJLyogSGFyZHdhcmUgaGFzaGVkIGZpbHRlciAqLworCisvKgorICogVGhlIFRyYW5zbWl0IEFjdGlvbiBDb21tYW5kLgorICovCit0eXBlZGVmIHN0cnVjdCBhY190eF90CWFjX3R4X3Q7CitzdHJ1Y3QgYWNfdHhfdAoreworCWFjaF90CQl0eF9oOworCXVuc2lnbmVkIHNob3J0CXR4X3RiZF9vZmZzZXQ7CS8qIEFkZHJlc3Mgb2YgbGlzdCBvZiBidWZmZXJzLgkqLworI2lmCTAKK0xpbnV4IHBhY2tldHMgYXJlIHBhc3NlZCBkb3duIHdpdGggdGhlIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzCithbmQgbGVuZ3RoL3R5cGUgZmllbGQgYWxyZWFkeSBwcmVwZW5kZWQgdG8gdGhlIGRhdGEsCitzbyB3ZSBkbyBub3QgbmVlZCB0byBpbnNlcnQgaXQuICBDb25zaXN0ZW50IHdpdGggdGhpcword2UgbXVzdCBhbHNvIHNldCB0aGUgQUNfQ0ZHX0FMT0MoLi4pIGZsYWcgZHVyaW5nIHRoZQorYWNfY2ZnX3QgYWN0aW9uIGNvbW1hbmQuCisJdW5zaWduZWQgY2hhcgl0eF9hZGRyW0FERFJfTEVOXTsgLyogVGhlIGZyYW1lIGRlc3QuIGFkZHJlc3MJKi8KKwl1bnNpZ25lZCBzaG9ydAl0eF9sZW5ndGg7CS8qIFRoZSBmcmFtZSBsZW5ndGgJCSovCisjZW5kaWYJLyogMCAqLworfTsKKworLyoKKyAqIFRoZSBUaW1lIERvbWFpbiBSZWZsZWN0b21ldGVyIEFjdGlvbiBDb21tYW5kLgorICovCit0eXBlZGVmIHN0cnVjdCBhY190ZHJfdAlhY190ZHJfdDsKK3N0cnVjdCBhY190ZHJfdAoreworCWFjaF90CQl0ZHJfaDsKKwl1bnNpZ25lZCBzaG9ydAl0ZHJfcmVzdWx0OwkvKiBSZXN1bHQuCSovCisjZGVmaW5lCQlBQ19URFJfTE5LX09LCSgweDEgPDwgMTUpCS8qIE5vIGxpbmsgcHJvYmxlbQkqLworI2RlZmluZQkJQUNfVERSX1hDVlJfUFJCCSgweDEgPDwgMTQpCS8qIFR4Y3ZyIGNhYmxlIHByb2JsZW0JKi8KKyNkZWZpbmUJCUFDX1REUl9FVF9PUE4JKDB4MSA8PCAxMykJLyogT3BlbiBvbiB0aGUgbGluawkqLworI2RlZmluZQkJQUNfVERSX0VUX1NSVAkoMHgxIDw8IDEyKQkvKiBTaG9ydCBvbiB0aGUgbGluawkqLworI2RlZmluZQkJQUNfVERSX1RJTUUJKDB4N0ZGIDw8IDApCS8qIERpc3RhbmNlIHRvIHByb2JsZW0JKi8KKwkJCQkJCS8qIHNpdGUJaW4gdHJhbnNtaXQJKi8KKwkJCQkJCS8qIGNsb2NrIGN5Y2xlcwkJKi8KK307CisKKy8qCisgKiBUaGUgRHVtcCBBY3Rpb24gQ29tbWFuZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYWNfZG1wX3QJYWNfZG1wX3Q7CitzdHJ1Y3QgYWNfZG1wX3QKK3sKKwlhY2hfdAkJZG1wX2g7CisJdW5zaWduZWQgc2hvcnQJZG1wX29mZnNldDsJLyogUmVzdWx0LgkqLworfTsKKworLyoKKyAqIFNpemUgb2YgdGhlIHJlc3VsdCBvZiB0aGUgZHVtcCBjb21tYW5kLgorICovCisjZGVmaW5lCURVTVBCWVRFUwkxNzAKKworLyoKKyAqIFRoZSBEaWFnbm9zZSBBY3Rpb24gQ29tbWFuZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYWNfZGduX3QJYWNfZGduX3Q7CitzdHJ1Y3QgYWNfZGduX3QKK3sKKwlhY2hfdAkJZGduX2g7Cit9OworCisvKgorICogVHJhbnNtaXQgQnVmZmVyIERlc2NyaXB0b3IgKFRCRCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHRiZF90CXRiZF90Oworc3RydWN0IHRiZF90Cit7CisJdW5zaWduZWQgc2hvcnQJdGJkX3N0YXR1czsJCS8qIFdyaXR0ZW4gYnkgdGhlIENQVQkqLworI2RlZmluZQkJVEJEX1NUQVRVU19FT0YJKDB4MSA8PCAxNSkJLyogVGhpcyBUQkQgaXMgdGhlCSovCisJCQkJCQkvKiBsYXN0IGZvciB0aGlzIGZyYW1lCSovCisjZGVmaW5lCQlUQkRfU1RBVFVTX0FDTlQJKDB4M0ZGRiA8PCAwKQkvKiBBY3R1YWwgY291bnQgb2YgZGF0YQkqLworCQkJCQkJLyogYnl0ZXMgaW4gdGhpcyBidWZmZXIJKi8KKwl1bnNpZ25lZCBzaG9ydAl0YmRfbmV4dF9iZF9vZmZzZXQ7CS8qIE5leHQgaW4gbGlzdAkJKi8KKwl1bnNpZ25lZCBzaG9ydAl0YmRfYnVmbDsJCS8qIEJ1ZmZlciBhZGRyZXNzIChsb3cpCSovCisJdW5zaWduZWQgc2hvcnQJdGJkX2J1Zmg7CQkvKiAgICAiCSAgICAgIgkoaGlnaCkJKi8KK307CisKKy8qCisgKiBSZWNlaXZlIEJ1ZmZlciBEZXNjcmlwdG9yIChSQkQpLgorICovCit0eXBlZGVmIHN0cnVjdCByYmRfdAlyYmRfdDsKK3N0cnVjdCByYmRfdAoreworCXVuc2lnbmVkIHNob3J0CXJiZF9zdGF0dXM7CQkvKiBXcml0dGVuIGJ5IHRoZSA4MjU4NgkqLworI2RlZmluZQkJUkJEX1NUQVRVU19FT0YJKDB4MSA8PCAxNSkJLyogVGhpcyBSQkQgaXMgdGhlCSovCisJCQkJCQkvKiBsYXN0IGZvciB0aGlzIGZyYW1lCSovCisjZGVmaW5lCQlSQkRfU1RBVFVTX0YJKDB4MSA8PCAxNCkJLyogQUNOVCBmaWVsZCBpcyB2YWxpZAkqLworI2RlZmluZQkJUkJEX1NUQVRVU19BQ05UCSgweDNGRkYgPDwgMCkJLyogQWN0dWFsIG5vLiBvZiBkYXRhCSovCisJCQkJCQkvKiBieXRlcyBpbiB0aGlzIGJ1ZmZlcgkqLworCXVuc2lnbmVkIHNob3J0CXJiZF9uZXh0X3JiZF9vZmZzZXQ7CS8qIE5leHQgcmJkIGluIGxpc3QJKi8KKwl1bnNpZ25lZCBzaG9ydAlyYmRfYnVmbDsJCS8qIERhdGEgcG9pbnRlciAobG93KQkqLworCXVuc2lnbmVkIHNob3J0CXJiZF9idWZoOwkJLyogICIJICAgIiAgICAoaGlnaCkJKi8KKwl1bnNpZ25lZCBzaG9ydAlyYmRfZWxfc2l6ZTsJCS8qIEVMK0RhdGEgYnVmLiBzaXplCSovCisjZGVmaW5lCQlSQkRfRUwJKDB4MSA8PCAxNSkJCS8qIFRoaXMgQkQgaXMgdGhlCSovCisJCQkJCQkvKiBsYXN0IGluIHRoZSBsaXN0CSovCisjZGVmaW5lCQlSQkRfU0laRSAoMHgzRkZGIDw8IDApCQkvKiBOby4gb2YgYnl0ZXMgdGhlCSovCisJCQkJCQkvKiBidWZmZXIgY2FuIGhvbGQJKi8KK307CisKKyNkZWZpbmUJcmJkb2ZmKHAsZikgCXRvZmYocmJkX3QsIHAsIGYpCisKKy8qCisgKiBGcmFtZSBEZXNjcmlwdG9yIChGRCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IGZkX3QJZmRfdDsKK3N0cnVjdCBmZF90Cit7CisJdW5zaWduZWQgc2hvcnQJZmRfc3RhdHVzOwkJLyogV3JpdHRlbiBieSB0aGUgODI1ODYJKi8KKyNkZWZpbmUJCUZEX1NUQVRVU19DCSgweDEgPDwgMTUpCS8qIENvbXBsZXRlZCBzdG9yaW5nIGZyYW1lICovCisjZGVmaW5lCQlGRF9TVEFUVVNfQgkoMHgxIDw8IDE0KQkvKiBGRCB3YXMgY29uc3VtZWQgYnkgUlUgKi8KKyNkZWZpbmUJCUZEX1NUQVRVU19PSwkoMHgxIDw8IDEzKQkvKiBGcmFtZSByeGQgc3VjY2Vzc2Z1bGx5ICovCisjZGVmaW5lCQlGRF9TVEFUVVNfUzExCSgweDEgPDwgMTEpCS8qIENSQyBlcnJvcgkJKi8KKyNkZWZpbmUJCUZEX1NUQVRVU19TMTAJKDB4MSA8PCAxMCkJLyogQWxpZ25tZW50IGVycm9yCSovCisjZGVmaW5lCQlGRF9TVEFUVVNfUzkJKDB4MSA8PCAgOSkJLyogUmFuIG91dCBvZiByZXNvdXJjZXMJKi8KKyNkZWZpbmUJCUZEX1NUQVRVU19TOAkoMHgxIDw8ICA4KQkvKiBSeCBETUEgb3ZlcnJ1bgkqLworI2RlZmluZQkJRkRfU1RBVFVTX1M3CSgweDEgPDwgIDcpCS8qIEZyYW1lIHRvbyBzaG9ydAkqLworI2RlZmluZQkJRkRfU1RBVFVTX1M2CSgweDEgPDwgIDYpCS8qIE5vIEVPRiBmbGFnCQkqLworCXVuc2lnbmVkIHNob3J0CWZkX2NvbW1hbmQ7CQkvKiBDb21tYW5kCQkqLworI2RlZmluZQkJRkRfQ09NTUFORF9FTAkoMHgxIDw8IDE1KQkvKiBMYXN0IEZEIGluIGxpc3QJKi8KKyNkZWZpbmUJCUZEX0NPTU1BTkRfUwkoMHgxIDw8IDE0KQkvKiBTdXNwZW5kIFJVIGFmdGVyIHJ4CSovCisJdW5zaWduZWQgc2hvcnQJZmRfbGlua19vZmZzZXQ7CQkvKiBOZXh0IEZECQkqLworCXVuc2lnbmVkIHNob3J0CWZkX3JiZF9vZmZzZXQ7CQkvKiBGaXJzdCBSQkQgKGRhdGEpCSovCisJCQkJCQkvKiBQcmVwYXJlZCBieSBDUFUsCSovCisJCQkJCQkvKiB1cGRhdGVkIGJ5IDgyNTg2CSovCisjaWYJMAorSSB0aGluayB0aGUgcmVzdCBpcyB1bnVzZWQgc2luY2Ugd2UKK2hhdmUgc2V0IEFDX0NGR19BTE9DKC4uKS4gIEhvd2V2ZXIsIGp1c3QKK2luIGNhc2UsIHdlIGxlYXZlIHRoZSBzcGFjZS4KKyNlbmRpZgkvKiAwICovCisJdW5zaWduZWQgY2hhcglmZF9kZXN0W0FERFJfTEVOXTsJLyogRGVzdGluYXRpb24gYWRkcmVzcwkqLworCQkJCQkJLyogV3JpdHRlbiBieSA4MjU4NgkqLworCXVuc2lnbmVkIGNoYXIJZmRfc3JjW0FERFJfTEVOXTsJLyogU291cmNlIGFkZHJlc3MJKi8KKwkJCQkJCS8qIFdyaXR0ZW4gYnkgODI1ODYJKi8KKwl1bnNpZ25lZCBzaG9ydAlmZF9sZW5ndGg7CQkvKiBGcmFtZSBsZW5ndGggb3IgdHlwZQkqLworCQkJCQkJLyogV3JpdHRlbiBieSA4MjU4NgkqLworfTsKKworI2RlZmluZQlmZG9mZihwLGYpIAl0b2ZmKGZkX3QsIHAsIGYpCisKKy8qCisgKiBUaGlzIHNvZnR3YXJlIG1heSBvbmx5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkCisgKiBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgd2F2ZWxhbi5jLgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pODI1OTMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2k4MjU5My5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYWNiOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pODI1OTMuaApAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIERlZmluaXRpb25zIGZvciBJbnRlbCA4MjU5MyBDU01BL0NEIENvcmUgTEFOIENvbnRyb2xsZXIKKyAqIFRoZSBkZWZpbml0aW9ucyBhcmUgdGFrZW4gZnJvbSB0aGUgMTk5MiB1c2VycyBtYW51YWwgd2l0aCBJbnRlbAorICogb3JkZXIgbnVtYmVyIDI5NzEyNS0wMDEuCisgKgorICogL3Vzci9zcmMvcGMvUkNTL2k4MjU5My5oLHYgMS4xIDE5OTYvMDcvMTcgMTU6MjM6MTIgcm9vdCBFeHAKKyAqCisgKiBDb3B5cmlnaHQgMTk5NCwgQW5kZXJzIEtsZW1ldHMgPGtsZW1ldHNAaXQua3RoLnNlPgorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCBmb3Igbm9uY29tbWVyY2lhbCBwdXJwb3NlcworICogYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyByZXRhaW5lZC4KKyAqIAorICogSElTVE9SWQorICogaTgyNTkzLmgsdgorICogUmV2aXNpb24gMS4xICAxOTk2LzA3LzE3IDE1OjIzOjEyICByb290CisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorICogUmV2aXNpb24gMS4zICAxOTk1LzA0LzA1ICAxNToxMzo1OCAgYWRqCisgKiBJbml0aWFsIGFscGhhIHJlbGVhc2UKKyAqCisgKiBSZXZpc2lvbiAxLjIgIDE5OTQvMDYvMTYgIDIzOjU3OjMxICBrbGVtZXRzCisgKiBNaXJyb3JlZCBhbGwgdGhlIGZpZWxkcyBpbiB0aGUgY29uZmlndXJhdGlvbiBibG9jay4KKyAqCisgKiBSZXZpc2lvbiAxLjEgIDE5OTQvMDYvMDIgIDIwOjI1OjM0ICBrbGVtZXRzCisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorICoKKyAqLworI2lmbmRlZglfSTgyNTkzX0gKKyNkZWZpbmUJX0k4MjU5M19ICisKKy8qIEludGVsIDgyNTkzIENTTUEvQ0QgQ29yZSBMQU4gQ29udHJvbGxlciAqLworCisvKiBQb3J0IDAgQ29tbWFuZCBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworCisvKiBFeGVjdXRpb24gb3BlcmF0aW9ucyAqLworI2RlZmluZSBPUDBfTk9QCQkJMAkvKiBDSE5MID0gMCAqLworI2RlZmluZSBPUDBfU1dJVF9UT19QT1JUXzEJMAkvKiBDSE5MID0gMSAqLworI2RlZmluZSBPUDBfSUFfU0VUVVAJCTEKKyNkZWZpbmUgT1AwX0NPTkZJR1VSRQkJMgorI2RlZmluZSBPUDBfTUNfU0VUVVAJCTMKKyNkZWZpbmUgT1AwX1RSQU5TTUlUCQk0CisjZGVmaW5lIE9QMF9URFIJCQk1CisjZGVmaW5lIE9QMF9EVU1QCQk2CisjZGVmaW5lIE9QMF9ESUFHTk9TRQkJNworI2RlZmluZSBPUDBfVFJBTlNNSVRfTk9fQ1JDCTkKKyNkZWZpbmUgT1AwX1JFVFJBTlNNSVQJCTEyCisjZGVmaW5lIE9QMF9BQk9SVAkJMTMKKy8qIFJlY2VwdGlvbiBvcGVyYXRpb25zICovCisjZGVmaW5lIE9QMF9SQ1ZfRU5BQkxFCQk4CisjZGVmaW5lIE9QMF9SQ1ZfRElTQUJMRQkJMTAKKyNkZWZpbmUgT1AwX1NUT1BfUkNWCQkxMQorLyogU3RhdHVzIHBvaW50ZXIgY29udHJvbCBvcGVyYXRpb25zICovCisjZGVmaW5lIE9QMF9GSVhfUFRSCQkxNQkvKiBDSE5MID0gMSAqLworI2RlZmluZSBPUDBfUkxTX1BUUgkJMTUJLyogQ0hOTCA9IDAgKi8KKyNkZWZpbmUgT1AwX1JFU0VUCQkxNAorCisjZGVmaW5lIENSMF9DSE5MCQkoMSA8PCA0KQkvKiAwPUNoYW5uZWwgMCwgMT1DaGFubmVsIDEgKi8KKyNkZWZpbmUgQ1IwX1NUQVRVU18wCQkweDAwCisjZGVmaW5lIENSMF9TVEFUVVNfMQkJMHgyMAorI2RlZmluZSBDUjBfU1RBVFVTXzIJCTB4NDAKKyNkZWZpbmUgQ1IwX1NUQVRVU18zCQkweDYwCisjZGVmaW5lIENSMF9JTlRfQUNLCQkoMSA8PCA3KQkvKiAwPU5vIGFjaywgMT1hY2tub3dsZWRnZSAqLworCisvKiBQb3J0IDAgU3RhdHVzIFJlZ2lzdGVyIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgU1IwX05PX1JFU1VMVAkJMAkJLyogZHVtbXkgKi8KKyNkZWZpbmUgU1IwX0VWRU5UX01BU0sJCTB4MGYKKyNkZWZpbmUgU1IwX0lBX1NFVFVQX0RPTkUJMQorI2RlZmluZSBTUjBfQ09ORklHVVJFX0RPTkUJMgorI2RlZmluZSBTUjBfTUNfU0VUVVBfRE9ORQkzCisjZGVmaW5lIFNSMF9UUkFOU01JVF9ET05FCTQKKyNkZWZpbmUgU1IwX1REUl9ET05FCQk1CisjZGVmaW5lIFNSMF9EVU1QX0RPTkUJCTYKKyNkZWZpbmUgU1IwX0RJQUdOT1NFX1BBU1NFRAk3CisjZGVmaW5lIFNSMF9UUkFOU01JVF9OT19DUkNfRE9ORSA5CisjZGVmaW5lIFNSMF9SRVRSQU5TTUlUX0RPTkUJMTIKKyNkZWZpbmUgU1IwX0VYRUNVVElPTl9BQk9SVEVECTEzCisjZGVmaW5lIFNSMF9FTkRfT0ZfRlJBTUUJOAorI2RlZmluZSBTUjBfUkVDRVBUSU9OX0FCT1JURUQJMTAKKyNkZWZpbmUgU1IwX0RJQUdOT1NFX0ZBSUxFRAkxNQorI2RlZmluZSBTUjBfU1RPUF9SRUdfSElUCTExCisKKyNkZWZpbmUgU1IwX0NITkwJCSgxIDw8IDQpCisjZGVmaW5lIFNSMF9FWEVDVVRJT04JCSgxIDw8IDUpCisjZGVmaW5lIFNSMF9SRUNFUFRJT04JCSgxIDw8IDYpCisjZGVmaW5lIFNSMF9JTlRFUlJVUFQJCSgxIDw8IDcpCisjZGVmaW5lIFNSMF9CT1RIX1JYX1RYCQkoU1IwX0VYRUNVVElPTiB8IFNSMF9SRUNFUFRJT04pCisKKyNkZWZpbmUgU1IzX0VYRUNfU1RBVEVfTUFTSwkweDAzCisjZGVmaW5lIFNSM19FWEVDX0lETEUJCTAKKyNkZWZpbmUgU1IzX1RYX0FCT1JUX0lOX1BST0dSRVNTIDEKKyNkZWZpbmUgU1IzX0VYRUNfQUNUSVZFCQkyCisjZGVmaW5lIFNSM19BQk9SVF9JTl9QUk9HUkVTUwkzCisjZGVmaW5lIFNSM19FWEVDX0NITkwJCSgxIDw8IDIpCisjZGVmaW5lIFNSM19TVFBfT05fTk9fUlNSQwkoMSA8PCAzKQorI2RlZmluZSBTUjNfUkNWSU5HX05PX1JTUkMJKDEgPDwgNCkKKyNkZWZpbmUgU1IzX1JDVl9TVEFURV9NQVNLCTB4NjAKKyNkZWZpbmUgU1IzX1JDVl9JRExFCQkweDAwCisjZGVmaW5lIFNSM19SQ1ZfUkVBRFkJCTB4MjAKKyNkZWZpbmUgU1IzX1JDVl9BQ1RJVkUJCTB4NDAKKyNkZWZpbmUgU1IzX1JDVl9TVE9QX0lOX1BST0cJMHg2MAorI2RlZmluZSBTUjNfUkNWX0NITkwJCSgxIDw8IDcpCisKKy8qIFBvcnQgMSBDb21tYW5kIFJlZ2lzdGVyIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgT1AxX05PUAkJCTAKKyNkZWZpbmUgT1AxX1NXSVRfVE9fUE9SVF8wCTEKKyNkZWZpbmUgT1AxX0lOVF9ESVNBQkxFCQkyCisjZGVmaW5lIE9QMV9JTlRfRU5BQkxFCQkzCisjZGVmaW5lIE9QMV9TRVRfVFMJCTUKKyNkZWZpbmUgT1AxX1JTVF9UUwkJNworI2RlZmluZSBPUDFfUE9XRVJfRE9XTgkJOAorI2RlZmluZSBPUDFfUkVTRVRfUklOR19NTkdNVAkxMQorI2RlZmluZSBPUDFfUkVTRVQJCTE0CisjZGVmaW5lIE9QMV9TRUxfUlNUCQkxNQorCisjZGVmaW5lIENSMV9TVEFUVVNfNAkJMHgwMAorI2RlZmluZSBDUjFfU1RBVFVTXzUJCTB4MjAKKyNkZWZpbmUgQ1IxX1NUQVRVU182CQkweDQwCisjZGVmaW5lIENSMV9TVE9QX1JFR19VUERBVEUJKDEgPDwgNykKKworLyogUmVjZWl2ZSBmcmFtZSBzdGF0dXMgYml0cyAqLworCisjZGVmaW5lCVJYX1JDTEQJCQkoMSA8PCAwKQorI2RlZmluZSBSWF9JQV9NQVRDSAkJKDEgPDwgMSkKKyNkZWZpbmUJUlhfTk9fQURfTUFUQ0gJCSgxIDw8IDIpCisjZGVmaW5lIFJYX05PX1NGRAkJKDEgPDwgMykKKyNkZWZpbmUgUlhfU1JUX0ZSTQkJKDEgPDwgNykKKyNkZWZpbmUgUlhfT1ZSUlVOCQkoMSA8PCA4KQorI2RlZmluZSBSWF9BTEdfRVJSCQkoMSA8PCAxMCkKKyNkZWZpbmUgUlhfQ1JDX0VSUgkJKDEgPDwgMTEpCisjZGVmaW5lIFJYX0xFTl9FUlIJCSgxIDw8IDEyKQorI2RlZmluZSBSWF9SQ1ZfT0sJCSgxIDw8IDEzKQorI2RlZmluZSBSWF9UWVBfTEVOCQkoMSA8PCAxNSkKKworLyogVHJhbnNtaXQgc3RhdHVzIGJpdHMgKi8KKworI2RlZmluZSBUWF9OQ09MX01BU0sJCTB4MGYKKyNkZWZpbmUgVFhfRlJUTAkJCSgxIDw8IDQpCisjZGVmaW5lIFRYX01BWF9DT0wJCSgxIDw8IDUpCisjZGVmaW5lIFRYX0hSVF9CRUFUCQkoMSA8PCA2KQorI2RlZmluZSBUWF9ERUZFUgkJKDEgPDwgNykKKyNkZWZpbmUgVFhfVU5EX1JVTgkJKDEgPDwgOCkKKyNkZWZpbmUgVFhfTE9TVF9DVFMJCSgxIDw8IDkpCisjZGVmaW5lIFRYX0xPU1RfQ1JTCQkoMSA8PCAxMCkKKyNkZWZpbmUgVFhfTFRDT0wJCSgxIDw8IDExKQorI2RlZmluZSBUWF9PSwkJCSgxIDw8IDEzKQorI2RlZmluZSBUWF9DT0xMCQkJKDEgPDwgMTUpCisKK3N0cnVjdCBpODI1OTNfY29uZl9ibG9jayB7CisgIHVfY2hhciBmaWZvX2xpbWl0IDogNCwKKyAgCSBmb3JnbmVzaSAgIDogMSwKKyAgCSBmaWZvXzMyICAgIDogMSwKKyAgCSBkNm1vZCAgICAgIDogMSwKKyAgCSB0aHJvdHRsZV9lbmIgOiAxOworICB1X2NoYXIgdGhyb3R0bGUgICA6IDYsCisJIGNudHJ4aW50ICAgOiAxLAorCSBjb250aW4JICAgIDogMTsKKyAgdV9jaGFyIGFkZHJfbGVuICAgOiAzLAorICAJIGFjbG9jIAkgICAgOiAxLAorIAkgcHJlYW1iX2xlbiA6IDIsCisgIAkgbG9vcGJhY2sgICA6IDI7CisgIHVfY2hhciBsaW5fcHJpbyAgIDogMywKKwkgdGJvZnN0b3AgICA6IDEsCisJIGV4cF9wcmlvICAgOiAzLAorCSBib2ZfbWV0ICAgIDogMTsKKyAgdV9jaGFyCSAgICA6IDQsCisJIGlmcm1fc3BjICAgOiA0OworICB1X2NoYXIJICAgIDogNSwKKwkgc2xvdHRpbV9sb3cgOiAzOworICB1X2NoYXIgc2xvdHRpbV9oaSA6IDMsCisJCSAgICA6IDEsCisJIG1heF9yZXRyICAgOiA0OworICB1X2NoYXIgcHJtaXNjICAgICA6IDEsCisJIGJjX2RpcyAgICAgOiAxLAorICAJCSAgICA6IDEsCisJIGNyc18xCSAgICA6IDEsCisJIG5vY3JjX2lucyAgOiAxLAorCSBjcmNfMTYzMiAgIDogMSwKKyAgCSAJICAgIDogMSwKKyAgCSBjcnNfY2R0ICAgIDogMTsKKyAgdV9jaGFyIGNzX2ZpbHRlciAgOiAzLAorCSBjcnNfc3JjICAgIDogMSwKKwkgY2RfZmlsdGVyICA6IDMsCisJCSAgICA6IDE7CisgIHVfY2hhcgkgICAgOiAyLAorICAJIG1pbl9mcl9sZW4gOiA2OworICB1X2NoYXIgbG5nX3R5cCAgICA6IDEsCisJIGxuZ19mbGQgICAgOiAxLAorCSByeGNyY194ZiAgIDogMSwKKwkgYXJ0eAkgICAgOiAxLAorCSBzYXJlYwkgICAgOiAxLAorCSB0eF9qYWJiZXIgIDogMSwJLyogd2h5IGlzIHRoaXMgY2FsbGVkIG1heF9sZW4gaW4gdGhlIG1hbnVhbD8gKi8KKwkgaGFzaF8xCSAgICA6IDEsCisgIAkgbGJwa3BvbCAgICA6IDE7CisgIHVfY2hhcgkgICAgOiA2LAorICAJIGZkeAkgICAgOiAxLAorICAJICAJICAgIDogMTsKKyAgdV9jaGFyIGR1bW15XzYgICAgOiA2LAkvKiBzdXBwb3NlZCB0byBiZSBvbmVzICovCisgIAkgbXVsdF9pYSAgICA6IDEsCisgIAkgZGlzX2JvZiAgICA6IDE7CisgIHVfY2hhciBkdW1teV8xICAgIDogMSwJLyogc3VwcG9zZWQgdG8gYmUgb25lICovCisJIHR4X2lmc19yZXRyaWcgOiAyLAorCSBtY19hbGwgICAgIDogMSwKKwkgcmN2X21vbiAgICA6IDIsCisJIGZyYWdfYWNwdCAgOiAxLAorICAJIHRzdHJ0dHJzICAgOiAxOworICB1X2NoYXIgZnJldHgJICAgIDogMSwKKwkgcnVudF9lb3AgICA6IDEsCisJIGh3X3N3X3BpbiAgOiAxLAorCSBiaWdfZW5kbiAgIDogMSwKKwkgc3luY3JxcyAgICA6IDEsCisJIHN0dGxlbiAgICAgOiAxLAorCSB0eF9lb3AgICAgIDogMSwKKyAgCSByeF9lb3AJICAgIDogMTsKKyAgdV9jaGFyIHJidWZfc2l6ZSAgOiA1LAorCSByY3ZzdG9wICAgIDogMSwKKyAgCSAJICAgIDogMjsKK307CisKKyNkZWZpbmUgSTgyNTkzX01BWF9NVUxUSUNBU1RfQUREUkVTU0VTCTEyOAkvKiBIYXJkd2FyZSBoYXNoZWQgZmlsdGVyICovCisKKyNlbmRpZiAvKiBfSTgyNTkzX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2llZWU4MDJfMTEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2llZWU4MDJfMTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2RkNTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaWVlZTgwMl8xMS5oCkBAIC0wLDAgKzEsNzggQEAKKyNpZm5kZWYgX0lFRUU4MDJfMTFfSAorI2RlZmluZSBfSUVFRTgwMl8xMV9ICisKKyNkZWZpbmUgSUVFRTgwMl8xMV9EQVRBX0xFTgkJMjMwNAorLyogTWF4aW11bSBzaXplIGZvciB0aGUgTUEtVU5JVERBVEEgcHJpbWl0aXZlLCA4MDIuMTEgc3RhbmRhcmQgc2VjdGlvbgorICAgNi4yLjEuMS4yLgorCisgICBUaGUgZmlndXJlIGluIHNlY3Rpb24gNy4xLjIgc3VnZ2VzdHMgYSBib2R5IHNpemUgb2YgdXAgdG8gMjMxMgorICAgYnl0ZXMgaXMgYWxsb3dlZCwgd2hpY2ggaXMgYSBiaXQgY29uZnVzaW5nLCBJIHN1c3BlY3QgdGhpcworICAgcmVwcmVzZW50cyB0aGUgMjMwNCBieXRlcyBvZiByZWFsIGRhdGEsIHBsdXMgYSBwb3NzaWJsZSA4IGJ5dGVzIG9mCisgICBXRVAgSVYgYW5kIElDVi4gKHRoaXMgaW50ZXJwcmV0YXRpb24gc3VnZ2VzdGVkIGJ5IFJhbWlybyBCYXJyZWlybykgKi8KKworCisjZGVmaW5lIElFRUU4MDJfMTFfSExFTgkJCTMwCisjZGVmaW5lIElFRUU4MDJfMTFfRlJBTUVfTEVOCQkoSUVFRTgwMl8xMV9EQVRBX0xFTiArIElFRUU4MDJfMTFfSExFTikKKworc3RydWN0IGllZWU4MDJfMTFfaGRyIHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXU4IGFkZHIzW0VUSF9BTEVOXTsKKwl1MTYgc2VxX2N0bDsKKwl1OCBhZGRyNFtFVEhfQUxFTl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogRnJhbWUgY29udHJvbCBmaWVsZCBjb25zdGFudHMgKi8KKyNkZWZpbmUgSUVFRTgwMl8xMV9GQ1RMX1ZFUlMJCTB4MDAwMgorI2RlZmluZSBJRUVFODAyXzExX0ZDVExfRlRZUEUJCTB4MDAwYworI2RlZmluZSBJRUVFODAyXzExX0ZDVExfU1RZUEUJCTB4MDBmMAorI2RlZmluZSBJRUVFODAyXzExX0ZDVExfVE9EUwkJMHgwMTAwCisjZGVmaW5lIElFRUU4MDJfMTFfRkNUTF9GUk9NRFMJCTB4MDIwMAorI2RlZmluZSBJRUVFODAyXzExX0ZDVExfTU9SRUZSQUdTCTB4MDQwMAorI2RlZmluZSBJRUVFODAyXzExX0ZDVExfUkVUUlkJCTB4MDgwMAorI2RlZmluZSBJRUVFODAyXzExX0ZDVExfUE0JCTB4MTAwMAorI2RlZmluZSBJRUVFODAyXzExX0ZDVExfTU9SRURBVEEJMHgyMDAwCisjZGVmaW5lIElFRUU4MDJfMTFfRkNUTF9XRVAJCTB4NDAwMAorI2RlZmluZSBJRUVFODAyXzExX0ZDVExfT1JERVIJCTB4ODAwMAorCisjZGVmaW5lIElFRUU4MDJfMTFfRlRZUEVfTUdNVAkJMHgwMDAwCisjZGVmaW5lIElFRUU4MDJfMTFfRlRZUEVfQ1RMCQkweDAwMDQKKyNkZWZpbmUgSUVFRTgwMl8xMV9GVFlQRV9EQVRBCQkweDAwMDgKKworLyogbWFuYWdlbWVudCAqLworI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0FTU09DX1JFUQkweDAwMDAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9BU1NPQ19SRVNQIAkweDAwMTAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9SRUFTU09DX1JFUQkweDAwMjAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9SRUFTU09DX1JFU1AJMHgwMDMwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfUFJPQkVfUkVRCTB4MDA0MAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX1BST0JFX1JFU1AJMHgwMDUwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfQkVBQ09OCQkweDAwODAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9BVElNCQkweDAwOTAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9ESVNBU1NPQwkweDAwQTAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9BVVRICQkweDAwQjAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9ERUFVVEgJCTB4MDBDMAorCisvKiBjb250cm9sICovCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfUFNQT0xMCQkweDAwQTAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9SVFMJCTB4MDBCMAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0NUUwkJMHgwMEMwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfQUNLCQkweDAwRDAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9DRkVORAkJMHgwMEUwCisjZGVmaW5lIElFRUU4MDJfMTFfU1RZUEVfQ0ZFTkRBQ0sJMHgwMEYwCisKKy8qIGRhdGEgKi8KKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9EQVRBCQkweDAwMDAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9EQVRBX0NGQUNLCTB4MDAxMAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0RBVEFfQ0ZQT0xMCTB4MDAyMAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0RBVEFfQ0ZBQ0tQT0xMCTB4MDAzMAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX05VTExGVU5DCTB4MDA0MAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0NGQUNLCQkweDAwNTAKKyNkZWZpbmUgSUVFRTgwMl8xMV9TVFlQRV9DRlBPTEwJCTB4MDA2MAorI2RlZmluZSBJRUVFODAyXzExX1NUWVBFX0NGQUNLUE9MTAkweDAwNzAKKworI2RlZmluZSBJRUVFODAyXzExX1NDVExfRlJBRwkJMHgwMDBGCisjZGVmaW5lIElFRUU4MDJfMTFfU0NUTF9TRVEJCTB4RkZGMAorCisjZW5kaWYgLyogX0lFRUU4MDJfMTFfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbmV0d2F2ZV9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbmV0d2F2ZV9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MjI0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9uZXR3YXZlX2NzLmMKQEAgLTAsMCArMSwxNzM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAKKyAqIEZpbGVuYW1lOiAgICAgIG5ldHdhdmVfY3MuYworICogVmVyc2lvbjogICAgICAgMC40LjEKKyAqIERlc2NyaXB0aW9uOiAgIE5ldHdhdmUgQWlyU3VyZmVyIFdpcmVsZXNzIExBTiBQQyBDYXJkIGRyaXZlcgorICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgorICogQXV0aG9yczogICAgICAgSm9obiBNYXJrdXMgQmr4cm5kYWxlbiA8am9obm1AY3MudWl0Lm5vPgorICogICAgICAgICAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogICAgICAgICAgICAgICAgRGF2aWQgSGluZHMgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICogQ3JlYXRlZCBhdDogICAgQSBsb25nIHRpbWUgYWdvIQorICogTW9kaWZpZWQgYXQ6ICAgTW9uIE5vdiAxMCAxMTo1NDozNyAxOTk3CisgKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiAKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTcgVW5pdmVyc2l0eSBvZiBUcm9tc/gsIE5vcndheQorICoKKyAqIFJldmlzaW9uIEhpc3Rvcnk6CisgKgorICogICAwOC1Ob3YtOTcgMTU6MTQ6NDcgICBKb2huIE1hcmt1cyBCavhybmRhbGVuIDxqb2hubUBjcy51aXQubm8+CisgKiAgICAtIEZpeGVkIHNvbWUgYnVncyBpbiBuZXR3YXZlX3J4IGFuZCBjbGVhbmVkIGl0IHVwIGEgYml0LiAKKyAqICAgICAgKE9uZSBvZiB0aGUgYnVncyB3b3VsZCBoYXZlIGRlc3Ryb3llZCBwYWNrZXRzIHdoZW4gcmVjZWl2aW5nCisgKiAgICAgIG11bHRpcGxlIHBhY2tldHMgcGVyIGludGVycnVwdCkuIAorICogICAgLSBDbGVhbmVkIHVwIHBhcnRzIG9mIG5ld2F2ZV9od194bWl0LiAKKyAqICAgIC0gQSBmZXcgZ2VuZXJhbCBjbGVhbnVwcy4gCisgKiAgIDI0LU9jdC05NyAxMzoxNzozNiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqICAgIC0gRml4ZWQgbmV0d2F2ZV9yeCByZWNlaXZlIGZ1bmN0aW9uIChnb3QgdXBkYXRlZCBkb2NzKQorICogICBPdGhlcnM6CisgKiAgICAtIENoYW5nZWQgbmFtZSBmcm9tIHhpcmNudyB0byBuZXR3YXZlLCB0YWtlIGEgbG9vayBhdCAKKyAqICAgICAgaHR0cDovL3d3dy5uZXR3YXZlLXdpcmVsZXNzLmNvbQorICogICAgLSBTb21lIHJlb3JnYW5pemluZyBvZiB0aGUgY29kZQorICogICAgLSBSZW1vdmVkIHBvc3NpYmxlIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gaW50ZXJydXB0IGhhbmRsZXIgYW5kIHRyYW5zbWl0CisgKiAgICAgIGZ1bmN0aW9uCisgKiAgICAtIFN0YXJ0ZWQgdG8gYWRkIHdpcmVsZXNzIGV4dGVuc2lvbnMsIGJ1dCBzdGlsbCBuZWVkcyBzb21lIGNvZGluZworICogICAgLSBBZGRlZCB3YXRjaGRvZyBmb3IgYmV0dGVyIGhhbmRsaW5nIG9mIHRyYW5zbWlzc2lvbiB0aW1lb3V0cyAKKyAqICAgICAgKGhvcGVmdWxseSB0aGlzIHdvcmtzIGJldHRlcikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVG8gaGF2ZSBzdGF0aXN0aWNzIChqdXN0IHBhY2tldHMgc2VudCkgZGVmaW5lIHRoaXMgKi8KKyN1bmRlZiBORVRXQVZFX1NUQVRTCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2lmZGVmIENPTkZJR19ORVRfUkFESU8KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2lmIFdJUkVMRVNTX0VYVCA+IDEyCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKyNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiAxMiAqLworI2VuZGlmCisKKyNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RzLmg+CisjaW5jbHVkZSA8cGNtY2lhL21lbV9vcC5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2RlZmluZSBORVRXQVZFX1JFR09GRiAgICAgICAgIDB4ODAwMAorLyogVGhlIE5ldHdhdmUgSU8gcmVnaXN0ZXJzLCBvZmZzZXRzIHRvIGlvYmFzZSAqLworI2RlZmluZSBORVRXQVZFX1JFR19DT1IgICAgICAgIDB4MAorI2RlZmluZSBORVRXQVZFX1JFR19DQ1NSICAgICAgIDB4MgorI2RlZmluZSBORVRXQVZFX1JFR19BU1IgICAgICAgIDB4NAorI2RlZmluZSBORVRXQVZFX1JFR19JTVIgICAgICAgIDB4YQorI2RlZmluZSBORVRXQVZFX1JFR19QTVIgICAgICAgIDB4YworI2RlZmluZSBORVRXQVZFX1JFR19JT0xPVyAgICAgIDB4NgorI2RlZmluZSBORVRXQVZFX1JFR19JT0hJICAgICAgIDB4NworI2RlZmluZSBORVRXQVZFX1JFR19JT0NPTlRST0wgIDB4OAorI2RlZmluZSBORVRXQVZFX1JFR19EQVRBICAgICAgIDB4ZgorLyogVGhlIE5ldHdhdmUgRXh0ZW5kZWQgSU8gcmVnaXN0ZXJzLCBvZmZzZXRzIHRvIFJhbUJhc2UgKi8KKyNkZWZpbmUgTkVUV0FWRV9FUkVHX0FTQ0MgICAgICAweDExNAorI2RlZmluZSBORVRXQVZFX0VSRUdfUlNFUiAgICAgIDB4MTIwCisjZGVmaW5lIE5FVFdBVkVfRVJFR19SU0VSVyAgICAgMHgxMjQKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX1RTRVIgICAgICAweDEzMAorI2RlZmluZSBORVRXQVZFX0VSRUdfVFNFUlcgICAgIDB4MTM0CisjZGVmaW5lIE5FVFdBVkVfRVJFR19DQiAgICAgICAgMHgxMDAKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX1NQQ1EgICAgICAweDE1NAorI2RlZmluZSBORVRXQVZFX0VSRUdfU1BVICAgICAgIDB4MTU1CisjZGVmaW5lIE5FVFdBVkVfRVJFR19MSUYgICAgICAgMHgxNGUKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX0lTUExRICAgICAweDE1NgorI2RlZmluZSBORVRXQVZFX0VSRUdfSEhDICAgICAgIDB4MTU4CisjZGVmaW5lIE5FVFdBVkVfRVJFR19OSSAgICAgICAgMHgxNmUKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX01IUyAgICAgICAweDE2YgorI2RlZmluZSBORVRXQVZFX0VSRUdfVERQICAgICAgIDB4MTQwCisjZGVmaW5lIE5FVFdBVkVfRVJFR19SRFAgICAgICAgMHgxNTAKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX1BBICAgICAgICAweDE2MAorI2RlZmluZSBORVRXQVZFX0VSRUdfRUMgICAgICAgIDB4MTgwCisjZGVmaW5lIE5FVFdBVkVfRVJFR19DUkJQICAgICAgMHgxN2EKKyNkZWZpbmUgTkVUV0FWRV9FUkVHX0FSVyAgICAgICAweDE2NgorCisvKgorICogQ29tbWFuZHMgdXNlZCBpbiB0aGUgZXh0ZW5kZWQgY29tbWFuZCBidWZmZXIKKyAqIE5FVFdBVkVfRVJFR19DQiAoMHgxMDAtMHgxMEYpIAorICovCisjZGVmaW5lIE5FVFdBVkVfQ01EX05PUCAgICAgICAgMHgwMAorI2RlZmluZSBORVRXQVZFX0NNRF9TUkMgICAgICAgIDB4MDEKKyNkZWZpbmUgTkVUV0FWRV9DTURfU1RDICAgICAgICAweDAyCisjZGVmaW5lIE5FVFdBVkVfQ01EX0FNQSAgICAgICAgMHgwMworI2RlZmluZSBORVRXQVZFX0NNRF9ETUEgICAgICAgIDB4MDQKKyNkZWZpbmUgTkVUV0FWRV9DTURfU0FNQSAgICAgICAweDA1CisjZGVmaW5lIE5FVFdBVkVfQ01EX0VSICAgICAgICAgMHgwNgorI2RlZmluZSBORVRXQVZFX0NNRF9EUiAgICAgICAgIDB4MDcKKyNkZWZpbmUgTkVUV0FWRV9DTURfVEwgICAgICAgICAweDA4CisjZGVmaW5lIE5FVFdBVkVfQ01EX1NSUCAgICAgICAgMHgwOQorI2RlZmluZSBORVRXQVZFX0NNRF9TU0sgICAgICAgIDB4MGEKKyNkZWZpbmUgTkVUV0FWRV9DTURfU01EICAgICAgICAweDBiCisjZGVmaW5lIE5FVFdBVkVfQ01EX1NBUEQgICAgICAgMHgwYworI2RlZmluZSBORVRXQVZFX0NNRF9TU1MgICAgICAgIDB4MTEKKy8qIEVuZCBvZiBDb21tYW5kIG1hcmtlciAqLworI2RlZmluZSBORVRXQVZFX0NNRF9FT0MgICAgICAgIDB4MDAKKworLyogQVNSIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgTkVUV0FWRV9BU1JfUlhSRFkgICAweDgwCisjZGVmaW5lIE5FVFdBVkVfQVNSX1RYQkEgICAgMHgwMQorCisjZGVmaW5lIFRYX1RJTUVPVVQJCSgoMzIqSFopLzEwMCkKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpbXJDb25mUkZVMSA9IDB4MTA7IC8qIFJGVSBpbnRlcnJ1cHQgbWFzaywga2VlcCBoaWdoICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGltckNvbmZJRU5BID0gMHgwMjsgLyogSW50ZXJydXB0IGVuYWJsZSAqLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNvckNvbmZJRU5BICAgPSAweDAxOyAvKiBJbnRlcnJ1cHQgZW5hYmxlICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNvckNvbmZMVkxSRVEgPSAweDQwOyAvKiBLZWVwIGhpZ2ggKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByeENvbmZSeEVuYSAgPSAweDgwOyAvKiBSZWNlaXZlIEVuYWJsZSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByeENvbmZNQUMgICAgPSAweDIwOyAvKiBNQUMgaG9zdCByZWNlaXZlIG1vZGUqLyAKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcnhDb25mUHJvICAgID0gMHgxMDsgLyogUHJvbWlzY3VvdXMgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcnhDb25mQU1QICAgID0gMHgwODsgLyogQWNjZXB0IE11bHRpY2FzdCBQYWNrZXRzICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJ4Q29uZkJjYXN0ICA9IDB4MDQ7IC8qIEFjY2VwdCBCcm9hZGNhc3QgUGFja2V0cyAqLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHR4Q29uZlR4RW5hICA9IDB4ODA7IC8qIFRyYW5zbWl0IEVuYWJsZSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0eENvbmZNQUMgICAgPSAweDIwOyAvKiBIb3N0IHNlbmRzIE1BQyBtb2RlICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHR4Q29uZkVVRCAgICA9IDB4MTA7IC8qIEVuYWJsZSBVbmktRGF0YSBwYWNrZXRzICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHR4Q29uZktleSAgICA9IDB4MDI7IC8qIFNjcmFtYmxlIGRhdGEgcGFja2V0cyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0eENvbmZMb29wICAgPSAweDAxOyAvKiBMb29wYmFjayBtb2RlICovCisKKy8qCisgICBBbGwgdGhlIFBDTUNJQSBtb2R1bGVzIHVzZSBQQ01DSUFfREVCVUcgdG8gY29udHJvbCBkZWJ1Z2dpbmcuICBJZgorICAgeW91IGRvIG5vdCBkZWZpbmUgUENNQ0lBX0RFQlVHIGF0IGFsbCwgYWxsIHRoZSBkZWJ1ZyBjb2RlIHdpbGwgYmUKKyAgIGxlZnQgb3V0LiAgSWYgeW91IGNvbXBpbGUgd2l0aCBQQ01DSUFfREVCVUc9MCwgdGhlIGRlYnVnIGNvZGUgd2lsbAorICAgYmUgcHJlc2VudCBidXQgZGlzYWJsZWQgLS0gYnV0IGl0IGNhbiB0aGVuIGJlIGVuYWJsZWQgZm9yIHNwZWNpZmljCisgICBtb2R1bGVzIGF0IGxvYWQgdGltZSB3aXRoIGEgJ3BjX2RlYnVnPSMnIG9wdGlvbiB0byBpbnNtb2QuCisqLworCisjaWZkZWYgUENNQ0lBX0RFQlVHCitzdGF0aWMgaW50IHBjX2RlYnVnID0gUENNQ0lBX0RFQlVHOworbW9kdWxlX3BhcmFtKHBjX2RlYnVnLCBpbnQsIDApOworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBpZiAocGNfZGVidWc+KG4pKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKQorc3RhdGljIGNoYXIgKnZlcnNpb24gPQorIm5ldHdhdmVfY3MuYyAwLjMuMCBUaHUgSnVsIDE3IDE0OjM2OjAyIDE5OTcgKEpvaG4gTWFya3VzIEJq+HJuZGFsZW4pXG4iOworI2Vsc2UKKyNkZWZpbmUgREVCVUcobiwgYXJncy4uLikKKyNlbmRpZgorCitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJuZXR3YXZlX2NzIjsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IHdpdGggJ2luc21vZCcgKi8KKworLyogQ2hvb3NlIHRoZSBkb21haW4sIGRlZmF1bHQgaXMgMHgxMDAgKi8KK3N0YXRpYyB1X2ludCAgZG9tYWluID0gMHgxMDA7CisKKy8qIFNjcmFtYmxlIGtleSwgcmFuZ2UgZnJvbSAweDAgdG8gMHhmZmZmLiAgCisgKiAweDAgaXMgbm8gc2NyYW1ibGluZy4gCisgKi8KK3N0YXRpYyB1X2ludCAgc2NyYW1ibGVfa2V5ID0gMHgwOworCisvKiBTaGFyZWQgbWVtb3J5IHNwZWVkLCBpbiBucy4gVGhlIGRvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgCisgKiB0aGUgY2FyZCBzaG91bGQgbm90IGJlIHJlYWQgZmFzdGVyIHRoYW4gZXZlcnkgNDAwbnMuIAorICogVGhpcyB0aW1pbmcgc2hvdWxkIGJlIHByb3ZpZGVkIGJ5IHRoZSBIQkEuIElmIGl0IGJlY29tZXMgYSAKKyAqIHByb2JsZW0sIHRyeSBzZXR0aW5nIG1lbV9zcGVlZCB0byA0MDAuIAorICovCitzdGF0aWMgaW50IG1lbV9zcGVlZDsKKworbW9kdWxlX3BhcmFtKGRvbWFpbiwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShzY3JhbWJsZV9rZXksIGludCwgMCk7Cittb2R1bGVfcGFyYW0obWVtX3NwZWVkLCBpbnQsIDApOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogUENNQ0lBIChDYXJkIFNlcnZpY2VzKSByZWxhdGVkIGZ1bmN0aW9ucyAqLworc3RhdGljIHZvaWQgbmV0d2F2ZV9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspOyAgICAgLyogQ2FyZCByZW1vdmFsICovCitzdGF0aWMgaW50ICBuZXR3YXZlX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwgCisJCQkJCSAgICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CitzdGF0aWMgdm9pZCBuZXR3YXZlX3BjbWNpYV9jb25maWcoZGV2X2xpbmtfdCAqYXJnKTsgLyogUnVucyBhZnRlciBjYXJkIAorCQkJCQkJCQkJCQkJCSAgIGluc2VydGlvbiAqLworc3RhdGljIGRldl9saW5rX3QgKm5ldHdhdmVfYXR0YWNoKHZvaWQpOyAgICAgLyogQ3JlYXRlIGluc3RhbmNlICovCitzdGF0aWMgdm9pZCBuZXR3YXZlX2RldGFjaChkZXZfbGlua190ICopOyAgICAvKiBEZXN0cm95IGluc3RhbmNlICovCisKKy8qIEhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyB2b2lkIG5ldHdhdmVfZG9yZXNldChraW9fYWRkcl90IGlvYmFzZSwgdV9jaGFyIF9faW9tZW0gKnJhbUJhc2UpOworc3RhdGljIHZvaWQgbmV0d2F2ZV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogTWlzYyBkZXZpY2Ugc3R1ZmYgKi8KK3N0YXRpYyBpbnQgbmV0d2F2ZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOyAgLyogT3BlbiB0aGUgZGV2aWNlICovCitzdGF0aWMgaW50IG5ldHdhdmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7IC8qIENsb3NlIHRoZSBkZXZpY2UgKi8KKworLyogUGFja2V0IHRyYW5zbWlzc2lvbiBhbmQgUGFja2V0IHJlY2VwdGlvbiAqLworc3RhdGljIGludCBuZXR3YXZlX3N0YXJ0X3htaXQoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBuZXR3YXZlX3J4KCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyogSW50ZXJydXB0IHJvdXRpbmVzICovCitzdGF0aWMgaXJxcmV0dXJuX3QgbmV0d2F2ZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBuZXR3YXZlX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICopOworCisvKiBTdGF0aXN0aWNzICovCitzdGF0aWMgdm9pZCB1cGRhdGVfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldHdhdmVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisvKiBXaXJlbGVzcyBleHRlbnNpb25zICovCisjaWZkZWYgV0lSRUxFU1NfRVhUCitzdGF0aWMgc3RydWN0IGl3X3N0YXRpc3RpY3MqIG5ldHdhdmVfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCitzdGF0aWMgaW50IG5ldHdhdmVfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGlmcmVxICosIGludCk7CisKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoKKyAgIEEgbGlua2VkIGxpc3Qgb2YgImluc3RhbmNlcyIgb2YgdGhlIHNrZWxldG9uIGRldmljZS4gIEVhY2ggYWN0dWFsCisgICBQQ01DSUEgY2FyZCBjb3JyZXNwb25kcyB0byBvbmUgZGV2aWNlIGluc3RhbmNlLCBhbmQgaXMgZGVzY3JpYmVkCisgICBieSBvbmUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgKGRlZmluZWQgaW4gZHMuaCkuCisKKyAgIFlvdSBtYXkgbm90IHdhbnQgdG8gdXNlIGEgbGlua2VkIGxpc3QgZm9yIHRoaXMgLS0gZm9yIGV4YW1wbGUsIHRoZQorICAgbWVtb3J5IGNhcmQgZHJpdmVyIHVzZXMgYW4gYXJyYXkgb2YgZGV2X2xpbmtfdCBwb2ludGVycywgd2hlcmUgbWlub3IKKyAgIGRldmljZSBudW1iZXJzIGFyZSB1c2VkIHRvIGRlcml2ZSB0aGUgY29ycmVzcG9uZGluZyBhcnJheSBpbmRleC4KKyovCitzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3Q7CisKKy8qCisgICBBIGRldl9saW5rX3Qgc3RydWN0dXJlIGhhcyBmaWVsZHMgZm9yIG1vc3QgdGhpbmdzIHRoYXQgYXJlIG5lZWRlZAorICAgdG8ga2VlcCB0cmFjayBvZiBhIHNvY2tldCwgYnV0IHRoZXJlIHdpbGwgdXN1YWxseSBiZSBzb21lIGRldmljZQorICAgc3BlY2lmaWMgaW5mb3JtYXRpb24gdGhhdCBhbHNvIG5lZWRzIHRvIGJlIGtlcHQgdHJhY2sgb2YuICBUaGUKKyAgICdwcml2JyBwb2ludGVyIGluIGEgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgdG8gcG9pbnQgdG8KKyAgIGEgZGV2aWNlLXNwZWNpZmljIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUsIGxpa2UgdGhpcy4KKworICAgQSBkcml2ZXIgbmVlZHMgdG8gcHJvdmlkZSBhIGRldl9ub2RlX3Qgc3RydWN0dXJlIGZvciBlYWNoIGRldmljZQorICAgb24gYSBjYXJkLiAgSW4gc29tZSBjYXNlcywgdGhlcmUgaXMgb25seSBvbmUgZGV2aWNlIHBlciBjYXJkIChmb3IKKyAgIGV4YW1wbGUsIGV0aGVybmV0IGNhcmRzLCBtb2RlbXMpLiAgSW4gb3RoZXIgY2FzZXMsIHRoZXJlIG1heSBiZQorICAgbWFueSBhY3R1YWwgb3IgbG9naWNhbCBkZXZpY2VzIChTQ1NJIGFkYXB0ZXJzLCBtZW1vcnkgY2FyZHMgd2l0aAorICAgbXVsdGlwbGUgcGFydGl0aW9ucykuICBUaGUgZGV2X25vZGVfdCBzdHJ1Y3R1cmVzIG5lZWQgdG8gYmUga2VwdAorICAgaW4gYSBsaW5rZWQgbGlzdCBzdGFydGluZyBhdCB0aGUgJ2RldicgZmllbGQgb2YgYSBkZXZfbGlua190CisgICBzdHJ1Y3R1cmUuICBXZSBhbGxvY2F0ZSB0aGVtIGluIHRoZSBjYXJkJ3MgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSwKKyAgIGJlY2F1c2UgdGhleSBnZW5lcmFsbHkgY2FuJ3QgYmUgYWxsb2NhdGVkIGR5bmFtaWNhbGx5LgorKi8KKworI2lmIFdJUkVMRVNTX0VYVCA8PSAxMgorLyogV2lyZWxlc3MgZXh0ZW5zaW9ucyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisKKy8qIFBhcnQgb2YgaXdfaGFuZGxlciBwcm90b3R5cGUgd2UgbmVlZCAqLworc3RydWN0IGl3X3JlcXVlc3RfaW5mbworeworCV9fdTE2CQljbWQ7CQkvKiBXaXJlbGVzcyBFeHRlbnNpb24gY29tbWFuZCAqLworCV9fdTE2CQlmbGFnczsJCS8qIE1vcmUgdG8gY29tZSA7LSkgKi8KK307CisKKy8qIFdpcmVsZXNzIEV4dGVuc2lvbiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IC0gSmVhbiBJSQorICogSWYgdGhlIG5ldyB3aXJlbGVzcyBkZXZpY2UgcHJpdmF0ZSBpb2N0bCByYW5nZSBpcyBub3QgZGVmaW5lZCwKKyAqIGRlZmF1bHQgdG8gc3RhbmRhcmQgZGV2aWNlIHByaXZhdGUgaW9jdGwgcmFuZ2UgKi8KKyNpZm5kZWYgU0lPQ0lXRklSU1RQUklWCisjZGVmaW5lIFNJT0NJV0ZJUlNUUFJJVglTSU9DREVWUFJJVkFURQorI2VuZGlmIC8qIFNJT0NJV0ZJUlNUUFJJViAqLworCisjZWxzZQkvKiBXSVJFTEVTU19FWFQgPD0gMTIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYJbmV0d2F2ZV9oYW5kbGVyX2RlZjsKKyNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPD0gMTIgKi8KKworI2RlZmluZSBTSU9DR0lQU05BUAlTSU9DSVdGSVJTVFBSSVYJKyAxCS8qIFNpdGUgU3VydmV5IFNuYXBzaG90ICovCisKKyNkZWZpbmUgTUFYX0VTQSAxMAorCit0eXBlZGVmIHN0cnVjdCBuZXRfYWRkciB7CisgICAgdV9jaGFyIGFkZHI0OFs2XTsKK30gbmV0X2FkZHI7CisKK3N0cnVjdCBzaXRlX3N1cnZleSB7CisgICAgdV9zaG9ydCBsZW5ndGg7CisgICAgdV9jaGFyICBzdHJ1Y3RfcmV2aXNpb247CisgICAgdV9jaGFyICByb2FtaW5nX3N0YXRlOworCQorICAgIHVfY2hhciAgc3BfZXhpc3RzRmxhZzsKKyAgICB1X2NoYXIgIHNwX2xpbmtfcXVhbGl0eTsKKyAgICB1X2NoYXIgIHNwX21heF9saW5rX3F1YWxpdHk7CisgICAgdV9jaGFyICBsaW5rUXVhbGl0eUdvb2RGYWlyQm91bmRhcnk7CisgICAgdV9jaGFyICBsaW5rUXVhbGl0eUZhaXJQb29yQm91bmRhcnk7CisgICAgdV9jaGFyICBzcF91dGlsaXphdGlvbjsKKyAgICB1X2NoYXIgIHNwX2dvb2RuZXNzOworICAgIHVfY2hhciAgc3BfaG90aGVhZGNvdW50OworICAgIHVfY2hhciAgcm9hbWluZ19jb25kaXRpb247CisJCisgICAgbmV0X2FkZHIgc3A7CisgICAgdV9jaGFyICAgbnVtQVBzOworICAgIG5ldF9hZGRyIG5lYXJCeUFjY2Vzc1BvaW50c1tNQVhfRVNBXTsKK307CQorICAgCit0eXBlZGVmIHN0cnVjdCBuZXR3YXZlX3ByaXZhdGUgeworICAgIGRldl9saW5rX3QgbGluazsKKyAgICBzcGlubG9ja190CXNwaW5sb2NrOwkvKiBTZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBoYXJkd2FyZSAoU01QKSAqLworICAgIGRldl9ub2RlX3Qgbm9kZTsKKyAgICB1X2NoYXIgICAgIF9faW9tZW0gKnJhbUJhc2U7CisgICAgaW50ICAgICAgICB0aW1lb3V0Q291bnRlcjsKKyAgICBpbnQgICAgICAgIGxhc3RFeGVjOworICAgIHN0cnVjdCB0aW1lcl9saXN0ICAgICAgd2F0Y2hkb2c7CS8qIFRvIGF2b2lkIGJsb2NraW5nIHN0YXRlICovCisgICAgc3RydWN0IHNpdGVfc3VydmV5ICAgICBuc3M7CisgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisjaWZkZWYgV0lSRUxFU1NfRVhUCisgICAgc3RydWN0IGl3X3N0YXRpc3RpY3MgICBpd19zdGF0czsgICAgLyogV2lyZWxlc3Mgc3RhdHMgKi8KKyNlbmRpZgorfSBuZXR3YXZlX3ByaXZhdGU7CisKKyNpZmRlZiBORVRXQVZFX1NUQVRTCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldHdhdmVfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCisKKy8qCisgKiBUaGUgTmV0d2F2ZSBjYXJkIGlzIGxpdHRsZS1lbmRpYW4sIHNvIHdvbid0IHdvcmsgZm9yIGJpZyBlbmRpYW4KKyAqIHN5c3RlbXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgZ2V0X3VpbnQxNih1X2NoYXIgX19pb21lbSAqc3RhZGRyKSAKK3sKKyAgICByZXR1cm4gcmVhZHcoc3RhZGRyKTsgLyogUmV0dXJuIG9ubHkgMTYgYml0cyAqLworfQorCitzdGF0aWMgaW5saW5lIHNob3J0IGdldF9pbnQxNih1X2NoYXIgX19pb21lbSAqIHN0YWRkcikKK3sKKyAgICByZXR1cm4gcmVhZHcoc3RhZGRyKTsKK30KKworLyogCisgKiBXYWl0IHVudGlsIHRoZSBXT0MgKFdyaXRlIE9wZXJhdGlvbiBDb21wbGV0ZSkgYml0IGluIHRoZSAKKyAqIEFTUiAoQWRhcHRlciBTdGF0dXMgUmVnaXN0ZXIpIGlzIGFzc2VydGVkLiAKKyAqIFRoaXMgc2hvdWxkIGhhdmUgYWJvcnRlZCBpZiBpdCB0YWtlcyB0b28gbG9uZyB0aW1lLiAKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHdhaXRfV09DKHVuc2lnbmVkIGludCBpb2Jhc2UpCit7CisgICAgLyogU3BpbiBsb2NrICovCisgICAgd2hpbGUgKChpbmIoaW9iYXNlICsgTkVUV0FWRV9SRUdfQVNSKSAmIDB4OCkgIT0gMHg4KSA7IAorfQorCisjaWZkZWYgV0lSRUxFU1NfRVhUCitzdGF0aWMgdm9pZCBuZXR3YXZlX3NuYXBzaG90KG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiwgdV9jaGFyIF9faW9tZW0gKnJhbUJhc2UsIAorCQkJICAgICBraW9fYWRkcl90IGlvYmFzZSkgeworICAgIHVfc2hvcnQgcmVzdWx0QnVmZmVyOworCisgICAgLyogaWYgdGltZSBzaW5jZSBsYXN0IHNuYXBzaG90IGlzID4gMSBzZWMuICgxMDAgamlmZmllcz8pICB0aGVuIHRha2UgCisgICAgICogbmV3IHNuYXBzaG90LCBlbHNlIHJldHVybiBjYWNoZWQgZGF0YS4gVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgcmF0ZS4gIAorICAgICAqLworICAgIGlmICggamlmZmllcyAtIHByaXYtPmxhc3RFeGVjID4gMTAwKSB7IAorCS8qIFRha2Ugc2l0ZSBzdXJ2ZXkgIHNuYXBzaG90ICovIAorCS8qcHJpbnRrKCBLRVJOX0RFQlVHICJUYWtpbmcgbmV3IHNuYXBzaG90LiAlbGRcbiIsIGppZmZpZXMgLQorCSAgcHJpdi0+bGFzdEV4ZWMpOyAqLworCXdhaXRfV09DKGlvYmFzZSk7IAorCXdyaXRlYihORVRXQVZFX0NNRF9TU1MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsgCisJd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOyAKKwl3YWl0X1dPQyhpb2Jhc2UpOyAKKworCS8qIEdldCByZXN1bHQgYW5kIGNvcHkgdG8gY2FjaCAqLyAKKwlyZXN1bHRCdWZmZXIgPSByZWFkdyhyYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NSQlApOyAKKwljb3B5X2Zyb21fcGMoICZwcml2LT5uc3MsIHJhbUJhc2UrcmVzdWx0QnVmZmVyLCAKKwkJICAgICAgc2l6ZW9mKHN0cnVjdCBzaXRlX3N1cnZleSkpOyAKKyAgICB9IAorfQorI2VuZGlmCisKKyNpZmRlZiBXSVJFTEVTU19FWFQKKy8qCisgKiBGdW5jdGlvbiBuZXR3YXZlX2dldF93aXJlbGVzc19zdGF0cyAoZGV2KQorICoKKyAqICAgIFdpcmVsZXNzIGV4dGVuc2lvbnMgc3RhdGlzdGljcworICoKKyAqLworc3RhdGljIHN0cnVjdCBpd19zdGF0aXN0aWNzICpuZXR3YXZlX2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorewkKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGtpb19hZGRyX3QgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CisgICAgc3RydWN0IGl3X3N0YXRpc3RpY3MqIHdzdGF0czsKKwkKKyAgICB3c3RhdHMgPSAmcHJpdi0+aXdfc3RhdHM7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKyAgICBuZXR3YXZlX3NuYXBzaG90KCBwcml2LCByYW1CYXNlLCBpb2Jhc2UpOworCisgICAgd3N0YXRzLT5zdGF0dXMgPSBwcml2LT5uc3Mucm9hbWluZ19zdGF0ZTsKKyAgICB3c3RhdHMtPnF1YWwucXVhbCA9IHJlYWRiKCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX1NQQ1EpOyAKKyAgICB3c3RhdHMtPnF1YWwubGV2ZWwgPSByZWFkYiggcmFtQmFzZSArIE5FVFdBVkVfRVJFR19JU1BMUSk7CisgICAgd3N0YXRzLT5xdWFsLm5vaXNlID0gcmVhZGIoIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfU1BVKSAmIDB4M2Y7CisgICAgd3N0YXRzLT5kaXNjYXJkLm53aWQgPSAwTDsKKyAgICB3c3RhdHMtPmRpc2NhcmQuY29kZSA9IDBMOworICAgIHdzdGF0cy0+ZGlzY2FyZC5taXNjID0gMEw7CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOworICAgIAorICAgIHJldHVybiAmcHJpdi0+aXdfc3RhdHM7Cit9CisjZW5kaWYKKworLyoKKyAqIEZ1bmN0aW9uIG5ldHdhdmVfYXR0YWNoICh2b2lkKQorICoKKyAqICAgICBDcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZyBsb2NhbCBkYXRhIAorICogICAgIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQgd2l0aCBDYXJkIAorICogICAgIFNlcnZpY2VzLgorICoKKyAqICAgICBUaGUgZGV2X2xpbmsgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkKKyAqICAgICBjb25maWd1cmUgdGhlIGNhcmQgYXQgdGhpcyBwb2ludCAtLSB3ZSB3YWl0IHVudGlsIHdlIHJlY2VpdmUgYQorICogICAgIGNhcmQgaW5zZXJ0aW9uIGV2ZW50LgorICovCitzdGF0aWMgZGV2X2xpbmtfdCAqbmV0d2F2ZV9hdHRhY2godm9pZCkKK3sKKyAgICBjbGllbnRfcmVnX3QgY2xpZW50X3JlZzsKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgbmV0d2F2ZV9wcml2YXRlICpwcml2OworICAgIGludCByZXQ7CisgICAgCisgICAgREVCVUcoMCwgIm5ldHdhdmVfYXR0YWNoKClcbiIpOworICAgIAorICAgIC8qIEluaXRpYWxpemUgdGhlIGRldl9saW5rX3Qgc3RydWN0dXJlICovCisgICAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKG5ldHdhdmVfcHJpdmF0ZSkpOworICAgIGlmICghZGV2KQorCXJldHVybiBOVUxMOworICAgIHByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIGxpbmsgPSAmcHJpdi0+bGluazsKKyAgICBsaW5rLT5wcml2ID0gZGV2OworCisgICAgLyogVGhlIGlvIHN0cnVjdHVyZSBkZXNjcmliZXMgSU8gcG9ydCBtYXBwaW5nICovCisgICAgbGluay0+aW8uTnVtUG9ydHMxID0gMTY7CisgICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfMTY7CisgICAgLyogbGluay0+aW8uTnVtUG9ydHMyID0gMTY7IAorICAgICAgIGxpbmstPmlvLkF0dHJpYnV0ZXMyID0gSU9fREFUQV9QQVRIX1dJRFRIXzE2OyAqLworICAgIGxpbmstPmlvLklPQWRkckxpbmVzID0gNTsKKyAgICAKKyAgICAvKiBJbnRlcnJ1cHQgc2V0dXAgKi8KKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKKyAgICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisgICAgbGluay0+aXJxLkhhbmRsZXIgPSAmbmV0d2F2ZV9pbnRlcnJ1cHQ7CisgICAgCisgICAgLyogR2VuZXJhbCBzb2NrZXQgY29uZmlndXJhdGlvbiAqLworICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IENPTkZfRU5BQkxFX0lSUTsKKyAgICBsaW5rLT5jb25mLlZjYyA9IDUwOworICAgIGxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAxOworICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IFBSRVNFTlRfT1BUSU9OOworCisgICAgLyogTmV0d2F2ZSBwcml2YXRlIHN0cnVjdCBpbml0LiBsaW5rL2Rldi9ub2RlIGFscmVhZHkgdGFrZW4gY2FyZSBvZiwKKyAgICAgKiBvdGhlciBzdHVmZiB6ZXJvJ2QgLSBKZWFuIElJICovCisgICAgc3Bpbl9sb2NrX2luaXQoJnByaXYtPnNwaW5sb2NrKTsKKworICAgIC8qIE5ldHdhdmUgc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZSAqLworICAgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgICBkZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZuZXR3YXZlX3N0YXJ0X3htaXQ7CisgICAgZGV2LT5nZXRfc3RhdHMgID0gJm5ldHdhdmVfZ2V0X3N0YXRzOworICAgIGRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9tdWx0aWNhc3RfbGlzdDsKKyAgICAvKiB3aXJlbGVzcyBleHRlbnNpb25zICovCisjaWZkZWYgV0lSRUxFU1NfRVhUCisgICAgZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMgPSAmbmV0d2F2ZV9nZXRfd2lyZWxlc3Nfc3RhdHM7CisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKyAgICBkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSZuZXR3YXZlX2hhbmRsZXJfZGVmOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEyICovCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUICovCisgICAgZGV2LT5kb19pb2N0bCA9ICZuZXR3YXZlX2lvY3RsOworCisgICAgZGV2LT50eF90aW1lb3V0ID0gJm5ldHdhdmVfd2F0Y2hkb2c7CisgICAgZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisKKyAgICBkZXYtPm9wZW4gPSAmbmV0d2F2ZV9vcGVuOworICAgIGRldi0+c3RvcCA9ICZuZXR3YXZlX2Nsb3NlOworICAgIGxpbmstPmlycS5JbnN0YW5jZSA9IGRldjsKKyAgICAKKyAgICAvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisgICAgZGV2X2xpc3QgPSBsaW5rOworICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisgICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQorCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKwlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAorCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CisgICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJm5ldHdhdmVfZXZlbnQ7CisgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisgICAgaWYgKHJldCAhPSAwKSB7CisJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwluZXR3YXZlX2RldGFjaChsaW5rKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbGluazsKK30gLyogbmV0d2F2ZV9hdHRhY2ggKi8KKworLyoKKyAqIEZ1bmN0aW9uIG5ldHdhdmVfZGV0YWNoIChsaW5rKQorICoKKyAqICAgIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkCisgKiAgICB3aXRoIENhcmQgU2VydmljZXMuICBJZiBpdCBoYXMgYmVlbiByZWxlYXNlZCwgYWxsIGxvY2FsIGRhdGEKKyAqICAgIHN0cnVjdHVyZXMgYXJlIGZyZWVkLiAgT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGZyZWVkCisgKiAgICB3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCisgKi8KK3N0YXRpYyB2b2lkIG5ldHdhdmVfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgZGV2X2xpbmtfdCAqKmxpbmtwOworCisgICAgREVCVUcoMCwgIm5ldHdhdmVfZGV0YWNoKDB4JXApXG4iLCBsaW5rKTsKKyAgCisgICAgLyoKKwkgIElmIHRoZSBkZXZpY2UgaXMgY3VycmVudGx5IGNvbmZpZ3VyZWQgYW5kIGFjdGl2ZSwgd2Ugd29uJ3QKKwkgIGFjdHVhbGx5IGRlbGV0ZSBpdCB5ZXQuICBJbnN0ZWFkLCBpdCBpcyBtYXJrZWQgc28gdGhhdCB3aGVuCisJICB0aGUgcmVsZWFzZSgpIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhhdCB3aWxsIHRyaWdnZXIgYSBwcm9wZXIKKwkgIGRldGFjaCgpLgorCSovCisgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwluZXR3YXZlX3JlbGVhc2UobGluayk7CisJCisgICAgLyogQnJlYWsgdGhlIGxpbmsgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgaWYgKGxpbmstPmhhbmRsZSkKKwlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKyAgICAKKyAgICAvKiBMb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworICAgIGZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJaWYgKCpsaW5rcCA9PSBsaW5rKSBicmVhazsKKyAgICBpZiAoKmxpbmtwID09IE5VTEwpCisgICAgICB7CisJREVCVUcoMSwgIm5ldHdhdmVfY3M6IGRldGFjaCBmYWlsLCAnJXMnIG5vdCBpbiBsaXN0XG4iLAorCSAgICAgIGxpbmstPmRldi0+ZGV2X25hbWUpOworCXJldHVybjsKKyAgICAgIH0KKworICAgIC8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIHBpZWNlcyAqLworICAgICpsaW5rcCA9IGxpbmstPm5leHQ7CisgICAgaWYgKGxpbmstPmRldikgCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKyAgICBmcmVlX25ldGRldihkZXYpOworICAgIAorfSAvKiBuZXR3YXZlX2RldGFjaCAqLworCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBwcm90b2NvbCBuYW1lCisgKi8KK3N0YXRpYyBpbnQgbmV0d2F2ZV9nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlzdHJjcHkod3JxdS0+bmFtZSwgIk5ldHdhdmUiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgTmV0d29yayBJRAorICovCitzdGF0aWMgaW50IG5ldHdhdmVfc2V0X253aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlraW9fYWRkcl90IGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCW5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdV9jaGFyIF9faW9tZW0gKnJhbUJhc2UgPSBwcml2LT5yYW1CYXNlOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICYgc2F2ZSBmbGFncyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOworCisjaWYgV0lSRUxFU1NfRVhUID4gOAorCWlmKCF3cnF1LT5ud2lkLmRpc2FibGVkKSB7CisJICAgIGRvbWFpbiA9IHdycXUtPm53aWQudmFsdWU7CisjZWxzZQkvKiBXSVJFTEVTU19FWFQgPiA4ICovCisJaWYod3JxdS0+bndpZC5vbikgeworCSAgICBkb21haW4gPSB3cnF1LT5ud2lkLm53aWQ7CisjZW5kaWYJLyogV0lSRUxFU1NfRVhUID4gOCAqLworCSAgICBwcmludGsoIEtFUk5fREVCVUcgIlNldHRpbmcgZG9tYWluIHRvIDB4JXglMDJ4XG4iLCAKKwkJICAgIChkb21haW4gPj4gOCkgJiAweDAxLCBkb21haW4gJiAweGZmKTsKKwkgICAgd2FpdF9XT0MoaW9iYXNlKTsKKwkgICAgd3JpdGViKE5FVFdBVkVfQ01EX1NNRCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOworCSAgICB3cml0ZWIoIGRvbWFpbiAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKKwkgICAgd3JpdGViKChkb21haW4gPj44ICkgJiAweDAxLHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IrMik7CisJICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAzKTsKKwl9CisKKwkvKiBSZUVuYWJsZSBpbnRlcnJ1cHRzICYgcmVzdG9yZSBmbGFncyAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CisgICAgCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IE5ldHdvcmsgSUQKKyAqLworc3RhdGljIGludCBuZXR3YXZlX2dldF9ud2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworI2lmIFdJUkVMRVNTX0VYVCA+IDgKKwl3cnF1LT5ud2lkLnZhbHVlID0gZG9tYWluOworCXdycXUtPm53aWQuZGlzYWJsZWQgPSAwOworCXdycXUtPm53aWQuZml4ZWQgPSAxOworI2Vsc2UJLyogV0lSRUxFU1NfRVhUID4gOCAqLworCXdycXUtPm53aWQubndpZCA9IGRvbWFpbjsKKwl3cnF1LT5ud2lkLm9uID0gMTsKKyNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiA4ICovCisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgc2NyYW1ibGUga2V5CisgKi8KK3N0YXRpYyBpbnQgbmV0d2F2ZV9zZXRfc2NyYW1ibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkJY2hhciAqa2V5KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJa2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVfY2hhciBfX2lvbWVtICpyYW1CYXNlID0gcHJpdi0+cmFtQmFzZTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAmIHNhdmUgZmxhZ3MgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXNjcmFtYmxlX2tleSA9IChrZXlbMF0gPDwgOCkgfCBrZXlbMV07CisJd2FpdF9XT0MoaW9iYXNlKTsKKwl3cml0ZWIoTkVUV0FWRV9DTURfU1NLLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CisJd3JpdGViKHNjcmFtYmxlX2tleSAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKKwl3cml0ZWIoKHNjcmFtYmxlX2tleT4+OCkgJiAweGZmLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMik7CisJd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDMpOworCisJLyogUmVFbmFibGUgaW50ZXJydXB0cyAmIHJlc3RvcmUgZmxhZ3MgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOworICAgIAorCXJldHVybiAwOworfQorCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBzY3JhbWJsZSBrZXkKKyAqLworc3RhdGljIGludCBuZXR3YXZlX2dldF9zY3JhbWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCQljaGFyICprZXkpCit7CisJa2V5WzFdID0gc2NyYW1ibGVfa2V5ICYgMHhmZjsKKwlrZXlbMF0gPSAoc2NyYW1ibGVfa2V5Pj44KSAmIDB4ZmY7CisjaWYgV0lSRUxFU1NfRVhUID4gOAorCXdycXUtPmVuY29kaW5nLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJd3JxdS0+ZW5jb2RpbmcubGVuZ3RoID0gMjsKKyNlbHNlIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKwl3cnF1LT5lbmNvZGluZy5tZXRob2QgPSAxOworI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKworCXJldHVybiAwOworfQorCisjaWYgV0lSRUxFU1NfRVhUID4gOAorLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgbW9kZQorICovCitzdGF0aWMgaW50IG5ldHdhdmVfZ2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJaWYoZG9tYWluICYgMHgxMDApCisJCXdycXUtPm1vZGUgPSBJV19NT0RFX0lORlJBOworCWVsc2UKKwkJd3JxdS0+bW9kZSA9IElXX01PREVfQURIT0M7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiA4ICovCisKKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHJhbmdlIGluZm8KKyAqLworc3RhdGljIGludCBuZXR3YXZlX2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIFNldCB0aGUgbGVuZ3RoICh2ZXJ5IGltcG9ydGFudCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkgKi8KKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpOworCisJLyogU2V0IGFsbCB0aGUgaW5mbyB3ZSBkb24ndCBjYXJlIG9yIGRvbid0IGtub3cgYWJvdXQgdG8gemVybyAqLworCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSkpOworCisjaWYgV0lSRUxFU1NfRVhUID4gMTAKKwkvKiBTZXQgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbiB2ZXJzaW9ucyAqLworCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDk7CS8qIE5vdGhpbmcgZm9yIHVzIGluIHYxMCBhbmQgdjExICovCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTAgKi8KKwkJICAgCisJLyogU2V0IGluZm9ybWF0aW9uIGluIHRoZSByYW5nZSBzdHJ1Y3QgKi8KKwlyYW5nZS0+dGhyb3VnaHB1dCA9IDQ1MCAqIDEwMDA7CS8qIGRvbid0IGFyZ3VlIG9uIHRoaXMgISAqLworCXJhbmdlLT5taW5fbndpZCA9IDB4MDAwMDsKKwlyYW5nZS0+bWF4X253aWQgPSAweDAxRkY7CisKKwlyYW5nZS0+bnVtX2NoYW5uZWxzID0gcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSAwOworCQkgICAKKwlyYW5nZS0+c2Vuc2l0aXZpdHkgPSAweDNGOworCXJhbmdlLT5tYXhfcXVhbC5xdWFsID0gMjU1OworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDI1NTsKKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOworCQkgICAKKyNpZiBXSVJFTEVTU19FWFQgPiA3CisJcmFuZ2UtPm51bV9iaXRyYXRlcyA9IDE7CisJcmFuZ2UtPmJpdHJhdGVbMF0gPSAxMDAwMDAwOwkvKiAxIE1iL3MgKi8KKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA3ICovCisKKyNpZiBXSVJFTEVTU19FWFQgPiA4CisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSAyOwkJLyogMTYgYml0cyBzY3JhbWJsaW5nICovCisJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDE7CisJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSAxOwkvKiBPbmx5IG9uZSBrZXkgcG9zc2libGUgKi8KKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA4ICovCisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogV2lyZWxlc3MgUHJpdmF0ZSBIYW5kbGVyIDogZ2V0IHNuYXBzaG90CisgKi8KK3N0YXRpYyBpbnQgbmV0d2F2ZV9nZXRfc25hcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWtpb19hZGRyX3QgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgJiBzYXZlIGZsYWdzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBUYWtlIHNuYXBzaG90IG9mIGVudmlyb25tZW50ICovCisJbmV0d2F2ZV9zbmFwc2hvdCggcHJpdiwgcmFtQmFzZSwgaW9iYXNlKTsKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHByaXYtPm5zcy5sZW5ndGg7CisJbWVtY3B5KGV4dHJhLCAodV9jaGFyICopICZwcml2LT5uc3MsIHNpemVvZiggc3RydWN0IHNpdGVfc3VydmV5KSk7CisKKwlwcml2LT5sYXN0RXhlYyA9IGppZmZpZXM7CisKKwkvKiBSZUVuYWJsZSBpbnRlcnJ1cHRzICYgcmVzdG9yZSBmbGFncyAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CisgICAgCisJcmV0dXJuKDApOworfQorCisvKgorICogU3RydWN0dXJlcyB0byBleHBvcnQgdGhlIFdpcmVsZXNzIEhhbmRsZXJzCisgKiAgICAgVGhpcyBpcyB0aGUgc3R1ZmYgdGhhdCBhcmUgdHJlYXRlZCB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9ucyAoaXdjb25maWcpCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3MgbmV0d2F2ZV9wcml2YXRlX2FyZ3NbXSA9IHsKKy8qeyBjbWQsICAgICAgICAgc2V0X2FyZ3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9hcmdzLCBuYW1lIH0gKi8KKyAgeyBTSU9DR0lQU05BUCwgMCwgCisgICAgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCBzaXplb2Yoc3RydWN0IHNpdGVfc3VydmV5KSwgCisgICAgImdldHNpdGVzdXJ2ZXkiIH0sCit9OworCisjaWYgV0lSRUxFU1NfRVhUID4gMTIKKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJCW5ldHdhdmVfaGFuZGxlcltdID0KK3sKKwlOVUxMLAkJCQkvKiBTSU9DU0lXTkFNRSAqLworCW5ldHdhdmVfZ2V0X25hbWUsCQkvKiBTSU9DR0lXTkFNRSAqLworCW5ldHdhdmVfc2V0X253aWQsCQkvKiBTSU9DU0lXTldJRCAqLworCW5ldHdhdmVfZ2V0X253aWQsCQkvKiBTSU9DR0lXTldJRCAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdGUkVRICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV0ZSRVEgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXTU9ERSAqLworCW5ldHdhdmVfZ2V0X21vZGUsCQkvKiBTSU9DR0lXTU9ERSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdTRU5TICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV1NFTlMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXUkFOR0UgKi8KKwluZXR3YXZlX2dldF9yYW5nZSwJCS8qIFNJT0NHSVdSQU5HRSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdQUklWICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV1BSSVYgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXU1RBVFMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXU1RBVFMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXU1BZICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV1NQWSAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV0FQICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV0FQICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdBUExJU1QgKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdFU1NJRCAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdFU1NJRCAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdOSUNLTiAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdOSUNLTiAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1JBVEUgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUkFURSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSVFMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUlRTICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV0ZSQUcgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXRlJBRyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdUWFBPVyAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdUWFBPVyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSRVRSWSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdSRVRSWSAqLworCW5ldHdhdmVfc2V0X3NjcmFtYmxlLAkJLyogU0lPQ1NJV0VOQ09ERSAqLworCW5ldHdhdmVfZ2V0X3NjcmFtYmxlLAkJLyogU0lPQ0dJV0VOQ09ERSAqLworfTsKKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJCW5ldHdhdmVfcHJpdmF0ZV9oYW5kbGVyW10gPQoreworCU5VTEwsCQkJCS8qIFNJT0NJV0ZJUlNUUFJJViAqLworCW5ldHdhdmVfZ2V0X3NuYXAsCQkvKiBTSU9DSVdGSVJTVFBSSVYgKyAxICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmCW5ldHdhdmVfaGFuZGxlcl9kZWYgPQoreworCS5udW1fc3RhbmRhcmQJPSBzaXplb2YobmV0d2F2ZV9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlCT0gc2l6ZW9mKG5ldHdhdmVfcHJpdmF0ZV9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlX2FyZ3MgPSBzaXplb2YobmV0d2F2ZV9wcml2YXRlX2FyZ3MpL3NpemVvZihzdHJ1Y3QgaXdfcHJpdl9hcmdzKSwKKwkuc3RhbmRhcmQJPSAoaXdfaGFuZGxlciAqKSBuZXR3YXZlX2hhbmRsZXIsCisJLnByaXZhdGUJPSAoaXdfaGFuZGxlciAqKSBuZXR3YXZlX3ByaXZhdGVfaGFuZGxlciwKKwkucHJpdmF0ZV9hcmdzCT0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKikgbmV0d2F2ZV9wcml2YXRlX2FyZ3MsCit9OworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEyICovCisKKy8qCisgKiBGdW5jdGlvbiBuZXR3YXZlX2lvY3RsIChkZXYsIHJxLCBjbWQpCisgKgorICogICAgIFBlcmZvcm0gaW9jdGwgOiBjb25maWcgJiBpbmZvIHN0dWZmCisgKiAgICAgVGhpcyBpcyB0aGUgc3R1ZmYgdGhhdCBhcmUgdHJlYXRlZCB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9ucyAoaXdjb25maWcpCisgKgorICovCitzdGF0aWMgaW50IG5ldHdhdmVfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgLyogaW9jdGwgZGV2aWNlICovCisJCQkgc3RydWN0IGlmcmVxICpycSwJIC8qIERhdGEgcGFzc2VkICovCisJCQkgaW50CWNtZCkJICAgICAvKiBJb2N0bCBudW1iZXIgKi8KK3sKKyAgICBpbnQJCQlyZXQgPSAwOworI2lmZGVmIFdJUkVMRVNTX0VYVAorI2lmIFdJUkVMRVNTX0VYVCA8PSAxMgorICAgIHN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKKyNlbmRpZgorI2VuZGlmCisJCisgICAgREVCVUcoMCwgIiVzOiAtPm5ldHdhdmVfaW9jdGwoY21kPTB4JVgpXG4iLCBkZXYtPm5hbWUsIGNtZCk7CisJCisgICAgLyogTG9vayB3aGF0IGlzIHRoZSByZXF1ZXN0ICovCisgICAgc3dpdGNoKGNtZCkgeworCS8qIC0tLS0tLS0tLS0tLS0tLSBXSVJFTEVTUyBFWFRFTlNJT05TIC0tLS0tLS0tLS0tLS0tLSAqLworI2lmZGVmIFdJUkVMRVNTX0VYVAorI2lmIFdJUkVMRVNTX0VYVCA8PSAxMgorICAgIGNhc2UgU0lPQ0dJV05BTUU6CisJbmV0d2F2ZV9nZXRfbmFtZShkZXYsIE5VTEwsICYod3JxLT51KSwgTlVMTCk7CisJYnJlYWs7CisgICAgY2FzZSBTSU9DU0lXTldJRDoKKwlyZXQgPSBuZXR3YXZlX3NldF9ud2lkKGRldiwgTlVMTCwgJih3cnEtPnUpLCBOVUxMKTsKKwlicmVhazsKKyAgICBjYXNlIFNJT0NHSVdOV0lEOgorCXJldCA9IG5ldHdhdmVfZ2V0X253aWQoZGV2LCBOVUxMLCAmKHdycS0+dSksIE5VTEwpOworCWJyZWFrOworI2lmIFdJUkVMRVNTX0VYVCA+IDgJLyogTm90ZSA6IFRoZSBBUEkgZGlkIGNoYW5nZS4uLiAqLworICAgIGNhc2UgU0lPQ0dJV0VOQ09ERToKKwkvKiBHZXQgc2NyYW1ibGUga2V5ICovCisJaWYod3JxLT51LmVuY29kaW5nLnBvaW50ZXIgIT0gKGNhZGRyX3QpIDApCisJICB7CisJICAgIGNoYXIJa2V5WzJdOworCSAgICByZXQgPSBuZXR3YXZlX2dldF9zY3JhbWJsZShkZXYsIE5VTEwsICYod3JxLT51KSwga2V5KTsKKwkgICAgaWYoY29weV90b191c2VyKHdycS0+dS5lbmNvZGluZy5wb2ludGVyLCBrZXksIDIpKQorCSAgICAgIHJldCA9IC1FRkFVTFQ7CisJICB9CisJYnJlYWs7CisgICAgY2FzZSBTSU9DU0lXRU5DT0RFOgorCS8qIFNldCAgc2NyYW1ibGUga2V5ICovCisJaWYod3JxLT51LmVuY29kaW5nLnBvaW50ZXIgIT0gKGNhZGRyX3QpIDApCisJICB7CisJICAgIGNoYXIJa2V5WzJdOworCSAgICBpZihjb3B5X2Zyb21fdXNlcihrZXksIHdycS0+dS5lbmNvZGluZy5wb2ludGVyLCAyKSkKKwkgICAgICB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCSAgICAgIH0KKwkgICAgcmV0ID0gbmV0d2F2ZV9zZXRfc2NyYW1ibGUoZGV2LCBOVUxMLCAmKHdycS0+dSksIGtleSk7CisJICB9CisJYnJlYWs7CisgICAgY2FzZSBTSU9DR0lXTU9ERToKKwkvKiBNb2RlIG9mIG9wZXJhdGlvbiAqLworCXJldCA9IG5ldHdhdmVfZ2V0X21vZGUoZGV2LCBOVUxMLCAmKHdycS0+dSksIE5VTEwpOworCWJyZWFrOworI2Vsc2UgLyogV0lSRUxFU1NfRVhUID4gOCAqLworICAgIGNhc2UgU0lPQ0dJV0VOQ09ERToKKwkvKiBHZXQgc2NyYW1ibGUga2V5ICovCisJcmV0ID0gbmV0d2F2ZV9nZXRfc2NyYW1ibGUoZGV2LCBOVUxMLCAmKHdycS0+dSksCisJCQkJICAgKGNoYXIgKikgJndycS0+dS5lbmNvZGluZy5jb2RlKTsKKwlicmVhazsKKyAgICBjYXNlIFNJT0NTSVdFTkNPREU6CisJLyogU2V0ICBzY3JhbWJsZSBrZXkgKi8KKwlyZXQgPSBuZXR3YXZlX3NldF9zY3JhbWJsZShkZXYsIE5VTEwsICYod3JxLT51KSwKKwkJCQkgICAoY2hhciAqKSAmd3JxLT51LmVuY29kaW5nLmNvZGUpOworCWJyZWFrOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKyAgIGNhc2UgU0lPQ0dJV1JBTkdFOgorICAgICAgIC8qIEJhc2ljIGNoZWNraW5nLi4uICovCisgICAgICAgaWYod3JxLT51LmRhdGEucG9pbnRlciAhPSAoY2FkZHJfdCkgMCkgeworICAgICAgICAgICBzdHJ1Y3QgaXdfcmFuZ2UgcmFuZ2U7CisJICAgcmV0ID0gbmV0d2F2ZV9nZXRfcmFuZ2UoZGV2LCBOVUxMLCAmKHdycS0+dSksIChjaGFyICopICZyYW5nZSk7CisJICAgaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcmFuZ2UsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSkpKQorCSAgICAgICByZXQgPSAtRUZBVUxUOworICAgICAgIH0KKyAgICAgICBicmVhazsKKyAgICBjYXNlIFNJT0NHSVdQUklWOgorCS8qIEJhc2ljIGNoZWNraW5nLi4uICovCisJaWYod3JxLT51LmRhdGEucG9pbnRlciAhPSAoY2FkZHJfdCkgMCkgeworCSAgICAvKiBTZXQgdGhlIG51bWJlciBvZiBpb2N0bCBhdmFpbGFibGUgKi8KKwkgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKG5ldHdhdmVfcHJpdmF0ZV9hcmdzKSAvIHNpemVvZihuZXR3YXZlX3ByaXZhdGVfYXJnc1swXSk7CisJCQkKKwkgICAgLyogQ29weSBzdHJ1Y3R1cmUgdG8gdGhlIHVzZXIgYnVmZmVyICovCisJICAgIGlmKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLAorCQkJICAgICh1X2NoYXIgKikgbmV0d2F2ZV9wcml2YXRlX2FyZ3MsCisJCQkgICAgc2l6ZW9mKG5ldHdhdmVfcHJpdmF0ZV9hcmdzKSkpCisJICAgICAgcmV0ID0gLUVGQVVMVDsKKwl9IAorCWJyZWFrOworICAgIGNhc2UgU0lPQ0dJUFNOQVA6CisJaWYod3JxLT51LmRhdGEucG9pbnRlciAhPSAoY2FkZHJfdCkgMCkgeworCSAgICBjaGFyIGJ1ZmZlcltzaXplb2YoIHN0cnVjdCBzaXRlX3N1cnZleSldOworCSAgICByZXQgPSBuZXR3YXZlX2dldF9zbmFwKGRldiwgTlVMTCwgJih3cnEtPnUpLCBidWZmZXIpOworCSAgICAvKiBDb3B5IHN0cnVjdHVyZSB0byB0aGUgdXNlciBidWZmZXIgKi8KKwkgICAgaWYoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIAorCQkJICAgIGJ1ZmZlciwKKwkJCSAgICBzaXplb2YoIHN0cnVjdCBzaXRlX3N1cnZleSkpKQorCSAgICAgIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkJhZCBidWZmZXIhXG4iKTsKKwkJYnJlYWs7CisJICAgICAgfQorCX0KKwlicmVhazsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPD0gMTIgKi8KKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgKi8KKyAgICBkZWZhdWx0OgorCXJldCA9IC1FT1BOT1RTVVBQOworICAgIH0KKwkKKyAgICByZXR1cm4gcmV0OworfQorCisvKgorICogRnVuY3Rpb24gbmV0d2F2ZV9wY21jaWFfY29uZmlnIChsaW5rKQorICoKKyAqICAgICBuZXR3YXZlX3BjbWNpYV9jb25maWcoKSBpcyBzY2hlZHVsZWQgdG8gcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gCisgKiAgICAgZXZlbnQgaXMgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlCisgKiAgICAgZGV2aWNlIGF2YWlsYWJsZSB0byB0aGUgc3lzdGVtLiAKKyAqCisgKi8KKworI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBcCitkbyB7IGxhc3RfZm4gPSAoZm4pOyBpZiAoKGxhc3RfcmV0ID0gKHJldCkpICE9IDApIGdvdG8gY3NfZmFpbGVkOyB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBuZXR3YXZlX3BjbWNpYV9jb25maWcoZGV2X2xpbmtfdCAqbGluaykgeworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisgICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB0dXBsZV90IHR1cGxlOworICAgIGNpc3BhcnNlX3QgcGFyc2U7CisgICAgaW50IGksIGosIGxhc3RfcmV0LCBsYXN0X2ZuOworICAgIHVfY2hhciBidWZbNjRdOworICAgIHdpbl9yZXFfdCByZXE7CisgICAgbWVtcmVxX3QgbWVtOworICAgIHVfY2hhciBfX2lvbWVtICpyYW1CYXNlID0gTlVMTDsKKworICAgIERFQlVHKDAsICJuZXR3YXZlX3BjbWNpYV9jb25maWcoMHglcClcbiIsIGxpbmspOworCisgICAgLyoKKyAgICAgIFRoaXMgcmVhZHMgdGhlIGNhcmQncyBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMgY29uZmlndXJhdGlvbgorICAgICAgcmVnaXN0ZXJzLgorICAgICovCisgICAgdHVwbGUuQXR0cmlidXRlcyA9IDA7CisgICAgdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKSBidWY7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7CisgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CisKKyAgICAvKiBDb25maWd1cmUgY2FyZCAqLworICAgIGxpbmstPnN0YXRlIHw9IERFVl9DT05GSUc7CisKKyAgICAvKgorICAgICAqICBUcnkgYWxsb2NhdGluZyBJTyBwb3J0cy4gIFRoaXMgdHJpZXMgYSBmZXcgZml4ZWQgYWRkcmVzc2VzLgorICAgICAqICBJZiB5b3Ugd2FudCwgeW91IGNhbiBhbHNvIHJlYWQgdGhlIGNhcmQncyBjb25maWcgdGFibGUgdG8KKyAgICAgKiAgcGljayBhZGRyZXNzZXMgLS0gc2VlIHRoZSBzZXJpYWwgZHJpdmVyIGZvciBhbiBleGFtcGxlLgorICAgICAqLworICAgIGZvciAoaSA9IGogPSAweDA7IGogPCAweDQwMDsgaiArPSAweDIwKSB7CisJbGluay0+aW8uQmFzZVBvcnQxID0gaiBeIDB4MzAwOworCWkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJaWYgKGkgPT0gQ1NfU1VDQ0VTUykgYnJlYWs7CisgICAgfQorICAgIGlmIChpICE9IENTX1NVQ0NFU1MpIHsKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIFJlcXVlc3RJTywgaSk7CisJZ290byBmYWlsZWQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgTm93IGFsbG9jYXRlIGFuIGludGVycnVwdCBsaW5lLiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QKKyAgICAgKiAgYWN0dWFsbHkgYXNzaWduIGEgaGFuZGxlciB0byB0aGUgaW50ZXJydXB0LgorICAgICAqLworICAgIENTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShoYW5kbGUsICZsaW5rLT5pcnEpKTsKKworICAgIC8qCisgICAgICogIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwCisgICAgICogIHRoZSBJL08gd2luZG93cyBhbmQgdGhlIGludGVycnVwdCBtYXBwaW5nLgorICAgICAqLworICAgIENTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLCBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uKGhhbmRsZSwgJmxpbmstPmNvbmYpKTsKKworICAgIC8qCisgICAgICogIEFsbG9jYXRlIGEgMzJLIG1lbW9yeSB3aW5kb3cuICBOb3RlIHRoYXQgdGhlIGRldl9saW5rX3QKKyAgICAgKiAgc3RydWN0dXJlIHByb3ZpZGVzIHNwYWNlIGZvciBvbmUgd2luZG93IGhhbmRsZSAtLSBpZiB5b3VyCisgICAgICogIGRldmljZSBuZWVkcyBzZXZlcmFsIHdpbmRvd3MsIHlvdSdsbCBuZWVkIHRvIGtlZXAgdHJhY2sgb2YKKyAgICAgKiAgdGhlIGhhbmRsZXMgaW4geW91ciBwcml2YXRlIGRhdGEgc3RydWN0dXJlLCBkZXYtPnByaXYuCisgICAgICovCisgICAgREVCVUcoMSwgIlNldHRpbmcgbWVtIHNwZWVkIG9mICVkXG4iLCBtZW1fc3BlZWQpOworCisgICAgcmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF84fFdJTl9NRU1PUllfVFlQRV9DTXxXSU5fRU5BQkxFOworICAgIHJlcS5CYXNlID0gMDsgcmVxLlNpemUgPSAweDgwMDA7CisgICAgcmVxLkFjY2Vzc1NwZWVkID0gbWVtX3NwZWVkOworICAgIENTX0NIRUNLKFJlcXVlc3RXaW5kb3csIHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluay0+aGFuZGxlLCAmcmVxLCAmbGluay0+d2luKSk7CisgICAgbWVtLkNhcmRPZmZzZXQgPSAweDIwMDAwOyBtZW0uUGFnZSA9IDA7IAorICAgIENTX0NIRUNLKE1hcE1lbVBhZ2UsIHBjbWNpYV9tYXBfbWVtX3BhZ2UobGluay0+d2luLCAmbWVtKSk7CisKKyAgICAvKiBTdG9yZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNvbW1vbiB3aW5kb3cgZnJhbWUgKi8KKyAgICByYW1CYXNlID0gaW9yZW1hcChyZXEuQmFzZSwgMHg4MDAwKTsKKyAgICBwcml2LT5yYW1CYXNlID0gcmFtQmFzZTsKKworICAgIGRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworICAgIGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworICAgIFNFVF9ORVRERVZfREVWKGRldiwgJmhhbmRsZV90b19kZXYoaGFuZGxlKSk7CisKKyAgICBpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgIT0gMCkgeworCXByaW50ayhLRVJOX0RFQlVHICJuZXR3YXZlX2NzOiByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWRcbiIpOworCWdvdG8gZmFpbGVkOworICAgIH0KKworICAgIHN0cmNweShwcml2LT5ub2RlLmRldl9uYW1lLCBkZXYtPm5hbWUpOworICAgIGxpbmstPmRldiA9ICZwcml2LT5ub2RlOworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisKKyAgICAvKiBSZXNldCBjYXJkIGJlZm9yZSByZWFkaW5nIHBoeXNpY2FsIGFkZHJlc3MgKi8KKyAgICBuZXR3YXZlX2RvcmVzZXQoZGV2LT5iYXNlX2FkZHIsIHJhbUJhc2UpOworCisgICAgLyogUmVhZCB0aGUgZXRoZXJuZXQgYWRkcmVzcyBhbmQgZmlsbCBpbiB0aGUgTmV0d2F2ZSByZWdpc3RlcnMuICovCisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgCisJZGV2LT5kZXZfYWRkcltpXSA9IHJlYWRiKHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfUEEgKyBpKTsKKworICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiBOZXR3YXZlOiBwb3J0ICUjM2x4LCBpcnEgJWQsIG1lbSAlbHggaWQgIgorCSAgICIlYyVjLCBod19hZGRyICIsIGRldi0+bmFtZSwgZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxLAorCSAgICh1X2xvbmcpIHJhbUJhc2UsIChpbnQpIHJlYWRiKHJhbUJhc2UrTkVUV0FWRV9FUkVHX05JKSwKKwkgICAoaW50KSByZWFkYihyYW1CYXNlK05FVFdBVkVfRVJFR19OSSsxKSk7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwlwcmludGsoIiUwMlglcyIsIGRldi0+ZGV2X2FkZHJbaV0sICgoaTw1KSA/ICI6IiA6ICJcbiIpKTsKKworICAgIC8qIGdldCByZXZpc2lvbiB3b3JkcyAqLworICAgIHByaW50ayhLRVJOX0RFQlVHICJOZXR3YXZlX3Jlc2V0OiByZXZpc2lvbiAlMDR4ICUwNHhcbiIsIAorCSAgIGdldF91aW50MTYocmFtQmFzZSArIE5FVFdBVkVfRVJFR19BUlcpLAorCSAgIGdldF91aW50MTYocmFtQmFzZSArIE5FVFdBVkVfRVJFR19BUlcrMikpOworICAgIHJldHVybjsKKworY3NfZmFpbGVkOgorICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgbGFzdF9mbiwgbGFzdF9yZXQpOworZmFpbGVkOgorICAgIG5ldHdhdmVfcmVsZWFzZShsaW5rKTsKK30gLyogbmV0d2F2ZV9wY21jaWFfY29uZmlnICovCisKKy8qCisgKiBGdW5jdGlvbiBuZXR3YXZlX3JlbGVhc2UgKGFyZykKKyAqCisgKiAgICBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgbmV0d2F2ZV9yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZSBuZXQKKyAqICAgIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICogICAgc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCisgKi8KK3N0YXRpYyB2b2lkIG5ldHdhdmVfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKyAgICBERUJVRygwLCAibmV0d2F2ZV9yZWxlYXNlKDB4JXApXG4iLCBsaW5rKTsKKworICAgIC8qIERvbid0IGJvdGhlciBjaGVja2luZyB0byBzZWUgaWYgdGhlc2Ugc3VjY2VlZCBvciBub3QgKi8KKyAgICBpZiAobGluay0+d2luKSB7CisJaW91bm1hcChwcml2LT5yYW1CYXNlKTsKKwlwY21jaWFfcmVsZWFzZV93aW5kb3cobGluay0+d2luKTsKKyAgICB9CisgICAgcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworICAgIHBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgICBwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworfQorCisvKgorICogRnVuY3Rpb24gbmV0d2F2ZV9ldmVudCAoZXZlbnQsIHByaW9yaXR5LCBhcmdzKQorICoKKyAqICAgIFRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiAgTW9zdGx5LCB0aGlzIHNjaGVkdWxlcyBvdGhlcgorICogICAgc3R1ZmYgdG8gcnVuIGFmdGVyIGFuIGV2ZW50IGlzIHJlY2VpdmVkLiAgQSBDQVJEX1JFTU9WQUwgZXZlbnQKKyAqICAgIGFsc28gc2V0cyBzb21lIGZsYWdzIHRvIGRpc2NvdXJhZ2UgdGhlIG5ldCBkcml2ZXJzIGZyb20gdHJ5aW5nCisgKiAgICB0byB0YWxrIHRvIHRoZSBjYXJkIGFueSBtb3JlLgorICoKKyAqICAgIFdoZW4gYSBDQVJEX1JFTU9WQUwgZXZlbnQgaXMgcmVjZWl2ZWQsIHdlIGltbWVkaWF0ZWx5IHNldCBhIGZsYWcKKyAqICAgIHRvIGJsb2NrIGZ1dHVyZSBhY2Nlc3NlcyB0byB0aGlzIGRldmljZS4gIEFsbCB0aGUgZnVuY3Rpb25zIHRoYXQKKyAqICAgIGFjdHVhbGx5IGFjY2VzcyB0aGUgZGV2aWNlIHNob3VsZCBjaGVjayB0aGlzIGZsYWcgdG8gbWFrZSBzdXJlCisgKiAgICB0aGUgY2FyZCBpcyBzdGlsbCBwcmVzZW50LgorICoKKyAqLworc3RhdGljIGludCBuZXR3YXZlX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwKKwkJCSBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCit7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCQorICAgIERFQlVHKDEsICJuZXR3YXZlX2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKyAgCisgICAgc3dpdGNoIChldmVudCkgeworICAgIGNhc2UgQ1NfRVZFTlRfUkVHSVNUUkFUSU9OX0NPTVBMRVRFOgorCURFQlVHKDAsICJuZXR3YXZlX2NzOiByZWdpc3RyYXRpb24gY29tcGxldGVcbiIpOworCWJyZWFrOworCisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkgICAgbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCSAgICBuZXR3YXZlX3JlbGVhc2UobGluayk7CisJfQorCWJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJbmV0d2F2ZV9wY21jaWFfY29uZmlnKCBsaW5rKTsKKwlicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIGlmIChsaW5rLT5vcGVuKQorCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwl9CisJYnJlYWs7CisgICAgY2FzZSBDU19FVkVOVF9QTV9SRVNVTUU6CisJbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisJICAgIGlmIChsaW5rLT5vcGVuKSB7CisJCW5ldHdhdmVfcmVzZXQoZGV2KTsKKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCSAgICB9CisJfQorCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30gLyogbmV0d2F2ZV9ldmVudCAqLworCisvKgorICogRnVuY3Rpb24gbmV0d2F2ZV9kb3Jlc2V0IChpb0Jhc2UsIHJhbUJhc2UpCisgKgorICogICAgUHJvcGVyIGhhcmR3YXJlIHJlc2V0IG9mIHRoZSBjYXJkLgorICovCitzdGF0aWMgdm9pZCBuZXR3YXZlX2RvcmVzZXQoa2lvX2FkZHJfdCBpb0Jhc2UsIHVfY2hhciBfX2lvbWVtICpyYW1CYXNlKQoreworICAgIC8qIFJlc2V0IGNhcmQgKi8KKyAgICB3YWl0X1dPQyhpb0Jhc2UpOworICAgIG91dGIoMHg4MCwgaW9CYXNlICsgTkVUV0FWRV9SRUdfUE1SKTsKKyAgICB3cml0ZWIoMHgwOCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19BU0NDKTsgLyogQml0IDMgaXMgV09DICovCisgICAgb3V0YigweDAsIGlvQmFzZSArIE5FVFdBVkVfUkVHX1BNUik7IC8qIHJlbGVhc2UgcmVzZXQgKi8KK30KKworLyoKKyAqIEZ1bmN0aW9uIG5ldHdhdmVfcmVzZXQgKGRldikKKyAqCisgKiAgICBSZXNldCBhbmQgcmVzdG9yZSBhbGwgb2YgdGhlIG5ldHdhdmUgcmVnaXN0ZXJzIAorICovCitzdGF0aWMgdm9pZCBuZXR3YXZlX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKyAgICAvKiB1X2NoYXIgc3RhdGU7ICovCisgICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICB1X2NoYXIgX19pb21lbSAqcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CisgICAga2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIERFQlVHKDAsICJuZXR3YXZlX3Jlc2V0OiBEb25lIHdpdGggaGFyZHdhcmUgcmVzZXRcbiIpOworCisgICAgcHJpdi0+dGltZW91dENvdW50ZXIgPSAwOworCisgICAgLyogUmVzZXQgY2FyZCAqLworICAgIG5ldHdhdmVfZG9yZXNldChpb2Jhc2UsIHJhbUJhc2UpOworICAgIHByaW50ayhLRVJOX0RFQlVHICJuZXR3YXZlX3Jlc2V0OiBEb25lIHdpdGggaGFyZHdhcmUgcmVzZXRcbiIpOworCQorICAgIC8qIFdyaXRlIGEgTk9QIHRvIGNoZWNrIHRoZSBjYXJkICovCisgICAgd2FpdF9XT0MoaW9iYXNlKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfTk9QLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CisgICAgd3JpdGViKE5FVFdBVkVfQ01EX0VPQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOworCQorICAgIC8qIFNldCByZWNlaXZlIGNvbmYgKi8KKyAgICB3YWl0X1dPQyhpb2Jhc2UpOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9TUkMsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKKyAgICB3cml0ZWIocnhDb25mUnhFbmEgKyByeENvbmZCY2FzdCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAyKTsKKyAgICAKKyAgICAvKiBTZXQgdHJhbnNtaXQgY29uZiAqLworICAgIHdhaXRfV09DKGlvYmFzZSk7CisgICAgd3JpdGViKE5FVFdBVkVfQ01EX1NUQywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOworICAgIHdyaXRlYih0eENvbmZUeEVuYSwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAyKTsKKyAgICAKKyAgICAvKiBOb3cgc2V0IHRoZSBNVSBEb21haW4gKi8KKyAgICBwcmludGsoS0VSTl9ERUJVRyAiU2V0dGluZyBkb21haW4gdG8gMHgleCUwMnhcbiIsIChkb21haW4gPj4gOCkgJiAweDAxLCBkb21haW4gJiAweGZmKTsKKyAgICB3YWl0X1dPQyhpb2Jhc2UpOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9TTUQsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKKyAgICB3cml0ZWIoZG9tYWluICYgMHhmZiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOworICAgIHdyaXRlYigoZG9tYWluPj44KSAmIDB4MDEsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAyKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMyk7CisJCisgICAgLyogU2V0IHNjcmFtYmxlIGtleSAqLworICAgIHByaW50ayhLRVJOX0RFQlVHICJTZXR0aW5nIHNjcmFtYmxlIGtleSB0byAweCV4XG4iLCBzY3JhbWJsZV9rZXkpOworICAgIHdhaXRfV09DKGlvYmFzZSk7CisgICAgd3JpdGViKE5FVFdBVkVfQ01EX1NTSywgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOworICAgIHdyaXRlYihzY3JhbWJsZV9rZXkgJiAweGZmLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CisgICAgd3JpdGViKChzY3JhbWJsZV9rZXk+PjgpICYgMHhmZiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDIpOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAzKTsKKworICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzLCBiaXQgNCBoaWdoIHRvIGtlZXAgdW51c2VkCisgICAgICogc291cmNlIGZyb20gaW50ZXJydXB0aW5nIHVzLCBiaXQgMiBoaWdoIHRvIAorICAgICAqIHNldCBpbnRlcnJ1cHQgZW5hYmxlLCA1NjcgdG8gZW5hYmxlIFR4RE4sIAorICAgICAqIFJ4RXJyIGFuZCBSeFJkeQorICAgICAqLworICAgIHdhaXRfV09DKGlvYmFzZSk7CisgICAgb3V0YihpbXJDb25mSUVOQStpbXJDb25mUkZVMSwgaW9iYXNlICsgTkVUV0FWRV9SRUdfSU1SKTsKKworICAgIC8qIEhlbnQgNCBieXRlcyBmcmEgMHgxNzAuIFNrYWwgdmFlcmUgMGEsMjksODgsMzYKKyAgICAgKiB3YWl0V09DCisgICAgICogc2tyaXYgODAgdGlsIGQwMDA6MzY4OAorICAgICAqIHNqZWtrIG9tIGRldCBibGUgODAKKyAgICAgKi8KKyAgICAKKyAgICAvKiBFbmFibGUgUmVjZWl2ZXIgKi8KKyAgICB3YWl0X1dPQyhpb2Jhc2UpOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9FUiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOworICAgIHdyaXRlYihORVRXQVZFX0NNRF9FT0MsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKKwkKKyAgICAvKiBTZXQgdGhlIElFTkEgYml0IGluIENPUiAqLworICAgIHdhaXRfV09DKGlvYmFzZSk7CisgICAgb3V0Yihjb3JDb25mSUVOQSArIGNvckNvbmZMVkxSRVEsIGlvYmFzZSArIE5FVFdBVkVfUkVHX0NPUik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBuZXR3YXZlX2h3X3htaXQgKGRhdGEsIGxlbiwgZGV2KSAgICAKKyAqLworc3RhdGljIGludCBuZXR3YXZlX2h3X3htaXQodW5zaWduZWQgY2hhciogZGF0YSwgaW50IGxlbiwKKwkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYpIHsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIHVuc2lnbmVkIGludCBUeEZyZWVMaXN0LAorCSAgICAgICAgIGN1ckJ1ZmYsCisJICAgICAgICAgTWF4RGF0YSwgCisgICAgICAgICAgICAgICAgIERhdGFPZmZzZXQ7CisgICAgaW50IHRtcGNvdW50OyAKKwkKKyAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciBfX2lvbWVtICogcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CisgICAga2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKworICAgIC8qIERpc2FibGUgaW50ZXJydXB0cyAmIHNhdmUgZmxhZ3MgKi8KKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKKworICAgIC8qIENoZWNrIGlmIHRoZXJlIGFyZSB0cmFuc21pdCBidWZmZXJzIGF2YWlsYWJsZSAqLworICAgIHdhaXRfV09DKGlvYmFzZSk7CisgICAgaWYgKChpbmIoaW9iYXNlK05FVFdBVkVfUkVHX0FTUikgJiBORVRXQVZFX0FTUl9UWEJBKSA9PSAwKSB7CisJLyogTm8gYnVmZmVycyBhdmFpbGFibGUgKi8KKwlwcmludGsoS0VSTl9ERUJVRyAibmV0d2F2ZV9od194bWl0OiAlcyAtIG5vIHhtaXQgYnVmZmVycyBhdmFpbGFibGUuXG4iLAorCSAgICAgICBkZXYtPm5hbWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNwaW5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgcHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuOworCisgICAgREVCVUcoMywgIlRyYW5zbWl0dGluZyB3aXRoIFNQQ1EgJXggU1BVICV4IExJRiAleCBJU1BMUSAleFxuIiwKKwkgIHJlYWRiKHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfU1BDUSksCisJICByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1NQVSksCisJICByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX0xJRiksCisJICByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX0lTUExRKSk7CisKKyAgICAvKiBOb3cgdHJ5IHRvIGluc2VydCBpdCBpbnRvIHRoZSBhZGFwdGVycyBmcmVlIG1lbW9yeSAqLworICAgIHdhaXRfV09DKGlvYmFzZSk7CisgICAgVHhGcmVlTGlzdCA9IGdldF91aW50MTYocmFtQmFzZSArIE5FVFdBVkVfRVJFR19URFApOworICAgIE1heERhdGEgICAgPSBnZXRfdWludDE2KHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfVERQKzIpOworICAgIERhdGFPZmZzZXQgPSBnZXRfdWludDE2KHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfVERQKzQpOworCQorICAgIERFQlVHKDMsICJUeEZyZWVMaXN0ICV4LCBNYXhEYXRhICV4LCBEYXRhT2Zmc2V0ICV4XG4iLAorCSAgVHhGcmVlTGlzdCwgTWF4RGF0YSwgRGF0YU9mZnNldCk7CisKKyAgICAvKiBDb3B5IHBhY2tldCB0byB0aGUgYWRhcHRlciBmcmFnbWVudCBidWZmZXJzICovCisgICAgY3VyQnVmZiA9IFR4RnJlZUxpc3Q7IAorICAgIHRtcGNvdW50ID0gMDsgCisgICAgd2hpbGUgKHRtcGNvdW50IDwgbGVuKSB7CisJaW50IHRtcGxlbiA9IGxlbiAtIHRtcGNvdW50OyAKKwljb3B5X3RvX3BjKHJhbUJhc2UgKyBjdXJCdWZmICsgRGF0YU9mZnNldCwgZGF0YSArIHRtcGNvdW50LCAKKwkJICAgKHRtcGxlbiA8IE1heERhdGEpID8gdG1wbGVuIDogTWF4RGF0YSk7CisJdG1wY291bnQgKz0gTWF4RGF0YTsKKwkJCQorCS8qIEFkdmFuY2UgdG8gbmV4dCBidWZmZXIgKi8KKwljdXJCdWZmID0gZ2V0X3VpbnQxNihyYW1CYXNlICsgY3VyQnVmZik7CisgICAgfQorICAgIAorICAgIC8qIE5vdyBpc3N1ZSB0cmFuc21pdCBsaXN0ICovCisgICAgd2FpdF9XT0MoaW9iYXNlKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfVEwsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKKyAgICB3cml0ZWIobGVuICYgMHhmZiwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDEpOworICAgIHdyaXRlYigobGVuPj44KSAmIDB4ZmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAyKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMyk7CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5ldHdhdmVfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisJLyogVGhpcyBmbGFnIGluZGljYXRlIHRoYXQgdGhlIGhhcmR3YXJlIGNhbid0IHBlcmZvcm0gYSB0cmFuc21pc3Npb24uCisJICogVGhlb3JpdGljYWxseSwgTkVUMyBjaGVjayBpdCBiZWZvcmUgc2VuZGluZyBhIHBhY2tldCB0byB0aGUgZHJpdmVyLAorCSAqIGJ1dCBpbiBmYWN0IGl0IG5ldmVyIGRvIHRoYXQgYW5kIHBvb2wgY29udGludW91c2x5LgorCSAqIEFzIHRoZSB3YXRjaGRvZyB3aWxsIGFib3J0IHRvbyBsb25nIHRyYW5zbWlzc2lvbnMsIHdlIGFyZSBxdWl0ZSBzYWZlLi4uCisJICovCisKKyAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKyAgICB7CisJc2hvcnQgbGVuZ3RoID0gRVRIX1pMRU4gPCBza2ItPmxlbiA/IHNrYi0+bGVuIDogRVRIX1pMRU47CisJdW5zaWduZWQgY2hhciogYnVmID0gc2tiLT5kYXRhOworCQorCWlmIChuZXR3YXZlX2h3X3htaXQoIGJ1ZiwgbGVuZ3RoLCBkZXYpID09IDEpIHsKKwkgICAgLyogU29tZSBlcnJvciwgbGV0J3MgbWFrZSB0aGVtIGNhbGwgdXMgYW5vdGhlciB0aW1lPyAqLworCSAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCX0KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICB9CisgICAgZGV2X2tmcmVlX3NrYihza2IpOworICAgIAorICAgIHJldHVybiAwOworfSAvKiBuZXR3YXZlX3N0YXJ0X3htaXQgKi8KKworLyoKKyAqIEZ1bmN0aW9uIG5ldHdhdmVfaW50ZXJydXB0IChpcnEsIGRldl9pZCwgcmVncykKKyAqCisgKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIE5ldHdhdmUgY2FyZC4gVGhpcworICogICAgcm91dGluZSB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlcjogCisgKgkgIDEuIEEgcGFja2V0IGlzIHJlY2VpdmVkLgorICoJICAyLiBBIHBhY2tldCBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdHJhbnNmZXJyZWQgYW5kIHRoZSB1bml0IGlzCisgKgkgICAgIHJlYWR5IHRvIHRyYW5zbWl0IGFub3RoZXIgcGFja2V0LgorICoJICAzLiBBIGNvbW1hbmQgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24uCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBuZXR3YXZlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkKiBkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgIGtpb19hZGRyX3QgaW9iYXNlOworICAgIHVfY2hhciBfX2lvbWVtICpyYW1CYXNlOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisgICAgc3RydWN0IG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisgICAgZGV2X2xpbmtfdCAqbGluayA9ICZwcml2LT5saW5rOworICAgIGludCBpOworICAgIAorICAgIGlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKwlyZXR1cm4gSVJRX05PTkU7CisgICAgCisgICAgaW9iYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgICAgcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CisJCisgICAgLyogTm93IGZpbmQgd2hhdCBjYXVzZWQgdGhlIGludGVycnVwdCwgY2hlY2sgd2hpbGUgaW50ZXJydXB0cyByZWFkeSAqLworICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJdV9jaGFyIHN0YXR1czsKKwkJCisJd2FpdF9XT0MoaW9iYXNlKTsJCisJaWYgKCEoaW5iKGlvYmFzZStORVRXQVZFX1JFR19DQ1NSKSAmIDB4MDIpKQorCSAgICBicmVhazsgLyogTm9uZSBvZiB0aGUgaW50ZXJydXB0IHNvdXJjZXMgYXNzZXJ0ZWQgKG5vcm1hbCBleGl0KSAqLworCQorICAgICAgICBzdGF0dXMgPSBpbmIoaW9iYXNlICsgTkVUV0FWRV9SRUdfQVNSKTsKKwkJCisJaWYgKCFERVZfT0sobGluaykpIHsKKwkgICAgREVCVUcoMSwgIm5ldHdhdmVfaW50ZXJydXB0OiBJbnRlcnJ1cHQgd2l0aCBzdGF0dXMgMHgleCAiCisJCSAgImZyb20gcmVtb3ZlZCBvciBzdXNwZW5kZWQgY2FyZCFcbiIsIHN0YXR1cyk7CisJICAgIGJyZWFrOworCX0KKwkJCisJLyogUnhSZHkgKi8KKwlpZiAoc3RhdHVzICYgMHg4MCkgeworCSAgICBuZXR3YXZlX3J4KGRldik7CisJICAgIC8qIHdhaXRfV09DKGlvYmFzZSk7ICovCisJICAgIC8qIFJ4UmR5IGNhbm5vdCBiZSByZXNldCBkaXJlY3RseSBieSB0aGUgaG9zdCAqLworCX0KKwkvKiBSeEVyciAqLworCWlmIChzdGF0dXMgJiAweDQwKSB7CisJICAgIHVfY2hhciByc2VyOworCQkJCisJICAgIHJzZXIgPSByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1JTRVIpOwkJCQorCSAgICAKKwkgICAgaWYgKHJzZXIgJiAweDA0KSB7CisJCSsrcHJpdi0+c3RhdHMucnhfZHJvcHBlZDsgCisJCSsrcHJpdi0+c3RhdHMucnhfY3JjX2Vycm9yczsKKwkgICAgfQorCSAgICBpZiAocnNlciAmIDB4MDIpCisJCSsrcHJpdi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzOworCQkJCisJICAgIC8qIENsZWFyIHRoZSBSeEVyciBiaXQgaW4gUlNFUi4gUlNFUis0IGlzIHRoZQorCSAgICAgKiB3cml0ZSBwYXJ0LiBBbHNvIGNsZWFyIHRoZSBSeENSQyAoMHgwNCkgYW5kIAorCSAgICAgKiBSeEJpZyAoMHgwMikgYml0cyBpZiBwcmVzZW50ICovCisJICAgIHdhaXRfV09DKGlvYmFzZSk7CisJICAgIHdyaXRlYigweDQwIHwgKHJzZXIgJiAweDA2KSwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19SU0VSICsgNCk7CisKKwkgICAgLyogV3JpdGUgYml0IDYgaGlnaCB0byBBU0NDIHRvIGNsZWFyIFJ4RXJyIGluIEFTUiwKKwkgICAgICogV09DIG11c3QgYmUgc2V0IGZpcnN0ISAKKwkgICAgICovCisJICAgIHdhaXRfV09DKGlvYmFzZSk7CisJICAgIHdyaXRlYigweDQwLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0FTQ0MpOworCisJICAgIC8qIFJlbWVtYmVyIHRvIGNvdW50IHVwIHByaXYtPnN0YXRzIG9uIGVycm9yIHBhY2tldHMgKi8KKwkgICAgKytwcml2LT5zdGF0cy5yeF9lcnJvcnM7CisJfQorCS8qIFR4RE4gKi8KKwlpZiAoc3RhdHVzICYgMHgyMCkgeworCSAgICBpbnQgdHhTdGF0dXM7CisKKwkgICAgdHhTdGF0dXMgPSByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1RTRVIpOworCSAgICBERUJVRygzLCAiVHJhbnNtaXQgZG9uZS4gVFNFUiA9ICV4IGlkICV4XG4iLCAKKwkJICB0eFN0YXR1cywgcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19UU0VSICsgMSkpOworCSAgICAKKwkgICAgaWYgKHR4U3RhdHVzICYgMHgyMCkgeworCQkvKiBUcmFuc21pdHRpbmcgd2FzIG9rYXksIGNsZWFyIGJpdHMgKi8KKwkJd2FpdF9XT0MoaW9iYXNlKTsKKwkJd3JpdGViKDB4MmYsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfVFNFUiArIDQpOworCQkrK3ByaXYtPnN0YXRzLnR4X3BhY2tldHM7CisJICAgIH0KKwkJCQorCSAgICBpZiAodHhTdGF0dXMgJiAweGQwKSB7CisJCWlmICh0eFN0YXR1cyAmIDB4ODApIHsKKwkJICAgICsrcHJpdi0+c3RhdHMuY29sbGlzaW9uczsgLyogQmVjYXVzZSBvZiAvcHJvYy9uZXQvZGV2Ki8KKwkJICAgIC8qICsrcHJpdi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnM7ICovCisJCSAgICAvKiBwcmludGsoIkNvbGxpc2lvbi4gJWxkXG4iLCBqaWZmaWVzIC0gZGV2LT50cmFuc19zdGFydCk7ICovCisJCX0KKwkJaWYgKHR4U3RhdHVzICYgMHg0MCkgCisJCSAgICArK3ByaXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzOworCQkvKiAweDgwIFR4R1UgVHJhbnNtaXQgZ2l2ZXVwIC0gbmluZSB0aW1lcyBhbmQgbm8gbHVjaworCQkgKiAweDQwIFR4Tk9BUCBObyBhY2Nlc3MgcG9pbnQuIERpc2NhcmRlZCBwYWNrZXQuCisJCSAqIDB4MTAgVHhFcnIgVHJhbnNtaXQgZXJyb3IuIEFsd2F5cyBzZXQgd2hlbiAKKwkJICogICAgICBUeEdVIGFuZCBUeE5PQVAgaXMgc2V0LiAoVGhvc2UgYXJlIHRoZSBvbmx5IG9uZXMKKwkJICogICAgICB0byBzZXQgVHhFcnIpLgorCQkgKi8KKwkJREVCVUcoMywgIm5ldHdhdmVfaW50ZXJydXB0OiBUeEROIHdpdGggZXJyb3Igc3RhdHVzICV4XG4iLCAKKwkJICAgICAgdHhTdGF0dXMpOworCQkKKwkJLyogQ2xlYXIgb3V0IFR4R1UsIFR4Tk9BUCwgVHhFcnIgYW5kIFR4VHJ5cyAqLworCQl3YWl0X1dPQyhpb2Jhc2UpOworCQl3cml0ZWIoMHhkZiAmIHR4U3RhdHVzLCByYW1CYXNlK05FVFdBVkVfRVJFR19UU0VSKzQpOworCQkrK3ByaXYtPnN0YXRzLnR4X2Vycm9yczsKKwkgICAgfQorCSAgICBERUJVRygzLCAiTmV3IHN0YXR1cyBpcyBUU0VSICV4IEFTUiAleFxuIiwKKwkJICByZWFkYihyYW1CYXNlICsgTkVUV0FWRV9FUkVHX1RTRVIpLAorCQkgIGluYihpb2Jhc2UgKyBORVRXQVZFX1JFR19BU1IpKTsKKworCSAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCS8qIFR4QkEsIHRoaXMgd291bGQgdHJpZ2dlciBvbiBhbGwgZXJyb3IgcGFja2V0cyByZWNlaXZlZCAqLworCS8qIGlmIChzdGF0dXMgJiAweDAxKSB7CisJICAgREVCVUcoNCwgIlRyYW5zbWl0IGJ1ZmZlcnMgYXZhaWxhYmxlLCAleFxuIiwgc3RhdHVzKTsKKwkgICB9CisJICAgKi8KKyAgICB9CisgICAgLyogSGFuZGxlZCBpZiB3ZSBsb29wZWQgYXQgbGVhc3Qgb25lIHRpbWUgLSBKZWFuIElJICovCisgICAgcmV0dXJuIElSUV9SRVRWQUwoaSk7Cit9IC8qIG5ldHdhdmVfaW50ZXJydXB0ICovCisKKy8qCisgKiBGdW5jdGlvbiBuZXR3YXZlX3dhdGNoZG9nIChhKQorICoKKyAqICAgIFdhdGNoZG9nIDogd2hlbiB3ZSBzdGFydCBhIHRyYW5zbWlzc2lvbiwgd2Ugc2V0IGEgdGltZXIgaW4gdGhlCisgKiAgICBrZXJuZWwuICBJZiB0aGUgdHJhbnNtaXNzaW9uIGNvbXBsZXRlLCB0aGlzIHRpbWVyIGlzIGRpc2FibGVkLiBJZgorICogICAgaXQgZXhwaXJlLCB3ZSByZXNldCB0aGUgY2FyZC4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIG5ldHdhdmVfd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworCisgICAgREVCVUcoMSwgIiVzOiBuZXR3YXZlX3dhdGNoZG9nOiB3YXRjaGRvZyB0aW1lciBleHBpcmVkXG4iLCBkZXYtPm5hbWUpOworICAgIG5ldHdhdmVfcmVzZXQoZGV2KTsKKyAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7Cit9IC8qIG5ldHdhdmVfd2F0Y2hkb2cgKi8KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXR3YXZlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7CisgICAgbmV0d2F2ZV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAgIHVwZGF0ZV9zdGF0cyhkZXYpOworCisgICAgREVCVUcoMiwgIm5ldHdhdmU6IFNQQ1EgJXggU1BVICV4IExJRiAleCBJU1BMUSAleCBNSFMgJXggcnh0eCAleCIKKwkgICIgJXggdHggJXggJXggJXggJXhcbiIsIAorCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19TUENRKSwKKwkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfU1BVKSwKKwkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfTElGKSwKKwkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfSVNQTFEpLAorCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19NSFMpLAorCSAgcmVhZGIocHJpdi0+cmFtQmFzZSArIE5FVFdBVkVfRVJFR19FQyArIDB4ZSksCisJICByZWFkYihwcml2LT5yYW1CYXNlICsgTkVUV0FWRV9FUkVHX0VDICsgMHhmKSwKKwkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfRUMgKyAweDE4KSwKKwkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfRUMgKyAweDE5KSwKKwkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfRUMgKyAweDFhKSwKKwkgIHJlYWRiKHByaXYtPnJhbUJhc2UgKyBORVRXQVZFX0VSRUdfRUMgKyAweDFiKSk7CisKKyAgICByZXR1cm4gJnByaXYtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworICAgIC8vdW5zaWduZWQgbG9uZyBmbGFnczsKKy8qICAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOyAqLworCisgICAgLy9zcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3BpbmxvY2ssIGZsYWdzKTsKKworLyogICAgcHJpdi0+c3RhdHMucnhfcGFja2V0cyA9IHJlYWRiKHByaXYtPnJhbUJhc2UgKyAweDE4ZSk7IAorICAgIHByaXYtPnN0YXRzLnR4X3BhY2tldHMgPSByZWFkYihwcml2LT5yYW1CYXNlICsgMHgxOGYpOyAqLworCisgICAgLy9zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zcGlubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IG5ldHdhdmVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciBfX2lvbWVtICpyYW1CYXNlID0gcHJpdi0+cmFtQmFzZTsKKyAgICBraW9fYWRkcl90IGlvYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIHVfY2hhciByeFN0YXR1czsKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKyAgICB1bnNpZ25lZCBpbnQgY3VyQnVmZmVyLAorCQlyY3ZMaXN0OworICAgIGludCByY3ZMZW47CisgICAgaW50IHRtcGNvdW50ID0gMDsKKyAgICBpbnQgZGF0YUNvdW50LCBkYXRhT2Zmc2V0OworICAgIGludCBpOworICAgIHVfY2hhciAqcHRyOworCQorICAgIERFQlVHKDMsICJ4aW53X3J4OiBSZWNlaXZpbmcgLi4uIFxuIik7CisKKyAgICAvKiBSZWNlaXZlIG1heCAxMCBwYWNrZXRzIGZvciBub3cuICovCisgICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkvKiBBbnkgcGFja2V0cz8gKi8KKwl3YWl0X1dPQyhpb2Jhc2UpOworCXJ4U3RhdHVzID0gcmVhZGIocmFtQmFzZSArIE5FVFdBVkVfRVJFR19SU0VSKTsJCQorCWlmICggISggcnhTdGF0dXMgJiAweDgwKSkgLyogTm8gbW9yZSBwYWNrZXRzICovCisJICAgIGJyZWFrOworCQkKKwkvKiBDaGVjayBpZiBtdWx0aWNhc3QvYnJvYWRjYXN0IG9yIG90aGVyICovCisJLyogbXVsdGljYXN0ID0gKHJ4U3RhdHVzICYgMHgyMCk7ICAqLworCQkKKwkvKiBUaGUgcmVjZWl2ZSBsaXN0IHBvaW50ZXIgYW5kIGxlbmd0aCBvZiB0aGUgcGFja2V0ICovCisJd2FpdF9XT0MoaW9iYXNlKTsKKwlyY3ZMZW4gID0gZ2V0X2ludDE2KCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX1JEUCk7CisJcmN2TGlzdCA9IGdldF91aW50MTYoIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfUkRQICsgMik7CisJCQorCWlmIChyY3ZMZW4gPCAwKSB7CisJICAgIHByaW50ayhLRVJOX0RFQlVHICJuZXR3YXZlX3J4OiBSZWNlaXZlIHBhY2tldCB3aXRoIGxlbiAlZFxuIiwgCisJCSAgIHJjdkxlbik7CisJICAgIHJldHVybiAwOworCX0KKwkJCisJc2tiID0gZGV2X2FsbG9jX3NrYihyY3ZMZW4rNSk7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJICAgIERFQlVHKDEsICJuZXR3YXZlX3J4OiBDb3VsZCBub3QgYWxsb2NhdGUgYW4gc2tfYnVmZiBvZiAiCisJCSAgImxlbmd0aCAlZFxuIiwgcmN2TGVuKTsKKwkgICAgKytwcml2LT5zdGF0cy5yeF9kcm9wcGVkOyAKKwkgICAgLyogVGVsbCB0aGUgYWRhcHRlciB0byBza2lwIHRoZSBwYWNrZXQgKi8KKwkgICAgd2FpdF9XT0MoaW9iYXNlKTsKKwkgICAgd3JpdGViKE5FVFdBVkVfQ01EX1NSUCwgcmFtQmFzZSArIE5FVFdBVkVfRVJFR19DQiArIDApOworCSAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CisJICAgIHJldHVybiAwOworCX0KKworCXNrYl9yZXNlcnZlKCBza2IsIDIpOyAgLyogQWxpZ24gSVAgb24gMTYgYnl0ZSAqLworCXNrYl9wdXQoIHNrYiwgcmN2TGVuKTsKKwlza2ItPmRldiA9IGRldjsKKworCS8qIENvcHkgcGFja2V0IGZyYWdtZW50cyB0byB0aGUgc2tiIGRhdGEgYXJlYSAqLworCXB0ciA9ICh1X2NoYXIqKSBza2ItPmRhdGE7CisJY3VyQnVmZmVyID0gcmN2TGlzdDsKKwl0bXBjb3VudCA9IDA7IAorCXdoaWxlICggdG1wY291bnQgPCByY3ZMZW4pIHsKKwkgICAgLyogR2V0IGxlbmd0aCBhbmQgb2Zmc2V0IG9mIGN1cnJlbnQgYnVmZmVyICovCisJICAgIGRhdGFDb3VudCAgPSBnZXRfdWludDE2KCByYW1CYXNlK2N1ckJ1ZmZlcisyKTsKKwkgICAgZGF0YU9mZnNldCA9IGdldF91aW50MTYoIHJhbUJhc2UrY3VyQnVmZmVyKzQpOworCQkKKwkgICAgY29weV9mcm9tX3BjKCBwdHIgKyB0bXBjb3VudCwKKwkJCSAgcmFtQmFzZStjdXJCdWZmZXIrZGF0YU9mZnNldCwgZGF0YUNvdW50KTsKKworCSAgICB0bXBjb3VudCArPSBkYXRhQ291bnQ7CisJCQorCSAgICAvKiBQb2ludCB0byBuZXh0IGJ1ZmZlciAqLworCSAgICBjdXJCdWZmZXIgPSBnZXRfdWludDE2KHJhbUJhc2UgKyBjdXJCdWZmZXIpOworCX0KKwkKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CisJLyogUXVldWUgcGFja2V0IGZvciBuZXR3b3JrIGxheWVyICovCisJbmV0aWZfcngoc2tiKTsKKworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOworCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IHJjdkxlbjsKKworCS8qIEdvdCB0aGUgcGFja2V0LCB0ZWxsIHRoZSBhZGFwdGVyIHRvIHNraXAgaXQgKi8KKwl3YWl0X1dPQyhpb2Jhc2UpOworCXdyaXRlYihORVRXQVZFX0NNRF9TUlAsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAwKTsKKwl3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMSk7CisJREVCVUcoMywgIlBhY2tldCByZWNlcHRpb24gb2tcbiIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXR3YXZlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisgICAgZGV2X2xpbmtfdCAqbGluayA9ICZwcml2LT5saW5rOworCisgICAgREVCVUcoMSwgIm5ldHdhdmVfb3Blbjogc3RhcnRpbmcuXG4iKTsKKyAgICAKKyAgICBpZiAoIURFVl9PSyhsaW5rKSkKKwlyZXR1cm4gLUVOT0RFVjsKKworICAgIGxpbmstPm9wZW4rKzsKKworICAgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgbmV0d2F2ZV9yZXNldChkZXYpOworCQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5ldHdhdmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeworICAgIG5ldHdhdmVfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisgICAgZGV2X2xpbmtfdCAqbGluayA9ICZwcml2LT5saW5rOworCisgICAgREVCVUcoMSwgIm5ldHdhdmVfY2xvc2U6IGZpbmlzaGluZy5cbiIpOworCisgICAgbGluay0+b3Blbi0tOworICAgIG5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgbmV0d2F2ZV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICJuZXR3YXZlX2NzIiwKKwl9LAorCS5hdHRhY2gJCT0gbmV0d2F2ZV9hdHRhY2gsCisJLmRldGFjaAkJPSBuZXR3YXZlX2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmV0d2F2ZV9jcyh2b2lkKQoreworCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZuZXR3YXZlX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25ldHdhdmVfY3Modm9pZCkKK3sKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJm5ldHdhdmVfZHJpdmVyKTsKKwlCVUdfT04oZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmV0d2F2ZV9jcyk7Cittb2R1bGVfZXhpdChleGl0X25ldHdhdmVfY3MpOworCisvKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAgIG51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisgICBudW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKKyAgIG51bV9hZGRycyA+IDAJTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLCBhbmQgZG8KKyAgIGJlc3QtZWZmb3J0IGZpbHRlcmluZy4KKyAqLworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAga2lvX2FkZHJfdCBpb2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBuZXR3YXZlX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworICAgIHVfY2hhciBfX2lvbWVtICogcmFtQmFzZSA9IHByaXYtPnJhbUJhc2U7CisgICAgdV9jaGFyICByY3ZNb2RlID0gMDsKKyAgIAorI2lmZGVmIFBDTUNJQV9ERUJVRworICAgIGlmIChwY19kZWJ1ZyA+IDIpIHsKKwlzdGF0aWMgaW50IG9sZDsKKwlpZiAob2xkICE9IGRldi0+bWNfY291bnQpIHsKKwkgICAgb2xkID0gZGV2LT5tY19jb3VudDsKKwkgICAgREVCVUcoMCwgIiVzOiBzZXR0aW5nIFJ4IG1vZGUgdG8gJWQgYWRkcmVzc2VzLlxuIiwKKwkJICBkZXYtPm5hbWUsIGRldi0+bWNfY291bnQpOworCX0KKyAgICB9CisjZW5kaWYKKwkKKyAgICBpZiAoZGV2LT5tY19jb3VudCB8fCAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKKwkvKiBNdWx0aWNhc3QgTW9kZSAqLworCXJjdk1vZGUgPSByeENvbmZSeEVuYSArIHJ4Q29uZkFNUCArIHJ4Q29uZkJjYXN0OworICAgIH0gZWxzZSBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJLyogUHJvbWlzY291cyBtb2RlICovCisJcmN2TW9kZSA9IHJ4Q29uZlJ4RW5hICsgcnhDb25mUHJvICsgcnhDb25mQU1QICsgcnhDb25mQmNhc3Q7CisgICAgfSBlbHNlIHsKKwkvKiBOb3JtYWwgbW9kZSAqLworCXJjdk1vZGUgPSByeENvbmZSeEVuYSArIHJ4Q29uZkJjYXN0OworICAgIH0KKwkKKyAgICAvKiBwcmludGsoIm5ldHdhdmUgc2V0X211bHRpY2FzdF9saXN0OiByY3ZNb2RlIHRvICV4XG4iLCByY3ZNb2RlKTsqLworICAgIC8qIE5vdyBzZXQgcmVjZWl2ZSBtb2RlICovCisgICAgd2FpdF9XT0MoaW9iYXNlKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfU1JDLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMCk7CisgICAgd3JpdGViKHJjdk1vZGUsIHJhbUJhc2UgKyBORVRXQVZFX0VSRUdfQ0IgKyAxKTsKKyAgICB3cml0ZWIoTkVUV0FWRV9DTURfRU9DLCByYW1CYXNlICsgTkVUV0FWRV9FUkVHX0NCICsgMik7Cit9CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhMzI0MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uYwpAQCAtMCwwICsxLDQyNDMgQEAKKy8qIG9yaW5vY28uYyAtIChmb3JtZXJseSBrbm93biBhcyBkbGR3ZF9jcy5jIGFuZCBvcmlub2NvX2NzLmMpCisgKgorICogQSBkcml2ZXIgZm9yIEhlcm1lcyBvciBQcmlzbSAyIGNoaXBzZXQgYmFzZWQgUENNQ0lBIHdpcmVsZXNzCisgKiBhZGFwdG9ycywgd2l0aCBMdWNlbnQvQWdlcmUsIEludGVyc2lsIG9yIFN5bWJvbCBmaXJtd2FyZS4KKyAqCisgKiBDdXJyZW50IG1haW50YWluZXJzIChhcyBvZiAyOSBTZXB0ZW1iZXIgMjAwMykgYXJlOgorICogCVBhdmVsIFJvc2tpbiA8cHJvc2tpIEFUIGdudS5vcmc+CisgKiBhbmQJRGF2aWQgR2lic29uIDxoZXJtZXMgQVQgZ2lic29uLmRyb3BiZWFyLmlkLmF1PgorICoKKyAqIChDKSBDb3B5cmlnaHQgRGF2aWQgR2lic29uLCBJQk0gQ29ycG9yYXRpb24gMjAwMS0yMDAzLgorICogQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEdpYnNvbiwgTGludXhjYXJlIEF1c3RyYWxpYS4KKyAqCVdpdGggc29tZSBoZWxwIGZyb20gOgorICogQ29weXJpZ2h0IChDKSAyMDAxIEplYW4gVG91cnJpbGhlcywgSFAgTGFicworICogQ29weXJpZ2h0IChDKSAyMDAxIEJlbmphbWluIEhlcnJlbnNjaG1pZHQKKyAqCisgKiBCYXNlZCBvbiBkdW1teV9jcy5jIDEuMjcgMjAwMC8wNi8xMiAyMToyNzoyNQorICoKKyAqIFBvcnRpb25zIGJhc2VkIG9uIHd2bGFuX2NzLmMgMS4wLjYsIENvcHlyaWdodCBBbmRyZWFzIE5ldWhhdXMgPGFuZHkKKyAqIEFUIGZhc3RhLmZoLWRvcnRtdW5kLmRlPgorICogICAgICBodHRwOi8vd3d3LnN0dWQuZmgtZG9ydG11bmQuZGUvfmFuZHkvd3ZsYW4vCisgKgorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbgorICogY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworICoKKyAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIKKyAqIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUKKyAqIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoZSBpbml0aWFsIGRldmVsb3BlciBvZiB0aGUgb3JpZ2luYWwgY29kZSBpcyBEYXZpZCBBLiBIaW5kcworICogPGRhaGluZHMgQVQgdXNlcnMuc291cmNlZm9yZ2UubmV0Pi4gIFBvcnRpb25zIGNyZWF0ZWQgYnkgRGF2aWQKKyAqIEEuIEhpbmRzIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgQS4gSGluZHMuICBBbGwgUmlnaHRzCisgKiBSZXNlcnZlZC4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSwgaW4KKyAqIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZQorICogYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKKyAqIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIKKyAqIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkKKyAqIGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZAorICogb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLiAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlCisgKiBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKKyAqIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuICAqLworCisvKgorICogdjAuMDEgLT4gdjAuMDIgLSAyMS8zLzIwMDEgLSBKZWFuIElJCisgKglvIEFsbG93IHRvIHVzZSByZWd1bGFyIGV0aFggZGV2aWNlIG5hbWUgaW5zdGVhZCBvZiBkbGR3ZFgKKyAqCW8gV2FybmluZyBvbiBJQlNTIHdpdGggRVNTSUQ9YW55IGZvciBmaXJtd2FyZSA2LjA2CisgKglvIFB1dCBwcm9wZXIgcmFuZ2UudGhyb3VnaHB1dCB2YWx1ZXMgKG9wdGltaXN0aWMpCisgKglvIElXU1BZIHN1cHBvcnQgKElPQ1RMIGFuZCBzdGF0IGdhdGhlciBpbiBSeCBwYXRoKQorICoJbyBBbGxvdyBzZXR0aW5nIGZyZXF1ZW5jeSBpbiBBZC1Ib2MgbW9kZQorICoJbyBEaXNhYmxlIFdFUCBzZXR0aW5nIGlmICFoYXNfd2VwIHRvIHdvcmsgb24gb2xkIGZpcm13YXJlCisgKglvIEZpeCB0eHBvd2VyIHJhbmdlCisgKglvIFN0YXJ0IGFkZGluZyBzdXBwb3J0IGZvciBTYW1zdW5nL0NvbXBhcSBmaXJtd2FyZQorICoKKyAqIHYwLjAyIC0+IHYwLjAzIC0gMjMvMy8yMDAxIC0gSmVhbiBJSQorICoJbyBTdGFydCBhZGRpbmcgU3ltYm9sIHN1cHBvcnQgLSBuZWVkIHRvIGNoZWNrIGFsbCB0aGF0CisgKglvIEZpeCBQcmlzbTIvU3ltYm9sIFdFUCB0byBhY2NlcHQgMTI4IGJpdHMga2V5cworICoJbyBBZGQgU3ltYm9sIFdFUCAoYWRkIGF1dGhlbnRpY2F0aW9uIHR5cGUpCisgKglvIEFkZCBQcmlzbTIvU3ltYm9sIHJhdGUKKyAqCW8gQWRkIFBNIHRpbWVvdXQgKGhvbGRvdmVyIGR1cmF0aW9uKQorICoJbyBFbmFibGUgIml3Y29uZmlnIGV0aDAga2V5IG9mZiIgYW5kIGZyaWVuZHMgKHRvZ2dsZSBmbGFncykKKyAqCW8gRW5hYmxlICJpd2NvbmZpZyBldGgwIHBvd2VyIHVuaWNhc3QvYWxsIiAodG9nZ2xlIGZsYWdzKQorICoJbyBUcnkgd2l0aCBhbiBJbnRlbCBjYXJkLiBJdCByZXBvcnQgZmlybXdhcmUgMS4wMSwgYmVoYXZlIGxpa2UKKyAqCSAgYW4gYW50aXF1YXRlZCBmaXJtd2FyZSwgaG93ZXZlciBvbiB3aW5kb3dzIGl0IHNheXMgMi4wMC4gWXVjayAhCisgKglvIFdvcmthcm91bmQgZmlybXdhcmUgYnVnIGluIGFsbG9jYXRlIGJ1ZmZlciAoSW50ZWwgMS4wMSkKKyAqCW8gRmluaXNoIGV4dGVybmFsIHJlbmFtaW5nIHRvIG9yaW5vY28uLi4KKyAqCW8gVGVzdGluZyB3aXRoIHZhcmlvdXMgV2F2ZWxhbiBmaXJtd2FyZXMKKyAqCisgKiB2MC4wMyAtPiB2MC4wNCAtIDMwLzMvMjAwMSAtIEplYW4gSUkKKyAqCW8gVXBkYXRlIHRvIFdpcmVsZXNzIDExIC0+IGFkZCByZXRyeSBsaW1pdC9saWZldGltZSBzdXBwb3J0CisgKglvIFRlc3RlZCB3aXRoIGEgRC1MaW5rIERXTCA2NTAgY2FyZCwgZmlsbCBpbiBmaXJtd2FyZSBzdXBwb3J0CisgKglvIFdhcm5pbmcgb24gVmNjIG1pc21hdGNoIChELUxpbmsgMy4zdiBjYXJkIGluIEx1Y2VudCA1diBvbmx5IHNsb3QpCisgKglvIEZpeGVkIHRoZSBQcmlzbTIgV0VQIGJ1Z3MgdGhhdCBJIGludHJvZHVjZWQgaW4gdjAuMDMgOi0oCisgKgkgIEl0IHdvcmtzIG9uIEQtTGluayAqb25seSogYWZ0ZXIgYSB0Y3BkdW1wLiBXZWlyZC4uLgorICoJICBBbmQgc3RpbGwgZG9lc24ndCB3b3JrIG9uIEludGVsIGNhcmQuIEdycnJyLi4uCisgKglvIFVwZGF0ZSB0aGUgbW9kZSBhZnRlciBhIHNldHBvcnQzCisgKglvIEFkZCBwcmVhbWJsZSBzZXR0aW5nIGZvciBTeW1ib2wgY2FyZHMgKG5vdCB5ZXQgZW5hYmxlZCkKKyAqCW8gRG9uJ3QgY29tcGxhaW4gYXMgbXVjaCBhYm91dCBTeW1ib2wgY2FyZHMuLi4KKyAqCisgKiB2MC4wNCAtPiB2MC4wNGIgLSAyMi80LzIwMDEgLSBEYXZpZCBHaWJzb24KKyAqICAgICAgbyBSZW1vdmVkIHRoZSAnZXRoJyBwYXJhbWV0ZXIgLSBhbHdheXMgdXNlIGV0aFhYIGFzIHRoZQorICogICAgICAgIGludGVyZmFjZSBuYW1lIGluc3RlYWQgb2YgZGxkd2RYWC4gIFRoZSBvdGhlciB3YXMgcmFjeQorICogICAgICAgIGFueXdheS4KKyAqCW8gQ2xlYW4gdXAgUklEIGRlZmluaXRpb25zIGluIGhlcm1lcy5oLCBvdGhlciBjbGVhbnVwcworICoKKyAqIHYwLjA0YiAtPiB2MC4wNGMgLSAyNC80LzIwMDEgLSBKZWFuIElJCisgKglvIFRpbSBIdXJsZXkgPHRpbXN0ZXIgQVQgc2Vpa2kuYmxpenRlY2guY29tPiByZXBvcnRlZCBhIEQtTGluayBjYXJkCisgKgkgIHdpdGggdmVuZG9yIDAyIGFuZCBmaXJtd2FyZSAwLjA4LiBBZGRlZCBpbiB0aGUgY2FwYWJpbGl0aWVzLi4uCisgKglvIFRlc3RlZCBMdWNlbnQgZmlybXdhcmUgNy4yOCwgZXZlcnl0aGluZyB3b3Jrcy4uLgorICoKKyAqIHYwLjA0YyAtPiB2MC4wNSAtIDMvNS8yMDAxIC0gQmVuamFtaW4gSGVycmVuc2NobWlkdAorICoJbyBTcGluLW9mZiBQY21jaWEgY29kZS4gVGhpcyBmaWxlIGlzIHJlbmFtZWQgb3Jpbm9jby5jLAorICoJICBhbmQgb3Jpbm9jb19jcy5jIG5vdyBjb250YWlucyBvbmx5IHRoZSBQY21jaWEgc3BlY2lmaWMgc3R1ZmYKKyAqCW8gQWRkIEFpcnBvcnQgZHJpdmVyIHN1cHBvcnQgb24gdG9wIG9mIG9yaW5vY28uYyAoc2VlIGFpcnBvcnQuYykKKyAqCisgKiB2MC4wNSAtPiB2MC4wNWEgLSA0LzUvMjAwMSAtIEplYW4gSUkKKyAqCW8gUmV2ZXJ0IHRvIG9sZCBQY21jaWEgY29kZSB0byBmaXggYnJlYWthZ2Ugb2YgQmVuJ3MgY2hhbmdlcy4uLgorICoKKyAqIHYwLjA1YSAtPiB2MC4wNWIgLSA0LzUvMjAwMSAtIEplYW4gSUkKKyAqCW8gYWRkIG1vZHVsZSBwYXJhbWV0ZXIgJ2lnbm9yZV9jaXNfdmNjJyBmb3IgRC1MaW5rIEAgNVYKKyAqCW8gRC1MaW5rIGZpcm13YXJlIGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aWNhc3QuIFdlIGp1c3QgcHJpbnQgYSBmZXcKKyAqCSAgZXJyb3IgbWVzc2FnZXMsIGJ1dCBvdGhlcndpc2UgZXZlcnl0aGluZyB3b3Jrcy4uLgorICoJbyBGb3IgRGF2aWQgOiBzZXQvZ2V0cG9ydDMgd29ya3MgZmluZSwganVzdCB1cGdyYWRlIGl3cHJpdi4uLgorICoKKyAqIHYwLjA1YiAtPiB2MC4wNWMgLSA1LzUvMjAwMSAtIEJlbmphbWluIEhlcnJlbnNjaG1pZHQKKyAqCW8gQWRhcHQgYWlycG9ydC5jIHRvIGxhdGVzdCBjaGFuZ2VzIGluIG9yaW5vY28uYworICoJbyBSZW1vdmUgZGVmZXJyZWQgcG93ZXIgZW5hYmxpbmcgY29kZQorICoKKyAqIHYwLjA1YyAtPiB2MC4wNWQgLSA1LzUvMjAwMSAtIEplYW4gSUkKKyAqCW8gV29ya2Fyb3VuZCB0byBTTkFQIGRlY2Fwc3VsYXRlIGZyYW1lIGZyb20gTGlua3N5cyBBUAorICoJICBvcmlnaW5hbCBwYXRjaCBmcm9tIDogRG9uZyBMaXUgPGRsaXUgQVQgcmVzZWFyY2guYmVsbC1sYWJzLmNvbT4KKyAqCSAgKG5vdGUgOiB0aGUgbWVtY21wIGJ1ZyB3YXMgbWluZSAtIGZpeGVkKQorICoJbyBSZW1vdmUgc2V0X3JldHJ5IHN0dWZmLCBubyBmaXJtd2FyZSBzdXBwb3J0IGl0IChibG9hdC0tKS4KKyAqCisgKiB2MC4wNWQgLT4gdjAuMDYgLSAyNS81LzIwMDEgLSBKZWFuIElJCisgKgkJT3JpZ2luYWwgcGF0Y2ggZnJvbSAiSG9uZyBMaW4iIDxhbGluIEFUIHJlZGhhdC5jb20+LAorICoJCSJJYW4gS2lubmVyIiA8aWtpbm5lciBBVCByZWRoYXQuY29tPgorICoJCWFuZCAiRGF2aWQgU21pdGgiIDxkc21pdGggQVQgcmVkaGF0LmNvbT4KKyAqCW8gSW5pdCBvZiBwcml2LT50eF9yYXRlX2N0cmwgaW4gZmlybXdhcmUgc3BlY2lmaWMgc2VjdGlvbi4KKyAqCW8gUHJpc20yL1N5bWJvbCByYXRlLCB1cHRvIHNob3VsZCBiZSAweEYgYW5kIG5vdCAweDE1LiBEb2ggIQorICoJbyBTcGVjdHJ1bSBjYXJkIGFsd2F5cyBuZWVkIGNvcl9yZXNldCAoZm9yIGV2ZXJ5IHJlc2V0KQorICoJbyBGaXggY29yX3Jlc2V0IHRvIG5vdCBsb3NlIGJpdCA3IGluIHRoZSByZWdpc3RlcgorICoJbyBmbHVzaF9zdGFsZV9saW5rcyB0byByZW1vdmUgem9tYmllIFBjbWNpYSBpbnN0YW5jZXMKKyAqCW8gQWNrIHByZXZpb3VzIGhlcm1lcyBldmVudCBiZWZvcmUgcmVzZXQKKyAqCQlNZSAod2l0aCBteSBsaXR0bGUgaGFuZHMpCisgKglvIEFsbG93IG9yaW5vY28uYyB0byBjYWxsIGNvcl9yZXNldCB2aWEgcHJpdi0+Y2FyZF9yZXNldF9oYW5kbGVyCisgKglvIEFkZCBwcml2LT5uZWVkX2NhcmRfcmVzZXQgdG8gdG9nZ2xlIHRoaXMgZmVhdHVyZQorICoJbyBGaXggdmFyaW91cyBidWdsZXRzIHdoZW4gc2V0dGluZyBXRVAgaW4gU3ltYm9sIGZpcm13YXJlCisgKgkgIE5vdywgZW5jcnlwdGlvbiBpcyBmdWxseSBmdW5jdGlvbmFsIG9uIFN5bWJvbCBjYXJkcy4gWW91cGkgIQorICoKKyAqIHYwLjA2IC0+IHYwLjA2YiAtIDI1LzUvMjAwMSAtIEplYW4gSUkKKyAqCW8gSUJTUyBvbiBTeW1ib2wgdXNlIHBvcnRfbW9kZSA9IDQuIFBsZWFzZSBkb24ndCBhc2suLi4KKyAqCisgKiB2MC4wNmIgLT4gdjAuMDZjIC0gMjkvNS8yMDAxIC0gSmVhbiBJSQorICoJbyBTaG93IGZpcnN0IHNweSBhZGRyZXNzIGluIC9wcm9jL25ldC93aXJlbGVzcyBmb3IgSUJTUyBtb2RlIGFzIHdlbGwKKyAqCisgKiB2MC4wNmMgLT4gdjAuMDZkIC0gNi83LzIwMDEgLSBEYXZpZCBHaWJzb24KKyAqICAgICAgbyBDaGFuZ2UgYSBidW5jaCBvZiBLRVJOX0lORk8gbWVzc2FnZXMgdG8gS0VSTl9ERUJVRywgYXMgcGVyIExpbnVzJworICogICAgICAgIHdpc2hlcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiB1bm5lY2Vzc2FyeSBtZXNzYWdlcy4KKyAqCW8gUmVtb3ZlZCBib2d1cyBtZXNzYWdlIG9uIENSQyBlcnJvci4KKyAqCW8gTWVyZ2VkIGZpeGVzIGZvciB2MC4wOCBQcmlzbSAyIGZpcm13YXJlIGZyb20gV2lsbGlhbSBXYWdob3JuCisgKgkgIDx3aWxsd2FnaG9ybiBBVCB5YWhvby5jby51az4KKyAqCW8gU2xpZ2h0IGNsZWFudXAvcmUtYXJyYW5nZW1lbnQgb2YgZmlybXdhcmUgZGV0ZWN0aW9uIGNvZGUuCisgKgorICogdjAuMDZkIC0+IHYwLjA2ZSAtIDEvOC8yMDAxIC0gRGF2aWQgR2lic29uCisgKglvIFJlbW92ZWQgc29tZSByZWR1bmRhbnQgZ2xvYmFsIGluaXRpYWxpemVycyAob3Jpbm9jb19jcy5jKS4KKyAqCW8gQWRkZWQgc29tZSBtb2R1bGUgbWV0YWRhdGEKKyAqCisgKiB2MC4wNmUgLT4gdjAuMDZmIC0gMTQvOC8yMDAxIC0gRGF2aWQgR2lic29uCisgKglvIFdvcmRpbmcgZml4IHRvIGxpY2Vuc2UKKyAqCW8gQWRkZWQgYSAndXNlX2FsdGVybmF0ZV9lbmNhcHMnIG1vZHVsZSBwYXJhbWV0ZXIgZm9yIEFQcyB3aGljaCBuZWVkIGFuCisgKgkgIG91aSBvZiAwMDowMDowMC4gIFdlIHJlYWxseSBuZWVkIGEgYmV0dGVyIHdheSBvZiBoYW5kbGluZyB0aGlzLCBidXQKKyAqCSAgdGhlIG1vZHVsZSBmbGFnIGlzIGJldHRlciB0aGFuIG5vdGhpbmcgZm9yIG5vdy4KKyAqCisgKiB2MC4wNmYgLT4gdjAuMDcgLSAyMC84LzIwMDEgLSBEYXZpZCBHaWJzb24KKyAqCW8gUmVtb3ZlZCBCQVAgZXJyb3IgcmV0cmllcyBmcm9tIGhlcm1lc19iYXBfc2VlaygpLiAgRm9yIFR4IHdlIG5vdworICoJICBsZXQgdGhlIHVwcGVyIGxheWVycyBoYW5kbGUgdGhlIHJldHJ5LCB3ZSByZXRyeSBleHBsaWNpdGx5IGluIHRoZQorICoJICBSeCBwYXRoLCBidXQgZG9uJ3QgbWFrZSBhcyBtdWNoIG5vaXNlIGFib3V0IGl0LgorICoJbyBGaXJtd2FyZSBkZXRlY3Rpb24gY2xlYW51cHMuCisgKgorICogdjAuMDcgLT4gdjAuMDdhIC0gMS8xMC8zMDAxIC0gSmVhbiBJSQorICoJbyBBZGQgY29kZSB0byByZWFkIFN5bWJvbCBmaXJtd2FyZSByZXZpc2lvbiwgaW5zcGlyZWQgYnkgbGF0ZXN0IGNvZGUKKyAqCSAgaW4gU3BlY3RydW0yNCBieSBMZWUgSm9obiBLZXlzZXItQWxsZW4gLSBUaGFua3MgTGVlICEKKyAqCW8gVGhhbmtzIHRvIEphcmVkIFZhbGVudGluZSA8aGlkZGVuIEFUIHhtaXNzaW9uLmNvbT4gZm9yICJwcm92aWRpbmciIG1lCisgKgkgIGEgM0NvbSBjYXJkIHdpdGggYSByZWNlbnQgZmlybXdhcmUsIGZpbGwgb3V0IFN5bWJvbCBmaXJtd2FyZQorICoJICBjYXBhYmlsaXRpZXMgb2YgbGF0ZXN0IHJldiAoMi4yMCksIGFzIHdlbGwgYXMgb2xkZXIgU3ltYm9sIGNhcmRzLgorICoJbyBEaXNhYmxlIFBvd2VyIE1hbmFnZW1lbnQgaW4gbmV3ZXIgU3ltYm9sIGZpcm13YXJlLCB0aGUgQVBJIAorICoJICBoYXMgY2hhbmdlZCAoZG9jdW1lbnRhdGlvbiBuZWVkZWQpLgorICoKKyAqIHYwLjA3YSAtPiB2MC4wOCAtIDMvMTAvMjAwMSAtIERhdmlkIEdpYnNvbgorICoJbyBGaXhlZCBhIHBvc3NpYmxlIGJ1ZmZlciBvdmVycnVuIGZvdW5kIGJ5IHRoZSBTdGFuZm9yZCBjaGVja2VyIChpbgorICoJICBkbGR3ZF9pb2N0bF9zZXRpd2VuY29kZSgpKS4gIENhbiBvbmx5IGJlIGNhbGxlZCBieSByb290IGFueXdheSwgc28gbm90CisgKgkgIGEgYmlnIHByb2JsZW0uCisgKglvIFR1cm5lZCBoYXNfYmlnX3dlcCBvbiBmb3IgSW50ZXJzaWwgY2FyZHMuICBUaGF0J3Mgbm90IHRydWUgZm9yIGFsbCBvZgorICoJICB0aGVtIGJ1dCB3ZSBzaG91bGQgYXQgbGVhc3QgbGV0IHRoZSBjYXBhYmxlIG9uZXMgdHJ5LgorICoJbyBXYWl0IGZvciBCVVNZIHRvIGNsZWFyIGF0IHRoZSBiZWdpbm5pbmcgb2YgaGVybWVzX2JhcF9zZWVrKCkuICBJCisgKgkgIHJlYWxpemVkIHRoYXQgbXkgYXNzdW1wdGlvbiB0aGF0IHRoZSBkcml2ZXIncyBzZXJpYWxpemF0aW9uCisgKgkgIHdvdWxkIHByZXZlbnQgdGhlIEJBUCBiZWluZyBidXN5IG9uIGVudHJ5IHdhcyBwb3NzaWJseSBmYWxzZSwgYmVjYXVzZQorICoJICB0aGluZ3Mgb3RoZXIgdGhhbiBzZWVrcyBtYXkgbWFrZSB0aGUgQkFQIGJ1c3kuCisgKglvIFVzZSAiYWx0ZXJuYXRlIiAob3VpIDAwOjAwOjAwKSBlbmNhcHN1bGF0aW9uIGJ5IGRlZmF1bHQuCisgKgkgIFNldHRpbmcgdXNlX29sZF9lbmNhcHMgd2lsbCBtaW1pYyB0aGUgb2xkIGJlaGF2aW91ciwgYnV0IEkgdGhpbmsgd2UKKyAqCSAgd2lsbCBiZSBhYmxlIHRvIGVsaW1pbmF0ZSB0aGlzLgorICoJbyBEb24ndCB0cnkgdG8gbWFrZSBfX2luaXRkYXRhIGNvbnN0ICh0aGUgdmVyc2lvbiBzdHJpbmcpLiAgVGhpcyBjYW4ndAorICoJICB3b3JrIGJlY2F1c2Ugb2YgdGhlIHdheSB0aGUgX19pbml0ZGF0YSBzZWN0aW9uaW5nIHdvcmtzLgorICoJbyBBZGRlZCBNT0RVTEVfTElDRU5TRSB0YWdzLgorICoJbyBTdXBwb3J0IGZvciBQTFggKHRyYW5zcGFyZW50IFBDTUNJQS0+UENJIGJyaWRnZSkgY2FyZHMuCisgKglvIENoYW5nZWQgdG8gdXNpbmcgdGhlIG5ldyB0eXBlLWZhc2Npc3QgbWluL21heC4KKyAqCisgKiB2MC4wOCAtPiB2MC4wOGEgLSA5LzEwLzIwMDEgLSBEYXZpZCBHaWJzb24KKyAqCW8gSW5zZXJ0ZWQgc29tZSBtaXNzaW5nIGFja25vd2xlZGdlbWVudHMvaW5mbyBpbnRvIHRoZSBDaGFuZ2Vsb2cuCisgKglvIEZpeGVkIHNvbWUgYnVncyBpbiB0aGUgbm9ybWFsaXphdGlvbiBvZiBzaWduYWwgbGV2ZWwgcmVwb3J0aW5nLgorICoJbyBGaXhlZCBiYWQgYnVnIGluIFdFUCBrZXkgaGFuZGxpbmcgb24gSW50ZXJzaWwgYW5kIFN5bWJvbCBmaXJtd2FyZSwKKyAqCSAgd2hpY2ggbGVkIHRvIGFuIGluc3RhbnQgY3Jhc2ggb24gYmlnLWVuZGlhbiBtYWNoaW5lcy4KKyAqCisgKiB2MC4wOGEgLT4gdjAuMDhiIC0gMjAvMTEvMjAwMSAtIERhdmlkIEdpYnNvbgorICoJbyBMb3RzIG9mIGNsZWFudXAgYW5kIGJ1Z2ZpeGVzIGluIG9yaW5vY29fcGx4LmMKKyAqCW8gQ2xlYW51cCB0byBoYW5kbGluZyBvZiBUeCByYXRlIHNldHRpbmcuCisgKglvIFJlbW92ZWQgc3VwcG9ydCBmb3Igb2xkIGVuY2Fwc3VsYXRpb24gbWV0aG9kLgorICoJbyBSZW1vdmVkIG9sZCAiZGxkd2QiIG5hbWVzLgorICoJbyBTcGxpdCBSSUQgY29uc3RhbnRzIGludG8gYSBuZXcgZmlsZSBoZXJtZXNfcmlkLmgKKyAqCW8gUmVuYW1lZCBSSUQgY29uc3RhbnRzIHRvIG1hdGNoIGxpbnV4LXdsYW4tbmcgYW5kIHByaXNtMi5vCisgKglvIEJ1Z2ZpeGVzIGluIGhlcm1lcy5jCisgKglvIFBva2UgdGhlIFBMWCdzIElOVENTUiByZWdpc3Rlciwgc28gaXQgYWN0dWFsbHkgc3RhcnRzCisgKgkgIGdlbmVyYXRpbmcgaW50ZXJydXB0cy4gIFRoZXNlIGNhcmRzIG1pZ2h0IGFjdHVhbGx5IHdvcmsgbm93LgorICoJbyBVcGRhdGUgdG8gd2lyZWxlc3MgZXh0ZW5zaW9ucyB2MTIgKEplYW4gSUkpCisgKglvIFN1cHBvcnQgZm9yIHRhbGxpZXMgYW5kIGlucXVpcmUgY29tbWFuZCAoSmVhbiBJSSkKKyAqCW8gQWlycG9ydCB1cGRhdGVzIGZvciBuZXdlciBQUEMga2VybmVscyAoQmVuSCkKKyAqCisgKiB2MC4wOGIgLT4gdjAuMDkgLSAyMS8xMi8yMDAxIC0gRGF2aWQgR2lic29uCisgKglvIFNvbWUgbmV3IFBDSSBJRHMgZm9yIFBMWCBjYXJkcy4KKyAqCW8gUmVtb3ZlZCBicm9rZW4gYXR0ZW1wdCB0byBkbyBBTExNVUxUSSByZWNlcHRpb24uICBKdXN0IHVzZQorICoJICBwcm9taXNjdW91cyBtb2RlIGluc3RlYWQKKyAqCW8gUHJlbGltaW5hcnkgd29yayBmb3IgbGlzdC1BUCAoSmVhbiBJSSkKKyAqCW8gQWlycG9ydCB1cGRhdGVzIGZyb20gKEJlbkgpCisgKglvIEVsaW1pbmF0ZWQgcmFjeSBod19yZWFkeSBzdHVmZgorICoJbyBGaXhlZCBnZW5lcmF0aW9uIG9mIGZha2UgZXZlbnRzIGluIGlycSBoYW5kbGVyLiAgVGhpcyBzaG91bGQKKyAqCSAgZmluYWxseSBraWxsIHRoZSBFSU8gcHJvYmxlbXMgKEplYW4gSUkgJiBkZ2lic29uKQorICoJbyBGaXhlZCBicmVha2FnZSBvZiBiaXRyYXRlIHNldC9nZXQgb24gQWdlcmUgZmlybXdhcmUgKEplYW4gSUkpCisgKgorICogdjAuMDkgLT4gdjAuMDlhIC0gMi8xLzIwMDIgLSBEYXZpZCBHaWJzb24KKyAqCW8gRml4ZWQgc3R1cGlkIG1pc3Rha2UgaW4gbXVsdGljYXN0IGxpc3QgaGFuZGxpbmcsIHRyaWdnZXJpbmcKKyAqCSAgYSBCVUcoKQorICoKKyAqIHYwLjA5YSAtPiB2MC4wOWIgLSAxNi8xLzIwMDIgLSBEYXZpZCBHaWJzb24KKyAqCW8gRml4ZWQgZXZlbiBzdHVwaWRlciBtaXN0YWtlIGluIG5ldyBpbnRlcnJ1cHQgaGFuZGxpbmcsIHdoaWNoCisgKgkgIHNlcmlvdXNseSBicm9rZSB0aGluZ3Mgb24gYmlnLWVuZGlhbiBtYWNoaW5lcy4KKyAqCW8gUmVtb3ZlZCBhIGJ1bmNoIG9mIHJlZHVuZGFudCBpbmNsdWRlcyBhbmQgZXhwb3J0cy4KKyAqCW8gUmVtb3ZlZCBhIHJlZHVuZGFudCBNT0Rfe0lOQyxERUN9X1VTRV9DT1VOVCBwYWlyIGluIGFpcnBvcnQuYworICoJbyBEb24ndCBhdHRlbXB0IHRvIGRvIGhhcmR3YXJlIGxldmVsIG11bHRpY2FzdCByZWNlcHRpb24gb24KKyAqCSAgSW50ZXJzaWwgZmlybXdhcmUsIGp1c3QgZ28gcHJvbWlzYyBpbnN0ZWFkLgorICoJbyBUeXBvIGZpeGVkIGluIGhlcm1lc19pc3N1ZV9jbWQoKQorICoJbyBFbGltaW5hdGVkIFdJUkVMRVNTX1NQWSAjaWZkZWZzCisgKglvIFN0YXR1cyBjb2RlIHJlcG9ydGVkIG9uIFR4IGV4Y2VwdGlvbnMKKyAqCW8gTW92ZWQgbmV0aWZfd2FrZV9xdWV1ZSgpIGZyb20gQUxMT0MgaW50ZXJydXB0cyB0byBUWCBhbmQgVFhFWEMKKyAqCSAgaW50ZXJydXB0cywgd2hpY2ggc2hvdWxkIGZpeCB0aGUgdGltZW91dHMgd2UncmUgc2VlaW5nLgorICoKKyAqIHYwLjA5YiAtPiB2MC4xMCAtIDI1IEZlYiAyMDAyIC0gRGF2aWQgR2lic29uCisgKglvIFJlbW92ZWQgbmVzdGVkIHN0cnVjdHVyZXMgdXNlZCBmb3IgaGVhZGVyIHBhcnNpbmcsIHNvIHRoZQorICoJICBkcml2ZXIgc2hvdWxkIG5vdyB3b3JrIHdpdGhvdXQgaGFja2VyeSBvbiBBUk0KKyAqCW8gRml4IGZvciBXRVAgaGFuZGxpbmcgb24gSW50ZXJzaWwgKEhhd2sgTmV3dG9uKQorICoJbyBFbGltaW5hdGVkIHRoZSAvcHJvYy9oZXJtZXMvZXRoWFgvcmVncyBkZWJ1Z2dpbmcgZmlsZS4gIEl0CisgKgkgIHdhcyBuZXZlciB2ZXJ5IHVzZWZ1bC4KKyAqCW8gTWFrZSBSeCBlcnJvcnMgbGVzcyBub2lzeS4KKyAqCisgKiB2MC4xMCAtPiB2MC4xMSAtIDUgQXByIDIwMDIgLSBEYXZpZCBHaWJzb24KKyAqCW8gTGFpZCB0aGUgZ3JvdW5kd29yayBpbiBoZXJtZXMuW2NoXSBmb3IgZGV2aWNlcyB3aGljaCBtYXAKKyAqCSAgaW50byBQQ0kgbWVtb3J5IHNwYWNlIHJhdGhlciB0aGFuIElPIHNwYWNlLgorICoJbyBGaXhlZCBidWcgaW4gbXVsdGljYXN0IGhhbmRsaW5nIChjbGVhcmVkIG11bHRpY2FzdCBsaXN0IHdoZW4KKyAqCSAgbGVhdmluZyBwcm9taXNjdW91cyBtb2RlKS4KKyAqCW8gUmVsZWdhdGVkIFR4IGVycm9yIG1lc3NhZ2VzIHRvIGRlYnVnLgorICoJbyBDbGVhbmVkIHVwIC8gY29ycmVjdGVkIGhhbmRsaW5nIG9mIGFsbG9jYXRpb24gbGVuZ3Rocy4KKyAqCW8gU2V0IE9XTlNTSUQgaW4gSUJTUyBtb2RlIGZvciBXaW5YUCBpbnRlcm9wZXJhYmlsaXR5IChqaW1jKS4KKyAqCW8gQ2hhbmdlIHRvIHVzaW5nIGFsbG9jX2V0aGVyZGV2KCkgZm9yIHN0cnVjdHVyZSBhbGxvY2F0aW9ucy4gCisgKglvIENoZWNrIGZvciBhbmQgZHJvcCB1bmRlcnNpemVkIHBhY2tldHMuCisgKglvIEZpeGVkIGEgcmFjZSBpbiBzdG9wcGluZy93YWtpbmcgdGhlIHF1ZXVlLiAgVGhpcyBzaG91bGQgZml4CisgKgkgIHRoZSB0aW1lb3V0IHByb2JsZW1zIChQYXZlbCBSb3NraW4pCisgKglvIFJldmVydGVkIHRvIG5ldGlmX3dha2VfcXVldWUoKSBvbiB0aGUgQUxMT0MgZXZlbnQuCisgKglvIEZpeGVzIGZvciByZWNlbnQgU3ltYm9sIGZpcm13YXJlcyB3aGljaCBsYWNrIEFQIGRlbnNpdHkKKyAqCSAgKFBhdmVsIFJvc2tpbikuCisgKgorICogdjAuMTEgLT4gdjAuMTFhIC0gMjkgQXByIDIwMDIgLSBEYXZpZCBHaWJzb24KKyAqCW8gSGFuZGxlIGRpZmZlcmVudCByZWdpc3RlciBzcGFjaW5nLCBuZWNlc3NhcnkgZm9yIFByaXNtIDIuNQorICoJICBQQ0kgYWRhcHRvcnMgKFN0ZXZlIEhpbGwpLgorICoJbyBDbGVhbmVkIHVwIGluaXRpYWxpemF0aW9uIG9mIGNhcmQgc3RydWN0dXJlcyBpbiBvcmlub2NvX2NzCisgKgkgIGFuZCBhaXJwb3J0LiAgUmVtb3ZlZCBjYXJkLT5wcml2IGZpZWxkLgorICoJbyBNYWtlIHJlc3BvbnNlIHN0cnVjdHVyZSBvcHRpb25hbCBmb3IgaGVybWVzX2RvY21kX3dhaXQoKQorICoJICBQYXZlbCBSb3NraW4pCisgKglvIEFkZGVkIFBDSSBpZCBmb3IgTm9ydGVsIGVtb2JpbGl0eSB0byBvcmlub2NvX3BseC5jLgorICoJbyBDbGVhbnVwIHRvIGhhbmRsaW5nIG9mIFN5bWJvbCdzIGFsbG9jYXRpb24gYnVnLiAoUGF2ZWwgUm9za2luKQorICoJbyBDbGVhbnVwcyB0byBmaXJtd2FyZSBjYXBhYmlsaXR5IGRldGVjdGlvbi4KKyAqCW8gQXJyYW5nZSBmb3Igb3Jpbm9jb19wY2kuYyB0byBvdmVycmlkZSBmaXJtd2FyZSBkZXRlY3Rpb24uCisgKgkgIFdlIHNob3VsZCBiZSBhYmxlIHRvIHN1cHBvcnQgdGhlIFBDSSBJbnRlcnNpbCBjYXJkcyBub3cuCisgKglvIENsZWFudXAgaGFuZGxpbmcgb2YgcmVzZXRfY29yIGFuZCBoYXJkX3Jlc2V0IChQYXZlbCBSb3NraW4pLgorICoJbyBSZW1vdmUgZXJyb25lb3VzIHVzZSBvZiBVU0VSX0JBUCBpbiB0aGUgVHhFeGMgaGFuZGxlciAoSm91bmkKKyAqCSAgTWFsaW5lbikuCisgKglvIE1ha2VmaWxlIGNoYW5nZXMgZm9yIGJldHRlciBpbnRlZ3JhdGlvbiBpbnRvIERhdmlkIEhpbmRzCisgKgkgIHBjbWNpYS1jcyBwYWNrYWdlLgorICoKKyAqIHYwLjExYSAtPiB2MC4xMWIgLSAxIE1heSAyMDAyIC0gRGF2aWQgR2lic29uCisgKglvIEJldHRlciBlcnJvciByZXBvcnRpbmcgaW4gb3Jpbm9jb19wbHhfaW5pdF9vbmUoKQorICoJbyBGaXhlZCBtdWx0aXBsZSBiYWQga2ZyZWUoKSBidWdzIGludHJvZHVjZWQgYnkgdGhlCisgKgkgIGFsbG9jX29yaW5vY29kZXYoKSBjaGFuZ2VzLgorICoKKyAqIHYwLjExYiAtPiB2MC4xMiAtIDE5IEp1biAyMDAyIC0gRGF2aWQgR2lic29uCisgKglvIFN1cHBvcnQgY2hhbmdpbmcgdGhlIE1BQyBhZGRyZXNzLgorICoJbyBDb3JyZWN0IGRpc3BsYXkgb2YgSW50ZXJzaWwgZmlybXdhcmUgcmV2aXNpb24gbnVtYmVycy4KKyAqCW8gRW50aXJlbHkgcmV2aXNlZCBsb2NraW5nIHNjaGVtZS4gIFNob3VsZCBiZSBib3RoIHNpbXBsZXIgYW5kCisgKgkgICBiZXR0ZXIuCisgKglvIE1lcmdlZCBzb21lIGNvbW1vbiBjb2RlIGluIG9yaW5vY29fcGx4LCBvcmlub2NvX3BjaSBhbmQKKyAqCSAgYWlycG9ydCBieSBjcmVhdGluZyBvcmlub2NvX2RlZmF1bHRfe29wZW4sc3RvcCxyZXNldH0oKQorICoJICB3aGljaCBhcmUgdXNlZCBhcyB0aGUgZGV2LT5vcGVuLCBkZXYtPnN0b3AsIHByaXYtPnJlc2V0CisgKgkgIGNhbGxiYWNrcyBpZiBub25lIGFyZSBzcGVjaWZpZWQgd2hlbiBhbGxvY19vcmlub2NvZGV2KCkgaXMKKyAqCSAgY2FsbGVkLgorICoJbyBSZW1vdmVkIG9yaW5vY29fcGx4X2ludGVycnVwdCgpIGFuZCBvcmlub2NvX3BjaV9pbnRlcnJ1cHQoKS4KKyAqCSAgVGhleSBkaWRuJ3QgZG8gYW55dGhpbmcuCisgKgorICogdjAuMTIgLT4gdjAuMTJhIC0gNCBKdWwgMjAwMiAtIERhdmlkIEdpYnNvbgorICoJbyBTb21lIHJlYXJyYW5nZW1lbnQgb2YgY29kZS4KKyAqCW8gTnVtZXJvdXMgZml4dXBzIHRvIGxvY2tpbmcgYW5kIHJlc3QgaGFuZGxpbmcsIHBhcnRpY3VsYXJseQorICoJICBmb3IgUENNQ0lBLgorICoJbyBUaGlzIGFsbG93cyBvcGVuIGFuZCBzdG9wIG5ldF9kZXZpY2UgbWV0aG9kcyB0byBiZSBpbgorICoJICBvcmlub2NvLmMgbm93LCByYXRoZXIgdGhhbiBpbiB0aGUgaW5pdCBtb2R1bGVzLgorICoJbyBJbiBvcmlub2NvX2NzLmMgbGluay0+cHJpdiBub3cgcG9pbnRzIHRvIHRoZSBzdHJ1Y3QKKyAqCSAgbmV0X2RldmljZSBub3QgdG8gdGhlIHN0cnVjdCBvcmlub2NvX3ByaXZhdGUuCisgKglvIEFkZGVkIGEgY2hlY2sgZm9yIHVuZGVyc2l6ZWQgU05BUCBmcmFtZXMsIHdoaWNoIGNvdWxkIGNhdXNlCisgKgkgIGNyYXNoZXMuCisgKgorICogdjAuMTJhIC0+IHYwLjEyYiAtIDExIEp1bCAyMDAyIC0gRGF2aWQgR2lic29uCisgKglvIEZpeCBody0+bnVtX2luaXQgdGVzdGluZyBjb2RlLCBzbyBudW1faW5pdCBpcyBhY3R1YWxseQorICoJICBpbmNyZW1lbnRlZC4KKyAqCW8gRml4IHZlcnkgc3R1cGlkIGJ1ZyBpbiBvcmlub2NvX2NzIHdoaWNoIGJyb2tlIGNvbXBpbGUgd2l0aAorICoJICBDT05GSUdfU01QLgorICoJbyBTcXVhc2hlZCBhIHdhcm5pbmcuCisgKgorICogdjAuMTJiIC0+IHYwLjEyYyAtIDI2IEp1bCAyMDAyIC0gRGF2aWQgR2lic29uCisgKglvIENoYW5nZSB0byBDOVggc3R5bGUgZGVzaWduYXRlZCBpbml0aWFsaXplcnMuCisgKglvIEFkZCBzdXBwb3J0IGZvciAzQ29tIEFpckNvbm5lY3QgUENJLgorICoJbyBObyBsb25nZXIgaWdub3JlIHRoZSBoYXJkX3Jlc2V0IGFyZ3VtZW50IHRvCisgKgkgIGFsbG9jX29yaW5vY29kZXYoKS4gIE9vcHMuCisgKgorICogdjAuMTJjIC0+IHYwLjEzYmV0YTEgLSAxMyBTZXAgMjAwMiAtIERhdmlkIEdpYnNvbgorICoJbyBSZXZlcnQgdGhlIGJyb2tlbiAwLjEyKiBsb2NraW5nIHNjaGVtZSBhbmQgZ28gdG8gYSBuZXcgeWV0CisgKgkgIHNpbXBsZXIgc2NoZW1lLgorICoJbyBEbyBmaXJtd2FyZSByZXNldHMgb25seSBpbiBvcmlub2NvX2luaXQoKSBhbmQgd2hlbiB3YWtpbmcKKyAqCSAgdGhlIGNhcmQgZnJvbSBoYXJkIHNsZWVwLgorICoKKyAqIHYwLjEzYmV0YTEgLT4gdjAuMTMgLSAyNyBTZXAgMjAwMiAtIERhdmlkIEdpYnNvbgorICoJbyBSZS1pbnRyb2R1Y2VkIGZ1bGwgcmVzZXRzICh2aWEgc2NoZWR1bGVfdGFzaygpKSBvbiBUeAorICoJICB0aW1lb3V0LgorICoKKyAqIHYwLjEzIC0+IHYwLjEzYSAtIDMwIFNlcCAyMDAyIC0gRGF2aWQgR2lic29uCisgKglvIE1pbm9yIGNsZWFudXBzIHRvIGluZm8gZnJhbWUgaGFuZGxpbmcuICBBZGQgYmFzaWMgc3VwcG9ydAorICoJICBmb3IgbGlua3N0YXR1cyBpbmZvIGZyYW1lcy4KKyAqCW8gSW5jbHVkZSByZXF1aXJlZCBrZXJuZWwgaGVhZGVycyBpbiBvcmlub2NvLmgsIHRvIGF2b2lkCisgKgkgIGNvbXBpbGUgcHJvYmxlbXMuCisgKgorICogdjAuMTNhIC0+IHYwLjEzYiAtIDEwIEZlYiAyMDAzIC0gRGF2aWQgR2lic29uCisgKglvIEltcGxlbWVudGVkIGhhcmQgcmVzZXQgZm9yIEFpcnBvcnQgY2FyZHMKKyAqCW8gRXhwZXJpbWVudGFsIHN1c3BlbmQvcmVzdW1lIGltcGxlbWVudGF0aW9uIGZvciBvcmlub2NvX3BjaQorICoJbyBBYm9saXNoZWQgL3Byb2MgZGVidWdnaW5nIHN1cHBvcnQsIHJlcGxhY2VkIHdpdGggYSBkZWJ1Z2dpbmcKKyAqCSAgaXdwcml2LiAgTm93IGl0J3MgdWdseSBhbmQgc2ltcGxlIGluc3RlYWQgb2YgdWdseSBhbmQgY29tcGxleC4KKyAqCW8gQnVnZml4IGluIGhlcm1lcy5jIGlmIHRoZSBmaXJtd2FyZSByZXR1cm5lZCBhIHJlY29yZCBsZW5ndGgKKyAqCSAgb2YgMCwgd2UgY291bGQgZ28gY2xvYmJlcmluZyBtZW1vcnkuCisgKglvIEJ1Z2ZpeCBpbiBvcmlub2NvX3N0b3AoKSAtIGl0IHVzZWQgdG8gZmFpbCBpZiBod191bmF2YWlsYWJsZQorICoJICB3YXMgc2V0LCB3aGljaCB3YXMgdXN1YWxseSB0cnVlIG9uIFBDTUNJQSBob3QgcmVtb3Zlcy4KKyAqIAlvIFRyYWNrIExJTktTVEFUVVMgbWVzc2FnZXMsIHNpbGVudGx5IGRyb3AgVHggcGFja2V0cyBiZWZvcmUKKyAqIAkgIHdlIGFyZSBjb25uZWN0ZWQgKGF2b2lkcyBjb25mdXNpbmcgdGhlIGZpcm13YXJlKSwgYW5kIG9ubHkKKyAqIAkgIGdpdmUgTElOS1NUQVRVUyBwcmludGsoKXMgaWYgdGhlIHN0YXR1cyBoYXMgY2hhbmdlZC4KKyAqCisgKiB2MC4xM2IgLT4gdjAuMTNjIC0gMTEgTWFyIDIwMDMgLSBEYXZpZCBHaWJzb24KKyAqCW8gQ2xlYW51cDogdXNlIGRldiBpbnN0ZWFkIG9mIHByaXYgaW4gdmFyaW91cyBwbGFjZXMuCisgKglvIEJ1ZyBmaXg6IERvbid0IFJlbGVhc2VDb25maWd1cmF0aW9uIG9uIFJFU0VUX1BIWVNJQ0FMIGV2ZW50CisgKgkgIGlmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSAoZHJpdmVyIGluaXRpYXRlZCkgaGFyZCByZXNldC4KKyAqCW8gQnVnIGZpeDogRVRIX1pMRU4gaXMgc3VwcG9zZWQgdG8gaW5jbHVkZSB0aGUgaGVhZGVyCisgKgkgIChEaW9ueXN1cyBCbGF6YWtpcyAmIE1hbmlzaCBLYXJpcikKKyAqCW8gQ29udmVydCB0byB1c2luZyB3b3JrcXVldWVzIGluc3RlYWQgb2YgdGFza3F1ZXVlcyAoYW5kCisgKgkgIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG1hY3JvcyBmb3IgcHJlIDIuNS40MSBrZXJuZWxzKS4KKyAqCW8gRHJvcCByZWR1bmRhbnQgKEkgdGhpbmsuLi4pIE1PRF97SU5DLERFQ31fVVNFX0NPVU5UIGluCisgKgkgIGFpcnBvcnQuYworICoJbyBOZXcgb3Jpbm9jb190bWQuYyBpbml0IG1vZHVsZSBmcm9tIEpvZXJnIERvcmNoYWluIGZvcgorICoJICBUTUQ3MTYwIGJhc2VkIFBDSSB0byBQQ01DSUEgYnJpZGdlcyAoc2ltaWxhciB0bworICoJICBvcmlub2NvX3BseC5jKS4KKyAqCisgKiB2MC4xM2MgLT4gdjAuMTNkIC0gMjIgQXByIDIwMDMgLSBEYXZpZCBHaWJzb24KKyAqCW8gTWFrZSBod191bmF2YWlsYWJsZSBhIGNvdW50ZXIsIHJhdGhlciB0aGFuIGp1c3QgYSBmbGFnLCB0aGlzCisgKgkgIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBzb21lIHJhY2VzIChzdWNoIGFzIGEgY2FyZCBiZWluZworICoJICByZW1vdmVkIGluIHRoZSBtaWRkbGUgb2Ygb3Jpbm9jb19yZXNldCgpLgorICoJbyBSZXN0b3JlIFJlbGVhc2UvUmVxdWVzdENvbmZpZ3VyYXRpb24gaW4gdGhlIFBDTUNJQSBldmVudCBoYW5kbGVyCisgKgkgIHdoZW4gZGVhbGluZyB3aXRoIGEgZHJpdmVyIGluaXRpYXRlZCBoYXJkIHJlc2V0LiAgVGhpcyBpcworICoJICBuZWNlc3NhcnkgdG8gcHJldmVudCBoYW5ncyBkdWUgdG8gYSBzcHVyaW91cyBpbnRlcnJ1cHQgd2hpbGUKKyAqCSAgdGhlIHJlc2V0IGlzIGluIHByb2dyZXNzLgorICoJbyBDbGVhciB0aGUgODAyLjExIGhlYWRlciB3aGVuIHRyYW5zbWl0dGluZywgZXZlbiB0aG91Z2ggd2UKKyAqCSAgZG9uJ3QgdXNlIGl0LiAgVGhpcyBmaXhlcyBhIGxvbmcgc3RhbmRpbmcgYnVnIG9uIHNvbWUKKyAqCSAgZmlybXdhcmVzLCB3aGljaCBzZWVtIHRvIGdldCBjb25mdXNlZCBpZiB0aGF0IGlzbid0IGRvbmUuCisgKglvIEJlIGxlc3MgZWFnZXIgdG8gZGUtZW5jYXBzdWxhdGUgU05BUCBmcmFtZXMsIG9ubHkgZG8gc28gaWYKKyAqCSAgdGhlIE9VSSBpcyAwMDowMDowMCBvciAwMDowMDpmOCwgbGVhdmUgb3RoZXJzIGFsb25lLiAgVGhlIG9sZAorICoJICBiZWhhdmlvdXIgYnJva2UgQ0RQIChDaXNjbyBEaXNjb3ZlcnkgUHJvdG9jb2wpLgorICoJbyBVc2UgZGV2IGluc3RlYWQgb2YgcHJpdiBmb3IgZnJlZV9pcnEoKSBhcyB3ZWxsIGFzCisgKgkgIHJlcXVlc3RfaXJxKCkgKG9vcHMpLgorICoJbyBBdHRlbXB0IHRvIHJlc2V0IHJhdGhlciB0aGFuIGdpdmluZyB1cCBpZiB3ZSBnZXQgdG9vIG1hbnkKKyAqCSAgSVJRcy4KKyAqCW8gQ2hhbmdlZCBzZW1hbnRpY3Mgb2YgX19vcmlub2NvX2Rvd24oKSBzbyBpdCBjYW4gYmUgY2FsbGVkCisgKgkgIHNhZmVseSB3aXRoIGh3X3VuYXZhaWxhYmxlIHNldC4gIEl0IGFsc28gbm93IGNsZWFycyB0aGUKKyAqCSAgbGlua3N0YXR1cyAoc2luY2Ugd2UncmUgZ29pbmcgdG8gaGF2ZSB0byByZWFzc29jaWF0ZSkuCisgKgorICogdjAuMTNkIC0+IHYwLjEzZSAtIDEyIE1heSAyMDAzIC0gRGF2aWQgR2lic29uCisgKglvIFN1cHBvcnQgZm9yIHBvc3QtMi41LjY4IHJldHVybiB2YWx1ZXMgZnJvbSBpcnEgaGFuZGxlci4KKyAqCW8gRml4ZWQgYnVnIHdoZXJlIHVuZGVybGVuZ3RoIHBhY2tldHMgd291bGQgYmUgZG91YmxlIGNvdW50ZWQKKyAqCSAgaW4gdGhlIHJ4X2Ryb3BwZWQgc3RhdGlzdGljcy4KKyAqCW8gUHJvdmlkZWQgYSBtb2R1bGUgcGFyYW1ldGVyIHRvIHN1cHByZXNzIGxpbmtzdGF0dXMgbWVzc2FnZXMuCisgKgorICogdjAuMTNlIC0+IHYwLjE0YWxwaGExIC0gMzAgU2VwIDIwMDMgLSBEYXZpZCBHaWJzb24KKyAqCW8gUmVwbGFjZWQgcHJpdi0+Y29ubmVjdGVkIGxvZ2ljIHdpdGggbmV0aWZfY2Fycmllcl9vbi9vZmYoKQorICoJICBjYWxscy4KKyAqCW8gUmVtb3ZlIGhhc19pYnNzX2FueSBhbmQgbmV2ZXIgc2V0IHRoZSBDUkVBVEVJQlNTIFJJRCB3aGVuCisgKgkgIHRoZSBFU1NJRCBpcyBlbXB0eS4gIFRvbyBtYW55IGZpcm13YXJlcyBicmVhayBpZiB3ZSBkby4KKyAqCW8gMi42IG1lcmdlczogUmVwbGFjZSBwZGV2LT5zbG90X25hbWUgd2l0aCBwY2lfbmFtZSgpLCByZW1vdmUKKyAqCSAgX19kZXZpbml0ZGF0YSBmcm9tIFBDSSBJRCB0YWJsZXMsIHVzZSBmcmVlX25ldGRldigpLgorICoJbyBFbmFibGVkIHNoYXJlZC1rZXkgYXV0aGVudGljYXRpb24gZm9yIEFnZXJlIGZpcm13YXJlIChmcm9tCisgKgkgIFJvYmVydCBKLiBNb29yZSA8Um9iZXJ0LkouTW9vcmUgQVQgYWxsYW5iYW5rLmNvbT4KKyAqCW8gTW92ZSBuZXRpZl93YWtlX3F1ZXVlKCkgKGJhY2spIHRvIHRoZSBUeCBjb21wbGV0aW9uIGZyb20gdGhlCisgKgkgIEFMTE9DIGV2ZW50LiAgVGhpcyBzZWVtcyB0byBwcmV2ZW50L21pdGlnYXRlIHRoZSByb2xsaW5nCisgKgkgIGVycm9yIC0xMTAgcHJvYmxlbXMgYXQgbGVhc3Qgb24gc29tZSBJbnRlcnNpbCBmaXJtd2FyZXMuCisgKgkgIFRoZW9yZXRpY2FsbHkgcmVkdWNlcyBwZXJmb3JtYW5jZSwgYnV0IEkgY2FuJ3QgbWVhc3VyZSBpdC4KKyAqCSAgUGF0Y2ggZnJvbSBBbmRyZXcgVHJpZGdlbGwgPHRyaWRnZSBBVCBzYW1iYS5vcmc+CisgKgorICogdjAuMTRhbHBoYTEgLT4gdjAuMTRhbHBoYTIgLSAyMCBPY3QgMjAwMyAtIERhdmlkIEdpYnNvbgorICoJbyBDb3JyZWN0bHkgdHVybiBvZmYgc2hhcmVkLWtleSBhdXRoZW50aWNhdGlvbiB3aGVuIHJlcXVlc3RlZAorICoJICAoYnVnZml4IGZyb20gUm9iZXJ0IEouIE1vb3JlKS4KKyAqCW8gQ29ycmVjdCBhaXJwb3J0IHNsZWVwIGludGVyZmFjZXMgZm9yIGN1cnJlbnQgMi42IGtlcm5lbHMuCisgKglvIEFkZCBjb2RlIGZvciBrZXkgY2hhbmdlIHdpdGhvdXQgZGlzYWJsaW5nL2VuYWJsaW5nIHRoZSBNQUMKKyAqCSAgcG9ydC4gIFRoaXMgaXMgc3VwcG9zZWQgdG8gYWxsb3cgODAyLjF4IHRvIHdvcmsgc2FuZWx5LCBidXQKKyAqCSAgZG9lc24ndCBzZWVtIHRvIHlldC4KKyAqCisgKiBUT0RPCisgKglvIE5ldyB3aXJlbGVzcyBleHRlbnNpb25zIEFQSSAocGF0Y2ggZnJvbSBNb3VzdGFmYQorICoJICBZb3Vzc2VmLCB1cGRhdGVkIGJ5IEppbSBDYXJ0ZXIgYW5kIFBhdmVsIFJvc2tpbikuCisgKglvIEhhbmRsZSBkZS1lbmNhcHN1bGF0aW9uIHdpdGhpbiBuZXR3b3JrIGxheWVyLCBwcm92aWRlIDgwMi4xMQorICoJICBoZWFkZXJzIChwYXRjaCBmcm9tIFRob21hcyAnRGVudCcgTWlybGFjaGVyKQorICoJbyBSRiBtb25pdG9yIG1vZGUgc3VwcG9ydAorICoJbyBGaXggcG9zc2libGUgcmFjZXMgaW4gU1BZIGhhbmRsaW5nLgorICoJbyBEaXNjb25uZWN0IHdpcmVsZXNzIGV4dGVuc2lvbnMgZnJvbSBmdW5kYW1lbnRhbCBjb25maWd1cmF0aW9uLgorICoJbyAobWF5YmUpIFNvZnR3YXJlIFdFUCBzdXBwb3J0IChwYXRjaCBmcm9tIFN0YW5vIE1lZHVuYSkuCisgKglvIChtYXliZSkgVXNlIG11bHRpcGxlIFR4IGJ1ZmZlcnMgLSBkcml2ZXIgaGFuZGxpbmcgcXVldWUKKyAqCSAgcmF0aGVyIHRoYW4gZmlybXdhcmUuCisgKi8KKworLyogTG9ja2luZyBhbmQgc3luY2hyb25pemF0aW9uOgorICoKKyAqIFRoZSBiYXNpYyBwcmluY2lwbGUgaXMgdGhhdCBldmVyeXRoaW5nIGlzIHNlcmlhbGl6ZWQgdGhyb3VnaCBhCisgKiBzaW5nbGUgc3BpbmxvY2ssIHByaXYtPmxvY2suICBUaGUgbG9jayBpcyB1c2VkIGluIHVzZXIsIGJoIGFuZCBpcnEKKyAqIGNvbnRleHQsIHNvIHdoZW4gdGFrZW4gb3V0c2lkZSBoYXJkaXJxIGNvbnRleHQgaXQgc2hvdWxkIGFsd2F5cyBiZQorICogdGFrZW4gd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLiAgVGhlIGxvY2sgcHJvdGVjdHMgYm90aCB0aGUKKyAqIGhhcmR3YXJlIGFuZCB0aGUgc3RydWN0IG9yaW5vY29fcHJpdmF0ZS4KKyAqCisgKiBBbm90aGVyIGZsYWcsIHByaXYtPmh3X3VuYXZhaWxhYmxlIGluZGljYXRlcyB0aGF0IHRoZSBoYXJkd2FyZSBpcworICogdW5hdmFpbGFibGUgZm9yIGFuIGV4dGVuZGVkIHBlcmlvZCBvZiB0aW1lIChlLmcuIHN1c3BlbmRlZCwgb3IgaW4KKyAqIHRoZSBtaWRkbGUgb2YgYSBoYXJkIHJlc2V0KS4gIFRoaXMgZmxhZyBpcyBwcm90ZWN0ZWQgYnkgdGhlCisgKiBzcGlubG9jay4gIEFsbCBjb2RlIHdoaWNoIHRvdWNoZXMgdGhlIGhhcmR3YXJlIHNob3VsZCBjaGVjayB0aGUKKyAqIGZsYWcgYWZ0ZXIgdGFraW5nIHRoZSBsb2NrLCBhbmQgaWYgaXQgaXMgc2V0LCBnaXZlIHVwIG9uIHdoYXRldmVyCisgKiB0aGV5IGFyZSBkb2luZyBhbmQgZHJvcCB0aGUgbG9jayBhZ2Fpbi4gIFRoZSBvcmlub2NvX2xvY2soKQorICogZnVuY3Rpb24gaGFuZGxlcyB0aGlzIChpdCB1bmxvY2tzIGFuZCByZXR1cm5zIC1FQlVTWSBpZgorICogaHdfdW5hdmFpbGFibGUgaXMgbm9uLXplcm8pLgorICovCisKKyNkZWZpbmUgRFJJVkVSX05BTUUgIm9yaW5vY28iCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgImhlcm1lcy5oIgorI2luY2x1ZGUgImhlcm1lc19yaWQuaCIKKyNpbmNsdWRlICJvcmlub2NvLmgiCisjaW5jbHVkZSAiaWVlZTgwMl8xMS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNb2R1bGUgaW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK01PRFVMRV9BVVRIT1IoIlBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+ICYgRGF2aWQgR2lic29uIDxoZXJtZXNAZ2lic29uLmRyb3BiZWFyLmlkLmF1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIEx1Y2VudCBPcmlub2NvLCBQcmlzbSBJSSBiYXNlZCBhbmQgc2ltaWxhciB3aXJlbGVzcyBjYXJkcyIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTVBML0dQTCIpOworCisvKiBMZXZlbCBvZiBkZWJ1Z2dpbmcuIFVzZWQgaW4gdGhlIG1hY3JvcyBpbiBvcmlub2NvLmggKi8KKyNpZmRlZiBPUklOT0NPX0RFQlVHCitpbnQgb3Jpbm9jb19kZWJ1ZyA9IE9SSU5PQ09fREVCVUc7Cittb2R1bGVfcGFyYW0ob3Jpbm9jb19kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mob3Jpbm9jb19kZWJ1ZywgIkRlYnVnIGxldmVsIik7CitFWFBPUlRfU1lNQk9MKG9yaW5vY29fZGVidWcpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgc3VwcHJlc3NfbGlua3N0YXR1czsgLyogPSAwICovCittb2R1bGVfcGFyYW0oc3VwcHJlc3NfbGlua3N0YXR1cywgYm9vbCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHN1cHByZXNzX2xpbmtzdGF0dXMsICJEb24ndCBsb2cgbGluayBzdGF0dXMgY2hhbmdlcyIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDb21waWxlIHRpbWUgY29uZmlndXJhdGlvbiBhbmQgY29tcGF0aWJpbGl0eSBzdHVmZiAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFdlIGRvIHRoaXMgdGhpcyB3YXkgdG8gYXZvaWQgaWZkZWZzIGluIHRoZSBhY3R1YWwgY29kZSAqLworI2lmZGVmIFdJUkVMRVNTX1NQWQorI2RlZmluZSBTUFlfTlVNQkVSKHByaXYpCShwcml2LT5zcHlfbnVtYmVyKQorI2Vsc2UKKyNkZWZpbmUgU1BZX05VTUJFUihwcml2KQkwCisjZW5kaWYgLyogV0lSRUxFU1NfU1BZICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEludGVybmFsIGNvbnN0YW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBPUklOT0NPX01JTl9NVFUJCTI1NgorI2RlZmluZSBPUklOT0NPX01BWF9NVFUJCShJRUVFODAyXzExX0RBVEFfTEVOIC0gRU5DQVBTX09WRVJIRUFEKQorCisjZGVmaW5lIFNZTUJPTF9NQVhfVkVSX0xFTgkoMTQpCisjZGVmaW5lIFVTRVJfQkFQCQkwCisjZGVmaW5lIElSUV9CQVAJCQkxCisjZGVmaW5lIE1BWF9JUlFMT09QU19QRVJfSVJRCTEwCisjZGVmaW5lIE1BWF9JUlFMT09QU19QRVJfSklGRlkJKDIwMDAwL0haKSAvKiBCYXNlZCBvbiBhIGd1ZXN0aW1hdGUgb2YKKwkJCQkJICAgICogaG93IG1hbnkgZXZlbnRzIHRoZQorCQkJCQkgICAgKiBkZXZpY2UgY291bGQKKwkJCQkJICAgICogbGVnaXRpbWF0ZWx5IGdlbmVyYXRlICovCisjZGVmaW5lIFNNQUxMX0tFWV9TSVpFCQk1CisjZGVmaW5lIExBUkdFX0tFWV9TSVpFCQkxMworI2RlZmluZSBUWF9OSUNCVUZfU0laRV9CVUcJMTU4NQkJLyogQnVnIGluIFN5bWJvbCBmaXJtd2FyZSAqLworCisjZGVmaW5lIERVTU1ZX0ZJRAkJMHhGRkZGCisKKy8qI2RlZmluZSBNQVhfTVVMVElDQVNUKHByaXYpCShwcml2LT5maXJtd2FyZV90eXBlID09IEZJUk1XQVJFX1RZUEVfQUdFUkUgPyBcCisgIEhFUk1FU19NQVhfTVVMVElDQVNUIDogMCkqLworI2RlZmluZSBNQVhfTVVMVElDQVNUKHByaXYpCShIRVJNRVNfTUFYX01VTFRJQ0FTVCkKKworI2RlZmluZSBPUklOT0NPX0lOVEVOCSAJKEhFUk1FU19FVl9SWCB8IEhFUk1FU19FVl9BTExPQyBcCisJCQkJIHwgSEVSTUVTX0VWX1RYIHwgSEVSTUVTX0VWX1RYRVhDIFwKKwkJCQkgfCBIRVJNRVNfRVZfV1RFUlIgfCBIRVJNRVNfRVZfSU5GTyBcCisJCQkJIHwgSEVSTUVTX0VWX0lORkRST1AgKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEYXRhIHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZSBmcmVxdWVuY3kgb2YgZWFjaCBjaGFubmVsIGluIE1IeiAqLworc3RhdGljIGNvbnN0IGxvbmcgY2hhbm5lbF9mcmVxdWVuY3lbXSA9IHsKKwkyNDEyLCAyNDE3LCAyNDIyLCAyNDI3LCAyNDMyLCAyNDM3LCAyNDQyLAorCTI0NDcsIDI0NTIsIDI0NTcsIDI0NjIsIDI0NjcsIDI0NzIsIDI0ODQKK307CisjZGVmaW5lIE5VTV9DSEFOTkVMUyBBUlJBWV9TSVpFKGNoYW5uZWxfZnJlcXVlbmN5KQorCisvKiBUaGlzIHRhYmxlcyBnaXZlcyB0aGUgYWN0dWFsIG1lYW5pbmdzIG9mIHRoZSBiaXRyYXRlIElEcyByZXR1cm5lZAorICogYnkgdGhlIGZpcm13YXJlLiAqLworc3RhdGljIHN0cnVjdCB7CisJaW50IGJpdHJhdGU7IC8qIGluIDEwMHMgb2Yga2lsb2JpdHMgKi8KKwlpbnQgYXV0b21hdGljOworCXUxNiBhZ2VyZV90eHJhdGVjdHJsOworCXUxNiBpbnRlcnNpbF90eHJhdGVjdHJsOworfSBiaXRyYXRlX3RhYmxlW10gPSB7CisJezExMCwgMSwgIDMsIDE1fSwgLyogRW50cnkgMCBpcyB0aGUgZGVmYXVsdCAqLworCXsxMCwgIDAsICAxLCAgMX0sCisJezEwLCAgMSwgIDEsICAxfSwKKwl7MjAsICAwLCAgMiwgIDJ9LAorCXsyMCwgIDEsICA2LCAgM30sCisJezU1LCAgMCwgIDQsICA0fSwKKwl7NTUsICAxLCAgNywgIDd9LAorCXsxMTAsIDAsICA1LCAgOH0sCit9OworI2RlZmluZSBCSVRSQVRFX1RBQkxFX1NJWkUgQVJSQVlfU0laRShiaXRyYXRlX3RhYmxlKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEYXRhIHR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBoZWFkZXJfc3RydWN0IHsKKwkvKiA4MDIuMyAqLworCXU4IGRlc3RbRVRIX0FMRU5dOworCXU4IHNyY1tFVEhfQUxFTl07CisJdTE2IGxlbjsKKwkvKiA4MDIuMiAqLworCXU4IGRzYXA7CisJdTggc3NhcDsKKwl1OCBjdHJsOworCS8qIFNOQVAgKi8KKwl1OCBvdWlbM107CisJdTE2IGV0aGVydHlwZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiA4MDIuMiBMTEMvU05BUCBoZWFkZXIgdXNlZCBmb3IgRXRoZXJuZXQgZW5jYXBzdWxhdGlvbiBvdmVyIDgwMi4xMSAqLwordTggZW5jYXBzX2hkcltdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OworCisjZGVmaW5lIEVOQ0FQU19PVkVSSEVBRAkJKHNpemVvZihlbmNhcHNfaGRyKSArIDIpCisKK3N0cnVjdCBoZXJtZXNfcnhfZGVzY3JpcHRvciB7CisJdTE2IHN0YXR1czsKKwl1MzIgdGltZTsKKwl1OCBzaWxlbmNlOworCXU4IHNpZ25hbDsKKwl1OCByYXRlOworCXU4IHJ4ZmxvdzsKKwl1MzIgcmVzZXJ2ZWQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb24gcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgaW50IF9fb3Jpbm9jb19wcm9ncmFtX3JpZHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBfX29yaW5vY29fc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBvcmlub2NvX2RlYnVnX2R1bXBfcmVjcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3BvcnRfdHlwZShzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQoreworCXN3aXRjaCAocHJpdi0+aXdfbW9kZSkgeworCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJcHJpdi0+cG9ydF90eXBlID0gMTsKKwkJcHJpdi0+Y3JlYXRlaWJzcyA9IDA7CisJCWJyZWFrOworCWNhc2UgSVdfTU9ERV9BREhPQzoKKwkJaWYgKHByaXYtPnByZWZlcl9wb3J0MykgeworCQkJcHJpdi0+cG9ydF90eXBlID0gMzsKKwkJCXByaXYtPmNyZWF0ZWlic3MgPSAwOworCQl9IGVsc2UgeworCQkJcHJpdi0+cG9ydF90eXBlID0gcHJpdi0+aWJzc19wb3J0OworCQkJcHJpdi0+Y3JlYXRlaWJzcyA9IDE7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBwcml2LT5pd19tb2RlIGluIHNldF9wb3J0X3R5cGUoKVxuIiwKKwkJICAgICAgIHByaXYtPm5kZXYtPm5hbWUpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGV2aWNlIG1ldGhvZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IG9yaW5vY29fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVycjsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJZXJyID0gX19vcmlub2NvX3VwKGRldik7CisKKwlpZiAoISBlcnIpCisJCXByaXYtPm9wZW4gPSAxOworCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBvcmlub2NvX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyID0gMDsKKworCS8qIFdlIG11c3RuJ3QgdXNlIG9yaW5vY29fbG9jaygpIGhlcmUsIGJlY2F1c2Ugd2UgbmVlZCB0byBiZQorCSAgIGFibGUgdG8gY2xvc2UgdGhlIGludGVyZmFjZSBldmVuIGlmIGh3X3VuYXZhaWxhYmxlIGlzIHNldAorCSAgIChlLmcuIGFzIHdlJ3JlIHJlbGVhc2VkIGFmdGVyIGEgUEMgQ2FyZCByZW1vdmFsKSAqLworCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOworCisJcHJpdi0+b3BlbiA9IDA7CisKKwllcnIgPSBfX29yaW5vY29fZG93bihkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqb3Jpbm9jb19nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwlyZXR1cm4gJnByaXYtPnN0YXRzOworfQorCitzdGF0aWMgc3RydWN0IGl3X3N0YXRpc3RpY3MgKm9yaW5vY29fZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXN0cnVjdCBpd19zdGF0aXN0aWNzICp3c3RhdHMgPSAmcHJpdi0+d3N0YXRzOworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoISBuZXRpZl9kZXZpY2VfcHJlc2VudChkZXYpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBnZXRfd2lyZWxlc3Nfc3RhdHMoKSBjYWxsZWQgd2hpbGUgZGV2aWNlIG5vdCBwcmVzZW50XG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIE5VTEw7IC8qIEZJWE1FOiBDYW4gd2UgZG8gYmV0dGVyIHRoYW4gdGhpcz8gKi8KKwl9CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIE5VTEw7ICAvKiBGSVhNRTogRXJnLCB3ZSd2ZSBiZWVuIHNpZ25hbGxlZCwgaG93CisJCQkgICAgICAgKiBkbyB3ZSBwcm9wYWdhdGUgdGhpcyBiYWNrIHVwPyAqLworCisJaWYgKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgeworCQltZW1zZXQoJndzdGF0cy0+cXVhbCwgMCwgc2l6ZW9mKHdzdGF0cy0+cXVhbCkpOworCQkvKiBJZiBhIHNweSBhZGRyZXNzIGlzIGRlZmluZWQsIHdlIHJlcG9ydCBzdGF0cyBvZiB0aGUKKwkJICogZmlyc3Qgc3B5IGFkZHJlc3MgLSBKZWFuIElJICovCisJCWlmIChTUFlfTlVNQkVSKHByaXYpKSB7CisJCQl3c3RhdHMtPnF1YWwucXVhbCA9IHByaXYtPnNweV9zdGF0WzBdLnF1YWw7CisJCQl3c3RhdHMtPnF1YWwubGV2ZWwgPSBwcml2LT5zcHlfc3RhdFswXS5sZXZlbDsKKwkJCXdzdGF0cy0+cXVhbC5ub2lzZSA9IHByaXYtPnNweV9zdGF0WzBdLm5vaXNlOworCQkJd3N0YXRzLT5xdWFsLnVwZGF0ZWQgPSBwcml2LT5zcHlfc3RhdFswXS51cGRhdGVkOworCQl9CisJfSBlbHNlIHsKKwkJc3RydWN0IHsKKwkJCXUxNiBxdWFsLCBzaWduYWwsIG5vaXNlOworCQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBjcTsKKworCQllcnIgPSBIRVJNRVNfUkVBRF9SRUNPUkQoaHcsIFVTRVJfQkFQLAorCQkJCQkgSEVSTUVTX1JJRF9DT01NU1FVQUxJVFksICZjcSk7CisJCQorCQl3c3RhdHMtPnF1YWwucXVhbCA9IChpbnQpbGUxNl90b19jcHUoY3EucXVhbCk7CisJCXdzdGF0cy0+cXVhbC5sZXZlbCA9IChpbnQpbGUxNl90b19jcHUoY3Euc2lnbmFsKSAtIDB4OTU7CisJCXdzdGF0cy0+cXVhbC5ub2lzZSA9IChpbnQpbGUxNl90b19jcHUoY3Eubm9pc2UpIC0gMHg5NTsKKwkJd3N0YXRzLT5xdWFsLnVwZGF0ZWQgPSA3OworCX0KKworCS8qIFdlIGNhbid0IHJlYWxseSB3YWl0IGZvciB0aGUgdGFsbGllcyBpbnF1aXJ5IGNvbW1hbmQgdG8KKwkgKiBjb21wbGV0ZSwgc28gd2UganVzdCB1c2UgdGhlIHByZXZpb3VzIHJlc3VsdHMgYW5kIHRyaWdnZXIKKwkgKiBhIG5ldyB0YWxsaWVzIGlucXVpcnkgY29tbWFuZCBmb3IgbmV4dCB0aW1lIC0gSmVhbiBJSSAqLworCS8qIEZJWE1FOiBXZSdyZSBpbiB1c2VyIGNvbnRleHQgKEkgdGhpbms/KSwgc28gd2Ugc2hvdWxkIGp1c3QKKyAgICAgICAgICAgd2FpdCBmb3IgdGhlIHRhbGxpZXMgdG8gY29tZSB0aHJvdWdoICovCisJZXJyID0gaGVybWVzX2lucXVpcmUoaHcsIEhFUk1FU19JTlFfVEFMTElFUyk7CisgICAgICAgICAgICAgICAKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJaWYgKGVycikKKwkJcmV0dXJuIE5VTEw7CisJCQorCXJldHVybiB3c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIG9yaW5vY29fc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogb3Jpbm9jb19zZXRfbXVsdGljYXN0X2xpc3QoKSAiCisJCSAgICAgICAiY2FsbGVkIHdoZW4gaHdfdW5hdmFpbGFibGVcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlfX29yaW5vY29fc2V0X211bHRpY2FzdF9saXN0KGRldik7CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKK30KKworc3RhdGljIGludCBvcmlub2NvX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoIChuZXdfbXR1IDwgT1JJTk9DT19NSU5fTVRVKSB8fCAobmV3X210dSA+IE9SSU5PQ09fTUFYX01UVSkgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICggKG5ld19tdHUgKyBFTkNBUFNfT1ZFUkhFQUQgKyBJRUVFODAyXzExX0hMRU4pID4KKwkgICAgIChwcml2LT5uaWNidWZfc2l6ZSAtIEVUSF9ITEVOKSApCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2LT5tdHUgPSBuZXdfbXR1OworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFR4IHBhdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBvcmlub2NvX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmcHJpdi0+c3RhdHM7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnIgPSAwOworCXUxNiB0eGZpZCA9IHByaXYtPnR4ZmlkOworCWNoYXIgKnA7CisJc3RydWN0IGV0aGhkciAqZWg7CisJaW50IGxlbiwgZGF0YV9sZW4sIGRhdGFfb2ZmOworCXN0cnVjdCBoZXJtZXNfdHhfZGVzY3JpcHRvciBkZXNjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlUUkFDRV9FTlRFUihkZXYtPm5hbWUpOworCisJaWYgKCEgbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFR4IG9uIHN0b3BwZWQgZGV2aWNlIVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCVRSQUNFX0VYSVQoZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCQorCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUeCB3aGlsZSB0cmFuc21pdHRlciBidXN5IVxuIiwgCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlUUkFDRV9FWElUKGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKwkKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvcmlub2NvX3htaXQoKSBjYWxsZWQgd2hpbGUgaHdfdW5hdmFpbGFibGVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlUUkFDRV9FWElUKGRldi0+bmFtZSk7CisJCXJldHVybiAxOworCX0KKworCWlmICghIG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQkvKiBPb3BzLCB0aGUgZmlybXdhcmUgaGFzbid0IGVzdGFibGlzaGVkIGEgY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICBzaWxlbnRseSBkcm9wIHRoZSBwYWNrZXQgKHRoaXMgc2VlbXMgdG8gYmUgdGhlCisgICAgICAgICAgICAgICAgICAgc2FmZXN0IGFwcHJvYWNoKS4gKi8KKwkJc3RhdHMtPnR4X2Vycm9ycysrOworCQlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCVRSQUNFX0VYSVQoZGV2LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogTGVuZ3RoIG9mIHRoZSBwYWNrZXQgYm9keSAqLworCS8qIEZJWE1FOiB3aGF0IGlmIHRoZSBza2IgaXMgc21hbGxlciB0aGFuIHRoaXM/ICovCisJbGVuID0gbWF4X3QoaW50LHNrYi0+bGVuIC0gRVRIX0hMRU4sIEVUSF9aTEVOIC0gRVRIX0hMRU4pOworCisJZWggPSAoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YTsKKworCW1lbXNldCgmZGVzYywgMCwgc2l6ZW9mKGRlc2MpKTsKKyAJZGVzYy50eF9jb250cm9sID0gY3B1X3RvX2xlMTYoSEVSTUVTX1RYQ1RSTF9UWF9PSyB8IEhFUk1FU19UWENUUkxfVFhfRVgpOworCWVyciA9IGhlcm1lc19iYXBfcHdyaXRlKGh3LCBVU0VSX0JBUCwgJmRlc2MsIHNpemVvZihkZXNjKSwgdHhmaWQsIDApOworCWlmIChlcnIpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHdyaXRpbmcgVHggZGVzY3JpcHRvciAiCisJCQkgICAgICAgInRvIEJBUFxuIiwgZGV2LT5uYW1lLCBlcnIpOworCQlzdGF0cy0+dHhfZXJyb3JzKys7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBDbGVhciB0aGUgODAyLjExIGhlYWRlciBhbmQgZGF0YSBsZW5ndGggZmllbGRzIC0gc29tZQorCSAqIGZpcm13YXJlcyAoZS5nLiBMdWNlbnQvQWdlcmUgOC54eCkgYXBwZWFyIHRvIGdldCBjb25mdXNlZAorCSAqIGlmIHRoaXMgaXNuJ3QgZG9uZS4gKi8KKwloZXJtZXNfY2xlYXJfd29yZHMoaHcsIEhFUk1FU19EQVRBMCwKKwkJCSAgIEhFUk1FU184MDJfM19PRkZTRVQgLSBIRVJNRVNfODAyXzExX09GRlNFVCk7CisKKwkvKiBFbmNhcHN1bGF0ZSBFdGhlcm5ldC1JSSBmcmFtZXMgKi8KKwlpZiAobnRvaHMoZWgtPmhfcHJvdG8pID4gRVRIX0RBVEFfTEVOKSB7IC8qIEV0aGVybmV0LUlJIGZyYW1lICovCisJCXN0cnVjdCBoZWFkZXJfc3RydWN0IGhkcjsKKwkJZGF0YV9sZW4gPSBsZW47CisJCWRhdGFfb2ZmID0gSEVSTUVTXzgwMl8zX09GRlNFVCArIHNpemVvZihoZHIpOworCQlwID0gc2tiLT5kYXRhICsgRVRIX0hMRU47CisKKwkJLyogODAyLjMgaGVhZGVyICovCisJCW1lbWNweShoZHIuZGVzdCwgZWgtPmhfZGVzdCwgRVRIX0FMRU4pOworCQltZW1jcHkoaGRyLnNyYywgZWgtPmhfc291cmNlLCBFVEhfQUxFTik7CisJCWhkci5sZW4gPSBodG9ucyhkYXRhX2xlbiArIEVOQ0FQU19PVkVSSEVBRCk7CisJCQorCQkvKiA4MDIuMiBoZWFkZXIgKi8KKwkJbWVtY3B5KCZoZHIuZHNhcCwgJmVuY2Fwc19oZHIsIHNpemVvZihlbmNhcHNfaGRyKSk7CisJCQkKKwkJaGRyLmV0aGVydHlwZSA9IGVoLT5oX3Byb3RvOworCQllcnIgID0gaGVybWVzX2JhcF9wd3JpdGUoaHcsIFVTRVJfQkFQLCAmaGRyLCBzaXplb2YoaGRyKSwKKwkJCQkJIHR4ZmlkLCBIRVJNRVNfODAyXzNfT0ZGU0VUKTsKKwkJaWYgKGVycikgeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCB3cml0aW5nIHBhY2tldCAiCisJCQkJICAgICAgICJoZWFkZXIgdG8gQkFQXG4iLCBkZXYtPm5hbWUsIGVycik7CisJCQlzdGF0cy0+dHhfZXJyb3JzKys7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9IGVsc2UgeyAvKiBJRUVFIDgwMi4zIGZyYW1lICovCisJCWRhdGFfbGVuID0gbGVuICsgRVRIX0hMRU47CisJCWRhdGFfb2ZmID0gSEVSTUVTXzgwMl8zX09GRlNFVDsKKwkJcCA9IHNrYi0+ZGF0YTsKKwl9CisKKwkvKiBSb3VuZCB1cCBmb3Igb2RkIGxlbmd0aCBwYWNrZXRzICovCisJZXJyID0gaGVybWVzX2JhcF9wd3JpdGUoaHcsIFVTRVJfQkFQLCBwLCBBTElHTihkYXRhX2xlbiwgMiksCisJCQkJdHhmaWQsIGRhdGFfb2ZmKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHdyaXRpbmcgcGFja2V0IHRvIEJBUFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJc3RhdHMtPnR4X2Vycm9ycysrOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogRmluYWxseSwgd2UgYWN0dWFsbHkgaW5pdGlhdGUgdGhlIHNlbmQgKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwllcnIgPSBoZXJtZXNfZG9jbWRfd2FpdChodywgSEVSTUVTX0NNRF9UWCB8IEhFUk1FU19DTURfUkVDTCwKKwkJCQl0eGZpZCwgTlVMTCk7CisJaWYgKGVycikgeworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCB0cmFuc21pdHRpbmcgcGFja2V0XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlzdGF0cy0+dHhfZXJyb3JzKys7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlzdGF0cy0+dHhfYnl0ZXMgKz0gZGF0YV9vZmYgKyBkYXRhX2xlbjsKKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlUUkFDRV9FWElUKGRldi0+bmFtZSk7CisKKwlyZXR1cm4gMDsKKyBmYWlsOgorCVRSQUNFX0VYSVQoZGV2LT5uYW1lKTsKKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19vcmlub2NvX2V2X2FsbG9jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGhlcm1lc190ICpodykKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYgZmlkID0gaGVybWVzX3JlYWRfcmVnbihodywgQUxMT0NGSUQpOworCisJaWYgKGZpZCAhPSBwcml2LT50eGZpZCkgeworCQlpZiAoZmlkICE9IERVTU1ZX0ZJRCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBBbGxvY2F0ZSBldmVudCBvbiB1bmV4cGVjdGVkIGZpZCAoJTA0WClcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBmaWQpOworCQlyZXR1cm47CisJfQorCisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIEFMTE9DRklELCBEVU1NWV9GSUQpOworfQorCitzdGF0aWMgdm9pZCBfX29yaW5vY29fZXZfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaGVybWVzX3QgKmh3KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwcml2LT5zdGF0czsKKworCXN0YXRzLT50eF9wYWNrZXRzKys7CisKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwloZXJtZXNfd3JpdGVfcmVnbihodywgVFhDT01QTEZJRCwgRFVNTVlfRklEKTsKK30KKworc3RhdGljIHZvaWQgX19vcmlub2NvX2V2X3R4ZXhjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGhlcm1lc190ICpodykKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmcHJpdi0+c3RhdHM7CisJdTE2IGZpZCA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIFRYQ09NUExGSUQpOworCXN0cnVjdCBoZXJtZXNfdHhfZGVzY3JpcHRvciBkZXNjOworCWludCBlcnIgPSAwOworCisJaWYgKGZpZCA9PSBEVU1NWV9GSUQpCisJCXJldHVybjsgLyogTm90aGluZydzIHJlYWxseSBoYXBwZW5lZCAqLworCisJZXJyID0gaGVybWVzX2JhcF9wcmVhZChodywgSVJRX0JBUCwgJmRlc2MsIHNpemVvZihkZXNjKSwgZmlkLCAwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmFibGUgdG8gcmVhZCBkZXNjcmlwdG9yIG9uIFR4IGVycm9yICIKKwkJICAgICAgICIoRklEPSUwNFggZXJyb3IgJWQpXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBmaWQsIGVycik7CisJfSBlbHNlIHsKKwkJREVCVUcoMSwgIiVzOiBUeCBlcnJvciwgc3RhdHVzICVkXG4iLAorCQkgICAgICBkZXYtPm5hbWUsIGxlMTZfdG9fY3B1KGRlc2Muc3RhdHVzKSk7CisJfQorCQorCXN0YXRzLT50eF9lcnJvcnMrKzsKKworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwloZXJtZXNfd3JpdGVfcmVnbihodywgVFhDT01QTEZJRCwgRFVNTVlfRklEKTsKK30KKworc3RhdGljIHZvaWQgb3Jpbm9jb190eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnByaXYtPnN0YXRzOworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFR4IHRpbWVvdXQhICIKKwkgICAgICAgIkFMTE9DRklEPSUwNHgsIFRYQ09NUExGSUQ9JTA0eCwgRVZTVEFUPSUwNHhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgaGVybWVzX3JlYWRfcmVnbihodywgQUxMT0NGSUQpLAorCSAgICAgICBoZXJtZXNfcmVhZF9yZWduKGh3LCBUWENPTVBMRklEKSwgaGVybWVzX3JlYWRfcmVnbihodywgRVZTVEFUKSk7CisKKwlzdGF0cy0+dHhfZXJyb3JzKys7CisKKwlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93b3JrKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUnggcGF0aCAoZGF0YSBmcmFtZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEb2VzIHRoZSBmcmFtZSBoYXZlIGEgU05BUCBoZWFkZXIgaW5kaWNhdGluZyBpdCBzaG91bGQgYmUKKyAqIGRlLWVuY2Fwc3VsYXRlZCB0byBFdGhlcm5ldC1JST8gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX2V0aGVyc25hcCh2b2lkICpfaGRyKQoreworCXU4ICpoZHIgPSBfaGRyOworCisJLyogV2UgZGUtZW5jYXBzdWxhdGUgYWxsIHBhY2tldHMgd2hpY2gsIGEpIGhhdmUgU05BUCBoZWFkZXJzCisJICogKGkuZS4gU1NBUD1EU0FQPTB4YWEgYW5kIENUUkw9MHgzIGluIHRoZSA4MDIuMiBMTEMgaGVhZGVyCisJICogYW5kIHdoZXJlIGIpIHRoZSBPVUkgb2YgdGhlIFNOQVAgaGVhZGVyIGlzIDAwOjAwOjAwIG9yCisJICogMDA6MDA6ZjggLSB3ZSBuZWVkIGJvdGggYmVjYXVzZSBkaWZmZXJlbnQgQVBzIGFwcGVhciB0byB1c2UKKwkgKiBkaWZmZXJlbnQgT1VJcyBmb3Igc29tZSByZWFzb24gKi8KKwlyZXR1cm4gKG1lbWNtcChoZHIsICZlbmNhcHNfaGRyLCA1KSA9PSAwKQorCQkmJiAoIChoZHJbNV0gPT0gMHgwMCkgfHwgKGhkcls1XSA9PSAweGY4KSApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb3Jpbm9jb19zcHlfZ2F0aGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVfY2hhciAqbWFjLAorCQkJCSAgICAgIGludCBsZXZlbCwgaW50IG5vaXNlKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpOworCisJLyogR2F0aGVyIHdpcmVsZXNzIHNweSBzdGF0aXN0aWNzOiBmb3IgZWFjaCBwYWNrZXQsIGNvbXBhcmUgdGhlCisJICogc291cmNlIGFkZHJlc3Mgd2l0aCBvdXQgbGlzdCwgYW5kIGlmIG1hdGNoLCBnZXQgdGhlIHN0YXRzLi4uICovCisJZm9yIChpID0gMDsgaSA8IHByaXYtPnNweV9udW1iZXI7IGkrKykKKwkJaWYgKCFtZW1jbXAobWFjLCBwcml2LT5zcHlfYWRkcmVzc1tpXSwgRVRIX0FMRU4pKSB7CisJCQlwcml2LT5zcHlfc3RhdFtpXS5sZXZlbCA9IGxldmVsIC0gMHg5NTsKKwkJCXByaXYtPnNweV9zdGF0W2ldLm5vaXNlID0gbm9pc2UgLSAweDk1OworCQkJcHJpdi0+c3B5X3N0YXRbaV0ucXVhbCA9IChsZXZlbCA+IG5vaXNlKSA/IChsZXZlbCAtIG5vaXNlKSA6IDA7CisJCQlwcml2LT5zcHlfc3RhdFtpXS51cGRhdGVkID0gNzsKKwkJfQorfQorCitzdGF0aWMgdm9pZCBvcmlub2NvX3N0YXRfZ2F0aGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQlzdHJ1Y3QgaGVybWVzX3J4X2Rlc2NyaXB0b3IgKmRlc2MpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBVc2luZyBzcHkgc3VwcG9ydCB3aXRoIGxvdHMgb2YgUnggcGFja2V0cywgbGlrZSBpbiBhbgorCSAqIGluZnJhc3RydWN0dXJlIChBUCksIHdpbGwgcmVhbGx5IHNsb3cgZG93biBldmVyeXRoaW5nLCBiZWNhdXNlCisJICogdGhlIE1BQyBhZGRyZXNzIG11c3QgYmUgY29tcGFyZWQgdG8gZWFjaCBlbnRyeSBvZiB0aGUgc3B5IGxpc3QuCisJICogSWYgdGhlIHVzZXIgcmVhbGx5IGFza3MgZm9yIGl0IChzZXQgc29tZSBhZGRyZXNzIGluIHRoZQorCSAqIHNweSBsaXN0KSwgd2UgZG8gaXQsIGJ1dCBoZSB3aWxsIHBheSB0aGUgcHJpY2UuCisJICogTm90ZSB0aGF0IHRvIGdldCBoZXJlLCB5b3UgbmVlZCBib3RoIFdJUkVMRVNTX1NQWQorCSAqIGNvbXBpbGVkIGluIEFORCBzb21lIGFkZHJlc3NlcyBpbiB0aGUgbGlzdCAhISEKKwkgKi8KKwkvKiBOb3RlIDogZ2NjIHdpbGwgb3B0aW1pc2UgdGhlIHdob2xlIHNlY3Rpb24gYXdheSBpZgorCSAqIFdJUkVMRVNTX1NQWSBpcyBub3QgZGVmaW5lZC4uLiAtIEplYW4gSUkgKi8KKwlpZiAoU1BZX05VTUJFUihwcml2KSkgeworCQlvcmlub2NvX3NweV9nYXRoZXIoZGV2LCBza2ItPm1hYy5yYXcgKyBFVEhfQUxFTiwKKwkJCQkgICBkZXNjLT5zaWduYWwsIGRlc2MtPnNpbGVuY2UpOworCX0KK30KKworc3RhdGljIHZvaWQgX19vcmlub2NvX2V2X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGhlcm1lc190ICpodykKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmcHJpdi0+c3RhdHM7CisJc3RydWN0IGl3X3N0YXRpc3RpY3MgKndzdGF0cyA9ICZwcml2LT53c3RhdHM7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJdTE2IHJ4ZmlkLCBzdGF0dXM7CisJaW50IGxlbmd0aCwgZGF0YV9sZW4sIGRhdGFfb2ZmOworCWNoYXIgKnA7CisJc3RydWN0IGhlcm1lc19yeF9kZXNjcmlwdG9yIGRlc2M7CisJc3RydWN0IGhlYWRlcl9zdHJ1Y3QgaGRyOworCXN0cnVjdCBldGhoZHIgKmVoOworCWludCBlcnI7CisKKwlyeGZpZCA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIFJYRklEKTsKKworCWVyciA9IGhlcm1lc19iYXBfcHJlYWQoaHcsIElSUV9CQVAsICZkZXNjLCBzaXplb2YoZGVzYyksCisJCQkgICAgICAgcnhmaWQsIDApOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgJWQgcmVhZGluZyBSeCBkZXNjcmlwdG9yLiAiCisJCSAgICAgICAiRnJhbWUgZHJvcHBlZC5cbiIsIGRldi0+bmFtZSwgZXJyKTsKKwkJc3RhdHMtPnJ4X2Vycm9ycysrOworCQlnb3RvIGRyb3A7CisJfQorCisJc3RhdHVzID0gbGUxNl90b19jcHUoZGVzYy5zdGF0dXMpOworCisJaWYgKHN0YXR1cyAmIEhFUk1FU19SWFNUQVRfRVJSKSB7CisJCWlmIChzdGF0dXMgJiBIRVJNRVNfUlhTVEFUX1VOREVDUllQVEFCTEUpIHsKKwkJCXdzdGF0cy0+ZGlzY2FyZC5jb2RlKys7CisJCQlERUJVRygxLCAiJXM6IFVuZGVjcnlwdGFibGUgZnJhbWUgb24gUnguIEZyYW1lIGRyb3BwZWQuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCX0gZWxzZSB7CisJCQlzdGF0cy0+cnhfY3JjX2Vycm9ycysrOworCQkJREVCVUcoMSwgIiVzOiBCYWQgQ1JDIG9uIFJ4LiBGcmFtZSBkcm9wcGVkLlxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCWdvdG8gZHJvcDsKKwl9CisKKwkvKiBGb3Igbm93IHdlIGlnbm9yZSB0aGUgODAyLjExIGhlYWRlciBjb21wbGV0ZWx5LCBhc3N1bWluZworICAgICAgICAgICB0aGF0IHRoZSBjYXJkJ3MgZmlybXdhcmUgaGFzIGhhbmRsZWQgYW55dGhpbmcgdml0YWwgKi8KKworCWVyciA9IGhlcm1lc19iYXBfcHJlYWQoaHcsIElSUV9CQVAsICZoZHIsIHNpemVvZihoZHIpLAorCQkJICAgICAgIHJ4ZmlkLCBIRVJNRVNfODAyXzNfT0ZGU0VUKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yICVkIHJlYWRpbmcgZnJhbWUgaGVhZGVyLiAiCisJCSAgICAgICAiRnJhbWUgZHJvcHBlZC5cbiIsIGRldi0+bmFtZSwgZXJyKTsKKwkJc3RhdHMtPnJ4X2Vycm9ycysrOworCQlnb3RvIGRyb3A7CisJfQorCisJbGVuZ3RoID0gbnRvaHMoaGRyLmxlbik7CisJCisJLyogU2FuaXR5IGNoZWNrcyAqLworCWlmIChsZW5ndGggPCAzKSB7IC8qIE5vIGZvciBldmVuIGFuIDgwMi4yIExMQyBoZWFkZXIgKi8KKwkJLyogQXQgbGVhc3Qgb24gU3ltYm9sIGZpcm13YXJlIHdpdGggUENGIHdlIGdldCBxdWl0ZSBhCisgICAgICAgICAgICAgICAgICAgbG90IG9mIHRoZXNlIGxlZ2l0aW1hdGVseSAtIFBvbGwgZnJhbWVzIHdpdGggbm8KKyAgICAgICAgICAgICAgICAgICBkYXRhLiAqLworCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCQlnb3RvIGRyb3A7CisJfQorCWlmIChsZW5ndGggPiBJRUVFODAyXzExX0RBVEFfTEVOKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPdmVyc2l6ZWQgZnJhbWUgcmVjZWl2ZWQgKCVkIGJ5dGVzKVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbGVuZ3RoKTsKKwkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJc3RhdHMtPnJ4X2Vycm9ycysrOworCQlnb3RvIGRyb3A7CisJfQorCisJLyogV2UgbmVlZCBzcGFjZSBmb3IgdGhlIHBhY2tldCBkYXRhIGl0c2VsZiwgcGx1cyBhbiBldGhlcm5ldAorCSAgIGhlYWRlciwgcGx1cyAyIGJ5dGVzIHNvIHdlIGNhbiBhbGlnbiB0aGUgSVAgaGVhZGVyIG9uIGEKKwkgICAzMmJpdCBib3VuZGFyeSwgcGx1cyAxIGJ5dGUgc28gd2UgY2FuIHJlYWQgaW4gb2RkIGxlbmd0aAorCSAgIHBhY2tldHMgZnJvbSB0aGUgY2FyZCwgd2hpY2ggaGFzIGFuIElPIGdyYW51bGFyaXR5IG9mIDE2CisJICAgYml0cyAqLyAgCisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW5ndGgrRVRIX0hMRU4rMisxKTsKKwlpZiAoIXNrYikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2FuJ3QgYWxsb2NhdGUgc2tiIGZvciBSeFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWdvdG8gZHJvcDsKKwl9CisKKwlza2JfcmVzZXJ2ZShza2IsIDIpOyAvKiBUaGlzIHdheSB0aGUgSVAgaGVhZGVyIGlzIGFsaWduZWQgKi8KKworCS8qIEhhbmRsZSBkZWNhcHN1bGF0aW9uCisJICogSW4gbW9zdCBjYXNlcywgdGhlIGZpcm13YXJlIHRlbGwgdXMgYWJvdXQgU05BUCBmcmFtZXMuCisJICogRm9yIHNvbWUgcmVhc29uLCB0aGUgU05BUCBmcmFtZXMgc2VudCBieSBMaW5rU3lzIEFQcworCSAqIGFyZSBub3QgcHJvcGVybHkgcmVjb2duaXNlZCBieSBtb3N0IGZpcm13YXJlcy4KKwkgKiBTbywgY2hlY2sgb3Vyc2VsdmVzICovCisJaWYgKCgoc3RhdHVzICYgSEVSTUVTX1JYU1RBVF9NU0dUWVBFKSA9PSBIRVJNRVNfUlhTVEFUXzEwNDIpIHx8CisJICAgICgoc3RhdHVzICYgSEVSTUVTX1JYU1RBVF9NU0dUWVBFKSA9PSBIRVJNRVNfUlhTVEFUX1RVTk5FTCkgfHwKKwkgICAgaXNfZXRoZXJzbmFwKCZoZHIpKSB7CisJCS8qIFRoZXNlIGluZGljYXRlIGEgU05BUCB3aXRoaW4gODAyLjIgTExDIHdpdGhpbgorCQkgICA4MDIuMTEgZnJhbWUgd2hpY2ggd2UnbGwgbmVlZCB0byBkZS1lbmNhcHN1bGF0ZSB0bworCQkgICB0aGUgb3JpZ2luYWwgRXRoZXJuZXRJSSBmcmFtZS4gKi8KKworCQlpZiAobGVuZ3RoIDwgRU5DQVBTX09WRVJIRUFEKSB7IC8qIE5vIHJvb20gZm9yIGZ1bGwgTExDK1NOQVAgKi8KKwkJCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzKys7CisJCQlnb3RvIGRyb3A7CisJCX0KKworCQkvKiBSZW1vdmUgU05BUCBoZWFkZXIsIHJlY29uc3RydWN0IEV0aGVybmV0SUkgZnJhbWUgKi8KKwkJZGF0YV9sZW4gPSBsZW5ndGggLSBFTkNBUFNfT1ZFUkhFQUQ7CisJCWRhdGFfb2ZmID0gSEVSTUVTXzgwMl8zX09GRlNFVCArIHNpemVvZihoZHIpOworCisJCWVoID0gKHN0cnVjdCBldGhoZHIgKilza2JfcHV0KHNrYiwgRVRIX0hMRU4pOworCisJCW1lbWNweShlaCwgJmhkciwgMiAqIEVUSF9BTEVOKTsKKwkJZWgtPmhfcHJvdG8gPSBoZHIuZXRoZXJ0eXBlOworCX0gZWxzZSB7CisJCS8qIEFsbCBvdGhlciBjYXNlcyBpbmRpY2F0ZSBhIGdlbnVpbmUgODAyLjMgZnJhbWUuICBObworCQkgICBkZWNhcHN1bGF0aW9uIG5lZWRlZC4gIFdlIGp1c3QgdGhyb3cgdGhlIHdob2xlCisJCSAgIHRoaW5nIGluLCBhbmQgaG9wZSB0aGUgcHJvdG9jb2wgbGF5ZXIgY2FuIGRlYWwgd2l0aAorCQkgICBpdCBhcyA4MDIuMyAqLworCQlkYXRhX2xlbiA9IGxlbmd0aDsKKwkJZGF0YV9vZmYgPSBIRVJNRVNfODAyXzNfT0ZGU0VUOworCQkvKiBGSVhNRTogd2UgcmUtcmVhZCBmcm9tIHRoZSBjYXJkIGRhdGEgd2UgYWxyZWFkeSByZWFkIGhlcmUgKi8KKwl9CisKKwlwID0gc2tiX3B1dChza2IsIGRhdGFfbGVuKTsKKwllcnIgPSBoZXJtZXNfYmFwX3ByZWFkKGh3LCBJUlFfQkFQLCBwLCBBTElHTihkYXRhX2xlbiwgMiksCisJCQkgICAgICAgcnhmaWQsIGRhdGFfb2ZmKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yICVkIHJlYWRpbmcgZnJhbWUuICIKKwkJICAgICAgICJGcmFtZSBkcm9wcGVkLlxuIiwgZGV2LT5uYW1lLCBlcnIpOworCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCWdvdG8gZHJvcDsKKwl9CisKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCXNrYi0+ZGV2ID0gZGV2OworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQorCS8qIFByb2Nlc3MgdGhlIHdpcmVsZXNzIHN0YXRzIGlmIG5lZWRlZCAqLworCW9yaW5vY29fc3RhdF9nYXRoZXIoZGV2LCBza2IsICZkZXNjKTsKKworCS8qIFBhc3MgdGhlIHBhY2tldCB0byB0aGUgbmV0d29ya2luZyBzdGFjayAqLworCW5ldGlmX3J4KHNrYik7CisJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlzdGF0cy0+cnhfYnl0ZXMgKz0gbGVuZ3RoOworCisJcmV0dXJuOworCisgZHJvcDoJCisJc3RhdHMtPnJ4X2Ryb3BwZWQrKzsKKworCWlmIChza2IpCisJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSeCBwYXRoIChpbmZvIGZyYW1lcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHByaW50X2xpbmtzdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHN0YXR1cykKK3sKKwljaGFyICogczsKKworCWlmIChzdXBwcmVzc19saW5rc3RhdHVzKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgSEVSTUVTX0xJTktTVEFUVVNfTk9UX0NPTk5FQ1RFRDoKKwkJcyA9ICJOb3QgQ29ubmVjdGVkIjsKKwkJYnJlYWs7CisJY2FzZSBIRVJNRVNfTElOS1NUQVRVU19DT05ORUNURUQ6CisJCXMgPSAiQ29ubmVjdGVkIjsKKwkJYnJlYWs7CisJY2FzZSBIRVJNRVNfTElOS1NUQVRVU19ESVNDT05ORUNURUQ6CisJCXMgPSAiRGlzY29ubmVjdGVkIjsKKwkJYnJlYWs7CisJY2FzZSBIRVJNRVNfTElOS1NUQVRVU19BUF9DSEFOR0U6CisJCXMgPSAiQVAgQ2hhbmdlZCI7CisJCWJyZWFrOworCWNhc2UgSEVSTUVTX0xJTktTVEFUVVNfQVBfT1VUX09GX1JBTkdFOgorCQlzID0gIkFQIE91dCBvZiBSYW5nZSI7CisJCWJyZWFrOworCWNhc2UgSEVSTUVTX0xJTktTVEFUVVNfQVBfSU5fUkFOR0U6CisJCXMgPSAiQVAgSW4gUmFuZ2UiOworCQlicmVhazsKKwljYXNlIEhFUk1FU19MSU5LU1RBVFVTX0FTU09DX0ZBSUxFRDoKKwkJcyA9ICJBc3NvY2lhdGlvbiBGYWlsZWQiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzID0gIlVOS05PV04iOworCX0KKwkKKwlwcmludGsoS0VSTl9JTkZPICIlczogTmV3IGxpbmsgc3RhdHVzOiAlcyAoJTA0eClcbiIsCisJICAgICAgIGRldi0+bmFtZSwgcywgc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgX19vcmlub2NvX2V2X2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaGVybWVzX3QgKmh3KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNiBpbmZvZmlkOworCXN0cnVjdCB7CisJCXUxNiBsZW47CisJCXUxNiB0eXBlOworCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGluZm87CisJaW50IGxlbiwgdHlwZTsKKwlpbnQgZXJyOworCisJLyogVGhpcyBpcyBhbiBhbnN3ZXIgdG8gYW4gSU5RVUlSRSBjb21tYW5kIHRoYXQgd2UgZGlkIGVhcmxpZXIsCisJICogb3IgYW4gaW5mb3JtYXRpb24gImV2ZW50IiBnZW5lcmF0ZWQgYnkgdGhlIGNhcmQKKwkgKiBUaGUgY29udHJvbGxlciByZXR1cm4gdG8gdXMgYSBwc2V1ZG8gZnJhbWUgY29udGFpbmluZworCSAqIHRoZSBpbmZvcm1hdGlvbiBpbiBxdWVzdGlvbiAtIEplYW4gSUkgKi8KKwlpbmZvZmlkID0gaGVybWVzX3JlYWRfcmVnbihodywgSU5GT0ZJRCk7CisKKwkvKiBSZWFkIHRoZSBpbmZvIGZyYW1lIGhlYWRlciAtIGRvbid0IHRyeSB0b28gaGFyZCAqLworCWVyciA9IGhlcm1lc19iYXBfcHJlYWQoaHcsIElSUV9CQVAsICZpbmZvLCBzaXplb2YoaW5mbyksCisJCQkgICAgICAgaW5mb2ZpZCwgMCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCByZWFkaW5nIGluZm8gZnJhbWUuICIKKwkJICAgICAgICJGcmFtZSBkcm9wcGVkLlxuIiwgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm47CisJfQorCQorCWxlbiA9IEhFUk1FU19SRUNMRU5fVE9fQllURVMobGUxNl90b19jcHUoaW5mby5sZW4pKTsKKwl0eXBlID0gbGUxNl90b19jcHUoaW5mby50eXBlKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSEVSTUVTX0lOUV9UQUxMSUVTOiB7CisJCXN0cnVjdCBoZXJtZXNfdGFsbGllc19mcmFtZSB0YWxsaWVzOworCQlzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqd3N0YXRzID0gJnByaXYtPndzdGF0czsKKwkJCisJCWlmIChsZW4gPiBzaXplb2YodGFsbGllcykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUYWxsaWVzIGZyYW1lIHRvbyBsb25nICglZCBieXRlcylcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBsZW4pOworCQkJbGVuID0gc2l6ZW9mKHRhbGxpZXMpOworCQl9CisJCQorCQkvKiBSZWFkIGRpcmVjdGx5IHRoZSBkYXRhIChubyBzZWVrKSAqLworCQloZXJtZXNfcmVhZF93b3JkcyhodywgSEVSTUVTX0RBVEExLCAodm9pZCAqKSAmdGFsbGllcywKKwkJCQkgIGxlbiAvIDIpOyAvKiBGSVhNRTogYmxlY2ghICovCisJCQorCQkvKiBJbmNyZW1lbnQgb3VyIHZhcmlvdXMgY291bnRlcnMgKi8KKwkJLyogd3N0YXRzLT5kaXNjYXJkLm53aWQgLSBubyB3cm9uZyBCU1NJRCBzdHVmZiAqLworCQl3c3RhdHMtPmRpc2NhcmQuY29kZSArPQorCQkJbGUxNl90b19jcHUodGFsbGllcy5SeFdFUFVuZGVjcnlwdGFibGUpOworCQlpZiAobGVuID09IHNpemVvZih0YWxsaWVzKSkgIAorCQkJd3N0YXRzLT5kaXNjYXJkLmNvZGUgKz0KKwkJCQlsZTE2X3RvX2NwdSh0YWxsaWVzLlJ4RGlzY2FyZHNfV0VQSUNWRXJyb3IpICsKKwkJCQlsZTE2X3RvX2NwdSh0YWxsaWVzLlJ4RGlzY2FyZHNfV0VQRXhjbHVkZWQpOworCQl3c3RhdHMtPmRpc2NhcmQubWlzYyArPQorCQkJbGUxNl90b19jcHUodGFsbGllcy5UeERpc2NhcmRzV3JvbmdTQSk7CisJCXdzdGF0cy0+ZGlzY2FyZC5mcmFnbWVudCArPQorCQkJbGUxNl90b19jcHUodGFsbGllcy5SeE1zZ0luQmFkTXNnRnJhZ21lbnRzKTsKKwkJd3N0YXRzLT5kaXNjYXJkLnJldHJpZXMgKz0KKwkJCWxlMTZfdG9fY3B1KHRhbGxpZXMuVHhSZXRyeUxpbWl0RXhjZWVkZWQpOworCQkvKiB3c3RhdHMtPm1pc3MuYmVhY29uIC0gbm8gbWF0Y2ggKi8KKwl9CisJYnJlYWs7CisJY2FzZSBIRVJNRVNfSU5RX0xJTktTVEFUVVM6IHsKKwkJc3RydWN0IGhlcm1lc19saW5rc3RhdHVzIGxpbmtzdGF0dXM7CisJCXUxNiBuZXdzdGF0dXM7CisJCWludCBjb25uZWN0ZWQ7CisKKwkJaWYgKGxlbiAhPSBzaXplb2YobGlua3N0YXR1cykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmV4cGVjdGVkIHNpemUgZm9yIGxpbmtzdGF0dXMgZnJhbWUgKCVkIGJ5dGVzKVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGxlbik7CisJCQlicmVhazsKKwkJfQorCisJCWhlcm1lc19yZWFkX3dvcmRzKGh3LCBIRVJNRVNfREFUQTEsICh2b2lkICopICZsaW5rc3RhdHVzLAorCQkJCSAgbGVuIC8gMik7CisJCW5ld3N0YXR1cyA9IGxlMTZfdG9fY3B1KGxpbmtzdGF0dXMubGlua3N0YXR1cyk7CisKKwkJY29ubmVjdGVkID0gKG5ld3N0YXR1cyA9PSBIRVJNRVNfTElOS1NUQVRVU19DT05ORUNURUQpCisJCQl8fCAobmV3c3RhdHVzID09IEhFUk1FU19MSU5LU1RBVFVTX0FQX0NIQU5HRSkKKwkJCXx8IChuZXdzdGF0dXMgPT0gSEVSTUVTX0xJTktTVEFUVVNfQVBfSU5fUkFOR0UpOworCisJCWlmIChjb25uZWN0ZWQpCisJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCWVsc2UKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKwkJaWYgKG5ld3N0YXR1cyAhPSBwcml2LT5sYXN0X2xpbmtzdGF0dXMpCisJCQlwcmludF9saW5rc3RhdHVzKGRldiwgbmV3c3RhdHVzKTsKKworCQlwcml2LT5sYXN0X2xpbmtzdGF0dXMgPSBuZXdzdGF0dXM7CisJfQorCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogVW5rbm93biBpbmZvcm1hdGlvbiBmcmFtZSByZWNlaXZlZDogIgorCQkgICAgICAgInR5cGUgMHglMDR4LCBsZW5ndGggJWRcbiIsIGRldi0+bmFtZSwgdHlwZSwgbGVuKTsKKwkJLyogV2UgZG9uJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgYWJvdXQgaXQgKi8KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX29yaW5vY29fZXZfaW5mZHJvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBoZXJtZXNfdCAqaHcpCit7CisJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJbmZvcm1hdGlvbiBmcmFtZSBsb3N0LlxuIiwgZGV2LT5uYW1lKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW50ZXJuYWwgaGFyZHdhcmUgY29udHJvbCByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgX19vcmlub2NvX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVycjsKKworCWVyciA9IF9fb3Jpbm9jb19wcm9ncmFtX3JpZHMoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIGNvbmZpZ3VyaW5nIGNhcmRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogRmlyZSB0aGluZ3MgdXAgYWdhaW4gKi8KKwloZXJtZXNfc2V0X2lycW1hc2soaHcsIE9SSU5PQ09fSU5URU4pOworCWVyciA9IGhlcm1lc19lbmFibGVfcG9ydChodywgMCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBlbmFibGluZyBNQUMgcG9ydFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBfX29yaW5vY29fZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnI7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwlpZiAoISBwcml2LT5od191bmF2YWlsYWJsZSkgeworCQlpZiAoISBwcml2LT5icm9rZW5fZGlzYWJsZXBvcnQpIHsKKwkJCWVyciA9IGhlcm1lc19kaXNhYmxlX3BvcnQoaHcsIDApOworCQkJaWYgKGVycikgeworCQkJCS8qIFNvbWUgZmlybXdhcmVzIChlLmcuIEludGVyc2lsIDEuMy54KSBzZWVtCisJCQkJICogdG8gaGF2ZSBwcm9ibGVtcyBkaXNhYmxpbmcgdGhlIHBvcnQsIG9oCisJCQkJICogd2VsbCwgdG9vIGJhZC4gKi8KKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRXJyb3IgJWQgZGlzYWJsaW5nIE1BQyBwb3J0XG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCQkJcHJpdi0+YnJva2VuX2Rpc2FibGVwb3J0ID0gMTsKKwkJCX0KKwkJfQorCQloZXJtZXNfc2V0X2lycW1hc2soaHcsIDApOworCQloZXJtZXNfd3JpdGVfcmVnbihodywgRVZBQ0ssIDB4ZmZmZik7CisJfQorCQorCS8qIGZpcm13YXJlIHdpbGwgaGF2ZSB0byByZWFzc29jaWF0ZSAqLworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJcHJpdi0+bGFzdF9saW5rc3RhdHVzID0gMHhmZmZmOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBvcmlub2NvX3JlaW5pdF9maXJtd2FyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnI7CisKKwllcnIgPSBoZXJtZXNfaW5pdChodyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGhlcm1lc19hbGxvY2F0ZShodywgcHJpdi0+bmljYnVmX3NpemUsICZwcml2LT50eGZpZCk7CisJaWYgKGVyciA9PSAtRUlPKSB7CisJCS8qIFRyeSB3b3JrYXJvdW5kIGZvciBvbGQgU3ltYm9sIGZpcm13YXJlIGJ1ZyAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZmlybXdhcmUgQUxMT0MgYnVnIGRldGVjdGVkICIKKwkJICAgICAgICIob2xkIFN5bWJvbCBmaXJtd2FyZT8pLiBUcnlpbmcgdG8gd29yayBhcm91bmQuLi4gIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCQorCQlwcml2LT5uaWNidWZfc2l6ZSA9IFRYX05JQ0JVRl9TSVpFX0JVRzsKKwkJZXJyID0gaGVybWVzX2FsbG9jYXRlKGh3LCBwcml2LT5uaWNidWZfc2l6ZSwgJnByaXYtPnR4ZmlkKTsKKwkJaWYgKGVycikKKwkJCXByaW50aygiZmFpbGVkIVxuIik7CisJCWVsc2UKKwkJCXByaW50aygib2suXG4iKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fb3Jpbm9jb19od19zZXRfYml0cmF0ZShzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQoreworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKworCWlmIChwcml2LT5iaXRyYXRlbW9kZSA+PSBCSVRSQVRFX1RBQkxFX1NJWkUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQlVHOiBJbnZhbGlkIGJpdHJhdGUgbW9kZSAlZFxuIiwKKwkJICAgICAgIHByaXYtPm5kZXYtPm5hbWUsIHByaXYtPmJpdHJhdGVtb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChwcml2LT5maXJtd2FyZV90eXBlKSB7CisJY2FzZSBGSVJNV0FSRV9UWVBFX0FHRVJFOgorCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgIEhFUk1FU19SSURfQ05GVFhSQVRFQ09OVFJPTCwKKwkJCQkJICAgYml0cmF0ZV90YWJsZVtwcml2LT5iaXRyYXRlbW9kZV0uYWdlcmVfdHhyYXRlY3RybCk7CisJCWJyZWFrOworCWNhc2UgRklSTVdBUkVfVFlQRV9JTlRFUlNJTDoKKwljYXNlIEZJUk1XQVJFX1RZUEVfU1lNQk9MOgorCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgIEhFUk1FU19SSURfQ05GVFhSQVRFQ09OVFJPTCwKKwkJCQkJICAgYml0cmF0ZV90YWJsZVtwcml2LT5iaXRyYXRlbW9kZV0uaW50ZXJzaWxfdHhyYXRlY3RybCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qIENoYW5nZSB0aGUgV0VQIGtleXMgYW5kL29yIHRoZSBjdXJyZW50IGtleXMuICBDYW4gYmUgY2FsbGVkCisgKiBlaXRoZXIgZnJvbSBfX29yaW5vY29faHdfc2V0dXBfd2VwKCkgb3IgZGlyZWN0bHkgZnJvbQorICogb3Jpbm9jb19pb2N0bF9zZXRpd2VuY29kZSgpLiAgSW4gdGhlIGxhdGVyIGNhc2UgdGhlIGFzc29jaWF0aW9uCisgKiB3aXRoIHRoZSBBUCBpcyBub3QgYnJva2VuIChpZiB0aGUgZmlybXdhcmUgY2FuIGhhbmRsZSBpdCksCisgKiB3aGljaCBpcyBuZWVkZWQgZm9yIDgwMi4xeCBpbXBsZW1lbnRhdGlvbnMuICovCitzdGF0aWMgaW50IF9fb3Jpbm9jb19od19zZXR1cF93ZXBrZXlzKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpCit7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChwcml2LT5maXJtd2FyZV90eXBlKSB7CisJY2FzZSBGSVJNV0FSRV9UWVBFX0FHRVJFOgorCQllcnIgPSBIRVJNRVNfV1JJVEVfUkVDT1JEKGh3LCBVU0VSX0JBUCwKKwkJCQkJICBIRVJNRVNfUklEX0NORldFUEtFWVNfQUdFUkUsCisJCQkJCSAgJnByaXYtPmtleXMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORlRYS0VZX0FHRVJFLAorCQkJCQkgICBwcml2LT50eF9rZXkpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CisJY2FzZSBGSVJNV0FSRV9UWVBFX0lOVEVSU0lMOgorCWNhc2UgRklSTVdBUkVfVFlQRV9TWU1CT0w6CisJCXsKKwkJCWludCBrZXlsZW47CisJCQlpbnQgaTsKKworCQkJLyogRm9yY2UgdW5pZm9ybSBrZXkgbGVuZ3RoIHRvIHdvcmsgYXJvdW5kIGZpcm13YXJlIGJ1Z3MgKi8KKwkJCWtleWxlbiA9IGxlMTZfdG9fY3B1KHByaXYtPmtleXNbcHJpdi0+dHhfa2V5XS5sZW4pOworCQkJCisJCQlpZiAoa2V5bGVuID4gTEFSR0VfS0VZX1NJWkUpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBCVUc6IEtleSAlZCBoYXMgb3ZlcnNpemUgbGVuZ3RoICVkLlxuIiwKKwkJCQkgICAgICAgcHJpdi0+bmRldi0+bmFtZSwgcHJpdi0+dHhfa2V5LCBrZXlsZW4pOworCQkJCXJldHVybiAtRTJCSUc7CisJCQl9CisKKwkJCS8qIFdyaXRlIGFsbCA0IGtleXMgKi8KKwkJCWZvcihpID0gMDsgaSA8IE9SSU5PQ09fTUFYX0tFWVM7IGkrKykgeworCQkJCWVyciA9IGhlcm1lc193cml0ZV9sdHYoaHcsIFVTRVJfQkFQLAorCQkJCQkJICAgICAgIEhFUk1FU19SSURfQ05GREVGQVVMVEtFWTAgKyBpLAorCQkJCQkJICAgICAgIEhFUk1FU19CWVRFU19UT19SRUNMRU4oa2V5bGVuKSwKKwkJCQkJCSAgICAgICBwcml2LT5rZXlzW2ldLmRhdGEpOworCQkJCWlmIChlcnIpCisJCQkJCXJldHVybiBlcnI7CisJCQl9CisKKwkJCS8qIFdyaXRlIHRoZSBpbmRleCBvZiB0aGUga2V5IHVzZWQgaW4gdHJhbnNtaXNzaW9uICovCisJCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCQkgICBIRVJNRVNfUklEX0NORldFUERFRkFVTFRLRVlJRCwKKwkJCQkJCSAgIHByaXYtPnR4X2tleSk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19vcmlub2NvX2h3X3NldHVwX3dlcChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQoreworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKwlpbnQgbWFzdGVyX3dlcF9mbGFnOworCWludCBhdXRoX2ZsYWc7CisKKwlpZiAocHJpdi0+d2VwX29uKQorCQlfX29yaW5vY29faHdfc2V0dXBfd2Vwa2V5cyhwcml2KTsKKworCWlmIChwcml2LT53ZXBfcmVzdHJpY3QpCisJCWF1dGhfZmxhZyA9IEhFUk1FU19BVVRIX1NIQVJFRF9LRVk7CisJZWxzZQorCQlhdXRoX2ZsYWcgPSBIRVJNRVNfQVVUSF9PUEVOOworCisJc3dpdGNoIChwcml2LT5maXJtd2FyZV90eXBlKSB7CisJY2FzZSBGSVJNV0FSRV9UWVBFX0FHRVJFOiAvKiBBZ2VyZSBzdHlsZSBXRVAgKi8KKwkJaWYgKHByaXYtPndlcF9vbikgeworCQkJLyogRW5hYmxlIHRoZSBzaGFyZWQta2V5IGF1dGhlbnRpY2F0aW9uLiAqLworCQkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkJICAgSEVSTUVTX1JJRF9DTkZBVVRIRU5USUNBVElPTl9BR0VSRSwKKwkJCQkJCSAgIGF1dGhfZmxhZyk7CisJCX0KKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORldFUEVOQUJMRURfQUdFUkUsCisJCQkJCSAgIHByaXYtPndlcF9vbik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQlicmVhazsKKworCWNhc2UgRklSTVdBUkVfVFlQRV9JTlRFUlNJTDogLyogSW50ZXJzaWwgc3R5bGUgV0VQICovCisJY2FzZSBGSVJNV0FSRV9UWVBFX1NZTUJPTDogLyogU3ltYm9sIHN0eWxlIFdFUCAqLworCQlpZiAocHJpdi0+d2VwX29uKSB7CisJCQlpZiAocHJpdi0+d2VwX3Jlc3RyaWN0IHx8CisJCQkgICAgKHByaXYtPmZpcm13YXJlX3R5cGUgPT0gRklSTVdBUkVfVFlQRV9TWU1CT0wpKQorCQkJCW1hc3Rlcl93ZXBfZmxhZyA9IEhFUk1FU19XRVBfUFJJVkFDWV9JTlZPS0VEIHwKKwkJCQkJCSAgSEVSTUVTX1dFUF9FWENMX1VORU5DUllQVEVEOworCQkJZWxzZQorCQkJCW1hc3Rlcl93ZXBfZmxhZyA9IEhFUk1FU19XRVBfUFJJVkFDWV9JTlZPS0VEOworCisJCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCQkgICBIRVJNRVNfUklEX0NORkFVVEhFTlRJQ0FUSU9OLAorCQkJCQkJICAgYXV0aF9mbGFnKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfSBlbHNlCisJCQltYXN0ZXJfd2VwX2ZsYWcgPSAwOworCisJCWlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKKwkJCW1hc3Rlcl93ZXBfZmxhZyB8PSBIRVJNRVNfV0VQX0hPU1RfREVDUllQVDsKKworCQkvKiBNYXN0ZXIgV0VQIHNldHRpbmcgOiBvbi9vZmYgKi8KKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORldFUEZMQUdTX0lOVEVSU0lMLAorCQkJCQkgICBtYXN0ZXJfd2VwX2ZsYWcpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsJCisKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19vcmlub2NvX3Byb2dyYW1fcmlkcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyOworCXN0cnVjdCBoZXJtZXNfaWRzdHJpbmcgaWRidWY7CisKKwkvKiBTZXQgdGhlIE1BQyBhZGRyZXNzICovCisJZXJyID0gaGVybWVzX3dyaXRlX2x0dihodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GT1dOTUFDQUREUiwKKwkJCSAgICAgICBIRVJNRVNfQllURVNfVE9fUkVDTEVOKEVUSF9BTEVOKSwgZGV2LT5kZXZfYWRkcik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIE1BQyBhZGRyZXNzXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIFNldCB1cCB0aGUgbGluayBtb2RlICovCisJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORlBPUlRUWVBFLAorCQkJCSAgIHByaXYtPnBvcnRfdHlwZSk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIHBvcnQgdHlwZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLyogU2V0IHRoZSBjaGFubmVsL2ZyZXF1ZW5jeSAqLworCWlmIChwcml2LT5jaGFubmVsID09IDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDaGFubmVsIGlzIDAgaW4gX19vcmlub2NvX3Byb2dyYW1fcmlkcygpXG4iLCBkZXYtPm5hbWUpOworCQlpZiAocHJpdi0+Y3JlYXRlaWJzcykKKwkJCXByaXYtPmNoYW5uZWwgPSAxMDsKKwl9CisJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORk9XTkNIQU5ORUwsCisJCQkJICAgcHJpdi0+Y2hhbm5lbCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIGNoYW5uZWxcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKHByaXYtPmhhc19pYnNzKSB7CisJCXUxNiBjcmVhdGVpYnNzOworCisJCWlmICgoc3RybGVuKHByaXYtPmRlc2lyZWRfZXNzaWQpID09IDApICYmIChwcml2LT5jcmVhdGVpYnNzKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRoaXMgZmlybXdhcmUgcmVxdWlyZXMgYW4gIgorCQkJICAgICAgICJFU1NJRCBpbiBJQlNTLUFkLUhvYyBtb2RlLlxuIiwgZGV2LT5uYW1lKTsKKwkJCS8qIFdpdGggd3ZsYW5fY3MsIGluIHRoaXMgY2FzZSwgd2Ugd291bGQgY3Jhc2guCisJCQkgKiBob3BlZnVsbHksIHRoaXMgZHJpdmVyIHdpbGwgYmVoYXZlIGJldHRlci4uLgorCQkJICogSmVhbiBJSSAqLworCQkJY3JlYXRlaWJzcyA9IDA7CisJCX0gZWxzZSB7CisJCQljcmVhdGVpYnNzID0gcHJpdi0+Y3JlYXRlaWJzczsKKwkJfQorCQkKKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORkNSRUFURUlCU1MsCisJCQkJCSAgIGNyZWF0ZWlic3MpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIENSRUFURUlCU1NcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCS8qIFNldCB0aGUgZGVzaXJlZCBFU1NJRCAqLworCWlkYnVmLmxlbiA9IGNwdV90b19sZTE2KHN0cmxlbihwcml2LT5kZXNpcmVkX2Vzc2lkKSk7CisJbWVtY3B5KCZpZGJ1Zi52YWwsIHByaXYtPmRlc2lyZWRfZXNzaWQsIHNpemVvZihpZGJ1Zi52YWwpKTsKKwkvKiBXaW5YUCB3YW50cyBwYXJ0bmVyIHRvIGNvbmZpZ3VyZSBPV05TU0lEIGV2ZW4gaW4gSUJTUyBtb2RlLiAoamltYykgKi8KKwllcnIgPSBoZXJtZXNfd3JpdGVfbHR2KGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZPV05TU0lELAorCQkJICAgICAgIEhFUk1FU19CWVRFU19UT19SRUNMRU4oc3RybGVuKHByaXYtPmRlc2lyZWRfZXNzaWQpKzIpLAorCQkJICAgICAgICZpZGJ1Zik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIE9XTlNTSURcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCWVyciA9IGhlcm1lc193cml0ZV9sdHYoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORkRFU0lSRURTU0lELAorCQkJICAgICAgIEhFUk1FU19CWVRFU19UT19SRUNMRU4oc3RybGVuKHByaXYtPmRlc2lyZWRfZXNzaWQpKzIpLAorCQkJICAgICAgICZpZGJ1Zik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIERFU0lSRURTU0lEXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIFNldCB0aGUgc3RhdGlvbiBuYW1lICovCisJaWRidWYubGVuID0gY3B1X3RvX2xlMTYoc3RybGVuKHByaXYtPm5pY2spKTsKKwltZW1jcHkoJmlkYnVmLnZhbCwgcHJpdi0+bmljaywgc2l6ZW9mKGlkYnVmLnZhbCkpOworCWVyciA9IGhlcm1lc193cml0ZV9sdHYoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NORk9XTk5BTUUsCisJCQkgICAgICAgSEVSTUVTX0JZVEVTX1RPX1JFQ0xFTihzdHJsZW4ocHJpdi0+bmljaykrMiksCisJCQkgICAgICAgJmlkYnVmKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgbmlja25hbWVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogU2V0IEFQIGRlbnNpdHkgKi8KKwlpZiAocHJpdi0+aGFzX3NlbnNpdGl2aXR5KSB7CisJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICAgSEVSTUVTX1JJRF9DTkZTWVNURU1TQ0FMRSwKKwkJCQkJICAgcHJpdi0+YXBfZGVuc2l0eSk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBFcnJvciAlZCBzZXR0aW5nIFNZU1RFTVNDQUxFLiAgIgorCQkJICAgICAgICJEaXNhYmxpbmcgc2Vuc2l0aXZpdHkgY29udHJvbFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisKKwkJCXByaXYtPmhhc19zZW5zaXRpdml0eSA9IDA7CisJCX0KKwl9CisKKwkvKiBTZXQgUlRTIHRocmVzaG9sZCAqLworCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZSVFNUSFJFU0hPTEQsCisJCQkJICAgcHJpdi0+cnRzX3RocmVzaCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIFJUUyB0aHJlc2hvbGRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogU2V0IGZyYWdtZW50YXRpb24gdGhyZXNob2xkIG9yIE1XTyByb2J1c3RuZXNzICovCisJaWYgKHByaXYtPmhhc19td28pCisJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJICAgSEVSTUVTX1JJRF9DTkZNV09ST0JVU1RfQUdFUkUsCisJCQkJCSAgIHByaXYtPm13b19yb2J1c3QpOworCWVsc2UKKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORkZSQUdNRU5UQVRJT05USFJFU0hPTEQsCisJCQkJCSAgIHByaXYtPmZyYWdfdGhyZXNoKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgZnJhZ21lbnRhdGlvblxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBTZXQgYml0cmF0ZSAqLworCWVyciA9IF9fb3Jpbm9jb19od19zZXRfYml0cmF0ZShwcml2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgYml0cmF0ZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBTZXQgcG93ZXIgbWFuYWdlbWVudCAqLworCWlmIChwcml2LT5oYXNfcG0pIHsKKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORlBNRU5BQkxFRCwKKwkJCQkJICAgcHJpdi0+cG1fb24pOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIHVwIFBNXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgIEhFUk1FU19SSURfQ05GTVVMVElDQVNUUkVDRUlWRSwKKwkJCQkJICAgcHJpdi0+cG1fbWNhc3QpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIHVwIFBNXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORk1BWFNMRUVQRFVSQVRJT04sCisJCQkJCSAgIHByaXYtPnBtX3BlcmlvZCk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgdXAgUE1cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgIEhFUk1FU19SSURfQ05GUE1IT0xET1ZFUkRVUkFUSU9OLAorCQkJCQkgICBwcml2LT5wbV90aW1lb3V0KTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyB1cCBQTVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJLyogU2V0IHByZWFtYmxlIC0gb25seSBmb3IgU3ltYm9sIHNvIGZhci4uLiAqLworCWlmIChwcml2LT5oYXNfcHJlYW1ibGUpIHsKKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORlBSRUFNQkxFX1NZTUJPTCwKKwkJCQkJICAgcHJpdi0+cHJlYW1ibGUpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIHByZWFtYmxlXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwkvKiBTZXQgdXAgZW5jcnlwdGlvbiAqLworCWlmIChwcml2LT5oYXNfd2VwKSB7CisJCWVyciA9IF9fb3Jpbm9jb19od19zZXR1cF93ZXAocHJpdik7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIGFjdGl2YXRpbmcgV0VQXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwkvKiBTZXQgcHJvbWlzY3VpdHkgLyBtdWx0aWNhc3QqLworCXByaXYtPnByb21pc2N1b3VzID0gMDsKKwlwcml2LT5tY19jb3VudCA9IDA7CisJX19vcmlub2NvX3NldF9tdWx0aWNhc3RfbGlzdChkZXYpOyAvKiBGSVhNRTogd2hhdCBhYm91dCB0aGUgeG1pdF9sb2NrICovCisKKwlyZXR1cm4gMDsKK30KKworLyogRklYTUU6IHJldHVybiBpbnQ/ICovCitzdGF0aWMgdm9pZAorX19vcmlub2NvX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKwlpbnQgcHJvbWlzYywgbWNfY291bnQ7CisKKwkvKiBUaGUgSGVybWVzIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIGFuIGFsbG11bHRpIG1vZGUsIHNvIHdlIGdvCisJICogaW50byBwcm9taXNjdW91cyBtb2RlIGFuZCBsZXQgdGhlIHVwcGVyIGxldmVscyBkZWFsLiAqLworCWlmICggKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHx8CisJICAgICAoZGV2LT5tY19jb3VudCA+IE1BWF9NVUxUSUNBU1QocHJpdikpICkgeworCQlwcm9taXNjID0gMTsKKwkJbWNfY291bnQgPSAwOworCX0gZWxzZSB7CisJCXByb21pc2MgPSAwOworCQltY19jb3VudCA9IGRldi0+bWNfY291bnQ7CisJfQorCisJaWYgKHByb21pc2MgIT0gcHJpdi0+cHJvbWlzY3VvdXMpIHsKKwkJZXJyID0gaGVybWVzX3dyaXRlX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgICBIRVJNRVNfUklEX0NORlBST01JU0NVT1VTTU9ERSwKKwkJCQkJICAgcHJvbWlzYyk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHNldHRpbmcgUFJPTUlTQ1VPVVNNT0RFIHRvIDEuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJfSBlbHNlIAorCQkJcHJpdi0+cHJvbWlzY3VvdXMgPSBwcm9taXNjOworCX0KKworCWlmICghIHByb21pc2MgJiYgKG1jX2NvdW50IHx8IHByaXYtPm1jX2NvdW50KSApIHsKKwkJc3RydWN0IGRldl9tY19saXN0ICpwID0gZGV2LT5tY19saXN0OworCQlzdHJ1Y3QgaGVybWVzX211bHRpY2FzdCBtY2xpc3Q7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBtY19jb3VudDsgaSsrKSB7CisJCQkvKiBwYXJhbm9pYTogaXMgbGlzdCBzaG9ydGVyIHRoYW4gbWNfY291bnQ/ICovCisJCQlCVUdfT04oISBwKTsKKwkJCS8qIHBhcmFub2lhOiBiYWQgYWRkcmVzcyBzaXplIGluIGxpc3Q/ICovCisJCQlCVUdfT04ocC0+ZG1pX2FkZHJsZW4gIT0gRVRIX0FMRU4pOworCQkJCisJCQltZW1jcHkobWNsaXN0LmFkZHJbaV0sIHAtPmRtaV9hZGRyLCBFVEhfQUxFTik7CisJCQlwID0gcC0+bmV4dDsKKwkJfQorCQkKKwkJaWYgKHApCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTXVsdGljYXN0IGxpc3QgaXMgIgorCQkJICAgICAgICJsb25nZXIgdGhhbiBtY19jb3VudFxuIiwgZGV2LT5uYW1lKTsKKworCQllcnIgPSBoZXJtZXNfd3JpdGVfbHR2KGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZHUk9VUEFERFJFU1NFUywKKwkJCQkgICAgICAgSEVSTUVTX0JZVEVTX1RPX1JFQ0xFTihwcml2LT5tY19jb3VudCAqIEVUSF9BTEVOKSwKKwkJCQkgICAgICAgJm1jbGlzdCk7CisJCWlmIChlcnIpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCBzZXR0aW5nIG11bHRpY2FzdCBsaXN0LlxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCWVsc2UKKwkJCXByaXYtPm1jX2NvdW50ID0gbWNfY291bnQ7CisJfQorCisJLyogU2luY2Ugd2UgY2FuIHNldCB0aGUgcHJvbWlzY3VvdXMgZmxhZyB3aGVuIGl0IHdhc24ndCBhc2tlZAorCSAgIGZvciwgbWFrZSBzdXJlIHRoZSBuZXRfZGV2aWNlIGtub3dzIGFib3V0IGl0LiAqLworCWlmIChwcml2LT5wcm9taXNjdW91cykKKwkJZGV2LT5mbGFncyB8PSBJRkZfUFJPTUlTQzsKKwllbHNlCisJCWRldi0+ZmxhZ3MgJj0gfklGRl9QUk9NSVNDOworfQorCitzdGF0aWMgaW50IG9yaW5vY29fcmVjb25maWd1cmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaGVybWVzICpodyA9ICZwcml2LT5odzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnIgPSAwOworCisJaWYgKHByaXYtPmJyb2tlbl9kaXNhYmxlcG9ydCkgeworCQlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93b3JrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisJCQorCWVyciA9IGhlcm1lc19kaXNhYmxlX3BvcnQoaHcsIDApOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuYWJsZSB0byBkaXNhYmxlIHBvcnQgd2hpbGUgcmVjb25maWd1cmluZyBjYXJkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcHJpdi0+YnJva2VuX2Rpc2FibGVwb3J0ID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gX19vcmlub2NvX3Byb2dyYW1fcmlkcyhkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuYWJsZSB0byByZWNvbmZpZ3VyZSBjYXJkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gaGVybWVzX2VuYWJsZV9wb3J0KGh3LCAwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmFibGUgdG8gZW5hYmxlIHBvcnQgd2hpbGUgcmVjb25maWd1cmluZyBjYXJkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisgb3V0OgorCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlc2V0dGluZyBpbnN0ZWFkLi4uXG4iLCBkZXYtPm5hbWUpOworCQlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93b3JrKTsKKwkJZXJyID0gMDsKKwl9CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCXJldHVybiBlcnI7CisKK30KKworLyogVGhpcyBtdXN0IGJlIGNhbGxlZCBmcm9tIHVzZXIgY29udGV4dCwgd2l0aG91dCBsb2NrcyBoZWxkIC0gdXNlCisgKiBzY2hlZHVsZV93b3JrKCkgKi8KK3N0YXRpYyB2b2lkIG9yaW5vY29fcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaGVybWVzICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCS8qIFdoZW4gdGhlIGhhcmR3YXJlIGJlY29tZXMgYXZhaWxhYmxlIGFnYWluLCB3aGF0ZXZlcgorCQkgKiBkZXRlY3RzIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHJlLWluaXRpYWxpemluZworCQkgKiBpdC4gU28gbm8gbmVlZCBmb3IgYW55dGhpbmcgZnVydGhlciAqLworCQlyZXR1cm47CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBTaHV0IG9mZiBpbnRlcnJ1cHRzLiAgRGVwZW5kaW5nIG9uIHdoYXQgc3RhdGUgdGhlIGhhcmR3YXJlCisJICogaXMgaW4sIHRoaXMgbWlnaHQgbm90IHdvcmssIGJ1dCB3ZSdsbCB0cnkgYW55d2F5ICovCisJaGVybWVzX3NldF9pcnFtYXNrKGh3LCAwKTsKKwloZXJtZXNfd3JpdGVfcmVnbihodywgRVZBQ0ssIDB4ZmZmZik7CisKKwlwcml2LT5od191bmF2YWlsYWJsZSsrOworCXByaXYtPmxhc3RfbGlua3N0YXR1cyA9IDB4ZmZmZjsgLyogZmlybXdhcmUgd2lsbCBoYXZlIHRvIHJlYXNzb2NpYXRlICovCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlpZiAocHJpdi0+aGFyZF9yZXNldCkKKwkJZXJyID0gKCpwcml2LT5oYXJkX3Jlc2V0KShwcml2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG9yaW5vY29fcmVzZXQ6IEVycm9yICVkICIKKwkJICAgICAgICJwZXJmb3JtaW5nICBoYXJkIHJlc2V0XG4iLCBkZXYtPm5hbWUsIGVycik7CisJCS8qIEZJWE1FOiBzaHV0ZG93biBvZiBzb21lIHNvcnQgKi8KKwkJcmV0dXJuOworCX0KKworCWVyciA9IG9yaW5vY29fcmVpbml0X2Zpcm13YXJlKGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvcmlub2NvX3Jlc2V0OiBFcnJvciAlZCByZS1pbml0aWFsaXppbmcgZmlybXdhcmVcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZwcml2LT5sb2NrKTsgLyogVGhpcyBoYXMgdG8gYmUgY2FsbGVkIGZyb20gdXNlciBjb250ZXh0ICovCisKKwlwcml2LT5od191bmF2YWlsYWJsZS0tOworCisJLyogcHJpdi0+b3BlbiBvciBwcml2LT5od191bmF2YWlsYWJsZSBtaWdodCBoYXZlIGNoYW5nZWQgd2hpbGUKKwkgKiB3ZSBkcm9wcGVkIHRoZSBsb2NrICovCisJaWYgKHByaXYtPm9wZW4gJiYgKCEgcHJpdi0+aHdfdW5hdmFpbGFibGUpKSB7CisJCWVyciA9IF9fb3Jpbm9jb191cChkZXYpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvcmlub2NvX3Jlc2V0OiBFcnJvciAlZCByZWVuYWJsaW5nIGNhcmRcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQl9IGVsc2UKKwkJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCX0KKworCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7CisKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEludGVycnVwdCBoYW5kbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgX19vcmlub2NvX2V2X3RpY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaGVybWVzX3QgKmh3KQoreworCXByaW50ayhLRVJOX0RFQlVHICIlczogVElDS1xuIiwgZGV2LT5uYW1lKTsKK30KKworc3RhdGljIHZvaWQgX19vcmlub2NvX2V2X3d0ZXJyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGhlcm1lc190ICpodykKK3sKKwkvKiBUaGlzIHNlZW1zIHRvIGhhcHBlbiBhIGZhaXIgYml0IHVuZGVyIGxvYWQsIGJ1dCBpZ25vcmluZyBpdAorCSAgIHNlZW1zIHRvIHdvcmsgZmluZS4uLiovCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBNQUMgY29udHJvbGxlciBlcnJvciAoV1RFUlIpLiBJZ25vcmluZy5cbiIsCisJICAgICAgIGRldi0+bmFtZSk7Cit9CisKK2lycXJldHVybl90IG9yaW5vY29faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGNvdW50ID0gTUFYX0lSUUxPT1BTX1BFUl9JUlE7CisJdTE2IGV2c3RhdCwgZXZlbnRzOworCS8qIFRoZXNlIGFyZSB1c2VkIHRvIGRldGVjdCBhIHJ1bmF3YXkgaW50ZXJydXB0IHNpdHVhdGlvbiAqLworCS8qIElmIHdlIGdldCBtb3JlIHRoYW4gTUFYX0lSUUxPT1BTX1BFUl9KSUZGWSBpdGVyYXRpb25zIGluIGEgamlmZnksCisJICogd2UgcGFuaWMgYW5kIHNodXQgZG93biB0aGUgaGFyZHdhcmUgKi8KKwlzdGF0aWMgaW50IGxhc3RfaXJxX2ppZmZ5ID0gMDsgLyogamlmZmllcyB2YWx1ZSB0aGUgbGFzdCB0aW1lCisJCQkJCSogd2Ugd2VyZSBjYWxsZWQgKi8KKwlzdGF0aWMgaW50IGxvb3BzX3RoaXNfamlmZnkgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkgeworCQkvKiBJZiBodyBpcyB1bmF2YWlsYWJsZSAtIHdlIGRvbid0IGtub3cgaWYgdGhlIGlycSB3YXMKKwkJICogZm9yIHVzIG9yIG5vdCAqLworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJZXZzdGF0ID0gaGVybWVzX3JlYWRfcmVnbihodywgRVZTVEFUKTsKKwlldmVudHMgPSBldnN0YXQgJiBody0+aW50ZW47CisJaWYgKCEgZXZlbnRzKSB7CisJCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJCisJaWYgKGppZmZpZXMgIT0gbGFzdF9pcnFfamlmZnkpCisJCWxvb3BzX3RoaXNfamlmZnkgPSAwOworCWxhc3RfaXJxX2ppZmZ5ID0gamlmZmllczsKKworCXdoaWxlIChldmVudHMgJiYgY291bnQtLSkgeworCQlpZiAoKytsb29wc190aGlzX2ppZmZ5ID4gTUFYX0lSUUxPT1BTX1BFUl9KSUZGWSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IElSUSBoYW5kbGVyIGlzIGxvb3BpbmcgdG9vICIKKwkJCSAgICAgICAibXVjaCEgUmVzZXR0aW5nLlxuIiwgZGV2LT5uYW1lKTsKKwkJCS8qIERpc2FibGUgaW50ZXJydXB0cyBmb3Igbm93ICovCisJCQloZXJtZXNfc2V0X2lycW1hc2soaHcsIDApOworCQkJc2NoZWR1bGVfd29yaygmcHJpdi0+cmVzZXRfd29yayk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIENoZWNrIHRoZSBjYXJkIGhhc24ndCBiZWVuIHJlbW92ZWQgKi8KKwkJaWYgKCEgaGVybWVzX3ByZXNlbnQoaHcpKSB7CisJCQlERUJVRygwLCAib3Jpbm9jb19pbnRlcnJ1cHQoKTogY2FyZCByZW1vdmVkXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGV2ZW50cyAmIEhFUk1FU19FVl9USUNLKQorCQkJX19vcmlub2NvX2V2X3RpY2soZGV2LCBodyk7CisJCWlmIChldmVudHMgJiBIRVJNRVNfRVZfV1RFUlIpCisJCQlfX29yaW5vY29fZXZfd3RlcnIoZGV2LCBodyk7CisJCWlmIChldmVudHMgJiBIRVJNRVNfRVZfSU5GRFJPUCkKKwkJCV9fb3Jpbm9jb19ldl9pbmZkcm9wKGRldiwgaHcpOworCQlpZiAoZXZlbnRzICYgSEVSTUVTX0VWX0lORk8pCisJCQlfX29yaW5vY29fZXZfaW5mbyhkZXYsIGh3KTsKKwkJaWYgKGV2ZW50cyAmIEhFUk1FU19FVl9SWCkKKwkJCV9fb3Jpbm9jb19ldl9yeChkZXYsIGh3KTsKKwkJaWYgKGV2ZW50cyAmIEhFUk1FU19FVl9UWEVYQykKKwkJCV9fb3Jpbm9jb19ldl90eGV4YyhkZXYsIGh3KTsKKwkJaWYgKGV2ZW50cyAmIEhFUk1FU19FVl9UWCkKKwkJCV9fb3Jpbm9jb19ldl90eChkZXYsIGh3KTsKKwkJaWYgKGV2ZW50cyAmIEhFUk1FU19FVl9BTExPQykKKwkJCV9fb3Jpbm9jb19ldl9hbGxvYyhkZXYsIGh3KTsKKwkJCisJCWhlcm1lc193cml0ZV9yZWduKGh3LCBFVkFDSywgZXZlbnRzKTsKKworCQlldnN0YXQgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBFVlNUQVQpOworCQlldmVudHMgPSBldnN0YXQgJiBody0+aW50ZW47CisJfTsKKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbml0aWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBjb21wX2lkIHsKKwl1MTYgaWQsIHZhcmlhbnQsIG1ham9yLCBtaW5vcjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgaW5saW5lIGZ3dHlwZV90IGRldGVybWluZV9maXJtd2FyZV90eXBlKHN0cnVjdCBjb21wX2lkICpuaWNfaWQpCit7CisJaWYgKG5pY19pZC0+aWQgPCAweDgwMDApCisJCXJldHVybiBGSVJNV0FSRV9UWVBFX0FHRVJFOworCWVsc2UgaWYgKG5pY19pZC0+aWQgPT0gMHg4MDAwICYmIG5pY19pZC0+bWFqb3IgPT0gMCkKKwkJcmV0dXJuIEZJUk1XQVJFX1RZUEVfU1lNQk9MOworCWVsc2UKKwkJcmV0dXJuIEZJUk1XQVJFX1RZUEVfSU5URVJTSUw7Cit9CisKKy8qIFNldCBwcml2LT5maXJtd2FyZSB0eXBlLCBkZXRlcm1pbmUgZmlybXdhcmUgcHJvcGVydGllcyAqLworc3RhdGljIGludCBkZXRlcm1pbmVfZmlybXdhcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVycjsKKwlzdHJ1Y3QgY29tcF9pZCBuaWNfaWQsIHN0YV9pZDsKKwl1bnNpZ25lZCBpbnQgZmlybXZlcjsKKwljaGFyIHRtcFtTWU1CT0xfTUFYX1ZFUl9MRU4rMV07CisKKwkvKiBHZXQgdGhlIGhhcmR3YXJlIHZlcnNpb24gKi8KKwllcnIgPSBIRVJNRVNfUkVBRF9SRUNPUkQoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX05JQ0lELCAmbmljX2lkKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCByZWFkIGhhcmR3YXJlIGlkZW50aXR5OiBlcnJvciAlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlsZTE2X3RvX2NwdXMoJm5pY19pZC5pZCk7CisJbGUxNl90b19jcHVzKCZuaWNfaWQudmFyaWFudCk7CisJbGUxNl90b19jcHVzKCZuaWNfaWQubWFqb3IpOworCWxlMTZfdG9fY3B1cygmbmljX2lkLm1pbm9yKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEhhcmR3YXJlIGlkZW50aXR5ICUwNHg6JTA0eDolMDR4OiUwNHhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgbmljX2lkLmlkLCBuaWNfaWQudmFyaWFudCwKKwkgICAgICAgbmljX2lkLm1ham9yLCBuaWNfaWQubWlub3IpOworCisJcHJpdi0+ZmlybXdhcmVfdHlwZSA9IGRldGVybWluZV9maXJtd2FyZV90eXBlKCZuaWNfaWQpOworCisJLyogR2V0IHRoZSBmaXJtd2FyZSB2ZXJzaW9uICovCisJZXJyID0gSEVSTUVTX1JFQURfUkVDT1JEKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9TVEFJRCwgJnN0YV9pZCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3QgcmVhZCBzdGF0aW9uIGlkZW50aXR5OiBlcnJvciAlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlsZTE2X3RvX2NwdXMoJnN0YV9pZC5pZCk7CisJbGUxNl90b19jcHVzKCZzdGFfaWQudmFyaWFudCk7CisJbGUxNl90b19jcHVzKCZzdGFfaWQubWFqb3IpOworCWxlMTZfdG9fY3B1cygmc3RhX2lkLm1pbm9yKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFN0YXRpb24gaWRlbnRpdHkgICUwNHg6JTA0eDolMDR4OiUwNHhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgc3RhX2lkLmlkLCBzdGFfaWQudmFyaWFudCwKKwkgICAgICAgc3RhX2lkLm1ham9yLCBzdGFfaWQubWlub3IpOworCisJc3dpdGNoIChzdGFfaWQuaWQpIHsKKwljYXNlIDB4MTU6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFByaW1hcnkgZmlybXdhcmUgaXMgYWN0aXZlXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJY2FzZSAweDE0YjoKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVGVydGlhcnkgZmlybXdhcmUgaXMgYWN0aXZlXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJY2FzZSAweDFmOgkvKiBJbnRlcnNpbCwgQWdlcmUsIFN5bWJvbCBTcGVjdHJ1bTI0ICovCisJY2FzZSAweDIxOgkvKiBTeW1ib2wgU3BlY3RydW0yNCBUcmlsb2d5ICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFVua25vd24gc3RhdGlvbiBJRCwgcGxlYXNlIHJlcG9ydFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWJyZWFrOworCX0KKworCS8qIERlZmF1bHQgY2FwYWJpbGl0aWVzICovCisJcHJpdi0+aGFzX3NlbnNpdGl2aXR5ID0gMTsKKwlwcml2LT5oYXNfbXdvID0gMDsKKwlwcml2LT5oYXNfcHJlYW1ibGUgPSAwOworCXByaXYtPmhhc19wb3J0MyA9IDE7CisJcHJpdi0+aGFzX2lic3MgPSAxOworCXByaXYtPmhhc193ZXAgPSAwOworCXByaXYtPmhhc19iaWdfd2VwID0gMDsKKworCS8qIERldGVybWluZSBjYXBhYmlsaXRpZXMgZnJvbSB0aGUgZmlybXdhcmUgdmVyc2lvbiAqLworCXN3aXRjaCAocHJpdi0+ZmlybXdhcmVfdHlwZSkgeworCWNhc2UgRklSTVdBUkVfVFlQRV9BR0VSRToKKwkJLyogTHVjZW50IFdhdmVsYW4gSUVFRSwgTHVjZW50IE9yaW5vY28sIENhYmxldHJvbiBSb2FtQWJvdXQsCisJCSAgIEVMU0EsIE1lbGNvLCBIUCwgSUJNLCBEZWxsIDExNTAsIENvbXBhcSAxMTAvMjEwICovCisJCXNucHJpbnRmKHByaXYtPmZ3X25hbWUsIHNpemVvZihwcml2LT5md19uYW1lKSAtIDEsCisJCQkgIkx1Y2VudC9BZ2VyZSAlZC4lMDJkIiwgc3RhX2lkLm1ham9yLCBzdGFfaWQubWlub3IpOworCisJCWZpcm12ZXIgPSAoKHVuc2lnbmVkIGxvbmcpc3RhX2lkLm1ham9yIDw8IDE2KSB8IHN0YV9pZC5taW5vcjsKKworCQlwcml2LT5oYXNfaWJzcyA9IChmaXJtdmVyID49IDB4NjAwMDYpOworCQlwcml2LT5oYXNfd2VwID0gKGZpcm12ZXIgPj0gMHg0MDAyMCk7CisJCXByaXYtPmhhc19iaWdfd2VwID0gMTsgLyogRklYTUU6IHRoaXMgaXMgd3JvbmcgLSBob3cgZG8gd2UgdGVsbAorCQkJCQkgIEdvbGQgY2FyZHMgZnJvbSB0aGUgb3RoZXJzPyAqLworCQlwcml2LT5oYXNfbXdvID0gKGZpcm12ZXIgPj0gMHg2MDAwMCk7CisJCXByaXYtPmhhc19wbSA9IChmaXJtdmVyID49IDB4NDAwMjApOyAvKiBEb24ndCB3b3JrIGluIDcuNTIgPyAqLworCQlwcml2LT5pYnNzX3BvcnQgPSAxOworCisJCS8qIFRlc3RlZCB3aXRoIEFnZXJlIGZpcm13YXJlIDoKKwkJICoJMS4xNiA7IDQuMDggOyA0LjUyIDsgNi4wNCA7IDYuMTYgOyA3LjI4ID0+IEplYW4gSUkKKwkJICogVGVzdGVkIENhYmxlVHJvbiBmaXJtd2FyZSA6IDQuMzIgPT4gQW50b24gKi8KKwkJYnJlYWs7CisJY2FzZSBGSVJNV0FSRV9UWVBFX1NZTUJPTDoKKwkJLyogU3ltYm9sICwgM0NvbSBBaXJDb25uZWN0LCBJbnRlbCwgRXJpY3Nzb24gV0xBTiAqLworCQkvKiBJbnRlbCBNQUMgOiAwMDowMjpCMzoqICovCisJCS8qIDNDb20gTUFDIDogMDA6NTA6REE6KiAqLworCQltZW1zZXQodG1wLCAwLCBzaXplb2YodG1wKSk7CisJCS8qIEdldCB0aGUgU3ltYm9sIGZpcm13YXJlIHZlcnNpb24gKi8KKwkJZXJyID0gaGVybWVzX3JlYWRfbHR2KGh3LCBVU0VSX0JBUCwKKwkJCQkgICAgICBIRVJNRVNfUklEX1NFQ09OREFSWVZFUlNJT05fU1lNQk9MLAorCQkJCSAgICAgIFNZTUJPTF9NQVhfVkVSX0xFTiwgTlVMTCwgJnRtcCk7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXM6IEVycm9yICVkIHJlYWRpbmcgU3ltYm9sIGZpcm13YXJlIGluZm8uIFdpbGRseSBndWVzc2luZyBjYXBhYmlsaXRpZXMuLi5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQkJZmlybXZlciA9IDA7CisJCQl0bXBbMF0gPSAnXDAnOworCQl9IGVsc2UgeworCQkJLyogVGhlIGZpcm13YXJlIHJldmlzaW9uIGlzIGEgc3RyaW5nLCB0aGUgZm9ybWF0IGlzCisJCQkgKiBzb21ldGhpbmcgbGlrZSA6ICJWMi4yMC0wMSIuCisJCQkgKiBRdWljayBhbmQgZGlydHkgcGFyc2luZy4uLiAtIEplYW4gSUkKKwkJCSAqLworCQkJZmlybXZlciA9ICgodG1wWzFdIC0gJzAnKSA8PCAxNikgfCAoKHRtcFszXSAtICcwJykgPDwgMTIpCisJCQkJfCAoKHRtcFs0XSAtICcwJykgPDwgOCkgfCAoKHRtcFs2XSAtICcwJykgPDwgNCkKKwkJCQl8ICh0bXBbN10gLSAnMCcpOworCisJCQl0bXBbU1lNQk9MX01BWF9WRVJfTEVOXSA9ICdcMCc7CisJCX0KKworCQlzbnByaW50Zihwcml2LT5md19uYW1lLCBzaXplb2YocHJpdi0+ZndfbmFtZSkgLSAxLAorCQkJICJTeW1ib2wgJXMiLCB0bXApOworCisJCXByaXYtPmhhc19pYnNzID0gKGZpcm12ZXIgPj0gMHgyMDAwMCk7CisJCXByaXYtPmhhc193ZXAgPSAoZmlybXZlciA+PSAweDE1MDEyKTsKKwkJcHJpdi0+aGFzX2JpZ193ZXAgPSAoZmlybXZlciA+PSAweDIwMDAwKTsKKwkJcHJpdi0+aGFzX3BtID0gKGZpcm12ZXIgPj0gMHgyMDAwMCAmJiBmaXJtdmVyIDwgMHgyMjAwMCkgfHwgCisJCQkgICAgICAgKGZpcm12ZXIgPj0gMHgyOTAwMCAmJiBmaXJtdmVyIDwgMHgzMDAwMCkgfHwKKwkJCSAgICAgICBmaXJtdmVyID49IDB4MzEwMDA7CisJCXByaXYtPmhhc19wcmVhbWJsZSA9IChmaXJtdmVyID49IDB4MjAwMDApOworCQlwcml2LT5pYnNzX3BvcnQgPSA0OworCQkvKiBUZXN0ZWQgd2l0aCBJbnRlbCBmaXJtd2FyZSA6IDB4MjAwMTUgPT4gSmVhbiBJSSAqLworCQkvKiBUZXN0ZWQgd2l0aCAzQ29tIGZpcm13YXJlIDogMHgxNTAxMiAmIDB4MjIwMDEgPT4gSmVhbiBJSSAqLworCQlicmVhazsKKwljYXNlIEZJUk1XQVJFX1RZUEVfSU5URVJTSUw6CisJCS8qIEQtTGluaywgTGlua3N5cywgQWR0cm9uLCBab29tQWlyLCBhbmQgbWFueSBvdGhlcnMuLi4KKwkJICogU2Ftc3VuZywgQ29tcGFxIDEwMC8yMDAgYW5kIFByb3hpbSBhcmUgc2xpZ2h0bHkKKwkJICogZGlmZmVyZW50IGFuZCBsZXNzIHdlbGwgdGVzdGVkICovCisJCS8qIEQtTGluayBNQUMgOiAwMDo0MDowNToqICovCisJCS8qIEFkZHRyb24gTUFDIDogMDA6OTA6RDE6KiAqLworCQlzbnByaW50Zihwcml2LT5md19uYW1lLCBzaXplb2YocHJpdi0+ZndfbmFtZSkgLSAxLAorCQkJICJJbnRlcnNpbCAlZC4lZC4lZCIsIHN0YV9pZC5tYWpvciwgc3RhX2lkLm1pbm9yLAorCQkJIHN0YV9pZC52YXJpYW50KTsKKworCQlmaXJtdmVyID0gKCh1bnNpZ25lZCBsb25nKXN0YV9pZC5tYWpvciA8PCAxNikgfAorCQkJKCh1bnNpZ25lZCBsb25nKXN0YV9pZC5taW5vciA8PCA4KSB8IHN0YV9pZC52YXJpYW50OworCisJCXByaXYtPmhhc19pYnNzID0gKGZpcm12ZXIgPj0gMHgwMDA3MDApOyAvKiBGSVhNRSAqLworCQlwcml2LT5oYXNfYmlnX3dlcCA9IHByaXYtPmhhc193ZXAgPSAoZmlybXZlciA+PSAweDAwMDgwMCk7CisJCXByaXYtPmhhc19wbSA9IChmaXJtdmVyID49IDB4MDAwNzAwKTsKKworCQlpZiAoZmlybXZlciA+PSAweDAwMDgwMCkKKwkJCXByaXYtPmlic3NfcG9ydCA9IDA7CisJCWVsc2UgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogSW50ZXJzaWwgZmlybXdhcmUgZWFybGllciAiCisJCQkgICAgICAgInRoYW4gdjAuOC54IC0gc2V2ZXJhbCBmZWF0dXJlcyBub3Qgc3VwcG9ydGVkXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQlwcml2LT5pYnNzX3BvcnQgPSAxOworCQl9CisJCWJyZWFrOworCX0KKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEZpcm13YXJlIGRldGVybWluZWQgYXMgJXNcbiIsIGRldi0+bmFtZSwKKwkgICAgICAgcHJpdi0+ZndfbmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGhlcm1lc19pZHN0cmluZyBuaWNrYnVmOworCXUxNiByZWNsZW47CisJaW50IGxlbjsKKworCVRSQUNFX0VOVEVSKGRldi0+bmFtZSk7CisKKwkvKiBObyBuZWVkIHRvIGxvY2ssIHRoZSBod191bmF2YWlsYWJsZSBmbGFnIGlzIGFscmVhZHkgc2V0IGluCisJICogYWxsb2Nfb3Jpbm9jb2RldigpICovCisJcHJpdi0+bmljYnVmX3NpemUgPSBJRUVFODAyXzExX0ZSQU1FX0xFTiArIEVUSF9ITEVOOworCisJLyogSW5pdGlhbGl6ZSB0aGUgZmlybXdhcmUgKi8KKwllcnIgPSBoZXJtZXNfaW5pdChodyk7CisJaWYgKGVyciAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBpbml0aWFsaXplIGZpcm13YXJlIChlcnIgPSAlZClcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IGRldGVybWluZV9maXJtd2FyZShkZXYpOworCWlmIChlcnIgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbmNvbXBhdGlibGUgZmlybXdhcmUsIGFib3J0aW5nXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHByaXYtPmhhc19wb3J0MykKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBBZC1ob2MgZGVtbyBtb2RlIHN1cHBvcnRlZFxuIiwgZGV2LT5uYW1lKTsKKwlpZiAocHJpdi0+aGFzX2lic3MpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogSUVFRSBzdGFuZGFyZCBJQlNTIGFkLWhvYyBtb2RlIHN1cHBvcnRlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJaWYgKHByaXYtPmhhc193ZXApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBXRVAgc3VwcG9ydGVkLCAiLCBkZXYtPm5hbWUpOworCQlpZiAocHJpdi0+aGFzX2JpZ193ZXApCisJCQlwcmludGsoIjEwNC1iaXQga2V5XG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKCI0MC1iaXQga2V5XG4iKTsKKwl9CisKKwkvKiBHZXQgdGhlIE1BQyBhZGRyZXNzICovCisJZXJyID0gaGVybWVzX3JlYWRfbHR2KGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZPV05NQUNBRERSLAorCQkJICAgICAgRVRIX0FMRU4sIE5VTEwsIGRldi0+ZGV2X2FkZHIpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZhaWxlZCB0byByZWFkIE1BQyBhZGRyZXNzIVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICIlczogTUFDIGFkZHJlc3MgJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwKKwkgICAgICAgZGV2LT5kZXZfYWRkclsyXSwgZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwKKwkgICAgICAgZGV2LT5kZXZfYWRkcls1XSk7CisKKwkvKiBHZXQgdGhlIHN0YXRpb24gbmFtZSAqLworCWVyciA9IGhlcm1lc19yZWFkX2x0dihodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GT1dOTkFNRSwKKwkJCSAgICAgIHNpemVvZihuaWNrYnVmKSwgJnJlY2xlbiwgJm5pY2tidWYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlYWQgc3RhdGlvbiBuYW1lXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChuaWNrYnVmLmxlbikKKwkJbGVuID0gbWluKElXX0VTU0lEX01BWF9TSVpFLCAoaW50KWxlMTZfdG9fY3B1KG5pY2tidWYubGVuKSk7CisJZWxzZQorCQlsZW4gPSBtaW4oSVdfRVNTSURfTUFYX1NJWkUsIDIgKiByZWNsZW4pOworCW1lbWNweShwcml2LT5uaWNrLCAmbmlja2J1Zi52YWwsIGxlbik7CisJcHJpdi0+bmlja1tsZW5dID0gJ1wwJzsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogU3RhdGlvbiBuYW1lIFwiJXNcIlxuIiwgZGV2LT5uYW1lLCBwcml2LT5uaWNrKTsKKworCS8qIEdldCBhbGxvd2VkIGNoYW5uZWxzICovCisJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ0hBTk5FTExJU1QsCisJCQkJICAmcHJpdi0+Y2hhbm5lbF9tYXNrKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZWFkIGNoYW5uZWwgbGlzdCFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBHZXQgaW5pdGlhbCBBUCBkZW5zaXR5ICovCisJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GU1lTVEVNU0NBTEUsCisJCQkJICAmcHJpdi0+YXBfZGVuc2l0eSk7CisJaWYgKGVyciB8fCBwcml2LT5hcF9kZW5zaXR5IDwgMSB8fCBwcml2LT5hcF9kZW5zaXR5ID4gMykgeworCQlwcml2LT5oYXNfc2Vuc2l0aXZpdHkgPSAwOworCX0KKworCS8qIEdldCBpbml0aWFsIFJUUyB0aHJlc2hvbGQgKi8KKwllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZSVFNUSFJFU0hPTEQsCisJCQkJICAmcHJpdi0+cnRzX3RocmVzaCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gcmVhZCBSVFMgdGhyZXNob2xkIVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEdldCBpbml0aWFsIGZyYWdtZW50YXRpb24gc2V0dGluZ3MgKi8KKwlpZiAocHJpdi0+aGFzX213bykKKwkJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgSEVSTUVTX1JJRF9DTkZNV09ST0JVU1RfQUdFUkUsCisJCQkJCSAgJnByaXYtPm13b19yb2J1c3QpOworCWVsc2UKKwkJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GRlJBR01FTlRBVElPTlRIUkVTSE9MRCwKKwkJCQkJICAmcHJpdi0+ZnJhZ190aHJlc2gpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlYWQgZnJhZ21lbnRhdGlvbiBzZXR0aW5ncyFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBQb3dlciBtYW5hZ2VtZW50IHNldHVwICovCisJaWYgKHByaXYtPmhhc19wbSkgeworCQlwcml2LT5wbV9vbiA9IDA7CisJCXByaXYtPnBtX21jYXN0ID0gMTsKKwkJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgSEVSTUVTX1JJRF9DTkZNQVhTTEVFUERVUkFUSU9OLAorCQkJCQkgICZwcml2LT5wbV9wZXJpb2QpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBmYWlsZWQgdG8gcmVhZCBwb3dlciBtYW5hZ2VtZW50IHBlcmlvZCFcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCQkgIEhFUk1FU19SSURfQ05GUE1IT0xET1ZFUkRVUkFUSU9OLAorCQkJCQkgICZwcml2LT5wbV90aW1lb3V0KTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlYWQgcG93ZXIgbWFuYWdlbWVudCB0aW1lb3V0IVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBQcmVhbWJsZSBzZXR1cCAqLworCWlmIChwcml2LT5oYXNfcHJlYW1ibGUpIHsKKwkJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgSEVSTUVTX1JJRF9DTkZQUkVBTUJMRV9TWU1CT0wsCisJCQkJCSAgJnByaXYtPnByZWFtYmxlKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKwkJCisJLyogU2V0IHVwIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KKwlwcml2LT5pd19tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwkvKiBCeSBkZWZhdWx0IHVzZSBJRUVFL0lCU1MgYWQtaG9jIG1vZGUgaWYgd2UgaGF2ZSBpdCAqLworCXByaXYtPnByZWZlcl9wb3J0MyA9IHByaXYtPmhhc19wb3J0MyAmJiAoISBwcml2LT5oYXNfaWJzcyk7CisJc2V0X3BvcnRfdHlwZShwcml2KTsKKwlwcml2LT5jaGFubmVsID0gMTA7IC8qIGRlZmF1bHQgY2hhbm5lbCwgbW9yZS1vci1sZXNzIGFyYml0cmFyeSAqLworCisJcHJpdi0+cHJvbWlzY3VvdXMgPSAwOworCXByaXYtPndlcF9vbiA9IDA7CisJcHJpdi0+dHhfa2V5ID0gMDsKKworCWVyciA9IGhlcm1lc19hbGxvY2F0ZShodywgcHJpdi0+bmljYnVmX3NpemUsICZwcml2LT50eGZpZCk7CisJaWYgKGVyciA9PSAtRUlPKSB7CisJCS8qIFRyeSB3b3JrYXJvdW5kIGZvciBvbGQgU3ltYm9sIGZpcm13YXJlIGJ1ZyAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZmlybXdhcmUgQUxMT0MgYnVnIGRldGVjdGVkICIKKwkJICAgICAgICIob2xkIFN5bWJvbCBmaXJtd2FyZT8pLiBUcnlpbmcgdG8gd29yayBhcm91bmQuLi4gIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCQorCQlwcml2LT5uaWNidWZfc2l6ZSA9IFRYX05JQ0JVRl9TSVpFX0JVRzsKKwkJZXJyID0gaGVybWVzX2FsbG9jYXRlKGh3LCBwcml2LT5uaWNidWZfc2l6ZSwgJnByaXYtPnR4ZmlkKTsKKwkJaWYgKGVycikKKwkJCXByaW50aygiZmFpbGVkIVxuIik7CisJCWVsc2UKKwkJCXByaW50aygib2suXG4iKTsKKwl9CisJaWYgKGVycikgeworCQlwcmludGsoIiVzOiBFcnJvciAlZCBhbGxvY2F0aW5nIFR4IGJ1ZmZlclxuIiwgZGV2LT5uYW1lLCBlcnIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBNYWtlIHRoZSBoYXJkd2FyZSBhdmFpbGFibGUsIGFzIGxvbmcgYXMgaXQgaGFzbid0IGJlZW4KKwkgKiByZW1vdmVkIGVsc2V3aGVyZSAoZS5nLiBieSBQQ01DSUEgaG90IHVucGx1ZykgKi8KKwlzcGluX2xvY2tfaXJxKCZwcml2LT5sb2NrKTsKKwlwcml2LT5od191bmF2YWlsYWJsZS0tOworCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlYWR5XG4iLCBkZXYtPm5hbWUpOworCisgb3V0OgorCVRSQUNFX0VYSVQoZGV2LT5uYW1lKTsKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2Nfb3Jpbm9jb2RldihpbnQgc2l6ZW9mX2NhcmQsCisJCQkJICAgIGludCAoKmhhcmRfcmVzZXQpKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKikpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2OworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUpICsgc2l6ZW9mX2NhcmQpOworCWlmICghIGRldikKKwkJcmV0dXJuIE5VTEw7CisJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcHJpdi0+bmRldiA9IGRldjsKKwlpZiAoc2l6ZW9mX2NhcmQpCisJCXByaXYtPmNhcmQgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZyluZXRkZXZfcHJpdihkZXYpCisJCQkJICAgICAgKyBzaXplb2Yoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSkpOworCWVsc2UKKwkJcHJpdi0+Y2FyZCA9IE5VTEw7CisKKwkvKiBTZXR1cCAvIG92ZXJyaWRlIG5ldF9kZXZpY2UgZmllbGRzICovCisJZGV2LT5pbml0ID0gb3Jpbm9jb19pbml0OworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gb3Jpbm9jb194bWl0OworCWRldi0+dHhfdGltZW91dCA9IG9yaW5vY29fdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gSFo7IC8qIDEgc2Vjb25kIHRpbWVvdXQgKi8KKwlkZXYtPmdldF9zdGF0cyA9IG9yaW5vY29fZ2V0X3N0YXRzOworCWRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID0gb3Jpbm9jb19nZXRfd2lyZWxlc3Nfc3RhdHM7CisJZGV2LT5kb19pb2N0bCA9IG9yaW5vY29faW9jdGw7CisJZGV2LT5jaGFuZ2VfbXR1ID0gb3Jpbm9jb19jaGFuZ2VfbXR1OworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gb3Jpbm9jb19zZXRfbXVsdGljYXN0X2xpc3Q7CisJLyogd2UgdXNlIHRoZSBkZWZhdWx0IGV0aF9tYWNfYWRkciBmb3Igc2V0dGluZyB0aGUgTUFDIGFkZHIgKi8KKworCS8qIFNldCB1cCBkZWZhdWx0IGNhbGxiYWNrcyAqLworCWRldi0+b3BlbiA9IG9yaW5vY29fb3BlbjsKKwlkZXYtPnN0b3AgPSBvcmlub2NvX3N0b3A7CisJcHJpdi0+aGFyZF9yZXNldCA9IGhhcmRfcmVzZXQ7CisKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CisJcHJpdi0+b3BlbiA9IDA7CisJcHJpdi0+aHdfdW5hdmFpbGFibGUgPSAxOyAvKiBvcmlub2NvX2luaXQoKSBtdXN0IGNsZWFyIHRoaXMKKwkJCQkgICAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRvdWNoZXMgdGhlCisJCQkJICAgKiBoYXJkd2FyZSAqLworCUlOSVRfV09SSygmcHJpdi0+cmVzZXRfd29yaywgKHZvaWQgKCopKHZvaWQgKikpb3Jpbm9jb19yZXNldCwgZGV2KTsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJcHJpdi0+bGFzdF9saW5rc3RhdHVzID0gMHhmZmZmOworCisJcmV0dXJuIGRldjsKKworfQorCit2b2lkIGZyZWVfb3Jpbm9jb2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFdpcmVsZXNzIGV4dGVuc2lvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBvcmlub2NvX2h3X2dldF9ic3NpZChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2LAorCQkJCWNoYXIgYnVmW0VUSF9BTEVOXSkKK3sKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJZXJyID0gaGVybWVzX3JlYWRfbHR2KGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DVVJSRU5UQlNTSUQsCisJCQkgICAgICBFVEhfQUxFTiwgTlVMTCwgYnVmKTsKKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faHdfZ2V0X2Vzc2lkKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYsIGludCAqYWN0aXZlLAorCQkJCWNoYXIgYnVmW0lXX0VTU0lEX01BWF9TSVpFKzFdKQoreworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgaGVybWVzX2lkc3RyaW5nIGVzc2lkYnVmOworCWNoYXIgKnAgPSAoY2hhciAqKSgmZXNzaWRidWYudmFsKTsKKwlpbnQgbGVuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChzdHJsZW4ocHJpdi0+ZGVzaXJlZF9lc3NpZCkgPiAwKSB7CisJCS8qIFdlIHJlYWQgdGhlIGRlc2lyZWQgU1NJRCBmcm9tIHRoZSBoYXJkd2FyZSByYXRoZXIKKwkJICAgdGhhbiBmcm9tIHByaXYtPmRlc2lyZWRfZXNzaWQsIGp1c3QgaW4gY2FzZSB0aGUKKwkJICAgZmlybXdhcmUgaXMgYWxsb3dlZCB0byBjaGFuZ2UgaXQgb24gdXMuIEknbSBub3QKKwkJICAgc3VyZSBhYm91dCB0aGlzICovCisJCS8qIE15IGd1ZXNzIGlzIHRoYXQgdGhlIE9XTlNTSUQgc2hvdWxkIGFsd2F5cyBiZSB3aGF0ZXZlcgorCQkgKiB3ZSBzZXQgdG8gdGhlIGNhcmQsIHdoZXJlYXMgQ1VSUkVOVF9TU0lEIGlzIHRoZSBvbmUgdGhhdAorCQkgKiBtYXkgY2hhbmdlLi4uIC0gSmVhbiBJSSAqLworCQl1MTYgcmlkOworCisJCSphY3RpdmUgPSAxOworCisJCXJpZCA9IChwcml2LT5wb3J0X3R5cGUgPT0gMykgPyBIRVJNRVNfUklEX0NORk9XTlNTSUQgOgorCQkJSEVSTUVTX1JJRF9DTkZERVNJUkVEU1NJRDsKKwkJCisJCWVyciA9IGhlcm1lc19yZWFkX2x0dihodywgVVNFUl9CQVAsIHJpZCwgc2l6ZW9mKGVzc2lkYnVmKSwKKwkJCQkgICAgICBOVUxMLCAmZXNzaWRidWYpOworCQlpZiAoZXJyKQorCQkJZ290byBmYWlsX3VubG9jazsKKwl9IGVsc2UgeworCQkqYWN0aXZlID0gMDsKKworCQllcnIgPSBoZXJtZXNfcmVhZF9sdHYoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NVUlJFTlRTU0lELAorCQkJCSAgICAgIHNpemVvZihlc3NpZGJ1ZiksIE5VTEwsICZlc3NpZGJ1Zik7CisJCWlmIChlcnIpCisJCQlnb3RvIGZhaWxfdW5sb2NrOworCX0KKworCWxlbiA9IGxlMTZfdG9fY3B1KGVzc2lkYnVmLmxlbik7CisKKwltZW1zZXQoYnVmLCAwLCBJV19FU1NJRF9NQVhfU0laRSsxKTsKKwltZW1jcHkoYnVmLCBwLCBsZW4pOworCWJ1ZltsZW5dID0gJ1wwJzsKKworIGZhaWxfdW5sb2NrOgorCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gZXJyOyAgICAgICAKK30KKworc3RhdGljIGxvbmcgb3Jpbm9jb19od19nZXRfZnJlcShzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQoreworCQorCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKwl1MTYgY2hhbm5lbDsKKwlsb25nIGZyZXEgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKwkKKwllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DVVJSRU5UQ0hBTk5FTCwgJmNoYW5uZWwpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyogSW50ZXJzaWwgZmlybXdhcmUgMS4zLjUgcmV0dXJucyAwIHdoZW4gdGhlIGludGVyZmFjZSBpcyBkb3duICovCisJaWYgKGNoYW5uZWwgPT0gMCkgeworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWlmICggKGNoYW5uZWwgPCAxKSB8fCAoY2hhbm5lbCA+IE5VTV9DSEFOTkVMUykgKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDaGFubmVsIG91dCBvZiByYW5nZSAoJWQpIVxuIiwKKwkJICAgICAgIHByaXYtPm5kZXYtPm5hbWUsIGNoYW5uZWwpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCisJfQorCWZyZXEgPSBjaGFubmVsX2ZyZXF1ZW5jeVtjaGFubmVsLTFdICogMTAwMDAwOworCisgb3V0OgorCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlpZiAoZXJyID4gMCkKKwkJZXJyID0gLUVCVVNZOworCXJldHVybiBlcnIgPyBlcnIgOiBmcmVxOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faHdfZ2V0X2JpdHJhdGVsaXN0KHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYsCisJCQkJICAgICAgaW50ICpudW1yYXRlcywgczMyICpyYXRlcywgaW50IG1heCkKK3sKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJc3RydWN0IGhlcm1lc19pZHN0cmluZyBsaXN0OworCXVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciAqKSZsaXN0LnZhbDsKKwlpbnQgZXJyID0gMDsKKwlpbnQgbnVtOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWVyciA9IGhlcm1lc19yZWFkX2x0dihodywgVVNFUl9CQVAsIEhFUk1FU19SSURfU1VQUE9SVEVEREFUQVJBVEVTLAorCQkJICAgICAgc2l6ZW9mKGxpc3QpLCBOVUxMLCAmbGlzdCk7CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJCisJbnVtID0gbGUxNl90b19jcHUobGlzdC5sZW4pOworCSpudW1yYXRlcyA9IG51bTsKKwludW0gPSBtaW4obnVtLCBtYXgpOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCXJhdGVzW2ldID0gKHBbaV0gJiAweDdmKSAqIDUwMDAwMDsgLyogY29udmVydCB0byBicHMgKi8KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldGl3cmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICpycnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVyciA9IDA7CisJaW50IG1vZGU7CisJc3RydWN0IGl3X3JhbmdlIHJhbmdlOworCWludCBudW1yYXRlczsKKwlpbnQgaSwgazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJVFJBQ0VfRU5URVIoZGV2LT5uYW1lKTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcnJxLT5wb2ludGVyLCBzaXplb2YocmFuZ2UpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlycnEtPmxlbmd0aCA9IHNpemVvZihyYW5nZSk7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCW1vZGUgPSBwcml2LT5pd19tb2RlOworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwltZW1zZXQoJnJhbmdlLCAwLCBzaXplb2YocmFuZ2UpKTsKKworCS8qIE11Y2ggb2YgdGhpcyBzaGFtZWxlc3NseSB0YWtlbiBmcm9tIHd2bGFuX2NzLmMuIE5vIGlkZWEKKwkgKiB3aGF0IGl0IGFsbCBtZWFucyAtZGdpYnNvbiAqLworCXJhbmdlLndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2Uud2VfdmVyc2lvbl9zb3VyY2UgPSAxMTsKKworCXJhbmdlLm1pbl9ud2lkID0gcmFuZ2UubWF4X253aWQgPSAwOyAvKiBXZSBkb24ndCB1c2UgbndpZHMgKi8KKworCS8qIFNldCBhdmFpbGFibGUgY2hhbm5lbHMvZnJlcXVlbmNpZXMgKi8KKwlyYW5nZS5udW1fY2hhbm5lbHMgPSBOVU1fQ0hBTk5FTFM7CisJayA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5VTV9DSEFOTkVMUzsgaSsrKSB7CisJCWlmIChwcml2LT5jaGFubmVsX21hc2sgJiAoMSA8PCBpKSkgeworCQkJcmFuZ2UuZnJlcVtrXS5pID0gaSArIDE7CisJCQlyYW5nZS5mcmVxW2tdLm0gPSBjaGFubmVsX2ZyZXF1ZW5jeVtpXSAqIDEwMDAwMDsKKwkJCXJhbmdlLmZyZXFba10uZSA9IDE7CisJCQlrKys7CisJCX0KKwkJCisJCWlmIChrID49IElXX01BWF9GUkVRVUVOQ0lFUykKKwkJCWJyZWFrOworCX0KKwlyYW5nZS5udW1fZnJlcXVlbmN5ID0gazsKKworCXJhbmdlLnNlbnNpdGl2aXR5ID0gMzsKKworCWlmICgobW9kZSA9PSBJV19NT0RFX0FESE9DKSAmJiAocHJpdi0+c3B5X251bWJlciA9PSAwKSl7CisJCS8qIFF1YWxpdHkgc3RhdHMgbWVhbmluZ2xlc3MgaW4gYWQtaG9jIG1vZGUgKi8KKwkJcmFuZ2UubWF4X3F1YWwucXVhbCA9IDA7CisJCXJhbmdlLm1heF9xdWFsLmxldmVsID0gMDsKKwkJcmFuZ2UubWF4X3F1YWwubm9pc2UgPSAwOworCQlyYW5nZS5hdmdfcXVhbC5xdWFsID0gMDsKKwkJcmFuZ2UuYXZnX3F1YWwubGV2ZWwgPSAwOworCQlyYW5nZS5hdmdfcXVhbC5ub2lzZSA9IDA7CisJfSBlbHNlIHsKKwkJcmFuZ2UubWF4X3F1YWwucXVhbCA9IDB4OGIgLSAweDJmOworCQlyYW5nZS5tYXhfcXVhbC5sZXZlbCA9IDB4MmYgLSAweDk1IC0gMTsKKwkJcmFuZ2UubWF4X3F1YWwubm9pc2UgPSAweDJmIC0gMHg5NSAtIDE7CisJCS8qIE5lZWQgdG8gZ2V0IGJldHRlciB2YWx1ZXMgKi8KKwkJcmFuZ2UuYXZnX3F1YWwucXVhbCA9IDB4MjQ7CisJCXJhbmdlLmF2Z19xdWFsLmxldmVsID0gMHhDMjsKKwkJcmFuZ2UuYXZnX3F1YWwubm9pc2UgPSAweDlFOworCX0KKworCWVyciA9IG9yaW5vY29faHdfZ2V0X2JpdHJhdGVsaXN0KHByaXYsICZudW1yYXRlcywKKwkJCQkJIHJhbmdlLmJpdHJhdGUsIElXX01BWF9CSVRSQVRFUyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlyYW5nZS5udW1fYml0cmF0ZXMgPSBudW1yYXRlczsKKwkKKwkvKiBTZXQgYW4gaW5kaWNhdGlvbiBvZiB0aGUgbWF4IFRDUCB0aHJvdWdocHV0IGluIGJpdC9zIHRoYXQgd2UgY2FuCisJICogZXhwZWN0IHVzaW5nIHRoaXMgaW50ZXJmYWNlLiBNYXkgYmUgdXNlIGZvciBRb1Mgc3R1ZmYuLi4KKwkgKiBKZWFuIElJICovCisJaWYobnVtcmF0ZXMgPiAyKQorCQlyYW5nZS50aHJvdWdocHV0ID0gNSAqIDEwMDAgKiAxMDAwOwkvKiB+NSBNYi9zICovCisJZWxzZQorCQlyYW5nZS50aHJvdWdocHV0ID0gMS41ICogMTAwMCAqIDEwMDA7CS8qIH4xLjUgTWIvcyAqLworCisJcmFuZ2UubWluX3J0cyA9IDA7CisJcmFuZ2UubWF4X3J0cyA9IDIzNDc7CisJcmFuZ2UubWluX2ZyYWcgPSAyNTY7CisJcmFuZ2UubWF4X2ZyYWcgPSAyMzQ2OworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisJaWYgKHByaXYtPmhhc193ZXApIHsKKwkJcmFuZ2UubWF4X2VuY29kaW5nX3Rva2VucyA9IE9SSU5PQ09fTUFYX0tFWVM7CisKKwkJcmFuZ2UuZW5jb2Rpbmdfc2l6ZVswXSA9IFNNQUxMX0tFWV9TSVpFOworCQlyYW5nZS5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAxOworCisJCWlmIChwcml2LT5oYXNfYmlnX3dlcCkgeworCQkJcmFuZ2UuZW5jb2Rpbmdfc2l6ZVsxXSA9IExBUkdFX0tFWV9TSVpFOworCQkJcmFuZ2UubnVtX2VuY29kaW5nX3NpemVzID0gMjsKKwkJfQorCX0gZWxzZSB7CisJCXJhbmdlLm51bV9lbmNvZGluZ19zaXplcyA9IDA7CisJCXJhbmdlLm1heF9lbmNvZGluZ190b2tlbnMgPSAwOworCX0KKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCQkKKwlyYW5nZS5taW5fcG1wID0gMDsKKwlyYW5nZS5tYXhfcG1wID0gNjU1MzUwMDA7CisJcmFuZ2UubWluX3BtdCA9IDA7CisJcmFuZ2UubWF4X3BtdCA9IDY1NTM1ICogMTAwMDsJLyogPz8/ICovCisJcmFuZ2UucG1wX2ZsYWdzID0gSVdfUE9XRVJfUEVSSU9EOworCXJhbmdlLnBtdF9mbGFncyA9IElXX1BPV0VSX1RJTUVPVVQ7CisJcmFuZ2UucG1fY2FwYSA9IElXX1BPV0VSX1BFUklPRCB8IElXX1BPV0VSX1RJTUVPVVQgfCBJV19QT1dFUl9VTklDQVNUX1I7CisKKwlyYW5nZS5udW1fdHhwb3dlciA9IDE7CisJcmFuZ2UudHhwb3dlclswXSA9IDE1OyAvKiAxNWRCbSAqLworCXJhbmdlLnR4cG93ZXJfY2FwYSA9IElXX1RYUE9XX0RCTTsKKworCXJhbmdlLnJldHJ5X2NhcGEgPSBJV19SRVRSWV9MSU1JVCB8IElXX1JFVFJZX0xJRkVUSU1FOworCXJhbmdlLnJldHJ5X2ZsYWdzID0gSVdfUkVUUllfTElNSVQ7CisJcmFuZ2Uucl90aW1lX2ZsYWdzID0gSVdfUkVUUllfTElGRVRJTUU7CisJcmFuZ2UubWluX3JldHJ5ID0gMDsKKwlyYW5nZS5tYXhfcmV0cnkgPSA2NTUzNTsJLyogPz8/ICovCisJcmFuZ2UubWluX3JfdGltZSA9IDA7CisJcmFuZ2UubWF4X3JfdGltZSA9IDY1NTM1ICogMTAwMDsJLyogPz8/ICovCisKKwlpZiAoY29weV90b191c2VyKHJycS0+cG9pbnRlciwgJnJhbmdlLCBzaXplb2YocmFuZ2UpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlUUkFDRV9FWElUKGRldi0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldGl3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqZXJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpbmRleCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJaW50IHNldGluZGV4ID0gcHJpdi0+dHhfa2V5OworCWludCBlbmFibGUgPSBwcml2LT53ZXBfb247CisJaW50IHJlc3RyaWN0ZWQgPSBwcml2LT53ZXBfcmVzdHJpY3Q7CisJdTE2IHhsZW4gPSAwOworCWludCBlcnIgPSAwOworCWNoYXIga2V5YnVmW09SSU5PQ09fTUFYX0tFWV9TSVpFXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCEgcHJpdi0+aGFzX3dlcCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKGVycS0+cG9pbnRlcikgeworCQkvKiBXZSBhY3R1YWxseSBoYXZlIGEga2V5IHRvIHNldCAtIGNoZWNrIGl0cyBsZW5ndGggKi8KKwkJaWYgKGVycS0+bGVuZ3RoID4gTEFSR0VfS0VZX1NJWkUpCisJCQlyZXR1cm4gLUUyQklHOworCisJCWlmICggKGVycS0+bGVuZ3RoID4gU01BTExfS0VZX1NJWkUpICYmICFwcml2LT5oYXNfYmlnX3dlcCApCisJCQlyZXR1cm4gLUUyQklHOworCQkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGtleWJ1ZiwgZXJxLT5wb2ludGVyLCBlcnEtPmxlbmd0aCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChlcnEtPnBvaW50ZXIpIHsKKwkJaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+PSBPUklOT0NPX01BWF9LRVlTKSkKKwkJCWluZGV4ID0gcHJpdi0+dHhfa2V5OworCisJCS8qIEFkanVzdCBrZXkgbGVuZ3RoIHRvIGEgc3VwcG9ydGVkIHZhbHVlICovCisJCWlmIChlcnEtPmxlbmd0aCA+IFNNQUxMX0tFWV9TSVpFKSB7CisJCQl4bGVuID0gTEFSR0VfS0VZX1NJWkU7CisJCX0gZWxzZSBpZiAoZXJxLT5sZW5ndGggPiAwKSB7CisJCQl4bGVuID0gU01BTExfS0VZX1NJWkU7CisJCX0gZWxzZQorCQkJeGxlbiA9IDA7CisKKwkJLyogU3dpdGNoIG9uIFdFUCBpZiBvZmYgKi8KKwkJaWYgKCghZW5hYmxlKSAmJiAoeGxlbiA+IDApKSB7CisJCQlzZXRpbmRleCA9IGluZGV4OworCQkJZW5hYmxlID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEltcG9ydGFudCBub3RlIDogaWYgdGhlIHVzZXIgZG8gIml3Y29uZmlnIGV0aDAgZW5jIG9mZiIsCisJCSAqIHdlIHdpbGwgYXJyaXZlIHRoZXJlIHdpdGggYW4gaW5kZXggb2YgLTEuIFRoaXMgaXMgdmFsaWQKKwkJICogYnV0IG5lZWQgdG8gYmUgdGFrZW4gY2FyZSBvZmYuLi4gSmVhbiBJSSAqLworCQlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49IE9SSU5PQ09fTUFYX0tFWVMpKSB7CisJCQlpZigoaW5kZXggIT0gLTEpIHx8IChlcnEtPmZsYWdzID09IDApKSB7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFNldCB0aGUgaW5kZXggOiBDaGVjayB0aGF0IHRoZSBrZXkgaXMgdmFsaWQgKi8KKwkJCWlmKHByaXYtPmtleXNbaW5kZXhdLmxlbiA9PSAwKSB7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXNldGluZGV4ID0gaW5kZXg7CisJCX0KKwl9CisKKwlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkKKwkJZW5hYmxlID0gMDsKKwlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKQorCQlyZXN0cmljdGVkID0gMDsKKwlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKQorCQlyZXN0cmljdGVkID0gMTsKKworCWlmIChlcnEtPnBvaW50ZXIpIHsKKwkJcHJpdi0+a2V5c1tpbmRleF0ubGVuID0gY3B1X3RvX2xlMTYoeGxlbik7CisJCW1lbXNldChwcml2LT5rZXlzW2luZGV4XS5kYXRhLCAwLAorCQkgICAgICAgc2l6ZW9mKHByaXYtPmtleXNbaW5kZXhdLmRhdGEpKTsKKwkJbWVtY3B5KHByaXYtPmtleXNbaW5kZXhdLmRhdGEsIGtleWJ1ZiwgZXJxLT5sZW5ndGgpOworCX0KKwlwcml2LT50eF9rZXkgPSBzZXRpbmRleDsKKworCS8qIFRyeSBmYXN0IGtleSBjaGFuZ2UgaWYgY29ubmVjdGVkIGFuZCBvbmx5IGtleXMgYXJlIGNoYW5nZWQgKi8KKwlpZiAocHJpdi0+d2VwX29uICYmIGVuYWJsZSAmJiAocHJpdi0+d2VwX3Jlc3RyaWN0ID09IHJlc3RyaWN0ZWQpICYmCisJICAgIG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQllcnIgPSBfX29yaW5vY29faHdfc2V0dXBfd2Vwa2V5cyhwcml2KTsKKwkJLyogTm8gbmVlZCB0byBjb21taXQgaWYgc3VjY2Vzc2Z1bCAqLworCQlnb3RvIG91dDsKKwl9CisKKwlwcml2LT53ZXBfb24gPSBlbmFibGU7CisJcHJpdi0+d2VwX3Jlc3RyaWN0ID0gcmVzdHJpY3RlZDsKKworIG91dDoKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldGl3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqZXJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBpbmRleCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJdTE2IHhsZW4gPSAwOworCWNoYXIga2V5YnVmW09SSU5PQ09fTUFYX0tFWV9TSVpFXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCEgcHJpdi0+aGFzX3dlcCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49IE9SSU5PQ09fTUFYX0tFWVMpKQorCQlpbmRleCA9IHByaXYtPnR4X2tleTsKKworCWVycS0+ZmxhZ3MgPSAwOworCWlmICghIHByaXYtPndlcF9vbikKKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7CisJZXJxLT5mbGFncyB8PSBpbmRleCArIDE7CisKKwlpZiAocHJpdi0+d2VwX3Jlc3RyaWN0KQorCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9SRVNUUklDVEVEOworCWVsc2UKKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfT1BFTjsKKworCXhsZW4gPSBsZTE2X3RvX2NwdShwcml2LT5rZXlzW2luZGV4XS5sZW4pOworCisJZXJxLT5sZW5ndGggPSB4bGVuOworCisJbWVtY3B5KGtleWJ1ZiwgcHJpdi0+a2V5c1tpbmRleF0uZGF0YSwgT1JJTk9DT19NQVhfS0VZX1NJWkUpOworCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCWlmIChlcnEtPnBvaW50ZXIpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihlcnEtPnBvaW50ZXIsIGtleWJ1ZiwgeGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldGVzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqZXJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWNoYXIgZXNzaWRidWZbSVdfRVNTSURfTUFYX1NJWkUrMV07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIE5vdGUgOiBFU1NJRCBpcyBpZ25vcmVkIGluIEFkLUhvYyBkZW1vIG1vZGUsIGJ1dCB3ZSBjYW4gc2V0IGl0CisJICogYW55d2F5Li4uIC0gSmVhbiBJSSAqLworCisJbWVtc2V0KCZlc3NpZGJ1ZiwgMCwgc2l6ZW9mKGVzc2lkYnVmKSk7CisKKwlpZiAoZXJxLT5mbGFncykgeworCQlpZiAoZXJxLT5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSkKKwkJCXJldHVybiAtRTJCSUc7CisJCQorCQlpZiAoY29weV9mcm9tX3VzZXIoJmVzc2lkYnVmLCBlcnEtPnBvaW50ZXIsIGVycS0+bGVuZ3RoKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWVzc2lkYnVmW2VycS0+bGVuZ3RoXSA9ICdcMCc7CisJfQorCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwltZW1jcHkocHJpdi0+ZGVzaXJlZF9lc3NpZCwgZXNzaWRidWYsIHNpemVvZihwcml2LT5kZXNpcmVkX2Vzc2lkKSk7CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKmVycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljaGFyIGVzc2lkYnVmW0lXX0VTU0lEX01BWF9TSVpFKzFdOworCWludCBhY3RpdmU7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCVRSQUNFX0VOVEVSKGRldi0+bmFtZSk7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCWVyciA9IG9yaW5vY29faHdfZ2V0X2Vzc2lkKHByaXYsICZhY3RpdmUsIGVzc2lkYnVmKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfSBlbHNlIHsKKwkJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCQlyZXR1cm4gLUVCVVNZOworCQltZW1jcHkoZXNzaWRidWYsIHByaXYtPmRlc2lyZWRfZXNzaWQsIHNpemVvZihlc3NpZGJ1ZikpOworCQlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCX0KKworCWVycS0+ZmxhZ3MgPSAxOworCWVycS0+bGVuZ3RoID0gc3RybGVuKGVzc2lkYnVmKSArIDE7CisJaWYgKGVycS0+cG9pbnRlcikKKwkJaWYgKGNvcHlfdG9fdXNlcihlcnEtPnBvaW50ZXIsIGVzc2lkYnVmLCBlcnEtPmxlbmd0aCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCVRSQUNFX0VYSVQoZGV2LT5uYW1lKTsKKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldG5pY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICpucnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJY2hhciBuaWNrYnVmW0lXX0VTU0lEX01BWF9TSVpFKzFdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobnJxLT5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSkKKwkJcmV0dXJuIC1FMkJJRzsKKworCW1lbXNldChuaWNrYnVmLCAwLCBzaXplb2Yobmlja2J1ZikpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKG5pY2tidWYsIG5ycS0+cG9pbnRlciwgbnJxLT5sZW5ndGgpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW5pY2tidWZbbnJxLT5sZW5ndGhdID0gJ1wwJzsKKwkKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCW1lbWNweShwcml2LT5uaWNrLCBuaWNrYnVmLCBzaXplb2YocHJpdi0+bmljaykpOworCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0bmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKm5ycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljaGFyIG5pY2tidWZbSVdfRVNTSURfTUFYX1NJWkUrMV07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJbWVtY3B5KG5pY2tidWYsIHByaXYtPm5pY2ssIElXX0VTU0lEX01BWF9TSVpFKzEpOworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlucnEtPmxlbmd0aCA9IHN0cmxlbihuaWNrYnVmKSsxOworCisJaWYgKGNvcHlfdG9fdXNlcihucnEtPnBvaW50ZXIsIG5pY2tidWYsIHNpemVvZihuaWNrYnVmKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19mcmVxICpmcnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGNoYW4gPSAtMTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogV2UgY2FuIG9ubHkgdXNlIHRoaXMgaW4gQWQtSG9jIGRlbW8gbW9kZSB0byBzZXQgdGhlIG9wZXJhdGluZworCSAqIGZyZXF1ZW5jeSwgb3IgaW4gSUJTUyBtb2RlIHRvIHNldCB0aGUgZnJlcXVlbmN5IHdoZXJlIHRoZSBJQlNTCisJICogd2lsbCBiZSBjcmVhdGVkIC0gSmVhbiBJSSAqLworCWlmIChwcml2LT5pd19tb2RlICE9IElXX01PREVfQURIT0MpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICggKGZycS0+ZSA9PSAwKSAmJiAoZnJxLT5tIDw9IDEwMDApICkgeworCQkvKiBTZXR0aW5nIGJ5IGNoYW5uZWwgbnVtYmVyICovCisJCWNoYW4gPSBmcnEtPm07CisJfSBlbHNlIHsKKwkJLyogU2V0dGluZyBieSBmcmVxdWVuY3kgLSBzZWFyY2ggdGhlIHRhYmxlICovCisJCWludCBtdWx0ID0gMTsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8ICg2IC0gZnJxLT5lKTsgaSsrKQorCQkJbXVsdCAqPSAxMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0NIQU5ORUxTOyBpKyspCisJCQlpZiAoZnJxLT5tID09IChjaGFubmVsX2ZyZXF1ZW5jeVtpXSAqIG11bHQpKQorCQkJCWNoYW4gPSBpKzE7CisJfQorCisJaWYgKCAoY2hhbiA8IDEpIHx8IChjaGFuID4gTlVNX0NIQU5ORUxTKSB8fAorCSAgICAgISAocHJpdi0+Y2hhbm5lbF9tYXNrICYgKDEgPDwgKGNoYW4tMSkpICkgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCXByaXYtPmNoYW5uZWwgPSBjaGFuOworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldHNlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpzcnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCXUxNiB2YWw7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFwcml2LT5oYXNfc2Vuc2l0aXZpdHkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLAorCQkJCSAgSEVSTUVTX1JJRF9DTkZTWVNURU1TQ0FMRSwgJnZhbCk7CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlzcnEtPnZhbHVlID0gdmFsOworCXNycS0+Zml4ZWQgPSAwOyAvKiBhdXRvICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldHNlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpzcnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHZhbCA9IHNycS0+dmFsdWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghcHJpdi0+aGFzX3NlbnNpdGl2aXR5KQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoKHZhbCA8IDEpIHx8ICh2YWwgPiAzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisJcHJpdi0+YXBfZGVuc2l0eSA9IHZhbDsKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpycnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHZhbCA9IHJycS0+dmFsdWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChycnEtPmRpc2FibGVkKQorCQl2YWwgPSAyMzQ3OworCisJaWYgKCAodmFsIDwgMCkgfHwgKHZhbCA+IDIzNDcpICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXByaXYtPnJ0c190aHJlc2ggPSB2YWw7CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKmZycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAocHJpdi0+aGFzX213bykgeworCQlpZiAoZnJxLT5kaXNhYmxlZCkKKwkJCXByaXYtPm13b19yb2J1c3QgPSAwOworCQllbHNlIHsKKwkJCWlmIChmcnEtPmZpeGVkKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBGaXhlZCBmcmFnbWVudGF0aW9uIGlzICIKKwkJCQkgICAgICAgIm5vdCBzdXBwb3J0ZWQgb24gdGhpcyBmaXJtd2FyZS4gIgorCQkJCSAgICAgICAiVXNpbmcgTVdPIHJvYnVzdCBpbnN0ZWFkLlxuIiwgZGV2LT5uYW1lKTsKKwkJCXByaXYtPm13b19yb2J1c3QgPSAxOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGZycS0+ZGlzYWJsZWQpCisJCQlwcml2LT5mcmFnX3RocmVzaCA9IDIzNDY7CisJCWVsc2UgeworCQkJaWYgKCAoZnJxLT52YWx1ZSA8IDI1NikgfHwgKGZycS0+dmFsdWUgPiAyMzQ2KSApCisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCQlwcml2LT5mcmFnX3RocmVzaCA9IGZycS0+dmFsdWUgJiB+MHgxOyAvKiBtdXN0IGJlIGV2ZW4gKi8KKwkJfQorCX0KKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKmZycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVyciA9IDA7CisJdTE2IHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisJCisJaWYgKHByaXYtPmhhc19td28pIHsKKwkJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgSEVSTUVTX1JJRF9DTkZNV09ST0JVU1RfQUdFUkUsCisJCQkJCSAgJnZhbCk7CisJCWlmIChlcnIpCisJCQl2YWwgPSAwOworCisJCWZycS0+dmFsdWUgPSB2YWwgPyAyMzQ3IDogMDsKKwkJZnJxLT5kaXNhYmxlZCA9ICEgdmFsOworCQlmcnEtPmZpeGVkID0gMDsKKwl9IGVsc2UgeworCQllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZGUkFHTUVOVEFUSU9OVEhSRVNIT0xELAorCQkJCQkgICZ2YWwpOworCQlpZiAoZXJyKQorCQkJdmFsID0gMDsKKworCQlmcnEtPnZhbHVlID0gdmFsOworCQlmcnEtPmRpc2FibGVkID0gKHZhbCA+PSAyMzQ2KTsKKwkJZnJxLT5maXhlZCA9IDE7CisJfQorCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwkKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKnJycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyID0gMDsKKwlpbnQgcmF0ZW1vZGUgPSAtMTsKKwlpbnQgYml0cmF0ZTsgLyogMTAwcyBvZiBraWxvYml0cyAqLworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJLyogQXMgdGhlIHVzZXIgc3BhY2UgZG9lc24ndCBrbm93IG91ciBoaWdoZXN0IHJhdGUsIGl0IHVzZXMgLTEKKwkgKiB0byBhc2sgdXMgdG8gc2V0IHRoZSBoaWdoZXN0IHJhdGUuICBUZXN0IGl0IHVzaW5nICJpd2NvbmZpZworCSAqIGV0aFggcmF0ZSBhdXRvIiAtIEplYW4gSUkgKi8KKwlpZiAocnJxLT52YWx1ZSA9PSAtMSkKKwkJYml0cmF0ZSA9IDExMDsKKwllbHNlIHsKKwkJaWYgKHJycS0+dmFsdWUgJSAxMDAwMDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYml0cmF0ZSA9IHJycS0+dmFsdWUgLyAxMDAwMDA7CisJfQorCisJaWYgKCAoYml0cmF0ZSAhPSAxMCkgJiYgKGJpdHJhdGUgIT0gMjApICYmCisJICAgICAoYml0cmF0ZSAhPSA1NSkgJiYgKGJpdHJhdGUgIT0gMTEwKSApCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IEJJVFJBVEVfVEFCTEVfU0laRTsgaSsrKQorCQlpZiAoIChiaXRyYXRlX3RhYmxlW2ldLmJpdHJhdGUgPT0gYml0cmF0ZSkgJiYKKwkJICAgICAoYml0cmF0ZV90YWJsZVtpXS5hdXRvbWF0aWMgPT0gISBycnEtPmZpeGVkKSApIHsKKwkJCXJhdGVtb2RlID0gaTsKKwkJCWJyZWFrOworCQl9CisJCisJaWYgKHJhdGVtb2RlID09IC0xKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCXByaXYtPmJpdHJhdGVtb2RlID0gcmF0ZW1vZGU7CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wYXJhbSAqcnJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKwlpbnQgcmF0ZW1vZGU7CisJaW50IGk7CisJdTE2IHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlyYXRlbW9kZSA9IHByaXYtPmJpdHJhdGVtb2RlOworCisJQlVHX09OKChyYXRlbW9kZSA8IDApIHx8IChyYXRlbW9kZSA+PSBCSVRSQVRFX1RBQkxFX1NJWkUpKTsKKworCXJycS0+dmFsdWUgPSBiaXRyYXRlX3RhYmxlW3JhdGVtb2RlXS5iaXRyYXRlICogMTAwMDAwOworCXJycS0+Zml4ZWQgPSAhIGJpdHJhdGVfdGFibGVbcmF0ZW1vZGVdLmF1dG9tYXRpYzsKKwlycnEtPmRpc2FibGVkID0gMDsKKworCS8qIElmIHRoZSBpbnRlcmZhY2UgaXMgcnVubmluZyB3ZSB0cnkgdG8gZmluZCBtb3JlIGFib3V0IHRoZQorCSAgIGN1cnJlbnQgbW9kZSAqLworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgSEVSTUVTX1JJRF9DVVJSRU5UVFhSQVRFLCAmdmFsKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCQkKKwkJc3dpdGNoIChwcml2LT5maXJtd2FyZV90eXBlKSB7CisJCWNhc2UgRklSTVdBUkVfVFlQRV9BR0VSRTogLyogTHVjZW50IHN0eWxlIHJhdGUgKi8KKwkJCS8qIE5vdGUgOiBpbiBMdWNlbnQgZmlybXdhcmUsIHRoZSByZXR1cm4gdmFsdWUgb2YKKwkJCSAqIEhFUk1FU19SSURfQ1VSUkVOVFRYUkFURSBpcyB0aGUgYml0cmF0ZSBpbiBNYi9zLAorCQkJICogYW5kIHRoZXJlZm9yZSBpcyB0b3RhbGx5IGRpZmZlcmVudCBmcm9tIHRoZQorCQkJICogZW5jb2Rpbmcgb2YgSEVSTUVTX1JJRF9DTkZUWFJBVEVDT05UUk9MLgorCQkJICogRG9uJ3QgZm9yZ2V0IHRoYXQgNk1iL3MgaXMgcmVhbGx5IDUuNU1iL3MgKi8KKwkJCWlmICh2YWwgPT0gNikKKwkJCQlycnEtPnZhbHVlID0gNTUwMDAwMDsKKwkJCWVsc2UKKwkJCQlycnEtPnZhbHVlID0gdmFsICogMTAwMDAwMDsKKwkJCWJyZWFrOworCQljYXNlIEZJUk1XQVJFX1RZUEVfSU5URVJTSUw6IC8qIEludGVyc2lsIHN0eWxlIHJhdGUgKi8KKwkJY2FzZSBGSVJNV0FSRV9UWVBFX1NZTUJPTDogLyogU3ltYm9sIHN0eWxlIHJhdGUgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBCSVRSQVRFX1RBQkxFX1NJWkU7IGkrKykKKwkJCQlpZiAoYml0cmF0ZV90YWJsZVtpXS5pbnRlcnNpbF90eHJhdGVjdHJsID09IHZhbCkgeworCQkJCQlyYXRlbW9kZSA9IGk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCWlmIChpID49IEJJVFJBVEVfVEFCTEVfU0laRSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5hYmxlIHRvIGRldGVybWluZSBjdXJyZW50IGJpdHJhdGUgKDB4JTA0aHgpXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUsIHZhbCk7CisKKwkJCXJycS0+dmFsdWUgPSBiaXRyYXRlX3RhYmxlW3JhdGVtb2RlXS5iaXRyYXRlICogMTAwMDAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJfQorCX0KKworIG91dDoKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldHBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wYXJhbSAqcHJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChwcnEtPmRpc2FibGVkKSB7CisJCXByaXYtPnBtX29uID0gMDsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKHBycS0+ZmxhZ3MgJiBJV19QT1dFUl9NT0RFKSB7CisJCWNhc2UgSVdfUE9XRVJfVU5JQ0FTVF9SOgorCQkJcHJpdi0+cG1fbWNhc3QgPSAwOworCQkJcHJpdi0+cG1fb24gPSAxOworCQkJYnJlYWs7CisJCWNhc2UgSVdfUE9XRVJfQUxMX1I6CisJCQlwcml2LT5wbV9tY2FzdCA9IDE7CisJCQlwcml2LT5wbV9vbiA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBJV19QT1dFUl9PTjoKKwkJCS8qIE5vIGZsYWdzIDogYnV0IHdlIG1heSBoYXZlIGEgdmFsdWUgLSBKZWFuIElJICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVyciA9IC1FSU5WQUw7CisJCX0KKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCQkKKwkJaWYgKHBycS0+ZmxhZ3MgJiBJV19QT1dFUl9USU1FT1VUKSB7CisJCQlwcml2LT5wbV9vbiA9IDE7CisJCQlwcml2LT5wbV90aW1lb3V0ID0gcHJxLT52YWx1ZSAvIDEwMDA7CisJCX0KKwkJaWYgKHBycS0+ZmxhZ3MgJiBJV19QT1dFUl9QRVJJT0QpIHsKKwkJCXByaXYtPnBtX29uID0gMTsKKwkJCXByaXYtPnBtX3BlcmlvZCA9IHBycS0+dmFsdWUgLyAxMDAwOworCQl9CisJCS8qIEl0J3MgdmFsaWQgdG8gbm90IGhhdmUgYSB2YWx1ZSBpZiB3ZSBhcmUganVzdCB0b2dnbGluZworCQkgKiB0aGUgZmxhZ3MuLi4gSmVhbiBJSSAqLworCQlpZighcHJpdi0+cG1fb24pIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQkJCQorCX0KKworIG91dDoKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldHBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wYXJhbSAqcHJxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlpbnQgZXJyID0gMDsKKwl1MTYgZW5hYmxlLCBwZXJpb2QsIHRpbWVvdXQsIG1jYXN0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKwkKKwllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZQTUVOQUJMRUQsICZlbmFibGUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJICBIRVJNRVNfUklEX0NORk1BWFNMRUVQRFVSQVRJT04sICZwZXJpb2QpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsIEhFUk1FU19SSURfQ05GUE1IT0xET1ZFUkRVUkFUSU9OLCAmdGltZW91dCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBoZXJtZXNfcmVhZF93b3JkcmVjKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZNVUxUSUNBU1RSRUNFSVZFLCAmbWNhc3QpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJcHJxLT5kaXNhYmxlZCA9ICFlbmFibGU7CisJLyogTm90ZSA6IGJ5IGRlZmF1bHQsIGRpc3BsYXkgdGhlIHBlcmlvZCAqLworCWlmICgocHJxLT5mbGFncyAmIElXX1BPV0VSX1RZUEUpID09IElXX1BPV0VSX1RJTUVPVVQpIHsKKwkJcHJxLT5mbGFncyA9IElXX1BPV0VSX1RJTUVPVVQ7CisJCXBycS0+dmFsdWUgPSB0aW1lb3V0ICogMTAwMDsKKwl9IGVsc2UgeworCQlwcnEtPmZsYWdzID0gSVdfUE9XRVJfUEVSSU9EOworCQlwcnEtPnZhbHVlID0gcGVyaW9kICogMTAwMDsKKwl9CisJaWYgKG1jYXN0KQorCQlwcnEtPmZsYWdzIHw9IElXX1BPV0VSX0FMTF9SOworCWVsc2UKKwkJcHJxLT5mbGFncyB8PSBJV19QT1dFUl9VTklDQVNUX1I7CisKKyBvdXQ6CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRyZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKnJycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVyciA9IDA7CisJdTE2IHNob3J0X2xpbWl0LCBsb25nX2xpbWl0LCBsaWZldGltZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisJCisJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsIEhFUk1FU19SSURfU0hPUlRSRVRSWUxJTUlULAorCQkJCSAgJnNob3J0X2xpbWl0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IGhlcm1lc19yZWFkX3dvcmRyZWMoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0xPTkdSRVRSWUxJTUlULAorCQkJCSAgJmxvbmdfbGltaXQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gaGVybWVzX3JlYWRfd29yZHJlYyhodywgVVNFUl9CQVAsIEhFUk1FU19SSURfTUFYVFJBTlNNSVRMSUZFVElNRSwKKwkJCQkgICZsaWZldGltZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlycnEtPmRpc2FibGVkID0gMDsJCS8qIENhbid0IGJlIGRpc2FibGVkICovCisKKwkvKiBOb3RlIDogYnkgZGVmYXVsdCwgZGlzcGxheSB0aGUgcmV0cnkgbnVtYmVyICovCisJaWYgKChycnEtPmZsYWdzICYgSVdfUkVUUllfVFlQRSkgPT0gSVdfUkVUUllfTElGRVRJTUUpIHsKKwkJcnJxLT5mbGFncyA9IElXX1JFVFJZX0xJRkVUSU1FOworCQlycnEtPnZhbHVlID0gbGlmZXRpbWUgKiAxMDAwOwkvKiA/Pz8gKi8KKwl9IGVsc2UgeworCQkvKiBCeSBkZWZhdWx0LCBkaXNwbGF5IHRoZSBtaW4gbnVtYmVyICovCisJCWlmICgocnJxLT5mbGFncyAmIElXX1JFVFJZX01BWCkpIHsKKwkJCXJycS0+ZmxhZ3MgPSBJV19SRVRSWV9MSU1JVCB8IElXX1JFVFJZX01BWDsKKwkJCXJycS0+dmFsdWUgPSBsb25nX2xpbWl0OworCQl9IGVsc2UgeworCQkJcnJxLT5mbGFncyA9IElXX1JFVFJZX0xJTUlUOworCQkJcnJxLT52YWx1ZSA9IHNob3J0X2xpbWl0OworCQkJaWYoc2hvcnRfbGltaXQgIT0gbG9uZ19saW1pdCkKKwkJCQlycnEtPmZsYWdzIHw9IElXX1JFVFJZX01JTjsKKwkJfQorCX0KKworIG91dDoKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldGlic3Nwb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd3JlcSAqd3JxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCB2YWwgPSAqKCAoaW50ICopIHdycS0+dS5uYW1lICk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJcHJpdi0+aWJzc19wb3J0ID0gdmFsIDsKKworCS8qIEFjdHVhbGx5IHVwZGF0ZSB0aGUgbW9kZSB3ZSBhcmUgdXNpbmcgKi8KKwlzZXRfcG9ydF90eXBlKHByaXYpOworCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldGlic3Nwb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd3JlcSAqd3JxKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCAqdmFsID0gKGludCAqKXdycS0+dS5uYW1lOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCSp2YWwgPSBwcml2LT5pYnNzX3BvcnQ7CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0cG9ydDMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3cmVxICp3cnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHZhbCA9ICooIChpbnQgKikgd3JxLT51Lm5hbWUgKTsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgMDogLyogVHJ5IHRvIGRvIElFRUUgYWQtaG9jIG1vZGUgKi8KKwkJaWYgKCEgcHJpdi0+aGFzX2lic3MpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlwcml2LT5wcmVmZXJfcG9ydDMgPSAwOworCQkJCisJCWJyZWFrOworCisJY2FzZSAxOiAvKiBUcnkgdG8gZG8gTHVjZW50IHByb3ByaWV0YXJ5IGFkLWhvYyBtb2RlICovCisJCWlmICghIHByaXYtPmhhc19wb3J0MykgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXByaXYtPnByZWZlcl9wb3J0MyA9IDE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwl9CisKKwlpZiAoISBlcnIpCisJCS8qIEFjdHVhbGx5IHVwZGF0ZSB0aGUgbW9kZSB3ZSBhcmUgdXNpbmcgKi8KKwkJc2V0X3BvcnRfdHlwZShwcml2KTsKKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0cG9ydDMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3cmVxICp3cnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50ICp2YWwgPSAoaW50ICopd3JxLT51Lm5hbWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJKnZhbCA9IHByaXYtPnByZWZlcl9wb3J0MzsKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKiBTcHkgaXMgdXNlZCBmb3IgbGluayBxdWFsaXR5L3N0cmVuZ3RoIG1lYXN1cmVtZW50cyBpbiBBZC1Ib2MgbW9kZQorICogSmVhbiBJSSAqLworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldHNweShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKnNycSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgYWRkcmVzc1tJV19NQVhfU1BZXTsKKwlpbnQgbnVtYmVyID0gc3JxLT5sZW5ndGg7CisJaW50IGk7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIENoZWNrIHRoZSBudW1iZXIgb2YgYWRkcmVzc2VzICovCisJaWYgKG51bWJlciA+IElXX01BWF9TUFkpCisJCXJldHVybiAtRTJCSUc7CisKKwkvKiBHZXQgdGhlIGRhdGEgaW4gdGhlIGRyaXZlciAqLworCWlmIChzcnEtPnBvaW50ZXIpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGFkZHJlc3MsIHNycS0+cG9pbnRlciwKKwkJCQkgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSAqIG51bWJlcikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKiBNYWtlIHN1cmUgbm9ib2R5IG1lc3Mgd2l0aCB0aGUgc3RydWN0dXJlIHdoaWxlIHdlIGRvICovCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBvcmlub2NvX2xvY2soKSBkb2Vzbid0IGRpc2FibGUgaW50ZXJydXB0cywgc28gbWFrZSBzdXJlIHRoZQorCSAqIGludGVycnVwdCByeCBwYXRoIGRvbid0IGdldCBjb25mdXNlZCB3aGlsZSB3ZSBjb3B5ICovCisJcHJpdi0+c3B5X251bWJlciA9IDA7CisKKwlpZiAobnVtYmVyID4gMCkgeworCQkvKiBFeHRyYWN0IHRoZSBhZGRyZXNzZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IG51bWJlcjsgaSsrKQorCQkJbWVtY3B5KHByaXYtPnNweV9hZGRyZXNzW2ldLCBhZGRyZXNzW2ldLnNhX2RhdGEsCisJCQkgICAgICAgRVRIX0FMRU4pOworCQkvKiBSZXNldCBzdGF0cyAqLworCQltZW1zZXQocHJpdi0+c3B5X3N0YXQsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpICogSVdfTUFYX1NQWSk7CisJCS8qIFNldCBudW1iZXIgb2YgYWRkcmVzc2VzICovCisJCXByaXYtPnNweV9udW1iZXIgPSBudW1iZXI7CisJfQorCisJLyogTm93LCBsZXQgdGhlIG90aGVycyBwbGF5ICovCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRzcHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICpzcnEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNvY2thZGRyIGFkZHJlc3NbSVdfTUFYX1NQWV07CisJc3RydWN0IGl3X3F1YWxpdHkgc3B5X3N0YXRbSVdfTUFYX1NQWV07CisJaW50IG51bWJlcjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwludW1iZXIgPSBwcml2LT5zcHlfbnVtYmVyOworCWlmICgobnVtYmVyID4gMCkgJiYgKHNycS0+cG9pbnRlcikpIHsKKwkJLyogQ3JlYXRlIGFkZHJlc3Mgc3RydWN0ICovCisJCWZvciAoaSA9IDA7IGkgPCBudW1iZXI7IGkrKykgeworCQkJbWVtY3B5KGFkZHJlc3NbaV0uc2FfZGF0YSwgcHJpdi0+c3B5X2FkZHJlc3NbaV0sCisJCQkgICAgICAgRVRIX0FMRU4pOworCQkJYWRkcmVzc1tpXS5zYV9mYW1pbHkgPSBBRl9VTklYOworCQl9CisJCS8qIENvcHkgc3RhdHMgKi8KKwkJLyogSW4gdGhlb3J5LCB3ZSBzaG91bGQgZGlzYWJsZSBpcnFzIHdoaWxlIGNvcHlpbmcgdGhlIHN0YXRzCisJCSAqIGJlY2F1c2UgdGhlIHJ4IHBhdGggbWlnaHQgdXBkYXRlIGl0IGluIHRoZSBtaWRkbGUuLi4KKwkJICogQmFoLCB3aG8gY2FyZSA/IC0gSmVhbiBJSSAqLworCQltZW1jcHkoJnNweV9zdGF0LCBwcml2LT5zcHlfc3RhdCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkgKiBJV19NQVhfU1BZKTsKKwkJZm9yIChpPTA7IGkgPCBudW1iZXI7IGkrKykKKwkJCXByaXYtPnNweV9zdGF0W2ldLnVwZGF0ZWQgPSAwOworCX0KKworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwkvKiBQdXNoIHN0dWZmIHRvIHVzZXIgc3BhY2UgKi8KKwlzcnEtPmxlbmd0aCA9IG51bWJlcjsKKwlpZihjb3B5X3RvX3VzZXIoc3JxLT5wb2ludGVyLCBhZGRyZXNzLAorCQkJIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICogbnVtYmVyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYoY29weV90b191c2VyKHNycS0+cG9pbnRlciArIChzaXplb2Yoc3RydWN0IHNvY2thZGRyKSpudW1iZXIpLAorCQkJJnNweV9zdGF0LCBzaXplb2Yoc3RydWN0IGl3X3F1YWxpdHkpICogbnVtYmVyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorb3Jpbm9jb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJxOworCWludCBlcnIgPSAwOworCWludCB0bXA7CisJaW50IGNoYW5nZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlUUkFDRV9FTlRFUihkZXYtPm5hbWUpOworCisJLyogSW4gdGhlb3J5LCB3ZSBjb3VsZCBhbGxvdyBtb3N0IG9mIHRoZSB0aGUgU0VUIHN0dWZmIHRvIGJlCisJICogZG9uZS4gSW4gcHJhY3RpY2UsIHRoZSBsYXBzZSBvZiB0aW1lIGF0IHN0YXJ0dXAgd2hlbiB0aGUKKwkgKiBjYXJkIGlzIG5vdCByZWFkeSBpcyB2ZXJ5IHNob3J0LCBzbyB3aHkgYm90aGVyLi4uICBOb3RlCisJICogdGhhdCBuZXRpZl9kZXZpY2VfcHJlc2VudCBpcyBkaWZmZXJlbnQgZnJvbSB1cC9kb3duCisJICogKGlmY29uZmlnKSwgd2hlbiB0aGUgZGV2aWNlIGlzIG5vdCB5ZXQgdXAsIGl0IGlzIHVzdWFsbHkKKwkgKiBhbHJlYWR5IHJlYWR5Li4uICBKZWFuIElJICovCisJaWYgKCEgbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0dJV05BTUU6CisJCXN0cmNweSh3cnEtPnUubmFtZSwgIklFRUUgODAyLjExLURTIik7CisJCWJyZWFrOworCQkKKwljYXNlIFNJT0NHSVdBUDoKKwkJd3JxLT51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCQllcnIgPSBvcmlub2NvX2h3X2dldF9ic3NpZChwcml2LCB3cnEtPnUuYXBfYWRkci5zYV9kYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHSVdSQU5HRToKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRpd3JhbmdlKGRldiwgJndycS0+dS5kYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTSVdNT0RFOgorCQlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJCXJldHVybiAtRUJVU1k7CisJCXN3aXRjaCAod3JxLT51Lm1vZGUpIHsKKwkJY2FzZSBJV19NT0RFX0FESE9DOgorCQkJaWYgKCEgKHByaXYtPmhhc19pYnNzIHx8IHByaXYtPmhhc19wb3J0MykgKQorCQkJCWVyciA9IC1FSU5WQUw7CisJCQllbHNlIHsKKwkJCQlwcml2LT5pd19tb2RlID0gSVdfTU9ERV9BREhPQzsKKwkJCQljaGFuZ2VkID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJCXByaXYtPml3X21vZGUgPSBJV19NT0RFX0lORlJBOworCQkJY2hhbmdlZCA9IDE7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXNldF9wb3J0X3R5cGUocHJpdik7CisJCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lXTU9ERToKKwkJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCQlyZXR1cm4gLUVCVVNZOworCQl3cnEtPnUubW9kZSA9IHByaXYtPml3X21vZGU7CisJCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0lXRU5DT0RFOgorCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldGl3ZW5jb2RlKGRldiwgJndycS0+dS5lbmNvZGluZyk7CisJCWlmICghIGVycikKKwkJCWNoYW5nZWQgPSAxOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dJV0VOQ09ERToKKwkJaWYgKCEgY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJZXJyID0gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKworCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldGl3ZW5jb2RlKGRldiwgJndycS0+dS5lbmNvZGluZyk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0lXRVNTSUQ6CisJCWVyciA9IG9yaW5vY29faW9jdGxfc2V0ZXNzaWQoZGV2LCAmd3JxLT51LmVzc2lkKTsKKwkJaWYgKCEgZXJyKQorCQkJY2hhbmdlZCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lXRVNTSUQ6CisJCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0ZXNzaWQoZGV2LCAmd3JxLT51LmVzc2lkKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTSVdOSUNLTjoKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRuaWNrKGRldiwgJndycS0+dS5kYXRhKTsKKwkJaWYgKCEgZXJyKQorCQkJY2hhbmdlZCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lXTklDS046CisJCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0bmljayhkZXYsICZ3cnEtPnUuZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lXRlJFUToKKwkJdG1wID0gb3Jpbm9jb19od19nZXRfZnJlcShwcml2KTsKKwkJaWYgKHRtcCA8IDApIHsKKwkJCWVyciA9IHRtcDsKKwkJfSBlbHNlIHsKKwkJCXdycS0+dS5mcmVxLm0gPSB0bXA7CisJCQl3cnEtPnUuZnJlcS5lID0gMTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU0lPQ1NJV0ZSRVE6CisJCWVyciA9IG9yaW5vY29faW9jdGxfc2V0ZnJlcShkZXYsICZ3cnEtPnUuZnJlcSk7CisJCWlmICghIGVycikKKwkJCWNoYW5nZWQgPSAxOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dJV1NFTlM6CisJCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0c2VucyhkZXYsICZ3cnEtPnUuc2Vucyk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0lXU0VOUzoKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRzZW5zKGRldiwgJndycS0+dS5zZW5zKTsKKwkJaWYgKCEgZXJyKQorCQkJY2hhbmdlZCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lXUlRTOgorCQl3cnEtPnUucnRzLnZhbHVlID0gcHJpdi0+cnRzX3RocmVzaDsKKwkJd3JxLT51LnJ0cy5kaXNhYmxlZCA9ICh3cnEtPnUucnRzLnZhbHVlID09IDIzNDcpOworCQl3cnEtPnUucnRzLmZpeGVkID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTSVdSVFM6CisJCWVyciA9IG9yaW5vY29faW9jdGxfc2V0cnRzKGRldiwgJndycS0+dS5ydHMpOworCQlpZiAoISBlcnIpCisJCQljaGFuZ2VkID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTSVdGUkFHOgorCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldGZyYWcoZGV2LCAmd3JxLT51LmZyYWcpOworCQlpZiAoISBlcnIpCisJCQljaGFuZ2VkID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHSVdGUkFHOgorCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldGZyYWcoZGV2LCAmd3JxLT51LmZyYWcpOworCQlicmVhazsKKworCWNhc2UgU0lPQ1NJV1JBVEU6CisJCWVyciA9IG9yaW5vY29faW9jdGxfc2V0cmF0ZShkZXYsICZ3cnEtPnUuYml0cmF0ZSk7CisJCWlmICghIGVycikKKwkJCWNoYW5nZWQgPSAxOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dJV1JBVEU6CisJCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0cmF0ZShkZXYsICZ3cnEtPnUuYml0cmF0ZSk7CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0lXUE9XRVI6CisJCWVyciA9IG9yaW5vY29faW9jdGxfc2V0cG93ZXIoZGV2LCAmd3JxLT51LnBvd2VyKTsKKwkJaWYgKCEgZXJyKQorCQkJY2hhbmdlZCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTSU9DR0lXUE9XRVI6CisJCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0cG93ZXIoZGV2LCAmd3JxLT51LnBvd2VyKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHSVdUWFBPVzoKKwkJLyogVGhlIGNhcmQgb25seSBzdXBwb3J0cyBvbmUgdHggcG93ZXIsIHNvIHRoaXMgaXMgZWFzeSAqLworCQl3cnEtPnUudHhwb3dlci52YWx1ZSA9IDE1OyAvKiBkQm0gKi8KKwkJd3JxLT51LnR4cG93ZXIuZml4ZWQgPSAxOworCQl3cnEtPnUudHhwb3dlci5kaXNhYmxlZCA9IDA7CisJCXdycS0+dS50eHBvd2VyLmZsYWdzID0gSVdfVFhQT1dfREJNOworCQlicmVhazsKKworCWNhc2UgU0lPQ1NJV1JFVFJZOgorCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NHSVdSRVRSWToKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRyZXRyeShkZXYsICZ3cnEtPnUucmV0cnkpOworCQlicmVhazsKKworCWNhc2UgU0lPQ1NJV1NQWToKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRzcHkoZGV2LCAmd3JxLT51LmRhdGEpOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dJV1NQWToKKwkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRzcHkoZGV2LCAmd3JxLT51LmRhdGEpOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dJV1BSSVY6CisJCWlmICh3cnEtPnUuZGF0YS5wb2ludGVyKSB7CisJCQlzdHJ1Y3QgaXdfcHJpdl9hcmdzIHByaXZ0YWJbXSA9IHsKKwkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4MCwgMCwgMCwgImZvcmNlX3Jlc2V0IiB9LAorCQkJCXsgU0lPQ0lXRklSU1RQUklWICsgMHgxLCAwLCAwLCAiY2FyZF9yZXNldCIgfSwKKwkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4MiwKKwkJCQkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkJCSAgMCwgInNldF9wb3J0MyIgfSwKKwkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4MywgMCwKKwkJCQkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkJCSAgImdldF9wb3J0MyIgfSwKKwkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4NCwKKwkJCQkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkJCSAgMCwgInNldF9wcmVhbWJsZSIgfSwKKwkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4NSwgMCwKKwkJCQkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkJCSAgImdldF9wcmVhbWJsZSIgfSwKKwkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4NiwKKwkJCQkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkJCSAgMCwgInNldF9pYnNzcG9ydCIgfSwKKwkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4NywgMCwKKwkJCQkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCQkJCSAgImdldF9pYnNzcG9ydCIgfSwKKwkJCQl7IFNJT0NJV0xBU1RQUklWLCAwLCAwLCAiZHVtcF9yZWNzIiB9LAorCQkJfTsKKworCQkJd3JxLT51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHByaXZ0YWIpIC8gc2l6ZW9mKHByaXZ0YWJbMF0pOworCQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBwcml2dGFiLCBzaXplb2YocHJpdnRhYikpKQorCQkJCWVyciA9IC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJICAgICAgIAorCWNhc2UgU0lPQ0lXRklSU1RQUklWICsgMHgwOiAvKiBmb3JjZV9yZXNldCAqLworCWNhc2UgU0lPQ0lXRklSU1RQUklWICsgMHgxOiAvKiBjYXJkX3Jlc2V0ICovCisJCWlmICghIGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCWVyciA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisJCQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEZvcmNlIHNjaGVkdWxpbmcgcmVzZXQhXG4iLCBkZXYtPm5hbWUpOworCisJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJlc2V0X3dvcmspOworCQlicmVhazsKKworCWNhc2UgU0lPQ0lXRklSU1RQUklWICsgMHgyOiAvKiBzZXRfcG9ydDMgKi8KKwkJaWYgKCEgY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgeworCQkJZXJyID0gLUVQRVJNOworCQkJYnJlYWs7CisJCX0KKworCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldHBvcnQzKGRldiwgd3JxKTsKKwkJaWYgKCEgZXJyKQorCQkJY2hhbmdlZCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTSU9DSVdGSVJTVFBSSVYgKyAweDM6IC8qIGdldF9wb3J0MyAqLworCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldHBvcnQzKGRldiwgd3JxKTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NJV0ZJUlNUUFJJViArIDB4NDogLyogc2V0X3ByZWFtYmxlICovCisJCWlmICghIGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKKwkJCWVyciA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogODAyLjExYiBoYXMgcmVjZW50bHkgZGVmaW5lZCBzb21lIHNob3J0IHByZWFtYmxlLgorCQkgKiBCYXNpY2FsbHksIHRoZSBQaHkgaGVhZGVyIGhhcyBiZWVuIHJlZHVjZWQgaW4gc2l6ZS4KKwkJICogVGhpcyBpbmNyZWFzZSBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSBhdCBoaWdoIHJhdGVzCisJCSAqICh0aGUgcHJlYW1ibGUgaXMgdHJhbnNtaXR0ZWQgYXQgMU1iL3MpLCB1bmZvcnR1bmF0ZWx5CisJCSAqIHRoaXMgZ2l2ZSBjb21wYXRpYmlsaXR5IHRyb3VibGVzLi4uIC0gSmVhbiBJSSAqLworCQlpZihwcml2LT5oYXNfcHJlYW1ibGUpIHsKKwkJCWludCB2YWwgPSAqKCAoaW50ICopIHdycS0+dS5uYW1lICk7CisKKwkJCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQkJCXJldHVybiAtRUJVU1k7CisJCQlpZiAodmFsKQorCQkJCXByaXYtPnByZWFtYmxlID0gMTsKKwkJCWVsc2UKKwkJCQlwcml2LT5wcmVhbWJsZSA9IDA7CisJCQlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCQkJY2hhbmdlZCA9IDE7CisJCX0gZWxzZQorCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCisJY2FzZSBTSU9DSVdGSVJTVFBSSVYgKyAweDU6IC8qIGdldF9wcmVhbWJsZSAqLworCQlpZihwcml2LT5oYXNfcHJlYW1ibGUpIHsKKwkJCWludCAqdmFsID0gKGludCAqKXdycS0+dS5uYW1lOworCisJCQlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJKnZhbCA9IHByaXYtPnByZWFtYmxlOworCQkJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwkJfSBlbHNlCisJCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisJY2FzZSBTSU9DSVdGSVJTVFBSSVYgKyAweDY6IC8qIHNldF9pYnNzcG9ydCAqLworCQlpZiAoISBjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7CisJCQllcnIgPSAtRVBFUk07CisJCQlicmVhazsKKwkJfQorCisJCWVyciA9IG9yaW5vY29faW9jdGxfc2V0aWJzc3BvcnQoZGV2LCB3cnEpOworCQlpZiAoISBlcnIpCisJCQljaGFuZ2VkID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NJV0ZJUlNUUFJJViArIDB4NzogLyogZ2V0X2lic3Nwb3J0ICovCisJCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0aWJzc3BvcnQoZGV2LCB3cnEpOworCQlicmVhazsKKworCWNhc2UgU0lPQ0lXTEFTVFBSSVY6CisJCWVyciA9IG9yaW5vY29fZGVidWdfZHVtcF9yZWNzKGRldik7CisJCWlmIChlcnIpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gZHVtcCByZWNvcmRzICglZClcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlicmVhazsKKworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJfQorCQorCWlmICghIGVyciAmJiBjaGFuZ2VkICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQllcnIgPSBvcmlub2NvX3JlY29uZmlndXJlKGRldik7CisJfQkJCisKKwlUUkFDRV9FWElUKGRldi0+bmFtZSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgeworCXUxNiByaWQ7CisJY2hhciAqbmFtZTsKKwlpbnQgZGlzcGxheXR5cGU7CisjZGVmaW5lIERJU1BMQVlfV09SRFMJMAorI2RlZmluZSBESVNQTEFZX0JZVEVTCTEKKyNkZWZpbmUgRElTUExBWV9TVFJJTkcJMgorI2RlZmluZSBESVNQTEFZX1hTVFJJTkcJMworfSByZWNvcmRfdGFibGVbXSA9IHsKKyNkZWZpbmUgREVCVUdfUkVDKG5hbWUsdHlwZSkgeyBIRVJNRVNfUklEXyMjbmFtZSwgI25hbWUsIERJU1BMQVlfIyN0eXBlIH0KKwlERUJVR19SRUMoQ05GUE9SVFRZUEUsV09SRFMpLAorCURFQlVHX1JFQyhDTkZPV05NQUNBRERSLEJZVEVTKSwKKwlERUJVR19SRUMoQ05GREVTSVJFRFNTSUQsU1RSSU5HKSwKKwlERUJVR19SRUMoQ05GT1dOQ0hBTk5FTCxXT1JEUyksCisJREVCVUdfUkVDKENORk9XTlNTSUQsU1RSSU5HKSwKKwlERUJVR19SRUMoQ05GT1dOQVRJTVdJTkRPVyxXT1JEUyksCisJREVCVUdfUkVDKENORlNZU1RFTVNDQUxFLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GTUFYREFUQUxFTixXT1JEUyksCisJREVCVUdfUkVDKENORlBNRU5BQkxFRCxXT1JEUyksCisJREVCVUdfUkVDKENORlBNRVBTLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GTVVMVElDQVNUUkVDRUlWRSxXT1JEUyksCisJREVCVUdfUkVDKENORk1BWFNMRUVQRFVSQVRJT04sV09SRFMpLAorCURFQlVHX1JFQyhDTkZQTUhPTERPVkVSRFVSQVRJT04sV09SRFMpLAorCURFQlVHX1JFQyhDTkZPV05OQU1FLFNUUklORyksCisJREVCVUdfUkVDKENORk9XTkRUSU1QRVJJT0QsV09SRFMpLAorCURFQlVHX1JFQyhDTkZNVUxUSUNBU1RQTUJVRkZFUklORyxXT1JEUyksCisJREVCVUdfUkVDKENORldFUEVOQUJMRURfQUdFUkUsV09SRFMpLAorCURFQlVHX1JFQyhDTkZNQU5EQVRPUllCU1NJRF9TWU1CT0wsV09SRFMpLAorCURFQlVHX1JFQyhDTkZXRVBERUZBVUxUS0VZSUQsV09SRFMpLAorCURFQlVHX1JFQyhDTkZERUZBVUxUS0VZMCxCWVRFUyksCisJREVCVUdfUkVDKENORkRFRkFVTFRLRVkxLEJZVEVTKSwKKwlERUJVR19SRUMoQ05GTVdPUk9CVVNUX0FHRVJFLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GREVGQVVMVEtFWTIsQllURVMpLAorCURFQlVHX1JFQyhDTkZERUZBVUxUS0VZMyxCWVRFUyksCisJREVCVUdfUkVDKENORldFUEZMQUdTX0lOVEVSU0lMLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GV0VQS0VZTUFQUElOR1RBQkxFLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GQVVUSEVOVElDQVRJT04sV09SRFMpLAorCURFQlVHX1JFQyhDTkZNQVhBU1NPQ1NUQSxXT1JEUyksCisJREVCVUdfUkVDKENORktFWUxFTkdUSF9TWU1CT0wsV09SRFMpLAorCURFQlVHX1JFQyhDTkZUWENPTlRST0wsV09SRFMpLAorCURFQlVHX1JFQyhDTkZST0FNSU5HTU9ERSxXT1JEUyksCisJREVCVUdfUkVDKENORkhPU1RBVVRIRU5USUNBVElPTixXT1JEUyksCisJREVCVUdfUkVDKENORlJDVkNSQ0VSUk9SLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GTU1MSUZFLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GQUxUUkVUUllDT1VOVCxXT1JEUyksCisJREVCVUdfUkVDKENORkJFQUNPTklOVCxXT1JEUyksCisJREVCVUdfUkVDKENORkFQUENGSU5GTyxXT1JEUyksCisJREVCVUdfUkVDKENORlNUQVBDRklORk8sV09SRFMpLAorCURFQlVHX1JFQyhDTkZQUklPUklUWVFVU0FHRSxXT1JEUyksCisJREVCVUdfUkVDKENORlRJTUNUUkwsV09SRFMpLAorCURFQlVHX1JFQyhDTkZUSElSVFkyVEFMTFksV09SRFMpLAorCURFQlVHX1JFQyhDTkZFTkhTRUNVUklUWSxXT1JEUyksCisJREVCVUdfUkVDKENORkdST1VQQUREUkVTU0VTLEJZVEVTKSwKKwlERUJVR19SRUMoQ05GQ1JFQVRFSUJTUyxXT1JEUyksCisJREVCVUdfUkVDKENORkZSQUdNRU5UQVRJT05USFJFU0hPTEQsV09SRFMpLAorCURFQlVHX1JFQyhDTkZSVFNUSFJFU0hPTEQsV09SRFMpLAorCURFQlVHX1JFQyhDTkZUWFJBVEVDT05UUk9MLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GUFJPTUlTQ1VPVVNNT0RFLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GQkFTSUNSQVRFU19TWU1CT0wsV09SRFMpLAorCURFQlVHX1JFQyhDTkZQUkVBTUJMRV9TWU1CT0wsV09SRFMpLAorCURFQlVHX1JFQyhDTkZTSE9SVFBSRUFNQkxFLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GV0VQS0VZU19BR0VSRSxCWVRFUyksCisJREVCVUdfUkVDKENORkVYQ0xVREVMT05HUFJFQU1CTEUsV09SRFMpLAorCURFQlVHX1JFQyhDTkZUWEtFWV9BR0VSRSxXT1JEUyksCisJREVCVUdfUkVDKENORkFVVEhFTlRJQ0FUSU9OUlNQVE8sV09SRFMpLAorCURFQlVHX1JFQyhDTkZCQVNJQ1JBVEVTLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GU1VQUE9SVEVEUkFURVMsV09SRFMpLAorCURFQlVHX1JFQyhDTkZUSUNLVElNRSxXT1JEUyksCisJREVCVUdfUkVDKENORlNDQU5SRVFVRVNULFdPUkRTKSwKKwlERUJVR19SRUMoQ05GSk9JTlJFUVVFU1QsV09SRFMpLAorCURFQlVHX1JFQyhDTkZBVVRIRU5USUNBVEVTVEFUSU9OLFdPUkRTKSwKKwlERUJVR19SRUMoQ05GQ0hBTk5FTElORk9SRVFVRVNULFdPUkRTKSwKKwlERUJVR19SRUMoTUFYTE9BRFRJTUUsV09SRFMpLAorCURFQlVHX1JFQyhET1dOTE9BREJVRkZFUixXT1JEUyksCisJREVCVUdfUkVDKFBSSUlELFdPUkRTKSwKKwlERUJVR19SRUMoUFJJU1VQUkFOR0UsV09SRFMpLAorCURFQlVHX1JFQyhDRklBQ1RSQU5HRVMsV09SRFMpLAorCURFQlVHX1JFQyhOSUNTRVJOVU0sWFNUUklORyksCisJREVCVUdfUkVDKE5JQ0lELFdPUkRTKSwKKwlERUJVR19SRUMoTUZJU1VQUkFOR0UsV09SRFMpLAorCURFQlVHX1JFQyhDRklTVVBSQU5HRSxXT1JEUyksCisJREVCVUdfUkVDKENIQU5ORUxMSVNULFdPUkRTKSwKKwlERUJVR19SRUMoUkVHVUxBVE9SWURPTUFJTlMsV09SRFMpLAorCURFQlVHX1JFQyhURU1QVFlQRSxXT1JEUyksCisvKiAgCURFQlVHX1JFQyhDSVMsQllURVMpLCAqLworCURFQlVHX1JFQyhTVEFJRCxXT1JEUyksCisJREVCVUdfUkVDKENVUlJFTlRTU0lELFNUUklORyksCisJREVCVUdfUkVDKENVUlJFTlRCU1NJRCxCWVRFUyksCisJREVCVUdfUkVDKENPTU1TUVVBTElUWSxXT1JEUyksCisJREVCVUdfUkVDKENVUlJFTlRUWFJBVEUsV09SRFMpLAorCURFQlVHX1JFQyhDVVJSRU5UQkVBQ09OSU5URVJWQUwsV09SRFMpLAorCURFQlVHX1JFQyhDVVJSRU5UU0NBTEVUSFJFU0hPTERTLFdPUkRTKSwKKwlERUJVR19SRUMoUFJPVE9DT0xSU1BUSU1FLFdPUkRTKSwKKwlERUJVR19SRUMoU0hPUlRSRVRSWUxJTUlULFdPUkRTKSwKKwlERUJVR19SRUMoTE9OR1JFVFJZTElNSVQsV09SRFMpLAorCURFQlVHX1JFQyhNQVhUUkFOU01JVExJRkVUSU1FLFdPUkRTKSwKKwlERUJVR19SRUMoTUFYUkVDRUlWRUxJRkVUSU1FLFdPUkRTKSwKKwlERUJVR19SRUMoQ0ZQT0xMQUJMRSxXT1JEUyksCisJREVCVUdfUkVDKEFVVEhFTlRJQ0FUSU9OQUxHT1JJVEhNUyxXT1JEUyksCisJREVCVUdfUkVDKFBSSVZBQ1lPUFRJT05JTVBMRU1FTlRFRCxXT1JEUyksCisJREVCVUdfUkVDKE9XTk1BQ0FERFIsQllURVMpLAorCURFQlVHX1JFQyhTQ0FOUkVTVUxUU1RBQkxFLFdPUkRTKSwKKwlERUJVR19SRUMoUEhZVFlQRSxXT1JEUyksCisJREVCVUdfUkVDKENVUlJFTlRDSEFOTkVMLFdPUkRTKSwKKwlERUJVR19SRUMoQ1VSUkVOVFBPV0VSU1RBVEUsV09SRFMpLAorCURFQlVHX1JFQyhDQ0FNT0RFLFdPUkRTKSwKKwlERUJVR19SRUMoU1VQUE9SVEVEREFUQVJBVEVTLFdPUkRTKSwKKwlERUJVR19SRUMoQlVJTERTRVEsQllURVMpLAorCURFQlVHX1JFQyhGV0lELFhTVFJJTkcpCisjdW5kZWYgREVCVUdfUkVDCit9OworCisjZGVmaW5lIERFQlVHX0xUVl9TSVpFCQkxMjgKKworc3RhdGljIGludCBvcmlub2NvX2RlYnVnX2R1bXBfcmVjcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwl1OCAqdmFsODsKKwl1MTYgKnZhbDE2OworCWludCBpLGo7CisJdTE2IGxlbmd0aDsKKwlpbnQgZXJyOworCisJLyogSSdtIG5vdCBzdXJlOiB3ZSBtaWdodCBoYXZlIGEgbG9jayBoZXJlLCBzbyB3ZSdkIGJldHRlciBnbworICAgICAgICAgICBhdG9taWMsIGp1c3QgaW4gY2FzZS4gKi8KKwl2YWw4ID0ga21hbGxvYyhERUJVR19MVFZfU0laRSArIDIsIEdGUF9BVE9NSUMpOworCWlmICghIHZhbDgpCisJCXJldHVybiAtRU5PTUVNOworCXZhbDE2ID0gKHUxNiAqKXZhbDg7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZWNvcmRfdGFibGUpOyBpKyspIHsKKwkJdTE2IHJpZCA9IHJlY29yZF90YWJsZVtpXS5yaWQ7CisJCWludCBsZW47CisKKwkJbWVtc2V0KHZhbDgsIDAsIERFQlVHX0xUVl9TSVpFICsgMik7CisKKwkJZXJyID0gaGVybWVzX3JlYWRfbHR2KGh3LCBVU0VSX0JBUCwgcmlkLCBERUJVR19MVFZfU0laRSwKKwkJCQkgICAgICAmbGVuZ3RoLCB2YWw4KTsKKwkJaWYgKGVycikgeworCQkJREVCVUcoMCwgIkVycm9yICVkIHJlYWRpbmcgUklEIDB4JTA0eFxuIiwgZXJyLCByaWQpOworCQkJY29udGludWU7CisJCX0KKwkJdmFsMTYgPSAodTE2ICopdmFsODsKKwkJaWYgKGxlbmd0aCA9PSAwKQorCQkJY29udGludWU7CisKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiUtMTVzICgweCUwNHgpOiBsZW5ndGg9JWQgKCVkIGJ5dGVzKVx0dmFsdWU9IiwKKwkJICAgICAgIHJlY29yZF90YWJsZVtpXS5uYW1lLAorCQkgICAgICAgcmlkLCBsZW5ndGgsIChsZW5ndGgtMSkqMik7CisJCWxlbiA9IG1pbigoKGludClsZW5ndGgtMSkqMiwgREVCVUdfTFRWX1NJWkUpOworCisJCXN3aXRjaCAocmVjb3JkX3RhYmxlW2ldLmRpc3BsYXl0eXBlKSB7CisJCWNhc2UgRElTUExBWV9XT1JEUzoKKwkJCWZvciAoaiA9IDA7IGogPCBsZW4gLyAyOyBqKyspCisJCQkJcHJpbnRrKCIlMDRYLSIsIGxlMTZfdG9fY3B1KHZhbDE2W2pdKSk7CisJCQlicmVhazsKKworCQljYXNlIERJU1BMQVlfQllURVM6CisJCWRlZmF1bHQ6CisJCQlmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspCisJCQkJcHJpbnRrKCIlMDJYOiIsIHZhbDhbal0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBESVNQTEFZX1NUUklORzoKKwkJCWxlbiA9IG1pbihsZW4sIGxlMTZfdG9fY3B1KHZhbDE2WzBdKSsyKTsKKwkJCXZhbDhbbGVuXSA9ICdcMCc7CisJCQlwcmludGsoIlwiJXNcIiIsIChjaGFyICopJnZhbDE2WzFdKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRElTUExBWV9YU1RSSU5HOgorCQkJcHJpbnRrKCInJXMnIiwgKGNoYXIgKil2YWw4KTsKKwkJfQorCisJCXByaW50aygiXG4iKTsKKwl9CisKKwlrZnJlZSh2YWw4KTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZWJ1Z2dpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAwCitzdGF0aWMgdm9pZCBzaG93X3J4X2ZyYW1lKHN0cnVjdCBvcmlub2NvX3J4ZnJhbWVfaGRyICpmcmFtZSkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiUlggZGVzY3JpcHRvcjpcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICIgIHN0YXR1cyAgICAgID0gMHglMDR4XG4iLCBmcmFtZS0+ZGVzYy5zdGF0dXMpOworCXByaW50ayhLRVJOX0RFQlVHICIgIHRpbWUgICAgICAgID0gMHglMDh4XG4iLCBmcmFtZS0+ZGVzYy50aW1lKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBzaWxlbmNlICAgICA9IDB4JTAyeFxuIiwgZnJhbWUtPmRlc2Muc2lsZW5jZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgc2lnbmFsICAgICAgPSAweCUwMnhcbiIsIGZyYW1lLT5kZXNjLnNpZ25hbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgcmF0ZSAgICAgICAgPSAweCUwMnhcbiIsIGZyYW1lLT5kZXNjLnJhdGUpOworCXByaW50ayhLRVJOX0RFQlVHICIgIHJ4ZmxvdyAgICAgID0gMHglMDJ4XG4iLCBmcmFtZS0+ZGVzYy5yeGZsb3cpOworCXByaW50ayhLRVJOX0RFQlVHICIgIHJlc2VydmVkICAgID0gMHglMDh4XG4iLCBmcmFtZS0+ZGVzYy5yZXNlcnZlZCk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiSUVFRSA4MDIuMTEgaGVhZGVyOlxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgZnJhbWVfY3RsICAgPSAweCUwNHhcbiIsCisJICAgICAgIGZyYW1lLT5wODAyMTEuZnJhbWVfY3RsKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBkdXJhdGlvbl9pZCA9IDB4JTA0eFxuIiwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5kdXJhdGlvbl9pZCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgYWRkcjEgICAgICAgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyMVswXSwgZnJhbWUtPnA4MDIxMS5hZGRyMVsxXSwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyMVsyXSwgZnJhbWUtPnA4MDIxMS5hZGRyMVszXSwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyMVs0XSwgZnJhbWUtPnA4MDIxMS5hZGRyMVs1XSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgYWRkcjIgICAgICAgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyMlswXSwgZnJhbWUtPnA4MDIxMS5hZGRyMlsxXSwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyMlsyXSwgZnJhbWUtPnA4MDIxMS5hZGRyMlszXSwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyMls0XSwgZnJhbWUtPnA4MDIxMS5hZGRyMls1XSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgYWRkcjMgICAgICAgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyM1swXSwgZnJhbWUtPnA4MDIxMS5hZGRyM1sxXSwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyM1syXSwgZnJhbWUtPnA4MDIxMS5hZGRyM1szXSwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyM1s0XSwgZnJhbWUtPnA4MDIxMS5hZGRyM1s1XSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgc2VxX2N0bCAgICAgPSAweCUwNHhcbiIsCisJICAgICAgIGZyYW1lLT5wODAyMTEuc2VxX2N0bCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgYWRkcjQgICAgICAgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyNFswXSwgZnJhbWUtPnA4MDIxMS5hZGRyNFsxXSwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyNFsyXSwgZnJhbWUtPnA4MDIxMS5hZGRyNFszXSwKKwkgICAgICAgZnJhbWUtPnA4MDIxMS5hZGRyNFs0XSwgZnJhbWUtPnA4MDIxMS5hZGRyNFs1XSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgZGF0YV9sZW4gICAgPSAweCUwNHhcbiIsCisJICAgICAgIGZyYW1lLT5wODAyMTEuZGF0YV9sZW4pOworCisJcHJpbnRrKEtFUk5fREVCVUcgIklFRUUgODAyLjMgaGVhZGVyOlxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgZGVzdCAgICAgICAgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgICAgZnJhbWUtPnA4MDIzLmhfZGVzdFswXSwgZnJhbWUtPnA4MDIzLmhfZGVzdFsxXSwKKwkgICAgICAgZnJhbWUtPnA4MDIzLmhfZGVzdFsyXSwgZnJhbWUtPnA4MDIzLmhfZGVzdFszXSwKKwkgICAgICAgZnJhbWUtPnA4MDIzLmhfZGVzdFs0XSwgZnJhbWUtPnA4MDIzLmhfZGVzdFs1XSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgc3JjICAgICAgICAgPSAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgICAgZnJhbWUtPnA4MDIzLmhfc291cmNlWzBdLCBmcmFtZS0+cDgwMjMuaF9zb3VyY2VbMV0sCisJICAgICAgIGZyYW1lLT5wODAyMy5oX3NvdXJjZVsyXSwgZnJhbWUtPnA4MDIzLmhfc291cmNlWzNdLAorCSAgICAgICBmcmFtZS0+cDgwMjMuaF9zb3VyY2VbNF0sIGZyYW1lLT5wODAyMy5oX3NvdXJjZVs1XSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgbGVuICAgICAgICAgPSAweCUwNHhcbiIsIGZyYW1lLT5wODAyMy5oX3Byb3RvKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJJRUVFIDgwMi4yIExMQy9TTkFQIGhlYWRlcjpcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICIgIERTQVAgICAgICAgID0gMHglMDJ4XG4iLCBmcmFtZS0+cDgwMjIuZHNhcCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiAgU1NBUCAgICAgICAgPSAweCUwMnhcbiIsIGZyYW1lLT5wODAyMi5zc2FwKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiICBjdHJsICAgICAgICA9IDB4JTAyeFxuIiwgZnJhbWUtPnA4MDIyLmN0cmwpOworCXByaW50ayhLRVJOX0RFQlVHICIgIE9VSSAgICAgICAgID0gJTAyeDolMDJ4OiUwMnhcbiIsCisJICAgICAgIGZyYW1lLT5wODAyMi5vdWlbMF0sIGZyYW1lLT5wODAyMi5vdWlbMV0sIGZyYW1lLT5wODAyMi5vdWlbMl0pOworCXByaW50ayhLRVJOX0RFQlVHICIgIGV0aGVydHlwZSAgPSAweCUwNHhcbiIsIGZyYW1lLT5ldGhlcnR5cGUpOworfQorI2VuZGlmIC8qIDAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTW9kdWxlIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitFWFBPUlRfU1lNQk9MKGFsbG9jX29yaW5vY29kZXYpOworRVhQT1JUX1NZTUJPTChmcmVlX29yaW5vY29kZXYpOworCitFWFBPUlRfU1lNQk9MKF9fb3Jpbm9jb191cCk7CitFWFBPUlRfU1lNQk9MKF9fb3Jpbm9jb19kb3duKTsKK0VYUE9SVF9TWU1CT0wob3Jpbm9jb19zdG9wKTsKK0VYUE9SVF9TWU1CT0wob3Jpbm9jb19yZWluaXRfZmlybXdhcmUpOworCitFWFBPUlRfU1lNQk9MKG9yaW5vY29faW50ZXJydXB0KTsKKworLyogQ2FuJ3QgYmUgZGVjbGFyZWQgImNvbnN0IiBvciB0aGUgd2hvbGUgX19pbml0ZGF0YSBzZWN0aW9uIHdpbGwKKyAqIGJlY29tZSBjb25zdCAqLworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPSBEUklWRVJfTkFNRSAiICIgRFJJVkVSX1ZFUlNJT04KKwkiIChEYXZpZCBHaWJzb24gPGhlcm1lc0BnaWJzb24uZHJvcGJlYXIuaWQuYXU+LCAiCisJIlBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+LCBldCBhbCkiOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X29yaW5vY28odm9pZCkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIHZlcnNpb24pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9vcmlub2NvKHZvaWQpCit7Cit9CisKK21vZHVsZV9pbml0KGluaXRfb3Jpbm9jbyk7Cittb2R1bGVfZXhpdChleGl0X29yaW5vY28pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZTQyYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmgKQEAgLTAsMCArMSwxNTMgQEAKKy8qIG9yaW5vY28uaAorICogCisgKiBDb21tb24gZGVmaW5pdGlvbnMgdG8gYWxsIHBpZWNlcyBvZiB0aGUgdmFyaW91cyBvcmlub2NvCisgKiBkcml2ZXJzCisgKi8KKworI2lmbmRlZiBfT1JJTk9DT19ICisjZGVmaW5lIF9PUklOT0NPX0gKKworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC4xNGFscGhhMiIKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgImhlcm1lcy5oIgorCisvKiBUbyBlbmFibGUgZGVidWcgbWVzc2FnZXMgKi8KKy8vI2RlZmluZSBPUklOT0NPX0RFQlVHCQkzCisKKyNkZWZpbmUgV0lSRUxFU1NfU1BZCQkvLyBlbmFibGUgaXdzcHkgc3VwcG9ydAorCisjZGVmaW5lIE9SSU5PQ09fTUFYX0tFWV9TSVpFCTE0CisjZGVmaW5lIE9SSU5PQ09fTUFYX0tFWVMJNAorCitzdHJ1Y3Qgb3Jpbm9jb19rZXkgeworCXUxNiBsZW47CS8qIGFsd2F5cyBzdG9yZWQgYXMgbGl0dGxlLWVuZGlhbiAqLworCWNoYXIgZGF0YVtPUklOT0NPX01BWF9LRVlfU0laRV07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwordHlwZWRlZiBlbnVtIHsKKwlGSVJNV0FSRV9UWVBFX0FHRVJFLAorCUZJUk1XQVJFX1RZUEVfSU5URVJTSUwsCisJRklSTVdBUkVfVFlQRV9TWU1CT0wKK30gZnd0eXBlX3Q7CisKK3N0cnVjdCBvcmlub2NvX3ByaXZhdGUgeworCXZvaWQgKmNhcmQ7CS8qIFBvaW50ZXIgdG8gY2FyZCBkZXBlbmRlbnQgc3RydWN0dXJlICovCisJaW50ICgqaGFyZF9yZXNldCkoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqKTsKKworCS8qIFN5bmNocm9uaXNhdGlvbiBzdHVmZiAqLworCXNwaW5sb2NrX3QgbG9jazsKKwlpbnQgaHdfdW5hdmFpbGFibGU7CisJc3RydWN0IHdvcmtfc3RydWN0IHJlc2V0X3dvcms7CisKKwkvKiBkcml2ZXIgc3RhdGUgKi8KKwlpbnQgb3BlbjsKKwl1MTYgbGFzdF9saW5rc3RhdHVzOworCisJLyogTmV0IGRldmljZSBzdHVmZiAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBpd19zdGF0aXN0aWNzIHdzdGF0czsKKworCS8qIEhhcmR3YXJlIGNvbnRyb2wgdmFyaWFibGVzICovCisJaGVybWVzX3QgaHc7CisJdTE2IHR4ZmlkOworCisJLyogQ2FwYWJpbGl0aWVzIG9mIHRoZSBoYXJkd2FyZS9maXJtd2FyZSAqLworCWZ3dHlwZV90IGZpcm13YXJlX3R5cGU7CisJY2hhciBmd19uYW1lWzMyXTsKKwlpbnQgaWJzc19wb3J0OworCWludCBuaWNidWZfc2l6ZTsKKwl1MTYgY2hhbm5lbF9tYXNrOworCisJLyogQm9vbGVhbiBjYXBhYmlsaXRpZXMgKi8KKwl1bnNpZ25lZCBpbnQgaGFzX2lic3M6MTsKKwl1bnNpZ25lZCBpbnQgaGFzX3BvcnQzOjE7CisJdW5zaWduZWQgaW50IGhhc193ZXA6MTsKKwl1bnNpZ25lZCBpbnQgaGFzX2JpZ193ZXA6MTsKKwl1bnNpZ25lZCBpbnQgaGFzX213bzoxOworCXVuc2lnbmVkIGludCBoYXNfcG06MTsKKwl1bnNpZ25lZCBpbnQgaGFzX3ByZWFtYmxlOjE7CisJdW5zaWduZWQgaW50IGhhc19zZW5zaXRpdml0eToxOworCXVuc2lnbmVkIGludCBicm9rZW5fZGlzYWJsZXBvcnQ6MTsKKworCS8qIENvbmZpZ3VyYXRpb24gcGFyYW1hdGVycyAqLworCXUzMiBpd19tb2RlOworCWludCBwcmVmZXJfcG9ydDM7CisJdTE2IHdlcF9vbiwgd2VwX3Jlc3RyaWN0LCB0eF9rZXk7CisJc3RydWN0IG9yaW5vY29fa2V5IGtleXNbT1JJTk9DT19NQVhfS0VZU107CisJaW50IGJpdHJhdGVtb2RlOworIAljaGFyIG5pY2tbSVdfRVNTSURfTUFYX1NJWkUrMV07CisJY2hhciBkZXNpcmVkX2Vzc2lkW0lXX0VTU0lEX01BWF9TSVpFKzFdOworCXUxNiBmcmFnX3RocmVzaCwgbXdvX3JvYnVzdDsKKwl1MTYgY2hhbm5lbDsKKwl1MTYgYXBfZGVuc2l0eSwgcnRzX3RocmVzaDsKKwl1MTYgcG1fb24sIHBtX21jYXN0LCBwbV9wZXJpb2QsIHBtX3RpbWVvdXQ7CisJdTE2IHByZWFtYmxlOworI2lmZGVmIFdJUkVMRVNTX1NQWQorCWludAkJCXNweV9udW1iZXI7CisJdV9jaGFyCQkJc3B5X2FkZHJlc3NbSVdfTUFYX1NQWV1bRVRIX0FMRU5dOworCXN0cnVjdCBpd19xdWFsaXR5CXNweV9zdGF0W0lXX01BWF9TUFldOworI2VuZGlmCisKKwkvKiBDb25maWd1cmF0aW9uIGRlcGVuZGVudCB2YXJpYWJsZXMgKi8KKwlpbnQgcG9ydF90eXBlLCBjcmVhdGVpYnNzOworCWludCBwcm9taXNjdW91cywgbWNfY291bnQ7Cit9OworCisjaWZkZWYgT1JJTk9DT19ERUJVRworZXh0ZXJuIGludCBvcmlub2NvX2RlYnVnOworI2RlZmluZSBERUJVRyhuLCBhcmdzLi4uKSBkbyB7IGlmIChvcmlub2NvX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncyk7IH0gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgkvKiBPUklOT0NPX0RFQlVHICovCisKKyNkZWZpbmUgVFJBQ0VfRU5URVIoZGV2bmFtZSkgREVCVUcoMiwgIiVzOiAtPiAlcygpXG4iLCBkZXZuYW1lLCBfX0ZVTkNUSU9OX18pOworI2RlZmluZSBUUkFDRV9FWElUKGRldm5hbWUpICBERUJVRygyLCAiJXM6IDwtICVzKClcbiIsIGRldm5hbWUsIF9fRlVOQ1RJT05fXyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEV4cG9ydGVkIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICphbGxvY19vcmlub2NvZGV2KGludCBzaXplb2ZfY2FyZCwKKwkJCQkJICAgaW50ICgqaGFyZF9yZXNldCkoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqKSk7CitleHRlcm4gdm9pZCBmcmVlX29yaW5vY29kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IF9fb3Jpbm9jb191cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgX19vcmlub2NvX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IG9yaW5vY29fc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgb3Jpbm9jb19yZWluaXRfZmlybXdhcmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaXJxcmV0dXJuX3Qgb3Jpbm9jb19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqIGRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBMb2NraW5nIGFuZCBzeW5jaHJvbml6YXRpb24gZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZXNlIGZ1bmN0aW9ucyAqbXVzdCogYmUgaW5saW5lIG9yIHRoZXkgd2lsbCBicmVhayBob3JyaWJseSBvbgorICogU1BBUkMsIGR1ZSB0byBpdHMgd2VpcmQgc2VtYW50aWNzIGZvciBzYXZlL3Jlc3RvcmUgZmxhZ3MuIGV4dGVybgorICogaW5saW5lIHNob3VsZCBwcmV2ZW50IHRoZSBrZXJuZWwgZnJvbSBsaW5raW5nIG9yIG1vZHVsZSBmcm9tCisgKiBsb2FkaW5nIGlmIHRoZXkgYXJlIG5vdCBpbmxpbmVkLiAqLworZXh0ZXJuIGlubGluZSBpbnQgb3Jpbm9jb19sb2NrKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssICpmbGFncyk7CisJaWYgKHByaXYtPmh3X3VuYXZhaWxhYmxlKSB7CisJCURFQlVHKDEsICJvcmlub2NvX2xvY2soKSBjYWxsZWQgd2l0aCBod191bmF2YWlsYWJsZSAoZGV2PSVwKVxuIiwKKwkJICAgICAgIHByaXYtPm5kZXYpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCAqZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIGlubGluZSB2b2lkIG9yaW5vY29fdW5sb2NrKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYsCisJCQkJICB1bnNpZ25lZCBsb25nICpmbGFncykKK3sKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCAqZmxhZ3MpOworfQorCisjZW5kaWYgLyogX09SSU5PQ09fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YTgyMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX2NzLmMKQEAgLTAsMCArMSw2MzYgQEAKKy8qIG9yaW5vY29fY3MuYyAoZm9ybWVybHkga25vd24gYXMgZGxkd2RfY3MuYykKKyAqCisgKiBBIGRyaXZlciBmb3IgIkhlcm1lcyIgY2hpcHNldCBiYXNlZCBQQ01DSUEgd2lyZWxlc3MgYWRhcHRvcnMsIHN1Y2gKKyAqIGFzIHRoZSBMdWNlbnQgV2F2ZWxhbklFRUUvT3Jpbm9jbyBjYXJkcyBhbmQgdGhlaXIgT0VNIChDYWJsZXRyb24vCisgKiBFbnRlcmFTeXMgUm9hbUFib3V0IDgwMi4xMSwgRUxTQSBBaXJsYW5jZXIsIE1lbGNvIEJ1ZmZhbG8gYW5kIG90aGVycykuCisgKiBJdCBzaG91bGQgYWxzbyBiZSB1c2FibGUgb24gdmFyaW91cyBQcmlzbSBJSSBiYXNlZCBjYXJkcyBzdWNoIGFzIHRoZQorICogTGlua3N5cywgRC1MaW5rIGFuZCBGYXJhbGxvbiBTa3lsaW5lLiBJdCBzaG91bGQgYWxzbyB3b3JrIG9uIFN5bWJvbAorICogY2FyZHMgc3VjaCBhcyB0aGUgM0NvbSBBaXJDb25uZWN0IGFuZCBFcmljc3NvbiBXTEFOLgorICogCisgKiBDb3B5cmlnaHQgbm90aWNlICYgcmVsZWFzZSBub3RlcyBpbiBmaWxlIG9yaW5vY28uYworICovCisKKyNkZWZpbmUgRFJJVkVSX05BTUUgIm9yaW5vY29fY3MiCisjZGVmaW5lIFBGWCBEUklWRVJfTkFNRSAiOiAiCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpZmRlZiAgX19JTl9QQ01DSUFfUEFDS0FHRV9fCisjaW5jbHVkZSA8cGNtY2lhL2tfY29tcGF0Lmg+CisjZW5kaWYgLyogX19JTl9QQ01DSUFfUEFDS0FHRV9fICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICJvcmlub2NvLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1vZHVsZSBzdHVmZgkJCQkJCQkgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTU9EVUxFX0FVVEhPUigiRGF2aWQgR2lic29uIDxoZXJtZXNAZ2lic29uLmRyb3BiZWFyLmlkLmF1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIFBDTUNJQSBMdWNlbnQgT3Jpbm9jbywgUHJpc20gSUkgYmFzZWQgYW5kIHNpbWlsYXIgd2lyZWxlc3MgY2FyZHMiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIE1QTC9HUEwiKTsKKworLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KKworLyogU29tZSBELUxpbmsgY2FyZHMgaGF2ZSBidWdneSBDSVMuIFRoZXkgZG8gd29yayBhdCA1diBwcm9wZXJseSwgYnV0CisgKiBkb24ndCBoYXZlIGFueSBDSVMgZW50cnkgZm9yIGl0LiBUaGlzIHdvcmthcm91bmQgaXQuLi4gKi8KK3N0YXRpYyBpbnQgaWdub3JlX2Npc192Y2M7IC8qID0gMCAqLworbW9kdWxlX3BhcmFtKGlnbm9yZV9jaXNfdmNjLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpZ25vcmVfY2lzX3ZjYywgIkFsbG93IHZvbHRhZ2UgbWlzbWF0Y2ggYmV0d2VlbiBjYXJkIGFuZCBzb2NrZXQiKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTWFnaWMgY29uc3RhbnRzCQkJCQkJICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGUgZGV2X2luZm8gdmFyaWFibGUgaXMgdGhlICJrZXkiIHRoYXQgaXMgdXNlZCB0byBtYXRjaCB1cCB0aGlzCisgKiBkZXZpY2UgZHJpdmVyIHdpdGggYXBwcm9wcmlhdGUgY2FyZHMsIHRocm91Z2ggdGhlIGNhcmQKKyAqIGNvbmZpZ3VyYXRpb24gZGF0YWJhc2UuCisgKi8KK3N0YXRpYyBkZXZfaW5mb190IGRldl9pbmZvID0gRFJJVkVSX05BTUU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERhdGEgc3RydWN0dXJlcwkJCQkJCSAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBQQ01DSUEgc3BlY2lmaWMgZGV2aWNlIGluZm9ybWF0aW9uIChnb2VzIGluIHRoZSBjYXJkIGZpZWxkIG9mCisgKiBzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICovCitzdHJ1Y3Qgb3Jpbm9jb19wY2NhcmQgeworCWRldl9saW5rX3QgbGluazsKKwlkZXZfbm9kZV90IG5vZGU7CisKKwkvKiBVc2VkIHRvIGhhbmRsZSBoYXJkIHJlc2V0ICovCisJLyogeXVjaywgd2UgbmVlZCB0aGlzIGhhY2sgdG8gd29yayBhcm91bmQgdGhlIGluc2FuaXR5IG9mIHRoZQorICAgICAgICAgKiBQQ01DSUEgbGF5ZXIgKi8KKwl1bnNpZ25lZCBsb25nIGhhcmRfcmVzZXRfaW5fcHJvZ3Jlc3M7IAorfTsKKworLyoKKyAqIEEgbGlua2VkIGxpc3Qgb2YgImluc3RhbmNlcyIgb2YgdGhlIGRldmljZS4gIEVhY2ggYWN0dWFsIFBDTUNJQQorICogY2FyZCBjb3JyZXNwb25kcyB0byBvbmUgZGV2aWNlIGluc3RhbmNlLCBhbmQgaXMgZGVzY3JpYmVkIGJ5IG9uZQorICogZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgKGRlZmluZWQgaW4gZHMuaCkuCisgKi8KK3N0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdDsgLyogPSBOVUxMICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMJCQkJCQkgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZGV2aWNlIG1ldGhvZHMgKi8KK3N0YXRpYyBpbnQgb3Jpbm9jb19jc19oYXJkX3Jlc2V0KHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYpOworCisvKiBQQ01DSUEgZ3VtcGYgKi8KK3N0YXRpYyB2b2lkIG9yaW5vY29fY3NfY29uZmlnKGRldl9saW5rX3QgKiBsaW5rKTsKK3N0YXRpYyB2b2lkIG9yaW5vY29fY3NfcmVsZWFzZShkZXZfbGlua190ICogbGluayk7CitzdGF0aWMgaW50IG9yaW5vY29fY3NfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkJICAgIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqIGFyZ3MpOworCitzdGF0aWMgZGV2X2xpbmtfdCAqb3Jpbm9jb19jc19hdHRhY2godm9pZCk7CitzdGF0aWMgdm9pZCBvcmlub2NvX2NzX2RldGFjaChkZXZfbGlua190ICopOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZXZpY2UgbWV0aG9kcyAgICAgCQkJCQkJICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK29yaW5vY29fY3NfaGFyZF9yZXNldChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQoreworCXN0cnVjdCBvcmlub2NvX3BjY2FyZCAqY2FyZCA9IHByaXYtPmNhcmQ7CisJZGV2X2xpbmtfdCAqbGluayA9ICZjYXJkLT5saW5rOworCWludCBlcnI7CisKKwkvKiBXZSBuZWVkIGF0b21pYyBvcHMgaGVyZSwgYmVjYXVzZSB3ZSdyZSBub3QgaG9sZGluZyB0aGUgbG9jayAqLworCXNldF9iaXQoMCwgJmNhcmQtPmhhcmRfcmVzZXRfaW5fcHJvZ3Jlc3MpOworCisJZXJyID0gcGNtY2lhX3Jlc2V0X2NhcmQobGluay0+aGFuZGxlLCBOVUxMKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJbXNsZWVwKDEwMCk7CisJY2xlYXJfYml0KDAsICZjYXJkLT5oYXJkX3Jlc2V0X2luX3Byb2dyZXNzKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQQ01DSUEgc3R1ZmYgICAgIAkJCQkJCSAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhpcyBjcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZyBsb2NhbCBkYXRhCisgKiBzdHJ1Y3R1cmVzIGZvciBvbmUgZGV2aWNlLiAgVGhlIGRldmljZSBpcyByZWdpc3RlcmVkIHdpdGggQ2FyZAorICogU2VydmljZXMuCisgKiAKKyAqIFRoZSBkZXZfbGluayBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQsIGJ1dCB3ZSBkb24ndCBhY3R1YWxseQorICogY29uZmlndXJlIHRoZSBjYXJkIGF0IHRoaXMgcG9pbnQgLS0gd2Ugd2FpdCB1bnRpbCB3ZSByZWNlaXZlIGEgY2FyZAorICogaW5zZXJ0aW9uIGV2ZW50LiAgKi8KK3N0YXRpYyBkZXZfbGlua190ICoKK29yaW5vY29fY3NfYXR0YWNoKHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2OworCXN0cnVjdCBvcmlub2NvX3BjY2FyZCAqY2FyZDsKKwlkZXZfbGlua190ICpsaW5rOworCWNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworCWludCByZXQ7CisKKwlkZXYgPSBhbGxvY19vcmlub2NvZGV2KHNpemVvZigqY2FyZCksIG9yaW5vY29fY3NfaGFyZF9yZXNldCk7CisJaWYgKCEgZGV2KQorCQlyZXR1cm4gTlVMTDsKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljYXJkID0gcHJpdi0+Y2FyZDsKKworCS8qIExpbmsgYm90aCBzdHJ1Y3R1cmVzIHRvZ2V0aGVyICovCisJbGluayA9ICZjYXJkLT5saW5rOworCWxpbmstPnByaXYgPSBkZXY7CisKKwkvKiBJbnRlcnJ1cHQgc2V0dXAgKi8KKwlsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKKwlsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisJbGluay0+aXJxLkhhbmRsZXIgPSBvcmlub2NvX2ludGVycnVwdDsKKwlsaW5rLT5pcnEuSW5zdGFuY2UgPSBkZXY7IAorCisJLyogR2VuZXJhbCBzb2NrZXQgY29uZmlndXJhdGlvbiBkZWZhdWx0cyBjYW4gZ28gaGVyZS4gIEluIHRoaXMKKwkgKiBjbGllbnQsIHdlIGFzc3VtZSB2ZXJ5IGxpdHRsZSwgYW5kIHJlbHkgb24gdGhlIENJUyBmb3IKKwkgKiBhbG1vc3QgZXZlcnl0aGluZy4gIEluIG1vc3QgY2xpZW50cywgbWFueSBkZXRhaWxzIChpLmUuLAorCSAqIG51bWJlciwgc2l6ZXMsIGFuZCBhdHRyaWJ1dGVzIG9mIElPIHdpbmRvd3MpIGFyZSBmaXhlZCBieQorCSAqIHRoZSBuYXR1cmUgb2YgdGhlIGRldmljZSwgYW5kIGNhbiBiZSBoYXJkLXdpcmVkIGhlcmUuICovCisJbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gMDsKKwlsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKworCS8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworCS8qIEZJWE1FOiBuZWVkIGEgbG9jaz8gKi8KKwlsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CisJZGV2X2xpc3QgPSBsaW5rOworCisJY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKKwljbGllbnRfcmVnLkV2ZW50TWFzayA9CisJCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKwkJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKwkJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKKwljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmb3Jpbm9jb19jc19ldmVudDsKKwljbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7IC8qIEZJWE1FOiB3aGF0IGRvZXMgdGhpcyBtZWFuPyAqLworCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisKKwlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKwlpZiAocmV0ICE9IENTX1NVQ0NFU1MpIHsKKwkJY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZWdpc3RlckNsaWVudCwgcmV0KTsKKwkJb3Jpbm9jb19jc19kZXRhY2gobGluayk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBsaW5rOworfQkJCQkvKiBvcmlub2NvX2NzX2F0dGFjaCAqLworCisvKgorICogVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQgd2l0aAorICogQ2FyZCBTZXJ2aWNlcy4gIElmIGl0IGhhcyBiZWVuIHJlbGVhc2VkLCBhbGwgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzCisgKiBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQgd2hlbiB0aGUgZGV2aWNlCisgKiBpcyByZWxlYXNlZC4KKyAqLworc3RhdGljIHZvaWQgb3Jpbm9jb19jc19kZXRhY2goZGV2X2xpbmtfdCAqbGluaykKK3sKKwlkZXZfbGlua190ICoqbGlua3A7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisKKwkvKiBMb2NhdGUgZGV2aWNlIHN0cnVjdHVyZSAqLworCWZvciAobGlua3AgPSAmZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJCWlmICgqbGlua3AgPT0gbGluaykKKwkJCWJyZWFrOworCisJQlVHX09OKCpsaW5rcCA9PSBOVUxMKTsKKworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJCW9yaW5vY29fY3NfcmVsZWFzZShsaW5rKTsKKworCS8qIEJyZWFrIHRoZSBsaW5rIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworCWlmIChsaW5rLT5oYW5kbGUpCisJCXBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChsaW5rLT5oYW5kbGUpOworCisJLyogVW5saW5rIGRldmljZSBzdHJ1Y3R1cmUsIGFuZCBmcmVlIGl0ICovCisJKmxpbmtwID0gbGluay0+bmV4dDsKKwlERUJVRygwLCBQRlggImRldGFjaDogbGluaz0lcCBsaW5rLT5kZXY9JXBcbiIsIGxpbmssIGxpbmstPmRldik7CisJaWYgKGxpbmstPmRldikgeworCQlERUJVRygwLCBQRlggIkFib3V0IHRvIHVucmVnaXN0ZXIgbmV0IGRldmljZSAlcFxuIiwKKwkJICAgICAgZGV2KTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwl9CisJZnJlZV9vcmlub2NvZGV2KGRldik7Cit9CQkJCS8qIG9yaW5vY29fY3NfZGV0YWNoICovCisKKy8qCisgKiBvcmlub2NvX2NzX2NvbmZpZygpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTgorICogZXZlbnQgaXMgcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlCisgKiBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCisgKi8KKworI2RlZmluZSBDU19DSEVDSyhmbiwgcmV0KSBkbyB7IFwKKwkJbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IFwKKwl9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZAorb3Jpbm9jb19jc19jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKwljbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBvcmlub2NvX3BjY2FyZCAqY2FyZCA9IHByaXYtPmNhcmQ7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBsYXN0X2ZuLCBsYXN0X3JldDsKKwl1X2NoYXIgYnVmWzY0XTsKKwljb25maWdfaW5mb190IGNvbmY7CisJY2lzaW5mb190IGluZm87CisJdHVwbGVfdCB0dXBsZTsKKwljaXNwYXJzZV90IHBhcnNlOworCXZvaWQgX19pb21lbSAqbWVtOworCisJQ1NfQ0hFQ0soVmFsaWRhdGVDSVMsIHBjbWNpYV92YWxpZGF0ZV9jaXMoaGFuZGxlLCAmaW5mbykpOworCisJLyoKKwkgKiBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzCisJICogY29uZmlndXJhdGlvbiByZWdpc3RlcnMuCisJICovCisJdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKwl0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKwl0dXBsZS5UdXBsZURhdGEgPSBidWY7CisJdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisJdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwlDU19DSEVDSyhHZXRUdXBsZURhdGEsIHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSkpOworCUNTX0NIRUNLKFBhcnNlVHVwbGUsIHBjbWNpYV9wYXJzZV90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSk7CisJbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UuY29uZmlnLmJhc2U7CisJbGluay0+Y29uZi5QcmVzZW50ID0gcGFyc2UuY29uZmlnLnJtYXNrWzBdOworCisJLyogQ29uZmlndXJlIGNhcmQgKi8KKwlsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworCisJLyogTG9vayB1cCB0aGUgY3VycmVudCBWY2MgKi8KKwlDU19DSEVDSyhHZXRDb25maWd1cmF0aW9uSW5mbywKKwkJIHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGhhbmRsZSwgJmNvbmYpKTsKKwlsaW5rLT5jb25mLlZjYyA9IGNvbmYuVmNjOworCisJLyoKKwkgKiBJbiB0aGlzIGxvb3AsIHdlIHNjYW4gdGhlIENJUyBmb3IgY29uZmlndXJhdGlvbiB0YWJsZQorCSAqIGVudHJpZXMsIGVhY2ggb2Ygd2hpY2ggZGVzY3JpYmVzIGEgdmFsaWQgY2FyZAorCSAqIGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyB2b2x0YWdlLCBJTyB3aW5kb3csIG1lbW9yeSB3aW5kb3csCisJICogYW5kIGludGVycnVwdCBzZXR0aW5ncy4KKwkgKgorCSAqIFdlIG1ha2Ugbm8gYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGNhcmQgdG8gYmUgY29uZmlndXJlZDogd2UKKwkgKiB1c2UganVzdCB0aGUgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGluIHRoZSBDSVMuICBJbiBhbiBpZGVhbAorCSAqIHdvcmxkLCB0aGlzIHdvdWxkIHdvcmsgZm9yIGFueSBQQ01DSUEgY2FyZCwgYnV0IGl0IHJlcXVpcmVzCisJICogYSBjb21wbGV0ZSBhbmQgYWNjdXJhdGUgQ0lTLiAgSW4gcHJhY3RpY2UsIGEgZHJpdmVyIHVzdWFsbHkKKwkgKiAia25vd3MiIG1vc3Qgb2YgdGhlc2UgdGhpbmdzIHdpdGhvdXQgY29uc3VsdGluZyB0aGUgQ0lTLAorCSAqIGFuZCBtb3N0IGNsaWVudCBkcml2ZXJzIHdpbGwgb25seSB1c2UgdGhlIENJUyB0byBmaWxsIGluCisJICogaW1wbGVtZW50YXRpb24tZGVmaW5lZCBkZXRhaWxzLgorCSAqLworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwl3aGlsZSAoMSkgeworCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZmcgPSAmKHBhcnNlLmNmdGFibGVfZW50cnkpOworCQljaXN0cGxfY2Z0YWJsZV9lbnRyeV90IGRmbHQgPSB7IC5pbmRleCA9IDAgfTsKKworCQlpZiAoIChwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpICE9IDApCisJCSAgICB8fCAocGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpICE9IDApKQorCQkJZ290byBuZXh0X2VudHJ5OworCisJCWlmIChjZmctPmZsYWdzICYgQ0lTVFBMX0NGVEFCTEVfREVGQVVMVCkKKwkJCWRmbHQgPSAqY2ZnOworCQlpZiAoY2ZnLT5pbmRleCA9PSAwKQorCQkJZ290byBuZXh0X2VudHJ5OworCQlsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gY2ZnLT5pbmRleDsKKworCQkvKiBEb2VzIHRoaXMgY2FyZCBuZWVkIGF1ZGlvIG91dHB1dD8gKi8KKwkJaWYgKGNmZy0+ZmxhZ3MgJiBDSVNUUExfQ0ZUQUJMRV9BVURJTykgeworCQkJbGluay0+Y29uZi5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX1NQS1I7CisJCQlsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOworCQl9CisKKwkJLyogVXNlIHBvd2VyIHNldHRpbmdzIGZvciBWY2MgYW5kIFZwcCBpZiBwcmVzZW50ICovCisJCS8qIE5vdGUgdGhhdCB0aGUgQ0lTIHZhbHVlcyBuZWVkIHRvIGJlIHJlc2NhbGVkICovCisJCWlmIChjZmctPnZjYy5wcmVzZW50ICYgKDEgPDwgQ0lTVFBMX1BPV0VSX1ZOT00pKSB7CisJCQlpZiAoY29uZi5WY2MgIT0gY2ZnLT52Y2MucGFyYW1bQ0lTVFBMX1BPV0VSX1ZOT01dIC8gMTAwMDApIHsKKwkJCQlERUJVRygyLCAib3Jpbm9jb19jc19jb25maWc6IFZjYyBtaXNtYXRjaCAoY29uZi5WY2MgPSAlZCwgQ0lTID0gJWQpXG4iLCAgY29uZi5WY2MsIGNmZy0+dmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwKTsKKwkJCQlpZiAoIWlnbm9yZV9jaXNfdmNjKQorCQkJCQlnb3RvIG5leHRfZW50cnk7CisJCQl9CisJCX0gZWxzZSBpZiAoZGZsdC52Y2MucHJlc2VudCAmICgxIDw8IENJU1RQTF9QT1dFUl9WTk9NKSkgeworCQkJaWYgKGNvbmYuVmNjICE9IGRmbHQudmNjLnBhcmFtW0NJU1RQTF9QT1dFUl9WTk9NXSAvIDEwMDAwKSB7CisJCQkJREVCVUcoMiwgIm9yaW5vY29fY3NfY29uZmlnOiBWY2MgbWlzbWF0Y2ggKGNvbmYuVmNjID0gJWQsIENJUyA9ICVkKVxuIiwgIGNvbmYuVmNjLCBkZmx0LnZjYy5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMCk7CisJCQkJaWYoIWlnbm9yZV9jaXNfdmNjKQorCQkJCQlnb3RvIG5leHRfZW50cnk7CisJCQl9CisJCX0KKworCQlpZiAoY2ZnLT52cHAxLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpCisJCQlsaW5rLT5jb25mLlZwcDEgPSBsaW5rLT5jb25mLlZwcDIgPQorCQkJICAgIGNmZy0+dnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKKwkJZWxzZSBpZiAoZGZsdC52cHAxLnByZXNlbnQgJiAoMSA8PCBDSVNUUExfUE9XRVJfVk5PTSkpCisJCQlsaW5rLT5jb25mLlZwcDEgPSBsaW5rLT5jb25mLlZwcDIgPQorCQkJICAgIGRmbHQudnBwMS5wYXJhbVtDSVNUUExfUE9XRVJfVk5PTV0gLyAxMDAwMDsKKwkJCisJCS8qIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gaW50ZXJydXB0PyAqLworCQlsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROworCisJCS8qIElPIHdpbmRvdyBzZXR0aW5ncyAqLworCQlsaW5rLT5pby5OdW1Qb3J0czEgPSBsaW5rLT5pby5OdW1Qb3J0czIgPSAwOworCQlpZiAoKGNmZy0+aW8ubndpbiA+IDApIHx8IChkZmx0LmlvLm53aW4gPiAwKSkgeworCQkJY2lzdHBsX2lvX3QgKmlvID0KKwkJCSAgICAoY2ZnLT5pby5ud2luKSA/ICZjZmctPmlvIDogJmRmbHQuaW87CisJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF9BVVRPOworCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzhCSVQpKQorCQkJCWxpbmstPmlvLkF0dHJpYnV0ZXMxID0KKwkJCQkgICAgSU9fREFUQV9QQVRIX1dJRFRIXzE2OworCQkJaWYgKCEoaW8tPmZsYWdzICYgQ0lTVFBMX0lPXzE2QklUKSkKKwkJCQlsaW5rLT5pby5BdHRyaWJ1dGVzMSA9CisJCQkJICAgIElPX0RBVEFfUEFUSF9XSURUSF84OworCQkJbGluay0+aW8uSU9BZGRyTGluZXMgPQorCQkJICAgIGlvLT5mbGFncyAmIENJU1RQTF9JT19MSU5FU19NQVNLOworCQkJbGluay0+aW8uQmFzZVBvcnQxID0gaW8tPndpblswXS5iYXNlOworCQkJbGluay0+aW8uTnVtUG9ydHMxID0gaW8tPndpblswXS5sZW47CisJCQlpZiAoaW8tPm53aW4gPiAxKSB7CisJCQkJbGluay0+aW8uQXR0cmlidXRlczIgPQorCQkJCSAgICBsaW5rLT5pby5BdHRyaWJ1dGVzMTsKKwkJCQlsaW5rLT5pby5CYXNlUG9ydDIgPSBpby0+d2luWzFdLmJhc2U7CisJCQkJbGluay0+aW8uTnVtUG9ydHMyID0gaW8tPndpblsxXS5sZW47CisJCQl9CisKKwkJCS8qIFRoaXMgcmVzZXJ2ZXMgSU8gc3BhY2UgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgZW5hYmxlIGl0ICovCisJCQlpZiAocGNtY2lhX3JlcXVlc3RfaW8obGluay0+aGFuZGxlLCAmbGluay0+aW8pICE9IDApCisJCQkJZ290byBuZXh0X2VudHJ5OworCQl9CisKKworCQkvKiBJZiB3ZSBnb3QgdGhpcyBmYXIsIHdlJ3JlIGNvb2whICovCisKKwkJYnJlYWs7CisJCQorCW5leHRfZW50cnk6CisJCWlmIChsaW5rLT5pby5OdW1Qb3J0czEpCisJCQlwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJCWxhc3RfcmV0ID0gcGNtY2lhX2dldF9uZXh0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKTsKKwkJaWYgKGxhc3RfcmV0ICA9PSBDU19OT19NT1JFX0lURU1TKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJHZXROZXh0VHVwbGUoKTogTm8gbWF0Y2hpbmcgIgorCQkJICAgICAgICJDSVMgY29uZmlndXJhdGlvbi4gIE1heWJlIHlvdSBuZWVkIHRoZSAiCisJCQkgICAgICAgImlnbm9yZV9jaXNfdmNjPTEgcGFyYW1ldGVyLlxuIik7CisJCQlnb3RvIGNzX2ZhaWxlZDsKKwkJfQorCX0KKworCS8qCisJICogQWxsb2NhdGUgYW4gaW50ZXJydXB0IGxpbmUuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhc3NpZ24KKwkgKiBhIGhhbmRsZXIgdG8gdGhlIGludGVycnVwdCwgdW5sZXNzIHRoZSAnSGFuZGxlcicgbWVtYmVyIG9mCisJICogdGhlIGlycSBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQuCisJICovCisJQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSkpOworCisJLyogV2UgaW5pdGlhbGl6ZSB0aGUgaGVybWVzIHN0cnVjdHVyZSBiZWZvcmUgY29tcGxldGluZyBQQ01DSUEKKwkgKiBjb25maWd1cmF0aW9uIGp1c3QgaW4gY2FzZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgZ2V0cworCSAqIGNhbGxlZC4gKi8KKwltZW0gPSBpb3BvcnRfbWFwKGxpbmstPmlvLkJhc2VQb3J0MSwgbGluay0+aW8uTnVtUG9ydHMxKTsKKwlpZiAoIW1lbSkKKwkJZ290byBjc19mYWlsZWQ7CisKKwloZXJtZXNfc3RydWN0X2luaXQoaHcsIG1lbSwgSEVSTUVTXzE2QklUX1JFR1NQQUNJTkcpOworCisJLyoKKwkgKiBUaGlzIGFjdHVhbGx5IGNvbmZpZ3VyZXMgdGhlIFBDTUNJQSBzb2NrZXQgLS0gc2V0dGluZyB1cAorCSAqIHRoZSBJL08gd2luZG93cyBhbmQgdGhlIGludGVycnVwdCBtYXBwaW5nLCBhbmQgcHV0dGluZyB0aGUKKwkgKiBjYXJkIGFuZCBob3N0IGludGVyZmFjZSBpbnRvICJNZW1vcnkgYW5kIElPIiBtb2RlLgorCSAqLworCUNTX0NIRUNLKFJlcXVlc3RDb25maWd1cmF0aW9uLAorCQkgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKSk7CisKKwkvKiBPaywgd2UgaGF2ZSB0aGUgY29uZmlndXJhdGlvbiwgcHJlcGFyZSB0byByZWdpc3RlciB0aGUgbmV0ZGV2ICovCisJZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisJZGV2LT5pcnEgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWNhcmQtPm5vZGUubWFqb3IgPSBjYXJkLT5ub2RlLm1pbm9yID0gMDsKKworCVNFVF9ORVRERVZfREVWKGRldiwgJmhhbmRsZV90b19kZXYoaGFuZGxlKSk7CisJLyogVGVsbCB0aGUgc3RhY2sgd2UgZXhpc3QgKi8KKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJyZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwkvKiBBdCB0aGlzIHBvaW50LCB0aGUgZGV2X25vZGVfdCBzdHJ1Y3R1cmUocykgbmVlZHMgdG8gYmUKKwkgKiBpbml0aWFsaXplZCBhbmQgYXJyYW5nZWQgaW4gYSBsaW5rZWQgbGlzdCBhdCBsaW5rLT5kZXYuICovCisJc3RyY3B5KGNhcmQtPm5vZGUuZGV2X25hbWUsIGRldi0+bmFtZSk7CisJbGluay0+ZGV2ID0gJmNhcmQtPm5vZGU7IC8qIGxpbmstPmRldiBiZWluZyBub24tTlVMTCBpcyBhbHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRfZGV2aWNlIGhhcyBiZWVuIHJlZ2lzdGVyZWQgKi8KKwlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJR19QRU5ESU5HOworCisJLyogRmluYWxseSwgcmVwb3J0IHdoYXQgd2UndmUgZG9uZSAqLworCXByaW50ayhLRVJOX0RFQlVHICIlczogaW5kZXggMHglMDJ4OiBWY2MgJWQuJWQiLAorCSAgICAgICBkZXYtPm5hbWUsIGxpbmstPmNvbmYuQ29uZmlnSW5kZXgsCisJICAgICAgIGxpbmstPmNvbmYuVmNjIC8gMTAsIGxpbmstPmNvbmYuVmNjICUgMTApOworCWlmIChsaW5rLT5jb25mLlZwcDEpCisJCXByaW50aygiLCBWcHAgJWQuJWQiLCBsaW5rLT5jb25mLlZwcDEgLyAxMCwKKwkJICAgICAgIGxpbmstPmNvbmYuVnBwMSAlIDEwKTsKKwlwcmludGsoIiwgaXJxICVkIiwgbGluay0+aXJxLkFzc2lnbmVkSVJRKTsKKwlpZiAobGluay0+aW8uTnVtUG9ydHMxKQorCQlwcmludGsoIiwgaW8gMHglMDR4LTB4JTA0eCIsIGxpbmstPmlvLkJhc2VQb3J0MSwKKwkJICAgICAgIGxpbmstPmlvLkJhc2VQb3J0MSArIGxpbmstPmlvLk51bVBvcnRzMSAtIDEpOworCWlmIChsaW5rLT5pby5OdW1Qb3J0czIpCisJCXByaW50aygiICYgMHglMDR4LTB4JTA0eCIsIGxpbmstPmlvLkJhc2VQb3J0MiwKKwkJICAgICAgIGxpbmstPmlvLkJhc2VQb3J0MiArIGxpbmstPmlvLk51bVBvcnRzMiAtIDEpOworCXByaW50aygiXG4iKTsKKworCXJldHVybjsKKworIGNzX2ZhaWxlZDoKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKKworIGZhaWxlZDoKKwlvcmlub2NvX2NzX3JlbGVhc2UobGluayk7Cit9CQkJCS8qIG9yaW5vY29fY3NfY29uZmlnICovCisKKy8qCisgKiBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgb3Jpbm9jb19jc19yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZQorICogZGV2aWNlLCBhbmQgcmVsZWFzZSB0aGUgUENNQ0lBIGNvbmZpZ3VyYXRpb24uICBJZiB0aGUgZGV2aWNlIGlzCisgKiBzdGlsbCBvcGVuLCB0aGlzIHdpbGwgYmUgcG9zdHBvbmVkIHVudGlsIGl0IGlzIGNsb3NlZC4KKyAqLworc3RhdGljIHZvaWQKK29yaW5vY29fY3NfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBXZSdyZSBjb21taXR0ZWQgdG8gdGFraW5nIHRoZSBkZXZpY2UgYXdheSBub3csIHNvIG1hcmsgdGhlCisJICogaGFyZHdhcmUgYXMgdW5hdmFpbGFibGUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXByaXYtPmh3X3VuYXZhaWxhYmxlKys7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogRG9uJ3QgYm90aGVyIGNoZWNraW5nIHRvIHNlZSBpZiB0aGVzZSBzdWNjZWVkIG9yIG5vdCAqLworCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwlpZiAobGluay0+aW8uTnVtUG9ydHMxKQorCQlwY21jaWFfcmVsZWFzZV9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisJaWYgKGxpbmstPmlycS5Bc3NpZ25lZElSUSkKKwkJcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisJbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7CisJaWYgKHByaXYtPmh3LmlvYmFzZSkKKwkJaW9wb3J0X3VubWFwKHByaXYtPmh3LmlvYmFzZSk7Cit9CQkJCS8qIG9yaW5vY29fY3NfcmVsZWFzZSAqLworCisvKgorICogVGhlIGNhcmQgc3RhdHVzIGV2ZW50IGhhbmRsZXIuICBNb3N0bHksIHRoaXMgc2NoZWR1bGVzIG90aGVyIHN0dWZmCisgKiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuCisgKi8KK3N0YXRpYyBpbnQKK29yaW5vY29fY3NfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorCQkgICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICogYXJncykKK3sKKwlkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG9yaW5vY29fcGNjYXJkICpjYXJkID0gcHJpdi0+Y2FyZDsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgorCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1BSRVNFTlQ7CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJCQlwcml2LT5od191bmF2YWlsYWJsZSsrOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwkJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJCW9yaW5vY29fY3NfY29uZmlnKGxpbmspOworCQlicmVhazsKKworCWNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwkJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworCWNhc2UgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUw6CisJCS8qIE1hcmsgdGhlIGRldmljZSBhcyBzdG9wcGVkLCB0byBibG9jayBJTyB1bnRpbCBsYXRlciAqLworCQlpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJCQkvKiBUaGlzIGlzIHByb2JhYmx5IHJhY3ksIGJ1dCBJIGNhbid0IHRoaW5rIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGJldHRlciB3YXksIHNob3J0IG9mIHJld3JpdGluZyB0aGUgUENNQ0lBCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciB0byBub3Qgc3VjayA6LSggKi8KKwkJCWlmICghIHRlc3RfYml0KDAsICZjYXJkLT5oYXJkX3Jlc2V0X2luX3Byb2dyZXNzKSkgeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwkJCQllcnIgPSBfX29yaW5vY29fZG93bihkZXYpOworCQkJCWlmIChlcnIpCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAlczogRXJyb3IgJWQgZG93bmluZyBpbnRlcmZhY2VcbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUsCisJCQkJCSAgICAgICBldmVudCA9PSBDU19FVkVOVF9QTV9TVVNQRU5EID8gIlNVU1BFTkQiIDogIlJFU0VUX1BIWVNJQ0FMIiwKKwkJCQkJICAgICAgIGVycik7CisJCQkJCisJCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQkJCXByaXYtPmh3X3VuYXZhaWxhYmxlKys7CisKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCQl9CisKKwkJCXBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisJCS8qIEZhbGwgdGhyb3VnaC4uLiAqLworCWNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJLyogRklYTUU6IHNob3VsZCB3ZSBkb3VibGUgY2hlY2sgdGhhdCB0aGlzIGlzCisJCQkgKiB0aGUgc2FtZSBjYXJkIGFzIHdlIGhhZCBiZWZvcmUgKi8KKwkJCXBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisKKwkJCWlmICghIHRlc3RfYml0KDAsICZjYXJkLT5oYXJkX3Jlc2V0X2luX3Byb2dyZXNzKSkgeworCQkJCWVyciA9IG9yaW5vY29fcmVpbml0X2Zpcm13YXJlKGRldik7CisJCQkJaWYgKGVycikgeworCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCByZS1pbml0aWFsaXppbmcgZmlybXdhcmVcbiIsCisJCQkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQkJCQorCQkJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwkJCQlwcml2LT5od191bmF2YWlsYWJsZS0tOworCQkJCQorCQkJCWlmIChwcml2LT5vcGVuICYmICEgcHJpdi0+aHdfdW5hdmFpbGFibGUpIHsKKwkJCQkJZXJyID0gX19vcmlub2NvX3VwKGRldik7CisJCQkJCWlmIChlcnIpCisJCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCByZXN0YXJ0aW5nIGNhcmRcbiIsCisJCQkJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQkJCQkKKwkJCQl9CisKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30JCQkJLyogb3Jpbm9jb19jc19ldmVudCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24JCQkJCSAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDYW4ndCBiZSBkZWNsYXJlZCAiY29uc3QiIG9yIHRoZSB3aG9sZSBfX2luaXRkYXRhIHNlY3Rpb24gd2lsbAorICogYmVjb21lIGNvbnN0ICovCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9IERSSVZFUl9OQU1FICIgIiBEUklWRVJfVkVSU0lPTgorCSIgKERhdmlkIEdpYnNvbiA8aGVybWVzQGdpYnNvbi5kcm9wYmVhci5pZC5hdT4sICIKKwkiUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4sIGV0IGFsKSI7CisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBvcmlub2NvX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gRFJJVkVSX05BTUUsCisJfSwKKwkuYXR0YWNoCQk9IG9yaW5vY29fY3NfYXR0YWNoLAorCS5kZXRhY2gJCT0gb3Jpbm9jb19jc19kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdAoraW5pdF9vcmlub2NvX2NzKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCB2ZXJzaW9uKTsKKworCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZvcmlub2NvX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorZXhpdF9vcmlub2NvX2NzKHZvaWQpCit7CisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZvcmlub2NvX2RyaXZlcik7CisJQlVHX09OKGRldl9saXN0ICE9IE5VTEwpOworfQorCittb2R1bGVfaW5pdChpbml0X29yaW5vY29fY3MpOworbW9kdWxlX2V4aXQoZXhpdF9vcmlub2NvX2NzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMzBkMzdlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19wY2kuYwpAQCAtMCwwICsxLDQxNyBAQAorLyogb3Jpbm9jb19wY2kuYworICogCisgKiBEcml2ZXIgZm9yIFByaXNtIElJIGRldmljZXMgdGhhdCBoYXZlIGEgZGlyZWN0IFBDSSBpbnRlcmZhY2UKKyAqIChpLmUuLCBub3QgaW4gYSBQY21jaWEgb3IgUExYIGJyaWRnZSkKKyAqCisgKiBTcGVjaWZpY2FsbHkgaGVyZSB3ZSdyZSB0YWxraW5nIGFib3V0IHRoZSBMaW5rc3lzIFdNUDExCisgKgorICogQ3VycmVudCBtYWludGFpbmVycyAoYXMgb2YgMjkgU2VwdGVtYmVyIDIwMDMpIGFyZToKKyAqIAlQYXZlbCBSb3NraW4gPHByb3NraSBBVCBnbnUub3JnPgorICogYW5kCURhdmlkIEdpYnNvbiA8aGVybWVzIEFUIGdpYnNvbi5kcm9wYmVhci5pZC5hdT4KKyAqCisgKiBTb21lIG9mIHRoaXMgY29kZSBpcyBib3Jyb3dlZCBmcm9tIG9yaW5vY29fcGx4LmMKKyAqCUNvcHlyaWdodCAoQykgMjAwMSBEYW5pZWwgQmFybG93IDxkYW4gQVQgdGVsZW50Lm5ldD4KKyAqIFNvbWUgb2YgdGhpcyBjb2RlIGlzICJpbnNwaXJlZCIgYnkgbGludXgtd2xhbi1uZy0wLjEuMTAsIGJ1dCBub3RoaW5nCisgKiBoYXMgYmVlbiBjb3BpZWQgZnJvbSBpdC4gbGludXgtd2xhbi1uZy0wLjEuMTAgaXMgb3JpZ2luYWxseSA6CisgKglDb3B5cmlnaHQgKEMpIDE5OTkgQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogVGhpcyBmaWxlIG9yaWdpbmFsbHkgd3JpdHRlbiBieToKKyAqCUNvcHlyaWdodCAoQykgMjAwMSBKZWFuIFRvdXJyaWxoZXMgPGp0IEFUIGhwbC5ocC5jb20+CisgKiBBbmQgaXMgbm93IG1haW50YWluZWQgYnk6CisgKgkoQykgQ29weXJpZ2h0IERhdmlkIEdpYnNvbiwgSUJNIENvcnAuIDIwMDItMjAwMy4KKyAqCisgKiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlCisgKiBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluCisgKiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZQorICogYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCisgKgorICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIgorICogYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZQorICogdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluCisgKiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUKKyAqIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCisgKiBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyCisgKiB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5CisgKiBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQKKyAqIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZQorICogcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCisgKiB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLgorICovCisKKy8qCisgKiBUaGVvcnkgb2Ygb3BlcmF0aW9uLi4uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBNYXliZSB5b3UgaGFkIGEgbG9vayBpbiBvcmlub2NvX3BseC4gV2VsbCwgdGhpcyBpcyB0b3RhbGx5IGRpZmZlcmVudC4uLgorICoKKyAqIFRoZSBjYXJkIGNvbnRhaW5zIG9ubHkgb25lIFBDSSByZWdpb24sIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgdXN1YWwKKyAqIGhlcm1lcyByZWdpc3RlcnMuCisgKgorICogVGhlIGRyaXZlciB3aWxsIG1lbW9yeSBtYXAgdGhpcyByZWdpb24gaW4gbm9ybWFsIG1lbW9yeS4gQmVjYXVzZQorICogdGhlIGhlcm1lcyByZWdpc3RlcnMgYXJlIG1hcHBlZCBpbiBub3JtYWwgbWVtb3J5IGFuZCBub3QgaW4gSVNBIEkvTworICogcG9zdCBzcGFjZSwgd2UgY2FuJ3QgdXNlIHRoZSB1c3VhbCBpbncvb3V0dyBtYWNyb3MgYW5kIHdlIG5lZWQgdG8KKyAqIHVzZSByZWFkdy93cml0ZXcuCisgKiBUaGlzIHNsaWdodCBkaWZmZXJlbmNlIGZvcmNlIHVzIHRvIGNvbXBpbGUgb3VyIG93biB2ZXJzaW9uIG9mCisgKiBoZXJtZXMuYyB3aXRoIHRoZSByZWdpc3RlciBhY2Nlc3MgbWFjcm8gY2hhbmdlZC4gVGhhdCdzIGEgYml0CisgKiBoYWNraXNoIGJ1dCB3b3JrcyBmaW5lLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgUENJIHJlZ2lvbiBpcyBwcmV0dHkgYmlnICg0SykuIFRoYXQncyBtdWNoIG1vcmUgdGhhbgorICogdGhlIHVzdWFsIHNldCBvZiBoZXJtZXMgcmVnaXN0ZXIgKDB4MCAtPiAweDNFKS4gSSd2ZSBnb3QgYSBzdHJvbmcKKyAqIHN1c3BpY2lvbiB0aGF0IHRoZSB3aG9sZSBtZW1vcnkgc3BhY2Ugb2YgdGhlIGFkYXB0ZXIgaXMgaW4gZmFjdCBpbgorICogdGhpcyByZWdpb24uIEFjY2Vzc2luZyBkaXJlY3RseSB0aGUgYWRhcHRlciBtZW1vcnkgaW5zdGVhZCBvZiBnb2luZworICogdGhyb3VnaCB0aGUgdXN1YWwgcmVnaXN0ZXIgd291bGQgc3BlZWQgdXAgc2lnbmlmaWNhbnRlbHkgdGhlCisgKiBvcGVyYXRpb25zLi4uCisgKgorICogRmluYWxseSwgdGhlIGNhcmQgbG9va3MgbGlrZSB0aGlzIDoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEJ1cyAgMCwgZGV2aWNlICAxNCwgZnVuY3Rpb24gIDA6CisgICAgTmV0d29yayBjb250cm9sbGVyOiBQQ0kgZGV2aWNlIDEyNjA6Mzg3MyAoSGFycmlzIFNlbWljb25kdWN0b3IpIChyZXYgMSkuCisgICAgICBJUlEgMTEuCisgICAgICBNYXN0ZXIgQ2FwYWJsZS4gIExhdGVuY3k9MjQ4LiAgCisgICAgICBQcmVmZXRjaGFibGUgMzIgYml0IG1lbW9yeSBhdCAweGZmYmNjMDAwIFsweGZmYmNjZmZmXS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswMDowZS4wIE5ldHdvcmsgY29udHJvbGxlcjogSGFycmlzIFNlbWljb25kdWN0b3I6IFVua25vd24gZGV2aWNlIDM4NzMgKHJldiAwMSkKKyAgICAgICAgU3Vic3lzdGVtOiBVbmtub3duIGRldmljZSAxNzM3OjM4NzQKKyAgICAgICAgQ29udHJvbDogSS9PKyBNZW0rIEJ1c01hc3RlcisgU3BlY0N5Y2xlLSBNZW1XSU5WLSBWR0FTbm9vcC0gUGFyRXJyLSBTdGVwcGluZy0gU0VSUi0gRmFzdEIyQi0KKyAgICAgICAgU3RhdHVzOiBDYXArIDY2TWh6LSBVREYtIEZhc3RCMkIrIFBhckVyci0gREVWU0VMPW1lZGl1bSA+VEFib3J0LSA8VEFib3J0LSA8TUFib3J0LSA+U0VSUi0gPFBFUlItCisgICAgICAgIExhdGVuY3k6IDI0OCBzZXQsIGNhY2hlIGxpbmUgc2l6ZSAwOAorICAgICAgICBJbnRlcnJ1cHQ6IHBpbiBBIHJvdXRlZCB0byBJUlEgMTEKKyAgICAgICAgUmVnaW9uIDA6IE1lbW9yeSBhdCBmZmJjYzAwMCAoMzItYml0LCBwcmVmZXRjaGFibGUpIFtzaXplPTRLXQorICAgICAgICBDYXBhYmlsaXRpZXM6IFtkY10gUG93ZXIgTWFuYWdlbWVudCB2ZXJzaW9uIDIKKyAgICAgICAgICAgICAgICBGbGFnczogUE1FQ2xrLSBBdXhQd3ItIERTSS0gRDErIEQyKyBQTUUrCisgICAgICAgICAgICAgICAgU3RhdHVzOiBEMCBQTUUtRW5hYmxlLSBEU2VsPTAgRFNjYWxlPTAgUE1FLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGF0J3MgYWxsLi4KKyAqCisgKiBKZWFuIElJCisgKi8KKworI2RlZmluZSBEUklWRVJfTkFNRSAib3Jpbm9jb19wY2kiCisjZGVmaW5lIFBGWCBEUklWRVJfTkFNRSAiOiAiCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgImhlcm1lcy5oIgorI2luY2x1ZGUgIm9yaW5vY28uaCIKKworLyogQWxsIHRoZSBtYWdpYyB0aGVyZSBpcyBmcm9tIHdsYW4tbmcgKi8KKy8qIE1hZ2ljIG9mZnNldCBvZiB0aGUgcmVzZXQgcmVnaXN0ZXIgb2YgdGhlIFBDSSBjYXJkICovCisjZGVmaW5lIEhFUk1FU19QQ0lfQ09SCQkoMHgyNikKKy8qIE1hZ2ljIGJpdG1hc2sgdG8gcmVzZXQgdGhlIGNhcmQgKi8KKyNkZWZpbmUgSEVSTUVTX1BDSV9DT1JfTUFTSwkoMHgwMDgwKQorLyogTWFnaWMgdGltZW91dHMgZm9yIGRvaW5nIHRoZSByZXNldC4KKyAqIFRob3NlIHRpbWVzIGFyZSBzdHJhaWdodCBmcm9tIHdsYW4tbmcsIGFuZCBpdCBpcyBjbGFpbWVkIHRoYXQgdGhleQorICogYXJlIG5lY2Vzc2FyeS4gQWxhbiB3aWxsIGtpbGwgbWUuIFRha2UgeW91ciB0aW1lIGFuZCBncmFiIGEgY29mZmVlLiAqLworI2RlZmluZSBIRVJNRVNfUENJX0NPUl9PTlQJKDI1MCkJCS8qIG1zICovCisjZGVmaW5lIEhFUk1FU19QQ0lfQ09SX09GRlQJKDUwMCkJCS8qIG1zICovCisjZGVmaW5lIEhFUk1FU19QQ0lfQ09SX0JVU1lUCSg1MDApCQkvKiBtcyAqLworCisvKiBPcmlub2NvIFBDSSBzcGVjaWZpYyBkYXRhICovCitzdHJ1Y3Qgb3Jpbm9jb19wY2lfY2FyZCB7CisJdm9pZCBfX2lvbWVtICpwY2lfaW9hZGRyOworfTsKKworLyoKKyAqIERvIGEgc29mdCByZXNldCBvZiB0aGUgUENJIGNhcmQgdXNpbmcgdGhlIENvbmZpZ3VyYXRpb24gT3B0aW9uIFJlZ2lzdGVyCisgKiBXZSBuZWVkIHRoaXMgdG8gZ2V0IGdvaW5nLi4uCisgKiBUaGlzIGlzIHRoZSBwYXJ0IG9mIHRoZSBjb2RlIHRoYXQgaXMgc3Ryb25nbHkgaW5zcGlyZWQgZnJvbSB3bGFuLW5nCisgKgorICogTm90ZSA6IFRoaXMgY29kZSBpcyBkb25lIHdpdGggaXJxIGVuYWJsZWQuIFRoaXMgbWVhbiB0aGF0IG1hbnkKKyAqIGludGVycnVwdHMgd2lsbCBvY2N1ciB3aGlsZSB3ZSBhcmUgdGhlcmUuIFRoaXMgaXMgd2h5IHdlIHVzZSB0aGUKKyAqIGppZmZpZXMgdG8gcmVndWxhdGUgdGltZSBpbnN0ZWFkIG9mIGEgc3RyYWlnaHQgbWRlbGF5KCkuIFVzdWFsbHkgd2UKKyAqIG5lZWQgb25seSBhcm91bmQgMjQ1IGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCB0byBkbyAyNTAgbXMgZGVsYXkuCisgKgorICogTm90ZSBiaXMgOiBEb24ndCB0cnkgdG8gYWNjZXNzIEhFUk1FU19DTUQgZHVyaW5nIHRoZSByZXNldCBwaGFzZS4KKyAqIEl0IGp1c3Qgd29uJ3Qgd29yayAhCisgKi8KK3N0YXRpYyBpbnQKK29yaW5vY29fcGNpX2Nvcl9yZXNldChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQoreworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwl1bnNpZ25lZCBsb25nCXRpbWVvdXQ7CisJdTE2CXJlZzsKKworCS8qIEFzc2VydCB0aGUgcmVzZXQgdW50aWwgdGhlIGNhcmQgbm90aWNlICovCisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIFBDSV9DT1IsIEhFUk1FU19QQ0lfQ09SX01BU0spOworCW1kZWxheShIRVJNRVNfUENJX0NPUl9PTlQpOworCisJLyogR2l2ZSB0aW1lIGZvciB0aGUgY2FyZCB0byByZWNvdmVyIGZyb20gdGhpcyBoYXJkIGVmZm9ydCAqLworCWhlcm1lc193cml0ZV9yZWduKGh3LCBQQ0lfQ09SLCAweDAwMDApOworCW1kZWxheShIRVJNRVNfUENJX0NPUl9PRkZUKTsKKworCS8qIFRoZSBjYXJkIGlzIHJlYWR5IHdoZW4gaXQncyBubyBsb25nZXIgYnVzeSAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgKEhFUk1FU19QQ0lfQ09SX0JVU1lUICogSFogLyAxMDAwKTsKKwlyZWcgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBDTUQpOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSAmJiAocmVnICYgSEVSTUVTX0NNRF9CVVNZKSkgeworCQltZGVsYXkoMSk7CisJCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIENNRCk7CisJfQorCisJLyogU3RpbGwgYnVzeT8gKi8KKwlpZiAocmVnICYgSEVSTUVTX0NNRF9CVVNZKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkJ1c3kgdGltZW91dFxuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogSW5pdGlhbGlzZSBhIGNhcmQuIE1vc3RseSBzaW1pbGFyIHRvIFBMWCBjb2RlLgorICovCitzdGF0aWMgaW50IG9yaW5vY29fcGNpX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBwY2lfaW9yYW5nZTsKKwl1MTYgX19pb21lbSAqcGNpX2lvYWRkciA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBwY2lfaW9sZW47CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IE5VTEw7CisJc3RydWN0IG9yaW5vY29fcGNpX2NhcmQgKmNhcmQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBlbmFibGUgUENJIGRldmljZVxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUklWRVJfTkFNRSk7CisJaWYgKGVyciAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlc1xuIik7CisJCWdvdG8gZmFpbF9yZXNvdXJjZXM7CisJfQorCisJLyogUmVzb3VyY2UgMCBpcyBtYXBwZWQgdG8gdGhlIGhlcm1lcyByZWdpc3RlcnMgKi8KKwlwY2lfaW9yYW5nZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlwY2lfaW9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApOworCXBjaV9pb2FkZHIgPSBpb3JlbWFwKHBjaV9pb3JhbmdlLCBwY2lfaW9sZW4pOworCWlmICghcGNpX2lvcmFuZ2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IHJlbWFwIGhhcmR3YXJlIHJlZ2lzdGVyc1xuIik7CisJCWdvdG8gZmFpbF9tYXA7CisJfQorCisJLyogQWxsb2NhdGUgbmV0d29yayBkZXZpY2UgKi8KKwlkZXYgPSBhbGxvY19vcmlub2NvZGV2KHNpemVvZigqY2FyZCksIG9yaW5vY29fcGNpX2Nvcl9yZXNldCk7CisJaWYgKCEgZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9hbGxvYzsKKwl9CisKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljYXJkID0gcHJpdi0+Y2FyZDsKKwljYXJkLT5wY2lfaW9hZGRyID0gcGNpX2lvYWRkcjsKKwlkZXYtPm1lbV9zdGFydCA9IHBjaV9pb3JhbmdlOworCWRldi0+bWVtX2VuZCA9IHBjaV9pb3JhbmdlICsgcGNpX2lvbGVuIC0gMTsKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWhlcm1lc19zdHJ1Y3RfaW5pdCgmcHJpdi0+aHcsIHBjaV9pb2FkZHIsIEhFUk1FU18zMkJJVF9SRUdTUEFDSU5HKTsKKworCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiRGV0ZWN0ZWQgZGV2aWNlICVzLCBtZW06MHglbHgtMHglbHgsIGlycSAlZFxuIiwKKwkgICAgICAgcGNpX25hbWUocGRldiksIGRldi0+bWVtX3N0YXJ0LCBkZXYtPm1lbV9lbmQsIHBkZXYtPmlycSk7CisKKwllcnIgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIG9yaW5vY29faW50ZXJydXB0LCBTQV9TSElSUSwKKwkJCSAgZGV2LT5uYW1lLCBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGFsbG9jYXRlIElSUSAlZFxuIiwgcGRldi0+aXJxKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIGZhaWxfaXJxOworCX0KKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKworCS8qIFBlcmZvcm0gYSBDT1IgcmVzZXQgdG8gc3RhcnQgdGhlIGNhcmQgKi8KKwllcnIgPSBvcmlub2NvX3BjaV9jb3JfcmVzZXQocHJpdik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJJbml0aWFsIHJlc2V0IGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkZhaWxlZCB0byByZWdpc3RlciBuZXQgZGV2aWNlXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJcmV0dXJuIDA7CisKKyBmYWlsOgorCWZyZWVfaXJxKHBkZXYtPmlycSwgZGV2KTsKKworIGZhaWxfaXJxOgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX29yaW5vY29kZXYoZGV2KTsKKworIGZhaWxfYWxsb2M6CisJaW91bm1hcChwY2lfaW9hZGRyKTsKKworIGZhaWxfbWFwOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKKyBmYWlsX3Jlc291cmNlczoKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgb3Jpbm9jb19wY2lfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBvcmlub2NvX3BjaV9jYXJkICpjYXJkID0gcHJpdi0+Y2FyZDsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfb3Jpbm9jb2RldihkZXYpOworCWlvdW5tYXAoY2FyZC0+cGNpX2lvYWRkcik7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCQorCXByaW50ayhLRVJOX0RFQlVHICIlczogT3Jpbm9jby1QQ0kgZW50ZXJpbmcgc2xlZXAgbW9kZSAoc3RhdGU9JWQpXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHN0YXRlKTsKKworCWVyciA9IG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaHdfdW5hdmFpbGFibGUgb24gb3Jpbm9jb19wY2lfc3VzcGVuZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gX19vcmlub2NvX2Rvd24oZGV2KTsKKwlpZiAoZXJyKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogb3Jpbm9jb19wY2lfc3VzcGVuZCgpOiBFcnJvciAlZCBkb3duaW5nIGludGVyZmFjZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKwlwcml2LT5od191bmF2YWlsYWJsZSsrOworCQorCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIDMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBPcmlub2NvLVBDSSB3YWtpbmcgdXBcbiIsIGRldi0+bmFtZSk7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIDApOworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJZXJyID0gb3Jpbm9jb19yZWluaXRfZmlybXdhcmUoZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHJlLWluaXRpYWxpemluZyBmaXJtd2FyZSBvbiBvcmlub2NvX3BjaV9yZXN1bWUoKVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCisJcHJpdi0+aHdfdW5hdmFpbGFibGUtLTsKKworCWlmIChwcml2LT5vcGVuICYmICghIHByaXYtPmh3X3VuYXZhaWxhYmxlKSkgeworCQllcnIgPSBfX29yaW5vY29fdXAoZGV2KTsKKwkJaWYgKGVycikKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHJlc3RhcnRpbmcgY2FyZCBvbiBvcmlub2NvX3BjaV9yZXN1bWUoKVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGVycik7CisJfQorCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgb3Jpbm9jb19wY2lfcGNpX2lkX3RhYmxlW10gPSB7CisJLyogSW50ZXJzaWwgUHJpc20gMyAqLworCXsweDEyNjAsIDB4Mzg3MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAorCS8qIEludGVyc2lsIFByaXNtIDIuNSAqLworCXsweDEyNjAsIDB4Mzg3MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAorCS8qIFNhbXN1bmcgTWFnaWNMQU4gU1dMLTIyMTBQICovCisJezB4MTY3ZCwgMHhhMDAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sCisJezAsfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBvcmlub2NvX3BjaV9wY2lfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgb3Jpbm9jb19wY2lfZHJpdmVyID0geworCS5uYW1lCQk9IERSSVZFUl9OQU1FLAorCS5pZF90YWJsZQk9IG9yaW5vY29fcGNpX3BjaV9pZF90YWJsZSwKKwkucHJvYmUJCT0gb3Jpbm9jb19wY2lfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChvcmlub2NvX3BjaV9yZW1vdmVfb25lKSwKKwkuc3VzcGVuZAk9IG9yaW5vY29fcGNpX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBvcmlub2NvX3BjaV9yZXN1bWUsCit9OworCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9IERSSVZFUl9OQU1FICIgIiBEUklWRVJfVkVSU0lPTgorCSIgKFBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+LCIKKwkiIERhdmlkIEdpYnNvbiA8aGVybWVzQGdpYnNvbi5kcm9wYmVhci5pZC5hdT4gJiIKKwkiIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4pIjsKK01PRFVMRV9BVVRIT1IoIlBhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+ICYgRGF2aWQgR2lic29uIDxoZXJtZXNAZ2lic29uLmRyb3BiZWFyLmlkLmF1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIHdpcmVsZXNzIExBTiBjYXJkcyB1c2luZyBkaXJlY3QgUENJIGludGVyZmFjZSIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTVBML0dQTCIpOworCitzdGF0aWMgaW50IF9faW5pdCBvcmlub2NvX3BjaV9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCB2ZXJzaW9uKTsKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZvcmlub2NvX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb3Jpbm9jb19wY2lfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmb3Jpbm9jb19wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQob3Jpbm9jb19wY2lfaW5pdCk7Cittb2R1bGVfZXhpdChvcmlub2NvX3BjaV9leGl0KTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fcGx4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3BseC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYjA1YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3BseC5jCkBAIC0wLDAgKzEsNDE5IEBACisvKiBvcmlub2NvX3BseC5jCisgKgorICogRHJpdmVyIGZvciBQcmlzbSBJSSBkZXZpY2VzIHdoaWNoIHdvdWxkIHVzdWFsbHkgYmUgZHJpdmVuIGJ5IG9yaW5vY29fY3MsCisgKiBidXQgYXJlIGNvbm5lY3RlZCB0byB0aGUgUENJIGJ1cyBieSBhIFBMWDkwNTIuCisgKgorICogQ3VycmVudCBtYWludGFpbmVycyAoYXMgb2YgMjkgU2VwdGVtYmVyIDIwMDMpIGFyZToKKyAqIAlQYXZlbCBSb3NraW4gPHByb3NraSBBVCBnbnUub3JnPgorICogYW5kCURhdmlkIEdpYnNvbiA8aGVybWVzIEFUIGdpYnNvbi5kcm9wYmVhci5pZC5hdT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IERhdmlkIEdpYnNvbiwgSUJNIENvcnAuIDIwMDEtMjAwMy4KKyAqIENvcHlyaWdodCAoQykgMjAwMSBEYW5pZWwgQmFybG93CisgKgorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbgorICogY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworICoKKyAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIKKyAqIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUKKyAqIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpLCBpbgorICogd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlCisgKiBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQorICogb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91cgorICogdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieQorICogZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kCisgKiBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuICBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUKKyAqIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQorICogdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KKworICogQ2F1dGlvbjogdGhpcyBpcyBleHBlcmltZW50YWwgYW5kIHByb2JhYmx5IGJ1Z2d5LiAgRm9yIHN1Y2Nlc3MgYW5kCisgKiBmYWlsdXJlIHJlcG9ydHMgZm9yIGRpZmZlcmVudCBjYXJkcyBhbmQgYWRhcHRvcnMsIHNlZQorICogb3Jpbm9jb19wbHhfcGNpX2lkX3RhYmxlIG5lYXIgdGhlIGVuZCBvZiB0aGUgZmlsZS4gIElmIHlvdSBoYXZlIGEKKyAqIGNhcmQgd2UgZG9uJ3QgaGF2ZSB0aGUgUENJIGlkIGZvciwgYW5kIGxvb2tzIGxpa2UgaXQgc2hvdWxkIHdvcmssCisgKiBkcm9wIG1lIG1haWwgd2l0aCB0aGUgaWQgYW5kICJpdCB3b3JrcyIvIml0IGRvZXNuJ3Qgd29yayIuCisgKgorICogTm90ZTogaWYgZXZlcnl0aGluZyBnZXRzIGRldGVjdGVkIGZpbmUgYnV0IGl0IGRvZXNuJ3QgYWN0dWFsbHkgc2VuZAorICogb3IgcmVjZWl2ZSBwYWNrZXRzLCB5b3VyIGZpcnN0IHBvcnQgb2YgY2FsbCBzaG91bGQgcHJvYmFibHkgYmUgdG8KKyAqIHRyeSBuZXdlciBmaXJtd2FyZSBpbiB0aGUgY2FyZC4gIEVzcGVjaWFsbHkgaWYgeW91J3JlIGRvaW5nIEFkLUhvYworICogbW9kZXMuCisgKgorICogVGhlIGFjdHVhbCBkcml2aW5nIGlzIGRvbmUgYnkgb3Jpbm9jby5jLCB0aGlzIGlzIGp1c3QgcmVzb3VyY2UKKyAqIGFsbG9jYXRpb24gc3R1ZmYuICBUaGUgZXhwbGFuYXRpb24gYmVsb3cgaXMgY291cnRlc3kgb2YgUnlhbiBOaWVtaQorICogb24gdGhlIGxpbnV4LXdsYW4tbmcgbGlzdCBhdAorICogaHR0cDovL2FyY2hpdmVzLm5lb2hhcHNpcy5jb20vYXJjaGl2ZXMvZGV2L2xpbnV4LXdsYW4vMjAwMS1xMS8wMDI2Lmh0bWwKKyAqCisgKiBUaGUgUExYOTA1Mi1iYXNlZCBjYXJkcyAoV0wxMTAwMCBhbmQgc2V2ZXJhbCBvdGhlcnMpIGFyZSBhCisgKiBkaWZmZXJlbnQgYmVhc3QgdGhhbiB0aGUgdXN1YWwgUENNQ0lBLWJhc2VkIFBSSVNNMiBjb25maWd1cmF0aW9uCisgKiBleHBlY3RlZCBieSB3bGFuLW5nLiAgSGVyZSdzIHRoZSBnZW5lcmFsIGRldGFpbHMgb24gaG93IHRoZSBXTDExMDAwCisgKiBQQ0kgYWRhcHRlciB3b3JrczoKKyAqCisgKiAtIFR3byBQQ0kgSS9PIGFkZHJlc3Mgc3BhY2VzLCBvbmUgMHg4MCBsb25nIHdoaWNoIGNvbnRhaW5zIHRoZQorICogUExYOTA1MiByZWdpc3RlcnMsIGFuZCBvbmUgdGhhdCdzIDB4NDAgbG9uZyBtYXBwZWQgdG8gdGhlIFBDTUNJQQorICogc2xvdCBJL08gYWRkcmVzcyBzcGFjZS4KKyAqCisgKiAtIE9uZSBQQ0kgbWVtb3J5IGFkZHJlc3Mgc3BhY2UsIG1hcHBlZCB0byB0aGUgUENNQ0lBIG1lbW9yeSBzcGFjZQorICogKGNvbnRhaW5pbmcgdGhlIENJUykuCisgKgorICogQWZ0ZXIgaWRlbnRpZnlpbmcgdGhlIEkvTyBhbmQgbWVtb3J5IHNwYWNlLCB5b3UgY2FuIHJlYWQgdGhyb3VnaAorICogdGhlIG1lbW9yeSBzcGFjZSB0byBjb25maXJtIHRoZSBDSVMncyBkZXZpY2UgSUQgb3IgbWFudWZhY3R1cmVyIElECisgKiB0byBtYWtlIHN1cmUgaXQncyB0aGUgZXhwZWN0ZWQgY2FyZC4gIHFLZWVwIGluIG1pbmQgdGhhdCB0aGUgUENNQ0lBCisgKiBzcGVjIHNwZWNpZmllcyB0aGUgQ0lTIGFzIHRoZSBsb3dlciA4IGJpdHMgb2YgZWFjaCB3b3JkIHJlYWQgZnJvbQorICogdGhlIENJUywgc28gdG8gcmVhZCB0aGUgYnl0ZXMgb2YgdGhlIENJUywgcmVhZCBldmVyeSBvdGhlciBieXRlCisgKiAoMCwyLDQsLi4uKS4gUGFzc2luZyB0aGF0IHRlc3QsIHlvdSBuZWVkIHRvIGVuYWJsZSB0aGUgSS9PIGFkZHJlc3MKKyAqIHNwYWNlIG9uIHRoZSBQQ01DSUEgY2FyZCB2aWEgdGhlIFBDTUNJQSBDT1IgcmVnaXN0ZXIuIFRoaXMgaXMgdGhlCisgKiBmaXJzdCBieXRlIGZvbGxvd2luZyB0aGUgQ0lTLiBJbiBteSBjYXNlICh3aGljaCBtYXkgbm90IGhhdmUgYW55CisgKiByZWxhdGlvbiB0byB3aGF0J3Mgb24gdGhlIFBSSVNNMiBjYXJkcyksIENPUiB3YXMgYXQgb2Zmc2V0IDB4ODAwCisgKiB3aXRoaW4gdGhlIFBDSSBtZW1vcnkgc3BhY2UuIFdyaXRlIDB4NDEgdG8gdGhlIENPUiByZWdpc3RlciB0bworICogZW5hYmxlIEkvTyBtb2RlIGFuZCB0byBzZWxlY3QgbGV2ZWwgdHJpZ2dlcmVkIGludGVycnVwdHMuIFRvCisgKiBjb25maXJtIHlvdSBhY3R1YWxseSBzdWNjZWVkZWQsIHJlYWQgdGhlIENPUiByZWdpc3RlciBiYWNrIGFuZCBtYWtlCisgKiBzdXJlIGl0IGFjdHVhbGx5IGdvdCBzZXQgdG8gMHg0MSwgaW5jYXNlIHlvdSBoYXZlIGFuIHVuZXhwZWN0ZWQKKyAqIGNhcmQgaW5zZXJ0ZWQuCisgKgorICogRm9sbG93aW5nIHRoYXQsIHlvdSBjYW4gdHJlYXQgdGhlIHNlY29uZCBQQ0kgSS9PIGFkZHJlc3Mgc3BhY2UgKHRoZQorICogb25lIHRoYXQncyBub3QgMHg4MCBpbiBsZW5ndGgpIGFzIHRoZSBQQ01DSUEgSS9PIHNwYWNlLgorICoKKyAqIE5vdGUgdGhhdCBpbiB0aGUgRXVtaXRjb20ncyBzb3VyY2UgZm9yIHRoZWlyIGRyaXZlcnMsIHRoZXkgcmVnaXN0ZXIKKyAqIHRoZSBpbnRlcnJ1cHQgYXMgZWRnZSB0cmlnZ2VyZWQgd2hlbiByZWdpc3RlcmluZyBpdCB3aXRoIHRoZQorICogV2luZG93cyBrZXJuZWwuIEkgZG9uJ3QgcmVjYWxsIGhvdyB0byByZWdpc3RlciBlZGdlIHRyaWdnZXJlZCBvbgorICogTGludXggKGlmIGl0IGNhbiBiZSBkb25lIGF0IGFsbCkuIEJ1dCBpbiBzb21lIGV4cGVyaW1lbnRhdGlvbiwgSQorICogZG9uJ3Qgc2VlIG11Y2ggb3BlcmF0aW9uYWwgZGlmZmVyZW5jZSBiZXR3ZWVuIHVzaW5nIGVpdGhlcgorICogaW50ZXJydXB0IG1vZGUuIERvbid0IG1lc3Mgd2l0aCB0aGUgaW50ZXJydXB0IG1vZGUgaW4gdGhlIENPUgorICogcmVnaXN0ZXIgdGhvdWdoLCBhcyB0aGUgUExYOTA1MiB3YW50cyBsZXZlbCB0cmlnZ2VycyB3aXRoIHRoZSB3YXkKKyAqIHRoZSBzZXJpYWwgRUVQUk9NIGNvbmZpZ3VyZXMgaXQgb24gdGhlIFdMMTEwMDAuCisgKgorICogVGhlcmUncyBzb21lIG90aGVyIGxpdHRsZSBxdWlya3MgcmVsYXRlZCB0byB0aW1pbmcgdGhhdCBJIGJ1bXBlZAorICogaW50bywgYnV0IEkgZG9uJ3QgcmVjYWxsIHJpZ2h0IG5vdy4gQWxzbywgdGhlcmUncyB0d28gdmFyaWFudHMgb2YKKyAqIHRoZSBXTDExMDAwIEkndmUgc2VlbiwgcmV2aXNpb24gQTEgYW5kIFQyLiBUaGVzZSBzZWVtIHRvIGRpZmZlcgorICogc2xpZ2h0bHkgaW4gdGhlIHRpbWluZ3MgY29uZmlndXJlZCBpbiB0aGUgd2FpdC1zdGF0ZSBnZW5lcmF0b3IgaW4KKyAqIHRoZSBQTFg5MDUyLiBUaGVyZSBoYXZlIGFsc28gYmVlbiBzb21lIGNvbW1lbnRzIGZyb20gRXVtaXRjb20gdGhhdAorICogY2FyZHMgc2hvdWxkbid0IGJlIGhvdCBzd2FwcGVkLCBhcHBhcmVudGx5IGR1ZSB0byByaXNrIG9mIGNvb2tpbmcKKyAqIHRoZSBQTFg5MDUyLiBJJ20gdW5zdXJlIHdoeSB0aGV5IGJlbGlldmUgdGhpcywgYXMgSSBjYW4ndCBzZWUKKyAqIGFueXRoaW5nIGluIHRoZSBkZXNpZ24gdGhhdCB3b3VsZCByZWFsbHkgY2F1c2UgYSBwcm9ibGVtLCBleGNlcHQKKyAqIGZvciBjcmFzaGluZyBkcml2ZXJzIG5vdCB3cml0dGVuIHRvIGV4cGVjdCBpdC4gQW5kIGhhdmluZyBkZXZlbG9wZWQKKyAqIGRyaXZlcnMgZm9yIHRoZSBXTDExMDAwLCBJJ2Qgc2F5IGl0J3MgcXVpdGUgdHJpY2t5IHRvIHdyaXRlIGNvZGUKKyAqIHRoYXQgd2lsbCBzdWNjZXNzZnVsbHkgZGVhbCB3aXRoIGEgaG90IHVucGx1Zy4gVmVyeSBvZGQgdGhpbmdzCisgKiBoYXBwZW4gb24gdGhlIEkvTyBzaWRlIG9mIHRoaW5ncy4gQnV0IGFueXdheSwgYmUgd2FybmVkLiBEZXNwaXRlCisgKiB0aGF0LCBJJ3ZlIGhvdC1zd2FwcGVkIGEgbnVtYmVyIG9mIHRpbWVzIGR1cmluZyBkZWJ1Z2dpbmcgYW5kCisgKiBkcml2ZXIgZGV2ZWxvcG1lbnQgZm9yIHZhcmlvdXMgcmVhc29ucyAoc3R1Y2sgV0FJVCMgbGluZSBhZnRlciB0aGUKKyAqIHJhZGlvIGNhcmQncyBmaXJtd2FyZSBsb2NrcyB1cCkuCisgKgorICogSG9wZSB0aGlzIGlzIGVub3VnaCBpbmZvIGZvciBzb21lb25lIHRvIGFkZCBQTFg5MDUyIHN1cHBvcnQgdG8gdGhlCisgKiB3bGFuLW5nIGNhcmQuIEluIHRoZSBjYXNlIG9mIHRoZSBXTDExMDAwLCB0aGUgUENJIElEJ3MgYXJlCisgKiAweDE2MzkvMHgwMjAwLCB3aXRoIG1hdGNoaW5nIHN1YnN5c3RlbSBJRCdzLiBPdGhlciBQTFg5MDUyLWJhc2VkCisgKiBtYW51ZmFjdHVyZXJzIG90aGVyIHRoYW4gRXVtaXRjb20gKG9yIG9uIGNhcmRzIG90aGVyIHRoYW4gdGhlCisgKiBXTDExMDAwKSBtYXkgaGF2ZSBkaWZmZXJlbnQgUENJIElEJ3MuCisgKgorICogSWYgYW55b25lIG5lZWRzIGFueSBtb3JlIHNwZWNpZmljIGluZm8sIGxldCBtZSBrbm93LiBJIGhhdmVuJ3QgaGFkCisgKiB0aW1lIHRvIGltcGxlbWVudCBzdXBwb3J0IG15c2VsZiB5ZXQsIGFuZCB3aXRoIHRoZSB3YXkgdGhpbmdzIGFyZQorICogZ29pbmcsIG1pZ2h0IG5vdCBoYXZlIHRpbWUgZm9yIGEgd2hpbGUuLgorICovCisKKyNkZWZpbmUgRFJJVkVSX05BTUUgIm9yaW5vY29fcGx4IgorI2RlZmluZSBQRlggRFJJVkVSX05BTUUgIjogIgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorCisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorCisjaW5jbHVkZSAiaGVybWVzLmgiCisjaW5jbHVkZSAib3Jpbm9jby5oIgorCisjZGVmaW5lIENPUl9PRkZTRVQJKDB4M2UwKQkvKiBDT1IgYXR0cmlidXRlIG9mZnNldCBvZiBQcmlzbTIgUEMgY2FyZCAqLworI2RlZmluZSBDT1JfVkFMVUUJKENPUl9MRVZFTF9SRVEgfCBDT1JfRlVOQ19FTkEpIC8qIEVuYWJsZSBQQyBjYXJkIHdpdGggaW50ZXJydXB0IGluIGxldmVsIHRyaWdnZXIgKi8KKyNkZWZpbmUgQ09SX1JFU0VUICAgICAoMHg4MCkJLyogcmVzZXQgYml0IGluIHRoZSBDT1IgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUExYX1JFU0VUX1RJTUUJKDUwMCkJLyogbWlsbGlzZWNvbmRzICovCisKKyNkZWZpbmUgUExYX0lOVENTUgkJMHg0YyAvKiBJbnRlcnJ1cHQgQ29udHJvbCAmIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQTFhfSU5UQ1NSX0lOVEVOCSgxPDw2KSAvKiBJbnRlcnJ1cHQgRW5hYmxlIGJpdCAqLworCitzdGF0aWMgY29uc3QgdTggY2lzX21hZ2ljW10gPSB7CisJMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHhmZiwgMHgxNywgMHgwNCwgMHg2NworfTsKKworLyogT3Jpbm9jbyBQTFggc3BlY2lmaWMgZGF0YSAqLworc3RydWN0IG9yaW5vY29fcGx4X2NhcmQgeworCXZvaWQgX19pb21lbSAqYXR0cl9tZW07Cit9OworCisvKgorICogRG8gYSBzb2Z0IHJlc2V0IG9mIHRoZSBjYXJkIHVzaW5nIHRoZSBDb25maWd1cmF0aW9uIE9wdGlvbiBSZWdpc3RlcgorICovCitzdGF0aWMgaW50IG9yaW5vY29fcGx4X2Nvcl9yZXNldChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQoreworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlzdHJ1Y3Qgb3Jpbm9jb19wbHhfY2FyZCAqY2FyZCA9IHByaXYtPmNhcmQ7CisJdTggX19pb21lbSAqYXR0cl9tZW0gPSBjYXJkLT5hdHRyX21lbTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdTE2IHJlZzsKKworCXdyaXRlYihDT1JfVkFMVUUgfCBDT1JfUkVTRVQsIGF0dHJfbWVtICsgQ09SX09GRlNFVCk7CisJbWRlbGF5KDEpOworCisJd3JpdGViKENPUl9WQUxVRSwgYXR0cl9tZW0gKyBDT1JfT0ZGU0VUKTsKKwltZGVsYXkoMSk7CisKKwkvKiBKdXN0IGluIGNhc2UsIHdhaXQgbW9yZSB1bnRpbCB0aGUgY2FyZCBpcyBubyBsb25nZXIgYnVzeSAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgKFBMWF9SRVNFVF9USU1FICogSFogLyAxMDAwKTsKKwlyZWcgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBDTUQpOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSAmJiAocmVnICYgSEVSTUVTX0NNRF9CVVNZKSkgeworCQltZGVsYXkoMSk7CisJCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIENNRCk7CisJfQorCisJLyogRGlkIHdlIHRpbWVvdXQgPyAqLworCWlmIChyZWcgJiBIRVJNRVNfQ01EX0JVU1kpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQnVzeSB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBvcmlub2NvX3BseF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWludCBlcnIgPSAwOworCXU4IF9faW9tZW0gKmF0dHJfbWVtID0gTlVMTDsKKwl1MzIgY3NyX3JlZywgcGx4X2FkZHI7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IE5VTEw7CisJc3RydWN0IG9yaW5vY29fcGx4X2NhcmQgKmNhcmQ7CisJdW5zaWduZWQgbG9uZyBwY2NhcmRfaW9hZGRyID0gMDsKKwl1bnNpZ25lZCBsb25nIHBjY2FyZF9pb2xlbiA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJdm9pZCBfX2lvbWVtICptZW07CisJaW50IGk7CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBlbmFibGUgUENJIGRldmljZVxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUklWRVJfTkFNRSk7CisJaWYgKGVyciAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlc1xuIik7CisJCWdvdG8gZmFpbF9yZXNvdXJjZXM7CisJfQorCisJLyogUmVzb3VyY2UgMSBpcyBtYXBwZWQgdG8gUExYLXNwZWNpZmljIHJlZ2lzdGVycyAqLworCXBseF9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOworCisJLyogUmVzb3VyY2UgMiBpcyBtYXBwZWQgdG8gdGhlIFBDTUNJQSBhdHRyaWJ1dGUgbWVtb3J5ICovCisJYXR0cl9tZW0gPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKSwKKwkJCSAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMikpOworCWlmICghYXR0cl9tZW0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IHJlbWFwIFBDTUNJQSBzcGFjZVxuIik7CisJCWdvdG8gZmFpbF9tYXBfYXR0cjsKKwl9CisKKwkvKiBSZXNvdXJjZSAzIGlzIG1hcHBlZCB0byB0aGUgUENNQ0lBIEkvTyBhZGRyZXNzIHNwYWNlICovCisJcGNjYXJkX2lvYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKTsKKwlwY2NhcmRfaW9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDMpOworCisJbWVtID0gcGNpX2lvbWFwKHBkZXYsIDMsIDApOworCWlmICghbWVtKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9tYXBfaW87CisJfQorCisJLyogQWxsb2NhdGUgbmV0d29yayBkZXZpY2UgKi8KKwlkZXYgPSBhbGxvY19vcmlub2NvZGV2KHNpemVvZigqY2FyZCksIG9yaW5vY29fcGx4X2Nvcl9yZXNldCk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmYWlsX2FsbG9jOworCX0KKworCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWNhcmQgPSBwcml2LT5jYXJkOworCWNhcmQtPmF0dHJfbWVtID0gYXR0cl9tZW07CisJZGV2LT5iYXNlX2FkZHIgPSBwY2NhcmRfaW9hZGRyOworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJaGVybWVzX3N0cnVjdF9pbml0KCZwcml2LT5odywgbWVtLCBIRVJNRVNfMTZCSVRfUkVHU1BBQ0lORyk7CisKKwlwcmludGsoS0VSTl9ERUJVRyBQRlggIkRldGVjdGVkIE9yaW5vY28vUHJpc20yIFBMWCBkZXZpY2UgIgorCSAgICAgICAiYXQgJXMgaXJxOiVkLCBpbyBhZGRyOjB4JWx4XG4iLCBwY2lfbmFtZShwZGV2KSwgcGRldi0+aXJxLAorCSAgICAgICBwY2NhcmRfaW9hZGRyKTsKKworCWVyciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgb3Jpbm9jb19pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJICBkZXYtPm5hbWUsIGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgYWxsb2NhdGUgSVJRICVkXG4iLCBwZGV2LT5pcnEpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZmFpbF9pcnE7CisJfQorCWRldi0+aXJxID0gcGRldi0+aXJxOworCisJLyogYmpvZXJuOiBXZSBuZWVkIHRvIHRlbGwgdGhlIGNhcmQgdG8gZW5hYmxlIGludGVycnVwdHMsIGluCisJICAgY2FzZSB0aGUgc2VyaWFsIGVwcm9tIGRpZG4ndCBkbyB0aGlzIGFscmVhZHkuICBTZWUgdGhlCisJICAgUExYOTA1MiBkYXRhIGJvb2ssIHA4LTEgYW5kIDgtMjQgZm9yIHJlZmVyZW5jZS4gKi8KKwljc3JfcmVnID0gaW5sKHBseF9hZGRyICsgUExYX0lOVENTUik7CisJaWYgKCEoY3NyX3JlZyAmIFBMWF9JTlRDU1JfSU5URU4pKSB7CisJCWNzcl9yZWcgfD0gUExYX0lOVENTUl9JTlRFTjsKKwkJb3V0bChjc3JfcmVnLCBwbHhfYWRkciArIFBMWF9JTlRDU1IpOworCQljc3JfcmVnID0gaW5sKHBseF9hZGRyICsgUExYX0lOVENTUik7CisJCWlmICghKGNzcl9yZWcgJiBQTFhfSU5UQ1NSX0lOVEVOKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGVuYWJsZSBpbnRlcnJ1cHRzXG4iKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCWVyciA9IG9yaW5vY29fcGx4X2Nvcl9yZXNldChwcml2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkluaXRpYWwgcmVzZXQgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiQ0lTOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlwcmludGsoIiUwMlg6IiwgcmVhZGIoYXR0cl9tZW0gKyAyKmkpKTsKKwl9CisJcHJpbnRrKCJcbiIpOworCisJLyogVmVyaWZ5IHdoZXRoZXIgYSBzdXBwb3J0ZWQgUEMgY2FyZCBpcyBwcmVzZW50ICovCisJLyogRklYTUU6IHdlIHByb2JhYmx5IG5lZWQgdG8gYmUgc21hcnRlZCBhYm91dCB0aGlzICovCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihjaXNfbWFnaWMpOyBpKyspIHsKKwkJaWYgKGNpc19tYWdpY1tpXSAhPSByZWFkYihhdHRyX21lbSArMippKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVGhlIENJUyB2YWx1ZSBvZiBQcmlzbTIgUEMgIgorCQkJICAgICAgICJjYXJkIGlzIHVuZXhwZWN0ZWRcbiIpOworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IHJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCisJcmV0dXJuIDA7CisKKyBmYWlsOgorCWZyZWVfaXJxKHBkZXYtPmlycSwgZGV2KTsKKworIGZhaWxfaXJxOgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX29yaW5vY29kZXYoZGV2KTsKKworIGZhaWxfYWxsb2M6CisJcGNpX2lvdW5tYXAocGRldiwgbWVtKTsKKworIGZhaWxfbWFwX2lvOgorCWlvdW5tYXAoYXR0cl9tZW0pOworCisgZmFpbF9tYXBfYXR0cjoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCisgZmFpbF9yZXNvdXJjZXM6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IG9yaW5vY29fcGx4X3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgb3Jpbm9jb19wbHhfY2FyZCAqY2FyZCA9IHByaXYtPmNhcmQ7CisJdTggX19pb21lbSAqYXR0cl9tZW0gPSBjYXJkLT5hdHRyX21lbTsKKworCUJVR19PTighIGRldik7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX29yaW5vY29kZXYoZGV2KTsKKwlwY2lfaW91bm1hcChwZGV2LCBwcml2LT5ody5pb2Jhc2UpOworCWlvdW5tYXAoYXR0cl9tZW0pOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBvcmlub2NvX3BseF9wY2lfaWRfdGFibGVbXSA9IHsKKwl7MHgxMTFhLCAweDEwMjMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwJLyogU2llbWVucyBTcGVlZFN0cmVhbSBTUzEwMjMgKi8KKwl7MHgxMzg1LCAweDQxMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwJLyogTmV0Z2VhciBNQTMwMSAqLworCXsweDE1ZTgsIDB4MDEzMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAkvKiBDb3JyZWdhICAtIGRvZXMgdGhpcyB3b3JrPyAqLworCXsweDE2MzgsIDB4MTEwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAkvKiBTTUMgRVpDb25uZWN0IFNNQzI2MDJXLAorCQkJCQkJCSAgIEV1bWl0Y29tIFBDSSBXTDExMDAwLAorCQkJCQkJCSAgIEFkZHRyb24gQVdBLTEwMCAqLworCXsweDE2YWIsIDB4MTEwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAkvKiBHbG9iYWwgU3VuIFRlY2ggR0wyNDExMFAgKi8KKwl7MHgxNmFiLCAweDExMDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwJLyogUmVwb3J0ZWQgd29ya2luZywgYnV0IHVua25vd24gKi8KKwl7MHgxNmFiLCAweDExMDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsfSwJLyogTGlua3N5cyBXRFQxMSAqLworCXsweDE2ZWMsIDB4MzY4NSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAkvKiBVU1IgMjQxNSAqLworCXsweGVjODAsIDB4ZWMwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAkvKiBCZWxraW4gRjVENjAwMCB0ZXN0ZWQgYnkKKwkJCQkJCQkgICBCcmVuZGFuIFcuIE1jQWRhbXMgPHJpdCBBVCBqYWNrZWQtaW4ub3JnPiAqLworCXsweDEwYjcsIDB4Nzc3MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAkvKiAzQ29tIEFpckNvbm5lY3QgUENJIHRlc3RlZCBieQorCQkJCQkJCSAgIERhbWllbiBQZXJzb2huIDxkYW1pZW4gQVQgcGVyc29obi5uZXQ+ICovCisJezAsfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBvcmlub2NvX3BseF9wY2lfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgb3Jpbm9jb19wbHhfZHJpdmVyID0geworCS5uYW1lCQk9IERSSVZFUl9OQU1FLAorCS5pZF90YWJsZQk9IG9yaW5vY29fcGx4X3BjaV9pZF90YWJsZSwKKwkucHJvYmUJCT0gb3Jpbm9jb19wbHhfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChvcmlub2NvX3BseF9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0gRFJJVkVSX05BTUUgIiAiIERSSVZFUl9WRVJTSU9OCisJIiAoUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4sIgorCSIgRGF2aWQgR2lic29uIDxoZXJtZXNAZ2lic29uLmRyb3BiZWFyLmlkLmF1PiwiCisJIiBEYW5pZWwgQmFybG93IDxkYW5AdGVsZW50Lm5ldD4pIjsKK01PRFVMRV9BVVRIT1IoIkRhbmllbCBCYXJsb3cgPGRhbkB0ZWxlbnQubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIHdpcmVsZXNzIExBTiBjYXJkcyB1c2luZyB0aGUgUExYOTA1MiBQQ0kgYnJpZGdlIik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBNUEwvR1BMIik7CisKK3N0YXRpYyBpbnQgX19pbml0IG9yaW5vY29fcGx4X2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIHZlcnNpb24pOworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJm9yaW5vY29fcGx4X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvcmlub2NvX3BseF9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZvcmlub2NvX3BseF9kcml2ZXIpOworCXNzbGVlcCgxKTsKK30KKworbW9kdWxlX2luaXQob3Jpbm9jb19wbHhfaW5pdCk7Cittb2R1bGVfZXhpdChvcmlub2NvX3BseF9leGl0KTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWluZGVudC1sZXZlbDogOAorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiAgdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fdG1kLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3RtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ODkzZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX3RtZC5jCkBAIC0wLDAgKzEsMjc2IEBACisvKiBvcmlub2NvX3RtZC5jCisgKiAKKyAqIERyaXZlciBmb3IgUHJpc20gSUkgZGV2aWNlcyB3aGljaCB3b3VsZCB1c3VhbGx5IGJlIGRyaXZlbiBieSBvcmlub2NvX2NzLAorICogYnV0IGFyZSBjb25uZWN0ZWQgdG8gdGhlIFBDSSBidXMgYnkgYSBUTUQ3MTYwLiAKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgSm9lcmcgRG9yY2hhaW4gPGpvZXJnIEFUIGRvcmNoYWluLm5ldD4KKyAqIGJhc2VkIGhlYXZpbHkgdXBvbiBvcmlub2NvX3BseC5jIENvcHlyaWdodCAoQykgMjAwMSBEYW5pZWwgQmFybG93CisgKgorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZQorICogVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbgorICogY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UKKyAqIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworICoKKyAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIKKyAqIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUKKyAqIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpLCBpbgorICogd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlCisgKiBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQorICogb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91cgorICogdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieQorICogZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kCisgKiBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuICBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUKKyAqIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQorICogdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KKworICogQ2F1dGlvbjogdGhpcyBpcyBleHBlcmltZW50YWwgYW5kIHByb2JhYmx5IGJ1Z2d5LiAgRm9yIHN1Y2Nlc3MgYW5kCisgKiBmYWlsdXJlIHJlcG9ydHMgZm9yIGRpZmZlcmVudCBjYXJkcyBhbmQgYWRhcHRvcnMsIHNlZQorICogb3Jpbm9jb190bWRfcGNpX2lkX3RhYmxlIG5lYXIgdGhlIGVuZCBvZiB0aGUgZmlsZS4gIElmIHlvdSBoYXZlIGEKKyAqIGNhcmQgd2UgZG9uJ3QgaGF2ZSB0aGUgUENJIGlkIGZvciwgYW5kIGxvb2tzIGxpa2UgaXQgc2hvdWxkIHdvcmssCisgKiBkcm9wIG1lIG1haWwgd2l0aCB0aGUgaWQgYW5kICJpdCB3b3JrcyIvIml0IGRvZXNuJ3Qgd29yayIuCisgKgorICogTm90ZTogaWYgZXZlcnl0aGluZyBnZXRzIGRldGVjdGVkIGZpbmUgYnV0IGl0IGRvZXNuJ3QgYWN0dWFsbHkgc2VuZAorICogb3IgcmVjZWl2ZSBwYWNrZXRzLCB5b3VyIGZpcnN0IHBvcnQgb2YgY2FsbCBzaG91bGQgcHJvYmFibHkgYmUgdG8gICAKKyAqIHRyeSBuZXdlciBmaXJtd2FyZSBpbiB0aGUgY2FyZC4gIEVzcGVjaWFsbHkgaWYgeW91J3JlIGRvaW5nIEFkLUhvYworICogbW9kZXMKKyAqCisgKiBUaGUgYWN0dWFsIGRyaXZpbmcgaXMgZG9uZSBieSBvcmlub2NvLmMsIHRoaXMgaXMganVzdCByZXNvdXJjZQorICogYWxsb2NhdGlvbiBzdHVmZi4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBtb2RlbGVkIGFmdGVyIHRoZSBvcmlub2NvX3BseCBkcml2ZXIuIFRoZSBtYWluCisgKiBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIFRNRCBjaGlwIGhhcyBvbmx5IElPIHBvcnQgcmFuZ2VzIGFuZCBubworICogbWVtb3J5IHNwYWNlLCBpLmUuICBubyBhY2Nlc3MgdG8gdGhlIENJUy4gQ29tcGFyZWQgdG8gdGhlIFBMWCBjaGlwLAorICogdGhlIGlvIHJhbmdlIGZ1bmN0aW9uYWxpdGllcyBhcmUgZXhjaGFuZ2VkLgorICoKKyAqIFBoZWVjb20gc2VsbHMgY2FyZHMgd2l0aCB0aGUgVE1EIGNoaXAgYXMgIkFTSUMgdmVyc2lvbiIKKyAqLworCisjZGVmaW5lIERSSVZFUl9OQU1FICJvcmlub2NvX3RtZCIKKyNkZWZpbmUgUEZYIERSSVZFUl9OQU1FICI6ICIKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKworI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KKworI2luY2x1ZGUgImhlcm1lcy5oIgorI2luY2x1ZGUgIm9yaW5vY28uaCIKKworI2RlZmluZSBDT1JfVkFMVUUJKENPUl9MRVZFTF9SRVEgfCBDT1JfRlVOQ19FTkEpIC8qIEVuYWJsZSBQQyBjYXJkIHdpdGggaW50ZXJydXB0IGluIGxldmVsIHRyaWdnZXIgKi8KKyNkZWZpbmUgQ09SX1JFU0VUICAgICAoMHg4MCkJLyogcmVzZXQgYml0IGluIHRoZSBDT1IgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVE1EX1JFU0VUX1RJTUUJKDUwMCkJLyogbWlsbGlzZWNvbmRzICovCisKKy8qIE9yaW5vY28gVE1EIHNwZWNpZmljIGRhdGEgKi8KK3N0cnVjdCBvcmlub2NvX3RtZF9jYXJkIHsKKwl1MzIgdG1kX2lvOworfTsKKworCisvKgorICogRG8gYSBzb2Z0IHJlc2V0IG9mIHRoZSBjYXJkIHVzaW5nIHRoZSBDb25maWd1cmF0aW9uIE9wdGlvbiBSZWdpc3RlcgorICovCitzdGF0aWMgaW50IG9yaW5vY29fdG1kX2Nvcl9yZXNldChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQoreworCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwlzdHJ1Y3Qgb3Jpbm9jb190bWRfY2FyZCAqY2FyZCA9IHByaXYtPmNhcmQ7CisJdTMyIGFkZHIgPSBjYXJkLT50bWRfaW87CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXUxNiByZWc7CisKKwlvdXRiKENPUl9WQUxVRSB8IENPUl9SRVNFVCwgYWRkcik7CisJbWRlbGF5KDEpOworCisJb3V0YihDT1JfVkFMVUUsIGFkZHIpOworCW1kZWxheSgxKTsKKworCS8qIEp1c3QgaW4gY2FzZSwgd2FpdCBtb3JlIHVudGlsIHRoZSBjYXJkIGlzIG5vIGxvbmdlciBidXN5ICovCisJdGltZW91dCA9IGppZmZpZXMgKyAoVE1EX1JFU0VUX1RJTUUgKiBIWiAvIDEwMDApOworCXJlZyA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIENNRCk7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpICYmIChyZWcgJiBIRVJNRVNfQ01EX0JVU1kpKSB7CisJCW1kZWxheSgxKTsKKwkJcmVnID0gaGVybWVzX3JlYWRfcmVnbihodywgQ01EKTsKKwl9CisKKwkvKiBEaWQgd2UgdGltZW91dCA/ICovCisJaWYgKHJlZyAmIEhFUk1FU19DTURfQlVTWSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJCdXN5IHRpbWVvdXRcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG9yaW5vY29fdG1kX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IE5VTEw7CisJc3RydWN0IG9yaW5vY29fdG1kX2NhcmQgKmNhcmQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJdm9pZCBfX2lvbWVtICptZW07CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBlbmFibGUgUENJIGRldmljZVxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUklWRVJfTkFNRSk7CisJaWYgKGVyciAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlc1xuIik7CisJCWdvdG8gZmFpbF9yZXNvdXJjZXM7CisJfQorCisJbWVtID0gcGNpX2lvbWFwKHBkZXYsIDIsIDApOworCWlmICghIG1lbSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfaW9tYXA7CisJfQorCisJLyogQWxsb2NhdGUgbmV0d29yayBkZXZpY2UgKi8KKwlkZXYgPSBhbGxvY19vcmlub2NvZGV2KHNpemVvZigqY2FyZCksIG9yaW5vY29fdG1kX2Nvcl9yZXNldCk7CisJaWYgKCEgZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBhbGxvY2F0ZSBuZXR3b3JrIGRldmljZVxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9hbGxvYzsKKwl9CisKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljYXJkID0gcHJpdi0+Y2FyZDsKKwljYXJkLT50bWRfaW8gPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisJZGV2LT5iYXNlX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMik7CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwloZXJtZXNfc3RydWN0X2luaXQoJnByaXYtPmh3LCBtZW0sIEhFUk1FU18xNkJJVF9SRUdTUEFDSU5HKTsKKworCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiRGV0ZWN0ZWQgT3Jpbm9jby9QcmlzbTIgVE1EIGRldmljZSAiCisJICAgICAgICJhdCAlcyBpcnE6JWQsIGlvIGFkZHI6MHglbHhcbiIsIHBjaV9uYW1lKHBkZXYpLCBwZGV2LT5pcnEsCisJICAgICAgIGRldi0+YmFzZV9hZGRyKTsKKworCWVyciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgb3Jpbm9jb19pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJICBkZXYtPm5hbWUsIGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgYWxsb2NhdGUgSVJRICVkXG4iLCBwZGV2LT5pcnEpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZmFpbF9pcnE7CisJfQorCWRldi0+aXJxID0gcGRldi0+aXJxOworCisJZXJyID0gb3Jpbm9jb190bWRfY29yX3Jlc2V0KHByaXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSW5pdGlhbCByZXNldCBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgcmVnaXN0ZXIgbmV0d29yayBkZXZpY2VcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlyZXR1cm4gMDsKKworIGZhaWw6CisJZnJlZV9pcnEocGRldi0+aXJxLCBkZXYpOworCisgZmFpbF9pcnE6CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfb3Jpbm9jb2RldihkZXYpOworCisgZmFpbF9hbGxvYzoKKwlwY2lfaW91bm1hcChwZGV2LCBtZW0pOworCisgZmFpbF9pb21hcDoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCisgZmFpbF9yZXNvdXJjZXM6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IG9yaW5vY29fdG1kX3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gZGV2LT5wcml2OworCisJQlVHX09OKCEgZGV2KTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfb3Jpbm9jb2RldihkZXYpOworCXBjaV9pb3VubWFwKHBkZXYsIHByaXYtPmh3LmlvYmFzZSk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG9yaW5vY29fdG1kX3BjaV9pZF90YWJsZVtdID0geworCXsweDE1ZTgsIDB4MDEzMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LCAgICAgIC8qIE5EQyBhbmQgT0VNcywgZS5nLiBwaGVlY29tICovCisJezAsfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBvcmlub2NvX3RtZF9wY2lfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgb3Jpbm9jb190bWRfZHJpdmVyID0geworCS5uYW1lCQk9IERSSVZFUl9OQU1FLAorCS5pZF90YWJsZQk9IG9yaW5vY29fdG1kX3BjaV9pZF90YWJsZSwKKwkucHJvYmUJCT0gb3Jpbm9jb190bWRfaW5pdF9vbmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChvcmlub2NvX3RtZF9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2luaXRkYXRhID0gRFJJVkVSX05BTUUgIiAiIERSSVZFUl9WRVJTSU9OCisJIiAoSm9lcmcgRG9yY2hhaW4gPGpvZXJnQGRvcmNoYWluLm5ldD4pIjsKK01PRFVMRV9BVVRIT1IoIkpvZXJnIERvcmNoYWluIDxqb2VyZ0Bkb3JjaGFpbi5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3Igd2lyZWxlc3MgTEFOIGNhcmRzIHVzaW5nIHRoZSBUTUQ3MTYwIFBDSSBicmlkZ2UiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIE1QTC9HUEwiKTsKKworc3RhdGljIGludCBfX2luaXQgb3Jpbm9jb190bWRfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgdmVyc2lvbik7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmb3Jpbm9jb190bWRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG9yaW5vY29fdG1kX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm9yaW5vY29fdG1kX2RyaXZlcik7CisJc3NsZWVwKDEpOworfQorCittb2R1bGVfaW5pdChvcmlub2NvX3RtZF9pbml0KTsKK21vZHVsZV9leGl0KG9yaW5vY29fdG1kX2V4aXQpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtaW5kZW50LWxldmVsOiA4CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqICB0YWItd2lkdGg6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFkMzA1YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvTWFrZWZpbGUKQEAgLTAsMCArMSw4IEBACisjICRJZDogTWFrZWZpbGUuazI2LHYgMS43IDIwMDQvMDEvMzAgMTY6MjQ6MDAgYWpmYSBFeHAgJAorCitwcmlzbTU0LW9ianMgOj0gaXNscGNpX2V0aC5vIGlzbHBjaV9tZ3QubyBcCisgICAgICAgICAgICAgICAgaXNsXzM4eHgubyBpc2xfaW9jdGwubyBpc2xwY2lfZGV2Lm8gXAorCQlpc2xwY2lfaG90cGx1Zy5vIG9pZF9tZ3QubworCitvYmotJChDT05GSUdfUFJJU001NCkgKz0gcHJpc201NC5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsXzM4eHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsXzM4eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDgxZWMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfMzh4eC5jCkBAIC0wLDAgKzEsMjYwIEBACisvKgorICogIAorICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTHVpcyBSLiBSb2RyaWd1ZXogPG1jZ3JvZkBydXNsdWcucnV0Z2Vycy5lZHU+XworICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJwcmlzbWNvbXBhdC5oIgorI2luY2x1ZGUgImlzbF8zOHh4LmgiCisjaW5jbHVkZSAiaXNscGNpX2Rldi5oIgorI2luY2x1ZGUgImlzbHBjaV9tZ3QuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIERldmljZSBJbnRlcmZhY2UgJiBDb250cm9sIGZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIGlzbDM4eHhfZGlzYWJsZV9pbnRlcnJ1cHRzIC0gZGlzYWJsZSBhbGwgaW50ZXJydXB0cworICogQGRldmljZTogcGNpIG1lbW9yeSBiYXNlIGFkZHJlc3MKKyAqCisgKiAgSW5zdHJ1Y3RzIHRoZSBkZXZpY2UgdG8gZGlzYWJsZSBhbGwgaW50ZXJydXB0IHJlcG9ydGluZyBieSBhc3NlcnRpbmcgCisgKiAgdGhlIElSUSBsaW5lLiBOZXcgZXZlbnRzIG1heSBzdGlsbCBzaG93IHVwIGluIHRoZSBpbnRlcnJ1cHQgaWRlbnRpZmljYXRpb24KKyAqICByZWdpc3RlciBsb2NhdGVkIGF0IG9mZnNldCAlSVNMMzhYWF9JTlRfSURFTlRfUkVHLgorICovCit2b2lkCitpc2wzOHh4X2Rpc2FibGVfaW50ZXJydXB0cyh2b2lkIF9faW9tZW0gKmRldmljZSkKK3sKKwlpc2wzOHh4X3czMl9mbHVzaChkZXZpY2UsIDB4MDAwMDAwMDAsIElTTDM4WFhfSU5UX0VOX1JFRyk7CisJdWRlbGF5KElTTDM4WFhfV1JJVEVJT19ERUxBWSk7Cit9CisKK3ZvaWQKK2lzbDM4eHhfaGFuZGxlX3NsZWVwX3JlcXVlc3QoaXNsMzh4eF9jb250cm9sX2Jsb2NrICpjb250cm9sX2Jsb2NrLAorCQkJICAgICBpbnQgKnBvd2Vyc3RhdGUsIHZvaWQgX19pb21lbSAqZGV2aWNlX2Jhc2UpCit7CisJLyogZGV2aWNlIHJlcXVlc3RzIHRvIGdvIGludG8gc2xlZXAgbW9kZQorCSAqIGNoZWNrIHdoZXRoZXIgdGhlIHRyYW5zbWl0IHF1ZXVlcyBmb3IgZGF0YSBhbmQgbWFuYWdlbWVudCBhcmUgZW1wdHkgKi8KKwlpZiAoaXNsMzh4eF9pbl9xdWV1ZShjb250cm9sX2Jsb2NrLCBJU0wzOFhYX0NCX1RYX0RBVEFfTFEpKQorCQkvKiBkYXRhIHR4IHF1ZXVlIG5vdCBlbXB0eSAqLworCQlyZXR1cm47CisKKwlpZiAoaXNsMzh4eF9pbl9xdWV1ZShjb250cm9sX2Jsb2NrLCBJU0wzOFhYX0NCX1RYX01HTVRRKSkKKwkJLyogbWFuYWdlbWVudCB0eCBxdWV1ZSBub3QgZW1wdHkgKi8KKwkJcmV0dXJuOworCisJLyogY2hlY2sgYWxzbyB3aGV0aGVyIHJlY2VpdmVkIGZyYW1lcyBhcmUgcGVuZGluZyAqLworCWlmIChpc2wzOHh4X2luX3F1ZXVlKGNvbnRyb2xfYmxvY2ssIElTTDM4WFhfQ0JfUlhfREFUQV9MUSkpCisJCS8qIGRhdGEgcnggcXVldWUgbm90IGVtcHR5ICovCisJCXJldHVybjsKKworCWlmIChpc2wzOHh4X2luX3F1ZXVlKGNvbnRyb2xfYmxvY2ssIElTTDM4WFhfQ0JfUlhfTUdNVFEpKQorCQkvKiBtYW5hZ2VtZW50IHJ4IHF1ZXVlIG5vdCBlbXB0eSAqLworCQlyZXR1cm47CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCURFQlVHKFNIT1dfVFJBQ0lORywgIkRldmljZSBnb2luZyB0byBzbGVlcCBtb2RlXG4iKTsKKyNlbmRpZgorCisJLyogYWxsIHF1ZXVlcyBhcmUgZW1wdHksIGFsbG93IHRoZSBkZXZpY2UgdG8gZ28gaW50byBzbGVlcCBtb2RlICovCisJKnBvd2Vyc3RhdGUgPSBJU0wzOFhYX1BTTV9QT1dFUlNBVkVfU1RBVEU7CisKKwkvKiBhc3NlcnQgdGhlIFNsZWVwIGludGVycnVwdCBpbiB0aGUgRGV2aWNlIEludGVycnVwdCBSZWdpc3RlciAqLworCWlzbDM4eHhfdzMyX2ZsdXNoKGRldmljZV9iYXNlLCBJU0wzOFhYX0RFVl9JTlRfU0xFRVAsCisJCQkgIElTTDM4WFhfREVWX0lOVF9SRUcpOworCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOworfQorCit2b2lkCitpc2wzOHh4X2hhbmRsZV93YWtldXAoaXNsMzh4eF9jb250cm9sX2Jsb2NrICpjb250cm9sX2Jsb2NrLAorCQkgICAgICBpbnQgKnBvd2Vyc3RhdGUsIHZvaWQgX19pb21lbSAqZGV2aWNlX2Jhc2UpCit7CisJLyogZGV2aWNlIGlzIGluIGFjdGl2ZSBzdGF0ZSwgdXBkYXRlIHRoZSBwb3dlcnN0YXRlIGZsYWcgKi8KKwkqcG93ZXJzdGF0ZSA9IElTTDM4WFhfUFNNX0FDVElWRV9TVEFURTsKKworCS8qIG5vdyBjaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBmcmFtZXMgcGVuZGluZyBmb3IgdGhlIGNhcmQgKi8KKwlpZiAoIWlzbDM4eHhfaW5fcXVldWUoY29udHJvbF9ibG9jaywgSVNMMzhYWF9DQl9UWF9EQVRBX0xRKQorCSAgICAmJiAhaXNsMzh4eF9pbl9xdWV1ZShjb250cm9sX2Jsb2NrLCBJU0wzOFhYX0NCX1RYX01HTVRRKSkKKwkJcmV0dXJuOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX0FOWVRISU5HLCAiV2FrZSB1cCBoYW5kbGVyIHRyaWdnZXIgdGhlIGRldmljZVxuIik7CisjZW5kaWYKKworCS8qIGVpdGhlciBkYXRhIG9yIG1hbmFnZW1lbnQgdHJhbnNtaXQgcXVldWUgaGFzIGEgZnJhbWUgcGVuZGluZworCSAqIHRyaWdnZXIgdGhlIGRldmljZSBieSBzZXR0aW5nIHRoZSBVcGRhdGUgYml0IGluIHRoZSBEZXZpY2UgSW50IHJlZyAqLworCWlzbDM4eHhfdzMyX2ZsdXNoKGRldmljZV9iYXNlLCBJU0wzOFhYX0RFVl9JTlRfVVBEQVRFLAorCQkJICBJU0wzOFhYX0RFVl9JTlRfUkVHKTsKKwl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKK30KKwordm9pZAoraXNsMzh4eF90cmlnZ2VyX2RldmljZShpbnQgYXNsZWVwLCB2b2lkIF9faW9tZW0gKmRldmljZV9iYXNlKQoreworCXN0cnVjdCB0aW1ldmFsIGN1cnJlbnRfdGltZTsKKwl1MzIgcmVnLCBjb3VudGVyID0gMDsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJREVCVUcoU0hPV19GVU5DVElPTl9DQUxMUywgImlzbDM4eHggdHJpZ2dlciBkZXZpY2VcbiIpOworI2VuZGlmCisKKwkvKiBjaGVjayB3aGV0aGVyIHRoZSBkZXZpY2UgaXMgaW4gcG93ZXIgc2F2ZSBtb2RlICovCisJaWYgKGFzbGVlcCkgeworCQkvKiBkZXZpY2UgaXMgaW4gcG93ZXJzYXZlLCB0cmlnZ2VyIHRoZSBkZXZpY2UgZm9yIHdha2V1cCAqLworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCWRvX2dldHRpbWVvZmRheSgmY3VycmVudF90aW1lKTsKKwkJREVCVUcoU0hPV19UUkFDSU5HLCAiJTA4bGkuJTA4bGkgRGV2aWNlIHdha2V1cCB0cmlnZ2VyZWRcbiIsCisJCSAgICAgIGN1cnJlbnRfdGltZS50dl9zZWMsIChsb25nKWN1cnJlbnRfdGltZS50dl91c2VjKTsKKyNlbmRpZgorCisJCURFQlVHKFNIT1dfVFJBQ0lORywgIiUwOGxpLiUwOGxpIERldmljZSByZWdpc3RlciByZWFkICUwOHhcbiIsCisJCSAgICAgIGN1cnJlbnRfdGltZS50dl9zZWMsIChsb25nKWN1cnJlbnRfdGltZS50dl91c2VjLAorCQkgICAgICByZWFkbChkZXZpY2VfYmFzZSArIElTTDM4WFhfQ1RSTF9TVEFUX1JFRykpOworCQl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKKworCQlyZWcgPSByZWFkbChkZXZpY2VfYmFzZSArIElTTDM4WFhfSU5UX0lERU5UX1JFRyk7CisJCWlmIChyZWcgPT0gMHhhYmFkZmFjZSkgeworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCQlkb19nZXR0aW1lb2ZkYXkoJmN1cnJlbnRfdGltZSk7CisJCQlERUJVRyhTSE9XX1RSQUNJTkcsCisJCQkgICAgICAiJTA4bGkuJTA4bGkgRGV2aWNlIHJlZ2lzdGVyIGFiYWRmYWNlXG4iLAorCQkJICAgICAgY3VycmVudF90aW1lLnR2X3NlYywgKGxvbmcpY3VycmVudF90aW1lLnR2X3VzZWMpOworI2VuZGlmCisJCQkvKiByZWFkIHRoZSBEZXZpY2UgU3RhdHVzIFJlZ2lzdGVyIHVudGlsIFNsZWVwbW9kZSBiaXQgaXMgc2V0ICovCisJCQl3aGlsZSAocmVnID0gcmVhZGwoZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpLAorCQkJICAgICAgIChyZWcgJiBJU0wzOFhYX0NUUkxfU1RBVF9TTEVFUE1PREUpID09IDApIHsKKwkJCQl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKKwkJCQljb3VudGVyKys7CisJCQl9CisKKwkJCURFQlVHKFNIT1dfVFJBQ0lORywKKwkJCSAgICAgICIlMDhsaS4lMDhsaSBEZXZpY2UgcmVnaXN0ZXIgcmVhZCAlMDh4XG4iLAorCQkJICAgICAgY3VycmVudF90aW1lLnR2X3NlYywgKGxvbmcpY3VycmVudF90aW1lLnR2X3VzZWMsCisJCQkgICAgICByZWFkbChkZXZpY2VfYmFzZSArIElTTDM4WFhfQ1RSTF9TVEFUX1JFRykpOworCQkJdWRlbGF5KElTTDM4WFhfV1JJVEVJT19ERUxBWSk7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQkJZG9fZ2V0dGltZW9mZGF5KCZjdXJyZW50X3RpbWUpOworCQkJREVCVUcoU0hPV19UUkFDSU5HLAorCQkJICAgICAgIiUwOGxpLiUwOGxpIERldmljZSBhc2xlZXAgY291bnRlciAlaVxuIiwKKwkJCSAgICAgIGN1cnJlbnRfdGltZS50dl9zZWMsIChsb25nKWN1cnJlbnRfdGltZS50dl91c2VjLAorCQkJICAgICAgY291bnRlcik7CisjZW5kaWYKKwkJfQorCQkvKiBhc3NlcnQgdGhlIFdha2V1cCBpbnRlcnJ1cHQgaW4gdGhlIERldmljZSBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KKwkJaXNsMzh4eF93MzJfZmx1c2goZGV2aWNlX2Jhc2UsIElTTDM4WFhfREVWX0lOVF9XQUtFVVAsCisJCQkJICBJU0wzOFhYX0RFVl9JTlRfUkVHKTsKKwkJdWRlbGF5KElTTDM4WFhfV1JJVEVJT19ERUxBWSk7CisKKwkJLyogcGVyZm9ybSBhbm90aGVyIHJlYWQgb24gdGhlIERldmljZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKwkJcmVnID0gcmVhZGwoZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpOworCQl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCWRvX2dldHRpbWVvZmRheSgmY3VycmVudF90aW1lKTsKKwkJREVCVUcoU0hPV19UUkFDSU5HLCAiJTA4bGkuJTA4bGkgRGV2aWNlIHJlZ2lzdGVyIHJlYWQgJTA4eFxuIiwKKwkJICAgICAgY3VycmVudF90aW1lLnR2X3NlYywgKGxvbmcpY3VycmVudF90aW1lLnR2X3VzZWMsIHJlZyk7CisjZW5kaWYKKwl9IGVsc2UgeworCQkvKiBkZXZpY2UgaXMgKHN0aWxsKSBhd2FrZSAgKi8KKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQlERUJVRyhTSE9XX1RSQUNJTkcsICJEZXZpY2UgaXMgaW4gYWN0aXZlIHN0YXRlXG4iKTsKKyNlbmRpZgorCQkvKiB0cmlnZ2VyIHRoZSBkZXZpY2UgYnkgc2V0dGluZyB0aGUgVXBkYXRlIGJpdCBpbiB0aGUgRGV2aWNlIEludCByZWcgKi8KKworCQlpc2wzOHh4X3czMl9mbHVzaChkZXZpY2VfYmFzZSwgSVNMMzhYWF9ERVZfSU5UX1VQREFURSwKKwkJCQkgIElTTDM4WFhfREVWX0lOVF9SRUcpOworCQl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKKwl9Cit9CisKK3ZvaWQKK2lzbDM4eHhfaW50ZXJmYWNlX3Jlc2V0KHZvaWQgX19pb21lbSAqZGV2aWNlX2Jhc2UsIGRtYV9hZGRyX3QgaG9zdF9hZGRyZXNzKQoreworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJREVCVUcoU0hPV19GVU5DVElPTl9DQUxMUywgImlzbDM4eHhfaW50ZXJmYWNlX3Jlc2V0XG4iKTsKKyNlbmRpZgorCisJLyogbG9hZCB0aGUgYWRkcmVzcyBvZiB0aGUgY29udHJvbCBibG9jayBpbiB0aGUgZGV2aWNlICovCisJaXNsMzh4eF93MzJfZmx1c2goZGV2aWNlX2Jhc2UsIGhvc3RfYWRkcmVzcywgSVNMMzhYWF9DVFJMX0JMS19CQVNFX1JFRyk7CisJdWRlbGF5KElTTDM4WFhfV1JJVEVJT19ERUxBWSk7CisKKwkvKiBzZXQgdGhlIHJlc2V0IGJpdCBpbiB0aGUgRGV2aWNlIEludGVycnVwdCBSZWdpc3RlciAqLworCWlzbDM4eHhfdzMyX2ZsdXNoKGRldmljZV9iYXNlLCBJU0wzOFhYX0RFVl9JTlRfUkVTRVQsIElTTDM4WFhfREVWX0lOVF9SRUcpOworCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOworCisJLyogZW5hYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIGRldGVjdGluZyBpbml0aWFsaXphdGlvbiAqLworCisJLyogTm90ZTogRG8gbm90IGVuYWJsZSBvdGhlciBpbnRlcnJ1cHRzIGhlcmUuIFdlIHdhbnQgdGhlCisJICogZGV2aWNlIHRvIGhhdmUgY29tZSB1cCBmaXJzdCAxMDAlIGJlZm9yZSBhbGxvd2luZyBhbnkgb3RoZXIgCisJICogaW50ZXJydXB0cy4gKi8KKwlpc2wzOHh4X3czMl9mbHVzaChkZXZpY2VfYmFzZSwgSVNMMzhYWF9JTlRfSURFTlRfSU5JVCwgSVNMMzhYWF9JTlRfRU5fUkVHKTsKKwl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsgIC8qIGFsbG93IGNvbXBsZXRlIGZ1bGwgcmVzZXQgKi8KK30KKwordm9pZAoraXNsMzh4eF9lbmFibGVfY29tbW9uX2ludGVycnVwdHModm9pZCBfX2lvbWVtICpkZXZpY2VfYmFzZSkgeworCXUzMiByZWc7CisJcmVnID0gKCBJU0wzOFhYX0lOVF9JREVOVF9VUERBVEUgfCAKKwkJCUlTTDM4WFhfSU5UX0lERU5UX1NMRUVQIHwgSVNMMzhYWF9JTlRfSURFTlRfV0FLRVVQKTsKKwlpc2wzOHh4X3czMl9mbHVzaChkZXZpY2VfYmFzZSwgcmVnLCBJU0wzOFhYX0lOVF9FTl9SRUcpOworCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOworfQorCitpbnQKK2lzbDM4eHhfaW5fcXVldWUoaXNsMzh4eF9jb250cm9sX2Jsb2NrICpjYiwgaW50IHF1ZXVlKQoreworCWNvbnN0IHMzMiBkZWx0YSA9IChsZTMyX3RvX2NwdShjYi0+ZHJpdmVyX2N1cnJfZnJhZ1txdWV1ZV0pIC0KKwkJCSAgIGxlMzJfdG9fY3B1KGNiLT5kZXZpY2VfY3Vycl9mcmFnW3F1ZXVlXSkpOworCisJLyogZGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgZnJhZ21lbnRzIGluIHRoZSBxdWV1ZSBkZXBlbmRpbmcgb24gdGhlIHR5cGUKKwkgKiBvZiB0aGUgcXVldWUsIGVpdGhlciB0cmFuc21pdCBvciByZWNlaXZlICovCisKKwlCVUdfT04oZGVsdGEgPCAwKTsJLyogZHJpdmVyIHB0ciBtdXN0IGJlIGFoZWFkIG9mIGRldmljZSBwdHIgKi8KKworCXN3aXRjaCAocXVldWUpIHsKKwkJLyogc2VuZCBxdWV1ZXMgKi8KKwljYXNlIElTTDM4WFhfQ0JfVFhfTUdNVFE6CisJCUJVR19PTihkZWx0YSA+IElTTDM4WFhfQ0JfTUdNVF9RU0laRSk7CisJY2FzZSBJU0wzOFhYX0NCX1RYX0RBVEFfTFE6CisJY2FzZSBJU0wzOFhYX0NCX1RYX0RBVEFfSFE6CisJCUJVR19PTihkZWx0YSA+IElTTDM4WFhfQ0JfVFhfUVNJWkUpOworCQlyZXR1cm4gZGVsdGE7CisJCWJyZWFrOworCisJCS8qIHJlY2VpdmUgcXVldWVzICovCisJY2FzZSBJU0wzOFhYX0NCX1JYX01HTVRROgorCQlCVUdfT04oZGVsdGEgPiBJU0wzOFhYX0NCX01HTVRfUVNJWkUpOworCQlyZXR1cm4gSVNMMzhYWF9DQl9NR01UX1FTSVpFIC0gZGVsdGE7CisJCWJyZWFrOworCisJY2FzZSBJU0wzOFhYX0NCX1JYX0RBVEFfTFE6CisJY2FzZSBJU0wzOFhYX0NCX1JYX0RBVEFfSFE6CisJCUJVR19PTihkZWx0YSA+IElTTDM4WFhfQ0JfUlhfUVNJWkUpOworCQlyZXR1cm4gSVNMMzhYWF9DQl9SWF9RU0laRSAtIGRlbHRhOworCQlicmVhazsKKwl9CisJQlVHKCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF8zOHh4LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF8zOHh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzZTQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsXzM4eHguaApAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqICAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaWZuZGVmIF9JU0xfMzhYWF9ICisjZGVmaW5lIF9JU0xfMzhYWF9ICisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjZGVmaW5lIElTTDM4WFhfQ0JfUlhfUVNJWkUgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIElTTDM4WFhfQ0JfVFhfUVNJWkUgICAgICAgICAgICAgICAgICAgICAzMgorCisvKiBJU0wzOFhYIEFjY2VzcyBQb2ludCBTcGVjaWZpYyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBJU0wzOFhYX01BWF9XRFNfTElOS1MgICAgICAgICAgICAgICAgICAgOAorCisvKiBJU0wzOHh4IENsaWVudCBTcGVjaWZpYyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBJU0wzOFhYX1BTTV9BQ1RJVkVfU1RBVEUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJU0wzOFhYX1BTTV9QT1dFUlNBVkVfU1RBVEUgICAgICAgICAgICAgMQorCisvKiBJU0wzOFhYIEhvc3QgSW50ZXJmYWNlIERlZmluaXRpb25zICovCisjZGVmaW5lIElTTDM4WFhfUENJX01FTV9TSVpFICAgICAgICAgICAgICAgICAgICAweDAyMDAwCisjZGVmaW5lIElTTDM4WFhfTUVNT1JZX1dJTkRPV19TSVpFICAgICAgICAgICAgICAweDAxMDAwCisjZGVmaW5lIElTTDM4WFhfREVWX0ZJUk1XQVJFX0FERFJFUyAgICAgICAgICAgICAweDIwMDAwCisjZGVmaW5lIElTTDM4WFhfV1JJVEVJT19ERUxBWSAgICAgICAgICAgICAgICAgICAxMAkvKiBpbiB1cyAqLworI2RlZmluZSBJU0wzOFhYX1JFU0VUX0RFTEFZICAgICAgICAgICAgICAgICAgICAgNTAJLyogaW4gbXMgKi8KKyNkZWZpbmUgSVNMMzhYWF9XQUlUX0NZQ0xFICAgICAgICAgICAgICAgICAgICAgIDEwCS8qIGluIDEwbXMgKi8KKyNkZWZpbmUgSVNMMzhYWF9NQVhfV0FJVF9DWUNMRVMgICAgICAgICAgICAgICAgIDEwCisKKy8qIFBDSSBNZW1vcnkgQXJlYSAqLworI2RlZmluZSBJU0wzOFhYX0hBUkRXQVJFX1JFRyAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIElTTDM4WFhfQ0FSREJVU19DSVMgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgSVNMMzhYWF9ESVJFQ1RfTUVNX1dJTiAgICAgICAgICAgICAgICAgIDB4MTAwMAorCisvKiBIYXJkd2FyZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSVNMMzhYWF9ERVZfSU5UX1JFRyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBJU0wzOFhYX0lOVF9JREVOVF9SRUcgICAgICAgICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lIElTTDM4WFhfSU5UX0FDS19SRUcgICAgICAgICAgICAgICAgICAgICAweDAwMTQKKyNkZWZpbmUgSVNMMzhYWF9JTlRfRU5fUkVHICAgICAgICAgICAgICAgICAgICAgIDB4MDAxOAorI2RlZmluZSBJU0wzOFhYX0dFTl9QVVJQX0NPTV9SRUdfMSAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIElTTDM4WFhfR0VOX1BVUlBfQ09NX1JFR18yICAgICAgICAgICAgICAweDAwMjQKKyNkZWZpbmUgSVNMMzhYWF9DVFJMX0JMS19CQVNFX1JFRyAgICAgICAgICAgICAgIElTTDM4WFhfR0VOX1BVUlBfQ09NX1JFR18xCisjZGVmaW5lIElTTDM4WFhfRElSX01FTV9CQVNFX1JFRyAgICAgICAgICAgICAgICAweDAwMzAKKyNkZWZpbmUgSVNMMzhYWF9DVFJMX1NUQVRfUkVHICAgICAgICAgICAgICAgICAgIDB4MDA3OAorCisvKiBIaWdoIGVuZCBtb2JvcyBxdWV1ZSB1cCBwY2kgd3JpdGVzLCB0aGUgZm9sbG93aW5nCisgKiBpcyB1c2VkIHRvICJyZWFkIiBmcm9tIGFmdGVyIGEgd3JpdGUgdG8gZm9yY2UgZmx1c2ggKi8KKyNkZWZpbmUgSVNMMzhYWF9QQ0lfUE9TVElOR19GTFVTSAkJSVNMMzhYWF9JTlRfRU5fUkVHCisKKy8qKgorICogaXNsMzh4eF93MzJfZmx1c2ggLSBQQ0kgaW9tZW0gd3JpdGUgaGVscGVyCisgKiBAYmFzZTogKGhvc3QpIG1lbW9yeSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRldmljZQorICogQHZhbDogMzJiaXQgdmFsdWUgKGhvc3Qgb3JkZXIpIHRvIHdyaXRlCisgKiBAb2Zmc2V0OiBieXRlIG9mZnNldCBpbnRvIEBiYXNlIHRvIHdyaXRlIHZhbHVlIHRvCisgKiAKKyAqICBUaGlzIGhlbHBlciB0YWtlcyBjYXJlIG9mIHdyaXRpbmcgYSAzMmJpdCBkYXR1bSB0byB0aGUKKyAqICBzcGVjaWZpZWQgb2Zmc2V0IGludG8gdGhlIGRldmljZSdzIHBjaSBtZW1vcnkgc3BhY2UsIGFuZCBtYWtpbmcgc3VyZSAKKyAqICB0aGUgcGNpIG1lbW9yeSBidWZmZXJzIGdldCBmbHVzaGVkIGJ5IHBlcmZvcm1pbmcgb25lIGhhcm1sZXNzIHJlYWQgCisgKiAgZnJvbSB0aGUgJUlTTDM4WFhfUENJX1BPU1RJTkdfRkxVU0ggb2Zmc2V0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2lzbDM4eHhfdzMyX2ZsdXNoKHZvaWQgX19pb21lbSAqYmFzZSwgdTMyIHZhbCwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJd3JpdGVsKHZhbCwgYmFzZSArIG9mZnNldCk7CisJKHZvaWQpIHJlYWRsKGJhc2UgKyBJU0wzOFhYX1BDSV9QT1NUSU5HX0ZMVVNIKTsKK30KKworLyogRGV2aWNlIEludGVycnVwdCByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIElTTDM4WFhfREVWX0lOVF9SRVNFVCAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgSVNMMzhYWF9ERVZfSU5UX1VQREFURSAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBJU0wzOFhYX0RFVl9JTlRfV0FLRVVQICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIElTTDM4WFhfREVWX0lOVF9TTEVFUCAgICAgICAgICAgICAgICAgICAweDAwMTAKKworLyogSW50ZXJydXB0IElkZW50aWZpY2F0aW9uL0Fja25vd2xlZGdlL0VuYWJsZSByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIElTTDM4WFhfSU5UX0lERU5UX1VQREFURSAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgSVNMMzhYWF9JTlRfSURFTlRfSU5JVCAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBJU0wzOFhYX0lOVF9JREVOVF9XQUtFVVAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIElTTDM4WFhfSU5UX0lERU5UX1NMRUVQICAgICAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgSVNMMzhYWF9JTlRfU09VUkNFUyAgICAgICAgICAgICAgICAgICAgIDB4MDAxRQorCisvKiBDb250cm9sL1N0YXR1cyByZWdpc3RlciBiaXRzICovCisvKiBMb29rcyBsaWtlIHRoZXJlIGFyZSBvdGhlciBtZWFuaW5nZnVsIGJpdHMKKyAgICAweDIwMDA0NDAwIHNlZW4gaW4gbm9ybWFsIG9wZXJhdGlvbiwKKyAgICAweDIwMDA0NGRiIGF0ICd0aW1lb3V0IHdhaXRpbmcgZm9yIG1nbXQgcmVzcG9uc2UnCisqLworI2RlZmluZSBJU0wzOFhYX0NUUkxfU1RBVF9TTEVFUE1PREUgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZQlJU0wzOFhYX0NUUkxfU1RBVF9DTEtSVU4JCTB4MDA4MDAwMDAKKyNkZWZpbmUgSVNMMzhYWF9DVFJMX1NUQVRfUkVTRVQgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgSVNMMzhYWF9DVFJMX1NUQVRfUkFNQk9PVCAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgSVNMMzhYWF9DVFJMX1NUQVRfU1RBUlRIQUxURUQgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgSVNMMzhYWF9DVFJMX1NUQVRfSE9TVF9PVkVSUklERSAgICAgICAgIDB4ODAwMDAwMDAKKworLyogQ29udHJvbCBCbG9jayBkZWZpbml0aW9ucyAqLworI2RlZmluZSBJU0wzOFhYX0NCX1JYX0RBVEFfTFEgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJU0wzOFhYX0NCX1RYX0RBVEFfTFEgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJU0wzOFhYX0NCX1JYX0RBVEFfSFEgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBJU0wzOFhYX0NCX1RYX0RBVEFfSFEgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBJU0wzOFhYX0NCX1JYX01HTVRRICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBJU0wzOFhYX0NCX1RYX01HTVRRICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBJU0wzOFhYX0NCX1FDT1VOVCAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBJU0wzOFhYX0NCX01HTVRfUVNJWkUgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBJU0wzOFhYX01JTl9RVEhSRVNIT0xEICAgICAgICAgICAgICAgICAgNAkvKiBmcmFnbWVudHMgKi8KKworLyogTWVtb3J5IE1hbmFnZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgTUdNVF9GUkFNRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgIDE1MDAJLyogPj0gc2l6ZSBzdHJ1Y3Qgb2JqX2Jzc2xpc3QgKi8KKyNkZWZpbmUgTUdNVF9UWF9GUkFNRV9DT1VOVCAgICAgICAgICAgICAgICAgICAgIDI0CS8qIG1heCA0ICsgc3BhcmUgNCArIDggaW5pdCAqLworI2RlZmluZSBNR01UX1JYX0ZSQU1FX0NPVU5UICAgICAgICAgICAgICAgICAgICAgMjQJLyogNCo0ICsgc3BhcmUgOCAqLworI2RlZmluZSBNR01UX0ZSQU1FX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgKE1HTVRfVFhfRlJBTUVfQ09VTlQgKyBNR01UX1JYX0ZSQU1FX0NPVU5UKQorI2RlZmluZSBDT05UUk9MX0JMT0NLX1NJWkUgICAgICAgICAgICAgICAgICAgICAgMTAyNAkvKiBzaG91bGQgYmUgZW5vdWdoICovCisjZGVmaW5lIFBTTV9GUkFNRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAxNTM2CisjZGVmaW5lIFBTTV9NSU5JTUFMX1NUQVRJT05fQ09VTlQgICAgICAgICAgICAgICA2NAorI2RlZmluZSBQU01fRlJBTUVfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgUFNNX01JTklNQUxfU1RBVElPTl9DT1VOVAorI2RlZmluZSBQU01fQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgUFNNX0ZSQU1FX1NJWkUgKiBQU01fRlJBTUVfQ09VTlQKKyNkZWZpbmUgTUFYX1RSQVBfUlhfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgSE9TVF9NRU1fQkxPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRST0xfQkxPQ0tfU0laRSArIFBTTV9CVUZGRVJfU0laRQorCisvKiBGcmFnbWVudCBwYWNrYWdlIGRlZmluaXRpb25zICovCisjZGVmaW5lIEZSQUdNRU5UX0ZMQUdfTUYgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgTUFYX0ZSQUdNRU5UX1NJWkUgICAgICAgICAgICAgICAgICAgICAgIDE1MzYKKworLyogSW4gbW9uaXRvciBtb2RlIGZyYW1lcyBoYXZlIGEgaGVhZGVyLiBJIGRvbid0IGtub3cgZXhhY3RseSBob3cgYmlnIHRob3NlCisgKiBmcmFtZSBjYW4gYmUgYnV0IEkndmUgbmV2ZXIgc2VlbiBhbnkgZnJhbWUgYmlnZ2VyIHRoYW4gMTU4NC4uLiA6CisgKi8KKyNkZWZpbmUgTUFYX0ZSQUdNRU5UX1NJWkVfUlgJICAgICAgICAgICAgICAgIDE2MDAKKwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBhZGRyZXNzOwkJLyogcGh5c2ljYWwgYWRkcmVzcyBvbiBob3N0ICovCisJdTE2IHNpemU7CQkvKiBwYWNrZXQgc2l6ZSAqLworCXUxNiBmbGFnczsJCS8qIHNldCBvZiBiaXQtd2lzZSBmbGFncyAqLworfSBpc2wzOHh4X2ZyYWdtZW50OworCitzdHJ1Y3QgaXNsMzh4eF9jYiB7CisJdTMyIGRyaXZlcl9jdXJyX2ZyYWdbSVNMMzhYWF9DQl9RQ09VTlRdOworCXUzMiBkZXZpY2VfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfUUNPVU5UXTsKKwlpc2wzOHh4X2ZyYWdtZW50IHJ4X2RhdGFfbG93W0lTTDM4WFhfQ0JfUlhfUVNJWkVdOworCWlzbDM4eHhfZnJhZ21lbnQgdHhfZGF0YV9sb3dbSVNMMzhYWF9DQl9UWF9RU0laRV07CisJaXNsMzh4eF9mcmFnbWVudCByeF9kYXRhX2hpZ2hbSVNMMzhYWF9DQl9SWF9RU0laRV07CisJaXNsMzh4eF9mcmFnbWVudCB0eF9kYXRhX2hpZ2hbSVNMMzhYWF9DQl9UWF9RU0laRV07CisJaXNsMzh4eF9mcmFnbWVudCByeF9kYXRhX21nbXRbSVNMMzhYWF9DQl9NR01UX1FTSVpFXTsKKwlpc2wzOHh4X2ZyYWdtZW50IHR4X2RhdGFfbWdtdFtJU0wzOFhYX0NCX01HTVRfUVNJWkVdOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgaXNsMzh4eF9jYiBpc2wzOHh4X2NvbnRyb2xfYmxvY2s7CisKKy8qIGRldGVybWluZSBudW1iZXIgb2YgZW50cmllcyBjdXJyZW50bHkgaW4gcXVldWUgKi8KK2ludCBpc2wzOHh4X2luX3F1ZXVlKGlzbDM4eHhfY29udHJvbF9ibG9jayAqY2IsIGludCBxdWV1ZSk7CisKK3ZvaWQgaXNsMzh4eF9kaXNhYmxlX2ludGVycnVwdHModm9pZCBfX2lvbWVtICopOwordm9pZCBpc2wzOHh4X2VuYWJsZV9jb21tb25faW50ZXJydXB0cyh2b2lkIF9faW9tZW0gKik7CisKK3ZvaWQgaXNsMzh4eF9oYW5kbGVfc2xlZXBfcmVxdWVzdChpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKiwgaW50ICosCisJCQkJICB2b2lkIF9faW9tZW0gKik7Cit2b2lkIGlzbDM4eHhfaGFuZGxlX3dha2V1cChpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKiwgaW50ICosIHZvaWQgX19pb21lbSAqKTsKK3ZvaWQgaXNsMzh4eF90cmlnZ2VyX2RldmljZShpbnQsIHZvaWQgX19pb21lbSAqKTsKK3ZvaWQgaXNsMzh4eF9pbnRlcmZhY2VfcmVzZXQodm9pZCBfX2lvbWVtICosIGRtYV9hZGRyX3QpOworCisjZW5kaWYJCQkJLyogX0lTTF8zOFhYX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMjlhOWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCkBAIC0wLDAgKzEsMjc1MCBAQAorLyoKKyAqICAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLgorICogICAgICAgICAgICAoQykgMjAwMywyMDA0IEF1cmVsaWVuIEFsbGVhdW1lIDxzbHRzQGZyZWUuZnI+CisgKiAgICAgICAgICAgIChDKSAyMDAzIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBnbnUub3JnPgorICogICAgICAgICAgICAoQykgMjAwMyBMdWlzIFIuIFJvZHJpZ3VleiA8bWNncm9mQHJ1c2x1Zy5ydXRnZXJzLmVkdT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJwcmlzbWNvbXBhdC5oIgorI2luY2x1ZGUgImlzbF9pb2N0bC5oIgorI2luY2x1ZGUgImlzbHBjaV9tZ3QuaCIKKyNpbmNsdWRlICJpc2xfb2lkLmgiCQkvKiBhZGRpdGlvbmFsIHR5cGVzIGFuZCBkZWZzIGZvciBpc2wzOHh4IGZ3ICovCisjaW5jbHVkZSAib2lkX21ndC5oIgorCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4JLyogTmV3IGRyaXZlciBBUEkgKi8KKworCitzdGF0aWMgdm9pZCBwcmlzbTU0X3dwYV9pZV9hZGQoaXNscGNpX3ByaXZhdGUgKnByaXYsIHU4ICpic3NpZCwKKwkJCQl1OCAqd3BhX2llLCBzaXplX3Qgd3BhX2llX2xlbik7CitzdGF0aWMgc2l6ZV90IHByaXNtNTRfd3BhX2llX2dldChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgdTggKmJzc2lkLCB1OCAqd3BhX2llKTsKK3N0YXRpYyBpbnQgcHJpc201NF9zZXRfd3BhKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKiwKKwkJCQlfX3UzMiAqLCBjaGFyICopOworCisKKy8qKgorICogcHJpc201NF9taWJfbW9kZV9oZWxwZXIgLSBNSUIgY2hhbmdlIG1vZGUgaGVscGVyIGZ1bmN0aW9uCisgKiBAbWliOiB0aGUgJnN0cnVjdCBpc2xwY2lfbWliIG9iamVjdCB0byBtb2RpZnkKKyAqIEBpd19tb2RlOiBuZXcgbW9kZSAoJUlXX01PREVfKikKKyAqIAorICogIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24sIGhlbmNlIGl0IGRvZXMgbm90IGxvY2suIE1ha2Ugc3VyZQorICogIGNhbGxlciBkZWFscyB3aXRoIGxvY2tpbmcgKmlmKiBuZWNlc3NhcnkuIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgCisgKiAgbW9kZS1kZXBlbmRlbnQgbWliIHZhbHVlcyBhbmQgZG9lcyB0aGUgbWFwcGluZyBvZiB0aGUgTGludXggCisgKiAgV2lyZWxlc3MgQVBJIG1vZGVzIHRvIERldmljZSBmaXJtd2FyZSBtb2Rlcy4gSXQgYWxzbyBjaGVja3MgZm9yIAorICogIGNvcnJlY3QgdmFsaWQgTGludXggd2lyZWxlc3MgbW9kZXMuIAorICovCitzdGF0aWMgaW50CitwcmlzbTU0X21pYl9tb2RlX2hlbHBlcihpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgdTMyIGl3X21vZGUpCit7CisJdTMyIGNvbmZpZyA9IElOTF9DT05GSUdfTUFOVUFMUlVOOworCXUzMiBtb2RlLCBic3N0eXBlOworCisJLyogRm9yIG5vdywganVzdCBjYXRjaCBlYXJseSB0aGUgUmVwZWF0ZXIgYW5kIFNlY29uZGFyeSBtb2RlcyBoZXJlICovCisJaWYgKGl3X21vZGUgPT0gSVdfTU9ERV9SRVBFQVQgfHwgaXdfbW9kZSA9PSBJV19NT0RFX1NFQ09ORCkgeworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIiVzKCk6IFNvcnJ5LCBSZXBlYXRlciBtb2RlIGFuZCBTZWNvbmRhcnkgbW9kZSAiCisJCSAgICAgICAiYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJpdi0+aXdfbW9kZSA9IGl3X21vZGU7CisKKwlzd2l0Y2ggKGl3X21vZGUpIHsKKwljYXNlIElXX01PREVfQVVUTzoKKwkJbW9kZSA9IElOTF9NT0RFX0NMSUVOVDsKKwkJYnNzdHlwZSA9IERPVDExX0JTU1RZUEVfQU5ZOworCQlicmVhazsKKwljYXNlIElXX01PREVfQURIT0M6CisJCW1vZGUgPSBJTkxfTU9ERV9DTElFTlQ7CisJCWJzc3R5cGUgPSBET1QxMV9CU1NUWVBFX0lCU1M7CisJCWJyZWFrOworCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJbW9kZSA9IElOTF9NT0RFX0NMSUVOVDsKKwkJYnNzdHlwZSA9IERPVDExX0JTU1RZUEVfSU5GUkE7CisJCWJyZWFrOworCWNhc2UgSVdfTU9ERV9NQVNURVI6CisJCW1vZGUgPSBJTkxfTU9ERV9BUDsKKwkJYnNzdHlwZSA9IERPVDExX0JTU1RZUEVfSU5GUkE7CisJCWJyZWFrOworCWNhc2UgSVdfTU9ERV9NT05JVE9SOgorCQltb2RlID0gSU5MX01PREVfUFJPTUlTQ1VPVVM7CisJCWJzc3R5cGUgPSBET1QxMV9CU1NUWVBFX0FOWTsKKwkJY29uZmlnIHw9IElOTF9DT05GSUdfUlhBTk5FWDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGluaXRfd2RzKQorCQljb25maWcgfD0gSU5MX0NPTkZJR19XRFM7CisJbWd0X3NldChwcml2LCBET1QxMV9PSURfQlNTVFlQRSwgJmJzc3R5cGUpOworCW1ndF9zZXQocHJpdiwgT0lEX0lOTF9DT05GSUcsICZjb25maWcpOworCW1ndF9zZXQocHJpdiwgT0lEX0lOTF9NT0RFLCAmbW9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwcmlzbTU0X21pYl9pbml0IC0gZmlsbCBNSUIgY2FjaGUgd2l0aCBkZWZhdWx0cworICoKKyAqICB0aGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBzdHJ1Y3QgZ2l2ZW4gYXMgQG1pYiB3aXRoIGRlZmF1bHRzLAorICogIG9mIHdoaWNoIG1hbnkgYXJlIHJldHJpZXZlZCBmcm9tIHRoZSBnbG9iYWwgbW9kdWxlIHBhcmFtZXRlcgorICogIHZhcmlhYmxlcy4gIAorICovCisKK3ZvaWQKK3ByaXNtNTRfbWliX2luaXQoaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJdTMyIGNoYW5uZWwsIGF1dGhlbiwgd2VwLCBmaWx0ZXIsIGRvdDF4LCBtbG1lLCBjb25mb3JtYW5jZSwgcG93ZXIsIG1vZGU7CisJc3RydWN0IG9ial9idWZmZXIgcHNtX2J1ZmZlciA9IHsKKwkJLnNpemUgPSBQU01fQlVGRkVSX1NJWkUsCisJCS5hZGRyID0gcHJpdi0+ZGV2aWNlX3BzbV9idWZmZXIKKwl9OworCisJY2hhbm5lbCA9IENBUkRfREVGQVVMVF9DSEFOTkVMOworCWF1dGhlbiA9IENBUkRfREVGQVVMVF9BVVRIRU47CisJd2VwID0gQ0FSRF9ERUZBVUxUX1dFUDsKKwlmaWx0ZXIgPSBDQVJEX0RFRkFVTFRfRklMVEVSOyAvKiAoMCkgRG8gbm90IGZpbHRlciB1bi1lbmNyeXB0ZWQgZGF0YSAqLworCWRvdDF4ID0gQ0FSRF9ERUZBVUxUX0RPVDFYOyAKKwltbG1lID0gQ0FSRF9ERUZBVUxUX01MTUVfTU9ERTsKKwljb25mb3JtYW5jZSA9IENBUkRfREVGQVVMVF9DT05GT1JNQU5DRTsKKwlwb3dlciA9IDEyNzsKKwltb2RlID0gQ0FSRF9ERUZBVUxUX0lXX01PREU7CisKKwltZ3Rfc2V0KHByaXYsIERPVDExX09JRF9DSEFOTkVMLCAmY2hhbm5lbCk7CisJbWd0X3NldChwcml2LCBET1QxMV9PSURfQVVUSEVOQUJMRSwgJmF1dGhlbik7CisJbWd0X3NldChwcml2LCBET1QxMV9PSURfUFJJVkFDWUlOVk9LRUQsICZ3ZXApOworCW1ndF9zZXQocHJpdiwgRE9UMTFfT0lEX1BTTUJVRkZFUiwgJnBzbV9idWZmZXIpOworCW1ndF9zZXQocHJpdiwgRE9UMTFfT0lEX0VYVU5FTkNSWVBURUQsICZmaWx0ZXIpOworCW1ndF9zZXQocHJpdiwgRE9UMTFfT0lEX0RPVDFYRU5BQkxFLCAmZG90MXgpOworCW1ndF9zZXQocHJpdiwgRE9UMTFfT0lEX01MTUVBVVRPTEVWRUwsICZtbG1lKTsKKwltZ3Rfc2V0KHByaXYsIE9JRF9JTkxfRE9UMTFEX0NPTkZPUk1BTkNFLCAmY29uZm9ybWFuY2UpOworCW1ndF9zZXQocHJpdiwgT0lEX0lOTF9PVVRQVVRQT1dFUiwgJnBvd2VyKTsKKworCS8qIFRoaXMgc2V0cyBhbGwgb2YgdGhlIG1vZGUtZGVwZW5kZW50IHZhbHVlcyAqLworCXByaXNtNTRfbWliX21vZGVfaGVscGVyKHByaXYsIG1vZGUpOworfQorCisvKiB0aGlzIHdpbGwgYmUgZXhlY3V0ZWQgb3V0c2lkZSBvZiBhdG9taWMgY29udGV4dCB0aGFua3MgdG8KKyAqIHNjaGVkdWxlX3dvcmsoKSwgdGh1cyB3ZSBjYW4gYXMgd2VsbCB1c2Ugc2xlZXBpbmcgc2VtYXBob3JlCisgKiBsb2NraW5nICovCit2b2lkCitwcmlzbTU0X3VwZGF0ZV9zdGF0cyhpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwljaGFyICpkYXRhOworCWludCBqOworCXN0cnVjdCBvYmpfYnNzIGJzcywgKmJzczI7CisJdW5pb24gb2lkX3Jlc190IHI7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZwcml2LT5zdGF0c19zZW0pKQorCQlyZXR1cm47CisKKy8qIE5vaXNlIGZsb29yLgorICogSSdtIG5vdCBzdXJlIGlmIHRoZSB1bml0IGlzIGRCbS4KKyAqIE5vdGUgOiBJZiB3ZSBhcmUgbm90IGNvbm5lY3RlZCwgdGhpcyB2YWx1ZSBzZWVtcyB0byBiZSBpcnJlbGV2YW50LiAqLworCisJbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9OT0lTRUZMT09SLCAwLCBOVUxMLCAmcik7CisJcHJpdi0+bG9jYWxfaXdzdGF0aXN0aWNzLnF1YWwubm9pc2UgPSByLnU7CisKKy8qIEdldCB0aGUgcnNzaSBvZiB0aGUgbGluay4gVG8gZG8gdGhpcyB3ZSBuZWVkIHRvIHJldHJpZXZlIGEgYnNzLiAqLworCisJLyogRmlyc3QgZ2V0IHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgQVAgd2UgYXJlIGFzc29jaWF0ZWQgd2l0aC4gKi8KKwltZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0JTU0lELCAwLCBOVUxMLCAmcik7CisJZGF0YSA9IHIucHRyOworCisJLyogY29weSB0aGlzIE1BQyB0byB0aGUgYnNzICovCisJbWVtY3B5KGJzcy5hZGRyZXNzLCBkYXRhLCA2KTsKKwlrZnJlZShkYXRhKTsKKworCS8qIG5vdyBhc2sgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGJzcyAqLworCWogPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0JTU0ZJTkQsIDAsICh2b2lkICopICZic3MsICZyKTsKKwlic3MyID0gci5wdHI7CisJLyogcmVwb3J0IHRoZSByc3NpIGFuZCB1c2UgaXQgdG8gY2FsY3VsYXRlCisJICogIGxpbmsgcXVhbGl0eSB0aHJvdWdoIGEgc2lnbmFsLW5vaXNlCisJICogIHJhdGlvICovCisJcHJpdi0+bG9jYWxfaXdzdGF0aXN0aWNzLnF1YWwubGV2ZWwgPSBic3MyLT5yc3NpOworCXByaXYtPmxvY2FsX2l3c3RhdGlzdGljcy5xdWFsLnF1YWwgPQorCSAgICBic3MyLT5yc3NpIC0gcHJpdi0+aXdzdGF0aXN0aWNzLnF1YWwubm9pc2U7CisKKwlrZnJlZShic3MyKTsKKworCS8qIHJlcG9ydCB0aGF0IHRoZSBzdGF0cyBhcmUgbmV3ICovCisJcHJpdi0+bG9jYWxfaXdzdGF0aXN0aWNzLnF1YWwudXBkYXRlZCA9IDB4NzsKKworLyogUnggOiB1bmFibGUgdG8gZGVjcnlwdCB0aGUgTVBEVSAqLworCW1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfUFJJVlJYRkFJTEVELCAwLCBOVUxMLCAmcik7CisJcHJpdi0+bG9jYWxfaXdzdGF0aXN0aWNzLmRpc2NhcmQuY29kZSA9IHIudTsKKworLyogVHggOiBNYXggTUFDIHJldHJpZXMgbnVtIHJlYWNoZWQgKi8KKwltZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX01QRFVUWEZBSUxFRCwgMCwgTlVMTCwgJnIpOworCXByaXYtPmxvY2FsX2l3c3RhdGlzdGljcy5kaXNjYXJkLnJldHJpZXMgPSByLnU7CisKKwl1cCgmcHJpdi0+c3RhdHNfc2VtKTsKKworCXJldHVybjsKK30KKworc3RydWN0IGl3X3N0YXRpc3RpY3MgKgorcHJpc201NF9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCS8qIElmIHRoZSBzdGF0cyBhcmUgYmVpbmcgdXBkYXRlZCByZXR1cm4gb2xkIGRhdGEgKi8KKwlpZiAoZG93bl90cnlsb2NrKCZwcml2LT5zdGF0c19zZW0pID09IDApIHsKKwkJbWVtY3B5KCZwcml2LT5pd3N0YXRpc3RpY3MsICZwcml2LT5sb2NhbF9pd3N0YXRpc3RpY3MsCisJCSAgICAgICBzaXplb2YgKHN0cnVjdCBpd19zdGF0aXN0aWNzKSk7CisJCS8qIFRoZXkgd29uJ3QgYmUgbWFya2VkIHVwZGF0ZWQgZm9yIHRoZSBuZXh0IHRpbWUgKi8KKwkJcHJpdi0+bG9jYWxfaXdzdGF0aXN0aWNzLnF1YWwudXBkYXRlZCA9IDA7CisJCXVwKCZwcml2LT5zdGF0c19zZW0pOworCX0gZWxzZQorCQlwcml2LT5pd3N0YXRpc3RpY3MucXVhbC51cGRhdGVkID0gMDsKKworCS8qIFVwZGF0ZSBvdXIgd2lyZWxlc3Mgc3RhdHMsIGJ1dCBkbyBub3Qgc2NoZWR1bGUgdG8gb2Z0ZW4gCisJICogKG1heCAxIEhaKSAqLworCWlmICgocHJpdi0+c3RhdHNfdGltZXN0YW1wID09IDApIHx8CisJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgcHJpdi0+c3RhdHNfdGltZXN0YW1wICsgMSAqIEhaKSkgeworCQlzY2hlZHVsZV93b3JrKCZwcml2LT5zdGF0c193b3JrKTsKKwkJcHJpdi0+c3RhdHNfdGltZXN0YW1wID0gamlmZmllczsKKwl9CisKKwlyZXR1cm4gJnByaXYtPml3c3RhdGlzdGljczsKK30KKworc3RhdGljIGludAorcHJpc201NF9jb21taXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJICAgICAgIGNoYXIgKmN3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwkvKiBzaW1wbHkgcmUtc2V0IHRoZSBsYXN0IHNldCBTU0lELCB0aGlzIHNob3VsZCBjb21taXQgbW9zdCBzdHVmZiAqLworCisJLyogQ29tbWl0IGluIE1vbml0b3IgbW9kZSBpcyBub3QgbmVjZXNzYXJ5LCBhbHNvIHNldHRpbmcgZXNzaWQKKwkgKiBpbiBNb25pdG9yIG1vZGUgZG9lcyBub3QgbWFrZSBzZW5zZSBhbmQgaXNuJ3QgYWxsb3dlZCBmb3IgdGhpcworCSAqIGRldmljZSdzIGZpcm13YXJlICovCisJaWYgKHByaXYtPml3X21vZGUgIT0gSVdfTU9ERV9NT05JVE9SKQorCQlyZXR1cm4gbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9TU0lELCAwLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJpc201NF9nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJIGNoYXIgKmN3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJY2hhciAqY2FwYWJpbGl0aWVzOworCXVuaW9uIG9pZF9yZXNfdCByOworCWludCBydmFsdWU7CisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSA8IFBSVl9TVEFURV9JTklUKSB7CisJCXN0cm5jcHkoY3dycSwgIk5PVCBSRUFEWSEiLCBJRk5BTVNJWik7CisJCXJldHVybiAwOworCX0KKwlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgT0lEX0lOTF9QSFlDQVBBQklMSVRJRVMsIDAsIE5VTEwsICZyKTsKKworCXN3aXRjaCAoci51KSB7CisJY2FzZSBJTkxfUEhZQ0FQXzUwMDBNSFo6CisJCWNhcGFiaWxpdGllcyA9ICJJRUVFIDgwMi4xMWEvYi9nIjsKKwkJYnJlYWs7CisJY2FzZSBJTkxfUEhZQ0FQX0ZBQToKKwkJY2FwYWJpbGl0aWVzID0gIklFRUUgODAyLjExYi9nIC0gRkFBIFN1cHBvcnQiOworCQlicmVhazsKKwljYXNlIElOTF9QSFlDQVBfMjQwME1IWjoKKwlkZWZhdWx0OgorCQljYXBhYmlsaXRpZXMgPSAiSUVFRSA4MDIuMTFiL2ciOwkvKiBEZWZhdWx0ICovCisJCWJyZWFrOworCX0KKwlzdHJuY3B5KGN3cnEsIGNhcGFiaWxpdGllcywgSUZOQU1TSVopOworCXJldHVybiBydmFsdWU7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSBzdHJ1Y3QgaXdfZnJlcSAqZndycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpbnQgcnZhbHVlOworCXUzMiBjOworCisJaWYgKGZ3cnEtPm0gPCAxMDAwKQorCQkvKiB3ZSBoYXZlIGEgY2hhbm5lbCBudW1iZXIgKi8KKwkJYyA9IGZ3cnEtPm07CisJZWxzZQorCQljID0gKGZ3cnEtPmUgPT0gMSkgPyBjaGFubmVsX29mX2ZyZXEoZndycS0+bSAvIDEwMDAwMCkgOiAwOworCisJcnZhbHVlID0gYyA/IG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfQ0hBTk5FTCwgMCwgJmMpIDogLUVJTlZBTDsKKworCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KKwlyZXR1cm4gKHJ2YWx1ZSA/IHJ2YWx1ZSA6IC1FSU5QUk9HUkVTUyk7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfZ2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSBzdHJ1Y3QgaXdfZnJlcSAqZndycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1bmlvbiBvaWRfcmVzX3QgcjsKKwlpbnQgcnZhbHVlOworCisJcnZhbHVlID0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9DSEFOTkVMLCAwLCBOVUxMLCAmcik7CisJZndycS0+aSA9IHIudTsKKwlydmFsdWUgfD0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9GUkVRVUVOQ1ksIDAsIE5VTEwsICZyKTsKKwlmd3JxLT5tID0gci51OworCWZ3cnEtPmUgPSAzOworCisJcmV0dXJuIHJ2YWx1ZTsKK30KKworc3RhdGljIGludAorcHJpc201NF9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJIF9fdTMyICogdXdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1MzIgbWxtZWF1dG9sZXZlbCA9IENBUkRfREVGQVVMVF9NTE1FX01PREU7CisKKwkvKiBMZXQncyBzZWUgaWYgdGhlIHVzZXIgcGFzc2VkIGEgdmFsaWQgTGludXggV2lyZWxlc3MgbW9kZSAqLworCWlmICgqdXdycSA+IElXX01PREVfTU9OSVRPUiB8fCAqdXdycSA8IElXX01PREVfQVVUTykgeworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIiVzOiAlcygpIFlvdSBwYXNzZWQgYSBub24tdmFsaWQgaW5pdF9tb2RlLlxuIiwKKwkJICAgICAgIHByaXYtPm5kZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRvd25fd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCisJaWYgKHByaXNtNTRfbWliX21vZGVfaGVscGVyKHByaXYsICp1d3JxKSkgeworCQl1cF93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwkvKiB0aGUgQUNMIGNvZGUgbmVlZHMgYW4gaW50ZXJtZWRpYXRlIG1sbWVhdXRvbGV2ZWwuIFRoZSB3cGEgc3R1ZmYgYW4KKwkgKiBleHRlbmRlZCBvbmUuCisJICovCisJaWYgKCgqdXdycSA9PSBJV19NT0RFX01BU1RFUikgJiYgKHByaXYtPmFjbC5wb2xpY3kgIT0gTUFDX1BPTElDWV9PUEVOKSkKKwkJbWxtZWF1dG9sZXZlbCA9IERPVDExX01MTUVfSU5URVJNRURJQVRFOworCWlmIChwcml2LT53cGEpCisJCW1sbWVhdXRvbGV2ZWwgPSBET1QxMV9NTE1FX0VYVEVOREVEOworCisJbWd0X3NldChwcml2LCBET1QxMV9PSURfTUxNRUFVVE9MRVZFTCwgJm1sbWVhdXRvbGV2ZWwpOworCisJaWYgKG1ndF9jb21taXQocHJpdikpIHsKKwkJdXBfd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcHJpdi0+bmRldi0+dHlwZSA9IChwcml2LT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKKwkgICAgPyBwcml2LT5tb25pdG9yX3R5cGUgOiBBUlBIUkRfRVRIRVI7CisJdXBfd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFVzZSBtaWIgY2FjaGUgKi8KK3N0YXRpYyBpbnQKK3ByaXNtNTRfZ2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSBfX3UzMiAqIHV3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlCVUdfT04oKHByaXYtPml3X21vZGUgPCBJV19NT0RFX0FVVE8pIHx8IChwcml2LT5pd19tb2RlID4KKwkJCQkJCSAgSVdfTU9ERV9NT05JVE9SKSk7CisJKnV3cnEgPSBwcml2LT5pd19tb2RlOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHdlIHVzZSBET1QxMV9PSURfRURUSFJFU0hPTEQuIEZyb20gd2hhdCBJIGd1ZXNzIHRoZSBjYXJkIHdpbGwgbm90IHRyeSB0bworICogZW1pdCBkYXRhIGlmIChzZW5zaXRpdml0eSA+IHJzc2kgLSBub2lzZSkgKGluIGRCbSkuCisgKiBwcmlzbTU0X3NldF9zZW5zIGRvZXMgbm90IHNlZW0gdG8gd29yay4KKyAqLworCitzdGF0aWMgaW50CitwcmlzbTU0X3NldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXUzMiBzZW5zOworCisJLyogYnkgZGVmYXVsdCAgdGhlIGNhcmQgc2V0cyB0aGlzIHRvIDIwLiAqLworCXNlbnMgPSB2d3JxLT5kaXNhYmxlZCA/IDIwIDogdndycS0+dmFsdWU7CisKKwlyZXR1cm4gbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9FRFRIUkVTSE9MRCwgMCwgJnNlbnMpOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXVuaW9uIG9pZF9yZXNfdCByOworCWludCBydmFsdWU7CisKKwlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0VEVEhSRVNIT0xELCAwLCBOVUxMLCAmcik7CisKKwl2d3JxLT52YWx1ZSA9IHIudTsKKwl2d3JxLT5kaXNhYmxlZCA9ICh2d3JxLT52YWx1ZSA9PSAwKTsKKwl2d3JxLT5maXhlZCA9IDE7CisKKwlyZXR1cm4gcnZhbHVlOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJdTggKmRhdGE7CisJaW50IGksIG0sIHJ2YWx1ZTsKKwlzdHJ1Y3Qgb2JqX2ZyZXF1ZW5jaWVzICpmcmVxOworCXVuaW9uIG9pZF9yZXNfdCByOworCisJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2YgKHN0cnVjdCBpd19yYW5nZSkpOworCWR3cnEtPmxlbmd0aCA9IHNpemVvZiAoc3RydWN0IGl3X3JhbmdlKTsKKworCS8qIHNldCB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9uIHZlcnNpb24gbnVtYmVyICovCisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gU1VQUE9SVEVEX1dJUkVMRVNTX0VYVDsKKwlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKKworCS8qIE5vdyB0aGUgZW5jb2RpbmcgY2FwYWJpbGl0aWVzICovCisJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDM7CisJLyogNjQoNDApIGJpdHMgV0VQICovCisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSA1OworCS8qIDEyOCgxMDQpIGJpdHMgV0VQICovCisJcmFuZ2UtPmVuY29kaW5nX3NpemVbMV0gPSAxMzsKKwkvKiAyNTYgYml0cyBmb3IgV1BBLVBTSyAqLworCXJhbmdlLT5lbmNvZGluZ19zaXplWzJdID0gMzI7CisJLyogNCBrZXlzIGFyZSBhbGxvd2VkICovCisJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSA0OworCisJLyogd2UgZG9uJ3Qga25vdyB0aGUgcXVhbGl0eSByYW5nZS4uLiAqLworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IDA7CisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gMDsKKwlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDA7CisJLyogdGhlc2UgdmFsdWUgZGVzY3JpYmUgYW4gYXZlcmFnZSBxdWFsaXR5LiBOZWVkcyBtb3JlIHR3ZWFraW5nLi4uICovCisJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gLTgwOwkvKiAtODAgZEJtICovCisJcmFuZ2UtPmF2Z19xdWFsLm5vaXNlID0gMDsJLyogZG9uJ3Qga25vdyB3aGF0IHRvIHB1dCBoZXJlICovCisJcmFuZ2UtPmF2Z19xdWFsLnF1YWwgPSAwOworCisJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMjAwOworCisJLyogcmV0cnkgbGltaXQgY2FwYWJpbGl0aWVzICovCisJcmFuZ2UtPnJldHJ5X2NhcGEgPSBJV19SRVRSWV9MSU1JVCB8IElXX1JFVFJZX0xJRkVUSU1FOworCXJhbmdlLT5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUOworCXJhbmdlLT5yX3RpbWVfZmxhZ3MgPSBJV19SRVRSWV9MSUZFVElNRTsKKworCS8qIEkgZG9uJ3Qga25vdyB0aGUgcmFuZ2UuIFB1dCBzdHVwaWQgdGhpbmdzIGhlcmUgKi8KKwlyYW5nZS0+bWluX3JldHJ5ID0gMTsKKwlyYW5nZS0+bWF4X3JldHJ5ID0gNjU1MzU7CisJcmFuZ2UtPm1pbl9yX3RpbWUgPSAxMDI0OworCXJhbmdlLT5tYXhfcl90aW1lID0gNjU1MzUgKiAxMDI0OworCisJLyogdHhwb3dlciBpcyBzdXBwb3J0ZWQgaW4gZEJtJ3MgKi8KKwlyYW5nZS0+dHhwb3dlcl9jYXBhID0gSVdfVFhQT1dfREJNOworCisjaWYgV0lSRUxFU1NfRVhUID4gMTYKKwkvKiBFdmVudCBjYXBhYmlsaXR5IChrZXJuZWwgKyBkcml2ZXIpICovCisJcmFuZ2UtPmV2ZW50X2NhcGFbMF0gPSAoSVdfRVZFTlRfQ0FQQV9LXzAgfAorCUlXX0VWRU5UX0NBUEFfTUFTSyhTSU9DR0lXVEhSU1BZKSB8CisJSVdfRVZFTlRfQ0FQQV9NQVNLKFNJT0NHSVdBUCkpOworCXJhbmdlLT5ldmVudF9jYXBhWzFdID0gSVdfRVZFTlRfQ0FQQV9LXzE7CisJcmFuZ2UtPmV2ZW50X2NhcGFbNF0gPSBJV19FVkVOVF9DQVBBX01BU0soSVdFVkNVU1RPTSk7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTYgKi8KKworCWlmIChpc2xwY2lfZ2V0X3N0YXRlKHByaXYpIDwgUFJWX1NUQVRFX0lOSVQpCisJCXJldHVybiAwOworCisJLyogUmVxdWVzdCB0aGUgZGV2aWNlIGZvciB0aGUgc3VwcG9ydGVkIGZyZXF1ZW5jaWVzCisJICogbm90IHJlYWxseSByZWxldmFudCBzaW5jZSBzb21lIGRldmljZXMgd2lsbCByZXBvcnQgdGhlIDUgR0h6IGJhbmQKKwkgKiBmcmVxdWVuY2llcyBldmVuIGlmIHRoZXkgZG9uJ3Qgc3VwcG9ydCB0aGVtLgorCSAqLworCXJ2YWx1ZSA9CisJICAgIG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfU1VQUE9SVEVERlJFUVVFTkNJRVMsIDAsIE5VTEwsICZyKTsKKwlmcmVxID0gci5wdHI7CisKKwlyYW5nZS0+bnVtX2NoYW5uZWxzID0gZnJlcS0+bnI7CisJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSBmcmVxLT5ucjsKKworCW0gPSBtaW4oSVdfTUFYX0ZSRVFVRU5DSUVTLCAoaW50KSBmcmVxLT5ucik7CisJZm9yIChpID0gMDsgaSA8IG07IGkrKykgeworCQlyYW5nZS0+ZnJlcVtpXS5tID0gZnJlcS0+bWh6W2ldOworCQlyYW5nZS0+ZnJlcVtpXS5lID0gNjsKKwkJcmFuZ2UtPmZyZXFbaV0uaSA9IGNoYW5uZWxfb2ZfZnJlcShmcmVxLT5taHpbaV0pOworCX0KKwlrZnJlZShmcmVxKTsKKworCXJ2YWx1ZSB8PSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1NVUFBPUlRFRFJBVEVTLCAwLCBOVUxMLCAmcik7CisJZGF0YSA9IHIucHRyOworCisJLyogV2UgZ290IGFuIGFycmF5IG9mIGNoYXIuIEl0IGlzIE5VTEwgdGVybWluYXRlZC4gKi8KKwlpID0gMDsKKwl3aGlsZSAoKGkgPCBJV19NQVhfQklUUkFURVMpICYmICgqZGF0YSAhPSAwKSkgeworCQkvKiAgICAgICB0aGUgcmVzdWx0IG11c3QgYmUgaW4gYnBzLiBUaGUgY2FyZCBnaXZlcyB1cyA1MDBLYnBzICovCisJCXJhbmdlLT5iaXRyYXRlW2ldID0gKmRhdGEgKiA1MDAwMDA7CisJCWkrKzsKKwkJZGF0YSsrOworCX0KKwlyYW5nZS0+bnVtX2JpdHJhdGVzID0gaTsKKwlrZnJlZShyLnB0cik7CisKKwlyZXR1cm4gcnZhbHVlOworfQorCisvKiBTZXQgQVAgYWRkcmVzcyovCisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IHNvY2thZGRyICphd3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCWNoYXIgYnNzaWRbNl07CisJaW50IHJ2YWx1ZTsKKworCWlmIChhd3JxLT5zYV9mYW1pbHkgIT0gQVJQSFJEX0VUSEVSKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHByZXBhcmUgdGhlIHN0cnVjdHVyZSBmb3IgdGhlIHNldCBvYmplY3QgKi8KKwltZW1jcHkoJmJzc2lkWzBdLCBhd3JxLT5zYV9kYXRhLCA2KTsKKworCS8qIHNldCB0aGUgYnNzaWQgLS0gZG9lcyB0aGlzIG1ha2Ugc2Vuc2Ugd2hlbiBpbiBBUCBtb2RlPyAqLworCXJ2YWx1ZSA9IG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfQlNTSUQsIDAsICZic3NpZCk7CisKKwlyZXR1cm4gKHJ2YWx1ZSA/IHJ2YWx1ZSA6IC1FSU5QUk9HUkVTUyk7CS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KK30KKworLyogZ2V0IEFQIGFkZHJlc3MqLworCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF93YXAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBzb2NrYWRkciAqYXdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1bmlvbiBvaWRfcmVzX3QgcjsKKwlpbnQgcnZhbHVlOworCisJcnZhbHVlID0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9CU1NJRCwgMCwgTlVMTCwgJnIpOworCW1lbWNweShhd3JxLT5zYV9kYXRhLCByLnB0ciwgNik7CisJYXdycS0+c2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCWtmcmVlKHIucHRyKTsKKworCXJldHVybiBydmFsdWU7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJLyogaGVoZSB0aGUgZGV2aWNlIGRvZXMgdGhpcyBhdXRvbWFnaWNhbHkgKi8KKwlyZXR1cm4gMDsKK30KKworLyogYSBsaXR0bGUgaGVscGVyIHRoYXQgd2lsbCB0cmFuc2xhdGUgb3VyIGRhdGEgaW50byBhIGNhcmQgaW5kZXBlbmRlbnQKKyAqIGZvcm1hdCB0aGF0IHRoZSBXaXJlbGVzcyBUb29scyB3aWxsIHVuZGVyc3RhbmQuIFRoaXMgd2FzIGluc3BpcmVkIGJ5CisgKiB0aGUgIkFpcm9uZXQgZHJpdmVyIGZvciA0NTAwIGFuZCA0ODAwIHNlcmllcyBjYXJkcyIgKEdQTCkKKyAqLworCitzdGF0aWMgY2hhciAqCitwcmlzbTU0X3RyYW5zbGF0ZV9ic3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGNoYXIgKmN1cnJlbnRfZXYsCisJCSAgICAgIGNoYXIgKmVuZF9idWYsIHN0cnVjdCBvYmpfYnNzICpic3MsIGNoYXIgbm9pc2UpCit7CisJc3RydWN0IGl3X2V2ZW50IGl3ZTsJLyogVGVtcG9yYXJ5IGJ1ZmZlciAqLworCXNob3J0IGNhcDsKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJLyogVGhlIGZpcnN0IGVudHJ5IG11c3QgYmUgdGhlIE1BQyBhZGRyZXNzICovCisJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgYnNzLT5hZGRyZXNzLCA2KTsKKwlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwlpd2UuY21kID0gU0lPQ0dJV0FQOworCWN1cnJlbnRfZXYgPQorCSAgICBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBJV19FVl9BRERSX0xFTik7CisKKwkvKiBUaGUgZm9sbG93aW5nIGVudHJpZXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIHNhbWUgb3JkZXIgd2UgZ2l2ZSB0aGVtICovCisKKwkvKiBUaGUgRVNTSUQuICovCisJaXdlLnUuZGF0YS5sZW5ndGggPSBic3MtPnNzaWQubGVuZ3RoOworCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOworCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CisJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGN1cnJlbnRfZXYsIGVuZF9idWYsCisJCQkJCSAgJml3ZSwgYnNzLT5zc2lkLm9jdGV0cyk7CisKKwkvKiBDYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgQ0FQX0VTUyAweDAxCisjZGVmaW5lIENBUF9JQlNTIDB4MDIKKyNkZWZpbmUgQ0FQX0NSWVBUIDB4MTAKKworCS8qIE1vZGUgKi8KKwljYXAgPSBic3MtPmNhcGluZm87CisJaXdlLnUubW9kZSA9IDA7CisJaWYgKGNhcCAmIENBUF9FU1MpCisJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX01BU1RFUjsKKwllbHNlIGlmIChjYXAgJiBDQVBfSUJTUykKKwkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7CisJaXdlLmNtZCA9IFNJT0NHSVdNT0RFOworCWlmIChpd2UudS5tb2RlKQorCQljdXJyZW50X2V2ID0KKwkJICAgIGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsCisJCQkJCSBJV19FVl9VSU5UX0xFTik7CisKKwkvKiBFbmNyeXB0aW9uIGNhcGFiaWxpdHkgKi8KKwlpZiAoY2FwICYgQ0FQX0NSWVBUKQorCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQgfCBJV19FTkNPREVfTk9LRVk7CisJZWxzZQorCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCWl3ZS51LmRhdGEubGVuZ3RoID0gMDsKKwlpd2UuY21kID0gU0lPQ0dJV0VOQ09ERTsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgTlVMTCk7CisKKwkvKiBBZGQgZnJlcXVlbmN5LiAoc2hvcnQpIGJzcy0+Y2hhbm5lbCBpcyB0aGUgZnJlcXVlbmN5IGluIE1IeiAqLworCWl3ZS51LmZyZXEubSA9IGJzcy0+Y2hhbm5lbDsKKwlpd2UudS5mcmVxLmUgPSA2OworCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKwljdXJyZW50X2V2ID0KKwkgICAgaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfRlJFUV9MRU4pOworCisJLyogQWRkIHF1YWxpdHkgc3RhdGlzdGljcyAqLworCWl3ZS51LnF1YWwubGV2ZWwgPSBic3MtPnJzc2k7CisJaXdlLnUucXVhbC5ub2lzZSA9IG5vaXNlOworCS8qIGRvIGEgc2ltcGxlIFNOUiBmb3IgcXVhbGl0eSAqLworCWl3ZS51LnF1YWwucXVhbCA9IGJzcy0+cnNzaSAtIG5vaXNlOworCWl3ZS5jbWQgPSBJV0VWUVVBTDsKKwljdXJyZW50X2V2ID0KKwkgICAgaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOworCisJaWYgKHByaXYtPndwYSkgeworCQl1OCB3cGFfaWVbTUFYX1dQQV9JRV9MRU5dOworCQljaGFyICpidWYsICpwOworCQlzaXplX3Qgd3BhX2llX2xlbjsKKwkJaW50IGk7CisKKwkJd3BhX2llX2xlbiA9IHByaXNtNTRfd3BhX2llX2dldChwcml2LCBic3MtPmFkZHJlc3MsIHdwYV9pZSk7CisJCWlmICh3cGFfaWVfbGVuID4gMCAmJgorCQkgICAgKGJ1ZiA9IGttYWxsb2Mod3BhX2llX2xlbiAqIDIgKyAxMCwgR0ZQX0FUT01JQykpKSB7CisJCQlwID0gYnVmOworCQkJcCArPSBzcHJpbnRmKHAsICJ3cGFfaWU9Iik7CisJCQlmb3IgKGkgPSAwOyBpIDwgd3BhX2llX2xlbjsgaSsrKSB7CisJCQkJcCArPSBzcHJpbnRmKHAsICIlMDJ4Iiwgd3BhX2llW2ldKTsKKwkJCX0KKwkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YgKGl3ZSkpOworCQkJaXdlLmNtZCA9IElXRVZDVVNUT007CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOworCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGN1cnJlbnRfZXYsIGVuZF9idWYsCisJCQkJCQkJICAmaXdlLCBidWYpOworCQkJa2ZyZWUoYnVmKTsKKwkJfQorCX0KKwlyZXR1cm4gY3VycmVudF9ldjsKK30KKworc3RhdGljIGludAorcHJpc201NF9nZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpbnQgaSwgcnZhbHVlOworCXN0cnVjdCBvYmpfYnNzbGlzdCAqYnNzbGlzdDsKKwl1MzIgbm9pc2UgPSAwOworCWNoYXIgKmN1cnJlbnRfZXYgPSBleHRyYTsKKwl1bmlvbiBvaWRfcmVzX3QgcjsKKworCWlmIChpc2xwY2lfZ2V0X3N0YXRlKHByaXYpIDwgUFJWX1NUQVRFX0lOSVQpIHsKKwkJLyogZGV2aWNlIGlzIG5vdCByZWFkeSwgZmFpbCBnZW50bHkgKi8KKwkJZHdycS0+bGVuZ3RoID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZmlyc3QgZ2V0IHRoZSBub2lzZSB2YWx1ZS4gV2Ugd2lsbCB1c2UgaXQgdG8gcmVwb3J0IHRoZSBsaW5rIHF1YWxpdHkgKi8KKwlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX05PSVNFRkxPT1IsIDAsIE5VTEwsICZyKTsKKwlub2lzZSA9IHIudTsKKworCS8qIEFzayB0aGUgZGV2aWNlIGZvciBhIGxpc3Qgb2Yga25vd24gYnNzLgorCSogVGhlIG9sZCBBUEksIHVzaW5nIFNJT0NHSVdBUExJU1QsIGhhZCBhIGhhcmQgbGltaXQgb2YgSVdfTUFYX0FQPTY0LgorCSogVGhlIG5ldyBBUEksIHVzaW5nIFNJT0NHSVdTQ0FOLCBpcyBvbmx5IGxpbWl0ZWQgYnkgdGhlIGJ1ZmZlciBzaXplLgorCSogV0UtMTQtPldFLTE2LCB0aGUgYnVmZmVyIGlzIGxpbWl0ZWQgdG8gSVdfU0NBTl9NQVhfREFUQSBieXRlcy4KKwkqIFN0YXJ0aW5nIHdpdGggV0UtMTcsIHRoZSBidWZmZXIgY2FuIGJlIGFzIGJpZyBhcyBuZWVkZWQuCisJKiBCdXQgdGhlIGRldmljZSB3b24ndCByZXBwb3J0IGFueXRoaW5nIGlmIHlvdSBjaGFuZ2UgdGhlIHZhbHVlCisJKiBvZiBJV01BWF9CU1M9MjQuICovCisJCisJcnZhbHVlIHw9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfQlNTTElTVCwgMCwgTlVMTCwgJnIpOworCWJzc2xpc3QgPSByLnB0cjsKKworCS8qIG9rIG5vdywgc2NhbiB0aGUgbGlzdCBhbmQgdHJhbnNsYXRlIGl0cyBpbmZvICovCisJZm9yIChpID0gMDsgaSA8IChpbnQpIGJzc2xpc3QtPm5yOyBpKyspIHsKKwkJY3VycmVudF9ldiA9IHByaXNtNTRfdHJhbnNsYXRlX2JzcyhuZGV2LCBjdXJyZW50X2V2LAorCQkJCQkJICAgZXh0cmEgKyBkd3JxLT5sZW5ndGgsCisJCQkJCQkgICAmKGJzc2xpc3QtPmJzc2xpc3RbaV0pLAorCQkJCQkJICAgbm9pc2UpOworI2lmIFdJUkVMRVNTX0VYVCA+IDE2CisJCS8qIENoZWNrIGlmIHRoZXJlIGlzIHNwYWNlIGZvciBvbmUgbW9yZSBlbnRyeSAqLworCQlpZigoZXh0cmEgKyBkd3JxLT5sZW5ndGggLSBjdXJyZW50X2V2KSA8PSBJV19FVl9BRERSX0xFTikgeworCQkJLyogQXNrIHVzZXIgc3BhY2UgdG8gdHJ5IGFnYWluIHdpdGggYSBiaWdnZXIgYnVmZmVyICovCisJCQlydmFsdWUgPSAtRTJCSUc7CisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDE2ICovCisJfQorCisJa2ZyZWUoYnNzbGlzdCk7CisJZHdycS0+bGVuZ3RoID0gKGN1cnJlbnRfZXYgLSBleHRyYSk7CisJZHdycS0+ZmxhZ3MgPSAwOwkvKiB0b2RvICovCisKKwlyZXR1cm4gcnZhbHVlOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X3NldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IG9ial9zc2lkIGVzc2lkOworCisJbWVtc2V0KGVzc2lkLm9jdGV0cywgMCwgMzMpOworCisJLyogQ2hlY2sgaWYgd2Ugd2VyZSBhc2tlZCBmb3IgYGFueScgKi8KKwlpZiAoZHdycS0+ZmxhZ3MgJiYgZHdycS0+bGVuZ3RoKSB7CisJCWlmIChkd3JxLT5sZW5ndGggPiBtaW4oMzMsIElXX0VTU0lEX01BWF9TSVpFICsgMSkpCisJCQlyZXR1cm4gLUUyQklHOworCQllc3NpZC5sZW5ndGggPSBkd3JxLT5sZW5ndGggLSAxOworCQltZW1jcHkoZXNzaWQub2N0ZXRzLCBleHRyYSwgZHdycS0+bGVuZ3RoKTsKKwl9IGVsc2UKKwkJZXNzaWQubGVuZ3RoID0gMDsKKworCWlmIChwcml2LT5pd19tb2RlICE9IElXX01PREVfTU9OSVRPUikKKwkJcmV0dXJuIG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfU1NJRCwgMCwgJmVzc2lkKTsKKworCS8qIElmIGluIG1vbml0b3IgbW9kZSwganVzdCBzYXZlIHRvIG1pYiAqLworCW1ndF9zZXQocHJpdiwgRE9UMTFfT0lEX1NTSUQsICZlc3NpZCk7CisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludAorcHJpc201NF9nZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBvYmpfc3NpZCAqZXNzaWQ7CisJdW5pb24gb2lkX3Jlc190IHI7CisJaW50IHJ2YWx1ZTsKKworCXJ2YWx1ZSA9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfU1NJRCwgMCwgTlVMTCwgJnIpOworCWVzc2lkID0gci5wdHI7CisKKwlpZiAoZXNzaWQtPmxlbmd0aCkgeworCQlkd3JxLT5mbGFncyA9IDE7CS8qIHNldCBFU1NJRCB0byBPTiBmb3IgV2lyZWxlc3MgRXh0ZW5zaW9ucyAqLworCQkvKiBpZiBpdCBpcyB0byBiaWcsIHRydW5rIGl0ICovCisJCWR3cnEtPmxlbmd0aCA9IG1pbihJV19FU1NJRF9NQVhfU0laRSwgZXNzaWQtPmxlbmd0aCArIDEpOworCX0gZWxzZSB7CisJCWR3cnEtPmZsYWdzID0gMDsKKwkJZHdycS0+bGVuZ3RoID0gMDsKKwl9CisJZXNzaWQtPm9jdGV0c1tlc3NpZC0+bGVuZ3RoXSA9ICdcMCc7CisJbWVtY3B5KGV4dHJhLCBlc3NpZC0+b2N0ZXRzLCBkd3JxLT5sZW5ndGgpOworCWtmcmVlKGVzc2lkKTsKKworCXJldHVybiBydmFsdWU7Cit9CisKKy8qIFByb3ZpZGVzIG5vIGZ1bmN0aW9uYWxpdHksIGp1c3QgY29tcGxldGVzIHRoZSBpb2N0bC4gSW4gZXNzZW5jZSB0aGlzIGlzIGEgCisgKiBqdXN0IGEgY29zbWV0aWMgaW9jdGwuCisgKi8KK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X25pY2soc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlpZiAoZHdycS0+bGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpCisJCXJldHVybiAtRTJCSUc7CisKKwlkb3duX3dyaXRlKCZwcml2LT5taWJfc2VtKTsKKwltZW1zZXQocHJpdi0+bmlja25hbWUsIDAsIHNpemVvZiAocHJpdi0+bmlja25hbWUpKTsKKwltZW1jcHkocHJpdi0+bmlja25hbWUsIGV4dHJhLCBkd3JxLT5sZW5ndGgpOworCXVwX3dyaXRlKCZwcml2LT5taWJfc2VtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF9uaWNrKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJZHdycS0+bGVuZ3RoID0gMDsKKworCWRvd25fcmVhZCgmcHJpdi0+bWliX3NlbSk7CisJZHdycS0+bGVuZ3RoID0gc3RybGVuKHByaXYtPm5pY2tuYW1lKSArIDE7CisJbWVtY3B5KGV4dHJhLCBwcml2LT5uaWNrbmFtZSwgZHdycS0+bGVuZ3RoKTsKKwl1cF9yZWFkKCZwcml2LT5taWJfc2VtKTsKKworCXJldHVybiAwOworfQorCisvKiBTZXQgdGhlIGFsbG93ZWQgQml0cmF0ZXMgKi8KKworc3RhdGljIGludAorcHJpc201NF9zZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQoreworCisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1MzIgcmF0ZSwgcHJvZmlsZTsKKwljaGFyICpkYXRhOworCWludCByZXQsIGk7CisJdW5pb24gb2lkX3Jlc190IHI7CisKKwlpZiAodndycS0+dmFsdWUgPT0gLTEpIHsKKwkJLyogYXV0byBtb2RlLiBObyBsaW1pdC4gKi8KKwkJcHJvZmlsZSA9IDE7CisJCXJldHVybiBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1BST0ZJTEVTLCAwLCAmcHJvZmlsZSk7CisJfQorCisJcmV0ID0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9TVVBQT1JURURSQVRFUywgMCwgTlVMTCwgJnIpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUoci5wdHIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJhdGUgPSAodTMyKSAodndycS0+dmFsdWUgLyA1MDAwMDApOworCWRhdGEgPSByLnB0cjsKKwlpID0gMDsKKworCXdoaWxlIChkYXRhW2ldKSB7CisJCWlmIChyYXRlICYmIChkYXRhW2ldID09IHJhdGUpKSB7CisJCQlicmVhazsKKwkJfQorCQlpZiAodndycS0+dmFsdWUgPT0gaSkgeworCQkJYnJlYWs7CisJCX0KKwkJZGF0YVtpXSB8PSAweDgwOworCQlpKys7CisJfQorCisJaWYgKCFkYXRhW2ldKSB7CisJCWtmcmVlKHIucHRyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGF0YVtpXSB8PSAweDgwOworCWRhdGFbaSArIDFdID0gMDsKKworCS8qIE5vdywgY2hlY2sgaWYgd2Ugd2FudCBhIGZpeGVkIG9yIGF1dG8gdmFsdWUgKi8KKwlpZiAodndycS0+Zml4ZWQpIHsKKwkJZGF0YVswXSA9IGRhdGFbaV07CisJCWRhdGFbMV0gPSAwOworCX0KKworLyoKKwlpID0gMDsKKwlwcmludGsoInByaXNtNTQgcmF0ZTogIik7CisJd2hpbGUoZGF0YVtpXSkgeworCQlwcmludGsoIiV1ICIsIGRhdGFbaV0pOworCQlpKys7CisJfQorCXByaW50aygiMFxuIik7CisqLworCXByb2ZpbGUgPSAtMTsKKwlyZXQgPSBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1BST0ZJTEVTLCAwLCAmcHJvZmlsZSk7CisJcmV0IHw9IG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfRVhURU5ERURSQVRFUywgMCwgZGF0YSk7CisJcmV0IHw9IG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfUkFURVMsIDAsIGRhdGEpOworCisJa2ZyZWUoci5wdHIpOworCisJcmV0dXJuIHJldDsKK30KKworLyogR2V0IHRoZSBjdXJyZW50IGJpdCByYXRlICovCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpbnQgcnZhbHVlOworCWNoYXIgKmRhdGE7CisJdW5pb24gb2lkX3Jlc190IHI7CisKKwkvKiBHZXQgdGhlIGN1cnJlbnQgYml0IHJhdGUgKi8KKwlpZiAoKHJ2YWx1ZSA9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBHRU5fT0lEX0xJTktTVEFURSwgMCwgTlVMTCwgJnIpKSkKKwkJcmV0dXJuIHJ2YWx1ZTsKKwl2d3JxLT52YWx1ZSA9IHIudSAqIDUwMDAwMDsKKworCS8qIHJlcXVlc3QgdGhlIGRldmljZSBmb3IgdGhlIGVuYWJsZWQgcmF0ZXMgKi8KKwlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1JBVEVTLCAwLCBOVUxMLCAmcik7CisJaWYgKHJ2YWx1ZSkgeworCQlrZnJlZShyLnB0cik7CisJCXJldHVybiBydmFsdWU7CisJfQorCWRhdGEgPSByLnB0cjsKKwl2d3JxLT5maXhlZCA9IChkYXRhWzBdICE9IDApICYmIChkYXRhWzFdID09IDApOworCWtmcmVlKHIucHRyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X3NldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCXJldHVybiBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1JUU1RIUkVTSCwgMCwgJnZ3cnEtPnZhbHVlKTsKK30KKworc3RhdGljIGludAorcHJpc201NF9nZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJdW5pb24gb2lkX3Jlc190IHI7CisJaW50IHJ2YWx1ZTsKKworCS8qIGdldCB0aGUgcnRzIHRocmVzaG9sZCAqLworCXJ2YWx1ZSA9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfUlRTVEhSRVNILCAwLCBOVUxMLCAmcik7CisJdndycS0+dmFsdWUgPSByLnU7CisKKwlyZXR1cm4gcnZhbHVlOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X3NldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJcmV0dXJuIG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfRlJBR1RIUkVTSCwgMCwgJnZ3cnEtPnZhbHVlKTsKK30KKworc3RhdGljIGludAorcHJpc201NF9nZXRfZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1bmlvbiBvaWRfcmVzX3QgcjsKKwlpbnQgcnZhbHVlOworCisJcnZhbHVlID0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9GUkFHVEhSRVNILCAwLCBOVUxMLCAmcik7CisJdndycS0+dmFsdWUgPSByLnU7CisKKwlyZXR1cm4gcnZhbHVlOworfQorCisvKiBIZXJlIHdlIGhhdmUgKG1pbixtYXgpID0gbWF4IHJldHJpZXMgZm9yIChzbWFsbCBmcmFtZXMsIGJpZyBmcmFtZXMpLiBXaGVyZQorICogYmlnIGZyYW1lIDw9PiAgYmlnZ2VyIHRoYW4gdGhlIHJ0cyB0aHJlc2hvbGQKKyAqIHNtYWxsIGZyYW1lIDw9PiAgc21hbGxlciB0aGFuIHRoZSBydHMgdGhyZXNob2xkCisgKiBUaGlzIGlzIG5vdCByZWFsbHkgdGhlIGJlaGF2aW9yIGV4cGVjdGVkIGJ5IHRoZSB3aXJlbGVzcyB0b29sIGJ1dCBpdCBzZWVtcworICogdG8gYmUgYSBjb21tb24gYmVoYXZpb3IgaW4gb3RoZXIgZHJpdmVycy4KKyAqLworCitzdGF0aWMgaW50CitwcmlzbTU0X3NldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJdTMyIHNsaW1pdCA9IDAsIGxsaW1pdCA9IDA7CS8qIHNob3J0IGFuZCBsb25nIGxpbWl0ICovCisJdTMyIGxpZmV0aW1lID0gMDsKKwlpbnQgcnZhbHVlID0gMDsKKworCWlmICh2d3JxLT5kaXNhYmxlZCkKKwkJLyogd2UgY2Fubm90IGRpc2FibGUgdGhpcyBmZWF0dXJlICovCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTElNSVQpIHsKKwkJaWYgKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTUlOKQorCQkJc2xpbWl0ID0gdndycS0+dmFsdWU7CisJCWVsc2UgaWYgKHZ3cnEtPmZsYWdzICYgSVdfUkVUUllfTUFYKQorCQkJbGxpbWl0ID0gdndycS0+dmFsdWU7CisJCWVsc2UgeworCQkJLyogd2UgYXJlIGFza2VkIHRvIHNldCBib3RoICovCisJCQlzbGltaXQgPSB2d3JxLT52YWx1ZTsKKwkJCWxsaW1pdCA9IHZ3cnEtPnZhbHVlOworCQl9CisJfQorCWlmICh2d3JxLT5mbGFncyAmIElXX1JFVFJZX0xJRkVUSU1FKQorCQkvKiBXaXJlbGVzcyB0b29scyB1c2UgdXMgdW5pdCB3aGlsZSB0aGUgZGV2aWNlIHVzZXMgMTAyNCB1cyB1bml0ICovCisJCWxpZmV0aW1lID0gdndycS0+dmFsdWUgLyAxMDI0OworCisJLyogbm93IHNldCB3aGF0IGlzIHJlcXVlc3RlZCAqLworCWlmIChzbGltaXQpCisJCXJ2YWx1ZSA9CisJCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1NIT1JUUkVUUklFUywgMCwgJnNsaW1pdCk7CisJaWYgKGxsaW1pdCkKKwkJcnZhbHVlIHw9CisJCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0xPTkdSRVRSSUVTLCAwLCAmbGxpbWl0KTsKKwlpZiAobGlmZXRpbWUpCisJCXJ2YWx1ZSB8PQorCQkgICAgbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9NQVhUWExJRkVUSU1FLCAwLAorCQkJCSAgICAmbGlmZXRpbWUpOworCXJldHVybiBydmFsdWU7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfZ2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgIHN0cnVjdCBpd19wYXJhbSAqdndycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1bmlvbiBvaWRfcmVzX3QgcjsKKwlpbnQgcnZhbHVlID0gMDsKKwl2d3JxLT5kaXNhYmxlZCA9IDA7CS8qIEl0IGNhbm5vdCBiZSBkaXNhYmxlZCAqLworCisJaWYgKCh2d3JxLT5mbGFncyAmIElXX1JFVFJZX1RZUEUpID09IElXX1JFVFJZX0xJRkVUSU1FKSB7CisJCS8qIHdlIGFyZSBhc2tlZCBmb3IgdGhlIGxpZmUgdGltZSAqLworCQlydmFsdWUgPQorCQkgICAgbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9NQVhUWExJRkVUSU1FLCAwLCBOVUxMLCAmcik7CisJCXZ3cnEtPnZhbHVlID0gci51ICogMTAyNDsKKwkJdndycS0+ZmxhZ3MgPSBJV19SRVRSWV9MSUZFVElNRTsKKwl9IGVsc2UgaWYgKCh2d3JxLT5mbGFncyAmIElXX1JFVFJZX01BWCkpIHsKKwkJLyogd2UgYXJlIGFza2VkIGZvciB0aGUgbG9uZyByZXRyeSBsaW1pdCAqLworCQlydmFsdWUgfD0KKwkJICAgIG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfTE9OR1JFVFJJRVMsIDAsIE5VTEwsICZyKTsKKwkJdndycS0+dmFsdWUgPSByLnU7CisJCXZ3cnEtPmZsYWdzID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9NQVg7CisJfSBlbHNlIHsKKwkJLyogZGVmYXVsdC4gZ2V0IHRoZSAgc2hvcnQgcmV0cnkgbGltaXQgKi8KKwkJcnZhbHVlIHw9CisJCSAgICBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1NIT1JUUkVUUklFUywgMCwgTlVMTCwgJnIpOworCQl2d3JxLT52YWx1ZSA9IHIudTsKKwkJdndycS0+ZmxhZ3MgPSBJV19SRVRSWV9MSU1JVCB8IElXX1JFVFJZX01JTjsKKwl9CisKKwlyZXR1cm4gcnZhbHVlOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X3NldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpbnQgcnZhbHVlID0gMCwgZm9yY2UgPSAwOworCWludCBhdXRoZW4gPSBET1QxMV9BVVRIX09TLCBpbnZva2UgPSAwLCBleHVuZW5jcnlwdCA9IDA7CisJdW5pb24gb2lkX3Jlc190IHI7CisKKwkvKiB3aXRoIHRoZSBuZXcgQVBJLCBpdCdzIGltcG9zc2libGUgdG8gZ2V0IGEgTlVMTCBwb2ludGVyLgorCSAqIE5ldyB2ZXJzaW9uIG9mIGl3Y29uZmlnIHNldCB0aGUgSVdfRU5DT0RFX05PS0VZIGZsYWcKKwkgKiB3aGVuIG5vIGtleSBpcyBnaXZlbiwgYnV0IG9sZGVyIHZlcnNpb25zIGRvbid0LiAqLworCisJaWYgKGR3cnEtPmxlbmd0aCA+IDApIHsKKwkJLyogd2UgaGF2ZSBhIGtleSB0byBzZXQgKi8KKwkJaW50IGluZGV4ID0gKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CisJCWludCBjdXJyZW50X2luZGV4OworCQlzdHJ1Y3Qgb2JqX2tleSBrZXkgPSB7IERPVDExX1BSSVZfV0VQLCAwLCAiIiB9OworCisJCS8qIGdldCB0aGUgY3VycmVudCBrZXkgaW5kZXggKi8KKwkJcnZhbHVlID0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9ERUZLRVlJRCwgMCwgTlVMTCwgJnIpOworCQljdXJyZW50X2luZGV4ID0gci51OworCQkvKiBWZXJpZnkgdGhhdCB0aGUga2V5IGlzIG5vdCBtYXJrZWQgYXMgaW52YWxpZCAqLworCQlpZiAoIShkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9OT0tFWSkpIHsKKwkJCWtleS5sZW5ndGggPSBkd3JxLT5sZW5ndGggPiBzaXplb2YgKGtleS5rZXkpID8KKwkJCSAgICBzaXplb2YgKGtleS5rZXkpIDogZHdycS0+bGVuZ3RoOworCQkJbWVtY3B5KGtleS5rZXksIGV4dHJhLCBrZXkubGVuZ3RoKTsKKwkJCWlmIChrZXkubGVuZ3RoID09IDMyKQorCQkJCS8qIHdlIHdhbnQgV1BBLVBTSyAqLworCQkJCWtleS50eXBlID0gRE9UMTFfUFJJVl9US0lQOworCQkJaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+IDMpKQorCQkJCS8qIG5vIGluZGV4IHByb3ZpZGVkIHVzZSB0aGUgY3VycmVudCBvbmUgKi8KKwkJCQlpbmRleCA9IGN1cnJlbnRfaW5kZXg7CisKKwkJCS8qIG5vdyBzZW5kIHRoZSBrZXkgdG8gdGhlIGNhcmQgICovCisJCQlydmFsdWUgfD0KKwkJCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0RFRktFWVgsIGluZGV4LAorCQkJCQkgICAgJmtleSk7CisJCX0KKwkJLyoKKwkJICogSWYgYSB2YWxpZCBrZXkgaXMgc2V0LCBlbmNyeXB0aW9uIHNob3VsZCBiZSBlbmFibGVkIAorCQkgKiAodXNlciBtYXkgdHVybiBpdCBvZmYgbGF0ZXIpLgorCQkgKiBUaGlzIGlzIGFsc28gaG93ICJpd2NvbmZpZyBldGhYIGtleSBvbiIgd29ya3MKKwkJICovCisJCWlmICgoaW5kZXggPT0gY3VycmVudF9pbmRleCkgJiYgKGtleS5sZW5ndGggPiAwKSkKKwkJCWZvcmNlID0gMTsKKwl9IGVsc2UgeworCQlpbnQgaW5kZXggPSAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJaWYgKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPD0gMykpIHsKKwkJCS8qIHdlIHdhbnQgdG8gc2V0IHRoZSBrZXkgaW5kZXggKi8KKwkJCXJ2YWx1ZSB8PQorCQkJICAgIG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfREVGS0VZSUQsIDAsCisJCQkJCSAgICAmaW5kZXgpOworCQl9IGVsc2UgeworCQkJaWYgKCFkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9NT0RFKSB7CisJCQkJLyogd2UgY2Fubm90IGRvIGFueXRoaW5nLiBDb21wbGFpbi4gKi8KKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKwkvKiBub3cgcmVhZCB0aGUgZmxhZ3MgKi8KKwlpZiAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKKwkJLyogRW5jb2RpbmcgZGlzYWJsZWQsIAorCQkgKiBhdXRoZW4gPSBET1QxMV9BVVRIX09TOworCQkgKiBpbnZva2UgPSAwOworCQkgKiBleHVuZW5jcnlwdCA9IDA7ICovCisJfQorCWlmIChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9PUEVOKQorCQkvKiBFbmNvZGUgYnV0IGFjY2VwdCBub24tZW5jb2RlZCBwYWNrZXRzLiBObyBhdXRoICovCisJCWludm9rZSA9IDE7CisJaWYgKChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKSB8fCBmb3JjZSkgeworCQkvKiBSZWZ1c2Ugbm9uLWVuY29kZWQgcGFja2V0cy4gQXV0aCAqLworCQlhdXRoZW4gPSBET1QxMV9BVVRIX0JPVEg7CisJCWludm9rZSA9IDE7CisJCWV4dW5lbmNyeXB0ID0gMTsKKwl9CisJLyogZG8gdGhlIGNoYW5nZSBpZiByZXF1ZXN0ZWQgICovCisJaWYgKChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9NT0RFKSB8fCBmb3JjZSkgeworCQlydmFsdWUgfD0KKwkJICAgIG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfQVVUSEVOQUJMRSwgMCwgJmF1dGhlbik7CisJCXJ2YWx1ZSB8PQorCQkgICAgbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9QUklWQUNZSU5WT0tFRCwgMCwgJmludm9rZSk7CisJCXJ2YWx1ZSB8PQorCQkgICAgbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9FWFVORU5DUllQVEVELCAwLAorCQkJCSAgICAmZXh1bmVuY3J5cHQpOworCX0KKwlyZXR1cm4gcnZhbHVlOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgIHN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3Qgb2JqX2tleSAqa2V5OworCXUzMiBkZXZpbmRleCwgaW5kZXggPSAoZHdycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwl1MzIgYXV0aGVuID0gMCwgaW52b2tlID0gMCwgZXh1bmVuY3J5cHQgPSAwOworCWludCBydmFsdWU7CisJdW5pb24gb2lkX3Jlc190IHI7CisKKwkvKiBmaXJzdCBnZXQgdGhlIGZsYWdzICovCisJcnZhbHVlID0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9BVVRIRU5BQkxFLCAwLCBOVUxMLCAmcik7CisJYXV0aGVuID0gci51OworCXJ2YWx1ZSB8PSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1BSSVZBQ1lJTlZPS0VELCAwLCBOVUxMLCAmcik7CisJaW52b2tlID0gci51OworCXJ2YWx1ZSB8PSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0VYVU5FTkNSWVBURUQsIDAsIE5VTEwsICZyKTsKKwlleHVuZW5jcnlwdCA9IHIudTsKKworCWlmIChpbnZva2UgJiYgKGF1dGhlbiA9PSBET1QxMV9BVVRIX0JPVEgpICYmIGV4dW5lbmNyeXB0KQorCQlkd3JxLT5mbGFncyA9IElXX0VOQ09ERV9SRVNUUklDVEVEOworCWVsc2UgaWYgKChhdXRoZW4gPT0gRE9UMTFfQVVUSF9PUykgJiYgIWV4dW5lbmNyeXB0KSB7CisJCWlmIChpbnZva2UpCisJCQlkd3JxLT5mbGFncyA9IElXX0VOQ09ERV9PUEVOOworCQllbHNlCisJCQlkd3JxLT5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwl9IGVsc2UKKwkJLyogVGhlIGNhcmQgc2hvdWxkIG5vdCB3b3JrIGluIHRoaXMgc3RhdGUgKi8KKwkJZHdycS0+ZmxhZ3MgPSAwOworCisJLyogZ2V0IHRoZSBjdXJyZW50IGRldmljZSBrZXkgaW5kZXggKi8KKwlydmFsdWUgfD0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9ERUZLRVlJRCwgMCwgTlVMTCwgJnIpOworCWRldmluZGV4ID0gci51OworCS8qIE5vdyBnZXQgdGhlIGtleSwgcmV0dXJuIGl0ICovCisJaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+IDMpKQorCQkvKiBubyBpbmRleCBwcm92aWRlZCwgdXNlIHRoZSBjdXJyZW50IG9uZSAqLworCQlpbmRleCA9IGRldmluZGV4OworCXJ2YWx1ZSB8PSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0RFRktFWVgsIGluZGV4LCBOVUxMLCAmcik7CisJa2V5ID0gci5wdHI7CisJZHdycS0+bGVuZ3RoID0ga2V5LT5sZW5ndGg7CisJbWVtY3B5KGV4dHJhLCBrZXktPmtleSwgZHdycS0+bGVuZ3RoKTsKKwlrZnJlZShrZXkpOworCS8qIHJldHVybiB0aGUgdXNlZCBrZXkgaW5kZXggKi8KKwlkd3JxLT5mbGFncyB8PSBkZXZpbmRleCArIDE7CisKKwlyZXR1cm4gcnZhbHVlOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF90eHBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgc3RydWN0IGl3X3BhcmFtICp2d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXVuaW9uIG9pZF9yZXNfdCByOworCWludCBydmFsdWU7CisKKwlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgT0lEX0lOTF9PVVRQVVRQT1dFUiwgMCwgTlVMTCwgJnIpOworCS8qIGludGVyc2lsIGZpcm13YXJlIG9wZXJhdGVzIGluIDAuMjUgZEJtICgxLzQgZEJtKSAqLworCXZ3cnEtPnZhbHVlID0gKHMzMikgci51IC8gNDsKKwl2d3JxLT5maXhlZCA9IDE7CisJLyogcmFkaW8gaXMgbm90IHR1cm5lZCBvZgorCSAqIGJ0dzogaG93IGlzIHBvc3NpYmxlIHRvIHR1cm4gb2ZmIG9ubHkgdGhlIHJhZGlvIAorCSAqLworCXZ3cnEtPmRpc2FibGVkID0gMDsKKworCXJldHVybiBydmFsdWU7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X3R4cG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICBzdHJ1Y3QgaXdfcGFyYW0gKnZ3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJczMyIHUgPSB2d3JxLT52YWx1ZTsKKworCS8qIGludGVyc2lsIGZpcm13YXJlIG9wZXJhdGVzIGluIDAuMjUgZEJtICgxLzQpICovCisJdSAqPSA0OworCWlmICh2d3JxLT5kaXNhYmxlZCkgeworCQkvKiBkb24ndCBrbm93IGhvdyB0byBkaXNhYmxlIHJhZGlvICovCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6ICVzKCkgZGlzYWJsaW5nIHJhZGlvIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLlxuIiwKKwkJICAgICAgIHByaXYtPm5kZXYtPm5hbWUsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRU5PVFNVUFA7CisJfSBlbHNlIGlmICh2d3JxLT5maXhlZCkKKwkJLyogY3VycmVudGx5IG9ubHkgZml4ZWQgdmFsdWUgaXMgc3VwcG9ydGVkICovCisJCXJldHVybiBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgT0lEX0lOTF9PVVRQVVRQT1dFUiwgMCwgJnUpOworCWVsc2UgeworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIiVzOiAlcygpIGF1dG8gcG93ZXIgd2lsbCBiZSBpbXBsZW1lbnRlZCBsYXRlci5cbiIsCisJCSAgICAgICBwcml2LT5uZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVOT1RTVVBQOworCX0KK30KKworc3RhdGljIGludAorcHJpc201NF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkgICAgICBfX3UzMiAqIHV3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9yZXNldChuZXRkZXZfcHJpdihuZGV2KSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJpc201NF9nZXRfb2lkKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKQoreworCXVuaW9uIG9pZF9yZXNfdCByOworCWludCBydmFsdWU7CisJZW51bSBvaWRfbnVtX3QgbiA9IGR3cnEtPmZsYWdzOworCisJcnZhbHVlID0gbWd0X2dldF9yZXF1ZXN0KChpc2xwY2lfcHJpdmF0ZSAqKSBuZGV2LT5wcml2LCBuLCAwLCBOVUxMLCAmcik7CisJZHdycS0+bGVuZ3RoID0gbWd0X3Jlc3BvbnNlX3RvX3N0cihuLCAmciwgZXh0cmEpOworCWlmICgoaXNsX29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUpICE9IE9JRF9UWVBFX1UzMikKKwkJa2ZyZWUoci5wdHIpOworCXJldHVybiBydmFsdWU7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X3UzMihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJX191MzIgKiB1d3JxLCBjaGFyICpleHRyYSkKK3sKKwl1MzIgb2lkID0gdXdycVswXSwgdSA9IHV3cnFbMV07CisKKwlyZXR1cm4gbWd0X3NldF9yZXF1ZXN0KChpc2xwY2lfcHJpdmF0ZSAqKSBuZGV2LT5wcml2LCBvaWQsIDAsICZ1KTsKK30KKworc3RhdGljIGludAorcHJpc201NF9zZXRfcmF3KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKQoreworCXUzMiBvaWQgPSBkd3JxLT5mbGFnczsKKworCXJldHVybiBtZ3Rfc2V0X3JlcXVlc3QoKGlzbHBjaV9wcml2YXRlICopIG5kZXYtPnByaXYsIG9pZCwgMCwgZXh0cmEpOworfQorCit2b2lkCitwcmlzbTU0X2FjbF9pbml0KHN0cnVjdCBpc2xwY2lfYWNsICphY2wpCit7CisJc2VtYV9pbml0KCZhY2wtPnNlbSwgMSk7CisJSU5JVF9MSVNUX0hFQUQoJmFjbC0+bWFjX2xpc3QpOworCWFjbC0+c2l6ZSA9IDA7CisJYWNsLT5wb2xpY3kgPSBNQUNfUE9MSUNZX09QRU47Cit9CisKK3N0YXRpYyB2b2lkCitwcmlzbTU0X2NsZWFyX21hYyhzdHJ1Y3QgaXNscGNpX2FjbCAqYWNsKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm5leHQ7CisJc3RydWN0IG1hY19lbnRyeSAqZW50cnk7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhY2wtPnNlbSkpCisJCXJldHVybjsKKworCWlmIChhY2wtPnNpemUgPT0gMCkgeworCQl1cCgmYWNsLT5zZW0pOworCQlyZXR1cm47CisJfQorCisJZm9yIChwdHIgPSBhY2wtPm1hY19saXN0Lm5leHQsIG5leHQgPSBwdHItPm5leHQ7CisJICAgICBwdHIgIT0gJmFjbC0+bWFjX2xpc3Q7IHB0ciA9IG5leHQsIG5leHQgPSBwdHItPm5leHQpIHsKKwkJZW50cnkgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1hY19lbnRyeSwgX2xpc3QpOworCQlsaXN0X2RlbChwdHIpOworCQlrZnJlZShlbnRyeSk7CisJfQorCWFjbC0+c2l6ZSA9IDA7CisJdXAoJmFjbC0+c2VtKTsKK30KKwordm9pZAorcHJpc201NF9hY2xfY2xlYW4oc3RydWN0IGlzbHBjaV9hY2wgKmFjbCkKK3sKKwlwcmlzbTU0X2NsZWFyX21hYyhhY2wpOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2FkZF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBzb2NrYWRkciAqYXdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgaXNscGNpX2FjbCAqYWNsID0gJnByaXYtPmFjbDsKKwlzdHJ1Y3QgbWFjX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopIGV4dHJhOworCisJaWYgKGFkZHItPnNhX2ZhbWlseSAhPSBBUlBIUkRfRVRIRVIpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWVudHJ5ID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCBtYWNfZW50cnkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1jcHkoZW50cnktPmFkZHIsIGFkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFjbC0+c2VtKSkgeworCQlrZnJlZShlbnRyeSk7CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5fbGlzdCwgJmFjbC0+bWFjX2xpc3QpOworCWFjbC0+c2l6ZSsrOworCXVwKCZhY2wtPnNlbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJpc201NF9kZWxfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQlzdHJ1Y3Qgc29ja2FkZHIgKmF3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGlzbHBjaV9hY2wgKmFjbCA9ICZwcml2LT5hY2w7CisJc3RydWN0IG1hY19lbnRyeSAqZW50cnk7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgZXh0cmE7CisKKwlpZiAoYWRkci0+c2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYWNsLT5zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCWZvciAocHRyID0gYWNsLT5tYWNfbGlzdC5uZXh0OyBwdHIgIT0gJmFjbC0+bWFjX2xpc3Q7IHB0ciA9IHB0ci0+bmV4dCkgeworCQllbnRyeSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWFjX2VudHJ5LCBfbGlzdCk7CisKKwkJaWYgKG1lbWNtcChlbnRyeS0+YWRkciwgYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pID09IDApIHsKKwkJCWxpc3RfZGVsKHB0cik7CisJCQlhY2wtPnNpemUtLTsKKwkJCWtmcmVlKGVudHJ5KTsKKwkJCXVwKCZhY2wtPnNlbSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwl1cCgmYWNsLT5zZW0pOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAqZHdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgaXNscGNpX2FjbCAqYWNsID0gJnByaXYtPmFjbDsKKwlzdHJ1Y3QgbWFjX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CisJc3RydWN0IHNvY2thZGRyICpkc3QgPSAoc3RydWN0IHNvY2thZGRyICopIGV4dHJhOworCisJZHdycS0+bGVuZ3RoID0gMDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFjbC0+c2VtKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCWZvciAocHRyID0gYWNsLT5tYWNfbGlzdC5uZXh0OyBwdHIgIT0gJmFjbC0+bWFjX2xpc3Q7IHB0ciA9IHB0ci0+bmV4dCkgeworCQllbnRyeSA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgbWFjX2VudHJ5LCBfbGlzdCk7CisKKwkJbWVtY3B5KGRzdC0+c2FfZGF0YSwgZW50cnktPmFkZHIsIEVUSF9BTEVOKTsKKwkJZHN0LT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCWR3cnEtPmxlbmd0aCsrOworCQlkc3QrKzsKKwl9CisJdXAoJmFjbC0+c2VtKTsKKwlyZXR1cm4gMDsKK30KKworLyogU2V0dGluZyBwb2xpY3kgYWxzbyBjbGVhcnMgdGhlIE1BQyBhY2wsIGV2ZW4gaWYgd2UgZG9uJ3QgY2hhbmdlIHRoZSBkZWZhdXQKKyAqIHBvbGljeQorICovCisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X3BvbGljeShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgX191MzIgKiB1d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBpc2xwY2lfYWNsICphY2wgPSAmcHJpdi0+YWNsOworCXUzMiBtbG1lYXV0b2xldmVsOworCisJcHJpc201NF9jbGVhcl9tYWMoYWNsKTsKKworCWlmICgoKnV3cnEgPCBNQUNfUE9MSUNZX09QRU4pIHx8ICgqdXdycSA+IE1BQ19QT0xJQ1lfUkVKRUNUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duX3dyaXRlKCZwcml2LT5taWJfc2VtKTsKKworCWFjbC0+cG9saWN5ID0gKnV3cnE7CisKKwkvKiB0aGUgQUNMIGNvZGUgbmVlZHMgYW4gaW50ZXJtZWRpYXRlIG1sbWVhdXRvbGV2ZWwgKi8KKwlpZiAoKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpICYmCisJICAgIChhY2wtPnBvbGljeSAhPSBNQUNfUE9MSUNZX09QRU4pKQorCQltbG1lYXV0b2xldmVsID0gRE9UMTFfTUxNRV9JTlRFUk1FRElBVEU7CisJZWxzZQorCQltbG1lYXV0b2xldmVsID0gQ0FSRF9ERUZBVUxUX01MTUVfTU9ERTsKKwlpZiAocHJpdi0+d3BhKQorCQltbG1lYXV0b2xldmVsID0gRE9UMTFfTUxNRV9FWFRFTkRFRDsKKwltZ3Rfc2V0KHByaXYsIERPVDExX09JRF9NTE1FQVVUT0xFVkVMLCAmbWxtZWF1dG9sZXZlbCk7CisJLyogcmVzdGFydCB0aGUgY2FyZCB3aXRoIG91ciBuZXcgcG9saWN5ICovCisJaWYgKG1ndF9jb21taXQocHJpdikpIHsKKwkJdXBfd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCQlyZXR1cm4gLUVJTzsKKwl9CisJdXBfd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfZ2V0X3BvbGljeShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgX191MzIgKiB1d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBpc2xwY2lfYWNsICphY2wgPSAmcHJpdi0+YWNsOworCisJKnV3cnEgPSBhY2wtPnBvbGljeTsKKworCXJldHVybiAwOworfQorCisvKiBSZXR1cm4gMSBvbmx5IGlmIGNsaWVudCBzaG91bGQgYmUgYWNjZXB0ZWQuICovCisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfbWFjX2FjY2VwdChzdHJ1Y3QgaXNscGNpX2FjbCAqYWNsLCBjaGFyICptYWMpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcHRyOworCXN0cnVjdCBtYWNfZW50cnkgKmVudHJ5OworCWludCByZXMgPSAwOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYWNsLT5zZW0pKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJaWYgKGFjbC0+cG9saWN5ID09IE1BQ19QT0xJQ1lfT1BFTikgeworCQl1cCgmYWNsLT5zZW0pOworCQlyZXR1cm4gMTsKKwl9CisKKwlmb3IgKHB0ciA9IGFjbC0+bWFjX2xpc3QubmV4dDsgcHRyICE9ICZhY2wtPm1hY19saXN0OyBwdHIgPSBwdHItPm5leHQpIHsKKwkJZW50cnkgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1hY19lbnRyeSwgX2xpc3QpOworCQlpZiAobWVtY21wKGVudHJ5LT5hZGRyLCBtYWMsIEVUSF9BTEVOKSA9PSAwKSB7CisJCQlyZXMgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmVzID0gKGFjbC0+cG9saWN5ID09IE1BQ19QT0xJQ1lfQUNDRVBUKSA/ICFyZXMgOiByZXM7CisJdXAoJmFjbC0+c2VtKTsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfa2lja19hbGwoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSBzdHJ1Y3QgaXdfcG9pbnQgKmR3cnEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBvYmpfbWxtZSAqbWxtZTsKKwlpbnQgcnZhbHVlOworCisJbWxtZSA9IGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3Qgb2JqX21sbWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAobWxtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFRlbGwgdGhlIGNhcmQgdG8ga2ljayBldmVyeSBjbGllbnQgKi8KKwltbG1lLT5pZCA9IDA7CisJcnZhbHVlID0KKwkgICAgbWd0X3NldF9yZXF1ZXN0KG5ldGRldl9wcml2KG5kZXYpLCBET1QxMV9PSURfRElTQVNTT0NJQVRFLCAwLCBtbG1lKTsKKwlrZnJlZShtbG1lKTsKKworCXJldHVybiBydmFsdWU7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfa2lja19tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSBzdHJ1Y3Qgc29ja2FkZHIgKmF3cnEsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBvYmpfbWxtZSAqbWxtZTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopIGV4dHJhOworCWludCBydmFsdWU7CisKKwlpZiAoYWRkci0+c2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJbWxtZSA9IGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3Qgb2JqX21sbWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAobWxtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFRlbGwgdGhlIGNhcmQgdG8gb25seSBraWNrIHRoZSBjb3JyZXNwb25kaW5nIGJhc3RhcmQgKi8KKwltZW1jcHkobWxtZS0+YWRkcmVzcywgYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOworCW1sbWUtPmlkID0gLTE7CisJcnZhbHVlID0KKwkgICAgbWd0X3NldF9yZXF1ZXN0KG5ldGRldl9wcml2KG5kZXYpLCBET1QxMV9PSURfRElTQVNTT0NJQVRFLCAwLCBtbG1lKTsKKworCWtmcmVlKG1sbWUpOworCisJcmV0dXJuIHJ2YWx1ZTsKK30KKworLyogVHJhbnNsYXRlIGEgVFJBUCBvaWQgaW50byBhIHdpcmVsZXNzIGV2ZW50LiBDYWxsZWQgaW4gaXNscGNpX21ndF9yZWNlaXZlLiAqLworCitzdGF0aWMgdm9pZAorZm9ybWF0X2V2ZW50KGlzbHBjaV9wcml2YXRlICpwcml2LCBjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzdHIsCisJICAgICBjb25zdCBzdHJ1Y3Qgb2JqX21sbWUgKm1sbWUsIHUxNiAqbGVuZ3RoLCBpbnQgZXJyb3IpCit7CisJY29uc3QgdTggKmEgPSBtbG1lLT5hZGRyZXNzOworCWludCBuID0gc25wcmludGYoZGVzdCwgSVdfQ1VTVE9NX01BWCwKKwkJCSAiJXMgJXMgJTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg6JTIuMlggJXMgKCUyLjJYKSIsCisJCQkgc3RyLAorCQkJICgocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgPyAiZnJvbSIgOiAidG8iKSwKKwkJCSBhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdLAorCQkJIChlcnJvciA/IChtbG1lLT5jb2RlID8gIiA6IFJFSkVDVEVEICIgOiAiIDogQUNDRVBURUQgIikKKwkJCSAgOiAiIiksIG1sbWUtPmNvZGUpOworCUJVR19PTihuID4gSVdfQ1VTVE9NX01BWCk7CisJKmxlbmd0aCA9IG47Cit9CisKK3N0YXRpYyB2b2lkCitzZW5kX2Zvcm1hdHRlZF9ldmVudChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgY29uc3QgY2hhciAqc3RyLAorCQkgICAgIGNvbnN0IHN0cnVjdCBvYmpfbWxtZSAqbWxtZSwgaW50IGVycm9yKQoreworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwljaGFyICptZW1wdHI7CisKKwltZW1wdHIgPSBrbWFsbG9jKElXX0NVU1RPTV9NQVgsIEdGUF9LRVJORUwpOworCWlmICghbWVtcHRyKQorCQlyZXR1cm47CisJd3JxdS5kYXRhLnBvaW50ZXIgPSBtZW1wdHI7CisJd3JxdS5kYXRhLmxlbmd0aCA9IDA7CisJZm9ybWF0X2V2ZW50KHByaXYsIG1lbXB0ciwgc3RyLCBtbG1lLCAmd3JxdS5kYXRhLmxlbmd0aCwKKwkJICAgICBlcnJvcik7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChwcml2LT5uZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgbWVtcHRyKTsKKwlrZnJlZShtZW1wdHIpOworfQorCitzdGF0aWMgdm9pZAorc2VuZF9zaW1wbGVfZXZlbnQoaXNscGNpX3ByaXZhdGUgKnByaXYsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisJY2hhciAqbWVtcHRyOworCWludCBuID0gc3RybGVuKHN0cik7CisKKwltZW1wdHIgPSBrbWFsbG9jKElXX0NVU1RPTV9NQVgsIEdGUF9LRVJORUwpOworCWlmICghbWVtcHRyKQorCQlyZXR1cm47CisJQlVHX09OKG4gPiBJV19DVVNUT01fTUFYKTsKKwl3cnF1LmRhdGEucG9pbnRlciA9IG1lbXB0cjsKKwl3cnF1LmRhdGEubGVuZ3RoID0gbjsKKwlzdHJjcHkobWVtcHRyLCBzdHIpOworCXdpcmVsZXNzX3NlbmRfZXZlbnQocHJpdi0+bmRldiwgSVdFVkNVU1RPTSwgJndycXUsIG1lbXB0cik7CisJa2ZyZWUobWVtcHRyKTsKK30KKworc3RhdGljIHZvaWQKK2xpbmtfY2hhbmdlZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTMyIGJpdHJhdGUpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCWlmIChiaXRyYXRlKSB7CisJCWlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfSU5GUkEpIHsKKwkJCXVuaW9uIGl3cmVxX2RhdGEgdXdycTsKKwkJCXByaXNtNTRfZ2V0X3dhcChuZGV2LCBOVUxMLCAoc3RydWN0IHNvY2thZGRyICopICZ1d3JxLAorCQkJCQlOVUxMKTsKKwkJCXdpcmVsZXNzX3NlbmRfZXZlbnQobmRldiwgU0lPQ0dJV0FQLCAmdXdycSwgTlVMTCk7CisJCX0gZWxzZQorCQkJc2VuZF9zaW1wbGVfZXZlbnQobmV0ZGV2X3ByaXYobmRldiksCisJCQkJCSAgIkxpbmsgZXN0YWJsaXNoZWQiKTsKKwl9IGVsc2UKKwkJc2VuZF9zaW1wbGVfZXZlbnQobmV0ZGV2X3ByaXYobmRldiksICJMaW5rIGxvc3QiKTsKK30KKworLyogQmVhY29uL1Byb2JlUmVzcCBwYXlsb2FkIGhlYWRlciAqLworc3RydWN0IGllZWU4MDIxMV9iZWFjb25fcGhkciB7CisJdTggdGltZXN0YW1wWzhdOworCXUxNiBiZWFjb25faW50OworCXUxNiBjYXBhYl9pbmZvOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgV0xBTl9FSURfR0VORVJJQyAweGRkCitzdGF0aWMgdTggd3BhX29pZFs0XSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMSB9OworCisjZGVmaW5lIE1BQzJTVFIoYSkgKGEpWzBdLCAoYSlbMV0sIChhKVsyXSwgKGEpWzNdLCAoYSlbNF0sIChhKVs1XQorI2RlZmluZSBNQUNTVFIgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IgorCitzdGF0aWMgdm9pZAorcHJpc201NF93cGFfaWVfYWRkKGlzbHBjaV9wcml2YXRlICpwcml2LCB1OCAqYnNzaWQsCisJCSAgIHU4ICp3cGFfaWUsIHNpemVfdCB3cGFfaWVfbGVuKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKKwlzdHJ1Y3QgaXNscGNpX2Jzc193cGFfaWUgKmJzcyA9IE5VTEw7CisKKwlpZiAod3BhX2llX2xlbiA+IE1BWF9XUEFfSUVfTEVOKQorCQl3cGFfaWVfbGVuID0gTUFYX1dQQV9JRV9MRU47CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZwcml2LT53cGFfc2VtKSkKKwkJcmV0dXJuOworCisJLyogdHJ5IHRvIHVzZSBleGlzdGluZyBlbnRyeSAqLworCWxpc3RfZm9yX2VhY2gocHRyLCAmcHJpdi0+YnNzX3dwYV9saXN0KSB7CisJCWJzcyA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgaXNscGNpX2Jzc193cGFfaWUsIGxpc3QpOworCQlpZiAobWVtY21wKGJzcy0+YnNzaWQsIGJzc2lkLCBFVEhfQUxFTikgPT0gMCkgeworCQkJbGlzdF9tb3ZlKCZic3MtPmxpc3QsICZwcml2LT5ic3Nfd3BhX2xpc3QpOworCQkJYnJlYWs7CisJCX0KKwkJYnNzID0gTlVMTDsKKwl9CisKKwlpZiAoYnNzID09IE5VTEwpIHsKKwkJLyogYWRkIGEgbmV3IEJTUyBlbnRyeTsgaWYgbWF4IG51bWJlciBvZiBlbnRyaWVzIGlzIGFscmVhZHkKKwkJICogcmVhY2hlZCwgcmVwbGFjZSB0aGUgbGVhc3QgcmVjZW50bHkgdXBkYXRlZCAqLworCQlpZiAocHJpdi0+bnVtX2Jzc193cGEgPj0gTUFYX0JTU19XUEFfSUVfQ09VTlQpIHsKKwkJCWJzcyA9IGxpc3RfZW50cnkocHJpdi0+YnNzX3dwYV9saXN0LnByZXYsCisJCQkJCSBzdHJ1Y3QgaXNscGNpX2Jzc193cGFfaWUsIGxpc3QpOworCQkJbGlzdF9kZWwoJmJzcy0+bGlzdCk7CisJCX0gZWxzZSB7CisJCQlic3MgPSBrbWFsbG9jKHNpemVvZiAoKmJzcyksIEdGUF9BVE9NSUMpOworCQkJaWYgKGJzcyAhPSBOVUxMKSB7CisJCQkJcHJpdi0+bnVtX2Jzc193cGErKzsKKwkJCQltZW1zZXQoYnNzLCAwLCBzaXplb2YgKCpic3MpKTsKKwkJCX0KKwkJfQorCQlpZiAoYnNzICE9IE5VTEwpIHsKKwkJCW1lbWNweShic3MtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOworCQkJbGlzdF9hZGQoJmJzcy0+bGlzdCwgJnByaXYtPmJzc193cGFfbGlzdCk7CisJCX0KKwl9CisKKwlpZiAoYnNzICE9IE5VTEwpIHsKKwkJbWVtY3B5KGJzcy0+d3BhX2llLCB3cGFfaWUsIHdwYV9pZV9sZW4pOworCQlic3MtPndwYV9pZV9sZW4gPSB3cGFfaWVfbGVuOworCQlic3MtPmxhc3RfdXBkYXRlID0gamlmZmllczsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9ERUJVRyAiRmFpbGVkIHRvIGFkZCBCU1MgV1BBIGVudHJ5IGZvciAiIE1BQ1NUUgorCQkgICAgICAgIlxuIiwgTUFDMlNUUihic3NpZCkpOworCX0KKworCS8qIGV4cGlyZSBvbGQgZW50cmllcyBmcm9tIFdQQSBsaXN0ICovCisJd2hpbGUgKHByaXYtPm51bV9ic3Nfd3BhID4gMCkgeworCQlic3MgPSBsaXN0X2VudHJ5KHByaXYtPmJzc193cGFfbGlzdC5wcmV2LAorCQkJCSBzdHJ1Y3QgaXNscGNpX2Jzc193cGFfaWUsIGxpc3QpOworCQlpZiAoIXRpbWVfYWZ0ZXIoamlmZmllcywgYnNzLT5sYXN0X3VwZGF0ZSArIDYwICogSFopKQorCQkJYnJlYWs7CisKKwkJbGlzdF9kZWwoJmJzcy0+bGlzdCk7CisJCXByaXYtPm51bV9ic3Nfd3BhLS07CisJCWtmcmVlKGJzcyk7CisJfQorCisJdXAoJnByaXYtPndwYV9zZW0pOworfQorCitzdGF0aWMgc2l6ZV90CitwcmlzbTU0X3dwYV9pZV9nZXQoaXNscGNpX3ByaXZhdGUgKnByaXYsIHU4ICpic3NpZCwgdTggKndwYV9pZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7CisJc3RydWN0IGlzbHBjaV9ic3Nfd3BhX2llICpic3MgPSBOVUxMOworCXNpemVfdCBsZW4gPSAwOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmcHJpdi0+d3BhX3NlbSkpCisJCXJldHVybiAwOworCisJbGlzdF9mb3JfZWFjaChwdHIsICZwcml2LT5ic3Nfd3BhX2xpc3QpIHsKKwkJYnNzID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBpc2xwY2lfYnNzX3dwYV9pZSwgbGlzdCk7CisJCWlmIChtZW1jbXAoYnNzLT5ic3NpZCwgYnNzaWQsIEVUSF9BTEVOKSA9PSAwKQorCQkJYnJlYWs7CisJCWJzcyA9IE5VTEw7CisJfQorCWlmIChic3MpIHsKKwkJbGVuID0gYnNzLT53cGFfaWVfbGVuOworCQltZW1jcHkod3BhX2llLCBic3MtPndwYV9pZSwgbGVuKTsKKwl9CisJdXAoJnByaXYtPndwYV9zZW0pOworCisJcmV0dXJuIGxlbjsKK30KKwordm9pZAorcHJpc201NF93cGFfaWVfaW5pdChpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+YnNzX3dwYV9saXN0KTsKKwlzZW1hX2luaXQoJnByaXYtPndwYV9zZW0sIDEpOworfQorCit2b2lkCitwcmlzbTU0X3dwYV9pZV9jbGVhbihpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwdHIsICpuOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHB0ciwgbiwgJnByaXYtPmJzc193cGFfbGlzdCkgeworCQlzdHJ1Y3QgaXNscGNpX2Jzc193cGFfaWUgKmJzczsKKwkJYnNzID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBpc2xwY2lfYnNzX3dwYV9pZSwgbGlzdCk7CisJCWtmcmVlKGJzcyk7CisJfQorfQorCitzdGF0aWMgdm9pZAorcHJpc201NF9wcm9jZXNzX2Jzc19kYXRhKGlzbHBjaV9wcml2YXRlICpwcml2LCB1MzIgb2lkLCB1OCAqYWRkciwKKwkJCSB1OCAqcGF5bG9hZCwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2JlYWNvbl9waGRyICpoZHI7CisJdTggKnBvcywgKmVuZDsKKworCWlmICghcHJpdi0+d3BhKQorCQlyZXR1cm47CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9iZWFjb25fcGhkciAqKSBwYXlsb2FkOworCXBvcyA9ICh1OCAqKSAoaGRyICsgMSk7CisJZW5kID0gcGF5bG9hZCArIGxlbjsKKwl3aGlsZSAocG9zIDwgZW5kKSB7CisJCWlmIChwb3MgKyAyICsgcG9zWzFdID4gZW5kKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiUGFyc2luZyBCZWFjb24vUHJvYmVSZXNwIGZhaWxlZCAiCisJCQkgICAgICAgImZvciAiIE1BQ1NUUiAiXG4iLCBNQUMyU1RSKGFkZHIpKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAocG9zWzBdID09IFdMQU5fRUlEX0dFTkVSSUMgJiYgcG9zWzFdID49IDQgJiYKKwkJICAgIG1lbWNtcChwb3MgKyAyLCB3cGFfb2lkLCA0KSA9PSAwKSB7CisJCQlwcmlzbTU0X3dwYV9pZV9hZGQocHJpdiwgYWRkciwgcG9zLCBwb3NbMV0gKyAyKTsKKwkJCXJldHVybjsKKwkJfQorCQlwb3MgKz0gMiArIHBvc1sxXTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfcmVxdWVzdChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IG9ial9tbG1lICptbG1lLCBlbnVtIG9pZF9udW1fdCBvaWQpCit7CisJaWYgKCgobWxtZS0+c3RhdGUgPT0gRE9UMTFfU1RBVEVfQVVUSElORykgfHwKKwkgICAgIChtbG1lLT5zdGF0ZSA9PSBET1QxMV9TVEFURV9BU1NPQ0lORykpCisJICAgICYmIG1ndF9tbG1lX2Fuc3dlcihwcml2KSkgeworCQkvKiBTb21lb25lIGlzIHJlcXVlc3RpbmcgYXV0aCBhbmQgd2UgbXVzdCByZXNwb25kLiBKdXN0IHNlbmQgYmFjaworCQkgKiB0aGUgdHJhcCB3aXRoIGVycm9yIGNvZGUgc2V0IGFjY29yZGluZ2x5LgorCQkgKi8KKwkJbWxtZS0+Y29kZSA9IHByaXNtNTRfbWFjX2FjY2VwdCgmcHJpdi0+YWNsLAorCQkJCQkJbWxtZS0+YWRkcmVzcykgPyAwIDogMTsKKwkJbWd0X3NldF9yZXF1ZXN0KHByaXYsIG9pZCwgMCwgbWxtZSk7CisJfQorfQorCitzdGF0aWMgaW50CitwcmlzbTU0X3Byb2Nlc3NfdHJhcF9oZWxwZXIoaXNscGNpX3ByaXZhdGUgKnByaXYsIGVudW0gb2lkX251bV90IG9pZCwKKwkJCSAgICBjaGFyICpkYXRhKQoreworCXN0cnVjdCBvYmpfbWxtZSAqbWxtZSA9IChzdHJ1Y3Qgb2JqX21sbWUgKikgZGF0YTsKKwlzdHJ1Y3Qgb2JqX21sbWVleCAqbWxtZWV4ID0gKHN0cnVjdCBvYmpfbWxtZWV4ICopIGRhdGE7CisJc3RydWN0IG9ial9tbG1lZXggKmNvbmZpcm07CisJdTggd3BhX2llW01BWF9XUEFfSUVfTEVOXTsKKwlpbnQgd3BhX2llX2xlbjsKKwlzaXplX3QgbGVuID0gMDsgLyogdTE2LCBiZXR0ZXI/ICovCisJdTggKnBheWxvYWQgPSBOVUxMLCAqcG9zID0gTlVMTDsKKwlpbnQgcmV0OworCisJLyogSSB0aGluayBhbGwgdHJhcGFibGUgb2JqZWN0cyBhcmUgbGlzdGVkIGhlcmUuCisJICogU29tZSBvaWRzIGhhdmUgYSBFWCB2ZXJzaW9uLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZXkgYXJlIGVtaXR0ZWQKKwkgKiBpbiBET1QxMV9NTE1FX0VYVEVOREVEIG1vZGUgKHNldCB3aXRoIERPVDExX09JRF9NTE1FQVVUT0xFVkVMKQorCSAqIHdpdGggbW9yZSBpbmZvLgorCSAqIFRoZSBmZXcgZXZlbnRzIGFscmVhZHkgZGVmaW5lZCBieSB0aGUgd2lyZWxlc3MgdG9vbHMgYXJlIG5vdCByZWFsbHkKKwkgKiBzdWl0ZWQuIFdlIHVzZSB0aGUgbW9yZSBmbGV4aWJsZSBjdXN0b20gZXZlbnQgZmFjaWxpdHkuCisJICovCisKKwlpZiAob2lkID49IERPVDExX09JRF9CRUFDT04pIHsKKwkJbGVuID0gbWxtZWV4LT5zaXplOworCQlwYXlsb2FkID0gcG9zID0gbWxtZWV4LT5kYXRhOworCX0KKworCS8qIEkgZmVhciBwcmlzbTU0X3Byb2Nlc3NfYnNzX2RhdGEgd29uJ3Qgd29yayB3aXRoIGJpZyBlbmRpYW4gZGF0YSAqLworCWlmICgob2lkID09IERPVDExX09JRF9CRUFDT04pIHx8IChvaWQgPT0gRE9UMTFfT0lEX1BST0JFKSkKKwkJcHJpc201NF9wcm9jZXNzX2Jzc19kYXRhKHByaXYsIG9pZCwgbWxtZWV4LT5hZGRyZXNzLAorCQkJCQkgcGF5bG9hZCwgbGVuKTsKKworCW1ndF9sZV90b19jcHUoaXNsX29pZFtvaWRdLmZsYWdzICYgT0lEX0ZMQUdfVFlQRSwgKHZvaWQgKikgbWxtZSk7CisKKwlzd2l0Y2ggKG9pZCkgeworCisJY2FzZSBHRU5fT0lEX0xJTktTVEFURToKKwkJbGlua19jaGFuZ2VkKHByaXYtPm5kZXYsICh1MzIpICpkYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIERPVDExX09JRF9NSUNGQUlMVVJFOgorCQlzZW5kX3NpbXBsZV9ldmVudChwcml2LCAiTWljIGZhaWx1cmUiKTsKKwkJYnJlYWs7CisKKwljYXNlIERPVDExX09JRF9ERUFVVEhFTlRJQ0FURToKKwkJc2VuZF9mb3JtYXR0ZWRfZXZlbnQocHJpdiwgIkRlQXV0aGVudGljYXRlIHJlcXVlc3QiLCBtbG1lLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIERPVDExX09JRF9BVVRIRU5USUNBVEU6CisJCWhhbmRsZV9yZXF1ZXN0KHByaXYsIG1sbWUsIG9pZCk7CisJCXNlbmRfZm9ybWF0dGVkX2V2ZW50KHByaXYsICJBdXRoZW50aWNhdGUgcmVxdWVzdCIsIG1sbWUsIDEpOworCQlicmVhazsKKworCWNhc2UgRE9UMTFfT0lEX0RJU0FTU09DSUFURToKKwkJc2VuZF9mb3JtYXR0ZWRfZXZlbnQocHJpdiwgIkRpc2Fzc29jaWF0ZSByZXF1ZXN0IiwgbWxtZSwgMCk7CisJCWJyZWFrOworCisJY2FzZSBET1QxMV9PSURfQVNTT0NJQVRFOgorCQloYW5kbGVfcmVxdWVzdChwcml2LCBtbG1lLCBvaWQpOworCQlzZW5kX2Zvcm1hdHRlZF9ldmVudChwcml2LCAiQXNzb2NpYXRlIHJlcXVlc3QiLCBtbG1lLCAxKTsKKwkJYnJlYWs7CisKKwljYXNlIERPVDExX09JRF9SRUFTU09DSUFURToKKwkJaGFuZGxlX3JlcXVlc3QocHJpdiwgbWxtZSwgb2lkKTsKKwkJc2VuZF9mb3JtYXR0ZWRfZXZlbnQocHJpdiwgIlJlQXNzb2NpYXRlIHJlcXVlc3QiLCBtbG1lLCAxKTsKKwkJYnJlYWs7CisKKwljYXNlIERPVDExX09JRF9CRUFDT046CisJCXNlbmRfZm9ybWF0dGVkX2V2ZW50KHByaXYsCisJCQkJICAgICAiUmVjZWl2ZWQgYSBiZWFjb24gZnJvbSBhbiB1bmtvd24gQVAiLAorCQkJCSAgICAgbWxtZSwgMCk7CisJCWJyZWFrOworCisJY2FzZSBET1QxMV9PSURfUFJPQkU6CisJCS8qIHdlIHJlY2VpdmVkIGEgcHJvYmUgZnJvbSBhIGNsaWVudC4gKi8KKwkJc2VuZF9mb3JtYXR0ZWRfZXZlbnQocHJpdiwgIlJlY2VpdmVkIGEgcHJvYmUgZnJvbSBjbGllbnQiLCBtbG1lLAorCQkJCSAgICAgMCk7CisJCWJyZWFrOworCisJCS8qIE5vdGUgOiAibWxtZSIgaXMgYWN0dWFsbHkgYSAic3RydWN0IG9ial9tbG1lZXggKiIgaGVyZSwgYnV0IHRoaXMKKwkJICogaXMgYmFja3dhcmQgY29tcGF0aWJsZSBsYXlvdXQtd2lzZSB3aXRoICJzdHJ1Y3Qgb2JqX21sbWUiLgorCQkgKi8KKworCWNhc2UgRE9UMTFfT0lEX0RFQVVUSEVOVElDQVRFRVg6CisJCXNlbmRfZm9ybWF0dGVkX2V2ZW50KHByaXYsICJEZUF1dGhlbnRpY2F0ZSByZXF1ZXN0IiwgbWxtZSwgMCk7CisJCWJyZWFrOworCisJY2FzZSBET1QxMV9PSURfQVVUSEVOVElDQVRFRVg6CisJCWhhbmRsZV9yZXF1ZXN0KHByaXYsIG1sbWUsIG9pZCk7CisJCXNlbmRfZm9ybWF0dGVkX2V2ZW50KHByaXYsICJBdXRoZW50aWNhdGUgcmVxdWVzdCAoZXgpIiwgbWxtZSwgMSk7CisKKwkJaWYgKHByaXYtPml3X21vZGUgIT0gSVdfTU9ERV9NQVNURVIgCisJCQkJJiYgbWxtZWV4LT5zdGF0ZSAhPSBET1QxMV9TVEFURV9BVVRISU5HKQorCQkJYnJlYWs7CisKKwkJY29uZmlybSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvYmpfbWxtZWV4KSArIDYsIEdGUF9BVE9NSUMpOworCisJCWlmICghY29uZmlybSkgCisJCQlicmVhazsKKworCQltZW1jcHkoJmNvbmZpcm0tPmFkZHJlc3MsIG1sbWVleC0+YWRkcmVzcywgRVRIX0FMRU4pOworCQlwcmludGsoS0VSTl9ERUJVRyAiQXV0aGVudGljYXRlIGZyb206IGFkZHJlc3M6XHQlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgCisJCQkJbWxtZWV4LT5hZGRyZXNzWzBdLAorCQkJCW1sbWVleC0+YWRkcmVzc1sxXSwKKwkJCQltbG1lZXgtPmFkZHJlc3NbMl0sCisJCQkJbWxtZWV4LT5hZGRyZXNzWzNdLAorCQkJCW1sbWVleC0+YWRkcmVzc1s0XSwKKwkJCQltbG1lZXgtPmFkZHJlc3NbNV0KKwkJCQkpOworCQljb25maXJtLT5pZCA9IC0xOyAvKiBvciBtbG1lZXgtPmlkID8gKi8KKwkJY29uZmlybS0+c3RhdGUgPSAwOyAvKiBub3QgdXNlZCAqLworCQljb25maXJtLT5jb2RlID0gMDsKKwkJY29uZmlybS0+c2l6ZSA9IDY7CisJCWNvbmZpcm0tPmRhdGFbMF0gPSAweDAwOworCQljb25maXJtLT5kYXRhWzFdID0gMHgwMDsKKwkJY29uZmlybS0+ZGF0YVsyXSA9IDB4MDI7CisJCWNvbmZpcm0tPmRhdGFbM10gPSAweDAwOworCQljb25maXJtLT5kYXRhWzRdID0gMHgwMDsKKwkJY29uZmlybS0+ZGF0YVs1XSA9IDB4MDA7CisKKwkJcmV0ID0gbWd0X3NldF92YXJsZW4ocHJpdiwgRE9UMTFfT0lEX0FTU09DSUFURUVYLCBjb25maXJtLCA2KTsKKworCQlrZnJlZShjb25maXJtKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWJyZWFrOworCisJY2FzZSBET1QxMV9PSURfRElTQVNTT0NJQVRFRVg6CisJCXNlbmRfZm9ybWF0dGVkX2V2ZW50KHByaXYsICJEaXNhc3NvY2lhdGUgcmVxdWVzdCAoZXgpIiwgbWxtZSwgMCk7CisJCWJyZWFrOworCisJY2FzZSBET1QxMV9PSURfQVNTT0NJQVRFRVg6CisJCWhhbmRsZV9yZXF1ZXN0KHByaXYsIG1sbWUsIG9pZCk7CisJCXNlbmRfZm9ybWF0dGVkX2V2ZW50KHByaXYsICJBc3NvY2lhdGUgcmVxdWVzdCAoZXgpIiwgbWxtZSwgMSk7CisKKwkJaWYgKHByaXYtPml3X21vZGUgIT0gSVdfTU9ERV9NQVNURVIgCisJCQkJJiYgbWxtZWV4LT5zdGF0ZSAhPSBET1QxMV9TVEFURV9BVVRISU5HKQorCQkJYnJlYWs7CisJCQorCQljb25maXJtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG9ial9tbG1lZXgpLCBHRlBfQVRPTUlDKTsKKworCQlpZiAoIWNvbmZpcm0pCisJCQlicmVhazsKKworCQltZW1jcHkoJmNvbmZpcm0tPmFkZHJlc3MsIG1sbWVleC0+YWRkcmVzcywgRVRIX0FMRU4pOworCisJCWNvbmZpcm0tPmlkID0gKChzdHJ1Y3Qgb2JqX21sbWVleCAqKW1sbWUpLT5pZDsKKwkJY29uZmlybS0+c3RhdGUgPSAwOyAvKiBub3QgdXNlZCAqLworCQljb25maXJtLT5jb2RlID0gMDsKKworCQl3cGFfaWVfbGVuID0gcHJpc201NF93cGFfaWVfZ2V0KHByaXYsIG1sbWVleC0+YWRkcmVzcywgd3BhX2llKTsKKworCQlpZiAoIXdwYV9pZV9sZW4pIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJObyBXUEEgSUUgZm91bmQgZnJvbSAiCisJCQkJCSJhZGRyZXNzOlx0JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsIAorCQkJCW1sbWVleC0+YWRkcmVzc1swXSwKKwkJCQltbG1lZXgtPmFkZHJlc3NbMV0sCisJCQkJbWxtZWV4LT5hZGRyZXNzWzJdLAorCQkJCW1sbWVleC0+YWRkcmVzc1szXSwKKwkJCQltbG1lZXgtPmFkZHJlc3NbNF0sCisJCQkJbWxtZWV4LT5hZGRyZXNzWzVdCisJCQkJKTsKKwkJCWtmcmVlKGNvbmZpcm0pOworCQkJYnJlYWs7CisJCX0KKworCQljb25maXJtLT5zaXplID0gd3BhX2llX2xlbjsKKwkJbWVtY3B5KCZjb25maXJtLT5kYXRhLCB3cGFfaWUsIHdwYV9pZV9sZW4pOworCisJCW1ndF9zZXRfdmFybGVuKHByaXYsIG9pZCwgY29uZmlybSwgd3BhX2llX2xlbik7CisKKwkJa2ZyZWUoY29uZmlybSk7CisJCQorCQlicmVhazsKKworCWNhc2UgRE9UMTFfT0lEX1JFQVNTT0NJQVRFRVg6CisJCWhhbmRsZV9yZXF1ZXN0KHByaXYsIG1sbWUsIG9pZCk7CisJCXNlbmRfZm9ybWF0dGVkX2V2ZW50KHByaXYsICJSZWFzc29jaWF0ZSByZXF1ZXN0IChleCkiLCBtbG1lLCAxKTsKKworCQlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX01BU1RFUiAKKwkJCQkmJiBtbG1lZXgtPnN0YXRlICE9IERPVDExX1NUQVRFX0FTU09DSU5HKQorCQkJYnJlYWs7CisKKwkJY29uZmlybSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvYmpfbWxtZWV4KSwgR0ZQX0FUT01JQyk7CisKKwkJaWYgKCFjb25maXJtKQorCQkJYnJlYWs7CisKKwkJbWVtY3B5KCZjb25maXJtLT5hZGRyZXNzLCBtbG1lZXgtPmFkZHJlc3MsIEVUSF9BTEVOKTsKKworCQljb25maXJtLT5pZCA9IG1sbWVleC0+aWQ7CisJCWNvbmZpcm0tPnN0YXRlID0gMDsgLyogbm90IHVzZWQgKi8KKwkJY29uZmlybS0+Y29kZSA9IDA7CisKKwkJd3BhX2llX2xlbiA9IHByaXNtNTRfd3BhX2llX2dldChwcml2LCBtbG1lZXgtPmFkZHJlc3MsIHdwYV9pZSk7CisKKwkJaWYgKCF3cGFfaWVfbGVuKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiTm8gV1BBIElFIGZvdW5kIGZyb20gIgorCQkJCQkiYWRkcmVzczpcdCUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCAKKwkJCQltbG1lZXgtPmFkZHJlc3NbMF0sCisJCQkJbWxtZWV4LT5hZGRyZXNzWzFdLAorCQkJCW1sbWVleC0+YWRkcmVzc1syXSwKKwkJCQltbG1lZXgtPmFkZHJlc3NbM10sCisJCQkJbWxtZWV4LT5hZGRyZXNzWzRdLAorCQkJCW1sbWVleC0+YWRkcmVzc1s1XQorCQkJCSk7CisJCQlrZnJlZShjb25maXJtKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY29uZmlybS0+c2l6ZSA9IHdwYV9pZV9sZW47IAorCQltZW1jcHkoJmNvbmZpcm0tPmRhdGEsIHdwYV9pZSwgd3BhX2llX2xlbik7CisKKwkJbWd0X3NldF92YXJsZW4ocHJpdiwgb2lkLCBjb25maXJtLCB3cGFfaWVfbGVuKTsKKworCQlrZnJlZShjb25maXJtKTsKKwkJCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9jZXNzIGEgZGV2aWNlIHRyYXAuICBUaGlzIGlzIGNhbGxlZCB2aWEgc2NoZWR1bGVfd29yaygpLCBvdXRzaWRlIG9mCisgKiBpbnRlcnJ1cHQgY29udGV4dCwgbm8gbG9ja3MgaGVsZC4KKyAqLwordm9pZAorcHJpc201NF9wcm9jZXNzX3RyYXAodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXNscGNpX21nbXRmcmFtZSAqZnJhbWUgPSBkYXRhOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZnJhbWUtPm5kZXY7CisJZW51bSBvaWRfbnVtX3QgbiA9IG1ndF9vaWR0b251bShmcmFtZS0+aGVhZGVyLT5vaWQpOworCisJaWYgKG4gIT0gT0lEX05VTV9MQVNUKQorCQlwcmlzbTU0X3Byb2Nlc3NfdHJhcF9oZWxwZXIobmV0ZGV2X3ByaXYobmRldiksIG4sIGZyYW1lLT5kYXRhKTsKKwlpc2xwY2lfbWd0X3JlbGVhc2UoZnJhbWUpOworfQorCitpbnQKK3ByaXNtNTRfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICphZGRyKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaW50IHJldDsKKworCWlmIChuZGV2LT5hZGRyX2xlbiAhPSA2KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXQgPSBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgR0VOX09JRF9NQUNBRERSRVNTLCAwLAorCQkJICAgICAgJigoc3RydWN0IHNvY2thZGRyICopIGFkZHIpLT5zYV9kYXRhKTsKKwlpZiAoIXJldCkKKwkJbWVtY3B5KHByaXYtPm5kZXYtPmRldl9hZGRyLAorCQkgICAgICAgJigoc3RydWN0IHNvY2thZGRyICopIGFkZHIpLT5zYV9kYXRhLCA2KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIE5vdGU6IGN1cnJlbnRseSwgdXNlIGhvc3RhcGQgaW9jdGwgZnJvbSB0aGUgSG9zdCBBUCBkcml2ZXIgZm9yIFdQQQorICogc3VwcG9ydC4gVGhpcyBpcyB0byBiZSByZXBsYWNlZCB3aXRoIExpbnV4IHdpcmVsZXNzIGV4dGVuc2lvbnMgb25jZSB0aGV5CisgKiBnZXQgV1BBIHN1cHBvcnQuICovCisKKy8qIE5vdGUgSUk6IHBsZWFzZSBsZWF2ZSBhbGwgdGhpcyB0b2dldGhlciBhcyBpdCB3aWxsIGJlIGVhc2llciB0byByZW1vdmUgbGF0ZXIsCisgKiBvbmNlIHdpcmVsZXNzIGV4dGVuc2lvbnMgYWRkIFdQQSBzdXBwb3J0IC1tY2dyb2YgKi8KKworLyogUFJJU001NF9IT1NUQVBEIGlvY3RsKCkgY21kOiAqLworZW51bSB7CisJUFJJU00yX1NFVF9FTkNSWVBUSU9OID0gNiwKKwlQUklTTTJfSE9TVEFQRF9TRVRfR0VORVJJQ19FTEVNRU5UID0gMTIsCisJUFJJU00yX0hPU1RBUERfTUxNRSA9IDEzLAorCVBSSVNNMl9IT1NUQVBEX1NDQU5fUkVRID0gMTQsCit9OworCisjZGVmaW5lIFBSSVNNNTRfU0VUX1dQQQkJCVNJT0NJV0ZJUlNUUFJJVisxMgorI2RlZmluZSBQUklTTTU0X0hPU1RBUEQJCQlTSU9DSVdGSVJTVFBSSVYrMjUKKyNkZWZpbmUgUFJJU001NF9EUk9QX1VORU5DUllQVEVECVNJT0NJV0ZJUlNUUFJJVisyNgorCisjZGVmaW5lIFBSSVNNMl9IT1NUQVBEX01BWF9CVUZfU0laRSAxMDI0CisjZGVmaW5lIFBSSVNNMl9IT1NUQVBEX0dFTkVSSUNfRUxFTUVOVF9IRFJfTEVOIFwKKygoaW50KSAoJigoc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtICopIDApLT51LmdlbmVyaWNfZWxlbS5kYXRhKSkKKworLyogTWF4aW11bSBsZW5ndGggZm9yIGFsZ29yaXRobSBuYW1lcyAoLTEgZm9yIG51bCB0ZXJtaW5hdGlvbikgCisgKiB1c2VkIGluIGlvY3RsKCkgKi8KKyNkZWZpbmUgSE9TVEFQX0NSWVBUX0FMR19OQU1FX0xFTiAxNgorCQorc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtIHsKKwl1MzIgY21kOworCXU4IHN0YV9hZGRyW0VUSF9BTEVOXTsKKwl1bmlvbiB7CisJICAgICAgIHN0cnVjdCB7CisJCSAgICAgICB1OCBhbGdbSE9TVEFQX0NSWVBUX0FMR19OQU1FX0xFTl07CisJCSAgICAgICB1MzIgZmxhZ3M7CisJCSAgICAgICB1MzIgZXJyOworCQkgICAgICAgdTggaWR4OworCQkgICAgICAgdTggc2VxWzhdOyAvKiBzZXF1ZW5jZSBjb3VudGVyIChzZXQ6IFJYLCBnZXQ6IFRYKSAqLworCQkgICAgICAgdTE2IGtleV9sZW47CisJCSAgICAgICB1OCBrZXlbMF07CisJCSAgICAgICB9IGNyeXB0OworICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgdTggbGVuOworICAgICAgICAgICAgICAgICAgICAgICB1OCBkYXRhWzBdOworICAgICAgICAgICAgICAgfSBnZW5lcmljX2VsZW07CisgICAgICAgICAgICAgICBzdHJ1Y3QgeworI2RlZmluZSBNTE1FX1NUQV9ERUFVVEggMAorI2RlZmluZSBNTE1FX1NUQV9ESVNBU1NPQyAxCisgICAgICAgICAgICAgICAgICAgICAgIHUxNiBjbWQ7CisgICAgICAgICAgICAgICAgICAgICAgIHUxNiByZWFzb25fY29kZTsKKyAgICAgICAgICAgICAgIH0gbWxtZTsKKyAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgIHU4IHNzaWRfbGVuOworICAgICAgICAgICAgICAgICAgICAgICB1OCBzc2lkWzMyXTsKKyAgICAgICAgICAgICAgIH0gc2Nhbl9yZXE7CisgICAgICAgfSB1OworfTsKKworCitzdGF0aWMgaW50CitwcmlzbTJfaW9jdGxfc2V0X2VuY3J5cHRpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKnBhcmFtLAorCWludCBwYXJhbV9sZW4pCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBydmFsdWUgPSAwLCBmb3JjZSA9IDA7CisJaW50IGF1dGhlbiA9IERPVDExX0FVVEhfT1MsIGludm9rZSA9IDAsIGV4dW5lbmNyeXB0ID0gMDsKKwl1bmlvbiBvaWRfcmVzX3QgcjsKKworCS8qIHdpdGggdGhlIG5ldyBBUEksIGl0J3MgaW1wb3NzaWJsZSB0byBnZXQgYSBOVUxMIHBvaW50ZXIuCisJICogTmV3IHZlcnNpb24gb2YgaXdjb25maWcgc2V0IHRoZSBJV19FTkNPREVfTk9LRVkgZmxhZworCSAqIHdoZW4gbm8ga2V5IGlzIGdpdmVuLCBidXQgb2xkZXIgdmVyc2lvbnMgZG9uJ3QuICovCisKKwlpZiAocGFyYW0tPnUuY3J5cHQua2V5X2xlbiA+IDApIHsKKwkJLyogd2UgaGF2ZSBhIGtleSB0byBzZXQgKi8KKwkJaW50IGluZGV4ID0gcGFyYW0tPnUuY3J5cHQuaWR4OworCQlpbnQgY3VycmVudF9pbmRleDsKKwkJc3RydWN0IG9ial9rZXkga2V5ID0geyBET1QxMV9QUklWX1RLSVAsIDAsICIiIH07CisKKwkJLyogZ2V0IHRoZSBjdXJyZW50IGtleSBpbmRleCAqLworCQlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0RFRktFWUlELCAwLCBOVUxMLCAmcik7CisJCWN1cnJlbnRfaW5kZXggPSByLnU7CisJCS8qIFZlcmlmeSB0aGF0IHRoZSBrZXkgaXMgbm90IG1hcmtlZCBhcyBpbnZhbGlkICovCisJCWlmICghKHBhcmFtLT51LmNyeXB0LmZsYWdzICYgSVdfRU5DT0RFX05PS0VZKSkgeworCQkJa2V5Lmxlbmd0aCA9IHBhcmFtLT51LmNyeXB0LmtleV9sZW4gPiBzaXplb2YgKHBhcmFtLT51LmNyeXB0LmtleSkgPworCQkJICAgIHNpemVvZiAocGFyYW0tPnUuY3J5cHQua2V5KSA6IHBhcmFtLT51LmNyeXB0LmtleV9sZW47CisJCQltZW1jcHkoa2V5LmtleSwgcGFyYW0tPnUuY3J5cHQua2V5LCBrZXkubGVuZ3RoKTsKKwkJCWlmIChrZXkubGVuZ3RoID09IDMyKQorCQkJCS8qIHdlIHdhbnQgV1BBLVBTSyAqLworCQkJCWtleS50eXBlID0gRE9UMTFfUFJJVl9US0lQOworCQkJaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+IDMpKQorCQkJCS8qIG5vIGluZGV4IHByb3ZpZGVkIHVzZSB0aGUgY3VycmVudCBvbmUgKi8KKwkJCQlpbmRleCA9IGN1cnJlbnRfaW5kZXg7CisKKwkJCS8qIG5vdyBzZW5kIHRoZSBrZXkgdG8gdGhlIGNhcmQgICovCisJCQlydmFsdWUgfD0KKwkJCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0RFRktFWVgsIGluZGV4LAorCQkJCQkgICAgJmtleSk7CisJCX0KKwkJLyoKKwkJICogSWYgYSB2YWxpZCBrZXkgaXMgc2V0LCBlbmNyeXB0aW9uIHNob3VsZCBiZSBlbmFibGVkIAorCQkgKiAodXNlciBtYXkgdHVybiBpdCBvZmYgbGF0ZXIpLgorCQkgKiBUaGlzIGlzIGFsc28gaG93ICJpd2NvbmZpZyBldGhYIGtleSBvbiIgd29ya3MKKwkJICovCisJCWlmICgoaW5kZXggPT0gY3VycmVudF9pbmRleCkgJiYgKGtleS5sZW5ndGggPiAwKSkKKwkJCWZvcmNlID0gMTsKKwl9IGVsc2UgeworCQlpbnQgaW5kZXggPSAocGFyYW0tPnUuY3J5cHQuZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwkJaWYgKChpbmRleCA+PSAwKSAmJiAoaW5kZXggPD0gMykpIHsKKwkJCS8qIHdlIHdhbnQgdG8gc2V0IHRoZSBrZXkgaW5kZXggKi8KKwkJCXJ2YWx1ZSB8PQorCQkJICAgIG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfREVGS0VZSUQsIDAsCisJCQkJCSAgICAmaW5kZXgpOworCQl9IGVsc2UgeworCQkJaWYgKCFwYXJhbS0+dS5jcnlwdC5mbGFncyAmIElXX0VOQ09ERV9NT0RFKSB7CisJCQkJLyogd2UgY2Fubm90IGRvIGFueXRoaW5nLiBDb21wbGFpbi4gKi8KKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKwkvKiBub3cgcmVhZCB0aGUgZmxhZ3MgKi8KKwlpZiAocGFyYW0tPnUuY3J5cHQuZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKKwkJLyogRW5jb2RpbmcgZGlzYWJsZWQsIAorCQkgKiBhdXRoZW4gPSBET1QxMV9BVVRIX09TOworCQkgKiBpbnZva2UgPSAwOworCQkgKiBleHVuZW5jcnlwdCA9IDA7ICovCisJfQorCWlmIChwYXJhbS0+dS5jcnlwdC5mbGFncyAmIElXX0VOQ09ERV9PUEVOKQorCQkvKiBFbmNvZGUgYnV0IGFjY2VwdCBub24tZW5jb2RlZCBwYWNrZXRzLiBObyBhdXRoICovCisJCWludm9rZSA9IDE7CisJaWYgKChwYXJhbS0+dS5jcnlwdC5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKSB8fCBmb3JjZSkgeworCQkvKiBSZWZ1c2Ugbm9uLWVuY29kZWQgcGFja2V0cy4gQXV0aCAqLworCQlhdXRoZW4gPSBET1QxMV9BVVRIX0JPVEg7CisJCWludm9rZSA9IDE7CisJCWV4dW5lbmNyeXB0ID0gMTsKKwl9CisJLyogZG8gdGhlIGNoYW5nZSBpZiByZXF1ZXN0ZWQgICovCisJaWYgKChwYXJhbS0+dS5jcnlwdC5mbGFncyAmIElXX0VOQ09ERV9NT0RFKSB8fCBmb3JjZSkgeworCQlydmFsdWUgfD0KKwkJICAgIG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfQVVUSEVOQUJMRSwgMCwgJmF1dGhlbik7CisJCXJ2YWx1ZSB8PQorCQkgICAgbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9QUklWQUNZSU5WT0tFRCwgMCwgJmludm9rZSk7CisJCXJ2YWx1ZSB8PQorCQkgICAgbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9FWFVORU5DUllQVEVELCAwLAorCQkJCSAgICAmZXh1bmVuY3J5cHQpOworCX0KKwlyZXR1cm4gcnZhbHVlOworfQorCitzdGF0aWMgaW50CitwcmlzbTJfaW9jdGxfc2V0X2dlbmVyaWNfZWxlbWVudChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwlzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKnBhcmFtLAorCWludCBwYXJhbV9sZW4pCit7CisgICAgICAgaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKyAgICAgICBpbnQgbWF4X2xlbiwgbGVuLCBhbGVuLCByZXQ9MDsKKyAgICAgICBzdHJ1Y3Qgb2JqX2F0dGFjaG1lbnQgKmF0dGFjaDsKKworICAgICAgIGxlbiA9IHBhcmFtLT51LmdlbmVyaWNfZWxlbS5sZW47CisgICAgICAgbWF4X2xlbiA9IHBhcmFtX2xlbiAtIFBSSVNNMl9IT1NUQVBEX0dFTkVSSUNfRUxFTUVOVF9IRFJfTEVOOworICAgICAgIGlmIChtYXhfbGVuIDwgMCB8fCBtYXhfbGVuIDwgbGVuKQorICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICBhbGVuID0gc2l6ZW9mKCphdHRhY2gpICsgbGVuOworICAgICAgIGF0dGFjaCA9IGttYWxsb2MoYWxlbiwgR0ZQX0tFUk5FTCk7CisgICAgICAgaWYgKGF0dGFjaCA9PSBOVUxMKQorICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisKKyAgICAgICBtZW1zZXQoYXR0YWNoLCAwLCBhbGVuKTsKKyNkZWZpbmUgV0xBTl9GQ19UWVBFX01HTVQgMAorI2RlZmluZSBXTEFOX0ZDX1NUWVBFX0FTU09DX1JFUSAwCisjZGVmaW5lIFdMQU5fRkNfU1RZUEVfUkVBU1NPQ19SRVEgMgorCisgICAgICAgLyogTm90ZTogZW5kaWFubmVzcyBpcyBjb3ZlcmVkIGJ5IG1ndF9zZXRfdmFybGVuICovCisKKyAgICAgICBhdHRhY2gtPnR5cGUgPSAoV0xBTl9GQ19UWVBFX01HTVQgPDwgMikgfAorICAgICAgICAgICAgICAgKFdMQU5fRkNfU1RZUEVfQVNTT0NfUkVRIDw8IDQpOworICAgICAgIGF0dGFjaC0+aWQgPSAtMTsKKyAgICAgICBhdHRhY2gtPnNpemUgPSBsZW47CisgICAgICAgbWVtY3B5KGF0dGFjaC0+ZGF0YSwgcGFyYW0tPnUuZ2VuZXJpY19lbGVtLmRhdGEsIGxlbik7CisKKyAgICAgICByZXQgPSBtZ3Rfc2V0X3Zhcmxlbihwcml2LCBET1QxMV9PSURfQVRUQUNITUVOVCwgYXR0YWNoLCBsZW4pOworCisgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICAgICBhdHRhY2gtPnR5cGUgPSAoV0xBTl9GQ19UWVBFX01HTVQgPDwgMikgfAorICAgICAgICAgICAgICAgICAgICAgICAoV0xBTl9GQ19TVFlQRV9SRUFTU09DX1JFUSA8PCA0KTsKKworCSAgICAgICByZXQgPSBtZ3Rfc2V0X3Zhcmxlbihwcml2LCBET1QxMV9PSURfQVRUQUNITUVOVCwgYXR0YWNoLCBsZW4pOworCisJICAgICAgIGlmIChyZXQgPT0gMCkgCisJCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IFdQQSBJRSBBdHRhY2htZW50IHdhcyBzZXRcbiIsCisJCQkJICAgICAgIG5kZXYtPm5hbWUpOworICAgICAgIH0KKworICAgICAgIGtmcmVlKGF0dGFjaCk7CisgICAgICAgcmV0dXJuIHJldDsKKworfQorCitzdGF0aWMgaW50CitwcmlzbTJfaW9jdGxfbWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKnBhcmFtKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGludAorcHJpc20yX2lvY3RsX3NjYW5fcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtICpwYXJhbSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCWludCBpLCBydmFsdWU7CisJc3RydWN0IG9ial9ic3NsaXN0ICpic3NsaXN0OworCXUzMiBub2lzZSA9IDA7CisJY2hhciAqZXh0cmEgPSAiIjsKKwljaGFyICpjdXJyZW50X2V2ID0gImZvbyI7CisJdW5pb24gb2lkX3Jlc190IHI7CisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSA8IFBSVl9TVEFURV9JTklUKSB7CisJCS8qIGRldmljZSBpcyBub3QgcmVhZHksIGZhaWwgZ2VudGx5ICovCisJCXJldHVybiAwOworCX0KKworCS8qIGZpcnN0IGdldCB0aGUgbm9pc2UgdmFsdWUuIFdlIHdpbGwgdXNlIGl0IHRvIHJlcG9ydCB0aGUgbGluayBxdWFsaXR5ICovCisJcnZhbHVlID0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9OT0lTRUZMT09SLCAwLCBOVUxMLCAmcik7CisJbm9pc2UgPSByLnU7CisKKwkvKiBBc2sgdGhlIGRldmljZSBmb3IgYSBsaXN0IG9mIGtub3duIGJzcy4gV2UgY2FuIHJlcG9ydCBhdCBtb3N0CisJICogSVdfTUFYX0FQPTY0IHRvIHRoZSByYW5nZSBzdHJ1Y3QuIEJ1dCB0aGUgZGV2aWNlIHdvbid0IHJlcHBvcnQgYW55dGhpbmcKKwkgKiBpZiB5b3UgY2hhbmdlIHRoZSB2YWx1ZSBvZiBJV01BWF9CU1M9MjQuCisJICovCisJcnZhbHVlIHw9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfQlNTTElTVCwgMCwgTlVMTCwgJnIpOworCWJzc2xpc3QgPSByLnB0cjsKKworCS8qIG9rIG5vdywgc2NhbiB0aGUgbGlzdCBhbmQgdHJhbnNsYXRlIGl0cyBpbmZvICovCisJZm9yIChpID0gMDsgaSA8IG1pbihJV19NQVhfQVAsIChpbnQpIGJzc2xpc3QtPm5yKTsgaSsrKQorCQljdXJyZW50X2V2ID0gcHJpc201NF90cmFuc2xhdGVfYnNzKG5kZXYsIGN1cnJlbnRfZXYsCisJCQkJCQkgICBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsCisJCQkJCQkgICAmKGJzc2xpc3QtPmJzc2xpc3RbaV0pLAorCQkJCQkJICAgbm9pc2UpOworCWtmcmVlKGJzc2xpc3QpOworCisJcmV0dXJuIHJ2YWx1ZTsKK30KKworc3RhdGljIGludAorcHJpc201NF9ob3N0YXBkKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKnApCit7CisgICAgICAgc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtICpwYXJhbTsKKyAgICAgICBpbnQgcmV0ID0gMDsKKyAgICAgICB1MzIgdXdycTsKKworICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJwcmlzbTU0X2hvc3RhcGQgLSBsZW49JWRcbiIsIHAtPmxlbmd0aCk7CisgICAgICAgaWYgKHAtPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0pIHx8CisgICAgICAgICAgIHAtPmxlbmd0aCA+IFBSSVNNMl9IT1NUQVBEX01BWF9CVUZfU0laRSB8fCAhcC0+cG9pbnRlcikKKyAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgcGFyYW0gPSAoc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtICopIGttYWxsb2MocC0+bGVuZ3RoLCBHRlBfS0VSTkVMKTsKKyAgICAgICBpZiAocGFyYW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworCisgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKHBhcmFtLCBwLT5wb2ludGVyLCBwLT5sZW5ndGgpKSB7CisgICAgICAgICAgICAgICBrZnJlZShwYXJhbSk7CisgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICB9CisKKyAgICAgICBzd2l0Y2ggKHBhcmFtLT5jbWQpIHsKKyAgICAgICBjYXNlIFBSSVNNMl9TRVRfRU5DUllQVElPTjoKKwkgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDYXVnaHQgV1BBIHN1cHBsaWNhbnQgc2V0IGVuY3J5cHRpb24gcmVxdWVzdFxuIiwKKwkJCSAgICAgICBuZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgIHJldCA9IHByaXNtMl9pb2N0bF9zZXRfZW5jcnlwdGlvbihuZGV2LCBwYXJhbSwgcC0+bGVuZ3RoKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgUFJJU00yX0hPU1RBUERfU0VUX0dFTkVSSUNfRUxFTUVOVDoKKwkgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDYXVnaHQgV1BBIHN1cHBsaWNhbnQgc2V0IFdQQSBJRSByZXF1ZXN0XG4iLAorCQkJICAgICAgIG5kZXYtPm5hbWUpOworICAgICAgICAgICAgICAgcmV0ID0gcHJpc20yX2lvY3RsX3NldF9nZW5lcmljX2VsZW1lbnQobmRldiwgcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5sZW5ndGgpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSBQUklTTTJfSE9TVEFQRF9NTE1FOgorCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IENhdWdodCBXUEEgc3VwcGxpY2FudCBNTE1FIHJlcXVlc3RcbiIsCisJCQkgICAgICAgbmRldi0+bmFtZSk7CisgICAgICAgICAgICAgICByZXQgPSBwcmlzbTJfaW9jdGxfbWxtZShuZGV2LCBwYXJhbSk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIFBSSVNNMl9IT1NUQVBEX1NDQU5fUkVROgorCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IENhdWdodCBXUEEgc3VwcGxpY2FudCBzY2FuIHJlcXVlc3RcbiIsCisJCQkgICAgICAgbmRldi0+bmFtZSk7CisgICAgICAgICAgICAgICByZXQgPSBwcmlzbTJfaW9jdGxfc2Nhbl9yZXEobmRldiwgcGFyYW0pOworICAgICAgICAgICAgICAgYnJlYWs7CisJY2FzZSBQUklTTTU0X1NFVF9XUEE6CisJICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogQ2F1Z2h0IFdQQSBzdXBwbGljYW50IHdwYSBpbml0IHJlcXVlc3RcbiIsCisJCQkgICAgICAgbmRldi0+bmFtZSk7CisJICAgICAgIHV3cnEgPSAxOworCSAgICAgICByZXQgPSBwcmlzbTU0X3NldF93cGEobmRldiwgTlVMTCwgJnV3cnEsIE5VTEwpOworCSAgICAgICBicmVhazsKKwljYXNlIFBSSVNNNTRfRFJPUF9VTkVOQ1JZUFRFRDoKKwkgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDYXVnaHQgV1BBIGRyb3AgdW5lbmNyeXB0ZWQgcmVxdWVzdFxuIiwKKwkJCSAgICAgICBuZGV2LT5uYW1lKTsKKyNpZiAwCisJICAgICAgIHV3cnEgPSAweDAxOworCSAgICAgICBtZ3Rfc2V0KHByaXYsIERPVDExX09JRF9FWFVORU5DUllQVEVELCAmdXdycSk7CisJICAgICAgIGRvd25fd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCSAgICAgICBtZ3RfY29tbWl0KHByaXYpOworCSAgICAgICB1cF93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisjZW5kaWYKKwkgICAgICAgLyogTm90IG5lY2Vzc2FyeSwgYXMgc2V0X3dwYSBkb2VzIGl0LCBzaG91bGQgd2UganVzdCBkbyBpdCBoZXJlIHRob3VnaD8gKi8KKwkgICAgICAgcmV0ID0gMDsKKwkgICAgICAgYnJlYWs7CisgICAgICAgZGVmYXVsdDoKKwkgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDYXVnaHQgYSBXUEEgc3VwcGxpY2FudCByZXF1ZXN0IHRoYXQgaXMgbm90IHN1cHBvcnRlZFxuIiwKKwkJCSAgICAgICBuZGV2LT5uYW1lKTsKKyAgICAgICAgICAgICAgIHJldCA9IC1FT1BOT1RTVVBQOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgfQorCisgICAgICAgaWYgKHJldCA9PSAwICYmIGNvcHlfdG9fdXNlcihwLT5wb2ludGVyLCBwYXJhbSwgcC0+bGVuZ3RoKSkKKyAgICAgICAgICAgICAgIHJldCA9IC1FRkFVTFQ7CisKKyAgICAgICBrZnJlZShwYXJhbSk7CisKKyAgICAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X3NldF93cGEoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCV9fdTMyICogdXdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1MzIgbWxtZSwgYXV0aGVuLCBkb3QxeCwgZmlsdGVyLCB3ZXA7CisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSA8IFBSVl9TVEFURV9JTklUKQorCQlyZXR1cm4gMDsKKworCXdlcCA9IDE7IC8qIEZvciBwcml2YWN5IGludm9rZWQgKi8KKwlmaWx0ZXIgPSAxOyAvKiBGaWx0ZXIgb3V0IGFsbCB1bmVuY3J5cHRlZCBmcmFtZXMgKi8KKwlkb3QxeCA9IDB4MDE7IC8qIFRvIGVuYWJsZSBlYXAgZmlsdGVyICovCisJbWxtZSA9IERPVDExX01MTUVfRVhURU5ERUQ7CisJYXV0aGVuID0gRE9UMTFfQVVUSF9PUzsgLyogT25seSBXRVAgdXNlcyBfU0sgYW5kIF9CT1RIICovCisKKwlkb3duX3dyaXRlKCZwcml2LT5taWJfc2VtKTsKKwlwcml2LT53cGEgPSAqdXdycTsKKworCXN3aXRjaCAocHJpdi0+d3BhKSB7CisJCWRlZmF1bHQ6CisJCWNhc2UgMDogLyogQ2xlYXJzL2Rpc2FibGVzIFdQQSBhbmQgZnJpZW5kcyAqLworCQkJd2VwID0gMDsKKwkJCWZpbHRlciA9IDA7IC8qIERvIG5vdCBmaWx0ZXIgdW4tZW5jcnlwdGVkIGRhdGEgKi8KKwkJCWRvdDF4ID0gMDsKKwkJCW1sbWUgPSBET1QxMV9NTE1FX0FVVE87CisJCQlwcmludGsoIiVzOiBEaXNhYmxpbmcgV1BBXG4iLCBuZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIDI6IAorCQljYXNlIDE6IC8qIFdQQSAqLworCQkJcHJpbnRrKCIlczogRW5hYmxpbmcgV1BBXG4iLCBuZGV2LT5uYW1lKTsKKwkJCWJyZWFrOworCX0KKwl1cF93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisKKwltZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0FVVEhFTkFCTEUsIDAsICZhdXRoZW4pOworCW1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfUFJJVkFDWUlOVk9LRUQsIDAsICZ3ZXApOworCW1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfRVhVTkVOQ1JZUFRFRCwgMCwgJmZpbHRlcik7CisJbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9ET1QxWEVOQUJMRSwgMCwgJmRvdDF4KTsKKwltZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX01MTUVBVVRPTEVWRUwsIDAsICZtbG1lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwcmlzbTU0X2dldF93cGEoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCV9fdTMyICogdXdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwkqdXdycSA9IHByaXYtPndwYTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJpc201NF9zZXRfcHJpc21oZHIoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgX191MzIgKiB1d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXByaXYtPm1vbml0b3JfdHlwZSA9CisJICAgICgqdXdycSA/IEFSUEhSRF9JRUVFODAyMTFfUFJJU00gOiBBUlBIUkRfSUVFRTgwMjExKTsKKwlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCXByaXYtPm5kZXYtPnR5cGUgPSBwcml2LT5tb25pdG9yX3R5cGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJpc201NF9nZXRfcHJpc21oZHIoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgX191MzIgKiB1d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCSp1d3JxID0gKHByaXYtPm1vbml0b3JfdHlwZSA9PSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJpc201NF9kZWJ1Z19vaWQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgX191MzIgKiB1d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJcHJpdi0+cHJpdl9vaWQgPSAqdXdycTsKKwlwcmludGsoIiVzOiBvaWQgMHglMDhYXG4iLCBuZGV2LT5uYW1lLCAqdXdycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJpc201NF9kZWJ1Z19nZXRfb2lkKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKnJlc3BvbnNlOworCWludCByZXQgPSAtRUlPOworCisJcHJpbnRrKCIlczogZ2V0X29pZCAweCUwOFhcbiIsIG5kZXYtPm5hbWUsIHByaXYtPnByaXZfb2lkKTsKKwlkYXRhLT5sZW5ndGggPSAwOworCisJaWYgKGlzbHBjaV9nZXRfc3RhdGUocHJpdikgPj0gUFJWX1NUQVRFX0lOSVQpIHsKKwkJcmV0ID0KKwkJICAgIGlzbHBjaV9tZ3RfdHJhbnNhY3Rpb24ocHJpdi0+bmRldiwgUElNRk9SX09QX0dFVCwKKwkJCQkJICAgcHJpdi0+cHJpdl9vaWQsIGV4dHJhLCAyNTYsCisJCQkJCSAgICZyZXNwb25zZSk7CisJCXByaW50aygiJXM6IHJldDogJWlcbiIsIG5kZXYtPm5hbWUsIHJldCk7CisJCWlmIChyZXQgfHwgIXJlc3BvbnNlCisJCSAgICB8fCByZXNwb25zZS0+aGVhZGVyLT5vcGVyYXRpb24gPT0gUElNRk9SX09QX0VSUk9SKSB7CisJCQlpZiAocmVzcG9uc2UpIHsKKwkJCQlpc2xwY2lfbWd0X3JlbGVhc2UocmVzcG9uc2UpOworCQkJfQorCQkJcHJpbnRrKCIlczogRUlPXG4iLCBuZGV2LT5uYW1lKTsKKwkJCXJldCA9IC1FSU87CisJCX0KKwkJaWYgKCFyZXQpIHsKKwkJCWRhdGEtPmxlbmd0aCA9IHJlc3BvbnNlLT5oZWFkZXItPmxlbmd0aDsKKwkJCW1lbWNweShleHRyYSwgcmVzcG9uc2UtPmRhdGEsIGRhdGEtPmxlbmd0aCk7CisJCQlpc2xwY2lfbWd0X3JlbGVhc2UocmVzcG9uc2UpOworCQkJcHJpbnRrKCIlczogbGVuOiAlaVxuIiwgbmRldi0+bmFtZSwgZGF0YS0+bGVuZ3RoKTsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3ByaXNtNTRfZGVidWdfc2V0X29pZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICAgc3RydWN0IGl3X3BvaW50ICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBpc2xwY2lfbWdtdGZyYW1lICpyZXNwb25zZTsKKwlpbnQgcmV0ID0gMCwgcmVzcG9uc2Vfb3AgPSBQSU1GT1JfT1BfRVJST1I7CisKKwlwcmludGsoIiVzOiBzZXRfb2lkIDB4JTA4WFx0bGVuOiAlZFxuIiwgbmRldi0+bmFtZSwgcHJpdi0+cHJpdl9vaWQsCisJICAgICAgIGRhdGEtPmxlbmd0aCk7CisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSA+PSBQUlZfU1RBVEVfSU5JVCkgeworCQlyZXQgPQorCQkgICAgaXNscGNpX21ndF90cmFuc2FjdGlvbihwcml2LT5uZGV2LCBQSU1GT1JfT1BfU0VULAorCQkJCQkgICBwcml2LT5wcml2X29pZCwgZXh0cmEsIGRhdGEtPmxlbmd0aCwKKwkJCQkJICAgJnJlc3BvbnNlKTsKKwkJcHJpbnRrKCIlczogcmV0OiAlaVxuIiwgbmRldi0+bmFtZSwgcmV0KTsKKwkJaWYgKHJldCB8fCAhcmVzcG9uc2UKKwkJICAgIHx8IHJlc3BvbnNlLT5oZWFkZXItPm9wZXJhdGlvbiA9PSBQSU1GT1JfT1BfRVJST1IpIHsKKwkJCWlmIChyZXNwb25zZSkgeworCQkJCWlzbHBjaV9tZ3RfcmVsZWFzZShyZXNwb25zZSk7CisJCQl9CisJCQlwcmludGsoIiVzOiBFSU9cbiIsIG5kZXYtPm5hbWUpOworCQkJcmV0ID0gLUVJTzsKKwkJfQorCQlpZiAoIXJldCkgeworCQkJcmVzcG9uc2Vfb3AgPSByZXNwb25zZS0+aGVhZGVyLT5vcGVyYXRpb247CisJCQlwcmludGsoIiVzOiByZXNwb25zZV9vcDogJWlcbiIsIG5kZXYtPm5hbWUsCisJCQkgICAgICAgcmVzcG9uc2Vfb3ApOworCQkJaXNscGNpX21ndF9yZWxlYXNlKHJlc3BvbnNlKTsKKwkJfQorCX0KKworCXJldHVybiAocmV0ID8gcmV0IDogLUVJTlBST0dSRVNTKTsKK30KKworc3RhdGljIGludAorcHJpc201NF9zZXRfc3B5KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQl1bmlvbiBpd3JlcV9kYXRhICp1d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXUzMiB1LCBvaWQgPSBPSURfSU5MX0NPTkZJRzsKKworCWRvd25fd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCW1ndF9nZXQocHJpdiwgT0lEX0lOTF9DT05GSUcsICZ1KTsKKworCWlmICgodXdycS0+ZGF0YS5sZW5ndGggPT0gMCkgJiYgKHByaXYtPnNweV9kYXRhLnNweV9udW1iZXIgPiAwKSkKKwkJLyogZGlzYWJsZSBzcHkgKi8KKwkJdSAmPSB+SU5MX0NPTkZJR19SWEFOTkVYOworCWVsc2UgaWYgKCh1d3JxLT5kYXRhLmxlbmd0aCA+IDApICYmIChwcml2LT5zcHlfZGF0YS5zcHlfbnVtYmVyID09IDApKQorCQkvKiBlbmFibGUgc3B5ICovCisJCXUgfD0gSU5MX0NPTkZJR19SWEFOTkVYOworCisJbWd0X3NldChwcml2LCBPSURfSU5MX0NPTkZJRywgJnUpOworCW1ndF9jb21taXRfbGlzdChwcml2LCAmb2lkLCAxKTsKKwl1cF93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisKKwlyZXR1cm4gaXdfaGFuZGxlcl9zZXRfc3B5KG5kZXYsIGluZm8sIHV3cnEsIGV4dHJhKTsKK30KKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcHJpc201NF9oYW5kbGVyW10gPSB7CisJKGl3X2hhbmRsZXIpIHByaXNtNTRfY29tbWl0LAkvKiBTSU9DU0lXQ09NTUlUICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X25hbWUsCS8qIFNJT0NHSVdOQU1FICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NTSVdOV0lEICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdOV0lEICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X2ZyZXEsCS8qIFNJT0NTSVdGUkVRICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X2ZyZXEsCS8qIFNJT0NHSVdGUkVRICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X21vZGUsCS8qIFNJT0NTSVdNT0RFICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X21vZGUsCS8qIFNJT0NHSVdNT0RFICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X3NlbnMsCS8qIFNJT0NTSVdTRU5TICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X3NlbnMsCS8qIFNJT0NHSVdTRU5TICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NTSVdSQU5HRSAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X2dldF9yYW5nZSwJLyogU0lPQ0dJV1JBTkdFICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NTSVdQUklWICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdQUklWICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NTSVdTVEFUUyAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DR0lXU1RBVFMgKi8KKwlwcmlzbTU0X3NldF9zcHksCS8qIFNJT0NTSVdTUFkgKi8KKwlpd19oYW5kbGVyX2dldF9zcHksCS8qIFNJT0NHSVdTUFkgKi8KKwlpd19oYW5kbGVyX3NldF90aHJzcHksCS8qIFNJT0NTSVdUSFJTUFkgKi8KKwlpd19oYW5kbGVyX2dldF90aHJzcHksCS8qIFNJT0NHSVdUSFJTUFkgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9zZXRfd2FwLAkvKiBTSU9DU0lXQVAgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfd2FwLAkvKiBTSU9DR0lXQVAgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBOVUxMLAkvKiBTSU9DR0lXQVBMSVNUIGRlcHJlY2lhdGVkICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X3NjYW4sCS8qIFNJT0NTSVdTQ0FOICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X3NjYW4sCS8qIFNJT0NHSVdTQ0FOICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X2Vzc2lkLAkvKiBTSU9DU0lXRVNTSUQgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfZXNzaWQsCS8qIFNJT0NHSVdFU1NJRCAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X3NldF9uaWNrLAkvKiBTSU9DU0lXTklDS04gKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfbmljaywJLyogU0lPQ0dJV05JQ0tOICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIC0tIGhvbGUgLS0gKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogLS0gaG9sZSAtLSAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X3NldF9yYXRlLAkvKiBTSU9DU0lXUkFURSAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X2dldF9yYXRlLAkvKiBTSU9DR0lXUkFURSAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X3NldF9ydHMsCS8qIFNJT0NTSVdSVFMgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfcnRzLAkvKiBTSU9DR0lXUlRTICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X2ZyYWcsCS8qIFNJT0NTSVdGUkFHICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X2ZyYWcsCS8qIFNJT0NHSVdGUkFHICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X3R4cG93ZXIsCS8qIFNJT0NTSVdUWFBPVyAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X2dldF90eHBvd2VyLAkvKiBTSU9DR0lXVFhQT1cgKi8KKwkoaXdfaGFuZGxlcikgcHJpc201NF9zZXRfcmV0cnksCS8qIFNJT0NTSVdSRVRSWSAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X2dldF9yZXRyeSwJLyogU0lPQ0dJV1JFVFJZICovCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X2VuY29kZSwJLyogU0lPQ1NJV0VOQ09ERSAqLworCShpd19oYW5kbGVyKSBwcmlzbTU0X2dldF9lbmNvZGUsCS8qIFNJT0NHSVdFTkNPREUgKi8KKwkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ1NJV1BPV0VSICovCisJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NHSVdQT1dFUiAqLworfTsKKworLyogVGhlIGxvdyBvcmRlciBiaXQgaWRlbnRpZnkgYSBTRVQgKDApIG9yIGEgR0VUICgxKSBpb2N0bC4gICovCisKKyNkZWZpbmUgUFJJU001NF9SRVNFVAkJU0lPQ0lXRklSU1RQUklWCisjZGVmaW5lIFBSSVNNNTRfR0VUX1BPTElDWQlTSU9DSVdGSVJTVFBSSVYrMQorI2RlZmluZSBQUklTTTU0X1NFVF9QT0xJQ1kJU0lPQ0lXRklSU1RQUklWKzIKKyNkZWZpbmUgUFJJU001NF9HRVRfTUFDCQlTSU9DSVdGSVJTVFBSSVYrMworI2RlZmluZSBQUklTTTU0X0FERF9NQUMJCVNJT0NJV0ZJUlNUUFJJVis0CisKKyNkZWZpbmUgUFJJU001NF9ERUxfTUFDCQlTSU9DSVdGSVJTVFBSSVYrNgorCisjZGVmaW5lIFBSSVNNNTRfS0lDS19NQUMJU0lPQ0lXRklSU1RQUklWKzgKKworI2RlZmluZSBQUklTTTU0X0tJQ0tfQUxMCVNJT0NJV0ZJUlNUUFJJVisxMAorCisjZGVmaW5lIFBSSVNNNTRfR0VUX1dQQQkJU0lPQ0lXRklSU1RQUklWKzExCisjZGVmaW5lIFBSSVNNNTRfU0VUX1dQQQkJU0lPQ0lXRklSU1RQUklWKzEyCisKKyNkZWZpbmUgUFJJU001NF9EQkdfT0lECQlTSU9DSVdGSVJTVFBSSVYrMTQKKyNkZWZpbmUgUFJJU001NF9EQkdfR0VUX09JRAlTSU9DSVdGSVJTVFBSSVYrMTUKKyNkZWZpbmUgUFJJU001NF9EQkdfU0VUX09JRAlTSU9DSVdGSVJTVFBSSVYrMTYKKworI2RlZmluZSBQUklTTTU0X0dFVF9PSUQJCVNJT0NJV0ZJUlNUUFJJVisxNworI2RlZmluZSBQUklTTTU0X1NFVF9PSURfVTMyCVNJT0NJV0ZJUlNUUFJJVisxOAorI2RlZmluZQlQUklTTTU0X1NFVF9PSURfU1RSCVNJT0NJV0ZJUlNUUFJJVisyMAorI2RlZmluZQlQUklTTTU0X1NFVF9PSURfQUREUglTSU9DSVdGSVJTVFBSSVYrMjIKKworI2RlZmluZSBQUklTTTU0X0dFVF9QUklTTUhEUglTSU9DSVdGSVJTVFBSSVYrMjMKKyNkZWZpbmUgUFJJU001NF9TRVRfUFJJU01IRFIJU0lPQ0lXRklSU1RQUklWKzI0CisKKyNkZWZpbmUgSVdQUklWX1NFVF9VMzIobix4KQl7IG4sIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic18ieCB9CisjZGVmaW5lIElXUFJJVl9TRVRfU1NJRChuLHgpCXsgbiwgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic18ieCB9CisjZGVmaW5lIElXUFJJVl9TRVRfQUREUihuLHgpCXsgbiwgSVdfUFJJVl9UWVBFX0FERFIgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic18ieCB9CisjZGVmaW5lIElXUFJJVl9HRVQobix4KQl7IG4sIDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgUFJJVl9TVFJfU0laRSwgImdfInggfQorCisjZGVmaW5lIElXUFJJVl9VMzIobix4KQkJSVdQUklWX1NFVF9VMzIobix4KSwgSVdQUklWX0dFVChuLHgpCisjZGVmaW5lIElXUFJJVl9TU0lEKG4seCkJSVdQUklWX1NFVF9TU0lEKG4seCksIElXUFJJVl9HRVQobix4KQorI2RlZmluZSBJV1BSSVZfQUREUihuLHgpCUlXUFJJVl9TRVRfQUREUihuLHgpLCBJV1BSSVZfR0VUKG4seCkKKworLyogTm90ZSA6IGxpbWl0ZWQgdG8gMTI4IHByaXZhdGUgaW9jdGxzICh3aXJlbGVzcyB0b29scyAyNikgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3MgcHJpc201NF9wcml2YXRlX2FyZ3NbXSA9IHsKKy8qeyBjbWQsIHNldF9hcmdzLCBnZXRfYXJncywgbmFtZSB9ICovCisJe1BSSVNNNTRfUkVTRVQsIDAsIDAsICJyZXNldCJ9LAorCXtQUklTTTU0X0dFVF9QUklTTUhEUiwgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRfcHJpc21oZHIifSwKKwl7UFJJU001NF9TRVRfUFJJU01IRFIsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLAorCSAic2V0X3ByaXNtaGRyIn0sCisJe1BSSVNNNTRfR0VUX1BPTElDWSwgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICJnZXRQb2xpY3kifSwKKwl7UFJJU001NF9TRVRfUE9MSUNZLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwKKwkgInNldFBvbGljeSJ9LAorCXtQUklTTTU0X0dFVF9NQUMsIDAsIElXX1BSSVZfVFlQRV9BRERSIHwgNjQsICJnZXRNYWMifSwKKwl7UFJJU001NF9BRERfTUFDLCBJV19QUklWX1RZUEVfQUREUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsCisJICJhZGRNYWMifSwKKwl7UFJJU001NF9ERUxfTUFDLCBJV19QUklWX1RZUEVfQUREUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsCisJICJkZWxNYWMifSwKKwl7UFJJU001NF9LSUNLX01BQywgSVdfUFJJVl9UWVBFX0FERFIgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLAorCSAia2lja01hYyJ9LAorCXtQUklTTTU0X0tJQ0tfQUxMLCAwLCAwLCAia2lja0FsbCJ9LAorCXtQUklTTTU0X0dFVF9XUEEsIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0X3dwYSJ9LAorCXtQUklTTTU0X1NFVF9XUEEsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLAorCSAic2V0X3dwYSJ9LAorCXtQUklTTTU0X0RCR19PSUQsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLAorCSAiZGJnX29pZCJ9LAorCXtQUklTTTU0X0RCR19HRVRfT0lELCAwLCBJV19QUklWX1RZUEVfQllURSB8IDI1NiwgImRiZ19nZXRfb2lkIn0sCisJe1BSSVNNNTRfREJHX1NFVF9PSUQsIElXX1BSSVZfVFlQRV9CWVRFIHwgMjU2LCAwLCAiZGJnX3NldF9vaWQifSwKKwkvKiAtLS0gc3ViLWlvY3RscyBoYW5kbGVycyAtLS0gKi8KKwl7UFJJU001NF9HRVRfT0lELAorCSAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IFBSSVZfU1RSX1NJWkUsICIifSwKKwl7UFJJU001NF9TRVRfT0lEX1UzMiwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICIifSwKKwl7UFJJU001NF9TRVRfT0lEX1NUUiwKKwkgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiIn0sCisJe1BSSVNNNTRfU0VUX09JRF9BRERSLAorCSBJV19QUklWX1RZUEVfQUREUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICIifSwKKwkvKiAtLS0gc3ViLWlvY3RscyBkZWZpbml0aW9ucyAtLS0gKi8KKwlJV1BSSVZfQUREUihHRU5fT0lEX01BQ0FERFJFU1MsICJhZGRyIiksCisJSVdQUklWX0dFVChHRU5fT0lEX0xJTktTVEFURSwgImxpbmtzdGF0ZSIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lEX0JTU1RZUEUsICJic3N0eXBlIiksCisJSVdQUklWX0FERFIoRE9UMTFfT0lEX0JTU0lELCAiYnNzaWQiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9TVEFURSwgInN0YXRlIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfQUlELCAiYWlkIiksCisKKwlJV1BSSVZfU1NJRChET1QxMV9PSURfU1NJRE9WRVJSSURFLCAic3NpZG92ZXJyaWRlIiksCisKKwlJV1BSSVZfVTMyKERPVDExX09JRF9NRURJVU1MSU1JVCwgIm1lZGxpbWl0IiksCisJSVdQUklWX1UzMihET1QxMV9PSURfQkVBQ09OUEVSSU9ELCAiYmVhY29uIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfRFRJTVBFUklPRCwgImR0aW1wZXJpb2QiKSwKKworCUlXUFJJVl9VMzIoRE9UMTFfT0lEX0FVVEhFTkFCTEUsICJhdXRoZW5hYmxlIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfUFJJVkFDWUlOVk9LRUQsICJwcml2aW52b2siKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9FWFVORU5DUllQVEVELCAiZXh1bmVuY3J5cHQiKSwKKworCUlXUFJJVl9VMzIoRE9UMTFfT0lEX1JFS0VZVEhSRVNIT0xELCAicmVrZXl0aHJlc2giKSwKKworCUlXUFJJVl9VMzIoRE9UMTFfT0lEX01BWFRYTElGRVRJTUUsICJtYXh0eGxpZmUiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9NQVhSWExJRkVUSU1FLCAibWF4cnhsaWZlIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfQUxPRlRfRklYRURSQVRFLCAiZml4ZWRyYXRlIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfTUFYRlJBTUVCVVJTVCwgImZyYW1lYnVyc3QiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9QU00sICJwc20iKSwKKworCUlXUFJJVl9VMzIoRE9UMTFfT0lEX0JSSURHRUxPQ0FMLCAiYnJpZGdlIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfQ0xJRU5UUywgImNsaWVudHMiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9DTElFTlRTQVNTT0NJQVRFRCwgImNsaWVudGFzc29jIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfRE9UMVhFTkFCTEUsICJkb3QxeGVuYWJsZSIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lEX0FOVEVOTkFSWCwgInJ4YW50IiksCisJSVdQUklWX1UzMihET1QxMV9PSURfQU5URU5OQVRYLCAidHhhbnQiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9BTlRFTk5BRElWRVJTSVRZLCAiYW50ZGl2ZXJzIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfRURUSFJFU0hPTEQsICJlZHRocmVzaCIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lEX1BSRUFNQkxFU0VUVElOR1MsICJwcmVhbWJsZSIpLAorCUlXUFJJVl9HRVQoRE9UMTFfT0lEX1JBVEVTLCAicmF0ZXMiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9PVVRQVVRQT1dFUiwgIi4xMW91dHBvd2VyIiksCisJSVdQUklWX0dFVChET1QxMV9PSURfU1VQUE9SVEVEUkFURVMsICJzdXBwcmF0ZXMiKSwKKwlJV1BSSVZfR0VUKERPVDExX09JRF9TVVBQT1JURURGUkVRVUVOQ0lFUywgInN1cHBmcmVxIiksCisKKwlJV1BSSVZfVTMyKERPVDExX09JRF9OT0lTRUZMT09SLCAibm9pc2VmbG9vciIpLAorCUlXUFJJVl9HRVQoRE9UMTFfT0lEX0ZSRVFVRU5DWUFDVElWSVRZLCAiZnJlcWFjdGl2aXR5IiksCisJSVdQUklWX1UzMihET1QxMV9PSURfTk9ORVJQUFJPVEVDVElPTiwgIm5vbmVycHByb3RlYyIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lEX1BST0ZJTEVTLCAicHJvZmlsZSIpLAorCUlXUFJJVl9HRVQoRE9UMTFfT0lEX0VYVEVOREVEUkFURVMsICJleHRyYXRlcyIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lEX01MTUVBVVRPTEVWRUwsICJtbG1lbGV2ZWwiKSwKKworCUlXUFJJVl9HRVQoRE9UMTFfT0lEX0JTU1MsICJic3NzIiksCisJSVdQUklWX0dFVChET1QxMV9PSURfQlNTTElTVCwgImJzc2xpc3QiKSwKKwlJV1BSSVZfVTMyKE9JRF9JTkxfTU9ERSwgIm1vZGUiKSwKKwlJV1BSSVZfVTMyKE9JRF9JTkxfQ09ORklHLCAiY29uZmlnIiksCisJSVdQUklWX1UzMihPSURfSU5MX0RPVDExRF9DT05GT1JNQU5DRSwgIi4xMWRjb25mb3JtIiksCisJSVdQUklWX0dFVChPSURfSU5MX1BIWUNBUEFCSUxJVElFUywgInBoeWNhcGEiKSwKKwlJV1BSSVZfVTMyKE9JRF9JTkxfT1VUUFVUUE9XRVIsICJvdXRwb3dlciIpLAorfTsKKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgcHJpc201NF9wcml2YXRlX2hhbmRsZXJbXSA9IHsKKwkoaXdfaGFuZGxlcikgcHJpc201NF9yZXNldCwKKwkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfcG9saWN5LAorCShpd19oYW5kbGVyKSBwcmlzbTU0X3NldF9wb2xpY3ksCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X21hYywKKwkoaXdfaGFuZGxlcikgcHJpc201NF9hZGRfbWFjLAorCShpd19oYW5kbGVyKSBOVUxMLAorCShpd19oYW5kbGVyKSBwcmlzbTU0X2RlbF9tYWMsCisJKGl3X2hhbmRsZXIpIE5VTEwsCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfa2lja19tYWMsCisJKGl3X2hhbmRsZXIpIE5VTEwsCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfa2lja19hbGwsCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X3dwYSwKKwkoaXdfaGFuZGxlcikgcHJpc201NF9zZXRfd3BhLAorCShpd19oYW5kbGVyKSBOVUxMLAorCShpd19oYW5kbGVyKSBwcmlzbTU0X2RlYnVnX29pZCwKKwkoaXdfaGFuZGxlcikgcHJpc201NF9kZWJ1Z19nZXRfb2lkLAorCShpd19oYW5kbGVyKSBwcmlzbTU0X2RlYnVnX3NldF9vaWQsCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0X29pZCwKKwkoaXdfaGFuZGxlcikgcHJpc201NF9zZXRfdTMyLAorCShpd19oYW5kbGVyKSBOVUxMLAorCShpd19oYW5kbGVyKSBwcmlzbTU0X3NldF9yYXcsCisJKGl3X2hhbmRsZXIpIE5VTEwsCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X3JhdywKKwkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfcHJpc21oZHIsCisJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X3ByaXNtaGRyLAorfTsKKworY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHByaXNtNTRfaGFuZGxlcl9kZWYgPSB7CisJLm51bV9zdGFuZGFyZCA9IHNpemVvZiAocHJpc201NF9oYW5kbGVyKSAvIHNpemVvZiAoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlID0gc2l6ZW9mIChwcmlzbTU0X3ByaXZhdGVfaGFuZGxlcikgLyBzaXplb2YgKGl3X2hhbmRsZXIpLAorCS5udW1fcHJpdmF0ZV9hcmdzID0KKwkgICAgc2l6ZW9mIChwcmlzbTU0X3ByaXZhdGVfYXJncykgLyBzaXplb2YgKHN0cnVjdCBpd19wcml2X2FyZ3MpLAorCS5zdGFuZGFyZCA9IChpd19oYW5kbGVyICopIHByaXNtNTRfaGFuZGxlciwKKwkucHJpdmF0ZSA9IChpd19oYW5kbGVyICopIHByaXNtNTRfcHJpdmF0ZV9oYW5kbGVyLAorCS5wcml2YXRlX2FyZ3MgPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBwcmlzbTU0X3ByaXZhdGVfYXJncywKKyNpZiBXSVJFTEVTU19FWFQgPT0gMTYKKwkuc3B5X29mZnNldCA9IG9mZnNldG9mKGlzbHBjaV9wcml2YXRlLCBzcHlfZGF0YSksCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID09IDE2ICovCit9OworCisvKiBGb3Igd3BhX3N1cHBsaWNhbnQgKi8KKworaW50CitwcmlzbTU0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQoreworCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKKwlpbnQgcmV0ID0gLTE7CisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBQUklTTTU0X0hPU1RBUEQ6CisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwkJcmV0ID0gcHJpc201NF9ob3N0YXBkKG5kZXYsICZ3cnEtPnUuZGF0YSk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAtRU9QTk9UU1VQUDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZDVjZGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiAgCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEludGVyc2lsIEFtZXJpY2FzIEluYy4KKyAqICAgICAgICAgICAgKEMpIDIwMDMgQXVyZWxpZW4gQWxsZWF1bWUgPHNsdHNAZnJlZS5mcj4KKyAqICAgICAgICAgICAgKEMpIDIwMDMgTHVpcyBSLiBSb2RyaWd1ZXogPG1jZ3JvZkBydXNsdWcucnV0Z2Vycy5lZHU+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpZm5kZWYgX0lTTF9JT0NUTF9ICisjZGVmaW5lIF9JU0xfSU9DVExfSAorCisjaW5jbHVkZSAiaXNscGNpX21ndC5oIgorI2luY2x1ZGUgImlzbHBjaV9kZXYuaCIKKworI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CS8qIE5ldyBkcml2ZXIgQVBJICovCisKKyNkZWZpbmUgU1VQUE9SVEVEX1dJUkVMRVNTX0VYVCAgICAgICAgICAgICAgICAgIDE2CisKK3ZvaWQgcHJpc201NF9taWJfaW5pdChpc2xwY2lfcHJpdmF0ZSAqKTsKKworc3RydWN0IGl3X3N0YXRpc3RpY3MgKnByaXNtNTRfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICopOwordm9pZCBwcmlzbTU0X3VwZGF0ZV9zdGF0cyhpc2xwY2lfcHJpdmF0ZSAqKTsKKwordm9pZCBwcmlzbTU0X2FjbF9pbml0KHN0cnVjdCBpc2xwY2lfYWNsICopOwordm9pZCBwcmlzbTU0X2FjbF9jbGVhbihzdHJ1Y3QgaXNscGNpX2FjbCAqKTsKKwordm9pZCBwcmlzbTU0X3Byb2Nlc3NfdHJhcCh2b2lkICopOworCit2b2lkIHByaXNtNTRfd3BhX2llX2luaXQoaXNscGNpX3ByaXZhdGUgKnByaXYpOwordm9pZCBwcmlzbTU0X3dwYV9pZV9jbGVhbihpc2xwY2lfcHJpdmF0ZSAqcHJpdik7CisKK2ludCBwcmlzbTU0X3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqLCB2b2lkICopOworCitpbnQgcHJpc201NF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgaWZyZXEgKiwgaW50KTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBwcmlzbTU0X2hhbmRsZXJfZGVmOworCisjZW5kaWYJCQkJLyogX0lTTF9JT0NUTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9vaWQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX29pZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOWVkZjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9vaWQuaApAQCAtMCwwICsxLDUwNyBAQAorLyoKKyAqCisgKiAgCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBnbnUub3JnPgorICogIENvcHlyaWdodCAoQykgMjAwNCBMdWlzIFIuIFJvZHJpZ3VleiA8bWNncm9mQHJ1c2x1Zy5ydXRnZXJzLmVkdT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgQXVyZWxpZW4gQWxsZWF1bWUgPHNsdHNAZnJlZS5mcj4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2lmICFkZWZpbmVkKF9JU0xfT0lEX0gpCisjZGVmaW5lIF9JU0xfT0lEX0gKKworLyogCisgKiBNSUIgcmVsYXRlZCBjb25zdGFudCBhbmQgc3RydWN0dXJlIGRlZmluaXRpb25zIGZvciBjb21tdW5pY2F0aW5nCisgKiB3aXRoIHRoZSBkZXZpY2UgZmlybXdhcmUKKyAqLworCitzdHJ1Y3Qgb2JqX3NzaWQgeworCXU4IGxlbmd0aDsKKwljaGFyIG9jdGV0c1szM107Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG9ial9rZXkgeworCXU4IHR5cGU7CQkvKiBkb3QxMV9wcml2X3QgKi8KKwl1OCBsZW5ndGg7CisJY2hhciBrZXlbMzJdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBvYmpfbWxtZSB7CisJdTggYWRkcmVzc1s2XTsKKwl1MTYgaWQ7CisJdTE2IHN0YXRlOworCXUxNiBjb2RlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBvYmpfbWxtZWV4IHsKKwl1OCBhZGRyZXNzWzZdOworCXUxNiBpZDsKKwl1MTYgc3RhdGU7CisJdTE2IGNvZGU7CisJdTE2IHNpemU7CisJdTggZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgb2JqX2J1ZmZlciB7CisJdTMyIHNpemU7CisJdTMyIGFkZHI7CQkvKiAzMmJpdCBidXMgYWRkcmVzcyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBvYmpfYnNzIHsKKwl1OCBhZGRyZXNzWzZdOworCWludDoxNjsJCQkvKiBwYWRkaW5nICovCisKKwljaGFyIHN0YXRlOworCWNoYXIgcmVzZXJ2ZWQ7CisJc2hvcnQgYWdlOworCisJY2hhciBxdWFsaXR5OworCWNoYXIgcnNzaTsKKworCXN0cnVjdCBvYmpfc3NpZCBzc2lkOworCXNob3J0IGNoYW5uZWw7CisJY2hhciBiZWFjb25fcGVyaW9kOworCWNoYXIgZHRpbV9wZXJpb2Q7CisJc2hvcnQgY2FwaW5mbzsKKwlzaG9ydCByYXRlczsKKwlzaG9ydCBiYXNpY19yYXRlczsKKwlpbnQ6MTY7CQkJLyogcGFkZGluZyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBvYmpfYnNzbGlzdCB7CisJdTMyIG5yOworCXN0cnVjdCBvYmpfYnNzIGJzc2xpc3RbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG9ial9mcmVxdWVuY2llcyB7CisJdTE2IG5yOworCXUxNiBtaHpbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IG9ial9hdHRhY2htZW50IHsKKwljaGFyIHR5cGU7CisJY2hhciByZXNlcnZlZDsKKwlzaG9ydCBpZDsKKwlzaG9ydCBzaXplOworCWNoYXIgZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIAorICogaW4gY2FzZSBldmVyeXRoaW5nJ3Mgb2ssIHRoZSBpbmxpbmVkIGZ1bmN0aW9uIGJlbG93IHdpbGwgYmUKKyAqIG9wdGltaXplZCBhd2F5IGJ5IHRoZSBjb21waWxlci4uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19fYnVnX29uX3dyb25nX3N0cnVjdF9zaXplcyh2b2lkKQoreworCUJVR19PTihzaXplb2YgKHN0cnVjdCBvYmpfc3NpZCkgIT0gMzQpOworCUJVR19PTihzaXplb2YgKHN0cnVjdCBvYmpfa2V5KSAhPSAzNCk7CisJQlVHX09OKHNpemVvZiAoc3RydWN0IG9ial9tbG1lKSAhPSAxMik7CisJQlVHX09OKHNpemVvZiAoc3RydWN0IG9ial9tbG1lZXgpICE9IDE0KTsKKwlCVUdfT04oc2l6ZW9mIChzdHJ1Y3Qgb2JqX2J1ZmZlcikgIT0gOCk7CisJQlVHX09OKHNpemVvZiAoc3RydWN0IG9ial9ic3MpICE9IDYwKTsKKwlCVUdfT04oc2l6ZW9mIChzdHJ1Y3Qgb2JqX2Jzc2xpc3QpICE9IDQpOworCUJVR19PTihzaXplb2YgKHN0cnVjdCBvYmpfZnJlcXVlbmNpZXMpICE9IDIpOworfQorCitlbnVtIGRvdDExX3N0YXRlX3QgeworCURPVDExX1NUQVRFX05PTkUgPSAwLAorCURPVDExX1NUQVRFX0FVVEhJTkcgPSAxLAorCURPVDExX1NUQVRFX0FVVEggPSAyLAorCURPVDExX1NUQVRFX0FTU09DSU5HID0gMywKKworCURPVDExX1NUQVRFX0FTU09DID0gNSwKKwlET1QxMV9TVEFURV9JQlNTID0gNiwKKwlET1QxMV9TVEFURV9XRFMgPSA3Cit9OworCitlbnVtIGRvdDExX2Jzc3R5cGVfdCB7CisJRE9UMTFfQlNTVFlQRV9OT05FID0gMCwKKwlET1QxMV9CU1NUWVBFX0lORlJBID0gMSwKKwlET1QxMV9CU1NUWVBFX0lCU1MgPSAyLAorCURPVDExX0JTU1RZUEVfQU5ZID0gMworfTsKKworZW51bSBkb3QxMV9hdXRoX3QgeworCURPVDExX0FVVEhfTk9ORSA9IDAsCisJRE9UMTFfQVVUSF9PUyA9IDEsCisJRE9UMTFfQVVUSF9TSyA9IDIsCisJRE9UMTFfQVVUSF9CT1RIID0gMworfTsKKworZW51bSBkb3QxMV9tbG1lX3QgeworCURPVDExX01MTUVfQVVUTyA9IDAsCisJRE9UMTFfTUxNRV9JTlRFUk1FRElBVEUgPSAxLAorCURPVDExX01MTUVfRVhURU5ERUQgPSAyCit9OworCitlbnVtIGRvdDExX3ByaXZfdCB7CisJRE9UMTFfUFJJVl9XRVAgPSAwLAorCURPVDExX1BSSVZfVEtJUCA9IDEKK307CisKKy8qIFByaXNtICJOaXRybyIgLyBGcmFtZWJ1cnN0IC8gIlBhY2tldCBGcmFtZSBHcm91cGluZyIKKyAqIFZhbHVlIGlzIGluIG1pY3Jvc2Vjb25kcy4gUmVwcmVzZW50cyB0aGUgIyBtaWNyb3NlY29uZHMKKyAqIHRoZSBmaXJtd2FyZSB3aWxsIHRha2UgdG8gZ3JvdXAgZnJhbWVzIGJlZm9yZSBzZW5kaW5nIG91dCB0aGVuIG91dCAKKyAqIHRvZ2V0aGVyIHdpdGggYSBDU01BIGNvbnRlbnRpb24uIFdpdGhvdXQgdGhpcyBhbGwgZnJhbWVzIGFyZQorICogc2VudCB3aXRoIGEgQ1NNQSBjb250ZW50aW9uLiAKKyAqIEJpYmxpb2dyYXBoeTogCisgKiBodHRwOi8vd3d3LmhwbC5ocC5jb20vcGVyc29uYWwvSmVhbl9Ub3VycmlsaGVzL1BhcGVycy9QYWNrZXQuRnJhbWUuR3JvdXBpbmcuaHRtbAorICovCitlbnVtIGRvdDExX21heGZyYW1lYnVyc3RfdCB7IAorCS8qIFZhbHVlcyBmb3IgRE9UMTFfT0lEX01BWEZSQU1FQlVSU1QgKi8KKwlET1QxMV9NQVhGUkFNRUJVUlNUX09GRiA9IDAsIC8qIENhcmQgZmlybXdhcmUgZGVmYXVsdCAqLworCURPVDExX01BWEZSQU1FQlVSU1RfTUlYRURfU0FGRSA9IDY1MCwgLyogODAyLjExIGEsYixnIHNhZmUgKi8KKwlET1QxMV9NQVhGUkFNRUJVUlNUX0lERUFMID0gMTMwMCwgLyogVGhlb3JldGljYWwgaWRlYWwgbGV2ZWwgKi8KKwlET1QxMV9NQVhGUkFNRUJVUlNUX01BWCA9IDUwMDAsIC8qIFVzZSB0aGlzIGFzIG1heCwKKwkJKiBOb3RlOiBmaXJtd2FyZSBhbGxvd3MgZm9yIGdyZWF0ZXIgdmFsdWVzLiBUaGlzIGlzIGEKKwkJKiByZWNvbW1lbmRlZCBtYXguIEknbGwgdXBkYXRlIHRoaXMgYXMgSSBmaW5kCisJCSogb3V0IHdoYXQgdGhlIHJlYWwgTUFYIGlzLiBBbHNvIG5vdGUgdGhhdCB5b3UgZG9uJ3QgbmVjZXNzYXJpbHkKKwkJKiBnZXQgYmV0dGVyIHJlc3VsdHMgd2l0aCBhIGdyZWF0ZXIgdmFsdWUgaGVyZS4KKwkJKi8KK307CisKKy8qIFN1cHBvcnQgZm9yIDgwMi4xMSBsb25nIGFuZCBzaG9ydCBmcmFtZSBwcmVhbWJsZXMuCisgKiBMb25nCSBwcmVhbWJsZSB1c2VzIDEyOC1iaXQgc3luYyBmaWVsZCwgOC1iaXQgIENSQworICogU2hvcnQgcHJlYW1ibGUgdXNlcyA1Ni1iaXQgIHN5bmMgZmllbGQsIDE2LWJpdCBDUkMKKyAqIAorICogODAyLjExYSAtLSBub3Qgc3VyZSwgYm90aCBvcHRpb25hbGx5ID8KKyAqIDgwMi4xMWIgc3VwcG9ydHMgbG9uZyBhbmQgb3B0aW9uYWxseSBzaG9ydCAKKyAqIDgwMi4xMWcgc3VwcG9ydHMgYm90aCAqLworZW51bSBkb3QxMV9wcmVhbWJsZXNldHRpbmdzX3QgeworCURPVDExX1BSRUFNQkxFU0VUVElOR19MT05HID0gMCwKKwkJLyogQWxsb3dzICpvbmx5KiBsb25nIDgwMi4xMSBwcmVhbWJsZXMgKi8KKwlET1QxMV9QUkVBTUJMRVNFVFRJTkdfU0hPUlQgPSAxLAorCQkvKiBBbGxvd3MgKm9ubHkqIHNob3J0IDgwMi4xMSBwcmVhbWJsZXMgKi8KKwlET1QxMV9QUkVBTUJMRVNFVFRJTkdfRFlOQU1JQyA9IDIKKwkJLyogQXV0b21hdGlHaWNhbGx5IHNldCAqLworfTsKKworLyogU3VwcG9ydCBmb3IgODAyLjExIHNsb3QgdGltaW5nICh0aW1lIGJldHdlZW4gcGFja2V0cykuCisgKgorICogTG9uZyB1c2VzIDgwMi4xMWEgc2xvdCB0aW1pbmcgICg5IHVzZWMgPykKKyAqIFNob3J0IHVzZXMgODAyLjExYiBzbG90IHRpbWluZyAoMjAgdXNlID8pICovCitlbnVtIGRvdDExX3Nsb3RzZXR0aW5nc190IHsKKwlET1QxMV9TTE9UU0VUVElOR1NfTE9ORyA9IDAsIAorCQkvKiBBbGxvd3MgKm9ubHkqIGxvbmcgODAyLjExYiBzbG90IHRpbWluZyAqLworCURPVDExX1NMT1RTRVRUSU5HU19TSE9SVCA9IDEsCisJCS8qIEFsbG93cyAqb25seSogbG9uZyA4MDIuMTFhIHNsb3QgdGltaW5nICovCisJRE9UMTFfU0xPVFNFVFRJTkdTX0RZTkFNSUMgPSAyCisJCS8qIEF1dG9tYXRpR2ljYWxseSBzZXQgKi8KK307CisKKy8qIEFsbCB5b3UgbmVlZCB0byBrbm93LCBFUlAgaXMgIkV4dGVuZGVkIFJhdGUgUEhZIi4KKyAqIEFuIEV4dGVuZGVkIFJhdGUgUEhZIChFUlApIFNUQSBvciBBUCBzaGFsbCBzdXBwb3J0IHRocmVlIGRpZmZlcmVudCAKKyAqIHByZWFtYmxlIGFuZCBoZWFkZXIgZm9ybWF0czoKKyAqIExvbmcgIHByZWFtYmxlIChyZWZlciB0byBhYm92ZSkKKyAqIFNob3J0IHByZWFtYmxlIChyZWZlciB0byBhYm92ZSkKKyAqIE9GRE0gIHByZWFtYmxlICggPyApCisgKgorICogSSdtIGFzc3VtaW5nIGhlcmUgUHJvdGVjdGlvbiB0ZWxscyB0aGUgQVAKKyAqIHRvIGJlIGNhcmVmdWwsIGEgU1RBIHdoaWNoIGNhbm5vdCBoYW5kbGUgdGhlIGxvbmcgcHJlLWFtYmxlCisgKiBoYXMgam9pbmVkLgorICovCitlbnVtIGRvMTFfbm9uZXJwc3RhdHVzX3QgeworCURPVDExX0VSUFNUQVRfTk9ORVBSRVNFTlQgPSAwLAorCURPVDExX0VSUFNUQVRfVVNFUFJPVEVDVElPTiA9IDEKK307CisKKy8qIChFUlAgaXMgIkV4dGVuZGVkIFJhdGUgUEhZIikgV2F5IHRvIHJlYWQgTk9ORVJQIGlzIE5PTi1FUlAtKgorICogVGhlIGtleSBoZXJlIGlzIERPVDExIE5PTiBFUlAgTkVWRVIgcHJvdGVjdHMgYWdhaW5zdAorICogTk9OIEVSUCBTVEEncy4gWW91ICpkb24ndCogd2FudCB0aGlzIHVubGVzcworICogeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLiBJdCBtZWFucyB5b3Ugd2lsbCBvbmx5IAorICogZ2V0IEV4dGVuZGVkIFJhdGUgY2FwYWJpbGl0aWVzICovCitlbnVtIGRvdDExX25vbmVycHByb3RlY3Rpb25fdCB7CisJRE9UMTFfTk9ORVJQX05FVkVSID0gMCwKKwlET1QxMV9OT05FUlBfQUxXQVlTID0gMSwKKwlET1QxMV9OT05FUlBfRFlOQU1JQyA9IDIKK307CisKKy8qIFByZXNldCBPSUQgY29uZmlndXJhdGlvbiBmb3IgODAyLjExIG1vZGVzIAorICogTm90ZTogRE9UMTFfT0lEX0NXW01JTnxNQVhdIGhvbGQgdGhlIHZhbHVlcyBvZiB0aGUgCisgKiBEQ1MgTUlOfE1BWCBiYWNrb2ZmIHVzZWQgKi8KK2VudW0gZG90MTFfcHJvZmlsZV90IHsgLyogQW5kIHNldC9hbGxvd2VkIHZhbHVlcyAqLworCS8qIEFsbG93ZWQgdmFsdWVzIGZvciBET1QxMV9PSURfUFJPRklMRVMgKi8KKwlET1QxMV9QUk9GSUxFX0JfT05MWSA9IDAsCisJCS8qIERPVDExX09JRF9SQVRFUzogMSwgMiwgNS41LCAxMU1icHMgCisJCSAqIERPVDExX09JRF9QUkVBTUJMRVNFVFRJTkdTOiBET1QxMV9QUkVBTUJMRVNFVFRJTkdfRFlOQU1JQworCQkgKiBET1QxMV9PSURfQ1dNSU46IDMxCisJCSAqIERPVDExX09JRF9OT05FUFJPVEVDVElPTjogRE9UMTFfTk9FUlBfRFlOQU1JQworCQkgKiBET1QxMV9PSURfU0xPVFNFVFRJTkdTOiBET1QxMV9TTE9UU0VUVElOR1NfTE9ORworCQkgKi8KKwlET1QxMV9QUk9GSUxFX01JWEVEX0dfV0lGSSA9IDEsCisJCS8qIERPVDExX09JRF9SQVRFUzogMSwgMiwgNS41LCAxMSwgNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NE1icworCQkgKiBET1QxMV9PSURfUFJFQU1CTEVTRVRUSU5HUzogRE9UMTFfUFJFQU1CTEVTRVRUSU5HX0RZTkFNSUMKKwkJICogRE9UMTFfT0lEX0NXTUlOOiAxNQorCQkgKiBET1QxMV9PSURfTk9ORVBST1RFQ1RJT046IERPVDExX05PRVJQX0RZTkFNSUMKKwkJICogRE9UMTFfT0lEX1NMT1RTRVRUSU5HUzogRE9UMTFfU0xPVFNFVFRJTkdTX0RZTkFNSUMKKwkJICovCisJRE9UMTFfUFJPRklMRV9NSVhFRF9MT05HID0gMiwgLyogIkxvbmcgcmFuZ2UiICovCisJCS8qIFNhbWUgYXMgUHJvZmlsZSBNSVhFRF9HX1dJRkkgKi8KKwlET1QxMV9QUk9GSUxFX0dfT05MWSA9IDMsCisJCS8qIFNhbWUgYXMgUHJvZmlsZSBNSVhFRF9HX1dJRkkgKi8KKwlET1QxMV9QUk9GSUxFX1RFU1QgPSA0LAorCQkvKiBTYW1lIGFzIFByb2ZpbGUgTUlYRURfR19XSUZJIGV4Y2VwdDoKKwkJICogRE9UMTFfT0lEX1BSRUFNQkxFU0VUVElOR1M6IERPVDExX1BSRUFNQkxFU0VUVElOR19TSE9SVAorCQkgKiBET1QxMV9PSURfTk9ORVBST1RFQ1RJT046IERPVDExX05PRVJQX05FVkVSCisJCSAqIERPVDExX09JRF9TTE9UU0VUVElOR1M6IERPVDExX1NMT1RTRVRUSU5HU19TSE9SVAorCQkgKi8KKwlET1QxMV9QUk9GSUxFX0JfV0lGSSA9IDUsCisJCS8qIFNhbWUgYXMgUHJvZmlsZSBCX09OTFkgKi8KKwlET1QxMV9QUk9GSUxFX0FfT05MWSA9IDYsCisJCS8qIFNhbWUgYXMgUHJvZmlsZSBNSVhFRF9HX1dJRkkgZXhjZXB0OgorCQkgKiBET1QxMV9PSURfUkFURVM6IDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTRNYnMKKwkJICovCisJRE9UMTFfUFJPRklMRV9NSVhFRF9TSE9SVCA9IDcKKwkJLyogU2FtZSBhcyBNSVhFRF9HX1dJRkkgKi8KK307CisKKworLyogVGhlIGRvdDExZCBjb25mb3JtYW5jZSBsZXZlbCBjb25maWd1cmVzIHRoZSA4MDIuMTFkIGNvbmZvcm1hbmNlIGxldmVscy4KKyAqIFRoZSBmb2xsb3dpbmcgY29uZm9ybWFuY2UgbGV2ZWxzIGV4aXN0OiovCitlbnVtIG9pZF9pbmxfY29uZm9ybWFuY2VfdCB7CisJT0lEX0lOTF9DT05GT1JNQU5DRV9OT05FID0gMCwJLyogUGVyZm9ybSBhY3RpdmUgc2Nhbm5pbmcgKi8KKwlPSURfSU5MX0NPTkZPUk1BTkNFX1NUUklDVCA9IDEsCS8qIFN0cmljdGx5IGFkaGVyZSB0byA4MDIuMTFkICovCisJT0lEX0lOTF9DT05GT1JNQU5DRV9GTEVYSUJMRSA9IDIsCS8qIFVzZSBwYXNzZWQgODAyLjExZCBpbmZvIHRvCisJCSogZGV0ZXJtaW5lIGNoYW5uZWwgQU5EL09SIGp1c3QgbWFrZSBhc3N1bXB0aW9uIHRoYXQgYWN0aXZlIAorCQkqIGNoYW5uZWxzIGFyZSB2YWxpZCAgY2hhbm5lbHMgKi8KK307CisKK2VudW0gb2lkX2lubF9tb2RlX3QgeworCUlOTF9NT0RFX05PTkUgPSAtMSwKKwlJTkxfTU9ERV9QUk9NSVNDVU9VUyA9IDAsCisJSU5MX01PREVfQ0xJRU5UID0gMSwKKwlJTkxfTU9ERV9BUCA9IDIsCisJSU5MX01PREVfU05JRkZFUiA9IDMKK307CisKK2VudW0gb2lkX2lubF9jb25maWdfdCB7CisJSU5MX0NPTkZJR19OT1RISU5HID0gMHgwMCwKKwlJTkxfQ09ORklHX01BTlVBTFJVTiA9IDB4MDEsCisJSU5MX0NPTkZJR19GUkFNRVRSQVAgPSAweDAyLAorCUlOTF9DT05GSUdfUlhBTk5FWCA9IDB4MDQsCisJSU5MX0NPTkZJR19UWEFOTkVYID0gMHgwOCwKKwlJTkxfQ09ORklHX1dEUyA9IDB4MTAKK307CisKK2VudW0gb2lkX2lubF9waHljYXBfdCB7CisJSU5MX1BIWUNBUF8yNDAwTUhaID0gMSwKKwlJTkxfUEhZQ0FQXzUwMDBNSFogPSAyLAorCUlOTF9QSFlDQVBfRkFBID0gMHg4MDAwMDAwMCwJLyogTWVhbnMgY2FyZCBzdXBwb3J0cyB0aGUgRkFBIHN3aXRjaCAqLworfTsKKworCitlbnVtIG9pZF9udW1fdCB7CisJR0VOX09JRF9NQUNBRERSRVNTID0gMCwKKwlHRU5fT0lEX0xJTktTVEFURSwKKwlHRU5fT0lEX1dBVENIRE9HLAorCUdFTl9PSURfTUlCT1AsCisJR0VOX09JRF9PUFRJT05TLAorCUdFTl9PSURfTEVEQ09ORklHLAorCisJLyogODAyLjExICovCisJRE9UMTFfT0lEX0JTU1RZUEUsCisJRE9UMTFfT0lEX0JTU0lELAorCURPVDExX09JRF9TU0lELAorCURPVDExX09JRF9TVEFURSwKKwlET1QxMV9PSURfQUlELAorCURPVDExX09JRF9DT1VOVFJZU1RSSU5HLAorCURPVDExX09JRF9TU0lET1ZFUlJJREUsCisKKwlET1QxMV9PSURfTUVESVVNTElNSVQsCisJRE9UMTFfT0lEX0JFQUNPTlBFUklPRCwKKwlET1QxMV9PSURfRFRJTVBFUklPRCwKKwlET1QxMV9PSURfQVRJTVdJTkRPVywKKwlET1QxMV9PSURfTElTVEVOSU5URVJWQUwsCisJRE9UMTFfT0lEX0NGUFBFUklPRCwKKwlET1QxMV9PSURfQ0ZQRFVSQVRJT04sCisKKwlET1QxMV9PSURfQVVUSEVOQUJMRSwKKwlET1QxMV9PSURfUFJJVkFDWUlOVk9LRUQsCisJRE9UMTFfT0lEX0VYVU5FTkNSWVBURUQsCisJRE9UMTFfT0lEX0RFRktFWUlELAorCURPVDExX09JRF9ERUZLRVlYLAkvKiBET1QxMV9PSURfREVGS0VZMSwuLi5ET1QxMV9PSURfREVGS0VZNCAqLworCURPVDExX09JRF9TVEFLRVksCisJRE9UMTFfT0lEX1JFS0VZVEhSRVNIT0xELAorCURPVDExX09JRF9TVEFTQywKKworCURPVDExX09JRF9QUklWVFhSRUpFQ1RFRCwKKwlET1QxMV9PSURfUFJJVlJYUExBSU4sCisJRE9UMTFfT0lEX1BSSVZSWEZBSUxFRCwKKwlET1QxMV9PSURfUFJJVlJYTk9LRVksCisKKwlET1QxMV9PSURfUlRTVEhSRVNILAorCURPVDExX09JRF9GUkFHVEhSRVNILAorCURPVDExX09JRF9TSE9SVFJFVFJJRVMsCisJRE9UMTFfT0lEX0xPTkdSRVRSSUVTLAorCURPVDExX09JRF9NQVhUWExJRkVUSU1FLAorCURPVDExX09JRF9NQVhSWExJRkVUSU1FLAorCURPVDExX09JRF9BVVRIUkVTUFRJTUVPVVQsCisJRE9UMTFfT0lEX0FTU09DUkVTUFRJTUVPVVQsCisKKwlET1QxMV9PSURfQUxPRlRfVEFCTEUsCisJRE9UMTFfT0lEX0FMT0ZUX0NUUkxfVEFCTEUsCisJRE9UMTFfT0lEX0FMT0ZUX1JFVFJFQVQsCisJRE9UMTFfT0lEX0FMT0ZUX1BST0dSRVNTLAorCURPVDExX09JRF9BTE9GVF9GSVhFRFJBVEUsCisJRE9UMTFfT0lEX0FMT0ZUX1JTU0lHUkFQSCwKKwlET1QxMV9PSURfQUxPRlRfQ09ORklHLAorCisJRE9UMTFfT0lEX1ZEQ0ZYLAorCURPVDExX09JRF9NQVhGUkFNRUJVUlNULAorCisJRE9UMTFfT0lEX1BTTSwKKwlET1QxMV9PSURfQ0FNVElNRU9VVCwKKwlET1QxMV9PSURfUkVDRUlWRURUSU1TLAorCURPVDExX09JRF9ST0FNUFJFRkVSRU5DRSwKKworCURPVDExX09JRF9CUklER0VMT0NBTCwKKwlET1QxMV9PSURfQ0xJRU5UUywKKwlET1QxMV9PSURfQ0xJRU5UU0FTU09DSUFURUQsCisJRE9UMTFfT0lEX0NMSUVOVFgsCS8qIERPVDExX09JRF9DTElFTlRYLC4uLkRPVDExX09JRF9DTElFTlQyMDA3ICovCisKKwlET1QxMV9PSURfQ0xJRU5URklORCwKKwlET1QxMV9PSURfV0RTTElOS0FERCwKKwlET1QxMV9PSURfV0RTTElOS1JFTU9WRSwKKwlET1QxMV9PSURfRUFQQVVUSFNUQSwKKwlET1QxMV9PSURfRUFQVU5BVVRIU1RBLAorCURPVDExX09JRF9ET1QxWEVOQUJMRSwKKwlET1QxMV9PSURfTUlDRkFJTFVSRSwKKwlET1QxMV9PSURfUkVLRVlJTkRJQ0FURSwKKworCURPVDExX09JRF9NUERVVFhTVUNDRVNTRlVMLAorCURPVDExX09JRF9NUERVVFhPTkVSRVRSWSwKKwlET1QxMV9PSURfTVBEVVRYTVVMVElQTEVSRVRSSUVTLAorCURPVDExX09JRF9NUERVVFhGQUlMRUQsCisJRE9UMTFfT0lEX01QRFVSWFNVQ0NFU1NGVUwsCisJRE9UMTFfT0lEX01QRFVSWERVUFMsCisJRE9UMTFfT0lEX1JUU1NVQ0NFU1NGVUwsCisJRE9UMTFfT0lEX1JUU0ZBSUxFRCwKKwlET1QxMV9PSURfQUNLRkFJTEVELAorCURPVDExX09JRF9GUkFNRVJFQ0VJVkVTLAorCURPVDExX09JRF9GUkFNRUVSUk9SUywKKwlET1QxMV9PSURfRlJBTUVBQk9SVFMsCisJRE9UMTFfT0lEX0ZSQU1FQUJPUlRTUEhZLAorCisJRE9UMTFfT0lEX1NMT1RUSU1FLAorCURPVDExX09JRF9DV01JTiwgLyogTUlOIERDUyBiYWNrb2ZmICovCisJRE9UMTFfT0lEX0NXTUFYLCAvKiBNQVggRENTIGJhY2tvZmYgKi8KKwlET1QxMV9PSURfQUNLV0lORE9XLAorCURPVDExX09JRF9BTlRFTk5BUlgsCisJRE9UMTFfT0lEX0FOVEVOTkFUWCwKKwlET1QxMV9PSURfQU5URU5OQURJVkVSU0lUWSwKKwlET1QxMV9PSURfQ0hBTk5FTCwKKwlET1QxMV9PSURfRURUSFJFU0hPTEQsCisJRE9UMTFfT0lEX1BSRUFNQkxFU0VUVElOR1MsCisJRE9UMTFfT0lEX1JBVEVTLAorCURPVDExX09JRF9DQ0FNT0RFU1VQUE9SVEVELAorCURPVDExX09JRF9DQ0FNT0RFLAorCURPVDExX09JRF9SU1NJVkVDVE9SLAorCURPVDExX09JRF9PVVRQVVRQT1dFUlRBQkxFLAorCURPVDExX09JRF9PVVRQVVRQT1dFUiwKKwlET1QxMV9PSURfU1VQUE9SVEVEUkFURVMsCisJRE9UMTFfT0lEX0ZSRVFVRU5DWSwKKwlET1QxMV9PSURfU1VQUE9SVEVERlJFUVVFTkNJRVMsCisJRE9UMTFfT0lEX05PSVNFRkxPT1IsCisJRE9UMTFfT0lEX0ZSRVFVRU5DWUFDVElWSVRZLAorCURPVDExX09JRF9JUUNBTElCUkFUSU9OVEFCTEUsCisJRE9UMTFfT0lEX05PTkVSUFBST1RFQ1RJT04sCisJRE9UMTFfT0lEX1NMT1RTRVRUSU5HUywKKwlET1QxMV9PSURfTk9ORVJQVElNRU9VVCwKKwlET1QxMV9PSURfUFJPRklMRVMsCisJRE9UMTFfT0lEX0VYVEVOREVEUkFURVMsCisKKwlET1QxMV9PSURfREVBVVRIRU5USUNBVEUsCisJRE9UMTFfT0lEX0FVVEhFTlRJQ0FURSwKKwlET1QxMV9PSURfRElTQVNTT0NJQVRFLAorCURPVDExX09JRF9BU1NPQ0lBVEUsCisJRE9UMTFfT0lEX1NDQU4sCisJRE9UMTFfT0lEX0JFQUNPTiwKKwlET1QxMV9PSURfUFJPQkUsCisJRE9UMTFfT0lEX0RFQVVUSEVOVElDQVRFRVgsCisJRE9UMTFfT0lEX0FVVEhFTlRJQ0FURUVYLAorCURPVDExX09JRF9ESVNBU1NPQ0lBVEVFWCwKKwlET1QxMV9PSURfQVNTT0NJQVRFRVgsCisJRE9UMTFfT0lEX1JFQVNTT0NJQVRFLAorCURPVDExX09JRF9SRUFTU09DSUFURUVYLAorCisJRE9UMTFfT0lEX05PTkVSUFNUQVRVUywKKworCURPVDExX09JRF9TVEFUSU1FT1VULAorCURPVDExX09JRF9NTE1FQVVUT0xFVkVMLAorCURPVDExX09JRF9CU1NUSU1FT1VULAorCURPVDExX09JRF9BVFRBQ0hNRU5ULAorCURPVDExX09JRF9QU01CVUZGRVIsCisKKwlET1QxMV9PSURfQlNTUywKKwlET1QxMV9PSURfQlNTWCwJCS8qRE9UMTFfT0lEX0JTUzEsLi4uLERPVDExX09JRF9CU1M2NCAqLworCURPVDExX09JRF9CU1NGSU5ELAorCURPVDExX09JRF9CU1NMSVNULAorCisJT0lEX0lOTF9UVU5ORUwsCisJT0lEX0lOTF9NRU1BRERSLAorCU9JRF9JTkxfTUVNT1JZLAorCU9JRF9JTkxfTU9ERSwKKwlPSURfSU5MX0NPTVBPTkVOVF9OUiwKKwlPSURfSU5MX1ZFUlNJT04sCisJT0lEX0lOTF9JTlRFUkZBQ0VfSUQsCisJT0lEX0lOTF9DT01QT05FTlRfSUQsCisJT0lEX0lOTF9DT05GSUcsCisJT0lEX0lOTF9ET1QxMURfQ09ORk9STUFOQ0UsCisJT0lEX0lOTF9QSFlDQVBBQklMSVRJRVMsCisJT0lEX0lOTF9PVVRQVVRQT1dFUiwKKworCU9JRF9OVU1fTEFTVAorfTsKKworI2RlZmluZSBPSURfRkxBR19DQUNIRUQJCTB4ODAKKyNkZWZpbmUgT0lEX0ZMQUdfVFlQRQkJMHg3ZgorCisjZGVmaW5lIE9JRF9UWVBFX1UzMgkJMHgwMQorI2RlZmluZSBPSURfVFlQRV9TU0lECQkweDAyCisjZGVmaW5lIE9JRF9UWVBFX0tFWQkJMHgwMworI2RlZmluZSBPSURfVFlQRV9CVUZGRVIJCTB4MDQKKyNkZWZpbmUgT0lEX1RZUEVfQlNTCQkweDA1CisjZGVmaW5lIE9JRF9UWVBFX0JTU0xJU1QJMHgwNgorI2RlZmluZSBPSURfVFlQRV9GUkVRVUVOQ0lFUwkweDA3CisjZGVmaW5lIE9JRF9UWVBFX01MTUUJCTB4MDgKKyNkZWZpbmUgT0lEX1RZUEVfTUxNRUVYCQkweDA5CisjZGVmaW5lIE9JRF9UWVBFX0FERFIJCTB4MEEKKyNkZWZpbmUgT0lEX1RZUEVfUkFXCQkweDBCCisjZGVmaW5lIE9JRF9UWVBFX0FUVEFDSAkJMHgwQworCisvKiBPSURfVFlQRV9NTE1FRVggaXMgc3BlY2lhbCBiZWNhdXNlIG9mIGEgdmFyaWFibGUgc2l6ZSBmaWVsZCB3aGVuIHNlbmRpbmcuCisgKiBOb3QgeWV0IGltcGxlbWVudGVkIChub3QgdXNlZCBpbiBkcml2ZXIgYW55d2F5KS4KKyAqLworCitzdHJ1Y3Qgb2lkX3QgeworCWVudW0gb2lkX251bV90IG9pZDsKKwlzaG9ydCByYW5nZTsJCS8qIHRvIGRlZmluZSBhIHJhbmdlIG9mIG9pZCAqLworCXNob3J0IHNpemU7CQkvKiBtYXggc2l6ZSBvZiB0aGUgYXNzb2NpYXRlZCBkYXRhICovCisJY2hhciBmbGFnczsKK307CisKK3VuaW9uIG9pZF9yZXNfdCB7CisJdm9pZCAqcHRyOworCXUzMiB1OworfTsKKworI2RlZmluZQlJV01BWF9CSVRSQVRFUwkyMAorI2RlZmluZQlJV01BWF9CU1MJMjQKKyNkZWZpbmUgSVdNQVhfRlJFUQkzMAorI2RlZmluZSBQUklWX1NUUl9TSVpFCTEwMjQKKworI2VuZGlmCQkJCS8qICFkZWZpbmVkKF9JU0xfT0lEX0gpICovCisvKiBFT0YgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhYjA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5jCkBAIC0wLDAgKzEsOTU2IEBACisvKgorICogIAorICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBnbnUub3JnPgorICogIENvcHlyaWdodCAoQykgMjAwMyBMdWlzIFIuIFJvZHJpZ3VleiA8bWNncm9mQHJ1c2x1Zy5ydXRnZXJzLmVkdT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAicHJpc21jb21wYXQuaCIKKyNpbmNsdWRlICJpc2xfMzh4eC5oIgorI2luY2x1ZGUgImlzbF9pb2N0bC5oIgorI2luY2x1ZGUgImlzbHBjaV9kZXYuaCIKKyNpbmNsdWRlICJpc2xwY2lfbWd0LmgiCisjaW5jbHVkZSAiaXNscGNpX2V0aC5oIgorI2luY2x1ZGUgIm9pZF9tZ3QuaCIKKworI2RlZmluZSBJU0wzODc3X0lNQUdFX0ZJTEUJImlzbDM4NzciCisjZGVmaW5lIElTTDM4ODZfSU1BR0VfRklMRQkiaXNsMzg4NiIKKyNkZWZpbmUgSVNMMzg5MF9JTUFHRV9GSUxFCSJpc2wzODkwIgorCitzdGF0aWMgaW50IHByaXNtNTRfYnJpbmdfZG93bihpc2xwY2lfcHJpdmF0ZSAqKTsKK3N0YXRpYyBpbnQgaXNscGNpX2FsbG9jX21lbW9yeShpc2xwY2lfcHJpdmF0ZSAqKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXNscGNpX3N0YXRpc3RpY3Moc3RydWN0IG5ldF9kZXZpY2UgKik7CisKKy8qIFRlbXBvcmFyeSBkdW1teSBNQUMgYWRkcmVzcyB0byB1c2UgdW50aWwgZmlybXdhcmUgaXMgbG9hZGVkLgorICogVGhlIGlkZWEgdGhlcmUgaXMgdGhhdCBzb21lIHRvb2xzIChzdWNoIGFzIG5hbWVpZikgbWF5IHF1ZXJ5CisgKiB0aGUgTUFDIGFkZHJlc3MgYmVmb3JlIHRoZSBuZXRkZXYgaXMgJ29wZW4nLiBCeSB1c2luZyBhIHZhbGlkCisgKiBPVUkgcHJlZml4LCB0aGV5IGNhbiBwcm9jZXNzIHRoZSBuZXRkZXYgcHJvcGVybHkuCisgKiBPZiBjb3Vyc2UsIHRoaXMgaXMgbm90IHRoZSBmaW5hbC9yZWFsIE1BQyBhZGRyZXNzLiBJdCBkb2Vzbid0CisgKiBtYXR0ZXIsIGFzIHlvdSBhcmUgc3VwcG9zZSB0byBiZSBhYmxlIHRvIGNoYW5nZSBpdCBhbnl0aW1lIHZpYQorICogbmRldi0+c2V0X21hY19hZGRyZXNzLiBKZWFuIElJICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhcglkdW1teV9tYWNbNl0gPSB7IDB4MDAsIDB4MzAsIDB4QjQsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKworc3RhdGljIGludAoraXNsX3VwbG9hZF9maXJtd2FyZShpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwl1MzIgcmVnLCByYzsKKwl2b2lkIF9faW9tZW0gKmRldmljZV9iYXNlID0gcHJpdi0+ZGV2aWNlX2Jhc2U7CisKKwkvKiBjbGVhciB0aGUgUkFNQm9vdCBhbmQgdGhlIFJlc2V0IGJpdCAqLworCXJlZyA9IHJlYWRsKGRldmljZV9iYXNlICsgSVNMMzhYWF9DVFJMX1NUQVRfUkVHKTsKKwlyZWcgJj0gfklTTDM4WFhfQ1RSTF9TVEFUX1JFU0VUOworCXJlZyAmPSB+SVNMMzhYWF9DVFJMX1NUQVRfUkFNQk9PVDsKKwl3cml0ZWwocmVnLCBkZXZpY2VfYmFzZSArIElTTDM4WFhfQ1RSTF9TVEFUX1JFRyk7CisJd21iKCk7CisJdWRlbGF5KElTTDM4WFhfV1JJVEVJT19ERUxBWSk7CisKKwkvKiBzZXQgdGhlIFJlc2V0IGJpdCB3aXRob3V0IHJlYWRpbmcgdGhlIHJlZ2lzdGVyICEgKi8KKwlyZWcgfD0gSVNMMzhYWF9DVFJMX1NUQVRfUkVTRVQ7CisJd3JpdGVsKHJlZywgZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpOworCXdtYigpOworCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOworCisJLyogY2xlYXIgdGhlIFJlc2V0IGJpdCAqLworCXJlZyAmPSB+SVNMMzhYWF9DVFJMX1NUQVRfUkVTRVQ7CisJd3JpdGVsKHJlZywgZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpOworCXdtYigpOworCisJLyogd2FpdCBhIHdoaWxlIGZvciB0aGUgZGV2aWNlIHRvIHJlYm9vdCAqLworCW1kZWxheSg1MCk7CisKKwl7CisJCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnkgPSBOVUxMOworCQlsb25nIGZ3X2xlbjsKKwkJY29uc3QgdTMyICpmd19wdHI7CisKKwkJcmMgPSByZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgcHJpdi0+ZmlybXdhcmUsIFBSSVNNX0ZXX1BERVYpOworCQlpZiAocmMpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICIlczogcmVxdWVzdF9maXJtd2FyZSgpIGZhaWxlZCBmb3IgJyVzJ1xuIiwKKwkJCSAgICAgICAicHJpc201NCIsIHByaXYtPmZpcm13YXJlKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQkvKiBwcmVwYXJlIHRoZSBEaXJlY3QgTWVtb3J5IEJhc2UgcmVnaXN0ZXIgKi8KKwkJcmVnID0gSVNMMzhYWF9ERVZfRklSTVdBUkVfQUREUkVTOworCisJCWZ3X3B0ciA9ICh1MzIgKikgZndfZW50cnktPmRhdGE7CisJCWZ3X2xlbiA9IGZ3X2VudHJ5LT5zaXplOworCisJCWlmIChmd19sZW4gJSA0KSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiJXM6IGZpcm13YXJlICclcycgc2l6ZSBpcyBub3QgbXVsdGlwbGUgb2YgMzJiaXQsIGFib3J0aW5nIVxuIiwKKwkJCSAgICAgICAicHJpc201NCIsIHByaXYtPmZpcm13YXJlKTsKKwkJCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOworCQkJcmV0dXJuIC1FSUxTRVE7IC8qIElsbGVnYWwgYnl0ZSBzZXF1ZW5jZSAgKi87CisJCX0KKworCQl3aGlsZSAoZndfbGVuID4gMCkgeworCQkJbG9uZyBfZndfbGVuID0KKwkJCSAgICAoZndfbGVuID4KKwkJCSAgICAgSVNMMzhYWF9NRU1PUllfV0lORE9XX1NJWkUpID8KKwkJCSAgICBJU0wzOFhYX01FTU9SWV9XSU5ET1dfU0laRSA6IGZ3X2xlbjsKKwkJCXUzMiBfX2lvbWVtICpkZXZfZndfcHRyID0gZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0RJUkVDVF9NRU1fV0lOOworCisJCQkvKiBzZXQgdGhlIGNhcmRzIGJhc2UgYWRkcmVzcyBmb3Igd3JpdHRpbmcgdGhlIGRhdGEgKi8KKwkJCWlzbDM4eHhfdzMyX2ZsdXNoKGRldmljZV9iYXNlLCByZWcsCisJCQkJCSAgSVNMMzhYWF9ESVJfTUVNX0JBU0VfUkVHKTsKKwkJCXdtYigpOwkvKiBiZSBwYXJhbm9pZCAqLworCisJCQkvKiBpbmNyZW1lbnQgdGhlIHdyaXRlIGFkZHJlc3MgZm9yIG5leHQgaXRlcmF0aW9uICovCisJCQlyZWcgKz0gX2Z3X2xlbjsKKwkJCWZ3X2xlbiAtPSBfZndfbGVuOworCisJCQkvKiB3cml0ZSB0aGUgZGF0YSB0byB0aGUgRGlyZWN0IE1lbW9yeSBXaW5kb3cgMzJiaXQtd2lzZSAqLworCQkJLyogbWVtY3B5X3RvaW8oKSBkb2Vzbid0IGd1YXJhbnRlZSAzMmJpdCB3cml0ZXMgOi18ICovCisJCQl3aGlsZSAoX2Z3X2xlbiA+IDApIHsKKwkJCQkvKiB1c2Ugbm9uLXN3YXBwaW5nIHdyaXRlbCgpICovCisJCQkJX19yYXdfd3JpdGVsKCpmd19wdHIsIGRldl9md19wdHIpOworCQkJCWZ3X3B0cisrLCBkZXZfZndfcHRyKys7CisJCQkJX2Z3X2xlbiAtPSA0OworCQkJfQorCisJCQkvKiBmbHVzaCBQQ0kgcG9zdGluZyAqLworCQkJKHZvaWQpIHJlYWRsKGRldmljZV9iYXNlICsgSVNMMzhYWF9QQ0lfUE9TVElOR19GTFVTSCk7CisJCQl3bWIoKTsJLyogYmUgcGFyYW5vaWQgYWdhaW4gKi8KKworCQkJQlVHX09OKF9md19sZW4gIT0gMCk7CisJCX0KKworCQlCVUdfT04oZndfbGVuICE9IDApOworCisJCS8qIEZpcm13YXJlIHZlcnNpb24gaXMgYXQgb2Zmc2V0IDQwIChhbHNvIGZvciAibmV3bWFjIikgKi8KKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmaXJtd2FyZSB2ZXJzaW9uOiAlLjhzXG4iLAorCQkgICAgICAgcHJpdi0+bmRldi0+bmFtZSwgZndfZW50cnktPmRhdGEgKyA0MCk7CisKKwkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CisJfQorCisJLyogbm93IHJlc2V0IHRoZSBkZXZpY2UKKwkgKiBjbGVhciB0aGUgUmVzZXQgJiBDbGtSdW4gYml0LCBzZXQgdGhlIFJBTUJvb3QgYml0ICovCisJcmVnID0gcmVhZGwoZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpOworCXJlZyAmPSB+SVNMMzhYWF9DVFJMX1NUQVRfQ0xLUlVOOworCXJlZyAmPSB+SVNMMzhYWF9DVFJMX1NUQVRfUkVTRVQ7CisJcmVnIHw9IElTTDM4WFhfQ1RSTF9TVEFUX1JBTUJPT1Q7CisJaXNsMzh4eF93MzJfZmx1c2goZGV2aWNlX2Jhc2UsIHJlZywgSVNMMzhYWF9DVFJMX1NUQVRfUkVHKTsKKwl3bWIoKTsKKwl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKKworCS8qIHNldCB0aGUgcmVzZXQgYml0IGxhdGNoZXMgdGhlIGhvc3Qgb3ZlcnJpZGUgYW5kIFJBTUJvb3QgYml0cworCSAqIGludG8gdGhlIGRldmljZSBmb3Igb3BlcmF0aW9uIHdoZW4gdGhlIHJlc2V0IGJpdCBpcyByZXNldCAqLworCXJlZyB8PSBJU0wzOFhYX0NUUkxfU1RBVF9SRVNFVDsKKwl3cml0ZWwocmVnLCBkZXZpY2VfYmFzZSArIElTTDM4WFhfQ1RSTF9TVEFUX1JFRyk7CisJLyogZG9uJ3QgZG8gZmx1c2ggUENJIHBvc3RpbmcgaGVyZSEgKi8KKwl3bWIoKTsKKwl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKKworCS8qIGNsZWFyIHRoZSByZXNldCBiaXQgc2hvdWxkIHN0YXJ0IHRoZSB3aG9sZSBjaXJjdXMgKi8KKwlyZWcgJj0gfklTTDM4WFhfQ1RSTF9TVEFUX1JFU0VUOworCXdyaXRlbChyZWcsIGRldmljZV9iYXNlICsgSVNMMzhYWF9DVFJMX1NUQVRfUkVHKTsKKwkvKiBkb24ndCBkbyBmbHVzaCBQQ0kgcG9zdGluZyBoZXJlISAqLworCXdtYigpOworCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBEZXZpY2UgSW50ZXJydXB0IEhhbmRsZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaXJxcmV0dXJuX3QKK2lzbHBjaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqY29uZmlnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1MzIgcmVnOworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gY29uZmlnOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcHJpdi0+bmRldjsKKwl2b2lkIF9faW9tZW0gKmRldmljZSA9IHByaXYtPmRldmljZV9iYXNlOworCWludCBwb3dlcnN0YXRlID0gSVNMMzhYWF9QU01fUE9XRVJTQVZFX1NUQVRFOworCisJLyogbG9jayB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlzcGluX2xvY2soJnByaXYtPnNsb2NrKTsKKworCS8qIHJlY2VpdmVkIGFuIGludGVycnVwdCByZXF1ZXN0IG9uIGEgc2hhcmVkIElSUSBsaW5lCisJICogZmlyc3QgY2hlY2sgd2hldGhlciB0aGUgZGV2aWNlIGlzIGluIHNsZWVwIG1vZGUgKi8KKwlyZWcgPSByZWFkbChkZXZpY2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpOworCWlmIChyZWcgJiBJU0wzOFhYX0NUUkxfU1RBVF9TTEVFUE1PREUpCisJCS8qIGRldmljZSBpcyBpbiBzbGVlcCBtb2RlLCBJUlEgd2FzIGdlbmVyYXRlZCBieSBzb21lb25lIGVsc2UgKi8KKwl7CisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJREVCVUcoU0hPV19UUkFDSU5HLCAiQXNzdW1pbmcgc29tZW9uZSBlbHNlIGNhbGxlZCB0aGUgSVJRXG4iKTsKKyNlbmRpZgorCQlzcGluX3VubG9jaygmcHJpdi0+c2xvY2spOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisKKwkvKiBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGFueSBzb3VyY2Ugb2YgaW50ZXJydXB0IG9uIHRoZSBkZXZpY2UgKi8KKwlyZWcgPSByZWFkbChkZXZpY2UgKyBJU0wzOFhYX0lOVF9JREVOVF9SRUcpOworCisJLyogYWxzbyBjaGVjayB0aGUgY29udGVudHMgb2YgdGhlIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIsIGJlY2F1c2UgdGhpcworCSAqIHdpbGwgZmlsdGVyIG91dCBpbnRlcnJ1cHQgc291cmNlcyBmcm9tIG90aGVyIGRldmljZXMgb24gdGhlIHNhbWUgaXJxICEgKi8KKwlyZWcgJj0gcmVhZGwoZGV2aWNlICsgSVNMMzhYWF9JTlRfRU5fUkVHKTsKKwlyZWcgJj0gSVNMMzhYWF9JTlRfU09VUkNFUzsKKworCWlmIChyZWcgIT0gMCkgeworCQlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSAhPSBQUlZfU1RBVEVfU0xFRVApCisJCQlwb3dlcnN0YXRlID0gSVNMMzhYWF9QU01fQUNUSVZFX1NUQVRFOworCisJCS8qIHJlc2V0IHRoZSByZXF1ZXN0IGJpdHMgaW4gdGhlIElkZW50aWZpY2F0aW9uIHJlZ2lzdGVyICovCisJCWlzbDM4eHhfdzMyX2ZsdXNoKGRldmljZSwgcmVnLCBJU0wzOFhYX0lOVF9BQ0tfUkVHKTsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCURFQlVHKFNIT1dfRlVOQ1RJT05fQ0FMTFMsCisJCSAgICAgICJJUlE6IElkZW50aWZpY2F0aW9uIHJlZ2lzdGVyIDB4JXAgMHgleCBcbiIsIGRldmljZSwgcmVnKTsKKyNlbmRpZgorCisJCS8qIGNoZWNrIGZvciBlYWNoIGJpdCBpbiB0aGUgcmVnaXN0ZXIgc2VwYXJhdGVseSAqLworCQlpZiAocmVnICYgSVNMMzhYWF9JTlRfSURFTlRfVVBEQVRFKSB7CisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJCS8qIFF1ZXVlIGhhcyBiZWVuIHVwZGF0ZWQgKi8KKwkJCURFQlVHKFNIT1dfVFJBQ0lORywgIklSUTogVXBkYXRlIGZsYWcgXG4iKTsKKworCQkJREVCVUcoU0hPV19RVUVVRV9JTkRFWEVTLAorCQkJICAgICAgIkNCIGRydiBRczogWyVpXVslaV1bJWldWyVpXVslaV1bJWldXG4iLAorCQkJICAgICAgbGUzMl90b19jcHUocHJpdi0+Y29udHJvbF9ibG9jay0+CisJCQkJCSAgZHJpdmVyX2N1cnJfZnJhZ1swXSksCisJCQkgICAgICBsZTMyX3RvX2NwdShwcml2LT5jb250cm9sX2Jsb2NrLT4KKwkJCQkJICBkcml2ZXJfY3Vycl9mcmFnWzFdKSwKKwkJCSAgICAgIGxlMzJfdG9fY3B1KHByaXYtPmNvbnRyb2xfYmxvY2stPgorCQkJCQkgIGRyaXZlcl9jdXJyX2ZyYWdbMl0pLAorCQkJICAgICAgbGUzMl90b19jcHUocHJpdi0+Y29udHJvbF9ibG9jay0+CisJCQkJCSAgZHJpdmVyX2N1cnJfZnJhZ1szXSksCisJCQkgICAgICBsZTMyX3RvX2NwdShwcml2LT5jb250cm9sX2Jsb2NrLT4KKwkJCQkJICBkcml2ZXJfY3Vycl9mcmFnWzRdKSwKKwkJCSAgICAgIGxlMzJfdG9fY3B1KHByaXYtPmNvbnRyb2xfYmxvY2stPgorCQkJCQkgIGRyaXZlcl9jdXJyX2ZyYWdbNV0pCisJCQkgICAgKTsKKworCQkJREVCVUcoU0hPV19RVUVVRV9JTkRFWEVTLAorCQkJICAgICAgIkNCIGRldiBRczogWyVpXVslaV1bJWldWyVpXVslaV1bJWldXG4iLAorCQkJICAgICAgbGUzMl90b19jcHUocHJpdi0+Y29udHJvbF9ibG9jay0+CisJCQkJCSAgZGV2aWNlX2N1cnJfZnJhZ1swXSksCisJCQkgICAgICBsZTMyX3RvX2NwdShwcml2LT5jb250cm9sX2Jsb2NrLT4KKwkJCQkJICBkZXZpY2VfY3Vycl9mcmFnWzFdKSwKKwkJCSAgICAgIGxlMzJfdG9fY3B1KHByaXYtPmNvbnRyb2xfYmxvY2stPgorCQkJCQkgIGRldmljZV9jdXJyX2ZyYWdbMl0pLAorCQkJICAgICAgbGUzMl90b19jcHUocHJpdi0+Y29udHJvbF9ibG9jay0+CisJCQkJCSAgZGV2aWNlX2N1cnJfZnJhZ1szXSksCisJCQkgICAgICBsZTMyX3RvX2NwdShwcml2LT5jb250cm9sX2Jsb2NrLT4KKwkJCQkJICBkZXZpY2VfY3Vycl9mcmFnWzRdKSwKKwkJCSAgICAgIGxlMzJfdG9fY3B1KHByaXYtPmNvbnRyb2xfYmxvY2stPgorCQkJCQkgIGRldmljZV9jdXJyX2ZyYWdbNV0pCisJCQkgICAgKTsKKyNlbmRpZgorCisJCQkvKiBjbGVhbnVwIHRoZSBkYXRhIGxvdyB0cmFuc21pdCBxdWV1ZSAqLworCQkJaXNscGNpX2V0aF9jbGVhbnVwX3RyYW5zbWl0KHByaXYsIHByaXYtPmNvbnRyb2xfYmxvY2spOworCisJCQkvKiBkZXZpY2UgaXMgaW4gYWN0aXZlIHN0YXRlLCB1cGRhdGUgdGhlCisJCQkgKiBwb3dlcnN0YXRlIGZsYWcgaWYgbmVjZXNzYXJ5ICovCisJCQlwb3dlcnN0YXRlID0gSVNMMzhYWF9QU01fQUNUSVZFX1NUQVRFOworCisJCQkvKiBjaGVjayBhbGwgdGhyZWUgcXVldWVzIGluIHByaW9yaXR5IG9yZGVyCisJCQkgKiBjYWxsIHRoZSBQSU1GT1IgcmVjZWl2ZSBmdW5jdGlvbiB1bnRpbCB0aGUKKwkJCSAqIHF1ZXVlIGlzIGVtcHR5ICovCisJCQlpZiAoaXNsMzh4eF9pbl9xdWV1ZShwcml2LT5jb250cm9sX2Jsb2NrLAorCQkJCQkJSVNMMzhYWF9DQl9SWF9NR01UUSkgIT0gMCkgeworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCQkJREVCVUcoU0hPV19UUkFDSU5HLAorCQkJCSAgICAgICJSZWNlaXZlZCBmcmFtZSBpbiBNYW5hZ2VtZW50IFF1ZXVlXG4iKTsKKyNlbmRpZgorCQkJCWlzbHBjaV9tZ3RfcmVjZWl2ZShuZGV2KTsKKworCQkJCWlzbHBjaV9tZ3RfY2xlYW51cF90cmFuc21pdChuZGV2KTsKKworCQkJCS8qIFJlZmlsbCBzbG90cyBpbiByZWNlaXZlIHF1ZXVlICovCisJCQkJaXNscGNpX21nbXRfcnhfZmlsbChuZGV2KTsKKworCQkJCS8qIG5vIG5lZWQgdG8gdHJpZ2dlciB0aGUgZGV2aWNlLCBuZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzbHBjaV9tZ3RfdHJhbnNhY3Rpb24gZG9lcyBpdCAqLworCQkJfQorCisJCQl3aGlsZSAoaXNsMzh4eF9pbl9xdWV1ZShwcml2LT5jb250cm9sX2Jsb2NrLAorCQkJCQkJSVNMMzhYWF9DQl9SWF9EQVRBX0xRKSAhPSAwKSB7CisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJCQlERUJVRyhTSE9XX1RSQUNJTkcsCisJCQkJICAgICAgIlJlY2VpdmVkIGZyYW1lIGluIERhdGEgTG93IFF1ZXVlIFxuIik7CisjZW5kaWYKKwkJCQlpc2xwY2lfZXRoX3JlY2VpdmUocHJpdik7CisJCQl9CisKKwkJCS8qIGNoZWNrIHdoZXRoZXIgdGhlIGRhdGEgdHJhbnNtaXQgcXVldWVzIHdlcmUgZnVsbCAqLworCQkJaWYgKHByaXYtPmRhdGFfbG93X3R4X2Z1bGwpIHsKKwkJCQkvKiBjaGVjayB3aGV0aGVyIHRoZSB0cmFuc21pdCBpcyBub3QgZnVsbCBhbnltb3JlICovCisJCQkJaWYgKElTTDM4WFhfQ0JfVFhfUVNJWkUgLQorCQkJCSAgICBpc2wzOHh4X2luX3F1ZXVlKHByaXYtPmNvbnRyb2xfYmxvY2ssCisJCQkJCQkgICAgIElTTDM4WFhfQ0JfVFhfREFUQV9MUSkgPj0KKwkJCQkgICAgSVNMMzhYWF9NSU5fUVRIUkVTSE9MRCkgeworCQkJCQkvKiBub3BlLCB0aGUgZHJpdmVyIGlzIHJlYWR5IGZvciBtb3JlIG5ldHdvcmsgZnJhbWVzICovCisJCQkJCW5ldGlmX3dha2VfcXVldWUocHJpdi0+bmRldik7CisKKwkJCQkJLyogcmVzZXQgdGhlIGZ1bGwgZmxhZyAqLworCQkJCQlwcml2LT5kYXRhX2xvd190eF9mdWxsID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAocmVnICYgSVNMMzhYWF9JTlRfSURFTlRfSU5JVCkgeworCQkJLyogRGV2aWNlIGhhcyBiZWVuIGluaXRpYWxpemVkICovCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJCURFQlVHKFNIT1dfVFJBQ0lORywKKwkJCSAgICAgICJJUlE6IEluaXQgZmxhZywgZGV2aWNlIGluaXRpYWxpemVkIFxuIik7CisjZW5kaWYKKwkJCXdha2VfdXAoJnByaXYtPnJlc2V0X2RvbmUpOworCQl9CisKKwkJaWYgKHJlZyAmIElTTDM4WFhfSU5UX0lERU5UX1NMRUVQKSB7CisJCQkvKiBEZXZpY2UgaW50ZW5kcyB0byBtb3ZlIHRvIHBvd2Vyc2F2ZSBzdGF0ZSAqLworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCQlERUJVRyhTSE9XX1RSQUNJTkcsICJJUlE6IFNsZWVwIGZsYWcgXG4iKTsKKyNlbmRpZgorCQkJaXNsMzh4eF9oYW5kbGVfc2xlZXBfcmVxdWVzdChwcml2LT5jb250cm9sX2Jsb2NrLAorCQkJCQkJICAgICAmcG93ZXJzdGF0ZSwKKwkJCQkJCSAgICAgcHJpdi0+ZGV2aWNlX2Jhc2UpOworCQl9CisKKwkJaWYgKHJlZyAmIElTTDM4WFhfSU5UX0lERU5UX1dBS0VVUCkgeworCQkJLyogRGV2aWNlIGhhcyBiZWVuIHdva2VuIHVwIHRvIGFjdGl2ZSBzdGF0ZSAqLworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCQlERUJVRyhTSE9XX1RSQUNJTkcsICJJUlE6IFdha2V1cCBmbGFnIFxuIik7CisjZW5kaWYKKworCQkJaXNsMzh4eF9oYW5kbGVfd2FrZXVwKHByaXYtPmNvbnRyb2xfYmxvY2ssCisJCQkJCSAgICAgICZwb3dlcnN0YXRlLCBwcml2LT5kZXZpY2VfYmFzZSk7CisJCX0KKwl9IGVsc2UgeworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCURFQlVHKFNIT1dfVFJBQ0lORywgIkFzc3VtaW5nIHNvbWVvbmUgZWxzZSBjYWxsZWQgdGhlIElSUVxuIik7CisjZW5kaWYKKwkJc3Bpbl91bmxvY2soJnByaXYtPnNsb2NrKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCS8qIHNsZWVwIC0+IHJlYWR5ICovCisJaWYgKGlzbHBjaV9nZXRfc3RhdGUocHJpdikgPT0gUFJWX1NUQVRFX1NMRUVQCisJICAgICYmIHBvd2Vyc3RhdGUgPT0gSVNMMzhYWF9QU01fQUNUSVZFX1NUQVRFKQorCQlpc2xwY2lfc2V0X3N0YXRlKHByaXYsIFBSVl9TVEFURV9SRUFEWSk7CisKKwkvKiAhc2xlZXAgLT4gc2xlZXAgKi8KKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSAhPSBQUlZfU1RBVEVfU0xFRVAKKwkgICAgJiYgcG93ZXJzdGF0ZSA9PSBJU0wzOFhYX1BTTV9QT1dFUlNBVkVfU1RBVEUpCisJCWlzbHBjaV9zZXRfc3RhdGUocHJpdiwgUFJWX1NUQVRFX1NMRUVQKTsKKworCS8qIHVubG9jayB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlzcGluX3VubG9jaygmcHJpdi0+c2xvY2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgTmV0d29yayBJbnRlcmZhY2UgQ29udHJvbCAmIFN0YXRpc3RpY2FsIGZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraXNscGNpX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJdTMyIHJjOworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwkvKiByZXNldCBkYXRhIHN0cnVjdHVyZXMsIHVwbG9hZCBmaXJtd2FyZSBhbmQgcmVzZXQgZGV2aWNlICovCisJcmMgPSBpc2xwY2lfcmVzZXQocHJpdiwxKTsKKwlpZiAocmMpIHsKKwkJcHJpc201NF9icmluZ19kb3duKHByaXYpOworCQlyZXR1cm4gcmM7IC8qIFJldHVybnMgaW5mb3JtYXRpdmUgbWVzc2FnZSAqLworCX0KKworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5kZXYpOworLyogICAgICBuZXRpZl9tYXJrX3VwKCBuZGV2ICk7ICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXNscGNpX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlzbHBjaV9jbG9zZSAoKVxuIiwgbmRldi0+bmFtZSk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCisJcmV0dXJuIHByaXNtNTRfYnJpbmdfZG93bihwcml2KTsKK30KKworc3RhdGljIGludAorcHJpc201NF9icmluZ19kb3duKGlzbHBjaV9wcml2YXRlICpwcml2KQoreworCXZvaWQgX19pb21lbSAqZGV2aWNlX2Jhc2UgPSBwcml2LT5kZXZpY2VfYmFzZTsKKwl1MzIgcmVnOworCS8qIHdlIGFyZSBnb2luZyB0byBzaHV0ZG93biB0aGUgZGV2aWNlICovCisJaXNscGNpX3NldF9zdGF0ZShwcml2LCBQUlZfU1RBVEVfUFJFQk9PVCk7CisKKwkvKiBkaXNhYmxlIGFsbCBkZXZpY2UgaW50ZXJydXB0cyBpbiBjYXNlIHRoZXkgd2VyZW4ndCAqLworCWlzbDM4eHhfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYtPmRldmljZV9iYXNlKTsgIAorCisJLyogRm9yIHNhZmV0eSByZWFzb25zLCB3ZSBtYXkgd2FudCB0byBlbnN1cmUgdGhhdCBubyBETUEgdHJhbnNmZXIgaXMKKwkgKiBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MgYnkgZW1wdHlpbmcgdGhlIFRYIGFuZCBSWCBxdWV1ZXMuICovCisKKwkvKiB3YWl0IHVudGlsIGludGVycnVwdHMgaGF2ZSBmaW5pc2hlZCBleGVjdXRpbmcgb24gb3RoZXIgQ1BVcyAqLworCXN5bmNocm9uaXplX2lycShwcml2LT5wZGV2LT5pcnEpOworCisJcmVnID0gcmVhZGwoZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpOworCXJlZyAmPSB+KElTTDM4WFhfQ1RSTF9TVEFUX1JFU0VUIHwgSVNMMzhYWF9DVFJMX1NUQVRfUkFNQk9PVCk7CisJd3JpdGVsKHJlZywgZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpOworCXdtYigpOworCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOworCisJcmVnIHw9IElTTDM4WFhfQ1RSTF9TVEFUX1JFU0VUOworCXdyaXRlbChyZWcsIGRldmljZV9iYXNlICsgSVNMMzhYWF9DVFJMX1NUQVRfUkVHKTsKKwl3bWIoKTsKKwl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKKworCS8qIGNsZWFyIHRoZSBSZXNldCBiaXQgKi8KKwlyZWcgJj0gfklTTDM4WFhfQ1RSTF9TVEFUX1JFU0VUOworCXdyaXRlbChyZWcsIGRldmljZV9iYXNlICsgSVNMMzhYWF9DVFJMX1NUQVRfUkVHKTsKKwl3bWIoKTsKKworCS8qIHdhaXQgYSB3aGlsZSBmb3IgdGhlIGRldmljZSB0byByZXNldCAqLworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlzY2hlZHVsZV90aW1lb3V0KDUwKkhaLzEwMDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lzbHBjaV91cGxvYWRfZncoaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJaXNscGNpX3N0YXRlX3Qgb2xkX3N0YXRlOworCXUzMiByYzsKKworCW9sZF9zdGF0ZSA9IGlzbHBjaV9zZXRfc3RhdGUocHJpdiwgUFJWX1NUQVRFX0JPT1QpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB1cGxvYWRpbmcgZmlybXdhcmUuLi5cbiIsIHByaXYtPm5kZXYtPm5hbWUpOworCisJcmMgPSBpc2xfdXBsb2FkX2Zpcm13YXJlKHByaXYpOworCWlmIChyYykgeworCQkvKiBlcnJvciB1cGxvYWRpbmcgdGhlIGZpcm13YXJlICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCB1cGxvYWQgZmlybXdhcmUgKCclcycpXG4iLAorCQkgICAgICAgcHJpdi0+bmRldi0+bmFtZSwgcHJpdi0+ZmlybXdhcmUpOworCisJCWlzbHBjaV9zZXRfc3RhdGUocHJpdiwgb2xkX3N0YXRlKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICIlczogZmlybXdhcmUgdXBsb2FkIGNvbXBsZXRlXG4iLAorCSAgICAgICBwcml2LT5uZGV2LT5uYW1lKTsKKworCWlzbHBjaV9zZXRfc3RhdGUocHJpdiwgUFJWX1NUQVRFX1BPU1RCT09UKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citpc2xwY2lfcmVzZXRfaWYoaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJbG9uZyByZW1haW5pbmc7CisJaW50IHJlc3VsdCA9IC1FVElNRTsKKwlpbnQgY291bnQ7CisKKwlERUZJTkVfV0FJVCh3YWl0KTsKKwlwcmVwYXJlX3RvX3dhaXQoJnByaXYtPnJlc2V0X2RvbmUsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCisJLyogbm93IHRoZSBsYXN0IHN0ZXAgaXMgdG8gcmVzZXQgdGhlIGludGVyZmFjZSAqLworCWlzbDM4eHhfaW50ZXJmYWNlX3Jlc2V0KHByaXYtPmRldmljZV9iYXNlLCBwcml2LT5kZXZpY2VfaG9zdF9hZGRyZXNzKTsKKwlpc2xwY2lfc2V0X3N0YXRlKHByaXYsIFBSVl9TVEFURV9QUkVJTklUKTsKKworICAgICAgICBmb3IoY291bnQgPSAwOyBjb3VudCA8IDIgJiYgcmVzdWx0OyBjb3VudCsrKSB7CisJCS8qIFRoZSBzb2Z0d2FyZSByZXNldCBhY2tub3dsZWRnZSBuZWVkcyBhYm91dCAyMjAgbXNlYyBoZXJlLgorCQkgKiBCZSBjb25zZXJ2YXRpdmUgYW5kIHdhaXQgZm9yIHVwIHRvIG9uZSBzZWNvbmQuICovCisJCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJcmVtYWluaW5nID0gc2NoZWR1bGVfdGltZW91dChIWik7CisKKwkJaWYocmVtYWluaW5nID4gMCkgeworCQkJcmVzdWx0ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogSWYgd2UncmUgaGVyZSBpdCdzIGJlY2F1c2Ugb3VyIElSUSBoYXNuJ3QgeWV0IGdvbmUgdGhyb3VnaC4gCisJCSAqIFJldHJ5IGEgYml0IG1vcmUuLi4KKwkJICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vICdyZXNldCBjb21wbGV0ZScgSVJRIHNlZW4gLSByZXRyeWluZ1xuIiwKKwkJCXByaXYtPm5kZXYtPm5hbWUpOworCX0KKworCWZpbmlzaF93YWl0KCZwcml2LT5yZXNldF9kb25lLCAmd2FpdCk7CisKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGludGVyZmFjZSByZXNldCBmYWlsdXJlXG4iLCBwcml2LT5uZGV2LT5uYW1lKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlpc2xwY2lfc2V0X3N0YXRlKHByaXYsIFBSVl9TVEFURV9JTklUKTsKKworCS8qIE5vdyB0aGF0IHRoZSBkZXZpY2UgaXMgMTAwJSB1cCwgbGV0J3MgYWxsb3cKKwkgKiBmb3IgdGhlIG90aGVyIGludGVycnVwdHMgLS0KKwkgKiBOT1RFOiB0aGlzIGlzIG5vdCAqeWV0KiB0cnVlIHNpbmNlIHdlJ3ZlIG9ubHkgYWxsb3dlZCB0aGUgCisJICogSU5JVCBpbnRlcnJ1cHQgb24gdGhlIElSUSBsaW5lLiBXZSBjYW4gcGVyaGFwcyBwb2xsCisJICogdGhlIElSUSBsaW5lIHVudGlsIHdlIGtub3cgZm9yIHN1cmUgdGhlIHJlc2V0IHdlbnQgdGhyb3VnaCAqLworCWlzbDM4eHhfZW5hYmxlX2NvbW1vbl9pbnRlcnJ1cHRzKHByaXYtPmRldmljZV9iYXNlKTsKKworCWRvd25fd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCXJlc3VsdCA9IG1ndF9jb21taXQocHJpdik7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpbnRlcmZhY2UgcmVzZXQgZmFpbHVyZVxuIiwgcHJpdi0+bmRldi0+bmFtZSk7CisJCXVwX3dyaXRlKCZwcml2LT5taWJfc2VtKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJdXBfd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCisJaXNscGNpX3NldF9zdGF0ZShwcml2LCBQUlZfU1RBVEVfUkVBRFkpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcmZhY2UgcmVzZXQgY29tcGxldGVcbiIsIHByaXYtPm5kZXYtPm5hbWUpOworCXJldHVybiAwOworfQorCitpbnQKK2lzbHBjaV9yZXNldChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgaW50IHJlbG9hZF9maXJtd2FyZSkKK3sKKwlpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKmNiID0gICAgLyogdm9sYXRpbGUgbm90IG5lZWRlZCAqLworCQkoaXNsMzh4eF9jb250cm9sX2Jsb2NrICopIHByaXYtPmNvbnRyb2xfYmxvY2s7CisJdW5zaWduZWQgY291bnRlcjsKKwlpbnQgcmM7CisKKwlpZiAocmVsb2FkX2Zpcm13YXJlKQorCQlpc2xwY2lfc2V0X3N0YXRlKHByaXYsIFBSVl9TVEFURV9QUkVCT09UKTsKKwllbHNlCisJCWlzbHBjaV9zZXRfc3RhdGUocHJpdiwgUFJWX1NUQVRFX1BPU1RCT09UKTsKKworCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVzZXR0aW5nIGRldmljZS4uLlxuIiwgcHJpdi0+bmRldi0+bmFtZSk7CisKKwkvKiBkaXNhYmxlIGFsbCBkZXZpY2UgaW50ZXJydXB0cyBpbiBjYXNlIHRoZXkgd2VyZW4ndCAqLworCWlzbDM4eHhfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYtPmRldmljZV9iYXNlKTsKKworCS8qIGZsdXNoIGFsbCBtYW5hZ2VtZW50IHF1ZXVlcyAqLworCXByaXYtPmluZGV4X21nbXRfdHggPSAwOworCXByaXYtPmluZGV4X21nbXRfcnggPSAwOworCisJLyogY2xlYXIgdGhlIGluZGV4ZXMgaW4gdGhlIGZyYW1lIHBvaW50ZXIgKi8KKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgSVNMMzhYWF9DQl9RQ09VTlQ7IGNvdW50ZXIrKykgeworCQljYi0+ZHJpdmVyX2N1cnJfZnJhZ1tjb3VudGVyXSA9IGNwdV90b19sZTMyKDApOworCQljYi0+ZGV2aWNlX2N1cnJfZnJhZ1tjb3VudGVyXSA9IGNwdV90b19sZTMyKDApOworCX0KKworCS8qIHJlc2V0IHRoZSBtZ210IHJlY2VpdmUgcXVldWUgKi8KKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgSVNMMzhYWF9DQl9NR01UX1FTSVpFOyBjb3VudGVyKyspIHsKKwkJaXNsMzh4eF9mcmFnbWVudCAqZnJhZyA9ICZjYi0+cnhfZGF0YV9tZ210W2NvdW50ZXJdOworCQlmcmFnLT5zaXplID0gY3B1X3RvX2xlMTYoTUdNVF9GUkFNRV9TSVpFKTsKKwkJZnJhZy0+ZmxhZ3MgPSAwOworCQlmcmFnLT5hZGRyZXNzID0gY3B1X3RvX2xlMzIocHJpdi0+bWdtdF9yeFtjb3VudGVyXS5wY2lfYWRkcik7CisJfQorCisJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IElTTDM4WFhfQ0JfUlhfUVNJWkU7IGNvdW50ZXIrKykgeworCQljYi0+cnhfZGF0YV9sb3dbY291bnRlcl0uYWRkcmVzcyA9CisJCSAgICBjcHVfdG9fbGUzMigodTMyKSBwcml2LT5wY2lfbWFwX3J4X2FkZHJlc3NbY291bnRlcl0pOworCX0KKworCS8qIHNpbmNlIHRoZSByZWNlaXZlIHF1ZXVlcyBhcmUgZmlsbGVkIHdpdGggZW1wdHkgZnJhZ21lbnRzLCBub3cgd2UgY2FuCisJICogc2V0IHRoZSBjb3JyZXNwb25kaW5nIGluZGV4ZXMgaW4gdGhlIENvbnRyb2wgQmxvY2sgKi8KKwlwcml2LT5jb250cm9sX2Jsb2NrLT5kcml2ZXJfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfUlhfREFUQV9MUV0gPQorCSAgICBjcHVfdG9fbGUzMihJU0wzOFhYX0NCX1JYX1FTSVpFKTsKKwlwcml2LT5jb250cm9sX2Jsb2NrLT5kcml2ZXJfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfUlhfTUdNVFFdID0KKwkgICAgY3B1X3RvX2xlMzIoSVNMMzhYWF9DQl9NR01UX1FTSVpFKTsKKworCS8qIHJlc2V0IHRoZSByZW1haW5pbmcgcmVhbCBpbmRleCByZWdpc3RlcnMgYW5kIGZ1bGwgZmxhZ3MgKi8KKwlwcml2LT5mcmVlX2RhdGFfcnggPSAwOworCXByaXYtPmZyZWVfZGF0YV90eCA9IDA7CisJcHJpdi0+ZGF0YV9sb3dfdHhfZnVsbCA9IDA7CisKKwlpZiAocmVsb2FkX2Zpcm13YXJlKSB7IC8qIFNob3VsZCB3ZSBsb2FkIHRoZSBmaXJtd2FyZSA/ICovCisJLyogbm93IHRoYXQgdGhlIGRhdGEgc3RydWN0dXJlcyBhcmUgY2xlYW5lZCB1cCwgdXBsb2FkCisJICogZmlybXdhcmUgYW5kIHJlc2V0IGludGVyZmFjZSAqLworCQlyYyA9IGlzbHBjaV91cGxvYWRfZncocHJpdik7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogaXNscGNpX3Jlc2V0OiBmYWlsdXJlXG4iLAorCQkJCXByaXYtPm5kZXYtPm5hbWUpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJLyogZmluYWxseSByZXNldCBpbnRlcmZhY2UgKi8KKwlyYyA9IGlzbHBjaV9yZXNldF9pZihwcml2KTsKKwlpZiAocmMpCisJCXByaW50ayhLRVJOX0VSUiAicHJpc201NDogWW91ciBjYXJkL3NvY2tldCBtYXkgYmUgZmF1bHR5LCBvciBJUlEgbGluZSB0b28gYnVzeSA6KFxuIik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgoraXNscGNpX3N0YXRpc3RpY3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJREVCVUcoU0hPV19GVU5DVElPTl9DQUxMUywgImlzbHBjaV9zdGF0aXN0aWNzXG4iKTsKKyNlbmRpZgorCisJcmV0dXJuICZwcml2LT5zdGF0aXN0aWNzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgTmV0d29yayBkZXZpY2UgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQKK2lzbHBjaV9hbGxvY19tZW1vcnkoaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJaW50IGNvdW50ZXI7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCXByaW50ayhLRVJOX0RFQlVHICJpc2xwY2lfYWxsb2NfbWVtb3J5XG4iKTsKKyNlbmRpZgorCisJLyogcmVtYXAgdGhlIFBDSSBkZXZpY2UgYmFzZSBhZGRyZXNzIHRvIGFjY2Vzc2FibGUgKi8KKwlpZiAoIShwcml2LT5kZXZpY2VfYmFzZSA9CisJICAgICAgaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocHJpdi0+cGRldiwgMCksCisJCSAgICAgIElTTDM4WFhfUENJX01FTV9TSVpFKSkpIHsKKwkJLyogZXJyb3IgaW4gcmVtYXBwaW5nIHRoZSBQQ0kgZGV2aWNlIG1lbW9yeSBhZGRyZXNzIHJhbmdlICovCisJCXByaW50ayhLRVJOX0VSUiAiUENJIG1lbW9yeSByZW1hcHBpbmcgZmFpbGVkIFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBtZW1vcnkgbGF5b3V0IGZvciBjb25zaXN0ZW50IERNQSByZWdpb246CisJICoKKwkgKiBBcmVhIDE6IENvbnRyb2wgQmxvY2sgZm9yIHRoZSBkZXZpY2UgaW50ZXJmYWNlCisJICogQXJlYSAyOiBQb3dlciBTYXZlIE1vZGUgQnVmZmVyIGZvciB0ZW1wb3JhcnkgZnJhbWUgc3RvcmFnZS4gQmUgYXdhcmUgdGhhdAorCSAqICAgICAgICAgdGhlIG51bWJlciBvZiBzdXBwb3J0ZWQgc3RhdGlvbnMgaW4gdGhlIEFQIGRldGVybWluZXMgdGhlIG1pbmltYWwKKwkgKiAgICAgICAgIHNpemUgb2YgdGhlIGJ1ZmZlciAhCisJICovCisKKwkvKiBwZXJmb3JtIHRoZSBhbGxvY2F0aW9uICovCisJcHJpdi0+ZHJpdmVyX21lbV9hZGRyZXNzID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocHJpdi0+cGRldiwKKwkJCQkJCQlIT1NUX01FTV9CTE9DSywKKwkJCQkJCQkmcHJpdi0+CisJCQkJCQkJZGV2aWNlX2hvc3RfYWRkcmVzcyk7CisKKwlpZiAoIXByaXYtPmRyaXZlcl9tZW1fYWRkcmVzcykgeworCQkvKiBlcnJvciBhbGxvY2F0aW5nIHRoZSBibG9jayBvZiBQQ0kgbWVtb3J5ICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBETUEgbWVtb3J5LCBhYm9ydGluZyEiLAorCQkgICAgICAgInByaXNtNTQiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGFzc2lnbiB0aGUgQ29udHJvbCBCbG9jayB0byB0aGUgZmlyc3QgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIGFyZWEgKi8KKwlwcml2LT5jb250cm9sX2Jsb2NrID0KKwkgICAgKGlzbDM4eHhfY29udHJvbF9ibG9jayAqKSBwcml2LT5kcml2ZXJfbWVtX2FkZHJlc3M7CisKKwkvKiBzZXQgdGhlIFBvd2VyIFNhdmUgQnVmZmVyIHBvaW50ZXIgZGlyZWN0bHkgYmVoaW5kIHRoZSBDQiAqLworCXByaXYtPmRldmljZV9wc21fYnVmZmVyID0KKwkJcHJpdi0+ZGV2aWNlX2hvc3RfYWRkcmVzcyArIENPTlRST0xfQkxPQ0tfU0laRTsKKworCS8qIG1ha2Ugc3VyZSBhbGwgYnVmZmVyIHBvaW50ZXJzIGFyZSBpbml0aWFsaXplZCAqLworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCBJU0wzOFhYX0NCX1FDT1VOVDsgY291bnRlcisrKSB7CisJCXByaXYtPmNvbnRyb2xfYmxvY2stPmRyaXZlcl9jdXJyX2ZyYWdbY291bnRlcl0gPSBjcHVfdG9fbGUzMigwKTsKKwkJcHJpdi0+Y29udHJvbF9ibG9jay0+ZGV2aWNlX2N1cnJfZnJhZ1tjb3VudGVyXSA9IGNwdV90b19sZTMyKDApOworCX0KKworCXByaXYtPmluZGV4X21nbXRfcnggPSAwOworCW1lbXNldChwcml2LT5tZ210X3J4LCAwLCBzaXplb2YocHJpdi0+bWdtdF9yeCkpOworCW1lbXNldChwcml2LT5tZ210X3R4LCAwLCBzaXplb2YocHJpdi0+bWdtdF90eCkpOworCisJLyogYWxsb2NhdGUgcnggcXVldWUgZm9yIG1hbmFnZW1lbnQgZnJhbWVzICovCisJaWYgKGlzbHBjaV9tZ210X3J4X2ZpbGwocHJpdi0+bmRldikgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCisJLyogbm93IGdldCB0aGUgZGF0YSByeCBza2IncyAqLworCW1lbXNldChwcml2LT5kYXRhX2xvd19yeCwgMCwgc2l6ZW9mIChwcml2LT5kYXRhX2xvd19yeCkpOworCW1lbXNldChwcml2LT5wY2lfbWFwX3J4X2FkZHJlc3MsIDAsIHNpemVvZiAocHJpdi0+cGNpX21hcF9yeF9hZGRyZXNzKSk7CisKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgSVNMMzhYWF9DQl9SWF9RU0laRTsgY291bnRlcisrKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJLyogYWxsb2NhdGUgYW4gc2tfYnVmZiBmb3IgcmVjZWl2ZWQgZGF0YSBmcmFtZXMgc3RvcmFnZQorCQkgKiBlYWNoIGZyYW1lIG9uIHJlY2VpdmUgc2l6ZSBjb25zaXN0cyBvZiAxIGZyYWdtZW50CisJCSAqIGluY2x1ZGUgYW55IHJlcXVpcmVkIGFsbGlnbm1lbnQgb3BlcmF0aW9ucyAqLworCQlpZiAoIShza2IgPSBkZXZfYWxsb2Nfc2tiKE1BWF9GUkFHTUVOVF9TSVpFX1JYICsgMikpKSB7CisJCQkvKiBlcnJvciBhbGxvY2F0aW5nIGFuIHNrX2J1ZmYgc3RydWN0dXJlIGVsZW1lbnRzICovCisJCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGFsbG9jYXRpbmcgc2tiLlxuIik7CisJCQlza2IgPSBOVUxMOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQlza2JfcmVzZXJ2ZShza2IsICg0IC0gKGxvbmcpIHNrYi0+ZGF0YSkgJiAweDAzKTsKKwkJLyogYWRkIHRoZSBuZXcgYWxsb2NhdGVkIHNrX2J1ZmYgdG8gdGhlIGJ1ZmZlciBhcnJheSAqLworCQlwcml2LT5kYXRhX2xvd19yeFtjb3VudGVyXSA9IHNrYjsKKworCQkvKiBtYXAgdGhlIGFsbG9jYXRlZCBza2IgZGF0YSBhcmVhIHRvIHBjaSAqLworCQlwcml2LT5wY2lfbWFwX3J4X2FkZHJlc3NbY291bnRlcl0gPQorCQkgICAgcGNpX21hcF9zaW5nbGUocHJpdi0+cGRldiwgKHZvaWQgKikgc2tiLT5kYXRhLAorCQkJCSAgIE1BWF9GUkFHTUVOVF9TSVpFX1JYICsgMiwKKwkJCQkgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlpZiAoIXByaXYtPnBjaV9tYXBfcnhfYWRkcmVzc1tjb3VudGVyXSkgeworCQkJLyogZXJyb3IgbWFwcGluZyB0aGUgYnVmZmVyIHRvIGRldmljZQorCQkJICAgYWNjZXNzYWJsZSBtZW1vcnkgYWRkcmVzcyAqLworCQkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gbWFwIHNrYiBETUEnYWJsZVxuIik7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJfQorCisJcHJpc201NF9hY2xfaW5pdCgmcHJpdi0+YWNsKTsKKwlwcmlzbTU0X3dwYV9pZV9pbml0KHByaXYpOworCWlmIChtZ3RfaW5pdChwcml2KSkgCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlyZXR1cm4gMDsKKyBvdXRfZnJlZToKKwlpc2xwY2lfZnJlZV9tZW1vcnkocHJpdik7CisJcmV0dXJuIC0xOworfQorCitpbnQKK2lzbHBjaV9mcmVlX21lbW9yeShpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwlpbnQgY291bnRlcjsKKworCWlmIChwcml2LT5kZXZpY2VfYmFzZSkKKwkJaW91bm1hcChwcml2LT5kZXZpY2VfYmFzZSk7CisJcHJpdi0+ZGV2aWNlX2Jhc2UgPSBOVUxMOworCisJLyogZnJlZSBjb25zaXN0ZW50IERNQSBhcmVhLi4uICovCisJaWYgKHByaXYtPmRyaXZlcl9tZW1fYWRkcmVzcykKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwcml2LT5wZGV2LCBIT1NUX01FTV9CTE9DSywKKwkJCQkgICAgcHJpdi0+ZHJpdmVyX21lbV9hZGRyZXNzLAorCQkJCSAgICBwcml2LT5kZXZpY2VfaG9zdF9hZGRyZXNzKTsKKworCS8qIGNsZWFyIHNvbWUgZGFuZ2xpbmcgcG9pbnRlcnMgKi8KKwlwcml2LT5kcml2ZXJfbWVtX2FkZHJlc3MgPSBOVUxMOworCXByaXYtPmRldmljZV9ob3N0X2FkZHJlc3MgPSAwOworCXByaXYtPmRldmljZV9wc21fYnVmZmVyID0gMDsKKwlwcml2LT5jb250cm9sX2Jsb2NrID0gTlVMTDsKKworICAgICAgICAvKiBjbGVhbiB1cCBtZ210IHJ4IGJ1ZmZlcnMgKi8KKyAgICAgICAgZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IElTTDM4WFhfQ0JfTUdNVF9RU0laRTsgY291bnRlcisrKSB7CisJCXN0cnVjdCBpc2xwY2lfbWVtYnVmICpidWYgPSAmcHJpdi0+bWdtdF9yeFtjb3VudGVyXTsKKwkJaWYgKGJ1Zi0+cGNpX2FkZHIpCisJCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsIGJ1Zi0+cGNpX2FkZHIsCisJCQkJCSBidWYtPnNpemUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCWJ1Zi0+cGNpX2FkZHIgPSAwOworCQlpZiAoYnVmLT5tZW0pCisJCQlrZnJlZShidWYtPm1lbSk7CisJCWJ1Zi0+c2l6ZSA9IDA7CisJCWJ1Zi0+bWVtID0gTlVMTDsKKyAgICAgICAgfQorCisJLyogY2xlYW4gdXAgZGF0YSByeCBidWZmZXJzICovCisJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IElTTDM4WFhfQ0JfUlhfUVNJWkU7IGNvdW50ZXIrKykgeworCQlpZiAocHJpdi0+cGNpX21hcF9yeF9hZGRyZXNzW2NvdW50ZXJdKQorCQkJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wZGV2LAorCQkJCQkgcHJpdi0+cGNpX21hcF9yeF9hZGRyZXNzW2NvdW50ZXJdLAorCQkJCQkgTUFYX0ZSQUdNRU5UX1NJWkVfUlggKyAyLAorCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJcHJpdi0+cGNpX21hcF9yeF9hZGRyZXNzW2NvdW50ZXJdID0gMDsKKworCQlpZiAocHJpdi0+ZGF0YV9sb3dfcnhbY291bnRlcl0pCisJCQlkZXZfa2ZyZWVfc2tiKHByaXYtPmRhdGFfbG93X3J4W2NvdW50ZXJdKTsKKwkJcHJpdi0+ZGF0YV9sb3dfcnhbY291bnRlcl0gPSBOVUxMOworCX0KKworCS8qIEZyZWUgdGhlIGFjY2VzIGNvbnRyb2wgbGlzdCBhbmQgdGhlIFdQQSBsaXN0ICovCisJcHJpc201NF9hY2xfY2xlYW4oJnByaXYtPmFjbCk7CisJcHJpc201NF93cGFfaWVfY2xlYW4ocHJpdik7CisJbWd0X2NsZWFuKHByaXYpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAoraXNscGNpX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIHB1dCBkZXZpY2UgaW50byBwcm9taXNjIG1vZGUgYW5kIGxldCBuZXR3b3JrIGxheWVyIGhhbmRsZSBpdCAqLworfQorI2VuZGlmCisKK3N0cnVjdCBuZXRfZGV2aWNlICoKK2lzbHBjaV9zZXR1cChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZiAoaXNscGNpX3ByaXZhdGUpKTsKKworCWlmICghbmRldikKKwkJcmV0dXJuIG5kZXY7CisKKwlTRVRfTU9EVUxFX09XTkVSKG5kZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBuZGV2KTsKKyNpZiBkZWZpbmVkKFNFVF9ORVRERVZfREVWKQorCVNFVF9ORVRERVZfREVWKG5kZXYsICZwZGV2LT5kZXYpOworI2VuZGlmCisKKwkvKiBzZXR1cCB0aGUgc3RydWN0dXJlIG1lbWJlcnMgKi8KKwluZGV2LT5iYXNlX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJbmRldi0+aXJxID0gcGRldi0+aXJxOworCisJLyogaW5pdGlhbGl6ZSB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKwluZGV2LT5vcGVuID0gJmlzbHBjaV9vcGVuOworCW5kZXYtPnN0b3AgPSAmaXNscGNpX2Nsb3NlOworCW5kZXYtPmdldF9zdGF0cyA9ICZpc2xwY2lfc3RhdGlzdGljczsKKwluZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMgPSAmcHJpc201NF9nZXRfd2lyZWxlc3Nfc3RhdHM7CisJbmRldi0+ZG9faW9jdGwgPSAmcHJpc201NF9pb2N0bDsKKwluZGV2LT53aXJlbGVzc19oYW5kbGVycyA9CisJICAgIChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikgJnByaXNtNTRfaGFuZGxlcl9kZWY7CisKKwluZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmaXNscGNpX2V0aF90cmFuc21pdDsKKwkvKiBuZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmaXNscGNpX3NldF9tdWx0aWNhc3RfbGlzdDsgKi8KKwluZGV2LT5hZGRyX2xlbiA9IEVUSF9BTEVOOworCW5kZXYtPnNldF9tYWNfYWRkcmVzcyA9ICZwcmlzbTU0X3NldF9tYWNfYWRkcmVzczsKKwkvKiBHZXQgYSBub24temVybyBkdW1teSBNQUMgYWRkcmVzcyBmb3IgbmFtZWlmLiBKZWFuIElJICovCisJbWVtY3B5KG5kZXYtPmRldl9hZGRyLCBkdW1teV9tYWMsIDYpOworCisjaWZkZWYgSEFWRV9UWF9USU1FT1VUCisJbmRldi0+d2F0Y2hkb2dfdGltZW8gPSBJU0xQQ0lfVFhfVElNRU9VVDsKKwluZGV2LT50eF90aW1lb3V0ID0gJmlzbHBjaV9ldGhfdHhfdGltZW91dDsKKyNlbmRpZgorCisJLyogYWxsb2NhdGUgYSBwcml2YXRlIGRldmljZSBzdHJ1Y3R1cmUgdG8gdGhlIG5ldHdvcmsgZGV2aWNlICAqLworCXByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlwcml2LT5uZGV2ID0gbmRldjsKKwlwcml2LT5wZGV2ID0gcGRldjsKKwlwcml2LT5tb25pdG9yX3R5cGUgPSBBUlBIUkRfSUVFRTgwMjExOworCXByaXYtPm5kZXYtPnR5cGUgPSAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpID8KKwkJcHJpdi0+bW9uaXRvcl90eXBlIDogQVJQSFJEX0VUSEVSOworCisjaWYgV0lSRUxFU1NfRVhUID4gMTYKKwkvKiBBZGQgcG9pbnRlcnMgdG8gZW5hYmxlIGl3c3B5IHN1cHBvcnQuICovCisJcHJpdi0+d2lyZWxlc3NfZGF0YS5zcHlfZGF0YSA9ICZwcml2LT5zcHlfZGF0YTsKKwluZGV2LT53aXJlbGVzc19kYXRhID0gJnByaXYtPndpcmVsZXNzX2RhdGE7CisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTYgKi8KKworCS8qIHNhdmUgdGhlIHN0YXJ0IGFuZCBlbmQgYWRkcmVzcyBvZiB0aGUgUENJIG1lbW9yeSBhcmVhICovCisJbmRldi0+bWVtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIHByaXYtPmRldmljZV9iYXNlOworCW5kZXYtPm1lbV9lbmQgPSBuZGV2LT5tZW1fc3RhcnQgKyBJU0wzOFhYX1BDSV9NRU1fU0laRTsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJREVCVUcoU0hPV19UUkFDSU5HLCAiUENJIE1lbW9yeSByZW1hcHBlZCB0byAweCVwXG4iLCBwcml2LT5kZXZpY2VfYmFzZSk7CisjZW5kaWYKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPnJlc2V0X2RvbmUpOworCisJLyogaW5pdCB0aGUgcXVldWUgcmVhZCBsb2NrcywgcHJvY2VzcyB3YWl0IGNvdW50ZXIgKi8KKwlzZW1hX2luaXQoJnByaXYtPm1nbXRfc2VtLCAxKTsKKwlwcml2LT5tZ210X3JlY2VpdmVkID0gTlVMTDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT5tZ210X3dxdWV1ZSk7CisJc2VtYV9pbml0KCZwcml2LT5zdGF0c19zZW0sIDEpOworCXNwaW5fbG9ja19pbml0KCZwcml2LT5zbG9jayk7CisKKwkvKiBpbml0IHN0YXRlIG1hY2hpbmUgd2l0aCBvZmYjMSBzdGF0ZSAqLworCXByaXYtPnN0YXRlID0gUFJWX1NUQVRFX09GRjsKKwlwcml2LT5zdGF0ZV9vZmYgPSAxOworCisJLyogaW5pdGlhbGl6ZSB3b3JrcXVldWUncyAqLworCUlOSVRfV09SSygmcHJpdi0+c3RhdHNfd29yaywKKwkJICAodm9pZCAoKikodm9pZCAqKSkgcHJpc201NF91cGRhdGVfc3RhdHMsIHByaXYpOworCXByaXYtPnN0YXRzX3RpbWVzdGFtcCA9IDA7CisKKwlJTklUX1dPUksoJnByaXYtPnJlc2V0X3Rhc2ssIGlzbHBjaV9kb19yZXNldF9hbmRfd2FrZSwgcHJpdik7CisJcHJpdi0+cmVzZXRfdGFza19wZW5kaW5nID0gMDsKKworCS8qIGFsbG9jYXRlIHZhcmlvdXMgbWVtb3J5IGFyZWFzICovCisJaWYgKGlzbHBjaV9hbGxvY19tZW1vcnkocHJpdikpCisJCWdvdG8gZG9fZnJlZV9uZXRkZXY7CisKKwkvKiBzZWxlY3QgdGhlIGZpcm13YXJlIGZpbGUgZGVwZW5kaW5nIG9uIHRoZSBkZXZpY2UgaWQgKi8KKwlzd2l0Y2ggKHBkZXYtPmRldmljZSkgeworCWNhc2UgMHgzODc3OgorCQlzdHJjcHkocHJpdi0+ZmlybXdhcmUsIElTTDM4NzdfSU1BR0VfRklMRSk7CisJCWJyZWFrOworCisJY2FzZSAweDM4ODY6CisJCXN0cmNweShwcml2LT5maXJtd2FyZSwgSVNMMzg4Nl9JTUFHRV9GSUxFKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzdHJjcHkocHJpdi0+ZmlybXdhcmUsIElTTDM4OTBfSU1BR0VfRklMRSk7CisJCWJyZWFrOworCX0KKworCWlmIChyZWdpc3Rlcl9uZXRkZXYobmRldikpIHsKKwkJREVCVUcoU0hPV19FUlJPUl9NRVNTQUdFUywKKwkJICAgICAgIkVSUk9SOiByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWQgXG4iKTsKKwkJZ290byBkb19pc2xwY2lfZnJlZV9tZW1vcnk7CisJfQorCisJcmV0dXJuIG5kZXY7CisKKyAgICAgIGRvX2lzbHBjaV9mcmVlX21lbW9yeToKKwlpc2xwY2lfZnJlZV9tZW1vcnkocHJpdik7CisgICAgICBkb19mcmVlX25ldGRldjoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJZnJlZV9uZXRkZXYobmRldik7CisJcHJpdiA9IE5VTEw7CisJcmV0dXJuIE5VTEw7Cit9CisKK2lzbHBjaV9zdGF0ZV90Citpc2xwY2lfc2V0X3N0YXRlKGlzbHBjaV9wcml2YXRlICpwcml2LCBpc2xwY2lfc3RhdGVfdCBuZXdfc3RhdGUpCit7CisJaXNscGNpX3N0YXRlX3Qgb2xkX3N0YXRlOworCisJLyogbG9jayAqLworCW9sZF9zdGF0ZSA9IHByaXYtPnN0YXRlOworCisJLyogdGhpcyBtZWFucyBlaXRoZXIgYSByYWNlIGNvbmRpdGlvbiBvciBzb21lIHNlcmlvdXMgZXJyb3IgaW4KKwkgKiB0aGUgZHJpdmVyIGNvZGUgKi8KKwlzd2l0Y2ggKG5ld19zdGF0ZSkgeworCWNhc2UgUFJWX1NUQVRFX09GRjoKKwkJcHJpdi0+c3RhdGVfb2ZmKys7CisJZGVmYXVsdDoKKwkJcHJpdi0+c3RhdGUgPSBuZXdfc3RhdGU7CisJCWJyZWFrOworCisJY2FzZSBQUlZfU1RBVEVfUFJFQk9PVDoKKwkJLyogdGhlcmUgYXJlIGFjdHVhbGx5IG1hbnkgb2ZmLXN0YXRlcywgZW51bWVyYXRlZCBieQorCQkgKiBzdGF0ZV9vZmYgKi8KKwkJaWYgKG9sZF9zdGF0ZSA9PSBQUlZfU1RBVEVfT0ZGKQorCQkJcHJpdi0+c3RhdGVfb2ZmLS07CisKKwkJLyogb25seSBpZiBod191bmF2YWlsYWJsZSBpcyB6ZXJvIG5vdyBpdCBtZWFucyB3ZSBlaXRoZXIKKwkJICogd2VyZSBpbiBvZmYjMSBzdGF0ZSwgb3IgY2FtZSBoZXJlIGZyb20KKwkJICogc29tZXdoZXJlIGVsc2UgKi8KKwkJaWYgKCFwcml2LT5zdGF0ZV9vZmYpCisJCQlwcml2LT5zdGF0ZSA9IG5ld19zdGF0ZTsKKwkJYnJlYWs7CisJfTsKKyNpZiAwCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBzdGF0ZSB0cmFuc2l0aW9uICVkIC0+ICVkIChvZmYjJWQpXG4iLAorCSAgICAgICBwcml2LT5uZGV2LT5uYW1lLCBvbGRfc3RhdGUsIG5ld19zdGF0ZSwgcHJpdi0+c3RhdGVfb2ZmKTsKKyNlbmRpZgorCisJLyogaW52YXJpYW50cyAqLworCUJVR19PTihwcml2LT5zdGF0ZV9vZmYgPCAwKTsKKwlCVUdfT04ocHJpdi0+c3RhdGVfb2ZmICYmIChwcml2LT5zdGF0ZSAhPSBQUlZfU1RBVEVfT0ZGKSk7CisJQlVHX09OKCFwcml2LT5zdGF0ZV9vZmYgJiYgKHByaXYtPnN0YXRlID09IFBSVl9TVEFURV9PRkYpKTsKKworCS8qIHVubG9jayAqLworCXJldHVybiBvbGRfc3RhdGU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYTEwMTlmMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5oCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogIAorICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuIAorICogIENvcHlyaWdodCAoQykgMjAwMyBIZXJiZXJ0IFZhbGVyaW8gUmllZGVsIDxodnJAZ251Lm9yZz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgTHVpcyBSLiBSb2RyaWd1ZXogPG1jZ3JvZkBydXNsdWcucnV0Z2Vycy5lZHU+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEF1cmVsaWVuIEFsbGVhdW1lIDxzbHRzQGZyZWUuZnI+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpZm5kZWYgX0lTTFBDSV9ERVZfSAorI2RlZmluZSBfSVNMUENJX0RFVl9ICisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgImlzbF8zOHh4LmgiCisjaW5jbHVkZSAiaXNsX29pZC5oIgorI2luY2x1ZGUgImlzbHBjaV9tZ3QuaCIKKworLyogc29tZSBzdGF0ZXMgbWlnaHQgbm90IGJlIHN1cGVyZmxvdXMgYW5kIG1heSBiZSByZW1vdmVkIHdoZW4KKyAgIGRlc2lnbiBpcyBmaW5hbGl6ZWQgKGh2cikgKi8KK3R5cGVkZWYgZW51bSB7CisJUFJWX1NUQVRFX09GRiA9IDAsCS8qIHRoaXMgbWVhbnMgaHdfdW5hdmFpbGFibGUgaXMgIT0gMCAqLworCVBSVl9TVEFURV9QUkVCT09ULAkvKiB3ZSBhcmUgaW4gYSBwcmUtYm9vdCBzdGF0ZSAoZW1wdHkgUkFNKSAqLworCVBSVl9TVEFURV9CT09ULAkJLyogYm9vdCBzdGF0ZSAoZncgdXBsb2FkLCBydW4gZncpICovCisJUFJWX1NUQVRFX1BPU1RCT09ULAkvKiBhZnRlciBib290IHN0YXRlLCBuZWVkIHJlc2V0IG5vdyAqLworCVBSVl9TVEFURV9QUkVJTklULAkvKiBwcmUtaW5pdCBzdGF0ZSAqLworCVBSVl9TVEFURV9JTklULAkJLyogaW5pdCBzdGF0ZSAocmVzdG9yZSBNSUIgYmFja3VwIHRvIGRldmljZSkgKi8KKwlQUlZfU1RBVEVfUkVBRFksCS8qIGRyaXZlciZkZXZpY2UgYXJlIGluIG9wZXJhdGlvbmFsIHN0YXRlICovCisJUFJWX1NUQVRFX1NMRUVQCQkvKiBkZXZpY2UgaW4gc2xlZXAgbW9kZSAqLworfSBpc2xwY2lfc3RhdGVfdDsKKworLyogQUNMIHVzaW5nIE1BQyBhZGRyZXNzICovCitzdHJ1Y3QgbWFjX2VudHJ5IHsKKyAgIHN0cnVjdCBsaXN0X2hlYWQgX2xpc3Q7CisgICBjaGFyIGFkZHJbRVRIX0FMRU5dOworfTsKKworc3RydWN0IGlzbHBjaV9hY2wgeworICAgZW51bSB7IE1BQ19QT0xJQ1lfT1BFTj0wLCBNQUNfUE9MSUNZX0FDQ0VQVD0xLCBNQUNfUE9MSUNZX1JFSkVDVD0yIH0gcG9saWN5OworICAgc3RydWN0IGxpc3RfaGVhZCBtYWNfbGlzdDsgIC8qIGEgbGlzdCBvZiBtYWNfZW50cnkgKi8KKyAgIGludCBzaXplOyAgIC8qIHNpemUgb2YgcXVldWUgKi8KKyAgIHN0cnVjdCBzZW1hcGhvcmUgc2VtOyAgIC8qIGFjY2Vzc2VkIGluIGlvY3RscyBhbmQgdHJhcF93b3JrICovCit9OworCitzdHJ1Y3QgaXNscGNpX21lbWJ1ZiB7CisJaW50IHNpemU7ICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2YgbWVtb3J5ICovCisJdm9pZCAqbWVtOyAgICAgICAgICAgICAgICAgIC8qIGFkZHJlc3Mgb2YgbWVtb3J5IGFzIHNlZW4gYnkgQ1BVICovCisJZG1hX2FkZHJfdCBwY2lfYWRkcjsgICAgICAgIC8qIGFkZHJlc3Mgb2YgbWVtb3J5IGFzIHNlZW4gYnkgZGV2aWNlICovCit9OworCisjZGVmaW5lIE1BWF9CU1NfV1BBX0lFX0NPVU5UIDY0CisjZGVmaW5lIE1BWF9XUEFfSUVfTEVOIDY0CitzdHJ1Y3QgaXNscGNpX2Jzc193cGFfaWUgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlOworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKwl1OCB3cGFfaWVbTUFYX1dQQV9JRV9MRU5dOworCXNpemVfdCB3cGFfaWVfbGVuOworCQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXNwaW5sb2NrX3Qgc2xvY2s7CS8qIGdlbmVyaWMgc3BpbmxvY2s7ICovCisJCisJdTMyIHByaXZfb2lkOworCisJLyogb3VyIG1pYiBjYWNoZSAqLworCXUzMiBpd19tb2RlOworICAgICAgICBzdHJ1Y3Qgcndfc2VtYXBob3JlIG1pYl9zZW07CisJdm9pZCAqKm1pYjsKKwljaGFyIG5pY2tuYW1lW0lXX0VTU0lEX01BWF9TSVpFKzFdOworCQorCS8qIFRha2UgY2FyZSBvZiB0aGUgd2lyZWxlc3Mgc3RhdHMgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc3RhdHNfd29yazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHN0YXRzX3NlbTsKKwkvKiByZW1lbWJlciB3aGVuIHdlIGxhc3QgdXBkYXRlZCB0aGUgc3RhdHMgKi8KKwl1bnNpZ25lZCBsb25nIHN0YXRzX3RpbWVzdGFtcDsKKwkvKiBUaGUgZmlyc3QgaXMgYWNjZXNzZWQgdW5kZXIgc2VtYXBob3JlIGxvY2tpbmcuCisJICogVGhlIHNlY29uZCBpcyB0aGUgY2xlYW4gb25lIHdlIHJldHVybiB0byBpd2NvbmZpZy4KKwkgKi8KKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyBsb2NhbF9pd3N0YXRpc3RpY3M7CisJc3RydWN0IGl3X3N0YXRpc3RpY3MgaXdzdGF0aXN0aWNzOworCisJc3RydWN0IGl3X3NweV9kYXRhIHNweV9kYXRhOyAvKiBpd3NweSBzdXBwb3J0ICovCisKKyNpZiBXSVJFTEVTU19FWFQgPiAxNgorCXN0cnVjdCBpd19wdWJsaWNfZGF0YSB3aXJlbGVzc19kYXRhOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDE2ICovCisKKwlpbnQgbW9uaXRvcl90eXBlOyAvKiBBUlBIUkRfSUVFRTgwMjExIG9yIEFSUEhSRF9JRUVFODAyMTFfUFJJU00gKi8KKworCXN0cnVjdCBpc2xwY2lfYWNsIGFjbDsKKworCS8qIFBDSSBidXMgYWxsb2NhdGlvbiAmIGNvbmZpZ3VyYXRpb24gbWVtYmVycyAqLworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwkvKiBQQ0kgc3RydWN0dXJlIGluZm9ybWF0aW9uICovCisJY2hhciBmaXJtd2FyZVszM107CisKKwl2b2lkIF9faW9tZW0gKmRldmljZV9iYXNlOwkvKiBpb3JlbWFwcGVkIGRldmljZSBiYXNlIGFkZHJlc3MgKi8KKworCS8qIGNvbnNpc3RlbnQgRE1BIHJlZ2lvbiAqLworCXZvaWQgKmRyaXZlcl9tZW1fYWRkcmVzczsJLyogYmFzZSBETUEgYWRkcmVzcyAqLworCWRtYV9hZGRyX3QgZGV2aWNlX2hvc3RfYWRkcmVzczsJLyogYmFzZSBETUEgYWRkcmVzcyAoYnVzIGFkZHJlc3MpICovCisJZG1hX2FkZHJfdCBkZXZpY2VfcHNtX2J1ZmZlcjsJLyogaG9zdCBtZW1vcnkgZm9yIFBTTSBidWZmZXJpbmcgKGJ1cyBhZGRyZXNzKSAqLworCisJLyogb3VyIG5ldHdvcmtfZGV2aWNlIHN0cnVjdHVyZSAgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKworCS8qIGRldmljZSBxdWV1ZSBpbnRlcmZhY2UgbWVtYmVycyAqLworCXN0cnVjdCBpc2wzOHh4X2NiICpjb250cm9sX2Jsb2NrOwkvKiBkZXZpY2UgY29udHJvbCBibG9jayAKKwkJCQkJCQkgICAoPT0gZHJpdmVyX21lbV9hZGRyZXNzISkgKi8KKworCS8qIEVhY2ggcXVldWUgaGFzIHRocmVlIGluZGV4ZXM6CisJICogICBmcmVlL2luZGV4X21nbXQvZGF0YV9yeC90eCAoY2FsbGVkIGluZGV4LCBzZWUgYmVsb3cpLAorCSAqICAgZHJpdmVyX2N1cnJfZnJhZywgYW5kIGRldmljZV9jdXJyX2ZyYWcgKGluIHRoZSBjb250cm9sIGJsb2NrKQorCSAqIEFsbCBpbmRleGVzIGFyZSBldmVyLWluY3JlYXNpbmcsIGJ1dCBpbnRlcnByZXRlZCBtb2R1bG8gdGhlCisJICogZGV2aWNlIHF1ZXVlIHNpemUgd2hlbiB1c2VkLgorCSAqICAgaW5kZXggPD0gZGV2aWNlX2N1cnJfZnJhZyA8PSBkcml2ZXJfY3Vycl9mcmFnICBhdCBhbGwgdGltZXMKKwkgKiBGb3IgcnggcXVldWVzLCBbaW5kZXgsIGRldmljZV9jdXJyX2ZyYWcpIGNvbnRhaW5zIGZyYWdtZW50cworCSAqIHRoYXQgdGhlIGludGVycnVwdCBwcm9jZXNzaW5nIG5lZWRzIHRvIGhhbmRsZSAob3duZWQgYnkgZHJpdmVyKS4KKwkgKiBbZGV2aWNlX2N1cnJfZnJhZywgZHJpdmVyX2N1cnJfZnJhZykgaXMgdGhlIGZyZWUgc3BhY2UgaW4gdGhlCisJICogcnggcXVldWUsIHdhaXRpbmcgZm9yIGRhdGEgKG93bmVkIGJ5IGRldmljZSkuICBUaGUgZHJpdmVyCisJICogaW5jcmVtZW50cyBkcml2ZXJfY3Vycl9mcmFnIHRvIGluZGljYXRlIHRvIHRoZSBkZXZpY2UgdGhhdCBtb3JlCisJICogYnVmZmVycyBhcmUgYXZhaWxhYmxlLgorCSAqIElmIGRldmljZV9jdXJyX2ZyYWcgPT0gZHJpdmVyX2N1cnJfZnJhZywgbm8gbW9yZSByeCBidWZmZXJzIGFyZQorCSAqIGF2YWlsYWJsZSwgYW5kIHRoZSByeCBETUEgZW5naW5lIG9mIHRoZSBkZXZpY2UgaXMgaGFsdGVkLgorCSAqIEZvciB0eCBxdWV1ZXMsIFtpbmRleCwgZGV2aWNlX2N1cnJfZnJhZykgY29udGFpbnMgZnJhZ21lbnRzCisJICogd2hlcmUgdHggaXMgZG9uZTsgdGhleSBuZWVkIHRvIGJlIGZyZWVkIChvd25lZCBieSBkcml2ZXIpLgorCSAqIFtkZXZpY2VfY3Vycl9mcmFnLCBkcml2ZXJfY3Vycl9mcmFnKSBjb250YWlucyB0aGUgZnJhbWVzCisJICogdGhhdCBhcmUgYmVpbmcgdHJhbnNmZXJyZWQgKG93bmVkIGJ5IGRldmljZSkuICBUaGUgZHJpdmVyCisJICogaW5jcmVtZW50cyBkcml2ZXJfY3Vycl9mcmFnIHRvIGluZGljYXRlIHRoYXQgbW9yZSB0eCB3b3JrCisJICogbmVlZHMgdG8gYmUgZG9uZS4KKwkgKi8KKwl1MzIgaW5kZXhfbWdtdF9yeDsgICAgICAgICAgICAgIC8qIHJlYWwgaW5kZXggbWdtdCByeCBxdWV1ZSAqLworCXUzMiBpbmRleF9tZ210X3R4OyAgICAgICAgICAgICAgLyogcmVhZCBpbmRleCBtZ210IHR4IHF1ZXVlICovCisJdTMyIGZyZWVfZGF0YV9yeDsJLyogZnJlZSBwb2ludGVyIGRhdGEgcnggcXVldWUgKi8KKwl1MzIgZnJlZV9kYXRhX3R4OwkvKiBmcmVlIHBvaW50ZXIgZGF0YSB0eCBxdWV1ZSAqLworCXUzMiBkYXRhX2xvd190eF9mdWxsOwkvKiBmdWxsIGRldGVjdGVkIGZsYWcgKi8KKworCS8qIGZyYW1lIG1lbW9yeSBidWZmZXJzIGZvciB0aGUgZGV2aWNlIHF1ZXVlcyAqLworCXN0cnVjdCBpc2xwY2lfbWVtYnVmIG1nbXRfdHhbSVNMMzhYWF9DQl9NR01UX1FTSVpFXTsKKwlzdHJ1Y3QgaXNscGNpX21lbWJ1ZiBtZ210X3J4W0lTTDM4WFhfQ0JfTUdNVF9RU0laRV07CisJc3RydWN0IHNrX2J1ZmYgKmRhdGFfbG93X3R4W0lTTDM4WFhfQ0JfVFhfUVNJWkVdOworCXN0cnVjdCBza19idWZmICpkYXRhX2xvd19yeFtJU0wzOFhYX0NCX1JYX1FTSVpFXTsKKwlkbWFfYWRkcl90IHBjaV9tYXBfdHhfYWRkcmVzc1tJU0wzOFhYX0NCX1RYX1FTSVpFXTsKKwlkbWFfYWRkcl90IHBjaV9tYXBfcnhfYWRkcmVzc1tJU0wzOFhYX0NCX1JYX1FTSVpFXTsKKworCS8qIGRyaXZlciBuZXR3b3JrIGludGVyZmFjZSBtZW1iZXJzICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdGlzdGljczsKKworCS8qIHdhaXQgZm9yIGEgcmVzZXQgaW50ZXJydXB0ICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgcmVzZXRfZG9uZTsKKworCS8qIHVzZWQgYnkgaXNscGNpX21ndF90cmFuc2FjdGlvbiAqLworCXN0cnVjdCBzZW1hcGhvcmUgbWdtdF9zZW07IC8qIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gbWFpbGJveCBhbmQgd3F1ZXVlICovCisJc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKm1nbXRfcmVjZWl2ZWQ7CSAgLyogbWJveCBmb3IgaW5jb21pbmcgZnJhbWUgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBtZ210X3dxdWV1ZTsgICAgICAgICAgICAvKiB3YWl0cXVldWUgZm9yIG1ib3ggKi8KKworCS8qIHN0YXRlIG1hY2hpbmUgKi8KKwlpc2xwY2lfc3RhdGVfdCBzdGF0ZTsKKwlpbnQgc3RhdGVfb2ZmOwkJLyogZW51bWVyYXRpb24gb2Ygb2ZmLXN0YXRlLCBpZiAwIHRoZW4KKwkJCQkgKiB3ZSdyZSBub3QgaW4gYW55IG9mZi1zdGF0ZSAqLworCisJLyogV1BBIHN0dWZmICovCisJaW50IHdwYTsgLyogV1BBIG1vZGUgZW5hYmxlZCAqLworCXN0cnVjdCBsaXN0X2hlYWQgYnNzX3dwYV9saXN0OworCWludCBudW1fYnNzX3dwYTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHdwYV9zZW07CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfdGFzazsKKwlpbnQgcmVzZXRfdGFza19wZW5kaW5nOworfSBpc2xwY2lfcHJpdmF0ZTsKKworc3RhdGljIGlubGluZSBpc2xwY2lfc3RhdGVfdAoraXNscGNpX2dldF9zdGF0ZShpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwkvKiBsb2NrICovCisJcmV0dXJuIHByaXYtPnN0YXRlOworCS8qIHVubG9jayAqLworfQorCitpc2xwY2lfc3RhdGVfdCBpc2xwY2lfc2V0X3N0YXRlKGlzbHBjaV9wcml2YXRlICpwcml2LCBpc2xwY2lfc3RhdGVfdCBuZXdfc3RhdGUpOworCisjZGVmaW5lIElTTFBDSV9UWF9USU1FT1VUICAgICAgICAgICAgICAgKDIqSFopCisKK2lycXJldHVybl90IGlzbHBjaV9pbnRlcnJ1cHQoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOworCitpbnQgcHJpc201NF9wb3N0X3NldHVwKGlzbHBjaV9wcml2YXRlICosIGludCk7CitpbnQgaXNscGNpX3Jlc2V0KGlzbHBjaV9wcml2YXRlICosIGludCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraXNscGNpX3RyaWdnZXIoaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJaXNsMzh4eF90cmlnZ2VyX2RldmljZShpc2xwY2lfZ2V0X3N0YXRlKHByaXYpID09IFBSVl9TVEFURV9TTEVFUCwKKwkJCSAgICAgICBwcml2LT5kZXZpY2VfYmFzZSk7Cit9CisKK2ludCBpc2xwY2lfZnJlZV9tZW1vcnkoaXNscGNpX3ByaXZhdGUgKik7CitzdHJ1Y3QgbmV0X2RldmljZSAqaXNscGNpX3NldHVwKHN0cnVjdCBwY2lfZGV2ICopOworI2VuZGlmCQkJCS8qIF9JU0xQQ0lfREVWX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1MmU5OTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ldGguYwpAQCAtMCwwICsxLDUxOSBAQAorLyoKKyAqICAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLgorICogIENvcHlyaWdodCAoQykgMjAwNCBBdXJlbGllbiBBbGxlYXVtZSA8c2x0c0BmcmVlLmZyPgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisKKyNpbmNsdWRlICJwcmlzbWNvbXBhdC5oIgorI2luY2x1ZGUgImlzbF8zOHh4LmgiCisjaW5jbHVkZSAiaXNscGNpX2V0aC5oIgorI2luY2x1ZGUgImlzbHBjaV9tZ3QuaCIKKyNpbmNsdWRlICJvaWRfbWd0LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBOZXR3b3JrIEludGVyZmFjZSBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2lzbHBjaV9ldGhfY2xlYW51cF90cmFuc21pdChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwKKwkJCSAgICBpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKmNvbnRyb2xfYmxvY2spCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1MzIgaW5kZXg7CisKKwkvKiBjb21wYXJlIHRoZSBjb250cm9sIGJsb2NrIHJlYWQgcG9pbnRlciB3aXRoIHRoZSBmcmVlIHBvaW50ZXIgKi8KKwl3aGlsZSAocHJpdi0+ZnJlZV9kYXRhX3R4ICE9CisJICAgICAgIGxlMzJfdG9fY3B1KGNvbnRyb2xfYmxvY2stPgorCQkJICAgZGV2aWNlX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1RYX0RBVEFfTFFdKSkgeworCQkvKiByZWFkIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZnJhZ21lbnQgdG8gYmUgZnJlZWQgKi8KKwkJaW5kZXggPSBwcml2LT5mcmVlX2RhdGFfdHggJSBJU0wzOFhYX0NCX1RYX1FTSVpFOworCisJCS8qIGNoZWNrIGZvciBob2xlcyBpbiB0aGUgYXJyYXlzIGNhdXNlZCBieSBtdWx0aSBmcmFnbWVudCBmcmFtZXMgCisJCSAqIHNlYXJjaGluZyBmb3IgdGhlIGxhc3QgZnJhZ21lbnQgb2YgYSBmcmFtZSAqLworCQlpZiAocHJpdi0+cGNpX21hcF90eF9hZGRyZXNzW2luZGV4XSAhPSAoZG1hX2FkZHJfdCkgTlVMTCkgeworCQkJLyogZW50cnkgaXMgdGhlIGxhc3QgZnJhZ21lbnQgb2YgYSBmcmFtZQorCQkJICogZnJlZSB0aGUgc2tiIHN0cnVjdHVyZSBhbmQgdW5tYXAgcGNpIG1lbW9yeSAqLworCQkJc2tiID0gcHJpdi0+ZGF0YV9sb3dfdHhbaW5kZXhdOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJCURFQlVHKFNIT1dfVFJBQ0lORywKKwkJCSAgICAgICJjbGVhbnVwIHNrYiAlcCBza2ItPmRhdGEgJXAgc2tiLT5sZW4gJXUgdHJ1ZXNpemUgJXVcbiAiLAorCQkJICAgICAgc2tiLCBza2ItPmRhdGEsIHNrYi0+bGVuLCBza2ItPnRydWVzaXplKTsKKyNlbmRpZgorCisJCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsCisJCQkJCSBwcml2LT5wY2lfbWFwX3R4X2FkZHJlc3NbaW5kZXhdLAorCQkJCQkgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJCXNrYiA9IE5VTEw7CisJCX0KKwkJLyogaW5jcmVtZW50IHRoZSBmcmVlIGRhdGEgbG93IHF1ZXVlIHBvaW50ZXIgKi8KKwkJcHJpdi0+ZnJlZV9kYXRhX3R4Kys7CisJfQorfQorCitpbnQKK2lzbHBjaV9ldGhfdHJhbnNtaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKmNiID0gcHJpdi0+Y29udHJvbF9ibG9jazsKKwl1MzIgaW5kZXg7CisJZG1hX2FkZHJfdCBwY2lfbWFwX2FkZHJlc3M7CisJaW50IGZyYW1lX3NpemU7CisJaXNsMzh4eF9mcmFnbWVudCAqZnJhZ21lbnQ7CisJaW50IG9mZnNldDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiOworCWludCBuZXdza2Jfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciB3ZHNfbWFjWzZdOworCXUzMiBjdXJyX2ZyYWc7CisJaW50IGVyciA9IDA7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCURFQlVHKFNIT1dfRlVOQ1RJT05fQ0FMTFMsICJpc2xwY2lfZXRoX3RyYW5zbWl0IFxuIik7CisjZW5kaWYKKworCS8qIGxvY2sgdGhlIGRyaXZlciBjb2RlICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNsb2NrLCBmbGFncyk7CisKKwkvKiBkZXRlcm1pbmUgdGhlIGFtb3VudCBvZiBmcmFnbWVudHMgbmVlZGVkIHRvIHN0b3JlIHRoZSBmcmFtZSAqLworCisJZnJhbWVfc2l6ZSA9IHNrYi0+bGVuIDwgRVRIX1pMRU4gPyBFVEhfWkxFTiA6IHNrYi0+bGVuOworCWlmIChpbml0X3dkcykKKwkJZnJhbWVfc2l6ZSArPSA2OworCisJLyogY2hlY2sgd2hldGhlciB0aGUgZGVzdGluYXRpb24gcXVldWUgaGFzIGVub3VnaCBmcmFnbWVudHMgZm9yIHRoZSBmcmFtZSAqLworCWN1cnJfZnJhZyA9IGxlMzJfdG9fY3B1KGNiLT5kcml2ZXJfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfVFhfREFUQV9MUV0pOworCWlmICh1bmxpa2VseShjdXJyX2ZyYWcgLSBwcml2LT5mcmVlX2RhdGFfdHggPj0gSVNMMzhYWF9DQl9UWF9RU0laRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdHJhbnNtaXQgZGV2aWNlIHF1ZXVlIGZ1bGwgd2hlbiBhd2FrZVxuIiwKKwkJICAgICAgIG5kZXYtPm5hbWUpOworCQluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCisJCS8qIHRyaWdnZXIgdGhlIGRldmljZSAqLworCQlpc2wzOHh4X3czMl9mbHVzaChwcml2LT5kZXZpY2VfYmFzZSwgSVNMMzhYWF9ERVZfSU5UX1VQREFURSwKKwkJCQkgIElTTDM4WFhfREVWX0lOVF9SRUcpOworCQl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKKworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZHJvcF9mcmVlOworCX0KKwkvKiBDaGVjayBhbGlnbm1lbnQgYW5kIFdEUyBmcmFtZSBmb3JtYXR0aW5nLiBUaGUgc3RhcnQgb2YgdGhlIHBhY2tldCBzaG91bGQKKwkgKiBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiBJZiBXRFMgaXMgZW5hYmxlZCBhZGQgYW5vdGhlciA2IGJ5dGVzCisJICogYW5kIGFkZCBXRFMgYWRkcmVzcyBpbmZvcm1hdGlvbiAqLworCWlmIChsaWtlbHkoKChsb25nKSBza2ItPmRhdGEgJiAweDAzKSB8IGluaXRfd2RzKSkgeworCQkvKiBnZXQgdGhlIG51bWJlciBvZiBieXRlcyB0byBhZGQgYW5kIHJlLWFsbGlnbiAqLworCQlvZmZzZXQgPSAoNCAtIChsb25nKSBza2ItPmRhdGEpICYgMHgwMzsKKwkJb2Zmc2V0ICs9IGluaXRfd2RzID8gNiA6IDA7CisKKwkJLyogY2hlY2sgd2hldGhlciB0aGUgY3VycmVudCBza2IgY2FuIGJlIHVzZWQgICovCisJCWlmICghc2tiX2Nsb25lZChza2IpICYmIChza2JfdGFpbHJvb20oc2tiKSA+PSBvZmZzZXQpKSB7CisJCQl1bnNpZ25lZCBjaGFyICpzcmMgPSBza2ItPmRhdGE7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQkJREVCVUcoU0hPV19UUkFDSU5HLCAic2tiIG9mZnNldCAlaSB3ZHMgJWlcbiIsIG9mZnNldCwKKwkJCSAgICAgIGluaXRfd2RzKTsKKyNlbmRpZgorCisJCQkvKiBhbGlnbiB0aGUgYnVmZmVyIG9uIDQtYnl0ZSBib3VuZGFyeSAqLworCQkJc2tiX3Jlc2VydmUoc2tiLCAoNCAtIChsb25nKSBza2ItPmRhdGEpICYgMHgwMyk7CisJCQlpZiAoaW5pdF93ZHMpIHsKKwkJCQkvKiB3ZHMgcmVxdWlyZXMgYW4gYWRkaXRpb25hbCBhZGRyZXNzIGZpZWxkIG9mIDYgYnl0ZXMgKi8KKwkJCQlza2JfcHV0KHNrYiwgNik7CisjaWZkZWYgSVNMUENJX0VUSF9ERUJVRworCQkJCXByaW50aygiaXNscGNpX2V0aF90cmFuc21pdDp3ZHNfbWFjXG4iKTsKKyNlbmRpZgorCQkJCW1lbW1vdmUoc2tiLT5kYXRhICsgNiwgc3JjLCBza2ItPmxlbik7CisJCQkJbWVtY3B5KHNrYi0+ZGF0YSwgd2RzX21hYywgNik7CisJCQl9IGVsc2UgeworCQkJCW1lbW1vdmUoc2tiLT5kYXRhLCBzcmMsIHNrYi0+bGVuKTsKKwkJCX0KKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCQlERUJVRyhTSE9XX1RSQUNJTkcsICJtZW1tb3ZlICVwICVwICVpIFxuIiwgc2tiLT5kYXRhLAorCQkJICAgICAgc3JjLCBza2ItPmxlbik7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCW5ld3NrYiA9CisJCQkgICAgZGV2X2FsbG9jX3NrYihpbml0X3dkcyA/IHNrYi0+bGVuICsgNiA6IHNrYi0+bGVuKTsKKwkJCWlmICh1bmxpa2VseShuZXdza2IgPT0gTlVMTCkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW5ub3QgYWxsb2NhdGUgc2tiXG4iLAorCQkJCSAgICAgICBuZGV2LT5uYW1lKTsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCWdvdG8gZHJvcF9mcmVlOworCQkJfQorCQkJbmV3c2tiX29mZnNldCA9ICg0IC0gKGxvbmcpIG5ld3NrYi0+ZGF0YSkgJiAweDAzOworCisJCQkvKiBDaGVjayBpZiBuZXdza2ItPmRhdGEgaXMgYWxpZ25lZCAqLworCQkJaWYgKG5ld3NrYl9vZmZzZXQpCisJCQkJc2tiX3Jlc2VydmUobmV3c2tiLCBuZXdza2Jfb2Zmc2V0KTsKKworCQkJc2tiX3B1dChuZXdza2IsIGluaXRfd2RzID8gc2tiLT5sZW4gKyA2IDogc2tiLT5sZW4pOworCQkJaWYgKGluaXRfd2RzKSB7CisJCQkJbWVtY3B5KG5ld3NrYi0+ZGF0YSArIDYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkJCW1lbWNweShuZXdza2ItPmRhdGEsIHdkc19tYWMsIDYpOworI2lmZGVmIElTTFBDSV9FVEhfREVCVUcKKwkJCQlwcmludGsoImlzbHBjaV9ldGhfdHJhbnNtaXQ6d2RzX21hY1xuIik7CisjZW5kaWYKKwkJCX0gZWxzZQorCQkJCW1lbWNweShuZXdza2ItPmRhdGEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJCURFQlVHKFNIT1dfVFJBQ0lORywgIm1lbWNweSAlcCAlcCAlaSB3ZHMgJWlcbiIsCisJCQkgICAgICBuZXdza2ItPmRhdGEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIGluaXRfd2RzKTsKKyNlbmRpZgorCisJCQluZXdza2ItPmRldiA9IHNrYi0+ZGV2OworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJc2tiID0gbmV3c2tiOworCQl9CisJfQorCS8qIGRpc3BsYXkgdGhlIGJ1ZmZlciBjb250ZW50cyBmb3IgZGVidWdnaW5nICovCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX0JVRkZFUl9DT05URU5UUywgIlxudHggJXAgIiwgc2tiLT5kYXRhKTsKKwlkaXNwbGF5X2J1ZmZlcigoY2hhciAqKSBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKyNlbmRpZgorCisJLyogbWFwIHRoZSBza2IgYnVmZmVyIHRvIHBjaSBtZW1vcnkgZm9yIERNQSBvcGVyYXRpb24gKi8KKwlwY2lfbWFwX2FkZHJlc3MgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wZGV2LAorCQkJCQkgKHZvaWQgKikgc2tiLT5kYXRhLCBza2ItPmxlbiwKKwkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCWlmICh1bmxpa2VseShwY2lfbWFwX2FkZHJlc3MgPT0gMCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNhbm5vdCBtYXAgYnVmZmVyIHRvIFBDSVxuIiwKKwkJICAgICAgIG5kZXYtPm5hbWUpOworCisJCWVyciA9IC1FSU87CisJCWdvdG8gZHJvcF9mcmVlOworCX0KKwkvKiBQbGFjZSB0aGUgZnJhZ21lbnQgaW4gdGhlIGNvbnRyb2wgYmxvY2sgc3RydWN0dXJlLiAqLworCWluZGV4ID0gY3Vycl9mcmFnICUgSVNMMzhYWF9DQl9UWF9RU0laRTsKKwlmcmFnbWVudCA9ICZjYi0+dHhfZGF0YV9sb3dbaW5kZXhdOworCisJcHJpdi0+cGNpX21hcF90eF9hZGRyZXNzW2luZGV4XSA9IHBjaV9tYXBfYWRkcmVzczsKKwkvKiBzdG9yZSB0aGUgc2tiIGFkZHJlc3MgZm9yIGZ1dHVyZSBmcmVlaW5nICAqLworCXByaXYtPmRhdGFfbG93X3R4W2luZGV4XSA9IHNrYjsKKwkvKiBzZXQgdGhlIHByb3BlciBmcmFnbWVudCBzdGFydCBhZGRyZXNzIGFuZCBzaXplIGluZm9ybWF0aW9uICovCisJZnJhZ21lbnQtPnNpemUgPSBjcHVfdG9fbGUxNihmcmFtZV9zaXplKTsKKwlmcmFnbWVudC0+ZmxhZ3MgPSBjcHVfdG9fbGUxNigwKTsJLyogc2V0IHRvIDEgaWYgbW9yZSBmcmFnbWVudHMgKi8KKwlmcmFnbWVudC0+YWRkcmVzcyA9IGNwdV90b19sZTMyKHBjaV9tYXBfYWRkcmVzcyk7CisJY3Vycl9mcmFnKys7CisKKwkvKiBUaGUgZnJhZ21lbnQgYWRkcmVzcyBpbiB0aGUgY29udHJvbCBibG9jayBtdXN0IGhhdmUgYmVlbgorCSAqIHdyaXR0ZW4gYmVmb3JlIGFubm91bmNpbmcgdGhlIGZyYW1lIGJ1ZmZlciB0byBkZXZpY2UuICovCisJd21iKCk7CisJY2ItPmRyaXZlcl9jdXJyX2ZyYWdbSVNMMzhYWF9DQl9UWF9EQVRBX0xRXSA9IGNwdV90b19sZTMyKGN1cnJfZnJhZyk7CisKKwlpZiAoY3Vycl9mcmFnIC0gcHJpdi0+ZnJlZV9kYXRhX3R4ICsgSVNMMzhYWF9NSU5fUVRIUkVTSE9MRAorCSAgICA+IElTTDM4WFhfQ0JfVFhfUVNJWkUpIHsKKwkJLyogc3RvcCBzZW5kcyBmcm9tIHVwcGVyIGxheWVycyAqLworCQluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCisJCS8qIHNldCB0aGUgZnVsbCBmbGFnIGZvciB0aGUgdHJhbnNtaXNzaW9uIHF1ZXVlICovCisJCXByaXYtPmRhdGFfbG93X3R4X2Z1bGwgPSAxOworCX0KKworCS8qIHRyaWdnZXIgdGhlIGRldmljZSAqLworCWlzbHBjaV90cmlnZ2VyKHByaXYpOworCisJLyogdW5sb2NrIHRoZSBkcml2ZXIgY29kZSAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNsb2NrLCBmbGFncyk7CisKKwkvKiBzZXQgdGhlIHRyYW5zbWlzc2lvbiB0aW1lICovCisJbmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXByaXYtPnN0YXRpc3RpY3MudHhfcGFja2V0cysrOworCXByaXYtPnN0YXRpc3RpY3MudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwlyZXR1cm4gMDsKKworICAgICAgZHJvcF9mcmVlOgorCS8qIGZyZWUgdGhlIHNrYnVmIHN0cnVjdHVyZSBiZWZvcmUgYWJvcnRpbmcgKi8KKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisJc2tiID0gTlVMTDsKKworCXByaXYtPnN0YXRpc3RpY3MudHhfZHJvcHBlZCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNsb2NrLCBmbGFncyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lzbHBjaV9tb25pdG9yX3J4KGlzbHBjaV9wcml2YXRlICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqKnNrYikKK3sKKwkvKiBUaGUgY2FyZCByZXBvcnRzIGZ1bGwgODAyLjExIHBhY2tldHMgYnV0IHdpdGggYSAyMCBieXRlcworCSAqIGhlYWRlciBhbmQgd2l0aG91dCB0aGUgRkNTLiBCdXQgdGhlcmUgYSBpcyBhIGJpdCB0aGF0CisJICogaW5kaWNhdGVzIGlmIHRoZSBwYWNrZXQgaXMgY29ycnVwdGVkIDotKSAqLworCXN0cnVjdCByZm1vbl9oZWFkZXIgKmhkciA9IChzdHJ1Y3QgcmZtb25faGVhZGVyICopICgqc2tiKS0+ZGF0YTsKKwlpZiAoaGRyLT5mbGFncyAmIDB4MDEpCisJCS8qIFRoaXMgb25lIGlzIGJhZC4gRHJvcCBpdCAhICovCisJCXJldHVybiAtMTsKKwlpZiAocHJpdi0+bmRldi0+dHlwZSA9PSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNKSB7CisJCXN0cnVjdCBhdnNfODAyMTFfMV9oZWFkZXIgKmF2czsKKwkJLyogZXh0cmFjdCB0aGUgcmVsZXZhbnQgZGF0YSBmcm9tIHRoZSBoZWFkZXIgKi8KKwkJdTMyIGNsb2NrID0gbGUzMl90b19jcHUoaGRyLT5jbG9jayk7CisJCXU4IHJhdGUgPSBoZHItPnJhdGU7CisJCXUxNiBmcmVxID0gbGUxNl90b19jcHUoaGRyLT5mcmVxKTsKKwkJdTggcnNzaSA9IGhkci0+cnNzaTsKKworCQlza2JfcHVsbCgqc2tiLCBzaXplb2YgKHN0cnVjdCByZm1vbl9oZWFkZXIpKTsKKworCQlpZiAoc2tiX2hlYWRyb29tKCpza2IpIDwgc2l6ZW9mIChzdHJ1Y3QgYXZzXzgwMjExXzFfaGVhZGVyKSkgeworCQkJc3RydWN0IHNrX2J1ZmYgKm5ld3NrYiA9IHNrYl9jb3B5X2V4cGFuZCgqc2tiLAorCQkJCQkJCQkgc2l6ZW9mIChzdHJ1Y3QKKwkJCQkJCQkJCSBhdnNfODAyMTFfMV9oZWFkZXIpLAorCQkJCQkJCQkgMCwgR0ZQX0FUT01JQyk7CisJCQlpZiAobmV3c2tiKSB7CisJCQkJZGV2X2tmcmVlX3NrYl9pcnEoKnNrYik7CisJCQkJKnNrYiA9IG5ld3NrYjsKKwkJCX0gZWxzZQorCQkJCXJldHVybiAtMTsKKwkJCS8qIFRoaXMgYmVoYXZpb3IgaXMgbm90IHZlcnkgc3VidGlsZS4uLiAqLworCQl9CisKKwkJLyogbWFrZSByb29tIGZvciB0aGUgbmV3IGhlYWRlciBhbmQgZmlsbCBpdC4gKi8KKwkJYXZzID0KKwkJICAgIChzdHJ1Y3QgYXZzXzgwMjExXzFfaGVhZGVyICopIHNrYl9wdXNoKCpza2IsCisJCQkJCQkJICAgc2l6ZW9mIChzdHJ1Y3QKKwkJCQkJCQkJICAgYXZzXzgwMjExXzFfaGVhZGVyKSk7CisJCQorCQlhdnMtPnZlcnNpb24gPSBjcHVfdG9fYmUzMihQODAyMTFDQVBUVVJFX1ZFUlNJT04pOworCQlhdnMtPmxlbmd0aCA9IGNwdV90b19iZTMyKHNpemVvZiAoc3RydWN0IGF2c184MDIxMV8xX2hlYWRlcikpOworCQlhdnMtPm1hY3RpbWUgPSBjcHVfdG9fYmU2NChsZTY0X3RvX2NwdShjbG9jaykpOworCQlhdnMtPmhvc3R0aW1lID0gY3B1X3RvX2JlNjQoamlmZmllcyk7CisJCWF2cy0+cGh5dHlwZSA9IGNwdV90b19iZTMyKDYpOwkvKk9GRE06IDYgZm9yIChnKSwgOCBmb3IgKGEpICovCisJCWF2cy0+Y2hhbm5lbCA9IGNwdV90b19iZTMyKGNoYW5uZWxfb2ZfZnJlcShmcmVxKSk7CisJCWF2cy0+ZGF0YXJhdGUgPSBjcHVfdG9fYmUzMihyYXRlICogNSk7CisJCWF2cy0+YW50ZW5uYSA9IGNwdV90b19iZTMyKDApOwkvKnVua25vd24gKi8KKwkJYXZzLT5wcmlvcml0eSA9IGNwdV90b19iZTMyKDApOwkvKnVua25vd24gKi8KKwkJYXZzLT5zc2lfdHlwZSA9IGNwdV90b19iZTMyKDMpOwkvKjI6IGRCbSwgMzogcmF3IFJTU0kgKi8KKwkJYXZzLT5zc2lfc2lnbmFsID0gY3B1X3RvX2JlMzIocnNzaSAmIDB4N2YpOworCQlhdnMtPnNzaV9ub2lzZSA9IGNwdV90b19iZTMyKHByaXYtPmxvY2FsX2l3c3RhdGlzdGljcy5xdWFsLm5vaXNlKTsJLypiZXR0ZXIgdGhhbiAndW5kZWZpbmVkJywgSSBhc3N1bWUgKi8KKwkJYXZzLT5wcmVhbWJsZSA9IGNwdV90b19iZTMyKDApOwkvKnVua25vd24gKi8KKwkJYXZzLT5lbmNvZGluZyA9IGNwdV90b19iZTMyKDApOwkvKnVua25vd24gKi8KKwl9IGVsc2UKKwkJc2tiX3B1bGwoKnNrYiwgc2l6ZW9mIChzdHJ1Y3QgcmZtb25faGVhZGVyKSk7CisKKwkoKnNrYiktPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyXzIpOworCSgqc2tiKS0+bWFjLnJhdyA9ICgqc2tiKS0+ZGF0YTsKKwkoKnNrYiktPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKKworCXJldHVybiAwOworfQorCitpbnQKK2lzbHBjaV9ldGhfcmVjZWl2ZShpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHByaXYtPm5kZXY7CisJaXNsMzh4eF9jb250cm9sX2Jsb2NrICpjb250cm9sX2Jsb2NrID0gcHJpdi0+Y29udHJvbF9ibG9jazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUxNiBzaXplOworCXUzMiBpbmRleCwgb2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgKnNyYzsKKwlpbnQgZGlzY2FyZCA9IDA7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCURFQlVHKFNIT1dfRlVOQ1RJT05fQ0FMTFMsICJpc2xwY2lfZXRoX3JlY2VpdmUgXG4iKTsKKyNlbmRpZgorCisJLyogdGhlIGRldmljZSBoYXMgd3JpdHRlbiBhbiBFdGhlcm5ldCBmcmFtZSBpbiB0aGUgZGF0YSBhcmVhCisJICogb2YgdGhlIHNrX2J1ZmYgd2l0aG91dCB1cGRhdGluZyB0aGUgc3RydWN0dXJlLCBkbyBpdCBub3cgKi8KKwlpbmRleCA9IHByaXYtPmZyZWVfZGF0YV9yeCAlIElTTDM4WFhfQ0JfUlhfUVNJWkU7CisJc2l6ZSA9IGxlMTZfdG9fY3B1KGNvbnRyb2xfYmxvY2stPnJ4X2RhdGFfbG93W2luZGV4XS5zaXplKTsKKwlza2IgPSBwcml2LT5kYXRhX2xvd19yeFtpbmRleF07CisJb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nKQorCQkgIGxlMzJfdG9fY3B1KGNvbnRyb2xfYmxvY2stPnJ4X2RhdGFfbG93W2luZGV4XS5hZGRyZXNzKSAtCisJCSAgKHVuc2lnbmVkIGxvbmcpIHNrYi0+ZGF0YSkgJiAzOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX1RSQUNJTkcsCisJICAgICAgImZycS0+YWRkciAleCBza2ItPmRhdGEgJXAgc2tiLT5sZW4gJXUgb2Zmc2V0ICV1IHRydWVzaXplICV1XG4gIiwKKwkgICAgICBjb250cm9sX2Jsb2NrLT5yeF9kYXRhX2xvd1twcml2LT5mcmVlX2RhdGFfcnhdLmFkZHJlc3MsIHNrYi0+ZGF0YSwKKwkgICAgICBza2ItPmxlbiwgb2Zmc2V0LCBza2ItPnRydWVzaXplKTsKKyNlbmRpZgorCisJLyogZGVsZXRlIHRoZSBzdHJlYW1pbmcgRE1BIG1hcHBpbmcgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIHNrYiAqLworCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwKKwkJCSBwcml2LT5wY2lfbWFwX3J4X2FkZHJlc3NbaW5kZXhdLAorCQkJIE1BWF9GUkFHTUVOVF9TSVpFX1JYICsgMiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCS8qIHVwZGF0ZSB0aGUgc2tiIHN0cnVjdHVyZSBhbmQgYWxsaWduIHRoZSBidWZmZXIgKi8KKwlza2JfcHV0KHNrYiwgc2l6ZSk7CisJaWYgKG9mZnNldCkgeworCQkvKiBzaGlmdCB0aGUgYnVmZmVyIGFsbG9jYXRpb24gb2Zmc2V0IGJ5dGVzIHRvIGdldCB0aGUgcmlnaHQgZnJhbWUgKi8KKwkJc2tiX3B1bGwoc2tiLCAyKTsKKwkJc2tiX3B1dChza2IsIDIpOworCX0KKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCS8qIGRpc3BsYXkgdGhlIGJ1ZmZlciBjb250ZW50cyBmb3IgZGVidWdnaW5nICovCisJREVCVUcoU0hPV19CVUZGRVJfQ09OVEVOVFMsICJcbnJ4ICVwICIsIHNrYi0+ZGF0YSk7CisJZGlzcGxheV9idWZmZXIoKGNoYXIgKikgc2tiLT5kYXRhLCBza2ItPmxlbik7CisjZW5kaWYKKworCS8qIGNoZWNrIHdoZXRoZXIgV0RTIGlzIGVuYWJsZWQgYW5kIHdoZXRoZXIgdGhlIGRhdGEgZnJhbWUgaXMgYSBXRFMgZnJhbWUgKi8KKworCWlmIChpbml0X3dkcykgeworCQkvKiBXRFMgZW5hYmxlZCwgY2hlY2sgZm9yIHRoZSB3ZHMgYWRkcmVzcyBvbiB0aGUgZmlyc3QgNiBieXRlcyBvZiB0aGUgYnVmZmVyICovCisJCXNyYyA9IHNrYi0+ZGF0YSArIDY7CisJCW1lbW1vdmUoc2tiLT5kYXRhLCBzcmMsIHNrYi0+bGVuIC0gNik7CisJCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSA2KTsKKwl9CisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX1RSQUNJTkcsICJGcmFnbWVudCBzaXplICVpIGluIHNrYiBhdCAlcFxuIiwgc2l6ZSwgc2tiKTsKKwlERUJVRyhTSE9XX1RSQUNJTkcsICJTa2IgZGF0YSBhdCAlcCwgbGVuZ3RoICVpXG4iLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKworCS8qIGRpc3BsYXkgdGhlIGJ1ZmZlciBjb250ZW50cyBmb3IgZGVidWdnaW5nICovCisJREVCVUcoU0hPV19CVUZGRVJfQ09OVEVOVFMsICJcbnJ4ICVwICIsIHNrYi0+ZGF0YSk7CisJZGlzcGxheV9idWZmZXIoKGNoYXIgKikgc2tiLT5kYXRhLCBza2ItPmxlbik7CisjZW5kaWYKKworCS8qIGRvIHNvbWUgYWRkaXRpb25hbCBza19idWZmIGFuZCBuZXR3b3JrIGxheWVyIHBhcmFtZXRlcnMgKi8KKwlza2ItPmRldiA9IG5kZXY7CisKKwkvKiB0YWtlIGNhcmUgb2YgbW9uaXRvciBtb2RlIGFuZCBzcHkgbW9uaXRvcmluZy4gKi8KKwlpZiAodW5saWtlbHkocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpKQorCQlkaXNjYXJkID0gaXNscGNpX21vbml0b3JfcngocHJpdiwgJnNrYik7CisJZWxzZSB7CisJCWlmICh1bmxpa2VseShza2ItPmRhdGFbMiAqIEVUSF9BTEVOXSA9PSAwKSkgeworCQkJLyogVGhlIHBhY2tldCBoYXMgYSByeF9hbm5leC4gUmVhZCBpdCBmb3Igc3B5IG1vbml0b3JpbmcsIFRoZW4KKwkJCSAqIHJlbW92ZSBpdCwgd2hpbGUga2VlcGluZyB0aGUgMiBsZWFkaW5nIE1BQyBhZGRyLgorCQkJICovCisJCQlzdHJ1Y3QgaXdfcXVhbGl0eSB3c3RhdHM7CisJCQlzdHJ1Y3QgcnhfYW5uZXhfaGVhZGVyICphbm5leCA9CisJCQkgICAgKHN0cnVjdCByeF9hbm5leF9oZWFkZXIgKikgc2tiLT5kYXRhOworCQkJd3N0YXRzLmxldmVsID0gYW5uZXgtPnJmbW9uLnJzc2k7CisJCQkvKiBUaGUgbm9pc2UgdmFsdWUgY2FuIGJlIGEgYml0IG91dGRhdGVkIGlmIG5vYm9keSdzIAorCQkJICogcmVhZGluZyB3aXJlbGVzcyBzdGF0cy4uLiAqLworCQkJd3N0YXRzLm5vaXNlID0gcHJpdi0+bG9jYWxfaXdzdGF0aXN0aWNzLnF1YWwubm9pc2U7CisJCQl3c3RhdHMucXVhbCA9IHdzdGF0cy5sZXZlbCAtIHdzdGF0cy5ub2lzZTsKKwkJCXdzdGF0cy51cGRhdGVkID0gMHgwNzsKKwkJCS8qIFVwZGF0ZSBzcHkgcmVjb3JkcyAqLworCQkJd2lyZWxlc3Nfc3B5X3VwZGF0ZShuZGV2LCBhbm5leC0+YWRkcjIsICZ3c3RhdHMpOworCisJCQltZW1jcHkoc2tiLT5kYXRhICsgc2l6ZW9mIChzdHJ1Y3QgcmZtb25faGVhZGVyKSwKKwkJCSAgICAgICBza2ItPmRhdGEsIDIgKiBFVEhfQUxFTik7CisJCQlza2JfcHVsbChza2IsIHNpemVvZiAoc3RydWN0IHJmbW9uX2hlYWRlcikpOworCQl9CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5kZXYpOworCX0KKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJcHJpdi0+c3RhdGlzdGljcy5yeF9wYWNrZXRzKys7CisJcHJpdi0+c3RhdGlzdGljcy5yeF9ieXRlcyArPSBzaXplOworCisJLyogZGVsaXZlciB0aGUgc2tiIHRvIHRoZSBuZXR3b3JrIGxheWVyICovCisjaWZkZWYgSVNMUENJX0VUSF9ERUJVRworCXByaW50aworCSAgICAoImlzbHBjaV9ldGhfcmVjZWl2ZTpuZXRpZl9yeCAlMi4yWCAlMi4yWCAlMi4yWCAlMi4yWCAlMi4yWCAlMi4yWFxuIiwKKwkgICAgIHNrYi0+ZGF0YVswXSwgc2tiLT5kYXRhWzFdLCBza2ItPmRhdGFbMl0sIHNrYi0+ZGF0YVszXSwKKwkgICAgIHNrYi0+ZGF0YVs0XSwgc2tiLT5kYXRhWzVdKTsKKyNlbmRpZgorCWlmICh1bmxpa2VseShkaXNjYXJkKSkgeworCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQlza2IgPSBOVUxMOworCX0gZWxzZQorCQluZXRpZl9yeChza2IpOworCisJLyogaW5jcmVtZW50IHRoZSByZWFkIGluZGV4IGZvciB0aGUgcnggZGF0YSBsb3cgcXVldWUgKi8KKwlwcml2LT5mcmVlX2RhdGFfcngrKzsKKworCS8qIGFkZCBvbmUgb3IgbW9yZSBza19idWZmIHN0cnVjdHVyZXMgKi8KKwl3aGlsZSAoaW5kZXggPQorCSAgICAgICBsZTMyX3RvX2NwdShjb250cm9sX2Jsb2NrLT4KKwkJCSAgIGRyaXZlcl9jdXJyX2ZyYWdbSVNMMzhYWF9DQl9SWF9EQVRBX0xRXSksCisJICAgICAgIGluZGV4IC0gcHJpdi0+ZnJlZV9kYXRhX3J4IDwgSVNMMzhYWF9DQl9SWF9RU0laRSkgeworCQkvKiBhbGxvY2F0ZSBhbiBza19idWZmIGZvciByZWNlaXZlZCBkYXRhIGZyYW1lcyBzdG9yYWdlCisJCSAqIGluY2x1ZGUgYW55IHJlcXVpcmVkIGFsbGlnbm1lbnQgb3BlcmF0aW9ucyAqLworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKE1BWF9GUkFHTUVOVF9TSVpFX1JYICsgMik7CisJCWlmICh1bmxpa2VseShza2IgPT0gTlVMTCkpIHsKKwkJCS8qIGVycm9yIGFsbG9jYXRpbmcgYW4gc2tfYnVmZiBzdHJ1Y3R1cmUgZWxlbWVudHMgKi8KKwkJCURFQlVHKFNIT1dfRVJST1JfTUVTU0FHRVMsICJFcnJvciBhbGxvY2F0aW5nIHNrYiBcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJc2tiX3Jlc2VydmUoc2tiLCAoNCAtIChsb25nKSBza2ItPmRhdGEpICYgMHgwMyk7CisJCS8qIHN0b3JlIHRoZSBuZXcgc2tiIHN0cnVjdHVyZSBwb2ludGVyICovCisJCWluZGV4ID0gaW5kZXggJSBJU0wzOFhYX0NCX1JYX1FTSVpFOworCQlwcml2LT5kYXRhX2xvd19yeFtpbmRleF0gPSBza2I7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQlERUJVRyhTSE9XX1RSQUNJTkcsCisJCSAgICAgICJuZXcgYWxsb2Mgc2tiICVwIHNrYi0+ZGF0YSAlcCBza2ItPmxlbiAldSBpbmRleCAldSB0cnVlc2l6ZSAldVxuICIsCisJCSAgICAgIHNrYiwgc2tiLT5kYXRhLCBza2ItPmxlbiwgaW5kZXgsIHNrYi0+dHJ1ZXNpemUpOworI2VuZGlmCisKKwkJLyogc2V0IHRoZSBzdHJlYW1pbmcgRE1BIG1hcHBpbmcgZm9yIHByb3BlciBQQ0kgYnVzIG9wZXJhdGlvbiAqLworCQlwcml2LT5wY2lfbWFwX3J4X2FkZHJlc3NbaW5kZXhdID0KKwkJICAgIHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsICh2b2lkICopIHNrYi0+ZGF0YSwKKwkJCQkgICBNQVhfRlJBR01FTlRfU0laRV9SWCArIDIsCisJCQkJICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJaWYgKHVubGlrZWx5KHByaXYtPnBjaV9tYXBfcnhfYWRkcmVzc1tpbmRleF0gPT0gKGRtYV9hZGRyX3QpIE5VTEwpKSB7CisJCQkvKiBlcnJvciBtYXBwaW5nIHRoZSBidWZmZXIgdG8gZGV2aWNlIGFjY2Vzc2FibGUgbWVtb3J5IGFkZHJlc3MgKi8KKwkJCURFQlVHKFNIT1dfRVJST1JfTUVTU0FHRVMsCisJCQkgICAgICAiRXJyb3IgbWFwcGluZyBETUEgYWRkcmVzc1xuIik7CisKKwkJCS8qIGZyZWUgdGhlIHNrYnVmIHN0cnVjdHVyZSBiZWZvcmUgYWJvcnRpbmcgKi8KKwkJCWRldl9rZnJlZV9za2JfaXJxKChzdHJ1Y3Qgc2tfYnVmZiAqKSBza2IpOworCQkJc2tiID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCS8qIHVwZGF0ZSB0aGUgZnJhZ21lbnQgYWRkcmVzcyAqLworCQljb250cm9sX2Jsb2NrLT5yeF9kYXRhX2xvd1tpbmRleF0uYWRkcmVzcyA9IGNwdV90b19sZTMyKCh1MzIpCisJCQkJCQkJCQlwcml2LT4KKwkJCQkJCQkJCXBjaV9tYXBfcnhfYWRkcmVzcworCQkJCQkJCQkJW2luZGV4XSk7CisJCXdtYigpOworCisJCS8qIGluY3JlbWVudCB0aGUgZHJpdmVyIHJlYWQgcG9pbnRlciAqLworCQlhZGRfbGUzMnAoKHUzMiAqKSAmY29udHJvbF9ibG9jay0+CisJCQkgIGRyaXZlcl9jdXJyX2ZyYWdbSVNMMzhYWF9DQl9SWF9EQVRBX0xRXSwgMSk7CisJfQorCisJLyogdHJpZ2dlciB0aGUgZGV2aWNlICovCisJaXNscGNpX3RyaWdnZXIocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAoraXNscGNpX2RvX3Jlc2V0X2FuZF93YWtlKHZvaWQgKmRhdGEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSAoaXNscGNpX3ByaXZhdGUgKikgZGF0YTsKKwlpc2xwY2lfcmVzZXQocHJpdiwgMSk7CisJbmV0aWZfd2FrZV9xdWV1ZShwcml2LT5uZGV2KTsKKwlwcml2LT5yZXNldF90YXNrX3BlbmRpbmcgPSAwOworfQorCit2b2lkCitpc2xwY2lfZXRoX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdGlzdGljcyA9ICZwcml2LT5zdGF0aXN0aWNzOworCisJLyogaW5jcmVtZW50IHRoZSB0cmFuc21pdCBlcnJvciBjb3VudGVyICovCisJc3RhdGlzdGljcy0+dHhfZXJyb3JzKys7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdHhfdGltZW91dCIsIG5kZXYtPm5hbWUpOworCWlmICghcHJpdi0+cmVzZXRfdGFza19wZW5kaW5nKSB7CisJCXByaXYtPnJlc2V0X3Rhc2tfcGVuZGluZyA9IDE7CisJCXByaW50aygiLCBzY2hlZHVsaW5nIGEgcmVzZXQiKTsKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKwkJc2NoZWR1bGVfd29yaygmcHJpdi0+cmVzZXRfdGFzayk7CisJfQorCXByaW50aygiXG4iKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM5ZDdhNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiAgCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEludGVyc2lsIEFtZXJpY2FzIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfSVNMUENJX0VUSF9ICisjZGVmaW5lIF9JU0xQQ0lfRVRIX0gKKworI2luY2x1ZGUgImlzbF8zOHh4LmgiCisjaW5jbHVkZSAiaXNscGNpX2Rldi5oIgorCitzdHJ1Y3QgcmZtb25faGVhZGVyIHsKKwl1MTYgdW5rMDsJCS8qID0gMHgwMDAwICovCisJdTE2IGxlbmd0aDsJCS8qID0gMHgxNDAwICovCisJdTMyIGNsb2NrOwkJLyogMU1IeiBjbG9jayAqLworCXU4IGZsYWdzOworCXU4IHVuazE7CisJdTggcmF0ZTsKKwl1OCB1bmsyOworCXUxNiBmcmVxOworCXUxNiB1bmszOworCXU4IHJzc2k7CisJdTggcGFkZGluZ1szXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgcnhfYW5uZXhfaGVhZGVyIHsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXN0cnVjdCByZm1vbl9oZWFkZXIgcmZtb247Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogd2xhbi1uZyAoYW5kIGhvcGVmdWxseSBvdGhlcnMpIEFWUyBoZWFkZXIsIHZlcnNpb24gb25lLiAgRmllbGRzIGluCisgKiBuZXR3b3JrIGJ5dGUgb3JkZXIuICovCisjZGVmaW5lIFA4MDIxMUNBUFRVUkVfVkVSU0lPTiAweDgwMjExMDAxCisKK3N0cnVjdCBhdnNfODAyMTFfMV9oZWFkZXIgeworCXVpbnQzMl90IHZlcnNpb247CisJdWludDMyX3QgbGVuZ3RoOworCXVpbnQ2NF90IG1hY3RpbWU7CisJdWludDY0X3QgaG9zdHRpbWU7CisJdWludDMyX3QgcGh5dHlwZTsKKwl1aW50MzJfdCBjaGFubmVsOworCXVpbnQzMl90IGRhdGFyYXRlOworCXVpbnQzMl90IGFudGVubmE7CisJdWludDMyX3QgcHJpb3JpdHk7CisJdWludDMyX3Qgc3NpX3R5cGU7CisJaW50MzJfdCBzc2lfc2lnbmFsOworCWludDMyX3Qgc3NpX25vaXNlOworCXVpbnQzMl90IHByZWFtYmxlOworCXVpbnQzMl90IGVuY29kaW5nOworfTsKKwordm9pZCBpc2xwY2lfZXRoX2NsZWFudXBfdHJhbnNtaXQoaXNscGNpX3ByaXZhdGUgKiwgaXNsMzh4eF9jb250cm9sX2Jsb2NrICopOworaW50IGlzbHBjaV9ldGhfdHJhbnNtaXQoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CitpbnQgaXNscGNpX2V0aF9yZWNlaXZlKGlzbHBjaV9wcml2YXRlICopOwordm9pZCBpc2xwY2lfZXRoX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKik7Cit2b2lkIGlzbHBjaV9kb19yZXNldF9hbmRfd2FrZSh2b2lkICpkYXRhKTsKKworI2VuZGlmCQkJCS8qIF9JU0xfR0VOX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2hvdHBsdWcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2hvdHBsdWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmQ0ZDIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfaG90cGx1Zy5jCkBAIC0wLDAgKzEsMzM5IEBACisvKgorICogIAorICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBnbnUub3JnPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPiAvKiBGb3IgX19pbml0LCBfX2V4aXQgKi8KKworI2luY2x1ZGUgInByaXNtY29tcGF0LmgiCisjaW5jbHVkZSAiaXNscGNpX2Rldi5oIgorI2luY2x1ZGUgImlzbHBjaV9tZ3QuaCIJCS8qIGZvciBwY19kZWJ1ZyAqLworI2luY2x1ZGUgImlzbF9vaWQuaCIKKworI2RlZmluZSBEUlZfTkFNRQkicHJpc201NCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMiIKKworTU9EVUxFX0FVVEhPUigiW0ludGVyc2lsXSBSLkJhc3RpbmdzIGFuZCBXLlRlcm1vcnNodWl6ZW4sIFRoZSBwcmlzbTU0Lm9yZyBEZXZlbG9wbWVudCBUZWFtIDxwcmlzbTU0LWRldmVsQHByaXNtNTQub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUaGUgUHJpc201NCA4MDIuMTEgV2lyZWxlc3MgTEFOIGFkYXB0ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludAlpbml0X3BjaXRtID0gMDsKK21vZHVsZV9wYXJhbShpbml0X3BjaXRtLCBpbnQsIDApOworCisvKiBJbiB0aGlzIG9yZGVyOiB2ZW5kb3IsIGRldmljZSwgc3VidmVuZG9yLCBzdWJkZXZpY2UsIGNsYXNzLCBjbGFzc19tYXNrLAorICogZHJpdmVyX2RhdGEgCisgKiBJZiB5b3UgaGF2ZSBhbiB1cGRhdGUgZm9yIHRoaXMgcGxlYXNlIGNvbnRhY3QgcHJpc201NC1kZXZlbEBwcmlzbTU0Lm9yZyAKKyAqIFRoZSBsYXRlc3QgbGlzdCBjYW4gYmUgZm91bmQgYXQgaHR0cDovL3ByaXNtNTQub3JnL3N1cHBvcnRlZF9jYXJkcy5waHAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwcmlzbTU0X2lkX3RibFtdID0geworCS8qIEludGVyc2lsIFBSSVNNIER1ZXR0ZS9QcmlzbSBHVCBXaXJlbGVzcyBMQU4gYWRhcHRlciAqLworCXsKKwkgMHgxMjYwLCAweDM4OTAsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJIDAsIDAsIDAKKwl9LAorCisJLyogM0NPTSAzQ1JXRTE1NEc3MiBXaXJlbGVzcyBMQU4gYWRhcHRlciAqLworCXsKKwkgMHgxMGI3LCAweDYwMDEsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCisJIDAsIDAsIDAKKwl9LAorCisJLyogSW50ZXJzaWwgUFJJU00gSW5kaWdvIFdpcmVsZXNzIExBTiBhZGFwdGVyICovCisJeworCSAweDEyNjAsIDB4Mzg3NywKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKKwkgMCwgMCwgMAorCX0sCisKKwkvKiBJbnRlcnNpbCBQUklTTSBKYXZlbGluL1hib3cgV2lyZWxlc3MgTEFOIGFkYXB0ZXIgKi8KKwl7CisJIDB4MTI2MCwgMHgzODg2LAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAorCSAwLCAwLCAwCisJfSwKKworCS8qIEVuZCBvZiBsaXN0ICovCisJezAsMCwwLDAsMCwwLDB9Cit9OworCisvKiByZWdpc3RlciB0aGUgZGV2aWNlIHdpdGggdGhlIEhvdHBsdWcgZmFjaWxpdGllcyBvZiB0aGUga2VybmVsICovCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcHJpc201NF9pZF90YmwpOworCitzdGF0aWMgaW50IHByaXNtNTRfcHJvYmUoc3RydWN0IHBjaV9kZXYgKiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKik7CitzdGF0aWMgdm9pZCBwcmlzbTU0X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqKTsKK3N0YXRpYyBpbnQgcHJpc201NF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICosIHUzMiBzdGF0ZSk7CitzdGF0aWMgaW50IHByaXNtNTRfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICopOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcHJpc201NF9kcml2ZXIgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUgPSBwcmlzbTU0X2lkX3RibCwKKwkucHJvYmUgPSBwcmlzbTU0X3Byb2JlLAorCS5yZW1vdmUgPSBwcmlzbTU0X3JlbW92ZSwKKwkuc3VzcGVuZCA9IHByaXNtNTRfc3VzcGVuZCwKKwkucmVzdW1lID0gcHJpc201NF9yZXN1bWUsCisJLyogLmVuYWJsZV93YWtlIDsgd2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIHlldCAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIE1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50CitwcmlzbTU0X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJdTggbGF0ZW5jeV90bXI7CisJdTMyIG1lbV9hZGRyOworCWlzbHBjaV9wcml2YXRlICpwcml2OworCWludCBydmFsdWU7CisKKwkvKiBFbmFibGUgdGhlIHBjaSBkZXZpY2UgKi8KKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcGNpX2VuYWJsZV9kZXZpY2UoKSBmYWlsZWQuXG4iLCBEUlZfTkFNRSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIGNoZWNrIHdoZXRoZXIgdGhlIGxhdGVuY3kgdGltZXIgaXMgc2V0IGNvcnJlY3RseSAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAmbGF0ZW5jeV90bXIpOworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJREVCVUcoU0hPV19UUkFDSU5HLCAibGF0ZW5jeSB0aW1lcjogJXhcbiIsIGxhdGVuY3lfdG1yKTsKKyNlbmRpZgorCWlmIChsYXRlbmN5X3RtciA8IFBDSURFVklDRV9MQVRFTkNZX1RJTUVSX01JTikgeworCQkvKiBzZXQgdGhlIGxhdGVuY3kgdGltZXIgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLAorCQkJCSAgICAgIFBDSURFVklDRV9MQVRFTkNZX1RJTUVSX1ZBTCk7CisJfQorCisJLyogZW5hYmxlIFBDSSBETUEgKi8KKwlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiAzMi1iaXQgUENJIERNQSBub3Qgc3VwcG9ydGVkIiwgRFJWX05BTUUpOworCQlnb3RvIGRvX3BjaV9kaXNhYmxlX2RldmljZTsKKyAgICAgICAgfQorCisJLyogMHg0MCBpcyB0aGUgcHJvZ3JhbW1hYmxlIHRpbWVyIHRvIGNvbmZpZ3VyZSB0aGUgcmVzcG9uc2UgdGltZW91dCAoVFJEWV9USU1FT1VUKQorCSAqIDB4NDEgaXMgdGhlIHByb2dyYW1tYWJsZSB0aW1lciB0byBjb25maWd1cmUgdGhlIHJldHJ5IHRpbWVvdXQgKFJFVFJZX1RJTUVPVVQpCisJICogCVRoZSBSRVRSWV9USU1FT1VUIGlzIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgcmV0cmllcyB0aGF0IHRoZSBjb3JlLCBhcyBhCisJICogCU1hc3Rlciwgd2lsbCBwZXJmb3JtIGJlZm9yZSBhYmFuZG9uaW5nIGEgY3ljbGUuIFRoZSBkZWZhdWx0IHZhbHVlIGZvcgorCSAqIAlSRVRSWV9USU1FT1VUIGlzIDB4ODAsIHdoaWNoIGZhciBleGNlZWRzIHRoZSBQQ0kgMi4xIHJlcXVpcmVtZW50IGZvciBuZXcKKwkgKiAJZGV2aWNlcy4gQSB3cml0ZSBvZiB6ZXJvIHRvIHRoZSBSRVRSWV9USU1FT1VUIHJlZ2lzdGVyIGRpc2FibGVzIHRoaXMKKwkgKiAJZnVuY3Rpb24gdG8gYWxsb3cgdXNlIHdpdGggYW55IG5vbi1jb21wbGlhbnQgbGVnYWN5IGRldmljZXMgdGhhdCBtYXkKKwkgKiAJZXhlY3V0ZSBtb3JlIHJldHJpZXMuCisJICoKKwkgKiAJV3JpdGluZyB6ZXJvIHRvIGJvdGggdGhlc2UgdHdvIHJlZ2lzdGVycyB3aWxsIGRpc2FibGUgYm90aCB0aW1lb3V0cyBhbmQKKwkgKiAJKmNhbiogc29sdmUgcHJvYmxlbXMgY2F1c2VkIGJ5IGRldmljZXMgdGhhdCBhcmUgc2xvdyB0byByZXNwb25kLgorCSAqCU1ha2UgdGhpcyBjb25maWd1cmFibGUgLSBNU1cKKwkgKi8KKwlpZiAoIGluaXRfcGNpdG0gPj0gMCApIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDAsICh1OClpbml0X3BjaXRtKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDEsICh1OClpbml0X3BjaXRtKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJQQ0kgVFJEWS9SRVRSWSB1bmNoYW5nZWRcbiIpOworCX0KKworCS8qIHJlcXVlc3QgdGhlIHBjaSBkZXZpY2UgSS9PIHJlZ2lvbnMgKi8KKwlydmFsdWUgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAocnZhbHVlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHBjaV9yZXF1ZXN0X3JlZ2lvbnMgZmFpbHVyZSAocmM9JWQpXG4iLAorCQkgICAgICAgRFJWX05BTUUsIHJ2YWx1ZSk7CisJCWdvdG8gZG9fcGNpX2Rpc2FibGVfZGV2aWNlOworCX0KKworCS8qIGNoZWNrIGlmIHRoZSBtZW1vcnkgd2luZG93IGlzIGluZGVlZCBzZXQgKi8KKwlydmFsdWUgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX0JBU0VfQUREUkVTU18wLCAmbWVtX2FkZHIpOworCWlmIChydmFsdWUgfHwgIW1lbV9hZGRyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFBDSSBkZXZpY2UgbWVtb3J5IHJlZ2lvbiBub3QgY29uZmlndXJlZDsgZml4IHlvdXIgQklPUyBvciBDYXJkQnVzIGJyaWRnZS9kcml2ZXJzXG4iLAorCQkgICAgICAgRFJWX05BTUUpOworCQlnb3RvIGRvX3BjaV9yZWxlYXNlX3JlZ2lvbnM7CisJfQorCisJLyogZW5hYmxlIFBDSSBidXMtbWFzdGVyaW5nICovCisJREVCVUcoU0hPV19UUkFDSU5HLCAiJXM6IHBjaV9zZXRfbWFzdGVyKHBkZXYpXG4iLCBEUlZfTkFNRSk7CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwkvKiBlbmFibGUgTVdJICovCisJcGNpX3NldF9td2kocGRldik7CisKKwkvKiBzZXR1cCB0aGUgbmV0d29yayBkZXZpY2UgaW50ZXJmYWNlIGFuZCBpdHMgc3RydWN0dXJlICovCisJaWYgKCEobmRldiA9IGlzbHBjaV9zZXR1cChwZGV2KSkpIHsKKwkJLyogZXJyb3IgY29uZmlndXJpbmcgdGhlIGRyaXZlciBhcyBhIG5ldHdvcmsgZGV2aWNlICovCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBjb25maWd1cmUgbmV0d29yayBkZXZpY2VcbiIsCisJCSAgICAgICBEUlZfTkFNRSk7CisJCWdvdG8gZG9fcGNpX3JlbGVhc2VfcmVnaW9uczsKKwl9CisKKwlwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaXNscGNpX3NldF9zdGF0ZShwcml2LCBQUlZfU1RBVEVfUFJFQk9PVCk7IC8qIHdlIGFyZSBhdHRlbXB0aW5nIHRvIGJvb3QgKi8KKworCS8qIGNhcmQgaXMgaW4gdW5rbm93biBzdGF0ZSB5ZXQsIG1pZ2h0IGhhdmUgc29tZSBpbnRlcnJ1cHRzIHBlbmRpbmcgKi8KKwlpc2wzOHh4X2Rpc2FibGVfaW50ZXJydXB0cyhwcml2LT5kZXZpY2VfYmFzZSk7CisKKwkvKiByZXF1ZXN0IGZvciB0aGUgaW50ZXJydXB0IGJlZm9yZSB1cGxvYWRpbmcgdGhlIGZpcm13YXJlICovCisJcnZhbHVlID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCAmaXNscGNpX2ludGVycnVwdCwKKwkJCSAgICAgU0FfU0hJUlEsIG5kZXYtPm5hbWUsIHByaXYpOworCisJaWYgKHJ2YWx1ZSkgeworCQkvKiBlcnJvciwgY291bGQgbm90IGhvb2sgdGhlIGhhbmRsZXIgdG8gdGhlIGlycSAqLworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZCBub3QgaW5zdGFsbCBJUlEgaGFuZGxlclxuIiwKKwkJICAgICAgIG5kZXYtPm5hbWUpOworCQlnb3RvIGRvX3VucmVnaXN0ZXJfbmV0ZGV2OworCX0KKworCS8qIGZpcm13YXJlIHVwbG9hZCBpcyB0cmlnZ2VyZWQgaW4gaXNscGNpX29wZW4gKi8KKworCXJldHVybiAwOworCisgICAgICBkb191bnJlZ2lzdGVyX25ldGRldjoKKwl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKKwlpc2xwY2lfZnJlZV9tZW1vcnkocHJpdik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfbmV0ZGV2KG5kZXYpOworCXByaXYgPSBOVUxMOworICAgICAgZG9fcGNpX3JlbGVhc2VfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworICAgICAgZG9fcGNpX2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyogc2V0IGJ5IGNsZWFudXBfbW9kdWxlICovCitzdGF0aWMgdm9sYXRpbGUgaW50IF9faW5fY2xlYW51cF9tb2R1bGUgPSAwOworCisvKiB0aGlzIG9uZSByZW1vdmVzIG9uZSghISkgaW5zdGFuY2Ugb25seSAqLwordm9pZAorcHJpc201NF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZGV2ID8gbmV0ZGV2X3ByaXYobmRldikgOiBOVUxMOworCUJVR19PTighcHJpdik7CisKKwlpZiAoIV9faW5fY2xlYW51cF9tb2R1bGUpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBob3QgdW5wbHVnIGRldGVjdGVkXG4iLCBuZGV2LT5uYW1lKTsKKwkJaXNscGNpX3NldF9zdGF0ZShwcml2LCBQUlZfU1RBVEVfT0ZGKTsKKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlbW92aW5nIGRldmljZVxuIiwgbmRldi0+bmFtZSk7CisKKwl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKKworCS8qIGZyZWUgdGhlIGludGVycnVwdCByZXF1ZXN0ICovCisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSAhPSBQUlZfU1RBVEVfT0ZGKSB7CisJCWlzbDM4eHhfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYtPmRldmljZV9iYXNlKTsKKwkJaXNscGNpX3NldF9zdGF0ZShwcml2LCBQUlZfU1RBVEVfT0ZGKTsKKwkJLyogVGhpcyBiZWxsb3cgY2F1c2VzIGEgbG9ja3VwIGF0IHJtbW9kIHRpbWUuIEl0IG1pZ2h0IGJlCisJCSAqIGJlY2F1c2Ugc29tZSBpbnRlcnJ1cHRzIHN0aWxsIGxpbmdlciBhZnRlciBybW1vZCB0aW1lLCAKKwkJICogc2VlIGJ1ZyAjMTcgKi8KKwkJLyogcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCAzKTsqLwkvKiB0cnkgdG8gcG93ZXItb2ZmICovCisJfQorCisJZnJlZV9pcnEocGRldi0+aXJxLCBwcml2KTsKKworCS8qIGZyZWUgdGhlIFBDSSBtZW1vcnkgYW5kIHVubWFwIHRoZSByZW1hcHBlZCBwYWdlICovCisJaXNscGNpX2ZyZWVfbWVtb3J5KHByaXYpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfbmV0ZGV2KG5kZXYpOworCXByaXYgPSBOVUxMOworCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK30KKworaW50CitwcmlzbTU0X3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHUzMiBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5kZXYgPyBuZXRkZXZfcHJpdihuZGV2KSA6IE5VTEw7CisJQlVHX09OKCFwcml2KTsKKworCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGdvdCBzdXNwZW5kIHJlcXVlc3QgKHN0YXRlICVkKVxuIiwKKwkgICAgICAgbmRldi0+bmFtZSwgc3RhdGUpOworCisJcGNpX3NhdmVfc3RhdGUocGRldik7CisKKwkvKiB0ZWxsIHRoZSBkZXZpY2Ugbm90IHRvIHRyaWdnZXIgaW50ZXJydXB0cyBmb3Igbm93Li4uICovCisJaXNsMzh4eF9kaXNhYmxlX2ludGVycnVwdHMocHJpdi0+ZGV2aWNlX2Jhc2UpOworCisJLyogZnJvbSBub3cgb24gYXNzdW1lIHRoZSBoYXJkd2FyZSB3YXMgYWxyZWFkeSBwb3dlcmVkIGRvd24KKwkgICBhbmQgZG9uJ3QgdG91Y2ggaXQgYW55bW9yZSAqLworCWlzbHBjaV9zZXRfc3RhdGUocHJpdiwgUFJWX1NUQVRFX09GRik7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCW5ldGlmX2RldmljZV9kZXRhY2gobmRldik7CisKKwlyZXR1cm4gMDsKK30KKworaW50CitwcmlzbTU0X3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5kZXYgPyBuZXRkZXZfcHJpdihuZGV2KSA6IE5VTEw7CisJQlVHX09OKCFwcml2KTsKKworCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogZ290IHJlc3VtZSByZXF1ZXN0XG4iLCBuZGV2LT5uYW1lKTsKKworCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJLyogYWxyaWdodCBsZXQncyBnbyBpbnRvIHRoZSBQUkVCT09UIHN0YXRlICovCisJaXNscGNpX3Jlc2V0KHByaXYsIDEpOworCisJbmV0aWZfZGV2aWNlX2F0dGFjaChuZGV2KTsKKwluZXRpZl9zdGFydF9xdWV1ZShuZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdAorcHJpc201NF9tb2R1bGVfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIkxvYWRlZCAlcyBkcml2ZXIsIHZlcnNpb24gJXNcbiIsCisJICAgICAgIERSVl9OQU1FLCBEUlZfVkVSU0lPTik7CisKKwlfX2J1Z19vbl93cm9uZ19zdHJ1Y3Rfc2l6ZXMgKCk7CisKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZwcmlzbTU0X2RyaXZlcik7Cit9CisKKy8qIGJ5IHRoZSB0aW1lIHByaXNtNTRfbW9kdWxlX2V4aXQoKSB0ZXJtaW5hdGVzLCBhcyBhIHBvc3Rjb25kaXRpb24KKyAqIGFsbCBpbnN0YW5jZXMgd2lsbCBoYXZlIGJlZW4gZGVzdHJveWVkIGJ5IGNhbGxzIHRvCisgKiBwcmlzbTU0X3JlbW92ZSgpICovCitzdGF0aWMgdm9pZCBfX2V4aXQKK3ByaXNtNTRfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlfX2luX2NsZWFudXBfbW9kdWxlID0gMTsKKworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcHJpc201NF9kcml2ZXIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiVW5sb2FkZWQgJXMgZHJpdmVyXG4iLCBEUlZfTkFNRSk7CisKKwlfX2luX2NsZWFudXBfbW9kdWxlID0gMDsKK30KKworLyogcmVnaXN0ZXIgZW50cnkgcG9pbnRzICovCittb2R1bGVfaW5pdChwcmlzbTU0X21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KHByaXNtNTRfbW9kdWxlX2V4aXQpOworLyogRU9GICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9tZ3QuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZjJlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9tZ3QuYwpAQCAtMCwwICsxLDUxMyBAQAorLyoKKyAqICAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLgorICogIENvcHlyaWdodCAyMDA0IEplbnMgTWF1cmVyIDxKZW5zLk1hdXJlckBnbXgubmV0PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisKKyNpbmNsdWRlICJwcmlzbWNvbXBhdC5oIgorI2luY2x1ZGUgImlzbF8zOHh4LmgiCisjaW5jbHVkZSAiaXNscGNpX21ndC5oIgorI2luY2x1ZGUgImlzbF9vaWQuaCIJCS8qIGFkZGl0aW9uYWwgdHlwZXMgYW5kIGRlZnMgZm9yIGlzbDM4eHggZncgKi8KKyNpbmNsdWRlICJpc2xfaW9jdGwuaCIKKworI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgR2xvYmFsIHZhcmlhYmxlIGRlZmluaXRpb24gc2VjdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHBjX2RlYnVnID0gVkVSQk9TRTsKK21vZHVsZV9wYXJhbShwY19kZWJ1ZywgaW50LCAwKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIERyaXZlciBnZW5lcmFsIGZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCit2b2lkCitkaXNwbGF5X2J1ZmZlcihjaGFyICpidWZmZXIsIGludCBsZW5ndGgpCit7CisJaWYgKChwY19kZWJ1ZyAmIFNIT1dfQlVGRkVSX0NPTlRFTlRTKSA9PSAwKQorCQlyZXR1cm47CisKKwl3aGlsZSAobGVuZ3RoID4gMCkgeworCQlwcmludGsoIlslMDJ4XSIsICpidWZmZXIgJiAyNTUpOworCQlsZW5ndGgtLTsKKwkJYnVmZmVyKys7CisJfQorCisJcHJpbnRrKCJcbiIpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIFF1ZXVlIGhhbmRsaW5nIGZvciBtYW5hZ2VtZW50IGZyYW1lcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIFBJTUZPUiBtYW5hZ2VtZW50IGZyYW1lIGhlYWRlci4KKyAqLworc3RhdGljIHZvaWQKK3BpbWZvcl9lbmNvZGVfaGVhZGVyKGludCBvcGVyYXRpb24sIHUzMiBvaWQsIHUzMiBsZW5ndGgsIHBpbWZvcl9oZWFkZXJfdCAqaCkKK3sKKwloLT52ZXJzaW9uID0gUElNRk9SX1ZFUlNJT047CisJaC0+b3BlcmF0aW9uID0gb3BlcmF0aW9uOworCWgtPmRldmljZV9pZCA9IFBJTUZPUl9ERVZfSURfTUhMSV9NSUI7CisJaC0+ZmxhZ3MgPSAwOworCWgtPm9pZCA9IGNwdV90b19iZTMyKG9pZCk7CisJaC0+bGVuZ3RoID0gY3B1X3RvX2JlMzIobGVuZ3RoKTsKK30KKworLyoKKyAqIEhlbHBlciBmdW5jdGlvbiB0byBhbmFseXplIGEgUElNRk9SIG1hbmFnZW1lbnQgZnJhbWUgaGVhZGVyLgorICovCitzdGF0aWMgcGltZm9yX2hlYWRlcl90ICoKK3BpbWZvcl9kZWNvZGVfaGVhZGVyKHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJcGltZm9yX2hlYWRlcl90ICpoID0gZGF0YTsKKworCXdoaWxlICgodm9pZCAqKSBoIDwgZGF0YSArIGxlbikgeworCQlpZiAoaC0+ZmxhZ3MgJiBQSU1GT1JfRkxBR19MSVRUTEVfRU5ESUFOKSB7CisJCQlsZTMyX3RvX2NwdXMoJmgtPm9pZCk7CisJCQlsZTMyX3RvX2NwdXMoJmgtPmxlbmd0aCk7CisJCX0gZWxzZSB7CisJCQliZTMyX3RvX2NwdXMoJmgtPm9pZCk7CisJCQliZTMyX3RvX2NwdXMoJmgtPmxlbmd0aCk7CisJCX0KKwkJaWYgKGgtPm9pZCAhPSBPSURfSU5MX1RVTk5FTCkKKwkJCXJldHVybiBoOworCQloKys7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogRmlsbCB0aGUgcmVjZWl2ZSBxdWV1ZSBmb3IgbWFuYWdlbWVudCBmcmFtZXMgd2l0aCBmcmVzaCBidWZmZXJzLgorICovCitpbnQKK2lzbHBjaV9tZ210X3J4X2ZpbGwoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKmNiID0JLyogdm9sYXRpbGUgbm90IG5lZWRlZCAqLworCSAgICAoaXNsMzh4eF9jb250cm9sX2Jsb2NrICopIHByaXYtPmNvbnRyb2xfYmxvY2s7CisJdTMyIGN1cnIgPSBsZTMyX3RvX2NwdShjYi0+ZHJpdmVyX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1JYX01HTVRRXSk7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCURFQlVHKFNIT1dfRlVOQ1RJT05fQ0FMTFMsICJpc2xwY2lfbWdtdF9yeF9maWxsIFxuIik7CisjZW5kaWYKKworCXdoaWxlIChjdXJyIC0gcHJpdi0+aW5kZXhfbWdtdF9yeCA8IElTTDM4WFhfQ0JfTUdNVF9RU0laRSkgeworCQl1MzIgaW5kZXggPSBjdXJyICUgSVNMMzhYWF9DQl9NR01UX1FTSVpFOworCQlzdHJ1Y3QgaXNscGNpX21lbWJ1ZiAqYnVmID0gJnByaXYtPm1nbXRfcnhbaW5kZXhdOworCQlpc2wzOHh4X2ZyYWdtZW50ICpmcmFnID0gJmNiLT5yeF9kYXRhX21nbXRbaW5kZXhdOworCisJCWlmIChidWYtPm1lbSA9PSBOVUxMKSB7CisJCQlidWYtPm1lbSA9IGttYWxsb2MoTUdNVF9GUkFNRV9TSVpFLCBHRlBfQVRPTUlDKTsKKwkJCWlmICghYnVmLT5tZW0pIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJFcnJvciBhbGxvY2F0aW5nIG1hbmFnZW1lbnQgZnJhbWUuXG4iKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWJ1Zi0+c2l6ZSA9IE1HTVRfRlJBTUVfU0laRTsKKwkJfQorCQlpZiAoYnVmLT5wY2lfYWRkciA9PSAwKSB7CisJCQlidWYtPnBjaV9hZGRyID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGRldiwgYnVmLT5tZW0sCisJCQkJCQkgICAgICAgTUdNVF9GUkFNRV9TSVpFLAorCQkJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlpZiAoIWJ1Zi0+cGNpX2FkZHIpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJGYWlsZWQgdG8gbWFrZSBtZW1vcnkgRE1BJ2FibGVcbi4iKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJfQorCisJCS8qIGJlIHNhZmU6IGFsd2F5cyByZXNldCBjb250cm9sIGJsb2NrIGluZm9ybWF0aW9uICovCisJCWZyYWctPnNpemUgPSBjcHVfdG9fbGUxNihNR01UX0ZSQU1FX1NJWkUpOworCQlmcmFnLT5mbGFncyA9IDA7CisJCWZyYWctPmFkZHJlc3MgPSBjcHVfdG9fbGUzMihidWYtPnBjaV9hZGRyKTsKKwkJY3VycisrOworCisJCS8qIFRoZSBmcmFnbWVudCBhZGRyZXNzIGluIHRoZSBjb250cm9sIGJsb2NrIG11c3QgaGF2ZQorCQkgKiBiZWVuIHdyaXR0ZW4gYmVmb3JlIGFubm91bmNpbmcgdGhlIGZyYW1lIGJ1ZmZlciB0bworCQkgKiBkZXZpY2UgKi8KKwkJd21iKCk7CisJCWNiLT5kcml2ZXJfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfUlhfTUdNVFFdID0gY3B1X3RvX2xlMzIoY3Vycik7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogQ3JlYXRlIGFuZCB0cmFuc21pdCBhIG1hbmFnZW1lbnQgZnJhbWUgdXNpbmcgIm9wZXJhdGlvbiIgYW5kICJvaWQiLAorICogd2l0aCBhcmd1bWVudHMgZGF0YS9sZW5ndGguCisgKiBXZSBlaXRoZXIgcmV0dXJuIGFuIGVycm9yIGFuZCBmcmVlIHRoZSBmcmFtZSwgb3Igd2UgcmV0dXJuIDAgYW5kCisgKiBpc2xwY2lfbWd0X2NsZWFudXBfdHJhbnNtaXQoKSBmcmVlcyB0aGUgZnJhbWUgaW4gdGhlIHR4LWRvbmUKKyAqIGludGVycnVwdC4KKyAqLworc3RhdGljIGludAoraXNscGNpX21ndF90cmFuc21pdChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgaW50IG9wZXJhdGlvbiwgdW5zaWduZWQgbG9uZyBvaWQsCisJCSAgICB2b2lkICpkYXRhLCBpbnQgbGVuZ3RoKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaXNsMzh4eF9jb250cm9sX2Jsb2NrICpjYiA9CisJICAgIChpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKikgcHJpdi0+Y29udHJvbF9ibG9jazsKKwl2b2lkICpwOworCWludCBlcnIgPSAtRUlOVkFMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaXNsMzh4eF9mcmFnbWVudCAqZnJhZzsKKwlzdHJ1Y3QgaXNscGNpX21lbWJ1ZiBidWY7CisJdTMyIGN1cnJfZnJhZzsKKwlpbnQgaW5kZXg7CisJaW50IGZyYWdfbGVuID0gbGVuZ3RoICsgUElNRk9SX0hFQURFUl9TSVpFOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX0ZVTkNUSU9OX0NBTExTLCAiaXNscGNpX21ndF90cmFuc21pdFxuIik7CisjZW5kaWYKKworCWlmIChmcmFnX2xlbiA+IE1HTVRfRlJBTUVfU0laRSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG1nbXQgZnJhbWUgdG9vIGxhcmdlICVkXG4iLAorCQkgICAgICAgbmRldi0+bmFtZSwgZnJhZ19sZW4pOworCQlnb3RvIGVycm9yOworCX0KKworCWVyciA9IC1FTk9NRU07CisJcCA9IGJ1Zi5tZW0gPSBrbWFsbG9jKGZyYWdfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1Zi5tZW0pIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjYW5ub3QgYWxsb2NhdGUgbWdtdCBmcmFtZVxuIiwKKwkJICAgICAgIG5kZXYtPm5hbWUpOworCQlnb3RvIGVycm9yOworCX0KKwlidWYuc2l6ZSA9IGZyYWdfbGVuOworCisJLyogY3JlYXRlIHRoZSBoZWFkZXIgZGlyZWN0bHkgaW4gdGhlIGZyYWdtZW50IGRhdGEgYXJlYSAqLworCXBpbWZvcl9lbmNvZGVfaGVhZGVyKG9wZXJhdGlvbiwgb2lkLCBsZW5ndGgsIChwaW1mb3JfaGVhZGVyX3QgKikgcCk7CisJcCArPSBQSU1GT1JfSEVBREVSX1NJWkU7CisKKwlpZiAoZGF0YSkKKwkJbWVtY3B5KHAsIGRhdGEsIGxlbmd0aCk7CisJZWxzZQorCQltZW1zZXQocCwgMCwgbGVuZ3RoKTsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJeworCQlwaW1mb3JfaGVhZGVyX3QgKmggPSBidWYubWVtOworCQlERUJVRyhTSE9XX1BJTUZPUl9GUkFNRVMsCisJCSAgICAgICJQSU1GT1I6IG9wICVpLCBvaWQgMHglMDhseCwgZGV2aWNlICVpLCBmbGFncyAweCV4IGxlbmd0aCAweCV4IFxuIiwKKwkJICAgICAgaC0+b3BlcmF0aW9uLCBvaWQsIGgtPmRldmljZV9pZCwgaC0+ZmxhZ3MsIGxlbmd0aCk7CisKKwkJLyogZGlzcGxheSB0aGUgYnVmZmVyIGNvbnRlbnRzIGZvciBkZWJ1Z2dpbmcgKi8KKwkJZGlzcGxheV9idWZmZXIoKGNoYXIgKikgaCwgc2l6ZW9mIChwaW1mb3JfaGVhZGVyX3QpKTsKKwkJZGlzcGxheV9idWZmZXIocCwgbGVuZ3RoKTsKKwl9CisjZW5kaWYKKworCWVyciA9IC1FTk9NRU07CisJYnVmLnBjaV9hZGRyID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGRldiwgYnVmLm1lbSwgZnJhZ19sZW4sCisJCQkJICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisJaWYgKCFidWYucGNpX2FkZHIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNhbm5vdCBtYXAgUENJIG1lbW9yeSBmb3IgbWdtdFxuIiwKKwkJICAgICAgIG5kZXYtPm5hbWUpOworCQlnb3RvIGVycm9yX2ZyZWU7CisJfQorCisJLyogUHJvdGVjdCB0aGUgY29udHJvbCBibG9jayBtb2RpZmljYXRpb25zIGFnYWluc3QgaW50ZXJydXB0cy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c2xvY2ssIGZsYWdzKTsKKwljdXJyX2ZyYWcgPSBsZTMyX3RvX2NwdShjYi0+ZHJpdmVyX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1RYX01HTVRRXSk7CisJaWYgKGN1cnJfZnJhZyAtIHByaXYtPmluZGV4X21nbXRfdHggPj0gSVNMMzhYWF9DQl9NR01UX1FTSVpFKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBtZ210IHR4IHF1ZXVlIGlzIHN0aWxsIGZ1bGxcbiIsCisJCSAgICAgICBuZGV2LT5uYW1lKTsKKwkJZ290byBlcnJvcl91bmxvY2s7CisJfQorCisJLyogY29tbWl0IHRoZSBmcmFtZSB0byB0aGUgdHggZGV2aWNlIHF1ZXVlICovCisJaW5kZXggPSBjdXJyX2ZyYWcgJSBJU0wzOFhYX0NCX01HTVRfUVNJWkU7CisJcHJpdi0+bWdtdF90eFtpbmRleF0gPSBidWY7CisJZnJhZyA9ICZjYi0+dHhfZGF0YV9tZ210W2luZGV4XTsKKwlmcmFnLT5zaXplID0gY3B1X3RvX2xlMTYoZnJhZ19sZW4pOworCWZyYWctPmZsYWdzID0gMDsJLyogZm9yIGFueSBvdGhlciB0aGFuIHRoZSBsYXN0IGZyYWdtZW50LCBzZXQgdG8gMSAqLworCWZyYWctPmFkZHJlc3MgPSBjcHVfdG9fbGUzMihidWYucGNpX2FkZHIpOworCisJLyogVGhlIGZyYWdtZW50IGFkZHJlc3MgaW4gdGhlIGNvbnRyb2wgYmxvY2sgbXVzdCBoYXZlCisJICogYmVlbiB3cml0dGVuIGJlZm9yZSBhbm5vdW5jaW5nIHRoZSBmcmFtZSBidWZmZXIgdG8KKwkgKiBkZXZpY2UgKi8KKwl3bWIoKTsKKwljYi0+ZHJpdmVyX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1RYX01HTVRRXSA9IGNwdV90b19sZTMyKGN1cnJfZnJhZyArIDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNsb2NrLCBmbGFncyk7CisKKwkvKiB0cmlnZ2VyIHRoZSBkZXZpY2UgKi8KKwlpc2xwY2lfdHJpZ2dlcihwcml2KTsKKwlyZXR1cm4gMDsKKworICAgICAgZXJyb3JfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNsb2NrLCBmbGFncyk7CisgICAgICBlcnJvcl9mcmVlOgorCWtmcmVlKGJ1Zi5tZW0pOworICAgICAgZXJyb3I6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFJlY2VpdmUgYSBtYW5hZ2VtZW50IGZyYW1lIGZyb20gdGhlIGRldmljZS4KKyAqIFRoaXMgY2FuIGJlIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgdHJhcHMsIGFuZCBhdCBtb3N0IG9uZSByZXNwb25zZQorICogZnJhbWUgZm9yIGEgcHJldmlvdXMgcmVxdWVzdCBzZW50IHZpYSBpc2xwY2lfbWd0X3RyYW5zbWl0KCkuCisgKi8KK2ludAoraXNscGNpX21ndF9yZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaXNsMzh4eF9jb250cm9sX2Jsb2NrICpjYiA9CisJICAgIChpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKikgcHJpdi0+Y29udHJvbF9ibG9jazsKKwl1MzIgY3Vycl9mcmFnOworCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlERUJVRyhTSE9XX0ZVTkNUSU9OX0NBTExTLCAiaXNscGNpX21ndF9yZWNlaXZlIFxuIik7CisjZW5kaWYKKworCS8qIE9ubHkgb25jZSBwZXIgaW50ZXJydXB0LCBkZXRlcm1pbmUgZnJhZ21lbnQgcmFuZ2UgdG8KKwkgKiBwcm9jZXNzLiAgVGhpcyBhdm9pZHMgYW4gZW5kbGVzcyBsb29wIChpLmUuIGxvY2t1cCkgaWYKKwkgKiBmcmFtZXMgY29tZSBpbiBmYXN0ZXIgdGhhbiB3ZSBjYW4gcHJvY2VzcyB0aGVtLiAqLworCWN1cnJfZnJhZyA9IGxlMzJfdG9fY3B1KGNiLT5kZXZpY2VfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfUlhfTUdNVFFdKTsKKwliYXJyaWVyKCk7CisKKwlmb3IgKDsgcHJpdi0+aW5kZXhfbWdtdF9yeCA8IGN1cnJfZnJhZzsgcHJpdi0+aW5kZXhfbWdtdF9yeCsrKSB7CisJCXBpbWZvcl9oZWFkZXJfdCAqaGVhZGVyOworCQl1MzIgaW5kZXggPSBwcml2LT5pbmRleF9tZ210X3J4ICUgSVNMMzhYWF9DQl9NR01UX1FTSVpFOworCQlzdHJ1Y3QgaXNscGNpX21lbWJ1ZiAqYnVmID0gJnByaXYtPm1nbXRfcnhbaW5kZXhdOworCQl1MTYgZnJhZ19sZW47CisJCWludCBzaXplOworCQlzdHJ1Y3QgaXNscGNpX21nbXRmcmFtZSAqZnJhbWU7CisKKwkJLyogSSBoYXZlIG5vIGlkZWEgKGFuZCBubyBkb2N1bWVudGF0aW9uKSBpZiBmbGFncyAhPSAwCisJCSAqIGlzIHBvc3NpYmxlLiAgRHJvcCB0aGUgZnJhbWUsIHJldXNlIHRoZSBidWZmZXIuICovCisJCWlmIChsZTE2X3RvX2NwdShjYi0+cnhfZGF0YV9tZ210W2luZGV4XS5mbGFncykgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVua25vd24gZmxhZ3MgMHglMDR4XG4iLAorCQkJICAgICAgIG5kZXYtPm5hbWUsCisJCQkgICAgICAgbGUxNl90b19jcHUoY2ItPnJ4X2RhdGFfbWdtdFtpbmRleF0uZmxhZ3MpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogVGhlIGRldmljZSBvbmx5IHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGhlYWRlcihzKSBoZXJlLiAqLworCQlmcmFnX2xlbiA9IGxlMTZfdG9fY3B1KGNiLT5yeF9kYXRhX21nbXRbaW5kZXhdLnNpemUpOworCisJCS8qCisJCSAqIFdlIGFwcGVhciB0byBoYXZlIG5vIHdheSB0byB0ZWxsIHRoZSBkZXZpY2UgdGhlCisJCSAqIHNpemUgb2YgYSByZWNlaXZlIGJ1ZmZlci4gIFRodXMsIGlmIHRoaXMgY2hlY2sKKwkJICogdHJpZ2dlcnMsIHdlIGxpa2VseSBoYXZlIGtlcm5lbCBoZWFwIGNvcnJ1cHRpb24uICovCisJCWlmIChmcmFnX2xlbiA+IE1HTVRfRlJBTUVfU0laRSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSIlczogQm9ndXMgcGFja2V0IHNpemUgb2YgJWQgKCUjeCkuXG4iLAorCQkJCW5kZXYtPm5hbWUsIGZyYWdfbGVuLCBmcmFnX2xlbik7CisJCQlmcmFnX2xlbiA9IE1HTVRfRlJBTUVfU0laRTsKKwkJfQorCisJCS8qIEVuc3VyZSB0aGUgcmVzdWx0cyBvZiBkZXZpY2UgRE1BIGFyZSB2aXNpYmxlIHRvIHRoZSBDUFUuICovCisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShwcml2LT5wZGV2LCBidWYtPnBjaV9hZGRyLAorCQkJCQkgICAgYnVmLT5zaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCS8qIFBlcmZvcm0gZW5kaWFuZXNzIGNvbnZlcnNpb24gZm9yIFBJTUZPUiBoZWFkZXIgaW4tcGxhY2UuICovCisJCWhlYWRlciA9IHBpbWZvcl9kZWNvZGVfaGVhZGVyKGJ1Zi0+bWVtLCBmcmFnX2xlbik7CisJCWlmICghaGVhZGVyKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbm8gUElNRk9SIGhlYWRlciBmb3VuZFxuIiwKKwkJCSAgICAgICBuZGV2LT5uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogVGhlIGRldmljZSBJRCBmcm9tIHRoZSBQSU1GT1IgcGFja2V0IHJlY2VpdmVkIGZyb20KKwkJICogdGhlIE1WQyBpcyBhbHdheXMgMC4gIFdlIGZvcndhcmQgYSBzZW5zaWJsZSBkZXZpY2VfaWQuCisJCSAqIE5vdCB0aGF0IGFueW9uZSB1cHN0cmVhbSB3b3VsZCBjYXJlLi4uICovCisJCWhlYWRlci0+ZGV2aWNlX2lkID0gcHJpdi0+bmRldi0+aWZpbmRleDsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJCURFQlVHKFNIT1dfUElNRk9SX0ZSQU1FUywKKwkJICAgICAgIlBJTUZPUjogb3AgJWksIG9pZCAweCUwOHgsIGRldmljZSAlaSwgZmxhZ3MgMHgleCBsZW5ndGggMHgleCBcbiIsCisJCSAgICAgIGhlYWRlci0+b3BlcmF0aW9uLCBoZWFkZXItPm9pZCwgaGVhZGVyLT5kZXZpY2VfaWQsCisJCSAgICAgIGhlYWRlci0+ZmxhZ3MsIGhlYWRlci0+bGVuZ3RoKTsKKworCQkvKiBkaXNwbGF5IHRoZSBidWZmZXIgY29udGVudHMgZm9yIGRlYnVnZ2luZyAqLworCQlkaXNwbGF5X2J1ZmZlcigoY2hhciAqKSBoZWFkZXIsIFBJTUZPUl9IRUFERVJfU0laRSk7CisJCWRpc3BsYXlfYnVmZmVyKChjaGFyICopIGhlYWRlciArIFBJTUZPUl9IRUFERVJfU0laRSwKKwkJCSAgICAgICBoZWFkZXItPmxlbmd0aCk7CisjZW5kaWYKKworCQkvKiBub2JvZHkgc2VuZHMgdGhlc2UgKi8KKwkJaWYgKGhlYWRlci0+ZmxhZ3MgJiBQSU1GT1JfRkxBR19BUFBMSUNfT1JJR0lOKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICIlczogZXJyYW50IFBJTUZPUiBhcHBsaWNhdGlvbiBmcmFtZVxuIiwKKwkJCSAgICAgICBuZGV2LT5uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogRGV0ZXJtaW5lIGZyYW1lIHNpemUsIHNraXBwaW5nIE9JRF9JTkxfVFVOTkVMIGhlYWRlcnMuICovCisJCXNpemUgPSBQSU1GT1JfSEVBREVSX1NJWkUgKyBoZWFkZXItPmxlbmd0aDsKKwkJZnJhbWUgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUpICsgc2l6ZSwKKwkJCQlHRlBfQVRPTUlDKTsKKwkJaWYgKCFmcmFtZSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogT3V0IG9mIG1lbW9yeSwgY2Fubm90IGhhbmRsZSBvaWQgMHglMDh4XG4iLAorCQkJICAgICAgIG5kZXYtPm5hbWUsIGhlYWRlci0+b2lkKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZyYW1lLT5uZGV2ID0gbmRldjsKKwkJbWVtY3B5KCZmcmFtZS0+YnVmLCBoZWFkZXIsIHNpemUpOworCQlmcmFtZS0+aGVhZGVyID0gKHBpbWZvcl9oZWFkZXJfdCAqKSBmcmFtZS0+YnVmOworCQlmcmFtZS0+ZGF0YSA9IGZyYW1lLT5idWYgKyBQSU1GT1JfSEVBREVSX1NJWkU7CisKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQlERUJVRyhTSE9XX1BJTUZPUl9GUkFNRVMsCisJCSAgICAgICJmcmFtZTogaGVhZGVyOiAlcCwgZGF0YTogJXAsIHNpemU6ICVkXG4iLAorCQkgICAgICBmcmFtZS0+aGVhZGVyLCBmcmFtZS0+ZGF0YSwgc2l6ZSk7CisjZW5kaWYKKworCQlpZiAoaGVhZGVyLT5vcGVyYXRpb24gPT0gUElNRk9SX09QX1RSQVApIHsKKyNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUworCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCSAgICAgICAiVFJBUDogb2lkIDB4JXgsIGRldmljZSAlaSwgZmxhZ3MgMHgleCBsZW5ndGggJWlcbiIsCisJCQkgICAgICAgaGVhZGVyLT5vaWQsIGhlYWRlci0+ZGV2aWNlX2lkLCBoZWFkZXItPmZsYWdzLAorCQkJICAgICAgIGhlYWRlci0+bGVuZ3RoKTsKKyNlbmRpZgorCisJCQkvKiBDcmVhdGUgd29yayB0byBoYW5kbGUgdHJhcCBvdXQgb2YgaW50ZXJydXB0CisJCQkgKiBjb250ZXh0LiAqLworCQkJSU5JVF9XT1JLKCZmcmFtZS0+d3MsIHByaXNtNTRfcHJvY2Vzc190cmFwLCBmcmFtZSk7CisJCQlzY2hlZHVsZV93b3JrKCZmcmFtZS0+d3MpOworCisJCX0gZWxzZSB7CisJCQkvKiBTaWduYWwgdGhlIG9uZSB3YWl0aW5nIHByb2Nlc3MgdGhhdCBhIHJlc3BvbnNlCisJCQkgKiBoYXMgYmVlbiByZWNlaXZlZC4gKi8KKwkJCWlmICgoZnJhbWUgPSB4Y2hnKCZwcml2LT5tZ210X3JlY2VpdmVkLCBmcmFtZSkpICE9IE5VTEwpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICIlczogbWdtdCByZXNwb25zZSBub3QgY29sbGVjdGVkXG4iLAorCQkJCSAgICAgICBuZGV2LT5uYW1lKTsKKwkJCQlrZnJlZShmcmFtZSk7CisJCQl9CisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwkJCURFQlVHKFNIT1dfVFJBQ0lORywgIldha2UgdXAgTWdtdCBRdWV1ZVxuIik7CisjZW5kaWYKKwkJCXdha2VfdXAoJnByaXYtPm1nbXRfd3F1ZXVlKTsKKwkJfQorCisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDbGVhbnVwIHRoZSB0cmFuc21pdCBxdWV1ZSBieSBmcmVlaW5nIGFsbCBmcmFtZXMgaGFuZGxlZCBieSB0aGUgZGV2aWNlLgorICovCit2b2lkCitpc2xwY2lfbWd0X2NsZWFudXBfdHJhbnNtaXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKmNiID0JLyogdm9sYXRpbGUgbm90IG5lZWRlZCAqLworCSAgICAoaXNsMzh4eF9jb250cm9sX2Jsb2NrICopIHByaXYtPmNvbnRyb2xfYmxvY2s7CisJdTMyIGN1cnJfZnJhZzsKKworI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCisJREVCVUcoU0hPV19GVU5DVElPTl9DQUxMUywgImlzbHBjaV9tZ3RfY2xlYW51cF90cmFuc21pdFxuIik7CisjZW5kaWYKKworCS8qIE9ubHkgb25jZSBwZXIgY2xlYW51cCwgZGV0ZXJtaW5lIGZyYWdtZW50IHJhbmdlIHRvCisJICogcHJvY2Vzcy4gIFRoaXMgYXZvaWRzIGFuIGVuZGxlc3MgbG9vcCAoaS5lLiBsb2NrdXApIGlmCisJICogdGhlIGRldmljZSBiZWNhbWUgY29uZnVzZWQsIGluY3JlbWVudGluZyBkZXZpY2VfY3Vycl9mcmFnCisJICogcmFwaWRseS4gKi8KKwljdXJyX2ZyYWcgPSBsZTMyX3RvX2NwdShjYi0+ZGV2aWNlX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1RYX01HTVRRXSk7CisJYmFycmllcigpOworCisJZm9yICg7IHByaXYtPmluZGV4X21nbXRfdHggPCBjdXJyX2ZyYWc7IHByaXYtPmluZGV4X21nbXRfdHgrKykgeworCQlpbnQgaW5kZXggPSBwcml2LT5pbmRleF9tZ210X3R4ICUgSVNMMzhYWF9DQl9NR01UX1FTSVpFOworCQlzdHJ1Y3QgaXNscGNpX21lbWJ1ZiAqYnVmID0gJnByaXYtPm1nbXRfdHhbaW5kZXhdOworCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsIGJ1Zi0+cGNpX2FkZHIsIGJ1Zi0+c2l6ZSwKKwkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCWJ1Zi0+cGNpX2FkZHIgPSAwOworCQlrZnJlZShidWYtPm1lbSk7CisJCWJ1Zi0+bWVtID0gTlVMTDsKKwkJYnVmLT5zaXplID0gMDsKKwl9Cit9CisKKy8qCisgKiBQZXJmb3JtIG9uZSByZXF1ZXN0LXJlc3BvbnNlIHRyYW5zYWN0aW9uIHRvIHRoZSBkZXZpY2UuCisgKi8KK2ludAoraXNscGNpX21ndF90cmFuc2FjdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJICAgICAgIGludCBvcGVyYXRpb24sIHVuc2lnbmVkIGxvbmcgb2lkLAorCQkgICAgICAgdm9pZCAqc2VuZGRhdGEsIGludCBzZW5kbGVuLAorCQkgICAgICAgc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKipyZWN2ZnJhbWUpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwljb25zdCBsb25nIHdhaXRfY3ljbGVfamlmZmllcyA9IChJU0wzOFhYX1dBSVRfQ1lDTEUgKiAxMCAqIEhaKSAvIDEwMDA7CisJbG9uZyB0aW1lb3V0X2xlZnQgPSBJU0wzOFhYX01BWF9XQUlUX0NZQ0xFUyAqIHdhaXRfY3ljbGVfamlmZmllczsKKwlpbnQgZXJyOworCURFRklORV9XQUlUKHdhaXQpOworCisJKnJlY3ZmcmFtZSA9IE5VTEw7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZwcml2LT5tZ210X3NlbSkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlwcmVwYXJlX3RvX3dhaXQoJnByaXYtPm1nbXRfd3F1ZXVlLCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCWVyciA9IGlzbHBjaV9tZ3RfdHJhbnNtaXQobmRldiwgb3BlcmF0aW9uLCBvaWQsIHNlbmRkYXRhLCBzZW5kbGVuKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IC1FVElNRURPVVQ7CisJd2hpbGUgKHRpbWVvdXRfbGVmdCA+IDApIHsKKwkJaW50IHRpbWVsZWZ0OworCQlzdHJ1Y3QgaXNscGNpX21nbXRmcmFtZSAqZnJhbWU7CisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQl0aW1lbGVmdCA9IHNjaGVkdWxlX3RpbWVvdXQod2FpdF9jeWNsZV9qaWZmaWVzKTsKKwkJZnJhbWUgPSB4Y2hnKCZwcml2LT5tZ210X3JlY2VpdmVkLCBOVUxMKTsKKwkJaWYgKGZyYW1lKSB7CisJCQlpZiAoZnJhbWUtPmhlYWRlci0+b2lkID09IG9pZCkgeworCQkJCSpyZWN2ZnJhbWUgPSBmcmFtZTsKKwkJCQllcnIgPSAwOworCQkJCWdvdG8gb3V0OworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiJXM6IGV4cGVjdGluZyBvaWQgMHgleCwgcmVjZWl2ZWQgMHgleC5cbiIsCisJCQkJICAgICAgIG5kZXYtPm5hbWUsICh1bnNpZ25lZCBpbnQpIG9pZCwKKwkJCQkgICAgICAgZnJhbWUtPmhlYWRlci0+b2lkKTsKKwkJCQlrZnJlZShmcmFtZSk7CisJCQkJZnJhbWUgPSBOVUxMOworCQkJfQorCQl9CisJCWlmICh0aW1lbGVmdCA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSIlczogdGltZW91dCB3YWl0aW5nIGZvciBtZ210IHJlc3BvbnNlICVsdSwgIgorCQkJCSJ0cmlnZ2VyaW5nIGRldmljZVxuIiwKKwkJCQluZGV2LT5uYW1lLCB0aW1lb3V0X2xlZnQpOworCQkJaXNscGNpX3RyaWdnZXIocHJpdik7CisJCX0KKwkJdGltZW91dF9sZWZ0ICs9IHRpbWVsZWZ0IC0gd2FpdF9jeWNsZV9qaWZmaWVzOworCX0KKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdGltZW91dCB3YWl0aW5nIGZvciBtZ210IHJlc3BvbnNlXG4iLAorCSAgICAgICBuZGV2LT5uYW1lKTsKKworCS8qIFRPRE86IHdlIHNob3VsZCByZXNldCB0aGUgZGV2aWNlIGhlcmUgKi8gICAgIAorIG91dDoKKwlmaW5pc2hfd2FpdCgmcHJpdi0+bWdtdF93cXVldWUsICZ3YWl0KTsKKwl1cCgmcHJpdi0+bWdtdF9zZW0pOworCXJldHVybiBlcnI7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfbWd0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk4MmJlMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogIAorICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEx1aXMgUi4gUm9kcmlndWV6IDxtY2dyb2ZAcnVzbHVnLnJ1dGdlcnMuZWR1PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaWZuZGVmIF9JU0xQQ0lfTUdUX0gKKyNkZWZpbmUgX0lTTFBDSV9NR1RfSAorCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworLyoKKyAqICBGdW5jdGlvbiBkZWZpbml0aW9ucworICovCisKKyNkZWZpbmUgS19ERUJVRyhmLCBtLCBhcmdzLi4uKSBkbyB7IGlmKGYgJiBtKSBwcmludGsoS0VSTl9ERUJVRyBhcmdzKTsgfSB3aGlsZSgwKQorI2RlZmluZSBERUJVRyhmLCBhcmdzLi4uKSBLX0RFQlVHKGYsIHBjX2RlYnVnLCBhcmdzKQorCitleHRlcm4gaW50IHBjX2RlYnVnOworI2RlZmluZSBpbml0X3dkcyAwCS8qIGhlbHAgY29tcGlsZXIgb3B0aW1pemUgYXdheSBkZWFkIGNvZGUgKi8KKworCisvKiBHZW5lcmFsIGRyaXZlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBQQ0lERVZJQ0VfTEFURU5DWV9USU1FUl9NSU4gCQkweDQwCisjZGVmaW5lIFBDSURFVklDRV9MQVRFTkNZX1RJTUVSX1ZBTCAJCTB4NTAKKworLyogRGVidWdnaW5nIHZlcmJvc2UgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgU0hPV19OT1RISU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAJLyogb3ZlcnJ1bGVzIGV2ZXJ5dGhpbmcgKi8KKyNkZWZpbmUgU0hPV19BTllUSElORyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYKKyNkZWZpbmUgU0hPV19FUlJPUl9NRVNTQUdFUyAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgU0hPV19UUkFQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgU0hPV19GVU5DVElPTl9DQUxMUyAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgU0hPV19UUkFDSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgU0hPV19RVUVVRV9JTkRFWEVTICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgU0hPV19QSU1GT1JfRlJBTUVTICAgICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgU0hPV19CVUZGRVJfQ09OVEVOVFMgICAgICAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgVkVSQk9TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKworLyogRGVmYXVsdCBjYXJkIGRlZmluaXRpb25zICovCisjZGVmaW5lIENBUkRfREVGQVVMVF9DSEFOTkVMICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIENBUkRfREVGQVVMVF9NT0RFICAgICAgICAgICAgICAgICAgICAgICBJTkxfTU9ERV9DTElFTlQKKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX0lXX01PREUJCQlJV19NT0RFX0lORlJBCisjZGVmaW5lIENBUkRfREVGQVVMVF9CU1NUWVBFICAgICAgICAgICAgICAgICAgICBET1QxMV9CU1NUWVBFX0lORlJBCisjZGVmaW5lIENBUkRfREVGQVVMVF9DTElFTlRfU1NJRAkJIiIKKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX0FQX1NTSUQJCQkiZGVmYXVsdCIKKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX0tFWTEgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0X2tleV8xIgorI2RlZmluZSBDQVJEX0RFRkFVTFRfS0VZMiAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHRfa2V5XzIiCisjZGVmaW5lIENBUkRfREVGQVVMVF9LRVkzICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdF9rZXlfMyIKKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX0tFWTQgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0X2tleV80IgorI2RlZmluZSBDQVJEX0RFRkFVTFRfV0VQICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDQVJEX0RFRkFVTFRfRklMVEVSICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDQVJEX0RFRkFVTFRfV0RTICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZQlDQVJEX0RFRkFVTFRfQVVUSEVOICAgICAgICAgICAgICAgICAgICAgRE9UMTFfQVVUSF9PUworI2RlZmluZQlDQVJEX0RFRkFVTFRfRE9UMVgJCQkwCisjZGVmaW5lIENBUkRfREVGQVVMVF9NTE1FX01PREUJCQlET1QxMV9NTE1FX0FVVE8KKyNkZWZpbmUgQ0FSRF9ERUZBVUxUX0NPTkZPUk1BTkNFICAgICAgICAgICAgICAgIE9JRF9JTkxfQ09ORk9STUFOQ0VfTk9ORQorI2RlZmluZSBDQVJEX0RFRkFVTFRfUFJPRklMRQkJCURPVDExX1BST0ZJTEVfTUlYRURfR19XSUZJCisjZGVmaW5lIENBUkRfREVGQVVMVF9NQVhGUkFNRUJVUlNUCQlET1QxMV9NQVhGUkFNRUJVUlNUX01JWEVEX1NBRkUKKworLyogUElNRk9SIHBhY2thZ2UgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgUElNRk9SX0VUSEVSVFlQRSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgyOAorI2RlZmluZSBQSU1GT1JfSEVBREVSX1NJWkUgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgUElNRk9SX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUElNRk9SX09QX0dFVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUElNRk9SX09QX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUElNRk9SX09QX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUElNRk9SX09QX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUElNRk9SX09QX1RSQVAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgUElNRk9SX09QX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgIDUJLyogdGlsbCAyNTUgKi8KKyNkZWZpbmUgUElNRk9SX0RFVl9JRF9NSExJX01JQiAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUElNRk9SX0ZMQUdfQVBQTElDX09SSUdJTiAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUElNRk9SX0ZMQUdfTElUVExFX0VORElBTiAgICAgICAgICAgICAgIDB4MDIKKworc3RhdGljIGlubGluZSB2b2lkCithZGRfbGUzMnAodTMyICogbGVfbnVtYmVyLCB1MzIgYWRkKQoreworCSpsZV9udW1iZXIgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdXAobGVfbnVtYmVyKSArIGFkZCk7Cit9CisKK3ZvaWQgZGlzcGxheV9idWZmZXIoY2hhciAqLCBpbnQpOworCisvKgorICogIFR5cGUgZGVmaW5pdGlvbiBzZWN0aW9uCisgKgorICogIHRoZSBzdHJ1Y3R1cmUgZGVmaW5lcyBvbmx5IHRoZSBoZWFkZXIgYWxsb3dpbmcgY29weWxlc3MKKyAqICBmcmFtZSBoYW5kbGluZworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTggdmVyc2lvbjsKKwl1OCBvcGVyYXRpb247CisJdTMyIG9pZDsKKwl1OCBkZXZpY2VfaWQ7CisJdTggZmxhZ3M7CisJdTMyIGxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCitwaW1mb3JfaGVhZGVyX3Q7CisKKy8qIEEgcmVjZWl2ZWQgYW5kIGludGVycnVwdC1wcm9jZXNzZWQgbWFuYWdlbWVudCBmcmFtZSwgZWl0aGVyIGZvcgorICogc2NoZWR1bGVfd29yayhwcmlzbTU0X3Byb2Nlc3NfdHJhcCkgb3IgZm9yIHByaXYtPm1nbXRfcmVjZWl2ZWQsCisgKiBwcm9jZXNzZWQgYnkgaXNscGNpX21ndF90cmFuc2FjdGlvbigpLiAqLworc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OyAgICAgIC8qIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2UgKi8KKwlwaW1mb3JfaGVhZGVyX3QgKmhlYWRlcjsgICAgICAvKiBwYXlsb2FkIGhlYWRlciwgcG9pbnRzIGludG8gYnVmICovCisJdm9pZCAqZGF0YTsJCSAgICAgIC8qIHBheWxvYWQgZXggaGVhZGVyLCBwb2ludHMgaW50byBidWYgKi8KKyAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IHdzOwkgICAgICAvKiBhcmd1bWVudCBmb3Igc2NoZWR1bGVfd29yaygpICovCisJY2hhciBidWZbMF07CQkgICAgICAvKiBmcmFnbWVudCBidWZmZXIgKi8KK307CisKK2ludAoraXNscGNpX21ndF9yZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KTsKKworaW50Citpc2xwY2lfbWdtdF9yeF9maWxsKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KTsKKwordm9pZAoraXNscGNpX21ndF9jbGVhbnVwX3RyYW5zbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KTsKKworaW50Citpc2xwY2lfbWd0X3RyYW5zYWN0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3BlcmF0aW9uLCB1bnNpZ25lZCBsb25nIG9pZCwKKwkJICAgICAgIHZvaWQgKnNlbmRkYXRhLCBpbnQgc2VuZGxlbiwKKwkJICAgICAgIHN0cnVjdCBpc2xwY2lfbWdtdGZyYW1lICoqcmVjdmZyYW1lKTsKKworc3RhdGljIGlubGluZSB2b2lkCitpc2xwY2lfbWd0X3JlbGVhc2Uoc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKmZyYW1lKQoreworICAgICAgICBrZnJlZShmcmFtZSk7Cit9CisKKyNlbmRpZgkJCQkvKiBfSVNMUENJX01HVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvb2lkX21ndC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMTIzZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuYwpAQCAtMCwwICsxLDkwNyBAQAorLyogICAKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMsMjAwNCBBdXJlbGllbiBBbGxlYXVtZSA8c2x0c0BmcmVlLmZyPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSAicHJpc21jb21wYXQuaCIKKyNpbmNsdWRlICJpc2xwY2lfZGV2LmgiCisjaW5jbHVkZSAiaXNscGNpX21ndC5oIgorI2luY2x1ZGUgImlzbF9vaWQuaCIKKyNpbmNsdWRlICJvaWRfbWd0LmgiCisjaW5jbHVkZSAiaXNsX2lvY3RsLmgiCisKKy8qIHRvIGNvbnZlcnQgYmV0d2VlbiBjaGFubmVsIGFuZCBmcmVxICovCitzdGF0aWMgY29uc3QgaW50IGZyZXF1ZW5jeV9saXN0X2JnW10gPSB7IDI0MTIsIDI0MTcsIDI0MjIsIDI0MjcsIDI0MzIsCisJMjQzNywgMjQ0MiwgMjQ0NywgMjQ1MiwgMjQ1NywgMjQ2MiwgMjQ2NywgMjQ3MiwgMjQ4NAorfTsKKworaW50CitjaGFubmVsX29mX2ZyZXEoaW50IGYpCit7CisJaW50IGMgPSAwOworCisJaWYgKChmID49IDI0MTIpICYmIChmIDw9IDI0ODQpKSB7CisJCXdoaWxlICgoYyA8IDE0KSAmJiAoZiAhPSBmcmVxdWVuY3lfbGlzdF9iZ1tjXSkpCisJCQljKys7CisJCXJldHVybiAoYyA+PSAxNCkgPyAwIDogKytjOworCX0gZWxzZSBpZiAoKGYgPj0gKGludCkgNTAwMCkgJiYgKGYgPD0gKGludCkgNjAwMCkpIHsKKwkJcmV0dXJuICggKGYgLSA1MDAwKSAvIDUgKTsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0lEX1NUUlVDVChuYW1lLG9pZCxzLHQpIFtuYW1lXSA9IHtvaWQsIDAsIHNpemVvZihzKSwgdH0KKyNkZWZpbmUgT0lEX1NUUlVDVF9DKG5hbWUsb2lkLHMsdCkgT0lEX1NUUlVDVChuYW1lLG9pZCxzLHQgfCBPSURfRkxBR19DQUNIRUQpCisjZGVmaW5lIE9JRF9VMzIobmFtZSxvaWQpIE9JRF9TVFJVQ1QobmFtZSxvaWQsdTMyLE9JRF9UWVBFX1UzMikKKyNkZWZpbmUgT0lEX1UzMl9DKG5hbWUsb2lkKSBPSURfU1RSVUNUX0MobmFtZSxvaWQsdTMyLE9JRF9UWVBFX1UzMikKKyNkZWZpbmUgT0lEX1NUUlVDVF9NTE1FKG5hbWUsb2lkKSBPSURfU1RSVUNUKG5hbWUsb2lkLHN0cnVjdCBvYmpfbWxtZSxPSURfVFlQRV9NTE1FKQorI2RlZmluZSBPSURfU1RSVUNUX01MTUVFWChuYW1lLG9pZCkgT0lEX1NUUlVDVChuYW1lLG9pZCxzdHJ1Y3Qgb2JqX21sbWVleCxPSURfVFlQRV9NTE1FRVgpCisKKyNkZWZpbmUgT0lEX1VOS05PV04obmFtZSxvaWQpIE9JRF9TVFJVQ1QobmFtZSxvaWQsMCwwKQorCitzdHJ1Y3Qgb2lkX3QgaXNsX29pZFtdID0geworCU9JRF9TVFJVQ1QoR0VOX09JRF9NQUNBRERSRVNTLCAweDAwMDAwMDAwLCB1OFs2XSwgT0lEX1RZUEVfQUREUiksCisJT0lEX1UzMihHRU5fT0lEX0xJTktTVEFURSwgMHgwMDAwMDAwMSksCisJT0lEX1VOS05PV04oR0VOX09JRF9XQVRDSERPRywgMHgwMDAwMDAwMiksCisJT0lEX1VOS05PV04oR0VOX09JRF9NSUJPUCwgMHgwMDAwMDAwMyksCisJT0lEX1VOS05PV04oR0VOX09JRF9PUFRJT05TLCAweDAwMDAwMDA0KSwKKwlPSURfVU5LTk9XTihHRU5fT0lEX0xFRENPTkZJRywgMHgwMDAwMDAwNSksCisKKwkvKiA4MDIuMTEgKi8KKwlPSURfVTMyX0MoRE9UMTFfT0lEX0JTU1RZUEUsIDB4MTAwMDAwMDApLAorCU9JRF9TVFJVQ1RfQyhET1QxMV9PSURfQlNTSUQsIDB4MTAwMDAwMDEsIHU4WzZdLCBPSURfVFlQRV9SQVcpLAorCU9JRF9TVFJVQ1RfQyhET1QxMV9PSURfU1NJRCwgMHgxMDAwMDAwMiwgc3RydWN0IG9ial9zc2lkLAorCQkgICAgIE9JRF9UWVBFX1NTSUQpLAorCU9JRF9VMzIoRE9UMTFfT0lEX1NUQVRFLCAweDEwMDAwMDAzKSwKKwlPSURfVTMyKERPVDExX09JRF9BSUQsIDB4MTAwMDAwMDQpLAorCU9JRF9TVFJVQ1QoRE9UMTFfT0lEX0NPVU5UUllTVFJJTkcsIDB4MTAwMDAwMDUsIHU4WzRdLCBPSURfVFlQRV9SQVcpLAorCU9JRF9TVFJVQ1RfQyhET1QxMV9PSURfU1NJRE9WRVJSSURFLCAweDEwMDAwMDA2LCBzdHJ1Y3Qgb2JqX3NzaWQsCisJCSAgICAgT0lEX1RZUEVfU1NJRCksCisKKwlPSURfVTMyKERPVDExX09JRF9NRURJVU1MSU1JVCwgMHgxMTAwMDAwMCksCisJT0lEX1UzMl9DKERPVDExX09JRF9CRUFDT05QRVJJT0QsIDB4MTEwMDAwMDEpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0RUSU1QRVJJT0QsIDB4MTEwMDAwMDIpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0FUSU1XSU5ET1csIDB4MTEwMDAwMDMpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0xJU1RFTklOVEVSVkFMLCAweDExMDAwMDA0KSwKKwlPSURfVTMyKERPVDExX09JRF9DRlBQRVJJT0QsIDB4MTEwMDAwMDUpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0NGUERVUkFUSU9OLCAweDExMDAwMDA2KSwKKworCU9JRF9VMzJfQyhET1QxMV9PSURfQVVUSEVOQUJMRSwgMHgxMjAwMDAwMCksCisJT0lEX1UzMl9DKERPVDExX09JRF9QUklWQUNZSU5WT0tFRCwgMHgxMjAwMDAwMSksCisJT0lEX1UzMl9DKERPVDExX09JRF9FWFVORU5DUllQVEVELCAweDEyMDAwMDAyKSwKKwlPSURfVTMyX0MoRE9UMTFfT0lEX0RFRktFWUlELCAweDEyMDAwMDAzKSwKKwlbRE9UMTFfT0lEX0RFRktFWVhdID0gezB4MTIwMDAwMDQsIDMsIHNpemVvZiAoc3RydWN0IG9ial9rZXkpLAorCQkJICAgICAgIE9JRF9GTEFHX0NBQ0hFRCB8IE9JRF9UWVBFX0tFWX0sCS8qIERPVDExX09JRF9ERUZLRVkxLC4uLkRPVDExX09JRF9ERUZLRVk0ICovCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX1NUQUtFWSwgMHgxMjAwMDAwOCksCisJT0lEX1UzMihET1QxMV9PSURfUkVLRVlUSFJFU0hPTEQsIDB4MTIwMDAwMDkpLAorCU9JRF9VTktOT1dOKERPVDExX09JRF9TVEFTQywgMHgxMjAwMDAwYSksCisKKwlPSURfVTMyKERPVDExX09JRF9QUklWVFhSRUpFQ1RFRCwgMHgxYTAwMDAwMCksCisJT0lEX1UzMihET1QxMV9PSURfUFJJVlJYUExBSU4sIDB4MWEwMDAwMDEpLAorCU9JRF9VMzIoRE9UMTFfT0lEX1BSSVZSWEZBSUxFRCwgMHgxYTAwMDAwMiksCisJT0lEX1UzMihET1QxMV9PSURfUFJJVlJYTk9LRVksIDB4MWEwMDAwMDMpLAorCisJT0lEX1UzMl9DKERPVDExX09JRF9SVFNUSFJFU0gsIDB4MTMwMDAwMDApLAorCU9JRF9VMzJfQyhET1QxMV9PSURfRlJBR1RIUkVTSCwgMHgxMzAwMDAwMSksCisJT0lEX1UzMl9DKERPVDExX09JRF9TSE9SVFJFVFJJRVMsIDB4MTMwMDAwMDIpLAorCU9JRF9VMzJfQyhET1QxMV9PSURfTE9OR1JFVFJJRVMsIDB4MTMwMDAwMDMpLAorCU9JRF9VMzJfQyhET1QxMV9PSURfTUFYVFhMSUZFVElNRSwgMHgxMzAwMDAwNCksCisJT0lEX1UzMihET1QxMV9PSURfTUFYUlhMSUZFVElNRSwgMHgxMzAwMDAwNSksCisJT0lEX1UzMihET1QxMV9PSURfQVVUSFJFU1BUSU1FT1VULCAweDEzMDAwMDA2KSwKKwlPSURfVTMyKERPVDExX09JRF9BU1NPQ1JFU1BUSU1FT1VULCAweDEzMDAwMDA3KSwKKworCU9JRF9VTktOT1dOKERPVDExX09JRF9BTE9GVF9UQUJMRSwgMHgxZDAwMDAwMCksCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX0FMT0ZUX0NUUkxfVEFCTEUsIDB4MWQwMDAwMDEpLAorCU9JRF9VTktOT1dOKERPVDExX09JRF9BTE9GVF9SRVRSRUFULCAweDFkMDAwMDAyKSwKKwlPSURfVU5LTk9XTihET1QxMV9PSURfQUxPRlRfUFJPR1JFU1MsIDB4MWQwMDAwMDMpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0FMT0ZUX0ZJWEVEUkFURSwgMHgxZDAwMDAwNCksCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX0FMT0ZUX1JTU0lHUkFQSCwgMHgxZDAwMDAwNSksCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX0FMT0ZUX0NPTkZJRywgMHgxZDAwMDAwNiksCisKKwlbRE9UMTFfT0lEX1ZEQ0ZYXSA9IHsweDFiMDAwMDAwLCA3LCAwLCAwfSwKKwlPSURfVTMyKERPVDExX09JRF9NQVhGUkFNRUJVUlNULCAweDFiMDAwMDA4KSwKKworCU9JRF9VMzIoRE9UMTFfT0lEX1BTTSwgMHgxNDAwMDAwMCksCisJT0lEX1UzMihET1QxMV9PSURfQ0FNVElNRU9VVCwgMHgxNDAwMDAwMSksCisJT0lEX1UzMihET1QxMV9PSURfUkVDRUlWRURUSU1TLCAweDE0MDAwMDAyKSwKKwlPSURfVTMyKERPVDExX09JRF9ST0FNUFJFRkVSRU5DRSwgMHgxNDAwMDAwMyksCisKKwlPSURfVTMyKERPVDExX09JRF9CUklER0VMT0NBTCwgMHgxNTAwMDAwMCksCisJT0lEX1UzMihET1QxMV9PSURfQ0xJRU5UUywgMHgxNTAwMDAwMSksCisJT0lEX1UzMihET1QxMV9PSURfQ0xJRU5UU0FTU09DSUFURUQsIDB4MTUwMDAwMDIpLAorCVtET1QxMV9PSURfQ0xJRU5UWF0gPSB7MHgxNTAwMDAwMywgMjAwNiwgMCwgMH0sCS8qIERPVDExX09JRF9DTElFTlRYLC4uLkRPVDExX09JRF9DTElFTlQyMDA3ICovCisKKwlPSURfU1RSVUNUKERPVDExX09JRF9DTElFTlRGSU5ELCAweDE1MDAwN0RCLCB1OFs2XSwgT0lEX1RZUEVfQUREUiksCisJT0lEX1NUUlVDVChET1QxMV9PSURfV0RTTElOS0FERCwgMHgxNTAwMDdEQywgdThbNl0sIE9JRF9UWVBFX0FERFIpLAorCU9JRF9TVFJVQ1QoRE9UMTFfT0lEX1dEU0xJTktSRU1PVkUsIDB4MTUwMDA3REQsIHU4WzZdLCBPSURfVFlQRV9BRERSKSwKKwlPSURfU1RSVUNUKERPVDExX09JRF9FQVBBVVRIU1RBLCAweDE1MDAwN0RFLCB1OFs2XSwgT0lEX1RZUEVfQUREUiksCisJT0lEX1NUUlVDVChET1QxMV9PSURfRUFQVU5BVVRIU1RBLCAweDE1MDAwN0RGLCB1OFs2XSwgT0lEX1RZUEVfQUREUiksCisJT0lEX1UzMl9DKERPVDExX09JRF9ET1QxWEVOQUJMRSwgMHgxNTAwMDdFMCksCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX01JQ0ZBSUxVUkUsIDB4MTUwMDA3RTEpLAorCU9JRF9VTktOT1dOKERPVDExX09JRF9SRUtFWUlORElDQVRFLCAweDE1MDAwN0UyKSwKKworCU9JRF9VMzIoRE9UMTFfT0lEX01QRFVUWFNVQ0NFU1NGVUwsIDB4MTYwMDAwMDApLAorCU9JRF9VMzIoRE9UMTFfT0lEX01QRFVUWE9ORVJFVFJZLCAweDE2MDAwMDAxKSwKKwlPSURfVTMyKERPVDExX09JRF9NUERVVFhNVUxUSVBMRVJFVFJJRVMsIDB4MTYwMDAwMDIpLAorCU9JRF9VMzIoRE9UMTFfT0lEX01QRFVUWEZBSUxFRCwgMHgxNjAwMDAwMyksCisJT0lEX1UzMihET1QxMV9PSURfTVBEVVJYU1VDQ0VTU0ZVTCwgMHgxNjAwMDAwNCksCisJT0lEX1UzMihET1QxMV9PSURfTVBEVVJYRFVQUywgMHgxNjAwMDAwNSksCisJT0lEX1UzMihET1QxMV9PSURfUlRTU1VDQ0VTU0ZVTCwgMHgxNjAwMDAwNiksCisJT0lEX1UzMihET1QxMV9PSURfUlRTRkFJTEVELCAweDE2MDAwMDA3KSwKKwlPSURfVTMyKERPVDExX09JRF9BQ0tGQUlMRUQsIDB4MTYwMDAwMDgpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0ZSQU1FUkVDRUlWRVMsIDB4MTYwMDAwMDkpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0ZSQU1FRVJST1JTLCAweDE2MDAwMDBBKSwKKwlPSURfVTMyKERPVDExX09JRF9GUkFNRUFCT1JUUywgMHgxNjAwMDAwQiksCisJT0lEX1UzMihET1QxMV9PSURfRlJBTUVBQk9SVFNQSFksIDB4MTYwMDAwMEMpLAorCisJT0lEX1UzMihET1QxMV9PSURfU0xPVFRJTUUsIDB4MTcwMDAwMDApLAorCU9JRF9VMzIoRE9UMTFfT0lEX0NXTUlOLCAweDE3MDAwMDAxKSwKKwlPSURfVTMyKERPVDExX09JRF9DV01BWCwgMHgxNzAwMDAwMiksCisJT0lEX1UzMihET1QxMV9PSURfQUNLV0lORE9XLCAweDE3MDAwMDAzKSwKKwlPSURfVTMyKERPVDExX09JRF9BTlRFTk5BUlgsIDB4MTcwMDAwMDQpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0FOVEVOTkFUWCwgMHgxNzAwMDAwNSksCisJT0lEX1UzMihET1QxMV9PSURfQU5URU5OQURJVkVSU0lUWSwgMHgxNzAwMDAwNiksCisJT0lEX1UzMl9DKERPVDExX09JRF9DSEFOTkVMLCAweDE3MDAwMDA3KSwKKwlPSURfVTMyX0MoRE9UMTFfT0lEX0VEVEhSRVNIT0xELCAweDE3MDAwMDA4KSwKKwlPSURfVTMyKERPVDExX09JRF9QUkVBTUJMRVNFVFRJTkdTLCAweDE3MDAwMDA5KSwKKwlPSURfU1RSVUNUKERPVDExX09JRF9SQVRFUywgMHgxNzAwMDAwQSwgdThbSVdNQVhfQklUUkFURVMgKyAxXSwKKwkJICAgT0lEX1RZUEVfUkFXKSwKKwlPSURfVTMyKERPVDExX09JRF9DQ0FNT0RFU1VQUE9SVEVELCAweDE3MDAwMDBCKSwKKwlPSURfVTMyKERPVDExX09JRF9DQ0FNT0RFLCAweDE3MDAwMDBDKSwKKwlPSURfVU5LTk9XTihET1QxMV9PSURfUlNTSVZFQ1RPUiwgMHgxNzAwMDAwRCksCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX09VVFBVVFBPV0VSVEFCTEUsIDB4MTcwMDAwMEUpLAorCU9JRF9VMzIoRE9UMTFfT0lEX09VVFBVVFBPV0VSLCAweDE3MDAwMDBGKSwKKwlPSURfU1RSVUNUKERPVDExX09JRF9TVVBQT1JURURSQVRFUywgMHgxNzAwMDAxMCwKKwkJICAgdThbSVdNQVhfQklUUkFURVMgKyAxXSwgT0lEX1RZUEVfUkFXKSwKKwlPSURfVTMyX0MoRE9UMTFfT0lEX0ZSRVFVRU5DWSwgMHgxNzAwMDAxMSksCisJW0RPVDExX09JRF9TVVBQT1JURURGUkVRVUVOQ0lFU10gPQorCSAgICB7MHgxNzAwMDAxMiwgMCwgc2l6ZW9mIChzdHJ1Y3Qgb2JqX2ZyZXF1ZW5jaWVzKQorCSAgICAgKyBzaXplb2YgKHUxNikgKiBJV01BWF9GUkVRLCBPSURfVFlQRV9GUkVRVUVOQ0lFU30sCisKKwlPSURfVTMyKERPVDExX09JRF9OT0lTRUZMT09SLCAweDE3MDAwMDEzKSwKKwlPSURfU1RSVUNUKERPVDExX09JRF9GUkVRVUVOQ1lBQ1RJVklUWSwgMHgxNzAwMDAxNCwgdThbSVdNQVhfRlJFUSArIDFdLAorCQkgICBPSURfVFlQRV9SQVcpLAorCU9JRF9VTktOT1dOKERPVDExX09JRF9JUUNBTElCUkFUSU9OVEFCTEUsIDB4MTcwMDAwMTUpLAorCU9JRF9VMzIoRE9UMTFfT0lEX05PTkVSUFBST1RFQ1RJT04sIDB4MTcwMDAwMTYpLAorCU9JRF9VMzIoRE9UMTFfT0lEX1NMT1RTRVRUSU5HUywgMHgxNzAwMDAxNyksCisJT0lEX1UzMihET1QxMV9PSURfTk9ORVJQVElNRU9VVCwgMHgxNzAwMDAxOCksCisJT0lEX1UzMihET1QxMV9PSURfUFJPRklMRVMsIDB4MTcwMDAwMTkpLAorCU9JRF9TVFJVQ1QoRE9UMTFfT0lEX0VYVEVOREVEUkFURVMsIDB4MTcwMDAwMjAsCisJCSAgIHU4W0lXTUFYX0JJVFJBVEVTICsgMV0sIE9JRF9UWVBFX1JBVyksCisKKwlPSURfU1RSVUNUX01MTUUoRE9UMTFfT0lEX0RFQVVUSEVOVElDQVRFLCAweDE4MDAwMDAwKSwKKwlPSURfU1RSVUNUX01MTUUoRE9UMTFfT0lEX0FVVEhFTlRJQ0FURSwgMHgxODAwMDAwMSksCisJT0lEX1NUUlVDVF9NTE1FKERPVDExX09JRF9ESVNBU1NPQ0lBVEUsIDB4MTgwMDAwMDIpLAorCU9JRF9TVFJVQ1RfTUxNRShET1QxMV9PSURfQVNTT0NJQVRFLCAweDE4MDAwMDAzKSwKKwlPSURfVU5LTk9XTihET1QxMV9PSURfU0NBTiwgMHgxODAwMDAwNCksCisJT0lEX1NUUlVDVF9NTE1FRVgoRE9UMTFfT0lEX0JFQUNPTiwgMHgxODAwMDAwNSksCisJT0lEX1NUUlVDVF9NTE1FRVgoRE9UMTFfT0lEX1BST0JFLCAweDE4MDAwMDA2KSwKKwlPSURfU1RSVUNUX01MTUVFWChET1QxMV9PSURfREVBVVRIRU5USUNBVEVFWCwgMHgxODAwMDAwNyksCisJT0lEX1NUUlVDVF9NTE1FRVgoRE9UMTFfT0lEX0FVVEhFTlRJQ0FURUVYLCAweDE4MDAwMDA4KSwKKwlPSURfU1RSVUNUX01MTUVFWChET1QxMV9PSURfRElTQVNTT0NJQVRFRVgsIDB4MTgwMDAwMDkpLAorCU9JRF9TVFJVQ1RfTUxNRUVYKERPVDExX09JRF9BU1NPQ0lBVEVFWCwgMHgxODAwMDAwQSksCisJT0lEX1NUUlVDVF9NTE1FRVgoRE9UMTFfT0lEX1JFQVNTT0NJQVRFLCAweDE4MDAwMDBCKSwKKwlPSURfU1RSVUNUX01MTUVFWChET1QxMV9PSURfUkVBU1NPQ0lBVEVFWCwgMHgxODAwMDAwQyksCisKKwlPSURfVTMyKERPVDExX09JRF9OT05FUlBTVEFUVVMsIDB4MUUwMDAwMDApLAorCisJT0lEX1UzMihET1QxMV9PSURfU1RBVElNRU9VVCwgMHgxOTAwMDAwMCksCisJT0lEX1UzMl9DKERPVDExX09JRF9NTE1FQVVUT0xFVkVMLCAweDE5MDAwMDAxKSwKKwlPSURfVTMyKERPVDExX09JRF9CU1NUSU1FT1VULCAweDE5MDAwMDAyKSwKKwlbRE9UMTFfT0lEX0FUVEFDSE1FTlRdID0gezB4MTkwMDAwMDMsIDAsCisJCXNpemVvZihzdHJ1Y3Qgb2JqX2F0dGFjaG1lbnQpLCBPSURfVFlQRV9BVFRBQ0h9LAorCU9JRF9TVFJVQ1RfQyhET1QxMV9PSURfUFNNQlVGRkVSLCAweDE5MDAwMDA0LCBzdHJ1Y3Qgb2JqX2J1ZmZlciwKKwkJICAgICBPSURfVFlQRV9CVUZGRVIpLAorCisJT0lEX1UzMihET1QxMV9PSURfQlNTUywgMHgxQzAwMDAwMCksCisJW0RPVDExX09JRF9CU1NYXSA9IHsweDFDMDAwMDAxLCA2Mywgc2l6ZW9mIChzdHJ1Y3Qgb2JqX2JzcyksCisJCQkgICAgT0lEX1RZUEVfQlNTfSwJLypET1QxMV9PSURfQlNTMSwuLi4sRE9UMTFfT0lEX0JTUzY0ICovCisJT0lEX1NUUlVDVChET1QxMV9PSURfQlNTRklORCwgMHgxQzAwMDA0Miwgc3RydWN0IG9ial9ic3MsIE9JRF9UWVBFX0JTUyksCisJW0RPVDExX09JRF9CU1NMSVNUXSA9IHsweDFDMDAwMDQzLCAwLCBzaXplb2YgKHN0cnVjdAorCQkJCQkJICAgICAgb2JqX2Jzc2xpc3QpICsKKwkJCSAgICAgICBzaXplb2YgKHN0cnVjdCBvYmpfYnNzW0lXTUFYX0JTU10pLAorCQkJICAgICAgIE9JRF9UWVBFX0JTU0xJU1R9LAorCisJT0lEX1VOS05PV04oT0lEX0lOTF9UVU5ORUwsIDB4RkYwMjAwMDApLAorCU9JRF9VTktOT1dOKE9JRF9JTkxfTUVNQUREUiwgMHhGRjAyMDAwMSksCisJT0lEX1VOS05PV04oT0lEX0lOTF9NRU1PUlksIDB4RkYwMjAwMDIpLAorCU9JRF9VMzJfQyhPSURfSU5MX01PREUsIDB4RkYwMjAwMDMpLAorCU9JRF9VTktOT1dOKE9JRF9JTkxfQ09NUE9ORU5UX05SLCAweEZGMDIwMDA0KSwKKwlPSURfU1RSVUNUKE9JRF9JTkxfVkVSU0lPTiwgMHhGRjAyMDAwNSwgdThbOF0sIE9JRF9UWVBFX1JBVyksCisJT0lEX1VOS05PV04oT0lEX0lOTF9JTlRFUkZBQ0VfSUQsIDB4RkYwMjAwMDYpLAorCU9JRF9VTktOT1dOKE9JRF9JTkxfQ09NUE9ORU5UX0lELCAweEZGMDIwMDA3KSwKKwlPSURfVTMyX0MoT0lEX0lOTF9DT05GSUcsIDB4RkYwMjAwMDgpLAorCU9JRF9VMzJfQyhPSURfSU5MX0RPVDExRF9DT05GT1JNQU5DRSwgMHhGRjAyMDAwQyksCisJT0lEX1UzMihPSURfSU5MX1BIWUNBUEFCSUxJVElFUywgMHhGRjAyMDAwRCksCisJT0lEX1UzMl9DKE9JRF9JTkxfT1VUUFVUUE9XRVIsIDB4RkYwMjAwMEYpLAorCit9OworCitpbnQKK21ndF9pbml0KGlzbHBjaV9wcml2YXRlICpwcml2KQoreworCWludCBpOworCisJcHJpdi0+bWliID0ga21hbGxvYyhPSURfTlVNX0xBU1QgKiBzaXplb2YgKHZvaWQgKiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdi0+bWliKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChwcml2LT5taWIsIDAsIE9JRF9OVU1fTEFTVCAqIHNpemVvZiAodm9pZCAqKSk7CisKKwkvKiBBbGxvYyB0aGUgY2FjaGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgT0lEX05VTV9MQVNUOyBpKyspIHsKKwkJaWYgKGlzbF9vaWRbaV0uZmxhZ3MgJiBPSURfRkxBR19DQUNIRUQpIHsKKwkJCXByaXYtPm1pYltpXSA9IGttYWxsb2MoaXNsX29pZFtpXS5zaXplICoKKwkJCQkJICAgICAgIChpc2xfb2lkW2ldLnJhbmdlICsgMSksCisJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwkJCWlmICghcHJpdi0+bWliW2ldKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJbWVtc2V0KHByaXYtPm1pYltpXSwgMCwKKwkJCSAgICAgICBpc2xfb2lkW2ldLnNpemUgKiAoaXNsX29pZFtpXS5yYW5nZSArIDEpKTsKKwkJfSBlbHNlCisJCQlwcml2LT5taWJbaV0gPSBOVUxMOworCX0KKworCWluaXRfcndzZW0oJnByaXYtPm1pYl9zZW0pOworCXByaXNtNTRfbWliX2luaXQocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAorbWd0X2NsZWFuKGlzbHBjaV9wcml2YXRlICpwcml2KQoreworCWludCBpOworCisJaWYgKCFwcml2LT5taWIpCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgT0lEX05VTV9MQVNUOyBpKyspCisJCWlmIChwcml2LT5taWJbaV0pIHsKKwkJCWtmcmVlKHByaXYtPm1pYltpXSk7CisJCQlwcml2LT5taWJbaV0gPSBOVUxMOworCQl9CisJa2ZyZWUocHJpdi0+bWliKTsKKwlwcml2LT5taWIgPSBOVUxMOworfQorCit2b2lkCittZ3RfbGVfdG9fY3B1KGludCB0eXBlLCB2b2lkICpkYXRhKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgT0lEX1RZUEVfVTMyOgorCQkqKHUzMiAqKSBkYXRhID0gbGUzMl90b19jcHUoKih1MzIgKikgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgT0lEX1RZUEVfQlVGRkVSOnsKKwkJCXN0cnVjdCBvYmpfYnVmZmVyICpidWZmID0gZGF0YTsKKwkJCWJ1ZmYtPnNpemUgPSBsZTMyX3RvX2NwdShidWZmLT5zaXplKTsKKwkJCWJ1ZmYtPmFkZHIgPSBsZTMyX3RvX2NwdShidWZmLT5hZGRyKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBPSURfVFlQRV9CU1M6eworCQkJc3RydWN0IG9ial9ic3MgKmJzcyA9IGRhdGE7CisJCQlic3MtPmFnZSA9IGxlMTZfdG9fY3B1KGJzcy0+YWdlKTsKKwkJCWJzcy0+Y2hhbm5lbCA9IGxlMTZfdG9fY3B1KGJzcy0+Y2hhbm5lbCk7CisJCQlic3MtPmNhcGluZm8gPSBsZTE2X3RvX2NwdShic3MtPmNhcGluZm8pOworCQkJYnNzLT5yYXRlcyA9IGxlMTZfdG9fY3B1KGJzcy0+cmF0ZXMpOworCQkJYnNzLT5iYXNpY19yYXRlcyA9IGxlMTZfdG9fY3B1KGJzcy0+YmFzaWNfcmF0ZXMpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIE9JRF9UWVBFX0JTU0xJU1Q6eworCQkJc3RydWN0IG9ial9ic3NsaXN0ICpsaXN0ID0gZGF0YTsKKwkJCWludCBpOworCQkJbGlzdC0+bnIgPSBsZTMyX3RvX2NwdShsaXN0LT5ucik7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGlzdC0+bnI7IGkrKykKKwkJCQltZ3RfbGVfdG9fY3B1KE9JRF9UWVBFX0JTUywgJmxpc3QtPmJzc2xpc3RbaV0pOworCQkJYnJlYWs7CisJCX0KKwljYXNlIE9JRF9UWVBFX0ZSRVFVRU5DSUVTOnsKKwkJCXN0cnVjdCBvYmpfZnJlcXVlbmNpZXMgKmZyZXEgPSBkYXRhOworCQkJaW50IGk7CisJCQlmcmVxLT5uciA9IGxlMTZfdG9fY3B1KGZyZXEtPm5yKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBmcmVxLT5ucjsgaSsrKQorCQkJCWZyZXEtPm1oeltpXSA9IGxlMTZfdG9fY3B1KGZyZXEtPm1oeltpXSk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgT0lEX1RZUEVfTUxNRTp7CisJCQlzdHJ1Y3Qgb2JqX21sbWUgKm1sbWUgPSBkYXRhOworCQkJbWxtZS0+aWQgPSBsZTE2X3RvX2NwdShtbG1lLT5pZCk7CisJCQltbG1lLT5zdGF0ZSA9IGxlMTZfdG9fY3B1KG1sbWUtPnN0YXRlKTsKKwkJCW1sbWUtPmNvZGUgPSBsZTE2X3RvX2NwdShtbG1lLT5jb2RlKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBPSURfVFlQRV9NTE1FRVg6eworCQkJc3RydWN0IG9ial9tbG1lZXggKm1sbWUgPSBkYXRhOworCQkJbWxtZS0+aWQgPSBsZTE2X3RvX2NwdShtbG1lLT5pZCk7CisJCQltbG1lLT5zdGF0ZSA9IGxlMTZfdG9fY3B1KG1sbWUtPnN0YXRlKTsKKwkJCW1sbWUtPmNvZGUgPSBsZTE2X3RvX2NwdShtbG1lLT5jb2RlKTsKKwkJCW1sbWUtPnNpemUgPSBsZTE2X3RvX2NwdShtbG1lLT5zaXplKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBPSURfVFlQRV9BVFRBQ0g6eworCQkJc3RydWN0IG9ial9hdHRhY2htZW50ICphdHRhY2ggPSBkYXRhOworCQkJYXR0YWNoLT5pZCA9IGxlMTZfdG9fY3B1KGF0dGFjaC0+aWQpOworCQkJYXR0YWNoLT5zaXplID0gbGUxNl90b19jcHUoYXR0YWNoLT5zaXplKTs7IAorCQkJYnJlYWs7CisJfQorCWNhc2UgT0lEX1RZUEVfU1NJRDoKKwljYXNlIE9JRF9UWVBFX0tFWToKKwljYXNlIE9JRF9UWVBFX0FERFI6CisJY2FzZSBPSURfVFlQRV9SQVc6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KK30KKworc3RhdGljIHZvaWQKK21ndF9jcHVfdG9fbGUoaW50IHR5cGUsIHZvaWQgKmRhdGEpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBPSURfVFlQRV9VMzI6CisJCSoodTMyICopIGRhdGEgPSBjcHVfdG9fbGUzMigqKHUzMiAqKSBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBPSURfVFlQRV9CVUZGRVI6eworCQkJc3RydWN0IG9ial9idWZmZXIgKmJ1ZmYgPSBkYXRhOworCQkJYnVmZi0+c2l6ZSA9IGNwdV90b19sZTMyKGJ1ZmYtPnNpemUpOworCQkJYnVmZi0+YWRkciA9IGNwdV90b19sZTMyKGJ1ZmYtPmFkZHIpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIE9JRF9UWVBFX0JTUzp7CisJCQlzdHJ1Y3Qgb2JqX2JzcyAqYnNzID0gZGF0YTsKKwkJCWJzcy0+YWdlID0gY3B1X3RvX2xlMTYoYnNzLT5hZ2UpOworCQkJYnNzLT5jaGFubmVsID0gY3B1X3RvX2xlMTYoYnNzLT5jaGFubmVsKTsKKwkJCWJzcy0+Y2FwaW5mbyA9IGNwdV90b19sZTE2KGJzcy0+Y2FwaW5mbyk7CisJCQlic3MtPnJhdGVzID0gY3B1X3RvX2xlMTYoYnNzLT5yYXRlcyk7CisJCQlic3MtPmJhc2ljX3JhdGVzID0gY3B1X3RvX2xlMTYoYnNzLT5iYXNpY19yYXRlcyk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgT0lEX1RZUEVfQlNTTElTVDp7CisJCQlzdHJ1Y3Qgb2JqX2Jzc2xpc3QgKmxpc3QgPSBkYXRhOworCQkJaW50IGk7CisJCQlsaXN0LT5uciA9IGNwdV90b19sZTMyKGxpc3QtPm5yKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBsaXN0LT5ucjsgaSsrKQorCQkJCW1ndF9jcHVfdG9fbGUoT0lEX1RZUEVfQlNTLCAmbGlzdC0+YnNzbGlzdFtpXSk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgT0lEX1RZUEVfRlJFUVVFTkNJRVM6eworCQkJc3RydWN0IG9ial9mcmVxdWVuY2llcyAqZnJlcSA9IGRhdGE7CisJCQlpbnQgaTsKKwkJCWZyZXEtPm5yID0gY3B1X3RvX2xlMTYoZnJlcS0+bnIpOworCQkJZm9yIChpID0gMDsgaSA8IGZyZXEtPm5yOyBpKyspCisJCQkJZnJlcS0+bWh6W2ldID0gY3B1X3RvX2xlMTYoZnJlcS0+bWh6W2ldKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBPSURfVFlQRV9NTE1FOnsKKwkJCXN0cnVjdCBvYmpfbWxtZSAqbWxtZSA9IGRhdGE7CisJCQltbG1lLT5pZCA9IGNwdV90b19sZTE2KG1sbWUtPmlkKTsKKwkJCW1sbWUtPnN0YXRlID0gY3B1X3RvX2xlMTYobWxtZS0+c3RhdGUpOworCQkJbWxtZS0+Y29kZSA9IGNwdV90b19sZTE2KG1sbWUtPmNvZGUpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIE9JRF9UWVBFX01MTUVFWDp7CisJCQlzdHJ1Y3Qgb2JqX21sbWVleCAqbWxtZSA9IGRhdGE7CisJCQltbG1lLT5pZCA9IGNwdV90b19sZTE2KG1sbWUtPmlkKTsKKwkJCW1sbWUtPnN0YXRlID0gY3B1X3RvX2xlMTYobWxtZS0+c3RhdGUpOworCQkJbWxtZS0+Y29kZSA9IGNwdV90b19sZTE2KG1sbWUtPmNvZGUpOworCQkJbWxtZS0+c2l6ZSA9IGNwdV90b19sZTE2KG1sbWUtPnNpemUpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIE9JRF9UWVBFX0FUVEFDSDp7CisJCQlzdHJ1Y3Qgb2JqX2F0dGFjaG1lbnQgKmF0dGFjaCA9IGRhdGE7CisJCQlhdHRhY2gtPmlkID0gY3B1X3RvX2xlMTYoYXR0YWNoLT5pZCk7CisJCQlhdHRhY2gtPnNpemUgPSBjcHVfdG9fbGUxNihhdHRhY2gtPnNpemUpOzsgCisJCQlicmVhazsKKwl9CisJY2FzZSBPSURfVFlQRV9TU0lEOgorCWNhc2UgT0lEX1RZUEVfS0VZOgorCWNhc2UgT0lEX1RZUEVfQUREUjoKKwljYXNlIE9JRF9UWVBFX1JBVzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCisvKiBOb3RlIDogZGF0YSBpcyBtb2RpZmllZCBkdXJpbmcgdGhpcyBmdW5jdGlvbiAqLworCitpbnQKK21ndF9zZXRfcmVxdWVzdChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgZW51bSBvaWRfbnVtX3QgbiwgaW50IGV4dHJhLCB2b2lkICpkYXRhKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBpc2xwY2lfbWdtdGZyYW1lICpyZXNwb25zZSA9IE5VTEw7CisJaW50IHJlc3BvbnNlX29wID0gUElNRk9SX09QX0VSUk9SOworCWludCBkbGVuOworCXZvaWQgKmNhY2hlLCAqX2RhdGEgPSBkYXRhOworCXUzMiBvaWQ7CisKKwlCVUdfT04oT0lEX05VTV9MQVNUIDw9IG4pOworCUJVR19PTihleHRyYSA+IGlzbF9vaWRbbl0ucmFuZ2UpOworCisJaWYgKCFwcml2LT5taWIpCisJCS8qIG1lbW9yeSBoYXMgYmVlbiBmcmVlZCAqLworCQlyZXR1cm4gLTE7CisKKwlkbGVuID0gaXNsX29pZFtuXS5zaXplOworCWNhY2hlID0gcHJpdi0+bWliW25dOworCWNhY2hlICs9IChjYWNoZSA/IGV4dHJhICogZGxlbiA6IDApOworCW9pZCA9IGlzbF9vaWRbbl0ub2lkICsgZXh0cmE7CisKKwlpZiAoX2RhdGEgPT0gTlVMTCkKKwkJLyogd2UgYXJlIHJlcXVlc3RlZCB0byByZS1zZXQgYSBjYWNoZWQgdmFsdWUgKi8KKwkJX2RhdGEgPSBjYWNoZTsKKwllbHNlCisJCW1ndF9jcHVfdG9fbGUoaXNsX29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUsIF9kYXRhKTsKKwkvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gd3JpdGUgdG8gdGhlIGNhY2hlLCB3ZSBkb24ndCB3YW50IGFueW9uZSB0byByZWFkCisJICogaXQgLT4gYWNxdWlyZSB3cml0ZSBsb2NrLgorCSAqIEVsc2Ugd2UgY291bGQgYWNxdWlyZSBhIHJlYWQgbG9jayB0byBiZSBzdXJlIHdlIGRvbid0IGJvdGhlciB0aGUKKwkgKiBjb21taXQgcHJvY2VzcyAod2hpY2ggdGFrZXMgYSB3cml0ZSBsb2NrKS4gQnV0IEknbSBub3Qgc3VyZSBpZiBpdCdzCisJICogbmVlZGVkLgorCSAqLworCWlmIChjYWNoZSkKKwkJZG93bl93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSA+PSBQUlZfU1RBVEVfUkVBRFkpIHsKKwkJcmV0ID0gaXNscGNpX21ndF90cmFuc2FjdGlvbihwcml2LT5uZGV2LCBQSU1GT1JfT1BfU0VULCBvaWQsCisJCQkJCSAgICAgX2RhdGEsIGRsZW4sICZyZXNwb25zZSk7CisJCWlmICghcmV0KSB7CisJCQlyZXNwb25zZV9vcCA9IHJlc3BvbnNlLT5oZWFkZXItPm9wZXJhdGlvbjsKKwkJCWlzbHBjaV9tZ3RfcmVsZWFzZShyZXNwb25zZSk7CisJCX0KKwkJaWYgKHJldCB8fCByZXNwb25zZV9vcCA9PSBQSU1GT1JfT1BfRVJST1IpCisJCQlyZXQgPSAtRUlPOworCX0gZWxzZSBpZiAoIWNhY2hlKQorCQlyZXQgPSAtRUlPOworCisJaWYgKGNhY2hlKSB7CisJCWlmICghcmV0ICYmIGRhdGEpCisJCQltZW1jcHkoY2FjaGUsIF9kYXRhLCBkbGVuKTsKKwkJdXBfd3JpdGUoJnByaXYtPm1pYl9zZW0pOworCX0KKworCS8qIHJlLXNldCBnaXZlbiBkYXRhIHRvIHdoYXQgaXQgd2FzICovCisJaWYgKGRhdGEpCisJCW1ndF9sZV90b19jcHUoaXNsX29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUsIGRhdGEpOworCisJcmV0dXJuIHJldDsKK30KKworLyogTm9uZSBvZiB0aGVzZSBhcmUgY2FjaGVkICovCitpbnQKK21ndF9zZXRfdmFybGVuKGlzbHBjaV9wcml2YXRlICpwcml2LCBlbnVtIG9pZF9udW1fdCBuLCB2b2lkICpkYXRhLCBpbnQgZXh0cmFfbGVuKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBpc2xwY2lfbWdtdGZyYW1lICpyZXNwb25zZTsKKwlpbnQgcmVzcG9uc2Vfb3AgPSBQSU1GT1JfT1BfRVJST1I7CisJaW50IGRsZW47CisJdTMyIG9pZDsKKworCUJVR19PTihPSURfTlVNX0xBU1QgPD0gbik7CisKKwlkbGVuID0gaXNsX29pZFtuXS5zaXplOworCW9pZCA9IGlzbF9vaWRbbl0ub2lkOworCisJbWd0X2NwdV90b19sZShpc2xfb2lkW25dLmZsYWdzICYgT0lEX0ZMQUdfVFlQRSwgZGF0YSk7CisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSA+PSBQUlZfU1RBVEVfUkVBRFkpIHsKKwkJcmV0ID0gaXNscGNpX21ndF90cmFuc2FjdGlvbihwcml2LT5uZGV2LCBQSU1GT1JfT1BfU0VULCBvaWQsCisJCQkJCSAgICAgZGF0YSwgZGxlbiArIGV4dHJhX2xlbiwgJnJlc3BvbnNlKTsKKwkJaWYgKCFyZXQpIHsKKwkJCXJlc3BvbnNlX29wID0gcmVzcG9uc2UtPmhlYWRlci0+b3BlcmF0aW9uOworCQkJaXNscGNpX21ndF9yZWxlYXNlKHJlc3BvbnNlKTsKKwkJfQorCQlpZiAocmV0IHx8IHJlc3BvbnNlX29wID09IFBJTUZPUl9PUF9FUlJPUikKKwkJCXJldCA9IC1FSU87CisJfSBlbHNlIAorCQlyZXQgPSAtRUlPOworCisJLyogcmUtc2V0IGdpdmVuIGRhdGEgdG8gd2hhdCBpdCB3YXMgKi8KKwlpZiAoZGF0YSkKKwkJbWd0X2xlX3RvX2NwdShpc2xfb2lkW25dLmZsYWdzICYgT0lEX0ZMQUdfVFlQRSwgZGF0YSk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK21ndF9nZXRfcmVxdWVzdChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgZW51bSBvaWRfbnVtX3QgbiwgaW50IGV4dHJhLCB2b2lkICpkYXRhLAorCQl1bmlvbiBvaWRfcmVzX3QgKnJlcykKK3sKKworCWludCByZXQgPSAtRUlPOworCWludCByZXNsZW4gPSAwOworCXN0cnVjdCBpc2xwY2lfbWdtdGZyYW1lICpyZXNwb25zZSA9IE5VTEw7CisKKwlpbnQgZGxlbjsKKwl2b2lkICpjYWNoZSwgKl9yZXMgPSBOVUxMOworCXUzMiBvaWQ7CisKKwlCVUdfT04oT0lEX05VTV9MQVNUIDw9IG4pOworCUJVR19PTihleHRyYSA+IGlzbF9vaWRbbl0ucmFuZ2UpOworCisJcmVzLT5wdHIgPSBOVUxMOworCisJaWYgKCFwcml2LT5taWIpCisJCS8qIG1lbW9yeSBoYXMgYmVlbiBmcmVlZCAqLworCQlyZXR1cm4gLTE7CisKKwlkbGVuID0gaXNsX29pZFtuXS5zaXplOworCWNhY2hlID0gcHJpdi0+bWliW25dOworCWNhY2hlICs9IGNhY2hlID8gZXh0cmEgKiBkbGVuIDogMDsKKwlvaWQgPSBpc2xfb2lkW25dLm9pZCArIGV4dHJhOworCXJlc2xlbiA9IGRsZW47CisKKwlpZiAoY2FjaGUpCisJCWRvd25fcmVhZCgmcHJpdi0+bWliX3NlbSk7CisKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSA+PSBQUlZfU1RBVEVfUkVBRFkpIHsKKwkJcmV0ID0gaXNscGNpX21ndF90cmFuc2FjdGlvbihwcml2LT5uZGV2LCBQSU1GT1JfT1BfR0VULAorCQkJCQkgICAgIG9pZCwgZGF0YSwgZGxlbiwgJnJlc3BvbnNlKTsKKwkJaWYgKHJldCB8fCAhcmVzcG9uc2UgfHwKKwkJICAgIHJlc3BvbnNlLT5oZWFkZXItPm9wZXJhdGlvbiA9PSBQSU1GT1JfT1BfRVJST1IpIHsKKwkJCWlmIChyZXNwb25zZSkKKwkJCQlpc2xwY2lfbWd0X3JlbGVhc2UocmVzcG9uc2UpOworCQkJcmV0ID0gLUVJTzsKKwkJfQorCQlpZiAoIXJldCkgeworCQkJX3JlcyA9IHJlc3BvbnNlLT5kYXRhOworCQkJcmVzbGVuID0gcmVzcG9uc2UtPmhlYWRlci0+bGVuZ3RoOworCQl9CisJfSBlbHNlIGlmIChjYWNoZSkgeworCQlfcmVzID0gY2FjaGU7CisJCXJldCA9IDA7CisJfQorCWlmICgoaXNsX29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUpID09IE9JRF9UWVBFX1UzMikKKwkJcmVzLT51ID0gcmV0ID8gMCA6IGxlMzJfdG9fY3B1KCoodTMyICopIF9yZXMpOworCWVsc2UgeworCQlyZXMtPnB0ciA9IGttYWxsb2MocmVzbGVuLCBHRlBfS0VSTkVMKTsKKwkJQlVHX09OKHJlcy0+cHRyID09IE5VTEwpOworCQlpZiAocmV0KQorCQkJbWVtc2V0KHJlcy0+cHRyLCAwLCByZXNsZW4pOworCQllbHNlIHsKKwkJCW1lbWNweShyZXMtPnB0ciwgX3JlcywgcmVzbGVuKTsKKwkJCW1ndF9sZV90b19jcHUoaXNsX29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUsCisJCQkJICAgICAgcmVzLT5wdHIpOworCQl9CisJfQorCWlmIChjYWNoZSkKKwkJdXBfcmVhZCgmcHJpdi0+bWliX3NlbSk7CisKKwlpZiAocmVzcG9uc2UgJiYgIXJldCkKKwkJaXNscGNpX21ndF9yZWxlYXNlKHJlc3BvbnNlKTsKKworCWlmIChyZXNsZW4gPiBpc2xfb2lkW25dLnNpemUpCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAibWd0X2dldF9yZXF1ZXN0KDB4JXgpOiByZWNlaXZlZCBkYXRhIGxlbmd0aCB3YXMgYmlnZ2VyICIKKwkJICAgICAgICJ0aGFuIGV4cGVjdGVkICglZCA+ICVkKS4gTWVtb3J5IGlzIHByb2JhYmx5IGNvcnJ1cHRlZC4uLiIsCisJCSAgICAgICBvaWQsIHJlc2xlbiwgaXNsX29pZFtuXS5zaXplKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIGxvY2sgb3V0c2lkZSAqLworaW50CittZ3RfY29tbWl0X2xpc3QoaXNscGNpX3ByaXZhdGUgKnByaXYsIGVudW0gb2lkX251bV90ICpsLCBpbnQgbikKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKwlzdHJ1Y3QgaXNscGNpX21nbXRmcmFtZSAqcmVzcG9uc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCXN0cnVjdCBvaWRfdCAqdCA9ICYoaXNsX29pZFtsW2ldXSk7CisJCXZvaWQgKmRhdGEgPSBwcml2LT5taWJbbFtpXV07CisJCWludCBqID0gMDsKKwkJdTMyIG9pZCA9IHQtPm9pZDsKKwkJQlVHX09OKGRhdGEgPT0gTlVMTCk7CisJCXdoaWxlIChqIDw9IHQtPnJhbmdlKSB7CisJCQlpbnQgciA9IGlzbHBjaV9tZ3RfdHJhbnNhY3Rpb24ocHJpdi0+bmRldiwgUElNRk9SX09QX1NFVCwKKwkJCQkJCSAgICAgIG9pZCwgZGF0YSwgdC0+c2l6ZSwKKwkJCQkJCSAgICAgICZyZXNwb25zZSk7CisJCQlpZiAocmVzcG9uc2UpIHsKKwkJCQlyIHw9IChyZXNwb25zZS0+aGVhZGVyLT5vcGVyYXRpb24gPT0gUElNRk9SX09QX0VSUk9SKTsKKwkJCQlpc2xwY2lfbWd0X3JlbGVhc2UocmVzcG9uc2UpOworCQkJfQorCQkJaWYgKHIpCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogbWd0X2NvbW1pdF9saXN0OiBmYWlsdXJlLiAiCisJCQkJCSJvaWQ9JTA4eCBlcnI9JWRcbiIsCisJCQkJCXByaXYtPm5kZXYtPm5hbWUsIG9pZCwgcik7CisJCQlyZXQgfD0gcjsKKwkJCWorKzsKKwkJCW9pZCsrOworCQkJZGF0YSArPSB0LT5zaXplOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIExvY2sgb3V0c2lkZSAqLworCit2b2lkCittZ3Rfc2V0KGlzbHBjaV9wcml2YXRlICpwcml2LCBlbnVtIG9pZF9udW1fdCBuLCB2b2lkICpkYXRhKQoreworCUJVR19PTihPSURfTlVNX0xBU1QgPD0gbik7CisJQlVHX09OKHByaXYtPm1pYltuXSA9PSBOVUxMKTsKKworCW1lbWNweShwcml2LT5taWJbbl0sIGRhdGEsIGlzbF9vaWRbbl0uc2l6ZSk7CisJbWd0X2NwdV90b19sZShpc2xfb2lkW25dLmZsYWdzICYgT0lEX0ZMQUdfVFlQRSwgcHJpdi0+bWliW25dKTsKK30KKwordm9pZAorbWd0X2dldChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgZW51bSBvaWRfbnVtX3Qgbiwgdm9pZCAqcmVzKQoreworCUJVR19PTihPSURfTlVNX0xBU1QgPD0gbik7CisJQlVHX09OKHByaXYtPm1pYltuXSA9PSBOVUxMKTsKKwlCVUdfT04ocmVzID09IE5VTEwpOworCisJbWVtY3B5KHJlcywgcHJpdi0+bWliW25dLCBpc2xfb2lkW25dLnNpemUpOworCW1ndF9sZV90b19jcHUoaXNsX29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUsIHJlcyk7Cit9CisKKy8qIENvbW1pdHMgdGhlIGNhY2hlLiBMb2NrIG91dHNpZGUuICovCisKK3N0YXRpYyBlbnVtIG9pZF9udW1fdCBjb21taXRfcGFydDFbXSA9IHsKKwlPSURfSU5MX0NPTkZJRywKKwlPSURfSU5MX01PREUsCisJRE9UMTFfT0lEX0JTU1RZUEUsCisJRE9UMTFfT0lEX0NIQU5ORUwsCisJRE9UMTFfT0lEX01MTUVBVVRPTEVWRUwKK307CisKK3N0YXRpYyBlbnVtIG9pZF9udW1fdCBjb21taXRfcGFydDJbXSA9IHsKKwlET1QxMV9PSURfU1NJRCwKKwlET1QxMV9PSURfUFNNQlVGRkVSLAorCURPVDExX09JRF9BVVRIRU5BQkxFLAorCURPVDExX09JRF9QUklWQUNZSU5WT0tFRCwKKwlET1QxMV9PSURfRVhVTkVOQ1JZUFRFRCwKKwlET1QxMV9PSURfREVGS0VZWCwJLyogTVVMVElQTEUgKi8KKwlET1QxMV9PSURfREVGS0VZSUQsCisJRE9UMTFfT0lEX0RPVDFYRU5BQkxFLAorCU9JRF9JTkxfRE9UMTFEX0NPTkZPUk1BTkNFLAorCS8qIERvIG5vdCBpbml0aWFsaXplIHRoaXMgLSBmdyA8IDEuMC40LjMgcmVqZWN0cyBpdAorCU9JRF9JTkxfT1VUUFVUUE9XRVIsCisJKi8KK307CisKKy8qIHVwZGF0ZSB0aGUgTUFDIGFkZHIuICovCitzdGF0aWMgaW50CittZ3RfdXBkYXRlX2FkZHIoaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKnJlczsKKwlpbnQgcmV0OworCisJcmV0ID0gaXNscGNpX21ndF90cmFuc2FjdGlvbihwcml2LT5uZGV2LCBQSU1GT1JfT1BfR0VULAorCQkJCSAgICAgaXNsX29pZFtHRU5fT0lEX01BQ0FERFJFU1NdLm9pZCwgTlVMTCwKKwkJCQkgICAgIGlzbF9vaWRbR0VOX09JRF9NQUNBRERSRVNTXS5zaXplLCAmcmVzKTsKKworCWlmICgocmV0ID09IDApICYmIHJlcyAmJiAocmVzLT5oZWFkZXItPm9wZXJhdGlvbiAhPSBQSU1GT1JfT1BfRVJST1IpKQorCQltZW1jcHkocHJpdi0+bmRldi0+ZGV2X2FkZHIsIHJlcy0+ZGF0YSwgNik7CisJZWxzZQorCQlyZXQgPSAtRUlPOworCWlmIChyZXMpCisJCWlzbHBjaV9tZ3RfcmVsZWFzZShyZXMpOworCisJaWYgKHJldCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogbWd0X3VwZGF0ZV9hZGRyOiBmYWlsdXJlXG4iLCBwcml2LT5uZGV2LT5uYW1lKTsKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFZFQ19TSVpFKGEpIChzaXplb2YoYSkvc2l6ZW9mKGFbMF0pKQorCitpbnQKK21ndF9jb21taXQoaXNscGNpX3ByaXZhdGUgKnByaXYpCit7CisJaW50IHJ2YWx1ZTsKKwl1MzIgdTsKKworCWlmIChpc2xwY2lfZ2V0X3N0YXRlKHByaXYpIDwgUFJWX1NUQVRFX0lOSVQpCisJCXJldHVybiAwOworCisJcnZhbHVlID0gbWd0X2NvbW1pdF9saXN0KHByaXYsIGNvbW1pdF9wYXJ0MSwgVkVDX1NJWkUoY29tbWl0X3BhcnQxKSk7CisKKwlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX01PTklUT1IpCisJCXJ2YWx1ZSB8PSBtZ3RfY29tbWl0X2xpc3QocHJpdiwgY29tbWl0X3BhcnQyLCBWRUNfU0laRShjb21taXRfcGFydDIpKTsKKworCXUgPSBPSURfSU5MX01PREU7CisJcnZhbHVlIHw9IG1ndF9jb21taXRfbGlzdChwcml2LCAmdSwgMSk7CisJcnZhbHVlIHw9IG1ndF91cGRhdGVfYWRkcihwcml2KTsKKworCWlmIChydmFsdWUpIHsKKwkJLyogc29tZSByZXF1ZXN0IGhhdmUgZmFpbGVkLiBUaGUgZGV2aWNlIG1pZ2h0IGJlIGluIGFuCisJCSAgIGluY29oZXJlbnQgc3RhdGUuIFdlIHNob3VsZCByZXNldCBpdCAhICovCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogbWd0X2NvbW1pdDogZmFpbHVyZVxuIiwgcHJpdi0+bmRldi0+bmFtZSk7CisJfQorCXJldHVybiBydmFsdWU7Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgT0lEcyBuZWVkIHRvIGJlICJ1bmxhdGNoZWQiOgorICoKKyAqIE1FRElVTUxJTUlULEJFQUNPTlBFUklPRCxEVElNUEVSSU9ELEFUSU1XSU5ET1csTElTVEVOSU5URVJWQUwKKyAqIEZSRVFVRU5DWSxFWFRFTkRFRFJBVEVTLgorICoKKyAqIFRoZSB3YXkgdG8gZG8gdGhpcyBpcyB0byBzZXQgRVNTSUQuIE5vdGUgdGhvdWdoIHRoYXQgdGhleSBtYXkgZ2V0IAorICogdW5sYXRjaCBiZWZvcmUgdGhvdWdoIGJ5IHNldHRpbmcgYW5vdGhlciBPSUQuICovCisjaWYgMAordm9pZAorbWd0X3VubGF0Y2hfYWxsKGlzbHBjaV9wcml2YXRlICpwcml2KQoreworCXUzMiB1OworCWludCBydmFsdWUgPSAwOworCisJaWYgKGlzbHBjaV9nZXRfc3RhdGUocHJpdikgPCBQUlZfU1RBVEVfSU5JVCkKKwkJcmV0dXJuOworCisJdSA9IERPVDExX09JRF9TU0lEOworCXJ2YWx1ZSA9IG1ndF9jb21taXRfbGlzdChwcml2LCAmdSwgMSk7CisJLyogTmVjZXNzYXJ5IGlmIGluIE1BTlVBTCBSVU4gbW9kZT8gKi8KKyNpZiAwCisJdSA9IE9JRF9JTkxfTU9ERTsKKwlydmFsdWUgfD0gbWd0X2NvbW1pdF9saXN0KHByaXYsICZ1LCAxKTsKKworCXUgPSBET1QxMV9PSURfTUxNRUFVVE9MRVZFTDsKKwlydmFsdWUgfD0gbWd0X2NvbW1pdF9saXN0KHByaXYsICZ1LCAxKTsKKworCXUgPSBPSURfSU5MX01PREU7CisJcnZhbHVlIHw9IG1ndF9jb21taXRfbGlzdChwcml2LCAmdSwgMSk7CisjZW5kaWYKKworCWlmIChydmFsdWUpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogVW5sYXRjaGluZyBPSURzIGZhaWxlZFxuIiwgcHJpdi0+bmRldi0+bmFtZSk7Cit9CisjZW5kaWYKKworLyogVGhpcyB3aWxsIHRlbGwgeW91IGlmIHlvdSBhcmUgYWxsb3dlZCB0byBhbnN3ZXIgYSBtbG1lKGV4KSByZXF1ZXN0IC4qLworCitpbnQKK21ndF9tbG1lX2Fuc3dlcihpc2xwY2lfcHJpdmF0ZSAqcHJpdikKK3sKKwl1MzIgbWxtZWF1dG9sZXZlbDsKKwkvKiBBY3F1aXJlIGEgcmVhZCBsb2NrIGJlY2F1c2UgaWYgd2UgYXJlIGluIGEgbW9kZSBjaGFuZ2UsIGl0J3MKKwkgKiBwb3NzaWJsZSB0byBhbnN3ZXIgdHJ1ZSwgd2hpbGUgdGhlIGNhcmQgaXMgbGVhdmluZyBtYXN0ZXIgdG8gbWFuYWdlZAorCSAqIG1vZGUuIEFuc3dlcmluZyB0byBhIG1sbWUgaW4gdGhpcyBzaXR1YXRpb24gY291bGQgaGFuZyB0aGUgY2FyZC4KKwkgKi8KKwlkb3duX3JlYWQoJnByaXYtPm1pYl9zZW0pOworCW1sbWVhdXRvbGV2ZWwgPQorCSAgICBsZTMyX3RvX2NwdSgqKHUzMiAqKSBwcml2LT5taWJbRE9UMTFfT0lEX01MTUVBVVRPTEVWRUxdKTsKKwl1cF9yZWFkKCZwcml2LT5taWJfc2VtKTsKKworCXJldHVybiAoKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpICYmCisJCShtbG1lYXV0b2xldmVsID49IERPVDExX01MTUVfSU5URVJNRURJQVRFKSk7Cit9CisKK2VudW0gb2lkX251bV90CittZ3Rfb2lkdG9udW0odTMyIG9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBPSURfTlVNX0xBU1Q7IGkrKykKKwkJaWYgKGlzbF9vaWRbaV0ub2lkID09IG9pZCkKKwkJCXJldHVybiBpOworCisJcHJpbnRrKEtFUk5fREVCVUcgImxvb2tpbmcgZm9yIGFuIHVua25vd24gb2lkIDB4JXgiLCBvaWQpOworCisJcmV0dXJuIE9JRF9OVU1fTEFTVDsKK30KKworaW50CittZ3RfcmVzcG9uc2VfdG9fc3RyKGVudW0gb2lkX251bV90IG4sIHVuaW9uIG9pZF9yZXNfdCAqciwgY2hhciAqc3RyKQoreworCXN3aXRjaCAoaXNsX29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUpIHsKKwljYXNlIE9JRF9UWVBFX1UzMjoKKwkJcmV0dXJuIHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwgIiV1XG4iLCByLT51KTsKKwkJYnJlYWs7CisJY2FzZSBPSURfVFlQRV9CVUZGRVI6eworCQkJc3RydWN0IG9ial9idWZmZXIgKmJ1ZmYgPSByLT5wdHI7CisJCQlyZXR1cm4gc25wcmludGYoc3RyLCBQUklWX1NUUl9TSVpFLAorCQkJCQkic2l6ZT0ldVxuYWRkcj0weCVYXG4iLCBidWZmLT5zaXplLAorCQkJCQlidWZmLT5hZGRyKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX0JTUzp7CisJCQlzdHJ1Y3Qgb2JqX2JzcyAqYnNzID0gci0+cHRyOworCQkJcmV0dXJuIHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwKKwkJCQkJImFnZT0ldVxuY2hhbm5lbD0ldVxuIgorCQkJCQkiY2FwaW5mbz0weCVYXG5yYXRlcz0weCVYXG4iCisJCQkJCSJiYXNpY19yYXRlcz0weCVYXG4iLCBic3MtPmFnZSwKKwkJCQkJYnNzLT5jaGFubmVsLCBic3MtPmNhcGluZm8sCisJCQkJCWJzcy0+cmF0ZXMsIGJzcy0+YmFzaWNfcmF0ZXMpOworCQl9CisJCWJyZWFrOworCWNhc2UgT0lEX1RZUEVfQlNTTElTVDp7CisJCQlzdHJ1Y3Qgb2JqX2Jzc2xpc3QgKmxpc3QgPSByLT5wdHI7CisJCQlpbnQgaSwgazsKKwkJCWsgPSBzbnByaW50ZihzdHIsIFBSSVZfU1RSX1NJWkUsICJucj0ldVxuIiwgbGlzdC0+bnIpOworCQkJZm9yIChpID0gMDsgaSA8IGxpc3QtPm5yOyBpKyspCisJCQkJayArPSBzbnByaW50ZihzdHIgKyBrLCBQUklWX1NUUl9TSVpFIC0gaywKKwkJCQkJICAgICAgImJzc1sldV0gOiBcbmFnZT0ldVxuY2hhbm5lbD0ldVxuIgorCQkJCQkgICAgICAiY2FwaW5mbz0weCVYXG5yYXRlcz0weCVYXG4iCisJCQkJCSAgICAgICJiYXNpY19yYXRlcz0weCVYXG4iLAorCQkJCQkgICAgICBpLCBsaXN0LT5ic3NsaXN0W2ldLmFnZSwKKwkJCQkJICAgICAgbGlzdC0+YnNzbGlzdFtpXS5jaGFubmVsLAorCQkJCQkgICAgICBsaXN0LT5ic3NsaXN0W2ldLmNhcGluZm8sCisJCQkJCSAgICAgIGxpc3QtPmJzc2xpc3RbaV0ucmF0ZXMsCisJCQkJCSAgICAgIGxpc3QtPmJzc2xpc3RbaV0uYmFzaWNfcmF0ZXMpOworCQkJcmV0dXJuIGs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBPSURfVFlQRV9GUkVRVUVOQ0lFUzp7CisJCQlzdHJ1Y3Qgb2JqX2ZyZXF1ZW5jaWVzICpmcmVxID0gci0+cHRyOworCQkJaW50IGksIHQ7CisJCQlwcmludGsoIm5yIDogJXVcbiIsIGZyZXEtPm5yKTsKKwkJCXQgPSBzbnByaW50ZihzdHIsIFBSSVZfU1RSX1NJWkUsICJucj0ldVxuIiwgZnJlcS0+bnIpOworCQkJZm9yIChpID0gMDsgaSA8IGZyZXEtPm5yOyBpKyspCisJCQkJdCArPSBzbnByaW50ZihzdHIgKyB0LCBQUklWX1NUUl9TSVpFIC0gdCwKKwkJCQkJICAgICAgIm1oelsldV09JXVcbiIsIGksIGZyZXEtPm1oeltpXSk7CisJCQlyZXR1cm4gdDsKKwkJfQorCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX01MTUU6eworCQkJc3RydWN0IG9ial9tbG1lICptbG1lID0gci0+cHRyOworCQkJcmV0dXJuIHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwKKwkJCQkJImlkPTB4JVhcbnN0YXRlPTB4JVhcbmNvZGU9MHglWFxuIiwKKwkJCQkJbWxtZS0+aWQsIG1sbWUtPnN0YXRlLCBtbG1lLT5jb2RlKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX01MTUVFWDp7CisJCQlzdHJ1Y3Qgb2JqX21sbWVleCAqbWxtZSA9IHItPnB0cjsKKwkJCXJldHVybiBzbnByaW50ZihzdHIsIFBSSVZfU1RSX1NJWkUsCisJCQkJCSJpZD0weCVYXG5zdGF0ZT0weCVYXG4iCisJCQkJCSJjb2RlPTB4JVhcbnNpemU9MHglWFxuIiwgbWxtZS0+aWQsCisJCQkJCW1sbWUtPnN0YXRlLCBtbG1lLT5jb2RlLCBtbG1lLT5zaXplKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX0FUVEFDSDp7CisJCQlzdHJ1Y3Qgb2JqX2F0dGFjaG1lbnQgKmF0dGFjaCA9IHItPnB0cjsKKwkJCXJldHVybiBzbnByaW50ZihzdHIsIFBSSVZfU1RSX1NJWkUsCisJCQkJCSJpZD0lZFxuc2l6ZT0lZFxuIiwKKwkJCQkJYXR0YWNoLT5pZCwKKwkJCQkJYXR0YWNoLT5zaXplKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX1NTSUQ6eworCQkJc3RydWN0IG9ial9zc2lkICpzc2lkID0gci0+cHRyOworCQkJcmV0dXJuIHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwKKwkJCQkJImxlbmd0aD0ldVxub2N0ZXRzPSUuKnNcbiIsCisJCQkJCXNzaWQtPmxlbmd0aCwgc3NpZC0+bGVuZ3RoLAorCQkJCQlzc2lkLT5vY3RldHMpOworCQl9CisJCWJyZWFrOworCWNhc2UgT0lEX1RZUEVfS0VZOnsKKwkJCXN0cnVjdCBvYmpfa2V5ICprZXkgPSByLT5wdHI7CisJCQlpbnQgdCwgaTsKKwkJCXQgPSBzbnByaW50ZihzdHIsIFBSSVZfU1RSX1NJWkUsCisJCQkJICAgICAidHlwZT0weCVYXG5sZW5ndGg9MHglWFxua2V5PTB4IiwKKwkJCQkgICAgIGtleS0+dHlwZSwga2V5LT5sZW5ndGgpOworCQkJZm9yIChpID0gMDsgaSA8IGtleS0+bGVuZ3RoOyBpKyspCisJCQkJdCArPSBzbnByaW50ZihzdHIgKyB0LCBQUklWX1NUUl9TSVpFIC0gdCwKKwkJCQkJICAgICAgIiUwMlg6Iiwga2V5LT5rZXlbaV0pOworCQkJdCArPSBzbnByaW50ZihzdHIgKyB0LCBQUklWX1NUUl9TSVpFIC0gdCwgIlxuIik7CisJCQlyZXR1cm4gdDsKKwkJfQorCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX1JBVzoKKwljYXNlIE9JRF9UWVBFX0FERFI6eworCQkJdW5zaWduZWQgY2hhciAqYnVmZiA9IHItPnB0cjsKKwkJCWludCB0LCBpOworCQkJdCA9IHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwgImhleCBkYXRhPSIpOworCQkJZm9yIChpID0gMDsgaSA8IGlzbF9vaWRbbl0uc2l6ZTsgaSsrKQorCQkJCXQgKz0gc25wcmludGYoc3RyICsgdCwgUFJJVl9TVFJfU0laRSAtIHQsCisJCQkJCSAgICAgICIlMDJYOiIsIGJ1ZmZbaV0pOworCQkJdCArPSBzbnByaW50ZihzdHIgKyB0LCBQUklWX1NUUl9TSVpFIC0gdCwgIlxuIik7CisJCQlyZXR1cm4gdDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvb2lkX21ndC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzhhMmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwMyBBdXJlbGllbiBBbGxlYXVtZSA8c2x0c0BmcmVlLmZyPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaWYgIWRlZmluZWQoX09JRF9NR1RfSCkKKyNkZWZpbmUgX09JRF9NR1RfSAorCisjaW5jbHVkZSAiaXNsX29pZC5oIgorI2luY2x1ZGUgImlzbHBjaV9kZXYuaCIKKworZXh0ZXJuIHN0cnVjdCBvaWRfdCBpc2xfb2lkW107CisKK2ludCBtZ3RfaW5pdChpc2xwY2lfcHJpdmF0ZSAqKTsKKwordm9pZCBtZ3RfY2xlYW4oaXNscGNpX3ByaXZhdGUgKik7CisKKy8qIEkgZG9uJ3Qga25vdyB3aGVyZSB0byBwdXQgdGhlc2UgMiAqLworZXh0ZXJuIGNvbnN0IGludCBmcmVxdWVuY3lfbGlzdF9hW107CitpbnQgY2hhbm5lbF9vZl9mcmVxKGludCk7CisKK3ZvaWQgbWd0X2xlX3RvX2NwdShpbnQsIHZvaWQgKik7CisKK2ludCBtZ3Rfc2V0X3JlcXVlc3QoaXNscGNpX3ByaXZhdGUgKiwgZW51bSBvaWRfbnVtX3QsIGludCwgdm9pZCAqKTsKK2ludCBtZ3Rfc2V0X3Zhcmxlbihpc2xwY2lfcHJpdmF0ZSAqLCBlbnVtIG9pZF9udW1fdCwgdm9pZCAqLCBpbnQpOworCisKK2ludCBtZ3RfZ2V0X3JlcXVlc3QoaXNscGNpX3ByaXZhdGUgKiwgZW51bSBvaWRfbnVtX3QsIGludCwgdm9pZCAqLAorCQkgICAgdW5pb24gb2lkX3Jlc190ICopOworCitpbnQgbWd0X2NvbW1pdF9saXN0KGlzbHBjaV9wcml2YXRlICosIGVudW0gb2lkX251bV90ICosIGludCk7CisKK3ZvaWQgbWd0X3NldChpc2xwY2lfcHJpdmF0ZSAqLCBlbnVtIG9pZF9udW1fdCwgdm9pZCAqKTsKKwordm9pZCBtZ3RfZ2V0KGlzbHBjaV9wcml2YXRlICosIGVudW0gb2lkX251bV90LCB2b2lkICopOworCitpbnQgbWd0X2NvbW1pdChpc2xwY2lfcHJpdmF0ZSAqKTsKKworaW50IG1ndF9tbG1lX2Fuc3dlcihpc2xwY2lfcHJpdmF0ZSAqKTsKKworZW51bSBvaWRfbnVtX3QgbWd0X29pZHRvbnVtKHUzMiBvaWQpOworCitpbnQgbWd0X3Jlc3BvbnNlX3RvX3N0cihlbnVtIG9pZF9udW1fdCwgdW5pb24gb2lkX3Jlc190ICosIGNoYXIgKik7CisKKyNlbmRpZgkJCQkvKiAhZGVmaW5lZChfT0lEX01HVF9IKSAqLworLyogRU9GICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L3ByaXNtY29tcGF0LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L3ByaXNtY29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1NDFjMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvcHJpc21jb21wYXQuaApAQCAtMCwwICsxLDQ0IEBACisvKiAgCisgKiAgKEMpIDIwMDQgTWFyZ2l0IFNjaHViZXJ0LVdoaWxlIDxtYXJnaXRzd0B0LW9ubGluZS5kZT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworLyogIAorICoJQ29tcGF0aWJpbGl0eSBoZWFkZXIgZmlsZSB0byBhaWQgc3VwcG9ydCBvZiBkaWZmZXJlbnQga2VybmVsIHZlcnNpb25zCisgKi8KKworI2lmZGVmIFBSSVNNNTRfQ09NUEFUMjQKKyNpbmNsdWRlICJwcmlzbWNvbXBhdDI0LmgiCisjZWxzZQkvKiBQUklTTTU0X0NPTVBBVDI0ICovCisKKyNpZm5kZWYgX1BSSVNNX0NPTVBBVF9ICisjZGVmaW5lIF9QUklTTV9DT01QQVRfSAorCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisKKyNpZm5kZWYgX19pb21lbQorI2RlZmluZSBfX2lvbWVtCisjZW5kaWYKKworI2RlZmluZSBQUklTTV9GV19QREVWCQkmcHJpdi0+cGRldi0+ZGV2CisKKyNlbmRpZgkJCQkvKiBfUFJJU01fQ09NUEFUX0ggKi8KKyNlbmRpZgkJCQkvKiBQUklTTTU0X0NPTVBBVDI0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNWJkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYwpAQCAtMCwwICsxLDI5NTcgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBBICBQQ01DSUEgY2xpZW50IGRyaXZlciBmb3IgdGhlIFJheWxpbmsgd2lyZWxlc3MgTEFOIGNhcmQuCisgKiBUaGUgc3RhcnRpbmcgcG9pbnQgZm9yIHRoaXMgbW9kdWxlIHdhcyB0aGUgc2tlbGV0b24uYyBpbiB0aGUKKyAqIFBDTUNJQSAyLjkuMTIgcGFja2FnZSB3cml0dGVuIGJ5IERhdmlkIEhpbmRzLCBkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldAorICoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTggIENvcmV5IFRob21hcyAoY29yZXlAd29ybGQuc3RkLmNvbSkKKyAqCisgKiBUaGlzIGRyaXZlciBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9ubHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogSXQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIENoYW5nZXM6CisgKiBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4gLSAwOC8wOC8yMDAwCisgKiAtIHJlb3JnYW5pemUga21hbGxvY3MgaW4gcmF5X2F0dGFjaCwgY2hlY2tpbmcgYWxsIGZvciBmYWlsdXJlCisgKiAgIGFuZCByZWxlYXNpbmcgdGhlIHByZXZpb3VzIGFsbG9jYXRpb25zIGlmIG9uZSBmYWlscworICoKKyAqIERhbmllbGUgQmVsbHVjY2kgPGJlbGx1Y2RhQHRpc2NhbGkuaXQ+IC0gMDcvMTAvMjAwMworICogLSBBdWRpdCBjb3B5X3RvX3VzZXIgaW4gaW9jdGwoU0lPQ0dJV0VTU0lEKQorICogCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9tZW1fb3AuaD4KKworI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qIFdhcm5pbmcgOiB0aGVzZSBzdHVmZiB3aWxsIHNsb3cgZG93biB0aGUgZHJpdmVyLi4uICovCisjZGVmaW5lIFdJUkVMRVNTX1NQWQkJLyogRW5hYmxlIHNweWluZyBhZGRyZXNzZXMgKi8KKy8qIERlZmluaXRpb25zIHdlIG5lZWQgZm9yIHNweSAqLwordHlwZWRlZiBzdHJ1Y3QgaXdfc3RhdGlzdGljcwlpd19zdGF0czsKK3R5cGVkZWYgc3RydWN0IGl3X3F1YWxpdHkJaXdfcXVhbDsKK3R5cGVkZWYgdV9jaGFyCW1hY19hZGRyW0VUSF9BTEVOXTsJLyogSGFyZHdhcmUgYWRkcmVzcyAqLworCisjaW5jbHVkZSAicmF5Y3RsLmgiCisjaW5jbHVkZSAicmF5X2NzLmgiCisKKy8qIEFsbCB0aGUgUENNQ0lBIG1vZHVsZXMgdXNlIFBDTUNJQV9ERUJVRyB0byBjb250cm9sIGRlYnVnZ2luZy4gIElmCisgICB5b3UgZG8gbm90IGRlZmluZSBQQ01DSUFfREVCVUcgYXQgYWxsLCBhbGwgdGhlIGRlYnVnIGNvZGUgd2lsbCBiZQorICAgbGVmdCBvdXQuICBJZiB5b3UgY29tcGlsZSB3aXRoIFBDTUNJQV9ERUJVRz0wLCB0aGUgZGVidWcgY29kZSB3aWxsCisgICBiZSBwcmVzZW50IGJ1dCBkaXNhYmxlZCAtLSBidXQgaXQgY2FuIHRoZW4gYmUgZW5hYmxlZCBmb3Igc3BlY2lmaWMKKyAgIG1vZHVsZXMgYXQgbG9hZCB0aW1lIHdpdGggYSAncGNfZGVidWc9Iycgb3B0aW9uIHRvIGluc21vZC4KKyovCisKKyNpZmRlZiBSQVlMSU5LX0RFQlVHCisjZGVmaW5lIFBDTUNJQV9ERUJVRyBSQVlMSU5LX0RFQlVHCisjZW5kaWYKKyNpZmRlZiBQQ01DSUFfREVCVUcKK3N0YXRpYyBpbnQgcmF5X2RlYnVnOworc3RhdGljIGludCBwY19kZWJ1ZyA9IFBDTUNJQV9ERUJVRzsKK21vZHVsZV9wYXJhbShwY19kZWJ1ZywgaW50LCAwKTsKKy8qICNkZWZpbmUgREVCVUcobiwgYXJncy4uLikgaWYgKHBjX2RlYnVnPihuKSkgcHJpbnRrKEtFUk5fREVCVUcgYXJncyk7ICovCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pIGlmIChwY19kZWJ1Zz4obikpIHByaW50ayhhcmdzKTsKKyNlbHNlCisjZGVmaW5lIERFQlVHKG4sIGFyZ3MuLi4pCisjZW5kaWYKKy8qKiBQcm90b3R5cGVzIGJhc2VkIG9uIFBDTUNJQSBza2VsZXRvbiBkcml2ZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHJheV9jb25maWcoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgdm9pZCByYXlfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyBpbnQgcmF5X2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSwgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKTsKK3N0YXRpYyBkZXZfbGlua190ICpyYXlfYXR0YWNoKHZvaWQpOworc3RhdGljIHZvaWQgcmF5X2RldGFjaChkZXZfbGlua190ICopOworCisvKioqKiogUHJvdG90eXBlcyBpbmRpY2F0ZWQgYnkgZGV2aWNlIHN0cnVjdHVyZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHJheV9kZXZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHJheV9kZXZfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwKTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcmF5X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcmF5X2Rldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCByYXlfZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CisKK3N0YXRpYyBpbnQgcmF5X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHJheV9kZXZfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJheV91cGRhdGVfbXVsdGlfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYWxsKTsKK3N0YXRpYyBpbnQgdHJhbnNsYXRlX2ZyYW1lKHJheV9kZXZfdCAqbG9jYWwsIHN0cnVjdCB0eF9tc2cgX19pb21lbSAqcHR4LAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4pOworc3RhdGljIHZvaWQgcmF5X2J1aWxkX2hlYWRlcihyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgdHhfbXNnIF9faW9tZW0gKnB0eCwgVUNIQVIgbXNnX3R5cGUsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSk7CitzdGF0aWMgdm9pZCB1bnRyYW5zbGF0ZShyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuKTsKKyNpZiBXSVJFTEVTU19FWFQgPiA3CS8qIElmIHdpcmVsZXNzIGV4dGVuc2lvbiBleGlzdCBpbiB0aGUga2VybmVsICovCitzdGF0aWMgaXdfc3RhdHMgKiByYXlfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KTsKKyNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiA3ICovCisKKy8qKioqKiBQcm90b3R5cGVzIGZvciByYXlsaW5rIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgYXNjX3RvX2ludChjaGFyIGEpOworc3RhdGljIHZvaWQgYXV0aGVudGljYXRlKHJheV9kZXZfdCAqbG9jYWwpOworc3RhdGljIGludCBidWlsZF9hdXRoX2ZyYW1lKHJheV9kZXZfdCAqbG9jYWwsIFVDSEFSICpkZXN0LCBpbnQgYXV0aF90eXBlKTsKK3N0YXRpYyB2b2lkIGF1dGhlbnRpY2F0ZV90aW1lb3V0KHVfbG9uZyk7CitzdGF0aWMgaW50IGdldF9mcmVlX2NjcyhyYXlfZGV2X3QgKmxvY2FsKTsKK3N0YXRpYyBpbnQgZ2V0X2ZyZWVfdHhfY2NzKHJheV9kZXZfdCAqbG9jYWwpOworc3RhdGljIHZvaWQgaW5pdF9zdGFydHVwX3BhcmFtcyhyYXlfZGV2X3QgKmxvY2FsKTsKK3N0YXRpYyBpbnQgcGFyc2VfYWRkcihjaGFyICppbl9zdHIsIFVDSEFSICpvdXQpOworc3RhdGljIGludCByYXlfaHdfeG1pdCh1bnNpZ25lZCBjaGFyKiBkYXRhLCBpbnQgbGVuLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2LCBVQ0hBUiB0eXBlKTsKK3N0YXRpYyBpbnQgcmF5X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IGludGVycnVwdF9lY2YocmF5X2Rldl90ICpsb2NhbCwgaW50IGNjcyk7CitzdGF0aWMgdm9pZCByYXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCByYXlfdXBkYXRlX3Bhcm0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgVUNIQVIgb2JqaWQsIFVDSEFSICp2YWx1ZSwgaW50IGxlbik7CitzdGF0aWMgdm9pZCB2ZXJpZnlfZGxfc3RhcnR1cCh1X2xvbmcpOworCisvKiBQcm90b3R5cGVzIGZvciBpbnRlcnJwdCB0aW1lIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlycXJldHVybl90IHJheV9pbnRlcnJ1cHQgKGludCByZWcsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIHZvaWQgY2xlYXJfaW50ZXJydXB0KHJheV9kZXZfdCAqbG9jYWwpOworc3RhdGljIHZvaWQgcnhfZGVhdXRoZW50aWNhdGUocmF5X2Rldl90ICpsb2NhbCwgc3RydWN0IHJjcyBfX2lvbWVtICpwcmNzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBrdF9hZGRyLCBpbnQgcnhfbGVuKTsKK3N0YXRpYyBpbnQgY29weV9mcm9tX3J4X2J1ZmYocmF5X2Rldl90ICpsb2NhbCwgVUNIQVIgKmRlc3QsIGludCBwa3RfYWRkciwgaW50IGxlbik7CitzdGF0aWMgdm9pZCByYXlfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgcmF5X2Rldl90ICpsb2NhbCwgc3RydWN0IHJjcyBfX2lvbWVtICpwcmNzKTsKK3N0YXRpYyB2b2lkIHJlbGVhc2VfZnJhZ19jaGFpbihyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgcmNzIF9faW9tZW0gKnByY3MpOworc3RhdGljIHZvaWQgcnhfYXV0aGVudGljYXRlKHJheV9kZXZfdCAqbG9jYWwsIHN0cnVjdCByY3MgX19pb21lbSAqcHJjcywKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwa3RfYWRkciwgaW50IHJ4X2xlbik7CitzdGF0aWMgdm9pZCByeF9kYXRhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCByY3MgX19pb21lbSAqcHJjcywgdW5zaWduZWQgaW50IHBrdF9hZGRyLCAKKyAgICAgICAgICAgICBpbnQgcnhfbGVuKTsKK3N0YXRpYyB2b2lkIGFzc29jaWF0ZShyYXlfZGV2X3QgKmxvY2FsKTsKKworLyogQ2FyZCBjb21tYW5kIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBkbF9zdGFydHVwX3BhcmFtcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGpvaW5fbmV0KHVfbG9uZyBsb2NhbCk7CitzdGF0aWMgdm9pZCBzdGFydF9uZXQodV9sb25nIGxvY2FsKTsKKy8qIHZvaWQgc3RhcnRfbmV0KHJheV9kZXZfdCAqbG9jYWwpOyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBQYXJhbWV0ZXJzIHRoYXQgY2FuIGJlIHNldCB3aXRoICdpbnNtb2QnICovCisKKy8qIEFESE9DPTAsIEluZnJhc3RydWN0dXJlPTEgKi8KK3N0YXRpYyBpbnQgbmV0X3R5cGUgPSBBREhPQzsKKworLyogSG9wIGR3ZWxsIHRpbWUgaW4gS3VzICgxMDI0IHVzIHVuaXRzIGRlZmluZWQgYnkgODAyLjExKSAqLworc3RhdGljIGludCBob3BfZHdlbGwgPSAxMjg7CisKKy8qIEJlYWNvbiBwZXJpb2QgaW4gS3VzICovCitzdGF0aWMgaW50IGJlYWNvbl9wZXJpb2QgPSAyNTY7CisKKy8qIHBvd2VyIHNhdmUgbW9kZSAoMCA9IG9mZiwgMSA9IHNhdmUgcG93ZXIpICovCitzdGF0aWMgaW50IHBzbTsKKworLyogU3RyaW5nIGZvciBuZXR3b3JrJ3MgRXh0ZW5kZWQgU2VydmljZSBTZXQgSUQuIDMyIENoYXJhY3RlcnMgbWF4ICovCitzdGF0aWMgY2hhciAqZXNzaWQ7CisKKy8qIERlZmF1bHQgdG8gZW5jYXBzdWxhdGlvbiB1bmxlc3MgdHJhbnNsYXRpb24gcmVxdWVzdGVkICovCitzdGF0aWMgaW50IHRyYW5zbGF0ZSA9IDE7CisKK3N0YXRpYyBpbnQgY291bnRyeSA9IFVTQTsKKworc3RhdGljIGludCBzbmlmZmVyOworCitzdGF0aWMgaW50IGJjOworCisvKiA0OCBiaXQgcGh5c2ljYWwgY2FyZCBhZGRyZXNzIGlmIG92ZXJyaWRpbmcgY2FyZCdzIHJlYWwgcGh5c2ljYWwKKyAqIGFkZHJlc3MgaXMgcmVxdWlyZWQuICBTaW5jZSBJRUVFIDgwMi4xMSBhZGRyZXNzZXMgYXJlIDQ4IGJpdHMKKyAqIGxpa2UgZXRoZXJuZXQsIGFuIGludCBjYW4ndCBiZSB1c2VkLCBzbyBhIHN0cmluZyBpcyB1c2VkLiBUbworICogYWxsb3cgdXNlIG9mIGFkZHJlc3NlcyBzdGFydGluZyB3aXRoIGEgZGVjaW1hbCBkaWdpdCwgdGhlIGZpcnN0CisgKiBjaGFyYWN0ZXIgbXVzdCBiZSBhIGxldHRlciBhbmQgd2lsbCBiZSBpZ25vcmVkLiBUaGlzIGxldHRlciBpcworICogZm9sbG93ZWQgYnkgdXAgdG8gMTIgaGV4IGRpZ2l0cyB3aGljaCBhcmUgdGhlIGFkZHJlc3MuICBJZiBsZXNzCisgKiB0aGFuIDEyIGRpZ2l0cyBhcmUgdXNlZCwgdGhlIGFkZHJlc3Mgd2lsbCBiZSBsZWZ0IGZpbGxlZCB3aXRoIDAncy4KKyAqIE5vdGUgdGhhdCBiaXQgMCBvZiB0aGUgZmlyc3QgYnl0ZSBpcyB0aGUgYnJvYWRjYXN0IGJpdCwgYW5kIGV2aWwKKyAqIHRoaW5ncyB3aWxsIGhhcHBlbiBpZiBpdCBpcyBub3QgMCBpbiBhIGNhcmQgYWRkcmVzcy4KKyAqLworc3RhdGljIGNoYXIgKnBoeV9hZGRyID0gTlVMTDsKKworCisvKiBUaGUgZGV2X2luZm8gdmFyaWFibGUgaXMgdGhlICJrZXkiIHRoYXQgaXMgdXNlZCB0byBtYXRjaCB1cCB0aGlzCisgICBkZXZpY2UgZHJpdmVyIHdpdGggYXBwcm9wcmlhdGUgY2FyZHMsIHRocm91Z2ggdGhlIGNhcmQgY29uZmlndXJhdGlvbgorICAgZGF0YWJhc2UuCisqLworc3RhdGljIGRldl9pbmZvX3QgZGV2X2luZm8gPSAicmF5X2NzIjsKKworLyogQSBsaW5rZWQgbGlzdCBvZiAiaW5zdGFuY2VzIiBvZiB0aGUgcmF5IGRldmljZS4gIEVhY2ggYWN0dWFsCisgICBQQ01DSUEgY2FyZCBjb3JyZXNwb25kcyB0byBvbmUgZGV2aWNlIGluc3RhbmNlLCBhbmQgaXMgZGVzY3JpYmVkCisgICBieSBvbmUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgKGRlZmluZWQgaW4gZHMuaCkuCisqLworc3RhdGljIGRldl9saW5rX3QgKmRldl9saXN0ID0gTlVMTDsKKworLyogQSBkZXZfbGlua190IHN0cnVjdHVyZSBoYXMgZmllbGRzIGZvciBtb3N0IHRoaW5ncyB0aGF0IGFyZSBuZWVkZWQKKyAgIHRvIGtlZXAgdHJhY2sgb2YgYSBzb2NrZXQsIGJ1dCB0aGVyZSB3aWxsIHVzdWFsbHkgYmUgc29tZSBkZXZpY2UKKyAgIHNwZWNpZmljIGluZm9ybWF0aW9uIHRoYXQgYWxzbyBuZWVkcyB0byBiZSBrZXB0IHRyYWNrIG9mLiAgVGhlCisgICAncHJpdicgcG9pbnRlciBpbiBhIGRldl9saW5rX3Qgc3RydWN0dXJlIGNhbiBiZSB1c2VkIHRvIHBvaW50IHRvCisgICBhIGRldmljZS1zcGVjaWZpYyBwcml2YXRlIGRhdGEgc3RydWN0dXJlLCBsaWtlIHRoaXMuCisqLworc3RhdGljIHVuc2lnbmVkIGludCByYXlfbWVtX3NwZWVkID0gNTAwOworCitNT0RVTEVfQVVUSE9SKCJDb3JleSBUaG9tYXMgPGNvcmV5QHdvcmxkLnN0ZC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJheWxpbmsvV2ViR2VhciB3aXJlbGVzcyBMQU4gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShuZXRfdHlwZSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShob3BfZHdlbGwsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oYmVhY29uX3BlcmlvZCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShwc20sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZXNzaWQsIGNoYXJwLCAwKTsKK21vZHVsZV9wYXJhbSh0cmFuc2xhdGUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY291bnRyeSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShzbmlmZmVyLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGJjLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHBoeV9hZGRyLCBjaGFycCwgMCk7Cittb2R1bGVfcGFyYW0ocmF5X21lbV9zcGVlZCwgaW50LCAwKTsKKworc3RhdGljIFVDSEFSIGI1X2RlZmF1bHRfc3RhcnR1cF9wYXJtc1tdID0geworICAgIDAsICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRob2Mgc3RhdGlvbiAqLworICAgJ0wnLCdJJywnTicsJ1UnLCdYJywgMCwgIDAsICAwLCAgLyogMzIgY2hhciBFU1NJRCAqLworICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIDEsICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWN0aXZlIHNjYW4sIENBIE1vZGUgKi8KKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAgICAgICAgIC8qIE5vIGRlZmF1bHQgTUFDIGFkZHIgICovCisgICAgMHg3ZiwgMHhmZiwgICAgICAgICAgICAgICAgICAgICAvKiBGcmFnIHRocmVzaG9sZCAqLworICAgIDB4MDAsIDB4ODAsICAgICAgICAgICAgICAgICAgICAgLyogSG9wIHRpbWUgMTI4IEt1cyovCisgICAgMHgwMSwgMHgwMCwgICAgICAgICAgICAgICAgICAgICAvKiBCZWFjb24gcGVyaW9kIDI1NiBLdXMgKi8KKyAgICAweDAxLCAweDA3LCAweGEzLCAgICAgICAgICAgICAgIC8qIERUSU0sIHJldHJpZXMsIGFjayB0aW1lb3V0Ki8KKyAgICAweDFkLCAweDgyLCAweDRlLCAgICAgICAgICAgICAgIC8qIFNJRlMsIERJRlMsIFBJRlMgKi8KKyAgICAweDdmLCAweGZmLCAgICAgICAgICAgICAgICAgICAgIC8qIFJUUyB0aHJlc2hvbGQgKi8KKyAgICAweDA0LCAweGUyLCAweDM4LCAweEE0LCAgICAgICAgIC8qIHNjYW5fZHdlbGwsIG1heF9zY2FuX2R3ZWxsICovCisgICAgMHgwNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhc3NvYyByZXNwIHRpbWVvdXQgdGhyZXNoICovCisgICAgMHgwOCwgMHgwMiwgMHgwOCwgICAgICAgICAgICAgICAvKiBhZGhvYywgaW5mcmEsIHN1cGVyIGN5Y2xlIG1heCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9taXNjdW91cyBtb2RlICovCisgICAgMHgwYywgMHgwYmQsICAgICAgICAgICAgICAgICAgICAvKiBVbmlxdWUgd29yZCAqLworICAgIDB4MzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2xvdCB0aW1lICovCisgICAgMHhmZiwgMHhmZiwgICAgICAgICAgICAgICAgICAgICAvKiByb2FtLWxvdyBzbnIsIGxvdyBzbnIgY291bnQgKi8KKyAgICAweDA1LCAweGZmLCAgICAgICAgICAgICAgICAgICAgIC8qIEluZnJhLCBhZGhvYyBtaXNzZWQgYmNuIHRocmVzaCAqLworICAgIDB4MDEsIDB4MGIsIDB4NGYsICAgICAgICAgICAgICAgLyogVVNBLCBob3AgcGF0dGVybiwgaG9wIHBhdCBsZW5ndGggKi8KKy8qIGI0IC0gYjUgZGlmZmVyZW5jZXMgc3RhcnQgaGVyZSAqLworICAgIDB4MDAsIDB4M2YsICAgICAgICAgICAgICAgICAgICAgLyogQ1cgbWF4ICovCisgICAgMHgwMCwgMHgwZiwgICAgICAgICAgICAgICAgICAgICAvKiBDVyBtaW4gKi8KKyAgICAweDA0LCAweDA4LCAgICAgICAgICAgICAgICAgICAgIC8qIE5vaXNlIGdhaW4sIGxpbWl0IG9mZnNldCAqLworICAgIDB4MjgsIDB4MjgsICAgICAgICAgICAgICAgICAgICAgLyogZGV0IHJzc2ksIG1lZCBidXN5IG9mZnNldHMgKi8KKyAgICA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRldCBzeW5jIHRocmVzaCAqLworICAgIDAsIDIsIDIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVzdCBtb2RlLCBtaW4sIG1heCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxsb3cgYnJvYWRjYXN0IFNTSUQgcHJvYmUgcmVzcCAqLworICAgIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJpdmFjeSBtdXN0IHN0YXJ0LCBjYW4gam9pbiAqLworICAgIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAgICAgICAgICAgLyogYmFzaWMgcmF0ZSBzZXQgKi8KK307CisKK3N0YXRpYyBVQ0hBUiBiNF9kZWZhdWx0X3N0YXJ0dXBfcGFybXNbXSA9IHsKKyAgICAwLCAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkaG9jIHN0YXRpb24gKi8KKyAgICdMJywnSScsJ04nLCdVJywnWCcsIDAsICAwLCAgMCwgIC8qIDMyIGNoYXIgRVNTSUQgKi8KKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAxLCAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFjdGl2ZSBzY2FuLCBDQSBNb2RlICovCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgICAgICAgICAvKiBObyBkZWZhdWx0IE1BQyBhZGRyICAqLworICAgIDB4N2YsIDB4ZmYsICAgICAgICAgICAgICAgICAgICAgLyogRnJhZyB0aHJlc2hvbGQgKi8KKyAgICAweDAyLCAweDAwLCAgICAgICAgICAgICAgICAgICAgIC8qIEhvcCB0aW1lICovCisgICAgMHgwMCwgMHgwMSwgICAgICAgICAgICAgICAgICAgICAvKiBCZWFjb24gcGVyaW9kICovCisgICAgMHgwMSwgMHgwNywgMHhhMywgICAgICAgICAgICAgICAvKiBEVElNLCByZXRyaWVzLCBhY2sgdGltZW91dCovCisgICAgMHgxZCwgMHg4MiwgMHhjZSwgICAgICAgICAgICAgICAvKiBTSUZTLCBESUZTLCBQSUZTICovCisgICAgMHg3ZiwgMHhmZiwgICAgICAgICAgICAgICAgICAgICAvKiBSVFMgdGhyZXNob2xkICovCisgICAgMHhmYiwgMHgxZSwgMHhjNywgMHg1YywgICAgICAgICAvKiBzY2FuX2R3ZWxsLCBtYXhfc2Nhbl9kd2VsbCAqLworICAgIDB4MDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXNzb2MgcmVzcCB0aW1lb3V0IHRocmVzaCAqLworICAgIDB4MDQsIDB4MDIsIDB4NCwgICAgICAgICAgICAgICAgLyogYWRob2MsIGluZnJhLCBzdXBlciBjeWNsZSBtYXgqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvbWlzY3VvdXMgbW9kZSAqLworICAgIDB4MGMsIDB4MGJkLCAgICAgICAgICAgICAgICAgICAgLyogVW5pcXVlIHdvcmQgKi8KKyAgICAweDRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNsb3QgdGltZSAoVEJEIHNlZW1zIHdyb25nKSovCisgICAgMHhmZiwgMHhmZiwgICAgICAgICAgICAgICAgICAgICAvKiByb2FtLWxvdyBzbnIsIGxvdyBzbnIgY291bnQgKi8KKyAgICAweDA1LCAweGZmLCAgICAgICAgICAgICAgICAgICAgIC8qIEluZnJhLCBhZGhvYyBtaXNzZWQgYmNuIHRocmVzaCAqLworICAgIDB4MDEsIDB4MGIsIDB4NGUsICAgICAgICAgICAgICAgLyogVVNBLCBob3AgcGF0dGVybiwgaG9wIHBhdCBsZW5ndGggKi8KKy8qIGI0IC0gYjUgZGlmZmVyZW5jZXMgc3RhcnQgaGVyZSAqLworICAgIDB4M2YsIDB4MGYsICAgICAgICAgICAgICAgICAgICAgLyogQ1cgbWF4LCBtaW4gKi8KKyAgICAweDA0LCAweDA4LCAgICAgICAgICAgICAgICAgICAgIC8qIE5vaXNlIGdhaW4sIGxpbWl0IG9mZnNldCAqLworICAgIDB4MjgsIDB4MjgsICAgICAgICAgICAgICAgICAgICAgLyogZGV0IHJzc2ksIG1lZCBidXN5IG9mZnNldHMgKi8KKyAgICA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRldCBzeW5jIHRocmVzaCAqLworICAgIDAsIDIsIDIgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVzdCBtb2RlLCBtaW4sIG1heCovCit9OworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHVuc2lnbmVkIGNoYXIgZXRoMl9sbGNbXSA9IHsweGFhLCAweGFhLCAzLCAwLCAwLCAwfTsKKworc3RhdGljIGNoYXIgaG9wX3BhdHRlcm5fbGVuZ3RoW10gPSB7IDEsCisJICAgICBVU0FfSE9QX01PRCwgICAgICAgICAgICAgRVVST1BFX0hPUF9NT0QsCisJICAgICBKQVBBTl9IT1BfTU9ELCAgICAgICAgICAgS09SRUFfSE9QX01PRCwKKwkgICAgIFNQQUlOX0hPUF9NT0QsICAgICAgICAgICBGUkFOQ0VfSE9QX01PRCwKKwkgICAgIElTUkFFTF9IT1BfTU9ELCAgICAgICAgICBBVVNUUkFMSUFfSE9QX01PRCwKKwkgICAgIEpBUEFOX1RFU1RfSE9QX01PRAorfTsKKworc3RhdGljIGNoYXIgcmNzaWRbXSA9ICJSYXlsaW5rL1dlYkdlYXIgd2lyZWxlc3MgTEFOIC0gQ29yZXkgPFRob21hcyBjb3JleUB3b3JsZC5zdGQuY29tPiI7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICByYXlfYXR0YWNoKCkgY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcKKyAgICBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yIG9uZSBkZXZpY2UuICBUaGUgZGV2aWNlIGlzIHJlZ2lzdGVyZWQKKyAgICB3aXRoIENhcmQgU2VydmljZXMuCisgICAgVGhlIGRldl9saW5rIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCwgYnV0IHdlIGRvbid0IGFjdHVhbGx5CisgICAgY29uZmlndXJlIHRoZSBjYXJkIGF0IHRoaXMgcG9pbnQgLS0gd2Ugd2FpdCB1bnRpbCB3ZSByZWNlaXZlIGEKKyAgICBjYXJkIGluc2VydGlvbiBldmVudC4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBkZXZfbGlua190ICpyYXlfYXR0YWNoKHZvaWQpCit7CisgICAgY2xpZW50X3JlZ190IGNsaWVudF9yZWc7CisgICAgZGV2X2xpbmtfdCAqbGluazsKKyAgICByYXlfZGV2X3QgKmxvY2FsOworICAgIGludCByZXQ7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICAKKyAgICBERUJVRygxLCAicmF5X2F0dGFjaCgpXG4iKTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIGRldl9saW5rX3Qgc3RydWN0dXJlICovCisgICAgbGluayA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZfbGlua190KSwgR0ZQX0tFUk5FTCk7CisKKyAgICBpZiAoIWxpbmspCisJICAgIHJldHVybiBOVUxMOworCisgICAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHByaXZhdGUgZGV2aWNlLXNwZWNpZmljIGRhdGEgKi8KKyAgICBkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YocmF5X2Rldl90KSk7CisKKyAgICBpZiAoIWRldikKKwkgICAgZ290byBmYWlsX2FsbG9jX2RldjsKKworICAgIGxvY2FsID0gZGV2LT5wcml2OworCisgICAgbWVtc2V0KGxpbmssIDAsIHNpemVvZihzdHJ1Y3QgZGV2X2xpbmtfdCkpOworCisgICAgLyogVGhlIGlvIHN0cnVjdHVyZSBkZXNjcmliZXMgSU8gcG9ydCBtYXBwaW5nLiBOb25lIHVzZWQgaGVyZSAqLworICAgIGxpbmstPmlvLk51bVBvcnRzMSA9IDA7CisgICAgbGluay0+aW8uQXR0cmlidXRlczEgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKKyAgICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDU7CisKKyAgICAvKiBJbnRlcnJ1cHQgc2V0dXAuIEZvciBQQ01DSUEsIGRyaXZlciB0YWtlcyB3aGF0J3MgZ2l2ZW4gKi8KKyAgICBsaW5rLT5pcnEuQXR0cmlidXRlcyA9IElSUV9UWVBFX0VYQ0xVU0lWRSB8IElSUV9IQU5ETEVfUFJFU0VOVDsKKyAgICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisgICAgbGluay0+aXJxLkhhbmRsZXIgPSAmcmF5X2ludGVycnVwdDsKKworICAgIC8qIEdlbmVyYWwgc29ja2V0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CisgICAgbGluay0+Y29uZi5WY2MgPSA1MDsKKyAgICBsaW5rLT5jb25mLkludFR5cGUgPSBJTlRfTUVNT1JZX0FORF9JTzsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0luZGV4ID0gMTsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBQUkVTRU5UX09QVElPTjsKKworICAgIGxpbmstPnByaXYgPSBkZXY7CisgICAgbGluay0+aXJxLkluc3RhbmNlID0gZGV2OworICAgIAorICAgIGxvY2FsLT5maW5kZXIgPSBsaW5rOworICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfSU5TRVJURUQ7CisgICAgbG9jYWwtPmF1dGhlbnRpY2F0aW9uX3N0YXRlID0gVU5BVVRIRU5USUNBVEVEOworICAgIGxvY2FsLT5udW1fbXVsdGkgPSAwOworICAgIERFQlVHKDIsInJheV9hdHRhY2ggbGluayA9ICVwLCAgZGV2ID0gJXAsICBsb2NhbCA9ICVwLCBpbnRyID0gJXBcbiIsCisgICAgICAgICAgbGluayxkZXYsbG9jYWwsJnJheV9pbnRlcnJ1cHQpOworCisgICAgLyogUmF5bGluayBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlICovCisgICAgZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmcmF5X2Rldl9zdGFydF94bWl0OworICAgIGRldi0+c2V0X2NvbmZpZyA9ICZyYXlfZGV2X2NvbmZpZzsKKyAgICBkZXYtPmdldF9zdGF0cyAgPSAmcmF5X2dldF9zdGF0czsKKyAgICBkZXYtPmRvX2lvY3RsID0gJnJheV9kZXZfaW9jdGw7CisgICAgU0VUX0VUSFRPT0xfT1BTKGRldiwgJm5ldGRldl9ldGh0b29sX29wcyk7CisjaWYgV0lSRUxFU1NfRVhUID4gNwkvKiBJZiB3aXJlbGVzcyBleHRlbnNpb24gZXhpc3QgaW4gdGhlIGtlcm5lbCAqLworICAgIGRldi0+Z2V0X3dpcmVsZXNzX3N0YXRzID0gcmF5X2dldF93aXJlbGVzc19zdGF0czsKKyNlbmRpZgorCisgICAgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSAmc2V0X211bHRpY2FzdF9saXN0OworCisgICAgREVCVUcoMiwicmF5X2NzIHJheV9hdHRhY2ggY2FsbGluZyBldGhlcl9zZXR1cC4pXG4iKTsKKyAgICBTRVRfTU9EVUxFX09XTkVSKGRldik7CisgICAgZGV2LT5pbml0ID0gJnJheV9kZXZfaW5pdDsKKyAgICBkZXYtPm9wZW4gPSAmcmF5X29wZW47CisgICAgZGV2LT5zdG9wID0gJnJheV9kZXZfY2xvc2U7CisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgICAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgICAgbGluay0+bmV4dCA9IGRldl9saXN0OworICAgIGRldl9saXN0ID0gbGluazsKKyAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOworICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KKyAgICAgICAgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAorICAgICAgICBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAorICAgICAgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZyYXlfZXZlbnQ7CisgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CisKKyAgICBERUJVRygyLCJyYXlfY3MgcmF5X2F0dGFjaCBjYWxsaW5nIHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoLi4uKVxuIik7CisKKyAgICBpbml0X3RpbWVyKCZsb2NhbC0+dGltZXIpOworCisgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIHByaW50aygicmF5X2NzIHJheV9hdHRhY2ggUmVnaXN0ZXJDbGllbnQgdW5oYXBweSAtIGRldGFjaGluZ1xuIik7CisgICAgICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisgICAgICAgIHJheV9kZXRhY2gobGluayk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBERUJVRygyLCJyYXlfY3MgcmF5X2F0dGFjaCBlbmRpbmdcbiIpOworICAgIHJldHVybiBsaW5rOworCitmYWlsX2FsbG9jX2RldjoKKyAgICBrZnJlZShsaW5rKTsKKyAgICByZXR1cm4gTlVMTDsKK30gLyogcmF5X2F0dGFjaCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiAgVGhlIGRldmljZSBpcyBkZS1yZWdpc3RlcmVkCisgICAgd2l0aCBDYXJkIFNlcnZpY2VzLiAgSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhCisgICAgc3RydWN0dXJlcyBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQKKyAgICB3aGVuIHRoZSBkZXZpY2UgaXMgcmVsZWFzZWQuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCByYXlfZGV0YWNoKGRldl9saW5rX3QgKmxpbmspCit7CisgICAgZGV2X2xpbmtfdCAqKmxpbmtwOworCisgICAgREVCVUcoMSwgInJheV9kZXRhY2goMHglcClcbiIsIGxpbmspOworICAgIAorICAgIC8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisgICAgZm9yIChsaW5rcCA9ICZkZXZfbGlzdDsgKmxpbmtwOyBsaW5rcCA9ICYoKmxpbmtwKS0+bmV4dCkKKyAgICAgICAgaWYgKCpsaW5rcCA9PSBsaW5rKSBicmVhazsKKyAgICBpZiAoKmxpbmtwID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIElmIHRoZSBkZXZpY2UgaXMgY3VycmVudGx5IGNvbmZpZ3VyZWQgYW5kIGFjdGl2ZSwgd2Ugd29uJ3QKKyAgICAgIGFjdHVhbGx5IGRlbGV0ZSBpdCB5ZXQuICBJbnN0ZWFkLCBpdCBpcyBtYXJrZWQgc28gdGhhdCB3aGVuCisgICAgICB0aGUgcmVsZWFzZSgpIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhhdCB3aWxsIHRyaWdnZXIgYSBwcm9wZXIKKyAgICAgIGRldGFjaCgpLgorICAgICovCisgICAgaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKyAgICAgICAgcmF5X3JlbGVhc2UobGluayk7CisKKyAgICAvKiBCcmVhayB0aGUgbGluayB3aXRoIENhcmQgU2VydmljZXMgKi8KKyAgICBpZiAobGluay0+aGFuZGxlKQorICAgICAgICBwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKyAgICAKKyAgICAvKiBVbmxpbmsgZGV2aWNlIHN0cnVjdHVyZSwgZnJlZSBwaWVjZXMgKi8KKyAgICAqbGlua3AgPSBsaW5rLT5uZXh0OworICAgIGlmIChsaW5rLT5wcml2KSB7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworCWlmIChsaW5rLT5kZXYpIHVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisgICAgICAgIGZyZWVfbmV0ZGV2KGRldik7CisgICAgfQorICAgIGtmcmVlKGxpbmspOworICAgIERFQlVHKDIsInJheV9jcyByYXlfZGV0YWNoIGVuZGluZ1xuIik7Cit9IC8qIHJheV9kZXRhY2ggKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICByYXlfY29uZmlnKCkgaXMgcnVuIGFmdGVyIGEgQ0FSRF9JTlNFUlRJT04gZXZlbnQKKyAgICBpcyByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUKKyAgICBldGhlcm5ldCBkZXZpY2UgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKK2RvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCisjZGVmaW5lIE1BWF9UVVBMRV9TSVpFIDEyOAorc3RhdGljIHZvaWQgcmF5X2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQoreworICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CisgICAgdHVwbGVfdCB0dXBsZTsKKyAgICBjaXNwYXJzZV90IHBhcnNlOworICAgIGludCBsYXN0X2ZuID0gMCwgbGFzdF9yZXQgPSAwOworICAgIGludCBpOworICAgIHVfY2hhciBidWZbTUFYX1RVUExFX1NJWkVdOworICAgIHdpbl9yZXFfdCByZXE7CisgICAgbWVtcmVxX3QgbWVtOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilsaW5rLT5wcml2OworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworCisgICAgREVCVUcoMSwgInJheV9jb25maWcoMHglcClcbiIsIGxpbmspOworCisgICAgLyogVGhpcyByZWFkcyB0aGUgY2FyZCdzIENPTkZJRyB0dXBsZSB0byBmaW5kIGl0cyBjb25maWd1cmF0aW9uIHJlZ3MgKi8KKyAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ09ORklHOworICAgIENTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKyAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7CisgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gTUFYX1RVUExFX1NJWkU7CisgICAgdHVwbGUuVHVwbGVPZmZzZXQgPSAwOworICAgIENTX0NIRUNLKEdldFR1cGxlRGF0YSwgcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSk7CisgICAgQ1NfQ0hFQ0soUGFyc2VUdXBsZSwgcGNtY2lhX3BhcnNlX3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpKTsKKyAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKyAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CisKKyAgICAvKiBEZXRlcm1pbmUgY2FyZCB0eXBlIGFuZCBmaXJtd2FyZSB2ZXJzaW9uICovCisgICAgYnVmWzBdID0gYnVmW01BWF9UVVBMRV9TSVpFIC0gMV0gPSAwOworICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9WRVJTXzE7CisgICAgQ1NfQ0hFQ0soR2V0Rmlyc3RUdXBsZSwgcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSkpOworICAgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKKyAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBNQVhfVFVQTEVfU0laRTsKKyAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDI7CisgICAgQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKworICAgIGZvciAoaT0wOyBpPHR1cGxlLlR1cGxlRGF0YUxlbiAtIDQ7IGkrKykgCisgICAgICAgIGlmIChidWZbaV0gPT0gMCkgYnVmW2ldID0gJyAnOworICAgIHByaW50ayhLRVJOX0lORk8gInJheV9jcyBEZXRlY3RlZDogJXNcbiIsYnVmKTsKKworICAgIC8qIENvbmZpZ3VyZSBjYXJkICovCisgICAgbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKworICAgIC8qIE5vdyBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90CisgICAgICAgYWN0dWFsbHkgYXNzaWduIGEgaGFuZGxlciB0byB0aGUgaW50ZXJydXB0LgorICAgICovCisgICAgQ1NfQ0hFQ0soUmVxdWVzdElSUSwgcGNtY2lhX3JlcXVlc3RfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSkpOworICAgIGRldi0+aXJxID0gbGluay0+aXJxLkFzc2lnbmVkSVJROworICAgIAorICAgIC8qIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwCisgICAgICAgdGhlIEkvTyB3aW5kb3dzIGFuZCB0aGUgaW50ZXJydXB0IG1hcHBpbmcuCisgICAgKi8KKyAgICBDU19DSEVDSyhSZXF1ZXN0Q29uZmlndXJhdGlvbiwgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUsICZsaW5rLT5jb25mKSk7CisKKy8qKiogU2V0IHVwIDMyayB3aW5kb3cgZm9yIHNoYXJlZCBtZW1vcnkgKHRyYW5zbWl0IGFuZCBjb250cm9sKSAqKioqKioqKioqKiovCisgICAgcmVxLkF0dHJpYnV0ZXMgPSBXSU5fREFUQV9XSURUSF84IHwgV0lOX01FTU9SWV9UWVBFX0NNIHwgV0lOX0VOQUJMRSB8IFdJTl9VU0VfV0FJVDsKKyAgICByZXEuQmFzZSA9IDA7CisgICAgcmVxLlNpemUgPSAweDgwMDA7CisgICAgcmVxLkFjY2Vzc1NwZWVkID0gcmF5X21lbV9zcGVlZDsKKyAgICBDU19DSEVDSyhSZXF1ZXN0V2luZG93LCBwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmstPmhhbmRsZSwgJnJlcSwgJmxpbmstPndpbikpOworICAgIG1lbS5DYXJkT2Zmc2V0ID0gMHgwMDAwOyBtZW0uUGFnZSA9IDA7CisgICAgQ1NfQ0hFQ0soTWFwTWVtUGFnZSwgcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLT53aW4sICZtZW0pKTsKKyAgICBsb2NhbC0+c3JhbSA9IGlvcmVtYXAocmVxLkJhc2UscmVxLlNpemUpOworCisvKioqIFNldCB1cCAxNmsgd2luZG93IGZvciBzaGFyZWQgbWVtb3J5IChyZWNlaXZlIGJ1ZmZlcikgKioqKioqKioqKioqKioqLworICAgIHJlcS5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfOCB8IFdJTl9NRU1PUllfVFlQRV9DTSB8IFdJTl9FTkFCTEUgfCBXSU5fVVNFX1dBSVQ7CisgICAgcmVxLkJhc2UgPSAwOworICAgIHJlcS5TaXplID0gMHg0MDAwOworICAgIHJlcS5BY2Nlc3NTcGVlZCA9IHJheV9tZW1fc3BlZWQ7CisgICAgQ1NfQ0hFQ0soUmVxdWVzdFdpbmRvdywgcGNtY2lhX3JlcXVlc3Rfd2luZG93KCZsaW5rLT5oYW5kbGUsICZyZXEsICZsb2NhbC0+cm1lbV9oYW5kbGUpKTsKKyAgICBtZW0uQ2FyZE9mZnNldCA9IDB4ODAwMDsgbWVtLlBhZ2UgPSAwOworICAgIENTX0NIRUNLKE1hcE1lbVBhZ2UsIHBjbWNpYV9tYXBfbWVtX3BhZ2UobG9jYWwtPnJtZW1faGFuZGxlLCAmbWVtKSk7CisgICAgbG9jYWwtPnJtZW0gPSBpb3JlbWFwKHJlcS5CYXNlLHJlcS5TaXplKTsKKworLyoqKiBTZXQgdXAgd2luZG93IGZvciBhdHRyaWJ1dGUgbWVtb3J5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIHJlcS5BdHRyaWJ1dGVzID0gV0lOX0RBVEFfV0lEVEhfOCB8IFdJTl9NRU1PUllfVFlQRV9BTSB8IFdJTl9FTkFCTEUgfCBXSU5fVVNFX1dBSVQ7CisgICAgcmVxLkJhc2UgPSAwOworICAgIHJlcS5TaXplID0gMHgxMDAwOworICAgIHJlcS5BY2Nlc3NTcGVlZCA9IHJheV9tZW1fc3BlZWQ7CisgICAgQ1NfQ0hFQ0soUmVxdWVzdFdpbmRvdywgcGNtY2lhX3JlcXVlc3Rfd2luZG93KCZsaW5rLT5oYW5kbGUsICZyZXEsICZsb2NhbC0+YW1lbV9oYW5kbGUpKTsKKyAgICBtZW0uQ2FyZE9mZnNldCA9IDB4MDAwMDsgbWVtLlBhZ2UgPSAwOworICAgIENTX0NIRUNLKE1hcE1lbVBhZ2UsIHBjbWNpYV9tYXBfbWVtX3BhZ2UobG9jYWwtPmFtZW1faGFuZGxlLCAmbWVtKSk7CisgICAgbG9jYWwtPmFtZW0gPSBpb3JlbWFwKHJlcS5CYXNlLHJlcS5TaXplKTsKKworICAgIERFQlVHKDMsInJheV9jb25maWcgc3JhbT0lcFxuIixsb2NhbC0+c3JhbSk7CisgICAgREVCVUcoMywicmF5X2NvbmZpZyBybWVtPSVwXG4iLGxvY2FsLT5ybWVtKTsKKyAgICBERUJVRygzLCJyYXlfY29uZmlnIGFtZW09JXBcbiIsbG9jYWwtPmFtZW0pOworICAgIGlmIChyYXlfaW5pdChkZXYpIDwgMCkgeworICAgICAgICByYXlfcmVsZWFzZShsaW5rKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNFVF9ORVRERVZfREVWKGRldiwgJmhhbmRsZV90b19kZXYoaGFuZGxlKSk7CisgICAgaSA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgcHJpbnRrKCJyYXlfY29uZmlnIHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7CisgICAgICAgIHJheV9yZWxlYXNlKGxpbmspOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RyY3B5KGxvY2FsLT5ub2RlLmRldl9uYW1lLCBkZXYtPm5hbWUpOworICAgIGxpbmstPmRldiA9ICZsb2NhbC0+bm9kZTsKKworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJheUxpbmssIGlycSAlZCwgaHdfYWRkciAiLAorICAgICAgIGRldi0+bmFtZSwgZGV2LT5pcnEpOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgcHJpbnRrKCIlMDJYJXMiLCBkZXYtPmRldl9hZGRyW2ldLCAoKGk8NSkgPyAiOiIgOiAiXG4iKSk7CisKKyAgICByZXR1cm47CisKK2NzX2ZhaWxlZDoKKyAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKKworICAgIHJheV9yZWxlYXNlKGxpbmspOworfSAvKiByYXlfY29uZmlnICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNjcyBfX2lvbWVtICpjY3NfYmFzZShyYXlfZGV2X3QgKmRldikKK3sKKwlyZXR1cm4gZGV2LT5zcmFtICsgQ0NTX0JBU0U7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJjcyBfX2lvbWVtICpyY3NfYmFzZShyYXlfZGV2X3QgKmRldikKK3sKKwkvKgorCSAqIFRoaXMgbG9va3Mgbm9uc2Vuc2ljYWwsIHNpbmNlIHRoZXJlIGlzIGEgc2VwYXJhdGUKKwkgKiBSQ1NfQkFTRS4gQnV0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSAic3RydWN0IHJjcyIKKwkgKiBhbmQgYSAic3RydWN0IGNjcyIgZW5kcyB1cCBiZWluZyBpbiB0aGUgX2luZGV4XyBvZmYKKwkgKiB0aGUgYmFzZSwgc28gdGhlIGJhc2UgcG9pbnRlciBpcyB0aGUgc2FtZSBmb3IgYm90aAorCSAqIGNjcy9yY3MuCisJICovCisJcmV0dXJuIGRldi0+c3JhbSArIENDU19CQVNFOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHJheV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgaW50IGk7CisgICAgVUNIQVIgKnA7CisgICAgc3RydWN0IGNjcyBfX2lvbWVtICpwY2NzOworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworICAgIERFQlVHKDEsICJyYXlfaW5pdCgweCVwKVxuIiwgZGV2KTsKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygwLCJyYXlfaW5pdCAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBsb2NhbC0+bmV0X3R5cGUgPSBuZXRfdHlwZTsKKyAgICBsb2NhbC0+c3RhX3R5cGUgPSBUWVBFX1NUQTsKKworICAgIC8qIENvcHkgdGhlIHN0YXJ0dXAgcmVzdWx0cyB0byBsb2NhbCBtZW1vcnkgKi8KKyAgICBtZW1jcHlfZnJvbWlvKCZsb2NhbC0+c3RhcnR1cF9yZXMsIGxvY2FsLT5zcmFtICsgRUNGX1RPX0hPU1RfQkFTRSxcCisgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc3RhcnR1cF9yZXNfNikpOworCisgICAgLyogQ2hlY2sgUG93ZXIgdXAgdGVzdCBzdGF0dXMgYW5kIGdldCBtYWMgYWRkcmVzcyBmcm9tIGNhcmQgKi8KKyAgICBpZiAobG9jYWwtPnN0YXJ0dXBfcmVzLnN0YXJ0dXBfd29yZCAhPSAweDgwKSB7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAicmF5X2luaXQgRVJST1IgY2FyZCBzdGF0dXMgPSAlMnhcbiIsCisgICAgICAgICAgIGxvY2FsLT5zdGFydHVwX3Jlcy5zdGFydHVwX3dvcmQpOworICAgICAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0lOSVRfRVJST1I7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBsb2NhbC0+ZndfdmVyID0gbG9jYWwtPnN0YXJ0dXBfcmVzLmZpcm13YXJlX3ZlcnNpb25bMF07CisgICAgbG9jYWwtPmZ3X2JsZCA9IGxvY2FsLT5zdGFydHVwX3Jlcy5maXJtd2FyZV92ZXJzaW9uWzFdOworICAgIGxvY2FsLT5md192YXIgPSBsb2NhbC0+c3RhcnR1cF9yZXMuZmlybXdhcmVfdmVyc2lvblsyXTsKKyAgICBERUJVRygxLCJyYXlfaW5pdCBmaXJtd2FyZSB2ZXJzaW9uICVkLiVkIFxuIixsb2NhbC0+ZndfdmVyLCBsb2NhbC0+ZndfYmxkKTsKKworICAgIGxvY2FsLT50aWJfbGVuZ3RoID0gMHgyMDsKKyAgICBpZiAoKGxvY2FsLT5md192ZXIgPT0gNSkgJiYgKGxvY2FsLT5md19ibGQgPj0gMzApKQorICAgICAgICBsb2NhbC0+dGliX2xlbmd0aCA9IGxvY2FsLT5zdGFydHVwX3Jlcy50aWJfbGVuZ3RoOworICAgIERFQlVHKDIsInJheV9pbml0IHRpYl9sZW5ndGggPSAweCUwMnhcbiIsIGxvY2FsLT50aWJfbGVuZ3RoKTsKKyAgICAvKiBJbml0aWFsaXplIENDUydzIHRvIGJ1ZmZlciBmcmVlIHN0YXRlICovCisgICAgcGNjcyA9IGNjc19iYXNlKGxvY2FsKTsKKyAgICBmb3IgKGk9MDsgIGk8TlVNQkVSX09GX0NDUzsgIGkrKykgeworICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmKHBjY3MrKyktPmJ1ZmZlcl9zdGF0dXMpOworICAgIH0KKyAgICBpbml0X3N0YXJ0dXBfcGFyYW1zKGxvY2FsKTsKKworICAgIC8qIGNvcHkgbWFjIGFkZHJlc3MgdG8gc3RhcnR1cCBwYXJhbWV0ZXJzICovCisgICAgaWYgKHBhcnNlX2FkZHIocGh5X2FkZHIsIGxvY2FsLT5zcGFybS5iNC5hX21hY19hZGRyKSkKKyAgICB7CisgICAgICAgIHAgPSBsb2NhbC0+c3Bhcm0uYjQuYV9tYWNfYWRkcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbWVtY3B5KCZsb2NhbC0+c3Bhcm0uYjQuYV9tYWNfYWRkciwKKyAgICAgICAgICAgICAgICZsb2NhbC0+c3RhcnR1cF9yZXMuc3RhdGlvbl9hZGRyLCBBRERSTEVOKTsKKyAgICAgICAgcCA9IGxvY2FsLT5zcGFybS5iNC5hX21hY19hZGRyOworICAgIH0KKworICAgIGNsZWFyX2ludGVycnVwdChsb2NhbCk7IC8qIENsZWFyIGFueSBpbnRlcnJ1cHQgZnJvbSB0aGUgY2FyZCAqLworICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfQVdBSVRJTkdfUEFSQU07CisgICAgREVCVUcoMiwicmF5X2luaXQgZW5kaW5nXG4iKTsKKyAgICByZXR1cm4gMDsKK30gLyogcmF5X2luaXQgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIERvd25sb2FkIHN0YXJ0dXAgcGFyYW1ldGVycyB0byB0aGUgY2FyZCBhbmQgY29tbWFuZCBpdCB0byByZWFkIHRoZW0gICAgICAgKi8KK3N0YXRpYyBpbnQgZGxfc3RhcnR1cF9wYXJhbXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBpbnQgY2NzaW5kZXg7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisgICAgc3RydWN0IGNjcyBfX2lvbWVtICpwY2NzOworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworCisgICAgREVCVUcoMSwiZGxfc3RhcnR1cF9wYXJhbXMgZW50ZXJlZFxuIik7CisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2NzIGRsX3N0YXJ0dXBfcGFyYW1zIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAKKyAgICAvKiBDb3B5IHBhcmFtZXRlcnMgdG8gaG9zdCB0byBFQ0YgYXJlYSAqLworICAgIGlmIChsb2NhbC0+ZndfdmVyID09IDB4NTUpIAorICAgICAgICBtZW1jcHlfdG9pbyhsb2NhbC0+c3JhbSArIEhPU1RfVE9fRUNGX0JBU0UsICZsb2NhbC0+c3Bhcm0uYjQsCisgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGI0X3N0YXJ0dXBfcGFyYW1zKSk7CisgICAgZWxzZQorICAgICAgICBtZW1jcHlfdG9pbyhsb2NhbC0+c3JhbSArIEhPU1RfVE9fRUNGX0JBU0UsICZsb2NhbC0+c3Bhcm0uYjUsCisgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGI1X3N0YXJ0dXBfcGFyYW1zKSk7CisKKyAgICAKKyAgICAvKiBGaWxsIGluIHRoZSBDQ1MgZmllbGRzIGZvciB0aGUgRUNGICovCisgICAgaWYgKChjY3NpbmRleCA9IGdldF9mcmVlX2Njcyhsb2NhbCkpIDwgMCkgcmV0dXJuIC0xOworICAgIGxvY2FsLT5kbF9wYXJhbV9jY3MgPSBjY3NpbmRleDsKKyAgICBwY2NzID0gY2NzX2Jhc2UobG9jYWwpICsgY2NzaW5kZXg7CisgICAgd3JpdGViKENDU19ET1dOTE9BRF9TVEFSVFVQX1BBUkFNUywgJnBjY3MtPmNtZCk7CisgICAgREVCVUcoMiwiZGxfc3RhcnR1cF9wYXJhbXMgc3RhcnQgY2NzaW5kZXggPSAlZFxuIiwgbG9jYWwtPmRsX3BhcmFtX2Njcyk7CisgICAgLyogSW50ZXJydXB0IHRoZSBmaXJtd2FyZSB0byBwcm9jZXNzIHRoZSBjb21tYW5kICovCisgICAgaWYgKGludGVycnVwdF9lY2YobG9jYWwsIGNjc2luZGV4KSkgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJyYXkgZGxfc3RhcnR1cF9wYXJhbXMgZmFpbGVkIC0gIgorICAgICAgICAgICAiRUNGIG5vdCByZWFkeSBmb3IgaW50clxuIik7CisgICAgICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfRExfUEFSQU1fRVJST1I7CisgICAgICAgIHdyaXRlYihDQ1NfQlVGRkVSX0ZSRUUsICYocGNjcysrKS0+YnVmZmVyX3N0YXR1cyk7CisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CisgICAgbG9jYWwtPmNhcmRfc3RhdHVzID0gQ0FSRF9ETF9QQVJBTTsKKyAgICAvKiBTdGFydCBrZXJuZWwgdGltZXIgdG8gd2FpdCBmb3IgZGwgc3RhcnR1cCB0byBjb21wbGV0ZS4gKi8KKyAgICBsb2NhbC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWi8yOworICAgIGxvY2FsLT50aW1lci5kYXRhID0gKGxvbmcpbG9jYWw7CisgICAgbG9jYWwtPnRpbWVyLmZ1bmN0aW9uID0gJnZlcmlmeV9kbF9zdGFydHVwOworICAgIGFkZF90aW1lcigmbG9jYWwtPnRpbWVyKTsKKyAgICBERUJVRygyLCJyYXlfY3MgZGxfc3RhcnR1cF9wYXJhbXMgc3RhcnRlZCB0aW1lciBmb3IgdmVyaWZ5X2RsX3N0YXJ0dXBcbiIpOworICAgIHJldHVybiAwOworfSAvKiBkbF9zdGFydHVwX3BhcmFtcyAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgaW5pdF9zdGFydHVwX3BhcmFtcyhyYXlfZGV2X3QgKmxvY2FsKQoreworICAgIGludCBpOyAKKworICAgIGlmIChjb3VudHJ5ID4gSkFQQU5fVEVTVCkgY291bnRyeSA9IFVTQTsKKyAgICBlbHNlCisgICAgICAgIGlmIChjb3VudHJ5IDwgVVNBKSBjb3VudHJ5ID0gVVNBOworICAgIC8qIHN0cnVjdHVyZSBmb3IgaG9wIHRpbWUgYW5kIGJlYWNvbiBwZXJpb2QgaXMgZGVmaW5lZCBoZXJlIHVzaW5nIAorICAgICAqIE5ldyA4MDIuMTFENi4xIGZvcm1hdC4gIENhcmQgZmlybXdhcmUgaXMgc3RpbGwgdXNpbmcgb2xkIGZvcm1hdAorICAgICAqIHVudGlsIHZlcnNpb24gNi4KKyAgICAgKiAgICBCZWZvcmUgICAgICAgICAgICAgICAgICAgIEFmdGVyCisgICAgICogICAgYV9ob3BfdGltZSBtcyBieXRlICAgICAgICBhX2hvcF90aW1lIG1zIGJ5dGUKKyAgICAgKiAgICBhX2hvcF90aW1lIDJzIGJ5dGUgICAgICAgIGFfaG9wX3RpbWUgbHMgYnl0ZQorICAgICAqICAgIGFfaG9wX3RpbWUgbHMgYnl0ZSAgICAgICAgYV9iZWFjb25fcGVyaW9kIG1zIGJ5dGUKKyAgICAgKiAgICBhX2JlYWNvbl9wZXJpb2QgICAgICAgICAgIGFfYmVhY29uX3BlcmlvZCBscyBieXRlCisgICAgICoKKyAgICAgKiAgICBhX2hvcF90aW1lID0gdVMgICAgICAgICAgIGFfaG9wX3RpbWUgPSBLdVMKKyAgICAgKiAgICBhX2JlYWNvbl9wZXJpb2QgPSBob3BzICAgIGFfYmVhY29uX3BlcmlvZCA9IEt1UworICAgICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNjRtcyA9IDAxMDAwMCAqLworICAgIGlmIChsb2NhbC0+ZndfdmVyID09IDB4NTUpICB7CisgICAgICAgIG1lbWNweSgoVUNIQVIgKikmbG9jYWwtPnNwYXJtLmI0LCBiNF9kZWZhdWx0X3N0YXJ0dXBfcGFybXMsIAorICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBiNF9zdGFydHVwX3BhcmFtcykpOworICAgICAgICAvKiBUcmFuc2xhdGUgc2FuZSBrdXMgaW5wdXQgdmFsdWVzIHRvIG9sZCBidWlsZCA0LzUgZm9ybWF0ICovCisgICAgICAgIC8qIGkgPSBob3AgdGltZSBpbiB1UyB0cnVuY2F0ZWQgdG8gMyBieXRlcyAqLworICAgICAgICBpID0gKGhvcF9kd2VsbCAqIDEwMjQpICYgMHhmZmZmZmY7CisgICAgICAgIGxvY2FsLT5zcGFybS5iNC5hX2hvcF90aW1lWzBdID0gKGkgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgbG9jYWwtPnNwYXJtLmI0LmFfaG9wX3RpbWVbMV0gPSAoaSA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGxvY2FsLT5zcGFybS5iNC5hX2JlYWNvbl9wZXJpb2RbMF0gPSAwOworICAgICAgICBsb2NhbC0+c3Bhcm0uYjQuYV9iZWFjb25fcGVyaW9kWzFdID0KKyAgICAgICAgICAgICgoYmVhY29uX3BlcmlvZC9ob3BfZHdlbGwpIC0gMSkgJiAweGZmOworICAgICAgICBsb2NhbC0+c3Bhcm0uYjQuYV9jdXJyX2NvdW50cnlfY29kZSA9IGNvdW50cnk7CisgICAgICAgIGxvY2FsLT5zcGFybS5iNC5hX2hvcF9wYXR0ZXJuX2xlbmd0aCA9IAorICAgICAgICAgICAgaG9wX3BhdHRlcm5fbGVuZ3RoWyhpbnQpY291bnRyeV0gLSAxOworICAgICAgICBpZiAoYmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsLT5zcGFybS5iNC5hX2Fja190aW1lb3V0ID0gMHg1MDsKKyAgICAgICAgICAgIGxvY2FsLT5zcGFybS5iNC5hX3NpZnMgPSAweDNmOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeyAgICAvKiBWZXJzaW9uIDUgdXNlcyByZWFsIGt1cyB2YWx1ZXMgKi8KKyAgICAgICAgbWVtY3B5KChVQ0hBUiAqKSZsb2NhbC0+c3Bhcm0uYjUsIGI1X2RlZmF1bHRfc3RhcnR1cF9wYXJtcywgCisgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGI1X3N0YXJ0dXBfcGFyYW1zKSk7CisKKyAgICAgICAgbG9jYWwtPnNwYXJtLmI1LmFfaG9wX3RpbWVbMF0gPSAoaG9wX2R3ZWxsID4+IDgpICYgMHhmZjsKKyAgICAgICAgbG9jYWwtPnNwYXJtLmI1LmFfaG9wX3RpbWVbMV0gPSBob3BfZHdlbGwgJiAweGZmOworICAgICAgICBsb2NhbC0+c3Bhcm0uYjUuYV9iZWFjb25fcGVyaW9kWzBdID0gKGJlYWNvbl9wZXJpb2QgPj4gOCkgJiAweGZmOworICAgICAgICBsb2NhbC0+c3Bhcm0uYjUuYV9iZWFjb25fcGVyaW9kWzFdID0gYmVhY29uX3BlcmlvZCAmIDB4ZmY7CisgICAgICAgIGlmIChwc20pCisgICAgICAgICAgICBsb2NhbC0+c3Bhcm0uYjUuYV9wb3dlcl9tZ3Rfc3RhdGUgPSAxOworICAgICAgICBsb2NhbC0+c3Bhcm0uYjUuYV9jdXJyX2NvdW50cnlfY29kZSA9IGNvdW50cnk7CisgICAgICAgIGxvY2FsLT5zcGFybS5iNS5hX2hvcF9wYXR0ZXJuX2xlbmd0aCA9IAorICAgICAgICAgICAgaG9wX3BhdHRlcm5fbGVuZ3RoWyhpbnQpY291bnRyeV07CisgICAgfQorICAgIAorICAgIGxvY2FsLT5zcGFybS5iNC5hX25ldHdvcmtfdHlwZSA9IG5ldF90eXBlICYgMHgwMTsKKyAgICBsb2NhbC0+c3Bhcm0uYjQuYV9hY3RpbmdfYXNfYXBfc3RhdHVzID0gVFlQRV9TVEE7CisKKyAgICBpZiAoZXNzaWQgIT0gTlVMTCkKKyAgICAgICAgc3RybmNweShsb2NhbC0+c3Bhcm0uYjQuYV9jdXJyZW50X2Vzc19pZCwgZXNzaWQsIEVTU0lEX1NJWkUpOworfSAvKiBpbml0X3N0YXJ0dXBfcGFyYW1zICovIAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgdmVyaWZ5X2RsX3N0YXJ0dXAodV9sb25nIGRhdGEpCit7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkYXRhOworICAgIHN0cnVjdCBjY3MgX19pb21lbSAqcGNjcyA9IGNjc19iYXNlKGxvY2FsKSArIGxvY2FsLT5kbF9wYXJhbV9jY3M7CisgICAgVUNIQVIgc3RhdHVzOworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworCisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2NzIHZlcmlmeV9kbF9zdGFydHVwIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgICBpZiAocGNfZGVidWcgPiAyKSB7CisgICAgaW50IGk7CisgICAgcHJpbnRrKEtFUk5fREVCVUcgInZlcmlmeV9kbF9zdGFydHVwIHBhcmFtZXRlcnMgc2VudCB2aWEgY2NzICVkOlxuIiwKKyAgICAgICAgICAgbG9jYWwtPmRsX3BhcmFtX2Njcyk7CisgICAgICAgIGZvciAoaT0wOyBpPHNpemVvZihzdHJ1Y3QgYjVfc3RhcnR1cF9wYXJhbXMpOyBpKyspIHsKKyAgICAgICAgICAgIHByaW50aygiICUyeCIsICh1bnNpZ25lZCBpbnQpIHJlYWRiKGxvY2FsLT5zcmFtICsgSE9TVF9UT19FQ0ZfQkFTRSArIGkpKTsKKyAgICAgICAgfQorICAgIHByaW50aygiXG4iKTsKKyAgICB9CisjZW5kaWYKKworICAgIHN0YXR1cyA9IHJlYWRiKCZwY2NzLT5idWZmZXJfc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzIT0gQ0NTX0JVRkZFUl9GUkVFKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiRG93bmxvYWQgc3RhcnR1cCBwYXJhbXMgZmFpbGVkLiAgU3RhdHVzID0gJWRcbiIsCisgICAgICAgICAgIHN0YXR1cyk7CisgICAgICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfRExfUEFSQU1fRVJST1I7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGxvY2FsLT5zcGFybS5iNC5hX25ldHdvcmtfdHlwZSA9PSBBREhPQykKKyAgICAgICAgc3RhcnRfbmV0KCh1X2xvbmcpbG9jYWwpOworICAgIGVsc2UKKyAgICAgICAgam9pbl9uZXQoKHVfbG9uZylsb2NhbCk7CisKKyAgICByZXR1cm47Cit9IC8qIGVuZCB2ZXJpZnlfZGxfc3RhcnR1cCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogQ29tbWFuZCBjYXJkIHRvIHN0YXJ0IGEgbmV0d29yayAqLworc3RhdGljIHZvaWQgc3RhcnRfbmV0KHVfbG9uZyBkYXRhKQoreworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGF0YTsKKyAgICBzdHJ1Y3QgY2NzIF9faW9tZW0gKnBjY3M7CisgICAgaW50IGNjc2luZGV4OworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworICAgIGlmICghKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpKSB7CisgICAgICAgIERFQlVHKDIsInJheV9jcyBzdGFydF9uZXQgLSBkZXZpY2Ugbm90IHByZXNlbnRcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIEZpbGwgaW4gdGhlIENDUyBmaWVsZHMgZm9yIHRoZSBFQ0YgKi8KKyAgICBpZiAoKGNjc2luZGV4ID0gZ2V0X2ZyZWVfY2NzKGxvY2FsKSkgPCAwKSByZXR1cm47CisgICAgcGNjcyA9IGNjc19iYXNlKGxvY2FsKSArIGNjc2luZGV4OworICAgIHdyaXRlYihDQ1NfU1RBUlRfTkVUV09SSywgJnBjY3MtPmNtZCk7CisgICAgd3JpdGViKDAsICZwY2NzLT52YXIuc3RhcnRfbmV0d29yay51cGRhdGVfcGFyYW0pOworICAgIC8qIEludGVycnVwdCB0aGUgZmlybXdhcmUgdG8gcHJvY2VzcyB0aGUgY29tbWFuZCAqLworICAgIGlmIChpbnRlcnJ1cHRfZWNmKGxvY2FsLCBjY3NpbmRleCkpIHsKKyAgICAgICAgREVCVUcoMSwicmF5IHN0YXJ0IG5ldCBmYWlsZWQgLSBjYXJkIG5vdCByZWFkeSBmb3IgaW50clxuIik7CisgICAgICAgIHdyaXRlYihDQ1NfQlVGRkVSX0ZSRUUsICYocGNjcysrKS0+YnVmZmVyX3N0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbG9jYWwtPmNhcmRfc3RhdHVzID0gQ0FSRF9ET0lOR19BQ1E7CisgICAgcmV0dXJuOworfSAvKiBlbmQgc3RhcnRfbmV0ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBDb21tYW5kIGNhcmQgdG8gam9pbiBhIG5ldHdvcmsgKi8KK3N0YXRpYyB2b2lkIGpvaW5fbmV0KHVfbG9uZyBkYXRhKQoreworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGF0YTsKKworICAgIHN0cnVjdCBjY3MgX19pb21lbSAqcGNjczsKKyAgICBpbnQgY2NzaW5kZXg7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisgICAgCisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2NzIGpvaW5fbmV0IC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBGaWxsIGluIHRoZSBDQ1MgZmllbGRzIGZvciB0aGUgRUNGICovCisgICAgaWYgKChjY3NpbmRleCA9IGdldF9mcmVlX2Njcyhsb2NhbCkpIDwgMCkgcmV0dXJuOworICAgIHBjY3MgPSBjY3NfYmFzZShsb2NhbCkgKyBjY3NpbmRleDsKKyAgICB3cml0ZWIoQ0NTX0pPSU5fTkVUV09SSywgJnBjY3MtPmNtZCk7CisgICAgd3JpdGViKDAsICZwY2NzLT52YXIuam9pbl9uZXR3b3JrLnVwZGF0ZV9wYXJhbSk7CisgICAgd3JpdGViKDAsICZwY2NzLT52YXIuam9pbl9uZXR3b3JrLm5ldF9pbml0aWF0ZWQpOworICAgIC8qIEludGVycnVwdCB0aGUgZmlybXdhcmUgdG8gcHJvY2VzcyB0aGUgY29tbWFuZCAqLworICAgIGlmIChpbnRlcnJ1cHRfZWNmKGxvY2FsLCBjY3NpbmRleCkpIHsKKyAgICAgICAgREVCVUcoMSwicmF5IGpvaW4gbmV0IGZhaWxlZCAtIGNhcmQgbm90IHJlYWR5IGZvciBpbnRyXG4iKTsKKyAgICAgICAgd3JpdGViKENDU19CVUZGRVJfRlJFRSwgJihwY2NzKyspLT5idWZmZXJfc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0RPSU5HX0FDUTsKKyAgICByZXR1cm47Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBBZnRlciBhIGNhcmQgaXMgcmVtb3ZlZCwgcmF5X3JlbGVhc2UoKSB3aWxsIHVucmVnaXN0ZXIgdGhlIG5ldAorICAgIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICAgIHN0aWxsIG9wZW4sIHRoaXMgd2lsbCBiZSBwb3N0cG9uZWQgdW50aWwgaXQgaXMgY2xvc2VkLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgcmF5X3JlbGVhc2UoZGV2X2xpbmtfdCAqbGluaykKK3sKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsgCisgICAgcmF5X2Rldl90ICpsb2NhbCA9IGRldi0+cHJpdjsKKyAgICBpbnQgaTsKKyAgICAKKyAgICBERUJVRygxLCAicmF5X3JlbGVhc2UoMHglcClcbiIsIGxpbmspOworCisgICAgZGVsX3RpbWVyKCZsb2NhbC0+dGltZXIpOworICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHOworCisgICAgaW91bm1hcChsb2NhbC0+c3JhbSk7CisgICAgaW91bm1hcChsb2NhbC0+cm1lbSk7CisgICAgaW91bm1hcChsb2NhbC0+YW1lbSk7CisgICAgLyogRG8gYm90aGVyIGNoZWNraW5nIHRvIHNlZSBpZiB0aGVzZSBzdWNjZWVkIG9yIG5vdCAqLworICAgIGkgPSBwY21jaWFfcmVsZWFzZV93aW5kb3cobGluay0+d2luKTsKKyAgICBpZiAoIGkgIT0gQ1NfU1VDQ0VTUyApIERFQlVHKDAsIlJlbGVhc2VXaW5kb3cobGluay0+d2luKSByZXQgPSAleFxuIixpKTsKKyAgICBpID0gcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxvY2FsLT5hbWVtX2hhbmRsZSk7CisgICAgaWYgKCBpICE9IENTX1NVQ0NFU1MgKSBERUJVRygwLCJSZWxlYXNlV2luZG93KGxvY2FsLT5hbWVtKSByZXQgPSAleFxuIixpKTsKKyAgICBpID0gcGNtY2lhX3JlbGVhc2Vfd2luZG93KGxvY2FsLT5ybWVtX2hhbmRsZSk7CisgICAgaWYgKCBpICE9IENTX1NVQ0NFU1MgKSBERUJVRygwLCJSZWxlYXNlV2luZG93KGxvY2FsLT5ybWVtKSByZXQgPSAleFxuIixpKTsKKyAgICBpID0gcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworICAgIGlmICggaSAhPSBDU19TVUNDRVNTICkgREVCVUcoMCwiUmVsZWFzZUNvbmZpZ3VyYXRpb24gcmV0ID0gJXhcbiIsaSk7CisgICAgaSA9IHBjbWNpYV9yZWxlYXNlX2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworICAgIGlmICggaSAhPSBDU19TVUNDRVNTICkgREVCVUcoMCwiUmVsZWFzZUlSUSByZXQgPSAleFxuIixpKTsKKworICAgIERFQlVHKDIsInJheV9yZWxlYXNlIGVuZGluZ1xuIik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gIE1vc3RseSwgdGhpcyBzY2hlZHVsZXMgb3RoZXIKKyAgICBzdHVmZiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuICBBIENBUkRfUkVNT1ZBTCBldmVudAorICAgIGFsc28gc2V0cyBzb21lIGZsYWdzIHRvIGRpc2NvdXJhZ2UgdGhlIG5ldCBkcml2ZXJzIGZyb20gdHJ5aW5nCisgICAgdG8gdGFsayB0byB0aGUgY2FyZCBhbnkgbW9yZS4KKworICAgIFdoZW4gYSBDQVJEX1JFTU9WQUwgZXZlbnQgaXMgcmVjZWl2ZWQsIHdlIGltbWVkaWF0ZWx5IHNldCBhIGZsYWcKKyAgICB0byBibG9jayBmdXR1cmUgYWNjZXNzZXMgdG8gdGhpcyBkZXZpY2UuICBBbGwgdGhlIGZ1bmN0aW9ucyB0aGF0CisgICAgYWN0dWFsbHkgYWNjZXNzIHRoZSBkZXZpY2Ugc2hvdWxkIGNoZWNrIHRoaXMgZmxhZyB0byBtYWtlIHN1cmUKKyAgICB0aGUgY2FyZCBpcyBzdGlsbCBwcmVzZW50LgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCByYXlfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICphcmdzKQoreworICAgIGRldl9saW5rX3QgKmxpbmsgPSBhcmdzLT5jbGllbnRfZGF0YTsKKyAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKyAgICByYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKKyAgICBERUJVRygxLCAicmF5X2V2ZW50KDB4JTA2eClcbiIsIGV2ZW50KTsKKyAgICAKKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisgICAgICAgIGxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKyAgICAgICAgbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworICAgICAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisJICAgIHJheV9yZWxlYXNlKGxpbmspOworICAgICAgICAgICAgZGVsX3RpbWVyKCZsb2NhbC0+dGltZXIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT046CisgICAgICAgIGxpbmstPnN0YXRlIHw9IERFVl9QUkVTRU5UIHwgREVWX0NPTkZJR19QRU5ESU5HOworICAgICAgICByYXlfY29uZmlnKGxpbmspOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisgICAgICAgIGxpbmstPnN0YXRlIHw9IERFVl9TVVNQRU5EOworICAgICAgICAvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorICAgICAgICBpZiAobGluay0+c3RhdGUgJiBERVZfQ09ORklHKSB7CisgICAgICAgICAgICBpZiAobGluay0+b3BlbikKKyAgICAgICAgICAgIAluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKyAgICAgICAgICAgIHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENTX0VWRU5UX1BNX1JFU1VNRToKKyAgICAgICAgbGluay0+c3RhdGUgJj0gfkRFVl9TVVNQRU5EOworICAgICAgICAvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICBjYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisgICAgICAgIGlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKyAgICAgICAgICAgIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisgICAgICAgICAgICBpZiAobGluay0+b3BlbikgeworICAgICAgICAgICAgICAgIHJheV9yZXNldChkZXYpOworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworICAgIERFQlVHKDIsInJheV9ldmVudCBlbmRpbmdcbiIpOworfSAvKiByYXlfZXZlbnQgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCByYXlfZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZmRlZiBSQVlfSU1NRURJQVRFX0lOSVQKKyAgICBpbnQgaTsKKyNlbmRpZgkvKiBSQVlfSU1NRURJQVRFX0lOSVQgKi8KKyAgICByYXlfZGV2X3QgKmxvY2FsID0gZGV2LT5wcml2OworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworCisgICAgREVCVUcoMSwicmF5X2Rldl9pbml0KGRldj0lcClcbiIsZGV2KTsKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygyLCJyYXlfZGV2X2luaXQgLSBkZXZpY2Ugbm90IHByZXNlbnRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorI2lmZGVmIFJBWV9JTU1FRElBVEVfSU5JVAorICAgIC8qIERvd25sb2FkIHN0YXJ0dXAgcGFyYW1ldGVycyAqLworICAgIGlmICggKGkgPSBkbF9zdGFydHVwX3BhcmFtcyhkZXYpKSA8IDApCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJyYXlfZGV2X2luaXQgZGxfc3RhcnR1cF9wYXJhbXMgZmFpbGVkIC0gIgorICAgICAgICAgICAicmV0dXJucyAweCV4XG4iLGkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorI2Vsc2UJLyogUkFZX0lNTUVESUFURV9JTklUICovCisgICAgLyogUG9zdHBvbmUgdGhlIGNhcmQgaW5pdCBzbyB0aGF0IHdlIGNhbiBzdGlsbCBjb25maWd1cmUgdGhlIGNhcmQsCisgICAgICogZm9yIGV4YW1wbGUgdXNpbmcgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbnMuIFRoZSBpbml0IHdpbGwgaGFwcGVuCisgICAgICogaW4gcmF5X29wZW4oKSAtIEplYW4gSUkgKi8KKyAgICBERUJVRygxLCJyYXlfZGV2X2luaXQ6IHBvc3Rwb25pbmcgY2FyZCBpbml0IHRvIHJheV9vcGVuKCkgOyBTdGF0dXMgPSAlZFxuIiwKKwkgIGxvY2FsLT5jYXJkX3N0YXR1cyk7CisjZW5kaWYJLyogUkFZX0lNTUVESUFURV9JTklUICovCisKKyAgICAvKiBjb3B5IG1hYyBhbmQgYnJvYWRjYXN0IGFkZHJlc3NlcyB0byBsaW51eCBkZXZpY2UgKi8KKyAgICBtZW1jcHkoJmRldi0+ZGV2X2FkZHIsICZsb2NhbC0+c3Bhcm0uYjQuYV9tYWNfYWRkciwgQUREUkxFTik7CisgICAgbWVtc2V0KGRldi0+YnJvYWRjYXN0LCAweGZmLCBFVEhfQUxFTik7CisKKyAgICBERUJVRygyLCJyYXlfZGV2X2luaXQgZW5kaW5nXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQgcmF5X2Rldl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmbWFwICptYXApCit7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IGRldi0+cHJpdjsKKyAgICBkZXZfbGlua190ICpsaW5rID0gbG9jYWwtPmZpbmRlcjsKKyAgICAvKiBEdW1teSByb3V0aW5lIHRvIHNhdGlzZnkgZGV2aWNlIHN0cnVjdHVyZSAqLworICAgIERFQlVHKDEsInJheV9kZXZfY29uZmlnKGRldj0lcCxpZm1hcD0lcClcbiIsZGV2LG1hcCk7CisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2Rldl9jb25maWcgLSBkZXZpY2Ugbm90IHByZXNlbnRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHJheV9kZXZfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHJheV9kZXZfdCAqbG9jYWwgPSBkZXYtPnByaXY7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisgICAgc2hvcnQgbGVuZ3RoID0gc2tiLT5sZW47CisKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygyLCJyYXlfZGV2X3N0YXJ0X3htaXQgLSBkZXZpY2Ugbm90IHByZXNlbnRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIERFQlVHKDMsInJheV9kZXZfc3RhcnRfeG1pdChza2I9JXAsIGRldj0lcClcbiIsc2tiLGRldik7CisgICAgaWYgKGxvY2FsLT5hdXRoZW50aWNhdGlvbl9zdGF0ZSA9PSBORUVEX1RPX0FVVEgpIHsKKyAgICAgICAgREVCVUcoMCwicmF5X2NzIFNlbmRpbmcgYXV0aGVudGljYXRpb24gcmVxdWVzdC5cbiIpOworICAgICAgICBpZiAoIWJ1aWxkX2F1dGhfZnJhbWUgKGxvY2FsLCBsb2NhbC0+YXV0aF9pZCwgT1BFTl9BVVRIX1JFUVVFU1QpKSB7CisgICAgICAgICAgICBsb2NhbC0+YXV0aGVudGljYXRpb25fc3RhdGUgPSBBVVRIRU5USUNBVEVEOworICAgICAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobGVuZ3RoIDwgRVRIX1pMRU4pCisgICAgeworICAgIAlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisgICAgCWlmIChza2IgPT0gTlVMTCkKKyAgICAJCXJldHVybiAwOworICAgIAlsZW5ndGggPSBFVEhfWkxFTjsKKyAgICB9CisgICAgc3dpdGNoIChyYXlfaHdfeG1pdCggc2tiLT5kYXRhLCBsZW5ndGgsIGRldiwgREFUQV9UWVBFKSkgeworICAgICAgICBjYXNlIFhNSVRfTk9fQ0NTOgorICAgICAgICBjYXNlIFhNSVRfTkVFRF9BVVRIOgorCSAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBYTUlUX05PX0lOVFI6CisgICAgICAgIGNhc2UgWE1JVF9NU0dfQkFEOgorICAgICAgICBjYXNlIFhNSVRfT0s6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKyAgICAgICAgICAgIGRldl9rZnJlZV9za2Ioc2tiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMDsKK30gLyogcmF5X2Rldl9zdGFydF94bWl0ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHJheV9od194bWl0KHVuc2lnbmVkIGNoYXIqIGRhdGEsIGludCBsZW4sIHN0cnVjdCBuZXRfZGV2aWNlKiBkZXYsIAorICAgICAgICAgICAgICAgIFVDSEFSIG1zZ190eXBlKQoreworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworICAgIHN0cnVjdCBjY3MgX19pb21lbSAqcGNjczsKKyAgICBpbnQgY2NzaW5kZXg7CisgICAgaW50IG9mZnNldDsKKyAgICBzdHJ1Y3QgdHhfbXNnIF9faW9tZW0gKnB0eDsgLyogQWRkcmVzcyBvZiB4bWl0IGJ1ZmZlciBpbiBQQyBzcGFjZSAqLworICAgIHNob3J0IGludCBhZGRyOyAgICAgLyogQWRkcmVzcyBvZiB4bWl0IGJ1ZmZlciBpbiBjYXJkIHNwYWNlICovCisgICAgCisgICAgREVCVUcoMywicmF5X2h3X3htaXQoZGF0YT0lcCwgbGVuPSVkLCBkZXY9JXApXG4iLGRhdGEsbGVuLGRldik7CisgICAgaWYgKGxlbiArIFRYX0hFQURFUl9MRU5HVEggPiBUWF9CVUZfU0laRSkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gInJheV9od194bWl0IHBhY2tldCB0b28gbGFyZ2U6ICVkIGJ5dGVzXG4iLGxlbik7CisgICAgICAgIHJldHVybiBYTUlUX01TR19CQUQ7CisgICAgfQorCXN3aXRjaCAoY2NzaW5kZXggPSBnZXRfZnJlZV90eF9jY3MobG9jYWwpKSB7CisJY2FzZSBFQ0NTQlVTWToKKwkJREVCVUcoMiwicmF5X2h3X3htaXQgdHhfY2NzIHRhYmxlIGJ1c3lcbiIpOworCWNhc2UgRUNDU0ZVTEw6CisgICAgICAgIERFQlVHKDIsInJheV9od194bWl0IE5vIGZyZWUgdHggY2NzXG4iKTsKKwljYXNlIEVDQVJER09ORToKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgICAgIHJldHVybiBYTUlUX05PX0NDUzsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisgICAgYWRkciA9IFRYX0JVRl9CQVNFICsgKGNjc2luZGV4IDw8IDExKTsKKworICAgIGlmIChtc2dfdHlwZSA9PSBEQVRBX1RZUEUpIHsKKyAgICAgICAgbG9jYWwtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKKyAgICAgICAgbG9jYWwtPnN0YXRzLnR4X3BhY2tldHMrKzsKKyAgICB9CisKKyAgICBwdHggPSBsb2NhbC0+c3JhbSArIGFkZHI7CisKKyAgICByYXlfYnVpbGRfaGVhZGVyKGxvY2FsLCBwdHgsIG1zZ190eXBlLCBkYXRhKTsKKyAgICBpZiAodHJhbnNsYXRlKSB7CisgICAgICAgIG9mZnNldCA9IHRyYW5zbGF0ZV9mcmFtZShsb2NhbCwgcHR4LCBkYXRhLCBsZW4pOworICAgIH0KKyAgICBlbHNlIHsgLyogRW5jYXBzdWxhdGUgZnJhbWUgKi8KKyAgICAgICAgLyogVEJEIFRJQiBsZW5ndGggd2lsbCBtb3ZlIGFkZHJlc3Mgb2YgcHR4LT52YXIgKi8KKyAgICAgICAgbWVtY3B5X3RvaW8oJnB0eC0+dmFyLCBkYXRhLCBsZW4pOworICAgICAgICBvZmZzZXQgPSAwOworICAgIH0KKworICAgIC8qIGZpbGwgaW4gdGhlIENDUyAqLworICAgIHBjY3MgPSBjY3NfYmFzZShsb2NhbCkgKyBjY3NpbmRleDsKKyAgICBsZW4gKz0gVFhfSEVBREVSX0xFTkdUSCArIG9mZnNldDsKKyAgICB3cml0ZWIoQ0NTX1RYX1JFUVVFU1QsICZwY2NzLT5jbWQpOworICAgIHdyaXRlYihhZGRyID4+IDgsICZwY2NzLT52YXIudHhfcmVxdWVzdC50eF9kYXRhX3B0clswXSk7CisgICAgd3JpdGViKGxvY2FsLT50aWJfbGVuZ3RoLCAmcGNjcy0+dmFyLnR4X3JlcXVlc3QudHhfZGF0YV9wdHJbMV0pOworICAgIHdyaXRlYihsZW4gPj4gOCwgJnBjY3MtPnZhci50eF9yZXF1ZXN0LnR4X2RhdGFfbGVuZ3RoWzBdKTsKKyAgICB3cml0ZWIobGVuICYgMHhmZiwgJnBjY3MtPnZhci50eF9yZXF1ZXN0LnR4X2RhdGFfbGVuZ3RoWzFdKTsKKy8qIFRCRCBzdGlsbCBuZWVkIHBzbV9jYW0/ICovCisgICAgd3JpdGViKFBTTV9DQU0sICZwY2NzLT52YXIudHhfcmVxdWVzdC5wb3dfc2F2X21vZGUpOworICAgIHdyaXRlYihsb2NhbC0+bmV0X2RlZmF1bHRfdHhfcmF0ZSwgJnBjY3MtPnZhci50eF9yZXF1ZXN0LnR4X3JhdGUpOworICAgIHdyaXRlYigwLCAmcGNjcy0+dmFyLnR4X3JlcXVlc3QuYW50ZW5uYSk7CisgICAgREVCVUcoMywicmF5X2h3X3htaXQgZGVmYXVsdF90eF9yYXRlID0gMHgleFxuIixcCisgICAgICAgICAgbG9jYWwtPm5ldF9kZWZhdWx0X3R4X3JhdGUpOworCisgICAgLyogSW50ZXJydXB0IHRoZSBmaXJtd2FyZSB0byBwcm9jZXNzIHRoZSBjb21tYW5kICovCisgICAgaWYgKGludGVycnVwdF9lY2YobG9jYWwsIGNjc2luZGV4KSkgeworICAgICAgICBERUJVRygyLCJyYXlfaHdfeG1pdCBmYWlsZWQgLSBFQ0Ygbm90IHJlYWR5IGZvciBpbnRyXG4iKTsKKy8qIFRCRCB2ZXJ5IGluZWZmaWNpZW50IHRvIGNvcHkgcGFja2V0IHRvIGJ1ZmZlciwgYW5kIHRoZW4gbm90CisgICBzZW5kIGl0LCBidXQgdGhlIGFsdGVybmF0aXZlIGlzIHRvIHF1ZXVlIHRoZSBtZXNzYWdlcyBhbmQgdGhhdAorICAgd29uJ3QgYmUgZG9uZSBmb3IgYSB3aGlsZS4gIE1heWJlIHNldCB0YnVzeSB1bnRpbCBhIENDUyBpcyBmcmVlPworKi8KKyAgICAgICAgd3JpdGViKENDU19CVUZGRVJfRlJFRSwgJnBjY3MtPmJ1ZmZlcl9zdGF0dXMpOworICAgICAgICByZXR1cm4gWE1JVF9OT19JTlRSOworICAgIH0KKyAgICByZXR1cm4gWE1JVF9PSzsKK30gLyogZW5kIHJheV9od194bWl0ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHRyYW5zbGF0ZV9mcmFtZShyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgdHhfbXNnIF9faW9tZW0gKnB0eCwgdW5zaWduZWQgY2hhciAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbikKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgcHJvdG8gPSAoKHN0cnVjdCBldGhoZHIgKilkYXRhKS0+aF9wcm90bzsKKyAgICBpZiAobnRvaHMocHJvdG8pID49IDE1MzYpIHsgLyogRElYIElJIGV0aGVybmV0IGZyYW1lICovCisgICAgICAgIERFQlVHKDMsInJheV9jcyB0cmFuc2xhdGVfZnJhbWUgRElYIElJXG4iKTsKKyAgICAgICAgLyogQ29weSBMTEMgaGVhZGVyIHRvIGNhcmQgYnVmZmVyICovCisgICAgICAgIG1lbWNweV90b2lvKCZwdHgtPnZhciwgZXRoMl9sbGMsIHNpemVvZihldGgyX2xsYykpOworICAgICAgICBtZW1jcHlfdG9pbyggKCh2b2lkIF9faW9tZW0gKikmcHR4LT52YXIpICsgc2l6ZW9mKGV0aDJfbGxjKSwgKFVDSEFSICopJnByb3RvLCAyKTsKKyAgICAgICAgaWYgKChwcm90byA9PSAweGYzODApIHx8IChwcm90byA9PSAweDM3ODEpKSB7CisgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBzZWxlY3RpdmUgdHJhbnNsYXRpb24gdGFibGUsIG9ubHkgMiBlbnRyaWVzICovCisgICAgICAgICAgICB3cml0ZWIoMHhmOCwgJigoc3RydWN0IHNuYXBoZHJfdCBfX2lvbWVtICopcHR4LT52YXIpLT5vcmdbM10pOworICAgICAgICB9CisgICAgICAgIC8qIENvcHkgYm9keSBvZiBldGhlcm5ldCBwYWNrZXQgd2l0aG91dCBldGhlcm5ldCBoZWFkZXIgKi8KKyAgICAgICAgbWVtY3B5X3RvaW8oKHZvaWQgX19pb21lbSAqKSZwdHgtPnZhciArIHNpemVvZihzdHJ1Y3Qgc25hcGhkcl90KSwgXAorICAgICAgICAgICAgICAgICAgICBkYXRhICsgRVRIX0hMRU4sICBsZW4gLSBFVEhfSExFTik7CisgICAgICAgIHJldHVybiAoaW50KSBzaXplb2Yoc3RydWN0IHNuYXBoZHJfdCkgLSBFVEhfSExFTjsKKyAgICB9CisgICAgZWxzZSB7IC8qIGFscmVhZHkgIDgwMiB0eXBlLCBhbmQgcHJvdG8gaXMgbGVuZ3RoICovCisgICAgICAgIERFQlVHKDMsInJheV9jcyB0cmFuc2xhdGVfZnJhbWUgODAyXG4iKTsKKyAgICAgICAgaWYgKHByb3RvID09IDB4ZmZmZikgeyAvKiBldmlsIG5ldHdhcmUgSVBYIDgwMi4zIHdpdGhvdXQgTExDICovCisgICAgICAgIERFQlVHKDMsInJheV9jcyB0cmFuc2xhdGVfZnJhbWUgZXZpbCBJUFhcbiIpOworICAgICAgICAgICAgbWVtY3B5X3RvaW8oJnB0eC0+dmFyLCBkYXRhICsgRVRIX0hMRU4sICBsZW4gLSBFVEhfSExFTik7CisgICAgICAgICAgICByZXR1cm4gMCAtIEVUSF9ITEVOOworICAgICAgICB9CisgICAgICAgIG1lbWNweV90b2lvKCZwdHgtPnZhciwgZGF0YSArIEVUSF9ITEVOLCAgbGVuIC0gRVRIX0hMRU4pOworICAgICAgICByZXR1cm4gMCAtIEVUSF9ITEVOOworICAgIH0KKyAgICAvKiBUQkQgZG8gb3RoZXIgZnJhbWUgdHlwZXMgKi8KK30gLyogZW5kIHRyYW5zbGF0ZV9mcmFtZSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgcmF5X2J1aWxkX2hlYWRlcihyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgdHhfbXNnIF9faW9tZW0gKnB0eCwgVUNIQVIgbXNnX3R5cGUsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKyAgICB3cml0ZWIoUFJPVE9DT0xfVkVSIHwgbXNnX3R5cGUsICZwdHgtPm1hYy5mcmFtZV9jdGxfMSk7CisvKioqIElFRUUgODAyLjExIEFkZHJlc3MgZmllbGQgYXNzaWdubWVudHMgKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgIFRPRFMgRlJPTURTICAgYWRkcl8xICAgICBhZGRyXzIgICAgICAgICAgYWRkcl8zICAgYWRkcl80CitBZGhvYyAgICAgICAgICAgMCAgICAwICAgICAgICBkZXN0ICAgICAgIHNyYyAodGVybWluYWwpICBCU1NJRCAgICBOL0EKK0FQIHRvIFRlcm1pbmFsICAwICAgIDEgICAgICAgIGRlc3QgICAgICAgQVAoQlNTSUQpICAgICAgIHNvdXJjZSAgIE4vQQorVGVybWluYWwgdG8gQVAgIDEgICAgMCAgICAgICAgQVAoQlNTSUQpICBzcmMgKHRlcm1pbmFsKSAgZGVzdCAgICAgTi9BCitBUCB0byBBUCAgICAgICAgMSAgICAxICAgICAgICBkZXN0IEFQICAgIHNyYyBBUCAgICAgICAgICBkZXN0ICAgICBzb3VyY2UgICAgICAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKGxvY2FsLT5uZXRfdHlwZSA9PSBBREhPQykgeyAgIAorICAgICAgICB3cml0ZWIoMCwgJnB0eC0+bWFjLmZyYW1lX2N0bF8yKTsKKyAgICAgICAgbWVtY3B5X3RvaW8ocHR4LT5tYWMuYWRkcl8xLCAoKHN0cnVjdCBldGhoZHIgKilkYXRhKS0+aF9kZXN0LCAyICogQUREUkxFTik7CisgICAgICAgIG1lbWNweV90b2lvKHB0eC0+bWFjLmFkZHJfMywgbG9jYWwtPmJzc19pZCwgQUREUkxFTik7CisgICAgfQorICAgIGVsc2UgLyogaW5mcmFzdHJ1Y3R1cmUgKi8KKyAgICB7CisgICAgICAgIGlmIChsb2NhbC0+c3Bhcm0uYjQuYV9hY3RpbmdfYXNfYXBfc3RhdHVzKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZWIoRkMyX0ZST01fRFMsICZwdHgtPm1hYy5mcmFtZV9jdGxfMik7CisgICAgICAgICAgICBtZW1jcHlfdG9pbyhwdHgtPm1hYy5hZGRyXzEsICgoc3RydWN0IGV0aGhkciAqKWRhdGEpLT5oX2Rlc3QsIEFERFJMRU4pOworICAgICAgICAgICAgbWVtY3B5X3RvaW8ocHR4LT5tYWMuYWRkcl8yLCBsb2NhbC0+YnNzX2lkLCA2KTsKKyAgICAgICAgICAgIG1lbWNweV90b2lvKHB0eC0+bWFjLmFkZHJfMywgKChzdHJ1Y3QgZXRoaGRyICopZGF0YSktPmhfc291cmNlLCBBRERSTEVOKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIFRlcm1pbmFsICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlYihGQzJfVE9fRFMsICZwdHgtPm1hYy5mcmFtZV9jdGxfMik7CisgICAgICAgICAgICBtZW1jcHlfdG9pbyhwdHgtPm1hYy5hZGRyXzEsIGxvY2FsLT5ic3NfaWQsIEFERFJMRU4pOworICAgICAgICAgICAgbWVtY3B5X3RvaW8ocHR4LT5tYWMuYWRkcl8yLCAoKHN0cnVjdCBldGhoZHIgKilkYXRhKS0+aF9zb3VyY2UsIEFERFJMRU4pOworICAgICAgICAgICAgbWVtY3B5X3RvaW8ocHR4LT5tYWMuYWRkcl8zLCAoKHN0cnVjdCBldGhoZHIgKilkYXRhKS0+aF9kZXN0LCBBRERSTEVOKTsKKyAgICAgICAgfQorICAgIH0KK30gLyogZW5kIGVuY2Fwc3VsYXRlX2ZyYW1lICovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmNweShpbmZvLT5kcml2ZXIsICJyYXlfY3MiKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCQk9IG5ldGRldl9nZXRfZHJ2aW5mbywKK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgaW50IHJheV9kZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisgICAgaW50IGVyciA9IDA7CisjaWYgV0lSRUxFU1NfRVhUID4gNworICAgIHN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBpZnI7CisjZW5kaWYJLyogV0lSRUxFU1NfRVhUID4gNyAqLworI2lmZGVmIFdJUkVMRVNTX1NQWQorICAgIHN0cnVjdCBzb2NrYWRkcglhZGRyZXNzW0lXX01BWF9TUFldOworI2VuZGlmCS8qIFdJUkVMRVNTX1NQWSAqLworCisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2Rldl9pb2N0bCAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgREVCVUcoMiwicmF5X2NzIElPQ1RMIGRldj0lcCwgaWZyPSVwLCBjbWQgPSAweCV4XG4iLGRldixpZnIsY21kKTsKKyAgICAvKiBWYWxpZGF0ZSB0aGUgY29tbWFuZCAqLworICAgIHN3aXRjaCAoY21kKQorICAgIHsKKyNpZiBXSVJFTEVTU19FWFQgPiA3CisgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0gV0lSRUxFU1MgRVhURU5TSU9OUyAtLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgIC8qIEdldCBuYW1lICovCisgICAgY2FzZSBTSU9DR0lXTkFNRToKKyAgICAgIHN0cmNweSh3cnEtPnUubmFtZSwgIklFRUUgODAyLjExLUZIIik7CisgICAgICBicmVhazsKKworICAgICAgLyogR2V0IGZyZXF1ZW5jeS9jaGFubmVsICovCisgICAgY2FzZSBTSU9DR0lXRlJFUToKKyAgICAgIHdycS0+dS5mcmVxLm0gPSBsb2NhbC0+c3Bhcm0uYjUuYV9ob3BfcGF0dGVybjsKKyAgICAgIHdycS0+dS5mcmVxLmUgPSAwOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFNldCBmcmVxdWVuY3kvY2hhbm5lbCAqLworICAgIGNhc2UgU0lPQ1NJV0ZSRVE6CisgICAgICAvKiBSZWplY3QgaWYgY2FyZCBpcyBhbHJlYWR5IGluaXRpYWxpc2VkICovCisgICAgICBpZihsb2NhbC0+Y2FyZF9zdGF0dXMgIT0gQ0FSRF9BV0FJVElOR19QQVJBTSkKKwl7CisJICBlcnIgPSAtRUJVU1k7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIFNldHRpbmcgYnkgY2hhbm5lbCBudW1iZXIgKi8KKyAgICAgIGlmICgod3JxLT51LmZyZXEubSA+IFVTQV9IT1BfTU9EKSB8fCAod3JxLT51LmZyZXEuZSA+IDApKQorCWVyciA9IC1FT1BOT1RTVVBQOworICAgICAgZWxzZQorCSAgbG9jYWwtPnNwYXJtLmI1LmFfaG9wX3BhdHRlcm4gPSB3cnEtPnUuZnJlcS5tOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEdldCBjdXJyZW50IG5ldHdvcmsgbmFtZSAoRVNTSUQpICovCisgICAgY2FzZSBTSU9DR0lXRVNTSUQ6CisgICAgICBpZiAod3JxLT51LmRhdGEucG9pbnRlcikKKwl7CisJICBjaGFyIGVzc2lkW0lXX0VTU0lEX01BWF9TSVpFICsgMV07CisJICAvKiBHZXQgdGhlIGVzc2lkIHRoYXQgd2FzIHNldCAqLworCSAgbWVtY3B5KGVzc2lkLCBsb2NhbC0+c3Bhcm0uYjUuYV9jdXJyZW50X2Vzc19pZCwKKwkJIElXX0VTU0lEX01BWF9TSVpFKTsKKwkgIGVzc2lkW0lXX0VTU0lEX01BWF9TSVpFXSA9ICdcMCc7CisKKwkgIC8qIFB1c2ggaXQgb3V0ICEgKi8KKwkgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihlc3NpZCkgKyAxOworCSAgd3JxLT51LmRhdGEuZmxhZ3MgPSAxOyAvKiBhY3RpdmUgKi8KKwkgIGlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgZXNzaWQsIHNpemVvZihlc3NpZCkpKQorCQkgIGVyciA9IC1FRkFVTFQ7CisJfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFNldCBkZXNpcmVkIG5ldHdvcmsgbmFtZSAoRVNTSUQpICovCisgICAgY2FzZSBTSU9DU0lXRVNTSUQ6CisgICAgICAvKiBSZWplY3QgaWYgY2FyZCBpcyBhbHJlYWR5IGluaXRpYWxpc2VkICovCisgICAgICBpZihsb2NhbC0+Y2FyZF9zdGF0dXMgIT0gQ0FSRF9BV0FJVElOR19QQVJBTSkKKwl7CisJICBlcnIgPSAtRUJVU1k7CisJICBicmVhazsKKwl9CisKKwlpZiAod3JxLT51LmRhdGEucG9pbnRlcikKKwl7CisJICAgIGNoYXIJY2FyZF9lc3NpZFtJV19FU1NJRF9NQVhfU0laRSArIDFdOworCSAgICAKKwkgICAgLyogQ2hlY2sgaWYgd2UgYXNrZWQgZm9yIGBhbnknICovCisJICAgIGlmKHdycS0+dS5kYXRhLmZsYWdzID09IDApCisJICAgIHsKKwkJLyogQ29yZXkgOiBjYW4geW91IGRvIHRoYXQgPyAqLworCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLyogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIHN0cmluZyAqLworCQlpZih3cnEtPnUuZGF0YS5sZW5ndGggPgorCQkgICBJV19FU1NJRF9NQVhfU0laRSArIDEpCisJCXsKKwkJICAgIGVyciA9IC1FMkJJRzsKKwkJICAgIGJyZWFrOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcihjYXJkX2Vzc2lkLAorCQkJCSAgIHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkJICAgd3JxLT51LmRhdGEubGVuZ3RoKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWNhcmRfZXNzaWRbSVdfRVNTSURfTUFYX1NJWkVdID0gJ1wwJzsKKworCQkvKiBTZXQgdGhlIEVTU0lEIGluIHRoZSBjYXJkICovCisJCW1lbWNweShsb2NhbC0+c3Bhcm0uYjUuYV9jdXJyZW50X2Vzc19pZCwgY2FyZF9lc3NpZCwKKwkJICAgICAgIElXX0VTU0lEX01BWF9TSVpFKTsKKwkgICAgfQorCX0KKwlicmVhazsKKworICAgICAgLyogR2V0IGN1cnJlbnQgQWNjZXNzIFBvaW50IChCU1NJRCBpbiBvdXIgY2FzZSkgKi8KKyAgICBjYXNlIFNJT0NHSVdBUDoKKyAgICAgIG1lbWNweSh3cnEtPnUuYXBfYWRkci5zYV9kYXRhLCBsb2NhbC0+YnNzX2lkLCBFVEhfQUxFTik7CisgICAgICB3cnEtPnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisgICAgICBicmVhazsKKworICAgICAgLyogR2V0IHRoZSBjdXJyZW50IGJpdC1yYXRlICovCisgICAgY2FzZSBTSU9DR0lXUkFURToKKyAgICAgIGlmKGxvY2FsLT5uZXRfZGVmYXVsdF90eF9yYXRlID09IDMpCisJd3JxLT51LmJpdHJhdGUudmFsdWUgPSAyMDAwMDAwOwkJLyogSHVtLi4uICovCisgICAgICBlbHNlCisJd3JxLT51LmJpdHJhdGUudmFsdWUgPSBsb2NhbC0+bmV0X2RlZmF1bHRfdHhfcmF0ZSAqIDUwMDAwMDsKKyAgICAgIHdycS0+dS5iaXRyYXRlLmZpeGVkID0gMDsJCS8qIFdlIGFyZSBpbiBhdXRvIG1vZGUgKi8KKyAgICAgIGJyZWFrOworCisgICAgICAvKiBTZXQgdGhlIGRlc2lyZWQgYml0LXJhdGUgKi8KKyAgICBjYXNlIFNJT0NTSVdSQVRFOgorICAgICAgLyogQ2hlY2sgaWYgcmF0ZSBpcyBpbiByYW5nZSAqLworICAgICAgaWYoKHdycS0+dS5iaXRyYXRlLnZhbHVlICE9IDEwMDAwMDApICYmCisJICh3cnEtPnUuYml0cmF0ZS52YWx1ZSAhPSAyMDAwMDAwKSkKKwl7CisJICBlcnIgPSAtRUlOVkFMOworCSAgYnJlYWs7CisJfQorICAgICAgLyogSGFjayBmb3IgMS41IE1iL3MgaW5zdGVhZCBvZiAyIE1iL3MgKi8KKyAgICAgIGlmKChsb2NhbC0+ZndfdmVyID09IDB4NTUpICYmCQkvKiBQbGVhc2UgY2hlY2sgKi8KKwkgKHdycS0+dS5iaXRyYXRlLnZhbHVlID09IDIwMDAwMDApKQorCWxvY2FsLT5uZXRfZGVmYXVsdF90eF9yYXRlID0gMzsKKyAgICAgIGVsc2UKKwlsb2NhbC0+bmV0X2RlZmF1bHRfdHhfcmF0ZSA9IHdycS0+dS5iaXRyYXRlLnZhbHVlLzUwMDAwMDsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgUlRTIHRocmVzaG9sZCAqLworICAgIGNhc2UgU0lPQ0dJV1JUUzoKKyAgICAgIHdycS0+dS5ydHMudmFsdWUgPSAobG9jYWwtPnNwYXJtLmI1LmFfcnRzX3RocmVzaG9sZFswXSA8PCA4KQorCSsgbG9jYWwtPnNwYXJtLmI1LmFfcnRzX3RocmVzaG9sZFsxXTsKKyNpZiBXSVJFTEVTU19FWFQgPiA4CisgICAgICB3cnEtPnUucnRzLmRpc2FibGVkID0gKHdycS0+dS5ydHMudmFsdWUgPT0gMzI3NjcpOworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKyAgICAgIHdycS0+dS5ydHMuZml4ZWQgPSAxOworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFNldCB0aGUgZGVzaXJlZCBSVFMgdGhyZXNob2xkICovCisgICAgY2FzZSBTSU9DU0lXUlRTOgorICAgIHsKKwlpbnQgcnRociA9IHdycS0+dS5ydHMudmFsdWU7CisKKyAgICAgIC8qIFJlamVjdCBpZiBjYXJkIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQgKi8KKyAgICAgIGlmKGxvY2FsLT5jYXJkX3N0YXR1cyAhPSBDQVJEX0FXQUlUSU5HX1BBUkFNKQorCXsKKwkgIGVyciA9IC1FQlVTWTsKKwkgIGJyZWFrOworCX0KKworCS8qIGlmKHdycS0+dS5ydHMuZml4ZWQgPT0gMCkgd2Ugc2hvdWxkIGNvbXBsYWluICovCisjaWYgV0lSRUxFU1NfRVhUID4gOAorCWlmKHdycS0+dS5ydHMuZGlzYWJsZWQpCisJICAgIHJ0aHIgPSAzMjc2NzsKKwllbHNlCisjZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gOCAqLworCSAgICBpZigocnRociA8IDApIHx8IChydGhyID4gMjM0NykpIC8qIFdoYXQncyB0aGUgbWF4IHBhY2tldCBzaXplID8/PyAqLworCSAgICB7CisJCWVyciA9IC1FSU5WQUw7CisJCWJyZWFrOworCSAgICB9CisJbG9jYWwtPnNwYXJtLmI1LmFfcnRzX3RocmVzaG9sZFswXSA9IChydGhyID4+IDgpICYgMHhGRjsKKwlsb2NhbC0+c3Bhcm0uYjUuYV9ydHNfdGhyZXNob2xkWzFdID0gcnRociAmIDB4RkY7CisgICAgfQorICAgIGJyZWFrOworCisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQgKi8KKyAgICBjYXNlIFNJT0NHSVdGUkFHOgorICAgICAgd3JxLT51LmZyYWcudmFsdWUgPSAobG9jYWwtPnNwYXJtLmI1LmFfZnJhZ190aHJlc2hvbGRbMF0gPDwgOCkKKwkrIGxvY2FsLT5zcGFybS5iNS5hX2ZyYWdfdGhyZXNob2xkWzFdOworI2lmIFdJUkVMRVNTX0VYVCA+IDgKKyAgICAgIHdycS0+dS5mcmFnLmRpc2FibGVkID0gKHdycS0+dS5mcmFnLnZhbHVlID09IDMyNzY3KTsKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA4ICovCisgICAgICB3cnEtPnUuZnJhZy5maXhlZCA9IDE7CisgICAgICBicmVhazsKKworICAgICAgLyogU2V0IHRoZSBkZXNpcmVkIGZyYWdtZW50YXRpb24gdGhyZXNob2xkICovCisgICAgY2FzZSBTSU9DU0lXRlJBRzoKKyAgICB7CisJaW50IGZ0aHIgPSB3cnEtPnUuZnJhZy52YWx1ZTsKKworICAgICAgLyogUmVqZWN0IGlmIGNhcmQgaXMgYWxyZWFkeSBpbml0aWFsaXNlZCAqLworICAgICAgaWYobG9jYWwtPmNhcmRfc3RhdHVzICE9IENBUkRfQVdBSVRJTkdfUEFSQU0pCisJeworCSAgZXJyID0gLUVCVVNZOworCSAgYnJlYWs7CisJfQorCisJLyogaWYod3JxLT51LmZyYWcuZml4ZWQgPT0gMCkgc2hvdWxkIGNvbXBsYWluICovCisjaWYgV0lSRUxFU1NfRVhUID4gOAorCWlmKHdycS0+dS5mcmFnLmRpc2FibGVkKQorCSAgICBmdGhyID0gMzI3Njc7CisJZWxzZQorI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KKwkgICAgaWYoKGZ0aHIgPCAyNTYpIHx8IChmdGhyID4gMjM0NykpIC8qIFRvIGNoZWNrIG91dCAhICovCisJICAgIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJICAgIH0KKwlsb2NhbC0+c3Bhcm0uYjUuYV9mcmFnX3RocmVzaG9sZFswXSA9IChmdGhyID4+IDgpICYgMHhGRjsKKwlsb2NhbC0+c3Bhcm0uYjUuYV9mcmFnX3RocmVzaG9sZFsxXSA9IGZ0aHIgJiAweEZGOworICAgIH0KKyAgICBicmVhazsKKworI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCA+IDcgKi8KKyNpZiBXSVJFTEVTU19FWFQgPiA4CisKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCBtb2RlIG9mIG9wZXJhdGlvbiAqLworICAgIGNhc2UgU0lPQ0dJV01PREU6CisgICAgICBpZihsb2NhbC0+c3Bhcm0uYjUuYV9uZXR3b3JrX3R5cGUpCisJd3JxLT51Lm1vZGUgPSBJV19NT0RFX0lORlJBOworICAgICAgZWxzZQorCXdycS0+dS5tb2RlID0gSVdfTU9ERV9BREhPQzsKKyAgICAgIGJyZWFrOworCisgICAgICAvKiBTZXQgdGhlIGN1cnJlbnQgbW9kZSBvZiBvcGVyYXRpb24gKi8KKyAgICBjYXNlIFNJT0NTSVdNT0RFOgorICAgIHsKKwljaGFyIGNhcmRfbW9kZSA9IDE7CisJCisgICAgICAvKiBSZWplY3QgaWYgY2FyZCBpcyBhbHJlYWR5IGluaXRpYWxpc2VkICovCisgICAgICBpZihsb2NhbC0+Y2FyZF9zdGF0dXMgIT0gQ0FSRF9BV0FJVElOR19QQVJBTSkKKwl7CisJICBlcnIgPSAtRUJVU1k7CisJICBicmVhazsKKwl9CisKKwlzd2l0Y2ggKHdycS0+dS5tb2RlKQorCXsKKwljYXNlIElXX01PREVfQURIT0M6CisJICAgIGNhcmRfbW9kZSA9IDA7CisJICAgIC8vIEZhbGwgdGhyb3VnaAorCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkgICAgbG9jYWwtPnNwYXJtLmI1LmFfbmV0d29ya190eXBlID0gY2FyZF9tb2RlOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBlcnIgPSAtRUlOVkFMOworCX0KKyAgICB9CisgICAgYnJlYWs7CisKKyNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA4ICovCisjaWYgV0lSRUxFU1NfRVhUID4gNworICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tIElXU1BZIFNVUFBPUlQgLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAvKiBEZWZpbmUgdGhlIHJhbmdlICh2YXJpYXRpb25zKSBvZiBhYm92ZSBwYXJhbWV0ZXJzICovCisgICAgY2FzZSBTSU9DR0lXUkFOR0U6CisgICAgICAvKiBCYXNpYyBjaGVja2luZy4uLiAqLworICAgICAgaWYod3JxLT51LmRhdGEucG9pbnRlciAhPSAoY2FkZHJfdCkgMCkKKwl7CisJICBzdHJ1Y3QgaXdfcmFuZ2UJcmFuZ2U7CisJICBtZW1zZXQoKGNoYXIgKikgJnJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7CisKKwkgIC8qIFNldCB0aGUgbGVuZ3RoICh2ZXJ5IGltcG9ydGFudCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkgKi8KKwkgIHdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpOworCisjaWYgV0lSRUxFU1NfRVhUID4gMTAKKwkgIC8qIFNldCB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9uIHZlcnNpb25zICovCisJICByYW5nZS53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCSAgcmFuZ2Uud2VfdmVyc2lvbl9zb3VyY2UgPSA5OworI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEwICovCisKKwkgIC8qIFNldCBpbmZvcm1hdGlvbiBpbiB0aGUgcmFuZ2Ugc3RydWN0ICovCisJICByYW5nZS50aHJvdWdocHV0ID0gMS4xICogMTAwMCAqIDEwMDA7CS8qIFB1dCB0aGUgcmlnaHQgbnVtYmVyIGhlcmUgKi8KKwkgIHJhbmdlLm51bV9jaGFubmVscyA9IGhvcF9wYXR0ZXJuX2xlbmd0aFsoaW50KWNvdW50cnldOyAKKwkgIHJhbmdlLm51bV9mcmVxdWVuY3kgPSAwOworCSAgcmFuZ2UubWF4X3F1YWwucXVhbCA9IDA7CisJICByYW5nZS5tYXhfcXVhbC5sZXZlbCA9IDI1NTsJLyogV2hhdCdzIHRoZSBjb3JyZWN0IHZhbHVlID8gKi8KKwkgIHJhbmdlLm1heF9xdWFsLm5vaXNlID0gMjU1OwkvKiBJZGVtICovCisJICByYW5nZS5udW1fYml0cmF0ZXMgPSAyOworCSAgcmFuZ2UuYml0cmF0ZVswXSA9IDEwMDAwMDA7CS8qIDEgTWIvcyAqLworCSAgcmFuZ2UuYml0cmF0ZVsxXSA9IDIwMDAwMDA7CS8qIDIgTWIvcyAqLworCisJICAvKiBDb3B5IHN0cnVjdHVyZSB0byB0aGUgdXNlciBidWZmZXIgKi8KKwkgIGlmKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmcmFuZ2UsCisJCQkgIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKSkKKwkgICAgZXJyID0gLUVGQVVMVDsKKwl9CisgICAgICBicmVhazsKKworI2lmZGVmIFdJUkVMRVNTX1NQWQorICAgICAgLyogU2V0IGFkZHJlc3NlcyB0byBzcHkgKi8KKyAgICBjYXNlIFNJT0NTSVdTUFk6CisgICAgICAvKiBDaGVjayB0aGUgbnVtYmVyIG9mIGFkZHJlc3NlcyAqLworICAgICAgaWYod3JxLT51LmRhdGEubGVuZ3RoID4gSVdfTUFYX1NQWSkKKwl7CisJICBlcnIgPSAtRTJCSUc7CisJICBicmVhazsKKwl9CisgICAgICBsb2NhbC0+c3B5X251bWJlciA9IHdycS0+dS5kYXRhLmxlbmd0aDsKKworICAgICAgLyogSWYgdGhlcmUgaXMgc29tZSBhZGRyZXNzZXMgdG8gY29weSAqLworICAgICAgaWYobG9jYWwtPnNweV9udW1iZXIgPiAwKQorCXsKKwkgIGludAkJCWk7CisKKwkgIC8qIENvcHkgYWRkcmVzc2VzIHRvIHRoZSBkcml2ZXIgKi8KKwkgIGlmKGNvcHlfZnJvbV91c2VyKGFkZHJlc3MsIHdycS0+dS5kYXRhLnBvaW50ZXIsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKiBsb2NhbC0+c3B5X251bWJlcikpCisJICAgIHsKKwkgICAgICBlcnIgPSAtRUZBVUxUOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIC8qIENvcHkgYWRkcmVzc2VzIHRvIHRoZSBscCBzdHJ1Y3R1cmUgKi8KKwkgIGZvcihpID0gMDsgaSA8IGxvY2FsLT5zcHlfbnVtYmVyOyBpKyspCisJICAgIG1lbWNweShsb2NhbC0+c3B5X2FkZHJlc3NbaV0sIGFkZHJlc3NbaV0uc2FfZGF0YSwgRVRIX0FMRU4pOworCisJICAvKiBSZXNldCBzdHJ1Y3R1cmUuLi4gKi8KKwkgIG1lbXNldChsb2NhbC0+c3B5X3N0YXQsIDB4MDAsIHNpemVvZihpd19xdWFsKSAqIElXX01BWF9TUFkpOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworCSAgcHJpbnRrKEtFUk5fREVCVUcgIlNldFNweSAtIFNldCBvZiBuZXcgYWRkcmVzc2VzIGlzIDpcbiIpOworCSAgZm9yKGkgPSAwOyBpIDwgbG9jYWwtPnNweV9udW1iZXI7IGkrKykKKwkgICAgcHJpbnRrKEtFUk5fREVCVUcgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCQkgICBsb2NhbC0+c3B5X2FkZHJlc3NbaV1bMF0sCisJCSAgIGxvY2FsLT5zcHlfYWRkcmVzc1tpXVsxXSwKKwkJICAgbG9jYWwtPnNweV9hZGRyZXNzW2ldWzJdLAorCQkgICBsb2NhbC0+c3B5X2FkZHJlc3NbaV1bM10sCisJCSAgIGxvY2FsLT5zcHlfYWRkcmVzc1tpXVs0XSwKKwkJICAgbG9jYWwtPnNweV9hZGRyZXNzW2ldWzVdKTsKKyNlbmRpZgkvKiBERUJVR19JT0NUTF9JTkZPICovCisJfQorICAgICAgYnJlYWs7CisKKyAgICAgIC8qIEdldCB0aGUgc3B5IGxpc3QgYW5kIHNweSBzdGF0cyAqLworICAgIGNhc2UgU0lPQ0dJV1NQWToKKyAgICAgIC8qIFNldCB0aGUgbnVtYmVyIG9mIGFkZHJlc3NlcyAqLworICAgICAgd3JxLT51LmRhdGEubGVuZ3RoID0gbG9jYWwtPnNweV9udW1iZXI7CisKKyAgICAgIC8qIElmIHRoZSB1c2VyIHdhbnQgdG8gaGF2ZSB0aGUgYWRkcmVzc2VzIGJhY2suLi4gKi8KKyAgICAgIGlmKChsb2NhbC0+c3B5X251bWJlciA+IDApICYmICh3cnEtPnUuZGF0YS5wb2ludGVyICE9IChjYWRkcl90KSAwKSkKKwl7CisJICBpbnQJCQlpOworCisJICAvKiBDb3B5IGFkZHJlc3NlcyBmcm9tIHRoZSBscCBzdHJ1Y3R1cmUgKi8KKwkgIGZvcihpID0gMDsgaSA8IGxvY2FsLT5zcHlfbnVtYmVyOyBpKyspCisJICAgIHsKKwkgICAgICBtZW1jcHkoYWRkcmVzc1tpXS5zYV9kYXRhLCBsb2NhbC0+c3B5X2FkZHJlc3NbaV0sIEVUSF9BTEVOKTsKKwkgICAgICBhZGRyZXNzW2ldLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkgICAgfQorCisJICAvKiBDb3B5IGFkZHJlc3NlcyB0byB0aGUgdXNlciBidWZmZXIgKi8KKwkgIGlmKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBhZGRyZXNzLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKiBsb2NhbC0+c3B5X251bWJlcikpCisJICAgIHsKKwkgICAgICBlcnIgPSAtRUZBVUxUOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIC8qIENvcHkgc3RhdHMgdG8gdGhlIHVzZXIgYnVmZmVyIChqdXN0IGFmdGVyKSAqLworCSAgaWYoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIgKworCQkgICAgICAgKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICogbG9jYWwtPnNweV9udW1iZXIpLAorCQkgICAgICAgbG9jYWwtPnNweV9zdGF0LCBzaXplb2YoaXdfcXVhbCkgKiBsb2NhbC0+c3B5X251bWJlcikpCisJICAgIHsKKwkgICAgICBlcnIgPSAtRUZBVUxUOworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIC8qIFJlc2V0IHVwZGF0ZWQgZmxhZ3MgKi8KKwkgIGZvcihpID0gMDsgaSA8IGxvY2FsLT5zcHlfbnVtYmVyOyBpKyspCisJICAgIGxvY2FsLT5zcHlfc3RhdFtpXS51cGRhdGVkID0gMHgwOworCX0JLyogaWYocG9pbnRlciAhPSBOVUxMKSAqLworCisgICAgICBicmVhazsKKyNlbmRpZgkvKiBXSVJFTEVTU19TUFkgKi8KKworICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tIFBSSVZBVEUgSU9DVEwgLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZuZGVmIFNJT0NJV0ZJUlNUUFJJVgorI2RlZmluZSBTSU9DSVdGSVJTVFBSSVYJU0lPQ0RFVlBSSVZBVEUKKyNlbmRpZiAvKiBTSU9DSVdGSVJTVFBSSVYgKi8KKyNkZWZpbmUgU0lPQ1NJUEZSQU1JTkcJU0lPQ0lXRklSU1RQUklWCQkvKiBTZXQgZnJhbWluZyBtb2RlICovCisjZGVmaW5lIFNJT0NHSVBGUkFNSU5HCVNJT0NJV0ZJUlNUUFJJViArIDEJLyogR2V0IGZyYW1pbmcgbW9kZSAqLworI2RlZmluZSBTSU9DR0lQQ09VTlRSWQlTSU9DSVdGSVJTVFBSSVYgKyAzCS8qIEdldCBjb3VudHJ5IGNvZGUgKi8KKyAgICBjYXNlIFNJT0NTSVBGUkFNSU5HOgorICAgICAgaWYoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCS8qIEZvciBwcml2YXRlIElPQ1RMcywgd2UgbmVlZCB0byBjaGVjayBwZXJtaXNzaW9ucyAqLworCXsKKwkgIGVyciA9IC1FUEVSTTsKKwkgIGJyZWFrOworCX0KKyAgICAgIHRyYW5zbGF0ZSA9ICood3JxLT51Lm5hbWUpOwkvKiBTZXQgZnJhbWluZyBtb2RlICovCisgICAgICBicmVhazsKKyAgICBjYXNlIFNJT0NHSVBGUkFNSU5HOgorICAgICAgKih3cnEtPnUubmFtZSkgPSB0cmFuc2xhdGU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNJT0NHSVBDT1VOVFJZOgorICAgICAgKih3cnEtPnUubmFtZSkgPSBjb3VudHJ5OworICAgICAgYnJlYWs7CisgICAgY2FzZSBTSU9DR0lXUFJJVjoKKyAgICAgIC8qIEV4cG9ydCBvdXIgInByaXZhdGUiIGludGVyY2FjZSAqLworICAgICAgaWYod3JxLT51LmRhdGEucG9pbnRlciAhPSAoY2FkZHJfdCkgMCkKKwl7CisJICBzdHJ1Y3QgaXdfcHJpdl9hcmdzCXByaXZbXSA9CisJICB7CS8qIGNtZCwJCXNldF9hcmdzLAlnZXRfYXJncywJbmFtZSAqLworCSAgICB7IFNJT0NTSVBGUkFNSU5HLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRfZnJhbWluZyIgfSwKKwkgICAgeyBTSU9DR0lQRlJBTUlORywgMCwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0X2ZyYW1pbmciIH0sCisJICAgIHsgU0lPQ0dJUENPVU5UUlksIDAsIElXX1BSSVZfVFlQRV9CWVRFIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgImdldF9jb3VudHJ5IiB9LAorCSAgfTsKKwkgIC8qIFNldCB0aGUgbnVtYmVyIG9mIGlvY3RsIGF2YWlsYWJsZSAqLworCSAgd3JxLT51LmRhdGEubGVuZ3RoID0gMzsKKwkgIC8qIENvcHkgc3RydWN0dXJlIHRvIHRoZSB1c2VyIGJ1ZmZlciAqLworCSAgaWYoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICh1X2NoYXIgKikgcHJpdiwKKwkJICAgICAgIHNpemVvZihwcml2KSkpCisJICAgIGVyciA9IC1FRkFVTFQ7CisJfQorICAgICAgYnJlYWs7CisjZW5kaWYJLyogV0lSRUxFU1NfRVhUID4gNyAqLworCisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERFQlVHKDAsInJheV9kZXZfaW9jdGwgY21kID0gMHgleFxuIiwgY21kKTsKKyAgICAgICAgICAgIGVyciA9IC1FT1BOT1RTVVBQOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfSAvKiBlbmQgcmF5X2Rldl9pb2N0bCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmIFdJUkVMRVNTX0VYVCA+IDcJLyogSWYgd2lyZWxlc3MgZXh0ZW5zaW9uIGV4aXN0IGluIHRoZSBrZXJuZWwgKi8KK3N0YXRpYyBpd19zdGF0cyAqIHJheV9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisgIHJheV9kZXZfdCAqCWxvY2FsID0gKHJheV9kZXZfdCAqKSBkZXYtPnByaXY7CisgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworICBzdHJ1Y3Qgc3RhdHVzIF9faW9tZW0gKnAgPSBsb2NhbC0+c3JhbSArIFNUQVRVU19CQVNFOworCisgIGlmKGxvY2FsID09IChyYXlfZGV2X3QgKikgTlVMTCkKKyAgICByZXR1cm4gKGl3X3N0YXRzICopIE5VTEw7CisKKyAgbG9jYWwtPndzdGF0cy5zdGF0dXMgPSBsb2NhbC0+Y2FyZF9zdGF0dXM7CisjaWZkZWYgV0lSRUxFU1NfU1BZCisgIGlmKChsb2NhbC0+c3B5X251bWJlciA+IDApICYmIChsb2NhbC0+c3Bhcm0uYjUuYV9uZXR3b3JrX3R5cGUgPT0gMCkpCisgICAgeworICAgICAgLyogR2V0IGl0IGZyb20gdGhlIGZpcnN0IG5vZGUgaW4gc3B5IGxpc3QgKi8KKyAgICAgIGxvY2FsLT53c3RhdHMucXVhbC5xdWFsID0gbG9jYWwtPnNweV9zdGF0WzBdLnF1YWw7CisgICAgICBsb2NhbC0+d3N0YXRzLnF1YWwubGV2ZWwgPSBsb2NhbC0+c3B5X3N0YXRbMF0ubGV2ZWw7CisgICAgICBsb2NhbC0+d3N0YXRzLnF1YWwubm9pc2UgPSBsb2NhbC0+c3B5X3N0YXRbMF0ubm9pc2U7CisgICAgICBsb2NhbC0+d3N0YXRzLnF1YWwudXBkYXRlZCA9IGxvY2FsLT5zcHlfc3RhdFswXS51cGRhdGVkOworICAgIH0KKyNlbmRpZiAvKiBXSVJFTEVTU19TUFkgKi8KKworICBpZigobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICBsb2NhbC0+d3N0YXRzLnF1YWwubm9pc2UgPSByZWFkYigmcC0+cnhub2lzZSk7CisgICAgbG9jYWwtPndzdGF0cy5xdWFsLnVwZGF0ZWQgfD0gNDsKKyAgfQorCisgIHJldHVybiAmbG9jYWwtPndzdGF0czsKK30gLyogZW5kIHJheV9nZXRfd2lyZWxlc3Nfc3RhdHMgKi8KKyNlbmRpZgkvKiBXSVJFTEVTU19FWFQgPiA3ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHJheV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgZGV2X2xpbmtfdCAqbGluazsKKyAgICByYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKKyAgICAKKyAgICBERUJVRygxLCAicmF5X29wZW4oJyVzJylcbiIsIGRldi0+bmFtZSk7CisKKyAgICBmb3IgKGxpbmsgPSBkZXZfbGlzdDsgbGluazsgbGluayA9IGxpbmstPm5leHQpCisgICAgICAgIGlmIChsaW5rLT5wcml2ID09IGRldikgYnJlYWs7CisgICAgaWYgKCFERVZfT0sobGluaykpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgaWYgKGxpbmstPm9wZW4gPT0gMCkgbG9jYWwtPm51bV9tdWx0aSA9IDA7CisgICAgbGluay0+b3BlbisrOworCisgICAgLyogSWYgdGhlIGNhcmQgaXMgbm90IHN0YXJ0ZWQsIHRpbWUgdG8gc3RhcnQgaXQgISAtIEplYW4gSUkgKi8KKyAgICBpZihsb2NhbC0+Y2FyZF9zdGF0dXMgPT0gQ0FSRF9BV0FJVElOR19QQVJBTSkgeworCWludCBpOworCisJREVCVUcoMSwicmF5X29wZW46IGRvaW5nIGluaXQgbm93ICFcbiIpOworCisJLyogRG93bmxvYWQgc3RhcnR1cCBwYXJhbWV0ZXJzICovCisJaWYgKCAoaSA9IGRsX3N0YXJ0dXBfcGFyYW1zKGRldikpIDwgMCkKKwkgIHsKKwkgICAgcHJpbnRrKEtFUk5fSU5GTyAicmF5X2Rldl9pbml0IGRsX3N0YXJ0dXBfcGFyYW1zIGZhaWxlZCAtICIKKwkJICAgInJldHVybnMgMHgleFxuIixpKTsKKwkgICAgcmV0dXJuIC0xOworCSAgfQorICAgICB9CisKKyAgICBpZiAoc25pZmZlcikgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworICAgIGVsc2UgICAgICAgICBuZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisgICAgREVCVUcoMiwicmF5X29wZW4gZW5kaW5nXG4iKTsKKyAgICByZXR1cm4gMDsKK30gLyogZW5kIHJheV9vcGVuICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHJheV9kZXZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBkZXZfbGlua190ICpsaW5rOworCisgICAgREVCVUcoMSwgInJheV9kZXZfY2xvc2UoJyVzJylcbiIsIGRldi0+bmFtZSk7CisKKyAgICBmb3IgKGxpbmsgPSBkZXZfbGlzdDsgbGluazsgbGluayA9IGxpbmstPm5leHQpCisgICAgICAgIGlmIChsaW5rLT5wcml2ID09IGRldikgYnJlYWs7CisgICAgaWYgKGxpbmsgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisKKyAgICBsaW5rLT5vcGVuLS07CisgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgICAgLyogSW4gaGVyZSwgd2Ugc2hvdWxkIHN0b3AgdGhlIGhhcmR3YXJlIChzdG9wIGNhcmQgZnJvbSBiZWVpbmcgYWN0aXZlKQorICAgICAqIGFuZCBzZXQgbG9jYWwtPmNhcmRfc3RhdHVzIHRvIENBUkRfQVdBSVRJTkdfUEFSQU0sIHNvIHRoYXQgd2hpbGUgdGhlCisgICAgICogY2FyZCBpcyBjbG9zZWQgd2UgY2FuIGNoYWdlIGl0cyBjb25maWd1cmF0aW9uLgorICAgICAqIFByb2JhYmx5IGFsc28gbmVlZCBhIENPUiByZXNldCB0byBnZXQgc2FuZSBzdGF0ZSAtIEplYW4gSUkgKi8KKworICAgIHJldHVybiAwOworfSAvKiBlbmQgcmF5X2Rldl9jbG9zZSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgcmF5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpIHsKKyAgICBERUJVRygxLCJyYXlfcmVzZXQgZW50ZXJlZFxuIik7CisgICAgcmV0dXJuOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogQ2F1c2UgYSBmaXJtd2FyZSBpbnRlcnJ1cHQgaWYgaXQgaXMgcmVhZHkgZm9yIG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIG5vbnplcm8gaWYgbm90IHJlYWR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIGludCBpbnRlcnJ1cHRfZWNmKHJheV9kZXZfdCAqbG9jYWwsIGludCBjY3MpCit7CisgICAgaW50IGkgPSA1MDsKKyAgICBkZXZfbGlua190ICpsaW5rID0gbG9jYWwtPmZpbmRlcjsKKworICAgIGlmICghKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpKSB7CisgICAgICAgIERFQlVHKDIsInJheV9jcyBpbnRlcnJ1cHRfZWNmIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBERUJVRygyLCJpbnRlcnJ1cHRfZWNmKGxvY2FsPSVwLCBjY3MgPSAweCV4XG4iLGxvY2FsLGNjcyk7CisKKyAgICB3aGlsZSAoIGkgJiYgCisgICAgICAgICAgICAocmVhZGIobG9jYWwtPmFtZW0gKyBDSVNfT0ZGU0VUICsgRUNGX0lOVFJfT0ZGU0VUKSAmIEVDRl9JTlRSX1NFVCkpCisgICAgICAgIGktLTsKKyAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgIERFQlVHKDIsInJheV9jcyBpbnRlcnJ1cHRfZWNmIGNhcmQgbm90IHJlYWR5IGZvciBpbnRlcnJ1cHRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCS8qIEZpbGwgdGhlIG1haWxib3gsIHRoZW4ga2ljayB0aGUgY2FyZCAqLworICAgIHdyaXRlYihjY3MsIGxvY2FsLT5zcmFtICsgU0NCX0JBU0UpOworICAgIHdyaXRlYihFQ0ZfSU5UUl9TRVQsIGxvY2FsLT5hbWVtICsgQ0lTX09GRlNFVCArIEVDRl9JTlRSX09GRlNFVCk7CisgICAgcmV0dXJuIDA7Cit9IC8qIGludGVycnVwdF9lY2YgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIEdldCBuZXh0IGZyZWUgdHJhbnNtaXQgQ0NTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJldHVybiAtIGluZGV4IG9mIGN1cnJlbnQgdHggY2NzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0YXRpYyBpbnQgZ2V0X2ZyZWVfdHhfY2NzKHJheV9kZXZfdCAqbG9jYWwpCit7CisgICAgaW50IGk7CisgICAgc3RydWN0IGNjcyBfX2lvbWVtICpwY2NzID0gY2NzX2Jhc2UobG9jYWwpOworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworCisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2NzIGdldF9mcmVlX3R4X2NjcyAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybiBFQ0FSREdPTkU7CisgICAgfQorCisgICAgaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwmbG9jYWwtPnR4X2Njc19sb2NrKSkgeworICAgICAgICBERUJVRygxLCJyYXlfY3MgdHhfY2NzX2xvY2sgYnVzeVxuIik7CisgICAgICAgIHJldHVybiBFQ0NTQlVTWTsKKyAgICB9IAorCisgICAgZm9yIChpPTA7IGkgPCBOVU1CRVJfT0ZfVFhfQ0NTOyBpKyspIHsKKyAgICAgICAgaWYgKHJlYWRiKCYocGNjcytpKS0+YnVmZmVyX3N0YXR1cykgPT0gQ0NTX0JVRkZFUl9GUkVFKSB7CisgICAgICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9CVVNZLCAmKHBjY3MraSktPmJ1ZmZlcl9zdGF0dXMpOworICAgICAgICAgICAgd3JpdGViKENDU19FTkRfTElTVCwgJihwY2NzK2kpLT5saW5rKTsKKwkJCWxvY2FsLT50eF9jY3NfbG9jayA9IDA7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKwlsb2NhbC0+dHhfY2NzX2xvY2sgPSAwOworICAgIERFQlVHKDIsInJheV9jcyBFUlJPUiBubyBmcmVlIHR4IENDUyBmb3IgcmF5bGluayBjYXJkXG4iKTsKKyAgICByZXR1cm4gRUNDU0ZVTEw7Cit9IC8qIGdldF9mcmVlX3R4X2NjcyAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogR2V0IG5leHQgZnJlZSBDQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUmV0dXJuIC0gaW5kZXggb2YgY3VycmVudCBjY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIGludCBnZXRfZnJlZV9jY3MocmF5X2Rldl90ICpsb2NhbCkKK3sKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgY2NzIF9faW9tZW0gKnBjY3MgPSBjY3NfYmFzZShsb2NhbCk7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygyLCJyYXlfY3MgZ2V0X2ZyZWVfY2NzIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIEVDQVJER09ORTsKKyAgICB9CisgICAgaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwmbG9jYWwtPmNjc19sb2NrKSkgeworICAgICAgICBERUJVRygxLCJyYXlfY3MgY2NzX2xvY2sgYnVzeVxuIik7CisgICAgICAgIHJldHVybiBFQ0NTQlVTWTsKKyAgICB9IAorCisgICAgZm9yIChpID0gTlVNQkVSX09GX1RYX0NDUzsgaSA8IE5VTUJFUl9PRl9DQ1M7IGkrKykgeworICAgICAgICBpZiAocmVhZGIoJihwY2NzK2kpLT5idWZmZXJfc3RhdHVzKSA9PSBDQ1NfQlVGRkVSX0ZSRUUpIHsKKyAgICAgICAgICAgIHdyaXRlYihDQ1NfQlVGRkVSX0JVU1ksICYocGNjcytpKS0+YnVmZmVyX3N0YXR1cyk7CisgICAgICAgICAgICB3cml0ZWIoQ0NTX0VORF9MSVNULCAmKHBjY3MraSktPmxpbmspOworCQkJbG9jYWwtPmNjc19sb2NrID0gMDsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorCWxvY2FsLT5jY3NfbG9jayA9IDA7CisgICAgREVCVUcoMSwicmF5X2NzIEVSUk9SIG5vIGZyZWUgQ0NTIGZvciByYXlsaW5rIGNhcmRcbiIpOworICAgIHJldHVybiBFQ0NTRlVMTDsKK30gLyogZ2V0X2ZyZWVfY2NzICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBhdXRoZW50aWNhdGVfdGltZW91dCh1X2xvbmcgZGF0YSkKK3sKKyAgICByYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRhdGE7CisgICAgZGVsX3RpbWVyKCZsb2NhbC0+dGltZXIpOworICAgIHByaW50ayhLRVJOX0lORk8gInJheV9jcyBBdXRoZW50aWNhdGlvbiB3aXRoIGFjY2VzcyBwb2ludCBmYWlsZWQiCisgICAgICAgIiAtIHRpbWVvdXRcbiIpOworICAgIGpvaW5fbmV0KCh1X2xvbmcpbG9jYWwpOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCBhc2NfdG9faW50KGNoYXIgYSkKK3sKKyAgICBpZiAoYSA8ICcwJykgcmV0dXJuIC0xOworICAgIGlmIChhIDw9ICc5JykgcmV0dXJuIChhIC0gJzAnKTsKKyAgICBpZiAoYSA8ICdBJykgcmV0dXJuIC0xOworICAgIGlmIChhIDw9ICdGJykgcmV0dXJuICgxMCArIGEgLSAnQScpOworICAgIGlmIChhIDwgJ2EnKSByZXR1cm4gLTE7CisgICAgaWYgKGEgPD0gJ2YnKSByZXR1cm4gKDEwICsgYSAtICdhJyk7CisgICAgcmV0dXJuIC0xOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCBwYXJzZV9hZGRyKGNoYXIgKmluX3N0ciwgVUNIQVIgKm91dCkKK3sKKyAgICBpbnQgbGVuOworICAgIGludCBpLGosazsKKyAgICBpbnQgc3RhdHVzOworICAgIAorICAgIGlmIChpbl9zdHIgPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgaWYgKChsZW4gPSBzdHJsZW4oaW5fc3RyKSkgPCAyKSByZXR1cm4gMDsKKyAgICBtZW1zZXQob3V0LCAwLCBBRERSTEVOKTsKKworICAgIHN0YXR1cyA9IDE7CisgICAgaiA9IGxlbiAtIDE7CisgICAgaWYgKGogPiAxMikgaiA9IDEyOworICAgIGkgPSA1OworICAgIAorICAgIHdoaWxlIChqID4gMCkKKyAgICB7CisgICAgICAgIGlmICgoayA9IGFzY190b19pbnQoaW5fc3RyW2otLV0pKSAhPSAtMSkgb3V0W2ldID0gazsKKyAgICAgICAgZWxzZSByZXR1cm4gMDsKKworICAgICAgICBpZiAoaiA9PSAwKSBicmVhazsKKyAgICAgICAgaWYgKChrID0gYXNjX3RvX2ludChpbl9zdHJbai0tXSkpICE9IC0xKSBvdXRbaV0gKz0gayA8PCA0OworICAgICAgICBlbHNlIHJldHVybiAwOworICAgICAgICBpZiAoIWktLSkgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnJheV9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICByYXlfZGV2X3QgKmxvY2FsID0gKHJheV9kZXZfdCAqKWRldi0+cHJpdjsKKyAgICBkZXZfbGlua190ICpsaW5rID0gbG9jYWwtPmZpbmRlcjsKKyAgICBzdHJ1Y3Qgc3RhdHVzIF9faW9tZW0gKnAgPSBsb2NhbC0+c3JhbSArIFNUQVRVU19CQVNFOworICAgIGlmICghKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpKSB7CisgICAgICAgIERFQlVHKDIsInJheV9jcyBuZXRfZGV2aWNlX3N0YXRzIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuICZsb2NhbC0+c3RhdHM7CisgICAgfQorICAgIGlmIChyZWFkYigmcC0+bXJ4X292ZXJmbG93X2Zvcl9ob3N0KSkKKyAgICB7CisgICAgICAgIGxvY2FsLT5zdGF0cy5yeF9vdmVyX2Vycm9ycyArPSBudG9ocyhyZWFkYigmcC0+bXJ4X292ZXJmbG93KSk7CisgICAgICAgIHdyaXRlYigwLCZwLT5tcnhfb3ZlcmZsb3cpOworICAgICAgICB3cml0ZWIoMCwmcC0+bXJ4X292ZXJmbG93X2Zvcl9ob3N0KTsKKyAgICB9CisgICAgaWYgKHJlYWRiKCZwLT5tcnhfY2hlY2tzdW1fZXJyb3JfZm9yX2hvc3QpKQorICAgIHsKKyAgICAgICAgbG9jYWwtPnN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gbnRvaHMocmVhZGIoJnAtPm1yeF9jaGVja3N1bV9lcnJvcikpOworICAgICAgICB3cml0ZWIoMCwmcC0+bXJ4X2NoZWNrc3VtX2Vycm9yKTsKKyAgICAgICAgd3JpdGViKDAsJnAtPm1yeF9jaGVja3N1bV9lcnJvcl9mb3JfaG9zdCk7CisgICAgfQorICAgIGlmIChyZWFkYigmcC0+cnhfaGVjX2Vycm9yX2Zvcl9ob3N0KSkKKyAgICB7CisgICAgICAgIGxvY2FsLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMgKz0gbnRvaHMocmVhZGIoJnAtPnJ4X2hlY19lcnJvcikpOworICAgICAgICB3cml0ZWIoMCwmcC0+cnhfaGVjX2Vycm9yKTsKKyAgICAgICAgd3JpdGViKDAsJnAtPnJ4X2hlY19lcnJvcl9mb3JfaG9zdCk7CisgICAgfQorICAgIHJldHVybiAmbG9jYWwtPnN0YXRzOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgcmF5X3VwZGF0ZV9wYXJtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIFVDSEFSIG9iamlkLCBVQ0hBUiAqdmFsdWUsIGludCBsZW4pCit7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisgICAgaW50IGNjc2luZGV4OworICAgIGludCBpOworICAgIHN0cnVjdCBjY3MgX19pb21lbSAqcGNjczsKKworICAgIGlmICghKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpKSB7CisgICAgICAgIERFQlVHKDIsInJheV91cGRhdGVfcGFybSAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKGNjc2luZGV4ID0gZ2V0X2ZyZWVfY2NzKGxvY2FsKSkgPCAwKQorICAgIHsKKyAgICAgICAgREVCVUcoMCwicmF5X3VwZGF0ZV9wYXJtIC0gTm8gZnJlZSBjY3NcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBjY3MgPSBjY3NfYmFzZShsb2NhbCkgKyBjY3NpbmRleDsKKyAgICB3cml0ZWIoQ0NTX1VQREFURV9QQVJBTVMsICZwY2NzLT5jbWQpOworICAgIHdyaXRlYihvYmppZCwgJnBjY3MtPnZhci51cGRhdGVfcGFyYW0ub2JqZWN0X2lkKTsKKyAgICB3cml0ZWIoMSwgJnBjY3MtPnZhci51cGRhdGVfcGFyYW0ubnVtYmVyX29iamVjdHMpOworICAgIHdyaXRlYigwLCAmcGNjcy0+dmFyLnVwZGF0ZV9wYXJhbS5mYWlsdXJlX2NhdXNlKTsKKyAgICBmb3IgKGk9MDsgaTxsZW47IGkrKykgeworICAgICAgICB3cml0ZWIodmFsdWVbaV0sIGxvY2FsLT5zcmFtICsgSE9TVF9UT19FQ0ZfQkFTRSk7CisgICAgfQorICAgIC8qIEludGVycnVwdCB0aGUgZmlybXdhcmUgdG8gcHJvY2VzcyB0aGUgY29tbWFuZCAqLworICAgIGlmIChpbnRlcnJ1cHRfZWNmKGxvY2FsLCBjY3NpbmRleCkpIHsKKyAgICAgICAgREVCVUcoMCwicmF5X2NzIGFzc29jaWF0ZSBmYWlsZWQgLSBFQ0Ygbm90IHJlYWR5IGZvciBpbnRyXG4iKTsKKyAgICAgICAgd3JpdGViKENDU19CVUZGRVJfRlJFRSwgJihwY2NzKyspLT5idWZmZXJfc3RhdHVzKTsKKyAgICB9Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCByYXlfdXBkYXRlX211bHRpX2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGFsbCkKK3sKKyAgICBzdHJ1Y3QgZGV2X21jX2xpc3QgKmRtaSwgKipkbWlwOworICAgIGludCBjY3NpbmRleDsKKyAgICBzdHJ1Y3QgY2NzIF9faW9tZW0gKnBjY3M7CisgICAgaW50IGkgPSAwOworICAgIHJheV9kZXZfdCAqbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworICAgIHZvaWQgX19pb21lbSAqcCA9IGxvY2FsLT5zcmFtICsgSE9TVF9UT19FQ0ZfQkFTRTsKKworICAgIGlmICghKGxpbmstPnN0YXRlICYgREVWX1BSRVNFTlQpKSB7CisgICAgICAgIERFQlVHKDIsInJheV91cGRhdGVfbXVsdGlfbGlzdCAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZSAKKyAgICAgICAgREVCVUcoMiwicmF5X3VwZGF0ZV9tdWx0aV9saXN0KCVwKVxuIixkZXYpOworICAgIGlmICgoY2NzaW5kZXggPSBnZXRfZnJlZV9jY3MobG9jYWwpKSA8IDApCisgICAgeworICAgICAgICBERUJVRygxLCJyYXlfdXBkYXRlX211bHRpIC0gTm8gZnJlZSBjY3NcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHBjY3MgPSBjY3NfYmFzZShsb2NhbCkgKyBjY3NpbmRleDsKKyAgICB3cml0ZWIoQ0NTX1VQREFURV9NVUxUSUNBU1RfTElTVCwgJnBjY3MtPmNtZCk7CisKKyAgICBpZiAoYWxsKSB7CisgICAgICAgIHdyaXRlYigweGZmLCAmcGNjcy0+dmFyKTsKKyAgICAgICAgbG9jYWwtPm51bV9tdWx0aSA9IDB4ZmY7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBDb3B5IHRoZSBrZXJuZWwncyBsaXN0IG9mIE1DIGFkZHJlc3NlcyB0byBjYXJkICovCisgICAgICAgIGZvciAoZG1pcD0mZGV2LT5tY19saXN0OyAoZG1pPSpkbWlwKSE9TlVMTDsgZG1pcD0mZG1pLT5uZXh0KSB7CisgICAgICAgICAgICBtZW1jcHlfdG9pbyhwLCBkbWktPmRtaV9hZGRyLCBFVEhfQUxFTik7CisgICAgICAgICAgICBERUJVRygxLCJyYXlfdXBkYXRlX211bHRpIGFkZCBhZGRyICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIixkbWktPmRtaV9hZGRyWzBdLGRtaS0+ZG1pX2FkZHJbMV0sZG1pLT5kbWlfYWRkclsyXSxkbWktPmRtaV9hZGRyWzNdLGRtaS0+ZG1pX2FkZHJbNF0sZG1pLT5kbWlfYWRkcls1XSk7CisgICAgICAgICAgICBwICs9IEVUSF9BTEVOOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIGlmIChpID4gMjU2L0FERFJMRU4pIGkgPSAyNTYvQUREUkxFTjsKKyAgICAgICAgd3JpdGViKChVQ0hBUilpLCAmcGNjcy0+dmFyKTsKKyAgICAgICAgREVCVUcoMSwicmF5X2NzIHVwZGF0ZV9tdWx0aSAlZCBhZGRyZXNzZXMgaW4gbGlzdFxuIiwgaSk7CisgICAgICAgIC8qIEludGVycnVwdCB0aGUgZmlybXdhcmUgdG8gcHJvY2VzcyB0aGUgY29tbWFuZCAqLworICAgICAgICBsb2NhbC0+bnVtX211bHRpID0gaTsKKyAgICB9CisgICAgaWYgKGludGVycnVwdF9lY2YobG9jYWwsIGNjc2luZGV4KSkgeworICAgICAgICBERUJVRygxLCJyYXlfY3MgdXBkYXRlX211bHRpIGZhaWxlZCAtIEVDRiBub3QgcmVhZHkgZm9yIGludHJcbiIpOworICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmKHBjY3MrKyktPmJ1ZmZlcl9zdGF0dXMpOworICAgIH0KK30gLyogZW5kIHJheV91cGRhdGVfbXVsdGlfbGlzdCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgcmF5X2Rldl90ICpsb2NhbCA9IChyYXlfZGV2X3QgKilkZXYtPnByaXY7CisgICAgVUNIQVIgcHJvbWlzYzsKKworICAgIERFQlVHKDIsInJheV9jcyBzZXRfbXVsdGljYXN0X2xpc3QoJXApXG4iLGRldik7CisKKyAgICBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorICAgIHsKKyAgICAgICAgaWYgKGxvY2FsLT5zcGFybS5iNS5hX3Byb21pc2N1b3VzX21vZGUgPT0gMCkgeworICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIHNldF9tdWx0aWNhc3RfbGlzdCBwcm9taXNjIG9uXG4iKTsKKyAgICAgICAgICAgIGxvY2FsLT5zcGFybS5iNS5hX3Byb21pc2N1b3VzX21vZGUgPSAxOworICAgICAgICAgICAgcHJvbWlzYyA9IDE7CisgICAgICAgICAgICByYXlfdXBkYXRlX3Bhcm0oZGV2LCAgT0JKSURfcHJvbWlzY3VvdXNfbW9kZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9taXNjLCBzaXplb2YocHJvbWlzYykpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAobG9jYWwtPnNwYXJtLmI1LmFfcHJvbWlzY3VvdXNfbW9kZSA9PSAxKSB7CisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3Mgc2V0X211bHRpY2FzdF9saXN0IHByb21pc2Mgb2ZmXG4iKTsKKyAgICAgICAgICAgIGxvY2FsLT5zcGFybS5iNS5hX3Byb21pc2N1b3VzX21vZGUgPSAwOworICAgICAgICAgICAgcHJvbWlzYyA9IDA7CisgICAgICAgICAgICByYXlfdXBkYXRlX3Bhcm0oZGV2LCAgT0JKSURfcHJvbWlzY3VvdXNfbW9kZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9taXNjLCBzaXplb2YocHJvbWlzYykpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHJheV91cGRhdGVfbXVsdGlfbGlzdChkZXYsIDEpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChsb2NhbC0+bnVtX211bHRpICE9IGRldi0+bWNfY291bnQpIHJheV91cGRhdGVfbXVsdGlfbGlzdChkZXYsIDApOworICAgIH0KK30gLyogZW5kIHNldF9tdWx0aWNhc3RfbGlzdCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQWxsIHJvdXRpbmVzIGJlbG93IGhlcmUgYXJlIHJ1biBhdCBpbnRlcnJ1cHQgdGltZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpcnFyZXR1cm5fdCByYXlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisgICAgZGV2X2xpbmtfdCAqbGluazsKKyAgICByYXlfZGV2X3QgKmxvY2FsOworICAgIHN0cnVjdCBjY3MgX19pb21lbSAqcGNjczsKKyAgICBzdHJ1Y3QgcmNzIF9faW9tZW0gKnByY3M7CisgICAgVUNIQVIgcmNzaW5kZXg7CisgICAgVUNIQVIgdG1wOworICAgIFVDSEFSIGNtZDsKKyAgICBVQ0hBUiBzdGF0dXM7CisKKyAgICBpZiAoZGV2ID09IE5VTEwpIC8qIE5vdGUgdGhhdCB3ZSB3YW50IGludGVycnVwdHMgd2l0aCBkZXYtPnN0YXJ0ID09IDAgKi8KKwlyZXR1cm4gSVJRX05PTkU7CisKKyAgICBERUJVRyg0LCJyYXlfY3M6IGludGVycnVwdCBmb3IgKmRldj0lcFxuIixkZXYpOworCisgICAgbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworICAgIGxpbmsgPSAoZGV2X2xpbmtfdCAqKWxvY2FsLT5maW5kZXI7CisgICAgaWYgKCAhIChsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSB8fCBsaW5rLT5zdGF0ZSAmIERFVl9TVVNQRU5EICkgeworICAgICAgICBERUJVRygyLCJyYXlfY3MgaW50ZXJydXB0IGZyb20gZGV2aWNlIG5vdCBwcmVzZW50IG9yIHN1c3BlbmRlZC5cbiIpOworICAgICAgICByZXR1cm4gSVJRX05PTkU7CisgICAgfQorICAgIHJjc2luZGV4ID0gcmVhZGIoJigoc3RydWN0IHNjYiBfX2lvbWVtICopKGxvY2FsLT5zcmFtKSktPnJjc19pbmRleCk7CisKKyAgICBpZiAocmNzaW5kZXggPj0gKE5VTUJFUl9PRl9DQ1MgKyBOVU1CRVJfT0ZfUkNTKSkKKyAgICB7CisgICAgICAgIERFQlVHKDEsInJheV9jcyBpbnRlcnJ1cHQgYmFkIHJjc2luZGV4ID0gMHgleFxuIixyY3NpbmRleCk7CisgICAgICAgIGNsZWFyX2ludGVycnVwdChsb2NhbCk7CisgICAgICAgIHJldHVybiBJUlFfSEFORExFRDsKKyAgICB9CisgICAgaWYgKHJjc2luZGV4IDwgTlVNQkVSX09GX0NDUykgLyogSWYgaXQncyBhIHJldHVybmVkIENDUyAqLworICAgIHsKKyAgICAgICAgcGNjcyA9IGNjc19iYXNlKGxvY2FsKSArIHJjc2luZGV4OworICAgICAgICBjbWQgPSByZWFkYigmcGNjcy0+Y21kKTsKKyAgICAgICAgc3RhdHVzID0gcmVhZGIoJnBjY3MtPmJ1ZmZlcl9zdGF0dXMpOworICAgICAgICBzd2l0Y2ggKGNtZCkKKyAgICAgICAgeworICAgICAgICBjYXNlIENDU19ET1dOTE9BRF9TVEFSVFVQX1BBUkFNUzogLyogSGFwcGVucyBpbiBmaXJtd2FyZSBzb21lZGF5ICovCisgICAgICAgICAgICBkZWxfdGltZXIoJmxvY2FsLT50aW1lcik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IENDU19DT01NQU5EX0NPTVBMRVRFKSB7CisgICAgICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCBkb3dubG9hZF9zdGFydHVwX3BhcmFtZXRlcnMgT0tcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCBkb3dubG9hZF9zdGFydHVwX3BhcmFtZXRlcnMgZmFpbFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQ1NfVVBEQVRFX1BBUkFNUzoKKyAgICAgICAgICAgIERFQlVHKDEsInJheV9jcyBpbnRlcnJ1cHQgdXBkYXRlIHBhcmFtcyBkb25lXG4iKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQ0NTX0NPTU1BTkRfQ09NUExFVEUpIHsKKyAgICAgICAgICAgICAgICB0bXAgPSByZWFkYigmcGNjcy0+dmFyLnVwZGF0ZV9wYXJhbS5mYWlsdXJlX2NhdXNlKTsKKyAgICAgICAgICAgIERFQlVHKDAsInJheV9jcyBpbnRlcnJ1cHQgdXBkYXRlIHBhcmFtcyBmYWlsZWQgLSByZWFzb24gJWRcbiIsdG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENDU19SRVBPUlRfUEFSQU1TOgorICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCByZXBvcnQgcGFyYW1zIGRvbmVcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0NTX1VQREFURV9NVUxUSUNBU1RfTElTVDogLyogTm90ZSB0aGF0IHRoaXMgQ0NTIGlzbid0IHJldHVybmVkICovCisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgaW50ZXJydXB0IENDUyBVcGRhdGUgTXVsdGljYXN0IExpc3QgZG9uZVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQ1NfVVBEQVRFX1BPV0VSX1NBVklOR1NfTU9ERToKKyAgICAgICAgICAgIERFQlVHKDEsInJheV9jcyBpbnRlcnJ1cHQgdXBkYXRlIHBvd2VyIHNhdmUgbW9kZSBkb25lXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENDU19TVEFSVF9ORVRXT1JLOgorICAgICAgICBjYXNlIENDU19KT0lOX05FVFdPUks6CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IENDU19DT01NQU5EX0NPTVBMRVRFKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlYWRiKCZwY2NzLT52YXIuc3RhcnRfbmV0d29yay5uZXRfaW5pdGlhdGVkKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIERFQlVHKDAsInJheV9jcyBpbnRlcnJ1cHQgbmV0d29yayBcIiVzXCIgc3RhcnRlZFxuIixcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLT5zcGFybS5iNC5hX2N1cnJlbnRfZXNzX2lkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIERFQlVHKDAsInJheV9jcyBpbnRlcnJ1cHQgbmV0d29yayBcIiVzXCIgam9pbmVkXG4iLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwtPnNwYXJtLmI0LmFfY3VycmVudF9lc3NfaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1jcHlfZnJvbWlvKCZsb2NhbC0+YnNzX2lkLHBjY3MtPnZhci5zdGFydF9uZXR3b3JrLmJzc2lkLEFERFJMRU4pOworCisgICAgICAgICAgICAgICAgaWYgKGxvY2FsLT5md192ZXIgPT0gMHg1NSkgbG9jYWwtPm5ldF9kZWZhdWx0X3R4X3JhdGUgPSAzOworICAgICAgICAgICAgICAgIGVsc2UgbG9jYWwtPm5ldF9kZWZhdWx0X3R4X3JhdGUgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWFkYigmcGNjcy0+dmFyLnN0YXJ0X25ldHdvcmsubmV0X2RlZmF1bHRfdHhfcmF0ZSk7CisgICAgICAgICAgICAgICAgbG9jYWwtPmVuY3J5cHRpb24gPSByZWFkYigmcGNjcy0+dmFyLnN0YXJ0X25ldHdvcmsuZW5jcnlwdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKCFzbmlmZmVyICYmIChsb2NhbC0+bmV0X3R5cGUgPT0gSU5GUkEpCisgICAgICAgICAgICAgICAgICAgICYmICEobG9jYWwtPnNwYXJtLmI0LmFfYWN0aW5nX2FzX2FwX3N0YXR1cykpIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRlKGxvY2FsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9jYWwtPmNhcmRfc3RhdHVzID0gQ0FSRF9BQ1FfQ09NUExFVEU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0FDUV9GQUlMRUQ7CisKKyAgICAgICAgICAgICAgICBkZWxfdGltZXIoJmxvY2FsLT50aW1lcik7CisgICAgICAgICAgICAgICAgbG9jYWwtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFoqNTsKKyAgICAgICAgICAgICAgICBsb2NhbC0+dGltZXIuZGF0YSA9IChsb25nKWxvY2FsOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQ0NTX1NUQVJUX05FVFdPUkspIHsKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoMCwicmF5X2NzIGludGVycnVwdCBuZXR3b3JrIFwiJXNcIiBzdGFydCBmYWlsZWRcbiIsXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC0+c3Bhcm0uYjQuYV9jdXJyZW50X2Vzc19pZCk7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsLT50aW1lci5mdW5jdGlvbiA9ICZzdGFydF9uZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBERUJVRygwLCJyYXlfY3MgaW50ZXJydXB0IG5ldHdvcmsgXCIlc1wiIGpvaW4gZmFpbGVkXG4iLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWwtPnNwYXJtLmI0LmFfY3VycmVudF9lc3NfaWQpOworICAgICAgICAgICAgICAgICAgICBsb2NhbC0+dGltZXIuZnVuY3Rpb24gPSAmam9pbl9uZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZF90aW1lcigmbG9jYWwtPnRpbWVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENDU19TVEFSVF9BU1NPQ0lBVElPTjoKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQ0NTX0NPTU1BTkRfQ09NUExFVEUpIHsKKyAgICAgICAgICAgICAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0FTU09DX0NPTVBMRVRFOworICAgICAgICAgICAgICAgIERFQlVHKDAsInJheV9jcyBhc3NvY2lhdGlvbiBzdWNjZXNzZnVsXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBERUJVRygwLCJyYXlfY3MgYXNzb2NpYXRpb24gZmFpbGVkLFxuIik7CisgICAgICAgICAgICAgICAgbG9jYWwtPmNhcmRfc3RhdHVzID0gQ0FSRF9BU1NPQ19GQUlMRUQ7CisgICAgICAgICAgICAgICAgam9pbl9uZXQoKHVfbG9uZylsb2NhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQ1NfVFhfUkVRVUVTVDoKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQ0NTX0NPTU1BTkRfQ09NUExFVEUpIHsKKyAgICAgICAgICAgICAgICBERUJVRygzLCJyYXlfY3MgaW50ZXJydXB0IHR4IHJlcXVlc3QgY29tcGxldGVcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCB0eCByZXF1ZXN0IGZhaWxlZFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNuaWZmZXIpIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQ1NfVEVTVF9NRU1PUlk6CisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgaW50ZXJydXB0IG1lbSB0ZXN0IGRvbmVcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0NTX1NIVVRET1dOOgorICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCBVbmV4cGVjdGVkIENDUyByZXR1cm5lZCAtIFNodXRkb3duXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENDU19EVU1QX01FTU9SWToKKyAgICAgICAgICAgIERFQlVHKDEsInJheV9jcyBpbnRlcnJ1cHQgZHVtcCBtZW1vcnkgZG9uZVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQ1NfU1RBUlRfVElNRVI6CisgICAgICAgICAgICBERUJVRygyLCJyYXlfY3MgaW50ZXJydXB0IERJTkcgLSByYXlsaW5rIHRpbWVyIGV4cGlyZWRcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgaW50ZXJydXB0IFVuZXhwZWN0ZWQgQ0NTIDB4JXggcmV0dXJuZWQgMHgleFxuIixcCisgICAgICAgICAgICAgICAgICByY3NpbmRleCwgY21kKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmcGNjcy0+YnVmZmVyX3N0YXR1cyk7CisgICAgfQorICAgIGVsc2UgLyogSXQncyBhbiBSQ1MgKi8KKyAgICB7CisgICAgICAgIHByY3MgPSByY3NfYmFzZShsb2NhbCkgKyByY3NpbmRleDsKKyAgICAKKyAgICAgICAgc3dpdGNoIChyZWFkYigmcHJjcy0+aW50ZXJydXB0X2lkKSkKKyAgICAgICAgeworICAgICAgICBjYXNlIFBST0NFU1NfUlhfUEFDS0VUOgorICAgICAgICAgICAgcmF5X3J4KGRldiwgbG9jYWwsIHByY3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVKT0lOX05FVF9DT01QTEVURToKKyAgICAgICAgICAgIERFQlVHKDEsInJheV9jcyBpbnRlcnJ1cHQgcmVqb2luIG5ldCBjb21wbGV0ZVxuIik7CisgICAgICAgICAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0FDUV9DT01QTEVURTsKKyAgICAgICAgICAgIC8qIGRvIHdlIG5lZWQgdG8gY2xlYXIgdHggYnVmZmVycyBDQ1Mncz8gKi8KKyAgICAgICAgICAgIGlmIChsb2NhbC0+c3Bhcm0uYjQuYV9uZXR3b3JrX3R5cGUgPT0gQURIT0MpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNuaWZmZXIpIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZW1jcHlfZnJvbWlvKCZsb2NhbC0+YnNzX2lkLCBwcmNzLT52YXIucmVqb2luX25ldF9jb21wbGV0ZS5ic3NpZCwgQUREUkxFTik7CisgICAgICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIG5ldyBCU1NJRCA9ICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIixcCisgICAgICAgICAgICAgICAgICAgICAgbG9jYWwtPmJzc19pZFswXSwgbG9jYWwtPmJzc19pZFsxXSwgbG9jYWwtPmJzc19pZFsyXSxcCisgICAgICAgICAgICAgICAgICAgICAgbG9jYWwtPmJzc19pZFszXSwgbG9jYWwtPmJzc19pZFs0XSwgbG9jYWwtPmJzc19pZFs1XSk7CisgICAgICAgICAgICAgICAgaWYgKCFzbmlmZmVyKSBhdXRoZW50aWNhdGUobG9jYWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUk9BTUlOR19JTklUSUFURUQ6CisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgaW50ZXJydXB0IHJvYW1pbmcgaW5pdGlhdGVkXG4iKTsgCisgICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKGRldik7CisgICAgICAgICAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0RPSU5HX0FDUTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEpBUEFOX0NBTExfU0lHTl9SWEQ6CisgICAgICAgICAgICBERUJVRygxLCJyYXlfY3MgaW50ZXJydXB0IGphcGFuIGNhbGwgc2lnbiByeFxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIERFQlVHKDEsInJheV9jcyBVbmV4cGVjdGVkIGludGVycnVwdCBmb3IgUkNTIDB4JXggY21kID0gMHgleFxuIixcCisgICAgICAgICAgICAgICAgICByY3NpbmRleCwgKHVuc2lnbmVkIGludCkgcmVhZGIoJnByY3MtPmludGVycnVwdF9pZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGViKENDU19CVUZGRVJfRlJFRSwgJnByY3MtPmJ1ZmZlcl9zdGF0dXMpOworICAgIH0KKyAgICBjbGVhcl9pbnRlcnJ1cHQobG9jYWwpOworICAgIHJldHVybiBJUlFfSEFORExFRDsKK30gLyogcmF5X2ludGVycnVwdCAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgcmF5X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHJheV9kZXZfdCAqbG9jYWwsIHN0cnVjdCByY3MgX19pb21lbSAqcHJjcykKK3sKKyAgICBpbnQgcnhfbGVuOworICAgIHVuc2lnbmVkIGludCBwa3RfYWRkcjsKKyAgICB2b2lkIF9faW9tZW0gKnBtc2c7CisgICAgREVCVUcoNCwicmF5X3J4IHByb2Nlc3MgcnggcGFja2V0XG4iKTsKKworICAgIC8qIENhbGN1bGF0ZSBhZGRyZXNzIG9mIHBhY2tldCB3aXRoaW4gUnggYnVmZmVyICovCisgICAgcGt0X2FkZHIgPSAoKHJlYWRiKCZwcmNzLT52YXIucnhfcGFja2V0LnJ4X2RhdGFfcHRyWzBdKSA8PCA4KQorICAgICAgICAgICAgICAgICsgcmVhZGIoJnByY3MtPnZhci5yeF9wYWNrZXQucnhfZGF0YV9wdHJbMV0pKSAmIFJYX0JVRkZfRU5EOworICAgIC8qIExlbmd0aCBvZiBmaXJzdCBwYWNrZXQgZnJhZ21lbnQgKi8KKyAgICByeF9sZW4gPSAocmVhZGIoJnByY3MtPnZhci5yeF9wYWNrZXQucnhfZGF0YV9sZW5ndGhbMF0pIDw8IDgpCisgICAgICAgICsgcmVhZGIoJnByY3MtPnZhci5yeF9wYWNrZXQucnhfZGF0YV9sZW5ndGhbMV0pOworCisgICAgbG9jYWwtPmxhc3RfcnNsID0gcmVhZGIoJnByY3MtPnZhci5yeF9wYWNrZXQucnhfc2lnX2xldik7CisgICAgcG1zZyA9IGxvY2FsLT5ybWVtICsgcGt0X2FkZHI7CisgICAgc3dpdGNoKHJlYWRiKHBtc2cpKQorICAgIHsKKyAgICBjYXNlIERBVEFfVFlQRToKKyAgICAgICAgREVCVUcoNCwicmF5X3J4IGRhdGEgdHlwZVxuIik7CisgICAgICAgIHJ4X2RhdGEoZGV2LCBwcmNzLCBwa3RfYWRkciwgcnhfbGVuKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVVRIRU5USUNfVFlQRToKKyAgICAgICAgREVCVUcoNCwicmF5X3J4IGF1dGhlbnRpYyB0eXBlXG4iKTsKKyAgICAgICAgaWYgKHNuaWZmZXIpIHJ4X2RhdGEoZGV2LCBwcmNzLCBwa3RfYWRkciwgcnhfbGVuKTsKKyAgICAgICAgZWxzZSByeF9hdXRoZW50aWNhdGUobG9jYWwsIHByY3MsIHBrdF9hZGRyLCByeF9sZW4pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERFQVVUSEVOVElDX1RZUEU6CisgICAgICAgIERFQlVHKDQsInJheV9yeCBkZWF1dGggdHlwZVxuIik7CisgICAgICAgIGlmIChzbmlmZmVyKSByeF9kYXRhKGRldiwgcHJjcywgcGt0X2FkZHIsIHJ4X2xlbik7CisgICAgICAgIGVsc2UgcnhfZGVhdXRoZW50aWNhdGUobG9jYWwsIHByY3MsIHBrdF9hZGRyLCByeF9sZW4pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5VTExfTVNHX1RZUEU6CisgICAgICAgIERFQlVHKDMsInJheV9jcyByeCBOVUxMIG1zZ1xuIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkVBQ09OX1RZUEU6CisgICAgICAgIERFQlVHKDQsInJheV9yeCBiZWFjb24gdHlwZVxuIik7CisgICAgICAgIGlmIChzbmlmZmVyKSByeF9kYXRhKGRldiwgcHJjcywgcGt0X2FkZHIsIHJ4X2xlbik7CisKKyAgICAgICAgY29weV9mcm9tX3J4X2J1ZmYobG9jYWwsIChVQ0hBUiAqKSZsb2NhbC0+bGFzdF9iY24sIHBrdF9hZGRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnhfbGVuIDwgc2l6ZW9mKHN0cnVjdCBiZWFjb25fcngpID8gCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJ4X2xlbiA6IHNpemVvZihzdHJ1Y3QgYmVhY29uX3J4KSk7CisKKwlsb2NhbC0+YmVhY29uX3J4ZWQgPSAxOworICAgICAgICAvKiBHZXQgdGhlIHN0YXRpc3RpY3Mgc28gdGhlIGNhcmQgY291bnRlcnMgbmV2ZXIgb3ZlcmZsb3cgKi8KKyAgICAgICAgcmF5X2dldF9zdGF0cyhkZXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgREVCVUcoMCwicmF5X2NzIHVua25vd24gcGt0IHR5cGUgJTJ4XG4iLCAodW5zaWduZWQgaW50KSByZWFkYihwbXNnKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworfSAvKiBlbmQgcmF5X3J4ICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCByeF9kYXRhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCByY3MgX19pb21lbSAqcHJjcywgdW5zaWduZWQgaW50IHBrdF9hZGRyLCAKKyAgICAgICAgICAgICBpbnQgcnhfbGVuKQoreworICAgIHN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworICAgIHN0cnVjdCByY3MgX19pb21lbSAqcHJjc2xpbmsgPSBwcmNzOworICAgIHJheV9kZXZfdCAqbG9jYWwgPSBkZXYtPnByaXY7CisgICAgVUNIQVIgKnJ4X3B0cjsKKyAgICBpbnQgdG90YWxfbGVuOworICAgIGludCB0bXA7CisjaWZkZWYgV0lSRUxFU1NfU1BZCisgICAgaW50IHNpZ2xldiA9IGxvY2FsLT5sYXN0X3JzbDsKKyAgICB1X2NoYXIgbGlua3NyY2FkZHJbRVRIX0FMRU5dOwkvKiBPdGhlciBlbmQgb2YgdGhlIHdpcmVsZXNzIGxpbmsgKi8KKyNlbmRpZgorCisgICAgaWYgKCFzbmlmZmVyKSB7CisgICAgICAgIGlmICh0cmFuc2xhdGUpIHsKKy8qIFRCRCBsZW5ndGggbmVlZHMgZml4aW5nIGZvciB0cmFuc2xhdGVkIGhlYWRlciAqLworICAgICAgICAgICAgaWYgKHJ4X2xlbiA8IChFVEhfSExFTiArIFJYX01BQ19IRUFERVJfTEVOR1RIKSB8fAorICAgICAgICAgICAgICAgIHJ4X2xlbiA+IChkZXYtPm10dSArIFJYX01BQ19IRUFERVJfTEVOR1RIICsgRVRIX0hMRU4gKyBGQ1NfTEVOKSkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREVCVUcoMCwicmF5X2NzIGludmFsaWQgcGFja2V0IGxlbmd0aCAlZCByZWNlaXZlZCBcbiIscnhfbGVuKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBlbmNhcHN1bGF0ZWQgZXRoZXJuZXQgKi8geworICAgICAgICAgICAgaWYgKHJ4X2xlbiA8IChFVEhfSExFTiArIFJYX01BQ19IRUFERVJfTEVOR1RIKSB8fAorICAgICAgICAgICAgICAgIHJ4X2xlbiA+IChkZXYtPm10dSArIFJYX01BQ19IRUFERVJfTEVOR1RIICsgRVRIX0hMRU4gKyBGQ1NfTEVOKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBERUJVRygwLCJyYXlfY3MgaW52YWxpZCBwYWNrZXQgbGVuZ3RoICVkIHJlY2VpdmVkIFxuIixyeF9sZW4pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBERUJVRyg0LCJyYXlfY3MgcnhfZGF0YSBwYWNrZXRcbiIpOworICAgIC8qIElmIGZyYWdtZW50ZWQgcGFja2V0LCB2ZXJpZnkgc2l6ZXMgb2YgZnJhZ21lbnRzIGFkZCB1cCAqLworICAgIGlmIChyZWFkYigmcHJjcy0+dmFyLnJ4X3BhY2tldC5uZXh0X2ZyYWdfcmNzX2luZGV4KSAhPSAweEZGKSB7CisgICAgICAgIERFQlVHKDEsInJheV9jcyByeCdlZCBmcmFnbWVudFxuIik7CisgICAgICAgIHRtcCA9IChyZWFkYigmcHJjcy0+dmFyLnJ4X3BhY2tldC50b3RhbHBhY2tldGxlbmd0aFswXSkgPDwgOCkKKyAgICAgICAgICAgICsgIHJlYWRiKCZwcmNzLT52YXIucnhfcGFja2V0LnRvdGFscGFja2V0bGVuZ3RoWzFdKTsKKyAgICAgICAgdG90YWxfbGVuID0gdG1wOworICAgICAgICBwcmNzbGluayA9IHByY3M7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHRtcCAtPSAocmVhZGIoJnByY3NsaW5rLT52YXIucnhfcGFja2V0LnJ4X2RhdGFfbGVuZ3RoWzBdKSA8PCA4KQorICAgICAgICAgICAgICAgICsgICByZWFkYigmcHJjc2xpbmstPnZhci5yeF9wYWNrZXQucnhfZGF0YV9sZW5ndGhbMV0pOworICAgICAgICAgICAgaWYgKHJlYWRiKCZwcmNzbGluay0+dmFyLnJ4X3BhY2tldC5uZXh0X2ZyYWdfcmNzX2luZGV4KSA9PSAweEZGCisgICAgICAgICAgICAgICAgfHwgdG1wIDwgMCkgYnJlYWs7CisgICAgICAgICAgICBwcmNzbGluayA9IHJjc19iYXNlKGxvY2FsKQorICAgICAgICAgICAgICAgICsgcmVhZGIoJnByY3NsaW5rLT5saW5rX2ZpZWxkKTsKKyAgICAgICAgfSB3aGlsZSAoMSk7CisKKyAgICAgICAgaWYgKHRtcCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIERFQlVHKDAsInJheV9jcyByeF9kYXRhIGZyYWdtZW50IGxlbmd0aHMgZG9uJ3QgYWRkIHVwXG4iKTsKKyAgICAgICAgICAgIGxvY2FsLT5zdGF0cy5yeF9kcm9wcGVkKys7IAorICAgICAgICAgICAgcmVsZWFzZV9mcmFnX2NoYWluKGxvY2FsLCBwcmNzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsgLyogU2luZ2xlIHVuZnJhZ21lbnRlZCBwYWNrZXQgKi8KKyAgICAgICAgdG90YWxfbGVuID0gcnhfbGVuOworICAgIH0KKworICAgIHNrYiA9IGRldl9hbGxvY19za2IoIHRvdGFsX2xlbis1ICk7CisgICAgaWYgKHNrYiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgREVCVUcoMCwicmF5X2NzIHJ4X2RhdGEgY291bGQgbm90IGFsbG9jYXRlIHNrYlxuIik7CisgICAgICAgIGxvY2FsLT5zdGF0cy5yeF9kcm9wcGVkKys7IAorICAgICAgICBpZiAocmVhZGIoJnByY3MtPnZhci5yeF9wYWNrZXQubmV4dF9mcmFnX3Jjc19pbmRleCkgIT0gMHhGRikKKyAgICAgICAgICAgIHJlbGVhc2VfZnJhZ19jaGFpbihsb2NhbCwgcHJjcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2tiX3Jlc2VydmUoIHNrYiwgMik7ICAgLyogQWxpZ24gSVAgb24gMTYgYnl0ZSAoVEJEIGNoZWNrIHRoaXMpKi8KKyAgICBza2ItPmRldiA9IGRldjsKKworICAgIERFQlVHKDQsInJheV9jcyByeF9kYXRhIHRvdGFsX2xlbiA9ICV4LCByeF9sZW4gPSAleFxuIix0b3RhbF9sZW4scnhfbGVuKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBSZXNlcnZlIGVub3VnaCByb29tIGZvciB0aGUgd2hvbGUgZGFtbiBwYWNrZXQuICovCisgICAgcnhfcHRyID0gc2tiX3B1dCggc2tiLCB0b3RhbF9sZW4pOworICAgIC8qIENvcHkgdGhlIHdob2xlIHBhY2tldCB0byBza19idWZmICovCisgICAgcnhfcHRyICs9IGNvcHlfZnJvbV9yeF9idWZmKGxvY2FsLCByeF9wdHIsIHBrdF9hZGRyICYgUlhfQlVGRl9FTkQsIHJ4X2xlbik7CisgICAgLyogR2V0IHNvdXJjZSBhZGRyZXNzICovCisjaWZkZWYgV0lSRUxFU1NfU1BZCisgICAgbWVtY3B5KGxpbmtzcmNhZGRyLCAoKHN0cnVjdCBtYWNfaGVhZGVyICopc2tiLT5kYXRhKS0+YWRkcl8yLCBFVEhfQUxFTik7CisjZW5kaWYKKyAgICAvKiBOb3csIGRlYWwgd2l0aCBlbmNhcHN1bGF0aW9uL3RyYW5zbGF0aW9uL3NuaWZmZXIgKi8KKyAgICBpZiAoIXNuaWZmZXIpIHsKKyAgICAgICAgaWYgKCF0cmFuc2xhdGUpIHsgCisgICAgICAgICAgICAvKiBFbmNhcHN1bGF0ZWQgZXRoZXJuZXQsIHNvIGp1c3QgbG9wIG9mZiA4MDIuMTEgTUFDIGhlYWRlciAqLworLyogVEJEIHJlc2VydmUgICAgICAgICAgICBza2JfcmVzZXJ2ZSggc2tiLCBSWF9NQUNfSEVBREVSX0xFTkdUSCk7ICovCisgICAgICAgICAgICBza2JfcHVsbCggc2tiLCBSWF9NQUNfSEVBREVSX0xFTkdUSCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBEbyB0cmFuc2xhdGlvbiAqLworICAgICAgICAgICAgdW50cmFuc2xhdGUobG9jYWwsIHNrYiwgdG90YWxfbGVuKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIAorICAgIHsgIC8qIHNuaWZmZXIgbW9kZSwgc28ganVzdCBwYXNzIHdob2xlIHBhY2tldCAqLyAgfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBOb3cgcGljayB1cCB0aGUgcmVzdCBvZiB0aGUgZnJhZ21lbnRzIGlmIGFueSAqLworICAgIHRtcCA9IDE3OyAKKyAgICBpZiAocmVhZGIoJnByY3MtPnZhci5yeF9wYWNrZXQubmV4dF9mcmFnX3Jjc19pbmRleCkgIT0gMHhGRikgeworICAgICAgICBwcmNzbGluayA9IHByY3M7CisgICAgICAgIERFQlVHKDEsInJheV9jcyByeF9kYXRhIGluIGZyYWdtZW50IGxvb3BcbiIpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBwcmNzbGluayA9IHJjc19iYXNlKGxvY2FsKQorICAgICAgICAgICAgICAgICsgcmVhZGIoJnByY3NsaW5rLT52YXIucnhfcGFja2V0Lm5leHRfZnJhZ19yY3NfaW5kZXgpOworICAgICAgICAgICAgcnhfbGVuID0gKCggcmVhZGIoJnByY3NsaW5rLT52YXIucnhfcGFja2V0LnJ4X2RhdGFfbGVuZ3RoWzBdKSA8PCA4KQorICAgICAgICAgICAgICAgICAgICAgICsgcmVhZGIoJnByY3NsaW5rLT52YXIucnhfcGFja2V0LnJ4X2RhdGFfbGVuZ3RoWzFdKSkKKyAgICAgICAgICAgICAgICAmIFJYX0JVRkZfRU5EOworICAgICAgICAgICAgcGt0X2FkZHIgPSAoKCByZWFkYigmcHJjc2xpbmstPnZhci5yeF9wYWNrZXQucnhfZGF0YV9wdHJbMF0pIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICArIHJlYWRiKCZwcmNzbGluay0+dmFyLnJ4X3BhY2tldC5yeF9kYXRhX3B0clsxXSkpCisgICAgICAgICAgICAgICAgJiBSWF9CVUZGX0VORDsKKworICAgICAgICAgICAgcnhfcHRyICs9IGNvcHlfZnJvbV9yeF9idWZmKGxvY2FsLCByeF9wdHIsIHBrdF9hZGRyLCByeF9sZW4pOworCisgICAgICAgIH0gd2hpbGUgKHRtcC0tICYmIAorICAgICAgICAgICAgICAgICByZWFkYigmcHJjc2xpbmstPnZhci5yeF9wYWNrZXQubmV4dF9mcmFnX3Jjc19pbmRleCkgIT0gMHhGRik7CisgICAgICAgIHJlbGVhc2VfZnJhZ19jaGFpbihsb2NhbCwgcHJjcyk7CisgICAgfQorCisgICAgc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworICAgIG5ldGlmX3J4KHNrYik7CisgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKyAgICBsb2NhbC0+c3RhdHMucnhfcGFja2V0cysrOworICAgIGxvY2FsLT5zdGF0cy5yeF9ieXRlcyArPSB0b3RhbF9sZW47CisKKyAgICAvKiBHYXRoZXIgc2lnbmFsIHN0cmVuZ3RoIHBlciBhZGRyZXNzICovCisjaWZkZWYgV0lSRUxFU1NfU1BZCisgICAgLyogRm9yIHRoZSBBY2Nlc3MgUG9pbnQgb3IgdGhlIG5vZGUgaGF2aW5nIHN0YXJ0ZWQgdGhlIGFkLWhvYyBuZXQKKyAgICAgKiBub3RlIDogYWQtaG9jIHdvcmsgb25seSBpbiBzb21lIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zLCBidXQgd2UKKyAgICAgKiBrbHVkZ2UgaW4gcmF5X2dldF93aXJlbGVzc19zdGF0cy4uLiAqLworICAgIGlmKCFtZW1jbXAobGlua3NyY2FkZHIsIGxvY2FsLT5ic3NfaWQsIEVUSF9BTEVOKSkKKyAgICAgIHsKKwkvKiBVcGRhdGUgc3RhdGlzdGljcyAqLworCS8qbG9jYWwtPndzdGF0cy5xdWFsLnF1YWwgPSBub25lID8gKi8KKwlsb2NhbC0+d3N0YXRzLnF1YWwubGV2ZWwgPSBzaWdsZXY7CisJLypsb2NhbC0+d3N0YXRzLnF1YWwubm9pc2UgPSBub25lID8gKi8KKwlsb2NhbC0+d3N0YXRzLnF1YWwudXBkYXRlZCA9IDB4MjsKKyAgICAgIH0KKyAgICAvKiBOb3csIGZvciB0aGUgYWRkcmVzc2VzIGluIHRoZSBzcHkgbGlzdCAqLworICAgIHsKKyAgICAgIGludAlpOworICAgICAgLyogTG9vayBhbGwgYWRkcmVzc2VzICovCisgICAgICBmb3IoaSA9IDA7IGkgPCBsb2NhbC0+c3B5X251bWJlcjsgaSsrKQorCS8qIElmIG1hdGNoICovCisJaWYoIW1lbWNtcChsaW5rc3JjYWRkciwgbG9jYWwtPnNweV9hZGRyZXNzW2ldLCBFVEhfQUxFTikpCisJICB7CisJICAgIC8qIFVwZGF0ZSBzdGF0aXN0aWNzICovCisJICAgIC8qbG9jYWwtPnNweV9zdGF0W2ldLnF1YWwgPSBub25lID8gKi8KKwkgICAgbG9jYWwtPnNweV9zdGF0W2ldLmxldmVsID0gc2lnbGV2OworCSAgICAvKmxvY2FsLT5zcHlfc3RhdFtpXS5ub2lzZSA9IG5vbmUgPyAqLworCSAgICBsb2NhbC0+c3B5X3N0YXRbaV0udXBkYXRlZCA9IDB4MjsKKwkgIH0KKyAgICB9CisjZW5kaWYJLyogV0lSRUxFU1NfU1BZICovCit9IC8qIGVuZCByeF9kYXRhICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCB1bnRyYW5zbGF0ZShyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuKQoreworICAgIHNuYXBoZHJfdCAqcHNuYXAgPSAoc25hcGhkcl90ICopKHNrYi0+ZGF0YSArIFJYX01BQ19IRUFERVJfTEVOR1RIKTsKKyAgICBzdHJ1Y3QgbWFjX2hlYWRlciAqcG1hYyA9IChzdHJ1Y3QgbWFjX2hlYWRlciAqKXNrYi0+ZGF0YTsKKyAgICB1bnNpZ25lZCBzaG9ydCB0eXBlID0gKih1bnNpZ25lZCBzaG9ydCAqKXBzbmFwLT5ldGhlcnR5cGU7CisgICAgdW5zaWduZWQgaW50IHhzYXAgPSAqKHVuc2lnbmVkIGludCAqKXBzbmFwICYgMHgwMGZmZmZmZjsKKyAgICB1bnNpZ25lZCBpbnQgb3JnID0gKCoodW5zaWduZWQgaW50ICopcHNuYXAtPm9yZykgJiAweDAwZmZmZmZmOworICAgIGludCBkZWx0YTsKKyAgICBzdHJ1Y3QgZXRoaGRyICpwZXRoOworICAgIFVDSEFSIHNyY2FkZHJbQUREUkxFTl07CisgICAgVUNIQVIgZGVzdGFkZHJbQUREUkxFTl07CisKKyAgICBpZiAocG1hYy0+ZnJhbWVfY3RsXzIgJiBGQzJfRlJPTV9EUykgeworCWlmIChwbWFjLT5mcmFtZV9jdGxfMiAmIEZDMl9UT19EUykgeyAvKiBBUCB0byBBUCAqLworCSAgICBtZW1jcHkoZGVzdGFkZHIsIHBtYWMtPmFkZHJfMywgQUREUkxFTik7CisJICAgIG1lbWNweShzcmNhZGRyLCAoKHVuc2lnbmVkIGNoYXIgKilwbWFjLT5hZGRyXzMpICsgQUREUkxFTiwgQUREUkxFTik7CisJfSBlbHNlIHsgLyogQVAgdG8gdGVybWluYWwgKi8KKwkgICAgbWVtY3B5KGRlc3RhZGRyLCBwbWFjLT5hZGRyXzEsIEFERFJMRU4pOworCSAgICBtZW1jcHkoc3JjYWRkciwgcG1hYy0+YWRkcl8zLCBBRERSTEVOKTsgCisJfQorICAgIH0gZWxzZSB7IC8qIFRlcm1pbmFsIHRvIEFQICovCisJaWYgKHBtYWMtPmZyYW1lX2N0bF8yICYgRkMyX1RPX0RTKSB7CisJICAgIG1lbWNweShkZXN0YWRkciwgcG1hYy0+YWRkcl8zLCBBRERSTEVOKTsKKwkgICAgbWVtY3B5KHNyY2FkZHIsIHBtYWMtPmFkZHJfMiwgQUREUkxFTik7IAorCX0gZWxzZSB7IC8qIEFkaG9jICovCisJICAgIG1lbWNweShkZXN0YWRkciwgcG1hYy0+YWRkcl8xLCBBRERSTEVOKTsKKwkgICAgbWVtY3B5KHNyY2FkZHIsIHBtYWMtPmFkZHJfMiwgQUREUkxFTik7IAorCX0KKyAgICB9CisKKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgICBpZiAocGNfZGVidWcgPiAzKSB7CisgICAgaW50IGk7CisgICAgcHJpbnRrKEtFUk5fREVCVUcgInNrYi0+ZGF0YSBiZWZvcmUgdW50cmFuc2xhdGUiKTsKKyAgICBmb3IgKGk9MDtpPDY0O2krKykgCisgICAgICAgIHByaW50aygiJTAyeCAiLHNrYi0+ZGF0YVtpXSk7CisgICAgcHJpbnRrKCJcbiIgS0VSTl9ERUJVRyAidHlwZSA9ICUwOHgsIHhzYXAgPSAlMDh4LCBvcmcgPSAlMDh4XG4iLAorICAgICAgICAgICB0eXBlLHhzYXAsb3JnKTsKKyAgICBwcmludGsoS0VSTl9ERUJVRyAidW50cmFuc2xhdGUgc2tiLT5kYXRhID0gJXBcbiIsc2tiLT5kYXRhKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICggeHNhcCAhPSBTTkFQX0lEKSB7CisgICAgICAgIC8qIG5vdCBhIHNuYXAgdHlwZSBzbyBsZWF2ZSBpdCBhbG9uZSAqLworICAgICAgICBERUJVRygzLCJyYXlfY3MgdW50cmFuc2xhdGUgTk9UIFNOQVAgJXhcbiIsICoodW5zaWduZWQgaW50ICopcHNuYXAgJiAweDAwZmZmZmZmKTsKKworICAgICAgICBkZWx0YSA9IFJYX01BQ19IRUFERVJfTEVOR1RIIC0gRVRIX0hMRU47CisgICAgICAgIHBldGggPSAoc3RydWN0IGV0aGhkciAqKShza2ItPmRhdGEgKyBkZWx0YSk7CisgICAgICAgIHBldGgtPmhfcHJvdG8gPSBodG9ucyhsZW4gLSBSWF9NQUNfSEVBREVSX0xFTkdUSCk7CisgICAgfQorICAgIGVsc2UgeyAvKiBJdHMgYSBTTkFQICovCisgICAgICAgIGlmIChvcmcgPT0gQlJJREdFX0VOQ0FQKSB7IC8qIEV0aGVySUkgYW5kIG51a2UgdGhlIExMQyAgKi8KKyAgICAgICAgREVCVUcoMywicmF5X2NzIHVudHJhbnNsYXRlIEJyaWRnZSBlbmNhcFxuIik7CisgICAgICAgICAgICBkZWx0YSA9IFJYX01BQ19IRUFERVJfTEVOR1RIIAorICAgICAgICAgICAgICAgICsgc2l6ZW9mKHN0cnVjdCBzbmFwaGRyX3QpIC0gRVRIX0hMRU47CisgICAgICAgICAgICBwZXRoID0gKHN0cnVjdCBldGhoZHIgKikoc2tiLT5kYXRhICsgZGVsdGEpOworICAgICAgICAgICAgcGV0aC0+aF9wcm90byA9IHR5cGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAob3JnID09IFJGQzEwNDJfRU5DQVApIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFJBWV9JUFhfVFlQRToKKyAgICAgICAgICAgICAgICBjYXNlIEFQUExFQVJQX1RZUEU6CisgICAgICAgICAgICAgICAgICAgIERFQlVHKDMsInJheV9jcyB1bnRyYW5zbGF0ZSBSRkMgSVBYL0FBUlBcbiIpOworICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IFJYX01BQ19IRUFERVJfTEVOR1RIIC0gRVRIX0hMRU47CisgICAgICAgICAgICAgICAgICAgIHBldGggPSAoc3RydWN0IGV0aGhkciAqKShza2ItPmRhdGEgKyBkZWx0YSk7CisgICAgICAgICAgICAgICAgICAgIHBldGgtPmhfcHJvdG8gPSBodG9ucyhsZW4gLSBSWF9NQUNfSEVBREVSX0xFTkdUSCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIERFQlVHKDMsInJheV9jcyB1bnRyYW5zbGF0ZSBSRkMgZGVmYXVsdFxuIik7CisgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gUlhfTUFDX0hFQURFUl9MRU5HVEggKyAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc25hcGhkcl90KSAtIEVUSF9ITEVOOworICAgICAgICAgICAgICAgICAgICBwZXRoID0gKHN0cnVjdCBldGhoZHIgKikoc2tiLT5kYXRhICsgZGVsdGEpOworICAgICAgICAgICAgICAgICAgICBwZXRoLT5oX3Byb3RvID0gdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJyYXlfY3MgdW50cmFuc2xhdGUgdmVyeSBjb25mdXNlZCBieSBwYWNrZXRcbiIpOworICAgICAgICAgICAgICAgIGRlbHRhID0gUlhfTUFDX0hFQURFUl9MRU5HVEggLSBFVEhfSExFTjsKKyAgICAgICAgICAgICAgICBwZXRoID0gKHN0cnVjdCBldGhoZHIgKikoc2tiLT5kYXRhICsgZGVsdGEpOworICAgICAgICAgICAgICAgIHBldGgtPmhfcHJvdG8gPSB0eXBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorLyogVEJEIHJlc2VydmUgIHNrYl9yZXNlcnZlKHNrYiwgZGVsdGEpOyAqLworICAgIHNrYl9wdWxsKHNrYiwgZGVsdGEpOworICAgIERFQlVHKDMsInVudHJhbnNsYXRlIGFmdGVyIHNrYl9wdWxsKCVkKSwgc2tiLT5kYXRhID0gJXBcbiIsZGVsdGEsc2tiLT5kYXRhKTsKKyAgICBtZW1jcHkocGV0aC0+aF9kZXN0LCBkZXN0YWRkciwgQUREUkxFTik7CisgICAgbWVtY3B5KHBldGgtPmhfc291cmNlLCBzcmNhZGRyLCBBRERSTEVOKTsKKyNpZmRlZiBQQ01DSUFfREVCVUcKKyAgICBpZiAocGNfZGVidWcgPiAzKSB7CisgICAgaW50IGk7CisgICAgcHJpbnRrKEtFUk5fREVCVUcgInNrYi0+ZGF0YSBhZnRlciB1bnRyYW5zbGF0ZToiKTsKKyAgICBmb3IgKGk9MDtpPDY0O2krKykKKyAgICAgICAgcHJpbnRrKCIlMDJ4ICIsc2tiLT5kYXRhW2ldKTsKKyAgICBwcmludGsoIlxuIik7CisgICAgfQorI2VuZGlmCit9IC8qIGVuZCB1bnRyYW5zbGF0ZSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogQ29weSBkYXRhIGZyb20gY2lyY3VsYXIgcmVjZWl2ZSBidWZmZXIgdG8gUEMgbWVtb3J5LgorICogZGVzdCAgICAgPSBkZXN0aW5hdGlvbiBhZGRyZXNzIGluIFBDIG1lbW9yeQorICogcGt0X2FkZHIgPSBzb3VyY2UgYWRkcmVzcyBpbiByZWNlaXZlIGJ1ZmZlcgorICogbGVuICAgICAgPSBsZW5ndGggb2YgcGFja2V0IHRvIGNvcHkKKyAqLworc3RhdGljIGludCBjb3B5X2Zyb21fcnhfYnVmZihyYXlfZGV2X3QgKmxvY2FsLCBVQ0hBUiAqZGVzdCwgaW50IHBrdF9hZGRyLCBpbnQgbGVuZ3RoKQoreworICAgIGludCB3cmFwX2J5dGVzID0gKHBrdF9hZGRyICsgbGVuZ3RoKSAtIChSWF9CVUZGX0VORCArIDEpOworICAgIGlmICh3cmFwX2J5dGVzIDw9IDApCisgICAgeworICAgICAgICBtZW1jcHlfZnJvbWlvKGRlc3QsbG9jYWwtPnJtZW0gKyBwa3RfYWRkcixsZW5ndGgpOworICAgIH0KKyAgICBlbHNlIC8qIFBhY2tldCB3cmFwcGVkIGluIGNpcmN1bGFyIGJ1ZmZlciAqLworICAgIHsKKyAgICAgICAgbWVtY3B5X2Zyb21pbyhkZXN0LGxvY2FsLT5ybWVtK3BrdF9hZGRyLGxlbmd0aCAtIHdyYXBfYnl0ZXMpOworICAgICAgICBtZW1jcHlfZnJvbWlvKGRlc3QgKyBsZW5ndGggLSB3cmFwX2J5dGVzLCBsb2NhbC0+cm1lbSwgd3JhcF9ieXRlcyk7CisgICAgfQorICAgIHJldHVybiBsZW5ndGg7Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCByZWxlYXNlX2ZyYWdfY2hhaW4ocmF5X2Rldl90ICpsb2NhbCwgc3RydWN0IHJjcyBfX2lvbWVtICogcHJjcykKK3sKKyAgICBzdHJ1Y3QgcmNzIF9faW9tZW0gKnByY3NsaW5rID0gcHJjczsKKyAgICBpbnQgdG1wID0gMTc7CisgICAgdW5zaWduZWQgcmNzaW5kZXggPSByZWFkYigmcHJjcy0+dmFyLnJ4X3BhY2tldC5uZXh0X2ZyYWdfcmNzX2luZGV4KTsKKworICAgIHdoaWxlICh0bXAtLSkgeworICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmcHJjc2xpbmstPmJ1ZmZlcl9zdGF0dXMpOworICAgICAgICBpZiAocmNzaW5kZXggPj0gKE5VTUJFUl9PRl9DQ1MgKyBOVU1CRVJfT0ZfUkNTKSkgeworICAgICAgICAgICAgREVCVUcoMSwicmF5X2NzIGludGVycnVwdCBiYWQgcmNzaW5kZXggPSAweCV4XG4iLHJjc2luZGV4KTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgIAorICAgICAgICB9ICAgCisgICAgICAgIHByY3NsaW5rID0gcmNzX2Jhc2UobG9jYWwpICsgcmNzaW5kZXg7CisgICAgICAgIHJjc2luZGV4ID0gcmVhZGIoJnByY3NsaW5rLT52YXIucnhfcGFja2V0Lm5leHRfZnJhZ19yY3NfaW5kZXgpOworICAgIH0KKyAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmcHJjc2xpbmstPmJ1ZmZlcl9zdGF0dXMpOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgYXV0aGVudGljYXRlKHJheV9kZXZfdCAqbG9jYWwpCit7CisgICAgZGV2X2xpbmtfdCAqbGluayA9IGxvY2FsLT5maW5kZXI7CisgICAgREVCVUcoMCwicmF5X2NzIFN0YXJ0aW5nIGF1dGhlbnRpY2F0aW9uLlxuIik7CisgICAgaWYgKCEobGluay0+c3RhdGUgJiBERVZfUFJFU0VOVCkpIHsKKyAgICAgICAgREVCVUcoMiwicmF5X2NzIGF1dGhlbnRpY2F0ZSAtIGRldmljZSBub3QgcHJlc2VudFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkZWxfdGltZXIoJmxvY2FsLT50aW1lcik7CisgICAgaWYgKGJ1aWxkX2F1dGhfZnJhbWUobG9jYWwsIGxvY2FsLT5ic3NfaWQsIE9QRU5fQVVUSF9SRVFVRVNUKSkgeworICAgICAgICBsb2NhbC0+dGltZXIuZnVuY3Rpb24gPSAmam9pbl9uZXQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBsb2NhbC0+dGltZXIuZnVuY3Rpb24gPSAmYXV0aGVudGljYXRlX3RpbWVvdXQ7CisgICAgfQorICAgIGxvY2FsLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaKjI7CisgICAgbG9jYWwtPnRpbWVyLmRhdGEgPSAobG9uZylsb2NhbDsKKyAgICBhZGRfdGltZXIoJmxvY2FsLT50aW1lcik7CisgICAgbG9jYWwtPmF1dGhlbnRpY2F0aW9uX3N0YXRlID0gQVdBSVRJTkdfUkVTUE9OU0U7Cit9IC8qIGVuZCBhdXRoZW50aWNhdGUgKi8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIHJ4X2F1dGhlbnRpY2F0ZShyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgcmNzIF9faW9tZW0gKnByY3MsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGt0X2FkZHIsIGludCByeF9sZW4pCit7CisgICAgVUNIQVIgYnVmZlsyNTZdOworICAgIHN0cnVjdCByeF9tc2cgKm1zZyA9IChzdHJ1Y3QgcnhfbXNnICopYnVmZjsKKyAgICAKKyAgICBkZWxfdGltZXIoJmxvY2FsLT50aW1lcik7CisKKyAgICBjb3B5X2Zyb21fcnhfYnVmZihsb2NhbCwgYnVmZiwgcGt0X2FkZHIsIHJ4X2xlbiAmIDB4ZmYpOworICAgIC8qIGlmIHdlIGFyZSB0cnlpbmcgdG8gZ2V0IGF1dGhlbnRpY2F0ZWQgKi8KKyAgICBpZiAobG9jYWwtPnNwYXJtLmI0LmFfbmV0d29ya190eXBlID09IEFESE9DKSB7CisgICAgICAgIERFQlVHKDEsInJheV9jcyByeF9hdXRoIHZhcj0gJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIG1zZy0+dmFyWzBdLG1zZy0+dmFyWzFdLG1zZy0+dmFyWzJdLG1zZy0+dmFyWzNdLG1zZy0+dmFyWzRdLG1zZy0+dmFyWzVdKTsKKyAgICAgICAgaWYgKG1zZy0+dmFyWzJdID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoMCwicmF5X2NzIFNlbmRpbmcgYXV0aGVudGljYXRpb24gcmVzcG9uc2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFidWlsZF9hdXRoX2ZyYW1lIChsb2NhbCwgbXNnLT5tYWMuYWRkcl8yLCBPUEVOX0FVVEhfUkVTUE9OU0UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC0+YXV0aGVudGljYXRpb25fc3RhdGUgPSBORUVEX1RPX0FVVEg7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkobG9jYWwtPmF1dGhfaWQsIG1zZy0+bWFjLmFkZHJfMiwgQUREUkxFTik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIEluZnJhc3RydWN0dXJlIG5ldHdvcmsgKi8KKyAgICB7CisgICAgICAgIGlmIChsb2NhbC0+YXV0aGVudGljYXRpb25fc3RhdGUgPT0gQVdBSVRJTkdfUkVTUE9OU0UpIHsKKyAgICAgICAgICAgIC8qIFZlcmlmeSBhdXRoZW50aWNhdGlvbiBzZXF1ZW5jZSAjMiBhbmQgc3VjY2VzcyAqLworICAgICAgICAgICAgaWYgKG1zZy0+dmFyWzJdID09IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoKG1zZy0+dmFyWzNdIHwgbXNnLT52YXJbNF0pID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgREVCVUcoMSwiQXV0aGVudGljYXRpb24gc3VjY2Vzc2Z1bFxuIik7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfQVVUSF9DT01QTEVURTsKKyAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlKGxvY2FsKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWwtPmF1dGhlbnRpY2F0aW9uX3N0YXRlID0gQVVUSEVOVElDQVRFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIERFQlVHKDAsIkF1dGhlbnRpY2F0aW9uIHJlZnVzZWRcbiIpOworICAgICAgICAgICAgICAgICAgICBsb2NhbC0+Y2FyZF9zdGF0dXMgPSBDQVJEX0FVVEhfUkVGVVNFRDsKKyAgICAgICAgICAgICAgICAgICAgam9pbl9uZXQoKHVfbG9uZylsb2NhbCk7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsLT5hdXRoZW50aWNhdGlvbl9zdGF0ZSA9IFVOQVVUSEVOVElDQVRFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30gLyogZW5kIHJ4X2F1dGhlbnRpY2F0ZSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgYXNzb2NpYXRlKHJheV9kZXZfdCAqbG9jYWwpCit7CisgICAgc3RydWN0IGNjcyBfX2lvbWVtICpwY2NzOworICAgIGRldl9saW5rX3QgKmxpbmsgPSBsb2NhbC0+ZmluZGVyOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OworICAgIGludCBjY3NpbmRleDsKKyAgICBpZiAoIShsaW5rLT5zdGF0ZSAmIERFVl9QUkVTRU5UKSkgeworICAgICAgICBERUJVRygyLCJyYXlfY3MgYXNzb2NpYXRlIC0gZGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBJZiBubyB0eCBidWZmZXJzIGF2YWlsYWJsZSwgcmV0dXJuKi8KKyAgICBpZiAoKGNjc2luZGV4ID0gZ2V0X2ZyZWVfY2NzKGxvY2FsKSkgPCAwKQorICAgIHsKKy8qIFRCRCBzaG91bGQgbmV2ZXIgYmUgaGVyZSBidXQuLi4gd2hhdCBpZiB3ZSBhcmU/ICovCisgICAgICAgIERFQlVHKDEsInJheV9jcyBhc3NvY2lhdGUgLSBObyBmcmVlIGNjc1xuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgREVCVUcoMSwicmF5X2NzIFN0YXJ0aW5nIGFzc29jaWF0aW9uIHdpdGggYWNjZXNzIHBvaW50XG4iKTsKKyAgICBwY2NzID0gY2NzX2Jhc2UobG9jYWwpICsgY2NzaW5kZXg7CisgICAgLyogZmlsbCBpbiB0aGUgQ0NTICovCisgICAgd3JpdGViKENDU19TVEFSVF9BU1NPQ0lBVElPTiwgJnBjY3MtPmNtZCk7CisgICAgLyogSW50ZXJydXB0IHRoZSBmaXJtd2FyZSB0byBwcm9jZXNzIHRoZSBjb21tYW5kICovCisgICAgaWYgKGludGVycnVwdF9lY2YobG9jYWwsIGNjc2luZGV4KSkgeworICAgICAgICBERUJVRygxLCJyYXlfY3MgYXNzb2NpYXRlIGZhaWxlZCAtIEVDRiBub3QgcmVhZHkgZm9yIGludHJcbiIpOworICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmKHBjY3MrKyktPmJ1ZmZlcl9zdGF0dXMpOworCisgICAgICAgIGRlbF90aW1lcigmbG9jYWwtPnRpbWVyKTsKKyAgICAgICAgbG9jYWwtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFoqMjsKKyAgICAgICAgbG9jYWwtPnRpbWVyLmRhdGEgPSAobG9uZylsb2NhbDsKKyAgICAgICAgbG9jYWwtPnRpbWVyLmZ1bmN0aW9uID0gJmpvaW5fbmV0OworICAgICAgICBhZGRfdGltZXIoJmxvY2FsLT50aW1lcik7CisgICAgICAgIGxvY2FsLT5jYXJkX3N0YXR1cyA9IENBUkRfQVNTT0NfRkFJTEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghc25pZmZlcikgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworfSAvKiBlbmQgYXNzb2NpYXRlICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCByeF9kZWF1dGhlbnRpY2F0ZShyYXlfZGV2X3QgKmxvY2FsLCBzdHJ1Y3QgcmNzIF9faW9tZW0gKnByY3MsIAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGt0X2FkZHIsIGludCByeF9sZW4pCit7CisvKiAgVUNIQVIgYnVmZlsyNTZdOworICAgIHN0cnVjdCByeF9tc2cgKm1zZyA9IChzdHJ1Y3QgcnhfbXNnICopYnVmZjsKKyovCisgICAgREVCVUcoMCwiRGVhdXRoZW50aWNhdGlvbiBmcmFtZSByZWNlaXZlZFxuIik7CisgICAgbG9jYWwtPmF1dGhlbnRpY2F0aW9uX3N0YXRlID0gVU5BVVRIRU5USUNBVEVEOworICAgIC8qIE5lZWQgdG8gcmVhdXRoZW50aWNhdGUgb3IgcmVqb2luIGRlcGVuZGluZyBvbiByZWFzb24gY29kZSAqLworLyogIGNvcHlfZnJvbV9yeF9idWZmKGxvY2FsLCBidWZmLCBwa3RfYWRkciwgcnhfbGVuICYgMHhmZik7CisgKi8KK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIGNsZWFyX2ludGVycnVwdChyYXlfZGV2X3QgKmxvY2FsKQoreworICAgIHdyaXRlYigwLCBsb2NhbC0+YW1lbSArIENJU19PRkZTRVQgKyBIQ1NfSU5UUl9PRkZTRVQpOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisjZGVmaW5lIE1BWERBVEEgKFBBR0VfU0laRSAtIDgwKQorCitzdGF0aWMgY2hhciAqY2FyZF9zdGF0dXNbXSA9IHsKKyAgICAiQ2FyZCBpbnNlcnRlZCAtIHVuaW5pdGlhbGl6ZWQiLCAgICAgLyogMCAqLworICAgICJDYXJkIG5vdCBkb3dubG9hZGVkIiwgICAgICAgICAgICAgICAvKiAxICovCisgICAgIldhaXRpbmcgZm9yIGRvd25sb2FkIHBhcmFtZXRlcnMiLCAgIC8qIDIgKi8KKyAgICAiQ2FyZCBkb2luZyBhY3F1aXNpdGlvbiIsICAgICAgICAgICAgLyogMyAqLworICAgICJBY3F1aXNpdGlvbiBjb21wbGV0ZSIsICAgICAgICAgICAgICAvKiA0ICovCisgICAgIkF1dGhlbnRpY2F0aW9uIGNvbXBsZXRlIiwgICAgICAgICAgIC8qIDUgKi8KKyAgICAiQXNzb2NpYXRpb24gY29tcGxldGUiLCAgICAgICAgICAgICAgLyogNiAqLworICAgICI/Pz8iLCAiPz8/IiwgIj8/PyIsICI/Pz8iLCAgICAgICAgICAvKiA3IDggOSAxMCB1bmRlZmluZWQgKi8KKyAgICAiQ2FyZCBpbml0IGVycm9yIiwgICAgICAgICAgICAgICAgICAgLyogMTEgKi8KKyAgICAiRG93bmxvYWQgcGFyYW1ldGVycyBlcnJvciIsICAgICAgICAgLyogMTIgKi8KKyAgICAiPz8/IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTMgKi8KKyAgICAiQWNxdWlzaXRpb24gZmFpbGVkIiwgICAgICAgICAgICAgICAgLyogMTQgKi8KKyAgICAiQXV0aGVudGljYXRpb24gcmVmdXNlZCIsICAgICAgICAgICAgLyogMTUgKi8KKyAgICAiQXNzb2NpYXRpb24gZmFpbGVkIiAgICAgICAgICAgICAgICAgLyogMTYgKi8KK307CisKK3N0YXRpYyBjaGFyICpuZXR0eXBlW10gPSB7IkFkaG9jIiwgIkluZnJhICJ9Oworc3RhdGljIGNoYXIgKmZyYW1pbmdbXSA9IHsiRW5jYXBzdWxhdGlvbiIsICJUcmFuc2xhdGlvbiJ9Cis7CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHJheV9jc19wcm9jX3JlYWQoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbikKK3sKKy8qIFByaW50IGN1cnJlbnQgdmFsdWVzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHZpYSBvdGhlciBtZWFucworICogZWcgaWZjb25maWcgCisgKi8KKyAgICBpbnQgaTsKKyAgICBkZXZfbGlua190ICpsaW5rOworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisgICAgcmF5X2Rldl90ICpsb2NhbDsKKyAgICBVQ0hBUiAqcDsKKyAgICBzdHJ1Y3QgZnJlcV9ob3BfZWxlbWVudCAqcGZoOworICAgIFVDSEFSIGNbMzNdOworCisgICAgbGluayA9IGRldl9saXN0OworICAgIGlmICghbGluaykKKyAgICAJcmV0dXJuIDA7CisgICAgZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopbGluay0+cHJpdjsKKyAgICBpZiAoIWRldikKKyAgICAJcmV0dXJuIDA7CisgICAgbG9jYWwgPSAocmF5X2Rldl90ICopZGV2LT5wcml2OworICAgIGlmICghbG9jYWwpCisgICAgCXJldHVybiAwOworCisgICAgbGVuID0gMDsKKworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlJheWxpbmsgV2lyZWxlc3MgTEFOIGRyaXZlciBzdGF0dXNcbiIpOworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVzXG4iLCByY3NpZCk7CisgICAgLyogYnVpbGQgNCBkb2VzIG5vdCByZXBvcnQgdmVyc2lvbiwgYW5kIGZpZWxkIGlzIDB4NTUgYWZ0ZXIgbWVtdGVzdCAqLworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkZpcm13YXJlIHZlcnNpb24gICAgID0gIik7CisgICAgaWYgKGxvY2FsLT5md192ZXIgPT0gMHg1NSkKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiNCAtIFVzZSBkdW1wX2NpcyBmb3IgbW9yZSBkZXRhaWxzXG4iKTsKKyAgICBlbHNlCisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiUyZC4lMDJkLiUwMmRcbiIsCisgICAgICAgICAgICAgICAgICAgbG9jYWwtPmZ3X3ZlciwgbG9jYWwtPmZ3X2JsZCwgbG9jYWwtPmZ3X3Zhcik7CisKKyAgICBmb3IgKGk9MDsgaTwzMjsgaSsrKSBjW2ldID0gbG9jYWwtPnNwYXJtLmI1LmFfY3VycmVudF9lc3NfaWRbaV07CisgICAgY1szMl0gPSAwOworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVzIG5ldHdvcmsgRVNTSUQgPSBcIiVzXCJcbiIsIAorICAgICAgICAgICAgICAgICAgIG5ldHR5cGVbbG9jYWwtPnNwYXJtLmI1LmFfbmV0d29ya190eXBlXSwgYyk7CisKKyAgICBwID0gbG9jYWwtPmJzc19pZDsKKyAgICBsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sIAorICAgICAgICAgICAgICAgICAgICJCU1NJRCAgICAgICAgICAgICAgICA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorICAgICAgICAgICAgICAgICAgIHBbMF0scFsxXSxwWzJdLHBbM10scFs0XSxwWzVdKTsKKworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkNvdW50cnkgY29kZSAgICAgICAgID0gJWRcbiIsIAorICAgICAgICAgICAgICAgICAgIGxvY2FsLT5zcGFybS5iNS5hX2N1cnJfY291bnRyeV9jb2RlKTsKKworICAgIGkgPSBsb2NhbC0+Y2FyZF9zdGF0dXM7CisgICAgaWYgKGkgPCAwKSBpID0gMTA7CisgICAgaWYgKGkgPiAxNikgaSA9IDEwOworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkNhcmQgc3RhdHVzICAgICAgICAgID0gJXNcbiIsIGNhcmRfc3RhdHVzW2ldKTsKKworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkZyYW1pbmcgbW9kZSAgICAgICAgID0gJXNcbiIsZnJhbWluZ1t0cmFuc2xhdGVdKTsKKworICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkxhc3QgcGt0IHNpZ25hbCBsdmwgID0gJWRcbiIsIGxvY2FsLT5sYXN0X3JzbCk7CisKKyAgICBpZiAobG9jYWwtPmJlYWNvbl9yeGVkKSB7CisJLyogUHVsbCBzb21lIGZpZWxkcyBvdXQgb2YgbGFzdCBiZWFjb24gcmVjZWl2ZWQgKi8KKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJCZWFjb24gSW50ZXJ2YWwgICAgICA9ICVkIEt1c1xuIiwgCisJCSAgICAgICBsb2NhbC0+bGFzdF9iY24uYmVhY29uX2ludHZsWzBdCisJCSAgICAgICArIDI1NiAqIGxvY2FsLT5sYXN0X2Jjbi5iZWFjb25faW50dmxbMV0pOworICAgIAorICAgIHAgPSBsb2NhbC0+bGFzdF9iY24uZWxlbWVudHM7CisgICAgaWYgKHBbMF0gPT0gQ19FU1NJRF9FTEVNRU5UX0lEKSBwICs9IHBbMV0gKyAyOworICAgIGVsc2UgeworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJQYXJzZSBiZWFjb24gZmFpbGVkIGF0IGVzc2lkIGVsZW1lbnQgaWQgPSAlZFxuIixwWzBdKTsKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisKKyAgICBpZiAocFswXSA9PSBDX1NVUFBPUlRFRF9SQVRFU19FTEVNRU5UX0lEKSB7CisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlN1cHBvcnRlZCByYXRlIGNvZGVzID0gIik7CisgICAgICAgIGZvciAoaT0yOyBpPHBbMV0gKyAyOyBpKyspIAorICAgICAgICAgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiMHglMDJ4ICIsIHBbaV0pOworICAgICAgICBsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcbiIpOworICAgICAgICBwICs9IHBbMV0gKyAyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiUGFyc2UgYmVhY29uIGZhaWxlZCBhdCByYXRlcyBlbGVtZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisKKwlpZiAocFswXSA9PSBDX0ZIX1BBUkFNX1NFVF9FTEVNRU5UX0lEKSB7CisJICAgIHBmaCA9IChzdHJ1Y3QgZnJlcV9ob3BfZWxlbWVudCAqKXA7CisJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkhvcCBkd2VsbCAgICAgICAgICAgID0gJWQgS3VzXG4iLAorCQkJICAgcGZoLT5kd2VsbF90aW1lWzBdICsgMjU2ICogcGZoLT5kd2VsbF90aW1lWzFdKTsKKwkgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiSG9wIHNldCAgICAgICAgICAgICAgPSAlZCBcbiIsIHBmaC0+aG9wX3NldCk7CisJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkhvcCBwYXR0ZXJuICAgICAgICAgID0gJWQgXG4iLCBwZmgtPmhvcF9wYXR0ZXJuKTsKKwkgICAgbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiSG9wIGluZGV4ICAgICAgICAgICAgPSAlZCBcbiIsIHBmaC0+aG9wX2luZGV4KTsKKwkgICAgcCArPSBwWzFdICsgMjsKKwl9CisJZWxzZSB7CisJICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlBhcnNlIGJlYWNvbiBmYWlsZWQgYXQgRkggcGFyYW0gZWxlbWVudFxuIik7CisJICAgIHJldHVybiBsZW47CisJfQorICAgIH0gZWxzZSB7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiTm8gYmVhY29ucyByZWNlaXZlZFxuIik7CisgICAgfQorICAgIHJldHVybiBsZW47Cit9CisKKyNlbmRpZgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCBidWlsZF9hdXRoX2ZyYW1lKHJheV9kZXZfdCAqbG9jYWwsIFVDSEFSICpkZXN0LCBpbnQgYXV0aF90eXBlKQoreworICAgIGludCBhZGRyOworICAgIHN0cnVjdCBjY3MgX19pb21lbSAqcGNjczsKKyAgICBzdHJ1Y3QgdHhfbXNnIF9faW9tZW0gKnB0eDsKKyAgICBpbnQgY2NzaW5kZXg7CisKKyAgICAvKiBJZiBubyB0eCBidWZmZXJzIGF2YWlsYWJsZSwgcmV0dXJuICovCisgICAgaWYgKChjY3NpbmRleCA9IGdldF9mcmVlX3R4X2Njcyhsb2NhbCkpIDwgMCkKKyAgICB7CisgICAgICAgIERFQlVHKDEsInJheV9jcyBzZW5kIGF1dGhlbnRpY2F0ZSAtIE5vIGZyZWUgdHggY2NzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHBjY3MgPSBjY3NfYmFzZShsb2NhbCkgKyBjY3NpbmRleDsKKworICAgIC8qIEFkZHJlc3MgaW4gY2FyZCBzcGFjZSAqLworICAgIGFkZHIgPSBUWF9CVUZfQkFTRSArIChjY3NpbmRleCA8PCAxMSk7CisgICAgLyogZmlsbCBpbiB0aGUgQ0NTICovCisgICAgd3JpdGViKENDU19UWF9SRVFVRVNULCAmcGNjcy0+Y21kKTsKKyAgICB3cml0ZWIoYWRkciA+PiA4LCBwY2NzLT52YXIudHhfcmVxdWVzdC50eF9kYXRhX3B0cik7CisgICAgd3JpdGViKDB4MjAsIHBjY3MtPnZhci50eF9yZXF1ZXN0LnR4X2RhdGFfcHRyICsgMSk7CisgICAgd3JpdGViKFRYX0FVVEhFTlRJQ0FURV9MRU5HVEhfTVNCLCBwY2NzLT52YXIudHhfcmVxdWVzdC50eF9kYXRhX2xlbmd0aCk7CisgICAgd3JpdGViKFRYX0FVVEhFTlRJQ0FURV9MRU5HVEhfTFNCLHBjY3MtPnZhci50eF9yZXF1ZXN0LnR4X2RhdGFfbGVuZ3RoICsgMSk7CisgICAgd3JpdGViKDAsICZwY2NzLT52YXIudHhfcmVxdWVzdC5wb3dfc2F2X21vZGUpOworCisgICAgcHR4ID0gbG9jYWwtPnNyYW0gKyBhZGRyOworICAgIC8qIGZpbGwgaW4gdGhlIG1hYyBoZWFkZXIgKi8KKyAgICB3cml0ZWIoUFJPVE9DT0xfVkVSIHwgQVVUSEVOVElDX1RZUEUsICZwdHgtPm1hYy5mcmFtZV9jdGxfMSk7CisgICAgd3JpdGViKDAsICZwdHgtPm1hYy5mcmFtZV9jdGxfMik7CisKKyAgICBtZW1jcHlfdG9pbyhwdHgtPm1hYy5hZGRyXzEsIGRlc3QsIEFERFJMRU4pOworICAgIG1lbWNweV90b2lvKHB0eC0+bWFjLmFkZHJfMiwgbG9jYWwtPnNwYXJtLmI0LmFfbWFjX2FkZHIsIEFERFJMRU4pOworICAgIG1lbWNweV90b2lvKHB0eC0+bWFjLmFkZHJfMywgbG9jYWwtPmJzc19pZCwgQUREUkxFTik7CisKKyAgICAvKiBGaWxsIGluIG1zZyBib2R5IHdpdGggcHJvdG9jb2wgMDAgMDAsIHNlcXVlbmNlIDAxIDAwICxzdGF0dXMgMDAgMDAgKi8KKyAgICBtZW1zZXRfaW8ocHR4LT52YXIsIDAsIDYpOworICAgIHdyaXRlYihhdXRoX3R5cGUgJiAweGZmLCBwdHgtPnZhciArIDIpOworCisgICAgLyogSW50ZXJydXB0IHRoZSBmaXJtd2FyZSB0byBwcm9jZXNzIHRoZSBjb21tYW5kICovCisgICAgaWYgKGludGVycnVwdF9lY2YobG9jYWwsIGNjc2luZGV4KSkgeworICAgICAgICBERUJVRygxLCJyYXlfY3Mgc2VuZCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGZhaWxlZCAtIEVDRiBub3QgcmVhZHkgZm9yIGludHJcbiIpOworICAgICAgICB3cml0ZWIoQ0NTX0JVRkZFUl9GUkVFLCAmKHBjY3MrKyktPmJ1ZmZlcl9zdGF0dXMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfSAvKiBFbmQgYnVpbGRfYXV0aF9mcmFtZSAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjaWZkZWYgQ09ORklHX1BST0NfRlMKK3N0YXRpYyB2b2lkIHJheWNzX3dyaXRlKGNvbnN0IGNoYXIgKm5hbWUsIHdyaXRlX3Byb2NfdCAqdywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKiBlbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KG5hbWUsIFNfSUZSRUcgfCBTX0lXVVNSLCBOVUxMKTsKKwlpZiAoZW50cnkpIHsKKwkJZW50cnktPndyaXRlX3Byb2MgPSB3OworCQllbnRyeS0+ZGF0YSA9IGRhdGE7CisJfQorfQorCitzdGF0aWMgaW50IHdyaXRlX2Vzc2lkKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworCXN0YXRpYyBjaGFyIHByb2NfZXNzaWRbMzNdOworCWludCBsZW4gPSBjb3VudDsKKworCWlmIChsZW4gPiAzMikKKwkJbGVuID0gMzI7CisJbWVtc2V0KHByb2NfZXNzaWQsIDAsIDMzKTsKKwlpZiAoY29weV9mcm9tX3VzZXIocHJvY19lc3NpZCwgYnVmZmVyLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwllc3NpZCA9IHByb2NfZXNzaWQ7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHdyaXRlX2ludChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwlzdGF0aWMgY2hhciBwcm9jX251bWJlclsxMF07CisJY2hhciAqcDsKKwlpbnQgbnIsIGxlbjsKKworCWlmICghY291bnQpCisJCXJldHVybiAwOworCisJaWYgKGNvdW50ID4gOSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNvcHlfZnJvbV91c2VyKHByb2NfbnVtYmVyLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcCA9IHByb2NfbnVtYmVyOworCW5yID0gMDsKKwlsZW4gPSBjb3VudDsKKwlkbyB7CisJCXVuc2lnbmVkIGludCBjID0gKnAgLSAnMCc7CisJCWlmIChjID4gOSkKKwkJCXJldHVybiAtRUlOVkFMOworCQluciA9IG5yKjEwICsgYzsKKwkJcCsrOworCX0gd2hpbGUgKC0tbGVuKTsKKwkqKGludCAqKWRhdGEgPSBucjsKKwlyZXR1cm4gY291bnQ7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHJheV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICJyYXlfY3MiLAorCX0sCisJLmF0dGFjaAkJPSByYXlfYXR0YWNoLAorCS5kZXRhY2gJCT0gcmF5X2RldGFjaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcmF5X2NzKHZvaWQpCit7CisgICAgaW50IHJjOworICAgIAorICAgIERFQlVHKDEsICIlc1xuIiwgcmNzaWQpOworICAgIHJjID0gcGNtY2lhX3JlZ2lzdGVyX2RyaXZlcigmcmF5X2RyaXZlcik7CisgICAgREVCVUcoMSwgInJheWxpbmsgaW5pdF9tb2R1bGUgcmVnaXN0ZXJfcGNtY2lhX2RyaXZlciByZXR1cm5zIDB4JXhcbiIscmMpOworCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKyAgICBwcm9jX21rZGlyKCJkcml2ZXIvcmF5X2NzIiwgTlVMTCk7CisKKyAgICBjcmVhdGVfcHJvY19pbmZvX2VudHJ5KCJkcml2ZXIvcmF5X2NzL3JheV9jcyIsIDAsIE5VTEwsICZyYXlfY3NfcHJvY19yZWFkKTsKKyAgICByYXljc193cml0ZSgiZHJpdmVyL3JheV9jcy9lc3NpZCIsIHdyaXRlX2Vzc2lkLCBOVUxMKTsKKyAgICByYXljc193cml0ZSgiZHJpdmVyL3JheV9jcy9uZXRfdHlwZSIsIHdyaXRlX2ludCwgJm5ldF90eXBlKTsKKyAgICByYXljc193cml0ZSgiZHJpdmVyL3JheV9jcy90cmFuc2xhdGUiLCB3cml0ZV9pbnQsICZ0cmFuc2xhdGUpOworI2VuZGlmCisgICAgaWYgKHRyYW5zbGF0ZSAhPSAwKSB0cmFuc2xhdGUgPSAxOworICAgIHJldHVybiAwOworfSAvKiBpbml0X3JheV9jcyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3JheV9jcyh2b2lkKQoreworICAgIERFQlVHKDAsICJyYXlfY3M6IGNsZWFudXBfbW9kdWxlXG4iKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisgICAgcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlci9yYXlfY3MvcmF5X2NzIiwgTlVMTCk7CisgICAgcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlci9yYXlfY3MvZXNzaWQiLCBOVUxMKTsKKyAgICByZW1vdmVfcHJvY19lbnRyeSgiZHJpdmVyL3JheV9jcy9uZXRfdHlwZSIsIE5VTEwpOworICAgIHJlbW92ZV9wcm9jX2VudHJ5KCJkcml2ZXIvcmF5X2NzL3RyYW5zbGF0ZSIsIE5VTEwpOworICAgIHJlbW92ZV9wcm9jX2VudHJ5KCJkcml2ZXIvcmF5X2NzIiwgTlVMTCk7CisjZW5kaWYKKworICAgIHBjbWNpYV91bnJlZ2lzdGVyX2RyaXZlcigmcmF5X2RyaXZlcik7CisgICAgQlVHX09OKGRldl9saXN0ICE9IE5VTEwpOworfSAvKiBleGl0X3JheV9jcyAqLworCittb2R1bGVfaW5pdChpbml0X3JheV9jcyk7Cittb2R1bGVfZXhpdChleGl0X3JheV9jcyk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc3YWZhMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5oCkBAIC0wLDAgKzEsNzggQEAKKy8qIFJheXRoZW9uIHdpcmVsZXNzIExBTiBQQ01DSUEgY2FyZCBkcml2ZXIgZm9yIExpbnV4IAorICAgQSAgUENNQ0lBIGNsaWVudCBkcml2ZXIgZm9yIHRoZSBSYXlsaW5rIHdpcmVsZXNzIG5ldHdvcmsgY2FyZAorICAgV3JpdHRlbiBieSBDb3JleSBUaG9tYXMKKyovCisKKyNpZm5kZWYgUkFZTElOS19ICisKK3N0cnVjdCBiZWFjb25fcnggeworICAgIHN0cnVjdCBtYWNfaGVhZGVyIG1hYzsKKyAgICBVQ0hBUiB0aW1lc3RhbXBbOF07CisgICAgVUNIQVIgYmVhY29uX2ludHZsWzJdOworICAgIFVDSEFSIGNhcGFiaWxpdHlbMl07CisgICAgVUNIQVIgZWxlbWVudHNbc2l6ZW9mKHN0cnVjdCBlc3NpZF9lbGVtZW50KSAKKyAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHN0cnVjdCByYXRlc19lbGVtZW50KQorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IGZyZXFfaG9wX2VsZW1lbnQpIAorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IGphcGFuX2NhbGxfc2lnbl9lbGVtZW50KQorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IHRpbV9lbGVtZW50KV07Cit9OworCisvKiBSZXR1cm4gdmFsdWVzIGZvciBnZXRfZnJlZXssX3R4fV9jY3MgKi8KKyNkZWZpbmUgRUNDU0ZVTEwgICgtMSkKKyNkZWZpbmUgRUNDU0JVU1kgICgtMikKKyNkZWZpbmUgRUNBUkRHT05FICgtMykKKwordHlwZWRlZiBzdHJ1Y3QgcmF5X2Rldl90IHsKKyAgICBpbnQgY2FyZF9zdGF0dXM7CisgICAgaW50IGF1dGhlbnRpY2F0aW9uX3N0YXRlOworICAgIGRldl9ub2RlX3QgIG5vZGU7CisgICAgd2luZG93X2hhbmRsZV90IGFtZW1faGFuZGxlOyAgIC8qIGhhbmRsZSB0byB3aW5kb3cgZm9yIGF0dHJpYnV0ZSBtZW1vcnkgICovCisgICAgd2luZG93X2hhbmRsZV90IHJtZW1faGFuZGxlOyAgIC8qIGhhbmRsZSB0byB3aW5kb3cgZm9yIHJ4IGJ1ZmZlciBvbiBjYXJkICovCisgICAgdm9pZCBfX2lvbWVtICpzcmFtOyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYmVnaW5uaW5nIG9mIHNoYXJlZCBSQU0gICAgICovCisgICAgdm9pZCBfX2lvbWVtICphbWVtOyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYXR0cmlidXRlIG1lbSB3aW5kb3cgICAgICAgICovCisgICAgdm9pZCBfX2lvbWVtICpybWVtOyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gcmVjZWl2ZSBidWZmZXIgd2luZG93ICAgICAgICovCisgICAgZGV2X2xpbmtfdCAqZmluZGVyOyAgICAgICAgICAgIC8qIHBvaW50ZXIgYmFjayB0byBkZXZfbGlua190IGZvciBjYXJkICAgICovCisgICAgc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisgICAgbG9uZyB0eF9jY3NfbG9jazsKKyAgICBsb25nIGNjc19sb2NrOworICAgIGludCAgIGRsX3BhcmFtX2NjczsKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCBiNF9zdGFydHVwX3BhcmFtcyBiNDsKKyAgICAgICAgc3RydWN0IGI1X3N0YXJ0dXBfcGFyYW1zIGI1OworICAgIH0gc3Bhcm07CisgICAgaW50IHRpbWVvdXRfZmxhZzsKKyAgICBVQ0hBUiBzdXBwb3J0ZWRfcmF0ZXNbOF07CisgICAgVUNIQVIgamFwYW5fY2FsbF9zaWduWzEyXTsKKyAgICBzdHJ1Y3Qgc3RhcnR1cF9yZXNfNiBzdGFydHVwX3JlczsKKyAgICBpbnQgbnVtX211bHRpOworICAgIC8qIE5ldHdvcmsgcGFyYW1ldGVycyBmcm9tIHN0YXJ0L2pvaW4gKi8KKyAgICBVQ0hBUiBic3NfaWRbNl07CisgICAgVUNIQVIgYXV0aF9pZFs2XTsKKyAgICBVQ0hBUiBuZXRfZGVmYXVsdF90eF9yYXRlOworICAgIFVDSEFSIGVuY3J5cHRpb247CisgICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisKKyAgICBVQ0hBUiBuZXRfdHlwZTsKKyAgICBVQ0hBUiBzdGFfdHlwZTsKKyAgICBVQ0hBUiBmd192ZXI7CisgICAgVUNIQVIgZndfYmxkOworICAgIFVDSEFSIGZ3X3ZhcjsKKyAgICBVQ0hBUiBBU0lDX3ZlcnNpb247CisgICAgVUNIQVIgYXNzb2NfaWRbMl07CisgICAgVUNIQVIgdGliX2xlbmd0aDsKKyAgICBVQ0hBUiBsYXN0X3JzbDsKKyAgICBpbnQgYmVhY29uX3J4ZWQ7CisgICAgc3RydWN0IGJlYWNvbl9yeCBsYXN0X2JjbjsKKyNpZmRlZiBXSVJFTEVTU19FWFQKKyAgICBpd19zdGF0cwl3c3RhdHM7CQkvKiBXaXJlbGVzcyBzcGVjaWZpYyBzdGF0cyAqLworI2VuZGlmCisjaWZkZWYgV0lSRUxFU1NfU1BZCisgICAgaW50CQlzcHlfbnVtYmVyOwkJLyogTnVtYmVyIG9mIGFkZHJlc3NlcyB0byBzcHkgKi8KKyAgICBtYWNfYWRkcglzcHlfYWRkcmVzc1tJV19NQVhfU1BZICsgMV07CS8qIFRoZSBhZGRyZXNzZXMgdG8gc3B5ICovCisgICAgaXdfcXVhbAlzcHlfc3RhdFtJV19NQVhfU1BZICsgMV07CS8qIFN0YXRpc3RpY3MgZ2F0aGVyZWQgKi8KKyNlbmRpZgkvKiBXSVJFTEVTU19TUFkgKi8KKworfSByYXlfZGV2X3Q7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNlbmRpZiAvKiBSQVlMSU5LX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheWN0bC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5Y3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlkOWIyNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheWN0bC5oCkBAIC0wLDAgKzEsNzMyIEBACisjaWZuZGVmIFJBWUxJTktfSAorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUNIQVI7CisKKy8qKioqKiogSUVFRSA4MDIuMTEgY29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQUREUkxFTiAgICAgICAgICAgNgorLyogRnJhbWUgY29udHJvbCAxIGJpdCBmaWVsZHMgKi8KKyNkZWZpbmUgUFJPVE9DT0xfVkVSICAgICAgMHgwMAorI2RlZmluZSBEQVRBX1RZUEUgICAgICAgICAweDA4CisjZGVmaW5lIEFTU09DX1JFUV9UWVBFICAgIDB4MDAKKyNkZWZpbmUgQVNTT0NfUkVTUF9UWVBFICAgMHgxMAorI2RlZmluZSBSRUFTU09DX1JFUV9UWVBFICAweDIwCisjZGVmaW5lIFJFQVNTT0NfUkVTUF9UWVBFIDB4MzAKKyNkZWZpbmUgTlVMTF9NU0dfVFlQRSAgICAgMHg0OAorI2RlZmluZSBCRUFDT05fVFlQRSAgICAgICAweDgwCisjZGVmaW5lIERJU0FTU09DX1RZUEUgICAgIDB4QTAKKyNkZWZpbmUgUFNQT0xMX1RZUEUgICAgICAgMHhBNAorI2RlZmluZSBBVVRIRU5USUNfVFlQRSAgICAweEIwCisjZGVmaW5lIERFQVVUSEVOVElDX1RZUEUgIDB4QzAKKy8qIEZyYW1lIGNvbnRyb2wgMiBiaXQgZmllbGRzICovCisjZGVmaW5lIEZDMl9UT19EUyAgICAgICAgIDB4MDEKKyNkZWZpbmUgRkMyX0ZST01fRFMgICAgICAgMHgwMgorI2RlZmluZSBGQzJfTU9SRV9GUkFHICAgICAweDA0CisjZGVmaW5lIEZDMl9SRVRSWSAgICAgICAgIDB4MDgKKyNkZWZpbmUgRkMyX1BTTSAgICAgICAgICAgMHgxMAorI2RlZmluZSBGQzJfTU9SRV9EQVRBICAgICAweDIwCisjZGVmaW5lIEZDMl9XRVAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgRkMyX09SREVSICAgICAgICAgMHg4MAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogODAyLjExIGVsZW1lbnQgSUQncyBhbmQgbGVuZ3RocyAqLworI2RlZmluZSBDX0JQX0NBUEFCSUxJVFlfRVNTICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQ19CUF9DQVBBQklMSVRZX0lCU1MgICAgICAgICAgICAweDAyCisjZGVmaW5lIENfQlBfQ0FQQUJJTElUWV9DRl9QT0xMQUJMRSAgICAgMHgwNAorI2RlZmluZSBDX0JQX0NBUEFCSUxJVFlfQ0ZfUE9MTF9SRVFVRVNUIDB4MDgKKyNkZWZpbmUgQ19CUF9DQVBBQklMSVRZX1BSSVZBQ1kgICAgICAgICAweDEwCisKKyNkZWZpbmUgQ19FU1NJRF9FTEVNRU5UX0lEICAgICAgICAgICAgICAgMAorI2RlZmluZSBDX0VTU0lEX0VMRU1FTlRfTUFYX0xFTkdUSCAgICAgICAzMgorCisjZGVmaW5lIENfU1VQUE9SVEVEX1JBVEVTX0VMRU1FTlRfSUQgICAgIDEKKyNkZWZpbmUgQ19TVVBQT1JURURfUkFURVNfRUxFTUVOVF9MRU5HVEggMgorCisjZGVmaW5lIENfRkhfUEFSQU1fU0VUX0VMRU1FTlRfSUQgICAgICAgIDIKKyNkZWZpbmUgQ19GSF9QQVJBTV9TRVRfRUxFTUVOVF9MTkdUSCAgICAgNQorCisjZGVmaW5lIENfQ0ZfUEFSQU1fU0VUX0VMRU1FTlRfSUQgICAgICAgIDQKKyNkZWZpbmUgQ19DRl9QQVJBTV9TRVRfRUxFTUVOVF9MTkdUSCAgICAgNgorCisjZGVmaW5lIENfVElNX0VMRU1FTlRfSUQgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQ19USU1fQklUTUFQX0xFTkdUSCAgICAgICAgICAgIDI1MQorI2RlZmluZSBDX1RJTV9CTUNBU1RfQklUICAgICAgICAgICAgICAweDAxCisKKyNkZWZpbmUgQ19JQlNTX0VMRU1FTlRfSUQgICAgICAgICAgICAgICAgNgorI2RlZmluZSBDX0lCU1NfRUxFTUVOVF9MRU5HVEggICAgICAgICAgICAyCisKKyNkZWZpbmUgQ19KQVBBTl9DQUxMX1NJR05fRUxFTUVOVF9JRCAgICA1MQorI2RlZmluZSBDX0pBUEFOX0NBTExfU0lHTl9FTEVNRU5UX0xOR1RIIDEyCisKKyNkZWZpbmUgQ19ESVNBU1NPQ19SRUFTT05fQ09ERV9MRU4gICAgICAgMgorI2RlZmluZSBDX0RJU0FTU09DX1JFQVNPTl9DT0RFX0RFRkFVTFQgICA4CisKKyNkZWZpbmUgQ19DUkNfTEVOICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDX05VTV9TVVBQT1JURURfUkFURVMgICAgICAgICAgICA4IAorLyoqKioqKiBJRUVFIDgwMi4xMSBtYWMgaGVhZGVyIGZvciB0eXBlIGRhdGEgcGFja2V0cyAqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IG1hY19oZWFkZXIgeworICBVQ0hBUiBmcmFtZV9jdGxfMTsgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBVQ0hBUiBmcmFtZV9jdGxfMjsKKyAgVUNIQVIgZHVyYXRpb25fbHNiOworICBVQ0hBUiBkdXJhdGlvbl9tc2I7CisgIFVDSEFSIGFkZHJfMVtBRERSTEVOXTsKKyAgVUNIQVIgYWRkcl8yW0FERFJMRU5dOworICBVQ0hBUiBhZGRyXzNbQUREUkxFTl07CisgIFVDSEFSIHNlcV9mcmFnX251bVsyXTsKKy8qICBVQ0hBUiBhZGRyXzRbQUREUkxFTl07ICovLyogb25seSBwcmVzZW50IGZvciBBUCB0byBBUCAoVE8gRFMgYW5kIEZST00gRFMgKi8KK307CisvKioqKioqIElFRUUgODAyLjExIGZyYW1lIGVsZW1lbnQgc3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgZXNzaWRfZWxlbWVudAoreworICBVQ0hBUiBpZDsKKyAgVUNIQVIgbGVuZ3RoOworICBVQ0hBUiB0ZXh0W0NfRVNTSURfRUxFTUVOVF9NQVhfTEVOR1RIXTsKK307CitzdHJ1Y3QgcmF0ZXNfZWxlbWVudAoreworICBVQ0hBUiBpZDsKKyAgVUNIQVIgbGVuZ3RoOworICBVQ0hBUiB2YWx1ZVs4XTsKK307CitzdHJ1Y3QgZnJlcV9ob3BfZWxlbWVudAoreworICBVQ0hBUiBpZDsKKyAgVUNIQVIgbGVuZ3RoOworICBVQ0hBUiBkd2VsbF90aW1lWzJdOworICBVQ0hBUiBob3Bfc2V0OworICBVQ0hBUiBob3BfcGF0dGVybjsKKyAgVUNIQVIgaG9wX2luZGV4OworfTsKK3N0cnVjdCB0aW1fZWxlbWVudAoreworICBVQ0hBUiBpZDsKKyAgVUNIQVIgbGVuZ3RoOworICBVQ0hBUiBkdGltX2NvdW50OworICBVQ0hBUiBkdGltX3BlcmlvZDsgICAgCisgIFVDSEFSIGJpdG1hcF9jb250cm9sOworICBVQ0hBUiB0aW1bQ19USU1fQklUTUFQX0xFTkdUSF07Cit9Oworc3RydWN0IGlic3NfZWxlbWVudAoreworICBVQ0hBUiBpZDsKKyAgVUNIQVIgbGVuZ3RoOworICBVQ0hBUiBhdGltX3dpbmRvd1syXTsKK307CitzdHJ1Y3QgamFwYW5fY2FsbF9zaWduX2VsZW1lbnQKK3sKKyAgVUNIQVIgaWQ7CisgIFVDSEFSIGxlbmd0aDsKKyAgVUNIQVIgY2FsbF9zaWduWzEyXTsKK307CisvKioqKioqIEJlYWNvbiBtZXNzYWdlIHN0cnVjdHVyZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAuZWxlbWVudHMgaXMgYSBsYXJnZSBsdW1wIG9mIG1heCBzaXplIGJlY2F1c2UgZWxlbWVudHMgYXJlIHZhcmlhYmxlIHNpemUgICovCitzdHJ1Y3QgaW5mcmFfYmVhY29uCit7CisgICAgVUNIQVIgdGltZXN0YW1wWzhdOworICAgIFVDSEFSIGJlYWNvbl9pbnR2bFsyXTsKKyAgICBVQ0hBUiBjYXBhYmlsaXR5WzJdOworICAgIFVDSEFSIGVsZW1lbnRzW3NpemVvZihzdHJ1Y3QgZXNzaWRfZWxlbWVudCkgCisgICAgICAgICAgICAgICAgICArIHNpemVvZihzdHJ1Y3QgcmF0ZXNfZWxlbWVudCkKKyAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHN0cnVjdCBmcmVxX2hvcF9lbGVtZW50KSAKKyAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHN0cnVjdCBqYXBhbl9jYWxsX3NpZ25fZWxlbWVudCkKKyAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHN0cnVjdCB0aW1fZWxlbWVudCldOworfTsKK3N0cnVjdCBhZGhvY19iZWFjb24KK3sKKyAgICBVQ0hBUiB0aW1lc3RhbXBbOF07CisgICAgVUNIQVIgYmVhY29uX2ludHZsWzJdOworICAgIFVDSEFSIGNhcGFiaWxpdHlbMl07CisgICAgVUNIQVIgZWxlbWVudHNbc2l6ZW9mKHN0cnVjdCBlc3NpZF9lbGVtZW50KSAKKyAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKHN0cnVjdCByYXRlc19lbGVtZW50KQorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IGZyZXFfaG9wX2VsZW1lbnQpIAorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IGphcGFuX2NhbGxfc2lnbl9lbGVtZW50KQorICAgICAgICAgICAgICAgICAgKyBzaXplb2Yoc3RydWN0IGlic3NfZWxlbWVudCldOworfTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICNkZWZpbmUgQ19NQUNfSERSXzJfV0VQIDB4NDAgKi8KKy8qIFRYL1JYIENDUyBjb25zdGFudHMgKi8KKyNkZWZpbmUgVFhfSEVBREVSX0xFTkdUSCAweDFDCisjZGVmaW5lIFJYX01BQ19IRUFERVJfTEVOR1RIIDB4MTgKKyNkZWZpbmUgVFhfQVVUSEVOVElDQVRFX0xFTkdUSCAoVFhfSEVBREVSX0xFTkdUSCArIDYpCisjZGVmaW5lIFRYX0FVVEhFTlRJQ0FURV9MRU5HVEhfTVNCIChUWF9BVVRIRU5USUNBVEVfTEVOR1RIID4+IDgpCisjZGVmaW5lIFRYX0FVVEhFTlRJQ0FURV9MRU5HVEhfTFNCIChUWF9BVVRIRU5USUNBVEVfTEVOR1RIICYgMHhmZikKKyNkZWZpbmUgVFhfREVBVVRIRU5USUNBVEVfTEVOR1RIIChUWF9IRUFERVJfTEVOR1RIICsgMikKKyNkZWZpbmUgVFhfREVBVVRIRU5USUNBVEVfTEVOR1RIX01TQiAoVFhfQVVUSEVOVElDQVRFX0xFTkdUSCA+PiA4KQorI2RlZmluZSBUWF9ERUFVVEhFTlRJQ0FURV9MRU5HVEhfTFNCIChUWF9BVVRIRU5USUNBVEVfTEVOR1RIICYgMHhmZikKKyNkZWZpbmUgRkNTX0xFTiAgICAgICAgICAgNAorCisjZGVmaW5lIEFESE9DICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElORlJBICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgVFlQRV9TVEEgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVFlQRV9BUCAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBQQVNTSVZFX1NDQU4gICAgICAgICAgMQorI2RlZmluZSBBQ1RJVkVfU0NBTiAgICAgICAgICAgMQorCisjZGVmaW5lIFBTTV9DQU0gICAgICAgICAgICAgICAwCisKKy8qIENvdW50cnkgY29kZXMgKi8KKyNkZWZpbmUgVVNBICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRVVST1BFICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgSkFQQU4gICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgS09SRUEgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgU1BBSU4gICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgRlJBTkNFICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgSVNSQUVMICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgQVVTVFJBTElBICAgICAgICAgICAgIDgKKyNkZWZpbmUgSkFQQU5fVEVTVCAgICAgICAgICAgIDkKKworLyogSG9wIHBhdHRlcm4gbGVuZ3RocyAqLworI2RlZmluZSBVU0FfSE9QX01PRCAgICAgICAgICA3OSAKKyNkZWZpbmUgRVVST1BFX0hPUF9NT0QgICAgICAgNzkgCisjZGVmaW5lIEpBUEFOX0hPUF9NT0QgICAgICAgIDIzCisjZGVmaW5lIEtPUkVBX0hPUF9NT0QgICAgICAgIDIzCisjZGVmaW5lIFNQQUlOX0hPUF9NT0QgICAgICAgIDI3CisjZGVmaW5lIEZSQU5DRV9IT1BfTU9EICAgICAgIDM1CisjZGVmaW5lIElTUkFFTF9IT1BfTU9EICAgICAgIDM1CisjZGVmaW5lIEFVU1RSQUxJQV9IT1BfTU9EICAgIDQ3CisjZGVmaW5lIEpBUEFOX1RFU1RfSE9QX01PRCAgIDIzCisKKyNkZWZpbmUgRVNTSURfU0laRSAgICAgICAgICAgMzIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ0lTIFJlZ2lzdGVyIENvbnN0YW50cyAqLworI2RlZmluZSBDSVNfT0ZGU0VUICAgICAgICAgICAgIDB4MGYwMAorLyogQ29uZmlndXJhdGlvbiBPcHRpb24gUmVnaXN0ZXIgKDB4MEYwMCkgKi8KKyNkZWZpbmUgQ09SX09GRlNFVCAgICAgICAgICAgICAweDAwCisjZGVmaW5lIENPUl9TT0ZUX1JFU0VUICAgICAgICAgMHg4MAorI2RlZmluZSBDT1JfTEVWRUxfSVJRICAgICAgICAgIDB4NDAKKyNkZWZpbmUgQ09SX0NPTkZJR19OVU0gICAgICAgICAweDAxCisjZGVmaW5lIENPUl9ERUZBVUxUICAgICAgICAgICAgKENPUl9MRVZFTF9JUlEgfCBDT1JfQ09ORklHX05VTSkKKworLyogQ2FyZCBDb25maWd1cmF0aW9uIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKDB4MEYwMSkgKi8KKyNkZWZpbmUgQ0NTUl9PRkZTRVQgICAgICAgICAgICAweDAxCisjZGVmaW5lIENDU1JfSE9TVF9JTlRSX1BFTkRJTkcgMHgwMQorI2RlZmluZSBDQ1NSX1BPV0VSX0RPV04gICAgICAgIDB4MDQKKworLyogSENTIEludGVycnVwdCBSZWdpc3RlciAoMHgwRjA1KSAqLworI2RlZmluZSBIQ1NfSU5UUl9PRkZTRVQgICAgICAgIDB4MDUKKy8qICNkZWZpbmUgSENTX0lOVFJfT0ZGU0VUICAgICAgICAweDBBICovCisjZGVmaW5lIEhDU19JTlRSX0NMRUFSICAgICAgICAgMHgwMAorCisvKiBFQ0YgSW50ZXJydXB0IFJlZ2lzdGVyICgweDBGMDYpICovCisjZGVmaW5lIEVDRl9JTlRSX09GRlNFVCAgICAgICAgMHgwNgorLyogI2RlZmluZSBFQ0ZfSU5UUl9PRkZTRVQgICAgICAgIDB4MEMgKi8KKyNkZWZpbmUgRUNGX0lOVFJfU0VUICAgICAgICAgICAweDAxCisKKy8qIEF1dGhvcml6YXRpb24gUmVnaXN0ZXIgMCAoMHgwRjA4KSAqLworI2RlZmluZSBBVVRIXzBfT04gICAgICAgICAgICAgIDB4NTcKKworLyogQXV0aG9yaXphdGlvbiBSZWdpc3RlciAxICgweDBGMDkpICovCisjZGVmaW5lIEFVVEhfMV9PTiAgICAgICAgICAgICAgMHg4MgorCisvKiBQcm9ncmFtIE1vZGUgUmVnaXN0ZXIgKDB4MEYwQSkgKi8KKyNkZWZpbmUgUEMyUE0gICAgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFBDMkNBTCAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBQQzJNTFNFICAgICAgICAgICAgICAgIDB4MjAKKworLyogUEMgVGVzdCBNb2RlIFJlZ2lzdGVyICgweDBGMEIpICovCisjZGVmaW5lIFBDX1RFU1RfTU9ERSAgICAgICAgICAgMHgwOAorCisvKiBGcmVxdWVuY3kgQ29udHJvbCBXb3JkICgweDBGMTApICovCisvKiBSYW5nZSAweDAyIC0gMHhBNiAqLworCisvKiBUZXN0IE1vZGUgQ29udHJvbCAxLTQgKDB4MEYxNCAtIDB4MEYxNykgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFNoYXJlZCBSQU0gQXJlYSAqLworI2RlZmluZSBTQ0JfQkFTRSAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBTVEFUVVNfQkFTRSAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBIT1NUX1RPX0VDRl9CQVNFICAgICAgIDB4MDIwMAorI2RlZmluZSBFQ0ZfVE9fSE9TVF9CQVNFICAgICAgIDB4MDMwMAorI2RlZmluZSBDQ1NfQkFTRSAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBSQ1NfQkFTRSAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBJTkZSQV9USU1fQkFTRSAgICAgICAgIDB4MEMwMAorI2RlZmluZSBTU0lEX0xJU1RfQkFTRSAgICAgICAgIDB4MEQwMAorI2RlZmluZSBUWF9CVUZfQkFTRSAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBSWF9CVUZfQkFTRSAgICAgICAgICAgIDB4ODAwMAorCisjZGVmaW5lIE5VTUJFUl9PRl9DQ1MgICAgNjQKKyNkZWZpbmUgTlVNQkVSX09GX1JDUyAgICA2NAorLyojZGVmaW5lIE5VTUJFUl9PRl9UWF9DQ1MgMTQgKi8KKyNkZWZpbmUgTlVNQkVSX09GX1RYX0NDUyAxNAorCisjZGVmaW5lIFRYX0JVRl9TSVpFICAgICAgKDIwNDggLSBzaXplb2Yoc3RydWN0IHR4X21zZykpCisjZGVmaW5lIFJYX0JVRkZfRU5EICAgICAgMHgzRkZGCisvKiBWYWx1ZXMgZm9yIGJ1ZmZlcl9zdGF0dXMgKi8KKyNkZWZpbmUgQ0NTX0JVRkZFUl9GUkVFICAgICAgIDAKKyNkZWZpbmUgQ0NTX0JVRkZFUl9CVVNZICAgICAgIDEKKyNkZWZpbmUgQ0NTX0NPTU1BTkRfQ09NUExFVEUgIDIKKyNkZWZpbmUgQ0NTX0NPTU1BTkRfRkFJTEVEICAgIDMKKworLyogVmFsdWVzIGZvciBjbWQgKi8KKyNkZWZpbmUgQ0NTX0RPV05MT0FEX1NUQVJUVVBfUEFSQU1TICAgIDEKKyNkZWZpbmUgQ0NTX1VQREFURV9QQVJBTVMgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ0NTX1JFUE9SVF9QQVJBTVMgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQ0NTX1VQREFURV9NVUxUSUNBU1RfTElTVCAgICAgIDQKKyNkZWZpbmUgQ0NTX1VQREFURV9QT1dFUl9TQVZJTkdTX01PREUgIDUKKyNkZWZpbmUgQ0NTX1NUQVJUX05FVFdPUksgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQ0NTX0pPSU5fTkVUV09SSyAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgQ0NTX1NUQVJUX0FTU09DSUFUSU9OICAgICAgICAgIDgKKyNkZWZpbmUgQ0NTX1RYX1JFUVVFU1QgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgQ0NTX1RFU1RfTUVNT1JZICAgICAgICAgICAgICAweGEKKyNkZWZpbmUgQ0NTX1NIVVRET1dOICAgICAgICAgICAgICAgICAweGIKKyNkZWZpbmUgQ0NTX0RVTVBfTUVNT1JZICAgICAgICAgICAgICAweGMKKyNkZWZpbmUgQ0NTX1NUQVJUX1RJTUVSICAgICAgICAgICAgICAweGUKKyNkZWZpbmUgQ0NTX0xBU1RfQ01EICAgICAgICAgICAgICAgICBDQ1NfU1RBUlRfVElNRVIKKworLyogVmFsdWVzIGZvciBsaW5rIGZpZWxkICovCisjZGVmaW5lIENDU19FTkRfTElTVCAgICAgICAgICAgICAgICAgMHhmZgorCisvKiB2YWx1ZXMgZm9yIGJ1ZmZlcl9zdGF0dXMgZmllbGQgKi8KKyNkZWZpbmUgUkNTX0JVRkZFUl9GUkVFICAgICAgIDAKKyNkZWZpbmUgUkNTX0JVRkZFUl9CVVNZICAgICAgIDEKKyNkZWZpbmUgUkNTX0NPTVBMRVRFICAgICAgICAgIDIKKyNkZWZpbmUgUkNTX0ZBSUxFRCAgICAgICAgICAgIDMKKyNkZWZpbmUgUkNTX0JVRkZFUl9SRUxFQVNFICAgIDB4RkYKKworLyogdmFsdWVzIGZvciBpbnRlcnJ1cHRfaWQgZmllbGQgKi8KKyNkZWZpbmUgUFJPQ0VTU19SWF9QQUNLRVQgICAgICAgICAgIDB4ODAgLyogKi8KKyNkZWZpbmUgUkVKT0lOX05FVF9DT01QTEVURSAgICAgICAgIDB4ODEgLyogUkNTIElEOiBSZWpvaW4gTmV0IENvbXBsZXRlICovCisjZGVmaW5lIFJPQU1JTkdfSU5JVElBVEVEICAgICAgICAgICAweDgyIC8qIFJDUyBJRDogUm9hbWluZyBJbml0aWF0ZWQgICAqLworI2RlZmluZSBKQVBBTl9DQUxMX1NJR05fUlhEICAgICAgICAgMHg4MyAvKiBSQ1MgSUQ6IE5ldyBKYXBhbiBDYWxsIFNpZ24gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTWVtb3J5IHR5cGVzIGZvciBkdW1wIG1lbW9yeSBjb21tYW5kICovCisjZGVmaW5lIENfTUVNX1BST0cgIDAKKyNkZWZpbmUgQ19NRU1fWERBVEEgMQorI2RlZmluZSBDX01FTV9TRlIgICAyCisjZGVmaW5lIENfTUVNX0lEQVRBIDMKKworLyoqKiBSZXR1cm4gdmFsdWVzIGZvciBod194bWl0ICoqKioqKioqKiovCisjZGVmaW5lIFhNSVRfT0sgICAgICAgICgwKQorI2RlZmluZSBYTUlUX01TR19CQUQgICAoLTEpCisjZGVmaW5lIFhNSVRfTk9fQ0NTICAgICgtMikKKyNkZWZpbmUgWE1JVF9OT19JTlRSICAgKC0zKQorI2RlZmluZSBYTUlUX05FRURfQVVUSCAoLTQpCisKKy8qKiogVmFsdWVzIGZvciBjYXJkIHN0YXR1cyAqLworI2RlZmluZSBDQVJEX0lOU0VSVEVEICAgICAgICgwKQorCisjZGVmaW5lIENBUkRfQVdBSVRJTkdfUEFSQU0gKDEpCisjZGVmaW5lIENBUkRfSU5JVF9FUlJPUiAgICAgKDExKQorCisjZGVmaW5lIENBUkRfRExfUEFSQU0gICAgICAgKDIpCisjZGVmaW5lIENBUkRfRExfUEFSQU1fRVJST1IgKDEyKQorCisjZGVmaW5lIENBUkRfRE9JTkdfQUNRICAgICAgKDMpCisKKyNkZWZpbmUgQ0FSRF9BQ1FfQ09NUExFVEUgICAoNCkKKyNkZWZpbmUgQ0FSRF9BQ1FfRkFJTEVEICAgICAoMTQpCisKKyNkZWZpbmUgQ0FSRF9BVVRIX0NPTVBMRVRFICAoNSkKKyNkZWZpbmUgQ0FSRF9BVVRIX1JFRlVTRUQgICAoMTUpCisKKyNkZWZpbmUgQ0FSRF9BU1NPQ19DT01QTEVURSAoNikKKyNkZWZpbmUgQ0FSRF9BU1NPQ19GQUlMRUQgICAoMTYpCisKKy8qKiogVmFsdWVzIGZvciBhdXRoZW50aWNhdGlvbl9zdGF0ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVU5BVVRIRU5USUNBVEVEICAgICAoMCkKKyNkZWZpbmUgQVdBSVRJTkdfUkVTUE9OU0UgICAoMSkKKyNkZWZpbmUgQVVUSEVOVElDQVRFRCAgICAgICAoMikKKyNkZWZpbmUgTkVFRF9UT19BVVRIICAgICAgICAoMykKKworLyoqKiBWYWx1ZXMgZm9yIGF1dGhlbnRpY2F0aW9uIHR5cGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBPUEVOX0FVVEhfUkVRVUVTVCAgICgxKQorI2RlZmluZSBPUEVOX0FVVEhfUkVTUE9OU0UgICgyKQorI2RlZmluZSBCUk9BRENBU1RfREVBVVRIICAgICgweGMwKQorLyoqKiBWYWx1ZXMgZm9yIHRpbWVyIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBUT0RPX05PVEhJTkcgICAgICAgICAgICAgICgwKQorI2RlZmluZSBUT0RPX1ZFUklGWV9ETF9TVEFSVCAgICAgICgtMSkKKyNkZWZpbmUgVE9ET19TVEFSVF9ORVQgICAgICAgICAgICAoLTIpCisjZGVmaW5lIFRPRE9fSk9JTl9ORVQgICAgICAgICAgICAgKC0zKQorI2RlZmluZSBUT0RPX0FVVEhFTlRJQ0FURV9USU1FT1VUICgtNCkKKyNkZWZpbmUgVE9ET19TRU5EX0NDUyAgICAgICAgICAgICAoLTUpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQYXJhbWV0ZXIgcGFzc2luZyBzdHJ1Y3R1cmUgZm9yIHVwZGF0ZS9yZXBvcnQgcGFyYW1ldGVyIENDUydzICovCitzdHJ1Y3Qgb2JqZWN0X2lkIHsKKyAgICB2b2lkICAgICAgICAgICpvYmplY3RfYWRkcjsKKyAgICB1bnNpZ25lZCBjaGFyIG9iamVjdF9sZW5ndGg7Cit9OworCisjZGVmaW5lIE9CSklEX25ldHdvcmtfdHlwZSAgICAgICAgICAgIDAKKyNkZWZpbmUgT0JKSURfYWN0aW5nX2FzX2FwX3N0YXR1cyAgICAgMQorI2RlZmluZSBPQkpJRF9jdXJyZW50X2Vzc19pZCAgICAgICAgICAyCisjZGVmaW5lIE9CSklEX3NjYW5uaW5nX21vZGUgICAgICAgICAgIDMKKyNkZWZpbmUgT0JKSURfcG93ZXJfbWd0X3N0YXRlICAgICAgICAgNAorI2RlZmluZSBPQkpJRF9tYWNfYWRkcmVzcyAgICAgICAgICAgICA1CisjZGVmaW5lIE9CSklEX2ZyYWdfdGhyZXNob2xkICAgICAgICAgIDYKKyNkZWZpbmUgT0JKSURfaG9wX3RpbWUgICAgICAgICAgICAgICAgNworI2RlZmluZSBPQkpJRF9iZWFjb25fcGVyaW9kICAgICAgICAgICA4CisjZGVmaW5lIE9CSklEX2R0aW1fcGVyaW9kICAgICAgICAgICAgIDkKKyNkZWZpbmUgT0JKSURfcmV0cnlfbWF4ICAgICAgICAgICAgICAxMAorI2RlZmluZSBPQkpJRF9hY2tfdGltZW91dCAgICAgICAgICAgIDExCisjZGVmaW5lIE9CSklEX3NpZnMgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgT0JKSURfZGlmcyAgICAgICAgICAgICAgICAgICAxMworI2RlZmluZSBPQkpJRF9waWZzICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIE9CSklEX3J0c190aHJlc2hvbGQgICAgICAgICAgMTUKKyNkZWZpbmUgT0JKSURfc2Nhbl9kd2VsbF90aW1lICAgICAgICAxNgorI2RlZmluZSBPQkpJRF9tYXhfc2Nhbl9kd2VsbF90aW1lICAgIDE3CisjZGVmaW5lIE9CSklEX2Fzc29jX3Jlc3BfdGltZW91dCAgICAgMTgKKyNkZWZpbmUgT0JKSURfYWRob2Nfc2Nhbl9jeWNsZV9tYXggICAxOQorI2RlZmluZSBPQkpJRF9pbmZyYV9zY2FuX2N5Y2xlX21heCAgIDIwCisjZGVmaW5lIE9CSklEX2luZnJhX3N1cGVyX2N5Y2xlX21heCAgMjEKKyNkZWZpbmUgT0JKSURfcHJvbWlzY3VvdXNfbW9kZSAgICAgICAyMgorI2RlZmluZSBPQkpJRF91bmlxdWVfd29yZCAgICAgICAgICAgIDIzCisjZGVmaW5lIE9CSklEX3Nsb3RfdGltZSAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgT0JKSURfcm9hbWluZ19sb3dfc25yICAgICAgICAyNQorI2RlZmluZSBPQkpJRF9sb3dfc25yX2NvdW50X3RocmVzaCAgIDI2CisjZGVmaW5lIE9CSklEX2luZnJhX21pc3NlZF9iY24gICAgICAgMjcKKyNkZWZpbmUgT0JKSURfYWRob2NfbWlzc2VkX2JjbiAgICAgICAyOAorI2RlZmluZSBPQkpJRF9jdXJyX2NvdW50cnlfY29kZSAgICAgIDI5CisjZGVmaW5lIE9CSklEX2hvcF9wYXR0ZXJuICAgICAgICAgICAgMzAKKyNkZWZpbmUgT0JKSURfcmVzZXJ2ZWQgICAgICAgICAgICAgICAzMQorI2RlZmluZSBPQkpJRF9jd19tYXhfbXNiICAgICAgICAgICAgIDMyCisjZGVmaW5lIE9CSklEX2N3X21pbl9tc2IgICAgICAgICAgICAgMzMKKyNkZWZpbmUgT0JKSURfbm9pc2VfZmlsdGVyX2dhaW4gICAgICAzNAorI2RlZmluZSBPQkpJRF9ub2lzZV9saW1pdF9vZmZzZXQgICAgIDM1CisjZGVmaW5lIE9CSklEX2RldF9yc3NpX3RocmVzaF9vZmZzZXQgMzYKKyNkZWZpbmUgT0JKSURfbWVkX2J1c3lfdGhyZXNoX29mZnNldCAzNworI2RlZmluZSBPQkpJRF9kZXRfc3luY190aHJlc2ggICAgICAgIDM4CisjZGVmaW5lIE9CSklEX3Rlc3RfbW9kZSAgICAgICAgICAgICAgMzkKKyNkZWZpbmUgT0JKSURfdGVzdF9taW5fY2hhbl9udW0gICAgICA0MAorI2RlZmluZSBPQkpJRF90ZXN0X21heF9jaGFuX251bSAgICAgIDQxCisjZGVmaW5lIE9CSklEX2FsbG93X2JjYXN0X0lEX3ByYnJzcCAgNDIKKyNkZWZpbmUgT0JKSURfcHJpdmFjeV9tdXN0X3N0YXJ0ICAgICA0MworI2RlZmluZSBPQkpJRF9wcml2YWN5X2Nhbl9qb2luICAgICAgIDQ0CisjZGVmaW5lIE9CSklEX2Jhc2ljX3JhdGVfc2V0ICAgICAgICAgNDUKKworLyoqKiogQ29uZmlndXJhdGlvbi9TdGF0dXMvQ29udHJvbCBBcmVhICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgIFN5c3RlbSBDb250cm9sIEJsb2NrIChTQ0IpIEFyZWEKKyAqICAgIExvY2F0ZWQgYXQgU2hhcmVkIFJBTSBvZmZzZXQgMAorICovCitzdHJ1Y3Qgc2NiIHsKKyAgICBVQ0hBUiBjY3NfaW5kZXg7CisgICAgVUNIQVIgcmNzX2luZGV4OworfTsKKworLyoqKioqKiBTdGF0dXMgYXJlYSBhdCBTaGFyZWQgUkFNIG9mZnNldCAweDAxMDAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHN0YXR1cyB7CisgICAgVUNIQVIgbXJ4X292ZXJmbG93X2Zvcl9ob3N0OyAgICAgICAgIC8qIDA9RUNGIG1heSB3cml0ZSwgMT1ob3N0IG1heSB3cml0ZSovCisgICAgVUNIQVIgbXJ4X2NoZWNrc3VtX2Vycm9yX2Zvcl9ob3N0OyAgIC8qIDA9RUNGIG1heSB3cml0ZSwgMT1ob3N0IG1heSB3cml0ZSovCisgICAgVUNIQVIgcnhfaGVjX2Vycm9yX2Zvcl9ob3N0OyAgICAgICAgIC8qIDA9RUNGIG1heSB3cml0ZSwgMT1ob3N0IG1heSB3cml0ZSovCisgICAgVUNIQVIgcmVzZXJ2ZWQxOworICAgIHNob3J0IG1yeF9vdmVyZmxvdzsgICAgICAgICAgICAgICAgICAvKiBFQ0YgaW5jcmVtZW50cyBvbiByeCBvdmVyZmxvdyAgICAqLworICAgIHNob3J0IG1yeF9jaGVja3N1bV9lcnJvcjsgICAgICAgICAgICAvKiBFQ0YgaW5jcmVtZW50cyBvbiByeCBDUkMgZXJyb3IgICAqLworICAgIHNob3J0IHJ4X2hlY19lcnJvcjsgICAgICAgICAgICAgICAgICAvKiBFQ0YgaW5jcyBvbiBtYWMgaGVhZGVyIENSQyBlcnJvciAqLworICAgIFVDSEFSIHJ4bm9pc2U7ICAgICAgICAgICAgICAgICAgICAgICAvKiBBdmVyYWdlIFJTTCBtZWFzdXJlbWVudCAgICAgICAgICAqLworfTsKKworLyoqKioqKiBIb3N0LXRvLUVDRiBEYXRhIEFyZWEgYXQgU2hhcmVkIFJBTSBvZmZzZXQgMHgyMDAgKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IGhvc3RfdG9fZWNmX2FyZWEgeworICAgIAorfTsKKworLyoqKioqKiBFQ0YtdG8tSG9zdCBEYXRhIEFyZWEgYXQgU2hhcmVkIFJBTSBvZmZzZXQgMHgwMzAwICoqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHN0YXJ0dXBfcmVzXzUxOCB7CisgICAgVUNIQVIgc3RhcnR1cF93b3JkOworICAgIFVDSEFSIHN0YXRpb25fYWRkcltBRERSTEVOXTsKKyAgICBVQ0hBUiBjYWxjX3Byb2dfY2hrc3VtOworICAgIFVDSEFSIGNhbGNfY2lzX2Noa3N1bTsKKyAgICBVQ0hBUiBlY2Zfc3BhcmVbN107CisgICAgVUNIQVIgamFwYW5fY2FsbF9zaWduWzEyXTsKK307CisKK3N0cnVjdCBzdGFydHVwX3Jlc182IHsKKyAgICBVQ0hBUiBzdGFydHVwX3dvcmQ7CisgICAgVUNIQVIgc3RhdGlvbl9hZGRyW0FERFJMRU5dOworICAgIFVDSEFSIHJlc2VydmVkOworICAgIFVDSEFSIHN1cHBfcmF0ZXNbOF07CisgICAgVUNIQVIgamFwYW5fY2FsbF9zaWduWzEyXTsKKyAgICBVQ0hBUiBjYWxjX3Byb2dfY2hrc3VtOworICAgIFVDSEFSIGNhbGNfY2lzX2Noa3N1bTsKKyAgICBVQ0hBUiBmaXJtd2FyZV92ZXJzaW9uWzNdOworICAgIFVDSEFSIGFzaWNfdmVyc2lvbjsKKyAgICBVQ0hBUiB0aWJfbGVuZ3RoOworfTsKKworc3RydWN0IHN0YXJ0X2pvaW5fbmV0X3BhcmFtcyB7CisgICAgVUNIQVIgbmV0X3R5cGU7CisgICAgVUNIQVIgc3NpZFtFU1NJRF9TSVpFXTsKKyAgICBVQ0hBUiByZXNlcnZlZDsKKyAgICBVQ0hBUiBwcml2YWN5X2Nhbl9qb2luOworfTsKKworLyoqKioqKiBDb21tYW5kIENvbnRyb2wgU3RydWN0dXJlIGFyZWEgYXQgU2hhcmVkIHJhbSBvZmZzZXQgMHgwNDAwICoqKioqKioqKioqLworLyogU3RydWN0dXJlcyBmb3IgY29tbWFuZCBzcGVjaWZpYyBwYXJhbWV0ZXJzIChjY3MudmFyKSAqLworc3RydWN0IHVwZGF0ZV9wYXJhbV9jbWQgeworICAgIFVDSEFSIG9iamVjdF9pZDsKKyAgICBVQ0hBUiBudW1iZXJfb2JqZWN0czsKKyAgICBVQ0hBUiBmYWlsdXJlX2NhdXNlOworfTsKK3N0cnVjdCByZXBvcnRfcGFyYW1fY21kIHsKKyAgICBVQ0hBUiBvYmplY3RfaWQ7CisgICAgVUNIQVIgbnVtYmVyX29iamVjdHM7CisgICAgVUNIQVIgZmFpbHVyZV9jYXVzZTsKKyAgICBVQ0hBUiBsZW5ndGg7Cit9Oworc3RydWN0IHN0YXJ0X25ldHdvcmtfY21kIHsKKyAgICBVQ0hBUiB1cGRhdGVfcGFyYW07CisgICAgVUNIQVIgYnNzaWRbQUREUkxFTl07CisgICAgVUNIQVIgbmV0X2luaXRpYXRlZDsKKyAgICBVQ0hBUiBuZXRfZGVmYXVsdF90eF9yYXRlOworICAgIFVDSEFSIGVuY3J5cHRpb247Cit9Oworc3RydWN0IGpvaW5fbmV0d29ya19jbWQgeworICAgIFVDSEFSIHVwZGF0ZV9wYXJhbTsKKyAgICBVQ0hBUiBic3NpZFtBRERSTEVOXTsKKyAgICBVQ0hBUiBuZXRfaW5pdGlhdGVkOworICAgIFVDSEFSIG5ldF9kZWZhdWx0X3R4X3JhdGU7CisgICAgVUNIQVIgZW5jcnlwdGlvbjsKK307CitzdHJ1Y3QgdHhfcmVxdWVzdGVkX2NtZCB7CisgCisgICAgVUNIQVIgdHhfZGF0YV9wdHJbMl07CisgICAgVUNIQVIgdHhfZGF0YV9sZW5ndGhbMl07CisgICAgVUNIQVIgaG9zdF9yZXNlcnZlZFsyXTsKKyAgICBVQ0hBUiByZXNlcnZlZFszXTsKKyAgICBVQ0hBUiB0eF9yYXRlOworICAgIFVDSEFSIHBvd19zYXZfbW9kZTsKKyAgICBVQ0hBUiByZXRyaWVzOworICAgIFVDSEFSIGFudGVubmE7Cit9Oworc3RydWN0IHR4X3JlcXVlc3RlZF9jbWRfNCB7CisgCisgICAgVUNIQVIgdHhfZGF0YV9wdHJbMl07CisgICAgVUNIQVIgdHhfZGF0YV9sZW5ndGhbMl07CisgICAgVUNIQVIgZGVzdF9hZGRyW0FERFJMRU5dOworICAgIFVDSEFSIHBvd19zYXZfbW9kZTsKKyAgICBVQ0hBUiByZXRyaWVzOworICAgIFVDSEFSIHN0YXRpb25faWQ7Cit9Oworc3RydWN0IG1lbW9yeV9kdW1wX2NtZCB7CisgICAgVUNIQVIgbWVtb3J5X3R5cGU7CisgICAgVUNIQVIgbWVtb3J5X3B0clsyXTsKKyAgICBVQ0hBUiBsZW5ndGg7Cit9Oworc3RydWN0IHVwZGF0ZV9hc3NvY2lhdGlvbl9jbWQgeworICAgIFVDSEFSIHN0YXR1czsKKyAgICBVQ0hBUiBhaWRbMl07Cit9Oworc3RydWN0IHN0YXJ0X3RpbWVyX2NtZCB7CisgICAgVUNIQVIgZHVyYXRpb25bMl07Cit9OworCitzdHJ1Y3QgY2NzIHsKKyAgICBVQ0hBUiBidWZmZXJfc3RhdHVzOyAgICAgICAgICAgICAgICAgLyogMCA9IGJ1ZmZlciBmcmVlLCAxID0gYnVmZmVyIGJ1c3kgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMiA9IGNvbW1hbmQgY29tcGxldGUsIDMgPSBmYWlsZWQgKi8KKyAgICBVQ0hBUiBjbWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29tbWFuZCB0byBFQ0YgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBsaW5rOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGluayB0byBuZXh0IENDUywgRkY9ZW5kIG9mIGxpc3QgKi8KKyAgICAvKiBjb21tYW5kIHNwZWNpZmljIHBhcmFtZXRlcnMgICAgICAqLworICAgIHVuaW9uIHsKKyAgICAgICAgY2hhciByZXNlcnZlZFsxM107CisgICAgICAgIHN0cnVjdCB1cGRhdGVfcGFyYW1fY21kIHVwZGF0ZV9wYXJhbTsKKyAgICAgICAgc3RydWN0IHJlcG9ydF9wYXJhbV9jbWQgcmVwb3J0X3BhcmFtOworICAgICAgICBVQ0hBUiBudW1tdWx0aWNhc3Q7CisgICAgICAgIFVDSEFSIG1vZGU7CisgICAgICAgIHN0cnVjdCBzdGFydF9uZXR3b3JrX2NtZCBzdGFydF9uZXR3b3JrOworICAgICAgICBzdHJ1Y3Qgam9pbl9uZXR3b3JrX2NtZCBqb2luX25ldHdvcms7CisgICAgICAgIHN0cnVjdCB0eF9yZXF1ZXN0ZWRfY21kIHR4X3JlcXVlc3Q7CisgICAgICAgIHN0cnVjdCBtZW1vcnlfZHVtcF9jbWQgbWVtb3J5X2R1bXA7CisgICAgICAgIHN0cnVjdCB1cGRhdGVfYXNzb2NpYXRpb25fY21kIHVwZGF0ZV9hc3NvYzsKKyAgICAgICAgc3RydWN0IHN0YXJ0X3RpbWVyX2NtZCBzdGFydF90aW1lcjsKKyAgICB9IHZhcjsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRyYW5zbWl0IGJ1ZmZlciBzdHJ1Y3R1cmVzICovCitzdHJ1Y3QgdGliX3N0cnVjdHVyZSB7CisgICAgVUNIQVIgY2NzX2luZGV4OworICAgIFVDSEFSIHBzbTsKKyAgICBVQ0hBUiBwYXNzX2ZhaWw7CisgICAgVUNIQVIgcmV0cnlfY291bnQ7CisgICAgVUNIQVIgbWF4X3JldHJpZXM7CisgICAgVUNIQVIgZnJhZ3NfcmVtYWluaW5nOworICAgIFVDSEFSIG5vX3JiOworICAgIFVDSEFSIHJ0c19yZXFkOworICAgIFVDSEFSIGNzbWFfdHhfY250cmxfMjsKKyAgICBVQ0hBUiBzaWZzX3R4X2NudHJsXzI7CisgICAgVUNIQVIgdHhfZG1hX2FkZHJfMVsyXTsKKyAgICBVQ0hBUiB0eF9kbWFfYWRkcl8yWzJdOworICAgIFVDSEFSIHZhcl9kdXJfMm1oelsyXTsKKyAgICBVQ0hBUiB2YXJfZHVyXzFtaHpbMl07CisgICAgVUNIQVIgbWF4X2R1cl8ybWh6WzJdOworICAgIFVDSEFSIG1heF9kdXJfMW1oelsyXTsKKyAgICBVQ0hBUiBoZHJfbGVuOworICAgIFVDSEFSIG1heF9mcmFnX2xlblsyXTsKKyAgICBVQ0hBUiB2YXJfbGVuWzJdOworICAgIFVDSEFSIHBoeV9oZHJfNDsKKyAgICBVQ0hBUiBtYWNfaGRyXzE7CisgICAgVUNIQVIgbWFjX2hkcl8yOworICAgIFVDSEFSIHNpZFsyXTsKK307CisKK3N0cnVjdCBwaHlfaGVhZGVyIHsKKyAgICBVQ0hBUiBzZmRbMl07CisgICAgVUNIQVIgaGRyXzM7CisgICAgVUNIQVIgaGRyXzQ7Cit9Oworc3RydWN0IHJ4X21zZyB7CisgICAgc3RydWN0IG1hY19oZWFkZXIgbWFjOworICAgIFVDSEFSICB2YXJbMV07Cit9OworCitzdHJ1Y3QgdHhfbXNnIHsKKyAgICBzdHJ1Y3QgdGliX3N0cnVjdHVyZSB0aWI7CisgICAgc3RydWN0IHBoeV9oZWFkZXIgcGh5OworICAgIHN0cnVjdCBtYWNfaGVhZGVyIG1hYzsKKyAgICBVQ0hBUiAgdmFyWzFdOworfTsKKworLyoqKioqKiBFQ0YgUmVjZWl2ZSBDb250cm9sIFN0dWN0dXJlIChSQ1MpIEFyZWEgYXQgU2hhcmVkIFJBTSBvZmZzZXQgMHgwODAwICAqLworLyogU3RydWN0dXJlcyBmb3IgY29tbWFuZCBzcGVjaWZpYyBwYXJhbWV0ZXJzIChyY3MudmFyKSAqLworc3RydWN0IHJ4X3BhY2tldF9jbWQgeworICAgIFVDSEFSIHJ4X2RhdGFfcHRyWzJdOworICAgIFVDSEFSIHJ4X2RhdGFfbGVuZ3RoWzJdOworICAgIFVDSEFSIHJ4X3NpZ19sZXY7CisgICAgVUNIQVIgbmV4dF9mcmFnX3Jjc19pbmRleDsKKyAgICBVQ0hBUiB0b3RhbHBhY2tldGxlbmd0aFsyXTsKK307CitzdHJ1Y3QgcmVqb2luX25ldF9jbXBsdF9jbWQgeworICAgIFVDSEFSIHJlc2VydmVkOworICAgIFVDSEFSIGJzc2lkW0FERFJMRU5dOworfTsKK3N0cnVjdCBqYXBhbl9jYWxsX3NpZ25fcnhkIHsKKyAgICBVQ0hBUiByeGRfY2FsbF9zaWduWzhdOworICAgIFVDSEFSIHJlc2VydmVkWzVdOworfTsKKworc3RydWN0IHJjcyB7CisgICAgVUNIQVIgYnVmZmVyX3N0YXR1czsKKyAgICBVQ0hBUiBpbnRlcnJ1cHRfaWQ7CisgICAgVUNIQVIgbGlua19maWVsZDsKKyAgICAvKiBjb21tYW5kIHNwZWNpZmljIHBhcmFtZXRlcnMgICAgICAqLworICAgIHVuaW9uIHsKKyAgICAgICAgVUNIQVIgcmVzZXJ2ZWRbMTNdOyAKKyAgICAgICAgc3RydWN0IHJ4X3BhY2tldF9jbWQgcnhfcGFja2V0OworICAgICAgICBzdHJ1Y3QgcmVqb2luX25ldF9jbXBsdF9jbWQgcmVqb2luX25ldF9jb21wbGV0ZTsKKyAgICAgICAgc3RydWN0IGphcGFuX2NhbGxfc2lnbl9yeGQgamFwYW5fY2FsbF9zaWduOworICAgIH0gdmFyOworfTsKKworLyoqKioqKiBTdGFydHVwIHBhcmFtZXRlciBzdHJ1Y3R1cmVzIGZvciBib3RoIHZlcnNpb25zIG9mIGZpcm13YXJlICoqKioqKioqKioqLworc3RydWN0IGI0X3N0YXJ0dXBfcGFyYW1zIHsKKyAgICBVQ0hBUiBhX25ldHdvcmtfdHlwZTsgICAgICAgICAgICAgICAgLyogQ19BREhPQywgQ19JTkZSQSAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2FjdGluZ19hc19hcF9zdGF0dXM7ICAgICAgICAgLyogQ19UWVBFX1NUQSwgQ19UWVBFX0FQICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2N1cnJlbnRfZXNzX2lkW0VTU0lEX1NJWkVdOyAgLyogTnVsbCB0ZXJtaW5hdGVkIHVubGVzcyAzMiBsb25nICAgKi8KKyAgICBVQ0hBUiBhX3NjYW5uaW5nX21vZGU7ICAgICAgICAgICAgICAgLyogcGFzc2l2ZSAwLCBhY3RpdmUgMSAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3Bvd2VyX21ndF9zdGF0ZTsgICAgICAgICAgICAgLyogQ0FNIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX21hY19hZGRyW0FERFJMRU5dOyAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2ZyYWdfdGhyZXNob2xkWzJdOyAgICAgICAgICAgLyogNTEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2hvcF90aW1lWzJdOyAgICAgICAgICAgICAgICAgLyogMTZrICogMioqbiwgbj0wLTQgaW4gS3VzICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2JlYWNvbl9wZXJpb2RbMl07ICAgICAgICAgICAgLyogbiAqIGFfaG9wX3RpbWUgIGluIEt1cyAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2R0aW1fcGVyaW9kOyAgICAgICAgICAgICAgICAgLyogaW4gYmVhY29ucyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3JldHJ5X21heDsgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2Fja190aW1lb3V0OyAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3NpZnM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2RpZnM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3BpZnM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3J0c190aHJlc2hvbGRbMl07ICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3NjYW5fZHdlbGxfdGltZVsyXTsgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX21heF9zY2FuX2R3ZWxsX3RpbWVbMl07ICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2Fzc29jX3Jlc3BfdGltZW91dF90aHJlc2g7ICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2FkaG9jX3NjYW5fY3ljbGVfbWF4OyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2luZnJhX3NjYW5fY3ljbGVfbWF4OyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2luZnJhX3N1cGVyX3NjYW5fY3ljbGVfbWF4OyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3Byb21pc2N1b3VzX21vZGU7ICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3VuaXF1ZV93b3JkWzJdOyAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3Nsb3RfdGltZTsgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3JvYW1pbmdfbG93X3Nucl90aHJlc2g7ICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2xvd19zbnJfY291bnRfdGhyZXNoOyAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2luZnJhX21pc3NlZF9iY25fdGhyZXNoOyAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2FkaG9jX21pc3NlZF9iY25fdGhyZXNoOyAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2N1cnJfY291bnRyeV9jb2RlOyAgICAgICAgICAgLyogQ19VU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2hvcF9wYXR0ZXJuOyAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2hvcF9wYXR0ZXJuX2xlbmd0aDsgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIGI0IC0gYjUgZGlmZmVyZW5jZXMgc3RhcnQgaGVyZSAqLworICAgIFVDSEFSIGFfY3dfbWF4OyAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfY3dfbWluOyAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfbm9pc2VfZmlsdGVyX2dhaW47ICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfbm9pc2VfbGltaXRfb2Zmc2V0OyAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfZGV0X3Jzc2lfdGhyZXNoX29mZnNldDsgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfbWVkX2J1c3lfdGhyZXNoX29mZnNldDsgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfZGV0X3N5bmNfdGhyZXNoOyAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfdGVzdF9tb2RlOyAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfdGVzdF9taW5fY2hhbl9udW07ICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfdGVzdF9tYXhfY2hhbl9udW07ICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfcnhfdHhfZGVsYXk7ICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfY3VycmVudF9ic3NfaWRbQUREUkxFTl07ICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFVDSEFSIGFfaG9wX3NldDsgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfTsKK3N0cnVjdCBiNV9zdGFydHVwX3BhcmFtcyB7CisgICAgVUNIQVIgYV9uZXR3b3JrX3R5cGU7ICAgICAgICAgICAgICAgIC8qIENfQURIT0MsIENfSU5GUkEgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9hY3RpbmdfYXNfYXBfc3RhdHVzOyAgICAgICAgIC8qIENfVFlQRV9TVEEsIENfVFlQRV9BUCAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9jdXJyZW50X2Vzc19pZFtFU1NJRF9TSVpFXTsgIC8qIE51bGwgdGVybWluYXRlZCB1bmxlc3MgMzIgbG9uZyAgICovCisgICAgVUNIQVIgYV9zY2FubmluZ19tb2RlOyAgICAgICAgICAgICAgIC8qIHBhc3NpdmUgMCwgYWN0aXZlIDEgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9wb3dlcl9tZ3Rfc3RhdGU7ICAgICAgICAgICAgIC8qIENBTSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9tYWNfYWRkcltBRERSTEVOXTsgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9mcmFnX3RocmVzaG9sZFsyXTsgICAgICAgICAgIC8qIDUxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9ob3BfdGltZVsyXTsgICAgICAgICAgICAgICAgIC8qIDE2ayAqIDIqKm4sIG49MC00IGluIEt1cyAgICAgICAgICovCisgICAgVUNIQVIgYV9iZWFjb25fcGVyaW9kWzJdOyAgICAgICAgICAgIC8qIG4gKiBhX2hvcF90aW1lICBpbiBLdXMgICAgICAgICAgICovCisgICAgVUNIQVIgYV9kdGltX3BlcmlvZDsgICAgICAgICAgICAgICAgIC8qIGluIGJlYWNvbnMgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9yZXRyeV9tYXg7ICAgICAgICAgICAgICAgICAgIC8qIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9hY2tfdGltZW91dDsgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9zaWZzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9kaWZzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9waWZzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9ydHNfdGhyZXNob2xkWzJdOyAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9zY2FuX2R3ZWxsX3RpbWVbMl07ICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9tYXhfc2Nhbl9kd2VsbF90aW1lWzJdOyAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9hc3NvY19yZXNwX3RpbWVvdXRfdGhyZXNoOyAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9hZGhvY19zY2FuX2N5Y2xlX21heDsgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9pbmZyYV9zY2FuX2N5Y2xlX21heDsgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9pbmZyYV9zdXBlcl9zY2FuX2N5Y2xlX21heDsgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9wcm9taXNjdW91c19tb2RlOyAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV91bmlxdWVfd29yZFsyXTsgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9zbG90X3RpbWU7ICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9yb2FtaW5nX2xvd19zbnJfdGhyZXNoOyAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9sb3dfc25yX2NvdW50X3RocmVzaDsgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9pbmZyYV9taXNzZWRfYmNuX3RocmVzaDsgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9hZGhvY19taXNzZWRfYmNuX3RocmVzaDsgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9jdXJyX2NvdW50cnlfY29kZTsgICAgICAgICAgIC8qIENfVVNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9ob3BfcGF0dGVybjsgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgVUNIQVIgYV9ob3BfcGF0dGVybl9sZW5ndGg7ICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBiNCAtIGI1IGRpZmZlcmVuY2VzIHN0YXJ0IGhlcmUgKi8KKyAgICBVQ0hBUiBhX2N3X21heFsyXTsgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2N3X21pblsyXTsgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX25vaXNlX2ZpbHRlcl9nYWluOyAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX25vaXNlX2xpbWl0X29mZnNldDsgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2RldF9yc3NpX3RocmVzaF9vZmZzZXQ7ICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX21lZF9idXN5X3RocmVzaF9vZmZzZXQ7ICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2RldF9zeW5jX3RocmVzaDsgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3Rlc3RfbW9kZTsgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3Rlc3RfbWluX2NoYW5fbnVtOyAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX3Rlc3RfbWF4X2NoYW5fbnVtOyAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBVQ0hBUiBhX2FsbG93X2JjYXN0X1NTSURfcHJvYmVfcnNwOworICAgIFVDSEFSIGFfcHJpdmFjeV9tdXN0X3N0YXJ0OworICAgIFVDSEFSIGFfcHJpdmFjeV9jYW5fam9pbjsKKyAgICBVQ0hBUiBhX2Jhc2ljX3JhdGVfc2V0WzhdOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBSQVlfSU9DR19QQVJNUyAoU0lPQ0RFVlBSSVZBVEUpCisjZGVmaW5lIFJBWV9JT0NTX1BBUk1TIChTSU9DREVWUFJJVkFURSArIDEpCisjZGVmaW5lIFJBWV9ET19DTUQgICAgIChTSU9DREVWUFJJVkFURSArIDIpCisKKy8qKioqKiogZXRoZXJuZXQgPC0+IDgwMi4xMSB0cmFuc2xhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHNuYXBoZHJfdAoreworICBVQ0hBUiAgIGRzYXA7CisgIFVDSEFSICAgc3NhcDsKKyAgVUNIQVIgICBjdHJsOworICBVQ0hBUiAgIG9yZ1szXTsKKyAgVUNIQVIgICBldGhlcnR5cGVbMl07Cit9IHNuYXBoZHJfdDsKKworI2RlZmluZSBCUklER0VfRU5DQVAgIDB4ZjgwMDAwCisjZGVmaW5lIFJGQzEwNDJfRU5DQVAgMAorI2RlZmluZSBTTkFQX0lEICAgICAgIDB4MDAwM2FhYWEKKyNkZWZpbmUgUkFZX0lQWF9UWVBFICAweDgxMzcKKyNkZWZpbmUgQVBQTEVBUlBfVFlQRSAweDgwZjMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZiAvKiAjaWZuZGVmIFJBWUxJTktfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvc3RyaXAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3N0cmlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4Y2YyOWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9zdHJpcC5jCkBAIC0wLDAgKzEsMjg0MyBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk2IFRoZSBCb2FyZCBvZiBUcnVzdGVlcyBvZiBUaGUgTGVsYW5kIFN0YW5mb3JkCisgKiBKdW5pb3IgVW5pdmVyc2l0eS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCisgKiBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0CisgKiBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLiAgU3RhbmZvcmQgVW5pdmVyc2l0eQorICogbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzCisgKiBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqCisgKiBzdHJpcC5jCVRoaXMgbW9kdWxlIGltcGxlbWVudHMgU3Rhcm1vZGUgUmFkaW8gSVAgKFNUUklQKQorICoJCWZvciBrZXJuZWwtYmFzZWQgZGV2aWNlcyBsaWtlIFRUWS4gIEl0IGludGVyZmFjZXMgYmV0d2VlbiBhCisgKgkJcmF3IFRUWSwgYW5kIHRoZSBrZXJuZWwncyBJTkVUIHByb3RvY29sIGxheWVycyAodmlhIERESSkuCisgKgorICogVmVyc2lvbjoJQCgjKXN0cmlwLmMJMS4zCUp1bHkgMTk5NworICoKKyAqIEF1dGhvcjoJU3R1YXJ0IENoZXNoaXJlIDxjaGVzaGlyZUBjcy5zdGFuZm9yZC5lZHU+CisgKgorICogRml4ZXM6CXYwLjkgMTJ0aCBGZWIgMTk5NiAoU0MpCisgKgkJTmV3IGJ5dGUgc3R1ZmZpbmcgKDIrNiBydW4tbGVuZ3RoIGVuY29kaW5nKQorICoJCU5ldyB3YXRjaGRvZyB0aW1lciB0YXNrCisgKgkJTmV3IFByb3RvY29sIGtleSAoU0lQMCkKKyAqCQkKKyAqCQl2MC45LjEgM3JkIE1hcmNoIDE5OTYgKFNDKQorICoJCUNoYW5nZWQgdG8gZHluYW1pYyBkZXZpY2UgYWxsb2NhdGlvbiAtLSBubyBtb3JlIGNvbXBpbGUKKyAqCQl0aW1lIChvciBib290IHRpbWUpIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgU1RSSVAgZGV2aWNlcy4KKyAqCQkKKyAqCQl2MC45LjIgMTN0aCBNYXJjaCAxOTk2IChTQykKKyAqCQlVc2VzIGFycCBjYWNoZSBsb29rdXBzIChidXQgZG9lc24ndCBzZW5kIGFycCBwYWNrZXRzIHlldCkKKyAqCQkKKyAqCQl2MC45LjMgMTd0aCBBcHJpbCAxOTk2IChTQykKKyAqCQlGaXhlZCBidWcgd2hlcmUgU1RSX0VSUk9SIGZsYWcgd2FzIGdldHRpbmcgc2V0IHVubmVjY2Vzc2FyaWx5CisgKgkJKGNhdXNpbmcgb3RoZXJ3aXNlIGdvb2QgcGFja2V0cyB0byBiZSB1bm5lY2Nlc3NhcmlseSBkcm9wcGVkKQorICoJCQorICoJCXYwLjkuNCAyN3RoIEFwcmlsIDE5OTYgKFNDKQorICoJCUZpcnN0IGF0dGVtcHQgYXQgdXNpbmcgIiZDT01NQU5EIiBTdGFybW9kZSBBVCBjb21tYW5kcworICoJCQorICoJCXYwLjkuNSAyOXRoIE1heSAxOTk2IChTQykKKyAqCQlGaXJzdCBhdHRlbXB0IGF0IHNlbmRpbmcgKHVuaWNhc3QpIEFSUCBwYWNrZXRzCisgKgkJCisgKgkJdjAuOS42IDV0aCBKdW5lIDE5OTYgKEVsbGlvdCkKKyAqCQlQdXQgIm1lc3NhZ2UgbGV2ZWwiIHRhZ3MgaW4gZXZlcnkgInByaW50ayIgc3RhdGVtZW50CisgKgkJCisgKgkJdjAuOS43IDEzdGggSnVuZSAxOTk2IChsYWlrKQorICoJCUFkZGVkIHN1cHBvcnQgZm9yIHRoZSAvcHJvYyBmcworICoKKyAqICAgICAgICAgICAgICB2MC45LjggSnVseSAxOTk2IChNZW1hKQorICogICAgICAgICAgICAgIEFkZGVkIHBhY2tldCBsb2dnaW5nCisgKgorICogICAgICAgICAgICAgIHYxLjAgTm92ZW1iZXIgMTk5NiAoU0MpCisgKiAgICAgICAgICAgICAgRml4ZWQgKHNldmVyZSkgbWVtb3J5IGxlYWtzIGluIHRoZSAvcHJvYyBmcyBjb2RlCisgKiAgICAgICAgICAgICAgRml4ZWQgcmFjZSBjb25kaXRpb25zIGluIHRoZSBsb2dnaW5nIGNvZGUKKyAqCisgKiAgICAgICAgICAgICAgdjEuMSBKYW51YXJ5IDE5OTcgKFNDKQorICogICAgICAgICAgICAgIERlbGV0ZWQgcGFja2V0IGxvZ2dpbmcgKHVzZSB0Y3BkdW1wIGluc3RlYWQpCisgKiAgICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgTWV0cmljb20gRmlybXdhcmUgdjIwNCBmZWF0dXJlcworICogICAgICAgICAgICAgIChsaWtlIG1lc3NhZ2UgY2hlY2tzdW1zKQorICoKKyAqICAgICAgICAgICAgICB2MS4yIEphbnVhcnkgMTk5NyAoU0MpCisgKiAgICAgICAgICAgICAgUHV0IHBvcnRhYmxlcyBsaXN0IGJhY2sgaW4KKyAqCisgKiAgICAgICAgICAgICAgdjEuMyBKdWx5IDE5OTcgKFNDKQorICogICAgICAgICAgICAgIE1hZGUgU1RSSVAgZHJpdmVyIHNldCB0aGUgcmFkaW8ncyBiYXVkIHJhdGUgYXV0b21hdGljYWxseS4KKyAqICAgICAgICAgICAgICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJpbHkgdG8gbWFudWFsbHkgc2V0IHRoZSByYWRpbydzCisgKiAgICAgICAgICAgICAgcmF0ZSBwZXJtYW5lbnRseSB0byAxMTUyMDAgLS0gdGhlIGRyaXZlciBoYW5kbGVzIHNldHRpbmcKKyAqICAgICAgICAgICAgICB0aGUgcmF0ZSBhdXRvbWF0aWNhbGx5LgorICovCisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBjb25zdCBjaGFyIFN0cmlwVmVyc2lvbltdID0gIjEuM0EtU1RVQVJULkNIRVNISVJFLU1PRFVMQVIiOworI2Vsc2UKK3N0YXRpYyBjb25zdCBjaGFyIFN0cmlwVmVyc2lvbltdID0gIjEuM0EtU1RVQVJULkNIRVNISVJFIjsKKyNlbmRpZgorCisjZGVmaW5lIFRJQ0tMRV9USU1FUlMgMAorI2RlZmluZSBFWFRfQ09VTlRFUlMgMQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBIZWFkZXIgZmlsZXMJCQkJCQkJCSovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyMgaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9zdHJpcC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbFAuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPG5ldC9hcnAuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBVc2VmdWwgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMJCQkJCSovCisKKy8qCisgKiBBIE1ldHJpY29tS2V5IGlkZW50aWZpZXMgdGhlIHByb3RvY29sIGJlaW5nIGNhcnJpZWQgaW5zaWRlIGEgTWV0cmljb20KKyAqIFN0YXJtb2RlIHBhY2tldC4KKyAqLworCit0eXBlZGVmIHVuaW9uIHsKKwlfX3U4IGNbNF07CisJX191MzIgbDsKK30gTWV0cmljb21LZXk7CisKKy8qCisgKiBBbiBJUCBhZGRyZXNzIGNhbiBiZSB2aWV3ZWQgYXMgZm91ciBieXRlcyBpbiBtZW1vcnkgKHdoaWNoIGlzIHdoYXQgaXQgaXMpIG9yIGFzCisgKiBhIHNpbmdsZSAzMi1iaXQgbG9uZyAod2hpY2ggaXMgY29udmVuaWVudCBmb3IgYXNzaWdubWVudCwgZXF1YWxpdHkgdGVzdGluZyBldGMuKQorICovCisKK3R5cGVkZWYgdW5pb24geworCV9fdTggYls0XTsKKwlfX3UzMiBsOworfSBJUGFkZHI7CisKKy8qCisgKiBBIE1ldHJpY29tQWRkcmVzc1N0cmluZyBpcyB1c2VkIHRvIGhvbGQgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YKKyAqIGEgTWV0cmljb20gYWRkcmVzcy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJX191OCBjWzI0XTsKK30gTWV0cmljb21BZGRyZXNzU3RyaW5nOworCisvKiBFbmNhcHN1bGF0aW9uIGNhbiBleHBhbmQgcGFja2V0IG9mIHNpemUgeCB0byA2NS82NHggKyAxCisgKiBTZW50IHBhY2tldCBsb29rcyBsaWtlICI8Q1I+KjxhZGRyZXNzPio8a2V5PjxlbmNhcHMgcGF5bG9hZD48Q1I+IgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAxIDEgICAxLTE4ICAxICA0ICAgICAgICAgPyAgICAgICAgIDEKKyAqIGVnLiAgICAgICAgICAgICAgICAgICAgIDxDUj4qMDAwMC0xMjM0KlNJUDA8ZW5jYXBzIHBheWxvYWQ+PENSPgorICogV2UgYWxsb3cgMzEgYnl0ZXMgZm9yIHRoZSBzdGFycywgdGhlIGtleSwgdGhlIGFkZHJlc3MgYW5kIHRoZSA8Q1I+cworICovCisjZGVmaW5lIFNUUklQX0VOQ0FQX1NJWkUoWCkgKDMyICsgKFgpKjY1TC82NEwpCisKKy8qCisgKiBBIFNUUklQX0hlYWRlciBpcyBuZXZlciByZWFsbHkgc2VudCBvdmVyIHRoZSByYWRpbywgYnV0IG1ha2luZyBhIGR1bW15CisgKiBoZWFkZXIgZm9yIGludGVybmFsIHVzZSB3aXRoaW4gdGhlIGtlcm5lbCB0aGF0IGxvb2tzIGxpa2UgYW4gRXRoZXJuZXQKKyAqIGhlYWRlciBtYWtlcyBjZXJ0YWluIG90aGVyIHNvZnR3YXJlIGhhcHBpZXIuIEZvciBleGFtcGxlLCB0Y3BkdW1wCisgKiBhbHJlYWR5IHVuZGVyc3RhbmRzIEV0aGVybmV0IGhlYWRlcnMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCU1ldHJpY29tQWRkcmVzcyBkc3RfYWRkcjsJLyogRGVzdGluYXRpb24gYWRkcmVzcywgZS5nLiAiMDAwMC0xMjM0IiAgICovCisJTWV0cmljb21BZGRyZXNzIHNyY19hZGRyOwkvKiBTb3VyY2UgYWRkcmVzcywgZS5nLiAiMDAwMC01Njc4IiAgICAgICAgKi8KKwl1bnNpZ25lZCBzaG9ydCBwcm90b2NvbDsJLyogVGhlIHByb3RvY29sIHR5cGUsIHVzaW5nIEV0aGVybmV0IGNvZGVzICovCit9IFNUUklQX0hlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIgY1s2MF07Cit9IE1ldHJpY29tTm9kZTsKKworI2RlZmluZSBOT0RFX1RBQkxFX1NJWkUgMzIKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lc3RhbXA7CisJaW50IG51bV9ub2RlczsKKwlNZXRyaWNvbU5vZGUgbm9kZVtOT0RFX1RBQkxFX1NJWkVdOworfSBNZXRyaWNvbU5vZGVUYWJsZTsKKworZW51bSB7IEZBTFNFID0gMCwgVFJVRSA9IDEgfTsKKworLyoKKyAqIEhvbGRzIHRoZSByYWRpbydzIGZpcm13YXJlIHZlcnNpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyIGNbNTBdOworfSBGaXJtd2FyZVZlcnNpb247CisKKy8qCisgKiBIb2xkcyB0aGUgcmFkaW8ncyBzZXJpYWwgbnVtYmVyLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJY2hhciBjWzE4XTsKK30gU2VyaWFsTnVtYmVyOworCisvKgorICogSG9sZHMgdGhlIHJhZGlvJ3MgYmF0dGVyeSB2b2x0YWdlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJY2hhciBjWzExXTsKK30gQmF0dGVyeVZvbHRhZ2U7CisKK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyIGNbOF07Cit9IGNoYXI4OworCitlbnVtIHsKKwlOb1N0cnVjdHVyZSA9IDAsCS8qIFJlYWxseSBvbGQgZmlybXdhcmUgKi8KKwlTdHJ1Y3R1cmVkTWVzc2FnZXMgPSAxLAkvKiBQYXJzYWJsZSBBVCByZXNwb25zZSBtc2dzICovCisJQ2hlY2tzdW1tZWRNZXNzYWdlcyA9IDIJLyogUGFyc2FibGUgQVQgcmVzcG9uc2UgbXNncyB3aXRoIGNoZWNrc3VtcyAqLworfSBGaXJtd2FyZUxldmVsOworCitzdHJ1Y3Qgc3RyaXAgeworCWludCBtYWdpYzsKKwkvKgorCSAqIFRoZXNlIGFyZSBwb2ludGVycyB0byB0aGUgbWFsbG9jKCllZCBmcmFtZSBidWZmZXJzLgorCSAqLworCisJdW5zaWduZWQgY2hhciAqcnhfYnVmZjsJLyogYnVmZmVyIGZvciByZWNlaXZlZCBJUCBwYWNrZXQgKi8KKwl1bnNpZ25lZCBjaGFyICpzeF9idWZmOwkvKiBidWZmZXIgZm9yIHJlY2VpdmVkIHNlcmlhbCBkYXRhICovCisJaW50IHN4X2NvdW50OwkJLyogcmVjZWl2ZWQgc2VyaWFsIGRhdGEgY291bnRlciAqLworCWludCBzeF9zaXplOwkJLyogU2VyaWFsIGJ1ZmZlciBzaXplICAgICAgICAgICAqLworCXVuc2lnbmVkIGNoYXIgKnR4X2J1ZmY7CS8qIHRyYW5zbWl0dGVyIGJ1ZmZlciAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyICp0eF9oZWFkOwkvKiBwb2ludGVyIHRvIG5leHQgYnl0ZSB0byBYTUlUICovCisJaW50IHR4X2xlZnQ7CQkvKiBieXRlcyBsZWZ0IGluIFhNSVQgcXVldWUgICAgICovCisJaW50IHR4X3NpemU7CQkvKiBTZXJpYWwgYnVmZmVyIHNpemUgICAgICAgICAgICovCisKKwkvKgorCSAqIFNUUklQIGludGVyZmFjZSBzdGF0aXN0aWNzLgorCSAqLworCisJdW5zaWduZWQgbG9uZyByeF9wYWNrZXRzOwkvKiBpbmJvdW5kIGZyYW1lcyBjb3VudGVyICAgICAgICovCisJdW5zaWduZWQgbG9uZyB0eF9wYWNrZXRzOwkvKiBvdXRib3VuZCBmcmFtZXMgY291bnRlciAgICAgICovCisJdW5zaWduZWQgbG9uZyByeF9lcnJvcnM7CS8qIFBhcml0eSwgZXRjLiBlcnJvcnMgICAgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIHR4X2Vycm9yczsJLyogUGxhbm5lZCBzdHVmZiAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgcnhfZHJvcHBlZDsJLyogTm8gbWVtb3J5IGZvciBza2IgICAgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgdHhfZHJvcHBlZDsJLyogV2hlbiBNVFUgY2hhbmdlICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgcnhfb3Zlcl9lcnJvcnM7CS8qIEZyYW1lIGJpZ2dlciB0aGVuIFNUUklQIGJ1Zi4gKi8KKworCXVuc2lnbmVkIGxvbmcgcHBzX3RpbWVyOwkvKiBUaW1lciB0byBkZXRlcm1pbmUgcHBzICAgICAgICovCisJdW5zaWduZWQgbG9uZyByeF9wcHNfY291bnQ7CS8qIENvdW50ZXIgdG8gZGV0ZXJtaW5lIHBwcyAgICAgKi8KKwl1bnNpZ25lZCBsb25nIHR4X3Bwc19jb3VudDsJLyogQ291bnRlciB0byBkZXRlcm1pbmUgcHBzICAgICAqLworCXVuc2lnbmVkIGxvbmcgc3hfcHBzX2NvdW50OwkvKiBDb3VudGVyIHRvIGRldGVybWluZSBwcHMgICAgICovCisJdW5zaWduZWQgbG9uZyByeF9hdmVyYWdlX3BwczsJLyogcnggcGFja2V0cyBwZXIgc2Vjb25kICogOCAgICAqLworCXVuc2lnbmVkIGxvbmcgdHhfYXZlcmFnZV9wcHM7CS8qIHR4IHBhY2tldHMgcGVyIHNlY29uZCAqIDggICAgKi8KKwl1bnNpZ25lZCBsb25nIHN4X2F2ZXJhZ2VfcHBzOwkvKiBzZW50IHBhY2tldHMgcGVyIHNlY29uZCAqIDggICovCisKKyNpZmRlZiBFWFRfQ09VTlRFUlMKKwl1bnNpZ25lZCBsb25nIHJ4X2J5dGVzOwkJLyogdG90YWwgcmVjZWl2ZWQgYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nIHR4X2J5dGVzOwkJLyogdG90YWwgcmVjZWl2ZWQgYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X3JieXRlczsJLyogYnl0ZXMgdGhydSByYWRpbyBpL2YgKi8KKwl1bnNpZ25lZCBsb25nIHR4X3JieXRlczsJLyogYnl0ZXMgdGhydSByYWRpbyBpL2YgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X3NieXRlczsJLyogdG90IGJ5dGVzIHRocnUgc2VyaWFsIGkvZiAqLworCXVuc2lnbmVkIGxvbmcgdHhfc2J5dGVzOwkvKiB0b3QgYnl0ZXMgdGhydSBzZXJpYWwgaS9mICovCisJdW5zaWduZWQgbG9uZyByeF9lYnl0ZXM7CS8qIHRvdCBzdGF0L2VyciBieXRlcyAqLworCXVuc2lnbmVkIGxvbmcgdHhfZWJ5dGVzOwkvKiB0b3Qgc3RhdC9lcnIgYnl0ZXMgKi8KKyNlbmRpZgorCisJLyoKKwkgKiBJbnRlcm5hbCB2YXJpYWJsZXMuCisJICovCisKKwlzdHJ1Y3QgbGlzdF9oZWFkICBsaXN0OwkJLyogTGlua2VkIGxpc3Qgb2YgZGV2aWNlcyAqLworCisJaW50IGRpc2NhcmQ7CQkJLyogU2V0IGlmIHNlcmlhbCBlcnJvciAgICAgICAgICAqLworCWludCB3b3JraW5nOwkJCS8qIElzIHJhZGlvIHdvcmtpbmcgY29ycmVjdGx5PyAgKi8KKwlpbnQgZmlybXdhcmVfbGV2ZWw7CQkvKiBNZXNzYWdlIHN0cnVjdHVyaW5nIGxldmVsICAgICovCisJaW50IG5leHRfY29tbWFuZDsJCS8qIE5leHQgcGVyaW9kaWMgY29tbWFuZCAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgdXNlcl9iYXVkOwkJLyogVGhlIHVzZXItc2VsZWN0ZWQgYmF1ZCByYXRlICAqLworCWludCBtdHU7CQkJLyogT3VyIG10dSAodG8gc3BvdCBjaGFuZ2VzISkgICAqLworCWxvbmcgd2F0Y2hkb2dfZG9wcm9iZTsJCS8qIE5leHQgdGltZSB0byB0ZXN0IHRoZSByYWRpbyAgKi8KKwlsb25nIHdhdGNoZG9nX2RvcmVzZXQ7CQkvKiBUaW1lIHRvIGRvIG5leHQgcmVzZXQgICAgICAgICovCisJbG9uZyBncmF0dWl0b3VzX2FycDsJCS8qIFRpbWUgdG8gc2VuZCBuZXh0IEFSUCByZWZyZXNoICovCisJbG9uZyBhcnBfaW50ZXJ2YWw7CQkvKiBOZXh0IEFSUCBpbnRlcnZhbCAgICAgICAgICAgICovCisJc3RydWN0IHRpbWVyX2xpc3QgaWRsZV90aW1lcjsJLyogRm9yIHBlcmlvZGljIHdha2V1cCBjYWxscyAgICAqLworCU1ldHJpY29tQWRkcmVzcyB0cnVlX2Rldl9hZGRyOwkvKiBUcnVlIGFkZHJlc3Mgb2YgcmFkaW8gICAgICAgICovCisJaW50IG1hbnVhbF9kZXZfYWRkcjsJCS8qIEhhY2s6IFNlZSBub3RlIGJlbG93ICAgICAgICAgKi8KKworCUZpcm13YXJlVmVyc2lvbiBmaXJtd2FyZV92ZXJzaW9uOwkvKiBUaGUgcmFkaW8ncyBmaXJtd2FyZSB2ZXJzaW9uICovCisJU2VyaWFsTnVtYmVyIHNlcmlhbF9udW1iZXI7CS8qIFRoZSByYWRpbydzIHNlcmlhbCBudW1iZXIgICAgKi8KKwlCYXR0ZXJ5Vm9sdGFnZSBiYXR0ZXJ5X3ZvbHRhZ2U7CS8qIFRoZSByYWRpbydzIGJhdHRlcnkgdm9sdGFnZSAgKi8KKworCS8qCisJICogT3RoZXIgdXNlZnVsIHN0cnVjdHVyZXMuCisJICovCisKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwkJLyogcHRyIHRvIFRUWSBzdHJ1Y3R1cmUgICAgICAgICAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CQkvKiBPdXIgZGV2aWNlIHN0cnVjdHVyZSAgICAgICAgICovCisKKwkvKgorCSAqIE5laWdoYm91ciByYWRpbyByZWNvcmRzCisJICovCisKKwlNZXRyaWNvbU5vZGVUYWJsZSBwb3J0YWJsZXM7CisJTWV0cmljb21Ob2RlVGFibGUgcG9sZXRvcHM7Cit9OworCisvKgorICogTm90ZTogbWFudWFsX2Rldl9hZGRyIGhhY2sKKyAqIAorICogSXQgaXMgbm90IHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgaGFyZHdhcmUgYWRkcmVzcyBvZiBhIE1ldHJpY29tIHJhZGlvLAorICogb3IgdG8gc2VuZCBwYWNrZXRzIHdpdGggYSB1c2VyLXNwZWNpZmllZCBoYXJkd2FyZSBzb3VyY2UgYWRkcmVzcywgdGh1cworICogdHJ5aW5nIHRvIG1hbnVhbGx5IHNldCBhIGhhcmR3YXJlIHNvdXJjZSBhZGRyZXNzIGlzIGEgcXVlc3Rpb25hYmxlCisgKiB0aGluZyB0byBkby4gIEhvd2V2ZXIsIGlmIHRoZSB1c2VyICpkb2VzKiBtYW51YWxseSBzZXQgdGhlIGhhcmR3YXJlCisgKiBzb3VyY2UgYWRkcmVzcyBvZiBhIFNUUklQIGludGVyZmFjZSwgdGhlbiB0aGUga2VybmVsIHdpbGwgYmVsaWV2ZSBpdCwKKyAqIGFuZCB1c2UgaXQgaW4gY2VydGFpbiBwbGFjZXMuIEZvciBleGFtcGxlLCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBsaXN0ZWQKKyAqIGJ5IGlmY29uZmlnIHdpbGwgYmUgdGhlIG1hbnVhbCBhZGRyZXNzLCBub3QgdGhlIHRydWUgb25lLgorICogKEJvdGggYWRkcmVzc2VzIGFyZSBsaXN0ZWQgaW4gL3Byb2MvbmV0L3N0cmlwLikKKyAqIEFsc28sIEFSUCBwYWNrZXRzIHdpbGwgYmUgc2VudCBvdXQgZ2l2aW5nIHRoZSB1c2VyLXNwZWNpZmllZCBhZGRyZXNzIGFzCisgKiB0aGUgc291cmNlIGFkZHJlc3MsIG5vdCB0aGUgcmVhbCBhZGRyZXNzLiBUaGlzIGlzIGRhbmdlcm91cywgYmVjYXVzZQorICogaXQgbWVhbnMgeW91IHdvbid0IHJlY2VpdmUgYW55IHJlcGxpZXMgLS0gdGhlIEFSUCByZXBsaWVzIHdpbGwgZ28gdG8KKyAqIHRoZSBzcGVjaWZpZWQgYWRkcmVzcywgd2hpY2ggd2lsbCBiZSBzb21lIG90aGVyIHJhZGlvLiBUaGUgY2FzZSB3aGVyZQorICogdGhpcyBpcyB1c2VmdWwgaXMgd2hlbiB0aGF0IG90aGVyIHJhZGlvIGlzIGFsc28gY29ubmVjdGVkIHRvIHRoZSBzYW1lCisgKiBtYWNoaW5lLiBUaGlzIGFsbG93cyB5b3UgdG8gY29ubmVjdCBhIHBhaXIgb2YgcmFkaW9zIHRvIG9uZSBtYWNoaW5lLAorICogYW5kIHRvIHVzZSBvbmUgZXhjbHVzaXZlbHkgZm9yIGluYm91bmQgdHJhZmZpYywgYW5kIHRoZSBvdGhlcgorICogZXhjbHVzaXZlbHkgZm9yIG91dGJvdW5kIHRyYWZmaWMuIFByZXR0eSBuZWF0LCBodWg/CisgKiAKKyAqIEhlcmUncyB0aGUgZnVsbCBwcm9jZWR1cmUgdG8gc2V0IHRoaXMgdXA6CisgKiAKKyAqIDEuICJzbGF0dGFjaCIgdHdvIGludGVyZmFjZXMsIGUuZy4gc3QwIGZvciBvdXRnb2luZyBwYWNrZXRzLAorICogICAgYW5kIHN0MSBmb3IgaW5jb21pbmcgcGFja2V0cworICogCisgKiAyLiAiaWZjb25maWciIHN0MCAob3V0Ym91bmQgcmFkaW8pIHRvIGhhdmUgdGhlIGhhcmR3YXJlIGFkZHJlc3MKKyAqICAgIHdoaWNoIGlzIHRoZSByZWFsIGhhcmR3YXJlIGFkZHJlc3Mgb2Ygc3QxIChpbmJvdW5kIHJhZGlvKS4KKyAqICAgIE5vdyB3aGVuIGl0IHNlbmRzIG91dCBwYWNrZXRzLCBpdCB3aWxsIG1hc3F1ZXJhZGUgYXMgc3QxLCBhbmQKKyAqICAgIHJlcGxpZXMgd2lsbCBiZSBzZW50IHRvIHRoYXQgcmFkaW8sIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB3ZSB3YW50LgorICogCisgKiAzLiBTZXQgdGhlIHJvdXRlIHRhYmxlIGVudHJ5ICgicm91dGUgYWRkIGRlZmF1bHQgLi4uIiBvcgorICogICAgInJvdXRlIGFkZCAtbmV0IC4uLiIsIGFzIGFwcHJvcHJpYXRlKSB0byBzZW5kIHBhY2tldHMgdmlhIHRoZSBzdDAKKyAqICAgIGludGVyZmFjZSAob3V0Ym91bmQgcmFkaW8pLiBEbyBub3QgYWRkIGFueSByb3V0ZSB3aGljaCBzZW5kcyBwYWNrZXRzCisgKiAgICBvdXQgdmlhIHRoZSBzdDEgaW50ZXJmYWNlIC0tIHRoYXQgcmFkaW8gaXMgZm9yIGluYm91bmQgdHJhZmZpYyBvbmx5LgorICogCisgKiA0LiAiaWZjb25maWciIHN0MSAoaW5ib3VuZCByYWRpbykgdG8gaGF2ZSBoYXJkd2FyZSBhZGRyZXNzIHplcm8uCisgKiAgICBUaGlzIHRlbGxzIHRoZSBTVFJJUCBkcml2ZXIgdG8gInNodXQgZG93biIgdGhhdCBpbnRlcmZhY2UgYW5kIG5vdAorICogICAgc2VuZCBhbnkgcGFja2V0cyB0aHJvdWdoIGl0LiBJbiBwYXJ0aWN1bGFyLCBpdCBzdG9wcyBzZW5kaW5nIHRoZQorICogICAgcGVyaW9kaWMgZ3JhdHVpdG91cyBBUlAgcGFja2V0cyB0aGF0IGEgU1RSSVAgaW50ZXJmYWNlIG5vcm1hbGx5IHNlbmRzLgorICogICAgQWxzbywgd2hlbiBwYWNrZXRzIGFycml2ZSBvbiB0aGF0IGludGVyZmFjZSwgaXQgd2lsbCBzZWFyY2ggdGhlCisgKiAgICBpbnRlcmZhY2UgbGlzdCB0byBzZWUgaWYgdGhlcmUgaXMgYW5vdGhlciBpbnRlcmZhY2Ugd2hvJ3MgbWFudWFsCisgKiAgICBoYXJkd2FyZSBhZGRyZXNzIG1hdGNoZXMgaXRzIG93biByZWFsIGFkZHJlc3MgKGkuZS4gc3QwIGluIHRoaXMKKyAqICAgIGV4YW1wbGUpIGFuZCBpZiBzbyBpdCB3aWxsIHRyYW5zZmVyIG93bmVyc2hpcCBvZiB0aGUgc2tidWZmIHRvCisgKiAgICB0aGF0IGludGVyZmFjZSwgc28gdGhhdCBpdCBsb29rcyB0byB0aGUga2VybmVsIGFzIGlmIHRoZSBwYWNrZXQKKyAqICAgIGFycml2ZWQgb24gdGhhdCBpbnRlcmZhY2UuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2hlbiB0aGUKKyAqICAgIGtlcm5lbCBzZW5kcyBhbiBBUlAgcGFja2V0IG9uIHN0MCwgaXQgZXhwZWN0cyB0byBnZXQgYSByZXBseSBvbgorICogICAgc3QwLCBhbmQgaWYgaXQgc2VlcyB0aGUgcmVwbHkgY29tZSBmcm9tIHN0MSB0aGVuIGl0IHdpbGwgaWdub3JlCisgKiAgICBpdCAodG8gYmUgYWNjdXJhdGUsIGl0IHB1dHMgdGhlIGVudHJ5IGluIHRoZSBBUlAgdGFibGUsIGJ1dAorICogICAgbGFiZWxsZWQgaW4gc3VjaCBhIHdheSB0aGF0IHN0MCBjYW4ndCB1c2UgaXQpLgorICogCisgKiBUaGFua3MgdG8gUGV0cm9zIE1hbmlhdGlzIGZvciBjb21pbmcgdXAgd2l0aCB0aGUgaWRlYSBvZiBzcGxpdHRpbmcKKyAqIGluYm91bmQgYW5kIG91dGJvdW5kIHRyYWZmaWMgYmV0d2VlbiB0d28gaW50ZXJmYWNlcywgd2hpY2ggdHVybmVkCisgKiBvdXQgdG8gYmUgcmVhbGx5IGVhc3kgdG8gaW1wbGVtZW50LCBldmVuIGlmIGl0IGlzIGEgYml0IG9mIGEgaGFjay4KKyAqIAorICogSGF2aW5nIHNldCBhIG1hbnVhbCBhZGRyZXNzIG9uIGFuIGludGVyZmFjZSwgeW91IGNhbiByZXN0b3JlIGl0CisgKiB0byBhdXRvbWF0aWMgb3BlcmF0aW9uICh3aGVyZSB0aGUgYWRkcmVzcyBpcyBhdXRvbWF0aWNhbGx5IGtlcHQKKyAqIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVhbCBhZGRyZXNzIG9mIHRoZSByYWRpbykgYnkgc2V0dGluZyBhIG1hbnVhbAorICogYWRkcmVzcyBvZiBhbGwgb25lcywgZS5nLiAiaWZjb25maWcgc3QwIGh3IHN0cmlwIEZGRkZGRkZGRkZGRiIKKyAqIFRoaXMgJ3R1cm5zIG9mZicgbWFudWFsIG92ZXJyaWRlIG1vZGUgZm9yIHRoZSBkZXZpY2UgYWRkcmVzcy4KKyAqIAorICogTm90ZTogVGhlIElFRUUgODAyIGhlYWRlcnMgcmVwb3J0ZWQgaW4gdGNwZHVtcCB3aWxsIHNob3cgdGhlICpyZWFsKgorICogcmFkaW8gYWRkcmVzc2VzIHRoZSBwYWNrZXRzIHdlcmUgc2VudCBhbmQgcmVjZWl2ZWQgZnJvbSwgc28gdGhhdCB5b3UKKyAqIGNhbiBzZWUgd2hhdCBpcyByZWFsbHkgZ29pbmcgb24gd2l0aCBwYWNrZXRzLCBhbmQgd2hpY2ggaW50ZXJmYWNlcworICogdGhleSBhcmUgcmVhbGx5IGdvaW5nIHRocm91Z2guCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ29uc3RhbnRzCQkJCQkJCQkqLworCisvKgorICogQ29tbWFuZFN0cmluZzEgd29ya3Mgb24gYWxsIHJhZGlvcworICogT3RoZXIgQ29tbWFuZFN0cmluZ3MgYXJlIG9ubHkgdXNlZCB3aXRoIGZpcm13YXJlIHRoYXQgcHJvdmlkZXMgc3RydWN0dXJlZCByZXNwb25zZXMuCisgKiAKKyAqIGF0czMxOT0xIEVuYWJsZXMgSW5mbyBtZXNzYWdlIGZvciBub2RlIGFkZGl0aW9ucyBhbmQgZGVsZXRpb25zCisgKiBhdHMzMTk9MiBFbmFibGVzIEluZm8gbWVzc2FnZSBmb3IgYSBuZXcgYmVzdCBub2RlCisgKiBhdHMzMTk9NCBFbmFibGVzIGNoZWNrc3VtcworICogYXRzMzE5PTggRW5hYmxlcyBBQ0sgbWVzc2FnZXMKKyAqLworCitzdGF0aWMgY29uc3QgaW50IE1heENvbW1hbmRTdHJpbmdMZW5ndGggPSAzMjsKK3N0YXRpYyBjb25zdCBpbnQgQ29tcGF0aWJpbGl0eUNvbW1hbmQgPSAxOworCitzdGF0aWMgY29uc3QgY2hhciBDb21tYW5kU3RyaW5nMFtdID0gIiomQ09NTUFORCpBVFMzMTk9NyI7CS8qIFR1cm4gb24gY2hlY2tzdW1zICYgaW5mbyBtZXNzYWdlcyAqLworc3RhdGljIGNvbnN0IGNoYXIgQ29tbWFuZFN0cmluZzFbXSA9ICIqJkNPTU1BTkQqQVRTMzA1PyI7CS8qIFF1ZXJ5IHJhZGlvIG5hbWUgKi8KK3N0YXRpYyBjb25zdCBjaGFyIENvbW1hbmRTdHJpbmcyW10gPSAiKiZDT01NQU5EKkFUUzMyNT8iOwkvKiBRdWVyeSBiYXR0ZXJ5IHZvbHRhZ2UgKi8KK3N0YXRpYyBjb25zdCBjaGFyIENvbW1hbmRTdHJpbmczW10gPSAiKiZDT01NQU5EKkFUUzMwMD8iOwkvKiBRdWVyeSB2ZXJzaW9uIGluZm9ybWF0aW9uICovCitzdGF0aWMgY29uc3QgY2hhciBDb21tYW5kU3RyaW5nNFtdID0gIiomQ09NTUFORCpBVFMzMTE/IjsJLyogUXVlcnkgcG9sZXRvcCBsaXN0ICovCitzdGF0aWMgY29uc3QgY2hhciBDb21tYW5kU3RyaW5nNVtdID0gIiomQ09NTUFORCpBVH5MQSI7CQkvKiBRdWVyeSBwb3J0YWJsZXMgbGlzdCAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKnN0cmluZzsKKwlsb25nIGxlbmd0aDsKK30gU3RyaW5nRGVzY3JpcHRvcjsKKworc3RhdGljIGNvbnN0IFN0cmluZ0Rlc2NyaXB0b3IgQ29tbWFuZFN0cmluZ1tdID0geworCXtDb21tYW5kU3RyaW5nMCwgc2l6ZW9mKENvbW1hbmRTdHJpbmcwKSAtIDF9LAorCXtDb21tYW5kU3RyaW5nMSwgc2l6ZW9mKENvbW1hbmRTdHJpbmcxKSAtIDF9LAorCXtDb21tYW5kU3RyaW5nMiwgc2l6ZW9mKENvbW1hbmRTdHJpbmcyKSAtIDF9LAorCXtDb21tYW5kU3RyaW5nMywgc2l6ZW9mKENvbW1hbmRTdHJpbmczKSAtIDF9LAorCXtDb21tYW5kU3RyaW5nNCwgc2l6ZW9mKENvbW1hbmRTdHJpbmc0KSAtIDF9LAorCXtDb21tYW5kU3RyaW5nNSwgc2l6ZW9mKENvbW1hbmRTdHJpbmc1KSAtIDF9Cit9OworCisjZGVmaW5lIEdPVF9BTExfUkFESU9fSU5GTyhTKSAgICAgIFwKKyAgICAoKFMpLT5maXJtd2FyZV92ZXJzaW9uLmNbMF0gJiYgXAorICAgICAoUyktPmJhdHRlcnlfdm9sdGFnZS5jWzBdICAmJiBcCisgICAgIG1lbWNtcCgmKFMpLT50cnVlX2Rldl9hZGRyLCB6ZXJvX2FkZHJlc3MuYywgc2l6ZW9mKHplcm9fYWRkcmVzcykpKQorCitzdGF0aWMgY29uc3QgY2hhciBoZXh0YWJsZVsxNl0gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisKK3N0YXRpYyBjb25zdCBNZXRyaWNvbUFkZHJlc3MgemVyb19hZGRyZXNzOworc3RhdGljIGNvbnN0IE1ldHJpY29tQWRkcmVzcyBicm9hZGNhc3RfYWRkcmVzcyA9CisgICAgeyB7MHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRn0gfTsKKworc3RhdGljIGNvbnN0IE1ldHJpY29tS2V5IFNJUDBLZXkgPSB7ICJTSVAwIiB9Oworc3RhdGljIGNvbnN0IE1ldHJpY29tS2V5IEFSUDBLZXkgPSB7ICJBUlAwIiB9Oworc3RhdGljIGNvbnN0IE1ldHJpY29tS2V5IEFUUl9LZXkgPSB7ICJBVFIgIiB9Oworc3RhdGljIGNvbnN0IE1ldHJpY29tS2V5IEFDS19LZXkgPSB7ICJBQ0tfIiB9Oworc3RhdGljIGNvbnN0IE1ldHJpY29tS2V5IElORl9LZXkgPSB7ICJJTkZfIiB9Oworc3RhdGljIGNvbnN0IE1ldHJpY29tS2V5IEVSUl9LZXkgPSB7ICJFUlJfIiB9OworCitzdGF0aWMgY29uc3QgbG9uZyBNYXhBUlBJbnRlcnZhbCA9IDYwICogSFo7CS8qIE9uZSBtaW51dGUgKi8KKworLyoKKyAqIE1heGltdW0gU3Rhcm1vZGUgcGFja2V0IGxlbmd0aCBpcyAxMTgzIGJ5dGVzLiBBbGxvd2luZyA0IGJ5dGVzIGZvcgorICogcHJvdG9jb2wga2V5LCA0IGJ5dGVzIGZvciBjaGVja3N1bSwgb25lIGJ5dGUgZm9yIENSLCBhbmQgNjUvNjQgZXhwYW5zaW9uCisgKiBmb3IgU1RSSVAgZW5jb2RpbmcsIHRoYXQgdHJhbnNsYXRlcyB0byBhIG1heGltdW0gcGF5bG9hZCBNVFUgb2YgMTE1NS4KKyAqIE5vdGU6IEEgc3RhbmRhcmQgTkZTIDFLIGRhdGEgcGFja2V0IGlzIGEgdG90YWwgb2YgMHg0ODAgKDExNTIpIGJ5dGVzCisgKiBsb25nLCBpbmNsdWRpbmcgSVAgaGVhZGVyLCBVRFAgaGVhZGVyLCBhbmQgTkZTIGhlYWRlci4gU2V0dGluZyB0aGUgU1RSSVAKKyAqIE1UVSB0byAxMTUyIGFsbG93cyB1cyB0byBzZW5kIGRlZmF1bHQgc2l6ZWQgTkZTIHBhY2tldHMgd2l0aG91dCBmcmFnbWVudGF0aW9uLgorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgTUFYX1NFTkRfTVRVID0gMTE1MjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBNQVhfUkVDVl9NVFUgPSAxNTAwOwkvKiBIb3BpbmcgZm9yIEV0aGVybmV0IHNpemVkIHBhY2tldHMgaW4gdGhlIGZ1dHVyZSEgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBERUZBVUxUX1NUUklQX01UVSA9IDExNTI7CitzdGF0aWMgY29uc3QgaW50IFNUUklQX01BR0lDID0gMHg1MzAzOworc3RhdGljIGNvbnN0IGxvbmcgTG9uZ1RpbWUgPSAweDdGRkZGRkZGOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogR2xvYmFsIHZhcmlhYmxlcwkJCQkJCQkqLworCitzdGF0aWMgTElTVF9IRUFEKHN0cmlwX2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhzdHJpcF9sb2NrKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1hY3JvcwkJCQkJCQkJKi8KKworLyogUmV0dXJucyBUUlVFIGlmIHRleHQgVCBiZWdpbnMgd2l0aCBwcmVmaXggUCAqLworI2RlZmluZSBoYXNfcHJlZml4KFQsTCxQKSAoKChMKSA+PSBzaXplb2YoUCktMSkgJiYgIXN0cm5jbXAoKFQpLCAoUCksIHNpemVvZihQKS0xKSkKKworLyogUmV0dXJucyBUUlVFIGlmIHRleHQgVCBvZiBsZW5ndGggTCBpcyBlcXVhbCB0byBzdHJpbmcgUyAqLworI2RlZmluZSB0ZXh0X2VxdWFsKFQsTCxTKSAoKChMKSA9PSBzaXplb2YoUyktMSkgJiYgIXN0cm5jbXAoKFQpLCAoUyksIHNpemVvZihTKS0xKSkKKworI2RlZmluZSBSRUFESEVYKFgpICgoWCk+PScwJyAmJiAoWCk8PSc5JyA/IChYKS0nMCcgOiAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKFgpPj0nYScgJiYgKFgpPD0nZicgPyAoWCktJ2EnKzEwIDogICBcCisgICAgICAgICAgICAgICAgICAgIChYKT49J0EnICYmIChYKTw9J0YnID8gKFgpLSdBJysxMCA6IDAgKQorCisjZGVmaW5lIFJFQURIRVgxNihYKSAoKF9fdTE2KShSRUFESEVYKFgpKSkKKworI2RlZmluZSBSRUFEREVDKFgpICgoWCk+PScwJyAmJiAoWCk8PSc5JyA/IChYKS0nMCcgOiAwKQorCisjZGVmaW5lIEFSUkFZX0VORChYKSAoJigoWClbQVJSQVlfU0laRShYKV0pKQorCisjZGVmaW5lIEpJRkZJRV9UT19TRUMoWCkgKChYKSAvIEhaKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBVdGlsaXR5IHJvdXRpbmVzCQkJCQkJCSovCisKK3N0YXRpYyBpbnQgYXJwX3F1ZXJ5KHVuc2lnbmVkIGNoYXIgKmhhZGRyLCB1MzIgcGFkZHIsCisJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaGJvcl9lbnRyeTsKKworCW5laWdoYm9yX2VudHJ5ID0gbmVpZ2hfbG9va3VwKCZhcnBfdGJsLCAmcGFkZHIsIGRldik7CisKKwlpZiAobmVpZ2hib3JfZW50cnkgIT0gTlVMTCkgeworCQluZWlnaGJvcl9lbnRyeS0+dXNlZCA9IGppZmZpZXM7CisJCWlmIChuZWlnaGJvcl9lbnRyeS0+bnVkX3N0YXRlICYgTlVEX1ZBTElEKSB7CisJCQltZW1jcHkoaGFkZHIsIG5laWdoYm9yX2VudHJ5LT5oYSwgZGV2LT5hZGRyX2xlbik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgRHVtcERhdGEoY2hhciAqbXNnLCBzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sIF9fdTggKiBwdHIsCisJCSAgICAgX191OCAqIGVuZCkKK3sKKwlzdGF0aWMgY29uc3QgaW50IE1BWF9EdW1wRGF0YSA9IDgwOworCV9fdTggcGt0X3RleHRbTUFYX0R1bXBEYXRhXSwgKnAgPSBwa3RfdGV4dDsKKworCSpwKysgPSAnXCInOworCisJd2hpbGUgKHB0ciA8IGVuZCAmJiBwIDwgJnBrdF90ZXh0W01BWF9EdW1wRGF0YSAtIDRdKSB7CisJCWlmICgqcHRyID09ICdcXCcpIHsKKwkJCSpwKysgPSAnXFwnOworCQkJKnArKyA9ICdcXCc7CisJCX0gZWxzZSB7CisJCQlpZiAoKnB0ciA+PSAzMiAmJiAqcHRyIDw9IDEyNikgeworCQkJCSpwKysgPSAqcHRyOworCQkJfSBlbHNlIHsKKwkJCQlzcHJpbnRmKHAsICJcXCUwMlgiLCAqcHRyKTsKKwkJCQlwICs9IDM7CisJCQl9CisJCX0KKwkJcHRyKys7CisJfQorCisJaWYgKHB0ciA9PSBlbmQpCisJCSpwKysgPSAnXCInOworCSpwKysgPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICUtMTNzJXNcbiIsIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgbXNnLCBwa3RfdGV4dCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEJ5dGUgc3R1ZmZpbmcvdW5zdHVmZmluZyByb3V0aW5lcwkJCQkJKi8KKworLyogU3R1ZmZpbmcgc2NoZW1lOgorICogMDAgICAgVW51c2VkIChyZXNlcnZlZCBjaGFyYWN0ZXIpCisgKiAwMS0zRiBSdW4gb2YgMi02NCBkaWZmZXJlbnQgY2hhcmFjdGVycworICogNDAtN0YgUnVuIG9mIDEtNjQgZGlmZmVyZW50IGNoYXJhY3RlcnMgcGx1cyBhIHNpbmdsZSB6ZXJvIGF0IHRoZSBlbmQKKyAqIDgwLUJGIFJ1biBvZiAxLTY0IG9mIHRoZSBzYW1lIGNoYXJhY3RlcgorICogQzAtRkYgUnVuIG9mIDEtNjQgemVyb2VzIChBU0NJSSAwKQorICovCisKK3R5cGVkZWYgZW51bSB7CisJU3R1ZmZfRGlmZiA9IDB4MDAsCisJU3R1ZmZfRGlmZlplcm8gPSAweDQwLAorCVN0dWZmX1NhbWUgPSAweDgwLAorCVN0dWZmX1plcm8gPSAweEMwLAorCVN0dWZmX05vQ29kZSA9IDB4RkYsCS8qIFNwZWNpYWwgY29kZSwgbWVhbmluZyBubyBjb2RlIHNlbGVjdGVkICovCisKKwlTdHVmZl9Db2RlTWFzayA9IDB4QzAsCisJU3R1ZmZfQ291bnRNYXNrID0gMHgzRiwKKwlTdHVmZl9NYXhDb3VudCA9IDB4M0YsCisJU3R1ZmZfTWFnaWMgPSAweDBECS8qIFRoZSB2YWx1ZSB3ZSBhcmUgZWxpbWluYXRpbmcgKi8KK30gU3R1ZmZpbmdDb2RlOworCisvKiBTdHVmZkRhdGEgZW5jb2RlcyB0aGUgZGF0YSBzdGFydGluZyBhdCAic3JjIiBmb3IgImxlbmd0aCIgYnl0ZXMuCisgKiBJdCB3cml0ZXMgaXQgdG8gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5ICJkc3QiICh3aGljaCBtdXN0IGJlIGF0IGxlYXN0CisgKiBhcyBsb25nIGFzIDEgKyA2NS82NCBvZiB0aGUgaW5wdXQgbGVuZ3RoKS4gVGhlIG91dHB1dCBtYXkgYmUgdXAgdG8gMS42JQorICogbGFyZ2VyIHRoYW4gdGhlIGlucHV0IGZvciBwYXRob2xvZ2ljYWwgaW5wdXQsIGJ1dCB3aWxsIHVzdWFsbHkgYmUgc21hbGxlci4KKyAqIFN0dWZmRGF0YSByZXR1cm5zIHRoZSBuZXcgdmFsdWUgb2YgdGhlIGRzdCBwb2ludGVyIGFzIGl0cyByZXN1bHQuCisgKiAiY29kZV9wdHJfcHRyIiBwb2ludHMgdG8gYSAiX191OCAqIiB3aGljaCBpcyB1c2VkIHRvIGhvbGQgZW5jb2Rpbmcgc3RhdGUKKyAqIGJldHdlZW4gY2FsbHMsIGFsbG93aW5nIGFuIGVuY29kZWQgcGFja2V0IHRvIGJlIGluY3JlbWVudGFsbHkgYnVpbHQgdXAKKyAqIGZyb20gc21hbGwgcGFydHMuIE9uIHRoZSBmaXJzdCBjYWxsLCB0aGUgIl9fdTggKiIgcG9pbnRlZCB0byBzaG91bGQgYmUKKyAqIGluaXRpYWxpemVkIHRvIE5VTEw7IGJldHdlZW4gc3Vic2VxdWVudCBjYWxscyB0aGUgY2FsbGluZyByb3V0aW5lIHNob3VsZAorICogbGVhdmUgdGhlIHZhbHVlIGFsb25lIGFuZCBzaW1wbHkgcGFzcyBpdCBiYWNrIHVuY2hhbmdlZCBzbyB0aGF0IHRoZQorICogZW5jb2RlciBjYW4gcmVjb3ZlciBpdHMgY3VycmVudCBzdGF0ZS4KKyAqLworCisjZGVmaW5lIFN0dWZmRGF0YV9GaW5pc2hCbG9jayhYKSBcCisoKmNvZGVfcHRyID0gKFgpIF4gU3R1ZmZfTWFnaWMsIGNvZGUgPSBTdHVmZl9Ob0NvZGUpCisKK3N0YXRpYyBfX3U4ICpTdHVmZkRhdGEoX191OCAqIHNyYywgX191MzIgbGVuZ3RoLCBfX3U4ICogZHN0LAorCQkgICAgICAgX191OCAqKiBjb2RlX3B0cl9wdHIpCit7CisJX191OCAqZW5kID0gc3JjICsgbGVuZ3RoOworCV9fdTggKmNvZGVfcHRyID0gKmNvZGVfcHRyX3B0cjsKKwlfX3U4IGNvZGUgPSBTdHVmZl9Ob0NvZGUsIGNvdW50ID0gMDsKKworCWlmICghbGVuZ3RoKQorCQlyZXR1cm4gKGRzdCk7CisKKwlpZiAoY29kZV9wdHIpIHsKKwkJLyoKKwkJICogUmVjb3ZlciBzdGF0ZSBmcm9tIGxhc3QgY2FsbCwgaWYgYXBwbGljYWJsZQorCQkgKi8KKwkJY29kZSA9ICgqY29kZV9wdHIgXiBTdHVmZl9NYWdpYykgJiBTdHVmZl9Db2RlTWFzazsKKwkJY291bnQgPSAoKmNvZGVfcHRyIF4gU3R1ZmZfTWFnaWMpICYgU3R1ZmZfQ291bnRNYXNrOworCX0KKworCXdoaWxlIChzcmMgPCBlbmQpIHsKKwkJc3dpdGNoIChjb2RlKSB7CisJCQkvKiBTdHVmZl9Ob0NvZGU6IElmIG5vIGN1cnJlbnQgY29kZSwgc2VsZWN0IG9uZSAqLworCQljYXNlIFN0dWZmX05vQ29kZToKKwkJCS8qIFJlY29yZCB3aGVyZSB3ZSdyZSBnb2luZyB0byBwdXQgdGhpcyBjb2RlICovCisJCQljb2RlX3B0ciA9IGRzdCsrOworCQkJY291bnQgPSAwOwkvKiBSZXNldCB0aGUgY291bnQgKHplcm8gbWVhbnMgb25lIGluc3RhbmNlKSAqLworCQkJLyogVGVudGF0aXZlbHkgc3RhcnQgYSBuZXcgYmxvY2sgKi8KKwkJCWlmICgqc3JjID09IDApIHsKKwkJCQljb2RlID0gU3R1ZmZfWmVybzsKKwkJCQlzcmMrKzsKKwkJCX0gZWxzZSB7CisJCQkJY29kZSA9IFN0dWZmX1NhbWU7CisJCQkJKmRzdCsrID0gKnNyYysrIF4gU3R1ZmZfTWFnaWM7CisJCQl9CisJCQkvKiBOb3RlOiBXZSBvcHRpbWlzdGljYWxseSBhc3N1bWUgcnVuIG9mIHNhbWUgLS0gKi8KKwkJCS8qIHdoaWNoIHdpbGwgYmUgZml4ZWQgbGF0ZXIgaW4gU3R1ZmZfU2FtZSAqLworCQkJLyogaWYgaXQgdHVybnMgb3V0IG5vdCB0byBiZSB0cnVlLiAqLworCQkJYnJlYWs7CisKKwkJCS8qIFN0dWZmX1plcm86IFdlIGFscmVhZHkgaGF2ZSBhdCBsZWFzdCBvbmUgemVybyBlbmNvZGVkICovCisJCWNhc2UgU3R1ZmZfWmVybzoKKwkJCS8qIElmIGFub3RoZXIgemVybywgY291bnQgaXQsIGVsc2UgZmluaXNoIHRoaXMgY29kZSBibG9jayAqLworCQkJaWYgKCpzcmMgPT0gMCkgeworCQkJCWNvdW50Kys7CisJCQkJc3JjKys7CisJCQl9IGVsc2UgeworCQkJCVN0dWZmRGF0YV9GaW5pc2hCbG9jayhTdHVmZl9aZXJvICsgY291bnQpOworCQkJfQorCQkJYnJlYWs7CisKKwkJCS8qIFN0dWZmX1NhbWU6IFdlIGFscmVhZHkgaGF2ZSBhdCBsZWFzdCBvbmUgYnl0ZSBlbmNvZGVkICovCisJCWNhc2UgU3R1ZmZfU2FtZToKKwkJCS8qIElmIGFub3RoZXIgb25lIHRoZSBzYW1lLCBjb3VudCBpdCAqLworCQkJaWYgKCgqc3JjIF4gU3R1ZmZfTWFnaWMpID09IGNvZGVfcHRyWzFdKSB7CisJCQkJY291bnQrKzsKKwkJCQlzcmMrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIGVsc2UsIHRoaXMgYnl0ZSBkb2VzIG5vdCBtYXRjaCB0aGlzIGJsb2NrLiAqLworCQkJLyogSWYgd2UgYWxyZWFkeSBoYXZlIHR3byBvciBtb3JlIGJ5dGVzIGVuY29kZWQsIGZpbmlzaCB0aGlzIGNvZGUgYmxvY2sgKi8KKwkJCWlmIChjb3VudCkgeworCQkJCVN0dWZmRGF0YV9GaW5pc2hCbG9jayhTdHVmZl9TYW1lICsgY291bnQpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZWxzZSwgd2Ugb25seSBoYXZlIG9uZSBzbyBmYXIsIHNvIHN3aXRjaCB0byBTdHVmZl9EaWZmIGNvZGUgKi8KKwkJCWNvZGUgPSBTdHVmZl9EaWZmOworCQkJLyogYW5kIGZhbGwgdGhyb3VnaCB0byBTdHVmZl9EaWZmIGNhc2UgYmVsb3cKKwkJCSAqIE5vdGUgY3VubmluZyBjbGV2ZXJuZXNzIGhlcmU6IGNhc2UgU3R1ZmZfRGlmZiBjb21wYXJlcyAKKwkJCSAqIHRoZSBjdXJyZW50IGNoYXJhY3RlciB3aXRoIHRoZSBwcmV2aW91cyB0d28gdG8gc2VlIGlmIGl0CisJCQkgKiBoYXMgYSBydW4gb2YgdGhyZWUgdGhlIHNhbWUuIFdvbid0IHRoaXMgYmUgYW4gZXJyb3IgaWYKKwkJCSAqIHRoZXJlIGFyZW4ndCB0d28gcHJldmlvdXMgY2hhcmFjdGVycyBzdG9yZWQgdG8gY29tcGFyZSB3aXRoPworCQkJICogTm8uIEJlY2F1c2Ugd2Uga25vdyB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgKm5vdCogdGhlIHNhbWUKKwkJCSAqIGFzIHRoZSBwcmV2aW91cyBvbmUsIHRoZSBmaXJzdCB0ZXN0IGJlbG93IHdpbGwgbmVjZXNzYXJpbHkKKwkJCSAqIGZhaWwgYW5kIHRoZSBzZW5kIGhhbGYgb2YgdGhlICJpZiIgd29uJ3QgYmUgZXhlY3V0ZWQuCisJCQkgKi8KKworCQkJLyogU3R1ZmZfRGlmZjogV2UgaGF2ZSBhdCBsZWFzdCB0d28gKmRpZmZlcmVudCogYnl0ZXMgZW5jb2RlZCAqLworCQljYXNlIFN0dWZmX0RpZmY6CisJCQkvKiBJZiB0aGlzIGlzIGEgemVybywgbXVzdCBlbmNvZGUgYSBTdHVmZl9EaWZmWmVybywgYW5kIGJlZ2luIGEgbmV3IGJsb2NrICovCisJCQlpZiAoKnNyYyA9PSAwKSB7CisJCQkJU3R1ZmZEYXRhX0ZpbmlzaEJsb2NrKFN0dWZmX0RpZmZaZXJvICsKKwkJCQkJCSAgICAgIGNvdW50KTsKKwkJCX0KKwkJCS8qIGVsc2UsIGlmIHdlIGhhdmUgdGhyZWUgaW4gYSByb3csIGl0IGlzIHdvcnRoIHN0YXJ0aW5nIGEgU3R1ZmZfU2FtZSBibG9jayAqLworCQkJZWxzZSBpZiAoKCpzcmMgXiBTdHVmZl9NYWdpYykgPT0gZHN0Wy0xXQorCQkJCSAmJiBkc3RbLTFdID09IGRzdFstMl0pIHsKKwkJCQkvKiBCYWNrIG9mZiB0aGUgbGFzdCB0d28gY2hhcmFjdGVycyB3ZSBlbmNvZGVkICovCisJCQkJY29kZSArPSBjb3VudCAtIDI7CisJCQkJLyogTm90ZTogIlN0dWZmX0RpZmYgKyAwIiBpcyBhbiBpbGxlZ2FsIGNvZGUgKi8KKwkJCQlpZiAoY29kZSA9PSBTdHVmZl9EaWZmICsgMCkgeworCQkJCQljb2RlID0gU3R1ZmZfU2FtZSArIDA7CisJCQkJfQorCQkJCVN0dWZmRGF0YV9GaW5pc2hCbG9jayhjb2RlKTsKKwkJCQljb2RlX3B0ciA9IGRzdCAtIDI7CisJCQkJLyogZHN0Wy0xXSBhbHJlYWR5IGhvbGRzIHRoZSBjb3JyZWN0IHZhbHVlICovCisJCQkJY291bnQgPSAyOwkvKiAyIG1lYW5zIHRocmVlIGJ5dGVzIGVuY29kZWQgKi8KKwkJCQljb2RlID0gU3R1ZmZfU2FtZTsKKwkJCX0KKwkJCS8qIGVsc2UsIGFub3RoZXIgZGlmZmVyZW50IGJ5dGUsIHNvIGFkZCBpdCB0byB0aGUgYmxvY2sgKi8KKwkJCWVsc2UgeworCQkJCSpkc3QrKyA9ICpzcmMgXiBTdHVmZl9NYWdpYzsKKwkJCQljb3VudCsrOworCQkJfQorCQkJc3JjKys7CS8qIENvbnN1bWUgdGhlIGJ5dGUgKi8KKwkJCWJyZWFrOworCQl9CisJCWlmIChjb3VudCA9PSBTdHVmZl9NYXhDb3VudCkgeworCQkJU3R1ZmZEYXRhX0ZpbmlzaEJsb2NrKGNvZGUgKyBjb3VudCk7CisJCX0KKwl9CisJaWYgKGNvZGUgPT0gU3R1ZmZfTm9Db2RlKSB7CisJCSpjb2RlX3B0cl9wdHIgPSBOVUxMOworCX0gZWxzZSB7CisJCSpjb2RlX3B0cl9wdHIgPSBjb2RlX3B0cjsKKwkJU3R1ZmZEYXRhX0ZpbmlzaEJsb2NrKGNvZGUgKyBjb3VudCk7CisJfQorCXJldHVybiAoZHN0KTsKK30KKworLyoKKyAqIFVuU3R1ZmZEYXRhIGRlY29kZXMgdGhlIGRhdGEgYXQgInNyYyIsIHVwIHRvIChidXQgbm90IGluY2x1ZGluZykgImVuZCIuCisgKiBJdCB3cml0ZXMgdGhlIGRlY29kZWQgZGF0YSBpbnRvIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSAiZHN0IiwgdXAgdG8gYQorICogbWF4aW11bSBvZiAiZHN0X2xlbmd0aCIsIGFuZCByZXR1cm5zIHRoZSBuZXcgdmFsdWUgb2YgInNyYyIgc28gdGhhdCBhCisgKiBmb2xsb3ctb24gY2FsbCBjYW4gcmVhZCBtb3JlIGRhdGEsIGNvbnRpbnVpbmcgZnJvbSB3aGVyZSB0aGUgZmlyc3QgbGVmdCBvZmYuCisgKiAKKyAqIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiByZXN1bHRzOgorICogMS4gVGhlIHNvdXJjZSBkYXRhIHJ1bnMgb3V0IGJlZm9yZSBleHRyYWN0aW5nICJkc3RfbGVuZ3RoIiBieXRlczoKKyAqICAgIFVuU3R1ZmZEYXRhIHJldHVybnMgTlVMTCB0byBpbmRpY2F0ZSBmYWlsdXJlLgorICogMi4gVGhlIHNvdXJjZSBkYXRhIHByb2R1Y2VzIGV4YWN0bHkgImRzdF9sZW5ndGgiIGJ5dGVzOgorICogICAgVW5TdHVmZkRhdGEgcmV0dXJucyBuZXdfc3JjID0gZW5kIHRvIGluZGljYXRlIHRoYXQgYWxsIGJ5dGVzIHdlcmUgY29uc3VtZWQuCisgKiAzLiAiZHN0X2xlbmd0aCIgYnl0ZXMgYXJlIGV4dHJhY3RlZCwgd2l0aCBtb3JlIHJlbWFpbmluZy4KKyAqICAgIFVuU3R1ZmZEYXRhIHJldHVybnMgbmV3X3NyYyA8IGVuZCB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIGFyZSBtb3JlIGJ5dGVzCisgKiAgICB0byBiZSByZWFkLgorICogCisgKiBOb3RlOiBUaGUgZGVjb2RpbmcgbWF5IGJlIGRlc3RydWN0aXZlLCBpbiB0aGF0IGl0IG1heSBhbHRlciB0aGUgc291cmNlCisgKiBkYXRhIGluIHRoZSBwcm9jZXNzIG9mIGRlY29kaW5nIGl0ICh0aGlzIGlzIG5lY2Vzc2FyeSB0byBhbGxvdyBhIGZvbGxvdy1vbgorICogY2FsbCB0byByZXN1bWUgY29ycmVjdGx5KS4KKyAqLworCitzdGF0aWMgX191OCAqVW5TdHVmZkRhdGEoX191OCAqIHNyYywgX191OCAqIGVuZCwgX191OCAqIGRzdCwKKwkJCSBfX3UzMiBkc3RfbGVuZ3RoKQoreworCV9fdTggKmRzdF9lbmQgPSBkc3QgKyBkc3RfbGVuZ3RoOworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICghc3JjIHx8ICFlbmQgfHwgIWRzdCB8fCAhZHN0X2xlbmd0aCkKKwkJcmV0dXJuIChOVUxMKTsKKwl3aGlsZSAoc3JjIDwgZW5kICYmIGRzdCA8IGRzdF9lbmQpIHsKKwkJaW50IGNvdW50ID0gKCpzcmMgXiBTdHVmZl9NYWdpYykgJiBTdHVmZl9Db3VudE1hc2s7CisJCXN3aXRjaCAoKCpzcmMgXiBTdHVmZl9NYWdpYykgJiBTdHVmZl9Db2RlTWFzaykgeworCQljYXNlIFN0dWZmX0RpZmY6CisJCQlpZiAoc3JjICsgMSArIGNvdW50ID49IGVuZCkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJZG8geworCQkJCSpkc3QrKyA9ICorK3NyYyBeIFN0dWZmX01hZ2ljOworCQkJfQorCQkJd2hpbGUgKC0tY291bnQgPj0gMCAmJiBkc3QgPCBkc3RfZW5kKTsKKwkJCWlmIChjb3VudCA8IDApCisJCQkJc3JjICs9IDE7CisJCQllbHNlIHsKKwkJCQlpZiAoY291bnQgPT0gMCkKKwkJCQkJKnNyYyA9IFN0dWZmX1NhbWUgXiBTdHVmZl9NYWdpYzsKKwkJCQllbHNlCisJCQkJCSpzcmMgPQorCQkJCQkgICAgKFN0dWZmX0RpZmYgKworCQkJCQkgICAgIGNvdW50KSBeIFN0dWZmX01hZ2ljOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU3R1ZmZfRGlmZlplcm86CisJCQlpZiAoc3JjICsgMSArIGNvdW50ID49IGVuZCkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJZG8geworCQkJCSpkc3QrKyA9ICorK3NyYyBeIFN0dWZmX01hZ2ljOworCQkJfQorCQkJd2hpbGUgKC0tY291bnQgPj0gMCAmJiBkc3QgPCBkc3RfZW5kKTsKKwkJCWlmIChjb3VudCA8IDApCisJCQkJKnNyYyA9IFN0dWZmX1plcm8gXiBTdHVmZl9NYWdpYzsKKwkJCWVsc2UKKwkJCQkqc3JjID0KKwkJCQkgICAgKFN0dWZmX0RpZmZaZXJvICsgY291bnQpIF4gU3R1ZmZfTWFnaWM7CisJCQlicmVhazsKKwkJY2FzZSBTdHVmZl9TYW1lOgorCQkJaWYgKHNyYyArIDEgPj0gZW5kKQorCQkJCXJldHVybiAoTlVMTCk7CisJCQlkbyB7CisJCQkJKmRzdCsrID0gc3JjWzFdIF4gU3R1ZmZfTWFnaWM7CisJCQl9CisJCQl3aGlsZSAoLS1jb3VudCA+PSAwICYmIGRzdCA8IGRzdF9lbmQpOworCQkJaWYgKGNvdW50IDwgMCkKKwkJCQlzcmMgKz0gMjsKKwkJCWVsc2UKKwkJCQkqc3JjID0gKFN0dWZmX1NhbWUgKyBjb3VudCkgXiBTdHVmZl9NYWdpYzsKKwkJCWJyZWFrOworCQljYXNlIFN0dWZmX1plcm86CisJCQlkbyB7CisJCQkJKmRzdCsrID0gMDsKKwkJCX0KKwkJCXdoaWxlICgtLWNvdW50ID49IDAgJiYgZHN0IDwgZHN0X2VuZCk7CisJCQlpZiAoY291bnQgPCAwKQorCQkJCXNyYyArPSAxOworCQkJZWxzZQorCQkJCSpzcmMgPSAoU3R1ZmZfWmVybyArIGNvdW50KSBeIFN0dWZmX01hZ2ljOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGRzdCA8IGRzdF9lbmQpCisJCXJldHVybiAoTlVMTCk7CisJZWxzZQorCQlyZXR1cm4gKHNyYyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEdlbmVyYWwgcm91dGluZXMgZm9yIFNUUklQCQkJCQkJKi8KKworLyoKKyAqIGdldF9iYXVkIHJldHVybnMgdGhlIGN1cnJlbnQgYmF1ZCByYXRlLCBhcyBvbmUgb2YgdGhlIGNvbnN0YW50cyBkZWZpbmVkIGluCisgKiB0ZXJtYml0cy5oCisgKiBJZiB0aGUgdXNlciBoYXMgaXNzdWVkIGEgYmF1ZCByYXRlIG92ZXJyaWRlIHVzaW5nIHRoZSAnc2V0c2VyaWFsJyBjb21tYW5kCisgKiBhbmQgdGhlIGxvZ2ljYWwgY3VycmVudCByYXRlIGlzIHNldCB0byAzOC40LCB0aGVuIHRoZSB0cnVlIGJhdWQgcmF0ZQorICogY3VycmVudGx5IGluIGVmZmVjdCAoNTcuNiBvciAxMTUuMikgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2JhdWQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpZiAoIXR0eSB8fCAhdHR5LT50ZXJtaW9zKQorCQlyZXR1cm4gKDApOworCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpID09IEIzODQwMCAmJiB0dHktPmRyaXZlcl9kYXRhKSB7CisJCXN0cnVjdCBhc3luY19zdHJ1Y3QgKmluZm8gPQorCQkgICAgKHN0cnVjdCBhc3luY19zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwkJaWYgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLKSA9PSBBU1lOQ19TUERfSEkpCisJCQlyZXR1cm4gKEI1NzYwMCk7CisJCWlmICgoaW5mby0+ZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgPT0gQVNZTkNfU1BEX1ZISSkKKwkJCXJldHVybiAoQjExNTIwMCk7CisJfQorCXJldHVybiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpOworfQorCisvKgorICogc2V0X2JhdWQgc2V0cyB0aGUgYmF1ZCByYXRlIHRvIHRoZSByYXRlIGRlZmluZWQgYnkgYmF1ZGNvZGUKKyAqIE5vdGU6IFRoZSByYXRlIEIzODQwMCBzaG91bGQgYmUgYXZvaWRlZCwgYmVjYXVzZSB0aGUgdXNlciBtYXkgaGF2ZQorICogaXNzdWVkIGEgJ3NldHNlcmlhbCcgc3BlZWQgb3ZlcnJpZGUgdG8gbWFwIHRoYXQgdG8gYSBkaWZmZXJlbnQgc3BlZWQuCisgKiBXZSBjb3VsZCBhY2hpZXZlIGEgdHJ1ZSByYXRlIG9mIDM4NDAwIGlmIHdlIG5lZWRlZCB0byBieSBjYW5jZWxsaW5nCisgKiBhbnkgdXNlciBzcGVlZCBvdmVycmlkZSB0aGF0IGlzIGluIHBsYWNlLCBidXQgdGhhdCBtaWdodCBhbm5veSB0aGUKKyAqIHVzZXIsIHNvIGl0IGlzIHNpbXBsZXN0IHRvIGp1c3QgYXZvaWQgdXNpbmcgMzg0MDAuCisgKi8KK3N0YXRpYyB2b2lkIHNldF9iYXVkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBiYXVkY29kZSkKK3sKKwlzdHJ1Y3QgdGVybWlvcyBvbGRfdGVybWlvcyA9ICoodHR5LT50ZXJtaW9zKTsKKwl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJj0gfkNCQVVEOwkvKiBDbGVhciB0aGUgb2xkIGJhdWQgc2V0dGluZyAqLworCXR0eS0+dGVybWlvcy0+Y19jZmxhZyB8PSBiYXVkY29kZTsJLyogU2V0IHRoZSBuZXcgYmF1ZCBzZXR0aW5nICovCisJdHR5LT5kcml2ZXItPnNldF90ZXJtaW9zKHR0eSwgJm9sZF90ZXJtaW9zKTsKK30KKworLyoKKyAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBNZXRyaWNvbSBBZGRyZXNzLgorICovCisKKyNkZWZpbmUgSVNfUkFESU9fQUREUkVTUyhwKSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaXNkaWdpdCgocClbMF0pICYmIGlzZGlnaXQoKHApWzFdKSAmJiBpc2RpZ2l0KChwKVsyXSkgJiYgaXNkaWdpdCgocClbM10pICYmIFwKKyAgKHApWzRdID09ICctJyAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaXNkaWdpdCgocClbNV0pICYmIGlzZGlnaXQoKHApWzZdKSAmJiBpc2RpZ2l0KChwKVs3XSkgJiYgaXNkaWdpdCgocClbOF0pICAgICkKKworc3RhdGljIGludCBzdHJpbmdfdG9fcmFkaW9fYWRkcmVzcyhNZXRyaWNvbUFkZHJlc3MgKiBhZGRyLCBfX3U4ICogcCkKK3sKKwlpZiAoIUlTX1JBRElPX0FERFJFU1MocCkpCisJCXJldHVybiAoMSk7CisJYWRkci0+Y1swXSA9IDA7CisJYWRkci0+Y1sxXSA9IDA7CisJYWRkci0+Y1syXSA9IFJFQURIRVgocFswXSkgPDwgNCB8IFJFQURIRVgocFsxXSk7CisJYWRkci0+Y1szXSA9IFJFQURIRVgocFsyXSkgPDwgNCB8IFJFQURIRVgocFszXSk7CisJYWRkci0+Y1s0XSA9IFJFQURIRVgocFs1XSkgPDwgNCB8IFJFQURIRVgocFs2XSk7CisJYWRkci0+Y1s1XSA9IFJFQURIRVgocFs3XSkgPDwgNCB8IFJFQURIRVgocFs4XSk7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIENvbnZlcnQgYSBNZXRyaWNvbSBBZGRyZXNzIHRvIGEgc3RyaW5nLgorICovCisKK3N0YXRpYyBfX3U4ICpyYWRpb19hZGRyZXNzX3RvX3N0cmluZyhjb25zdCBNZXRyaWNvbUFkZHJlc3MgKiBhZGRyLAorCQkJCSAgICAgTWV0cmljb21BZGRyZXNzU3RyaW5nICogcCkKK3sKKwlzcHJpbnRmKHAtPmMsICIlMDJYJTAyWC0lMDJYJTAyWCIsIGFkZHItPmNbMl0sIGFkZHItPmNbM10sCisJCWFkZHItPmNbNF0sIGFkZHItPmNbNV0pOworCXJldHVybiAocC0+Yyk7Cit9CisKKy8qCisgKiBOb3RlOiBNdXN0IG1ha2Ugc3VyZSBzeF9zaXplIGlzIGJpZyBlbm91Z2ggdG8gcmVjZWl2ZSBhIHN0dWZmZWQKKyAqIE1BWF9SRUNWX01UVSBwYWNrZXQuIEFkZGl0aW9uYWxseSwgd2UgYWxzbyB3YW50IHRvIGVuc3VyZSB0aGF0IGl0J3MKKyAqIGJpZyBlbm91Z2ggdG8gcmVjZWl2ZSBhIGxhcmdlIHJhZGlvIG5laWdoYm91ciBsaXN0IChjdXJyZW50bHkgNEspLgorICovCisKK3N0YXRpYyBpbnQgYWxsb2NhdGVfYnVmZmVycyhzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sIGludCBtdHUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHN0cmlwX2luZm8tPmRldjsKKwlpbnQgc3hfc2l6ZSA9IG1heF90KGludCwgU1RSSVBfRU5DQVBfU0laRShNQVhfUkVDVl9NVFUpLCA0MDk2KTsKKwlpbnQgdHhfc2l6ZSA9IFNUUklQX0VOQ0FQX1NJWkUobXR1KSArIE1heENvbW1hbmRTdHJpbmdMZW5ndGg7CisJX191OCAqciA9IGttYWxsb2MoTUFYX1JFQ1ZfTVRVLCBHRlBfQVRPTUlDKTsKKwlfX3U4ICpzID0ga21hbGxvYyhzeF9zaXplLCBHRlBfQVRPTUlDKTsKKwlfX3U4ICp0ID0ga21hbGxvYyh0eF9zaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAociAmJiBzICYmIHQpIHsKKwkJc3RyaXBfaW5mby0+cnhfYnVmZiA9IHI7CisJCXN0cmlwX2luZm8tPnN4X2J1ZmYgPSBzOworCQlzdHJpcF9pbmZvLT50eF9idWZmID0gdDsKKwkJc3RyaXBfaW5mby0+c3hfc2l6ZSA9IHN4X3NpemU7CisJCXN0cmlwX2luZm8tPnR4X3NpemUgPSB0eF9zaXplOworCQlzdHJpcF9pbmZvLT5tdHUgPSBkZXYtPm10dSA9IG10dTsKKwkJcmV0dXJuICgxKTsKKwl9CisJaWYgKHIpCisJCWtmcmVlKHIpOworCWlmIChzKQorCQlrZnJlZShzKTsKKwlpZiAodCkKKwkJa2ZyZWUodCk7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIE1UVSBoYXMgYmVlbiBjaGFuZ2VkIGJ5IHRoZSBJUCBsYXllci4gCisgKiBXZSBjb3VsZCBiZSBpbgorICogYW4gdXBjYWxsIGZyb20gdGhlIHR0eSBkcml2ZXIsIG9yIGluIGFuIGlwIHBhY2tldCBxdWV1ZS4KKyAqLworc3RhdGljIGludCBzdHJpcF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbyA9IG5ldGRldl9wcml2KGRldik7CisJaW50IG9sZF9tdHUgPSBzdHJpcF9pbmZvLT5tdHU7CisJdW5zaWduZWQgY2hhciAqb3JidWZmID0gc3RyaXBfaW5mby0+cnhfYnVmZjsKKwl1bnNpZ25lZCBjaGFyICpvc2J1ZmYgPSBzdHJpcF9pbmZvLT5zeF9idWZmOworCXVuc2lnbmVkIGNoYXIgKm90YnVmZiA9IHN0cmlwX2luZm8tPnR4X2J1ZmY7CisKKwlpZiAobmV3X210dSA+IE1BWF9TRU5EX01UVSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogTVRVIGV4Y2VlZHMgbWF4aW11bSBhbGxvd2FibGUgKCVkKSwgTVRVIGNoYW5nZSBjYW5jZWxsZWQuXG4iLAorCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBNQVhfU0VORF9NVFUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzcGluX2xvY2tfYmgoJnN0cmlwX2xvY2spOworCWlmICghYWxsb2NhdGVfYnVmZmVycyhzdHJpcF9pbmZvLCBuZXdfbXR1KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZ3JvdyBzdHJpcCBidWZmZXJzLCBNVFUgY2hhbmdlIGNhbmNlbGxlZC5cbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCQlzcGluX3VubG9ja19iaCgmc3RyaXBfbG9jayk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChzdHJpcF9pbmZvLT5zeF9jb3VudCkgeworCQlpZiAoc3RyaXBfaW5mby0+c3hfY291bnQgPD0gc3RyaXBfaW5mby0+c3hfc2l6ZSkKKwkJCW1lbWNweShzdHJpcF9pbmZvLT5zeF9idWZmLCBvc2J1ZmYsCisJCQkgICAgICAgc3RyaXBfaW5mby0+c3hfY291bnQpOworCQllbHNlIHsKKwkJCXN0cmlwX2luZm8tPmRpc2NhcmQgPSBzdHJpcF9pbmZvLT5zeF9jb3VudDsKKwkJCXN0cmlwX2luZm8tPnJ4X292ZXJfZXJyb3JzKys7CisJCX0KKwl9CisKKwlpZiAoc3RyaXBfaW5mby0+dHhfbGVmdCkgeworCQlpZiAoc3RyaXBfaW5mby0+dHhfbGVmdCA8PSBzdHJpcF9pbmZvLT50eF9zaXplKQorCQkJbWVtY3B5KHN0cmlwX2luZm8tPnR4X2J1ZmYsIHN0cmlwX2luZm8tPnR4X2hlYWQsCisJCQkgICAgICAgc3RyaXBfaW5mby0+dHhfbGVmdCk7CisJCWVsc2UgeworCQkJc3RyaXBfaW5mby0+dHhfbGVmdCA9IDA7CisJCQlzdHJpcF9pbmZvLT50eF9kcm9wcGVkKys7CisJCX0KKwl9CisJc3RyaXBfaW5mby0+dHhfaGVhZCA9IHN0cmlwX2luZm8tPnR4X2J1ZmY7CisJc3Bpbl91bmxvY2tfYmgoJnN0cmlwX2xvY2spOworCisJcHJpbnRrKEtFUk5fTk9USUNFICIlczogc3RyaXAgTVRVIGNoYW5nZWQgZm9tICVkIHRvICVkLlxuIiwKKwkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBvbGRfbXR1LCBzdHJpcF9pbmZvLT5tdHUpOworCisJaWYgKG9yYnVmZikKKwkJa2ZyZWUob3JidWZmKTsKKwlpZiAob3NidWZmKQorCQlrZnJlZShvc2J1ZmYpOworCWlmIChvdGJ1ZmYpCisJCWtmcmVlKG90YnVmZik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3RyaXBfdW5sb2NrKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbykKK3sKKwkvKgorCSAqIFNldCB0aGUgdGltZXIgdG8gZ28gb2ZmIGluIG9uZSBzZWNvbmQuCisJICovCisJc3RyaXBfaW5mby0+aWRsZV90aW1lci5leHBpcmVzID0gamlmZmllcyArIDEgKiBIWjsKKwlhZGRfdGltZXIoJnN0cmlwX2luZm8tPmlkbGVfdGltZXIpOworCW5ldGlmX3dha2VfcXVldWUoc3RyaXBfaW5mby0+ZGV2KTsKK30KKworCisKKy8qCisgKiBJZiB0aGUgdGltZSBpcyBpbiB0aGUgbmVhciBmdXR1cmUsIHRpbWVfZGVsdGEgcHJpbnRzIHRoZSBudW1iZXIgb2YKKyAqIHNlY29uZHMgdG8gZ28gaW50byB0aGUgYnVmZmVyIGFuZCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBidWZmZXIuCisgKiBJZiB0aGUgdGltZSBpcyBub3QgaW4gdGhlIG5lYXIgZnV0dXJlLCBpdCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZQorICogc3RyaW5nICJOb3Qgc2NoZWR1bGVkIiBUaGUgYnVmZmVyIG11c3QgYmUgbG9uZyBlbm91Z2ggdG8gY29udGFpbiB0aGUKKyAqIGFzY2lpIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBudW1iZXIgcGx1cyA5IGNoYXJhY3RlcyBmb3IgdGhlICIgc2Vjb25kcyIKKyAqIGFuZCB0aGUgbnVsbCBjaGFyYWN0ZXIuCisgKi8KKyNpZmRlZiBDT05GSUdfUFJPQ19GUworc3RhdGljIGNoYXIgKnRpbWVfZGVsdGEoY2hhciBidWZmZXJbXSwgbG9uZyB0aW1lKQoreworCXRpbWUgLT0gamlmZmllczsKKwlpZiAodGltZSA+IExvbmdUaW1lIC8gMikKKwkJcmV0dXJuICgiTm90IHNjaGVkdWxlZCIpOworCWlmICh0aW1lIDwgMCkKKwkJdGltZSA9IDA7CS8qIERvbid0IHByaW50IG5lZ2F0aXZlIHRpbWVzICovCisJc3ByaW50ZihidWZmZXIsICIlbGQgc2Vjb25kcyIsIHRpbWUgLyBIWik7CisJcmV0dXJuIChidWZmZXIpOworfQorCisvKiBnZXQgTnRoIGVsZW1lbnQgb2YgdGhlIGxpbmtlZCBsaXN0ICovCitzdGF0aWMgc3RydWN0IHN0cmlwICpzdHJpcF9nZXRfaWR4KGxvZmZfdCBwb3MpIAoreworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJaW50IGkgPSAwOworCisJbGlzdF9mb3JfZWFjaF9yY3UobCwgJnN0cmlwX2xpc3QpIHsKKwkJaWYgKHBvcyA9PSBpKQorCQkJcmV0dXJuIGxpc3RfZW50cnkobCwgc3RydWN0IHN0cmlwLCBsaXN0KTsKKwkJKytpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKnN0cmlwX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCit7CisJcmN1X3JlYWRfbG9jaygpOworCXJldHVybiAqcG9zID8gc3RyaXBfZ2V0X2lkeCgqcG9zIC0gMSkgOiBTRVFfU1RBUlRfVE9LRU47Cit9CisKK3N0YXRpYyB2b2lkICpzdHJpcF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbDsKKwlzdHJ1Y3Qgc3RyaXAgKnM7CisKKwkrKypwb3M7CisJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlyZXR1cm4gc3RyaXBfZ2V0X2lkeCgxKTsKKworCXMgPSB2OworCWwgPSAmcy0+bGlzdDsKKwlsaXN0X2Zvcl9lYWNoX2NvbnRpbnVlX3JjdShsLCAmc3RyaXBfbGlzdCkgeworCQlyZXR1cm4gbGlzdF9lbnRyeShsLCBzdHJ1Y3Qgc3RyaXAsIGxpc3QpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc3RyaXBfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cmlwX3NlcV9uZWlnaGJvdXJzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLAorCQkJICAgY29uc3QgTWV0cmljb21Ob2RlVGFibGUgKiB0YWJsZSwKKwkJCSAgIGNvbnN0IGNoYXIgKnRpdGxlKQoreworCS8qIFdlIHdyYXAgdGhpcyBpbiBhIGRvL3doaWxlIGxvb3AsIHNvIGlmIHRoZSB0YWJsZSBjaGFuZ2VzICovCisJLyogd2hpbGUgd2UncmUgcmVhZGluZyBpdCwgd2UganVzdCBnbyBhcm91bmQgYW5kIHRyeSBhZ2Fpbi4gKi8KKwlzdHJ1Y3QgdGltZXZhbCB0OworCisJZG8geworCQlpbnQgaTsKKwkJdCA9IHRhYmxlLT50aW1lc3RhbXA7CisJCWlmICh0YWJsZS0+bnVtX25vZGVzKQorCQkJc2VxX3ByaW50ZihzZXEsICJcbiAlc1xuIiwgdGl0bGUpOworCQlmb3IgKGkgPSAwOyBpIDwgdGFibGUtPm51bV9ub2RlczsgaSsrKSB7CisJCQlNZXRyaWNvbU5vZGUgbm9kZTsKKworCQkJc3Bpbl9sb2NrX2JoKCZzdHJpcF9sb2NrKTsKKwkJCW5vZGUgPSB0YWJsZS0+bm9kZVtpXTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZzdHJpcF9sb2NrKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiICAlc1xuIiwgbm9kZS5jKTsKKwkJfQorCX0gd2hpbGUgKHRhYmxlLT50aW1lc3RhbXAudHZfc2VjICE9IHQudHZfc2VjCisJCSB8fCB0YWJsZS0+dGltZXN0YW1wLnR2X3VzZWMgIT0gdC50dl91c2VjKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcHJpbnRzIHJhZGlvIHN0YXR1cyBpbmZvcm1hdGlvbiB2aWEgdGhlIHNlcV9maWxlCisgKiBpbnRlcmZhY2UuICBUaGUgaW50ZXJmYWNlIHRha2VzIGNhcmUgb2YgYnVmZmVyIHNpemUgYW5kIG92ZXIKKyAqIHJ1biBpc3N1ZXMuIAorICoKKyAqIFRoZSBidWZmZXIgaW4gc2VxX2ZpbGUgaXMgUEFHRVNJWkUgKDRLKSAKKyAqIHNvIHRoaXMgcm91dGluZSBzaG91bGQgbmV2ZXIgcHJpbnQgbW9yZSBvciBpdCB3aWxsIGdldCB0cnVuY2F0ZWQuCisgKiBXaXRoIHRoZSBtYXhpbXVtIG9mIDMyIHBvcnRhYmxlcyBhbmQgMzIgcG9sZXRvcHMKKyAqIHJlcG9ydGVkLCB0aGUgcm91dGluZSBvdXRwdXRzIDMxMDcgYnl0ZXMgaW50byB0aGUgYnVmZmVyLgorICovCitzdGF0aWMgdm9pZCBzdHJpcF9zZXFfc3RhdHVzX2luZm8oc3RydWN0IHNlcV9maWxlICpzZXEsIAorCQkJCSAgY29uc3Qgc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvKQoreworCWNoYXIgdGVtcFszMl07CisJTWV0cmljb21BZGRyZXNzU3RyaW5nIGFkZHJfc3RyaW5nOworCisJLyogRmlyc3QsIHdlIG11c3QgY29weSBhbGwgb2Ygb3VyIGRhdGEgdG8gYSBzYWZlIHBsYWNlLCAqLworCS8qIGluIGNhc2UgYSBzZXJpYWwgaW50ZXJydXB0IGNvbWVzIGluIGFuZCBjaGFuZ2VzIGl0LiAgKi8KKwlpbnQgdHhfbGVmdCA9IHN0cmlwX2luZm8tPnR4X2xlZnQ7CisJdW5zaWduZWQgbG9uZyByeF9hdmVyYWdlX3BwcyA9IHN0cmlwX2luZm8tPnJ4X2F2ZXJhZ2VfcHBzOworCXVuc2lnbmVkIGxvbmcgdHhfYXZlcmFnZV9wcHMgPSBzdHJpcF9pbmZvLT50eF9hdmVyYWdlX3BwczsKKwl1bnNpZ25lZCBsb25nIHN4X2F2ZXJhZ2VfcHBzID0gc3RyaXBfaW5mby0+c3hfYXZlcmFnZV9wcHM7CisJaW50IHdvcmtpbmcgPSBzdHJpcF9pbmZvLT53b3JraW5nOworCWludCBmaXJtd2FyZV9sZXZlbCA9IHN0cmlwX2luZm8tPmZpcm13YXJlX2xldmVsOworCWxvbmcgd2F0Y2hkb2dfZG9wcm9iZSA9IHN0cmlwX2luZm8tPndhdGNoZG9nX2RvcHJvYmU7CisJbG9uZyB3YXRjaGRvZ19kb3Jlc2V0ID0gc3RyaXBfaW5mby0+d2F0Y2hkb2dfZG9yZXNldDsKKwlsb25nIGdyYXR1aXRvdXNfYXJwID0gc3RyaXBfaW5mby0+Z3JhdHVpdG91c19hcnA7CisJbG9uZyBhcnBfaW50ZXJ2YWwgPSBzdHJpcF9pbmZvLT5hcnBfaW50ZXJ2YWw7CisJRmlybXdhcmVWZXJzaW9uIGZpcm13YXJlX3ZlcnNpb24gPSBzdHJpcF9pbmZvLT5maXJtd2FyZV92ZXJzaW9uOworCVNlcmlhbE51bWJlciBzZXJpYWxfbnVtYmVyID0gc3RyaXBfaW5mby0+c2VyaWFsX251bWJlcjsKKwlCYXR0ZXJ5Vm9sdGFnZSBiYXR0ZXJ5X3ZvbHRhZ2UgPSBzdHJpcF9pbmZvLT5iYXR0ZXJ5X3ZvbHRhZ2U7CisJY2hhciAqaWZfbmFtZSA9IHN0cmlwX2luZm8tPmRldi0+bmFtZTsKKwlNZXRyaWNvbUFkZHJlc3MgdHJ1ZV9kZXZfYWRkciA9IHN0cmlwX2luZm8tPnRydWVfZGV2X2FkZHI7CisJTWV0cmljb21BZGRyZXNzIGRldl9kZXZfYWRkciA9CisJICAgICooTWV0cmljb21BZGRyZXNzICopIHN0cmlwX2luZm8tPmRldi0+ZGV2X2FkZHI7CisJaW50IG1hbnVhbF9kZXZfYWRkciA9IHN0cmlwX2luZm8tPm1hbnVhbF9kZXZfYWRkcjsKKyNpZmRlZiBFWFRfQ09VTlRFUlMKKwl1bnNpZ25lZCBsb25nIHJ4X2J5dGVzID0gc3RyaXBfaW5mby0+cnhfYnl0ZXM7CisJdW5zaWduZWQgbG9uZyB0eF9ieXRlcyA9IHN0cmlwX2luZm8tPnR4X2J5dGVzOworCXVuc2lnbmVkIGxvbmcgcnhfcmJ5dGVzID0gc3RyaXBfaW5mby0+cnhfcmJ5dGVzOworCXVuc2lnbmVkIGxvbmcgdHhfcmJ5dGVzID0gc3RyaXBfaW5mby0+dHhfcmJ5dGVzOworCXVuc2lnbmVkIGxvbmcgcnhfc2J5dGVzID0gc3RyaXBfaW5mby0+cnhfc2J5dGVzOworCXVuc2lnbmVkIGxvbmcgdHhfc2J5dGVzID0gc3RyaXBfaW5mby0+dHhfc2J5dGVzOworCXVuc2lnbmVkIGxvbmcgcnhfZWJ5dGVzID0gc3RyaXBfaW5mby0+cnhfZWJ5dGVzOworCXVuc2lnbmVkIGxvbmcgdHhfZWJ5dGVzID0gc3RyaXBfaW5mby0+dHhfZWJ5dGVzOworI2VuZGlmCisKKwlzZXFfcHJpbnRmKHNlcSwgIlxuSW50ZXJmYWNlIG5hbWVcdFx0JXNcbiIsIGlmX25hbWUpOworCXNlcV9wcmludGYoc2VxLCAiIFJhZGlvIHdvcmtpbmc6XHRcdCVzXG4iLCB3b3JraW5nID8gIlllcyIgOiAiTm8iKTsKKwlyYWRpb19hZGRyZXNzX3RvX3N0cmluZygmdHJ1ZV9kZXZfYWRkciwgJmFkZHJfc3RyaW5nKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiBSYWRpbyBhZGRyZXNzOlx0XHQlc1xuIiwgYWRkcl9zdHJpbmcuYyk7CisJaWYgKG1hbnVhbF9kZXZfYWRkcikgeworCQlyYWRpb19hZGRyZXNzX3RvX3N0cmluZygmZGV2X2Rldl9hZGRyLCAmYWRkcl9zdHJpbmcpOworCQlzZXFfcHJpbnRmKHNlcSwgIiBEZXZpY2UgYWRkcmVzczpcdCVzXG4iLCBhZGRyX3N0cmluZy5jKTsKKwl9CisJc2VxX3ByaW50ZihzZXEsICIgRmlybXdhcmUgdmVyc2lvbjpcdCVzIiwgIXdvcmtpbmcgPyAiVW5rbm93biIgOgorCQkgICAgICFmaXJtd2FyZV9sZXZlbCA/ICJTaG91bGQgYmUgdXBncmFkZWQiIDoKKwkJICAgICBmaXJtd2FyZV92ZXJzaW9uLmMpOworCWlmIChmaXJtd2FyZV9sZXZlbCA+PSBDaGVja3N1bW1lZE1lc3NhZ2VzKQorCQlzZXFfcHJpbnRmKHNlcSwgIiAoQ2hlY2tzdW1zIEVuYWJsZWQpIik7CisJc2VxX3ByaW50ZihzZXEsICJcbiIpOworCXNlcV9wcmludGYoc2VxLCAiIFNlcmlhbCBudW1iZXI6XHRcdCVzXG4iLCBzZXJpYWxfbnVtYmVyLmMpOworCXNlcV9wcmludGYoc2VxLCAiIEJhdHRlcnkgdm9sdGFnZTpcdCVzXG4iLCBiYXR0ZXJ5X3ZvbHRhZ2UuYyk7CisJc2VxX3ByaW50ZihzZXEsICIgVHJhbnNtaXQgcXVldWUgKGJ5dGVzKTolZFxuIiwgdHhfbGVmdCk7CisJc2VxX3ByaW50ZihzZXEsICIgUmVjZWl2ZSBwYWNrZXQgcmF0ZTogICAlbGQgcGFja2V0cyBwZXIgc2Vjb25kXG4iLAorCQkgICAgIHJ4X2F2ZXJhZ2VfcHBzIC8gOCk7CisJc2VxX3ByaW50ZihzZXEsICIgVHJhbnNtaXQgcGFja2V0IHJhdGU6ICAlbGQgcGFja2V0cyBwZXIgc2Vjb25kXG4iLAorCQkgICAgIHR4X2F2ZXJhZ2VfcHBzIC8gOCk7CisJc2VxX3ByaW50ZihzZXEsICIgU2VudCBwYWNrZXQgcmF0ZTogICAgICAlbGQgcGFja2V0cyBwZXIgc2Vjb25kXG4iLAorCQkgICAgIHN4X2F2ZXJhZ2VfcHBzIC8gOCk7CisJc2VxX3ByaW50ZihzZXEsICIgTmV4dCB3YXRjaGRvZyBwcm9iZTpcdCVzXG4iLAorCQkgICAgIHRpbWVfZGVsdGEodGVtcCwgd2F0Y2hkb2dfZG9wcm9iZSkpOworCXNlcV9wcmludGYoc2VxLCAiIE5leHQgd2F0Y2hkb2cgcmVzZXQ6XHQlc1xuIiwKKwkJICAgICB0aW1lX2RlbHRhKHRlbXAsIHdhdGNoZG9nX2RvcmVzZXQpKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiBOZXh0IGdyYXR1aXRvdXMgQVJQOlx0Iik7CisKKwlpZiAoIW1lbWNtcAorCSAgICAoc3RyaXBfaW5mby0+ZGV2LT5kZXZfYWRkciwgemVyb19hZGRyZXNzLmMsCisJICAgICBzaXplb2YoemVyb19hZGRyZXNzKSkpCisJCXNlcV9wcmludGYoc2VxLCAiRGlzYWJsZWRcbiIpOworCWVsc2UgeworCQlzZXFfcHJpbnRmKHNlcSwgIiVzXG4iLCB0aW1lX2RlbHRhKHRlbXAsIGdyYXR1aXRvdXNfYXJwKSk7CisJCXNlcV9wcmludGYoc2VxLCAiIE5leHQgQVJQIGludGVydmFsOlx0JWxkIHNlY29uZHNcbiIsCisJCQkgICAgIEpJRkZJRV9UT19TRUMoYXJwX2ludGVydmFsKSk7CisJfQorCisJaWYgKHdvcmtpbmcpIHsKKyNpZmRlZiBFWFRfQ09VTlRFUlMKKwkJc2VxX3ByaW50ZihzZXEsICJcbiIpOworCQlzZXFfcHJpbnRmKHNlcSwKKwkJCSAgICAgIiBUb3RhbCBieXRlczogICAgICAgICBcdHJ4Olx0JWx1XHR0eDpcdCVsdVxuIiwKKwkJCSAgICAgcnhfYnl0ZXMsIHR4X2J5dGVzKTsKKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAgICIgIHRocnUgcmFkaW86ICAgICAgICAgXHRyeDpcdCVsdVx0dHg6XHQlbHVcbiIsCisJCQkgICAgIHJ4X3JieXRlcywgdHhfcmJ5dGVzKTsKKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAgICIgIHRocnUgc2VyaWFsIHBvcnQ6ICAgXHRyeDpcdCVsdVx0dHg6XHQlbHVcbiIsCisJCQkgICAgIHJ4X3NieXRlcywgdHhfc2J5dGVzKTsKKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAgICIgVG90YWwgc3RhdC9lcnIgYnl0ZXM6XHRyeDpcdCVsdVx0dHg6XHQlbHVcbiIsCisJCQkgICAgIHJ4X2VieXRlcywgdHhfZWJ5dGVzKTsKKyNlbmRpZgorCQlzdHJpcF9zZXFfbmVpZ2hib3VycyhzZXEsICZzdHJpcF9pbmZvLT5wb2xldG9wcywKKwkJCQkJIlBvbGV0b3BzOiIpOworCQlzdHJpcF9zZXFfbmVpZ2hib3VycyhzZXEsICZzdHJpcF9pbmZvLT5wb3J0YWJsZXMsCisJCQkJCSJQb3J0YWJsZXM6Iik7CisJfQorfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBleHBvcnRzIHN0YXR1cyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBTVFJJUCBkcml2ZXIgdGhyb3VnaAorICogdGhlIC9wcm9jIGZpbGUgc3lzdGVtLgorICovCitzdGF0aWMgaW50IHN0cmlwX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKKwkJc2VxX3ByaW50ZihzZXEsICJzdHJpcF92ZXJzaW9uOiAlc1xuIiwgU3RyaXBWZXJzaW9uKTsKKwllbHNlCisJCXN0cmlwX3NlcV9zdGF0dXNfaW5mbyhzZXEsIChjb25zdCBzdHJ1Y3Qgc3RyaXAgKil2KTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHN0cmlwX3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gc3RyaXBfc2VxX3N0YXJ0LAorCS5uZXh0ICA9IHN0cmlwX3NlcV9uZXh0LAorCS5zdG9wICA9IHN0cmlwX3NlcV9zdG9wLAorCS5zaG93ICA9IHN0cmlwX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBzdHJpcF9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJnN0cmlwX3NlcV9vcHMpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzdHJpcF9zZXFfZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSBzdHJpcF9zZXFfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UsCit9OworI2VuZGlmCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU2VuZGluZyByb3V0aW5lcwkJCQkJCQkqLworCitzdGF0aWMgdm9pZCBSZXNldFJhZGlvKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbykKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gc3RyaXBfaW5mby0+dHR5OworCXN0YXRpYyBjb25zdCBjaGFyIGluaXRbXSA9ICJhdGUwcTFkdCoqc3Rhcm1vZGVccioqIjsKKwlTdHJpbmdEZXNjcmlwdG9yIHMgPSB7IGluaXQsIHNpemVvZihpbml0KSAtIDEgfTsKKworCS8qIAorCSAqIElmIHRoZSByYWRpbyBpc24ndCB3b3JraW5nIGFueW1vcmUsCisJICogd2Ugc2hvdWxkIGNsZWFyIHRoZSBvbGQgc3RhdHVzIGluZm9ybWF0aW9uLgorCSAqLworCWlmIChzdHJpcF9pbmZvLT53b3JraW5nKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBObyByZXNwb25zZTogUmVzZXR0aW5nIHJhZGlvLlxuIiwKKwkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSk7CisJCXN0cmlwX2luZm8tPmZpcm13YXJlX3ZlcnNpb24uY1swXSA9ICdcMCc7CisJCXN0cmlwX2luZm8tPnNlcmlhbF9udW1iZXIuY1swXSA9ICdcMCc7CisJCXN0cmlwX2luZm8tPmJhdHRlcnlfdm9sdGFnZS5jWzBdID0gJ1wwJzsKKwkJc3RyaXBfaW5mby0+cG9ydGFibGVzLm51bV9ub2RlcyA9IDA7CisJCWRvX2dldHRpbWVvZmRheSgmc3RyaXBfaW5mby0+cG9ydGFibGVzLnRpbWVzdGFtcCk7CisJCXN0cmlwX2luZm8tPnBvbGV0b3BzLm51bV9ub2RlcyA9IDA7CisJCWRvX2dldHRpbWVvZmRheSgmc3RyaXBfaW5mby0+cG9sZXRvcHMudGltZXN0YW1wKTsKKwl9CisKKwlzdHJpcF9pbmZvLT5wcHNfdGltZXIgPSBqaWZmaWVzOworCXN0cmlwX2luZm8tPnJ4X3Bwc19jb3VudCA9IDA7CisJc3RyaXBfaW5mby0+dHhfcHBzX2NvdW50ID0gMDsKKwlzdHJpcF9pbmZvLT5zeF9wcHNfY291bnQgPSAwOworCXN0cmlwX2luZm8tPnJ4X2F2ZXJhZ2VfcHBzID0gMDsKKwlzdHJpcF9pbmZvLT50eF9hdmVyYWdlX3BwcyA9IDA7CisJc3RyaXBfaW5mby0+c3hfYXZlcmFnZV9wcHMgPSAwOworCisJLyogTWFyayByYWRpbyBhZGRyZXNzIGFzIHVua25vd24gKi8KKwkqKE1ldHJpY29tQWRkcmVzcyAqKSAmIHN0cmlwX2luZm8tPnRydWVfZGV2X2FkZHIgPSB6ZXJvX2FkZHJlc3M7CisJaWYgKCFzdHJpcF9pbmZvLT5tYW51YWxfZGV2X2FkZHIpCisJCSooTWV0cmljb21BZGRyZXNzICopIHN0cmlwX2luZm8tPmRldi0+ZGV2X2FkZHIgPQorCQkgICAgemVyb19hZGRyZXNzOworCXN0cmlwX2luZm8tPndvcmtpbmcgPSBGQUxTRTsKKwlzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA9IE5vU3RydWN0dXJlOworCXN0cmlwX2luZm8tPm5leHRfY29tbWFuZCA9IENvbXBhdGliaWxpdHlDb21tYW5kOworCXN0cmlwX2luZm8tPndhdGNoZG9nX2RvcHJvYmUgPSBqaWZmaWVzICsgMTAgKiBIWjsKKwlzdHJpcF9pbmZvLT53YXRjaGRvZ19kb3Jlc2V0ID0gamlmZmllcyArIDEgKiBIWjsKKworCS8qIElmIHRoZSB1c2VyIGhhcyBzZWxlY3RlZCBhIGJhdWQgcmF0ZSBhYm92ZSAzOC40IHNlZSB3aGF0IG1hZ2ljIHdlIGhhdmUgdG8gZG8gKi8KKwlpZiAoc3RyaXBfaW5mby0+dXNlcl9iYXVkID4gQjM4NDAwKSB7CisJCS8qCisJCSAqIFN1YnRsZSBzdHVmZjogUGF5IGF0dGVudGlvbiA6LSkKKwkJICogSWYgdGhlIHNlcmlhbCBwb3J0IGlzIGN1cnJlbnRseSBhdCB0aGUgdXNlcidzIHNlbGVjdGVkICg+MzguNCkgcmF0ZSwKKwkJICogdGhlbiB3ZSB0ZW1wb3JhcmlseSBzd2l0Y2ggdG8gMTkuMiBhbmQgaXNzdWUgdGhlIEFUUzMwNCBjb21tYW5kCisJCSAqIHRvIHRlbGwgdGhlIHJhZGlvIHRvIHN3aXRjaCB0byB0aGUgdXNlcidzIHNlbGVjdGVkIHJhdGUuCisJCSAqIElmIHRoZSBzZXJpYWwgcG9ydCBpcyBub3QgY3VycmVudGx5IGF0IHRoYXQgcmF0ZSwgdGhhdCBtZWFucyB3ZSBqdXN0CisJCSAqIGlzc3VlZCB0aGUgQVRTMzA0IGNvbW1hbmQgbGFzdCB0aW1lIHRocm91Z2gsIHNvIHRoaXMgdGltZSB3ZSByZXN0b3JlCisJCSAqIHRoZSB1c2VyJ3Mgc2VsZWN0ZWQgcmF0ZSBhbmQgaXNzdWUgdGhlIG5vcm1hbCBzdGFybW9kZSByZXNldCBzdHJpbmcuCisJCSAqLworCQlpZiAoc3RyaXBfaW5mby0+dXNlcl9iYXVkID09IGdldF9iYXVkKHR0eSkpIHsKKwkJCXN0YXRpYyBjb25zdCBjaGFyIGIwW10gPSAiYXRlMHExczMwND01NzYwMFxyIjsKKwkJCXN0YXRpYyBjb25zdCBjaGFyIGIxW10gPSAiYXRlMHExczMwND0xMTUyMDBcciI7CisJCQlzdGF0aWMgY29uc3QgU3RyaW5nRGVzY3JpcHRvciBiYXVkc3RyaW5nWzJdID0KKwkJCSAgICB7IHtiMCwgc2l6ZW9mKGIwKSAtIDF9CisJCQksIHtiMSwgc2l6ZW9mKGIxKSAtIDF9CisJCQl9OworCQkJc2V0X2JhdWQodHR5LCBCMTkyMDApOworCQkJaWYgKHN0cmlwX2luZm8tPnVzZXJfYmF1ZCA9PSBCNTc2MDApCisJCQkJcyA9IGJhdWRzdHJpbmdbMF07CisJCQllbHNlIGlmIChzdHJpcF9pbmZvLT51c2VyX2JhdWQgPT0gQjExNTIwMCkKKwkJCQlzID0gYmF1ZHN0cmluZ1sxXTsKKwkJCWVsc2UKKwkJCQlzID0gYmF1ZHN0cmluZ1sxXTsJLyogRm9yIG5vdyAqLworCQl9IGVsc2UKKwkJCXNldF9iYXVkKHR0eSwgc3RyaXBfaW5mby0+dXNlcl9iYXVkKTsKKwl9CisKKwl0dHktPmRyaXZlci0+d3JpdGUodHR5LCBzLnN0cmluZywgcy5sZW5ndGgpOworI2lmZGVmIEVYVF9DT1VOVEVSUworCXN0cmlwX2luZm8tPnR4X2VieXRlcyArPSBzLmxlbmd0aDsKKyNlbmRpZgorfQorCisvKgorICogQ2FsbGVkIGJ5IHRoZSBkcml2ZXIgd2hlbiB0aGVyZSdzIHJvb20gZm9yIG1vcmUgZGF0YS4gIElmIHdlIGhhdmUKKyAqIG1vcmUgcGFja2V0cyB0byBzZW5kLCB3ZSBzZW5kIHRoZW0gaGVyZS4KKyAqLworCitzdGF0aWMgdm9pZCBzdHJpcF93cml0ZV9zb21lX21vcmUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8gPSAoc3RydWN0IHN0cmlwICopIHR0eS0+ZGlzY19kYXRhOworCisJLyogRmlyc3QgbWFrZSBzdXJlIHdlJ3JlIGNvbm5lY3RlZC4gKi8KKwlpZiAoIXN0cmlwX2luZm8gfHwgc3RyaXBfaW5mby0+bWFnaWMgIT0gU1RSSVBfTUFHSUMgfHwKKwkgICAgIW5ldGlmX3J1bm5pbmcoc3RyaXBfaW5mby0+ZGV2KSkKKwkJcmV0dXJuOworCisJaWYgKHN0cmlwX2luZm8tPnR4X2xlZnQgPiAwKSB7CisJCWludCBudW1fd3JpdHRlbiA9CisJCSAgICB0dHktPmRyaXZlci0+d3JpdGUodHR5LCBzdHJpcF9pbmZvLT50eF9oZWFkLAorCQkJCSAgICAgIHN0cmlwX2luZm8tPnR4X2xlZnQpOworCQlzdHJpcF9pbmZvLT50eF9sZWZ0IC09IG51bV93cml0dGVuOworCQlzdHJpcF9pbmZvLT50eF9oZWFkICs9IG51bV93cml0dGVuOworI2lmZGVmIEVYVF9DT1VOVEVSUworCQlzdHJpcF9pbmZvLT50eF9zYnl0ZXMgKz0gbnVtX3dyaXR0ZW47CisjZW5kaWYKKwl9IGVsc2UgewkJLyogRWxzZSBzdGFydCB0cmFuc21pc3Npb24gb2YgYW5vdGhlciBwYWNrZXQgKi8KKworCQl0dHktPmZsYWdzICY9IH4oMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKwkJc3RyaXBfdW5sb2NrKHN0cmlwX2luZm8pOworCX0KK30KKworc3RhdGljIF9fdTggKmFkZF9jaGVja3N1bShfX3U4ICogYnVmZmVyLCBfX3U4ICogZW5kKQoreworCV9fdTE2IHN1bSA9IDA7CisJX191OCAqcCA9IGJ1ZmZlcjsKKwl3aGlsZSAocCA8IGVuZCkKKwkJc3VtICs9ICpwKys7CisJZW5kWzNdID0gaGV4dGFibGVbc3VtICYgMHhGXTsKKwlzdW0gPj49IDQ7CisJZW5kWzJdID0gaGV4dGFibGVbc3VtICYgMHhGXTsKKwlzdW0gPj49IDQ7CisJZW5kWzFdID0gaGV4dGFibGVbc3VtICYgMHhGXTsKKwlzdW0gPj49IDQ7CisJZW5kWzBdID0gaGV4dGFibGVbc3VtICYgMHhGXTsKKwlyZXR1cm4gKGVuZCArIDQpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqc3RyaXBfbWFrZV9wYWNrZXQodW5zaWduZWQgY2hhciAqYnVmZmVyLAorCQkJCQlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sCisJCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJX191OCAqcHRyID0gYnVmZmVyOworCV9fdTggKnN0dWZmc3RhdGUgPSBOVUxMOworCVNUUklQX0hlYWRlciAqaGVhZGVyID0gKFNUUklQX0hlYWRlciAqKSBza2ItPmRhdGE7CisJTWV0cmljb21BZGRyZXNzIGhhZGRyID0gaGVhZGVyLT5kc3RfYWRkcjsKKwlpbnQgbGVuID0gc2tiLT5sZW4gLSBzaXplb2YoU1RSSVBfSGVhZGVyKTsKKwlNZXRyaWNvbUtleSBrZXk7CisKKwkvKkhleER1bXAoInN0cmlwX21ha2VfcGFja2V0Iiwgc3RyaXBfaW5mbywgc2tiLT5kYXRhLCBza2ItPmRhdGEgKyBza2ItPmxlbik7ICovCisKKwlpZiAoaGVhZGVyLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCisJCWtleSA9IFNJUDBLZXk7CisJZWxzZSBpZiAoaGVhZGVyLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9BUlApKQorCQlrZXkgPSBBUlAwS2V5OworCWVsc2UgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogc3RyaXBfbWFrZV9wYWNrZXQ6IFVua25vd24gcGFja2V0IHR5cGUgMHglMDRYXG4iLAorCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBudG9ocyhoZWFkZXItPnByb3RvY29sKSk7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJaWYgKGxlbiA+IHN0cmlwX2luZm8tPm10dSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogRHJvcHBpbmcgb3ZlcnNpemVkIHRyYW5zbWl0IHBhY2tldDogJWQgYnl0ZXNcbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIGxlbik7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJLyoKKwkgKiBJZiB3ZSdyZSBzZW5kaW5nIHRvIG91cnNlbHZlcywgZGlzY2FyZCB0aGUgcGFja2V0LgorCSAqIChNZXRyaWNvbSByYWRpb3MgY2hva2UgaWYgdGhleSB0cnkgdG8gc2VuZCBhIHBhY2tldCB0byB0aGVpciBvd24gYWRkcmVzcy4pCisJICovCisJaWYgKCFtZW1jbXAoaGFkZHIuYywgc3RyaXBfaW5mby0+dHJ1ZV9kZXZfYWRkci5jLCBzaXplb2YoaGFkZHIpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBEcm9wcGluZyBwYWNrZXQgYWRkcmVzc2VkIHRvIHNlbGZcbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCS8qCisJICogSWYgdGhpcyBpcyBhIGJyb2FkY2FzdCBwYWNrZXQsIHNlbmQgaXQgdG8gb3VyIGRlc2lnbmF0ZWQgTWV0cmljb20KKwkgKiAnYnJvYWRjYXN0IGh1YicgcmFkaW8gKEZpcnN0IGJ5dGUgb2YgYWRkcmVzcyBiZWluZyAweEZGIG1lYW5zIGJyb2FkY2FzdCkKKwkgKi8KKwlpZiAoaGFkZHIuY1swXSA9PSAweEZGKSB7CisJCXUzMiBicmQgPSAwOworCQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisKKwkJcmN1X3JlYWRfbG9jaygpOworCQlpbl9kZXYgPSBfX2luX2Rldl9nZXQoc3RyaXBfaW5mby0+ZGV2KTsKKwkJaWYgKGluX2RldiA9PSBOVUxMKSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChpbl9kZXYtPmlmYV9saXN0KQorCQkJYnJkID0gaW5fZGV2LT5pZmFfbGlzdC0+aWZhX2Jyb2FkY2FzdDsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkJLyogYXJwX3F1ZXJ5IHJldHVybnMgMSBpZiBpdCBzdWNjZWVkcyBpbiBsb29raW5nIHVwIHRoZSBhZGRyZXNzLCAwIGlmIGl0IGZhaWxzICovCisJCWlmICghYXJwX3F1ZXJ5KGhhZGRyLmMsIGJyZCwgc3RyaXBfaW5mby0+ZGV2KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIiVzOiBVbmFibGUgdG8gc2VuZCBwYWNrZXQgKG5vIGJyb2FkY2FzdCBodWIgY29uZmlndXJlZClcbiIsCisJCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKwkJLyoKKwkJICogSWYgd2UgYXJlIHRoZSBicm9hZGNhc3QgaHViLCBkb24ndCBib3RoZXIgc2VuZGluZyB0byBvdXJzZWx2ZXMuCisJCSAqIChNZXRyaWNvbSByYWRpb3MgY2hva2UgaWYgdGhleSB0cnkgdG8gc2VuZCBhIHBhY2tldCB0byB0aGVpciBvd24gYWRkcmVzcy4pCisJCSAqLworCQlpZiAoIW1lbWNtcAorCQkgICAgKGhhZGRyLmMsIHN0cmlwX2luZm8tPnRydWVfZGV2X2FkZHIuYywgc2l6ZW9mKGhhZGRyKSkpCisJCQlyZXR1cm4gKE5VTEwpOworCX0KKworCSpwdHIrKyA9IDB4MEQ7CisJKnB0cisrID0gJyonOworCSpwdHIrKyA9IGhleHRhYmxlW2hhZGRyLmNbMl0gPj4gNF07CisJKnB0cisrID0gaGV4dGFibGVbaGFkZHIuY1syXSAmIDB4Rl07CisJKnB0cisrID0gaGV4dGFibGVbaGFkZHIuY1szXSA+PiA0XTsKKwkqcHRyKysgPSBoZXh0YWJsZVtoYWRkci5jWzNdICYgMHhGXTsKKwkqcHRyKysgPSAnLSc7CisJKnB0cisrID0gaGV4dGFibGVbaGFkZHIuY1s0XSA+PiA0XTsKKwkqcHRyKysgPSBoZXh0YWJsZVtoYWRkci5jWzRdICYgMHhGXTsKKwkqcHRyKysgPSBoZXh0YWJsZVtoYWRkci5jWzVdID4+IDRdOworCSpwdHIrKyA9IGhleHRhYmxlW2hhZGRyLmNbNV0gJiAweEZdOworCSpwdHIrKyA9ICcqJzsKKwkqcHRyKysgPSBrZXkuY1swXTsKKwkqcHRyKysgPSBrZXkuY1sxXTsKKwkqcHRyKysgPSBrZXkuY1syXTsKKwkqcHRyKysgPSBrZXkuY1szXTsKKworCXB0ciA9CisJICAgIFN0dWZmRGF0YShza2ItPmRhdGEgKyBzaXplb2YoU1RSSVBfSGVhZGVyKSwgbGVuLCBwdHIsCisJCSAgICAgICZzdHVmZnN0YXRlKTsKKworCWlmIChzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA+PSBDaGVja3N1bW1lZE1lc3NhZ2VzKQorCQlwdHIgPSBhZGRfY2hlY2tzdW0oYnVmZmVyICsgMSwgcHRyKTsKKworCSpwdHIrKyA9IDB4MEQ7CisJcmV0dXJuIChwdHIpOworfQorCitzdGF0aWMgdm9pZCBzdHJpcF9zZW5kKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlNZXRyaWNvbUFkZHJlc3MgaGFkZHI7CisJdW5zaWduZWQgY2hhciAqcHRyID0gc3RyaXBfaW5mby0+dHhfYnVmZjsKKwlpbnQgZG9yZXNldCA9IChsb25nKSBqaWZmaWVzIC0gc3RyaXBfaW5mby0+d2F0Y2hkb2dfZG9yZXNldCA+PSAwOworCWludCBkb3Byb2JlID0gKGxvbmcpIGppZmZpZXMgLSBzdHJpcF9pbmZvLT53YXRjaGRvZ19kb3Byb2JlID49IDAKKwkgICAgJiYgIWRvcmVzZXQ7CisJdTMyIGFkZHIsIGJyZDsKKworCS8qCisJICogMS4gSWYgd2UgaGF2ZSBhIHBhY2tldCwgZW5jYXBzdWxhdGUgaXQgYW5kIHB1dCBpdCBpbiB0aGUgYnVmZmVyCisJICovCisJaWYgKHNrYikgeworCQljaGFyICpuZXdwdHIgPSBzdHJpcF9tYWtlX3BhY2tldChwdHIsIHN0cmlwX2luZm8sIHNrYik7CisJCXN0cmlwX2luZm8tPnR4X3Bwc19jb3VudCsrOworCQlpZiAoIW5ld3B0cikKKwkJCXN0cmlwX2luZm8tPnR4X2Ryb3BwZWQrKzsKKwkJZWxzZSB7CisJCQlwdHIgPSBuZXdwdHI7CisJCQlzdHJpcF9pbmZvLT5zeF9wcHNfY291bnQrKzsKKwkJCXN0cmlwX2luZm8tPnR4X3BhY2tldHMrKzsJLyogQ291bnQgYW5vdGhlciBzdWNjZXNzZnVsIHBhY2tldCAqLworI2lmZGVmIEVYVF9DT1VOVEVSUworCQkJc3RyaXBfaW5mby0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQlzdHJpcF9pbmZvLT50eF9yYnl0ZXMgKz0gcHRyIC0gc3RyaXBfaW5mby0+dHhfYnVmZjsKKyNlbmRpZgorCQkJLypEdW1wRGF0YSgiU2VuZGluZzoiLCBzdHJpcF9pbmZvLCBzdHJpcF9pbmZvLT50eF9idWZmLCBwdHIpOyAqLworCQkJLypIZXhEdW1wKCJTZW5kaW5nIiwgc3RyaXBfaW5mbywgc3RyaXBfaW5mby0+dHhfYnVmZiwgcHRyKTsgKi8KKwkJfQorCX0KKworCS8qCisJICogMi4gSWYgaXQgaXMgdGltZSBmb3IgYW5vdGhlciB0aWNrbGUsIHRhY2sgaXQgb24sIGFmdGVyIHRoZSBwYWNrZXQKKwkgKi8KKwlpZiAoZG9wcm9iZSkgeworCQlTdHJpbmdEZXNjcmlwdG9yIHRzID0gQ29tbWFuZFN0cmluZ1tzdHJpcF9pbmZvLT5uZXh0X2NvbW1hbmRdOworI2lmIFRJQ0tMRV9USU1FUlMKKwkJeworCQkJc3RydWN0IHRpbWV2YWwgdHY7CisJCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJCXByaW50ayhLRVJOX0lORk8gIioqKiogU2VuZGluZyB0aWNrbGUgc3RyaW5nICVkICAgICAgYXQgJTAyZC4lMDZkXG4iLAorCQkJICAgICAgIHN0cmlwX2luZm8tPm5leHRfY29tbWFuZCwgdHYudHZfc2VjICUgMTAwLAorCQkJICAgICAgIHR2LnR2X3VzZWMpOworCQl9CisjZW5kaWYKKwkJaWYgKHB0ciA9PSBzdHJpcF9pbmZvLT50eF9idWZmKQorCQkJKnB0cisrID0gMHgwRDsKKworCQkqcHRyKysgPSAnKic7CS8qIEZpcnN0IHNlbmQgIioqIiB0byBwcm92b2tlIGFuIGVycm9yIG1lc3NhZ2UgKi8KKwkJKnB0cisrID0gJyonOworCisJCS8qIFRoZW4gYWRkIHRoZSBjb21tYW5kICovCisJCW1lbWNweShwdHIsIHRzLnN0cmluZywgdHMubGVuZ3RoKTsKKworCQkvKiBBZGQgYSBjaGVja3N1bSA/ICovCisJCWlmIChzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA8IENoZWNrc3VtbWVkTWVzc2FnZXMpCisJCQlwdHIgKz0gdHMubGVuZ3RoOworCQllbHNlCisJCQlwdHIgPSBhZGRfY2hlY2tzdW0ocHRyLCBwdHIgKyB0cy5sZW5ndGgpOworCisJCSpwdHIrKyA9IDB4MEQ7CS8qIFRlcm1pbmF0ZSB0aGUgY29tbWFuZCB3aXRoIGEgPENSPiAqLworCisJCS8qIEN5Y2xlIHRvIG5leHQgcGVyaW9kaWMgY29tbWFuZD8gKi8KKwkJaWYgKHN0cmlwX2luZm8tPmZpcm13YXJlX2xldmVsID49IFN0cnVjdHVyZWRNZXNzYWdlcykKKwkJCWlmICgrK3N0cmlwX2luZm8tPm5leHRfY29tbWFuZCA+PQorCQkJICAgIEFSUkFZX1NJWkUoQ29tbWFuZFN0cmluZykpCisJCQkJc3RyaXBfaW5mby0+bmV4dF9jb21tYW5kID0gMDsKKyNpZmRlZiBFWFRfQ09VTlRFUlMKKwkJc3RyaXBfaW5mby0+dHhfZWJ5dGVzICs9IHRzLmxlbmd0aDsKKyNlbmRpZgorCQlzdHJpcF9pbmZvLT53YXRjaGRvZ19kb3Byb2JlID0gamlmZmllcyArIDEwICogSFo7CisJCXN0cmlwX2luZm8tPndhdGNoZG9nX2RvcmVzZXQgPSBqaWZmaWVzICsgMSAqIEhaOworCQkvKnByaW50ayhLRVJOX0lORk8gIiVzOiBSb3V0aW5lIHJhZGlvIHRlc3QuXG4iLCBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOyAqLworCX0KKworCS8qCisJICogMy4gU2V0IHVwIHRoZSBzdHJpcF9pbmZvIHJlYWR5IHRvIHNlbmQgdGhlIGRhdGEgKGlmIGFueSkuCisJICovCisJc3RyaXBfaW5mby0+dHhfaGVhZCA9IHN0cmlwX2luZm8tPnR4X2J1ZmY7CisJc3RyaXBfaW5mby0+dHhfbGVmdCA9IHB0ciAtIHN0cmlwX2luZm8tPnR4X2J1ZmY7CisJc3RyaXBfaW5mby0+dHR5LT5mbGFncyB8PSAoMSA8PCBUVFlfRE9fV1JJVEVfV0FLRVVQKTsKKworCS8qCisJICogNC4gRGVidWdnaW5nIGNoZWNrIHRvIG1ha2Ugc3VyZSB3ZSdyZSBub3Qgb3ZlcmZsb3dpbmcgdGhlIGJ1ZmZlci4KKwkgKi8KKwlpZiAoc3RyaXBfaW5mby0+dHhfc2l6ZSAtIHN0cmlwX2luZm8tPnR4X2xlZnQgPCAyMCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogU2VuZGluZyU1ZCBieXRlczslNWQgYnl0ZXMgZnJlZS5cbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIHN0cmlwX2luZm8tPnR4X2xlZnQsCisJCSAgICAgICBzdHJpcF9pbmZvLT50eF9zaXplIC0gc3RyaXBfaW5mby0+dHhfbGVmdCk7CisKKwkvKgorCSAqIDUuIElmIHdhdGNoZG9nIGhhcyBleHBpcmVkLCByZXNldCB0aGUgcmFkaW8uIE5vdGU6IGlmIHRoZXJlJ3MgZGF0YSB3YWl0aW5nIGluCisJICogdGhlIGJ1ZmZlciwgc3RyaXBfd3JpdGVfc29tZV9tb3JlIHdpbGwgc2VuZCBpdCBhZnRlciB0aGUgcmVzZXQgaGFzIGZpbmlzaGVkCisJICovCisJaWYgKGRvcmVzZXQpIHsKKwkJUmVzZXRSYWRpbyhzdHJpcF9pbmZvKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgxKSB7CisJCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKKworCQlicmQgPSBhZGRyID0gMDsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlpbl9kZXYgPSBfX2luX2Rldl9nZXQoc3RyaXBfaW5mby0+ZGV2KTsKKwkJaWYgKGluX2RldikgeworCQkJaWYgKGluX2Rldi0+aWZhX2xpc3QpIHsKKwkJCQlicmQgPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfYnJvYWRjYXN0OworCQkJCWFkZHIgPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfbG9jYWw7CisJCQl9CisJCX0KKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJfQorCisKKwkvKgorCSAqIDYuIElmIGl0IGlzIHRpbWUgZm9yIGEgcGVyaW9kaWMgQVJQLCBxdWV1ZSBvbmUgdXAgdG8gYmUgc2VudC4KKwkgKiBXZSBvbmx5IGRvIHRoaXMgaWY6CisJICogIDEuIFRoZSByYWRpbyBpcyB3b3JraW5nCisJICogIDIuIEl0J3MgdGltZSB0byBzZW5kIGFub3RoZXIgcGVyaW9kaWMgQVJQCisJICogIDMuIFdlIHJlYWxseSBrbm93IHdoYXQgb3VyIGFkZHJlc3MgaXMgKGFuZCBpdCBpcyBub3QgbWFudWFsbHkgc2V0IHRvIHplcm8pCisJICogIDQuIFdlIGhhdmUgYSBkZXNpZ25hdGVkIGJyb2FkY2FzdCBhZGRyZXNzIGNvbmZpZ3VyZWQKKwkgKiBJZiB3ZSBxdWV1ZSB1cCBhbiBBUlAgcGFja2V0IHdoZW4gd2UgZG9uJ3QgaGF2ZSBhIGRlc2lnbmF0ZWQgYnJvYWRjYXN0CisJICogYWRkcmVzcyBjb25maWd1cmVkLCB0aGVuIHRoZSBwYWNrZXQgd2lsbCBqdXN0IGhhdmUgdG8gYmUgZGlzY2FyZGVkIGluCisJICogc3RyaXBfbWFrZV9wYWNrZXQuIFRoaXMgaXMgbm90IGZhdGFsLCBidXQgaXQgY2F1c2VzIG1pc2xlYWRpbmcgaW5mb3JtYXRpb24KKwkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGNwZHVtcC4gdGNwZHVtcCB3aWxsIHJlcG9ydCB0aGF0IHBlcmlvZGljIEFQUnMgYXJlCisJICogYmVpbmcgc2VudCwgd2hlbiBpbiBmYWN0IHRoZXkgYXJlIG5vdCwgYmVjYXVzZSB0aGV5IGFyZSBhbGwgYmVpbmcgZHJvcHBlZAorCSAqIGluIHRoZSBzdHJpcF9tYWtlX3BhY2tldCByb3V0aW5lLgorCSAqLworCWlmIChzdHJpcF9pbmZvLT53b3JraW5nCisJICAgICYmIChsb25nKSBqaWZmaWVzIC0gc3RyaXBfaW5mby0+Z3JhdHVpdG91c19hcnAgPj0gMAorCSAgICAmJiBtZW1jbXAoc3RyaXBfaW5mby0+ZGV2LT5kZXZfYWRkciwgemVyb19hZGRyZXNzLmMsCisJCSAgICAgIHNpemVvZih6ZXJvX2FkZHJlc3MpKQorCSAgICAmJiBhcnBfcXVlcnkoaGFkZHIuYywgYnJkLCBzdHJpcF9pbmZvLT5kZXYpKSB7CisJCS8qcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNlbmRpbmcgZ3JhdHVpdG91cyBBUlAgd2l0aCBpbnRlcnZhbCAlbGRcbiIsCisJCSAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgc3RyaXBfaW5mby0+YXJwX2ludGVydmFsIC8gSFopOyAqLworCQlzdHJpcF9pbmZvLT5ncmF0dWl0b3VzX2FycCA9CisJCSAgICBqaWZmaWVzICsgc3RyaXBfaW5mby0+YXJwX2ludGVydmFsOworCQlzdHJpcF9pbmZvLT5hcnBfaW50ZXJ2YWwgKj0gMjsKKwkJaWYgKHN0cmlwX2luZm8tPmFycF9pbnRlcnZhbCA+IE1heEFSUEludGVydmFsKQorCQkJc3RyaXBfaW5mby0+YXJwX2ludGVydmFsID0gTWF4QVJQSW50ZXJ2YWw7CisJCWlmIChhZGRyKQorCQkJYXJwX3NlbmQoQVJQT1BfUkVQTFksIEVUSF9QX0FSUCwgYWRkciwJLyogVGFyZ2V0IGFkZHJlc3Mgb2YgQVJQIHBhY2tldCBpcyBvdXIgYWRkcmVzcyAqLworCQkJCSBzdHJpcF9pbmZvLT5kZXYsCS8qIERldmljZSB0byBzZW5kIHBhY2tldCBvbiAqLworCQkJCSBhZGRyLAkvKiBTb3VyY2UgSVAgYWRkcmVzcyB0aGlzIEFSUCBwYWNrZXQgY29tZXMgZnJvbSAqLworCQkJCSBOVUxMLAkvKiBEZXN0aW5hdGlvbiBIVyBhZGRyZXNzIGlzIE5VTEwgKGJyb2FkY2FzdCBpdCkgKi8KKwkJCQkgc3RyaXBfaW5mby0+ZGV2LT5kZXZfYWRkciwJLyogU291cmNlIEhXIGFkZHJlc3MgaXMgb3VyIEhXIGFkZHJlc3MgKi8KKwkJCQkgc3RyaXBfaW5mby0+ZGV2LT5kZXZfYWRkcik7CS8qIFRhcmdldCBIVyBhZGRyZXNzIGlzIG91ciBIVyBhZGRyZXNzIChyZWR1bmRhbnQpICovCisJfQorCisJLyoKKwkgKiA3LiBBbGwgcmVhZHkuIFN0YXJ0IHRoZSB0cmFuc21pc3Npb24KKwkgKi8KKwlzdHJpcF93cml0ZV9zb21lX21vcmUoc3RyaXBfaW5mby0+dHR5KTsKK30KKworLyogRW5jYXBzdWxhdGUgYSBkYXRhZ3JhbSBhbmQga2ljayBpdCBpbnRvIGEgVFRZIHF1ZXVlLiAqLworc3RhdGljIGludCBzdHJpcF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHhtaXQgY2FsbCB3aGVuIGlmYWNlIGlzIGRvd25cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlyZXR1cm4gKDEpOworCX0KKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWRlbF90aW1lcigmc3RyaXBfaW5mby0+aWRsZV90aW1lcik7CisKKworCWlmIChqaWZmaWVzIC0gc3RyaXBfaW5mby0+cHBzX3RpbWVyID4gSFopIHsKKwkJdW5zaWduZWQgbG9uZyB0ID0gamlmZmllcyAtIHN0cmlwX2luZm8tPnBwc190aW1lcjsKKwkJdW5zaWduZWQgbG9uZyByeF9wcHNfY291bnQgPSAoc3RyaXBfaW5mby0+cnhfcHBzX2NvdW50ICogSFogKiA4ICsgdCAvIDIpIC8gdDsKKwkJdW5zaWduZWQgbG9uZyB0eF9wcHNfY291bnQgPSAoc3RyaXBfaW5mby0+dHhfcHBzX2NvdW50ICogSFogKiA4ICsgdCAvIDIpIC8gdDsKKwkJdW5zaWduZWQgbG9uZyBzeF9wcHNfY291bnQgPSAoc3RyaXBfaW5mby0+c3hfcHBzX2NvdW50ICogSFogKiA4ICsgdCAvIDIpIC8gdDsKKworCQlzdHJpcF9pbmZvLT5wcHNfdGltZXIgPSBqaWZmaWVzOworCQlzdHJpcF9pbmZvLT5yeF9wcHNfY291bnQgPSAwOworCQlzdHJpcF9pbmZvLT50eF9wcHNfY291bnQgPSAwOworCQlzdHJpcF9pbmZvLT5zeF9wcHNfY291bnQgPSAwOworCisJCXN0cmlwX2luZm8tPnJ4X2F2ZXJhZ2VfcHBzID0gKHN0cmlwX2luZm8tPnJ4X2F2ZXJhZ2VfcHBzICsgcnhfcHBzX2NvdW50ICsgMSkgLyAyOworCQlzdHJpcF9pbmZvLT50eF9hdmVyYWdlX3BwcyA9IChzdHJpcF9pbmZvLT50eF9hdmVyYWdlX3BwcyArIHR4X3Bwc19jb3VudCArIDEpIC8gMjsKKwkJc3RyaXBfaW5mby0+c3hfYXZlcmFnZV9wcHMgPSAoc3RyaXBfaW5mby0+c3hfYXZlcmFnZV9wcHMgKyBzeF9wcHNfY291bnQgKyAxKSAvIDI7CisKKwkJaWYgKHJ4X3Bwc19jb3VudCAvIDggPj0gMTApCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogV0FSTklORzogUmVjZWl2aW5nICVsZCBwYWNrZXRzIHBlciBzZWNvbmQuXG4iLAorCQkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgcnhfcHBzX2NvdW50IC8gOCk7CisJCWlmICh0eF9wcHNfY291bnQgLyA4ID49IDEwKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFdBUk5JTkc6IFR4ICAgICAgICAlbGQgcGFja2V0cyBwZXIgc2Vjb25kLlxuIiwKKwkJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIHR4X3Bwc19jb3VudCAvIDgpOworCQlpZiAoc3hfcHBzX2NvdW50IC8gOCA+PSAxMCkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBXQVJOSU5HOiBTZW5kaW5nICAgJWxkIHBhY2tldHMgcGVyIHNlY29uZC5cbiIsCisJCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBzeF9wcHNfY291bnQgLyA4KTsKKwl9CisKKwlzcGluX2xvY2tfYmgoJnN0cmlwX2xvY2spOworCisJc3RyaXBfc2VuZChzdHJpcF9pbmZvLCBza2IpOworCisJc3Bpbl91bmxvY2tfYmgoJnN0cmlwX2xvY2spOworCisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCisvKgorICogSWRsZVRhc2sgcGVyaW9kaWNhbGx5IGNhbGxzIHN0cmlwX3htaXQsIHNvIGV2ZW4gd2hlbiB3ZSBoYXZlIG5vIElQIHBhY2tldHMKKyAqIHRvIHNlbmQgZm9yIGFuIGV4dGVuZGVkIHBlcmlvZCBvZiB0aW1lLCB0aGUgd2F0Y2hkb2cgcHJvY2Vzc2luZyBzdGlsbCBnZXRzCisgKiBkb25lIHRvIGVuc3VyZSB0aGF0IHRoZSByYWRpbyBzdGF5cyBpbiBTdGFybW9kZQorICovCisKK3N0YXRpYyB2b2lkIHN0cmlwX0lkbGVUYXNrKHVuc2lnbmVkIGxvbmcgcGFyYW1ldGVyKQoreworCXN0cmlwX3htaXQoTlVMTCwgKHN0cnVjdCBuZXRfZGV2aWNlICopIHBhcmFtZXRlcik7Cit9CisKKy8qCisgKiBDcmVhdGUgdGhlIE1BQyBoZWFkZXIgZm9yIGFuIGFyYml0cmFyeSBwcm90b2NvbCBsYXllcgorICoKKyAqIHNhZGRyIT1OVUxMICAgICAgICBtZWFucyB1c2UgdGhpcyBzcGVjaWZpYyBhZGRyZXNzIChuL2EgZm9yIE1ldHJpY29tKQorICogc2FkZHI9PU5VTEwgICAgICAgIG1lYW5zIHVzZSBkZWZhdWx0IGRldmljZSBzb3VyY2UgYWRkcmVzcworICogZGFkZHIhPU5VTEwgICAgICAgIG1lYW5zIHVzZSB0aGlzIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqIGRhZGRyPT1OVUxMICAgICAgICBtZWFucyBsZWF2ZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGFsb25lCisgKiAgICAgICAgICAgICAgICAgKGUuZy4gdW5yZXNvbHZlZCBhcnAgLS0ga2VybmVsIHdpbGwgY2FsbAorICogICAgICAgICAgICAgICAgIHJlYnVpbGRfaGVhZGVyIGxhdGVyIHRvIGZpbGwgaW4gdGhlIGFkZHJlc3MpCisgKi8KKworc3RhdGljIGludCBzdHJpcF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXVuc2lnbmVkIHNob3J0IHR5cGUsIHZvaWQgKmRhZGRyLCB2b2lkICpzYWRkciwKKwkJCXVuc2lnbmVkIGxlbikKK3sKKwlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8gPSBuZXRkZXZfcHJpdihkZXYpOworCVNUUklQX0hlYWRlciAqaGVhZGVyID0gKFNUUklQX0hlYWRlciAqKSBza2JfcHVzaChza2IsIHNpemVvZihTVFJJUF9IZWFkZXIpKTsKKworCS8qcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHN0cmlwX2hlYWRlciAweCUwNFggJXNcbiIsIGRldi0+bmFtZSwgdHlwZSwKKwkgICB0eXBlID09IEVUSF9QX0lQID8gIklQIiA6IHR5cGUgPT0gRVRIX1BfQVJQID8gIkFSUCIgOiAiIik7ICovCisKKwloZWFkZXItPnNyY19hZGRyID0gc3RyaXBfaW5mby0+dHJ1ZV9kZXZfYWRkcjsKKwloZWFkZXItPnByb3RvY29sID0gaHRvbnModHlwZSk7CisKKwkvKkhleER1bXAoInN0cmlwX2hlYWRlciIsIG5ldGRldl9wcml2KGRldiksIHNrYi0+ZGF0YSwgc2tiLT5kYXRhICsgc2tiLT5sZW4pOyAqLworCisJaWYgKCFkYWRkcikKKwkJcmV0dXJuICgtZGV2LT5oYXJkX2hlYWRlcl9sZW4pOworCisJaGVhZGVyLT5kc3RfYWRkciA9ICooTWV0cmljb21BZGRyZXNzICopIGRhZGRyOworCXJldHVybiAoZGV2LT5oYXJkX2hlYWRlcl9sZW4pOworfQorCisvKgorICogUmVidWlsZCB0aGUgTUFDIGhlYWRlci4gVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYW4gQVJQCisgKiAob3IgaW4gZnV0dXJlIG90aGVyIGFkZHJlc3MgcmVzb2x1dGlvbikgaGFzIGNvbXBsZXRlZCBvbiB0aGlzCisgKiBza19idWZmLiBXZSBub3cgbGV0IEFSUCBmaWxsIGluIHRoZSBvdGhlciBmaWVsZHMuCisgKiBJIHRoaW5rIHRoaXMgc2hvdWxkIHJldHVybiB6ZXJvIGlmIHBhY2tldCBpcyByZWFkeSB0byBzZW5kLAorICogb3Igbm9uLXplcm8gaWYgaXQgbmVlZHMgbW9yZSB0aW1lIHRvIGRvIGFuIGFkZHJlc3MgbG9va3VwCisgKi8KKworc3RhdGljIGludCBzdHJpcF9yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworI2lmZGVmIENPTkZJR19JTkVUCisJU1RSSVBfSGVhZGVyICpoZWFkZXIgPSAoU1RSSVBfSGVhZGVyICopIHNrYi0+ZGF0YTsKKworCS8qIEFycCBmaW5kIHJldHVybnMgemVybyBpZiBpZiBrbm93cyB0aGUgYWRkcmVzcywgKi8KKwkvKiBvciBpZiBpdCBkb2Vzbid0IGtub3cgdGhlIGFkZHJlc3MgaXQgc2VuZHMgYW4gQVJQIHBhY2tldCBhbmQgcmV0dXJucyBub24temVybyAqLworCXJldHVybiBhcnBfZmluZChoZWFkZXItPmRzdF9hZGRyLmMsIHNrYikgPyAxIDogMDsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUmVjZWl2aW5nIHJvdXRpbmVzCQkJCQkJCSovCisKK3N0YXRpYyBpbnQgc3RyaXBfcmVjZWl2ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmV0dXJuIDB4MTAwMDA7CQkvKiBXZSBjYW4gaGFuZGxlIGFuIGluZmluaXRlIGFtb3VudCBvZiBkYXRhLiA6LSkgKi8KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSByZXNwb25zZSB0byB0aGUgQVRTMzAwPyBjb21tYW5kLAorICogZXh0cmFjdGluZyB0aGUgcmFkaW8gdmVyc2lvbiBhbmQgc2VyaWFsIG51bWJlci4KKyAqLworc3RhdGljIHZvaWQgZ2V0X3JhZGlvX3ZlcnNpb24oc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvLCBfX3U4ICogcHRyLCBfX3U4ICogZW5kKQoreworCV9fdTggKnAsICp2YWx1ZV9iZWdpbiwgKnZhbHVlX2VuZDsKKwlpbnQgbGVuOworCisJLyogRGV0ZXJtaW5lIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY29uZCBsaW5lIG9mIHRoZSBwYXlsb2FkICovCisJcCA9IHB0cjsKKwl3aGlsZSAocCA8IGVuZCAmJiAqcCAhPSAxMCkKKwkJcCsrOworCWlmIChwID49IGVuZCkKKwkJcmV0dXJuOworCXArKzsKKwl2YWx1ZV9iZWdpbiA9IHA7CisKKwkvKiBEZXRlcm1pbmUgdGhlIGVuZCBvZiBsaW5lICovCisJd2hpbGUgKHAgPCBlbmQgJiYgKnAgIT0gMTApCisJCXArKzsKKwlpZiAocCA+PSBlbmQpCisJCXJldHVybjsKKwl2YWx1ZV9lbmQgPSBwOworCXArKzsKKworCWxlbiA9IHZhbHVlX2VuZCAtIHZhbHVlX2JlZ2luOworCWxlbiA9IG1pbl90KGludCwgbGVuLCBzaXplb2YoRmlybXdhcmVWZXJzaW9uKSAtIDEpOworCWlmIChzdHJpcF9pbmZvLT5maXJtd2FyZV92ZXJzaW9uLmNbMF0gPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJhZGlvIEZpcm13YXJlOiAlLipzXG4iLAorCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBsZW4sIHZhbHVlX2JlZ2luKTsKKwlzcHJpbnRmKHN0cmlwX2luZm8tPmZpcm13YXJlX3ZlcnNpb24uYywgIiUuKnMiLCBsZW4sIHZhbHVlX2JlZ2luKTsKKworCS8qIExvb2sgZm9yIHRoZSBmaXJzdCBjb2xvbiAqLworCXdoaWxlIChwIDwgZW5kICYmICpwICE9ICc6JykKKwkJcCsrOworCWlmIChwID49IGVuZCkKKwkJcmV0dXJuOworCS8qIFNraXAgb3ZlciB0aGUgc3BhY2UgKi8KKwlwICs9IDI7CisJbGVuID0gc2l6ZW9mKFNlcmlhbE51bWJlcikgLSAxOworCWlmIChwICsgbGVuIDw9IGVuZCkgeworCQlzcHJpbnRmKHN0cmlwX2luZm8tPnNlcmlhbF9udW1iZXIuYywgIiUuKnMiLCBsZW4sIHApOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiU1RSSVA6IHJhZGlvIHNlcmlhbCBudW1iZXIgc2hvcnRlciAoJXpkKSB0aGFuIGV4cGVjdGVkICglZClcbiIsCisJCSAgICAgICBlbmQgLSBwLCBsZW4pOworCX0KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSByZXNwb25zZSB0byB0aGUgQVRTMzI1PyBjb21tYW5kLAorICogZXh0cmFjdGluZyB0aGUgcmFkaW8gYmF0dGVyeSB2b2x0YWdlLgorICovCitzdGF0aWMgdm9pZCBnZXRfcmFkaW9fdm9sdGFnZShzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sIF9fdTggKiBwdHIsIF9fdTggKiBlbmQpCit7CisJaW50IGxlbjsKKworCWxlbiA9IHNpemVvZihCYXR0ZXJ5Vm9sdGFnZSkgLSAxOworCWlmIChwdHIgKyBsZW4gPD0gZW5kKSB7CisJCXNwcmludGYoc3RyaXBfaW5mby0+YmF0dGVyeV92b2x0YWdlLmMsICIlLipzIiwgbGVuLCBwdHIpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiU1RSSVA6IHJhZGlvIHZvbHRhZ2Ugc3RyaW5nIHNob3J0ZXIgKCV6ZCkgdGhhbiBleHBlY3RlZCAoJWQpXG4iLAorCQkgICAgICAgZW5kIC0gcHRyLCBsZW4pOworCX0KK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSByZXNwb25zZXMgdG8gdGhlIEFUfkxBIGFuZCBBVFMzMTEgY29tbWFuZHMsCisgKiB3aGljaCBsaXN0IHRoZSByYWRpbydzIG5laWdoYm91cnMuCisgKi8KK3N0YXRpYyB2b2lkIGdldF9yYWRpb19uZWlnaGJvdXJzKE1ldHJpY29tTm9kZVRhYmxlICogdGFibGUsIF9fdTggKiBwdHIsIF9fdTggKiBlbmQpCit7CisJdGFibGUtPm51bV9ub2RlcyA9IDA7CisJd2hpbGUgKHB0ciA8IGVuZCAmJiB0YWJsZS0+bnVtX25vZGVzIDwgTk9ERV9UQUJMRV9TSVpFKSB7CisJCU1ldHJpY29tTm9kZSAqbm9kZSA9ICZ0YWJsZS0+bm9kZVt0YWJsZS0+bnVtX25vZGVzKytdOworCQljaGFyICpkc3QgPSBub2RlLT5jLCAqbGltaXQgPSBkc3QgKyBzaXplb2YoKm5vZGUpIC0gMTsKKwkJd2hpbGUgKHB0ciA8IGVuZCAmJiAqcHRyIDw9IDMyKQorCQkJcHRyKys7CisJCXdoaWxlIChwdHIgPCBlbmQgJiYgZHN0IDwgbGltaXQgJiYgKnB0ciAhPSAxMCkKKwkJCSpkc3QrKyA9ICpwdHIrKzsKKwkJKmRzdCsrID0gMDsKKwkJd2hpbGUgKHB0ciA8IGVuZCAmJiBwdHJbLTFdICE9IDEwKQorCQkJcHRyKys7CisJfQorCWRvX2dldHRpbWVvZmRheSgmdGFibGUtPnRpbWVzdGFtcCk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3JhZGlvX2FkZHJlc3Moc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvLCBfX3U4ICogcCkKK3sKKwlNZXRyaWNvbUFkZHJlc3MgYWRkcjsKKworCWlmIChzdHJpbmdfdG9fcmFkaW9fYWRkcmVzcygmYWRkciwgcCkpCisJCXJldHVybiAoMSk7CisKKwkvKiBTZWUgaWYgb3VyIHJhZGlvIGFkZHJlc3MgaGFzIGNoYW5nZWQgKi8KKwlpZiAobWVtY21wKHN0cmlwX2luZm8tPnRydWVfZGV2X2FkZHIuYywgYWRkci5jLCBzaXplb2YoYWRkcikpKSB7CisJCU1ldHJpY29tQWRkcmVzc1N0cmluZyBhZGRyX3N0cmluZzsKKwkJcmFkaW9fYWRkcmVzc190b19zdHJpbmcoJmFkZHIsICZhZGRyX3N0cmluZyk7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBSYWRpbyBhZGRyZXNzID0gJXNcbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIGFkZHJfc3RyaW5nLmMpOworCQlzdHJpcF9pbmZvLT50cnVlX2Rldl9hZGRyID0gYWRkcjsKKwkJaWYgKCFzdHJpcF9pbmZvLT5tYW51YWxfZGV2X2FkZHIpCisJCQkqKE1ldHJpY29tQWRkcmVzcyAqKSBzdHJpcF9pbmZvLT5kZXYtPmRldl9hZGRyID0KKwkJCSAgICBhZGRyOworCQkvKiBHaXZlIHRoZSByYWRpbyBhIGZldyBzZWNvbmRzIHRvIGdldCBpdHMgaGVhZCBzdHJhaWdodCwgdGhlbiBzZW5kIGFuIGFycCAqLworCQlzdHJpcF9pbmZvLT5ncmF0dWl0b3VzX2FycCA9IGppZmZpZXMgKyAxNSAqIEhaOworCQlzdHJpcF9pbmZvLT5hcnBfaW50ZXJ2YWwgPSAxICogSFo7CisJfQorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X2NoZWNrc3VtKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbykKK3sKKwlfX3U4ICpwID0gc3RyaXBfaW5mby0+c3hfYnVmZjsKKwlfX3U4ICplbmQgPSBzdHJpcF9pbmZvLT5zeF9idWZmICsgc3RyaXBfaW5mby0+c3hfY291bnQgLSA0OworCXVfc2hvcnQgc3VtID0KKwkgICAgKFJFQURIRVgxNihlbmRbMF0pIDw8IDEyKSB8IChSRUFESEVYMTYoZW5kWzFdKSA8PCA4KSB8CisJICAgIChSRUFESEVYMTYoZW5kWzJdKSA8PCA0KSB8IChSRUFESEVYMTYoZW5kWzNdKSk7CisJd2hpbGUgKHAgPCBlbmQpCisJCXN1bSAtPSAqcCsrOworCWlmIChzdW0gPT0gMCAmJiBzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA9PSBTdHJ1Y3R1cmVkTWVzc2FnZXMpIHsKKwkJc3RyaXBfaW5mby0+ZmlybXdhcmVfbGV2ZWwgPSBDaGVja3N1bW1lZE1lc3NhZ2VzOworCQlwcmludGsoS0VSTl9JTkZPICIlczogUmFkaW8gcHJvdmlkZXMgbWVzc2FnZSBjaGVja3N1bXNcbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCX0KKwlyZXR1cm4gKHN1bSA9PSAwKTsKK30KKworc3RhdGljIHZvaWQgUmVjdkVycihjaGFyICptc2csIHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbykKK3sKKwlfX3U4ICpwdHIgPSBzdHJpcF9pbmZvLT5zeF9idWZmOworCV9fdTggKmVuZCA9IHN0cmlwX2luZm8tPnN4X2J1ZmYgKyBzdHJpcF9pbmZvLT5zeF9jb3VudDsKKwlEdW1wRGF0YShtc2csIHN0cmlwX2luZm8sIHB0ciwgZW5kKTsKKwlzdHJpcF9pbmZvLT5yeF9lcnJvcnMrKzsKK30KKworc3RhdGljIHZvaWQgUmVjdkVycl9NZXNzYWdlKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbywgX191OCAqIHNlbmRlcm5hbWUsCisJCQkgICAgY29uc3QgX191OCAqIG1zZywgdV9sb25nIGxlbikKK3sKKwlpZiAoaGFzX3ByZWZpeChtc2csIGxlbiwgIjAwMSIpKSB7CS8qIE5vdCBpbiBTdGFyTW9kZSEgKi8KKwkJUmVjdkVycigiRXJyb3IgTXNnOiIsIHN0cmlwX2luZm8pOworCQlwcmludGsoS0VSTl9JTkZPICIlczogUmFkaW8gJXMgaXMgbm90IGluIFN0YXJNb2RlXG4iLAorCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLCBzZW5kZXJuYW1lKTsKKwl9CisKKwllbHNlIGlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiMDAyIikpIHsJLyogUmVtYXAgaGFuZGxlICovCisJCS8qIFdlIGlnbm9yZSAiUmVtYXAgaGFuZGxlIiBtZXNzYWdlcyBmb3Igbm93ICovCisJfQorCisJZWxzZSBpZiAoaGFzX3ByZWZpeChtc2csIGxlbiwgIjAwMyIpKSB7CS8qIENhbid0IHJlc29sdmUgbmFtZSAqLworCQlSZWN2RXJyKCJFcnJvciBNc2c6Iiwgc3RyaXBfaW5mbyk7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBEZXN0aW5hdGlvbiByYWRpbyBuYW1lIGlzIHVua25vd25cbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCX0KKworCWVsc2UgaWYgKGhhc19wcmVmaXgobXNnLCBsZW4sICIwMDQiKSkgewkvKiBOYW1lIHRvbyBzbWFsbCBvciBtaXNzaW5nICovCisJCXN0cmlwX2luZm8tPndhdGNoZG9nX2RvcmVzZXQgPSBqaWZmaWVzICsgTG9uZ1RpbWU7CisjaWYgVElDS0xFX1RJTUVSUworCQl7CisJCQlzdHJ1Y3QgdGltZXZhbCB0djsKKwkJCWRvX2dldHRpbWVvZmRheSgmdHYpOworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICIqKioqIEdvdCBFUlJfMDA0IHJlc3BvbnNlICAgICAgICAgYXQgJTAyZC4lMDZkXG4iLAorCQkJICAgICAgIHR2LnR2X3NlYyAlIDEwMCwgdHYudHZfdXNlYyk7CisJCX0KKyNlbmRpZgorCQlpZiAoIXN0cmlwX2luZm8tPndvcmtpbmcpIHsKKwkJCXN0cmlwX2luZm8tPndvcmtpbmcgPSBUUlVFOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJhZGlvIG5vdyBpbiBzdGFybW9kZVxuIiwKKwkJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUpOworCQkJLyoKKwkJCSAqIElmIHRoZSByYWRpbyBoYXMganVzdCBlbnRlcmVkIGEgd29ya2luZyBzdGF0ZSwgd2Ugc2hvdWxkIGRvIG91ciBmaXJzdAorCQkJICogcHJvYmUgQVNBUCwgc28gdGhhdCB3ZSBmaW5kIG91dCBvdXIgcmFkaW8gYWRkcmVzcyBldGMuIHdpdGhvdXQgZGVsYXkuCisJCQkgKi8KKwkJCXN0cmlwX2luZm8tPndhdGNoZG9nX2RvcHJvYmUgPSBqaWZmaWVzOworCQl9CisJCWlmIChzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA9PSBOb1N0cnVjdHVyZSAmJiBzZW5kZXJuYW1lKSB7CisJCQlzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA9IFN0cnVjdHVyZWRNZXNzYWdlczsKKwkJCXN0cmlwX2luZm8tPm5leHRfY29tbWFuZCA9IDA7CS8qIFRyeSB0byBlbmFibGUgY2hlY2tzdW1zIEFTQVAgKi8KKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAiJXM6IFJhZGlvIHByb3ZpZGVzIHN0cnVjdHVyZWQgbWVzc2FnZXNcbiIsCisJCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKwkJfQorCQlpZiAoc3RyaXBfaW5mby0+ZmlybXdhcmVfbGV2ZWwgPj0gU3RydWN0dXJlZE1lc3NhZ2VzKSB7CisJCQkvKgorCQkJICogSWYgdGhpcyBtZXNzYWdlIGhhcyBhIHZhbGlkIGNoZWNrc3VtIG9uIHRoZSBlbmQsIHRoZW4gdGhlIGNhbGwgdG8gdmVyaWZ5X2NoZWNrc3VtCisJCQkgKiB3aWxsIGVsZXZhdGUgdGhlIGZpcm13YXJlX2xldmVsIHRvIENoZWNrc3VtbWVkTWVzc2FnZXMgZm9yIHVzLiAoVGhlIGFjdHVhbCByZXR1cm4KKwkJCSAqIGNvZGUgZnJvbSB2ZXJpZnlfY2hlY2tzdW0gaXMgaWdub3JlZCBoZXJlLikKKwkJCSAqLworCQkJdmVyaWZ5X2NoZWNrc3VtKHN0cmlwX2luZm8pOworCQkJLyoKKwkJCSAqIElmIHRoZSByYWRpbyBoYXMgc3RydWN0dXJlZCBtZXNzYWdlcyBidXQgd2UgZG9uJ3QgeWV0IGhhdmUgYWxsIG91ciBpbmZvcm1hdGlvbiBhYm91dCBpdCwKKwkJCSAqIHdlIHNob3VsZCBkbyBwcm9iZXMgd2l0aG91dCBkZWxheSwgdW50aWwgd2UgaGF2ZSBnYXRoZXJlZCBhbGwgdGhlIGluZm9ybWF0aW9uCisJCQkgKi8KKwkJCWlmICghR09UX0FMTF9SQURJT19JTkZPKHN0cmlwX2luZm8pKQorCQkJCXN0cmlwX2luZm8tPndhdGNoZG9nX2RvcHJvYmUgPSBqaWZmaWVzOworCQl9CisJfQorCisJZWxzZSBpZiAoaGFzX3ByZWZpeChtc2csIGxlbiwgIjAwNSIpKQkvKiBCYWQgY291bnQgc3BlY2lmaWNhdGlvbiAqLworCQlSZWN2RXJyKCJFcnJvciBNc2c6Iiwgc3RyaXBfaW5mbyk7CisKKwllbHNlIGlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiMDA2IikpCS8qIEhlYWRlciB0b28gYmlnICovCisJCVJlY3ZFcnIoIkVycm9yIE1zZzoiLCBzdHJpcF9pbmZvKTsKKworCWVsc2UgaWYgKGhhc19wcmVmaXgobXNnLCBsZW4sICIwMDciKSkgewkvKiBCb2R5IHRvbyBiaWcgKi8KKwkJUmVjdkVycigiRXJyb3IgTXNnOiIsIHN0cmlwX2luZm8pOworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogRXJyb3IhIFBhY2tldCBzaXplIHRvbyBiaWcgZm9yIHJhZGlvLlxuIiwKKwkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSk7CisJfQorCisJZWxzZSBpZiAoaGFzX3ByZWZpeChtc2csIGxlbiwgIjAwOCIpKSB7CS8qIEJhZCBjaGFyYWN0ZXIgaW4gbmFtZSAqLworCQlSZWN2RXJyKCJFcnJvciBNc2c6Iiwgc3RyaXBfaW5mbyk7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIiVzOiBSYWRpbyBuYW1lIGNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVyXG4iLAorCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKwl9CisKKwllbHNlIGlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiMDA5IikpCS8qIE5vIGNvdW50IG9yIGxpbmUgdGVybWluYXRvciAqLworCQlSZWN2RXJyKCJFcnJvciBNc2c6Iiwgc3RyaXBfaW5mbyk7CisKKwllbHNlIGlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiMDEwIikpCS8qIEludmFsaWQgY2hlY2tzdW0gKi8KKwkJUmVjdkVycigiRXJyb3IgTXNnOiIsIHN0cmlwX2luZm8pOworCisJZWxzZSBpZiAoaGFzX3ByZWZpeChtc2csIGxlbiwgIjAxMSIpKQkvKiBDaGVja3N1bSBkaWRuJ3QgbWF0Y2ggKi8KKwkJUmVjdkVycigiRXJyb3IgTXNnOiIsIHN0cmlwX2luZm8pOworCisJZWxzZSBpZiAoaGFzX3ByZWZpeChtc2csIGxlbiwgIjAxMiIpKQkvKiBGYWlsZWQgdG8gdHJhbnNtaXQgcGFja2V0ICovCisJCVJlY3ZFcnIoIkVycm9yIE1zZzoiLCBzdHJpcF9pbmZvKTsKKworCWVsc2UKKwkJUmVjdkVycigiRXJyb3IgTXNnOiIsIHN0cmlwX2luZm8pOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX0FUX3Jlc3BvbnNlKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbywgX191OCAqIHB0ciwKKwkJCQlfX3U4ICogZW5kKQoreworCXVfbG9uZyBsZW47CisJX191OCAqcCA9IHB0cjsKKwl3aGlsZSAocCA8IGVuZCAmJiBwWy0xXSAhPSAxMCkKKwkJcCsrOwkJLyogU2tpcCBwYXN0IGZpcnN0IG5ld2xpbmUgY2hhcmFjdGVyICovCisJLyogTm93IHB0ciBwb2ludHMgdG8gdGhlIEFUIGNvbW1hbmQsIGFuZCBwIHBvaW50cyB0byB0aGUgdGV4dCBvZiB0aGUgcmVzcG9uc2UuICovCisJbGVuID0gcCAtIHB0cjsKKworI2lmIFRJQ0tMRV9USU1FUlMKKwl7CisJCXN0cnVjdCB0aW1ldmFsIHR2OworCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiKioqKiBHb3QgQVQgcmVzcG9uc2UgJS43cyAgICAgIGF0ICUwMmQuJTA2ZFxuIiwKKwkJICAgICAgIHB0ciwgdHYudHZfc2VjICUgMTAwLCB0di50dl91c2VjKTsKKwl9CisjZW5kaWYKKworCWlmIChoYXNfcHJlZml4KHB0ciwgbGVuLCAiQVRTMzAwPyIpKQorCQlnZXRfcmFkaW9fdmVyc2lvbihzdHJpcF9pbmZvLCBwLCBlbmQpOworCWVsc2UgaWYgKGhhc19wcmVmaXgocHRyLCBsZW4sICJBVFMzMDU/IikpCisJCWdldF9yYWRpb19hZGRyZXNzKHN0cmlwX2luZm8sIHApOworCWVsc2UgaWYgKGhhc19wcmVmaXgocHRyLCBsZW4sICJBVFMzMTE/IikpCisJCWdldF9yYWRpb19uZWlnaGJvdXJzKCZzdHJpcF9pbmZvLT5wb2xldG9wcywgcCwgZW5kKTsKKwllbHNlIGlmIChoYXNfcHJlZml4KHB0ciwgbGVuLCAiQVRTMzE5PTciKSkKKwkJdmVyaWZ5X2NoZWNrc3VtKHN0cmlwX2luZm8pOworCWVsc2UgaWYgKGhhc19wcmVmaXgocHRyLCBsZW4sICJBVFMzMjU/IikpCisJCWdldF9yYWRpb192b2x0YWdlKHN0cmlwX2luZm8sIHAsIGVuZCk7CisJZWxzZSBpZiAoaGFzX3ByZWZpeChwdHIsIGxlbiwgIkFUfkxBIikpCisJCWdldF9yYWRpb19uZWlnaGJvdXJzKCZzdHJpcF9pbmZvLT5wb3J0YWJsZXMsIHAsIGVuZCk7CisJZWxzZQorCQlSZWN2RXJyKCJVbmtub3duIEFUIFJlc3BvbnNlOiIsIHN0cmlwX2luZm8pOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX0FDSyhzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sIF9fdTggKiBwdHIsIF9fdTggKiBlbmQpCit7CisJLyogQ3VycmVudGx5IHdlIGRvbid0IGRvIGFueXRoaW5nIHdpdGggQUNLcyBmcm9tIHRoZSByYWRpbyAqLworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX0luZm8oc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvLCBfX3U4ICogcHRyLCBfX3U4ICogZW5kKQoreworCWlmIChwdHIgKyAxNiA+IGVuZCkKKwkJUmVjdkVycigiQmFkIEluZm8gTXNnOiIsIHN0cmlwX2luZm8pOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmdldF9zdHJpcF9kZXYoc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvKQoreworCS8qIElmIG91ciBoYXJkd2FyZSBhZGRyZXNzIGlzICptYW51YWxseSBzZXQqIHRvIHplcm8sIGFuZCB3ZSBrbm93IG91ciAqLworCS8qIHJlYWwgcmFkaW8gaGFyZHdhcmUgYWRkcmVzcywgdHJ5IHRvIGZpbmQgYW5vdGhlciBzdHJpcCBkZXZpY2UgdGhhdCBoYXMgYmVlbiAqLworCS8qIG1hbnVhbGx5IHNldCB0byB0aGF0IGFkZHJlc3MgdGhhdCB3ZSBjYW4gJ3RyYW5zZmVyIG93bmVyc2hpcCcgb2YgdGhpcyBwYWNrZXQgdG8gICovCisJaWYgKHN0cmlwX2luZm8tPm1hbnVhbF9kZXZfYWRkciAmJgorCSAgICAhbWVtY21wKHN0cmlwX2luZm8tPmRldi0+ZGV2X2FkZHIsIHplcm9fYWRkcmVzcy5jLAorCQkgICAgc2l6ZW9mKHplcm9fYWRkcmVzcykpCisJICAgICYmIG1lbWNtcCgmc3RyaXBfaW5mby0+dHJ1ZV9kZXZfYWRkciwgemVyb19hZGRyZXNzLmMsCisJCSAgICAgIHNpemVvZih6ZXJvX2FkZHJlc3MpKSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCQlyZWFkX2xvY2tfYmgoJmRldl9iYXNlX2xvY2spOworCQlkZXYgPSBkZXZfYmFzZTsKKwkJd2hpbGUgKGRldikgeworCQkJaWYgKGRldi0+dHlwZSA9PSBzdHJpcF9pbmZvLT5kZXYtPnR5cGUgJiYKKwkJCSAgICAhbWVtY21wKGRldi0+ZGV2X2FkZHIsCisJCQkJICAgICZzdHJpcF9pbmZvLT50cnVlX2Rldl9hZGRyLAorCQkJCSAgICBzaXplb2YoTWV0cmljb21BZGRyZXNzKSkpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJICAgICAgICIlczogVHJhbnNmZXJyZWQgcGFja2V0IG93bmVyc2hpcCB0byAlcy5cbiIsCisJCQkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgZGV2LT5uYW1lKTsKKwkJCQlyZWFkX3VubG9ja19iaCgmZGV2X2Jhc2VfbG9jayk7CisJCQkJcmV0dXJuIChkZXYpOworCQkJfQorCQkJZGV2ID0gZGV2LT5uZXh0OworCQl9CisJCXJlYWRfdW5sb2NrX2JoKCZkZXZfYmFzZV9sb2NrKTsKKwl9CisJcmV0dXJuIChzdHJpcF9pbmZvLT5kZXYpOworfQorCisvKgorICogU2VuZCBvbmUgY29tcGxldGVseSBkZWNhcHN1bGF0ZWQgZGF0YWdyYW0gdG8gdGhlIG5leHQgbGF5ZXIuCisgKi8KKworc3RhdGljIHZvaWQgZGVsaXZlcl9wYWNrZXQoc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvLCBTVFJJUF9IZWFkZXIgKiBoZWFkZXIsCisJCQkgICBfX3UxNiBwYWNrZXRsZW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKFNUUklQX0hlYWRlcikgKyBwYWNrZXRsZW4pOworCWlmICghc2tiKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IG1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLAorCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKwkJc3RyaXBfaW5mby0+cnhfZHJvcHBlZCsrOworCX0gZWxzZSB7CisJCW1lbWNweShza2JfcHV0KHNrYiwgc2l6ZW9mKFNUUklQX0hlYWRlcikpLCBoZWFkZXIsCisJCSAgICAgICBzaXplb2YoU1RSSVBfSGVhZGVyKSk7CisJCW1lbWNweShza2JfcHV0KHNrYiwgcGFja2V0bGVuKSwgc3RyaXBfaW5mby0+cnhfYnVmZiwKKwkJICAgICAgIHBhY2tldGxlbik7CisJCXNrYi0+ZGV2ID0gZ2V0X3N0cmlwX2RldihzdHJpcF9pbmZvKTsKKwkJc2tiLT5wcm90b2NvbCA9IGhlYWRlci0+cHJvdG9jb2w7CisJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKworCQkvKiBIYXZpbmcgcHV0IGEgZmFrZSBoZWFkZXIgb24gdGhlIGZyb250IG9mIHRoZSBza19idWZmIGZvciB0aGUgKi8KKwkJLyogYmVuZWZpdCBvZiB0b29scyBsaWtlIHRjcGR1bXAsIHNrYl9wdWxsIG5vdyAnY29uc3VtZXMnIHRoYXQgICovCisJCS8qIGZha2UgaGVhZGVyIGJlZm9yZSB3ZSBoYW5kIHRoZSBwYWNrZXQgdXAgdG8gdGhlIG5leHQgbGF5ZXIuICAqLworCQlza2JfcHVsbChza2IsIHNpemVvZihTVFJJUF9IZWFkZXIpKTsKKworCQkvKiBGaW5hbGx5LCBoYW5kIHRoZSBwYWNrZXQgdXAgdG8gdGhlIG5leHQgbGF5ZXIgKGUuZy4gSVAgb3IgQVJQLCBldGMuKSAqLworCQlzdHJpcF9pbmZvLT5yeF9wYWNrZXRzKys7CisJCXN0cmlwX2luZm8tPnJ4X3Bwc19jb3VudCsrOworI2lmZGVmIEVYVF9DT1VOVEVSUworCQlzdHJpcF9pbmZvLT5yeF9ieXRlcyArPSBwYWNrZXRsZW47CisjZW5kaWYKKwkJc2tiLT5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQluZXRpZl9yeChza2IpOworCX0KK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19JUF9wYWNrZXQoc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvLAorCQkJICAgICAgU1RSSVBfSGVhZGVyICogaGVhZGVyLCBfX3U4ICogcHRyLAorCQkJICAgICAgX191OCAqIGVuZCkKK3sKKwlfX3UxNiBwYWNrZXRsZW47CisKKwkvKiBEZWNvZGUgc3RhcnQgb2YgdGhlIElQIHBhY2tldCBoZWFkZXIgKi8KKwlwdHIgPSBVblN0dWZmRGF0YShwdHIsIGVuZCwgc3RyaXBfaW5mby0+cnhfYnVmZiwgNCk7CisJaWYgKCFwdHIpIHsKKwkJUmVjdkVycigiSVAgUGFja2V0IHRvbyBzaG9ydCIsIHN0cmlwX2luZm8pOworCQlyZXR1cm47CisJfQorCisJcGFja2V0bGVuID0gKChfX3UxNikgc3RyaXBfaW5mby0+cnhfYnVmZlsyXSA8PCA4KSB8IHN0cmlwX2luZm8tPnJ4X2J1ZmZbM107CisKKwlpZiAocGFja2V0bGVuID4gTUFYX1JFQ1ZfTVRVKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBEcm9wcGluZyBvdmVyc2l6ZWQgcmVjZWl2ZWQgSVAgcGFja2V0OiAlZCBieXRlc1xuIiwKKwkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgcGFja2V0bGVuKTsKKwkJc3RyaXBfaW5mby0+cnhfZHJvcHBlZCsrOworCQlyZXR1cm47CisJfQorCisJLypwcmludGsoS0VSTl9JTkZPICIlczogR290ICVkIGJ5dGUgSVAgcGFja2V0XG4iLCBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIHBhY2tldGxlbik7ICovCisKKwkvKiBEZWNvZGUgcmVtYWluZGVyIG9mIHRoZSBJUCBwYWNrZXQgKi8KKwlwdHIgPQorCSAgICBVblN0dWZmRGF0YShwdHIsIGVuZCwgc3RyaXBfaW5mby0+cnhfYnVmZiArIDQsIHBhY2tldGxlbiAtIDQpOworCWlmICghcHRyKSB7CisJCVJlY3ZFcnIoIklQIFBhY2tldCB0b28gc2hvcnQiLCBzdHJpcF9pbmZvKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwdHIgPCBlbmQpIHsKKwkJUmVjdkVycigiSVAgUGFja2V0IHRvbyBsb25nIiwgc3RyaXBfaW5mbyk7CisJCXJldHVybjsKKwl9CisKKwloZWFkZXItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOworCisJZGVsaXZlcl9wYWNrZXQoc3RyaXBfaW5mbywgaGVhZGVyLCBwYWNrZXRsZW4pOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX0FSUF9wYWNrZXQoc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvLAorCQkJICAgICAgIFNUUklQX0hlYWRlciAqIGhlYWRlciwgX191OCAqIHB0ciwKKwkJCSAgICAgICBfX3U4ICogZW5kKQoreworCV9fdTE2IHBhY2tldGxlbjsKKwlzdHJ1Y3QgYXJwaGRyICphcnBoZHIgPSAoc3RydWN0IGFycGhkciAqKSBzdHJpcF9pbmZvLT5yeF9idWZmOworCisJLyogRGVjb2RlIHN0YXJ0IG9mIHRoZSBBUlAgcGFja2V0ICovCisJcHRyID0gVW5TdHVmZkRhdGEocHRyLCBlbmQsIHN0cmlwX2luZm8tPnJ4X2J1ZmYsIDgpOworCWlmICghcHRyKSB7CisJCVJlY3ZFcnIoIkFSUCBQYWNrZXQgdG9vIHNob3J0Iiwgc3RyaXBfaW5mbyk7CisJCXJldHVybjsKKwl9CisKKwlwYWNrZXRsZW4gPSA4ICsgKGFycGhkci0+YXJfaGxuICsgYXJwaGRyLT5hcl9wbG4pICogMjsKKworCWlmIChwYWNrZXRsZW4gPiBNQVhfUkVDVl9NVFUpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiBEcm9wcGluZyBvdmVyc2l6ZWQgcmVjZWl2ZWQgQVJQIHBhY2tldDogJWQgYnl0ZXNcbiIsCisJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIHBhY2tldGxlbik7CisJCXN0cmlwX2luZm8tPnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKworCS8qcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdvdCAlZCBieXRlIEFSUCAlc1xuIiwKKwkgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIHBhY2tldGxlbiwKKwkgICBudG9ocyhhcnBoZHItPmFyX29wKSA9PSBBUlBPUF9SRVFVRVNUID8gInJlcXVlc3QiIDogInJlcGx5Iik7ICovCisKKwkvKiBEZWNvZGUgcmVtYWluZGVyIG9mIHRoZSBBUlAgcGFja2V0ICovCisJcHRyID0KKwkgICAgVW5TdHVmZkRhdGEocHRyLCBlbmQsIHN0cmlwX2luZm8tPnJ4X2J1ZmYgKyA4LCBwYWNrZXRsZW4gLSA4KTsKKwlpZiAoIXB0cikgeworCQlSZWN2RXJyKCJBUlAgUGFja2V0IHRvbyBzaG9ydCIsIHN0cmlwX2luZm8pOworCQlyZXR1cm47CisJfQorCisJaWYgKHB0ciA8IGVuZCkgeworCQlSZWN2RXJyKCJBUlAgUGFja2V0IHRvbyBsb25nIiwgc3RyaXBfaW5mbyk7CisJCXJldHVybjsKKwl9CisKKwloZWFkZXItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQVJQKTsKKworCWRlbGl2ZXJfcGFja2V0KHN0cmlwX2luZm8sIGhlYWRlciwgcGFja2V0bGVuKTsKK30KKworLyoKKyAqIHByb2Nlc3NfdGV4dF9tZXNzYWdlIHByb2Nlc3NlcyBhIDxDUj4tdGVybWluYXRlZCBibG9jayBvZiBkYXRhIHJlY2VpdmVkCisgKiBmcm9tIHRoZSByYWRpbyB0aGF0IGRvZXNuJ3QgYmVnaW4gd2l0aCBhICcqJyBjaGFyYWN0ZXIuIEFsbCBub3JtYWwKKyAqIFN0YXJtb2RlIGNvbW11bmljYXRpb24gbWVzc2FnZXMgd2l0aCB0aGUgcmFkaW8gYmVnaW4gd2l0aCBhICcqJywKKyAqIHNvIGFueSB0ZXh0IHRoYXQgZG9lcyBub3QgaW5kaWNhdGVzIGEgc2VyaWFsIHBvcnQgZXJyb3IsIGEgcmFkaW8gdGhhdAorICogaXMgaW4gSGF5ZXMgY29tbWFuZCBtb2RlIGluc3RlYWQgb2YgU3Rhcm1vZGUsIG9yIGEgcmFkaW8gd2l0aCByZWFsbHkKKyAqIG9sZCBmaXJtd2FyZSB0aGF0IGRvZXNuJ3QgZnJhbWUgaXRzIFN0YXJtb2RlIHJlc3BvbnNlcyBwcm9wZXJseS4KKyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc190ZXh0X21lc3NhZ2Uoc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvKQoreworCV9fdTggKm1zZyA9IHN0cmlwX2luZm8tPnN4X2J1ZmY7CisJaW50IGxlbiA9IHN0cmlwX2luZm8tPnN4X2NvdW50OworCisJLyogQ2hlY2sgZm9yIGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZSBpdCBtaWdodCBiZSBvdXIgcmFkaW8gbmFtZSAqLworCS8qIChUaGlzIGlzIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGZpcm13YXJlKSAgKi8KKwlpZiAobGVuID09IDkgJiYgZ2V0X3JhZGlvX2FkZHJlc3Moc3RyaXBfaW5mbywgbXNnKSA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAodGV4dF9lcXVhbChtc2csIGxlbiwgIk9LIikpCisJCXJldHVybjsJCS8qIElnbm9yZSAnT0snIHJlc3BvbnNlcyBmcm9tIHByaW9yIGNvbW1hbmRzICovCisJaWYgKHRleHRfZXF1YWwobXNnLCBsZW4sICJFUlJPUiIpKQorCQlyZXR1cm47CQkvKiBJZ25vcmUgJ0VSUk9SJyBtZXNzYWdlcyAqLworCWlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiYXRlMHExIikpCisJCXJldHVybjsJCS8qIElnbm9yZSBjaGFyYWN0ZXIgZWNobyBiYWNrIGZyb20gdGhlIHJhZGlvICovCisKKwkvKiBDYXRjaCBvdGhlciBlcnJvciBtZXNzYWdlcyAqLworCS8qIChUaGlzIGlzIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGZpcm13YXJlKSAqLworCWlmIChoYXNfcHJlZml4KG1zZywgbGVuLCAiRVJSXyIpKSB7CisJCVJlY3ZFcnJfTWVzc2FnZShzdHJpcF9pbmZvLCBOVUxMLCAmbXNnWzRdLCBsZW4gLSA0KTsKKwkJcmV0dXJuOworCX0KKworCVJlY3ZFcnIoIk5vIGluaXRpYWwgKiIsIHN0cmlwX2luZm8pOworfQorCisvKgorICogcHJvY2Vzc19tZXNzYWdlIHByb2Nlc3NlcyBhIDxDUj4tdGVybWluYXRlZCBibG9jayBvZiBkYXRhIHJlY2VpdmVkCisgKiBmcm9tIHRoZSByYWRpby4gSWYgdGhlIHJhZGlvIGlzIG5vdCBpbiBTdGFybW9kZSBvciBoYXMgb2xkIGZpcm13YXJlLAorICogaXQgbWF5IGJlIGEgbGluZSBvZiB0ZXh0IGluIHJlc3BvbnNlIHRvIGFuIEFUIGNvbW1hbmQuIElkZWFsbHksIHdpdGgKKyAqIGEgY3VycmVudCByYWRpbyB0aGF0J3MgcHJvcGVybHkgaW4gU3Rhcm1vZGUsIGFsbCBkYXRhIHJlY2VpdmVkIHNob3VsZAorICogYmUgcHJvcGVybHkgZnJhbWVkIGFuZCBjaGVja3N1bW1lZCByYWRpbyBtZXNzYWdlIGJsb2NrcywgY29udGFpbmluZworICogZWl0aGVyIGEgc3Rhcm1vZGUgcGFja2V0LCBvciBhIG90aGVyIGNvbW11bmljYXRpb24gZnJvbSB0aGUgcmFkaW8KKyAqIGZpcm13YXJlLCBsaWtlICJJTkZfIiBJbmZvIG1lc3NhZ2VzIGFuZCAmQ09NTUFORCByZXNwb25zZXMuCisgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3NfbWVzc2FnZShzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8pCit7CisJU1RSSVBfSGVhZGVyIGhlYWRlciA9IHsgemVyb19hZGRyZXNzLCB6ZXJvX2FkZHJlc3MsIDAgfTsKKwlfX3U4ICpwdHIgPSBzdHJpcF9pbmZvLT5zeF9idWZmOworCV9fdTggKmVuZCA9IHN0cmlwX2luZm8tPnN4X2J1ZmYgKyBzdHJpcF9pbmZvLT5zeF9jb3VudDsKKwlfX3U4IHNlbmRlcm5hbWVbMzJdLCAqc3B0ciA9IHNlbmRlcm5hbWU7CisJTWV0cmljb21LZXkga2V5OworCisJLypIZXhEdW1wKCJSZWNlaXZpbmciLCBzdHJpcF9pbmZvLCBwdHIsIGVuZCk7ICovCisKKwkvKiBDaGVjayBmb3Igc3RhcnQgb2YgYWRkcmVzcyBtYXJrZXIsIGFuZCB0aGVuIHNraXAgb3ZlciBpdCAqLworCWlmICgqcHRyID09ICcqJykKKwkJcHRyKys7CisJZWxzZSB7CisJCXByb2Nlc3NfdGV4dF9tZXNzYWdlKHN0cmlwX2luZm8pOworCQlyZXR1cm47CisJfQorCisJLyogQ29weSBvdXQgdGhlIHJldHVybiBhZGRyZXNzICovCisJd2hpbGUgKHB0ciA8IGVuZCAmJiAqcHRyICE9ICcqJworCSAgICAgICAmJiBzcHRyIDwgQVJSQVlfRU5EKHNlbmRlcm5hbWUpIC0gMSkKKwkJKnNwdHIrKyA9ICpwdHIrKzsKKwkqc3B0ciA9IDA7CQkvKiBOdWxsIHRlcm1pbmF0ZSB0aGUgc2VuZGVyIG5hbWUgKi8KKworCS8qIENoZWNrIGZvciBlbmQgb2YgYWRkcmVzcyBtYXJrZXIsIGFuZCBza2lwIG92ZXIgaXQgKi8KKwlpZiAocHRyID49IGVuZCB8fCAqcHRyICE9ICcqJykgeworCQlSZWN2RXJyKCJObyBzZWNvbmQgKiIsIHN0cmlwX2luZm8pOworCQlyZXR1cm47CisJfQorCXB0cisrOwkJCS8qIFNraXAgdGhlIHNlY29uZCAnKicgKi8KKworCS8qIElmIHRoZSBzZW5kZXIgbmFtZSBpcyAiJkNPTU1BTkQiLCBpZ25vcmUgdGhpcyAncGFja2V0JyAgICAgICAqLworCS8qIChUaGlzIGlzIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGZpcm13YXJlKSAqLworCWlmICghc3RyY21wKHNlbmRlcm5hbWUsICImQ09NTUFORCIpKSB7CisJCXN0cmlwX2luZm8tPmZpcm13YXJlX2xldmVsID0gTm9TdHJ1Y3R1cmU7CisJCXN0cmlwX2luZm8tPm5leHRfY29tbWFuZCA9IENvbXBhdGliaWxpdHlDb21tYW5kOworCQlyZXR1cm47CisJfQorCisJaWYgKHB0ciArIDQgPiBlbmQpIHsKKwkJUmVjdkVycigiTm8gcHJvdG8ga2V5Iiwgc3RyaXBfaW5mbyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBHZXQgdGhlIHByb3RvY29sIGtleSBvdXQgb2YgdGhlIGJ1ZmZlciAqLworCWtleS5jWzBdID0gKnB0cisrOworCWtleS5jWzFdID0gKnB0cisrOworCWtleS5jWzJdID0gKnB0cisrOworCWtleS5jWzNdID0gKnB0cisrOworCisJLyogSWYgd2UncmUgdXNpbmcgY2hlY2tzdW1zLCB2ZXJpZnkgdGhlIGNoZWNrc3VtIGF0IHRoZSBlbmQgb2YgdGhlIHBhY2tldCAqLworCWlmIChzdHJpcF9pbmZvLT5maXJtd2FyZV9sZXZlbCA+PSBDaGVja3N1bW1lZE1lc3NhZ2VzKSB7CisJCWVuZCAtPSA0OwkvKiBDaG9wIHRoZSBsYXN0IGZvdXIgYnl0ZXMgb2ZmIHRoZSBwYWNrZXQgKHRoZXkncmUgdGhlIGNoZWNrc3VtKSAqLworCQlpZiAocHRyID4gZW5kKSB7CisJCQlSZWN2RXJyKCJNaXNzaW5nIENoZWNrc3VtIiwgc3RyaXBfaW5mbyk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCF2ZXJpZnlfY2hlY2tzdW0oc3RyaXBfaW5mbykpIHsKKwkJCVJlY3ZFcnIoIkJhZCBDaGVja3N1bSIsIHN0cmlwX2luZm8pOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLypwcmludGsoS0VSTl9JTkZPICIlczogR290IHBhY2tldCBmcm9tIFwiJXNcIi5cbiIsIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgc2VuZGVybmFtZSk7ICovCisKKwkvKgorCSAqIEZpbGwgaW4gKHBzZXVkbykgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgaW4gdGhlIHBhY2tldC4KKwkgKiBXZSBhc3N1bWUgdGhhdCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyB3YXMgb3VyIGFkZHJlc3MgKHRoZSByYWRpbyBkb2VzIG5vdAorCSAqIHRlbGwgdXMgdGhpcykuIElmIHRoZSByYWRpbyBzdXBwbGllcyBhIHNvdXJjZSBhZGRyZXNzLCB0aGVuIHdlIHVzZSBpdC4KKwkgKi8KKwloZWFkZXIuZHN0X2FkZHIgPSBzdHJpcF9pbmZvLT50cnVlX2Rldl9hZGRyOworCXN0cmluZ190b19yYWRpb19hZGRyZXNzKCZoZWFkZXIuc3JjX2FkZHIsIHNlbmRlcm5hbWUpOworCisjaWZkZWYgRVhUX0NPVU5URVJTCisJaWYgKGtleS5sID09IFNJUDBLZXkubCkgeworCQlzdHJpcF9pbmZvLT5yeF9yYnl0ZXMgKz0gKGVuZCAtIHB0cik7CisJCXByb2Nlc3NfSVBfcGFja2V0KHN0cmlwX2luZm8sICZoZWFkZXIsIHB0ciwgZW5kKTsKKwl9IGVsc2UgaWYgKGtleS5sID09IEFSUDBLZXkubCkgeworCQlzdHJpcF9pbmZvLT5yeF9yYnl0ZXMgKz0gKGVuZCAtIHB0cik7CisJCXByb2Nlc3NfQVJQX3BhY2tldChzdHJpcF9pbmZvLCAmaGVhZGVyLCBwdHIsIGVuZCk7CisJfSBlbHNlIGlmIChrZXkubCA9PSBBVFJfS2V5LmwpIHsKKwkJc3RyaXBfaW5mby0+cnhfZWJ5dGVzICs9IChlbmQgLSBwdHIpOworCQlwcm9jZXNzX0FUX3Jlc3BvbnNlKHN0cmlwX2luZm8sIHB0ciwgZW5kKTsKKwl9IGVsc2UgaWYgKGtleS5sID09IEFDS19LZXkubCkgeworCQlzdHJpcF9pbmZvLT5yeF9lYnl0ZXMgKz0gKGVuZCAtIHB0cik7CisJCXByb2Nlc3NfQUNLKHN0cmlwX2luZm8sIHB0ciwgZW5kKTsKKwl9IGVsc2UgaWYgKGtleS5sID09IElORl9LZXkubCkgeworCQlzdHJpcF9pbmZvLT5yeF9lYnl0ZXMgKz0gKGVuZCAtIHB0cik7CisJCXByb2Nlc3NfSW5mbyhzdHJpcF9pbmZvLCBwdHIsIGVuZCk7CisJfSBlbHNlIGlmIChrZXkubCA9PSBFUlJfS2V5LmwpIHsKKwkJc3RyaXBfaW5mby0+cnhfZWJ5dGVzICs9IChlbmQgLSBwdHIpOworCQlSZWN2RXJyX01lc3NhZ2Uoc3RyaXBfaW5mbywgc2VuZGVybmFtZSwgcHRyLCBlbmQgLSBwdHIpOworCX0gZWxzZQorCQlSZWN2RXJyKCJVbnJlY29nbml6ZWQgcHJvdG9jb2wga2V5Iiwgc3RyaXBfaW5mbyk7CisjZWxzZQorCWlmIChrZXkubCA9PSBTSVAwS2V5LmwpCisJCXByb2Nlc3NfSVBfcGFja2V0KHN0cmlwX2luZm8sICZoZWFkZXIsIHB0ciwgZW5kKTsKKwllbHNlIGlmIChrZXkubCA9PSBBUlAwS2V5LmwpCisJCXByb2Nlc3NfQVJQX3BhY2tldChzdHJpcF9pbmZvLCAmaGVhZGVyLCBwdHIsIGVuZCk7CisJZWxzZSBpZiAoa2V5LmwgPT0gQVRSX0tleS5sKQorCQlwcm9jZXNzX0FUX3Jlc3BvbnNlKHN0cmlwX2luZm8sIHB0ciwgZW5kKTsKKwllbHNlIGlmIChrZXkubCA9PSBBQ0tfS2V5LmwpCisJCXByb2Nlc3NfQUNLKHN0cmlwX2luZm8sIHB0ciwgZW5kKTsKKwllbHNlIGlmIChrZXkubCA9PSBJTkZfS2V5LmwpCisJCXByb2Nlc3NfSW5mbyhzdHJpcF9pbmZvLCBwdHIsIGVuZCk7CisJZWxzZSBpZiAoa2V5LmwgPT0gRVJSX0tleS5sKQorCQlSZWN2RXJyX01lc3NhZ2Uoc3RyaXBfaW5mbywgc2VuZGVybmFtZSwgcHRyLCBlbmQgLSBwdHIpOworCWVsc2UKKwkJUmVjdkVycigiVW5yZWNvZ25pemVkIHByb3RvY29sIGtleSIsIHN0cmlwX2luZm8pOworI2VuZGlmCit9CisKKyNkZWZpbmUgVFRZRVJST1IoWCkgKChYKSA9PSBUVFlfQlJFQUsgICA/ICJCcmVhayIgICAgICAgICAgICA6IFwKKyAgICAgICAgICAgICAgICAgICAgIChYKSA9PSBUVFlfRlJBTUUgICA/ICJGcmFtaW5nIEVycm9yIiAgICA6IFwKKyAgICAgICAgICAgICAgICAgICAgIChYKSA9PSBUVFlfUEFSSVRZICA/ICJQYXJpdHkgRXJyb3IiICAgICA6IFwKKyAgICAgICAgICAgICAgICAgICAgIChYKSA9PSBUVFlfT1ZFUlJVTiA/ICJIYXJkd2FyZSBPdmVycnVuIiA6ICJVbmtub3duIEVycm9yIikKKworLyoKKyAqIEhhbmRsZSB0aGUgJ3JlY2VpdmVyIGRhdGEgcmVhZHknIGludGVycnVwdC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSAndHR5X2lvJyBtb2R1bGUgaW4gdGhlIGtlcm5lbCB3aGVuCisgKiBhIGJsb2NrIG9mIFNUUklQIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQsIHdoaWNoIGNhbiBub3cgYmUgZGVjYXBzdWxhdGVkCisgKiBhbmQgc2VudCBvbiB0byBzb21lIElQIGxheWVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgKi8KKworc3RhdGljIHZvaWQgc3RyaXBfcmVjZWl2ZV9idWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqY3AsCisJCSAgY2hhciAqZnAsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8gPSAoc3RydWN0IHN0cmlwICopIHR0eS0+ZGlzY19kYXRhOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuZCA9IGNwICsgY291bnQ7CisKKwlpZiAoIXN0cmlwX2luZm8gfHwgc3RyaXBfaW5mby0+bWFnaWMgIT0gU1RSSVBfTUFHSUMKKwkgICAgfHwgIW5ldGlmX3J1bm5pbmcoc3RyaXBfaW5mby0+ZGV2KSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2JoKCZzdHJpcF9sb2NrKTsKKyNpZiAwCisJeworCQlzdHJ1Y3QgdGltZXZhbCB0djsKKwkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIqKioqIHN0cmlwX3JlY2VpdmVfYnVmOiAlM2QgYnl0ZXMgYXQgJTAyZC4lMDZkXG4iLAorCQkgICAgICAgY291bnQsIHR2LnR2X3NlYyAlIDEwMCwgdHYudHZfdXNlYyk7CisJfQorI2VuZGlmCisKKyNpZmRlZiBFWFRfQ09VTlRFUlMKKwlzdHJpcF9pbmZvLT5yeF9zYnl0ZXMgKz0gY291bnQ7CisjZW5kaWYKKworCS8qIFJlYWQgdGhlIGNoYXJhY3RlcnMgb3V0IG9mIHRoZSBidWZmZXIgKi8KKwl3aGlsZSAoY3AgPCBlbmQpIHsKKwkJaWYgKGZwICYmICpmcCkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBvbiBzZXJpYWwgcG9ydFxuIiwKKwkJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsIFRUWUVSUk9SKCpmcCkpOworCQlpZiAoZnAgJiYgKmZwKysgJiYgIXN0cmlwX2luZm8tPmRpc2NhcmQpIHsJLyogSWYgdGhlcmUncyBhIHNlcmlhbCBlcnJvciwgcmVjb3JkIGl0ICovCisJCQkvKiBJZiB3ZSBoYXZlIHNvbWUgY2hhcmFjdGVycyBpbiB0aGUgYnVmZmVyLCBkaXNjYXJkIHRoZW0gKi8KKwkJCXN0cmlwX2luZm8tPmRpc2NhcmQgPSBzdHJpcF9pbmZvLT5zeF9jb3VudDsKKwkJCXN0cmlwX2luZm8tPnJ4X2Vycm9ycysrOworCQl9CisKKwkJLyogTGVhZGluZyBjb250cm9sIGNoYXJhY3RlcnMgKENSLCBOTCwgVGFiLCBldGMuKSBhcmUgaWdub3JlZCAqLworCQlpZiAoc3RyaXBfaW5mby0+c3hfY291bnQgPiAwIHx8ICpjcCA+PSAnICcpIHsKKwkJCWlmICgqY3AgPT0gMHgwRCkgewkvKiBJZiBlbmQgb2YgcGFja2V0LCBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIGl0ICovCisJCQkJaWYgKHN0cmlwX2luZm8tPnN4X2NvdW50ID4gMzAwMCkKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkgICAgICAgIiVzOiBDdXQgYSAlZCBieXRlIHBhY2tldCAoJXpkIGJ5dGVzIHJlbWFpbmluZyklc1xuIiwKKwkJCQkJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSwKKwkJCQkJICAgICAgIHN0cmlwX2luZm8tPnN4X2NvdW50LAorCQkJCQkgICAgICAgZW5kIC0gY3AgLSAxLAorCQkJCQkgICAgICAgc3RyaXBfaW5mby0+CisJCQkJCSAgICAgICBkaXNjYXJkID8gIiAoZGlzY2FyZGVkKSIgOgorCQkJCQkgICAgICAgIiIpOworCQkJCWlmIChzdHJpcF9pbmZvLT5zeF9jb3VudCA+CisJCQkJICAgIHN0cmlwX2luZm8tPnN4X3NpemUpIHsKKwkJCQkJc3RyaXBfaW5mby0+cnhfb3Zlcl9lcnJvcnMrKzsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCQkgICAgICAgIiVzOiBzeF9idWZmIG92ZXJmbG93ICglZCBieXRlcyB0b3RhbClcbiIsCisJCQkJCSAgICAgICBzdHJpcF9pbmZvLT5kZXYtPm5hbWUsCisJCQkJCSAgICAgICBzdHJpcF9pbmZvLT5zeF9jb3VudCk7CisJCQkJfSBlbHNlIGlmIChzdHJpcF9pbmZvLT5kaXNjYXJkKQorCQkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJCSAgICAgICAiJXM6IERpc2NhcmRpbmcgYmFkIHBhY2tldCAoJWQvJWQpXG4iLAorCQkJCQkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lLAorCQkJCQkgICAgICAgc3RyaXBfaW5mby0+ZGlzY2FyZCwKKwkJCQkJICAgICAgIHN0cmlwX2luZm8tPnN4X2NvdW50KTsKKwkJCQllbHNlCisJCQkJCXByb2Nlc3NfbWVzc2FnZShzdHJpcF9pbmZvKTsKKwkJCQlzdHJpcF9pbmZvLT5kaXNjYXJkID0gMDsKKwkJCQlzdHJpcF9pbmZvLT5zeF9jb3VudCA9IDA7CisJCQl9IGVsc2UgeworCQkJCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHNwYWNlIGluIHRoZSBidWZmZXIgKi8KKwkJCQlpZiAoc3RyaXBfaW5mby0+c3hfY291bnQgPAorCQkJCSAgICBzdHJpcF9pbmZvLT5zeF9zaXplKQorCQkJCQlzdHJpcF9pbmZvLT5zeF9idWZmW3N0cmlwX2luZm8tPgorCQkJCQkJCSAgICBzeF9jb3VudF0gPQorCQkJCQkgICAgKmNwOworCQkJCXN0cmlwX2luZm8tPnN4X2NvdW50Kys7CisJCQl9CisJCX0KKwkJY3ArKzsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnN0cmlwX2xvY2spOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBHZW5lcmFsIGNvbnRyb2wgcm91dGluZXMJCQkJCQkqLworCitzdGF0aWMgaW50IHNldF9tYWNfYWRkcmVzcyhzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8sCisJCQkgICBNZXRyaWNvbUFkZHJlc3MgKiBhZGRyKQoreworCS8qCisJICogV2UncmUgdXNpbmcgYSBtYW51YWxseSBzcGVjaWZpZWQgYWRkcmVzcyBpZiB0aGUgYWRkcmVzcyBpcyBzZXQKKwkgKiB0byBhbnl0aGluZyBvdGhlciB0aGFuIGFsbCBvbmVzLiBTZXR0aW5nIHRoZSBhZGRyZXNzIHRvIGFsbCBvbmVzCisJICogZGlzYWJsZXMgbWFudWFsIG1vZGUgYW5kIGdvZXMgYmFjayB0byBhdXRvbWF0aWMgYWRkcmVzcyBkZXRlcm1pbmF0aW9uCisJICogKHRyYWNraW5nIHRoZSB0cnVlIGFkZHJlc3MgdGhhdCB0aGUgcmFkaW8gaGFzKS4KKwkgKi8KKwlzdHJpcF9pbmZvLT5tYW51YWxfZGV2X2FkZHIgPQorCSAgICBtZW1jbXAoYWRkci0+YywgYnJvYWRjYXN0X2FkZHJlc3MuYywKKwkJICAgc2l6ZW9mKGJyb2FkY2FzdF9hZGRyZXNzKSk7CisJaWYgKHN0cmlwX2luZm8tPm1hbnVhbF9kZXZfYWRkcikKKwkJKihNZXRyaWNvbUFkZHJlc3MgKikgc3RyaXBfaW5mby0+ZGV2LT5kZXZfYWRkciA9ICphZGRyOworCWVsc2UKKwkJKihNZXRyaWNvbUFkZHJlc3MgKikgc3RyaXBfaW5mby0+ZGV2LT5kZXZfYWRkciA9CisJCSAgICBzdHJpcF9pbmZvLT50cnVlX2Rldl9hZGRyOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0cmlwX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbyA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNvY2thZGRyICpzYSA9IGFkZHI7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHN0cmlwX3NldF9kZXZfbWFjX2FkZHJlc3MgY2FsbGVkXG4iLCBkZXYtPm5hbWUpOworCXNldF9tYWNfYWRkcmVzcyhzdHJpcF9pbmZvLCAoTWV0cmljb21BZGRyZXNzICopIHNhLT5zYV9kYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdHJpcF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8gPSBuZXRkZXZfcHJpdihkZXYpOworCXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKworCW1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOworCisJc3RhdHMucnhfcGFja2V0cyA9IHN0cmlwX2luZm8tPnJ4X3BhY2tldHM7CisJc3RhdHMudHhfcGFja2V0cyA9IHN0cmlwX2luZm8tPnR4X3BhY2tldHM7CisJc3RhdHMucnhfZHJvcHBlZCA9IHN0cmlwX2luZm8tPnJ4X2Ryb3BwZWQ7CisJc3RhdHMudHhfZHJvcHBlZCA9IHN0cmlwX2luZm8tPnR4X2Ryb3BwZWQ7CisJc3RhdHMudHhfZXJyb3JzID0gc3RyaXBfaW5mby0+dHhfZXJyb3JzOworCXN0YXRzLnJ4X2Vycm9ycyA9IHN0cmlwX2luZm8tPnJ4X2Vycm9yczsKKwlzdGF0cy5yeF9vdmVyX2Vycm9ycyA9IHN0cmlwX2luZm8tPnJ4X292ZXJfZXJyb3JzOworCXJldHVybiAoJnN0YXRzKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogT3BlbmluZyBhbmQgY2xvc2luZwkJCQkJCQkqLworCisvKgorICogSGVyZSdzIHRoZSBvcmRlciB0aGluZ3MgaGFwcGVuOgorICogV2hlbiB0aGUgdXNlciBydW5zICJzbGF0dGFjaCAtcCBzdHJpcCAuLi4iCisgKiAgMS4gVGhlIFRUWSBtb2R1bGUgY2FsbHMgc3RyaXBfb3BlbgorICogIDIuIHN0cmlwX29wZW4gY2FsbHMgc3RyaXBfYWxsb2MKKyAqICAzLiAgICAgICAgICAgICAgICAgIHN0cmlwX2FsbG9jIGNhbGxzIHJlZ2lzdGVyX25ldGRldgorICogIDQuICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfbmV0ZGV2IGNhbGxzIHN0cmlwX2Rldl9pbml0CisgKiAgNS4gdGhlbiBzdHJpcF9vcGVuIGZpbmlzaGVzIHNldHRpbmcgdXAgdGhlIHN0cmlwX2luZm8KKyAqCisgKiBXaGVuIHRoZSB1c2VyIHJ1bnMgImlmY29uZmlnIHN0PHg+IHVwIGFkZHJlc3MgbmV0bWFzayAuLi4iCisgKiAgNi4gc3RyaXBfb3Blbl9sb3cgZ2V0cyBjYWxsZWQKKyAqCisgKiBXaGVuIHRoZSB1c2VyIHJ1bnMgImlmY29uZmlnIHN0PHg+IGRvd24iCisgKiAgNy4gc3RyaXBfY2xvc2VfbG93IGdldHMgY2FsbGVkCisgKgorICogV2hlbiB0aGUgdXNlciBraWxscyB0aGUgc2xhdHRhY2ggcHJvY2VzcworICogIDguIHN0cmlwX2Nsb3NlIGdldHMgY2FsbGVkCisgKiAgOS4gc3RyaXBfY2xvc2UgY2FsbHMgZGV2X2Nsb3NlCisgKiAxMC4gaWYgdGhlIGRldmljZSBpcyBzdGlsbCB1cCwgdGhlbiBkZXZfY2xvc2UgY2FsbHMgc3RyaXBfY2xvc2VfbG93CisgKiAxMS4gc3RyaXBfY2xvc2UgY2FsbHMgc3RyaXBfZnJlZQorICovCisKKy8qIE9wZW4gdGhlIGxvdy1sZXZlbCBwYXJ0IG9mIHRoZSBTVFJJUCBjaGFubmVsLiBFYXN5ISAqLworCitzdGF0aWMgaW50IHN0cmlwX29wZW5fbG93KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN0cmlwICpzdHJpcF9pbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChzdHJpcF9pbmZvLT50dHkgPT0gTlVMTCkKKwkJcmV0dXJuICgtRU5PREVWKTsKKworCWlmICghYWxsb2NhdGVfYnVmZmVycyhzdHJpcF9pbmZvLCBkZXYtPm10dSkpCisJCXJldHVybiAoLUVOT01FTSk7CisKKwlzdHJpcF9pbmZvLT5zeF9jb3VudCA9IDA7CisJc3RyaXBfaW5mby0+dHhfbGVmdCA9IDA7CisKKwlzdHJpcF9pbmZvLT5kaXNjYXJkID0gMDsKKwlzdHJpcF9pbmZvLT53b3JraW5nID0gRkFMU0U7CisJc3RyaXBfaW5mby0+ZmlybXdhcmVfbGV2ZWwgPSBOb1N0cnVjdHVyZTsKKwlzdHJpcF9pbmZvLT5uZXh0X2NvbW1hbmQgPSBDb21wYXRpYmlsaXR5Q29tbWFuZDsKKwlzdHJpcF9pbmZvLT51c2VyX2JhdWQgPSBnZXRfYmF1ZChzdHJpcF9pbmZvLT50dHkpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEluaXRpYWxpemluZyBSYWRpby5cbiIsCisJICAgICAgIHN0cmlwX2luZm8tPmRldi0+bmFtZSk7CisJUmVzZXRSYWRpbyhzdHJpcF9pbmZvKTsKKwlzdHJpcF9pbmZvLT5pZGxlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMSAqIEhaOworCWFkZF90aW1lcigmc3RyaXBfaW5mby0+aWRsZV90aW1lcik7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCXJldHVybiAoMCk7Cit9CisKKworLyoKKyAqIENsb3NlIHRoZSBsb3ctbGV2ZWwgcGFydCBvZiB0aGUgU1RSSVAgY2hhbm5lbC4gRWFzeSEKKyAqLworCitzdGF0aWMgaW50IHN0cmlwX2Nsb3NlX2xvdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbyA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoc3RyaXBfaW5mby0+dHR5ID09IE5VTEwpCisJCXJldHVybiAtRUJVU1k7CisJc3RyaXBfaW5mby0+dHR5LT5mbGFncyAmPSB+KDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCk7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKgorCSAqIEZyZWUgYWxsIFNUUklQIGZyYW1lIGJ1ZmZlcnMuCisJICovCisJaWYgKHN0cmlwX2luZm8tPnJ4X2J1ZmYpIHsKKwkJa2ZyZWUoc3RyaXBfaW5mby0+cnhfYnVmZik7CisJCXN0cmlwX2luZm8tPnJ4X2J1ZmYgPSBOVUxMOworCX0KKwlpZiAoc3RyaXBfaW5mby0+c3hfYnVmZikgeworCQlrZnJlZShzdHJpcF9pbmZvLT5zeF9idWZmKTsKKwkJc3RyaXBfaW5mby0+c3hfYnVmZiA9IE5VTEw7CisJfQorCWlmIChzdHJpcF9pbmZvLT50eF9idWZmKSB7CisJCWtmcmVlKHN0cmlwX2luZm8tPnR4X2J1ZmYpOworCQlzdHJpcF9pbmZvLT50eF9idWZmID0gTlVMTDsKKwl9CisJZGVsX3RpbWVyKCZzdHJpcF9pbmZvLT5pZGxlX3RpbWVyKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgRERJIHdoZW4gdGhlCisgKiAoZHluYW1pY2FsbHkgYXNzaWduZWQpIGRldmljZSBpcyByZWdpc3RlcmVkCisgKi8KKworc3RhdGljIHZvaWQgc3RyaXBfZGV2X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyoKKwkgKiBGaW5pc2ggc2V0dGluZyB1cCB0aGUgREVWSUNFIGluZm8uCisJICovCisKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gMDsKKwlkZXYtPmxhc3RfcnggPSAwOworCWRldi0+dHhfcXVldWVfbGVuID0gMzA7CS8qIERyb3AgYWZ0ZXIgMzAgZnJhbWVzIHF1ZXVlZCAqLworCisJZGV2LT5mbGFncyA9IDA7CisJZGV2LT5tdHUgPSBERUZBVUxUX1NUUklQX01UVTsKKwlkZXYtPnR5cGUgPSBBUlBIUkRfTUVUUklDT007CS8qIGR0YW5nICovCisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBzaXplb2YoU1RSSVBfSGVhZGVyKTsKKwkvKgorCSAqICBkZXYtPnByaXYgICAgICAgICAgICAgQWxyZWFkeSBob2xkcyBhIHBvaW50ZXIgdG8gb3VyIHN0cnVjdCBzdHJpcAorCSAqLworCisJKihNZXRyaWNvbUFkZHJlc3MgKikgJiBkZXYtPmJyb2FkY2FzdCA9IGJyb2FkY2FzdF9hZGRyZXNzOworCWRldi0+ZGV2X2FkZHJbMF0gPSAwOworCWRldi0+YWRkcl9sZW4gPSBzaXplb2YoTWV0cmljb21BZGRyZXNzKTsKKworCS8qCisJICogUG9pbnRlcnMgdG8gaW50ZXJmYWNlIHNlcnZpY2Ugcm91dGluZXMuCisJICovCisKKwlkZXYtPm9wZW4gPSBzdHJpcF9vcGVuX2xvdzsKKwlkZXYtPnN0b3AgPSBzdHJpcF9jbG9zZV9sb3c7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBzdHJpcF94bWl0OworCWRldi0+aGFyZF9oZWFkZXIgPSBzdHJpcF9oZWFkZXI7CisJZGV2LT5yZWJ1aWxkX2hlYWRlciA9IHN0cmlwX3JlYnVpbGRfaGVhZGVyOworCWRldi0+c2V0X21hY19hZGRyZXNzID0gc3RyaXBfc2V0X21hY19hZGRyZXNzOworCWRldi0+Z2V0X3N0YXRzID0gc3RyaXBfZ2V0X3N0YXRzOworCWRldi0+Y2hhbmdlX210dSA9IHN0cmlwX2NoYW5nZV9tdHU7Cit9CisKKy8qCisgKiBGcmVlIGEgU1RSSVAgY2hhbm5lbC4KKyAqLworCitzdGF0aWMgdm9pZCBzdHJpcF9mcmVlKHN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbykKK3sKKwlzcGluX2xvY2tfYmgoJnN0cmlwX2xvY2spOworCWxpc3RfZGVsX3JjdSgmc3RyaXBfaW5mby0+bGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJnN0cmlwX2xvY2spOworCisJc3RyaXBfaW5mby0+bWFnaWMgPSAwOworCisJZnJlZV9uZXRkZXYoc3RyaXBfaW5mby0+ZGV2KTsKK30KKworCisvKgorICogQWxsb2NhdGUgYSBuZXcgZnJlZSBTVFJJUCBjaGFubmVsCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbzsKKworCWRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IHN0cmlwKSwgInN0JWQiLAorCQkJICAgc3RyaXBfZGV2X3NldHVwKTsKKworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsJLyogSWYgbm8gbW9yZSBtZW1vcnksIHJldHVybiAqLworCisKKwlzdHJpcF9pbmZvID0gZGV2LT5wcml2OworCXN0cmlwX2luZm8tPmRldiA9IGRldjsKKworCXN0cmlwX2luZm8tPm1hZ2ljID0gU1RSSVBfTUFHSUM7CisJc3RyaXBfaW5mby0+dHR5ID0gTlVMTDsKKworCXN0cmlwX2luZm8tPmdyYXR1aXRvdXNfYXJwID0gamlmZmllcyArIExvbmdUaW1lOworCXN0cmlwX2luZm8tPmFycF9pbnRlcnZhbCA9IDA7CisJaW5pdF90aW1lcigmc3RyaXBfaW5mby0+aWRsZV90aW1lcik7CisJc3RyaXBfaW5mby0+aWRsZV90aW1lci5kYXRhID0gKGxvbmcpIGRldjsKKwlzdHJpcF9pbmZvLT5pZGxlX3RpbWVyLmZ1bmN0aW9uID0gc3RyaXBfSWRsZVRhc2s7CisKKworCXNwaW5fbG9ja19iaCgmc3RyaXBfbG9jayk7CisgcmVzY2FuOgorCS8qCisJICogU2VhcmNoIHRoZSBsaXN0IHRvIGZpbmQgd2hlcmUgdG8gcHV0IG91ciBuZXcgZW50cnkKKwkgKiAoYW5kIGluIHRoZSBwcm9jZXNzIGRlY2lkZSB3aGF0IGNoYW5uZWwgbnVtYmVyIGl0IGlzCisJICogZ29pbmcgdG8gYmUpCisJICovCisJbGlzdF9mb3JfZWFjaChuLCAmc3RyaXBfbGlzdCkgeworCQlzdHJ1Y3Qgc3RyaXAgKnMgPSBobGlzdF9lbnRyeShuLCBzdHJ1Y3Qgc3RyaXAsIGxpc3QpOworCisJCWlmIChzLT5kZXYtPmJhc2VfYWRkciA9PSBkZXYtPmJhc2VfYWRkcikgeworCQkJKytkZXYtPmJhc2VfYWRkcjsKKwkJCWdvdG8gcmVzY2FuOworCQl9CisJfQorCisJc3ByaW50ZihkZXYtPm5hbWUsICJzdCVsZCIsIGRldi0+YmFzZV9hZGRyKTsKKworCWxpc3RfYWRkX3RhaWxfcmN1KCZzdHJpcF9pbmZvLT5saXN0LCAmc3RyaXBfbGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJnN0cmlwX2xvY2spOworCisJcmV0dXJuIHN0cmlwX2luZm87Cit9CisKKy8qCisgKiBPcGVuIHRoZSBoaWdoLWxldmVsIHBhcnQgb2YgdGhlIFNUUklQIGNoYW5uZWwuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgVFRZIG1vZHVsZSB3aGVuIHRoZQorICogU1RSSVAgbGluZSBkaXNjaXBsaW5lIGlzIGNhbGxlZCBmb3IuICBCZWNhdXNlIHdlIGFyZQorICogc3VyZSB0aGUgdHR5IGxpbmUgZXhpc3RzLCB3ZSBvbmx5IGhhdmUgdG8gbGluayBpdCB0bworICogYSBmcmVlIFNUUklQIGNoYW5uZWwuLi4KKyAqLworCitzdGF0aWMgaW50IHN0cmlwX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8gPSAoc3RydWN0IHN0cmlwICopIHR0eS0+ZGlzY19kYXRhOworCisJLyoKKwkgKiBGaXJzdCBtYWtlIHN1cmUgd2UncmUgbm90IGFscmVhZHkgY29ubmVjdGVkLgorCSAqLworCisJaWYgKHN0cmlwX2luZm8gJiYgc3RyaXBfaW5mby0+bWFnaWMgPT0gU1RSSVBfTUFHSUMpCisJCXJldHVybiAtRUVYSVNUOworCisJLyoKKwkgKiBPSy4gIEZpbmQgYSBmcmVlIFNUUklQIGNoYW5uZWwgdG8gdXNlLgorCSAqLworCWlmICgoc3RyaXBfaW5mbyA9IHN0cmlwX2FsbG9jKCkpID09IE5VTEwpCisJCXJldHVybiAtRU5GSUxFOworCisJLyoKKwkgKiBSZWdpc3RlciBvdXIgbmV3bHkgY3JlYXRlZCBkZXZpY2Ugc28gaXQgY2FuIGJlIGlmY29uZmlnJ2QKKwkgKiBzdHJpcF9kZXZfaW5pdCgpIHdpbGwgYmUgY2FsbGVkIGFzIGEgc2lkZS1lZmZlY3QKKwkgKi8KKworCWlmIChyZWdpc3Rlcl9uZXRkZXYoc3RyaXBfaW5mby0+ZGV2KSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3RyaXA6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZC5cbiIpOworCQlzdHJpcF9mcmVlKHN0cmlwX2luZm8pOworCQlyZXR1cm4gLUVORklMRTsKKwl9CisKKwlzdHJpcF9pbmZvLT50dHkgPSB0dHk7CisJdHR5LT5kaXNjX2RhdGEgPSBzdHJpcF9pbmZvOworCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKQorCQl0dHktPmRyaXZlci0+Zmx1c2hfYnVmZmVyKHR0eSk7CisKKwkvKgorCSAqIFJlc3RvcmUgZGVmYXVsdCBzZXR0aW5ncworCSAqLworCisJc3RyaXBfaW5mby0+ZGV2LT50eXBlID0gQVJQSFJEX01FVFJJQ09NOwkvKiBkdGFuZyAqLworCisJLyoKKwkgKiBTZXQgdHR5IG9wdGlvbnMKKwkgKi8KKworCXR0eS0+dGVybWlvcy0+Y19pZmxhZyB8PSBJR05CUksgfCBJR05QQVI7CS8qIElnbm9yZSBicmVha3MgYW5kIHBhcml0eSBlcnJvcnMuICovCisJdHR5LT50ZXJtaW9zLT5jX2NmbGFnIHw9IENMT0NBTDsJLyogSWdub3JlIG1vZGVtIGNvbnRyb2wgc2lnbmFscy4gKi8KKwl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJj0gfkhVUENMOwkvKiBEb24ndCBjbG9zZSBvbiBodXAgKi8KKworCXByaW50ayhLRVJOX0lORk8gIlNUUklQOiBkZXZpY2UgXCIlc1wiIGFjdGl2YXRlZFxuIiwKKwkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKworCS8qCisJICogRG9uZS4gIFdlIGhhdmUgbGlua2VkIHRoZSBUVFkgbGluZSB0byBhIGNoYW5uZWwuCisJICovCisJcmV0dXJuIChzdHJpcF9pbmZvLT5kZXYtPmJhc2VfYWRkcik7Cit9CisKKy8qCisgKiBDbG9zZSBkb3duIGEgU1RSSVAgY2hhbm5lbC4KKyAqIFRoaXMgbWVhbnMgZmx1c2hpbmcgb3V0IGFueSBwZW5kaW5nIHF1ZXVlcywgYW5kIHRoZW4gcmVzdG9yaW5nIHRoZQorICogVFRZIGxpbmUgZGlzY2lwbGluZSB0byB3aGF0IGl0IHdhcyBiZWZvcmUgaXQgZ290IGhvb2tlZCB0byBTVFJJUAorICogKHdoaWNoIHVzdWFsbHkgaXMgVFRZIGFnYWluKS4KKyAqLworCitzdGF0aWMgdm9pZCBzdHJpcF9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzdHJpcCAqc3RyaXBfaW5mbyA9IChzdHJ1Y3Qgc3RyaXAgKikgdHR5LT5kaXNjX2RhdGE7CisKKwkvKgorCSAqIEZpcnN0IG1ha2Ugc3VyZSB3ZSdyZSBjb25uZWN0ZWQuCisJICovCisKKwlpZiAoIXN0cmlwX2luZm8gfHwgc3RyaXBfaW5mby0+bWFnaWMgIT0gU1RSSVBfTUFHSUMpCisJCXJldHVybjsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KHN0cmlwX2luZm8tPmRldik7CisKKwl0dHktPmRpc2NfZGF0YSA9IE5VTEw7CisJc3RyaXBfaW5mby0+dHR5ID0gTlVMTDsKKwlwcmludGsoS0VSTl9JTkZPICJTVFJJUDogZGV2aWNlIFwiJXNcIiBjbG9zZWQgZG93blxuIiwKKwkgICAgICAgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKwlzdHJpcF9mcmVlKHN0cmlwX2luZm8pOworCXR0eS0+ZGlzY19kYXRhID0gTlVMTDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUGVyZm9ybSBJL08gY29udHJvbCBjYWxscyBvbiBhbiBhY3RpdmUgU1RSSVAgY2hhbm5lbC4JCSovCisKK3N0YXRpYyBpbnQgc3RyaXBfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc3RyaXAgKnN0cmlwX2luZm8gPSAoc3RydWN0IHN0cmlwICopIHR0eS0+ZGlzY19kYXRhOworCisJLyoKKwkgKiBGaXJzdCBtYWtlIHN1cmUgd2UncmUgY29ubmVjdGVkLgorCSAqLworCisJaWYgKCFzdHJpcF9pbmZvIHx8IHN0cmlwX2luZm8tPm1hZ2ljICE9IFNUUklQX01BR0lDKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DR0lGTkFNRToKKwkJaWYoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSBhcmcsIHN0cmlwX2luZm8tPmRldi0+bmFtZSwgc3RybGVuKHN0cmlwX2luZm8tPmRldi0+bmFtZSkgKyAxKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwljYXNlIFNJT0NTSUZIV0FERFI6CisJeworCQlNZXRyaWNvbUFkZHJlc3MgYWRkcjsKKwkJLy9wcmludGsoS0VSTl9JTkZPICIlczogU0lPQ1NJRkhXQUREUlxuIiwgc3RyaXBfaW5mby0+ZGV2LT5uYW1lKTsKKwkJaWYoY29weV9mcm9tX3VzZXIoJmFkZHIsICh2b2lkIF9fdXNlciAqKSBhcmcsIHNpemVvZihNZXRyaWNvbUFkZHJlc3MpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gc2V0X21hY19hZGRyZXNzKHN0cmlwX2luZm8sICZhZGRyKTsKKwl9CisJLyoKKwkgKiBBbGxvdyBzdHR5IHRvIHJlYWQsIGJ1dCBub3Qgc2V0LCB0aGUgc2VyaWFsIHBvcnQKKwkgKi8KKworCWNhc2UgVENHRVRTOgorCWNhc2UgVENHRVRBOgorCQlyZXR1cm4gbl90dHlfaW9jdGwodHR5LCBmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSW5pdGlhbGl6YXRpb24JCQkJCQkJKi8KKworc3RhdGljIHN0cnVjdCB0dHlfbGRpc2Mgc3RyaXBfbGRpc2MgPSB7CisJLm1hZ2ljID0gVFRZX0xESVNDX01BR0lDLAorCS5uYW1lID0gInN0cmlwIiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IHN0cmlwX29wZW4sCisJLmNsb3NlID0gc3RyaXBfY2xvc2UsCisJLmlvY3RsID0gc3RyaXBfaW9jdGwsCisJLnJlY2VpdmVfYnVmID0gc3RyaXBfcmVjZWl2ZV9idWYsCisJLnJlY2VpdmVfcm9vbSA9IHN0cmlwX3JlY2VpdmVfcm9vbSwKKwkud3JpdGVfd2FrZXVwID0gc3RyaXBfd3JpdGVfc29tZV9tb3JlLAorfTsKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIFNUUklQIGRyaXZlci4KKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYXQgYm9vdCB0aW1lLCB0byBib290c3RyYXAgdGhlIG11bHRpLWNoYW5uZWwKKyAqIFNUUklQIGRyaXZlcgorICovCisKK3N0YXRpYyBjaGFyIHNpZ25vbltdIF9faW5pdGRhdGEgPQorICAgIEtFUk5fSU5GTyAiU1RSSVA6IFZlcnNpb24gJXMgKHVubGltaXRlZCBjaGFubmVscylcbiI7CisKK3N0YXRpYyBpbnQgX19pbml0IHN0cmlwX2luaXRfZHJpdmVyKHZvaWQpCit7CisJaW50IHN0YXR1czsKKworCXByaW50ayhzaWdub24sIFN0cmlwVmVyc2lvbik7CisKKwkKKwkvKgorCSAqIEZpbGwgaW4gb3VyIGxpbmUgcHJvdG9jb2wgZGlzY2lwbGluZSwgYW5kIHJlZ2lzdGVyIGl0CisJICovCisJaWYgKChzdGF0dXMgPSB0dHlfcmVnaXN0ZXJfbGRpc2MoTl9TVFJJUCwgJnN0cmlwX2xkaXNjKSkpCisJCXByaW50ayhLRVJOX0VSUiAiU1RSSVA6IGNhbid0IHJlZ2lzdGVyIGxpbmUgZGlzY2lwbGluZSAoZXJyID0gJWQpXG4iLAorCQkgICAgICAgc3RhdHVzKTsKKworCS8qCisJICogUmVnaXN0ZXIgdGhlIHN0YXR1cyBmaWxlIHdpdGggL3Byb2MKKwkgKi8KKwlwcm9jX25ldF9mb3BzX2NyZWF0ZSgic3RyaXAiLCBTX0lGUkVHIHwgU19JUlVHTywgJnN0cmlwX3NlcV9mb3BzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK21vZHVsZV9pbml0KHN0cmlwX2luaXRfZHJpdmVyKTsKKworc3RhdGljIGNvbnN0IGNoYXIgc2lnbm9mZltdIF9fZXhpdGRhdGEgPQorICAgIEtFUk5fSU5GTyAiU1RSSVA6IE1vZHVsZSBVbmxvYWRlZFxuIjsKKworc3RhdGljIHZvaWQgX19leGl0IHN0cmlwX2V4aXRfZHJpdmVyKHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwqbjsKKworCS8qIG1vZHVsZSByZWYgY291bnQgcnVsZXMgYXNzdXJlIHRoYXQgYWxsIGVudHJpZXMgYXJlIHVucmVnaXN0ZXJlZCAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuLCAmc3RyaXBfbGlzdCkgeworCQlzdHJ1Y3Qgc3RyaXAgKnMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzdHJpcCwgbGlzdCk7CisJCXN0cmlwX2ZyZWUocyk7CisJfQorCisJLyogVW5yZWdpc3RlciB3aXRoIHRoZSAvcHJvYy9uZXQgZmlsZSBoZXJlLiAqLworCXByb2NfbmV0X3JlbW92ZSgic3RyaXAiKTsKKworCWlmICgoaSA9IHR0eV9yZWdpc3Rlcl9sZGlzYyhOX1NUUklQLCBOVUxMKSkpCisJCXByaW50ayhLRVJOX0VSUiAiU1RSSVA6IGNhbid0IHVucmVnaXN0ZXIgbGluZSBkaXNjaXBsaW5lIChlcnIgPSAlZClcbiIsIGkpOworCisJcHJpbnRrKHNpZ25vZmYpOworfQorCittb2R1bGVfZXhpdChzdHJpcF9leGl0X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlN0dWFydCBDaGVzaGlyZSA8Y2hlc2hpcmVAY3Muc3RhbmZvcmQuZWR1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdGFybW9kZSBSYWRpbyBJUCAoU1RSSVApIERldmljZSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKKworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIlN0YXJtb2RlIFJhZGlvIElQIChTVFJJUCkgbW9kZW0iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RvZG8udHh0IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdG9kby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyMzQwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RvZG8udHh0CkBAIC0wLDAgKzEsMTUgQEAKKwlXaXJlbGVzcyBUb2RvCisJLS0tLS0tLS0tLS0tLQorCisxKSBCcmluZyBvdGhlciBrZXJuZWwgV2lyZWxlc3MgTEFOIGRyaXZlcnMgaGVyZQorCUNvbXBsZXRlZAorCisyKSBCcmluZyBuZXcgV2lyZWxlc3MgTEFOIGRyaXZlciBub3QgeWV0IGluIHRoZSBrZXJuZWwgdGhlcmUKKwlTZWUgbXkgd2ViIHBhZ2UgZm9yIGRldGFpbHMKKwlJbiBwYXJ0aWN1bGFyIDogSG9zdEFQCisKKzMpIE1pc2MKKwlvIE1hcmsgd2F2ZWxhbiwgd2F2ZWxhbl9jcywgbmV0d2F2ZV9jcyBkcml2ZXJzIGFzIG9ic29sZXRlCisJbyBNYXliZSBhcmxhbi5jLCByYXlfY3MuYyBhbmQgc3RyaXAuYyBhbHNvIGRlc2VydmUgdG8gYmUgb2Jzb2xldGUKKworCUplYW4gSUkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTVlMjBhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5jCkBAIC0wLDAgKzEsNDQ1MiBAQAorLyoKKyAqCVdhdmVMQU4gSVNBIGRyaXZlcgorICoKKyAqCQlKZWFuIElJIC0gSFBMQiAnOTYKKyAqCisgKiBSZW9yZ2FuaXNhdGlvbiBhbmQgZXh0ZW5zaW9uIG9mIHRoZSBkcml2ZXIuCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgZm9sbG93cyAoYWxzbyBzZWUgdGhlIGVuZCBvZiB0aGlzIGZpbGUpLgorICogU2VlIHdhdmVsYW4ucC5oIGZvciBkZXRhaWxzLgorICoKKyAqCisgKgorICogQVQmVCBHSVMgKG5lZSBOQ1IpIFdhdmVMQU4gY2FyZDoKKyAqCUFuIEV0aGVybmV0LWxpa2UgcmFkaW8gdHJhbnNjZWl2ZXIKKyAqCWNvbnRyb2xsZWQgYnkgYW4gSW50ZWwgODI1ODYgY29wcm9jZXNzb3IuCisgKi8KKworI2luY2x1ZGUgIndhdmVsYW4ucC5oIgkJLyogUHJpdmF0ZSBoZWFkZXIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogTUlTQyBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBTdWJyb3V0aW5lcyB3aGljaCB3b24ndCBmaXQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgY2F0ZWdvcnkKKyAqIChXYXZlTEFOIG1vZGVtIG9yIGk4MjU4NikKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVHJhbnNsYXRlIGlycSBudW1iZXIgdG8gUFNBIGlycSBwYXJhbWV0ZXIKKyAqLworc3RhdGljIHU4IHd2X2lycV90b19wc2EoaW50IGlycSkKK3sKKwlpZiAoaXJxIDwgMCB8fCBpcnEgPj0gTkVMUyhpcnF2YWxzKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gaXJxdmFsc1tpcnFdOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVHJhbnNsYXRlIFBTQSBpcnEgcGFyYW1ldGVyIHRvIGlycSBudW1iZXIgCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHd2X3BzYV90b19pcnEodTggaXJxdmFsKQoreworCWludCBpcnE7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IE5FTFMoaXJxdmFscyk7IGlycSsrKQorCQlpZiAoaXJxdmFsc1tpcnFdID09IGlycXZhbCkKKwkJCXJldHVybiBpcnE7CisKKwlyZXR1cm4gLTE7Cit9CisKKyNpZmRlZiBTVFJVQ1RfQ0hFQ0sKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTYW5pdHkgcm91dGluZSB0byB2ZXJpZnkgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIFdhdmVMQU4gaW50ZXJmYWNlCisgKiBzdHJ1Y3R1cmVzLgorICovCitzdGF0aWMgY2hhciAqd3Zfc3RydWN0X2NoZWNrKHZvaWQpCit7CisjZGVmaW5lCVNDKHQscyxuKQlpZiAoc2l6ZW9mKHQpICE9IHMpIHJldHVybihuKTsKKworCVNDKHBzYV90LCBQU0FfU0laRSwgInBzYV90Iik7CisJU0MobW13X3QsIE1NV19TSVpFLCAibW13X3QiKTsKKwlTQyhtbXJfdCwgTU1SX1NJWkUsICJtbXJfdCIpOworCVNDKGhhX3QsIEhBX1NJWkUsICJoYV90Iik7CisKKyN1bmRlZglTQworCisJcmV0dXJuICgoY2hhciAqKSBOVUxMKTsKK30JCQkJLyogd3Zfc3RydWN0X2NoZWNrICovCisjZW5kaWYJCQkJLyogU1RSVUNUX0NIRUNLICovCisKKy8qKioqKioqKioqKioqKioqKioqKiogSE9TVCBBREFQVEVSIFNVQlJPVVRJTkVTICoqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBVc2VmdWwgc3Vicm91dGluZXMgdG8gbWFuYWdlIHRoZSBXYXZlTEFOIElTQSBpbnRlcmZhY2UKKyAqCisgKiBPbmUgbWFqb3IgZGlmZmVyZW5jZSB3aXRoIHRoZSBQQ01DSUEgaGFyZHdhcmUgKGV4Y2VwdCB0aGUgcG9ydCBtYXBwaW5nKQorICogaXMgdGhhdCB3ZSBoYXZlIHRvIGtlZXAgdGhlIHN0YXRlIG9mIHRoZSBIb3N0IENvbnRyb2wgUmVnaXN0ZXIKKyAqIGJlY2F1c2Ugb2YgdGhlIGludGVycnVwdCBlbmFibGUgJiBidXMgc2l6ZSBmbGFncy4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUmVhZCBmcm9tIGNhcmQncyBIb3N0IEFkYXB0b3IgU3RhdHVzIFJlZ2lzdGVyLgorICovCitzdGF0aWMgaW5saW5lIHUxNiBoYXNyX3JlYWQodW5zaWduZWQgbG9uZyBpb2FkZHIpCit7CisJcmV0dXJuIChpbncoSEFTUihpb2FkZHIpKSk7Cit9CQkJCS8qIGhhc3JfcmVhZCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV3JpdGUgdG8gY2FyZCdzIEhvc3QgQWRhcHRlciBDb21tYW5kIFJlZ2lzdGVyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGFjcl93cml0ZSh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IGhhY3IpCit7CisJb3V0dyhoYWNyLCBIQUNSKGlvYWRkcikpOworfQkJCQkvKiBoYWNyX3dyaXRlICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXcml0ZSB0byBjYXJkJ3MgSG9zdCBBZGFwdGVyIENvbW1hbmQgUmVnaXN0ZXIuIEluY2x1ZGUgYSBkZWxheSBmb3IKKyAqIHRob3NlIHRpbWVzIHdoZW4gaXQgaXMgbmVlZGVkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGFjcl93cml0ZV9zbG93KHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1MTYgaGFjcikKK3sKKwloYWNyX3dyaXRlKGlvYWRkciwgaGFjcik7CisJLyogZGVsYXkgbWlnaHQgb25seSBiZSBuZWVkZWQgc29tZXRpbWVzICovCisJbWRlbGF5KDEpOworfQkJCQkvKiBoYWNyX3dyaXRlX3Nsb3cgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNldCB0aGUgY2hhbm5lbCBhdHRlbnRpb24gYml0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NoYW5fYXR0bih1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IGhhY3IpCit7CisJaGFjcl93cml0ZShpb2FkZHIsIGhhY3IgfCBIQUNSX0NBKTsKK30JCQkJLyogc2V0X2NoYW5fYXR0biAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUmVzZXQsIGFuZCB0aGVuIHNldCBob3N0IGFkYXB0b3IgaW50byBkZWZhdWx0IG1vZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3dl9oYWNyX3Jlc2V0KHVuc2lnbmVkIGxvbmcgaW9hZGRyKQoreworCWhhY3Jfd3JpdGVfc2xvdyhpb2FkZHIsIEhBQ1JfUkVTRVQpOworCWhhY3Jfd3JpdGUoaW9hZGRyLCBIQUNSX0RFRkFVTFQpOworfQkJCQkvKiB3dl9oYWNyX3Jlc2V0ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTZXQgdGhlIEkvTyB0cmFuc2ZlciBvdmVyIHRoZSBJU0EgYnVzIHRvIDgtYml0IG1vZGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHd2XzE2X29mZih1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IGhhY3IpCit7CisJaGFjciAmPSB+SEFDUl8xNkJJVFM7CisJaGFjcl93cml0ZShpb2FkZHIsIGhhY3IpOworfQkJCQkvKiB3dl8xNl9vZmYgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNldCB0aGUgSS9PIHRyYW5zZmVyIG92ZXIgdGhlIElTQSBidXMgdG8gOC1iaXQgbW9kZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3ZfMTZfb24odW5zaWduZWQgbG9uZyBpb2FkZHIsIHUxNiBoYWNyKQoreworCWhhY3IgfD0gSEFDUl8xNkJJVFM7CisJaGFjcl93cml0ZShpb2FkZHIsIGhhY3IpOworfQkJCQkvKiB3dl8xNl9vbiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRGlzYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBXYXZlTEFOIGhhcmR3YXJlLgorICogKGNhbGxlZCBieSB3dl84MjU4Nl9zdG9wKCkpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3dl9pbnRzX29mZihzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwkKKwlscC0+aGFjciAmPSB+SEFDUl9JTlRST047CisJaGFjcl93cml0ZShpb2FkZHIsIGxwLT5oYWNyKTsKK30JCQkJLyogd3ZfaW50c19vZmYgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBXYXZlTEFOIGhhcmR3YXJlLgorICogKGNhbGxlZCBieSB3dl9od19yZXNldCgpKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3ZfaW50c19vbihzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWxwLT5oYWNyIHw9IEhBQ1JfSU5UUk9OOworCWhhY3Jfd3JpdGUoaW9hZGRyLCBscC0+aGFjcik7Cit9CQkJCS8qIHd2X2ludHNfb24gKi8KKworLyoqKioqKioqKioqKioqKioqKiogTU9ERU0gTUFOQUdFTUVOVCBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFVzZWZ1bCBzdWJyb3V0aW5lcyB0byBtYW5hZ2UgdGhlIG1vZGVtIG9mIHRoZSBXYXZlTEFOCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJlYWQgdGhlIFBhcmFtZXRlciBTdG9yYWdlIEFyZWEgZnJvbSB0aGUgV2F2ZUxBTiBjYXJkJ3MgbWVtb3J5CisgKi8KKy8qCisgKiBSZWFkIGJ5dGVzIGZyb20gdGhlIFBTQS4KKyAqLworc3RhdGljIHZvaWQgcHNhX3JlYWQodW5zaWduZWQgbG9uZyBpb2FkZHIsIHUxNiBoYWNyLCBpbnQgbywJLyogb2Zmc2V0IGluIFBTQSAqLworCQkgICAgIHU4ICogYiwJLyogYnVmZmVyIHRvIGZpbGwgKi8KKwkJICAgICBpbnQgbikKK3sJCQkJLyogc2l6ZSB0byByZWFkICovCisJd3ZfMTZfb2ZmKGlvYWRkciwgaGFjcik7CisKKwl3aGlsZSAobi0tID4gMCkgeworCQlvdXR3KG8sIFBJT1IyKGlvYWRkcikpOworCQlvKys7CisJCSpiKysgPSBpbmIoUElPUDIoaW9hZGRyKSk7CisJfQorCisJd3ZfMTZfb24oaW9hZGRyLCBoYWNyKTsKK30JCQkJLyogcHNhX3JlYWQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyaXRlIHRoZSBQYXJhbWV0ZXIgU3RvcmFnZSBBcmVhIHRvIHRoZSBXYXZlTEFOIGNhcmQncyBtZW1vcnkuCisgKi8KK3N0YXRpYyB2b2lkIHBzYV93cml0ZSh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IGhhY3IsIGludCBvLAkvKiBPZmZzZXQgaW4gUFNBICovCisJCSAgICAgIHU4ICogYiwJLyogQnVmZmVyIGluIG1lbW9yeSAqLworCQkgICAgICBpbnQgbikKK3sJCQkJLyogTGVuZ3RoIG9mIGJ1ZmZlciAqLworCWludCBjb3VudCA9IDA7CisKKwl3dl8xNl9vZmYoaW9hZGRyLCBoYWNyKTsKKworCXdoaWxlIChuLS0gPiAwKSB7CisJCW91dHcobywgUElPUjIoaW9hZGRyKSk7CisJCW8rKzsKKworCQlvdXRiKCpiLCBQSU9QMihpb2FkZHIpKTsKKwkJYisrOworCisJCS8qIFdhaXQgZm9yIHRoZSBtZW1vcnkgdG8gZmluaXNoIGl0cyB3cml0ZSBjeWNsZSAqLworCQljb3VudCA9IDA7CisJCXdoaWxlICgoY291bnQrKyA8IDEwMCkgJiYKKwkJICAgICAgIChoYXNyX3JlYWQoaW9hZGRyKSAmIEhBU1JfUFNBX0JVU1kpKSBtZGVsYXkoMSk7CisJfQorCisJd3ZfMTZfb24oaW9hZGRyLCBoYWNyKTsKK30JCQkJLyogcHNhX3dyaXRlICovCisKKyNpZmRlZiBTRVRfUFNBX0NSQworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIENhbGN1bGF0ZSB0aGUgUFNBIENSQworICogVGhhbmtzIHRvIFZhbHN0ZXIsIE5pY28gPE5WQUxTVEVSQHdjbmQubmwubHVjZW50LmNvbT4gZm9yIHRoZSBjb2RlCisgKiBOT1RFOiBCeSBzcGVjaWZ5aW5nIGEgbGVuZ3RoIGluY2x1ZGluZyB0aGUgQ1JDIHBvc2l0aW9uIHRoZQorICogcmV0dXJuZWQgdmFsdWUgc2hvdWxkIGJlIHplcm8uIChpLmUuIGEgY29ycmVjdCBjaGVja3N1bSBpbiB0aGUgUFNBKQorICoKKyAqIFRoZSBXaW5kb3dzIGRyaXZlcnMgZG9uJ3QgdXNlIHRoZSBDUkMsIGJ1dCB0aGUgQVAgYW5kIHRoZSBQdFAgdG9vbAorICogZGVwZW5kIG9uIGl0LgorICovCitzdGF0aWMgaW5saW5lIHUxNiBwc2FfY3JjKHU4ICogcHNhLAkvKiBUaGUgUFNBICovCisJCQkgICAgICBpbnQgc2l6ZSkKK3sJCQkJLyogTnVtYmVyIG9mIHNob3J0IGZvciBDUkMgKi8KKwlpbnQgYnl0ZV9jbnQ7CQkvKiBMb29wIG9uIHRoZSBQU0EgKi8KKwl1MTYgY3JjX2J5dGVzID0gMDsJLyogRGF0YSBpbiB0aGUgUFNBICovCisJaW50IGJpdF9jbnQ7CQkvKiBMb29wIG9uIHRoZSBiaXRzIG9mIHRoZSBzaG9ydCAqLworCisJZm9yIChieXRlX2NudCA9IDA7IGJ5dGVfY250IDwgc2l6ZTsgYnl0ZV9jbnQrKykgeworCQljcmNfYnl0ZXMgXj0gcHNhW2J5dGVfY250XTsJLyogSXRzIGFuIHhvciAqLworCisJCWZvciAoYml0X2NudCA9IDE7IGJpdF9jbnQgPCA5OyBiaXRfY250KyspIHsKKwkJCWlmIChjcmNfYnl0ZXMgJiAweDAwMDEpCisJCQkJY3JjX2J5dGVzID0gKGNyY19ieXRlcyA+PiAxKSBeIDB4QTAwMTsKKwkJCWVsc2UKKwkJCQljcmNfYnl0ZXMgPj49IDE7CisJCX0KKwl9CisKKwlyZXR1cm4gY3JjX2J5dGVzOworfQkJCQkvKiBwc2FfY3JjICovCisjZW5kaWYJCQkJLyogU0VUX1BTQV9DUkMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHVwZGF0ZSB0aGUgY2hlY2tzdW0gZmllbGQgaW4gdGhlIFdhdmVsYW4ncyBQU0EKKyAqLworc3RhdGljIHZvaWQgdXBkYXRlX3BzYV9jaGVja3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgdW5zaWduZWQgbG9uZyBpb2FkZHIsIHUxNiBoYWNyKQoreworI2lmZGVmIFNFVF9QU0FfQ1JDCisJcHNhX3QgcHNhOworCXUxNiBjcmM7CisKKwkvKiByZWFkIHRoZSBwYXJhbWV0ZXIgc3RvcmFnZSBhcmVhICovCisJcHNhX3JlYWQoaW9hZGRyLCBoYWNyLCAwLCAodW5zaWduZWQgY2hhciAqKSAmcHNhLCBzaXplb2YocHNhKSk7CisKKwkvKiB1cGRhdGUgdGhlIGNoZWNrc3VtICovCisJY3JjID0gcHNhX2NyYygodW5zaWduZWQgY2hhciAqKSAmcHNhLAorCQkgICAgICBzaXplb2YocHNhKSAtIHNpemVvZihwc2EucHNhX2NyY1swXSkgLQorCQkgICAgICBzaXplb2YocHNhLnBzYV9jcmNbMV0pCisJCSAgICAgIC0gc2l6ZW9mKHBzYS5wc2FfY3JjX3N0YXR1cykpOworCisJcHNhLnBzYV9jcmNbMF0gPSBjcmMgJiAweEZGOworCXBzYS5wc2FfY3JjWzFdID0gKGNyYyAmIDB4RkYwMCkgPj4gODsKKworCS8qIFdyaXRlIGl0ICEgKi8KKwlwc2Ffd3JpdGUoaW9hZGRyLCBoYWNyLCAoY2hhciAqKSAmcHNhLnBzYV9jcmMgLSAoY2hhciAqKSAmcHNhLAorCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX2NyYywgMik7CisKKyNpZmRlZiBERUJVR19JT0NUTF9JTkZPCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB1cGRhdGVfcHNhX2NoZWNrc3VtKCk6IGNyYyA9IDB4JTAyeCUwMnhcbiIsCisJICAgICAgIGRldi0+bmFtZSwgcHNhLnBzYV9jcmNbMF0sIHBzYS5wc2FfY3JjWzFdKTsKKworCS8qIENoZWNrIGFnYWluIChsdXh1cnkgISkgKi8KKwljcmMgPSBwc2FfY3JjKCh1bnNpZ25lZCBjaGFyICopICZwc2EsCisJCSAgICAgIHNpemVvZihwc2EpIC0gc2l6ZW9mKHBzYS5wc2FfY3JjX3N0YXR1cykpOworCisJaWYgKGNyYyAhPSAwKQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IHVwZGF0ZV9wc2FfY2hlY2tzdW0oKTogQ1JDIGRvZXMgbm90IGFncmVlIHdpdGggUFNBIGRhdGEgKGV2ZW4gYWZ0ZXIgcmVjYWxjdWxhdGluZylcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCQkJCS8qIERFQlVHX0lPQ1RMX0lORk8gKi8KKyNlbmRpZgkJCQkvKiBTRVRfUFNBX0NSQyAqLworfQkJCQkvKiB1cGRhdGVfcHNhX2NoZWNrc3VtICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXcml0ZSAxIGJ5dGUgdG8gdGhlIE1NQy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1tY19vdXQodW5zaWduZWQgbG9uZyBpb2FkZHIsIHUxNiBvLCB1OCBkKQoreworCWludCBjb3VudCA9IDA7CisKKwkvKiBXYWl0IGZvciBNTUMgdG8gZ28gaWRsZSAqLworCXdoaWxlICgoY291bnQrKyA8IDEwMCkgJiYgKGludyhIQVNSKGlvYWRkcikpICYgSEFTUl9NTUNfQlVTWSkpCisJCXVkZWxheSgxMCk7CisKKwlvdXR3KCh1MTYpICgoKHUxNikgZCA8PCA4KSB8IChvIDw8IDEpIHwgMSksIE1NQ1IoaW9hZGRyKSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSb3V0aW5lIHRvIHdyaXRlIGJ5dGVzIHRvIHRoZSBNb2RlbSBNYW5hZ2VtZW50IENvbnRyb2xsZXIuCisgKiBXZSBzdGFydCBhdCB0aGUgZW5kIGJlY2F1c2UgaXQgaXMgdGhlIHdheSBpdCBzaG91bGQgYmUhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtbWNfd3JpdGUodW5zaWduZWQgbG9uZyBpb2FkZHIsIHU4IG8sIHU4ICogYiwgaW50IG4pCit7CisJbyArPSBuOworCWIgKz0gbjsKKworCXdoaWxlIChuLS0gPiAwKQorCQltbWNfb3V0KGlvYWRkciwgLS1vLCAqKC0tYikpOworfQkJCQkvKiBtbWNfd3JpdGUgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJlYWQgYSBieXRlIGZyb20gdGhlIE1NQy4KKyAqIE9wdGltaXNlZCB2ZXJzaW9uIGZvciAxIGJ5dGUsIGF2b2lkIHVzaW5nIG1lbW9yeS4KKyAqLworc3RhdGljIGlubGluZSB1OCBtbWNfaW4odW5zaWduZWQgbG9uZyBpb2FkZHIsIHUxNiBvKQoreworCWludCBjb3VudCA9IDA7CisKKwl3aGlsZSAoKGNvdW50KysgPCAxMDApICYmIChpbncoSEFTUihpb2FkZHIpKSAmIEhBU1JfTU1DX0JVU1kpKQorCQl1ZGVsYXkoMTApOworCW91dHcobyA8PCAxLCBNTUNSKGlvYWRkcikpOworCisJd2hpbGUgKChjb3VudCsrIDwgMTAwKSAmJiAoaW53KEhBU1IoaW9hZGRyKSkgJiBIQVNSX01NQ19CVVNZKSkKKwkJdWRlbGF5KDEwKTsKKwlyZXR1cm4gKHU4KSAoaW53KE1NQ1IoaW9hZGRyKSkgPj4gOCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSb3V0aW5lIHRvIHJlYWQgYnl0ZXMgZnJvbSB0aGUgTW9kZW0gTWFuYWdlbWVudCBDb250cm9sbGVyLgorICogVGhlIGltcGxlbWVudGF0aW9uIGlzIGNvbXBsaWNhdGVkIGJ5IGEgbGFjayBvZiBhZGRyZXNzIGxpbmVzLAorICogd2hpY2ggcHJldmVudHMgZGVjb2Rpbmcgb2YgdGhlIGxvdy1vcmRlciBiaXQuCisgKiAoY29kZSBoYXMganVzdCBiZWVuIG1vdmVkIGluIHRoZSBhYm92ZSBmdW5jdGlvbikKKyAqIFdlIHN0YXJ0IGF0IHRoZSBlbmQgYmVjYXVzZSBpdCBpcyB0aGUgd2F5IGl0IHNob3VsZCBiZSEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1tY19yZWFkKHVuc2lnbmVkIGxvbmcgaW9hZGRyLCB1OCBvLCB1OCAqIGIsIGludCBuKQoreworCW8gKz0gbjsKKwliICs9IG47CisKKwl3aGlsZSAobi0tID4gMCkKKwkJKigtLWIpID0gbW1jX2luKGlvYWRkciwgLS1vKTsKK30JCQkJLyogbW1jX3JlYWQgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEdldCB0aGUgdHlwZSBvZiBlbmNyeXB0aW9uIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbW1jX2VuY3IodW5zaWduZWQgbG9uZyBpb2FkZHIpCit7CQkJCS8qIEkvTyBwb3J0IG9mIHRoZSBjYXJkICovCisJaW50IHRlbXA7CisKKwl0ZW1wID0gbW1jX2luKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl9kZXNfYXZhaWwpKTsKKwlpZiAoKHRlbXAgIT0gTU1SX0RFU19BVkFJTF9ERVMpICYmICh0ZW1wICE9IE1NUl9ERVNfQVZBSUxfQUVTKSkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gdGVtcDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdhaXQgZm9yIHRoZSBmcmVxdWVuY3kgRUVQUk9NIHRvIGNvbXBsZXRlIGEgY29tbWFuZC4KKyAqIEkgaG9wZSB0aGlzIG9uZSB3aWxsIGJlIG9wdGltYWxseSBpbmxpbmVkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZmVlX3dhaXQodW5zaWduZWQgbG9uZyBpb2FkZHIsCS8qIEkvTyBwb3J0IG9mIHRoZSBjYXJkICovCisJCQkgICAgaW50IGRlbGF5LAkvKiBCYXNlIGRlbGF5IHRvIHdhaXQgZm9yICovCisJCQkgICAgaW50IG51bWJlcikKK3sJCQkJLyogTnVtYmVyIG9mIHRpbWUgdG8gd2FpdCAqLworCWludCBjb3VudCA9IDA7CQkvKiBXYWl0IG9ubHkgYSBsaW1pdGVkIHRpbWUgKi8KKworCXdoaWxlICgoY291bnQrKyA8IG51bWJlcikgJiYKKwkgICAgICAgKG1tY19pbihpb2FkZHIsIG1tcm9mZigwLCBtbXJfZmVlX3N0YXR1cykpICYKKwkJTU1SX0ZFRV9TVEFUVVNfQlVTWSkpIHVkZWxheShkZWxheSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSZWFkIGJ5dGVzIGZyb20gdGhlIEZyZXF1ZW5jeSBFRVBST00gKGZyZXF1ZW5jeSBzZWxlY3QgY2FyZHMpLgorICovCitzdGF0aWMgdm9pZCBmZWVfcmVhZCh1bnNpZ25lZCBsb25nIGlvYWRkciwJLyogSS9PIHBvcnQgb2YgdGhlIGNhcmQgKi8KKwkJICAgICB1MTYgbywJLyogZGVzdGluYXRpb24gb2Zmc2V0ICovCisJCSAgICAgdTE2ICogYiwJLyogZGF0YSBidWZmZXIgKi8KKwkJICAgICBpbnQgbikKK3sJCQkJLyogbnVtYmVyIG9mIHJlZ2lzdGVycyAqLworCWIgKz0gbjsJCQkvKiBQb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBhcmVhICovCisKKwkvKiBXcml0ZSB0aGUgYWRkcmVzcyAqLworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgbyArIG4gLSAxKTsKKworCS8qIExvb3Agb24gYWxsIGJ1ZmZlciAqLworCXdoaWxlIChuLS0gPiAwKSB7CisJCS8qIFdyaXRlIHRoZSByZWFkIGNvbW1hbmQgKi8KKwkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLAorCQkJTU1XX0ZFRV9DVFJMX1JFQUQpOworCisJCS8qIFdhaXQgdW50aWwgRUVQUk9NIGlzIHJlYWR5IChzaG91bGQgYmUgcXVpY2spLiAqLworCQlmZWVfd2FpdChpb2FkZHIsIDEwLCAxMDApOworCisJCS8qIFJlYWQgdGhlIHZhbHVlLiAqLworCQkqLS1iID0gKChtbWNfaW4oaW9hZGRyLCBtbXJvZmYoMCwgbW1yX2ZlZV9kYXRhX2gpKSA8PCA4KSB8CisJCQltbWNfaW4oaW9hZGRyLCBtbXJvZmYoMCwgbW1yX2ZlZV9kYXRhX2wpKSk7CisJfQorfQorCisjaWZkZWYgV0lSRUxFU1NfRVhUCQkvKiBpZiB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9uIGV4aXN0cyBpbiB0aGUga2VybmVsICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXcml0ZSBieXRlcyBmcm9tIHRoZSBGcmVxdWVuY3kgRUVQUk9NIChmcmVxdWVuY3kgc2VsZWN0IGNhcmRzKS4KKyAqIFRoaXMgaXMgYSBiaXQgY29tcGxpY2F0ZWQsIGJlY2F1c2UgdGhlIGZyZXF1ZW5jeSBFRVBST00gaGFzIHRvCisgKiBiZSB1bnByb3RlY3RlZCBhbmQgdGhlIHdyaXRlIGVuYWJsZWQuCisgKiBKZWFuIElJCisgKi8KK3N0YXRpYyB2b2lkIGZlZV93cml0ZSh1bnNpZ25lZCBsb25nIGlvYWRkciwJLyogSS9PIHBvcnQgb2YgdGhlIGNhcmQgKi8KKwkJICAgICAgdTE2IG8sCS8qIGRlc3RpbmF0aW9uIG9mZnNldCAqLworCQkgICAgICB1MTYgKiBiLAkvKiBkYXRhIGJ1ZmZlciAqLworCQkgICAgICBpbnQgbikKK3sJCQkJLyogbnVtYmVyIG9mIHJlZ2lzdGVycyAqLworCWIgKz0gbjsJCQkvKiBQb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBhcmVhLiAqLworCisjaWZkZWYgRUVQUk9NX0lTX1BST1RFQ1RFRAkvKiBkaXNhYmxlZCAqLworI2lmZGVmIERPRVNOVF9TRUVNX1RPX1dPUksJLyogZGlzYWJsZWQgKi8KKwkvKiBBc2sgdG8gcmVhZCB0aGUgcHJvdGVjdGVkIHJlZ2lzdGVyICovCisJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLCBNTVdfRkVFX0NUUkxfUFJSRUFEKTsKKworCWZlZV93YWl0KGlvYWRkciwgMTAsIDEwMCk7CisKKwkvKiBSZWFkIHRoZSBwcm90ZWN0ZWQgcmVnaXN0ZXIuICovCisJcHJpbnRrKCJQcm90ZWN0ZWQgMjogICUwMlgtJTAyWFxuIiwKKwkgICAgICAgbW1jX2luKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl9mZWVfZGF0YV9oKSksCisJICAgICAgIG1tY19pbihpb2FkZHIsIG1tcm9mZigwLCBtbXJfZmVlX2RhdGFfbCkpKTsKKyNlbmRpZgkJCQkvKiBET0VTTlRfU0VFTV9UT19XT1JLICovCisKKwkvKiBFbmFibGUgcHJvdGVjdGVkIHJlZ2lzdGVyLiAqLworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgTU1XX0ZFRV9BRERSX0VOKTsKKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfY3RybCksIE1NV19GRUVfQ1RSTF9QUkVOKTsKKworCWZlZV93YWl0KGlvYWRkciwgMTAsIDEwMCk7CisKKwkvKiBVbnByb3RlY3QgYXJlYS4gKi8KKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIG8gKyBuKTsKKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfY3RybCksIE1NV19GRUVfQ1RSTF9QUldSSVRFKTsKKyNpZmRlZiBET0VTTlRfU0VFTV9UT19XT1JLCS8qIGRpc2FibGVkICovCisJLyogb3IgdXNlOiAqLworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1BSQ0xFQVIpOworI2VuZGlmCQkJCS8qIERPRVNOVF9TRUVNX1RPX1dPUksgKi8KKworCWZlZV93YWl0KGlvYWRkciwgMTAsIDEwMCk7CisjZW5kaWYJCQkJLyogRUVQUk9NX0lTX1BST1RFQ1RFRCAqLworCisJLyogV3JpdGUgZW5hYmxlLiAqLworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgTU1XX0ZFRV9BRERSX0VOKTsKKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfY3RybCksIE1NV19GRUVfQ1RSTF9XUkVOKTsKKworCWZlZV93YWl0KGlvYWRkciwgMTAsIDEwMCk7CisKKwkvKiBXcml0ZSB0aGUgRUVQUk9NIGFkZHJlc3MuICovCisJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2FkZHIpLCBvICsgbiAtIDEpOworCisJLyogTG9vcCBvbiBhbGwgYnVmZmVyICovCisJd2hpbGUgKG4tLSA+IDApIHsKKwkJLyogV3JpdGUgdGhlIHZhbHVlLiAqLworCQltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfZGF0YV9oKSwgKCotLWIpID4+IDgpOworCQltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfZGF0YV9sKSwgKmIgJiAweEZGKTsKKworCQkvKiBXcml0ZSB0aGUgd3JpdGUgY29tbWFuZC4gKi8KKwkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLAorCQkJTU1XX0ZFRV9DVFJMX1dSSVRFKTsKKworCQkvKiBXYXZlTEFOIGRvY3VtZW50YXRpb24gc2F5cyB0byB3YWl0IGF0IGxlYXN0IDEwIG1zIGZvciBFRUJVU1kgPSAwICovCisJCW1kZWxheSgxMCk7CisJCWZlZV93YWl0KGlvYWRkciwgMTAsIDEwMCk7CisJfQorCisJLyogV3JpdGUgZGlzYWJsZS4gKi8KKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIE1NV19GRUVfQUREUl9EUyk7CisJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLCBNTVdfRkVFX0NUUkxfV0RTKTsKKworCWZlZV93YWl0KGlvYWRkciwgMTAsIDEwMCk7CisKKyNpZmRlZiBFRVBST01fSVNfUFJPVEVDVEVECS8qIGRpc2FibGVkICovCisJLyogUmVwcm90ZWN0IEVFUFJPTS4gKi8KKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIDB4MDApOworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1BSV1JJVEUpOworCisJZmVlX3dhaXQoaW9hZGRyLCAxMCwgMTAwKTsKKyNlbmRpZgkJCQkvKiBFRVBST01fSVNfUFJPVEVDVEVEICovCit9CisjZW5kaWYJCQkJLyogV0lSRUxFU1NfRVhUICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogSTgyNTg2IFNVQlJPVVRJTkVTICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVXNlZnVsIHN1YnJvdXRpbmVzIHRvIG1hbmFnZSB0aGUgRXRoZXJuZXQgY29udHJvbGxlcgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSZWFkIGJ5dGVzIGZyb20gdGhlIG9uLWJvYXJkIFJBTS4KKyAqIFdoeSBkb2VzIGlubGluaW5nIHRoaXMgZnVuY3Rpb24gbWFrZSBpdCBmYWlsPworICovCitzdGF0aWMgLyppbmxpbmUgKi8gdm9pZCBvYnJhbV9yZWFkKHVuc2lnbmVkIGxvbmcgaW9hZGRyLAorCQkJCSAgIHUxNiBvLCB1OCAqIGIsIGludCBuKQoreworCW91dHcobywgUElPUjEoaW9hZGRyKSk7CisJaW5zdyhQSU9QMShpb2FkZHIpLCAodW5zaWduZWQgc2hvcnQgKikgYiwgKG4gKyAxKSA+PiAxKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyaXRlIGJ5dGVzIHRvIHRoZSBvbi1ib2FyZCBSQU0uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBvYnJhbV93cml0ZSh1bnNpZ25lZCBsb25nIGlvYWRkciwgdTE2IG8sIHU4ICogYiwgaW50IG4pCit7CisJb3V0dyhvLCBQSU9SMShpb2FkZHIpKTsKKwlvdXRzdyhQSU9QMShpb2FkZHIpLCAodW5zaWduZWQgc2hvcnQgKikgYiwgKG4gKyAxKSA+PiAxKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEFja25vd2xlZGdlIHRoZSByZWFkaW5nIG9mIHRoZSBzdGF0dXMgaXNzdWVkIGJ5IHRoZSBpODI1ODYuCisgKi8KK3N0YXRpYyB2b2lkIHd2X2FjayhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1MTYgc2NiX2NzOworCWludCBpOworCisJb2JyYW1fcmVhZChpb2FkZHIsIHNjYm9mZihPRkZTRVRfU0NCLCBzY2Jfc3RhdHVzKSwKKwkJICAgKHVuc2lnbmVkIGNoYXIgKikgJnNjYl9jcywgc2l6ZW9mKHNjYl9jcykpOworCXNjYl9jcyAmPSBTQ0JfU1RfSU5UOworCisJaWYgKHNjYl9jcyA9PSAwKQorCQlyZXR1cm47CisKKwlvYnJhbV93cml0ZShpb2FkZHIsIHNjYm9mZihPRkZTRVRfU0NCLCBzY2JfY29tbWFuZCksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmc2NiX2NzLCBzaXplb2Yoc2NiX2NzKSk7CisKKwlzZXRfY2hhbl9hdHRuKGlvYWRkciwgbHAtPmhhY3IpOworCisJZm9yIChpID0gMTAwMDsgaSA+IDA7IGktLSkgeworCQlvYnJhbV9yZWFkKGlvYWRkciwgc2Nib2ZmKE9GRlNFVF9TQ0IsIHNjYl9jb21tYW5kKSwKKwkJCSAgICh1bnNpZ25lZCBjaGFyICopICZzY2JfY3MsIHNpemVvZihzY2JfY3MpKTsKKwkJaWYgKHNjYl9jcyA9PSAwKQorCQkJYnJlYWs7CisKKwkJdWRlbGF5KDEwKTsKKwl9CisJdWRlbGF5KDEwMCk7CisKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwlpZiAoaSA8PSAwKQorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHd2X2FjaygpOiBib2FyZCBub3QgYWNjZXB0aW5nIGNvbW1hbmQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU2V0IGNoYW5uZWwgYXR0ZW50aW9uIGJpdCBhbmQgYnVzeSB3YWl0IHVudGlsIGNvbW1hbmQgaGFzCisgKiBjb21wbGV0ZWQsIHRoZW4gYWNrbm93bGVkZ2UgY29tcGxldGlvbiBvZiB0aGUgY29tbWFuZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgd3Zfc3luY2hyb25vdXNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCBjb25zdCBjaGFyICpzdHIpCit7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJdTE2IHNjYl9jbWQ7CisJYWNoX3QgY2I7CisJaW50IGk7CisKKwlzY2JfY21kID0gU0NCX0NNRF9DVUMgJiBTQ0JfQ01EX0NVQ19HTzsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHNjYm9mZihPRkZTRVRfU0NCLCBzY2JfY29tbWFuZCksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmc2NiX2NtZCwgc2l6ZW9mKHNjYl9jbWQpKTsKKworCXNldF9jaGFuX2F0dG4oaW9hZGRyLCBscC0+aGFjcik7CisKKwlmb3IgKGkgPSAxMDAwOyBpID4gMDsgaS0tKSB7CisJCW9icmFtX3JlYWQoaW9hZGRyLCBPRkZTRVRfQ1UsICh1bnNpZ25lZCBjaGFyICopICZjYiwKKwkJCSAgIHNpemVvZihjYikpOworCQlpZiAoY2IuYWNfc3RhdHVzICYgQUNfU0ZMRF9DKQorCQkJYnJlYWs7CisKKwkJdWRlbGF5KDEwKTsKKwl9CisJdWRlbGF5KDEwMCk7CisKKwlpZiAoaSA8PSAwIHx8ICEoY2IuYWNfc3RhdHVzICYgQUNfU0ZMRF9PSykpIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGZhaWxlZDsgc3RhdHVzID0gMHgleFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgc3RyLCBjYi5hY19zdGF0dXMpOworI2VuZGlmCisjaWZkZWYgREVCVUdfSTgyNTg2X1NIT1cKKwkJd3Zfc2NiX3Nob3coaW9hZGRyKTsKKyNlbmRpZgorCQlyZXR1cm4gLTE7CisJfQorCisJLyogQWNrIHRoZSBzdGF0dXMgKi8KKwl3dl9hY2soZGV2KTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ29uZmlndXJhdGlvbiBjb21tYW5kcyBjb21wbGV0aW9uIGludGVycnVwdC4KKyAqIENoZWNrIGlmIGRvbmUsIGFuZCBpZiBPSy4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK3d2X2NvbmZpZ19jb21wbGV0ZShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgdW5zaWduZWQgbG9uZyBpb2FkZHIsIG5ldF9sb2NhbCAqIGxwKQoreworCXVuc2lnbmVkIHNob3J0IG1jc19hZGRyOworCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKKwlpbnQgcmV0OworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X2NvbmZpZ19jb21wbGV0ZSgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwltY3NfYWRkciA9IGxwLT50eF9maXJzdF9pbl91c2UgKyBzaXplb2YoYWNfdHhfdCkgKyBzaXplb2YoYWNfbm9wX3QpCisJICAgICsgc2l6ZW9mKHRiZF90KSArIHNpemVvZihhY19jZmdfdCkgKyBzaXplb2YoYWNfaWFzX3QpOworCisJLyogUmVhZCB0aGUgc3RhdHVzIG9mIHRoZSBsYXN0IGNvbW1hbmQgKHNldCBtYyBsaXN0KS4gKi8KKwlvYnJhbV9yZWFkKGlvYWRkciwgYWNvZmYobWNzX2FkZHIsIGFjX3N0YXR1cyksCisJCSAgICh1bnNpZ25lZCBjaGFyICopICZzdGF0dXMsIHNpemVvZihzdGF0dXMpKTsKKworCS8qIElmIG5vdCBjb21wbGV0ZWQgLT4gZXhpdCAqLworCWlmICgoc3RhdHVzICYgQUNfU0ZMRF9DKSA9PSAwKQorCQlyZXQgPSAwOwkvKiBOb3QgcmVhZHkgdG8gYmUgc2NyYXBwZWQgKi8KKwllbHNlIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJdW5zaWduZWQgc2hvcnQgY2ZnX2FkZHI7CisJCXVuc2lnbmVkIHNob3J0IGlhc19hZGRyOworCisJCS8qIENoZWNrIG1jX2NvbmZpZyBjb21tYW5kICovCisJCWlmICgoc3RhdHVzICYgQUNfU0ZMRF9PSykgIT0gQUNfU0ZMRF9PSykKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAiJXM6IHd2X2NvbmZpZ19jb21wbGV0ZSgpOiBzZXRfbXVsdGljYXN0X2FkZHJlc3MgZmFpbGVkOyBzdGF0dXMgPSAweCV4XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKworCQkvKiBjaGVjayBpYS1jb25maWcgY29tbWFuZCAqLworCQlpYXNfYWRkciA9IG1jc19hZGRyIC0gc2l6ZW9mKGFjX2lhc190KTsKKwkJb2JyYW1fcmVhZChpb2FkZHIsIGFjb2ZmKGlhc19hZGRyLCBhY19zdGF0dXMpLAorCQkJICAgKHVuc2lnbmVkIGNoYXIgKikgJnN0YXR1cywgc2l6ZW9mKHN0YXR1cykpOworCQlpZiAoKHN0YXR1cyAmIEFDX1NGTERfT0spICE9IEFDX1NGTERfT0spCisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgIiVzOiB3dl9jb25maWdfY29tcGxldGUoKTogc2V0X01BQ19hZGRyZXNzIGZhaWxlZDsgc3RhdHVzID0gMHgleFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisKKwkJLyogQ2hlY2sgY29uZmlnIGNvbW1hbmQuICovCisJCWNmZ19hZGRyID0gaWFzX2FkZHIgLSBzaXplb2YoYWNfY2ZnX3QpOworCQlvYnJhbV9yZWFkKGlvYWRkciwgYWNvZmYoY2ZnX2FkZHIsIGFjX3N0YXR1cyksCisJCQkgICAodW5zaWduZWQgY2hhciAqKSAmc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSk7CisJCWlmICgoc3RhdHVzICYgQUNfU0ZMRF9PSykgIT0gQUNfU0ZMRF9PSykKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICAiJXM6IHd2X2NvbmZpZ19jb21wbGV0ZSgpOiBjb25maWd1cmUgZmFpbGVkOyBzdGF0dXMgPSAweCV4XG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgc3RhdHVzKTsKKyNlbmRpZgkvKiBERUJVR19DT05GSUdfRVJST1IgKi8KKworCQlyZXQgPSAxOwkvKiBSZWFkeSB0byBiZSBzY3JhcHBlZCAqLworCX0KKworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl9jb25maWdfY29tcGxldGUoKSAtICVkXG4iLCBkZXYtPm5hbWUsCisJICAgICAgIHJldCk7CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ29tbWFuZCBjb21wbGV0aW9uIGludGVycnVwdC4KKyAqIFJlY2xhaW0gYXMgbWFueSBmcmVlZCB0eCBidWZmZXJzIGFzIHdlIGNhbi4KKyAqIChjYWxsZWQgaW4gd2F2ZWxhbl9pbnRlcnJ1cHQoKSkuCisgKiBOb3RlIDogdGhlIHNwaW5sb2NrIGlzIGFscmVhZHkgZ3JhYmJlZCBmb3IgdXMuCisgKi8KK3N0YXRpYyBpbnQgd3ZfY29tcGxldGUoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIHVuc2lnbmVkIGxvbmcgaW9hZGRyLCBuZXRfbG9jYWwgKiBscCkKK3sKKwlpbnQgbnJlYXBlZCA9IDA7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfY29tcGxldGUoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogTG9vcCBvbiBhbGwgdGhlIHRyYW5zbWl0IGJ1ZmZlcnMgKi8KKwl3aGlsZSAobHAtPnR4X2ZpcnN0X2luX3VzZSAhPSBJODI1ODZOVUxMKSB7CisJCXVuc2lnbmVkIHNob3J0IHR4X3N0YXR1czsKKworCQkvKiBSZWFkIHRoZSBmaXJzdCB0cmFuc21pdCBidWZmZXIgKi8KKwkJb2JyYW1fcmVhZChpb2FkZHIsIGFjb2ZmKGxwLT50eF9maXJzdF9pbl91c2UsIGFjX3N0YXR1cyksCisJCQkgICAodW5zaWduZWQgY2hhciAqKSAmdHhfc3RhdHVzLAorCQkJICAgc2l6ZW9mKHR4X3N0YXR1cykpOworCisJCS8qIElmIG5vdCBjb21wbGV0ZWQgLT4gZXhpdCAqLworCQlpZiAoKHR4X3N0YXR1cyAmIEFDX1NGTERfQykgPT0gMCkKKwkJCWJyZWFrOworCisJCS8qIEhhY2sgZm9yIHJlY29uZmlndXJhdGlvbiAqLworCQlpZiAodHhfc3RhdHVzID09IDB4RkZGRikKKwkJCWlmICghd3ZfY29uZmlnX2NvbXBsZXRlKGRldiwgaW9hZGRyLCBscCkpCisJCQkJYnJlYWs7CS8qIE5vdCBjb21wbGV0ZWQgKi8KKworCQkvKiBXZSBub3cgcmVtb3ZlIHRoaXMgYnVmZmVyICovCisJCW5yZWFwZWQrKzsKKwkJLS1scC0+dHhfbl9pbl91c2U7CisKKy8qCitpZiAobHAtPnR4X25faW5fdXNlID4gMCkKKwlwcmludGsoIiVjIiwgIjAxMjM0NTY3ODlhYmNkZWZnaGlqayJbbHAtPnR4X25faW5fdXNlXSk7CisqLworCisJCS8qIFdhcyBpdCB0aGUgbGFzdCBvbmU/ICovCisJCWlmIChscC0+dHhfbl9pbl91c2UgPD0gMCkKKwkJCWxwLT50eF9maXJzdF9pbl91c2UgPSBJODI1ODZOVUxMOworCQllbHNlIHsKKwkJCS8qIE5leHQgb25lIGluIHRoZSBjaGFpbiAqLworCQkJbHAtPnR4X2ZpcnN0X2luX3VzZSArPSBUWEJMT0NLWjsKKwkJCWlmIChscC0+dHhfZmlyc3RfaW5fdXNlID49CisJCQkgICAgT0ZGU0VUX0NVICsKKwkJCSAgICBOVFhCTE9DS1MgKiBUWEJMT0NLWikgbHAtPnR4X2ZpcnN0X2luX3VzZSAtPQorCQkJCSAgICBOVFhCTE9DS1MgKiBUWEJMT0NLWjsKKwkJfQorCisJCS8qIEhhY2sgZm9yIHJlY29uZmlndXJhdGlvbiAqLworCQlpZiAodHhfc3RhdHVzID09IDB4RkZGRikKKwkJCWNvbnRpbnVlOworCisJCS8qIE5vdywgY2hlY2sgc3RhdHVzIG9mIHRoZSBmaW5pc2hlZCBjb21tYW5kICovCisJCWlmICh0eF9zdGF0dXMgJiBBQ19TRkxEX09LKSB7CisJCQlpbnQgbmNvbGxpc2lvbnM7CisKKwkJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQluY29sbGlzaW9ucyA9IHR4X3N0YXR1cyAmIEFDX1NGTERfTUFYQ09MOworCQkJbHAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gbmNvbGxpc2lvbnM7CisjaWZkZWYgREVCVUdfVFhfSU5GTworCQkJaWYgKG5jb2xsaXNpb25zID4gMCkKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiJXM6IHd2X2NvbXBsZXRlKCk6IHR4IGNvbXBsZXRlZCBhZnRlciAlZCBjb2xsaXNpb25zLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lLCBuY29sbGlzaW9ucyk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWlmICh0eF9zdGF0dXMgJiBBQ19TRkxEX1MxMCkgeworCQkJCWxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworI2lmZGVmIERFQlVHX1RYX0ZBSUwKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiJXM6IHd2X2NvbXBsZXRlKCk6IHR4IGVycm9yOiBubyBDUy5cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJCX0KKwkJCWlmICh0eF9zdGF0dXMgJiBBQ19TRkxEX1M5KSB7CisJCQkJbHAtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfVFhfRkFJTAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogd3ZfY29tcGxldGUoKTogdHggZXJyb3I6IGxvc3QgQ1RTLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkJfQorCQkJaWYgKHR4X3N0YXR1cyAmIEFDX1NGTERfUzgpIHsKKwkJCQlscC0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKKyNpZmRlZiBERUJVR19UWF9GQUlMCisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkgICAgICAgIiVzOiB3dl9jb21wbGV0ZSgpOiB0eCBlcnJvcjogc2xvdyBETUEuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQl9CisJCQlpZiAodHhfc3RhdHVzICYgQUNfU0ZMRF9TNikgeworCQkJCWxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfVFhfRkFJTAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogd3ZfY29tcGxldGUoKTogdHggZXJyb3I6IGhlYXJ0IGJlYXQuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQl9CisJCQlpZiAodHhfc3RhdHVzICYgQUNfU0ZMRF9TNSkgeworCQkJCWxwLT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworI2lmZGVmIERFQlVHX1RYX0ZBSUwKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiJXM6IHd2X2NvbXBsZXRlKCk6IHR4IGVycm9yOiB0b28gbWFueSBjb2xsaXNpb25zLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkJfQorCQl9CisKKyNpZmRlZiBERUJVR19UWF9JTkZPCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6IHd2X2NvbXBsZXRlKCk6IHR4IGNvbXBsZXRlZCwgdHhfc3RhdHVzIDB4JTA0eFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgdHhfc3RhdHVzKTsKKyNlbmRpZgorCX0KKworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9JTkZPCisJaWYgKG5yZWFwZWQgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHd2X2NvbXBsZXRlKCk6IHJlYXBlZCAlZFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbnJlYXBlZCk7CisjZW5kaWYKKworCS8qCisJICogSW5mb3JtIHVwcGVyIGxheWVycy4KKwkgKi8KKwlpZiAobHAtPnR4X25faW5fdXNlIDwgTlRYQkxPQ0tTIC0gMSkgeworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl9jb21wbGV0ZSgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJcmV0dXJuIG5yZWFwZWQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSZWNvbmZpZ3VyZSB0aGUgaTgyNTg2LCBvciBhdCBsZWFzdCBhc2sgZm9yIGl0LgorICogQmVjYXVzZSB3dl84MjU4Nl9jb25maWcgdXNlcyBhIHRyYW5zbWlzc2lvbiBidWZmZXIsIHdlIG11c3QgZG8gaXQKKyAqIHdoZW4gd2UgYXJlIHN1cmUgdGhhdCB0aGVyZSBpcyBvbmUgbGVmdCwgc28gd2UgZG8gaXQgbm93CisgKiBvciBpbiB3YXZlbGFuX3BhY2tldF94bWl0KCkgKEkgY2FuJ3QgZmluZCBhbnkgYmV0dGVyIHBsYWNlLAorICogd2F2ZWxhbl9pbnRlcnJ1cHQgaXMgbm90IGFuIG9wdGlvbiksIHNvIHlvdSBtYXkgZXhwZXJpZW5jZQorICogZGVsYXlzIHNvbWV0aW1lcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHd2XzgyNTg2X3JlY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogQXJtIHRoZSBmbGFnLCB3aWxsIGJlIGNsZWFyZCBpbiB3dl84MjU4Nl9jb25maWcoKSAqLworCWxwLT5yZWNvbmZpZ184MjU4NiA9IDE7CisKKwkvKiBDaGVjayBpZiB3ZSBjYW4gZG8gaXQgbm93ICEgKi8KKwlpZigobmV0aWZfcnVubmluZyhkZXYpKSAmJiAhKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQkvKiBNYXkgZmFpbCAqLworCQl3dl84MjU4Nl9jb25maWcoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJfQorCWVsc2UgeworI2lmZGVmIERFQlVHX0NPTkZJR19JTkZPCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6IHd2XzgyNTg2X3JlY29uZmlnKCk6IGRlbGF5ZWQgKHN0YXRlID0gJWxYKVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGRldi0+c3RhdGUpOworI2VuZGlmCisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqIERFQlVHICYgSU5GTyBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgaW4gdGhlIGNvZGUgdG8gc2hvdyBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nLgorICogTW9zdCBvZiB0aGUgdGltZSwgaXQgZHVtcHMgdGhlIGNvbnRlbnRzIG9mIGhhcmR3YXJlIHN0cnVjdHVyZXMuCisgKi8KKworI2lmZGVmIERFQlVHX1BTQV9TSE9XCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJpbnQgdGhlIGZvcm1hdHRlZCBjb250ZW50cyBvZiB0aGUgUGFyYW1ldGVyIFN0b3JhZ2UgQXJlYS4KKyAqLworc3RhdGljIHZvaWQgd3ZfcHNhX3Nob3cocHNhX3QgKiBwKQoreworCXByaW50ayhLRVJOX0RFQlVHICIjIyMjIyBXYXZlTEFOIFBTQSBjb250ZW50czogIyMjIyNcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJwc2FfaW9fYmFzZV9hZGRyXzE6IDB4JTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkgICAgICAgcC0+cHNhX2lvX2Jhc2VfYWRkcl8xLAorCSAgICAgICBwLT5wc2FfaW9fYmFzZV9hZGRyXzIsCisJICAgICAgIHAtPnBzYV9pb19iYXNlX2FkZHJfMywgcC0+cHNhX2lvX2Jhc2VfYWRkcl80KTsKKwlwcmludGsoS0VSTl9ERUJVRyAicHNhX3JlbV9ib290X2FkZHJfMTogMHglMDJYICUwMlggJTAyWFxuIiwKKwkgICAgICAgcC0+cHNhX3JlbV9ib290X2FkZHJfMSwKKwkgICAgICAgcC0+cHNhX3JlbV9ib290X2FkZHJfMiwgcC0+cHNhX3JlbV9ib290X2FkZHJfMyk7CisJcHJpbnRrKEtFUk5fREVCVUcgInBzYV9ob2xpX3BhcmFtczogMHglMDJ4LCAiLCBwLT5wc2FfaG9saV9wYXJhbXMpOworCXByaW50aygicHNhX2ludF9yZXFfbm86ICVkXG4iLCBwLT5wc2FfaW50X3JlcV9ubyk7CisjaWZkZWYgREVCVUdfU0hPV19VTlVTRUQKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAicHNhX3VudXNlZDBbXTogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkgICAgICAgcC0+cHNhX3VudXNlZDBbMF0sIHAtPnBzYV91bnVzZWQwWzFdLCBwLT5wc2FfdW51c2VkMFsyXSwKKwkgICAgICAgcC0+cHNhX3VudXNlZDBbM10sIHAtPnBzYV91bnVzZWQwWzRdLCBwLT5wc2FfdW51c2VkMFs1XSwKKwkgICAgICAgcC0+cHNhX3VudXNlZDBbNl0pOworI2VuZGlmCQkJCS8qIERFQlVHX1NIT1dfVU5VU0VEICovCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgInBzYV91bml2X21hY19hZGRyW106ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgICBwLT5wc2FfdW5pdl9tYWNfYWRkclswXSwgcC0+cHNhX3VuaXZfbWFjX2FkZHJbMV0sCisJICAgICAgIHAtPnBzYV91bml2X21hY19hZGRyWzJdLCBwLT5wc2FfdW5pdl9tYWNfYWRkclszXSwKKwkgICAgICAgcC0+cHNhX3VuaXZfbWFjX2FkZHJbNF0sIHAtPnBzYV91bml2X21hY19hZGRyWzVdKTsKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAicHNhX2xvY2FsX21hY19hZGRyW106ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSAgICAgICBwLT5wc2FfbG9jYWxfbWFjX2FkZHJbMF0sIHAtPnBzYV9sb2NhbF9tYWNfYWRkclsxXSwKKwkgICAgICAgcC0+cHNhX2xvY2FsX21hY19hZGRyWzJdLCBwLT5wc2FfbG9jYWxfbWFjX2FkZHJbM10sCisJICAgICAgIHAtPnBzYV9sb2NhbF9tYWNfYWRkcls0XSwgcC0+cHNhX2xvY2FsX21hY19hZGRyWzVdKTsKKwlwcmludGsoS0VSTl9ERUJVRyAicHNhX3VuaXZfbG9jYWxfc2VsOiAlZCwgIiwKKwkgICAgICAgcC0+cHNhX3VuaXZfbG9jYWxfc2VsKTsKKwlwcmludGsoInBzYV9jb21wX251bWJlcjogJWQsICIsIHAtPnBzYV9jb21wX251bWJlcik7CisJcHJpbnRrKCJwc2FfdGhyX3ByZV9zZXQ6IDB4JTAyeFxuIiwgcC0+cHNhX3Rocl9wcmVfc2V0KTsKKwlwcmludGsoS0VSTl9ERUJVRyAicHNhX2ZlYXR1cmVfc2VsZWN0L2RlY2F5X3BybTogMHglMDJ4LCAiLAorCSAgICAgICBwLT5wc2FfZmVhdHVyZV9zZWxlY3QpOworCXByaW50aygicHNhX3N1YmJhbmQvZGVjYXlfdXBkYXRlX3BybTogJWRcbiIsIHAtPnBzYV9zdWJiYW5kKTsKKwlwcmludGsoS0VSTl9ERUJVRyAicHNhX3F1YWxpdHlfdGhyOiAweCUwMngsICIsIHAtPnBzYV9xdWFsaXR5X3Rocik7CisJcHJpbnRrKCJwc2FfbW9kX2RlbGF5OiAweCUwMnhcbiIsIHAtPnBzYV9tb2RfZGVsYXkpOworCXByaW50ayhLRVJOX0RFQlVHICJwc2FfbndpZDogMHglMDJ4JTAyeCwgIiwgcC0+cHNhX253aWRbMF0sCisJICAgICAgIHAtPnBzYV9ud2lkWzFdKTsKKwlwcmludGsoInBzYV9ud2lkX3NlbGVjdDogJWRcbiIsIHAtPnBzYV9ud2lkX3NlbGVjdCk7CisJcHJpbnRrKEtFUk5fREVCVUcgInBzYV9lbmNyeXB0aW9uX3NlbGVjdDogJWQsICIsCisJICAgICAgIHAtPnBzYV9lbmNyeXB0aW9uX3NlbGVjdCk7CisJcHJpbnRrCisJICAgICgicHNhX2VuY3J5cHRpb25fa2V5W106ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgIHAtPnBzYV9lbmNyeXB0aW9uX2tleVswXSwgcC0+cHNhX2VuY3J5cHRpb25fa2V5WzFdLAorCSAgICAgcC0+cHNhX2VuY3J5cHRpb25fa2V5WzJdLCBwLT5wc2FfZW5jcnlwdGlvbl9rZXlbM10sCisJICAgICBwLT5wc2FfZW5jcnlwdGlvbl9rZXlbNF0sIHAtPnBzYV9lbmNyeXB0aW9uX2tleVs1XSwKKwkgICAgIHAtPnBzYV9lbmNyeXB0aW9uX2tleVs2XSwgcC0+cHNhX2VuY3J5cHRpb25fa2V5WzddKTsKKwlwcmludGsoS0VSTl9ERUJVRyAicHNhX2RhdGFidXNfd2lkdGg6ICVkXG4iLCBwLT5wc2FfZGF0YWJ1c193aWR0aCk7CisJcHJpbnRrKEtFUk5fREVCVUcgInBzYV9jYWxsX2NvZGUvYXV0b19zcXVlbGNoOiAweCUwMngsICIsCisJICAgICAgIHAtPnBzYV9jYWxsX2NvZGVbMF0pOworCXByaW50aworCSAgICAoInBzYV9jYWxsX2NvZGVbXTogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCSAgICAgcC0+cHNhX2NhbGxfY29kZVswXSwgcC0+cHNhX2NhbGxfY29kZVsxXSwgcC0+cHNhX2NhbGxfY29kZVsyXSwKKwkgICAgIHAtPnBzYV9jYWxsX2NvZGVbM10sIHAtPnBzYV9jYWxsX2NvZGVbNF0sIHAtPnBzYV9jYWxsX2NvZGVbNV0sCisJICAgICBwLT5wc2FfY2FsbF9jb2RlWzZdLCBwLT5wc2FfY2FsbF9jb2RlWzddKTsKKyNpZmRlZiBERUJVR19TSE9XX1VOVVNFRAorCXByaW50ayhLRVJOX0RFQlVHICJwc2FfcmVzZXJ2ZWRbXTogJTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkgICAgICAgcC0+cHNhX3Jlc2VydmVkWzBdLAorCSAgICAgICBwLT5wc2FfcmVzZXJ2ZWRbMV0sIHAtPnBzYV9yZXNlcnZlZFsyXSwgcC0+cHNhX3Jlc2VydmVkWzNdKTsKKyNlbmRpZgkJCQkvKiBERUJVR19TSE9XX1VOVVNFRCAqLworCXByaW50ayhLRVJOX0RFQlVHICJwc2FfY29uZl9zdGF0dXM6ICVkLCAiLCBwLT5wc2FfY29uZl9zdGF0dXMpOworCXByaW50aygicHNhX2NyYzogMHglMDJ4JTAyeCwgIiwgcC0+cHNhX2NyY1swXSwgcC0+cHNhX2NyY1sxXSk7CisJcHJpbnRrKCJwc2FfY3JjX3N0YXR1czogMHglMDJ4XG4iLCBwLT5wc2FfY3JjX3N0YXR1cyk7Cit9CQkJCS8qIHd2X3BzYV9zaG93ICovCisjZW5kaWYJCQkJLyogREVCVUdfUFNBX1NIT1cgKi8KKworI2lmZGVmIERFQlVHX01NQ19TSE9XCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJpbnQgdGhlIGZvcm1hdHRlZCBzdGF0dXMgb2YgdGhlIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlci4KKyAqIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgY29tcGxldGVkLgorICovCitzdGF0aWMgdm9pZCB3dl9tbWNfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwltbXJfdCBtOworCisJLyogQmFzaWMgY2hlY2sgKi8KKwlpZiAoaGFzcl9yZWFkKGlvYWRkcikgJiBIQVNSX05PX0NMSykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IHd2X21tY19zaG93OiBtb2RlbSBub3QgY29ubmVjdGVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFJlYWQgdGhlIG1tYyAqLworCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZyZWV6ZSksIDEpOworCW1tY19yZWFkKGlvYWRkciwgMCwgKHU4ICopICYgbSwgc2l6ZW9mKG0pKTsKKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mcmVlemUpLCAwKTsKKworI2lmZGVmIFdJUkVMRVNTX0VYVAkJLyogaWYgd2lyZWxlc3MgZXh0ZW5zaW9uIGV4aXN0cyBpbiB0aGUga2VybmVsICovCisJLyogRG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSBzdGF0aXN0aWNzICovCisJbHAtPndzdGF0cy5kaXNjYXJkLm53aWQgKz0KKwkgICAgKG0ubW1yX3dyb25nX253aWRfaCA8PCA4KSB8IG0ubW1yX3dyb25nX253aWRfbDsKKyNlbmRpZgkJCQkvKiBXSVJFTEVTU19FWFQgKi8KKworCXByaW50ayhLRVJOX0RFQlVHICIjIyMjIyBXYXZlTEFOIG1vZGVtIHN0YXR1cyByZWdpc3RlcnM6ICMjIyMjXG4iKTsKKyNpZmRlZiBERUJVR19TSE9XX1VOVVNFRAorCXByaW50ayhLRVJOX0RFQlVHCisJICAgICAgICJtbWNfdW51c2VkMFtdOiAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJICAgICAgIG0ubW1yX3VudXNlZDBbMF0sIG0ubW1yX3VudXNlZDBbMV0sIG0ubW1yX3VudXNlZDBbMl0sCisJICAgICAgIG0ubW1yX3VudXNlZDBbM10sIG0ubW1yX3VudXNlZDBbNF0sIG0ubW1yX3VudXNlZDBbNV0sCisJICAgICAgIG0ubW1yX3VudXNlZDBbNl0sIG0ubW1yX3VudXNlZDBbN10pOworI2VuZGlmCQkJCS8qIERFQlVHX1NIT1dfVU5VU0VEICovCisJcHJpbnRrKEtFUk5fREVCVUcgIkVuY3J5cHRpb24gYWxnb3JpdGhtOiAlMDJYIC0gU3RhdHVzOiAlMDJYXG4iLAorCSAgICAgICBtLm1tcl9kZXNfYXZhaWwsIG0ubW1yX2Rlc19zdGF0dXMpOworI2lmZGVmIERFQlVHX1NIT1dfVU5VU0VECisJcHJpbnRrKEtFUk5fREVCVUcgIm1tY191bnVzZWQxW106ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkgICAgICAgbS5tbXJfdW51c2VkMVswXSwKKwkgICAgICAgbS5tbXJfdW51c2VkMVsxXSwKKwkgICAgICAgbS5tbXJfdW51c2VkMVsyXSwgbS5tbXJfdW51c2VkMVszXSwgbS5tbXJfdW51c2VkMVs0XSk7CisjZW5kaWYJCQkJLyogREVCVUdfU0hPV19VTlVTRUQgKi8KKwlwcmludGsoS0VSTl9ERUJVRyAiZGNlX3N0YXR1czogMHgleCBbJXMlcyVzJXNdXG4iLAorCSAgICAgICBtLm1tcl9kY2Vfc3RhdHVzLAorCSAgICAgICAobS4KKwkJbW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVU19SWF9CVVNZKSA/CisJICAgICAgICJlbmVyZ3kgZGV0ZWN0ZWQsIiA6ICIiLAorCSAgICAgICAobS4KKwkJbW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVU19MT09QVF9JTkQpID8KKwkgICAgICAgImxvb3AgdGVzdCBpbmRpY2F0ZWQsIiA6ICIiLAorCSAgICAgICAobS4KKwkJbW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVU19UWF9CVVNZKSA/CisJICAgICAgICJ0cmFuc21pdHRlciBvbiwiIDogIiIsCisJICAgICAgIChtLgorCQltbXJfZGNlX3N0YXR1cyAmIE1NUl9EQ0VfU1RBVFVTX0pCUl9FWFBJUkVEKSA/CisJICAgICAgICJqYWJiZXIgdGltZXIgZXhwaXJlZCwiIDogIiIpOworCXByaW50ayhLRVJOX0RFQlVHICJEc3AgSUQ6ICUwMlhcbiIsIG0ubW1yX2RzcF9pZCk7CisjaWZkZWYgREVCVUdfU0hPV19VTlVTRUQKKwlwcmludGsoS0VSTl9ERUJVRyAibW1jX3VudXNlZDJbXTogJTAyWDolMDJYXG4iLAorCSAgICAgICBtLm1tcl91bnVzZWQyWzBdLCBtLm1tcl91bnVzZWQyWzFdKTsKKyNlbmRpZgkJCQkvKiBERUJVR19TSE9XX1VOVVNFRCAqLworCXByaW50ayhLRVJOX0RFQlVHICIjIGNvcnJlY3RfbndpZDogJWQsICMgd3JvbmdfbndpZDogJWRcbiIsCisJICAgICAgIChtLm1tcl9jb3JyZWN0X253aWRfaCA8PCA4KSB8IG0ubW1yX2NvcnJlY3RfbndpZF9sLAorCSAgICAgICAobS5tbXJfd3JvbmdfbndpZF9oIDw8IDgpIHwgbS5tbXJfd3JvbmdfbndpZF9sKTsKKwlwcmludGsoS0VSTl9ERUJVRyAidGhyX3ByZV9zZXQ6IDB4JXggW2N1cnJlbnQgc2lnbmFsICVzXVxuIiwKKwkgICAgICAgbS5tbXJfdGhyX3ByZV9zZXQgJiBNTVJfVEhSX1BSRV9TRVQsCisJICAgICAgIChtLgorCQltbXJfdGhyX3ByZV9zZXQgJiBNTVJfVEhSX1BSRV9TRVRfQ1VSKSA/ICJhYm92ZSIgOgorCSAgICAgICAiYmVsb3ciKTsKKwlwcmludGsoS0VSTl9ERUJVRyAic2lnbmFsX2x2bDogJWQgWyVzXSwgIiwKKwkgICAgICAgbS5tbXJfc2lnbmFsX2x2bCAmIE1NUl9TSUdOQUxfTFZMLAorCSAgICAgICAobS4KKwkJbW1yX3NpZ25hbF9sdmwgJiBNTVJfU0lHTkFMX0xWTF9WQUxJRCkgPyAibmV3IG1zZyIgOgorCSAgICAgICAibm8gbmV3IG1zZyIpOworCXByaW50aygic2lsZW5jZV9sdmw6ICVkIFslc10sICIsCisJICAgICAgIG0ubW1yX3NpbGVuY2VfbHZsICYgTU1SX1NJTEVOQ0VfTFZMLAorCSAgICAgICAobS4KKwkJbW1yX3NpbGVuY2VfbHZsICYgTU1SX1NJTEVOQ0VfTFZMX1ZBTElEKSA/ICJ1cGRhdGUgZG9uZSIgOgorCSAgICAgICAibm8gbmV3IHVwZGF0ZSIpOworCXByaW50aygic2dubF9xdWFsOiAweCV4IFslc11cbiIsIG0ubW1yX3NnbmxfcXVhbCAmIE1NUl9TR05MX1FVQUwsCisJICAgICAgIChtLgorCQltbXJfc2dubF9xdWFsICYgTU1SX1NHTkxfUVVBTF9BTlQpID8gIkFudGVubmEgMSIgOgorCSAgICAgICAiQW50ZW5uYSAwIik7CisjaWZkZWYgREVCVUdfU0hPV19VTlVTRUQKKwlwcmludGsoS0VSTl9ERUJVRyAibmV0d19pZF9sOiAleFxuIiwgbS5tbXJfbmV0d19pZF9sKTsKKyNlbmRpZgkJCQkvKiBERUJVR19TSE9XX1VOVVNFRCAqLworfQkJCQkvKiB3dl9tbWNfc2hvdyAqLworI2VuZGlmCQkJCS8qIERFQlVHX01NQ19TSE9XICovCisKKyNpZmRlZiBERUJVR19JODI1ODZfU0hPVworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHRoZSBsYXN0IGJsb2NrIG9mIHRoZSBpODI1ODYgbWVtb3J5LgorICovCitzdGF0aWMgdm9pZCB3dl9zY2Jfc2hvdyh1bnNpZ25lZCBsb25nIGlvYWRkcikKK3sKKwlzY2JfdCBzY2I7CisKKwlvYnJhbV9yZWFkKGlvYWRkciwgT0ZGU0VUX1NDQiwgKHVuc2lnbmVkIGNoYXIgKikgJnNjYiwKKwkJICAgc2l6ZW9mKHNjYikpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiMjIyMjIFdhdmVMQU4gc3lzdGVtIGNvbnRyb2wgYmxvY2s6ICMjIyMjXG4iKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJzdGF0dXM6ICIpOworCXByaW50aygic3RhdCAweCV4WyVzJXMlcyVzXSAiLAorCSAgICAgICAoc2NiLgorCQlzY2Jfc3RhdHVzICYgKFNDQl9TVF9DWCB8IFNDQl9TVF9GUiB8IFNDQl9TVF9DTkEgfAorCQkJICAgICAgU0NCX1NUX1JOUikpID4+IDEyLAorCSAgICAgICAoc2NiLgorCQlzY2Jfc3RhdHVzICYgU0NCX1NUX0NYKSA/ICJjb21tYW5kIGNvbXBsZXRpb24gaW50ZXJydXB0LCIgOgorCSAgICAgICAiIiwgKHNjYi5zY2Jfc3RhdHVzICYgU0NCX1NUX0ZSKSA/ICJmcmFtZSByZWNlaXZlZCwiIDogIiIsCisJICAgICAgIChzY2IuCisJCXNjYl9zdGF0dXMgJiBTQ0JfU1RfQ05BKSA/ICJjb21tYW5kIHVuaXQgbm90IGFjdGl2ZSwiIDogIiIsCisJICAgICAgIChzY2IuCisJCXNjYl9zdGF0dXMgJiBTQ0JfU1RfUk5SKSA/ICJyZWNlaXZpbmcgdW5pdCBub3QgcmVhZHksIiA6CisJICAgICAgICIiKTsKKwlwcmludGsoImN1cyAweCV4WyVzJXMlc10gIiwgKHNjYi5zY2Jfc3RhdHVzICYgU0NCX1NUX0NVUykgPj4gOCwKKwkgICAgICAgKChzY2Iuc2NiX3N0YXR1cyAmIFNDQl9TVF9DVVMpID09CisJCVNDQl9TVF9DVVNfSURMRSkgPyAiaWRsZSIgOiAiIiwKKwkgICAgICAgKChzY2Iuc2NiX3N0YXR1cyAmIFNDQl9TVF9DVVMpID09CisJCVNDQl9TVF9DVVNfU1VTUCkgPyAic3VzcGVuZGVkIiA6ICIiLAorCSAgICAgICAoKHNjYi5zY2Jfc3RhdHVzICYgU0NCX1NUX0NVUykgPT0KKwkJU0NCX1NUX0NVU19BQ1RWKSA/ICJhY3RpdmUiIDogIiIpOworCXByaW50aygicnVzIDB4JXhbJXMlcyVzJXNdXG4iLCAoc2NiLnNjYl9zdGF0dXMgJiBTQ0JfU1RfUlVTKSA+PiA0LAorCSAgICAgICAoKHNjYi5zY2Jfc3RhdHVzICYgU0NCX1NUX1JVUykgPT0KKwkJU0NCX1NUX1JVU19JRExFKSA/ICJpZGxlIiA6ICIiLAorCSAgICAgICAoKHNjYi5zY2Jfc3RhdHVzICYgU0NCX1NUX1JVUykgPT0KKwkJU0NCX1NUX1JVU19TVVNQKSA/ICJzdXNwZW5kZWQiIDogIiIsCisJICAgICAgICgoc2NiLnNjYl9zdGF0dXMgJiBTQ0JfU1RfUlVTKSA9PQorCQlTQ0JfU1RfUlVTX05SRVMpID8gIm5vIHJlc291cmNlcyIgOiAiIiwKKwkgICAgICAgKChzY2Iuc2NiX3N0YXR1cyAmIFNDQl9TVF9SVVMpID09CisJCVNDQl9TVF9SVVNfUkRZKSA/ICJyZWFkeSIgOiAiIik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiY29tbWFuZDogIik7CisJcHJpbnRrKCJhY2sgMHgleFslcyVzJXMlc10gIiwKKwkgICAgICAgKHNjYi4KKwkJc2NiX2NvbW1hbmQgJiAoU0NCX0NNRF9BQ0tfQ1ggfCBTQ0JfQ01EX0FDS19GUiB8CisJCQkgICAgICAgU0NCX0NNRF9BQ0tfQ05BIHwgU0NCX0NNRF9BQ0tfUk5SKSkgPj4gMTIsCisJICAgICAgIChzY2IuCisJCXNjYl9jb21tYW5kICYgU0NCX0NNRF9BQ0tfQ1gpID8gImFjayBjbWQgY29tcGxldGlvbiwiIDogIiIsCisJICAgICAgIChzY2IuCisJCXNjYl9jb21tYW5kICYgU0NCX0NNRF9BQ0tfRlIpID8gImFjayBmcmFtZSByZWNlaXZlZCwiIDogIiIsCisJICAgICAgIChzY2IuCisJCXNjYl9jb21tYW5kICYgU0NCX0NNRF9BQ0tfQ05BKSA/ICJhY2sgQ1Ugbm90IGFjdGl2ZSwiIDogIiIsCisJICAgICAgIChzY2IuCisJCXNjYl9jb21tYW5kICYgU0NCX0NNRF9BQ0tfUk5SKSA/ICJhY2sgUlUgbm90IHJlYWR5LCIgOiAiIik7CisJcHJpbnRrKCJjdWMgMHgleFslcyVzJXMlcyVzXSAiLAorCSAgICAgICAoc2NiLnNjYl9jb21tYW5kICYgU0NCX0NNRF9DVUMpID4+IDgsCisJICAgICAgICgoc2NiLnNjYl9jb21tYW5kICYgU0NCX0NNRF9DVUMpID09CisJCVNDQl9DTURfQ1VDX05PUCkgPyAibm9wIiA6ICIiLAorCSAgICAgICAoKHNjYi5zY2JfY29tbWFuZCAmIFNDQl9DTURfQ1VDKSA9PQorCQlTQ0JfQ01EX0NVQ19HTykgPyAic3RhcnQgY2JsX29mZnNldCIgOiAiIiwKKwkgICAgICAgKChzY2Iuc2NiX2NvbW1hbmQgJiBTQ0JfQ01EX0NVQykgPT0KKwkJU0NCX0NNRF9DVUNfUkVTKSA/ICJyZXN1bWUgZXhlY3V0aW9uIiA6ICIiLAorCSAgICAgICAoKHNjYi5zY2JfY29tbWFuZCAmIFNDQl9DTURfQ1VDKSA9PQorCQlTQ0JfQ01EX0NVQ19TVVMpID8gInN1c3BlbmQgZXhlY3V0aW9uIiA6ICIiLAorCSAgICAgICAoKHNjYi5zY2JfY29tbWFuZCAmIFNDQl9DTURfQ1VDKSA9PQorCQlTQ0JfQ01EX0NVQ19BQlQpID8gImFib3J0IGV4ZWN1dGlvbiIgOiAiIik7CisJcHJpbnRrKCJydWMgMHgleFslcyVzJXMlcyVzXVxuIiwKKwkgICAgICAgKHNjYi5zY2JfY29tbWFuZCAmIFNDQl9DTURfUlVDKSA+PiA0LAorCSAgICAgICAoKHNjYi5zY2JfY29tbWFuZCAmIFNDQl9DTURfUlVDKSA9PQorCQlTQ0JfQ01EX1JVQ19OT1ApID8gIm5vcCIgOiAiIiwKKwkgICAgICAgKChzY2Iuc2NiX2NvbW1hbmQgJiBTQ0JfQ01EX1JVQykgPT0KKwkJU0NCX0NNRF9SVUNfR08pID8gInN0YXJ0IHJmYV9vZmZzZXQiIDogIiIsCisJICAgICAgICgoc2NiLnNjYl9jb21tYW5kICYgU0NCX0NNRF9SVUMpID09CisJCVNDQl9DTURfUlVDX1JFUykgPyAicmVzdW1lIHJlY2VwdGlvbiIgOiAiIiwKKwkgICAgICAgKChzY2Iuc2NiX2NvbW1hbmQgJiBTQ0JfQ01EX1JVQykgPT0KKwkJU0NCX0NNRF9SVUNfU1VTKSA/ICJzdXNwZW5kIHJlY2VwdGlvbiIgOiAiIiwKKwkgICAgICAgKChzY2Iuc2NiX2NvbW1hbmQgJiBTQ0JfQ01EX1JVQykgPT0KKwkJU0NCX0NNRF9SVUNfQUJUKSA/ICJhYm9ydCByZWNlcHRpb24iIDogIiIpOworCisJcHJpbnRrKEtFUk5fREVCVUcgImNibF9vZmZzZXQgMHgleCAiLCBzY2Iuc2NiX2NibF9vZmZzZXQpOworCXByaW50aygicmZhX29mZnNldCAweCV4XG4iLCBzY2Iuc2NiX3JmYV9vZmZzZXQpOworCisJcHJpbnRrKEtFUk5fREVCVUcgImNyY2VycnMgJWQgIiwgc2NiLnNjYl9jcmNlcnJzKTsKKwlwcmludGsoImFsbmVycnMgJWQgIiwgc2NiLnNjYl9hbG5lcnJzKTsKKwlwcmludGsoInJzY2VycnMgJWQgIiwgc2NiLnNjYl9yc2NlcnJzKTsKKwlwcmludGsoIm92cm5lcnJzICVkXG4iLCBzY2Iuc2NiX292cm5lcnJzKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHRoZSBmb3JtYXR0ZWQgc3RhdHVzIG9mIHRoZSBpODI1ODYncyByZWNlaXZlIHVuaXQuCisgKi8KK3N0YXRpYyB2b2lkIHd2X3J1X3Nob3coc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJLyogbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OyAqLworCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgIiMjIyMjIFdhdmVMQU4gaTgyNTg2IHJlY2VpdmVyIHVuaXQgc3RhdHVzOiAjIyMjI1xuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgInJ1OiIpOworCS8qCisJICogTm90IGltcGxlbWVudGVkIHlldAorCSAqLworCXByaW50aygiXG4iKTsKK30JCQkJLyogd3ZfcnVfc2hvdyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRGlzcGxheSBpbmZvIGFib3V0IG9uZSBjb250cm9sIGJsb2NrIG9mIHRoZSBpODI1ODYgbWVtb3J5LgorICovCitzdGF0aWMgdm9pZCB3dl9jdV9zaG93X29uZShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgbmV0X2xvY2FsICogbHAsIGludCBpLCB1MTYgcCkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkcjsKKwlhY190eF90IGFjdHg7CisKKwlpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCXByaW50aygiJWQ6IDB4JXg6IiwgaSwgcCk7CisKKwlvYnJhbV9yZWFkKGlvYWRkciwgcCwgKHVuc2lnbmVkIGNoYXIgKikgJmFjdHgsIHNpemVvZihhY3R4KSk7CisJcHJpbnRrKCIgc3RhdHVzPTB4JXgsIiwgYWN0eC50eF9oLmFjX3N0YXR1cyk7CisJcHJpbnRrKCIgY29tbWFuZD0weCV4LCIsIGFjdHgudHhfaC5hY19jb21tYW5kKTsKKworCS8qCisJICAgeworCSAgIHRiZF90ICAgICAgdGJkOworCisJICAgb2JyYW1fcmVhZChpb2FkZHIsIGFjdHgudHhfdGJkX29mZnNldCwgKHVuc2lnbmVkIGNoYXIgKikmdGJkLCBzaXplb2YodGJkKSk7CisJICAgcHJpbnRrKCIgdGJkX3N0YXR1cz0weCV4LCIsIHRiZC50YmRfc3RhdHVzKTsKKwkgICB9CisJICovCisKKwlwcmludGsoInwiKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHN0YXR1cyBvZiB0aGUgY29tbWFuZCB1bml0IG9mIHRoZSBpODI1ODYuCisgKi8KK3N0YXRpYyB2b2lkIHd2X2N1X3Nob3coc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGludCBpOworCXUxNiBwOworCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgIiMjIyMjIFdhdmVMQU4gaTgyNTg2IGNvbW1hbmQgdW5pdCBzdGF0dXM6ICMjIyMjXG4iKTsKKworCXByaW50ayhLRVJOX0RFQlVHKTsKKwlmb3IgKGkgPSAwLCBwID0gbHAtPnR4X2ZpcnN0X2luX3VzZTsgaSA8IE5UWEJMT0NLUzsgaSsrKSB7CisJCXd2X2N1X3Nob3dfb25lKGRldiwgbHAsIGksIHApOworCisJCXAgKz0gVFhCTE9DS1o7CisJCWlmIChwID49IE9GRlNFVF9DVSArIE5UWEJMT0NLUyAqIFRYQkxPQ0taKQorCQkJcCAtPSBOVFhCTE9DS1MgKiBUWEJMT0NLWjsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorI2VuZGlmCQkJCS8qIERFQlVHX0k4MjU4Nl9TSE9XICovCisKKyNpZmRlZiBERUJVR19ERVZJQ0VfU0hPVworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHRoZSBmb3JtYXR0ZWQgc3RhdHVzIG9mIHRoZSBXYXZlTEFOIFBDTUNJQSBkZXZpY2UgZHJpdmVyLgorICovCitzdGF0aWMgdm9pZCB3dl9kZXZfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiZGV2OiIpOworCXByaW50aygiIHN0YXRlPSVsWCwiLCBkZXYtPnN0YXRlKTsKKwlwcmludGsoIiB0cmFuc19zdGFydD0lbGQsIiwgZGV2LT50cmFuc19zdGFydCk7CisJcHJpbnRrKCIgZmxhZ3M9MHgleCwiLCBkZXYtPmZsYWdzKTsKKwlwcmludGsoIlxuIik7Cit9CQkJCS8qIHd2X2Rldl9zaG93ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBQcmludCB0aGUgZm9ybWF0dGVkIHN0YXR1cyBvZiB0aGUgV2F2ZUxBTiBQQ01DSUEgZGV2aWNlIGRyaXZlcidzCisgKiBwcml2YXRlIGluZm9ybWF0aW9uLgorICovCitzdGF0aWMgdm9pZCB3dl9sb2NhbF9zaG93KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHA7CisKKwlscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCisJcHJpbnRrKEtFUk5fREVCVUcgImxvY2FsOiIpOworCXByaW50aygiIHR4X25faW5fdXNlPSVkLCIsIGxwLT50eF9uX2luX3VzZSk7CisJcHJpbnRrKCIgaGFjcj0weCV4LCIsIGxwLT5oYWNyKTsKKwlwcmludGsoIiByeF9oZWFkPTB4JXgsIiwgbHAtPnJ4X2hlYWQpOworCXByaW50aygiIHJ4X2xhc3Q9MHgleCwiLCBscC0+cnhfbGFzdCk7CisJcHJpbnRrKCIgdHhfZmlyc3RfZnJlZT0weCV4LCIsIGxwLT50eF9maXJzdF9mcmVlKTsKKwlwcmludGsoIiB0eF9maXJzdF9pbl91c2U9MHgleCwiLCBscC0+dHhfZmlyc3RfaW5fdXNlKTsKKwlwcmludGsoIlxuIik7Cit9CQkJCS8qIHd2X2xvY2FsX3Nob3cgKi8KKyNlbmRpZgkJCQkvKiBERUJVR19ERVZJQ0VfU0hPVyAqLworCisjaWYgZGVmaW5lZChERUJVR19SWF9JTkZPKSB8fCBkZWZpbmVkKERFQlVHX1RYX0lORk8pCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRHVtcCBwYWNrZXQgaGVhZGVyIChhbmQgY29udGVudCBpZiBuZWNlc3NhcnkpIG9uIHRoZSBzY3JlZW4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHd2X3BhY2tldF9pbmZvKHU4ICogcCwJLyogUGFja2V0IHRvIGR1bXAgKi8KKwkJCQkgIGludCBsZW5ndGgsCS8qIExlbmd0aCBvZiB0aGUgcGFja2V0ICovCisJCQkJICBjaGFyICptc2cxLAkvKiBOYW1lIG9mIHRoZSBkZXZpY2UgKi8KKwkJCQkgIGNoYXIgKm1zZzIpCit7CQkJCS8qIE5hbWUgb2YgdGhlIGZ1bmN0aW9uICovCisJaW50IGk7CisJaW50IG1heGk7CisKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiJXM6ICVzKCk6IGRlc3QgJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgsIGxlbmd0aCAlZFxuIiwKKwkgICAgICAgbXNnMSwgbXNnMiwgcFswXSwgcFsxXSwgcFsyXSwgcFszXSwgcFs0XSwgcFs1XSwgbGVuZ3RoKTsKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiJXM6ICVzKCk6IHNyYyAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCwgdHlwZSAweCUwMlglMDJYXG4iLAorCSAgICAgICBtc2cxLCBtc2cyLCBwWzZdLCBwWzddLCBwWzhdLCBwWzldLCBwWzEwXSwgcFsxMV0sIHBbMTJdLAorCSAgICAgICBwWzEzXSk7CisKKyNpZmRlZiBERUJVR19QQUNLRVRfRFVNUAorCisJcHJpbnRrKEtFUk5fREVCVUcgImRhdGE9XCIiKTsKKworCWlmICgobWF4aSA9IGxlbmd0aCkgPiBERUJVR19QQUNLRVRfRFVNUCkKKwkJbWF4aSA9IERFQlVHX1BBQ0tFVF9EVU1QOworCWZvciAoaSA9IDE0OyBpIDwgbWF4aTsgaSsrKQorCQlpZiAocFtpXSA+PSAnICcgJiYgcFtpXSA8PSAnficpCisJCQlwcmludGsoIiAlYyIsIHBbaV0pOworCQllbHNlCisJCQlwcmludGsoIiUwMlgiLCBwW2ldKTsKKwlpZiAobWF4aSA8IGxlbmd0aCkKKwkJcHJpbnRrKCIuLiIpOworCXByaW50aygiXCJcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOworI2VuZGlmCQkJCS8qIERFQlVHX1BBQ0tFVF9EVU1QICovCit9CisjZW5kaWYJCQkJLyogZGVmaW5lZChERUJVR19SWF9JTkZPKSB8fCBkZWZpbmVkKERFQlVHX1RYX0lORk8pICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIGlzIHRoZSBpbmZvcm1hdGlvbiB3aGljaCBpcyBkaXNwbGF5ZWQgYnkgdGhlIGRyaXZlciBhdCBzdGFydHVwLgorICogVGhlcmUgYXJlIGxvdHMgb2YgZmxhZ3MgZm9yIGNvbmZpZ3VyaW5nIGl0IHRvIHlvdXIgbGlraW5nLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3ZfaW5pdF9pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwlwc2FfdCBwc2E7CisJaW50IGk7CisKKwkvKiBSZWFkIHRoZSBwYXJhbWV0ZXIgc3RvcmFnZSBhcmVhICovCisJcHNhX3JlYWQoaW9hZGRyLCBscC0+aGFjciwgMCwgKHVuc2lnbmVkIGNoYXIgKikgJnBzYSwgc2l6ZW9mKHBzYSkpOworCisjaWZkZWYgREVCVUdfUFNBX1NIT1cKKwl3dl9wc2Ffc2hvdygmcHNhKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHX01NQ19TSE9XCisJd3ZfbW1jX3Nob3coZGV2KTsKKyNlbmRpZgorI2lmZGVmIERFQlVHX0k4MjU4Nl9TSE9XCisJd3ZfY3Vfc2hvdyhkZXYpOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19CQVNJQ19TSE9XCisJLyogTm93LCBsZXQncyBnbyBmb3IgdGhlIGJhc2ljIHN0dWZmLiAqLworCXByaW50ayhLRVJOX05PVElDRSAiJXM6IFdhdmVMQU4gYXQgJSN4LCIsIGRldi0+bmFtZSwgaW9hZGRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgV0FWRUxBTl9BRERSX1NJWkU7IGkrKykKKwkJcHJpbnRrKCIlcyUwMlgiLCAoaSA9PSAwKSA/ICIgIiA6ICI6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisJcHJpbnRrKCIsIElSUSAlZCIsIGRldi0+aXJxKTsKKworCS8qIFByaW50IGN1cnJlbnQgbmV0d29yayBJRC4gKi8KKwlpZiAocHNhLnBzYV9ud2lkX3NlbGVjdCkKKwkJcHJpbnRrKCIsIG53aWQgMHglMDJYLSUwMlgiLCBwc2EucHNhX253aWRbMF0sCisJCSAgICAgICBwc2EucHNhX253aWRbMV0pOworCWVsc2UKKwkJcHJpbnRrKCIsIG53aWQgb2ZmIik7CisKKwkvKiBJZiAyLjAwIGNhcmQgKi8KKwlpZiAoIShtbWNfaW4oaW9hZGRyLCBtbXJvZmYoMCwgbW1yX2ZlZV9zdGF0dXMpKSAmCisJICAgICAgKE1NUl9GRUVfU1RBVFVTX0RXTEQgfCBNTVJfRkVFX1NUQVRVU19CVVNZKSkpIHsKKwkJdW5zaWduZWQgc2hvcnQgZnJlcTsKKworCQkvKiBBc2sgdGhlIEVFUFJPTSB0byByZWFkIHRoZSBmcmVxdWVuY3kgZnJvbSB0aGUgZmlyc3QgYXJlYS4gKi8KKwkJZmVlX3JlYWQoaW9hZGRyLCAweDAwLCAmZnJlcSwgMSk7CisKKwkJLyogUHJpbnQgZnJlcXVlbmN5ICovCisJCXByaW50aygiLCAyLjAwLCAlbGQiLCAoZnJlcSA+PiA2KSArIDI0MDBMKTsKKworCQkvKiBIYWNrISAqLworCQlpZiAoZnJlcSAmIDB4MjApCisJCQlwcmludGsoIi41Iik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCIsIFBDIik7CisJCXN3aXRjaCAocHNhLnBzYV9jb21wX251bWJlcikgeworCQljYXNlIFBTQV9DT01QX1BDX0FUXzkxNToKKwkJY2FzZSBQU0FfQ09NUF9QQ19BVF8yNDAwOgorCQkJcHJpbnRrKCItQVQiKTsKKwkJCWJyZWFrOworCQljYXNlIFBTQV9DT01QX1BDX01DXzkxNToKKwkJY2FzZSBQU0FfQ09NUF9QQ19NQ18yNDAwOgorCQkJcHJpbnRrKCItTUMiKTsKKwkJCWJyZWFrOworCQljYXNlIFBTQV9DT01QX1BDTUNJQV85MTU6CisJCQlwcmludGsoIk1DSUEiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCI/Iik7CisJCX0KKwkJcHJpbnRrKCIsICIpOworCQlzd2l0Y2ggKHBzYS5wc2Ffc3ViYmFuZCkgeworCQljYXNlIFBTQV9TVUJCQU5EXzkxNToKKwkJCXByaW50aygiOTE1Iik7CisJCQlicmVhazsKKwkJY2FzZSBQU0FfU1VCQkFORF8yNDI1OgorCQkJcHJpbnRrKCIyNDI1Iik7CisJCQlicmVhazsKKwkJY2FzZSBQU0FfU1VCQkFORF8yNDYwOgorCQkJcHJpbnRrKCIyNDYwIik7CisJCQlicmVhazsKKwkJY2FzZSBQU0FfU1VCQkFORF8yNDg0OgorCQkJcHJpbnRrKCIyNDg0Iik7CisJCQlicmVhazsKKwkJY2FzZSBQU0FfU1VCQkFORF8yNDMwXzU6CisJCQlwcmludGsoIjI0MzAuNSIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoIj8iKTsKKwkJfQorCX0KKworCXByaW50aygiIE1IelxuIik7CisjZW5kaWYJCQkJLyogREVCVUdfQkFTSUNfU0hPVyAqLworCisjaWZkZWYgREVCVUdfVkVSU0lPTl9TSE9XCisJLyogUHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworCXByaW50ayhLRVJOX05PVElDRSAiJXMiLCB2ZXJzaW9uKTsKKyNlbmRpZgorfQkJCQkvKiB3dl9pbml0X2luZm8gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiBJT0NUTCwgU1RBVFMgJiBSRUNPTkZJRyAqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogV2UgZm91bmQgaGVyZSByb3V0aW5lcyB0aGF0IGFyZSBjYWxsZWQgYnkgTGludXggb24gZGlmZmVyZW50CisgKiBvY2Nhc2lvbnMgYWZ0ZXIgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIG5vdCBmb3IgdHJhbnNtaXR0aW5nIGRhdGEKKyAqIFRoZXNlIG1heSBiZSBjYWxsZWQgd2hlbiB0aGUgdXNlciB1c2UgaWZjb25maWcsIC9wcm9jL25ldC9kZXYKKyAqIG9yIHdpcmVsZXNzIGV4dGVuc2lvbnMKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2V0IHRoZSBjdXJyZW50IEV0aGVybmV0IHN0YXRpc3RpY3MuIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZQorICogY2FyZCBvcGVuIG9yIGNsb3NlZC4KKyAqIFVzZWQgd2hlbiB0aGUgdXNlciByZWFkIC9wcm9jL25ldC9kZXYKKyAqLworc3RhdGljIGVuX3N0YXRzICp3YXZlbGFuX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKyNpZmRlZiBERUJVR19JT0NUTF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPD53YXZlbGFuX2dldF9zdGF0cygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlyZXR1cm4gKCYoKG5ldF9sb2NhbCAqKSBkZXYtPnByaXYpLT5zdGF0cyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAqIG51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisgKiBudW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKKyAqIG51bV9hZGRycyA+IDAJTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLAorICoJCQlhbmQgZG8gYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgorICovCitzdGF0aWMgdm9pZCB3YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisKKyNpZmRlZiBERUJVR19JT0NUTF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdCgpXG4iLAorCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19JT0NUTF9JTkZPCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgIiVzOiB3YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdCgpOiBzZXR0aW5nIFJ4IG1vZGUgJTAyWCB0byAlZCBhZGRyZXNzZXMuXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGRldi0+ZmxhZ3MsIGRldi0+bWNfY291bnQpOworI2VuZGlmCisKKwkvKiBBcmUgd2UgYXNraW5nIGZvciBwcm9taXNjdW91cyBtb2RlLAorCSAqIG9yIGFsbCBtdWx0aWNhc3QgYWRkcmVzc2VzICh3ZSBkb24ndCBoYXZlIHRoYXQhKQorCSAqIG9yIHRvbyBtYW55IG11bHRpY2FzdCBhZGRyZXNzZXMgZm9yIHRoZSBoYXJkd2FyZSBmaWx0ZXI/ICovCisJaWYgKChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHx8CisJICAgIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB8fAorCSAgICAoZGV2LT5tY19jb3VudCA+IEk4MjU4Nl9NQVhfTVVMVElDQVNUX0FERFJFU1NFUykpIHsKKwkJLyoKKwkJICogRW5hYmxlIHByb21pc2N1b3VzIG1vZGU6IHJlY2VpdmUgYWxsIHBhY2tldHMuCisJCSAqLworCQlpZiAoIWxwLT5wcm9taXNjdW91cykgeworCQkJbHAtPnByb21pc2N1b3VzID0gMTsKKwkJCWxwLT5tY19jb3VudCA9IDA7CisKKwkJCXd2XzgyNTg2X3JlY29uZmlnKGRldik7CisKKwkJCS8qIFRlbGwgdGhlIGtlcm5lbCB0aGF0IHdlIGFyZSBkb2luZyBhIHJlYWxseSBiYWQgam9iLiAqLworCQkJZGV2LT5mbGFncyB8PSBJRkZfUFJPTUlTQzsKKwkJfQorCX0gZWxzZQorCQkvKiBBcmUgdGhlcmUgbXVsdGljYXN0IGFkZHJlc3NlcyB0byBzZW5kPyAqLworCWlmIChkZXYtPm1jX2xpc3QgIT0gKHN0cnVjdCBkZXZfbWNfbGlzdCAqKSBOVUxMKSB7CisJCS8qCisJCSAqIERpc2FibGUgcHJvbWlzY3VvdXMgbW9kZSwgYnV0IHJlY2VpdmUgYWxsIHBhY2tldHMKKwkJICogaW4gbXVsdGljYXN0IGxpc3QKKwkJICovCisjaWZkZWYgTVVMVElDQVNUX0FWT0lECisJCWlmIChscC0+cHJvbWlzY3VvdXMgfHwgKGRldi0+bWNfY291bnQgIT0gbHAtPm1jX2NvdW50KSkKKyNlbmRpZgorCQl7CisJCQlscC0+cHJvbWlzY3VvdXMgPSAwOworCQkJbHAtPm1jX2NvdW50ID0gZGV2LT5tY19jb3VudDsKKworCQkJd3ZfODI1ODZfcmVjb25maWcoZGV2KTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIFN3aXRjaCB0byBub3JtYWwgbW9kZTogZGlzYWJsZSBwcm9taXNjdW91cyBtb2RlIGFuZCAKKwkJICogY2xlYXIgdGhlIG11bHRpY2FzdCBsaXN0LgorCQkgKi8KKwkJaWYgKGxwLT5wcm9taXNjdW91cyB8fCBscC0+bWNfY291bnQgPT0gMCkgeworCQkJbHAtPnByb21pc2N1b3VzID0gMDsKKwkJCWxwLT5tY19jb3VudCA9IDA7CisKKwkJCXd2XzgyNTg2X3JlY29uZmlnKGRldik7CisJCX0KKwl9CisjaWZkZWYgREVCVUdfSU9DVExfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd2F2ZWxhbl9zZXRfbXVsdGljYXN0X2xpc3QoKVxuIiwKKwkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGV4aXN0LgorICogKE5vdGUgOiBpdCB3YXMgYSBuaWNlIHdheSB0byB0ZXN0IHRoZSByZWNvbmZpZ3VyZSBzdHVmZi4uLikKKyAqLworI2lmZGVmIFNFVF9NQUNfQUREUkVTUworc3RhdGljIGludCB3YXZlbGFuX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgdm9pZCAqYWRkcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKm1hYyA9IGFkZHI7CisKKwkvKiBDb3B5IHRoZSBhZGRyZXNzLiAqLworCW1lbWNweShkZXYtPmRldl9hZGRyLCBtYWMtPnNhX2RhdGEsIFdBVkVMQU5fQUREUl9TSVpFKTsKKworCS8qIFJlY29uZmlndXJlIHRoZSBiZWFzdC4gKi8KKwl3dl84MjU4Nl9yZWNvbmZpZyhkZXYpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYJCQkJLyogU0VUX01BQ19BRERSRVNTICovCisKKyNpZmRlZiBXSVJFTEVTU19FWFQJCS8qIGlmIHdpcmVsZXNzIGV4dGVuc2lvbnMgZXhpc3QgaW4gdGhlIGtlcm5lbCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnJlcXVlbmN5IHNldHRpbmcgKGZvciBoYXJkd2FyZSBjYXBhYmxlIG9mIGl0KQorICogSXQncyBhIGJpdCBjb21wbGljYXRlZCBhbmQgeW91IGRvbid0IHJlYWxseSB3YW50IHRvIGxvb2sgaW50byBpdC4KKyAqIChjYWxsZWQgaW4gd2F2ZWxhbl9pb2N0bCkKKyAqLworc3RhdGljIGlubGluZSBpbnQgd3Zfc2V0X2ZyZXF1ZW5jeSh1bnNpZ25lZCBsb25nIGlvYWRkciwJLyogSS9PIHBvcnQgb2YgdGhlIGNhcmQgKi8KKwkJCQkgICBpd19mcmVxICogZnJlcXVlbmN5KQoreworCWNvbnN0IGludCBCQU5EX05VTSA9IDEwOwkvKiBOdW1iZXIgb2YgYmFuZHMgKi8KKwlsb25nIGZyZXEgPSAwTDsJCS8qIG9mZnNldCB0byAyLjQgR0h6IGluIC41IE1IeiAqLworI2lmZGVmIERFQlVHX0lPQ1RMX0lORk8KKwlpbnQgaTsKKyNlbmRpZgorCisJLyogU2V0dGluZyBieSBmcmVxdWVuY3kgKi8KKwkvKiBUaGVvcmV0aWNhbGx5LCB5b3UgbWF5IHNldCBhbnkgZnJlcXVlbmN5IGJldHdlZW4KKwkgKiB0aGUgdHdvIGxpbWl0cyB3aXRoIGEgMC41IE1IeiBwcmVjaXNpb24uIEluIHByYWN0aWNlLAorCSAqIEkgZG9uJ3Qgd2FudCB5b3UgdG8gaGF2ZSB0cm91YmxlIHdpdGggbG9jYWwgcmVndWxhdGlvbnMuCisJICovCisJaWYgKChmcmVxdWVuY3ktPmUgPT0gMSkgJiYKKwkgICAgKGZyZXF1ZW5jeS0+bSA+PSAoaW50KSAyLjQxMmU4KQorCSAgICAmJiAoZnJlcXVlbmN5LT5tIDw9IChpbnQpIDIuNDg3ZTgpKSB7CisJCWZyZXEgPSAoKGZyZXF1ZW5jeS0+bSAvIDEwMDAwKSAtIDI0MDAwTCkgLyA1OworCX0KKworCS8qIFNldHRpbmcgYnkgY2hhbm5lbCAoc2FtZSBhcyB3ZnJlcXNlbCkgKi8KKwkvKiBXYXJuaW5nOiBlYWNoIGNoYW5uZWwgaXMgMjIgTUh6IHdpZGUsIHNvIHNvbWUgb2YgdGhlIGNoYW5uZWxzCisJICogd2lsbCBpbnRlcmZlcmUuICovCisJaWYgKChmcmVxdWVuY3ktPmUgPT0gMCkgJiYgKGZyZXF1ZW5jeS0+bSA8IEJBTkRfTlVNKSkgeworCQkvKiBHZXQgZnJlcXVlbmN5IG9mZnNldC4gKi8KKwkJZnJlcSA9IGNoYW5uZWxfYmFuZHNbZnJlcXVlbmN5LT5tXSA+PiAxOworCX0KKworCS8qIFZlcmlmeSB0aGF0IHRoZSBmcmVxdWVuY3kgaXMgYWxsb3dlZC4gKi8KKwlpZiAoZnJlcSAhPSAwTCkgeworCQl1MTYgdGFibGVbMTBdOwkvKiBBdXRob3JpemVkIGZyZXF1ZW5jeSB0YWJsZSAqLworCisJCS8qIFJlYWQgdGhlIGZyZXF1ZW5jeSB0YWJsZS4gKi8KKwkJZmVlX3JlYWQoaW9hZGRyLCAweDcxLCB0YWJsZSwgMTApOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworCQlwcmludGsoS0VSTl9ERUJVRyAiRnJlcXVlbmN5IHRhYmxlOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJCXByaW50aygiICUwNFgiLCB0YWJsZVtpXSk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKwkJLyogTG9vayBpbiB0aGUgdGFibGUgdG8gc2VlIHdoZXRoZXIgdGhlIGZyZXF1ZW5jeSBpcyBhbGxvd2VkLiAqLworCQlpZiAoISh0YWJsZVs5IC0gKChmcmVxIC0gMjQpIC8gMTYpXSAmCisJCSAgICAgICgxIDw8ICgoZnJlcSAtIDI0KSAlIDE2KSkpKSByZXR1cm4gLUVJTlZBTDsJLyogbm90IGFsbG93ZWQgKi8KKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBpZiB3ZSBnZXQgYSB1c2FibGUgZnJlcXVlbmN5ICovCisJaWYgKGZyZXEgIT0gMEwpIHsKKwkJdW5zaWduZWQgc2hvcnQgYXJlYVsxNl07CisJCXVuc2lnbmVkIHNob3J0IGRhY1syXTsKKwkJdW5zaWduZWQgc2hvcnQgYXJlYV92ZXJpZnlbMTZdOworCQl1bnNpZ25lZCBzaG9ydCBkYWNfdmVyaWZ5WzJdOworCQkvKiBDb3JyZXNwb25kaW5nIGdhaW4gKGluIHRoZSBwb3dlciBhZGp1c3QgdmFsdWUgdGFibGUpCisJCSAqIFNlZSBBVCZUIFdhdmVMQU4gRGF0YSBNYW51YWwsIFJFRiA0MDctMDI0Njg5L0UsIHBhZ2UgMy04CisJCSAqIGFuZCBXQ0lOMDYyRC5ET0MsIHBhZ2UgNi4yLjkuICovCisJCXVuc2lnbmVkIHNob3J0IHBvd2VyX2xpbWl0W10gPSB7IDQwLCA4MCwgMTIwLCAxNjAsIDAgfTsKKwkJaW50IHBvd2VyX2JhbmQgPSAwOwkvKiBTZWxlY3RlZCBiYW5kICovCisJCXVuc2lnbmVkIHNob3J0IHBvd2VyX2FkanVzdDsJLyogQ29ycmVjdCB2YWx1ZSAqLworCisJCS8qIFNlYXJjaCBmb3IgdGhlIGdhaW4uICovCisJCXBvd2VyX2JhbmQgPSAwOworCQl3aGlsZSAoKGZyZXEgPiBwb3dlcl9saW1pdFtwb3dlcl9iYW5kXSkgJiYKKwkJICAgICAgIChwb3dlcl9saW1pdFsrK3Bvd2VyX2JhbmRdICE9IDApKTsKKworCQkvKiBSZWFkIHRoZSBmaXJzdCBhcmVhLiAqLworCQlmZWVfcmVhZChpb2FkZHIsIDB4MDAsIGFyZWEsIDE2KTsKKworCQkvKiBSZWFkIHRoZSBEQUMuICovCisJCWZlZV9yZWFkKGlvYWRkciwgMHg2MCwgZGFjLCAyKTsKKworCQkvKiBSZWFkIHRoZSBuZXcgcG93ZXIgYWRqdXN0IHZhbHVlLiAqLworCQlmZWVfcmVhZChpb2FkZHIsIDB4NkIgLSAocG93ZXJfYmFuZCA+PiAxKSwgJnBvd2VyX2FkanVzdCwKKwkJCSAxKTsKKwkJaWYgKHBvd2VyX2JhbmQgJiAweDEpCisJCQlwb3dlcl9hZGp1c3QgPj49IDg7CisJCWVsc2UKKwkJCXBvd2VyX2FkanVzdCAmPSAweEZGOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworCQlwcmludGsoS0VSTl9ERUJVRyAiV2F2ZUxBTiBFRVBST00gQXJlYSAxOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCXByaW50aygiICUwNFgiLCBhcmVhW2ldKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisKKwkJcHJpbnRrKEtFUk5fREVCVUcgIldhdmVMQU4gRUVQUk9NIERBQzogJTA0WCAlMDRYXG4iLAorCQkgICAgICAgZGFjWzBdLCBkYWNbMV0pOworI2VuZGlmCisKKwkJLyogRnJlcXVlbmN5IG9mZnNldCAoZm9yIGluZm8gb25seSkgKi8KKwkJYXJlYVswXSA9ICgoZnJlcSA8PCA1KSAmIDB4RkZFMCkgfCAoYXJlYVswXSAmIDB4MUYpOworCisJCS8qIFJlY2VpdmVyIFByaW5jaXBsZSBtYWluIGRpdmlkZXIgY29lZmZpY2llbnQgKi8KKwkJYXJlYVszXSA9IChmcmVxID4+IDEpICsgMjQwMEwgLSAzNTJMOworCQlhcmVhWzJdID0gKChmcmVxICYgMHgxKSA8PCA0KSB8IChhcmVhWzJdICYgMHhGRkVGKTsKKworCQkvKiBUcmFuc21pdHRlciBNYWluIGRpdmlkZXIgY29lZmZpY2llbnQgKi8KKwkJYXJlYVsxM10gPSAoZnJlcSA+PiAxKSArIDI0MDBMOworCQlhcmVhWzEyXSA9ICgoZnJlcSAmIDB4MSkgPDwgNCkgfCAoYXJlYVsyXSAmIDB4RkZFRik7CisKKwkJLyogT3RoZXIgcGFydHMgb2YgdGhlIGFyZWEgYXJlIGZsYWdzLCBiaXQgc3RyZWFtcyBvciB1bnVzZWQuICovCisKKwkJLyogU2V0IHRoZSB2YWx1ZSBpbiB0aGUgREFDLiAqLworCQlkYWNbMV0gPSAoKHBvd2VyX2FkanVzdCA+PiAxKSAmIDB4N0YpIHwgKGRhY1sxXSAmIDB4RkY4MCk7CisJCWRhY1swXSA9ICgocG93ZXJfYWRqdXN0ICYgMHgxKSA8PCA0KSB8IChkYWNbMF0gJiAweEZGRUYpOworCisJCS8qIFdyaXRlIHRoZSBmaXJzdCBhcmVhLiAqLworCQlmZWVfd3JpdGUoaW9hZGRyLCAweDAwLCBhcmVhLCAxNik7CisKKwkJLyogV3JpdGUgdGhlIERBQy4gKi8KKwkJZmVlX3dyaXRlKGlvYWRkciwgMHg2MCwgZGFjLCAyKTsKKworCQkvKiBXZSBub3cgc2hvdWxkIHZlcmlmeSBoZXJlIHRoYXQgdGhlIHdyaXRpbmcgb2YgdGhlIEVFUFJPTSB3ZW50IE9LLiAqLworCisJCS8qIFJlcmVhZCB0aGUgZmlyc3QgYXJlYS4gKi8KKwkJZmVlX3JlYWQoaW9hZGRyLCAweDAwLCBhcmVhX3ZlcmlmeSwgMTYpOworCisJCS8qIFJlcmVhZCB0aGUgREFDLiAqLworCQlmZWVfcmVhZChpb2FkZHIsIDB4NjAsIGRhY192ZXJpZnksIDIpOworCisJCS8qIENvbXBhcmUuICovCisJCWlmIChtZW1jbXAoYXJlYSwgYXJlYV92ZXJpZnksIDE2ICogMikgfHwKKwkJICAgIG1lbWNtcChkYWMsIGRhY192ZXJpZnksIDIgKiAyKSkgeworI2lmZGVmIERFQlVHX0lPQ1RMX0VSUk9SCisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgIldhdmVMQU46IHd2X3NldF9mcmVxdWVuY3k6IHVuYWJsZSB0byB3cml0ZSBuZXcgZnJlcXVlbmN5IHRvIEVFUFJPTSg/KS5cbiIpOworI2VuZGlmCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCX0KKworCQkvKiBXZSBtdXN0IGRvd25sb2FkIHRoZSBmcmVxdWVuY3kgcGFyYW1ldGVycyB0byB0aGUKKwkJICogc3ludGhlc2l6ZXJzIChmcm9tIHRoZSBFRVBST00gLSBhcmVhIDEpCisJCSAqIE5vdGU6IGFzIHRoZSBFRVBST00gaXMgYXV0b21hdGljYWxseSBkZWNyZW1lbnRlZCwgd2Ugc2V0IHRoZSBlbmQKKwkJICogaWYgdGhlIGFyZWEuLi4gKi8KKwkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2FkZHIpLCAweDBGKTsKKwkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLAorCQkJTU1XX0ZFRV9DVFJMX1JFQUQgfCBNTVdfRkVFX0NUUkxfRFdMRCk7CisKKwkJLyogV2FpdCB1bnRpbCB0aGUgZG93bmxvYWQgaXMgZmluaXNoZWQuICovCisJCWZlZV93YWl0KGlvYWRkciwgMTAwLCAxMDApOworCisJCS8qIFdlIG11c3Qgbm93IGRvd25sb2FkIHRoZSBwb3dlciBhZGp1c3QgdmFsdWUgKGdhaW4pIHRvCisJCSAqIHRoZSBzeW50aGVzaXplcnMgKGZyb20gdGhlIEVFUFJPTSAtIGFyZWEgNyAtIERBQykuICovCisJCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgMHg2MSk7CisJCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwKKwkJCU1NV19GRUVfQ1RSTF9SRUFEIHwgTU1XX0ZFRV9DVFJMX0RXTEQpOworCisJCS8qIFdhaXQgZm9yIHRoZSBkb3dubG9hZCB0byBmaW5pc2guICovCisJCWZlZV93YWl0KGlvYWRkciwgMTAwLCAxMDApOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworCQkvKiBWZXJpZmljYXRpb24gb2Ygd2hhdCB3ZSBoYXZlIGRvbmUgKi8KKworCQlwcmludGsoS0VSTl9ERUJVRyAiV2F2ZUxBTiBFRVBST00gQXJlYSAxOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJCXByaW50aygiICUwNFgiLCBhcmVhX3ZlcmlmeVtpXSk7CisJCX0KKwkJcHJpbnRrKCJcbiIpOworCisJCXByaW50ayhLRVJOX0RFQlVHICJXYXZlTEFOIEVFUFJPTSBEQUM6ICAlMDRYICUwNFhcbiIsCisJCSAgICAgICBkYWNfdmVyaWZ5WzBdLCBkYWNfdmVyaWZ5WzFdKTsKKyNlbmRpZgorCisJCXJldHVybiAwOworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsJLyogQmFoLCBuZXZlciBnZXQgdGhlcmUuLi4gKi8KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEdpdmUgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGZyZXF1ZW5jaWVzLgorICovCitzdGF0aWMgaW5saW5lIGludCB3dl9mcmVxdWVuY3lfbGlzdCh1bnNpZ25lZCBsb25nIGlvYWRkciwJLyogSS9PIHBvcnQgb2YgdGhlIGNhcmQgKi8KKwkJCQkgICAgaXdfZnJlcSAqIGxpc3QsCS8qIExpc3Qgb2YgZnJlcXVlbmNpZXMgdG8gZmlsbCAqLworCQkJCSAgICBpbnQgbWF4KQorewkJCQkvKiBNYXhpbXVtIG51bWJlciBvZiBmcmVxdWVuY2llcyAqLworCXUxNiB0YWJsZVsxMF07CS8qIEF1dGhvcml6ZWQgZnJlcXVlbmN5IHRhYmxlICovCisJbG9uZyBmcmVxID0gMEw7CQkvKiBvZmZzZXQgdG8gMi40IEdIeiBpbiAuNSBNSHogKyAxMiBNSHogKi8KKwlpbnQgaTsJCQkvKiBpbmRleCBpbiB0aGUgdGFibGUgKi8KKwlpbnQgYyA9IDA7CQkvKiBDaGFubmVsIG51bWJlciAqLworCisJLyogUmVhZCB0aGUgZnJlcXVlbmN5IHRhYmxlLiAqLworCWZlZV9yZWFkKGlvYWRkciwgMHg3MSAvKiBmcmVxdWVuY3kgdGFibGUgKi8gLCB0YWJsZSwgMTApOworCisJLyogQ2hlY2sgYWxsIGZyZXF1ZW5jaWVzLiAqLworCWkgPSAwOworCWZvciAoZnJlcSA9IDA7IGZyZXEgPCAxNTA7IGZyZXErKykKKwkJLyogTG9vayBpbiB0aGUgdGFibGUgaWYgdGhlIGZyZXF1ZW5jeSBpcyBhbGxvd2VkICovCisJCWlmICh0YWJsZVs5IC0gKGZyZXEgLyAxNildICYgKDEgPDwgKGZyZXEgJSAxNikpKSB7CisJCQkvKiBDb21wdXRlIGFwcHJveGltYXRlIGNoYW5uZWwgbnVtYmVyICovCisJCQl3aGlsZSAoKCgoY2hhbm5lbF9iYW5kc1tjXSA+PiAxKSAtIDI0KSA8IGZyZXEpICYmCisJCQkgICAgICAgKGMgPCBORUxTKGNoYW5uZWxfYmFuZHMpKSkKKwkJCQljKys7CisJCQlsaXN0W2ldLmkgPSBjOwkvKiBTZXQgdGhlIGxpc3QgaW5kZXggKi8KKworCQkJLyogcHV0IGluIHRoZSBsaXN0ICovCisJCQlsaXN0W2ldLm0gPSAoKChmcmVxICsgMjQpICogNSkgKyAyNDAwMEwpICogMTAwMDA7CisJCQlsaXN0W2krK10uZSA9IDE7CisKKwkJCS8qIENoZWNrIG51bWJlci4gKi8KKwkJCWlmIChpID49IG1heCkKKwkJCQlyZXR1cm4gKGkpOworCQl9CisKKwlyZXR1cm4gKGkpOworfQorCisjaWZkZWYgSVdfV0lSRUxFU1NfU1BZCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2F0aGVyIHdpcmVsZXNzIHNweSBzdGF0aXN0aWNzOiAgZm9yIGVhY2ggcGFja2V0LCBjb21wYXJlIHRoZSBzb3VyY2UKKyAqIGFkZHJlc3Mgd2l0aCBvdXIgbGlzdCwgYW5kIGlmIHRoZXkgbWF0Y2gsIGdldCB0aGUgc3RhdGlzdGljcy4KKyAqIFNvcnJ5LCBidXQgdGhpcyBmdW5jdGlvbiByZWFsbHkgbmVlZHMgdGhlIHdpcmVsZXNzIGV4dGVuc2lvbnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3bF9zcHlfZ2F0aGVyKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LAorCQkJCSB1OCAqCW1hYywJLyogTUFDIGFkZHJlc3MgKi8KKwkJCQkgdTggKglzdGF0cykJLyogU3RhdGlzdGljcyB0byBnYXRoZXIgKi8KK3sKKwlzdHJ1Y3QgaXdfcXVhbGl0eSB3c3RhdHM7CisKKwl3c3RhdHMucXVhbCA9IHN0YXRzWzJdICYgTU1SX1NHTkxfUVVBTDsKKwl3c3RhdHMubGV2ZWwgPSBzdGF0c1swXSAmIE1NUl9TSUdOQUxfTFZMOworCXdzdGF0cy5ub2lzZSA9IHN0YXRzWzFdICYgTU1SX1NJTEVOQ0VfTFZMOworCXdzdGF0cy51cGRhdGVkID0gMHg3OworCisJLyogVXBkYXRlIHNweSByZWNvcmRzICovCisJd2lyZWxlc3Nfc3B5X3VwZGF0ZShkZXYsIG1hYywgJndzdGF0cyk7Cit9CisjZW5kaWYgLyogSVdfV0lSRUxFU1NfU1BZICovCisKKyNpZmRlZiBISVNUT0dSQU0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYSBoaXN0b2dyYW0gb2YgdGhlIHNpZ25hbCBsZXZlbC4KKyAqIEFzIHRoZSBub2lzZSBpcyBxdWl0ZSBjb25zdGFudCwgaXQncyBsaWtlIGRvaW5nIGl0IG9uIHRoZSBTTlIuCisgKiBXZSBoYXZlIGRlZmluZWQgYSBzZXQgb2YgaW50ZXJ2YWwgKGxwLT5oaXNfcmFuZ2UpLCBhbmQgZWFjaCB0aW1lCisgKiB0aGUgbGV2ZWwgZ29lcyBpbiB0aGF0IGludGVydmFsLCB3ZSBpbmNyZW1lbnQgdGhlIGNvdW50IChscC0+aGlzX3N1bSkuCisgKiBXaXRoIHRoaXMgaGlzdG9ncmFtIHlvdSBtYXkgZGV0ZWN0IGlmIG9uZSBXYXZlTEFOIGlzIHJlYWxseSB3ZWFrLAorICogb3IgeW91IG1heSBhbHNvIGNhbGN1bGF0ZSB0aGUgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBsZXZlbC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHdsX2hpc19nYXRoZXIoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIHU4ICogc3RhdHMpCit7CQkJCS8qIFN0YXRpc3RpY3MgdG8gZ2F0aGVyICovCisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXU4IGxldmVsID0gc3RhdHNbMF0gJiBNTVJfU0lHTkFMX0xWTDsKKwlpbnQgaTsKKworCS8qIEZpbmQgdGhlIGNvcnJlY3QgaW50ZXJ2YWwuICovCisJaSA9IDA7CisJd2hpbGUgKChpIDwgKGxwLT5oaXNfbnVtYmVyIC0gMSkpCisJICAgICAgICYmIChsZXZlbCA+PSBscC0+aGlzX3JhbmdlW2krK10pKTsKKworCS8qIEluY3JlbWVudCBpbnRlcnZhbCBjb3VudGVyLiAqLworCShscC0+aGlzX3N1bVtpXSkrKzsKK30KKyNlbmRpZiAvKiBISVNUT0dSQU0gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgcHJvdG9jb2wgbmFtZQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJc3RyY3B5KHdycXUtPm5hbWUsICJXYXZlTEFOIik7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IE5XSUQKKyAqLworc3RhdGljIGludCB3YXZlbGFuX3NldF9ud2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgIGNoYXIgKmV4dHJhKQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OwkvKiBscCBpcyBub3QgdW51c2VkICovCisJcHNhX3QgcHNhOworCW1tX3QgbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBTZXQgTldJRCBpbiBXYXZlTEFOLiAqLworCWlmICghd3JxdS0+bndpZC5kaXNhYmxlZCkgeworCQkvKiBTZXQgTldJRCBpbiBwc2EgKi8KKwkJcHNhLnBzYV9ud2lkWzBdID0gKHdycXUtPm53aWQudmFsdWUgJiAweEZGMDApID4+IDg7CisJCXBzYS5wc2FfbndpZFsxXSA9IHdycXUtPm53aWQudmFsdWUgJiAweEZGOworCQlwc2EucHNhX253aWRfc2VsZWN0ID0gMHgwMTsKKwkJcHNhX3dyaXRlKGlvYWRkciwgbHAtPmhhY3IsCisJCQkgIChjaGFyICopIHBzYS5wc2FfbndpZCAtIChjaGFyICopICZwc2EsCisJCQkgICh1bnNpZ25lZCBjaGFyICopIHBzYS5wc2FfbndpZCwgMyk7CisKKwkJLyogU2V0IE5XSUQgaW4gbW1jLiAqLworCQltLncubW13X25ldHdfaWRfbCA9IHBzYS5wc2FfbndpZFsxXTsKKwkJbS53Lm1td19uZXR3X2lkX2ggPSBwc2EucHNhX253aWRbMF07CisJCW1tY193cml0ZShpb2FkZHIsCisJCQkgIChjaGFyICopICZtLncubW13X25ldHdfaWRfbCAtCisJCQkgIChjaGFyICopICZtLAorCQkJICAodW5zaWduZWQgY2hhciAqKSAmbS53Lm1td19uZXR3X2lkX2wsIDIpOworCQltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19sb29wdF9zZWwpLCAweDAwKTsKKwl9IGVsc2UgeworCQkvKiBEaXNhYmxlIE5XSUQgaW4gdGhlIHBzYS4gKi8KKwkJcHNhLnBzYV9ud2lkX3NlbGVjdCA9IDB4MDA7CisJCXBzYV93cml0ZShpb2FkZHIsIGxwLT5oYWNyLAorCQkJICAoY2hhciAqKSAmcHNhLnBzYV9ud2lkX3NlbGVjdCAtCisJCQkgIChjaGFyICopICZwc2EsCisJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX253aWRfc2VsZWN0LAorCQkJICAxKTsKKworCQkvKiBEaXNhYmxlIE5XSUQgaW4gdGhlIG1tYyAobm8gZmlsdGVyaW5nKS4gKi8KKwkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfbG9vcHRfc2VsKSwKKwkJCU1NV19MT09QVF9TRUxfRElTX05XSUQpOworCX0KKwkvKiB1cGRhdGUgdGhlIFdhdmVsYW4gY2hlY2tzdW0gKi8KKwl1cGRhdGVfcHNhX2NoZWNrc3VtKGRldiwgaW9hZGRyLCBscC0+aGFjcik7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IE5XSUQgCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfbndpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCXBzYV90IHBzYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBSZWFkIHRoZSBOV0lELiAqLworCXBzYV9yZWFkKGlvYWRkciwgbHAtPmhhY3IsCisJCSAoY2hhciAqKSBwc2EucHNhX253aWQgLSAoY2hhciAqKSAmcHNhLAorCQkgKHVuc2lnbmVkIGNoYXIgKikgcHNhLnBzYV9ud2lkLCAzKTsKKwl3cnF1LT5ud2lkLnZhbHVlID0gKHBzYS5wc2FfbndpZFswXSA8PCA4KSArIHBzYS5wc2FfbndpZFsxXTsKKwl3cnF1LT5ud2lkLmRpc2FibGVkID0gIShwc2EucHNhX253aWRfc2VsZWN0KTsKKwl3cnF1LT5ud2lkLmZpeGVkID0gMTsJLyogU3VwZXJmbHVvdXMgKi8KKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgZnJlcXVlbmN5CisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJLyogQXR0ZW1wdCB0byByZWNvZ25pc2UgMi4wMCBjYXJkcyAoMi40IEdIeiBmcmVxdWVuY3kgc2VsZWN0YWJsZSkuICovCisJaWYgKCEobW1jX2luKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorCSAgICAgIChNTVJfRkVFX1NUQVRVU19EV0xEIHwgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpKQorCQlyZXQgPSB3dl9zZXRfZnJlcXVlbmN5KGlvYWRkciwgJih3cnF1LT5mcmVxKSk7CisJZWxzZQorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgZnJlcXVlbmN5CisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCXBzYV90IHBzYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBBdHRlbXB0IHRvIHJlY29nbmlzZSAyLjAwIGNhcmRzICgyLjQgR0h6IGZyZXF1ZW5jeSBzZWxlY3RhYmxlKS4KKwkgKiBEb2VzIGl0IHdvcmsgZm9yIGV2ZXJ5Ym9keSwgZXNwZWNpYWxseSBvbGQgY2FyZHM/ICovCisJaWYgKCEobW1jX2luKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorCSAgICAgIChNTVJfRkVFX1NUQVRVU19EV0xEIHwgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpKSB7CisJCXVuc2lnbmVkIHNob3J0IGZyZXE7CisKKwkJLyogQXNrIHRoZSBFRVBST00gdG8gcmVhZCB0aGUgZnJlcXVlbmN5IGZyb20gdGhlIGZpcnN0IGFyZWEuICovCisJCWZlZV9yZWFkKGlvYWRkciwgMHgwMCwgJmZyZXEsIDEpOworCQl3cnF1LT5mcmVxLm0gPSAoKGZyZXEgPj4gNSkgKiA1ICsgMjQwMDBMKSAqIDEwMDAwOworCQl3cnF1LT5mcmVxLmUgPSAxOworCX0gZWxzZSB7CisJCXBzYV9yZWFkKGlvYWRkciwgbHAtPmhhY3IsCisJCQkgKGNoYXIgKikgJnBzYS5wc2Ffc3ViYmFuZCAtIChjaGFyICopICZwc2EsCisJCQkgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS5wc2Ffc3ViYmFuZCwgMSk7CisKKwkJaWYgKHBzYS5wc2Ffc3ViYmFuZCA8PSA0KSB7CisJCQl3cnF1LT5mcmVxLm0gPSBmaXhlZF9iYW5kc1twc2EucHNhX3N1YmJhbmRdOworCQkJd3JxdS0+ZnJlcS5lID0gKHBzYS5wc2Ffc3ViYmFuZCAhPSAwKTsKKwkJfSBlbHNlCisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IGxldmVsIHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CS8qIGxwIGlzIG5vdCB1bnVzZWQgKi8KKwlwc2FfdCBwc2E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJLyogU2V0IHRoZSBsZXZlbCB0aHJlc2hvbGQuICovCisJLyogV2Ugc2hvdWxkIGNvbXBsYWluIGxvdWRseSBpZiB3cnF1LT5zZW5zLmZpeGVkID0gMCwgYmVjYXVzZSB3ZQorCSAqIGNhbid0IHNldCBhdXRvIG1vZGUuLi4gKi8KKwlwc2EucHNhX3Rocl9wcmVfc2V0ID0gd3JxdS0+c2Vucy52YWx1ZSAmIDB4M0Y7CisJcHNhX3dyaXRlKGlvYWRkciwgbHAtPmhhY3IsCisJCSAgKGNoYXIgKikgJnBzYS5wc2FfdGhyX3ByZV9zZXQgLSAoY2hhciAqKSAmcHNhLAorCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX3Rocl9wcmVfc2V0LCAxKTsKKwkvKiB1cGRhdGUgdGhlIFdhdmVsYW4gY2hlY2tzdW0gKi8KKwl1cGRhdGVfcHNhX2NoZWNrc3VtKGRldiwgaW9hZGRyLCBscC0+aGFjcik7CisJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfdGhyX3ByZV9zZXQpLAorCQlwc2EucHNhX3Rocl9wcmVfc2V0KTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgbGV2ZWwgdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfc2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCXBzYV90IHBzYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBSZWFkIHRoZSBsZXZlbCB0aHJlc2hvbGQuICovCisJcHNhX3JlYWQoaW9hZGRyLCBscC0+aGFjciwKKwkJIChjaGFyICopICZwc2EucHNhX3Rocl9wcmVfc2V0IC0gKGNoYXIgKikgJnBzYSwKKwkJICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX3Rocl9wcmVfc2V0LCAxKTsKKwl3cnF1LT5zZW5zLnZhbHVlID0gcHNhLnBzYV90aHJfcHJlX3NldCAmIDB4M0Y7CisJd3JxdS0+c2Vucy5maXhlZCA9IDE7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IGVuY3J5cHRpb24ga2V5CisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICAgIGNoYXIgKmV4dHJhKQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OwkvKiBscCBpcyBub3QgdW51c2VkICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlwc2FfdCBwc2E7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgaWYgY2FwYWJsZSBvZiBlbmNyeXB0aW9uICovCisJaWYgKCFtbWNfZW5jcihpb2FkZHIpKSB7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKworCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBrZXkgKi8KKwlpZigod3JxdS0+ZW5jb2RpbmcubGVuZ3RoICE9IDgpICYmICh3cnF1LT5lbmNvZGluZy5sZW5ndGggIT0gMCkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlpZighcmV0KSB7CisJCS8qIEJhc2ljIGNoZWNraW5nLi4uICovCisJCWlmICh3cnF1LT5lbmNvZGluZy5sZW5ndGggPT0gOCkgeworCQkJLyogQ29weSB0aGUga2V5IGluIHRoZSBkcml2ZXIgKi8KKwkJCW1lbWNweShwc2EucHNhX2VuY3J5cHRpb25fa2V5LCBleHRyYSwKKwkJCSAgICAgICB3cnF1LT5lbmNvZGluZy5sZW5ndGgpOworCQkJcHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCA9IDE7CisKKwkJCXBzYV93cml0ZShpb2FkZHIsIGxwLT5oYWNyLAorCQkJCSAgKGNoYXIgKikgJnBzYS5wc2FfZW5jcnlwdGlvbl9zZWxlY3QgLQorCQkJCSAgKGNoYXIgKikgJnBzYSwKKwkJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EuCisJCQkJICBwc2FfZW5jcnlwdGlvbl9zZWxlY3QsIDggKyAxKTsKKworCQkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZW5jcl9lbmFibGUpLAorCQkJCU1NV19FTkNSX0VOQUJMRV9FTiB8IE1NV19FTkNSX0VOQUJMRV9NT0RFKTsKKwkJCW1tY193cml0ZShpb2FkZHIsIG1td29mZigwLCBtbXdfZW5jcl9rZXkpLAorCQkJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS4KKwkJCQkgIHBzYV9lbmNyeXB0aW9uX2tleSwgOCk7CisJCX0KKworCQkvKiBkaXNhYmxlIGVuY3J5cHRpb24gKi8KKwkJaWYgKHdycXUtPmVuY29kaW5nLmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB7CisJCQlwc2EucHNhX2VuY3J5cHRpb25fc2VsZWN0ID0gMDsKKwkJCXBzYV93cml0ZShpb2FkZHIsIGxwLT5oYWNyLAorCQkJCSAgKGNoYXIgKikgJnBzYS5wc2FfZW5jcnlwdGlvbl9zZWxlY3QgLQorCQkJCSAgKGNoYXIgKikgJnBzYSwKKwkJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EuCisJCQkJICBwc2FfZW5jcnlwdGlvbl9zZWxlY3QsIDEpOworCisJCQltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19lbmNyX2VuYWJsZSksIDApOworCQl9CisJCS8qIHVwZGF0ZSB0aGUgV2F2ZWxhbiBjaGVja3N1bSAqLworCQl1cGRhdGVfcHNhX2NoZWNrc3VtKGRldiwgaW9hZGRyLCBscC0+aGFjcik7CisJfQorCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBlbmNyeXB0aW9uIGtleQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCXBzYV90IHBzYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBDaGVjayBpZiBlbmNyeXB0aW9uIGlzIGF2YWlsYWJsZSAqLworCWlmICghbW1jX2VuY3IoaW9hZGRyKSkgeworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9IGVsc2UgeworCQkvKiBSZWFkIHRoZSBlbmNyeXB0aW9uIGtleSAqLworCQlwc2FfcmVhZChpb2FkZHIsIGxwLT5oYWNyLAorCQkJIChjaGFyICopICZwc2EucHNhX2VuY3J5cHRpb25fc2VsZWN0IC0KKwkJCSAoY2hhciAqKSAmcHNhLAorCQkJICh1bnNpZ25lZCBjaGFyICopICZwc2EuCisJCQkgcHNhX2VuY3J5cHRpb25fc2VsZWN0LCAxICsgOCk7CisKKwkJLyogZW5jcnlwdGlvbiBpcyBlbmFibGVkID8gKi8KKwkJaWYgKHBzYS5wc2FfZW5jcnlwdGlvbl9zZWxlY3QpCisJCQl3cnF1LT5lbmNvZGluZy5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEOworCQllbHNlCisJCQl3cnF1LT5lbmNvZGluZy5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJd3JxdS0+ZW5jb2RpbmcuZmxhZ3MgfD0gbW1jX2VuY3IoaW9hZGRyKTsKKworCQkvKiBDb3B5IHRoZSBrZXkgdG8gdGhlIHVzZXIgYnVmZmVyICovCisJCXdycXUtPmVuY29kaW5nLmxlbmd0aCA9IDg7CisJCW1lbWNweShleHRyYSwgcHNhLnBzYV9lbmNyeXB0aW9uX2tleSwgd3JxdS0+ZW5jb2RpbmcubGVuZ3RoKTsKKwl9CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHJhbmdlIGluZm8KKyAqLworc3RhdGljIGludCB3YXZlbGFuX2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgICBjaGFyICpleHRyYSkKK3sKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsJLyogbHAgaXMgbm90IHVudXNlZCAqLworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopIGV4dHJhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBTZXQgdGhlIGxlbmd0aCAodmVyeSBpbXBvcnRhbnQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpICovCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKKworCS8qIFNldCBhbGwgdGhlIGluZm8gd2UgZG9uJ3QgY2FyZSBvciBkb24ndCBrbm93IGFib3V0IHRvIHplcm8gKi8KKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKKworCS8qIFNldCB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9uIHZlcnNpb25zICovCisJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgPSBXSVJFTEVTU19FWFQ7CisJcmFuZ2UtPndlX3ZlcnNpb25fc291cmNlID0gOTsKKworCS8qIFNldCBpbmZvcm1hdGlvbiBpbiB0aGUgcmFuZ2Ugc3RydWN0LiAgKi8KKwlyYW5nZS0+dGhyb3VnaHB1dCA9IDEuNiAqIDEwMDAgKiAxMDAwOwkvKiBkb24ndCBhcmd1ZSBvbiB0aGlzICEgKi8KKwlyYW5nZS0+bWluX253aWQgPSAweDAwMDA7CisJcmFuZ2UtPm1heF9ud2lkID0gMHhGRkZGOworCisJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMHgzRjsKKwlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IE1NUl9TR05MX1FVQUw7CisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gTU1SX1NJR05BTF9MVkw7CisJcmFuZ2UtPm1heF9xdWFsLm5vaXNlID0gTU1SX1NJTEVOQ0VfTFZMOworCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gTU1SX1NHTkxfUVVBTDsgLyogQWx3YXlzIG1heCAqLworCS8qIE5lZWQgdG8gZ2V0IGJldHRlciB2YWx1ZXMgZm9yIHRob3NlIHR3byAqLworCXJhbmdlLT5hdmdfcXVhbC5sZXZlbCA9IDMwOworCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IDg7CisKKwlyYW5nZS0+bnVtX2JpdHJhdGVzID0gMTsKKwlyYW5nZS0+Yml0cmF0ZVswXSA9IDIwMDAwMDA7CS8qIDIgTWIvcyAqLworCisJLyogRXZlbnQgY2FwYWJpbGl0eSAoa2VybmVsICsgZHJpdmVyKSAqLworCXJhbmdlLT5ldmVudF9jYXBhWzBdID0gKElXX0VWRU5UX0NBUEFfTUFTSygweDhCMDIpIHwKKwkJCQlJV19FVkVOVF9DQVBBX01BU0soMHg4QjA0KSk7CisJcmFuZ2UtPmV2ZW50X2NhcGFbMV0gPSBJV19FVkVOVF9DQVBBX0tfMTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJLyogQXR0ZW1wdCB0byByZWNvZ25pc2UgMi4wMCBjYXJkcyAoMi40IEdIeiBmcmVxdWVuY3kgc2VsZWN0YWJsZSkuICovCisJaWYgKCEobW1jX2luKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorCSAgICAgIChNTVJfRkVFX1NUQVRVU19EV0xEIHwgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpKSB7CisJCXJhbmdlLT5udW1fY2hhbm5lbHMgPSAxMDsKKwkJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSB3dl9mcmVxdWVuY3lfbGlzdChpb2FkZHIsIHJhbmdlLT5mcmVxLAorCQkJCQkJCUlXX01BWF9GUkVRVUVOQ0lFUyk7CisJfSBlbHNlCisJCXJhbmdlLT5udW1fY2hhbm5lbHMgPSByYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IDA7CisKKwkvKiBFbmNyeXB0aW9uIHN1cHBvcnRlZCA/ICovCisJaWYgKG1tY19lbmNyKGlvYWRkcikpIHsKKwkJcmFuZ2UtPmVuY29kaW5nX3NpemVbMF0gPSA4OwkvKiBERVMgPSA2NCBiaXRzIGtleSAqLworCQlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMTsKKwkJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSAxOwkvKiBPbmx5IG9uZSBrZXkgcG9zc2libGUgKi8KKwl9IGVsc2UgeworCQlyYW5nZS0+bnVtX2VuY29kaW5nX3NpemVzID0gMDsKKwkJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgPSAwOworCX0KKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IHNldCBxdWFsaXR5IHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X3F0aHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CS8qIGxwIGlzIG5vdCB1bnVzZWQgKi8KKwlwc2FfdCBwc2E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJcHNhLnBzYV9xdWFsaXR5X3RociA9ICooZXh0cmEpICYgMHgwRjsKKwlwc2Ffd3JpdGUoaW9hZGRyLCBscC0+aGFjciwKKwkJICAoY2hhciAqKSAmcHNhLnBzYV9xdWFsaXR5X3RociAtIChjaGFyICopICZwc2EsCisJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS5wc2FfcXVhbGl0eV90aHIsIDEpOworCS8qIHVwZGF0ZSB0aGUgV2F2ZWxhbiBjaGVja3N1bSAqLworCXVwZGF0ZV9wc2FfY2hlY2tzdW0oZGV2LCBpb2FkZHIsIGxwLT5oYWNyKTsKKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19xdWFsaXR5X3RociksCisJCXBzYS5wc2FfcXVhbGl0eV90aHIpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IGdldCBxdWFsaXR5IHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X3F0aHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CS8qIGxwIGlzIG5vdCB1bnVzZWQgKi8KKwlwc2FfdCBwc2E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJcHNhX3JlYWQoaW9hZGRyLCBscC0+aGFjciwKKwkJIChjaGFyICopICZwc2EucHNhX3F1YWxpdHlfdGhyIC0gKGNoYXIgKikgJnBzYSwKKwkJICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX3F1YWxpdHlfdGhyLCAxKTsKKwkqKGV4dHJhKSA9IHBzYS5wc2FfcXVhbGl0eV90aHIgJiAweDBGOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIEhJU1RPR1JBTQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IHNldCBoaXN0b2dyYW0KKyAqLworc3RhdGljIGludCB3YXZlbGFuX3NldF9oaXN0byhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgICBjaGFyICpleHRyYSkKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CS8qIGxwIGlzIG5vdCB1bnVzZWQgKi8KKworCS8qIENoZWNrIHRoZSBudW1iZXIgb2YgaW50ZXJ2YWxzLiAqLworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IDE2KSB7CisJCXJldHVybigtRTJCSUcpOworCX0KKworCS8qIERpc2FibGUgaGlzdG8gd2hpbGUgd2UgY29weSB0aGUgYWRkcmVzc2VzLgorCSAqIEFzIHdlIGRvbid0IGRpc2FibGUgaW50ZXJydXB0cywgd2UgbmVlZCB0byBkbyB0aGlzICovCisJbHAtPmhpc19udW1iZXIgPSAwOworCisJLyogQXJlIHRoZXJlIHJhbmdlcyB0byBjb3B5PyAqLworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IDApIHsKKwkJLyogQ29weSBpbnRlcnZhbCByYW5nZXMgdG8gdGhlIGRyaXZlciAqLworCQltZW1jcHkobHAtPmhpc19yYW5nZSwgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKKworCQl7CisJCSAgaW50IGk7CisJCSAgcHJpbnRrKEtFUk5fREVCVUcgIkhpc3RvIDoiKTsKKwkJICBmb3IoaSA9IDA7IGkgPCB3cnF1LT5kYXRhLmxlbmd0aDsgaSsrKQorCQkgICAgcHJpbnRrKCIgJWQiLCBscC0+aGlzX3JhbmdlW2ldKTsKKwkJICBwcmludGsoIlxuIik7CisJCX0KKworCQkvKiBSZXNldCByZXN1bHQgc3RydWN0dXJlLiAqLworCQltZW1zZXQobHAtPmhpc19zdW0sIDB4MDAsIHNpemVvZihsb25nKSAqIDE2KTsKKwl9CisKKwkvKiBOb3cgd2UgY2FuIHNldCB0aGUgbnVtYmVyIG9mIHJhbmdlcyAqLworCWxwLT5oaXNfbnVtYmVyID0gd3JxdS0+ZGF0YS5sZW5ndGg7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBQcml2YXRlIEhhbmRsZXIgOiBnZXQgaGlzdG9ncmFtCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfaGlzdG8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICAgY2hhciAqZXh0cmEpCit7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OwkvKiBscCBpcyBub3QgdW51c2VkICovCisKKwkvKiBTZXQgdGhlIG51bWJlciBvZiBpbnRlcnZhbHMuICovCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBscC0+aGlzX251bWJlcjsKKworCS8qIEdpdmUgYmFjayB0aGUgZGlzdHJpYnV0aW9uIHN0YXRpc3RpY3MgKi8KKwlpZihscC0+aGlzX251bWJlciA+IDApCisJCW1lbWNweShleHRyYSwgbHAtPmhpc19zdW0sIHNpemVvZihsb25nKSAqIGxwLT5oaXNfbnVtYmVyKTsKKworCXJldHVybigwKTsKK30KKyNlbmRpZgkJCS8qIEhJU1RPR1JBTSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU3RydWN0dXJlcyB0byBleHBvcnQgdGhlIFdpcmVsZXNzIEhhbmRsZXJzCisgKi8KKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJCXdhdmVsYW5faGFuZGxlcltdID0KK3sKKwlOVUxMLAkJCQkvKiBTSU9DU0lXTkFNRSAqLworCXdhdmVsYW5fZ2V0X25hbWUsCQkvKiBTSU9DR0lXTkFNRSAqLworCXdhdmVsYW5fc2V0X253aWQsCQkvKiBTSU9DU0lXTldJRCAqLworCXdhdmVsYW5fZ2V0X253aWQsCQkvKiBTSU9DR0lXTldJRCAqLworCXdhdmVsYW5fc2V0X2ZyZXEsCQkvKiBTSU9DU0lXRlJFUSAqLworCXdhdmVsYW5fZ2V0X2ZyZXEsCQkvKiBTSU9DR0lXRlJFUSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdNT0RFICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV01PREUgKi8KKwl3YXZlbGFuX3NldF9zZW5zLAkJLyogU0lPQ1NJV1NFTlMgKi8KKwl3YXZlbGFuX2dldF9zZW5zLAkJLyogU0lPQ0dJV1NFTlMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXUkFOR0UgKi8KKwl3YXZlbGFuX2dldF9yYW5nZSwJCS8qIFNJT0NHSVdSQU5HRSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdQUklWICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV1BSSVYgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXU1RBVFMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXU1RBVFMgKi8KKwlpd19oYW5kbGVyX3NldF9zcHksCQkvKiBTSU9DU0lXU1BZICovCisJaXdfaGFuZGxlcl9nZXRfc3B5LAkJLyogU0lPQ0dJV1NQWSAqLworCWl3X2hhbmRsZXJfc2V0X3RocnNweSwJCS8qIFNJT0NTSVdUSFJTUFkgKi8KKwlpd19oYW5kbGVyX2dldF90aHJzcHksCQkvKiBTSU9DR0lXVEhSU1BZICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV0FQICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV0FQICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdBUExJU1QgKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdFU1NJRCAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdFU1NJRCAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdOSUNLTiAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdOSUNLTiAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1JBVEUgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUkFURSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSVFMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUlRTICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV0ZSQUcgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXRlJBRyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdUWFBPVyAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdUWFBPVyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSRVRSWSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdSRVRSWSAqLworCS8qIEJ1bW1lciAhIFdoeSB0aG9zZSBhcmUgb25seSBhdCB0aGUgZW5kID8/PyAqLworCXdhdmVsYW5fc2V0X2VuY29kZSwJCS8qIFNJT0NTSVdFTkNPREUgKi8KKwl3YXZlbGFuX2dldF9lbmNvZGUsCQkvKiBTSU9DR0lXRU5DT0RFICovCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlcgkJd2F2ZWxhbl9wcml2YXRlX2hhbmRsZXJbXSA9Cit7CisJd2F2ZWxhbl9zZXRfcXRociwJCS8qIFNJT0NJV0ZJUlNUUFJJViAqLworCXdhdmVsYW5fZ2V0X3F0aHIsCQkvKiBTSU9DSVdGSVJTVFBSSVYgKyAxICovCisjaWZkZWYgSElTVE9HUkFNCisJd2F2ZWxhbl9zZXRfaGlzdG8sCQkvKiBTSU9DSVdGSVJTVFBSSVYgKyAyICovCisJd2F2ZWxhbl9nZXRfaGlzdG8sCQkvKiBTSU9DSVdGSVJTVFBSSVYgKyAzICovCisjZW5kaWYJLyogSElTVE9HUkFNICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncyB3YXZlbGFuX3ByaXZhdGVfYXJnc1tdID0geworLyp7IGNtZCwgICAgICAgICBzZXRfYXJncywgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2FyZ3MsIG5hbWUgfSAqLworICB7IFNJT0NTSVBRVEhSLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRxdWFsdGhyIiB9LAorICB7IFNJT0NHSVBRVEhSLCAwLCBJV19QUklWX1RZUEVfQllURSB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsICJnZXRxdWFsdGhyIiB9LAorICB7IFNJT0NTSVBISVNUTywgSVdfUFJJVl9UWVBFX0JZVEUgfCAxNiwgICAgICAgICAgICAgICAgICAgIDAsICJzZXRoaXN0byIgfSwKKyAgeyBTSU9DR0lQSElTVE8sIDAsICAgICAgICAgICAgICAgICAgICAgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LCAiZ2V0aGlzdG8iIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmCXdhdmVsYW5faGFuZGxlcl9kZWYgPQoreworCS5udW1fc3RhbmRhcmQJPSBzaXplb2Yod2F2ZWxhbl9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlCT0gc2l6ZW9mKHdhdmVsYW5fcHJpdmF0ZV9oYW5kbGVyKS9zaXplb2YoaXdfaGFuZGxlciksCisJLm51bV9wcml2YXRlX2FyZ3MgPSBzaXplb2Yod2F2ZWxhbl9wcml2YXRlX2FyZ3MpL3NpemVvZihzdHJ1Y3QgaXdfcHJpdl9hcmdzKSwKKwkuc3RhbmRhcmQJPSB3YXZlbGFuX2hhbmRsZXIsCisJLnByaXZhdGUJPSB3YXZlbGFuX3ByaXZhdGVfaGFuZGxlciwKKwkucHJpdmF0ZV9hcmdzCT0gd2F2ZWxhbl9wcml2YXRlX2FyZ3MsCisJLmdldF93aXJlbGVzc19zdGF0cyA9IHdhdmVsYW5fZ2V0X3dpcmVsZXNzX3N0YXRzLAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEdldCB3aXJlbGVzcyBzdGF0aXN0aWNzLgorICogQ2FsbGVkIGJ5IC9wcm9jL25ldC93aXJlbGVzcworICovCitzdGF0aWMgaXdfc3RhdHMgKndhdmVsYW5fZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCW1tcl90IG07CisJaXdfc3RhdHMgKndzdGF0czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgREVCVUdfSU9DVExfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d2F2ZWxhbl9nZXRfd2lyZWxlc3Nfc3RhdHMoKVxuIiwKKwkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogQ2hlY2sgKi8KKwlpZiAobHAgPT0gKG5ldF9sb2NhbCAqKSBOVUxMKQorCQlyZXR1cm4gKGl3X3N0YXRzICopIE5VTEw7CisJCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwl3c3RhdHMgPSAmbHAtPndzdGF0czsKKworCS8qIEdldCBkYXRhIGZyb20gdGhlIG1tYy4gKi8KKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mcmVlemUpLCAxKTsKKworCW1tY19yZWFkKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl9kY2Vfc3RhdHVzKSwgJm0ubW1yX2RjZV9zdGF0dXMsIDEpOworCW1tY19yZWFkKGlvYWRkciwgbW1yb2ZmKDAsIG1tcl93cm9uZ19ud2lkX2wpLCAmbS5tbXJfd3JvbmdfbndpZF9sLAorCQkgMik7CisJbW1jX3JlYWQoaW9hZGRyLCBtbXJvZmYoMCwgbW1yX3Rocl9wcmVfc2V0KSwgJm0ubW1yX3Rocl9wcmVfc2V0LAorCQkgNCk7CisKKwltbWNfb3V0KGlvYWRkciwgbW13b2ZmKDAsIG1td19mcmVlemUpLCAwKTsKKworCS8qIENvcHkgZGF0YSB0byB3aXJlbGVzcyBzdHVmZi4gKi8KKwl3c3RhdHMtPnN0YXR1cyA9IG0ubW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVUzsKKwl3c3RhdHMtPnF1YWwucXVhbCA9IG0ubW1yX3NnbmxfcXVhbCAmIE1NUl9TR05MX1FVQUw7CisJd3N0YXRzLT5xdWFsLmxldmVsID0gbS5tbXJfc2lnbmFsX2x2bCAmIE1NUl9TSUdOQUxfTFZMOworCXdzdGF0cy0+cXVhbC5ub2lzZSA9IG0ubW1yX3NpbGVuY2VfbHZsICYgTU1SX1NJTEVOQ0VfTFZMOworCXdzdGF0cy0+cXVhbC51cGRhdGVkID0gKCgobS4gbW1yX3NpZ25hbF9sdmwgJiBNTVJfU0lHTkFMX0xWTF9WQUxJRCkgPj4gNykgCisJCQl8ICgobS5tbXJfc2lnbmFsX2x2bCAmIE1NUl9TSUdOQUxfTFZMX1ZBTElEKSA+PiA2KSAKKwkJCXwgKChtLm1tcl9zaWxlbmNlX2x2bCAmIE1NUl9TSUxFTkNFX0xWTF9WQUxJRCkgPj4gNSkpOworCXdzdGF0cy0+ZGlzY2FyZC5ud2lkICs9IChtLm1tcl93cm9uZ19ud2lkX2ggPDwgOCkgfCBtLm1tcl93cm9uZ19ud2lkX2w7CisJd3N0YXRzLT5kaXNjYXJkLmNvZGUgPSAwTDsKKwl3c3RhdHMtPmRpc2NhcmQubWlzYyA9IDBMOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyNpZmRlZiBERUJVR19JT0NUTF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX2dldF93aXJlbGVzc19zdGF0cygpXG4iLAorCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJcmV0dXJuICZscC0+d3N0YXRzOworfQorI2VuZGlmCQkJCS8qIFdJUkVMRVNTX0VYVCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBQQUNLRVQgUkVDRVBUSU9OICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyBwYXJ0IGRlYWxzIHdpdGggcmVjZWl2aW5nIHRoZSBwYWNrZXRzLgorICogVGhlIGludGVycnVwdCBoYW5kbGVyIGdldHMgYW4gaW50ZXJydXB0IHdoZW4gYSBwYWNrZXQgaGFzIGJlZW4KKyAqIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBhbmQgY2FsbHMgdGhpcyBwYXJ0LgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIHJvdXRpbmUgZG9lcyB0aGUgYWN0dWFsIGNvcHlpbmcgb2YgZGF0YSAoaW5jbHVkaW5nIHRoZSBFdGhlcm5ldAorICogaGVhZGVyIHN0cnVjdHVyZSkgZnJvbSB0aGUgV2F2ZUxBTiBjYXJkIHRvIGFuIHNrX2J1ZmYgY2hhaW4gdGhhdAorICogd2lsbCBiZSBwYXNzZWQgdXAgdG8gdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGxheWVyLiBOT1RFOiB3ZQorICogY3VycmVudGx5IGRvbid0IGhhbmRsZSB0cmFpbGVyIHByb3RvY29scyAobmVpdGhlciBkb2VzIHRoZSByZXN0IG9mCisgKiB0aGUgbmV0d29yayBpbnRlcmZhY2UpLCBzbyBpZiB0aGF0IGlzIG5lZWRlZCwgaXQgd2lsbCAoYXQgbGVhc3QgaW4KKyAqIHBhcnQpIGJlIGFkZGVkIGhlcmUuICBUaGUgY29udGVudHMgb2YgdGhlIHJlY2VpdmUgcmluZyBidWZmZXIgYXJlCisgKiBjb3BpZWQgdG8gYSBtZXNzYWdlIGNoYWluIHRoYXQgaXMgdGhlbiBwYXNzZWQgdG8gdGhlIGtlcm5lbC4KKyAqCisgKiBOb3RlOiBpZiBhbnkgZXJyb3JzIG9jY3VyLCB0aGUgcGFja2V0IGlzICJkcm9wcGVkIG9uIHRoZSBmbG9vciIuCisgKiAoY2FsbGVkIGJ5IHd2X3BhY2tldF9yY3YoKSkKKyAqLworc3RhdGljIGlubGluZSB2b2lkCit3dl9wYWNrZXRfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgdTE2IGJ1Zl9vZmYsIGludCBza3NpemUpCit7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworI2lmZGVmIERFQlVHX1JYX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X3BhY2tldF9yZWFkKDB4JVgsICVkKVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCBidWZfb2ZmLCBza3NpemUpOworI2VuZGlmCisKKwkvKiBBbGxvY2F0ZSBidWZmZXIgZm9yIHRoZSBkYXRhICovCisJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKHNrc2l6ZSkpID09IChzdHJ1Y3Qgc2tfYnVmZiAqKSBOVUxMKSB7CisjaWZkZWYgREVCVUdfUlhfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiB3dl9wYWNrZXRfcmVhZCgpOiBjb3VsZCBub3QgYWxsb2Nfc2tiKCVkLCBHRlBfQVRPTUlDKS5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHNrc2l6ZSk7CisjZW5kaWYKKwkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJcmV0dXJuOworCX0KKworCXNrYi0+ZGV2ID0gZGV2OworCisJLyogQ29weSB0aGUgcGFja2V0IHRvIHRoZSBidWZmZXIuICovCisJb2JyYW1fcmVhZChpb2FkZHIsIGJ1Zl9vZmYsIHNrYl9wdXQoc2tiLCBza3NpemUpLCBza3NpemUpOworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisKKyNpZmRlZiBERUJVR19SWF9JTkZPCisJd3ZfcGFja2V0X2luZm8oc2tiLT5tYWMucmF3LCBza3NpemUsIGRldi0+bmFtZSwgInd2X3BhY2tldF9yZWFkIik7CisjZW5kaWYJCQkJLyogREVCVUdfUlhfSU5GTyAqLworCisJLyogU3RhdGlzdGljcy1nYXRoZXJpbmcgYW5kIGFzc29jaWF0ZWQgc3R1ZmYuCisJICogSXQgc2VlbSBhIGJpdCBtZXNzeSB3aXRoIGFsbCB0aGUgZGVmaW5lLCBidXQgaXQncyByZWFsbHkKKwkgKiBzaW1wbGUuLi4gKi8KKwlpZiAoCisjaWZkZWYgSVdfV0lSRUxFU1NfU1BZCQkvKiBkZWZpbmVkIGluIGl3X2hhbmRsZXIuaCAqLworCQkgICAobHAtPnNweV9kYXRhLnNweV9udW1iZXIgPiAwKSB8fAorI2VuZGlmIC8qIElXX1dJUkVMRVNTX1NQWSAqLworI2lmZGVmIEhJU1RPR1JBTQorCQkgICAobHAtPmhpc19udW1iZXIgPiAwKSB8fAorI2VuZGlmIC8qIEhJU1RPR1JBTSAqLworCQkgICAwKSB7CisJCXU4IHN0YXRzWzNdOwkvKiBzaWduYWwgbGV2ZWwsIG5vaXNlIGxldmVsLCBzaWduYWwgcXVhbGl0eSAqLworCisJCS8qIFJlYWQgc2lnbmFsIGxldmVsLCBzaWxlbmNlIGxldmVsIGFuZCBzaWduYWwgcXVhbGl0eSBieXRlcyAqLworCQkvKiBOb3RlOiBpbiB0aGUgUENNQ0lBIGhhcmR3YXJlLCB0aGVzZSBhcmUgcGFydCBvZiB0aGUgZnJhbWUuCisJCSAqIEl0IHNlZW1zIHRoYXQgZm9yIHRoZSBJU0EgaGFyZHdhcmUsIGl0J3Mgbm93aGVyZSB0byBiZQorCQkgKiBmb3VuZCBpbiB0aGUgZnJhbWUsIHNvIEknbSBvYmxpZ2VkIHRvIGRvIHRoaXMgKGl0IGhhcyBhCisJCSAqIHNpZGUgZWZmZWN0IG9uIC9wcm9jL25ldC93aXJlbGVzcykuCisJCSAqIEFueSBpZGVhcz8KKwkJICovCisJCW1tY19vdXQoaW9hZGRyLCBtbXdvZmYoMCwgbW13X2ZyZWV6ZSksIDEpOworCQltbWNfcmVhZChpb2FkZHIsIG1tcm9mZigwLCBtbXJfc2lnbmFsX2x2bCksIHN0YXRzLCAzKTsKKwkJbW1jX291dChpb2FkZHIsIG1td29mZigwLCBtbXdfZnJlZXplKSwgMCk7CisKKyNpZmRlZiBERUJVR19SWF9JTkZPCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6IHd2X3BhY2tldF9yZWFkKCk6IFNpZ25hbCBsZXZlbCAlZC82MywgU2lsZW5jZSBsZXZlbCAlZC82Mywgc2lnbmFsIHF1YWxpdHkgJWQvMTZcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHN0YXRzWzBdICYgMHgzRiwgc3RhdHNbMV0gJiAweDNGLAorCQkgICAgICAgc3RhdHNbMl0gJiAweDBGKTsKKyNlbmRpZgorCisJCS8qIFNweWluZyBzdHVmZiAqLworI2lmZGVmIElXX1dJUkVMRVNTX1NQWQorCQl3bF9zcHlfZ2F0aGVyKGRldiwgc2tiLT5tYWMucmF3ICsgV0FWRUxBTl9BRERSX1NJWkUsCisJCQkgICAgICBzdGF0cyk7CisjZW5kaWYgLyogSVdfV0lSRUxFU1NfU1BZICovCisjaWZkZWYgSElTVE9HUkFNCisJCXdsX2hpc19nYXRoZXIoZGV2LCBzdGF0cyk7CisjZW5kaWYgLyogSElTVE9HUkFNICovCisJfQorCisJLyoKKwkgKiBIYW5kIHRoZSBwYWNrZXQgdG8gdGhlIG5ldHdvcmsgbW9kdWxlLgorCSAqLworCW5ldGlmX3J4KHNrYik7CisKKwkvKiBLZWVwIHN0YXRpc3RpY3MgdXAgdG8gZGF0ZSAqLworCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlscC0+c3RhdHMucnhfYnl0ZXMgKz0gc2tzaXplOworCisjaWZkZWYgREVCVUdfUlhfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfcGFja2V0X3JlYWQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVHJhbnNmZXIgYXMgbWFueSBwYWNrZXRzIGFzIHdlIGNhbgorICogZnJvbSB0aGUgZGV2aWNlIFJBTS4KKyAqIChjYWxsZWQgaW4gd2F2ZWxhbl9pbnRlcnJ1cHQoKSkuCisgKiBOb3RlIDogdGhlIHNwaW5sb2NrIGlzIGFscmVhZHkgZ3JhYmJlZCBmb3IgdXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3dl9yZWNlaXZlKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCWZkX3QgZmQ7CisJcmJkX3QgcmJkOworCWludCBucmVhcGVkID0gMDsKKworI2lmZGVmIERFQlVHX1JYX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X3JlY2VpdmUoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogTG9vcCBvbiBlYWNoIHJlY2VpdmVkIHBhY2tldC4gKi8KKwlmb3IgKDs7KSB7CisJCW9icmFtX3JlYWQoaW9hZGRyLCBscC0+cnhfaGVhZCwgKHVuc2lnbmVkIGNoYXIgKikgJmZkLAorCQkJICAgc2l6ZW9mKGZkKSk7CisKKwkJLyogTm90ZSBhYm91dCB0aGUgc3RhdHVzIDoKKwkJICogSXQgc3RhcnQgdXAgdG8gYmUgMCAodGhlIHZhbHVlIHdlIHNldCkuIFRoZW4sIHdoZW4gdGhlIFJVCisJCSAqIGdyYWIgdGhlIGJ1ZmZlciB0byBwcmVwYXJlIGZvciByZWNlcHRpb24sIGl0IHNldHMgdGhlCisJCSAqIEZEX1NUQVRVU19CIGZsYWcuIFdoZW4gdGhlIFJVIGhhcyBmaW5pc2hlZCByZWNlaXZpbmcgdGhlCisJCSAqIGZyYW1lLCBpdCBjbGVhcnMgRkRfU1RBVFVTX0IsIHNldCBGRF9TVEFUVVNfQyB0byBpbmRpY2F0ZQorCQkgKiBjb21wbGV0aW9uIGFuZCBzZXQgdGhlIG90aGVyIGZsYWdzIHRvIGluZGljYXRlIHRoZSBldmVudHVhbAorCQkgKiBlcnJvcnMuIEZEX1NUQVRVU19PSyBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVjZXB0aW9uIHdhcyBPSy4KKwkJICovCisKKwkJLyogSWYgdGhlIGN1cnJlbnQgZnJhbWUgaXMgbm90IGNvbXBsZXRlLCB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZC4gKi8KKwkJaWYgKChmZC5mZF9zdGF0dXMgJiBGRF9TVEFUVVNfQykgIT0gRkRfU1RBVFVTX0MpCisJCQlicmVhazsJLyogVGhpcyBpcyBob3cgd2UgZXhpdCB0aGUgbG9vcC4gKi8KKworCQlucmVhcGVkKys7CisKKwkJLyogQ2hlY2sgd2hldGhlciBmcmFtZSB3YXMgY29ycmVjdGx5IHJlY2VpdmVkLiAqLworCQlpZiAoKGZkLmZkX3N0YXR1cyAmIEZEX1NUQVRVU19PSykgPT0gRkRfU1RBVFVTX09LKSB7CisJCQkvKiBEb2VzIHRoZSBmcmFtZSBjb250YWluIGEgcG9pbnRlciB0byB0aGUgZGF0YT8gIExldCdzIGNoZWNrLiAqLworCQkJaWYgKGZkLmZkX3JiZF9vZmZzZXQgIT0gSTgyNTg2TlVMTCkgeworCQkJCS8qIFJlYWQgdGhlIHJlY2VpdmUgYnVmZmVyIGRlc2NyaXB0b3IgKi8KKwkJCQlvYnJhbV9yZWFkKGlvYWRkciwgZmQuZmRfcmJkX29mZnNldCwKKwkJCQkJICAgKHVuc2lnbmVkIGNoYXIgKikgJnJiZCwKKwkJCQkJICAgc2l6ZW9mKHJiZCkpOworCisjaWZkZWYgREVCVUdfUlhfRVJST1IKKwkJCQlpZiAoKHJiZC5yYmRfc3RhdHVzICYgUkJEX1NUQVRVU19FT0YpICE9CisJCQkJICAgIFJCRF9TVEFUVVNfRU9GKSBwcmludGsoS0VSTl9JTkZPCisJCQkJCQkJICAgIiVzOiB3dl9yZWNlaXZlKCk6IG1pc3NpbmcgRU9GIGZsYWcuXG4iLAorCQkJCQkJCSAgIGRldi0+bmFtZSk7CisKKwkJCQlpZiAoKHJiZC5yYmRfc3RhdHVzICYgUkJEX1NUQVRVU19GKSAhPQorCQkJCSAgICBSQkRfU1RBVFVTX0YpIHByaW50ayhLRVJOX0lORk8KKwkJCQkJCQkgIiVzOiB3dl9yZWNlaXZlKCk6IG1pc3NpbmcgRiBmbGFnLlxuIiwKKwkJCQkJCQkgZGV2LT5uYW1lKTsKKyNlbmRpZgkJCQkvKiBERUJVR19SWF9FUlJPUiAqLworCisJCQkJLyogUmVhZCB0aGUgcGFja2V0IGFuZCB0cmFuc21pdCB0byBMaW51eCAqLworCQkJCXd2X3BhY2tldF9yZWFkKGRldiwgcmJkLnJiZF9idWZsLAorCQkJCQkgICAgICAgcmJkLgorCQkJCQkgICAgICAgcmJkX3N0YXR1cyAmCisJCQkJCSAgICAgICBSQkRfU1RBVFVTX0FDTlQpOworCQkJfQorI2lmZGVmIERFQlVHX1JYX0VSUk9SCisJCQllbHNlCS8qIGlmIGZyYW1lIGhhcyBubyBkYXRhICovCisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSAgICAgICAiJXM6IHd2X3JlY2VpdmUoKTogZnJhbWUgaGFzIG5vIGRhdGEuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCX0gZWxzZSB7CS8qIElmIHJlY2VwdGlvbiB3YXMgbm8gc3VjY2Vzc2Z1bCAqLworCisJCQlscC0+c3RhdHMucnhfZXJyb3JzKys7CisKKyNpZmRlZiBERUJVR19SWF9JTkZPCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICIlczogd3ZfcmVjZWl2ZSgpOiBmcmFtZSBub3QgcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5ICglWCkuXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSwgZmQuZmRfc3RhdHVzKTsKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfUlhfRVJST1IKKwkJCWlmICgoZmQuZmRfc3RhdHVzICYgRkRfU1RBVFVTX1M2KSAhPSAwKQorCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkgICAgICAgIiVzOiB3dl9yZWNlaXZlKCk6IG5vIEVPRiBmbGFnLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJCQlpZiAoKGZkLmZkX3N0YXR1cyAmIEZEX1NUQVRVU19TNykgIT0gMCkgeworCQkJCWxwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfUlhfRkFJTAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogd3ZfcmVjZWl2ZSgpOiBmcmFtZSB0b28gc2hvcnQuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQl9CisKKwkJCWlmICgoZmQuZmRfc3RhdHVzICYgRkRfU1RBVFVTX1M4KSAhPSAwKSB7CisJCQkJbHAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfUlhfRkFJTAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogd3ZfcmVjZWl2ZSgpOiByeCBETUEgb3ZlcnJ1bi5cbiIsCisJCQkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJCX0KKworCQkJaWYgKChmZC5mZF9zdGF0dXMgJiBGRF9TVEFUVVNfUzkpICE9IDApIHsKKwkJCQlscC0+c3RhdHMucnhfZmlmb19lcnJvcnMrKzsKKyNpZmRlZiBERUJVR19SWF9GQUlMCisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkgICAgICAgIiVzOiB3dl9yZWNlaXZlKCk6IHJhbiBvdXQgb2YgcmVzb3VyY2VzLlxuIiwKKwkJCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkJfQorCisJCQlpZiAoKGZkLmZkX3N0YXR1cyAmIEZEX1NUQVRVU19TMTApICE9IDApIHsKKwkJCQlscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfUlhfRkFJTAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogd3ZfcmVjZWl2ZSgpOiBhbGlnbm1lbnQgZXJyb3IuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQl9CisKKwkJCWlmICgoZmQuZmRfc3RhdHVzICYgRkRfU1RBVFVTX1MxMSkgIT0gMCkgeworCQkJCWxwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisjaWZkZWYgREVCVUdfUlhfRkFJTAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogd3ZfcmVjZWl2ZSgpOiBDUkMgZXJyb3IuXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQl9CisJCX0KKworCQlmZC5mZF9zdGF0dXMgPSAwOworCQlvYnJhbV93cml0ZShpb2FkZHIsIGZkb2ZmKGxwLT5yeF9oZWFkLCBmZF9zdGF0dXMpLAorCQkJICAgICh1bnNpZ25lZCBjaGFyICopICZmZC5mZF9zdGF0dXMsCisJCQkgICAgc2l6ZW9mKGZkLmZkX3N0YXR1cykpOworCisJCWZkLmZkX2NvbW1hbmQgPSBGRF9DT01NQU5EX0VMOworCQlvYnJhbV93cml0ZShpb2FkZHIsIGZkb2ZmKGxwLT5yeF9oZWFkLCBmZF9jb21tYW5kKSwKKwkJCSAgICAodW5zaWduZWQgY2hhciAqKSAmZmQuZmRfY29tbWFuZCwKKwkJCSAgICBzaXplb2YoZmQuZmRfY29tbWFuZCkpOworCisJCWZkLmZkX2NvbW1hbmQgPSAwOworCQlvYnJhbV93cml0ZShpb2FkZHIsIGZkb2ZmKGxwLT5yeF9sYXN0LCBmZF9jb21tYW5kKSwKKwkJCSAgICAodW5zaWduZWQgY2hhciAqKSAmZmQuZmRfY29tbWFuZCwKKwkJCSAgICBzaXplb2YoZmQuZmRfY29tbWFuZCkpOworCisJCWxwLT5yeF9sYXN0ID0gbHAtPnJ4X2hlYWQ7CisJCWxwLT5yeF9oZWFkID0gZmQuZmRfbGlua19vZmZzZXQ7CisJfQkJCS8qIGZvcig7OykgLT4gbG9vcCBvbiBhbGwgZnJhbWVzICovCisKKyNpZmRlZiBERUJVR19SWF9JTkZPCisJaWYgKG5yZWFwZWQgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHd2X3JlY2VpdmUoKTogcmVhcGVkICVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBucmVhcGVkKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHX1JYX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X3JlY2VpdmUoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKiogUEFDS0VUIFRSQU5TTUlTU0lPTiAqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIHBhcnQgZGVhbHMgd2l0aCBzZW5kaW5nIHBhY2tldHMgdGhyb3VnaCB0aGUgV2F2ZUxBTi4KKyAqCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoaXMgcm91dGluZSBmaWxscyBpbiB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXJzIGFuZCBtZW1vcnkKKyAqIGxvY2F0aW9ucyBvbiB0aGUgV2F2ZUxBTiBjYXJkIGFuZCBzdGFydHMgdGhlIGNhcmQgb2ZmIG9uCisgKiB0aGUgdHJhbnNtaXQuCisgKgorICogVGhlIHByaW5jaXBsZToKKyAqIEVhY2ggYmxvY2sgY29udGFpbnMgYSB0cmFuc21pdCBjb21tYW5kLCBhIE5PUCBjb21tYW5kLAorICogYSB0cmFuc21pdCBibG9jayBkZXNjcmlwdG9yIGFuZCBhIGJ1ZmZlci4KKyAqIFRoZSBDVSByZWFkIHRoZSB0cmFuc21pdCBibG9jayB3aGljaCBwb2ludCB0byB0aGUgdGJkLAorICogcmVhZCB0aGUgdGJkIGFuZCB0aGUgY29udGVudCBvZiB0aGUgYnVmZmVyLgorICogV2hlbiBpdCBoYXMgZmluaXNoIHdpdGggaXQsIGl0IGdvZXMgdG8gdGhlIG5leHQgY29tbWFuZAorICogd2hpY2ggaW4gb3VyIGNhc2UgaXMgdGhlIE5PUC4gVGhlIE5PUCBwb2ludHMgb24gaXRzZWxmLAorICogc28gdGhlIENVIHN0b3AgaGVyZS4KKyAqIFdoZW4gd2UgYWRkIHRoZSBuZXh0IGJsb2NrLCB3ZSBtb2RpZnkgdGhlIHByZXZpb3VzIG5vcAorICogdG8gbWFrZSBpdCBwb2ludCBvbiB0aGUgbmV3IHR4IGNvbW1hbmQuCisgKiBTaW1wbGUsIGlzbid0IGl0ID8KKyAqCisgKiAoY2FsbGVkIGluIHdhdmVsYW5fcGFja2V0X3htaXQoKSkKKyAqLworc3RhdGljIGlubGluZSBpbnQgd3ZfcGFja2V0X3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCB2b2lkICpidWYsIHNob3J0IGxlbmd0aCkKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1bnNpZ25lZCBzaG9ydCB0eGJsb2NrOworCXVuc2lnbmVkIHNob3J0IHR4cHJlZDsKKwl1bnNpZ25lZCBzaG9ydCB0eF9hZGRyOworCXVuc2lnbmVkIHNob3J0IG5vcF9hZGRyOworCXVuc2lnbmVkIHNob3J0IHRiZF9hZGRyOworCXVuc2lnbmVkIHNob3J0IGJ1Zl9hZGRyOworCWFjX3R4X3QgdHg7CisJYWNfbm9wX3Qgbm9wOworCXRiZF90IHRiZDsKKwlpbnQgY2xlbiA9IGxlbmd0aDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisjaWZkZWYgREVCVUdfVFhfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfcGFja2V0X3dyaXRlKCVkKVxuIiwgZGV2LT5uYW1lLAorCSAgICAgICBsZW5ndGgpOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayBub3RoaW5nIGJhZCBoYXMgaGFwcGVuZWQgKi8KKwlpZiAobHAtPnR4X25faW5fdXNlID09IChOVFhCTE9DS1MgLSAxKSkgeworI2lmZGVmIERFQlVHX1RYX0VSUk9SCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiB3dl9wYWNrZXRfd3JpdGUoKTogVHggcXVldWUgZnVsbC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBDYWxjdWxhdGUgYWRkcmVzc2VzIG9mIG5leHQgYmxvY2sgYW5kIHByZXZpb3VzIGJsb2NrLiAqLworCXR4YmxvY2sgPSBscC0+dHhfZmlyc3RfZnJlZTsKKwl0eHByZWQgPSB0eGJsb2NrIC0gVFhCTE9DS1o7CisJaWYgKHR4cHJlZCA8IE9GRlNFVF9DVSkKKwkJdHhwcmVkICs9IE5UWEJMT0NLUyAqIFRYQkxPQ0taOworCWxwLT50eF9maXJzdF9mcmVlICs9IFRYQkxPQ0taOworCWlmIChscC0+dHhfZmlyc3RfZnJlZSA+PSBPRkZTRVRfQ1UgKyBOVFhCTE9DS1MgKiBUWEJMT0NLWikKKwkJbHAtPnR4X2ZpcnN0X2ZyZWUgLT0gTlRYQkxPQ0tTICogVFhCTE9DS1o7CisKKwlscC0+dHhfbl9pbl91c2UrKzsKKworCS8qIENhbGN1bGF0ZSBhZGRyZXNzZXMgb2YgdGhlIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgYmxvY2suICovCisJdHhfYWRkciA9IHR4YmxvY2s7CisJbm9wX2FkZHIgPSB0eF9hZGRyICsgc2l6ZW9mKHR4KTsKKwl0YmRfYWRkciA9IG5vcF9hZGRyICsgc2l6ZW9mKG5vcCk7CisJYnVmX2FkZHIgPSB0YmRfYWRkciArIHNpemVvZih0YmQpOworCisJLyoKKwkgKiBUcmFuc21pdCBjb21tYW5kCisJICovCisJdHgudHhfaC5hY19zdGF0dXMgPSAwOworCW9icmFtX3dyaXRlKGlvYWRkciwgdG9mZihhY190eF90LCB0eF9hZGRyLCB0eF9oLmFjX3N0YXR1cyksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmdHgudHhfaC5hY19zdGF0dXMsCisJCSAgICBzaXplb2YodHgudHhfaC5hY19zdGF0dXMpKTsKKworCS8qCisJICogTk9QIGNvbW1hbmQKKwkgKi8KKwlub3Aubm9wX2guYWNfc3RhdHVzID0gMDsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHRvZmYoYWNfbm9wX3QsIG5vcF9hZGRyLCBub3BfaC5hY19zdGF0dXMpLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJm5vcC5ub3BfaC5hY19zdGF0dXMsCisJCSAgICBzaXplb2Yobm9wLm5vcF9oLmFjX3N0YXR1cykpOworCW5vcC5ub3BfaC5hY19saW5rID0gbm9wX2FkZHI7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCB0b2ZmKGFjX25vcF90LCBub3BfYWRkciwgbm9wX2guYWNfbGluayksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmbm9wLm5vcF9oLmFjX2xpbmssCisJCSAgICBzaXplb2Yobm9wLm5vcF9oLmFjX2xpbmspKTsKKworCS8qCisJICogVHJhbnNtaXQgYnVmZmVyIGRlc2NyaXB0b3IKKwkgKi8KKwl0YmQudGJkX3N0YXR1cyA9IFRCRF9TVEFUVVNfRU9GIHwgKFRCRF9TVEFUVVNfQUNOVCAmIGNsZW4pOworCXRiZC50YmRfbmV4dF9iZF9vZmZzZXQgPSBJODI1ODZOVUxMOworCXRiZC50YmRfYnVmbCA9IGJ1Zl9hZGRyOworCXRiZC50YmRfYnVmaCA9IDA7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCB0YmRfYWRkciwgKHVuc2lnbmVkIGNoYXIgKikgJnRiZCwgc2l6ZW9mKHRiZCkpOworCisJLyoKKwkgKiBEYXRhCisJICovCisJb2JyYW1fd3JpdGUoaW9hZGRyLCBidWZfYWRkciwgYnVmLCBsZW5ndGgpOworCisJLyoKKwkgKiBPdmVyd3JpdGUgdGhlIHByZWRlY2Vzc29yIE5PUCBsaW5rCisJICogc28gdGhhdCBpdCBwb2ludHMgdG8gdGhpcyB0eGJsb2NrLgorCSAqLworCW5vcF9hZGRyID0gdHhwcmVkICsgc2l6ZW9mKHR4KTsKKwlub3Aubm9wX2guYWNfc3RhdHVzID0gMDsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHRvZmYoYWNfbm9wX3QsIG5vcF9hZGRyLCBub3BfaC5hY19zdGF0dXMpLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJm5vcC5ub3BfaC5hY19zdGF0dXMsCisJCSAgICBzaXplb2Yobm9wLm5vcF9oLmFjX3N0YXR1cykpOworCW5vcC5ub3BfaC5hY19saW5rID0gdHhibG9jazsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHRvZmYoYWNfbm9wX3QsIG5vcF9hZGRyLCBub3BfaC5hY19saW5rKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZub3Aubm9wX2guYWNfbGluaywKKwkJICAgIHNpemVvZihub3Aubm9wX2guYWNfbGluaykpOworCisJLyogTWFrZSBzdXJlIHRoZSB3YXRjaGRvZyB3aWxsIGtlZXAgcXVpZXQgZm9yIGEgd2hpbGUgKi8KKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCS8qIEtlZXAgc3RhdHMgdXAgdG8gZGF0ZS4gKi8KKwlscC0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuZ3RoOworCisJaWYgKGxwLT50eF9maXJzdF9pbl91c2UgPT0gSTgyNTg2TlVMTCkKKwkJbHAtPnR4X2ZpcnN0X2luX3VzZSA9IHR4YmxvY2s7CisKKwlpZiAobHAtPnR4X25faW5fdXNlIDwgTlRYQkxPQ0tTIC0gMSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisjaWZkZWYgREVCVUdfVFhfSU5GTworCXd2X3BhY2tldF9pbmZvKCh1OCAqKSBidWYsIGxlbmd0aCwgZGV2LT5uYW1lLAorCQkgICAgICAgInd2X3BhY2tldF93cml0ZSIpOworI2VuZGlmCQkJCS8qIERFQlVHX1RYX0lORk8gKi8KKworI2lmZGVmIERFQlVHX1RYX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X3BhY2tldF93cml0ZSgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiB3ZSB3YW50IHRvIHNlbmQgYSBwYWNrZXQgKE5FVDMgY2FsbGJhY2spCisgKiBJbiB0aGlzIHJvdXRpbmUsIHdlIGNoZWNrIGlmIHRoZSBoYXJ3YXJlIGlzIHJlYWR5IHRvIGFjY2VwdAorICogdGhlIHBhY2tldC4gIFdlIGFsc28gcHJldmVudCByZWVudHJhbmNlLiAgVGhlbiB3ZSBjYWxsIHRoZSBmdW5jdGlvbgorICogdG8gc2VuZCB0aGUgcGFja2V0LgorICovCitzdGF0aWMgaW50IHdhdmVsYW5fcGFja2V0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpCit7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBERUJVR19UWF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX3BhY2tldF94bWl0KDB4JVgpXG4iLCBkZXYtPm5hbWUsCisJICAgICAgICh1bnNpZ25lZCkgc2tiKTsKKyNlbmRpZgorCisJLyoKKwkgKiBCbG9jayBhIHRpbWVyLWJhc2VkIHRyYW5zbWl0IGZyb20gb3ZlcmxhcHBpbmcuCisJICogSW4gb3RoZXIgd29yZHMsIHByZXZlbnQgcmVlbnRlcmluZyB0aGlzIHJvdXRpbmUuCisJICovCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJLyogSWYgc29tZWJvZHkgaGFzIGFza2VkIHRvIHJlY29uZmlndXJlIHRoZSBjb250cm9sbGVyLCAKKwkgKiB3ZSBjYW4gZG8gaXQgbm93LgorCSAqLworCWlmIChscC0+cmVjb25maWdfODI1ODYpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQl3dl84MjU4Nl9jb25maWcoZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCS8qIENoZWNrIHRoYXQgd2UgY2FuIGNvbnRpbnVlICovCisJCWlmIChscC0+dHhfbl9pbl91c2UgPT0gKE5UWEJMT0NLUyAtIDEpKQorCQkJcmV0dXJuIDE7CisJfQorI2lmZGVmIERFQlVHX1RYX0VSUk9SCisJaWYgKHNrYi0+bmV4dCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2tiIGhhcyBuZXh0XG4iKTsKKyNlbmRpZgorCisJLyogRG8gd2UgbmVlZCBzb21lIHBhZGRpbmc/ICovCisJLyogTm90ZSA6IG9uIHdpcmVsZXNzIHRoZSBwcm9wYWdhdGlvbiB0aW1lIGlzIGluIHRoZSBvcmRlciBvZiAxdXMsCisJICogYW5kIHdlIGRvbid0IGhhdmUgdGhlIEV0aGVybmV0IHNwZWNpZmljIHJlcXVpcmVtZW50IG9mIGJlZWluZworCSAqIGFibGUgdG8gZGV0ZWN0IGNvbGxpc2lvbnMsIHRoZXJlZm9yZSBpbiB0aGVvcnkgd2UgZG9uJ3QgcmVhbGx5CisJICogbmVlZCB0byBwYWQuIEplYW4gSUkgKi8KKwlpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikgeworCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCX0KKworCS8qIFdyaXRlIHBhY2tldCBvbiB0aGUgY2FyZCAqLworCWlmKHd2X3BhY2tldF93cml0ZShkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pKQorCQlyZXR1cm4gMTsJLyogV2UgZmFpbGVkICovCisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKyNpZmRlZiBERUJVR19UWF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX3BhY2tldF94bWl0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqIEhBUkRXQVJFIENPTkZJR1VSQVRJT04gKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyBwYXJ0IGRvZXMgdGhlIHJlYWwgam9iIG9mIHN0YXJ0aW5nIGFuZCBjb25maWd1cmluZyB0aGUgaGFyZHdhcmUuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUm91dGluZSB0byBpbml0aWFsaXplIHRoZSBNb2RlbSBNYW5hZ2VtZW50IENvbnRyb2xsZXIuCisgKiAoY2FsbGVkIGJ5IHd2X2h3X3Jlc2V0KCkpCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHd2X21tY19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCXBzYV90IHBzYTsKKwltbXdfdCBtOworCWludCBjb25maWd1cmVkOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X21tY19pbml0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCS8qIFJlYWQgdGhlIHBhcmFtZXRlciBzdG9yYWdlIGFyZWEuICovCisJcHNhX3JlYWQoaW9hZGRyLCBscC0+aGFjciwgMCwgKHVuc2lnbmVkIGNoYXIgKikgJnBzYSwgc2l6ZW9mKHBzYSkpOworCisjaWZkZWYgVVNFX1BTQV9DT05GSUcKKwljb25maWd1cmVkID0gcHNhLnBzYV9jb25mX3N0YXR1cyAmIDE7CisjZWxzZQorCWNvbmZpZ3VyZWQgPSAwOworI2VuZGlmCisKKwkvKiBJcyB0aGUgUFNBIGlzIG5vdCBjb25maWd1cmVkICovCisJaWYgKCFjb25maWd1cmVkKSB7CisJCS8qIFVzZXIgd2lsbCBiZSBhYmxlIHRvIGNvbmZpZ3VyZSBOV0lEIGxhdGVyICh3aXRoIGl3Y29uZmlnKS4gKi8KKwkJcHNhLnBzYV9ud2lkWzBdID0gMDsKKwkJcHNhLnBzYV9ud2lkWzFdID0gMDsKKworCQkvKiBubyBOV0lEIGNoZWNraW5nIHNpbmNlIE5XSUQgaXMgbm90IHNldCAqLworCQlwc2EucHNhX253aWRfc2VsZWN0ID0gMDsKKworCQkvKiBEaXNhYmxlIGVuY3J5cHRpb24gKi8KKwkJcHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCA9IDA7CisKKwkJLyogU2V0IHRvIHN0YW5kYXJkIHZhbHVlczoKKwkJICogMHgwNCBmb3IgQVQsCisJCSAqIDB4MDEgZm9yIE1DQSwKKwkJICogMHgwNCBmb3IgUENNQ0lBIGFuZCAyLjAwIGNhcmQgKEFUJlQgNDA3LTAyNDY4OS9FIGRvY3VtZW50KQorCQkgKi8KKwkJaWYgKHBzYS5wc2FfY29tcF9udW1iZXIgJiAxKQorCQkJcHNhLnBzYV90aHJfcHJlX3NldCA9IDB4MDE7CisJCWVsc2UKKwkJCXBzYS5wc2FfdGhyX3ByZV9zZXQgPSAweDA0OworCQlwc2EucHNhX3F1YWxpdHlfdGhyID0gMHgwMzsKKworCQkvKiBJdCBpcyBjb25maWd1cmVkICovCisJCXBzYS5wc2FfY29uZl9zdGF0dXMgfD0gMTsKKworI2lmZGVmIFVTRV9QU0FfQ09ORklHCisJCS8qIFdyaXRlIHRoZSBwc2EuICovCisJCXBzYV93cml0ZShpb2FkZHIsIGxwLT5oYWNyLAorCQkJICAoY2hhciAqKSBwc2EucHNhX253aWQgLSAoY2hhciAqKSAmcHNhLAorCQkJICAodW5zaWduZWQgY2hhciAqKSBwc2EucHNhX253aWQsIDQpOworCQlwc2Ffd3JpdGUoaW9hZGRyLCBscC0+aGFjciwKKwkJCSAgKGNoYXIgKikgJnBzYS5wc2FfdGhyX3ByZV9zZXQgLSAoY2hhciAqKSAmcHNhLAorCQkJICAodW5zaWduZWQgY2hhciAqKSAmcHNhLnBzYV90aHJfcHJlX3NldCwgMSk7CisJCXBzYV93cml0ZShpb2FkZHIsIGxwLT5oYWNyLAorCQkJICAoY2hhciAqKSAmcHNhLnBzYV9xdWFsaXR5X3RociAtIChjaGFyICopICZwc2EsCisJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX3F1YWxpdHlfdGhyLCAxKTsKKwkJcHNhX3dyaXRlKGlvYWRkciwgbHAtPmhhY3IsCisJCQkgIChjaGFyICopICZwc2EucHNhX2NvbmZfc3RhdHVzIC0gKGNoYXIgKikgJnBzYSwKKwkJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS5wc2FfY29uZl9zdGF0dXMsIDEpOworCQkvKiB1cGRhdGUgdGhlIFdhdmVsYW4gY2hlY2tzdW0gKi8KKwkJdXBkYXRlX3BzYV9jaGVja3N1bShkZXYsIGlvYWRkciwgbHAtPmhhY3IpOworI2VuZGlmCisJfQorCisJLyogWmVybyB0aGUgbW1jIHN0cnVjdHVyZS4gKi8KKwltZW1zZXQoJm0sIDB4MDAsIHNpemVvZihtKSk7CisKKwkvKiBDb3B5IFBTQSBpbmZvIHRvIHRoZSBtbWMuICovCisJbS5tbXdfbmV0d19pZF9sID0gcHNhLnBzYV9ud2lkWzFdOworCW0ubW13X25ldHdfaWRfaCA9IHBzYS5wc2FfbndpZFswXTsKKworCWlmIChwc2EucHNhX253aWRfc2VsZWN0ICYgMSkKKwkJbS5tbXdfbG9vcHRfc2VsID0gMHgwMDsKKwllbHNlCisJCW0ubW13X2xvb3B0X3NlbCA9IE1NV19MT09QVF9TRUxfRElTX05XSUQ7CisKKwltZW1jcHkoJm0ubW13X2VuY3Jfa2V5LCAmcHNhLnBzYV9lbmNyeXB0aW9uX2tleSwKKwkgICAgICAgc2l6ZW9mKG0ubW13X2VuY3Jfa2V5KSk7CisKKwlpZiAocHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCkKKwkJbS5tbXdfZW5jcl9lbmFibGUgPQorCQkgICAgTU1XX0VOQ1JfRU5BQkxFX0VOIHwgTU1XX0VOQ1JfRU5BQkxFX01PREU7CisJZWxzZQorCQltLm1td19lbmNyX2VuYWJsZSA9IDA7CisKKwltLm1td190aHJfcHJlX3NldCA9IHBzYS5wc2FfdGhyX3ByZV9zZXQgJiAweDNGOworCW0ubW13X3F1YWxpdHlfdGhyID0gcHNhLnBzYV9xdWFsaXR5X3RociAmIDB4MEY7CisKKwkvKgorCSAqIFNldCBkZWZhdWx0IG1vZGVtIGNvbnRyb2wgcGFyYW1ldGVycy4KKwkgKiBTZWUgTkNSIGRvY3VtZW50IDQwNy0wMDI0MzI2IFJldi4gQS4KKwkgKi8KKwltLm1td19qYWJiZXJfZW5hYmxlID0gMHgwMTsKKwltLm1td19mcmVlemUgPSAwOworCW0ubW13X2FudGVuX3NlbCA9IE1NV19BTlRFTl9TRUxfQUxHX0VOOworCW0ubW13X2lmcyA9IDB4MjA7CisJbS5tbXdfbW9kX2RlbGF5ID0gMHgwNDsKKwltLm1td19qYW1fdGltZSA9IDB4Mzg7CisKKwltLm1td19kZXNfaW9faW52ZXJ0ID0gMDsKKwltLm1td19kZWNheV9wcm0gPSAwOworCW0ubW13X2RlY2F5X3VwZGF0X3BybSA9IDA7CisKKwkvKiBXcml0ZSBhbGwgaW5mbyB0byBNTUMuICovCisJbW1jX3dyaXRlKGlvYWRkciwgMCwgKHU4ICopICYgbSwgc2l6ZW9mKG0pKTsKKworCS8qIFRoZSBmb2xsb3dpbmcgY29kZSBzdGFydHMgdGhlIG1vZGVtIG9mIHRoZSAyLjAwIGZyZXF1ZW5jeQorCSAqIHNlbGVjdGFibGUgY2FyZHMgYXQgcG93ZXIgb24uICBJdCdzIG5vdCBzdHJpY3RseSBuZWVkZWQgZm9yIHRoZQorCSAqIGZvbGxvd2luZyBib290cy4KKwkgKiBUaGUgb3JpZ2luYWwgcGF0Y2ggd2FzIGJ5IEpvZSBGaW5uZXkgZm9yIHRoZSBQQ01DSUEgZHJpdmVyLCBidXQKKwkgKiBJJ3ZlIGNsZWFuZWQgaXQgdXAgYSBiaXQgYW5kIGFkZGVkIGRvY3VtZW50YXRpb24uCisJICogVGhhbmtzIHRvIExvZWtlIEJyZWRlcnZlbGQgZnJvbSBMdWNlbnQgZm9yIHRoZSBpbmZvLgorCSAqLworCisJLyogQXR0ZW1wdCB0byByZWNvZ25pc2UgMi4wMCBjYXJkcyAoMi40IEdIeiBmcmVxdWVuY3kgc2VsZWN0YWJsZSkKKwkgKiBEb2VzIGl0IHdvcmsgZm9yIGV2ZXJ5Ym9keSwgZXNwZWNpYWxseSBvbGQgY2FyZHM/ICovCisJLyogTm90ZTogV0ZSRVFTRUwgdmVyaWZpZXMgdGhhdCBpdCBpcyBhYmxlIHRvIHJlYWQgYSBzZW5zaWJsZQorCSAqIGZyZXF1ZW5jeSBmcm9tIEVFUFJPTSAoYWRkcmVzcyAweDAwKSBhbmQgdGhhdCBNTVJfRkVFX1NUQVRVU19JRAorCSAqIGlzIDB4QSAoWGlsaW54IHZlcnNpb24pIG9yIDB4QiAoQXJpYWRuZSB2ZXJzaW9uKS4KKwkgKiBNeSB0ZXN0IGlzIG1vcmUgY3J1ZGUgYnV0IGRvZXMgd29yay4gKi8KKwlpZiAoIShtbWNfaW4oaW9hZGRyLCBtbXJvZmYoMCwgbW1yX2ZlZV9zdGF0dXMpKSAmCisJICAgICAgKE1NUl9GRUVfU1RBVFVTX0RXTEQgfCBNTVJfRkVFX1NUQVRVU19CVVNZKSkpIHsKKwkJLyogV2UgbXVzdCBkb3dubG9hZCB0aGUgZnJlcXVlbmN5IHBhcmFtZXRlcnMgdG8gdGhlCisJCSAqIHN5bnRoZXNpemVycyAoZnJvbSB0aGUgRUVQUk9NIC0gYXJlYSAxKQorCQkgKiBOb3RlOiBhcyB0aGUgRUVQUk9NIGlzIGF1dG9tYXRpY2FsbHkgZGVjcmVtZW50ZWQsIHdlIHNldCB0aGUgZW5kCisJCSAqIGlmIHRoZSBhcmVhLi4uICovCisJCW0ubW13X2ZlZV9hZGRyID0gMHgwRjsKKwkJbS5tbXdfZmVlX2N0cmwgPSBNTVdfRkVFX0NUUkxfUkVBRCB8IE1NV19GRUVfQ1RSTF9EV0xEOworCQltbWNfd3JpdGUoaW9hZGRyLCAoY2hhciAqKSAmbS5tbXdfZmVlX2N0cmwgLSAoY2hhciAqKSAmbSwKKwkJCSAgKHVuc2lnbmVkIGNoYXIgKikgJm0ubW13X2ZlZV9jdHJsLCAyKTsKKworCQkvKiBXYWl0IHVudGlsIHRoZSBkb3dubG9hZCBpcyBmaW5pc2hlZC4gKi8KKwkJZmVlX3dhaXQoaW9hZGRyLCAxMDAsIDEwMCk7CisKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworCQkvKiBUaGUgZnJlcXVlbmN5IHdhcyBpbiB0aGUgbGFzdCB3b3JkIGRvd25sb2FkZWQuICovCisJCW1tY19yZWFkKGlvYWRkciwgKGNoYXIgKikgJm0ubW13X2ZlZV9kYXRhX2wgLSAoY2hhciAqKSAmbSwKKwkJCSAodW5zaWduZWQgY2hhciAqKSAmbS5tbXdfZmVlX2RhdGFfbCwgMik7CisKKwkJLyogUHJpbnQgc29tZSBpbmZvIGZvciB0aGUgdXNlci4gKi8KKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICIlczogV2F2ZUxBTiAyLjAwIHJlY29nbmlzZWQgKGZyZXF1ZW5jeSBzZWxlY3QpLiAgQ3VycmVudCBmcmVxdWVuY3kgPSAlbGRcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsCisJCSAgICAgICAoKG0uCisJCQkgbW13X2ZlZV9kYXRhX2ggPDwgNCkgfCAobS5tbXdfZmVlX2RhdGFfbCA+PiA0KSkgKgorCQkgICAgICAgNSAvIDIgKyAyNDAwMEwpOworI2VuZGlmCisKKwkJLyogV2UgbXVzdCBub3cgZG93bmxvYWQgdGhlIHBvd2VyIGFkanVzdCB2YWx1ZSAoZ2FpbikgdG8KKwkJICogdGhlIHN5bnRoZXNpemVycyAoZnJvbSB0aGUgRUVQUk9NIC0gYXJlYSA3IC0gREFDKS4gKi8KKwkJbS5tbXdfZmVlX2FkZHIgPSAweDYxOworCQltLm1td19mZWVfY3RybCA9IE1NV19GRUVfQ1RSTF9SRUFEIHwgTU1XX0ZFRV9DVFJMX0RXTEQ7CisJCW1tY193cml0ZShpb2FkZHIsIChjaGFyICopICZtLm1td19mZWVfY3RybCAtIChjaGFyICopICZtLAorCQkJICAodW5zaWduZWQgY2hhciAqKSAmbS5tbXdfZmVlX2N0cmwsIDIpOworCisJCS8qIFdhaXQgdW50aWwgdGhlIGRvd25sb2FkIGlzIGZpbmlzaGVkLiAqLworCX0KKwkvKiBpZiAyLjAwIGNhcmQgKi8KKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfbW1jX2luaXQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ29uc3RydWN0IHRoZSBmZCBhbmQgcmJkIHN0cnVjdHVyZXMuCisgKiBTdGFydCB0aGUgcmVjZWl2ZSB1bml0LgorICogKGNhbGxlZCBieSB3dl9od19yZXNldCgpKQorICovCitzdGF0aWMgaW5saW5lIGludCB3dl9ydV9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1MTYgc2NiX2NzOworCWZkX3QgZmQ7CisJcmJkX3QgcmJkOworCXUxNiByeDsKKwl1MTYgcnhfbmV4dDsKKwlpbnQgaTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9ydV9zdGFydCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlvYnJhbV9yZWFkKGlvYWRkciwgc2Nib2ZmKE9GRlNFVF9TQ0IsIHNjYl9zdGF0dXMpLAorCQkgICAodW5zaWduZWQgY2hhciAqKSAmc2NiX2NzLCBzaXplb2Yoc2NiX2NzKSk7CisJaWYgKChzY2JfY3MgJiBTQ0JfU1RfUlVTKSA9PSBTQ0JfU1RfUlVTX1JEWSkKKwkJcmV0dXJuIDA7CisKKwlscC0+cnhfaGVhZCA9IE9GRlNFVF9SVTsKKworCWZvciAoaSA9IDAsIHJ4ID0gbHAtPnJ4X2hlYWQ7IGkgPCBOUlhCTE9DS1M7IGkrKywgcnggPSByeF9uZXh0KSB7CisJCXJ4X25leHQgPQorCQkgICAgKGkgPT0gTlJYQkxPQ0tTIC0gMSkgPyBscC0+cnhfaGVhZCA6IHJ4ICsgUlhCTE9DS1o7CisKKwkJZmQuZmRfc3RhdHVzID0gMDsKKwkJZmQuZmRfY29tbWFuZCA9IChpID09IE5SWEJMT0NLUyAtIDEpID8gRkRfQ09NTUFORF9FTCA6IDA7CisJCWZkLmZkX2xpbmtfb2Zmc2V0ID0gcnhfbmV4dDsKKwkJZmQuZmRfcmJkX29mZnNldCA9IHJ4ICsgc2l6ZW9mKGZkKTsKKwkJb2JyYW1fd3JpdGUoaW9hZGRyLCByeCwgKHVuc2lnbmVkIGNoYXIgKikgJmZkLCBzaXplb2YoZmQpKTsKKworCQlyYmQucmJkX3N0YXR1cyA9IDA7CisJCXJiZC5yYmRfbmV4dF9yYmRfb2Zmc2V0ID0gSTgyNTg2TlVMTDsKKwkJcmJkLnJiZF9idWZsID0gcnggKyBzaXplb2YoZmQpICsgc2l6ZW9mKHJiZCk7CisJCXJiZC5yYmRfYnVmaCA9IDA7CisJCXJiZC5yYmRfZWxfc2l6ZSA9IFJCRF9FTCB8IChSQkRfU0laRSAmIE1BWERBVEFaKTsKKwkJb2JyYW1fd3JpdGUoaW9hZGRyLCByeCArIHNpemVvZihmZCksCisJCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJnJiZCwgc2l6ZW9mKHJiZCkpOworCisJCWxwLT5yeF9sYXN0ID0gcng7CisJfQorCisJb2JyYW1fd3JpdGUoaW9hZGRyLCBzY2JvZmYoT0ZGU0VUX1NDQiwgc2NiX3JmYV9vZmZzZXQpLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJmxwLT5yeF9oZWFkLCBzaXplb2YobHAtPnJ4X2hlYWQpKTsKKworCXNjYl9jcyA9IFNDQl9DTURfUlVDX0dPOworCW9icmFtX3dyaXRlKGlvYWRkciwgc2Nib2ZmKE9GRlNFVF9TQ0IsIHNjYl9jb21tYW5kKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZzY2JfY3MsIHNpemVvZihzY2JfY3MpKTsKKworCXNldF9jaGFuX2F0dG4oaW9hZGRyLCBscC0+aGFjcik7CisKKwlmb3IgKGkgPSAxMDAwOyBpID4gMDsgaS0tKSB7CisJCW9icmFtX3JlYWQoaW9hZGRyLCBzY2JvZmYoT0ZGU0VUX1NDQiwgc2NiX2NvbW1hbmQpLAorCQkJICAgKHVuc2lnbmVkIGNoYXIgKikgJnNjYl9jcywgc2l6ZW9mKHNjYl9jcykpOworCQlpZiAoc2NiX2NzID09IDApCisJCQlicmVhazsKKworCQl1ZGVsYXkoMTApOworCX0KKworCWlmIChpIDw9IDApIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiB3YXZlbGFuX3J1X3N0YXJ0KCk6IGJvYXJkIG5vdCBhY2NlcHRpbmcgY29tbWFuZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXJldHVybiAtMTsKKwl9CisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X3J1X3N0YXJ0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEluaXRpYWxpc2UgdGhlIHRyYW5zbWl0IGJsb2Nrcy4KKyAqIFN0YXJ0IHRoZSBjb21tYW5kIHVuaXQgZXhlY3V0aW5nIHRoZSBOT1AKKyAqIHNlbGYtbG9vcCBvZiB0aGUgZmlyc3QgdHJhbnNtaXQgYmxvY2suCisgKgorICogSGVyZSB3ZSBjcmVhdGUgdGhlIGxpc3Qgb2Ygc2VuZCBidWZmZXJzIHVzZWQgdG8gdHJhbnNtaXQgcGFja2V0cworICogYmV0d2VlbiB0aGUgUEMgYW5kIHRoZSBjb21tYW5kIHVuaXQuIEZvciBlYWNoIGJ1ZmZlciwgd2UgY3JlYXRlIGEKKyAqIGJ1ZmZlciBkZXNjcmlwdG9yIChwb2ludGluZyBvbiB0aGUgYnVmZmVyKSwgYSB0cmFuc21pdCBjb21tYW5kCisgKiAocG9pbnRpbmcgdG8gdGhlIGJ1ZmZlciBkZXNjcmlwdG9yKSBhbmQgYSBOT1AgY29tbWFuZC4KKyAqIFRoZSB0cmFuc21pdCBjb21tYW5kIGlzIGxpbmtlZCB0byB0aGUgTk9QLCBhbmQgdGhlIE5PUCB0byBpdHNlbGYuCisgKiBXaGVuIHdlIHdpbGwgaGF2ZSBmaW5pc2hlZCBleGVjdXRpbmcgdGhlIHRyYW5zbWl0IGNvbW1hbmQsIHdlIHdpbGwKKyAqIHRoZW4gbG9vcCBvbiB0aGUgTk9QLiBCeSByZWxlYXNpbmcgdGhlIE5PUCBsaW5rIHRvIGEgbmV3IGNvbW1hbmQsCisgKiB3ZSBtYXkgc2VuZCBhbm90aGVyIGJ1ZmZlci4KKyAqCisgKiAoY2FsbGVkIGJ5IHd2X2h3X3Jlc2V0KCkpCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHd2X2N1X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWludCBpOworCXUxNiB0eGJsb2NrOworCXUxNiBmaXJzdF9ub3A7CisJdTE2IHNjYl9jczsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9jdV9zdGFydCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlscC0+dHhfZmlyc3RfZnJlZSA9IE9GRlNFVF9DVTsKKwlscC0+dHhfZmlyc3RfaW5fdXNlID0gSTgyNTg2TlVMTDsKKworCWZvciAoaSA9IDAsIHR4YmxvY2sgPSBPRkZTRVRfQ1U7CisJICAgICBpIDwgTlRYQkxPQ0tTOyBpKyssIHR4YmxvY2sgKz0gVFhCTE9DS1opIHsKKwkJYWNfdHhfdCB0eDsKKwkJYWNfbm9wX3Qgbm9wOworCQl0YmRfdCB0YmQ7CisJCXVuc2lnbmVkIHNob3J0IHR4X2FkZHI7CisJCXVuc2lnbmVkIHNob3J0IG5vcF9hZGRyOworCQl1bnNpZ25lZCBzaG9ydCB0YmRfYWRkcjsKKwkJdW5zaWduZWQgc2hvcnQgYnVmX2FkZHI7CisKKwkJdHhfYWRkciA9IHR4YmxvY2s7CisJCW5vcF9hZGRyID0gdHhfYWRkciArIHNpemVvZih0eCk7CisJCXRiZF9hZGRyID0gbm9wX2FkZHIgKyBzaXplb2Yobm9wKTsKKwkJYnVmX2FkZHIgPSB0YmRfYWRkciArIHNpemVvZih0YmQpOworCisJCXR4LnR4X2guYWNfc3RhdHVzID0gMDsKKwkJdHgudHhfaC5hY19jb21tYW5kID0gYWNtZF90cmFuc21pdCB8IEFDX0NGTERfSTsKKwkJdHgudHhfaC5hY19saW5rID0gbm9wX2FkZHI7CisJCXR4LnR4X3RiZF9vZmZzZXQgPSB0YmRfYWRkcjsKKwkJb2JyYW1fd3JpdGUoaW9hZGRyLCB0eF9hZGRyLCAodW5zaWduZWQgY2hhciAqKSAmdHgsCisJCQkgICAgc2l6ZW9mKHR4KSk7CisKKwkJbm9wLm5vcF9oLmFjX3N0YXR1cyA9IDA7CisJCW5vcC5ub3BfaC5hY19jb21tYW5kID0gYWNtZF9ub3A7CisJCW5vcC5ub3BfaC5hY19saW5rID0gbm9wX2FkZHI7CisJCW9icmFtX3dyaXRlKGlvYWRkciwgbm9wX2FkZHIsICh1bnNpZ25lZCBjaGFyICopICZub3AsCisJCQkgICAgc2l6ZW9mKG5vcCkpOworCisJCXRiZC50YmRfc3RhdHVzID0gVEJEX1NUQVRVU19FT0Y7CisJCXRiZC50YmRfbmV4dF9iZF9vZmZzZXQgPSBJODI1ODZOVUxMOworCQl0YmQudGJkX2J1ZmwgPSBidWZfYWRkcjsKKwkJdGJkLnRiZF9idWZoID0gMDsKKwkJb2JyYW1fd3JpdGUoaW9hZGRyLCB0YmRfYWRkciwgKHVuc2lnbmVkIGNoYXIgKikgJnRiZCwKKwkJCSAgICBzaXplb2YodGJkKSk7CisJfQorCisJZmlyc3Rfbm9wID0KKwkgICAgT0ZGU0VUX0NVICsgKE5UWEJMT0NLUyAtIDEpICogVFhCTE9DS1ogKyBzaXplb2YoYWNfdHhfdCk7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCBzY2JvZmYoT0ZGU0VUX1NDQiwgc2NiX2NibF9vZmZzZXQpLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJmZpcnN0X25vcCwgc2l6ZW9mKGZpcnN0X25vcCkpOworCisJc2NiX2NzID0gU0NCX0NNRF9DVUNfR087CisJb2JyYW1fd3JpdGUoaW9hZGRyLCBzY2JvZmYoT0ZGU0VUX1NDQiwgc2NiX2NvbW1hbmQpLAorCQkgICAgKHVuc2lnbmVkIGNoYXIgKikgJnNjYl9jcywgc2l6ZW9mKHNjYl9jcykpOworCisJc2V0X2NoYW5fYXR0bihpb2FkZHIsIGxwLT5oYWNyKTsKKworCWZvciAoaSA9IDEwMDA7IGkgPiAwOyBpLS0pIHsKKwkJb2JyYW1fcmVhZChpb2FkZHIsIHNjYm9mZihPRkZTRVRfU0NCLCBzY2JfY29tbWFuZCksCisJCQkgICAodW5zaWduZWQgY2hhciAqKSAmc2NiX2NzLCBzaXplb2Yoc2NiX2NzKSk7CisJCWlmIChzY2JfY3MgPT0gMCkKKwkJCWJyZWFrOworCisJCXVkZWxheSgxMCk7CisJfQorCisJaWYgKGkgPD0gMCkgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHdhdmVsYW5fY3Vfc3RhcnQoKTogYm9hcmQgbm90IGFjY2VwdGluZyBjb21tYW5kLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJcmV0dXJuIC0xOworCX0KKworCWxwLT50eF9uX2luX3VzZSA9IDA7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfY3Vfc3RhcnQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIGRvZXMgYSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIG9mIHRoZSBXYXZlTEFOIAorICogY29udHJvbGxlciAoaTgyNTg2KS4KKyAqCisgKiBJdCBpbml0aWFsaXNlcyB0aGUgc2NwLCBpc2NwIGFuZCBzY2Igc3RydWN0dXJlCisgKiBUaGUgZmlyc3QgdHdvIGFyZSBqdXN0IHBvaW50ZXJzIHRvIHRoZSBuZXh0LgorICogVGhlIGxhc3Qgb25lIGlzIHVzZWQgZm9yIGJhc2ljIGNvbmZpZ3VyYXRpb24gYW5kIGZvciBiYXNpYworICogY29tbXVuaWNhdGlvbiAoaW50ZXJydXB0IHN0YXR1cykuCisgKgorICogKGNhbGxlZCBieSB3dl9od19yZXNldCgpKQorICovCitzdGF0aWMgaW5saW5lIGludCB3dl84MjU4Nl9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwlzY3BfdCBzY3A7CQkvKiBzeXN0ZW0gY29uZmlndXJhdGlvbiBwb2ludGVyICovCisJaXNjcF90IGlzY3A7CQkvKiBpbnRlcm1lZGlhdGUgc2NwICovCisJc2NiX3Qgc2NiOwkJLyogc3lzdGVtIGNvbnRyb2wgYmxvY2sgKi8KKwlhY2hfdCBjYjsJCS8qIEFjdGlvbiBjb21tYW5kIGhlYWRlciAqLworCXU4IHplcm9lc1s1MTJdOworCWludCBpOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2XzgyNTg2X3N0YXJ0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCS8qCisJICogQ2xlYXIgdGhlIG9uYm9hcmQgUkFNLgorCSAqLworCW1lbXNldCgmemVyb2VzWzBdLCAweDAwLCBzaXplb2YoemVyb2VzKSk7CisJZm9yIChpID0gMDsgaSA8IEk4MjU4Nl9NRU1aOyBpICs9IHNpemVvZih6ZXJvZXMpKQorCQlvYnJhbV93cml0ZShpb2FkZHIsIGksICZ6ZXJvZXNbMF0sIHNpemVvZih6ZXJvZXMpKTsKKworCS8qCisJICogQ29uc3RydWN0IHRoZSBjb21tYW5kIHVuaXQgc3RydWN0dXJlczoKKwkgKiBzY3AsIGlzY3AsIHNjYiwgY2IuCisJICovCisJbWVtc2V0KCZzY3AsIDB4MDAsIHNpemVvZihzY3ApKTsKKwlzY3Auc2NwX3N5c2J1cyA9IFNDUF9TWV8xNkJCVVM7CisJc2NwLnNjcF9pc2NwbCA9IE9GRlNFVF9JU0NQOworCW9icmFtX3dyaXRlKGlvYWRkciwgT0ZGU0VUX1NDUCwgKHVuc2lnbmVkIGNoYXIgKikgJnNjcCwKKwkJICAgIHNpemVvZihzY3ApKTsKKworCW1lbXNldCgmaXNjcCwgMHgwMCwgc2l6ZW9mKGlzY3ApKTsKKwlpc2NwLmlzY3BfYnVzeSA9IDE7CisJaXNjcC5pc2NwX29mZnNldCA9IE9GRlNFVF9TQ0I7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCBPRkZTRVRfSVNDUCwgKHVuc2lnbmVkIGNoYXIgKikgJmlzY3AsCisJCSAgICBzaXplb2YoaXNjcCkpOworCisJLyogT3VyIGZpcnN0IGNvbW1hbmQgaXMgdG8gcmVzZXQgdGhlIGk4MjU4Ni4gKi8KKwltZW1zZXQoJnNjYiwgMHgwMCwgc2l6ZW9mKHNjYikpOworCXNjYi5zY2JfY29tbWFuZCA9IFNDQl9DTURfUkVTRVQ7CisJc2NiLnNjYl9jYmxfb2Zmc2V0ID0gT0ZGU0VUX0NVOworCXNjYi5zY2JfcmZhX29mZnNldCA9IE9GRlNFVF9SVTsKKwlvYnJhbV93cml0ZShpb2FkZHIsIE9GRlNFVF9TQ0IsICh1bnNpZ25lZCBjaGFyICopICZzY2IsCisJCSAgICBzaXplb2Yoc2NiKSk7CisKKwlzZXRfY2hhbl9hdHRuKGlvYWRkciwgbHAtPmhhY3IpOworCisJLyogV2FpdCBmb3IgY29tbWFuZCB0byBmaW5pc2guICovCisJZm9yIChpID0gMTAwMDsgaSA+IDA7IGktLSkgeworCQlvYnJhbV9yZWFkKGlvYWRkciwgT0ZGU0VUX0lTQ1AsICh1bnNpZ25lZCBjaGFyICopICZpc2NwLAorCQkJICAgc2l6ZW9mKGlzY3ApKTsKKworCQlpZiAoaXNjcC5pc2NwX2J1c3kgPT0gKHVuc2lnbmVkIHNob3J0KSAwKQorCQkJYnJlYWs7CisKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwlpZiAoaSA8PSAwKSB7CisjaWZkZWYgREVCVUdfQ09ORklHX0VSUk9SCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlczogd3ZfODI1ODZfc3RhcnQoKTogaXNjcF9idXN5IHRpbWVvdXQuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQlyZXR1cm4gLTE7CisJfQorCisJLyogQ2hlY2sgY29tbWFuZCBjb21wbGV0aW9uLiAqLworCWZvciAoaSA9IDE1OyBpID4gMDsgaS0tKSB7CisJCW9icmFtX3JlYWQoaW9hZGRyLCBPRkZTRVRfU0NCLCAodW5zaWduZWQgY2hhciAqKSAmc2NiLAorCQkJICAgc2l6ZW9mKHNjYikpOworCisJCWlmIChzY2Iuc2NiX3N0YXR1cyA9PSAoU0NCX1NUX0NYIHwgU0NCX1NUX0NOQSkpCisJCQlicmVhazsKKworCQl1ZGVsYXkoMTApOworCX0KKworCWlmIChpIDw9IDApIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiB3dl84MjU4Nl9zdGFydCgpOiBzdGF0dXM6IGV4cGVjdGVkIDB4JTAyeCwgZ290IDB4JTAyeC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIFNDQl9TVF9DWCB8IFNDQl9TVF9DTkEsIHNjYi5zY2Jfc3RhdHVzKTsKKyNlbmRpZgorCQlyZXR1cm4gLTE7CisJfQorCisJd3ZfYWNrKGRldik7CisKKwkvKiBTZXQgdGhlIGFjdGlvbiBjb21tYW5kIGhlYWRlci4gKi8KKwltZW1zZXQoJmNiLCAweDAwLCBzaXplb2YoY2IpKTsKKwljYi5hY19jb21tYW5kID0gQUNfQ0ZMRF9FTCB8IChBQ19DRkxEX0NNRCAmIGFjbWRfZGlhZ25vc2UpOworCWNiLmFjX2xpbmsgPSBPRkZTRVRfQ1U7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCBPRkZTRVRfQ1UsICh1bnNpZ25lZCBjaGFyICopICZjYiwgc2l6ZW9mKGNiKSk7CisKKwlpZiAod3Zfc3luY2hyb25vdXNfY21kKGRldiwgImRpYWcoKSIpID09IC0xKQorCQlyZXR1cm4gLTE7CisKKwlvYnJhbV9yZWFkKGlvYWRkciwgT0ZGU0VUX0NVLCAodW5zaWduZWQgY2hhciAqKSAmY2IsIHNpemVvZihjYikpOworCWlmIChjYi5hY19zdGF0dXMgJiBBQ19TRkxEX0ZBSUwpIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiB3dl84MjU4Nl9zdGFydCgpOiBpODI1ODYgU2VsZiBUZXN0IGZhaWxlZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXJldHVybiAtMTsKKwl9CisjaWZkZWYgREVCVUdfSTgyNTg2X1NIT1cKKwl3dl9zY2Jfc2hvdyhpb2FkZHIpOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfODI1ODZfc3RhcnQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIGRvZXMgYSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIG9mIHRoZSBXYXZlTEFOCisgKiBjb250cm9sbGVyIChpODI1ODYpLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBhIHZpb2xlbnQgaGFjay4gV2UgdXNlIHRoZSBmaXJzdCBmcmVlIHRyYW5zbWl0IGJsb2NrCisgKiB0byBtYWtlIG91ciBjb25maWd1cmF0aW9uLiBJbiB0aGUgYnVmZmVyIGFyZWEsIHdlIGNyZWF0ZSB0aGUgdGhyZWUKKyAqIGNvbmZpZ3VyYXRpb24gY29tbWFuZHMgKGxpbmtlZCkuIFdlIG1ha2UgdGhlIHByZXZpb3VzIE5PUCBwb2ludCB0bworICogdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIGluc3RlYWQgb2YgdGhlIHR4IGNvbW1hbmQuIEFmdGVyLCB3ZSBnbworICogYXMgdXN1YWwgdG8gdGhlIE5PUCBjb21tYW5kLgorICogTm90ZSB0aGF0IG9ubHkgdGhlIGxhc3QgY29tbWFuZCAobWNfc2V0KSB3aWxsIGdlbmVyYXRlIGFuIGludGVycnVwdC4KKyAqCisgKiAoY2FsbGVkIGJ5IHd2X2h3X3Jlc2V0KCksIHd2XzgyNTg2X3JlY29uZmlnKCksIHdhdmVsYW5fcGFja2V0X3htaXQoKSkKKyAqLworc3RhdGljIHZvaWQgd3ZfODI1ODZfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIHNob3J0IHR4YmxvY2s7CisJdW5zaWduZWQgc2hvcnQgdHhwcmVkOworCXVuc2lnbmVkIHNob3J0IHR4X2FkZHI7CisJdW5zaWduZWQgc2hvcnQgbm9wX2FkZHI7CisJdW5zaWduZWQgc2hvcnQgdGJkX2FkZHI7CisJdW5zaWduZWQgc2hvcnQgY2ZnX2FkZHI7CisJdW5zaWduZWQgc2hvcnQgaWFzX2FkZHI7CisJdW5zaWduZWQgc2hvcnQgbWNzX2FkZHI7CisJYWNfdHhfdCB0eDsKKwlhY19ub3BfdCBub3A7CisJYWNfY2ZnX3QgY2ZnOwkJLyogQ29uZmlndXJlIGFjdGlvbiAqLworCWFjX2lhc190IGlhczsJCS8qIElBLXNldHVwIGFjdGlvbiAqLworCWFjX21jc190IG1jczsJCS8qIE11bHRpY2FzdCBzZXR1cCAqLworCXN0cnVjdCBkZXZfbWNfbGlzdCAqZG1pOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2XzgyNTg2X2NvbmZpZygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwkvKiBDaGVjayBub3RoaW5nIGJhZCBoYXMgaGFwcGVuZWQgKi8KKwlpZiAobHAtPnR4X25faW5fdXNlID09IChOVFhCTE9DS1MgLSAxKSkgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPICIlczogd3ZfODI1ODZfY29uZmlnKCk6IFR4IHF1ZXVlIGZ1bGwuXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQlyZXR1cm47CisJfQorCisJLyogQ2FsY3VsYXRlIGFkZHJlc3NlcyBvZiBuZXh0IGJsb2NrIGFuZCBwcmV2aW91cyBibG9jay4gKi8KKwl0eGJsb2NrID0gbHAtPnR4X2ZpcnN0X2ZyZWU7CisJdHhwcmVkID0gdHhibG9jayAtIFRYQkxPQ0taOworCWlmICh0eHByZWQgPCBPRkZTRVRfQ1UpCisJCXR4cHJlZCArPSBOVFhCTE9DS1MgKiBUWEJMT0NLWjsKKwlscC0+dHhfZmlyc3RfZnJlZSArPSBUWEJMT0NLWjsKKwlpZiAobHAtPnR4X2ZpcnN0X2ZyZWUgPj0gT0ZGU0VUX0NVICsgTlRYQkxPQ0tTICogVFhCTE9DS1opCisJCWxwLT50eF9maXJzdF9mcmVlIC09IE5UWEJMT0NLUyAqIFRYQkxPQ0taOworCisJbHAtPnR4X25faW5fdXNlKys7CisKKwkvKiBDYWxjdWxhdGUgYWRkcmVzc2VzIG9mIHRoZSBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGJsb2NrLiAqLworCXR4X2FkZHIgPSB0eGJsb2NrOworCW5vcF9hZGRyID0gdHhfYWRkciArIHNpemVvZih0eCk7CisJdGJkX2FkZHIgPSBub3BfYWRkciArIHNpemVvZihub3ApOworCWNmZ19hZGRyID0gdGJkX2FkZHIgKyBzaXplb2YodGJkX3QpOwkvKiBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciAqLworCWlhc19hZGRyID0gY2ZnX2FkZHIgKyBzaXplb2YoY2ZnKTsKKwltY3NfYWRkciA9IGlhc19hZGRyICsgc2l6ZW9mKGlhcyk7CisKKwkvKgorCSAqIFRyYW5zbWl0IGNvbW1hbmQKKwkgKi8KKwl0eC50eF9oLmFjX3N0YXR1cyA9IDB4RkZGRjsJLyogRmFrZSBjb21wbGV0aW9uIHZhbHVlICovCisJb2JyYW1fd3JpdGUoaW9hZGRyLCB0b2ZmKGFjX3R4X3QsIHR4X2FkZHIsIHR4X2guYWNfc3RhdHVzKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZ0eC50eF9oLmFjX3N0YXR1cywKKwkJICAgIHNpemVvZih0eC50eF9oLmFjX3N0YXR1cykpOworCisJLyoKKwkgKiBOT1AgY29tbWFuZAorCSAqLworCW5vcC5ub3BfaC5hY19zdGF0dXMgPSAwOworCW9icmFtX3dyaXRlKGlvYWRkciwgdG9mZihhY19ub3BfdCwgbm9wX2FkZHIsIG5vcF9oLmFjX3N0YXR1cyksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmbm9wLm5vcF9oLmFjX3N0YXR1cywKKwkJICAgIHNpemVvZihub3Aubm9wX2guYWNfc3RhdHVzKSk7CisJbm9wLm5vcF9oLmFjX2xpbmsgPSBub3BfYWRkcjsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHRvZmYoYWNfbm9wX3QsIG5vcF9hZGRyLCBub3BfaC5hY19saW5rKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZub3Aubm9wX2guYWNfbGluaywKKwkJICAgIHNpemVvZihub3Aubm9wX2guYWNfbGluaykpOworCisJLyogQ3JlYXRlIGEgY29uZmlndXJlIGFjdGlvbi4gKi8KKwltZW1zZXQoJmNmZywgMHgwMCwgc2l6ZW9mKGNmZykpOworCisJLyoKKwkgKiBGb3IgTGludXggd2UgaW52ZXJ0IEFDX0NGR19BTE9DKCkgc28gYXMgdG8gY29uZm9ybQorCSAqIHRvIHRoZSB3YXkgdGhhdCBuZXQgcGFja2V0cyByZWFjaCB1cyBmcm9tIGFib3ZlLgorCSAqIChTZWUgYWxzbyBhY190eF90LikKKwkgKgorCSAqIFVwZGF0ZWQgZnJvbSBXYXZlbGFuIE1hbnVhbCBXQ0lOMDg1QgorCSAqLworCWNmZy5jZmdfYnl0ZV9jbnQgPQorCSAgICBBQ19DRkdfQllURV9DTlQoc2l6ZW9mKGFjX2NmZ190KSAtIHNpemVvZihhY2hfdCkpOworCWNmZy5jZmdfZmlmb2xpbSA9IEFDX0NGR19GSUZPTElNKDQpOworCWNmZy5jZmdfYnl0ZTggPSBBQ19DRkdfU0FWX0JGKDEpIHwgQUNfQ0ZHX1NSRFkoMCk7CisJY2ZnLmNmZ19ieXRlOSA9IEFDX0NGR19FTFBCQ0soMCkgfAorCSAgICBBQ19DRkdfSUxQQkNLKDApIHwKKwkgICAgQUNfQ0ZHX1BSRUxFTihBQ19DRkdfUExFTl8yKSB8CisJICAgIEFDX0NGR19BTE9DKDEpIHwgQUNfQ0ZHX0FERFJMRU4oV0FWRUxBTl9BRERSX1NJWkUpOworCWNmZy5jZmdfYnl0ZTEwID0gQUNfQ0ZHX0JPRk1FVCgxKSB8CisJICAgIEFDX0NGR19BQ1IoNikgfCBBQ19DRkdfTElOUFJJTygwKTsKKwljZmcuY2ZnX2lmcyA9IDB4MjA7CisJY2ZnLmNmZ19zbG90bCA9IDB4MEM7CisJY2ZnLmNmZ19ieXRlMTMgPSBBQ19DRkdfUkVUUllOVU0oMTUpIHwgQUNfQ0ZHX1NMVFRNSEkoMCk7CisJY2ZnLmNmZ19ieXRlMTQgPSBBQ19DRkdfRkxHUEFEKDApIHwKKwkgICAgQUNfQ0ZHX0JUU1RGKDApIHwKKwkgICAgQUNfQ0ZHX0NSQzE2KDApIHwKKwkgICAgQUNfQ0ZHX05DUkMoMCkgfAorCSAgICBBQ19DRkdfVE5DUlMoMSkgfAorCSAgICBBQ19DRkdfTUFOQ0goMCkgfAorCSAgICBBQ19DRkdfQkNESVMoMCkgfCBBQ19DRkdfUFJNKGxwLT5wcm9taXNjdW91cyk7CisJY2ZnLmNmZ19ieXRlMTUgPSBBQ19DRkdfSUNEUygwKSB8CisJICAgIEFDX0NGR19DRFRGKDApIHwgQUNfQ0ZHX0lDU1MoMCkgfCBBQ19DRkdfQ1NURigwKTsKKy8qCisgIGNmZy5jZmdfbWluX2ZybV9sZW4gPSBBQ19DRkdfTU5GUk0oNjQpOworKi8KKwljZmcuY2ZnX21pbl9mcm1fbGVuID0gQUNfQ0ZHX01ORlJNKDgpOworCisJY2ZnLmNmZ19oLmFjX2NvbW1hbmQgPSAoQUNfQ0ZMRF9DTUQgJiBhY21kX2NvbmZpZ3VyZSk7CisJY2ZnLmNmZ19oLmFjX2xpbmsgPSBpYXNfYWRkcjsKKwlvYnJhbV93cml0ZShpb2FkZHIsIGNmZ19hZGRyLCAodW5zaWduZWQgY2hhciAqKSAmY2ZnLCBzaXplb2YoY2ZnKSk7CisKKwkvKiBTZXQgdXAgdGhlIE1BQyBhZGRyZXNzICovCisJbWVtc2V0KCZpYXMsIDB4MDAsIHNpemVvZihpYXMpKTsKKwlpYXMuaWFzX2guYWNfY29tbWFuZCA9IChBQ19DRkxEX0NNRCAmIGFjbWRfaWFfc2V0dXApOworCWlhcy5pYXNfaC5hY19saW5rID0gbWNzX2FkZHI7CisJbWVtY3B5KCZpYXMuaWFzX2FkZHJbMF0sICh1bnNpZ25lZCBjaGFyICopICZkZXYtPmRldl9hZGRyWzBdLAorCSAgICAgICBzaXplb2YoaWFzLmlhc19hZGRyKSk7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCBpYXNfYWRkciwgKHVuc2lnbmVkIGNoYXIgKikgJmlhcywgc2l6ZW9mKGlhcykpOworCisJLyogSW5pdGlhbGl6ZSBhZGFwdGVyJ3MgRXRoZXJuZXQgbXVsdGljYXN0IGFkZHJlc3NlcyAqLworCW1lbXNldCgmbWNzLCAweDAwLCBzaXplb2YobWNzKSk7CisJbWNzLm1jc19oLmFjX2NvbW1hbmQgPSBBQ19DRkxEX0kgfCAoQUNfQ0ZMRF9DTUQgJiBhY21kX21jX3NldHVwKTsKKwltY3MubWNzX2guYWNfbGluayA9IG5vcF9hZGRyOworCW1jcy5tY3NfY250ID0gV0FWRUxBTl9BRERSX1NJWkUgKiBscC0+bWNfY291bnQ7CisJb2JyYW1fd3JpdGUoaW9hZGRyLCBtY3NfYWRkciwgKHVuc2lnbmVkIGNoYXIgKikgJm1jcywgc2l6ZW9mKG1jcykpOworCisJLyogQW55IGFkZHJlc3MgdG8gc2V0PyAqLworCWlmIChscC0+bWNfY291bnQpIHsKKwkJZm9yIChkbWkgPSBkZXYtPm1jX2xpc3Q7IGRtaTsgZG1pID0gZG1pLT5uZXh0KQorCQkJb3V0c3coUElPUDEoaW9hZGRyKSwgKHUxNiAqKSBkbWktPmRtaV9hZGRyLAorCQkJICAgICAgV0FWRUxBTl9BRERSX1NJWkUgPj4gMSk7CisKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIiVzOiB3dl84MjU4Nl9jb25maWcoKTogc2V0ICVkIG11bHRpY2FzdCBhZGRyZXNzZXM6XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBscC0+bWNfY291bnQpOworCQlmb3IgKGRtaSA9IGRldi0+bWNfbGlzdDsgZG1pOyBkbWkgPSBkbWktPm5leHQpCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICIgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCQkgICAgICAgZG1pLT5kbWlfYWRkclswXSwgZG1pLT5kbWlfYWRkclsxXSwKKwkJCSAgICAgICBkbWktPmRtaV9hZGRyWzJdLCBkbWktPmRtaV9hZGRyWzNdLAorCQkJICAgICAgIGRtaS0+ZG1pX2FkZHJbNF0sIGRtaS0+ZG1pX2FkZHJbNV0pOworI2VuZGlmCisJfQorCisJLyoKKwkgKiBPdmVyd3JpdGUgdGhlIHByZWRlY2Vzc29yIE5PUCBsaW5rCisJICogc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGNvbmZpZ3VyZSBhY3Rpb24uCisJICovCisJbm9wX2FkZHIgPSB0eHByZWQgKyBzaXplb2YodHgpOworCW5vcC5ub3BfaC5hY19zdGF0dXMgPSAwOworCW9icmFtX3dyaXRlKGlvYWRkciwgdG9mZihhY19ub3BfdCwgbm9wX2FkZHIsIG5vcF9oLmFjX3N0YXR1cyksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmbm9wLm5vcF9oLmFjX3N0YXR1cywKKwkJICAgIHNpemVvZihub3Aubm9wX2guYWNfc3RhdHVzKSk7CisJbm9wLm5vcF9oLmFjX2xpbmsgPSBjZmdfYWRkcjsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHRvZmYoYWNfbm9wX3QsIG5vcF9hZGRyLCBub3BfaC5hY19saW5rKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZub3Aubm9wX2guYWNfbGluaywKKwkJICAgIHNpemVvZihub3Aubm9wX2guYWNfbGluaykpOworCisJLyogSm9iIGRvbmUsIGNsZWFyIHRoZSBmbGFnICovCisJbHAtPnJlY29uZmlnXzgyNTg2ID0gMDsKKworCWlmIChscC0+dHhfZmlyc3RfaW5fdXNlID09IEk4MjU4Nk5VTEwpCisJCWxwLT50eF9maXJzdF9pbl91c2UgPSB0eGJsb2NrOworCisJaWYgKGxwLT50eF9uX2luX3VzZSA9PSAoTlRYQkxPQ0tTIC0gMSkpCisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl84MjU4Nl9jb25maWcoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lLCBjYWxsZWQgYnkgd2F2ZWxhbl9jbG9zZSgpLCBncmFjZWZ1bGx5IHN0b3BzIHRoZSAKKyAqIFdhdmVMQU4gY29udHJvbGxlciAoaTgyNTg2KS4KKyAqIChjYWxsZWQgYnkgd2F2ZWxhbl9jbG9zZSgpKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd3ZfODI1ODZfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1MTYgc2NiX2NtZDsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl84MjU4Nl9zdG9wKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCS8qIFN1c3BlbmQgYm90aCBjb21tYW5kIHVuaXQgYW5kIHJlY2VpdmUgdW5pdC4gKi8KKwlzY2JfY21kID0KKwkgICAgKFNDQl9DTURfQ1VDICYgU0NCX0NNRF9DVUNfU1VTKSB8IChTQ0JfQ01EX1JVQyAmCisJCQkJCSAgICAgICBTQ0JfQ01EX1JVQ19TVVMpOworCW9icmFtX3dyaXRlKGlvYWRkciwgc2Nib2ZmKE9GRlNFVF9TQ0IsIHNjYl9jb21tYW5kKSwKKwkJICAgICh1bnNpZ25lZCBjaGFyICopICZzY2JfY21kLCBzaXplb2Yoc2NiX2NtZCkpOworCXNldF9jaGFuX2F0dG4oaW9hZGRyLCBscC0+aGFjcik7CisKKwkvKiBObyBtb3JlIGludGVycnVwdHMgKi8KKwl3dl9pbnRzX29mZihkZXYpOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2XzgyNTg2X3N0b3AoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVG90YWxseSByZXNldCB0aGUgV2F2ZUxBTiBhbmQgcmVzdGFydCBpdC4KKyAqIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKKyAqCTEuIEEgcG93ZXIgcmVzZXQgKHJlc2V0IERNQSkKKyAqCTIuIEluaXRpYWxpemUgdGhlIHJhZGlvIG1vZGVtICh1c2luZyB3dl9tbWNfaW5pdCkKKyAqCTMuIFJlc2V0ICYgQ29uZmlndXJlIExBTiBjb250cm9sbGVyICh1c2luZyB3dl84MjU4Nl9zdGFydCkKKyAqCTQuIFN0YXJ0IHRoZSBMQU4gY29udHJvbGxlcidzIGNvbW1hbmQgdW5pdAorICoJNS4gU3RhcnQgdGhlIExBTiBjb250cm9sbGVyJ3MgcmVjZWl2ZSB1bml0CisgKiAoY2FsbGVkIGJ5IHdhdmVsYW5faW50ZXJydXB0KCksIHdhdmVsYW5fd2F0Y2hkb2coKSAmIHdhdmVsYW5fb3BlbigpKQorICovCitzdGF0aWMgaW50IHd2X2h3X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQoreworCW5ldF9sb2NhbCAqbHAgPSAobmV0X2xvY2FsICopIGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X2h3X3Jlc2V0KGRldj0weCV4KVxuIiwgZGV2LT5uYW1lLAorCSAgICAgICAodW5zaWduZWQgaW50KSBkZXYpOworI2VuZGlmCisKKwkvKiBJbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHJlc2V0cyBkb25lLiAqLworCWxwLT5ucmVzZXRzKys7CisKKwl3dl9oYWNyX3Jlc2V0KGlvYWRkcik7CisJbHAtPmhhY3IgPSBIQUNSX0RFRkFVTFQ7CisKKwlpZiAoKHd2X21tY19pbml0KGRldikgPCAwKSB8fCAod3ZfODI1ODZfc3RhcnQoZGV2KSA8IDApKQorCQlyZXR1cm4gLTE7CisKKwkvKiBFbmFibGUgdGhlIGNhcmQgdG8gc2VuZCBpbnRlcnJ1cHRzLiAqLworCXd2X2ludHNfb24oZGV2KTsKKworCS8qIFN0YXJ0IGNhcmQgZnVuY3Rpb25zICovCisJaWYgKHd2X2N1X3N0YXJ0KGRldikgPCAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBTZXR1cCB0aGUgY29udHJvbGxlciBhbmQgcGFyYW1ldGVycyAqLworCXd2XzgyNTg2X2NvbmZpZyhkZXYpOworCisJLyogRmluaXNoIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgcmVjZWl2ZSB1bml0ICovCisJaWYgKHd2X3J1X3N0YXJ0KGRldikgPCAwKQorCQlyZXR1cm4gLTE7CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfaHdfcmVzZXQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ2hlY2sgaWYgdGhlcmUgaXMgYSBXYXZlTEFOIGF0IHRoZSBzcGVjaWZpYyBiYXNlIGFkZHJlc3MuCisgKiBBcyBhIHNpZGUgZWZmZWN0LCB0aGlzIHJlYWRzIHRoZSBNQUMgYWRkcmVzcy4KKyAqIChjYWxsZWQgaW4gd2F2ZWxhbl9wcm9iZSgpIGFuZCBpbml0X21vZHVsZSgpKQorICovCitzdGF0aWMgaW50IHd2X2NoZWNrX2lvYWRkcih1bnNpZ25lZCBsb25nIGlvYWRkciwgdTggKiBtYWMpCit7CisJaW50IGk7CQkJLyogTG9vcCBjb3VudGVyICovCisKKwkvKiBDaGVjayBpZiB0aGUgYmFzZSBhZGRyZXNzIGlmIGF2YWlsYWJsZS4gKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYWRkciwgc2l6ZW9mKGhhX3QpLCAid2F2ZWxhbiBwcm9iZSIpKQorCQlyZXR1cm4gLUVCVVNZOwkJLyogaW9hZGRyIGFscmVhZHkgdXNlZCAqLworCisJLyogUmVzZXQgaG9zdCBpbnRlcmZhY2UgKi8KKwl3dl9oYWNyX3Jlc2V0KGlvYWRkcik7CisKKwkvKiBSZWFkIHRoZSBNQUMgYWRkcmVzcyBmcm9tIHRoZSBwYXJhbWV0ZXIgc3RvcmFnZSBhcmVhLiAqLworCXBzYV9yZWFkKGlvYWRkciwgSEFDUl9ERUZBVUxULCBwc2FvZmYoMCwgcHNhX3VuaXZfbWFjX2FkZHIpLAorCQkgbWFjLCA2KTsKKworCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgc2l6ZW9mKGhhX3QpKTsKKworCS8qCisJICogQ2hlY2sgdGhlIGZpcnN0IHRocmVlIG9jdGV0cyBvZiB0aGUgYWRkcmVzcyBmb3IgdGhlIG1hbnVmYWN0dXJlcidzIGNvZGUuCisJICogTm90ZTogaWYgdGhpcyBjYW4ndCBmaW5kIHlvdXIgV2F2ZUxBTiBjYXJkLCB5b3UndmUgZ290IGEKKwkgKiBub24tTkNSL0FUJlQvTHVjZW50IElTQSBjYXJkLiAgU2VlIHdhdmVsYW4ucC5oIGZvciBkZXRhaWwgb24KKwkgKiBob3cgdG8gY29uZmlndXJlIHlvdXIgY2FyZC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihNQUNfQUREUkVTU0VTKSAvIHNpemVvZihjaGFyKSAvIDMpOyBpKyspCisJCWlmICgobWFjWzBdID09IE1BQ19BRERSRVNTRVNbaV1bMF0pICYmCisJCSAgICAobWFjWzFdID09IE1BQ19BRERSRVNTRVNbaV1bMV0pICYmCisJCSAgICAobWFjWzJdID09IE1BQ19BRERSRVNTRVNbaV1bMl0pKQorCQkJcmV0dXJuIDA7CisKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworCXByaW50ayhLRVJOX1dBUk5JTkcKKwkgICAgICAgIldhdmVMQU4gKDB4JTNYKTogeW91ciBNQUMgYWRkcmVzcyBtaWdodCBiZSAlMDJYOiUwMlg6JTAyWC5cbiIsCisJICAgICAgIGlvYWRkciwgbWFjWzBdLCBtYWNbMV0sIG1hY1syXSk7CisjZW5kaWYKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBJTlRFUlJVUFQgSEFORExJTkcgKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBXYXZlTEFOIGNhcmQuIFRoaXMKKyAqIHJvdXRpbmUgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXI6IAorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2F2ZWxhbl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXVuc2lnbmVkIGxvbmcgaW9hZGRyOworCW5ldF9sb2NhbCAqbHA7CisJdTE2IGhhc3I7CisJdTE2IHN0YXR1czsKKwl1MTYgYWNrX2NtZDsKKworCWRldiA9IGRldl9pZDsKKworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX2ludGVycnVwdCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKwlscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OworCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0lORk8KKwkvKiBDaGVjayBzdGF0ZSBvZiBvdXIgc3BpbmxvY2sgKi8KKwlpZihzcGluX2lzX2xvY2tlZCgmbHAtPnNwaW5sb2NrKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICIlczogd2F2ZWxhbl9pbnRlcnJ1cHQoKTogc3BpbmxvY2sgaXMgYWxyZWFkeSBsb2NrZWQgISEhXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogUHJldmVudCByZWVudHJhbmN5LiBXZSBuZWVkIHRvIGRvIHRoYXQgYmVjYXVzZSB3ZSBtYXkgaGF2ZQorCSAqIG11bHRpcGxlIGludGVycnVwdCBoYW5kbGVyIHJ1bm5pbmcgY29uY3VycmVudGx5LgorCSAqIEl0IGlzIHNhZmUgYmVjYXVzZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBiZWZvcmUgYWNxdWlyaW5nCisJICogdGhlIHNwaW5sb2NrLiAqLworCXNwaW5fbG9jaygmbHAtPnNwaW5sb2NrKTsKKworCS8qIFdlIGFsd2F5cyBoYWQgc3B1cmlvdXMgaW50ZXJydXB0cyBhdCBzdGFydHVwLCBidXQgbGF0ZWx5IEkKKwkgKiBzYXcgdGhlbSBjb21taW5nICpiZXR3ZWVuKiB0aGUgcmVxdWVzdF9pcnEoKSBhbmQgdGhlCisJICogc3Bpbl9sb2NrX2lycXNhdmUoKSBpbiB3YXZlbGFuX29wZW4oKSwgc28gdGhlIHNwaW5sb2NrCisJICogcHJvdGVjdGlvbiBpcyBubyBlbm91Z2guCisJICogU28sIHdlIGFsc28gY2hlY2sgbHAtPmhhY3IgdGhhdCB3aWxsIHRlbGwgdXMgaXMgd2UgZW5hYmxlZAorCSAqIGlycXMgb3Igbm90IChzZWUgd3ZfaW50c19vbigpKS4KKwkgKiBXZSBjYW4ndCB1c2UgbmV0aWZfcnVubmluZyhkZXYpIGJlY2F1c2Ugd2UgZGVwZW5kIG9uIHRoZQorCSAqIHByb3BlciBwcm9jZXNzaW5nIG9mIHRoZSBpcnEgZ2VuZXJhdGVkIGR1cmluZyB0aGUgY29uZmlnLiAqLworCisJLyogV2hpY2ggaW50ZXJydXB0IGl0IGlzID8gKi8KKwloYXNyID0gaGFzcl9yZWFkKGlvYWRkcik7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTworCXByaW50ayhLRVJOX0lORk8KKwkgICAgICAgIiVzOiB3YXZlbGFuX2ludGVycnVwdCgpOiBoYXNyIDB4JTA0eDsgaGFjciAweCUwNHguXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGhhc3IsIGxwLT5oYWNyKTsKKyNlbmRpZgorCisJLyogQ2hlY2sgbW9kZW0gaW50ZXJydXB0ICovCisJaWYgKChoYXNyICYgSEFTUl9NTUNfSU5UUikgJiYgKGxwLT5oYWNyICYgSEFDUl9NTUNfSU5UX0VOQUJMRSkpIHsKKwkJdTggZGNlX3N0YXR1czsKKworCQkvKgorCQkgKiBJbnRlcnJ1cHQgZnJvbSB0aGUgbW9kZW0gbWFuYWdlbWVudCBjb250cm9sbGVyLgorCQkgKiBUaGlzIHdpbGwgY2xlYXIgaXQgLS0gaWdub3JlZCBmb3Igbm93LgorCQkgKi8KKwkJbW1jX3JlYWQoaW9hZGRyLCBtbXJvZmYoMCwgbW1yX2RjZV9zdGF0dXMpLCAmZGNlX3N0YXR1cywKKwkJCSBzaXplb2YoZGNlX3N0YXR1cykpOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0VSUk9SCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlczogd2F2ZWxhbl9pbnRlcnJ1cHQoKTogdW5leHBlY3RlZCBtbWMgaW50ZXJydXB0OiBzdGF0dXMgMHglMDR4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgZGNlX3N0YXR1cyk7CisjZW5kaWYKKwl9CisKKwkvKiBDaGVjayBpZiBub3QgY29udHJvbGxlciBpbnRlcnJ1cHQgKi8KKwlpZiAoKChoYXNyICYgSEFTUl84MjU4Nl9JTlRSKSA9PSAwKSB8fAorCSAgICAoKGxwLT5oYWNyICYgSEFDUl84MjU4Nl9JTlRfRU5BQkxFKSA9PSAwKSkgeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHdhdmVsYW5faW50ZXJydXB0KCk6IGludGVycnVwdCBub3QgY29taW5nIGZyb20gaTgyNTg2IC0gaGFzciAweCUwNHguXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBoYXNyKTsKKyNlbmRpZgorCQlzcGluX3VubG9jayAoJmxwLT5zcGlubG9jayk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwkvKiBSZWFkIGludGVycnVwdCBkYXRhLiAqLworCW9icmFtX3JlYWQoaW9hZGRyLCBzY2JvZmYoT0ZGU0VUX1NDQiwgc2NiX3N0YXR1cyksCisJCSAgICh1bnNpZ25lZCBjaGFyICopICZzdGF0dXMsIHNpemVvZihzdGF0dXMpKTsKKworCS8qCisJICogQWNrbm93bGVkZ2UgdGhlIGludGVycnVwdChzKS4KKwkgKi8KKwlhY2tfY21kID0gc3RhdHVzICYgU0NCX1NUX0lOVDsKKwlvYnJhbV93cml0ZShpb2FkZHIsIHNjYm9mZihPRkZTRVRfU0NCLCBzY2JfY29tbWFuZCksCisJCSAgICAodW5zaWduZWQgY2hhciAqKSAmYWNrX2NtZCwgc2l6ZW9mKGFja19jbWQpKTsKKwlzZXRfY2hhbl9hdHRuKGlvYWRkciwgbHAtPmhhY3IpOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0lORk8KKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHdhdmVsYW5faW50ZXJydXB0KCk6IHN0YXR1cyAweCUwNHguXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisjZW5kaWYKKworCS8qIENvbW1hbmQgY29tcGxldGVkLiAqLworCWlmICgoc3RhdHVzICYgU0NCX1NUX0NYKSA9PSBTQ0JfU1RfQ1gpIHsKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIiVzOiB3YXZlbGFuX2ludGVycnVwdCgpOiBjb21tYW5kIGNvbXBsZXRlZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXd2X2NvbXBsZXRlKGRldiwgaW9hZGRyLCBscCk7CisJfQorCisJLyogRnJhbWUgcmVjZWl2ZWQuICovCisJaWYgKChzdGF0dXMgJiBTQ0JfU1RfRlIpID09IFNDQl9TVF9GUikgeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9JTkZPCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6IHdhdmVsYW5faW50ZXJydXB0KCk6IHJlY2VpdmVkIHBhY2tldC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXd2X3JlY2VpdmUoZGV2KTsKKwl9CisKKwkvKiBDaGVjayB0aGUgc3RhdGUgb2YgdGhlIGNvbW1hbmQgdW5pdC4gKi8KKwlpZiAoKChzdGF0dXMgJiBTQ0JfU1RfQ05BKSA9PSBTQ0JfU1RfQ05BKSB8fAorCSAgICAoKChzdGF0dXMgJiBTQ0JfU1RfQ1VTKSAhPSBTQ0JfU1RfQ1VTX0FDVFYpICYmCisJICAgICAobmV0aWZfcnVubmluZyhkZXYpKSkpIHsKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfRVJST1IKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIiVzOiB3YXZlbGFuX2ludGVycnVwdCgpOiBDVSBpbmFjdGl2ZSAtLSByZXN0YXJ0aW5nXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQl3dl9od19yZXNldChkZXYpOworCX0KKworCS8qIENoZWNrIHRoZSBzdGF0ZSBvZiB0aGUgY29tbWFuZCB1bml0LiAqLworCWlmICgoKHN0YXR1cyAmIFNDQl9TVF9STlIpID09IFNDQl9TVF9STlIpIHx8CisJICAgICgoKHN0YXR1cyAmIFNDQl9TVF9SVVMpICE9IFNDQl9TVF9SVVNfUkRZKSAmJgorCSAgICAgKG5ldGlmX3J1bm5pbmcoZGV2KSkpKSB7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0VSUk9SCisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICIlczogd2F2ZWxhbl9pbnRlcnJ1cHQoKTogUlUgbm90IHJlYWR5IC0tIHJlc3RhcnRpbmdcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXd2X2h3X3Jlc2V0KGRldik7CisJfQorCisJLyogUmVsZWFzZSBzcGlubG9jayAqLworCXNwaW5fdW5sb2NrICgmbHAtPnNwaW5sb2NrKTsKKworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX2ludGVycnVwdCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2F0Y2hkb2c6IHdoZW4gd2Ugc3RhcnQgYSB0cmFuc21pc3Npb24sIGEgdGltZXIgaXMgc2V0IGZvciB1cyBpbiB0aGUKKyAqIGtlcm5lbC4gIElmIHRoZSB0cmFuc21pc3Npb24gY29tcGxldGVzLCB0aGlzIHRpbWVyIGlzIGRpc2FibGVkLiBJZgorICogdGhlIHRpbWVyIGV4cGlyZXMsIHdlIGFyZSBjYWxsZWQgYW5kIHdlIHRyeSB0byB1bmxvY2sgdGhlIGhhcmR3YXJlLgorICovCitzdGF0aWMgdm9pZCB3YXZlbGFuX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworCW5ldF9sb2NhbCAqCWxwID0gKG5ldF9sb2NhbCAqKWRldi0+cHJpdjsKKwl1X2xvbmcJCWlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdW5zaWduZWQgaW50CW5yZWFwZWQ7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d2F2ZWxhbl93YXRjaGRvZygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfRVJST1IKKwlwcmludGsoS0VSTl9JTkZPICIlczogd2F2ZWxhbl93YXRjaGRvZzogd2F0Y2hkb2cgdGltZXIgZXhwaXJlZFxuIiwKKwkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJLyogQ2hlY2sgdGhhdCB3ZSBjYW1lIGhlcmUgZm9yIHNvbWV0aGluZyAqLworCWlmIChscC0+dHhfbl9pbl91c2UgPD0gMCkgeworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJLyogVHJ5IHRvIHNlZSBpZiBzb21lIGJ1ZmZlcnMgYXJlIG5vdCBmcmVlIChpbiBjYXNlIHdlIG1pc3NlZAorCSAqIGFuIGludGVycnVwdCAqLworCW5yZWFwZWQgPSB3dl9jb21wbGV0ZShkZXYsIGlvYWRkciwgbHApOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0lORk8KKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAiJXM6IHdhdmVsYW5fd2F0Y2hkb2coKTogJWQgcmVhcGVkLCAlZCByZW1haW4uXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIG5yZWFwZWQsIGxwLT50eF9uX2luX3VzZSk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX1BTQV9TSE9XCisJeworCQlwc2FfdCBwc2E7CisJCXBzYV9yZWFkKGRldiwgMCwgKHVuc2lnbmVkIGNoYXIgKikgJnBzYSwgc2l6ZW9mKHBzYSkpOworCQl3dl9wc2Ffc2hvdygmcHNhKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBERUJVR19NTUNfU0hPVworCXd2X21tY19zaG93KGRldik7CisjZW5kaWYKKyNpZmRlZiBERUJVR19JODI1ODZfU0hPVworCXd2X2N1X3Nob3coZGV2KTsKKyNlbmRpZgorCisJLyogSWYgbm8gYnVmZmVyIGhhcyBiZWVuIGZyZWVkICovCisJaWYgKG5yZWFwZWQgPT0gMCkgeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHdhdmVsYW5fd2F0Y2hkb2coKTogY2xlYW51cCBmYWlsZWQsIHRyeWluZyByZXNldFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJd3ZfaHdfcmVzZXQoZGV2KTsKKwl9CisKKwkvKiBBdCB0aGlzIHBvaW50LCB3ZSBzaG91bGQgaGF2ZSBzb21lIGZyZWUgVHggYnVmZmVyIDstKSAqLworCWlmIChscC0+dHhfbl9pbl91c2UgPCBOVFhCTE9DS1MgLSAxKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd2F2ZWxhbl93YXRjaGRvZygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKiogQ09ORklHVVJBVElPTiBDQUxMQkFDS1MgKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEhlcmUgYXJlIHRoZSBmdW5jdGlvbnMgY2FsbGVkIGJ5IHRoZSBMaW51eCBuZXR3b3JraW5nIGNvZGUgKE5FVDMpCisgKiBmb3IgaW5pdGlhbGl6YXRpb24sIGNvbmZpZ3VyYXRpb24gYW5kIGRlaW5zdGFsbGF0aW9ucyBvZiB0aGUgCisgKiBXYXZlTEFOIElTQSBoYXJkd2FyZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ29uZmlndXJlIGFuZCBzdGFydCB1cCB0aGUgV2F2ZUxBTiBQQ01DSUEgYWRhcHRvci4KKyAqIENhbGxlZCBieSBORVQzIHdoZW4gaXQgIm9wZW5zIiB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgaW50IHdhdmVsYW5fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKglscCA9IChuZXRfbG9jYWwgKilkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5fb3BlbihkZXY9MHgleClcbiIsIGRldi0+bmFtZSwKKwkgICAgICAgKHVuc2lnbmVkIGludCkgZGV2KTsKKyNlbmRpZgorCisJLyogQ2hlY2sgaXJxICovCisJaWYgKGRldi0+aXJxID09IDApIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHdhdmVsYW5fb3BlbigpOiBubyBJUlFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXJldHVybiAtRU5YSU87CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmd2F2ZWxhbl9pbnRlcnJ1cHQsIDAsICJXYXZlTEFOIiwgZGV2KSAhPSAwKSAKKwl7CisjaWZkZWYgREVCVUdfQ09ORklHX0VSUk9SCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB3YXZlbGFuX29wZW4oKTogaW52YWxpZCBJUlFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwlpZiAod3ZfaHdfcmVzZXQoZGV2KSAhPSAtMSkgeworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCX0gZWxzZSB7CisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHdhdmVsYW5fb3BlbigpOiBpbXBvc3NpYmxlIHRvIHN0YXJ0IHRoZSBjYXJkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fb3BlbigpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTaHV0IGRvd24gdGhlIFdhdmVMQU4gSVNBIGNhcmQuCisgKiBDYWxsZWQgYnkgTkVUMyB3aGVuIGl0ICJjbG9zZXMiIHRoZSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKK3sKKwluZXRfbG9jYWwgKmxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5fY2xvc2UoZGV2PTB4JXgpXG4iLCBkZXYtPm5hbWUsCisJICAgICAgICh1bnNpZ25lZCBpbnQpIGRldik7CisjZW5kaWYKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCS8qCisJICogRmx1c2ggdGhlIFR4IGFuZCBkaXNhYmxlIFJ4LgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwl3dl84MjU4Nl9zdG9wKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fY2xvc2UoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJvYmUgYW4gSS9PIGFkZHJlc3MsIGFuZCBpZiB0aGUgV2F2ZUxBTiBpcyB0aGVyZSBjb25maWd1cmUgdGhlCisgKiBkZXZpY2Ugc3RydWN0dXJlCisgKiAoY2FsbGVkIGJ5IHdhdmVsYW5fcHJvYmUoKSBhbmQgdmlhIGluaXRfbW9kdWxlKCkpLgorICovCitzdGF0aWMgaW50IF9faW5pdCB3YXZlbGFuX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCBpb2FkZHIpCit7CisJdTggaXJxX21hc2s7CisJaW50IGlycTsKKwluZXRfbG9jYWwgKmxwOworCW1hY19hZGRyIG1hYzsKKwlpbnQgZXJyOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIHNpemVvZihoYV90KSwgIndhdmVsYW4iKSkKKwkJcmV0dXJuIC1FQUREUklOVVNFOworCisJZXJyID0gd3ZfY2hlY2tfaW9hZGRyKGlvYWRkciwgbWFjKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCW1lbWNweShkZXYtPmRldl9hZGRyLCBtYWMsIDYpOworCisJZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7CisKKyNpZmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQorCXByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX2NvbmZpZyhkZXY9MHgleCwgaW9hZGRyPTB4JWx4KVxuIiwKKwkgICAgICAgZGV2LT5uYW1lLCAodW5zaWduZWQgaW50KSBkZXYsIGlvYWRkcik7CisjZW5kaWYKKworCS8qIENoZWNrIElSUSBhcmd1bWVudCBvbiBjb21tYW5kIGxpbmUuICovCisJaWYgKGRldi0+aXJxICE9IDApIHsKKwkJaXJxX21hc2sgPSB3dl9pcnFfdG9fcHNhKGRldi0+aXJxKTsKKworCQlpZiAoaXJxX21hc2sgPT0gMCkgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogd2F2ZWxhbl9jb25maWcoKTogaW52YWxpZCBJUlEgJWQgaWdub3JlZC5cbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBkZXYtPmlycSk7CisjZW5kaWYKKwkJCWRldi0+aXJxID0gMDsKKwkJfSBlbHNlIHsKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCSAgICAgICAiJXM6IHdhdmVsYW5fY29uZmlnKCk6IGNoYW5naW5nIElSUSB0byAlZFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKyNlbmRpZgorCQkJcHNhX3dyaXRlKGlvYWRkciwgSEFDUl9ERUZBVUxULAorCQkJCSAgcHNhb2ZmKDAsIHBzYV9pbnRfcmVxX25vKSwgJmlycV9tYXNrLCAxKTsKKwkJCS8qIHVwZGF0ZSB0aGUgV2F2ZWxhbiBjaGVja3N1bSAqLworCQkJdXBkYXRlX3BzYV9jaGVja3N1bShkZXYsIGlvYWRkciwgSEFDUl9ERUZBVUxUKTsKKwkJCXd2X2hhY3JfcmVzZXQoaW9hZGRyKTsKKwkJfQorCX0KKworCXBzYV9yZWFkKGlvYWRkciwgSEFDUl9ERUZBVUxULCBwc2FvZmYoMCwgcHNhX2ludF9yZXFfbm8pLAorCQkgJmlycV9tYXNrLCAxKTsKKwlpZiAoKGlycSA9IHd2X3BzYV90b19pcnEoaXJxX21hc2spKSA9PSAtMSkgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiJXM6IHdhdmVsYW5fY29uZmlnKCk6IGNvdWxkIG5vdCB3YXZlbGFuX21hcF9pcnEoJWQpLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgaXJxX21hc2spOworI2VuZGlmCisJCWVyciA9IC1FQUdBSU47CisJCWdvdG8gb3V0OworCX0KKworCWRldi0+aXJxID0gaXJxOworCisJZGV2LT5tZW1fc3RhcnQgPSAweDAwMDA7CisJZGV2LT5tZW1fZW5kID0gMHgwMDAwOworCWRldi0+aWZfcG9ydCA9IDA7CisKKwkvKiBJbml0aWFsaXplIGRldmljZSBzdHJ1Y3R1cmVzICovCisJbWVtc2V0KGRldi0+cHJpdiwgMCwgc2l6ZW9mKG5ldF9sb2NhbCkpOworCWxwID0gKG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CisKKwkvKiBCYWNrIGxpbmsgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUuICovCisJbHAtPmRldiA9IGRldjsKKwkvKiBBZGQgdGhlIGRldmljZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5rZWQgbGlzdC4gKi8KKwlscC0+bmV4dCA9IHdhdmVsYW5fbGlzdDsKKwl3YXZlbGFuX2xpc3QgPSBscDsKKworCWxwLT5oYWNyID0gSEFDUl9ERUZBVUxUOworCisJLyogTXVsdGljYXN0IHN0dWZmICovCisJbHAtPnByb21pc2N1b3VzID0gMDsKKwlscC0+bWNfY291bnQgPSAwOworCisJLyogSW5pdCBzcGlubG9jayAqLworCXNwaW5fbG9ja19pbml0KCZscC0+c3BpbmxvY2spOworCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCWRldi0+b3BlbiA9IHdhdmVsYW5fb3BlbjsKKwlkZXYtPnN0b3AgPSB3YXZlbGFuX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gd2F2ZWxhbl9wYWNrZXRfeG1pdDsKKwlkZXYtPmdldF9zdGF0cyA9IHdhdmVsYW5fZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJndhdmVsYW5fc2V0X211bHRpY2FzdF9saXN0OworICAgICAgICBkZXYtPnR4X3RpbWVvdXQJCT0gJndhdmVsYW5fd2F0Y2hkb2c7CisgICAgICAgIGRldi0+d2F0Y2hkb2dfdGltZW8JPSBXQVRDSERPR19KSUZGSUVTOworI2lmZGVmIFNFVF9NQUNfQUREUkVTUworCWRldi0+c2V0X21hY19hZGRyZXNzID0gJndhdmVsYW5fc2V0X21hY19hZGRyZXNzOworI2VuZGlmCQkJCS8qIFNFVF9NQUNfQUREUkVTUyAqLworCisjaWZkZWYgV0lSRUxFU1NfRVhUCQkvKiBpZiB3aXJlbGVzcyBleHRlbnNpb24gZXhpc3RzIGluIHRoZSBrZXJuZWwgKi8KKwlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJndhdmVsYW5faGFuZGxlcl9kZWY7CisJbHAtPndpcmVsZXNzX2RhdGEuc3B5X2RhdGEgPSAmbHAtPnNweV9kYXRhOworCWRldi0+d2lyZWxlc3NfZGF0YSA9ICZscC0+d2lyZWxlc3NfZGF0YTsKKyNlbmRpZgorCisJZGV2LT5tdHUgPSBXQVZFTEFOX01UVTsKKworCS8qIERpc3BsYXkgbmljZSBpbmZvcm1hdGlvbi4gKi8KKwl3dl9pbml0X2luZm8oZGV2KTsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fY29uZmlnKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK291dDoKKwlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIHNpemVvZihoYV90KSk7CisJcmV0dXJuIGVycjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIENoZWNrIGZvciBhIG5ldHdvcmsgYWRhcHRvciBvZiB0aGlzIHR5cGUuICBSZXR1cm4gJzAnIGlmZiBvbmUgCisgKiBleGlzdHMuICBUaGVyZSBzZWVtIHRvIGJlIGRpZmZlcmVudCBpbnRlcnByZXRhdGlvbnMgb2YKKyAqIHRoZSBpbml0aWFsIHZhbHVlIG9mIGRldi0+YmFzZV9hZGRyLgorICogV2UgZm9sbG93IHRoZSBleGFtcGxlIGluIGRyaXZlcnMvbmV0L25lLmMuCisgKiAoY2FsbGVkIGluICJTcGFjZS5jIikKKyAqLworc3RydWN0IG5ldF9kZXZpY2UgKiBfX2luaXQgd2F2ZWxhbl9wcm9iZShpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXNob3J0IGJhc2VfYWRkcjsKKwlpbnQgZGVmX2lycTsKKwlpbnQgaTsKKwlpbnQgciA9IDA7CisKKyNpZmRlZglTVFJVQ1RfQ0hFQ0sKKwlpZiAod3Zfc3RydWN0X2NoZWNrKCkgIT0gKGNoYXIgKikgTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiJXM6IHdhdmVsYW5fcHJvYmUoKTogc3RydWN0dXJlL2NvbXBpbGVyIGJvdGNoOiBcIiVzXCJcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHd2X3N0cnVjdF9jaGVjaygpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorI2VuZGlmCQkJCS8qIFNUUlVDVF9DSEVDSyAqLworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKG5ldF9sb2NhbCkpOworCWlmICghZGV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKKwluZXRkZXZfYm9vdF9zZXR1cF9jaGVjayhkZXYpOworCWJhc2VfYWRkciA9IGRldi0+YmFzZV9hZGRyOworCWRlZl9pcnEgPSBkZXYtPmlycTsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgIiVzOiAtPndhdmVsYW5fcHJvYmUoZGV2PSVwIChiYXNlX2FkZHI9MHgleCkpXG4iLAorCSAgICAgICBkZXYtPm5hbWUsIGRldiwgKHVuc2lnbmVkIGludCkgZGV2LT5iYXNlX2FkZHIpOworI2VuZGlmCisKKwkvKiBEb24ndCBwcm9iZSBhdCBhbGwuICovCisJaWYgKGJhc2VfYWRkciA8IDApIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiVzOiB3YXZlbGFuX3Byb2JlKCk6IGludmFsaWQgYmFzZSBhZGRyZXNzXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQlyID0gLUVOWElPOworCX0gZWxzZSBpZiAoYmFzZV9hZGRyID4gMHgxMDApIHsgLyogQ2hlY2sgYSBzaW5nbGUgc3BlY2lmaWVkIGxvY2F0aW9uLiAqLworCQlyID0gd2F2ZWxhbl9jb25maWcoZGV2LCBiYXNlX2FkZHIpOworI2lmZGVmIERFQlVHX0NPTkZJR19JTkZPCisJCWlmIChyICE9IDApCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICIlczogd2F2ZWxhbl9wcm9iZSgpOiBubyBkZXZpY2UgYXQgc3BlY2lmaWVkIGJhc2UgYWRkcmVzcyAoMHglWCkgb3IgYWRkcmVzcyBhbHJlYWR5IGluIHVzZVxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUsIGJhc2VfYWRkcik7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX3Byb2JlKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwl9IGVsc2UgeyAvKiBTY2FuIGFsbCBwb3NzaWJsZSBhZGRyZXNzZXMgb2YgdGhlIFdhdmVMQU4gaGFyZHdhcmUuICovCisJCWZvciAoaSA9IDA7IGkgPCBORUxTKGlvYmFzZSk7IGkrKykgeworCQkJZGV2LT5pcnEgPSBkZWZfaXJxOworCQkJaWYgKHdhdmVsYW5fY29uZmlnKGRldiwgaW9iYXNlW2ldKSA9PSAwKSB7CisjaWZkZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiJXM6IDwtd2F2ZWxhbl9wcm9iZSgpXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworI2VuZGlmCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGkgPT0gTkVMUyhpb2Jhc2UpKQorCQkJciA9IC1FTk9ERVY7CisJfQorCWlmIChyKSAKKwkJZ290byBvdXQ7CisJciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyKQorCQlnb3RvIG91dDE7CisJcmV0dXJuIGRldjsKK291dDE6CisJcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIHNpemVvZihoYV90KSk7CisJd2F2ZWxhbl9saXN0ID0gd2F2ZWxhbl9saXN0LT5uZXh0Oworb3V0OgorCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIEVSUl9QVFIocik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTU9EVUxFICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBNb2R1bGUgZW50cnkgcG9pbnQ6IGluc2VydGlvbiBhbmQgcmVtb3ZhbAorICovCisKKyNpZmRlZglNT0RVTEUKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBJbnNlcnRpb24gb2YgdGhlIG1vZHVsZQorICogSSdtIG5vdyBxdWl0ZSBwcm91ZCBvZiB0aGUgbXVsdGktZGV2aWNlIHN1cHBvcnQuCisgKi8KK2ludCBpbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXQgPSAtRUlPOwkJLyogUmV0dXJuIGVycm9yIGlmIG5vIGNhcmRzIGZvdW5kICovCisJaW50IGk7CisKKyNpZmRlZiBERUJVR19NT0RVTEVfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiLT4gaW5pdF9tb2R1bGUoKVxuIik7CisjZW5kaWYKKworCS8qIElmIHByb2JpbmcgaXMgYXNrZWQgKi8KKwlpZiAoaW9bMF0gPT0gMCkgeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUgorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiV2F2ZUxBTiBpbml0X21vZHVsZSgpOiBkb2luZyBkZXZpY2UgcHJvYmluZyAoYmFkICEpXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIlNwZWNpZnkgYmFzZSBhZGRyZXNzZXMgd2hpbGUgbG9hZGluZyBtb2R1bGUgdG8gY29ycmVjdCB0aGUgcHJvYmxlbVxuIik7CisjZW5kaWYKKworCQkvKiBDb3B5IHRoZSBiYXNpYyBzZXQgb2YgYWRkcmVzcyB0byBiZSBwcm9iZWQuICovCisJCWZvciAoaSA9IDA7IGkgPCBORUxTKGlvYmFzZSk7IGkrKykKKwkJCWlvW2ldID0gaW9iYXNlW2ldOworCX0KKworCisJLyogTG9vcCBvbiBhbGwgcG9zc2libGUgYmFzZSBhZGRyZXNzZXMuICovCisJaSA9IC0xOworCXdoaWxlICgoaW9bKytpXSAhPSAwKSAmJiAoaSA8IE5FTFMoaW8pKSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKG5ldF9sb2NhbCkpOworCQlpZiAoIWRldikKKwkJCWJyZWFrOworCQlpZiAobmFtZVtpXSkKKwkJCXN0cmNweShkZXYtPm5hbWUsIG5hbWVbaV0pOwkvKiBDb3B5IG5hbWUgKi8KKwkJZGV2LT5iYXNlX2FkZHIgPSBpb1tpXTsKKwkJZGV2LT5pcnEgPSBpcnFbaV07CisKKwkJLyogQ2hlY2sgaWYgdGhlcmUgaXMgc29tZXRoaW5nIGF0IHRoaXMgYmFzZSBhZGRyZXNzLiAqLworCQlpZiAod2F2ZWxhbl9jb25maWcoZGV2LCBpb1tpXSkgPT0gMCkgeworCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpICE9IDApIHsKKwkJCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgc2l6ZW9mKGhhX3QpKTsKKwkJCQl3YXZlbGFuX2xpc3QgPSB3YXZlbGFuX2xpc3QtPm5leHQ7CisJCQl9IGVsc2UgeworCQkJCXJldCA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwl9CisKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1IKKwlpZiAoIXdhdmVsYW5fbGlzdCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIldhdmVMQU4gaW5pdF9tb2R1bGUoKTogbm8gZGV2aWNlIGZvdW5kXG4iKTsKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfTU9EVUxFX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIjwtIGluaXRfbW9kdWxlKClcbiIpOworI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJlbW92YWwgb2YgdGhlIG1vZHVsZQorICovCit2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCit7CisjaWZkZWYgREVCVUdfTU9EVUxFX1RSQUNFCisJcHJpbnRrKEtFUk5fREVCVUcgIi0+IGNsZWFudXBfbW9kdWxlKClcbiIpOworI2VuZGlmCisKKwkvKiBMb29wIG9uIGFsbCBkZXZpY2VzIGFuZCByZWxlYXNlIHRoZW0uICovCisJd2hpbGUgKHdhdmVsYW5fbGlzdCkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2F2ZWxhbl9saXN0LT5kZXY7CisKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIiVzOiBjbGVhbnVwX21vZHVsZSgpOiByZW1vdmluZyBkZXZpY2UgYXQgMHgleFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgKHVuc2lnbmVkIGludCkgZGV2KTsKKyNlbmRpZgorCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBzaXplb2YoaGFfdCkpOworCQl3YXZlbGFuX2xpc3QgPSB3YXZlbGFuX2xpc3QtPm5leHQ7CisKKwkJZnJlZV9uZXRkZXYoZGV2KTsKKwl9CisKKyNpZmRlZiBERUJVR19NT0RVTEVfVFJBQ0UKKwlwcmludGsoS0VSTl9ERUJVRyAiPC0gY2xlYW51cF9tb2R1bGUoKVxuIik7CisjZW5kaWYKK30KKyNlbmRpZgkJCQkvKiBNT0RVTEUgKi8KK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQKKyAqIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqIFRoaXMgc29mdHdhcmUgd2FzIGRldmVsb3BlZCBhcyBhIGNvbXBvbmVudCBvZiB0aGUKKyAqIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0uCisgKiBJdCBpcyBiYXNlZCBvbiBvdGhlciBkZXZpY2UgZHJpdmVycyBhbmQgaW5mb3JtYXRpb24KKyAqIGVpdGhlciB3cml0dGVuIG9yIHN1cHBsaWVkIGJ5OgorICoJQWpheSBCYWtyZSAoYmFrcmVAcGF1bC5ydXRnZXJzLmVkdSksCisgKglEb25hbGQgQmVja2VyIChiZWNrZXJAc2N5bGQuY29tKSwKKyAqCUxvZWtlIEJyZWRlcnZlbGQgKExvZWtlLkJyZWRlcnZlbGRAVXRyZWNodC5OQ1IuY29tKSwKKyAqCUFuZGVycyBLbGVtZXRzIChrbGVtZXRzQGl0Lmt0aC5zZSksCisgKglWbGFkaW1pciBWLiBLb2xwYWtvdiAod0BzdGllci5rb2VuaWcucnUpLAorICoJTWFyYyBNZWVydGVucyAoTWFyYy5NZWVydGVuc0BVdHJlY2h0Lk5DUi5jb20pLAorICoJUGF1bGluZSBNaWRkZWxpbmsgKG1pZGRlbGluQHBvbHl3YXJlLmlhZi5ubCksCisgKglSb2JlcnQgTW9ycmlzIChydG1AZGFzLmhhcnZhcmQuZWR1KSwKKyAqCUplYW4gVG91cnJpbGhlcyAoanRAaHBsYi5ocGwuaHAuY29tKSwKKyAqCUdpcmlzaCBXZWxsaW5nICh3ZWxsaW5nQHBhdWwucnV0Z2Vycy5lZHUpLAorICoKKyAqIFRoYW5rcyBnbyBhbHNvIHRvOgorICoJSmFtZXMgQXNodG9uIChqYWExMDFAc3lzZW5nLmFudS5lZHUuYXUpLAorICoJQWxhbiBDb3ggKGFsYW5AcmVkaGF0LmNvbSksCisgKglBbGxhbiBDcmVpZ2h0b24gKGFsbGFuY0Bjcy51c3lkLmVkdS5hdSksCisgKglNYXR0aGV3IEdlaWVyIChtYXR0aGV3QGNzLnVzeWQuZWR1LmF1KSwKKyAqCVJlbW8gZGkgR2lvdmFubmkgKHJlbW9AY3MudXN5ZC5lZHUuYXUpLAorICoJRWNraGFyZCBHcmFoIChncmFoQHdyY3MxLnVyei51bmktd3VwcGVydGFsLmRlKSwKKyAqCVZpcHVsIEd1cHRhICh2Z3VwdGFAY3MuYmluZ2hhbXRvbi5lZHUpLAorICoJTWFyayBIYWdhbiAobWhhZ2FuQHd0Y3Bvc3QuZGF5dG9ub2guTkNSLkNPTSksCisgKglUaW0gTmljaG9sc29uICh0aW1AY3MudXN5ZC5lZHUuYXUpLAorICoJSWFuIFBhcmtpbiAoaWFuQGNzLnVzeWQuZWR1LmF1KSwKKyAqCUpvaG4gUm9zZW5iZXJnIChqb2huckBjcy51c3lkLmVkdS5hdSksCisgKglHZW9yZ2UgUm9zc2kgKGdlb3JnZUBwaG0uZ292LmF1KSwKKyAqCUFydGh1ciBTY290dCAoYXJ0aHVyQGNzLnVzeWQuZWR1LmF1KSwKKyAqCVBldGVyIFN0b3JleSwKKyAqIGZvciB0aGVpciBhc3Npc3RhbmNlIGFuZCBhZHZpY2UuCisgKgorICogUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMsIHVwZGF0ZXMsIGNvbW1lbnRzIHRvOgorICoKKyAqIEJydWNlIEphbnNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtYWlsOiAgYnJ1Y2VAY3MudXN5ZC5lZHUuYXUKKyAqIEJhc3NlciBEZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UgICAgICAgICAgIFBob25lOiAgKzYxLTItOTM1MS0zNDIzCisgKiBVbml2ZXJzaXR5IG9mIFN5ZG5leSwgTi5TLlcuLCAyMDA2LCBBVVNUUkFMSUEgICBGYXg6ICAgICs2MS0yLTkzNTEtMzgzOAorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcxNzJjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4uaApAQCAtMCwwICsxLDM3MCBAQAorLyoKKyAqCVdhdmVMQU4gSVNBIGRyaXZlcgorICoKKyAqCQlKZWFuIElJIC0gSFBMQiAnOTYKKyAqCisgKiBSZW9yZ2FuaXNhdGlvbiBhbmQgZXh0ZW5zaW9uIG9mIHRoZSBkcml2ZXIuCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgZm9sbG93cy4gU2VlIHdhdmVsYW4ucC5oIGZvciBkZXRhaWxzLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIGZvciB0aGUgV2F2ZUxBTiBoYXJkd2FyZS4gTm90ZSB0aGF0CisgKiB0aGUgV2F2ZUxBTiBJU0EgaW5jbHVkZXMgYSBpODI1ODYgY29udHJvbGxlciAoc2VlIGRlZmluaXRpb25zIGluCisgKiBmaWxlIGk4MjU4Ni5oKS4KKyAqCisgKiBUaGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIElTQSBoYXJkd2FyZSBhbmQgdGhlIFBDTUNJQSBvbmUgaXMKKyAqIHRoZSBFdGhlcm5ldCBjb250cm9sbGVyIChpODI1ODYgaW5zdGVhZCBvZiBpODI1OTMpLgorICogVGhlIGk4MjU4NiBhbGxvd3MgbXVsdGlwbGUgdHJhbnNtaXQgYnVmZmVycy4gIFRoZSBQU0EgbmVlZHMgdG8gYmUgYWNjZXNzZWQKKyAqIHRocm91Z2ggdGhlIGhvc3QgaW50ZXJmYWNlLgorICovCisKKyNpZm5kZWYgX1dBVkVMQU5fSAorI2RlZmluZQlfV0FWRUxBTl9ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBNQUdJQyBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGV0ZWN0aW9uIG9mIHRoZSBXYXZlTEFOIGNhcmQgaXMgZG9uZSBieSByZWFkaW5nIHRoZSBNQUMKKyAqIGFkZHJlc3MgZnJvbSB0aGUgY2FyZCBhbmQgY2hlY2tpbmcgaXQuICBJZiB5b3UgaGF2ZSBhIG5vbi1BVCZUCisgKiBwcm9kdWN0IChPRU0sIGxpa2UgREVDIFJvYW1BYm91dCwgRGlnaXRhbCBPY2Vhbiwgb3IgRXBzb24pLAorICogeW91IG1pZ2h0IG5lZWQgdG8gbW9kaWZ5IHRoaXMgcGFydCB0byBhY2NvbW1vZGF0ZSB5b3VyIGhhcmR3YXJlLgorICovCitzdGF0aWMgY29uc3QgY2hhcglNQUNfQUREUkVTU0VTW11bM10gPQoreworICB7IDB4MDgsIDB4MDAsIDB4MEUgfSwJCS8qIEFUJlQgV2F2ZUxBTiAoc3RhbmRhcmQpICYgREVDIFJvYW1BYm91dCAqLworICB7IDB4MDgsIDB4MDAsIDB4NkEgfSwJCS8qIEFUJlQgV2F2ZUxBTiAoYWx0ZXJuYXRlKSAqLworICB7IDB4MDAsIDB4MDAsIDB4RTEgfSwJCS8qIEhpdGFjaGkgV2F2ZWxhbiAqLworICB7IDB4MDAsIDB4NjAsIDB4MUQgfQkJLyogTHVjZW50IFdhdmVsYW4gKGFub3RoZXIgb25lKSAqLworICAvKiBBZGQgeW91ciBjYXJkIGhlcmUgYW5kIHNlbmQgbWUgdGhlIHBhdGNoISAqLworfTsKKworI2RlZmluZSBXQVZFTEFOX0FERFJfU0laRQk2CS8qIFNpemUgb2YgYSBNQUMgYWRkcmVzcyAqLworCisjZGVmaW5lIFdBVkVMQU5fTVRVCQkxNTAwCS8qIE1heGltdW0gc2l6ZSBvZiBXYXZlTEFOIHBhY2tldCAqLworCisjZGVmaW5lCU1BWERBVEFaCQkoV0FWRUxBTl9BRERSX1NJWkUgKyBXQVZFTEFOX0FERFJfU0laRSArIDIgKyBXQVZFTEFOX01UVSkKKworLyoKKyAqIENvbnN0YW50cyB1c2VkIHRvIGNvbnZlcnQgY2hhbm5lbHMgdG8gZnJlcXVlbmNpZXMKKyAqLworCisvKiBGcmVxdWVuY3kgYXZhaWxhYmxlIGluIHRoZSAyLjAgbW9kZW0sIGluIHVuaXRzIG9mIDI1MCBrSHoKKyAqIChhcyByZWFkIGluIHRoZSBvZmZzZXQgcmVnaXN0ZXIgb2YgdGhlIGRhYyBhcmVhKS4KKyAqIFVzZWQgdG8gbWFwIGNoYW5uZWwgbnVtYmVycyB1c2VkIGJ5IGB3ZnJlcXNlbCcgdG8gZnJlcXVlbmNpZXMKKyAqLworc3RhdGljIGNvbnN0IHNob3J0CWNoYW5uZWxfYmFuZHNbXSA9IHsgMHgzMCwgMHg1OCwgMHg2NCwgMHg3QSwgMHg4MCwgMHhBOCwKKwkJCQkgICAgMHhEMCwgMHhGMCwgMHhGOCwgMHgxNTAgfTsKKworLyogRnJlcXVlbmNpZXMgb2YgdGhlIDEuMCBtb2RlbSAoZml4ZWQgZnJlcXVlbmNpZXMpLgorICogVXNlIHRvIG1hcCB0aGUgUFNBIGBzdWJiYW5kJyB0byBhIGZyZXF1ZW5jeQorICogTm90ZSA6IGFsbCBmcmVxdWVuY2llcyBhcGFydCBmcm9tIHRoZSBmaXJzdCBvbmUgbmVlZCB0byBiZSBtdWx0aXBsaWVkIGJ5IDEwCisgKi8KK3N0YXRpYyBjb25zdCBpbnQJZml4ZWRfYmFuZHNbXSA9IHsgOTE1ZTYsIDIuNDI1ZTgsIDIuNDZlOCwgMi40ODRlOCwgMi40MzA1ZTggfTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogUEMgSU5URVJGQUNFICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBIb3N0IEFkYXB0b3Igc3RydWN0dXJlLgorICogKGJhc2UgaXMgYm9hcmQgcG9ydCBhZGRyZXNzKS4KKyAqLwordHlwZWRlZiB1bmlvbiBoYWNzX3UJaGFjc191OwordW5pb24gaGFjc191Cit7CisJdW5zaWduZWQgc2hvcnQJaHVfY29tbWFuZDsJCS8qIENvbW1hbmQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUhBQ1JfUkVTRVQJCTB4MDAwMQkvKiBSZXNldCBib2FyZCAqLworI2RlZmluZQkJSEFDUl9DQQkJCTB4MDAwMgkvKiBTZXQgQ2hhbm5lbCBBdHRlbnRpb24gZm9yIDgyNTg2ICovCisjZGVmaW5lCQlIQUNSXzE2QklUUwkJMHgwMDA0CS8qIDE2LWJpdCBvcGVyYXRpb24gKDAgPT4gOGJpdHMpICovCisjZGVmaW5lCQlIQUNSX09VVDAJCTB4MDAwOAkvKiBHZW5lcmFsIHB1cnBvc2Ugb3V0cHV0IHBpbiAwICovCisJCQkJCQkvKiBub3QgdXNlZCAtIG11c3QgYmUgMSAqLworI2RlZmluZQkJSEFDUl9PVVQxCQkweDAwMTAJLyogR2VuZXJhbCBwdXJwb3NlIG91dHB1dCBwaW4gMSAqLworCQkJCQkJLyogbm90IHVzZWQgLSBtdXN0IGJlIDEgKi8KKyNkZWZpbmUJCUhBQ1JfODI1ODZfSU5UX0VOQUJMRQkweDAwMjAJLyogRW5hYmxlIDgyNTg2IGludGVycnVwdHMgKi8KKyNkZWZpbmUJCUhBQ1JfTU1DX0lOVF9FTkFCTEUJMHgwMDQwCS8qIEVuYWJsZSBNTUMgaW50ZXJydXB0cyAqLworI2RlZmluZQkJSEFDUl9JTlRSX0NMUl9FTkFCTEUJMHgwMDgwCS8qIEVuYWJsZSBpbnRlcnJ1cHQgc3RhdHVzIHJlYWQvY2xlYXIgKi8KKwl1bnNpZ25lZCBzaG9ydAlodV9zdGF0dXM7CQkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJCUhBU1JfODI1ODZfSU5UUgkJMHgwMDAxCS8qIEludGVycnVwdCByZXF1ZXN0IGZyb20gODI1ODYgKi8KKyNkZWZpbmUJCUhBU1JfTU1DX0lOVFIJCTB4MDAwMgkvKiBJbnRlcnJ1cHQgcmVxdWVzdCBmcm9tIE1NQyAqLworI2RlZmluZQkJSEFTUl9NTUNfQlVTWQkJMHgwMDA0CS8qIE1NQyBidXN5IGluZGljYXRpb24gKi8KKyNkZWZpbmUJCUhBU1JfUFNBX0JVU1kJCTB4MDAwOAkvKiBMQU4gcGFyYW1ldGVyIHN0b3JhZ2UgYXJlYSBidXN5ICovCit9OworCit0eXBlZGVmIHN0cnVjdCBoYV90CWhhX3Q7CitzdHJ1Y3QgaGFfdAoreworCWhhY3NfdQkJaGFfY3M7CQkvKiBDb21tYW5kIGFuZCBzdGF0dXMgcmVnaXN0ZXJzICovCisjZGVmaW5lIAkJaGFfY29tbWFuZAloYV9jcy5odV9jb21tYW5kCisjZGVmaW5lIAkJaGFfc3RhdHVzCWhhX2NzLmh1X3N0YXR1cworCXVuc2lnbmVkIHNob3J0CWhhX21tY3I7CS8qIE1vZGVtIE1hbmFnZW1lbnQgQ3RybCBSZWdpc3RlciAqLworCXVuc2lnbmVkIHNob3J0CWhhX3Bpb3IwOwkvKiBQcm9ncmFtIEkvTyBBZGRyZXNzIFJlZ2lzdGVyIFBvcnQgMCAqLworCXVuc2lnbmVkIHNob3J0CWhhX3Bpb3AwOwkvKiBQcm9ncmFtIEkvTyBQb3J0IDAgKi8KKwl1bnNpZ25lZCBzaG9ydAloYV9waW9yMTsJLyogUHJvZ3JhbSBJL08gQWRkcmVzcyBSZWdpc3RlciBQb3J0IDEgKi8KKwl1bnNpZ25lZCBzaG9ydAloYV9waW9wMTsJLyogUHJvZ3JhbSBJL08gUG9ydCAxICovCisJdW5zaWduZWQgc2hvcnQJaGFfcGlvcjI7CS8qIFByb2dyYW0gSS9PIEFkZHJlc3MgUmVnaXN0ZXIgUG9ydCAyICovCisJdW5zaWduZWQgc2hvcnQJaGFfcGlvcDI7CS8qIFByb2dyYW0gSS9PIFBvcnQgMiAqLworfTsKKworI2RlZmluZSBIQV9TSVpFCQkxNgorCisjZGVmaW5lCWhvZmYocCxmKSAJKHVuc2lnbmVkIHNob3J0KSgodm9pZCAqKSgmKChoYV90ICopKCh2b2lkICopMCArIChwKSkpLT5mKSAtICh2b2lkICopMCkKKyNkZWZpbmUJSEFDUihwKQkJaG9mZihwLCBoYV9jb21tYW5kKQorI2RlZmluZQlIQVNSKHApCQlob2ZmKHAsIGhhX3N0YXR1cykKKyNkZWZpbmUJTU1DUihwKQkJaG9mZihwLCBoYV9tbWNyKQorI2RlZmluZQlQSU9SMChwKQlob2ZmKHAsIGhhX3Bpb3IwKQorI2RlZmluZQlQSU9QMChwKQlob2ZmKHAsIGhhX3Bpb3AwKQorI2RlZmluZQlQSU9SMShwKQlob2ZmKHAsIGhhX3Bpb3IxKQorI2RlZmluZQlQSU9QMShwKQlob2ZmKHAsIGhhX3Bpb3AxKQorI2RlZmluZQlQSU9SMihwKQlob2ZmKHAsIGhhX3Bpb3IyKQorI2RlZmluZQlQSU9QMihwKQlob2ZmKHAsIGhhX3Bpb3AyKQorCisvKgorICogUHJvZ3JhbSBJL08gTW9kZSBSZWdpc3RlciB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgU1RBVElDX1BJTwkJMAkvKiBNb2RlIDE6IHN0YXRpYyBtb2RlICovCisJCQkJCS8qIFJBTSBhY2Nlc3MgPz8/ICovCisjZGVmaW5lIEFVVE9JTkNSX1BJTwkJMQkvKiBNb2RlIDI6IGF1dG8gaW5jcmVtZW50IG1vZGUgKi8KKwkJCQkJLyogUkFNIGFjY2VzcyA/Pz8gKi8KKyNkZWZpbmUgQVVUT0RFQ1JfUElPCQkyCS8qIE1vZGUgMzogYXV0byBkZWNyZW1lbnQgbW9kZSAqLworCQkJCQkvKiBSQU0gYWNjZXNzID8/PyAqLworI2RlZmluZSBQQVJBTV9BQ0NFU1NfUElPCTMJLyogTW9kZSA0OiBMQU4gcGFyYW1ldGVyIGFjY2VzcyBtb2RlICovCisJCQkJCS8qIFBhcmFtZXRlciBhY2Nlc3MuICovCisjZGVmaW5lIFBJT19NQVNLCQkzCS8qIHJlZ2lzdGVyIG1hc2sgKi8KKyNkZWZpbmUgUElPTShjbWQscGlvbm8pCQkoKHVfc2hvcnQpY21kIDw8IDEwIDw8IChwaW9ubyAqIDIpKQorCisjZGVmaW5lCUhBQ1JfREVGQVVMVAkJKEhBQ1JfT1VUMCB8IEhBQ1JfT1VUMSB8IEhBQ1JfMTZCSVRTIHwgUElPTShTVEFUSUNfUElPLCAwKSB8IFBJT00oQVVUT0lOQ1JfUElPLCAxKSB8IFBJT00oUEFSQU1fQUNDRVNTX1BJTywgMikpCisjZGVmaW5lCUhBQ1JfSU5UUk9OCQkoSEFDUl84MjU4Nl9JTlRfRU5BQkxFIHwgSEFDUl9NTUNfSU5UX0VOQUJMRSB8IEhBQ1JfSU5UUl9DTFJfRU5BQkxFKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogTUVNT1JZIExBWU9VVCAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIE9uYm9hcmQgNjQgayBSQU0gbGF5b3V0LgorICogKE9mZnNldHMgZnJvbSAweDAwMDAuKQorICovCisjZGVmaW5lIE9GRlNFVF9SVQkJMHgwMDAwCQkvKiA3NSUgbWVtb3J5ICovCisjZGVmaW5lIE9GRlNFVF9DVQkJMHhDMDAwCQkvKiAyNSUgbWVtb3J5ICovCisjZGVmaW5lIE9GRlNFVF9TQ0IJCShPRkZTRVRfSVNDUCAtIHNpemVvZihzY2JfdCkpCisjZGVmaW5lIE9GRlNFVF9JU0NQCQkoT0ZGU0VUX1NDUCAtIHNpemVvZihpc2NwX3QpKQorI2RlZmluZSBPRkZTRVRfU0NQCQlJODI1ODZfU0NQX0FERFIKKworI2RlZmluZQlSWEJMT0NLWgkJKHNpemVvZihmZF90KSArIHNpemVvZihyYmRfdCkgKyBNQVhEQVRBWikKKyNkZWZpbmUJVFhCTE9DS1oJCShzaXplb2YoYWNfdHhfdCkgKyBzaXplb2YoYWNfbm9wX3QpICsgc2l6ZW9mKHRiZF90KSArIE1BWERBVEFaKQorCisjZGVmaW5lCU5SWEJMT0NLUwkJKChPRkZTRVRfQ1UgLSBPRkZTRVRfUlUpIC8gUlhCTE9DS1opCisjZGVmaW5lCU5UWEJMT0NLUwkJKChPRkZTRVRfU0NCIC0gT0ZGU0VUX0NVKSAvIFRYQkxPQ0taKQorCisvKioqKioqKioqKioqKioqKioqKioqKiBQQVJBTUVURVIgU1RPUkFHRSBBUkVBICoqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBQYXJhbWV0ZXIgU3RvcmFnZSBBcmVhIChQU0EpLgorICovCit0eXBlZGVmIHN0cnVjdCBwc2FfdAlwc2FfdDsKK3N0cnVjdCBwc2FfdAoreworICB1bnNpZ25lZCBjaGFyCXBzYV9pb19iYXNlX2FkZHJfMTsJLyogWzB4MDBdIEJhc2UgYWRkcmVzcyAxID8/PyAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9pb19iYXNlX2FkZHJfMjsJLyogWzB4MDFdIEJhc2UgYWRkcmVzcyAyICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2lvX2Jhc2VfYWRkcl8zOwkvKiBbMHgwMl0gQmFzZSBhZGRyZXNzIDMgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfaW9fYmFzZV9hZGRyXzQ7CS8qIFsweDAzXSBCYXNlIGFkZHJlc3MgNCAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9yZW1fYm9vdF9hZGRyXzE7CS8qIFsweDA0XSBSZW1vdGUgQm9vdCBBZGRyZXNzIDEgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfcmVtX2Jvb3RfYWRkcl8yOwkvKiBbMHgwNV0gUmVtb3RlIEJvb3QgQWRkcmVzcyAyICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3JlbV9ib290X2FkZHJfMzsJLyogWzB4MDZdIFJlbW90ZSBCb290IEFkZHJlc3MgMyAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9ob2xpX3BhcmFtczsJLyogWzB4MDddIEhPc3QgTGFuIEludGVyZmFjZSAoSE9MSSkgUGFyYW1ldGVycyAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9pbnRfcmVxX25vOwkJLyogWzB4MDhdIEludGVycnVwdCBSZXF1ZXN0IExpbmUgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfdW51c2VkMFs3XTsJCS8qIFsweDA5LTB4MEZdIHVudXNlZCAqLworCisgIHVuc2lnbmVkIGNoYXIJcHNhX3VuaXZfbWFjX2FkZHJbV0FWRUxBTl9BRERSX1NJWkVdOwkvKiBbMHgxMC0weDE1XSBVbml2ZXJzYWwgKGZhY3RvcnkpIE1BQyBBZGRyZXNzICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2xvY2FsX21hY19hZGRyW1dBVkVMQU5fQUREUl9TSVpFXTsJLyogWzB4MTYtMUJdIExvY2FsIE1BQyBBZGRyZXNzICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3VuaXZfbG9jYWxfc2VsOwkvKiBbMHgxQ10gVW5pdmVyc2FsIExvY2FsIFNlbGVjdGlvbiAqLworI2RlZmluZQkJUFNBX1VOSVZFUlNBTAkwCQkvKiBVbml2ZXJzYWwgKGZhY3RvcnkpICovCisjZGVmaW5lCQlQU0FfTE9DQUwJMQkJLyogTG9jYWwgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfY29tcF9udW1iZXI7CS8qIFsweDFEXSBDb21wYXRpYmlsaXR5IE51bWJlcjoJICovCisjZGVmaW5lCQlQU0FfQ09NUF9QQ19BVF85MTUJMCAJLyogUEMtQVQgOTE1IE1IeiAJICovCisjZGVmaW5lCQlQU0FfQ09NUF9QQ19NQ185MTUJMSAJLyogUEMtTUMgOTE1IE1IegkgKi8KKyNkZWZpbmUJCVBTQV9DT01QX1BDX0FUXzI0MDAJMiAJLyogUEMtQVQgMi40IEdIegkgKi8KKyNkZWZpbmUJCVBTQV9DT01QX1BDX01DXzI0MDAJMyAJLyogUEMtTUMgMi40IEdIeiAJICovCisjZGVmaW5lCQlQU0FfQ09NUF9QQ01DSUFfOTE1CTQgCS8qIFBDTUNJQSA5MTUgTUh6IG9yIDIuMCAqLworICB1bnNpZ25lZCBjaGFyCXBzYV90aHJfcHJlX3NldDsJLyogWzB4MUVdIE1vZGVtIFRocmVzaG9sZCBQcmVzZXQgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfZmVhdHVyZV9zZWxlY3Q7CS8qIFsweDFGXSBDYWxsIGNvZGUgcmVxdWlyZWQgKDE9b24pICovCisjZGVmaW5lCQlQU0FfRkVBVFVSRV9DQUxMX0NPREUJMHgwMSAJLyogQ2FsbCBjb2RlIHJlcXVpcmVkIChKYXBhbikgKi8KKyAgdW5zaWduZWQgY2hhcglwc2Ffc3ViYmFuZDsJCS8qIFsweDIwXSBTdWJiYW5kCSAgKi8KKyNkZWZpbmUJCVBTQV9TVUJCQU5EXzkxNQkJMAkvKiA5MTUgTUh6IG9yIDIuMCAqLworI2RlZmluZQkJUFNBX1NVQkJBTkRfMjQyNQkxCS8qIDI0MjUgTUh6CSAgKi8KKyNkZWZpbmUJCVBTQV9TVUJCQU5EXzI0NjAJMgkvKiAyNDYwIE1IegkgICovCisjZGVmaW5lCQlQU0FfU1VCQkFORF8yNDg0CTMJLyogMjQ4NCBNSHoJICAqLworI2RlZmluZQkJUFNBX1NVQkJBTkRfMjQzMF81CTQJLyogMjQzMC41IE1IegkgICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3F1YWxpdHlfdGhyOwkvKiBbMHgyMV0gTW9kZW0gUXVhbGl0eSBUaHJlc2hvbGQgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfbW9kX2RlbGF5OwkJLyogWzB4MjJdIE1vZGVtIERlbGF5ICg/KSAocmVzZXJ2ZWQpICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX253aWRbMl07CQkvKiBbMHgyMy0weDI0XSBOZXR3b3JrIElEICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX253aWRfc2VsZWN0OwkvKiBbMHgyNV0gTmV0d29yayBJRCBTZWxlY3QgT24vT2ZmICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2VuY3J5cHRpb25fc2VsZWN0OwkvKiBbMHgyNl0gRW5jcnlwdGlvbiBPbi9PZmYgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfZW5jcnlwdGlvbl9rZXlbOF07CS8qIFsweDI3LTB4MkVdIEVuY3J5cHRpb24gS2V5ICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2RhdGFidXNfd2lkdGg7CS8qIFsweDJGXSBBVCBidXMgd2lkdGggc2VsZWN0IDgvMTYgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfY2FsbF9jb2RlWzhdOwkvKiBbMHgzMC0weDM3XSAoSmFwYW4pIENhbGwgQ29kZSAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9ud2lkX3ByZWZpeFsyXTsJLyogWzB4MzgtMHgzOV0gUm9hbWluZyBkb21haW4gKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfcmVzZXJ2ZWRbMl07CS8qIFsweDNBLTB4M0JdIFJlc2VydmVkIC0gZml4ZWQgMDAgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfY29uZl9zdGF0dXM7CS8qIFsweDNDXSBDb25mIFN0YXR1cywgYml0IDA9MTpjb25maWcqLworICB1bnNpZ25lZCBjaGFyCXBzYV9jcmNbMl07CQkvKiBbMHgzRF0gQ1JDLTE2IG92ZXIgUFNBICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2NyY19zdGF0dXM7CQkvKiBbMHgzRl0gQ1JDIFZhbGlkIEZsYWcgKi8KK307CisKKyNkZWZpbmUJUFNBX1NJWkUJNjQKKworLyogQ2FsY3VsYXRlIG9mZnNldCBvZiBhIGZpZWxkIGluIHRoZSBhYm92ZSBzdHJ1Y3R1cmUuCisgKiBXYXJuaW5nOiAgb25seSBldmVuIGFkZHJlc3NlcyBhcmUgdXNlZC4gKi8KKyNkZWZpbmUJcHNhb2ZmKHAsZikgCSgodW5zaWduZWQgc2hvcnQpICgodm9pZCAqKSgmKChwc2FfdCAqKSAoKHZvaWQgKikgTlVMTCArIChwKSkpLT5mKSAtICh2b2lkICopIE5VTEwpKQorCisvKioqKioqKioqKioqKioqKioqKiogTU9ERU0gTUFOQUdFTUVOVCBJTlRFUkZBQ0UgKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBNb2RlbSBNYW5hZ2VtZW50IENvbnRyb2xsZXIgKE1NQykgd3JpdGUgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtbXdfdAltbXdfdDsKK3N0cnVjdCBtbXdfdAoreworICB1bnNpZ25lZCBjaGFyCW1td19lbmNyX2tleVs4XTsJLyogZW5jcnlwdGlvbiBrZXkgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfZW5jcl9lbmFibGU7CS8qIEVuYWJsZSBvciBkaXNhYmxlIGVuY3J5cHRpb24uICovCisjZGVmaW5lCU1NV19FTkNSX0VOQUJMRV9NT0RFCTB4MDIJLyogbW9kZSBvZiBzZWN1cml0eSBvcHRpb24gKi8KKyNkZWZpbmUJTU1XX0VOQ1JfRU5BQkxFX0VOCTB4MDEJLyogRW5hYmxlIHNlY3VyaXR5IG9wdGlvbi4gKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfdW51c2VkMFsxXTsJCS8qIHVudXNlZCAqLworICB1bnNpZ25lZCBjaGFyCW1td19kZXNfaW9faW52ZXJ0OwkvKiBlbmNyeXB0aW9uIG9wdGlvbiAqLworI2RlZmluZQlNTVdfREVTX0lPX0lOVkVSVF9SRVMJMHgwRgkvKiByZXNlcnZlZCAqLworI2RlZmluZQlNTVdfREVTX0lPX0lOVkVSVF9DVFJMCTB4RjAJLyogY29udHJvbCAoPykgKHNldCB0byAwKSAqLworICB1bnNpZ25lZCBjaGFyCW1td191bnVzZWQxWzVdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2xvb3B0X3NlbDsJCS8qIGxvb3B0ZXN0IHNlbGVjdGlvbiAqLworI2RlZmluZQlNTVdfTE9PUFRfU0VMX0RJU19OV0lECTB4NDAJLyogRGlzYWJsZSBOV0lEIGZpbHRlcmluZy4gKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9JTlQJMHgyMAkvKiBBY3RpdmF0ZSBBdHRlbnRpb24gUmVxdWVzdC4gKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9MUwkweDEwCS8qIGxvb3B0ZXN0LCBubyBjb2xsaXNpb24gYXZvaWRhbmNlICovCisjZGVmaW5lIE1NV19MT09QVF9TRUxfTFQzQQkweDA4CS8qIGxvb3B0ZXN0IDNhICovCisjZGVmaW5lCU1NV19MT09QVF9TRUxfTFQzQgkweDA0CS8qIGxvb3B0ZXN0IDNiICovCisjZGVmaW5lCU1NV19MT09QVF9TRUxfTFQzQwkweDAyCS8qIGxvb3B0ZXN0IDNjICovCisjZGVmaW5lCU1NV19MT09QVF9TRUxfTFQzRAkweDAxCS8qIGxvb3B0ZXN0IDNkICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2phYmJlcl9lbmFibGU7CS8qIGphYmJlciB0aW1lciBlbmFibGUgKi8KKyAgLyogQWJvcnQgdHJhbnNtaXNzaW9ucyA+IDIwMCBtcyAqLworICB1bnNpZ25lZCBjaGFyCW1td19mcmVlemU7CQkvKiBmcmVlemUgb3IgdW5mcmVlemUgc2lnbmFsIGxldmVsICovCisgIC8qIDAgOiBzaWduYWwgbGV2ZWwgJiBxdWFsIHVwZGF0ZWQgZm9yIGV2ZXJ5IG5ldyBtZXNzYWdlLCAxIDogZnJvemVuICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2FudGVuX3NlbDsJCS8qIGFudGVubmEgc2VsZWN0aW9uICovCisjZGVmaW5lIE1NV19BTlRFTl9TRUxfU0VMCTB4MDEJLyogZGlyZWN0IGFudGVubmEgc2VsZWN0aW9uICovCisjZGVmaW5lCU1NV19BTlRFTl9TRUxfQUxHX0VOCTB4MDIJLyogYW50ZW5uYSBzZWxlY3Rpb24gYWxnby4gZW5hYmxlICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2lmczsJCS8qIGludGVyIGZyYW1lIHNwYWNpbmcgKi8KKyAgLyogbWluIHRpbWUgYmV0d2VlbiB0cmFuc21pc3Npb24gaW4gYml0IHBlcmlvZHMgKC41IHVzKSAtIGJpdCAwIGlnbm9yZWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfbW9kX2RlbGF5OwkgCS8qIG1vZGVtIGRlbGF5IChzeW5jaHJvKSAqLworICB1bnNpZ25lZCBjaGFyCW1td19qYW1fdGltZTsJCS8qIGphbW1pbmcgdGltZSAoYWZ0ZXIgY29sbGlzaW9uKSAqLworICB1bnNpZ25lZCBjaGFyCW1td191bnVzZWQyWzFdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW13X3Rocl9wcmVfc2V0OwkvKiBsZXZlbCB0aHJlc2hvbGQgcHJlc2V0ICovCisgIC8qIERpc2NhcmQgYWxsIHBhY2tldCB3aXRoIHNpZ25hbCA8IHRoaXMgdmFsdWUgKDQpICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2RlY2F5X3BybTsJCS8qIGRlY2F5IHBhcmFtZXRlcnMgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfZGVjYXlfdXBkYXRfcHJtOwkvKiBkZWNheSB1cGRhdGUgcGFyYW1ldGVycyAqLworICB1bnNpZ25lZCBjaGFyCW1td19xdWFsaXR5X3RocjsJLyogcXVhbGl0eSAoei1xdW90aWVudCkgdGhyZXNob2xkICovCisgIC8qIERpc2NhcmQgYWxsIHBhY2tldCB3aXRoIHF1YWxpdHkgPCB0aGlzIHZhbHVlICgzKSAqLworICB1bnNpZ25lZCBjaGFyCW1td19uZXR3X2lkX2w7CQkvKiBOV0lEIGxvdyBvcmRlciBieXRlICovCisgIHVuc2lnbmVkIGNoYXIJbW13X25ldHdfaWRfaDsJCS8qIE5XSUQgaGlnaCBvcmRlciBieXRlICovCisgIC8qIE5ldHdvcmsgSUQgb3IgRG9tYWluIDogY3JlYXRlIHZpcnR1YWwgbmV0IG9uIHRoZSBhaXIgKi8KKworICAvKiAyLjAgSGFyZHdhcmUgZXh0ZW5zaW9uIC0gZnJlcXVlbmN5IHNlbGVjdGlvbiBzdXBwb3J0ICovCisgIHVuc2lnbmVkIGNoYXIJbW13X21vZGVfc2VsZWN0OwkvKiBmb3IgYW5hbG9nIHRlc3RzIChzZXQgdG8gMCkgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfdW51c2VkM1sxXTsJCS8qIHVudXNlZCAqLworICB1bnNpZ25lZCBjaGFyCW1td19mZWVfY3RybDsJCS8qIGZyZXF1ZW5jeSBFRVBST00gY29udHJvbCAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfUFJFCTB4MTAJLyogRW5hYmxlIHByb3RlY3RlZCBpbnN0cnVjdGlvbnMuICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9EV0xECTB4MDgJLyogRG93bmxvYWQgRUVQUk9NIHRvIG1tYy4gKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX0NNRAkweDA3CS8qIEVFUFJPTSBjb21tYW5kczogICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9SRUFECTB4MDYJLyogUmVhZCAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfV1JFTgkweDA0CS8qIFdyaXRlIGVuYWJsZSAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfV1JJVEUJMHgwNQkvKiBXcml0ZSBkYXRhIHRvIGFkZHJlc3MuICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9XUkFMTAkweDA0CS8qIFdyaXRlIGRhdGEgdG8gYWxsIGFkZHJlc3Nlcy4gKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1dEUwkweDA0CS8qIFdyaXRlIGRpc2FibGUgKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1BSUkVBRAkweDE2CS8qIFJlYWQgYWRkciBmcm9tIHByb3RlY3QgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1BSRU4JMHgxNAkvKiBQcm90ZWN0IHJlZ2lzdGVyIGVuYWJsZSAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfUFJDTEVBUgkweDE3CS8qIFVucHJvdGVjdCBhbGwgcmVnaXN0ZXJzLiAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfUFJXUklURQkweDE1CS8qIFdyaXRlIGFkZHJlc3MgaW4gcHJvdGVjdCByZWdpc3RlciAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfUFJEUwkweDE0CS8qIFByb3RlY3QgcmVnaXN0ZXIgZGlzYWJsZSAqLworICAvKiBOZXZlciBpc3N1ZSB0aGUgUFJEUyBjb21tYW5kOiAgaXQncyBpcnJldmVyc2libGUhICovCisKKyAgdW5zaWduZWQgY2hhcgltbXdfZmVlX2FkZHI7CQkvKiBFRVBST00gYWRkcmVzcyAqLworI2RlZmluZQlNTVdfRkVFX0FERFJfQ0hBTk5FTAkweEYwCS8qIFNlbGVjdCB0aGUgY2hhbm5lbC4gKi8KKyNkZWZpbmUJTU1XX0ZFRV9BRERSX09GRlNFVAkweDBGCS8qIE9mZnNldCBpbiBjaGFubmVsIGRhdGEgKi8KKyNkZWZpbmUJTU1XX0ZFRV9BRERSX0VOCQkweEMwCS8qIEZFRV9DVFJMIGVuYWJsZSBvcGVyYXRpb25zICovCisjZGVmaW5lCU1NV19GRUVfQUREUl9EUwkJMHgwMAkvKiBGRUVfQ1RSTCBkaXNhYmxlIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUJTU1XX0ZFRV9BRERSX0FMTAkweDQwCS8qIEZFRV9DVFJMIGFsbCBvcGVyYXRpb25zICovCisjZGVmaW5lCU1NV19GRUVfQUREUl9DTEVBUgkweEZGCS8qIEZFRV9DVFJMIGNsZWFyIG9wZXJhdGlvbnMgKi8KKworICB1bnNpZ25lZCBjaGFyCW1td19mZWVfZGF0YV9sOwkJLyogV3JpdGUgZGF0YSB0byBFRVBST00uICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2ZlZV9kYXRhX2g7CQkvKiBoaWdoIG9jdGV0ICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2V4dF9hbnQ7CQkvKiBTZXR0aW5nIGZvciBleHRlcm5hbCBhbnRlbm5hICovCisjZGVmaW5lCU1NV19FWFRfQU5UX0VYVEFOVAkweDAxCS8qIFNlbGVjdCBleHRlcm5hbCBhbnRlbm5hICovCisjZGVmaW5lCU1NV19FWFRfQU5UX1BPTAkJMHgwMgkvKiBQb2xhcml0eSBvZiB0aGUgYW50ZW5uYSAqLworI2RlZmluZQlNTVdfRVhUX0FOVF9JTlRFUk5BTAkweDAwCS8qIEludGVybmFsIGFudGVubmEgKi8KKyNkZWZpbmUJTU1XX0VYVF9BTlRfRVhURVJOQUwJMHgwMwkvKiBFeHRlcm5hbCBhbnRlbm5hICovCisjZGVmaW5lCU1NV19FWFRfQU5UX0lRX1RFU1QJMHgxQwkvKiBJUSB0ZXN0IHBhdHRlcm4gKHNldCB0byAwKSAqLworfTsKKworI2RlZmluZQlNTVdfU0laRQkzNworCisjZGVmaW5lCW1td29mZihwLGYpIAkodW5zaWduZWQgc2hvcnQpKCh2b2lkICopKCYoKG1td190ICopKCh2b2lkICopMCArIChwKSkpLT5mKSAtICh2b2lkICopMCkKKworLyoKKyAqIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlciAoTU1DKSByZWFkIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbW1yX3QJbW1yX3Q7CitzdHJ1Y3QgbW1yX3QKK3sKKyAgdW5zaWduZWQgY2hhcgltbXJfdW51c2VkMFs4XTsJCS8qIHVudXNlZCAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9kZXNfc3RhdHVzOwkJLyogZW5jcnlwdGlvbiBzdGF0dXMgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZGVzX2F2YWlsOwkJLyogZW5jcnlwdGlvbiBhdmFpbGFibGUgKDB4NTUgcmVhZCkgKi8KKyNkZWZpbmUJTU1SX0RFU19BVkFJTF9ERVMJMHg1NQkJLyogREVTIGF2YWlsYWJsZSAqLworI2RlZmluZQlNTVJfREVTX0FWQUlMX0FFUwkweDMzCQkvKiBBRVMgKEFUJlQpIGF2YWlsYWJsZSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9kZXNfaW9faW52ZXJ0OwkvKiBkZXMgSS9PIGludmVydCByZWdpc3RlciAqLworICB1bnNpZ25lZCBjaGFyCW1tcl91bnVzZWQxWzVdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2RjZV9zdGF0dXM7CQkvKiBEQ0Ugc3RhdHVzICovCisjZGVmaW5lCU1NUl9EQ0VfU1RBVFVTX1JYX0JVU1kJCTB4MDEJLyogcmVjZWl2ZXIgYnVzeSAqLworI2RlZmluZQlNTVJfRENFX1NUQVRVU19MT09QVF9JTkQJMHgwMgkvKiBsb29wIHRlc3QgaW5kaWNhdGVkICovCisjZGVmaW5lCU1NUl9EQ0VfU1RBVFVTX1RYX0JVU1kJCTB4MDQJLyogdHJhbnNtaXR0ZXIgb24gKi8KKyNkZWZpbmUJTU1SX0RDRV9TVEFUVVNfSkJSX0VYUElSRUQJMHgwOAkvKiBqYWJiZXIgdGltZXIgZXhwaXJlZCAqLworI2RlZmluZSBNTVJfRENFX1NUQVRVUwkJCTB4MEYJLyogbWFzayB0byBnZXQgdGhlIGJpdHMgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZHNwX2lkOwkJLyogRFNQIElEIChBQSA9IERhZWRhbHVzIHJldiBBKSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl91bnVzZWQyWzJdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2NvcnJlY3RfbndpZF9sOwkvKiAjIG9mIGNvcnJlY3QgTldJRHMgcnhkIChsb3cpICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2NvcnJlY3RfbndpZF9oOwkvKiAjIG9mIGNvcnJlY3QgTldJRHMgcnhkIChoaWdoKSAqLworICAvKiBXYXJuaW5nOiAgcmVhZCBoaWdoLW9yZGVyIG9jdGV0IGZpcnN0ISAqLworICB1bnNpZ25lZCBjaGFyCW1tcl93cm9uZ19ud2lkX2w7CS8qICMgb2Ygd3JvbmcgTldJRHMgcnhkIChsb3cpICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3dyb25nX253aWRfaDsJLyogIyBvZiB3cm9uZyBOV0lEcyByeGQgKGhpZ2gpICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3Rocl9wcmVfc2V0OwkvKiBsZXZlbCB0aHJlc2hvbGQgcHJlc2V0ICovCisjZGVmaW5lCU1NUl9USFJfUFJFX1NFVAkJMHgzRgkJLyogbGV2ZWwgdGhyZXNob2xkIHByZXNldCAqLworI2RlZmluZQlNTVJfVEhSX1BSRV9TRVRfQ1VSCTB4ODAJCS8qIEN1cnJlbnQgc2lnbmFsIGFib3ZlIGl0ICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3NpZ25hbF9sdmw7CQkvKiBzaWduYWwgbGV2ZWwgKi8KKyNkZWZpbmUJTU1SX1NJR05BTF9MVkwJCTB4M0YJCS8qIHNpZ25hbCBsZXZlbCAqLworI2RlZmluZQlNTVJfU0lHTkFMX0xWTF9WQUxJRAkweDgwCQkvKiBVcGRhdGVkIHNpbmNlIGxhc3QgcmVhZCAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9zaWxlbmNlX2x2bDsJLyogc2lsZW5jZSBsZXZlbCAobm9pc2UpICovCisjZGVmaW5lCU1NUl9TSUxFTkNFX0xWTAkJMHgzRgkJLyogc2lsZW5jZSBsZXZlbCAqLworI2RlZmluZQlNTVJfU0lMRU5DRV9MVkxfVkFMSUQJMHg4MAkJLyogVXBkYXRlZCBzaW5jZSBsYXN0IHJlYWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfc2dubF9xdWFsOwkJLyogc2lnbmFsIHF1YWxpdHkgKi8KKyNkZWZpbmUJTU1SX1NHTkxfUVVBTAkJMHgwRgkJLyogc2lnbmFsIHF1YWxpdHkgKi8KKyNkZWZpbmUJTU1SX1NHTkxfUVVBTF9BTlQJMHg4MAkJLyogY3VycmVudCBhbnRlbm5hIHVzZWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfbmV0d19pZF9sOwkJLyogTldJRCBsb3cgb3JkZXIgYnl0ZSAoPykgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfdW51c2VkM1szXTsJCS8qIHVudXNlZCAqLworCisgIC8qIDIuMCBIYXJkd2FyZSBleHRlbnNpb24gLSBmcmVxdWVuY3kgc2VsZWN0aW9uIHN1cHBvcnQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZmVlX3N0YXR1czsJCS8qIFN0YXR1cyBvZiBmcmVxdWVuY3kgRUVQUk9NICovCisjZGVmaW5lCU1NUl9GRUVfU1RBVFVTX0lECTB4RjAJCS8qIE1vZGVtIHJldmlzaW9uIElEICovCisjZGVmaW5lCU1NUl9GRUVfU1RBVFVTX0RXTEQJMHgwOAkJLyogRG93bmxvYWQgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUJTU1SX0ZFRV9TVEFUVVNfQlVTWQkweDA0CQkvKiBFRVBST00gYnVzeSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl91bnVzZWQ0WzFdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2ZlZV9kYXRhX2w7CQkvKiBSZWFkIGRhdGEgZnJvbSBFRVBST00gKGxvdykgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZmVlX2RhdGFfaDsJCS8qIFJlYWQgZGF0YSBmcm9tIEVFUFJPTSAoaGlnaCkgKi8KK307CisKKyNkZWZpbmUJTU1SX1NJWkUJMzYKKworI2RlZmluZQltbXJvZmYocCxmKSAJKHVuc2lnbmVkIHNob3J0KSgodm9pZCAqKSgmKChtbXJfdCAqKSgodm9pZCAqKTAgKyAocCkpKS0+ZikgLSAodm9pZCAqKTApCisKKy8qIE1ha2UgdGhlIHR3byBhYm92ZSBzdHJ1Y3R1cmVzIG9uZSAqLwordHlwZWRlZiB1bmlvbiBtbV90Cit7CisgIHN0cnVjdCBtbXdfdAl3OwkvKiBXcml0ZSB0byB0aGUgbW1jICovCisgIHN0cnVjdCBtbXJfdAlyOwkvKiBSZWFkIGZyb20gdGhlIG1tYyAqLworfSBtbV90OworCisjZW5kaWYgLyogX1dBVkVMQU5fSCAqLworCisvKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgb25seSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZAorICogYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogRm9yIG1vcmUgZGV0YWlscywgc2VlIHdhdmVsYW4uYy4KKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5wLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDlmZjIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbi5wLmgKQEAgLTAsMCArMSw3MTYgQEAKKy8qCisgKglXYXZlTEFOIElTQSBkcml2ZXIKKyAqCisgKgkJSmVhbiBJSSAtIEhQTEIgJzk2CisgKgorICogUmVvcmdhbmlzYXRpb24gYW5kIGV4dGVuc2lvbiBvZiB0aGUgZHJpdmVyLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBuZWNlc3NhcnkgZm9yIHRoZQorICogV2F2ZUxBTiBJU0EgZHJpdmVyLiAgVGhpcyBmaWxlIGlzIGEgcHJpdmF0ZSBoZWFkZXIsIHNvIGl0IHNob3VsZAorICogYmUgaW5jbHVkZWQgb25seSBpbiB3YXZlbGFuLmMhCisgKi8KKworI2lmbmRlZiBXQVZFTEFOX1BfSAorI2RlZmluZSBXQVZFTEFOX1BfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogRE9DVU1FTlRBVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyBkcml2ZXIgcHJvdmlkZXMgYSBMaW51eCBpbnRlcmZhY2UgdG8gdGhlIFdhdmVMQU4gSVNBIGhhcmR3YXJlLgorICogVGhlIFdhdmVMQU4gaXMgYSBwcm9kdWN0IG9mIEx1Y2VudCAoaHR0cDovL3d3dy53YXZlbGFuLmNvbS8pLgorICogVGhpcyBkaXZpc2lvbiB3YXMgZm9ybWVybHkgcGFydCBvZiBOQ1IgYW5kIHRoZW4gQVQmVC4KKyAqIFdhdmVMQU5zIGFyZSBhbHNvIGRpc3RyaWJ1dGVkIGJ5IERFQyAoUm9hbUFib3V0IERTKSBhbmQgRGlnaXRhbCBPY2Vhbi4KKyAqCisgKiBUbyBsZWFybiBob3cgdG8gdXNlIHRoaXMgZHJpdmVyLCByZWFkIHRoZSBORVQzIEhPV1RPLgorICogSWYgeW91IHdhbnQgdG8gZXhwbG9pdCB0aGUgbWFueSBvdGhlciBmdW5jdGlvbmFsaXRpZXMsIHJlYWQgdGhlIGNvbW1lbnRzCisgKiBpbiB0aGUgY29kZS4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyB0aGUgcmVzdWx0IG9mIHRoZSBlZmZvcnQgb2YgbWFueSBwZW9wbGUgKHNlZSBiZWxvdykuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNQRUNJRklDIE5PVEVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFdlYiBwYWdlCisgKiAtLS0tLS0tLQorICoJSSB0cnkgdG8gbWFpbnRhaW4gYSB3ZWIgcGFnZSB3aXRoIHRoZSBXaXJlbGVzcyBMQU4gSG93dG8gYXQgOgorICoJICAgIGh0dHA6Ly93d3cuaHBsLmhwLmNvbS9wZXJzb25hbC9KZWFuX1RvdXJyaWxoZXMvTGludXgvV2F2ZWxhbi5odG1sCisgKgorICogU01QCisgKiAtLS0KKyAqCVdlIG5vdyBhcmUgU01QIGNvbXBsaWFudCAoSSBldmVudHVhbGx5IGZpeGVkIHRoZSByZW1haW5pbmcgYnVncykuCisgKglUaGUgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZCBvbiBhIGR1YWwgUDYtMTUwIGFuZCBzdXJ2aXZlZCBteSB1c3VhbAorICoJc2V0IG9mIHRvcnR1cmUgdGVzdHMuCisgKglBbnl3YXksIEkgc3BlbnQgZW5vdWdoIHRpbWUgY2hhc2luZyBpbnRlcnJ1cHQgcmUtZW50cmFuY3kgZHVyaW5nCisgKgllcnJvcnMgb3IgcmVjb25maWd1cmUsIGFuZCBJIGRlc2lnbmVkIHRoZSBsb2NrZWQvdW5sb2NrZWQgc2VjdGlvbnMKKyAqCW9mIHRoZSBkcml2ZXIgd2l0aCBncmVhdCBjYXJlLCBhbmQgd2l0aCB0aGUgcmVjZW50IGFkZGl0aW9uIG9mCisgKgl0aGUgc3BpbmxvY2sgKHRoYW5rcyB0byB0aGUgbmV3IEFQSSksIHdlIHNob3VsZCBiZSBxdWl0ZSBjbG9zZSB0bworICoJdGhlIHRydXRoLgorICoJVGhlIFNNUC9JUlEgbG9ja2luZyBpcyBxdWl0ZSBjb2Fyc2UgYW5kIGNvbnNlcnZhdGl2ZSAoaS5lLiBub3QgZmFzdCksCisgKglidXQgYmV0dGVyIHNhZmUgdGhhbiBzb3JyeSAoZXNwZWNpYWxseSBhdCAyIE1iL3MgOy0pLgorICoKKyAqCUkgaGF2ZSBhbHNvIGxvb2tlZCBpbnRvIGRpc2FibGluZyBvbmx5IG91ciBpbnRlcnJ1cHQgb24gdGhlIGNhcmQKKyAqCSh2aWEgSEFDUikgaW5zdGVhZCBvZiBhbGwgaW50ZXJydXB0cyBpbiB0aGUgcHJvY2Vzc29yICh2aWEgY2xpKSwKKyAqCXNvIHRoYXQgb3RoZXIgZHJpdmVyIGFyZSBub3QgaW1wYWN0ZWQsIGFuZCBpdCBsb29rIGxpa2UgaXQncworICoJcG9zc2libGUsIGJ1dCBpdCdzIHZlcnkgdHJpY2t5IHRvIGRvIHJpZ2h0IChmdWxsIG9mIHJhY2VzKS4gQXMKKyAqCXRoZSBnYWluIHdvdWxkIGJlIG1vc3RseSBmb3IgU01QIHN5c3RlbXMsIGl0IGNhbiB3YWl0Li4uCisgKgorICogRGVidWdnaW5nIGFuZCBvcHRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCVlvdSB3aWxsIGZpbmQgYmVsb3cgYSBzZXQgb2YgJyNkZWZpbmUiIGFsbG93aW5nIGEgdmVyeSBmaW5lIGNvbnRyb2wKKyAqCW9uIHRoZSBkcml2ZXIgYmVoYXZpb3VyIGFuZCB0aGUgZGVidWcgbWVzc2FnZXMgcHJpbnRlZC4KKyAqCVRoZSBtYWluIG9wdGlvbnMgYXJlIDoKKyAqCW8gU0VUX1BTQV9DUkMsIHRvIGhhdmUgeW91ciBjYXJkIGNvcnJlY3RseSByZWNvZ25pc2VkIGJ5CisgKgkgIGFuIGFjY2VzcyBwb2ludCBhbmQgdGhlIFBvaW50LXRvLVBvaW50IGRpYWdub3N0aWMgdG9vbC4KKyAqCW8gVVNFX1BTQV9DT05GSUcsIHRvIHJlYWQgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBQU0EgKEVFcHJvbSkKKyAqCSAgKG90aGVyd2lzZSB3ZSBhbHdheXMgc3RhcnQgYWZyZXNoIHdpdGggc29tZSBkZWZhdWx0cykKKyAqCisgKiB3YXZlbGFuLm8gaXMgdG9vIGRhcm5lZCBiaWcKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJVGhhdCdzIHRydWUhICBUaGVyZSBpcyBhIHZlcnkgc2ltcGxlIHdheSB0byByZWR1Y2UgdGhlIGRyaXZlcgorICoJb2JqZWN0IGJ5IDMzJSEgIENvbW1lbnQgb3V0IHRoZSBmb2xsb3dpbmcgbGluZToKKyAqCQkjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyAqCU90aGVyIGNvbXBpbGUgb3B0aW9ucyBjYW4gYWxzbyByZWR1Y2UgdGhlIHNpemUgb2YgaXQuLi4KKyAqCisgKiBNQUMgYWRkcmVzcyBhbmQgaGFyZHdhcmUgZGV0ZWN0aW9uOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCVRoZSBkZXRlY3Rpb24gY29kZSBmb3IgdGhlIFdhdmVMQU4gY2hlY2tzIHRoYXQgdGhlIGZpcnN0IHRocmVlCisgKglvY3RldHMgb2YgdGhlIE1BQyBhZGRyZXNzIGZpdCB0aGUgY29tcGFueSBjb2RlLiAgVGhpcyB0eXBlIG9mCisgKglkZXRlY3Rpb24gd29ya3Mgd2VsbCBmb3IgQVQmVCBjYXJkcyAoYmVjYXVzZSB0aGUgQVQmVCBjb2RlIGlzCisgKgloYXJkY29kZWQgaW4gd2F2ZWxhbi5oKSwgYnV0IG9mIGNvdXJzZSB3aWxsIGZhaWwgZm9yIG90aGVyCisgKgltYW51ZmFjdHVyZXJzLgorICoKKyAqCUlmIHlvdSBhcmUgc3VyZSB0aGF0IHlvdXIgY2FyZCBpcyBkZXJpdmVkIGZyb20gdGhlIFdhdmVMQU4sCisgKgloZXJlIGlzIHRoZSB3YXkgdG8gY29uZmlndXJlIGl0OgorICoJMSkgR2V0IHlvdXIgTUFDIGFkZHJlc3MKKyAqCQlhKSBXaXRoIHlvdXIgY2FyZCB1dGlsaXRpZXMgKHdmcmVxc2VsLCBpbnN0Y29uZiwgZXRjLikKKyAqCQliKSBXaXRoIHRoZSBkcml2ZXI6CisgKgkJCW8gY29tcGlsZSB0aGUga2VybmVsIHdpdGggREVCVUdfQ09ORklHX0lORk8gZW5hYmxlZAorICoJCQlvIEJvb3QgYW5kIGxvb2sgdGhlIGNhcmQgbWVzc2FnZXMKKyAqCTIpIFNldCB5b3VyIE1BQyBjb2RlICgzIG9jdGV0cykgaW4gTUFDX0FERFJFU1NFU1tdWzNdICh3YXZlbGFuLmgpCisgKgkzKSBDb21waWxlIGFuZCB2ZXJpZnkKKyAqCTQpIFNlbmQgbWUgdGhlIE1BQyBjb2RlLiAgSSB3aWxsIGluY2x1ZGUgaXQgaW4gdGhlIG5leHQgdmVyc2lvbi4KKyAqCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdJUkVMRVNTIEVYVEVOU0lPTlMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogVGhpcyBkcml2ZXIgaXMgdGhlIGZpcnN0IHRvIHN1cHBvcnQgIndpcmVsZXNzIGV4dGVuc2lvbnMiLgorICogVGhpcyBzZXQgb2YgZXh0ZW5zaW9ucyBwcm92aWRlcyBhIHN0YW5kYXJkIHdheSB0byBjb250cm9sIHRoZSB3aXJlbGVzcworICogY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBoYXJkd2FyZS4gIEFwcGxpY2F0aW9ucyBzdWNoIGFzIG1vYmlsZSBJUCBtYXkKKyAqIHRha2UgYWR2YW50YWdlIG9mIGl0LgorICoKKyAqIFlvdSB3aWxsIG5lZWQgdG8gZW5hYmxlIHRoZSBDT05GSUdfTkVUX1JBRElPIGRlZmluZSBpbiB0aGUga2VybmVsCisgKiBjb25maWd1cmF0aW9uIHRvIGVuYWJsZSB0aGUgd2lyZWxlc3MgZXh0ZW5zaW9ucyAodGhpcyBpcyB0aGUgb25lCisgKiBnaXZpbmcgYWNjZXNzIHRvIHRoZSByYWRpbyBuZXR3b3JrIGRldmljZSBjaG9pY2UpLgorICoKKyAqIEl0IG1pZ2h0IGFsc28gYmUgYSBnb29kIGlkZWEgYXMgd2VsbCB0byBmZXRjaCB0aGUgd2lyZWxlc3MgdG9vbHMgdG8KKyAqIGNvbmZpZ3VyZSB0aGUgZGV2aWNlIGFuZCBwbGF5IGEgYml0LgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRklMRVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIHdhdmVsYW4uYzoJCWFjdHVhbCBjb2RlIGZvciB0aGUgZHJpdmVyOiAgQyBmdW5jdGlvbnMKKyAqCisgKiB3YXZlbGFuLnAuaDoJCXByaXZhdGUgaGVhZGVyOiAgbG9jYWwgdHlwZXMgYW5kIHZhcmlhYmxlcyBmb3IgZHJpdmVyCisgKgorICogd2F2ZWxhbi5oOgkJZGVzY3JpcHRpb24gb2YgdGhlIGhhcmR3YXJlIGludGVyZmFjZSBhbmQgc3RydWN0cworICoKKyAqIGk4MjU4Ni5oOgkJZGVzY3JpcHRpb24gb2YgdGhlIEV0aGVybmV0IGNvbnRyb2xsZXIKKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSElTVE9SWSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBUaGlzIGlzIGJhc2VkIG9uIGluZm9ybWF0aW9uIGluIHRoZSBkcml2ZXJzJyBoZWFkZXJzLiBJdCBtYXkgbm90IGJlCisgKiBhY2N1cmF0ZSwgYW5kIEkgZ3VhcmFudGVlIG9ubHkgbXkgYmVzdCBlZmZvcnQuCisgKgorICogVGhlIGhpc3Rvcnkgb2YgdGhlIFdhdmVMQU4gZHJpdmVycyBpcyBhcyBjb21wbGljYXRlZCBhcyB0aGUgaGlzdG9yeSBvZgorICogdGhlIFdhdmVMQU4gaXRzZWxmIChOQ1IgLT4gQVQmVCAtPiBMdWNlbnQpLgorICoKKyAqIEl0IGFsbCBzdGFydGVkIHdpdGggQW5kZXJzIEtsZW1ldHMgPGtsZW1ldHNAcGF1bC5ydXRnZXJzLmVkdT4KKyAqIHdyaXRpbmcgYSBXYXZlTEFOIElTQSBkcml2ZXIgZm9yIHRoZSBNYWNoIG1pY3Jva2VybmVsLiAgR2lyaXNoCisgKiBXZWxsaW5nIDx3ZWxsaW5nQHBhdWwucnV0Z2Vycy5lZHU+IGhhZCBhbHNvIHdvcmtlZCBvbiBpdC4KKyAqIEtlaXRoIE1vb3JlIG1vZGlmaWVkIHRoaXMgZm9yIHRoZSBQQ01DSUEgaGFyZHdhcmUuCisgKiAKKyAqIFJvYmVydCBNb3JyaXMgPHJ0bUBkYXMuaGFydmFyZC5lZHU+IHBvcnRlZCB0aGVzZSB0d28gZHJpdmVycyB0byBCU0RJCisgKiBhbmQgYWRkZWQgc3BlY2lmaWMgUENNQ0lBIHN1cHBvcnQgKHRoZXJlIGlzIGN1cnJlbnRseSBubyBlcXVpdmFsZW50CisgKiBvZiB0aGUgUENNQ0lBIHBhY2thZ2UgdW5kZXIgQlNEKS4KKyAqCisgKiBKaW0gQmlua2xleSA8anJiQGNzLnBkeC5lZHU+IHBvcnRlZCBib3RoIEJTREkgZHJpdmVycyB0byBGcmVlQlNELgorICoKKyAqIEJydWNlIEphbnNvbiA8YnJ1Y2VAY3MudXN5ZC5lZHUuYXU+IHBvcnRlZCB0aGUgQlNESSBJU0EgZHJpdmVyIHRvIExpbnV4LgorICoKKyAqIEFudGhvbnkgRC4gSm9zZXBoIDxhZGpAbGNzLm1pdC5lZHU+IHN0YXJ0ZWQgdG8gbW9kaWZ5IEJydWNlJ3MgZHJpdmVyCisgKiAod2l0aCBoZWxwIG9mIHRoZSBCU0RJIFBDTUNJQSBkcml2ZXIpIGZvciBQQ01DSUEuCisgKiBZdW56aG91IExpIDx5dW56aG91QHN0cmF0LmlvbC51bmguZWR1PiBmaW5pc2hlZCB0aGlzIHdvcmsuCisgKiBKb2UgRmlubmV5IDxqb2VAY29tcC5sYW5jcy5hYy51az4gcGF0Y2hlZCB0aGUgZHJpdmVyIHRvIHN0YXJ0CisgKiAyLjAwIGNhcmRzIGNvcnJlY3RseSAoMi40IEdIeiB3aXRoIGZyZXF1ZW5jeSBzZWxlY3Rpb24pLgorICogRGF2aWQgSGluZHMgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0PiBpbnRlZ3JhdGVkIHRoZSB3aG9sZSBpbiBoaXMKKyAqIFBDTUNJQSBwYWNrYWdlIChhbmQgYnVnIGNvcnJlY3Rpb25zKS4KKyAqCisgKiBJIChKZWFuIFRvdXJyaWxoZXMgLSBqdEBocGxiLmhwbC5ocC5jb20pIHRoZW4gc3RhcnRlZCB0byBtYWtlIHNvbWUKKyAqIHBhdGNoZXMgdG8gdGhlIFBDTUNJQSBkcml2ZXIuICBMYXRlciwgSSBhZGRlZCBjb2RlIGluIHRoZSBJU0EgZHJpdmVyCisgKiBmb3IgV2lyZWxlc3MgRXh0ZW5zaW9ucyBhbmQgZnVsbCBzdXBwb3J0IG9mIGZyZXF1ZW5jeSBzZWxlY3Rpb24KKyAqIGNhcmRzLiAgVGhlbiwgSSBkaWQgdGhlIHNhbWUgdG8gdGhlIFBDTUNJQSBkcml2ZXIsIGFuZCBkaWQgc29tZQorICogcmVvcmdhbmlzYXRpb24uICBGaW5hbGx5LCBJIGNhbWUgYmFjayB0byB0aGUgSVNBIGRyaXZlciB0bworICogdXBncmFkZSBpdCBhdCB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgUENNQ0lBIG9uZSBhbmQgcmVvcmdhbmlzZQorICogdGhlIGNvZGUuCisgKiBMb2VrZSBCcmVkZXJ2ZWxkIDxsYnJlZGVydkB3YXZlbGFuLmNvbT4gZnJvbSBMdWNlbnQgaGFzIGdpdmVuIG1lCisgKiBtdWNoIG5lZWRlZCBpbmZvcm1hdGlvbiBvbiB0aGUgV2F2ZUxBTiBoYXJkd2FyZS4KKyAqLworCisvKiBUaGUgb3JpZ2luYWwgY29weXJpZ2h0cyBhbmQgbGl0ZXJhdHVyZSBtZW50aW9uIG90aGVycycgbmFtZXMgYW5kCisgKiBjcmVkaXRzLiAgSSBkb24ndCBrbm93IHdoYXQgdGhlaXIgcGFydCBpbiB0aGlzIGRldmVsb3BtZW50IHdhcy4KKyAqLworCisvKiBCeSB0aGUgd2F5LCBmb3IgdGhlIGNvcHlyaWdodCBhbmQgbGVnYWwgc3R1ZmY6CisgKiBhbG1vc3QgZXZlcnlib2R5IHdyb3RlIGNvZGUgdW5kZXIgdGhlIEdOVSBvciBCU0QgbGljZW5zZSAob3Igc2ltaWxhciksCisgKiBhbmQgd2FudCB0aGVpciBvcmlnaW5hbCBjb3B5cmlnaHQgdG8gcmVtYWluIHNvbWV3aGVyZSBpbiB0aGUKKyAqIGNvZGUgKGZvciBteXNlbGYsIEkgZ28gd2l0aCB0aGUgR1BMKS4KKyAqIE5vYm9keSB3YW50cyB0byB0YWtlIHJlc3BvbnNpYmlsaXR5IGZvciBhbnl0aGluZywgZXhjZXB0IHRoZSBmYW1lLgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDUkVESVRTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFRoaXMgc29mdHdhcmUgd2FzIGRldmVsb3BlZCBhcyBhIGNvbXBvbmVudCBvZiB0aGUKKyAqIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0uCisgKiBJdCBpcyBiYXNlZCBvbiBvdGhlciBkZXZpY2UgZHJpdmVycyBhbmQgaW5mb3JtYXRpb24KKyAqIGVpdGhlciB3cml0dGVuIG9yIHN1cHBsaWVkIGJ5OgorICoJQWpheSBCYWtyZSA8YmFrcmVAcGF1bC5ydXRnZXJzLmVkdT4sCisgKglEb25hbGQgQmVja2VyIDxiZWNrZXJAY2VzZGlzLmdzZmMubmFzYS5nb3Y+LAorICoJTG9la2UgQnJlZGVydmVsZCA8TG9la2UuQnJlZGVydmVsZEBVdHJlY2h0Lk5DUi5jb20+LAorICoJQnJlbnQgRWxwaGljayA8YmVscGhpY2tAdXdhdGVybG9vLmNhPiwKKyAqCUFuZGVycyBLbGVtZXRzIDxrbGVtZXRzQGl0Lmt0aC5zZT4sCisgKglWbGFkaW1pciBWLiBLb2xwYWtvdiA8d0BzdGllci5rb2VuaWcucnU+LAorICoJTWFyYyBNZWVydGVucyA8TWFyYy5NZWVydGVuc0BVdHJlY2h0Lk5DUi5jb20+LAorICoJUGF1bGluZSBNaWRkZWxpbmsgPG1pZGRlbGluQHBvbHl3YXJlLmlhZi5ubD4sCisgKglSb2JlcnQgTW9ycmlzIDxydG1AZGFzLmhhcnZhcmQuZWR1PiwKKyAqCUplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4sCisgKglHaXJpc2ggV2VsbGluZyA8d2VsbGluZ0BwYXVsLnJ1dGdlcnMuZWR1PiwKKyAqCUNsYXJrIFdvb2R3b3J0aCA8Y2xhcmtAaGl3YXkxLmV4aXQxMDkuY29tPgorICoJWW9uZ2d1YW5nIFpoYW5nIDx5Z3pAaXNsLmhybC5oYWMuY29tPgorICoKKyAqIFRoYW5rcyBnbyBhbHNvIHRvOgorICoJSmFtZXMgQXNodG9uIDxqYWExMDFAc3lzZW5nLmFudS5lZHUuYXU+LAorICoJQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4sCisgKglBbGxhbiBDcmVpZ2h0b24gPGFsbGFuY0Bjcy51c3lkLmVkdS5hdT4sCisgKglNYXR0aGV3IEdlaWVyIDxtYXR0aGV3QGNzLnVzeWQuZWR1LmF1PiwKKyAqCVJlbW8gZGkgR2lvdmFubmkgPHJlbW9AY3MudXN5ZC5lZHUuYXU+LAorICoJRWNraGFyZCBHcmFoIDxncmFoQHdyY3MxLnVyei51bmktd3VwcGVydGFsLmRlPiwKKyAqCVZpcHVsIEd1cHRhIDx2Z3VwdGFAY3MuYmluZ2hhbXRvbi5lZHU+LAorICoJTWFyayBIYWdhbiA8bWhhZ2FuQHd0Y3Bvc3QuZGF5dG9ub2guTkNSLkNPTT4sCisgKglUaW0gTmljaG9sc29uIDx0aW1AY3MudXN5ZC5lZHUuYXU+LAorICoJSWFuIFBhcmtpbiA8aWFuQGNzLnVzeWQuZWR1LmF1PiwKKyAqCUpvaG4gUm9zZW5iZXJnIDxqb2huckBjcy51c3lkLmVkdS5hdT4sCisgKglHZW9yZ2UgUm9zc2kgPGdlb3JnZUBwaG0uZ292LmF1PiwKKyAqCUFydGh1ciBTY290dCA8YXJ0aHVyQGNzLnVzeWQuZWR1LmF1PiwKKyAqCVN0YW5pc2xhdiBTaW55YWdpbiA8c3Rhc0Bpc2YucnU+CisgKglhbmQgUGV0ZXIgU3RvcmV5IGZvciB0aGVpciBhc3Npc3RhbmNlIGFuZCBhZHZpY2UuCisgKgorICogQWRkaXRpb25hbCBDcmVkaXRzOgorICoKKyAqCU15IGRldmVsb3BtZW50IGhhcyBiZWVuIGRvbmUgaW5pdGlhbGx5IHVuZGVyIERlYmlhbiAxLjEgKExpbnV4IDIuMC54KQorICoJYW5kIG5vdwl1bmRlciBEZWJpYW4gMi4yLCBpbml0aWFsbHkgd2l0aCBhbiBIUCBWZWN0cmEgWFAvNjAsIGFuZCBub3cKKyAqCWFuIEhQIFZlY3RyYSBYUC85MC4KKyAqCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJTVBST1ZFTUVOVFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIEkgcHJvdWRseSBwcmVzZW50OgorICoKKyAqIENoYW5nZXMgbWFkZSBpbiBmaXJzdCBwcmUtcmVsZWFzZToKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gcmVvcmdhbmlzYXRpb24gb2YgdGhlIGNvZGUsIGZ1bmN0aW9uIG5hbWUgY2hhbmdlCisgKgktIGNyZWF0aW9uIG9mIHByaXZhdGUgaGVhZGVyICh3YXZlbGFuLnAuaCkKKyAqCS0gcmVvcmdhbmlzZWQgZGVidWcgbWVzc2FnZXMKKyAqCS0gbW9yZSBjb21tZW50cywgaGlzdG9yeSwgZXRjLgorICoJLSBtbWNfaW5pdDogIGNvbmZpZ3VyZSB0aGUgUFNBIGlmIG5vdCBkb25lCisgKgktIG1tY19pbml0OiAgY29ycmVjdCBkZWZhdWx0IHZhbHVlIG9mIGxldmVsIHRocmVzaG9sZCBmb3IgUENNQ0lBCisgKgktIG1tY19pbml0OiAgMi4wMCBkZXRlY3Rpb24gYmV0dGVyIGNvZGUgZm9yIDIuMDAgaW5pdGlhbGl6YXRpb24KKyAqCS0gYmV0dGVyIGluZm8gYXQgc3RhcnR1cAorICoJLSBJUlEgc2V0dGluZyAobm90ZTogIHRoaXMgc2V0dGluZyBpcyBwZXJtYW5lbnQpCisgKgktIHdhdGNoZG9nOiAgY2hhbmdlIHN0cmF0ZWd5IChhbmQgc29sdmUgbW9kdWxlIHJlbW92YWwgcHJvYmxlbXMpCisgKgktIGFkZCB3aXJlbGVzcyBleHRlbnNpb25zIChpb2N0bCBhbmQgZ2V0X3dpcmVsZXNzX3N0YXRzKQorICoJICBnZXQvc2V0IG53aWQvZnJlcXVlbmN5IG9uIGZseSwgaW5mbyBmb3IgL3Byb2MvbmV0L3dpcmVsZXNzCisgKgktIG1vcmUgd2lyZWxlc3MgZXh0ZW5zaW9uczogIFNFVFNQWSBhbmQgR0VUU1BZCisgKgktIG1ha2Ugd2lyZWxlc3MgZXh0ZW5zaW9ucyBvcHRpb25hbAorICoJLSBwcml2YXRlIGlvY3RsIHRvIHNldC9nZXQgcXVhbGl0eSBhbmQgbGV2ZWwgdGhyZXNob2xkLCBoaXN0b2dyYW0KKyAqCS0gcmVtb3ZlIC9wcm9jL25ldC93YXZlbGFuCisgKgktIHN1cHByZXNzIHVzZWxlc3Mgc3R1ZmYgZnJvbSBscCAobmV0X2xvY2FsKQorICoJLSBrZXJuZWwgMi4xIHN1cHBvcnQgKGNvcHlfdG8vZnJvbV91c2VyIGluc3RlYWQgb2YgbWVtY3B5X3RvL2Zyb21mcykKKyAqCS0gYWRkIG1lc3NhZ2UgbGV2ZWwgKGRlYnVnIHN0dWZmIGluIC92YXIvYWRtL2RlYnVnIGFuZCBlcnJvcnMgbm90CisgKgkgIGRpc3BsYXllZCBhdCBjb25zb2xlIGFuZCBzdGlsbCBpbiAvdmFyL2FkbS9tZXNzYWdlcykKKyAqCS0gbXVsdGkgZGV2aWNlIHN1cHBvcnQKKyAqCS0gc3RhcnQgZml4aW5nIHRoZSBwcm9iZSAoaW5pdCBjb2RlKQorICoJLSBtb3JlIGlubGluZXMKKyAqCS0gbWFuIHBhZ2UKKyAqCS0gbWFueSBvdGhlciBtaW5vciBkZXRhaWxzIGFuZCBjbGVhbnVwcworICoKKyAqIENoYW5nZXMgbWFkZSBpbiBzZWNvbmQgcHJlLXJlbGVhc2U6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBjbGVhbiB1cCBpbml0IGNvZGUgKHByb2JlIGFuZCBtb2R1bGUgaW5pdCkKKyAqCS0gYmV0dGVyIG11bHRpcGxlIGRldmljZSBzdXBwb3J0IChtb2R1bGUpCisgKgktIG5hbWUgYXNzaWdubWVudCAobW9kdWxlKQorICoKKyAqIENoYW5nZXMgbWFkZSBpbiB0aGlyZCBwcmUtcmVsZWFzZToKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gYmUgbW9yZSBjb25zZXJ2YXRpdmUgb24gdGltZXJzCisgKgktIHByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIG11bHRpY2FzdCAoSSBzdGlsbCBsYWNrIHNvbWUgZGV0YWlscykKKyAqCisgKiBDaGFuZ2VzIG1hZGUgaW4gZm91cnRoIHByZS1yZWxlYXNlOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gbXVsdGljYXN0IChyZXZpc2l0ZWQgYW5kIGZpbmlzaGVkKQorICoJLSBhdm9pZCByZXNldCBpbiBzZXRfbXVsdGljYXN0X2xpc3QgKGEgcmVhbGx5IGJpZyBoYWNrKQorICoJICBpZiBzb21lYm9keSBjb3VsZCBhcHBseSB0aGlzIGNvZGUgZm9yIG90aGVyIGk4MjU4NiBiYXNlZCBkcml2ZXJzCisgKgktIHNoYXJlIG9uYm9hcmQgbWVtb3J5IDc1JSBSVSBhbmQgMjUlIENVIChpbnN0ZWFkIG9mIDUwLzUwKQorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAyLjEuMTU6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBjaGFuZ2UgdGhlIGRldGVjdGlvbiBjb2RlIGZvciBtdWx0aSBtYW51ZmFjdHVyZXIgY29kZSBzdXBwb3J0CisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuMS4xNzoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIHVwZGF0ZSB0byB3aXJlbGVzcyBleHRlbnNpb25zIGNoYW5nZXMKKyAqCS0gc2lsbHkgYnVnIGluIGNhcmQgaW5pdGlhbCBjb25maWd1cmF0aW9uIChwc2FfY29uZl9zdGF0dXMpCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuMS4yNyAmIDIuMC4zMDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIHNtYWxsIGJ1ZyBpbiBkZWJ1ZyBjb2RlIChwcm9iYWJseSBub3QgdGhlIGxhc3Qgb25lLi4uKQorICoJLSByZW1vdmUgZXh0ZXJuIGtleXdvcmQgZm9yIHdhdmVsYW5fcHJvYmUoKQorICoJLSBsZXZlbCB0aHJlc2hvbGQgaXMgbm93IGEgc3RhbmRhcmQgd2lyZWxlc3MgZXh0ZW5zaW9uICh2ZXJzaW9uIDQgISkKKyAqCS0gbW9kdWxlcyBwYXJhbWV0ZXJzIHR5cGVzIChuZXcgbW9kdWxlIGludGVyZmFjZSkKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMi4xLjM2OgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gYnl0ZSBjb3VudCBzdGF0cyAoY291cnRlc3kgb2YgRGF2aWQgSGluZHMpCisgKgktIHJlbW92ZSBkZXZfdGludCBzdHVmZiAoY291cnRlc3kgb2YgRGF2aWQgSGluZHMpCisgKgktIGVuY3J5cHRpb24gc2V0dGluZyBmcm9tIEJyZW50IEVscGhpY2sgKHRoYW5rcyBhIGxvdCEpCisgKgktICdpb2FkZHInIHRvICd1X2xvbmcnIGZvciB0aGUgQWxwaGEgKHRoYW5rcyB0byBTdGFuaXNsYXYgU2lueWFnaW4pCisgKgorICogT3RoZXIgY2hhbmdlcyAobm90IGJ5IG1lKSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIFNwZWxsaW5nIGFuZCBncmFtYXIgInJlY3RpZmljYXRpb24iLgorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAyLjAuMzcgJiAyLjIuMiA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gQ29ycmVjdCBzdGF0dXMgaW4gL3Byb2MvbmV0L3dpcmVsZXNzCisgKgktIFNldCBQU0EgQ1JDIHRvIG1ha2UgUHRQIGRpYWdub3N0aWMgdG9vbCBoYXBweSAoQm9iIEdyYXkpCisgKgktIE1vZHVsZSBpbml0IGNvZGUgZG9uJ3QgZmFpbCBpZiB3ZSBmb3VuZCBhdCBsZWFzdCBvbmUgY2FyZCBpbgorICoJICB0aGUgYWRkcmVzcyBsaXN0IChLYXJsaXMgUGVpc2VuaWVrcykKKyAqCS0gTWlzc2luZyBwYXJlbnRoZXNpcyAoQ2hyaXN0b3BoZXIgUGV0ZXJzb24pCisgKgktIENvcnJlY3QgaTgyNTg2IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICoJLSBFbmNyeXB0aW9uIGluaXRpYWxpc2F0aW9uIGJ1ZyAoUm9iZXJ0IE1jQ29ybWFjaykKKyAqCS0gTmV3IG1hYyBhZGRyZXNzZXMgZGV0ZWN0ZWQgaW4gdGhlIHByb2JlCisgKgktIEluY3JlYXNlIHdhdGNoZG9nIGZvciBidXN5IGVudmlyb25tZW50cworICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAyLjAuMzggJiAyLjIuNyA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gQ29ycmVjdCB0aGUgcmVjZXB0aW9uIGxvZ2ljIHRvIGJldHRlciByZXBvcnQgZXJyb3JzIGFuZCBhdm9pZAorICoJICBzZW5kaW5nIGJvZ3VzIHBhY2tldCB1cCB0aGUgc3RhY2sKKyAqCS0gRGVsYXkgUlUgY29uZmlnIHRvIGF2b2lkIGNvcnJ1cHRpbmcgZmlyc3QgcmVjZWl2ZWQgcGFja2V0CisgKgktIENoYW5nZSBjb25maWcgY29tcGxldGlvbiBjb2RlICh0byBhY3R1YWxseSBjaGVjayBzb21ldGhpbmcpCisgKgktIEF2b2lkIHJlYWRpbmcgb3V0IG9mIGJvdW5kIGluIHNrYnVmIHRvIHRyYW5zbWl0CisgKgktIFJlY3RpZnkgYSBsb3Qgb2YgKHVzZWxlc3MpIGRlYnVnZ2luZyBjb2RlCisgKgktIENoYW5nZSB0aGUgd2F5IHRvIGAjaWZkZWYgU0VUX1BTQV9DUkMnCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuMi4xMSAmIDIuMy4xMyA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIENoYW5nZSBlLW1haWwgYW5kIHdlYiBwYWdlIGFkZHJlc3NlcworICoJLSBXYXRjaGRvZyB0aW1lciBpcyBub3cgY29ycmVjdGx5IGV4cHJlc3NlZCBpbiBIWiwgbm90IGluIGppZmZpZXMKKyAqCS0gQWRkIGNoYW5uZWwgbnVtYmVyIHRvIHRoZSBsaXN0IG9mIGZyZXF1ZW5jaWVzIGluIHJhbmdlCisgKgktIEFkZCB0aGUgKHNob3J0KSBsaXN0IG9mIGJpdC1yYXRlcyBpbiByYW5nZQorICoJLSBEZXZlbG9wcCBhIG5ldyBzZW5zaXRpdml0eS4uLiAoc2Vucy52YWx1ZSAmIHNlbnMuZml4ZWQpCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuMi4xNCAmIDIuMy4yMyA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIEZpeCBjaGVjayBmb3Igcm9vdCBwZXJtaXNzaW9uIChicmVhayBpbnN0ZWFkIG9mIGV4aXQpCisgKgktIE5ldyBud2lkICYgZW5jb2Rpbmcgc2V0dGluZyAoV2lyZWxlc3MgRXh0ZW5zaW9uIDkpCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuMy40OSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIEluZGVudGF0aW9uIHJlZm9ybWF0aW5nIChBbGFuKQorICoJLSBVcGRhdGUgdG8gbmV3IG5ldHdvcmsgQVBJIChzb2Z0bmV0IC0gMi4zLjQzKSA6CisgKgkJbyByZXBsYWNlIGRldi0+dGJ1c3kgKEFsYW4pCisgKgkJbyByZXBsYWNlIGRldi0+dHN0YXJ0IChBbGFuKQorICoJCW8gcmVtb3ZlIGRldi0+aW50ZXJydXB0IChBbGFuKQorICoJCW8gYWRkIFNNUCBsb2NraW5nIHZpYSBzcGlubG9jayBpbiBzcGx4eCAobWUpCisgKgkJbyBhZGQgc3BpbmxvY2sgaW4gaW50ZXJydXB0IGhhbmRsZXIgKG1lKQorICoJCW8gdXNlIGtlcm5lbCB3YXRjaGRvZyBpbnN0ZWFkIG9mIG91cnMgKG1lKQorICoJCW8gaW5jcmVhc2Ugd2F0Y2hkb2cgdGltZW91dCAoa2VybmVsIGlzIG1vcmUgc2Vuc2l0aXZlKSAobWUpCisgKgkJbyB2ZXJpZnkgdGhhdCBhbGwgdGhlIGNoYW5nZXMgbWFrZSBzZW5zZSBhbmQgd29yayAobWUpCisgKgktIEZpeHVwIGEgcG90ZW50aWFsIGdvdGNoYSB3aGVuIHJlY29uZmlndXJpbmcgYW5kIHRoaWdodGVuIGEgYml0CisgKgkJdGhlIGludGVyYWN0aW9ucyB3aXRoIFR4IHF1ZXVlLgorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAyLjQuMCA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gRml4IHNwaW5sb2NrIHN0dXBpZCBidWdzIHRoYXQgSSBsZWZ0IGluLiBUaGUgZHJpdmVyIGlzIG5vdyBTTVAKKyAqCQljb21wbGlhbnQgYW5kIGRvZXNuJ3QgbG9ja3VwIGF0IHN0YXJ0dXAuCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuNS4yIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBVc2UgbmV3IGRyaXZlciBBUEkgZm9yIFdpcmVsZXNzIEV4dGVuc2lvbnMgOgorICoJCW8gZ290IHJpZCBvZiB3YXZlbGFuX2lvY3RsKCkKKyAqCQlvIHVzZSBhIGJ1bmNoIG9mIGl3X2hhbmRsZXIgaW5zdGVhZAorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAyLjUuMzUgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBTZXQgZGV2LT50cmFuc19zdGFydCB0byBhdm9pZCBmaWxsaW5nIHRoZSBsb2dzCisgKgktIEhhbmRsZSBiZXR0ZXIgc3B1cmlvdXMvYm9ndXMgaW50ZXJydXB0CisgKgktIEF2b2lkIGRlYWRsb2NrcyBpbiBtbWNfb3V0KCkvbW1jX2luKCkKKyAqCisgKiBXaXNoZXMgJiBkcmVhbXM6CisgKiAtLS0tLS0tLS0tLS0tLS0tCisgKgktIHJvYW1pbmcgKHNlZSBQY21jaWEgZHJpdmVyKQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTkNMVURFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUJPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZQk8bGludXgva2VybmVsLmg+CisjaW5jbHVkZQk8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlCTxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUJPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZQk8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZQk8bGludXgvc3RhdC5oPgorI2luY2x1ZGUJPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUJPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUJPGxpbnV4L2luLmg+CisjaW5jbHVkZQk8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZQk8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlCTxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlCTxhc20vc3lzdGVtLmg+CisjaW5jbHVkZQk8YXNtL2lvLmg+CisjaW5jbHVkZQk8YXNtL2RtYS5oPgorI2luY2x1ZGUJPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZQk8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlCTxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlCTxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUJPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUJPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlCTxsaW51eC90aW1lci5oPgorI2luY2x1ZGUJPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CQkvKiBXaXJlbGVzcyBleHRlbnNpb25zICovCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4JCS8qIFdpcmVsZXNzIGhhbmRsZXJzICovCisKKy8qIFdhdmVMQU4gZGVjbGFyYXRpb25zICovCisjaW5jbHVkZQkiaTgyNTg2LmgiCisjaW5jbHVkZQkid2F2ZWxhbi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogRFJJVkVSIE9QVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogYCNkZWZpbmUnIG9yIGAjdW5kZWYnIHRoZSBmb2xsb3dpbmcgY29uc3RhbnQgdG8gY2hhbmdlIHRoZSBiZWhhdmlvdXIKKyAqIG9mIHRoZSBkcml2ZXIuLi4KKyAqLworI3VuZGVmIFNFVF9QU0FfQ1JDCQkvKiBDYWxjdWxhdGUgYW5kIHNldCB0aGUgQ1JDIG9uIFBTQSAoc2xvd2VyKSAqLworI2RlZmluZSBVU0VfUFNBX0NPTkZJRwkJLyogVXNlIGluZm8gZnJvbSB0aGUgUFNBLiAqLworI3VuZGVmIFNUUlVDVF9DSEVDSwkJLyogVmVyaWZ5IHBhZGRpbmcgb2Ygc3RydWN0dXJlcy4gKi8KKyN1bmRlZiBFRVBST01fSVNfUFJPVEVDVEVECS8qIGRvZXNuJ3Qgc2VlbSB0byBiZSBuZWNlc3NhcnkgKi8KKyNkZWZpbmUgTVVMVElDQVNUX0FWT0lECQkvKiBBdm9pZCBleHRyYSBtdWx0aWNhc3QgKEknbSBzY2VwdGljYWwpLiAqLworI3VuZGVmIFNFVF9NQUNfQUREUkVTUwkJLyogRXhwZXJpbWVudGFsICovCisKKyNpZmRlZiBXSVJFTEVTU19FWFQJLyogSWYgd2lyZWxlc3MgZXh0ZW5zaW9ucyBleGlzdCBpbiB0aGUga2VybmVsICovCisvKiBXYXJuaW5nOiAgdGhpcyBzdHVmZiB3aWxsIHNsb3cgZG93biB0aGUgZHJpdmVyLiAqLworI2RlZmluZSBXSVJFTEVTU19TUFkJCS8qIEVuYWJsZSBzcHlpbmcgYWRkcmVzc2VzLiAqLworI3VuZGVmIEhJU1RPR1JBTQkJLyogRW5hYmxlIGhpc3RvZ3JhbSBvZiBzaWduYWwgbGV2ZWwuICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBERUJVRyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyN1bmRlZiBERUJVR19NT0RVTEVfVFJBQ0UJLyogbW9kdWxlIGluc2VydGlvbi9yZW1vdmFsICovCisjdW5kZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UJLyogY2FsbHMgbWFkZSBieSBMaW51eCAqLworI3VuZGVmIERFQlVHX0lOVEVSUlVQVF9UUkFDRQkvKiBjYWxscyB0byBoYW5kbGVyICovCisjdW5kZWYgREVCVUdfSU5URVJSVVBUX0lORk8JLyogdHlwZSBvZiBpbnRlcnJ1cHQgYW5kIHNvIG9uICovCisjZGVmaW5lIERFQlVHX0lOVEVSUlVQVF9FUlJPUgkvKiBwcm9ibGVtcyAqLworI3VuZGVmIERFQlVHX0NPTkZJR19UUkFDRQkvKiBUcmFjZSB0aGUgY29uZmlnIGZ1bmN0aW9ucy4gKi8KKyN1bmRlZiBERUJVR19DT05GSUdfSU5GTwkvKiB3aGF0J3MgZ29pbmcgb24gKi8KKyNkZWZpbmUgREVCVUdfQ09ORklHX0VSUk9SCS8qIGVycm9ycyBvbiBjb25maWd1cmF0aW9uICovCisjdW5kZWYgREVCVUdfVFhfVFJBQ0UJCS8qIHRyYW5zbWlzc2lvbiBjYWxscyAqLworI3VuZGVmIERFQlVHX1RYX0lORk8JCS8qIGhlYWRlciBvZiB0aGUgdHJhbnNtaXR0ZWQgcGFja2V0ICovCisjdW5kZWYgREVCVUdfVFhfRkFJTAkJLyogTm9ybWFsIGZhaWx1cmUgY29uZGl0aW9ucyAqLworI2RlZmluZSBERUJVR19UWF9FUlJPUgkJLyogVW5leHBlY3RlZCBjb25kaXRpb25zICovCisjdW5kZWYgREVCVUdfUlhfVFJBQ0UJCS8qIHRyYW5zbWlzc2lvbiBjYWxscyAqLworI3VuZGVmIERFQlVHX1JYX0lORk8JCS8qIGhlYWRlciBvZiB0aGUgcmVjZWl2ZWQgcGFja2V0ICovCisjdW5kZWYgREVCVUdfUlhfRkFJTAkJLyogTm9ybWFsIGZhaWx1cmUgY29uZGl0aW9ucyAqLworI2RlZmluZSBERUJVR19SWF9FUlJPUgkJLyogVW5leHBlY3RlZCBjb25kaXRpb25zICovCisKKyN1bmRlZiBERUJVR19QQUNLRVRfRFVNUAkvKiBEdW1wIHBhY2tldCBvbiB0aGUgc2NyZWVuIGlmIGRlZmluZWQgdG8gMzIuICovCisjdW5kZWYgREVCVUdfSU9DVExfVFJBQ0UJLyogbWlzYy4gY2FsbCBieSBMaW51eCAqLworI3VuZGVmIERFQlVHX0lPQ1RMX0lORk8JCS8qIHZhcmlvdXMgZGVidWdnaW5nIGluZm8gKi8KKyNkZWZpbmUgREVCVUdfSU9DVExfRVJST1IJLyogd2hhdCdzIGdvaW5nIHdyb25nICovCisjZGVmaW5lIERFQlVHX0JBU0lDX1NIT1cJLyogU2hvdyBiYXNpYyBzdGFydHVwIGluZm8uICovCisjdW5kZWYgREVCVUdfVkVSU0lPTl9TSE9XCS8qIFByaW50IHZlcnNpb24gaW5mby4gKi8KKyN1bmRlZiBERUJVR19QU0FfU0hPVwkJLyogRHVtcCBQU0EgdG8gc2NyZWVuLiAqLworI3VuZGVmIERFQlVHX01NQ19TSE9XCQkvKiBEdW1wIG1tYyB0byBzY3JlZW4uICovCisjdW5kZWYgREVCVUdfU0hPV19VTlVTRUQJLyogU2hvdyB1bnVzZWQgZmllbGRzIHRvby4gKi8KKyN1bmRlZiBERUJVR19JODI1ODZfU0hPVwkvKiBTaG93IGk4MjU4NiBzdGF0dXMuICovCisjdW5kZWYgREVCVUdfREVWSUNFX1NIT1cJLyogU2hvdyBkZXZpY2UgcGFyYW1ldGVycy4gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBDT05TVEFOVFMgJiBNQUNST1MgKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgREVCVUdfVkVSU0lPTl9TSE9XCitzdGF0aWMgY29uc3QgY2hhcgkqdmVyc2lvbgk9ICJ3YXZlbGFuLmMgOiB2MjQgKFNNUCArIHdpcmVsZXNzIGV4dGVuc2lvbnMpIDExLzEyLzAxXG4iOworI2VuZGlmCisKKy8qIFdhdGNoZG9nIHRlbXBvcmlzYXRpb24gKi8KKyNkZWZpbmUJV0FUQ0hET0dfSklGRklFUwkoNTEyKkhaLzEwMCkKKworLyogTWFjcm8gdG8gZ2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYW4gYXJyYXkgKi8KKyNkZWZpbmUJTkVMUyhhKQkJCQkoc2l6ZW9mKGEpIC8gc2l6ZW9mKGFbMF0pKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUFJJVkFURSBJT0NUTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBTSU9DU0lQUVRIUglTSU9DSVdGSVJTVFBSSVYJCS8qIFNldCBxdWFsaXR5IHRocmVzaG9sZCAqLworI2RlZmluZSBTSU9DR0lQUVRIUglTSU9DSVdGSVJTVFBSSVYgKyAxCS8qIEdldCBxdWFsaXR5IHRocmVzaG9sZCAqLworCisjZGVmaW5lIFNJT0NTSVBISVNUTwlTSU9DSVdGSVJTVFBSSVYgKyAyCS8qIFNldCBoaXN0b2dyYW0gcmFuZ2VzICovCisjZGVmaW5lIFNJT0NHSVBISVNUTwlTSU9DSVdGSVJTVFBSSVYgKyAzCS8qIEdldCBoaXN0b2dyYW0gdmFsdWVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVFlQRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTaG9ydGN1dHMgKi8KK3R5cGVkZWYgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJZW5fc3RhdHM7Cit0eXBlZGVmIHN0cnVjdCBpd19zdGF0aXN0aWNzCWl3X3N0YXRzOwordHlwZWRlZiBzdHJ1Y3QgaXdfcXVhbGl0eQlpd19xdWFsOwordHlwZWRlZiBzdHJ1Y3QgaXdfZnJlcQkJaXdfZnJlcTsKK3R5cGVkZWYgc3RydWN0IG5ldF9sb2NhbAluZXRfbG9jYWw7Cit0eXBlZGVmIHN0cnVjdCB0aW1lcl9saXN0CXRpbWVyX2xpc3Q7CisKKy8qIEJhc2ljIHR5cGVzICovCit0eXBlZGVmIHVfY2hhcgkJbWFjX2FkZHJbV0FWRUxBTl9BRERSX1NJWkVdOwkvKiBIYXJkd2FyZSBhZGRyZXNzICovCisKKy8qCisgKiBTdGF0aWMgc3BlY2lmaWMgZGF0YSBmb3IgdGhlIGludGVyZmFjZS4KKyAqCisgKiBGb3IgZWFjaCBuZXR3b3JrIGludGVyZmFjZSwgTGludXgga2VlcHMgZGF0YSBpbiB0d28gc3RydWN0dXJlczogICJkZXZpY2UiCisgKiBrZWVwcyB0aGUgZ2VuZXJpYyBkYXRhIChzYW1lIGZvcm1hdCBmb3IgZXZlcnlib2R5KSBhbmQgIm5ldF9sb2NhbCIga2VlcHMKKyAqIGFkZGl0aW9uYWwgc3BlY2lmaWMgZGF0YS4KKyAqIE5vdGUgdGhhdCBzb21lIG9mIHRoaXMgc3BlY2lmaWMgZGF0YSBpcyBpbiBmYWN0IGdlbmVyaWMgKGVuX3N0YXRzLCBmb3IKKyAqIGV4YW1wbGUpLgorICovCitzdHJ1Y3QgbmV0X2xvY2FsCit7CisgIG5ldF9sb2NhbCAqCW5leHQ7CQkvKiBsaW5rZWQgbGlzdCBvZiB0aGUgZGV2aWNlcyAqLworICBzdHJ1Y3QgbmV0X2RldmljZSAqCWRldjsJCS8qIHJldmVyc2UgbGluayAqLworICBzcGlubG9ja190CXNwaW5sb2NrOwkvKiBTZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBoYXJkd2FyZSAoU01QKSAqLworICBlbl9zdGF0cwlzdGF0czsJCS8qIEV0aGVybmV0IGludGVyZmFjZSBzdGF0aXN0aWNzICovCisgIGludAkJbnJlc2V0czsJLyogbnVtYmVyIG9mIGhhcmR3YXJlIHJlc2V0cyAqLworICB1X2NoYXIJcmVjb25maWdfODI1ODY7CS8qIFdlIG5lZWQgdG8gcmVjb25maWd1cmUgdGhlIGNvbnRyb2xsZXIuICovCisgIHVfY2hhcglwcm9taXNjdW91czsJLyogcHJvbWlzY3VvdXMgbW9kZSAqLworICBpbnQJCW1jX2NvdW50OwkvKiBudW1iZXIgb2YgbXVsdGljYXN0IGFkZHJlc3NlcyAqLworICB1X3Nob3J0CWhhY3I7CQkvKiBjdXJyZW50IGhvc3QgaW50ZXJmYWNlIHN0YXRlICovCisKKyAgaW50CQl0eF9uX2luX3VzZTsKKyAgdV9zaG9ydAlyeF9oZWFkOworICB1X3Nob3J0CXJ4X2xhc3Q7CisgIHVfc2hvcnQJdHhfZmlyc3RfZnJlZTsKKyAgdV9zaG9ydAl0eF9maXJzdF9pbl91c2U7CisKKyNpZmRlZiBXSVJFTEVTU19FWFQKKyAgaXdfc3RhdHMJd3N0YXRzOwkJLyogV2lyZWxlc3Mtc3BlY2lmaWMgc3RhdGlzdGljcyAqLworCisgIHN0cnVjdCBpd19zcHlfZGF0YQlzcHlfZGF0YTsKKyAgc3RydWN0IGl3X3B1YmxpY19kYXRhCXdpcmVsZXNzX2RhdGE7CisjZW5kaWYKKworI2lmZGVmIEhJU1RPR1JBTQorICBpbnQJCWhpc19udW1iZXI7CQkvKiBudW1iZXIgb2YgaW50ZXJ2YWxzICovCisgIHVfY2hhcgloaXNfcmFuZ2VbMTZdOwkJLyogYm91bmRhcmllcyBvZiBpbnRlcnZhbCBdbi0xOyBuXSAqLworICB1X2xvbmcJaGlzX3N1bVsxNl07CQkvKiBzdW0gaW4gaW50ZXJ2YWwgKi8KKyNlbmRpZgkvKiBISVNUT0dSQU0gKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBST1RPVFlQRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTUlTQy4gU1VCUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdV9jaGFyCisJd3ZfaXJxX3RvX3BzYShpbnQpOworc3RhdGljIGludAorCXd2X3BzYV90b19pcnEodV9jaGFyKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gSE9TVCBBREFQVEVSIFNVQlJPVVRJTkVTIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbmxpbmUgdV9zaG9ydAkJLyogZGF0YSAqLworCWhhc3JfcmVhZCh1X2xvbmcpOwkvKiBSZWFkIHRoZSBob3N0IGludGVyZmFjZTogIGJhc2UgYWRkcmVzcyAqLworc3RhdGljIGlubGluZSB2b2lkCisJaGFjcl93cml0ZSh1X2xvbmcsCS8qIFdyaXRlIHRvIGhvc3QgaW50ZXJmYWNlOiAgYmFzZSBhZGRyZXNzICovCisJCSAgIHVfc2hvcnQpLAkvKiBkYXRhICovCisJaGFjcl93cml0ZV9zbG93KHVfbG9uZywKKwkJICAgdV9zaG9ydCksCisJc2V0X2NoYW5fYXR0bih1X2xvbmcsCS8qIGlvYWRkciAqLworCQkgICAgICB1X3Nob3J0KSwJLyogaGFjciAgICovCisJd3ZfaGFjcl9yZXNldCh1X2xvbmcpLAkvKiBpb2FkZHIgKi8KKwl3dl8xNl9vZmYodV9sb25nLAkvKiBpb2FkZHIgKi8KKwkJICB1X3Nob3J0KSwJLyogaGFjciAgICovCisJd3ZfMTZfb24odV9sb25nLAkvKiBpb2FkZHIgKi8KKwkJIHVfc2hvcnQpLAkvKiBoYWNyICAgKi8KKwl3dl9pbnRzX29mZihzdHJ1Y3QgbmV0X2RldmljZSAqKSwKKwl3dl9pbnRzX29uKHN0cnVjdCBuZXRfZGV2aWNlICopOworLyogLS0tLS0tLS0tLS0tLS0tLS0gTU9ERU0gTUFOQUdFTUVOVCBTVUJST1VUSU5FUyAtLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHZvaWQKKwlwc2FfcmVhZCh1X2xvbmcsCS8qIFJlYWQgdGhlIFBhcmFtZXRlciBTdG9yYWdlIEFyZWEuICovCisJCSB1X3Nob3J0LAkvKiBoYWNyICovCisJCSBpbnQsCQkvKiBvZmZzZXQgaW4gUFNBICovCisJCSB1X2NoYXIgKiwJLyogYnVmZmVyIHRvIGZpbGwgKi8KKwkJIGludCksCQkvKiBzaXplIHRvIHJlYWQgKi8KKwlwc2Ffd3JpdGUodV9sb25nLCAJLyogV3JpdGUgdG8gdGhlIFBTQS4gKi8KKwkJICB1X3Nob3J0LAkvKiBoYWNyICovCisJCSAgaW50LAkJLyogb2Zmc2V0IGluIFBTQSAqLworCQkgIHVfY2hhciAqLAkvKiBidWZmZXIgaW4gbWVtb3J5ICovCisJCSAgaW50KTsJCS8qIGxlbmd0aCBvZiBidWZmZXIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorCW1tY19vdXQodV9sb25nLAkJLyogV3JpdGUgMSBieXRlIHRvIHRoZSBNb2RlbSBNYW5hZyBDb250cm9sLiAqLworCQl1X3Nob3J0LAorCQl1X2NoYXIpLAorCW1tY193cml0ZSh1X2xvbmcsCS8qIFdyaXRlIG4gYnl0ZXMgdG8gdGhlIE1NQy4gKi8KKwkJICB1X2NoYXIsCisJCSAgdV9jaGFyICosCisJCSAgaW50KTsKK3N0YXRpYyBpbmxpbmUgdV9jaGFyCQkvKiBSZWFkIDEgYnl0ZSBmcm9tIHRoZSBNTUMuICovCisJbW1jX2luKHVfbG9uZywKKwkgICAgICAgdV9zaG9ydCk7CitzdGF0aWMgaW5saW5lIHZvaWQKKwltbWNfcmVhZCh1X2xvbmcsCS8qIFJlYWQgbiBieXRlcyBmcm9tIHRoZSBNTUMuICovCisJCSB1X2NoYXIsCisJCSB1X2NoYXIgKiwKKwkJIGludCksCisJZmVlX3dhaXQodV9sb25nLAkvKiBXYWl0IGZvciBmcmVxdWVuY3kgRUVQUk9NOiAgYmFzZSBhZGRyZXNzICovCisJCSBpbnQsCQkvKiBiYXNlIGRlbGF5IHRvIHdhaXQgZm9yICovCisJCSBpbnQpOwkJLyogdGltZSB0byB3YWl0ICovCitzdGF0aWMgdm9pZAorCWZlZV9yZWFkKHVfbG9uZywJLyogUmVhZCB0aGUgZnJlcXVlbmN5IEVFUFJPTTogIGJhc2UgYWRkcmVzcyAqLworCQkgdV9zaG9ydCwJLyogZGVzdGluYXRpb24gb2Zmc2V0ICovCisJCSB1X3Nob3J0ICosCS8qIGRhdGEgYnVmZmVyICovCisJCSBpbnQpOwkJLyogbnVtYmVyIG9mIHJlZ2lzdGVycyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJODI1ODYgU1VCUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyAvKmlubGluZSovIHZvaWQKKwlvYnJhbV9yZWFkKHVfbG9uZywJLyogaW9hZGRyICovCisJCSAgIHVfc2hvcnQsCS8qIG8gKi8KKwkJICAgdV9jaGFyICosCS8qIGIgKi8KKwkJICAgaW50KTsJLyogbiAqLworc3RhdGljIGlubGluZSB2b2lkCisJb2JyYW1fd3JpdGUodV9sb25nLAkvKiBpb2FkZHIgKi8KKwkJICAgIHVfc2hvcnQsCS8qIG8gKi8KKwkJICAgIHVfY2hhciAqLAkvKiBiICovCisJCSAgICBpbnQpOwkvKiBuICovCitzdGF0aWMgdm9pZAorCXd2X2FjayhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbmxpbmUgaW50CisJd3Zfc3luY2hyb25vdXNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICosCisJCQkgICBjb25zdCBjaGFyICopLAorCXd2X2NvbmZpZ19jb21wbGV0ZShzdHJ1Y3QgbmV0X2RldmljZSAqLAorCQkJICAgdV9sb25nLAorCQkJICAgbmV0X2xvY2FsICopOworc3RhdGljIGludAorCXd2X2NvbXBsZXRlKHN0cnVjdCBuZXRfZGV2aWNlICosCisJCSAgICB1X2xvbmcsCisJCSAgICBuZXRfbG9jYWwgKik7CitzdGF0aWMgaW5saW5lIHZvaWQKKwl3dl84MjU4Nl9yZWNvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gREVCVUcgJiBJTkZPIFNVQlJPVVRJTkVTIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZmRlZiBERUJVR19JODI1ODZfU0hPVworc3RhdGljIHZvaWQKKwl3dl9zY2Jfc2hvdyh1bnNpZ25lZCBzaG9ydCk7CisjZW5kaWYKK3N0YXRpYyBpbmxpbmUgdm9pZAorCXd2X2luaXRfaW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogZGlzcGxheSBzdGFydHVwIGluZm8gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gSU9DVEwsIFNUQVRTICYgUkVDT05GSUcgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGVuX3N0YXRzCSoKKwl3YXZlbGFuX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogR2l2ZSBzdGF0cyAvcHJvYy9uZXQvZGV2ICovCitzdGF0aWMgaXdfc3RhdHMgKgorCXdhdmVsYW5fZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICopOworc3RhdGljIHZvaWQKKwl3YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBBQ0tFVCBSRUNFUFRJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorCXd2X3BhY2tldF9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICosCS8qIFJlYWQgYSBwYWNrZXQgZnJvbSBhIGZyYW1lLiAqLworCQkgICAgICAgdV9zaG9ydCwKKwkJICAgICAgIGludCksCisJd3ZfcmVjZWl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogUmVhZCBhbGwgcGFja2V0cyB3YWl0aW5nLiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBBQ0tFVCBUUkFOU01JU1NJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW5saW5lIGludAorCXd2X3BhY2tldF93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqLAkvKiBXcml0ZSBhIHBhY2tldCB0byB0aGUgVHggYnVmZmVyLiAqLworCQkJdm9pZCAqLAorCQkJc2hvcnQpOworc3RhdGljIGludAorCXdhdmVsYW5fcGFja2V0X3htaXQoc3RydWN0IHNrX2J1ZmYgKiwJLyogU2VuZCBhIHBhY2tldC4gKi8KKwkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEhBUkRXQVJFIENPTkZJR1VSQVRJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbmxpbmUgaW50CisJd3ZfbW1jX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKiksCS8qIEluaXRpYWxpemUgdGhlIG1vZGVtLiAqLworCXd2X3J1X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICopLAkvKiBTdGFydCB0aGUgaTgyNTg2IHJlY2VpdmVyIHVuaXQuICovCisJd3ZfY3Vfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKiksCS8qIFN0YXJ0IHRoZSBpODI1ODYgY29tbWFuZCB1bml0LiAqLworCXd2XzgyNTg2X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICopOwkvKiBTdGFydCB0aGUgaTgyNTg2LiAqLworc3RhdGljIHZvaWQKKwl3dl84MjU4Nl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIENvbmZpZ3VyZSB0aGUgaTgyNTg2LiAqLworc3RhdGljIGlubGluZSB2b2lkCisJd3ZfODI1ODZfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0YXRpYyBpbnQKKwl3dl9od19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqKSwJLyogUmVzZXQgdGhlIFdhdmVMQU4gaGFyZHdhcmUuICovCisJd3ZfY2hlY2tfaW9hZGRyKHVfbG9uZywJCS8qIGlvYWRkciAqLworCQkJdV9jaGFyICopOwkvKiBtYWMgYWRkcmVzcyAocmVhZCkgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSU5URVJSVVBUIEhBTkRMSU5HIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorCXdhdmVsYW5faW50ZXJydXB0KGludCwJCS8qIGludGVycnVwdCBoYW5kbGVyICovCisJCQkgIHZvaWQgKiwKKwkJCSAgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgdm9pZAorCXdhdmVsYW5fd2F0Y2hkb2coc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIHRyYW5zbWlzc2lvbiB3YXRjaGRvZyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBDT05GSUdVUkFUSU9OIENBTExCQUNLUyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50CisJd2F2ZWxhbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICopLAkvKiBPcGVuIHRoZSBkZXZpY2UuICovCisJd2F2ZWxhbl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqKSwJLyogQ2xvc2UgdGhlIGRldmljZS4gKi8KKwl3YXZlbGFuX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqLCB1bnNpZ25lZCBzaG9ydCk7LyogQ29uZmlndXJlIG9uZSBkZXZpY2UuICovCitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKndhdmVsYW5fcHJvYmUoaW50IHVuaXQpOwkvKiBTZWUgU3BhY2UuYy4gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogVkFSSUFCTEVTICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUaGlzIGlzIHRoZSByb290IG9mIHRoZSBsaW5rZWQgbGlzdCBvZiBXYXZlTEFOIGRyaXZlcnMKKyAqIEl0IGlzIHVzZSB0byB2ZXJpZnkgdGhhdCB3ZSBkb24ndCByZXVzZSB0aGUgc2FtZSBiYXNlIGFkZHJlc3MKKyAqIGZvciB0d28gZGlmZmVyZW50IGRyaXZlcnMgYW5kIHRvIGNsZWFuIHVwIHdoZW4gcmVtb3ZpbmcgdGhlIG1vZHVsZS4KKyAqLworc3RhdGljIG5ldF9sb2NhbCAqCXdhdmVsYW5fbGlzdAk9IChuZXRfbG9jYWwgKikgTlVMTDsKKworLyoKKyAqIFRoaXMgdGFibGUgaXMgdXNlZCB0byB0cmFuc2xhdGUgdGhlIFBTQSB2YWx1ZSB0byBJUlEgbnVtYmVyCisgKiBhbmQgdmljZSB2ZXJzYS4KKyAqLworc3RhdGljIHVfY2hhcglpcnF2YWxzW10JPQoreworCSAgIDAsICAgIDAsICAgIDAsIDB4MDEsCisJMHgwMiwgMHgwNCwgICAgMCwgMHgwOCwKKwkgICAwLCAgICAwLCAweDEwLCAweDIwLAorCTB4NDAsICAgIDAsICAgIDAsIDB4ODAsCit9OworCisvKgorICogVGFibGUgb2YgdGhlIGF2YWlsYWJsZSBJL08gYWRkcmVzc2VzIChiYXNlIGFkZHJlc3NlcykgZm9yIFdhdmVMQU4KKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0CWlvYmFzZVtdCT0KK3sKKyNpZgkwCisgIC8qIExlYXZlIG91dCAweDNDMCBmb3Igbm93IC0tIHNlZW1zIHRvIGNsYXNoIHdpdGggc29tZSB2aWRlbworICAgKiBjb250cm9sbGVycy4KKyAgICogTGVhdmUgb3V0IHRoZSBvdGhlcnMgdG9vIC0tIHdlIHdpbGwgYWx3YXlzIHVzZSAweDM5MCBhbmQgbGVhdmUKKyAgICogMHgzMDAgZm9yIHRoZSBFdGhlcm5ldCBkZXZpY2UuCisgICAqIEplYW4gSUk6ICAweDNFMCBpcyBmaW5lIGFzIHdlbGwuCisgICAqLworICAweDMwMCwgMHgzOTAsIDB4M0UwLCAweDNDMAorI2VuZGlmCS8qIDAgKi8KKyAgMHgzOTAsIDB4M0UwCit9OworCisjaWZkZWYJTU9EVUxFCisvKiBQYXJhbWV0ZXJzIHNldCBieSBpbnNtb2QgKi8KK3N0YXRpYyBpbnQJaW9bNF07CitzdGF0aWMgaW50CWlycVs0XTsKK3N0YXRpYyBjaGFyCSpuYW1lWzRdOworbW9kdWxlX3BhcmFtX2FycmF5KGlvLCBpbnQsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK21vZHVsZV9wYXJhbV9hcnJheShuYW1lLCBjaGFycCwgTlVMTCwgMCk7CisKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJXYXZlTEFOIEkvTyBiYXNlIGFkZHJlc3MoZXMpLHJlcXVpcmVkIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIldhdmVMQU4gSVJRIG51bWJlcihzKSIpOworTU9EVUxFX1BBUk1fREVTQyhuYW1lLCAiV2F2ZUxBTiBpbnRlcmZhY2UgbmVtZShzKSIpOworI2VuZGlmCS8qIE1PRFVMRSAqLworCisjZW5kaWYJLyogV0FWRUxBTl9QX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzgzMjk3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5jCkBAIC0wLDAgKzEsNDkxNCBAQAorLyoKKyAqCVdhdmVsYW4gUGNtY2lhIGRyaXZlcgorICoKKyAqCQlKZWFuIElJIC0gSFBMQiAnOTYKKyAqCisgKiBSZW9yZ2FuaXNhdGlvbiBhbmQgZXh0ZW5zaW9uIG9mIHRoZSBkcml2ZXIuCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgZm9sbG93LiBTZWUgd2F2ZWxhbl9jcy5wLmggZm9yIGRldGFpbHMuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBBbnRob255IEQuIEpvc2VwaCdzIGNvZGUgYW5kIGFsbCB0aGUgY2hhbmdlcyBoZXJlCisgKiBhcmUgYWxzbyB1bmRlciB0aGUgb3JpZ2luYWwgY29weXJpZ2h0IGJlbG93LgorICoKKyAqIFRoaXMgY29kZSBzdXBwb3J0cyB2ZXJzaW9uIDIuMDAgb2YgV2F2ZUxBTi9QQ01DSUEgY2FyZHMgKDIuNEdIeiksIGFuZAorICogY2FuIHdvcmsgb24gTGludXggMi4wLjM2IHdpdGggc3VwcG9ydCBvZiBEYXZpZCBIaW5kcycgUENNQ0lBIENhcmQgU2VydmljZXMKKyAqCisgKiBKb2UgRmlubmV5IChqb2VAY29tcC5sYW5jcy5hYy51aykgYXQgTGFuY2FzdGVyIFVuaXZlcnNpdHkgaW4gVUsgYWRkZWQKKyAqIGNyaXRpY2FsIGNvZGUgaW4gdGhlIHJvdXRpbmUgdG8gaW5pdGlhbGl6ZSB0aGUgTW9kZW0gTWFuYWdlbWVudCBDb250cm9sbGVyLgorICoKKyAqIFRoYW5rcyB0byBBbGFuIENveCBhbmQgQnJ1Y2UgSmFuc29uIGZvciB0aGVpciBhZHZpY2UuCisgKgorICoJLS0gWXVuemhvdSBMaSAoc2NpcDQxNjZAbnVzLnNnKQorICoKKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkcJCisgKiBSb2FtaW5nIHN1cHBvcnQgYWRkZWQgMDcvMjIvOTggYnkgSnVzdGluIFNlZ2VyIChqc2VnZXJAbWVkaWEubWl0LmVkdSkKKyAqIGJhc2VkIG9uIHBhdGNoIGJ5IEpvZSBGaW5uZXkgZnJvbSBMYW5jYXN0ZXIgVW5pdmVyc2l0eS4KKyNlbmRpZgorICoKKyAqIEx1Y2VudCAoZm9ybWVybHkgQVQmVCBHSVMsIGZvcm1lcmx5IE5DUikgV2F2ZUxBTiBQQ01DSUEgY2FyZDogQW4KKyAqIEV0aGVybmV0LWxpa2UgcmFkaW8gdHJhbnNjZWl2ZXIgY29udHJvbGxlZCBieSBhbiBJbnRlbCA4MjU5MyBjb3Byb2Nlc3Nvci4KKyAqCisgKiAgIEEgbm9uLXNoYXJlZCBtZW1vcnkgUENNQ0lBIGV0aGVybmV0IGRyaXZlciBmb3IgbGludXgKKyAqCisgKiBJU0EgdmVyc2lvbiBtb2RpZmllZCB0byBzdXBwb3J0IFBDTUNJQSBieSBBbnRob255IEpvc2VwaCAoYWRqQGxjcy5taXQuZWR1KQorICoKKyAqCisgKiBKb3NlcGggTydTdWxsaXZhbiAmIEpvaG4gTGFuZ2ZvcmQgKGpvc3VsbHZuQGNzLmNtdS5lZHUgJiBqY2xAY3MuY211LmVkdSkKKyAqCisgKiBBcHIgMiAnOTggIG1hZGUgY2hhbmdlcyB0byBicmluZyB0aGUgaTgyNTkzIGNvbnRyb2wvaW50IGhhbmRsaW5nIGluIGxpbmUKKyAqICAgICAgICAgICAgIHdpdGggb2ZmaWNhbCBzcGVjcy4uLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIENvcHlyaWdodCAxOTk1CisgKiAgIEFudGhvbnkgRC4gSm9zZXBoCisgKiAgIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyAqCisgKiAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgcHJvZ3JhbQorICogICBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZAorICogICB0aGF0IHRoaXMgY29weXJpZ2h0IGFuZCBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgb24gYWxsIGNvcGllcworICogICBhbmQgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCB0aGUgbmFtZSBvZiBNLkkuVC4gbm90IGJlIHVzZWQKKyAqICAgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQorICogICBwcm9ncmFtIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IgcGVybWlzc2lvbiwgYW5kIG5vdGljZSBiZSBnaXZlbgorICogICBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24gdGhhdCBjb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gaXMKKyAqICAgYnkgcGVybWlzc2lvbiBvZiBNLkkuVC4gIE0uSS5ULiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQKKyAqICAgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvLQorICogICB2aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LiAgICAgICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKi8KKworLyogRG8gKk5PVCogYWRkIG90aGVyIGhlYWRlcnMgaGVyZSwgeW91IGFyZSBndWFyYW50ZWVkIHRvIGJlIHdyb25nIC0gSmVhbiBJSSAqLworI2luY2x1ZGUgIndhdmVsYW5fY3MucC5oIgkJLyogUHJpdmF0ZSBoZWFkZXIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogTUlTQyBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBTdWJyb3V0aW5lcyB3aGljaCB3b24ndCBmaXQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgY2F0ZWdvcnkKKyAqICh3YXZlbGFuIG1vZGVtIG9yIGk4MjU5MykKKyAqLworCisjaWZkZWYgU1RSVUNUX0NIRUNLCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU2FuaXR5IHJvdXRpbmUgdG8gdmVyaWZ5IHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBXYXZlTEFOIGludGVyZmFjZQorICogc3RydWN0dXJlcy4KKyAqLworc3RhdGljIGNoYXIgKgord3Zfc3RydWN0dWN0X2NoZWNrKHZvaWQpCit7CisjZGVmaW5lCVNDKHQscyxuKQlpZiAoc2l6ZW9mKHQpICE9IHMpIHJldHVybihuKTsKKworICBTQyhwc2FfdCwgUFNBX1NJWkUsICJwc2FfdCIpOworICBTQyhtbXdfdCwgTU1XX1NJWkUsICJtbXdfdCIpOworICBTQyhtbXJfdCwgTU1SX1NJWkUsICJtbXJfdCIpOworCisjdW5kZWYJU0MKKworICByZXR1cm4oKGNoYXIgKikgTlVMTCk7Cit9IC8qIHd2X3N0cnVjdHVjdF9jaGVjayAqLworI2VuZGlmCS8qIFNUUlVDVF9DSEVDSyAqLworCisvKioqKioqKioqKioqKioqKioqKiBNT0RFTSBNQU5BR0VNRU5UIFNVQlJPVVRJTkVTICoqKioqKioqKioqKioqKioqKiovCisvKgorICogVXNlZnVsIHN1YnJvdXRpbmVzIHRvIG1hbmFnZSB0aGUgbW9kZW0gb2YgdGhlIHdhdmVsYW4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUmVhZCBmcm9tIGNhcmQncyBIb3N0IEFkYXB0b3IgU3RhdHVzIFJlZ2lzdGVyLgorICovCitzdGF0aWMgaW5saW5lIHVfY2hhcgoraGFzcl9yZWFkKHVfbG9uZwliYXNlKQoreworICByZXR1cm4oaW5iKEhBU1IoYmFzZSkpKTsKK30gLyogaGFzcl9yZWFkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXcml0ZSB0byBjYXJkJ3MgSG9zdCBBZGFwdGVyIENvbW1hbmQgUmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAoraGFjcl93cml0ZSh1X2xvbmcJYmFzZSwKKwkgICB1X2NoYXIJaGFjcikKK3sKKyAgb3V0YihoYWNyLCBIQUNSKGJhc2UpKTsKK30gLyogaGFjcl93cml0ZSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV3JpdGUgdG8gY2FyZCdzIEhvc3QgQWRhcHRlciBDb21tYW5kIFJlZ2lzdGVyLiBJbmNsdWRlIGEgZGVsYXkgZm9yCisgKiB0aG9zZSB0aW1lcyB3aGVuIGl0IGlzIG5lZWRlZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitoYWNyX3dyaXRlX3Nsb3codV9sb25nCWJhc2UsCisJCXVfY2hhcgloYWNyKQoreworICBoYWNyX3dyaXRlKGJhc2UsIGhhY3IpOworICAvKiBkZWxheSBtaWdodCBvbmx5IGJlIG5lZWRlZCBzb21ldGltZXMgKi8KKyAgbWRlbGF5KDEpOworfSAvKiBoYWNyX3dyaXRlX3Nsb3cgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJlYWQgdGhlIFBhcmFtZXRlciBTdG9yYWdlIEFyZWEgZnJvbSB0aGUgV2F2ZUxBTiBjYXJkJ3MgbWVtb3J5CisgKi8KK3N0YXRpYyB2b2lkCitwc2FfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkgaW50CQlvLAkvKiBvZmZzZXQgaW4gUFNBICovCisJIHVfY2hhciAqCWIsCS8qIGJ1ZmZlciB0byBmaWxsICovCisJIGludAkJbikJLyogc2l6ZSB0byByZWFkICovCit7CisgIG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICB1X2NoYXIgX19pb21lbSAqcHRyID0gbHAtPm1lbSArIFBTQV9BRERSICsgKG8gPDwgMSk7CisKKyAgd2hpbGUobi0tID4gMCkKKyAgICB7CisgICAgICAqYisrID0gcmVhZGIocHRyKTsKKyAgICAgIC8qIER1ZSB0byBhIGxhY2sgb2YgYWRkcmVzcyBkZWNvZGUgcGlucywgdGhlIFdhdmVMQU4gUENNQ0lBIGNhcmQKKyAgICAgICAqIG9ubHkgc3VwcG9ydHMgcmVhZGluZyBldmVuIG1lbW9yeSBhZGRyZXNzZXMuIFRoYXQgbWVhbnMgdGhlCisgICAgICAgKiBpbmNyZW1lbnQgaGVyZSBNVVNUIGJlIHR3by4KKyAgICAgICAqIEJlY2F1c2Ugb2YgdGhhdCwgd2UgY2FuJ3QgdXNlIG1lbWNweV9mcm9taW8oKS4uLgorICAgICAgICovCisgICAgICBwdHIgKz0gMjsKKyAgICB9Cit9IC8qIHBzYV9yZWFkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXcml0ZSB0aGUgUGFyYW10ZXIgU3RvcmFnZSBBcmVhIHRvIHRoZSBXYXZlTEFOIGNhcmQncyBtZW1vcnkKKyAqLworc3RhdGljIHZvaWQKK3BzYV93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkgIGludAkJbywJLyogT2Zmc2V0IGluIHBzYSAqLworCSAgdV9jaGFyICoJYiwJLyogQnVmZmVyIGluIG1lbW9yeSAqLworCSAgaW50CQluKQkvKiBMZW5ndGggb2YgYnVmZmVyICovCit7CisgIG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICB1X2NoYXIgX19pb21lbSAqcHRyID0gbHAtPm1lbSArIFBTQV9BRERSICsgKG8gPDwgMSk7CisgIGludAkJY291bnQgPSAwOworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgLyogQXMgdGhlcmUgc2VlbSB0byBoYXZlIG5vIGZsYWcgUFNBX0JVU1kgYXMgaW4gdGhlIElTQSBtb2RlbCwgd2UgYXJlCisgICAqIG9ibGlnZSB0byB2ZXJpZnkgdGhpcyBhZGRyZXNzIHRvIGtub3cgd2hlbiB0aGUgUFNBIGlzIHJlYWR5Li4uICovCisgIHZvbGF0aWxlIHVfY2hhciBfX2lvbWVtICp2ZXJpZnkgPSBscC0+bWVtICsgUFNBX0FERFIgKworICAgIChwc2FvZmYoMCwgcHNhX2NvbXBfbnVtYmVyKSA8PCAxKTsKKworICAvKiBBdXRob3JpemUgd3JpdHRpbmcgdG8gUFNBICovCisgIGhhY3Jfd3JpdGUoYmFzZSwgSEFDUl9QV1JfU1RBVCB8IEhBQ1JfUk9NX1dFTik7CisKKyAgd2hpbGUobi0tID4gMCkKKyAgICB7CisgICAgICAvKiB3cml0ZSB0byBQU0EgKi8KKyAgICAgIHdyaXRlYigqYisrLCBwdHIpOworICAgICAgcHRyICs9IDI7CisKKyAgICAgIC8qIEkgZG9uJ3QgaGF2ZSB0aGUgc3BlYywgc28gSSBkb24ndCBrbm93IHdoYXQgdGhlIGNvcnJlY3QKKyAgICAgICAqIHNlcXVlbmNlIHRvIHdyaXRlIGlzLiBUaGlzIGhhY2sgc2VlbSB0byB3b3JrIGZvciBtZS4uLiAqLworICAgICAgY291bnQgPSAwOworICAgICAgd2hpbGUoKHJlYWRiKHZlcmlmeSkgIT0gUFNBX0NPTVBfUENNQ0lBXzkxNSkgJiYgKGNvdW50KysgPCAxMDApKQorCW1kZWxheSgxKTsKKyAgICB9CisKKyAgLyogUHV0IHRoZSBob3N0IGludGVyZmFjZSBiYWNrIGluIHN0YW5kYXJkIHN0YXRlICovCisgIGhhY3Jfd3JpdGUoYmFzZSwgSEFDUl9ERUZBVUxUKTsKK30gLyogcHNhX3dyaXRlICovCisKKyNpZmRlZiBTRVRfUFNBX0NSQworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIENhbGN1bGF0ZSB0aGUgUFNBIENSQworICogVGhhbmtzIHRvIFZhbHN0ZXIsIE5pY28gPE5WQUxTVEVSQHdjbmQubmwubHVjZW50LmNvbT4gZm9yIHRoZSBjb2RlCisgKiBOT1RFOiBCeSBzcGVjaWZ5aW5nIGEgbGVuZ3RoIGluY2x1ZGluZyB0aGUgQ1JDIHBvc2l0aW9uIHRoZQorICogcmV0dXJuZWQgdmFsdWUgc2hvdWxkIGJlIHplcm8uIChpLmUuIGEgY29ycmVjdCBjaGVja3N1bSBpbiB0aGUgUFNBKQorICoKKyAqIFRoZSBXaW5kb3dzIGRyaXZlcnMgZG9uJ3QgdXNlIHRoZSBDUkMsIGJ1dCB0aGUgQVAgYW5kIHRoZSBQdFAgdG9vbAorICogZGVwZW5kIG9uIGl0LgorICovCitzdGF0aWMgdV9zaG9ydAorcHNhX2NyYyh1bnNpZ25lZCBjaGFyICoJcHNhLAkvKiBUaGUgUFNBICovCisJaW50CQlzaXplKQkvKiBOdW1iZXIgb2Ygc2hvcnQgZm9yIENSQyAqLworeworICBpbnQJCWJ5dGVfY250OwkvKiBMb29wIG9uIHRoZSBQU0EgKi8KKyAgdV9zaG9ydAljcmNfYnl0ZXMgPSAwOwkvKiBEYXRhIGluIHRoZSBQU0EgKi8KKyAgaW50CQliaXRfY250OwkvKiBMb29wIG9uIHRoZSBiaXRzIG9mIHRoZSBzaG9ydCAqLworCisgIGZvcihieXRlX2NudCA9IDA7IGJ5dGVfY250IDwgc2l6ZTsgYnl0ZV9jbnQrKyApCisgICAgeworICAgICAgY3JjX2J5dGVzIF49IHBzYVtieXRlX2NudF07CS8qIEl0cyBhbiB4b3IgKi8KKworICAgICAgZm9yKGJpdF9jbnQgPSAxOyBiaXRfY250IDwgOTsgYml0X2NudCsrICkKKwl7CisJICBpZihjcmNfYnl0ZXMgJiAweDAwMDEpCisJICAgIGNyY19ieXRlcyA9IChjcmNfYnl0ZXMgPj4gMSkgXiAweEEwMDE7CisJICBlbHNlCisJICAgIGNyY19ieXRlcyA+Pj0gMSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIGNyY19ieXRlczsKK30gLyogcHNhX2NyYyAqLworI2VuZGlmCS8qIFNFVF9QU0FfQ1JDICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiB1cGRhdGUgdGhlIGNoZWNrc3VtIGZpZWxkIGluIHRoZSBXYXZlbGFuJ3MgUFNBCisgKi8KK3N0YXRpYyB2b2lkCit1cGRhdGVfcHNhX2NoZWNrc3VtKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworI2lmZGVmIFNFVF9QU0FfQ1JDCisgIHBzYV90CQlwc2E7CisgIHVfc2hvcnQJY3JjOworCisgIC8qIHJlYWQgdGhlIHBhcmFtZXRlciBzdG9yYWdlIGFyZWEgKi8KKyAgcHNhX3JlYWQoZGV2LCAwLCAodW5zaWduZWQgY2hhciAqKSAmcHNhLCBzaXplb2YocHNhKSk7CisKKyAgLyogdXBkYXRlIHRoZSBjaGVja3N1bSAqLworICBjcmMgPSBwc2FfY3JjKCh1bnNpZ25lZCBjaGFyICopICZwc2EsCisJCXNpemVvZihwc2EpIC0gc2l6ZW9mKHBzYS5wc2FfY3JjWzBdKSAtIHNpemVvZihwc2EucHNhX2NyY1sxXSkKKwkJLSBzaXplb2YocHNhLnBzYV9jcmNfc3RhdHVzKSk7CisKKyAgcHNhLnBzYV9jcmNbMF0gPSBjcmMgJiAweEZGOworICBwc2EucHNhX2NyY1sxXSA9IChjcmMgJiAweEZGMDApID4+IDg7CisKKyAgLyogV3JpdGUgaXQgISAqLworICBwc2Ffd3JpdGUoZGV2LCAoY2hhciAqKSZwc2EucHNhX2NyYyAtIChjaGFyICopJnBzYSwKKwkgICAgKHVuc2lnbmVkIGNoYXIgKikmcHNhLnBzYV9jcmMsIDIpOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworICBwcmludGsgKEtFUk5fREVCVUcgIiVzOiB1cGRhdGVfcHNhX2NoZWNrc3VtKCk6IGNyYyA9IDB4JTAyeCUwMnhcbiIsCisgICAgICAgICAgZGV2LT5uYW1lLCBwc2EucHNhX2NyY1swXSwgcHNhLnBzYV9jcmNbMV0pOworCisgIC8qIENoZWNrIGFnYWluIChsdXh1cnkgISkgKi8KKyAgY3JjID0gcHNhX2NyYygodW5zaWduZWQgY2hhciAqKSAmcHNhLAorCQkgc2l6ZW9mKHBzYSkgLSBzaXplb2YocHNhLnBzYV9jcmNfc3RhdHVzKSk7CisKKyAgaWYoY3JjICE9IDApCisgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVwZGF0ZV9wc2FfY2hlY2tzdW0oKTogQ1JDIGRvZXMgbm90IGFncmVlIHdpdGggUFNBIGRhdGEgKGV2ZW4gYWZ0ZXIgcmVjYWxjdWxhdGluZylcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYgLyogREVCVUdfSU9DVExfSU5GTyAqLworI2VuZGlmCS8qIFNFVF9QU0FfQ1JDICovCit9IC8qIHVwZGF0ZV9wc2FfY2hlY2tzdW0gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyaXRlIDEgYnl0ZSB0byB0aGUgTU1DLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK21tY19vdXQodV9sb25nCQliYXNlLAorCXVfc2hvcnQJCW8sCisJdV9jaGFyCQlkKQoreworICBpbnQgY291bnQgPSAwOworCisgIC8qIFdhaXQgZm9yIE1NQyB0byBnbyBpZGxlICovCisgIHdoaWxlKChjb3VudCsrIDwgMTAwKSAmJiAoaW5iKEhBU1IoYmFzZSkpICYgSEFTUl9NTUlfQlVTWSkpCisgICAgdWRlbGF5KDEwKTsKKworICBvdXRiKCh1X2NoYXIpKChvIDw8IDEpIHwgTU1SX01NSV9XUiksIE1NUihiYXNlKSk7CisgIG91dGIoZCwgTU1EKGJhc2UpKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJvdXRpbmUgdG8gd3JpdGUgYnl0ZXMgdG8gdGhlIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlci4KKyAqIFdlIHN0YXJ0IGJ5IHRoZSBlbmQgYmVjYXVzZSBpdCBpcyB0aGUgd2F5IGl0IHNob3VsZCBiZSAhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbW1jX3dyaXRlKHVfbG9uZwliYXNlLAorCSAgdV9jaGFyCW8sCisJICB1X2NoYXIgKgliLAorCSAgaW50CQluKQoreworICBvICs9IG47CisgIGIgKz0gbjsKKworICB3aGlsZShuLS0gPiAwICkKKyAgICBtbWNfb3V0KGJhc2UsIC0tbywgKigtLWIpKTsKK30gLyogbW1jX3dyaXRlICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSZWFkIDEgYnl0ZSBmcm9tIHRoZSBNTUMuCisgKiBPcHRpbWlzZWQgdmVyc2lvbiBmb3IgMSBieXRlLCBhdm9pZCB1c2luZyBtZW1vcnkuLi4KKyAqLworc3RhdGljIGlubGluZSB1X2NoYXIKK21tY19pbih1X2xvbmcJYmFzZSwKKyAgICAgICB1X3Nob3J0CW8pCit7CisgIGludCBjb3VudCA9IDA7CisKKyAgd2hpbGUoKGNvdW50KysgPCAxMDApICYmIChpbmIoSEFTUihiYXNlKSkgJiBIQVNSX01NSV9CVVNZKSkKKyAgICB1ZGVsYXkoMTApOworICBvdXRiKG8gPDwgMSwgTU1SKGJhc2UpKTsJCS8qIFNldCB0aGUgcmVhZCBhZGRyZXNzICovCisKKyAgb3V0YigwLCBNTUQoYmFzZSkpOwkJCS8qIFJlcXVpcmVkIGR1bW15IHdyaXRlICovCisKKyAgd2hpbGUoKGNvdW50KysgPCAxMDApICYmIChpbmIoSEFTUihiYXNlKSkgJiBIQVNSX01NSV9CVVNZKSkKKyAgICB1ZGVsYXkoMTApOworICByZXR1cm4gKHVfY2hhcikgKGluYihNTUQoYmFzZSkpKTsJLyogTm93IGRvIHRoZSBhY3R1YWwgcmVhZCAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUm91dGluZSB0byByZWFkIGJ5dGVzIGZyb20gdGhlIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlci4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBjb21wbGljYXRlZCBieSBhIGxhY2sgb2YgYWRkcmVzcyBsaW5lcywKKyAqIHdoaWNoIHByZXZlbnRzIGRlY29kaW5nIG9mIHRoZSBsb3ctb3JkZXIgYml0LgorICogKGNvZGUgaGFzIGp1c3QgYmVlbiBtb3ZlZCBpbiB0aGUgYWJvdmUgZnVuY3Rpb24pCisgKiBXZSBzdGFydCBieSB0aGUgZW5kIGJlY2F1c2UgaXQgaXMgdGhlIHdheSBpdCBzaG91bGQgYmUgIQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK21tY19yZWFkKHVfbG9uZwkJYmFzZSwKKwkgdV9jaGFyCQlvLAorCSB1X2NoYXIgKgliLAorCSBpbnQJCW4pCit7CisgIG8gKz0gbjsKKyAgYiArPSBuOworCisgIHdoaWxlKG4tLSA+IDApCisgICAgKigtLWIpID0gbW1jX2luKGJhc2UsIC0tbyk7Cit9IC8qIG1tY19yZWFkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBHZXQgdGhlIHR5cGUgb2YgZW5jcnlwdGlvbiBhdmFpbGFibGUuLi4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK21tY19lbmNyKHVfbG9uZwkJYmFzZSkJLyogaS9vIHBvcnQgb2YgdGhlIGNhcmQgKi8KK3sKKyAgaW50CXRlbXA7CisKKyAgdGVtcCA9IG1tY19pbihiYXNlLCBtbXJvZmYoMCwgbW1yX2Rlc19hdmFpbCkpOworICBpZigodGVtcCAhPSBNTVJfREVTX0FWQUlMX0RFUykgJiYgKHRlbXAgIT0gTU1SX0RFU19BVkFJTF9BRVMpKQorICAgIHJldHVybiAwOworICBlbHNlCisgICAgcmV0dXJuIHRlbXA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXYWl0IGZvciB0aGUgZnJlcXVlbmN5IEVFcHJvbSB0byBjb21wbGV0ZSBhIGNvbW1hbmQuLi4KKyAqIEkgaG9wZSB0aGlzIG9uZSB3aWxsIGJlIG9wdGltYWxseSBpbmxpbmVkLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZmVlX3dhaXQodV9sb25nCQliYXNlLAkvKiBpL28gcG9ydCBvZiB0aGUgY2FyZCAqLworCSBpbnQJCWRlbGF5LAkvKiBCYXNlIGRlbGF5IHRvIHdhaXQgZm9yICovCisJIGludAkJbnVtYmVyKQkvKiBOdW1iZXIgb2YgdGltZSB0byB3YWl0ICovCit7CisgIGludAkJY291bnQgPSAwOwkvKiBXYWl0IG9ubHkgYSBsaW1pdGVkIHRpbWUgKi8KKworICB3aGlsZSgoY291bnQrKyA8IG51bWJlcikgJiYKKwkobW1jX2luKGJhc2UsIG1tcm9mZigwLCBtbXJfZmVlX3N0YXR1cykpICYgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpCisgICAgdWRlbGF5KGRlbGF5KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJlYWQgYnl0ZXMgZnJvbSB0aGUgRnJlcXVlbmN5IEVFcHJvbSAoZnJlcXVlbmN5IHNlbGVjdCBjYXJkcykuCisgKi8KK3N0YXRpYyB2b2lkCitmZWVfcmVhZCh1X2xvbmcJCWJhc2UsCS8qIGkvbyBwb3J0IG9mIHRoZSBjYXJkICovCisJIHVfc2hvcnQJbywJLyogZGVzdGluYXRpb24gb2Zmc2V0ICovCisJIHVfc2hvcnQgKgliLAkvKiBkYXRhIGJ1ZmZlciAqLworCSBpbnQJCW4pCS8qIG51bWJlciBvZiByZWdpc3RlcnMgKi8KK3sKKyAgYiArPSBuOwkJLyogUG9zaXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgYXJlYSAqLworCisgIC8qIFdyaXRlIHRoZSBhZGRyZXNzICovCisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIG8gKyBuIC0gMSk7CisKKyAgLyogTG9vcCBvbiBhbGwgYnVmZmVyICovCisgIHdoaWxlKG4tLSA+IDApCisgICAgeworICAgICAgLyogV3JpdGUgdGhlIHJlYWQgY29tbWFuZCAqLworICAgICAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1JFQUQpOworCisgICAgICAvKiBXYWl0IHVudGlsIEVFcHJvbSBpcyByZWFkeSAoc2hvdWxkIGJlIHF1aWNrICEpICovCisgICAgICBmZWVfd2FpdChiYXNlLCAxMCwgMTAwKTsKKworICAgICAgLyogUmVhZCB0aGUgdmFsdWUgKi8KKyAgICAgICotLWIgPSAoKG1tY19pbihiYXNlLCBtbXJvZmYoMCwgbW1yX2ZlZV9kYXRhX2gpKSA8PCA4KSB8CisJICAgICAgbW1jX2luKGJhc2UsIG1tcm9mZigwLCBtbXJfZmVlX2RhdGFfbCkpKTsKKyAgICB9Cit9CisKKyNpZmRlZiBXSVJFTEVTU19FWFQJLyogSWYgd2lyZWxlc3MgZXh0ZW5zaW9uIGV4aXN0IGluIHRoZSBrZXJuZWwgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdyaXRlIGJ5dGVzIGZyb20gdGhlIEZyZXF1ZW5jeSBFRXByb20gKGZyZXF1ZW5jeSBzZWxlY3QgY2FyZHMpLgorICogVGhpcyBpcyBhIGJpdCBjb21wbGljYXRlZCwgYmVjYXVzZSB0aGUgZnJlcXVlbmN5IGVlcHJvbSBoYXMgdG8KKyAqIGJlIHVucHJvdGVjdGVkIGFuZCB0aGUgd3JpdGUgZW5hYmxlZC4KKyAqIEplYW4gSUkKKyAqLworc3RhdGljIHZvaWQKK2ZlZV93cml0ZSh1X2xvbmcJYmFzZSwJLyogaS9vIHBvcnQgb2YgdGhlIGNhcmQgKi8KKwkgIHVfc2hvcnQJbywJLyogZGVzdGluYXRpb24gb2Zmc2V0ICovCisJICB1X3Nob3J0ICoJYiwJLyogZGF0YSBidWZmZXIgKi8KKwkgIGludAkJbikJLyogbnVtYmVyIG9mIHJlZ2lzdGVycyAqLworeworICBiICs9IG47CQkvKiBQb3NpdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBhcmVhICovCisKKyNpZmRlZiBFRVBST01fSVNfUFJPVEVDVEVECS8qIGRpc2FibGVkICovCisjaWZkZWYgRE9FU05UX1NFRU1fVE9fV09SSwkvKiBkaXNhYmxlZCAqLworICAvKiBBc2sgdG8gcmVhZCB0aGUgcHJvdGVjdGVkIHJlZ2lzdGVyICovCisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfY3RybCksIE1NV19GRUVfQ1RSTF9QUlJFQUQpOworCisgIGZlZV93YWl0KGJhc2UsIDEwLCAxMDApOworCisgIC8qIFJlYWQgdGhlIHByb3RlY3RlZCByZWdpc3RlciAqLworICBwcmludGsoIlByb3RlY3RlZCAyIDogJTAyWC0lMDJYXG4iLAorCSBtbWNfaW4oYmFzZSwgbW1yb2ZmKDAsIG1tcl9mZWVfZGF0YV9oKSksCisJIG1tY19pbihiYXNlLCBtbXJvZmYoMCwgbW1yX2ZlZV9kYXRhX2wpKSk7CisjZW5kaWYJLyogRE9FU05UX1NFRU1fVE9fV09SSyAqLworCisgIC8qIEVuYWJsZSBwcm90ZWN0ZWQgcmVnaXN0ZXIgKi8KKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgTU1XX0ZFRV9BRERSX0VOKTsKKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1BSRU4pOworCisgIGZlZV93YWl0KGJhc2UsIDEwLCAxMDApOworCisgIC8qIFVucHJvdGVjdCBhcmVhICovCisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIG8gKyBuKTsKKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1BSV1JJVEUpOworI2lmZGVmIERPRVNOVF9TRUVNX1RPX1dPUksJLyogZGlzYWJsZWQgKi8KKyAgLyogT3IgdXNlIDogKi8KKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1BSQ0xFQVIpOworI2VuZGlmCS8qIERPRVNOVF9TRUVNX1RPX1dPUksgKi8KKworICBmZWVfd2FpdChiYXNlLCAxMCwgMTAwKTsKKyNlbmRpZgkvKiBFRVBST01fSVNfUFJPVEVDVEVEICovCisKKyAgLyogV3JpdGUgZW5hYmxlICovCisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIE1NV19GRUVfQUREUl9FTik7CisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfY3RybCksIE1NV19GRUVfQ1RSTF9XUkVOKTsKKworICBmZWVfd2FpdChiYXNlLCAxMCwgMTAwKTsKKworICAvKiBXcml0ZSB0aGUgRUVwcm9tIGFkZHJlc3MgKi8KKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9hZGRyKSwgbyArIG4gLSAxKTsKKworICAvKiBMb29wIG9uIGFsbCBidWZmZXIgKi8KKyAgd2hpbGUobi0tID4gMCkKKyAgICB7CisgICAgICAvKiBXcml0ZSB0aGUgdmFsdWUgKi8KKyAgICAgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfZGF0YV9oKSwgKCotLWIpID4+IDgpOworICAgICAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9kYXRhX2wpLCAqYiAmIDB4RkYpOworCisgICAgICAvKiBXcml0ZSB0aGUgd3JpdGUgY29tbWFuZCAqLworICAgICAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1dSSVRFKTsKKworICAgICAgLyogV2F2ZWxhbiBkb2Mgc2F5cyA6IHdhaXQgYXQgbGVhc3QgMTAgbXMgZm9yIEVFQlVTWSA9IDAgKi8KKyAgICAgIG1kZWxheSgxMCk7CisgICAgICBmZWVfd2FpdChiYXNlLCAxMCwgMTAwKTsKKyAgICB9CisKKyAgLyogV3JpdGUgZGlzYWJsZSAqLworICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZmVlX2FkZHIpLCBNTVdfRkVFX0FERFJfRFMpOworICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZmVlX2N0cmwpLCBNTVdfRkVFX0NUUkxfV0RTKTsKKworICBmZWVfd2FpdChiYXNlLCAxMCwgMTAwKTsKKworI2lmZGVmIEVFUFJPTV9JU19QUk9URUNURUQJLyogZGlzYWJsZWQgKi8KKyAgLyogUmVwcm90ZWN0IEVFcHJvbSAqLworICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZmVlX2FkZHIpLCAweDAwKTsKKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwgTU1XX0ZFRV9DVFJMX1BSV1JJVEUpOworCisgIGZlZV93YWl0KGJhc2UsIDEwLCAxMDApOworI2VuZGlmCS8qIEVFUFJPTV9JU19QUk9URUNURUQgKi8KK30KKyNlbmRpZgkvKiBXSVJFTEVTU19FWFQgKi8KKworLyoqKioqKioqKioqKioqKioqKiogV2F2ZUxBTiBSb2FtaW5nIHJvdXRpbmVzLi4uICoqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCS8qIENvbmRpdGlvbmFsIGNvbXBpbGUsIHNlZSB3YXZlbGFuX2NzLmggKi8KKwordW5zaWduZWQgY2hhciBXQVZFTEFOX0JFQUNPTl9BRERSRVNTW109IHsweDA5LDB4MDAsMHgwZSwweDIwLDB4MDMsMHgwMH07CisgIAordm9pZCB3dl9yb2FtX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgbmV0X2xvY2FsICAqbHA9IG5ldGRldl9wcml2KGRldik7CisKKyAgLyogRG8gbm90IHJlbW92ZSB0aGlzIHVubGVzcyB5b3UgaGF2ZSBhIGdvb2QgcmVhc29uICovCisgIHByaW50ayhLRVJOX05PVElDRSAiJXM6IFdhcm5pbmcsIHlvdSBoYXZlIGVuYWJsZWQgcm9hbWluZyBvbiIKKwkgIiBkZXZpY2UgJXMgIVxuIiwgZGV2LT5uYW1lLCBkZXYtPm5hbWUpOworICBwcmludGsoS0VSTl9OT1RJQ0UgIlJvYW1pbmcgaXMgY3VycmVudGx5IGFuIGV4cGVyaW1lbnRhbCB1bnN1cHBvcnRlZCBmZWF0dXJlIgorCSAiIG9mIHRoZSBXYXZlbGFuIGRyaXZlci5cbiIpOworICBwcmludGsoS0VSTl9OT1RJQ0UgIkl0IG1heSB3b3JrLCBidXQgbWF5IGFsc28gbWFrZSB0aGUgZHJpdmVyIGJlaGF2ZSBpbiIKKwkgIiBlcnJhdGljIHdheXMgb3IgY3Jhc2guXG4iKTsKKworICBscC0+d2F2ZXBvaW50X3RhYmxlLmhlYWQ9TlVMTDsgICAgICAgICAgIC8qIEluaXRpYWxpc2UgV2F2ZVBvaW50IHRhYmxlICovCisgIGxwLT53YXZlcG9pbnRfdGFibGUubnVtX3dhdmVwb2ludHM9MDsKKyAgbHAtPndhdmVwb2ludF90YWJsZS5sb2NrZWQ9MDsKKyAgbHAtPmN1cnJfcG9pbnQ9TlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBkZWZhdWx0IFdhdmVQb2ludCAqLworICBscC0+Y2VsbF9zZWFyY2g9MDsKKyAgCisgIGxwLT5jZWxsX3RpbWVyLmRhdGE9KGxvbmcpbHA7ICAgICAgICAgICAgICAgLyogU3RhcnQgY2VsbCBleHBpcnkgdGltZXIgKi8KKyAgbHAtPmNlbGxfdGltZXIuZnVuY3Rpb249d2xfY2VsbF9leHBpcnk7CisgIGxwLT5jZWxsX3RpbWVyLmV4cGlyZXM9amlmZmllcytDRUxMX1RJTUVPVVQ7CisgIGFkZF90aW1lcigmbHAtPmNlbGxfdGltZXIpOworICAKKyAgd3ZfbndpZF9maWx0ZXIoTldJRF9QUk9NSVNDLGxwKSA7ICAgIC8qIEVudGVyIE5XSUQgcHJvbWlzY3VvdXMgbW9kZSAqLworICAvKiB0byBidWlsZCB1cCBhIGdvb2QgV2F2ZVBvaW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFibGUuLi4gKi8KKyAgcHJpbnRrKEtFUk5fREVCVUcgIldhdmVMQU46IFJvYW1pbmcgZW5hYmxlZCBvbiBkZXZpY2UgJXNcbiIsZGV2LT5uYW1lKTsKK30KKyAKK3ZvaWQgd3Zfcm9hbV9jbGVhbnVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgIHdhdmVwb2ludF9oaXN0b3J5ICpwdHIsKm9sZF9wdHI7CisgIG5ldF9sb2NhbCAqbHA9IG5ldGRldl9wcml2KGRldik7CisgIAorICBwcmludGsoS0VSTl9ERUJVRyAiV2F2ZUxBTjogUm9hbWluZyBEaXNhYmxlZCBvbiBkZXZpY2UgJXNcbiIsZGV2LT5uYW1lKTsKKyAgCisgIC8qIEZpeG1lIDogbWF5YmUgd2Ugc2hvdWxkIGNoZWNrIHRoYXQgdGhlIHRpbWVyIGV4aXN0IGJlZm9yZSBkZWxldGluZyBpdCAqLworICBkZWxfdGltZXIoJmxwLT5jZWxsX3RpbWVyKTsgICAgICAgICAgLyogUmVtb3ZlIGNlbGwgZXhwaXJ5IHRpbWVyICAgICAgICovCisgIHB0cj1scC0+d2F2ZXBvaW50X3RhYmxlLmhlYWQ7ICAgICAgICAvKiBDbGVhciBkZXZpY2UncyBXYXZlUG9pbnQgdGFibGUgKi8KKyAgd2hpbGUocHRyIT1OVUxMKQorICAgIHsKKyAgICAgIG9sZF9wdHI9cHRyOworICAgICAgcHRyPXB0ci0+bmV4dDsJCisgICAgICB3bF9kZWxfd2F2ZXBvaW50KG9sZF9wdHIsbHApOwkKKyAgICB9Cit9CisKKy8qIEVuYWJsZS9EaXNhYmxlIE5XSUQgcHJvbWlzY3VvdXMgbW9kZSBvbiBhIGdpdmVuIGRldmljZSAqLwordm9pZCB3dl9ud2lkX2ZpbHRlcih1bnNpZ25lZCBjaGFyIG1vZGUsIG5ldF9sb2NhbCAqbHApCit7CisgIG1tX3QgICAgICAgICAgICAgICAgICBtOworICB1bnNpZ25lZCBsb25nICAgICAgICAgZmxhZ3M7CisgIAorI2lmZGVmIFdBVkVMQU5fUk9BTUlOR19ERUJVRworICBwcmludGsoS0VSTl9ERUJVRyAiV2F2ZUxBTjogTldJRCBwcm9taXNjICVzLCBkZXZpY2UgJXNcbiIsKG1vZGU9PU5XSURfUFJPTUlTQykgPyAib24iIDogIm9mZiIsIGxwLT5kZXYtPm5hbWUpOworI2VuZGlmCisgIAorICAvKiBEaXNhYmxlIGludGVycnVwdHMgJiBzYXZlIGZsYWdzICovCisgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKyAgCisgIG0udy5tbXdfbG9vcHRfc2VsID0gKG1vZGU9PU5XSURfUFJPTUlTQykgPyBNTVdfTE9PUFRfU0VMX0RJU19OV0lEIDogMHgwMDsKKyAgbW1jX3dyaXRlKGxwLT5kZXYtPmJhc2VfYWRkciwgKGNoYXIgKikmbS53Lm1td19sb29wdF9zZWwgLSAoY2hhciAqKSZtLCAodW5zaWduZWQgY2hhciAqKSZtLncubW13X2xvb3B0X3NlbCwgMSk7CisgIAorICBpZihtb2RlPT1OV0lEX1BST01JU0MpCisgICAgbHAtPmNlbGxfc2VhcmNoPTE7CisgIGVsc2UKKyAgICBscC0+Y2VsbF9zZWFyY2g9MDsKKworICAvKiBSZUVuYWJsZSBpbnRlcnJ1cHRzICYgcmVzdG9yZSBmbGFncyAqLworICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKK30KKworLyogRmluZCBhIHJlY29yZCBpbiB0aGUgV2F2ZVBvaW50IHRhYmxlIG1hdGNoaW5nIGEgZ2l2ZW4gTldJRCAqLword2F2ZXBvaW50X2hpc3RvcnkgKndsX3JvYW1fY2hlY2sodW5zaWduZWQgc2hvcnQgbndpZCwgbmV0X2xvY2FsICpscCkKK3sKKyAgd2F2ZXBvaW50X2hpc3RvcnkJKnB0cj1scC0+d2F2ZXBvaW50X3RhYmxlLmhlYWQ7CisgIAorICB3aGlsZShwdHIhPU5VTEwpeworICAgIGlmKHB0ci0+bndpZD09bndpZCkKKyAgICAgIHJldHVybiBwdHI7CQorICAgIHB0cj1wdHItPm5leHQ7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIENyZWF0ZSBhIG5ldyB3YXZlcG9pbnQgdGFibGUgZW50cnkgKi8KK3dhdmVwb2ludF9oaXN0b3J5ICp3bF9uZXdfd2F2ZXBvaW50KHVuc2lnbmVkIHNob3J0IG53aWQsIHVuc2lnbmVkIGNoYXIgc2VxLCBuZXRfbG9jYWwqIGxwKQoreworICB3YXZlcG9pbnRfaGlzdG9yeSAqbmV3X3dhdmVwb2ludDsKKworI2lmZGVmIFdBVkVMQU5fUk9BTUlOR19ERUJVRwkKKyAgcHJpbnRrKEtFUk5fREVCVUcgIldhdmVMQU46IE5ldyBXYXZlcG9pbnQsIE5XSUQ6JS40WFxuIixud2lkKTsKKyNlbmRpZgorICAKKyAgaWYobHAtPndhdmVwb2ludF90YWJsZS5udW1fd2F2ZXBvaW50cz09TUFYX1dBVkVQT0lOVFMpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBuZXdfd2F2ZXBvaW50PSh3YXZlcG9pbnRfaGlzdG9yeSAqKSBrbWFsbG9jKHNpemVvZih3YXZlcG9pbnRfaGlzdG9yeSksR0ZQX0FUT01JQyk7CisgIGlmKG5ld193YXZlcG9pbnQ9PU5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisgIAorICBuZXdfd2F2ZXBvaW50LT5ud2lkPW53aWQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgV2F2ZVBvaW50cyBOV0lEICovCisgIG5ld193YXZlcG9pbnQtPmF2ZXJhZ2VfZmFzdD0wOyAgICAgICAgICAgICAgICAgICAgLyogUnVubmluZyBBdmVyYWdlcy4uKi8KKyAgbmV3X3dhdmVwb2ludC0+YXZlcmFnZV9zbG93PTA7CisgIG5ld193YXZlcG9pbnQtPnF1YWxwdHI9MDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IG9mIHJpbmdidWZmZXIgKi8KKyAgbmV3X3dhdmVwb2ludC0+bGFzdF9zZXE9c2VxLTE7ICAgICAgICAgICAgICAgIC8qIExhc3Qgc2VxdWVuY2Ugbm8uc2VlbiAqLworICBtZW1zZXQobmV3X3dhdmVwb2ludC0+c2lncXVhbCwwLFdBVkVQT0lOVF9ISVNUT1JZKTsvKiBFbXB0eSByaW5nYnVmZmVyICovCisgIAorICBuZXdfd2F2ZXBvaW50LT5uZXh0PWxwLT53YXZlcG9pbnRfdGFibGUuaGVhZDsvKiBBZGQgdG8gd2F2ZXBvaW50IHRhYmxlICovCisgIG5ld193YXZlcG9pbnQtPnByZXY9TlVMTDsKKyAgCisgIGlmKGxwLT53YXZlcG9pbnRfdGFibGUuaGVhZCE9TlVMTCkKKyAgICBscC0+d2F2ZXBvaW50X3RhYmxlLmhlYWQtPnByZXY9bmV3X3dhdmVwb2ludDsKKyAgCisgIGxwLT53YXZlcG9pbnRfdGFibGUuaGVhZD1uZXdfd2F2ZXBvaW50OworICAKKyAgbHAtPndhdmVwb2ludF90YWJsZS5udW1fd2F2ZXBvaW50cysrOyAgICAgLyogbm8uIG9mIHZpc2libGUgd2F2ZXBvaW50cyAqLworICAKKyAgcmV0dXJuIG5ld193YXZlcG9pbnQ7Cit9CisKKy8qIFJlbW92ZSBhIHdhdmVwb2ludCBlbnRyeSBmcm9tIFdhdmVQb2ludCB0YWJsZSAqLwordm9pZCB3bF9kZWxfd2F2ZXBvaW50KHdhdmVwb2ludF9oaXN0b3J5ICp3YXZlcG9pbnQsIHN0cnVjdCBuZXRfbG9jYWwgKmxwKQoreworICBpZih3YXZlcG9pbnQ9PU5VTEwpCisgICAgcmV0dXJuOworICAKKyAgaWYobHAtPmN1cnJfcG9pbnQ9PXdhdmVwb2ludCkKKyAgICBscC0+Y3Vycl9wb2ludD1OVUxMOworICAKKyAgaWYod2F2ZXBvaW50LT5wcmV2IT1OVUxMKQorICAgIHdhdmVwb2ludC0+cHJldi0+bmV4dD13YXZlcG9pbnQtPm5leHQ7CisgIAorICBpZih3YXZlcG9pbnQtPm5leHQhPU5VTEwpCisgICAgd2F2ZXBvaW50LT5uZXh0LT5wcmV2PXdhdmVwb2ludC0+cHJldjsKKyAgCisgIGlmKGxwLT53YXZlcG9pbnRfdGFibGUuaGVhZD09d2F2ZXBvaW50KQorICAgIGxwLT53YXZlcG9pbnRfdGFibGUuaGVhZD13YXZlcG9pbnQtPm5leHQ7CisgIAorICBscC0+d2F2ZXBvaW50X3RhYmxlLm51bV93YXZlcG9pbnRzLS07CisgIGtmcmVlKHdhdmVwb2ludCk7Cit9CisKKy8qIFRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIC0gY2hlY2tzIFdhdmVQb2ludCB0YWJsZSBmb3Igc3RhbGUgZW50cmllcyAqLyAKK3ZvaWQgd2xfY2VsbF9leHBpcnkodW5zaWduZWQgbG9uZyBkYXRhKQoreworICBuZXRfbG9jYWwgKmxwPShuZXRfbG9jYWwgKilkYXRhOworICB3YXZlcG9pbnRfaGlzdG9yeSAqd2F2ZXBvaW50PWxwLT53YXZlcG9pbnRfdGFibGUuaGVhZCwqb2xkX3BvaW50OworICAKKyNpZiBXQVZFTEFOX1JPQU1JTkdfREVCVUcgPiAxCisgIHByaW50ayhLRVJOX0RFQlVHICJXYXZlTEFOOiBXYXZlcG9pbnQgdGltZW91dCwgZGV2ICVzXG4iLGxwLT5kZXYtPm5hbWUpOworI2VuZGlmCisgIAorICBpZihscC0+d2F2ZXBvaW50X3RhYmxlLmxvY2tlZCkKKyAgICB7CisjaWYgV0FWRUxBTl9ST0FNSU5HX0RFQlVHID4gMQorICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIldhdmVMQU46IFdhdmVwb2ludCB0YWJsZSBsb2NrZWQuLi5cbiIpOworI2VuZGlmCisgICAgICAKKyAgICAgIGxwLT5jZWxsX3RpbWVyLmV4cGlyZXM9amlmZmllcysxOyAvKiBJZiB0YWJsZSBpbiB1c2UsIGNvbWUgYmFjayBsYXRlciAqLworICAgICAgYWRkX3RpbWVyKCZscC0+Y2VsbF90aW1lcik7CisgICAgICByZXR1cm47CisgICAgfQorICAKKyAgd2hpbGUod2F2ZXBvaW50IT1OVUxMKQorICAgIHsKKyAgICAgIGlmKHRpbWVfYWZ0ZXIoamlmZmllcywgd2F2ZXBvaW50LT5sYXN0X3NlZW4gKyBDRUxMX1RJTUVPVVQpKQorCXsKKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkdfREVCVUcKKwkgIHByaW50ayhLRVJOX0RFQlVHICJXYXZlTEFOOiBCeWUgYnllICUuNFhcbiIsd2F2ZXBvaW50LT5ud2lkKTsKKyNlbmRpZgorCSAgCisJICBvbGRfcG9pbnQ9d2F2ZXBvaW50OworCSAgd2F2ZXBvaW50PXdhdmVwb2ludC0+bmV4dDsKKwkgIHdsX2RlbF93YXZlcG9pbnQob2xkX3BvaW50LGxwKTsKKwl9CisgICAgICBlbHNlCisJd2F2ZXBvaW50PXdhdmVwb2ludC0+bmV4dDsKKyAgICB9CisgIGxwLT5jZWxsX3RpbWVyLmV4cGlyZXM9amlmZmllcytDRUxMX1RJTUVPVVQ7CisgIGFkZF90aW1lcigmbHAtPmNlbGxfdGltZXIpOworfQorCisvKiBVcGRhdGUgU05SIGhpc3Rvcnkgb2YgYSB3YXZlcG9pbnQgKi8KK3ZvaWQgd2xfdXBkYXRlX2hpc3Rvcnkod2F2ZXBvaW50X2hpc3RvcnkgKndhdmVwb2ludCwgdW5zaWduZWQgY2hhciBzaWdxdWFsLCB1bnNpZ25lZCBjaGFyIHNlcSkJCit7CisgIGludCBpPTAsbnVtX21pc3NlZD0wLHB0cj0wOworICBpbnQgYXZlcmFnZV9mYXN0PTAsYXZlcmFnZV9zbG93PTA7CisgIAorICBudW1fbWlzc2VkPShzZXEtd2F2ZXBvaW50LT5sYXN0X3NlcSklV0FWRVBPSU5UX0hJU1RPUlk7LyogSGF2ZSB3ZSBtaXNzZWQKKwkJCQkJCQkgICAgYW55IGJlYWNvbnM/ICovCisgIGlmKG51bV9taXNzZWQpCisgICAgZm9yKGk9MDtpPG51bV9taXNzZWQ7aSsrKQorICAgICAgeworCXdhdmVwb2ludC0+c2lncXVhbFt3YXZlcG9pbnQtPnF1YWxwdHIrK109MDsgLyogSWYgc28sIGVudGVyIHRoZW0gYXMgMCdzICovCisJd2F2ZXBvaW50LT5xdWFscHRyICU9V0FWRVBPSU5UX0hJU1RPUlk7ICAgIC8qIGluIHRoZSByaW5nYnVmZmVyLiAqLworICAgICAgfQorICB3YXZlcG9pbnQtPmxhc3Rfc2Vlbj1qaWZmaWVzOyAgICAgICAgICAgICAgICAgLyogQWRkIGJlYWNvbiB0byBoaXN0b3J5ICovCisgIHdhdmVwb2ludC0+bGFzdF9zZXE9c2VxOwkKKyAgd2F2ZXBvaW50LT5zaWdxdWFsW3dhdmVwb2ludC0+cXVhbHB0cisrXT1zaWdxdWFsOyAgICAgICAgICAKKyAgd2F2ZXBvaW50LT5xdWFscHRyICU9V0FWRVBPSU5UX0hJU1RPUlk7CisgIHB0cj0od2F2ZXBvaW50LT5xdWFscHRyLVdBVkVQT0lOVF9GQVNUX0hJU1RPUlkrV0FWRVBPSU5UX0hJU1RPUlkpJVdBVkVQT0lOVF9ISVNUT1JZOworICAKKyAgZm9yKGk9MDtpPFdBVkVQT0lOVF9GQVNUX0hJU1RPUlk7aSsrKSAgICAgICAvKiBVcGRhdGUgcnVubmluZyBhdmVyYWdlcyAqLworICAgIHsKKyAgICAgIGF2ZXJhZ2VfZmFzdCs9d2F2ZXBvaW50LT5zaWdxdWFsW3B0cisrXTsKKyAgICAgIHB0ciAlPVdBVkVQT0lOVF9ISVNUT1JZOworICAgIH0KKyAgCisgIGF2ZXJhZ2Vfc2xvdz1hdmVyYWdlX2Zhc3Q7CisgIGZvcihpPVdBVkVQT0lOVF9GQVNUX0hJU1RPUlk7aTxXQVZFUE9JTlRfSElTVE9SWTtpKyspCisgICAgeworICAgICAgYXZlcmFnZV9zbG93Kz13YXZlcG9pbnQtPnNpZ3F1YWxbcHRyKytdOworICAgICAgcHRyICU9V0FWRVBPSU5UX0hJU1RPUlk7CisgICAgfQorICAKKyAgd2F2ZXBvaW50LT5hdmVyYWdlX2Zhc3Q9YXZlcmFnZV9mYXN0L1dBVkVQT0lOVF9GQVNUX0hJU1RPUlk7CisgIHdhdmVwb2ludC0+YXZlcmFnZV9zbG93PWF2ZXJhZ2Vfc2xvdy9XQVZFUE9JTlRfSElTVE9SWTsJCit9CisKKy8qIFBlcmZvcm0gYSBoYW5kb3ZlciB0byBhIG5ldyBXYXZlUG9pbnQgKi8KK3ZvaWQgd3Zfcm9hbV9oYW5kb3Zlcih3YXZlcG9pbnRfaGlzdG9yeSAqd2F2ZXBvaW50LCBuZXRfbG9jYWwgKmxwKQoreworICBraW9fYWRkcl90CQliYXNlID0gbHAtPmRldi0+YmFzZV9hZGRyOworICBtbV90ICAgICAgICAgICAgICAgICAgbTsKKyAgdW5zaWduZWQgbG9uZyAgICAgICAgIGZsYWdzOworCisgIGlmKHdhdmVwb2ludD09bHAtPmN1cnJfcG9pbnQpICAgICAgICAgIC8qIFNhbml0eSBjaGVjay4uLiAqLworICAgIHsKKyAgICAgIHd2X253aWRfZmlsdGVyKCFOV0lEX1BST01JU0MsbHApOworICAgICAgcmV0dXJuOworICAgIH0KKyAgCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HX0RFQlVHCisgIHByaW50ayhLRVJOX0RFQlVHICJXYXZlTEFOOiBEb2luZyBoYW5kb3ZlciB0byAlLjRYLCBkZXYgJXNcbiIsd2F2ZXBvaW50LT5ud2lkLGxwLT5kZXYtPm5hbWUpOworI2VuZGlmCisgCQorICAvKiBEaXNhYmxlIGludGVycnVwdHMgJiBzYXZlIGZsYWdzICovCisgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworICBtLncubW13X25ldHdfaWRfbCA9IHdhdmVwb2ludC0+bndpZCAmIDB4RkY7CisgIG0udy5tbXdfbmV0d19pZF9oID0gKHdhdmVwb2ludC0+bndpZCAmIDB4RkYwMCkgPj4gODsKKyAgCisgIG1tY193cml0ZShiYXNlLCAoY2hhciAqKSZtLncubW13X25ldHdfaWRfbCAtIChjaGFyICopJm0sICh1bnNpZ25lZCBjaGFyICopJm0udy5tbXdfbmV0d19pZF9sLCAyKTsKKyAgCisgIC8qIFJlRW5hYmxlIGludGVycnVwdHMgJiByZXN0b3JlIGZsYWdzICovCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisgIHd2X253aWRfZmlsdGVyKCFOV0lEX1BST01JU0MsbHApOworICBscC0+Y3Vycl9wb2ludD13YXZlcG9pbnQ7Cit9CisKKy8qIENhbGxlZCB3aGVuIGEgV2F2ZVBvaW50IGJlYWNvbiBpcyByZWNlaXZlZCAqLworc3RhdGljIGlubGluZSB2b2lkIHdsX3JvYW1fZ2F0aGVyKHN0cnVjdCBuZXRfZGV2aWNlICogIGRldiwKKwkJCQkgIHVfY2hhciAqICBoZHIsICAgLyogQmVhY29uIGhlYWRlciAqLworCQkJCSAgdV9jaGFyICogIHN0YXRzKSAvKiBTTlIsIFNpZ25hbCBxdWFsaXR5IAorCQkJCQkJICAgICAgb2YgcGFja2V0ICovCit7CisgIHdhdmVwb2ludF9iZWFjb24gKmJlYWNvbj0gKHdhdmVwb2ludF9iZWFjb24gKiloZHI7IC8qIFJjdmQuIEJlYWNvbiAqLworICB1bnNpZ25lZCBzaG9ydCBud2lkPW50b2hzKGJlYWNvbi0+bndpZCk7ICAKKyAgdW5zaWduZWQgc2hvcnQgc2lncXVhbD1zdGF0c1syXSAmIE1NUl9TR05MX1FVQUw7ICAgLyogU05SIG9mIGJlYWNvbiAqLworICB3YXZlcG9pbnRfaGlzdG9yeSAqd2F2ZXBvaW50PU5VTEw7ICAgICAgICAgICAgICAgIC8qIFdhdmVQb2ludCB0YWJsZSBlbnRyeSAqLworICBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsgICAgICAgICAgICAgIC8qIERldmljZSBpbmZvICovCisKKyNpZmRlZiBJX05FRURfVEhJU19GRUFUVVJFCisgIC8qIFNvbWUgcGVvcGxlIGRvbid0IG5lZWQgdGhpcywgc29tZSBvdGhlciBtYXkgbmVlZCBpdCAqLworICBud2lkPW53aWRebnRvaHMoYmVhY29uLT5kb21haW5faWQpOworI2VuZGlmCisKKyNpZiBXQVZFTEFOX1JPQU1JTkdfREVCVUcgPiAxCisgIHByaW50ayhLRVJOX0RFQlVHICJXYXZlTEFOOiBiZWFjb24sIGRldiAlczpcbiIsZGV2LT5uYW1lKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgIkRvbWFpbjogJS40WCBOV0lEOiAlLjRYIFNpZ1F1YWw9JWRcbiIsbnRvaHMoYmVhY29uLT5kb21haW5faWQpLG53aWQsc2lncXVhbCk7CisjZW5kaWYKKyAgCisgIGxwLT53YXZlcG9pbnRfdGFibGUubG9ja2VkPTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDxNdXRleD4gKi8KKyAgCisgIHdhdmVwb2ludD13bF9yb2FtX2NoZWNrKG53aWQsbHApOyAgICAgICAgICAgIC8qIEZpbmQgV2F2ZVBvaW50IHRhYmxlIGVudHJ5ICovCisgIGlmKHdhdmVwb2ludD09TlVMTCkgICAgICAgICAgICAgICAgICAgIC8qIElmIG5vIGVudHJ5LCBDcmVhdGUgYSBuZXcgb25lLi4uICovCisgICAgeworICAgICAgd2F2ZXBvaW50PXdsX25ld193YXZlcG9pbnQobndpZCxiZWFjb24tPnNlcSxscCk7CisgICAgICBpZih3YXZlcG9pbnQ9PU5VTEwpCisJZ290byBvdXQ7CisgICAgfQorICBpZihscC0+Y3Vycl9wb2ludD09TlVMTCkgICAgICAgICAgICAgLyogSWYgdGhpcyBpcyB0aGUgb25seSBXYXZlUG9pbnQsICovCisgICAgd3Zfcm9hbV9oYW5kb3Zlcih3YXZlcG9pbnQsIGxwKTsJICAgICAgICAgLyogSnVtcCBvbiBpdCEgKi8KKyAgCisgIHdsX3VwZGF0ZV9oaXN0b3J5KHdhdmVwb2ludCwgc2lncXVhbCwgYmVhY29uLT5zZXEpOyAvKiBVcGRhdGUgU05SIGhpc3RvcnkKKwkJCQkJCQkgc3RhdHMuICovCisgIAorICBpZihscC0+Y3Vycl9wb2ludC0+YXZlcmFnZV9zbG93IDwgU0VBUkNIX1RIUkVTSF9MT1cpIC8qIElmIG91ciBjdXJyZW50ICovCisgICAgaWYoIWxwLT5jZWxsX3NlYXJjaCkgICAgICAgICAgICAgICAgICAvKiBXYXZlUG9pbnQgaXMgZ2V0dGluZyBmYWludCwgKi8KKyAgICAgIHd2X253aWRfZmlsdGVyKE5XSURfUFJPTUlTQyxscCk7ICAgIC8qIHN0YXJ0IGxvb2tpbmcgZm9yIGEgbmV3IG9uZSAqLworICAKKyAgaWYod2F2ZXBvaW50LT5hdmVyYWdlX3Nsb3cgPiAKKyAgICAgbHAtPmN1cnJfcG9pbnQtPmF2ZXJhZ2Vfc2xvdyArIFdBVkVMQU5fUk9BTUlOR19ERUxUQSkKKyAgICB3dl9yb2FtX2hhbmRvdmVyKHdhdmVwb2ludCwgbHApOyAgIC8qIEhhbmRvdmVyIHRvIGEgYmV0dGVyIFdhdmVQb2ludCAqLworICAKKyAgaWYobHAtPmN1cnJfcG9pbnQtPmF2ZXJhZ2Vfc2xvdyA+IFNFQVJDSF9USFJFU0hfSElHSCkgLyogSWYgb3VyIFNOUiBpcyAqLworICAgIGlmKGxwLT5jZWxsX3NlYXJjaCkgIC8qIGdldHRpbmcgYmV0dGVyLCBkcm9wIG91dCBvZiBjZWxsIHNlYXJjaCBtb2RlICovCisgICAgICB3dl9ud2lkX2ZpbHRlcighTldJRF9QUk9NSVNDLGxwKTsKKyAgCitvdXQ6CisgIGxwLT53YXZlcG9pbnRfdGFibGUubG9ja2VkPTA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogPC9NVVRFWD4gICA6LSkgKi8KK30KKworLyogVGVzdCB0aGlzIE1BQyBmcmFtZSBhIFdhdmVQb2ludCBiZWFjb24gKi8KK3N0YXRpYyBpbmxpbmUgaW50IFdBVkVMQU5fQkVBQ09OKHVuc2lnbmVkIGNoYXIgKmRhdGEpCit7CisgIHdhdmVwb2ludF9iZWFjb24gKmJlYWNvbj0gKHdhdmVwb2ludF9iZWFjb24gKilkYXRhOworICBzdGF0aWMgd2F2ZXBvaW50X2JlYWNvbiBiZWFjb25fdGVtcGxhdGU9ezB4YWEsMHhhYSwweDAzLDB4MDgsMHgwMCwweDBlLDB4MjAsMHgwMywweDAwfTsKKyAgCisgIGlmKG1lbWNtcChiZWFjb24sJmJlYWNvbl90ZW1wbGF0ZSw5KT09MCkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHJldHVybiAwOworfQorI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIEk4MjU5MyBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFVzZWZ1bCBzdWJyb3V0aW5lcyB0byBtYW5hZ2UgdGhlIEV0aGVybmV0IGNvbnRyb2xsZXIKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUm91dGluZSB0byBzeW5jaHJvbm91c2x5IHNlbmQgYSBjb21tYW5kIHRvIHRoZSBpODI1OTMgY2hpcC4gCisgKiBTaG91bGQgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqIChjYWxsZWQgYnkgd3ZfcGFja2V0X3dyaXRlKCksIHd2X3J1X3N0b3AoKSwgd3ZfcnVfc3RhcnQoKSwKKyAqICB3dl84MjU5M19jb25maWcoKSAmIHd2X2RpYWcoKSkKKyAqLworc3RhdGljIGludAord3ZfODI1OTNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAorCSAgICAgY2hhciAqCXN0ciwKKwkgICAgIGludAljbWQsCisJICAgICBpbnQJcmVzdWx0KQoreworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgaW50CQlzdGF0dXM7CisgIGludAkJd2FpdF9jb21wbGV0ZWQ7CisgIGxvbmcJCXNwaW47CisKKyAgLyogU3BpbiB1bnRpbCB0aGUgY2hpcCBmaW5pc2hlcyBleGVjdXRpbmcgaXRzIGN1cnJlbnQgY29tbWFuZCAoaWYgYW55KSAqLworICBzcGluID0gMTAwMDsKKyAgZG8KKyAgICB7CisgICAgICAvKiBUaW1lIGNhbGlicmF0aW9uIG9mIHRoZSBsb29wICovCisgICAgICB1ZGVsYXkoMTApOworCisgICAgICAvKiBSZWFkIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KKyAgICAgIG91dGIoT1AwX05PUCB8IENSMF9TVEFUVVNfMywgTENDUihiYXNlKSk7CisgICAgICBzdGF0dXMgPSBpbmIoTENTUihiYXNlKSk7CisgICAgfQorICB3aGlsZSgoKHN0YXR1cyAmIFNSM19FWEVDX1NUQVRFX01BU0spICE9IFNSM19FWEVDX0lETEUpICYmIChzcGluLS0gPiAwKSk7CisKKyAgLyogSWYgdGhlIGludGVycnVwdCBoYXNuJ3QgYmUgcG9zdGVkICovCisgIGlmKHNwaW4gPD0gMCkKKyAgICB7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0VSUk9SCisgICAgICBwcmludGsoS0VSTl9JTkZPICJ3dl84MjU5M19jbWQ6ICVzIHRpbWVvdXQgKHByZXZpb3VzIGNvbW1hbmQpLCBzdGF0dXMgMHglMDJ4XG4iLAorCSAgICAgc3RyLCBzdGF0dXMpOworI2VuZGlmCisgICAgICByZXR1cm4oRkFMU0UpOworICAgIH0KKworICAvKiBJc3N1ZSB0aGUgY29tbWFuZCB0byB0aGUgY29udHJvbGxlciAqLworICBvdXRiKGNtZCwgTENDUihiYXNlKSk7CisKKyAgLyogSWYgd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGUgcmVzdWx0IG9mIHRoZSBjb21tYW5kCisgICAqIE5vdGUgOiB0aGlzIG1lYW4gdGhhdCB0aGUgaXJxIGhhbmRsZXIgd2lsbCBkZWFsIHdpdGggdGhhdCAqLworICBpZihyZXN1bHQgPT0gU1IwX05PX1JFU1VMVCkKKyAgICByZXR1cm4oVFJVRSk7CisKKyAgLyogV2UgYXJlIHdhaXRpbmcgZm9yIGNvbW1hbmQgY29tcGxldGlvbiAqLworICB3YWl0X2NvbXBsZXRlZCA9IFRSVUU7CisKKyAgLyogQnVzeSB3YWl0IHdoaWxlIHRoZSBMQU4gY29udHJvbGxlciBleGVjdXRlcyB0aGUgY29tbWFuZC4gKi8KKyAgc3BpbiA9IDEwMDA7CisgIGRvCisgICAgeworICAgICAgLyogVGltZSBjYWxpYnJhdGlvbiBvZiB0aGUgbG9vcCAqLworICAgICAgdWRlbGF5KDEwKTsKKworICAgICAgLyogUmVhZCB0aGUgaW50ZXJydXB0IHJlZ2lzdGVyICovCisgICAgICBvdXRiKENSMF9TVEFUVVNfMCB8IE9QMF9OT1AsIExDQ1IoYmFzZSkpOworICAgICAgc3RhdHVzID0gaW5iKExDU1IoYmFzZSkpOworCisgICAgICAvKiBDaGVjayBpZiB0aGVyZSB3YXMgYW4gaW50ZXJydXB0IHBvc3RlZCAqLworICAgICAgaWYoKHN0YXR1cyAmIFNSMF9JTlRFUlJVUFQpKQorCXsKKwkgIC8qIEFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHQgKi8KKwkgIG91dGIoQ1IwX0lOVF9BQ0sgfCBPUDBfTk9QLCBMQ0NSKGJhc2UpKTsKKworCSAgLyogQ2hlY2sgaWYgaW50ZXJydXB0IGlzIGEgY29tbWFuZCBjb21wbGV0aW9uICovCisJICBpZigoKHN0YXR1cyAmIFNSMF9CT1RIX1JYX1RYKSAhPSBTUjBfQk9USF9SWF9UWCkgJiYKKwkgICAgICgoc3RhdHVzICYgU1IwX0JPVEhfUlhfVFgpICE9IDB4MCkgJiYKKwkgICAgICEoc3RhdHVzICYgU1IwX1JFQ0VQVElPTikpCisJICAgIHsKKwkgICAgICAvKiBTaWduYWwgY29tbWFuZCBjb21wbGV0aW9uICovCisJICAgICAgd2FpdF9jb21wbGV0ZWQgPSBGQUxTRTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogTm90ZSA6IFJ4IGludGVycnVwdHMgd2lsbCBiZSBoYW5kbGVkIGxhdGVyLCBiZWNhdXNlIHdlIGNhbgorCSAgICAgICAqIGhhbmRsZSBtdWx0aXBsZSBSeCBwYWNrZXRzIGF0IG9uY2UgKi8KKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTworCSAgICAgIHByaW50ayhLRVJOX0lORk8gInd2XzgyNTkzX2NtZDogbm90IG91ciBpbnRlcnJ1cHRcbiIpOworI2VuZGlmCisJICAgIH0KKwl9CisgICAgfQorICB3aGlsZSh3YWl0X2NvbXBsZXRlZCAmJiAoc3Bpbi0tID4gMCkpOworCisgIC8qIElmIHRoZSBpbnRlcnJ1cHQgaGFzbid0IGJlIHBvc3RlZCAqLworICBpZih3YWl0X2NvbXBsZXRlZCkKKyAgICB7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0VSUk9SCisgICAgICBwcmludGsoS0VSTl9JTkZPICJ3dl84MjU5M19jbWQ6ICVzIHRpbWVvdXQsIHN0YXR1cyAweCUwMnhcbiIsCisJICAgICBzdHIsIHN0YXR1cyk7CisjZW5kaWYKKyAgICAgIHJldHVybihGQUxTRSk7CisgICAgfQorCisgIC8qIENoZWNrIHRoZSByZXR1cm4gY29kZSByZXR1cm5lZCBieSB0aGUgY2FyZCAoc2VlIGFib3ZlKSBhZ2FpbnN0CisgICAqIHRoZSBleHBlY3RlZCByZXR1cm4gY29kZSBwcm92aWRlZCBieSB0aGUgY2FsbGVyICovCisgIGlmKChzdGF0dXMgJiBTUjBfRVZFTlRfTUFTSykgIT0gcmVzdWx0KQorICAgIHsKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfRVJST1IKKyAgICAgIHByaW50ayhLRVJOX0lORk8gInd2XzgyNTkzX2NtZDogJXMgZmFpbGVkLCBzdGF0dXMgPSAweCV4XG4iLAorCSAgICAgc3RyLCBzdGF0dXMpOworI2VuZGlmCisgICAgICByZXR1cm4oRkFMU0UpOworICAgIH0KKworICByZXR1cm4oVFJVRSk7Cit9IC8qIHd2XzgyNTkzX2NtZCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIGRvZXMgYSA1OTMgb3AtY29kZSBudW1iZXIgNywgYW5kIG9idGFpbnMgdGhlIGRpYWdub3NlCisgKiBzdGF0dXMgZm9yIHRoZSBXYXZlTEFOLgorICovCitzdGF0aWMgaW5saW5lIGludAord3ZfZGlhZyhzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAgaW50CQlyZXQgPSBGQUxTRTsKKworICBpZih3dl84MjU5M19jbWQoZGV2LCAid3ZfZGlhZygpOiBkaWFnbm9zZSIsCisJCSAgT1AwX0RJQUdOT1NFLCBTUjBfRElBR05PU0VfUEFTU0VEKSkKKyAgICByZXQgPSBUUlVFOworCisjaWZkZWYgREVCVUdfQ09ORklHX0VSUk9SUworICBwcmludGsoS0VSTl9JTkZPICJ3YXZlbGFuX2NzOiBpODI1OTMgU2VsZiBUZXN0IGZhaWxlZCFcbiIpOworI2VuZGlmCisgIHJldHVybihyZXQpOworfSAvKiB3dl9kaWFnICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSb3V0aW5lIHRvIHJlYWQgbGVuIGJ5dGVzIGZyb20gdGhlIGk4MjU5MydzIHJpbmcgYnVmZmVyLCBzdGFydGluZyBhdAorICogY2hpcCBhZGRyZXNzIGFkZHIuIFRoZSByZXN1bHRzIHJlYWQgZnJvbSB0aGUgY2hpcCBhcmUgc3RvcmVkIGluIGJ1Zi4KKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGFkZHJlc3MgdG8gdXNlIGZvciBuZXh0IHRoZSBjYWxsLgorICovCitzdGF0aWMgaW50CityZWFkX3JpbmdidWYoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCisJICAgICBpbnQJYWRkciwKKwkgICAgIGNoYXIgKglidWYsCisJICAgICBpbnQJbGVuKQoreworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgaW50CQlyaW5nX3B0ciA9IGFkZHI7CisgIGludAkJY2h1bmtfbGVuOworICBjaGFyICoJYnVmX3B0ciA9IGJ1ZjsKKworICAvKiBHZXQgYWxsIHRoZSBidWZmZXIgKi8KKyAgd2hpbGUobGVuID4gMCkKKyAgICB7CisgICAgICAvKiBQb3NpdGlvbiB0aGUgUHJvZ3JhbSBJL08gUmVnaXN0ZXIgYXQgdGhlIHJpbmcgYnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgIG91dGIocmluZ19wdHIgJiAweGZmLCBQSU9STChiYXNlKSk7CisgICAgICBvdXRiKCgocmluZ19wdHIgPj4gOCkgJiBQSU9SSF9NQVNLKSwgUElPUkgoYmFzZSkpOworCisgICAgICAvKiBGaXJzdCwgZGV0ZXJtaW5lIGhvdyBtdWNoIHdlIGNhbiByZWFkIHdpdGhvdXQgd3JhcHBpbmcgYXJvdW5kIHRoZQorCSByaW5nIGJ1ZmZlciAqLworICAgICAgaWYoKGFkZHIgKyBsZW4pIDwgKFJYX0JBU0UgKyBSWF9TSVpFKSkKKwljaHVua19sZW4gPSBsZW47CisgICAgICBlbHNlCisJY2h1bmtfbGVuID0gUlhfQkFTRSArIFJYX1NJWkUgLSBhZGRyOworICAgICAgaW5zYihQSU9QKGJhc2UpLCBidWZfcHRyLCBjaHVua19sZW4pOworICAgICAgYnVmX3B0ciArPSBjaHVua19sZW47CisgICAgICBsZW4gLT0gY2h1bmtfbGVuOworICAgICAgcmluZ19wdHIgPSAocmluZ19wdHIgLSBSWF9CQVNFICsgY2h1bmtfbGVuKSAlIFJYX1NJWkUgKyBSWF9CQVNFOworICAgIH0KKyAgcmV0dXJuKHJpbmdfcHRyKTsKK30gLyogcmVhZF9yaW5nYnVmICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBSZWNvbmZpZ3VyZSB0aGUgaTgyNTkzLCBvciBhdCBsZWFzdCBhc2sgZm9yIGl0Li4uCisgKiBCZWNhdXNlIHd2XzgyNTkzX2NvbmZpZyB1c2UgdGhlIHRyYW5zbWlzc2lvbiBidWZmZXIsIHdlIG11c3QgZG8gaXQKKyAqIHdoZW4gd2UgYXJlIHN1cmUgdGhhdCB0aGVyZSBpcyBubyB0cmFuc21pc3Npb24sIHNvIHdlIGRvIGl0IG5vdworICogb3IgaW4gd2F2ZWxhbl9wYWNrZXRfeG1pdCgpIChJIGNhbid0IGZpbmQgYW55IGJldHRlciBwbGFjZSwKKyAqIHdhdmVsYW5faW50ZXJydXB0IGlzIG5vdCBhbiBvcHRpb24uLi4pLCBzbyB5b3UgbWF5IGV4cGVyaWVuY2UKKyAqIHNvbWUgZGVsYXkgc29tZXRpbWUuLi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCit3dl84MjU5M19yZWNvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAgbmV0X2xvY2FsICoJCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgZGV2X2xpbmtfdCAqCQlsaW5rID0gbHAtPmxpbms7CisgIHVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisgIC8qIEFybSB0aGUgZmxhZywgd2lsbCBiZSBjbGVhcmQgaW4gd3ZfODI1OTNfY29uZmlnKCkgKi8KKyAgbHAtPnJlY29uZmlnXzgyNTkzID0gVFJVRTsKKworICAvKiBDaGVjayBpZiB3ZSBjYW4gZG8gaXQgbm93ICEgKi8KKyAgaWYoKGxpbmstPm9wZW4pICYmIChuZXRpZl9ydW5uaW5nKGRldikpICYmICEobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSkKKyAgICB7CisgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICAgICAgd3ZfODI1OTNfY29uZmlnKGRldik7CisgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsJLyogUmUtZW5hYmxlIGludGVycnVwdHMgKi8KKyAgICB9CisgIGVsc2UKKyAgICB7CisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworICAgICAgcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICIlczogd3ZfODI1OTNfcmVjb25maWcoKTogZGVsYXllZCAoc3RhdGUgPSAlbFgsIGxpbmsgPSAlZClcbiIsCisJICAgICBkZXYtPm5hbWUsIGRldi0+c3RhdGUsIGxpbmstPm9wZW4pOworI2VuZGlmCisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqIERFQlVHICYgSU5GTyBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyByb3V0aW5lcyBhcmUgdXNlZCBpbiB0aGUgY29kZSB0byBzaG93IGRlYnVnIGluZm9ybWF0aW9ucy4KKyAqIE1vc3Qgb2YgdGhlIHRpbWUsIGl0IGR1bXAgdGhlIGNvbnRlbnQgb2YgaGFyZHdhcmUgc3RydWN0dXJlcy4uLgorICovCisKKyNpZmRlZiBERUJVR19QU0FfU0hPVworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHRoZSBmb3JtYXR0ZWQgY29udGVudHMgb2YgdGhlIFBhcmFtZXRlciBTdG9yYWdlIEFyZWEuCisgKi8KK3N0YXRpYyB2b2lkCit3dl9wc2Ffc2hvdyhwc2FfdCAqCXApCit7CisgIHByaW50ayhLRVJOX0RFQlVHICIjIyMjIyB3YXZlbGFuIHBzYSBjb250ZW50czogIyMjIyNcbiIpOworICBwcmludGsoS0VSTl9ERUJVRyAicHNhX2lvX2Jhc2VfYWRkcl8xOiAweCUwMlggJTAyWCAlMDJYICUwMlhcbiIsCisJIHAtPnBzYV9pb19iYXNlX2FkZHJfMSwKKwkgcC0+cHNhX2lvX2Jhc2VfYWRkcl8yLAorCSBwLT5wc2FfaW9fYmFzZV9hZGRyXzMsCisJIHAtPnBzYV9pb19iYXNlX2FkZHJfNCk7CisgIHByaW50ayhLRVJOX0RFQlVHICJwc2FfcmVtX2Jvb3RfYWRkcl8xOiAweCUwMlggJTAyWCAlMDJYXG4iLAorCSBwLT5wc2FfcmVtX2Jvb3RfYWRkcl8xLAorCSBwLT5wc2FfcmVtX2Jvb3RfYWRkcl8yLAorCSBwLT5wc2FfcmVtX2Jvb3RfYWRkcl8zKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV9ob2xpX3BhcmFtczogMHglMDJ4LCAiLCBwLT5wc2FfaG9saV9wYXJhbXMpOworICBwcmludGsoInBzYV9pbnRfcmVxX25vOiAlZFxuIiwgcC0+cHNhX2ludF9yZXFfbm8pOworI2lmZGVmIERFQlVHX1NIT1dfVU5VU0VECisgIHByaW50ayhLRVJOX0RFQlVHICJwc2FfdW51c2VkMFtdOiAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCSBwLT5wc2FfdW51c2VkMFswXSwKKwkgcC0+cHNhX3VudXNlZDBbMV0sCisJIHAtPnBzYV91bnVzZWQwWzJdLAorCSBwLT5wc2FfdW51c2VkMFszXSwKKwkgcC0+cHNhX3VudXNlZDBbNF0sCisJIHAtPnBzYV91bnVzZWQwWzVdLAorCSBwLT5wc2FfdW51c2VkMFs2XSk7CisjZW5kaWYJLyogREVCVUdfU0hPV19VTlVTRUQgKi8KKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV91bml2X21hY19hZGRyW106ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSBwLT5wc2FfdW5pdl9tYWNfYWRkclswXSwKKwkgcC0+cHNhX3VuaXZfbWFjX2FkZHJbMV0sCisJIHAtPnBzYV91bml2X21hY19hZGRyWzJdLAorCSBwLT5wc2FfdW5pdl9tYWNfYWRkclszXSwKKwkgcC0+cHNhX3VuaXZfbWFjX2FkZHJbNF0sCisJIHAtPnBzYV91bml2X21hY19hZGRyWzVdKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV9sb2NhbF9tYWNfYWRkcltdOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgcC0+cHNhX2xvY2FsX21hY19hZGRyWzBdLAorCSBwLT5wc2FfbG9jYWxfbWFjX2FkZHJbMV0sCisJIHAtPnBzYV9sb2NhbF9tYWNfYWRkclsyXSwKKwkgcC0+cHNhX2xvY2FsX21hY19hZGRyWzNdLAorCSBwLT5wc2FfbG9jYWxfbWFjX2FkZHJbNF0sCisJIHAtPnBzYV9sb2NhbF9tYWNfYWRkcls1XSk7CisgIHByaW50ayhLRVJOX0RFQlVHICJwc2FfdW5pdl9sb2NhbF9zZWw6ICVkLCAiLCBwLT5wc2FfdW5pdl9sb2NhbF9zZWwpOworICBwcmludGsoInBzYV9jb21wX251bWJlcjogJWQsICIsIHAtPnBzYV9jb21wX251bWJlcik7CisgIHByaW50aygicHNhX3Rocl9wcmVfc2V0OiAweCUwMnhcbiIsIHAtPnBzYV90aHJfcHJlX3NldCk7CisgIHByaW50ayhLRVJOX0RFQlVHICJwc2FfZmVhdHVyZV9zZWxlY3QvZGVjYXlfcHJtOiAweCUwMngsICIsCisJIHAtPnBzYV9mZWF0dXJlX3NlbGVjdCk7CisgIHByaW50aygicHNhX3N1YmJhbmQvZGVjYXlfdXBkYXRlX3BybTogJWRcbiIsIHAtPnBzYV9zdWJiYW5kKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV9xdWFsaXR5X3RocjogMHglMDJ4LCAiLCBwLT5wc2FfcXVhbGl0eV90aHIpOworICBwcmludGsoInBzYV9tb2RfZGVsYXk6IDB4JTAyeFxuIiwgcC0+cHNhX21vZF9kZWxheSk7CisgIHByaW50ayhLRVJOX0RFQlVHICJwc2FfbndpZDogMHglMDJ4JTAyeCwgIiwgcC0+cHNhX253aWRbMF0sIHAtPnBzYV9ud2lkWzFdKTsKKyAgcHJpbnRrKCJwc2FfbndpZF9zZWxlY3Q6ICVkXG4iLCBwLT5wc2FfbndpZF9zZWxlY3QpOworICBwcmludGsoS0VSTl9ERUJVRyAicHNhX2VuY3J5cHRpb25fc2VsZWN0OiAlZCwgIiwgcC0+cHNhX2VuY3J5cHRpb25fc2VsZWN0KTsKKyAgcHJpbnRrKCJwc2FfZW5jcnlwdGlvbl9rZXlbXTogJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAorCSBwLT5wc2FfZW5jcnlwdGlvbl9rZXlbMF0sCisJIHAtPnBzYV9lbmNyeXB0aW9uX2tleVsxXSwKKwkgcC0+cHNhX2VuY3J5cHRpb25fa2V5WzJdLAorCSBwLT5wc2FfZW5jcnlwdGlvbl9rZXlbM10sCisJIHAtPnBzYV9lbmNyeXB0aW9uX2tleVs0XSwKKwkgcC0+cHNhX2VuY3J5cHRpb25fa2V5WzVdLAorCSBwLT5wc2FfZW5jcnlwdGlvbl9rZXlbNl0sCisJIHAtPnBzYV9lbmNyeXB0aW9uX2tleVs3XSk7CisgIHByaW50ayhLRVJOX0RFQlVHICJwc2FfZGF0YWJ1c193aWR0aDogJWRcbiIsIHAtPnBzYV9kYXRhYnVzX3dpZHRoKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV9jYWxsX2NvZGUvYXV0b19zcXVlbGNoOiAweCUwMngsICIsCisJIHAtPnBzYV9jYWxsX2NvZGVbMF0pOworICBwcmludGsoInBzYV9jYWxsX2NvZGVbXTogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCSBwLT5wc2FfY2FsbF9jb2RlWzBdLAorCSBwLT5wc2FfY2FsbF9jb2RlWzFdLAorCSBwLT5wc2FfY2FsbF9jb2RlWzJdLAorCSBwLT5wc2FfY2FsbF9jb2RlWzNdLAorCSBwLT5wc2FfY2FsbF9jb2RlWzRdLAorCSBwLT5wc2FfY2FsbF9jb2RlWzVdLAorCSBwLT5wc2FfY2FsbF9jb2RlWzZdLAorCSBwLT5wc2FfY2FsbF9jb2RlWzddKTsKKyNpZmRlZiBERUJVR19TSE9XX1VOVVNFRAorICBwcmludGsoS0VSTl9ERUJVRyAicHNhX3Jlc2VydmVkW106ICUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJIHAtPnBzYV9yZXNlcnZlZFswXSwKKwkgcC0+cHNhX3Jlc2VydmVkWzFdLAorCSBwLT5wc2FfcmVzZXJ2ZWRbMl0sCisJIHAtPnBzYV9yZXNlcnZlZFszXSk7CisjZW5kaWYJLyogREVCVUdfU0hPV19VTlVTRUQgKi8KKyAgcHJpbnRrKEtFUk5fREVCVUcgInBzYV9jb25mX3N0YXR1czogJWQsICIsIHAtPnBzYV9jb25mX3N0YXR1cyk7CisgIHByaW50aygicHNhX2NyYzogMHglMDJ4JTAyeCwgIiwgcC0+cHNhX2NyY1swXSwgcC0+cHNhX2NyY1sxXSk7CisgIHByaW50aygicHNhX2NyY19zdGF0dXM6IDB4JTAyeFxuIiwgcC0+cHNhX2NyY19zdGF0dXMpOworfSAvKiB3dl9wc2Ffc2hvdyAqLworI2VuZGlmCS8qIERFQlVHX1BTQV9TSE9XICovCisKKyNpZmRlZiBERUJVR19NTUNfU0hPVworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHRoZSBmb3JtYXR0ZWQgc3RhdHVzIG9mIHRoZSBNb2RlbSBNYW5hZ2VtZW50IENvbnRyb2xsZXIuCisgKiBUaGlzIGZ1bmN0aW9uIG5lZWQgdG8gYmUgY29tcGxldGVkLi4uCisgKi8KK3N0YXRpYyB2b2lkCit3dl9tbWNfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAga2lvX2FkZHJfdAliYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgIG5ldF9sb2NhbCAqCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgbW1yX3QJCW07CisKKyAgLyogQmFzaWMgY2hlY2sgKi8KKyAgaWYoaGFzcl9yZWFkKGJhc2UpICYgSEFTUl9OT19DTEspCisgICAgeworICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHd2X21tY19zaG93OiBtb2RlbSBub3QgY29ubmVjdGVkXG4iLAorCSAgICAgZGV2LT5uYW1lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisgIC8qIFJlYWQgdGhlIG1tYyAqLworICBtbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZnJlZXplKSwgMSk7CisgIG1tY19yZWFkKGJhc2UsIDAsICh1X2NoYXIgKikmbSwgc2l6ZW9mKG0pKTsKKyAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZyZWV6ZSksIDApOworCisjaWZkZWYgV0lSRUxFU1NfRVhUCS8qIElmIHdpcmVsZXNzIGV4dGVuc2lvbiBleGlzdCBpbiB0aGUga2VybmVsICovCisgIC8qIERvbid0IGZvcmdldCB0byB1cGRhdGUgc3RhdGlzdGljcyAqLworICBscC0+d3N0YXRzLmRpc2NhcmQubndpZCArPSAobS5tbXJfd3JvbmdfbndpZF9oIDw8IDgpIHwgbS5tbXJfd3JvbmdfbndpZF9sOworI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCAqLworCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisgIHByaW50ayhLRVJOX0RFQlVHICIjIyMjIyB3YXZlbGFuIG1vZGVtIHN0YXR1cyByZWdpc3RlcnM6ICMjIyMjXG4iKTsKKyNpZmRlZiBERUJVR19TSE9XX1VOVVNFRAorICBwcmludGsoS0VSTl9ERUJVRyAibW1jX3VudXNlZDBbXTogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLAorCSBtLm1tcl91bnVzZWQwWzBdLAorCSBtLm1tcl91bnVzZWQwWzFdLAorCSBtLm1tcl91bnVzZWQwWzJdLAorCSBtLm1tcl91bnVzZWQwWzNdLAorCSBtLm1tcl91bnVzZWQwWzRdLAorCSBtLm1tcl91bnVzZWQwWzVdLAorCSBtLm1tcl91bnVzZWQwWzZdLAorCSBtLm1tcl91bnVzZWQwWzddKTsKKyNlbmRpZgkvKiBERUJVR19TSE9XX1VOVVNFRCAqLworICBwcmludGsoS0VSTl9ERUJVRyAiRW5jcnlwdGlvbiBhbGdvcnl0aG06ICUwMlggLSBTdGF0dXM6ICUwMlhcbiIsCisJIG0ubW1yX2Rlc19hdmFpbCwgbS5tbXJfZGVzX3N0YXR1cyk7CisjaWZkZWYgREVCVUdfU0hPV19VTlVTRUQKKyAgcHJpbnRrKEtFUk5fREVCVUcgIm1tY191bnVzZWQxW106ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwKKwkgbS5tbXJfdW51c2VkMVswXSwKKwkgbS5tbXJfdW51c2VkMVsxXSwKKwkgbS5tbXJfdW51c2VkMVsyXSwKKwkgbS5tbXJfdW51c2VkMVszXSwKKwkgbS5tbXJfdW51c2VkMVs0XSk7CisjZW5kaWYJLyogREVCVUdfU0hPV19VTlVTRUQgKi8KKyAgcHJpbnRrKEtFUk5fREVCVUcgImRjZV9zdGF0dXM6IDB4JXggWyVzJXMlcyVzXVxuIiwKKwkgbS5tbXJfZGNlX3N0YXR1cywKKwkgKG0ubW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVU19SWF9CVVNZKSA/ICJlbmVyZ3kgZGV0ZWN0ZWQsIjoiIiwKKwkgKG0ubW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVU19MT09QVF9JTkQpID8KKwkgImxvb3AgdGVzdCBpbmRpY2F0ZWQsIiA6ICIiLAorCSAobS5tbXJfZGNlX3N0YXR1cyAmIE1NUl9EQ0VfU1RBVFVTX1RYX0JVU1kpID8gInRyYW5zbWl0dGVyIG9uLCIgOiAiIiwKKwkgKG0ubW1yX2RjZV9zdGF0dXMgJiBNTVJfRENFX1NUQVRVU19KQlJfRVhQSVJFRCkgPworCSAiamFiYmVyIHRpbWVyIGV4cGlyZWQsIiA6ICIiKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgIkRzcCBJRDogJTAyWFxuIiwKKwkgbS5tbXJfZHNwX2lkKTsKKyNpZmRlZiBERUJVR19TSE9XX1VOVVNFRAorICBwcmludGsoS0VSTl9ERUJVRyAibW1jX3VudXNlZDJbXTogJTAyWDolMDJYXG4iLAorCSBtLm1tcl91bnVzZWQyWzBdLAorCSBtLm1tcl91bnVzZWQyWzFdKTsKKyNlbmRpZgkvKiBERUJVR19TSE9XX1VOVVNFRCAqLworICBwcmludGsoS0VSTl9ERUJVRyAiIyBjb3JyZWN0X253aWQ6ICVkLCAjIHdyb25nX253aWQ6ICVkXG4iLAorCSAobS5tbXJfY29ycmVjdF9ud2lkX2ggPDwgOCkgfCBtLm1tcl9jb3JyZWN0X253aWRfbCwKKwkgKG0ubW1yX3dyb25nX253aWRfaCA8PCA4KSB8IG0ubW1yX3dyb25nX253aWRfbCk7CisgIHByaW50ayhLRVJOX0RFQlVHICJ0aHJfcHJlX3NldDogMHgleCBbY3VycmVudCBzaWduYWwgJXNdXG4iLAorCSBtLm1tcl90aHJfcHJlX3NldCAmIE1NUl9USFJfUFJFX1NFVCwKKwkgKG0ubW1yX3Rocl9wcmVfc2V0ICYgTU1SX1RIUl9QUkVfU0VUX0NVUikgPyAiYWJvdmUiIDogImJlbG93Iik7CisgIHByaW50ayhLRVJOX0RFQlVHICJzaWduYWxfbHZsOiAlZCBbJXNdLCAiLAorCSBtLm1tcl9zaWduYWxfbHZsICYgTU1SX1NJR05BTF9MVkwsCisJIChtLm1tcl9zaWduYWxfbHZsICYgTU1SX1NJR05BTF9MVkxfVkFMSUQpID8gIm5ldyBtc2ciIDogIm5vIG5ldyBtc2ciKTsKKyAgcHJpbnRrKCJzaWxlbmNlX2x2bDogJWQgWyVzXSwgIiwgbS5tbXJfc2lsZW5jZV9sdmwgJiBNTVJfU0lMRU5DRV9MVkwsCisJIChtLm1tcl9zaWxlbmNlX2x2bCAmIE1NUl9TSUxFTkNFX0xWTF9WQUxJRCkgPyAidXBkYXRlIGRvbmUiIDogIm5vIG5ldyB1cGRhdGUiKTsKKyAgcHJpbnRrKCJzZ25sX3F1YWw6IDB4JXggWyVzXVxuIiwgbS5tbXJfc2dubF9xdWFsICYgTU1SX1NHTkxfUVVBTCwKKwkgKG0ubW1yX3NnbmxfcXVhbCAmIE1NUl9TR05MX1FVQUxfQU5UKSA/ICJBbnRlbm5hIDEiIDogIkFudGVubmEgMCIpOworI2lmZGVmIERFQlVHX1NIT1dfVU5VU0VECisgIHByaW50ayhLRVJOX0RFQlVHICJuZXR3X2lkX2w6ICV4XG4iLCBtLm1tcl9uZXR3X2lkX2wpOworI2VuZGlmCS8qIERFQlVHX1NIT1dfVU5VU0VEICovCit9IC8qIHd2X21tY19zaG93ICovCisjZW5kaWYJLyogREVCVUdfTU1DX1NIT1cgKi8KKworI2lmZGVmIERFQlVHX0k4MjU5M19TSE9XCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJpbnQgdGhlIGZvcm1hdHRlZCBzdGF0dXMgb2YgdGhlIGk4MjU5MydzIHJlY2VpdmUgdW5pdC4KKyAqLworc3RhdGljIHZvaWQKK3d2X3J1X3Nob3coc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisgIG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgIHByaW50ayhLRVJOX0RFQlVHICIjIyMjIyB3YXZlbGFuIGk4MjU5MyByZWNlaXZlciBzdGF0dXM6ICMjIyMjXG4iKTsKKyAgcHJpbnRrKEtFUk5fREVCVUcgInJ1OiByZnAgJWQgc3RvcCAlZCIsIGxwLT5yZnAsIGxwLT5zdG9wKTsKKyAgLyoKKyAgICogTm90IGltcGxlbWVudGVkIHlldC4uLgorICAgKi8KKyAgcHJpbnRrKCJcbiIpOworfSAvKiB3dl9ydV9zaG93ICovCisjZW5kaWYJLyogREVCVUdfSTgyNTkzX1NIT1cgKi8KKworI2lmZGVmIERFQlVHX0RFVklDRV9TSE9XCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUHJpbnQgdGhlIGZvcm1hdHRlZCBzdGF0dXMgb2YgdGhlIFdhdmVMQU4gUENNQ0lBIGRldmljZSBkcml2ZXIuCisgKi8KK3N0YXRpYyB2b2lkCit3dl9kZXZfc2hvdyhzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAgcHJpbnRrKEtFUk5fREVCVUcgImRldjoiKTsKKyAgcHJpbnRrKCIgc3RhdGU9JWxYLCIsIGRldi0+c3RhdGUpOworICBwcmludGsoIiB0cmFuc19zdGFydD0lbGQsIiwgZGV2LT50cmFuc19zdGFydCk7CisgIHByaW50aygiIGZsYWdzPTB4JXgsIiwgZGV2LT5mbGFncyk7CisgIHByaW50aygiXG4iKTsKK30gLyogd3ZfZGV2X3Nob3cgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFByaW50IHRoZSBmb3JtYXR0ZWQgc3RhdHVzIG9mIHRoZSBXYXZlTEFOIFBDTUNJQSBkZXZpY2UgZHJpdmVyJ3MKKyAqIHByaXZhdGUgaW5mb3JtYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCit3dl9sb2NhbF9zaG93KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBuZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICBwcmludGsoS0VSTl9ERUJVRyAibG9jYWw6Iik7CisgIC8qCisgICAqIE5vdCBpbXBsZW1lbnRlZCB5ZXQuLi4KKyAgICovCisgIHByaW50aygiXG4iKTsKK30gLyogd3ZfbG9jYWxfc2hvdyAqLworI2VuZGlmCS8qIERFQlVHX0RFVklDRV9TSE9XICovCisKKyNpZiBkZWZpbmVkKERFQlVHX1JYX0lORk8pIHx8IGRlZmluZWQoREVCVUdfVFhfSU5GTykKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBEdW1wIHBhY2tldCBoZWFkZXIgKGFuZCBjb250ZW50IGlmIG5lY2Vzc2FyeSkgb24gdGhlIHNjcmVlbgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3d2X3BhY2tldF9pbmZvKHVfY2hhciAqCQlwLAkJLyogUGFja2V0IHRvIGR1bXAgKi8KKwkgICAgICAgaW50CQlsZW5ndGgsCQkvKiBMZW5ndGggb2YgdGhlIHBhY2tldCAqLworCSAgICAgICBjaGFyICoJCW1zZzEsCQkvKiBOYW1lIG9mIHRoZSBkZXZpY2UgKi8KKwkgICAgICAgY2hhciAqCQltc2cyKQkJLyogTmFtZSBvZiB0aGUgZnVuY3Rpb24gKi8KK3sKKyAgaW50CQlpOworICBpbnQJCW1heGk7CisKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlcygpOiBkZXN0ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYLCBsZW5ndGggJWRcbiIsCisJIG1zZzEsIG1zZzIsIHBbMF0sIHBbMV0sIHBbMl0sIHBbM10sIHBbNF0sIHBbNV0sIGxlbmd0aCk7CisgIHByaW50ayhLRVJOX0RFQlVHICIlczogJXMoKTogc3JjICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYLCB0eXBlIDB4JTAyWCUwMlhcbiIsCisJIG1zZzEsIG1zZzIsIHBbNl0sIHBbN10sIHBbOF0sIHBbOV0sIHBbMTBdLCBwWzExXSwgcFsxMl0sIHBbMTNdKTsKKworI2lmZGVmIERFQlVHX1BBQ0tFVF9EVU1QCisKKyAgcHJpbnRrKEtFUk5fREVCVUcgImRhdGE9XCIiKTsKKworICBpZigobWF4aSA9IGxlbmd0aCkgPiBERUJVR19QQUNLRVRfRFVNUCkKKyAgICBtYXhpID0gREVCVUdfUEFDS0VUX0RVTVA7CisgIGZvcihpID0gMTQ7IGkgPCBtYXhpOyBpKyspCisgICAgaWYocFtpXSA+PSAnICcgJiYgcFtpXSA8PSAnficpCisgICAgICBwcmludGsoIiAlYyIsIHBbaV0pOworICAgIGVsc2UKKyAgICAgIHByaW50aygiJTAyWCIsIHBbaV0pOworICBpZihtYXhpIDwgbGVuZ3RoKQorICAgIHByaW50aygiLi4iKTsKKyAgcHJpbnRrKCJcIlxuIik7CisgIHByaW50ayhLRVJOX0RFQlVHICJcbiIpOworI2VuZGlmCS8qIERFQlVHX1BBQ0tFVF9EVU1QICovCit9CisjZW5kaWYJLyogZGVmaW5lZChERUJVR19SWF9JTkZPKSB8fCBkZWZpbmVkKERFQlVHX1RYX0lORk8pICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIGlzIHRoZSBpbmZvcm1hdGlvbiB3aGljaCBpcyBkaXNwbGF5ZWQgYnkgdGhlIGRyaXZlciBhdCBzdGFydHVwCisgKiBUaGVyZSAgaXMgYSBsb3Qgb2YgZmxhZyB0byBjb25maWd1cmUgaXQgYXQgeW91ciB3aWxsLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAord3ZfaW5pdF9pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgcHNhX3QJCXBzYTsKKyAgaW50CQlpOworCisgIC8qIFJlYWQgdGhlIHBhcmFtZXRlciBzdG9yYWdlIGFyZWEgKi8KKyAgcHNhX3JlYWQoZGV2LCAwLCAodW5zaWduZWQgY2hhciAqKSAmcHNhLCBzaXplb2YocHNhKSk7CisKKyNpZmRlZiBERUJVR19QU0FfU0hPVworICB3dl9wc2Ffc2hvdygmcHNhKTsKKyNlbmRpZgorI2lmZGVmIERFQlVHX01NQ19TSE9XCisgIHd2X21tY19zaG93KGRldik7CisjZW5kaWYKKyNpZmRlZiBERUJVR19JODI1OTNfU0hPVworICB3dl9ydV9zaG93KGRldik7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0JBU0lDX1NIT1cKKyAgLyogTm93LCBsZXQncyBnbyBmb3IgdGhlIGJhc2ljIHN0dWZmICovCisgIHByaW50ayhLRVJOX05PVElDRSAiJXM6IFdhdmVMQU46IHBvcnQgJSNseCwgaXJxICVkLCBod19hZGRyIiwKKwkgZGV2LT5uYW1lLCBiYXNlLCBkZXYtPmlycSk7CisgIGZvcihpID0gMDsgaSA8IFdBVkVMQU5fQUREUl9TSVpFOyBpKyspCisgICAgcHJpbnRrKCIlcyUwMlgiLCAoaSA9PSAwKSA/ICIgIiA6ICI6IiwgZGV2LT5kZXZfYWRkcltpXSk7CisKKyAgLyogUHJpbnQgY3VycmVudCBuZXR3b3JrIGlkICovCisgIGlmKHBzYS5wc2FfbndpZF9zZWxlY3QpCisgICAgcHJpbnRrKCIsIG53aWQgMHglMDJYLSUwMlgiLCBwc2EucHNhX253aWRbMF0sIHBzYS5wc2FfbndpZFsxXSk7CisgIGVsc2UKKyAgICBwcmludGsoIiwgbndpZCBvZmYiKTsKKworICAvKiBJZiAyLjAwIGNhcmQgKi8KKyAgaWYoIShtbWNfaW4oYmFzZSwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorICAgICAgIChNTVJfRkVFX1NUQVRVU19EV0xEIHwgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIHNob3J0CWZyZXE7CisKKyAgICAgIC8qIEFzayB0aGUgRUVwcm9tIHRvIHJlYWQgdGhlIGZyZXF1ZW5jeSBmcm9tIHRoZSBmaXJzdCBhcmVhICovCisgICAgICBmZWVfcmVhZChiYXNlLCAweDAwIC8qIDFzdCBhcmVhIC0gZnJlcXVlbmN5Li4uICovLAorCSAgICAgICAmZnJlcSwgMSk7CisKKyAgICAgIC8qIFByaW50IGZyZXF1ZW5jeSAqLworICAgICAgcHJpbnRrKCIsIDIuMDAsICVsZCIsIChmcmVxID4+IDYpICsgMjQwMEwpOworCisgICAgICAvKiBIYWNrICEhISAqLworICAgICAgaWYoZnJlcSAmIDB4MjApCisJcHJpbnRrKCIuNSIpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHByaW50aygiLCBQQ01DSUEsICIpOworICAgICAgc3dpdGNoIChwc2EucHNhX3N1YmJhbmQpCisJeworCWNhc2UgUFNBX1NVQkJBTkRfOTE1OgorCSAgcHJpbnRrKCI5MTUiKTsKKwkgIGJyZWFrOworCWNhc2UgUFNBX1NVQkJBTkRfMjQyNToKKwkgIHByaW50aygiMjQyNSIpOworCSAgYnJlYWs7CisJY2FzZSBQU0FfU1VCQkFORF8yNDYwOgorCSAgcHJpbnRrKCIyNDYwIik7CisJICBicmVhazsKKwljYXNlIFBTQV9TVUJCQU5EXzI0ODQ6CisJICBwcmludGsoIjI0ODQiKTsKKwkgIGJyZWFrOworCWNhc2UgUFNBX1NVQkJBTkRfMjQzMF81OgorCSAgcHJpbnRrKCIyNDMwLjUiKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBwcmludGsoInVua25vd24iKTsKKwl9CisgICAgfQorCisgIHByaW50aygiIE1IelxuIik7CisjZW5kaWYJLyogREVCVUdfQkFTSUNfU0hPVyAqLworCisjaWZkZWYgREVCVUdfVkVSU0lPTl9TSE9XCisgIC8qIFByaW50IHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgcHJpbnRrKEtFUk5fTk9USUNFICIlcyIsIHZlcnNpb24pOworI2VuZGlmCit9IC8qIHd2X2luaXRfaW5mbyAqLworCisvKioqKioqKioqKioqKioqKioqKioqIElPQ1RMLCBTVEFUUyAmIFJFQ09ORklHICoqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBXZSBmb3VuZCBoZXJlIHJvdXRpbmVzIHRoYXQgYXJlIGNhbGxlZCBieSBMaW51eCBvbiBkaWZmZXJlbnRzCisgKiBvY2Nhc2lvbnMgYWZ0ZXIgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIG5vdCBmb3IgdHJhbnNtaXR0aW5nIGRhdGEKKyAqIFRoZXNlIG1heSBiZSBjYWxsZWQgd2hlbiB0aGUgdXNlciB1c2UgaWZjb25maWcsIC9wcm9jL25ldC9kZXYKKyAqIG9yIHdpcmVsZXNzIGV4dGVuc2lvbnMKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2V0IHRoZSBjdXJyZW50IGV0aGVybmV0IHN0YXRpc3RpY3MuIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZQorICogY2FyZCBvcGVuIG9yIGNsb3NlZC4KKyAqIFVzZWQgd2hlbiB0aGUgdXNlciByZWFkIC9wcm9jL25ldC9kZXYKKyAqLworc3RhdGljIGVuX3N0YXRzCSoKK3dhdmVsYW5fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworI2lmZGVmIERFQlVHX0lPQ1RMX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogPD53YXZlbGFuX2dldF9zdGF0cygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKyAgcmV0dXJuKCYoKG5ldF9sb2NhbCAqKW5ldGRldl9wcml2KGRldikpLT5zdGF0cyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTZXQgb3IgY2xlYXIgdGhlIG11bHRpY2FzdCBmaWx0ZXIgZm9yIHRoaXMgYWRhcHRvci4KKyAqIG51bV9hZGRycyA9PSAtMQlQcm9taXNjdW91cyBtb2RlLCByZWNlaXZlIGFsbCBwYWNrZXRzCisgKiBudW1fYWRkcnMgPT0gMAlOb3JtYWwgbW9kZSwgY2xlYXIgbXVsdGljYXN0IGxpc3QKKyAqIG51bV9hZGRycyA+IDAJTXVsdGljYXN0IG1vZGUsIHJlY2VpdmUgbm9ybWFsIGFuZCBNQyBwYWNrZXRzLAorICoJCQlhbmQgZG8gYmVzdC1lZmZvcnQgZmlsdGVyaW5nLgorICovCisKK3N0YXRpYyB2b2lkCit3YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAgbmV0X2xvY2FsICoJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisjaWZkZWYgREVCVUdfSU9DVExfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5fc2V0X211bHRpY2FzdF9saXN0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0lPQ1RMX0lORk8KKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdCgpOiBzZXR0aW5nIFJ4IG1vZGUgJTAyWCB0byAlZCBhZGRyZXNzZXMuXG4iLAorCSBkZXYtPm5hbWUsIGRldi0+ZmxhZ3MsIGRldi0+bWNfY291bnQpOworI2VuZGlmCisKKyAgaWYoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBFbmFibGUgcHJvbWlzY3VvdXMgbW9kZTogcmVjZWl2ZSBhbGwgcGFja2V0cy4KKyAgICAgICAqLworICAgICAgaWYoIWxwLT5wcm9taXNjdW91cykKKwl7CisJICBscC0+cHJvbWlzY3VvdXMgPSAxOworCSAgbHAtPmFsbG11bHRpY2FzdCA9IDA7CisJICBscC0+bWNfY291bnQgPSAwOworCisJICB3dl84MjU5M19yZWNvbmZpZyhkZXYpOworCisJICAvKiBUZWxsIHRoZSBrZXJuZWwgdGhhdCB3ZSBhcmUgZG9pbmcgYSByZWFsbHkgYmFkIGpvYi4uLiAqLworCSAgZGV2LT5mbGFncyB8PSBJRkZfUFJPTUlTQzsKKwl9CisgICAgfQorICBlbHNlCisgICAgLyogSWYgYWxsIG11bHRpY2FzdCBhZGRyZXNzZXMKKyAgICAgKiBvciB0b28gbXVjaCBtdWx0aWNhc3QgYWRkcmVzc2VzIGZvciB0aGUgaGFyZHdhcmUgZmlsdGVyICovCisgICAgaWYoKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHx8CisgICAgICAgKGRldi0+bWNfY291bnQgPiBJODI1OTNfTUFYX01VTFRJQ0FTVF9BRERSRVNTRVMpKQorICAgICAgeworCS8qCisJICogRGlzYWJsZSBwcm9taXNjdW91cyBtb2RlLCBidXQgYWN0aXZlIHRoZSBhbGwgbXVsdGljYXN0IG1vZGUKKwkgKi8KKwlpZighbHAtPmFsbG11bHRpY2FzdCkKKwkgIHsKKwkgICAgbHAtPnByb21pc2N1b3VzID0gMDsKKwkgICAgbHAtPmFsbG11bHRpY2FzdCA9IDE7CisJICAgIGxwLT5tY19jb3VudCA9IDA7CisKKwkgICAgd3ZfODI1OTNfcmVjb25maWcoZGV2KTsKKworCSAgICAvKiBUZWxsIHRoZSBrZXJuZWwgdGhhdCB3ZSBhcmUgZG9pbmcgYSByZWFsbHkgYmFkIGpvYi4uLiAqLworCSAgICBkZXYtPmZsYWdzIHw9IElGRl9BTExNVUxUSTsKKwkgIH0KKyAgICAgIH0KKyAgICBlbHNlCisgICAgICAvKiBJZiB0aGVyZSBpcyBzb21lIG11bHRpY2FzdCBhZGRyZXNzZXMgdG8gc2VuZCAqLworICAgICAgaWYoZGV2LT5tY19saXN0ICE9IChzdHJ1Y3QgZGV2X21jX2xpc3QgKikgTlVMTCkKKwl7CisJICAvKgorCSAgICogRGlzYWJsZSBwcm9taXNjdW91cyBtb2RlLCBidXQgcmVjZWl2ZSBhbGwgcGFja2V0cworCSAgICogaW4gbXVsdGljYXN0IGxpc3QKKwkgICAqLworI2lmZGVmIE1VTFRJQ0FTVF9BVk9JRAorCSAgaWYobHAtPnByb21pc2N1b3VzIHx8IGxwLT5hbGxtdWx0aWNhc3QgfHwKKwkgICAgIChkZXYtPm1jX2NvdW50ICE9IGxwLT5tY19jb3VudCkpCisjZW5kaWYKKwkgICAgeworCSAgICAgIGxwLT5wcm9taXNjdW91cyA9IDA7CisJICAgICAgbHAtPmFsbG11bHRpY2FzdCA9IDA7CisJICAgICAgbHAtPm1jX2NvdW50ID0gZGV2LT5tY19jb3VudDsKKworCSAgICAgIHd2XzgyNTkzX3JlY29uZmlnKGRldik7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgLyoKKwkgICAqIFN3aXRjaCB0byBub3JtYWwgbW9kZTogZGlzYWJsZSBwcm9taXNjdW91cyBtb2RlIGFuZCAKKwkgICAqIGNsZWFyIHRoZSBtdWx0aWNhc3QgbGlzdC4KKwkgICAqLworCSAgaWYobHAtPnByb21pc2N1b3VzIHx8IGxwLT5tY19jb3VudCA9PSAwKQorCSAgICB7CisJICAgICAgbHAtPnByb21pc2N1b3VzID0gMDsKKwkgICAgICBscC0+YWxsbXVsdGljYXN0ID0gMDsKKwkgICAgICBscC0+bWNfY291bnQgPSAwOworCisJICAgICAgd3ZfODI1OTNfcmVjb25maWcoZGV2KTsKKwkgICAgfQorCX0KKyNpZmRlZiBERUJVR19JT0NUTF9UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd2F2ZWxhbl9zZXRfbXVsdGljYXN0X2xpc3QoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGV4aXN0Li4uCisgKiAoTm90ZSA6IGl0IHdhcyBhIG5pY2Ugd2F5IHRvIHRlc3QgdGhlIHJlY29uZmlndXJlIHN0dWZmLi4uKQorICovCisjaWZkZWYgU0VUX01BQ19BRERSRVNTCitzdGF0aWMgaW50Cit3YXZlbGFuX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkJCXZvaWQgKgkJYWRkcikKK3sKKyAgc3RydWN0IHNvY2thZGRyICoJbWFjID0gYWRkcjsKKworICAvKiBDb3B5IHRoZSBhZGRyZXNzICovCisgIG1lbWNweShkZXYtPmRldl9hZGRyLCBtYWMtPnNhX2RhdGEsIFdBVkVMQU5fQUREUl9TSVpFKTsKKworICAvKiBSZWNvbmZpZyB0aGUgYmVhc3QgKi8KKyAgd3ZfODI1OTNfcmVjb25maWcoZGV2KTsKKworICByZXR1cm4gMDsKK30KKyNlbmRpZgkvKiBTRVRfTUFDX0FERFJFU1MgKi8KKworI2lmZGVmIFdJUkVMRVNTX0VYVAkvKiBJZiB3aXJlbGVzcyBleHRlbnNpb24gZXhpc3QgaW4gdGhlIGtlcm5lbCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogRnJlcXVlbmN5IHNldHRpbmcgKGZvciBoYXJkd2FyZSBhYmxlIG9mIGl0KQorICogSXQncyBhIGJpdCBjb21wbGljYXRlZCBhbmQgeW91IGRvbid0IHJlYWxseSB3YW50IHRvIGxvb2sgaW50byBpdC4uLgorICovCitzdGF0aWMgaW5saW5lIGludAord3Zfc2V0X2ZyZXF1ZW5jeSh1X2xvbmcJCWJhc2UsCS8qIGkvbyBwb3J0IG9mIHRoZSBjYXJkICovCisJCSBpd19mcmVxICoJZnJlcXVlbmN5KQoreworICBjb25zdCBpbnQJQkFORF9OVU0gPSAxMDsJLyogTnVtYmVyIG9mIGJhbmRzICovCisgIGxvbmcJCWZyZXEgPSAwTDsJLyogb2Zmc2V0IHRvIDIuNCBHSHogaW4gLjUgTUh6ICovCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworICBpbnQJCWk7CisjZW5kaWYKKworICAvKiBTZXR0aW5nIGJ5IGZyZXF1ZW5jeSAqLworICAvKiBUaGVvcml0aWNhbGx5LCB5b3UgbWF5IHNldCBhbnkgZnJlcXVlbmN5IGJldHdlZW4KKyAgICogdGhlIHR3byBsaW1pdHMgd2l0aCBhIDAuNSBNSHogcHJlY2lzaW9uLiBJbiBwcmFjdGljZSwKKyAgICogSSBkb24ndCB3YW50IHlvdSB0byBoYXZlIHRyb3VibGUgd2l0aCBsb2NhbAorICAgKiByZWd1bGF0aW9ucy4uLiAqLworICBpZigoZnJlcXVlbmN5LT5lID09IDEpICYmCisgICAgIChmcmVxdWVuY3ktPm0gPj0gKGludCkgMi40MTJlOCkgJiYgKGZyZXF1ZW5jeS0+bSA8PSAoaW50KSAyLjQ4N2U4KSkKKyAgICB7CisgICAgICBmcmVxID0gKChmcmVxdWVuY3ktPm0gLyAxMDAwMCkgLSAyNDAwMEwpIC8gNTsKKyAgICB9CisKKyAgLyogU2V0dGluZyBieSBjaGFubmVsIChzYW1lIGFzIHdmcmVxc2VsKSAqLworICAvKiBXYXJuaW5nIDogZWFjaCBjaGFubmVsIGlzIDIyTUh6IHdpZGUsIHNvIHNvbWUgb2YgdGhlIGNoYW5uZWxzCisgICAqIHdpbGwgaW50ZXJmZXJlLi4uICovCisgIGlmKChmcmVxdWVuY3ktPmUgPT0gMCkgJiYKKyAgICAgKGZyZXF1ZW5jeS0+bSA+PSAwKSAmJiAoZnJlcXVlbmN5LT5tIDwgQkFORF9OVU0pKQorICAgIHsKKyAgICAgIC8qIEdldCBmcmVxdWVuY3kgb2Zmc2V0LiAqLworICAgICAgZnJlcSA9IGNoYW5uZWxfYmFuZHNbZnJlcXVlbmN5LT5tXSA+PiAxOworICAgIH0KKworICAvKiBWZXJpZnkgaWYgdGhlIGZyZXF1ZW5jeSBpcyBhbGxvd2VkICovCisgIGlmKGZyZXEgIT0gMEwpCisgICAgeworICAgICAgdV9zaG9ydAl0YWJsZVsxMF07CS8qIEF1dGhvcml6ZWQgZnJlcXVlbmN5IHRhYmxlICovCisKKyAgICAgIC8qIFJlYWQgdGhlIGZyZXF1ZW5jeSB0YWJsZSAqLworICAgICAgZmVlX3JlYWQoYmFzZSwgMHg3MSAvKiBmcmVxdWVuY3kgdGFibGUgKi8sCisJICAgICAgIHRhYmxlLCAxMCk7CisKKyNpZmRlZiBERUJVR19JT0NUTF9JTkZPCisgICAgICBwcmludGsoS0VSTl9ERUJVRyAiRnJlcXVlbmN5IHRhYmxlIDoiKTsKKyAgICAgIGZvcihpID0gMDsgaSA8IDEwOyBpKyspCisJeworCSAgcHJpbnRrKCIgJTA0WCIsCisJCSB0YWJsZVtpXSk7CisJfQorICAgICAgcHJpbnRrKCJcbiIpOworI2VuZGlmCisKKyAgICAgIC8qIExvb2sgaW4gdGhlIHRhYmxlIGlmIHRoZSBmcmVxdWVuY3kgaXMgYWxsb3dlZCAqLworICAgICAgaWYoISh0YWJsZVs5IC0gKChmcmVxIC0gMjQpIC8gMTYpXSAmCisJICAgKDEgPDwgKChmcmVxIC0gMjQpICUgMTYpKSkpCisJcmV0dXJuIC1FSU5WQUw7CQkvKiBub3QgYWxsb3dlZCAqLworICAgIH0KKyAgZWxzZQorICAgIHJldHVybiAtRUlOVkFMOworCisgIC8qIElmIHdlIGdldCBhIHVzYWJsZSBmcmVxdWVuY3kgKi8KKyAgaWYoZnJlcSAhPSAwTCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBzaG9ydAlhcmVhWzE2XTsKKyAgICAgIHVuc2lnbmVkIHNob3J0CWRhY1syXTsKKyAgICAgIHVuc2lnbmVkIHNob3J0CWFyZWFfdmVyaWZ5WzE2XTsKKyAgICAgIHVuc2lnbmVkIHNob3J0CWRhY192ZXJpZnlbMl07CisgICAgICAvKiBDb3JyZXNwb25kaW5nIGdhaW4gKGluIHRoZSBwb3dlciBhZGp1c3QgdmFsdWUgdGFibGUpCisgICAgICAgKiBzZWUgQVQmVCBXYXZlbGFuIERhdGEgTWFudWFsLCBSRUYgNDA3LTAyNDY4OS9FLCBwYWdlIDMtOAorICAgICAgICogJiBXQ0lOMDYyRC5ET0MsIHBhZ2UgNi4yLjkgKi8KKyAgICAgIHVuc2lnbmVkIHNob3J0CXBvd2VyX2xpbWl0W10gPSB7IDQwLCA4MCwgMTIwLCAxNjAsIDAgfTsKKyAgICAgIGludAkJcG93ZXJfYmFuZCA9IDA7CQkvKiBTZWxlY3RlZCBiYW5kICovCisgICAgICB1bnNpZ25lZCBzaG9ydAlwb3dlcl9hZGp1c3Q7CQkvKiBDb3JyZWN0IHZhbHVlICovCisKKyAgICAgIC8qIFNlYXJjaCBmb3IgdGhlIGdhaW4gKi8KKyAgICAgIHBvd2VyX2JhbmQgPSAwOworICAgICAgd2hpbGUoKGZyZXEgPiBwb3dlcl9saW1pdFtwb3dlcl9iYW5kXSkgJiYKKwkgICAgKHBvd2VyX2xpbWl0WysrcG93ZXJfYmFuZF0gIT0gMCkpCisJOworCisgICAgICAvKiBSZWFkIHRoZSBmaXJzdCBhcmVhICovCisgICAgICBmZWVfcmVhZChiYXNlLCAweDAwLAorCSAgICAgICBhcmVhLCAxNik7CisKKyAgICAgIC8qIFJlYWQgdGhlIERBQyAqLworICAgICAgZmVlX3JlYWQoYmFzZSwgMHg2MCwKKwkgICAgICAgZGFjLCAyKTsKKworICAgICAgLyogUmVhZCB0aGUgbmV3IHBvd2VyIGFkanVzdCB2YWx1ZSAqLworICAgICAgZmVlX3JlYWQoYmFzZSwgMHg2QiAtIChwb3dlcl9iYW5kID4+IDEpLAorCSAgICAgICAmcG93ZXJfYWRqdXN0LCAxKTsKKyAgICAgIGlmKHBvd2VyX2JhbmQgJiAweDEpCisJcG93ZXJfYWRqdXN0ID4+PSA4OworICAgICAgZWxzZQorCXBvd2VyX2FkanVzdCAmPSAweEZGOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIldhdmVsYW4gRUVwcm9tIEFyZWEgMSA6Iik7CisgICAgICBmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKQorCXsKKwkgIHByaW50aygiICUwNFgiLAorCQkgYXJlYVtpXSk7CisJfQorICAgICAgcHJpbnRrKCJcbiIpOworCisgICAgICBwcmludGsoS0VSTl9ERUJVRyAiV2F2ZWxhbiBFRXByb20gREFDIDogJTA0WCAlMDRYXG4iLAorCSAgICAgZGFjWzBdLCBkYWNbMV0pOworI2VuZGlmCisKKyAgICAgIC8qIEZyZXF1ZW5jeSBvZmZzZXQgKGZvciBpbmZvIG9ubHkuLi4pICovCisgICAgICBhcmVhWzBdID0gKChmcmVxIDw8IDUpICYgMHhGRkUwKSB8IChhcmVhWzBdICYgMHgxRik7CisKKyAgICAgIC8qIFJlY2VpdmVyIFByaW5jaXBsZSBtYWluIGRpdmlkZXIgY29lZmZpY2llbnQgKi8KKyAgICAgIGFyZWFbM10gPSAoZnJlcSA+PiAxKSArIDI0MDBMIC0gMzUyTDsKKyAgICAgIGFyZWFbMl0gPSAoKGZyZXEgJiAweDEpIDw8IDQpIHwgKGFyZWFbMl0gJiAweEZGRUYpOworCisgICAgICAvKiBUcmFuc21pdHRlciBNYWluIGRpdmlkZXIgY29lZmZpY2llbnQgKi8KKyAgICAgIGFyZWFbMTNdID0gKGZyZXEgPj4gMSkgKyAyNDAwTDsKKyAgICAgIGFyZWFbMTJdID0gKChmcmVxICYgMHgxKSA8PCA0KSB8IChhcmVhWzJdICYgMHhGRkVGKTsKKworICAgICAgLyogT3RoZXJzIHBhcnQgb2YgdGhlIGFyZWEgYXJlIGZsYWdzLCBiaXQgc3RyZWFtcyBvciB1bnVzZWQuLi4gKi8KKworICAgICAgLyogU2V0IHRoZSB2YWx1ZSBpbiB0aGUgREFDICovCisgICAgICBkYWNbMV0gPSAoKHBvd2VyX2FkanVzdCA+PiAxKSAmIDB4N0YpIHwgKGRhY1sxXSAmIDB4RkY4MCk7CisgICAgICBkYWNbMF0gPSAoKHBvd2VyX2FkanVzdCAmIDB4MSkgPDwgNCkgfCAoZGFjWzBdICYgMHhGRkVGKTsKKworICAgICAgLyogV3JpdGUgdGhlIGZpcnN0IGFyZWEgKi8KKyAgICAgIGZlZV93cml0ZShiYXNlLCAweDAwLAorCQlhcmVhLCAxNik7CisKKyAgICAgIC8qIFdyaXRlIHRoZSBEQUMgKi8KKyAgICAgIGZlZV93cml0ZShiYXNlLCAweDYwLAorCQlkYWMsIDIpOworCisgICAgICAvKiBXZSBub3cgc2hvdWxkIHZlcmlmeSBoZXJlIHRoYXQgdGhlIEVFcHJvbSB3cml0dGluZyB3YXMgb2sgKi8KKworICAgICAgLyogUmVSZWFkIHRoZSBmaXJzdCBhcmVhICovCisgICAgICBmZWVfcmVhZChiYXNlLCAweDAwLAorCSAgICAgICBhcmVhX3ZlcmlmeSwgMTYpOworCisgICAgICAvKiBSZVJlYWQgdGhlIERBQyAqLworICAgICAgZmVlX3JlYWQoYmFzZSwgMHg2MCwKKwkgICAgICAgZGFjX3ZlcmlmeSwgMik7CisKKyAgICAgIC8qIENvbXBhcmUgKi8KKyAgICAgIGlmKG1lbWNtcChhcmVhLCBhcmVhX3ZlcmlmeSwgMTYgKiAyKSB8fAorCSBtZW1jbXAoZGFjLCBkYWNfdmVyaWZ5LCAyICogMikpCisJeworI2lmZGVmIERFQlVHX0lPQ1RMX0VSUk9SCisJICBwcmludGsoS0VSTl9JTkZPICJXYXZlbGFuOiB3dl9zZXRfZnJlcXVlbmN5IDogdW5hYmxlIHRvIHdyaXRlIG5ldyBmcmVxdWVuY3kgdG8gRUVwcm9tICg/KVxuIik7CisjZW5kaWYKKwkgIHJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKyAgICAgIC8qIFdlIG11c3QgZG93bmxvYWQgdGhlIGZyZXF1ZW5jeSBwYXJhbWV0ZXJzIHRvIHRoZQorICAgICAgICogc3ludGhldGlzZXJzIChmcm9tIHRoZSBFRXByb20gLSBhcmVhIDEpCisgICAgICAgKiBOb3RlIDogYXMgdGhlIEVFcHJvbSBpcyBhdXRvIGRlY3JlbWVudGVkLCB3ZSBzZXQgdGhlIGVuZAorICAgICAgICogaWYgdGhlIGFyZWEuLi4gKi8KKyAgICAgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIDB4MEYpOworICAgICAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwKKwkgICAgICBNTVdfRkVFX0NUUkxfUkVBRCB8IE1NV19GRUVfQ1RSTF9EV0xEKTsKKworICAgICAgLyogV2FpdCB1bnRpbCB0aGUgZG93bmxvYWQgaXMgZmluaXNoZWQgKi8KKyAgICAgIGZlZV93YWl0KGJhc2UsIDEwMCwgMTAwKTsKKworICAgICAgLyogV2UgbXVzdCBub3cgZG93bmxvYWQgdGhlIHBvd2VyIGFkanVzdCB2YWx1ZSAoZ2FpbikgdG8KKyAgICAgICAqIHRoZSBzeW50aGV0aXNlcnMgKGZyb20gdGhlIEVFcHJvbSAtIGFyZWEgNyAtIERBQykgKi8KKyAgICAgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mZWVfYWRkciksIDB4NjEpOworICAgICAgbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2ZlZV9jdHJsKSwKKwkgICAgICBNTVdfRkVFX0NUUkxfUkVBRCB8IE1NV19GRUVfQ1RSTF9EV0xEKTsKKworICAgICAgLyogV2FpdCB1bnRpbCB0aGUgZG93bmxvYWQgaXMgZmluaXNoZWQgKi8KKyAgICAgIGZlZV93YWl0KGJhc2UsIDEwMCwgMTAwKTsKKworI2lmZGVmIERFQlVHX0lPQ1RMX0lORk8KKyAgICAgIC8qIFZlcmlmaWNhdGlvbiBvZiB3aGF0IHdlIGhhdmUgZG9uZS4uLiAqLworCisgICAgICBwcmludGsoS0VSTl9ERUJVRyAiV2F2ZWxhbiBFRXByb20gQXJlYSAxIDoiKTsKKyAgICAgIGZvcihpID0gMDsgaSA8IDE2OyBpKyspCisJeworCSAgcHJpbnRrKCIgJTA0WCIsCisJCSBhcmVhX3ZlcmlmeVtpXSk7CisJfQorICAgICAgcHJpbnRrKCJcbiIpOworCisgICAgICBwcmludGsoS0VSTl9ERUJVRyAiV2F2ZWxhbiBFRXByb20gREFDIDogJTA0WCAlMDRYXG4iLAorCSAgICAgZGFjX3ZlcmlmeVswXSwgZGFjX3ZlcmlmeVsxXSk7CisjZW5kaWYKKworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBlbHNlCisgICAgcmV0dXJuIC1FSU5WQUw7CQkvKiBCYWgsIG5ldmVyIGdldCB0aGVyZS4uLiAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2l2ZSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgZnJlcXVlbmNpZXMKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3d2X2ZyZXF1ZW5jeV9saXN0KHVfbG9uZwliYXNlLAkvKiBpL28gcG9ydCBvZiB0aGUgY2FyZCAqLworCQkgIGl3X2ZyZXEgKglsaXN0LAkvKiBMaXN0IG9mIGZyZXF1ZW5jeSB0byBmaWxsICovCisJCSAgaW50CQltYXgpCS8qIE1heGltdW0gbnVtYmVyIG9mIGZyZXF1ZW5jaWVzICovCit7CisgIHVfc2hvcnQJdGFibGVbMTBdOwkvKiBBdXRob3JpemVkIGZyZXF1ZW5jeSB0YWJsZSAqLworICBsb25nCQlmcmVxID0gMEw7CS8qIG9mZnNldCB0byAyLjQgR0h6IGluIC41IE1IeiArIDEyIE1IeiAqLworICBpbnQJCWk7CQkvKiBpbmRleCBpbiB0aGUgdGFibGUgKi8KKyAgY29uc3QgaW50CUJBTkRfTlVNID0gMTA7CS8qIE51bWJlciBvZiBiYW5kcyAqLworICBpbnQJCWMgPSAwOwkJLyogQ2hhbm5lbCBudW1iZXIgKi8KKworICAvKiBSZWFkIHRoZSBmcmVxdWVuY3kgdGFibGUgKi8KKyAgZmVlX3JlYWQoYmFzZSwgMHg3MSAvKiBmcmVxdWVuY3kgdGFibGUgKi8sCisJICAgdGFibGUsIDEwKTsKKworICAvKiBMb29rIGFsbCBmcmVxdWVuY2llcyAqLworICBpID0gMDsKKyAgZm9yKGZyZXEgPSAwOyBmcmVxIDwgMTUwOyBmcmVxKyspCisgICAgLyogTG9vayBpbiB0aGUgdGFibGUgaWYgdGhlIGZyZXF1ZW5jeSBpcyBhbGxvd2VkICovCisgICAgaWYodGFibGVbOSAtIChmcmVxIC8gMTYpXSAmICgxIDw8IChmcmVxICUgMTYpKSkKKyAgICAgIHsKKwkvKiBDb21wdXRlIGFwcHJveGltYXRlIGNoYW5uZWwgbnVtYmVyICovCisJd2hpbGUoKCgoY2hhbm5lbF9iYW5kc1tjXSA+PiAxKSAtIDI0KSA8IGZyZXEpICYmCisJICAgICAgKGMgPCBCQU5EX05VTSkpCisJICBjKys7CisJbGlzdFtpXS5pID0gYzsJLyogU2V0IHRoZSBsaXN0IGluZGV4ICovCisKKwkvKiBwdXQgaW4gdGhlIGxpc3QgKi8KKwlsaXN0W2ldLm0gPSAoKChmcmVxICsgMjQpICogNSkgKyAyNDAwMEwpICogMTAwMDA7CisJbGlzdFtpKytdLmUgPSAxOworCisJLyogQ2hlY2sgbnVtYmVyICovCisJaWYoaSA+PSBtYXgpCisJICByZXR1cm4oaSk7CisgICAgICB9CisKKyAgcmV0dXJuKGkpOworfQorCisjaWZkZWYgSVdfV0lSRUxFU1NfU1BZCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2F0aGVyIHdpcmVsZXNzIHNweSBzdGF0aXN0aWNzIDogZm9yIGVhY2ggcGFja2V0LCBjb21wYXJlIHRoZSBzb3VyY2UKKyAqIGFkZHJlc3Mgd2l0aCBvdXQgbGlzdCwgYW5kIGlmIG1hdGNoLCBnZXQgdGhlIHN0YXRzLi4uCisgKiBTb3JyeSwgYnV0IHRoaXMgZnVuY3Rpb24gcmVhbGx5IG5lZWQgd2lyZWxlc3MgZXh0ZW5zaW9ucy4uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3dsX3NweV9nYXRoZXIoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYsCisJICAgICAgdV9jaGFyICoJbWFjLAkJLyogTUFDIGFkZHJlc3MgKi8KKwkgICAgICB1X2NoYXIgKglzdGF0cykJCS8qIFN0YXRpc3RpY3MgdG8gZ2F0aGVyICovCit7CisgIHN0cnVjdCBpd19xdWFsaXR5IHdzdGF0czsKKworICB3c3RhdHMucXVhbCA9IHN0YXRzWzJdICYgTU1SX1NHTkxfUVVBTDsKKyAgd3N0YXRzLmxldmVsID0gc3RhdHNbMF0gJiBNTVJfU0lHTkFMX0xWTDsKKyAgd3N0YXRzLm5vaXNlID0gc3RhdHNbMV0gJiBNTVJfU0lMRU5DRV9MVkw7CisgIHdzdGF0cy51cGRhdGVkID0gMHg3OworCisgIC8qIFVwZGF0ZSBzcHkgcmVjb3JkcyAqLworICB3aXJlbGVzc19zcHlfdXBkYXRlKGRldiwgbWFjLCAmd3N0YXRzKTsKK30KKyNlbmRpZgkvKiBJV19XSVJFTEVTU19TUFkgKi8KKworI2lmZGVmIEhJU1RPR1JBTQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlIGFuIGhpc3RvZ3JhbSBvbiB0aGUgc2lnbmFsIGxldmVsLgorICogQXMgdGhlIG5vaXNlIGlzIHF1aXRlIGNvbnN0YW50LCBpdCdzIGxpa2UgZG9pbmcgaXQgb24gdGhlIFNOUi4KKyAqIFdlIGhhdmUgZGVmaW5lZCBhIHNldCBvZiBpbnRlcnZhbCAobHAtPmhpc19yYW5nZSksIGFuZCBlYWNoIHRpbWUKKyAqIHRoZSBsZXZlbCBnb2VzIGluIHRoYXQgaW50ZXJ2YWwsIHdlIGluY3JlbWVudCB0aGUgY291bnQgKGxwLT5oaXNfc3VtKS4KKyAqIFdpdGggdGhpcyBoaXN0b2dyYW0geW91IG1heSBkZXRlY3QgaWYgb25lIHdhdmVsYW4gaXMgcmVhbGx5IHdlYWssCisgKiBvciB5b3UgbWF5IGFsc28gY2FsY3VsYXRlIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIGxldmVsLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAord2xfaGlzX2dhdGhlcihzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkgICAgICB1X2NoYXIgKglzdGF0cykJCS8qIFN0YXRpc3RpY3MgdG8gZ2F0aGVyICovCit7CisgIG5ldF9sb2NhbCAqCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgdV9jaGFyCWxldmVsID0gc3RhdHNbMF0gJiBNTVJfU0lHTkFMX0xWTDsKKyAgaW50CQlpOworCisgIC8qIEZpbmQgdGhlIGNvcnJlY3QgaW50ZXJ2YWwgKi8KKyAgaSA9IDA7CisgIHdoaWxlKChpIDwgKGxwLT5oaXNfbnVtYmVyIC0gMSkpICYmIChsZXZlbCA+PSBscC0+aGlzX3JhbmdlW2krK10pKQorICAgIDsKKworICAvKiBJbmNyZW1lbnQgaW50ZXJ2YWwgY291bnRlciAqLworICAobHAtPmhpc19zdW1baV0pKys7Cit9CisjZW5kaWYJLyogSElTVE9HUkFNICovCisKK3N0YXRpYyB2b2lkIHdsX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RybmNweShpbmZvLT5kcml2ZXIsICJ3YXZlbGFuX2NzIiwgc2l6ZW9mKGluZm8tPmRyaXZlciktMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgb3BzID0geworCS5nZXRfZHJ2aW5mbyA9IHdsX2dldF9kcnZpbmZvCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBwcm90b2NvbCBuYW1lCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlzdHJjcHkod3JxdS0+bmFtZSwgIldhdmVMQU4iKTsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBzZXQgTldJRAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X253aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJa2lvX2FkZHJfdCBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcHNhX3QgcHNhOworCW1tX3QgbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBTZXQgTldJRCBpbiBXYXZlTEFOLiAqLworCWlmICghd3JxdS0+bndpZC5kaXNhYmxlZCkgeworCQkvKiBTZXQgTldJRCBpbiBwc2EgKi8KKwkJcHNhLnBzYV9ud2lkWzBdID0gKHdycXUtPm53aWQudmFsdWUgJiAweEZGMDApID4+IDg7CisJCXBzYS5wc2FfbndpZFsxXSA9IHdycXUtPm53aWQudmFsdWUgJiAweEZGOworCQlwc2EucHNhX253aWRfc2VsZWN0ID0gMHgwMTsKKwkJcHNhX3dyaXRlKGRldiwKKwkJCSAgKGNoYXIgKikgcHNhLnBzYV9ud2lkIC0gKGNoYXIgKikgJnBzYSwKKwkJCSAgKHVuc2lnbmVkIGNoYXIgKikgcHNhLnBzYV9ud2lkLCAzKTsKKworCQkvKiBTZXQgTldJRCBpbiBtbWMuICovCisJCW0udy5tbXdfbmV0d19pZF9sID0gcHNhLnBzYV9ud2lkWzFdOworCQltLncubW13X25ldHdfaWRfaCA9IHBzYS5wc2FfbndpZFswXTsKKwkJbW1jX3dyaXRlKGJhc2UsCisJCQkgIChjaGFyICopICZtLncubW13X25ldHdfaWRfbCAtCisJCQkgIChjaGFyICopICZtLAorCQkJICAodW5zaWduZWQgY2hhciAqKSAmbS53Lm1td19uZXR3X2lkX2wsIDIpOworCQltbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfbG9vcHRfc2VsKSwgMHgwMCk7CisJfSBlbHNlIHsKKwkJLyogRGlzYWJsZSBOV0lEIGluIHRoZSBwc2EuICovCisJCXBzYS5wc2FfbndpZF9zZWxlY3QgPSAweDAwOworCQlwc2Ffd3JpdGUoZGV2LAorCQkJICAoY2hhciAqKSAmcHNhLnBzYV9ud2lkX3NlbGVjdCAtCisJCQkgIChjaGFyICopICZwc2EsCisJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX253aWRfc2VsZWN0LAorCQkJICAxKTsKKworCQkvKiBEaXNhYmxlIE5XSUQgaW4gdGhlIG1tYyAobm8gZmlsdGVyaW5nKS4gKi8KKwkJbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X2xvb3B0X3NlbCksCisJCQlNTVdfTE9PUFRfU0VMX0RJU19OV0lEKTsKKwl9CisJLyogdXBkYXRlIHRoZSBXYXZlbGFuIGNoZWNrc3VtICovCisJdXBkYXRlX3BzYV9jaGVja3N1bShkZXYpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBOV0lEIAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X253aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIFJlYWQgdGhlIE5XSUQuICovCisJcHNhX3JlYWQoZGV2LAorCQkgKGNoYXIgKikgcHNhLnBzYV9ud2lkIC0gKGNoYXIgKikgJnBzYSwKKwkJICh1bnNpZ25lZCBjaGFyICopIHBzYS5wc2FfbndpZCwgMyk7CisJd3JxdS0+bndpZC52YWx1ZSA9IChwc2EucHNhX253aWRbMF0gPDwgOCkgKyBwc2EucHNhX253aWRbMV07CisJd3JxdS0+bndpZC5kaXNhYmxlZCA9ICEocHNhLnBzYV9ud2lkX3NlbGVjdCk7CisJd3JxdS0+bndpZC5maXhlZCA9IDE7CS8qIFN1cGVyZmx1b3VzICovCisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IGZyZXF1ZW5jeQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJa2lvX2FkZHJfdCBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBBdHRlbXB0IHRvIHJlY29nbmlzZSAyLjAwIGNhcmRzICgyLjQgR0h6IGZyZXF1ZW5jeSBzZWxlY3RhYmxlKS4gKi8KKwlpZiAoIShtbWNfaW4oYmFzZSwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorCSAgICAgIChNTVJfRkVFX1NUQVRVU19EV0xEIHwgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpKQorCQlyZXQgPSB3dl9zZXRfZnJlcXVlbmN5KGJhc2UsICYod3JxdS0+ZnJlcSkpOworCWVsc2UKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IGZyZXF1ZW5jeQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJa2lvX2FkZHJfdCBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIEF0dGVtcHQgdG8gcmVjb2duaXNlIDIuMDAgY2FyZHMgKDIuNCBHSHogZnJlcXVlbmN5IHNlbGVjdGFibGUpLgorCSAqIERvZXMgaXQgd29yayBmb3IgZXZlcnlib2R5LCBlc3BlY2lhbGx5IG9sZCBjYXJkcz8gKi8KKwlpZiAoIShtbWNfaW4oYmFzZSwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorCSAgICAgIChNTVJfRkVFX1NUQVRVU19EV0xEIHwgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpKSB7CisJCXVuc2lnbmVkIHNob3J0IGZyZXE7CisKKwkJLyogQXNrIHRoZSBFRVBST00gdG8gcmVhZCB0aGUgZnJlcXVlbmN5IGZyb20gdGhlIGZpcnN0IGFyZWEuICovCisJCWZlZV9yZWFkKGJhc2UsIDB4MDAsICZmcmVxLCAxKTsKKwkJd3JxdS0+ZnJlcS5tID0gKChmcmVxID4+IDUpICogNSArIDI0MDAwTCkgKiAxMDAwMDsKKwkJd3JxdS0+ZnJlcS5lID0gMTsKKwl9IGVsc2UgeworCQlwc2FfcmVhZChkZXYsCisJCQkgKGNoYXIgKikgJnBzYS5wc2Ffc3ViYmFuZCAtIChjaGFyICopICZwc2EsCisJCQkgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS5wc2Ffc3ViYmFuZCwgMSk7CisKKwkJaWYgKHBzYS5wc2Ffc3ViYmFuZCA8PSA0KSB7CisJCQl3cnF1LT5mcmVxLm0gPSBmaXhlZF9iYW5kc1twc2EucHNhX3N1YmJhbmRdOworCQkJd3JxdS0+ZnJlcS5lID0gKHBzYS5wc2Ffc3ViYmFuZCAhPSAwKTsKKwkJfSBlbHNlCisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogc2V0IGxldmVsIHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJa2lvX2FkZHJfdCBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIFNldCB0aGUgbGV2ZWwgdGhyZXNob2xkLiAqLworCS8qIFdlIHNob3VsZCBjb21wbGFpbiBsb3VkbHkgaWYgd3JxdS0+c2Vucy5maXhlZCA9IDAsIGJlY2F1c2Ugd2UKKwkgKiBjYW4ndCBzZXQgYXV0byBtb2RlLi4uICovCisJcHNhLnBzYV90aHJfcHJlX3NldCA9IHdycXUtPnNlbnMudmFsdWUgJiAweDNGOworCXBzYV93cml0ZShkZXYsCisJCSAgKGNoYXIgKikgJnBzYS5wc2FfdGhyX3ByZV9zZXQgLSAoY2hhciAqKSAmcHNhLAorCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX3Rocl9wcmVfc2V0LCAxKTsKKwkvKiB1cGRhdGUgdGhlIFdhdmVsYW4gY2hlY2tzdW0gKi8KKwl1cGRhdGVfcHNhX2NoZWNrc3VtKGRldik7CisJbW1jX291dChiYXNlLCBtbXdvZmYoMCwgbW13X3Rocl9wcmVfc2V0KSwKKwkJcHNhLnBzYV90aHJfcHJlX3NldCk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IGxldmVsIHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X3NlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIFJlYWQgdGhlIGxldmVsIHRocmVzaG9sZC4gKi8KKwlwc2FfcmVhZChkZXYsCisJCSAoY2hhciAqKSAmcHNhLnBzYV90aHJfcHJlX3NldCAtIChjaGFyICopICZwc2EsCisJCSAodW5zaWduZWQgY2hhciAqKSAmcHNhLnBzYV90aHJfcHJlX3NldCwgMSk7CisJd3JxdS0+c2Vucy52YWx1ZSA9IHBzYS5wc2FfdGhyX3ByZV9zZXQgJiAweDNGOworCXdycXUtPnNlbnMuZml4ZWQgPSAxOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBlbmNyeXB0aW9uIGtleQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgICBjaGFyICpleHRyYSkKK3sKKwlraW9fYWRkcl90IGJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXBzYV90IHBzYTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayBpZiBjYXBhYmxlIG9mIGVuY3J5cHRpb24gKi8KKwlpZiAoIW1tY19lbmNyKGJhc2UpKSB7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKworCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBrZXkgKi8KKwlpZigod3JxdS0+ZW5jb2RpbmcubGVuZ3RoICE9IDgpICYmICh3cnF1LT5lbmNvZGluZy5sZW5ndGggIT0gMCkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlpZighcmV0KSB7CisJCS8qIEJhc2ljIGNoZWNraW5nLi4uICovCisJCWlmICh3cnF1LT5lbmNvZGluZy5sZW5ndGggPT0gOCkgeworCQkJLyogQ29weSB0aGUga2V5IGluIHRoZSBkcml2ZXIgKi8KKwkJCW1lbWNweShwc2EucHNhX2VuY3J5cHRpb25fa2V5LCBleHRyYSwKKwkJCSAgICAgICB3cnF1LT5lbmNvZGluZy5sZW5ndGgpOworCQkJcHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCA9IDE7CisKKwkJCXBzYV93cml0ZShkZXYsCisJCQkJICAoY2hhciAqKSAmcHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCAtCisJCQkJICAoY2hhciAqKSAmcHNhLAorCQkJCSAgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS4KKwkJCQkgIHBzYV9lbmNyeXB0aW9uX3NlbGVjdCwgOCArIDEpOworCisJCQltbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZW5jcl9lbmFibGUpLAorCQkJCU1NV19FTkNSX0VOQUJMRV9FTiB8IE1NV19FTkNSX0VOQUJMRV9NT0RFKTsKKwkJCW1tY193cml0ZShiYXNlLCBtbXdvZmYoMCwgbW13X2VuY3Jfa2V5KSwKKwkJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EuCisJCQkJICBwc2FfZW5jcnlwdGlvbl9rZXksIDgpOworCQl9CisKKwkJLyogZGlzYWJsZSBlbmNyeXB0aW9uICovCisJCWlmICh3cnF1LT5lbmNvZGluZy5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgeworCQkJcHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCA9IDA7CisJCQlwc2Ffd3JpdGUoZGV2LAorCQkJCSAgKGNoYXIgKikgJnBzYS5wc2FfZW5jcnlwdGlvbl9zZWxlY3QgLQorCQkJCSAgKGNoYXIgKikgJnBzYSwKKwkJCQkgICh1bnNpZ25lZCBjaGFyICopICZwc2EuCisJCQkJICBwc2FfZW5jcnlwdGlvbl9zZWxlY3QsIDEpOworCisJCQltbWNfb3V0KGJhc2UsIG1td29mZigwLCBtbXdfZW5jcl9lbmFibGUpLCAwKTsKKwkJfQorCQkvKiB1cGRhdGUgdGhlIFdhdmVsYW4gY2hlY2tzdW0gKi8KKwkJdXBkYXRlX3BzYV9jaGVja3N1bShkZXYpOworCX0KKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGFuZCByZXN0b3JlIGZsYWdzLiAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgZW5jcnlwdGlvbiBrZXkKKyAqLworc3RhdGljIGludCB3YXZlbGFuX2dldF9lbmNvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgICAgY2hhciAqZXh0cmEpCit7CisJa2lvX2FkZHJfdCBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIENoZWNrIGlmIGVuY3J5cHRpb24gaXMgYXZhaWxhYmxlICovCisJaWYgKCFtbWNfZW5jcihiYXNlKSkgeworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9IGVsc2UgeworCQkvKiBSZWFkIHRoZSBlbmNyeXB0aW9uIGtleSAqLworCQlwc2FfcmVhZChkZXYsCisJCQkgKGNoYXIgKikgJnBzYS5wc2FfZW5jcnlwdGlvbl9zZWxlY3QgLQorCQkJIChjaGFyICopICZwc2EsCisJCQkgKHVuc2lnbmVkIGNoYXIgKikgJnBzYS4KKwkJCSBwc2FfZW5jcnlwdGlvbl9zZWxlY3QsIDEgKyA4KTsKKworCQkvKiBlbmNyeXB0aW9uIGlzIGVuYWJsZWQgPyAqLworCQlpZiAocHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCkKKwkJCXdycXUtPmVuY29kaW5nLmZsYWdzID0gSVdfRU5DT0RFX0VOQUJMRUQ7CisJCWVsc2UKKwkJCXdycXUtPmVuY29kaW5nLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQl3cnF1LT5lbmNvZGluZy5mbGFncyB8PSBtbWNfZW5jcihiYXNlKTsKKworCQkvKiBDb3B5IHRoZSBrZXkgdG8gdGhlIHVzZXIgYnVmZmVyICovCisJCXdycXUtPmVuY29kaW5nLmxlbmd0aCA9IDg7CisJCW1lbWNweShleHRyYSwgcHNhLnBzYV9lbmNyeXB0aW9uX2tleSwgd3JxdS0+ZW5jb2RpbmcubGVuZ3RoKTsKKwl9CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkdfRVhUCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBFU1NJRCAoZG9tYWluKQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgIGNoYXIgKmV4dHJhKQoreworCW5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCS8qIENoZWNrIGlmIGRpc2FibGUgKi8KKwlpZih3cnF1LT5kYXRhLmZsYWdzID09IDApCisJCWxwLT5maWx0ZXJfZG9tYWlucyA9IDA7CisJZWxzZSB7CisJCWNoYXIJZXNzaWRbSVdfRVNTSURfTUFYX1NJWkUgKyAxXTsKKwkJY2hhciAqCWVuZHA7CisKKwkJLyogVGVybWluYXRlIHRoZSBzdHJpbmcgKi8KKwkJbWVtY3B5KGVzc2lkLCBleHRyYSwgd3JxdS0+ZGF0YS5sZW5ndGgpOworCQllc3NpZFtJV19FU1NJRF9NQVhfU0laRV0gPSAnXDAnOworCisjaWZkZWYgREVCVUdfSU9DVExfSU5GTworCQlwcmludGsoS0VSTl9ERUJVRyAiU2V0RXNzaWQgOiBgYCVzJydcbiIsIGVzc2lkKTsKKyNlbmRpZgkvKiBERUJVR19JT0NUTF9JTkZPICovCisKKwkJLyogQ29udmVydCB0byBhIG51bWJlciAobm90ZSA6IFdhdmVsYW4gc3BlY2lmaWMpICovCisJCWxwLT5kb21haW5faWQgPSBzaW1wbGVfc3RydG91bChlc3NpZCwgJmVuZHAsIDE2KTsKKwkJLyogSGFzIGl0IHdvcmtlZCAgPyAqLworCQlpZihlbmRwID4gZXNzaWQpCisJCQlscC0+ZmlsdGVyX2RvbWFpbnMgPSAxOworCQllbHNlIHsKKwkJCWxwLT5maWx0ZXJfZG9tYWlucyA9IDA7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJfQorCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBFU1NJRCAoZG9tYWluKQorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgIGNoYXIgKmV4dHJhKQoreworCW5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogSXMgdGhlIGRvbWFpbiBJRCBhY3RpdmUgPyAqLworCXdycXUtPmRhdGEuZmxhZ3MgPSBscC0+ZmlsdGVyX2RvbWFpbnM7CisKKwkvKiBDb3B5IERvbWFpbiBJRCBpbnRvIGEgc3RyaW5nIChXYXZlbGFuIHNwZWNpZmljKSAqLworCS8qIFNvdW5kIGNyYXp5LCBiZSB3ZSBjYW4ndCBoYXZlIGEgc25wcmludGYgaW4gdGhlIGtlcm5lbCAhISEgKi8KKwlzcHJpbnRmKGV4dHJhLCAiJWxYIiwgbHAtPmRvbWFpbl9pZCk7CisJZXh0cmFbSVdfRVNTSURfTUFYX1NJWkVdID0gJ1wwJzsKKworCS8qIFNldCB0aGUgbGVuZ3RoICovCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBBUCBhZGRyZXNzCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgIGNoYXIgKmV4dHJhKQoreworI2lmZGVmIERFQlVHX0lPQ1RMX0lORk8KKwlwcmludGsoS0VSTl9ERUJVRyAiU2V0IEFQIHRvIDogJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCisJICAgICAgIHdycXUtPmFwX2FkZHIuc2FfZGF0YVswXSwKKwkgICAgICAgd3JxdS0+YXBfYWRkci5zYV9kYXRhWzFdLAorCSAgICAgICB3cnF1LT5hcF9hZGRyLnNhX2RhdGFbMl0sCisJICAgICAgIHdycXUtPmFwX2FkZHIuc2FfZGF0YVszXSwKKwkgICAgICAgd3JxdS0+YXBfYWRkci5zYV9kYXRhWzRdLAorCSAgICAgICB3cnF1LT5hcF9hZGRyLnNhX2RhdGFbNV0pOworI2VuZGlmCS8qIERFQlVHX0lPQ1RMX0lORk8gKi8KKworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIEhhbmRsZXIgOiBnZXQgQVAgYWRkcmVzcworICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICBjaGFyICpleHRyYSkKK3sKKwkvKiBTaG91bGQgZ2V0IHRoZSByZWFsIE1jQ295IGluc3RlYWQgb2Ygb3duIEV0aGVybmV0IGFkZHJlc3MgKi8KKwltZW1jcHkod3JxdS0+YXBfYWRkci5zYV9kYXRhLCBkZXYtPmRldl9hZGRyLCBXQVZFTEFOX0FERFJfU0laRSk7CisJd3JxdS0+YXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HX0VYVCAqLworCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IHNldCBtb2RlCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIG1vZGUgKi8KKwlzd2l0Y2god3JxdS0+bW9kZSkgeworCWNhc2UgSVdfTU9ERV9BREhPQzoKKwkJaWYoZG9fcm9hbWluZykgeworCQkJd3Zfcm9hbV9jbGVhbnVwKGRldik7CisJCQlkb19yb2FtaW5nID0gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIElXX01PREVfSU5GUkE6CisJCWlmKCFkb19yb2FtaW5nKSB7CisJCQl3dl9yb2FtX2luaXQoZGV2KTsKKwkJCWRvX3JvYW1pbmcgPSAxOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgSGFuZGxlciA6IGdldCBtb2RlCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlpZihkb19yb2FtaW5nKQorCQl3cnF1LT5tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwllbHNlCisJCXdycXUtPm1vZGUgPSBJV19NT0RFX0FESE9DOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBIYW5kbGVyIDogZ2V0IHJhbmdlIGluZm8KKyAqLworc3RhdGljIGludCB3YXZlbGFuX2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgICBjaGFyICpleHRyYSkKK3sKKwlraW9fYWRkcl90IGJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJLyogU2V0IHRoZSBsZW5ndGggKHZlcnkgaW1wb3J0YW50IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KSAqLworCXdycXUtPmRhdGEubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpd19yYW5nZSk7CisKKwkvKiBTZXQgYWxsIHRoZSBpbmZvIHdlIGRvbid0IGNhcmUgb3IgZG9uJ3Qga25vdyBhYm91dCB0byB6ZXJvICovCisJbWVtc2V0KHJhbmdlLCAwLCBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKSk7CisKKwkvKiBTZXQgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbiB2ZXJzaW9ucyAqLworCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDk7CisKKwkvKiBTZXQgaW5mb3JtYXRpb24gaW4gdGhlIHJhbmdlIHN0cnVjdC4gICovCisJcmFuZ2UtPnRocm91Z2hwdXQgPSAxLjQgKiAxMDAwICogMTAwMDsJLyogZG9uJ3QgYXJndWUgb24gdGhpcyAhICovCisJcmFuZ2UtPm1pbl9ud2lkID0gMHgwMDAwOworCXJhbmdlLT5tYXhfbndpZCA9IDB4RkZGRjsKKworCXJhbmdlLT5zZW5zaXRpdml0eSA9IDB4M0Y7CisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSBNTVJfU0dOTF9RVUFMOworCXJhbmdlLT5tYXhfcXVhbC5sZXZlbCA9IE1NUl9TSUdOQUxfTFZMOworCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IE1NUl9TSUxFTkNFX0xWTDsKKwlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IE1NUl9TR05MX1FVQUw7IC8qIEFsd2F5cyBtYXggKi8KKwkvKiBOZWVkIHRvIGdldCBiZXR0ZXIgdmFsdWVzIGZvciB0aG9zZSB0d28gKi8KKwlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAzMDsKKwlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSA4OworCisJcmFuZ2UtPm51bV9iaXRyYXRlcyA9IDE7CisJcmFuZ2UtPmJpdHJhdGVbMF0gPSAyMDAwMDAwOwkvKiAyIE1iL3MgKi8KKworCS8qIEV2ZW50IGNhcGFiaWxpdHkgKGtlcm5lbCArIGRyaXZlcikgKi8KKwlyYW5nZS0+ZXZlbnRfY2FwYVswXSA9IChJV19FVkVOVF9DQVBBX01BU0soMHg4QjAyKSB8CisJCQkJSVdfRVZFTlRfQ0FQQV9NQVNLKDB4OEIwNCkgfAorCQkJCUlXX0VWRU5UX0NBUEFfTUFTSygweDhCMDYpKTsKKwlyYW5nZS0+ZXZlbnRfY2FwYVsxXSA9IElXX0VWRU5UX0NBUEFfS18xOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBBdHRlbXB0IHRvIHJlY29nbmlzZSAyLjAwIGNhcmRzICgyLjQgR0h6IGZyZXF1ZW5jeSBzZWxlY3RhYmxlKS4gKi8KKwlpZiAoIShtbWNfaW4oYmFzZSwgbW1yb2ZmKDAsIG1tcl9mZWVfc3RhdHVzKSkgJgorCSAgICAgIChNTVJfRkVFX1NUQVRVU19EV0xEIHwgTU1SX0ZFRV9TVEFUVVNfQlVTWSkpKSB7CisJCXJhbmdlLT5udW1fY2hhbm5lbHMgPSAxMDsKKwkJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSB3dl9mcmVxdWVuY3lfbGlzdChiYXNlLCByYW5nZS0+ZnJlcSwKKwkJCQkJCQlJV19NQVhfRlJFUVVFTkNJRVMpOworCX0gZWxzZQorCQlyYW5nZS0+bnVtX2NoYW5uZWxzID0gcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSAwOworCisJLyogRW5jcnlwdGlvbiBzdXBwb3J0ZWQgPyAqLworCWlmIChtbWNfZW5jcihiYXNlKSkgeworCQlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVswXSA9IDg7CS8qIERFUyA9IDY0IGJpdHMga2V5ICovCisJCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAxOworCQlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IDE7CS8qIE9ubHkgb25lIGtleSBwb3NzaWJsZSAqLworCX0gZWxzZSB7CisJCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAwOworCQlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IDA7CisJfQorCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgUHJpdmF0ZSBIYW5kbGVyIDogc2V0IHF1YWxpdHkgdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfcXRocihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlraW9fYWRkcl90IGJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwc2FfdCBwc2E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhbmQgc2F2ZSBmbGFncy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisJCisJcHNhLnBzYV9xdWFsaXR5X3RociA9ICooZXh0cmEpICYgMHgwRjsKKwlwc2Ffd3JpdGUoZGV2LAorCQkgIChjaGFyICopICZwc2EucHNhX3F1YWxpdHlfdGhyIC0gKGNoYXIgKikgJnBzYSwKKwkJICAodW5zaWduZWQgY2hhciAqKSAmcHNhLnBzYV9xdWFsaXR5X3RociwgMSk7CisJLyogdXBkYXRlIHRoZSBXYXZlbGFuIGNoZWNrc3VtICovCisJdXBkYXRlX3BzYV9jaGVja3N1bShkZXYpOworCW1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19xdWFsaXR5X3RociksCisJCXBzYS5wc2FfcXVhbGl0eV90aHIpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IGdldCBxdWFsaXR5IHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IHdhdmVsYW5fZ2V0X3F0aHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsCisJCQkgICAgY2hhciAqZXh0cmEpCit7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisJcHNhX3QgcHNhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIHNhdmUgZmxhZ3MuICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCQorCXBzYV9yZWFkKGRldiwKKwkJIChjaGFyICopICZwc2EucHNhX3F1YWxpdHlfdGhyIC0gKGNoYXIgKikgJnBzYSwKKwkJICh1bnNpZ25lZCBjaGFyICopICZwc2EucHNhX3F1YWxpdHlfdGhyLCAxKTsKKwkqKGV4dHJhKSA9IHBzYS5wc2FfcXVhbGl0eV90aHIgJiAweDBGOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYW5kIHJlc3RvcmUgZmxhZ3MuICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIFdBVkVMQU5fUk9BTUlORworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IHNldCByb2FtaW5nCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9zZXRfcm9hbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBzYXZlIGZsYWdzLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKwkKKwkvKiBOb3RlIDogc2hvdWxkIGNoZWNrIGlmIHVzZXIgPT0gcm9vdCAqLworCWlmKGRvX3JvYW1pbmcgJiYgKCpleHRyYSk9PTApCisJCXd2X3JvYW1fY2xlYW51cChkZXYpOworCWVsc2UgaWYoZG9fcm9hbWluZz09MCAmJiAoKmV4dHJhKSE9MCkKKwkJd3Zfcm9hbV9pbml0KGRldik7CisKKwlkb19yb2FtaW5nID0gKCpleHRyYSk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVzdG9yZSBmbGFncy4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2lyZWxlc3MgUHJpdmF0ZSBIYW5kbGVyIDogZ2V0IHF1YWxpdHkgdGhyZXNob2xkCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfcm9hbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICBjaGFyICpleHRyYSkKK3sKKwkqKGV4dHJhKSA9IGRvX3JvYW1pbmc7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkvKiBXQVZFTEFOX1JPQU1JTkcgKi8KKworI2lmZGVmIEhJU1RPR1JBTQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFdpcmVsZXNzIFByaXZhdGUgSGFuZGxlciA6IHNldCBoaXN0b2dyYW0KKyAqLworc3RhdGljIGludCB3YXZlbGFuX3NldF9oaXN0byhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LAorCQkJICAgICBjaGFyICpleHRyYSkKK3sKKwluZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIENoZWNrIHRoZSBudW1iZXIgb2YgaW50ZXJ2YWxzLiAqLworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IDE2KSB7CisJCXJldHVybigtRTJCSUcpOworCX0KKworCS8qIERpc2FibGUgaGlzdG8gd2hpbGUgd2UgY29weSB0aGUgYWRkcmVzc2VzLgorCSAqIEFzIHdlIGRvbid0IGRpc2FibGUgaW50ZXJydXB0cywgd2UgbmVlZCB0byBkbyB0aGlzICovCisJbHAtPmhpc19udW1iZXIgPSAwOworCisJLyogQXJlIHRoZXJlIHJhbmdlcyB0byBjb3B5PyAqLworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IDApIHsKKwkJLyogQ29weSBpbnRlcnZhbCByYW5nZXMgdG8gdGhlIGRyaXZlciAqLworCQltZW1jcHkobHAtPmhpc19yYW5nZSwgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKKworCQl7CisJCSAgaW50IGk7CisJCSAgcHJpbnRrKEtFUk5fREVCVUcgIkhpc3RvIDoiKTsKKwkJICBmb3IoaSA9IDA7IGkgPCB3cnF1LT5kYXRhLmxlbmd0aDsgaSsrKQorCQkgICAgcHJpbnRrKCIgJWQiLCBscC0+aGlzX3JhbmdlW2ldKTsKKwkJICBwcmludGsoIlxuIik7CisJCX0KKworCQkvKiBSZXNldCByZXN1bHQgc3RydWN0dXJlLiAqLworCQltZW1zZXQobHAtPmhpc19zdW0sIDB4MDAsIHNpemVvZihsb25nKSAqIDE2KTsKKwl9CisKKwkvKiBOb3cgd2UgY2FuIHNldCB0aGUgbnVtYmVyIG9mIHJhbmdlcyAqLworCWxwLT5oaXNfbnVtYmVyID0gd3JxdS0+ZGF0YS5sZW5ndGg7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBXaXJlbGVzcyBQcml2YXRlIEhhbmRsZXIgOiBnZXQgaGlzdG9ncmFtCisgKi8KK3N0YXRpYyBpbnQgd2F2ZWxhbl9nZXRfaGlzdG8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwKKwkJCSAgICAgY2hhciAqZXh0cmEpCit7CisJbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBTZXQgdGhlIG51bWJlciBvZiBpbnRlcnZhbHMuICovCisJd3JxdS0+ZGF0YS5sZW5ndGggPSBscC0+aGlzX251bWJlcjsKKworCS8qIEdpdmUgYmFjayB0aGUgZGlzdHJpYnV0aW9uIHN0YXRpc3RpY3MgKi8KKwlpZihscC0+aGlzX251bWJlciA+IDApCisJCW1lbWNweShleHRyYSwgbHAtPmhpc19zdW0sIHNpemVvZihsb25nKSAqIGxwLT5oaXNfbnVtYmVyKTsKKworCXJldHVybigwKTsKK30KKyNlbmRpZgkJCS8qIEhJU1RPR1JBTSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogU3RydWN0dXJlcyB0byBleHBvcnQgdGhlIFdpcmVsZXNzIEhhbmRsZXJzCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3Mgd2F2ZWxhbl9wcml2YXRlX2FyZ3NbXSA9IHsKKy8qeyBjbWQsICAgICAgICAgc2V0X2FyZ3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9hcmdzLCBuYW1lIH0gKi8KKyAgeyBTSU9DU0lQUVRIUiwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic2V0cXVhbHRociIgfSwKKyAgeyBTSU9DR0lQUVRIUiwgMCwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0cXVhbHRociIgfSwKKyAgeyBTSU9DU0lQUk9BTSwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAic2V0cm9hbSIgfSwKKyAgeyBTSU9DR0lQUk9BTSwgMCwgSVdfUFJJVl9UWVBFX0JZVEUgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAiZ2V0cm9hbSIgfSwKKyAgeyBTSU9DU0lQSElTVE8sIElXX1BSSVZfVFlQRV9CWVRFIHwgMTYsICAgICAgICAgICAgICAgICAgICAwLCAic2V0aGlzdG8iIH0sCisgIHsgU0lPQ0dJUEhJU1RPLCAwLCAgICAgICAgICAgICAgICAgICAgIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwgImdldGhpc3RvIiB9LAorfTsKKworc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIJCXdhdmVsYW5faGFuZGxlcltdID0KK3sKKwlOVUxMLAkJCQkvKiBTSU9DU0lXTkFNRSAqLworCXdhdmVsYW5fZ2V0X25hbWUsCQkvKiBTSU9DR0lXTkFNRSAqLworCXdhdmVsYW5fc2V0X253aWQsCQkvKiBTSU9DU0lXTldJRCAqLworCXdhdmVsYW5fZ2V0X253aWQsCQkvKiBTSU9DR0lXTldJRCAqLworCXdhdmVsYW5fc2V0X2ZyZXEsCQkvKiBTSU9DU0lXRlJFUSAqLworCXdhdmVsYW5fZ2V0X2ZyZXEsCQkvKiBTSU9DR0lXRlJFUSAqLworI2lmZGVmIFdBVkVMQU5fUk9BTUlORworCXdhdmVsYW5fc2V0X21vZGUsCQkvKiBTSU9DU0lXTU9ERSAqLworCXdhdmVsYW5fZ2V0X21vZGUsCQkvKiBTSU9DR0lXTU9ERSAqLworI2Vsc2UJLyogV0FWRUxBTl9ST0FNSU5HICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV01PREUgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXTU9ERSAqLworI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworCXdhdmVsYW5fc2V0X3NlbnMsCQkvKiBTSU9DU0lXU0VOUyAqLworCXdhdmVsYW5fZ2V0X3NlbnMsCQkvKiBTSU9DR0lXU0VOUyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSQU5HRSAqLworCXdhdmVsYW5fZ2V0X3JhbmdlLAkJLyogU0lPQ0dJV1JBTkdFICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1BSSVYgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUFJJViAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdTVEFUUyAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdTVEFUUyAqLworCWl3X2hhbmRsZXJfc2V0X3NweSwJCS8qIFNJT0NTSVdTUFkgKi8KKwlpd19oYW5kbGVyX2dldF9zcHksCQkvKiBTSU9DR0lXU1BZICovCisJaXdfaGFuZGxlcl9zZXRfdGhyc3B5LAkJLyogU0lPQ1NJV1RIUlNQWSAqLworCWl3X2hhbmRsZXJfZ2V0X3RocnNweSwJCS8qIFNJT0NHSVdUSFJTUFkgKi8KKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkdfRVhUCisJd2F2ZWxhbl9zZXRfd2FwLAkJLyogU0lPQ1NJV0FQICovCisJd2F2ZWxhbl9nZXRfd2FwLAkJLyogU0lPQ0dJV0FQICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdBUExJU1QgKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogLS0gaG9sZSAtLSAqLworCXdhdmVsYW5fc2V0X2Vzc2lkLAkJLyogU0lPQ1NJV0VTU0lEICovCisJd2F2ZWxhbl9nZXRfZXNzaWQsCQkvKiBTSU9DR0lXRVNTSUQgKi8KKyNlbHNlCS8qIFdBVkVMQU5fUk9BTUlOR19FWFQgKi8KKwlOVUxMLAkJCQkvKiBTSU9DU0lXQVAgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXQVAgKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV0FQTElTVCAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV0VTU0lEICovCisJTlVMTCwJCQkJLyogU0lPQ0dJV0VTU0lEICovCisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HX0VYVCAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdOSUNLTiAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdOSUNLTiAqLworCU5VTEwsCQkJCS8qIC0tIGhvbGUgLS0gKi8KKwlOVUxMLAkJCQkvKiAtLSBob2xlIC0tICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV1JBVEUgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUkFURSAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSVFMgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXUlRTICovCisJTlVMTCwJCQkJLyogU0lPQ1NJV0ZSQUcgKi8KKwlOVUxMLAkJCQkvKiBTSU9DR0lXRlJBRyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdUWFBPVyAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdUWFBPVyAqLworCU5VTEwsCQkJCS8qIFNJT0NTSVdSRVRSWSAqLworCU5VTEwsCQkJCS8qIFNJT0NHSVdSRVRSWSAqLworCXdhdmVsYW5fc2V0X2VuY29kZSwJCS8qIFNJT0NTSVdFTkNPREUgKi8KKwl3YXZlbGFuX2dldF9lbmNvZGUsCQkvKiBTSU9DR0lXRU5DT0RFICovCit9OworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlcgkJd2F2ZWxhbl9wcml2YXRlX2hhbmRsZXJbXSA9Cit7CisJd2F2ZWxhbl9zZXRfcXRociwJCS8qIFNJT0NJV0ZJUlNUUFJJViAqLworCXdhdmVsYW5fZ2V0X3F0aHIsCQkvKiBTSU9DSVdGSVJTVFBSSVYgKyAxICovCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisJd2F2ZWxhbl9zZXRfcm9hbSwJCS8qIFNJT0NJV0ZJUlNUUFJJViArIDIgKi8KKwl3YXZlbGFuX2dldF9yb2FtLAkJLyogU0lPQ0lXRklSU1RQUklWICsgMyAqLworI2Vsc2UJLyogV0FWRUxBTl9ST0FNSU5HICovCisJTlVMTCwJCQkJLyogU0lPQ0lXRklSU1RQUklWICsgMiAqLworCU5VTEwsCQkJCS8qIFNJT0NJV0ZJUlNUUFJJViArIDMgKi8KKyNlbmRpZgkvKiBXQVZFTEFOX1JPQU1JTkcgKi8KKyNpZmRlZiBISVNUT0dSQU0KKwl3YXZlbGFuX3NldF9oaXN0bywJCS8qIFNJT0NJV0ZJUlNUUFJJViArIDQgKi8KKwl3YXZlbGFuX2dldF9oaXN0bywJCS8qIFNJT0NJV0ZJUlNUUFJJViArIDUgKi8KKyNlbmRpZgkvKiBISVNUT0dSQU0gKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYJd2F2ZWxhbl9oYW5kbGVyX2RlZiA9Cit7CisJLm51bV9zdGFuZGFyZAk9IHNpemVvZih3YXZlbGFuX2hhbmRsZXIpL3NpemVvZihpd19oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGUJPSBzaXplb2Yod2F2ZWxhbl9wcml2YXRlX2hhbmRsZXIpL3NpemVvZihpd19oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGVfYXJncyA9IHNpemVvZih3YXZlbGFuX3ByaXZhdGVfYXJncykvc2l6ZW9mKHN0cnVjdCBpd19wcml2X2FyZ3MpLAorCS5zdGFuZGFyZAk9IHdhdmVsYW5faGFuZGxlciwKKwkucHJpdmF0ZQk9IHdhdmVsYW5fcHJpdmF0ZV9oYW5kbGVyLAorCS5wcml2YXRlX2FyZ3MJPSB3YXZlbGFuX3ByaXZhdGVfYXJncywKKwkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gd2F2ZWxhbl9nZXRfd2lyZWxlc3Nfc3RhdHMsCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogR2V0IHdpcmVsZXNzIHN0YXRpc3RpY3MKKyAqIENhbGxlZCBieSAvcHJvYy9uZXQvd2lyZWxlc3MuLi4KKyAqLworc3RhdGljIGl3X3N0YXRzICoKK3dhdmVsYW5fZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBraW9fYWRkcl90CQliYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgIG5ldF9sb2NhbCAqCQlscCA9IG5ldGRldl9wcml2KGRldik7CisgIG1tcl90CQkJbTsKKyAgaXdfc3RhdHMgKgkJd3N0YXRzOworICB1bnNpZ25lZCBsb25nCQlmbGFnczsKKworI2lmZGVmIERFQlVHX0lPQ1RMX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX2dldF93aXJlbGVzc19zdGF0cygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKyAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICYgc2F2ZSBmbGFncyAqLworICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgd3N0YXRzID0gJmxwLT53c3RhdHM7CisKKyAgLyogR2V0IGRhdGEgZnJvbSB0aGUgbW1jICovCisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mcmVlemUpLCAxKTsKKworICBtbWNfcmVhZChiYXNlLCBtbXJvZmYoMCwgbW1yX2RjZV9zdGF0dXMpLCAmbS5tbXJfZGNlX3N0YXR1cywgMSk7CisgIG1tY19yZWFkKGJhc2UsIG1tcm9mZigwLCBtbXJfd3JvbmdfbndpZF9sKSwgJm0ubW1yX3dyb25nX253aWRfbCwgMik7CisgIG1tY19yZWFkKGJhc2UsIG1tcm9mZigwLCBtbXJfdGhyX3ByZV9zZXQpLCAmbS5tbXJfdGhyX3ByZV9zZXQsIDQpOworCisgIG1tY19vdXQoYmFzZSwgbW13b2ZmKDAsIG1td19mcmVlemUpLCAwKTsKKworICAvKiBDb3B5IGRhdGEgdG8gd2lyZWxlc3Mgc3R1ZmYgKi8KKyAgd3N0YXRzLT5zdGF0dXMgPSBtLm1tcl9kY2Vfc3RhdHVzICYgTU1SX0RDRV9TVEFUVVM7CisgIHdzdGF0cy0+cXVhbC5xdWFsID0gbS5tbXJfc2dubF9xdWFsICYgTU1SX1NHTkxfUVVBTDsKKyAgd3N0YXRzLT5xdWFsLmxldmVsID0gbS5tbXJfc2lnbmFsX2x2bCAmIE1NUl9TSUdOQUxfTFZMOworICB3c3RhdHMtPnF1YWwubm9pc2UgPSBtLm1tcl9zaWxlbmNlX2x2bCAmIE1NUl9TSUxFTkNFX0xWTDsKKyAgd3N0YXRzLT5xdWFsLnVwZGF0ZWQgPSAoKChtLm1tcl9zaWduYWxfbHZsICYgTU1SX1NJR05BTF9MVkxfVkFMSUQpID4+IDcpIHwKKwkJCSAgKChtLm1tcl9zaWduYWxfbHZsICYgTU1SX1NJR05BTF9MVkxfVkFMSUQpID4+IDYpIHwKKwkJCSAgKChtLm1tcl9zaWxlbmNlX2x2bCAmIE1NUl9TSUxFTkNFX0xWTF9WQUxJRCkgPj4gNSkpOworICB3c3RhdHMtPmRpc2NhcmQubndpZCArPSAobS5tbXJfd3JvbmdfbndpZF9oIDw8IDgpIHwgbS5tbXJfd3JvbmdfbndpZF9sOworICB3c3RhdHMtPmRpc2NhcmQuY29kZSA9IDBMOworICB3c3RhdHMtPmRpc2NhcmQubWlzYyA9IDBMOworCisgIC8qIFJlRW5hYmxlIGludGVycnVwdHMgJiByZXN0b3JlIGZsYWdzICovCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisjaWZkZWYgREVCVUdfSU9DVExfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fZ2V0X3dpcmVsZXNzX3N0YXRzKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKyAgcmV0dXJuICZscC0+d3N0YXRzOworfQorI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBQQUNLRVQgUkVDRVBUSU9OICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyBwYXJ0IGRlYWwgd2l0aCByZWNlaXZpbmcgdGhlIHBhY2tldHMuCisgKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgZ2V0IGFuIGludGVycnVwdCB3aGVuIGEgcGFja2V0IGhhcyBiZWVuCisgKiBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQgYW5kIGNhbGxlZCB0aGlzIHBhcnQuLi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQ2FsY3VsYXRlIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBmcmFtZSBwb2ludGVkIHRvIGJ5IHRoZSByZWNlaXZlCisgKiBmcmFtZSBwb2ludGVyIGFuZCB2ZXJpZnkgdGhhdCB0aGUgZnJhbWUgc2VlbSBjb3JyZWN0CisgKiAoY2FsbGVkIGJ5IHd2X3BhY2tldF9yY3YoKSkKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3d2X3N0YXJ0X29mX2ZyYW1lKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2LAorCQkgIGludAkJcmZwLAkvKiBlbmQgb2YgZnJhbWUgKi8KKwkJICBpbnQJCXdyYXApCS8qIHN0YXJ0IG9mIGJ1ZmZlciAqLworeworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgaW50CQlycDsKKyAgaW50CQlsZW47CisKKyAgcnAgPSAocmZwIC0gNSArIFJYX1NJWkUpICUgUlhfU0laRTsKKyAgb3V0YihycCAmIDB4ZmYsIFBJT1JMKGJhc2UpKTsKKyAgb3V0YigoKHJwID4+IDgpICYgUElPUkhfTUFTSyksIFBJT1JIKGJhc2UpKTsKKyAgbGVuID0gaW5iKFBJT1AoYmFzZSkpOworICBsZW4gfD0gaW5iKFBJT1AoYmFzZSkpIDw8IDg7CisKKyAgLyogU2FuaXR5IGNoZWNrcyBvbiBzaXplICovCisgIC8qIEZyYW1lIHRvbyBiaWcgKi8KKyAgaWYobGVuID4gTUFYREFUQVogKyAxMDApCisgICAgeworI2lmZGVmIERFQlVHX1JYX0VSUk9SCisgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogd3Zfc3RhcnRfb2ZfZnJhbWU6IFJlY2VpdmVkIGZyYW1lIHRvbyBsYXJnZSwgcmZwICVkIGxlbiAweCV4XG4iLAorCSAgICAgZGV2LT5uYW1lLCByZnAsIGxlbik7CisjZW5kaWYKKyAgICAgIHJldHVybigtMSk7CisgICAgfQorICAKKyAgLyogRnJhbWUgdG9vIHNob3J0ICovCisgIGlmKGxlbiA8IDcpCisgICAgeworI2lmZGVmIERFQlVHX1JYX0VSUk9SCisgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogd3Zfc3RhcnRfb2ZfZnJhbWU6IFJlY2VpdmVkIG51bGwgZnJhbWUsIHJmcCAlZCBsZW4gMHgleFxuIiwKKwkgICAgIGRldi0+bmFtZSwgcmZwLCBsZW4pOworI2VuZGlmCisgICAgICByZXR1cm4oLTEpOworICAgIH0KKyAgCisgIC8qIFdyYXAgYXJvdW5kIGJ1ZmZlciAqLworICBpZihsZW4gPiAoKHdyYXAgLSAocmZwIC0gbGVuKSArIFJYX1NJWkUpICUgUlhfU0laRSkpCS8qIG1hZ2ljIGZvcm11bGEgISAqLworICAgIHsKKyNpZmRlZiBERUJVR19SWF9FUlJPUgorICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHd2X3N0YXJ0X29mX2ZyYW1lOiB3cmFwIGFyb3VuZCBidWZmZXIsIHdyYXAgJWQgcmZwICVkIGxlbiAweCV4XG4iLAorCSAgICAgZGV2LT5uYW1lLCB3cmFwLCByZnAsIGxlbik7CisjZW5kaWYKKyAgICAgIHJldHVybigtMSk7CisgICAgfQorCisgIHJldHVybigocnAgLSBsZW4gKyBSWF9TSVpFKSAlIFJYX1NJWkUpOworfSAvKiB3dl9zdGFydF9vZl9mcmFtZSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIGRvZXMgdGhlIGFjdHVhbCBjb3B5IG9mIGRhdGEgKGluY2x1ZGluZyB0aGUgZXRoZXJuZXQKKyAqIGhlYWRlciBzdHJ1Y3R1cmUpIGZyb20gdGhlIFdhdmVMQU4gY2FyZCB0byBhbiBza19idWZmIGNoYWluIHRoYXQKKyAqIHdpbGwgYmUgcGFzc2VkIHVwIHRvIHRoZSBuZXR3b3JrIGludGVyZmFjZSBsYXllci4gTk9URTogV2UKKyAqIGN1cnJlbnRseSBkb24ndCBoYW5kbGUgdHJhaWxlciBwcm90b2NvbHMgKG5laXRoZXIgZG9lcyB0aGUgcmVzdCBvZgorICogdGhlIG5ldHdvcmsgaW50ZXJmYWNlKSwgc28gaWYgdGhhdCBpcyBuZWVkZWQsIGl0IHdpbGwgKGF0IGxlYXN0IGluCisgKiBwYXJ0KSBiZSBhZGRlZCBoZXJlLiAgVGhlIGNvbnRlbnRzIG9mIHRoZSByZWNlaXZlIHJpbmcgYnVmZmVyIGFyZQorICogY29waWVkIHRvIGEgbWVzc2FnZSBjaGFpbiB0aGF0IGlzIHRoZW4gcGFzc2VkIHRvIHRoZSBrZXJuZWwuCisgKgorICogTm90ZTogaWYgYW55IGVycm9ycyBvY2N1ciwgdGhlIHBhY2tldCBpcyAiZHJvcHBlZCBvbiB0aGUgZmxvb3IiCisgKiAoY2FsbGVkIGJ5IHd2X3BhY2tldF9yY3YoKSkKKyAqLworc3RhdGljIGlubGluZSB2b2lkCit3dl9wYWNrZXRfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqCQlkZXYsCisJICAgICAgIGludAkJZmRfcCwKKwkgICAgICAgaW50CQlza3NpemUpCit7CisgIG5ldF9sb2NhbCAqCQlscCA9IG5ldGRldl9wcml2KGRldik7CisgIHN0cnVjdCBza19idWZmICoJc2tiOworCisjaWZkZWYgREVCVUdfUlhfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X3BhY2tldF9yZWFkKDB4JVgsICVkKVxuIiwKKwkgZGV2LT5uYW1lLCBmZF9wLCBza3NpemUpOworI2VuZGlmCisKKyAgLyogQWxsb2NhdGUgc29tZSBidWZmZXIgZm9yIHRoZSBuZXcgcGFja2V0ICovCisgIGlmKChza2IgPSBkZXZfYWxsb2Nfc2tiKHNrc2l6ZSsyKSkgPT0gKHN0cnVjdCBza19idWZmICopIE5VTEwpCisgICAgeworI2lmZGVmIERFQlVHX1JYX0VSUk9SCisgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogd3ZfcGFja2V0X3JlYWQoKTogY291bGQgbm90IGFsbG9jX3NrYiglZCwgR0ZQX0FUT01JQylcbiIsCisJICAgICBkZXYtPm5hbWUsIHNrc2l6ZSk7CisjZW5kaWYKKyAgICAgIGxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisgICAgICAvKgorICAgICAgICogTm90IG9ubHkgZG8gd2Ugd2FudCB0byByZXR1cm4gaGVyZSwgYnV0IHdlIGFsc28gbmVlZCB0byBkcm9wIHRoZQorICAgICAgICogcGFja2V0IG9uIHRoZSBmbG9vciB0byBjbGVhciB0aGUgaW50ZXJydXB0LgorICAgICAgICovCisgICAgICByZXR1cm47CisgICAgfQorCisgIHNrYi0+ZGV2ID0gZGV2OworCisgIHNrYl9yZXNlcnZlKHNrYiwgMik7CisgIGZkX3AgPSByZWFkX3JpbmdidWYoZGV2LCBmZF9wLCAoY2hhciAqKSBza2JfcHV0KHNrYiwgc2tzaXplKSwgc2tzaXplKTsKKyAgc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworI2lmZGVmIERFQlVHX1JYX0lORk8KKyAgd3ZfcGFja2V0X2luZm8oc2tiLT5tYWMucmF3LCBza3NpemUsIGRldi0+bmFtZSwgInd2X3BhY2tldF9yZWFkIik7CisjZW5kaWYJLyogREVCVUdfUlhfSU5GTyAqLworICAgICAKKyAgLyogU3RhdGlzdGljcyBnYXRoZXJpbmcgJiBzdHVmZiBhc3NvY2lhdGVkLgorICAgKiBJdCBzZWVtIGEgYml0IG1lc3N5IHdpdGggYWxsIHRoZSBkZWZpbmUsIGJ1dCBpdCdzIHJlYWxseSBzaW1wbGUuLi4gKi8KKyAgaWYoCisjaWZkZWYgSVdfV0lSRUxFU1NfU1BZCisgICAgIChscC0+c3B5X2RhdGEuc3B5X251bWJlciA+IDApIHx8CisjZW5kaWYJLyogSVdfV0lSRUxFU1NfU1BZICovCisjaWZkZWYgSElTVE9HUkFNCisgICAgIChscC0+aGlzX251bWJlciA+IDApIHx8CisjZW5kaWYJLyogSElTVE9HUkFNICovCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisgICAgIChkb19yb2FtaW5nKSB8fAorI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworICAgICAwKQorICAgIHsKKyAgICAgIHVfY2hhcglzdGF0c1szXTsJLyogU2lnbmFsIGxldmVsLCBOb2lzZSBsZXZlbCwgU2lnbmFsIHF1YWxpdHkgKi8KKworICAgICAgLyogcmVhZCBzaWduYWwgbGV2ZWwsIHNpbGVuY2UgbGV2ZWwgYW5kIHNpZ25hbCBxdWFsaXR5IGJ5dGVzICovCisgICAgICBmZF9wID0gcmVhZF9yaW5nYnVmKGRldiwgKGZkX3AgKyA0KSAlIFJYX1NJWkUgKyBSWF9CQVNFLAorCQkJICBzdGF0cywgMyk7CisjaWZkZWYgREVCVUdfUlhfSU5GTworICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3dl9wYWNrZXRfcmVhZCgpOiBTaWduYWwgbGV2ZWwgJWQvNjMsIFNpbGVuY2UgbGV2ZWwgJWQvNjMsIHNpZ25hbCBxdWFsaXR5ICVkLzE2XG4iLAorCSAgICAgZGV2LT5uYW1lLCBzdGF0c1swXSAmIDB4M0YsIHN0YXRzWzFdICYgMHgzRiwgc3RhdHNbMl0gJiAweDBGKTsKKyNlbmRpZgorCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisgICAgICBpZihkb19yb2FtaW5nKQorCWlmKFdBVkVMQU5fQkVBQ09OKHNrYi0+ZGF0YSkpCisJICB3bF9yb2FtX2dhdGhlcihkZXYsIHNrYi0+ZGF0YSwgc3RhdHMpOworI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworCSAgCisjaWZkZWYgV0lSRUxFU1NfU1BZCisgICAgICB3bF9zcHlfZ2F0aGVyKGRldiwgc2tiLT5tYWMucmF3ICsgV0FWRUxBTl9BRERSX1NJWkUsIHN0YXRzKTsKKyNlbmRpZgkvKiBXSVJFTEVTU19TUFkgKi8KKyNpZmRlZiBISVNUT0dSQU0KKyAgICAgIHdsX2hpc19nYXRoZXIoZGV2LCBzdGF0cyk7CisjZW5kaWYJLyogSElTVE9HUkFNICovCisgICAgfQorCisgIC8qCisgICAqIEhhbmQgdGhlIHBhY2tldCB0byB0aGUgTmV0d29yayBNb2R1bGUKKyAgICovCisgIG5ldGlmX3J4KHNrYik7CisKKyAgLyogS2VlcCBzdGF0cyB1cCB0byBkYXRlICovCisgIGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisgIGxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisgIGxwLT5zdGF0cy5yeF9ieXRlcyArPSBza3NpemU7CisKKyNpZmRlZiBERUJVR19SWF9UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfcGFja2V0X3JlYWQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB0byBpbml0aWF0ZSBhCisgKiBwYWNrZXQgdHJhbnNmZXIgZnJvbSB0aGUgY2FyZCB0byB0aGUgbmV0d29yayBpbnRlcmZhY2UgbGF5ZXIgYWJvdmUKKyAqIHRoaXMgZHJpdmVyLiAgVGhpcyByb3V0aW5lIGNoZWNrcyBpZiBhIGJ1ZmZlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkKKyAqIHJlY2VpdmVkIGJ5IHRoZSBXYXZlTEFOIGNhcmQuICBJZiBzbywgdGhlIHJvdXRpbmUgd3ZfcGFja2V0X3JlYWQgaXMKKyAqIGNhbGxlZCB0byBkbyB0aGUgYWN0dWFsIHRyYW5zZmVyIG9mIHRoZSBjYXJkJ3MgZGF0YSBpbmNsdWRpbmcgdGhlCisgKiBldGhlcm5ldCBoZWFkZXIgaW50byBhIHBhY2tldCBjb25zaXN0aW5nIG9mIGFuIHNrX2J1ZmYgY2hhaW4uCisgKiAoY2FsbGVkIGJ5IHdhdmVsYW5faW50ZXJydXB0KCkpCisgKiBOb3RlIDogdGhlIHNwaW5sb2NrIGlzIGFscmVhZHkgZ3JhYmJlZCBmb3IgdXMgYW5kIGlycSBhcmUgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAord3ZfcGFja2V0X3JjdihzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAga2lvX2FkZHJfdAliYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgIG5ldF9sb2NhbCAqCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgaW50CQluZXdyZnA7CisgIGludAkJcnA7CisgIGludAkJbGVuOworICBpbnQJCWZfc3RhcnQ7CisgIGludAkJc3RhdHVzOworICBpbnQJCWk1OTNfcmZwOworICBpbnQJCXN0YXRfcHRyOworICB1X2NoYXIJY1s0XTsKKworI2lmZGVmIERFQlVHX1JYX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9wYWNrZXRfcmN2KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICAvKiBHZXQgdGhlIG5ldyByZWNlaXZlIGZyYW1lIHBvaW50ZXIgZnJvbSB0aGUgaTgyNTkzIGNoaXAgKi8KKyAgb3V0YihDUjBfU1RBVFVTXzIgfCBPUDBfTk9QLCBMQ0NSKGJhc2UpKTsKKyAgaTU5M19yZnAgPSBpbmIoTENTUihiYXNlKSk7CisgIGk1OTNfcmZwIHw9IGluYihMQ1NSKGJhc2UpKSA8PCA4OworICBpNTkzX3JmcCAlPSBSWF9TSVpFOworCisgIC8qIEdldCB0aGUgbmV3IHJlY2VpdmUgZnJhbWUgcG9pbnRlciBmcm9tIHRoZSBXYXZlTEFOIGNhcmQuCisgICAqIEl0IGlzIDMgYnl0ZXMgbW9yZSB0aGFuIHRoZSBpbmNyZW1lbnQgb2YgdGhlIGk4MjU5MyByZWNlaXZlCisgICAqIGZyYW1lIHBvaW50ZXIsIGZvciBlYWNoIHBhY2tldC4gVGhpcyBpcyBiZWNhdXNlIGl0IGluY2x1ZGVzIHRoZQorICAgKiAzIHJvYW1pbmcgYnl0ZXMgYWRkZWQgYnkgdGhlIG1tYy4KKyAgICovCisgIG5ld3JmcCA9IGluYihSUExMKGJhc2UpKTsKKyAgbmV3cmZwIHw9IGluYihSUExIKGJhc2UpKSA8PCA4OworICBuZXdyZnAgJT0gUlhfU0laRTsKKworI2lmZGVmIERFQlVHX1JYX0lORk8KKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3dl9wYWNrZXRfcmN2KCk6IGk1OTNfcmZwICVkIHN0b3AgJWQgbmV3cmZwICVkIGxwLT5yZnAgJWRcbiIsCisJIGRldi0+bmFtZSwgaTU5M19yZnAsIGxwLT5zdG9wLCBuZXdyZnAsIGxwLT5yZnApOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19SWF9FUlJPUgorICAvKiBJZiBubyBuZXcgZnJhbWUgcG9pbnRlci4uLiAqLworICBpZihscC0+b3ZlcnJ1bm5pbmcgfHwgbmV3cmZwID09IGxwLT5yZnApCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHd2X3BhY2tldF9yY3YoKTogbm8gbmV3IGZyYW1lOiBpNTkzX3JmcCAlZCBzdG9wICVkIG5ld3JmcCAlZCBscC0+cmZwICVkXG4iLAorCSAgIGRldi0+bmFtZSwgaTU5M19yZnAsIGxwLT5zdG9wLCBuZXdyZnAsIGxwLT5yZnApOworI2VuZGlmCisKKyAgLyogUmVhZCBhbGwgZnJhbWVzIChwYWNrZXRzKSByZWNlaXZlZCAqLworICB3aGlsZShuZXdyZnAgIT0gbHAtPnJmcCkKKyAgICB7CisgICAgICAvKiBBIGZyYW1lIGlzIGNvbXBvc2VkIG9mIHRoZSBwYWNrZXQsIGZvbGxvd2VkIGJ5IGEgc3RhdHVzIHdvcmQsCisgICAgICAgKiB0aGUgbGVuZ3RoIG9mIHRoZSBmcmFtZSAod29yZCkgYW5kIHRoZSBtbWMgaW5mbyAoU05SICYgcXVhbCkuCisgICAgICAgKiBJdCdzIGJlY2F1c2UgdGhlIGxlbmd0aCBpcyBhdCB0aGUgZW5kIHRoYXQgd2UgY2FuIG9ubHkgc2NhbgorICAgICAgICogZnJhbWVzIGJhY2t3YXJkLiAqLworCisgICAgICAvKiBGaW5kIHRoZSBmaXJzdCBmcmFtZSBieSBza2lwcGluZyBiYWNrd2FyZHMgb3ZlciB0aGUgZnJhbWVzICovCisgICAgICBycCA9IG5ld3JmcDsJLyogRW5kIG9mIGxhc3QgZnJhbWUgKi8KKyAgICAgIHdoaWxlKCgoZl9zdGFydCA9IHd2X3N0YXJ0X29mX2ZyYW1lKGRldiwgcnAsIG5ld3JmcCkpICE9IGxwLT5yZnApICYmCisJICAgIChmX3N0YXJ0ICE9IC0xKSkKKwkgIHJwID0gZl9zdGFydDsKKworICAgICAgLyogSWYgd2UgaGFkIGEgcHJvYmxlbSAqLworICAgICAgaWYoZl9zdGFydCA9PSAtMSkKKwl7CisjaWZkZWYgREVCVUdfUlhfRVJST1IKKwkgIHByaW50ayhLRVJOX0lORk8gIndhdmVsYW5fY3M6IGNhbm5vdCBmaW5kIHN0YXJ0IG9mIGZyYW1lICIpOworCSAgcHJpbnRrKCIgaTU5M19yZnAgJWQgc3RvcCAlZCBuZXdyZnAgJWQgbHAtPnJmcCAlZFxuIiwKKwkJIGk1OTNfcmZwLCBscC0+c3RvcCwgbmV3cmZwLCBscC0+cmZwKTsKKyNlbmRpZgorCSAgbHAtPnJmcCA9IHJwOwkJLyogR2V0IHRvIHRoZSBsYXN0IHVzYWJsZSBmcmFtZSAqLworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiBmX3N0YXJ0IHBvaW50IHRvIHRoZSBiZWdnaW5pbmcgb2YgdGhlIGZpcnN0IGZyYW1lIHJlY2VpdmVkCisgICAgICAgKiBhbmQgcnAgdG8gdGhlIGJlZ2dpbmluZyBvZiB0aGUgbmV4dCBvbmUgKi8KKworICAgICAgLyogUmVhZCBzdGF0dXMgJiBsZW5ndGggb2YgdGhlIGZyYW1lICovCisgICAgICBzdGF0X3B0ciA9IChycCAtIDcgKyBSWF9TSVpFKSAlIFJYX1NJWkU7CisgICAgICBzdGF0X3B0ciA9IHJlYWRfcmluZ2J1ZihkZXYsIHN0YXRfcHRyLCBjLCA0KTsKKyAgICAgIHN0YXR1cyA9IGNbMF0gfCAoY1sxXSA8PCA4KTsKKyAgICAgIGxlbiA9IGNbMl0gfCAoY1szXSA8PCA4KTsKKworICAgICAgLyogQ2hlY2sgc3RhdHVzICovCisgICAgICBpZigoc3RhdHVzICYgUlhfUkNWX09LKSAhPSBSWF9SQ1ZfT0spCisJeworCSAgbHAtPnN0YXRzLnJ4X2Vycm9ycysrOworCSAgaWYoc3RhdHVzICYgUlhfTk9fU0ZEKQorCSAgICBscC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJICBpZihzdGF0dXMgJiBSWF9DUkNfRVJSKQorCSAgICBscC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCSAgaWYoc3RhdHVzICYgUlhfT1ZSUlVOKQorCSAgICBscC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKKworI2lmZGVmIERFQlVHX1JYX0ZBSUwKKwkgIHByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfcGFja2V0X3JjdigpOiBwYWNrZXQgbm90IHJlY2VpdmVkIG9rLCBzdGF0dXMgPSAweCV4XG4iLAorCQkgZGV2LT5uYW1lLCBzdGF0dXMpOworI2VuZGlmCisJfQorICAgICAgZWxzZQorCS8qIFJlYWQgdGhlIHBhY2tldCBhbmQgdHJhbnNtaXQgdG8gTGludXggKi8KKwl3dl9wYWNrZXRfcmVhZChkZXYsIGZfc3RhcnQsIGxlbiAtIDIpOworCisgICAgICAvKiBPbmUgZnJhbWUgaGFzIGJlZW4gcHJvY2Vzc2VkLCBza2lwIGl0ICovCisgICAgICBscC0+cmZwID0gcnA7CisgICAgfQorCisgIC8qCisgICAqIFVwZGF0ZSB0aGUgZnJhbWUgc3RvcCByZWdpc3RlciwgYnV0IHNldCBpdCB0byBsZXNzIHRoYW4KKyAgICogdGhlIGZ1bGwgOEsgdG8gYWxsb3cgc3BhY2UgZm9yIDMgYnl0ZXMgb2Ygc2lnbmFsIHN0cmVuZ3RoCisgICAqIHBlciBwYWNrZXQuCisgICAqLworICBscC0+c3RvcCA9IChpNTkzX3JmcCArIFJYX1NJWkUgLSAoKFJYX1NJWkUgLyA2NCkgKiAzKSkgJSBSWF9TSVpFOworICBvdXRiKE9QMF9TV0lUX1RPX1BPUlRfMSB8IENSMF9DSE5MLCBMQ0NSKGJhc2UpKTsKKyAgb3V0YihDUjFfU1RPUF9SRUdfVVBEQVRFIHwgKGxwLT5zdG9wID4+IFJYX1NJWkVfU0hJRlQpLCBMQ0NSKGJhc2UpKTsKKyAgb3V0YihPUDFfU1dJVF9UT19QT1JUXzAsIExDQ1IoYmFzZSkpOworCisjaWZkZWYgREVCVUdfUlhfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X3BhY2tldF9yY3YoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKiogUEFDS0VUIFRSQU5TTUlTU0lPTiAqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIHBhcnQgZGVhbCB3aXRoIHNlbmRpbmcgcGFja2V0IHRocm91Z2ggdGhlIHdhdmVsYW4KKyAqIFdlIGNvcHkgdGhlIHBhY2tldCB0byB0aGUgc2VuZCBidWZmZXIgYW5kIHRoZW4gaXNzdWUgdGhlIHNlbmQKKyAqIGNvbW1hbmQgdG8gdGhlIGk4MjU5My4gVGhlIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbiB3aWxsIGJlCisgKiBjaGVja2VkIGluIHdhdmVsYW5faW50ZXJydXB0KCkKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIGZpbGxzIGluIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlcnMgYW5kIG1lbW9yeQorICogbG9jYXRpb25zIG9uIHRoZSBXYXZlTEFOIGNhcmQgYW5kIHN0YXJ0cyB0aGUgY2FyZCBvZmYgb24KKyAqIHRoZSB0cmFuc21pdC4KKyAqIChjYWxsZWQgaW4gd2F2ZWxhbl9wYWNrZXRfeG1pdCgpKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3d2X3BhY2tldF93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiwKKwkJdm9pZCAqCQlidWYsCisJCXNob3J0CQlsZW5ndGgpCit7CisgIG5ldF9sb2NhbCAqCQlscCA9IG5ldGRldl9wcml2KGRldik7CisgIGtpb19hZGRyX3QJCWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisgIGludAkJCWNsZW4gPSBsZW5ndGg7CisgIHJlZ2lzdGVyIHVfc2hvcnQJeG10ZGF0YV9iYXNlID0gVFhfQkFTRTsKKworI2lmZGVmIERFQlVHX1RYX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9wYWNrZXRfd3JpdGUoJWQpXG4iLCBkZXYtPm5hbWUsIGxlbmd0aCk7CisjZW5kaWYKKworICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgLyogV3JpdGUgdGhlIGxlbmd0aCBvZiBkYXRhIGJ1ZmZlciBmb2xsb3dlZCBieSB0aGUgYnVmZmVyICovCisgIG91dGIoeG10ZGF0YV9iYXNlICYgMHhmZiwgUElPUkwoYmFzZSkpOworICBvdXRiKCgoeG10ZGF0YV9iYXNlID4+IDgpICYgUElPUkhfTUFTSykgfCBQSU9SSF9TRUxfVFgsIFBJT1JIKGJhc2UpKTsKKyAgb3V0YihjbGVuICYgMHhmZiwgUElPUChiYXNlKSk7CS8qIGxzYiAqLworICBvdXRiKGNsZW4gPj4gOCwgUElPUChiYXNlKSk7ICAJLyogbXNiICovCisKKyAgLyogU2VuZCB0aGUgZGF0YSAqLworICBvdXRzYihQSU9QKGJhc2UpLCBidWYsIGNsZW4pOworCisgIC8qIEluZGljYXRlIGVuZCBvZiB0cmFuc21pdCBjaGFpbiAqLworICBvdXRiKE9QMF9OT1AsIFBJT1AoYmFzZSkpOworICAvKiBqb3N1bGx2bkBjcy5jbXUuZWR1OiBuZWVkIHRvIHNlbmQgYSBzZWNvbmQgTk9QIGZvciBhbGlnbm1lbnQuLi4gKi8KKyAgb3V0YihPUDBfTk9QLCBQSU9QKGJhc2UpKTsKKworICAvKiBSZXNldCB0aGUgdHJhbnNtaXQgRE1BIHBvaW50ZXIgKi8KKyAgaGFjcl93cml0ZV9zbG93KGJhc2UsIEhBQ1JfUFdSX1NUQVQgfCBIQUNSX1RYX0RNQV9SRVNFVCk7CisgIGhhY3Jfd3JpdGUoYmFzZSwgSEFDUl9ERUZBVUxUKTsKKyAgLyogU2VuZCB0aGUgdHJhbnNtaXQgY29tbWFuZCAqLworICB3dl84MjU5M19jbWQoZGV2LCAid3ZfcGFja2V0X3dyaXRlKCk6IHRyYW5zbWl0IiwKKwkgICAgICAgT1AwX1RSQU5TTUlULCBTUjBfTk9fUkVTVUxUKTsKKworICAvKiBNYWtlIHN1cmUgdGhlIHdhdGNoZG9nIHdpbGwga2VlcCBxdWlldCBmb3IgYSB3aGlsZSAqLworICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworICAvKiBLZWVwIHN0YXRzIHVwIHRvIGRhdGUgKi8KKyAgbHAtPnN0YXRzLnR4X2J5dGVzICs9IGxlbmd0aDsKKworICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworI2lmZGVmIERFQlVHX1RYX0lORk8KKyAgd3ZfcGFja2V0X2luZm8oKHVfY2hhciAqKSBidWYsIGxlbmd0aCwgZGV2LT5uYW1lLCAid3ZfcGFja2V0X3dyaXRlIik7CisjZW5kaWYJLyogREVCVUdfVFhfSU5GTyAqLworCisjaWZkZWYgREVCVUdfVFhfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X3BhY2tldF93cml0ZSgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gd2Ugd2FudCB0byBzZW5kIGEgcGFja2V0IChORVQzIGNhbGxiYWNrKQorICogSW4gdGhpcyByb3V0aW5lLCB3ZSBjaGVjayBpZiB0aGUgaGFyd2FyZSBpcyByZWFkeSB0byBhY2NlcHQKKyAqIHRoZSBwYWNrZXQuIFdlIGFsc28gcHJldmVudCByZWVudHJhbmNlLiBUaGVuLCB3ZSBjYWxsIHRoZSBmdW5jdGlvbgorICogdG8gc2VuZCB0aGUgcGFja2V0Li4uCisgKi8KK3N0YXRpYyBpbnQKK3dhdmVsYW5fcGFja2V0X3htaXQoc3RydWN0IHNrX2J1ZmYgKglza2IsCisJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqCQlkZXYpCit7CisgIG5ldF9sb2NhbCAqCQlscCA9IG5ldGRldl9wcml2KGRldik7CisgIHVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisjaWZkZWYgREVCVUdfVFhfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5fcGFja2V0X3htaXQoMHglWClcbiIsIGRldi0+bmFtZSwKKwkgKHVuc2lnbmVkKSBza2IpOworI2VuZGlmCisKKyAgLyoKKyAgICogQmxvY2sgYSB0aW1lci1iYXNlZCB0cmFuc21pdCBmcm9tIG92ZXJsYXBwaW5nIGEgcHJldmlvdXMgdHJhbnNtaXQuCisgICAqIEluIG90aGVyIHdvcmRzLCBwcmV2ZW50IHJlZW50ZXJpbmcgdGhpcyByb3V0aW5lLgorICAgKi8KKyAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgIC8qIElmIHNvbWVib2R5IGhhcyBhc2tlZCB0byByZWNvbmZpZ3VyZSB0aGUgY29udHJvbGxlciwKKyAgICogd2UgY2FuIGRvIGl0IG5vdyAqLworICBpZihscC0+cmVjb25maWdfODI1OTMpCisgICAgeworICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKyAgICAgIHd2XzgyNTkzX2NvbmZpZyhkZXYpOworICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CS8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzICovCisgICAgICAvKiBOb3RlIDogdGhlIGNvbmZpZ3VyZSBwcm9jZWR1cmUgd2FzIHRvdGFsbHkgc3luY2hyb25vdXMsCisgICAgICAgKiBzbyB0aGUgVHggYnVmZmVyIGlzIG5vdyBmcmVlICovCisgICAgfQorCisjaWZkZWYgREVCVUdfVFhfRVJST1IKKwlpZiAoc2tiLT5uZXh0KQorCQlwcmludGsoS0VSTl9JTkZPICJza2IgaGFzIG5leHRcbiIpOworI2VuZGlmCisKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHNvbWUgcGFkZGluZyAqLworCS8qIE5vdGUgOiBvbiB3aXJlbGVzcyB0aGUgcHJvcGFnYXRpb24gdGltZSBpcyBpbiB0aGUgb3JkZXIgb2YgMXVzLAorCSAqIGFuZCB3ZSBkb24ndCBoYXZlIHRoZSBFdGhlcm5ldCBzcGVjaWZpYyByZXF1aXJlbWVudCBvZiBiZWVpbmcKKwkgKiBhYmxlIHRvIGRldGVjdCBjb2xsaXNpb25zLCB0aGVyZWZvcmUgaW4gdGhlb3J5IHdlIGRvbid0IHJlYWxseQorCSAqIG5lZWQgdG8gcGFkLiBKZWFuIElJICovCisJaWYgKHNrYi0+bGVuIDwgRVRIX1pMRU4pIHsKKwkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwl9CisKKyAgd3ZfcGFja2V0X3dyaXRlKGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKyAgZGV2X2tmcmVlX3NrYihza2IpOworCisjaWZkZWYgREVCVUdfVFhfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fcGFja2V0X3htaXQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqIEhBUkRXQVJFIENPTkZJR1VSQVRJT04gKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIHBhcnQgZG8gdGhlIHJlYWwgam9iIG9mIHN0YXJ0aW5nIGFuZCBjb25maWd1cmluZyB0aGUgaGFyZHdhcmUuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFJvdXRpbmUgdG8gaW5pdGlhbGl6ZSB0aGUgTW9kZW0gTWFuYWdlbWVudCBDb250cm9sbGVyLgorICogKGNhbGxlZCBieSB3dl9od19jb25maWcoKSkKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3d2X21tY19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgcHNhX3QJCXBzYTsKKyAgbW13X3QJCW07CisgIGludAkJY29uZmlndXJlZDsKKyAgaW50CQlpOwkJLyogTG9vcCBjb3VudGVyICovCisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X21tY19pbml0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICAvKiBSZWFkIHRoZSBwYXJhbWV0ZXIgc3RvcmFnZSBhcmVhICovCisgIHBzYV9yZWFkKGRldiwgMCwgKHVuc2lnbmVkIGNoYXIgKikgJnBzYSwgc2l6ZW9mKHBzYSkpOworCisgIC8qCisgICAqIENoZWNrIHRoZSBmaXJzdCB0aHJlZSBvY3RldHMgb2YgdGhlIE1BQyBhZGRyIGZvciB0aGUgbWFudWZhY3R1cmVyJ3MgY29kZS4KKyAgICogTm90ZTogSWYgeW91IGdldCB0aGUgZXJyb3IgbWVzc2FnZSBiZWxvdywgeW91J3ZlIGdvdCBhCisgICAqIG5vbi1OQ1IvQVQmVC9MdWNlbnQgUENNQ0lBIGNhcmRzLCBzZWUgd2F2ZWxhbl9jcy5oIGZvciBkZXRhaWwgb24KKyAgICogaG93IHRvIGNvbmZpZ3VyZSB5b3VyIGNhcmQuLi4KKyAgICovCisgIGZvcihpID0gMDsgaSA8IChzaXplb2YoTUFDX0FERFJFU1NFUykgLyBzaXplb2YoY2hhcikgLyAzKTsgaSsrKQorICAgIGlmKChwc2EucHNhX3VuaXZfbWFjX2FkZHJbMF0gPT0gTUFDX0FERFJFU1NFU1tpXVswXSkgJiYKKyAgICAgICAocHNhLnBzYV91bml2X21hY19hZGRyWzFdID09IE1BQ19BRERSRVNTRVNbaV1bMV0pICYmCisgICAgICAgKHBzYS5wc2FfdW5pdl9tYWNfYWRkclsyXSA9PSBNQUNfQUREUkVTU0VTW2ldWzJdKSkKKyAgICAgIGJyZWFrOworCisgIC8qIElmIHdlIGhhdmUgbm90IGZvdW5kIGl0Li4uICovCisgIGlmKGkgPT0gKHNpemVvZihNQUNfQUREUkVTU0VTKSAvIHNpemVvZihjaGFyKSAvIDMpKQorICAgIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1JTCisgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogd3ZfbW1jX2luaXQoKTogSW52YWxpZCBNQUMgYWRkcmVzczogJTAyWDolMDJYOiUwMlg6Li4uXG4iLAorCSAgICAgZGV2LT5uYW1lLCBwc2EucHNhX3VuaXZfbWFjX2FkZHJbMF0sCisJICAgICBwc2EucHNhX3VuaXZfbWFjX2FkZHJbMV0sIHBzYS5wc2FfdW5pdl9tYWNfYWRkclsyXSk7CisjZW5kaWYKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgLyogR2V0IHRoZSBNQUMgYWRkcmVzcyAqLworICBtZW1jcHkoJmRldi0+ZGV2X2FkZHJbMF0sICZwc2EucHNhX3VuaXZfbWFjX2FkZHJbMF0sIFdBVkVMQU5fQUREUl9TSVpFKTsKKworI2lmZGVmIFVTRV9QU0FfQ09ORklHCisgIGNvbmZpZ3VyZWQgPSBwc2EucHNhX2NvbmZfc3RhdHVzICYgMTsKKyNlbHNlCisgIGNvbmZpZ3VyZWQgPSAwOworI2VuZGlmCisKKyAgLyogSXMgdGhlIFBTQSBpcyBub3QgY29uZmlndXJlZCAqLworICBpZighY29uZmlndXJlZCkKKyAgICB7CisgICAgICAvKiBVc2VyIHdpbGwgYmUgYWJsZSB0byBjb25maWd1cmUgTldJRCBhZnRlciAod2l0aCBpd2NvbmZpZykgKi8KKyAgICAgIHBzYS5wc2FfbndpZFswXSA9IDA7CisgICAgICBwc2EucHNhX253aWRbMV0gPSAwOworCisgICAgICAvKiBBcyBOV0lEIGlzIG5vdCBzZXQgOiBubyBOV0lEIGNoZWNraW5nICovCisgICAgICBwc2EucHNhX253aWRfc2VsZWN0ID0gMDsKKworICAgICAgLyogRGlzYWJsZSBlbmNyeXB0aW9uICovCisgICAgICBwc2EucHNhX2VuY3J5cHRpb25fc2VsZWN0ID0gMDsKKworICAgICAgLyogU2V0IHRvIHN0YW5kYXJkIHZhbHVlcworICAgICAgICogMHgwNCBmb3IgQVQsCisgICAgICAgKiAweDAxIGZvciBNQ0EsCisgICAgICAgKiAweDA0IGZvciBQQ01DSUEgYW5kIDIuMDAgY2FyZCAoQVQmVCA0MDctMDI0Njg5L0UgZG9jdW1lbnQpCisgICAgICAgKi8KKyAgICAgIGlmIChwc2EucHNhX2NvbXBfbnVtYmVyICYgMSkKKwlwc2EucHNhX3Rocl9wcmVfc2V0ID0gMHgwMTsKKyAgICAgIGVsc2UKKwlwc2EucHNhX3Rocl9wcmVfc2V0ID0gMHgwNDsKKyAgICAgIHBzYS5wc2FfcXVhbGl0eV90aHIgPSAweDAzOworCisgICAgICAvKiBJdCBpcyBjb25maWd1cmVkICovCisgICAgICBwc2EucHNhX2NvbmZfc3RhdHVzIHw9IDE7CisKKyNpZmRlZiBVU0VfUFNBX0NPTkZJRworICAgICAgLyogV3JpdGUgdGhlIHBzYSAqLworICAgICAgcHNhX3dyaXRlKGRldiwgKGNoYXIgKilwc2EucHNhX253aWQgLSAoY2hhciAqKSZwc2EsCisJCSh1bnNpZ25lZCBjaGFyICopcHNhLnBzYV9ud2lkLCA0KTsKKyAgICAgIHBzYV93cml0ZShkZXYsIChjaGFyICopJnBzYS5wc2FfdGhyX3ByZV9zZXQgLSAoY2hhciAqKSZwc2EsCisJCSh1bnNpZ25lZCBjaGFyICopJnBzYS5wc2FfdGhyX3ByZV9zZXQsIDEpOworICAgICAgcHNhX3dyaXRlKGRldiwgKGNoYXIgKikmcHNhLnBzYV9xdWFsaXR5X3RociAtIChjaGFyICopJnBzYSwKKwkJKHVuc2lnbmVkIGNoYXIgKikmcHNhLnBzYV9xdWFsaXR5X3RociwgMSk7CisgICAgICBwc2Ffd3JpdGUoZGV2LCAoY2hhciAqKSZwc2EucHNhX2NvbmZfc3RhdHVzIC0gKGNoYXIgKikmcHNhLAorCQkodW5zaWduZWQgY2hhciAqKSZwc2EucHNhX2NvbmZfc3RhdHVzLCAxKTsKKyAgICAgIC8qIHVwZGF0ZSB0aGUgV2F2ZWxhbiBjaGVja3N1bSAqLworICAgICAgdXBkYXRlX3BzYV9jaGVja3N1bShkZXYpOworI2VuZGlmCS8qIFVTRV9QU0FfQ09ORklHICovCisgICAgfQorCisgIC8qIFplcm8gdGhlIG1tYyBzdHJ1Y3R1cmUgKi8KKyAgbWVtc2V0KCZtLCAweDAwLCBzaXplb2YobSkpOworCisgIC8qIENvcHkgUFNBIGluZm8gdG8gdGhlIG1tYyAqLworICBtLm1td19uZXR3X2lkX2wgPSBwc2EucHNhX253aWRbMV07CisgIG0ubW13X25ldHdfaWRfaCA9IHBzYS5wc2FfbndpZFswXTsKKyAgCisgIGlmKHBzYS5wc2FfbndpZF9zZWxlY3QgJiAxKQorICAgIG0ubW13X2xvb3B0X3NlbCA9IDB4MDA7CisgIGVsc2UKKyAgICBtLm1td19sb29wdF9zZWwgPSBNTVdfTE9PUFRfU0VMX0RJU19OV0lEOworCisgIG1lbWNweSgmbS5tbXdfZW5jcl9rZXksICZwc2EucHNhX2VuY3J5cHRpb25fa2V5LCAKKwkgc2l6ZW9mKG0ubW13X2VuY3Jfa2V5KSk7CisKKyAgaWYocHNhLnBzYV9lbmNyeXB0aW9uX3NlbGVjdCkKKyAgICBtLm1td19lbmNyX2VuYWJsZSA9IE1NV19FTkNSX0VOQUJMRV9FTiB8IE1NV19FTkNSX0VOQUJMRV9NT0RFOworICBlbHNlCisgICAgbS5tbXdfZW5jcl9lbmFibGUgPSAwOworCisgIG0ubW13X3Rocl9wcmVfc2V0ID0gcHNhLnBzYV90aHJfcHJlX3NldCAmIDB4M0Y7CisgIG0ubW13X3F1YWxpdHlfdGhyID0gcHNhLnBzYV9xdWFsaXR5X3RociAmIDB4MEY7CisKKyAgLyoKKyAgICogU2V0IGRlZmF1bHQgbW9kZW0gY29udHJvbCBwYXJhbWV0ZXJzLgorICAgKiBTZWUgTkNSIGRvY3VtZW50IDQwNy0wMDI0MzI2IFJldi4gQS4KKyAgICovCisgIG0ubW13X2phYmJlcl9lbmFibGUgPSAweDAxOworICBtLm1td19hbnRlbl9zZWwgPSBNTVdfQU5URU5fU0VMX0FMR19FTjsKKyAgbS5tbXdfaWZzID0gMHgyMDsKKyAgbS5tbXdfbW9kX2RlbGF5ID0gMHgwNDsKKyAgbS5tbXdfamFtX3RpbWUgPSAweDM4OworCisgIG0ubW13X2Rlc19pb19pbnZlcnQgPSAwOworICBtLm1td19mcmVlemUgPSAwOworICBtLm1td19kZWNheV9wcm0gPSAwOworICBtLm1td19kZWNheV91cGRhdF9wcm0gPSAwOworCisgIC8qIFdyaXRlIGFsbCBpbmZvIHRvIG1tYyAqLworICBtbWNfd3JpdGUoYmFzZSwgMCwgKHVfY2hhciAqKSZtLCBzaXplb2YobSkpOworCisgIC8qIFRoZSBmb2xsb3dpbmcgY29kZSBzdGFydCB0aGUgbW9kZW0gb2YgdGhlIDIuMDAgZnJlcXVlbmN5CisgICAqIHNlbGVjdGFibGUgY2FyZHMgYXQgcG93ZXIgb24uIEl0J3Mgbm90IHN0cmljdGx5IG5lZWRlZCBmb3IgdGhlCisgICAqIGZvbGxvd2luZyBib290cy4uLgorICAgKiBUaGUgb3JpZ2luYWwgcGF0Y2ggd2FzIGJ5IEpvZSBGaW5uZXkgZm9yIHRoZSBQQ01DSUEgZHJpdmVyLCBidXQKKyAgICogSSd2ZSBjbGVhbmVkIGl0IGEgYml0IGFuZCBhZGQgZG9jdW1lbnRhdGlvbi4KKyAgICogVGhhbmtzIHRvIExvZWtlIEJyZWRlcnZlbGQgZnJvbSBMdWNlbnQgZm9yIHRoZSBpbmZvLgorICAgKi8KKworICAvKiBBdHRlbXB0IHRvIHJlY29nbmlzZSAyLjAwIGNhcmRzICgyLjQgR0h6IGZyZXF1ZW5jeSBzZWxlY3RhYmxlKQorICAgKiAoZG9lcyBpdCB3b3JrIGZvciBldmVyeWJvZHkgPyAtIGVzcGVjaWFsbHkgb2xkIGNhcmRzLi4uKSAqLworICAvKiBOb3RlIDogV0ZSRVFTRUwgdmVyaWZ5IHRoYXQgaXQgaXMgYWJsZSB0byByZWFkIGZyb20gRUVwcm9tCisgICAqIGEgc2Vuc2libGUgZnJlcXVlbmN5IChhZGRyZXNzIDB4MDApICsgdGhhdCBNTVJfRkVFX1NUQVRVU19JRAorICAgKiBpcyAweEEgKFhpbGlueCB2ZXJzaW9uKSBvciAweEIgKEFyaWFkbmUgdmVyc2lvbikuCisgICAqIE15IHRlc3QgaXMgbW9yZSBjcnVkZSBidXQgZG8gd29yay4uLiAqLworICBpZighKG1tY19pbihiYXNlLCBtbXJvZmYoMCwgbW1yX2ZlZV9zdGF0dXMpKSAmCisgICAgICAgKE1NUl9GRUVfU1RBVFVTX0RXTEQgfCBNTVJfRkVFX1NUQVRVU19CVVNZKSkpCisgICAgeworICAgICAgLyogV2UgbXVzdCBkb3dubG9hZCB0aGUgZnJlcXVlbmN5IHBhcmFtZXRlcnMgdG8gdGhlCisgICAgICAgKiBzeW50aGV0aXNlcnMgKGZyb20gdGhlIEVFcHJvbSAtIGFyZWEgMSkKKyAgICAgICAqIE5vdGUgOiBhcyB0aGUgRUVwcm9tIGlzIGF1dG8gZGVjcmVtZW50ZWQsIHdlIHNldCB0aGUgZW5kCisgICAgICAgKiBpZiB0aGUgYXJlYS4uLiAqLworICAgICAgbS5tbXdfZmVlX2FkZHIgPSAweDBGOworICAgICAgbS5tbXdfZmVlX2N0cmwgPSBNTVdfRkVFX0NUUkxfUkVBRCB8IE1NV19GRUVfQ1RSTF9EV0xEOworICAgICAgbW1jX3dyaXRlKGJhc2UsIChjaGFyICopJm0ubW13X2ZlZV9jdHJsIC0gKGNoYXIgKikmbSwKKwkJKHVuc2lnbmVkIGNoYXIgKikmbS5tbXdfZmVlX2N0cmwsIDIpOworCisgICAgICAvKiBXYWl0IHVudGlsIHRoZSBkb3dubG9hZCBpcyBmaW5pc2hlZCAqLworICAgICAgZmVlX3dhaXQoYmFzZSwgMTAwLCAxMDApOworCisjaWZkZWYgREVCVUdfQ09ORklHX0lORk8KKyAgICAgIC8qIFRoZSBmcmVxdWVuY3kgd2FzIGluIHRoZSBsYXN0IHdvcmQgZG93bmxvYWRlZC4uLiAqLworICAgICAgbW1jX3JlYWQoYmFzZSwgKGNoYXIgKikmbS5tbXdfZmVlX2RhdGFfbCAtIChjaGFyICopJm0sCisJICAgICAgICh1bnNpZ25lZCBjaGFyICopJm0ubW13X2ZlZV9kYXRhX2wsIDIpOworCisgICAgICAvKiBQcmludCBzb21lIGluZm8gZm9yIHRoZSB1c2VyICovCisgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IFdhdmVsYW4gMi4wMCByZWNvZ25pc2VkIChmcmVxdWVuY3kgc2VsZWN0KSA6IEN1cnJlbnQgZnJlcXVlbmN5ID0gJWxkXG4iLAorCSAgICAgZGV2LT5uYW1lLAorCSAgICAgKChtLm1td19mZWVfZGF0YV9oIDw8IDQpIHwKKwkgICAgICAobS5tbXdfZmVlX2RhdGFfbCA+PiA0KSkgKiA1IC8gMiArIDI0MDAwTCk7CisjZW5kaWYKKworICAgICAgLyogV2UgbXVzdCBub3cgZG93bmxvYWQgdGhlIHBvd2VyIGFkanVzdCB2YWx1ZSAoZ2FpbikgdG8KKyAgICAgICAqIHRoZSBzeW50aGV0aXNlcnMgKGZyb20gdGhlIEVFcHJvbSAtIGFyZWEgNyAtIERBQykgKi8KKyAgICAgIG0ubW13X2ZlZV9hZGRyID0gMHg2MTsKKyAgICAgIG0ubW13X2ZlZV9jdHJsID0gTU1XX0ZFRV9DVFJMX1JFQUQgfCBNTVdfRkVFX0NUUkxfRFdMRDsKKyAgICAgIG1tY193cml0ZShiYXNlLCAoY2hhciAqKSZtLm1td19mZWVfY3RybCAtIChjaGFyICopJm0sCisJCSh1bnNpZ25lZCBjaGFyICopJm0ubW13X2ZlZV9jdHJsLCAyKTsKKworICAgICAgLyogV2FpdCB1bnRpbCB0aGUgZG93bmxvYWQgaXMgZmluaXNoZWQgKi8KKyAgICB9CS8qIGlmIDIuMDAgY2FyZCAqLworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl9tbWNfaW5pdCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisgIHJldHVybiBUUlVFOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUm91dGluZSB0byBncmFjZWZ1bGx5IHR1cm4gb2ZmIHJlY2VwdGlvbiwgYW5kIHdhaXQgZm9yIGFueSBjb21tYW5kcworICogdG8gY29tcGxldGUuCisgKiAoY2FsbGVkIGluIHd2X3J1X3N0YXJ0KCkgYW5kIHdhdmVsYW5fY2xvc2UoKSBhbmQgd2F2ZWxhbl9ldmVudCgpKQorICovCitzdGF0aWMgaW50Cit3dl9ydV9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBraW9fYWRkcl90CWJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgbmV0X2xvY2FsICoJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICB1bnNpZ25lZCBsb25nCWZsYWdzOworICBpbnQJCXN0YXR1czsKKyAgaW50CQlzcGluOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9ydV9zdG9wKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgLyogRmlyc3QsIHNlbmQgdGhlIExBTiBjb250cm9sbGVyIGEgc3RvcCByZWNlaXZlIGNvbW1hbmQgKi8KKyAgd3ZfODI1OTNfY21kKGRldiwgInd2X2dyYWNlZnVsX3NodXRkb3duKCk6IHN0b3AtcmN2IiwKKwkgICAgICAgT1AwX1NUT1BfUkNWLCBTUjBfTk9fUkVTVUxUKTsKKworICAvKiBUaGVuLCBzcGluIHVudGlsIHRoZSByZWNlaXZlIHVuaXQgZ29lcyBpZGxlICovCisgIHNwaW4gPSAzMDA7CisgIGRvCisgICAgeworICAgICAgdWRlbGF5KDEwKTsKKyAgICAgIG91dGIoT1AwX05PUCB8IENSMF9TVEFUVVNfMywgTENDUihiYXNlKSk7CisgICAgICBzdGF0dXMgPSBpbmIoTENTUihiYXNlKSk7CisgICAgfQorICB3aGlsZSgoKHN0YXR1cyAmIFNSM19SQ1ZfU1RBVEVfTUFTSykgIT0gU1IzX1JDVl9JRExFKSAmJiAoc3Bpbi0tID4gMCkpOworCisgIC8qIE5vdywgc3BpbiB1bnRpbCB0aGUgY2hpcCBmaW5pc2hlcyBleGVjdXRpbmcgaXRzIGN1cnJlbnQgY29tbWFuZCAqLworICBkbworICAgIHsKKyAgICAgIHVkZWxheSgxMCk7CisgICAgICBvdXRiKE9QMF9OT1AgfCBDUjBfU1RBVFVTXzMsIExDQ1IoYmFzZSkpOworICAgICAgc3RhdHVzID0gaW5iKExDU1IoYmFzZSkpOworICAgIH0KKyAgd2hpbGUoKChzdGF0dXMgJiBTUjNfRVhFQ19TVEFURV9NQVNLKSAhPSBTUjNfRVhFQ19JRExFKSAmJiAoc3Bpbi0tID4gMCkpOworCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisgIC8qIElmIHRoZXJlIHdhcyBhIHByb2JsZW0gKi8KKyAgaWYoc3BpbiA8PSAwKQorICAgIHsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1JTCisgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogd3ZfcnVfc3RvcCgpOiBUaGUgY2hpcCBkb2Vzbid0IHdhbnQgdG8gc3RvcC4uLlxuIiwKKwkgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2X3J1X3N0b3AoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4gVFJVRTsKK30gLyogd3ZfcnVfc3RvcCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyByb3V0aW5lIHN0YXJ0cyB0aGUgcmVjZWl2ZSB1bml0IHJ1bm5pbmcuICBGaXJzdCwgaXQgY2hlY2tzIGlmCisgKiB0aGUgY2FyZCBpcyBhY3R1YWxseSByZWFkeS4gVGhlbiB0aGUgY2FyZCBpcyBpbnN0cnVjdGVkIHRvIHJlY2VpdmUKKyAqIHBhY2tldHMgYWdhaW4uCisgKiAoY2FsbGVkIGluIHd2X2h3X3Jlc2V0KCkgJiB3YXZlbGFuX29wZW4oKSkKKyAqLworc3RhdGljIGludAord3ZfcnVfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisgIGtpb19hZGRyX3QJYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICBuZXRfbG9jYWwgKglscCA9IG5ldGRldl9wcml2KGRldik7CisgIHVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPnd2X3J1X3N0YXJ0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICAvKgorICAgKiBXZSBuZWVkIHRvIHN0YXJ0IGZyb20gYSBxdWllc2NlbnQgc3RhdGUuIFRvIGRvIHNvLCB3ZSBjb3VsZCBjaGVjaworICAgKiBpZiB0aGUgY2FyZCBpcyBhbHJlYWR5IHJ1bm5pbmcsIGJ1dCBpbnN0ZWFkIHdlIGp1c3QgdHJ5IHRvIHNodXQKKyAgICogaXQgZG93bi4gRmlyc3QsIHdlIGRpc2FibGUgcmVjZXB0aW9uIChpbiBjYXNlIGl0IHdhcyBhbHJlYWR5IGVuYWJsZWQpLgorICAgKi8KKyAgaWYoIXd2X3J1X3N0b3AoZGV2KSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgc3Bpbl9sb2NrX2lycXNhdmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisgIC8qIE5vdyB3ZSBrbm93IHRoYXQgbm8gY29tbWFuZCBpcyBiZWluZyBleGVjdXRlZC4gKi8KKworICAvKiBTZXQgdGhlIHJlY2VpdmUgZnJhbWUgcG9pbnRlciBhbmQgc3RvcCBwb2ludGVyICovCisgIGxwLT5yZnAgPSAwOworICBvdXRiKE9QMF9TV0lUX1RPX1BPUlRfMSB8IENSMF9DSE5MLCBMQ0NSKGJhc2UpKTsKKworICAvKiBSZXNldCByaW5nIG1hbmFnZW1lbnQuICBUaGlzIHNldHMgdGhlIHJlY2VpdmUgZnJhbWUgcG9pbnRlciB0byAxICovCisgIG91dGIoT1AxX1JFU0VUX1JJTkdfTU5HTVQsIExDQ1IoYmFzZSkpOworCisjaWYgMAorICAvKiBYWFggdGhlIGk4MjU5MyBtYW51YWwgcGFnZSA2LTQgc2VlbXMgdG8gaW5kaWNhdGUgdGhhdCB0aGUgc3RvcCByZWdpc3RlcgorICAgICBzaG91bGQgYmUgc2V0IGFzIGJlbG93ICovCisgIC8qIG91dGIoQ1IxX1NUT1BfUkVHX1VQREFURXwoKFJYX1NJWkUgLSAweDQwKT4+IFJYX1NJWkVfU0hJRlQpLExDQ1IoYmFzZSkpOyovCisjZWxpZiAwCisgIC8qIGJ1dCBJIHNldCBpdCAwIGluc3RlYWQgKi8KKyAgbHAtPnN0b3AgPSAwOworI2Vsc2UKKyAgLyogYnV0IEkgc2V0IGl0IHRvIDMgYnl0ZXMgcGVyIHBhY2tldCBsZXNzIHRoYW4gOEsgKi8KKyAgbHAtPnN0b3AgPSAoMCArIFJYX1NJWkUgLSAoKFJYX1NJWkUgLyA2NCkgKiAzKSkgJSBSWF9TSVpFOworI2VuZGlmCisgIG91dGIoQ1IxX1NUT1BfUkVHX1VQREFURSB8IChscC0+c3RvcCA+PiBSWF9TSVpFX1NISUZUKSwgTENDUihiYXNlKSk7CisgIG91dGIoT1AxX0lOVF9FTkFCTEUsIExDQ1IoYmFzZSkpOworICBvdXRiKE9QMV9TV0lUX1RPX1BPUlRfMCwgTENDUihiYXNlKSk7CisKKyAgLyogUmVzZXQgcmVjZWl2ZSBETUEgcG9pbnRlciAqLworICBoYWNyX3dyaXRlX3Nsb3coYmFzZSwgSEFDUl9QV1JfU1RBVCB8IEhBQ1JfVFhfRE1BX1JFU0VUKTsKKyAgaGFjcl93cml0ZV9zbG93KGJhc2UsIEhBQ1JfREVGQVVMVCk7CisKKyAgLyogUmVjZWl2ZSBETUEgb24gY2hhbm5lbCAxICovCisgIHd2XzgyNTkzX2NtZChkZXYsICJ3dl9ydV9zdGFydCgpOiByY3YtZW5hYmxlIiwKKwkgICAgICAgQ1IwX0NITkwgfCBPUDBfUkNWX0VOQUJMRSwgU1IwX05PX1JFU1VMVCk7CisKKyNpZmRlZiBERUJVR19JODI1OTNfU0hPVworICB7CisgICAgaW50CXN0YXR1czsKKyAgICBpbnQJb3ByaTsKKyAgICBpbnQJc3BpbiA9IDEwMDAwOworCisgICAgLyogc3BpbiB1bnRpbCB0aGUgY2hpcCBzdGFydHMgcmVjZWl2aW5nICovCisgICAgZG8KKyAgICAgIHsKKwlvdXRiKE9QMF9OT1AgfCBDUjBfU1RBVFVTXzMsIExDQ1IoYmFzZSkpOworCXN0YXR1cyA9IGluYihMQ1NSKGJhc2UpKTsKKwlpZihzcGluLS0gPD0gMCkKKwkgIGJyZWFrOworICAgICAgfQorICAgIHdoaWxlKCgoc3RhdHVzICYgU1IzX1JDVl9TVEFURV9NQVNLKSAhPSBTUjNfUkNWX0FDVElWRSkgJiYKKwkgICgoc3RhdHVzICYgU1IzX1JDVl9TVEFURV9NQVNLKSAhPSBTUjNfUkNWX1JFQURZKSk7CisgICAgcHJpbnRrKEtFUk5fREVCVUcgInJjdiBzdGF0dXMgaXMgMHgleCBbaTolZF1cbiIsCisJICAgKHN0YXR1cyAmIFNSM19SQ1ZfU1RBVEVfTUFTSyksIGkpOworICB9CisjZW5kaWYKKworICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfcnVfc3RhcnQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4gVFJVRTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoaXMgcm91dGluZSBkb2VzIGEgc3RhbmRhcmQgY29uZmlnIG9mIHRoZSBXYXZlTEFOIGNvbnRyb2xsZXIgKGk4MjU5MykuCisgKiBJbiB0aGUgSVNBIGRyaXZlciwgdGhpcyBpcyBpbnRlZ3JhdGVkIGluIHdhdmVsYW5faGFyZHdhcmVfcmVzZXQoKQorICogKGNhbGxlZCBieSB3dl9od19jb25maWcoKSwgd3ZfODI1OTNfcmVjb25maWcoKSAmIHdhdmVsYW5fcGFja2V0X3htaXQoKSkKKyAqLworc3RhdGljIGludAord3ZfODI1OTNfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBraW9fYWRkcl90CQkJYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICBuZXRfbG9jYWwgKgkJCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgc3RydWN0IGk4MjU5M19jb25mX2Jsb2NrCWNmYmxrOworICBpbnQJCQkJcmV0ID0gVFJVRTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfODI1OTNfY29uZmlnKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICAvKiBDcmVhdGUgJiBmaWxsIGk4MjU5MyBjb25maWcgYmxvY2sKKyAgICoKKyAgICogTm93IGNvbmZvcm0gdG8gV2F2ZWxhbiBkb2N1bWVudCBXQ0lOMDg1QgorICAgKi8KKyAgbWVtc2V0KCZjZmJsaywgMHgwMCwgc2l6ZW9mKHN0cnVjdCBpODI1OTNfY29uZl9ibG9jaykpOworICBjZmJsay5kNm1vZCA9IEZBTFNFOyAgCS8qIFJ1biBpbiBpODI1OTMgYWR2YW5jZWQgbW9kZSAqLworICBjZmJsay5maWZvX2xpbWl0ID0gNTsgICAgICAgICAvKiA9IDU2IEIgcnggYW5kIDQwIEIgdHggZmlmbyB0aHJlc2hvbGRzICovCisgIGNmYmxrLmZvcmduZXNpID0gRkFMU0U7ICAgICAgIC8qIDA9ODJDNTAxLCAxPUFNRDc5OTJCIGNvbXBhdGliaWxpdHkgKi8KKyAgY2ZibGsuZmlmb18zMiA9IDE7CisgIGNmYmxrLnRocm90dGxlX2VuYiA9IEZBTFNFOworICBjZmJsay5jb250aW4gPSBUUlVFOyAgICAgICAgICAvKiBlbmFibGUgY29udGludW91cyBtb2RlICovCisgIGNmYmxrLmNudHJ4aW50ID0gRkFMU0U7ICAgICAgIC8qIGVuYWJsZSBjb250aW51b3VzIG1vZGUgcmVjZWl2ZSBpbnRlcnJ1cHRzICovCisgIGNmYmxrLmFkZHJfbGVuID0gV0FWRUxBTl9BRERSX1NJWkU7CisgIGNmYmxrLmFjbG9jID0gVFJVRTsgICAgICAgICAgIC8qIERpc2FibGUgc291cmNlIGFkZHIgaW5zZXJ0aW9uIGJ5IGk4MjU5MyAqLworICBjZmJsay5wcmVhbWJfbGVuID0gMDsgICAgICAgICAvKiAyIGJ5dGVzIHByZWFtYmxlIChTRkQpICovCisgIGNmYmxrLmxvb3BiYWNrID0gRkFMU0U7CisgIGNmYmxrLmxpbl9wcmlvID0gMDsgICAJLyogY29uZm9ybSB0byA4MDIuMyBiYWNrb2ZmIGFsZ29yaXRtICovCisgIGNmYmxrLmV4cF9wcmlvID0gNTsJICAgICAgICAvKiBjb25mb3JtIHRvIDgwMi4zIGJhY2tvZmYgYWxnb3JpdG0gKi8KKyAgY2ZibGsuYm9mX21ldCA9IDE7CSAgICAgICAgLyogY29uZm9ybSB0byA4MDIuMyBiYWNrb2ZmIGFsZ29yaXRtICovCisgIGNmYmxrLmlmcm1fc3BjID0gMHgyMDsJLyogMzIgYml0IHRpbWVzIGludGVyZnJhbWUgc3BhY2luZyAqLworICBjZmJsay5zbG90dGltX2xvdyA9IDB4MjA7CS8qIDMyIGJpdCB0aW1lcyBzbG90IHRpbWUgKi8KKyAgY2ZibGsuc2xvdHRpbV9oaSA9IDB4MDsKKyAgY2ZibGsubWF4X3JldHIgPSAxNTsKKyAgY2ZibGsucHJtaXNjID0gKChscC0+cHJvbWlzY3VvdXMpID8gVFJVRTogRkFMU0UpOwkvKiBQcm9taXNjdW91cyBtb2RlICovCisgIGNmYmxrLmJjX2RpcyA9IEZBTFNFOyAgICAgICAgIC8qIEVuYWJsZSBicm9hZGNhc3QgcmVjZXB0aW9uICovCisgIGNmYmxrLmNyc18xID0gVFJVRTsJCS8qIFRyYW5zbWl0IHdpdGhvdXQgY2FycmllciBzZW5zZSAqLworICBjZmJsay5ub2NyY19pbnMgPSBGQUxTRTsJLyogaTgyNTkzIGdlbmVyYXRlcyBDUkMgKi8JCisgIGNmYmxrLmNyY18xNjMyID0gRkFMU0U7CS8qIDMyLWJpdCBBdXRvZGluLUlJIENSQyAqLworICBjZmJsay5jcnNfY2R0ID0gRkFMU0U7CS8qIENEIG5vdCB0byBiZSBpbnRlcnByZXRlZCBhcyBDUyAqLworICBjZmJsay5jc19maWx0ZXIgPSAwOyAgCS8qIENTIGlzIHJlY29nbml6ZWQgaW1tZWRpYXRlbHkgKi8KKyAgY2ZibGsuY3JzX3NyYyA9IEZBTFNFOwkvKiBFeHRlcm5hbCBjYXJyaWVyIHNlbnNlICovCisgIGNmYmxrLmNkX2ZpbHRlciA9IDA7ICAJLyogQ0QgaXMgcmVjb2duaXplZCBpbW1lZGlhdGVseSAqLworICBjZmJsay5taW5fZnJfbGVuID0gRVRIX1pMRU4gPj4gMjsgICAgIC8qIE1pbmltdW0gZnJhbWUgbGVuZ3RoIDY0IGJ5dGVzICovCisgIGNmYmxrLmxuZ190eXAgPSBGQUxTRTsJLyogTGVuZ3RoIGZpZWxkID4gMTUwMCA9IHR5cGUgZmllbGQgKi8KKyAgY2ZibGsubG5nX2ZsZCA9IFRSVUU7IAkvKiBEaXNhYmxlIDgwMi4zIGxlbmd0aCBmaWVsZCBjaGVjayAqLworICBjZmJsay5yeGNyY194ZiA9IFRSVUU7CS8qIERvbid0IHRyYW5zZmVyIENSQyB0byBtZW1vcnkgKi8KKyAgY2ZibGsuYXJ0eCA9IFRSVUU7CQkvKiBEaXNhYmxlIGF1dG9tYXRpYyByZXRyYW5zbWlzc2lvbiAqLworICBjZmJsay5zYXJlYyA9IFRSVUU7CQkvKiBEaXNhYmxlIHNvdXJjZSBhZGRyIHRyaWcgb2YgQ0QgKi8KKyAgY2ZibGsudHhfamFiYmVyID0gVFJVRTsJLyogRGlzYWJsZSBqYWJiZXIgamFtIHNlcXVlbmNlICovCisgIGNmYmxrLmhhc2hfMSA9IEZBTFNFOyAJLyogVXNlIGJpdHMgMC01IGluIG1jIGFkZHJlc3MgaGFzaCAqLworICBjZmJsay5sYnBrcG9sID0gVFJVRTsgCS8qIExvb3BiYWNrIHBpbiBhY3RpdmUgaGlnaCAqLworICBjZmJsay5mZHggPSBGQUxTRTsJCS8qIERpc2FibGUgZnVsbCBkdXBsZXggb3BlcmF0aW9uICovCisgIGNmYmxrLmR1bW15XzYgPSAweDNmOyAJLyogYWxsIG9uZXMgKi8KKyAgY2ZibGsubXVsdF9pYSA9IEZBTFNFOwkvKiBObyBtdWx0aXBsZSBpbmRpdmlkdWFsIGFkZHJlc3NlcyAqLworICBjZmJsay5kaXNfYm9mID0gRkFMU0U7CS8qIERpc2FibGUgdGhlIGJhY2tvZmYgYWxnb3JpdGhtID8hICovCisgIGNmYmxrLmR1bW15XzEgPSBUUlVFOyAJLyogc2V0IHRvIDEgKi8KKyAgY2ZibGsudHhfaWZzX3JldHJpZyA9IDM7CS8qIEhtbS4uLiBEaXNhYmxlZCAqLworI2lmZGVmIE1VTFRJQ0FTVF9BTEwKKyAgY2ZibGsubWNfYWxsID0gKGxwLT5hbGxtdWx0aWNhc3QgPyBUUlVFOiBGQUxTRSk7CS8qIEFsbG93IGFsbCBtdWx0aWNhc3RzICovCisjZWxzZQorICBjZmJsay5tY19hbGwgPSBGQUxTRTsJCS8qIE5vIG11bHRpY2FzdCBhbGwgbW9kZSAqLworI2VuZGlmCisgIGNmYmxrLnJjdl9tb24gPSAwOwkJLyogTW9uaXRvciBtb2RlIGRpc2FibGVkICovCisgIGNmYmxrLmZyYWdfYWNwdCA9IFRSVUU7CS8qIERvIG5vdCBhY2NlcHQgZnJhZ21lbnRzICovCisgIGNmYmxrLnRzdHJ0dHJzID0gRkFMU0U7CS8qIE5vIHN0YXJ0IHRyYW5zbWlzc2lvbiB0aHJlc2hvbGQgKi8KKyAgY2ZibGsuZnJldHggPSBUUlVFOwkJLyogRklGTyBhdXRvbWF0aWMgcmV0cmFuc21pc3Npb24gKi8KKyAgY2ZibGsuc3luY3JxcyA9IEZBTFNFOyAJLyogU3luY2hyb25vdXMgRFJRIGRlYXNzZXJ0aW9uLi4uICovCisgIGNmYmxrLnN0dGxlbiA9IFRSVUU7ICAJLyogNiBieXRlIHN0YXR1cyByZWdpc3RlcnMgKi8KKyAgY2ZibGsucnhfZW9wID0gVFJVRTsgIAkvKiBTaWduYWwgRU9QIG9uIHBhY2tldCByZWNlcHRpb24gKi8KKyAgY2ZibGsudHhfZW9wID0gVFJVRTsgIAkvKiBTaWduYWwgRU9QIG9uIHBhY2tldCB0cmFuc21pc3Npb24gKi8KKyAgY2ZibGsucmJ1Zl9zaXplID0gUlhfU0laRT4+MTE7CS8qIFNldCByZWNlaXZlIGJ1ZmZlciBzaXplICovCisgIGNmYmxrLnJjdnN0b3AgPSBUUlVFOyAJLyogRW5hYmxlIFJlY2VpdmUgU3RvcCBSZWdpc3RlciAqLworCisjaWZkZWYgREVCVUdfSTgyNTkzX1NIT1cKKyAgeworICAgIHVfY2hhciAqYyA9ICh1X2NoYXIgKikgJmNmYmxrOworICAgIGludCBpOworICAgIHByaW50ayhLRVJOX0RFQlVHICJ3YXZlbGFuX2NzOiBjb25maWcgYmxvY2s6Iik7CisgICAgZm9yKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCBpODI1OTNfY29uZl9ibG9jayk7IGkrKyxjKyspCisgICAgICB7CisJaWYoKGkgJSAxNikgPT0gMCkgcHJpbnRrKCJcbiIgS0VSTl9ERUJVRyk7CisJcHJpbnRrKCIlMDJ4ICIsICpjKTsKKyAgICAgIH0KKyAgICBwcmludGsoIlxuIik7CisgIH0KKyNlbmRpZgorCisgIC8qIENvcHkgdGhlIGNvbmZpZyBibG9jayB0byB0aGUgaTgyNTkzICovCisgIG91dGIoVFhfQkFTRSAmIDB4ZmYsIFBJT1JMKGJhc2UpKTsKKyAgb3V0YigoKFRYX0JBU0UgPj4gOCkgJiBQSU9SSF9NQVNLKSB8IFBJT1JIX1NFTF9UWCwgUElPUkgoYmFzZSkpOworICBvdXRiKHNpemVvZihzdHJ1Y3QgaTgyNTkzX2NvbmZfYmxvY2spICYgMHhmZiwgUElPUChiYXNlKSk7ICAgIC8qIGxzYiAqLworICBvdXRiKHNpemVvZihzdHJ1Y3QgaTgyNTkzX2NvbmZfYmxvY2spID4+IDgsIFBJT1AoYmFzZSkpOwkvKiBtc2IgKi8KKyAgb3V0c2IoUElPUChiYXNlKSwgKGNoYXIgKikgJmNmYmxrLCBzaXplb2Yoc3RydWN0IGk4MjU5M19jb25mX2Jsb2NrKSk7CisKKyAgLyogcmVzZXQgdHJhbnNtaXQgRE1BIHBvaW50ZXIgKi8KKyAgaGFjcl93cml0ZV9zbG93KGJhc2UsIEhBQ1JfUFdSX1NUQVQgfCBIQUNSX1RYX0RNQV9SRVNFVCk7CisgIGhhY3Jfd3JpdGUoYmFzZSwgSEFDUl9ERUZBVUxUKTsKKyAgaWYoIXd2XzgyNTkzX2NtZChkZXYsICJ3dl84MjU5M19jb25maWcoKTogY29uZmlndXJlIiwKKwkJICAgT1AwX0NPTkZJR1VSRSwgU1IwX0NPTkZJR1VSRV9ET05FKSkKKyAgICByZXQgPSBGQUxTRTsKKworICAvKiBJbml0aWFsaXplIGFkYXB0ZXIncyBldGhlcm5ldCBNQUMgYWRkcmVzcyAqLworICBvdXRiKFRYX0JBU0UgJiAweGZmLCBQSU9STChiYXNlKSk7CisgIG91dGIoKChUWF9CQVNFID4+IDgpICYgUElPUkhfTUFTSykgfCBQSU9SSF9TRUxfVFgsIFBJT1JIKGJhc2UpKTsKKyAgb3V0YihXQVZFTEFOX0FERFJfU0laRSwgUElPUChiYXNlKSk7CS8qIGJ5dGUgY291bnQgbHNiICovCisgIG91dGIoMCwgUElPUChiYXNlKSk7CQkJLyogYnl0ZSBjb3VudCBtc2IgKi8KKyAgb3V0c2IoUElPUChiYXNlKSwgJmRldi0+ZGV2X2FkZHJbMF0sIFdBVkVMQU5fQUREUl9TSVpFKTsKKworICAvKiByZXNldCB0cmFuc21pdCBETUEgcG9pbnRlciAqLworICBoYWNyX3dyaXRlX3Nsb3coYmFzZSwgSEFDUl9QV1JfU1RBVCB8IEhBQ1JfVFhfRE1BX1JFU0VUKTsKKyAgaGFjcl93cml0ZShiYXNlLCBIQUNSX0RFRkFVTFQpOworICBpZighd3ZfODI1OTNfY21kKGRldiwgInd2XzgyNTkzX2NvbmZpZygpOiBpYS1zZXR1cCIsCisJCSAgIE9QMF9JQV9TRVRVUCwgU1IwX0lBX1NFVFVQX0RPTkUpKQorICAgIHJldCA9IEZBTFNFOworCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisgICAgLyogSWYgcm9hbWluZyBpcyBlbmFibGVkLCBqb2luIHRoZSAiQmVhY29uIFJlcXVlc3QiIG11bHRpY2FzdCBncm91cC4uLiAqLworICAgIC8qIEJ1dCBvbmx5IGlmIGl0J3Mgbm90IGluIHRoZXJlIGFscmVhZHkhICovCisgIGlmKGRvX3JvYW1pbmcpCisgICAgZGV2X21jX2FkZChkZXYsV0FWRUxBTl9CRUFDT05fQUREUkVTUywgV0FWRUxBTl9BRERSX1NJWkUsIDEpOworI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworCisgIC8qIElmIGFueSBtdWx0aWNhc3QgYWRkcmVzcyB0byBzZXQgKi8KKyAgaWYobHAtPm1jX2NvdW50KQorICAgIHsKKyAgICAgIHN0cnVjdCBkZXZfbWNfbGlzdCAqCWRtaTsKKyAgICAgIGludAkJCWFkZHJzX2xlbiA9IFdBVkVMQU5fQUREUl9TSVpFICogbHAtPm1jX2NvdW50OworCisjaWZkZWYgREVCVUdfQ09ORklHX0lORk8KKyAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfaHdfY29uZmlnKCk6IHNldCAlZCBtdWx0aWNhc3QgYWRkcmVzc2VzOlxuIiwKKwkgICAgIGRldi0+bmFtZSwgbHAtPm1jX2NvdW50KTsKKyAgICAgIGZvcihkbWk9ZGV2LT5tY19saXN0OyBkbWk7IGRtaT1kbWktPm5leHQpCisJcHJpbnRrKEtFUk5fREVCVUcgIiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkgICAgICAgZG1pLT5kbWlfYWRkclswXSwgZG1pLT5kbWlfYWRkclsxXSwgZG1pLT5kbWlfYWRkclsyXSwKKwkgICAgICAgZG1pLT5kbWlfYWRkclszXSwgZG1pLT5kbWlfYWRkcls0XSwgZG1pLT5kbWlfYWRkcls1XSApOworI2VuZGlmCisKKyAgICAgIC8qIEluaXRpYWxpemUgYWRhcHRlcidzIGV0aGVybmV0IG11bHRpY2FzdCBhZGRyZXNzZXMgKi8KKyAgICAgIG91dGIoVFhfQkFTRSAmIDB4ZmYsIFBJT1JMKGJhc2UpKTsKKyAgICAgIG91dGIoKChUWF9CQVNFID4+IDgpICYgUElPUkhfTUFTSykgfCBQSU9SSF9TRUxfVFgsIFBJT1JIKGJhc2UpKTsKKyAgICAgIG91dGIoYWRkcnNfbGVuICYgMHhmZiwgUElPUChiYXNlKSk7CS8qIGJ5dGUgY291bnQgbHNiICovCisgICAgICBvdXRiKChhZGRyc19sZW4gPj4gOCksIFBJT1AoYmFzZSkpOwkvKiBieXRlIGNvdW50IG1zYiAqLworICAgICAgZm9yKGRtaT1kZXYtPm1jX2xpc3Q7IGRtaTsgZG1pPWRtaS0+bmV4dCkKKwlvdXRzYihQSU9QKGJhc2UpLCBkbWktPmRtaV9hZGRyLCBkbWktPmRtaV9hZGRybGVuKTsKKworICAgICAgLyogcmVzZXQgdHJhbnNtaXQgRE1BIHBvaW50ZXIgKi8KKyAgICAgIGhhY3Jfd3JpdGVfc2xvdyhiYXNlLCBIQUNSX1BXUl9TVEFUIHwgSEFDUl9UWF9ETUFfUkVTRVQpOworICAgICAgaGFjcl93cml0ZShiYXNlLCBIQUNSX0RFRkFVTFQpOworICAgICAgaWYoIXd2XzgyNTkzX2NtZChkZXYsICJ3dl84MjU5M19jb25maWcoKTogbWMtc2V0dXAiLAorCQkgICAgICAgT1AwX01DX1NFVFVQLCBTUjBfTUNfU0VUVVBfRE9ORSkpCisJcmV0ID0gRkFMU0U7CisgICAgICBscC0+bWNfY291bnQgPSBkZXYtPm1jX2NvdW50OwkvKiByZW1lbWJlciB0byBhdm9pZCByZXBlYXRlZCByZXNldCAqLworICAgIH0KKworICAvKiBKb2IgZG9uZSwgY2xlYXIgdGhlIGZsYWcgKi8KKyAgbHAtPnJlY29uZmlnXzgyNTkzID0gRkFMU0U7CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXd2XzgyNTkzX2NvbmZpZygpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisgIHJldHVybihyZXQpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogUmVhZCB0aGUgQWNjZXNzIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIsIHBlcmZvcm0gYSBzb2Z0d2FyZSByZXNldCwKKyAqIGFuZCB0aGVuIHJlLWVuYWJsZSB0aGUgY2FyZCdzIHNvZnR3YXJlLgorICoKKyAqIElmIEkgdW5kZXJzdGFuZCBjb3JyZWN0bHkgOiByZXNldCB0aGUgcGNtY2lhIGludGVyZmFjZSBvZiB0aGUKKyAqIHdhdmVsYW4uCisgKiAoY2FsbGVkIGJ5IHd2X2NvbmZpZygpKQorICovCitzdGF0aWMgaW5saW5lIGludAord3ZfcGNtY2lhX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBpbnQJCWk7CisgIGNvbmZfcmVnX3QJcmVnID0geyAwLCBDU19SRUFELCBDSVNSRUdfQ09SLCAwIH07CisgIGRldl9saW5rX3QgKglsaW5rID0gKChuZXRfbG9jYWwgKiluZXRkZXZfcHJpdihkZXYpKS0+bGluazsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfcGNtY2lhX3Jlc2V0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworICBpID0gcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGxpbmstPmhhbmRsZSwgJnJlZyk7CisgIGlmKGkgIT0gQ1NfU1VDQ0VTUykKKyAgICB7CisgICAgICBjc19lcnJvcihsaW5rLT5oYW5kbGUsIEFjY2Vzc0NvbmZpZ3VyYXRpb25SZWdpc3RlciwgaSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgICAgCisjaWZkZWYgREVCVUdfQ09ORklHX0lORk8KKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3YXZlbGFuX3BjbWNpYV9yZXNldCgpOiBDb25maWcgcmVnIGlzIDB4JXhcbiIsCisJIGRldi0+bmFtZSwgKHVfaW50KSByZWcuVmFsdWUpOworI2VuZGlmCisKKyAgcmVnLkFjdGlvbiA9IENTX1dSSVRFOworICByZWcuVmFsdWUgPSByZWcuVmFsdWUgfCBDT1JfU1dfUkVTRVQ7CisgIGkgPSBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIobGluay0+aGFuZGxlLCAmcmVnKTsKKyAgaWYoaSAhPSBDU19TVUNDRVNTKQorICAgIHsKKyAgICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgQWNjZXNzQ29uZmlndXJhdGlvblJlZ2lzdGVyLCBpKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgICAKKyAgcmVnLkFjdGlvbiA9IENTX1dSSVRFOworICByZWcuVmFsdWUgPSBDT1JfTEVWRUxfSVJRIHwgQ09SX0NPTkZJRzsKKyAgaSA9IHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihsaW5rLT5oYW5kbGUsICZyZWcpOworICBpZihpICE9IENTX1NVQ0NFU1MpCisgICAgeworICAgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBBY2Nlc3NDb25maWd1cmF0aW9uUmVnaXN0ZXIsIGkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfcGNtY2lhX3Jlc2V0KClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiB3YXZlbGFuX2h3X2NvbmZpZygpIGlzIGNhbGxlZCBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50IGlzCisgKiByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSB3YXZlbGFuIGhhcmR3YXJlLgorICogTm90ZSB0aGF0IHRoZSByZWNlcHRpb24gd2lsbCBiZSBlbmFibGVkIGluIHdhdmVsYW4tPm9wZW4oKSwgc28gdGhlCisgKiBkZXZpY2UgaXMgY29uZmlndXJlZCBidXQgaWRsZS4uLgorICogUGVyZm9ybXMgdGhlIGZvbGxvd2luZyBhY3Rpb25zOgorICogCTEuIEEgcGNtY2lhIHNvZnR3YXJlIHJlc2V0ICh1c2luZyB3dl9wY21jaWFfcmVzZXQoKSkKKyAqCTIuIEEgcG93ZXIgcmVzZXQgKHJlc2V0IERNQSkKKyAqCTMuIFJlc2V0IHRoZSBMQU4gY29udHJvbGxlcgorICoJNC4gSW5pdGlhbGl6ZSB0aGUgcmFkaW8gbW9kZW0gKHVzaW5nIHd2X21tY19pbml0KQorICoJNS4gQ29uZmlndXJlIExBTiBjb250cm9sbGVyICh1c2luZyB3dl84MjU5M19jb25maWcpCisgKgk2LiBQZXJmb3JtIGEgZGlhZ25vc3RpYyBvbiB0aGUgTEFOIGNvbnRyb2xsZXIKKyAqIChjYWxsZWQgYnkgd2F2ZWxhbl9ldmVudCgpICYgd3ZfaHdfcmVzZXQoKSkKKyAqLworc3RhdGljIGludAord3ZfaHdfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBuZXRfbG9jYWwgKgkJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICBraW9fYWRkcl90CQliYXNlID0gZGV2LT5iYXNlX2FkZHI7CisgIHVuc2lnbmVkIGxvbmcJCWZsYWdzOworICBpbnQJCQlyZXQgPSBGQUxTRTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d3ZfaHdfY29uZmlnKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworI2lmZGVmIFNUUlVDVF9DSEVDSworICBpZih3dl9zdHJ1Y3R1Y3RfY2hlY2soKSAhPSAoY2hhciAqKSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB3dl9od19jb25maWc6IHN0cnVjdHVyZS9jb21waWxlciBib3RjaDogXCIlc1wiXG4iLAorCSAgICAgZGV2LT5uYW1lLCB3dl9zdHJ1Y3R1Y3RfY2hlY2soKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorI2VuZGlmCS8qIFNUUlVDVF9DSEVDSyA9PSAxICovCisKKyAgLyogUmVzZXQgdGhlIHBjbWNpYSBpbnRlcmZhY2UgKi8KKyAgaWYod3ZfcGNtY2lhX3Jlc2V0KGRldikgPT0gRkFMU0UpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIERpc2FibGUgaW50ZXJydXB0cyAqLworICBzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnNwaW5sb2NrLCBmbGFncyk7CisKKyAgLyogRGlzZ3Vpc2VkIGdvdG8gOy0pICovCisgIGRvCisgICAgeworICAgICAgLyogUG93ZXIgVVAgdGhlIG1vZHVsZSArIHJlc2V0IHRoZSBtb2RlbSArIHJlc2V0IGhvc3QgYWRhcHRlcgorICAgICAgICogKGluIGZhY3QsIHJlc2V0IERNQSBjaGFubmVscykgKi8KKyAgICAgIGhhY3Jfd3JpdGVfc2xvdyhiYXNlLCBIQUNSX1JFU0VUKTsKKyAgICAgIGhhY3Jfd3JpdGUoYmFzZSwgSEFDUl9ERUZBVUxUKTsKKworICAgICAgLyogQ2hlY2sgaWYgdGhlIG1vZHVsZSBoYXMgYmVlbiBwb3dlcmVkIHVwLi4uICovCisgICAgICBpZihoYXNyX3JlYWQoYmFzZSkgJiBIQVNSX05PX0NMSykKKwl7CisjaWZkZWYgREVCVUdfQ09ORklHX0VSUk9SUworCSAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHd2X2h3X2NvbmZpZygpOiBtb2RlbSBub3QgY29ubmVjdGVkIG9yIG5vdCBhIHdhdmVsYW4gY2FyZFxuIiwKKwkJIGRldi0+bmFtZSk7CisjZW5kaWYKKwkgIGJyZWFrOworCX0KKworICAgICAgLyogaW5pdGlhbGl6ZSB0aGUgbW9kZW0gKi8KKyAgICAgIGlmKHd2X21tY19pbml0KGRldikgPT0gRkFMU0UpCisJeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUlMKKwkgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB3dl9od19jb25maWcoKTogQ2FuJ3QgY29uZmlndXJlIHRoZSBtb2RlbVxuIiwKKwkJIGRldi0+bmFtZSk7CisjZW5kaWYKKwkgIGJyZWFrOworCX0KKworICAgICAgLyogcmVzZXQgdGhlIExBTiBjb250cm9sbGVyIChpODI1OTMpICovCisgICAgICBvdXRiKE9QMF9SRVNFVCwgTENDUihiYXNlKSk7CisgICAgICBtZGVsYXkoMSk7CS8qIEEgYml0IGNydWRlICEgKi8KKworICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgTEFOIGNvbnRyb2xsZXIgKi8KKyAgICAgIGlmKHd2XzgyNTkzX2NvbmZpZyhkZXYpID09IEZBTFNFKQorCXsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1JTCisJICBwcmludGsoS0VSTl9JTkZPICIlczogd3ZfaHdfY29uZmlnKCk6IGk4MjU5MyBpbml0IGZhaWxlZFxuIiwKKwkJIGRldi0+bmFtZSk7CisjZW5kaWYKKwkgIGJyZWFrOworCX0KKworICAgICAgLyogRGlhZ25vc3RpYyAqLworICAgICAgaWYod3ZfZGlhZyhkZXYpID09IEZBTFNFKQorCXsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1JTCisJICBwcmludGsoS0VSTl9JTkZPICIlczogd3ZfaHdfY29uZmlnKCk6IGk4MjU5MyBkaWFnbm9zdGljIGZhaWxlZFxuIiwKKwkJIGRldi0+bmFtZSk7CisjZW5kaWYKKwkgIGJyZWFrOworCX0KKworICAgICAgLyogCisgICAgICAgKiBpbnNlcnQgY29kZSBmb3IgbG9vcGJhY2sgdGVzdCBoZXJlCisgICAgICAgKi8KKworICAgICAgLyogVGhlIGRldmljZSBpcyBub3cgY29uZmlndXJlZCAqLworICAgICAgbHAtPmNvbmZpZ3VyZWQgPSAxOworICAgICAgcmV0ID0gVFJVRTsKKyAgICB9CisgIHdoaWxlKDApOworCisgIC8qIFJlLWVuYWJsZSBpbnRlcnJ1cHRzICovCisgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxwLT5zcGlubG9jaywgZmxhZ3MpOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogPC13dl9od19jb25maWcoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4ocmV0KTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRvdGFsbHkgcmVzZXQgdGhlIHdhdmVsYW4gYW5kIHJlc3RhcnQgaXQuCisgKiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIGFjdGlvbnM6CisgKiAJMS4gQ2FsbCB3dl9od19jb25maWcoKQorICoJMi4gU3RhcnQgdGhlIExBTiBjb250cm9sbGVyJ3MgcmVjZWl2ZSB1bml0CisgKiAoY2FsbGVkIGJ5IHdhdmVsYW5fZXZlbnQoKSwgd2F2ZWxhbl93YXRjaGRvZygpIGFuZCB3YXZlbGFuX29wZW4oKSkKKyAqLworc3RhdGljIGlubGluZSB2b2lkCit3dl9od19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAgbmV0X2xvY2FsICoJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53dl9od19yZXNldCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKyAgbHAtPm5yZXNldHMrKzsKKyAgbHAtPmNvbmZpZ3VyZWQgPSAwOworICAKKyAgLyogQ2FsbCB3dl9od19jb25maWcoKSBmb3IgbW9zdCBvZiB0aGUgcmVzZXQgJiBpbml0IHN0dWZmICovCisgIGlmKHd2X2h3X2NvbmZpZyhkZXYpID09IEZBTFNFKQorICAgIHJldHVybjsKKworICAvKiBzdGFydCByZWNlaXZlIHVuaXQgKi8KKyAgd3ZfcnVfc3RhcnQoZGV2KTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd3ZfaHdfcmVzZXQoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogd3ZfcGNtY2lhX2NvbmZpZygpIGlzIGNhbGxlZCBhZnRlciBhIENBUkRfSU5TRVJUSU9OIGV2ZW50IGlzCisgKiByZWNlaXZlZCwgdG8gY29uZmlndXJlIHRoZSBQQ01DSUEgc29ja2V0LCBhbmQgdG8gbWFrZSB0aGUgZXRoZXJuZXQKKyAqIGRldmljZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbS4KKyAqIChjYWxsZWQgYnkgd2F2ZWxhbl9ldmVudCgpKQorICovCitzdGF0aWMgaW5saW5lIGludAord3ZfcGNtY2lhX2NvbmZpZyhkZXZfbGlua190ICoJbGluaykKK3sKKyAgY2xpZW50X2hhbmRsZV90CWhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKyAgdHVwbGVfdAkJdHVwbGU7CisgIGNpc3BhcnNlX3QJCXBhcnNlOworICBzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBsaW5rLT5wcml2OworICBpbnQJCQlpOworICB1X2NoYXIJCWJ1Zls2NF07CisgIHdpbl9yZXFfdAkJcmVxOworICBtZW1yZXFfdAkJbWVtOworICBuZXRfbG9jYWwgKgkJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIi0+d3ZfcGNtY2lhX2NvbmZpZygweCVwKVxuIiwgbGluayk7CisjZW5kaWYKKworICAvKgorICAgKiBUaGlzIHJlYWRzIHRoZSBjYXJkJ3MgQ09ORklHIHR1cGxlIHRvIGZpbmQgaXRzIGNvbmZpZ3VyYXRpb24KKyAgICogcmVnaXN0ZXJzLgorICAgKi8KKyAgZG8KKyAgICB7CisgICAgICB0dXBsZS5BdHRyaWJ1dGVzID0gMDsKKyAgICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7CisgICAgICBpID0gcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSk7CisgICAgICBpZihpICE9IENTX1NVQ0NFU1MpCisJYnJlYWs7CisgICAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOworICAgICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gNjQ7CisgICAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgICBpID0gcGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKTsKKyAgICAgIGlmKGkgIT0gQ1NfU1VDQ0VTUykKKwlicmVhazsKKyAgICAgIGkgPSBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSk7CisgICAgICBpZihpICE9IENTX1NVQ0NFU1MpCisJYnJlYWs7CisgICAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKKyAgICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKyAgICB9CisgIHdoaWxlKDApOworICBpZihpICE9IENTX1NVQ0NFU1MpCisgICAgeworICAgICAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBQYXJzZVR1cGxlLCBpKTsKKyAgICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIAorICAvKiBDb25maWd1cmUgY2FyZCAqLworICBsaW5rLT5zdGF0ZSB8PSBERVZfQ09ORklHOworICBkbworICAgIHsKKyAgICAgIGkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CisgICAgICBpZihpICE9IENTX1NVQ0NFU1MpCisJeworCSAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0SU8sIGkpOworCSAgYnJlYWs7CisJfQorCisgICAgICAvKgorICAgICAgICogTm93IGFsbG9jYXRlIGFuIGludGVycnVwdCBsaW5lLiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QKKyAgICAgICAqIGFjdHVhbGx5IGFzc2lnbiBhIGhhbmRsZXIgdG8gdGhlIGludGVycnVwdC4KKyAgICAgICAqLworICAgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpOworICAgICAgaWYoaSAhPSBDU19TVUNDRVNTKQorCXsKKwkgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVxdWVzdElSUSwgaSk7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qCisgICAgICAgKiBUaGlzIGFjdHVhbGx5IGNvbmZpZ3VyZXMgdGhlIFBDTUNJQSBzb2NrZXQgLS0gc2V0dGluZyB1cAorICAgICAgICogdGhlIEkvTyB3aW5kb3dzIGFuZCB0aGUgaW50ZXJydXB0IG1hcHBpbmcuCisgICAgICAgKi8KKyAgICAgIGxpbmstPmNvbmYuQ29uZmlnSW5kZXggPSAxOworICAgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisgICAgICBpZihpICE9IENTX1NVQ0NFU1MpCisJeworCSAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0Q29uZmlndXJhdGlvbiwgaSk7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qCisgICAgICAgKiBBbGxvY2F0ZSBhIHNtYWxsIG1lbW9yeSB3aW5kb3cuICBOb3RlIHRoYXQgdGhlIGRldl9saW5rX3QKKyAgICAgICAqIHN0cnVjdHVyZSBwcm92aWRlcyBzcGFjZSBmb3Igb25lIHdpbmRvdyBoYW5kbGUgLS0gaWYgeW91cgorICAgICAgICogZGV2aWNlIG5lZWRzIHNldmVyYWwgd2luZG93cywgeW91J2xsIG5lZWQgdG8ga2VlcCB0cmFjayBvZgorICAgICAgICogdGhlIGhhbmRsZXMgaW4geW91ciBwcml2YXRlIGRhdGEgc3RydWN0dXJlLCBsaW5rLT5wcml2LgorICAgICAgICovCisgICAgICByZXEuQXR0cmlidXRlcyA9IFdJTl9EQVRBX1dJRFRIXzh8V0lOX01FTU9SWV9UWVBFX0FNfFdJTl9FTkFCTEU7CisgICAgICByZXEuQmFzZSA9IHJlcS5TaXplID0gMDsKKyAgICAgIHJlcS5BY2Nlc3NTcGVlZCA9IG1lbV9zcGVlZDsKKyAgICAgIGkgPSBwY21jaWFfcmVxdWVzdF93aW5kb3coJmxpbmstPmhhbmRsZSwgJnJlcSwgJmxpbmstPndpbik7CisgICAgICBpZihpICE9IENTX1NVQ0NFU1MpCisJeworCSAgY3NfZXJyb3IobGluay0+aGFuZGxlLCBSZXF1ZXN0V2luZG93LCBpKTsKKwkgIGJyZWFrOworCX0KKworICAgICAgbHAtPm1lbSA9IGlvcmVtYXAocmVxLkJhc2UsIHJlcS5TaXplKTsKKyAgICAgIGRldi0+bWVtX3N0YXJ0ID0gKHVfbG9uZylscC0+bWVtOworICAgICAgZGV2LT5tZW1fZW5kID0gZGV2LT5tZW1fc3RhcnQgKyByZXEuU2l6ZTsKKworICAgICAgbWVtLkNhcmRPZmZzZXQgPSAwOyBtZW0uUGFnZSA9IDA7CisgICAgICBpID0gcGNtY2lhX21hcF9tZW1fcGFnZShsaW5rLT53aW4sICZtZW0pOworICAgICAgaWYoaSAhPSBDU19TVUNDRVNTKQorCXsKKwkgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgTWFwTWVtUGFnZSwgaSk7CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qIEZlZWQgZGV2aWNlIHdpdGggdGhpcyBpbmZvLi4uICovCisgICAgICBkZXYtPmlycSA9IGxpbmstPmlycS5Bc3NpZ25lZElSUTsKKyAgICAgIGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOworICAgICAgbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19JTkZPCisgICAgICBwcmludGsoS0VSTl9ERUJVRyAid3ZfcGNtY2lhX2NvbmZpZzogTUVNU1RBUlQgJXAgSVJRICVkIElPUE9SVCAweCV4XG4iLAorCSAgICAgbHAtPm1lbSwgZGV2LT5pcnEsICh1X2ludCkgZGV2LT5iYXNlX2FkZHIpOworI2VuZGlmCisKKyAgICAgIFNFVF9ORVRERVZfREVWKGRldiwgJmhhbmRsZV90b19kZXYoaGFuZGxlKSk7CisgICAgICBpID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisgICAgICBpZihpICE9IDApCisJeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUlMKKwkgIHByaW50ayhLRVJOX0lORk8gInd2X3BjbWNpYV9jb25maWcoKTogcmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKKyNlbmRpZgorCSAgYnJlYWs7CisJfQorICAgIH0KKyAgd2hpbGUoMCk7CQkvKiBIdW1tLi4uIERpc2d1aXNlZCBnb3RvICEhISAqLworCisgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgIC8qIElmIGFueSBzdGVwIGZhaWxlZCwgcmVsZWFzZSBhbnkgcGFydGlhbGx5IGNvbmZpZ3VyZWQgc3RhdGUgKi8KKyAgaWYoaSAhPSAwKQorICAgIHsKKyAgICAgIHd2X3BjbWNpYV9yZWxlYXNlKGxpbmspOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBzdHJjcHkoKChuZXRfbG9jYWwgKikgbmV0ZGV2X3ByaXYoZGV2KSktPm5vZGUuZGV2X25hbWUsIGRldi0+bmFtZSk7CisgIGxpbmstPmRldiA9ICYoKG5ldF9sb2NhbCAqKSBuZXRkZXZfcHJpdihkZXYpKS0+bm9kZTsKKworI2lmZGVmIERFQlVHX0NPTkZJR19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiPC13dl9wY21jaWFfY29uZmlnKClcbiIpOworI2VuZGlmCisgIHJldHVybiBUUlVFOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIHd2X3BjbWNpYV9yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZSBuZXQKKyAqIGRldmljZSwgYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcworICogc3RpbGwgb3BlbiwgdGhpcyB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCisgKi8KK3N0YXRpYyB2b2lkCit3dl9wY21jaWFfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQoreworICBzdHJ1Y3QgbmV0X2RldmljZSAqCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBsaW5rLT5wcml2OworICBuZXRfbG9jYWwgKgkJbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisjaWZkZWYgREVCVUdfQ09ORklHX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT4gd3ZfcGNtY2lhX3JlbGVhc2UoMHglcClcbiIsIGRldi0+bmFtZSwgbGluayk7CisjZW5kaWYKKworICAvKiBEb24ndCBib3RoZXIgY2hlY2tpbmcgdG8gc2VlIGlmIHRoZXNlIHN1Y2NlZWQgb3Igbm90ICovCisgIGlvdW5tYXAobHAtPm1lbSk7CisgIHBjbWNpYV9yZWxlYXNlX3dpbmRvdyhsaW5rLT53aW4pOworICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisgIHBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKyAgcGNtY2lhX3JlbGVhc2VfaXJxKGxpbmstPmhhbmRsZSwgJmxpbmstPmlycSk7CisKKyAgbGluay0+c3RhdGUgJj0gfkRFVl9DT05GSUc7CisKKyNpZmRlZiBERUJVR19DT05GSUdfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LSB3dl9wY21jaWFfcmVsZWFzZSgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogSU5URVJSVVBUIEhBTkRMSU5HICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgV2F2ZUxBTiBjYXJkLiBUaGlzCisgKiByb3V0aW5lIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyOiAKKyAqCTEuIEEgcGFja2V0IGlzIHJlY2VpdmVkLgorICoJMi4gQSBwYWNrZXQgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHRyYW5zZmVycmVkIGFuZCB0aGUgdW5pdCBpcworICoJICAgcmVhZHkgdG8gdHJhbnNtaXQgYW5vdGhlciBwYWNrZXQuCisgKgkzLiBBIGNvbW1hbmQgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24uCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAord2F2ZWxhbl9pbnRlcnJ1cHQoaW50CQlpcnEsCisJCSAgdm9pZCAqCWRldl9pZCwKKwkJICBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisgIHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2OworICBuZXRfbG9jYWwgKglscDsKKyAga2lvX2FkZHJfdAliYXNlOworICBpbnQJCXN0YXR1czA7CisgIHVfaW50CQl0eF9zdGF0dXM7CisKKyAgaWYgKChkZXYgPSBkZXZfaWQpID09IE5VTEwpCisgICAgeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAid2F2ZWxhbl9pbnRlcnJ1cHQoKTogaXJxICVkIGZvciB1bmtub3duIGRldmljZS5cbiIsCisJICAgICBpcnEpOworI2VuZGlmCisgICAgICByZXR1cm4gSVJRX05PTkU7CisgICAgfQorCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX2ludGVycnVwdCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKyAgbHAgPSBuZXRkZXZfcHJpdihkZXYpOworICBiYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTworICAvKiBDaGVjayBzdGF0ZSBvZiBvdXIgc3BpbmxvY2sgKGl0IHNob3VsZCBiZSBjbGVhcmVkKSAqLworICBpZihzcGluX2lzX2xvY2tlZCgmbHAtPnNwaW5sb2NrKSkKKyAgICBwcmludGsoS0VSTl9ERUJVRworCSAgICIlczogd2F2ZWxhbl9pbnRlcnJ1cHQoKTogc3BpbmxvY2sgaXMgYWxyZWFkeSBsb2NrZWQgISEhXG4iLAorCSAgIGRldi0+bmFtZSk7CisjZW5kaWYKKworICAvKiBQcmV2ZW50IHJlZW50cmFuY3kuIFdlIG5lZWQgdG8gZG8gdGhhdCBiZWNhdXNlIHdlIG1heSBoYXZlCisgICAqIG11bHRpcGxlIGludGVycnVwdCBoYW5kbGVyIHJ1bm5pbmcgY29uY3VyZW50bHkuCisgICAqIEl0IGlzIHNhZmUgYmVjYXVzZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBiZWZvcmUgYXF1aXJpbmcKKyAgICogdGhlIHNwaW5sb2NrLiAqLworICBzcGluX2xvY2soJmxwLT5zcGlubG9jayk7CisKKyAgLyogVHJlYXQgYWxsIHBlbmRpbmcgaW50ZXJydXB0cyAqLworICB3aGlsZSgxKQorICAgIHsKKyAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gSU5URVJSVVBUIENIRUNLSU5HIC0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgIC8qCisgICAgICAgKiBMb29rIGZvciB0aGUgaW50ZXJydXB0IGFuZCB2ZXJpZnkgdGhlIHZhbGlkaXR5CisgICAgICAgKi8KKyAgICAgIG91dGIoQ1IwX1NUQVRVU18wIHwgT1AwX05PUCwgTENDUihiYXNlKSk7CisgICAgICBzdGF0dXMwID0gaW5iKExDU1IoYmFzZSkpOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0lORk8KKyAgICAgIHByaW50ayhLRVJOX0RFQlVHICJzdGF0dXMwIDB4JXggWyVzID0+IDB4JXhdIiwgc3RhdHVzMCwgCisJICAgICAoc3RhdHVzMCZTUjBfSU5URVJSVVBUKT8iaW50Ijoibm8gaW50IixzdGF0dXMwJn5TUjBfSU5URVJSVVBUKTsKKyAgICAgIGlmKHN0YXR1czAmU1IwX0lOVEVSUlVQVCkKKwl7CisJICBwcmludGsoIiBbJXMgPT4gJWRdXG4iLCAoc3RhdHVzMCAmIFNSMF9DSE5MKSA/ICJjaG5sIiA6CisJCSAoKHN0YXR1czAgJiBTUjBfRVhFQ1VUSU9OKSA/ICJjbWQiIDoKKwkJICAoKHN0YXR1czAgJiBTUjBfUkVDRVBUSU9OKSA/ICJyZWN2IiA6ICJ1bmtub3duIikpLAorCQkgKHN0YXR1czAgJiBTUjBfRVZFTlRfTUFTSykpOworCX0KKyAgICAgIGVsc2UKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKworICAgICAgLyogUmV0dXJuIGlmIG5vIGFjdHVhbCBpbnRlcnJ1cHQgZnJvbSBpODI1OTMgKG5vcm1hbCBleGl0KSAqLworICAgICAgaWYoIShzdGF0dXMwICYgU1IwX0lOVEVSUlVQVCkpCisJYnJlYWs7CisKKyAgICAgIC8qIElmIGludGVycnVwdCBpcyBib3RoIFJ4IGFuZCBUeCBvciBub25lLi4uCisgICAgICAgKiBUaGlzIGNvZGUgaW4gZmFjdCBpcyB0aGVyZSB0byBjYXRjaCB0aGUgc3B1cmlvdXMgaW50ZXJydXB0CisgICAgICAgKiB3aGVuIHlvdSByZW1vdmUgdGhlIHdhdmVsYW4gcGNtY2lhIGNhcmQgZnJvbSB0aGUgc29ja2V0ICovCisgICAgICBpZigoKHN0YXR1czAgJiBTUjBfQk9USF9SWF9UWCkgPT0gU1IwX0JPVEhfUlhfVFgpIHx8CisJICgoc3RhdHVzMCAmIFNSMF9CT1RIX1JYX1RYKSA9PSAweDApKQorCXsKKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTworCSAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHd2X2ludGVycnVwdCgpOiBib2d1cyBpbnRlcnJ1cHQgKG9yIGZyb20gZGVhZCBjYXJkKSA6ICVYXG4iLAorCQkgZGV2LT5uYW1lLCBzdGF0dXMwKTsKKyNlbmRpZgorCSAgLyogQWNrbm93bGVkZ2UgdGhlIGludGVycnVwdCAqLworCSAgb3V0YihDUjBfSU5UX0FDSyB8IE9QMF9OT1AsIExDQ1IoYmFzZSkpOworCSAgYnJlYWs7CisJfQorCisgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLSBSRUNFSVZJTkcgUEFDS0VUIC0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAvKgorICAgICAgICogV2hlbiB0aGUgd2F2ZWxhbiBzaWduYWwgdGhlIHJlY2VwdGlvbiBvZiBhIG5ldyBwYWNrZXQsCisgICAgICAgKiB3ZSBjYWxsIHd2X3BhY2tldF9yY3YoKSB0byBjb3B5IGlmIGZyb20gdGhlIGJ1ZmZlciBhbmQKKyAgICAgICAqIHNlbmQgaXQgdG8gTkVUMworICAgICAgICovCisgICAgICBpZihzdGF0dXMwICYgU1IwX1JFQ0VQVElPTikKKwl7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0lORk8KKwkgIHByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfaW50ZXJydXB0KCk6IHJlY2VpdmVcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworCSAgaWYoKHN0YXR1czAgJiBTUjBfRVZFTlRfTUFTSykgPT0gU1IwX1NUT1BfUkVHX0hJVCkKKwkgICAgeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorCSAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiB3dl9pbnRlcnJ1cHQoKTogcmVjZWl2ZSBidWZmZXIgb3ZlcmZsb3dcbiIsCisJCSAgICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCSAgICAgIGxwLT5zdGF0cy5yeF9vdmVyX2Vycm9ycysrOworCSAgICAgIGxwLT5vdmVycnVubmluZyA9IDE7CisgICAgICAJICAgIH0KKworCSAgLyogR2V0IHRoZSBwYWNrZXQgKi8KKwkgIHd2X3BhY2tldF9yY3YoZGV2KTsKKwkgIGxwLT5vdmVycnVubmluZyA9IDA7CisKKwkgIC8qIEFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHQgKi8KKwkgIG91dGIoQ1IwX0lOVF9BQ0sgfCBPUDBfTk9QLCBMQ0NSKGJhc2UpKTsKKwkgIGNvbnRpbnVlOworICAgIAl9CisKKyAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gQ09NTUFORCBDT01QTEVUSU9OIC0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgIC8qCisgICAgICAgKiBJbnRlcnJ1cHRzIGlzc3VlZCB3aGVuIHRoZSBpODI1OTMgaGFzIGNvbXBsZXRlZCBhIGNvbW1hbmQuCisgICAgICAgKiBNb3N0IGxpa2VseSA6IHRyYW5zbWlzc2lvbiBkb25lCisgICAgICAgKi8KKworICAgICAgLyogSWYgYSB0cmFuc21pc3Npb24gaGFzIGJlZW4gZG9uZSAqLworICAgICAgaWYoKHN0YXR1czAgJiBTUjBfRVZFTlRfTUFTSykgPT0gU1IwX1RSQU5TTUlUX0RPTkUgfHwKKwkgKHN0YXR1czAgJiBTUjBfRVZFTlRfTUFTSykgPT0gU1IwX1JFVFJBTlNNSVRfRE9ORSB8fAorCSAoc3RhdHVzMCAmIFNSMF9FVkVOVF9NQVNLKSA9PSBTUjBfVFJBTlNNSVRfTk9fQ1JDX0RPTkUpCisJeworI2lmZGVmIERFQlVHX1RYX0VSUk9SCisJICBpZigoc3RhdHVzMCAmIFNSMF9FVkVOVF9NQVNLKSA9PSBTUjBfVFJBTlNNSVRfTk9fQ1JDX0RPTkUpCisJICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiB3dl9pbnRlcnJ1cHQoKTogcGFja2V0IHRyYW5zbWl0dGVkIHdpdGhvdXQgQ1JDLlxuIiwKKwkJICAgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisJICAvKiBHZXQgdHJhbnNtaXNzaW9uIHN0YXR1cyAqLworCSAgdHhfc3RhdHVzID0gaW5iKExDU1IoYmFzZSkpOworCSAgdHhfc3RhdHVzIHw9IChpbmIoTENTUihiYXNlKSkgPDwgOCk7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUX0lORk8KKwkgIHByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfaW50ZXJydXB0KCk6IHRyYW5zbWlzc2lvbiBkb25lXG4iLAorCQkgZGV2LT5uYW1lKTsKKwkgIHsKKwkgICAgdV9pbnQJcmN2X2J5dGVzOworCSAgICB1X2NoYXIJc3RhdHVzMzsKKwkgICAgcmN2X2J5dGVzID0gaW5iKExDU1IoYmFzZSkpOworCSAgICByY3ZfYnl0ZXMgfD0gKGluYihMQ1NSKGJhc2UpKSA8PCA4KTsKKwkgICAgc3RhdHVzMyA9IGluYihMQ1NSKGJhc2UpKTsKKwkgICAgcHJpbnRrKEtFUk5fREVCVUcgInR4X3N0YXR1cyAweCUwMnggcmN2X2J5dGVzIDB4JTAyeCBzdGF0dXMzIDB4JXhcbiIsCisJCSAgIHR4X3N0YXR1cywgcmN2X2J5dGVzLCAodV9pbnQpIHN0YXR1czMpOworCSAgfQorI2VuZGlmCisJICAvKiBDaGVjayBmb3IgcG9zc2libGUgZXJyb3JzICovCisJICBpZigodHhfc3RhdHVzICYgVFhfT0spICE9IFRYX09LKQorCSAgICB7CisJICAgICAgbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCisJICAgICAgaWYodHhfc3RhdHVzICYgVFhfRlJUTCkKKwkJeworI2lmZGVmIERFQlVHX1RYX0VSUk9SCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHd2X2ludGVycnVwdCgpOiBmcmFtZSB0b28gbG9uZ1xuIiwKKwkJCSBkZXYtPm5hbWUpOworI2VuZGlmCisJCX0KKwkgICAgICBpZih0eF9zdGF0dXMgJiBUWF9VTkRfUlVOKQorCQl7CisjaWZkZWYgREVCVUdfVFhfRkFJTAorCQkgIHByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfaW50ZXJydXB0KCk6IERNQSB1bmRlcnJ1blxuIiwKKwkJCSBkZXYtPm5hbWUpOworI2VuZGlmCisJCSAgbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJCX0KKwkgICAgICBpZih0eF9zdGF0dXMgJiBUWF9MT1NUX0NUUykKKwkJeworI2lmZGVmIERFQlVHX1RYX0ZBSUwKKwkJICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHd2X2ludGVycnVwdCgpOiBubyBDVFNcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJICBscC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJfQorCSAgICAgIGlmKHR4X3N0YXR1cyAmIFRYX0xPU1RfQ1JTKQorCQl7CisjaWZkZWYgREVCVUdfVFhfRkFJTAorCQkgIHByaW50ayhLRVJOX0RFQlVHICIlczogd3ZfaW50ZXJydXB0KCk6IG5vIGNhcnJpZXJcbiIsCisJCQkgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkgIGxwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQl9CisJICAgICAgaWYodHhfc3RhdHVzICYgVFhfSFJUX0JFQVQpCisJCXsKKyNpZmRlZiBERUJVR19UWF9GQUlMCisJCSAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB3dl9pbnRlcnJ1cHQoKTogaGVhcnQgYmVhdFxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorCQkgIGxwLT5zdGF0cy50eF9oZWFydGJlYXRfZXJyb3JzKys7CisJCX0KKwkgICAgICBpZih0eF9zdGF0dXMgJiBUWF9ERUZFUikKKwkJeworI2lmZGVmIERFQlVHX1RYX0ZBSUwKKwkJICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHd2X2ludGVycnVwdCgpOiBjaGFubmVsIGphbW1lZFxuIiwKKwkJCSBkZXYtPm5hbWUpOworI2VuZGlmCisJCX0KKwkgICAgICAvKiBJZ25vcmUgbGF0ZSBjb2xsaXNpb25zIHNpbmNlIHRoZXkncmUgbW9yZSBsaWtlbHkgdG8gaGFwcGVuCisJICAgICAgICogaGVyZSAodGhlIFdhdmVMQU4gZGVzaWduIHByZXZlbnRzIHRoZSBMQU4gY29udHJvbGxlciBmcm9tCisJICAgICAgICogcmVjZWl2aW5nIHdoaWxlIGl0IGlzIHRyYW5zbWl0dGluZykuIFdlIHRha2UgYWN0aW9uIG9ubHkgd2hlbgorCSAgICAgICAqIHRoZSBtYXhpbXVtIHJldHJhbnNtaXQgYXR0ZW1wdHMgaXMgZXhjZWVkZWQuCisJICAgICAgICovCisJICAgICAgaWYodHhfc3RhdHVzICYgVFhfQ09MTCkKKwkJeworCQkgIGlmKHR4X3N0YXR1cyAmIFRYX01BWF9DT0wpCisJCSAgICB7CisjaWZkZWYgREVCVUdfVFhfRkFJTAorCQkgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IHd2X2ludGVycnVwdCgpOiBjaGFubmVsIGNvbmdlc3Rpb25cbiIsCisJCQkgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKwkJICAgICAgaWYoISh0eF9zdGF0dXMgJiBUWF9OQ09MX01BU0spKQorCQkJeworCQkJICBscC0+c3RhdHMuY29sbGlzaW9ucyArPSAweDEwOworCQkJfQorCQkgICAgfQorCQl9CisJICAgIH0JLyogaWYoISh0eF9zdGF0dXMgJiBUWF9PSykpICovCisKKwkgIGxwLT5zdGF0cy5jb2xsaXNpb25zICs9ICh0eF9zdGF0dXMgJiBUWF9OQ09MX01BU0spOworCSAgbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKworCSAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCSAgb3V0YihDUjBfSU5UX0FDSyB8IE9QMF9OT1AsIExDQ1IoYmFzZSkpOwkvKiBBY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0ICovCisgICAgCX0gCisgICAgICBlbHNlCS8qIGlmIGludGVycnVwdCA9IHRyYW5zbWl0IGRvbmUgb3IgcmV0cmFuc21pdCBkb25lICovCisJeworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorCSAgcHJpbnRrKEtFUk5fSU5GTyAid2F2ZWxhbl9jczogdW5rbm93biBpbnRlcnJ1cHQsIHN0YXR1czAgPSAlMDJ4XG4iLAorCQkgc3RhdHVzMCk7CisjZW5kaWYKKwkgIG91dGIoQ1IwX0lOVF9BQ0sgfCBPUDBfTk9QLCBMQ0NSKGJhc2UpKTsJLyogQWNrbm93bGVkZ2UgdGhlIGludGVycnVwdCAqLworICAgIAl9CisgICAgfQkvKiB3aGlsZSgxKSAqLworCisgIHNwaW5fdW5sb2NrKCZscC0+c3BpbmxvY2spOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX2ludGVycnVwdCgpXG4iLCBkZXYtPm5hbWUpOworI2VuZGlmCisKKyAgLyogV2UgYWx3YXlzIHJldHVybiBJUlFfSEFORExFRCwgYmVjYXVzZSB3ZSB3aWxsIHJlY2VpdmUgZW1wdHkKKyAgICogaW50ZXJydXB0cyB1bmRlciBub3JtYWwgb3BlcmF0aW9ucy4gQW55d2F5LCBpdCBkb2Vzbid0IG1hdHRlcgorICAgKiBhcyB3ZSBhcmUgZGVhbGluZyB3aXRoIGFuIElTQSBpbnRlcnJ1cHQgdGhhdCBjYW4ndCBiZSBzaGFyZWQuCisgICAqCisgICAqIEV4cGxhbmF0aW9uIDogdW5kZXIgaGVhdnkgcmVjZWl2ZSwgdGhlIGZvbGxvd2luZyBoYXBwZW5zIDoKKyAgICogLT53YXZlbGFuX2ludGVycnVwdCgpCisgICAqICAgIChzdGF0dXMwICYgU1IwX0lOVEVSUlVQVCkgIT0gMAorICAgKiAgICAgICAtPnd2X3BhY2tldF9yY3YoKQorICAgKiAgICAoc3RhdHVzMCAmIFNSMF9JTlRFUlJVUFQpICE9IDAKKyAgICogICAgICAgLT53dl9wYWNrZXRfcmN2KCkKKyAgICogICAgKHN0YXR1czAgJiBTUjBfSU5URVJSVVBUKSA9PSAwCS8vIGkuZS4gbm8gbW9yZSBldmVudAorICAgKiA8LXdhdmVsYW5faW50ZXJydXB0KCkKKyAgICogLT53YXZlbGFuX2ludGVycnVwdCgpCisgICAqICAgIChzdGF0dXMwICYgU1IwX0lOVEVSUlVQVCkgPT0gMAkvLyBpLmUuIGVtcHR5IGludGVycnVwdAorICAgKiA8LXdhdmVsYW5faW50ZXJydXB0KCkKKyAgICogSmVhbiBJSSAqLworICByZXR1cm4gSVJRX0hBTkRMRUQ7Cit9IC8qIHd2X2ludGVycnVwdCAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogV2F0Y2hkb2c6IHdoZW4gd2Ugc3RhcnQgYSB0cmFuc21pc3Npb24sIGEgdGltZXIgaXMgc2V0IGZvciB1cyBpbiB0aGUKKyAqIGtlcm5lbC4gIElmIHRoZSB0cmFuc21pc3Npb24gY29tcGxldGVzLCB0aGlzIHRpbWVyIGlzIGRpc2FibGVkLiBJZgorICogdGhlIHRpbWVyIGV4cGlyZXMsIHdlIGFyZSBjYWxsZWQgYW5kIHdlIHRyeSB0byB1bmxvY2sgdGhlIGhhcmR3YXJlLgorICoKKyAqIE5vdGUgOiBUaGlzIHdhdGNoZG9nIGlzIG1vdmUgY2xldmVyIHRoYW4gdGhlIG9uZSBpbiB0aGUgSVNBIGRyaXZlciwKKyAqIGJlY2F1c2UgaXQgdHJ5IHRvIGFib3J0IHRoZSBjdXJyZW50IGNvbW1hbmQgYmVmb3JlIHJlc2V0aW5nCisgKiBldmVyeXRoaW5nLi4uCisgKiBPbiB0aGUgb3RoZXIgaGFuZCwgaXQncyBhIGJpdCBzaW1wbGVyLCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdG8KKyAqIGRlYWwgd2l0aCB0aGUgbXVsdGlwbGUgVHggYnVmZmVycy4uLgorICovCitzdGF0aWMgdm9pZAord2F2ZWxhbl93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqCWRldikKK3sKKyAgbmV0X2xvY2FsICoJCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAga2lvX2FkZHJfdAkJYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICB1bnNpZ25lZCBsb25nCQlmbGFnczsKKyAgaW50CQkJYWJvcnRlZCA9IEZBTFNFOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogLT53YXZlbGFuX3dhdGNoZG9nKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0lOVEVSUlVQVF9FUlJPUgorICBwcmludGsoS0VSTl9JTkZPICIlczogd2F2ZWxhbl93YXRjaGRvZzogd2F0Y2hkb2cgdGltZXIgZXhwaXJlZFxuIiwKKwkgZGV2LT5uYW1lKTsKKyNlbmRpZgorCisgIHNwaW5fbG9ja19pcnFzYXZlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworICAvKiBBc2sgdG8gYWJvcnQgdGhlIGN1cnJlbnQgY29tbWFuZCAqLworICBvdXRiKE9QMF9BQk9SVCwgTENDUihiYXNlKSk7CisKKyAgLyogV2FpdCBmb3IgdGhlIGVuZCBvZiB0aGUgY29tbWFuZCAoYSBiaXQgaGFja2lzaCkgKi8KKyAgaWYod3ZfODI1OTNfY21kKGRldiwgIndhdmVsYW5fd2F0Y2hkb2coKTogYWJvcnQiLAorCQkgIE9QMF9OT1AgfCBDUjBfU1RBVFVTXzMsIFNSMF9FWEVDVVRJT05fQUJPUlRFRCkpCisgICAgYWJvcnRlZCA9IFRSVUU7CisKKyAgLyogUmVsZWFzZSBzcGlubG9jayBoZXJlIHNvIHRoYXQgd3ZfaHdfcmVzZXQoKSBjYW4gZ3JhYiBpdCAqLworICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+c3BpbmxvY2ssIGZsYWdzKTsKKworICAvKiBDaGVjayBpZiB3ZSB3ZXJlIHN1Y2Nlc3NmdWwgaW4gYWJvcnRpbmcgaXQgKi8KKyAgaWYoIWFib3J0ZWQpCisgICAgeworICAgICAgLyogSXQgc2VlbSB0aGF0IGl0IHdhc24ndCBlbm91Z2ggKi8KKyNpZmRlZiBERUJVR19JTlRFUlJVUFRfRVJST1IKKyAgICAgIHByaW50ayhLRVJOX0lORk8gIiVzOiB3YXZlbGFuX3dhdGNoZG9nOiBhYm9ydCBmYWlsZWQsIHRyeWluZyByZXNldFxuIiwKKwkgICAgIGRldi0+bmFtZSk7CisjZW5kaWYKKyAgICAgIHd2X2h3X3Jlc2V0KGRldik7CisgICAgfQorCisjaWZkZWYgREVCVUdfUFNBX1NIT1cKKyAgeworICAgIHBzYV90CQlwc2E7CisgICAgcHNhX3JlYWQoZGV2LCAwLCAodW5zaWduZWQgY2hhciAqKSAmcHNhLCBzaXplb2YocHNhKSk7CisgICAgd3ZfcHNhX3Nob3coJnBzYSk7CisgIH0KKyNlbmRpZgorI2lmZGVmIERFQlVHX01NQ19TSE9XCisgIHd2X21tY19zaG93KGRldik7CisjZW5kaWYKKyNpZmRlZiBERUJVR19JODI1OTNfU0hPVworICB3dl9ydV9zaG93KGRldik7CisjZW5kaWYKKworICAvKiBXZSBhcmUgbm8gbW9yZSB3YWl0aW5nIGZvciBzb21ldGhpbmcuLi4gKi8KKyAgbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCisjaWZkZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICIlczogPC13YXZlbGFuX3dhdGNoZG9nKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioqKiBDT05GSUdVUkFUSU9OIENBTExCQUNLUyAqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogSGVyZSBhcmUgdGhlIGZ1bmN0aW9ucyBjYWxsZWQgYnkgdGhlIHBjbWNpYSBwYWNrYWdlIChjYXJkbWdyKSBhbmQKKyAqIGxpbnV4IG5ldHdvcmtpbmcgKE5FVDMpIGZvciBpbml0aWFsaXphdGlvbiwgY29uZmlndXJhdGlvbiBhbmQKKyAqIGRlaW5zdGFsbGF0aW9ucyBvZiB0aGUgV2F2ZWxhbiBQY21jaWEgSGFyZHdhcmUuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIENvbmZpZ3VyZSBhbmQgc3RhcnQgdXAgdGhlIFdhdmVMQU4gUENNQ0lBIGFkYXB0b3IuCisgKiBDYWxsZWQgYnkgTkVUMyB3aGVuIGl0ICJvcGVuIiB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgaW50Cit3YXZlbGFuX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKglkZXYpCit7CisgIG5ldF9sb2NhbCAqCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgZGV2X2xpbmtfdCAqCWxpbmsgPSBscC0+bGluazsKKyAga2lvX2FkZHJfdAliYXNlID0gZGV2LT5iYXNlX2FkZHI7CisKKyNpZmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IC0+d2F2ZWxhbl9vcGVuKGRldj0weCV4KVxuIiwgZGV2LT5uYW1lLAorCSAodW5zaWduZWQgaW50KSBkZXYpOworI2VuZGlmCisKKyAgLyogQ2hlY2sgaWYgdGhlIG1vZGVtIGlzIHBvd2VyZWQgdXAgKHdhdmVsYW5fY2xvc2UoKSBwb3dlciBpdCBkb3duICovCisgIGlmKGhhc3JfcmVhZChiYXNlKSAmIEhBU1JfTk9fQ0xLKQorICAgIHsKKyAgICAgIC8qIFBvd2VyIHVwIChwb3dlciB1cCB0aW1lIGlzIDI1MHVzKSAqLworICAgICAgaGFjcl93cml0ZShiYXNlLCBIQUNSX0RFRkFVTFQpOworCisgICAgICAvKiBDaGVjayBpZiB0aGUgbW9kdWxlIGhhcyBiZWVuIHBvd2VyZWQgdXAuLi4gKi8KKyAgICAgIGlmKGhhc3JfcmVhZChiYXNlKSAmIEhBU1JfTk9fQ0xLKQorCXsKKyNpZmRlZiBERUJVR19DT05GSUdfRVJST1JTCisJICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogd2F2ZWxhbl9vcGVuKCk6IG1vZGVtIG5vdCBjb25uZWN0ZWRcbiIsCisJCSBkZXYtPm5hbWUpOworI2VuZGlmCisJICByZXR1cm4gRkFMU0U7CisJfQorICAgIH0KKworICAvKiBTdGFydCByZWNlcHRpb24gYW5kIGRlY2xhcmUgdGhlIGRyaXZlciByZWFkeSAqLworICBpZighbHAtPmNvbmZpZ3VyZWQpCisgICAgcmV0dXJuIEZBTFNFOworICBpZighd3ZfcnVfc3RhcnQoZGV2KSkKKyAgICB3dl9od19yZXNldChkZXYpOwkJLyogSWYgcHJvYmxlbSA6IHJlc2V0ICovCisgIG5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKyAgLyogTWFyayB0aGUgZGV2aWNlIGFzIHVzZWQgKi8KKyAgbGluay0+b3BlbisrOworCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisgIGlmKGRvX3JvYW1pbmcpCisgICAgd3Zfcm9hbV9pbml0KGRldik7CisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HICovCisKKyNpZmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IDwtd2F2ZWxhbl9vcGVuKClcbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTaHV0ZG93biB0aGUgV2F2ZUxBTiBQQ01DSUEgYWRhcHRvci4KKyAqIENhbGxlZCBieSBORVQzIHdoZW4gaXQgImNsb3NlIiB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgaW50Cit3YXZlbGFuX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICoJZGV2KQoreworICBkZXZfbGlua190ICoJbGluayA9ICgobmV0X2xvY2FsICopbmV0ZGV2X3ByaXYoZGV2KSktPmxpbms7CisgIGtpb19hZGRyX3QJYmFzZSA9IGRldi0+YmFzZV9hZGRyOworCisjaWZkZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5fY2xvc2UoZGV2PTB4JXgpXG4iLCBkZXYtPm5hbWUsCisJICh1bnNpZ25lZCBpbnQpIGRldik7CisjZW5kaWYKKworICAvKiBJZiB0aGUgZGV2aWNlIGlzbid0IG9wZW4sIHRoZW4gbm90aGluZyB0byBkbyAqLworICBpZighbGluay0+b3BlbikKKyAgICB7CisjaWZkZWYgREVCVUdfQ09ORklHX0lORk8KKyAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogd2F2ZWxhbl9jbG9zZSgpOiBkZXZpY2Ugbm90IG9wZW5cbiIsIGRldi0+bmFtZSk7CisjZW5kaWYKKyAgICAgIHJldHVybiAwOworICAgIH0KKworI2lmZGVmIFdBVkVMQU5fUk9BTUlORworICAvKiBDbGVhbnVwIG9mIHJvYW1pbmcgc3R1ZmYuLi4gKi8KKyAgaWYoZG9fcm9hbWluZykKKyAgICB3dl9yb2FtX2NsZWFudXAoZGV2KTsKKyNlbmRpZgkvKiBXQVZFTEFOX1JPQU1JTkcgKi8KKworICBsaW5rLT5vcGVuLS07CisKKyAgLyogSWYgdGhlIGNhcmQgaXMgc3RpbGwgcHJlc2VudCAqLworICBpZihuZXRpZl9ydW5uaW5nKGRldikpCisgICAgeworICAgICAgbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisgICAgICAvKiBTdG9wIHJlY2VpdmluZyBuZXcgbWVzc2FnZXMgYW5kIHdhaXQgZW5kIG9mIHRyYW5zbWlzc2lvbiAqLworICAgICAgd3ZfcnVfc3RvcChkZXYpOworCisgICAgICAvKiBQb3dlciBkb3duIHRoZSBtb2R1bGUgKi8KKyAgICAgIGhhY3Jfd3JpdGUoYmFzZSwgSEFDUl9ERUZBVUxUICYgKH5IQUNSX1BXUl9TVEFUKSk7CisgICAgfQorCisjaWZkZWYgREVCVUdfQ0FMTEJBQ0tfVFJBQ0UKKyAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiA8LXdhdmVsYW5fY2xvc2UoKVxuIiwgZGV2LT5uYW1lKTsKKyNlbmRpZgorICByZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHdhdmVsYW5fYXR0YWNoKCkgY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIsIGFsbG9jYXRpbmcKKyAqIGxvY2FsIGRhdGEgc3RydWN0dXJlcyBmb3Igb25lIGRldmljZSAob25lIGludGVyZmFjZSkuICBUaGUgZGV2aWNlCisgKiBpcyByZWdpc3RlcmVkIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKyAqCisgKiBUaGUgZGV2X2xpbmsgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkKKyAqIGNvbmZpZ3VyZSB0aGUgY2FyZCBhdCB0aGlzIHBvaW50IC0tIHdlIHdhaXQgdW50aWwgd2UgcmVjZWl2ZSBhCisgKiBjYXJkIGluc2VydGlvbiBldmVudC4KKyAqLworc3RhdGljIGRldl9saW5rX3QgKgord2F2ZWxhbl9hdHRhY2godm9pZCkKK3sKKyAgY2xpZW50X3JlZ190CWNsaWVudF9yZWc7CS8qIFJlZ2lzdGVyIHdpdGggY2FyZG1nciAqLworICBkZXZfbGlua190ICoJbGluazsJCS8qIEluZm8gZm9yIGNhcmRtZ3IgKi8KKyAgc3RydWN0IG5ldF9kZXZpY2UgKglkZXY7CQkvKiBJbnRlcmZhY2UgZ2VuZXJpYyBkYXRhICovCisgIG5ldF9sb2NhbCAqCWxwOwkJLyogSW50ZXJmYWNlIHNwZWNpZmljIGRhdGEgKi8KKyAgaW50CQlyZXQ7CisKKyNpZmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiLT4gd2F2ZWxhbl9hdHRhY2goKVxuIik7CisjZW5kaWYKKworICAvKiBJbml0aWFsaXplIHRoZSBkZXZfbGlua190IHN0cnVjdHVyZSAqLworICBsaW5rID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRldl9saW5rX3QpLCBHRlBfS0VSTkVMKTsKKyAgaWYgKCFsaW5rKSByZXR1cm4gTlVMTDsKKyAgbWVtc2V0KGxpbmssIDAsIHNpemVvZihzdHJ1Y3QgZGV2X2xpbmtfdCkpOworCisgIC8qIFRoZSBpbyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIElPIHBvcnQgbWFwcGluZyAqLworICBsaW5rLT5pby5OdW1Qb3J0czEgPSA4OworICBsaW5rLT5pby5BdHRyaWJ1dGVzMSA9IElPX0RBVEFfUEFUSF9XSURUSF84OworICBsaW5rLT5pby5JT0FkZHJMaW5lcyA9IDM7CisKKyAgLyogSW50ZXJydXB0IHNldHVwICovCisgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFIHwgSVJRX0hBTkRMRV9QUkVTRU5UOworICBsaW5rLT5pcnEuSVJRSW5mbzEgPSBJUlFfTEVWRUxfSUQ7CisgIGxpbmstPmlycS5IYW5kbGVyID0gd2F2ZWxhbl9pbnRlcnJ1cHQ7CisKKyAgLyogR2VuZXJhbCBzb2NrZXQgY29uZmlndXJhdGlvbiAqLworICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgPSBDT05GX0VOQUJMRV9JUlE7CisgIGxpbmstPmNvbmYuVmNjID0gNTA7CisgIGxpbmstPmNvbmYuSW50VHlwZSA9IElOVF9NRU1PUllfQU5EX0lPOworCisgIC8qIENoYWluIGRyaXZlcnMgKi8KKyAgbGluay0+bmV4dCA9IGRldl9saXN0OworICBkZXZfbGlzdCA9IGxpbms7CisKKyAgLyogQWxsb2NhdGUgdGhlIGdlbmVyaWMgZGF0YSBzdHJ1Y3R1cmUgKi8KKyAgZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKG5ldF9sb2NhbCkpOworICBpZiAoIWRldikgeworICAgICAga2ZyZWUobGluayk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBsaW5rLT5wcml2ID0gbGluay0+aXJxLkluc3RhbmNlID0gZGV2OworCisgIGxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworICAvKiBJbml0IHNwZWNpZmljIGRhdGEgKi8KKyAgbHAtPmNvbmZpZ3VyZWQgPSAwOworICBscC0+cmVjb25maWdfODI1OTMgPSBGQUxTRTsKKyAgbHAtPm5yZXNldHMgPSAwOworICAvKiBNdWx0aWNhc3Qgc3R1ZmYgKi8KKyAgbHAtPnByb21pc2N1b3VzID0gMDsKKyAgbHAtPmFsbG11bHRpY2FzdCA9IDA7CisgIGxwLT5tY19jb3VudCA9IDA7CisKKyAgLyogSW5pdCBzcGlubG9jayAqLworICBzcGluX2xvY2tfaW5pdCgmbHAtPnNwaW5sb2NrKTsKKworICAvKiBiYWNrIGxpbmtzICovCisgIGxwLT5saW5rID0gbGluazsKKyAgbHAtPmRldiA9IGRldjsKKworICAvKiB3YXZlbGFuIE5FVDMgY2FsbGJhY2tzICovCisgIFNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKyAgZGV2LT5vcGVuID0gJndhdmVsYW5fb3BlbjsKKyAgZGV2LT5zdG9wID0gJndhdmVsYW5fY2xvc2U7CisgIGRldi0+aGFyZF9zdGFydF94bWl0ID0gJndhdmVsYW5fcGFja2V0X3htaXQ7CisgIGRldi0+Z2V0X3N0YXRzID0gJndhdmVsYW5fZ2V0X3N0YXRzOworICBkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZ3YXZlbGFuX3NldF9tdWx0aWNhc3RfbGlzdDsKKyNpZmRlZiBTRVRfTUFDX0FERFJFU1MKKyAgZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSAmd2F2ZWxhbl9zZXRfbWFjX2FkZHJlc3M7CisjZW5kaWYJLyogU0VUX01BQ19BRERSRVNTICovCisKKyAgLyogU2V0IHRoZSB3YXRjaGRvZyB0aW1lciAqLworICBkZXYtPnR4X3RpbWVvdXQJPSAmd2F2ZWxhbl93YXRjaGRvZzsKKyAgZGV2LT53YXRjaGRvZ190aW1lbwk9IFdBVENIRE9HX0pJRkZJRVM7CisgIFNFVF9FVEhUT09MX09QUyhkZXYsICZvcHMpOworCisjaWZkZWYgV0lSRUxFU1NfRVhUCS8qIElmIHdpcmVsZXNzIGV4dGVuc2lvbiBleGlzdCBpbiB0aGUga2VybmVsICovCisgIGRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAmd2F2ZWxhbl9oYW5kbGVyX2RlZjsKKyAgbHAtPndpcmVsZXNzX2RhdGEuc3B5X2RhdGEgPSAmbHAtPnNweV9kYXRhOworICBkZXYtPndpcmVsZXNzX2RhdGEgPSAmbHAtPndpcmVsZXNzX2RhdGE7CisjZW5kaWYKKworICAvKiBPdGhlciBzcGVjaWZpYyBkYXRhICovCisgIGRldi0+bXR1ID0gV0FWRUxBTl9NVFU7CisKKyAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87CisgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0gCisgICAgQ1NfRVZFTlRfUkVHSVNUUkFUSU9OX0NPTVBMRVRFIHwKKyAgICBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8CisgICAgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKKyAgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOworICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmd2F2ZWxhbl9ldmVudDsKKyAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOworICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOworCisjaWZkZWYgREVCVUdfQ09ORklHX0lORk8KKyAgcHJpbnRrKEtFUk5fREVCVUcgIndhdmVsYW5fYXR0YWNoKCk6IGFsbW9zdCBkb25lLCBjYWxsaW5nIHBjbWNpYV9yZWdpc3Rlcl9jbGllbnRcbiIpOworI2VuZGlmCisKKyAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CisgIGlmKHJldCAhPSAwKQorICAgIHsKKyAgICAgIGNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisgICAgICB3YXZlbGFuX2RldGFjaChsaW5rKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICI8LSB3YXZlbGFuX2F0dGFjaCgpXG4iKTsKKyNlbmRpZgorCisgIHJldHVybiBsaW5rOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogVGhpcyBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIuICBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQgd2l0aAorICogQ2FyZCBTZXJ2aWNlcy4gIElmIGl0IGhhcyBiZWVuIHJlbGVhc2VkLCBhbGwgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzCisgKiBhcmUgZnJlZWQuICBPdGhlcndpc2UsIHRoZSBzdHJ1Y3R1cmVzIHdpbGwgYmUgZnJlZWQgd2hlbiB0aGUgZGV2aWNlCisgKiBpcyByZWxlYXNlZC4KKyAqLworc3RhdGljIHZvaWQKK3dhdmVsYW5fZGV0YWNoKGRldl9saW5rX3QgKglsaW5rKQoreworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICItPiB3YXZlbGFuX2RldGFjaCgweCVwKVxuIiwgbGluayk7CisjZW5kaWYKKworICAvKgorICAgKiBJZiB0aGUgZGV2aWNlIGlzIGN1cnJlbnRseSBjb25maWd1cmVkIGFuZCBhY3RpdmUsIHdlIHdvbid0CisgICAqIGFjdHVhbGx5IGRlbGV0ZSBpdCB5ZXQuICBJbnN0ZWFkLCBpdCBpcyBtYXJrZWQgc28gdGhhdCB3aGVuIHRoZQorICAgKiByZWxlYXNlKCkgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGF0IHdpbGwgdHJpZ2dlciBhIHByb3BlcgorICAgKiBkZXRhY2goKS4KKyAgICovCisgIGlmKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKyAgICB7CisgICAgICAvKiBTb21lIG90aGVycyBoYXZlbid0IGRvbmUgdGhlaXIgam9iIDogZ2l2ZSB0aGVtIGFub3RoZXIgY2hhbmNlICovCisgICAgICB3dl9wY21jaWFfcmVsZWFzZShsaW5rKTsKKyAgICB9CisKKyAgLyogQnJlYWsgdGhlIGxpbmsgd2l0aCBDYXJkIFNlcnZpY2VzICovCisgIGlmKGxpbmstPmhhbmRsZSkKKyAgICBwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKyAgICAKKyAgLyogUmVtb3ZlIHRoZSBpbnRlcmZhY2UgZGF0YSBmcm9tIHRoZSBsaW5rZWQgbGlzdCAqLworICBpZihkZXZfbGlzdCA9PSBsaW5rKQorICAgIGRldl9saXN0ID0gbGluay0+bmV4dDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGRldl9saW5rX3QgKglwcmV2ID0gZGV2X2xpc3Q7CisKKyAgICAgIHdoaWxlKChwcmV2ICE9IChkZXZfbGlua190ICopIE5VTEwpICYmIChwcmV2LT5uZXh0ICE9IGxpbmspKQorCXByZXYgPSBwcmV2LT5uZXh0OworCisgICAgICBpZihwcmV2ID09IChkZXZfbGlua190ICopIE5VTEwpCisJeworI2lmZGVmIERFQlVHX0NPTkZJR19FUlJPUlMKKwkgIHByaW50ayhLRVJOX1dBUk5JTkcgIndhdmVsYW5fZGV0YWNoIDogQXR0ZW1wdGluZyB0byByZW1vdmUgYSBub25leGlzdGVudCBkZXZpY2UuXG4iKTsKKyNlbmRpZgorCSAgcmV0dXJuOworCX0KKworICAgICAgcHJldi0+bmV4dCA9IGxpbmstPm5leHQ7CisgICAgfQorCisgIC8qIEZyZWUgcGllY2VzICovCisgIGlmKGxpbmstPnByaXYpCisgICAgeworICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKglkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgbGluay0+cHJpdjsKKworICAgICAgLyogUmVtb3ZlIG91cnNlbHZlcyBmcm9tIHRoZSBrZXJuZWwgbGlzdCBvZiBldGhlcm5ldCBkZXZpY2VzICovCisgICAgICAvKiBXYXJuaW5nIDogY2FuJ3QgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0LCB0aW1lciBvciB3YXZlbGFuX2Nsb3NlKCkgKi8KKyAgICAgIGlmIChsaW5rLT5kZXYpCisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKyAgICAgIGxpbmstPmRldiA9IE5VTEw7CisgICAgICAoKG5ldF9sb2NhbCAqKW5ldGRldl9wcml2KGRldikpLT5saW5rID0gTlVMTDsKKyAgICAgICgobmV0X2xvY2FsICopbmV0ZGV2X3ByaXYoZGV2KSktPmRldiA9IE5VTEw7CisgICAgICBmcmVlX25ldGRldihkZXYpOworICAgIH0KKyAga2ZyZWUobGluayk7CisKKyNpZmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQorICBwcmludGsoS0VSTl9ERUJVRyAiPC0gd2F2ZWxhbl9kZXRhY2goKVxuIik7CisjZW5kaWYKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFRoZSBjYXJkIHN0YXR1cyBldmVudCBoYW5kbGVyLiBNb3N0bHksIHRoaXMgc2NoZWR1bGVzIG90aGVyIHN0dWZmCisgKiB0byBydW4gYWZ0ZXIgYW4gZXZlbnQgaXMgcmVjZWl2ZWQuIEEgQ0FSRF9SRU1PVkFMIGV2ZW50IGFsc28gc2V0cworICogc29tZSBmbGFncyB0byBkaXNjb3VyYWdlIHRoZSBuZXQgZHJpdmVycyBmcm9tIHRyeWluZyB0byB0YWxrIHRvIHRoZQorICogY2FyZCBhbnkgbW9yZS4KKyAqLworc3RhdGljIGludAord2F2ZWxhbl9ldmVudChldmVudF90CQlldmVudCwJCS8qIFRoZSBldmVudCByZWNlaXZlZCAqLworCSAgICAgIGludAkJcHJpb3JpdHksCisJICAgICAgZXZlbnRfY2FsbGJhY2tfYXJnc190ICoJYXJncykKK3sKKyAgZGV2X2xpbmtfdCAqCWxpbmsgPSAoZGV2X2xpbmtfdCAqKSBhcmdzLT5jbGllbnRfZGF0YTsKKyAgc3RydWN0IG5ldF9kZXZpY2UgKglkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgbGluay0+cHJpdjsKKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICItPndhdmVsYW5fZXZlbnQoKTogJXNcbiIsCisJICgoZXZlbnQgPT0gQ1NfRVZFTlRfUkVHSVNUUkFUSU9OX0NPTVBMRVRFKT8icmVnaXN0cmF0aW9uIGNvbXBsZXRlIiA6CisJICAoKGV2ZW50ID09IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCkgPyAiY2FyZCByZW1vdmFsIiA6CisJICAgKChldmVudCA9PSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTikgPyAiY2FyZCBpbnNlcnRpb24iIDoKKwkgICAgKChldmVudCA9PSBDU19FVkVOVF9QTV9TVVNQRU5EKSA/ICJwbSBzdXNwZW5kIiA6CisJICAgICAoKGV2ZW50ID09IENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMKSA/ICJwaHlzaWNhbCByZXNldCIgOgorCSAgICAgICgoZXZlbnQgPT0gQ1NfRVZFTlRfUE1fUkVTVU1FKSA/ICJwbSByZXN1bWUiIDoKKwkgICAgICAgKChldmVudCA9PSBDU19FVkVOVF9DQVJEX1JFU0VUKSA/ICJjYXJkIHJlc2V0IiA6CisJCSJ1bmtub3duIikpKSkpKSkpOworI2VuZGlmCisKKyAgICBzd2l0Y2goZXZlbnQpCisgICAgICB7CisgICAgICBjYXNlIENTX0VWRU5UX1JFR0lTVFJBVElPTl9DT01QTEVURToKKyNpZmRlZiBERUJVR19DT05GSUdfSU5GTworCXByaW50ayhLRVJOX0RFQlVHICJ3YXZlbGFuX2NzOiByZWdpc3RyYXRpb24gY29tcGxldGVcbiIpOworI2VuZGlmCisJYnJlYWs7CisKKyAgICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMOgorCS8qIE91cHMgISBUaGUgY2FyZCBpcyBubyBtb3JlIHRoZXJlICovCisJbGluay0+c3RhdGUgJj0gfkRFVl9QUkVTRU5UOworCWlmKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykKKwkgIHsKKwkgICAgLyogQWNjZXB0IG5vIG1vcmUgdHJhbnNtaXNzaW9ucyAqLworCSAgICBuZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKwkgICAgLyogUmVsZWFzZSB0aGUgY2FyZCAqLworCSAgICB3dl9wY21jaWFfcmVsZWFzZShsaW5rKTsKKwkgIH0KKwlicmVhazsKKworICAgICAgY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwkvKiBSZXNldCBhbmQgY29uZmlndXJlIHRoZSBjYXJkICovCisJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJaWYod3ZfcGNtY2lhX2NvbmZpZyhsaW5rKSAmJgorCSAgIHd2X2h3X2NvbmZpZyhkZXYpKQorCSAgd3ZfaW5pdF9pbmZvKGRldik7CisJZWxzZQorCSAgZGV2LT5pcnEgPSAwOworCWJyZWFrOworCisgICAgICBjYXNlIENTX0VWRU5UX1BNX1NVU1BFTkQ6CisJLyogTkI6IHdhdmVsYW5fY2xvc2Ugd2lsbCBiZSBjYWxsZWQsIGJ1dCB0b28gbGF0ZSwgc28gd2UgYXJlCisJICogb2JsaWdlZCB0byBjbG9zZSBuaWNlbHkgdGhlIHdhdmVsYW4gaGVyZS4gRGF2aWQsIGNvdWxkIHlvdQorCSAqIGNsb3NlIHRoZSBkZXZpY2UgYmVmb3JlIHN1c3BlbmRpbmcgdGhlbSA/IEFuZCwgYnkgdGhlIHdheSwKKwkgKiBjb3VsZCB5b3UsIG9uIHJlc3VtZSwgYWRkIGEgInJvdXRlIGFkZCAtbmV0IC4uLiIgYWZ0ZXIgdGhlCisJICogaWZjb25maWcgdXAgPyBUaGFua3MuLi4gKi8KKworCS8qIFN0b3AgcmVjZWl2aW5nIG5ldyBtZXNzYWdlcyBhbmQgd2FpdCBlbmQgb2YgdHJhbnNtaXNzaW9uICovCisJd3ZfcnVfc3RvcChkZXYpOworCisJLyogUG93ZXIgZG93biB0aGUgbW9kdWxlICovCisJaGFjcl93cml0ZShkZXYtPmJhc2VfYWRkciwgSEFDUl9ERUZBVUxUICYgKH5IQUNSX1BXUl9TVEFUKSk7CisKKwkvKiBUaGUgY2FyZCBpcyBub3cgc3VzcGVuZGVkICovCisJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJLyogRmFsbCB0aHJvdWdoLi4uICovCisgICAgICBjYXNlIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMOgorICAgIAlpZihsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJICB7CisgICAgICAJICAgIGlmKGxpbmstPm9wZW4pCisJICAgICAgbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworICAgICAgCSAgICBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKGxpbmstPmhhbmRsZSk7CisJICB9CisJYnJlYWs7CisKKyAgICAgIGNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCWxpbmstPnN0YXRlICY9IH5ERVZfU1VTUEVORDsKKwkvKiBGYWxsIHRocm91Z2guLi4gKi8KKyAgICAgIGNhc2UgQ1NfRVZFTlRfQ0FSRF9SRVNFVDoKKwlpZihsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpCisJICB7CisgICAgICAJICAgIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisgICAgICAJICAgIGlmKGxpbmstPm9wZW4pCS8qIElmIFJFU0VUIC0+IFRydWUsIElmIFJFU1VNRSAtPiBGYWxzZSA/ICovCisJICAgICAgeworCQl3dl9od19yZXNldChkZXYpOworCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJICAgICAgfQorCSAgfQorCWJyZWFrOworICAgIH0KKworI2lmZGVmIERFQlVHX0NBTExCQUNLX1RSQUNFCisgIHByaW50ayhLRVJOX0RFQlVHICI8LXdhdmVsYW5fZXZlbnQoKVxuIik7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciB3YXZlbGFuX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gIndhdmVsYW5fY3MiLAorCX0sCisJLmF0dGFjaAkJPSB3YXZlbGFuX2F0dGFjaCwKKwkuZGV0YWNoCQk9IHdhdmVsYW5fZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK2luaXRfd2F2ZWxhbl9jcyh2b2lkKQoreworCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZ3YXZlbGFuX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorZXhpdF93YXZlbGFuX2NzKHZvaWQpCit7CisJcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZ3YXZlbGFuX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfd2F2ZWxhbl9jcyk7Cittb2R1bGVfZXhpdChleGl0X3dhdmVsYW5fY3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5Y2ZmNmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmgKQEAgLTAsMCArMSwzODYgQEAKKy8qCisgKglXYXZlbGFuIFBjbWNpYSBkcml2ZXIKKyAqCisgKgkJSmVhbiBJSSAtIEhQTEIgJzk2CisgKgorICogUmVvcmdhbml6YXRpb24gYW5kIGV4dGVuc2lvbiBvZiB0aGUgZHJpdmVyLgorICogT3JpZ2luYWwgY29weXJpZ2h0IGZvbGxvdy4gU2VlIHdhdmVsYW5fY3MuaCBmb3IgZGV0YWlscy4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbiB0aGUgZGVjbGFyYXRpb25zIG9mIHRoZSBXYXZlbGFuIGhhcmR3YXJlLiBOb3RlIHRoYXQKKyAqIHRoZSBQY21jaWEgV2F2ZWxhbiBpbmNsdWRlIGEgaTgyNTkzIGNvbnRyb2xsZXIgKHNlZSBkZWZpbml0aW9ucyBpbgorICogZmlsZSBpODI1OTMuaCkuCisgKgorICogVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwY21jaWEgaGFyZHdhcmUgYW5kIHRoZSBJU0Egb25lIGlzCisgKiB0aGUgRXRoZXJuZXQgQ29udHJvbGxlciAoaTgyNTkzIGluc3RlYWQgb2YgaTgyNTg2KS4gVGhlIGk4MjU5MyBhbGxvdworICogb25seSBvbmUgc2VuZCBidWZmZXIuIFRoZSBQU0EgKFBhcmFtZXRlciBTdG9yYWdlIEFyZWEgOiBFRXByb20gZm9yCisgKiBwZXJtYW5lbnQgc3RvcmFnZSBvZiB2YXJpb3VzIGluZm8pIGlzIG1lbW9yeSBtYXBwZWQsIGJ1dCBub3QgdGhlCisgKiBNTUkgKE1vZGVtIE1hbmFnZW1lbnQgSW50ZXJmYWNlKS4KKyAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBBVCZUIEdJUyAoZm9ybWVybHkgTkNSKSBXYXZlTEFOIFBDTUNJQSBjYXJkOiAKKyAqICAgQW4gRXRoZXJuZXQtbGlrZSByYWRpbyB0cmFuc2NlaXZlciBjb250cm9sbGVkIGJ5IGFuIEludGVsIDgyNTkzCisgKiAgIGNvcHJvY2Vzc29yLgorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBDb3B5cmlnaHQgMTk5NQorICogICBBbnRob255IEQuIEpvc2VwaAorICogICBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5CisgKgorICogICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHByb2dyYW0KKyAqICAgZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQKKyAqICAgdGhhdCB0aGlzIGNvcHlyaWdodCBhbmQgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIG9uIGFsbCBjb3BpZXMKKyAqICAgYW5kIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgdGhlIG5hbWUgb2YgTS5JLlQuIG5vdCBiZSB1c2VkCisgKiAgIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKKyAqICAgcHJvZ3JhbSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHBlcm1pc3Npb24sIGFuZCBub3RpY2UgYmUgZ2l2ZW4KKyAqICAgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uIHRoYXQgY29weWluZyBhbmQgZGlzdHJpYnV0aW9uIGlzCisgKiAgIGJ5IHBlcm1pc3Npb24gb2YgTS5JLlQuICBNLkkuVC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0CisgKiAgIHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByby0KKyAqICAgdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4gICAgICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoKKyAqIENyZWRpdHM6CisgKiAgICAgU3BlY2lhbCB0aGFua3MgdG8gSmFuIEhvb2dlbmRvb3JuIG9mIEFUJlQgR0lTIFV0cmVjaHQgZm9yCisgKiAgICAgICBwcm92aWRpbmcgZXh0cmVtZWx5IHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCBXYXZlTEFOIFBDTUNJQSBoYXJkd2FyZQorICoKKyAqICAgICBUaGlzIGRyaXZlciBpcyBiYXNlZCB1cG9uIHNldmVyYWwgb3RoZXIgZHJpdmVycywgaW4gcGFydGljdWxhcjoKKyAqICAgICAgIERhdmlkIEhpbmRzJyBMaW51eCBkcml2ZXIgZm9yIHRoZSBQQ01DSUEgM2M1ODkgZXRoZXJuZXQgYWRhcHRlcgorICogICAgICAgQnJ1Y2UgSmFuc29uJ3MgTGludXggZHJpdmVyIGZvciB0aGUgQVQtYnVzIFdhdmVMQU4gYWRhcHRlcgorICoJIEFuZGVycyBLbGVtZXRzJyBQQ01DSUEgV2F2ZUxBTiBhZGFwdGVyIGRyaXZlcgorICogICAgICAgUm9iZXJ0IE1vcnJpcycgQlNESSBkcml2ZXIgZm9yIHRoZSBQQ01DSUEgV2F2ZUxBTiBhZGFwdGVyCisgKi8KKworI2lmbmRlZiBfV0FWRUxBTl9DU19ICisjZGVmaW5lCV9XQVZFTEFOX0NTX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIE1BR0lDIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgZGV0ZWN0aW9uIG9mIHRoZSB3YXZlbGFuIGNhcmQgaXMgbWFkZSBieSByZWFkaW5nIHRoZSBNQUMgYWRkcmVzcworICogZnJvbSB0aGUgY2FyZCBhbmQgY2hlY2tpbmcgaXQuIElmIHlvdSBoYXZlIGEgbm9uIEFUJlQgcHJvZHVjdCAoT0VNLAorICogbGlrZSBERUMgUm9hbUFib3V0LCBvciBEaWdpdGFsIE9jZWFuLCBFcHNvbiwgLi4uKSwgeW91IG11c3QgbW9kaWZ5IHRoaXMKKyAqIHBhcnQgdG8gYWNjb21tb2RhdGUgeW91ciBoYXJkd2FyZS4uLgorICovCitjb25zdCB1bnNpZ25lZCBjaGFyCU1BQ19BRERSRVNTRVNbXVszXSA9Cit7CisgIHsgMHgwOCwgMHgwMCwgMHgwRSB9LAkJLyogQVQmVCBXYXZlbGFuIChzdGFuZGFyZCkgJiBERUMgUm9hbUFib3V0ICovCisgIHsgMHgwOCwgMHgwMCwgMHg2QSB9LAkJLyogQVQmVCBXYXZlbGFuIChhbHRlcm5hdGUpICovCisgIHsgMHgwMCwgMHgwMCwgMHhFMSB9LAkJLyogSGl0YWNoaSBXYXZlbGFuICovCisgIHsgMHgwMCwgMHg2MCwgMHgxRCB9CQkvKiBMdWNlbnQgV2F2ZWxhbiAoYW5vdGhlciBvbmUpICovCisgIC8qIEFkZCB5b3VyIGNhcmQgaGVyZSBhbmQgc2VuZCBtZSB0aGUgcGF0Y2ggISAqLworfTsKKworLyoKKyAqIENvbnN0YW50cyB1c2VkIHRvIGNvbnZlcnQgY2hhbm5lbHMgdG8gZnJlcXVlbmNpZXMKKyAqLworCisvKiBGcmVxdWVuY3kgYXZhaWxhYmxlIGluIHRoZSAyLjAgbW9kZW0sIGluIHVuaXRzIG9mIDI1MCBrSHoKKyAqIChhcyByZWFkIGluIHRoZSBvZmZzZXQgcmVnaXN0ZXIgb2YgdGhlIGRhYyBhcmVhKS4KKyAqIFVzZWQgdG8gbWFwIGNoYW5uZWwgbnVtYmVycyB1c2VkIGJ5IGB3ZnJlcXNlbCcgdG8gZnJlcXVlbmNpZXMKKyAqLworY29uc3Qgc2hvcnQJY2hhbm5lbF9iYW5kc1tdID0geyAweDMwLCAweDU4LCAweDY0LCAweDdBLCAweDgwLCAweEE4LAorCQkJCSAgICAweEQwLCAweEYwLCAweEY4LCAweDE1MCB9OworCisvKiBGcmVxdWVuY2llcyBvZiB0aGUgMS4wIG1vZGVtIChmaXhlZCBmcmVxdWVuY2llcykuCisgKiBVc2UgdG8gbWFwIHRoZSBQU0EgYHN1YmJhbmQnIHRvIGEgZnJlcXVlbmN5CisgKiBOb3RlIDogYWxsIGZyZXF1ZW5jaWVzIGFwYXJ0IGZyb20gdGhlIGZpcnN0IG9uZSBuZWVkIHRvIGJlIG11bHRpcGxpZWQgYnkgMTAKKyAqLworY29uc3QgaW50CWZpeGVkX2JhbmRzW10gPSB7IDkxNWU2LCAyLjQyNWU4LCAyLjQ2ZTgsIDIuNDg0ZTgsIDIuNDMwNWU4IH07CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBQQyBJTlRFUkZBQ0UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogV2F2ZUxBTiBob3N0IGludGVyZmFjZSBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lCUxDQ1IoYmFzZSkJKGJhc2UpCQkvKiBMQU4gQ29udHJvbGxlciBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lCUxDU1IoYmFzZSkJKGJhc2UpCQkvKiBMQU4gQ29udHJvbGxlciBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEFDUihiYXNlKQkoYmFzZSsweDEpCS8qIEhvc3QgQWRhcHRlciBDb21tYW5kIFJlZ2lzdGVyICovCisjZGVmaW5lCUhBU1IoYmFzZSkJKGJhc2UrMHgxKQkvKiBIb3N0IEFkYXB0ZXIgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBJT1JMKGJhc2UpCShiYXNlKzB4MikJLyogUHJvZ3JhbSBJL08gUmVnaXN0ZXIgTG93ICovCisjZGVmaW5lIFJQTEwoYmFzZSkJKGJhc2UrMHgyKQkvKiBSZWNlaXZlIFBvaW50ZXIgTGF0Y2hlZCBMb3cgKi8KKyNkZWZpbmUgUElPUkgoYmFzZSkJKGJhc2UrMHgzKQkvKiBQcm9ncmFtIEkvTyBSZWdpc3RlciBIaWdoICovCisjZGVmaW5lIFJQTEgoYmFzZSkJKGJhc2UrMHgzKQkvKiBSZWNlaXZlIFBvaW50ZXIgTGF0Y2hlZCBIaWdoICovCisjZGVmaW5lIFBJT1AoYmFzZSkJKGJhc2UrMHg0KQkvKiBQcm9ncmFtIEkvTyBQb3J0ICovCisjZGVmaW5lIE1NUihiYXNlKQkoYmFzZSsweDYpCS8qIE1NSSBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1NRChiYXNlKQkoYmFzZSsweDcpCS8qIE1NSSBEYXRhIFJlZ2lzdGVyICovCisKKy8qIEhvc3QgQWRhcHRvciBDb21tYW5kIFJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIEhBQ1JfTE9GCSAgKDEgPDwgMykJLyogTG9jayBPdXQgRmxhZywgdG9nZ2xlIGV2ZXJ5IDI1MG1zICovCisjZGVmaW5lIEhBQ1JfUFdSX1NUQVQJICAoMSA8PCA0KQkvKiBQb3dlciBTdGF0ZSwgMT1hY3RpdmUsIDA9c2xlZXAgKi8KKyNkZWZpbmUgSEFDUl9UWF9ETUFfUkVTRVQgKDEgPDwgNSkJLyogUmVzZXQgdHJhbnNtaXQgRE1BIHB0ciBvbiBoaWdoICovCisjZGVmaW5lIEhBQ1JfUlhfRE1BX1JFU0VUICgxIDw8IDYpCS8qIFJlc2V0IHJlY2VpdmUgRE1BIHB0ciBvbiBoaWdoICovCisjZGVmaW5lIEhBQ1JfUk9NX1dFTgkgICgxIDw8IDcpCS8qIEVFUFJPTSB3cml0ZSBlbmFibGVkIHdoZW4gdHJ1ZSAqLworCisjZGVmaW5lIEhBQ1JfUkVTRVQgICAgICAgICAgICAgIChIQUNSX1RYX0RNQV9SRVNFVCB8IEhBQ1JfUlhfRE1BX1JFU0VUKQorI2RlZmluZQlIQUNSX0RFRkFVTFQJCShIQUNSX1BXUl9TVEFUKQorCisvKiBIb3N0IEFkYXB0ZXIgU3RhdHVzIFJlZ2lzdGVyIGJpdCBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIEhBU1JfTU1JX0JVU1kJKDEgPDwgMikJLyogTU1JIGlzIGJ1c3kgd2hlbiB0cnVlICovCisjZGVmaW5lIEhBU1JfTE9GCSgxIDw8IDMpCS8qIExvY2sgb3V0IGZsYWcgc3RhdHVzICovCisjZGVmaW5lIEhBU1JfTk9fQ0xLCSgxIDw8IDQpCS8qIGFjdGl2ZSB3aGVuIG1vZGVtIG5vdCBjb25uZWN0ZWQgKi8KKworLyogTWlzY2VsbGFuZW91cyBiaXQgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBQSU9SSF9TRUxfVFgJKDEgPDwgNSkJLyogUElPUiBwb2ludHMgdG8gMD1yeC8xPXR4IGJ1ZmZlciAqLworI2RlZmluZSBNTVJfTU1JX1dSCSgxIDw8IDApCS8qIE5leHQgTU1JIGN5Y2xlIGlzIDA9cmVhZCwgMT13cml0ZSAqLworI2RlZmluZSBQSU9SSF9NQVNLCTB4MWYJCS8qIG9ubHkgbG93IDUgYml0cyBhcmUgc2lnbmlmaWNhbnQgKi8KKyNkZWZpbmUgUlBMSF9NQVNLCTB4MWYJCS8qIG9ubHkgbG93IDUgYml0cyBhcmUgc2lnbmlmaWNhbnQgKi8KKyNkZWZpbmUgTU1JX0FERFJfTUFTSwkweDdlCQkvKiBCaXRzIDEtNiBvZiBNTVIgYXJlIHNpZ25pZmljYW50ICovCisKKy8qIEF0dHJpYnV0ZSBNZW1vcnkgbWFwICovCisKKyNkZWZpbmUgQ0lTX0FERFIJMHgwMDAwCQkvKiBDYXJkIEluZm9ybWF0aW9uIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBQU0FfQUREUgkweDBlMDAJCS8qIFBhcmFtZXRlciBTdG9yYWdlIEFyZWEgYWRkcmVzcyAqLworI2RlZmluZSBFRVBST01fQUREUgkweDEwMDAJCS8qIEVFUFJPTSBhZGRyZXNzICh1bnVzZWQgPykgKi8KKyNkZWZpbmUgQ09SX0FERFIJMHg0MDAwCQkvKiBDb25maWd1cmF0aW9uIE9wdGlvbiBSZWdpc3RlciAqLworCisvKiBDb25maWd1cmF0aW9uIE9wdGlvbiBSZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBDT1JfQ09ORklHCSgxIDw8IDApCS8qIENvbmZpZyBJbmRleCwgMCB3aGVuIHVuY29uZmlndXJlZCAqLworI2RlZmluZSBDT1JfU1dfUkVTRVQJKDEgPDwgNykJLyogU29mdHdhcmUgUmVzZXQgb24gdHJ1ZSAqLworI2RlZmluZSBDT1JfTEVWRUxfSVJRCSgxIDw8IDYpCS8qIExldmVsIElSUSAqLworCisvKiBMb2NhbCBNZW1vcnkgbWFwICovCisKKyNkZWZpbmUgUlhfQkFTRQkJMHgwMDAwCQkvKiBSZWNlaXZlIG1lbW9yeSwgOCBrQiAqLworI2RlZmluZSBUWF9CQVNFCQkweDIwMDAJCS8qIFRyYW5zbWl0IG1lbW9yeSwgMiBrQiAqLworI2RlZmluZSBVTlVTRURfQkFTRQkweDI4MDAJCS8qIFVudXNlZCwgMjIga0IgKi8KKyNkZWZpbmUgUlhfU0laRQkJKFRYX0JBU0UtUlhfQkFTRSkJLyogU2l6ZSBvZiByZWNlaXZlIGFyZWEgKi8KKyNkZWZpbmUgUlhfU0laRV9TSElGVAk2CQkvKiBCaXRzIHRvIHNoaWZ0IGluIHN0b3AgcmVnaXN0ZXIgKi8KKworI2RlZmluZSBUUlVFICAxCisjZGVmaW5lIEZBTFNFIDAKKworI2RlZmluZSBNT0RfRU5BTCAxCisjZGVmaW5lIE1PRF9QUk9NIDIKKworLyogU2l6ZSBvZiBhIE1BQyBhZGRyZXNzICovCisjZGVmaW5lIFdBVkVMQU5fQUREUl9TSVpFCTYKKworLyogTWF4aW11bSBzaXplIG9mIFdhdmVsYW4gcGFja2V0ICovCisjZGVmaW5lIFdBVkVMQU5fTVRVCTE1MDAKKworI2RlZmluZQlNQVhEQVRBWgkJKDYgKyA2ICsgMiArIFdBVkVMQU5fTVRVKQorCisvKioqKioqKioqKioqKioqKioqKioqKiBQQVJBTUVURVIgU1RPUkFHRSBBUkVBICoqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBQYXJhbWV0ZXIgU3RvcmFnZSBBcmVhIChQU0EpLgorICovCit0eXBlZGVmIHN0cnVjdCBwc2FfdAlwc2FfdDsKK3N0cnVjdCBwc2FfdAoreworICAvKiBGb3IgdGhlIFBDTUNJQSBBZGFwdGVyLCBsb2NhdGlvbnMgMHgwMC0weDBGIGFyZSB1bnVzZWQgYW5kIGZpeGVkIGF0IDAwICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2lvX2Jhc2VfYWRkcl8xOwkvKiBbMHgwMF0gQmFzZSBhZGRyZXNzIDEgPz8/ICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2lvX2Jhc2VfYWRkcl8yOwkvKiBbMHgwMV0gQmFzZSBhZGRyZXNzIDIgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfaW9fYmFzZV9hZGRyXzM7CS8qIFsweDAyXSBCYXNlIGFkZHJlc3MgMyAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9pb19iYXNlX2FkZHJfNDsJLyogWzB4MDNdIEJhc2UgYWRkcmVzcyA0ICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3JlbV9ib290X2FkZHJfMTsJLyogWzB4MDRdIFJlbW90ZSBCb290IEFkZHJlc3MgMSAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9yZW1fYm9vdF9hZGRyXzI7CS8qIFsweDA1XSBSZW1vdGUgQm9vdCBBZGRyZXNzIDIgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfcmVtX2Jvb3RfYWRkcl8zOwkvKiBbMHgwNl0gUmVtb3RlIEJvb3QgQWRkcmVzcyAzICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2hvbGlfcGFyYW1zOwkvKiBbMHgwN10gSE9zdCBMYW4gSW50ZXJmYWNlIChIT0xJKSBQYXJhbWV0ZXJzICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2ludF9yZXFfbm87CQkvKiBbMHgwOF0gSW50ZXJydXB0IFJlcXVlc3QgTGluZSAqLworICB1bnNpZ25lZCBjaGFyCXBzYV91bnVzZWQwWzddOwkJLyogWzB4MDktMHgwRl0gdW51c2VkICovCisKKyAgdW5zaWduZWQgY2hhcglwc2FfdW5pdl9tYWNfYWRkcltXQVZFTEFOX0FERFJfU0laRV07CS8qIFsweDEwLTB4MTVdIFVuaXZlcnNhbCAoZmFjdG9yeSkgTUFDIEFkZHJlc3MgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfbG9jYWxfbWFjX2FkZHJbV0FWRUxBTl9BRERSX1NJWkVdOwkvKiBbMHgxNi0xQl0gTG9jYWwgTUFDIEFkZHJlc3MgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfdW5pdl9sb2NhbF9zZWw7CS8qIFsweDFDXSBVbml2ZXJzYWwgTG9jYWwgU2VsZWN0aW9uICovCisjZGVmaW5lCQlQU0FfVU5JVkVSU0FMCTAJCS8qIFVuaXZlcnNhbCAoZmFjdG9yeSkgKi8KKyNkZWZpbmUJCVBTQV9MT0NBTAkxCQkvKiBMb2NhbCAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9jb21wX251bWJlcjsJLyogWzB4MURdIENvbXBhdGFiaWxpdHkgTnVtYmVyOiAqLworI2RlZmluZQkJUFNBX0NPTVBfUENfQVRfOTE1CTAgCS8qIFBDLUFUIDkxNSBNSHoJKi8KKyNkZWZpbmUJCVBTQV9DT01QX1BDX01DXzkxNQkxIAkvKiBQQy1NQyA5MTUgTUh6CSovCisjZGVmaW5lCQlQU0FfQ09NUF9QQ19BVF8yNDAwCTIgCS8qIFBDLUFUIDIuNCBHSHoJKi8KKyNkZWZpbmUJCVBTQV9DT01QX1BDX01DXzI0MDAJMyAJLyogUEMtTUMgMi40IEdIegkqLworI2RlZmluZQkJUFNBX0NPTVBfUENNQ0lBXzkxNQk0IAkvKiBQQ01DSUEgOTE1IE1IeiBvciAyLjAgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfdGhyX3ByZV9zZXQ7CS8qIFsweDFFXSBNb2RlbSBUaHJlc2hvbGQgUHJlc2V0ICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2ZlYXR1cmVfc2VsZWN0OwkvKiBbMHgxRl0gQ2FsbCBjb2RlIHJlcXVpcmVkICgxPW9uKSAqLworI2RlZmluZQkJUFNBX0ZFQVRVUkVfQ0FMTF9DT0RFCTB4MDEgCS8qIENhbGwgY29kZSByZXF1aXJlZCAoSmFwYW4pICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3N1YmJhbmQ7CQkvKiBbMHgyMF0gU3ViYmFuZAkqLworI2RlZmluZQkJUFNBX1NVQkJBTkRfOTE1CQkwCS8qIDkxNSBNSHogb3IgMi4wICovCisjZGVmaW5lCQlQU0FfU1VCQkFORF8yNDI1CTEJLyogMjQyNSBNSHoJKi8KKyNkZWZpbmUJCVBTQV9TVUJCQU5EXzI0NjAJMgkvKiAyNDYwIE1IegkqLworI2RlZmluZQkJUFNBX1NVQkJBTkRfMjQ4NAkzCS8qIDI0ODQgTUh6CSovCisjZGVmaW5lCQlQU0FfU1VCQkFORF8yNDMwXzUJNAkvKiAyNDMwLjUgTUh6CSovCisgIHVuc2lnbmVkIGNoYXIJcHNhX3F1YWxpdHlfdGhyOwkvKiBbMHgyMV0gTW9kZW0gUXVhbGl0eSBUaHJlc2hvbGQgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfbW9kX2RlbGF5OwkJLyogWzB4MjJdIE1vZGVtIERlbGF5ID8/PyAocmVzZXJ2ZWQpICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX253aWRbMl07CQkvKiBbMHgyMy0weDI0XSBOZXR3b3JrIElEICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX253aWRfc2VsZWN0OwkvKiBbMHgyNV0gTmV0d29yayBJRCBTZWxlY3QgT24gT2ZmICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2VuY3J5cHRpb25fc2VsZWN0OwkvKiBbMHgyNl0gRW5jcnlwdGlvbiBPbiBPZmYgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfZW5jcnlwdGlvbl9rZXlbOF07CS8qIFsweDI3LTB4MkVdIEVuY3J5cHRpb24gS2V5ICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2RhdGFidXNfd2lkdGg7CS8qIFsweDJGXSBBVCBidXMgd2lkdGggc2VsZWN0IDgvMTYgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfY2FsbF9jb2RlWzhdOwkvKiBbMHgzMC0weDM3XSAoSmFwYW4pIENhbGwgQ29kZSAqLworICB1bnNpZ25lZCBjaGFyCXBzYV9ud2lkX3ByZWZpeFsyXTsJLyogWzB4MzgtMHgzOV0gUm9hbWluZyBkb21haW4gKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfcmVzZXJ2ZWRbMl07CS8qIFsweDNBLTB4M0JdIFJlc2VydmVkIC0gZml4ZWQgMDAgKi8KKyAgdW5zaWduZWQgY2hhcglwc2FfY29uZl9zdGF0dXM7CS8qIFsweDNDXSBDb25mIFN0YXR1cywgYml0IDA9MTpjb25maWcqLworICB1bnNpZ25lZCBjaGFyCXBzYV9jcmNbMl07CQkvKiBbMHgzRF0gQ1JDLTE2IG92ZXIgUFNBICovCisgIHVuc2lnbmVkIGNoYXIJcHNhX2NyY19zdGF0dXM7CQkvKiBbMHgzRl0gQ1JDIFZhbGlkIEZsYWcgKi8KK307CisKKy8qIFNpemUgZm9yIHN0cnVjdHVyZSBjaGVja2luZyAoaWYgcGFkZGluZyBpcyBjb3JyZWN0KSAqLworI2RlZmluZQlQU0FfU0laRQk2NAorCisvKiBDYWxjdWxhdGUgb2Zmc2V0IG9mIGEgZmllbGQgaW4gdGhlIGFib3ZlIHN0cnVjdHVyZQorICogV2FybmluZyA6IG9ubHkgZXZlbiBhZGRyZXNzZXMgYXJlIHVzZWQgKi8KKyNkZWZpbmUJcHNhb2ZmKHAsZikgCSgodW5zaWduZWQgc2hvcnQpICgodm9pZCAqKSgmKChwc2FfdCAqKSAoKHZvaWQgKikgTlVMTCArIChwKSkpLT5mKSAtICh2b2lkICopIE5VTEwpKQorCisvKioqKioqKioqKioqKioqKioqKiogTU9ERU0gTUFOQUdFTUVOVCBJTlRFUkZBQ0UgKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBNb2RlbSBNYW5hZ2VtZW50IENvbnRyb2xsZXIgKE1NQykgd3JpdGUgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBtbXdfdAltbXdfdDsKK3N0cnVjdCBtbXdfdAoreworICB1bnNpZ25lZCBjaGFyCW1td19lbmNyX2tleVs4XTsJLyogZW5jcnlwdGlvbiBrZXkgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfZW5jcl9lbmFibGU7CS8qIGVuYWJsZS9kaXNhYmxlIGVuY3J5cHRpb24gKi8KKyNkZWZpbmUJTU1XX0VOQ1JfRU5BQkxFX01PREUJMHgwMgkvKiBNb2RlIG9mIHNlY3VyaXR5IG9wdGlvbiAqLworI2RlZmluZQlNTVdfRU5DUl9FTkFCTEVfRU4JMHgwMQkvKiBFbmFibGUgc2VjdXJpdHkgb3B0aW9uICovCisgIHVuc2lnbmVkIGNoYXIJbW13X3VudXNlZDBbMV07CQkvKiB1bnVzZWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfZGVzX2lvX2ludmVydDsJLyogRW5jcnlwdGlvbiBvcHRpb24gKi8KKyNkZWZpbmUJTU1XX0RFU19JT19JTlZFUlRfUkVTCTB4MEYJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUJTU1XX0RFU19JT19JTlZFUlRfQ1RSTAkweEYwCS8qIENvbnRyb2wgPz8/IChzZXQgdG8gMCkgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfdW51c2VkMVs1XTsJCS8qIHVudXNlZCAqLworICB1bnNpZ25lZCBjaGFyCW1td19sb29wdF9zZWw7CQkvKiBsb29wdGVzdCBzZWxlY3Rpb24gKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9ESVNfTldJRAkweDQwCS8qIGRpc2FibGUgTldJRCBmaWx0ZXJpbmcgKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9JTlQJMHgyMAkvKiBhY3RpdmF0ZSBBdHRlbnRpb24gUmVxdWVzdCAqLworI2RlZmluZQlNTVdfTE9PUFRfU0VMX0xTCTB4MTAJLyogbG9vcHRlc3Qgdy9vIGNvbGxpc2lvbiBhdm9pZGFuY2UgKi8KKyNkZWZpbmUgTU1XX0xPT1BUX1NFTF9MVDNBCTB4MDgJLyogbG9vcHRlc3QgM2EgKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9MVDNCCTB4MDQJLyogbG9vcHRlc3QgM2IgKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9MVDNDCTB4MDIJLyogbG9vcHRlc3QgM2MgKi8KKyNkZWZpbmUJTU1XX0xPT1BUX1NFTF9MVDNECTB4MDEJLyogbG9vcHRlc3QgM2QgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfamFiYmVyX2VuYWJsZTsJLyogamFiYmVyIHRpbWVyIGVuYWJsZSAqLworICAvKiBBYm9ydCB0cmFuc21pc3Npb25zID4gMjAwIG1zICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2ZyZWV6ZTsJCS8qIGZyZWV6ZSAvIHVuZnJlZWV6ZSBzaWduYWwgbGV2ZWwgKi8KKyAgLyogMCA6IHNpZ25hbCBsZXZlbCAmIHF1YWwgdXBkYXRlZCBmb3IgZXZlcnkgbmV3IG1lc3NhZ2UsIDEgOiBmcm96ZW4gKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfYW50ZW5fc2VsOwkJLyogYW50ZW5uYSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgTU1XX0FOVEVOX1NFTF9TRUwJMHgwMQkvKiBkaXJlY3QgYW50ZW5uYSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUJTU1XX0FOVEVOX1NFTF9BTEdfRU4JMHgwMgkvKiBhbnRlbm5hIHNlbGVjdGlvbiBhbGdvLiBlbmFibGUgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfaWZzOwkJLyogaW50ZXIgZnJhbWUgc3BhY2luZyAqLworICAvKiBtaW4gdGltZSBiZXR3ZWVuIHRyYW5zbWlzc2lvbiBpbiBiaXQgcGVyaW9kcyAoLjUgdXMpIC0gYml0IDAgaWdub3JlZCAqLworICB1bnNpZ25lZCBjaGFyCW1td19tb2RfZGVsYXk7CSAJLyogbW9kZW0gZGVsYXkgKHN5bmNocm8pICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2phbV90aW1lOwkJLyogamFtbWluZyB0aW1lIChhZnRlciBjb2xsaXNpb24pICovCisgIHVuc2lnbmVkIGNoYXIJbW13X3VudXNlZDJbMV07CQkvKiB1bnVzZWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfdGhyX3ByZV9zZXQ7CS8qIGxldmVsIHRocmVzaG9sZCBwcmVzZXQgKi8KKyAgLyogRGlzY2FyZCBhbGwgcGFja2V0IHdpdGggc2lnbmFsIDwgdGhpcyB2YWx1ZSAoNCkgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfZGVjYXlfcHJtOwkJLyogZGVjYXkgcGFyYW1ldGVycyAqLworICB1bnNpZ25lZCBjaGFyCW1td19kZWNheV91cGRhdF9wcm07CS8qIGRlY2F5IHVwZGF0ZSBwYXJhbWV0ZXJ6ICovCisgIHVuc2lnbmVkIGNoYXIJbW13X3F1YWxpdHlfdGhyOwkvKiBxdWFsaXR5ICh6LXF1b3RpZW50KSB0aHJlc2hvbGQgKi8KKyAgLyogRGlzY2FyZCBhbGwgcGFja2V0IHdpdGggcXVhbGl0eSA8IHRoaXMgdmFsdWUgKDMpICovCisgIHVuc2lnbmVkIGNoYXIJbW13X25ldHdfaWRfbDsJCS8qIE5XSUQgbG93IG9yZGVyIGJ5dGUgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfbmV0d19pZF9oOwkJLyogTldJRCBoaWdoIG9yZGVyIGJ5dGUgKi8KKyAgLyogTmV0d29yayBJRCBvciBEb21haW4gOiBjcmVhdGUgdmlydHVhbCBuZXQgb24gdGhlIGFpciAqLworCisgIC8qIDIuMCBIYXJkd2FyZSBleHRlbnNpb24gLSBmcmVxdWVuY3kgc2VsZWN0aW9uIHN1cHBvcnQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXdfbW9kZV9zZWxlY3Q7CS8qIGZvciBhbmFsb2cgdGVzdHMgKHNldCB0byAwKSAqLworICB1bnNpZ25lZCBjaGFyCW1td191bnVzZWQzWzFdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW13X2ZlZV9jdHJsOwkJLyogZnJlcXVlbmN5IGVlcHJvbSBjb250cm9sICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9QUkUJMHgxMAkvKiBFbmFibGUgcHJvdGVjdGVkIGluc3RydWN0aW9ucyAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfRFdMRAkweDA4CS8qIERvd25sb2FkIGVlcHJvbSB0byBtbWMgKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX0NNRAkweDA3CS8qIEVFcHJvbSBjb21tYW5kcyA6ICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9SRUFECTB4MDYJLyogUmVhZCAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfV1JFTgkweDA0CS8qIFdyaXRlIGVuYWJsZSAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfV1JJVEUJMHgwNQkvKiBXcml0ZSBkYXRhIHRvIGFkZHJlc3MgKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1dSQUxMCTB4MDQJLyogV3JpdGUgZGF0YSB0byBhbGwgYWRkcmVzc2VzICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9XRFMJMHgwNAkvKiBXcml0ZSBkaXNhYmxlICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9QUlJFQUQJMHgxNgkvKiBSZWFkIGFkZHIgZnJvbSBwcm90ZWN0IHJlZ2lzdGVyICovCisjZGVmaW5lCU1NV19GRUVfQ1RSTF9QUkVOCTB4MTQJLyogUHJvdGVjdCByZWdpc3RlciBlbmFibGUgKi8KKyNkZWZpbmUJTU1XX0ZFRV9DVFJMX1BSQ0xFQVIJMHgxNwkvKiBVbnByb3RlY3QgYWxsIHJlZ2lzdGVycyAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfUFJXUklURQkweDE1CS8qIFdyaXRlIGFkZHIgaW4gcHJvdGVjdCByZWdpc3RlciAqLworI2RlZmluZQlNTVdfRkVFX0NUUkxfUFJEUwkweDE0CS8qIFByb3RlY3QgcmVnaXN0ZXIgZGlzYWJsZSAqLworICAvKiBOZXZlciBpc3N1ZSB0aGlzIGNvbW1hbmQgKFBSRFMpIDogaXQncyBpcnJldmVyc2libGUgISEhICovCisKKyAgdW5zaWduZWQgY2hhcgltbXdfZmVlX2FkZHI7CQkvKiBFRXByb20gYWRkcmVzcyAqLworI2RlZmluZQlNTVdfRkVFX0FERFJfQ0hBTk5FTAkweEYwCS8qIFNlbGVjdCB0aGUgY2hhbm5lbCAqLworI2RlZmluZQlNTVdfRkVFX0FERFJfT0ZGU0VUCTB4MEYJLyogT2Zmc2V0IGluIGNoYW5uZWwgZGF0YSAqLworI2RlZmluZQlNTVdfRkVFX0FERFJfRU4JCTB4QzAJLyogRkVFX0NUUkwgZW5hYmxlIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUJTU1XX0ZFRV9BRERSX0RTCQkweDAwCS8qIEZFRV9DVFJMIGRpc2FibGUgb3BlcmF0aW9ucyAqLworI2RlZmluZQlNTVdfRkVFX0FERFJfQUxMCTB4NDAJLyogRkVFX0NUUkwgYWxsIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUJTU1XX0ZFRV9BRERSX0NMRUFSCTB4RkYJLyogRkVFX0NUUkwgY2xlYXIgb3BlcmF0aW9ucyAqLworCisgIHVuc2lnbmVkIGNoYXIJbW13X2ZlZV9kYXRhX2w7CQkvKiBXcml0ZSBkYXRhIHRvIEVFcHJvbSAqLworICB1bnNpZ25lZCBjaGFyCW1td19mZWVfZGF0YV9oOwkJLyogaGlnaCBvY3RldCAqLworICB1bnNpZ25lZCBjaGFyCW1td19leHRfYW50OwkJLyogU2V0dGluZyBmb3IgZXh0ZXJuYWwgYW50ZW5uYSAqLworI2RlZmluZQlNTVdfRVhUX0FOVF9FWFRBTlQJMHgwMQkvKiBTZWxlY3QgZXh0ZXJuYWwgYW50ZW5uYSAqLworI2RlZmluZQlNTVdfRVhUX0FOVF9QT0wJCTB4MDIJLyogUG9sYXJpdHkgb2YgdGhlIGFudGVubmEgKi8KKyNkZWZpbmUJTU1XX0VYVF9BTlRfSU5URVJOQUwJMHgwMAkvKiBJbnRlcm5hbCBhbnRlbm5hICovCisjZGVmaW5lCU1NV19FWFRfQU5UX0VYVEVSTkFMCTB4MDMJLyogRXh0ZXJuYWwgYW50ZW5uYSAqLworI2RlZmluZQlNTVdfRVhUX0FOVF9JUV9URVNUCTB4MUMJLyogSVEgdGVzdCBwYXR0ZXJuIChzZXQgdG8gMCkgKi8KK307CisKKy8qIFNpemUgZm9yIHN0cnVjdHVyZSBjaGVja2luZyAoaWYgcGFkZGluZyBpcyBjb3JyZWN0KSAqLworI2RlZmluZQlNTVdfU0laRQkzNworCisvKiBDYWxjdWxhdGUgb2Zmc2V0IG9mIGEgZmllbGQgaW4gdGhlIGFib3ZlIHN0cnVjdHVyZSAqLworI2RlZmluZQltbXdvZmYocCxmKSAJKHVuc2lnbmVkIHNob3J0KSgodm9pZCAqKSgmKChtbXdfdCAqKSgodm9pZCAqKTAgKyAocCkpKS0+ZikgLSAodm9pZCAqKTApCisKKworLyoKKyAqIE1vZGVtIE1hbmFnZW1lbnQgQ29udHJvbGxlciAoTU1DKSByZWFkIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbW1yX3QJbW1yX3Q7CitzdHJ1Y3QgbW1yX3QKK3sKKyAgdW5zaWduZWQgY2hhcgltbXJfdW51c2VkMFs4XTsJCS8qIHVudXNlZCAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9kZXNfc3RhdHVzOwkJLyogZW5jcnlwdGlvbiBzdGF0dXMgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZGVzX2F2YWlsOwkJLyogZW5jcnlwdGlvbiBhdmFpbGFibGUgKDB4NTUgcmVhZCkgKi8KKyNkZWZpbmUJTU1SX0RFU19BVkFJTF9ERVMJMHg1NQkJLyogREVTIGF2YWlsYWJsZSAqLworI2RlZmluZQlNTVJfREVTX0FWQUlMX0FFUwkweDMzCQkvKiBBRVMgKEFUJlQpIGF2YWlsYWJsZSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9kZXNfaW9faW52ZXJ0OwkvKiBkZXMgSS9PIGludmVydCByZWdpc3RlciAqLworICB1bnNpZ25lZCBjaGFyCW1tcl91bnVzZWQxWzVdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2RjZV9zdGF0dXM7CQkvKiBEQ0Ugc3RhdHVzICovCisjZGVmaW5lCU1NUl9EQ0VfU1RBVFVTX1JYX0JVU1kJCTB4MDEJLyogcmVjZWl2ZXIgYnVzeSAqLworI2RlZmluZQlNTVJfRENFX1NUQVRVU19MT09QVF9JTkQJMHgwMgkvKiBsb29wIHRlc3QgaW5kaWNhdGVkICovCisjZGVmaW5lCU1NUl9EQ0VfU1RBVFVTX1RYX0JVU1kJCTB4MDQJLyogdHJhbnNtaXR0ZXIgb24gKi8KKyNkZWZpbmUJTU1SX0RDRV9TVEFUVVNfSkJSX0VYUElSRUQJMHgwOAkvKiBqYWJiZXIgdGltZXIgZXhwaXJlZCAqLworI2RlZmluZSBNTVJfRENFX1NUQVRVUwkJCTB4MEYJLyogbWFzayB0byBnZXQgdGhlIGJpdHMgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfZHNwX2lkOwkJLyogRFNQIGlkIChBQSA9IERhZWRhbHVzIHJldiBBKSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl91bnVzZWQyWzJdOwkJLyogdW51c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2NvcnJlY3RfbndpZF9sOwkvKiAjIG9mIGNvcnJlY3QgTldJRCdzIHJ4ZCAobG93KSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9jb3JyZWN0X253aWRfaDsJLyogIyBvZiBjb3JyZWN0IE5XSUQncyByeGQgKGhpZ2gpICovCisgIC8qIFdhcm5pbmcgOiBSZWFkIGhpZ2ggb3JkZXIgb2N0ZXQgZmlyc3QgISEhICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3dyb25nX253aWRfbDsJLyogIyBvZiB3cm9uZyBOV0lEJ3MgcnhkIChsb3cpICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3dyb25nX253aWRfaDsJLyogIyBvZiB3cm9uZyBOV0lEJ3MgcnhkIChoaWdoKSAqLworICB1bnNpZ25lZCBjaGFyCW1tcl90aHJfcHJlX3NldDsJLyogbGV2ZWwgdGhyZXNob2xkIHByZXNldCAqLworI2RlZmluZQlNTVJfVEhSX1BSRV9TRVQJCTB4M0YJCS8qIGxldmVsIHRocmVzaG9sZCBwcmVzZXQgKi8KKyNkZWZpbmUJTU1SX1RIUl9QUkVfU0VUX0NVUgkweDgwCQkvKiBDdXJyZW50IHNpZ25hbCBhYm92ZSBpdCAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9zaWduYWxfbHZsOwkJLyogc2lnbmFsIGxldmVsICovCisjZGVmaW5lCU1NUl9TSUdOQUxfTFZMCQkweDNGCQkvKiBzaWduYWwgbGV2ZWwgKi8KKyNkZWZpbmUJTU1SX1NJR05BTF9MVkxfVkFMSUQJMHg4MAkJLyogVXBkYXRlZCBzaW5jZSBsYXN0IHJlYWQgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfc2lsZW5jZV9sdmw7CS8qIHNpbGVuY2UgbGV2ZWwgKG5vaXNlKSAqLworI2RlZmluZQlNTVJfU0lMRU5DRV9MVkwJCTB4M0YJCS8qIHNpbGVuY2UgbGV2ZWwgKi8KKyNkZWZpbmUJTU1SX1NJTEVOQ0VfTFZMX1ZBTElECTB4ODAJCS8qIFVwZGF0ZWQgc2luY2UgbGFzdCByZWFkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3NnbmxfcXVhbDsJCS8qIHNpZ25hbCBxdWFsaXR5ICovCisjZGVmaW5lCU1NUl9TR05MX1FVQUwJCTB4MEYJCS8qIHNpZ25hbCBxdWFsaXR5ICovCisjZGVmaW5lCU1NUl9TR05MX1FVQUxfQU5UCTB4ODAJCS8qIGN1cnJlbnQgYW50ZW5uYSB1c2VkICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX25ldHdfaWRfbDsJCS8qIE5XSUQgbG93IG9yZGVyIGJ5dGUgPz8/ICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX3VudXNlZDNbM107CQkvKiB1bnVzZWQgKi8KKworICAvKiAyLjAgSGFyZHdhcmUgZXh0ZW5zaW9uIC0gZnJlcXVlbmN5IHNlbGVjdGlvbiBzdXBwb3J0ICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2ZlZV9zdGF0dXM7CQkvKiBTdGF0dXMgb2YgZnJlcXVlbmN5IGVlcHJvbSAqLworI2RlZmluZQlNTVJfRkVFX1NUQVRVU19JRAkweEYwCQkvKiBNb2RlbSByZXZpc2lvbiBpZCAqLworI2RlZmluZQlNTVJfRkVFX1NUQVRVU19EV0xECTB4MDgJCS8qIERvd25sb2FkIGluIHByb2dyZXNzICovCisjZGVmaW5lCU1NUl9GRUVfU1RBVFVTX0JVU1kJMHgwNAkJLyogRUVwcm9tIGJ1c3kgKi8KKyAgdW5zaWduZWQgY2hhcgltbXJfdW51c2VkNFsxXTsJCS8qIHVudXNlZCAqLworICB1bnNpZ25lZCBjaGFyCW1tcl9mZWVfZGF0YV9sOwkJLyogUmVhZCBkYXRhIGZyb20gZWVwcm9tIChsb3cpICovCisgIHVuc2lnbmVkIGNoYXIJbW1yX2ZlZV9kYXRhX2g7CQkvKiBSZWFkIGRhdGEgZnJvbSBlZXByb20gKGhpZ2gpICovCit9OworCisvKiBTaXplIGZvciBzdHJ1Y3R1cmUgY2hlY2tpbmcgKGlmIHBhZGRpbmcgaXMgY29ycmVjdCkgKi8KKyNkZWZpbmUJTU1SX1NJWkUJMzYKKworLyogQ2FsY3VsYXRlIG9mZnNldCBvZiBhIGZpZWxkIGluIHRoZSBhYm92ZSBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUJbW1yb2ZmKHAsZikgCSh1bnNpZ25lZCBzaG9ydCkoKHZvaWQgKikoJigobW1yX3QgKikoKHZvaWQgKikwICsgKHApKSktPmYpIC0gKHZvaWQgKikwKQorCisKKy8qIE1ha2UgdGhlIHR3byBhYm92ZSBzdHJ1Y3R1cmVzIG9uZSAqLwordHlwZWRlZiB1bmlvbiBtbV90Cit7CisgIHN0cnVjdCBtbXdfdAl3OwkvKiBXcml0ZSB0byB0aGUgbW1jICovCisgIHN0cnVjdCBtbXJfdAlyOwkvKiBSZWFkIGZyb20gdGhlIG1tYyAqLworfSBtbV90OworCisjZW5kaWYgLyogX1dBVkVMQU5fQ1NfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5wLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTJlZjhkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5wLmgKQEAgLTAsMCArMSw4MTMgQEAKKy8qCisgKglXYXZlbGFuIFBjbWNpYSBkcml2ZXIKKyAqCisgKgkJSmVhbiBJSSAtIEhQTEIgJzk2CisgKgorICogUmVvcmdhbmlzYXRpb24gYW5kIGV4dGVuc2lvbiBvZiB0aGUgZHJpdmVyLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWluIGFsbCBkZWZpbml0aW9uIGFuZCBkZWNsYXJhdGlvbnMgbmVjZXNzYXJ5IGZvciB0aGUKKyAqIHdhdmVsYW4gcGNtY2lhIGRyaXZlci4gVGhpcyBmaWxlIGlzIGEgcHJpdmF0ZSBoZWFkZXIsIHNvIGl0IHNob3VsZAorICogYmUgaW5jbHVkZWQgb25seSBvbiB3YXZlbGFuX2NzLmMgISEhCisgKi8KKworI2lmbmRlZiBXQVZFTEFOX0NTX1BfSAorI2RlZmluZSBXQVZFTEFOX0NTX1BfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogRE9DVU1FTlRBVElPTiAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGlzIGRyaXZlciBwcm92aWRlIGEgTGludXggaW50ZXJmYWNlIHRvIHRoZSBXYXZlbGFuIFBjbWNpYSBoYXJkd2FyZQorICogVGhlIFdhdmVsYW4gaXMgYSBwcm9kdWN0IG9mIEx1Y2VudCAoaHR0cDovL3d3dy53YXZlbGFuLmNvbS8pLgorICogVGhpcyBkaXZpc2lvbiB3YXMgZm9ybWVybHkgcGFydCBvZiBOQ1IgYW5kIHRoZW4gQVQmVC4KKyAqIFdhdmVsYW4gYXJlIGFsc28gZGlzdHJpYnV0ZWQgYnkgREVDIChSb2FtQWJvdXQgRFMpLi4uCisgKgorICogVG8ga25vdyBob3cgdG8gdXNlIHRoaXMgZHJpdmVyLCByZWFkIHRoZSBQQ01DSUEgSE9XVE8uCisgKiBJZiB5b3Ugd2FudCB0byBleHBsb2l0IHRoZSBtYW55IG90aGVyIGZvbmN0aW9uYWxpdGllcywgbG9vayBjb21tZW50cworICogaW4gdGhlIGNvZGUuLi4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyB0aGUgcmVzdWx0IG9mIHRoZSBlZmZvcnQgb2YgbWFueSBwZW9wbGVzIChzZWUgYmVsb3cpLgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTUEVDSUZJQyBOT1RFUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBXZWIgcGFnZQorICogLS0tLS0tLS0KKyAqCUkgdHJ5IHRvIG1haW50YWluIGEgd2ViIHBhZ2Ugd2l0aCB0aGUgV2lyZWxlc3MgTEFOIEhvd3RvIGF0IDoKKyAqCSAgICBodHRwOi8vd3d3LmhwbC5ocC5jb20vcGVyc29uYWwvSmVhbl9Ub3VycmlsaGVzL0xpbnV4L1dhdmVsYW4uaHRtbAorICoKKyAqIFNNUAorICogLS0tCisgKglXZSBub3cgYXJlIFNNUCBjb21wbGlhbnQgKEkgZXZlbnR1YWxseSBmaXhlZCB0aGUgcmVtYWluaW5nIGJ1Z3MpLgorICoJVGhlIGRyaXZlciBoYXMgYmVlbiB0ZXN0ZWQgb24gYSBkdWFsIFA2LTE1MCBhbmQgc3Vydml2ZWQgbXkgdXN1YWwKKyAqCXNldCBvZiB0b3J0dXJlIHRlc3RzLgorICoJQW55d2F5LCBJIHNwZW50IGVub3VnaCB0aW1lIGNoYXNpbmcgaW50ZXJydXB0IHJlLWVudHJhbmN5IGR1cmluZworICoJZXJyb3JzIG9yIHJlY29uZmlndXJlLCBhbmQgSSBkZXNpZ25lZCB0aGUgbG9ja2VkL3VubG9ja2VkIHNlY3Rpb25zCisgKglvZiB0aGUgZHJpdmVyIHdpdGggZ3JlYXQgY2FyZSwgYW5kIHdpdGggdGhlIHJlY2VudCBhZGRpdGlvbiBvZgorICoJdGhlIHNwaW5sb2NrICh0aGFua3MgdG8gdGhlIG5ldyBBUEkpLCB3ZSBzaG91bGQgYmUgcXVpdGUgY2xvc2UgdG8KKyAqCXRoZSB0cnV0aC4KKyAqCVRoZSBTTVAvSVJRIGxvY2tpbmcgaXMgcXVpdGUgY29hcnNlIGFuZCBjb25zZXJ2YXRpdmUgKGkuZS4gbm90IGZhc3QpLAorICoJYnV0IGJldHRlciBzYWZlIHRoYW4gc29ycnkgKGVzcGVjaWFsbHkgYXQgMiBNYi9zIDstKS4KKyAqCisgKglJIGhhdmUgYWxzbyBsb29rZWQgaW50byBkaXNhYmxpbmcgb25seSBvdXIgaW50ZXJydXB0IG9uIHRoZSBjYXJkCisgKgkodmlhIEhBQ1IpIGluc3RlYWQgb2YgYWxsIGludGVycnVwdHMgaW4gdGhlIHByb2Nlc3NvciAodmlhIGNsaSksCisgKglzbyB0aGF0IG90aGVyIGRyaXZlciBhcmUgbm90IGltcGFjdGVkLCBhbmQgaXQgbG9vayBsaWtlIGl0J3MKKyAqCXBvc3NpYmxlLCBidXQgaXQncyB2ZXJ5IHRyaWNreSB0byBkbyByaWdodCAoZnVsbCBvZiByYWNlcykuIEFzCisgKgl0aGUgZ2FpbiB3b3VsZCBiZSBtb3N0bHkgZm9yIFNNUCBzeXN0ZW1zLCBpdCBjYW4gd2FpdC4uLgorICoKKyAqIERlYnVnZ2luZyBhbmQgb3B0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKglZb3Ugd2lsbCBmaW5kIGJlbG93IGEgc2V0IG9mICcjZGVmaW5lIiBhbGxvd2luZyBhIHZlcnkgZmluZSBjb250cm9sCisgKglvbiB0aGUgZHJpdmVyIGJlaGF2aW91ciBhbmQgdGhlIGRlYnVnIG1lc3NhZ2VzIHByaW50ZWQuCisgKglUaGUgbWFpbiBvcHRpb25zIGFyZSA6CisgKglvIFdBVkVMQU5fUk9BTUlORywgZm9yIHRoZSBleHBlcmltZW50YWwgcm9hbWluZyBzdXBwb3J0LgorICoJbyBTRVRfUFNBX0NSQywgdG8gaGF2ZSB5b3VyIGNhcmQgY29ycmVjdGx5IHJlY29nbmlzZWQgYnkKKyAqCSAgYW4gYWNjZXNzIHBvaW50IGFuZCB0aGUgUG9pbnQtdG8tUG9pbnQgZGlhZ25vc3RpYyB0b29sLgorICoJbyBVU0VfUFNBX0NPTkZJRywgdG8gcmVhZCBjb25maWd1cmF0aW9uIGZyb20gdGhlIFBTQSAoRUVwcm9tKQorICoJICAob3RoZXJ3aXNlIHdlIGFsd2F5cyBzdGFydCBhZnJlc2ggd2l0aCBzb21lIGRlZmF1bHRzKQorICoKKyAqIHdhdmVsYW5fY3MubyBpcyBkYXJuIHRvbyBiaWcKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCVRoYXQncyB0cnVlICEgVGhlcmUgaXMgYSB2ZXJ5IHNpbXBsZSB3YXkgdG8gcmVkdWNlIHRoZSBkcml2ZXIKKyAqCW9iamVjdCBieSAzMyUgKHllcyAhKS4gQ29tbWVudCBvdXQgdGhlIGZvbGxvd2luZyBsaW5lIDoKKyAqCQkjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyAqCU90aGVyIGNvbXBpbGUgb3B0aW9ucyBjYW4gYWxzbyByZWR1Y2UgdGhlIHNpemUgb2YgaXQuLi4KKyAqCisgKiBNQUMgYWRkcmVzcyBhbmQgaGFyZHdhcmUgZGV0ZWN0aW9uIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCVRoZSBkZXRlY3Rpb24gY29kZSBvZiB0aGUgd2F2ZWxhbiBjaGVjaCB0aGF0IHRoZSBmaXJzdCAzCisgKglvY3RldHMgb2YgdGhlIE1BQyBhZGRyZXNzIGZpdCB0aGUgY29tcGFueSBjb2RlLiBUaGlzIHR5cGUgb2YKKyAqCWRldGVjdGlvbiB3b3JrIHdlbGwgZm9yIEFUJlQgY2FyZHMgKGJlY2F1c2UgdGhlIEFUJlQgY29kZSBpcworICoJaGFyZGNvZGVkIGluIHdhdmVsYW5fY3MuaCksIGJ1dCBvZiBjb3Vyc2Ugd2lsbCBmYWlsIGZvciBvdGhlcgorICoJbWFudWZhY3R1cmVyLgorICoKKyAqCUlmIHlvdSBhcmUgc3VyZSB0aGF0IHlvdXIgY2FyZCBpcyBkZXJpdmVkIGZyb20gdGhlIHdhdmVsYW4sCisgKgloZXJlIGlzIHRoZSB3YXkgdG8gY29uZmlndXJlIGl0IDoKKyAqCTEpIEdldCB5b3VyIE1BQyBhZGRyZXNzCisgKgkJYSkgV2l0aCB5b3VyIGNhcmQgdXRpbGl0aWVzICh3ZnJlcXNlbCwgaW5zdGNvbmYsIC4uLikKKyAqCQliKSBXaXRoIHRoZSBkcml2ZXIgOgorICoJCQlvIGNvbXBpbGUgdGhlIGtlcm5lbCB3aXRoIERFQlVHX0NPTkZJR19JTkZPIGVuYWJsZWQKKyAqCQkJbyBCb290IGFuZCBsb29rIHRoZSBjYXJkIG1lc3NhZ2VzCisgKgkyKSBTZXQgeW91ciBNQUMgY29kZSAoMyBvY3RldHMpIGluIE1BQ19BRERSRVNTRVNbXVszXSAod2F2ZWxhbl9jcy5oKQorICoJMykgQ29tcGlsZSAmIHZlcmlmeQorICoJNCkgU2VuZCBtZSB0aGUgTUFDIGNvZGUgLSBJIHdpbGwgaW5jbHVkZSBpdCBpbiB0aGUgbmV4dCB2ZXJzaW9uLi4uCisgKgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXSVJFTEVTUyBFWFRFTlNJT05TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFRoaXMgZHJpdmVyIGlzIHRoZSBmaXJzdCBvbmUgdG8gc3VwcG9ydCAid2lyZWxlc3MgZXh0ZW5zaW9ucyIuCisgKiBUaGlzIHNldCBvZiBleHRlbnNpb25zIHByb3ZpZGUgeW91IHNvbWUgd2F5IHRvIGNvbnRyb2wgdGhlIHdpcmVsZXNzCisgKiBjYXJhY3RlcmlzdGljcyBvZiB0aGUgaGFyZHdhcmUgaW4gYSBzdGFuZGFyZCB3YXkgYW5kIHN1cHBvcnQgZm9yCisgKiBhcHBsaWNhdGlvbnMgZm9yIHRha2luZyBhZHZhbnRhZ2Ugb2YgaXQgKGxpa2UgTW9iaWxlIElQKS4KKyAqCisgKiBZb3Ugd2lsbCBuZWVkIHRvIGVuYWJsZSB0aGUgQ09ORklHX05FVF9SQURJTyBkZWZpbmUgaW4gdGhlIGtlcm5lbAorICogY29uZmlndXJhdGlvbiB0byBlbmFibGUgdGhlIHdpcmVsZXNzIGV4dGVuc2lvbnMgKHRoaXMgaXMgdGhlIG9uZQorICogZ2l2aW5nIGFjY2VzcyB0byB0aGUgcmFkaW8gbmV0d29yayBkZXZpY2UgY2hvaWNlKS4KKyAqCisgKiBJdCBtaWdodCBhbHNvIGJlIGEgZ29vZCBpZGVhIGFzIHdlbGwgdG8gZmV0Y2ggdGhlIHdpcmVsZXNzIHRvb2xzIHRvCisgKiBjb25maWd1cmUgdGhlIGRldmljZSBhbmQgcGxheSBhIGJpdC4KKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZJTEVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiB3YXZlbGFuX2NzLmMgOglUaGUgYWN0dWFsIGNvZGUgZm9yIHRoZSBkcml2ZXIgLSBDIGZ1bmN0aW9ucworICoKKyAqIHdhdmVsYW5fY3MucC5oIDoJUHJpdmF0ZSBoZWFkZXIgOiBsb2NhbCB0eXBlcyAvIHZhcnMgZm9yIHRoZSBkcml2ZXIKKyAqCisgKiB3YXZlbGFuX2NzLmggOglEZXNjcmlwdGlvbiBvZiB0aGUgaGFyZHdhcmUgaW50ZXJmYWNlICYgc3RydWN0cworICoKKyAqIGk4MjU5My5oIDoJCURlc2NyaXB0aW9uIGlmIHRoZSBFdGhlcm5ldCBjb250cm9sbGVyCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhJU1RPUlkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogVGhlIGhpc3Rvcnkgb2YgdGhlIFdhdmVsYW4gZHJpdmVycyBpcyBhcyBjb21wbGljYXRlZCBhcyBoaXN0b3J5IG9mCisgKiB0aGUgV2F2ZWxhbiBpdHNlbGYgKE5DUiAtPiBBVCZUIC0+IEx1Y2VudCkuCisgKgorICogQWxsIHN0YXJ0ZWQgd2l0aCBBbmRlcnMgS2xlbWV0cyA8a2xlbWV0c0BwYXVsLnJ1dGdlcnMuZWR1PiwKKyAqIHdyaXR0aW5nIGEgV2F2ZWxhbiBJU0EgZHJpdmVyIGZvciB0aGUgTUFDSCBtaWNyb2tlcm5lbC4gR2lyaXNoCisgKiBXZWxsaW5nIDx3ZWxsaW5nQHBhdWwucnV0Z2Vycy5lZHU+IGhhZCBhbHNvIHdvcmtlZCBvbiBpdC4KKyAqIEtlaXRoIE1vb3JlIG1vZGlmeSB0aGlzIGZvciB0aGUgUGNtY2lhIGhhcmR3YXJlLgorICogCisgKiBSb2JlcnQgTW9ycmlzIDxydG1AZGFzLmhhcnZhcmQuZWR1PiBwb3J0IHRoZXNlIHR3byBkcml2ZXJzIHRvIEJTREkKKyAqIGFuZCBhZGQgc3BlY2lmaWMgUGNtY2lhIHN1cHBvcnQgKHRoZXJlIGlzIGN1cnJlbnRseSBubyBlcXVpdmFsZW50CisgKiBvZiB0aGUgUENNQ0lBIHBhY2thZ2UgdW5kZXIgQlNELi4uKS4KKyAqCisgKiBKaW0gQmlua2xleSA8anJiQGNzLnBkeC5lZHU+IHBvcnQgYm90aCBCU0RJIGRyaXZlcnMgdG8gRnJlZUJTRC4KKyAqCisgKiBCcnVjZSBKYW5zb24gPGJydWNlQGNzLnVzeWQuZWR1LmF1PiBwb3J0IHRoZSBCU0RJIElTQSBkcml2ZXIgdG8gTGludXguCisgKgorICogQW50aG9ueSBELiBKb3NlcGggPGFkakBsY3MubWl0LmVkdT4gc3RhcnRlZCBtb2RpZnkgQnJ1Y2UgZHJpdmVyCisgKiAod2l0aCBoZWxwIG9mIHRoZSBCU0RJIFBDTUNJQSBkcml2ZXIpIGZvciBQQ01DSUEuCisgKiBZdW56aG91IExpIDx5dW56aG91QHN0cmF0LmlvbC51bmguZWR1PiBmaW5pc2hlZCBpcyB3b3JrLgorICogSm9lIEZpbm5leSA8am9lQGNvbXAubGFuY3MuYWMudWs+IHBhdGNoZWQgdGhlIGRyaXZlciB0byBzdGFydAorICogY29ycmVjdGx5IDIuMDAgY2FyZHMgKDIuNCBHSHogd2l0aCBmcmVxdWVuY3kgc2VsZWN0aW9uKS4KKyAqIERhdmlkIEhpbmRzIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4gaW50ZWdyYXRlZCB0aGUgd2hvbGUgaW4gaGlzCisgKiBQY21jaWEgcGFja2FnZSAoKyBidWcgY29ycmVjdGlvbnMpLgorICoKKyAqIEkgKEplYW4gVG91cnJpbGhlcyAtIGp0QGhwbGIuaHBsLmhwLmNvbSkgdGhlbiBzdGFydGVkIHRvIG1ha2Ugc29tZQorICogcGF0Y2hzIHRvIHRoZSBQY21jaWEgZHJpdmVyLiBBZnRlciwgSSBhZGRlZCBjb2RlIGluIHRoZSBJU0EgZHJpdmVyCisgKiBmb3IgV2lyZWxlc3MgRXh0ZW5zaW9ucyBhbmQgZnVsbCBzdXBwb3J0IG9mIGZyZXF1ZW5jeSBzZWxlY3Rpb24KKyAqIGNhcmRzLiBOb3csIEknbSBkb2luZyB0aGUgc2FtZSB0byB0aGUgUGNtY2lhIGRyaXZlciArIHNvbWUKKyAqIHJlb3JnYW5pc2F0aW9uLgorICogTG9la2UgQnJlZGVydmVsZCA8bGJyZWRlcnZAd2F2ZWxhbi5jb20+IGZyb20gTHVjZW50IGhhcyBnaXZlbiBtZQorICogbXVjaCBuZWVkZWQgaW5mb3JtYXRpb25zIG9uIHRoZSBXYXZlbGFuIGhhcmR3YXJlLgorICovCisKKy8qIEJ5IHRoZSB3YXkgOiBmb3IgdGhlIGNvcHlyaWdodCAmIGxlZ2FsIHN0dWZmIDoKKyAqIEFsbW9zdCBldmVyeWJvZHkgd3JvdGUgY29kZSB1bmRlciBHTlUgb3IgQlNEIGxpY2Vuc2UgKG9yIGFsaWtlKSwKKyAqIGFuZCB3YW50IHRoYXQgdGhlaXIgb3JpZ2luYWwgY29weXJpZ2h0IHJlbWFpbiBzb21ld2hlcmUgaW4gdGhlCisgKiBjb2RlIChmb3IgbXlzZWxmLCBJIGdvIHdpdGggdGhlIEdQTCkuCisgKiBOb2JvZHkgd2FudCB0byB0YWtlIHJlc3BvbnNpYmlsaXR5IGZvciBhbnl0aGluZywgZXhjZXB0IHRoZSBmYW1lLi4uCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENSRURJVFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogQ3JlZGl0czoKKyAqICAgIFNwZWNpYWwgdGhhbmtzIHRvIEphbiBIb29nZW5kb29ybiBvZiBBVCZUIEdJUyBVdHJlY2h0IGFuZAorICoJTG9la2UgQnJlZGVydmVsZCBvZiBMdWNlbnQgZm9yIHByb3ZpZGluZyBleHRyZW1lbHkgdXNlZnVsCisgKglpbmZvcm1hdGlvbiBhYm91dCBXYXZlTEFOIFBDTUNJQSBoYXJkd2FyZQorICoKKyAqICAgIFRoaXMgZHJpdmVyIGlzIGJhc2VkIHVwb24gc2V2ZXJhbCBvdGhlciBkcml2ZXJzLCBpbiBwYXJ0aWN1bGFyOgorICoJRGF2aWQgSGluZHMnIExpbnV4IGRyaXZlciBmb3IgdGhlIFBDTUNJQSAzYzU4OSBldGhlcm5ldCBhZGFwdGVyCisgKglCcnVjZSBKYW5zb24ncyBMaW51eCBkcml2ZXIgZm9yIHRoZSBBVC1idXMgV2F2ZUxBTiBhZGFwdGVyCisgKglBbmRlcnMgS2xlbWV0cycgUENNQ0lBIFdhdmVMQU4gYWRhcHRlciBkcml2ZXIKKyAqCVJvYmVydCBNb3JyaXMnIEJTREkgZHJpdmVyIGZvciB0aGUgUENNQ0lBIFdhdmVMQU4gYWRhcHRlcgorICoKKyAqIEFkZGl0aW9uYWwgQ3JlZGl0czoKKyAqCisgKiAgICBUaGlzIHNvZnR3YXJlIHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZCB1bmRlciBMaW51eCAxLjIuMworICoJKFNsYWNrd2FyZSAyLjAgZGlzdHJpYnV0aW9uKS4KKyAqICAgIEFuZCB0aGVuIHVuZGVyIExpbnV4IDIuMC54IChEZWJpYW4gMS4xIC0+IDIuMiAtIHBjbWNpYSAyLjguMTgrKQorICoJd2l0aCBhbiBIUCBPbW5pQm9vayA0MDAwIGFuZCB0aGVuIGEgNTUwMC4KKyAqCisgKiAgICBJdCBpcyBiYXNlZCBvbiBvdGhlciBkZXZpY2UgZHJpdmVycyBhbmQgaW5mb3JtYXRpb24gZWl0aGVyIHdyaXR0ZW4KKyAqICAgIG9yIHN1cHBsaWVkIGJ5OgorICoJSmFtZXMgQXNodG9uIChqYWExMDFAc3lzZW5nLmFudS5lZHUuYXUpLAorICoJQWpheSBCYWtyZSAoYmFrcmVAcGF1bC5ydXRnZXJzLmVkdSksCisgKglEb25hbGQgQmVja2VyIChiZWNrZXJAc3VwZXIub3JnKSwKKyAqCUppbSBCaW5rbGV5IDxqcmJAY3MucGR4LmVkdT4sCisgKglMb2VrZSBCcmVkZXJ2ZWxkIDxsYnJlZGVydkB3YXZlbGFuLmNvbT4sCisgKglBbGxhbiBDcmVpZ2h0b24gKGFsbGFuY0Bjcy5zdS5vei5hdSksCisgKglCcmVudCBFbHBoaWNrIDxiZWxwaGlja0B1d2F0ZXJsb28uY2E+LAorICoJSm9lIEZpbm5leSA8am9lQGNvbXAubGFuY3MuYWMudWs+LAorICoJTWF0dGhldyBHZWllciAobWF0dGhld0Bjcy5zdS5vei5hdSksCisgKglSZW1vIGRpIEdpb3Zhbm5pIChyZW1vQGNzLnN1Lm96LmF1KSwKKyAqCU1hcmsgSGFnYW4gKG1oYWdhbkB3dGNwb3N0LmRheXRvbm9oLk5DUi5DT00pLAorICoJRGF2aWQgSGluZHMgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0PiwKKyAqCUphbiBIb29nZW5kb29ybiAoYy9vIG1hcnRlaWpuQGx1Y2VudC5jb20pLAorICogICAgICBCcnVjZSBKYW5zb24gPGJydWNlQGNzLnVzeWQuZWR1LmF1PiwKKyAqCUFudGhvbnkgRC4gSm9zZXBoIDxhZGpAbGNzLm1pdC5lZHU+LAorICoJQW5kZXJzIEtsZW1ldHMgKGtsZW1ldHNAcGF1bC5ydXRnZXJzLmVkdSksCisgKglZdW56aG91IExpIDx5dW56aG91QHN0cmF0LmlvbC51bmguZWR1PiwKKyAqCU1hcmMgTWVlcnRlbnMgKG1tZWVydGVuc0BsdWNlbnQuY29tKSwKKyAqCUtlaXRoIE1vb3JlLAorICoJUm9iZXJ0IE1vcnJpcyAocnRtQGRhcy5oYXJ2YXJkLmVkdSksCisgKglJYW4gUGFya2luIChpYW5AY3Muc3Uub3ouYXUpLAorICoJSm9obiBSb3NlbmJlcmcgKGpvaG5yQGNzLnN1Lm96LmF1KSwKKyAqCUdlb3JnZSBSb3NzaSAoZ2VvcmdlQHBobS5nb3YuYXUpLAorICoJQXJ0aHVyIFNjb3R0IChhcnRodXJAY3Muc3Uub3ouYXUpLAorICoJU3RhbmlzbGF2IFNpbnlhZ2luIDxzdGFzQGlzZi5ydT4KKyAqCVBldGVyIFN0b3JleSwKKyAqCUplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4sCisgKglHaXJpc2ggV2VsbGluZyAod2VsbGluZ0BwYXVsLnJ1dGdlcnMuZWR1KQorICoJQ2xhcmsgV29vZHdvcnRoIDxjbGFya0BoaXdheTEuZXhpdDEwOS5jb20+CisgKglZb25nZ3VhbmcgWmhhbmcgPHlnekBpc2wuaHJsLmhhYy5jb20+Li4uCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJTVBST1ZFTUVOVFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIEkgcHJvdWRseSBwcmVzZW50IDoKKyAqCisgKiBDaGFuZ2VzIG1hZGUgaW4gMi44LjIyIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gaW1wcm92ZWQgd3Zfc2V0X211bHRpY2FzdF9saXN0CisgKgktIGNhdGNoIHNwdXJpb3VzIGludGVycnVwdAorICoJLSBjb3JyZWN0IHJlbGVhc2Ugb2YgdGhlIGRldmljZQorICoKKyAqIENoYW5nZXMgbWFkZXMgaW4gcmVsZWFzZSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gUmVvcmdhbmlzYXRpb24gb2YgdGhlIGNvZGUsIGZ1bmN0aW9uIG5hbWUgY2hhbmdlCisgKgktIENyZWF0aW9uIG9mIHByaXZhdGUgaGVhZGVyICh3YXZlbGFuX2NzLmgpCisgKgktIFJlb3JnYW5pc2VkIGRlYnVnIG1lc3NhZ2VzCisgKgktIE1vcmUgY29tbWVudHMsIGhpc3RvcnksIC4uLgorICoJLSBDb25maWd1cmUgZWFybGllciAoaW4gImluc2VydCIgaW5zdGVhZCBvZiAib3BlbiIpCisgKiAgICAgICAgYW5kIGRvIHRoaW5ncyBvbmx5IG9uY2UKKyAqCS0gbW1jX2luaXQgOiBjb25maWd1cmUgdGhlIFBTQSBpZiBub3QgZG9uZQorICoJLSBtbWNfaW5pdCA6IDIuMDAgZGV0ZWN0aW9uIGJldHRlciBjb2RlIGZvciAyLjAwIGluaXQKKyAqCS0gYmV0dGVyIGluZm8gYXQgc3RhcnR1cAorICoJLSBDb3JyZWN0IGEgSFVHRSBidWcgKHZvbGF0aWxlICYgdW5jYWxpYnJhdGVkIGJ1c3kgbG9vcCkKKyAqCSAgaW4gd3ZfODI1OTNfY21kID0+IGNvbmZpZyBzcGVlZHVwCisgKgktIFN0b3AgcmVjZWl2aW5nICYgcG93ZXIgZG93biBvbiBjbG9zZSAoYW5kIHBvd2VyIHVwIG9uIG9wZW4pCisgKgkgIHVzZSAiaWZjb25maWcgZG93biIgJiAiaWZjb25maWcgdXAgOyByb3V0ZSBhZGQgLW5ldCAuLi4iCisgKgktIFNlbmQgcGFja2V0cyA6IGFkZCB3YXRjaGRvZyBpbnN0ZWFkIG9mIHBvb2xpbmcKKyAqCS0gUmVjZWl2ZSA6IGNoZWNrIGZyYW1lIHdyYXAgYXJvdW5kICYgdHJ5IHRvIHJlY292ZXIgc29tZSBmcmFtZXMKKyAqCS0gd2F2ZWxhbl9zZXRfbXVsdGljYXN0X2xpc3QgOiBhdm9pZCByZXNldAorICoJLSBhZGQgd2lyZWxlc3MgZXh0ZW5zaW9ucyAoaW9jdGwgJiBnZXRfd2lyZWxlc3Nfc3RhdHMpCisgKgkgIGdldC9zZXQgbndpZC9mcmVxdWVuY3kgb24gZmx5LCBpbmZvIGZvciAvcHJvYy9uZXQvd2lyZWxlc3MKKyAqCS0gU3VwcHJlc3MgdXNlbGVzcyBzdHVmZiBmcm9tIGxwIChuZXRfbG9jYWwpLCBidXQgYWRkIGxpbmsKKyAqCS0gTW9yZSBpbmxpbmVzCisgKgktIExvdCBvZiBvdGhlcnMgbWlub3IgZGV0YWlscyAmIGNsZWFudXBzCisgKgorICogQ2hhbmdlcyBtYWRlIGluIHNlY29uZCByZWxlYXNlIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBPcHRpbWlzZSB3dl84NTg5M19yZWNvbmZpZyBzdHVmZiwgZml4IHBvdGVudGlhbCBwcm9ibGVtcworICoJLSBDaGFuZ2UgZXJyb3IgdmFsdWVzIGZvciBpb2N0bAorICoJLSBOb24gYmxvY2tpbmcgd3ZfcnVfc3RvcCgpICsgY2FsbCB3dl9yZXNldCgpIGluIGNhc2Ugb2YgcHJvYmxlbXMKKyAqCS0gUmVtb3ZlIGRldmVsb3BtZW50IHByaW50ayBmcm9tIHdhdmVsYW5fd2F0Y2hkb2coKQorICoJLSBSZW1vdmUgb2YgdGhlIHdhdGNoZG9nIHRvIHdhdmVsYW5fY2xvc2UgaW5zdGVhZCBvZiB3YXZlbGFuX3JlbGVhc2UKKyAqCSAgZml4IHBvdGVudGlhbCBwcm9ibGVtcy4uLgorICoJLSBTdGFydCBkZWJ1Z2dpbmcgc3VzcGVuZCBzdHVmZiAoYnV0IGl0J3Mgc3RpbGwgYSBiaXQgd2VpcmQpCisgKgktIERlYnVnICYgb3B0aW1pemUgZHVtcCBoZWFkZXIvcGFja2V0IGluIFJ4ICYgVHggKGRlYnVnKQorICoJLSBVc2UgInJlYWRiIiBhbmQgIndyaXRlYiIgdG8gYmUga2VybmVsIDIuMSBjb21wbGlhbnQKKyAqCS0gQmV0dGVyIGhhbmRsaW5nIG9mIGJvZ3VzIGludGVycnVwdHMKKyAqCS0gV2lyZWxlc3MgZXh0ZW5zaW9uIDogU0VUU1BZIGFuZCBHRVRTUFkKKyAqCS0gUmVtb3ZlIG9sZCBzdHVmZiAoc3RhdHMgLSBmb3IgdGhvc2UgbmVlZGluZyBpdCwganVzdCBhc2sgbWUuLi4pCisgKgktIE1ha2Ugd2lyZWxlc3MgZXh0ZW5zaW9ucyBvcHRpb25hbAorICoKKyAqIENoYW5nZXMgbWFkZSBpbiB0aGlyZCByZWxlYXNlIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIGNsZWFudXBzICYgdHlwb3MKKyAqCS0gbW9kaWYgd2lyZWxlc3MgZXh0IChzcHkgLT4gb25seSBvbmUgcG9pbnRlcikKKyAqCS0gbmV3IHByaXZhdGUgaW9jdGwgdG8gc2V0L2dldCBxdWFsaXR5ICYgbGV2ZWwgdGhyZXNob2xkCisgKgktIEluaXQgOiBjb3JyZWN0IGRlZmF1bHQgdmFsdWUgb2YgbGV2ZWwgdGhyZXNob2xkIGZvciBwY21jaWEKKyAqCS0ga2lsbCB3YXRjaGRvZyBpbiBod19yZXNldAorICoJLSBtb3JlIDIuMSBzdXBwb3J0IChjb3B5X3RvL2Zyb21fdXNlciBpbnN0ZWFkIG9mIG1lbWNweV90by9mcm9tZnMpCisgKgktIEFkZCBtZXNzYWdlIGxldmVsIChkZWJ1ZyBzdHVmZiBpbiAvdmFyL2FkbS9kZWJ1ZyAmIGVycm9ycyBub3QKKyAqCSAgZGlzcGxheWVkIGF0IGNvbnNvbGUgYW5kIHN0aWxsIGluIC92YXIvYWRtL21lc3NhZ2VzKQorICoKKyAqIENoYW5nZXMgbWFkZSBpbiBmb3VydGggcmVsZWFzZSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gbXVsdGljYXN0IHN1cHBvcnQgKHllcyAhKSB0aGFua3MgdG8gWW9uZ2d1YW5nIFpoYW5nLgorICoKKyAqIENoYW5nZXMgbWFkZSBpbiBmaWZ0aCByZWxlYXNlICgyLjkuMCkgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBSZXZpc2l0ZWQgbXVsdGljYXN0IGNvZGUgKGl0IHdhcyBtb3N0bHkgd3JvbmcpLgorICoJLSBwcm90ZWN0IGNvZGUgaW4gd3ZfODI1OTNfcmVjb25maWcgd2l0aCBkZXYtPnRidXN5IChvdXBzICEpCisgKgorICogQ2hhbmdlcyBtYWRlIGluIHNpeHRoIHJlbGVhc2UgKDIuOS4xYSkgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gQ2hhbmdlIHRoZSBkZXRlY3Rpb24gY29kZSBmb3IgbXVsdGkgbWFudWZhY3R1cmVyIGNvZGUgc3VwcG9ydAorICoJLSBDb3JyZWN0IGJ1ZyAoaGFuZyBrZXJuZWwpIGluIGluaXQgd2hlbiB3ZSB3ZXJlICJyZWplY3RpbmciIGEgY2FyZCAKKyAqCisgKiBDaGFuZ2VzIG1hZGUgaW4gc2V2ZW50aCByZWxlYXNlICgyLjkuMWIpIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gVXBkYXRlIHRvIHdpcmVsZXNzIGV4dGVuc2lvbnMgY2hhbmdlcworICoJLSBTaWxseSBidWcgaW4gY2FyZCBpbml0aWFsIGNvbmZpZ3VyYXRpb24gKHBzYV9jb25mX3N0YXR1cykKKyAqCisgKiBDaGFuZ2VzIG1hZGUgaW4gZWlndGggcmVsZWFzZSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBTbWFsbCBidWcgaW4gZGVidWcgY29kZSAocHJvYmFibHkgbm90IHRoZSBsYXN0IG9uZS4uLikKKyAqCS0gMS4yLjEzIHN1cHBvcnQgKHRoYW5rcyB0byBDbGFyayBXb29kd29ydGgpCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDIuOS4yYiA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIExldmVsIHRocmVzaG9sZCBpcyBub3cgYSBzdGFuZGFyZCB3aXJlbGVzcyBleHRlbnNpb24gKHZlcnNpb24gNCAhKQorICoJLSBtb2R1bGVzIHBhcmFtZXRlcnMgdHlwZXMgZm9yIGtlcm5lbCA+IDIuMS4xNworICoJLSB1cGRhdGVkIG1hbiBwYWdlCisgKgktIE90aGVycyBjbGVhbnVwIGZyb20gRGF2aWQgSGluZHMKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMi45LjUgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIGJ5dGUgY291bnQgc3RhdHMgKGNvdXJ0ZXN5IG9mIERhdmlkIEhpbmRzKQorICoJLSBSZW1vdmUgZGV2X3RpbnQgc3R1ZmYgKGNvdXJ0ZXN5IG9mIERhdmlkIEhpbmRzKQorICoJLSBPdGhlcnMgY2xlYW51cCBmcm9tIERhdmlkIEhpbmRzCisgKgktIEVuY3J5cHRpb24gc2V0dGluZyBmcm9tIEJyZW50IEVscGhpY2sgKHRoYW5rcyBhIGxvdCAhKQorICoJLSAnYmFzZScgdG8gJ3VfbG9uZycgZm9yIHRoZSBBbHBoYSAodGhhbmtzIHRvIFN0YW5pc2xhdiBTaW55YWdpbikKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMi45LjYgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIGZpeCBidWcgOiBubyBsb25ndWVyIGRpc2FibGUgd2F0Y2hkb2cgaW4gY2FzZSBvZiBib2d1cyBpbnRlcnJ1cHQKKyAqCS0gaW5jcmVhc2UgdGltZW91dCBpbiBjb25maWcgY29kZSBmb3IgcGlja3kgaGFyZHdhcmUKKyAqCS0gbWFzayB1bnVzZWQgYml0cyBpbiBzdGF0dXMgKFdpcmVsZXNzIEV4dGVuc2lvbnMpCisgKgorICogQ2hhbmdlcyBpbnRlZ3JhdGVkIGJ5IEp1c3RpbiBTZWdlciA8anNlZ2VyQE1JVC5FRFU+ICYgRGF2aWQgSGluZHMgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gUm9hbWluZyAiaGFjayIgZnJvbSBKb2UgRmlubmV5IDxqb2VAY29tcC5sYW5jcy5hYy51az4KKyAqCS0gUFNBIENSQyBjb2RlIGZyb20gQm9iIEdyYXkgPHJncmF5QGJhbGQuY3MuZGFydG1vdXRoLmVkdT4KKyAqCS0gQmV0dGVyIGluaXRpYWxpc2F0aW9uIG9mIHRoZSBpODI1OTMgY29udHJvbGxlcgorICoJICBmcm9tIEpvc2VwaCBLLiBPJ1N1bGxpdmFuIDxqb3N1bGx2bitAY3MuY211LmVkdT4KKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMy4wLjEwIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gRml4IGVqZWN0ICJoYW5nIiBvZiB0aGUgZHJpdmVyIHVuZGVyIDIuMi5YIDoKKyAqCQlvIGNyZWF0ZSB3dl9mbHVzaF9zdGFsZV9saW5rcygpCisgKgkJbyBSZW5hbWUgd2F2ZWxhbl9yZWxlYXNlIHRvIHd2X3BjbWNpYV9yZWxlYXNlICYgbW92ZSB1cAorICoJCW8gbW92ZSB1bnJlZ2lzdGVyX25ldGRldiB0byB3YXZlbGFuX2RldGFjaCgpCisgKgkJbyB3YXZlbGFuX3JlbGVhc2UoKSBubyBsb25nZXIgY2FsbCB3YXZlbGFuX2RldGFjaCgpCisgKgkJbyBTdXBwcmVzcyAicmVsZWFzZSIgdGltZXIKKyAqCQlvIE90aGVyIGNsZWFudXBzICYgZml4ZXMKKyAqCS0gTmV3IE1BQyBhZGRyZXNzIGluIHRoZSBwcm9iZQorICoJLSBSZW9yZyBQU0FfQ1JDIGNvZGUgKGVuZGlhbiBuZXV0cmFsICYgY2xlYW5lcikKKyAqCS0gQ29ycmVjdCBpbml0aWFsaXNhdGlvbiBvZiB0aGUgaTgyNTkzIGZyb20gTHVjZW50IG1hbnVhbAorICoJLSBQdXQgYmFjayB0aGUgd2F0Y2hkb2csIHdpdGggbGFyZ2VyIHRpbWVvdXQKKyAqCS0gVFJBTlNNSVRfTk9fQ1JDIGlzIGEgIm5vcm1hbCIgZXJyb3IsIHNvIHJlY292ZXIgZnJvbSBpdAorICoJICBmcm9tIERlcnJpY2sgSiBCcmFzaGVhciA8c2hhZG93QGRlbWVudGlhLm9yZz4KKyAqCS0gQmV0dGVyIGhhbmRsaW5nIG9mIFRYIGFuZCBSWCBub3JtYWwgZmFpbHVyZSBjb25kaXRpb25zCisgKgktICNpZmRlZiBvdXQgYWxsIHRoZSByb2FtaW5nIGNvZGUKKyAqCS0gQWRkIEVTU0lEICYgIkFQIGN1cnJlbnQgYWRkcmVzcyIgaW9jdGwgc3R1YnMKKyAqCS0gR2VuZXJhbCBjbGVhbnVwIG9mIHRoZSBjb2RlCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDMuMC4xMyA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIFJlLWVuYWJsZSBjb21waWxhdGlvbiBvZiByb2FtaW5nIGNvZGUgYnkgZGVmYXVsdCwgYnV0IHdpdGgKKyAqCSAgZG9fcm9hbWluZyA9IDAKKyAqCS0gTnVrZSBgbndpZD1ud2lkXm50b2hzKGJlYWNvbi0+ZG9tYWluX2lkKScgaW4gd2xfcm9hbV9nYXRoZXIKKyAqCSAgYXQgdGhlIGRlbWFuZCBvZiBKb2huIENhcm9sIExhbmdmb3JkIDxqY2xAZ3MxNzYuc3AuY3MuY211LmVkdT4KKyAqCS0gSW50cm9kdWNlZCBXQVZFTEFOX1JPQU1JTkdfRVhUIGZvciBpbmNvbXBsZXRlIEVTU0lEIHN0dWZmLgorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAzLjAuMTUgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBDaGFuZ2UgZS1tYWlsIGFuZCB3ZWIgcGFnZSBhZGRyZXNzZXMKKyAqCS0gV2F0Y2hkb2cgdGltZXIgaXMgbm93IGNvcnJlY3RseSBleHByZXNzZWQgaW4gSFosIG5vdCBpbiBqaWZmaWVzCisgKgktIEFkZCBjaGFubmVsIG51bWJlciB0byB0aGUgbGlzdCBvZiBmcmVxdWVuY2llcyBpbiByYW5nZQorICoJLSBBZGQgdGhlIChzaG9ydCkgbGlzdCBvZiBiaXQtcmF0ZXMgaW4gcmFuZ2UKKyAqCS0gRGV2ZWxvcHAgYSBuZXcgc2Vuc2l0aXZpdHkuLi4gKHNlbnMudmFsdWUgJiBzZW5zLmZpeGVkKQorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAzLjEuMiA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gRml4IGNoZWNrIGZvciByb290IHBlcm1pc3Npb24gKGJyZWFrIGluc3RlYWQgb2YgZXhpdCkKKyAqCS0gTmV3IG53aWQgJiBlbmNvZGluZyBzZXR0aW5nIChXaXJlbGVzcyBFeHRlbnNpb24gOSkKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMy4xLjEyIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gcmV3b3JrZWQgd3ZfODI1OTNfY21kIHRvIGF2b2lkIHVzaW5nIHRoZSBJUlEgaGFuZGxlciBhbmQgZG9pbmcKKyAqCSAgdWdseSB0aGluZ3Mgd2l0aCBpbnRlcnJ1cHRzLgorICoJLSBBZGQgSVJRIHByb3RlY3Rpb24gaW4gODI1OTNfY29uZmlnL3J1X3N0YXJ0L3J1X3N0b3Avd2F0Y2hkb2cKKyAqCS0gVXBkYXRlIHRvIG5ldyBuZXR3b3JrIEFQSSAoc29mdG5ldCAtIDIuMy40MykgOgorICoJCW8gcmVwbGFjZSBkZXYtPnRidXN5IChEYXZpZCArIG1lKQorICoJCW8gcmVwbGFjZSBkZXYtPnRzdGFydCAoRGF2aWQgKyBtZSkKKyAqCQlvIHJlbW92ZSBkZXYtPmludGVycnVwdCAoRGF2aWQpCisgKgkJbyBhZGQgU01QIGxvY2tpbmcgdmlhIHNwaW5sb2NrIGluIHNwbHh4IChtZSkKKyAqCQlvIGFkZCBzcGlubG9jayBpbiBpbnRlcnJ1cHQgaGFuZGxlciAobWUpCisgKgkJbyB1c2Uga2VybmVsIHdhdGNoZG9nIGluc3RlYWQgb2Ygb3VycyAobWUpCisgKgkJbyB2ZXJpZnkgdGhhdCBhbGwgdGhlIGNoYW5nZXMgbWFrZSBzZW5zZSBhbmQgd29yayAobWUpCisgKgktIFJlLXN5bmMga2VybmVsL3BjbWNpYSB2ZXJzaW9ucyAobm90IG11Y2ggYWN0dWFsbHkpCisgKgktIEEgZmV3IG90aGVyIGNsZWFudXBzIChEYXZpZCAmIG1lKS4uLgorICoKKyAqIENoYW5nZXMgbWFkZSBmb3IgcmVsZWFzZSBpbiAzLjEuMjIgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJLSBDaGVjayB0aGF0IFNNUCB3b3JrcywgcmVtb3ZlIGFubm95aW5nIGxvZyBtZXNzYWdlCisgKgorICogQ2hhbmdlcyBtYWRlIGZvciByZWxlYXNlIGluIDMuMS4yNCA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIEZpeCB1bmZyZXF1ZW50IGNhcmQgbG9ja3VwIHdoZW4gd2F0Y2hkb2cgd2FzIHJlc2V0aW5nIHRoZSBoYXJkd2FyZSA6CisgKgkJbyBjb250cm9sIGZpcnN0IGJ1c3kgbG9vcCBpbiB3dl84MjU5M19jbWQoKQorICoJCW8gRXh0ZW5kIHNwaW5sb2NrIHByb3RlY3Rpb24gaW4gd3ZfaHdfY29uZmlnKCkKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMy4xLjMzIDoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gT3B0aW9uYWwgdXNlIG5ldyBkcml2ZXIgQVBJIGZvciBXaXJlbGVzcyBFeHRlbnNpb25zIDoKKyAqCQlvIGdvdCByaWQgb2Ygd2F2ZWxhbl9pb2N0bCgpCisgKgkJbyB1c2UgYSBidW5jaCBvZiBpd19oYW5kbGVyIGluc3RlYWQKKyAqCisgKiBDaGFuZ2VzIG1hZGUgZm9yIHJlbGVhc2UgaW4gMy4yLjEgOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgktIFNldCBkZXYtPnRyYW5zX3N0YXJ0IHRvIGF2b2lkIGZpbGxpbmcgdGhlIGxvZ3MKKyAqCQkoYW5kIGdlbmVyYXRpbmcgdXNlbGVzcyBhYm9ydCBjb21tYW5kcykKKyAqCS0gQXZvaWQgZGVhZGxvY2tzIGluIG1tY19vdXQoKS9tbWNfaW4oKQorICoKKyAqIFdpc2hlcyAmIGRyZWFtczoKKyAqIC0tLS0tLS0tLS0tLS0tLS0KKyAqCS0gQ2xlYW51cCBhbmQgaW50ZWdyYXRlIHRoZSByb2FtaW5nIGNvZGUKKyAqCSAgKHN0ZCBkZWJ1Zywgc2V0IERvbWFpbklELCBkZWNheSBhdmcgYW5kIGNvLi4uKQorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJTkNMVURFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTGludXggaGVhZGVycyB0aGF0IHdlIG5lZWQgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisKKyNpZmRlZiBDT05GSUdfTkVUX1JBRElPCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4JCS8qIFdpcmVsZXNzIGV4dGVuc2lvbnMgKi8KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgkJLyogTmV3IGRyaXZlciBBUEkgKi8KKyNlbmRpZgorCisvKiBQY21jaWEgaGVhZGVycyB0aGF0IHdlIG5lZWQgKi8KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CisKKy8qIFdhdmVsYW4gZGVjbGFyYXRpb25zICovCisjaW5jbHVkZSAiaTgyNTkzLmgiCS8qIERlZmluaXRpb25zIGZvciB0aGUgSW50ZWwgY2hpcCAqLworCisjaW5jbHVkZSAid2F2ZWxhbl9jcy5oIgkvKiBPdGhlcnMgYml0cyBvZiB0aGUgaGFyZHdhcmUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIERSSVZFUiBPUFRJT05TICoqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGAjZGVmaW5lJyBvciBgI3VuZGVmJyB0aGUgZm9sbG93aW5nIGNvbnN0YW50IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3VyCisgKiBvZiB0aGUgZHJpdmVyLi4uCisgKi8KKyNkZWZpbmUgV0FWRUxBTl9ST0FNSU5HCQkvKiBJbmNsdWRlIGV4cGVyaW1lbnRhbCByb2FtaW5nIGNvZGUgKi8KKyN1bmRlZiBXQVZFTEFOX1JPQU1JTkdfRVhUCS8qIEVuYWJsZSByb2FtaW5nIHdpcmVsZXNzIGV4dGVuc2lvbnMgKi8KKyN1bmRlZiBTRVRfUFNBX0NSQwkJLyogU2V0IHRoZSBDUkMgaW4gUFNBIChzbG93ZXIpICovCisjZGVmaW5lIFVTRV9QU0FfQ09ORklHCQkvKiBVc2UgaW5mbyBmcm9tIHRoZSBQU0EgKi8KKyN1bmRlZiBTVFJVQ1RfQ0hFQ0sJCS8qIFZlcmlmeSBwYWRkaW5nIG9mIHN0cnVjdHVyZXMgKi8KKyN1bmRlZiBFRVBST01fSVNfUFJPVEVDVEVECS8qIERvZXNuJ3Qgc2VlbSB0byBiZSBuZWNlc3NhcnkgKi8KKyNkZWZpbmUgTVVMVElDQVNUX0FWT0lECQkvKiBBdm9pZCBleHRyYSBtdWx0aWNhc3QgKEknbSBzY2VwdGljYWwpICovCisjdW5kZWYgU0VUX01BQ19BRERSRVNTCQkvKiBFeHBlcmltZW50YWwgKi8KKworI2lmZGVmIFdJUkVMRVNTX0VYVAkvKiBJZiB3aXJlbGVzcyBleHRlbnNpb24gZXhpc3QgaW4gdGhlIGtlcm5lbCAqLworLyogV2FybmluZyA6IHRoZXNlIHN0dWZmIHdpbGwgc2xvdyBkb3duIHRoZSBkcml2ZXIuLi4gKi8KKyNkZWZpbmUgV0lSRUxFU1NfU1BZCQkvKiBFbmFibGUgc3B5aW5nIGFkZHJlc3NlcyAqLworI3VuZGVmIEhJU1RPR1JBTQkJLyogRW5hYmxlIGhpc3RvZ3JhbSBvZiBzaWcgbGV2ZWwuLi4gKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERFQlVHICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI3VuZGVmIERFQlVHX01PRFVMRV9UUkFDRQkvKiBNb2R1bGUgaW5zZXJ0aW9uL3JlbW92YWwgKi8KKyN1bmRlZiBERUJVR19DQUxMQkFDS19UUkFDRQkvKiBDYWxscyBtYWRlIGJ5IExpbnV4ICovCisjdW5kZWYgREVCVUdfSU5URVJSVVBUX1RSQUNFCS8qIENhbGxzIHRvIGhhbmRsZXIgKi8KKyN1bmRlZiBERUJVR19JTlRFUlJVUFRfSU5GTwkvKiB0eXBlIG9mIGludGVycnVwdCAmIHNvIG9uICovCisjZGVmaW5lIERFQlVHX0lOVEVSUlVQVF9FUlJPUgkvKiBwcm9ibGVtcyAqLworI3VuZGVmIERFQlVHX0NPTkZJR19UUkFDRQkvKiBUcmFjZSB0aGUgY29uZmlnIGZ1bmN0aW9ucyAqLworI3VuZGVmIERFQlVHX0NPTkZJR19JTkZPCS8qIFdoYXQncyBnb2luZyBvbi4uLiAqLworI2RlZmluZSBERUJVR19DT05GSUdfRVJST1JTCS8qIEVycm9ycyBvbiBjb25maWd1cmF0aW9uICovCisjdW5kZWYgREVCVUdfVFhfVFJBQ0UJCS8qIFRyYW5zbWlzc2lvbiBjYWxscyAqLworI3VuZGVmIERFQlVHX1RYX0lORk8JCS8qIEhlYWRlciBvZiB0aGUgdHJhbnNtaXR0ZWQgcGFja2V0ICovCisjdW5kZWYgREVCVUdfVFhfRkFJTAkJLyogTm9ybWFsIGZhaWx1cmUgY29uZGl0aW9ucyAqLworI2RlZmluZSBERUJVR19UWF9FUlJPUgkJLyogVW5leHBlY3RlZCBjb25kaXRpb25zICovCisjdW5kZWYgREVCVUdfUlhfVFJBQ0UJCS8qIFRyYW5zbWlzc2lvbiBjYWxscyAqLworI3VuZGVmIERFQlVHX1JYX0lORk8JCS8qIEhlYWRlciBvZiB0aGUgdHJhbnNtaXR0ZWQgcGFja2V0ICovCisjdW5kZWYgREVCVUdfUlhfRkFJTAkJLyogTm9ybWFsIGZhaWx1cmUgY29uZGl0aW9ucyAqLworI2RlZmluZSBERUJVR19SWF9FUlJPUgkJLyogVW5leHBlY3RlZCBjb25kaXRpb25zICovCisjdW5kZWYgREVCVUdfUEFDS0VUX0RVTVAJLyogRHVtcCBwYWNrZXQgb24gdGhlIHNjcmVlbiAqLworI3VuZGVmIERFQlVHX0lPQ1RMX1RSQUNFCS8qIE1pc2MgY2FsbCBieSBMaW51eCAqLworI3VuZGVmIERFQlVHX0lPQ1RMX0lORk8JCS8qIFZhcmlvdXMgZGVidWcgaW5mbyAqLworI2RlZmluZSBERUJVR19JT0NUTF9FUlJPUgkvKiBXaGF0J3MgZ29pbmcgd3JvbmcgKi8KKyNkZWZpbmUgREVCVUdfQkFTSUNfU0hPVwkvKiBTaG93IGJhc2ljIHN0YXJ0dXAgaW5mbyAqLworI3VuZGVmIERFQlVHX1ZFUlNJT05fU0hPVwkvKiBQcmludCB2ZXJzaW9uIGluZm8gKi8KKyN1bmRlZiBERUJVR19QU0FfU0hPVwkJLyogRHVtcCBwc2EgdG8gc2NyZWVuICovCisjdW5kZWYgREVCVUdfTU1DX1NIT1cJCS8qIER1bXAgbW1jIHRvIHNjcmVlbiAqLworI3VuZGVmIERFQlVHX1NIT1dfVU5VU0VECS8qIFNob3cgYWxzbyB1bnVzZWQgZmllbGRzICovCisjdW5kZWYgREVCVUdfSTgyNTkzX1NIT1cJLyogU2hvdyBpODI1OTMgc3RhdHVzICovCisjdW5kZWYgREVCVUdfREVWSUNFX1NIT1cJLyogU2hvdyBkZXZpY2UgcGFyYW1ldGVycyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqIENPTlNUQU5UUyAmIE1BQ1JPUyAqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBERUJVR19WRVJTSU9OX1NIT1cKK3N0YXRpYyBjb25zdCBjaGFyICp2ZXJzaW9uID0gIndhdmVsYW5fY3MuYyA6IHYyNCAoU01QICsgd2lyZWxlc3MgZXh0ZW5zaW9ucykgMTEvMS8wMlxuIjsKKyNlbmRpZgorCisvKiBXYXRjaGRvZyB0ZW1wb3Jpc2F0aW9uICovCisjZGVmaW5lCVdBVENIRE9HX0pJRkZJRVMJKDI1NipIWi8xMDApCisKKy8qIEZpeCBhIGJ1ZyBpbiBzb21lIG9sZCB3aXJlbGVzcyBleHRlbnNpb24gZGVmaW5pdGlvbnMgKi8KKyNpZm5kZWYgSVdfRVNTSURfTUFYX1NJWkUKKyNkZWZpbmUgSVdfRVNTSURfTUFYX1NJWkUJMzIKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUFJJVkFURSBJT0NUTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBTSU9DU0lQUVRIUglTSU9DSVdGSVJTVFBSSVYJCS8qIFNldCBxdWFsaXR5IHRocmVzaG9sZCAqLworI2RlZmluZSBTSU9DR0lQUVRIUglTSU9DSVdGSVJTVFBSSVYgKyAxCS8qIEdldCBxdWFsaXR5IHRocmVzaG9sZCAqLworI2RlZmluZSBTSU9DU0lQUk9BTSAgICAgU0lPQ0lXRklSU1RQUklWICsgMgkvKiBTZXQgcm9hbWluZyBzdGF0ZSAqLworI2RlZmluZSBTSU9DR0lQUk9BTSAgICAgU0lPQ0lXRklSU1RQUklWICsgMwkvKiBHZXQgcm9hbWluZyBzdGF0ZSAqLworCisjZGVmaW5lIFNJT0NTSVBISVNUTwlTSU9DSVdGSVJTVFBSSVYgKyA0CS8qIFNldCBoaXN0b2dyYW0gcmFuZ2VzICovCisjZGVmaW5lIFNJT0NHSVBISVNUTwlTSU9DSVdGSVJTVFBSSVYgKyA1CS8qIEdldCBoaXN0b2dyYW0gdmFsdWVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogV2F2ZUxBTiBSb2FtaW5nICAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZmRlZiBXQVZFTEFOX1JPQU1JTkcJCS8qIENvbmRpdGlvbmFsIGNvbXBpbGUsIHNlZSBhYm92ZSBpbiBvcHRpb25zICovCisKKyNkZWZpbmUgV0FWRUxBTl9ST0FNSU5HX0RFQlVHCSAwCS8qIDEgPSBUcmFjZSBvZiBoYW5kb3ZlciBkZWNpc2lvbnMgKi8KKwkJCQkJLyogMiA9IEluZm8gb24gZWFjaCBiZWFjb24gcmN2ZC4uLiAqLworI2RlZmluZSBNQVhfV0FWRVBPSU5UUwkJNwkvKiBNYXggdmlzaWJsZSBhdCBvbmUgdGltZSAqLworI2RlZmluZSBXQVZFUE9JTlRfSElTVE9SWQk1CS8qIFNOUiBzYW1wbGUgaGlzdG9yeSBzbG93IHNlYXJjaCAqLworI2RlZmluZSBXQVZFUE9JTlRfRkFTVF9ISVNUT1JZCTIJLyogU05SIHNhbXBsZSBoaXN0b3J5IGZhc3Qgc2VhcmNoICovCisjZGVmaW5lIFNFQVJDSF9USFJFU0hfTE9XCTEwCS8qIFNOUiB0byBlbnRlciBjZWxsIHNlYXJjaCAqLworI2RlZmluZSBTRUFSQ0hfVEhSRVNIX0hJR0gJMTMJLyogU05SIHRvIGxlYXZlIGNlbGwgc2VhcmNoICovCisjZGVmaW5lIFdBVkVMQU5fUk9BTUlOR19ERUxUQQkxCS8qIEh5c3RlcmVzaXMgdmFsdWUgKCsvLSBTTlIpICovCisjZGVmaW5lIENFTExfVElNRU9VVAkJMipIWgkvKiBpbiBqaWZmaWVzICovCisKKyNkZWZpbmUgRkFTVF9DRUxMX1NFQVJDSAkxCS8qIEJvb2xlYW4gdmFsdWVzLi4uICovCisjZGVmaW5lIE5XSURfUFJPTUlTQwkJMQkvKiBmb3IgY29kZSBjbGFyaXR5LiAqLworCit0eXBlZGVmIHN0cnVjdCB3YXZlcG9pbnRfYmVhY29uCit7CisgIHVuc2lnbmVkIGNoYXIJCWRzYXAsCQkvKiBVbnVzZWQgKi8KKwkJCXNzYXAsCQkvKiBVbnVzZWQgKi8KKwkJCWN0cmwsCQkvKiBVbnVzZWQgKi8KKwkJCU8sVSxJLAkJLyogVW51c2VkICovCisJCQlzcGVjX2lkMSwJLyogVW51c2VkICovCisJCQlzcGVjX2lkMiwJLyogVW51c2VkICovCisJCQlwZHVfdHlwZSwJLyogVW51c2VkICovCisJCQlzZXE7CQkvKiBXYXZlUG9pbnQgYmVhY29uIHNlcXVlbmNlIG51bWJlciAqLworICB1bnNpZ25lZCBzaG9ydAlkb21haW5faWQsCS8qIFdhdmVQb2ludCBEb21haW4gSUQgKi8KKwkJCW53aWQ7CQkvKiBXYXZlUG9pbnQgTldJRCAqLworfSB3YXZlcG9pbnRfYmVhY29uOworCit0eXBlZGVmIHN0cnVjdCB3YXZlcG9pbnRfaGlzdG9yeQoreworICB1bnNpZ25lZCBzaG9ydAlud2lkOwkJLyogV2F2ZVBvaW50J3MgTldJRCAqLworICBpbnQJCQlhdmVyYWdlX3Nsb3c7CS8qIFNOUiBydW5uaW5nIGF2ZXJhZ2UgKi8KKyAgaW50CQkJYXZlcmFnZV9mYXN0OwkvKiBTTlIgcnVubmluZyBhdmVyYWdlICovCisgIHVuc2lnbmVkIGNoYXIJICBzaWdxdWFsW1dBVkVQT0lOVF9ISVNUT1JZXTsgLyogUmluZ2J1ZmZlciBvZiByZWNlbnQgU05SJ3MgKi8KKyAgdW5zaWduZWQgY2hhcgkJcXVhbHB0cjsJLyogSW5kZXggaW50byByaW5nYnVmZmVyICovCisgIHVuc2lnbmVkIGNoYXIJCWxhc3Rfc2VxOwkvKiBMYXN0IHNlcS4gbm8gc2VlbiBmb3IgV2F2ZVBvaW50ICovCisgIHN0cnVjdCB3YXZlcG9pbnRfaGlzdG9yeSAqbmV4dDsJLyogTmV4dCBXYXZlUG9pbnQgaW4gdGFibGUgKi8KKyAgc3RydWN0IHdhdmVwb2ludF9oaXN0b3J5ICpwcmV2OwkvKiBQcmV2aW91cyBXYXZlUG9pbnQgaW4gdGFibGUgKi8KKyAgdW5zaWduZWQgbG9uZwkJbGFzdF9zZWVuOwkvKiBUaW1lIG9mIGxhc3QgYmVhY29uIHJlY3ZkLCBqaWZmaWVzICovCit9IHdhdmVwb2ludF9oaXN0b3J5OworCitzdHJ1Y3Qgd2F2ZXBvaW50X3RhYmxlCit7CisgIHdhdmVwb2ludF9oaXN0b3J5CSpoZWFkOwkJLyogU3RhcnQgb2YgcmluZ2J1ZmZlciAqLworICBpbnQJCQludW1fd2F2ZXBvaW50czsJLyogTm8uIG9mIFdhdmVQb2ludHMgdmlzaWJsZSAqLworICB1bnNpZ25lZCBjaGFyCQlsb2NrZWQ7CQkvKiBUYWJsZSBsb2NrICovCit9OworCisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVFlQRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTaG9ydGN1dHMgKi8KK3R5cGVkZWYgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJZW5fc3RhdHM7Cit0eXBlZGVmIHN0cnVjdCBpd19zdGF0aXN0aWNzCWl3X3N0YXRzOwordHlwZWRlZiBzdHJ1Y3QgaXdfcXVhbGl0eQlpd19xdWFsOwordHlwZWRlZiBzdHJ1Y3QgaXdfZnJlcQkJaXdfZnJlcTsKK3R5cGVkZWYgc3RydWN0IG5ldF9sb2NhbAluZXRfbG9jYWw7Cit0eXBlZGVmIHN0cnVjdCB0aW1lcl9saXN0CXRpbWVyX2xpc3Q7CisKKy8qIEJhc2ljIHR5cGVzICovCit0eXBlZGVmIHVfY2hhcgkJbWFjX2FkZHJbV0FWRUxBTl9BRERSX1NJWkVdOwkvKiBIYXJkd2FyZSBhZGRyZXNzICovCisKKy8qCisgKiBTdGF0aWMgc3BlY2lmaWMgZGF0YSBmb3IgdGhlIGludGVyZmFjZS4KKyAqCisgKiBGb3IgZWFjaCBuZXR3b3JrIGludGVyZmFjZSwgTGludXgga2VlcCBkYXRhIGluIHR3byBzdHJ1Y3R1cmUuICJkZXZpY2UiCisgKiBrZWVwIHRoZSBnZW5lcmljIGRhdGEgKHNhbWUgZm9ybWF0IGZvciBldmVyeWJvZHkpIGFuZCAibmV0X2xvY2FsIiBrZWVwCisgKiB0aGUgYWRkaXRpb25hbCBzcGVjaWZpYyBkYXRhLgorICogTm90ZSB0aGF0IHNvbWUgb2YgdGhpcyBzcGVjaWZpYyBkYXRhIGlzIGluIGZhY3QgZ2VuZXJpYyAoZW5fc3RhdHMsIGZvcgorICogZXhhbXBsZSkuCisgKi8KK3N0cnVjdCBuZXRfbG9jYWwKK3sKKyAgZGV2X25vZGVfdCAJbm9kZTsJCS8qID8/Pz8gV2hhdCBpcyB0aGlzIHN0dWZmID8/Pz8gKi8KKyAgc3RydWN0IG5ldF9kZXZpY2UgKglkZXY7CQkvKiBSZXZlcnNlIGxpbmsuLi4gKi8KKyAgc3BpbmxvY2tfdAlzcGlubG9jazsJLyogU2VyaWFsaXplIGFjY2VzcyB0byB0aGUgaGFyZHdhcmUgKFNNUCkgKi8KKyAgZGV2X2xpbmtfdCAqCWxpbms7CQkvKiBwY21jaWEgc3RydWN0dXJlICovCisgIGVuX3N0YXRzCXN0YXRzOwkJLyogRXRoZXJuZXQgaW50ZXJmYWNlIHN0YXRpc3RpY3MgKi8KKyAgaW50CQlucmVzZXRzOwkvKiBOdW1iZXIgb2YgaHcgcmVzZXRzICovCisgIHVfY2hhcgljb25maWd1cmVkOwkvKiBJZiBpdCBpcyBjb25maWd1cmVkICovCisgIHVfY2hhcglyZWNvbmZpZ184MjU5MzsJLyogTmVlZCB0byByZWNvbmZpZ3VyZSB0aGUgY29udHJvbGxlciAqLworICB1X2NoYXIJcHJvbWlzY3VvdXM7CS8qIFByb21pc2N1b3VzIG1vZGUgKi8KKyAgdV9jaGFyCWFsbG11bHRpY2FzdDsJLyogQWxsIE11bHRpY2FzdCBtb2RlICovCisgIGludAkJbWNfY291bnQ7CS8qIE51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzICovCisKKyAgaW50ICAgCXN0b3A7CQkvKiBDdXJyZW50IGk4MjU5MyBTdG9wIEhpdCBSZWdpc3RlciAqLworICBpbnQgICAJcmZwOwkJLyogTGFzdCBETUEgbWFjaGluZSByZWNlaXZlIHBvaW50ZXIgKi8KKyAgaW50CQlvdmVycnVubmluZzsJLyogUmVjZWl2ZXIgb3ZlcnJ1biBmbGFnICovCisKKyNpZmRlZiBXSVJFTEVTU19FWFQKKyAgaXdfc3RhdHMJd3N0YXRzOwkJLyogV2lyZWxlc3Mgc3BlY2lmaWMgc3RhdHMgKi8KKworICBzdHJ1Y3QgaXdfc3B5X2RhdGEJc3B5X2RhdGE7CisgIHN0cnVjdCBpd19wdWJsaWNfZGF0YQl3aXJlbGVzc19kYXRhOworI2VuZGlmCisKKyNpZmRlZiBISVNUT0dSQU0KKyAgaW50CQloaXNfbnVtYmVyOwkJLyogTnVtYmVyIG9mIGludGVydmFscyAqLworICB1X2NoYXIJaGlzX3JhbmdlWzE2XTsJCS8qIEJvdW5kYXJpZXMgb2YgaW50ZXJ2YWwgXW4tMTsgbl0gKi8KKyAgdV9sb25nCWhpc19zdW1bMTZdOwkJLyogU3VtIGluIGludGVydmFsICovCisjZW5kaWYJLyogSElTVE9HUkFNICovCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisgIHVfbG9uZwlkb21haW5faWQ7CS8qIERvbWFpbiBJRCB3ZSBsb2NrIG9uIGZvciByb2FtaW5nICovCisgIGludAkJZmlsdGVyX2RvbWFpbnM7CS8qIENoZWNrIERvbWFpbiBJRCBvZiBiZWFjb24gZm91bmQgKi8KKyBzdHJ1Y3Qgd2F2ZXBvaW50X3RhYmxlCXdhdmVwb2ludF90YWJsZTsJLyogVGFibGUgb2YgdmlzaWJsZSBXYXZlUG9pbnRzKi8KKyAgd2F2ZXBvaW50X2hpc3RvcnkgKgljdXJyX3BvaW50OwkJLyogQ3VycmVudCB3YXZlcG9pbnQgKi8KKyAgaW50CQkJY2VsbF9zZWFyY2g7CQkvKiBTZWFyY2hpbmcgZm9yIG5ldyBjZWxsPyAqLworICBzdHJ1Y3QgdGltZXJfbGlzdAljZWxsX3RpbWVyOwkJLyogR2FyYmFnZSBjb2xsZWN0aW9uICovCisjZW5kaWYJLyogV0FWRUxBTl9ST0FNSU5HICovCisgIHZvaWQgX19pb21lbSAqbWVtOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogUFJPVE9UWVBFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgV0FWRUxBTl9ST0FNSU5HCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJPQU1JTkcgU1VCUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit3YXZlcG9pbnRfaGlzdG9yeSAqd2xfcm9hbV9jaGVjayh1bnNpZ25lZCBzaG9ydCBud2lkLCBuZXRfbG9jYWwgKmxwKTsKK3dhdmVwb2ludF9oaXN0b3J5ICp3bF9uZXdfd2F2ZXBvaW50KHVuc2lnbmVkIHNob3J0IG53aWQsIHVuc2lnbmVkIGNoYXIgc2VxLCBuZXRfbG9jYWwgKmxwKTsKK3ZvaWQgd2xfZGVsX3dhdmVwb2ludCh3YXZlcG9pbnRfaGlzdG9yeSAqd2F2ZXBvaW50LCBuZXRfbG9jYWwgKmxwKTsKK3ZvaWQgd2xfY2VsbF9leHBpcnkodW5zaWduZWQgbG9uZyBkYXRhKTsKK3dhdmVwb2ludF9oaXN0b3J5ICp3bF9iZXN0X3NpZ3F1YWwoaW50IGZhc3Rfc2VhcmNoLCBuZXRfbG9jYWwgKmxwKTsKK3ZvaWQgd2xfdXBkYXRlX2hpc3Rvcnkod2F2ZXBvaW50X2hpc3RvcnkgKndhdmVwb2ludCwgdW5zaWduZWQgY2hhciBzaWdxdWFsLCB1bnNpZ25lZCBjaGFyIHNlcSk7Cit2b2lkIHd2X3JvYW1faGFuZG92ZXIod2F2ZXBvaW50X2hpc3RvcnkgKndhdmVwb2ludCwgbmV0X2xvY2FsICpscCk7Cit2b2lkIHd2X253aWRfZmlsdGVyKHVuc2lnbmVkIGNoYXIgbW9kZSwgbmV0X2xvY2FsICpscCk7Cit2b2lkIHd2X3JvYW1faW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgd3Zfcm9hbV9jbGVhbnVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworI2VuZGlmCS8qIFdBVkVMQU5fUk9BTUlORyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLSBNT0RFTSBNQU5BR0VNRU5UIFNVQlJPVVRJTkVTIC0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW5saW5lIHVfY2hhcgkJLyogZGF0YSAqLworCWhhc3JfcmVhZCh1X2xvbmcpOwkvKiBSZWFkIHRoZSBob3N0IGludGVyZmFjZSA6IGJhc2UgYWRkcmVzcyAqLworc3RhdGljIGlubGluZSB2b2lkCisJaGFjcl93cml0ZSh1X2xvbmcsCS8qIFdyaXRlIHRvIGhvc3QgaW50ZXJmYWNlIDogYmFzZSBhZGRyZXNzICovCisJCSAgIHVfY2hhciksCS8qIGRhdGEgKi8KKwloYWNyX3dyaXRlX3Nsb3codV9sb25nLAorCQkgICB1X2NoYXIpOworc3RhdGljIHZvaWQKKwlwc2FfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqLAkvKiBSZWFkIHRoZSBQYXJhbWV0ZXIgU3RvcmFnZSBBcmVhICovCisJCSBpbnQsCQkvKiBvZmZzZXQgaW4gUFNBICovCisJCSB1X2NoYXIgKiwJLyogYnVmZmVyIHRvIGZpbGwgKi8KKwkJIGludCksCQkvKiBzaXplIHRvIHJlYWQgKi8KKwlwc2Ffd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKiwJLyogV3JpdGUgdG8gdGhlIFBTQSAqLworCQkgIGludCwJCS8qIE9mZnNldCBpbiBwc2EgKi8KKwkJICB1X2NoYXIgKiwJLyogQnVmZmVyIGluIG1lbW9yeSAqLworCQkgIGludCk7CQkvKiBMZW5ndGggb2YgYnVmZmVyICovCitzdGF0aWMgaW5saW5lIHZvaWQKKwltbWNfb3V0KHVfbG9uZywJCS8qIFdyaXRlIDEgYnl0ZSB0byB0aGUgTW9kZW0gTWFuYWcgQ29udHJvbCAqLworCQl1X3Nob3J0LAorCQl1X2NoYXIpLAorCW1tY193cml0ZSh1X2xvbmcsCS8qIFdyaXRlIG4gYnl0ZXMgdG8gdGhlIE1NQyAqLworCQkgIHVfY2hhciwKKwkJICB1X2NoYXIgKiwKKwkJICBpbnQpOworc3RhdGljIGlubGluZSB1X2NoYXIJCS8qIFJlYWQgMSBieXRlIGZyb20gdGhlIE1NQyAqLworCW1tY19pbih1X2xvbmcsCisJICAgICAgIHVfc2hvcnQpOworc3RhdGljIGlubGluZSB2b2lkCisJbW1jX3JlYWQodV9sb25nLAkvKiBSZWFkIG4gYnl0ZXMgZnJvbSB0aGUgTU1DICovCisJCSB1X2NoYXIsCisJCSB1X2NoYXIgKiwKKwkJIGludCksCisJZmVlX3dhaXQodV9sb25nLAkvKiBXYWl0IGZvciBmcmVxdWVuY3kgRUVwcm9tIDogYmFzZSBhZGRyZXNzICovCisJCSBpbnQsCQkvKiBCYXNlIGRlbGF5IHRvIHdhaXQgZm9yICovCisJCSBpbnQpOwkJLyogTnVtYmVyIG9mIHRpbWUgdG8gd2FpdCAqLworc3RhdGljIHZvaWQKKwlmZWVfcmVhZCh1X2xvbmcsCS8qIFJlYWQgdGhlIGZyZXF1ZW5jeSBFRXByb20gOiBiYXNlIGFkZHJlc3MgKi8KKwkJIHVfc2hvcnQsCS8qIGRlc3RpbmF0aW9uIG9mZnNldCAqLworCQkgdV9zaG9ydCAqLAkvKiBkYXRhIGJ1ZmZlciAqLworCQkgaW50KTsJCS8qIG51bWJlciBvZiByZWdpc3RlcnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTgyNTkzIFNVQlJPVVRJTkVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW50CisJd3ZfODI1OTNfY21kKHN0cnVjdCBuZXRfZGV2aWNlICosCS8qIHN5bmNocm9ub3VzbHkgc2VuZCBhIGNvbW1hbmQgdG8gaTgyNTkzICovIAorCQkgICAgIGNoYXIgKiwKKwkJICAgICBpbnQsCisJCSAgICAgaW50KTsKK3N0YXRpYyBpbmxpbmUgaW50CisJd3ZfZGlhZyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogRGlhZ25vc3RpcXVlIHRoZSBpODI1OTMgKi8KK3N0YXRpYyBpbnQKKwlyZWFkX3JpbmdidWYoc3RydWN0IG5ldF9kZXZpY2UgKiwJLyogUmVhZCBhIHJlY2VpdmUgYnVmZmVyICovCisJCSAgICAgaW50LAorCQkgICAgIGNoYXIgKiwKKwkJICAgICBpbnQpOworc3RhdGljIGlubGluZSB2b2lkCisJd3ZfODI1OTNfcmVjb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIFJlY29uZmlndXJlIHRoZSBjb250cm9sbGVyICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIERFQlVHICYgSU5GTyBTVUJST1VUSU5FUyAtLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW5saW5lIHZvaWQKKwl3dl9pbml0X2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIGRpc3BsYXkgc3RhcnR1cCBpbmZvICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIElPQ1RMLCBTVEFUUyAmIFJFQ09ORklHIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBlbl9zdGF0cwkqCisJd2F2ZWxhbl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIEdpdmUgc3RhdHMgL3Byb2MvbmV0L2RldiAqLworc3RhdGljIGl3X3N0YXRzICoKKwl3YXZlbGFuX2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBBQ0tFVCBSRUNFUFRJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbmxpbmUgaW50CisJd3Zfc3RhcnRfb2ZfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKiwJLyogU2VlayBiZWdnaW5pbmcgb2YgY3VycmVudCBmcmFtZSAqLworCQkJICBpbnQsCS8qIGVuZCBvZiBmcmFtZSAqLworCQkJICBpbnQpOwkvKiBzdGFydCBvZiBidWZmZXIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorCXd2X3BhY2tldF9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICosCS8qIFJlYWQgYSBwYWNrZXQgZnJvbSBhIGZyYW1lICovCisJCSAgICAgICBpbnQsCisJCSAgICAgICBpbnQpLAorCXd2X3BhY2tldF9yY3Yoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIFJlYWQgYWxsIHBhY2tldHMgd2FpdGluZyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBBQ0tFVCBUUkFOU01JU1NJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgaW5saW5lIHZvaWQKKwl3dl9wYWNrZXRfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKiwJLyogV3JpdGUgYSBwYWNrZXQgdG8gdGhlIFR4IGJ1ZmZlciAqLworCQkJdm9pZCAqLAorCQkJc2hvcnQpOworc3RhdGljIGludAorCXdhdmVsYW5fcGFja2V0X3htaXQoc3RydWN0IHNrX2J1ZmYgKiwJLyogU2VuZCBhIHBhY2tldCAqLworCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICopOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gSEFSRFdBUkUgQ09ORklHVVJBVElPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlubGluZSBpbnQKKwl3dl9tbWNfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogSW5pdGlhbGl6ZSB0aGUgbW9kZW0gKi8KK3N0YXRpYyBpbnQKKwl3dl9ydV9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICopLAkvKiBTdG9wIHRoZSBpODI1OTMgcmVjZWl2ZXIgdW5pdCAqLworCXd2X3J1X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICopOwkvKiBTdGFydCB0aGUgaTgyNTkzIHJlY2VpdmVyIHVuaXQgKi8KK3N0YXRpYyBpbnQKKwl3dl84MjU5M19jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIENvbmZpZ3VyZSB0aGUgaTgyNTkzICovCitzdGF0aWMgaW5saW5lIGludAorCXd2X3BjbWNpYV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqKTsJLyogUmVzZXQgdGhlIHBjbWNpYSBpbnRlcmZhY2UgKi8KK3N0YXRpYyBpbnQKKwl3dl9od19jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIFJlc2V0ICYgY29uZmlndXJlIHRoZSB3aG9sZSBoYXJkd2FyZSAqLworc3RhdGljIGlubGluZSB2b2lkCisJd3ZfaHdfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIFNhbWUsICsgc3RhcnQgcmVjZWl2ZXIgdW5pdCAqLworc3RhdGljIGlubGluZSBpbnQKKwl3dl9wY21jaWFfY29uZmlnKGRldl9saW5rX3QgKik7CS8qIENvbmZpZ3VyZSB0aGUgcGNtY2lhIGludGVyZmFjZSAqLworc3RhdGljIHZvaWQKKwl3dl9wY21jaWFfcmVsZWFzZShkZXZfbGlua190ICopOy8qIFJlbW92ZSBhIGRldmljZSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJTlRFUlJVUFQgSEFORExJTkcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlycXJldHVybl90CisJd2F2ZWxhbl9pbnRlcnJ1cHQoaW50LAkvKiBJbnRlcnJ1cHQgaGFuZGxlciAqLworCQkJICB2b2lkICosCisJCQkgIHN0cnVjdCBwdF9yZWdzICopOworc3RhdGljIHZvaWQKKwl3YXZlbGFuX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICopOwkvKiBUcmFuc21pc3Npb24gd2F0Y2hkb2cgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gQ09ORklHVVJBVElPTiBDQUxMQkFDS1MgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludAorCXdhdmVsYW5fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqKSwJCS8qIE9wZW4gdGhlIGRldmljZSAqLworCXdhdmVsYW5fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKik7CS8qIENsb3NlIHRoZSBkZXZpY2UgKi8KK3N0YXRpYyBkZXZfbGlua190ICoKKwl3YXZlbGFuX2F0dGFjaCh2b2lkKTsJCS8qIENyZWF0ZSBhIG5ldyBkZXZpY2UgKi8KK3N0YXRpYyB2b2lkCisJd2F2ZWxhbl9kZXRhY2goZGV2X2xpbmtfdCAqKTsJLyogRGVzdHJveSBhIHJlbW92ZWQgZGV2aWNlICovCitzdGF0aWMgaW50CisJd2F2ZWxhbl9ldmVudChldmVudF90LAkJLyogTWFuYWdlIHBjbWNpYSBldmVudHMgKi8KKwkJICAgICAgaW50LAorCQkgICAgICBldmVudF9jYWxsYmFja19hcmdzX3QgKik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFZBUklBQkxFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgZGV2X2luZm9fdCBkZXZfaW5mbyA9ICJ3YXZlbGFuX2NzIjsKK3N0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdCA9IE5VTEw7CS8qIExpbmtlZCBsaXN0IG9mIGRldmljZXMgKi8KKworLyoKKyAqIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IHdpdGggJ2luc21vZCcKKyAqIFRoZSBleGFjdCBzeW50YXggaXMgJ2luc21vZCB3YXZlbGFuX2NzLm8gPHZhcj49PHZhbHVlPicKKyAqLworCisvKiBTaGFyZWQgbWVtb3J5IHNwZWVkLCBpbiBucyAqLworc3RhdGljIGludAltZW1fc3BlZWQgPSAwOworCisvKiBOZXcgbW9kdWxlIGludGVyZmFjZSAqLworbW9kdWxlX3BhcmFtKG1lbV9zcGVlZCwgaW50LCAwKTsKKworI2lmZGVmIFdBVkVMQU5fUk9BTUlORwkJLyogQ29uZGl0aW9uYWwgY29tcGlsZSwgc2VlIGFib3ZlIGluIG9wdGlvbnMgKi8KKy8qIEVuYWJsZSByb2FtaW5nIG1vZGUgPyBObyAhIFBsZWFzZSBrZWVwIHRoaXMgdG8gMCAqLworc3RhdGljIGludAlkb19yb2FtaW5nID0gMDsKK21vZHVsZV9wYXJhbShkb19yb2FtaW5nLCBib29sLCAwKTsKKyNlbmRpZgkvKiBXQVZFTEFOX1JPQU1JTkcgKi8KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZW5kaWYJLyogV0FWRUxBTl9DU19QX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjM2ZDkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxLmgKQEAgLTAsMCArMSw2MTQgQEAKKyNpZm5kZWYgX19XTDM1MDFfSF9fCisjZGVmaW5lIF9fV0wzNTAxX0hfXworCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJpZWVlODAyXzExLmgiCisKKy8qIGRlZmluZSBmb3IgV0xBIDIuMCAqLworI2RlZmluZSBXTDM1MDFfQkxLU1ogMjU2CisvKgorICogSUQgZm9yIGlucHV0IFNpZ25hbHMgb2YgRFJJVkVSIGJsb2NrCisgKiBiaXRbNy01XSBpcyBibG9jayBJRDogMDAwCisgKiBiaXRbNC0wXSBpcyBzaWduYWwgSUQKKyovCitlbnVtIHdsMzUwMV9zaWduYWxzIHsKKwlXTDM1MDFfU0lHX0FMQVJNLAorCVdMMzUwMV9TSUdfTURfQ09ORklSTSwKKwlXTDM1MDFfU0lHX01EX0lORCwKKwlXTDM1MDFfU0lHX0FTU09DX0NPTkZJUk0sCisJV0wzNTAxX1NJR19BU1NPQ19JTkQsCisJV0wzNTAxX1NJR19BVVRIX0NPTkZJUk0sCisJV0wzNTAxX1NJR19BVVRIX0lORCwKKwlXTDM1MDFfU0lHX0RFQVVUSF9DT05GSVJNLAorCVdMMzUwMV9TSUdfREVBVVRIX0lORCwKKwlXTDM1MDFfU0lHX0RJU0FTU09DX0NPTkZJUk0sCisJV0wzNTAxX1NJR19ESVNBU1NPQ19JTkQsCisJV0wzNTAxX1NJR19HRVRfQ09ORklSTSwKKwlXTDM1MDFfU0lHX0pPSU5fQ09ORklSTSwKKwlXTDM1MDFfU0lHX1BXUl9NR01UX0NPTkZJUk0sCisJV0wzNTAxX1NJR19SRUFTU09DX0NPTkZJUk0sCisJV0wzNTAxX1NJR19SRUFTU09DX0lORCwKKwlXTDM1MDFfU0lHX1NDQU5fQ09ORklSTSwKKwlXTDM1MDFfU0lHX1NFVF9DT05GSVJNLAorCVdMMzUwMV9TSUdfU1RBUlRfQ09ORklSTSwKKwlXTDM1MDFfU0lHX1JFU1lOQ19DT05GSVJNLAorCVdMMzUwMV9TSUdfU0lURV9DT05GSVJNLAorCVdMMzUwMV9TSUdfU0FWRV9DT05GSVJNLAorCVdMMzUwMV9TSUdfUkZURVNUX0NPTkZJUk0sCisvKgorICogSUQgZm9yIGlucHV0IFNpZ25hbHMgb2YgTUxNRSBibG9jaworICogYml0WzctNV0gaXMgYmxvY2sgSUQ6IDAxMAorICogYml0WzQtMF0gaXMgc2lnbmFsIElECisgKi8KKwlXTDM1MDFfU0lHX0FTU09DX1JFUSA9IDB4MjAsCisJV0wzNTAxX1NJR19BVVRIX1JFUSwKKwlXTDM1MDFfU0lHX0RFQVVUSF9SRVEsCisJV0wzNTAxX1NJR19ESVNBU1NPQ19SRVEsCisJV0wzNTAxX1NJR19HRVRfUkVRLAorCVdMMzUwMV9TSUdfSk9JTl9SRVEsCisJV0wzNTAxX1NJR19QV1JfTUdNVF9SRVEsCisJV0wzNTAxX1NJR19SRUFTU09DX1JFUSwKKwlXTDM1MDFfU0lHX1NDQU5fUkVRLAorCVdMMzUwMV9TSUdfU0VUX1JFUSwKKwlXTDM1MDFfU0lHX1NUQVJUX1JFUSwKKwlXTDM1MDFfU0lHX01EX1JFUSwKKwlXTDM1MDFfU0lHX1JFU1lOQ19SRVEsCisJV0wzNTAxX1NJR19TSVRFX1JFUSwKKwlXTDM1MDFfU0lHX1NBVkVfUkVRLAorCVdMMzUwMV9TSUdfUkZfVEVTVF9SRVEsCisJV0wzNTAxX1NJR19NTV9DT05GSVJNID0gMHg2MCwKKwlXTDM1MDFfU0lHX01NX0lORCwKK307CisKK2VudW0gd2wzNTAxX21pYl9hdHRyaWJzIHsKKwlXTDM1MDFfTUlCX0FUVFJfU1RBVElPTl9JRCwKKwlXTDM1MDFfTUlCX0FUVFJfQVVUSF9BTEdPUklUSE1TLAorCVdMMzUwMV9NSUJfQVRUUl9BVVRIX1RZUEUsCisJV0wzNTAxX01JQl9BVFRSX01FRElVTV9PQ0NVUEFOQ1lfTElNSVQsCisJV0wzNTAxX01JQl9BVFRSX0NGX1BPTExBQkxFLAorCVdMMzUwMV9NSUJfQVRUUl9DRlBfUEVSSU9ELAorCVdMMzUwMV9NSUJfQVRUUl9DRlBNQVhfRFVSQVRJT04sCisJV0wzNTAxX01JQl9BVFRSX0FVVEhfUkVTUF9UTU9VVCwKKwlXTDM1MDFfTUlCX0FUVFJfUlhfRFRJTVMsCisJV0wzNTAxX01JQl9BVFRSX1BSSVZfT1BUX0lNUExFTUVOVEVELAorCVdMMzUwMV9NSUJfQVRUUl9QUklWX0lOVk9LRUQsCisJV0wzNTAxX01JQl9BVFRSX1dFUF9ERUZBVUxUX0tFWVMsCisJV0wzNTAxX01JQl9BVFRSX1dFUF9ERUZBVUxUX0tFWV9JRCwKKwlXTDM1MDFfTUlCX0FUVFJfV0VQX0tFWV9NQVBQSU5HUywKKwlXTDM1MDFfTUlCX0FUVFJfV0VQX0tFWV9NQVBQSU5HU19MRU4sCisJV0wzNTAxX01JQl9BVFRSX0VYQ0xVREVfVU5FTkNSWVBURUQsCisJV0wzNTAxX01JQl9BVFRSX1dFUF9JQ1ZfRVJST1JfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX1dFUF9VTkRFQ1JZUFRBQkxFX0NPVU5ULAorCVdMMzUwMV9NSUJfQVRUUl9XRVBfRVhDTFVERURfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX01BQ19BRERSLAorCVdMMzUwMV9NSUJfQVRUUl9HUk9VUF9BRERSUywKKwlXTDM1MDFfTUlCX0FUVFJfUlRTX1RIUkVTSE9MRCwKKwlXTDM1MDFfTUlCX0FUVFJfU0hPUlRfUkVUUllfTElNSVQsCisJV0wzNTAxX01JQl9BVFRSX0xPTkdfUkVUUllfTElNSVQsCisJV0wzNTAxX01JQl9BVFRSX0ZSQUdfVEhSRVNIT0xELAorCVdMMzUwMV9NSUJfQVRUUl9NQVhfVFhfTVNEVV9MSUZFVElNRSwKKwlXTDM1MDFfTUlCX0FUVFJfTUFYX1JYX0xJRkVUSU1FLAorCVdMMzUwMV9NSUJfQVRUUl9NQU5VRkFDVFVSRVJfSUQsCisJV0wzNTAxX01JQl9BVFRSX1BST0RVQ1RfSUQsCisJV0wzNTAxX01JQl9BVFRSX1RYX0ZSQUdfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX01VTFRJQ0FTVF9UWF9GUkFNRV9DT1VOVCwKKwlXTDM1MDFfTUlCX0FUVFJfRkFJTEVEX0NPVU5ULAorCVdMMzUwMV9NSUJfQVRUUl9SWF9GUkFHX0NPVU5ULAorCVdMMzUwMV9NSUJfQVRUUl9NVUxUSUNBU1RfUlhfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX0ZDU19FUlJPUl9DT1VOVCwKKwlXTDM1MDFfTUlCX0FUVFJfUkVUUllfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX01VTFRJUExFX1JFVFJZX0NPVU5ULAorCVdMMzUwMV9NSUJfQVRUUl9SVFNfU1VDQ0VTU19DT1VOVCwKKwlXTDM1MDFfTUlCX0FUVFJfUlRTX0ZBSUxVUkVfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX0FDS19GQUlMVVJFX0NPVU5ULAorCVdMMzUwMV9NSUJfQVRUUl9GUkFNRV9EVVBMSUNBVEVfQ09VTlQsCisJV0wzNTAxX01JQl9BVFRSX1BIWV9UWVBFLAorCVdMMzUwMV9NSUJfQVRUUl9SRUdfRE9NQUlOU19TVVBQT1JULAorCVdMMzUwMV9NSUJfQVRUUl9DVVJSRU5UX1JFR19ET01BSU4sCisJV0wzNTAxX01JQl9BVFRSX1NMT1RfVElNRSwKKwlXTDM1MDFfTUlCX0FUVFJfQ0NBX1RJTUUsCisJV0wzNTAxX01JQl9BVFRSX1JYX1RYX1RVUk5BUk9VTkRfVElNRSwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUExDUF9ERUxBWSwKKwlXTDM1MDFfTUlCX0FUVFJfUlhfVFhfU1dJVENIX1RJTUUsCisJV0wzNTAxX01JQl9BVFRSX1RYX1JBTVBfT05fVElNRSwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUkZfREVMQVksCisJV0wzNTAxX01JQl9BVFRSX1NJRlNfVElNRSwKKwlXTDM1MDFfTUlCX0FUVFJfUlhfUkZfREVMQVksCisJV0wzNTAxX01JQl9BVFRSX1JYX1BMQ1BfREVMQVksCisJV0wzNTAxX01JQl9BVFRSX01BQ19QUk9DRVNTSU5HX0RFTEFZLAorCVdMMzUwMV9NSUJfQVRUUl9UWF9SQU1QX09GRl9USU1FLAorCVdMMzUwMV9NSUJfQVRUUl9QUkVBTUJMRV9MRU4sCisJV0wzNTAxX01JQl9BVFRSX1BMQ1BfSEVBREVSX0xFTiwKKwlXTDM1MDFfTUlCX0FUVFJfTVBEVV9EVVJBVElPTl9GQUNUT1IsCisJV0wzNTAxX01JQl9BVFRSX0FJUl9QUk9QQUdBVElPTl9USU1FLAorCVdMMzUwMV9NSUJfQVRUUl9URU1QX1RZUEUsCisJV0wzNTAxX01JQl9BVFRSX0NXX01JTiwKKwlXTDM1MDFfTUlCX0FUVFJfQ1dfTUFYLAorCVdMMzUwMV9NSUJfQVRUUl9TVVBQT1JUX0RBVEFfUkFURVNfVFgsCisJV0wzNTAxX01JQl9BVFRSX1NVUFBPUlRfREFUQV9SQVRFU19SWCwKKwlXTDM1MDFfTUlCX0FUVFJfTVBEVV9NQVhfTEVOLAorCVdMMzUwMV9NSUJfQVRUUl9TVVBQT1JUX1RYX0FOVEVOTkFTLAorCVdMMzUwMV9NSUJfQVRUUl9DVVJSRU5UX1RYX0FOVEVOTkEsCisJV0wzNTAxX01JQl9BVFRSX1NVUFBPUlRfUlhfQU5URU5OQVMsCisJV0wzNTAxX01JQl9BVFRSX0RJVkVSU0lUWV9TVVBQT1JULAorCVdMMzUwMV9NSUJfQVRUUl9ESVZFUlNJVFlfU0VMRUNUSU9OX1JTLAorCVdMMzUwMV9NSUJfQVRUUl9OUl9TVVBQT1JURURfUFdSX0xFVkVMUywKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMMSwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMMiwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMMywKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMNCwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMNSwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMNiwKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMNywKKwlXTDM1MDFfTUlCX0FUVFJfVFhfUFdSX0xFVkVMOCwKKwlXTDM1MDFfTUlCX0FUVFJfQ1VSUkVOVF9UWF9QV1JfTEVWRUwsCisJV0wzNTAxX01JQl9BVFRSX0NVUlJFTlRfQ0hBTiwKKwlXTDM1MDFfTUlCX0FUVFJfQ0NBX01PREVfU1VQUE9SVEVELAorCVdMMzUwMV9NSUJfQVRUUl9DVVJSRU5UX0NDQV9NT0RFLAorCVdMMzUwMV9NSUJfQVRUUl9FRF9USFJFU0hPTEQsCisJV0wzNTAxX01JQl9BVFRSX1NJTlRIRVNJWkVSX0xPQ0tFRCwKKwlXTDM1MDFfTUlCX0FUVFJfQ1VSUkVOVF9QV1JfU1RBVEUsCisJV0wzNTAxX01JQl9BVFRSX0RPWkVfVFVSTk9OX1RJTUUsCisJV0wzNTAxX01JQl9BVFRSX1JDUjMzLAorCVdMMzUwMV9NSUJfQVRUUl9ERUZBVUxUX0NIQU4sCisJV0wzNTAxX01JQl9BVFRSX1NTSUQsCisJV0wzNTAxX01JQl9BVFRSX1BXUl9NR01UX0VOQUJMRSwKKwlXTDM1MDFfTUlCX0FUVFJfTkVUX0NBUEFCSUxJVFksCisJV0wzNTAxX01JQl9BVFRSX1JPVVRJTkcsCit9OworCitlbnVtIHdsMzUwMV9uZXRfdHlwZSB7CisJV0wzNTAxX05FVF9UWVBFX0lORlJBLAorCVdMMzUwMV9ORVRfVFlQRV9BREhPQywKKwlXTDM1MDFfTkVUX1RZUEVfQU5ZX0JTUywKK307CisKK2VudW0gd2wzNTAxX3NjYW5fdHlwZSB7CisJV0wzNTAxX1NDQU5fVFlQRV9BQ1RJVkUsCisJV0wzNTAxX1NDQU5fVFlQRV9QQVNTSVZFLAorfTsKKworZW51bSB3bDM1MDFfdHhfcmVzdWx0IHsKKwlXTDM1MDFfVFhfUkVTVUxUX1NVQ0NFU1MsCisJV0wzNTAxX1RYX1JFU1VMVF9OT19CU1MsCisJV0wzNTAxX1RYX1JFU1VMVF9SRVRSWV9MSU1JVCwKK307CisKK2VudW0gd2wzNTAxX3N5c190eXBlIHsKKwlXTDM1MDFfU1lTX1RZUEVfT1BFTiwKKwlXTDM1MDFfU1lTX1RZUEVfU0hBUkVfS0VZLAorfTsKKworZW51bSB3bDM1MDFfc3RhdHVzIHsKKwlXTDM1MDFfU1RBVFVTX1NVQ0NFU1MsCisJV0wzNTAxX1NUQVRVU19JTlZBTElELAorCVdMMzUwMV9TVEFUVVNfVElNRU9VVCwKKwlXTDM1MDFfU1RBVFVTX1JFRlVTRUQsCisJV0wzNTAxX1NUQVRVU19NQU5ZX1JFUSwKKwlXTDM1MDFfU1RBVFVTX0FMUkVBRFlfQlNTLAorfTsKKworI2RlZmluZSBXTDM1MDFfTUdNVF9DQVBBQklMSVRZX0VTUwkJMHgwMDAxICAvKiBzZWUgODAyLjExIHAuNTggKi8KKyNkZWZpbmUgV0wzNTAxX01HTVRfQ0FQQUJJTElUWV9JQlNTCQkweDAwMDIgIC8qICAgICAgLSAiIC0JICAgKi8KKyNkZWZpbmUgV0wzNTAxX01HTVRfQ0FQQUJJTElUWV9DRl9QT0xMQUJMRQkweDAwMDQgIC8qICAgICAgLSAiIC0JICAgKi8KKyNkZWZpbmUgV0wzNTAxX01HTVRfQ0FQQUJJTElUWV9DRl9QT0xMX1JFUVVFU1QJMHgwMDA4ICAvKiAgICAgIC0gIiAtCSAgICovCisjZGVmaW5lIFdMMzUwMV9NR01UX0NBUEFCSUxJVFlfUFJJVkFDWQkJMHgwMDEwICAvKiAgICAgIC0gIiAtCSAgICovCisKKyNkZWZpbmUgSVdfUkVHX0RPTUFJTl9GQ0MJMHgxMAkvKiBDaGFubmVsIDEgdG8gMTEJVVNBICAgICovCisjZGVmaW5lIElXX1JFR19ET01BSU5fRE9DCTB4MjAJLyogQ2hhbm5lbCAxIHRvIDExCUNhbmFkYSAqLworI2RlZmluZSBJV19SRUdfRE9NQUlOX0VUU0kJMHgzMAkvKiBDaGFubmVsIDEgdG8gMTMJRXVyb3BlICovCisjZGVmaW5lIElXX1JFR19ET01BSU5fU1BBSU4JMHgzMQkvKiBDaGFubmVsIDEwIHRvIDExCVNwYWluICAqLworI2RlZmluZSBJV19SRUdfRE9NQUlOX0ZSQU5DRQkweDMyCS8qIENoYW5uZWwgMTAgdG8gMTMJRnJhbmNlICovCisjZGVmaW5lIElXX1JFR19ET01BSU5fTUtLCTB4NDAJLyogQ2hhbm5lbCAxNAkJSmFwYW4gICovCisjZGVmaW5lIElXX1JFR19ET01BSU5fTUtLMQkweDQxCS8qIENoYW5uZWwgMS0xNAkJSmFwYW4gICovCisjZGVmaW5lIElXX1JFR19ET01BSU5fSVNSQUVMCTB4NTAJLyogQ2hhbm5lbCAzIC0gOQlJc3JhZWwgKi8KKworI2RlZmluZSBJV19NR01UX1JBVEVfTEFCRUxfTUFOREFUT1JZIDEyOCAvKiBNU0IgKi8KKworZW51bSBpd19tZ210X3JhdGVfbGFiZWxzIHsKKwlJV19NR01UX1JBVEVfTEFCRUxfMU1CSVQgICA9IDIsCisJSVdfTUdNVF9SQVRFX0xBQkVMXzJNQklUICAgPSA0LAorCUlXX01HTVRfUkFURV9MQUJFTF81XzVNQklUID0gMTEsCisJSVdfTUdNVF9SQVRFX0xBQkVMXzExTUJJVCAgPSAyMiwKK307CisKK2VudW0gaXdfbWdtdF9pbmZvX2VsZW1lbnRfaWRzIHsKKwlJV19NR01UX0lORk9fRUxFTUVOVF9TU0lELAkJICAvKiBTZXJ2aWNlIFNldCBJZGVudGl0eSAqLworCUlXX01HTVRfSU5GT19FTEVNRU5UX1NVUFBPUlRFRF9SQVRFUywKKwlJV19NR01UX0lORk9fRUxFTUVOVF9GSF9QQVJBTUVURVJfU0VULAorCUlXX01HTVRfSU5GT19FTEVNRU5UX0RTX1BBUkFNRVRFUl9TRVQsCisJSVdfTUdNVF9JTkZPX0VMRU1FTlRfQ1NfUEFSQU1FVEVSX1NFVCwKKwlJV19NR01UX0lORk9fRUxFTUVOVF9DU19USU0sCQkgIC8qIFRyYWZmaWMgSW5mb3JtYXRpb24gTWFwICovCisJSVdfTUdNVF9JTkZPX0VMRU1FTlRfSUJTU19QQVJBTUVURVJfU0VULAorCS8qIDctMTU6IFJlc2VydmVkLCB1bnVzZWQgKi8KKwlJV19NR01UX0lORk9fRUxFTUVOVF9DSEFMTEVOR0VfVEVYVCA9IDE2LAorCS8qIDE3LTMxIFJlc2VydmVkIGZvciBjaGFsbGVuZ2UgdGV4dCBleHRlbnNpb24gKi8KKwkvKiAzMi0yNTUgUmVzZXJ2ZWQsIHVudXNlZCAqLworfTsKKworc3RydWN0IGl3X21nbXRfaW5mb19lbGVtZW50IHsKKwl1OCBpZDsgLyogb25lIG9mIGVudW0gaXdfbWdtdF9pbmZvX2VsZW1lbnRfaWRzLAorCQkgIGJ1dCBzaXplb2YoZW51bSkgPiBzaXplb2YodTgpIDotKCAqLworCXU4IGxlbjsKKwl1OCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpd19tZ210X2Vzc2lkX3BzZXQgeworCXN0cnVjdCBpd19tZ210X2luZm9fZWxlbWVudCBlbDsKKwl1OCAJCQkgICAgZXNzaWRbSVdfRVNTSURfTUFYX1NJWkVdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgKiBBY2NvcmRpbmcgdG8gODAyLjExIFdpcmVsZXNzIE5ldG93b3JzLCB0aGUgZGVmaW5pdGl2ZSBndWlkZSAtIE8nUmVpbGx5CisgKiBQZyA3NQorICovIAorI2RlZmluZSBJV19EQVRBX1JBVEVfTUFYX0xBQkVMUyA4CisKK3N0cnVjdCBpd19tZ210X2RhdGFfcnNldCB7CisJc3RydWN0IGl3X21nbXRfaW5mb19lbGVtZW50IGVsOworCXU4IAkJCSAgICBkYXRhX3JhdGVfbGFiZWxzW0lXX0RBVEFfUkFURV9NQVhfTEFCRUxTXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaXdfbWdtdF9kc19wc2V0IHsKKwlzdHJ1Y3QgaXdfbWdtdF9pbmZvX2VsZW1lbnQgZWw7CisJdTggCQkJICAgIGNoYW47Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGl3X21nbXRfY2ZfcHNldCB7CisJc3RydWN0IGl3X21nbXRfaW5mb19lbGVtZW50IGVsOworCXU4IAkJCSAgICBjZnBfY291bnQ7CisJdTggCQkJICAgIGNmcF9wZXJpb2Q7CisJdTE2IAkJCSAgICBjZnBfbWF4X2R1cmF0aW9uOworCXUxNiAJCQkgICAgY2ZwX2R1cl9yZW1haW5pbmc7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGl3X21nbXRfaWJzc19wc2V0IHsKKwlzdHJ1Y3QgaXdfbWdtdF9pbmZvX2VsZW1lbnQgZWw7CisJdTE2IAkJCSAgICBhdGltX3dpbmRvdzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgd2wzNTAxX3R4X2hkciB7CisJdTE2CXR4X2NudDsKKwl1OAlzeW5jWzE2XTsKKwl1MTYJc2ZkOworCXU4CXNpZ25hbDsKKwl1OAlzZXJ2aWNlOworCXUxNglsZW47CisJdTE2CWNyYzE2OworCXUxNglmcmFtZV9jdHJsOworCXUxNglkdXJhdGlvbl9pZDsKKwl1OAlhZGRyMVtFVEhfQUxFTl07CisJdTgJYWRkcjJbRVRIX0FMRU5dOworCXU4CWFkZHIzW0VUSF9BTEVOXTsKKwl1MTYJc2VxX2N0cmw7CisJdTgJYWRkcjRbRVRIX0FMRU5dOworfTsKKworc3RydWN0IHdsMzUwMV9yeF9oZHIgeworCXUxNglyeF9uZXh0X2JsazsKKwl1MTYJcmNfbmV4dF9mcmFtZV9ibGs7CisJdTgJcnhfYmxrX2N0cmw7CisJdTgJcnhfbmV4dF9mcmFtZTsKKwl1OAlyeF9uZXh0X2ZyYW1lMTsKKwl1OAlyc3NpOworCWNoYXIJdGltZVs4XTsKKwl1OAlzaWduYWw7CisJdTgJc2VydmljZTsKKwl1MTYJbGVuOworCXUxNgljcmMxNjsKKwl1MTYJZnJhbWVfY3RybDsKKwl1MTYJZHVyYXRpb247CisJdTgJYWRkcjFbRVRIX0FMRU5dOworCXU4CWFkZHIyW0VUSF9BTEVOXTsKKwl1OAlhZGRyM1tFVEhfQUxFTl07CisJdTE2CXNlcTsKKwl1OAlhZGRyNFtFVEhfQUxFTl07Cit9OworCitzdHJ1Y3Qgd2wzNTAxX3N0YXJ0X3JlcSB7CisJdTE2CQkJICAgIG5leHRfYmxrOworCXU4CQkJICAgIHNpZ19pZDsKKwl1OAkJCSAgICBic3NfdHlwZTsKKwl1MTYJCQkgICAgYmVhY29uX3BlcmlvZDsKKwl1MTYJCQkgICAgZHRpbV9wZXJpb2Q7CisJdTE2CQkJICAgIHByb2JlX2RlbGF5OworCXUxNgkJCSAgICBjYXBfaW5mbzsKKwlzdHJ1Y3QgaXdfbWdtdF9lc3NpZF9wc2V0ICAgc3NpZDsKKwlzdHJ1Y3QgaXdfbWdtdF9kYXRhX3JzZXQgICAgYnNzX2Jhc2ljX3JzZXQ7CisJc3RydWN0IGl3X21nbXRfZGF0YV9yc2V0ICAgIG9wZXJhdGlvbmFsX3JzZXQ7CisJc3RydWN0IGl3X21nbXRfY2ZfcHNldAkgICAgY2ZfcHNldDsKKwlzdHJ1Y3QgaXdfbWdtdF9kc19wc2V0CSAgICBkc19wc2V0OworCXN0cnVjdCBpd19tZ210X2lic3NfcHNldCAgICBpYnNzX3BzZXQ7Cit9OworCitzdHJ1Y3Qgd2wzNTAxX2Fzc29jX3JlcSB7CisJdTE2CW5leHRfYmxrOworCXU4CXNpZ19pZDsKKwl1OAlyZXNlcnZlZDsKKwl1MTYJdGltZW91dDsKKwl1MTYJY2FwX2luZm87CisJdTE2CWxpc3Rlbl9pbnRlcnZhbDsKKwl1OAltYWNfYWRkcltFVEhfQUxFTl07Cit9OworCitzdHJ1Y3Qgd2wzNTAxX2Fzc29jX2NvbmZpcm0geworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcmVzZXJ2ZWQ7CisJdTE2CXN0YXR1czsKK307CisKK3N0cnVjdCB3bDM1MDFfYXNzb2NfaW5kIHsKKwl1MTYJbmV4dF9ibGs7CisJdTgJc2lnX2lkOworCXU4CW1hY19hZGRyW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCB3bDM1MDFfYXV0aF9yZXEgeworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcmVzZXJ2ZWQ7CisJdTE2CXR5cGU7CisJdTE2CXRpbWVvdXQ7CisJdTgJbWFjX2FkZHJbRVRIX0FMRU5dOworfTsKKworc3RydWN0IHdsMzUwMV9hdXRoX2NvbmZpcm0geworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcmVzZXJ2ZWQ7CisJdTE2CXR5cGU7CisJdTE2CXN0YXR1czsKKwl1OAltYWNfYWRkcltFVEhfQUxFTl07Cit9OworCitzdHJ1Y3Qgd2wzNTAxX2dldF9yZXEgeworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcmVzZXJ2ZWQ7CisJdTE2CW1pYl9hdHRyaWI7Cit9OworCitzdHJ1Y3Qgd2wzNTAxX2dldF9jb25maXJtIHsKKwl1MTYJbmV4dF9ibGs7CisJdTgJc2lnX2lkOworCXU4CXJlc2VydmVkOworCXUxNgltaWJfc3RhdHVzOworCXUxNgltaWJfYXR0cmliOworCXU4CW1pYl92YWx1ZVsxMDBdOworfTsKKworc3RydWN0IHdsMzUwMV9qb2luX3JlcSB7CisJdTE2CQkJICAgIG5leHRfYmxrOworCXU4CQkJICAgIHNpZ19pZDsKKwl1OAkJCSAgICByZXNlcnZlZDsKKwlzdHJ1Y3QgaXdfbWdtdF9kYXRhX3JzZXQgICAgb3BlcmF0aW9uYWxfcnNldDsKKwl1MTYJCQkgICAgcmVzZXJ2ZWQyOworCXUxNgkJCSAgICB0aW1lb3V0OworCXUxNgkJCSAgICBwcm9iZV9kZWxheTsKKwl1OAkJCSAgICB0aW1lc3RhbXBbOF07CisJdTgJCQkgICAgbG9jYWxfdGltZVs4XTsKKwl1MTYJCQkgICAgYmVhY29uX3BlcmlvZDsKKwl1MTYJCQkgICAgZHRpbV9wZXJpb2Q7CisJdTE2CQkJICAgIGNhcF9pbmZvOworCXU4CQkJICAgIGJzc190eXBlOworCXU4CQkJICAgIGJzc2lkW0VUSF9BTEVOXTsKKwlzdHJ1Y3QgaXdfbWdtdF9lc3NpZF9wc2V0ICAgc3NpZDsKKwlzdHJ1Y3QgaXdfbWdtdF9kc19wc2V0CSAgICBkc19wc2V0OworCXN0cnVjdCBpd19tZ210X2NmX3BzZXQJICAgIGNmX3BzZXQ7CisJc3RydWN0IGl3X21nbXRfaWJzc19wc2V0ICAgIGlic3NfcHNldDsKKwlzdHJ1Y3QgaXdfbWdtdF9kYXRhX3JzZXQgICAgYnNzX2Jhc2ljX3JzZXQ7Cit9OworCitzdHJ1Y3Qgd2wzNTAxX2pvaW5fY29uZmlybSB7CisJdTE2CW5leHRfYmxrOworCXU4CXNpZ19pZDsKKwl1OAlyZXNlcnZlZDsKKwl1MTYJc3RhdHVzOworfTsKKworc3RydWN0IHdsMzUwMV9wd3JfbWdtdF9yZXEgeworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcHdyX3NhdmU7CisJdTgJd2FrZV91cDsKKwl1OAlyZWNlaXZlX2R0aW1zOworfTsKKworc3RydWN0IHdsMzUwMV9wd3JfbWdtdF9jb25maXJtIHsKKwl1MTYJbmV4dF9ibGs7CisJdTgJc2lnX2lkOworCXU4CXJlc2VydmVkOworCXUxNglzdGF0dXM7Cit9OworCitzdHJ1Y3Qgd2wzNTAxX3NjYW5fcmVxIHsKKwl1MTYJCQkgICAgbmV4dF9ibGs7CisJdTgJCQkgICAgc2lnX2lkOworCXU4CQkJICAgIGJzc190eXBlOworCXUxNgkJCSAgICBwcm9iZV9kZWxheTsKKwl1MTYJCQkgICAgbWluX2NoYW5fdGltZTsKKwl1MTYJCQkgICAgbWF4X2NoYW5fdGltZTsKKwl1OAkJCSAgICBjaGFuX2xpc3RbMTRdOworCXU4CQkJICAgIGJzc2lkW0VUSF9BTEVOXTsKKwlzdHJ1Y3QgaXdfbWdtdF9lc3NpZF9wc2V0ICAgc3NpZDsKKwllbnVtIHdsMzUwMV9zY2FuX3R5cGUJICAgIHNjYW5fdHlwZTsKK307CisKK3N0cnVjdCB3bDM1MDFfc2Nhbl9jb25maXJtIHsKKwl1MTYJCQkgICAgbmV4dF9ibGs7CisJdTgJCQkgICAgc2lnX2lkOworCXU4CQkJICAgIHJlc2VydmVkOworCXUxNgkJCSAgICBzdGF0dXM7CisJY2hhcgkJCSAgICB0aW1lc3RhbXBbOF07CisJY2hhcgkJCSAgICBsb2NhbHRpbWVbOF07CisJdTE2CQkJICAgIGJlYWNvbl9wZXJpb2Q7CisJdTE2CQkJICAgIGR0aW1fcGVyaW9kOworCXUxNgkJCSAgICBjYXBfaW5mbzsKKwl1OAkJCSAgICBic3NfdHlwZTsKKwl1OAkJCSAgICBic3NpZFtFVEhfQUxFTl07CisJc3RydWN0IGl3X21nbXRfZXNzaWRfcHNldCAgIHNzaWQ7CisJc3RydWN0IGl3X21nbXRfZHNfcHNldAkgICAgZHNfcHNldDsKKwlzdHJ1Y3QgaXdfbWdtdF9jZl9wc2V0CSAgICBjZl9wc2V0OworCXN0cnVjdCBpd19tZ210X2lic3NfcHNldCAgICBpYnNzX3BzZXQ7CisJc3RydWN0IGl3X21nbXRfZGF0YV9yc2V0ICAgIGJzc19iYXNpY19yc2V0OworCXU4CQkJICAgIHJzc2k7Cit9OworCitzdHJ1Y3Qgd2wzNTAxX3N0YXJ0X2NvbmZpcm0geworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcmVzZXJ2ZWQ7CisJdTE2CXN0YXR1czsKK307CisKK3N0cnVjdCB3bDM1MDFfbWRfcmVxIHsKKwl1MTYJbmV4dF9ibGs7CisJdTgJc2lnX2lkOworCXU4CXJvdXRpbmc7CisJdTE2CWRhdGE7CisJdTE2CXNpemU7CisJdTgJcHJpOworCXU4CXNlcnZpY2VfY2xhc3M7CisJdTgJZGFkZHJbRVRIX0FMRU5dOworCXU4CXNhZGRyW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCB3bDM1MDFfbWRfaW5kIHsKKwl1MTYJbmV4dF9ibGs7CisJdTgJc2lnX2lkOworCXU4CXJvdXRpbmc7CisJdTE2CWRhdGE7CisJdTE2CXNpemU7CisJdTgJcmVjZXB0aW9uOworCXU4CXByaTsKKwl1OAlzZXJ2aWNlX2NsYXNzOworCXU4CWRhZGRyW0VUSF9BTEVOXTsKKwl1OAlzYWRkcltFVEhfQUxFTl07Cit9OworCitzdHJ1Y3Qgd2wzNTAxX21kX2NvbmZpcm0geworCXUxNgluZXh0X2JsazsKKwl1OAlzaWdfaWQ7CisJdTgJcmVzZXJ2ZWQ7CisJdTE2CWRhdGE7CisJdTgJc3RhdHVzOworCXU4CXByaTsKKwl1OAlzZXJ2aWNlX2NsYXNzOworfTsKKworc3RydWN0IHdsMzUwMV9yZXN5bmNfcmVxIHsKKwl1MTYJbmV4dF9ibGs7CisJdTgJc2lnX2lkOworfTsKKworLyogRGVmaW5pdGlvbnMgZm9yIHN1cHBvcnRpbmcgY2xvbmUgYWRhcHRlcnMuICovCisvKiBTeXN0ZW0gSW50ZXJmYWNlIFJlZ2lzdGVycyAoU0lSIHNwYWNlKSAqLworI2RlZmluZSBXTDM1MDFfTklDX0dDUiAoKHU4KTB4MDApCS8qIFNJUjAgLSBHZW5lcmFsIENvbmYgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgV0wzNTAxX05JQ19CU1MgKCh1OCkweDAxKQkvKiBTSVIxIC0gQmFuayBTd2l0Y2hpbmcgU2VsZWN0IFJlZyAqLworI2RlZmluZSBXTDM1MDFfTklDX0xNQUwgKCh1OCkweDAyKQkvKiBTSVIyIC0gTG9jYWwgTWVtIGFkZHIgUmVnIFs3OjBdICovCisjZGVmaW5lIFdMMzUwMV9OSUNfTE1BSCAoKHU4KTB4MDMpCS8qIFNJUjMgLSBMb2NhbCBNZW0gYWRkciBSZWcgWzE0OjhdICovCisjZGVmaW5lIFdMMzUwMV9OSUNfSU9EUEEgKCh1OCkweDA0KQkvKiBTSVI0IC0gSS9PIERhdGEgUG9ydCBBICovCisjZGVmaW5lIFdMMzUwMV9OSUNfSU9EUEIgKCh1OCkweDA1KQkvKiBTSVI1IC0gSS9PIERhdGEgUG9ydCBCICovCisjZGVmaW5lIFdMMzUwMV9OSUNfSU9EUEMgKCh1OCkweDA2KQkvKiBTSVI2IC0gSS9PIERhdGEgUG9ydCBDICovCisjZGVmaW5lIFdMMzUwMV9OSUNfSU9EUEQgKCh1OCkweDA3KQkvKiBTSVI3IC0gSS9PIERhdGEgUG9ydCBEICovCisKKy8qIEJpdHMgaW4gR0NSICovCisjZGVmaW5lIFdMMzUwMV9HQ1JfU1dSRVNFVCAoKHU4KTB4ODApCisjZGVmaW5lIFdMMzUwMV9HQ1JfQ09SRVNFVCAoKHU4KTB4NDApCisjZGVmaW5lIFdMMzUwMV9HQ1JfRElTUFdETiAoKHU4KTB4MjApCisjZGVmaW5lIFdMMzUwMV9HQ1JfRUNXQUlUICAoKHU4KTB4MTApCisjZGVmaW5lIFdMMzUwMV9HQ1JfRUNJTlQgICAoKHU4KTB4MDgpCisjZGVmaW5lIFdMMzUwMV9HQ1JfSU5UMkVDICAoKHU4KTB4MDQpCisjZGVmaW5lIFdMMzUwMV9HQ1JfRU5FQ0lOVCAoKHU4KTB4MDIpCisjZGVmaW5lIFdMMzUwMV9HQ1JfREFNICAgICAoKHU4KTB4MDEpCisKKy8qIEJpdHMgaW4gQlNTIChCYW5rIFN3aXRjaGluZyBTZWxlY3QgUmVnaXN0ZXIpICovCisjZGVmaW5lIFdMMzUwMV9CU1NfRlBBR0UwICgodTgpMHgyMCkJLyogRmxhc2ggbWVtb3J5IHBhZ2UwICovCisjZGVmaW5lIFdMMzUwMV9CU1NfRlBBR0UxICgodTgpMHgyOCkKKyNkZWZpbmUgV0wzNTAxX0JTU19GUEFHRTIgKCh1OCkweDMwKQorI2RlZmluZSBXTDM1MDFfQlNTX0ZQQUdFMyAoKHU4KTB4MzgpCisjZGVmaW5lIFdMMzUwMV9CU1NfU1BBR0UwICgodTgpMHgwMCkJLyogU1JBTSBwYWdlMCAqLworI2RlZmluZSBXTDM1MDFfQlNTX1NQQUdFMSAoKHU4KTB4MDgpCisjZGVmaW5lIFdMMzUwMV9CU1NfU1BBR0UyICgodTgpMHgxMCkKKyNkZWZpbmUgV0wzNTAxX0JTU19TUEFHRTMgKCh1OCkweDE4KQorCisvKiBEZWZpbmUgRHJpdmVyIEludGVyZmFjZSAqLworLyogUmVmZXIgSUVFRSA4MDIuMTEgKi8KKy8qIFR4IHBhY2tldCBoZWFkZXIsIGluY2x1ZGUgUExDUCBhbmQgTVBEVSAqLworLyogVHggUExDUCBIZWFkZXIgKi8KK3N0cnVjdCB3bDM1MDFfODAyMTFfdHhfcGxjcF9oZHIgeworCXU4CXN5bmNbMTZdOworCXUxNglzZmQ7CisJdTgJc2lnbmFsOworCXU4CXNlcnZpY2U7CisJdTE2CWxlbjsKKwl1MTYJY3JjMTY7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHdsMzUwMV84MDIxMV90eF9oZHIgeworCXN0cnVjdCB3bDM1MDFfODAyMTFfdHhfcGxjcF9oZHIJcGNscF9oZHI7CisJc3RydWN0IGllZWU4MDJfMTFfaGRyCQltYWNfaGRyOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qCisgICBSZXNlcnZlIHRoZSBiZWdpbm5pbmcgVHggc3BhY2UgZm9yIGRlc2NyaXB0b3IgdXNlLgorCisgICBUeEJsb2NrT2Zmc2V0IC0tPgkqLS0tLSotLS0tKi0tLS0qLS0tLSogXAorCShUeEZyZWVEZXNjKQl8ICAwIHwgIDEgfCAgMiB8ICAzIHwgIFwKKwkJCXwgIDQgfCAgNSB8ICA2IHwgIDcgfCAgIHwKKwkJCXwgIDggfCAgOSB8IDEwIHwgMTEgfCAgIFRYX0RFU0MgKiAyMAorCQkJfCAxMiB8IDEzIHwgMTQgfCAxNSB8ICAgfAorCQkJfCAxNiB8IDE3IHwgMTggfCAxOSB8ICAvCisgICBUeEJ1ZmZlckJlZ2luIC0tPgkqLS0tLSotLS0tKi0tLS0qLS0tLSogLworICAgKFR4QnVmZmVySGVhZCkJfCAJCSAgICB8CisgICAoVHhCdWZmZXJUYWlsKQl8IAkJICAgIHwKKwkJCXwgICAgU2VuZCBCdWZmZXIgICAgfAorCQkJfCAJCSAgICB8CisJCQl8CQkgICAgfAorCQkJKi0tLS0tLS0tLS0tLS0tLS0tLS0qCisgICBUeEJ1ZmZlckVuZCAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLworCisqLworCitzdHJ1Y3Qgd2wzNTAxX2NhcmQgeworCWludAkJCQliYXNlX2FkZHI7CisJdTgJCQkJbWFjX2FkZHJbRVRIX0FMRU5dOworCXNwaW5sb2NrX3QJCQlsb2NrOworCXdhaXRfcXVldWVfaGVhZF90CQl3YWl0OworCXN0cnVjdCB3bDM1MDFfZ2V0X2NvbmZpcm0Jc2lnX2dldF9jb25maXJtOworCXN0cnVjdCB3bDM1MDFfcHdyX21nbXRfY29uZmlybQlzaWdfcHdyX21nbXRfY29uZmlybTsKKwl1MTYJCQkJdHhfYnVmZmVyX3NpemU7CisJdTE2CQkJCXR4X2J1ZmZlcl9oZWFkOworCXUxNgkJCQl0eF9idWZmZXJfdGFpbDsKKwl1MTYJCQkJdHhfYnVmZmVyX2NudDsKKwl1MTYJCQkJZXNicV9yZXFfc3RhcnQ7CisJdTE2CQkJCWVzYnFfcmVxX2VuZDsKKwl1MTYJCQkJZXNicV9yZXFfaGVhZDsKKwl1MTYJCQkJZXNicV9yZXFfdGFpbDsKKwl1MTYJCQkJZXNicV9jb25maXJtX3N0YXJ0OworCXUxNgkJCQllc2JxX2NvbmZpcm1fZW5kOworCXUxNgkJCQllc2JxX2NvbmZpcm07CisJc3RydWN0IGl3X21nbXRfZXNzaWRfcHNldCAgCWVzc2lkOworCXN0cnVjdCBpd19tZ210X2Vzc2lkX3BzZXQgIAlrZWVwX2Vzc2lkOworCXU4CQkJCWJzc2lkW0VUSF9BTEVOXTsKKwlpbnQJCQkJbmV0X3R5cGU7CisJY2hhcgkJCQluaWNrWzMyXTsKKwljaGFyCQkJCWNhcmRfbmFtZVszMl07CisJY2hhcgkJCQlmaXJtd2FyZV9kYXRlWzMyXTsKKwl1OAkJCQljaGFuOworCXU4CQkJCWNhcF9pbmZvOworCXUxNgkJCQlzdGFydF9zZWc7CisJdTE2CQkJCWJzc19jbnQ7CisJdTE2CQkJCWpvaW5fc3RhX2JzczsKKwl1OAkJCQlyc3NpOworCXU4CQkJCWFkaG9jX3RpbWVzOworCXU4CQkJCXJlZ19kb21haW47CisJdTgJCQkJdmVyc2lvblsyXTsKKwlzdHJ1Y3Qgd2wzNTAxX3NjYW5fY29uZmlybQlic3Nfc2V0WzIwXTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAJc3RhdHM7CisJc3RydWN0IGl3X3N0YXRpc3RpY3MJCXdzdGF0czsKKwlzdHJ1Y3QgaXdfc3B5X2RhdGEJCXNweV9kYXRhOworCXN0cnVjdCBkZXZfbm9kZV90CQlub2RlOworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDMzZTVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxX2NzLmMKQEAgLTAsMCArMSwyMjcwIEBACisvKgorICogV0wzNTAxIFdpcmVsZXNzIExBTiBQQ01DSUEgQ2FyZCBEcml2ZXIgZm9yIExpbnV4CisgKiBXcml0dGVuIG9yaWdpbmFsbHkgZm9yIExpbnV4IDIuMC4zMCBieSBGb3ggQ2hlbiwgbWhjaGVuQGdvbGYuY2NsLml0cmkub3JnLnR3CisgKiBQb3J0ZWQgdG8gMi4yLCAyLjQgJiAyLjUgYnkgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgKiBXaXJlbGVzcyBleHRlbnNpb25zIGluIDIuNCBieSBHdXN0YXZvIE5pZW1leWVyIDxuaWVtZXllckBjb25lY3RpdmEuY29tPgorICoKKyAqIFJlZmVyZW5jZXMgdXNlZCBieSBGb3ggQ2hlbiB3aGlsZSB3cml0aW5nIHRoZSBvcmlnaW5hbCBkcml2ZXIgZm9yIDIuMC4zMDoKKyAqCisgKiAgIDEuIFdMMjR4eCBwYWNrZXQgZHJpdmVycyAodG9vYXNtLmFzbSkKKyAqICAgMi4gQWNjZXNzIFBvaW50IEZpcm13YXJlIEludGVyZmFjZSBTcGVjaWZpY2F0aW9uIGZvciBJRUVFIDgwMi4xMSBTVVRSTworICogICAzLiBJRUVFIDgwMi4xMQorICogICA0LiBMaW51eCBuZXR3b3JrIGRyaXZlciAoL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQpCisgKiAgIDUuIElTQSBjYXJkIGRyaXZlciAtIHdsMjQuYworICogICA2LiBMaW51eCBQQ01DSUEgc2tlbGV0b24gZHJpdmVyIC0gc2tlbGV0b24uYworICogICA3LiBMaW51eCBQQ01DSUEgM2M1ODkgbmV0d29yayBkcml2ZXIgLSAzYzU4OV9jcy5jCisgKgorICogVGVzdGVkIHdpdGggV0wyNDAwIGZpcm13YXJlIDEuMiwgTGludXggMi4wLjMwLCBhbmQgcGNtY2lhLWNzLTIuOS4xMgorICogICAxLiBQZXJmb3JtYW5jZTogYWJvdXQgMTY1IEtieXRlcy9zZWMgaW4gVENQL0lQIHdpdGggQWQtSG9jIG1vZGUuCisgKiAgICAgIHJzaCAxOTIuMTY4LjEuMyAiZGQgaWY9L2Rldi96ZXJvIGJzPTFrIGNvdW50PTEwMDAiID4gL2Rldi9udWxsCisgKiAgICAgIChTcGVjaWZpY2F0aW9uIDJNIGJpdHMvc2VjLiBpcyBhYm91dCAyNTAgS2J5dGVzL3NlYy4sIGJ1dCB3ZSBtdXN0IGRlZHVjdAorICogICAgICAgRVRIRVIvSVAvVURQL1RDUCBoZWFkZXIsIGFuZCBhY2tub3dsZWRnZW1lbnQgb3ZlcmhlYWQpCisgKgorICogVGVzdGVkIHdpdGggUGxhbmV0IEFQIGluIDIuNC4xNywgMTg0IEtieXRlcy9zIGluIFVEUCBpbiBJbmZyYXN0cnVjdHVyZSBtb2RlLAorICogMTczIEtieXRlcy9zIGluIFRDUC4KKyAqCisgKiBUZXN0ZWQgd2l0aCBQbGFuZXQgQVAgaW4gMi41LjczLWJrLCAyMTYgS2J5dGVzL3MgaW4gSW5mcmFzdHJ1Y3R1cmUgbW9kZQorICogd2l0aCBhIFNNUCBtYWNoaW5lIChkdWFsIHBlbnRpdW0gMTAwKSwgdXNpbmcgcGt0Z2VuLCA0MzIgcHBzIChwa3Rfc2l6ZSA9IDYwKQorICovCisjdW5kZWYgUkVBTExZX1NMT1dfSU8JLyogbW9zdCBzeXN0ZW1zIGNhbiBzYWZlbHkgdW5kZWYgdGhpcyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisKKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorCisjaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KKyNpbmNsdWRlIDxwY21jaWEvY3MuaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICJ3bDM1MDEuaCIKKworI2lmbmRlZiBfX2kzODZfXworI2RlZmluZSBzbG93X2Rvd25faW8oKQorI2VuZGlmCisKKy8qIEZvciByb3VnaCBjb25zdGFudCBkZWxheSAqLworI2RlZmluZSBXTDM1MDFfTk9QTE9PUChuKSB7IGludCB4ID0gMDsgd2hpbGUgKHgrKyA8IG4pIHNsb3dfZG93bl9pbygpOyB9CisKKy8qCisgKiBBbGwgdGhlIFBDTUNJQSBtb2R1bGVzIHVzZSBQQ01DSUFfREVCVUcgdG8gY29udHJvbCBkZWJ1Z2dpbmcuICBJZiB5b3UgZG8gbm90CisgKiBkZWZpbmUgUENNQ0lBX0RFQlVHIGF0IGFsbCwgYWxsIHRoZSBkZWJ1ZyBjb2RlIHdpbGwgYmUgbGVmdCBvdXQuICBJZiB5b3UKKyAqIGNvbXBpbGUgd2l0aCBQQ01DSUFfREVCVUc9MCwgdGhlIGRlYnVnIGNvZGUgd2lsbCBiZSBwcmVzZW50IGJ1dCBkaXNhYmxlZCAtLQorICogYnV0IGl0IGNhbiB0aGVuIGJlIGVuYWJsZWQgZm9yIHNwZWNpZmljIG1vZHVsZXMgYXQgbG9hZCB0aW1lIHdpdGggYQorICogJ3BjX2RlYnVnPSMnIG9wdGlvbiB0byBpbnNtb2QuCisgKi8KKyNkZWZpbmUgUENNQ0lBX0RFQlVHIDAKKyNpZmRlZiBQQ01DSUFfREVCVUcKK3N0YXRpYyBpbnQgcGNfZGVidWcgPSBQQ01DSUFfREVCVUc7Cittb2R1bGVfcGFyYW0ocGNfZGVidWcsIGludCwgMCk7CisjZGVmaW5lIGRwcmludGsobiwgZm9ybWF0LCBhcmdzLi4uKSBcCisJeyBpZiAocGNfZGVidWcgPiAobikpIFwKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICIgZm9ybWF0ICJcbiIsIF9fRlVOQ1RJT05fXyAsICMjYXJncyk7IH0KKyNlbHNlCisjZGVmaW5lIGRwcmludGsobiwgZm9ybWF0LCBhcmdzLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgd2wzNTAxX291dGIoYSwgYikgeyBvdXRiKGEsIGIpOyBzbG93X2Rvd25faW8oKTsgfQorI2RlZmluZSB3bDM1MDFfb3V0Yl9wKGEsIGIpIHsgb3V0Yl9wKGEsIGIpOyBzbG93X2Rvd25faW8oKTsgfQorI2RlZmluZSB3bDM1MDFfb3V0c2IoYSwgYiwgYykgeyBvdXRzYihhLCBiLCBjKTsgc2xvd19kb3duX2lvKCk7IH0KKworI2RlZmluZSBXTDM1MDFfUkVMRUFTRV9USU1FT1VUICgyNSAqIEhaKQorI2RlZmluZSBXTDM1MDFfTUFYX0FESE9DX1RSSUVTIDE2CisKKyNkZWZpbmUgV0wzNTAxX1JFU1VNRQkwCisjZGVmaW5lIFdMMzUwMV9TVVNQRU5ECTEKKworLyoKKyAqIFRoZSBldmVudCgpIGZ1bmN0aW9uIGlzIHRoaXMgZHJpdmVyJ3MgQ2FyZCBTZXJ2aWNlcyBldmVudCBoYW5kbGVyLiAgSXQgd2lsbAorICogYmUgY2FsbGVkIGJ5IENhcmQgU2VydmljZXMgd2hlbiBhbiBhcHByb3ByaWF0ZSBjYXJkIHN0YXR1cyBldmVudCBpcworICogcmVjZWl2ZWQuIFRoZSBjb25maWcoKSBhbmQgcmVsZWFzZSgpIGVudHJ5IHBvaW50cyBhcmUgdXNlZCB0byBjb25maWd1cmUgb3IKKyAqIHJlbGVhc2UgYSBzb2NrZXQsIGluIHJlc3BvbnNlIHRvIGNhcmQgaW5zZXJ0aW9uIGFuZCBlamVjdGlvbiBldmVudHMuICBUaGV5CisgKiBhcmUgaW52b2tlZCBmcm9tIHRoZSB3bDI0IGV2ZW50IGhhbmRsZXIuCisgKi8KK3N0YXRpYyB2b2lkIHdsMzUwMV9jb25maWcoZGV2X2xpbmtfdCAqbGluayk7CitzdGF0aWMgdm9pZCB3bDM1MDFfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKTsKK3N0YXRpYyBpbnQgd2wzNTAxX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmksIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CisKKy8qCisgKiBUaGUgZGV2X2luZm8gdmFyaWFibGUgaXMgdGhlICJrZXkiIHRoYXQgaXMgdXNlZCB0byBtYXRjaCB1cCB0aGlzCisgKiBkZXZpY2UgZHJpdmVyIHdpdGggYXBwcm9wcmlhdGUgY2FyZHMsIHRocm91Z2ggdGhlIGNhcmQgY29uZmlndXJhdGlvbgorICogZGF0YWJhc2UuCisgKi8KK3N0YXRpYyBkZXZfaW5mb190IHdsMzUwMV9kZXZfaW5mbyA9ICJ3bDM1MDFfY3MiOworCitzdGF0aWMgaW50IHdsMzUwMV9jaGFuMmZyZXFbXSA9IHsKKwlbMF0gID0gMjQxMiwgWzFdICA9IDI0MTcsIFsyXSAgPSAyNDIyLCBbM10gID0gMjQyNywgWzRdID0gMjQzMiwKKwlbNV0gID0gMjQzNywgWzZdICA9IDI0NDIsIFs3XSAgPSAyNDQ3LCBbOF0gID0gMjQ1MiwgWzldID0gMjQ1NywKKwlbMTBdID0gMjQ2MiwgWzExXSA9IDI0NjcsIFsxMl0gPSAyNDcyLCBbMTNdID0gMjQ3NywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWludCByZWdfZG9tYWluOworCWludCBtaW4sIG1heCwgZGVmbHQ7Cit9IGl3X2NoYW5uZWxfdGFibGVbXSA9IHsKKwl7CisJCS5yZWdfZG9tYWluID0gSVdfUkVHX0RPTUFJTl9GQ0MsCisJCS5taW4JICAgID0gMSwKKwkJLm1heAkgICAgPSAxMSwKKwkJLmRlZmx0CSAgICA9IDEsCisJfSwKKwl7CisJCS5yZWdfZG9tYWluID0gSVdfUkVHX0RPTUFJTl9ET0MsCisJCS5taW4JICAgID0gMSwKKwkJLm1heAkgICAgPSAxMSwKKwkJLmRlZmx0CSAgICA9IDEsCisJfSwKKwl7CisJCS5yZWdfZG9tYWluID0gSVdfUkVHX0RPTUFJTl9FVFNJLAorCQkubWluCSAgICA9IDEsCisJCS5tYXgJICAgID0gMTMsCisJCS5kZWZsdAkgICAgPSAxLAorCX0sCisJeworCQkucmVnX2RvbWFpbiA9IElXX1JFR19ET01BSU5fU1BBSU4sCisJCS5taW4JICAgID0gMTAsCisJCS5tYXgJICAgID0gMTEsCisJCS5kZWZsdAkgICAgPSAxMCwKKwl9LAorCXsKKwkJLnJlZ19kb21haW4gPSBJV19SRUdfRE9NQUlOX0ZSQU5DRSwKKwkJLm1pbgkgICAgPSAxMCwKKwkJLm1heAkgICAgPSAxMywKKwkJLmRlZmx0CSAgICA9IDEwLAorCX0sCisJeworCQkucmVnX2RvbWFpbiA9IElXX1JFR19ET01BSU5fTUtLLAorCQkubWluCSAgICA9IDE0LAorCQkubWF4CSAgICA9IDE0LAorCQkuZGVmbHQJICAgID0gMTQsCisJfSwKKwl7CisJCS5yZWdfZG9tYWluID0gSVdfUkVHX0RPTUFJTl9NS0sxLAorCQkubWluCSAgICA9IDEsCisJCS5tYXgJICAgID0gMTQsCisJCS5kZWZsdAkgICAgPSAxLAorCX0sCisJeworCQkucmVnX2RvbWFpbiA9IElXX1JFR19ET01BSU5fSVNSQUVMLAorCQkubWluCSAgICA9IDMsCisJCS5tYXgJICAgID0gOSwKKwkJLmRlZmx0CSAgICA9IDksCisJfSwKK307CisKKy8qKgorICogaXdfdmFsaWRfY2hhbm5lbCAtIHZhbGlkYXRlIGNoYW5uZWwgaW4gcmVndWxhdG9yeSBkb21haW4KKyAqIEByZWdfY29tYWluIC0gcmVndWxhdG9yeSBkb21haW4KKyAqIEBjaGFubmVsIC0gY2hhbm5lbCB0byB2YWxpZGF0ZQorICoKKyAqIFJldHVybnMgMCBpZiBpbnZhbGlkIGluIHRoZSBzcGVjaWZpZWQgcmVndWxhdG9yeSBkb21haW4sIG5vbi16ZXJvIGlmIHZhbGlkLgorICovCitzdGF0aWMgaW50IGl3X3ZhbGlkX2NoYW5uZWwoaW50IHJlZ19kb21haW4sIGludCBjaGFubmVsKQoreworCWludCBpLCByYyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpd19jaGFubmVsX3RhYmxlKTsgaSsrKQorCQlpZiAocmVnX2RvbWFpbiA9PSBpd19jaGFubmVsX3RhYmxlW2ldLnJlZ19kb21haW4pIHsKKwkJCXJjID0gY2hhbm5lbCA+PSBpd19jaGFubmVsX3RhYmxlW2ldLm1pbiAmJgorCQkJICAgICBjaGFubmVsIDw9IGl3X2NoYW5uZWxfdGFibGVbaV0ubWF4OworCQkJYnJlYWs7CisJCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogaXdfZGVmYXVsdF9jaGFubmVsIC0gZ2V0IGRlZmF1bHQgY2hhbm5lbCBmb3IgYSByZWd1bGF0b3J5IGRvbWFpbgorICogQHJlZ19jb21haW4gLSByZWd1bGF0b3J5IGRvbWFpbgorICoKKyAqIFJldHVybnMgdGhlIGRlZmF1bHQgY2hhbm5lbCBmb3IgYSByZWd1bGF0b3J5IGRvbWFpbgorICovCitzdGF0aWMgaW50IGl3X2RlZmF1bHRfY2hhbm5lbChpbnQgcmVnX2RvbWFpbikKK3sKKwlpbnQgaSwgcmMgPSAxOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXdfY2hhbm5lbF90YWJsZSk7IGkrKykKKwkJaWYgKHJlZ19kb21haW4gPT0gaXdfY2hhbm5lbF90YWJsZVtpXS5yZWdfZG9tYWluKSB7CisJCQlyYyA9IGl3X2NoYW5uZWxfdGFibGVbaV0uZGVmbHQ7CisJCQlicmVhazsKKwkJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgaXdfc2V0X21nbXRfaW5mb19lbGVtZW50KGVudW0gaXdfbWdtdF9pbmZvX2VsZW1lbnRfaWRzIGlkLAorCQkJCSAgICAgc3RydWN0IGl3X21nbXRfaW5mb19lbGVtZW50ICplbCwKKwkJCQkgICAgIHZvaWQgKnZhbHVlLCBpbnQgbGVuKQoreworCWVsLT5pZCAgPSBpZDsKKwllbC0+bGVuID0gbGVuOworCW1lbWNweShlbC0+ZGF0YSwgdmFsdWUsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIGl3X2NvcHlfbWdtdF9pbmZvX2VsZW1lbnQoc3RydWN0IGl3X21nbXRfaW5mb19lbGVtZW50ICp0bywKKwkJCQkgICAgICBzdHJ1Y3QgaXdfbWdtdF9pbmZvX2VsZW1lbnQgKmZyb20pCit7CisJaXdfc2V0X21nbXRfaW5mb19lbGVtZW50KGZyb20tPmlkLCB0bywgZnJvbS0+ZGF0YSwgZnJvbS0+bGVuKTsKK30KKworLyoKKyAqIEEgbGlua2VkIGxpc3Qgb2YgImluc3RhbmNlcyIgb2YgdGhlIHdsMjQgZGV2aWNlLiAgRWFjaCBhY3R1YWwgUENNQ0lBIGNhcmQKKyAqIGNvcnJlc3BvbmRzIHRvIG9uZSBkZXZpY2UgaW5zdGFuY2UsIGFuZCBpcyBkZXNjcmliZWQgYnkgb25lIGRldl9saW5rX3QKKyAqIHN0cnVjdHVyZSAoZGVmaW5lZCBpbiBkcy5oKS4KKyAqCisgKiBZb3UgbWF5IG5vdCB3YW50IHRvIHVzZSBhIGxpbmtlZCBsaXN0IGZvciB0aGlzIC0tIGZvciBleGFtcGxlLCB0aGUgbWVtb3J5CisgKiBjYXJkIGRyaXZlciB1c2VzIGFuIGFycmF5IG9mIGRldl9saW5rX3QgcG9pbnRlcnMsIHdoZXJlIG1pbm9yIGRldmljZSBudW1iZXJzCisgKiBhcmUgdXNlZCB0byBkZXJpdmUgdGhlIGNvcnJlc3BvbmRpbmcgYXJyYXkgaW5kZXguCisgKi8KK3N0YXRpYyBkZXZfbGlua190ICp3bDM1MDFfZGV2X2xpc3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bDM1MDFfc3dpdGNoX3BhZ2Uoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1OCBwYWdlKQoreworCXdsMzUwMV9vdXRiKHBhZ2UsIHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfQlNTKTsKK30KKworLyoKKyAqIEdldCBFdGhlcm5ldCBNQUMgYWRkcmVzc3MuCisgKgorICogV0FSTklORzogV2Ugc3dpdGNoIHRvIEZQQUdFMCBhbmQgc3dpdGMgYmFjayBhZ2Fpbi4KKyAqICAgICAgICAgIE1ha2luZyBzdXJlIHRoZXJlIGlzIG5vIG90aGVyIFdMIGZ1bmN0aW9uIGJlZW5pbmcgY2FsbGVkIGJ5IElTUi4KKyAqLworc3RhdGljIGludCB3bDM1MDFfZ2V0X2ZsYXNoX21hY19hZGRyKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwlpbnQgYmFzZV9hZGRyID0gdGhpcy0+YmFzZV9hZGRyOworCisJLyogZ2V0IE1BQyBhZGRyICovCisJd2wzNTAxX291dGIoV0wzNTAxX0JTU19GUEFHRTMsIGJhc2VfYWRkciArIFdMMzUwMV9OSUNfQlNTKTsgLyogQlNTICovCisJd2wzNTAxX291dGIoMHgwMCwgYmFzZV9hZGRyICsgV0wzNTAxX05JQ19MTUFMKTsJLyogTE1BTCAqLworCXdsMzUwMV9vdXRiKDB4NDAsIGJhc2VfYWRkciArIFdMMzUwMV9OSUNfTE1BSCk7CS8qIExNQUggKi8KKworCS8qIHdhaXQgZm9yIHJlYWRpbmcgRUVQUk9NICovCisJV0wzNTAxX05PUExPT1AoMTAwKTsKKwl0aGlzLT5tYWNfYWRkclswXSA9IGluYihiYXNlX2FkZHIgKyBXTDM1MDFfTklDX0lPRFBBKTsKKwlXTDM1MDFfTk9QTE9PUCgxMDApOworCXRoaXMtPm1hY19hZGRyWzFdID0gaW5iKGJhc2VfYWRkciArIFdMMzUwMV9OSUNfSU9EUEEpOworCVdMMzUwMV9OT1BMT09QKDEwMCk7CisJdGhpcy0+bWFjX2FkZHJbMl0gPSBpbmIoYmFzZV9hZGRyICsgV0wzNTAxX05JQ19JT0RQQSk7CisJV0wzNTAxX05PUExPT1AoMTAwKTsKKwl0aGlzLT5tYWNfYWRkclszXSA9IGluYihiYXNlX2FkZHIgKyBXTDM1MDFfTklDX0lPRFBBKTsKKwlXTDM1MDFfTk9QTE9PUCgxMDApOworCXRoaXMtPm1hY19hZGRyWzRdID0gaW5iKGJhc2VfYWRkciArIFdMMzUwMV9OSUNfSU9EUEEpOworCVdMMzUwMV9OT1BMT09QKDEwMCk7CisJdGhpcy0+bWFjX2FkZHJbNV0gPSBpbmIoYmFzZV9hZGRyICsgV0wzNTAxX05JQ19JT0RQQSk7CisJV0wzNTAxX05PUExPT1AoMTAwKTsKKwl0aGlzLT5yZWdfZG9tYWluID0gaW5iKGJhc2VfYWRkciArIFdMMzUwMV9OSUNfSU9EUEEpOworCVdMMzUwMV9OT1BMT09QKDEwMCk7CisJd2wzNTAxX291dGIoV0wzNTAxX0JTU19GUEFHRTAsIGJhc2VfYWRkciArIFdMMzUwMV9OSUNfQlNTKTsKKwl3bDM1MDFfb3V0YigweDA0LCBiYXNlX2FkZHIgKyBXTDM1MDFfTklDX0xNQUwpOworCXdsMzUwMV9vdXRiKDB4NDAsIGJhc2VfYWRkciArIFdMMzUwMV9OSUNfTE1BSCk7CisJV0wzNTAxX05PUExPT1AoMTAwKTsKKwl0aGlzLT52ZXJzaW9uWzBdID0gaW5iKGJhc2VfYWRkciArIFdMMzUwMV9OSUNfSU9EUEEpOworCVdMMzUwMV9OT1BMT09QKDEwMCk7CisJdGhpcy0+dmVyc2lvblsxXSA9IGluYihiYXNlX2FkZHIgKyBXTDM1MDFfTklDX0lPRFBBKTsKKwkvKiBzd2l0Y2ggdG8gU1JBTSBQYWdlIDAgKGZvciBzYWZldHkpICovCisJd2wzNTAxX3N3aXRjaF9wYWdlKHRoaXMsIFdMMzUwMV9CU1NfU1BBR0UwKTsKKworCS8qIFRoZSBNQUMgYWRkciBzaG91bGQgYmUgMDA6NjA6Li4uICovCisJcmV0dXJuIHRoaXMtPm1hY19hZGRyWzBdID09IDB4MDAgJiYgdGhpcy0+bWFjX2FkZHJbMV0gPT0gMHg2MDsKK30KKworLyoqCisgKiB3bDM1MDFfc2V0X3RvX3dsYSAtIE1vdmUgJ3NpemUnIGJ5dGVzIGZyb20gUEMgdG8gY2FyZAorICogQGRlc3Q6IENhcmQgYWRkcmVzc2luZyBzcGFjZQorICogQHNyYzogUEMgYWRkcmVzc2luZyBzcGFjZQorICogQHNpemU6IEJ5dGVzIHRvIG1vdmUKKyAqCisgKiBNb3ZlICdzaXplJyBieXRlcyBmcm9tIFBDIHRvIGNhcmQuIChTaG91bGRuJ3QgYmUgaW50ZXJydXB0ZWQpCisgKi8KK3ZvaWQgd2wzNTAxX3NldF90b193bGEoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1MTYgZGVzdCwgdm9pZCAqc3JjLCBpbnQgc2l6ZSkKK3sKKwkvKiBzd2l0Y2ggdG8gU1JBTSBQYWdlIDAgKi8KKwl3bDM1MDFfc3dpdGNoX3BhZ2UodGhpcywgKGRlc3QgJiAweDgwMDApID8gV0wzNTAxX0JTU19TUEFHRTEgOgorCQkJCQkJICAgV0wzNTAxX0JTU19TUEFHRTApOworCS8qIHNldCBMTUFMIGFuZCBMTUFIICovCisJd2wzNTAxX291dGIoZGVzdCAmIDB4ZmYsIHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfTE1BTCk7CisJd2wzNTAxX291dGIoKChkZXN0ID4+IDgpICYgMHg3ZiksIHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfTE1BSCk7CisKKwkvKiByZXAgb3V0IHRvIFBvcnQgQSAqLworCXdsMzUwMV9vdXRzYih0aGlzLT5iYXNlX2FkZHIgKyBXTDM1MDFfTklDX0lPRFBBLCBzcmMsIHNpemUpOworfQorCisvKioKKyAqIHdsMzUwMV9nZXRfZnJvbV93bGEgLSBNb3ZlICdzaXplJyBieXRlcyBmcm9tIGNhcmQgdG8gUEMKKyAqIEBzcmM6IENhcmQgYWRkcmVzc2luZyBzcGFjZQorICogQGRlc3Q6IFBDIGFkZHJlc3Npbmcgc3BhY2UKKyAqIEBzaXplOiBCeXRlcyB0byBtb3ZlCisgKgorICogTW92ZSAnc2l6ZScgYnl0ZXMgZnJvbSBjYXJkIHRvIFBDLiAoU2hvdWxkbid0IGJlIGludGVycnVwdGVkKQorICovCit2b2lkIHdsMzUwMV9nZXRfZnJvbV93bGEoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1MTYgc3JjLCB2b2lkICpkZXN0LAorCQkJIGludCBzaXplKQoreworCS8qIHN3aXRjaCB0byBTUkFNIFBhZ2UgMCAqLworCXdsMzUwMV9zd2l0Y2hfcGFnZSh0aGlzLCAoc3JjICYgMHg4MDAwKSA/IFdMMzUwMV9CU1NfU1BBR0UxIDoKKwkJCQkJCSAgV0wzNTAxX0JTU19TUEFHRTApOworCS8qIHNldCBMTUFMIGFuZCBMTUFIICovCisJd2wzNTAxX291dGIoc3JjICYgMHhmZiwgdGhpcy0+YmFzZV9hZGRyICsgV0wzNTAxX05JQ19MTUFMKTsKKwl3bDM1MDFfb3V0Yigoc3JjID4+IDgpICYgMHg3ZiwgdGhpcy0+YmFzZV9hZGRyICsgV0wzNTAxX05JQ19MTUFIKTsKKworCS8qIHJlcCBnZXQgZnJvbSBQb3J0IEEgKi8KKwlpbnNiKHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfSU9EUEEsIGRlc3QsIHNpemUpOworfQorCisvKgorICogR2V0L0FsbG9jYXRlIGEgZnJlZSBUeCBEYXRhIEJ1ZmZlcgorICoKKyAqICAqLS0tLS0tLS0tLS0tLS0qLS0tLS0tLS0tLS0tLS0tLS0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqICB8ICAgIFBMQ1AgICAgICB8ICAgIE1BQyBIZWFkZXIgICB8ICBEU1QgIFNSQyAgICAgICAgIERhdGEgLi4uICAgICAgIHwKKyAqICB8ICAoMjQgYnl0ZXMpICB8ICAgICgzMCBieXRlcykgICB8ICAoNikgICg2KSAgKEV0aGVybmV0IFJvdyBEYXRhKSAgIHwKKyAqICAqLS0tLS0tLS0tLS0tLS0qLS0tLS0tLS0tLS0tLS0tLS0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqICBcICAgICAgICAgICAgICAgXC0gSUVFRSA4MDIuMTEgLS8gXC0tLS0tLS0tLS0tLS0tIGxlbiAtLS0tLS0tLS0tLS0tLS8KKyAqICAgXC1zdHJ1Y3Qgd2wzNTAxXzgwMjExX3R4X2hkci0tLyAgIFwtLS0tLS0tLSBFdGhlcm5ldCBGcmFtZSAtLS0tLS0tLworICoKKyAqIFJldHVybiA9IFBvc3Rpb24gaW4gQ2FyZAorICovCitzdGF0aWMgdTE2IHdsMzUwMV9nZXRfdHhfYnVmZmVyKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywgdTE2IGxlbikKK3sKKwl1MTYgbmV4dCwgYmxrX2NudCA9IDAsIHplcm8gPSAwOworCXUxNiBmdWxsX2xlbiA9IHNpemVvZihzdHJ1Y3Qgd2wzNTAxXzgwMjExX3R4X2hkcikgKyBsZW47CisJdTE2IHJldCA9IDA7CisKKwlpZiAoZnVsbF9sZW4gPiB0aGlzLT50eF9idWZmZXJfY250ICogMjU0KQorCQlnb3RvIG91dDsKKwlyZXQgPSB0aGlzLT50eF9idWZmZXJfaGVhZDsKKwl3aGlsZSAoZnVsbF9sZW4pIHsKKwkJaWYgKGZ1bGxfbGVuIDwgMjU0KQorCQkJZnVsbF9sZW4gPSAwOworCQllbHNlCisJCQlmdWxsX2xlbiAtPSAyNTQ7CisJCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgdGhpcy0+dHhfYnVmZmVyX2hlYWQsICZuZXh0LAorCQkJCSAgICBzaXplb2YobmV4dCkpOworCQlpZiAoIWZ1bGxfbGVuKQorCQkJd2wzNTAxX3NldF90b193bGEodGhpcywgdGhpcy0+dHhfYnVmZmVyX2hlYWQsICZ6ZXJvLAorCQkJCQkgIHNpemVvZih6ZXJvKSk7CisJCXRoaXMtPnR4X2J1ZmZlcl9oZWFkID0gbmV4dDsKKwkJYmxrX2NudCsrOworCQkvKiBpZiBidWZmZXIgaXMgbm90IGVub3VnaCAqLworCQlpZiAoIW5leHQgJiYgZnVsbF9sZW4pIHsKKwkJCXRoaXMtPnR4X2J1ZmZlcl9oZWFkID0gcmV0OworCQkJcmV0ID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCXRoaXMtPnR4X2J1ZmZlcl9jbnQgLT0gYmxrX2NudDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnJlZSBhbiBhbGxvY2F0ZWQgVHggQnVmZmVyLiBwdHIgbXVzdCBiZSBjb3JyZWN0IHBvc2l0aW9uLgorICovCitzdGF0aWMgdm9pZCB3bDM1MDFfZnJlZV90eF9idWZmZXIoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1MTYgcHRyKQoreworCS8qIGNoZWNrIGlmIGFsbCBzcGFjZSBpcyBub3QgZnJlZSAqLworCWlmICghdGhpcy0+dHhfYnVmZmVyX2hlYWQpCisJCXRoaXMtPnR4X2J1ZmZlcl9oZWFkID0gcHRyOworCWVsc2UKKwkJd2wzNTAxX3NldF90b193bGEodGhpcywgdGhpcy0+dHhfYnVmZmVyX3RhaWwsCisJCQkJICAmcHRyLCBzaXplb2YocHRyKSk7CisJd2hpbGUgKHB0cikgeworCQl1MTYgbmV4dDsKKworCQl0aGlzLT50eF9idWZmZXJfY250Kys7CisJCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgcHRyLCAmbmV4dCwgc2l6ZW9mKG5leHQpKTsKKwkJdGhpcy0+dHhfYnVmZmVyX3RhaWwgPSBwdHI7CisJCXB0ciA9IG5leHQ7CisJfQorfQorCitzdGF0aWMgaW50IHdsMzUwMV9lc2JxX3JlcV90ZXN0KHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwl1OCB0bXA7CisKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIHRoaXMtPmVzYnFfcmVxX2hlYWQgKyAzLCAmdG1wLCBzaXplb2YodG1wKSk7CisJcmV0dXJuIHRtcCAmIDB4ODA7Cit9CisKK3N0YXRpYyB2b2lkIHdsMzUwMV9lc2JxX3JlcShzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIHUxNiAqcHRyKQoreworCXUxNiB0bXAgPSAwOworCisJd2wzNTAxX3NldF90b193bGEodGhpcywgdGhpcy0+ZXNicV9yZXFfaGVhZCwgcHRyLCAyKTsKKwl3bDM1MDFfc2V0X3RvX3dsYSh0aGlzLCB0aGlzLT5lc2JxX3JlcV9oZWFkICsgMiwgJnRtcCwgc2l6ZW9mKHRtcCkpOworCXRoaXMtPmVzYnFfcmVxX2hlYWQgKz0gNDsKKwlpZiAodGhpcy0+ZXNicV9yZXFfaGVhZCA+PSB0aGlzLT5lc2JxX3JlcV9lbmQpCisJCXRoaXMtPmVzYnFfcmVxX2hlYWQgPSB0aGlzLT5lc2JxX3JlcV9zdGFydDsKK30KKworc3RhdGljIGludCB3bDM1MDFfZXNicV9leGVjKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywgdm9pZCAqc2lnLCBpbnQgc2lnX3NpemUpCit7CisJaW50IHJjID0gLUVJTzsKKworCWlmICh3bDM1MDFfZXNicV9yZXFfdGVzdCh0aGlzKSkgeworCQl1MTYgcHRyID0gd2wzNTAxX2dldF90eF9idWZmZXIodGhpcywgc2lnX3NpemUpOworCQlpZiAocHRyKSB7CisJCQl3bDM1MDFfc2V0X3RvX3dsYSh0aGlzLCBwdHIsIHNpZywgc2lnX3NpemUpOworCQkJd2wzNTAxX2VzYnFfcmVxKHRoaXMsICZwdHIpOworCQkJcmMgPSAwOworCQl9CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X21pYl92YWx1ZShzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIHU4IGluZGV4LAorCQkJCXZvaWQgKmJmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2dldF9yZXEgc2lnID0geworCQkuc2lnX2lkCSAgICA9IFdMMzUwMV9TSUdfR0VUX1JFUSwKKwkJLm1pYl9hdHRyaWIgPSBpbmRleCwKKwl9OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gLUVJTzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CisJaWYgKHdsMzUwMV9lc2JxX3JlcV90ZXN0KHRoaXMpKSB7CisJCXUxNiBwdHIgPSB3bDM1MDFfZ2V0X3R4X2J1ZmZlcih0aGlzLCBzaXplb2Yoc2lnKSk7CisJCWlmIChwdHIpIHsKKwkJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsIHB0ciwgJnNpZywgc2l6ZW9mKHNpZykpOworCQkJd2wzNTAxX2VzYnFfcmVxKHRoaXMsICZwdHIpOworCQkJdGhpcy0+c2lnX2dldF9jb25maXJtLm1pYl9zdGF0dXMgPSAyNTU7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CisJCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh0aGlzLT53YWl0LAorCQkJCXRoaXMtPnNpZ19nZXRfY29uZmlybS5taWJfc3RhdHVzICE9IDI1NSk7CisJCQlpZiAoIXJjKQorCQkJCW1lbWNweShiZiwgdGhpcy0+c2lnX2dldF9jb25maXJtLm1pYl92YWx1ZSwKKwkJCQkgICAgICAgc2l6ZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9wd3JfbWdtdChzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIGludCBzdXNwZW5kKQoreworCXN0cnVjdCB3bDM1MDFfcHdyX21nbXRfcmVxIHNpZyA9IHsKKwkJLnNpZ19pZAkJPSBXTDM1MDFfU0lHX1BXUl9NR01UX1JFUSwKKwkJLnB3cl9zYXZlCT0gc3VzcGVuZCwKKwkJLndha2VfdXAJPSAhc3VzcGVuZCwKKwkJLnJlY2VpdmVfZHRpbXMJPSAxMCwKKwl9OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gLUVJTzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CisJaWYgKHdsMzUwMV9lc2JxX3JlcV90ZXN0KHRoaXMpKSB7CisJCXUxNiBwdHIgPSB3bDM1MDFfZ2V0X3R4X2J1ZmZlcih0aGlzLCBzaXplb2Yoc2lnKSk7CisJCWlmIChwdHIpIHsKKwkJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsIHB0ciwgJnNpZywgc2l6ZW9mKHNpZykpOworCQkJd2wzNTAxX2VzYnFfcmVxKHRoaXMsICZwdHIpOworCQkJdGhpcy0+c2lnX3B3cl9tZ210X2NvbmZpcm0uc3RhdHVzID0gMjU1OworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhpcy0+bG9jaywgZmxhZ3MpOworCQkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUodGhpcy0+d2FpdCwKKwkJCQl0aGlzLT5zaWdfcHdyX21nbXRfY29uZmlybS5zdGF0dXMgIT0gMjU1KTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBzdGF0dXM9JWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgICBzdXNwZW5kID8gInN1c3BlbmQiIDogInJlc3VtZSIsCisJCQkgICAgICAgdGhpcy0+c2lnX3B3cl9tZ210X2NvbmZpcm0uc3RhdHVzKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogd2wzNTAxX3NlbmRfcGt0IC0gU2VuZCBhIHBhY2tldC4KKyAqIEB0aGlzIC0gY2FyZAorICoKKyAqIFNlbmQgYSBwYWNrZXQuCisgKgorICogZGF0YSA9IEV0aGVybmV0IHJhdyBmcmFtZS4gIChlLmcuIGRhdGFbMF0gLSBkYXRhWzVdIGlzIERlc3QgTUFDIEFkZHIsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVs2XSAtIGRhdGFbMTFdIGlzIFNyYyBNQUMgQWRkcikKKyAqIFJlZjogSUVFRSA4MDIuMTEKKyAqLworc3RhdGljIGludCB3bDM1MDFfc2VuZF9wa3Qoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1OCAqZGF0YSwgdTE2IGxlbikKK3sKKwl1MTYgYmYsIHNpZ19iZiwgbmV4dCwgdG1wbGVuLCBwa3RsZW47CisJc3RydWN0IHdsMzUwMV9tZF9yZXEgc2lnID0geworCQkuc2lnX2lkID0gV0wzNTAxX1NJR19NRF9SRVEsCisJfTsKKwl1OCAqcGRhdGEgPSAoY2hhciAqKWRhdGE7CisJaW50IHJjID0gLUVJTzsKKworCWlmICh3bDM1MDFfZXNicV9yZXFfdGVzdCh0aGlzKSkgeworCQlzaWdfYmYgPSB3bDM1MDFfZ2V0X3R4X2J1ZmZlcih0aGlzLCBzaXplb2Yoc2lnKSk7CisJCXJjID0gLUVOT01FTTsKKwkJaWYgKCFzaWdfYmYpCS8qIE5vIGZyZWUgYnVmZmVyIGF2YWlsYWJsZSAqLworCQkJZ290byBvdXQ7CisJCWJmID0gd2wzNTAxX2dldF90eF9idWZmZXIodGhpcywgbGVuICsgMjYgKyAyNCk7CisJCWlmICghYmYpIHsKKwkJCS8qIE5vIGZyZWUgYnVmZmVyIGF2YWlsYWJsZSAqLworCQkJd2wzNTAxX2ZyZWVfdHhfYnVmZmVyKHRoaXMsIHNpZ19iZik7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyYyA9IDA7CisJCW1lbWNweSgmc2lnLmRhZGRyWzBdLCBwZGF0YSwgMTIpOworCQlwa3RsZW4gPSBsZW4gLSAxMjsKKwkJcGRhdGEgKz0gMTI7CisJCXNpZy5kYXRhID0gYmY7CisJCWlmICgoKCpwZGF0YSkgKiAyNTYgKyAoKihwZGF0YSArIDEpKSkgPiAxNTAwKSB7CisJCQl1OCBhZGRyNFtFVEhfQUxFTl0gPSB7CisJCQkJWzBdID0gMHhBQSwgWzFdID0gMHhBQSwgWzJdID0gMHgwMywgWzRdID0gMHgwMCwKKwkJCX07CisKKwkJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsIGJmICsgMiArCisJCQkJCSAgb2Zmc2V0b2Yoc3RydWN0IHdsMzUwMV90eF9oZHIsIGFkZHI0KSwKKwkJCQkJICBhZGRyNCwgc2l6ZW9mKGFkZHI0KSk7CisJCQlzaWcuc2l6ZSA9IHBrdGxlbiArIDI0ICsgNCArIDY7CisJCQlpZiAocGt0bGVuID4gKDI1NCAtIHNpemVvZihzdHJ1Y3Qgd2wzNTAxX3R4X2hkcikpKSB7CisJCQkJdG1wbGVuID0gMjU0IC0gc2l6ZW9mKHN0cnVjdCB3bDM1MDFfdHhfaGRyKTsKKwkJCQlwa3RsZW4gLT0gdG1wbGVuOworCQkJfSBlbHNlIHsKKwkJCQl0bXBsZW4gPSBwa3RsZW47CisJCQkJcGt0bGVuID0gMDsKKwkJCX0KKwkJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsCisJCQkJCSAgYmYgKyAyICsgc2l6ZW9mKHN0cnVjdCB3bDM1MDFfdHhfaGRyKSwKKwkJCQkJICBwZGF0YSwgdG1wbGVuKTsKKwkJCXBkYXRhICs9IHRtcGxlbjsKKwkJCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYmYsICZuZXh0LCBzaXplb2YobmV4dCkpOworCQkJYmYgPSBuZXh0OworCQl9IGVsc2UgeworCQkJc2lnLnNpemUgPSBwa3RsZW4gKyAyNCArIDQgLSAyOworCQkJcGRhdGEgKz0gMjsKKwkJCXBrdGxlbiAtPSAyOworCQkJaWYgKHBrdGxlbiA+ICgyNTQgLSBzaXplb2Yoc3RydWN0IHdsMzUwMV90eF9oZHIpICsgNikpIHsKKwkJCQl0bXBsZW4gPSAyNTQgLSBzaXplb2Yoc3RydWN0IHdsMzUwMV90eF9oZHIpICsgNjsKKwkJCQlwa3RsZW4gLT0gdG1wbGVuOworCQkJfSBlbHNlIHsKKwkJCQl0bXBsZW4gPSBwa3RsZW47CisJCQkJcGt0bGVuID0gMDsKKwkJCX0KKwkJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsIGJmICsgMiArCisJCQkJCSAgb2Zmc2V0b2Yoc3RydWN0IHdsMzUwMV90eF9oZHIsIGFkZHI0KSwKKwkJCQkJICBwZGF0YSwgdG1wbGVuKTsKKwkJCXBkYXRhICs9IHRtcGxlbjsKKwkJCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYmYsICZuZXh0LCBzaXplb2YobmV4dCkpOworCQkJYmYgPSBuZXh0OworCQl9CisJCXdoaWxlIChwa3RsZW4gPiAwKSB7CisJCQlpZiAocGt0bGVuID4gMjU0KSB7CisJCQkJdG1wbGVuID0gMjU0OworCQkJCXBrdGxlbiAtPSAyNTQ7CisJCQl9IGVsc2UgeworCQkJCXRtcGxlbiA9IHBrdGxlbjsKKwkJCQlwa3RsZW4gPSAwOworCQkJfQorCQkJd2wzNTAxX3NldF90b193bGEodGhpcywgYmYgKyAyLCBwZGF0YSwgdG1wbGVuKTsKKwkJCXBkYXRhICs9IHRtcGxlbjsKKwkJCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYmYsICZuZXh0LCBzaXplb2YobmV4dCkpOworCQkJYmYgPSBuZXh0OworCQl9CisJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsIHNpZ19iZiwgJnNpZywgc2l6ZW9mKHNpZykpOworCQl3bDM1MDFfZXNicV9yZXEodGhpcywgJnNpZ19iZik7CisJfQorb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3bDM1MDFfbWdtdF9yZXN5bmMoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXN0cnVjdCB3bDM1MDFfcmVzeW5jX3JlcSBzaWcgPSB7CisJCS5zaWdfaWQgPSBXTDM1MDFfU0lHX1JFU1lOQ19SRVEsCisJfTsKKworCXJldHVybiB3bDM1MDFfZXNicV9leGVjKHRoaXMsICZzaWcsIHNpemVvZihzaWcpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgd2wzNTAxX2Z3X2Jzc190eXBlKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwlyZXR1cm4gdGhpcy0+bmV0X3R5cGUgPT0gSVdfTU9ERV9JTkZSQSA/IFdMMzUwMV9ORVRfVFlQRV9JTkZSQSA6CisJCQkJCQkgV0wzNTAxX05FVF9UWVBFX0FESE9DOworfQorCitzdGF0aWMgaW5saW5lIGludCB3bDM1MDFfZndfY2FwX2luZm8oc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXJldHVybiB0aGlzLT5uZXRfdHlwZSA9PSBJV19NT0RFX0lORlJBID8gV0wzNTAxX01HTVRfQ0FQQUJJTElUWV9FU1MgOgorCQkJCQkJIFdMMzUwMV9NR01UX0NBUEFCSUxJVFlfSUJTUzsKK30KKworc3RhdGljIGludCB3bDM1MDFfbWdtdF9zY2FuKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywgdTE2IGNoYW5fdGltZSkKK3sKKwlzdHJ1Y3Qgd2wzNTAxX3NjYW5fcmVxIHNpZyA9IHsKKwkJLnNpZ19pZAkJPSBXTDM1MDFfU0lHX1NDQU5fUkVRLAorCQkuc2Nhbl90eXBlCT0gV0wzNTAxX1NDQU5fVFlQRV9BQ1RJVkUsCisJCS5wcm9iZV9kZWxheQk9IDB4MTAsCisJCS5taW5fY2hhbl90aW1lCT0gY2hhbl90aW1lLAorCQkubWF4X2NoYW5fdGltZQk9IGNoYW5fdGltZSwKKwkJLmJzc190eXBlCT0gd2wzNTAxX2Z3X2Jzc190eXBlKHRoaXMpLAorCX07CisKKwl0aGlzLT5ic3NfY250ID0gdGhpcy0+am9pbl9zdGFfYnNzID0gMDsKKwlyZXR1cm4gd2wzNTAxX2VzYnFfZXhlYyh0aGlzLCAmc2lnLCBzaXplb2Yoc2lnKSk7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX21nbXRfam9pbihzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIHUxNiBzdGFzKQoreworCXN0cnVjdCB3bDM1MDFfam9pbl9yZXEgc2lnID0geworCQkuc2lnX2lkCQkgID0gV0wzNTAxX1NJR19KT0lOX1JFUSwKKwkJLnRpbWVvdXQJICA9IDEwLAorCQkuZHNfcHNldCA9IHsKKwkJCS5lbCA9IHsKKwkJCQkuaWQgID0gSVdfTUdNVF9JTkZPX0VMRU1FTlRfRFNfUEFSQU1FVEVSX1NFVCwKKwkJCQkubGVuID0gMSwKKwkJCX0sCisJCQkuY2hhbgk9IHRoaXMtPmNoYW4sCisJCX0sCisJfTsKKworCW1lbWNweSgmc2lnLmJlYWNvbl9wZXJpb2QsICZ0aGlzLT5ic3Nfc2V0W3N0YXNdLmJlYWNvbl9wZXJpb2QsIDcyKTsKKwlyZXR1cm4gd2wzNTAxX2VzYnFfZXhlYyh0aGlzLCAmc2lnLCBzaXplb2Yoc2lnKSk7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX21nbXRfc3RhcnQoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXN0cnVjdCB3bDM1MDFfc3RhcnRfcmVxIHNpZyA9IHsKKwkJLnNpZ19pZAkJCT0gV0wzNTAxX1NJR19TVEFSVF9SRVEsCisJCS5iZWFjb25fcGVyaW9kCQk9IDQwMCwKKwkJLmR0aW1fcGVyaW9kCQk9IDEsCisJCS5kc19wc2V0ID0geworCQkJLmVsID0geworCQkJCS5pZCAgPSBJV19NR01UX0lORk9fRUxFTUVOVF9EU19QQVJBTUVURVJfU0VULAorCQkJCS5sZW4gPSAxLAorCQkJfSwKKwkJCS5jaGFuCT0gdGhpcy0+Y2hhbiwKKwkJfSwKKwkJLmJzc19iYXNpY19yc2V0CT0geworCQkJLmVsID0geworCQkJCS5pZAk9IElXX01HTVRfSU5GT19FTEVNRU5UX1NVUFBPUlRFRF9SQVRFUywKKwkJCQkubGVuID0gMiwKKwkJCX0sCisJCQkuZGF0YV9yYXRlX2xhYmVscyA9IHsKKwkJCQlbMF0gPSBJV19NR01UX1JBVEVfTEFCRUxfTUFOREFUT1JZIHwKKwkJCQkgICAgICBJV19NR01UX1JBVEVfTEFCRUxfMU1CSVQsCisJCQkJWzFdID0gSVdfTUdNVF9SQVRFX0xBQkVMX01BTkRBVE9SWSB8CisJCQkJICAgICAgSVdfTUdNVF9SQVRFX0xBQkVMXzJNQklULAorCQkJfSwKKwkJfSwKKwkJLm9wZXJhdGlvbmFsX3JzZXQJPSB7CisJCQkuZWwgPSB7CisJCQkJLmlkCT0gSVdfTUdNVF9JTkZPX0VMRU1FTlRfU1VQUE9SVEVEX1JBVEVTLAorCQkJCS5sZW4gPSAyLAorCQkJfSwKKwkJCS5kYXRhX3JhdGVfbGFiZWxzID0geworCQkJCVswXSA9IElXX01HTVRfUkFURV9MQUJFTF9NQU5EQVRPUlkgfAorCQkJCSAgICAgIElXX01HTVRfUkFURV9MQUJFTF8xTUJJVCwKKwkJCQlbMV0gPSBJV19NR01UX1JBVEVfTEFCRUxfTUFOREFUT1JZIHwKKwkJCQkgICAgICBJV19NR01UX1JBVEVfTEFCRUxfMk1CSVQsCisJCQl9LAorCQl9LAorCQkuaWJzc19wc2V0CQk9IHsKKwkJCS5lbCA9IHsKKwkJCQkuaWQJID0gSVdfTUdNVF9JTkZPX0VMRU1FTlRfSUJTU19QQVJBTUVURVJfU0VULAorCQkJCS5sZW4gICAgID0gMiwKKwkJCX0sCisJCQkuYXRpbV93aW5kb3cgPSAxMCwKKwkJfSwKKwkJLmJzc190eXBlCQk9IHdsMzUwMV9md19ic3NfdHlwZSh0aGlzKSwKKwkJLmNhcF9pbmZvCQk9IHdsMzUwMV9md19jYXBfaW5mbyh0aGlzKSwKKwl9OworCisJaXdfY29weV9tZ210X2luZm9fZWxlbWVudCgmc2lnLnNzaWQuZWwsICZ0aGlzLT5lc3NpZC5lbCk7CisJaXdfY29weV9tZ210X2luZm9fZWxlbWVudCgmdGhpcy0+a2VlcF9lc3NpZC5lbCwgJnRoaXMtPmVzc2lkLmVsKTsKKwlyZXR1cm4gd2wzNTAxX2VzYnFfZXhlYyh0aGlzLCAmc2lnLCBzaXplb2Yoc2lnKSk7Cit9CisKK3N0YXRpYyB2b2lkIHdsMzUwMV9tZ210X3NjYW5fY29uZmlybShzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsIHUxNiBhZGRyKQoreworCXUxNiBpID0gMDsKKwlpbnQgbWF0Y2hmbGFnID0gMDsKKwlzdHJ1Y3Qgd2wzNTAxX3NjYW5fY29uZmlybSBzaWc7CisKKwlkcHJpbnRrKDMsICJlbnRyeSIpOworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYWRkciwgJnNpZywgc2l6ZW9mKHNpZykpOworCWlmIChzaWcuc3RhdHVzID09IFdMMzUwMV9TVEFUVVNfU1VDQ0VTUykgeworCQlkcHJpbnRrKDMsICJzdWNjZXNzIik7CisJCWlmICgodGhpcy0+bmV0X3R5cGUgPT0gSVdfTU9ERV9JTkZSQSAmJgorCQkgICAgIChzaWcuY2FwX2luZm8gJiBXTDM1MDFfTUdNVF9DQVBBQklMSVRZX0VTUykpIHx8CisJCSAgICAodGhpcy0+bmV0X3R5cGUgPT0gSVdfTU9ERV9BREhPQyAmJgorCQkgICAgIChzaWcuY2FwX2luZm8gJiBXTDM1MDFfTUdNVF9DQVBBQklMSVRZX0lCU1MpKSB8fAorCQkgICAgdGhpcy0+bmV0X3R5cGUgPT0gSVdfTU9ERV9BVVRPKSB7CisJCQlpZiAoIXRoaXMtPmVzc2lkLmVsLmxlbikKKwkJCQltYXRjaGZsYWcgPSAxOworCQkJZWxzZSBpZiAodGhpcy0+ZXNzaWQuZWwubGVuID09IDMgJiYKKwkJCQkgIW1lbWNtcCh0aGlzLT5lc3NpZC5lc3NpZCwgIkFOWSIsIDMpKQorCQkJCW1hdGNoZmxhZyA9IDE7CisJCQllbHNlIGlmICh0aGlzLT5lc3NpZC5lbC5sZW4gIT0gc2lnLnNzaWQuZWwubGVuKQorCQkJCW1hdGNoZmxhZyA9IDA7CisJCQllbHNlIGlmIChtZW1jbXAodGhpcy0+ZXNzaWQuZXNzaWQsIHNpZy5zc2lkLmVzc2lkLAorCQkJCQl0aGlzLT5lc3NpZC5lbC5sZW4pKQorCQkJCW1hdGNoZmxhZyA9IDA7CisJCQllbHNlCisJCQkJbWF0Y2hmbGFnID0gMTsKKwkJCWlmIChtYXRjaGZsYWcpIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgdGhpcy0+YnNzX2NudDsgaSsrKSB7CisJCQkJCWlmICghbWVtY21wKHRoaXMtPmJzc19zZXRbaV0uYnNzaWQsCisJCQkJCQkgICAgc2lnLmJzc2lkLCBFVEhfQUxFTikpIHsKKwkJCQkJCW1hdGNoZmxhZyA9IDA7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChtYXRjaGZsYWcgJiYgKGkgPCAyMCkpIHsKKwkJCQltZW1jcHkoJnRoaXMtPmJzc19zZXRbaV0uYmVhY29uX3BlcmlvZCwKKwkJCQkgICAgICAgJnNpZy5iZWFjb25fcGVyaW9kLCA3Myk7CisJCQkJdGhpcy0+YnNzX2NudCsrOworCQkJCXRoaXMtPnJzc2kgPSBzaWcucnNzaTsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoc2lnLnN0YXR1cyA9PSBXTDM1MDFfU1RBVFVTX1RJTUVPVVQpIHsKKwkJZHByaW50aygzLCAidGltZW91dCIpOworCQl0aGlzLT5qb2luX3N0YV9ic3MgPSAwOworCQlmb3IgKGkgPSB0aGlzLT5qb2luX3N0YV9ic3M7IGkgPCB0aGlzLT5ic3NfY250OyBpKyspCisJCQlpZiAoIXdsMzUwMV9tZ210X2pvaW4odGhpcywgaSkpCisJCQkJYnJlYWs7CisJCXRoaXMtPmpvaW5fc3RhX2JzcyA9IGk7CisJCWlmICh0aGlzLT5qb2luX3N0YV9ic3MgPT0gdGhpcy0+YnNzX2NudCkgeworCQkJaWYgKHRoaXMtPm5ldF90eXBlID09IElXX01PREVfSU5GUkEpCisJCQkJd2wzNTAxX21nbXRfc2Nhbih0aGlzLCAxMDApOworCQkJZWxzZSB7CisJCQkJdGhpcy0+YWRob2NfdGltZXMrKzsKKwkJCQlpZiAodGhpcy0+YWRob2NfdGltZXMgPiBXTDM1MDFfTUFYX0FESE9DX1RSSUVTKQorCQkJCQl3bDM1MDFfbWdtdF9zdGFydCh0aGlzKTsKKwkJCQllbHNlCisJCQkJCXdsMzUwMV9tZ210X3NjYW4odGhpcywgMTAwKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqCisgKiB3bDM1MDFfYmxvY2tfaW50ZXJydXB0IC0gTWFzayBpbnRlcnJ1cHQgZnJvbSBTVVRSTworICogQHRoaXMgLSBjYXJkCisgKgorICogTWFzayBpbnRlcnJ1cHQgZnJvbSBTVVRSTy4gKGkuZS4gU1VUUk8gY2Fubm90IGludGVycnVwdCB0aGUgSE9TVCkKKyAqIFJldHVybjogMSBpZiBpbnRlcnJ1cHQgaXMgb3JpZ2luYWxseSBlbmFibGVkCisgKi8KK3N0YXRpYyBpbnQgd2wzNTAxX2Jsb2NrX2ludGVycnVwdChzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMpCit7CisJdTggb2xkID0gaW5iKHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfR0NSKTsKKwl1OCBuZXcgPSBvbGQgJiAofihXTDM1MDFfR0NSX0VDSU5UIHwgV0wzNTAxX0dDUl9JTlQyRUMgfAorCQkJV0wzNTAxX0dDUl9FTkVDSU5UKSk7CisKKwl3bDM1MDFfb3V0YihuZXcsIHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfR0NSKTsKKwlyZXR1cm4gb2xkICYgV0wzNTAxX0dDUl9FTkVDSU5UOworfQorCisvKioKKyAqIHdsMzUwMV91bmJsb2NrX2ludGVycnVwdCAtIEVuYWJsZSBpbnRlcnJ1cHQgZnJvbSBTVVRSTworICogQHRoaXMgLSBjYXJkCisgKgorICogRW5hYmxlIGludGVycnVwdCBmcm9tIFNVVFJPLiAoaS5lLiBTVVRSTyBjYW4gaW50ZXJydXB0IHRoZSBIT1NUKQorICogUmV0dXJuOiAxIGlmIGludGVycnVwdCBpcyBvcmlnaW5hbGx5IGVuYWJsZWQKKyAqLworc3RhdGljIGludCB3bDM1MDFfdW5ibG9ja19pbnRlcnJ1cHQoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXU4IG9sZCA9IGluYih0aGlzLT5iYXNlX2FkZHIgKyBXTDM1MDFfTklDX0dDUik7CisJdTggbmV3ID0gKG9sZCAmIH4oV0wzNTAxX0dDUl9FQ0lOVCB8IFdMMzUwMV9HQ1JfSU5UMkVDKSkgfAorCQkgIFdMMzUwMV9HQ1JfRU5FQ0lOVDsKKworCXdsMzUwMV9vdXRiKG5ldywgdGhpcy0+YmFzZV9hZGRyICsgV0wzNTAxX05JQ19HQ1IpOworCXJldHVybiBvbGQgJiBXTDM1MDFfR0NSX0VORUNJTlQ7Cit9CisKKy8qKgorICogd2wzNTAxX3JlY2VpdmUgLSBSZWNlaXZlIGRhdGEgZnJvbSBSZWNlaXZlIFF1ZXVlLgorICoKKyAqIFJlY2VpdmUgZGF0YSBmcm9tIFJlY2VpdmUgUXVldWUuCisgKgorICogQHRoaXM6IGNhcmQKKyAqIEBiZjogYWRkcmVzcyBvZiBob3N0CisgKiBAc2l6ZTogc2l6ZSBvZiBidWZmZXIuCisgKi8KK3N0YXRpYyB1MTYgd2wzNTAxX3JlY2VpdmUoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1OCAqYmYsIHUxNiBzaXplKQoreworCXUxNiBuZXh0X2FkZHIsIG5leHRfYWRkcjE7CisJdTggKmRhdGEgPSBiZiArIDEyOworCisJc2l6ZSAtPSAxMjsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIHRoaXMtPnN0YXJ0X3NlZyArIDIsCisJCQkgICAgJm5leHRfYWRkciwgc2l6ZW9mKG5leHRfYWRkcikpOworCWlmIChzaXplID4gV0wzNTAxX0JMS1NaIC0gc2l6ZW9mKHN0cnVjdCB3bDM1MDFfcnhfaGRyKSkgeworCQl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsCisJCQkJICAgIHRoaXMtPnN0YXJ0X3NlZyArCisJCQkJCXNpemVvZihzdHJ1Y3Qgd2wzNTAxX3J4X2hkciksIGRhdGEsCisJCQkJICAgIFdMMzUwMV9CTEtTWiAtCisJCQkJCXNpemVvZihzdHJ1Y3Qgd2wzNTAxX3J4X2hkcikpOworCQlzaXplIC09IFdMMzUwMV9CTEtTWiAtIHNpemVvZihzdHJ1Y3Qgd2wzNTAxX3J4X2hkcik7CisJCWRhdGEgKz0gV0wzNTAxX0JMS1NaIC0gc2l6ZW9mKHN0cnVjdCB3bDM1MDFfcnhfaGRyKTsKKwl9IGVsc2UgeworCQl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsCisJCQkJICAgIHRoaXMtPnN0YXJ0X3NlZyArCisJCQkJCXNpemVvZihzdHJ1Y3Qgd2wzNTAxX3J4X2hkciksCisJCQkJICAgIGRhdGEsIHNpemUpOworCQlzaXplID0gMDsKKwl9CisJd2hpbGUgKHNpemUgPiAwKSB7CisJCWlmIChzaXplID4gV0wzNTAxX0JMS1NaIC0gNSkgeworCQkJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCBuZXh0X2FkZHIgKyA1LCBkYXRhLAorCQkJCQkgICAgV0wzNTAxX0JMS1NaIC0gNSk7CisJCQlzaXplIC09IFdMMzUwMV9CTEtTWiAtIDU7CisJCQlkYXRhICs9IFdMMzUwMV9CTEtTWiAtIDU7CisJCQl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIG5leHRfYWRkciArIDIsICZuZXh0X2FkZHIxLAorCQkJCQkgICAgc2l6ZW9mKG5leHRfYWRkcjEpKTsKKwkJCW5leHRfYWRkciA9IG5leHRfYWRkcjE7CisJCX0gZWxzZSB7CisJCQl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIG5leHRfYWRkciArIDUsIGRhdGEsIHNpemUpOworCQkJc2l6ZSA9IDA7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdsMzUwMV9lc2JxX3JlcV9mcmVlKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwl1OCB0bXA7CisJdTE2IGFkZHI7CisKKwlpZiAodGhpcy0+ZXNicV9yZXFfaGVhZCA9PSB0aGlzLT5lc2JxX3JlcV90YWlsKQorCQlnb3RvIG91dDsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIHRoaXMtPmVzYnFfcmVxX3RhaWwgKyAzLCAmdG1wLCBzaXplb2YodG1wKSk7CisJaWYgKCEodG1wICYgMHg4MCkpCisJCWdvdG8gb3V0OworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgdGhpcy0+ZXNicV9yZXFfdGFpbCwgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJd2wzNTAxX2ZyZWVfdHhfYnVmZmVyKHRoaXMsIGFkZHIpOworCXRoaXMtPmVzYnFfcmVxX3RhaWwgKz0gNDsKKwlpZiAodGhpcy0+ZXNicV9yZXFfdGFpbCA+PSB0aGlzLT5lc2JxX3JlcV9lbmQpCisJCXRoaXMtPmVzYnFfcmVxX3RhaWwgPSB0aGlzLT5lc2JxX3JlcV9zdGFydDsKK291dDoKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2VzYnFfY29uZmlybShzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMpCit7CisJdTggdG1wOworCisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCB0aGlzLT5lc2JxX2NvbmZpcm0gKyAzLCAmdG1wLCBzaXplb2YodG1wKSk7CisJcmV0dXJuIHRtcCAmIDB4ODA7Cit9CisKK3N0YXRpYyB2b2lkIHdsMzUwMV9vbmxpbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogV2lyZWxlc3MgTEFOIG9ubGluZS4gQlNTSUQ6ICIKKwkgICAgICAgIiUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYXG4iLCBkZXYtPm5hbWUsCisJICAgICAgIHRoaXMtPmJzc2lkWzBdLCB0aGlzLT5ic3NpZFsxXSwgdGhpcy0+YnNzaWRbMl0sCisJICAgICAgIHRoaXMtPmJzc2lkWzNdLCB0aGlzLT5ic3NpZFs0XSwgdGhpcy0+YnNzaWRbNV0pOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKworc3RhdGljIHZvaWQgd2wzNTAxX2VzYnFfY29uZmlybV9kb25lKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwl1OCB0bXAgPSAwOworCisJd2wzNTAxX3NldF90b193bGEodGhpcywgdGhpcy0+ZXNicV9jb25maXJtICsgMywgJnRtcCwgc2l6ZW9mKHRtcCkpOworCXRoaXMtPmVzYnFfY29uZmlybSArPSA0OworCWlmICh0aGlzLT5lc2JxX2NvbmZpcm0gPj0gdGhpcy0+ZXNicV9jb25maXJtX2VuZCkKKwkJdGhpcy0+ZXNicV9jb25maXJtID0gdGhpcy0+ZXNicV9jb25maXJtX3N0YXJ0OworfQorCitzdGF0aWMgaW50IHdsMzUwMV9tZ210X2F1dGgoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXN0cnVjdCB3bDM1MDFfYXV0aF9yZXEgc2lnID0geworCQkuc2lnX2lkCSA9IFdMMzUwMV9TSUdfQVVUSF9SRVEsCisJCS50eXBlCSA9IFdMMzUwMV9TWVNfVFlQRV9PUEVOLAorCQkudGltZW91dCA9IDEwMDAsCisJfTsKKworCWRwcmludGsoMywgImVudHJ5Iik7CisJbWVtY3B5KHNpZy5tYWNfYWRkciwgdGhpcy0+YnNzaWQsIEVUSF9BTEVOKTsKKwlyZXR1cm4gd2wzNTAxX2VzYnFfZXhlYyh0aGlzLCAmc2lnLCBzaXplb2Yoc2lnKSk7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX21nbXRfYXNzb2NpYXRpb24oc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXN0cnVjdCB3bDM1MDFfYXNzb2NfcmVxIHNpZyA9IHsKKwkJLnNpZ19pZAkJID0gV0wzNTAxX1NJR19BU1NPQ19SRVEsCisJCS50aW1lb3V0CSA9IDEwMDAsCisJCS5saXN0ZW5faW50ZXJ2YWwgPSA1LAorCQkuY2FwX2luZm8JID0gdGhpcy0+Y2FwX2luZm8sCisJfTsKKworCWRwcmludGsoMywgImVudHJ5Iik7CisJbWVtY3B5KHNpZy5tYWNfYWRkciwgdGhpcy0+YnNzaWQsIEVUSF9BTEVOKTsKKwlyZXR1cm4gd2wzNTAxX2VzYnFfZXhlYyh0aGlzLCAmc2lnLCBzaXplb2Yoc2lnKSk7Cit9CisKK3N0YXRpYyB2b2lkIHdsMzUwMV9tZ210X2pvaW5fY29uZmlybShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgYWRkcikKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisJc3RydWN0IHdsMzUwMV9qb2luX2NvbmZpcm0gc2lnOworCisJZHByaW50aygzLCAiZW50cnkiKTsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIGFkZHIsICZzaWcsIHNpemVvZihzaWcpKTsKKwlpZiAoc2lnLnN0YXR1cyA9PSBXTDM1MDFfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaWYgKHRoaXMtPm5ldF90eXBlID09IElXX01PREVfSU5GUkEpIHsKKwkJCWlmICh0aGlzLT5qb2luX3N0YV9ic3MgPCB0aGlzLT5ic3NfY250KSB7CisJCQkJY29uc3QgaW50IGkgPSB0aGlzLT5qb2luX3N0YV9ic3M7CisJCQkJbWVtY3B5KHRoaXMtPmJzc2lkLAorCQkJCSAgICAgICB0aGlzLT5ic3Nfc2V0W2ldLmJzc2lkLCBFVEhfQUxFTik7CisJCQkJdGhpcy0+Y2hhbiA9IHRoaXMtPmJzc19zZXRbaV0uZHNfcHNldC5jaGFuOworCQkJCWl3X2NvcHlfbWdtdF9pbmZvX2VsZW1lbnQoJnRoaXMtPmtlZXBfZXNzaWQuZWwsCisJCQkJCQkgICAgICZ0aGlzLT5ic3Nfc2V0W2ldLnNzaWQuZWwpOworCQkJCXdsMzUwMV9tZ210X2F1dGgodGhpcyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQljb25zdCBpbnQgaSA9IHRoaXMtPmpvaW5fc3RhX2JzczsKKworCQkJbWVtY3B5KCZ0aGlzLT5ic3NpZCwgJnRoaXMtPmJzc19zZXRbaV0uYnNzaWQsIEVUSF9BTEVOKTsKKwkJCXRoaXMtPmNoYW4gPSB0aGlzLT5ic3Nfc2V0W2ldLmRzX3BzZXQuY2hhbjsKKwkJCWl3X2NvcHlfbWdtdF9pbmZvX2VsZW1lbnQoJnRoaXMtPmtlZXBfZXNzaWQuZWwsCisJCQkJCQkgICZ0aGlzLT5ic3Nfc2V0W2ldLnNzaWQuZWwpOworCQkJd2wzNTAxX29ubGluZShkZXYpOworCQl9CisJfSBlbHNlIHsKKwkJaW50IGk7CisJCXRoaXMtPmpvaW5fc3RhX2JzcysrOworCQlmb3IgKGkgPSB0aGlzLT5qb2luX3N0YV9ic3M7IGkgPCB0aGlzLT5ic3NfY250OyBpKyspCisJCQlpZiAoIXdsMzUwMV9tZ210X2pvaW4odGhpcywgaSkpCisJCQkJYnJlYWs7CisJCXRoaXMtPmpvaW5fc3RhX2JzcyA9IGk7CisJCWlmICh0aGlzLT5qb2luX3N0YV9ic3MgPT0gdGhpcy0+YnNzX2NudCkgeworCQkJaWYgKHRoaXMtPm5ldF90eXBlID09IElXX01PREVfSU5GUkEpCisJCQkJd2wzNTAxX21nbXRfc2Nhbih0aGlzLCAxMDApOworCQkJZWxzZSB7CisJCQkJdGhpcy0+YWRob2NfdGltZXMrKzsKKwkJCQlpZiAodGhpcy0+YWRob2NfdGltZXMgPiBXTDM1MDFfTUFYX0FESE9DX1RSSUVTKQorCQkJCQl3bDM1MDFfbWdtdF9zdGFydCh0aGlzKTsKKwkJCQllbHNlCisJCQkJCXdsMzUwMV9tZ210X3NjYW4odGhpcywgMTAwKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHdsMzUwMV9hbGFybV9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICBzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMpCit7CisJaWYgKHRoaXMtPm5ldF90eXBlID09IElXX01PREVfSU5GUkEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiV2lyZWxlc3MgTEFOIG9mZmxpbmVcbiIpOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXdsMzUwMV9tZ210X3Jlc3luYyh0aGlzKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bDM1MDFfbWRfY29uZmlybV9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgIHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywKKwkJCQkJICAgICAgIHUxNiBhZGRyKQoreworCXN0cnVjdCB3bDM1MDFfbWRfY29uZmlybSBzaWc7CisKKwlkcHJpbnRrKDMsICJlbnRyeSIpOworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYWRkciwgJnNpZywgc2l6ZW9mKHNpZykpOworCXdsMzUwMV9mcmVlX3R4X2J1ZmZlcih0aGlzLCBzaWcuZGF0YSk7CisJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2wzNTAxX21kX2luZF9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLCB1MTYgYWRkcikKK3sKKwlzdHJ1Y3Qgd2wzNTAxX21kX2luZCBzaWc7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1OCByc3NpLCBhZGRyNFtFVEhfQUxFTl07CisJdTE2IHBrdF9sZW47CisKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIGFkZHIsICZzaWcsIHNpemVvZihzaWcpKTsKKwl0aGlzLT5zdGFydF9zZWcgPSBzaWcuZGF0YTsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsCisJCQkgICAgc2lnLmRhdGEgKyBvZmZzZXRvZihzdHJ1Y3Qgd2wzNTAxX3J4X2hkciwgcnNzaSksCisJCQkgICAgJnJzc2ksIHNpemVvZihyc3NpKSk7CisJdGhpcy0+cnNzaSA9IHJzc2kgPD0gNjMgPyAocnNzaSAqIDEwMCkgLyA2NCA6IDI1NTsKKworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywKKwkJCSAgICBzaWcuZGF0YSArCisJCQkJb2Zmc2V0b2Yoc3RydWN0IHdsMzUwMV9yeF9oZHIsIGFkZHI0KSwKKwkJCSAgICAmYWRkcjQsIHNpemVvZihhZGRyNCkpOworCWlmICghKGFkZHI0WzBdID09IDB4QUEgJiYgYWRkcjRbMV0gPT0gMHhBQSAmJgorCSAgICAgIGFkZHI0WzJdID09IDB4MDMgJiYgYWRkcjRbNF0gPT0gMHgwMCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSW5zdXBwb3J0ZWQgcGFja2V0IHR5cGUhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlwa3RfbGVuID0gc2lnLnNpemUgKyAxMiAtIDI0IC0gNCAtIDY7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHBrdF9sZW4gKyA1KTsKKworCWlmICghc2tiKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW4ndCBhbGxvYyBhIHNrX2J1ZmYgb2Ygc2l6ZSAlZC5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHBrdF9sZW4pOworCQl0aGlzLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJfSBlbHNlIHsKKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYl9yZXNlcnZlKHNrYiwgMik7IC8qIElQIGhlYWRlcnMgb24gMTYgYnl0ZXMgYm91bmRhcmllcyAqLworCQlldGhfY29weV9hbmRfc3VtKHNrYiwgKHVuc2lnbmVkIGNoYXIgKikmc2lnLmRhZGRyLCAxMiwgMCk7CisJCXdsMzUwMV9yZWNlaXZlKHRoaXMsIHNrYi0+ZGF0YSwgcGt0X2xlbik7CisJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKwkJc2tiLT5wcm90b2NvbAk9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJZGV2LT5sYXN0X3J4CT0gamlmZmllczsKKwkJdGhpcy0+c3RhdHMucnhfcGFja2V0cysrOworCQl0aGlzLT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJbmV0aWZfcngoc2tiKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3bDM1MDFfZ2V0X2NvbmZpcm1faW50ZXJydXB0KHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcywKKwkJCQkJCXUxNiBhZGRyLCB2b2lkICpzaWcsIGludCBzaXplKQoreworCWRwcmludGsoMywgImVudHJ5Iik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCBhZGRyLCAmdGhpcy0+c2lnX2dldF9jb25maXJtLAorCQkJICAgIHNpemVvZih0aGlzLT5zaWdfZ2V0X2NvbmZpcm0pKTsKKwl3YWtlX3VwKCZ0aGlzLT53YWl0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdsMzUwMV9zdGFydF9jb25maXJtX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkJICBzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMsCisJCQkJCQkgIHUxNiBhZGRyKQoreworCXN0cnVjdCB3bDM1MDFfc3RhcnRfY29uZmlybSBzaWc7CisKKwlkcHJpbnRrKDMsICJlbnRyeSIpOworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgYWRkciwgJnNpZywgc2l6ZW9mKHNpZykpOworCWlmIChzaWcuc3RhdHVzID09IFdMMzUwMV9TVEFUVVNfU1VDQ0VTUykKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2wzNTAxX2Fzc29jX2NvbmZpcm1faW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkgIHUxNiBhZGRyKQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgd2wzNTAxX2Fzc29jX2NvbmZpcm0gc2lnOworCisJZHByaW50aygzLCAiZW50cnkiKTsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIGFkZHIsICZzaWcsIHNpemVvZihzaWcpKTsKKworCWlmIChzaWcuc3RhdHVzID09IFdMMzUwMV9TVEFUVVNfU1VDQ0VTUykKKwkJd2wzNTAxX29ubGluZShkZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2wzNTAxX2F1dGhfY29uZmlybV9pbnRlcnJ1cHQoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzLAorCQkJCQkJIHUxNiBhZGRyKQoreworCXN0cnVjdCB3bDM1MDFfYXV0aF9jb25maXJtIHNpZzsKKworCWRwcmludGsoMywgImVudHJ5Iik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCBhZGRyLCAmc2lnLCBzaXplb2Yoc2lnKSk7CisKKwlpZiAoc2lnLnN0YXR1cyA9PSBXTDM1MDFfU1RBVFVTX1NVQ0NFU1MpCisJCXdsMzUwMV9tZ210X2Fzc29jaWF0aW9uKHRoaXMpOworCWVsc2UKKwkJd2wzNTAxX21nbXRfcmVzeW5jKHRoaXMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd2wzNTAxX3J4X2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBtb3JlcGt0czsKKwl1MTYgYWRkcjsKKwl1OCBzaWdfaWQ7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCisJZHByaW50aygzLCAiZW50cnkiKTsKK2xvb3A6CisJbW9yZXBrdHMgPSAwOworCWlmICghd2wzNTAxX2VzYnFfY29uZmlybSh0aGlzKSkKKwkJZ290byBmcmVlOworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgdGhpcy0+ZXNicV9jb25maXJtLCAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIGFkZHIgKyAyLCAmc2lnX2lkLCBzaXplb2Yoc2lnX2lkKSk7CisKKwlzd2l0Y2ggKHNpZ19pZCkgeworCWNhc2UgV0wzNTAxX1NJR19ERUFVVEhfSU5EOgorCWNhc2UgV0wzNTAxX1NJR19ESVNBU1NPQ19JTkQ6CisJY2FzZSBXTDM1MDFfU0lHX0FMQVJNOgorCQl3bDM1MDFfYWxhcm1faW50ZXJydXB0KGRldiwgdGhpcyk7CisJCWJyZWFrOworCWNhc2UgV0wzNTAxX1NJR19NRF9DT05GSVJNOgorCQl3bDM1MDFfbWRfY29uZmlybV9pbnRlcnJ1cHQoZGV2LCB0aGlzLCBhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTDM1MDFfU0lHX01EX0lORDoKKwkJd2wzNTAxX21kX2luZF9pbnRlcnJ1cHQoZGV2LCB0aGlzLCBhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTDM1MDFfU0lHX0dFVF9DT05GSVJNOgorCQl3bDM1MDFfZ2V0X2NvbmZpcm1faW50ZXJydXB0KHRoaXMsIGFkZHIsCisJCQkJCSAgICAgJnRoaXMtPnNpZ19nZXRfY29uZmlybSwKKwkJCQkJICAgICBzaXplb2YodGhpcy0+c2lnX2dldF9jb25maXJtKSk7CisJCWJyZWFrOworCWNhc2UgV0wzNTAxX1NJR19QV1JfTUdNVF9DT05GSVJNOgorCQl3bDM1MDFfZ2V0X2NvbmZpcm1faW50ZXJydXB0KHRoaXMsIGFkZHIsCisJCQkJCSAgICAgJnRoaXMtPnNpZ19wd3JfbWdtdF9jb25maXJtLAorCQkJCQkgICAgc2l6ZW9mKHRoaXMtPnNpZ19wd3JfbWdtdF9jb25maXJtKSk7CisJCWJyZWFrOworCWNhc2UgV0wzNTAxX1NJR19TVEFSVF9DT05GSVJNOgorCQl3bDM1MDFfc3RhcnRfY29uZmlybV9pbnRlcnJ1cHQoZGV2LCB0aGlzLCBhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTDM1MDFfU0lHX1NDQU5fQ09ORklSTToKKwkJd2wzNTAxX21nbXRfc2Nhbl9jb25maXJtKHRoaXMsIGFkZHIpOworCQlicmVhazsKKwljYXNlIFdMMzUwMV9TSUdfSk9JTl9DT05GSVJNOgorCQl3bDM1MDFfbWdtdF9qb2luX2NvbmZpcm0oZGV2LCBhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTDM1MDFfU0lHX0FTU09DX0NPTkZJUk06CisJCXdsMzUwMV9hc3NvY19jb25maXJtX2ludGVycnVwdChkZXYsIGFkZHIpOworCQlicmVhazsKKwljYXNlIFdMMzUwMV9TSUdfQVVUSF9DT05GSVJNOgorCQl3bDM1MDFfYXV0aF9jb25maXJtX2ludGVycnVwdCh0aGlzLCBhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBXTDM1MDFfU0lHX1JFU1lOQ19DT05GSVJNOgorCQl3bDM1MDFfbWdtdF9yZXN5bmModGhpcyk7IC8qIEZJWE1FOiBzaG91bGQgYmUgcmVzeW5jX2NvbmZpcm0gKi8KKwkJYnJlYWs7CisJfQorCXdsMzUwMV9lc2JxX2NvbmZpcm1fZG9uZSh0aGlzKTsKKwltb3JlcGt0cyA9IDE7CisJLyogZnJlZSByZXF1ZXN0IGlmIG5lY2Vzc2FyeSAqLworZnJlZToKKwl3bDM1MDFfZXNicV9yZXFfZnJlZSh0aGlzKTsKKwlpZiAobW9yZXBrdHMpCisJCWdvdG8gbG9vcDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdsMzUwMV9hY2tfaW50ZXJydXB0KHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwl3bDM1MDFfb3V0YihXTDM1MDFfR0NSX0VDSU5ULCB0aGlzLT5iYXNlX2FkZHIgKyBXTDM1MDFfTklDX0dDUik7Cit9CisKKy8qKgorICogd2wzNTAxX2ludGVycnVwdCAtIEhhcmR3YXJlIGludGVycnVwdCBmcm9tIGNhcmQuCisgKiBAaXJxIC0gSW50ZXJydXB0IG51bWJlcgorICogQGRldl9pZCAtIG5ldF9kZXZpY2UKKyAqIEByZWdzIC0gcmVnaXN0ZXJzCisgKgorICogV2UgbXVzdCBhY2tub3dsZWRnZSB0aGUgaW50ZXJydXB0IGFzIHNvb24gYXMgcG9zc2libGUsIGFuZCBibG9jayB0aGUKKyAqIGludGVycnVwdCBmcm9tIHRoZSBzYW1lIGNhcmQgaW1tZWRpYXRlbHkgdG8gcHJldmVudCByZS1lbnRyeS4KKyAqCisgKiBCZWZvcmUgYWNjZXNzaW5nIHRoZSBDb250cm9sX1N0YXR1c19CbG9jaywgd2UgbXVzdCBsb2NrIFNVVFJPIGZpcnN0LgorICogT24gdGhlIG90aGVyIGhhbmQsIHRvIHByZXZlbnQgU1VUUk8gZnJvbSBtYWxmdW5jdGlvbmluZywgd2UgbXVzdAorICogdW5sb2NrIHRoZSBTVVRSTyBhcyBzb29uIGFzIHBvc3NpYmxlLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2wzNTAxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzOworCWludCBoYW5kbGVkID0gMTsKKworCWlmICghZGV2KQorCQlnb3RvIHVua25vd247CisJdGhpcyA9IGRldi0+cHJpdjsKKwlzcGluX2xvY2soJnRoaXMtPmxvY2spOworCXdsMzUwMV9hY2tfaW50ZXJydXB0KHRoaXMpOworCXdsMzUwMV9ibG9ja19pbnRlcnJ1cHQodGhpcyk7CisJd2wzNTAxX3J4X2ludGVycnVwdChkZXYpOworCXdsMzUwMV91bmJsb2NrX2ludGVycnVwdCh0aGlzKTsKKwlzcGluX3VubG9jaygmdGhpcy0+bG9jayk7CitvdXQ6CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit1bmtub3duOgorCWhhbmRsZWQgPSAwOworCXByaW50ayhLRVJOX0VSUiAiJXM6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBfX0ZVTkNUSU9OX18sIGlycSk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX3Jlc2V0X2JvYXJkKHN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcykKK3sKKwl1OCB0bXAgPSAwOworCWludCBpLCByYyA9IDA7CisKKwkvKiBDb3Jlc2V0ICovCisJd2wzNTAxX291dGJfcChXTDM1MDFfR0NSX0NPUkVTRVQsIHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfR0NSKTsKKwl3bDM1MDFfb3V0Yl9wKDAsIHRoaXMtPmJhc2VfYWRkciArIFdMMzUwMV9OSUNfR0NSKTsKKwl3bDM1MDFfb3V0Yl9wKFdMMzUwMV9HQ1JfQ09SRVNFVCwgdGhpcy0+YmFzZV9hZGRyICsgV0wzNTAxX05JQ19HQ1IpOworCisJLyogUmVzZXQgU1JBTSAweDQ4MCB0byB6ZXJvICovCisJd2wzNTAxX3NldF90b193bGEodGhpcywgMHg0ODAsICZ0bXAsIHNpemVvZih0bXApKTsKKworCS8qIFN0YXJ0IHVwICovCisJd2wzNTAxX291dGJfcCgwLCB0aGlzLT5iYXNlX2FkZHIgKyBXTDM1MDFfTklDX0dDUik7CisKKwlXTDM1MDFfTk9QTE9PUCgxMDI0ICogNTApOworCisJd2wzNTAxX3VuYmxvY2tfaW50ZXJydXB0KHRoaXMpOwkvKiBhY21lOiB3YXMgY29tbWVudGVkICovCisKKwkvKiBQb2xsaW5nIFNlbGZfVGVzdF9TdGF0dXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgeworCQl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIDB4NDgwLCAmdG1wLCBzaXplb2YodG1wKSk7CisKKwkJaWYgKHRtcCA9PSAnVycpIHsKKwkJCS8qIGZpcm13YXJlIGNvbXBsZXRlIGFsbCB0ZXN0IHN1Y2Nlc3NmdWxseSAqLworCQkJdG1wID0gJ0EnOworCQkJd2wzNTAxX3NldF90b193bGEodGhpcywgMHg0ODAsICZ0bXAsIHNpemVvZih0bXApKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCVdMMzUwMV9OT1BMT09QKDEwKTsKKwl9CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZhaWxlZCB0byByZXNldCB0aGUgYm9hcmQhXG4iLCBfX0ZVTkNUSU9OX18pOworCXJjID0gLUVOT0RFVjsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2luaXRfZmlybXdhcmUoc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzKQoreworCXUxNiBwdHIsIG5leHQ7CisJaW50IHJjID0gd2wzNTAxX3Jlc2V0X2JvYXJkKHRoaXMpOworCisJaWYgKHJjKQorCQlnb3RvIGZhaWw7CisJdGhpcy0+Y2FyZF9uYW1lWzBdID0gJ1wwJzsKKwl3bDM1MDFfZ2V0X2Zyb21fd2xhKHRoaXMsIDB4MWEwMCwKKwkJCSAgICB0aGlzLT5jYXJkX25hbWUsIHNpemVvZih0aGlzLT5jYXJkX25hbWUpKTsKKwl0aGlzLT5jYXJkX25hbWVbc2l6ZW9mKHRoaXMtPmNhcmRfbmFtZSkgLSAxXSA9ICdcMCc7CisJdGhpcy0+ZmlybXdhcmVfZGF0ZVswXSA9ICdcMCc7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCAweDFhNDAsCisJCQkgICAgdGhpcy0+ZmlybXdhcmVfZGF0ZSwgc2l6ZW9mKHRoaXMtPmZpcm13YXJlX2RhdGUpKTsKKwl0aGlzLT5maXJtd2FyZV9kYXRlW3NpemVvZih0aGlzLT5maXJtd2FyZV9kYXRlKSAtIDFdID0gJ1wwJzsKKwkvKiBTd2l0Y2ggdG8gU1JBTSBQYWdlIDAgKi8KKwl3bDM1MDFfc3dpdGNoX3BhZ2UodGhpcywgV0wzNTAxX0JTU19TUEFHRTApOworCS8qIFJlYWQgcGFyYW1ldGVyIGZyb20gY2FyZCAqLworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgMHg0ODIsICZ0aGlzLT5lc2JxX3JlcV9zdGFydCwgMik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCAweDQ4NiwgJnRoaXMtPmVzYnFfcmVxX2VuZCwgMik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCAweDQ4OCwgJnRoaXMtPmVzYnFfY29uZmlybV9zdGFydCwgMik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCAweDQ4YywgJnRoaXMtPmVzYnFfY29uZmlybV9lbmQsIDIpOworCXdsMzUwMV9nZXRfZnJvbV93bGEodGhpcywgMHg0OGUsICZ0aGlzLT50eF9idWZmZXJfaGVhZCwgMik7CisJd2wzNTAxX2dldF9mcm9tX3dsYSh0aGlzLCAweDQ5MiwgJnRoaXMtPnR4X2J1ZmZlcl9zaXplLCAyKTsKKwl0aGlzLT5lc2JxX3JlcV90YWlsCT0gdGhpcy0+ZXNicV9yZXFfaGVhZCA9IHRoaXMtPmVzYnFfcmVxX3N0YXJ0OworCXRoaXMtPmVzYnFfcmVxX2VuZCAgICAgKz0gdGhpcy0+ZXNicV9yZXFfc3RhcnQ7CisJdGhpcy0+ZXNicV9jb25maXJtCT0gdGhpcy0+ZXNicV9jb25maXJtX3N0YXJ0OworCXRoaXMtPmVzYnFfY29uZmlybV9lbmQgKz0gdGhpcy0+ZXNicV9jb25maXJtX3N0YXJ0OworCS8qIEluaXRpYWwgVHggQnVmZmVyICovCisJdGhpcy0+dHhfYnVmZmVyX2NudCA9IDE7CisJcHRyID0gdGhpcy0+dHhfYnVmZmVyX2hlYWQ7CisJbmV4dCA9IHB0ciArIFdMMzUwMV9CTEtTWjsKKwl3aGlsZSAoKG5leHQgLSB0aGlzLT50eF9idWZmZXJfaGVhZCkgPCB0aGlzLT50eF9idWZmZXJfc2l6ZSkgeworCQl0aGlzLT50eF9idWZmZXJfY250Kys7CisJCXdsMzUwMV9zZXRfdG9fd2xhKHRoaXMsIHB0ciwgJm5leHQsIHNpemVvZihuZXh0KSk7CisJCXB0ciA9IG5leHQ7CisJCW5leHQgPSBwdHIgKyBXTDM1MDFfQkxLU1o7CisJfQorCXJjID0gMDsKKwluZXh0ID0gMDsKKwl3bDM1MDFfc2V0X3RvX3dsYSh0aGlzLCBwdHIsICZuZXh0LCBzaXplb2YobmV4dCkpOworCXRoaXMtPnR4X2J1ZmZlcl90YWlsID0gcHRyOworb3V0OgorCXJldHVybiByYzsKK2ZhaWw6CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCWludCByYyA9IC1FTk9ERVY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlkZXZfbGlua190ICpsaW5rOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwkvKiBDaGVjayBpZiB0aGUgZGV2aWNlIGlzIGluIHdsMzUwMV9kZXZfbGlzdCAqLworCWZvciAobGluayA9IHdsMzUwMV9kZXZfbGlzdDsgbGluazsgbGluayA9IGxpbmstPm5leHQpCisJCWlmIChsaW5rLT5wcml2ID09IGRldikKKwkJCWJyZWFrOworCWlmICghbGluaykKKwkJZ290byBvdXQ7CisJbGluay0+b3Blbi0tOworCisJLyogU3RvcCB3bDM1MDFfaGFyZF9zdGFydF94bWl0KCkgZnJvbSBub3cgb24gKi8KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJd2wzNTAxX2Fja19pbnRlcnJ1cHQodGhpcyk7CisKKwkvKiBNYXNrIGludGVycnVwdHMgZnJvbSB0aGUgU1VUUk8gKi8KKwl3bDM1MDFfYmxvY2tfaW50ZXJydXB0KHRoaXMpOworCisJcmMgPSAwOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBXTDM1MDEgY2xvc2VkXG4iLCBkZXYtPm5hbWUpOworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogd2wzNTAxX3Jlc2V0IC0gUmVzZXQgdGhlIFNVVFJPLgorICogQGRldiAtIG5ldHdvcmsgZGV2aWNlCisgKgorICogSXQgaXMgYWxtb3N0IHRoZSBzYW1lIGFzIHdsMzUwMV9vcGVuKCkuIEluIGZhY3QsIHdlIG1heSBqdXN0IHdsMzUwMV9jbG9zZSgpCisgKiBhbmQgd2wzNTAxX29wZW4oKSBhZ2FpbiwgYnV0IEkgd291bGRuJ3QgbGlrZSB0byBmcmVlX2lycSgpIHdoZW4gdGhlIGRyaXZlcgorICogaXMgcnVubmluZy4gSXQgc2VlbXMgdG8gYmUgZGFuZ2Vyb3VzLgorICovCitzdGF0aWMgaW50IHdsMzUwMV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlpbnQgcmMgPSAtRU5PREVWOworCisJd2wzNTAxX2Jsb2NrX2ludGVycnVwdCh0aGlzKTsKKworCWlmICh3bDM1MDFfaW5pdF9maXJtd2FyZSh0aGlzKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2FuJ3QgaW5pdGlhbGl6ZSBGaXJtd2FyZSFcbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQkvKiBGcmVlIElSUSwgYW5kIG1hcmsgSVJRIGFzIHVudXNlZCAqLworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBRdWV1ZSBoYXMgdG8gYmUgc3RhcnRlZCBvbmx5IHdoZW4gdGhlIENhcmQgaXMgU3RhcnRlZAorCSAqLworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl0aGlzLT5hZGhvY190aW1lcyA9IDA7CisJd2wzNTAxX2Fja19pbnRlcnJ1cHQodGhpcyk7CisJd2wzNTAxX3VuYmxvY2tfaW50ZXJydXB0KHRoaXMpOworCXdsMzUwMV9tZ210X3NjYW4odGhpcywgMTAwKTsKKwlkcHJpbnRrKDEsICIlczogZGV2aWNlIHJlc2V0IiwgZGV2LT5uYW1lKTsKKwlyYyA9IDA7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCB3bDM1MDFfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmdGhpcy0+c3RhdHM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlzdGF0cy0+dHhfZXJyb3JzKys7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwlyYyA9IHdsMzUwMV9yZXNldChkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwlpZiAocmMpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yICVkIHJlc2V0dGluZyBjYXJkIG9uIFR4IHRpbWVvdXQhXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCByYyk7CisJZWxzZSB7CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorfQorCisvKgorICogUmV0dXJuIDogMCAtIE9LCisgKgkgICAgMSAtIENvdWxkIG5vdCB0cmFuc21pdCAoZGV2X3F1ZXVlX3htaXQgd2lsbCBxdWV1ZSBpdCkKKyAqCQlhbmQgdHJ5IHRvIHNlbnQgaXQgbGF0ZXIKKyAqLworc3RhdGljIGludCB3bDM1MDFfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGVuYWJsZWQsIHJjOworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwllbmFibGVkID0gd2wzNTAxX2Jsb2NrX2ludGVycnVwdCh0aGlzKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlyYyA9IHdsMzUwMV9zZW5kX3BrdCh0aGlzLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlpZiAoZW5hYmxlZCkKKwkJd2wzNTAxX3VuYmxvY2tfaW50ZXJydXB0KHRoaXMpOworCWlmIChyYykgeworCQkrK3RoaXMtPnN0YXRzLnR4X2Ryb3BwZWQ7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwl9IGVsc2UgeworCQkrK3RoaXMtPnN0YXRzLnR4X3BhY2tldHM7CisJCXRoaXMtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQlrZnJlZV9za2Ioc2tiKTsKKworCQlpZiAodGhpcy0+dHhfYnVmZmVyX2NudCA8IDIpCisJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmMgPSAtRU5PREVWOworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWRldl9saW5rX3QgKmxpbms7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGhpcy0+bG9jaywgZmxhZ3MpOworCS8qIENoZWNrIGlmIHRoZSBkZXZpY2UgaXMgaW4gd2wzNTAxX2Rldl9saXN0ICovCisJZm9yIChsaW5rID0gd2wzNTAxX2Rldl9saXN0OyBsaW5rOyBsaW5rID0gbGluay0+bmV4dCkKKwkJaWYgKGxpbmstPnByaXYgPT0gZGV2KQorCQkJYnJlYWs7CisJaWYgKCFERVZfT0sobGluaykpCisJCWdvdG8gb3V0OworCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwlsaW5rLT5vcGVuKys7CisKKwkvKiBJbml0aWFsIFdMMzUwMSBmaXJtd2FyZSAqLworCWRwcmludGsoMSwgIiVzOiBJbml0aWFsaXplIFdMMzUwMSBmaXJtd2FyZS4uLiIsIGRldi0+bmFtZSk7CisJaWYgKHdsMzUwMV9pbml0X2Zpcm13YXJlKHRoaXMpKQorCQlnb3RvIGZhaWw7CisJLyogSW5pdGlhbCBkZXZpY2UgdmFyaWFibGVzICovCisJdGhpcy0+YWRob2NfdGltZXMgPSAwOworCS8qIEFja25vd2xlZGdlIEludGVycnVwdCwgZm9yIGNsZWFuaW5nIGxhc3Qgc3RhdGUgKi8KKwl3bDM1MDFfYWNrX2ludGVycnVwdCh0aGlzKTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHQgZnJvbSBjYXJkIGFmdGVyIGFsbCAqLworCXdsMzUwMV91bmJsb2NrX2ludGVycnVwdCh0aGlzKTsKKwl3bDM1MDFfbWdtdF9zY2FuKHRoaXMsIDEwMCk7CisJcmMgPSAwOworCWRwcmludGsoMSwgIiVzOiBXTDM1MDEgb3BlbmVkIiwgZGV2LT5uYW1lKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogQ2FyZCBOYW1lOiAlc1xuIgorCQkJICIlczogRmlybXdhcmUgRGF0ZTogJXNcbiIsCisJCQkgZGV2LT5uYW1lLCB0aGlzLT5jYXJkX25hbWUsCisJCQkgZGV2LT5uYW1lLCB0aGlzLT5maXJtd2FyZV9kYXRlKTsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJjOworZmFpbDoKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2FuJ3QgaW5pdGlhbGl6ZSBmaXJtd2FyZSFcbiIsIGRldi0+bmFtZSk7CisJZ290byBvdXQ7Cit9CisKK3N0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp3bDM1MDFfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCisJcmV0dXJuICZ0aGlzLT5zdGF0czsKK30KKworc3RydWN0IGl3X3N0YXRpc3RpY3MgKndsMzUwMV9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisJc3RydWN0IGl3X3N0YXRpc3RpY3MgKndzdGF0cyA9ICZ0aGlzLT53c3RhdHM7CisJdTMyIHZhbHVlOyAvKiBzaXplIGNoZWNrZWQ6IGl0IGlzIHUzMiAqLworCisJbWVtc2V0KHdzdGF0cywgMCwgc2l6ZW9mKCp3c3RhdHMpKTsKKwl3c3RhdHMtPnN0YXR1cyA9IG5ldGlmX3J1bm5pbmcoZGV2KTsKKwlpZiAoIXdsMzUwMV9nZXRfbWliX3ZhbHVlKHRoaXMsIFdMMzUwMV9NSUJfQVRUUl9XRVBfSUNWX0VSUk9SX0NPVU5ULAorCQkJCSAgJnZhbHVlLCBzaXplb2YodmFsdWUpKSkKKwkJd3N0YXRzLT5kaXNjYXJkLmNvZGUgKz0gdmFsdWU7CisJaWYgKCF3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLCBXTDM1MDFfTUlCX0FUVFJfV0VQX1VOREVDUllQVEFCTEVfQ09VTlQsCisJCQkJICAmdmFsdWUsIHNpemVvZih2YWx1ZSkpKQorCQl3c3RhdHMtPmRpc2NhcmQuY29kZSArPSB2YWx1ZTsKKwlpZiAoIXdsMzUwMV9nZXRfbWliX3ZhbHVlKHRoaXMsIFdMMzUwMV9NSUJfQVRUUl9XRVBfRVhDTFVERURfQ09VTlQsCisJCQkJICAmdmFsdWUsIHNpemVvZih2YWx1ZSkpKQorCQl3c3RhdHMtPmRpc2NhcmQuY29kZSArPSB2YWx1ZTsKKwlpZiAoIXdsMzUwMV9nZXRfbWliX3ZhbHVlKHRoaXMsIFdMMzUwMV9NSUJfQVRUUl9SRVRSWV9DT1VOVCwKKwkJCQkgICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSkpCisJCXdzdGF0cy0+ZGlzY2FyZC5yZXRyaWVzCT0gdmFsdWU7CisJaWYgKCF3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLCBXTDM1MDFfTUlCX0FUVFJfRkFJTEVEX0NPVU5ULAorCQkJCSAgJnZhbHVlLCBzaXplb2YodmFsdWUpKSkKKwkJd3N0YXRzLT5kaXNjYXJkLm1pc2MgKz0gdmFsdWU7CisJaWYgKCF3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLCBXTDM1MDFfTUlCX0FUVFJfUlRTX0ZBSUxVUkVfQ09VTlQsCisJCQkJICAmdmFsdWUsIHNpemVvZih2YWx1ZSkpKQorCQl3c3RhdHMtPmRpc2NhcmQubWlzYyArPSB2YWx1ZTsKKwlpZiAoIXdsMzUwMV9nZXRfbWliX3ZhbHVlKHRoaXMsIFdMMzUwMV9NSUJfQVRUUl9BQ0tfRkFJTFVSRV9DT1VOVCwKKwkJCQkgICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSkpCisJCXdzdGF0cy0+ZGlzY2FyZC5taXNjICs9IHZhbHVlOworCWlmICghd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywgV0wzNTAxX01JQl9BVFRSX0ZSQU1FX0RVUExJQ0FURV9DT1VOVCwKKwkJCQkgICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSkpCisJCXdzdGF0cy0+ZGlzY2FyZC5taXNjICs9IHZhbHVlOworCXJldHVybiB3c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIHdsMzUwMV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCB3bDM1MDFfZGV2X2luZm8sIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKK30KKworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBvcHMgPSB7CisJLmdldF9kcnZpbmZvID0gd2wzNTAxX2dldF9kcnZpbmZvCit9OworCisvKioKKyAqIHdsMzUwMV9kZXRhY2ggLSBkZWxldGVzIGEgZHJpdmVyICJpbnN0YW5jZSIKKyAqIEBsaW5rIC0gRklMTF9JTgorICoKKyAqIFRoaXMgZGVsZXRlcyBhIGRyaXZlciAiaW5zdGFuY2UiLiBUaGUgZGV2aWNlIGlzIGRlLXJlZ2lzdGVyZWQgd2l0aCBDYXJkCisgKiBTZXJ2aWNlcy4gSWYgaXQgaGFzIGJlZW4gcmVsZWFzZWQsIGFsbCBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgYXJlIGZyZWVkLgorICogT3RoZXJ3aXNlLCB0aGUgc3RydWN0dXJlcyB3aWxsIGJlIGZyZWVkIHdoZW4gdGhlIGRldmljZSBpcyByZWxlYXNlZC4KKyAqLworc3RhdGljIHZvaWQgd2wzNTAxX2RldGFjaChkZXZfbGlua190ICpsaW5rKQoreworCWRldl9saW5rX3QgKipsaW5rcDsKKworCS8qIExvY2F0ZSBkZXZpY2Ugc3RydWN0dXJlICovCisJZm9yIChsaW5rcCA9ICZ3bDM1MDFfZGV2X2xpc3Q7ICpsaW5rcDsgbGlua3AgPSAmKCpsaW5rcCktPm5leHQpCisJCWlmICgqbGlua3AgPT0gbGluaykKKwkJCWJyZWFrOworCWlmICghKmxpbmtwKQorCQlnb3RvIG91dDsKKworCS8qIElmIHRoZSBkZXZpY2UgaXMgY3VycmVudGx5IGNvbmZpZ3VyZWQgYW5kIGFjdGl2ZSwgd2Ugd29uJ3QgYWN0dWFsbHkKKwkgKiBkZWxldGUgaXQgeWV0LiAgSW5zdGVhZCwgaXQgaXMgbWFya2VkIHNvIHRoYXQgd2hlbiB0aGUgcmVsZWFzZSgpCisJICogZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGF0IHdpbGwgdHJpZ2dlciBhIHByb3BlciBkZXRhY2goKS4gKi8KKworCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKyNpZmRlZiBQQ01DSUFfREVCVUcKKwkJcHJpbnRrKEtFUk5fREVCVUcgIndsMzUwMV9jczogZGV0YWNoIHBvc3Rwb25lZCwgJyVzJyAiCisJCSAgICAgICAic3RpbGwgbG9ja2VkXG4iLCBsaW5rLT5kZXYtPmRldl9uYW1lKTsKKyNlbmRpZgorCQlnb3RvIG91dDsKKwl9CisKKwkvKiBCcmVhayB0aGUgbGluayB3aXRoIENhcmQgU2VydmljZXMgKi8KKwlpZiAobGluay0+aGFuZGxlKQorCQlwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQobGluay0+aGFuZGxlKTsKKworCS8qIFVubGluayBkZXZpY2Ugc3RydWN0dXJlLCBmcmVlIHBpZWNlcyAqLworCSpsaW5rcCA9IGxpbmstPm5leHQ7CisKKwlpZiAobGluay0+cHJpdikKKwkJZnJlZV9uZXRkZXYobGluay0+cHJpdik7CisJa2ZyZWUobGluayk7CitvdXQ6CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9nZXRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RybGNweSh3cnF1LT5uYW1lLCAiSUVFRSA4MDIuMTEtRFMiLCBzaXplb2Yod3JxdS0+bmFtZSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9zZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCWludCBjaGFubmVsID0gd3JxdS0+ZnJlcS5tOworCWludCByYyA9IC1FSU5WQUw7CisKKwlpZiAoaXdfdmFsaWRfY2hhbm5lbCh0aGlzLT5yZWdfZG9tYWluLCBjaGFubmVsKSkgeworCQl0aGlzLT5jaGFuID0gY2hhbm5lbDsKKwkJcmMgPSB3bDM1MDFfcmVzZXQoZGV2KTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9nZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCisJd3JxdS0+ZnJlcS5tID0gd2wzNTAxX2NoYW4yZnJlcVt0aGlzLT5jaGFuIC0gMV0gKiAxMDAwMDA7CisJd3JxdS0+ZnJlcS5lID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bDM1MDFfc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByYyA9IC1FSU5WQUw7CisKKwlpZiAod3JxdS0+bW9kZSA9PSBJV19NT0RFX0lORlJBIHx8CisJICAgIHdycXUtPm1vZGUgPT0gSVdfTU9ERV9BREhPQyB8fAorCSAgICB3cnF1LT5tb2RlID09IElXX01PREVfQVVUTykgeworCQlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisKKwkJdGhpcy0+bmV0X3R5cGUgPSB3cnF1LT5tb2RlOworCQlyYyA9IHdsMzUwMV9yZXNldChkZXYpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisKKwl3cnF1LT5tb2RlID0gdGhpcy0+bmV0X3R5cGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisKKwl3cnF1LT5zZW5zLnZhbHVlID0gdGhpcy0+cnNzaTsKKwl3cnF1LT5zZW5zLmRpc2FibGVkID0gIXdycXUtPnNlbnMudmFsdWU7CisJd3JxdS0+c2Vucy5maXhlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9yYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGl3X3JhbmdlICpyYW5nZSA9IChzdHJ1Y3QgaXdfcmFuZ2UgKilleHRyYTsKKworCS8qIFNldCB0aGUgbGVuZ3RoICh2ZXJ5IGltcG9ydGFudCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkgKi8KKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHNpemVvZigqcmFuZ2UpOworCisJLyogU2V0IGFsbCB0aGUgaW5mbyB3ZSBkb24ndCBjYXJlIG9yIGRvbid0IGtub3cgYWJvdXQgdG8gemVybyAqLworCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKCpyYW5nZSkpOworCisJLyogU2V0IHRoZSBXaXJlbGVzcyBFeHRlbnNpb24gdmVyc2lvbnMgKi8KKwlyYW5nZS0+d2VfdmVyc2lvbl9jb21waWxlZAk9IFdJUkVMRVNTX0VYVDsKKwlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UJPSAxOworCXJhbmdlLT50aHJvdWdocHV0CQk9IDIgKiAxMDAwICogMTAwMDsgICAgIC8qIH4yIE1iL3MgKi8KKwkvKiBGSVhNRTogc3R1ZHkgdGhlIGNvZGUgdG8gZmlsbCBpbiBtb3JlIGZpZWxkcy4uLiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9zZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlzdGF0aWMgY29uc3QgdTggYmNhc3RbRVRIX0FMRU5dID0geyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH07CisJaW50IHJjID0gLUVJTlZBTDsKKworCS8qIEZJWE1FOiB3ZSBzdXBwb3J0IG90aGVyIEFSUEhSRHMuLi4qLworCWlmICh3cnF1LT5hcF9hZGRyLnNhX2ZhbWlseSAhPSBBUlBIUkRfRVRIRVIpCisJCWdvdG8gb3V0OworCWlmICghbWVtY21wKGJjYXN0LCB3cnF1LT5hcF9hZGRyLnNhX2RhdGEsIEVUSF9BTEVOKSkgeworCQkvKiBGSVhNRTogcmVzY2FuPyAqLworCX0gZWxzZQorCQltZW1jcHkodGhpcy0+YnNzaWQsIHdycXUtPmFwX2FkZHIuc2FfZGF0YSwgRVRIX0FMRU4pOworCQkvKiBGSVhNRTogcmVzY2FuPyBkZWFzc29jICYgc2Nhbj8gKi8KKwlyYyA9IDA7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9nZXRfd2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKworCXdycXUtPmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCW1lbWNweSh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsIHRoaXMtPmJzc2lkLCBFVEhfQUxFTik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX3NldF9zY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwkvKgorCSAqIEZJWE1FOiB0cmlnZ2VyIHNjYW5uaW5nIHdpdGggYSByZXNldCwgeWVzLCBJJ20gbGF6eQorCSAqLworCXJldHVybiB3bDM1MDFfcmVzZXQoZGV2KTsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlpbnQgaTsKKwljaGFyICpjdXJyZW50X2V2ID0gZXh0cmE7CisJc3RydWN0IGl3X2V2ZW50IGl3ZTsKKworCWZvciAoaSA9IDA7IGkgPCB0aGlzLT5ic3NfY250OyArK2kpIHsKKwkJaXdlLmNtZAkJCT0gU0lPQ0dJV0FQOworCQlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwkJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgdGhpcy0+YnNzX3NldFtpXS5ic3NpZCwgRVRIX0FMRU4pOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwKKwkJCQkJCSAgZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLAorCQkJCQkJICAmaXdlLCBJV19FVl9BRERSX0xFTik7CisJCWl3ZS5jbWQJCSAgPSBTSU9DR0lXRVNTSUQ7CisJCWl3ZS51LmRhdGEuZmxhZ3MgID0gMTsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSB0aGlzLT5ic3Nfc2V0W2ldLnNzaWQuZWwubGVuOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwKKwkJCQkJCSAgZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLAorCQkJCQkJICAmaXdlLAorCQkJCQkJICB0aGlzLT5ic3Nfc2V0W2ldLnNzaWQuZXNzaWQpOworCQlpd2UuY21kCSAgID0gU0lPQ0dJV01PREU7CisJCWl3ZS51Lm1vZGUgPSB0aGlzLT5ic3Nfc2V0W2ldLmJzc190eXBlOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoY3VycmVudF9ldiwKKwkJCQkJCSAgZXh0cmEgKyBJV19TQ0FOX01BWF9EQVRBLAorCQkJCQkJICAmaXdlLCBJV19FVl9VSU5UX0xFTik7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKwkJaXdlLnUuZnJlcS5tID0gdGhpcy0+YnNzX3NldFtpXS5kc19wc2V0LmNoYW47CisJCWl3ZS51LmZyZXEuZSA9IDA7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LAorCQkJCQkJICBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsCisJCQkJCQkgICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKKwkJaXdlLmNtZCA9IFNJT0NHSVdFTkNPREU7CisJCWlmICh0aGlzLT5ic3Nfc2V0W2ldLmNhcF9pbmZvICYgV0wzNTAxX01HTVRfQ0FQQUJJTElUWV9QUklWQUNZKQorCQkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOworCQllbHNlCisJCQlpd2UudS5kYXRhLmZsYWdzID0gSVdfRU5DT0RFX0RJU0FCTEVEOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IDA7CisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChjdXJyZW50X2V2LAorCQkJCQkJICBleHRyYSArIElXX1NDQU5fTUFYX0RBVEEsCisJCQkJCQkgICZpd2UsIE5VTEwpOworCX0KKwkvKiBMZW5ndGggb2YgZGF0YSAqLworCXdycXUtPmRhdGEubGVuZ3RoID0gKGN1cnJlbnRfZXYgLSBleHRyYSk7CisJd3JxdS0+ZGF0YS5mbGFncyA9IDA7IC8qIEZJWE1FOiBzZXQgcHJvcGVybHkgdGhlc2UgZmxhZ3MgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bDM1MDFfc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisKKwlpZiAod3JxdS0+ZGF0YS5mbGFncykgeworCQlpd19zZXRfbWdtdF9pbmZvX2VsZW1lbnQoSVdfTUdNVF9JTkZPX0VMRU1FTlRfU1NJRCwKKwkJCQkJICZ0aGlzLT5lc3NpZC5lbCwKKwkJCQkJIGV4dHJhLCB3cnF1LT5kYXRhLmxlbmd0aCk7CisJfSBlbHNlIHsgLyogV2UgYWNjZXB0IGFueSBFU1NJRCAqLworCQlpd19zZXRfbWdtdF9pbmZvX2VsZW1lbnQoSVdfTUdNVF9JTkZPX0VMRU1FTlRfU1NJRCwKKwkJCQkJICZ0aGlzLT5lc3NpZC5lbCwgIkFOWSIsIDMpOworCX0KKwlyZXR1cm4gd2wzNTAxX3Jlc2V0KGRldik7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGhpcy0+bG9jaywgZmxhZ3MpOworCXdycXUtPmVzc2lkLmZsYWdzICA9IDE7CisJd3JxdS0+ZXNzaWQubGVuZ3RoID0gdGhpcy0+ZXNzaWQuZWwubGVuOworCW1lbWNweShleHRyYSwgdGhpcy0+ZXNzaWQuZXNzaWQsIHRoaXMtPmVzc2lkLmVsLmxlbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhpcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9zZXRfbmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gZGV2LT5wcml2OworCisJaWYgKHdycXUtPmRhdGEubGVuZ3RoID4gc2l6ZW9mKHRoaXMtPm5pY2spKQorCQlyZXR1cm4gLUUyQklHOworCXN0cmxjcHkodGhpcy0+bmljaywgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X25pY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKworCXN0cmxjcHkoZXh0cmEsIHRoaXMtPm5pY2ssIDMyKTsKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHN0cmxlbihleHRyYSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwkvKgorCSAqIEZJWE1FOiBoYXZlIHRvIHNlZSBmcm9tIHdoZXJlIHRvIGdldCB0aGlzIGluZm8sIHBlcmhhcHMgdGhpcyBjYXJkCisJICogd29ya3MgYXQgMSBNYml0L3MgdG9vLi4uIGZvciBub3cgbGVhdmUgYXQgMiBNYml0L3MgdGhhdCBpcyB0aGUgbW9zdAorCSAqIGNvbW1vbiB3aXRoIHRoZSBQbGFuZXQgQWNjZXNzIFBvaW50cy4gLWFjbWUKKwkgKi8KKwl3cnF1LT5iaXRyYXRlLnZhbHVlID0gMjAwMDAwMDsKKwl3cnF1LT5iaXRyYXRlLmZpeGVkID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X3J0c190aHJlc2hvbGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJdTE2IHRocmVzaG9sZDsgLyogc2l6ZSBjaGVja2VkOiBpdCBpcyB1MTYgKi8KKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisJaW50IHJjID0gd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywgV0wzNTAxX01JQl9BVFRSX1JUU19USFJFU0hPTEQsCisJCQkJICAgICAgJnRocmVzaG9sZCwgc2l6ZW9mKHRocmVzaG9sZCkpOworCWlmICghcmMpIHsKKwkJd3JxdS0+cnRzLnZhbHVlID0gdGhyZXNob2xkOworCQl3cnF1LT5ydHMuZGlzYWJsZWQgPSB0aHJlc2hvbGQgPj0gMjM0NzsKKwkJd3JxdS0+cnRzLmZpeGVkID0gMTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9nZXRfZnJhZ190aHJlc2hvbGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwl1MTYgdGhyZXNob2xkOyAvKiBzaXplIGNoZWNrZWQ6IGl0IGlzIHUxNiAqLworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlpbnQgcmMgPSB3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLCBXTDM1MDFfTUlCX0FUVFJfRlJBR19USFJFU0hPTEQsCisJCQkJICAgICAgJnRocmVzaG9sZCwgc2l6ZW9mKHRocmVzaG9sZCkpOworCWlmICghcmMpIHsKKwkJd3JxdS0+ZnJhZy52YWx1ZSA9IHRocmVzaG9sZDsKKwkJd3JxdS0+ZnJhZy5kaXNhYmxlZCA9IHRocmVzaG9sZCA+PSAyMzQ2OworCQl3cnF1LT5mcmFnLmZpeGVkID0gMTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHdsMzUwMV9nZXRfdHhwb3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXUxNiB0eHBvdzsKKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisJaW50IHJjID0gd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywKKwkJCQkgICAgICBXTDM1MDFfTUlCX0FUVFJfQ1VSUkVOVF9UWF9QV1JfTEVWRUwsCisJCQkJICAgICAgJnR4cG93LCBzaXplb2YodHhwb3cpKTsKKwlpZiAoIXJjKSB7CisJCXdycXUtPnR4cG93ZXIudmFsdWUgPSB0eHBvdzsKKwkJd3JxdS0+dHhwb3dlci5kaXNhYmxlZCA9IDA7CisJCS8qCisJCSAqIEZyb20gdGhlIE1JQiB2YWx1ZXMgSSB0aGluayB0aGlzIGNhbiBiZSBjb25maWd1cmFibGUsCisJCSAqIGFzIGl0IGxpc3RzIHNldmVyYWwgdHggcG93ZXIgbGV2ZWxzIC1hY21lCisJCSAqLworCQl3cnF1LT50eHBvd2VyLmZpeGVkID0gMDsKKwkJd3JxdS0+dHhwb3dlci5mbGFncyA9IElXX1RYUE9XX01XQVRUOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJdTggcmV0cnk7IC8qIHNpemUgY2hlY2tlZDogaXQgaXMgdTggKi8KKwlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBkZXYtPnByaXY7CisJaW50IHJjID0gd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywKKwkJCQkgICAgICBXTDM1MDFfTUlCX0FUVFJfTE9OR19SRVRSWV9MSU1JVCwKKwkJCQkgICAgICAmcmV0cnksIHNpemVvZihyZXRyeSkpOworCWlmIChyYykKKwkJZ290byBvdXQ7CisJaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTUFYKSB7CisJCXdycXUtPnJldHJ5LmZsYWdzID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9NQVg7CisJCWdvdG8gc2V0X3ZhbHVlOworCX0KKwlyYyA9IHdsMzUwMV9nZXRfbWliX3ZhbHVlKHRoaXMsIFdMMzUwMV9NSUJfQVRUUl9TSE9SVF9SRVRSWV9MSU1JVCwKKwkJCQkgICZyZXRyeSwgc2l6ZW9mKHJldHJ5KSk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwl3cnF1LT5yZXRyeS5mbGFncyA9IElXX1JFVFJZX0xJTUlUIHwgSVdfUkVUUllfTUlOOworc2V0X3ZhbHVlOgorCXdycXUtPnJldHJ5LnZhbHVlID0gcmV0cnk7CisJd3JxdS0+cmV0cnkuZGlzYWJsZWQgPSAwOworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB3bDM1MDFfZ2V0X2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwl1OCBpbXBsZW1lbnRlZCwgcmVzdHJpY3RlZCwga2V5c1sxMDBdLCBsZW5fa2V5cywgdG9jb3B5OworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlpbnQgcmMgPSB3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLAorCQkJCSAgICAgIFdMMzUwMV9NSUJfQVRUUl9QUklWX09QVF9JTVBMRU1FTlRFRCwKKwkJCQkgICAgICAmaW1wbGVtZW50ZWQsIHNpemVvZihpbXBsZW1lbnRlZCkpOworCWlmIChyYykKKwkJZ290byBvdXQ7CisJaWYgKCFpbXBsZW1lbnRlZCkgeworCQl3cnF1LT5lbmNvZGluZy5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJZ290byBvdXQ7CisJfQorCXJjID0gd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywgV0wzNTAxX01JQl9BVFRSX0VYQ0xVREVfVU5FTkNSWVBURUQsCisJCQkJICAmcmVzdHJpY3RlZCwgc2l6ZW9mKHJlc3RyaWN0ZWQpKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCXdycXUtPmVuY29kaW5nLmZsYWdzID0gcmVzdHJpY3RlZCA/IElXX0VOQ09ERV9SRVNUUklDVEVEIDoKKwkJCQkJICAgIElXX0VOQ09ERV9PUEVOOworCXJjID0gd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywgV0wzNTAxX01JQl9BVFRSX1dFUF9LRVlfTUFQUElOR1NfTEVOLAorCQkJCSAgJmxlbl9rZXlzLCBzaXplb2YobGVuX2tleXMpKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCXJjID0gd2wzNTAxX2dldF9taWJfdmFsdWUodGhpcywgV0wzNTAxX01JQl9BVFRSX1dFUF9LRVlfTUFQUElOR1MsCisJCQkJICBrZXlzLCBsZW5fa2V5cyk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwl0b2NvcHkgPSBtaW5fdCh1OCwgbGVuX2tleXMsIHdycXUtPmVuY29kaW5nLmxlbmd0aCk7CisJdG9jb3B5ID0gbWluX3QodTgsIHRvY29weSwgMTAwKTsKKwl3cnF1LT5lbmNvZGluZy5sZW5ndGggPSB0b2NvcHk7CisJbWVtc2V0KGV4dHJhLCAwLCB0b2NvcHkpOworCW1lbWNweShleHRyYSwga2V5cywgdG9jb3B5KTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgd2wzNTAxX2dldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJdTggcHdyX3N0YXRlOworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpcyA9IGRldi0+cHJpdjsKKwlpbnQgcmMgPSB3bDM1MDFfZ2V0X21pYl92YWx1ZSh0aGlzLAorCQkJCSAgICAgIFdMMzUwMV9NSUJfQVRUUl9DVVJSRU5UX1BXUl9TVEFURSwKKwkJCQkgICAgICAmcHdyX3N0YXRlLCBzaXplb2YocHdyX3N0YXRlKSk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwl3cnF1LT5wb3dlci5kaXNhYmxlZCA9ICFwd3Jfc3RhdGU7CisJd3JxdS0+cG93ZXIuZmxhZ3MgPSBJV19QT1dFUl9PTjsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyCXdsMzUwMV9oYW5kbGVyW10gPSB7CisJW1NJT0NHSVdOQU1FCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX2dldF9uYW1lLAorCVtTSU9DU0lXRlJFUQktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9zZXRfZnJlcSwKKwlbU0lPQ0dJV0ZSRVEJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X2ZyZXEsCisJW1NJT0NTSVdNT0RFCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX3NldF9tb2RlLAorCVtTSU9DR0lXTU9ERQktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9nZXRfbW9kZSwKKwlbU0lPQ0dJV1NFTlMJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X3NlbnMsCisJW1NJT0NHSVdSQU5HRQktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9nZXRfcmFuZ2UsCisJW1NJT0NTSVdTUFkJLSBTSU9DSVdGSVJTVF0gPSBpd19oYW5kbGVyX3NldF9zcHksCisJW1NJT0NHSVdTUFkJLSBTSU9DSVdGSVJTVF0gPSBpd19oYW5kbGVyX2dldF9zcHksCisJW1NJT0NTSVdUSFJTUFkJLSBTSU9DSVdGSVJTVF0gPSBpd19oYW5kbGVyX3NldF90aHJzcHksCisJW1NJT0NHSVdUSFJTUFkJLSBTSU9DSVdGSVJTVF0gPSBpd19oYW5kbGVyX2dldF90aHJzcHksCisJW1NJT0NTSVdBUAktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9zZXRfd2FwLAorCVtTSU9DR0lXQVAJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X3dhcCwKKwlbU0lPQ1NJV1NDQU4JLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfc2V0X3NjYW4sCisJW1NJT0NHSVdTQ0FOCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX2dldF9zY2FuLAorCVtTSU9DU0lXRVNTSUQJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfc2V0X2Vzc2lkLAorCVtTSU9DR0lXRVNTSUQJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X2Vzc2lkLAorCVtTSU9DU0lXTklDS04JLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfc2V0X25pY2ssCisJW1NJT0NHSVdOSUNLTgktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9nZXRfbmljaywKKwlbU0lPQ0dJV1JBVEUJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X3JhdGUsCisJW1NJT0NHSVdSVFMJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X3J0c190aHJlc2hvbGQsCisJW1NJT0NHSVdGUkFHCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX2dldF9mcmFnX3RocmVzaG9sZCwKKwlbU0lPQ0dJV1RYUE9XCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX2dldF90eHBvdywKKwlbU0lPQ0dJV1JFVFJZCS0gU0lPQ0lXRklSU1RdID0gd2wzNTAxX2dldF9yZXRyeSwKKwlbU0lPQ0dJV0VOQ09ERQktIFNJT0NJV0ZJUlNUXSA9IHdsMzUwMV9nZXRfZW5jb2RlLAorCVtTSU9DR0lXUE9XRVIJLSBTSU9DSVdGSVJTVF0gPSB3bDM1MDFfZ2V0X3Bvd2VyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiB3bDM1MDFfaGFuZGxlcl9kZWYgPSB7CisJLm51bV9zdGFuZGFyZAk9IHNpemVvZih3bDM1MDFfaGFuZGxlcikgLyBzaXplb2YoaXdfaGFuZGxlciksCisJLnN0YW5kYXJkCT0gKGl3X2hhbmRsZXIgKil3bDM1MDFfaGFuZGxlciwKKwkuc3B5X29mZnNldAk9IG9mZnNldG9mKHN0cnVjdCB3bDM1MDFfY2FyZCwgc3B5X2RhdGEpLAorfTsKKworLyoqCisgKiB3bDM1MDFfYXR0YWNoIC0gY3JlYXRlcyBhbiAiaW5zdGFuY2UiIG9mIHRoZSBkcml2ZXIKKyAqCisgKiBDcmVhdGVzIGFuICJpbnN0YW5jZSIgb2YgdGhlIGRyaXZlciwgYWxsb2NhdGluZyBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgZm9yCisgKiBvbmUgZGV2aWNlLiAgVGhlIGRldmljZSBpcyByZWdpc3RlcmVkIHdpdGggQ2FyZCBTZXJ2aWNlcy4KKyAqCisgKiBUaGUgZGV2X2xpbmsgc3RydWN0dXJlIGlzIGluaXRpYWxpemVkLCBidXQgd2UgZG9uJ3QgYWN0dWFsbHkgY29uZmlndXJlIHRoZQorICogY2FyZCBhdCB0aGlzIHBvaW50IC0tIHdlIHdhaXQgdW50aWwgd2UgcmVjZWl2ZSBhIGNhcmQgaW5zZXJ0aW9uIGV2ZW50LgorICovCitzdGF0aWMgZGV2X2xpbmtfdCAqd2wzNTAxX2F0dGFjaCh2b2lkKQoreworCWNsaWVudF9yZWdfdCBjbGllbnRfcmVnOworCWRldl9saW5rX3QgKmxpbms7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlpbnQgcmV0OworCisJLyogSW5pdGlhbGl6ZSB0aGUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgKi8KKwlsaW5rID0ga21hbGxvYyhzaXplb2YoKmxpbmspLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxpbmspCisJCWdvdG8gb3V0OworCW1lbXNldChsaW5rLCAwLCBzaXplb2Yoc3RydWN0IGRldl9saW5rX3QpKTsKKworCS8qIFRoZSBpbyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIElPIHBvcnQgbWFwcGluZyAqLworCWxpbmstPmlvLk51bVBvcnRzMQk9IDE2OworCWxpbmstPmlvLkF0dHJpYnV0ZXMxCT0gSU9fREFUQV9QQVRIX1dJRFRIXzg7CisJbGluay0+aW8uSU9BZGRyTGluZXMJPSA1OworCisJLyogSW50ZXJydXB0IHNldHVwICovCisJbGluay0+aXJxLkF0dHJpYnV0ZXMJPSBJUlFfVFlQRV9FWENMVVNJVkUgfCBJUlFfSEFORExFX1BSRVNFTlQ7CisJbGluay0+aXJxLklSUUluZm8xCT0gSVJRX0xFVkVMX0lEOworCWxpbmstPmlycS5IYW5kbGVyID0gd2wzNTAxX2ludGVycnVwdDsKKworCS8qIEdlbmVyYWwgc29ja2V0IGNvbmZpZ3VyYXRpb24gKi8KKwlsaW5rLT5jb25mLkF0dHJpYnV0ZXMJPSBDT05GX0VOQUJMRV9JUlE7CisJbGluay0+Y29uZi5WY2MJCT0gNTA7CisJbGluay0+Y29uZi5JbnRUeXBlCT0gSU5UX01FTU9SWV9BTkRfSU87CisJbGluay0+Y29uZi5Db25maWdJbmRleAk9IDE7CisJbGluay0+Y29uZi5QcmVzZW50CT0gUFJFU0VOVF9PUFRJT047CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHdsMzUwMV9jYXJkKSk7CisJaWYgKCFkZXYpCisJCWdvdG8gb3V0X2xpbms7CisJZGV2LT5vcGVuCQk9IHdsMzUwMV9vcGVuOworCWRldi0+c3RvcAkJPSB3bDM1MDFfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQJPSB3bDM1MDFfaGFyZF9zdGFydF94bWl0OworCWRldi0+dHhfdGltZW91dAkJPSB3bDM1MDFfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvCT0gNSAqIEhaOworCWRldi0+Z2V0X3N0YXRzCQk9IHdsMzUwMV9nZXRfc3RhdHM7CisJZGV2LT5nZXRfd2lyZWxlc3Nfc3RhdHMgPSB3bDM1MDFfZ2V0X3dpcmVsZXNzX3N0YXRzOworCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMJPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopJndsMzUwMV9oYW5kbGVyX2RlZjsKKwlTRVRfRVRIVE9PTF9PUFMoZGV2LCAmb3BzKTsKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJbGluay0+cHJpdiA9IGxpbmstPmlycS5JbnN0YW5jZSA9IGRldjsKKworCS8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLworCWxpbmstPm5leHQJCSA9IHdsMzUwMV9kZXZfbGlzdDsKKwl3bDM1MDFfZGV2X2xpc3QJCSA9IGxpbms7CisJY2xpZW50X3JlZy5kZXZfaW5mbwkgPSAmd2wzNTAxX2Rldl9pbmZvOworCWNsaWVudF9yZWcuRXZlbnRNYXNrCSA9IENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwKKwkJCQkgICBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8CisJCQkJICAgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8CisJCQkJICAgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKKwkJCQkgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwKKwkJCQkgICBDU19FVkVOVF9QTV9SRVNVTUU7CisJY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gd2wzNTAxX2V2ZW50OworCWNsaWVudF9yZWcuVmVyc2lvbgkgPSAweDAyMTA7CisJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKKwlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKKwlpZiAocmV0KSB7CisJCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVnaXN0ZXJDbGllbnQsIHJldCk7CisJCXdsMzUwMV9kZXRhY2gobGluayk7CisJCWxpbmsgPSBOVUxMOworCX0KK291dDoKKwlyZXR1cm4gbGluazsKK291dF9saW5rOgorCWtmcmVlKGxpbmspOworCWxpbmsgPSBOVUxMOworCWdvdG8gb3V0OworfQorCisjZGVmaW5lIENTX0NIRUNLKGZuLCByZXQpIFwKK2RvIHsgbGFzdF9mbiA9IChmbik7IGlmICgobGFzdF9yZXQgPSAocmV0KSkgIT0gMCkgZ290byBjc19mYWlsZWQ7IH0gd2hpbGUgKDApCisKKy8qKgorICogd2wzNTAxX2NvbmZpZyAtIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCBhbmQgbWFrZSBldGggZGV2aWNlIGF2YWlsYWJsZQorICogQGxpbmsgLSBGSUxMX0lOCisgKgorICogd2wzNTAxX2NvbmZpZygpIGlzIHNjaGVkdWxlZCB0byBydW4gYWZ0ZXIgYSBDQVJEX0lOU0VSVElPTiBldmVudCBpcworICogcmVjZWl2ZWQsIHRvIGNvbmZpZ3VyZSB0aGUgUENNQ0lBIHNvY2tldCwgYW5kIHRvIG1ha2UgdGhlIGV0aGVybmV0IGRldmljZQorICogYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0uCisgKi8KK3N0YXRpYyB2b2lkIHdsMzUwMV9jb25maWcoZGV2X2xpbmtfdCAqbGluaykKK3sKKwl0dXBsZV90IHR1cGxlOworCWNpc3BhcnNlX3QgcGFyc2U7CisJY2xpZW50X2hhbmRsZV90IGhhbmRsZSA9IGxpbmstPmhhbmRsZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKKwlpbnQgaSA9IDAsIGosIGxhc3RfZm4sIGxhc3RfcmV0OworCXVuc2lnbmVkIGNoYXIgYmZbNjRdOworCXN0cnVjdCB3bDM1MDFfY2FyZCAqdGhpczsKKworCS8qIFRoaXMgcmVhZHMgdGhlIGNhcmQncyBDT05GSUcgdHVwbGUgdG8gZmluZCBpdHMgY29uZmlnIHJlZ2lzdGVycy4gKi8KKwl0dXBsZS5BdHRyaWJ1dGVzCT0gMDsKKwl0dXBsZS5EZXNpcmVkVHVwbGUJPSBDSVNUUExfQ09ORklHOworCUNTX0NIRUNLKEdldEZpcnN0VHVwbGUsIHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUpKTsKKwl0dXBsZS5UdXBsZURhdGEJCT0gYmY7CisJdHVwbGUuVHVwbGVEYXRhTWF4CT0gc2l6ZW9mKGJmKTsKKwl0dXBsZS5UdXBsZU9mZnNldAk9IDA7CisJQ1NfQ0hFQ0soR2V0VHVwbGVEYXRhLCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoaGFuZGxlLCAmdHVwbGUpKTsKKwlDU19DSEVDSyhQYXJzZVR1cGxlLCBwY21jaWFfcGFyc2VfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkpOworCWxpbmstPmNvbmYuQ29uZmlnQmFzZQk9IHBhcnNlLmNvbmZpZy5iYXNlOworCWxpbmstPmNvbmYuUHJlc2VudAk9IHBhcnNlLmNvbmZpZy5ybWFza1swXTsKKworCS8qIENvbmZpZ3VyZSBjYXJkICovCisJbGluay0+c3RhdGUgfD0gREVWX0NPTkZJRzsKKworCS8qIFRyeSBhbGxvY2F0aW5nIElPIHBvcnRzLiAgVGhpcyB0cmllcyBhIGZldyBmaXhlZCBhZGRyZXNzZXMuICBJZiB5b3UKKwkgKiB3YW50LCB5b3UgY2FuIGFsc28gcmVhZCB0aGUgY2FyZCdzIGNvbmZpZyB0YWJsZSB0byBwaWNrIGFkZHJlc3NlcyAtLQorCSAqIHNlZSB0aGUgc2VyaWFsIGRyaXZlciBmb3IgYW4gZXhhbXBsZS4gKi8KKworCWZvciAoaiA9IDB4MjgwOyBqIDwgMHg0MDA7IGogKz0gMHgyMCkgeworCQkvKiBUaGUgJ14weDMwMCcgaXMgc28gdGhhdCB3ZSBwcm9iZSAweDMwMC0weDNmZiBmaXJzdCwgdGhlbgorCQkgKiAweDIwMC0weDJmZiwgYW5kIHNvIG9uLCBiZWNhdXNlIHRoaXMgc2VlbXMgc2FmZXIgKi8KKwkJbGluay0+aW8uQmFzZVBvcnQxID0gajsKKwkJbGluay0+aW8uQmFzZVBvcnQyID0gbGluay0+aW8uQmFzZVBvcnQxICsgMHgxMDsKKwkJaSA9IHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwkJaWYgKGkgPT0gQ1NfU1VDQ0VTUykKKwkJCWJyZWFrOworCX0KKwlpZiAoaSAhPSBDU19TVUNDRVNTKSB7CisJCWNzX2Vycm9yKGxpbmstPmhhbmRsZSwgUmVxdWVzdElPLCBpKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJLyogTm93IGFsbG9jYXRlIGFuIGludGVycnVwdCBsaW5lLiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhY3R1YWxseQorCSAqIGFzc2lnbiBhIGhhbmRsZXIgdG8gdGhlIGludGVycnVwdC4gKi8KKworCUNTX0NIRUNLKFJlcXVlc3RJUlEsIHBjbWNpYV9yZXF1ZXN0X2lycShsaW5rLT5oYW5kbGUsICZsaW5rLT5pcnEpKTsKKworCS8qIFRoaXMgYWN0dWFsbHkgY29uZmlndXJlcyB0aGUgUENNQ0lBIHNvY2tldCAtLSBzZXR0aW5nIHVwIHRoZSBJL08KKwkgKiB3aW5kb3dzIGFuZCB0aGUgaW50ZXJydXB0IG1hcHBpbmcuICAqLworCisJQ1NfQ0hFQ0soUmVxdWVzdENvbmZpZ3VyYXRpb24sIHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZikpOworCisJZGV2LT5pcnEgPSBsaW5rLT5pcnEuQXNzaWduZWRJUlE7CisJZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmaGFuZGxlX3RvX2RldihoYW5kbGUpKTsKKwlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJ3bDM1MDFfY3M6IHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbGVkOworCX0KKworCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKworCXRoaXMgPSBkZXYtPnByaXY7CisJLyoKKwkgKiBBdCB0aGlzIHBvaW50LCB0aGUgZGV2X25vZGVfdCBzdHJ1Y3R1cmUocykgc2hvdWxkIGJlIGluaXRpYWxpemVkIGFuZAorCSAqIGFycmFuZ2VkIGluIGEgbGlua2VkIGxpc3QgYXQgbGluay0+ZGV2LgorCSAqLworCWxpbmstPmRldiA9ICZ0aGlzLT5ub2RlOworCWxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisKKwl0aGlzLT5iYXNlX2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCWlmICghd2wzNTAxX2dldF9mbGFzaF9tYWNfYWRkcih0aGlzKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2FudCByZWFkIE1BQyBhZGRyIGluIGZsYXNoIFJPTT9cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJc3RyY3B5KHRoaXMtPm5vZGUuZGV2X25hbWUsIGRldi0+bmFtZSk7CisKKwkvKiBwcmludCBwcm9iZSBpbmZvcm1hdGlvbiAqLworCXByaW50ayhLRVJOX0lORk8gIiVzOiB3bDM1MDEgQCAweCUzLjN4LCBJUlEgJWQsIE1BQyBhZGRyIGluIGZsYXNoIFJPTToiLAorCSAgICAgICBkZXYtPm5hbWUsIHRoaXMtPmJhc2VfYWRkciwgKGludClkZXYtPmlycSk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlkZXYtPmRldl9hZGRyW2ldID0gKChjaGFyICopJnRoaXMtPm1hY19hZGRyKVtpXTsKKwkJcHJpbnRrKCIlYyUwMngiLCBpID8gJzonIDogJyAnLCBkZXYtPmRldl9hZGRyW2ldKTsKKwl9CisJcHJpbnRrKCJcbiIpOworCS8qCisJICogSW5pdGlhbGl6ZSBjYXJkIHBhcmFtZXRlcnMgLSBhZGRlZCBieSBqc3MKKwkgKi8KKwl0aGlzLT5uZXRfdHlwZQkJPSBJV19NT0RFX0lORlJBOworCXRoaXMtPmJzc19jbnQJCT0gMDsKKwl0aGlzLT5qb2luX3N0YV9ic3MJPSAwOworCXRoaXMtPmFkaG9jX3RpbWVzCT0gMDsKKwlpd19zZXRfbWdtdF9pbmZvX2VsZW1lbnQoSVdfTUdNVF9JTkZPX0VMRU1FTlRfU1NJRCwgJnRoaXMtPmVzc2lkLmVsLAorCQkJCSAiQU5ZIiwgMyk7CisJdGhpcy0+Y2FyZF9uYW1lWzBdCT0gJ1wwJzsKKwl0aGlzLT5maXJtd2FyZV9kYXRlWzBdCT0gJ1wwJzsKKwl0aGlzLT5yc3NpCQk9IDI1NTsKKwl0aGlzLT5jaGFuCQk9IGl3X2RlZmF1bHRfY2hhbm5lbCh0aGlzLT5yZWdfZG9tYWluKTsKKwlzdHJsY3B5KHRoaXMtPm5pY2ssICJQbGFuZXQgV0wzNTAxIiwgc2l6ZW9mKHRoaXMtPm5pY2spKTsKKwlzcGluX2xvY2tfaW5pdCgmdGhpcy0+bG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdGhpcy0+d2FpdCk7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlnb3RvIG91dDsKK2NzX2ZhaWxlZDoKKwljc19lcnJvcihsaW5rLT5oYW5kbGUsIGxhc3RfZm4sIGxhc3RfcmV0KTsKK2ZhaWxlZDoKKwl3bDM1MDFfcmVsZWFzZShsaW5rKTsKK291dDoKKwlyZXR1cm47Cit9CisKKy8qKgorICogd2wzNTAxX3JlbGVhc2UgLSB1bnJlZ2lzdGVyIHRoZSBuZXQsIHJlbGVhc2UgUENNQ0lBIGNvbmZpZ3VyYXRpb24KKyAqIEBhcmcgLSBsaW5rCisgKgorICogQWZ0ZXIgYSBjYXJkIGlzIHJlbW92ZWQsIHdsMzUwMV9yZWxlYXNlKCkgd2lsbCB1bnJlZ2lzdGVyIHRoZSBuZXQgZGV2aWNlLAorICogYW5kIHJlbGVhc2UgdGhlIFBDTUNJQSBjb25maWd1cmF0aW9uLiAgSWYgdGhlIGRldmljZSBpcyBzdGlsbCBvcGVuLCB0aGlzCisgKiB3aWxsIGJlIHBvc3Rwb25lZCB1bnRpbCBpdCBpcyBjbG9zZWQuCisgKi8KK3N0YXRpYyB2b2lkIHdsMzUwMV9yZWxlYXNlKGRldl9saW5rX3QgKmxpbmspCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisKKwkvKiBVbmxpbmsgdGhlIGRldmljZSBjaGFpbiAqLworCWlmIChsaW5rLT5kZXYpIHsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwkJbGluay0+ZGV2ID0gTlVMTDsKKwl9CisKKwkvKiBEb24ndCBib3RoZXIgY2hlY2tpbmcgdG8gc2VlIGlmIHRoZXNlIHN1Y2NlZWQgb3Igbm90ICovCisJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCXBjbWNpYV9yZWxlYXNlX2lvKGxpbmstPmhhbmRsZSwgJmxpbmstPmlvKTsKKwlwY21jaWFfcmVsZWFzZV9pcnEobGluay0+aGFuZGxlLCAmbGluay0+aXJxKTsKKwlsaW5rLT5zdGF0ZSAmPSB+REVWX0NPTkZJRzsKK30KKworLyoqCisgKiB3bDM1MDFfZXZlbnQgLSBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlcgorICogQGV2ZW50IC0gZXZlbnQKKyAqIEBwcmkgLSBwcmlvcml0eQorICogQGFyZ3MgLSBhcmd1bWVudHMgZm9yIHRoaXMgZXZlbnQKKyAqCisgKiBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4gTW9zdGx5LCB0aGlzIHNjaGVkdWxlcyBvdGhlciBzdHVmZiB0byBydW4KKyAqIGFmdGVyIGFuIGV2ZW50IGlzIHJlY2VpdmVkLiBBIENBUkRfUkVNT1ZBTCBldmVudCBhbHNvIHNldHMgc29tZSBmbGFncyB0bworICogZGlzY291cmFnZSB0aGUgbmV0IGRyaXZlcnMgZnJvbSB0cnlpbmcgdG8gdGFsayB0byB0aGUgY2FyZCBhbnkgbW9yZS4KKyAqCisgKiBXaGVuIGEgQ0FSRF9SRU1PVkFMIGV2ZW50IGlzIHJlY2VpdmVkLCB3ZSBpbW1lZGlhdGVseSBzZXQgYSBmbGFnIHRvIGJsb2NrCisgKiBmdXR1cmUgYWNjZXNzZXMgdG8gdGhpcyBkZXZpY2UuIEFsbCB0aGUgZnVuY3Rpb25zIHRoYXQgYWN0dWFsbHkgYWNjZXNzIHRoZQorICogZGV2aWNlIHNob3VsZCBjaGVjayB0aGlzIGZsYWcgdG8gbWFrZSBzdXJlIHRoZSBjYXJkIGlzIHN0aWxsIHByZXNlbnQuCisgKi8KK3N0YXRpYyBpbnQgd2wzNTAxX2V2ZW50KGV2ZW50X3QgZXZlbnQsIGludCBwcmksIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncykKK3sKKwlkZXZfbGlua190ICpsaW5rID0gYXJncy0+Y2xpZW50X2RhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBDU19FVkVOVF9DQVJEX1JFTU9WQUw6CisJCWxpbmstPnN0YXRlICY9IH5ERVZfUFJFU0VOVDsKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJd2hpbGUgKGxpbmstPm9wZW4gPiAwKQorCQkJCXdsMzUwMV9jbG9zZShkZXYpOworCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQkJd2wzNTAxX3JlbGVhc2UobGluayk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKKwkJbGluay0+c3RhdGUgfD0gREVWX1BSRVNFTlQgfCBERVZfQ09ORklHX1BFTkRJTkc7CisJCXdsMzUwMV9jb25maWcobGluayk7CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfUE1fU1VTUEVORDoKKwkJbGluay0+c3RhdGUgfD0gREVWX1NVU1BFTkQ7CisJCXdsMzUwMV9wd3JfbWdtdChkZXYtPnByaXYsIFdMMzUwMV9TVVNQRU5EKTsKKwkJLyogRmFsbCB0aHJvdWdoLi4uICovCisJY2FzZSBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTDoKKwkJaWYgKGxpbmstPnN0YXRlICYgREVWX0NPTkZJRykgeworCQkJaWYgKGxpbmstPm9wZW4pCisJCQkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOworCQkJcGNtY2lhX3JlbGVhc2VfY29uZmlndXJhdGlvbihsaW5rLT5oYW5kbGUpOworCQl9CisJCWJyZWFrOworCWNhc2UgQ1NfRVZFTlRfUE1fUkVTVU1FOgorCQlsaW5rLT5zdGF0ZSAmPSB+REVWX1NVU1BFTkQ7CisJCXdsMzUwMV9wd3JfbWdtdChkZXYtPnByaXYsIFdMMzUwMV9SRVNVTUUpOworCQkvKiBGYWxsIHRocm91Z2guLi4gKi8KKwljYXNlIENTX0VWRU5UX0NBUkRfUkVTRVQ6CisJCWlmIChsaW5rLT5zdGF0ZSAmIERFVl9DT05GSUcpIHsKKwkJCXBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24obGluay0+aGFuZGxlLCAmbGluay0+Y29uZik7CisJCQlpZiAobGluay0+b3BlbikgeworCQkJCXdsMzUwMV9yZXNldChkZXYpOworCQkJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciB3bDM1MDFfZHJpdmVyID0geworCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5kcnYgICAgICAgICAgICA9IHsKKwkJLm5hbWUgICA9ICJ3bDM1MDFfY3MiLAorCX0sCisJLmF0dGFjaCAgICAgICAgID0gd2wzNTAxX2F0dGFjaCwKKwkuZGV0YWNoICAgICAgICAgPSB3bDM1MDFfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgd2wzNTAxX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHBjbWNpYV9yZWdpc3Rlcl9kcml2ZXIoJndsMzUwMV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgd2wzNTAxX2V4aXRfbW9kdWxlKHZvaWQpCit7CisJZHByaW50aygwLCAiOiB1bmxvYWRpbmciKTsKKwlwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIoJndsMzUwMV9kcml2ZXIpOworCUJVR19PTih3bDM1MDFfZGV2X2xpc3QgIT0gTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KHdsMzUwMV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdCh3bDM1MDFfZXhpdF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJGb3ggQ2hlbiA8bWhjaGVuQGdvbGYuY2NsLml0cmkub3JnLnR3PiwgIgorCSAgICAgICJBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4sIgorCSAgICAgICJHdXN0YXZvIE5pZW1leWVyIDxuaWVtZXllckBjb25lY3RpdmEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQbGFuZXQgd2wzNTAxIHdpcmVsZXNzIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveWVsbG93ZmluLmMgYi9kcml2ZXJzL25ldC95ZWxsb3dmaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGE5MjU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQveWVsbG93ZmluLmMKQEAgLTAsMCArMSwxNDk5IEBACisvKiB5ZWxsb3dmaW4uYzogQSBQYWNrZXQgRW5naW5lcyBHLU5JQyBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4LiAqLworLyoKKwlXcml0dGVuIDE5OTctMjAwMSBieSBEb25hbGQgQmVja2VyLgorCisJVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcyBvZgorCXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisJRHJpdmVycyBiYXNlZCBvbiBvciBkZXJpdmVkIGZyb20gdGhpcyBjb2RlIGZhbGwgdW5kZXIgdGhlIEdQTCBhbmQgbXVzdAorCXJldGFpbiB0aGUgYXV0aG9yc2hpcCwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIG5vdGljZS4gIFRoaXMgZmlsZSBpcyBub3QKKwlhIGNvbXBsZXRlIHByb2dyYW0gYW5kIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgZW50aXJlIG9wZXJhdGluZworCXN5c3RlbSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMLgorCisJVGhpcyBkcml2ZXIgaXMgZm9yIHRoZSBQYWNrZXQgRW5naW5lcyBHLU5JQyBQQ0kgR2lnYWJpdCBFdGhlcm5ldCBhZGFwdGVyLgorCUl0IGFsc28gc3VwcG9ydHMgdGhlIFN5bWJpb3MgTG9naWMgdmVyc2lvbiBvZiB0aGUgc2FtZSBjaGlwIGNvcmUuCisKKwlUaGUgYXV0aG9yIG1heSBiZSByZWFjaGVkIGFzIGJlY2tlckBzY3lsZC5jb20sIG9yIEMvTworCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorCTQxMCBTZXZlcm4gQXZlLiwgU3VpdGUgMjEwCisJQW5uYXBvbGlzIE1EIDIxNDAzCisKKwlTdXBwb3J0IGFuZCB1cGRhdGVzIGF2YWlsYWJsZSBhdAorCWh0dHA6Ly93d3cuc2N5bGQuY29tL25ldHdvcmsveWVsbG93ZmluLmh0bWwKKworCisJTGludXgga2VybmVsIGNoYW5nZWxvZzoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJTEsxLjEuMSAoamdhcnppayk6IFBvcnQgdG8gMi40IGtlcm5lbAorCisJTEsxLjEuMiAoamdhcnppayk6CisJKiBNZXJnZSBpbiBiZWNrZXIgdmVyc2lvbiAxLjA1CisKKwlMSzEuMS4zIChqZ2FyemlrKToKKwkqIFZhcmlvdXMgY2xlYW51cHMKKwkqIFVwZGF0ZSB5ZWxsb3dmaW5fdGltZXIgdG8gY29ycmVjdGx5IGNhbGN1bGF0ZSBkdXBsZXguCisJKHN1Z2dlc3RlZCBieSBNYW5mcmVkIFNwcmF1bCkKKworCUxLMS4xLjQgKHZhbEBubXQuZWR1KToKKwkqIEZpeCB0aHJlZSBlbmRpYW4tbmVzcyBidWdzCisJKiBTdXBwb3J0IGR1YWwgZnVuY3Rpb24gU1lNNTNDODg1RSBldGhlcm5ldCBjaGlwCisJCisJTEsxLjEuNSAodmFsQG5tdC5lZHUpOgorCSogRml4IGZvcmNlZCBmdWxsLWR1cGxleCBidWcgSSBpbnRyb2R1Y2VkCisKKwlMSzEuMS42ICh2YWxAbm10LmVkdSk6CisJKiBPbmx5IHByaW50IHdhcm5pbmcgb24gdHJ1bHkgIm92ZXJzaXplZCIgcGFja2V0cworCSogRml4IHRoZW9yZXRpY2FsIGJ1ZyBvbiBnaWdhYml0IGNhcmRzIC0gcmV0dXJuIHRvIDEuMS4zIGJlaGF2aW9yCisJCisqLworCisjZGVmaW5lIERSVl9OQU1FCSJ5ZWxsb3dmaW4iCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjA1K0xLMS4xLjYiCisjZGVmaW5lIERSVl9SRUxEQVRFCSJGZWIgMTEsIDIwMDIiCisKKyNkZWZpbmUgUEZYIERSVl9OQU1FICI6ICIKKworLyogVGhlIHVzZXItY29uZmlndXJhYmxlIHZhbHVlcy4KKyAgIFRoZXNlIG1heSBiZSBtb2RpZmllZCB3aGVuIGEgZHJpdmVyIG1vZHVsZSBpcyBsb2FkZWQuKi8KKworc3RhdGljIGludCBkZWJ1ZyA9IDE7CQkJLyogMSBub3JtYWwgbWVzc2FnZXMsIDAgcXVpZXQgLi4gNyB2ZXJib3NlLiAqLworLyogTWF4aW11bSBldmVudHMgKFJ4IHBhY2tldHMsIGV0Yy4pIHRvIGhhbmRsZSBhdCBlYWNoIGludGVycnVwdC4gKi8KK3N0YXRpYyBpbnQgbWF4X2ludGVycnVwdF93b3JrID0gMjA7CitzdGF0aWMgaW50IG10dTsKKyNpZmRlZiBZRl9QUk9UT1RZUEUJCQkvKiBTdXBwb3J0IGZvciBwcm90b3R5cGUgaGFyZHdhcmUgZXJyYXRhLiAqLworLyogU3lzdGVtLXdpZGUgY291bnQgb2YgYm9ndXMtcnggZnJhbWVzLiAqLworc3RhdGljIGludCBib2d1c19yeDsKK3N0YXRpYyBpbnQgZG1hX2N0cmwgPSAweDAwNEEwMjYzOyAJCQkvKiBDb25zdHJhaW5lZCBieSBlcnJhdGEgKi8KK3N0YXRpYyBpbnQgZmlmb19jZmcgPSAweDAwMjA7CQkJCS8qIEJ5cGFzcyBleHRlcm5hbCBUeCBGSUZPLiAqLworI2VsaWYgZGVmaW5lZChZRl9ORVcpCQkJCQkvKiBBIGZ1dHVyZSBwZXJmZWN0IGJvYXJkIDotPi4gICovCitzdGF0aWMgaW50IGRtYV9jdHJsID0gMHgwMENBQzI3NzsJCQkvKiBPdmVycmlkZSB3aGVuIGxvYWRpbmcgbW9kdWxlISAqLworc3RhdGljIGludCBmaWZvX2NmZyA9IDB4MDAyODsKKyNlbHNlCitzdGF0aWMgaW50IGRtYV9jdHJsID0gMHgwMDRBMDI2MzsgCQkJLyogQ29uc3RyYWluZWQgYnkgZXJyYXRhICovCitzdGF0aWMgaW50IGZpZm9fY2ZnID0gMHgwMDIwOwkJCQkvKiBCeXBhc3MgZXh0ZXJuYWwgVHggRklGTy4gKi8KKyNlbmRpZgorCisvKiBTZXQgdGhlIGNvcHkgYnJlYWtwb2ludCBmb3IgdGhlIGNvcHktb25seS10aW55LWZyYW1lcyBzY2hlbWUuCisgICBTZXR0aW5nIHRvID4gMTUxNCBlZmZlY3RpdmVseSBkaXNhYmxlcyB0aGlzIGZlYXR1cmUuICovCitzdGF0aWMgaW50IHJ4X2NvcHlicmVhazsKKworLyogVXNlZCB0byBwYXNzIHRoZSBtZWRpYSB0eXBlLCBldGMuCisgICBObyBtZWRpYSB0eXBlcyBhcmUgY3VycmVudGx5IGRlZmluZWQuICBUaGVzZSBleGlzdCBmb3IgZHJpdmVyCisgICBpbnRlcm9wZXJhYmlsaXR5LgorKi8KKyNkZWZpbmUgTUFYX1VOSVRTIDgJCQkJLyogTW9yZSBhcmUgc3VwcG9ydGVkLCBsaW1pdCBvbmx5IG9uIG9wdGlvbnMgKi8KK3N0YXRpYyBpbnQgb3B0aW9uc1tNQVhfVU5JVFNdID0gey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CitzdGF0aWMgaW50IGZ1bGxfZHVwbGV4W01BWF9VTklUU10gPSB7LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKKworLyogRG8gdWdseSB3b3JrYXJvdW5kIGZvciBHWCBzZXJ2ZXIgY2hpcHNldCBlcnJhdGEuICovCitzdGF0aWMgaW50IGd4X2ZpeDsKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IGFyZSBzZXQgYXQgY29tcGlsZSB0aW1lLiAqLworCisvKiBLZWVwIHRoZSByaW5nIHNpemVzIGEgcG93ZXIgb2YgdHdvIGZvciBlZmZpY2llbmN5LgorICAgTWFraW5nIHRoZSBUeCByaW5nIHRvbyBsb25nIGRlY3JlYXNlcyB0aGUgZWZmZWN0aXZlbmVzcyBvZiBjaGFubmVsCisgICBib25kaW5nIGFuZCBwYWNrZXQgcHJpb3JpdHkuCisgICBUaGVyZSBhcmUgbm8gaWxsIGVmZmVjdHMgZnJvbSB0b28tbGFyZ2UgcmVjZWl2ZSByaW5ncy4gKi8KKyNkZWZpbmUgVFhfUklOR19TSVpFCTE2CisjZGVmaW5lIFRYX1FVRVVFX1NJWkUJMTIJCS8qIE11c3QgYmUgPiA0ICYmIDw9IFRYX1JJTkdfU0laRSAqLworI2RlZmluZSBSWF9SSU5HX1NJWkUJNjQKKyNkZWZpbmUgU1RBVFVTX1RPVEFMX1NJWkUJVFhfUklOR19TSVpFKnNpemVvZihzdHJ1Y3QgdHhfc3RhdHVzX3dvcmRzKQorI2RlZmluZSBUWF9UT1RBTF9TSVpFCQkyKlRYX1JJTkdfU0laRSpzaXplb2Yoc3RydWN0IHllbGxvd2Zpbl9kZXNjKQorI2RlZmluZSBSWF9UT1RBTF9TSVpFCQlSWF9SSU5HX1NJWkUqc2l6ZW9mKHN0cnVjdCB5ZWxsb3dmaW5fZGVzYykKKworLyogT3BlcmF0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHVzdWFsbHkgYXJlIG5vdCBjaGFuZ2VkLiAqLworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAoMipIWikKKyNkZWZpbmUgUEtUX0JVRl9TWgkJMTUzNgkJCS8qIFNpemUgb2YgZWFjaCB0ZW1wb3JhcnkgUnggYnVmZmVyLiovCisKKyNkZWZpbmUgeWVsbG93ZmluX2RlYnVnIGRlYnVnCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgkJLyogUHJvY2Vzc29yIHR5cGUgZm9yIGNhY2hlIGFsaWdubWVudC4gKi8KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qIFRoZXNlIGlkZW50aWZ5IHRoZSBkcml2ZXIgYmFzZSB2ZXJzaW9uIGFuZCBtYXkgbm90IGJlIHJlbW92ZWQuICovCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CitLRVJOX0lORk8gRFJWX05BTUUgIi5jOnYxLjA1ICAxLzA5LzIwMDEgIFdyaXR0ZW4gYnkgRG9uYWxkIEJlY2tlciA8YmVja2VyQHNjeWxkLmNvbT5cbiIKK0tFUk5fSU5GTyAiICBodHRwOi8vd3d3LnNjeWxkLmNvbS9uZXR3b3JrL3llbGxvd2Zpbi5odG1sXG4iCitLRVJOX0lORk8gIiAgKHVub2ZmaWNpYWwgMi40LnggcG9ydCwgIiBEUlZfVkVSU0lPTiAiLCAiIERSVl9SRUxEQVRFICIpXG4iOworCitNT0RVTEVfQVVUSE9SKCJEb25hbGQgQmVja2VyIDxiZWNrZXJAc2N5bGQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQYWNrZXQgRW5naW5lcyBZZWxsb3dmaW4gRy1OSUMgR2lnYWJpdCBFdGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKG1heF9pbnRlcnJ1cHRfd29yaywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShtdHUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ocnhfY29weWJyZWFrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX2FycmF5KG9wdGlvbnMsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZnVsbF9kdXBsZXgsIGludCwgTlVMTCwgMCk7Cittb2R1bGVfcGFyYW0oZ3hfZml4LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtYXhfaW50ZXJydXB0X3dvcmssICJHLU5JQyBtYXhpbXVtIGV2ZW50cyBoYW5kbGVkIHBlciBpbnRlcnJ1cHQiKTsKK01PRFVMRV9QQVJNX0RFU0MobXR1LCAiRy1OSUMgTVRVIChhbGwgYm9hcmRzKSIpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkctTklDIGRlYnVnIGxldmVsICgwLTcpIik7CitNT0RVTEVfUEFSTV9ERVNDKHJ4X2NvcHlicmVhaywgIkctTklDIGNvcHkgYnJlYWtwb2ludCBmb3IgY29weS1vbmx5LXRpbnktZnJhbWVzIik7CitNT0RVTEVfUEFSTV9ERVNDKG9wdGlvbnMsICJHLU5JQzogQml0cyAwLTM6IG1lZGlhIHR5cGUsIGJpdCAxNzogZnVsbCBkdXBsZXgiKTsKK01PRFVMRV9QQVJNX0RFU0MoZnVsbF9kdXBsZXgsICJHLU5JQyBmdWxsIGR1cGxleCBzZXR0aW5nKHMpICgxKSIpOworTU9EVUxFX1BBUk1fREVTQyhneF9maXgsICJHLU5JQzogZW5hYmxlIEdYIHNlcnZlciBjaGlwc2V0IGJ1ZyB3b3JrYXJvdW5kICgwLTEpIik7CisKKy8qCisJCQkJVGhlb3J5IG9mIE9wZXJhdGlvbgorCitJLiBCb2FyZCBDb21wYXRpYmlsaXR5CisKK1RoaXMgZGV2aWNlIGRyaXZlciBpcyBkZXNpZ25lZCBmb3IgdGhlIFBhY2tldCBFbmdpbmVzICJZZWxsb3dmaW4iIEdpZ2FiaXQKK0V0aGVybmV0IGFkYXB0ZXIuICBUaGUgRy1OSUMgNjQtYml0IFBDSSBjYXJkIGlzIHN1cHBvcnRlZCwgYXMgd2VsbCBhcyB0aGUgCitTeW1iaW9zIDUzQzg4NUUgZHVhbCBmdW5jdGlvbiBjaGlwLgorCitJSS4gQm9hcmQtc3BlY2lmaWMgc2V0dGluZ3MKKworUENJIGJ1cyBkZXZpY2VzIGFyZSBjb25maWd1cmVkIGJ5IHRoZSBzeXN0ZW0gYXQgYm9vdCB0aW1lLCBzbyBubyBqdW1wZXJzCituZWVkIHRvIGJlIHNldCBvbiB0aGUgYm9hcmQuICBUaGUgc3lzdGVtIEJJT1MgcHJlZmVyYWJseSBzaG91bGQgYXNzaWduIHRoZQorUENJIElOVEEgc2lnbmFsIHRvIGFuIG90aGVyd2lzZSB1bnVzZWQgc3lzdGVtIElSUSBsaW5lLgorTm90ZTogS2VybmVsIHZlcnNpb25zIGVhcmxpZXIgdGhhbiAxLjMuNzMgZG8gbm90IHN1cHBvcnQgc2hhcmVkIFBDSQoraW50ZXJydXB0IGxpbmVzLgorCitJSUkuIERyaXZlciBvcGVyYXRpb24KKworSUlJYS4gUmluZyBidWZmZXJzCisKK1RoZSBZZWxsb3dmaW4gdXNlcyB0aGUgRGVzY3JpcHRvciBCYXNlZCBETUEgQXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBieSBBcHBsZS4KK1RoaXMgaXMgYSBkZXNjcmlwdG9yIGxpc3Qgc2NoZW1lIHNpbWlsYXIgdG8gdGhhdCB1c2VkIGJ5IHRoZSBFRVBybzEwMCBhbmQKK1R1bGlwLiAgVGhpcyBkcml2ZXIgdXNlcyB0d28gc3RhdGljYWxseSBhbGxvY2F0ZWQgZml4ZWQtc2l6ZSBkZXNjcmlwdG9yIGxpc3RzCitmb3JtZWQgaW50byByaW5ncyBieSBhIGJyYW5jaCBmcm9tIHRoZSBmaW5hbCBkZXNjcmlwdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YKK3RoZSBsaXN0LiAgVGhlIHJpbmcgc2l6ZXMgYXJlIHNldCBhdCBjb21waWxlIHRpbWUgYnkgUlgvVFhfUklOR19TSVpFLgorCitUaGUgZHJpdmVyIGFsbG9jYXRlcyBmdWxsIGZyYW1lIHNpemUgc2tidWZmcyBmb3IgdGhlIFJ4IHJpbmcgYnVmZmVycyBhdAorb3BlbigpIHRpbWUgYW5kIHBhc3NlcyB0aGUgc2tiLT5kYXRhIGZpZWxkIHRvIHRoZSBZZWxsb3dmaW4gYXMgcmVjZWl2ZSBkYXRhCitidWZmZXJzLiAgV2hlbiBhbiBpbmNvbWluZyBmcmFtZSBpcyBsZXNzIHRoYW4gUlhfQ09QWUJSRUFLIGJ5dGVzIGxvbmcsCithIGZyZXNoIHNrYnVmZiBpcyBhbGxvY2F0ZWQgYW5kIHRoZSBmcmFtZSBpcyBjb3BpZWQgdG8gdGhlIG5ldyBza2J1ZmYuCitXaGVuIHRoZSBpbmNvbWluZyBmcmFtZSBpcyBsYXJnZXIsIHRoZSBza2J1ZmYgaXMgcGFzc2VkIGRpcmVjdGx5IHVwIHRoZQorcHJvdG9jb2wgc3RhY2sgYW5kIHJlcGxhY2VkIGJ5IGEgbmV3bHkgYWxsb2NhdGVkIHNrYnVmZi4KKworVGhlIFJYX0NPUFlCUkVBSyB2YWx1ZSBpcyBjaG9zZW4gdG8gdHJhZGUtb2ZmIHRoZSBtZW1vcnkgd2FzdGVkIGJ5Cit1c2luZyBhIGZ1bGwtc2l6ZWQgc2tidWZmIGZvciBzbWFsbCBmcmFtZXMgdnMuIHRoZSBjb3B5aW5nIGNvc3RzIG9mIGxhcmdlcgorZnJhbWVzLiAgRm9yIHNtYWxsIGZyYW1lcyB0aGUgY29weWluZyBjb3N0IGlzIG5lZ2xpZ2libGUgKGVzcC4gY29uc2lkZXJpbmcKK3RoYXQgd2UgYXJlIHByZS1sb2FkaW5nIHRoZSBjYWNoZSB3aXRoIGltbWVkaWF0ZWx5IHVzZWZ1bCBoZWFkZXIKK2luZm9ybWF0aW9uKS4gIEZvciBsYXJnZSBmcmFtZXMgdGhlIGNvcHlpbmcgY29zdCBpcyBub24tdHJpdmlhbCwgYW5kIHRoZQorbGFyZ2VyIGNvcHkgbWlnaHQgZmx1c2ggdGhlIGNhY2hlIG9mIHVzZWZ1bCBkYXRhLgorCitJSUlDLiBTeW5jaHJvbml6YXRpb24KKworVGhlIGRyaXZlciBydW5zIGFzIHR3byBpbmRlcGVuZGVudCwgc2luZ2xlLXRocmVhZGVkIGZsb3dzIG9mIGNvbnRyb2wuICBPbmUKK2lzIHRoZSBzZW5kLXBhY2tldCByb3V0aW5lLCB3aGljaCBlbmZvcmNlcyBzaW5nbGUtdGhyZWFkZWQgdXNlIGJ5IHRoZQorZGV2LT50YnVzeSBmbGFnLiAgVGhlIG90aGVyIHRocmVhZCBpcyB0aGUgaW50ZXJydXB0IGhhbmRsZXIsIHdoaWNoIGlzIHNpbmdsZQordGhyZWFkZWQgYnkgdGhlIGhhcmR3YXJlIGFuZCBvdGhlciBzb2Z0d2FyZS4KKworVGhlIHNlbmQgcGFja2V0IHRocmVhZCBoYXMgcGFydGlhbCBjb250cm9sIG92ZXIgdGhlIFR4IHJpbmcgYW5kICdkZXYtPnRidXN5JworZmxhZy4gIEl0IHNldHMgdGhlIHRidXN5IGZsYWcgd2hlbmV2ZXIgaXQncyBxdWV1aW5nIGEgVHggcGFja2V0LiBJZiB0aGUgbmV4dAorcXVldWUgc2xvdCBpcyBlbXB0eSwgaXQgY2xlYXJzIHRoZSB0YnVzeSBmbGFnIHdoZW4gZmluaXNoZWQgb3RoZXJ3aXNlIGl0IHNldHMKK3RoZSAneXAtPnR4X2Z1bGwnIGZsYWcuCisKK1RoZSBpbnRlcnJ1cHQgaGFuZGxlciBoYXMgZXhjbHVzaXZlIGNvbnRyb2wgb3ZlciB0aGUgUnggcmluZyBhbmQgcmVjb3JkcyBzdGF0cworZnJvbSB0aGUgVHggcmluZy4gIEFmdGVyIHJlYXBpbmcgdGhlIHN0YXRzLCBpdCBtYXJrcyB0aGUgVHggcXVldWUgZW50cnkgYXMKK2VtcHR5IGJ5IGluY3JlbWVudGluZyB0aGUgZGlydHlfdHggbWFyay4gSWZmIHRoZSAneXAtPnR4X2Z1bGwnIGZsYWcgaXMgc2V0LCBpdAorY2xlYXJzIGJvdGggdGhlIHR4X2Z1bGwgYW5kIHRidXN5IGZsYWdzLgorCitJVi4gTm90ZXMKKworVGhhbmtzIHRvIEtpbSBTdGVhcm5zIG9mIFBhY2tldCBFbmdpbmVzIGZvciBwcm92aWRpbmcgYSBwYWlyIG9mIEctTklDIGJvYXJkcy4KK1RoYW5rcyB0byBCcnVjZSBGYXVzdCBvZiBEaWdpdGFsc2NhcGUgZm9yIHByb3ZpZGluZyBib3RoIHRoZWlyIFNZTTUzQzg4NSBib2FyZAorYW5kIGFuIEFscGhhU3RhdGlvbiB0byB2ZXJpZnR5IHRoZSBBbHBoYSBwb3J0IQorCitJVmIuIFJlZmVyZW5jZXMKKworWWVsbG93ZmluIEVuZ2luZWVyaW5nIERlc2lnbiBTcGVjaWZpY2F0aW9uLCA0LzIzLzk3IFByZWxpbWluYXJ5L0NvbmZpZGVudGlhbAorU3ltYmlvcyBTWU01M0M4ODUgUENJLVNDU0kvRmFzdCBFdGhlcm5ldCBNdWx0aWZ1bmN0aW9uIENvbnRyb2xsZXIgUHJlbGltaW5hcnkKKyAgIERhdGEgTWFudWFsIHYzLjAKK2h0dHA6Ly9jZXNkaXMuZ3NmYy5uYXNhLmdvdi9saW51eC9taXNjL05XYXkuaHRtbAoraHR0cDovL2Nlc2Rpcy5nc2ZjLm5hc2EuZ292L2xpbnV4L21pc2MvMTAwbWJwcy5odG1sCisKK0lWYy4gRXJyYXRhCisKK1NlZSBQYWNrZXQgRW5naW5lcyBjb25maWRlbnRpYWwgYXBwZW5kaXggKHByb3RvdHlwZSBjaGlwcyBvbmx5KS4KKyovCisKKwwKKworZW51bSBwY2lfaWRfZmxhZ3NfYml0cyB7CisJLyogU2V0IFBDSSBjb21tYW5kIHJlZ2lzdGVyIGJpdHMgYmVmb3JlIGNhbGxpbmcgcHJvYmUxKCkuICovCisJUENJX1VTRVNfSU89MSwgUENJX1VTRVNfTUVNPTIsIFBDSV9VU0VTX01BU1RFUj00LAorCS8qIFJlYWQgYW5kIG1hcCB0aGUgc2luZ2xlIGZvbGxvd2luZyBQQ0kgQkFSLiAqLworCVBDSV9BRERSMD0wPDw0LCBQQ0lfQUREUjE9MTw8NCwgUENJX0FERFIyPTI8PDQsIFBDSV9BRERSMz0zPDw0LAorCVBDSV9BRERSXzY0QklUUz0weDEwMCwgUENJX05PX0FDUElfV0FLRT0weDIwMCwgUENJX05PX01JTl9MQVRFTkNZPTB4NDAwLAorCVBDSV9VTlVTRURfSVJRPTB4ODAwLAorfTsKK2VudW0gY2FwYWJpbGl0eV9mbGFncyB7CisJSGFzTUlJPTEsIEZ1bGxUeFN0YXR1cz0yLCBJc0dpZ2FiaXQ9NCwgSGFzTXVsdGljYXN0QnVnPTgsIEZ1bGxSeFN0YXR1cz0xNiwKKwlIYXNNQUNBZGRyQnVnPTMyLCAvKiBPbmx5IG9uIGVhcmx5IHJldnMuICAqLworCURvbnRVc2VFZXByb209NjQsIC8qIERvbid0IHJlYWQgdGhlIE1BQyBmcm9tIHRoZSBFRVBST20uICovCit9OworLyogVGhlIFBDSSBJL08gc3BhY2UgZXh0ZW50LiAqLworI2RlZmluZSBZRUxMT1dGSU5fU0laRSAweDEwMAorI2lmZGVmIFVTRV9JT19PUFMKKyNkZWZpbmUgUENJX0lPVFlQRSAoUENJX1VTRVNfTUFTVEVSIHwgUENJX1VTRVNfSU8gIHwgUENJX0FERFIwKQorI2Vsc2UKKyNkZWZpbmUgUENJX0lPVFlQRSAoUENJX1VTRVNfTUFTVEVSIHwgUENJX1VTRVNfTUVNIHwgUENJX0FERFIxKQorI2VuZGlmCisKK3N0cnVjdCBwY2lfaWRfaW5mbyB7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICAgIHN0cnVjdCBtYXRjaF9pbmZvIHsKKyAgICAgICAgICAgICAgICBpbnQgICAgIHBjaSwgcGNpX21hc2ssIHN1YnN5c3RlbSwgc3Vic3lzdGVtX21hc2s7CisgICAgICAgICAgICAgICAgaW50IHJldmlzaW9uLCByZXZpc2lvbl9tYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPbmx5IDggYml0cy4gKi8KKyAgICAgICAgfSBpZDsKKyAgICAgICAgZW51bSBwY2lfaWRfZmxhZ3NfYml0cyBwY2lfZmxhZ3M7CisgICAgICAgIGludCBpb19zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZWVkZWQgZm9yIEkvTyByZWdpb24gY2hlY2sgb3IgaW9yZW1hcCgpLiAqLworICAgICAgICBpbnQgZHJ2X2ZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRHJpdmVyIHVzZSwgaW50ZW5kZWQgYXMgY2FwYWJpbGl0eSBmbGFncy4gKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2lkX2luZm8gcGNpX2lkX3RibFtdID0geworCXsiWWVsbG93ZmluIEctTklDIEdpZ2FiaXQgRXRoZXJuZXQiLCB7IDB4MDcwMjEwMDAsIDB4ZmZmZmZmZmZ9LAorCSBQQ0lfSU9UWVBFLCBZRUxMT1dGSU5fU0laRSwKKwkgRnVsbFR4U3RhdHVzIHwgSXNHaWdhYml0IHwgSGFzTXVsdGljYXN0QnVnIHwgSGFzTUFDQWRkckJ1ZyB8IERvbnRVc2VFZXByb219LAorCXsiU3ltYmlvcyBTWU04M0M4ODUiLCB7IDB4MDcwMTEwMDAsIDB4ZmZmZmZmZmZ9LAorCSBQQ0lfSU9UWVBFLCBZRUxMT1dGSU5fU0laRSwgSGFzTUlJIHwgRG9udFVzZUVlcHJvbSB9LAorCXtOVUxMLH0sCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgeWVsbG93ZmluX3BjaV90YmxbXSA9IHsKKwl7IDB4MTAwMCwgMHgwNzAyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sCisJeyAweDEwMDAsIDB4MDcwMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMSB9LAorCXsgMCwgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgeWVsbG93ZmluX3BjaV90YmwpOworCisKKy8qIE9mZnNldHMgdG8gdGhlIFllbGxvd2ZpbiByZWdpc3RlcnMuICBWYXJpb3VzIHNpemVzIGFuZCBhbGlnbm1lbnRzLiAqLworZW51bSB5ZWxsb3dmaW5fb2Zmc2V0cyB7CisJVHhDdHJsPTB4MDAsIFR4U3RhdHVzPTB4MDQsIFR4UHRyPTB4MEMsCisJVHhJbnRyU2VsPTB4MTAsIFR4QnJhbmNoU2VsPTB4MTQsIFR4V2FpdFNlbD0weDE4LAorCVJ4Q3RybD0weDQwLCBSeFN0YXR1cz0weDQ0LCBSeFB0cj0weDRDLAorCVJ4SW50clNlbD0weDUwLCBSeEJyYW5jaFNlbD0weDU0LCBSeFdhaXRTZWw9MHg1OCwKKwlFdmVudFN0YXR1cz0weDgwLCBJbnRyRW5iPTB4ODIsIEludHJDbGVhcj0weDg0LCBJbnRyU3RhdHVzPTB4ODYsCisJQ2hpcFJldj0weDhDLCBETUFDdHJsPTB4OTAsIFR4VGhyZXNob2xkPTB4OTQsCisJQ25mZz0weEEwLCBGcmFtZUdhcDA9MHhBMiwgRnJhbWVHYXAxPTB4QTQsCisJTUlJX0NtZD0weEE2LCBNSUlfQWRkcj0weEE4LCBNSUlfV3JfRGF0YT0weEFBLCBNSUlfUmRfRGF0YT0weEFDLAorCU1JSV9TdGF0dXM9MHhBRSwKKwlSeERlcHRoPTB4QjgsIEZsb3dDdHJsPTB4QkMsCisJQWRkck1vZGU9MHhEMCwgU3RuQWRkcj0weEQyLCBIYXNoVGJsPTB4RDgsIEZJRk9jZmc9MHhGOCwKKwlFRVN0YXR1cz0weEYwLCBFRUN0cmw9MHhGMSwgRUVBZGRyPTB4RjIsIEVFUmVhZD0weEYzLCBFRVdyaXRlPTB4RjQsCisJRUVGZWF0dXJlPTB4RjUsCit9OworCisvKiBUaGUgWWVsbG93ZmluIFJ4IGFuZCBUeCBidWZmZXIgZGVzY3JpcHRvcnMuCisgICBFbGVtZW50cyBhcmUgd3JpdHRlbiBhcyAzMiBiaXQgZm9yIGVuZGlhbiBwb3J0YWJpbGl0eS4gKi8KK3N0cnVjdCB5ZWxsb3dmaW5fZGVzYyB7CisJdTMyIGRiZG1hX2NtZDsKKwl1MzIgYWRkcjsKKwl1MzIgYnJhbmNoX2FkZHI7CisJdTMyIHJlc3VsdF9zdGF0dXM7Cit9OworCitzdHJ1Y3QgdHhfc3RhdHVzX3dvcmRzIHsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwl1MTYgdHhfZXJyczsKKwl1MTYgdHhfY250OworCXUxNiBwYXVzZWQ7CisJdTE2IHRvdGFsX3R4X2NudDsKKyNlbHNlICAvKiBMaXR0bGUgZW5kaWFuIGNoaXBzLiAqLworCXUxNiB0eF9jbnQ7CisJdTE2IHR4X2VycnM7CisJdTE2IHRvdGFsX3R4X2NudDsKKwl1MTYgcGF1c2VkOworI2VuZGlmIC8qIF9fQklHX0VORElBTiAqLworfTsKKworLyogQml0cyBpbiB5ZWxsb3dmaW5fZGVzYy5jbWQgKi8KK2VudW0gZGVzY19jbWRfYml0cyB7CisJQ01EX1RYX1BLVD0weDEwMDAwMDAwLCBDTURfUlhfQlVGPTB4MjAwMDAwMDAsIENNRF9UWFNUQVRVUz0weDMwMDAwMDAwLAorCUNNRF9OT1A9MHg2MDAwMDAwMCwgQ01EX1NUT1A9MHg3MDAwMDAwMCwKKwlCUkFOQ0hfQUxXQVlTPTB4MEMwMDAwLCBJTlRSX0FMV0FZUz0weDMwMDAwMCwgV0FJVF9BTFdBWVM9MHgwMzAwMDAsCisJQlJBTkNIX0lGVFJVRT0weDA0MDAwMCwKK307CisKKy8qIEJpdHMgaW4geWVsbG93ZmluX2Rlc2Muc3RhdHVzICovCitlbnVtIGRlc2Nfc3RhdHVzX2JpdHMgeyBSWF9FT1A9MHgwMDQwLCB9OworCisvKiBCaXRzIGluIHRoZSBpbnRlcnJ1cHQgc3RhdHVzL21hc2sgcmVnaXN0ZXJzLiAqLworZW51bSBpbnRyX3N0YXR1c19iaXRzIHsKKwlJbnRyUnhEb25lPTB4MDEsIEludHJSeEludmFsaWQ9MHgwMiwgSW50clJ4UENJRmF1bHQ9MHgwNCxJbnRyUnhQQ0lFcnI9MHgwOCwKKwlJbnRyVHhEb25lPTB4MTAsIEludHJUeEludmFsaWQ9MHgyMCwgSW50clR4UENJRmF1bHQ9MHg0MCxJbnRyVHhQQ0lFcnI9MHg4MCwKKwlJbnRyRWFybHlSeD0weDEwMCwgSW50cldha2V1cD0weDIwMCwgfTsKKworI2RlZmluZSBQUklWX0FMSUdOCTMxIAkvKiBSZXF1aXJlZCBhbGlnbm1lbnQgbWFzayAqLworI2RlZmluZSBNSUlfQ05UCQk0CitzdHJ1Y3QgeWVsbG93ZmluX3ByaXZhdGUgeworCS8qIERlc2NyaXB0b3IgcmluZ3MgZmlyc3QgZm9yIGFsaWdubWVudC4KKwkgICBUeCByZXF1aXJlcyBhIHNlY29uZCBkZXNjcmlwdG9yIGZvciBzdGF0dXMuICovCisJc3RydWN0IHllbGxvd2Zpbl9kZXNjICpyeF9yaW5nOworCXN0cnVjdCB5ZWxsb3dmaW5fZGVzYyAqdHhfcmluZzsKKwlzdHJ1Y3Qgc2tfYnVmZiogcnhfc2tidWZmW1JYX1JJTkdfU0laRV07CisJc3RydWN0IHNrX2J1ZmYqIHR4X3NrYnVmZltUWF9SSU5HX1NJWkVdOworCWRtYV9hZGRyX3QgcnhfcmluZ19kbWE7CisJZG1hX2FkZHJfdCB0eF9yaW5nX2RtYTsKKworCXN0cnVjdCB0eF9zdGF0dXNfd29yZHMgKnR4X3N0YXR1czsKKwlkbWFfYWRkcl90IHR4X3N0YXR1c19kbWE7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsJLyogTWVkaWEgc2VsZWN0aW9uIHRpbWVyLiAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCS8qIEZyZXF1ZW50bHkgdXNlZCBhbmQgcGFpcmVkIHZhbHVlOiBrZWVwIGFkamFjZW50IGZvciBjYWNoZSBlZmZlY3QuICovCisJaW50IGNoaXBfaWQsIGRydl9mbGFnczsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKwl1bnNpZ25lZCBpbnQgY3VyX3J4LCBkaXJ0eV9yeDsJCS8qIFByb2R1Y2VyL2NvbnN1bWVyIHJpbmcgaW5kaWNlcyAqLworCXVuc2lnbmVkIGludCByeF9idWZfc3o7CQkJCS8qIEJhc2VkIG9uIE1UVStzbGFjay4gKi8KKwlzdHJ1Y3QgdHhfc3RhdHVzX3dvcmRzICp0eF90YWlsX2Rlc2M7CisJdW5zaWduZWQgaW50IGN1cl90eCwgZGlydHlfdHg7CisJaW50IHR4X3RocmVzaG9sZDsKKwl1bnNpZ25lZCBpbnQgdHhfZnVsbDoxOwkJCQkvKiBUaGUgVHggcXVldWUgaXMgZnVsbC4gKi8KKwl1bnNpZ25lZCBpbnQgZnVsbF9kdXBsZXg6MTsJCQkvKiBGdWxsLWR1cGxleCBvcGVyYXRpb24gcmVxdWVzdGVkLiAqLworCXVuc2lnbmVkIGludCBkdXBsZXhfbG9jazoxOworCXVuc2lnbmVkIGludCBtZWRpYWxvY2s6MTsJCQkvKiBEbyBub3Qgc2Vuc2UgbWVkaWEuICovCisJdW5zaWduZWQgaW50IGRlZmF1bHRfcG9ydDo0OwkJLyogTGFzdCBkZXYtPmlmX3BvcnQgdmFsdWUuICovCisJLyogTUlJIHRyYW5zY2VpdmVyIHNlY3Rpb24uICovCisJaW50IG1paV9jbnQ7CQkJCQkJLyogTUlJIGRldmljZSBhZGRyZXNzZXMuICovCisJdTE2IGFkdmVydGlzaW5nOwkJCQkJLyogTldheSBtZWRpYSBhZHZlcnRpc2VtZW50ICovCisJdW5zaWduZWQgY2hhciBwaHlzW01JSV9DTlRdOwkJLyogTUlJIGRldmljZSBhZGRyZXNzZXMsIG9ubHkgZmlyc3Qgb25lIHVzZWQgKi8KKwlzcGlubG9ja190IGxvY2s7CisJdm9pZCBfX2lvbWVtICpiYXNlOworfTsKKworc3RhdGljIGludCByZWFkX2VlcHJvbSh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IGxvY2F0aW9uKTsKK3N0YXRpYyBpbnQgbWRpb19yZWFkKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24pOworc3RhdGljIHZvaWQgbWRpb193cml0ZSh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uLCBpbnQgdmFsdWUpOworc3RhdGljIGludCBuZXRkZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CitzdGF0aWMgaW50IHllbGxvd2Zpbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgeWVsbG93ZmluX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCB5ZWxsb3dmaW5fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHllbGxvd2Zpbl9pbml0X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50IHllbGxvd2Zpbl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGlycXJldHVybl90IHllbGxvd2Zpbl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaW50IHllbGxvd2Zpbl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHllbGxvd2Zpbl9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW50cl9zdGF0dXMpOworc3RhdGljIGludCB5ZWxsb3dmaW5fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnllbGxvd2Zpbl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHM7CisKKworc3RhdGljIGludCBfX2RldmluaXQgeWVsbG93ZmluX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHllbGxvd2Zpbl9wcml2YXRlICpucDsKKwlpbnQgaXJxOworCWludCBjaGlwX2lkeCA9IGVudC0+ZHJpdmVyX2RhdGE7CisJc3RhdGljIGludCBmaW5kX2NudDsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwlpbnQgaSwgb3B0aW9uID0gZmluZF9jbnQgPCBNQVhfVU5JVFMgPyBvcHRpb25zW2ZpbmRfY250XSA6IDA7CisJaW50IGRydl9mbGFncyA9IHBjaV9pZF90YmxbY2hpcF9pZHhdLmRydl9mbGFnczsKKyAgICAgICAgdm9pZCAqcmluZ19zcGFjZTsKKyAgICAgICAgZG1hX2FkZHJfdCByaW5nX2RtYTsKKyNpZmRlZiBVU0VfSU9fT1BTCisJaW50IGJhciA9IDA7CisjZWxzZQorCWludCBiYXIgPSAxOworI2VuZGlmCisJCisvKiB3aGVuIGJ1aWx0IGludG8gdGhlIGtlcm5lbCwgd2Ugb25seSBwcmludCB2ZXJzaW9uIGlmIGRldmljZSBpcyBmb3VuZCAqLworI2lmbmRlZiBNT0RVTEUKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKworCWkgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoaSkgcmV0dXJuIGk7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKm5wKSk7CisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNhbm5vdCBhbGxvY2F0ZSBldGhlcm5ldCBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwlucCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSkpCisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKworCXBjaV9zZXRfbWFzdGVyIChwZGV2KTsKKworCWlvYWRkciA9IHBjaV9pb21hcChwZGV2LCBiYXIsIFlFTExPV0ZJTl9TSVpFKTsKKwlpZiAoIWlvYWRkcikKKwkJZ290byBlcnJfb3V0X2ZyZWVfcmVzOworCisJaXJxID0gcGRldi0+aXJxOworCisJaWYgKGRydl9mbGFncyAmIERvbnRVc2VFZXByb20pCisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlkZXYtPmRldl9hZGRyW2ldID0gaW9yZWFkOChpb2FkZHIgKyBTdG5BZGRyICsgaSk7CisJZWxzZSB7CisJCWludCBlZV9vZmZzZXQgPSAocmVhZF9lZXByb20oaW9hZGRyLCA2KSA9PSAweGZmID8gMHgxMDAgOiAwKTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCWRldi0+ZGV2X2FkZHJbaV0gPSByZWFkX2VlcHJvbShpb2FkZHIsIGVlX29mZnNldCArIGkpOworCX0KKworCS8qIFJlc2V0IHRoZSBjaGlwLiAqLworCWlvd3JpdGUzMigweDgwMDAwMDAwLCBpb2FkZHIgKyBETUFDdHJsKTsKKworCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpaW9hZGRyOworCWRldi0+aXJxID0gaXJxOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJc3Bpbl9sb2NrX2luaXQoJm5wLT5sb2NrKTsKKworCW5wLT5wY2lfZGV2ID0gcGRldjsKKwlucC0+Y2hpcF9pZCA9IGNoaXBfaWR4OworCW5wLT5kcnZfZmxhZ3MgPSBkcnZfZmxhZ3M7CisJbnAtPmJhc2UgPSBpb2FkZHI7CisKKwlyaW5nX3NwYWNlID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgVFhfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKKwlpZiAoIXJpbmdfc3BhY2UpCisJCWdvdG8gZXJyX291dF9jbGVhcmRldjsKKwlucC0+dHhfcmluZyA9IChzdHJ1Y3QgeWVsbG93ZmluX2Rlc2MgKilyaW5nX3NwYWNlOworCW5wLT50eF9yaW5nX2RtYSA9IHJpbmdfZG1hOworCisJcmluZ19zcGFjZSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIFJYX1RPVEFMX1NJWkUsICZyaW5nX2RtYSk7CisJaWYgKCFyaW5nX3NwYWNlKQorCQlnb3RvIGVycl9vdXRfdW5tYXBfdHg7CisJbnAtPnJ4X3JpbmcgPSAoc3RydWN0IHllbGxvd2Zpbl9kZXNjICopcmluZ19zcGFjZTsKKwlucC0+cnhfcmluZ19kbWEgPSByaW5nX2RtYTsKKworCXJpbmdfc3BhY2UgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBTVEFUVVNfVE9UQUxfU0laRSwgJnJpbmdfZG1hKTsKKwlpZiAoIXJpbmdfc3BhY2UpCisJCWdvdG8gZXJyX291dF91bm1hcF9yeDsKKwlucC0+dHhfc3RhdHVzID0gKHN0cnVjdCB0eF9zdGF0dXNfd29yZHMgKilyaW5nX3NwYWNlOworCW5wLT50eF9zdGF0dXNfZG1hID0gcmluZ19kbWE7CisKKwlpZiAoZGV2LT5tZW1fc3RhcnQpCisJCW9wdGlvbiA9IGRldi0+bWVtX3N0YXJ0OworCisJLyogVGhlIGxvd2VyIGZvdXIgYml0cyBhcmUgdGhlIG1lZGlhIHR5cGUuICovCisJaWYgKG9wdGlvbiA+IDApIHsKKwkJaWYgKG9wdGlvbiAmIDB4MjAwKQorCQkJbnAtPmZ1bGxfZHVwbGV4ID0gMTsKKwkJbnAtPmRlZmF1bHRfcG9ydCA9IG9wdGlvbiAmIDE1OworCQlpZiAobnAtPmRlZmF1bHRfcG9ydCkKKwkJCW5wLT5tZWRpYWxvY2sgPSAxOworCX0KKwlpZiAoZmluZF9jbnQgPCBNQVhfVU5JVFMgICYmICBmdWxsX2R1cGxleFtmaW5kX2NudF0gPiAwKQorCQlucC0+ZnVsbF9kdXBsZXggPSAxOworCisJaWYgKG5wLT5mdWxsX2R1cGxleCkKKwkJbnAtPmR1cGxleF9sb2NrID0gMTsKKworCS8qIFRoZSBZZWxsb3dmaW4tc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSAmeWVsbG93ZmluX29wZW47CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmeWVsbG93ZmluX3N0YXJ0X3htaXQ7CisJZGV2LT5zdG9wID0gJnllbGxvd2Zpbl9jbG9zZTsKKwlkZXYtPmdldF9zdGF0cyA9ICZ5ZWxsb3dmaW5fZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnNldF9yeF9tb2RlOworCWRldi0+ZG9faW9jdGwgPSAmbmV0ZGV2X2lvY3RsOworCVNFVF9FVEhUT09MX09QUyhkZXYsICZldGh0b29sX29wcyk7CisJZGV2LT50eF90aW1lb3V0ID0geWVsbG93ZmluX3R4X3RpbWVvdXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisKKwlpZiAobXR1KQorCQlkZXYtPm10dSA9IG10dTsKKworCWkgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoaSkKKwkJZ290byBlcnJfb3V0X3VubWFwX3N0YXR1czsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyB0eXBlICU4eCBhdCAlcCwgIiwKKwkJICAgZGV2LT5uYW1lLCBwY2lfaWRfdGJsW2NoaXBfaWR4XS5uYW1lLAorCQkgICBpb3JlYWQzMihpb2FkZHIgKyBDaGlwUmV2KSwgaW9hZGRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQkJcHJpbnRrKCIlMi4yeDoiLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlwcmludGsoIiUyLjJ4LCBJUlEgJWQuXG4iLCBkZXYtPmRldl9hZGRyW2ldLCBpcnEpOworCisJaWYgKG5wLT5kcnZfZmxhZ3MgJiBIYXNNSUkpIHsKKwkJaW50IHBoeSwgcGh5X2lkeCA9IDA7CisJCWZvciAocGh5ID0gMDsgcGh5IDwgMzIgJiYgcGh5X2lkeCA8IE1JSV9DTlQ7IHBoeSsrKSB7CisJCQlpbnQgbWlpX3N0YXR1cyA9IG1kaW9fcmVhZChpb2FkZHIsIHBoeSwgMSk7CisJCQlpZiAobWlpX3N0YXR1cyAhPSAweGZmZmYgICYmICBtaWlfc3RhdHVzICE9IDB4MDAwMCkgeworCQkJCW5wLT5waHlzW3BoeV9pZHgrK10gPSBwaHk7CisJCQkJbnAtPmFkdmVydGlzaW5nID0gbWRpb19yZWFkKGlvYWRkciwgcGh5LCA0KTsKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTUlJIFBIWSBmb3VuZCBhdCBhZGRyZXNzICVkLCBzdGF0dXMgIgorCQkJCQkgICAiMHglNC40eCBhZHZlcnRpc2luZyAlNC40eC5cbiIsCisJCQkJCSAgIGRldi0+bmFtZSwgcGh5LCBtaWlfc3RhdHVzLCBucC0+YWR2ZXJ0aXNpbmcpOworCQkJfQorCQl9CisJCW5wLT5taWlfY250ID0gcGh5X2lkeDsKKwl9CisKKwlmaW5kX2NudCsrOworCQorCXJldHVybiAwOworCitlcnJfb3V0X3VubWFwX3N0YXR1czoKKyAgICAgICAgcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBTVEFUVVNfVE9UQUxfU0laRSwgbnAtPnR4X3N0YXR1cywgCisJCW5wLT50eF9zdGF0dXNfZG1hKTsKK2Vycl9vdXRfdW5tYXBfcng6CisgICAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgUlhfVE9UQUxfU0laRSwgbnAtPnJ4X3JpbmcsIG5wLT5yeF9yaW5nX2RtYSk7CitlcnJfb3V0X3VubWFwX3R4OgorICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFRYX1RPVEFMX1NJWkUsIG5wLT50eF9yaW5nLCBucC0+dHhfcmluZ19kbWEpOworZXJyX291dF9jbGVhcmRldjoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcGNpX2lvdW5tYXAocGRldiwgaW9hZGRyKTsKK2Vycl9vdXRfZnJlZV9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXRfZnJlZV9uZXRkZXY6CisJZnJlZV9uZXRkZXYgKGRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJlYWRfZWVwcm9tKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgbG9jYXRpb24pCit7CisJaW50IGJvZ3VzX2NudCA9IDEwMDAwOwkJLyogVHlwaWNhbCAzM01oejogMTA1MCB0aWNrcyAqLworCisJaW93cml0ZTgobG9jYXRpb24sIGlvYWRkciArIEVFQWRkcik7CisJaW93cml0ZTgoMHgzMCB8ICgobG9jYXRpb24gPj4gOCkgJiA3KSwgaW9hZGRyICsgRUVDdHJsKTsKKwl3aGlsZSAoKGlvcmVhZDgoaW9hZGRyICsgRUVTdGF0dXMpICYgMHg4MCkgICYmICAtLWJvZ3VzX2NudCA+IDApCisJCTsKKwlyZXR1cm4gaW9yZWFkOChpb2FkZHIgKyBFRVJlYWQpOworfQorCisvKiBNSUkgTWFuYWdlbWVuIERhdGEgSS9PIGFjY2Vzc2VzLgorICAgVGhlc2Ugcm91dGluZXMgYXNzdW1lIHRoZSBNRElPIGNvbnRyb2xsZXIgaXMgaWRsZSwgYW5kIGRvIG5vdCBleGl0IHVudGlsCisgICB0aGUgY29tbWFuZCBpcyBmaW5pc2hlZC4gKi8KKworc3RhdGljIGludCBtZGlvX3JlYWQodm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBwaHlfaWQsIGludCBsb2NhdGlvbikKK3sKKwlpbnQgaTsKKworCWlvd3JpdGUxNigocGh5X2lkPDw4KSArIGxvY2F0aW9uLCBpb2FkZHIgKyBNSUlfQWRkcik7CisJaW93cml0ZTE2KDEsIGlvYWRkciArIE1JSV9DbWQpOworCWZvciAoaSA9IDEwMDAwOyBpID49IDA7IGktLSkKKwkJaWYgKChpb3JlYWQxNihpb2FkZHIgKyBNSUlfU3RhdHVzKSAmIDEpID09IDApCisJCQlicmVhazsKKwlyZXR1cm4gaW9yZWFkMTYoaW9hZGRyICsgTUlJX1JkX0RhdGEpOworfQorCitzdGF0aWMgdm9pZCBtZGlvX3dyaXRlKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgcGh5X2lkLCBpbnQgbG9jYXRpb24sIGludCB2YWx1ZSkKK3sKKwlpbnQgaTsKKworCWlvd3JpdGUxNigocGh5X2lkPDw4KSArIGxvY2F0aW9uLCBpb2FkZHIgKyBNSUlfQWRkcik7CisJaW93cml0ZTE2KHZhbHVlLCBpb2FkZHIgKyBNSUlfV3JfRGF0YSk7CisKKwkvKiBXYWl0IGZvciB0aGUgY29tbWFuZCB0byBmaW5pc2guICovCisJZm9yIChpID0gMTAwMDA7IGkgPj0gMDsgaS0tKQorCQlpZiAoKGlvcmVhZDE2KGlvYWRkciArIE1JSV9TdGF0dXMpICYgMSkgPT0gMCkKKwkJCWJyZWFrOworCXJldHVybjsKK30KKworDAorc3RhdGljIGludCB5ZWxsb3dmaW5fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB5ZWxsb3dmaW5fcHJpdmF0ZSAqeXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0geXAtPmJhc2U7CisJaW50IGk7CisKKwkvKiBSZXNldCB0aGUgY2hpcC4gKi8KKwlpb3dyaXRlMzIoMHg4MDAwMDAwMCwgaW9hZGRyICsgRE1BQ3RybCk7CisKKwlpID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZ5ZWxsb3dmaW5faW50ZXJydXB0LCBTQV9TSElSUSwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChpKSByZXR1cm4gaTsKKworCWlmICh5ZWxsb3dmaW5fZGVidWcgPiAxKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHllbGxvd2Zpbl9vcGVuKCkgaXJxICVkLlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgZGV2LT5pcnEpOworCisJeWVsbG93ZmluX2luaXRfcmluZyhkZXYpOworCisJaW93cml0ZTMyKHlwLT5yeF9yaW5nX2RtYSwgaW9hZGRyICsgUnhQdHIpOworCWlvd3JpdGUzMih5cC0+dHhfcmluZ19kbWEsIGlvYWRkciArIFR4UHRyKTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWlvd3JpdGU4KGRldi0+ZGV2X2FkZHJbaV0sIGlvYWRkciArIFN0bkFkZHIgKyBpKTsKKworCS8qIFNldCB1cCB2YXJpb3VzIGNvbmRpdGlvbiAnc2VsZWN0JyByZWdpc3RlcnMuCisJICAgVGhlcmUgYXJlIG5vIG9wdGlvbnMgaGVyZS4gKi8KKwlpb3dyaXRlMzIoMHgwMDgwMDA4MCwgaW9hZGRyICsgVHhJbnRyU2VsKTsgCS8qIEludGVycnVwdCBvbiBUeCBhYm9ydCAqLworCWlvd3JpdGUzMigweDAwODAwMDgwLCBpb2FkZHIgKyBUeEJyYW5jaFNlbCk7CS8qIEJyYW5jaCBvbiBUeCBhYm9ydCAqLworCWlvd3JpdGUzMigweDAwNDAwMDQwLCBpb2FkZHIgKyBUeFdhaXRTZWwpOyAJLyogV2FpdCBvbiBUeCBzdGF0dXMgKi8KKwlpb3dyaXRlMzIoMHgwMDQwMDA0MCwgaW9hZGRyICsgUnhJbnRyU2VsKTsJLyogSW50ZXJydXB0IG9uIFJ4IGRvbmUgKi8KKwlpb3dyaXRlMzIoMHgwMDQwMDA0MCwgaW9hZGRyICsgUnhCcmFuY2hTZWwpOwkvKiBCcmFuY2ggb24gUnggZXJyb3IgKi8KKwlpb3dyaXRlMzIoMHgwMDQwMDA0MCwgaW9hZGRyICsgUnhXYWl0U2VsKTsJLyogV2FpdCBvbiBSeCBkb25lICovCisKKwkvKiBJbml0aWFsaXplIG90aGVyIHJlZ2lzdGVyczogd2l0aCBzbyBtYW55IHRoaXMgZXZlbnR1YWxseSB0aGlzIHdpbGwKKwkgICBjb252ZXJ0ZWQgdG8gYW4gb2Zmc2V0L3ZhbHVlIGxpc3QuICovCisJaW93cml0ZTMyKGRtYV9jdHJsLCBpb2FkZHIgKyBETUFDdHJsKTsKKwlpb3dyaXRlMTYoZmlmb19jZmcsIGlvYWRkciArIEZJRk9jZmcpOworCS8qIEVuYWJsZSBhdXRvbWF0aWMgZ2VuZXJhdGlvbiBvZiBmbG93IGNvbnRyb2wgZnJhbWVzLCBwZXJpb2QgMHhmZmZmLiAqLworCWlvd3JpdGUzMigweDAwMzBGRkZGLCBpb2FkZHIgKyBGbG93Q3RybCk7CisKKwl5cC0+dHhfdGhyZXNob2xkID0gMzI7CisJaW93cml0ZTMyKHlwLT50eF90aHJlc2hvbGQsIGlvYWRkciArIFR4VGhyZXNob2xkKTsKKworCWlmIChkZXYtPmlmX3BvcnQgPT0gMCkKKwkJZGV2LT5pZl9wb3J0ID0geXAtPmRlZmF1bHRfcG9ydDsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwkvKiBTZXR0aW5nIHRoZSBSeCBtb2RlIHdpbGwgc3RhcnQgdGhlIFJ4IHByb2Nlc3MuICovCisJaWYgKHlwLT5kcnZfZmxhZ3MgJiBJc0dpZ2FiaXQpIHsKKwkJLyogV2UgYXJlIGFsd2F5cyBpbiBmdWxsLWR1cGxleCBtb2RlIHdpdGggZ2lnYWJpdCEgKi8KKwkJeXAtPmZ1bGxfZHVwbGV4ID0gMTsKKwkJaW93cml0ZTE2KDB4MDFDRiwgaW9hZGRyICsgQ25mZyk7CisJfSBlbHNlIHsKKwkJaW93cml0ZTE2KDB4MDAxOCwgaW9hZGRyICsgRnJhbWVHYXAwKTsgLyogMDA2MC80MDYwIGZvciBub24tTUlJIDEwYmFzZVQgKi8KKwkJaW93cml0ZTE2KDB4MTAxOCwgaW9hZGRyICsgRnJhbWVHYXAxKTsKKwkJaW93cml0ZTE2KDB4MTAxQyB8ICh5cC0+ZnVsbF9kdXBsZXggPyAyIDogMCksIGlvYWRkciArIENuZmcpOworCX0KKwlzZXRfcnhfbW9kZShkZXYpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJaW93cml0ZTE2KDB4ODFmZiwgaW9hZGRyICsgSW50ckVuYik7CQkJLyogU2VlIGVudW0gaW50cl9zdGF0dXNfYml0cyAqLworCWlvd3JpdGUxNigweDAwMDAsIGlvYWRkciArIEV2ZW50U3RhdHVzKTsJCS8qIENsZWFyIG5vbi1pbnRlcnJ1cHRpbmcgZXZlbnRzICovCisJaW93cml0ZTMyKDB4ODAwMDgwMDAsIGlvYWRkciArIFJ4Q3RybCk7CQkvKiBTdGFydCBSeCBhbmQgVHggY2hhbm5lbHMuICovCisJaW93cml0ZTMyKDB4ODAwMDgwMDAsIGlvYWRkciArIFR4Q3RybCk7CisKKwlpZiAoeWVsbG93ZmluX2RlYnVnID4gMikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERvbmUgeWVsbG93ZmluX29wZW4oKS5cbiIsCisJCQkgICBkZXYtPm5hbWUpOworCX0KKworCS8qIFNldCB0aGUgdGltZXIgdG8gY2hlY2sgZm9yIGxpbmsgYmVhdC4gKi8KKwlpbml0X3RpbWVyKCZ5cC0+dGltZXIpOworCXlwLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIDMqSFo7CisJeXAtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJeXAtPnRpbWVyLmZ1bmN0aW9uID0gJnllbGxvd2Zpbl90aW1lcjsJCQkJLyogdGltZXIgaGFuZGxlciAqLworCWFkZF90aW1lcigmeXAtPnRpbWVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB5ZWxsb3dmaW5fdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOworCXN0cnVjdCB5ZWxsb3dmaW5fcHJpdmF0ZSAqeXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0geXAtPmJhc2U7CisJaW50IG5leHRfdGljayA9IDYwKkhaOworCisJaWYgKHllbGxvd2Zpbl9kZWJ1ZyA+IDMpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBZZWxsb3dmaW4gdGltZXIgdGljaywgc3RhdHVzICU4Ljh4LlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgaW9yZWFkMTYoaW9hZGRyICsgSW50clN0YXR1cykpOworCX0KKworCWlmICh5cC0+bWlpX2NudCkgeworCQlpbnQgYm1zciA9IG1kaW9fcmVhZChpb2FkZHIsIHlwLT5waHlzWzBdLCBNSUlfQk1TUik7CisJCWludCBscGEgPSBtZGlvX3JlYWQoaW9hZGRyLCB5cC0+cGh5c1swXSwgTUlJX0xQQSk7CisJCWludCBuZWdvdGlhdGVkID0gbHBhICYgeXAtPmFkdmVydGlzaW5nOworCQlpZiAoeWVsbG93ZmluX2RlYnVnID4gMSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTUlJICMlZCBzdGF0dXMgcmVnaXN0ZXIgaXMgJTQuNHgsICIKKwkJCQkgICAibGluayBwYXJ0bmVyIGNhcGFiaWxpdHkgJTQuNHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgeXAtPnBoeXNbMF0sIGJtc3IsIGxwYSk7CisKKwkJeXAtPmZ1bGxfZHVwbGV4ID0gbWlpX2R1cGxleCh5cC0+ZHVwbGV4X2xvY2ssIG5lZ290aWF0ZWQpOworCQkJCisJCWlvd3JpdGUxNigweDEwMUMgfCAoeXAtPmZ1bGxfZHVwbGV4ID8gMiA6IDApLCBpb2FkZHIgKyBDbmZnKTsKKworCQlpZiAoYm1zciAmIEJNU1JfTFNUQVRVUykKKwkJCW5leHRfdGljayA9IDYwKkhaOworCQllbHNlCisJCQluZXh0X3RpY2sgPSAzKkhaOworCX0KKworCXlwLT50aW1lci5leHBpcmVzID0gamlmZmllcyArIG5leHRfdGljazsKKwlhZGRfdGltZXIoJnlwLT50aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIHllbGxvd2Zpbl90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHllbGxvd2Zpbl9wcml2YXRlICp5cCA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB5cC0+YmFzZTsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBZZWxsb3dmaW4gdHJhbnNtaXQgdGltZWQgb3V0IGF0ICVkLyVkIFR4ICIKKwkJICAgInN0YXR1cyAlNC40eCwgUnggc3RhdHVzICU0LjR4LCByZXNldHRpbmcuLi5cbiIsCisJCSAgIGRldi0+bmFtZSwgeXAtPmN1cl90eCwgeXAtPmRpcnR5X3R4LAorCQkgICBpb3JlYWQzMihpb2FkZHIgKyBUeFN0YXR1cyksIGlvcmVhZDMyKGlvYWRkciArIFJ4U3RhdHVzKSk7CisKKwkvKiBOb3RlOiB0aGVzZSBzaG91bGQgYmUgS0VSTl9ERUJVRy4gKi8KKwlpZiAoeWVsbG93ZmluX2RlYnVnKSB7CisJCWludCBpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICIgIFJ4IHJpbmcgJXA6ICIsIHlwLT5yeF9yaW5nKTsKKwkJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKQorCQkJcHJpbnRrKCIgJTguOHgiLCB5cC0+cnhfcmluZ1tpXS5yZXN1bHRfc3RhdHVzKTsKKwkJcHJpbnRrKCJcbiJLRVJOX1dBUk5JTkciICBUeCByaW5nICVwOiAiLCB5cC0+dHhfcmluZyk7CisJCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykKKwkJCXByaW50aygiICU0LjR4IC8lOC44eCIsIHlwLT50eF9zdGF0dXNbaV0udHhfZXJycywKKwkJCQkgICB5cC0+dHhfcmluZ1tpXS5yZXN1bHRfc3RhdHVzKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKworCS8qIElmIHRoZSBoYXJkd2FyZSBpcyBmb3VuZCB0byBoYW5nIHJlZ3VsYXJseSwgd2Ugd2lsbCB1cGRhdGUgdGhlIGNvZGUKKwkgICB0byByZWluaXRpYWxpemUgdGhlIGNoaXAgaGVyZS4gKi8KKwlkZXYtPmlmX3BvcnQgPSAwOworCisJLyogV2FrZSB0aGUgcG90ZW50aWFsbHktaWRsZSB0cmFuc21pdCBjaGFubmVsLiAqLworCWlvd3JpdGUzMigweDEwMDAxMDAwLCB5cC0+YmFzZSArIFR4Q3RybCk7CisJaWYgKHlwLT5jdXJfdHggLSB5cC0+ZGlydHlfdHggPCBUWF9RVUVVRV9TSVpFKQorCQluZXRpZl93YWtlX3F1ZXVlIChkZXYpOwkJLyogVHlwaWNhbCBwYXRoICovCisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwl5cC0+c3RhdHMudHhfZXJyb3JzKys7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIFJ4IGFuZCBUeCByaW5ncywgYWxvbmcgd2l0aCB2YXJpb3VzICdkZXYnIGJpdHMuICovCitzdGF0aWMgdm9pZCB5ZWxsb3dmaW5faW5pdF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHllbGxvd2Zpbl9wcml2YXRlICp5cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwl5cC0+dHhfZnVsbCA9IDA7CisJeXAtPmN1cl9yeCA9IHlwLT5jdXJfdHggPSAwOworCXlwLT5kaXJ0eV90eCA9IDA7CisKKwl5cC0+cnhfYnVmX3N6ID0gKGRldi0+bXR1IDw9IDE1MDAgPyBQS1RfQlVGX1NaIDogZGV2LT5tdHUgKyAzMik7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJeXAtPnJ4X3JpbmdbaV0uZGJkbWFfY21kID0KKwkJCWNwdV90b19sZTMyKENNRF9SWF9CVUYgfCBJTlRSX0FMV0FZUyB8IHlwLT5yeF9idWZfc3opOworCQl5cC0+cnhfcmluZ1tpXS5icmFuY2hfYWRkciA9IGNwdV90b19sZTMyKHlwLT5yeF9yaW5nX2RtYSArCisJCQkoKGkrMSklUlhfUklOR19TSVpFKSpzaXplb2Yoc3RydWN0IHllbGxvd2Zpbl9kZXNjKSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKHlwLT5yeF9idWZfc3opOworCQl5cC0+cnhfc2tidWZmW2ldID0gc2tiOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlicmVhazsKKwkJc2tiLT5kZXYgPSBkZXY7CQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCisJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlci4gKi8KKwkJeXAtPnJ4X3JpbmdbaV0uYWRkciA9IGNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHlwLT5wY2lfZGV2LAorCQkJc2tiLT50YWlsLCB5cC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKKwl9CisJeXAtPnJ4X3JpbmdbaS0xXS5kYmRtYV9jbWQgPSBjcHVfdG9fbGUzMihDTURfU1RPUCk7CisJeXAtPmRpcnR5X3J4ID0gKHVuc2lnbmVkIGludCkoaSAtIFJYX1JJTkdfU0laRSk7CisKKyNkZWZpbmUgTk9fVFhTVEFUUworI2lmZGVmIE5PX1RYU1RBVFMKKwkvKiBJbiB0aGlzIG1vZGUgdGhlIFR4IHJpbmcgbmVlZHMgb25seSBhIHNpbmdsZSBkZXNjcmlwdG9yLiAqLworCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQl5cC0+dHhfc2tidWZmW2ldID0gTlVMTDsKKwkJeXAtPnR4X3JpbmdbaV0uZGJkbWFfY21kID0gY3B1X3RvX2xlMzIoQ01EX1NUT1ApOworCQl5cC0+dHhfcmluZ1tpXS5icmFuY2hfYWRkciA9IGNwdV90b19sZTMyKHlwLT50eF9yaW5nX2RtYSArCisJCQkoKGkrMSklVFhfUklOR19TSVpFKSpzaXplb2Yoc3RydWN0IHllbGxvd2Zpbl9kZXNjKSk7CisJfQorCS8qIFdyYXAgcmluZyAqLworCXlwLT50eF9yaW5nWy0taV0uZGJkbWFfY21kID0gY3B1X3RvX2xlMzIoQ01EX1NUT1AgfCBCUkFOQ0hfQUxXQVlTKTsKKyNlbHNlCit7CisJaW50IGo7CisKKwkvKiBUeCByaW5nIG5lZWRzIGEgcGFpciBvZiBkZXNjcmlwdG9ycywgdGhlIHNlY29uZCBmb3IgdGhlIHN0YXR1cy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKKwkJaiA9IDIqaTsKKwkJeXAtPnR4X3NrYnVmZltpXSA9IDA7CisJCS8qIEJyYW5jaCBvbiBUeCBlcnJvci4gKi8KKwkJeXAtPnR4X3Jpbmdbal0uZGJkbWFfY21kID0gY3B1X3RvX2xlMzIoQ01EX1NUT1ApOworCQl5cC0+dHhfcmluZ1tqXS5icmFuY2hfYWRkciA9IGNwdV90b19sZTMyKHlwLT50eF9yaW5nX2RtYSArCisJCQkoaisxKSpzaXplb2Yoc3RydWN0IHllbGxvd2Zpbl9kZXNjKTsKKwkJaisrOworCQlpZiAoeXAtPmZsYWdzICYgRnVsbFR4U3RhdHVzKSB7CisJCQl5cC0+dHhfcmluZ1tqXS5kYmRtYV9jbWQgPQorCQkJCWNwdV90b19sZTMyKENNRF9UWFNUQVRVUyB8IHNpemVvZigqeXAtPnR4X3N0YXR1cykpOworCQkJeXAtPnR4X3Jpbmdbal0ucmVxdWVzdF9jbnQgPSBzaXplb2YoKnlwLT50eF9zdGF0dXMpOworCQkJeXAtPnR4X3Jpbmdbal0uYWRkciA9IGNwdV90b19sZTMyKHlwLT50eF9zdGF0dXNfZG1hICsKKwkJCQlpKnNpemVvZihzdHJ1Y3QgdHhfc3RhdHVzX3dvcmRzKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFN5bWJpb3MgY2hpcHMgd3JpdGUgb25seSB0eF9lcnJzIHdvcmQuICovCisJCQl5cC0+dHhfcmluZ1tqXS5kYmRtYV9jbWQgPQorCQkJCWNwdV90b19sZTMyKENNRF9UWFNUQVRVUyB8IElOVFJfQUxXQVlTIHwgMik7CisJCQl5cC0+dHhfcmluZ1tqXS5yZXF1ZXN0X2NudCA9IDI7CisJCQkvKiBPbSBwYWRlIHVtbW1tbS4uLiAqLworCQkJeXAtPnR4X3Jpbmdbal0uYWRkciA9IGNwdV90b19sZTMyKHlwLT50eF9zdGF0dXNfZG1hICsKKwkJCQlpKnNpemVvZihzdHJ1Y3QgdHhfc3RhdHVzX3dvcmRzKSArCisJCQkJJih5cC0+dHhfc3RhdHVzWzBdLnR4X2VycnMpIC0gCisJCQkJJih5cC0+dHhfc3RhdHVzWzBdKSk7CisJCX0KKwkJeXAtPnR4X3Jpbmdbal0uYnJhbmNoX2FkZHIgPSBjcHVfdG9fbGUzMih5cC0+dHhfcmluZ19kbWEgKyAKKwkJCSgoaisxKSUoMipUWF9SSU5HX1NJWkUpKSpzaXplb2Yoc3RydWN0IHllbGxvd2Zpbl9kZXNjKSk7CisJfQorCS8qIFdyYXAgcmluZyAqLworCXlwLT50eF9yaW5nWysral0uZGJkbWFfY21kIHw9IGNwdV90b19sZTMyKEJSQU5DSF9BTFdBWVMgfCBJTlRSX0FMV0FZUyk7Cit9CisjZW5kaWYKKwl5cC0+dHhfdGFpbF9kZXNjID0gJnlwLT50eF9zdGF0dXNbMF07CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHllbGxvd2Zpbl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHllbGxvd2Zpbl9wcml2YXRlICp5cCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgZW50cnk7CisJaW50IGxlbiA9IHNrYi0+bGVuOworCisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworCS8qIE5vdGU6IE9yZGVyaW5nIGlzIGltcG9ydGFudCBoZXJlLCBzZXQgdGhlIGZpZWxkIHdpdGggdGhlCisJICAgIm93bmVyc2hpcCIgYml0IGxhc3QsIGFuZCBvbmx5IHRoZW4gaW5jcmVtZW50IGN1cl90eC4gKi8KKworCS8qIENhbGN1bGF0ZSB0aGUgbmV4dCBUeCBkZXNjcmlwdG9yIGVudHJ5LiAqLworCWVudHJ5ID0geXAtPmN1cl90eCAlIFRYX1JJTkdfU0laRTsKKworCWlmIChneF9maXgpIHsJLyogTm90ZTogb25seSB3b3JrcyBmb3IgcGFkZGFibGUgcHJvdG9jb2xzIGUuZy4gIElQLiAqLworCQlpbnQgY2FjaGVsaW5lX2VuZCA9ICgodW5zaWduZWQgbG9uZylza2ItPmRhdGEgKyBza2ItPmxlbikgJSAzMjsKKwkJLyogRml4IEdYIGNoaXBzZXQgZXJyYXRhLiAqLworCQlpZiAoY2FjaGVsaW5lX2VuZCA+IDI0ICB8fCBjYWNoZWxpbmVfZW5kID09IDApIHsKKwkJCWxlbiA9IHNrYi0+bGVuICsgMzIgLSBjYWNoZWxpbmVfZW5kICsgMTsKKwkJCWlmIChsZW4gIT0gc2tiLT5sZW4pCisJCQkJc2tiID0gc2tiX3BhZHRvKHNrYiwgbGVuKTsKKwkJfQorCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCXlwLT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXlwLT50eF9za2J1ZmZbZW50cnldID0gc2tiOworCisjaWZkZWYgTk9fVFhTVEFUUworCXlwLT50eF9yaW5nW2VudHJ5XS5hZGRyID0gY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoeXAtPnBjaV9kZXYsIAorCQlza2ItPmRhdGEsIGxlbiwgUENJX0RNQV9UT0RFVklDRSkpOworCXlwLT50eF9yaW5nW2VudHJ5XS5yZXN1bHRfc3RhdHVzID0gMDsKKwlpZiAoZW50cnkgPj0gVFhfUklOR19TSVpFLTEpIHsKKwkJLyogTmV3IHN0b3AgY29tbWFuZC4gKi8KKwkJeXAtPnR4X3JpbmdbMF0uZGJkbWFfY21kID0gY3B1X3RvX2xlMzIoQ01EX1NUT1ApOworCQl5cC0+dHhfcmluZ1tUWF9SSU5HX1NJWkUtMV0uZGJkbWFfY21kID0KKwkJCWNwdV90b19sZTMyKENNRF9UWF9QS1R8QlJBTkNIX0FMV0FZUyB8IGxlbik7CisJfSBlbHNlIHsKKwkJeXAtPnR4X3JpbmdbZW50cnkrMV0uZGJkbWFfY21kID0gY3B1X3RvX2xlMzIoQ01EX1NUT1ApOworCQl5cC0+dHhfcmluZ1tlbnRyeV0uZGJkbWFfY21kID0KKwkJCWNwdV90b19sZTMyKENNRF9UWF9QS1QgfCBCUkFOQ0hfSUZUUlVFIHwgbGVuKTsKKwl9CisJeXAtPmN1cl90eCsrOworI2Vsc2UKKwl5cC0+dHhfcmluZ1tlbnRyeTw8MV0ucmVxdWVzdF9jbnQgPSBsZW47CisJeXAtPnR4X3JpbmdbZW50cnk8PDFdLmFkZHIgPSBjcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZSh5cC0+cGNpX2RldiwgCisJCXNrYi0+ZGF0YSwgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKSk7CisJLyogVGhlIGlucHV0X2xhc3QgKHN0YXR1cy13cml0ZSkgY29tbWFuZCBpcyBjb25zdGFudCwgYnV0IHdlIG11c3QgCisJICAgcmV3cml0ZSB0aGUgc3Vic2VxdWVudCAnc3RvcCcgY29tbWFuZC4gKi8KKworCXlwLT5jdXJfdHgrKzsKKwl7CisJCXVuc2lnbmVkIG5leHRfZW50cnkgPSB5cC0+Y3VyX3R4ICUgVFhfUklOR19TSVpFOworCQl5cC0+dHhfcmluZ1tuZXh0X2VudHJ5PDwxXS5kYmRtYV9jbWQgPSBjcHVfdG9fbGUzMihDTURfU1RPUCk7CisJfQorCS8qIEZpbmFsIHN0ZXAgLS0gb3ZlcndyaXRlIHRoZSBvbGQgJ3N0b3AnIGNvbW1hbmQuICovCisKKwl5cC0+dHhfcmluZ1tlbnRyeTw8MV0uZGJkbWFfY21kID0KKwkJY3B1X3RvX2xlMzIoICgoZW50cnkgJSA2KSA9PSAwID8gQ01EX1RYX1BLVHxJTlRSX0FMV0FZU3xCUkFOQ0hfSUZUUlVFIDoKKwkJCQkJICBDTURfVFhfUEtUIHwgQlJBTkNIX0lGVFJVRSkgfCBsZW4pOworI2VuZGlmCisKKwkvKiBOb24teDg2IFRvZG86IGV4cGxpY2l0bHkgZmx1c2ggY2FjaGUgbGluZXMgaGVyZS4gKi8KKworCS8qIFdha2UgdGhlIHBvdGVudGlhbGx5LWlkbGUgdHJhbnNtaXQgY2hhbm5lbC4gKi8KKwlpb3dyaXRlMzIoMHgxMDAwMTAwMCwgeXAtPmJhc2UgKyBUeEN0cmwpOworCisJaWYgKHlwLT5jdXJfdHggLSB5cC0+ZGlydHlfdHggPCBUWF9RVUVVRV9TSVpFKQorCQluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsJCS8qIFR5cGljYWwgcGF0aCAqLworCWVsc2UKKwkJeXAtPnR4X2Z1bGwgPSAxOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJaWYgKHllbGxvd2Zpbl9kZWJ1ZyA+IDQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBZZWxsb3dmaW4gdHJhbnNtaXQgZnJhbWUgIyVkIHF1ZXVlZCBpbiBzbG90ICVkLlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgeXAtPmN1cl90eCwgZW50cnkpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogVGhlIGludGVycnVwdCBoYW5kbGVyIGRvZXMgYWxsIG9mIHRoZSBSeCB0aHJlYWQgd29yayBhbmQgY2xlYW5zIHVwCisgICBhZnRlciB0aGUgVHggdGhyZWFkLiAqLworc3RhdGljIGlycXJldHVybl90IHllbGxvd2Zpbl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2luc3RhbmNlOworCXN0cnVjdCB5ZWxsb3dmaW5fcHJpdmF0ZSAqeXA7CisJdm9pZCBfX2lvbWVtICppb2FkZHI7CisJaW50IGJvZ3VzY250ID0gbWF4X2ludGVycnVwdF93b3JrOworCXVuc2lnbmVkIGludCBoYW5kbGVkID0gMDsKKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCQkJLyogQ2FuIG5ldmVyIG9jY3VyLiAqLworCWlmIChkZXYgPT0gTlVMTCkgeworCQlwcmludGsgKEtFUk5fRVJSICJ5ZWxsb3dmaW5faW50ZXJydXB0KCk6IGlycSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorI2VuZGlmCisKKwl5cCA9IG5ldGRldl9wcml2KGRldik7CisJaW9hZGRyID0geXAtPmJhc2U7CisJCisJc3Bpbl9sb2NrICgmeXAtPmxvY2spOworCisJZG8geworCQl1MTYgaW50cl9zdGF0dXMgPSBpb3JlYWQxNihpb2FkZHIgKyBJbnRyQ2xlYXIpOworCisJCWlmICh5ZWxsb3dmaW5fZGVidWcgPiA0KQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBZZWxsb3dmaW4gaW50ZXJydXB0LCBzdGF0dXMgJTQuNHguXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgaW50cl9zdGF0dXMpOworCisJCWlmIChpbnRyX3N0YXR1cyA9PSAwKQorCQkJYnJlYWs7CisJCWhhbmRsZWQgPSAxOworCisJCWlmIChpbnRyX3N0YXR1cyAmIChJbnRyUnhEb25lIHwgSW50ckVhcmx5UngpKSB7CisJCQl5ZWxsb3dmaW5fcngoZGV2KTsKKwkJCWlvd3JpdGUzMigweDEwMDAxMDAwLCBpb2FkZHIgKyBSeEN0cmwpOwkJLyogV2FrZSBSeCBlbmdpbmUuICovCisJCX0KKworI2lmZGVmIE5PX1RYU1RBVFMKKwkJZm9yICg7IHlwLT5jdXJfdHggLSB5cC0+ZGlydHlfdHggPiAwOyB5cC0+ZGlydHlfdHgrKykgeworCQkJaW50IGVudHJ5ID0geXAtPmRpcnR5X3R4ICUgVFhfUklOR19TSVpFOworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJaWYgKHlwLT50eF9yaW5nW2VudHJ5XS5yZXN1bHRfc3RhdHVzID09IDApCisJCQkJYnJlYWs7CisJCQlza2IgPSB5cC0+dHhfc2tidWZmW2VudHJ5XTsKKwkJCXlwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQl5cC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQkvKiBGcmVlIHRoZSBvcmlnaW5hbCBza2IuICovCisJCQlwY2lfdW5tYXBfc2luZ2xlKHlwLT5wY2lfZGV2LCB5cC0+dHhfcmluZ1tlbnRyeV0uYWRkciwKKwkJCQlza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOworCQkJeXAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQl9CisJCWlmICh5cC0+dHhfZnVsbAorCQkJJiYgeXAtPmN1cl90eCAtIHlwLT5kaXJ0eV90eCA8IFRYX1FVRVVFX1NJWkUgLSA0KSB7CisJCQkvKiBUaGUgcmluZyBpcyBubyBsb25nZXIgZnVsbCwgY2xlYXIgdGJ1c3kuICovCisJCQl5cC0+dHhfZnVsbCA9IDA7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0KKyNlbHNlCisJCWlmICgoaW50cl9zdGF0dXMgJiBJbnRyVHhEb25lKSB8fCAoeXAtPnR4X3RhaWxfZGVzYy0+dHhfZXJycykpIHsKKwkJCXVuc2lnbmVkIGRpcnR5X3R4ID0geXAtPmRpcnR5X3R4OworCisJCQlmb3IgKGRpcnR5X3R4ID0geXAtPmRpcnR5X3R4OyB5cC0+Y3VyX3R4IC0gZGlydHlfdHggPiAwOworCQkJCSBkaXJ0eV90eCsrKSB7CisJCQkJLyogVG9kbzogb3B0aW1pemUgdGhpcy4gKi8KKwkJCQlpbnQgZW50cnkgPSBkaXJ0eV90eCAlIFRYX1JJTkdfU0laRTsKKwkJCQl1MTYgdHhfZXJycyA9IHlwLT50eF9zdGF0dXNbZW50cnldLnR4X2VycnM7CisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworI2lmbmRlZiBmaW5hbF92ZXJzaW9uCisJCQkJaWYgKHllbGxvd2Zpbl9kZWJ1ZyA+IDUpCisJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHggcXVldWUgJWQgY2hlY2ssIFR4IHN0YXR1cyAiCisJCQkJCQkgICAiJTQuNHggJTQuNHggJTQuNHggJTQuNHguXG4iLAorCQkJCQkJICAgZGV2LT5uYW1lLCBlbnRyeSwKKwkJCQkJCSAgIHlwLT50eF9zdGF0dXNbZW50cnldLnR4X2NudCwKKwkJCQkJCSAgIHlwLT50eF9zdGF0dXNbZW50cnldLnR4X2VycnMsCisJCQkJCQkgICB5cC0+dHhfc3RhdHVzW2VudHJ5XS50b3RhbF90eF9jbnQsCisJCQkJCQkgICB5cC0+dHhfc3RhdHVzW2VudHJ5XS5wYXVzZWQpOworI2VuZGlmCisJCQkJaWYgKHR4X2VycnMgPT0gMCkKKwkJCQkJYnJlYWs7CS8qIEl0IHN0aWxsIGhhc24ndCBiZWVuIFR4ZWQgKi8KKwkJCQlza2IgPSB5cC0+dHhfc2tidWZmW2VudHJ5XTsKKwkJCQlpZiAodHhfZXJycyAmIDB4RjgxMCkgeworCQkJCQkvKiBUaGVyZSB3YXMgYW4gbWFqb3IgZXJyb3IsIGxvZyBpdC4gKi8KKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQkJCQlpZiAoeWVsbG93ZmluX2RlYnVnID4gMSkKKwkJCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogVHJhbnNtaXQgZXJyb3IsIFR4IHN0YXR1cyAlNC40eC5cbiIsCisJCQkJCQkJICAgZGV2LT5uYW1lLCB0eF9lcnJzKTsKKyNlbmRpZgorCQkJCQl5cC0+c3RhdHMudHhfZXJyb3JzKys7CisJCQkJCWlmICh0eF9lcnJzICYgMHhGODAwKSB5cC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwkJCQkJaWYgKHR4X2VycnMgJiAweDA4MDApIHlwLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCQlpZiAodHhfZXJycyAmIDB4MjAwMCkgeXAtPnN0YXRzLnR4X3dpbmRvd19lcnJvcnMrKzsKKwkJCQkJaWYgKHR4X2VycnMgJiAweDgwMDApIHlwLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJCX0gZWxzZSB7CisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkJCQkJaWYgKHllbGxvd2Zpbl9kZWJ1ZyA+IDQpCisJCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE5vcm1hbCB0cmFuc21pdCwgVHggc3RhdHVzICU0LjR4LlxuIiwKKwkJCQkJCQkgICBkZXYtPm5hbWUsIHR4X2VycnMpOworI2VuZGlmCisJCQkJCXlwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCQkJeXAtPnN0YXRzLmNvbGxpc2lvbnMgKz0gdHhfZXJycyAmIDE1OworCQkJCQl5cC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJCX0KKwkJCQkvKiBGcmVlIHRoZSBvcmlnaW5hbCBza2IuICovCisJCQkJcGNpX3VubWFwX3NpbmdsZSh5cC0+cGNpX2RldiwgCisJCQkJCXlwLT50eF9yaW5nW2VudHJ5PDwxXS5hZGRyLCBza2ItPmxlbiwgCisJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisJCQkJeXAtPnR4X3NrYnVmZltlbnRyeV0gPSAwOworCQkJCS8qIE1hcmsgc3RhdHVzIGFzIGVtcHR5LiAqLworCQkJCXlwLT50eF9zdGF0dXNbZW50cnldLnR4X2VycnMgPSAwOworCQkJfQorCisjaWZuZGVmIGZpbmFsX3ZlcnNpb24KKwkJCWlmICh5cC0+Y3VyX3R4IC0gZGlydHlfdHggPiBUWF9SSU5HX1NJWkUpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBPdXQtb2Ytc3luYyBkaXJ0eSBwb2ludGVyLCAlZCB2cy4gJWQsIGZ1bGw9JWQuXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIGRpcnR5X3R4LCB5cC0+Y3VyX3R4LCB5cC0+dHhfZnVsbCk7CisJCQkJZGlydHlfdHggKz0gVFhfUklOR19TSVpFOworCQkJfQorI2VuZGlmCisKKwkJCWlmICh5cC0+dHhfZnVsbAorCQkJCSYmIHlwLT5jdXJfdHggLSBkaXJ0eV90eCA8IFRYX1FVRVVFX1NJWkUgLSAyKSB7CisJCQkJLyogVGhlIHJpbmcgaXMgbm8gbG9uZ2VyIGZ1bGwsIGNsZWFyIHRidXN5LiAqLworCQkJCXlwLT50eF9mdWxsID0gMDsKKwkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQl9CisKKwkJCXlwLT5kaXJ0eV90eCA9IGRpcnR5X3R4OworCQkJeXAtPnR4X3RhaWxfZGVzYyA9ICZ5cC0+dHhfc3RhdHVzW2RpcnR5X3R4ICUgVFhfUklOR19TSVpFXTsKKwkJfQorI2VuZGlmCisKKwkJLyogTG9nIGVycm9ycyBhbmQgb3RoZXIgdW5jb21tb24gZXZlbnRzLiAqLworCQlpZiAoaW50cl9zdGF0dXMgJiAweDJlZSkJLyogQWJub3JtYWwgZXJyb3Igc3VtbWFyeS4gKi8KKwkJCXllbGxvd2Zpbl9lcnJvcihkZXYsIGludHJfc3RhdHVzKTsKKworCQlpZiAoLS1ib2d1c2NudCA8IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUb28gbXVjaCB3b3JrIGF0IGludGVycnVwdCwgIgorCQkJCSAgICJzdGF0dXM9MHglNC40eC5cbiIsCisJCQkJICAgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKDEpOworCisJaWYgKHllbGxvd2Zpbl9kZWJ1ZyA+IDMpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXhpdGluZyBpbnRlcnJ1cHQsIHN0YXR1cz0lIzQuNHguXG4iLAorCQkJICAgZGV2LT5uYW1lLCBpb3JlYWQxNihpb2FkZHIgKyBJbnRyU3RhdHVzKSk7CisKKwlzcGluX3VubG9jayAoJnlwLT5sb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworLyogVGhpcyByb3V0aW5lIGlzIGxvZ2ljYWxseSBwYXJ0IG9mIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwgYnV0IHNlcGFyYXRlZAorICAgZm9yIGNsYXJpdHkgYW5kIGJldHRlciByZWdpc3RlciBhbGxvY2F0aW9uLiAqLworc3RhdGljIGludCB5ZWxsb3dmaW5fcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeWVsbG93ZmluX3ByaXZhdGUgKnlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZW50cnkgPSB5cC0+Y3VyX3J4ICUgUlhfUklOR19TSVpFOworCWludCBib2d1c2NudCA9IHlwLT5kaXJ0eV9yeCArIFJYX1JJTkdfU0laRSAtIHlwLT5jdXJfcng7CisKKwlpZiAoeWVsbG93ZmluX2RlYnVnID4gNCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiIEluIHllbGxvd2Zpbl9yeCgpLCBlbnRyeSAlZCBzdGF0dXMgJTguOHguXG4iLAorCQkJICAgZW50cnksIHlwLT5yeF9yaW5nW2VudHJ5XS5yZXN1bHRfc3RhdHVzKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAgICMlZCBkZXNjLiAlOC44eCAlOC44eCAlOC44eC5cbiIsCisJCQkgICBlbnRyeSwgeXAtPnJ4X3JpbmdbZW50cnldLmRiZG1hX2NtZCwgeXAtPnJ4X3JpbmdbZW50cnldLmFkZHIsCisJCQkgICB5cC0+cnhfcmluZ1tlbnRyeV0ucmVzdWx0X3N0YXR1cyk7CisJfQorCisJLyogSWYgRU9QIGlzIHNldCBvbiB0aGUgbmV4dCBlbnRyeSwgaXQncyBhIG5ldyBwYWNrZXQuIFNlbmQgaXQgdXAuICovCisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IHllbGxvd2Zpbl9kZXNjICpkZXNjID0gJnlwLT5yeF9yaW5nW2VudHJ5XTsKKwkJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYiA9IHlwLT5yeF9za2J1ZmZbZW50cnldOworCQlzMTYgZnJhbWVfc3RhdHVzOworCQl1MTYgZGVzY19zdGF0dXM7CisJCWludCBkYXRhX3NpemU7CisJCXU4ICpidWZfYWRkcjsKKworCQlpZighZGVzYy0+cmVzdWx0X3N0YXR1cykKKwkJCWJyZWFrOworCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoeXAtPnBjaV9kZXYsIGRlc2MtPmFkZHIsCisJCQl5cC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlkZXNjX3N0YXR1cyA9IGxlMzJfdG9fY3B1KGRlc2MtPnJlc3VsdF9zdGF0dXMpID4+IDE2OworCQlidWZfYWRkciA9IHJ4X3NrYi0+dGFpbDsKKwkJZGF0YV9zaXplID0gKGxlMzJfdG9fY3B1KGRlc2MtPmRiZG1hX2NtZCkgLSAKKwkJCWxlMzJfdG9fY3B1KGRlc2MtPnJlc3VsdF9zdGF0dXMpKSAmIDB4ZmZmZjsKKwkJZnJhbWVfc3RhdHVzID0gbGUxNl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoczE2KikmKGJ1Zl9hZGRyW2RhdGFfc2l6ZSAtIDJdKSkpOworCQlpZiAoeWVsbG93ZmluX2RlYnVnID4gNCkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgIHllbGxvd2Zpbl9yeCgpIHN0YXR1cyB3YXMgJTQuNHguXG4iLAorCQkJCSAgIGZyYW1lX3N0YXR1cyk7CisJCWlmICgtLWJvZ3VzY250IDwgMCkKKwkJCWJyZWFrOworCQlpZiAoICEgKGRlc2Nfc3RhdHVzICYgUlhfRU9QKSkgeworCQkJaWYgKGRhdGFfc2l6ZSAhPSAwKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPdmVyc2l6ZWQgRXRoZXJuZXQgZnJhbWUgc3Bhbm5lZCBtdWx0aXBsZSBidWZmZXJzLCIKKwkJCQkJICAgIiBzdGF0dXMgJTQuNHgsIGRhdGFfc2l6ZSAlZCFcbiIsIGRldi0+bmFtZSwgZGVzY19zdGF0dXMsIGRhdGFfc2l6ZSk7CisJCQl5cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQl9IGVsc2UgaWYgKCh5cC0+ZHJ2X2ZsYWdzICYgSXNHaWdhYml0KSAgJiYgIChmcmFtZV9zdGF0dXMgJiAweDAwMzgpKSB7CisJCQkvKiBUaGVyZSB3YXMgYSBlcnJvci4gKi8KKwkJCWlmICh5ZWxsb3dmaW5fZGVidWcgPiAzKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICIgIHllbGxvd2Zpbl9yeCgpIFJ4IGVycm9yIHdhcyAlNC40eC5cbiIsCisJCQkJCSAgIGZyYW1lX3N0YXR1cyk7CisJCQl5cC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQlpZiAoZnJhbWVfc3RhdHVzICYgMHgwMDYwKSB5cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDAwOCkgeXAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJaWYgKGZyYW1lX3N0YXR1cyAmIDB4MDAxMCkgeXAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCWlmIChmcmFtZV9zdGF0dXMgPCAwKSB5cC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQl9IGVsc2UgaWYgKCAhKHlwLT5kcnZfZmxhZ3MgJiBJc0dpZ2FiaXQpICAmJgorCQkJCSAgICgoYnVmX2FkZHJbZGF0YV9zaXplLTFdICYgMHg4NSkgfHwgYnVmX2FkZHJbZGF0YV9zaXplLTJdICYgMHhDMCkpIHsKKwkJCXU4IHN0YXR1czEgPSBidWZfYWRkcltkYXRhX3NpemUtMl07CisJCQl1OCBzdGF0dXMyID0gYnVmX2FkZHJbZGF0YV9zaXplLTFdOworCQkJeXAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJaWYgKHN0YXR1czEgJiAweEMwKSB5cC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJaWYgKHN0YXR1czIgJiAweDAzKSB5cC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzMiAmIDB4MDQpIHlwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzMiAmIDB4ODApIHlwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisjaWZkZWYgWUZfUFJPVE9UWVBFCQkvKiBTdXBwb3J0IGZvciBwcm90b3R5cGUgaGFyZHdhcmUgZXJyYXRhLiAqLworCQl9IGVsc2UgaWYgKCh5cC0+ZmxhZ3MgJiBIYXNNQUNBZGRyQnVnKSAgJiYKKwkJCW1lbWNtcChsZTMyX3RvX2NwdSh5cC0+cnhfcmluZ19kbWEgKworCQkJCWVudHJ5KnNpemVvZihzdHJ1Y3QgeWVsbG93ZmluX2Rlc2MpKSwKKwkJCQlkZXYtPmRldl9hZGRyLCA2KSAhPSAwICYmIAorCQkJbWVtY21wKGxlMzJfdG9fY3B1KHlwLT5yeF9yaW5nX2RtYSArCisJCQkJZW50cnkqc2l6ZW9mKHN0cnVjdCB5ZWxsb3dmaW5fZGVzYykpLAorCQkJCSJcMzc3XDM3N1wzNzdcMzc3XDM3N1wzNzciLCA2KSAhPSAwKSB7CisJCQlpZiAoYm9ndXNfcngrKyA9PSAwKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBCYWQgZnJhbWUgdG8gJTIuMng6JTIuMng6JTIuMng6JTIuMng6IgorCQkJCQkgICAiJTIuMng6JTIuMnguXG4iLAorCQkJCQkgICBkZXYtPm5hbWUsIGJ1Zl9hZGRyWzBdLCBidWZfYWRkclsxXSwgYnVmX2FkZHJbMl0sCisJCQkJCSAgIGJ1Zl9hZGRyWzNdLCBidWZfYWRkcls0XSwgYnVmX2FkZHJbNV0pOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQkJaW50IHBrdF9sZW4gPSBkYXRhX3NpemUgLQorCQkJCSh5cC0+Y2hpcF9pZCA/IDcgOiA4ICsgYnVmX2FkZHJbZGF0YV9zaXplIC0gOF0pOworCQkJLyogVG8gdmVyaWZ5OiBZZWxsb3dmaW4gTGVuZ3RoIHNob3VsZCBvbWl0IHRoZSBDUkMhICovCisKKyNpZm5kZWYgZmluYWxfdmVyc2lvbgorCQkJaWYgKHllbGxvd2Zpbl9kZWJ1ZyA+IDQpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgeWVsbG93ZmluX3J4KCkgbm9ybWFsIFJ4IHBrdCBsZW5ndGggJWQiCisJCQkJCSAgICIgb2YgJWQsIGJvZ3VzX2NudCAlZC5cbiIsCisJCQkJCSAgIHBrdF9sZW4sIGRhdGFfc2l6ZSwgYm9ndXNjbnQpOworI2VuZGlmCisJCQkvKiBDaGVjayBpZiB0aGUgcGFja2V0IGlzIGxvbmcgZW5vdWdoIHRvIGp1c3QgcGFzcyB1cCB0aGUgc2tidWZmCisJCQkgICB3aXRob3V0IGNvcHlpbmcgdG8gYSBwcm9wZXJseSBzaXplZCBza2J1ZmYuICovCisJCQlpZiAocGt0X2xlbiA+IHJ4X2NvcHlicmVhaykgeworCQkJCXNrYl9wdXQoc2tiID0gcnhfc2tiLCBwa3RfbGVuKTsKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHlwLT5wY2lfZGV2LCAKKwkJCQkJeXAtPnJ4X3JpbmdbZW50cnldLmFkZHIsIAorCQkJCQl5cC0+cnhfYnVmX3N6LCAKKwkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQl5cC0+cnhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisJCQl9IGVsc2UgeworCQkJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X2xlbiArIDIpOworCQkJCWlmIChza2IgPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisJCQkJc2tiLT5kZXYgPSBkZXY7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCisJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIHJ4X3NrYi0+dGFpbCwgcGt0X2xlbiwgMCk7CisJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOworCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSh5cC0+cGNpX2RldiwgZGVzYy0+YWRkciwKKwkJCQkJCQkJCQkJICAgeXAtPnJ4X2J1Zl9zeiwKKwkJCQkJCQkJCQkJICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCX0KKwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQluZXRpZl9yeChza2IpOworCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJCXlwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQl5cC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJfQorCQllbnRyeSA9ICgrK3lwLT5jdXJfcngpICUgUlhfUklOR19TSVpFOworCX0KKworCS8qIFJlZmlsbCB0aGUgUnggcmluZyBidWZmZXJzLiAqLworCWZvciAoOyB5cC0+Y3VyX3J4IC0geXAtPmRpcnR5X3J4ID4gMDsgeXAtPmRpcnR5X3J4KyspIHsKKwkJZW50cnkgPSB5cC0+ZGlydHlfcnggJSBSWF9SSU5HX1NJWkU7CisJCWlmICh5cC0+cnhfc2tidWZmW2VudHJ5XSA9PSBOVUxMKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYih5cC0+cnhfYnVmX3N6KTsKKwkJCWlmIChza2IgPT0gTlVMTCkKKwkJCQlicmVhazsJCQkJLyogQmV0dGVyIGx1Y2sgbmV4dCByb3VuZC4gKi8KKwkJCXlwLT5yeF9za2J1ZmZbZW50cnldID0gc2tiOworCQkJc2tiLT5kZXYgPSBkZXY7CS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KKwkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLworCQkJeXAtPnJ4X3JpbmdbZW50cnldLmFkZHIgPSBjcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZSh5cC0+cGNpX2RldiwKKwkJCQlza2ItPnRhaWwsIHlwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSkpOworCQl9CisJCXlwLT5yeF9yaW5nW2VudHJ5XS5kYmRtYV9jbWQgPSBjcHVfdG9fbGUzMihDTURfU1RPUCk7CisJCXlwLT5yeF9yaW5nW2VudHJ5XS5yZXN1bHRfc3RhdHVzID0gMDsJLyogQ2xlYXIgY29tcGxldGUgYml0LiAqLworCQlpZiAoZW50cnkgIT0gMCkKKwkJCXlwLT5yeF9yaW5nW2VudHJ5IC0gMV0uZGJkbWFfY21kID0KKwkJCQljcHVfdG9fbGUzMihDTURfUlhfQlVGIHwgSU5UUl9BTFdBWVMgfCB5cC0+cnhfYnVmX3N6KTsKKwkJZWxzZQorCQkJeXAtPnJ4X3JpbmdbUlhfUklOR19TSVpFIC0gMV0uZGJkbWFfY21kID0KKwkJCQljcHVfdG9fbGUzMihDTURfUlhfQlVGIHwgSU5UUl9BTFdBWVMgfCBCUkFOQ0hfQUxXQVlTCisJCQkJCQkJfCB5cC0+cnhfYnVmX3N6KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgeWVsbG93ZmluX2Vycm9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbnRyX3N0YXR1cykKK3sKKwlzdHJ1Y3QgeWVsbG93ZmluX3ByaXZhdGUgKnlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IFNvbWV0aGluZyBXaWNrZWQgaGFwcGVuZWQhICU0LjR4LlxuIiwKKwkJICAgZGV2LT5uYW1lLCBpbnRyX3N0YXR1cyk7CisJLyogSG1tbW1tLCBpdCdzIG5vdCBjbGVhciB3aGF0IHRvIGRvIGhlcmUuICovCisJaWYgKGludHJfc3RhdHVzICYgKEludHJUeFBDSUVyciB8IEludHJUeFBDSUZhdWx0KSkKKwkJeXAtPnN0YXRzLnR4X2Vycm9ycysrOworCWlmIChpbnRyX3N0YXR1cyAmIChJbnRyUnhQQ0lFcnIgfCBJbnRyUnhQQ0lGYXVsdCkpCisJCXlwLT5zdGF0cy5yeF9lcnJvcnMrKzsKK30KKworc3RhdGljIGludCB5ZWxsb3dmaW5fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeWVsbG93ZmluX3ByaXZhdGUgKnlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHlwLT5iYXNlOworCWludCBpOworCisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKworCWlmICh5ZWxsb3dmaW5fZGVidWcgPiAxKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQsIHN0YXR1cyB3YXMgVHggJTQuNHggIgorCQkJICAgIlJ4ICU0LjR4IEludCAlMi4yeC5cbiIsCisJCQkgICBkZXYtPm5hbWUsIGlvcmVhZDE2KGlvYWRkciArIFR4U3RhdHVzKSwKKwkJCSAgIGlvcmVhZDE2KGlvYWRkciArIFJ4U3RhdHVzKSwKKwkJCSAgIGlvcmVhZDE2KGlvYWRkciArIEludHJTdGF0dXMpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBRdWV1ZSBwb2ludGVycyB3ZXJlIFR4ICVkIC8gJWQsICBSeCAlZCAvICVkLlxuIiwKKwkJCSAgIGRldi0+bmFtZSwgeXAtPmN1cl90eCwgeXAtPmRpcnR5X3R4LCB5cC0+Y3VyX3J4LCB5cC0+ZGlydHlfcngpOworCX0KKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBieSBjbGVhcmluZyB0aGUgaW50ZXJydXB0IG1hc2suICovCisJaW93cml0ZTE2KDB4MDAwMCwgaW9hZGRyICsgSW50ckVuYik7CisKKwkvKiBTdG9wIHRoZSBjaGlwJ3MgVHggYW5kIFJ4IHByb2Nlc3Nlcy4gKi8KKwlpb3dyaXRlMzIoMHg4MDAwMDAwMCwgaW9hZGRyICsgUnhDdHJsKTsKKwlpb3dyaXRlMzIoMHg4MDAwMDAwMCwgaW9hZGRyICsgVHhDdHJsKTsKKworCWRlbF90aW1lcigmeXAtPnRpbWVyKTsKKworI2lmIGRlZmluZWQoX19pMzg2X18pCisJaWYgKHllbGxvd2Zpbl9kZWJ1ZyA+IDIpIHsKKwkJcHJpbnRrKCJcbiJLRVJOX0RFQlVHIiAgVHggcmluZyBhdCAlOC44bGx4OlxuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXlwLT50eF9yaW5nX2RtYSk7CisJCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkUqMjsgaSsrKQorCQkJcHJpbnRrKCIgJWMgIyVkIGRlc2MuICU4Ljh4ICU4Ljh4ICU4Ljh4ICU4Ljh4LlxuIiwKKwkJCQkgICBpb3JlYWQzMihpb2FkZHIgKyBUeFB0cikgPT0gKGxvbmcpJnlwLT50eF9yaW5nW2ldID8gJz4nIDogJyAnLAorCQkJCSAgIGksIHlwLT50eF9yaW5nW2ldLmRiZG1hX2NtZCwgeXAtPnR4X3JpbmdbaV0uYWRkciwKKwkJCQkgICB5cC0+dHhfcmluZ1tpXS5icmFuY2hfYWRkciwgeXAtPnR4X3JpbmdbaV0ucmVzdWx0X3N0YXR1cyk7CisJCXByaW50ayhLRVJOX0RFQlVHICIgIFR4IHN0YXR1cyAlcDpcbiIsIHlwLT50eF9zdGF0dXMpOworCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCisJCQlwcmludGsoIiAgICMlZCBzdGF0dXMgJTQuNHggJTQuNHggJTQuNHggJTQuNHguXG4iLAorCQkJCSAgIGksIHlwLT50eF9zdGF0dXNbaV0udHhfY250LCB5cC0+dHhfc3RhdHVzW2ldLnR4X2VycnMsCisJCQkJICAgeXAtPnR4X3N0YXR1c1tpXS50b3RhbF90eF9jbnQsIHlwLT50eF9zdGF0dXNbaV0ucGF1c2VkKTsKKworCQlwcmludGsoIlxuIktFUk5fREVCVUcgIiAgUnggcmluZyAlOC44bGx4OlxuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXlwLT5yeF9yaW5nX2RtYSk7CisJCWZvciAoaSA9IDA7IGkgPCBSWF9SSU5HX1NJWkU7IGkrKykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAlYyAjJWQgZGVzYy4gJTguOHggJTguOHggJTguOHhcbiIsCisJCQkJICAgaW9yZWFkMzIoaW9hZGRyICsgUnhQdHIpID09IChsb25nKSZ5cC0+cnhfcmluZ1tpXSA/ICc+JyA6ICcgJywKKwkJCQkgICBpLCB5cC0+cnhfcmluZ1tpXS5kYmRtYV9jbWQsIHlwLT5yeF9yaW5nW2ldLmFkZHIsCisJCQkJICAgeXAtPnJ4X3JpbmdbaV0ucmVzdWx0X3N0YXR1cyk7CisJCQlpZiAoeWVsbG93ZmluX2RlYnVnID4gNikgeworCQkJCWlmIChnZXRfdW5hbGlnbmVkKCh1OCopeXAtPnJ4X3JpbmdbaV0uYWRkcikgIT0gMHg2OSkgeworCQkJCQlpbnQgajsKKwkJCQkJZm9yIChqID0gMDsgaiA8IDB4NTA7IGorKykKKwkJCQkJCXByaW50aygiICU0LjR4IiwKKwkJCQkJCQkgICBnZXRfdW5hbGlnbmVkKCgodTE2Kil5cC0+cnhfcmluZ1tpXS5hZGRyKSArIGopKTsKKwkJCQkJcHJpbnRrKCJcbiIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvKiBfX2kzODZfXyBkZWJ1Z2dpbmcgb25seSAqLworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisKKwkvKiBGcmVlIGFsbCB0aGUgc2tidWZmcyBpbiB0aGUgUnggcXVldWUuICovCisJZm9yIChpID0gMDsgaSA8IFJYX1JJTkdfU0laRTsgaSsrKSB7CisJCXlwLT5yeF9yaW5nW2ldLmRiZG1hX2NtZCA9IGNwdV90b19sZTMyKENNRF9TVE9QKTsKKwkJeXAtPnJ4X3JpbmdbaV0uYWRkciA9IDB4QkFERjAwRDA7IC8qIEFuIGludmFsaWQgYWRkcmVzcy4gKi8KKwkJaWYgKHlwLT5yeF9za2J1ZmZbaV0pIHsKKwkJCWRldl9rZnJlZV9za2IoeXAtPnJ4X3NrYnVmZltpXSk7CisJCX0KKwkJeXAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJfQorCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgeworCQlpZiAoeXAtPnR4X3NrYnVmZltpXSkKKwkJCWRldl9rZnJlZV9za2IoeXAtPnR4X3NrYnVmZltpXSk7CisJCXlwLT50eF9za2J1ZmZbaV0gPSBOVUxMOworCX0KKworI2lmZGVmIFlGX1BST1RPVFlQRQkJCS8qIFN1cHBvcnQgZm9yIHByb3RvdHlwZSBoYXJkd2FyZSBlcnJhdGEuICovCisJaWYgKHllbGxvd2Zpbl9kZWJ1ZyA+IDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBSZWNlaXZlZCAlZCBmcmFtZXMgdGhhdCB3ZSBzaG91bGQgbm90IGhhdmUuXG4iLAorCQkJICAgZGV2LT5uYW1lLCBib2d1c19yeCk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp5ZWxsb3dmaW5fZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHllbGxvd2Zpbl9wcml2YXRlICp5cCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuICZ5cC0+c3RhdHM7Cit9CisKKy8qIFNldCBvciBjbGVhciB0aGUgbXVsdGljYXN0IGZpbHRlciBmb3IgdGhpcyBhZGFwdG9yLiAqLworCitzdGF0aWMgdm9pZCBzZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB5ZWxsb3dmaW5fcHJpdmF0ZSAqeXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0geXAtPmJhc2U7CisJdTE2IGNmZ192YWx1ZSA9IGlvcmVhZDE2KGlvYWRkciArIENuZmcpOworCisJLyogU3RvcCB0aGUgUnggcHJvY2VzcyB0byBjaGFuZ2UgYW55IHZhbHVlLiAqLworCWlvd3JpdGUxNihjZmdfdmFsdWUgJiB+MHgxMDAwLCBpb2FkZHIgKyBDbmZnKTsKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CQkJLyogU2V0IHByb21pc2N1b3VzLiAqLworCQkvKiBVbmNvbmRpdGlvbmFsbHkgbG9nIG5ldCB0YXBzLiAqLworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLCBkZXYtPm5hbWUpOworCQlpb3dyaXRlMTYoMHgwMDBGLCBpb2FkZHIgKyBBZGRyTW9kZSk7CisJfSBlbHNlIGlmICgoZGV2LT5tY19jb3VudCA+IDY0KSAgfHwgIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQkvKiBUb28gbWFueSB0byBmaWx0ZXIgd2VsbCwgb3IgYWNjZXB0IGFsbCBtdWx0aWNhc3RzLiAqLworCQlpb3dyaXRlMTYoMHgwMDBCLCBpb2FkZHIgKyBBZGRyTW9kZSk7CisJfSBlbHNlIGlmIChkZXYtPm1jX2NvdW50ID4gMCkgeyAvKiBNdXN0IHVzZSB0aGUgbXVsdGljYXN0IGhhc2ggdGFibGUuICovCisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCQl1MTYgaGFzaF90YWJsZVs0XTsKKwkJaW50IGk7CisJCW1lbXNldChoYXNoX3RhYmxlLCAwLCBzaXplb2YoaGFzaF90YWJsZSkpOworCQlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7IG1jbGlzdCAmJiBpIDwgZGV2LT5tY19jb3VudDsKKwkJCSBpKyssIG1jbGlzdCA9IG1jbGlzdC0+bmV4dCkgeworCQkJdW5zaWduZWQgaW50IGJpdDsKKworCQkJLyogRHVlIHRvIGEgYnVnIGluIHRoZSBlYXJseSBjaGlwIHZlcnNpb25zLCBtdWx0aXBsZSBmaWx0ZXIKKwkJCSAgIHNsb3RzIG11c3QgYmUgc2V0IGZvciBlYWNoIGFkZHJlc3MuICovCisJCQlpZiAoeXAtPmRydl9mbGFncyAmIEhhc011bHRpY2FzdEJ1ZykgeworCQkJCWJpdCA9IChldGhlcl9jcmNfbGUoMywgbWNsaXN0LT5kbWlfYWRkcikgPj4gMykgJiAweDNmOworCQkJCWhhc2hfdGFibGVbYml0ID4+IDRdIHw9ICgxIDw8IGJpdCk7CisJCQkJYml0ID0gKGV0aGVyX2NyY19sZSg0LCBtY2xpc3QtPmRtaV9hZGRyKSA+PiAzKSAmIDB4M2Y7CisJCQkJaGFzaF90YWJsZVtiaXQgPj4gNF0gfD0gKDEgPDwgYml0KTsKKwkJCQliaXQgPSAoZXRoZXJfY3JjX2xlKDUsIG1jbGlzdC0+ZG1pX2FkZHIpID4+IDMpICYgMHgzZjsKKwkJCQloYXNoX3RhYmxlW2JpdCA+PiA0XSB8PSAoMSA8PCBiaXQpOworCQkJfQorCQkJYml0ID0gKGV0aGVyX2NyY19sZSg2LCBtY2xpc3QtPmRtaV9hZGRyKSA+PiAzKSAmIDB4M2Y7CisJCQloYXNoX3RhYmxlW2JpdCA+PiA0XSB8PSAoMSA8PCBiaXQpOworCQl9CisJCS8qIENvcHkgdGhlIGhhc2ggdGFibGUgdG8gdGhlIGNoaXAuICovCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQlpb3dyaXRlMTYoaGFzaF90YWJsZVtpXSwgaW9hZGRyICsgSGFzaFRibCArIGkqMik7CisJCWlvd3JpdGUxNigweDAwMDMsIGlvYWRkciArIEFkZHJNb2RlKTsKKwl9IGVsc2UgewkJCQkJLyogTm9ybWFsLCB1bmljYXN0L2Jyb2FkY2FzdC1vbmx5IG1vZGUuICovCisJCWlvd3JpdGUxNigweDAwMDEsIGlvYWRkciArIEFkZHJNb2RlKTsKKwl9CisJLyogUmVzdGFydCB0aGUgUnggcHJvY2Vzcy4gKi8KKwlpb3dyaXRlMTYoY2ZnX3ZhbHVlIHwgMHgxMDAwLCBpb2FkZHIgKyBDbmZnKTsKK30KKworc3RhdGljIHZvaWQgeWVsbG93ZmluX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IHllbGxvd2Zpbl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbyA9IHllbGxvd2Zpbl9nZXRfZHJ2aW5mbworfTsKKworc3RhdGljIGludCBuZXRkZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgeWVsbG93ZmluX3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IG5wLT5iYXNlOworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShycSk7CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBTSU9DR01JSVBIWToJCS8qIEdldCBhZGRyZXNzIG9mIE1JSSBQSFkgaW4gdXNlLiAqLworCQlkYXRhLT5waHlfaWQgPSBucC0+cGh5c1swXSAmIDB4MWY7CisJCS8qIEZhbGwgVGhyb3VnaCAqLworCisJY2FzZSBTSU9DR01JSVJFRzoJCS8qIFJlYWQgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwkJZGF0YS0+dmFsX291dCA9IG1kaW9fcmVhZChpb2FkZHIsIGRhdGEtPnBoeV9pZCAmIDB4MWYsIGRhdGEtPnJlZ19udW0gJiAweDFmKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNJT0NTTUlJUkVHOgkJLyogV3JpdGUgTUlJIFBIWSByZWdpc3Rlci4gKi8KKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGRhdGEtPnBoeV9pZCA9PSBucC0+cGh5c1swXSkgeworCQkJdTE2IHZhbHVlID0gZGF0YS0+dmFsX2luOworCQkJc3dpdGNoIChkYXRhLT5yZWdfbnVtKSB7CisJCQljYXNlIDA6CisJCQkJLyogQ2hlY2sgZm9yIGF1dG9uZWdvdGlhdGlvbiBvbiBvciByZXNldC4gKi8KKwkJCQlucC0+bWVkaWFsb2NrID0gKHZhbHVlICYgMHg5MDAwKSA/IDAgOiAxOworCQkJCWlmIChucC0+bWVkaWFsb2NrKQorCQkJCQlucC0+ZnVsbF9kdXBsZXggPSAodmFsdWUgJiAweDAxMDApID8gMSA6IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6IG5wLT5hZHZlcnRpc2luZyA9IHZhbHVlOyBicmVhazsKKwkJCX0KKwkJCS8qIFBlcmhhcHMgY2hlY2tfZHVwbGV4KGRldiksIGRlcGVuZGluZyBvbiBjaGlwIHNlbWFudGljcy4gKi8KKwkJfQorCQltZGlvX3dyaXRlKGlvYWRkciwgZGF0YS0+cGh5X2lkICYgMHgxZiwgZGF0YS0+cmVnX251bSAmIDB4MWYsIGRhdGEtPnZhbF9pbik7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IHllbGxvd2Zpbl9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCB5ZWxsb3dmaW5fcHJpdmF0ZSAqbnA7CisKKwlpZiAoIWRldikKKwkJQlVHKCk7CisJbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisgICAgICAgIHBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgU1RBVFVTX1RPVEFMX1NJWkUsIG5wLT50eF9zdGF0dXMsIAorCQlucC0+dHhfc3RhdHVzX2RtYSk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBSWF9UT1RBTF9TSVpFLCBucC0+cnhfcmluZywgbnAtPnJ4X3JpbmdfZG1hKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIFRYX1RPVEFMX1NJWkUsIG5wLT50eF9yaW5nLCBucC0+dHhfcmluZ19kbWEpOworCXVucmVnaXN0ZXJfbmV0ZGV2IChkZXYpOworCisJcGNpX2lvdW5tYXAocGRldiwgbnAtPmJhc2UpOworCisJcGNpX3JlbGVhc2VfcmVnaW9ucyAocGRldik7CisKKwlmcmVlX25ldGRldiAoZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Cit9CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHllbGxvd2Zpbl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCT0geWVsbG93ZmluX3BjaV90YmwsCisJLnByb2JlCQk9IHllbGxvd2Zpbl9pbml0X29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHllbGxvd2Zpbl9yZW1vdmVfb25lKSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgeWVsbG93ZmluX2luaXQgKHZvaWQpCit7CisvKiB3aGVuIGEgbW9kdWxlLCB0aGlzIGlzIHByaW50ZWQgd2hldGhlciBvciBub3QgZGV2aWNlcyBhcmUgZm91bmQgaW4gcHJvYmUgKi8KKyNpZmRlZiBNT0RVTEUKKwlwcmludGsodmVyc2lvbik7CisjZW5kaWYKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0ICgmeWVsbG93ZmluX2RyaXZlcik7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IHllbGxvd2Zpbl9jbGVhbnVwICh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJnllbGxvd2Zpbl9kcml2ZXIpOworfQorCisKK21vZHVsZV9pbml0KHllbGxvd2Zpbl9pbml0KTsKK21vZHVsZV9leGl0KHllbGxvd2Zpbl9jbGVhbnVwKTsKKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVUxFIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1jIHllbGxvd2Zpbi5jIgorICogIGNvbXBpbGUtY29tbWFuZC1hbHBoYUxYOiAiZ2NjIC1ETU9EVUxFIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU8yIC1jIHllbGxvd2Zpbi5jIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tc3RyZW5ndGgtcmVkdWNlIC1tbm8tZnAtcmVncyAtV2EsLW0yMTE2NGEgLURCV1hfVVNBQkxFIC1EQldJT19FTkFCTEVEIgorICogIHNpbXBsZS1jb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RVTEUgLU82IC1jIHllbGxvd2Zpbi5jIgorICogIGMtaW5kZW50LWxldmVsOiA0CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDQKKyAqICB0YWItd2lkdGg6IDQKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvem5ldC5jIGIvZHJpdmVycy9uZXQvem5ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYzA0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC96bmV0LmMKQEAgLTAsMCArMSw5NDggQEAKKy8qIHpuZXQuYzogQW4gWmVuaXRoIFotTm90ZSBldGhlcm5ldCBkcml2ZXIgZm9yIGxpbnV4LiAqLworCisvKgorCVdyaXR0ZW4gYnkgRG9uYWxkIEJlY2tlci4KKworCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLmNvbS4KKwlUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiB0aGUgTGludXggc2tlbGV0b24gZHJpdmVyLiAgVGhlIGNvcHlyaWdodCBvZiB0aGUKKwlza2VsZXRvbiBkcml2ZXIgaXMgaGVsZCBieSB0aGUgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50LCBhcyByZXByZXNlbnRlZAorCWJ5IERJUk5TQSwgYW5kIGl0IGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisKKwlUaGFua3MgdG8gTWlrZSBIb2xsaWNrIGZvciBhbHBoYSB0ZXN0aW5nIGFuZCBzdWdnZXN0aW9ucy4KKworICBSZWZlcmVuY2VzOgorCSAgIFRoZSBDcnlud3IgcGFja2V0IGRyaXZlci4KKworCSAgIjgyNTkzIENTTUEvQ0QgQ29yZSBMQU4gQ29udHJvbGxlciIgSW50ZWwgZGF0YXNoZWV0LCAxOTkyCisJICBJbnRlbCBNaWNyb2NvbW11bmljYXRpb25zIERhdGFib29rLCBWb2wuIDEsIDE5OTAuCisgICAgQXMgdXN1YWwgd2l0aCBJbnRlbCwgdGhlIGRvY3VtZW50YXRpb24gaXMgaW5jb21wbGV0ZSBhbmQgaW5hY2N1cmF0ZS4KKwlJIGhhZCB0byByZWFkIHRoZSBDcnlud3IgcGFja2V0IGRyaXZlciB0byBmaWd1cmUgb3V0IGhvdyB0byBhY3R1YWxseQorCXVzZSB0aGUgaTgyNTkzLCBhbmQgZ3Vlc3MgYXQgd2hhdCByZWdpc3RlciBiaXRzIG1hdGNoZWQgdGhlIGxvb3NlbHkKKwlyZWxhdGVkIGk4MjU4Ni4KKworCQkJCQlUaGVvcnkgb2YgT3BlcmF0aW9uCisKKwlUaGUgaTgyNTkzIHVzZWQgaW4gdGhlIFplbml0aCBaLU5vdGUgc2VyaWVzIG9wZXJhdGVzIHVzaW5nIHR3byghKSBzbGF2ZQorCURNQQljaGFubmVscywgb25lIGludGVycnVwdCwgYW5kIG9uZSA4LWJpdCBJL08gcG9ydC4KKworCVdoaWxlIHRoZXJlCXNldmVyYWwgd2F5cyB0byBjb25maWd1cmUgJzU5MyBETUEgc3lzdGVtLCBJIGNob3NlIHRoZSBvbmUKKwl0aGF0IHNlZW1lZCBjb21tZW5zdXJhdGUgd2l0aCB0aGUgaGlnaGVzdCBzeXN0ZW0gcGVyZm9ybWFuY2UgaW4gdGhlIGZhY2UKKwlvZiBtb2RlcmF0ZSBpbnRlcnJ1cHQgbGF0ZW5jeTogQm90aCBETUEgY2hhbm5lbHMgYXJlIGNvbmZpZ3VyZWQgYXMKKwlyZWNpcmN1bGF0aW5nIHJpbmcgYnVmZmVycywgd2l0aCBvbmUgY2hhbm5lbCAoIzApIGRlZGljYXRlZCB0byBSeCBhbmQKKwl0aGUgb3RoZXIgY2hhbm5lbCAoIzEpIHRvIFR4IGFuZCBjb25maWd1cmF0aW9uLiAgKE5vdGUgdGhhdCB0aGlzIGlzCisJZGlmZmVyZW50IHRoYW4gdGhlIENyeW53ciBkcml2ZXIsIHdoZXJlIHRoZSBUeCBETUEgY2hhbm5lbCBpcyBpbml0aWFsaXplZAorCWJlZm9yZSBlYWNoIG9wZXJhdGlvbi4gIFRoYXQgYXBwcm9hY2ggc2ltcGxpZmllcyBvcGVyYXRpb24gYW5kIFR4IGVycm9yCisJcmVjb3ZlcnksIGJ1dCByZXF1aXJlcyBhZGRpdGlvbmFsIEkvTyBpbiBub3JtYWwgb3BlcmF0aW9uIGFuZCBwcmVjbHVkZXMKKwl0cmFuc21pdCBidWZmZXIJY2hhaW5pbmcuKQorCisJQm90aCByaW5ncyBhcmUgc2V0IHRvIDgxOTIgYnl0ZXMgdXNpbmcge1RYLFJYfV9SSU5HX1NJWkUuICBUaGlzIHByb3ZpZGVzCisJYSByZWFzb25hYmxlIHJpbmcgc2l6ZSBmb3IgUngsIHdoaWxlIHNpbXBsaWZ5aW5nIERNQSBidWZmZXIgYWxsb2NhdGlvbiAtLQorCURNQSBidWZmZXJzIG11c3Qgbm90IGNyb3NzIGEgMTI4SyBib3VuZGFyeS4gIChJbiB0cnV0aCB0aGUgc2l6ZSBzZWxlY3Rpb24KKwl3YXMgaW5mbHVlbmNlZCBieSBteSBsYWNrIG9mICc1OTMgZG9jdW1lbnRhdGlvbi4gIEkgdGh1cyB3YXMgY29uc3RyYWluZWQKKwl0byB1c2UgdGhlIENyeW53ciAnNTkzIGluaXRpYWxpemF0aW9uIHRhYmxlLCB3aGljaCBzZXRzIHRoZSBSeCByaW5nIHNpemUKKwl0byA4Sy4pCisKKwlEZXNwaXRlIG15IHVzdWFsIGxvdyBvcGluaW9uIGFib3V0IEludGVsLWRlc2lnbmVkIHBhcnRzLCBJIG11c3QgYWRtaXQKKwl0aGF0IHRoZSBidWxrIGRhdGEgaGFuZGxpbmcgb2YgdGhlIGk4MjU5MyBpcyBhIGdvb2QgZGVzaWduIGZvcgorCWFuIGludGVncmF0ZWQgc3lzdGVtLCBsaWtlIGEgbGFwdG9wLCB3aGVyZSB1c2luZyB0d28gc2xhdmUgRE1BIGNoYW5uZWxzCisJZG9lc24ndCBwb3NlIGEgcHJvYmxlbS4gIEkgc3RpbGwgdGFrZSBpc3N1ZSB3aXRoIHVzaW5nIG9ubHkgYSBzaW5nbGUgSS9PCisJcG9ydC4gIEluIHRoZSBzYW1lIGNvbnRyb2xsZWQgZW52aXJvbm1lbnQgdGhlcmUgYXJlIGVzc2VudGlhbGx5IG5vCisJbGltaXRhdGlvbnMgb24gSS9PIHNwYWNlLCBhbmQgdXNpbmcgbXVsdGlwbGUgbG9jYXRpb25zIHdvdWxkIGVsaW1pbmF0ZQorCXRoZQluZWVkIGZvciBtdWx0aXBsZSBvcGVyYXRpb25zIHdoZW4gbG9va2luZyBhdCBzdGF0dXMgcmVnaXN0ZXJzLAorCXNldHRpbmcgdGhlIFJ4IHJpbmcgYm91bmRhcnksIG9yIHN3aXRjaGluZyB0byBwcm9taXNjdW91cyBtb2RlLgorCisJSSBhbHNvIHF1ZXN0aW9uIFplbml0aCdzIHNlbGVjdGlvbiBvZiB0aGUgJzU5Mzogb25lIG9mIHRoZSBhZHZlcnRpc2VkCisJYWR2YW50YWdlcyBvZiBlYXJsaWVyIEludGVsIHBhcnRzIHdhcyB0aGF0IGlmIHlvdSBmaWd1cmVkIG91dCB0aGUgbWFnaWMKKwlpbml0aWFsaXphdGlvbiBpbmNhbnRhdGlvbiB5b3UgY291bGQgdXNlIHRoZSBzYW1lIHBhcnQgb24gbWFueSBkaWZmZXJlbnQKKwluZXR3b3JrIHR5cGVzLiAgWmVuaXRoJ3MgdXNlIG9mIHRoZSAiRnJpZW5kbHlOZXQiIChzaWMpIGNvbm5lY3RvciByYXRoZXIKKwl0aGFuIGFuCW9uLWJvYXJkIHRyYW5zY2VpdmVyIGxlYWRzIG1lIHRvIGJlbGlldmUgdGhhdCB0aGV5IHdlcmUgcGxhbm5pbmcKKwl0byB0YWtlIGFkdmFudGFnZSBvZiB0aGlzLiAgQnV0LCB1aG1tbSwgdGhlICc1OTMgb21pdHMgYWxsIGJ1dCBldGhlcm5ldAorCWZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgc2VyaWFsIHN1YnN5c3RlbS4KKyAqLworCisvKiAxMC8yMDAyCisKKyAgIG8gUmVzdXJlY3RlZCBmb3IgTGludXggMi41KyBieSBNYXJjIFp5bmdpZXIgPG1hekB3aWxkLXdpbmQuZnIuZXUub3JnPiA6CisKKyAgIC0gUmVtb3ZlZCBzdHJhbmdlIERNQSBzbm9vcGluZyBpbiB6bmV0X3NlbnRfcGFja2V0LCB3aGljaCBsZWFkIHRvCisgICAgIFRYIGJ1ZmZlciBjb3JydXB0aW9uIG9uIG15IGxhcHRvcC4KKyAgIC0gVXNlIGluaXRfZXRoZXJkZXYgc3R1ZmYuCisgICAtIFVzZSBrbWFsbG9jLWVkIERNQSBidWZmZXJzLgorICAgLSBVc2UgYXMgZmV3IGdsb2JhbCB2YXJpYWJsZXMgYXMgcG9zc2libGUuCisgICAtIFVzZSBwcm9wZXIgcmVzb3VyY2VzIG1hbmFnZW1lbnQuCisgICAtIFVzZSB3aXJlbGVzcy9pODI1OTMuaCBhcyBtdWNoIGFzIHBvc3NpYmxlIChzdHJ1Y3R1cmUsIGNvbnN0YW50cykKKyAgIC0gQ29tcGlsZXMgYXMgbW9kdWxlIG9yIGJ1aWxkLWluLgorICAgLSBOb3cgc3Vydml2ZXMgdW5wbHVnZ2luZy9yZXBsdWdnaW5nIGNhYmxlLgorCisgICBTb21lIGNvZGUgd2FzIHRha2VuIGZyb20gd2F2ZWxhbl9jcy4KKyAgIAorICAgVGVzdGVkIG9uIGEgdmludGFnZSBaZW5pdGggWi1Ob3RlIDQzM0xucCsuIFByb2JhYmx5IGJyb2tlbiBvbgorICAgYW55dGhpbmcgZWxzZS4gVGVzdGVycyAoYW5kIGRldGFpbGVkIGJ1ZyByZXBvcnRzKSBhcmUgd2VsY29tZSA6LSkuCisKKyAgIG8gVE9ETyA6CisKKyAgIC0gUHJvcGVybHkgaGFuZGxlIG11bHRpY2FzdAorICAgLSBVbmRlcnN0YW5kIHdoeSBzb21lIHRyYWZmaWMgcGF0dGVybnMgYWRkIGEgMXMgbGF0ZW5jeS4uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisvKiBUaGlzIGluY2x1ZGUgY291bGQgYmUgZWxzZXdoZXJlLCBzaW5jZSBpdCBpcyBub3Qgd2lyZWxlc3Mgc3BlY2lmaWMgKi8KKyNpbmNsdWRlICJ3aXJlbGVzcy9pODI1OTMuaCIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPSAiem5ldC5jOnYxLjAyIDkvMjMvOTQgYmVja2VyQHNjeWxkLmNvbVxuIjsKKworI2lmbmRlZiBaTkVUX0RFQlVHCisjZGVmaW5lIFpORVRfREVCVUcgMQorI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgaW50IHpuZXRfZGVidWcgPSBaTkVUX0RFQlVHOworbW9kdWxlX3BhcmFtICh6bmV0X2RlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyAoem5ldF9kZWJ1ZywgIlpOZXQgZGVidWcgbGV2ZWwiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogVGhlIERNQSBtb2RlcyB3ZSBuZWVkIGFyZW4ndCBpbiA8ZG1hLmg+LiAqLworI2RlZmluZSBETUFfUlhfTU9ERQkJMHgxNAkvKiBBdXRvIGluaXQsIEkvTyB0byBtZW0sICsrLCBkZW1hbmQuICovCisjZGVmaW5lIERNQV9UWF9NT0RFCQkweDE4CS8qIEF1dG8gaW5pdCwgTWVtIHRvIEkvTywgKyssIGRlbWFuZC4gKi8KKyNkZWZpbmUgZG1hX3BhZ2VfZXEocHRyMSwgcHRyMikgKChsb25nKShwdHIxKT4+MTcgPT0gKGxvbmcpKHB0cjIpPj4xNykKKyNkZWZpbmUgUlhfQlVGX1NJWkUgODE5MgorI2RlZmluZSBUWF9CVUZfU0laRSA4MTkyCisjZGVmaW5lIERNQV9CVUZfU0laRSAoUlhfQlVGX1NJWkUgKyAxNikJLyogOGsgKyAxNiBieXRlcyBmb3IgdHJhaWxlcnMgKi8KKworI2RlZmluZSBUWF9USU1FT1VUCTEwCisKK3N0cnVjdCB6bmV0X3ByaXZhdGUgeworCWludCByeF9kbWEsIHR4X2RtYTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzcGlubG9ja190IGxvY2s7CisJc2hvcnQgc2lhX2Jhc2UsIHNpYV9zaXplLCBpb19zaXplOworCXN0cnVjdCBpODI1OTNfY29uZl9ibG9jayBpNTkzX2luaXQ7CisJLyogVGhlIHN0YXJ0aW5nLCBjdXJyZW50LCBhbmQgZW5kIHBvaW50ZXJzIGZvciB0aGUgcGFja2V0IGJ1ZmZlcnMuICovCisJdXNob3J0ICpyeF9zdGFydCwgKnJ4X2N1ciwgKnJ4X2VuZDsKKwl1c2hvcnQgKnR4X3N0YXJ0LCAqdHhfY3VyLCAqdHhfZW5kOworCXVzaG9ydCB0eF9idWZfbGVuOwkJCS8qIFR4IGJ1ZmZlciBsZW5ndGgsIGluIHdvcmRzLiAqLworfTsKKworLyogT25seSBvbmUgY2FuIGJlIGJ1aWx0LWluOy0+ICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnpuZXRfZGV2OworCitzdHJ1Y3QgbmV0aWRibGsgeworCWNoYXIgbWFnaWNbOF07CQkvKiBUaGUgbWFnaWMgbnVtYmVyIChzdHJpbmcpICJORVRJREJMSyIgKi8KKwl1bnNpZ25lZCBjaGFyIG5ldGlkWzhdOyAvKiBUaGUgcGh5c2ljYWwgc3RhdGlvbiBhZGRyZXNzICovCisJY2hhciBuZXR0eXBlLCBnbG9iYWxvcHQ7CisJY2hhciB2ZW5kb3JbOF07CQkvKiBUaGUgbWFjaGluZSB2ZW5kb3IgYW5kIHByb2R1Y3QgbmFtZS4gKi8KKwljaGFyIHByb2R1Y3RbOF07CisJY2hhciBpcnExLCBpcnEyOwkJLyogSW50ZXJydXB0cywgb25seSBvbmUgaXMgY3VycmVudGx5IHVzZWQuCSovCisJY2hhciBkbWExLCBkbWEyOworCXNob3J0IGRtYV9tZW1fbWlzY1s4XTsJCS8qIERNQSBidWZmZXIgbG9jYXRpb25zICh1bnVzZWQgaW4gTGludXgpLiAqLworCXNob3J0IGlvYmFzZTEsIGlvc2l6ZTE7CisJc2hvcnQgaW9iYXNlMiwgaW9zaXplMjsJCS8qIFNlY29uZCBpb2Jhc2UgdW51c2VkLiAqLworCWNoYXIgZHJpdmVyX29wdGlvbnM7CQkJLyogTWlzYy4gYml0cyAqLworCWNoYXIgcGFkOworfTsKKworc3RhdGljIGludAl6bmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaW50CXpuZXRfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgaXJxcmV0dXJuX3Qgem5ldF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZAl6bmV0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludAl6bmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpuZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgaGFyZHdhcmVfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdG9wX2hpdChzaG9ydCBpb2FkZHIsIHVuc2lnbmVkIHNob3J0IHJ4X3N0b3Bfb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIHpuZXRfdHhfdGltZW91dCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIFJlcXVlc3QgbmVlZGVkIHJlc291cmNlcyAqLworc3RhdGljIGludCB6bmV0X3JlcXVlc3RfcmVzb3VyY2VzIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB6bmV0X3ByaXZhdGUgKnpuZXQgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCisJaWYgKHJlcXVlc3RfaXJxIChkZXYtPmlycSwgJnpuZXRfaW50ZXJydXB0LCAwLCAiWk5ldCIsIGRldikpCisJCWdvdG8gZmFpbGVkOworCWlmIChyZXF1ZXN0X2RtYSAoem5ldC0+cnhfZG1hLCAiWk5ldCByeCIpKQorCQlnb3RvIGZyZWVfaXJxOworCWlmIChyZXF1ZXN0X2RtYSAoem5ldC0+dHhfZG1hLCAiWk5ldCB0eCIpKQorCQlnb3RvIGZyZWVfcnhfZG1hOworCWlmICghcmVxdWVzdF9yZWdpb24gKHpuZXQtPnNpYV9iYXNlLCB6bmV0LT5zaWFfc2l6ZSwgIlpOZXQgU0lBIikpCisJCWdvdG8gZnJlZV90eF9kbWE7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbiAoZGV2LT5iYXNlX2FkZHIsIHpuZXQtPmlvX3NpemUsICJaTmV0IEkvTyIpKQorCQlnb3RvIGZyZWVfc2lhOworCisJcmV0dXJuIDA7CQkJCS8qIEhhcHB5ICEgKi8KKworIGZyZWVfc2lhOgorCXJlbGVhc2VfcmVnaW9uICh6bmV0LT5zaWFfYmFzZSwgem5ldC0+c2lhX3NpemUpOworIGZyZWVfdHhfZG1hOgorCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKKwlmcmVlX2RtYSAoem5ldC0+dHhfZG1hKTsKKwlyZWxlYXNlX2RtYV9sb2NrIChmbGFncyk7CisgZnJlZV9yeF9kbWE6CisJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCWZyZWVfZG1hICh6bmV0LT5yeF9kbWEpOworCXJlbGVhc2VfZG1hX2xvY2sgKGZsYWdzKTsKKyBmcmVlX2lycToKKwlmcmVlX2lycSAoZGV2LT5pcnEsIGRldik7CisgZmFpbGVkOgorCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgem5ldF9yZWxlYXNlX3Jlc291cmNlcyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgem5ldF9wcml2YXRlICp6bmV0ID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQorCXJlbGVhc2VfcmVnaW9uICh6bmV0LT5zaWFfYmFzZSwgem5ldC0+c2lhX3NpemUpOworCXJlbGVhc2VfcmVnaW9uIChkZXYtPmJhc2VfYWRkciwgem5ldC0+aW9fc2l6ZSk7CisJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCWZyZWVfZG1hICh6bmV0LT50eF9kbWEpOworCWZyZWVfZG1hICh6bmV0LT5yeF9kbWEpOworCXJlbGVhc2VfZG1hX2xvY2sgKGZsYWdzKTsKKwlmcmVlX2lycSAoZGV2LT5pcnEsIGRldik7Cit9CisKKy8qIEtlZXAgdGhlIG1hZ2ljYWwgU0lBIHN0dWZmIGluIGEgc2luZ2xlIGZ1bmN0aW9uLi4uICovCitzdGF0aWMgdm9pZCB6bmV0X3RyYW5zY2VpdmVyX3Bvd2VyIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgb24pCit7CisJc3RydWN0IHpuZXRfcHJpdmF0ZSAqem5ldCA9IGRldi0+cHJpdjsKKwl1bnNpZ25lZCBjaGFyIHY7CisKKwkvKiBUdXJuIG9uL29mZiB0aGUgODI1MDEgU0lBLCB1c2luZyB6ZW5pdGgtc3BlY2lmaWMgbWFnaWMuICovCisJLyogU2VsZWN0IExBTiBjb250cm9sIHJlZ2lzdGVyICovCisJb3V0YigweDEwLCB6bmV0LT5zaWFfYmFzZSk7CisKKwlpZiAob24pCisJCXYgPSBpbmIoem5ldC0+c2lhX2Jhc2UgKyAxKSB8IDB4ODQ7CisJZWxzZQorCQl2ID0gaW5iKHpuZXQtPnNpYV9iYXNlICsgMSkgJiB+MHg4NDsKKwkJCisJb3V0Yih2LCB6bmV0LT5zaWFfYmFzZSsxKTsgLyogVHVybiBvbi9vZmYgTEFOIHBvd2VyIChiaXQgMikuICovCit9CisKKy8qIEluaXQgdGhlIGk4MjU5Mywgd2l0aCBjdXJyZW50IHByb21pc2MvbWNhc3QgY29uZmlndXJhdGlvbi4KKyAgIEFsc28gdXNlZCBmcm9tIGhhcmR3YXJlX2luaXQuICovCitzdGF0aWMgdm9pZCB6bmV0X3NldF9tdWx0aWNhc3RfbGlzdCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgem5ldF9wcml2YXRlICp6bmV0ID0gZGV2LT5wcml2OworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCBpODI1OTNfY29uZl9ibG9jayAqY2ZibGsgPSAmem5ldC0+aTU5M19pbml0OworCisJbWVtc2V0KGNmYmxrLCAweDAwLCBzaXplb2Yoc3RydWN0IGk4MjU5M19jb25mX2Jsb2NrKSk7CisJCisgICAgICAgIC8qIFRoZSBjb25maWd1cmF0aW9uIGJsb2NrLiAgV2hhdCBhbiB1bmRvY3VtZW50ZWQgbmlnaHRtYXJlLgorCSAgIFRoZSBmaXJzdCBzZXQgb2YgdmFsdWVzIGFyZSB0aG9zZSBzdWdnZXN0ZWQgKHdpdGhvdXQgZXhwbGFuYXRpb24pCisJICAgZm9yIGV0aGVybmV0IGluIHRoZSBJbnRlbCA4MjU4NiBkYXRhYm9vay4gIFRoZSByZXN0IGFwcGVhciB0byBiZQorCSAgIGNvbXBsZXRlbHkgdW5kb2N1bWVudGVkLCBleGNlcHQgZm9yIGNyeXB0aWMgbm90ZXMgaW4gdGhlIENyeW53cgorCSAgIHBhY2tldCBkcml2ZXIuICBUaGlzIGRyaXZlciB1c2VzIHRoZSBDcnlud3IgdmFsdWVzIHZlcmJhdGltLiAqLworCisJLyogbWF6IDogUmV3cml0dGVuIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSB3YW52ZWxhbiBpbmNsdWRlcy4KKwkgICBBdCBsZWFzdCB3ZSBoYXZlIG5hbWVzLCBub3QganVzdCBibGluZCB2YWx1ZXMgKi8KKwkKKwkvKiBCeXRlIDAgKi8KKwljZmJsay0+Zmlmb19saW1pdCA9IDEwOwkvKiA9IDE2IEIgcnggYW5kIDgwIEIgdHggZmlmbyB0aHJlc2hvbGRzICovCisJY2ZibGstPmZvcmduZXNpID0gMDsJLyogMD04MkM1MDEsIDE9QU1ENzk5MkIgY29tcGF0aWJpbGl0eSAqLworCWNmYmxrLT5maWZvXzMyID0gMTsKKwljZmJsay0+ZDZtb2QgPSAwOyAgCS8qIFJ1biBpbiBpODI1OTMgYWR2YW5jZWQgbW9kZSAqLworCWNmYmxrLT50aHJvdHRsZV9lbmIgPSAxOworCisJLyogQnl0ZSAxICovCisJY2ZibGstPnRocm90dGxlID0gODsJLyogQ29udGludW91cyB3L2ludGVycnVwdHMsIDEyOC1jbG9jayBETUEuICovCisJY2ZibGstPmNudHJ4aW50ID0gMDsJLyogZW5hYmxlIGNvbnRpbnVvdXMgbW9kZSByZWNlaXZlIGludGVycnVwdHMgKi8KKwljZmJsay0+Y29udGluID0gMTsJLyogZW5hYmxlIGNvbnRpbnVvdXMgbW9kZSAqLworCisJLyogQnl0ZSAyICovCisJY2ZibGstPmFkZHJfbGVuID0gRVRIX0FMRU47CisJY2ZibGstPmFjbG9jID0gMTsJLyogRGlzYWJsZSBzb3VyY2UgYWRkciBpbnNlcnRpb24gYnkgaTgyNTkzICovCisJY2ZibGstPnByZWFtYl9sZW4gPSAyOwkvKiA4IGJ5dGVzIHByZWFtYmxlICovCisJY2ZibGstPmxvb3BiYWNrID0gMDsJLyogTG9vcGJhY2sgb2ZmICovCisgIAorCS8qIEJ5dGUgMyAqLworCWNmYmxrLT5saW5fcHJpbyA9IDA7CS8qIERlZmF1bHQgcHJpb3JpdGllcyAmIGJhY2tvZmYgbWV0aG9kcy4gKi8KKwljZmJsay0+dGJvZnN0b3AgPSAwOworCWNmYmxrLT5leHBfcHJpbyA9IDA7CisJY2ZibGstPmJvZl9tZXQgPSAwOworICAKKwkvKiBCeXRlIDQgKi8KKwljZmJsay0+aWZybV9zcGMgPSA2OwkvKiA5NiBiaXQgdGltZXMgaW50ZXJmcmFtZSBzcGFjaW5nICovCisJCisJLyogQnl0ZSA1ICovCisJY2ZibGstPnNsb3R0aW1fbG93ID0gMDsgLyogNTEyIGJpdCB0aW1lcyBzbG90IHRpbWUgKGxvdykgKi8KKwkKKwkvKiBCeXRlIDYgKi8KKwljZmJsay0+c2xvdHRpbV9oaSA9IDI7CS8qIDUxMiBiaXQgdGltZXMgc2xvdCB0aW1lIChoaWdoKSAqLworCWNmYmxrLT5tYXhfcmV0ciA9IDE1OwkvKiAxNSBjb2xsaXNpb25zIHJldHJpZXMgKi8KKwkKKwkvKiBCeXRlIDcgKi8KKwljZmJsay0+cHJtaXNjID0gKChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpID8gMSA6IDApOyAvKiBQcm9taXNjdW91cyBtb2RlICovCisJY2ZibGstPmJjX2RpcyA9IDA7CS8qIEVuYWJsZSBicm9hZGNhc3QgcmVjZXB0aW9uICovCisJY2ZibGstPmNyc18xID0gMDsJLyogRG9uJ3QgdHJhbnNtaXQgd2l0aG91dCBjYXJyaWVyIHNlbnNlICovCisJY2ZibGstPm5vY3JjX2lucyA9IDA7CS8qIGk4MjU5MyBnZW5lcmF0ZXMgQ1JDICovCisJY2ZibGstPmNyY18xNjMyID0gMDsJLyogMzItYml0IEF1dG9kaW4tSUkgQ1JDICovCisJY2ZibGstPmNyc19jZHQgPSAwOwkvKiBDRCBub3QgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgQ1MgKi8KKwkKKwkvKiBCeXRlIDggKi8KKwljZmJsay0+Y3NfZmlsdGVyID0gMDsgIAkvKiBDUyBpcyByZWNvZ25pemVkIGltbWVkaWF0ZWx5ICovCisJY2ZibGstPmNyc19zcmMgPSAwOwkvKiBFeHRlcm5hbCBjYXJyaWVyIHNlbnNlICovCisJY2ZibGstPmNkX2ZpbHRlciA9IDA7ICAJLyogQ0QgaXMgcmVjb2duaXplZCBpbW1lZGlhdGVseSAqLworCQorCS8qIEJ5dGUgOSAqLworCWNmYmxrLT5taW5fZnJfbGVuID0gRVRIX1pMRU4gPj4gMjsgLyogTWluaW11bSBmcmFtZSBsZW5ndGggKi8KKwkKKwkvKiBCeXRlIEEgKi8KKwljZmJsay0+bG5nX3R5cCA9IDE7CS8qIFR5cGUvbGVuZ3RoIGNoZWNrcyBPRkYgKi8KKwljZmJsay0+bG5nX2ZsZCA9IDE7IAkvKiBEaXNhYmxlIDgwMi4zIGxlbmd0aCBmaWVsZCBjaGVjayAqLworCWNmYmxrLT5yeGNyY194ZiA9IDE7CS8qIERvbid0IHRyYW5zZmVyIENSQyB0byBtZW1vcnkgKi8KKwljZmJsay0+YXJ0eCA9IDE7CS8qIERpc2FibGUgYXV0b21hdGljIHJldHJhbnNtaXNzaW9uICovCisJY2ZibGstPnNhcmVjID0gMTsJLyogRGlzYWJsZSBzb3VyY2UgYWRkciB0cmlnIG9mIENEICovCisJY2ZibGstPnR4X2phYmJlciA9IDA7CS8qIERpc2FibGUgamFiYmVyIGphbSBzZXF1ZW5jZSAqLworCWNmYmxrLT5oYXNoXzEgPSAxOyAJLyogVXNlIGJpdHMgMC01IGluIG1jIGFkZHJlc3MgaGFzaCAqLworCWNmYmxrLT5sYnBrcG9sID0gMDsgCS8qIExvb3BiYWNrIHBpbiBhY3RpdmUgaGlnaCAqLworCQorCS8qIEJ5dGUgQiAqLworCWNmYmxrLT5mZHggPSAwOwkJLyogRGlzYWJsZSBmdWxsIGR1cGxleCBvcGVyYXRpb24gKi8KKwkKKwkvKiBCeXRlIEMgKi8KKwljZmJsay0+ZHVtbXlfNiA9IDB4M2Y7IAkvKiBhbGwgb25lcywgRGVmYXVsdCBtdWx0aWNhc3QgYWRkcmVzc2VzICYgYmFja29mZi4gKi8KKwljZmJsay0+bXVsdF9pYSA9IDA7CS8qIE5vIG11bHRpcGxlIGluZGl2aWR1YWwgYWRkcmVzc2VzICovCisJY2ZibGstPmRpc19ib2YgPSAwOwkvKiBEaXNhYmxlIHRoZSBiYWNrb2ZmIGFsZ29yaXRobSA/ISAqLworCQorCS8qIEJ5dGUgRCAqLworCWNmYmxrLT5kdW1teV8xID0gMTsgCS8qIHNldCB0byAxICovCisJY2ZibGstPnR4X2lmc19yZXRyaWcgPSAzOyAvKiBIbW0uLi4gRGlzYWJsZWQgKi8KKwljZmJsay0+bWNfYWxsID0gKGRldi0+bWNfbGlzdCB8fCAoZGV2LT5mbGFncyZJRkZfQUxMTVVMVEkpKTsvKiBtdWx0aWNhc3QgYWxsIG1vZGUgKi8KKwljZmJsay0+cmN2X21vbiA9IDA7CS8qIE1vbml0b3IgbW9kZSBkaXNhYmxlZCAqLworCWNmYmxrLT5mcmFnX2FjcHQgPSAwOwkvKiBEbyBub3QgYWNjZXB0IGZyYWdtZW50cyAqLworCWNmYmxrLT50c3RydHRycyA9IDA7CS8qIE5vIHN0YXJ0IHRyYW5zbWlzc2lvbiB0aHJlc2hvbGQgKi8KKwkKKwkvKiBCeXRlIEUgKi8KKwljZmJsay0+ZnJldHggPSAxOwkvKiBGSUZPIGF1dG9tYXRpYyByZXRyYW5zbWlzc2lvbiAqLworCWNmYmxrLT5ydW50X2VvcCA9IDA7CS8qIGRyb3AgInJ1bnQiIHBhY2tldHMgKi8KKwljZmJsay0+aHdfc3dfcGluID0gMDsJLyogPz8gKi8KKwljZmJsay0+YmlnX2VuZG4gPSAwOwkvKiBCaWcgRW5kaWFuID8gbm8uLi4gKi8KKwljZmJsay0+c3luY3JxcyA9IDE7CS8qIFN5bmNocm9ub3VzIERSUSBkZWFzc2VydGlvbi4uLiAqLworCWNmYmxrLT5zdHRsZW4gPSAxOyAgCS8qIDYgYnl0ZSBzdGF0dXMgcmVnaXN0ZXJzICovCisJY2ZibGstPnJ4X2VvcCA9IDA7ICAJLyogU2lnbmFsIEVPUCBvbiBwYWNrZXQgcmVjZXB0aW9uICovCisJY2ZibGstPnR4X2VvcCA9IDA7ICAJLyogU2lnbmFsIEVPUCBvbiBwYWNrZXQgdHJhbnNtaXNzaW9uICovCisKKwkvKiBCeXRlIEYgKi8KKwljZmJsay0+cmJ1Zl9zaXplID0gUlhfQlVGX1NJWkUgPj4gMTI7IC8qIFNldCByZWNlaXZlIGJ1ZmZlciBzaXplICovCisJY2ZibGstPnJjdnN0b3AgPSAxOyAJLyogRW5hYmxlIFJlY2VpdmUgU3RvcCBSZWdpc3RlciAqLworCisJaWYgKHpuZXRfZGVidWcgPiAyKSB7CisJCWludCBpOworCQl1bnNpZ25lZCBjaGFyICpjOworCisJCWZvciAoaSA9IDAsIGMgPSAoY2hhciAqKSBjZmJsazsgaSA8IHNpemVvZiAoKmNmYmxrKTsgaSsrKQorCQkJcHJpbnRrICgiJTAyWCAiLCBjW2ldKTsKKwkJcHJpbnRrICgiXG4iKTsKKwl9CisJCisJKnpuZXQtPnR4X2N1cisrID0gc2l6ZW9mKHN0cnVjdCBpODI1OTNfY29uZl9ibG9jayk7CisJbWVtY3B5KHpuZXQtPnR4X2N1ciwgY2ZibGssIHNpemVvZihzdHJ1Y3QgaTgyNTkzX2NvbmZfYmxvY2spKTsKKwl6bmV0LT50eF9jdXIgKz0gc2l6ZW9mKHN0cnVjdCBpODI1OTNfY29uZl9ibG9jaykvMjsKKwlvdXRiKE9QMF9DT05GSUdVUkUgfCBDUjBfQ0hOTCwgaW9hZGRyKTsKKworCS8qIFhYWCBGSVhNRSBtYXogOiBBZGQgbXVsdGljYXN0IGFkZHJlc3NlcyBoZXJlLCBzbyBoYXZpbmcgYQorCSAqIG11bHRpY2FzdCBhZGRyZXNzIGNvbmZpZ3VyZWQgaXNuJ3QgZXF1YWwgdG8gSUZGX0FMTE1VTFRJICovCit9CisMCisvKiBUaGUgWi1Ob3RlIHByb2JlIGlzIHByZXR0eSBlYXN5LiAgVGhlIE5FVElEQkxLIGV4aXN0cyBpbiB0aGUgc2FmZS10by1wcm9iZQorICAgQklPUyBhcmVhLiAgV2UganVzdCBzY2FuIGZvciB0aGUgc2lnbmF0dXJlLCBhbmQgcHVsbCB0aGUgdml0YWwgcGFyYW1ldGVycworICAgb3V0IG9mIHRoZSBzdHJ1Y3R1cmUuICovCisKK3N0YXRpYyBpbnQgX19pbml0IHpuZXRfcHJvYmUgKHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IG5ldGlkYmxrICpuZXRpbmZvOworCXN0cnVjdCB6bmV0X3ByaXZhdGUgKnpuZXQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwljaGFyICpwOworCWludCBlcnIgPSAtRU5PTUVNOworCisJLyogVGhpcyBjb2RlIHNjYW5zIHRoZSByZWdpb24gMHhmMDAwMCB0byAweGZmZmZmIGZvciBhICJORVRJREJMSyIuICovCisJZm9yKHAgPSAoY2hhciAqKXBoeXNfdG9fdmlydCgweGYwMDAwKTsgcCA8IChjaGFyICopcGh5c190b192aXJ0KDB4MTAwMDAwKTsgcCsrKQorCQlpZiAoKnAgPT0gJ04nICAmJiAgc3RybmNtcChwLCAiTkVUSURCTEsiLCA4KSA9PSAwKQorCQkJYnJlYWs7CisKKwlpZiAocCA+PSAoY2hhciAqKXBoeXNfdG9fdmlydCgweDEwMDAwMCkpIHsKKwkJaWYgKHpuZXRfZGVidWcgPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiTm8gWi1Ob3RlIGV0aGVybmV0IGFkYXB0b3IgZm91bmQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCB6bmV0X3ByaXZhdGUpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlTRVRfTU9EVUxFX09XTkVSIChkZXYpOworCisJem5ldCA9IGRldi0+cHJpdjsKKworCW5ldGluZm8gPSAoc3RydWN0IG5ldGlkYmxrICopcDsKKwlkZXYtPmJhc2VfYWRkciA9IG5ldGluZm8tPmlvYmFzZTE7CisJZGV2LT5pcnEgPSBuZXRpbmZvLT5pcnExOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFpORVQgYXQgJSMzbHgsIiwgZGV2LT5uYW1lLCBkZXYtPmJhc2VfYWRkcik7CisKKwkvKiBUaGUgc3RhdGlvbiBhZGRyZXNzIGlzIGluIHRoZSAibmV0aWRibGsiIGF0IDB4MGYwMDAwLiAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXByaW50aygiICUyLjJ4IiwgZGV2LT5kZXZfYWRkcltpXSA9IG5ldGluZm8tPm5ldGlkW2ldKTsKKworCXByaW50aygiLCB1c2luZyBJUlEgJWQgRE1BICVkIGFuZCAlZC5cbiIsIGRldi0+aXJxLCBuZXRpbmZvLT5kbWExLAorCSAgICAgICBuZXRpbmZvLT5kbWEyKTsKKworCWlmICh6bmV0X2RlYnVnID4gMSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogdmVuZG9yICclMTYuMTZzJyBJUlExICVkIElSUTIgJWQgRE1BMSAlZCBETUEyICVkLlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbmV0aW5mby0+dmVuZG9yLAorCQkgICAgICAgbmV0aW5mby0+aXJxMSwgbmV0aW5mby0+aXJxMiwKKwkJICAgICAgIG5ldGluZm8tPmRtYTEsIG5ldGluZm8tPmRtYTIpOworCQlwcmludGsoS0VSTl9JTkZPICIlczogaW9iYXNlMSAlI3ggc2l6ZSAlZCBpb2Jhc2UyICUjeCBzaXplICVkIG5ldCB0eXBlICUyLjJ4LlxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgbmV0aW5mby0+aW9iYXNlMSwgbmV0aW5mby0+aW9zaXplMSwKKwkJICAgICAgIG5ldGluZm8tPmlvYmFzZTIsIG5ldGluZm8tPmlvc2l6ZTIsIG5ldGluZm8tPm5ldHR5cGUpOworCX0KKworCWlmICh6bmV0X2RlYnVnID4gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCXpuZXQtPnJ4X2RtYSA9IG5ldGluZm8tPmRtYTE7CisJem5ldC0+dHhfZG1hID0gbmV0aW5mby0+ZG1hMjsKKwlzcGluX2xvY2tfaW5pdCgmem5ldC0+bG9jayk7CisJem5ldC0+c2lhX2Jhc2UgPSAweGU2OwkvKiBNYWdpYyBhZGRyZXNzIGZvciB0aGUgODI1MDEgU0lBICovCisJem5ldC0+c2lhX3NpemUgPSAyOworCS8qIG1hejogRGVzcGl0ZSB0aGUgJzU5MyBiZWluZyBhZHZlcnRpc2VkIGFib3ZlIGFzIHVzaW5nIGEKKwkgKiBzaW5nbGUgOGJpdHMgSS9PIHBvcnQsIHRoaXMgZHJpdmVyIGRvZXMgbWFueSAxNmJpdHMKKwkgKiBhY2Nlc3MuIFNvIHNldCBpb19zaXplIGFjY29yZGluZ2x5ICovCisJem5ldC0+aW9fc2l6ZSAgPSAyOworCisJaWYgKCEoem5ldC0+cnhfc3RhcnQgPSBrbWFsbG9jIChETUFfQlVGX1NJWkUsIEdGUF9LRVJORUwgfCBHRlBfRE1BKSkpCisJCWdvdG8gZnJlZV9kZXY7CisJaWYgKCEoem5ldC0+dHhfc3RhcnQgPSBrbWFsbG9jIChETUFfQlVGX1NJWkUsIEdGUF9LRVJORUwgfCBHRlBfRE1BKSkpCisJCWdvdG8gZnJlZV9yeDsKKworCWlmICghZG1hX3BhZ2VfZXEgKHpuZXQtPnJ4X3N0YXJ0LCB6bmV0LT5yeF9zdGFydCArIChSWF9CVUZfU0laRS8yLTEpKSB8fAorCSAgICAhZG1hX3BhZ2VfZXEgKHpuZXQtPnR4X3N0YXJ0LCB6bmV0LT50eF9zdGFydCArIChUWF9CVUZfU0laRS8yLTEpKSkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyAidHgvcnggY3Jvc3NpbmcgRE1BIGZyb250aWVycywgZ2l2aW5nIHVwXG4iKTsKKwkJZ290byBmcmVlX3R4OworCX0KKwkKKwl6bmV0LT5yeF9lbmQgPSB6bmV0LT5yeF9zdGFydCArIFJYX0JVRl9TSVpFLzI7CisJem5ldC0+dHhfYnVmX2xlbiA9IFRYX0JVRl9TSVpFLzI7CisJem5ldC0+dHhfZW5kID0gem5ldC0+dHhfc3RhcnQgKyB6bmV0LT50eF9idWZfbGVuOworCisJLyogVGhlIFpORVQtc3BlY2lmaWMgZW50cmllcyBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm9wZW4gPSAmem5ldF9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gJnpuZXRfc2VuZF9wYWNrZXQ7CisJZGV2LT5zdG9wID0gJnpuZXRfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMJPSBuZXRfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJnpuZXRfc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+dHhfdGltZW91dCA9IHpuZXRfdHhfdGltZW91dDsKKwlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGZyZWVfdHg7CisJem5ldF9kZXYgPSBkZXY7CisJcmV0dXJuIDA7CisKKyBmcmVlX3R4OgorCWtmcmVlKHpuZXQtPnR4X3N0YXJ0KTsKKyBmcmVlX3J4OgorCWtmcmVlKHpuZXQtPnJ4X3N0YXJ0KTsKKyBmcmVlX2RldjoKKwlmcmVlX25ldGRldihkZXYpOworCXJldHVybiBlcnI7Cit9CisKKwwKK3N0YXRpYyBpbnQgem5ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCisJaWYgKHpuZXRfZGVidWcgPiAyKQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHpuZXRfb3BlbigpIGNhbGxlZC5cbiIsIGRldi0+bmFtZSk7CisKKwkvKiBUaGVzZSBzaG91bGQgbmV2ZXIgZmFpbC4gIFlvdSBjYW4ndCBhZGQgZGV2aWNlcyB0byBhIHNlYWxlZCBib3ghICovCisJaWYgKHpuZXRfcmVxdWVzdF9yZXNvdXJjZXMgKGRldikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vdCBvcGVuZWQgLS0gcmVzb3VyY2UgYnVzeT8hP1xuIiwgZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwl6bmV0X3RyYW5zY2VpdmVyX3Bvd2VyIChkZXYsIDEpOworCQorCS8qIEFjY29yZGluZyB0byB0aGUgQ3J5bndyIGRyaXZlciB3ZSBzaG91bGQgd2FpdCA1MCBtc2VjLiBmb3IgdGhlCisJICAgTEFOIGNsb2NrIHRvIHN0YWJpbGl6ZS4gIE15IGV4cGVyaW1lbnRzIGluZGljYXRlcyB0aGF0IHRoZSAnNTkzIGNhbgorCSAgIGJlIGluaXRpYWxpemVkIGltbWVkaWF0ZWx5LiAgVGhlIGRlbGF5IGlzIHByb2JhYmx5IG5lZWRlZCBmb3IgdGhlCisJICAgREMtdG8tREMgY29udmVydGVyIHRvIGNvbWUgdXAgdG8gZnVsbCB2b2x0YWdlLCBhbmQgZm9yIHRoZSBvc2NpbGxhdG9yCisJICAgdG8gYmUgc3BvdC1vbiBhdCAyME1oeiBiZWZvcmUgdHJhbnNtaXR0aW5nLgorCSAgIFVudGlsIHRoaXMgcHJvdmVzIHRvIGJlIGEgcHJvYmxlbSB3ZSByZWx5IG9uIHRoZSBoaWdoZXIgbGF5ZXJzIGZvciB0aGUKKwkgICBkZWxheSBhbmQgc2F2ZSBhbGxvY2F0aW5nIGEgdGltZXIgZW50cnkuICovCisKKwkvKiBtYXogOiBXZWxsLCBJJ20gZ2V0dGluZyBldmVyeSB0aW1lIHRoZSBmb2xsb3dpbmcgbWVzc2FnZQorCSAqIHdpdGhvdXQgdGhlIGRlbGF5IG9uIGEgNDg2QDMzLiBUaGlzIG1hY2hpbmUgaXMgbXVjaCB0b28KKwkgKiBmYXN0Li4uIDotKSBTbyBtYXliZSB0aGUgQ3J5bndyIGRyaXZlciB3YXNuJ3Qgd3JvbmcgYWZ0ZXIKKwkgKiBhbGwsIGV2ZW4gaWYgdGhlIG1lc3NhZ2UgaXMgY29tcGxldGx5IGhhcm1sZXNzIG9uIG15CisJICogc2V0dXAuICovCisJbWRlbGF5ICg1MCk7CisJCisJLyogVGhpcyBmb2xsb3dzIHRoZSBwYWNrZXQgZHJpdmVyJ3MgbGVhZCwgYW5kIGNoZWNrcyBmb3Igc3VjY2Vzcy4gKi8KKwlpZiAoaW5iKGlvYWRkcikgIT0gMHgxMCAmJiBpbmIoaW9hZGRyKSAhPSAweDAwKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUHJvYmxlbSB0dXJuaW5nIG9uIHRoZSB0cmFuc2NlaXZlciBwb3dlci5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCisJaGFyZHdhcmVfaW5pdChkZXYpOworCW5ldGlmX3N0YXJ0X3F1ZXVlIChkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgem5ldF90eF90aW1lb3V0IChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKwl1c2hvcnQgZXZlbnQsIHR4X3N0YXR1cywgcnhfb2Zmc2V0LCBzdGF0ZTsKKworCW91dGIgKENSMF9TVEFUVVNfMCwgaW9hZGRyKTsKKwlldmVudCA9IGluYiAoaW9hZGRyKTsKKwlvdXRiIChDUjBfU1RBVFVTXzEsIGlvYWRkcik7CisJdHhfc3RhdHVzID0gaW53IChpb2FkZHIpOworCW91dGIgKENSMF9TVEFUVVNfMiwgaW9hZGRyKTsKKwlyeF9vZmZzZXQgPSBpbncgKGlvYWRkcik7CisJb3V0YiAoQ1IwX1NUQVRVU18zLCBpb2FkZHIpOworCXN0YXRlID0gaW5iIChpb2FkZHIpOworCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogdHJhbnNtaXQgdGltZWQgb3V0LCBzdGF0dXMgJTAyeCAlMDR4ICUwNHggJTAyeCwiCisJICIgcmVzZXR0aW5nLlxuIiwgZGV2LT5uYW1lLCBldmVudCwgdHhfc3RhdHVzLCByeF9vZmZzZXQsIHN0YXRlKTsKKwlpZiAodHhfc3RhdHVzID09IFRYX0xPU1RfQ1JTKQorCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IFR4IGNhcnJpZXIgZXJyb3IsIGNoZWNrIHRyYW5zY2VpdmVyIGNhYmxlLlxuIiwKKwkJCWRldi0+bmFtZSk7CisJb3V0YiAoT1AwX1JFU0VULCBpb2FkZHIpOworCWhhcmR3YXJlX2luaXQgKGRldik7CisJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKK30KKworc3RhdGljIGludCB6bmV0X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXN0cnVjdCB6bmV0X3ByaXZhdGUgKnpuZXQgPSBkZXYtPnByaXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaG9ydCBsZW5ndGggPSBza2ItPmxlbjsKKworCWlmICh6bmV0X2RlYnVnID4gNCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBaTmV0X3NlbmRfcGFja2V0LlxuIiwgZGV2LT5uYW1lKTsKKworCWlmIChsZW5ndGggPCBFVEhfWkxFTikgeworCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7CisJCWlmIChza2IgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQlsZW5ndGggPSBFVEhfWkxFTjsKKwl9CisJCisJbmV0aWZfc3RvcF9xdWV1ZSAoZGV2KTsKKwkKKwkvKiBDaGVjayB0aGF0IHRoZSBwYXJ0IGhhc24ndCByZXNldCBpdHNlbGYsIHByb2JhYmx5IGZyb20gc3VzcGVuZC4gKi8KKwlvdXRiKENSMF9TVEFUVVNfMCwgaW9hZGRyKTsKKwlpZiAoaW53KGlvYWRkcikgPT0gMHgwMDEwICYmCisJICAgIGludyhpb2FkZHIpID09IDB4MDAwMCAmJgorCSAgICBpbncoaW9hZGRyKSA9PSAweDAwMTApIHsKKwkJaWYgKHpuZXRfZGVidWcgPiAxKQorCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzIDogd2FraW5nIHVwXG4iLCBkZXYtPm5hbWUpOworCQloYXJkd2FyZV9pbml0KGRldik7CisJCXpuZXRfdHJhbnNjZWl2ZXJfcG93ZXIgKGRldiwgMSk7CisJfQorCisJaWYgKDEpIHsKKwkJdW5zaWduZWQgY2hhciAqYnVmID0gKHZvaWQgKilza2ItPmRhdGE7CisJCXVzaG9ydCAqdHhfbGluayA9IHpuZXQtPnR4X2N1ciAtIDE7CisJCXVzaG9ydCBybmRfbGVuID0gKGxlbmd0aCArIDEpPj4xOworCQkKKwkJem5ldC0+c3RhdHMudHhfYnl0ZXMrPWxlbmd0aDsKKworCQlpZiAoem5ldC0+dHhfY3VyID49IHpuZXQtPnR4X2VuZCkKKwkJICB6bmV0LT50eF9jdXIgPSB6bmV0LT50eF9zdGFydDsKKwkJKnpuZXQtPnR4X2N1cisrID0gbGVuZ3RoOworCQlpZiAoem5ldC0+dHhfY3VyICsgcm5kX2xlbiArIDEgPiB6bmV0LT50eF9lbmQpIHsKKwkJCWludCBzZW1pX2NudCA9ICh6bmV0LT50eF9lbmQgLSB6bmV0LT50eF9jdXIpPDwxOyAvKiBDdnJ0IHRvIGJ5dGUgY250LiAqLworCQkJbWVtY3B5KHpuZXQtPnR4X2N1ciwgYnVmLCBzZW1pX2NudCk7CisJCQlybmRfbGVuIC09IHNlbWlfY250Pj4xOworCQkJbWVtY3B5KHpuZXQtPnR4X3N0YXJ0LCBidWYgKyBzZW1pX2NudCwgbGVuZ3RoIC0gc2VtaV9jbnQpOworCQkJem5ldC0+dHhfY3VyID0gem5ldC0+dHhfc3RhcnQgKyBybmRfbGVuOworCQl9IGVsc2UgeworCQkJbWVtY3B5KHpuZXQtPnR4X2N1ciwgYnVmLCBza2ItPmxlbik7CisJCQl6bmV0LT50eF9jdXIgKz0gcm5kX2xlbjsKKwkJfQorCQkqem5ldC0+dHhfY3VyKysgPSAwOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ6bmV0LT5sb2NrLCBmbGFncyk7CisJCXsKKwkJCSp0eF9saW5rID0gT1AwX1RSQU5TTUlUIHwgQ1IwX0NITkw7CisJCQkvKiBJcyB0aGlzIGFsd2F5cyBzYWZlIHRvIGRvPyAqLworCQkJb3V0YihPUDBfVFJBTlNNSVQgfCBDUjBfQ0hOTCwgaW9hZGRyKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmem5ldC0+bG9jaywgZmxhZ3MpOworCisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCQluZXRpZl9zdGFydF9xdWV1ZSAoZGV2KTsKKworCQlpZiAoem5ldF9kZWJ1ZyA+IDQpCisJCSAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUcmFuc21pdHRlciBxdWV1ZWQsIGxlbmd0aCAlZC5cbiIsIGRldi0+bmFtZSwgbGVuZ3RoKTsKKwl9CisJZGV2X2tmcmVlX3NrYihza2IpOyAKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIFpORVQgaW50ZXJydXB0IGhhbmRsZXIuICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgem5ldF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKKwlzdHJ1Y3Qgem5ldF9wcml2YXRlICp6bmV0ID0gZGV2LT5wcml2OworCWludCBpb2FkZHI7CisJaW50IGJvZ3VzY250ID0gMjA7CisJaW50IGhhbmRsZWQgPSAwOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInpuZXRfaW50ZXJydXB0KCk6IElSUSAlZCBmb3IgdW5rbm93biBkZXZpY2UuXG4iLCBpcnEpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJc3Bpbl9sb2NrICgmem5ldC0+bG9jayk7CisJCisJaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisKKwlvdXRiKENSMF9TVEFUVVNfMCwgaW9hZGRyKTsKKwlkbyB7CisJCXVzaG9ydCBzdGF0dXMgPSBpbmIoaW9hZGRyKTsKKwkJaWYgKHpuZXRfZGVidWcgPiA1KSB7CisJCQl1c2hvcnQgcmVzdWx0LCByeF9wdHIsIHJ1bm5pbmc7CisJCQlvdXRiKENSMF9TVEFUVVNfMSwgaW9hZGRyKTsKKwkJCXJlc3VsdCA9IGludyhpb2FkZHIpOworCQkJb3V0YihDUjBfU1RBVFVTXzIsIGlvYWRkcik7CisJCQlyeF9wdHIgPSBpbncoaW9hZGRyKTsKKwkJCW91dGIoQ1IwX1NUQVRVU18zLCBpb2FkZHIpOworCQkJcnVubmluZyA9IGluYihpb2FkZHIpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpbnRlcnJ1cHQsIHN0YXR1cyAlMDJ4LCAlMDR4ICUwNHggJTAyeCBzZXJpYWwgJWQuXG4iLAorCQkJCSBkZXYtPm5hbWUsIHN0YXR1cywgcmVzdWx0LCByeF9wdHIsIHJ1bm5pbmcsIGJvZ3VzY250KTsKKwkJfQorCQlpZiAoKHN0YXR1cyAmIFNSMF9JTlRFUlJVUFQpID09IDApCisJCQlicmVhazsKKworCQloYW5kbGVkID0gMTsKKworCQlpZiAoKHN0YXR1cyAmIFNSMF9FVkVOVF9NQVNLKSA9PSBTUjBfVFJBTlNNSVRfRE9ORSB8fAorCQkgICAgKHN0YXR1cyAmIFNSMF9FVkVOVF9NQVNLKSA9PSBTUjBfUkVUUkFOU01JVF9ET05FIHx8CisJCSAgICAoc3RhdHVzICYgU1IwX0VWRU5UX01BU0spID09IFNSMF9UUkFOU01JVF9OT19DUkNfRE9ORSkgeworCQkJaW50IHR4X3N0YXR1czsKKwkJCW91dGIoQ1IwX1NUQVRVU18xLCBpb2FkZHIpOworCQkJdHhfc3RhdHVzID0gaW53KGlvYWRkcik7CisJCQkvKiBJdCdzIHVuZG9jdW1lbnRlZCwgYnV0IHR4X3N0YXR1cyBzZWVtcyB0byBtYXRjaCB0aGUgaTgyNTg2LiAqLworCQkJaWYgKHR4X3N0YXR1cyAmIFRYX09LKSB7CisJCQkJem5ldC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJCXpuZXQtPnN0YXRzLmNvbGxpc2lvbnMgKz0gdHhfc3RhdHVzICYgVFhfTkNPTF9NQVNLOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodHhfc3RhdHVzICYgKFRYX0xPU1RfQ1RTIHwgVFhfTE9TVF9DUlMpKQorCQkJCQl6bmV0LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQkJCWlmICh0eF9zdGF0dXMgJiBUWF9VTkRfUlVOKQorCQkJCQl6bmV0LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCQkJCWlmICghKHR4X3N0YXR1cyAmIFRYX0hSVF9CRUFUKSkKKwkJCQkJem5ldC0+c3RhdHMudHhfaGVhcnRiZWF0X2Vycm9ycysrOworCQkJCWlmICh0eF9zdGF0dXMgJiBUWF9NQVhfQ09MKQorCQkJCQl6bmV0LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOworCQkJCS8qIC4uLmFuZCB0aGUgY2F0Y2gtYWxsLiAqLworCQkJCWlmICgodHhfc3RhdHVzIHwgKFRYX0xPU1RfQ1JTIHwgVFhfTE9TVF9DVFMgfCBUWF9VTkRfUlVOIHwgVFhfSFJUX0JFQVQgfCBUWF9NQVhfQ09MKSkgIT0gKFRYX0xPU1RfQ1JTIHwgVFhfTE9TVF9DVFMgfCBUWF9VTkRfUlVOIHwgVFhfSFJUX0JFQVQgfCBUWF9NQVhfQ09MKSkKKwkJCQkJem5ldC0+c3RhdHMudHhfZXJyb3JzKys7CisKKwkJCQkvKiBUcmFuc2NlaXZlciBtYXkgYmUgc3R1Y2sgaWYgY2FibGUKKwkJCQkgKiB3YXMgcmVtb3ZlZCB3aGlsZSBlbWl0aW5nIGEKKwkJCQkgKiBwYWNrZXQuIEZsaXAgaXQgb2ZmLCB0aGVuIG9uIHRvCisJCQkJICogcmVzZXQgaXQuIFRoaXMgaXMgdmVyeSBlbXBpcmljYWwsCisJCQkJICogYnV0IGl0IHNlZW1zIHRvIHdvcmsuICovCisJCQkJCisJCQkJem5ldF90cmFuc2NlaXZlcl9wb3dlciAoZGV2LCAwKTsKKwkJCQl6bmV0X3RyYW5zY2VpdmVyX3Bvd2VyIChkZXYsIDEpOworCQkJfQorCQkJbmV0aWZfd2FrZV9xdWV1ZSAoZGV2KTsKKwkJfQorCisJCWlmICgoc3RhdHVzICYgU1IwX1JFQ0VQVElPTikgfHwKKwkJICAgIChzdGF0dXMgJiBTUjBfRVZFTlRfTUFTSykgPT0gU1IwX1NUT1BfUkVHX0hJVCkgeworCQkJem5ldF9yeChkZXYpOworCQl9CisJCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHRzIHdlJ3ZlIGhhbmRsZWQuICovCisJCW91dGIoQ1IwX0lOVF9BQ0ssIGlvYWRkcik7CisJfSB3aGlsZSAoYm9ndXNjbnQtLSk7CisKKwlzcGluX3VubG9jayAoJnpuZXQtPmxvY2spOworCQorCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgdm9pZCB6bmV0X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHpuZXRfcHJpdmF0ZSAqem5ldCA9IGRldi0+cHJpdjsKKwlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGJvZ3VzY291bnQgPSAxOworCXNob3J0IG5leHRfZnJhbWVfZW5kX29mZnNldCA9IDA7IAkJLyogT2Zmc2V0IG9mIG5leHQgZnJhbWUgc3RhcnQuICovCisJc2hvcnQgKmN1cl9mcmFtZV9lbmQ7CisJc2hvcnQgY3VyX2ZyYW1lX2VuZF9vZmZzZXQ7CisKKwlvdXRiKENSMF9TVEFUVVNfMiwgaW9hZGRyKTsKKwljdXJfZnJhbWVfZW5kX29mZnNldCA9IGludyhpb2FkZHIpOworCisJaWYgKGN1cl9mcmFtZV9lbmRfb2Zmc2V0ID09IHpuZXQtPnJ4X2N1ciAtIHpuZXQtPnJ4X3N0YXJ0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBJbnRlcnJ1cHRlZCwgYnV0IG5vdGhpbmcgdG8gcmVjZWl2ZSwgb2Zmc2V0ICUwM3guXG4iLAorCQkJICAgZGV2LT5uYW1lLCBjdXJfZnJhbWVfZW5kX29mZnNldCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBVc2Ugc2FtZSBtZXRob2QgYXMgdGhlIENyeW53ciBkcml2ZXI6IGNvbnN0cnVjdCBhIGZvcndhcmQgbGlzdCBpbgorCSAgIHRoZSBzYW1lIGFyZWEgb2YgdGhlIGJhY2t3YXJkcyBsaW5rcyB3ZSBub3cgaGF2ZS4gIFRoaXMgYWxsb3dzIHVzIHRvCisJICAgcGFzcyBwYWNrZXRzIHRvIHRoZSB1cHBlciBsYXllcnMgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSByZWNlaXZlZCAtLQorCSAgIGltcG9ydGFudCBmb3IgZmFzdC1wYXRoIHNlcXVlbnRpYWwgb3BlcmF0aW9ucy4gKi8KKwkgd2hpbGUgKHpuZXQtPnJ4X3N0YXJ0ICsgY3VyX2ZyYW1lX2VuZF9vZmZzZXQgIT0gem5ldC0+cnhfY3VyCisJCQkmJiArK2JvZ3VzY291bnQgPCA1KSB7CisJCXVuc2lnbmVkIHNob3J0IGhpX2NudCwgbG9fY250LCBoaV9zdGF0dXMsIGxvX3N0YXR1czsKKwkJaW50IGNvdW50LCBzdGF0dXM7CisKKwkJaWYgKGN1cl9mcmFtZV9lbmRfb2Zmc2V0IDwgNCkgeworCQkJLyogT2ggbm8sIHdlIGhhdmUgYSBzcGVjaWFsIGNhc2U6IHRoZSBmcmFtZSB0cmFpbGVyIHdyYXBzIGFyb3VuZAorCQkJICAgdGhlIGVuZCBvZiB0aGUgcmluZyBidWZmZXIuICBXZSd2ZSBzYXZlZCBzcGFjZSBhdCB0aGUgZW5kIG9mCisJCQkgICB0aGUgcmluZyBidWZmZXIgZm9yIGp1c3QgdGhpcyBwcm9ibGVtLiAqLworCQkJbWVtY3B5KHpuZXQtPnJ4X2VuZCwgem5ldC0+cnhfc3RhcnQsIDgpOworCQkJY3VyX2ZyYW1lX2VuZF9vZmZzZXQgKz0gKFJYX0JVRl9TSVpFLzIpOworCQl9CisJCWN1cl9mcmFtZV9lbmQgPSB6bmV0LT5yeF9zdGFydCArIGN1cl9mcmFtZV9lbmRfb2Zmc2V0IC0gNDsKKworCQlsb19zdGF0dXMgPSAqY3VyX2ZyYW1lX2VuZCsrOworCQloaV9zdGF0dXMgPSAqY3VyX2ZyYW1lX2VuZCsrOworCQlzdGF0dXMgPSAoKGhpX3N0YXR1cyAmIDB4ZmYpIDw8IDgpICsgKGxvX3N0YXR1cyAmIDB4ZmYpOworCQlsb19jbnQgPSAqY3VyX2ZyYW1lX2VuZCsrOworCQloaV9jbnQgPSAqY3VyX2ZyYW1lX2VuZCsrOworCQljb3VudCA9ICgoaGlfY250ICYgMHhmZikgPDwgOCkgKyAobG9fY250ICYgMHhmZik7CisKKwkJaWYgKHpuZXRfZGVidWcgPiA1KQorCQkgIHByaW50ayhLRVJOX0RFQlVHICJDb25zdHJ1Y3RpbmcgdHJhaWxlciBhdCBsb2NhdGlvbiAlMDN4LCAlMDR4ICUwNHggJTA0eCAlMDR4IgorCQkJCSAiIGNvdW50ICUjeCBzdGF0dXMgJTA0eC5cbiIsCisJCQkJIGN1cl9mcmFtZV9lbmRfb2Zmc2V0PDwxLCBsb19zdGF0dXMsIGhpX3N0YXR1cywgbG9fY250LCBoaV9jbnQsCisJCQkJIGNvdW50LCBzdGF0dXMpOworCQljdXJfZnJhbWVfZW5kWy00XSA9IHN0YXR1czsKKwkJY3VyX2ZyYW1lX2VuZFstM10gPSBuZXh0X2ZyYW1lX2VuZF9vZmZzZXQ7CisJCWN1cl9mcmFtZV9lbmRbLTJdID0gY291bnQ7CisJCW5leHRfZnJhbWVfZW5kX29mZnNldCA9IGN1cl9mcmFtZV9lbmRfb2Zmc2V0OworCQljdXJfZnJhbWVfZW5kX29mZnNldCAtPSAoKGNvdW50ICsgMSk+PjEpICsgMzsKKwkJaWYgKGN1cl9mcmFtZV9lbmRfb2Zmc2V0IDwgMCkKKwkJICBjdXJfZnJhbWVfZW5kX29mZnNldCArPSBSWF9CVUZfU0laRS8yOworCX07CisKKwkvKiBOb3cgc3RlcCAgZm9yd2FyZCB0aHJvdWdoIHRoZSBsaXN0LiAqLworCWRvIHsKKwkJdXNob3J0ICp0aGlzX3JmcF9wdHIgPSB6bmV0LT5yeF9zdGFydCArIG5leHRfZnJhbWVfZW5kX29mZnNldDsKKwkJaW50IHN0YXR1cyA9IHRoaXNfcmZwX3B0clstNF07CisJCWludCBwa3RfbGVuID0gdGhpc19yZnBfcHRyWy0yXTsKKwkgIAorCQlpZiAoem5ldF9kZWJ1ZyA+IDUpCisJCSAgcHJpbnRrKEtFUk5fREVCVUcgIkxvb2tpbmcgYXQgdHJhaWxlciBlbmRpbmcgYXQgJTA0eCBzdGF0dXMgJTA0eCBsZW5ndGggJTAzeCIKKwkJCQkgIiBuZXh0ICUwNHguXG4iLCBuZXh0X2ZyYW1lX2VuZF9vZmZzZXQ8PDEsIHN0YXR1cywgcGt0X2xlbiwKKwkJCQkgdGhpc19yZnBfcHRyWy0zXTw8MSk7CisJCS8qIE9uY2UgYWdhaW4gd2UgbXVzdCBhc3N1bWUgdGhhdCB0aGUgaTgyNTg2IGRvY3MgYXBwbHkuICovCisJCWlmICggISAoc3RhdHVzICYgUlhfUkNWX09LKSkgeyAvKiBUaGVyZSB3YXMgYW4gZXJyb3IuICovCisJCQl6bmV0LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWlmIChzdGF0dXMgJiBSWF9DUkNfRVJSKSB6bmV0LT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQlpZiAoc3RhdHVzICYgUlhfQUxHX0VSUikgem5ldC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisjaWYgMAorCQkJaWYgKHN0YXR1cyAmIDB4MDIwMCkgem5ldC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsgLyogV3JvbmcuICovCisJCQlpZiAoc3RhdHVzICYgMHgwMTAwKSB6bmV0LT5zdGF0cy5yeF9maWZvX2Vycm9ycysrOworI2Vsc2UKKwkJCS8qIG1heiA6IFdpbGQgZ3Vlc3MuLi4gKi8KKwkJCWlmIChzdGF0dXMgJiBSWF9PVlJSVU4pIHpuZXQtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CisjZW5kaWYKKwkJCWlmIChzdGF0dXMgJiBSWF9TUlRfRlJNKSB6bmV0LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCX0gZWxzZSBpZiAocGt0X2xlbiA+IDE1MzYpIHsKKwkJCXpuZXQtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJfSBlbHNlIHsKKwkJCS8qIE1hbGxvYyB1cCBuZXcgYnVmZmVyLiAqLworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3RfbGVuKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCWlmICh6bmV0X2RlYnVnKQorCQkJCSAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iLCBkZXYtPm5hbWUpOworCQkJCXpuZXQtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNrYi0+ZGV2ID0gZGV2OworCisJCQlpZiAoJnpuZXQtPnJ4X2N1clsocGt0X2xlbisxKT4+MV0gPiB6bmV0LT5yeF9lbmQpIHsKKwkJCQlpbnQgc2VtaV9jbnQgPSAoem5ldC0+cnhfZW5kIC0gem5ldC0+cnhfY3VyKTw8MTsKKwkJCQltZW1jcHkoc2tiX3B1dChza2Isc2VtaV9jbnQpLCB6bmV0LT5yeF9jdXIsIHNlbWlfY250KTsKKwkJCQltZW1jcHkoc2tiX3B1dChza2IscGt0X2xlbi1zZW1pX2NudCksIHpuZXQtPnJ4X3N0YXJ0LAorCQkJCQkgICBwa3RfbGVuIC0gc2VtaV9jbnQpOworCQkJfSBlbHNlIHsKKwkJCQltZW1jcHkoc2tiX3B1dChza2IscGt0X2xlbiksIHpuZXQtPnJ4X2N1ciwgcGt0X2xlbik7CisJCQkJaWYgKHpuZXRfZGVidWcgPiA2KSB7CisJCQkJCXVuc2lnbmVkIGludCAqcGFja2V0ID0gKHVuc2lnbmVkIGludCAqKSBza2ItPmRhdGE7CisJCQkJCXByaW50ayhLRVJOX0RFQlVHICJQYWNrZXQgZGF0YSBpcyAlMDh4ICUwOHggJTA4eCAlMDh4LlxuIiwgcGFja2V0WzBdLAorCQkJCQkJICAgcGFja2V0WzFdLCBwYWNrZXRbMl0sIHBhY2tldFszXSk7CisJCQkJfQorCQkgIH0KKwkJICBza2ItPnByb3RvY29sPWV0aF90eXBlX3RyYW5zKHNrYixkZXYpOworCQkgIG5ldGlmX3J4KHNrYik7CisJCSAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJICB6bmV0LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCSAgem5ldC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbjsKKwkJfQorCQl6bmV0LT5yeF9jdXIgPSB0aGlzX3JmcF9wdHI7CisJCWlmICh6bmV0LT5yeF9jdXIgPj0gem5ldC0+cnhfZW5kKQorCQkJem5ldC0+cnhfY3VyIC09IFJYX0JVRl9TSVpFLzI7CisJCXVwZGF0ZV9zdG9wX2hpdChpb2FkZHIsICh6bmV0LT5yeF9jdXIgLSB6bmV0LT5yeF9zdGFydCk8PDEpOworCQluZXh0X2ZyYW1lX2VuZF9vZmZzZXQgPSB0aGlzX3JmcF9wdHJbLTNdOworCQlpZiAobmV4dF9mcmFtZV9lbmRfb2Zmc2V0ID09IDApCQkvKiBSZWFkIGFsbCB0aGUgZnJhbWVzPyAqLworCQkJYnJlYWs7CQkJLyogRG9uZSBmb3Igbm93ICovCisJCXRoaXNfcmZwX3B0ciA9IHpuZXQtPnJ4X3N0YXJ0ICsgbmV4dF9mcmFtZV9lbmRfb2Zmc2V0OworCX0gd2hpbGUgKC0tYm9ndXNjb3VudCk7CisKKwkvKiBJZiBhbnkgd29ydGgtd2hpbGUgcGFja2V0cyBoYXZlIGJlZW4gcmVjZWl2ZWQsIGRldl9yaW50KCkKKwkgICBoYXMgZG9uZSBhIG1hcmtfYmgoSU5FVF9CSCkgZm9yIHVzIGFuZCB3aWxsIHdvcmsgb24gdGhlbQorCSAgIHdoZW4gd2UgZ2V0IHRvIHRoZSBib3R0b20taGFsZiByb3V0aW5lLiAqLworCXJldHVybjsKK30KKworLyogVGhlIGludmVyc2Ugcm91dGluZSB0byB6bmV0X29wZW4oKS4gKi8KK3N0YXRpYyBpbnQgem5ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpb2FkZHIgPSBkZXYtPmJhc2VfYWRkcjsKKworCW5ldGlmX3N0b3BfcXVldWUgKGRldik7CisKKwlvdXRiKE9QMF9SRVNFVCwgaW9hZGRyKTsJCQkvKiBDTUQwX1JFU0VUICovCisKKwlpZiAoem5ldF9kZWJ1ZyA+IDEpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogU2h1dHRpbmcgZG93biBldGhlcmNhcmQuXG4iLCBkZXYtPm5hbWUpOworCS8qIFR1cm4gb2ZmIHRyYW5zY2VpdmVyIHBvd2VyLiAqLworCXpuZXRfdHJhbnNjZWl2ZXJfcG93ZXIgKGRldiwgMCk7CisJCisJem5ldF9yZWxlYXNlX3Jlc291cmNlcyAoZGV2KTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCVRoaXMgbWF5IGJlIGNhbGxlZCB3aXRoIHRoZSBjYXJkIG9wZW4gb3IKKyAgIGNsb3NlZC4gKi8KK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB6bmV0X3ByaXZhdGUgKnpuZXQgPSBkZXYtPnByaXY7CisKKwlyZXR1cm4gJnpuZXQtPnN0YXRzOworfQorCitzdGF0aWMgdm9pZCBzaG93X2RtYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNob3J0IGlvYWRkciA9IGRldi0+YmFzZV9hZGRyOworCXVuc2lnbmVkIGNoYXIgc3RhdCA9IGluYiAoaW9hZGRyKTsKKwlzdHJ1Y3Qgem5ldF9wcml2YXRlICp6bmV0ID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2hvcnQgZG1hX3BvcnQgPSAoKHpuZXQtPnR4X2RtYSYzKTw8MikgKyBJT19ETUEyX0JBU0U7CisJdW5zaWduZWQgYWRkciA9IGluYihkbWFfcG9ydCk7CisJc2hvcnQgcmVzaWR1ZTsKKworCWFkZHIgfD0gaW5iKGRtYV9wb3J0KSA8PCA4OworCXJlc2lkdWUgPSBnZXRfZG1hX3Jlc2lkdWUoem5ldC0+dHhfZG1hKTsKKwkJCisJaWYgKHpuZXRfZGVidWcgPiAxKSB7CisJCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJCXByaW50ayhLRVJOX0RFQlVHICJTdGF0OiUwMnggQWRkcjogJTA0eCBjbnQ6JTN4XG4iLAorCQkgICAgICAgc3RhdCwgYWRkcjw8MSwgcmVzaWR1ZSk7CisJCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOworCX0KK30KKworLyogSW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUuICBXZSBoYXZlIHRvIGRvIHRoaXMgd2hlbiB0aGUgYm9hcmQgaXMgb3BlbigpZWQKKyAgIG9yIHdoZW4gd2UgY29tZSBvdXQgb2Ygc3VzcGVuZCBtb2RlLiAqLworc3RhdGljIHZvaWQgaGFyZHdhcmVfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2hvcnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJc3RydWN0IHpuZXRfcHJpdmF0ZSAqem5ldCA9IGRldi0+cHJpdjsKKworCXpuZXQtPnJ4X2N1ciA9IHpuZXQtPnJ4X3N0YXJ0OworCXpuZXQtPnR4X2N1ciA9IHpuZXQtPnR4X3N0YXJ0OworCisJLyogUmVzZXQgdGhlIGNoaXAsIGFuZCBzdGFydCBpdCB1cC4gKi8KKwlvdXRiKE9QMF9SRVNFVCwgaW9hZGRyKTsKKworCWZsYWdzPWNsYWltX2RtYV9sb2NrKCk7CisJZGlzYWJsZV9kbWEoem5ldC0+cnhfZG1hKTsgCQkvKiByZXNldCBieSBhbiBpbnRlcnJ1cHRpbmcgdGFzay4gKi8KKwljbGVhcl9kbWFfZmYoem5ldC0+cnhfZG1hKTsKKwlzZXRfZG1hX21vZGUoem5ldC0+cnhfZG1hLCBETUFfUlhfTU9ERSk7CisJc2V0X2RtYV9hZGRyKHpuZXQtPnJ4X2RtYSwgKHVuc2lnbmVkIGludCkgem5ldC0+cnhfc3RhcnQpOworCXNldF9kbWFfY291bnQoem5ldC0+cnhfZG1hLCBSWF9CVUZfU0laRSk7CisJZW5hYmxlX2RtYSh6bmV0LT5yeF9kbWEpOworCS8qIE5vdyBzZXQgdXAgdGhlIFR4IGNoYW5uZWwuICovCisJZGlzYWJsZV9kbWEoem5ldC0+dHhfZG1hKTsKKwljbGVhcl9kbWFfZmYoem5ldC0+dHhfZG1hKTsKKwlzZXRfZG1hX21vZGUoem5ldC0+dHhfZG1hLCBETUFfVFhfTU9ERSk7CisJc2V0X2RtYV9hZGRyKHpuZXQtPnR4X2RtYSwgKHVuc2lnbmVkIGludCkgem5ldC0+dHhfc3RhcnQpOworCXNldF9kbWFfY291bnQoem5ldC0+dHhfZG1hLCB6bmV0LT50eF9idWZfbGVuPDwxKTsKKwllbmFibGVfZG1hKHpuZXQtPnR4X2RtYSk7CisJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJCisJaWYgKHpuZXRfZGVidWcgPiAxKQorCSAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJbml0aWFsaXppbmcgdGhlIGk4MjU5MywgcnggYnVmICVwIHR4IGJ1ZiAlcFxuIiwKKwkJCSBkZXYtPm5hbWUsIHpuZXQtPnJ4X3N0YXJ0LHpuZXQtPnR4X3N0YXJ0KTsKKwkvKiBEbyBhbiBlbXB0eSBjb25maWd1cmUgY29tbWFuZCwganVzdCBsaWtlIHRoZSBDcnlud3IgZHJpdmVyLiAgVGhpcworCSAgIHJlc2V0cyB0byBjaGlwIHRvIGl0cyBkZWZhdWx0IHZhbHVlcy4gKi8KKwkqem5ldC0+dHhfY3VyKysgPSAwOworCSp6bmV0LT50eF9jdXIrKyA9IDA7CisJc2hvd19kbWEoZGV2KTsKKwlvdXRiKE9QMF9DT05GSUdVUkUgfCBDUjBfQ0hOTCwgaW9hZGRyKTsKKworCXpuZXRfc2V0X211bHRpY2FzdF9saXN0IChkZXYpOworCisJKnpuZXQtPnR4X2N1cisrID0gNjsKKwltZW1jcHkoem5ldC0+dHhfY3VyLCBkZXYtPmRldl9hZGRyLCA2KTsKKwl6bmV0LT50eF9jdXIgKz0gMzsKKwlzaG93X2RtYShkZXYpOworCW91dGIoT1AwX0lBX1NFVFVQIHwgQ1IwX0NITkwsIGlvYWRkcik7CisJc2hvd19kbWEoZGV2KTsKKworCXVwZGF0ZV9zdG9wX2hpdChpb2FkZHIsIDgxOTIpOworCWlmICh6bmV0X2RlYnVnID4gMSkgIHByaW50ayhLRVJOX0RFQlVHICJlbmFibGluZyBSeC5cbiIpOworCW91dGIoT1AwX1JDVl9FTkFCTEUsIGlvYWRkcik7CisJbmV0aWZfc3RhcnRfcXVldWUgKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdG9wX2hpdChzaG9ydCBpb2FkZHIsIHVuc2lnbmVkIHNob3J0IHJ4X3N0b3Bfb2Zmc2V0KQoreworCW91dGIoT1AwX1NXSVRfVE9fUE9SVF8xIHwgQ1IwX0NITkwsIGlvYWRkcik7CisJaWYgKHpuZXRfZGVidWcgPiA1KQorCSAgcHJpbnRrKEtFUk5fREVCVUcgIlVwZGF0aW5nIHN0b3AgaGl0IHdpdGggdmFsdWUgJTAyeC5cbiIsCisJCQkgKHJ4X3N0b3Bfb2Zmc2V0ID4+IDYpIHwgQ1IxX1NUT1BfUkVHX1VQREFURSk7CisJb3V0Yigocnhfc3RvcF9vZmZzZXQgPj4gNikgfCBDUjFfU1RPUF9SRUdfVVBEQVRFLCBpb2FkZHIpOworCW91dGIoT1AxX1NXSVRfVE9fUE9SVF8wLCBpb2FkZHIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgem5ldF9jbGVhbnVwICh2b2lkKQoreworCWlmICh6bmV0X2RldikgeworCQlzdHJ1Y3Qgem5ldF9wcml2YXRlICp6bmV0ID0gem5ldF9kZXYtPnByaXY7CisKKwkJdW5yZWdpc3Rlcl9uZXRkZXYgKHpuZXRfZGV2KTsKKwkJa2ZyZWUgKHpuZXQtPnJ4X3N0YXJ0KTsKKwkJa2ZyZWUgKHpuZXQtPnR4X3N0YXJ0KTsKKwkJZnJlZV9uZXRkZXYgKHpuZXRfZGV2KTsKKwl9Cit9CisKK21vZHVsZV9pbml0ICh6bmV0X3Byb2JlKTsKK21vZHVsZV9leGl0ICh6bmV0X2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvem9ycm84MzkwLmMgYi9kcml2ZXJzL25ldC96b3JybzgzOTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWI2ZTEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvem9ycm84MzkwLmMKQEAgLTAsMCArMSw0MzkgQEAKKy8qCisgKiAgQW1pZ2EgTGludXgvbTY4ayBhbmQgTGludXgvUFBDIFpvcnJvIE5TODM5MCBFdGhlcm5ldCBEcml2ZXIKKyAqCisgKiAgKEMpIENvcHlyaWdodCAxOTk4LTIwMDAgYnkgc29tZSBFbGl0aXN0IDY4MHgwIFVzZXJzKFRNKQorICoKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGJhc2VkIG9uIGFsbCB0aGUgb3RoZXIgTkUyMDAwIGRyaXZlcnMgZm9yIExpbnV4CisgKgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4CisgKiAgZGlzdHJpYnV0aW9uIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBUaGUgQXJpYWRuZSBJSSBhbmQgWC1TdXJmIGFyZSBab3Jyby1JSSBib2FyZHMgY29udGFpbmluZyBSZWFsdGVrIFJUTDgwMTlBUworICogIEV0aGVybmV0IENvbnRyb2xsZXJzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvem9ycm8uaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaW50cy5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWh3Lmg+CisKKyNpbmNsdWRlICI4MzkwLmgiCisKKworI2RlZmluZSBEUlZfTkFNRQkiem9ycm84MzkwIgorCisjZGVmaW5lIE5FX0JBU0UJCShkZXYtPmJhc2VfYWRkcikKKyNkZWZpbmUgTkVfQ01ECQkoMHgwMCoyKQorI2RlZmluZSBORV9EQVRBUE9SVAkoMHgxMCoyKQkvKiBOYXRTZW1pLWRlZmluZWQgcG9ydCB3aW5kb3cgb2Zmc2V0LiAqLworI2RlZmluZSBORV9SRVNFVAkoMHgxZioyKQkvKiBJc3N1ZSBhIHJlYWQgdG8gcmVzZXQsIGEgd3JpdGUgdG8gY2xlYXIuICovCisjZGVmaW5lIE5FX0lPX0VYVEVOVAkoMHgyMCoyKQorCisjZGVmaW5lIE5FX0VOMF9JU1IJKDB4MDcqMikKKyNkZWZpbmUgTkVfRU4wX0RDRkcJKDB4MGUqMikKKworI2RlZmluZSBORV9FTjBfUlNBUkxPCSgweDA4KjIpCisjZGVmaW5lIE5FX0VOMF9SU0FSSEkJKDB4MDkqMikKKyNkZWZpbmUgTkVfRU4wX1JDTlRMTwkoMHgwYSoyKQorI2RlZmluZSBORV9FTjBfUlhDUgkoMHgwYyoyKQorI2RlZmluZSBORV9FTjBfVFhDUgkoMHgwZCoyKQorI2RlZmluZSBORV9FTjBfUkNOVEhJCSgweDBiKjIpCisjZGVmaW5lIE5FX0VOMF9JTVIJKDB4MGYqMikKKworI2RlZmluZSBORVNNX1NUQVJUX1BHCTB4NDAJLyogRmlyc3QgcGFnZSBvZiBUWCBidWZmZXIgKi8KKyNkZWZpbmUgTkVTTV9TVE9QX1BHCTB4ODAJLyogTGFzdCBwYWdlICsxIG9mIFJYIHJpbmcgKi8KKworCisjZGVmaW5lIFdPUkRTV0FQKGEpCSgoKChhKT4+OCkmMHhmZikgfCAoKGEpPDw4KSkKKworCitzdGF0aWMgc3RydWN0IGNhcmRfaW5mbyB7CisgICAgem9ycm9faWQgaWQ7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0OworfSBjYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CisgICAgeyBaT1JST19QUk9EX1ZJTExBR0VfVFJPTklDX0FSSUFETkUyLCAiQXJpYWRuZSBJSSIsIDB4MDYwMCB9LAorICAgIHsgWk9SUk9fUFJPRF9JTkRJVklEVUFMX0NPTVBVVEVSU19YX1NVUkYsICJYLVN1cmYiLCAweDg2MDAgfSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHpvcnJvODM5MF9pbml0X29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6LAorCQkJCQljb25zdCBzdHJ1Y3Qgem9ycm9fZGV2aWNlX2lkICplbnQpOworc3RhdGljIGludCBfX2RldmluaXQgem9ycm84MzkwX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBib2FyZCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBpb2FkZHIpOworc3RhdGljIGludCB6b3JybzgzOTBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgem9ycm84MzkwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgem9ycm84MzkwX3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCB6b3JybzgzOTBfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSk7CitzdGF0aWMgdm9pZCB6b3JybzgzOTBfYmxvY2tfaW5wdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KTsKK3N0YXRpYyB2b2lkIHpvcnJvODM5MF9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgaW50IGNvdW50LAorCQkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCQkgICBjb25zdCBpbnQgc3RhcnRfcGFnZSk7CitzdGF0aWMgdm9pZCBfX2RldmV4aXQgem9ycm84MzkwX3JlbW92ZV9vbmUoc3RydWN0IHpvcnJvX2RldiAqeik7CisKK3N0YXRpYyBzdHJ1Y3Qgem9ycm9fZGV2aWNlX2lkIHpvcnJvODM5MF96b3Jyb190YmxbXSBfX2RldmluaXRkYXRhID0geworICAgIHsgWk9SUk9fUFJPRF9WSUxMQUdFX1RST05JQ19BUklBRE5FMiwgfSwKKyAgICB7IFpPUlJPX1BST0RfSU5ESVZJRFVBTF9DT01QVVRFUlNfWF9TVVJGLCB9LAorICAgIHsgMCB9Cit9OworCitzdGF0aWMgc3RydWN0IHpvcnJvX2RyaXZlciB6b3JybzgzOTBfZHJpdmVyID0geworICAgIC5uYW1lCT0gInpvcnJvODM5MCIsCisgICAgLmlkX3RhYmxlCT0gem9ycm84MzkwX3pvcnJvX3RibCwKKyAgICAucHJvYmUJPSB6b3JybzgzOTBfaW5pdF9vbmUsCisgICAgLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKHpvcnJvODM5MF9yZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHpvcnJvODM5MF9pbml0X29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6LAorCQkJCQljb25zdCBzdHJ1Y3Qgem9ycm9fZGV2aWNlX2lkICplbnQpCit7CisgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKyAgICB1bnNpZ25lZCBsb25nIGJvYXJkLCBpb2FkZHI7CisgICAgaW50IGVyciwgaTsKKworICAgIGZvciAoaSA9IEFSUkFZX1NJWkUoY2FyZHMpLTE7IGkgPj0gMDsgaS0tKQorCWlmICh6LT5pZCA9PSBjYXJkc1tpXS5pZCkKKwkgICAgYnJlYWs7CisgICAgYm9hcmQgPSB6LT5yZXNvdXJjZS5zdGFydDsKKyAgICBpb2FkZHIgPSBib2FyZCtjYXJkc1tpXS5vZmZzZXQ7CisgICAgZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7CisgICAgaWYgKCFkZXYpCisJcmV0dXJuIC1FTk9NRU07CisgICAgU0VUX01PRFVMRV9PV05FUihkZXYpOworICAgIGlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGlvYWRkciwgTkVfSU9fRVhURU5UKjIsIERSVl9OQU1FKSkgeworCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIC1FQlVTWTsKKyAgICB9CisgICAgaWYgKChlcnIgPSB6b3JybzgzOTBfaW5pdChkZXYsIGJvYXJkLCBjYXJkc1tpXS5uYW1lLAorCQkJICAgICAgWlRXT19WQUREUihpb2FkZHIpKSkpIHsKKwlyZWxlYXNlX21lbV9yZWdpb24oaW9hZGRyLCBORV9JT19FWFRFTlQqMik7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwlyZXR1cm4gZXJyOworICAgIH0KKyAgICB6b3Jyb19zZXRfZHJ2ZGF0YSh6LCBkZXYpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB6b3JybzgzOTBfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGJvYXJkLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGlvYWRkcikKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgZXJyOworICAgIHVuc2lnbmVkIGNoYXIgU0FfcHJvbVszMl07CisgICAgaW50IHN0YXJ0X3BhZ2UsIHN0b3BfcGFnZTsKKyAgICBzdGF0aWMgdTMyIHpvcnJvODM5MF9vZmZzZXRzWzE2XSA9IHsKKwkweDAwLCAweDAyLCAweDA0LCAweDA2LCAweDA4LCAweDBhLCAweDBjLCAweDBlLAorCTB4MTAsIDB4MTIsIDB4MTQsIDB4MTYsIDB4MTgsIDB4MWEsIDB4MWMsIDB4MWUsCisgICAgfTsKKworICAgIC8qIFJlc2V0IGNhcmQuIFdobyBrbm93cyB3aGF0IGRhaW4tYnJhbWFnZWQgc3RhdGUgaXQgd2FzIGxlZnQgaW4uICovCisgICAgeworCXVuc2lnbmVkIGxvbmcgcmVzZXRfc3RhcnRfdGltZSA9IGppZmZpZXM7CisKKwl6X3dyaXRlYih6X3JlYWRiKGlvYWRkciArIE5FX1JFU0VUKSwgaW9hZGRyICsgTkVfUkVTRVQpOworCisJd2hpbGUgKCh6X3JlYWRiKGlvYWRkciArIE5FX0VOMF9JU1IpICYgRU5JU1JfUkVTRVQpID09IDApCisJICAgIGlmIChqaWZmaWVzIC0gcmVzZXRfc3RhcnRfdGltZSA+IDIqSFovMTAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiBub3QgZm91bmQgKG5vIHJlc2V0IGFjaykuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJICAgIH0KKworCXpfd3JpdGViKDB4ZmYsIGlvYWRkciArIE5FX0VOMF9JU1IpOwkJLyogQWNrIGFsbCBpbnRyLiAqLworICAgIH0KKworICAgIC8qIFJlYWQgdGhlIDE2IGJ5dGVzIG9mIHN0YXRpb24gYWRkcmVzcyBQUk9NLgorICAgICAgIFdlIG11c3QgZmlyc3QgaW5pdGlhbGl6ZSByZWdpc3RlcnMsIHNpbWlsYXIgdG8gTlM4MzkwX2luaXQoZWlmZGV2LCAwKS4KKyAgICAgICBXZSBjYW4ndCByZWxpYWJseSByZWFkIHRoZSBTQVBST00gYWRkcmVzcyB3aXRob3V0IHRoaXMuCisgICAgICAgKEkgbGVhcm5lZCB0aGUgaGFyZCB3YXkhKS4gKi8KKyAgICB7CisJc3RydWN0IHsKKwkgICAgdTMyIHZhbHVlOworCSAgICB1MzIgb2Zmc2V0OworCX0gcHJvZ3JhbV9zZXFbXSA9IHsKKwkgICAge0U4MzkwX05PRE1BK0U4MzkwX1BBR0UwK0U4MzkwX1NUT1AsIE5FX0NNRH0sIC8qIFNlbGVjdCBwYWdlIDAqLworCSAgICB7MHg0OCwJTkVfRU4wX0RDRkd9LAkvKiBTZXQgYnl0ZS13aWRlICgweDQ4KSBhY2Nlc3MuICovCisJICAgIHsweDAwLAlORV9FTjBfUkNOVExPfSwJLyogQ2xlYXIgdGhlIGNvdW50IHJlZ3MuICovCisJICAgIHsweDAwLAlORV9FTjBfUkNOVEhJfSwKKwkgICAgezB4MDAsCU5FX0VOMF9JTVJ9LAkvKiBNYXNrIGNvbXBsZXRpb24gaXJxLiAqLworCSAgICB7MHhGRiwJTkVfRU4wX0lTUn0sCisJICAgIHtFODM5MF9SWE9GRiwgTkVfRU4wX1JYQ1J9LAkvKiAweDIwICBTZXQgdG8gbW9uaXRvciAqLworCSAgICB7RTgzOTBfVFhPRkYsIE5FX0VOMF9UWENSfSwJLyogMHgwMiAgYW5kIGxvb3BiYWNrIG1vZGUuICovCisJICAgIHszMiwJTkVfRU4wX1JDTlRMT30sCisJICAgIHsweDAwLAlORV9FTjBfUkNOVEhJfSwKKwkgICAgezB4MDAsCU5FX0VOMF9SU0FSTE99LAkvKiBETUEgc3RhcnRpbmcgYXQgMHgwMDAwLiAqLworCSAgICB7MHgwMCwJTkVfRU4wX1JTQVJISX0sCisJICAgIHtFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgTkVfQ01EfSwKKwl9OworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocHJvZ3JhbV9zZXEpL3NpemVvZihwcm9ncmFtX3NlcVswXSk7IGkrKykgeworCSAgICB6X3dyaXRlYihwcm9ncmFtX3NlcVtpXS52YWx1ZSwgaW9hZGRyICsgcHJvZ3JhbV9zZXFbaV0ub2Zmc2V0KTsKKwl9CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJU0FfcHJvbVtpXSA9IHpfcmVhZGIoaW9hZGRyICsgTkVfREFUQVBPUlQpOworCSh2b2lkKXpfcmVhZGIoaW9hZGRyICsgTkVfREFUQVBPUlQpOworICAgIH0KKworICAgIC8qIFdlIG11c3Qgc2V0IHRoZSA4MzkwIGZvciB3b3JkIG1vZGUuICovCisgICAgel93cml0ZWIoMHg0OSwgaW9hZGRyICsgTkVfRU4wX0RDRkcpOworICAgIHN0YXJ0X3BhZ2UgPSBORVNNX1NUQVJUX1BHOworICAgIHN0b3BfcGFnZSA9IE5FU01fU1RPUF9QRzsKKworICAgIGRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworICAgIGRldi0+aXJxID0gSVJRX0FNSUdBX1BPUlRTOworCisgICAgLyogSW5zdGFsbCB0aGUgSW50ZXJydXB0IGhhbmRsZXIgKi8KKyAgICBpID0gcmVxdWVzdF9pcnEoSVJRX0FNSUdBX1BPUlRTLCBlaV9pbnRlcnJ1cHQsIFNBX1NISVJRLCBEUlZfTkFNRSwgZGV2KTsKKyAgICBpZiAoaSkgcmV0dXJuIGk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKSB7CisjaWZkZWYgREVCVUcKKwlwcmludGsoIiAlMi4yeCIsIFNBX3Byb21baV0pOworI2VuZGlmCisJZGV2LT5kZXZfYWRkcltpXSA9IFNBX3Byb21baV07CisgICAgfQorCisgICAgZWlfc3RhdHVzLm5hbWUgPSBuYW1lOworICAgIGVpX3N0YXR1cy50eF9zdGFydF9wYWdlID0gc3RhcnRfcGFnZTsKKyAgICBlaV9zdGF0dXMuc3RvcF9wYWdlID0gc3RvcF9wYWdlOworICAgIGVpX3N0YXR1cy53b3JkMTYgPSAxOworCisgICAgZWlfc3RhdHVzLnJ4X3N0YXJ0X3BhZ2UgPSBzdGFydF9wYWdlICsgVFhfUEFHRVM7CisKKyAgICBlaV9zdGF0dXMucmVzZXRfODM5MCA9ICZ6b3JybzgzOTBfcmVzZXRfODM5MDsKKyAgICBlaV9zdGF0dXMuYmxvY2tfaW5wdXQgPSAmem9ycm84MzkwX2Jsb2NrX2lucHV0OworICAgIGVpX3N0YXR1cy5ibG9ja19vdXRwdXQgPSAmem9ycm84MzkwX2Jsb2NrX291dHB1dDsKKyAgICBlaV9zdGF0dXMuZ2V0XzgzOTBfaGRyID0gJnpvcnJvODM5MF9nZXRfODM5MF9oZHI7CisgICAgZWlfc3RhdHVzLnJlZ19vZmZzZXQgPSB6b3JybzgzOTBfb2Zmc2V0czsKKyAgICBkZXYtPm9wZW4gPSAmem9ycm84MzkwX29wZW47CisgICAgZGV2LT5zdG9wID0gJnpvcnJvODM5MF9jbG9zZTsKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorICAgIGRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKKyNlbmRpZgorCisgICAgTlM4MzkwX2luaXQoZGV2LCAwKTsKKyAgICBlcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKyAgICBpZiAoZXJyKSB7CisJZnJlZV9pcnEoSVJRX0FNSUdBX1BPUlRTLCBkZXYpOworCXJldHVybiBlcnI7CisgICAgfQorCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGF0IDB4JTA4bHgsIEV0aGVybmV0IEFkZHJlc3MgIgorCSAgICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwgZGV2LT5uYW1lLCBuYW1lLCBib2FyZCwKKwkgICBkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLCBkZXYtPmRldl9hZGRyWzJdLAorCSAgIGRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgem9ycm84MzkwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyAgICBlaV9vcGVuKGRldik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgem9ycm84MzkwX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisgICAgaWYgKGVpX2RlYnVnID4gMSkKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFNodXR0aW5nIGRvd24gZXRoZXJjYXJkLlxuIiwgZGV2LT5uYW1lKTsKKyAgICBlaV9jbG9zZShkZXYpOworICAgIHJldHVybiAwOworfQorCisvKiBIYXJkIHJlc2V0IHRoZSBjYXJkLiAgVGhpcyB1c2VkIHRvIHBhdXNlIGZvciB0aGUgc2FtZSBwZXJpb2QgdGhhdCBhCisgICA4MzkwIHJlc2V0IGNvbW1hbmQgcmVxdWlyZWQsIGJ1dCB0aGF0IHNob3VsZG4ndCBiZSBuZWNlc3NhcnkuICovCitzdGF0aWMgdm9pZCB6b3JybzgzOTBfcmVzZXRfODM5MChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworICAgIHVuc2lnbmVkIGxvbmcgcmVzZXRfc3RhcnRfdGltZSA9IGppZmZpZXM7CisKKyAgICBpZiAoZWlfZGVidWcgPiAxKQorCXByaW50ayhLRVJOX0RFQlVHICJyZXNldHRpbmcgdGhlIDgzOTAgdD0lbGQuLi5cbiIsIGppZmZpZXMpOworCisgICAgel93cml0ZWIoel9yZWFkYihORV9CQVNFICsgTkVfUkVTRVQpLCBORV9CQVNFICsgTkVfUkVTRVQpOworCisgICAgZWlfc3RhdHVzLnR4aW5nID0gMDsKKyAgICBlaV9zdGF0dXMuZG1haW5nID0gMDsKKworICAgIC8qIFRoaXMgY2hlY2sgX3Nob3VsZF9ub3RfIGJlIG5lY2Vzc2FyeSwgb21pdCBldmVudHVhbGx5LiAqLworICAgIHdoaWxlICgoel9yZWFkYihORV9CQVNFK05FX0VOMF9JU1IpICYgRU5JU1JfUkVTRVQpID09IDApCisJaWYgKGppZmZpZXMgLSByZXNldF9zdGFydF90aW1lID4gMipIWi8xMDApIHsKKwkgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG5lX3Jlc2V0XzgzOTAoKSBkaWQgbm90IGNvbXBsZXRlLlxuIiwKKwkJICAgZGV2LT5uYW1lKTsKKwkgICAgYnJlYWs7CisJfQorICAgIHpfd3JpdGViKEVOSVNSX1JFU0VULCBORV9CQVNFICsgTkVfRU4wX0lTUik7CS8qIEFjayBpbnRyLiAqLworfQorCisvKiBHcmFiIHRoZSA4MzkwIHNwZWNpZmljIGhlYWRlci4gU2ltaWxhciB0byB0aGUgYmxvY2tfaW5wdXQgcm91dGluZSwgYnV0CisgICB3ZSBkb24ndCBuZWVkIHRvIGJlIGNvbmNlcm5lZCB3aXRoIHJpbmcgd3JhcCBhcyB0aGUgaGVhZGVyIHdpbGwgYmUgYXQKKyAgIHRoZSBzdGFydCBvZiBhIHBhZ2UsIHNvIHdlIG9wdGltaXplIGFjY29yZGluZ2x5LiAqLworCitzdGF0aWMgdm9pZCB6b3JybzgzOTBfZ2V0XzgzOTBfaGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSkKK3sKKyAgICBpbnQgbmljX2Jhc2UgPSBkZXYtPmJhc2VfYWRkcjsKKyAgICBpbnQgY250OworICAgIHNob3J0ICpwdHJzOworCisgICAgLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworICAgIGlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJcHJpbnRrKEtFUk5fRVJSICIlczogRE1BaW5nIGNvbmZsaWN0IGluIG5lX2dldF84MzkwX2hkciAiCisJICAgIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXS5cbiIsIGRldi0+bmFtZSwgZWlfc3RhdHVzLmRtYWluZywKKwkgICBlaV9zdGF0dXMuaXJxbG9jayk7CisJcmV0dXJuOworICAgIH0KKworICAgIGVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKyAgICB6X3dyaXRlYihFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgbmljX2Jhc2UrIE5FX0NNRCk7CisgICAgel93cml0ZWIoRU5JU1JfUkRDLCBuaWNfYmFzZSArIE5FX0VOMF9JU1IpOworICAgIHpfd3JpdGViKHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkciksIG5pY19iYXNlICsgTkVfRU4wX1JDTlRMTyk7CisgICAgel93cml0ZWIoMCwgbmljX2Jhc2UgKyBORV9FTjBfUkNOVEhJKTsKKyAgICB6X3dyaXRlYigwLCBuaWNfYmFzZSArIE5FX0VOMF9SU0FSTE8pOwkJLyogT24gcGFnZSBib3VuZGFyeSAqLworICAgIHpfd3JpdGViKHJpbmdfcGFnZSwgbmljX2Jhc2UgKyBORV9FTjBfUlNBUkhJKTsKKyAgICB6X3dyaXRlYihFODM5MF9SUkVBRCtFODM5MF9TVEFSVCwgbmljX2Jhc2UgKyBORV9DTUQpOworCisgICAgcHRycyA9IChzaG9ydCopaGRyOworICAgIGZvciAoY250ID0gMDsgY250IDwgKHNpemVvZihzdHJ1Y3QgZTgzOTBfcGt0X2hkcik+PjEpOyBjbnQrKykKKwkqcHRycysrID0gel9yZWFkdyhORV9CQVNFICsgTkVfREFUQVBPUlQpOworCisgICAgel93cml0ZWIoRU5JU1JfUkRDLCBuaWNfYmFzZSArIE5FX0VOMF9JU1IpOwkvKiBBY2sgaW50ci4gKi8KKworICAgIGhkci0+Y291bnQgPSBXT1JEU1dBUChoZHItPmNvdW50KTsKKworICAgIGVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7Cit9CisKKy8qIEJsb2NrIGlucHV0IGFuZCBvdXRwdXQsIHNpbWlsYXIgdG8gdGhlIENyeW53ciBwYWNrZXQgZHJpdmVyLiAgSWYgeW91CisgICBhcmUgcG9ydGluZyB0byBhIG5ldyBldGhlcmNhcmQsIGxvb2sgYXQgdGhlIHBhY2tldCBkcml2ZXIgc291cmNlIGZvciBoaW50cy4KKyAgIFRoZSBORXgwMDAgZG9lc24ndCBzaGFyZSB0aGUgb24tYm9hcmQgcGFja2V0IG1lbW9yeSAtLSB5b3UgaGF2ZSB0byBwdXQKKyAgIHRoZSBwYWNrZXQgb3V0IHRocm91Z2ggdGhlICJyZW1vdGUgRE1BIiBkYXRhcG9ydCB1c2luZyB6X3dyaXRlYi4gKi8KKworc3RhdGljIHZvaWQgem9ycm84MzkwX2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KQoreworICAgIGludCBuaWNfYmFzZSA9IGRldi0+YmFzZV9hZGRyOworICAgIGNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKKyAgICBzaG9ydCAqcHRyczsKKyAgICBpbnQgY250OworCisgICAgLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworICAgIGlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJcHJpbnRrKEtFUk5fRVJSICIlczogRE1BaW5nIGNvbmZsaWN0IGluIG5lX2Jsb2NrX2lucHV0ICIKKwkgICAiW0RNQXN0YXQ6JWRdW2lycWxvY2s6JWRdLlxuIiwKKwkgICBkZXYtPm5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrKTsKKwlyZXR1cm47CisgICAgfQorICAgIGVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKyAgICB6X3dyaXRlYihFODM5MF9OT0RNQStFODM5MF9QQUdFMCtFODM5MF9TVEFSVCwgbmljX2Jhc2UrIE5FX0NNRCk7CisgICAgel93cml0ZWIoRU5JU1JfUkRDLCBuaWNfYmFzZSArIE5FX0VOMF9JU1IpOworICAgIHpfd3JpdGViKGNvdW50ICYgMHhmZiwgbmljX2Jhc2UgKyBORV9FTjBfUkNOVExPKTsKKyAgICB6X3dyaXRlYihjb3VudCA+PiA4LCBuaWNfYmFzZSArIE5FX0VOMF9SQ05USEkpOworICAgIHpfd3JpdGViKHJpbmdfb2Zmc2V0ICYgMHhmZiwgbmljX2Jhc2UgKyBORV9FTjBfUlNBUkxPKTsKKyAgICB6X3dyaXRlYihyaW5nX29mZnNldCA+PiA4LCBuaWNfYmFzZSArIE5FX0VOMF9SU0FSSEkpOworICAgIHpfd3JpdGViKEU4MzkwX1JSRUFEK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIE5FX0NNRCk7CisgICAgcHRycyA9IChzaG9ydCopYnVmOworICAgIGZvciAoY250ID0gMDsgY250IDwgKGNvdW50Pj4xKTsgY250KyspCisJKnB0cnMrKyA9IHpfcmVhZHcoTkVfQkFTRSArIE5FX0RBVEFQT1JUKTsKKyAgICBpZiAoY291bnQgJiAweDAxKQorCWJ1Zltjb3VudC0xXSA9IHpfcmVhZGIoTkVfQkFTRSArIE5FX0RBVEFQT1JUKTsKKworICAgIHpfd3JpdGViKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBORV9FTjBfSVNSKTsJLyogQWNrIGludHIuICovCisgICAgZWlfc3RhdHVzLmRtYWluZyAmPSB+MHgwMTsKK30KKworc3RhdGljIHZvaWQgem9ycm84MzkwX2Jsb2NrX291dHB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsCisJCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJCSAgIGNvbnN0IGludCBzdGFydF9wYWdlKQoreworICAgIGludCBuaWNfYmFzZSA9IE5FX0JBU0U7CisgICAgdW5zaWduZWQgbG9uZyBkbWFfc3RhcnQ7CisgICAgc2hvcnQgKnB0cnM7CisgICAgaW50IGNudDsKKworICAgIC8qIFJvdW5kIHRoZSBjb3VudCB1cCBmb3Igd29yZCB3cml0ZXMuICBEbyB3ZSBuZWVkIHRvIGRvIHRoaXM/CisgICAgICAgV2hhdCBlZmZlY3Qgd2lsbCBhbiBvZGQgYnl0ZSBjb3VudCBoYXZlIG9uIHRoZSA4MzkwPworICAgICAgIEkgc2hvdWxkIGNoZWNrIHNvbWVkYXkuICovCisgICAgaWYgKGNvdW50ICYgMHgwMSkKKwljb3VudCsrOworCisgICAgLyogVGhpcyAqc2hvdWxkbid0KiBoYXBwZW4uIElmIGl0IGRvZXMsIGl0J3MgdGhlIGxhc3QgdGhpbmcgeW91J2xsIHNlZSAqLworICAgIGlmIChlaV9zdGF0dXMuZG1haW5nKSB7CisJcHJpbnRrKEtFUk5fRVJSICIlczogRE1BaW5nIGNvbmZsaWN0IGluIG5lX2Jsb2NrX291dHB1dC4iCisJICAgIltETUFzdGF0OiVkXVtpcnFsb2NrOiVkXVxuIiwgZGV2LT5uYW1lLCBlaV9zdGF0dXMuZG1haW5nLAorCSAgIGVpX3N0YXR1cy5pcnFsb2NrKTsKKwlyZXR1cm47CisgICAgfQorICAgIGVpX3N0YXR1cy5kbWFpbmcgfD0gMHgwMTsKKyAgICAvKiBXZSBzaG91bGQgYWxyZWFkeSBiZSBpbiBwYWdlIDAsIGJ1dCB0byBiZSBzYWZlLi4uICovCisgICAgel93cml0ZWIoRTgzOTBfUEFHRTArRTgzOTBfU1RBUlQrRTgzOTBfTk9ETUEsIG5pY19iYXNlICsgTkVfQ01EKTsKKworICAgIHpfd3JpdGViKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBORV9FTjBfSVNSKTsKKworICAgLyogTm93IHRoZSBub3JtYWwgb3V0cHV0LiAqLworICAgIHpfd3JpdGViKGNvdW50ICYgMHhmZiwgbmljX2Jhc2UgKyBORV9FTjBfUkNOVExPKTsKKyAgICB6X3dyaXRlYihjb3VudCA+PiA4LCAgIG5pY19iYXNlICsgTkVfRU4wX1JDTlRISSk7CisgICAgel93cml0ZWIoMHgwMCwgbmljX2Jhc2UgKyBORV9FTjBfUlNBUkxPKTsKKyAgICB6X3dyaXRlYihzdGFydF9wYWdlLCBuaWNfYmFzZSArIE5FX0VOMF9SU0FSSEkpOworCisgICAgel93cml0ZWIoRTgzOTBfUldSSVRFK0U4MzkwX1NUQVJULCBuaWNfYmFzZSArIE5FX0NNRCk7CisgICAgcHRycyA9IChzaG9ydCopYnVmOworICAgIGZvciAoY250ID0gMDsgY250IDwgY291bnQ+PjE7IGNudCsrKQorCXpfd3JpdGV3KCpwdHJzKyssIE5FX0JBU0UrTkVfREFUQVBPUlQpOworCisgICAgZG1hX3N0YXJ0ID0gamlmZmllczsKKworICAgIHdoaWxlICgoel9yZWFkYihORV9CQVNFICsgTkVfRU4wX0lTUikgJiBFTklTUl9SREMpID09IDApCisJaWYgKGppZmZpZXMgLSBkbWFfc3RhcnQgPiAyKkhaLzEwMCkgewkJLyogMjBtcyAqLworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIFR4IFJEQy5cbiIsCisJCSAgICAgICBkZXYtPm5hbWUpOworCQl6b3JybzgzOTBfcmVzZXRfODM5MChkZXYpOworCQlOUzgzOTBfaW5pdChkZXYsMSk7CisJCWJyZWFrOworCX0KKworICAgIHpfd3JpdGViKEVOSVNSX1JEQywgbmljX2Jhc2UgKyBORV9FTjBfSVNSKTsJLyogQWNrIGludHIuICovCisgICAgZWlfc3RhdHVzLmRtYWluZyAmPSB+MHgwMTsKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB6b3JybzgzOTBfcmVtb3ZlX29uZShzdHJ1Y3Qgem9ycm9fZGV2ICp6KQoreworICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB6b3Jyb19nZXRfZHJ2ZGF0YSh6KTsKKworICAgIHVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisgICAgZnJlZV9pcnEoSVJRX0FNSUdBX1BPUlRTLCBkZXYpOworICAgIHJlbGVhc2VfbWVtX3JlZ2lvbihaVFdPX1BBRERSKGRldi0+YmFzZV9hZGRyKSwgTkVfSU9fRVhURU5UKjIpOworICAgIGZyZWVfbmV0ZGV2KGRldik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHpvcnJvODM5MF9pbml0X21vZHVsZSh2b2lkKQoreworICAgIHJldHVybiB6b3Jyb19tb2R1bGVfaW5pdCgmem9ycm84MzkwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB6b3JybzgzOTBfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKyAgICB6b3Jyb191bnJlZ2lzdGVyX2RyaXZlcigmem9ycm84MzkwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHpvcnJvODM5MF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdCh6b3JybzgzOTBfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cg==